ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGUxZDVjMTcuLjllYjRiNzcgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMjAsNiArMjAsNyBAQAogIyBUb3AtbGV2ZWwgZ2VuZXJpYyBmaWxlcwogIwogdGFncworVEFHUwogdm1saW51eCoKIFN5c3RlbS5tYXAKIE1vZHVsZS5zeW12ZXJzCmRpZmYgLS1naXQgYS9DUkVESVRTIGIvQ1JFRElUUwppbmRleCA1MzI5ZWFkLi44MjE4ZTc5IDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTQ1LDcgKzQ1LDcgQEAKIFM6IFN5ZG5leSwgQXVzdHJhbGlhCiAKIE46IFRpZ3JhbiBBLiBBaXZhemlhbgotRTogdGlncmFuQHZlcml0YXMuY29tCitFOiB0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWsKIFc6IGh0dHA6Ly93d3cubW9zZXMudWtsaW51eC5uZXQvcGF0Y2hlcwogRDogQkZTIGZpbGVzeXN0ZW0KIEQ6IEludGVsIElBMzIgQ1BVIG1pY3JvY29kZSB1cGRhdGUgc3VwcG9ydApAQCAtMTgwOCw2ICsxODA4LDE0IEBACiBTOiAxMDk4IFZBIEFtc3RlcmRhbSAKIFM6IFRoZSBOZXRoZXJsYW5kcwogCitOOiBKaXJpIEtvc2luYQorRTogamlrb3NAamlrb3MuY3oKK0U6IGprb3NpbmFAc3VzZS5jegorRDogR2VuZXJpYyBISUQgbGF5ZXIgLSBvcmlnaW5hbCBjb2RlIHNwbGl0LCBmaXhlcworRDogVmFyaW91cyBBQ1BJIGZpeGVzLCBrZWVwaW5nIGNvcnJlY3QgYmF0dGVyeSBzdGF0ZSB0aHJvdWdoIHN1c3BlbmQKK0Q6IHZhcmlvdXMgbG9ja2RlcCBhbm5vdGF0aW9ucywgYXV0b2ZzIGFuZCBvdGhlciByYW5kb20gYnVnZml4ZXMKK1M6IFByYWd1ZSwgQ3plY2ggUmVwdWJsaWMKKwogTjogR2VuZSBLb3ppbgogRTogNzQ2MDQuMTUyQGNvbXB1c2VydmUuY29tCiBXOiBodHRwOi8vd3d3LnNhbmdvbWEuY29tCkBAIC0yNTk4LDYgKzI2MDYsOSBAQAogUzogUHJhZ3VlIDgKIFM6IDE4MiAwMCBDemVjaCBSZXB1YmxpYwogCitOOiBSaWNrIFBheW5lCitEOiBSRkMyMzg1IFN1cHBvcnQgZm9yIFRDUAorCiBOOiBCYXJhayBBLiBQZWFybG11dHRlcgogRTogYmFwQGNzLnVubS5lZHUKIFc6IGh0dHA6Ly93d3cuY3MudW5tLmVkdS9+YmFwLwpAQCAtMzUxMSwxNCArMzUyMiwxMiBAQAogCiBOOiBEYXZpZCBXZWluZWhhbGwKIEU6IHRhb0BhY2MudW11LnNlCitQOiAxMDI0RC9EQzQ3Q0ExNiA3QUNFIDBGQjAgN0E3NCBGOTk0IDlCMzYgIEUxRDEgRDE0RSA4NTI2IERDNDcgQ0ExNgogVzogaHR0cDovL3d3dy5hY2MudW11LnNlL350YW8vCi1XOiBodHRwOi8vd3d3LmFjYy51bXUuc2Uvfm1jYWxpbnV4LworRDogdjIuMCBrZXJuZWwgbWFpbnRhaW5lcgogRDogRml4ZXMgZm9yIHRoZSBORS8yLWRyaXZlcgogRDogTWlzY2VsbGFuZW91cyBNQ0Etc3VwcG9ydAogRDogQ2xlYW51cCBvZiB0aGUgQ29uZmlnLWZpbGVzCi1TOiBBeHRvcnBzdmFnZW4gNDA6MjAKLVM6IFMtOTAzIDM3ICBVTUVBCi1TOiBTd2VkZW4KIAogTjogTWF0dCBXZWxzaAogRTogbWR3QG1ldGFsYWIudW5jLmVkdQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKaW5kZXggMDI0NTdlYy4uZjA4Y2E5NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCkBAIC0xMDQsOCArMTA0LDYgQEAKIAktIHJlcXVlc3RfZmlybXdhcmUoKSBob3RwbHVnIGludGVyZmFjZSBpbmZvLgogZmxvcHB5LnR4dAogCS0gbm90ZXMgYW5kIGRyaXZlciBvcHRpb25zIGZvciB0aGUgZmxvcHB5IGRpc2sgZHJpdmVyLgotZnRhcGUudHh0Ci0JLSBub3RlcyBhYm91dCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlci4KIGhheWVzLWVzcC50eHQKIAktIGluZm8gb24gdXNpbmcgdGhlIEhheWVzIEVTUCBzZXJpYWwgZHJpdmVyLgogaGlnaHVpZC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1wa3RjZHZkIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9kZWJ1Z2ZzLXBrdGNkdmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkYmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1wa3RjZHZkCkBAIC0wLDAgKzEsMjAgQEAKK1doYXQ6ICAgICAgICAgICAvZGVidWcvcGt0Y2R2ZC9wa3RjZHZkWzAtN10KK0RhdGU6ICAgICAgICAgICBPY3QuIDIwMDYKK0tlcm5lbFZlcnNpb246ICAyLjYuMTkKK0NvbnRhY3Q6ICAgICAgICBUaG9tYXMgTWFpZXIgPGJhbGFnaUBqdXN0bWFpbC5kZT4KK0Rlc2NyaXB0aW9uOgorCitkZWJ1Z2ZzIGludGVyZmFjZQorLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHBrdGNkdmQgbW9kdWxlIChwYWNrZXQgd3JpdGluZyBkcml2ZXIpIGNyZWF0ZXMKK3RoZXNlIGZpbGVzIGluIGRlYnVnZnM6CisKKy9kZWJ1Zy9wa3RjZHZkL3BrdGNkdmRbMC03XS8KKyAgICBpbmZvICAgICAgICAgICAgKDA0NDQpIExvdHMgb2YgaHVtYW4gcmVhZGFibGUgZHJpdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzIGFuZCBpbmZvcy4gTXVsdGlwbGUgbGluZXMhCisKK0V4YW1wbGU6CistLS0tLS0tCisKK2NhdCAvZGVidWcvcGt0Y2R2ZC9wa3RjZHZkMC9pbmZvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXBrdGNkdmQgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXBrdGNkdmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjNTVlZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcGt0Y2R2ZApAQCAtMCwwICsxLDcyIEBACitXaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9wa3RjZHZkLworRGF0ZTogICAgICAgICAgIE9jdC4gMjAwNgorS2VybmVsVmVyc2lvbjogIDIuNi4xOQorQ29udGFjdDogICAgICAgIFRob21hcyBNYWllciA8YmFsYWdpQGp1c3RtYWlsLmRlPgorRGVzY3JpcHRpb246CisKK3N5c2ZzIGludGVyZmFjZQorLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBwa3RjZHZkIG1vZHVsZSAocGFja2V0IHdyaXRpbmcgZHJpdmVyKSBjcmVhdGVzCit0aGVzZSBmaWxlcyBpbiB0aGUgc3lzZnM6CisoPGRldmlkPiBpcyBpbiBmb3JtYXQgIG1ham9yOm1pbm9yICkKKworL3N5cy9jbGFzcy9wa3RjZHZkLworICAgIGFkZCAgICAgICAgICAgICgwMjAwKSAgV3JpdGUgYSBibG9jayBkZXZpY2UgaWQgKG1ham9yOm1pbm9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY3JlYXRlIGEgbmV3IHBrdGNkdmQgZGV2aWNlIGFuZCBtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHRvIHRoZSBibG9jayBkZXZpY2UuCisKKyAgICByZW1vdmUgICAgICAgICAoMDIwMCkgIFdyaXRlIHRoZSBwa3RjZHZkIGRldmljZSBpZCAobWFqb3I6bWlub3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpdCB0byByZW1vdmUgdGhlIHBrdGNkdmQgZGV2aWNlLgorCisgICAgZGV2aWNlX21hcCAgICAgKDA0NDQpICBTaG93cyB0aGUgZGV2aWNlIG1hcHBpbmcgaW4gZm9ybWF0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RjZHZkWzAtN10gPHBrdGRldmlkPiA8YmxrZGV2aWQ+CisKKy9zeXMvY2xhc3MvcGt0Y2R2ZC9wa3RjZHZkWzAtN10vCisgICAgZGV2ICAgICAgICAgICAgICAgICAgICgwNDQ0KSBEZXZpY2UgaWQKKyAgICB1ZXZlbnQgICAgICAgICAgICAgICAgKDAyMDApIFRvIHNlbmQgYW4gdWV2ZW50LgorCisvc3lzL2NsYXNzL3BrdGNkdmQvcGt0Y2R2ZFswLTddL3N0YXQvCisgICAgcGFja2V0c19zdGFydGVkICAgICAgICgwNDQ0KSBOdW1iZXIgb2Ygc3RhcnRlZCBwYWNrZXRzLgorICAgIHBhY2tldHNfZmluaXNoZWQgICAgICAoMDQ0NCkgTnVtYmVyIG9mIGZpbmlzaGVkIHBhY2tldHMuCisKKyAgICBrYl93cml0dGVuICAgICAgICAgICAgKDA0NDQpIGtCeXRlcyB3cml0dGVuLgorICAgIGtiX3JlYWQgICAgICAgICAgICAgICAoMDQ0NCkga0J5dGVzIHJlYWQuCisgICAga2JfcmVhZF9nYXRoZXIgICAgICAgICgwNDQ0KSBrQnl0ZXMgcmVhZCB0byBmaWxsIHdyaXRlIHBhY2tldHMuCisKKyAgICByZXNldCAgICAgICAgICAgICAgICAgKDAyMDApIFdyaXRlIGFueSB2YWx1ZSB0byBpdCB0byByZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0Y2R2ZCBkZXZpY2Ugc3RhdGlzdGljIHZhbHVlcywgbGlrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgcmVhZC93cml0dGVuLgorCisvc3lzL2NsYXNzL3BrdGNkdmQvcGt0Y2R2ZFswLTddL3dyaXRlX3F1ZXVlLworICAgIHNpemUgICAgICAgICAgICAgICAgICAoMDQ0NCkgQ29udGFpbnMgdGhlIHNpemUgb2YgdGhlIGJpbyB3cml0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUuCisKKyAgICBjb25nZXN0aW9uX29mZiAgICAgICAgKDA2NDQpIElmIGJpbyB3cml0ZSBxdWV1ZSBzaXplIGlzIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hcmssIGFjY2VwdCBuZXcgYmlvIHJlcXVlc3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBibG9jayBsYXllci4KKworICAgIGNvbmdlc3Rpb25fb24gICAgICAgICAoMDY0NCkgSWYgYmlvIHdyaXRlIHF1ZXVlIHNpemUgaXMgaGlnaGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0aGlzIG1hcmssIGRvIG5vIGxvbmdlciBhY2NlcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbyB3cml0ZSByZXF1ZXN0cyBmcm9tIHRoZSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgYW5kIHdhaXQgdGlsbCB0aGUgcGt0Y2R2ZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGhhcyBwcm9jZXNzZWQgZW5vdWdoIGJpbydzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGJpbyB3cml0ZSBxdWV1ZSBzaXplIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyBjb25nZXN0aW9uIG9mZiBtYXJrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSB2YWx1ZSBvZiA8PSAwIGRpc2FibGVzIGNvbmdlc3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuCisKKworRXhhbXBsZToKKy0tLS0tLS0tCitUbyB1c2UgdGhlIHBrdGNkdmQgc3lzZnMgaW50ZXJmYWNlIGRpcmVjdGx5LCB5b3UgY2FuIGRvOgorCisjIGNyZWF0ZSBhIG5ldyBwa3RjZHZkIGRldmljZSBtYXBwZWQgdG8gL2Rldi9oZGMKK2VjaG8gIjIyOjAiID4vc3lzL2NsYXNzL3BrdGNkdmQvYWRkCitjYXQgL3N5cy9jbGFzcy9wa3RjZHZkL2RldmljZV9tYXAKKyMgYXNzdW1pbmcgZGV2aWNlIHBrdGNkdmQwIHdhcyBjcmVhdGVkLCBsb29rIGF0IHN0YXQncworY2F0IC9zeXMvY2xhc3MvcGt0Y2R2ZC9wa3RjZHZkMC9zdGF0L2tiX3dyaXR0ZW4KKyMgcHJpbnQgdGhlIGRldmljZSBpZCBvZiB0aGUgbWFwcGVkIGJsb2NrIGRldmljZQorZmdyZXAgcGt0Y2R2ZDAgL3N5cy9jbGFzcy9wa3RjZHZkL2RldmljZV9tYXAKKyMgcmVtb3ZlIGRldmljZSwgdXNpbmcgcGt0Y2R2ZDAgZGV2aWNlIGlkICAgMjUzOjAKK2VjaG8gIjI1MzowIiA+L3N5cy9jbGFzcy9wa3RjZHZkL3JlbW92ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKaW5kZXggZDg4MmY4MC4uZGNmZjRkMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlcgorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyCkBAIC0yMSw3ICsyMSw3IEBACiAJCXRoZXNlIHN0YXRlcy4KIAogV2hhdDoJCS9zeXMvcG93ZXIvZGlzawotRGF0ZToJCUF1Z3VzdCAyMDA2CitEYXRlOgkJU2VwdGVtYmVyIDIwMDYKIENvbnRhY3Q6CVJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4KIERlc2NyaXB0aW9uOgogCQlUaGUgL3N5cy9wb3dlci9kaXNrIGZpbGUgY29udHJvbHMgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZQpAQCAtMzksNiArMzksMTkgQEAKIAkJJ3JlYm9vdCcgLSB0aGUgbWVtb3J5IGltYWdlIHdpbGwgYmUgc2F2ZWQgYnkgdGhlIGtlcm5lbCBhbmQKIAkJdGhlIHN5c3RlbSB3aWxsIGJlIHJlYm9vdGVkLgogCisJCUFkZGl0aW9uYWxseSwgL3N5cy9wb3dlci9kaXNrIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24gb25lIG9mIHRoZQorCQl0d28gdGVzdGluZyBtb2RlcyBvZiB0aGUgc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbTogJ3Rlc3Rwcm9jJworCQlvciAndGVzdCcuICBJZiB0aGUgc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbSBpcyBpbiB0aGUKKwkJJ3Rlc3Rwcm9jJyBtb2RlLCB3cml0aW5nICdkaXNrJyB0byAvc3lzL3Bvd2VyL3N0YXRlIHdpbGwgY2F1c2UKKwkJdGhlIGtlcm5lbCB0byBkaXNhYmxlIG5vbmJvb3QgQ1BVcyBhbmQgZnJlZXplIHRhc2tzLCB3YWl0IGZvciA1CisJCXNlY29uZHMsIHVuZnJlZXplIHRhc2tzIGFuZCBlbmFibGUgbm9uYm9vdCBDUFVzLiAgSWYgaXQgaXMgaW4KKwkJdGhlICd0ZXN0JyBtb2RlLCB3cml0aW5nICdkaXNrJyB0byAvc3lzL3Bvd2VyL3N0YXRlIHdpbGwgY2F1c2UKKwkJdGhlIGtlcm5lbCB0byBkaXNhYmxlIG5vbmJvb3QgQ1BVcyBhbmQgZnJlZXplIHRhc2tzLCBzaHJpbmsKKwkJbWVtb3J5LCBzdXNwZW5kIGRldmljZXMsIHdhaXQgZm9yIDUgc2Vjb25kcywgcmVzdW1lIGRldmljZXMsCisJCXVuZnJlZXplIHRhc2tzIGFuZCBlbmFibGUgbm9uYm9vdCBDUFVzLiAgVGhlbiwgd2UgYXJlIGFibGUgdG8KKwkJbG9vayBpbiB0aGUgbG9nIG1lc3NhZ2VzIGFuZCB3b3JrIG91dCwgZm9yIGV4YW1wbGUsIHdoaWNoIGNvZGUKKwkJaXMgYmVpbmcgc2xvdyBhbmQgd2hpY2ggZGV2aWNlIGRyaXZlcnMgYXJlIG1pc2JlaGF2aW5nLgorCiAJCVRoZSBzdXNwZW5kLXRvLWRpc2sgbWV0aG9kIG1heSBiZSBjaG9zZW4gYnkgd3JpdGluZyB0byB0aGlzCiAJCWZpbGUgb25lIG9mIHRoZSBhY2NlcHRlZCBzdHJpbmdzOgogCkBAIC00Niw2ICs1OSw4IEBACiAJCSdwbGF0Zm9ybScKIAkJJ3NodXRkb3duJwogCQkncmVib290JworCQkndGVzdHByb2MnCisJCSd0ZXN0JwogCiAJCUl0IHdpbGwgb25seSBjaGFuZ2UgdG8gJ2Zpcm13YXJlJyBvciAncGxhdGZvcm0nIGlmIHRoZSBzeXN0ZW0KIAkJc3VwcG9ydHMgdGhhdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ2hhbmdlcyBiL0RvY3VtZW50YXRpb24vQ2hhbmdlcwppbmRleCBhYmVlN2Y1Li43M2E4NjE3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCkBAIC0yMDEsNyArMjAxLDcgQEAKIC0tLS0KIHVkZXYgaXMgYSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gZm9yIHBvcHVsYXRpbmcgL2RldiBkeW5hbWljYWxseSB3aXRoCiBvbmx5IGVudHJpZXMgZm9yIGRldmljZXMgYWN0dWFsbHkgcHJlc2VudC4gIHVkZXYgcmVwbGFjZXMgdGhlIGJhc2ljCi1mdW5jdGlvbmFsaXR5IG9mIGRldmZzLCB3aGlsZSBhbGxvd2luZyBwZXJzaXN0YW50IGRldmljZSBuYW1pbmcgZm9yCitmdW5jdGlvbmFsaXR5IG9mIGRldmZzLCB3aGlsZSBhbGxvd2luZyBwZXJzaXN0ZW50IGRldmljZSBuYW1pbmcgZm9yCiBkZXZpY2VzLgogCiBGVVNFCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCAyOWMxODk2Li4wYWQ2ZGNiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTM1LDEyICszNSwzNyBAQAogYmVuZWZpdCBvZiB3YXJuaW5nIHlvdSB3aGVuIHlvdSdyZSBuZXN0aW5nIHlvdXIgZnVuY3Rpb25zIHRvbyBkZWVwLgogSGVlZCB0aGF0IHdhcm5pbmcuCiAKK1RoZSBwcmVmZXJyZWQgd2F5IHRvIGVhc2UgbXVsdGlwbGUgaW5kZW50YXRpb24gbGV2ZWxzIGluIGEgc3dpdGNoIHN0YXRlbWVudCBpcwordG8gYWxpZ24gdGhlICJzd2l0Y2giIGFuZCBpdHMgc3Vib3JkaW5hdGUgImNhc2UiIGxhYmVscyBpbiB0aGUgc2FtZSBjb2x1bW4KK2luc3RlYWQgb2YgImRvdWJsZS1pbmRlbnRpbmciIHRoZSAiY2FzZSIgbGFiZWxzLiAgRS5nLjoKKworCXN3aXRjaCAoc3VmZml4KSB7CisJY2FzZSAnRyc6CisJY2FzZSAnZyc6CisJCW1lbSA8PD0gMzA7CisJCWJyZWFrOworCWNhc2UgJ00nOgorCWNhc2UgJ20nOgorCQltZW0gPDw9IDIwOworCQlicmVhazsKKwljYXNlICdLJzoKKwljYXNlICdrJzoKKwkJbWVtIDw8PSAxMDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisKIERvbid0IHB1dCBtdWx0aXBsZSBzdGF0ZW1lbnRzIG9uIGEgc2luZ2xlIGxpbmUgdW5sZXNzIHlvdSBoYXZlCiBzb21ldGhpbmcgdG8gaGlkZToKIAogCWlmIChjb25kaXRpb24pIGRvX3RoaXM7CiAJICBkb19zb21ldGhpbmdfZXZlcnl0aW1lOwogCitEb24ndCBwdXQgbXVsdGlwbGUgYXNzaWdubWVudHMgb24gYSBzaW5nbGUgbGluZSBlaXRoZXIuICBLZXJuZWwgY29kaW5nIHN0eWxlCitpcyBzdXBlciBzaW1wbGUuICBBdm9pZCB0cmlja3kgZXhwcmVzc2lvbnMuCisKIE91dHNpZGUgb2YgY29tbWVudHMsIGRvY3VtZW50YXRpb24gYW5kIGV4Y2VwdCBpbiBLY29uZmlnLCBzcGFjZXMgYXJlIG5ldmVyCiB1c2VkIGZvciBpbmRlbnRhdGlvbiwgYW5kIHRoZSBhYm92ZSBleGFtcGxlIGlzIGRlbGliZXJhdGVseSBicm9rZW4uCiAKQEAgLTY5LDcgKzk0LDcgQEAKIAkJbmV4dF9zdGF0ZW1lbnQ7CiB9CiAKLQkJQ2hhcHRlciAzOiBQbGFjaW5nIEJyYWNlcworCQlDaGFwdGVyIDM6IFBsYWNpbmcgQnJhY2VzIGFuZCBTcGFjZXMKIAogVGhlIG90aGVyIGlzc3VlIHRoYXQgYWx3YXlzIGNvbWVzIHVwIGluIEMgc3R5bGluZyBpcyB0aGUgcGxhY2VtZW50IG9mCiBicmFjZXMuICBVbmxpa2UgdGhlIGluZGVudCBzaXplLCB0aGVyZSBhcmUgZmV3IHRlY2huaWNhbCByZWFzb25zIHRvCkBAIC04MSw2ICsxMDYsMjAgQEAKIAkJd2UgZG8geQogCX0KIAorVGhpcyBhcHBsaWVzIHRvIGFsbCBub24tZnVuY3Rpb24gc3RhdGVtZW50IGJsb2NrcyAoaWYsIHN3aXRjaCwgZm9yLAord2hpbGUsIGRvKS4gIEUuZy46CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgS09CSl9BREQ6CisJCXJldHVybiAiYWRkIjsKKwljYXNlIEtPQkpfUkVNT1ZFOgorCQlyZXR1cm4gInJlbW92ZSI7CisJY2FzZSBLT0JKX0NIQU5HRToKKwkJcmV0dXJuICJjaGFuZ2UiOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KKwogSG93ZXZlciwgdGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSwgbmFtZWx5IGZ1bmN0aW9uczogdGhleSBoYXZlIHRoZQogb3BlbmluZyBicmFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUsIHRodXM6CiAKQEAgLTEyMSw2ICsxNjAsNDkgQEAKIDI1LWxpbmUgdGVybWluYWwgc2NyZWVucyBoZXJlKSwgeW91IGhhdmUgbW9yZSBlbXB0eSBsaW5lcyB0byBwdXQKIGNvbW1lbnRzIG9uLgogCisJCTMuMTogIFNwYWNlcworCitMaW51eCBrZXJuZWwgc3R5bGUgZm9yIHVzZSBvZiBzcGFjZXMgZGVwZW5kcyAobW9zdGx5KSBvbgorZnVuY3Rpb24tdmVyc3VzLWtleXdvcmQgdXNhZ2UuICBVc2UgYSBzcGFjZSBhZnRlciAobW9zdCkga2V5d29yZHMuICBUaGUKK25vdGFibGUgZXhjZXB0aW9ucyBhcmUgc2l6ZW9mLCB0eXBlb2YsIGFsaWdub2YsIGFuZCBfX2F0dHJpYnV0ZV9fLCB3aGljaCBsb29rCitzb21ld2hhdCBsaWtlIGZ1bmN0aW9ucyAoYW5kIGFyZSB1c3VhbGx5IHVzZWQgd2l0aCBwYXJlbnRoZXNlcyBpbiBMaW51eCwKK2FsdGhvdWdoIHRoZXkgYXJlIG5vdCByZXF1aXJlZCBpbiB0aGUgbGFuZ3VhZ2UsIGFzIGluOiAic2l6ZW9mIGluZm8iIGFmdGVyCisic3RydWN0IGZpbGVpbmZvIGluZm87IiBpcyBkZWNsYXJlZCkuCisKK1NvIHVzZSBhIHNwYWNlIGFmdGVyIHRoZXNlIGtleXdvcmRzOgorCWlmLCBzd2l0Y2gsIGNhc2UsIGZvciwgZG8sIHdoaWxlCitidXQgbm90IHdpdGggc2l6ZW9mLCB0eXBlb2YsIGFsaWdub2YsIG9yIF9fYXR0cmlidXRlX18uICBFLmcuLAorCXMgPSBzaXplb2Yoc3RydWN0IGZpbGUpOworCitEbyBub3QgYWRkIHNwYWNlcyBhcm91bmQgKGluc2lkZSkgcGFyZW50aGVzaXplZCBleHByZXNzaW9ucy4gIFRoaXMgZXhhbXBsZSBpcworKmJhZCo6CisKKwlzID0gc2l6ZW9mKCBzdHJ1Y3QgZmlsZSApOworCitXaGVuIGRlY2xhcmluZyBwb2ludGVyIGRhdGEgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwb2ludGVyIHR5cGUsIHRoZQorcHJlZmVycmVkIHVzZSBvZiAnKicgaXMgYWRqYWNlbnQgdG8gdGhlIGRhdGEgbmFtZSBvciBmdW5jdGlvbiBuYW1lIGFuZCBub3QKK2FkamFjZW50IHRvIHRoZSB0eXBlIG5hbWUuICBFeGFtcGxlczoKKworCWNoYXIgKmxpbnV4X2Jhbm5lcjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWVtcGFyc2UoY2hhciAqcHRyLCBjaGFyICoqcmV0cHRyKTsKKwljaGFyICptYXRjaF9zdHJkdXAoc3Vic3RyaW5nX3QgKnMpOworCitVc2Ugb25lIHNwYWNlIGFyb3VuZCAob24gZWFjaCBzaWRlIG9mKSBtb3N0IGJpbmFyeSBhbmQgdGVybmFyeSBvcGVyYXRvcnMsCitzdWNoIGFzIGFueSBvZiB0aGVzZToKKworCT0gICsgIC0gIDwgID4gICogIC8gICUgIHwgICYgIF4gIDw9ICA+PSAgPT0gICE9ICA/ICA6CisKK2J1dCBubyBzcGFjZSBhZnRlciB1bmFyeSBvcGVyYXRvcnM6CisJJiAgKiAgKyAgLSAgfiAgISAgc2l6ZW9mICB0eXBlb2YgIGFsaWdub2YgIF9fYXR0cmlidXRlX18gIGRlZmluZWQKKworbm8gc3BhY2UgYmVmb3JlIHRoZSBwb3N0Zml4IGluY3JlbWVudCAmIGRlY3JlbWVudCB1bmFyeSBvcGVyYXRvcnM6CisJKysgIC0tCisKK25vIHNwYWNlIGFmdGVyIHRoZSBwcmVmaXggaW5jcmVtZW50ICYgZGVjcmVtZW50IHVuYXJ5IG9wZXJhdG9yczoKKwkrKyAgLS0KKworYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgJy4nIGFuZCAiLT4iIHN0cnVjdHVyZSBtZW1iZXIgb3BlcmF0b3JzLgorCiAKIAkJQ2hhcHRlciA0OiBOYW1pbmcKIApAQCAtMTUyLDcgKzIzNCw3IEBACiAKIElmIHlvdSBhcmUgYWZyYWlkIHRvIG1peCB1cCB5b3VyIGxvY2FsIHZhcmlhYmxlIG5hbWVzLCB5b3UgaGF2ZSBhbm90aGVyCiBwcm9ibGVtLCB3aGljaCBpcyBjYWxsZWQgdGhlIGZ1bmN0aW9uLWdyb3d0aC1ob3Jtb25lLWltYmFsYW5jZSBzeW5kcm9tZS4KLVNlZSBuZXh0IGNoYXB0ZXIuCitTZWUgY2hhcHRlciA2IChGdW5jdGlvbnMpLgogCiAKIAkJQ2hhcHRlciA1OiBUeXBlZGVmcwpAQCAtMjU4LDYgKzM0MCwyMCBAQAogYW5kIGl0IGdldHMgY29uZnVzZWQuICBZb3Uga25vdyB5b3UncmUgYnJpbGxpYW50LCBidXQgbWF5YmUgeW91J2QgbGlrZQogdG8gdW5kZXJzdGFuZCB3aGF0IHlvdSBkaWQgMiB3ZWVrcyBmcm9tIG5vdy4KIAorSW4gc291cmNlIGZpbGVzLCBzZXBhcmF0ZSBmdW5jdGlvbnMgd2l0aCBvbmUgYmxhbmsgbGluZS4gIElmIHRoZSBmdW5jdGlvbiBpcworZXhwb3J0ZWQsIHRoZSBFWFBPUlQqIG1hY3JvIGZvciBpdCBzaG91bGQgZm9sbG93IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjbG9zaW5nCitmdW5jdGlvbiBicmFjZSBsaW5lLiAgRS5nLjoKKworaW50IHN5c3RlbV9pc191cCh2b2lkKQoreworCXJldHVybiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkc7Cit9CitFWFBPUlRfU1lNQk9MKHN5c3RlbV9pc191cCk7CisKK0luIGZ1bmN0aW9uIHByb3RvdHlwZXMsIGluY2x1ZGUgcGFyYW1ldGVyIG5hbWVzIHdpdGggdGhlaXIgZGF0YSB0eXBlcy4KK0FsdGhvdWdoIHRoaXMgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBDIGxhbmd1YWdlLCBpdCBpcyBwcmVmZXJyZWQgaW4gTGludXgKK2JlY2F1c2UgaXQgaXMgYSBzaW1wbGUgd2F5IHRvIGFkZCB2YWx1YWJsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlYWRlci4KKwogCiAJCUNoYXB0ZXIgNzogQ2VudHJhbGl6ZWQgZXhpdGluZyBvZiBmdW5jdGlvbnMKIApAQCAtMzA2LDE2ICs0MDIsMzYgQEAKIEdlbmVyYWxseSwgeW91IHdhbnQgeW91ciBjb21tZW50cyB0byB0ZWxsIFdIQVQgeW91ciBjb2RlIGRvZXMsIG5vdCBIT1cuCiBBbHNvLCB0cnkgdG8gYXZvaWQgcHV0dGluZyBjb21tZW50cyBpbnNpZGUgYSBmdW5jdGlvbiBib2R5OiBpZiB0aGUKIGZ1bmN0aW9uIGlzIHNvIGNvbXBsZXggdGhhdCB5b3UgbmVlZCB0byBzZXBhcmF0ZWx5IGNvbW1lbnQgcGFydHMgb2YgaXQsCi15b3Ugc2hvdWxkIHByb2JhYmx5IGdvIGJhY2sgdG8gY2hhcHRlciA1IGZvciBhIHdoaWxlLiAgWW91IGNhbiBtYWtlCit5b3Ugc2hvdWxkIHByb2JhYmx5IGdvIGJhY2sgdG8gY2hhcHRlciA2IGZvciBhIHdoaWxlLiAgWW91IGNhbiBtYWtlCiBzbWFsbCBjb21tZW50cyB0byBub3RlIG9yIHdhcm4gYWJvdXQgc29tZXRoaW5nIHBhcnRpY3VsYXJseSBjbGV2ZXIgKG9yCiB1Z2x5KSwgYnV0IHRyeSB0byBhdm9pZCBleGNlc3MuICBJbnN0ZWFkLCBwdXQgdGhlIGNvbW1lbnRzIGF0IHRoZSBoZWFkCiBvZiB0aGUgZnVuY3Rpb24sIHRlbGxpbmcgcGVvcGxlIHdoYXQgaXQgZG9lcywgYW5kIHBvc3NpYmx5IFdIWSBpdCBkb2VzCiBpdC4KIAotV2hlbiBjb21tZW50aW5nIHRoZSBrZXJuZWwgQVBJIGZ1bmN0aW9ucywgcGxlYXNlIHVzZSB0aGUga2VybmVsZG9jIGZvcm1hdC4KK1doZW4gY29tbWVudGluZyB0aGUga2VybmVsIEFQSSBmdW5jdGlvbnMsIHBsZWFzZSB1c2UgdGhlIGtlcm5lbC1kb2MgZm9ybWF0LgogU2VlIHRoZSBmaWxlcyBEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQgYW5kIHNjcmlwdHMva2VybmVsLWRvYwogZm9yIGRldGFpbHMuCiAKK0xpbnV4IHN0eWxlIGZvciBjb21tZW50cyBpcyB0aGUgQzg5ICIvKiAuLi4gKi8iIHN0eWxlLgorRG9uJ3QgdXNlIEM5OS1zdHlsZSAiLy8gLi4uIiBjb21tZW50cy4KKworVGhlIHByZWZlcnJlZCBzdHlsZSBmb3IgbG9uZyAobXVsdGktbGluZSkgY29tbWVudHMgaXM6CisKKwkvKgorCSAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBzdHlsZSBmb3IgbXVsdGktbGluZQorCSAqIGNvbW1lbnRzIGluIHRoZSBMaW51eCBrZXJuZWwgc291cmNlIGNvZGUuCisJICogUGxlYXNlIHVzZSBpdCBjb25zaXN0ZW50bHkuCisJICoKKwkgKiBEZXNjcmlwdGlvbjogIEEgY29sdW1uIG9mIGFzdGVyaXNrcyBvbiB0aGUgbGVmdCBzaWRlLAorCSAqIHdpdGggYmVnaW5uaW5nIGFuZCBlbmRpbmcgYWxtb3N0LWJsYW5rIGxpbmVzLgorCSAqLworCitJdCdzIGFsc28gaW1wb3J0YW50IHRvIGNvbW1lbnQgZGF0YSwgd2hldGhlciB0aGV5IGFyZSBiYXNpYyB0eXBlcyBvciBkZXJpdmVkCit0eXBlcy4gIFRvIHRoaXMgZW5kLCB1c2UganVzdCBvbmUgZGF0YSBkZWNsYXJhdGlvbiBwZXIgbGluZSAobm8gY29tbWFzIGZvcgorbXVsdGlwbGUgZGF0YSBkZWNsYXJhdGlvbnMpLiAgVGhpcyBsZWF2ZXMgeW91IHJvb20gZm9yIGEgc21hbGwgY29tbWVudCBvbiBlYWNoCitpdGVtLCBleHBsYWluaW5nIGl0cyB1c2UuCisKKwogCQlDaGFwdGVyIDk6IFlvdSd2ZSBtYWRlIGEgbWVzcyBvZiBpdAogCiBUaGF0J3MgT0ssIHdlIGFsbCBkby4gIFlvdSd2ZSBwcm9iYWJseSBiZWVuIHRvbGQgYnkgeW91ciBsb25nLXRpbWUgVW5peApAQCAtNTkxLDQgKzcwNyw0IEBACiBodHRwOi8vd3d3Lmtyb2FoLmNvbS9saW51eC90YWxrcy9vbHNfMjAwMl9rZXJuZWxfY29kaW5nc3R5bGVfdGFsay9odG1sLwogCiAtLQotTGFzdCB1cGRhdGVkIG9uIDMwIEFwcmlsIDIwMDYuCitMYXN0IHVwZGF0ZWQgb24gMjAwNi1EZWNlbWJlci0wNi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CmluZGV4IDJmZmIwZDYuLjgwNWRiNGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dApAQCAtNzcsNyArNzcsNyBAQAogTWFueSBkcml2ZXJzIG5lZWQgbG90cyBvZiBzbWFsbCBkbWEtY29oZXJlbnQgbWVtb3J5IHJlZ2lvbnMgZm9yIERNQQogZGVzY3JpcHRvcnMgb3IgSS9PIGJ1ZmZlcnMuICBSYXRoZXIgdGhhbiBhbGxvY2F0aW5nIGluIHVuaXRzIG9mIGEgcGFnZQogb3IgbW9yZSB1c2luZyBkbWFfYWxsb2NfY29oZXJlbnQoKSwgeW91IGNhbiB1c2UgRE1BIHBvb2xzLiAgVGhlc2Ugd29yawotbXVjaCBsaWtlIGEga21lbV9jYWNoZV90LCBleGNlcHQgdGhhdCB0aGV5IHVzZSB0aGUgZG1hLWNvaGVyZW50IGFsbG9jYXRvcgorbXVjaCBsaWtlIGEgc3RydWN0IGttZW1fY2FjaGUsIGV4Y2VwdCB0aGF0IHRoZXkgdXNlIHRoZSBkbWEtY29oZXJlbnQgYWxsb2NhdG9yCiBub3QgX19nZXRfZnJlZV9wYWdlcygpLiAgQWxzbywgdGhleSB1bmRlcnN0YW5kIGNvbW1vbiBoYXJkd2FyZSBjb25zdHJhaW50cwogZm9yIGFsaWdubWVudCwgbGlrZSBxdWV1ZSBoZWFkcyBuZWVkaW5nIHRvIGJlIGFsaWduZWQgb24gTiBieXRlIGJvdW5kYXJpZXMuCiAKQEAgLTk0LDcgKzk0LDcgQEAKIGZvciB1c2Ugd2l0aCBhIGdpdmVuIGRldmljZS4gIEl0IG11c3QgYmUgY2FsbGVkIGluIGEgY29udGV4dCB3aGljaAogY2FuIHNsZWVwLgogCi1UaGUgIm5hbWUiIGlzIGZvciBkaWFnbm9zdGljcyAobGlrZSBhIGttZW1fY2FjaGVfdCBuYW1lKTsgZGV2IGFuZCBzaXplCitUaGUgIm5hbWUiIGlzIGZvciBkaWFnbm9zdGljcyAobGlrZSBhIHN0cnVjdCBrbWVtX2NhY2hlIG5hbWUpOyBkZXYgYW5kIHNpemUKIGFyZSBsaWtlIHdoYXQgeW91J2QgcGFzcyB0byBkbWFfYWxsb2NfY29oZXJlbnQoKS4gIFRoZSBkZXZpY2UncyBoYXJkd2FyZQogYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciB0aGlzIHR5cGUgb2YgZGF0YSBpcyAiYWxpZ24iICh3aGljaCBpcyBleHByZXNzZWQKIGluIGJ5dGVzLCBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIHR3bykuICBJZiB5b3VyIGRldmljZSBoYXMgbm8gYm91bmRhcnkKQEAgLTQzMSwxMCArNDMxLDEwIEBACiBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoKSkuCiAKIGludAotZG1hX2lzX2NvbnNpc3RlbnQoZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQorZG1hX2lzX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCiAKLXJldHVybnMgdHJ1ZSBpZiB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhlIGRtYV9oYW5kbGUgaXMgYWN0dWFsbHkKLWNvbnNpc3RlbnQuCityZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBkZXYgaXMgcGVyZm9ybWluZyBjb25zaXN0ZW50IERNQSBvbiB0aGUgbWVtb3J5CithcmVhIHBvaW50ZWQgdG8gYnkgdGhlIGRtYV9oYW5kbGUuCiAKIGludAogZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQodm9pZCkKQEAgLTQ1OSw3ICs0NTksNyBAQAogbWVtb3J5IHlvdSBpbnRlbmQgdG8gc3luYyBwYXJ0aWFsbHkuCiAKIHZvaWQKLWRtYV9jYWNoZV9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKK2RtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiAKIERvIGEgcGFydGlhbCBzeW5jIG9mIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgYnkKQEAgLTQ4OSw3ICs0ODksNyBAQAogZmxhZ3MgY2FuIGJlIG9yJ2QgdG9nZXRoZXIgYW5kIGFyZQogCiBETUFfTUVNT1JZX01BUCAtIHJlcXVlc3QgdGhhdCB0aGUgbWVtb3J5IHJldHVybmVkIGZyb20KLWRtYV9hbGxvY19jb2hlcmVudCgpIGJlIGRpcmVjdGx5IHdyaXRlYWJsZS4KK2RtYV9hbGxvY19jb2hlcmVudCgpIGJlIGRpcmVjdGx5IHdyaXRhYmxlLgogCiBETUFfTUVNT1JZX0lPIC0gcmVxdWVzdCB0aGF0IHRoZSBtZW1vcnkgcmV0dXJuZWQgZnJvbQogZG1hX2FsbG9jX2NvaGVyZW50KCkgYmUgYWRkcmVzc2FibGUgdXNpbmcgcmVhZC93cml0ZS9tZW1jcHlfdG9pbyBldGMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1JU0EtTFBDLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLUlTQS1MUEMudHh0CmluZGV4IDcwNWY2YmUuLmU3Njc4MDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRE1BLUlTQS1MUEMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUlTQS1MUEMudHh0CkBAIC0xMTAsNyArMTEwLDcgQEAKIAogT25jZSB0aGUgRE1BIHRyYW5zZmVyIGlzIGZpbmlzaGVkIChvciB0aW1lZCBvdXQpIHlvdSBzaG91bGQgZGlzYWJsZQogdGhlIGNoYW5uZWwgYWdhaW4uIFlvdSBzaG91bGQgYWxzbyBjaGVjayBnZXRfZG1hX3Jlc2lkdWUoKSB0byBtYWtlCi1zdXJlIHRoYXQgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJlZC4KK3N1cmUgdGhhdCBhbGwgZGF0YSBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4KIAogRXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCmluZGV4IDY2ZTFjZjcuLjM2NTI2YTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKQEAgLTksNyArOSw3IEBACiBET0NCT09LUyA6PSB3YW5ib29rLnhtbCB6ODUzMGJvb2sueG1sIG1jYWJvb2sueG1sIHZpZGVvYm9vay54bWwgXAogCSAgICBrZXJuZWwtaGFja2luZy54bWwga2VybmVsLWxvY2tpbmcueG1sIGRldmljZWlvYm9vay54bWwgXAogCSAgICBwcm9jZnMtZ3VpZGUueG1sIHdyaXRpbmdfdXNiX2RyaXZlci54bWwgXAotCSAgICBrZXJuZWwtYXBpLnhtbCBqb3VybmFsLWFwaS54bWwgbHNtLnhtbCB1c2IueG1sIFwKKwkgICAga2VybmVsLWFwaS54bWwgZmlsZXN5c3RlbXMueG1sIGxzbS54bWwgdXNiLnhtbCBcCiAJICAgIGdhZGdldC54bWwgbGliYXRhLnhtbCBtdGRuYW5kLnhtbCBsaWJycy54bWwgcmFwaWRpby54bWwgXAogCSAgICBnZW5lcmljaXJxLnhtbAogCkBAIC0xOTAsOSArMTkwLDEzIEBACiAjIyMKICMgSGVscCB0YXJnZXRzIGFzIHVzZWQgYnkgdGhlIHRvcC1sZXZlbCBtYWtlZmlsZQogZG9jaGVscDoKLQlAZWNobyAgJyAgTGludXgga2VybmVsIGludGVybmFsIGRvY3VtZW50YXRpb24gaW4gZGlmZmVyZW50IGZvcm1hdHM6JwotCUBlY2hvICAnICB4bWxkb2NzIChYTUwgRG9jQm9vayksIHBzZG9jcyAoUG9zdHNjcmlwdCksIHBkZmRvY3MgKFBERiknCi0JQGVjaG8gICcgIGh0bWxkb2NzIChIVE1MKSwgbWFuZG9jcyAobWFuIHBhZ2VzLCB1c2UgaW5zdGFsbG1hbmRvY3MgdG8gaW5zdGFsbCknCisJQGVjaG8gICcgTGludXgga2VybmVsIGludGVybmFsIGRvY3VtZW50YXRpb24gaW4gZGlmZmVyZW50IGZvcm1hdHM6JworCUBlY2hvICAnICBodG1sZG9jcyAgICAgICAgLSBIVE1MJworCUBlY2hvICAnICBpbnN0YWxsbWFuZG9jcyAgLSBpbnN0YWxsIG1hbiBwYWdlcyBnZW5lcmF0ZWQgYnkgbWFuZG9jcycKKwlAZWNobyAgJyAgbWFuZG9jcyAgICAgICAgIC0gbWFuIHBhZ2VzJworCUBlY2hvICAnICBwZGZkb2NzICAgICAgICAgLSBQREYnCisJQGVjaG8gICcgIHBzZG9jcyAgICAgICAgICAtIFBvc3RzY3JpcHQnCisJQGVjaG8gICcgIHhtbGRvY3MgICAgICAgICAtIFhNTCBEb2NCb29rJwogCiAjIyMKICMgVGVtcG9yYXJ5IGZpbGVzIGxlZnQgYnkgdmFyaW91cyB0b29scwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2ZpbGVzeXN0ZW1zLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZmlsZXN5c3RlbXMudG1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWZhMmFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2ZpbGVzeXN0ZW1zLnRtcGwKQEAgLTAsMCArMSw0MDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKwkiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFtdPgorCis8Ym9vayBpZD0iTGludXgtZmlsZXN5c3RlbXMtQVBJIj4KKyA8Ym9va2luZm8+CisgIDx0aXRsZT5MaW51eCBGaWxlc3lzdGVtcyBBUEk8L3RpdGxlPgorCisgIDxsZWdhbG5vdGljZT4KKyAgIDxwYXJhPgorICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKKyAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICAgICB2ZXJzaW9uLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAgICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQorICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCisgICA8L3BhcmE+CisgIDwvbGVnYWxub3RpY2U+CisgPC9ib29raW5mbz4KKworPHRvYz48L3RvYz4KKworICA8Y2hhcHRlciBpZD0idmZzIj4KKyAgICAgPHRpdGxlPlRoZSBMaW51eCBWRlM8L3RpdGxlPgorICAgICA8c2VjdDE+PHRpdGxlPlRoZSBGaWxlc3lzdGVtIHR5cGVzPC90aXRsZT4KKyFJaW5jbHVkZS9saW51eC9mcy5oCisgICAgIDwvc2VjdDE+CisgICAgIDxzZWN0MT48dGl0bGU+VGhlIERpcmVjdG9yeSBDYWNoZTwvdGl0bGU+CishRWZzL2RjYWNoZS5jCishSWluY2x1ZGUvbGludXgvZGNhY2hlLmgKKyAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5Jbm9kZSBIYW5kbGluZzwvdGl0bGU+CishRWZzL2lub2RlLmMKKyFFZnMvYmFkX2lub2RlLmMKKyAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5SZWdpc3RyYXRpb24gYW5kIFN1cGVyYmxvY2tzPC90aXRsZT4KKyFFZnMvc3VwZXIuYworICAgICA8L3NlY3QxPgorICAgICA8c2VjdDE+PHRpdGxlPkZpbGUgTG9ja3M8L3RpdGxlPgorIUVmcy9sb2Nrcy5jCishSWZzL2xvY2tzLmMKKyAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5PdGhlciBGdW5jdGlvbnM8L3RpdGxlPgorIUVmcy9tcGFnZS5jCishRWZzL25hbWVpLmMKKyFFZnMvYnVmZmVyLmMKKyFFZnMvYmlvLmMKKyFFZnMvc2VxX2ZpbGUuYworIUVmcy9maWxlc3lzdGVtcy5jCishRWZzL2ZzLXdyaXRlYmFjay5jCishRWZzL2Jsb2NrX2Rldi5jCisgICAgIDwvc2VjdDE+CisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlciBpZD0icHJvYyI+CisgICAgIDx0aXRsZT5UaGUgcHJvYyBmaWxlc3lzdGVtPC90aXRsZT4KKworICAgICA8c2VjdDE+PHRpdGxlPnN5c2N0bCBpbnRlcmZhY2U8L3RpdGxlPgorIUVrZXJuZWwvc3lzY3RsLmMKKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDE+PHRpdGxlPnByb2MgZmlsZXN5c3RlbSBpbnRlcmZhY2U8L3RpdGxlPgorIUlmcy9wcm9jL2Jhc2UuYworICAgICA8L3NlY3QxPgorICA8L2NoYXB0ZXI+CisKKyAgPGNoYXB0ZXIgaWQ9InN5c2ZzIj4KKyAgICAgPHRpdGxlPlRoZSBGaWxlc3lzdGVtIGZvciBFeHBvcnRpbmcgS2VybmVsIE9iamVjdHM8L3RpdGxlPgorIUVmcy9zeXNmcy9maWxlLmMKKyFFZnMvc3lzZnMvc3ltbGluay5jCishRWZzL3N5c2ZzL2Jpbi5jCisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlciBpZD0iZGVidWdmcyI+CisgICAgIDx0aXRsZT5UaGUgZGVidWdmcyBmaWxlc3lzdGVtPC90aXRsZT4KKworICAgICA8c2VjdDE+PHRpdGxlPmRlYnVnZnMgaW50ZXJmYWNlPC90aXRsZT4KKyFFZnMvZGVidWdmcy9pbm9kZS5jCishRWZzL2RlYnVnZnMvZmlsZS5jCisgICAgIDwvc2VjdDE+CisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlciBpZD0iTGludXhKREJBUEkiPgorICA8Y2hhcHRlcmluZm8+CisgIDx0aXRsZT5UaGUgTGludXggSm91cm5hbGxpbmcgQVBJPC90aXRsZT4KKworICA8YXV0aG9yZ3JvdXA+CisgIDxhdXRob3I+CisgICAgIDxmaXJzdG5hbWU+Um9nZXI8L2ZpcnN0bmFtZT4KKyAgICAgPHN1cm5hbWU+R2FtbWFuczwvc3VybmFtZT4KKyAgICAgPGFmZmlsaWF0aW9uPgorICAgICA8YWRkcmVzcz4KKyAgICAgIDxlbWFpbD5yZ2FtbWFuc0Bjb21wdXRlci1zdXJnZXJ5LmNvLnVrPC9lbWFpbD4KKyAgICAgPC9hZGRyZXNzPgorICAgIDwvYWZmaWxpYXRpb24+CisgICAgIDwvYXV0aG9yPgorICA8L2F1dGhvcmdyb3VwPgorCisgIDxhdXRob3Jncm91cD4KKyAgIDxhdXRob3I+CisgICAgPGZpcnN0bmFtZT5TdGVwaGVuPC9maXJzdG5hbWU+CisgICAgPHN1cm5hbWU+VHdlZWRpZTwvc3VybmFtZT4KKyAgICA8YWZmaWxpYXRpb24+CisgICAgIDxhZGRyZXNzPgorICAgICAgPGVtYWlsPnNjdEByZWRoYXQuY29tPC9lbWFpbD4KKyAgICAgPC9hZGRyZXNzPgorICAgIDwvYWZmaWxpYXRpb24+CisgICA8L2F1dGhvcj4KKyAgPC9hdXRob3Jncm91cD4KKworICA8Y29weXJpZ2h0PgorICAgPHllYXI+MjAwMjwveWVhcj4KKyAgIDxob2xkZXI+Um9nZXIgR2FtbWFuczwvaG9sZGVyPgorICA8L2NvcHlyaWdodD4KKyAgPC9jaGFwdGVyaW5mbz4KKworICA8dGl0bGU+VGhlIExpbnV4IEpvdXJuYWxsaW5nIEFQSTwvdGl0bGU+CisKKyAgICA8c2VjdDE+CisgICAgIDx0aXRsZT5PdmVydmlldzwvdGl0bGU+CisgICAgPHNlY3QyPgorICAgICA8dGl0bGU+RGV0YWlsczwvdGl0bGU+Cis8cGFyYT4KK1RoZSBqb3VybmFsbGluZyBsYXllciBpcyAgZWFzeSB0byB1c2UuIFlvdSBuZWVkIHRvCitmaXJzdCBvZiBhbGwgY3JlYXRlIGEgam91cm5hbF90IGRhdGEgc3RydWN0dXJlLiBUaGVyZSBhcmUKK3R3byBjYWxscyB0byBkbyB0aGlzIGRlcGVuZGVudCBvbiBob3cgeW91IGRlY2lkZSB0byBhbGxvY2F0ZSB0aGUgcGh5c2ljYWwKK21lZGlhIG9uIHdoaWNoIHRoZSBqb3VybmFsIHJlc2lkZXMuIFRoZSBqb3VybmFsX2luaXRfaW5vZGUoKSBjYWxsCitpcyBmb3Igam91cm5hbHMgc3RvcmVkIGluIGZpbGVzeXN0ZW0gaW5vZGVzLCBvciB0aGUgam91cm5hbF9pbml0X2RldigpCitjYWxsIGNhbiBiZSB1c2UgZm9yIGpvdXJuYWwgc3RvcmVkIG9uIGEgcmF3IGRldmljZSAoaW4gYSBjb250aW51b3VzIHJhbmdlCitvZiBibG9ja3MpLiBBIGpvdXJuYWxfdCBpcyBhIHR5cGVkZWYgZm9yIGEgc3RydWN0IHBvaW50ZXIsIHNvIHdoZW4KK3lvdSBhcmUgZmluYWxseSBmaW5pc2hlZCBtYWtlIHN1cmUgeW91IGNhbGwgam91cm5hbF9kZXN0cm95KCkgb24gaXQKK3RvIGZyZWUgdXAgYW55IHVzZWQga2VybmVsIG1lbW9yeS4KKzwvcGFyYT4KKworPHBhcmE+CitPbmNlIHlvdSBoYXZlIGdvdCB5b3VyIGpvdXJuYWxfdCBvYmplY3QgeW91IG5lZWQgdG8gJ21vdW50JyBvciBsb2FkIHRoZSBqb3VybmFsCitmaWxlLCB1bmxlc3Mgb2YgY291cnNlIHlvdSBoYXZlbid0IGluaXRpYWxpc2VkIGl0IHlldCAtIGluIHdoaWNoIGNhc2UgeW91CituZWVkIHRvIGNhbGwgam91cm5hbF9jcmVhdGUoKS4KKzwvcGFyYT4KKworPHBhcmE+CitNb3N0IG9mIHRoZSB0aW1lIGhvd2V2ZXIgeW91ciBqb3VybmFsIGZpbGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBjcmVhdGVkLCBidXQKK2JlZm9yZSB5b3UgbG9hZCBpdCB5b3UgbXVzdCBjYWxsIGpvdXJuYWxfd2lwZSgpIHRvIGVtcHR5IHRoZSBqb3VybmFsIGZpbGUuCitIYW5nIG9uLCB5b3Ugc2F5ICwgd2hhdCBpZiB0aGUgZmlsZXN5c3RlbSB3YXNuJ3QgY2xlYW5seSB1bW91bnQoKSdkIC4gV2VsbCwgaXQgaXMgdGhlCitqb2Igb2YgdGhlIGNsaWVudCBmaWxlIHN5c3RlbSB0byBkZXRlY3QgdGhpcyBhbmQgc2tpcCB0aGUgY2FsbCB0byBqb3VybmFsX3dpcGUoKS4KKzwvcGFyYT4KKworPHBhcmE+CitJbiBlaXRoZXIgY2FzZSB0aGUgbmV4dCBjYWxsIHNob3VsZCBiZSB0byBqb3VybmFsX2xvYWQoKSB3aGljaCBwcmVwYXJlcyB0aGUKK2pvdXJuYWwgZmlsZSBmb3IgdXNlLiBOb3RlIHRoYXQgam91cm5hbF93aXBlKC4uLDApIGNhbGxzIGpvdXJuYWxfc2tpcF9yZWNvdmVyeSgpCitmb3IgeW91IGlmIGl0IGRldGVjdHMgYW55IG91dHN0YW5kaW5nIHRyYW5zYWN0aW9ucyBpbiB0aGUgam91cm5hbCBhbmQgc2ltaWxhcmx5Citqb3VybmFsX2xvYWQoKSB3aWxsIGNhbGwgam91cm5hbF9yZWNvdmVyKCkgaWYgbmVjZXNzYXJ5LgorSSB3b3VsZCBhZHZpc2UgcmVhZGluZyBmcy9leHQzL3N1cGVyLmMgZm9yIGV4YW1wbGVzIG9uIHRoaXMgc3RhZ2UuCitbUkdHOiBXaHkgaXMgdGhlIGpvdXJuYWxfd2lwZSgpIGNhbGwgbmVjZXNzYXJ5IC0gZG9lc24ndCB0aGlzIG5lZWRsZXNzbHkKK2NvbXBsaWNhdGUgdGhlIEFQSS4gT3IgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBqb3VybmFsIGxheWVyIHRvIGhpZGUKK2RpcnR5IG1vdW50cyBmcm9tIHRoZSBjbGllbnQgZnNdCis8L3BhcmE+CisKKzxwYXJhPgorTm93IHlvdSBjYW4gZ28gYWhlYWQgYW5kIHN0YXJ0IG1vZGlmeWluZyB0aGUgdW5kZXJseWluZworZmlsZXN5c3RlbS4gQWxtb3N0LgorPC9wYXJhPgorCis8cGFyYT4KKworWW91IHN0aWxsIG5lZWQgdG8gYWN0dWFsbHkgam91cm5hbCB5b3VyIGZpbGVzeXN0ZW0gY2hhbmdlcywgdGhpcworaXMgZG9uZSBieSB3cmFwcGluZyB0aGVtIGludG8gdHJhbnNhY3Rpb25zLiBBZGRpdGlvbmFsbHkgeW91CithbHNvIG5lZWQgdG8gd3JhcCB0aGUgbW9kaWZpY2F0aW9uIG9mIGVhY2ggb2YgdGhlIGJ1ZmZlcnMKK3dpdGggY2FsbHMgdG8gdGhlIGpvdXJuYWwgbGF5ZXIsIHNvIGl0IGtub3dzIHdoYXQgdGhlIG1vZGlmaWNhdGlvbnMKK3lvdSBhcmUgYWN0dWFsbHkgbWFraW5nIGFyZS4gVG8gZG8gdGhpcyB1c2UgIGpvdXJuYWxfc3RhcnQoKSB3aGljaAorcmV0dXJucyBhIHRyYW5zYWN0aW9uIGhhbmRsZS4KKzwvcGFyYT4KKworPHBhcmE+Citqb3VybmFsX3N0YXJ0KCkKK2FuZCBpdHMgY291bnRlcnBhcnQgam91cm5hbF9zdG9wKCksIHdoaWNoIGluZGljYXRlcyB0aGUgZW5kIG9mIGEgdHJhbnNhY3Rpb24KK2FyZSBuZXN0YWJsZSBjYWxscywgc28geW91IGNhbiByZWVudGVyIGEgdHJhbnNhY3Rpb24gaWYgbmVjZXNzYXJ5LAorYnV0IHJlbWVtYmVyIHlvdSBtdXN0IGNhbGwgam91cm5hbF9zdG9wKCkgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzIGFzCitqb3VybmFsX3N0YXJ0KCkgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZWQgKG9yIG1vcmUgYWNjdXJhdGVseQorbGVhdmVzIHRoZSB1cGRhdGUgcGhhc2UpLiBFeHQzL1ZGUyBtYWtlcyB1c2Ugb2YgdGhpcyBmZWF0dXJlIHRvIHNpbXBsaWZ5CitxdW90YSBzdXBwb3J0LgorPC9wYXJhPgorCis8cGFyYT4KK0luc2lkZSBlYWNoIHRyYW5zYWN0aW9uIHlvdSBuZWVkIHRvIHdyYXAgdGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlCitpbmRpdmlkdWFsIGJ1ZmZlcnMgKGJsb2NrcykuIEJlZm9yZSB5b3Ugc3RhcnQgdG8gbW9kaWZ5IGEgYnVmZmVyIHlvdQorbmVlZCB0byBjYWxsIGpvdXJuYWxfZ2V0X3tjcmVhdGUsd3JpdGUsdW5kb31fYWNjZXNzKCkgYXMgYXBwcm9wcmlhdGUsCit0aGlzIGFsbG93cyB0aGUgam91cm5hbGxpbmcgbGF5ZXIgdG8gY29weSB0aGUgdW5tb2RpZmllZCBkYXRhIGlmIGl0CituZWVkcyB0by4gQWZ0ZXIgYWxsIHRoZSBidWZmZXIgbWF5IGJlIHBhcnQgb2YgYSBwcmV2aW91c2x5IHVuY29tbWl0dGVkCit0cmFuc2FjdGlvbi4KK0F0IHRoaXMgcG9pbnQgeW91IGFyZSBhdCBsYXN0IHJlYWR5IHRvIG1vZGlmeSBhIGJ1ZmZlciwgYW5kIG9uY2UKK3lvdSBhcmUgaGF2ZSBkb25lIHNvIHlvdSBuZWVkIHRvIGNhbGwgam91cm5hbF9kaXJ0eV97bWV0YSx9ZGF0YSgpLgorT3IgaWYgeW91J3ZlIGFza2VkIGZvciBhY2Nlc3MgdG8gYSBidWZmZXIgeW91IG5vdyBrbm93IGlzIG5vdyBsb25nZXIKK3JlcXVpcmVkIHRvIGJlIHB1c2hlZCBiYWNrIG9uIHRoZSBkZXZpY2UgeW91IGNhbiBjYWxsIGpvdXJuYWxfZm9yZ2V0KCkKK2luIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHlvdSBtaWdodCBoYXZlIHVzZWQgYmZvcmdldCgpIGluIHRoZSBwYXN0LgorPC9wYXJhPgorCis8cGFyYT4KK0Egam91cm5hbF9mbHVzaCgpIG1heSBiZSBjYWxsZWQgYXQgYW55IHRpbWUgdG8gY29tbWl0IGFuZCBjaGVja3BvaW50CithbGwgeW91ciB0cmFuc2FjdGlvbnMuCis8L3BhcmE+CisKKzxwYXJhPgorVGhlbiBhdCB1bW91bnQgdGltZSAsIGluIHlvdXIgcHV0X3N1cGVyKCkgKDIuNCkgb3Igd3JpdGVfc3VwZXIoKSAoMi41KQoreW91IGNhbiB0aGVuIGNhbGwgam91cm5hbF9kZXN0cm95KCkgdG8gY2xlYW4gdXAgeW91ciBpbi1jb3JlIGpvdXJuYWwgb2JqZWN0LgorPC9wYXJhPgorCis8cGFyYT4KK1VuZm9ydHVuYXRlbHkgdGhlcmUgYSBjb3VwbGUgb2Ygd2F5cyB0aGUgam91cm5hbCBsYXllciBjYW4gY2F1c2UgYSBkZWFkbG9jay4KK1RoZSBmaXJzdCB0aGluZyB0byBub3RlIGlzIHRoYXQgZWFjaCB0YXNrIGNhbiBvbmx5IGhhdmUKK2Egc2luZ2xlIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uIGF0IGFueSBvbmUgdGltZSwgcmVtZW1iZXIgbm90aGluZworY29tbWl0cyB1bnRpbCB0aGUgb3V0ZXJtb3N0IGpvdXJuYWxfc3RvcCgpLiBUaGlzIG1lYW5zCit5b3UgbXVzdCBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24gYXQgdGhlIGVuZCBvZiBlYWNoIGZpbGUvaW5vZGUvYWRkcmVzcworZXRjLiBvcGVyYXRpb24geW91IHBlcmZvcm0sIHNvIHRoYXQgdGhlIGpvdXJuYWxsaW5nIHN5c3RlbSBpc24ndCByZS1lbnRlcmVkCitvbiBhbm90aGVyIGpvdXJuYWwuIFNpbmNlIHRyYW5zYWN0aW9ucyBjYW4ndCBiZSBuZXN0ZWQvYmF0Y2hlZAorYWNyb3NzIGRpZmZlcmluZyBqb3VybmFscywgYW5kIGFub3RoZXIgZmlsZXN5c3RlbSBvdGhlciB0aGFuCit5b3VycyAoc2F5IGV4dDMpIG1heSBiZSBtb2RpZmllZCBpbiBhIGxhdGVyIHN5c2NhbGwuCis8L3BhcmE+CisKKzxwYXJhPgorVGhlIHNlY29uZCBjYXNlIHRvIGJlYXIgaW4gbWluZCBpcyB0aGF0IGpvdXJuYWxfc3RhcnQoKSBjYW4KK2Jsb2NrIGlmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSBpbiB0aGUgam91cm5hbCBmb3IgeW91ciB0cmFuc2FjdGlvbgorKGJhc2VkIG9uIHRoZSBwYXNzZWQgbmJsb2NrcyBwYXJhbSkgLSB3aGVuIGl0IGJsb2NrcyBpdCBtZXJlbHkoISkgbmVlZHMgdG8KK3dhaXQgZm9yIHRyYW5zYWN0aW9ucyB0byBjb21wbGV0ZSBhbmQgYmUgY29tbWl0dGVkIGZyb20gb3RoZXIgdGFza3MsCitzbyBlc3NlbnRpYWxseSB3ZSBhcmUgd2FpdGluZyBmb3Igam91cm5hbF9zdG9wKCkuIFNvIHRvIGF2b2lkCitkZWFkbG9ja3MgeW91IG11c3QgdHJlYXQgam91cm5hbF9zdGFydC9zdG9wKCkgYXMgaWYgdGhleQord2VyZSBzZW1hcGhvcmVzIGFuZCBpbmNsdWRlIHRoZW0gaW4geW91ciBzZW1hcGhvcmUgb3JkZXJpbmcgcnVsZXMgdG8gcHJldmVudAorZGVhZGxvY2tzLiBOb3RlIHRoYXQgam91cm5hbF9leHRlbmQoKSBoYXMgc2ltaWxhciBibG9ja2luZyBiZWhhdmlvdXIgdG8KK2pvdXJuYWxfc3RhcnQoKSBzbyB5b3UgY2FuIGRlYWRsb2NrIGhlcmUganVzdCBhcyBlYXNpbHkgYXMgb24gam91cm5hbF9zdGFydCgpLgorPC9wYXJhPgorCis8cGFyYT4KK1RyeSB0byByZXNlcnZlIHRoZSByaWdodCBudW1iZXIgb2YgYmxvY2tzIHRoZSBmaXJzdCB0aW1lLiA7LSkuIFRoaXMgd2lsbAorYmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyB5b3UgYXJlIGdvaW5nIHRvIHRvdWNoIGluIHRoaXMgdHJhbnNhY3Rpb24uCitJIGFkdmlzZSBoYXZpbmcgYSBsb29rIGF0IGF0IGxlYXN0IGV4dDNfamJkLmggdG8gc2VlIHRoZSBiYXNpcyBvbiB3aGljaAorZXh0MyB1c2VzIHRvIG1ha2UgdGhlc2UgZGVjaXNpb25zLgorPC9wYXJhPgorCis8cGFyYT4KK0Fub3RoZXIgd3JpZ2dsZSB0byB3YXRjaCBvdXQgZm9yIGlzIHlvdXIgb24tZGlzayBibG9jayBhbGxvY2F0aW9uIHN0cmF0ZWd5Lgord2h5PyBCZWNhdXNlLCBpZiB5b3UgdW5kbyBhIGRlbGV0ZSwgeW91IG5lZWQgdG8gZW5zdXJlIHlvdSBoYXZlbid0IHJldXNlZCBhbnkKK29mIHRoZSBmcmVlZCBibG9ja3MgaW4gYSBsYXRlciB0cmFuc2FjdGlvbi4gT25lIHNpbXBsZSB3YXkgb2YgZG9pbmcgdGhpcworaXMgbWFrZSBzdXJlIGFueSBibG9ja3MgeW91IGFsbG9jYXRlIG9ubHkgaGF2ZSBjaGVja3BvaW50ZWQgdHJhbnNhY3Rpb25zCitsaXN0ZWQgYWdhaW5zdCB0aGVtLiBFeHQzIGRvZXMgdGhpcyBpbiBleHQzX3Rlc3RfYWxsb2NhdGFibGUoKS4KKzwvcGFyYT4KKworPHBhcmE+CitMb2NrIGlzIGFsc28gcHJvdmlkaW5nIHRocm91Z2ggam91cm5hbF97dW4sfWxvY2tfdXBkYXRlcygpLAorZXh0MyB1c2VzIHRoaXMgd2hlbiBpdCB3YW50cyBhIHdpbmRvdyB3aXRoIGEgY2xlYW4gYW5kIHN0YWJsZSBmcyBmb3IgYSBtb21lbnQuCitlZy4KKzwvcGFyYT4KKworPHByb2dyYW1saXN0aW5nPgorCisJam91cm5hbF9sb2NrX3VwZGF0ZXMoKSAvL3N0b3AgbmV3IHN0dWZmIGhhcHBlbmluZy4uCisJam91cm5hbF9mbHVzaCgpICAgICAgICAvLyBjaGVja3BvaW50IGV2ZXJ5dGhpbmcuCisJLi5kbyBzdHVmZiBvbiBzdGFibGUgZnMKKwlqb3VybmFsX3VubG9ja191cGRhdGVzKCkgLy8gY2Fycnkgb24gd2l0aCBmaWxlc3lzdGVtIHVzZS4KKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKzxwYXJhPgorVGhlIG9wcG9ydHVuaXRpZXMgZm9yIGFidXNlIGFuZCBET1MgYXR0YWNrcyB3aXRoIHRoaXMgc2hvdWxkIGJlIG9idmlvdXMsCitpZiB5b3UgYWxsb3cgdW5wcml2aWxlZ2VkIHVzZXJzcGFjZSB0byB0cmlnZ2VyIGNvZGVwYXRocyBjb250YWluaW5nIHRoZXNlCitjYWxscy4KKzwvcGFyYT4KKworPHBhcmE+CitBIG5ldyBmZWF0dXJlIG9mIGpiZCBzaW5jZSAyLjUuMjUgaXMgY29tbWl0IGNhbGxiYWNrcyB3aXRoIHRoZSBuZXcKK2pvdXJuYWxfY2FsbGJhY2tfc2V0KCkgZnVuY3Rpb24geW91IGNhbiBub3cgYXNrIHRoZSBqb3VybmFsbGluZyBsYXllcgordG8gY2FsbCB5b3UgYmFjayB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBmaW5hbGx5IGNvbW1pdHRlZCB0byBkaXNrLCBzbyB0aGF0Cit5b3UgY2FuIGRvIHNvbWUgb2YgeW91ciBvd24gbWFuYWdlbWVudC4gVGhlIGtleSB0byB0aGlzIGlzIHRoZSBqb3VybmFsX2NhbGxiYWNrCitzdHJ1Y3QsIHRoaXMgbWFpbnRhaW5zIHRoZSBpbnRlcm5hbCBjYWxsYmFjayBpbmZvcm1hdGlvbiBidXQgeW91IGNhbgorZXh0ZW5kIGl0IGxpa2UgdGhpczotCis8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CisJc3RydWN0ICBteWZzX2NhbGxiYWNrX3MgeworCQkvL0RhdGEgc3RydWN0dXJlIGVsZW1lbnQgcmVxdWlyZWQgYnkgamJkLi4KKwkJc3RydWN0IGpvdXJuYWxfY2FsbGJhY2sgZm9yX2piZDsKKwkJLy8gU3R1ZmYgZm9yIG15ZnMgYWxsb2NhdGVkIHRvZ2V0aGVyLgorCQlteWZzX2lub2RlKiAgICBpX2NvbW1pdGVkOworCisJfQorPC9wcm9ncmFtbGlzdGluZz4KKworPHBhcmE+Cit0aGlzIHdvdWxkIGJlIHVzZWZ1bCBpZiB5b3UgbmVlZGVkIHRvIGtub3cgd2hlbiBkYXRhIHdhcyBjb21taXR0ZWQgdG8gYQorcGFydGljdWxhciBpbm9kZS4KKzwvcGFyYT4KKworICAgIDwvc2VjdDI+CisKKyAgICA8c2VjdDI+CisgICAgIDx0aXRsZT5TdW1tYXJ5PC90aXRsZT4KKzxwYXJhPgorVXNpbmcgdGhlIGpvdXJuYWwgaXMgYSBtYXR0ZXIgb2Ygd3JhcHBpbmcgdGhlIGRpZmZlcmVudCBjb250ZXh0IGNoYW5nZXMsCitiZWluZyBlYWNoIG1vdW50LCBlYWNoIG1vZGlmaWNhdGlvbiAodHJhbnNhY3Rpb24pIGFuZCBlYWNoIGNoYW5nZWQgYnVmZmVyCit0byB0ZWxsIHRoZSBqb3VybmFsbGluZyBsYXllciBhYm91dCB0aGVtLgorPC9wYXJhPgorCis8cGFyYT4KK0hlcmUgaXMgYSBzb21lIHBzZXVkbyBjb2RlIHRvIGdpdmUgeW91IGFuIGlkZWEgb2YgaG93IGl0IHdvcmtzLCBhcworYW4gZXhhbXBsZS4KKzwvcGFyYT4KKworPHByb2dyYW1saXN0aW5nPgorICBqb3VybmFsX3QqIG15X2pucmwgPSBqb3VybmFsX2NyZWF0ZSgpOworICBqb3VybmFsX2luaXRfe2Rldixpbm9kZX0oam5ybCwuLi4pCisgIGlmIChjbGVhbikgam91cm5hbF93aXBlKCk7CisgIGpvdXJuYWxfbG9hZCgpOworCisgICBmb3JlYWNoKHRyYW5zYWN0aW9uKSB7IC8qdHJhbnNhY3Rpb25zIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzeXNjYWxsIHJldHVybnMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc3BhY2UqLworCisgICAgICAgICAgaGFuZGxlX3QgKiB4Y3Q9am91cm5hbF9zdGFydChteV9qbnJsKTsKKyAgICAgICAgICBmb3JlYWNoKGJoKSB7CisgICAgICAgICAgICAgICAgam91cm5hbF9nZXRfe2NyZWF0ZSx3cml0ZSx1bmRvfV9hY2Nlc3MoeGFjdCxiaCk7CisgICAgICAgICAgICAgICAgaWYgKCBteWZzX21vZGlmeShiaCkgKSB7IC8qIHJldHVybnMgdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1ha2VzIGNoYW5nZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWxfZGlydHlfe21ldGEsfWRhdGEoeGFjdCxiaCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWxfZm9yZ2V0KGJoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGpvdXJuYWxfc3RvcCh4Y3QpOworICAgfQorICAgam91cm5hbF9kZXN0cm95KG15X2pybmwpOworPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3NlY3QyPgorCisgICAgPC9zZWN0MT4KKworICAgIDxzZWN0MT4KKyAgICAgPHRpdGxlPkRhdGEgVHlwZXM8L3RpdGxlPgorICAgICA8cGFyYT4KKwlUaGUgam91cm5hbGxpbmcgbGF5ZXIgdXNlcyB0eXBlZGVmcyB0byAnaGlkZScgdGhlIGNvbmNyZXRlIGRlZmluaXRpb25zCisJb2YgdGhlIHN0cnVjdHVyZXMgdXNlZC4gQXMgYSBjbGllbnQgb2YgdGhlIEpCRCBsYXllciB5b3UgY2FuCisJanVzdCByZWx5IG9uIHRoZSB1c2luZyB0aGUgcG9pbnRlciBhcyBhIG1hZ2ljIGNvb2tpZSAgb2Ygc29tZSBzb3J0LgorCisJT2J2aW91c2x5IHRoZSBoaWRpbmcgaXMgbm90IGVuZm9yY2VkIGFzIHRoaXMgaXMgJ0MnLgorICAgICA8L3BhcmE+CisJPHNlY3QyPjx0aXRsZT5TdHJ1Y3R1cmVzPC90aXRsZT4KKyFJaW5jbHVkZS9saW51eC9qYmQuaAorCTwvc2VjdDI+CisgICAgPC9zZWN0MT4KKworICAgIDxzZWN0MT4KKyAgICAgPHRpdGxlPkZ1bmN0aW9uczwvdGl0bGU+CisgICAgIDxwYXJhPgorCVRoZSBmdW5jdGlvbnMgaGVyZSBhcmUgc3BsaXQgaW50byB0d28gZ3JvdXBzIHRob3NlIHRoYXQKKwlhZmZlY3QgYSBqb3VybmFsIGFzIGEgd2hvbGUsIGFuZCB0aG9zZSB3aGljaCBhcmUgdXNlZCB0bworCW1hbmFnZSB0cmFuc2FjdGlvbnMKKyAgICAgPC9wYXJhPgorCTxzZWN0Mj48dGl0bGU+Sm91cm5hbCBMZXZlbDwvdGl0bGU+CishRWZzL2piZC9qb3VybmFsLmMKKyFJZnMvamJkL3JlY292ZXJ5LmMKKwk8L3NlY3QyPgorCTxzZWN0Mj48dGl0bGU+VHJhbnNhc2N0aW9uIExldmVsPC90aXRsZT4KKyFFZnMvamJkL3RyYW5zYWN0aW9uLmMKKwk8L3NlY3QyPgorICAgIDwvc2VjdDE+CisgICAgPHNlY3QxPgorICAgICA8dGl0bGU+U2VlIGFsc288L3RpdGxlPgorCTxwYXJhPgorCSAgPGNpdGF0aW9uPgorCSAgIDx1bGluayB1cmw9ImZ0cDovL2Z0cC51ay5saW51eC5vcmcvcHViL2xpbnV4L3NjdC9mcy9qZnMvam91cm5hbC1kZXNpZ24ucHMuZ3oiPgorCSAgIAlKb3VybmFsaW5nIHRoZSBMaW51eCBleHQyZnMgRmlsZXN5c3RlbSwgTGludXhFeHBvIDk4LCBTdGVwaGVuIFR3ZWVkaWUKKwkgICA8L3VsaW5rPgorCSAgPC9jaXRhdGlvbj4KKwk8L3BhcmE+CisJPHBhcmE+CisJICAgPGNpdGF0aW9uPgorCSAgIDx1bGluayB1cmw9Imh0dHA6Ly9vbHN0cmFucy5zb3VyY2Vmb3JnZS5uZXQvcmVsZWFzZS9PTFMyMDAwLWV4dDMvT0xTMjAwMC1leHQzLmh0bWwiPgorCSAgIAlFeHQzIEpvdXJuYWxsaW5nIEZpbGVTeXN0ZW0sIE9MUyAyMDAwLCBEci4gU3RlcGhlbiBUd2VlZGllCisJICAgPC91bGluaz4KKwkgICA8L2NpdGF0aW9uPgorCTwvcGFyYT4KKyAgICA8L3NlY3QxPgorCisgIDwvY2hhcHRlcj4KKworPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2pvdXJuYWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3N2Y5YS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svam91cm5hbC1hcGkudG1wbAorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGJvb2sgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4iCi0JImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4xLjIvZG9jYm9va3guZHRkIiBbXT4KLQotPGJvb2sgaWQ9IkxpbnV4SkJEQVBJIj4KLSA8Ym9va2luZm8+Ci0gIDx0aXRsZT5UaGUgTGludXggSm91cm5hbGxpbmcgQVBJPC90aXRsZT4KLSAgPGF1dGhvcmdyb3VwPgotICA8YXV0aG9yPgotICAgICA8Zmlyc3RuYW1lPlJvZ2VyPC9maXJzdG5hbWU+Ci0gICAgIDxzdXJuYW1lPkdhbW1hbnM8L3N1cm5hbWU+Ci0gICAgIDxhZmZpbGlhdGlvbj4KLSAgICAgPGFkZHJlc3M+Ci0gICAgICA8ZW1haWw+cmdhbW1hbnNAY29tcHV0ZXItc3VyZ2VyeS5jby51azwvZW1haWw+Ci0gICAgIDwvYWRkcmVzcz4KLSAgICA8L2FmZmlsaWF0aW9uPgotICAgICA8L2F1dGhvcj4gCi0gIDwvYXV0aG9yZ3JvdXA+Ci0gIAotICA8YXV0aG9yZ3JvdXA+Ci0gICA8YXV0aG9yPgotICAgIDxmaXJzdG5hbWU+U3RlcGhlbjwvZmlyc3RuYW1lPgotICAgIDxzdXJuYW1lPlR3ZWVkaWU8L3N1cm5hbWU+Ci0gICAgPGFmZmlsaWF0aW9uPgotICAgICA8YWRkcmVzcz4KLSAgICAgIDxlbWFpbD5zY3RAcmVkaGF0LmNvbTwvZW1haWw+Ci0gICAgIDwvYWRkcmVzcz4KLSAgICA8L2FmZmlsaWF0aW9uPgotICAgPC9hdXRob3I+Ci0gIDwvYXV0aG9yZ3JvdXA+Ci0KLSAgPGNvcHlyaWdodD4KLSAgIDx5ZWFyPjIwMDI8L3llYXI+Ci0gICA8aG9sZGVyPlJvZ2VyIEdhbW1hbnM8L2hvbGRlcj4KLSAgPC9jb3B5cmlnaHQ+Ci0KLTxsZWdhbG5vdGljZT4KLSAgIDxwYXJhPgotICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgotICAgICB2ZXJzaW9uLgotICAgPC9wYXJhPgotICAgICAgCi0gICA8cGFyYT4KLSAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgPC9wYXJhPgotICAgICAgCi0gICA8cGFyYT4KLSAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgICAgTUEgMDIxMTEtMTMwNyBVU0EKLSAgIDwvcGFyYT4KLSAgICAgIAotICAgPHBhcmE+Ci0gICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQotICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCi0gICA8L3BhcmE+Ci0gIDwvbGVnYWxub3RpY2U+Ci0gPC9ib29raW5mbz4KLQotPHRvYz48L3RvYz4KLQotICA8Y2hhcHRlciBpZD0iT3ZlcnZpZXciPgotICAgICA8dGl0bGU+T3ZlcnZpZXc8L3RpdGxlPgotICA8c2VjdDE+Ci0gICAgIDx0aXRsZT5EZXRhaWxzPC90aXRsZT4KLTxwYXJhPgotVGhlIGpvdXJuYWxsaW5nIGxheWVyIGlzICBlYXN5IHRvIHVzZS4gWW91IG5lZWQgdG8gCi1maXJzdCBvZiBhbGwgY3JlYXRlIGEgam91cm5hbF90IGRhdGEgc3RydWN0dXJlLiBUaGVyZSBhcmUKLXR3byBjYWxscyB0byBkbyB0aGlzIGRlcGVuZGVudCBvbiBob3cgeW91IGRlY2lkZSB0byBhbGxvY2F0ZSB0aGUgcGh5c2ljYWwKLW1lZGlhIG9uIHdoaWNoIHRoZSBqb3VybmFsIHJlc2lkZXMuIFRoZSBqb3VybmFsX2luaXRfaW5vZGUoKSBjYWxsIAotaXMgZm9yIGpvdXJuYWxzIHN0b3JlZCBpbiBmaWxlc3lzdGVtIGlub2Rlcywgb3IgdGhlIGpvdXJuYWxfaW5pdF9kZXYoKQotY2FsbCBjYW4gYmUgdXNlIGZvciBqb3VybmFsIHN0b3JlZCBvbiBhIHJhdyBkZXZpY2UgKGluIGEgY29udGludW91cyByYW5nZSAKLW9mIGJsb2NrcykuIEEgam91cm5hbF90IGlzIGEgdHlwZWRlZiBmb3IgYSBzdHJ1Y3QgcG9pbnRlciwgc28gd2hlbgoteW91IGFyZSBmaW5hbGx5IGZpbmlzaGVkIG1ha2Ugc3VyZSB5b3UgY2FsbCBqb3VybmFsX2Rlc3Ryb3koKSBvbiBpdAotdG8gZnJlZSB1cCBhbnkgdXNlZCBrZXJuZWwgbWVtb3J5LgotPC9wYXJhPgotCi08cGFyYT4KLU9uY2UgeW91IGhhdmUgZ290IHlvdXIgam91cm5hbF90IG9iamVjdCB5b3UgbmVlZCB0byAnbW91bnQnIG9yIGxvYWQgdGhlIGpvdXJuYWwKLWZpbGUsIHVubGVzcyBvZiBjb3Vyc2UgeW91IGhhdmVuJ3QgaW5pdGlhbGlzZWQgaXQgeWV0IC0gaW4gd2hpY2ggY2FzZSB5b3UKLW5lZWQgdG8gY2FsbCBqb3VybmFsX2NyZWF0ZSgpLgotPC9wYXJhPgotCi08cGFyYT4KLU1vc3Qgb2YgdGhlIHRpbWUgaG93ZXZlciB5b3VyIGpvdXJuYWwgZmlsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGNyZWF0ZWQsIGJ1dAotYmVmb3JlIHlvdSBsb2FkIGl0IHlvdSBtdXN0IGNhbGwgam91cm5hbF93aXBlKCkgdG8gZW1wdHkgdGhlIGpvdXJuYWwgZmlsZS4KLUhhbmcgb24sIHlvdSBzYXkgLCB3aGF0IGlmIHRoZSBmaWxlc3lzdGVtIHdhc24ndCBjbGVhbmx5IHVtb3VudCgpJ2QgLiBXZWxsLCBpdCBpcyB0aGUgCi1qb2Igb2YgdGhlIGNsaWVudCBmaWxlIHN5c3RlbSB0byBkZXRlY3QgdGhpcyBhbmQgc2tpcCB0aGUgY2FsbCB0byBqb3VybmFsX3dpcGUoKS4KLTwvcGFyYT4KLQotPHBhcmE+Ci1JbiBlaXRoZXIgY2FzZSB0aGUgbmV4dCBjYWxsIHNob3VsZCBiZSB0byBqb3VybmFsX2xvYWQoKSB3aGljaCBwcmVwYXJlcyB0aGUKLWpvdXJuYWwgZmlsZSBmb3IgdXNlLiBOb3RlIHRoYXQgam91cm5hbF93aXBlKC4uLDApIGNhbGxzIGpvdXJuYWxfc2tpcF9yZWNvdmVyeSgpIAotZm9yIHlvdSBpZiBpdCBkZXRlY3RzIGFueSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgaW4gdGhlIGpvdXJuYWwgYW5kIHNpbWlsYXJseQotam91cm5hbF9sb2FkKCkgd2lsbCBjYWxsIGpvdXJuYWxfcmVjb3ZlcigpIGlmIG5lY2Vzc2FyeS4KLUkgd291bGQgYWR2aXNlIHJlYWRpbmcgZnMvZXh0My9zdXBlci5jIGZvciBleGFtcGxlcyBvbiB0aGlzIHN0YWdlLgotW1JHRzogV2h5IGlzIHRoZSBqb3VybmFsX3dpcGUoKSBjYWxsIG5lY2Vzc2FyeSAtIGRvZXNuJ3QgdGhpcyBuZWVkbGVzc2x5IAotY29tcGxpY2F0ZSB0aGUgQVBJLiBPciBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIGpvdXJuYWwgbGF5ZXIgdG8gaGlkZSAKLWRpcnR5IG1vdW50cyBmcm9tIHRoZSBjbGllbnQgZnNdCi08L3BhcmE+Ci0KLTxwYXJhPgotTm93IHlvdSBjYW4gZ28gYWhlYWQgYW5kIHN0YXJ0IG1vZGlmeWluZyB0aGUgdW5kZXJseWluZyAKLWZpbGVzeXN0ZW0uIEFsbW9zdC4KLTwvcGFyYT4KLQotCi08cGFyYT4KLQotWW91IHN0aWxsIG5lZWQgdG8gYWN0dWFsbHkgam91cm5hbCB5b3VyIGZpbGVzeXN0ZW0gY2hhbmdlcywgdGhpcwotaXMgZG9uZSBieSB3cmFwcGluZyB0aGVtIGludG8gdHJhbnNhY3Rpb25zLiBBZGRpdGlvbmFsbHkgeW91Ci1hbHNvIG5lZWQgdG8gd3JhcCB0aGUgbW9kaWZpY2F0aW9uIG9mIGVhY2ggb2YgdGhlIGJ1ZmZlcnMKLXdpdGggY2FsbHMgdG8gdGhlIGpvdXJuYWwgbGF5ZXIsIHNvIGl0IGtub3dzIHdoYXQgdGhlIG1vZGlmaWNhdGlvbnMKLXlvdSBhcmUgYWN0dWFsbHkgbWFraW5nIGFyZS4gVG8gZG8gdGhpcyB1c2UgIGpvdXJuYWxfc3RhcnQoKSB3aGljaAotcmV0dXJucyBhIHRyYW5zYWN0aW9uIGhhbmRsZS4KLTwvcGFyYT4KLQotPHBhcmE+Ci1qb3VybmFsX3N0YXJ0KCkKLWFuZCBpdHMgY291bnRlcnBhcnQgam91cm5hbF9zdG9wKCksIHdoaWNoIGluZGljYXRlcyB0aGUgZW5kIG9mIGEgdHJhbnNhY3Rpb24KLWFyZSBuZXN0YWJsZSBjYWxscywgc28geW91IGNhbiByZWVudGVyIGEgdHJhbnNhY3Rpb24gaWYgbmVjZXNzYXJ5LAotYnV0IHJlbWVtYmVyIHlvdSBtdXN0IGNhbGwgam91cm5hbF9zdG9wKCkgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzIGFzCi1qb3VybmFsX3N0YXJ0KCkgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZWQgKG9yIG1vcmUgYWNjdXJhdGVseQotbGVhdmVzIHRoZSB1cGRhdGUgcGhhc2UpLiBFeHQzL1ZGUyBtYWtlcyB1c2Ugb2YgdGhpcyBmZWF0dXJlIHRvIHNpbXBsaWZ5Ci1xdW90YSBzdXBwb3J0LgotPC9wYXJhPgotCi08cGFyYT4KLUluc2lkZSBlYWNoIHRyYW5zYWN0aW9uIHlvdSBuZWVkIHRvIHdyYXAgdGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlCi1pbmRpdmlkdWFsIGJ1ZmZlcnMgKGJsb2NrcykuIEJlZm9yZSB5b3Ugc3RhcnQgdG8gbW9kaWZ5IGEgYnVmZmVyIHlvdQotbmVlZCB0byBjYWxsIGpvdXJuYWxfZ2V0X3tjcmVhdGUsd3JpdGUsdW5kb31fYWNjZXNzKCkgYXMgYXBwcm9wcmlhdGUsCi10aGlzIGFsbG93cyB0aGUgam91cm5hbGxpbmcgbGF5ZXIgdG8gY29weSB0aGUgdW5tb2RpZmllZCBkYXRhIGlmIGl0Ci1uZWVkcyB0by4gQWZ0ZXIgYWxsIHRoZSBidWZmZXIgbWF5IGJlIHBhcnQgb2YgYSBwcmV2aW91c2x5IHVuY29tbWl0dGVkCi10cmFuc2FjdGlvbi4gCi1BdCB0aGlzIHBvaW50IHlvdSBhcmUgYXQgbGFzdCByZWFkeSB0byBtb2RpZnkgYSBidWZmZXIsIGFuZCBvbmNlCi15b3UgYXJlIGhhdmUgZG9uZSBzbyB5b3UgbmVlZCB0byBjYWxsIGpvdXJuYWxfZGlydHlfe21ldGEsfWRhdGEoKS4KLU9yIGlmIHlvdSd2ZSBhc2tlZCBmb3IgYWNjZXNzIHRvIGEgYnVmZmVyIHlvdSBub3cga25vdyBpcyBub3cgbG9uZ2VyIAotcmVxdWlyZWQgdG8gYmUgcHVzaGVkIGJhY2sgb24gdGhlIGRldmljZSB5b3UgY2FuIGNhbGwgam91cm5hbF9mb3JnZXQoKQotaW4gbXVjaCB0aGUgc2FtZSB3YXkgYXMgeW91IG1pZ2h0IGhhdmUgdXNlZCBiZm9yZ2V0KCkgaW4gdGhlIHBhc3QuCi08L3BhcmE+Ci0KLTxwYXJhPgotQSBqb3VybmFsX2ZsdXNoKCkgbWF5IGJlIGNhbGxlZCBhdCBhbnkgdGltZSB0byBjb21taXQgYW5kIGNoZWNrcG9pbnQKLWFsbCB5b3VyIHRyYW5zYWN0aW9ucy4KLTwvcGFyYT4KLQotPHBhcmE+Ci1UaGVuIGF0IHVtb3VudCB0aW1lICwgaW4geW91ciBwdXRfc3VwZXIoKSAoMi40KSBvciB3cml0ZV9zdXBlcigpICgyLjUpCi15b3UgY2FuIHRoZW4gY2FsbCBqb3VybmFsX2Rlc3Ryb3koKSB0byBjbGVhbiB1cCB5b3VyIGluLWNvcmUgam91cm5hbCBvYmplY3QuCi08L3BhcmE+Ci0KLQotPHBhcmE+Ci1VbmZvcnR1bmF0ZWx5IHRoZXJlIGEgY291cGxlIG9mIHdheXMgdGhlIGpvdXJuYWwgbGF5ZXIgY2FuIGNhdXNlIGEgZGVhZGxvY2suCi1UaGUgZmlyc3QgdGhpbmcgdG8gbm90ZSBpcyB0aGF0IGVhY2ggdGFzayBjYW4gb25seSBoYXZlCi1hIHNpbmdsZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbiBhdCBhbnkgb25lIHRpbWUsIHJlbWVtYmVyIG5vdGhpbmcKLWNvbW1pdHMgdW50aWwgdGhlIG91dGVybW9zdCBqb3VybmFsX3N0b3AoKS4gVGhpcyBtZWFucwoteW91IG11c3QgY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIGF0IHRoZSBlbmQgb2YgZWFjaCBmaWxlL2lub2RlL2FkZHJlc3MKLWV0Yy4gb3BlcmF0aW9uIHlvdSBwZXJmb3JtLCBzbyB0aGF0IHRoZSBqb3VybmFsbGluZyBzeXN0ZW0gaXNuJ3QgcmUtZW50ZXJlZAotb24gYW5vdGhlciBqb3VybmFsLiBTaW5jZSB0cmFuc2FjdGlvbnMgY2FuJ3QgYmUgbmVzdGVkL2JhdGNoZWQgCi1hY3Jvc3MgZGlmZmVyaW5nIGpvdXJuYWxzLCBhbmQgYW5vdGhlciBmaWxlc3lzdGVtIG90aGVyIHRoYW4KLXlvdXJzIChzYXkgZXh0MykgbWF5IGJlIG1vZGlmaWVkIGluIGEgbGF0ZXIgc3lzY2FsbC4KLTwvcGFyYT4KLQotPHBhcmE+Ci1UaGUgc2Vjb25kIGNhc2UgdG8gYmVhciBpbiBtaW5kIGlzIHRoYXQgam91cm5hbF9zdGFydCgpIGNhbiAKLWJsb2NrIGlmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSBpbiB0aGUgam91cm5hbCBmb3IgeW91ciB0cmFuc2FjdGlvbiAKLShiYXNlZCBvbiB0aGUgcGFzc2VkIG5ibG9ja3MgcGFyYW0pIC0gd2hlbiBpdCBibG9ja3MgaXQgbWVyZWx5KCEpIG5lZWRzIHRvCi13YWl0IGZvciB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYW5kIGJlIGNvbW1pdHRlZCBmcm9tIG90aGVyIHRhc2tzLCAKLXNvIGVzc2VudGlhbGx5IHdlIGFyZSB3YWl0aW5nIGZvciBqb3VybmFsX3N0b3AoKS4gU28gdG8gYXZvaWQgCi1kZWFkbG9ja3MgeW91IG11c3QgdHJlYXQgam91cm5hbF9zdGFydC9zdG9wKCkgYXMgaWYgdGhleQotd2VyZSBzZW1hcGhvcmVzIGFuZCBpbmNsdWRlIHRoZW0gaW4geW91ciBzZW1hcGhvcmUgb3JkZXJpbmcgcnVsZXMgdG8gcHJldmVudCAKLWRlYWRsb2Nrcy4gTm90ZSB0aGF0IGpvdXJuYWxfZXh0ZW5kKCkgaGFzIHNpbWlsYXIgYmxvY2tpbmcgYmVoYXZpb3VyIHRvCi1qb3VybmFsX3N0YXJ0KCkgc28geW91IGNhbiBkZWFkbG9jayBoZXJlIGp1c3QgYXMgZWFzaWx5IGFzIG9uIGpvdXJuYWxfc3RhcnQoKS4KLTwvcGFyYT4KLQotPHBhcmE+Ci1UcnkgdG8gcmVzZXJ2ZSB0aGUgcmlnaHQgbnVtYmVyIG9mIGJsb2NrcyB0aGUgZmlyc3QgdGltZS4gOy0pLiBUaGlzIHdpbGwKLWJlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgeW91IGFyZSBnb2luZyB0byB0b3VjaCBpbiB0aGlzIHRyYW5zYWN0aW9uLgotSSBhZHZpc2UgaGF2aW5nIGEgbG9vayBhdCBhdCBsZWFzdCBleHQzX2piZC5oIHRvIHNlZSB0aGUgYmFzaXMgb24gd2hpY2ggCi1leHQzIHVzZXMgdG8gbWFrZSB0aGVzZSBkZWNpc2lvbnMuCi08L3BhcmE+Ci0KLTxwYXJhPgotQW5vdGhlciB3cmlnZ2xlIHRvIHdhdGNoIG91dCBmb3IgaXMgeW91ciBvbi1kaXNrIGJsb2NrIGFsbG9jYXRpb24gc3RyYXRlZ3kuCi13aHk/IEJlY2F1c2UsIGlmIHlvdSB1bmRvIGEgZGVsZXRlLCB5b3UgbmVlZCB0byBlbnN1cmUgeW91IGhhdmVuJ3QgcmV1c2VkIGFueQotb2YgdGhlIGZyZWVkIGJsb2NrcyBpbiBhIGxhdGVyIHRyYW5zYWN0aW9uLiBPbmUgc2ltcGxlIHdheSBvZiBkb2luZyB0aGlzCi1pcyBtYWtlIHN1cmUgYW55IGJsb2NrcyB5b3UgYWxsb2NhdGUgb25seSBoYXZlIGNoZWNrcG9pbnRlZCB0cmFuc2FjdGlvbnMKLWxpc3RlZCBhZ2FpbnN0IHRoZW0uIEV4dDMgZG9lcyB0aGlzIGluIGV4dDNfdGVzdF9hbGxvY2F0YWJsZSgpLiAKLTwvcGFyYT4KLQotPHBhcmE+Ci1Mb2NrIGlzIGFsc28gcHJvdmlkaW5nIHRocm91Z2ggam91cm5hbF97dW4sfWxvY2tfdXBkYXRlcygpLAotZXh0MyB1c2VzIHRoaXMgd2hlbiBpdCB3YW50cyBhIHdpbmRvdyB3aXRoIGEgY2xlYW4gYW5kIHN0YWJsZSBmcyBmb3IgYSBtb21lbnQuCi1lZy4gCi08L3BhcmE+Ci0KLTxwcm9ncmFtbGlzdGluZz4KLQotCWpvdXJuYWxfbG9ja191cGRhdGVzKCkgLy9zdG9wIG5ldyBzdHVmZiBoYXBwZW5pbmcuLgotCWpvdXJuYWxfZmx1c2goKSAgICAgICAgLy8gY2hlY2twb2ludCBldmVyeXRoaW5nLgotCS4uZG8gc3R1ZmYgb24gc3RhYmxlIGZzCi0Jam91cm5hbF91bmxvY2tfdXBkYXRlcygpIC8vIGNhcnJ5IG9uIHdpdGggZmlsZXN5c3RlbSB1c2UuCi08L3Byb2dyYW1saXN0aW5nPgotCi08cGFyYT4KLVRoZSBvcHBvcnR1bml0aWVzIGZvciBhYnVzZSBhbmQgRE9TIGF0dGFja3Mgd2l0aCB0aGlzIHNob3VsZCBiZSBvYnZpb3VzLAotaWYgeW91IGFsbG93IHVucHJpdmlsZWdlZCB1c2Vyc3BhY2UgdG8gdHJpZ2dlciBjb2RlcGF0aHMgY29udGFpbmluZyB0aGVzZQotY2FsbHMuCi08L3BhcmE+Ci0KLTxwYXJhPgotQSBuZXcgZmVhdHVyZSBvZiBqYmQgc2luY2UgMi41LjI1IGlzIGNvbW1pdCBjYWxsYmFja3Mgd2l0aCB0aGUgbmV3Ci1qb3VybmFsX2NhbGxiYWNrX3NldCgpIGZ1bmN0aW9uIHlvdSBjYW4gbm93IGFzayB0aGUgam91cm5hbGxpbmcgbGF5ZXIKLXRvIGNhbGwgeW91IGJhY2sgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgZmluYWxseSBjb21taXR0ZWQgdG8gZGlzaywgc28gdGhhdAoteW91IGNhbiBkbyBzb21lIG9mIHlvdXIgb3duIG1hbmFnZW1lbnQuIFRoZSBrZXkgdG8gdGhpcyBpcyB0aGUgam91cm5hbF9jYWxsYmFjawotc3RydWN0LCB0aGlzIG1haW50YWlucyB0aGUgaW50ZXJuYWwgY2FsbGJhY2sgaW5mb3JtYXRpb24gYnV0IHlvdSBjYW4KLWV4dGVuZCBpdCBsaWtlIHRoaXM6LQotPC9wYXJhPgotPHByb2dyYW1saXN0aW5nPgotCXN0cnVjdCAgbXlmc19jYWxsYmFja19zIHsKLQkJLy9EYXRhIHN0cnVjdHVyZSBlbGVtZW50IHJlcXVpcmVkIGJ5IGpiZC4uCi0JCXN0cnVjdCBqb3VybmFsX2NhbGxiYWNrIGZvcl9qYmQ7Ci0JCS8vIFN0dWZmIGZvciBteWZzIGFsbG9jYXRlZCB0b2dldGhlci4KLQkJbXlmc19pbm9kZSogICAgaV9jb21taXRlZDsKLQkKLQl9Ci08L3Byb2dyYW1saXN0aW5nPgotCi08cGFyYT4KLXRoaXMgd291bGQgYmUgdXNlZnVsIGlmIHlvdSBuZWVkZWQgdG8ga25vdyB3aGVuIGRhdGEgd2FzIGNvbW1pdHRlZCB0byBhIAotcGFydGljdWxhciBpbm9kZS4KLTwvcGFyYT4KLQotPC9zZWN0MT4KLQotPHNlY3QxPgotPHRpdGxlPlN1bW1hcnk8L3RpdGxlPgotPHBhcmE+Ci1Vc2luZyB0aGUgam91cm5hbCBpcyBhIG1hdHRlciBvZiB3cmFwcGluZyB0aGUgZGlmZmVyZW50IGNvbnRleHQgY2hhbmdlcywKLWJlaW5nIGVhY2ggbW91bnQsIGVhY2ggbW9kaWZpY2F0aW9uICh0cmFuc2FjdGlvbikgYW5kIGVhY2ggY2hhbmdlZCBidWZmZXIKLXRvIHRlbGwgdGhlIGpvdXJuYWxsaW5nIGxheWVyIGFib3V0IHRoZW0uCi08L3BhcmE+Ci0KLTxwYXJhPgotSGVyZSBpcyBhIHNvbWUgcHNldWRvIGNvZGUgdG8gZ2l2ZSB5b3UgYW4gaWRlYSBvZiBob3cgaXQgd29ya3MsIGFzCi1hbiBleGFtcGxlLgotPC9wYXJhPgotCi08cHJvZ3JhbWxpc3Rpbmc+Ci0gIGpvdXJuYWxfdCogbXlfam5ybCA9IGpvdXJuYWxfY3JlYXRlKCk7Ci0gIGpvdXJuYWxfaW5pdF97ZGV2LGlub2RlfShqbnJsLC4uLikKLSAgaWYgKGNsZWFuKSBqb3VybmFsX3dpcGUoKTsKLSAgam91cm5hbF9sb2FkKCk7Ci0KLSAgIGZvcmVhY2godHJhbnNhY3Rpb24pIHsgLyp0cmFuc2FjdGlvbnMgbXVzdCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgYmVmb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzeXNjYWxsIHJldHVybnMgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNwYWNlKi8KLQotICAgICAgICAgIGhhbmRsZV90ICogeGN0PWpvdXJuYWxfc3RhcnQobXlfam5ybCk7Ci0gICAgICAgICAgZm9yZWFjaChiaCkgewotICAgICAgICAgICAgICAgIGpvdXJuYWxfZ2V0X3tjcmVhdGUsd3JpdGUsdW5kb31fYWNjZXNzKHhhY3QsYmgpOwotICAgICAgICAgICAgICAgIGlmICggbXlmc19tb2RpZnkoYmgpICkgeyAvKiByZXR1cm5zIHRydWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFrZXMgY2hhbmdlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgam91cm5hbF9kaXJ0eV97bWV0YSx9ZGF0YSh4YWN0LGJoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgam91cm5hbF9mb3JnZXQoYmgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgam91cm5hbF9zdG9wKHhjdCk7Ci0gICB9Ci0gICBqb3VybmFsX2Rlc3Ryb3kobXlfanJubCk7Ci08L3Byb2dyYW1saXN0aW5nPgotPC9zZWN0MT4KLQotPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJhZHQiPgotICAgICA8dGl0bGU+RGF0YSBUeXBlczwvdGl0bGU+Ci0gICAgIDxwYXJhPgkKLQlUaGUgam91cm5hbGxpbmcgbGF5ZXIgdXNlcyB0eXBlZGVmcyB0byAnaGlkZScgdGhlIGNvbmNyZXRlIGRlZmluaXRpb25zCi0Jb2YgdGhlIHN0cnVjdHVyZXMgdXNlZC4gQXMgYSBjbGllbnQgb2YgdGhlIEpCRCBsYXllciB5b3UgY2FuCi0JanVzdCByZWx5IG9uIHRoZSB1c2luZyB0aGUgcG9pbnRlciBhcyBhIG1hZ2ljIGNvb2tpZSAgb2Ygc29tZSBzb3J0LgotCQotCU9idmlvdXNseSB0aGUgaGlkaW5nIGlzIG5vdCBlbmZvcmNlZCBhcyB0aGlzIGlzICdDJy4KLQk8L3BhcmE+Ci0JPHNlY3QxPjx0aXRsZT5TdHJ1Y3R1cmVzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9qYmQuaAotCTwvc2VjdDE+Ci08L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9ImNhbGxzIj4KLSAgICAgPHRpdGxlPkZ1bmN0aW9uczwvdGl0bGU+Ci0gICAgIDxwYXJhPgkKLQlUaGUgZnVuY3Rpb25zIGhlcmUgYXJlIHNwbGl0IGludG8gdHdvIGdyb3VwcyB0aG9zZSB0aGF0Ci0JYWZmZWN0IGEgam91cm5hbCBhcyBhIHdob2xlLCBhbmQgdGhvc2Ugd2hpY2ggYXJlIHVzZWQgdG8KLQltYW5hZ2UgdHJhbnNhY3Rpb25zCi08L3BhcmE+Ci0JPHNlY3QxPjx0aXRsZT5Kb3VybmFsIExldmVsPC90aXRsZT4KLSFFZnMvamJkL2pvdXJuYWwuYwotIUlmcy9qYmQvcmVjb3ZlcnkuYwotCTwvc2VjdDE+Ci0JPHNlY3QxPjx0aXRsZT5UcmFuc2FzY3Rpb24gTGV2ZWw8L3RpdGxlPgotIUVmcy9qYmQvdHJhbnNhY3Rpb24uYwkKLQk8L3NlY3QxPgotPC9jaGFwdGVyPgotPGNoYXB0ZXI+Ci0gICAgIDx0aXRsZT5TZWUgYWxzbzwvdGl0bGU+Ci0JPHBhcmE+Ci0JPGNpdGF0aW9uPgotCSAgIDx1bGluayB1cmw9ImZ0cDovL2Z0cC51ay5saW51eC5vcmcvcHViL2xpbnV4L3NjdC9mcy9qZnMvam91cm5hbC1kZXNpZ24ucHMuZ3oiPgotCSAgIAlKb3VybmFsaW5nIHRoZSBMaW51eCBleHQyZnMgRmlsZXN5c3RlbSxMaW51eEV4cG8gOTgsIFN0ZXBoZW4gVHdlZWRpZQotCSAgIDwvdWxpbms+Ci0JICAgPC9jaXRhdGlvbj4KLQkgICA8L3BhcmE+Ci0JICAgPHBhcmE+Ci0JICAgPGNpdGF0aW9uPgotCSAgIDx1bGluayB1cmw9Imh0dHA6Ly9vbHN0cmFucy5zb3VyY2Vmb3JnZS5uZXQvcmVsZWFzZS9PTFMyMDAwLWV4dDMvT0xTMjAwMC1leHQzLmh0bWwiPgotCSAgIAlFeHQzIEpvdXJuYWxsaW5nIEZpbGVTeXN0ZW0gLCBPTFMgMjAwMCwgRHIuIFN0ZXBoZW4gVHdlZWRpZQotCSAgIDwvdWxpbms+Ci0JICAgPC9jaXRhdGlvbj4KLQkgICA8L3BhcmE+Ci08L2NoYXB0ZXI+Ci0KLTwvYm9vaz4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IDJiNWFjNjAuLjNmYTBjNGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtMTgyLDY2ICsxODIsNiBAQAogICAgICA8L3NlY3QxPgogICA8L2NoYXB0ZXI+CiAKLSAgPGNoYXB0ZXIgaWQ9InZmcyI+Ci0gICAgIDx0aXRsZT5UaGUgTGludXggVkZTPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5UaGUgRmlsZXN5c3RlbSB0eXBlczwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvZnMuaAotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPlRoZSBEaXJlY3RvcnkgQ2FjaGU8L3RpdGxlPgotIUVmcy9kY2FjaGUuYwotIUlpbmNsdWRlL2xpbnV4L2RjYWNoZS5oCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+SW5vZGUgSGFuZGxpbmc8L3RpdGxlPgotIUVmcy9pbm9kZS5jCi0hRWZzL2JhZF9pbm9kZS5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+UmVnaXN0cmF0aW9uIGFuZCBTdXBlcmJsb2NrczwvdGl0bGU+Ci0hRWZzL3N1cGVyLmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5GaWxlIExvY2tzPC90aXRsZT4KLSFFZnMvbG9ja3MuYwotIUlmcy9sb2Nrcy5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+T3RoZXIgRnVuY3Rpb25zPC90aXRsZT4KLSFFZnMvbXBhZ2UuYwotIUVmcy9uYW1laS5jCi0hRWZzL2J1ZmZlci5jCi0hRWZzL2Jpby5jCi0hRWZzL3NlcV9maWxlLmMKLSFFZnMvZmlsZXN5c3RlbXMuYwotIUVmcy9mcy13cml0ZWJhY2suYwotIUVmcy9ibG9ja19kZXYuYwotICAgICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InByb2MiPgotICAgICA8dGl0bGU+VGhlIHByb2MgZmlsZXN5c3RlbTwvdGl0bGU+Ci0gCi0gICAgIDxzZWN0MT48dGl0bGU+c3lzY3RsIGludGVyZmFjZTwvdGl0bGU+Ci0hRWtlcm5lbC9zeXNjdGwuYwotICAgICA8L3NlY3QxPgotCi0gICAgIDxzZWN0MT48dGl0bGU+cHJvYyBmaWxlc3lzdGVtIGludGVyZmFjZTwvdGl0bGU+Ci0hSWZzL3Byb2MvYmFzZS5jCi0gICAgIDwvc2VjdDE+Ci0gIDwvY2hhcHRlcj4KLQotICA8Y2hhcHRlciBpZD0ic3lzZnMiPgotICAgICA8dGl0bGU+VGhlIEZpbGVzeXN0ZW0gZm9yIEV4cG9ydGluZyBLZXJuZWwgT2JqZWN0czwvdGl0bGU+Ci0hRWZzL3N5c2ZzL2ZpbGUuYwotIUVmcy9zeXNmcy9zeW1saW5rLmMKLSFFZnMvc3lzZnMvYmluLmMKLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJkZWJ1Z2ZzIj4KLSAgICAgPHRpdGxlPlRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW08L3RpdGxlPgotIAotICAgICA8c2VjdDE+PHRpdGxlPmRlYnVnZnMgaW50ZXJmYWNlPC90aXRsZT4KLSFFZnMvZGVidWdmcy9pbm9kZS5jCi0hRWZzL2RlYnVnZnMvZmlsZS5jCi0gICAgIDwvc2VjdDE+Ci0gIDwvY2hhcHRlcj4KLQogICA8Y2hhcHRlciBpZD0icmVsYXlmcyI+CiAgICAgIDx0aXRsZT5yZWxheSBpbnRlcmZhY2Ugc3VwcG9ydDwvdGl0bGU+CiAKQEAgLTQ3OCw5ICs0MTgsMzUgQEAKICFJZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKICAgPC9jaGFwdGVyPgogCi0gIDxjaGFwdGVyIGlkPSJ2aWRkZXYiPgotICAgICA8dGl0bGU+VmlkZW80TGludXg8L3RpdGxlPgotIUVkcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKKyAgPGNoYXB0ZXIgaWQ9Im1lc3NhZ2VfZGV2aWNlcyI+CisJPHRpdGxlPk1lc3NhZ2UtYmFzZWQgZGV2aWNlczwvdGl0bGU+CisgICAgIDxzZWN0MT48dGl0bGU+RnVzaW9uIG1lc3NhZ2UgZGV2aWNlczwvdGl0bGU+CishRWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCishSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCishRWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYworIUlkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKyFJZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYworIUlkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCishSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYworIUlkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCisgICAgIDwvc2VjdDE+CisgICAgIDxzZWN0MT48dGl0bGU+STJPIG1lc3NhZ2UgZGV2aWNlczwvdGl0bGU+CishSWluY2x1ZGUvbGludXgvaTJvLmgKKyFJZHJpdmVycy9tZXNzYWdlL2kyby9jb3JlLmgKKyFFZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYworIUlkcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCishSWRyaXZlcnMvbWVzc2FnZS9pMm8vY29uZmlnLW9zbS5jCishRWRyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYworIUlkcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKKyFJZHJpdmVycy9tZXNzYWdlL2kyby9idXMtb3NtLmMKKyFFZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYworIUlkcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCishSWRyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKKyFJZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYworIUlkcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCishSWRyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYworIUlkcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMKKyAgICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgogCiAgIDxjaGFwdGVyIGlkPSJzbmRkZXYiPgpAQCAtNTkzLDQgKzU1OSwxMiBAQAogLS0+CiAgICAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlciBpZD0iaW5wdXRfc3Vic3lzdGVtIj4KKyAgICAgPHRpdGxlPklucHV0IFN1YnN5c3RlbTwvdGl0bGU+CishSWluY2x1ZGUvbGludXgvaW5wdXQuaAorIUVkcml2ZXJzL2lucHV0L2lucHV0LmMKKyFFZHJpdmVycy9pbnB1dC9mZi1jb3JlLmMKKyFFZHJpdmVycy9pbnB1dC9mZi1tZW1sZXNzLmMKKyAgPC9jaGFwdGVyPgogPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmdfdXNiX2RyaXZlci50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3dyaXRpbmdfdXNiX2RyaXZlci50bXBsCmluZGV4IDA3Y2QzNGMuLmQ0MTg4ZDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay93cml0aW5nX3VzYl9kcml2ZXIudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svd3JpdGluZ191c2JfZHJpdmVyLnRtcGwKQEAgLTM0NSw4ICszNDUsNyBAQAogICAgICAgICB1c2JfYnVmZmVyX2ZyZWUgKGRldi0+dWRldiwgZGV2LT5idWxrX291dF9zaXplLAogICAgICAgICAgICAgZGV2LT5idWxrX291dF9idWZmZXIsCiAgICAgICAgICAgICBkZXYtPndyaXRlX3VyYi0+dHJhbnNmZXJfZG1hKTsKLSAgICBpZiAoZGV2LT53cml0ZV91cmIgIT0gTlVMTCkKLSAgICAgICAgdXNiX2ZyZWVfdXJiIChkZXYtPndyaXRlX3VyYik7CisgICAgdXNiX2ZyZWVfdXJiIChkZXYtPndyaXRlX3VyYik7CiAgICAga2ZyZWUgKGRldik7CiB9CiAgIDwvcHJvZ3JhbWxpc3Rpbmc+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0hPV1RPIGIvRG9jdW1lbnRhdGlvbi9IT1dUTwppbmRleCBkNmYzZGQxLi44ZDUxYzE0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0hPV1RPCisrKyBiL0RvY3VtZW50YXRpb24vSE9XVE8KQEAgLTM5NSw2ICszOTUsMjYgQEAKIAogCiAKK01hbmFnaW5nIGJ1ZyByZXBvcnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGJlc3Qgd2F5cyB0byBwdXQgaW50byBwcmFjdGljZSB5b3VyIGhhY2tpbmcgc2tpbGxzIGlzIGJ5IGZpeGluZworYnVncyByZXBvcnRlZCBieSBvdGhlciBwZW9wbGUuIE5vdCBvbmx5IHlvdSB3aWxsIGhlbHAgdG8gbWFrZSB0aGUga2VybmVsCittb3JlIHN0YWJsZSwgeW91J2xsIGxlYXJuIHRvIGZpeCByZWFsIHdvcmxkIHByb2JsZW1zIGFuZCB5b3Ugd2lsbCBpbXByb3ZlCit5b3VyIHNraWxscywgYW5kIG90aGVyIGRldmVsb3BlcnMgd2lsbCBiZSBhd2FyZSBvZiB5b3VyIHByZXNlbmNlLiBGaXhpbmcKK2J1Z3MgaXMgb25lIG9mIHRoZSBiZXN0IHdheXMgdG8gZ2V0IG1lcml0cyBhbW9uZyBvdGhlciBkZXZlbG9wZXJzLCBiZWNhdXNlCitub3QgbWFueSBwZW9wbGUgbGlrZSB3YXN0aW5nIHRpbWUgZml4aW5nIG90aGVyIHBlb3BsZSdzIGJ1Z3MuCisKK1RvIHdvcmsgaW4gdGhlIGFscmVhZHkgcmVwb3J0ZWQgYnVnIHJlcG9ydHMsIGdvIHRvIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnLgorSWYgeW91IHdhbnQgdG8gYmUgYWR2aXNlZCBvZiB0aGUgZnV0dXJlIGJ1ZyByZXBvcnRzLCB5b3UgY2FuIHN1YnNjcmliZSB0byB0aGUKK2J1Z21lLW5ldyBtYWlsaW5nIGxpc3QgKG9ubHkgbmV3IGJ1ZyByZXBvcnRzIGFyZSBtYWlsZWQgaGVyZSkgb3IgdG8gdGhlCitidWdtZS1qYW5pdG9yIG1haWxpbmcgbGlzdCAoZXZlcnkgY2hhbmdlIGluIHRoZSBidWd6aWxsYSBpcyBtYWlsZWQgaGVyZSkKKworCWh0dHA6Ly9saXN0cy5vc2RsLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLW5ldworCWh0dHA6Ly9saXN0cy5vc2RsLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLWphbml0b3JzCisKKworCiBNYWlsaW5nIGxpc3RzCiAtLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vSVBNSS50eHQgYi9Eb2N1bWVudGF0aW9uL0lQTUkudHh0CmluZGV4IDBlMzkyNGUuLjI0ZGMzZmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vSVBNSS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9JUE1JLnR4dApAQCAtMzY1LDYgKzM2NSw3IEBACiAgICAgICAgcmVnc2hpZnRzPTxzaGlmdDE+LDxzaGlmdDI+LC4uLgogICAgICAgIHNsYXZlX2FkZHJzPTxhZGRyMT4sPGFkZHIyPiwuLi4KICAgICAgICBmb3JjZV9raXBtaWQ9PGVuYWJsZTE+LDxlbmFibGUyPiwuLi4KKyAgICAgICB1bmxvYWRfd2hlbl9lbXB0eT1bMHwxXQogCiBFYWNoIG9mIHRoZXNlIGV4Y2VwdCBzaV90cnlkZWZhdWx0cyBpcyBhIGxpc3QsIHRoZSBmaXJzdCBpdGVtIGZvciB0aGUKIGZpcnN0IGludGVyZmFjZSwgc2Vjb25kIGl0ZW0gZm9yIHRoZSBzZWNvbmQgaW50ZXJmYWNlLCBldGMuCkBAIC00MTYsNiArNDE3LDExIEBACiBvciB1c2VycyB0aGF0IGRvbid0IHdhbnQgdGhlIGRhZW1vbiAoZG9uJ3QgbmVlZCB0aGUgcGVyZm9ybWFuY2UsIGRvbid0CiB3YW50IHRoZSBDUFUgaGl0KSBjYW4gZGlzYWJsZSBpdC4KIAorSWYgdW5sb2FkX3doZW5fZW1wdHkgaXMgc2V0IHRvIDEsIHRoZSBkcml2ZXIgd2lsbCBiZSB1bmxvYWRlZCBpZiBpdAorZG9lc24ndCBmaW5kIGFueSBpbnRlcmZhY2VzIG9yIGFsbCB0aGUgaW50ZXJmYWNlcyBmYWlsIHRvIHdvcmsuICBUaGUKK2RlZmF1bHQgaXMgb25lLiAgU2V0dGluZyB0byAwIGlzIHVzZWZ1bCB3aXRoIHRoZSBob3Rtb2QsIGJ1dCBpcworb2J2aW91c2x5IG9ubHkgdXNlZnVsIGZvciBtb2R1bGVzLgorCiBXaGVuIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgdGhlIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUKIGtlcm5lbCBjb21tYW5kIGxpbmUgYXM6CiAKQEAgLTQ0MSw2ICs0NDcsMjUgQEAKIGludGVycnVwdHMgZW5hYmxlZCwgdGhlIGRyaXZlciB3aWxsIHJ1biBWRVJZIHNsb3dseS4gIERvbid0IGJsYW1lIG1lLAogdGhlc2UgaW50ZXJmYWNlcyBzdWNrLgogCitUaGUgZHJpdmVyIHN1cHBvcnRzIGEgaG90IGFkZCBhbmQgcmVtb3ZlIG9mIGludGVyZmFjZXMuICBUaGlzIHdheSwKK2ludGVyZmFjZXMgY2FuIGJlIGFkZGVkIG9yIHJlbW92ZWQgYWZ0ZXIgdGhlIGtlcm5lbCBpcyB1cCBhbmQgcnVubmluZy4KK1RoaXMgaXMgZG9uZSB1c2luZyAvc3lzL21vZHVsZXMvaXBtaV9zaS9ob3Rtb2QsIHdoaWNoIGlzIGEgd3JpdGUtb25seQorcGFyYW1ldGVyLiAgWW91IHdyaXRlIGEgc3RyaW5nIHRvIHRoaXMgaW50ZXJmYWNlLiAgVGhlIHN0cmluZyBoYXMgdGhlCitmb3JtYXQ6CisgICA8b3AxPls6b3AyWzpvcDMuLi5dXQorVGhlICJvcCJzIGFyZToKKyAgIGFkZHxyZW1vdmUsa2NzfGJ0fHNtaWMsbWVtfGkvbyw8YWRkcmVzcz5bLDxvcHQxPlssPG9wdDI+WywuLi5dXV0KK1lvdSBjYW4gc3BlY2lmeSBtb3JlIHRoYW4gb25lIGludGVyZmFjZSBvbiB0aGUgbGluZS4gIFRoZSAib3B0InMgYXJlOgorICAgcnNwPTxyZWdzcGFjaW5nPgorICAgcnNpPTxyZWdzaXplPgorICAgcnNoPTxyZWdzaGlmdD4KKyAgIGlycT08aXJxPgorICAgaXBtYj08aXBtYiBzbGF2ZSBhZGRyPgorYW5kIHRoZXNlIGhhdmUgdGhlIHNhbWUgbWVhbmluZ3MgYXMgZGlzY3Vzc2VkIGFib3ZlLiAgTm90ZSB0aGF0IHlvdQorY2FuIGFsc28gdXNlIHRoaXMgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgZm9yIGEgbW9yZSBjb21wYWN0IGZvcm1hdAorZm9yIHNwZWNpZnlpbmcgYW4gaW50ZXJmYWNlLiAgTm90ZSB0aGF0IHdoZW4gcmVtb3ZpbmcgYW4gaW50ZXJmYWNlLAorb25seSB0aGUgZmlyc3QgdGhyZWUgcGFyYW1ldGVycyAoc2kgdHlwZSwgYWRkcmVzcyB0eXBlLCBhbmQgYWRkcmVzcykKK2FyZSB1c2VkIGZvciB0aGUgY29tcGFyaXNvbi4gIEFueSBvcHRpb25zIGFyZSBpZ25vcmVkIGZvciByZW1vdmluZy4KIAogVGhlIFNNQnVzIERyaXZlcgogLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTAyLDcgKzUyNywxMCBAQAogCiAgIG1vZHByb2JlIGlwbWlfd2F0Y2hkb2cgdGltZW91dD08dD4gcHJldGltZW91dD08dD4gYWN0aW9uPTxhY3Rpb24gdHlwZT4KICAgICAgIHByZWFjdGlvbj08cHJlYWN0aW9uIHR5cGU+IHByZW9wPTxwcmVvcCB0eXBlPiBzdGFydF9ub3c9eAotICAgICAgbm93YXlvdXQ9eAorICAgICAgbm93YXlvdXQ9eCBpZm51bV90b191c2U9bgorCitpZm51bV90b191c2Ugc3BlY2lmaWVzIHdoaWNoIGludGVyZmFjZSB0aGUgd2F0Y2hkb2cgdGltZXIgc2hvdWxkIHVzZS4KK1RoZSBkZWZhdWx0IGlzIC0xLCB3aGljaCBtZWFucyB0byBwaWNrIHRoZSBmaXJzdCBvbmUgcmVnaXN0ZXJlZC4KIAogVGhlIHRpbWVvdXQgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHRoZSBhY3Rpb24sIGFuZCB0aGUgcHJldGltZW91dAogaXMgdGhlIGFtb3VudCBvZiBzZWNvbmRzIGJlZm9yZSB0aGUgcmVzZXQgdGhhdCB0aGUgcHJlLXRpbWVvdXQgcGFuaWMgd2lsbApAQCAtNjI0LDUgKzY1Miw5IEBACiBpbiAvcHJvYy9zeXMvZGV2L2lwbWkvcG93ZXJvZmZfcG93ZXJjeWNsZS4gIE5vdGUgdGhhdCBpZiB0aGUgc3lzdGVtCiBkb2VzIG5vdCBzdXBwb3J0IHBvd2VyIGN5Y2xpbmcsIGl0IHdpbGwgYWx3YXlzIGRvIHRoZSBwb3dlciBvZmYuCiAKK1RoZSAiaWZudW1fdG9fdXNlIiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoaWNoIGludGVyZmFjZSB0aGUgcG93ZXJvZmYKK2NvZGUgc2hvdWxkIHVzZS4gIFRoZSBkZWZhdWx0IGlzIC0xLCB3aGljaCBtZWFucyB0byBwaWNrIHRoZSBmaXJzdCBvbmUKK3JlZ2lzdGVyZWQuCisKIE5vdGUgdGhhdCBpZiB5b3UgaGF2ZSBBQ1BJIGVuYWJsZWQsIHRoZSBzeXN0ZW0gd2lsbCBwcmVmZXIgdXNpbmcgQUNQSSB0bwogcG93ZXIgb2ZmLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9NU0ktSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi9NU0ktSE9XVE8udHh0CmluZGV4IGM3MDMwNmEuLmQzODkzODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL01TSS1IT1dUTy50eHQKQEAgLTIxOSw3ICsyMTksNyBAQAogTm90ZSB0aGF0IHRoZSBwcmUtYXNzaWduZWQgSU9BUElDIGRldi0+aXJxIGlzIHZhbGlkIG9ubHkgaWYgdGhlIGRldmljZQogb3BlcmF0ZXMgaW4gUElOLUlSUSBhc3NlcnRpb24gbW9kZS4gSW4gTVNJLVggbW9kZSwgYW55IGF0dGVtcHQgYXQKIHVzaW5nIGRldi0+aXJxIGJ5IHRoZSBkZXZpY2UgZHJpdmVyIHRvIHJlcXVlc3QgZm9yIGludGVycnVwdCBzZXJ2aWNlCi1tYXkgcmVzdWx0IHVucHJlZGljdGFiZSBiZWhhdmlvci4KK21heSByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBiZWhhdmlvci4KIAogRm9yIGVhY2ggTVNJLVggdmVjdG9yIGdyYW50ZWQsIGEgZGV2aWNlIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZwogb3RoZXIgZnVuY3Rpb25zIGxpa2UgcmVxdWVzdF9pcnEoKSwgZW5hYmxlX2lycSgpLCBldGMuIHRvIGVuYWJsZQpAQCAtNDcwLDcgKzQ3MCw2OCBAQAogRVJSOiAgICAgICAgICAwCiBNSVM6ICAgICAgICAgIDAKIAotNi4gRkFRCis2LiBNU0kgcXVpcmtzCisKK1NldmVyYWwgUENJIGNoaXBzZXRzIG9yIGRldmljZXMgYXJlIGtub3duIHRvIG5vdCBzdXBwb3J0IE1TSS4KK1RoZSBQQ0kgc3RhY2sgcHJvdmlkZXMgMyBwb3NzaWJsZSBsZXZlbHMgb2YgTVNJIGRpc2FibGluZzoKKyogb24gYSBzaW5nbGUgZGV2aWNlCisqIG9uIGFsbCBkZXZpY2VzIGJlaGluZCBhIHNwZWNpZmljIGJyaWRnZQorKiBnbG9iYWxseQorCis2LjEuIERpc2FibGluZyBNU0kgb24gYSBzaW5nbGUgZGV2aWNlCisKK1VuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcywgaXQgbWlnaHQgYmUgcmVxdWlyZWQgdG8gZGlzYWJsZSBNU0kgb24gYQorc2luZ2xlIGRldmljZSwgSXQgbWF5IGJlIGFjaGl2ZWQgYnkgZWl0aGVyIG5vdCBjYWxsaW5nIHBjaV9lbmFibGVfbXNpKCkKK29yIGFsbCwgb3Igc2V0dGluZyB0aGUgcGNpX2Rldi0+bm9fbXNpIGZsYWcgYmVmb3JlIChtb3N0IG9mIHRoZSB0aW1lCitpbiBhIHF1aXJrKS4KKworNi4yLiBEaXNhYmxpbmcgTVNJIGJlbG93IGEgYnJpZGdlCisKK1RoZSB2YXN0IG1ham9yaXR5IG9mIE1TSSBxdWlya3MgYXJlIHJlcXVpcmVkIGJ5IFBDSSBicmlkZ2VzIG5vdAorYmVpbmcgYWJsZSB0byByb3V0ZSBNU0kgYmV0d2VlbiBidXNzZXMuIEluIHRoaXMgY2FzZSwgTVNJIGhhdmUgdG8gYmUKK2Rpc2FibGVkIG9uIGFsbCBkZXZpY2VzIGJlaGluZCB0aGlzIGJyaWRnZS4gSXQgaXMgYWNoaWV2ZXMgYnkgc2V0dGluZwordGhlIFBDSV9CVVNfRkxBR1NfTk9fTVNJIGZsYWcgaW4gdGhlIHBjaV9idXMtPmJ1c19mbGFncyBvZiB0aGUgYnJpZGdlCitzdWJvcmRpbmF0ZSBidXMuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IHRoZSBzYW1lIGZsYWcgb24gYnJpZGdlcyB0aGF0CithcmUgYmVsb3cgdGhlIGJyb2tlbiBicmlnZGUuIFdoZW4gcGNpX2VuYWJsZV9tc2koKSBpcyBjYWxsZWQgdG8gZW5hYmxlCitNU0kgb24gYSBkZXZpY2UsIHBjaV9tc2lfc3VwcG9ydGVkKCkgdGFrZXMgY2FyZSBvZiBjaGVja2luZyB0aGUgTk9fTVNJCitmbGFnIGluIGFsbCBwYXJlbnQgYnVzc2VzIG9mIHRoZSBkZXZpY2UuCisKK1NvbWUgYnJpZGdlcyBhY3R1YWxseSBzdXBwb3J0IGR5bmFtaWMgTVNJIHN1cHBvcnQgZW5hYmxpbmcvZGlzYWJsaW5nCitieSBjaGFuZ2luZyBzb21lIGJpdHMgaW4gdGhlaXIgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgKGVzcGVjaWFsbHkKK3RoZSBIeXBlcnRyYW5zcG9ydCBjaGlwc2V0cyBzdWNoIGFzIHRoZSBuVmlkaWEgbkZvcmNlIGFuZCBTZXJ2ZXJ3b3JrcworSFQyMDAwKS4gSXQgbWF5IHRoZW4gYmUgcmVxdWlyZWQgdG8gdXBkYXRlIHRoZSBOT19NU0kgZmxhZyBvbiB0aGUKK2NvcnJlc3BvbmRpbmcgZGV2aWNlcyBpbiB0aGUgc3lzZnMgaGllcmFyY2h5LiBUbyBlbmFibGUgTVNJIHN1cHBvcnQKK29uIGRldmljZSAiMDAwMDowMDowZSIsIGRvOgorCisJZWNobyAxID4gL3N5cy9idXMvcGNpL2RldmljZXMvMDAwMDowMDowZS9tc2lfYnVzCisKK1RvIGRpc2FibGUgTVNJIHN1cHBvcnQsIGVjaG8gMCBpbnN0ZWFkIG9mIDEuIE5vdGUgdGhhdCBpdCBzaG91bGQgYmUKK3VzZWQgd2l0aCBjYXV0aW9uIHNpbmNlIGNoYW5naW5nIHRoaXMgdmFsdWUgbWlnaHQgYnJlYWsgaW50ZXJydXB0cy4KKworNi4zLiBEaXNhYmxpbmcgTVNJIGdsb2JhbGx5CisKK1NvbWUgZXh0cmVtZSBjYXNlcyBtYXkgcmVxdWlyZSB0byBkaXNhYmxlIE1TSSBnbG9iYWxseSBvbiB0aGUgc3lzdGVtLgorRm9yIG5vdywgdGhlIG9ubHkga25vd24gY2FzZSBpcyBhIFNlcnZlcndvcmtzIFBDSS1YIGNoaXBzZXRzIChNU0kgYXJlCitub3Qgc3VwcG9ydGVkIG9uIHNldmVyYWwgYnVzc2VzIHRoYXQgYXJlIG5vdCBhbGwgY29ubmVjdGVkIHRvIHRoZQorY2hpcHNldCBpbiB0aGUgTGludXggUENJIGhpZXJhcmNoeSkuIEluIHRoZSB2YXN0IG1ham9yaXR5IG9mIG90aGVyCitjYXNlcywgZGlzYWJsaW5nIG9ubHkgYmVoaW5kIGEgc3BlY2lmaWMgYnJpZGdlIGlzIGVub3VnaC4KKworRm9yIGRlYnVnZ2luZyBwdXJwb3NlLCB0aGUgdXNlciBtYXkgYWxzbyBwYXNzIHBjaT1ub21zaSBvbiB0aGUga2VybmVsCitjb21tYW5kLWxpbmUgdG8gZXhwbGljaXRseSBkaXNhYmxlIE1TSSBnbG9iYWxseS4gQnV0LCBvbmNlIHRoZSBhcHByby0KK3ByaWF0ZSBxdWlya3MgYXJlIGFkZGVkIHRvIHRoZSBrZXJuZWwsIHRoaXMgb3B0aW9uIHNob3VsZCBub3QgYmUKK3JlcXVpcmVkIGFueW1vcmUuCisKKzYuNC4gRmluZGluZyB3aHkgTVNJIGNhbm5vdCBiZSBlbmFibGVkIG9uIGEgZGV2aWNlCisKK0Fzc3VtaW5nIHRoYXQgTVNJIGFyZSBub3QgZW5hYmxlZCBvbiBhIGRldmljZSwgeW91IHNob3VsZCBsb29rIGF0CitkbWVzZyB0byBmaW5kIG1lc3NhZ2VzIHRoYXQgcXVpcmtzIG1heSBvdXRwdXQgd2hlbiBkaXNhYmxpbmcgTVNJCitvbiBzb21lIGRldmljZXMsIHNvbWUgYnJpZGdlcyBvciBldmVuIGdsb2JhbGx5LgorVGhlbiwgbHNwY2kgLXQgZ2l2ZXMgdGhlIGxpc3Qgb2YgYnJpZGdlcyBhYm92ZSBhIGRldmljZS4gUmVhZGluZworL3N5cy9idXMvcGNpL2RldmljZXMvMDAwMDowMDowZS9tc2lfYnVzIHdpbGwgdGVsbCB5b3Ugd2hldGhlciBNU0kKK2FyZSBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMCkuIEluIDAgaXMgZm91bmQgaW4gYSBzaW5nbGUgYnJpZGdlCittc2lfYnVzIGZpbGUgYWJvdmUgdGhlIGRldmljZSwgTVNJIGNhbm5vdCBiZSBlbmFibGVkLgorCis3LiBGQVEKIAogUTEuIEFyZSB0aGVyZSBhbnkgbGltaXRhdGlvbnMgb24gdXNpbmcgdGhlIE1TST8KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdAppbmRleCA3YWM2MWY2Li4yMjcwZWZhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdAorKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdApAQCAtNjYsMyArNjYsOSBAQAogICAgIFNlZSBEb2N1bWVudGF0aW9uL0FCSS9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIDIwOiBDaGVjayB0aGF0IGl0IGFsbCBwYXNzZXMgYG1ha2UgaGVhZGVyc19jaGVjaycuCisKKzIxOiBIYXMgYmVlbiBjaGVja2VkIHdpdGggaW5qZWN0aW9uIG9mIGF0IGxlYXN0IHNsYWIgYW5kIHBhZ2UtYWxsb2NhdGlvbgorICAgIGZhdWlsdXJlcy4gIFNlZSBEb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi8uCisKKyAgICBJZiB0aGUgbmV3IGNvZGUgaXMgc3Vic3RhbnRpYWwsIGFkZGl0aW9uIG9mIHN1YnN5c3RlbS1zcGVjaWZpYyBmYXVsdAorICAgIGluamVjdGlvbiBtaWdodCBiZSBhcHByb3ByaWF0ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYyBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYwppbmRleCBiMTE3OTJhLi5lOTEyNmU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMKKysrIGIvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jCkBAIC03LDYgKzcsOCBAQAogICogQ29weXJpZ2h0IChDKSBCYWxiaXIgU2luZ2gsIElCTSBDb3JwLiAyMDA2CiAgKiBDb3B5cmlnaHQgKGMpIEpheSBMYW4sIFNHSS4gMjAwNgogICoKKyAqIENvbXBpbGUgd2l0aAorICoJZ2NjIC1JL3Vzci9zcmMvbGludXgvaW5jbHVkZSBnZXRkZWxheXMuYyAtbyBnZXRkZWxheXMKICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTM1LDEzICszNywyMCBAQAogI2RlZmluZSBOTEFfREFUQShuYSkJCSgodm9pZCAqKSgoY2hhciopKG5hKSArIE5MQV9IRFJMRU4pKQogI2RlZmluZSBOTEFfUEFZTE9BRChsZW4pCShsZW4gLSBOTEFfSERSTEVOKQogCi0jZGVmaW5lIGVycihjb2RlLCBmbXQsIGFyZy4uLikgZG8geyBwcmludGYoZm10LCAjI2FyZyk7IGV4aXQoY29kZSk7IH0gd2hpbGUgKDApCi1pbnQgZG9uZSA9IDA7Ci1pbnQgcmN2YnVmc3o9MDsKKyNkZWZpbmUgZXJyKGNvZGUsIGZtdCwgYXJnLi4uKQkJCVwKKwlkbyB7CQkJCQlcCisJCWZwcmludGYoc3RkZXJyLCBmbXQsICMjYXJnKTsJXAorCQlleGl0KGNvZGUpOwkJCVwKKwl9IHdoaWxlICgwKQogCi0gICAgY2hhciBuYW1lWzEwMF07Ci1pbnQgZGJnPTAsIHByaW50X2RlbGF5cz0wOworaW50IGRvbmU7CitpbnQgcmN2YnVmc3o7CitjaGFyIG5hbWVbMTAwXTsKK2ludCBkYmc7CitpbnQgcHJpbnRfZGVsYXlzOworaW50IHByaW50X2lvX2FjY291bnRpbmc7CiBfX3U2NCBzdGltZSwgdXRpbWU7CisKICNkZWZpbmUgUFJJTlRGKGZtdCwgYXJnLi4uKSB7CQkJXAogCSAgICBpZiAoZGJnKSB7CQkJCVwKIAkJcHJpbnRmKGZtdCwgIyNhcmcpOwkJXApAQCAtNDksNyArNTgsNyBAQAogCX0KIAogLyogTWF4aW11bSBzaXplIG9mIHJlc3BvbnNlIHJlcXVlc3RlZCBvciBtZXNzYWdlIHNlbnQgKi8KLSNkZWZpbmUgTUFYX01TR19TSVpFCTI1NgorI2RlZmluZSBNQVhfTVNHX1NJWkUJMTAyNAogLyogTWF4aW11bSBudW1iZXIgb2YgY3B1cyBleHBlY3RlZCB0byBiZSBzcGVjaWZpZWQgaW4gYSBjcHVtYXNrICovCiAjZGVmaW5lIE1BWF9DUFVTCTMyCiAvKiBNYXhpbXVtIGxlbmd0aCBvZiBwYXRobmFtZSB0byBsb2cgZmlsZSAqLwpAQCAtNzgsOCArODcsOSBAQAogCWlmIChyY3ZidWZzeikKIAkJaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKIAkJCQkmcmN2YnVmc3osIHNpemVvZihyY3ZidWZzeikpIDwgMCkgewotCQkJcHJpbnRmKCJVbmFibGUgdG8gc2V0IHNvY2tldCByY3YgYnVmIHNpemUgdG8gJWRcbiIsCi0JCQkgICAgICAgcmN2YnVmc3opOworCQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc2V0IHNvY2tldCByY3YgYnVmIHNpemUgIgorCQkJCQkidG8gJWRcbiIsCisJCQkJcmN2YnVmc3opOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKQEAgLTE4Niw2ICsxOTYsMTUgQEAKIAkgICAgICAgImNvdW50IiwgImRlbGF5IHRvdGFsIiwgdC0+c3dhcGluX2NvdW50LCB0LT5zd2FwaW5fZGVsYXlfdG90YWwpOwogfQogCit2b2lkIHByaW50X2lvYWNjdChzdHJ1Y3QgdGFza3N0YXRzICp0KQoreworCXByaW50ZigiJXM6IHJlYWQ9JWxsdSwgd3JpdGU9JWxsdSwgY2FuY2VsbGVkX3dyaXRlPSVsbHVcbiIsCisJCXQtPmFjX2NvbW0sCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpdC0+cmVhZF9ieXRlcywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0LT53cml0ZV9ieXRlcywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0LT5jYW5jZWxsZWRfd3JpdGVfYnl0ZXMpOworfQorCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWludCBjLCByYywgcmVwX2xlbiwgYWdncl9sZW4sIGxlbjIsIGNtZF90eXBlOwpAQCAtMjA4LDcgKzIyNyw3IEBACiAJc3RydWN0IG1zZ3RlbXBsYXRlIG1zZzsKIAogCXdoaWxlICgxKSB7Ci0JCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgImR3OnI6bTp0OnA6djpsIik7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgImRpdzpyOm06dDpwOnY6bCIpOwogCQlpZiAoYyA8IDApCiAJCQlicmVhazsKIApAQCAtMjE3LDYgKzIzNiwxMCBAQAogCQkJcHJpbnRmKCJwcmludCBkZWxheWFjY3Qgc3RhdHMgT05cbiIpOwogCQkJcHJpbnRfZGVsYXlzID0gMTsKIAkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXByaW50ZigicHJpbnRpbmcgSU8gYWNjb3VudGluZ1xuIik7CisJCQlwcmludF9pb19hY2NvdW50aW5nID0gMTsKKwkJCWJyZWFrOwogCQljYXNlICd3JzoKIAkJCXN0cm5jcHkobG9nZmlsZSwgb3B0YXJnLCBNQVhfRklMRU5BTUUpOwogCQkJcHJpbnRmKCJ3cml0ZSB0byBmaWxlICVzXG4iLCBsb2dmaWxlKTsKQEAgLTIzOCwxNCArMjYxLDEyIEBACiAJCQlpZiAoIXRpZCkKIAkJCQllcnIoMSwgIkludmFsaWQgdGdpZFxuIik7CiAJCQljbWRfdHlwZSA9IFRBU0tTVEFUU19DTURfQVRUUl9UR0lEOwotCQkJcHJpbnRfZGVsYXlzID0gMTsKIAkJCWJyZWFrOwogCQljYXNlICdwJzoKIAkJCXRpZCA9IGF0b2kob3B0YXJnKTsKIAkJCWlmICghdGlkKQogCQkJCWVycigxLCAiSW52YWxpZCBwaWRcbiIpOwogCQkJY21kX3R5cGUgPSBUQVNLU1RBVFNfQ01EX0FUVFJfUElEOwotCQkJcHJpbnRfZGVsYXlzID0gMTsKIAkJCWJyZWFrOwogCQljYXNlICd2JzoKIAkJCXByaW50ZigiZGVidWcgb25cbiIpOwpAQCAtMjc3LDcgKzI5OCw3IEBACiAJbXlwaWQgPSBnZXRwaWQoKTsKIAlpZCA9IGdldF9mYW1pbHlfaWQobmxfc2QpOwogCWlmICghaWQpIHsKLQkJcHJpbnRmKCJFcnJvciBnZXR0aW5nIGZhbWlseSBpZCwgZXJybm8gJWQiLCBlcnJubyk7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgZ2V0dGluZyBmYW1pbHkgaWQsIGVycm5vICVkXG4iLCBlcnJubyk7CiAJCWdvdG8gZXJyOwogCX0KIAlQUklOVEYoImZhbWlseSBpZCAlZFxuIiwgaWQpOwpAQCAtMjg4LDcgKzMwOSw3IEBACiAJCQkgICAgICAmY3B1bWFzaywgc3RybGVuKGNwdW1hc2spICsgMSk7CiAJCVBSSU5URigiU2VudCByZWdpc3RlciBjcHVtYXNrLCByZXR2YWwgJWRcbiIsIHJjKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJcHJpbnRmKCJlcnJvciBzZW5kaW5nIHJlZ2lzdGVyIGNwdW1hc2tcbiIpOworCQkJZnByaW50ZihzdGRlcnIsICJlcnJvciBzZW5kaW5nIHJlZ2lzdGVyIGNwdW1hc2tcbiIpOwogCQkJZ290byBlcnI7CiAJCX0KIAl9CkBAIC0yOTgsNyArMzE5LDcgQEAKIAkJCSAgICAgIGNtZF90eXBlLCAmdGlkLCBzaXplb2YoX191MzIpKTsKIAkJUFJJTlRGKCJTZW50IHBpZC90Z2lkLCByZXR2YWwgJWRcbiIsIHJjKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJcHJpbnRmKCJlcnJvciBzZW5kaW5nIHRpZC90Z2lkIGNtZFxuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yIHNlbmRpbmcgdGlkL3RnaWQgY21kXG4iKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0KQEAgLTMxMCwxMyArMzMxLDE1IEBACiAJCVBSSU5URigicmVjZWl2ZWQgJWQgYnl0ZXNcbiIsIHJlcF9sZW4pOwogCiAJCWlmIChyZXBfbGVuIDwgMCkgewotCQkJcHJpbnRmKCJub25mYXRhbCByZXBseSBlcnJvcjogZXJybm8gJWRcbiIsIGVycm5vKTsKKwkJCWZwcmludGYoc3RkZXJyLCAibm9uZmF0YWwgcmVwbHkgZXJyb3I6IGVycm5vICVkXG4iLAorCQkJCWVycm5vKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChtc2cubi5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SIHx8CiAJCSAgICAhTkxNU0dfT0soKCZtc2cubiksIHJlcF9sZW4pKSB7CiAJCQlzdHJ1Y3Qgbmxtc2dlcnIgKmVyciA9IE5MTVNHX0RBVEEoJm1zZyk7Ci0JCQlwcmludGYoImZhdGFsIHJlcGx5IGVycm9yLCAgZXJybm8gJWRcbiIsIGVyci0+ZXJyb3IpOworCQkJZnByaW50ZihzdGRlcnIsICJmYXRhbCByZXBseSBlcnJvciwgIGVycm5vICVkXG4iLAorCQkJCWVyci0+ZXJyb3IpOwogCQkJZ290byBkb25lOwogCQl9CiAKQEAgLTM1Niw2ICszNzksOCBAQAogCQkJCQkJY291bnQrKzsKIAkJCQkJCWlmIChwcmludF9kZWxheXMpCiAJCQkJCQkJcHJpbnRfZGVsYXlhY2N0KChzdHJ1Y3QgdGFza3N0YXRzICopIE5MQV9EQVRBKG5hKSk7CisJCQkJCQlpZiAocHJpbnRfaW9fYWNjb3VudGluZykKKwkJCQkJCQlwcmludF9pb2FjY3QoKHN0cnVjdCB0YXNrc3RhdHMgKikgTkxBX0RBVEEobmEpKTsKIAkJCQkJCWlmIChmZCkgewogCQkJCQkJCWlmICh3cml0ZShmZCwgTkxBX0RBVEEobmEpLCBuYS0+bmxhX2xlbikgPCAwKSB7CiAJCQkJCQkJCWVycigxLCJ3cml0ZSBlcnJvclxuIik7CkBAIC0zNjUsNyArMzkwLDkgQEAKIAkJCQkJCQlnb3RvIGRvbmU7CiAJCQkJCQlicmVhazsKIAkJCQkJZGVmYXVsdDoKLQkJCQkJCXByaW50ZigiVW5rbm93biBuZXN0ZWQgbmxhX3R5cGUgJWRcbiIsIG5hLT5ubGFfdHlwZSk7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbmVzdGVkIgorCQkJCQkJCSIgbmxhX3R5cGUgJWRcbiIsCisJCQkJCQkJbmEtPm5sYV90eXBlKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWxlbjIgKz0gTkxBX0FMSUdOKG5hLT5ubGFfbGVuKTsKQEAgLTM3NCw3ICs0MDEsOCBAQAogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCXByaW50ZigiVW5rbm93biBubGFfdHlwZSAlZFxuIiwgbmEtPm5sYV90eXBlKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbmxhX3R5cGUgJWRcbiIsCisJCQkJCW5hLT5ubGFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQluYSA9IChzdHJ1Y3QgbmxhdHRyICopIChHRU5MTVNHX0RBVEEoJm1zZykgKyBsZW4pOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL3Rhc2tzdGF0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLnR4dAppbmRleCA5MmViZjI5Li5mZjA2YjczIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLnR4dApAQCAtOTYsOSArOTYsOSBAQAogYSBwaWQvdGdpZCB3aWxsIGJlIGZvbGxvd2VkIGJ5IHNvbWUgc3RhdHMuCiAKIGIpIFRBU0tTVEFUU19UWVBFX1BJRC9UR0lEOiBhdHRyaWJ1dGUgd2hvc2UgcGF5bG9hZCBpcyB0aGUgcGlkL3RnaWQgd2hvc2Ugc3RhdHMKLWlzIGJlaW5nIHJldHVybmVkLgorYXJlIGJlaW5nIHJldHVybmVkLgogCi1jKSBUQVNLU1RBVFNfVFlQRV9TVEFUUzogYXR0cmlidXRlIHdpdGggYSBzdHJ1Y3QgdGFza3N0c2F0cyBhcyBwYXlsb2FkLiBUaGUKK2MpIFRBU0tTVEFUU19UWVBFX1NUQVRTOiBhdHRyaWJ1dGUgd2l0aCBhIHN0cnVjdCB0YXNrc3RhdHMgYXMgcGF5bG9hZC4gVGhlCiBzYW1lIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBib3RoIHBlci1waWQgYW5kIHBlci10Z2lkIHN0YXRzLgogCiAzLiBOZXcgbWVzc2FnZSBzZW50IGJ5IGtlcm5lbCB3aGVuZXZlciBhIHRhc2sgZXhpdHMuIFRoZSBwYXlsb2FkIGNvbnNpc3RzIG9mIGEKQEAgLTEyMiwxMiArMTIyLDEyIEBACiAKIEhvd2V2ZXIsIG1haW50YWluaW5nIHBlci1wcm9jZXNzLCBpbiBhZGRpdGlvbiB0byBwZXItdGFzayBzdGF0cywgd2l0aGluIHRoZQoga2VybmVsIGhhcyBzcGFjZSBhbmQgdGltZSBvdmVyaGVhZHMuIFRvIGFkZHJlc3MgdGhpcywgdGhlIHRhc2tzdGF0cyBjb2RlCi1hY2N1bWFsYXRlcyBlYWNoIGV4aXRpbmcgdGFzaydzIHN0YXRpc3RpY3MgaW50byBhIHByb2Nlc3Mtd2lkZSBkYXRhIHN0cnVjdHVyZS4KLVdoZW4gdGhlIGxhc3QgdGFzayBvZiBhIHByb2Nlc3MgZXhpdHMsIHRoZSBwcm9jZXNzIGxldmVsIGRhdGEgYWNjdW1hbGF0ZWQgYWxzbworYWNjdW11bGF0ZXMgZWFjaCBleGl0aW5nIHRhc2sncyBzdGF0aXN0aWNzIGludG8gYSBwcm9jZXNzLXdpZGUgZGF0YSBzdHJ1Y3R1cmUuCitXaGVuIHRoZSBsYXN0IHRhc2sgb2YgYSBwcm9jZXNzIGV4aXRzLCB0aGUgcHJvY2VzcyBsZXZlbCBkYXRhIGFjY3VtdWxhdGVkIGFsc28KIGdldHMgc2VudCB0byB1c2Vyc3BhY2UgKGFsb25nIHdpdGggdGhlIHBlci10YXNrIGRhdGEpLgogCiBXaGVuIGEgdXNlciBxdWVyaWVzIHRvIGdldCBwZXItdGdpZCBkYXRhLCB0aGUgc3VtIG9mIGFsbCBvdGhlciBsaXZlIHRocmVhZHMgaW4KLXRoZSBncm91cCBpcyBhZGRlZCB1cCBhbmQgYWRkZWQgdG8gdGhlIGFjY3VtYWxhdGVkIHRvdGFsIGZvciBwcmV2aW91c2x5IGV4aXRlZAordGhlIGdyb3VwIGlzIGFkZGVkIHVwIGFuZCBhZGRlZCB0byB0aGUgYWNjdW11bGF0ZWQgdG90YWwgZm9yIHByZXZpb3VzbHkgZXhpdGVkCiB0aHJlYWRzIG9mIHRoZSBzYW1lIHRocmVhZCBncm91cC4KIAogRXh0ZW5kaW5nIHRhc2tzdGF0cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9hcy1pb3NjaGVkLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2svYXMtaW9zY2hlZC50eHQKaW5kZXggZTJhNjZmOC4uYTU5OGZlMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibG9jay9hcy1pb3NjaGVkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2FzLWlvc2NoZWQudHh0CkBAIC0yNCw4ICsyNCwxMCBAQAogU2VsZWN0aW5nIElPIHNjaGVkdWxlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBUbyBjaG9vc2UgSU8gc2NoZWR1bGVycyBhdCBib290IHRpbWUsIHVzZSB0aGUgYXJndW1lbnQgJ2VsZXZhdG9yPWRlYWRsaW5lJy4KLSdub29wJyBhbmQgJ2FzJyAodGhlIGRlZmF1bHQpIGFyZSBhbHNvIGF2YWlsYWJsZS4gSU8gc2NoZWR1bGVycyBhcmUgYXNzaWduZWQKLWdsb2JhbGx5IGF0IGJvb3QgdGltZSBvbmx5IHByZXNlbnRseS4KKydub29wJywgJ2FzJyBhbmQgJ2NmcScgKHRoZSBkZWZhdWx0KSBhcmUgYWxzbyBhdmFpbGFibGUuIElPIHNjaGVkdWxlcnMgYXJlCithc3NpZ25lZCBnbG9iYWxseSBhdCBib290IHRpbWUgb25seSBwcmVzZW50bHkuIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBjaGFuZ2UKK3RoZSBJTyBzY2hlZHVsZXIgZm9yIGEgZGV0ZXJtaW5lZCBkZXZpY2Ugb24gdGhlIGZseSwgYXMgZGVzY3JpYmVkIGluCitEb2N1bWVudGF0aW9uL2Jsb2NrL3N3aXRjaGluZy1zY2hlZC50eHQuCiAKIAogQW50aWNpcGF0b3J5IElPIHNjaGVkdWxlciBQb2xpY2llcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0CmluZGV4IDM0YmY4ZjYuLmM2YzlhOWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQKQEAgLTE4Myw3ICsxODMsNyBAQAogbW9kaWZpZWQgdG8gYWNjb21wbGlzaCBhIGRpcmVjdCBwYWdlIC0+IGJ1cyB0cmFuc2xhdGlvbiwgd2l0aG91dCByZXF1aXJpbmcKIGEgdmlydHVhbCBhZGRyZXNzIG1hcHBpbmcgKHVubGlrZSB0aGUgZWFybGllciBzY2hlbWUgb2YgdmlydHVhbCBhZGRyZXNzCiAtPiBidXMgdHJhbnNsYXRpb24pLiBTbyB0aGlzIHdvcmtzIHVuaWZvcm1seSBmb3IgaGlnaC1tZW1vcnkgcGFnZXMgKHdoaWNoCi1kbyBub3QgaGF2ZSBhIGNvcnJlcG9uZGluZyBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIHNwYWNlIG1hcHBpbmcpIGFuZAorZG8gbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgbWFwcGluZykgYW5kCiBsb3ctbWVtb3J5IHBhZ2VzLgogCiBOb3RlOiBQbGVhc2UgcmVmZXIgdG8gRE1BLW1hcHBpbmcudHh0IGZvciBhIGRpc2N1c3Npb24gb24gUENJIGhpZ2ggbWVtIERNQQpAQCAtMzkxLDcgKzM5MSw3IEBACiBvbiB0byB0aGUgZ2VuZXJpYyBibG9jayBsYXllciwgb25seSB0byBiZSBtZXJnZWQgYnkgdGhlIGkvbyBzY2hlZHVsZXIKIHdoZW4gdGhlIHVuZGVybHlpbmcgZGV2aWNlIHdhcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSBpL28gaW4gb25lIHNob3QuCiBBbHNvLCB1c2luZyB0aGUgYnVmZmVyIGhlYWQgYXMgYW4gaS9vIHN0cnVjdHVyZSBmb3IgaS9vcyB0aGF0IGRpZG4ndCBvcmlnaW5hdGUKLWZyb20gdGhlIGJ1ZmZlciBjYWNoZSB1bmVjZXNzYXJpbHkgYWRkZWQgdG8gdGhlIHdlaWdodCBvZiB0aGUgZGVzY3JpcHRvcnMKK2Zyb20gdGhlIGJ1ZmZlciBjYWNoZSB1bm5lY2Vzc2FyaWx5IGFkZGVkIHRvIHRoZSB3ZWlnaHQgb2YgdGhlIGRlc2NyaXB0b3JzCiB3aGljaCB3ZXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBzdWNoIGNodW5rLgogCiBUaGUgZm9sbG93aW5nIHdlcmUgc29tZSBvZiB0aGUgZ29hbHMgYW5kIGV4cGVjdGF0aW9ucyBjb25zaWRlcmVkIGluIHRoZQpAQCAtNDAzLDE0ICs0MDMsMTQgQEAKICAgICBmb3IgcmF3IGkvby4KIGlpLiBBYmlsaXR5IHRvIHJlcHJlc2VudCBoaWdoLW1lbW9yeSBidWZmZXJzICh3aGljaCBkbyBub3QgaGF2ZSBhIHZpcnR1YWwKICAgICBhZGRyZXNzIG1hcHBpbmcgaW4ga2VybmVsIGFkZHJlc3Mgc3BhY2UpLgotaWlpLkFiaWxpdHkgdG8gcmVwcmVzZW50IGxhcmdlIGkvb3Mgdy9vIHVuZWNlc3NhcmlseSBicmVha2luZyB0aGVtIHVwIChpLmUKK2lpaS5BYmlsaXR5IHRvIHJlcHJlc2VudCBsYXJnZSBpL29zIHcvbyB1bm5lY2Vzc2FyaWx5IGJyZWFraW5nIHRoZW0gdXAgKGkuZQogICAgIGdyZWF0ZXIgdGhhbiBQQUdFX1NJWkUgY2h1bmtzIGluIG9uZSBzaG90KQogaXYuIEF0IHRoZSBzYW1lIHRpbWUsIGFiaWxpdHkgdG8gcmV0YWluIGluZGVwZW5kZW50IGlkZW50aXR5IG9mIGkvb3MgZnJvbQogICAgIGRpZmZlcmVudCBzb3VyY2VzIG9yIGkvbyB1bml0cyByZXF1aXJpbmcgaW5kaXZpZHVhbCBjb21wbGV0aW9uIChlLmcuIGZvcgogICAgIGxhdGVuY3kgcmVhc29ucykKIHYuICBBYmlsaXR5IHRvIHJlcHJlc2VudCBhbiBpL28gaW52b2x2aW5nIG11bHRpcGxlIHBoeXNpY2FsIG1lbW9yeSBzZWdtZW50cwogICAgIChpbmNsdWRpbmcgbm9uLXBhZ2UgYWxpZ25lZCBwYWdlIGZyYWdtZW50cywgYXMgc3BlY2lmaWVkIHZpYSByZWFkdi93cml0ZXYpCi0gICAgd2l0aG91dCB1bmVjZXNzYXJpbHkgYnJlYWtpbmcgaXQgdXAsIGlmIHRoZSB1bmRlcmx5aW5nIGRldmljZSBpcyBjYXBhYmxlIG9mCisgICAgd2l0aG91dCB1bm5lY2Vzc2FyaWx5IGJyZWFraW5nIGl0IHVwLCBpZiB0aGUgdW5kZXJseWluZyBkZXZpY2UgaXMgY2FwYWJsZSBvZgogICAgIGhhbmRsaW5nIGl0LgogdmkuIFByZWZlcmFibHkgc2hvdWxkIGJlIGJhc2VkIG9uIGEgbWVtb3J5IGRlc2NyaXB0b3Igc3RydWN0dXJlIHRoYXQgY2FuIGJlCiAgICAgcGFzc2VkIGFyb3VuZCBkaWZmZXJlbnQgdHlwZXMgb2Ygc3Vic3lzdGVtcyBvciBsYXllcnMsIG1heWJlIGV2ZW4KQEAgLTEwMTMsNyArMTAxMyw3IEBACiBpLiBCaW5hcnkgdHJlZQogQVMgYW5kIGRlYWRsaW5lIGkvbyBzY2hlZHVsZXJzIHVzZSByZWQgYmxhY2sgYmluYXJ5IHRyZWVzIGZvciBkaXNrIHBvc2l0aW9uCiBzb3J0aW5nIGFuZCBzZWFyY2hpbmcsIGFuZCBhIGZpZm8gbGlua2VkIGxpc3QgZm9yIHRpbWUtYmFzZWQgc2VhcmNoaW5nLiBUaGlzCi1naXZlcyBnb29kIHNjYWxhYmlsaXR5IGFuZCBnb29kIGF2YWlsYWJsaWxpdHkgb2YgaW5mb3JtYXRpb24uIFJlcXVlc3RzIGFyZQorZ2l2ZXMgZ29vZCBzY2FsYWJpbGl0eSBhbmQgZ29vZCBhdmFpbGFiaWxpdHkgb2YgaW5mb3JtYXRpb24uIFJlcXVlc3RzIGFyZQogYWxtb3N0IGFsd2F5cyBkaXNwYXRjaGVkIGluIGRpc2sgc29ydCBvcmRlciwgc28gYSBjYWNoZSBpcyBrZXB0IG9mIHRoZSBuZXh0CiByZXF1ZXN0IGluIHNvcnQgb3JkZXIgdG8gcHJldmVudCBiaW5hcnkgdHJlZSBsb29rdXBzLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dCBiL0RvY3VtZW50YXRpb24vY2FjaGV0bGIudHh0CmluZGV4IDUzMjQ1YzQuLjczZTc5NGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2FjaGV0bGIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2FjaGV0bGIudHh0CkBAIC0xNzksMTAgKzE3OSwyMSBAQAogCWxpbmVzIGFzc29jaWF0ZWQgd2l0aCAnbW0nLgogCiAJVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBoYW5kbGUgd2hvbGUgYWRkcmVzcyBzcGFjZQotCXBhZ2UgdGFibGUgb3BlcmF0aW9ucyBzdWNoIGFzIHdoYXQgaGFwcGVucyBkdXJpbmcKLQlmb3JrLCBleGl0LCBhbmQgZXhlYy4KKwlwYWdlIHRhYmxlIG9wZXJhdGlvbnMgc3VjaCBhcyB3aGF0IGhhcHBlbnMgZHVyaW5nIGV4aXQgYW5kIGV4ZWMuCiAKLTIpIHZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisyKSB2b2lkIGZsdXNoX2NhY2hlX2R1cF9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKKworCVRoaXMgaW50ZXJmYWNlIGZsdXNoZXMgYW4gZW50aXJlIHVzZXIgYWRkcmVzcyBzcGFjZSBmcm9tCisJdGhlIGNhY2hlcy4gIFRoYXQgaXMsIGFmdGVyIHJ1bm5pbmcsIHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUKKwlsaW5lcyBhc3NvY2lhdGVkIHdpdGggJ21tJy4KKworCVRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gaGFuZGxlIHdob2xlIGFkZHJlc3Mgc3BhY2UKKwlwYWdlIHRhYmxlIG9wZXJhdGlvbnMgc3VjaCBhcyB3aGF0IGhhcHBlbnMgZHVyaW5nIGZvcmsuCisKKwlUaGlzIG9wdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGZsdXNoX2NhY2hlX21tIHRvIGFsbG93IHNvbWUKKwlvcHRpbWl6YXRpb25zIGZvciBWSVBUIGNhY2hlcy4KKworMykgdm9pZCBmbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCSAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiAKIAlIZXJlIHdlIGFyZSBmbHVzaGluZyBhIHNwZWNpZmljIHJhbmdlIG9mICh1c2VyKSB2aXJ0dWFsCkBAIC0xOTksNyArMjEwLDcgQEAKIAljYWxsIGZsdXNoX2NhY2hlX3BhZ2UgKHNlZSBiZWxvdykgZm9yIGVhY2ggZW50cnkgd2hpY2ggbWF5IGJlCiAJbW9kaWZpZWQuCiAKLTMpIHZvaWQgZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBmbikKKzQpIHZvaWQgZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBmbikKIAogCVRoaXMgdGltZSB3ZSBuZWVkIHRvIHJlbW92ZSBhIFBBR0VfU0laRSBzaXplZCByYW5nZQogCWZyb20gdGhlIGNhY2hlLiAgVGhlICd2bWEnIGlzIHRoZSBiYWNraW5nIHN0cnVjdHVyZSB1c2VkIGJ5CkBAIC0yMjAsNyArMjMxLDcgQEAKIAogCVRoaXMgaXMgdXNlZCBwcmltYXJpbHkgZHVyaW5nIGZhdWx0IHByb2Nlc3NpbmcuCiAKLTQpIHZvaWQgZmx1c2hfY2FjaGVfa21hcHModm9pZCkKKzUpIHZvaWQgZmx1c2hfY2FjaGVfa21hcHModm9pZCkKIAogCVRoaXMgcm91dGluZSBuZWVkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgdGhlIHBsYXRmb3JtIHV0aWxpemVzCiAJaGlnaG1lbS4gIEl0IHdpbGwgYmUgY2FsbGVkIHJpZ2h0IGJlZm9yZSBhbGwgb2YgdGhlIGttYXBzCkBAIC0yMzIsNyArMjQzLDcgQEAKIAogCVRoaXMgcm91dGluZyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gYXNtL2hpZ2htZW0uaAogCi01KSB2b2lkIGZsdXNoX2NhY2hlX3ZtYXAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCis2KSB2b2lkIGZsdXNoX2NhY2hlX3ZtYXAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiAgICB2b2lkIGZsdXNoX2NhY2hlX3Z1bm1hcCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIAogCUhlcmUgaW4gdGhlc2UgdHdvIGludGVyZmFjZXMgd2UgYXJlIGZsdXNoaW5nIGEgc3BlY2lmaWMgcmFuZ2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vcGFja2V0LXdyaXRpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9wYWNrZXQtd3JpdGluZy50eHQKaW5kZXggM2Q0NGM1Ni4uNzcxNWQyMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9wYWNrZXQtd3JpdGluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9wYWNrZXQtd3JpdGluZy50eHQKQEAgLTkwLDYgKzkwLDQxIEBACiAgIHRvIGNyZWF0ZSBhbiBleHQyIGZpbGVzeXN0ZW0gb24gdGhlIGRpc2MuCiAKIAorVXNpbmcgdGhlIHBrdGNkdmQgc3lzZnMgaW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2luY2UgTGludXggMi42LjE5LCB0aGUgcGt0Y2R2ZCBtb2R1bGUgaGFzIGEgc3lzZnMgaW50ZXJmYWNlCithbmQgY2FuIGJlIGNvbnRyb2xsZWQgYnkgaXQuIEZvciBleGFtcGxlIHRoZSAicGt0Y2R2ZCIgdG9vbCB1c2VzCit0aGlzIGludGVyZmFjZS4gKHNlZSBodHRwOi8vcGVvcGxlLmZyZWVuZXQuZGUvQmFsYUdpI3BrdGNkdmQgKQorCisicGt0Y2R2ZCIgd29ya3Mgc2ltaWxhciB0byAicGt0c2V0dXAiLCBlLmcuOgorCisJIyBwa3RjZHZkIC1hIGRldl9uYW1lIC9kZXYvaGRjCisJIyBta3VkZmZzIC9kZXYvcGt0Y2R2ZC9kZXZfbmFtZQorCSMgbW91bnQgLXQgdWRmIC1vIHJ3LG5vYXRpbWUgL2Rldi9wa3RjZHZkL2Rldl9uYW1lIC9kdmRyYW0KKwkjIGNwIGZpbGVzIC9kdmRyYW0KKwkjIHVtb3VudCAvZHZkcmFtCisJIyBwa3RjZHZkIC1yIGRldl9uYW1lCisKKworRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5c2ZzIGludGVyZmFjZSBsb29rIGludG8gdGhlIGZpbGU6CisKKyAgRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ibG9jay1wa3RjZHZkCisKKworVXNpbmcgdGhlIHBrdGNkdmQgZGVidWdmcyBpbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJlYWQgcGt0Y2R2ZCBkZXZpY2UgaW5mb3MgaW4gaHVtYW4gcmVhZGFibGUgZm9ybSwgZG86CisKKwkjIGNhdCAvZGVidWcvcGt0Y2R2ZC9wa3RjZHZkWzAtN10vaW5mbworCitGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVidWdmcyBpbnRlcmZhY2UgbG9vayBpbnRvIHRoZSBmaWxlOgorCisgIERvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvZGVidWdmcy1wa3RjZHZkCisKKworCiBMaW5rcwogLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jb3JlLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY29yZS50eHQKaW5kZXggMjliM2Y5Zi4uY2UwNjY2ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jb3JlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NvcmUudHh0CkBAIC0yNCw3ICsyNCw3IEBACiAxLiBHZW5lcmFsIEluZm9ybWF0aW9uCiA9PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGUgQ1BVRnJlcSBjb3JlIGNvZGUgaXMgbG9jYXRlZCBpbiBsaW51eC9rZXJuZWwvY3B1ZnJlcS5jLiBUaGlzCitUaGUgQ1BVRnJlcSBjb3JlIGNvZGUgaXMgbG9jYXRlZCBpbiBkcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jLiBUaGlzCiBjcHVmcmVxIGNvZGUgb2ZmZXJzIGEgc3RhbmRhcmRpemVkIGludGVyZmFjZSBmb3IgdGhlIENQVUZyZXEKIGFyY2hpdGVjdHVyZSBkcml2ZXJzICh0aG9zZSBwaWVjZXMgb2YgY29kZSB0aGF0IGRvIGFjdHVhbAogZnJlcXVlbmN5IHRyYW5zaXRpb25zKSwgYXMgd2VsbCBhcyB0byAibm90aWZpZXJzIi4gVGhlc2UgYXJlIGRldmljZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLW5mb3JjZTIudHh0IGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLW5mb3JjZTIudHh0CmluZGV4IDkxODgzMzcuLmJhYmNlMTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1ZnJlcS1uZm9yY2UyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtbmZvcmNlMi50eHQKQEAgLTEsNyArMSw3IEBACiAKLVRoZSBjcHVmcmVxLW5mb3JjZTIgZHJpdmVyIGNoYW5nZXMgdGhlIEZTQiBvbiBuVmlkaWEgbkZvcmNlMiBwbGF0dGZvcm1zLgorVGhlIGNwdWZyZXEtbmZvcmNlMiBkcml2ZXIgY2hhbmdlcyB0aGUgRlNCIG9uIG5WaWRpYSBuRm9yY2UyIHBsYXRmb3Jtcy4KIAotVGhpcyB3b3JrcyBiZXR0ZXIgdGhhbiBvbiBvdGhlciBwbGF0dGZvcm1zLCBiZWNhdXNlIHRoZSBGU0Igb2YgdGhlIENQVQorVGhpcyB3b3JrcyBiZXR0ZXIgdGhhbiBvbiBvdGhlciBwbGF0Zm9ybXMsIGJlY2F1c2UgdGhlIEZTQiBvZiB0aGUgQ1BVCiBjYW4gYmUgY29udHJvbGxlZCBpbmRlcGVuZGVudGx5IGZyb20gdGhlIFBDSS9BR1AgY2xvY2suCiAKIFRoZSBtb2R1bGUgaGFzIHR3byBvcHRpb25zOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHUtaG90cGx1Zy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1ob3RwbHVnLnR4dAppbmRleCBiYzEwN2NiLi5jYzYwZDI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1ob3RwbHVnLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdS1ob3RwbHVnLnR4dApAQCAtNDYsNyArNDYsNyBAQAogICAgICAgICAgICAgIG1heGNwdXM9MiB3aWxsIG9ubHkgYm9vdCAyLiBZb3UgY2FuIGNob29zZSB0byBicmluZyB0aGUKICAgICAgICAgICAgICBvdGhlciBjcHVzIGxhdGVyIG9ubGluZSwgcmVhZCBGQVEncyBmb3IgbW9yZSBpbmZvLgogCi1hZGRpdGlvbmFsX2NwdXMqPW4JVXNlIHRoaXMgdG8gbGltaXQgaG90cGx1Z2dhYmxlIGNwdXMuIFRoaXMgb3B0aW9uIHNldHMKK2FkZGl0aW9uYWxfY3B1cz1uICgqKQlVc2UgdGhpcyB0byBsaW1pdCBob3RwbHVnZ2FibGUgY3B1cy4gVGhpcyBvcHRpb24gc2V0cwogICAJCQljcHVfcG9zc2libGVfbWFwID0gY3B1X3ByZXNlbnRfbWFwICsgYWRkaXRpb25hbF9jcHVzCiAKICgqKSBPcHRpb24gdmFsaWQgb25seSBmb3IgZm9sbG93aW5nIGFyY2hpdGVjdHVyZXMKQEAgLTU0LDggKzU0LDggQEAKIAogaWE2NCBhbmQgeDg2XzY0IHVzZSB0aGUgbnVtYmVyIG9mIGRpc2FibGVkIGxvY2FsIGFwaWNzIGluIEFDUEkgdGFibGVzIE1BRFQKIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHBvdGVudGlhbGx5IGhvdC1wbHVnZ2FibGUgY3B1cy4gVGhlIGltcGxlbWVudGF0aW9uCi1zaG91bGQgb25seSByZWx5IG9uIHRoaXMgdG8gY291bnQgdGhlICNvZiBjcHVzLCBidXQgKk1VU1QqIG5vdCByZWx5IG9uIHRoZQotYXBpY2lkIHZhbHVlcyBpbiB0aG9zZSB0YWJsZXMgZm9yIGRpc2FibGVkIGFwaWNzLiBJbiB0aGUgZXZlbnQgQklPUyBkb2VzbnQKK3Nob3VsZCBvbmx5IHJlbHkgb24gdGhpcyB0byBjb3VudCB0aGUgIyBvZiBjcHVzLCBidXQgKk1VU1QqIG5vdCByZWx5IG9uIHRoZQorYXBpY2lkIHZhbHVlcyBpbiB0aG9zZSB0YWJsZXMgZm9yIGRpc2FibGVkIGFwaWNzLiBJbiB0aGUgZXZlbnQgQklPUyBkb2Vzbid0CiBtYXJrIHN1Y2ggaG90LXBsdWdnYWJsZSBjcHVzIGFzIGRpc2FibGVkIGVudHJpZXMsIG9uZSBjb3VsZCB1c2UgdGhpcwogcGFyYW1ldGVyICJhZGRpdGlvbmFsX2NwdXM9eCIgdG8gcmVwcmVzZW50IHRob3NlIGNwdXMgaW4gdGhlIGNwdV9wb3NzaWJsZV9tYXAuCiAKQEAgLTEwMSwxNSArMTAxLDE1IEBACiAKIE5ldmVyIHVzZSBhbnl0aGluZyBvdGhlciB0aGFuIGNwdW1hc2tfdCB0byByZXByZXNlbnQgYml0bWFwIG9mIENQVXMuCiAKLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisJI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAotZm9yX2VhY2hfcG9zc2libGVfY3B1ICAgICAtIEl0ZXJhdGUgb3ZlciBjcHVfcG9zc2libGVfbWFwCi1mb3JfZWFjaF9vbmxpbmVfY3B1ICAgICAgIC0gSXRlcmF0ZSBvdmVyIGNwdV9vbmxpbmVfbWFwCi1mb3JfZWFjaF9wcmVzZW50X2NwdSAgICAgIC0gSXRlcmF0ZSBvdmVyIGNwdV9wcmVzZW50X21hcAotZm9yX2VhY2hfY3B1X21hc2soeCxtYXNrKSAtIEl0ZXJhdGUgb3ZlciBzb21lIHJhbmRvbSBjb2xsZWN0aW9uIG9mIGNwdSBtYXNrLgorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdSAgICAgLSBJdGVyYXRlIG92ZXIgY3B1X3Bvc3NpYmxlX21hcAorCWZvcl9lYWNoX29ubGluZV9jcHUgICAgICAgLSBJdGVyYXRlIG92ZXIgY3B1X29ubGluZV9tYXAKKwlmb3JfZWFjaF9wcmVzZW50X2NwdSAgICAgIC0gSXRlcmF0ZSBvdmVyIGNwdV9wcmVzZW50X21hcAorCWZvcl9lYWNoX2NwdV9tYXNrKHgsbWFzaykgLSBJdGVyYXRlIG92ZXIgc29tZSByYW5kb20gY29sbGVjdGlvbiBvZiBjcHUgbWFzay4KIAotI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgotbG9ja19jcHVfaG90cGx1ZygpIGFuZCB1bmxvY2tfY3B1X2hvdHBsdWcoKToKKwkjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisJbG9ja19jcHVfaG90cGx1ZygpIGFuZCB1bmxvY2tfY3B1X2hvdHBsdWcoKToKIAogVGhlIGFib3ZlIGNhbGxzIGFyZSB1c2VkIHRvIGluaGliaXQgY3B1IGhvdHBsdWcgb3BlcmF0aW9ucy4gV2hpbGUgaG9sZGluZyB0aGUKIGNwdWNvbnRyb2wgbXV0ZXgsIGNwdV9vbmxpbmVfbWFwIHdpbGwgbm90IGNoYW5nZS4gSWYgeW91IG1lcmVseSBuZWVkIHRvIGF2b2lkCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogQ1BVIEhvdHBsdWcgLSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucy4KIAotUTogSG93IHRvIGkgZW5hYmxlIG15IGtlcm5lbCB0byBzdXBwb3J0IENQVSBob3RwbHVnPworUTogSG93IHRvIGVuYWJsZSBteSBrZXJuZWwgdG8gc3VwcG9ydCBDUFUgaG90cGx1Zz8KIEE6IFdoZW4gZG9pbmcgbWFrZSBkZWZjb25maWcsIEVuYWJsZSBDUFUgaG90cGx1ZyBzdXBwb3J0CiAKICAgICJQcm9jZXNzb3IgdHlwZSBhbmQgRmVhdHVyZXMiIC0+IFN1cHBvcnQgZm9yIEhvdHBsdWdnYWJsZSBDUFVzCkBAIC0xNDEsMzkgKzE0MSwzOSBAQAogQ2hlY2sgaWYgc3lzZnMgaXMgbW91bnRlZCwgdXNpbmcgdGhlICJtb3VudCIgY29tbWFuZC4gWW91IHNob3VsZCBub3RpY2UKIGFuIGVudHJ5IGFzIHNob3duIGJlbG93IGluIHRoZSBvdXRwdXQuCiAKLS4uLi4KLW5vbmUgb24gL3N5cyB0eXBlIHN5c2ZzIChydykKLS4uLi4KKwkuLi4uCisJbm9uZSBvbiAvc3lzIHR5cGUgc3lzZnMgKHJ3KQorCS4uLi4KIAotaWYgdGhpcyBpcyBub3QgbW91bnRlZCwgZG8gdGhlIGZvbGxvd2luZy4KK0lmIHRoaXMgaXMgbm90IG1vdW50ZWQsIGRvIHRoZSBmb2xsb3dpbmcuCiAKLSNta2RpciAvc3lzZnMKLSNtb3VudCAtdCBzeXNmcyBzeXMgL3N5cworCSAjbWtkaXIgL3N5c2ZzCisJI21vdW50IC10IHN5c2ZzIHN5cyAvc3lzCiAKLW5vdyB5b3Ugc2hvdWxkIHNlZSBlbnRyaWVzIGZvciBhbGwgcHJlc2VudCBjcHUsIHRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZQorTm93IHlvdSBzaG91bGQgc2VlIGVudHJpZXMgZm9yIGFsbCBwcmVzZW50IGNwdSwgdGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlCiBpbiBhIDgtd2F5IHN5c3RlbS4KIAotI3B3ZAotIy9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1Ci0jbHMgLWwKLXRvdGFsIDAKLWRyd3hyLXhyLXggIDEwIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCAuCi1kcnd4ci14ci14ICAxMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDUgLi4KLWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHUwCi1kcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1MQotZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTIKLWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHUzCi1kcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1NAotZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTUKLWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHU2Ci1kcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDggY3B1NworCSNwd2QKKwkjL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUKKwkjbHMgLWwKKwl0b3RhbCAwCisJZHJ3eHIteHIteCAgMTAgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IC4KKwlkcnd4ci14ci14ICAxMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDUgLi4KKwlkcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1MAorCWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHUxCisJZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTIKKwlkcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1MworCWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0NCBjcHU0CisJZHJ3eHIteHIteCAgIDMgcm9vdCByb290IDAgU2VwIDE5IDA3OjQ0IGNwdTUKKwlkcnd4ci14ci14ICAgMyByb290IHJvb3QgMCBTZXAgMTkgMDc6NDQgY3B1NgorCWRyd3hyLXhyLXggICAzIHJvb3Qgcm9vdCAwIFNlcCAxOSAwNzo0OCBjcHU3CiAKIFVuZGVyIGVhY2ggZGlyZWN0b3J5IHlvdSB3b3VsZCBmaW5kIGFuICJvbmxpbmUiIGZpbGUgd2hpY2ggaXMgdGhlIGNvbnRyb2wKIGZpbGUgdG8gbG9naWNhbGx5IG9ubGluZS9vZmZsaW5lIGEgcHJvY2Vzc29yLgogCiBROiBEb2VzIGhvdC1hZGQvaG90LXJlbW92ZSByZWZlciB0byBwaHlzaWNhbCBhZGQvcmVtb3ZlIG9mIGNwdXM/CiBBOiBUaGUgdXNhZ2Ugb2YgaG90LWFkZC9yZW1vdmUgbWF5IG5vdCBiZSB2ZXJ5IGNvbnNpc3RlbnRseSB1c2VkIGluIHRoZSBjb2RlLgotQ09ORklHX0NQVV9IT1RQTFVHIGVuYWJsZXMgbG9naWNhbCBvbmxpbmUvb2ZmbGluZSBjYXBhYmlsaXR5IGluIHRoZSBrZXJuZWwuCitDT05GSUdfSE9UUExVR19DUFUgZW5hYmxlcyBsb2dpY2FsIG9ubGluZS9vZmZsaW5lIGNhcGFiaWxpdHkgaW4gdGhlIGtlcm5lbC4KIFRvIHN1cHBvcnQgcGh5c2ljYWwgYWRkaXRpb24vcmVtb3ZhbCwgb25lIHdvdWxkIG5lZWQgc29tZSBCSU9TIGhvb2tzIGFuZAogdGhlIHBsYXRmb3JtIHNob3VsZCBoYXZlIHNvbWV0aGluZyBsaWtlIGFuIGF0dGVudGlvbiBidXR0b24gaW4gUENJIGhvdHBsdWcuCiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSBlbmFibGVzIEFDUEkgc3VwcG9ydCBmb3IgcGh5c2ljYWwgYWRkL3JlbW92ZSBvZiBDUFVzLgpAQCAtMTgxLDE3ICsxODEsMTcgQEAKIFE6IEhvdyBkbyBpIGxvZ2ljYWxseSBvZmZsaW5lIGEgQ1BVPwogQTogRG8gdGhlIGZvbGxvd2luZy4KIAotI2VjaG8gMCA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvb25saW5lCisJI2VjaG8gMCA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvb25saW5lCiAKLW9uY2UgdGhlIGxvZ2ljYWwgb2ZmbGluZSBpcyBzdWNjZXNzZnVsLCBjaGVjaworT25jZSB0aGUgbG9naWNhbCBvZmZsaW5lIGlzIHN1Y2Nlc3NmdWwsIGNoZWNrCiAKLSNjYXQgL3Byb2MvaW50ZXJydXB0cworCSNjYXQgL3Byb2MvaW50ZXJydXB0cwogCi15b3Ugc2hvdWxkIG5vdyBub3Qgc2VlIHRoZSBDUFUgdGhhdCB5b3UgcmVtb3ZlZC4gQWxzbyBvbmxpbmUgZmlsZSB3aWxsIHJlcG9ydAorWW91IHNob3VsZCBub3cgbm90IHNlZSB0aGUgQ1BVIHRoYXQgeW91IHJlbW92ZWQuIEFsc28gb25saW5lIGZpbGUgd2lsbCByZXBvcnQKIHRoZSBzdGF0ZSBhcyAwIHdoZW4gYSBjcHUgaWYgb2ZmbGluZSBhbmQgMSB3aGVuIGl0cyBvbmxpbmUuCiAKLSNUbyBkaXNwbGF5IHRoZSBjdXJyZW50IGNwdSBzdGF0ZS4KLSNjYXQgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1WC9vbmxpbmUKKwkjVG8gZGlzcGxheSB0aGUgY3VycmVudCBjcHUgc3RhdGUuCisJI2NhdCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHVYL29ubGluZQogCiBROiBXaHkgY2FudCBpIHJlbW92ZSBDUFUwIG9uIHNvbWUgc3lzdGVtcz8KIEE6IFNvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgaGF2ZSBzb21lIHNwZWNpYWwgZGVwZW5kZW5jeSBvbiBhIGNlcnRhaW4gQ1BVLgpAQCAtMjM0LDggKzIzNCw4IEBACiAgICBkZXBhcnR1cmUsIGhvdyB0byBpIGFycmFuZ2UgZm9yIHByb3BlciBub3RpZmljYXRpb24/CiBBOiBUaGlzIGlzIHdoYXQgeW91IHdvdWxkIG5lZWQgaW4geW91ciBrZXJuZWwgY29kZSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMuCiAKLSAgICAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0gICAgc3RhdGljIGludCBfX2NwdWluaXQgZm9vYmFyX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKKwkjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisJc3RhdGljIGludCBfX2NwdWluaXQgZm9vYmFyX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogCXsKIAkJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CkBAIC0yNzksMTAgKzI3OSwxMCBAQAogQTogWWVzLCBDUFUgbm90aWZpZXJzIGFyZSBjYWxsZWQgb25seSB3aGVuIG5ldyBDUFVzIGFyZSBvbi1saW5lZCBvciBvZmZsaW5lZC4KICAgIElmIHlvdSBuZWVkIHRvIHBlcmZvcm0gc29tZSBhY3Rpb24gZm9yIGVhY2ggY3B1IGFscmVhZHkgaW4gdGhlIHN5c3RlbSwgdGhlbgogCi0gIGZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQlmb29iYXJfY3B1X2NhbGxiYWNrKCZmb29iYXJfY3B1X25vdGlmaWVyLCBDUFVfVVBfUFJFUEFSRSwgaSk7Ci0JCWZvb2Jhcl9jcHVfY2FsbGJhY2soJmZvb2Jhci1jcHVfbm90aWZpZXIsIENQVV9PTkxJTkUsIGkpOwotICB9CisJCWZvb2Jhcl9jcHVfY2FsbGJhY2soJmZvb2Jhcl9jcHVfbm90aWZpZXIsIENQVV9PTkxJTkUsIGkpOworCX0KIAogUTogSWYgaSB3b3VsZCBsaWtlIHRvIGRldmVsb3AgY3B1IGhvdHBsdWcgc3VwcG9ydCBmb3IgYSBuZXcgYXJjaGl0ZWN0dXJlLAogICAgd2hhdCBkbyBpIG5lZWQgYXQgYSBtaW5pbXVtPwpAQCAtMzA3LDM4ICszMDcsMzggQEAKICAgIHdvcmsgc3BlY2lmaWMgdG8gdGhpcyBjcHUgaXMgaW4gcHJvZ3Jlc3MuCiBBOiBGaXJzdCBzd2l0Y2ggdGhlIGN1cnJlbnQgdGhyZWFkIGNvbnRleHQgdG8gcHJlZmVycmVkIGNwdQogCi0gICBpbnQgbXlfZnVuY19vbl9jcHUoaW50IGNwdSkKLSAgIHsKLSAgICAgICBjcHVtYXNrX3Qgc2F2ZWRfbWFzaywgbmV3X21hc2sgPSBDUFVfTUFTS19OT05FOwotICAgICAgIGludCBjdXJyX2NwdSwgZXJyID0gMDsKKwlpbnQgbXlfZnVuY19vbl9jcHUoaW50IGNwdSkKKwl7CisJCWNwdW1hc2tfdCBzYXZlZF9tYXNrLCBuZXdfbWFzayA9IENQVV9NQVNLX05PTkU7CisJCWludCBjdXJyX2NwdSwgZXJyID0gMDsKIAotICAgICAgIHNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7Ci0gICAgICAgY3B1X3NldChjcHUsIG5ld19tYXNrKTsKLSAgICAgICBlcnIgPSBzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG5ld19tYXNrKTsKKwkJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwkJY3B1X3NldChjcHUsIG5ld19tYXNrKTsKKwkJZXJyID0gc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBuZXdfbWFzayk7CiAKLSAgICAgICBpZiAoZXJyKQotICAgICAgICAgICByZXR1cm4gZXJyOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotICAgICAgIC8qCi0gICAgICAgICogSWYgd2UgZ290IHNjaGVkdWxlZCBvdXQganVzdCBhZnRlciB0aGUgcmV0dXJuIGZyb20KLSAgICAgICAgKiBzZXRfY3B1c19hbGxvd2VkKCkgYmVmb3JlIHJ1bm5pbmcgdGhlIHdvcmssIHRoaXMgZW5zdXJlcwotICAgICAgICAqIHdlIHN0YXkgbG9ja2VkLgotICAgICAgICAqLwotICAgICAgIGN1cnJfY3B1ID0gZ2V0X2NwdSgpOworCQkvKgorCQkgKiBJZiB3ZSBnb3Qgc2NoZWR1bGVkIG91dCBqdXN0IGFmdGVyIHRoZSByZXR1cm4gZnJvbQorCQkgKiBzZXRfY3B1c19hbGxvd2VkKCkgYmVmb3JlIHJ1bm5pbmcgdGhlIHdvcmssIHRoaXMgZW5zdXJlcworCQkgKiB3ZSBzdGF5IGxvY2tlZC4KKwkJICovCisJCWN1cnJfY3B1ID0gZ2V0X2NwdSgpOwogCi0gICAgICAgaWYgKGN1cnJfY3B1ICE9IGNwdSkgewotCSAgIGVyciA9IC1FQUdBSU47Ci0gICAgICAgICAgIGdvdG8gcmV0OwotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgCSAgIC8qCi0JICAgICogRG8gd29yayA6IEJ1dCBjYW50IHNsZWVwLCBzaW5jZSBnZXRfY3B1KCkgZGlzYWJsZXMgcHJlZW1wdAotCSAgICAqLwotICAgICAgIH0KLSAgICByZXQ6Ci0gICAgCXB1dF9jcHUoKTsKLQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOwotCXJldHVybiBlcnI7Ci0gICAgfQorCQlpZiAoY3Vycl9jcHUgIT0gY3B1KSB7CisJCQllcnIgPSAtRUFHQUlOOworCQkJZ290byByZXQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRG8gd29yayA6IEJ1dCBjYW50IHNsZWVwLCBzaW5jZSBnZXRfY3B1KCkgZGlzYWJsZXMgcHJlZW1wdAorCQkJICovCisJCX0KKwkJcmV0OgorCQkJcHV0X2NwdSgpOworCQkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAogCiBROiBIb3cgZG8gd2UgZGV0ZXJtaW5lIGhvdyBtYW55IENQVXMgYXJlIGF2YWlsYWJsZSBmb3IgaG90cGx1Zy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CmluZGV4IDI4YzRmNzkuLjhkZTEzMmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dApAQCAtMyw3ICszLDcgQEAKIAogCSAgICAgTWFpbnRhaW5lZCBieSBUb3JiZW4gTWF0aGlhc2VuIDxkZXZpY2VAbGFuYW5hLm9yZz4KIAotCQkgICAgICBMYXN0IHJldmlzZWQ6IDE1IE1heSAyMDA2CisJCSAgICAgIExhc3QgcmV2aXNlZDogMjkgTm92ZW1iZXIgMjAwNgogCiBUaGlzIGxpc3QgaXMgdGhlIExpbnV4IERldmljZSBMaXN0LCB0aGUgb2ZmaWNpYWwgcmVnaXN0cnkgb2YgYWxsb2NhdGVkCiBkZXZpY2UgbnVtYmVycyBhbmQgL2RldiBkaXJlY3Rvcnkgbm9kZXMgZm9yIHRoZSBMaW51eCBvcGVyYXRpbmcKQEAgLTkyLDggKzkyLDkgQEAKIAkJICA3ID0gL2Rldi9mdWxsCQlSZXR1cm5zIEVOT1NQQyBvbiB3cml0ZQogCQkgIDggPSAvZGV2L3JhbmRvbQlOb25kZXRlcm1pbmlzdGljIHJhbmRvbSBudW1iZXIgZ2VuLgogCQkgIDkgPSAvZGV2L3VyYW5kb20JRmFzdGVyLCBsZXNzIHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbi4KLQkJIDEwID0gL2Rldi9haW8JCUFzeW5jcm9ub3VzIEkvTyBub3RpZmljYXRpb24gaW50ZXJmYWNlCisJCSAxMCA9IC9kZXYvYWlvCQlBc3luY2hyb25vdXMgSS9PIG5vdGlmaWNhdGlvbiBpbnRlcmZhY2UKIAkJIDExID0gL2Rldi9rbXNnCQlXcml0ZXMgdG8gdGhpcyBjb21lIG91dCBhcyBwcmludGsncworCiAgIDEgYmxvY2sJUkFNIGRpc2sKIAkJICAwID0gL2Rldi9yYW0wCQlGaXJzdCBSQU0gZGlzawogCQkgIDEgPSAvZGV2L3JhbTEJCVNlY29uZCBSQU0gZGlzawpAQCAtMTIyLDcgKzEyMyw3IEBACiAJCWRldmljZXMgYXJlIG9uIG1ham9yIDEyOCBhbmQgYWJvdmUgYW5kIHVzZSB0aGUgUFRZCiAJCW1hc3RlciBtdWx0aXBsZXggKC9kZXYvcHRteCkgdG8gYWNxdWlyZSBhIFBUWSBvbgogCQlkZW1hbmQuCi0gIAorCiAgIDIgYmxvY2sJRmxvcHB5IGRpc2tzCiAJCSAgMCA9IC9kZXYvZmQwCQlDb250cm9sbGVyIDAsIGRyaXZlIDAsIGF1dG9kZXRlY3QKIAkJICAxID0gL2Rldi9mZDEJCUNvbnRyb2xsZXIgMCwgZHJpdmUgMSwgYXV0b2RldGVjdApAQCAtMjU3LDcgKzI1OCw3IEBACiAJCTEyOSA9IC9kZXYvdmNzYTEJdHR5MSB0ZXh0L2F0dHJpYnV0ZSBjb250ZW50cwogCQkgICAgLi4uCiAJCTE5MSA9IC9kZXYvdmNzYTYzCXR0eTYzIHRleHQvYXR0cmlidXRlIGNvbnRlbnRzCi0JCisKIAkJTk9URTogVGhlc2UgZGV2aWNlcyBwZXJtaXQgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MuCiAKICAgNyBibG9jawlMb29wYmFjayBkZXZpY2VzCkBAIC00MTEsNyArNDEyLDcgQEAKIAkJMjA3ID0gL2Rldi92aWRlby9lbTgzMDBfc3AJRU04MzAwIERWRCBkZWNvZGVyIHN1YnBpY3R1cmUKIAkJMjA4ID0gL2Rldi9jb21wYXEvY3BxcGhwYwlDb21wYXEgUENJIEhvdCBQbHVnIENvbnRyb2xsZXIKIAkJMjA5ID0gL2Rldi9jb21wYXEvY3BxcmlkCUNvbXBhcSBSZW1vdGUgSW5zaWdodCBEcml2ZXIKLQkJMjEwID0gL2Rldi9pbXBpL2J0CUlNUEkgY29wcm9jZXNzb3IgYmxvY2sgdHJhbnNmZXIJCisJCTIxMCA9IC9kZXYvaW1waS9idAlJTVBJIGNvcHJvY2Vzc29yIGJsb2NrIHRyYW5zZmVyCiAJCTIxMSA9IC9kZXYvaW1waS9zbWljCUlNUEkgY29wcm9jZXNzb3Igc3RyZWFtIGludGVyZmFjZQogCQkyMTIgPSAvZGV2L3dhdGNoZG9ncy8wCUZpcnN0IHdhdGNoZG9nIGRldmljZQogCQkyMTMgPSAvZGV2L3dhdGNoZG9ncy8xCVNlY29uZCB3YXRjaGRvZyBkZXZpY2UKQEAgLTUwNiw2ICs1MDcsNyBAQAogCQkgMzMgPSAvZGV2L3BhdG1ncjEJU2VxdWVuY2VyIHBhdGNoIG1hbmFnZXIKIAkJIDM0ID0gL2Rldi9taWRpMDIJVGhpcmQgTUlESSBwb3J0CiAJCSA1MCA9IC9kZXYvbWlkaTAzCUZvdXJ0aCBNSURJIHBvcnQKKwogIDE0IGJsb2NrCUJJT1MgaGFyZGRyaXZlIGNhbGxiYWNrIHN1cHBvcnQgezIuNn0KIAkJICAwID0gL2Rldi9kb3NfaGRhCUZpcnN0IEJJT1MgaGFyZGRyaXZlIHdob2xlIGRpc2sKIAkJIDY0ID0gL2Rldi9kb3NfaGRiCVNlY29uZCBCSU9TIGhhcmRkcml2ZSB3aG9sZSBkaXNrCkBAIC01MjcsNiArNTI5LDcgQEAKIAogIDE2IGNoYXIJTm9uLVNDU0kgc2Nhbm5lcnMKIAkJICAwID0gL2Rldi9nczQ1MDAJR2VuaXVzIDQ1MDAgaGFuZGhlbGQgc2Nhbm5lcgorCiAgMTYgYmxvY2sJR29sZFN0YXIgQ0QtUk9NCiAJCSAgMCA9IC9kZXYvZ3NjZAkJR29sZFN0YXIgQ0QtUk9NCiAKQEAgLTU0OCw2ICs1NTEsNyBAQAogCQkgIDAgPSAvZGV2L3R0eUMwCUZpcnN0IEN5Y2xhZGVzIHBvcnQKIAkJICAgIC4uLgogCQkgMzEgPSAvZGV2L3R0eUMzMQkzMm5kIEN5Y2xhZGVzIHBvcnQKKwogIDE5IGJsb2NrCSJEb3VibGUiIGNvbXByZXNzZWQgZGlzawogCQkgIDAgPSAvZGV2L2RvdWJsZTAJRmlyc3QgY29tcHJlc3NlZCBkaXNrCiAJCSAgICAuLi4KQEAgLTU2Myw2ICs1NjcsNyBAQAogCQkgIDAgPSAvZGV2L2N1YjAJCUNhbGxvdXQgZGV2aWNlIGZvciB0dHlDMAogCQkgICAgLi4uCiAJCSAzMSA9IC9kZXYvY3ViMzEJQ2FsbG91dCBkZXZpY2UgZm9yIHR0eUMzMQorCiAgMjAgYmxvY2sJSGl0YWNoaSBDRC1ST00gKHVuZGVyIGRldmVsb3BtZW50KQogCQkgIDAgPSAvZGV2L2hpdGNkCUhpdGFjaGkgQ0QtUk9NCiAKQEAgLTU4Miw3ICs1ODcsNyBAQAogCiAJCVRoaXMgZGV2aWNlIGlzIHVzZWQgb24gdGhlIEFSTS1iYXNlZCBBY29ybiBSaXNjUEMuCiAJCVBhcnRpdGlvbnMgYXJlIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIGZvciBJREUgZGlza3MKLQkJKHNlZSBtYWpvciBudW1iZXIgMykuIAorCQkoc2VlIG1ham9yIG51bWJlciAzKS4KIAogIDIyIGNoYXIJRGlnaWJvYXJkIHNlcmlhbCBjYXJkCiAJCSAgMCA9IC9kZXYvdHR5RDAJRmlyc3QgRGlnaWJvYXJkIHBvcnQKQEAgLTU5MSw3ICs1OTYsNyBAQAogIDIyIGJsb2NrCVNlY29uZCBJREUgaGFyZCBkaXNrL0NELVJPTSBpbnRlcmZhY2UKIAkJICAwID0gL2Rldi9oZGMJCU1hc3Rlcjogd2hvbGUgZGlzayAob3IgQ0QtUk9NKQogCQkgNjQgPSAvZGV2L2hkZAkJU2xhdmU6IHdob2xlIGRpc2sgKG9yIENELVJPTSkKLQkJCisKIAkJUGFydGl0aW9ucyBhcmUgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgZm9yIHRoZSBmaXJzdAogCQlpbnRlcmZhY2UgKHNlZSBtYWpvciBudW1iZXIgMykuCiAKQEAgLTYzOSw2ICs2NDQsNyBAQAogCiAgMjYgY2hhcglRdWFudGEgV2luVmlzaW9uIGZyYW1lIGdyYWJiZXIgezIuNn0KIAkJICAwID0gL2Rldi93dmlzZmdyYWIJUXVhbnRhIFdpblZpc2lvbiBmcmFtZSBncmFiYmVyCisKICAyNiBibG9jawlTZWNvbmQgTWF0c3VzaGl0YSAoUGFuYXNvbmljL1NvdW5kQmxhc3RlcikgQ0QtUk9NCiAJCSAgMCA9IC9kZXYvc2JwY2Q0CVBhbmFzb25pYyBDRC1ST00gY29udHJvbGxlciAxIHVuaXQgMAogCQkgIDEgPSAvZGV2L3NicGNkNQlQYW5hc29uaWMgQ0QtUk9NIGNvbnRyb2xsZXIgMSB1bml0IDEKQEAgLTY3MCw2ICs2NzYsNyBAQAogCQkgMzcgPSAvZGV2L25yYXdxZnQxCVVuaXQgMSwgbm8gcmV3aW5kLW9uLWNsb3NlLCBubyBmaWxlIG1hcmtzCiAJCSAzOCA9IC9kZXYvbnJhd3FmdDIJVW5pdCAyLCBubyByZXdpbmQtb24tY2xvc2UsIG5vIGZpbGUgbWFya3MKIAkJIDM5ID0gL2Rldi9ucmF3cWZ0MwlVbml0IDMsIG5vIHJld2luZC1vbi1jbG9zZSwgbm8gZmlsZSBtYXJrcworCiAgMjcgYmxvY2sJVGhpcmQgTWF0c3VzaGl0YSAoUGFuYXNvbmljL1NvdW5kQmxhc3RlcikgQ0QtUk9NCiAJCSAgMCA9IC9kZXYvc2JwY2Q4CVBhbmFzb25pYyBDRC1ST00gY29udHJvbGxlciAyIHVuaXQgMAogCQkgIDEgPSAvZGV2L3NicGNkOQlQYW5hc29uaWMgQ0QtUk9NIGNvbnRyb2xsZXIgMiB1bml0IDEKQEAgLTY4MSw2ICs2ODgsNyBAQAogCQkgIDEgPSAvZGV2L3N0YWxpb21lbTEJU2Vjb25kIFN0YWxsaW9uIGNhcmQgSS9PIG1lbW9yeQogCQkgIDIgPSAvZGV2L3N0YWxpb21lbTIJVGhpcmQgU3RhbGxpb24gY2FyZCBJL08gbWVtb3J5CiAJCSAgMyA9IC9kZXYvc3RhbGlvbWVtMwlGb3VydGggU3RhbGxpb24gY2FyZCBJL08gbWVtb3J5CisKICAyOCBjaGFyCUF0YXJpIFNMTSBBQ1NJIGxhc2VyIHByaW50ZXIgKDY4ay9BdGFyaSkKIAkJICAwID0gL2Rldi9zbG0wCQlGaXJzdCBTTE0gbGFzZXIgcHJpbnRlcgogCQkgIDEgPSAvZGV2L3NsbTEJCVNlY29uZCBTTE0gbGFzZXIgcHJpbnRlcgpAQCAtNjkwLDYgKzY5OCw3IEBACiAJCSAgMSA9IC9kZXYvc2JwY2QxMwlQYW5hc29uaWMgQ0QtUk9NIGNvbnRyb2xsZXIgMyB1bml0IDEKIAkJICAyID0gL2Rldi9zYnBjZDE0CVBhbmFzb25pYyBDRC1ST00gY29udHJvbGxlciAzIHVuaXQgMgogCQkgIDMgPSAvZGV2L3NicGNkMTUJUGFuYXNvbmljIENELVJPTSBjb250cm9sbGVyIDMgdW5pdCAzCisKICAyOCBibG9jawlBQ1NJIGRpc2sgKDY4ay9BdGFyaSkKIAkJICAwID0gL2Rldi9hZGEJCUZpcnN0IEFDU0kgZGlzayB3aG9sZSBkaXNrCiAJCSAxNiA9IC9kZXYvYWRiCQlTZWNvbmQgQUNTSSBkaXNrIHdob2xlIGRpc2sKQEAgLTc1MCw2ICs3NTksNyBAQAogIDMxIGNoYXIJTVBVLTQwMSBNSURJCiAJCSAgMCA9IC9kZXYvbXB1NDAxZGF0YQlNUFUtNDAxIGRhdGEgcG9ydAogCQkgIDEgPSAvZGV2L21wdTQwMXN0YXQJTVBVLTQwMSBzdGF0dXMgcG9ydAorCiAgMzEgYmxvY2sJUk9NL2ZsYXNoIG1lbW9yeSBjYXJkCiAJCSAgMCA9IC9kZXYvcm9tMAkJRmlyc3QgUk9NIGNhcmQgKHJ3KQogCQkgICAgICAuLi4KQEAgLTgwMSw3ICs4MTEsNyBAQAogIDM0IGJsb2NrCUZvdXJ0aCBJREUgaGFyZCBkaXNrL0NELVJPTSBpbnRlcmZhY2UKIAkJICAwID0gL2Rldi9oZGcJCU1hc3Rlcjogd2hvbGUgZGlzayAob3IgQ0QtUk9NKQogCQkgNjQgPSAvZGV2L2hkaAkJU2xhdmU6IHdob2xlIGRpc2sgKG9yIENELVJPTSkKLQkJCisKIAkJUGFydGl0aW9ucyBhcmUgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgZm9yIHRoZSBmaXJzdAogCQlpbnRlcmZhY2UgKHNlZSBtYWpvciBudW1iZXIgMykuCiAKQEAgLTgxOCw2ICs4MjgsNyBAQAogCQkxMjkgPSAvZGV2L3NtcHRlMQlTZWNvbmQgTUlESSBwb3J0LCBTTVBURSB0aW1lZAogCQkxMzAgPSAvZGV2L3NtcHRlMglUaGlyZCBNSURJIHBvcnQsIFNNUFRFIHRpbWVkCiAJCTEzMSA9IC9kZXYvc21wdGUzCUZvdXJ0aCBNSURJIHBvcnQsIFNNUFRFIHRpbWVkCisKICAzNSBibG9jawlTbG93IG1lbW9yeSByYW1kaXNrCiAJCSAgMCA9IC9kZXYvc2xyYW0JU2xvdyBtZW1vcnkgcmFtZGlzawogCkBAIC04MjgsNiArODM5LDcgQEAKIAkJIDE2ID0gL2Rldi90YXAwCQlGaXJzdCBFdGhlcnRhcCBkZXZpY2UKIAkJICAgIC4uLgogCQkgMzEgPSAvZGV2L3RhcDE1CTE2dGggRXRoZXJ0YXAgZGV2aWNlCisKICAzNiBibG9jawlNQ0EgRVNESSBoYXJkIGRpc2sKIAkJICAwID0gL2Rldi9lZGEJCUZpcnN0IEVTREkgZGlzayB3aG9sZSBkaXNrCiAJCSA2NCA9IC9kZXYvZWRiCQlTZWNvbmQgRVNESSBkaXNrIHdob2xlIGRpc2sKQEAgLTg4Miw2ICs4OTQsNyBAQAogCiAgNDAgY2hhcglNYXRyb3ggTWV0ZW9yIGZyYW1lIGdyYWJiZXIgezIuNn0KIAkJICAwID0gL2Rldi9tbWV0ZmdyYWIJTWF0cm94IE1ldGVvciBmcmFtZSBncmFiYmVyCisKICA0MCBibG9jawlTeXF1ZXN0IEVaMTM1IHBhcmFsbGVsIHBvcnQgcmVtb3ZhYmxlIGRyaXZlCiAJCSAgMCA9IC9kZXYvZXphCQlQYXJhbGxlbCBFWjEzNSBkcml2ZSwgd2hvbGUgZGlzawogCkBAIC04OTMsNiArOTA2LDcgQEAKIAogIDQxIGNoYXIJWWV0IEFub3RoZXIgTWljcm8gTW9uaXRvcgogCQkgIDAgPSAvZGV2L3lhbW0JCVlldCBBbm90aGVyIE1pY3JvIE1vbml0b3IKKwogIDQxIGJsb2NrCU1pY3JvU29sdXRpb25zIEJhY2tQYWNrIHBhcmFsbGVsIHBvcnQgQ0QtUk9NCiAJCSAgMCA9IC9kZXYvYnBjZAkJQmFja1BhY2sgQ0QtUk9NCiAKQEAgLTkwMSw2ICs5MTUsNyBAQAogCQl0aGUgcGFyYWxsZWwgcG9ydCBBVEFQSSBDRC1ST00gZHJpdmVyIGF0IG1ham9yIG51bWJlciA0Ni4KIAogIDQyIGNoYXIJRGVtby9zYW1wbGUgdXNlCisKICA0MiBibG9jawlEZW1vL3NhbXBsZSB1c2UKIAogCQlUaGlzIG51bWJlciBpcyBpbnRlbmRlZCBmb3IgdXNlIGluIHNhbXBsZSBjb2RlLCBhcwpAQCAtOTE4LDYgKzkzMyw3IEBACiAJCSAgMCA9IC9kZXYvdHR5STAJRmlyc3QgdmlydHVhbCBtb2RlbQogCQkgICAgLi4uCiAJCSA2MyA9IC9kZXYvdHR5STYzCTY0dGggdmlydHVhbCBtb2RlbQorCiAgNDMgYmxvY2sJTmV0d29yayBibG9jayBkZXZpY2VzCiAJCSAgMCA9IC9kZXYvbmIwCQlGaXJzdCBuZXR3b3JrIGJsb2NrIGRldmljZQogCQkgIDEgPSAvZGV2L25iMQkJU2Vjb25kIG5ldHdvcmsgYmxvY2sgZGV2aWNlCkBAIC05MzQsMTIgKzk1MCwxMyBAQAogCQkgIDAgPSAvZGV2L2N1aTAJCUNhbGxvdXQgZGV2aWNlIGZvciB0dHlJMAogCQkgICAgLi4uCiAJCSA2MyA9IC9kZXYvY3VpNjMJQ2FsbG91dCBkZXZpY2UgZm9yIHR0eUk2MworCiAgNDQgYmxvY2sJRmxhc2ggVHJhbnNsYXRpb24gTGF5ZXIgKEZUTCkgZmlsZXN5c3RlbXMKIAkJICAwID0gL2Rldi9mdGxhCQlGVEwgb24gZmlyc3QgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlCiAJCSAxNiA9IC9kZXYvZnRsYgkJRlRMIG9uIHNlY29uZCBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2UKIAkJIDMyID0gL2Rldi9mdGxjCQlGVEwgb24gdGhpcmQgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlCiAJCSAgICAuLi4KLQkJMjQwID0gL2Rldi9mdGxwCQlGVEwgb24gMTZ0aCBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2UgCisJCTI0MCA9IC9kZXYvZnRscAkJRlRMIG9uIDE2dGggTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlCiAKIAkJUGFydGl0aW9ucyBhcmUgaGFuZGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgZm9yIElERQogCQlkaXNrcyAoc2VlIG1ham9yIG51bWJlciAzKSBleGNlcHQgdGhhdCB0aGUgcGFydGl0aW9uCkBAIC05NTgsNiArOTc1LDcgQEAKIAkJMTkxID0gL2Rldi9pcHBwNjMJNjR0aCBTeW5jUFBQIGRldmljZQogCiAJCTI1NSA9IC9kZXYvaXNkbmluZm8JSVNETiBtb25pdG9yIGludGVyZmFjZQorCiAgNDUgYmxvY2sJUGFyYWxsZWwgcG9ydCBJREUgZGlzayBkZXZpY2VzCiAJCSAgMCA9IC9kZXYvcGRhCQlGaXJzdCBwYXJhbGxlbCBwb3J0IElERSBkaXNrCiAJCSAxNiA9IC9kZXYvcGRiCQlTZWNvbmQgcGFyYWxsZWwgcG9ydCBJREUgZGlzawpAQCAtMTA0NCw2ICsxMDYyLDcgQEAKIAkJICAxID0gL2Rldi9kY2JyaTEJU2Vjb25kIERhdGFDb21tIGNhcmQKIAkJICAyID0gL2Rldi9kY2JyaTIJVGhpcmQgRGF0YUNvbW0gY2FyZAogCQkgIDMgPSAvZGV2L2RjYnJpMwlGb3VydGggRGF0YUNvbW0gY2FyZAorCiAgNTIgYmxvY2sJTXlsZXggREFDOTYwIFBDSSBSQUlEIGNvbnRyb2xsZXI7IGZpZnRoIGNvbnRyb2xsZXIKIAkJICAwID0gL2Rldi9yZC9jNGQwCUZpcnN0IGRpc2ssIHdob2xlIGRpc2sKIAkJICA4ID0gL2Rldi9yZC9jNGQxCVNlY29uZCBkaXNrLCB3aG9sZSBkaXNrCkBAIC0xMDkzLDcgKzExMTIsOCBAQAogCiAgNTUgY2hhcglEU1A1NjAwMSBkaWdpdGFsIHNpZ25hbCBwcm9jZXNzb3IKIAkJICAwID0gL2Rldi9kc3A1NmsJRmlyc3QgRFNQNTYwMDEKLSA1NSBibG9jawlNeWxleCBEQUM5NjAgUENJIFJBSUQgY29udHJvbGxlcjsgZWlndGggY29udHJvbGxlcgorCisgNTUgYmxvY2sJTXlsZXggREFDOTYwIFBDSSBSQUlEIGNvbnRyb2xsZXI7IGVpZ2h0aCBjb250cm9sbGVyCiAJCSAgMCA9IC9kZXYvcmQvYzdkMAlGaXJzdCBkaXNrLCB3aG9sZSBkaXNrCiAJCSAgOCA9IC9kZXYvcmQvYzdkMQlTZWNvbmQgZGlzaywgd2hvbGUgZGlzawogCQkgICAgLi4uCkBAIC0xMTMwLDYgKzExNTAsNyBAQAogCQkgIDAgPSAvZGV2L2N1cDAJCUNhbGxvdXQgZGV2aWNlIGZvciB0dHlQMAogCQkgIDEgPSAvZGV2L2N1cDEJCUNhbGxvdXQgZGV2aWNlIGZvciB0dHlQMQogCQkgICAgLi4uCisKICA1OCBibG9jawlSZXNlcnZlZCBmb3IgbG9naWNhbCB2b2x1bWUgbWFuYWdlcgogCiAgNTkgY2hhcglzZiBmaXJld2FsbCBwYWNrYWdlCkBAIC0xMTQ5LDYgKzExNzAsNyBAQAogCQlOQU1JTkcgQ09ORkxJQ1QgLS0gUFJPUE9TRUQgUkVWSVNFRCBOQU1FIC9kZXYvcnBkYTAgZXRjCiAKICA2MC02MyBjaGFyCUxPQ0FML0VYUEVSSU1FTlRBTCBVU0UKKwogIDYwLTYzIGJsb2NrCUxPQ0FML0VYUEVSSU1FTlRBTCBVU0UKIAkJQWxsb2NhdGVkIGZvciBsb2NhbC9leHBlcmltZW50YWwgdXNlLiAgRm9yIGRldmljZXMgbm90CiAJCWFzc2lnbmVkIG9mZmljaWFsIG51bWJlcnMsIHRoZXNlIHJhbmdlcyBzaG91bGQgYmUKQEAgLTE0MzQsNyArMTQ1Niw2IEBACiAJCURBQzk2MCAoc2VlIG1ham9yIG51bWJlciA0OCkgZXhjZXB0IHRoYXQgdGhlIGxpbWl0IG9uCiAJCXBhcnRpdGlvbnMgaXMgMTUuCiAKLQogIDc4IGNoYXIJUEFNIFNvZnR3YXJlJ3MgbXVsdGltb2RlbSBib2FyZHMKIAkJICAwID0gL2Rldi90dHlNMAlGaXJzdCBQQU0gbW9kZW0KIAkJICAxID0gL2Rldi90dHlNMQlTZWNvbmQgUEFNIG1vZGVtCkBAIC0xNDUwLDEzICsxNDcxLDEyIEBACiAJCURBQzk2MCAoc2VlIG1ham9yIG51bWJlciA0OCkgZXhjZXB0IHRoYXQgdGhlIGxpbWl0IG9uCiAJCXBhcnRpdGlvbnMgaXMgMTUuCiAKLQogIDc5IGNoYXIJUEFNIFNvZnR3YXJlJ3MgbXVsdGltb2RlbSBib2FyZHMgLSBhbHRlcm5hdGUgZGV2aWNlcwogCQkgIDAgPSAvZGV2L2N1bTAJCUNhbGxvdXQgZGV2aWNlIGZvciB0dHlNMAogCQkgIDEgPSAvZGV2L2N1bTEJCUNhbGxvdXQgZGV2aWNlIGZvciB0dHlNMQogCQkgICAgLi4uCiAKLSA3OSBibG9jawlDb21wYXEgSW50ZWxsaWdlbnQgRHJpdmUgQXJyYXksIGVpZ3RoIGNvbnRyb2xsZXIKKyA3OSBibG9jawlDb21wYXEgSW50ZWxsaWdlbnQgRHJpdmUgQXJyYXksIGVpZ2h0aCBjb250cm9sbGVyCiAJCSAgMCA9IC9kZXYvaWRhL2M3ZDAJRmlyc3QgbG9naWNhbCBkcml2ZSB3aG9sZSBkaXNrCiAJCSAxNiA9IC9kZXYvaWRhL2M3ZDEJU2Vjb25kIGxvZ2ljYWwgZHJpdmUgd2hvbGUgZGlzawogCQkgICAgLi4uCkBAIC0xNDY2LDcgKzE0ODYsNiBAQAogCQlEQUM5NjAgKHNlZSBtYWpvciBudW1iZXIgNDgpIGV4Y2VwdCB0aGF0IHRoZSBsaW1pdCBvbgogCQlwYXJ0aXRpb25zIGlzIDE1LgogCi0KICA4MCBjaGFyCVBob3RvbWV0cmljcyBBVDIwMCBDQ0QgY2FtZXJhCiAJCSAgMCA9IC9kZXYvYXQyMDAJUGhvdG9tZXRyaWNzIEFUMjAwIENDRCBjYW1lcmEKIApAQCAtMTY3OSw3ICsxNjk4LDcgQEAKIAkJICAxID0gL2Rldi9kY3h4MQlTZWNvbmQgY2FwdHVyZSBjYXJkCiAJCSAgICAuLi4KIAotIDk0IGJsb2NrIElCTSBTLzM5MCBEQVNEIGJsb2NrIHN0b3JhZ2UKKyA5NCBibG9jawlJQk0gUy8zOTAgREFTRCBibG9jayBzdG9yYWdlCiAgICAgCQkgIDAgPSAvZGV2L2Rhc2RhIEZpcnN0IERBU0QgZGV2aWNlLCBtYWpvcgogICAgIAkJICAxID0gL2Rldi9kYXNkYTEgRmlyc3QgREFTRCBkZXZpY2UsIGJsb2NrIDEKIAkgICAgCSAgMiA9IC9kZXYvZGFzZGEyIEZpcnN0IERBU0QgZGV2aWNlLCBibG9jayAyCkBAIC0xNjk1LDcgKzE3MTQsNyBAQAogCQkgIDEgPSAvZGV2L2lwbmF0CU5BVCBjb250cm9sIGRldmljZS9sb2cgZmlsZQogCQkgIDIgPSAvZGV2L2lwc3RhdGUJU3RhdGUgaW5mb3JtYXRpb24gbG9nIGZpbGUKIAkJICAzID0gL2Rldi9pcGF1dGgJQXV0aGVudGljYXRpb24gY29udHJvbCBkZXZpY2UvbG9nIGZpbGUKLQkJICAgIC4uLgkJCisJCSAgICAuLi4KIAogIDk2IGNoYXIJUGFyYWxsZWwgcG9ydCBBVEFQSSB0YXBlIGRldmljZXMKIAkJICAwID0gL2Rldi9wdDAJCUZpcnN0IHBhcmFsbGVsIHBvcnQgQVRBUEkgdGFwZQpAQCAtMTcwNSw3ICsxNzI0LDcgQEAKIAkJMTI5ID0gL2Rldi9ucHQxCQlTZWNvbmQgcC5wLiBBVEFQSSB0YXBlLCBubyByZXdpbmQKIAkJICAgIC4uLgogCi0gOTYgYmxvY2sgSW52ZXJzZSBOQU5EIEZsYXNoIFRyYW5zbGF0aW9uIExheWVyCisgOTYgYmxvY2sJSW52ZXJzZSBOQU5EIEZsYXNoIFRyYW5zbGF0aW9uIExheWVyCiAJCSAgMCA9IC9kZXYvaW5mdGxhIEZpcnN0IElORlRMIGxheWVyCiAJCSAxNiA9IC9kZXYvaW5mdGxiIFNlY29uZCBJTkZUTCBsYXllcgogCQkgICAgLi4uCkBAIC0xOTAwLDcgKzE5MTksNyBAQAogCQkgIDEgPSAvZGV2L2F2MQkJU2Vjb25kIEEvViBjYXJkCiAJCSAgICAuLi4KIAotMTExIGJsb2NrCUNvbXBhcSBOZXh0IEdlbmVyYXRpb24gRHJpdmUgQXJyYXksIGVpZ3RoIGNvbnRyb2xsZXIKKzExMSBibG9jawlDb21wYXEgTmV4dCBHZW5lcmF0aW9uIERyaXZlIEFycmF5LCBlaWdodGggY29udHJvbGxlcgogCQkgIDAgPSAvZGV2L2NjaXNzL2M3ZDAJRmlyc3QgbG9naWNhbCBkcml2ZSwgd2hvbGUgZGlzawogCQkgMTYgPSAvZGV2L2NjaXNzL2M3ZDEJU2Vjb25kIGxvZ2ljYWwgZHJpdmUsIHdob2xlIGRpc2sKIAkJICAgIC4uLgpAQCAtMTkzNyw3ICsxOTU2LDYgQEAKIAkJICAgIC4uLgogCiAxMTMgYmxvY2sJSUJNIGlTZXJpZXMgdmlydHVhbCBDRC1ST00KLQogCQkgIDAgPSAvZGV2L2lzZXJpZXMvdmNkYQlGaXJzdCB2aXJ0dWFsIENELVJPTQogCQkgIDEgPSAvZGV2L2lzZXJpZXMvdmNkYglTZWNvbmQgdmlydHVhbCBDRC1ST00KIAkJICAgIC4uLgpAQCAtMjA1OSwxMSArMjA3NywxMiBAQAogCQkgICAgLi4uCiAKIDExOSBjaGFyCVZNd2FyZSB2aXJ0dWFsIG5ldHdvcmsgY29udHJvbAotCQkgIDAgPSAvZGV2L3ZuZXQwCTFzdCB2aXJ0dWFsIG5ldHdvcmsKLQkJICAxID0gL2Rldi92bmV0MQkybmQgdmlydHVhbCBuZXR3b3JrCisJCSAgMCA9IC9kZXYvdm1uZXQwCTFzdCB2aXJ0dWFsIG5ldHdvcmsKKwkJICAxID0gL2Rldi92bW5ldDEJMm5kIHZpcnR1YWwgbmV0d29yawogCQkgICAgLi4uCiAKIDEyMC0xMjcgY2hhcglMT0NBTC9FWFBFUklNRU5UQUwgVVNFCisKIDEyMC0xMjcgYmxvY2sJTE9DQUwvRVhQRVJJTUVOVEFMIFVTRQogCQlBbGxvY2F0ZWQgZm9yIGxvY2FsL2V4cGVyaW1lbnRhbCB1c2UuICBGb3IgZGV2aWNlcyBub3QKIAkJYXNzaWduZWQgb2ZmaWNpYWwgbnVtYmVycywgdGhlc2UgcmFuZ2VzIHNob3VsZCBiZQpAQCAtMjA3NSw3ICsyMDk0LDYgQEAKIAkJbm9kZXM7IGluc3RlYWQgdGhleSBzaG91bGQgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUKIAkJL2Rldi9wdG14IGNsb25pbmcgaW50ZXJmYWNlLgogCi0KIDEyOCBibG9jayAgICAgICBTQ1NJIGRpc2sgZGV2aWNlcyAoMTI4LTE0MykKICAgICAgICAgICAgICAgICAgIDAgPSAvZGV2L3NkZHkgICAgICAgICAxMjl0aCBTQ1NJIGRpc2sgd2hvbGUgZGlzawogICAgICAgICAgICAgICAgICAxNiA9IC9kZXYvc2RkeiAgICAgICAgIDEzMHRoIFNDU0kgZGlzayB3aG9sZSBkaXNrCkBAIC0yMDg3LDcgKzIxMDUsNiBAQAogCQlkaXNrcyAoc2VlIG1ham9yIG51bWJlciAzKSBleGNlcHQgdGhhdCB0aGUgbGltaXQgb24KIAkJcGFydGl0aW9ucyBpcyAxNS4KIAotCiAxMjkgYmxvY2sgICAgICAgU0NTSSBkaXNrIGRldmljZXMgKDE0NC0xNTkpCiAgICAgICAgICAgICAgICAgICAwID0gL2Rldi9zZGVvICAgICAgICAgMTQ1dGggU0NTSSBkaXNrIHdob2xlIGRpc2sKICAgICAgICAgICAgICAgICAgMTYgPSAvZGV2L3NkZXAgICAgICAgICAxNDZ0aCBTQ1NJIGRpc2sgd2hvbGUgZGlzawpAQCAtMjEyMyw3ICsyMTQwLDYgQEAKIAkJZGlza3MgKHNlZSBtYWpvciBudW1iZXIgMykgZXhjZXB0IHRoYXQgdGhlIGxpbWl0IG9uCiAJCXBhcnRpdGlvbnMgaXMgMTUuCiAKLQogMTMyIGJsb2NrICAgICAgIFNDU0kgZGlzayBkZXZpY2VzICgxOTItMjA3KQogICAgICAgICAgICAgICAgICAgMCA9IC9kZXYvc2RnayAgICAgICAgIDE5M3JkIFNDU0kgZGlzayB3aG9sZSBkaXNrCiAgICAgICAgICAgICAgICAgIDE2ID0gL2Rldi9zZGdsICAgICAgICAgMTk0dGggU0NTSSBkaXNrIHdob2xlIGRpc2sKQEAgLTIxMzUsNyArMjE1MSw2IEBACiAJCWRpc2tzIChzZWUgbWFqb3IgbnVtYmVyIDMpIGV4Y2VwdCB0aGF0IHRoZSBsaW1pdCBvbgogCQlwYXJ0aXRpb25zIGlzIDE1LgogCi0KIDEzMyBibG9jayAgICAgICBTQ1NJIGRpc2sgZGV2aWNlcyAoMjA4LTIyMykKICAgICAgICAgICAgICAgICAgIDAgPSAvZGV2L3NkaGEgICAgICAgICAyMDl0aCBTQ1NJIGRpc2sgd2hvbGUgZGlzawogICAgICAgICAgICAgICAgICAxNiA9IC9kZXYvc2RoYiAgICAgICAgIDIxMHRoIFNDU0kgZGlzayB3aG9sZSBkaXNrCkBAIC0yMTQ3LDcgKzIxNjIsNiBAQAogCQlkaXNrcyAoc2VlIG1ham9yIG51bWJlciAzKSBleGNlcHQgdGhhdCB0aGUgbGltaXQgb24KIAkJcGFydGl0aW9ucyBpcyAxNS4KIAotCiAxMzQgYmxvY2sgICAgICAgU0NTSSBkaXNrIGRldmljZXMgKDIyNC0yMzkpCiAgICAgICAgICAgICAgICAgICAwID0gL2Rldi9zZGhxICAgICAgICAgMjI1dGggU0NTSSBkaXNrIHdob2xlIGRpc2sKICAgICAgICAgICAgICAgICAgMTYgPSAvZGV2L3NkaHIgICAgICAgICAyMjZ0aCBTQ1NJIGRpc2sgd2hvbGUgZGlzawpAQCAtMjE1OSw3ICsyMTczLDYgQEAKIAkJZGlza3MgKHNlZSBtYWpvciBudW1iZXIgMykgZXhjZXB0IHRoYXQgdGhlIGxpbWl0IG9uCiAJCXBhcnRpdGlvbnMgaXMgMTUuCiAKLQogMTM1IGJsb2NrICAgICAgIFNDU0kgZGlzayBkZXZpY2VzICgyNDAtMjU1KQogICAgICAgICAgICAgICAgICAgMCA9IC9kZXYvc2RpZyAgICAgICAgIDI0MXN0IFNDU0kgZGlzayB3aG9sZSBkaXNrCiAgICAgICAgICAgICAgICAgIDE2ID0gL2Rldi9zZGloICAgICAgICAgMjQybmQgU0NTSSBkaXNrIHdob2xlIGRpc2sKQEAgLTIxNzEsNyArMjE4NCw2IEBACiAJCWRpc2tzIChzZWUgbWFqb3IgbnVtYmVyIDMpIGV4Y2VwdCB0aGF0IHRoZSBsaW1pdCBvbgogCQlwYXJ0aXRpb25zIGlzIDE1LgogCi0KIDEzNi0xNDMgY2hhcglVbml4OTggUFRZIHNsYXZlcwogCQkgIDAgPSAvZGV2L3B0cy8wCUZpcnN0IFVuaXg5OCBwc2V1ZG8tVFRZCiAJCSAgMSA9IC9kZXYvcHRzLzEJU2Vjb25kIFVuaXg5OCBwZXN1ZG8tVFRZCkBAIC0yMzg0LDYgKzIzOTYsNyBAQAogCQkgICAgLi4uCiAKIDE1OSBjaGFyCVJFU0VSVkVECisKIDE1OSBibG9jawlSRVNFUlZFRAogCiAxNjAgY2hhcglHZW5lcmFsIFB1cnBvc2UgSW5zdHJ1bWVudCBCdXMgKEdQSUIpCkBAIC0yNDI3LDcgKzI0NDAsNyBAQAogCiAJCVBhcnRpdGlvbnMgYXJlIGhhbmRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGZvciBJREUKIAkJZGlza3MgKHNlZSBtYWpvciBudW1iZXIgMykgZXhjZXB0IHRoYXQgdGhlIGxpbWl0IG9uCi0JCXBhcnRpdGlvbnMgaXMgMzEuIAorCQlwYXJ0aXRpb25zIGlzIDMxLgogCiAxNjIgY2hhcglSYXcgYmxvY2sgZGV2aWNlIGludGVyZmFjZQogCQkgIDAgPSAvZGV2L3Jhd2N0bAlSYXcgSS9PIGNvbnRyb2wgZGV2aWNlCkBAIC0yNDgzLDcgKzI0OTYsNiBAQAogCiAxNzEgY2hhcglSZXNlcnZlZCBmb3IgSUVFRSAxMzk0IChGaXJld2lyZSkKIAotCiAxNzIgY2hhcglNb3hhIEludGVsbGlvIHNlcmlhbCBjYXJkCiAJCSAgMCA9IC9kZXYvdHR5TVgwCUZpcnN0IE1veGEgcG9ydAogCQkgIDEgPSAvZGV2L3R0eU1YMQlTZWNvbmQgTW94YSBwb3J0CkBAIC0yNTQzLDkgKzI1NTUsNiBAQAogCQkgNjQgPSAvZGV2L3VzYi9yaW81MDAJRGlhbW9uZCBSaW8gNTAwCiAJCSA2NSA9IC9kZXYvdXNiL3VzYmxjZAlVU0JMQ0QgSW50ZXJmYWNlIChpbmZvQHVzYmxjZC5kZSkKIAkJIDY2ID0gL2Rldi91c2IvY3BhZDAJU3luYXB0aWNzIGNQYWQgKG1vdXNlL0xDRCkKLQkJIDY3ID0gL2Rldi91c2IvYWR1dHV4MAkxc3QgT250cmFrIEFEVSBkZXZpY2UKLQkJICAgIC4uLgotCQkgNzYgPSAvZGV2L3VzYi9hZHV0dXgxMAkxMHRoIE9udHJhayBBRFUgZGV2aWNlCiAJCSA5NiA9IC9kZXYvdXNiL2hpZGRldjAJMXN0IFVTQiBISUQgZGV2aWNlCiAJCSAgICAuLi4KIAkJMTExID0gL2Rldi91c2IvaGlkZGV2MTUJMTZ0aCBVU0IgSElEIGRldmljZQpAQCAtMjU1OCw3ICsyNTY3LDcgQEAKIAkJMTMyID0gL2Rldi91c2IvaWRtb3VzZQlJRCBNb3VzZSAoZmluZ2VycHJpbnQgc2Nhbm5lcikgZGV2aWNlCiAJCTEzMyA9IC9kZXYvdXNiL3Npc3VzYnZnYTEJRmlyc3QgU2lTVVNCIFZHQSBkZXZpY2UKIAkJICAgIC4uLgotCQkxNDAgPSAvZGV2L3VzYi9zaXN1c2J2Z2E4CUVpZ3RoIFNJU1VTQiBWR0EgZGV2aWNlCisJCTE0MCA9IC9kZXYvdXNiL3Npc3VzYnZnYTgJRWlnaHRoIFNJU1VTQiBWR0EgZGV2aWNlCiAJCTE0NCA9IC9kZXYvdXNiL2xjZAlVU0IgTENEIGRldmljZQogCQkxNjAgPSAvZGV2L3VzYi9sZWdvdXNidG93ZXIwCTFzdCBVU0IgTGVnb3Rvd2VyIGRldmljZQogCQkgICAgLi4uCkBAIC0yNTcxLDcgKzI1ODAsNyBAQAogCQkgIDAgPSAvZGV2L3ViYQkJRmlyc3QgVVNCIGJsb2NrIGRldmljZQogCQkgIDggPSAvZGV2L3ViYgkJU2Vjb25kIFVTQiBibG9jayBkZXZpY2UKIAkJIDE2ID0gL2Rldi91YmMJCVRoaXJkIFVTQiBibG9jayBkZXZpY2UKLQkJICAgIC4uLgorIAkJICAgIC4uLgogCiAxODEgY2hhcglDb25yYWQgRWxlY3Ryb25pYyBwYXJhbGxlbCBwb3J0IHJhZGlvIGNsb2NrcwogCQkgIDAgPSAvZGV2L3BjZmNsb2NrMAlGaXJzdCBDb25yYWQgcmFkaW8gY2xvY2sKQEAgLTI2NTcsNyArMjY2Niw3IEBACiAJCSAzMiA9IC9kZXYvbXZpZGVvL3N0YXR1czIJVGhpcmQgZGV2aWNlCiAJCSAgICAuLi4KIAkJICAgIC4uLgotCQkyNDAgPSAvZGV2L212aWRlby9zdGF0dXMxNQkxNnRoIGRldmljZSAKKwkJMjQwID0gL2Rldi9tdmlkZW8vc3RhdHVzMTUJMTZ0aCBkZXZpY2UKIAkJICAgIC4uLgogCiAxOTUgY2hhcglOdmlkaWEgZ3JhcGhpY3MgZGV2aWNlcwpAQCAtMjc5NSw2ICsyODA0LDEwIEBACiAJCSAgICAuLi4KIAkJIDE4NSA9IC9kZXYvdHR5TlgxNQkJSGlsc2NoZXIgbmV0WCBzZXJpYWwgcG9ydCAxNQogCQkgMTg2ID0gL2Rldi90dHlKMAkJSlRBRzEgRENDIHByb3RvY29sIGJhc2VkIHNlcmlhbCBwb3J0IGVtdWxhdGlvbgorCQkgMTg3ID0gL2Rldi90dHlVTDAJCVhpbGlueCB1YXJ0bGl0ZSAtIHBvcnQgMAorCQkgICAgLi4uCisJCSAxOTAgPSAvZGV2L3R0eVVMMwkJWGlsaW54IHVhcnRsaXRlIC0gcG9ydCAzCisJCSAxOTEgPSAvZGV2L3h2YzAJCVhlbiB2aXJ0dWFsIGNvbnNvbGUgLSBwb3J0IDAKIAogMjA1IGNoYXIJTG93LWRlbnNpdHkgc2VyaWFsIHBvcnRzIChhbHRlcm5hdGUgZGV2aWNlKQogCQkgIDAgPSAvZGV2L2N1bHUwCQlDYWxsb3V0IGRldmljZSBmb3IgdHR5TFUwCkBAIC0yODMyLDcgKzI4NDUsNiBAQAogCQkgODIgPSAvZGV2L2N1dnIwCQlDYWxsb3V0IGRldmljZSBmb3IgdHR5VlIwCiAJCSA4MyA9IC9kZXYvY3V2cjEJCUNhbGxvdXQgZGV2aWNlIGZvciB0dHlWUjEKIAotCiAyMDYgY2hhcglPblN0cmVhbSBTQy14MCB0YXBlIGRldmljZXMKIAkJICAwID0gL2Rldi9vc3N0MAkJRmlyc3QgT25TdHJlYW0gU0NTSSB0YXBlLCBtb2RlIDAKIAkJICAxID0gL2Rldi9vc3N0MQkJU2Vjb25kIE9uU3RyZWFtIFNDU0kgdGFwZSwgbW9kZSAwCkBAIC0yOTIyLDcgKzI5MzQsNiBAQAogCQkgICAgLi4uCiAKIDIxMiBjaGFyCUxpbnV4VFYub3JnIERWQiBkcml2ZXIgc3Vic3lzdGVtCi0KIAkJICAwID0gL2Rldi9kdmIvYWRhcHRlcjAvdmlkZW8wICAgIGZpcnN0IHZpZGVvIGRlY29kZXIgb2YgZmlyc3QgY2FyZAogCQkgIDEgPSAvZGV2L2R2Yi9hZGFwdGVyMC9hdWRpbzAgICAgZmlyc3QgYXVkaW8gZGVjb2RlciBvZiBmaXJzdCBjYXJkCiAJCSAgMiA9IC9kZXYvZHZiL2FkYXB0ZXIwL3NlYzAgICAgICAob2Jzb2xldGUvdW51c2VkKQpAQCAtMzAwOCw5ICszMDE5LDkgQEAKIAkJICAyID0gL2Rldi8zMjcwL3R1YjIJCVNlY29uZCAzMjcwIHRlcm1pbmFsCiAJCSAgICAuLi4KIAotMjI5IGNoYXIJSUJNIGlTZXJpZXMgdmlydHVhbCBjb25zb2xlCi0JCSAgMCA9IC9kZXYvaXNlcmllcy92dHR5MAlGaXJzdCBjb25zb2xlIHBvcnQKLQkJICAxID0gL2Rldi9pc2VyaWVzL3Z0dHkxCVNlY29uZCBjb25zb2xlIHBvcnQKKzIyOSBjaGFyCUlCTSBpU2VyaWVzL3BTZXJpZXMgdmlydHVhbCBjb25zb2xlCisJCSAgMCA9IC9kZXYvaHZjMAkJCUZpcnN0IGNvbnNvbGUgcG9ydAorCQkgIDEgPSAvZGV2L2h2YzEJCQlTZWNvbmQgY29uc29sZSBwb3J0CiAJCSAgICAuLi4KIAogMjMwIGNoYXIJSUJNIGlTZXJpZXMgdmlydHVhbCB0YXBlCkBAIC0zMDgzLDEyICszMDk0LDE0IEBACiAyMzQtMjM5CQlVTkFTU0lHTkVECiAKIDI0MC0yNTQgY2hhcglMT0NBTC9FWFBFUklNRU5UQUwgVVNFCisKIDI0MC0yNTQgYmxvY2sJTE9DQUwvRVhQRVJJTUVOVEFMIFVTRQogCQlBbGxvY2F0ZWQgZm9yIGxvY2FsL2V4cGVyaW1lbnRhbCB1c2UuICBGb3IgZGV2aWNlcyBub3QKIAkJYXNzaWduZWQgb2ZmaWNpYWwgbnVtYmVycywgdGhlc2UgcmFuZ2VzIHNob3VsZCBiZQogCQl1c2VkIGluIG9yZGVyIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGggZnV0dXJlIGFzc2lnbm1lbnRzLgogCiAyNTUgY2hhcglSRVNFUlZFRAorCiAyNTUgYmxvY2sJUkVTRVJWRUQKIAogCQlUaGlzIG1ham9yIGlzIHJlc2VydmVkIHRvIGFzc2lzdCB0aGUgZXhwYW5zaW9uIHRvIGEKQEAgLTMxMTUsNyArMzEyOCwyMCBAQAogMjU3IGNoYXIJUGhvZW5peCBUZWNobm9sb2dpZXMgQ3J5cHRvZ3JhcGhpYyBTZXJ2aWNlcyBEcml2ZXIKIAkJICAwID0gL2Rldi9wdGxzZWMJQ3J5cHRvIFNlcnZpY2VzIERyaXZlcgogCisyNTcgYmxvY2sJU1NGREMgRmxhc2ggVHJhbnNsYXRpb24gTGF5ZXIgZmlsZXN5c3RlbQorCQkgIDAgPSAvZGV2L3NzZmRjYQlGaXJzdCBTU0ZEQyBsYXllcgorCQkgIDggPSAvZGV2L3NzZmRjYglTZWNvbmQgU1NGREMgbGF5ZXIKKwkJIDE2ID0gL2Rldi9zc2ZkY2MJVGhpcmQgU1NGREMgbGF5ZXIKKwkJIDI0ID0gL2Rldi9zc2ZkY2QJNHRoIFNTRkRDIGxheWVyCisJCSAzMiA9IC9kZXYvc3NmZGNlCTV0aCBTU0ZEQyBsYXllcgorCQkgNDAgPSAvZGV2L3NzZmRjZgk2dGggU1NGREMgbGF5ZXIKKwkJIDQ4ID0gL2Rldi9zc2ZkY2cJN3RoIFNTRkRDIGxheWVyCisJCSA1NiA9IC9kZXYvc3NmZGNoCTh0aCBTU0ZEQyBsYXllcgogCisyNTggYmxvY2sJUk9NL0ZsYXNoIHJlYWQtb25seSB0cmFuc2xhdGlvbiBsYXllcgorCQkgIDAgPSAvZGV2L2Jsb2Nrcm9tMAlGaXJzdCBST00gY2FyZCdzIHRyYW5zbGF0aW9uIGxheWVyIGludGVyZmFjZQorCQkgIDEgPSAvZGV2L2Jsb2Nrcm9tMQlTZWNvbmQgUk9NIGNhcmQncyB0cmFuc2xhdGlvbiBsYXllciBpbnRlcmZhY2UKKwkJICAuLi4KIAogICoqKioJQURESVRJT05BTCAvZGV2IERJUkVDVE9SWSBFTlRSSUVTCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BsYXRmb3JtLnR4dCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BsYXRmb3JtLnR4dAppbmRleCA1ZWVlM2UwLi45ZjBiYzNiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9wbGF0Zm9ybS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvcGxhdGZvcm0udHh0CkBAIC0xLDk5ICsxLDEzMSBAQAogUGxhdGZvcm0gRGV2aWNlcyBhbmQgRHJpdmVycwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorU2VlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4gZm9yIHRoZSBkcml2ZXIgbW9kZWwgaW50ZXJmYWNlIHRvIHRoZQorcGxhdGZvcm0gYnVzOiAgcGxhdGZvcm1fZGV2aWNlLCBhbmQgcGxhdGZvcm1fZHJpdmVyLiAgVGhpcyBwc2V1ZG8tYnVzCitpcyB1c2VkIHRvIGNvbm5lY3QgZGV2aWNlcyBvbiBidXNzZXMgd2l0aCBtaW5pbWFsIGluZnJhc3RydWN0dXJlLAorbGlrZSB0aG9zZSB1c2VkIHRvIGludGVncmF0ZSBwZXJpcGhlcmFscyBvbiBtYW55IHN5c3RlbS1vbi1jaGlwCitwcm9jZXNzb3JzLCBvciBzb21lICJsZWdhY3kiIFBDIGludGVyY29ubmVjdHM7IGFzIG9wcG9zZWQgdG8gbGFyZ2UKK2Zvcm1hbGx5IHNwZWNpZmllZCBvbmVzIGxpa2UgUENJIG9yIFVTQi4KKwogCiBQbGF0Zm9ybSBkZXZpY2VzCiB+fn5+fn5+fn5+fn5+fn5+CiBQbGF0Zm9ybSBkZXZpY2VzIGFyZSBkZXZpY2VzIHRoYXQgdHlwaWNhbGx5IGFwcGVhciBhcyBhdXRvbm9tb3VzCiBlbnRpdGllcyBpbiB0aGUgc3lzdGVtLiBUaGlzIGluY2x1ZGVzIGxlZ2FjeSBwb3J0LWJhc2VkIGRldmljZXMgYW5kCi1ob3N0IGJyaWRnZXMgdG8gcGVyaXBoZXJhbCBidXNlcy4gCitob3N0IGJyaWRnZXMgdG8gcGVyaXBoZXJhbCBidXNlcywgYW5kIG1vc3QgY29udHJvbGxlcnMgaW50ZWdyYXRlZAoraW50byBzeXN0ZW0tb24tY2hpcCBwbGF0Zm9ybXMuICBXaGF0IHRoZXkgdXN1YWxseSBoYXZlIGluIGNvbW1vbgoraXMgZGlyZWN0IGFkZHJlc3NpbmcgZnJvbSBhIENQVSBidXMuICBSYXJlbHksIGEgcGxhdGZvcm1fZGV2aWNlIHdpbGwKK2JlIGNvbm5lY3RlZCB0aHJvdWdoIGEgc2VnbWVudCBvZiBzb21lIG90aGVyIGtpbmQgb2YgYnVzOyBidXQgaXRzCityZWdpc3RlcnMgd2lsbCBzdGlsbCBiZSBkaXJlY3RseSBhZGRyZXNzaWJsZS4KKworUGxhdGZvcm0gZGV2aWNlcyBhcmUgZ2l2ZW4gYSBuYW1lLCB1c2VkIGluIGRyaXZlciBiaW5kaW5nLCBhbmQgYQorbGlzdCBvZiByZXNvdXJjZXMgc3VjaCBhcyBhZGRyZXNzZXMgYW5kIElSUXMuCisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdTMyCQlpZDsKKwlzdHJ1Y3QgZGV2aWNlCWRldjsKKwl1MzIJCW51bV9yZXNvdXJjZXM7CisJc3RydWN0IHJlc291cmNlCSpyZXNvdXJjZTsKK307CiAKIAogUGxhdGZvcm0gZHJpdmVycwogfn5+fn5+fn5+fn5+fn5+fgotRHJpdmVycyBmb3IgcGxhdGZvcm0gZGV2aWNlcyBhcmUgdHlwaWNhbGx5IHZlcnkgc2ltcGxlIGFuZAotdW5zdHJ1Y3R1cmVkLiBFaXRoZXIgdGhlIGRldmljZSB3YXMgcHJlc2VudCBhdCBhIHBhcnRpY3VsYXIgSS9PIHBvcnQKLWFuZCB0aGUgZHJpdmVyIHdhcyBsb2FkZWQsIG9yIGl0IHdhcyBub3QuIFRoZXJlIHdhcyBubyBwb3NzaWJpbGl0eQotb2YgaG90cGx1Z2dpbmcgb3IgYWx0ZXJuYXRpdmUgZGlzY292ZXJ5IGJlc2lkZXMgcHJvYmluZyBhdCBhIHNwZWNpZmljCi1JL08gYWRkcmVzcyBhbmQgZXhwZWN0aW5nIGEgc3BlY2lmaWMgcmVzcG9uc2UuCitQbGF0Zm9ybSBkcml2ZXJzIGZvbGxvdyB0aGUgc3RhbmRhcmQgZHJpdmVyIG1vZGVsIGNvbnZlbnRpb24sIHdoZXJlCitkaXNjb3ZlcnkvZW51bWVyYXRpb24gaXMgaGFuZGxlZCBvdXRzaWRlIHRoZSBkcml2ZXJzLCBhbmQgZHJpdmVycworcHJvdmlkZSBwcm9iZSgpIGFuZCByZW1vdmUoKSBtZXRob2RzLiAgVGhleSBzdXBwb3J0IHBvd2VyIG1hbmFnZW1lbnQKK2FuZCBzaHV0ZG93biBub3RpZmljYXRpb25zIHVzaW5nIHRoZSBzdGFuZGFyZCBjb252ZW50aW9ucy4KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciB7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOworCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqc3VzcGVuZF9sYXRlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lX2Vhcmx5KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOworCWludCAoKnJlc3VtZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7Cit9OworCitOb3RlIHRoYXQgcHJvYmUoKSBzaG91bGQgZ2VuZXJhbCB2ZXJpZnkgdGhhdCB0aGUgc3BlY2lmaWVkIGRldmljZSBoYXJkd2FyZQorYWN0dWFsbHkgZXhpc3RzOyBzb21ldGltZXMgcGxhdGZvcm0gc2V0dXAgY29kZSBjYW4ndCBiZSBzdXJlLiAgVGhlIHByb2JpbmcKK2NhbiB1c2UgZGV2aWNlIHJlc291cmNlcywgaW5jbHVkaW5nIGNsb2NrcywgYW5kIGRldmljZSBwbGF0Zm9ybV9kYXRhLgorCitQbGF0Zm9ybSBkcml2ZXJzIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgdGhlIG5vcm1hbCB3YXk6CisKKwlpbnQgcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKmRydik7CisKK09yLCBpbiBjb21tb24gc2l0dWF0aW9ucyB3aGVyZSB0aGUgZGV2aWNlIGlzIGtub3duIG5vdCB0byBiZSBob3QtcGx1Z2dhYmxlLAordGhlIHByb2JlKCkgcm91dGluZSBjYW4gbGl2ZSBpbiBhbiBpbml0IHNlY3Rpb24gdG8gcmVkdWNlIHRoZSBkcml2ZXIncworcnVudGltZSBtZW1vcnkgZm9vdHByaW50OgorCisJaW50IHBsYXRmb3JtX2RyaXZlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpkcnYsCisJCQkgIGludCAoKnByb2JlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopKQogCiAKLU90aGVyIEFyY2hpdGVjdHVyZXMsIE1vZGVybiBGaXJtd2FyZSwgYW5kIG5ldyBQbGF0Zm9ybXMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLVRoZXNlIGRldmljZXMgYXJlIG5vdCBhbHdheXMgYXQgdGhlIGxlZ2FjeSBJL08gcG9ydHMuIFRoaXMgaXMgdHJ1ZSBvbgotb3RoZXIgYXJjaGl0ZWN0dXJlcyBhbmQgb24gc29tZSBtb2Rlcm4gYXJjaGl0ZWN0dXJlcy4gSW4gbW9zdCBjYXNlcywKLXRoZSBkcml2ZXJzIGFyZSBtb2RpZmllZCB0byBkaXNjb3ZlciB0aGUgZGV2aWNlcyBhdCBvdGhlciB3ZWxsLWtub3duCi1wb3J0cyBmb3IgdGhlIGdpdmVuIHBsYXRmb3JtLiBIb3dldmVyLCB0aGUgZmlybXdhcmUgaW4gdGhlc2Ugc3lzdGVtcwotZG9lcyB1c3VhbGx5IGtub3cgd2hlcmUgZXhhY3RseSB0aGVzZSBkZXZpY2VzIHJlc2lkZSwgYW5kIGluIHNvbWUKLWNhc2VzLCBpdCdzIHRoZSBvbmx5IHdheSBvZiBkaXNjb3ZlcmluZyB0aGVtLiAKK0RldmljZSBFbnVtZXJhdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+CitBcyBhIHJ1bGUsIHBsYXRmb3JtIHNwZWNpZmljIChhbmQgb2Z0ZW4gYm9hcmQtc3BlY2lmaWMpIHNldHVwIGNvZGUgd2lsCityZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2VzOgorCisJaW50IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKworCWludCBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqcGRldnMsIGludCBuZGV2KTsKKworVGhlIGdlbmVyYWwgcnVsZSBpcyB0byByZWdpc3RlciBvbmx5IHRob3NlIGRldmljZXMgdGhhdCBhY3R1YWxseSBleGlzdCwKK2J1dCBpbiBzb21lIGNhc2VzIGV4dHJhIGRldmljZXMgbWlnaHQgYmUgcmVnaXN0ZXJlZC4gIEZvciBleGFtcGxlLCBhIGtlcm5lbAorbWlnaHQgYmUgY29uZmlndXJlZCB0byB3b3JrIHdpdGggYW4gZXh0ZXJuYWwgbmV0d29yayBhZGFwdGVyIHRoYXQgbWlnaHQgbm90CitiZSBwb3B1bGF0ZWQgb24gYWxsIGJvYXJkcywgb3IgbGlrZXdpc2UgdG8gd29yayB3aXRoIGFuIGludGVncmF0ZWQgY29udHJvbGxlcgordGhhdCBzb21lIGJvYXJkcyBtaWdodCBub3QgaG9vayB1cCB0byBhbnkgcGVyaXBoZXJhbHMuCisKK0luIHNvbWUgY2FzZXMsIGJvb3QgZmlybXdhcmUgd2lsbCBleHBvcnQgdGFibGVzIGRlc2NyaWJpbmcgdGhlIGRldmljZXMKK3RoYXQgYXJlIHBvcHVsYXRlZCBvbiBhIGdpdmVuIGJvYXJkLiAgIFdpdGhvdXQgc3VjaCB0YWJsZXMsIG9mdGVuIHRoZQorb25seSB3YXkgZm9yIHN5c3RlbSBzZXR1cCBjb2RlIHRvIHNldCB1cCB0aGUgY29ycmVjdCBkZXZpY2VzIGlzIHRvIGJ1aWxkCithIGtlcm5lbCBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYm9hcmQuICBTdWNoIGJvYXJkLXNwZWNpZmljIGtlcm5lbHMgYXJlCitjb21tb24gd2l0aCBlbWJlZGRlZCBhbmQgY3VzdG9tIHN5c3RlbXMgZGV2ZWxvcG1lbnQuCisKK0luIG1hbnkgY2FzZXMsIHRoZSBtZW1vcnkgYW5kIElSUSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbGF0Zm9ybQorZGV2aWNlIGFyZSBub3QgZW5vdWdoIHRvIGxldCB0aGUgZGV2aWNlJ3MgZHJpdmVyIHdvcmsuICBCb2FyZCBzZXR1cCBjb2RlCit3aWxsIG9mdGVuIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB1c2luZyB0aGUgZGV2aWNlJ3MgcGxhdGZvcm1fZGF0YQorZmllbGQgdG8gaG9sZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorCitFbWJlZGRlZCBzeXN0ZW1zIGZyZXF1ZW50bHkgbmVlZCBvbmUgb3IgbW9yZSBjbG9ja3MgZm9yIHBsYXRmb3JtIGRldmljZXMsCit3aGljaCBhcmUgbm9ybWFsbHkga2VwdCBvZmYgdW50aWwgdGhleSdyZSBhY3RpdmVseSBuZWVkZWQgKHRvIHNhdmUgcG93ZXIpLgorU3lzdGVtIHNldHVwIGFsc28gYXNzb2NpYXRlcyB0aG9zZSBjbG9ja3Mgd2l0aCB0aGUgZGV2aWNlLCBzbyB0aGF0IHRoYXQKK2NhbGxzIHRvIGNsa19nZXQoJnBkZXYtPmRldiwgY2xvY2tfbmFtZSkgcmV0dXJuIHRoZW0gYXMgbmVlZGVkLgogCiAKLVRoZSBQbGF0Zm9ybSBCdXMKLX5+fn5+fn5+fn5+fn5+fn4KLUEgcGxhdGZvcm0gYnVzIGhhcyBiZWVuIGNyZWF0ZWQgdG8gZGVhbCB3aXRoIHRoZXNlIGlzc3Vlcy4gRmlyc3QgYW5kCi1mb3JlbW9zdCwgaXQgZ3JvdXBzIGFsbCB0aGUgbGVnYWN5IGRldmljZXMgdW5kZXIgYSBjb21tb24gYnVzLCBhbmQKLWdpdmVzIHRoZW0gYSBjb21tb24gcGFyZW50IGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gCitEZXZpY2UgTmFtaW5nIGFuZCBEcml2ZXIgQmluZGluZworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1RoZSBwbGF0Zm9ybV9kZXZpY2UuZGV2LmJ1c19pZCBpcyB0aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBkZXZpY2VzLgorSXQncyBidWlsdCBmcm9tIHR3byBjb21wb25lbnRzOgogCi1CdXQsIGJlc2lkZXMgdGhlIG9yZ2FuaXphdGlvbmFsIGJlbmVmaXRzLCB0aGUgcGxhdGZvcm0gYnVzIGNhbiBhbHNvCi1hY2NvbW1vZGF0ZSBmaXJtd2FyZS1iYXNlZCBlbnVtZXJhdGlvbi4gCisgICAgKiBwbGF0Zm9ybV9kZXZpY2UubmFtZSAuLi4gd2hpY2ggaXMgYWxzbyB1c2VkIHRvIGZvciBkcml2ZXIgbWF0Y2hpbmcuCiAKKyAgICAqIHBsYXRmb3JtX2RldmljZS5pZCAuLi4gdGhlIGRldmljZSBpbnN0YW5jZSBudW1iZXIsIG9yIGVsc2UgIi0xIgorICAgICAgdG8gaW5kaWNhdGUgdGhlcmUncyBvbmx5IG9uZS4KIAotRGV2aWNlIERpc2NvdmVyeQotfn5+fn5+fn5+fn5+fn5+fgotVGhlIHBsYXRmb3JtIGJ1cyBoYXMgbm8gY29uY2VwdCBvZiBwcm9iaW5nIGZvciBkZXZpY2VzLiBEZXZpY2VzCi1kaXNjb3ZlcnkgaXMgbGVmdCB1cCB0byBlaXRoZXIgdGhlIGxlZ2FjeSBkcml2ZXJzIG9yIHRoZQotZmlybXdhcmUuIFRoZXNlIGVudGl0aWVzIGFyZSBleHBlY3RlZCB0byBub3RpZnkgdGhlIHBsYXRmb3JtIG9mCi1kZXZpY2VzIHRoYXQgaXQgZGlzY292ZXJzIHZpYSB0aGUgYnVzJ3MgYWRkKCkgY2FsbGJhY2s6CitUaGVzZSBhcmUgY2F0ZW5hdGVkLCBzbyBuYW1lL2lkICJzZXJpYWwiLzAgaW5kaWNhdGVzIGJ1c19pZCAic2VyaWFsLjAiLCBhbmQKKyJzZXJpYWwvMyIgaW5kaWNhdGVzIGJ1c19pZCAic2VyaWFsLjMiOyBib3RoIHdvdWxkIHVzZSB0aGUgcGxhdGZvcm1fZHJpdmVyCituYW1lZCAic2VyaWFsIi4gIFdoaWxlICJteV9ydGMiLy0xIHdvdWxkIGJlIGJ1c19pZCAibXlfcnRjIiAobm8gaW5zdGFuY2UgaWQpCithbmQgdXNlIHRoZSBwbGF0Zm9ybV9kcml2ZXIgY2FsbGVkICJteV9ydGMiLgogCi0JcGxhdGZvcm1fYnVzLmFkZChwYXJlbnQsYnVzX2lkKS4KK0RyaXZlciBiaW5kaW5nIGlzIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBkcml2ZXIgY29yZSwgaW52b2tpbmcKK2RyaXZlciBwcm9iZSgpIGFmdGVyIGZpbmRpbmcgYSBtYXRjaCBiZXR3ZWVuIGRldmljZSBhbmQgZHJpdmVyLiAgSWYgdGhlCitwcm9iZSgpIHN1Y2NlZWRzLCB0aGUgZHJpdmVyIGFuZCBkZXZpY2UgYXJlIGJvdW5kIGFzIHVzdWFsLiAgVGhlcmUgYXJlCit0aHJlZSBkaWZmZXJlbnQgd2F5cyB0byBmaW5kIHN1Y2ggYSBtYXRjaDoKIAorICAgIC0gV2hlbmV2ZXIgYSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCwgdGhlIGRyaXZlcnMgZm9yIHRoYXQgYnVzIGFyZQorICAgICAgY2hlY2tlZCBmb3IgbWF0Y2hlcy4gIFBsYXRmb3JtIGRldmljZXMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdmVyeQorICAgICAgZWFybHkgZHVyaW5nIHN5c3RlbSBib290LgogCi1CdXMgSURzCi1+fn5+fn5+Ci1CdXMgSURzIGFyZSB0aGUgY2Fub25pY2FsIG5hbWVzIGZvciB0aGUgZGV2aWNlcy4gVGhlcmUgaXMgbm8gZ2xvYmFsbHkKLXN0YW5kYXJkIGFkZHJlc3NpbmcgbWVjaGFuaXNtIGZvciBsZWdhY3kgZGV2aWNlcy4gSW4gdGhlIElBLTMyIHdvcmxkLAotd2UgaGF2ZSBQbnAgSURzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgbGVnYWN5IEkvTyBwb3J0cy4gSG93ZXZlciwKLW5laXRoZXIgdGVsbCB3aGF0IHRoZSBkZXZpY2UgcmVhbGx5IGlzIG9yIGhhdmUgYW55IG1lYW5pbmcgb24gb3RoZXIKLXBsYXRmb3Jtcy4gCisgICAgLSBXaGVuIGEgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgdXNpbmcgcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCksIGFsbAorICAgICAgdW5ib3VuZCBkZXZpY2VzIG9uIHRoYXQgYnVzIGFyZSBjaGVja2VkIGZvciBtYXRjaGVzLiAgRHJpdmVycworICAgICAgdXN1YWxseSByZWdpc3RlciBsYXRlciBkdXJpbmcgYm9vdGluZywgb3IgYnkgbW9kdWxlIGxvYWRpbmcuCiAKLVNpbmNlIGJvdGggUG5QIElEcyBhbmQgdGhlIGxlZ2FjeSBJL08gcG9ydHMgKGFuZCBvdGhlciBzdGFuZGFyZCBJL08KLXBvcnRzIGZvciBzcGVjaWZpYyBkZXZpY2VzKSBoYXZlIGEgMToxIG1hcHBpbmcsIHdlIG1hcCB0aGUKLXBsYXRmb3JtLXNwZWNpZmljIG5hbWUgb3IgaWRlbnRpZmllciB0byBhIGdlbmVyaWMgbmFtZSAoYXQgbGVhc3QKLXdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGtlcm5lbCkuCi0KLUZvciBleGFtcGxlLCBhIHNlcmlhbCBkcml2ZXIgbWlnaHQgZmluZCBhIGRldmljZSBhdCBJL08gMHgzZjguIFRoZQotQUNQSSBmaXJtd2FyZSBtaWdodCBhbHNvIGRpc2NvdmVyIGEgZGV2aWNlIHdpdGggUG5QIElEIChfSElEKQotUE5QMDUwMS4gQm90aCBjb3JyZXNwb25kIHRvIHRoZSBzYW1lIGRldmljZSBhbmQgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGUKLWNhbm9uaWNhbCBuYW1lICdzZXJpYWwnLiAKLQotVGhlIGJ1c19pZCBmaWVsZCBzaG91bGQgYmUgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjYW5vbmljYWwgbmFtZSBhbmQKLXRoZSBpbnN0YW5jZSBvZiB0aGF0IHR5cGUgb2YgZGV2aWNlLiBGb3IgZXhhbXBsZSwgdGhlIGRldmljZSBhdCBJL08KLXBvcnQgMHgzZjggc2hvdWxkIGhhdmUgYSBidXNfaWQgb2YgInNlcmlhbDAiLiBUaGlzIHBsYWNlcyB0aGUKLXJlc3BvbnNpYmlsaXR5IG9mIGVudW1lcmF0aW5nIGRldmljZXMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgdXAgdG8gdGhlCi1kaXNjb3ZlcnkgbWVjaGFuaXNtLiBCdXQsIHRoZXkgYXJlIHRoZSBlbnRpdHkgdGhhdCBzaG91bGQga25vdyBiZXN0Ci0oYXMgb3Bwb3NlZCB0byB0aGUgcGxhdGZvcm0gYnVzIGRyaXZlcikuCi0KLQotRHJpdmVycyAKLX5+fn5+fn4KLURyaXZlcnMgZm9yIHBsYXRmb3JtIGRldmljZXMgc2hvdWxkIGhhdmUgYSBuYW1lIHRoYXQgaXMgdGhlIHNhbWUgYXMKLXRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgZGV2aWNlcyB0aGV5IHN1cHBvcnQuIFRoaXMgYWxsb3dzIHRoZQotcGxhdGZvcm0gYnVzIGRyaXZlciB0byBkbyBzaW1wbGUgbWF0Y2hpbmcgd2l0aCB0aGUgYmFzaWMgZGF0YQotc3RydWN0dXJlcyB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZXIgc3VwcG9ydHMgYSBjZXJ0YWluIGRldmljZS4gCi0KLUZvciBleGFtcGxlLCBhIGxlZ2FjeSBzZXJpYWwgZHJpdmVyIHNob3VsZCBoYXZlIGEgbmFtZSBvZiAnc2VyaWFsJyBhbmQKLXJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSBwbGF0Zm9ybSBidXMuIAotCi0KLURyaXZlciBCaW5kaW5nCi1+fn5+fn5+fn5+fn5+fgotTGVnYWN5IGRyaXZlcnMgYXNzdW1lIHRoZXkgYXJlIGJvdW5kIHRvIHRoZSBkZXZpY2Ugb25jZSB0aGV5IHN0YXJ0IHVwCi1hbmQgcHJvYmUgYW4gSS9PIHBvcnQuIERpdm9yY2luZyB0aGVtIGZyb20gdGhpcyB3aWxsIGJlIGEgZGlmZmljdWx0Ci1wcm9jZXNzLiBIb3dldmVyLCB0aGF0IHNob3VsZG4ndCBwcmV2ZW50IHVzIGZyb20gaW1wbGVtZW50aW5nCi1maXJtd2FyZS1iYXNlZCBlbnVtZXJhdGlvbi4gCi0KLVRoZSBmaXJtd2FyZSBzaG91bGQgbm90aWZ5IHRoZSBwbGF0Zm9ybSBidXMgYWJvdXQgZGV2aWNlcyBiZWZvcmUgdGhlCi1sZWdhY3kgZHJpdmVycyBoYXZlIGhhZCBhIGNoYW5jZSB0byBsb2FkLiBPbmNlIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQsCi10aGV5IGRyaXZlciBtb2RlbCBjb3JlIHdpbGwgYXR0ZW1wdCB0byBiaW5kIHRoZSBkcml2ZXIgdG8gYW55Ci1wcmV2aW91c2x5LWRpc2NvdmVyZWQgZGV2aWNlcy4gT25jZSB0aGF0IGhhcyBoYXBwZW5lZCwgaXQgd2lsbCBiZSBmcmVlCi10byBkaXNjb3ZlciBhbnkgb3RoZXIgZGV2aWNlcyBpdCBwbGVhc2VzLgorICAgIC0gUmVnaXN0ZXJpbmcgYSBkcml2ZXIgdXNpbmcgcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCkgd29ya3MganVzdCBsaWtlCisgICAgICB1c2luZyBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoKSwgZXhjZXB0IHRoYXQgdGhlIHRoZSBkcml2ZXIgd29uJ3QKKyAgICAgIGJlIHByb2JlZCBsYXRlciBpZiBhbm90aGVyIGRldmljZSByZWdpc3RlcnMuICAoV2hpY2ggaXMgT0ssIHNpbmNlCisgICAgICB0aGlzIGludGVyZmFjZSBpcyBvbmx5IGZvciB1c2Ugd2l0aCBub24taG90cGx1Z2dhYmxlIGRldmljZXMuKQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9wb3J0aW5nLnR4dCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BvcnRpbmcudHh0CmluZGV4IDk4YjIzM2MuLjkyZDg2ZjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BvcnRpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL3BvcnRpbmcudHh0CkBAIC05Miw3ICs5Miw3IEBACiBkZXNjcmliaW5nIHRoZSByZWxhdGlvbnNoaXAgdGhlIGRldmljZSBoYXMgdG8gb3RoZXIgZW50aXRpZXMuIAogCiAKLS0gRW1iZWRkIGEgc3RydWN0IGRldmljZSBpbiB0aGUgYnVzLXNwZWNpZmljIGRldmljZSB0eXBlLiAKKy0gRW1iZWQgYSBzdHJ1Y3QgZGV2aWNlIGluIHRoZSBidXMtc3BlY2lmaWMgZGV2aWNlIHR5cGUuIAogCiAKIHN0cnVjdCBwY2lfZGV2IHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL2NhcmRzLnR4dCBiL0RvY3VtZW50YXRpb24vZHZiL2NhcmRzLnR4dAppbmRleCBjYTU4ZTMzLi5jYzA5MTg3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2R2Yi9jYXJkcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvY2FyZHMudHh0CkBAIC0yMiwxMCArMjIsMTAgQEAKICAgIC0gdmVzMXg5MwkJOiBBbHBzIEJTUlYyICh2ZXMxODkzIGRlbW9kdWxhdG9yKSBhbmQgZGJveDIgKHZlczE5OTMpCiAgICAtIGN4MjQxMTAJCTogQ29uZXhhbnQgSE0xMjIxL0hNMTgxMSAoY3gyNDExMCBvciBjeDI0MTA2IGRlbW9kLCBjeDI0MTA4IFBMTCkKICAgIC0gZ3J1bmRpZ18yOTUwNC00OTEJOiBHcnVuZGlnIDI5NTA0LTQ5MSAoUGhpbGlwcyBUREE4MDgzIGRlbW9kdWxhdG9yKSwgdHNhNTUyMiBQTEwKLSAgIC0gbXQzMTIJCTogWmFybGluayBtdDMxMiBvciBNaXRlbCB2cDMxMCBkZW1vZHVsYXRvciwgc2wxOTM1IG9yIHRzYTUwNTkgUExMCisgICAtIG10MzEyCQk6IFphcmxpbmsgbXQzMTIgb3IgTWl0ZWwgdnAzMTAgZGVtb2R1bGF0b3IsIHNsMTkzNSBvciB0c2E1MDU5IFBMTGksIFRlY2huaXNhdCBTa3kyUGMgd2l0aCBiaW9zIFJldi4gMi4zCiAgICAtIHN0djAyOTkJCTogQWxwcyBCU1JVNiAodHNhNTA1OSBQTEwpLCBMRyBURFFCLVMwMHggKHRzYTUwNTkgUExMKSwKIAkJCSAgTEcgVERRRi1TMDAxRiAoc2wxOTM1IFBMTCksIFBoaWxpcHMgU1UxMjc4ICh0dWE2MTAwIFBMTCksCi0JCQkgIFBoaWxpcHMgU1UxMjc4U0ggKHRzYTUwNTkgUExMKSwgU2Ftc3VuZyBUQk1VMjQxMTJJTUIKKwkJCSAgUGhpbGlwcyBTVTEyNzhTSCAodHNhNTA1OSBQTEwpLCBTYW1zdW5nIFRCTVUyNDExMklNQiwgVGVjaG5pc2F0IFNreTJQYyB3aXRoIGJpb3MgUmV2LiAyLjYKICAgRFZCLUM6CiAgICAtIHZlczE4MjAJCTogdmFyaW91cyAodmVzMTgyMCBkZW1vZHVsYXRvciwgc3A1NjU5YyBvciBzcFhYWFggUExMKQogICAgLSBhdDc2YzY1MQkJOiBBdG1lbCBBVDc2YzY1MShCKSB3aXRoIERBVDcwMjEgUExMCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi9jaS50eHQKaW5kZXggNTMxMjM5Yi4uMmVjZDgzNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2NpLnR4dApAQCAtNzEsNyArNzEsNyBAQAogVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIHRvIG1hbmFnZSB0aGUgcmVzdC4gRm9yCiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lciBpdCB3b3VsZCBiZSBhcyBzaW1wbGUgYXMgc2VuZGluZy9yZWNlaXZpbmcgYW4KIGFycmF5IHRvL2Zyb20gdGhlIENJIGlvY3RscyBhcyBkZWZpbmVkIGluIHRoZSBMaW51eCBEVkIgQVBJLiBObyBjaGFuZ2VzCi1oYXZlIGJlZW4gbWFkZSBpbiB0aGUgQVBJIHRvIGFjY29tb2RhdGUgdGhpcyBmZWF0dXJlLgoraGF2ZSBiZWVuIG1hZGUgaW4gdGhlIEFQSSB0byBhY2NvbW1vZGF0ZSB0aGlzIGZlYXR1cmUuCiAKIAogKiBXaHkgdGhlIG5lZWQgZm9yIGFub3RoZXIgQ0kgaW50ZXJmYWNlID8KQEAgLTEwMiw3ICsxMDIsNyBAQAogaW1wbGVtZW50ZWQgYnkgbW9zdCBhcHBsaWNhdGlvbnMuIEhlbmNlIHRoaXMgYXJlYSBpcyByZXZpc2l0ZWQuCiAKIFRoaXMgQ0kgaW50ZXJmYWNlIGlzIHF1aXRlIGRpZmZlcmVudCBpbiB0aGUgY2FzZSB0aGF0IGl0IHRyaWVzIHRvCi1hY2NvbW9kYXRlIGFsbCBvdGhlciBDSSBiYXNlZCBkZXZpY2VzLCB0aGF0IGZhbGwgaW50byB0aGUgb3RoZXIgY2F0ZWdvcmllcworYWNjb21tb2RhdGUgYWxsIG90aGVyIENJIGJhc2VkIGRldmljZXMsIHRoYXQgZmFsbCBpbnRvIHRoZSBvdGhlciBjYXRlZ29yaWVzLgogCiBUaGlzIG1lYW5zIHRoYXQgdGhpcyBDSSBpbnRlcmZhY2UgaGFuZGxlcyB0aGUgRU41MDIyMSBzdHlsZSB0YWdzIGluIHRoZQogQXBwbGljYXRpb24gbGF5ZXIgb25seSBhbmQgbm8gc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vpc2EudHh0IGIvRG9jdW1lbnRhdGlvbi9laXNhLnR4dAppbmRleCA2YTA5OWVkLi42MGUzNjFiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Vpc2EudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZWlzYS50eHQKQEAgLTYyLDcgKzYyLDcgQEAKIGJ1c19iYXNlX2FkZHIgOiBzbG90IDAgYWRkcmVzcyBvbiB0aGlzIGJ1cwogc2xvdHMJICAgICAgOiBtYXggc2xvdCBudW1iZXIgdG8gcHJvYmUKIGZvcmNlX3Byb2JlICAgOiBQcm9iZSBldmVuIHdoZW4gc2xvdCAwIGlzIGVtcHR5IChubyBFSVNBIG1haW5ib2FyZCkKLWRtYV9tYXNrICAgICAgOiBEZWZhdWx0IERNQSBtYXNrLiBVc3VhbHkgdGhlIGJyaWRnZSBkZXZpY2UgZG1hX21hc2suCitkbWFfbWFzayAgICAgIDogRGVmYXVsdCBETUEgbWFzay4gVXN1YWxseSB0aGUgYnJpZGdlIGRldmljZSBkbWFfbWFzay4KIGJ1c19ucgkgICAgICA6IHVuaXF1ZSBidXMgaWQsIHNldCBieSBlaXNhX3Jvb3RfcmVnaXN0ZXIKIAogKiogRHJpdmVyIDoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxjbWQuc2ggYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsY21kLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTc3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsY21kLnNoCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL2Jhc2gKKworZWNobyAxID4gL3Byb2Mvc2VsZi9tYWtlLWl0LWZhaWwKK2V4ZWMgJCoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2ggYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsbW9kdWxlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NGE4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsbW9kdWxlLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFVzYWdlOiBmYWlsbW9kdWxlIDxmYWlsbmFtZT4gPG1vZHVsZW5hbWU+IFtzdGFja3RyYWNlLWRlcHRoXQorIworIwk8ZmFpbG5hbWU+OiAiZmFpbHNsYWIiLCAiZmFpbF9hbGxvY19wYWdlIiwgb3IgImZhaWxfbWFrZV9yZXF1ZXN0IgorIworIwk8bW9kdWxlbmFtZT46IG1vZHVsZSBuYW1lIHRoYXQgeW91IHdhbnQgdG8gaW5qZWN0IGZhdWx0cy4KKyMKKyMJW3N0YWNrdHJhY2UtZGVwdGhdOiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2t0cmFjZSB3YWxraW5nIGFsbG93ZWQKKyMKKworU1RBQ0tUUkFDRV9ERVBUSD01CitpZiBbICQjIC1ndCAyIF07IHRoZW4KKwlTVEFDS1RSQUNFX0RFUFRIPSQzCitmaQorCitpZiBbICEgLWQgL2RlYnVnLyQxIF07IHRoZW4KKwllY2hvICJGYXVsdC1pbmplY3Rpb24gJDEgZG9lcyBub3QgZXhpc3QiID4mMgorCWV4aXQgMQorZmkKK2lmIFsgISAtZCAvc3lzL21vZHVsZS8kMiBdOyB0aGVuCisJZWNobyAiTW9kdWxlICQyIGRvZXMgbm90IGV4aXN0IiA+JjIKKwlleGl0IDEKK2ZpCisKKyMgRGlzYWJsZSBhbnkgZmF1bHQgaW5qZWN0aW9uCitlY2hvIDAgPiAvZGVidWcvJDEvc3RhY2t0cmFjZS1kZXB0aAorCitlY2hvIGBjYXQgL3N5cy9tb2R1bGUvJDIvc2VjdGlvbnMvLnRleHRgID4gL2RlYnVnLyQxL3JlcXVpcmUtc3RhcnQKK2VjaG8gYGNhdCAvc3lzL21vZHVsZS8kMi9zZWN0aW9ucy8uZXhpdC50ZXh0YCA+IC9kZWJ1Zy8kMS9yZXF1aXJlLWVuZAorZWNobyAkU1RBQ0tUUkFDRV9ERVBUSCA+IC9kZWJ1Zy8kMS9zdGFja3RyYWNlLWRlcHRoCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2NhNTYwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dApAQCAtMCwwICsxLDIyNSBAQAorRmF1bHQgaW5qZWN0aW9uIGNhcGFiaWxpdGllcyBpbmZyYXN0cnVjdHVyZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTZWUgYWxzbyBkcml2ZXJzL21kL2ZhdWx0eS5jIGFuZCAiZXZlcnlfbnRoIiBtb2R1bGUgb3B0aW9uIGZvciBzY3NpX2RlYnVnLgorCisKK0F2YWlsYWJsZSBmYXVsdCBpbmplY3Rpb24gY2FwYWJpbGl0aWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvIGZhaWxzbGFiCisKKyAgaW5qZWN0cyBzbGFiIGFsbG9jYXRpb24gZmFpbHVyZXMuIChrbWFsbG9jKCksIGttZW1fY2FjaGVfYWxsb2MoKSwgLi4uKQorCitvIGZhaWxfcGFnZV9hbGxvYworCisgIGluamVjdHMgcGFnZSBhbGxvY2F0aW9uIGZhaWx1cmVzLiAoYWxsb2NfcGFnZXMoKSwgZ2V0X2ZyZWVfcGFnZXMoKSwgLi4uKQorCitvIGZhaWxfbWFrZV9yZXF1ZXN0CisKKyAgaW5qZWN0cyBkaXNrIElPIGVycm9ycyBvbiBkZXZpY2VzIHBlcm1pdHRlZCBieSBzZXR0aW5nCisgIC9zeXMvYmxvY2svPGRldmljZT4vbWFrZS1pdC1mYWlsIG9yCisgIC9zeXMvYmxvY2svPGRldmljZT4vPHBhcnRpdGlvbj4vbWFrZS1pdC1mYWlsLiAoZ2VuZXJpY19tYWtlX3JlcXVlc3QoKSkKKworQ29uZmlndXJlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXRpZXMgYmVoYXZpb3IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK28gZGVidWdmcyBlbnRyaWVzCisKK2ZhdWx0LWluamVjdC1kZWJ1Z2ZzIGtlcm5lbCBtb2R1bGUgcHJvdmlkZXMgc29tZSBkZWJ1Z2ZzIGVudHJpZXMgZm9yIHJ1bnRpbWUKK2NvbmZpZ3VyYXRpb24gb2YgZmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdGllcy4KKworLSAvZGVidWcvZmFpbCovcHJvYmFiaWxpdHk6CisKKwlsaWtlbGlob29kIG9mIGZhaWx1cmUgaW5qZWN0aW9uLCBpbiBwZXJjZW50LgorCUZvcm1hdDogPHBlcmNlbnQ+CisKKwlOb3RlIHRoYXQgb25lLWZhaWx1cmUtcGVyLWh1bmRyZWQgaXMgYSB2ZXJ5IGhpZ2ggZXJyb3IgcmF0ZQorCWZvciBzb21lIHRlc3RjYXNlcy4gIENvbnNpZGVyIHNldHRpbmcgcHJvYmFiaWxpdHk9MTAwIGFuZCBjb25maWd1cmUKKwkvZGVidWcvZmFpbCovaW50ZXJ2YWwgZm9yIHN1Y2ggdGVzdGNhc2VzLgorCistIC9kZWJ1Zy9mYWlsKi9pbnRlcnZhbDoKKworCXNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBmYWlsdXJlcywgZm9yIGNhbGxzIHRvCisJc2hvdWxkX2ZhaWwoKSB0aGF0IHBhc3MgYWxsIHRoZSBvdGhlciB0ZXN0cy4KKworCU5vdGUgdGhhdCBpZiB5b3UgZW5hYmxlIHRoaXMsIGJ5IHNldHRpbmcgaW50ZXJ2YWw+MSwgeW91IHdpbGwKKwlwcm9iYWJseSB3YW50IHRvIHNldCBwcm9iYWJpbGl0eT0xMDAuCisKKy0gL2RlYnVnL2ZhaWwqL3RpbWVzOgorCisJc3BlY2lmaWVzIGhvdyBtYW55IHRpbWVzIGZhaWx1cmVzIG1heSBoYXBwZW4gYXQgbW9zdC4KKwlBIHZhbHVlIG9mIC0xIG1lYW5zICJubyBsaW1pdCIuCisKKy0gL2RlYnVnL2ZhaWwqL3NwYWNlOgorCisJc3BlY2lmaWVzIGFuIGluaXRpYWwgcmVzb3VyY2UgImJ1ZGdldCIsIGRlY3JlbWVudGVkIGJ5ICJzaXplIgorCW9uIGVhY2ggY2FsbCB0byBzaG91bGRfZmFpbCgsc2l6ZSkuICBGYWlsdXJlIGluamVjdGlvbiBpcworCXN1cHByZXNzZWQgdW50aWwgInNwYWNlIiByZWFjaGVzIHplcm8uCisKKy0gL2RlYnVnL2ZhaWwqL3ZlcmJvc2UKKworCUZvcm1hdDogeyAwIHwgMSB8IDIgfQorCXNwZWNpZmllcyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBtZXNzYWdlcyB3aGVuIGZhaWx1cmUgaXMKKwlpbmplY3RlZC4gICcwJyBtZWFucyBubyBtZXNzYWdlczsgJzEnIHdpbGwgcHJpbnQgb25seSBhIHNpbmdsZQorCWxvZyBsaW5lIHBlciBmYWlsdXJlOyAnMicgd2lsbCBwcmludCBhIGNhbGwgdHJhY2UgdG9vIC0tIHVzZWZ1bAorCXRvIGRlYnVnIHRoZSBwcm9ibGVtcyByZXZlYWxlZCBieSBmYXVsdCBpbmplY3Rpb24uCisKKy0gL2RlYnVnL2ZhaWwqL3Rhc2stZmlsdGVyOgorCisJRm9ybWF0OiB7ICdZJyB8ICdOJyB9CisJQSB2YWx1ZSBvZiAnTicgZGlzYWJsZXMgZmlsdGVyaW5nIGJ5IHByb2Nlc3MgKGRlZmF1bHQpLgorCUFueSBwb3NpdGl2ZSB2YWx1ZSBsaW1pdHMgZmFpbHVyZXMgdG8gb25seSBwcm9jZXNzZXMgaW5kaWNhdGVkIGJ5CisJL3Byb2MvPHBpZD4vbWFrZS1pdC1mYWlsPT0xLgorCistIC9kZWJ1Zy9mYWlsKi9yZXF1aXJlLXN0YXJ0OgorLSAvZGVidWcvZmFpbCovcmVxdWlyZS1lbmQ6CistIC9kZWJ1Zy9mYWlsKi9yZWplY3Qtc3RhcnQ6CistIC9kZWJ1Zy9mYWlsKi9yZWplY3QtZW5kOgorCisJc3BlY2lmaWVzIHRoZSByYW5nZSBvZiB2aXJ0dWFsIGFkZHJlc3NlcyB0ZXN0ZWQgZHVyaW5nCisJc3RhY2t0cmFjZSB3YWxraW5nLiAgRmFpbHVyZSBpcyBpbmplY3RlZCBvbmx5IGlmIHNvbWUgY2FsbGVyCisJaW4gdGhlIHdhbGtlZCBzdGFja3RyYWNlIGxpZXMgd2l0aGluIHRoZSByZXF1aXJlZCByYW5nZSwgYW5kCisJbm9uZSBsaWVzIHdpdGhpbiB0aGUgcmVqZWN0ZWQgcmFuZ2UuCisJRGVmYXVsdCByZXF1aXJlZCByYW5nZSBpcyBbMCxVTE9OR19NQVgpICh3aG9sZSBvZiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UpLgorCURlZmF1bHQgcmVqZWN0ZWQgcmFuZ2UgaXMgWzAsMCkuCisKKy0gL2RlYnVnL2ZhaWwqL3N0YWNrdHJhY2UtZGVwdGg6CisKKwlzcGVjaWZpZXMgdGhlIG1heGltdW0gc3RhY2t0cmFjZSBkZXB0aCB3YWxrZWQgZHVyaW5nIHNlYXJjaAorCWZvciBhIGNhbGxlciB3aXRoaW4gW3JlcXVpcmUtc3RhcnQscmVxdWlyZS1lbmQpIE9SCisJW3JlamVjdC1zdGFydCxyZWplY3QtZW5kKS4KKworLSAvZGVidWcvZmFpbF9wYWdlX2FsbG9jL2lnbm9yZS1nZnAtaGlnaG1lbToKKworCUZvcm1hdDogeyAnWScgfCAnTicgfQorCWRlZmF1bHQgaXMgJ04nLCBzZXR0aW5nIGl0IHRvICdZJyB3b24ndCBpbmplY3QgZmFpbHVyZXMgaW50bworCWhpZ2htZW0vdXNlciBhbGxvY2F0aW9ucy4KKworLSAvZGVidWcvZmFpbHNsYWIvaWdub3JlLWdmcC13YWl0OgorLSAvZGVidWcvZmFpbF9wYWdlX2FsbG9jL2lnbm9yZS1nZnAtd2FpdDoKKworCUZvcm1hdDogeyAnWScgfCAnTicgfQorCWRlZmF1bHQgaXMgJ04nLCBzZXR0aW5nIGl0IHRvICdZJyB3aWxsIGluamVjdCBmYWlsdXJlcworCW9ubHkgaW50byBub24tc2xlZXAgYWxsb2NhdGlvbnMgKEdGUF9BVE9NSUMgYWxsb2NhdGlvbnMpLgorCitvIEJvb3Qgb3B0aW9uCisKK0luIG9yZGVyIHRvIGluamVjdCBmYXVsdHMgd2hpbGUgZGVidWdmcyBpcyBub3QgYXZhaWxhYmxlIChlYXJseSBib290IHRpbWUpLAordXNlIHRoZSBib290IG9wdGlvbjoKKworCWZhaWxzbGFiPQorCWZhaWxfcGFnZV9hbGxvYz0KKwlmYWlsX21ha2VfcmVxdWVzdD08aW50ZXJ2YWw+LDxwcm9iYWJpbGl0eT4sPHNwYWNlPiw8dGltZXM+CisKK0hvdyB0byBhZGQgbmV3IGZhdWx0IGluamVjdGlvbiBjYXBhYmlsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvICNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KKworbyBkZWZpbmUgdGhlIGZhdWx0IGF0dHJpYnV0ZXMKKworICBERUNMQVJFX0ZBVUxUX0lOSkVDVElPTihuYW1lKTsKKworICBQbGVhc2Ugc2VlIHRoZSBkZWZpbml0aW9uIG9mIHN0cnVjdCBmYXVsdF9hdHRyIGluIGZhdWx0LWluamVjdC5oCisgIGZvciBkZXRhaWxzLgorCitvIHByb3ZpZGUgYSB3YXkgdG8gY29uZmlndXJlIGZhdWx0IGF0dHJpYnV0ZXMKKworLSBib290IG9wdGlvbgorCisgIElmIHlvdSBuZWVkIHRvIGVuYWJsZSB0aGUgZmF1bHQgaW5qZWN0aW9uIGNhcGFiaWxpdHkgZnJvbSBib290IHRpbWUsIHlvdSBjYW4KKyAgcHJvdmlkZSBib290IG9wdGlvbiB0byBjb25maWd1cmUgaXQuIFRoZXJlIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBpdDoKKworCXNldHVwX2ZhdWx0X2F0dHIoYXR0ciwgc3RyKTsKKworLSBkZWJ1Z2ZzIGVudHJpZXMKKworICBmYWlsc2xhYiwgZmFpbF9wYWdlX2FsbG9jLCBhbmQgZmFpbF9tYWtlX3JlcXVlc3QgdXNlIHRoaXMgd2F5LgorICBIZWxwZXIgZnVuY3Rpb25zOgorCisJaW5pdF9mYXVsdF9hdHRyX2VudHJpZXMoZW50cmllcywgYXR0ciwgbmFtZSk7CisJdm9pZCBjbGVhbnVwX2ZhdWx0X2F0dHJfZW50cmllcyhlbnRyaWVzKTsKKworLSBtb2R1bGUgcGFyYW1ldGVycworCisgIElmIHRoZSBzY29wZSBvZiB0aGUgZmF1bHQgaW5qZWN0aW9uIGNhcGFiaWxpdHkgaXMgbGltaXRlZCB0byBhCisgIHNpbmdsZSBrZXJuZWwgbW9kdWxlLCBpdCBpcyBiZXR0ZXIgdG8gcHJvdmlkZSBtb2R1bGUgcGFyYW1ldGVycyB0bworICBjb25maWd1cmUgdGhlIGZhdWx0IGF0dHJpYnV0ZXMuCisKK28gYWRkIGEgaG9vayB0byBpbnNlcnQgZmFpbHVyZXMKKworICBVcG9uIHNob3VsZF9mYWlsKCkgcmV0dXJuaW5nIHRydWUsIGNsaWVudCBjb2RlIHNob3VsZCBpbmplY3QgYSBmYWlsdXJlLgorCisJc2hvdWxkX2ZhaWwoYXR0ciwgc2l6ZSk7CisKK0FwcGxpY2F0aW9uIEV4YW1wbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvIGluamVjdCBzbGFiIGFsbG9jYXRpb24gZmFpbHVyZXMgaW50byBtb2R1bGUgaW5pdC9jbGVhbnVwIGNvZGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIS9iaW4vYmFzaAorCitGQUlMQ01EPURvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxjbWQuc2gKK0JMQUNLTElTVD0icm9vdF9wbHVnIGV2YnVnIgorCitGQUlMTkFNRT1mYWlsc2xhYgorZWNobyBZID4gL2RlYnVnLyRGQUlMTkFNRS90YXNrLWZpbHRlcgorZWNobyAxMCA+IC9kZWJ1Zy8kRkFJTE5BTUUvcHJvYmFiaWxpdHkKK2VjaG8gMTAwID4gL2RlYnVnLyRGQUlMTkFNRS9pbnRlcnZhbAorZWNobyAtMSA+IC9kZWJ1Zy8kRkFJTE5BTUUvdGltZXMKK2VjaG8gMiA+IC9kZWJ1Zy8kRkFJTE5BTUUvdmVyYm9zZQorZWNobyAxID4gL2RlYnVnLyRGQUlMTkFNRS9pZ25vcmUtZ2ZwLXdhaXQKKworYmxhY2tsaXN0KCkKK3sKKwllY2hvICRCTEFDS0xJU1QgfCBncmVwICQxID4gL2Rldi9udWxsIDI+JjEKK30KKworb29wcygpCit7CisJZG1lc2cgfCBncmVwIEJVRyA+IC9kZXYvbnVsbCAyPiYxCit9CisKK2ZpbmQgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAgLW5hbWUgJyoua28nIC1leGVjIGJhc2VuYW1lIHt9IC5rbyBcOyB8CisJd2hpbGUgcmVhZCBpCisJZG8KKwkJb29wcyAmJiBleGl0IDEKKworCQlpZiAhIGJsYWNrbGlzdCAkaQorCQl0aGVuCisJCQllY2hvIGluc2VydGluZyAkaS4uLgorCQkJYmFzaCAkRkFJTENNRCBtb2Rwcm9iZSAkaQorCQlmaQorCWRvbmUKKworbHNtb2QgfCBhd2sgJ3sgaWYgKCQzID09IDApIHsgcHJpbnQgJDEgfSB9JyB8CisJd2hpbGUgcmVhZCBpCisJZG8KKwkJb29wcyAmJiBleGl0IDEKKworCQlpZiAhIGJsYWNrbGlzdCAkaQorCQl0aGVuCisJCQllY2hvIHJlbW92aW5nICRpLi4uCisJCQliYXNoICRGQUlMQ01EIG1vZHByb2JlIC1yICRpCisJCWZpCisJZG9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbyBpbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIG9ubHkgZm9yIGEgc3BlY2lmaWMgbW9kdWxlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyEvYmluL2Jhc2gKKworRkFJTE1PRD1Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsbW9kdWxlLnNoCisKK2VjaG8gaW5qZWN0aW5nIGVycm9ycyBpbnRvIHRoZSBtb2R1bGUgJDEuLi4KKworbW9kcHJvYmUgJDEKK2Jhc2ggJEZBSUxNT0QgZmFpbHNsYWIgJDEgMTAKK2VjaG8gMjUgPiAvZGVidWcvZmFpbHNsYWIvcHJvYmFiaWxpdHkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCAyNGYzYzYzLi4zMGYzYzhjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC0zMCwxMSArMzAsMzkgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBXaGF0OglyYXcxMzk0OiByZXF1ZXN0cyBvZiB0eXBlIFJBVzEzOTRfUkVRX0lTT19TRU5ELCBSQVcxMzk0X1JFUV9JU09fTElTVEVOCi1XaGVuOglOb3ZlbWJlciAyMDA2Ci1XaHk6CURlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBuZXcgaW9jdGwtYmFzZWQgcmF3aXNvIGludGVyZmFjZSwgd2hpY2ggaXMKLQltb3JlIGVmZmljaWVudC4gIFlvdSBzaG91bGQgcmVhbGx5IGJlIHVzaW5nIGxpYnJhdzEzOTQgZm9yIHJhdzEzOTQKLQlhY2Nlc3MgYW55d2F5LgotV2hvOglKb2R5IE1jSW50eXJlIDxzY2pvZHlAbW9kZXJuZHVjay5jb20+CitXaGVuOglKdW5lIDIwMDcKK1doeToJRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdGhlIG1vcmUgZWZmaWNpZW50IGFuZCByb2J1c3QgcmF3aXNvIGludGVyZmFjZS4KKwlBZmZlY3RlZCBhcmUgYXBwbGljYXRpb25zIHdoaWNoIHVzZSB0aGUgZGVwcmVjYXRlZCBwYXJ0IG9mIGxpYnJhdzEzOTQKKwkocmF3MTM5NF9pc29fd3JpdGUsIHJhdzEzOTRfc3RhcnRfaXNvX3dyaXRlLCByYXcxMzk0X3N0YXJ0X2lzb19yY3YsCisJcmF3MTM5NF9zdG9wX2lzb19yY3YpIG9yIGJ5cGFzcwlsaWJyYXcxMzk0LgorV2hvOglEYW4gRGVubmVkeSA8ZGFuQGRlbm5lZHkub3JnPiwgU3RlZmFuIFJpY2h0ZXIgPHN0ZWZhbnJAczVyNi5pbi1iZXJsaW4uZGU+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglkdjEzOTQgZHJpdmVyIChDT05GSUdfSUVFRTEzOTRfRFYxMzk0KQorV2hlbjoJSnVuZSAyMDA3CitXaHk6CVJlcGxhY2VkIGJ5IHJhdzEzOTQgKyB1c2Vyc3BhY2UgbGlicmFyaWVzLCBub3RhYmx5IGxpYmllYzYxODgzLiAgVGhpcworCXNoaWZ0IG9mIGFwcGxpY2F0aW9uIHN1cHBvcnQgaGFzIGJlZW4gaW5kaWNhdGVkIG9uIHd3dy5saW51eDEzOTQub3JnCisJYW5kIGRldmVsb3BlcnMnIG1haWxpbmdsaXN0cyBmb3IgcXVpdGUgc29tZSB0aW1lLiAgTWFqb3IgYXBwbGljYXRpb25zCisJaGF2ZSBiZWVuIGNvbnZlcnRlZCwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGZmbXBlZyBhbmQgaGVuY2UgeGluZS4KKwlQaXBlZCBvdXRwdXQgb2YgZHZncmFiMiBpcyBhIHBhcnRpYWwgZXF1aXZhbGVudCB0byBkdjEzOTQuCitXaG86CURhbiBEZW5uZWR5IDxkYW5AZGVubmVkeS5vcmc+LCBTdGVmYW4gUmljaHRlciA8c3RlZmFuckBzNXI2LmluLWJlcmxpbi5kZT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CWllZWUxMzk0IGNvcmUncyB1bnVzZWQgZXhwb3J0cyAoQ09ORklHX0lFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSSkKK1doZW46CUphbnVhcnkgMjAwNworV2h5OglUaGVyZSBhcmUgbm8gcHJvamVjdHMga25vd24gdG8gdXNlIHRoZXNlIGV4cG9ydGVkIHN5bWJvbHMsIGV4Y2VwdAorCWRmZzEzOTQgKHVzZXMgb25lIHN5bWJvbCB3aG9zZSBmdW5jdGlvbmFsaXR5IGlzIGNvcmUtaW50ZXJuYWwgbm93KS4KK1dobzoJU3RlZmFuIFJpY2h0ZXIgPHN0ZWZhbnJAczVyNi5pbi1iZXJsaW4uZGU+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglpZWVlMTM5NCdzICpfb3VpIHN5c2ZzIGF0dHJpYnV0ZXMgKENPTkZJR19JRUVFMTM5NF9PVUlfREIpCitXaGVuOglKYW51YXJ5IDIwMDcKK0ZpbGVzOglkcml2ZXJzL2llZWUxMzk0Lzogb3VpLmRiLCBvdWkyYy5zaAorV2h5OgliaWcgc2l6ZSwgbGl0dGxlIHZhbHVlCitXaG86CVN0ZWZhbiBSaWNodGVyIDxzdGVmYW5yQHM1cjYuaW4tYmVybGluLmRlPgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNTMsMTggKzgxLDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CXN5c19zeXNjdGwKLVdoZW46CUphbnVhcnkgMjAwNwotV2h5OglUaGUgc2FtZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdGhyb3VnaCAvcHJvYy9zeXMgYW5kIHRoYXQgaXMgdGhlCi0JaW50ZXJmYWNlIHVzZXIgc3BhY2UgcHJlZmVycyB0byB1c2UuIEFuZCB0aGVyZSBkbyBub3QgYXBwZWFyIHRvIGJlCi0JYW55IGV4aXN0aW5nIHVzZXIgaW4gdXNlciBzcGFjZSBvZiBzeXNfc3lzY3RsLiAgVGhlIGFkZGl0aW9uYWwKLQltYWludGVuYW5jZSBvdmVyaGVhZCBvZiBrZWVwaW5nIGEgc2V0IG9mIGJpbmFyeSBuYW1lcyBnZXRzCi0JaW4gdGhlIHdheSBvZiBkb2luZyBhIGdvb2Qgam9iIG9mIG1haW50YWluaW5nIHRoaXMgaW50ZXJmYWNlLgotCi1XaG86CUVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglQQ01DSUEgY29udHJvbCBpb2N0bCAobmVlZGVkIGZvciBwY21jaWEtY3MgW2NhcmRtZ3IsIGNhcmRjdGxdKQogV2hlbjoJTm92ZW1iZXIgMjAwNQogRmlsZXM6CWRyaXZlcnMvcGNtY2lhLzogcGNtY2lhX2lvY3RsLmMKQEAgLTgyLDE4ICs5OCw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglpcF9xdWV1ZSBhbmQgaXA2X3F1ZXVlIChvbGQgaXB2NC1vbmx5IGFuZCBpcHY2LW9ubHkgbmV0ZmlsdGVyIHF1ZXVlKQotV2hlbjoJRGVjZW1iZXIgMjAwNQotV2h5OglUaGlzIGludGVyZmFjZSBoYXMgYmVlbiBvYnNvbGV0ZWQgYnkgdGhlIG5ldyBsYXllcjMtaW5kZXBlbmRlbnQKLQkibmZuZXRsaW5rX3F1ZXVlIi4gIFRoZSBLZXJuZWwgaW50ZXJmYWNlIGlzIGNvbXBhdGlibGUsIHNvIHRoZSBvbGQKLQlpcFs2XXRhYmxlcyAiUVVFVUUiIHRhcmdldHMgc3RpbGwgd29yayBhbmQgd2lsbCB0cmFuc3BhcmVudGx5IGhhbmRsZQotCWFsbCBwYWNrZXRzIGludG8gbmZuZXRsaW5rIHF1ZXVlIG51bWJlciAwLiAgVXNlcnNwYWNlIHVzZXJzIHdpbGwgaGF2ZQotCXRvIGxpbmsgYWdhaW5zdCBBUEktY29tcGF0aWJsZSBsaWJyYXJ5IG9uIHRvcCBvZiBsaWJuZm5ldGxpbmtfcXVldWUgCi0JaW5zdGVhZCBvZiB0aGUgY3VycmVudCAnbGliaXBxJy4KLVdobzoJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglyZW1vdmUgRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKQogV2hlbjoJQXVndXN0IDIwMDYKIEZpbGVzOglhcmNoLyova2VybmVsLypfa3N5bXMuYwpAQCAtMTQ3LDE1ICsxNTEsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJSTJDIGludGVyZmFjZSBvZiB0aGUgaXQ4NyBkcml2ZXIKLVdoZW46CUphbnVhcnkgMjAwNwotV2h5OglUaGUgSVNBIGludGVyZmFjZSBpcyBmYXN0ZXIgYW5kIHNob3VsZCBiZSBhbHdheXMgYXZhaWxhYmxlLiBUaGUgSTJDCi0JcHJvYmluZyBpcyBhbHNvIGtub3duIHRvIGNhdXNlIHRyb3VibGUgaW4gYXQgbGVhc3Qgb25lIGNhc2UgKHNlZQotCWJ1ZyAjNTg4OS4pCi1XaG86CUplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJVW51c2VkIEVYUE9SVF9TWU1CT0wvRVhQT1JUX1NZTUJPTF9HUEwgZXhwb3J0cwogCSh0ZW1wb3JhcnkgdHJhbnNpdGlvbiBjb25maWcgb3B0aW9uIHByb3ZpZGVkIHVudGlsIHRoZW4pCiAJVGhlIHRyYW5zaXRpb24gY29uZmlnIG9wdGlvbiB3aWxsIGFsc28gYmUgcmVtb3ZlZCBhdCB0aGUgc2FtZSB0aW1lLgpAQCAtMjEyLDUwICsyMDcsOCBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJaTJjLWl0ZSBhbmQgaTJjLWFsZ28taXRlIGRyaXZlcnMKLVdoZW46CVNlcHRlbWJlciAyMDA2Ci1XaHk6CVRoZXNlIGRyaXZlcnMgbmV2ZXIgY29tcGlsZWQgc2luY2UgdGhleSB3ZXJlIGFkZGVkIHRvIHRoZSBrZXJuZWwKLQl0cmVlIDUgeWVhcnMgYWdvLiBUaGlzIGZlYXR1cmUgcmVtb3ZhbCBjYW4gYmUgcmVldmFsdWF0ZWQgaWYKLQlzb21lb25lIHNob3dzIGludGVyZXN0IGluIHRoZSBkcml2ZXJzLCBmaXhlcyB0aGVtIGFuZCB0YWtlcyBvdmVyCi0JbWFpbnRlbmFuY2UuCi0JaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1saW51eC1taXBzJm09MTE1MDQwNTEwODE3NDQ4Ci1XaG86CUplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2hhdDoJQnJpZGdlIG5ldGZpbHRlciBkZWZlcnJlZCBJUHY0L0lQdjYgb3V0cHV0IGhvb2sgY2FsbGluZwotV2hlbjoJSmFudWFyeSAyMDA3Ci1XaHk6CVRoZSBkZWZlcnJlZCBvdXRwdXQgaG9va3MgYXJlIGEgbGF5ZXJpbmcgdmlvbGF0aW9uIGNhdXNpbmcgdW51c3VhbAotCWFuZCBicm9rZW4gYmVoYXZpb3VyIG9uIGJyaWRnZSBkZXZpY2VzLiBFeGFtcGxlcyBvZiB0aGluZ3MgdGhleQotCWJyZWFrIGluY2x1ZGUgUW9TIGNsYXNzaWZhdGlvbiB1c2luZyB0aGUgTUFSSyBvciBDTEFTU0lGWSB0YXJnZXRzLAotCXRoZSBJUHNlYyBwb2xpY3kgbWF0Y2ggYW5kIGNvbm5lY3Rpb24gdHJhY2tpbmcgd2l0aCBWTEFOcyBvbiBhCi0JYnJpZGdlLiBUaGVpciBvbmx5IHVzZSBpcyB0byBlbmFibGUgYnJpZGdlIG91dHB1dCBwb3J0IGZpbHRlcmluZwotCXdpdGhpbiBpcHRhYmxlcyB3aXRoIHRoZSBwaHlzZGV2IG1hdGNoLCB3aGljaCBjYW4gYWxzbyBiZSBkb25lIGJ5Ci0JY29tYmluaW5nIGlwdGFibGVzIGFuZCBlYnRhYmxlcyB1c2luZyBuZXRmaWx0ZXIgbWFya3MuIFVudGlsIGl0Ci0Jd2lsbCBnZXQgcmVtb3ZlZCB0aGUgaG9vayBkZWZlcnJhbCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBpcwotCW9ubHkgZW5hYmxlZCB3aGVuIG5lZWRlZC4KLQotV2hvOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdoYXQ6CWZyYW1lIGRpdmVydGVyCi1XaGVuOglOb3ZlbWJlciAyMDA2Ci1XaHk6CVRoZSBmcmFtZSBkaXZlcnRlciBpcyBpbmNsdWRlZCBpbiBtb3N0IGRpc3RyaWJ1dGlvbiBrZXJuZWxzLCBidXQgaXMKLQlicm9rZW4uIEl0IGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgbWFueSB0aGluZ3M6Ci0JLSBJUFY2Ci0JLSBub24tbGluZWFyIHNrYidzCi0JLSBuZXR3b3JrIGRldmljZSBSQ1Ugb24gcmVtb3ZhbAotCS0gaW5wdXQgZnJhbWVzIG5vdCBjb3JyZWN0bHkgY2hlY2tlZCBmb3IgcHJvdG9jb2wgZXJyb3JzCi0JSXQgYWxzbyBhZGRzIGFsbG9jYXRpb24gb3ZlcmhlYWQgZXZlbiBpZiBub3QgZW5hYmxlZC4KLQlJdCBpcyBub3QgY2xlYXIgaWYgYW55b25lIGlzIHN0aWxsIHVzaW5nIGl0LgotV2hvOglTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBvc2RsLm9yZz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQogV2hhdDoJUEhZU0RFVlBBVEgsIFBIWVNERVZCVVMsIFBIWVNERVZEUklWRVIgaW4gdGhlIHVldmVudCBlbnZpcm9ubWVudAotV2hlbjoJT2t0b2JlciAyMDA4CitXaGVuOglPY3RvYmVyIDIwMDgKIFdoeToJVGhlIHN0YWNraW5nIG9mIGNsYXNzIGRldmljZXMgbWFrZXMgdGhlc2UgdmFsdWVzIG1pc2xlYWRpbmcgYW5kCiAJaW5jb25zaXN0ZW50LgogCUNsYXNzIGRldmljZXMgc2hvdWxkIG5vdCBjYXJyeSBhbnkgb2YgdGhlc2UgcHJvcGVydGllcywgYW5kIGJ1cwpAQCAtMjczLDEwICsyMjYsMzMgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CWZ0YXBlCi1XaGVuOgkyLjYuMjAKLVdoeToJT3JwaGFuZWQgZm9yIGFnZXMuICBTTVAgYnVncyBsb25nIHVuZml4ZWQuICBGZXcgdXNlcnMgbGVmdAotCWluIHRoZSB3b3JsZC4KLVdobzoJSmVmZiBHYXJ6aWsgPGplZmZAZ2FyemlrLm9yZz4KK1doYXQ6CUlQdjQgb25seSBjb25uZWN0aW9uIHRyYWNraW5nL05BVC9oZWxwZXJzCitXaGVuOgkyLjYuMjIKK1doeToJVGhlIG5ldyBsYXllciAzIGluZGVwZW5kYW50IGNvbm5lY3Rpb24gdHJhY2tpbmcgcmVwbGFjZXMgdGhlIG9sZAorCUlQdjQgb25seSB2ZXJzaW9uLiBBZnRlciBzb21lIHN0YWJpbGl6YXRpb24gb2YgdGhlIG5ldyBjb2RlIHRoZQorCW9sZCBvbmUgd2lsbCBiZSByZW1vdmVkLgorV2hvOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CUFDUEkgaG9va3MgKFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSSkgaW4gc3BlZWRzdGVwLWNlbnRyaW5vIGRyaXZlcgorV2hlbjoJRGVjZW1iZXIgMjAwNgorV2h5OglTcGVlZHN0ZXAtY2VudHJpbm8gZHJpdmVyIHdpdGggQUNQSSBob29rcyBhbmQgYWNwaS1jcHVmcmVxIGRyaXZlciBhcmUKKwlmdW5jdGlvbmFsbHkgdmVyeSBtdWNoIHNpbWlsYXIuIFRoZXkgdGFsayB0byBBQ1BJIGluIHNhbWUgd2F5LiBPbmx5CisJZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gaXMgdGhlIHdheSB0aGV5IGRvIGZyZXF1ZW5jeSB0cmFuc2l0aW9ucy4KKwlPbmUgdXNlcyBNU1JzIGFuZCB0aGUgb3RoZXIgb25lIHVzZXMgSU8gcG9ydHMuIEZ1bmN0aW9uYWxpeSBvZgorCXNwZWVkc3RlcF9jZW50cmlubyB3aXRoIEFDUEkgaG9va3MgaXMgbm93IG1lcmdlZCBpbnRvIGFjcGktY3B1ZnJlcS4KKwlUaGF0IG1lYW5zIG9uZSBjb21tb24gZHJpdmVyIHdpbGwgc3VwcG9ydCBhbGwgSW50ZWwgRW5oYW5jZWQgU3BlZWRzdGVwCisJY2FwYWJsZSBDUFVzLiBUaGF0IG1lYW5zIGxlc3MgY29uZnVzaW9uIG92ZXIgbmFtZSBvZgorCXNwZWVkc3RlcC1jZW50cmlubyBkcml2ZXIgKHdpdGggdGhhdCBkcml2ZXIgc3VwcG9zZWQgdG8gYmUgdXNlZCBvbgorCW5vbi1jZW50cmlubyBwbGF0Zm9ybXMpLiBUaGF0IG1lYW5zIGxlc3MgZHVwbGljYXRpb24gb2YgY29kZSBhbmQKKwlsZXNzIG1haW50ZW5hbmNlIGVmZm9ydCBhbmQgbm8gcG9zc2liaWxpdHkgb2YgdGhlc2UgdHdvIGRyaXZlcnMKKwlnb2luZyBvdXQgb2Ygc3luYy4KKwlDdXJyZW50IHVzZXJzIG9mIHNwZWVkc3RlcF9jZW50cmlubyB3aXRoIEFDUEkgaG9va3MgYXJlIHJlcXVlc3RlZCB0bworCXN3aXRjaCBvdmVyIHRvIGFjcGktY3B1ZnJlcSBkcml2ZXIuIHNwZWVkc3RlcC1jZW50cmlubyB3aWxsIGNvbnRpbnVlCisJdG8gd29yayB1c2luZyBvbGRlciBub24tQUNQSSBzdGF0aWMgdGFibGUgYmFzZWQgc2NoZW1lIGV2ZW4gYWZ0ZXIgdGhpcworCWRhdGUuCisKK1dobzoJVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+CiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCmluZGV4IGViMWE2Y2EuLjc5MGVmNmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZworKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKQEAgLTEyNCw3ICsxMjQsNyBAQAogd3JpdGVfc3VwZXJfbG9ja2ZzOgk/CiB1bmxvY2tmczoJCT8KIHN0YXRmczoJCQlubwlubwlubwotcmVtb3VudF9mczoJCW5vCXllcwltYXliZQkJKHNlZSBiZWxvdykKK3JlbW91bnRfZnM6CQl5ZXMJeWVzCW1heWJlCQkoc2VlIGJlbG93KQogY2xlYXJfaW5vZGU6CQlubwogdW1vdW50X2JlZ2luOgkJeWVzCW5vCW5vCiBzaG93X29wdGlvbnM6CQlubwkJCQkodmZzbW91bnQtPnNlbSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWRmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2FkZnMudHh0CmluZGV4IDA2MGFiYjAuLjllODgxMWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWRmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZGZzLnR4dApAQCAtMyw3ICszLDcgQEAKIAogICB1aWQ9bm5uCUFsbCBmaWxlcyBpbiB0aGUgcGFydGl0aW9uIHdpbGwgYmUgb3duZWQgYnkKIAkJdXNlciBpZCBubm4uICBEZWZhdWx0IDAgKHJvb3QpLgotICBnaWQ9bm5uCUFsbCBmaWxlcyBpbiB0aGUgcGFydGl0aW9uIHdpbGxiZSBpbiBncm91cAorICBnaWQ9bm5uCUFsbCBmaWxlcyBpbiB0aGUgcGFydGl0aW9uIHdpbGwgYmUgaW4gZ3JvdXAKIAkJbm5uLiAgRGVmYXVsdCAwIChyb290KS4KICAgb3dubWFzaz1ubm4JVGhlIHBlcm1pc3Npb24gbWFzayBmb3IgQURGUyAnb3duZXInIHBlcm1pc3Npb25zCiAJCXdpbGwgYmUgbm5uLiAgRGVmYXVsdCAwNzAwLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9iZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9iZnMudHh0CmluZGV4IGQyODQxZTAuLmVhODI1ZTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYmZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Jmcy50eHQKQEAgLTU0LDQgKzU0LDQgQEAKIElmIHlvdSBoYXZlIGFueSBwYXRjaGVzLCBxdWVzdGlvbnMgb3Igc3VnZ2VzdGlvbnMgcmVnYXJkaW5nIHRoaXMgQkZTCiBpbXBsZW1lbnRhdGlvbiBwbGVhc2UgY29udGFjdCB0aGUgYXV0aG9yOgogCi1UaWdyYW4gQS4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KK1RpZ3JhbiBBaXZhemlhbiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9jb25maWdmcy9jb25maWdmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dAppbmRleCBjM2E3YWZiLi5iMzRjZGI1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dApAQCAtMjA5LDcgKzIwOSw3IEBACiAKIFtzdHJ1Y3QgY29uZmlnX2dyb3VwXQogCi1BIGNvbmZpZ19pdGVtIGNhbm5vdCBsaXZlIGluIGEgdmFjY3VtLiAgVGhlIG9ubHkgd2F5IG9uZSBjYW4gYmUgY3JlYXRlZAorQSBjb25maWdfaXRlbSBjYW5ub3QgbGl2ZSBpbiBhIHZhY3V1bS4gIFRoZSBvbmx5IHdheSBvbmUgY2FuIGJlIGNyZWF0ZWQKIGlzIHZpYSBta2RpcigyKSBvbiBhIGNvbmZpZ19ncm91cC4gIFRoaXMgd2lsbCB0cmlnZ2VyIGNyZWF0aW9uIG9mIGEKIGNoaWxkIGl0ZW0uCiAKQEAgLTI3NSw3ICsyNzUsNyBAQAogCiBbc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbV0KIAotQSBzdWJzeXN0ZW0gbXVzdCByZWdpc3RlciBpdHNlbGYsIHVzdXNhbGx5IGF0IG1vZHVsZV9pbml0IHRpbWUuICBUaGlzCitBIHN1YnN5c3RlbSBtdXN0IHJlZ2lzdGVyIGl0c2VsZiwgdXN1YWxseSBhdCBtb2R1bGVfaW5pdCB0aW1lLiAgVGhpcwogdGVsbHMgY29uZmlnZnMgdG8gbWFrZSB0aGUgc3Vic3lzdGVtIGFwcGVhciBpbiB0aGUgZmlsZSB0cmVlLgogCiAJc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlLnR4dAppbmRleCBhNTg0ZjA1Li4zNDUzOTJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQKQEAgLTUxLDYgKzUxLDIyIEBACiAKICAgaHR0cDovL2Z1c2Uuc291cmNlZm9yZ2UubmV0LwogCitGaWxlc3lzdGVtIHR5cGUKK35+fn5+fn5+fn5+fn5+fgorCitUaGUgZmlsZXN5c3RlbSB0eXBlIGdpdmVuIHRvIG1vdW50KDIpIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworJ2Z1c2UnCisKKyAgVGhpcyBpcyB0aGUgdXN1YWwgd2F5IHRvIG1vdW50IGEgRlVTRSBmaWxlc3lzdGVtLiAgVGhlIGZpcnN0CisgIGFyZ3VtZW50IG9mIHRoZSBtb3VudCBzeXN0ZW0gY2FsbCBtYXkgY29udGFpbiBhbiBhcmJpdHJhcnkgc3RyaW5nLAorICB3aGljaCBpcyBub3QgaW50ZXJwcmV0ZWQgYnkgdGhlIGtlcm5lbC4KKworJ2Z1c2VibGsnCisKKyAgVGhlIGZpbGVzeXN0ZW0gaXMgYmxvY2sgZGV2aWNlIGJhc2VkLiAgVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZQorICBtb3VudCBzeXN0ZW0gY2FsbCBpcyBpbnRlcnByZXRlZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlLgorCiBNb3VudCBvcHRpb25zCiB+fn5+fn5+fn5+fn5+CiAKQEAgLTk0LDYgKzExMCwxMSBAQAogICBUaGUgZGVmYXVsdCBpcyBpbmZpbml0ZS4gIE5vdGUgdGhhdCB0aGUgc2l6ZSBvZiByZWFkIHJlcXVlc3RzIGlzCiAgIGxpbWl0ZWQgYW55d2F5IHRvIDMyIHBhZ2VzICh3aGljaCBpcyAxMjhrYnl0ZSBvbiBpMzg2KS4KIAorJ2Jsa3NpemU9TicKKworICBTZXQgdGhlIGJsb2NrIHNpemUgZm9yIHRoZSBmaWxlc3lzdGVtLiAgVGhlIGRlZmF1bHQgaXMgNTEyLiAgVGhpcworICBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgJ2Z1c2VibGsnIHR5cGUgbW91bnRzLgorCiBDb250cm9sIGZpbGVzeXN0ZW0KIH5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0xMTEsNyArMTMyLDcgQEAKIAogICd3YWl0aW5nJwogCi0gIFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgd2hpY2ggYXJlIHdhaXRpbmcgdG8gYmUgdHJhbnNmZXJlZCB0bworICBUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHRyYW5zZmVycmVkIHRvCiAgIHVzZXJzcGFjZSBvciBiZWluZyBwcm9jZXNzZWQgYnkgdGhlIGZpbGVzeXN0ZW0gZGFlbW9uLiAgSWYgdGhlcmUgaXMKICAgbm8gZmlsZXN5c3RlbSBhY3Rpdml0eSBhbmQgJ3dhaXRpbmcnIGlzIG5vbi16ZXJvLCB0aGVuIHRoZQogICBmaWxlc3lzdGVtIGlzIGh1bmcgb3IgZGVhZGxvY2tlZC4KQEAgLTEzNiw3ICsxNTcsNyBAQAogCiAgIDIpIElmIHRoZSByZXF1ZXN0IGlzIG5vdCB5ZXQgc2VudCB0byB1c2Vyc3BhY2UgQU5EIHRoZSBzaWduYWwgaXMgbm90CiAgICAgIGZhdGFsLCB0aGVuIGFuICdpbnRlcnJ1cHRlZCcgZmxhZyBpcyBzZXQgZm9yIHRoZSByZXF1ZXN0LiAgV2hlbgotICAgICB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdHJhbnNmZXJlZCB0byB1c2Vyc3BhY2UgYW5kCisgICAgIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCB0byB1c2Vyc3BhY2UgYW5kCiAgICAgIHRoaXMgZmxhZyBpcyBzZXQsIGFuIElOVEVSUlVQVCByZXF1ZXN0IGlzIHF1ZXVlZC4KIAogICAzKSBJZiB0aGUgcmVxdWVzdCBpcyBhbHJlYWR5IHNlbnQgdG8gdXNlcnNwYWNlLCB0aGVuIGFuIElOVEVSUlVQVApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9ocGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaHBmcy50eHQKaW5kZXggMzNkYzM2MC4uMzhhYmEwMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9ocGZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2hwZnMudHh0CkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICAgRml4ZWQgcmFjZS1jb25kaXRpb24gaW4gYnVmZmVyIGNvZGUgLSBpdCBpcyBpbiBhbGwgZmlsZXN5c3RlbXMgaW4gTGludXg7CiAgICAgICAgIHdoZW4gcmVhZGluZyBkZXZpY2UgKGNhdCAvZGV2L2hkYSkgd2hpbGUgY3JlYXRpbmcgZmlsZXMgb24gaXQsIGZpbGVzCiAgICAgICAgIGNvdWxkIGJlIGRhbWFnZWQKLTIuMDIgV29yYXJvdW5kIGZvciBidWcgaW4gYnJlYWRhIGluIExpbnV4LiBicmVhZGEgY291bGQgY2F1c2UgYWNjZXNzZXMgYmV5b25kCisyLjAyIFdvcmthcm91bmQgZm9yIGJ1ZyBpbiBicmVhZGEgaW4gTGludXguIGJyZWFkYSBjb3VsZCBjYXVzZSBhY2Nlc3NlcyBiZXlvbmQKICAgICAgICAgZW5kIG9mIHBhcnRpdGlvbgogMi4wMyBDaGFyLCBibG9jayBkZXZpY2VzIGFuZCBwaXBlcyBhcmUgY29ycmVjdGx5IGNyZWF0ZWQKICAgICAgRml4ZWQgbm9uLWNyYXNoaW5nIHJhY2UgaW4gdW5saW5rIChBbGV4YW5kZXIgVmlybykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0CmluZGV4IDM1ZjEwNWIuLjEzYmE2NDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9udGZzLnR4dApAQCAtMzM3LDcgKzMzNyw3IEBACiB0aGlzIChub3RlIGFsbCB2YWx1ZXMgYXJlIGluIDUxMi1ieXRlIHNlY3RvcnMpOgogCiAtLS0gY3V0IGhlcmUgLS0tCi0jIE9mcyBTaXplICAgUmFpZCAgIExvZyAgTnVtYmVyIFJlZ2lvbiBTaG91bGQgTnVtYmVyIFNvdXJjZSAgU3RhcnQgVGFnZXQgIFN0YXJ0CisjIE9mcyBTaXplICAgUmFpZCAgIExvZyAgTnVtYmVyIFJlZ2lvbiBTaG91bGQgTnVtYmVyIFNvdXJjZSAgU3RhcnQgVGFyZ2V0IFN0YXJ0CiAjIGluICBvZiB0aGUgdHlwZSAgIHR5cGUgb2YgbG9nIHNpemUgICBzeW5jPyAgb2YgICAgIERldmljZSAgaW4gICAgRGV2aWNlIGluCiAjIHZvbCB2b2x1bWUJCSBwYXJhbXMJCSAgICAgbWlycm9ycwkgICAgIERldmljZQkgIERldmljZQogMCAgICAyMDU2MzIwIG1pcnJvciBjb3JlIDIJMTYgICAgIG5vc3luYyAyCSAgIC9kZXYvaGRhMSAwICAgL2Rldi9oZGIxIDAKQEAgLTU5OSw3ICs1OTksNyBAQAogCS0gTWFqb3IgYnVnIGZpeGVzIGZvciByZWFkaW5nIGZpbGVzIGFuZCB2b2x1bWVzIGluIGNvcm5lciBjYXNlcyB3aGljaAogCSAgd2VyZSBiZWluZyBoaXQgYnkgV2luZG93cyAyay9YUCB1c2Vycy4KIDIuMS4yOgotCS0gTWFqb3IgYnVnIGZpeGVzIGFsZXZpYXRpbmcgdGhlIGhhbmdzIGluIHN0YXRmcyBleHBlcmllbmNlZCBieSBzb21lCisJLSBNYWpvciBidWcgZml4ZXMgYWxsZXZpYXRpbmcgdGhlIGhhbmdzIGluIHN0YXRmcyBleHBlcmllbmNlZCBieSBzb21lCiAJICB1c2Vycy4KIDIuMS4xOgogCS0gVXBkYXRlIGhhbmRsaW5nIG9mIGNvbXByZXNzZWQgZmlsZXMgc28gcGVvcGxlIG5vIGxvbmdlciBnZXQgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb2NmczIudHh0CmluZGV4IDQzODljNjguLjhjY2YwYzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb2NmczIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb2NmczIudHh0CkBAIC0zMCw3ICszMCw3IEBACiBGZWF0dXJlcyB3aGljaCBPQ0ZTMiBkb2VzIG5vdCBzdXBwb3J0IHlldDoKIAktIHNwYXJzZSBmaWxlcwogCS0gZXh0ZW5kZWQgYXR0cmlidXRlcwotCS0gc2hhcmVkIHdyaXRlYWJsZSBtbWFwCisJLSBzaGFyZWQgd3JpdGFibGUgbW1hcAogCS0gbG9vcGJhY2sgaXMgc3VwcG9ydGVkLCBidXQgZGF0YSB3cml0dGVuIHdpbGwgbm90CiAJICBiZSBjbHVzdGVyIGNvaGVyZW50LgogCS0gcXVvdGFzCkBAIC01NCwzICs1NCw2IEBACiBpbnRyCQkoKikJQWxsb3cgc2lnbmFscyB0byBpbnRlcnJ1cHQgY2x1c3RlciBvcGVyYXRpb25zLgogbm9pbnRyCQkJRG8gbm90IGFsbG93IHNpZ25hbHMgdG8gaW50ZXJydXB0IGNsdXN0ZXIKIAkJCW9wZXJhdGlvbnMuCithdGltZV9xdWFudHVtPTYwKCopCU9DRlMyIHdpbGwgbm90IHVwZGF0ZSBhdGltZSB1bmxlc3MgdGhpcyBudW1iZXIKKwkJCW9mIHNlY29uZHMgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuCisJCQlTZXQgdG8gemVybyB0byBhbHdheXMgdXBkYXRlIGF0aW1lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggMzM1NWU2OS4uNzJhZjVkZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC0xMjIwLDkgKzEyMjAsOSBAQAogeW91IHByb2JhYmx5IHNob3VsZCBpbmNyZWFzZSB0aGUgbG93ZXJfem9uZV9wcm90ZWN0aW9uIHNldHRpbmcuCiAKIFRoZSB1bml0cyBvZiB0aGlzIHR1bmFibGUgYXJlIGZhaXJseSB2YWd1ZS4gIEl0IGlzIGFwcHJveGltYXRlbHkgZXF1YWwKLXRvICJtZWdhYnl0ZXMiLiAgU28gc2V0dGluZyBsb3dlcl96b25lX3Byb3RlY3Rpb249MTAwIHdpbGwgcHJvdGVjdCBhcm91bmQgMTAwCit0byAibWVnYWJ5dGVzLCIgc28gc2V0dGluZyBsb3dlcl96b25lX3Byb3RlY3Rpb249MTAwIHdpbGwgcHJvdGVjdCBhcm91bmQgMTAwCiBtZWdhYnl0ZXMgb2YgdGhlIGxvd21lbSB6b25lIGZyb20gdXNlciBhbGxvY2F0aW9ucy4gIEl0IHdpbGwgYWxzbyBtYWtlCi10aG9zZSAxMDAgbWVnYWJ5dGVzIHVuYXZhbGlhYmxlIGZvciB1c2UgYnkgYXBwbGljYXRpb25zIGFuZCBieQordGhvc2UgMTAwIG1lZ2FieXRlcyB1bmF2YWlsYWJsZSBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucyBhbmQgYnkKIHBhZ2VjYWNoZSwgc28gdGhlcmUgaXMgYSBjb3N0LgogCiBUaGUgZWZmZWN0cyBvZiB0aGlzIHR1bmFibGUgbWF5IGJlIG9ic2VydmVkIGJ5IG1vbml0b3JpbmcKQEAgLTE1MzgsMTAgKzE1MzgsMTAgQEAKIHRjcF9lY24KIC0tLS0tLS0KIAotVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIEVDTiBiaXQgaW4gdGhlIElQdjQgaGVhZGVycywgdGhpcyBpcyBhIG5ldworVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIEVDTiBiaXQgaW4gdGhlIElQdjQgaGVhZGVycy4gVGhpcyBpcyBhIG5ldwogZmVhdHVyZSBhYm91dCBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiwgYnV0IHNvbWUgcm91dGVycyBhbmQgZmlyZXdhbGxzCi1ibG9jayB0cmFmaWMgdGhhdCBoYXMgdGhpcyBiaXQgc2V0LCBzbyBpdCBjb3VsZCBiZSBuZWNlc3NhcnkgdG8gZWNobyAwIHRvCi0vcHJvYy9zeXMvbmV0L2lwdjQvdGNwX2VjbiwgaWYgeW91IHdhbnQgdG8gdGFsayB0byB0aGlzIHNpdGVzLiBGb3IgbW9yZSBpbmZvCitibG9jayB0cmFmZmljIHRoYXQgaGFzIHRoaXMgYml0IHNldCwgc28gaXQgY291bGQgYmUgbmVjZXNzYXJ5IHRvIGVjaG8gMCB0bworL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF9lY24gaWYgeW91IHdhbnQgdG8gdGFsayB0byB0aGVzZSBzaXRlcy4gRm9yIG1vcmUgaW5mbwogeW91IGNvdWxkIHJlYWQgUkZDMjQ4MS4KIAogdGNwX3JldHJhbnNfY29sbGFwc2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3B1ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zcHVmcy50eHQKaW5kZXggOTgyNjQ1YS4uMTM0M2QxMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zcHVmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zcHVmcy50eHQKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgL3NpZ25hbDIKICAgICAgICBUaGUgdHdvIHNpZ25hbCBub3RpZmljYXRpb24gY2hhbm5lbHMgb2YgYW4gU1BVLiAgVGhlc2UgIGFyZSAgcmVhZC13cml0ZQogICAgICAgIGZpbGVzICB0aGF0ICBvcGVyYXRlICBvbiAgYSAzMiBiaXQgd29yZC4gIFdyaXRpbmcgdG8gb25lIG9mIHRoZXNlIGZpbGVzCi0gICAgICAgdHJpZ2dlcnMgYW4gaW50ZXJydXB0IG9uIHRoZSBTUFUuIFRoZSAgdmFsdWUgIHdyaXR0aW5nICB0byAgdGhlICBzaWduYWwKKyAgICAgICB0cmlnZ2VycyBhbiBpbnRlcnJ1cHQgb24gdGhlIFNQVS4gIFRoZSAgdmFsdWUgIHdyaXR0ZW4gIHRvICB0aGUgIHNpZ25hbAogICAgICAgIGZpbGVzIGNhbiBiZSByZWFkIGZyb20gdGhlIFNQVSB0aHJvdWdoIGEgY2hhbm5lbCByZWFkIG9yIGZyb20gaG9zdCB1c2VyCiAgICAgICAgc3BhY2UgdGhyb3VnaCB0aGUgZmlsZS4gIEFmdGVyIHRoZSB2YWx1ZSBoYXMgYmVlbiByZWFkIGJ5IHRoZSAgU1BVLCAgaXQKICAgICAgICBpcyAgcmVzZXQgIHRvIHplcm8uICBUaGUgcG9zc2libGUgb3BlcmF0aW9ucyBvbiBhbiBvcGVuIHNpZ25hbDEgb3Igc2lnLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXN2LWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzdi1mcy50eHQKaW5kZXggZDgxNzIyNC4uMjUzYjUwZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXN2LWZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c3YtZnMudHh0CkBAIC0xLDExICsxLDggQEAKLVRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTeXN0ZW1WL0NvaGVyZW50IGZpbGVzeXN0ZW0gZm9yIExpbnV4LgogSXQgaW1wbGVtZW50cyBhbGwgb2YKICAgLSBYZW5peCBGUywKICAgLSBTeXN0ZW1WLzM4NiBGUywKICAgLSBDb2hlcmVudCBGUy4KIAotVGhpcyBpcyB2ZXJzaW9uIGJldGEgNC4KLQogVG8gaW5zdGFsbDoKICogQW5zd2VyIHRoZSAnU3lzdGVtIFYgYW5kIENvaGVyZW50IGZpbGVzeXN0ZW0gc3VwcG9ydCcgcXVlc3Rpb24gd2l0aCAneScKICAgd2hlbiBjb25maWd1cmluZyB0aGUga2VybmVsLgpAQCAtMjgsMTEgKzI1LDE3MyBAQAogICBmb3IgdGhpcyBGUyBvbiBoYXJkIGRpc2sgeWV0LgogCiAKLVBsZWFzZSByZXBvcnQgYW55IGJ1Z3MgYW5kIHN1Z2dlc3Rpb25zIHRvCi0gIEJydW5vIEhhaWJsZSA8aGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KLSAgUGFzY2FsIEhhaWJsZSA8aGFpYmxlQGl6Zm0udW5pLXN0dXR0Z2FydC5kZT4KLSAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kgPGtnYkBtYW5qYWsua25tLm9yZy5wbD4KK1RoZXNlIGZpbGVzeXN0ZW1zIGFyZSByYXRoZXIgc2ltaWxhci4gSGVyZSBpcyBhIGNvbXBhcmlzb24gd2l0aCBNaW5peCBGUzoKIAotQnJ1bm8gSGFpYmxlCi08aGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4KKyogTGludXggZmRpc2sgcmVwb3J0cyBvbiBwYXJ0aXRpb25zCisgIC0gTWluaXggRlMgICAgIDB4ODEgTGludXgvTWluaXgKKyAgLSBYZW5peCBGUyAgICAgPz8KKyAgLSBTeXN0ZW1WIEZTICAgPz8KKyAgLSBDb2hlcmVudCBGUyAgMHgwOCBBSVggYm9vdGFibGUKIAorKiBTaXplIG9mIGEgYmxvY2sgb3Igem9uZSAoZGF0YSBhbGxvY2F0aW9uIHVuaXQgb24gZGlzaykKKyAgLSBNaW5peCBGUyAgICAgMTAyNAorICAtIFhlbml4IEZTICAgICAxMDI0IChhbHNvIDUxMiA/PykKKyAgLSBTeXN0ZW1WIEZTICAgMTAyNCAoYWxzbyA1MTIgYW5kIDIwNDgpCisgIC0gQ29oZXJlbnQgRlMgICA1MTIKKworKiBHZW5lcmFsIGxheW91dDogYWxsIGhhdmUgb25lIGJvb3QgYmxvY2ssIG9uZSBzdXBlciBibG9jayBhbmQKKyAgc2VwYXJhdGUgYXJlYXMgZm9yIGlub2RlcyBhbmQgZm9yIGRpcmVjdG9yaWVzL2RhdGEuCisgIE9uIFN5c3RlbVYgUmVsZWFzZSAyIEZTIChlLmcuIE1pY3JvcG9ydCkgdGhlIGZpcnN0IHRyYWNrIGlzIHJlc2VydmVkIGFuZAorICBhbGwgdGhlIGJsb2NrIG51bWJlcnMgKGluY2x1ZGluZyB0aGUgc3VwZXIgYmxvY2spIGFyZSBvZmZzZXQgYnkgb25lIHRyYWNrLgorCisqIEJ5dGUgb3JkZXJpbmcgb2YgInNob3J0IiAoMTYgYml0IGVudGl0aWVzKSBvbiBkaXNrOgorICAtIE1pbml4IEZTICAgICBsaXR0bGUgZW5kaWFuICAwIDEKKyAgLSBYZW5peCBGUyAgICAgbGl0dGxlIGVuZGlhbiAgMCAxCisgIC0gU3lzdGVtViBGUyAgIGxpdHRsZSBlbmRpYW4gIDAgMQorICAtIENvaGVyZW50IEZTICBsaXR0bGUgZW5kaWFuICAwIDEKKyAgT2YgY291cnNlLCB0aGlzIGFmZmVjdHMgb25seSB0aGUgZmlsZSBzeXN0ZW0sIG5vdCB0aGUgZGF0YSBvZiBmaWxlcyBvbiBpdCEKKworKiBCeXRlIG9yZGVyaW5nIG9mICJsb25nIiAoMzIgYml0IGVudGl0aWVzKSBvbiBkaXNrOgorICAtIE1pbml4IEZTICAgICBsaXR0bGUgZW5kaWFuICAwIDEgMiAzCisgIC0gWGVuaXggRlMgICAgIGxpdHRsZSBlbmRpYW4gIDAgMSAyIDMKKyAgLSBTeXN0ZW1WIEZTICAgbGl0dGxlIGVuZGlhbiAgMCAxIDIgMworICAtIENvaGVyZW50IEZTICBQRFAtMTEgICAgICAgICAyIDMgMCAxCisgIE9mIGNvdXJzZSwgdGhpcyBhZmZlY3RzIG9ubHkgdGhlIGZpbGUgc3lzdGVtLCBub3QgdGhlIGRhdGEgb2YgZmlsZXMgb24gaXQhCisKKyogSW5vZGUgb24gZGlzazogInNob3J0IiwgMCBtZWFucyBub24tZXhpc3RlbnQsIHRoZSByb290IGRpciBpbm8gaXM6CisgIC0gTWluaXggRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUyAgIDIKKworKiBNYXhpbXVtIG51bWJlciBvZiBoYXJkIGxpbmtzIHRvIGEgZmlsZToKKyAgLSBNaW5peCBGUyAgICAgMjUwCisgIC0gWGVuaXggRlMgICAgID8/CisgIC0gU3lzdGVtViBGUyAgID8/CisgIC0gQ29oZXJlbnQgRlMgID49MTAwMDAKKworKiBGcmVlIGlub2RlIG1hbmFnZW1lbnQ6CisgIC0gTWluaXggRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYml0bWFwCisgIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCisgICAgICBUaGVyZSBpcyBhIGNhY2hlIG9mIGEgY2VydGFpbiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgaW4gdGhlIHN1cGVyLWJsb2NrLgorICAgICAgV2hlbiBpdCBpcyBleGhhdXN0ZWQsIG5ldyBmcmVlIGlub2RlcyBhcmUgZm91bmQgdXNpbmcgYSBsaW5lYXIgc2VhcmNoLgorCisqIEZyZWUgYmxvY2sgbWFuYWdlbWVudDoKKyAgLSBNaW5peCBGUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBiaXRtYXAKKyAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMKKyAgICAgIEZyZWUgYmxvY2tzIGFyZSBvcmdhbml6ZWQgaW4gYSAiZnJlZSBsaXN0Ii4gTWF5YmUgYSBtaXNsZWFkaW5nIHRlcm0sCisgICAgICBzaW5jZSBpdCBpcyBub3QgdHJ1ZSB0aGF0IGV2ZXJ5IGZyZWUgYmxvY2sgY29udGFpbnMgYSBwb2ludGVyIHRvCisgICAgICB0aGUgbmV4dCBmcmVlIGJsb2NrLiBSYXRoZXIsIHRoZSBmcmVlIGJsb2NrcyBhcmUgb3JnYW5pemVkIGluIGNodW5rcworICAgICAgb2YgbGltaXRlZCBzaXplLCBhbmQgZXZlcnkgbm93IGFuZCB0aGVuIGEgZnJlZSBibG9jayBjb250YWlucyBwb2ludGVycworICAgICAgdG8gdGhlIGZyZWUgYmxvY2tzIHBlcnRhaW5pbmcgdG8gdGhlIG5leHQgY2h1bms7IHRoZSBmaXJzdCBvZiB0aGVzZQorICAgICAgY29udGFpbnMgcG9pbnRlcnMgYW5kIHNvIG9uLiBUaGUgbGlzdCB0ZXJtaW5hdGVzIHdpdGggYSAiYmxvY2sgbnVtYmVyIgorICAgICAgMCBvbiBYZW5peCBGUyBhbmQgU3lzdGVtViBGUywgd2l0aCBhIGJsb2NrIHplcm9lZCBvdXQgb24gQ29oZXJlbnQgRlMuCisKKyogU3VwZXItYmxvY2sgbG9jYXRpb246CisgIC0gTWluaXggRlMgICAgIGJsb2NrIDEgPSBieXRlcyAxMDI0Li4yMDQ3CisgIC0gWGVuaXggRlMgICAgIGJsb2NrIDEgPSBieXRlcyAxMDI0Li4yMDQ3CisgIC0gU3lzdGVtViBGUyAgIGJ5dGVzIDUxMi4uMTAyMworICAtIENvaGVyZW50IEZTICBibG9jayAxID0gYnl0ZXMgNTEyLi4xMDIzCisKKyogU3VwZXItYmxvY2sgbGF5b3V0OgorICAtIE1pbml4IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfbmlub2RlczsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19uem9uZXM7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfaW1hcF9ibG9ja3M7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfem1hcF9ibG9ja3M7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZmlyc3RkYXRhem9uZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19sb2dfem9uZV9zaXplOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNfbWF4X3NpemU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfbWFnaWM7CisgIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZmlyc3RkYXRhem9uZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgc19uem9uZXM7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZnpvbmVfY291bnQ7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIHNfZnpvbmVzW05JQ0ZSRUVdOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2Zpbm9kZV9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19maW5vZGVzW05JQ0lOT0RdOworICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX2Zsb2NrOworICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX2lsb2NrOworICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX21vZGlmaWVkOworICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX3Jkb25seTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgc190aW1lOworICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICBzX2RpbmZvWzRdOyAtLSBTeXN0ZW1WIEZTIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgc19mcmVlX3pvbmVzOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2ZyZWVfaW5vZGVzOworICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICBzX2RpbmZvWzRdOyAtLSBYZW5peCBGUyBvbmx5CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfaW50ZXJsZWF2ZV9tLHNfaW50ZXJsZWF2ZV9uOyAtLSBDb2hlcmVudCBGUyBvbmx5CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfZm5hbWVbNl07CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfZnBhY2tbNl07CisgICAgdGhlbiB0aGV5IGRpZmZlciBjb25zaWRlcmFibHk6CisgICAgICAgIFhlbml4IEZTCisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfY2xlYW47CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfZmlsbFszNzFdOworICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICBzX21hZ2ljOworICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICBzX3R5cGU7CisgICAgICAgIFN5c3RlbVYgRlMKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc19maWxsWzEyIG9yIDE0XTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc19zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc19tYWdpYzsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc190eXBlOworICAgICAgICBDb2hlcmVudCBGUworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBzX3VuaXF1ZTsKKyAgICBOb3RlIHRoYXQgQ29oZXJlbnQgRlMgaGFzIG5vIG1hZ2ljLgorCisqIElub2RlIGxheW91dDoKKyAgLSBNaW5peCBGUworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX21vZGU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfdWlkOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBpX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGlfdGltZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgaV9naWQ7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgIGlfbmxpbmtzOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX3pvbmVbNysxKzFdOworICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX21vZGU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfbmxpbms7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfdWlkOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX2dpZDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9zaXplOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICBpX3pvbmVbMyooMTArMSsxKzEpXTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9hdGltZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9tdGltZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9jdGltZTsKKworKiBSZWd1bGFyIGZpbGUgZGF0YSBibG9ja3MgYXJlIG9yZ2FuaXplZCBhcworICAtIE1pbml4IEZTCisgICAgICAgICAgICAgICA3IGRpcmVjdCBibG9ja3MKKyAgICAgICAgICAgICAgIDEgaW5kaXJlY3QgYmxvY2sgKHBvaW50ZXJzIHRvIGJsb2NrcykKKyAgICAgICAgICAgICAgIDEgZG91YmxlLWluZGlyZWN0IGJsb2NrIChwb2ludGVyIHRvIHBvaW50ZXJzIHRvIGJsb2NrcykKKyAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMKKyAgICAgICAgICAgICAgMTAgZGlyZWN0IGJsb2NrcworICAgICAgICAgICAgICAgMSBpbmRpcmVjdCBibG9jayAocG9pbnRlcnMgdG8gYmxvY2tzKQorICAgICAgICAgICAgICAgMSBkb3VibGUtaW5kaXJlY3QgYmxvY2sgKHBvaW50ZXIgdG8gcG9pbnRlcnMgdG8gYmxvY2tzKQorICAgICAgICAgICAgICAgMSB0cmlwbGUtaW5kaXJlY3QgYmxvY2sgKHBvaW50ZXIgdG8gcG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gYmxvY2tzKQorCisqIElub2RlIHNpemUsIGlub2RlcyBwZXIgYmxvY2sKKyAgLSBNaW5peCBGUyAgICAgICAgMzIgICAzMgorICAtIFhlbml4IEZTICAgICAgICA2NCAgIDE2CisgIC0gU3lzdGVtViBGUyAgICAgIDY0ICAgMTYKKyAgLSBDb2hlcmVudCBGUyAgICAgNjQgICAgOAorCisqIERpcmVjdG9yeSBlbnRyeSBvbiBkaXNrCisgIC0gTWluaXggRlMKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW5vZGU7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVsxNC8zMF07CisgIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlub2RlOworICAgICAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMTRdOworCisqIERpciBlbnRyeSBzaXplLCBkaXIgZW50cmllcyBwZXIgYmxvY2sKKyAgLSBNaW5peCBGUyAgICAgMTYvMzIgICAgNjQvMzIKKyAgLSBYZW5peCBGUyAgICAgMTYgICAgICAgNjQKKyAgLSBTeXN0ZW1WIEZTICAgMTYgICAgICAgNjQKKyAgLSBDb2hlcmVudCBGUyAgMTYgICAgICAgMzIKKworKiBIb3cgdG8gaW1wbGVtZW50IHN5bWJvbGljIGxpbmtzIHN1Y2ggdGhhdCB0aGUgaG9zdCBmc2NrIGRvZXNuJ3Qgc2NyZWFtOgorICAtIE1pbml4IEZTICAgICBub3JtYWwKKyAgLSBYZW5peCBGUyAgICAga2x1ZGdlOiBhcyByZWd1bGFyIGZpbGVzIHdpdGggIGNobW9kIDEwMDAKKyAgLSBTeXN0ZW1WIEZTICAgPz8KKyAgLSBDb2hlcmVudCBGUyAga2x1ZGdlOiBhcyByZWd1bGFyIGZpbGVzIHdpdGggIGNobW9kIDEwMDAKKworCitOb3RhdGlvbjogV2Ugb2Z0ZW4gc3BlYWsgb2YgYSAiYmxvY2siIGJ1dCBtZWFuIGEgem9uZSAodGhlIGFsbG9jYXRpb24gdW5pdCkKK2FuZCBub3QgdGhlIGRpc2sgZHJpdmVyJ3Mgbm90aW9uIG9mICJibG9jayIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3VkZi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3VkZi50eHQKaW5kZXggNTExYjQyMy4uZmRlODI5YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy91ZGYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWRmLnR4dApAQCAtNyw4ICs3LDE3IEBACiBwbGVhc2UgcmVwb3J0IHRoZW0gdG8gbGludXhfdWRmQGhwZXNqcm8uZmMuaHAuY29tLCB3aGljaCBpcyB0aGUKIGRldmVsb3BlcidzIGxpc3QuCiAKLVdyaXRlIHN1cHBvcnQgcmVxdWlyZXMgYSBibG9jayBkcml2ZXIgd2hpY2ggc3VwcG9ydHMgd3JpdGluZy4gVGhlIGN1cnJlbnQKLXNjc2kgYW5kIGlkZSBjZHJvbSBkcml2ZXJzIGRvIG5vdCBzdXBwb3J0IHdyaXRpbmcuCitXcml0ZSBzdXBwb3J0IHJlcXVpcmVzIGEgYmxvY2sgZHJpdmVyIHdoaWNoIHN1cHBvcnRzIHdyaXRpbmcuICBDdXJyZW50bHkKK2R2ZCtydyBkcml2ZXMgYW5kIG1lZGlhIHN1cHBvcnQgdHJ1ZSByYW5kb20gc2VjdG9yIHdyaXRlcywgYW5kIHNvIGEgdWRmCitmaWxlc3lzdGVtIG9uIHN1Y2ggZGV2aWNlcyBjYW4gYmUgZGlyZWN0bHkgbW91bnRlZCByZWFkL3dyaXRlLiAgQ0QtUlcKK21lZGlhIGhvd2V2ZXIsIGRvZXMgbm90IHN1cHBvcnQgdGhpcy4gIEluc3RlYWQgdGhlIG1lZGlhIGNhbiBiZSBmb3JtYXR0ZWQKK2ZvciBwYWNrZXQgbW9kZSB1c2luZyB0aGUgdXRpbGl0eSBjZHJ3dG9vbCwgdGhlbiB0aGUgcGt0Y2R2ZCBkcml2ZXIgY2FuCitiZSBib3VuZCB0byB0aGUgdW5kZXJseWluZyBjZCBkZXZpY2UgdG8gcHJvdmlkZSB0aGUgcmVxdWlyZWQgYnVmZmVyaW5nCithbmQgcmVhZC1tb2RpZnktd3JpdGUgY3ljbGVzIHRvIGFsbG93IHRoZSBmaWxlc3lzdGVtIHJhbmRvbSBzZWN0b3Igd3JpdGVzCit3aGlsZSBwcm92aWRpbmcgdGhlIGhhcmR3YXJlIHdpdGggb25seSBmdWxsIHBhY2tldCB3cml0ZXMuICBXaGlsZSBub3QKK3JlcXVpcmVkIGZvciBkdmQrcncgbWVkaWEsIHVzZSBvZiB0aGUgcGt0Y2R2ZCBkcml2ZXIgb2Z0ZW4gZW5oYW5jZXMKK3BlcmZvcm1hbmNlIGR1ZSB0byB2ZXJ5IHBvb3IgcmVhZC1tb2RpZnktd3JpdGUgc3VwcG9ydCBzdXBwbGllZCBpbnRlcm5hbGx5CitieSBkcml2ZSBmaXJtd2FyZS4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogVGhlIGZvbGxvd2luZyBtb3VudCBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Z0YXBlLnR4dCBiL0RvY3VtZW50YXRpb24vZnRhcGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDhiYjMzLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZnRhcGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLUludHJvCi09PT09PQotCi1UaGlzIGZpbGUgZGVzY3JpYmVzIHNvbWUgaXNzdWVzIGludm9sdmVkIHdoZW4gdXNpbmcgdGhlICJmdGFwZSIKLWZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIgdGhhdCBjb21lcyB3aXRoIHRoZSBMaW51eCBrZXJuZWwuCi0KLWZ0YXBlIGhhcyBhIGhvbWUgcGFnZSBhdAotCi1odHRwOi8vZnRhcGUuZG90LWhlaW5lLmRlLwotCi13aGljaCBjb250YWlucyBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IGZ0YXBlLiBQbGVhc2UgY3Jvc3MgY2hlY2sKLXRoaXMgV1dXIGFkZHJlc3MgYWdhaW5zdCB0aGUgYWRkcmVzcyBnaXZlbiAoaWYgYW55KSBpbiB0aGUgTUFJTlRBSU5FUlMKLWZpbGUgbG9jYXRlZCBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBvZiB0aGUgTGludXgga2VybmVsIHNvdXJjZQotdHJlZS4KLQotTk9URTogVGhpcyBpcyBhbiB1bm1haW50YWluZWQgc2V0IG9mIGRyaXZlcnMsIGFuZCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byB3b3JrLgotSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRha2luZyBvdmVyIG1haW50ZW5hbmNlLCBjb250YWN0IENsYXVzLUp1c3R1cyBIZWluZQotPGNoQGRvdC1oZWluZS5kZT4sIHRoZSBmb3JtZXIgbWFpbnRhaW5lci4KLQotQ29udGVudHMKLT09PT09PT09Ci0KLUEgbWludXMgMTogRnRhcGUgZG9jdW1lbnRhdGlvbgotCi1BLiBDaGFuZ2VzCi0gICAxLiBHb2FsCi0gICAyLiBJL08gQmxvY2sgU2l6ZQotICAgMy4gV3JpdGUgQWNjZXNzIHdoZW4gbm90IGF0IEVPRCAoRW5kIE9mIERhdGEpIG9yIEJPVCAoQmVnaW4gT2YgVGFwZSkKLSAgIDQuIEZvcm1hdHRpbmcKLSAgIDUuIEludGVyY2hhbmdpbmcgY2FydHJpZGdlcyB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zCi0KLUIuIERlYnVnZ2luZyBPdXRwdXQKLSAgIDEuIEludHJvZHVjdGlvbgotICAgMi4gVHVuaW5nIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0Ci0KLUMuIEJvb3QgYW5kIGxvYWQgdGltZSBjb25maWd1cmF0aW9uCi0gICAxLiBTZXR0aW5nIGJvb3QgdGltZSBwYXJhbWV0ZXJzCi0gICAyLiBNb2R1bGUgbG9hZCB0aW1lIHBhcmFtZXRlcnMKLSAgIDMuIEZ0YXBlIGJvb3QtIGFuZCBsb2FkIHRpbWUgb3B0aW9ucwotICAgNC4gRXhhbXBsZSBrZXJuZWwgcGFyYW1ldGVyIHNldHRpbmcKLSAgIDUuIEV4YW1wbGUgbW9kdWxlIHBhcmFtZXRlciBzZXR0aW5nCi0KLUQuIFN1cHBvcnQgYW5kIGNvbnRhY3RzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQSBtaW51cyAxLiBGdGFwZSBkb2N1bWVudGF0aW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVW5sdWNraWx5LCB0aGUgZnRhcGUtSE9XVE8gaXMgb3V0IG9mIGRhdGUuIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlCi1jaGFuZ2VkLiBVcCB0byBkYXRlIGRvY3VtZW50YXRpb24gYXMgd2VsbCBhcyByZWNlbnQgZGV2ZWxvcG1lbnQKLXZlcnNpb25zIG9mIGZ0YXBlIGFuZCB1c2VmdWwgbGlua3MgdG8gcmVsYXRlZCB0b3BpY3MgY2FuIGJlIGZvdW5kIGF0Ci10aGUgZnRhcGUgaG9tZSBwYWdlIGF0Ci0KLWh0dHA6Ly9mdGFwZS5kb3QtaGVpbmUuZGUvCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQS4gQ2hhbmdlcwotPT09PT09PT09PQotCi0xLiBHb2FsCi0gICB+fn5+Ci0gICBUaGUgZ29hbCBvZiBhbGwgdGhhdCBpbmNvbXBhdGliaWxpdGllcyB3YXMgdG8gZ2l2ZSBmdGFwZSBhbiBpbnRlcmZhY2UKLSAgIHRoYXQgcmVzZW1ibGVzIHRoZSBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgU0NTSSB0YXBlIGRyaXZlcyBhcyBjbG9zZQotICAgYXMgcG9zc2libGUuIFRodXMgYW55IFVuaXggYmFja3VwIHByb2dyYW0gdGhhdCBpcyBrbm93biB0byB3b3JrCi0gICB3aXRoIFNDU0kgdGFwZSBkcml2ZXMgc2hvdWxkIGFsc28gd29yay4KLQotICAgVGhlIGNvbmNlcHQgb2YgYSBmaXhlZCBibG9jayBzaXplIGZvciByZWFkL3dyaXRlIHRyYW5zZmVycyBpcwotICAgcmF0aGVyIHVucmVsYXRlZCB0byB0aGlzIFNDU0kgdGFwZSBjb21wYXRpYmlsaXR5IGF0IHRoZSBmaWxlIHN5c3RlbQotICAgaW50ZXJmYWNlIGxldmVsLiBJdCBkZXZlbG9wZWQgb3V0IG9mIGEgZmVhdHVyZSBvZiB6ZnRhcGUsIGEKLSAgIGJsb2NrIHdpc2UgdXNlciB0cmFuc3BhcmVudCBvbi10aGUtZmx5IGNvbXByZXNzaW9uLiBUaGF0IGNvbXByZXNzaW9uCi0gICBzdXBwb3J0IHdpbGwgbm90IGJlIGRyb3BwZWQgaW4gZnV0dXJlIHJlbGVhc2VzIGZvciBjb21wYXRpYmlsaXR5Ci0gICByZWFzb25zIHdpdGggcHJldmlvdXMgcmVsZWFzZXMgb2YgemZ0YXBlLgotCi0yLiBJL08gQmxvY2sgU2l6ZQotICAgfn5+fn5+fn5+fn5+fn4KLSAgIFRoZSBibG9jayBzaXplIGRlZmF1bHRzIHRvIDEwayB3aGljaCBpcyB0aGUgZGVmYXVsdCBibG9jayBzaXplIG9mCi0gICBHTlUgdGFyLgotCi0gICBUaGUgYmxvY2sgc2l6ZSBjYW4gYmUgdHVuZWQgZWl0aGVyIGR1cmluZyBrZXJuZWwgY29uZmlndXJhdGlvbiBvcgotICAgYXQgcnVudGltZSB3aXRoIHRoZSBNVElPQ1RPUCBpb2N0bCB1c2luZyB0aGUgTVRTRVRCTEsgb3BlcmF0aW9uCi0gICAoaS5lLiBkbyAibXQgLWYgL2Rldi9xZnQwIiBzZXRibGsgI0JMS1NaKS4gQSBibG9jayBzaXplIG9mIDAKLSAgIHN3aXRjaGVzIHRvIHZhcmlhYmxlIGJsb2NrIHNpemUgbW9kZSBpLmUuICJtdCBzZXRibGsgMCIgc3dpdGNoZXMKLSAgIG9mZiB0aGUgYmxvY2sgc2l6ZSByZXN0cmljdGlvbi4gSG93ZXZlciwgdGhpcyBkaXNhYmxlcyB6ZnRhcGUncwotICAgYnVpbHQgaW4gb24tdGhlLWZseSBjb21wcmVzc2lvbiB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aCB2YXJpYWJsZQotICAgYmxvY2sgc2l6ZSBtb2RlLgotCi0gICBUaGUgQkxLU1ogcGFyYW1ldGVyIG11c3QgYmUgZ2l2ZW4gYXMgYSBieXRlIGNvdW50IGFuZCBtdXN0IGJlIGEKLSAgIG11bHRpcGxlIG9mIDMyayBvciAwLCBpLmUuIHVzZSAibXQgc2V0YmxrIDMyNzY4IiB0byBzd2l0Y2ggdG8gYQotICAgYmxvY2sgc2l6ZSBvZiAzMmsuCi0KLSAgIFRoZSB0eXBpY2FsIHN5bXB0b20gb2YgYSBibG9jayBzaXplIG1pc21hdGNoIGlzIGFuICJpbnZhbGlkCi0gICBhcmd1bWVudCIgZXJyb3IgbWVzc2FnZS4KLQotMy4gV3JpdGUgQWNjZXNzIHdoZW4gbm90IGF0IEVPRCAoRW5kIE9mIERhdGEpIG9yIEJPVCAoQmVnaW4gT2YgVGFwZSkKLSAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gICB6ZnRhcGUgKHRoZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2Ugb2YgZnRhcGUtMy54KSBkZW5pZXMgd3JpdGUgYWNjZXNzCi0gICB0byB0aGUgdGFwZSBjYXJ0cmlkZ2Ugd2hlbiBpdCBpc24ndCBwb3NpdGlvbmVkIGVpdGhlciBhdCBCT1Qgb3IKLSAgIEVPRC4KLQotNC4gRm9ybWF0dGluZwotICAgfn5+fn5+fn5+fgotICAgZnRhcGUgRE9FUyBzdXBwb3J0IGZvcm1hdHRpbmcgb2YgZmxvcHB5IHRhcGUgY2FydHJpZGdlcy4gWW91IG5lZWQgdGhlCi0gICBgZnRmb3JtYXQnIHByb2dyYW0gdGhhdCBpcyBzaGlwcGVkIHdpdGggdGhlIG1vZHVsZXMgdmVyc2lvbiBvZiBmdGFwZS4KLSAgIFBsZWFzZSBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGZ0YXBlIGZyb20KLQotICAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9rZXJuZWwvdGFwZXMKLQotICAgb3IgZnJvbSB0aGUgZnRhcGUgaG9tZSBwYWdlIGF0Ci0KLSAgIGh0dHA6Ly9mdGFwZS5kb3QtaGVpbmUuZGUvCi0KLSAgIGBmdGZvcm1hdCcgaXMgY29udGFpbmVkIGluIHRoZSBgLi9jb250cmliLycgc3ViZGlyZWN0b3J5IG9mIHRoYXQKLSAgIHNlcGFyYXRlIGZ0YXBlIHBhY2thZ2UuCi0KLTUuIEludGVyY2hhbmdpbmcgY2FydHJpZGdlcyB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zCi0gICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi0gICBUaGUgaW50ZXJuYWwgZW11bGF0aW9uIG9mIFVuaXggdGFwZSBkZXZpY2UgZmlsZSBtYXJrcyBoYXMgY2hhbmdlZAotICAgY29tcGxldGVseS4gZnRhcGUgbm93IHVzZXMgdGhlIHZvbHVtZSB0YWJsZSBzZWdtZW50IGFzIHNwZWNpZmllZAotICAgYnkgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAvMTEzIHN0YW5kYXJkcyB0byBlbXVsYXRlIGZpbGUgbWFya3MuIEFzCi0gICBhIGNvbnNlcXVlbmNlIHRoZXJlIGlzIGxpbWl0ZWQgc3VwcG9ydCB0byBpbnRlcmNoYW5nZSBjYXJ0cmlkZ2VzCi0gICB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgotCi0gICBUbyBiZSBtb3JlIHByZWNpc2U6IGZ0YXBlIHdpbGwgZGV0ZWN0IHZvbHVtZXMgd3JpdHRlbiBieSBvdGhlciBPUydzCi0gICBwcm9ncmFtcyBhbmQgb3RoZXIgT1MncyBwcm9ncmFtcyB3aWxsIGRldGVjdCB2b2x1bWVzIHdyaXR0ZW4gYnkKLSAgIGZ0YXBlLgotCi0gICBIb3dldmVyLCBpdCBpc24ndCBwb3NzaWJsZSB0byBleHRyYWN0IHRoZSBkYXRhIGR1bXBlZCB0byB0aGUgdGFwZQotICAgYnkgc29tZSBNU0RPUyBwcm9ncmFtIHdpdGggZnRhcGUuIFRoaXMgZXhjZWVkcyB0aGUgc2NvcGUgb2YgYQotICAga2VybmVsIGRldmljZSBkcml2ZXIuIElmIHlvdSBuZWVkIHN1Y2ggZnVuY3Rpb25hbGl0eSwgdGhlbiBnbyBhaGVhZAotICAgYW5kIHdyaXRlIGEgdXNlciBzcGFjZSB1dGlsaXR5IHRoYXQgaXMgYWJsZSB0byBkbyB0aGF0LiBmdGFwZSBhbHJlYWR5Ci0gICBwcm92aWRlcyBhbGwga2VybmVsIGxldmVsIHN1cHBvcnQgbmVjZXNzYXJ5IHRvIGRvIHRoYXQuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQi4gRGVidWdnaW5nIE91dHB1dAotICAgPT09PT09PT09PT09PT09PQotCi0xLiBJbnRyb2R1Y3Rpb24KLSAgIH5+fn5+fn5+fn5+fgotICAgVGhlIGZ0YXBlIGRyaXZlciBjYW4gYmUgdmVyeSBub2lzeSBpbiB0aGF0IGlzIGNhbiBwcmludCBsb3RzIG9mCi0gICBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8gdGhlIGtlcm5lbCBsb2cgZmlsZXMgYW5kIHRoZSBzeXN0ZW0gY29uc29sZS4KLSAgIFdoaWxlIHRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgaXQgbWlnaHQgYmUgYW5ub3lpbmcgZHVyaW5nCi0gICBub3JtYWwgdXNlIGFuZCBlbmxhcmdlcyB0aGUgc2l6ZSBvZiB0aGUgZHJpdmVyIGJ5IHNldmVyYWwga2lsb2J5dGVzLgotCi0gICBUbyByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGRyaXZlciB5b3UgY2FuIHRyaW0gdGhlIG1heGltYWwgYW1vdW50IG9mCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGR1cmluZyBrZXJuZWwgY29uZmlndXJhdGlvbi4gUGxlYXNlCi0gICByZWZlciB0byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGFuZCBpdHMgb24tbGluZSBoZWxwCi0gICBmdW5jdGlvbmFsaXR5LgotCi0gICBUaGUgYW1vdW50IG9mIGRlYnVnZ2luZyBvdXRwdXQgbWFwcyB0byB0aGUgInRyYWNpbmciIGJvb3QgdGltZQotICAgb3B0aW9uIGFuZCB0aGUgImZ0X3RyYWNpbmciIG1vZHVsZXMgb3B0aW9uIGFzIGZvbGxvd3M6Ci0KLSAgIDAgICAgICAgICAgICAgIGJ1Z3MKLSAgIDEgICAgICAgICAgICAgICsgZXJyb3JzICh3aXRoIGNhbGwtc3RhY2sgZHVtcCkKLSAgIDIgICAgICAgICAgICAgICsgd2FybmluZ3MKLSAgIDMgICAgICAgICAgICAgICsgaW5mb3JtYXRpb24KLSAgIDQgICAgICAgICAgICAgICsgbW9yZSBpbmZvcm1hdGlvbgotICAgNSAgICAgICAgICAgICAgKyBwcm9ncmFtIGZsb3cKLSAgIDYgICAgICAgICAgICAgICsgZmRjL2RtYSBpbmZvCi0gICA3ICAgICAgICAgICAgICArIGRhdGEgZmxvdwotICAgOCAgICAgICAgICAgICAgKyBldmVyeXRoaW5nIGVsc2UKLQotMi4gVHVuaW5nIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0Ci0gICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAgIFRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGRlYnVnZ2luZyBvdXRwdXQgcHJpbnRlZCB0byB0aGUgc3lzdGVtCi0gICBjb25zb2xlIHlvdSBjYW4KLQotICAgaSkgIHRyaW0gdGhlIGRlYnVnZ2luZyBvdXRwdXQgYXQgcnVuLXRpbWUgd2l0aAotCi0gICAgICAgbXQgLWYgL2Rldi9ucWZ0MCBzZXRkZW5zaXR5ICNEQkdMVkwKLQotICAgICAgIHdoZXJlICIjREJHTFZMIiBpcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDkKLQotICAgaWkpIHRyaW0gdGhlIGRlYnVnZ2luZyBvdXRwdXQgYXQgbW9kdWxlIGxvYWQgdGltZSB3aXRoCi0KLSAgICAgICBtb2Rwcm9iZSBmdGFwZSBmdF90cmFjaW5nPSNEQkdMVkwKLQotICAgICAgIE9mIGNvdXJzZSwgdGhpcyBhcHBsaWVzIG9ubHkgaWYgeW91IGhhdmUgY29uZmlndXJlZCBmdGFwZSB0byBiZQotICAgICAgIGNvbXBpbGVkIGFzIGEgbW9kdWxlLgotCi0gICBpaWkpIHRyaW0gdGhlIGRlYnVnZ2luZyBvdXRwdXQgZHVyaW5nIHN5c3RlbSBib290IHRpbWUuIEFkZCB0aGUKLSAgICAgICBmb2xsb3dpbmcgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmU6Ci0KLSAgICAgICBmdGFwZT0jREJHTFZMLHRyYWNpbmcKLQotICAgICAgIFBsZWFzZSByZWZlciBhbHNvIHRvIHRoZSBuZXh0IHNlY3Rpb24gaWYgeW91IGRvbid0IGtub3cgaG93IHRvCi0gICAgICAgc2V0IGJvb3QgdGltZSBwYXJhbWV0ZXJzLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUMuIEJvb3QgYW5kIGxvYWQgdGltZSBjb25maWd1cmF0aW9uCi0gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0xLiBTZXR0aW5nIGJvb3QgdGltZSBwYXJhbWV0ZXJzCi0gICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IAotICAgQXNzdW1pbmcgdGhhdCB5b3UgdXNlIGxpbG8sIHRoZSBMSSludXggTE8pYWRlciwgYm9vdCB0aW1lIGtlcm5lbAotICAgcGFyYW1ldGVycyBjYW4gYmUgc2V0IGJ5IGFkZGluZyBhIGxpbmUKLQotICAgYXBwZW5kIHNvbWVfa2VybmVsX2Jvb3RfdGltZV9wYXJhbWV0ZXIKLQotICAgdG8gYC9ldGMvbGlsby5jb25mJyBvciBhdCByZWFsIGJvb3QgdGltZSBieSB0eXBpbmcgaW4gdGhlIG9wdGlvbnMKLSAgIGF0IHRoZSBwcm9tcHQgcHJvdmlkZWQgYnkgTElMTy4gSSBjYW4ndCBnaXZlIHlvdSBhZHZpY2Ugb24gaG93IHRvCi0gICBzcGVjaWZ5IHRob3NlIHBhcmFtZXRlcnMgd2l0aCBvdGhlciBsb2FkZXJzIGFzIEkgZG9uJ3QgdXNlIHRoZW0uCi0KLSAgIEZvciBmdGFwZSwgZWFjaCAic29tZV9rZXJuZWxfYm9vdF90aW1lX3BhcmFtZXRlciIgbG9va3MgbGlrZQotICAgImZ0YXBlPXZhbHVlLG9wdGlvbiIuIEFzIGFuIGV4YW1wbGUsIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0IGNhbiBiZQotICAgaW5jcmVhc2VkIHdpdGgKLQotICAgZnRhcGU9NCx0cmFjaW5nCi0KLSAgIE5PVEU6IHRoZSB2YWx1ZSBwcmVjZWRlcyB0aGUgb3B0aW9uIG5hbWUuCi0KLTIuIE1vZHVsZSBsb2FkIHRpbWUgcGFyYW1ldGVycwotICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gICBNb2R1bGUgcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBkaXJlY3RseSB3aGVuIGludm9raW5nCi0gICB0aGUgcHJvZ3JhbSAnbW9kcHJvYmUnIGF0IHRoZSBzaGVsbCBwcm9tcHQ6Ci0KLSAgIG1vZHByb2JlIGZ0YXBlIGZ0X3RyYWNpbmc9NAotCi0gICBvciBieSBlZGl0aW5nIHRoZSBmaWxlIGAvZXRjL21vZHByb2JlLmNvbmYnIGluIHdoaWNoIGNhc2UgdGhleSB0YWtlCi0gICBlZmZlY3QgZWFjaCB0aW1lIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgd2l0aCBgbW9kcHJvYmUnIChwbGVhc2UKLSAgIHJlZmVyIHRvIHRoZSByZXNwZWN0aXZlIG1hbnVhbCBwYWdlcykuIFRodXMsIHlvdSBzaG91bGQgYWRkIGEgbGluZQotCi0gICBvcHRpb25zIGZ0YXBlIGZ0X3RyYWNpbmc9NAotCi0gICB0byBgL2V0Yy9tb2Rwcm9iZS5jb25mYCBpZiB5b3UgaW50ZW5kIHRvIGluY3JlYXNlIHRoZSBkZWJ1Z2dpbmcKLSAgIG91dHB1dCBvZiB0aGUgZHJpdmVyLgotCi0KLTMuIEZ0YXBlIGJvb3QtIGFuZCBsb2FkIHRpbWUgb3B0aW9ucwotICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLSAgIGkuICAgQ29udHJvbGxpbmcgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0Ci0gICAgICAgIERCR0xWTCBoYXMgdG8gYmUgcmVwbGFjZWQgYnkgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA4LgotCi0gICAgICAgIG1vZHVsZSAgICAgICAgICAgICAgICAgfCAga2VybmVsIGNvbW1hbmQgbGluZQotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGZ0X3RyYWNpbmc9REJHTFZMICAgICAgfCAgZnRhcGU9REJHTFZMLHRyYWNpbmcKLQotICAgaWkuICBIYXJkd2FyZSBzZXR1cAotCUJBU0UgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB5b3VyIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIsCi0gICAgICAgIElSUSBhbmQgRE1BIGdpdmUgaXRzIGludGVycnVwdCBhbmQgRE1BIGNoYW5uZWwsIHJlc3BlY3RpdmVseS4KLSAgICAgICAgQk9PTCBpcyBhbiBpbnRlZ2VyLCAiMCIgbWVhbnMgIm5vIjsgYW55IG90aGVyIHZhbHVlIG1lYW5zCi0JInllcyIuIFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYW55dGhpbmcgaWYgY29ubmVjdGluZyB5b3VyIHRhcGUKLSAgICAgICAgZHJpdmUgdG8gdGhlIHN0YW5kYXJkIGZsb3BweSBkaXNrIGNvbnRyb2xsZXIuIEFsbCBvZiB0aGVzZQotCXZhbHVlcyBoYXZlIHJlYXNvbmFibGUgZGVmYXVsdHMuIFRoZSBkZWZhdWx0cyBjYW4gYmUgbW9kaWZpZWQKLQlkdXJpbmcga2VybmVsIGNvbmZpZ3VyYXRpb24sIGkuZS4gd2hpbGUgcnVubmluZyAibWFrZSBjb25maWciLAotCSJtYWtlIG1lbnVjb25maWciIG9yICJtYWtlIHhjb25maWciIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5Ci0Jb2YgdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UgdHJlZS4gUGxlYXNlIHJlZmVyIGFsc28gdG8gdGhlIG9uCi0JbGluZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGR1cmluZyB0aGF0IGtlcm5lbCBjb25maWd1cmF0aW9uCi0JcHJvY2Vzcy4KLQotCWZ0X3Byb2JlX2ZjMTAgaXMgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUgaWYgeW91IHdpc2ggZm9yIGZ0YXBlIHRvCi0JcHJvYmUgZm9yIGEgQ29sb3JhZG8gRkMtMTAgb3IgRkMtMjAgY29udHJvbGxlci4KLQotCWZ0X21hY2gyIGlzIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlIGlmIHlvdSB3aXNoIGZvciBmdGFwZSB0byBwcm9iZQotCWZvciBhIE1vdW50YWluIE1BQ0gtMiBjb250cm9sbGVyLgotCi0gICAgICAgIG1vZHVsZSAgICAgICAgICAgICAgICAgfCAga2VybmVsIGNvbW1hbmQgbGluZQotICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGZ0X2ZkY19iYXNlPUJBU0UgICAgICAgfCAgZnRhcGU9QkFTRSxpb3BvcnQKLSAgICAgICAgZnRfZmRjX2lycT1JUlEgICAgICAgICB8ICBmdGFwZT1JUlEsaXJxCi0gICAgICAgIGZ0X2ZkY19kbWE9RE1BICAgICAgICAgfCAgZnRhcGU9RE1BLGRtYQotICAgICAgICBmdF9wcm9iZV9mYzEwPUJPT0wgICAgIHwgIGZ0YXBlPUJPT0wsZmMxMAotICAgICAgICBmdF9tYWNoMj1CT09MICAgICAgICAgIHwgIGZ0YXBlPUJPT0wsbWFjaDIKLSAgICAgICAgZnRfZmRjX3RocmVzaG9sZD1USFIgICB8ICBmdGFwZT1USFIsdGhyZXNob2xkCi0gICAgICAgIGZ0X2ZkY19yYXRlX2xpbWl0PVJBVEUgfCAgZnRhcGU9UkFURSxkYXRhcmF0ZQotCi00LiBFeGFtcGxlIGtlcm5lbCBwYXJhbWV0ZXIgc2V0dGluZwotICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gCi0gICBUbyBjb25maWd1cmUgZnRhcGUgdG8gcHJvYmUgZm9yIGEgQ29sb3JhZG8gRkMtMTAvRkMtMjAgY29udHJvbGxlcgotICAgYW5kIHRvIGluY3JlYXNlIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dCBhIGxpdHRsZSBiaXQsIGFkZAotICAgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGAvZXRjL2xpbG8uY29uZic6Ci0KLSAgIGFwcGVuZCBmdGFwZT0xLGZjMTAgZnRhcGU9NCx0cmFjaW5nCi0KLTUuIEV4YW1wbGUgbW9kdWxlIHBhcmFtZXRlciBzZXR0aW5nCi0gICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgVG8gZG8gdGhlIHNhbWUsIGJ1dCB3aXRoIGZ0YXBlIGNvbXBpbGVkIGFzIGEgbG9hZGFibGUga2VybmVsCi0gICBtb2R1bGUsIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gYC9ldGMvbW9kcHJvYmUuY29uZic6Ci0KLSAgIG9wdGlvbnMgZnRhcGUgZnRfcHJvYmVfZmMxMD0xIGZ0X3RyYWNpbmc9NAotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUQuIFN1cHBvcnQgYW5kIGNvbnRhY3RzCi0gICA9PT09PT09PT09PT09PT09PT09PQotCi0gICBGdGFwZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFRoZXJlIGlzCi0gICBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGZvciB0aGlzIHNvZnR3YXJlLiBIb3dldmVyLCB5b3UgY2FuIHJlYWNoCi0gICB0aGUgY3VycmVudCBtYWludGFpbmVyIG9mIHRoZSBmdGFwZSBwYWNrYWdlIHVuZGVyIHRoZSBlbWFpbCBhZGRyZXNzCi0gICBnaXZlbiBpbiB0aGUgTUFJTlRBSU5FUlMgZmlsZSB3aGljaCBpcyBsb2NhdGVkIGluIHRoZSB0b3AgbGV2ZWwKLSAgIGRpcmVjdG9yeSBvZiB0aGUgTGludXgga2VybmVsIHNvdXJjZSB0cmVlLiBUaGVyZSB5b3UnbGwgZmluZCBhbHNvCi0gICB0aGUgcmVsZXZhbnQgbWFpbGluZyBsaXN0IHRvIHVzZSBhcyBhIGRpc2N1c3Npb24gZm9ydW0gYW5kIHRoZSB3ZWIKLSAgIHBhZ2UgdG8gcXVlcnkgZm9yIHRoZSBtb3N0IHJlY2VudCBkb2N1bWVudGF0aW9uLCByZWxhdGVkIHdvcmsgYW5kCi0gICBkZXZlbG9wbWVudCB2ZXJzaW9ucyBvZiBmdGFwZS4KLQotICAgQ2hhbmdlbG9nOgotICAgPT09PT09PT09PQotCi1+MTk5NjoJCU9yaWdpbmFsIERvY3VtZW50Ci0KLTEwLTI0LTIwMDQ6CUdlbmVyYWwgY2xlYW51cCBhbmQgdXBkYXRpbmcsIG5vdGluZyBhZGRpdGlvbmFsIG1vZHVsZSBvcHRpb25zLgotCQlKYW1lcyBOZWxzb24gPGphbWVzNDc2NUBnbWFpbC5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Z1aml0c3UvZnJ2L2dkYnN0dWIudHh0IGIvRG9jdW1lbnRhdGlvbi9mdWppdHN1L2Zydi9nZGJzdHViLnR4dAppbmRleCA2Y2U1YWE5Li45MzA0ZmIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Z1aml0c3UvZnJ2L2dkYnN0dWIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZnVqaXRzdS9mcnYvZ2Ric3R1Yi50eHQKQEAgLTU5LDcgKzU5LDcgQEAKIFRoZW4gYnVpbGQgYXMgdXN1YWwsIGRvd25sb2FkIHRvIHRoZSBib2FyZCBhbmQgZXhlY3V0ZS4gTm90ZSB0aGF0IGlmCiAiSW1tZWRpYXRlIGFjdGl2YXRpb24iIHdhcyBzZWxlY3RlZCwgdGhlbiB0aGUga2VybmVsIHdpbGwgd2FpdCBmb3IgR0RCIHRvCiBhdHRhY2guIElmIG5vdCwgdGhlbiB0aGUga2VybmVsIHdpbGwgYm9vdCBpbW1lZGlhdGVseSBhbmQgR0RCIHdpbGwgaGF2ZSB0bwotaW50ZXJ1cHQgaXQgb3Igd2FpdCBmb3IgYW4gZXhjZXB0aW9uIHRvIG9jY3VyIGlmIGJlZm9yZSBkb2luZyBhbnl0aGluZyB3aXRoCitpbnRlcnJ1cHQgaXQgb3Igd2FpdCBmb3IgYW4gZXhjZXB0aW9uIHRvIG9jY3VyIGJlZm9yZSBkb2luZyBhbnl0aGluZyB3aXRoCiB0aGUga2VybmVsLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZnVqaXRzdS9mcnYva2VybmVsLUFCSS50eHQgYi9Eb2N1bWVudGF0aW9uL2Z1aml0c3UvZnJ2L2tlcm5lbC1BQkkudHh0CmluZGV4IDhiMGE1ZmMuLmFhYTFjZWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZnVqaXRzdS9mcnYva2VybmVsLUFCSS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mdWppdHN1L2Zydi9rZXJuZWwtQUJJLnR4dApAQCAtMTU2LDcgKzE1Niw3IEBACiBhbG1vc3QgY29tcGxldGVseSBzZWxmLWNvbnRhaW5lZC4gVGhlIG9ubHkgZXh0ZXJuYWwgY29kZSB1c2VkIGlzIHRoZQogc3ByaW50ZiBmYW1pbHkgb2YgZnVuY3Rpb25zLgogCi1GdXRoZXJtb3JlLCBicmVhay5TIGlzIHNvIGNvbXBsaWNhdGVkIGJlY2F1c2Ugc2luZ2xlLXN0ZXAgbW9kZSBkb2VzIG5vdAorRnVydGhlcm1vcmUsIGJyZWFrLlMgaXMgc28gY29tcGxpY2F0ZWQgYmVjYXVzZSBzaW5nbGUtc3RlcCBtb2RlIGRvZXMgbm90CiBzd2l0Y2ggb2ZmIG9uIGVudHJ5IHRvIGFuIGV4Y2VwdGlvbi4gVGhhdCBtZWFucyB1bmxlc3MgbWFudWFsbHkgZGlzYWJsZWQsCiBzaW5nbGUtc3RlcHBpbmcgd2lsbCBibGl0aGVseSBnbyBvbiBzdGVwcGluZyBpbnRvIHRoaW5ncyBsaWtlIGludGVycnVwdHMuCiBTZWUgZ2Ric3R1Yi50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAKaW5kZXggMzVmNjE4Zi4uMmM2ZjFmZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZG05MjQwCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtOTI0MApAQCAtMjQsNyArMjQsNyBAQAogICAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCiAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwKICAgICBNaWNoaWVsIFJvb2sgPG1pY2hpZWxAZ3JlbmRlbHByb2plY3Qubmw+LAotICAgIEdyYW50IENvYWR5IDxnY29hZHlAZ21haWwuY29tPiB3aXRoIGd1aWRhbmNlCisgICAgR3JhbnQgQ29hZHkgPGdjb2FkeS5sa0BnbWFpbC5jb20+IHdpdGggZ3VpZGFuY2UKICAgICAgICAgZnJvbSBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KIAogSW50ZXJmYWNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTgwNWYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Y3MTgwNWYKaW5kZXggMjhjNWI3ZC4uYmZkMGYxNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4MDVmCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODA1ZgpAQCAtNiw2ICs2LDEwIEBACiAgICAgUHJlZml4OiAnZjcxODA1ZicKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZSwgYWRkcmVzcyByZWFkIGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZQogICAgIERhdGFzaGVldDogUHJvdmlkZWQgYnkgRmludGVrIG9uIHJlcXVlc3QKKyAgKiBGaW50ZWsgRjcxODcyRi9GRworICAgIFByZWZpeDogJ2Y3MTg3MmYnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKKyAgICBEYXRhc2hlZXQ6IFByb3ZpZGVkIGJ5IEZpbnRlayBvbiByZXF1ZXN0CiAKIEF1dGhvcjogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiAKQEAgLTEzLDExICsxNywxMSBAQAogdGVzdCBzeXN0ZW0gKGN1c3RvbSBKZXR3YXkgSzhNOE1TIG1vdGhlcmJvYXJkLCB3aXRoIENQVSBhbmQgUkFNKSBhbmQKIGZvciBwcm92aWRpbmcgaW5pdGlhbCBkb2N1bWVudGF0aW9uLgogCi1UaGFua3MgdG8gS3JpcyBDaGVuIGZyb20gRmludGVrIGZvciBhbnN3ZXJpbmcgdGVjaG5pY2FsIHF1ZXN0aW9ucyBhbmQKLXByb3ZpZGluZyBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24uCitUaGFua3MgdG8gS3JpcyBDaGVuIGFuZCBBYXJvbiBIdWFuZyBmcm9tIEZpbnRlayBmb3IgYW5zd2VyaW5nIHRlY2huaWNhbAorcXVlc3Rpb25zIGFuZCBwcm92aWRpbmcgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uLgogCiBUaGFua3MgdG8gQ2hyaXMgTGluIGZyb20gSmV0d2F5IGZvciBwcm92aWRpbmcgd2lyaW5nIHNjaGVtYXRpY3MgYW5kCi1hbndzZXJpbmcgdGVjaG5pY2FsIHF1ZXN0aW9ucy4KK2Fuc3dlcmluZyB0ZWNobmljYWwgcXVlc3Rpb25zLgogCiAKIERlc2NyaXB0aW9uCkBAIC0yOCw4ICszMiwxMSBAQAogc291cmNlKSwgMyBmYW5zIGFuZCAzIHRlbXBlcmF0dXJlIHNlbnNvcnMuCiAKIFRoaXMgY2hpcCBhbHNvIGhhcyBmYW4gY29udHJvbGxpbmcgZmVhdHVyZXMsIHVzaW5nIGVpdGhlciBEQyBvciBQV00sIGluCi10aHJlZSBkaWZmZXJlbnQgbW9kZXMgKG9uZSBtYW51YWwsIHR3byBhdXRvbWF0aWMpLiBUaGUgZHJpdmVyIGRvZXNuJ3QKLXN1cHBvcnQgdGhlc2UgZmVhdHVyZXMgeWV0LgordGhyZWUgZGlmZmVyZW50IG1vZGVzIChvbmUgbWFudWFsLCB0d28gYXV0b21hdGljKS4KKworVGhlIEZpbnRlayBGNzE4NzJGL0ZHIFN1cGVyIEkvTyBjaGlwIGlzIGFsbW9zdCB0aGUgc2FtZSwgd2l0aCB0d28KK2FkZGl0aW9uYWwgaW50ZXJuYWwgdm9sdGFnZXMgbW9uaXRvcmVkIChWU0IgYW5kIGJhdHRlcnkpLiBJdCBhbHNvIGZlYXR1cmVzCis2IFZJRCBpbnB1dHMuIFRoZSBWSUQgaW5wdXRzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KIAogVGhlIGRyaXZlciBhc3N1bWVzIHRoYXQgbm8gbW9yZSB0aGFuIG9uZSBjaGlwIGlzIHByZXNlbnQsIHdoaWNoIHNlZW1zCiByZWFzb25hYmxlLgpAQCAtNDIsNyArNDksOCBAQAogcmFuZ2UgaXMgdGh1cyBmcm9tIDAgdG8gMi4wNDAgVi4gVm9sdGFnZSB2YWx1ZXMgb3V0c2lkZSBvZiB0aGlzIHJhbmdlCiBuZWVkIGV4dGVybmFsIHJlc2lzdG9ycy4gQW4gZXhjZXB0aW9uIGlzIGluMCwgd2hpY2ggaXMgdXNlZCB0byBtb25pdG9yCiB0aGUgY2hpcCdzIG93biBwb3dlciBzb3VyY2UgKCszLjNWKSwgYW5kIGlzIGRpdmlkZWQgaW50ZXJuYWxseSBieSBhCi1mYWN0b3IgMi4KK2ZhY3RvciAyLiBGb3IgdGhlIEY3MTg3MkYvRkcsIGluOSAoVlNCKSBhbmQgaW4xMCAoYmF0dGVyeSkgYXJlIGFsc28KK2RpdmlkZWQgaW50ZXJuYWxseSBieSBhIGZhY3RvciAyLgogCiBUaGUgdHdvIExTQiBvZiB0aGUgdm9sdGFnZSBsaW1pdCByZWdpc3RlcnMgYXJlIG5vdCB1c2VkIChhbHdheXMgMCksIHNvCiB5b3UgY2FuIG9ubHkgc2V0IHRoZSBsaW1pdHMgaW4gc3RlcHMgb2YgMzIgbVYgKGJlZm9yZSBzY2FsaW5nKS4KQEAgLTYxLDkgKzY5LDEyIEBACiBpbjYgICAgIFZJTjYgICAgVkNDMS41ViAgICAgIDEwSyAgICAgICAtICAgICAgICAxLjAwICAgIDEuNTAgVgogaW43ICAgICBWSU43ICAgIFZDT1JFICAgICAgICAxMEsgICAgICAgLSAgICAgICAgMS4wMCAgIH4xLjQwIFYgKDEpCiBpbjggICAgIFZJTjggICAgVlNCNVYgICAgICAgMjAwSyAgICAgNDdLICAgICAgICAxLjAwICAgIDAuOTUgVgoraW4xMCAgICBWU0IgICAgIFZTQjMuM1YgICAgIGludC4gICAgaW50LiAgICAgICAgMi4wMCAgICAxLjY1IFYgKDMpCitpbjkgICAgIFZCQVQgICAgVkJBVFRFUlkgICAgaW50LiAgICBpbnQuICAgICAgICAyLjAwICAgIDEuNTAgViAoMykKIAogKDEpIERlcGVuZHMgb24geW91ciBoYXJkd2FyZSBzZXR1cC4KICgyKSBPYnZpb3VzbHkgbm90IGNvcnJlY3QsIHN3YXBwaW5nIFIxIGFuZCBSMiB3b3VsZCBtYWtlIG1vcmUgc2Vuc2UuCisoMykgRjcxODcyRi9GRyBvbmx5LgogCiBUaGVzZSB2YWx1ZXMgY2FuIGJlIHVzZWQgYXMgaGludHMgYXQgYmVzdCwgYXMgbW90aGVyYm9hcmQgbWFudWZhY3R1cmVycwogYXJlIGZyZWUgdG8gdXNlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2V0dXAuIEFzIGEgbWF0dGVyIG9mIGZhY3QsIHRoZQpAQCAtMTAzLDMgKzExNCwzOCBAQAogb3IgYSB0aGVybWlzdG9yLiBUaGUgZHJpdmVyIHJlcG9ydHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtb2RlLCBidXQKIGRvZXNuJ3QgYWxsb3cgY2hhbmdpbmcgaXQuIEluIHRoZW9yeSwgdGhlIEJJT1Mgc2hvdWxkIGhhdmUgY29uZmlndXJlZAogZXZlcnl0aGluZyBwcm9wZXJseS4KKworCitGYW4gQ29udHJvbAorLS0tLS0tLS0tLS0KKworQm90aCBQV00gKHB1bHNlLXdpZHRoIG1vZHVsYXRpb24pIGFuZCBEQyBmYW4gc3BlZWQgY29udHJvbCBtZXRob2RzIGFyZQorc3VwcG9ydGVkLiBUaGUgcmlnaHQgb25lIHRvIHVzZSBkZXBlbmRzIG9uIGV4dGVybmFsIGNpcmN1aXRyeSBvbiB0aGUKK21vdGhlcmJvYXJkLCBzbyB0aGUgZHJpdmVyIGFzc3VtZXMgdGhhdCB0aGUgQklPUyBzZXQgdGhlIG1ldGhvZAorcHJvcGVybHkuIFRoZSBkcml2ZXIgd2lsbCByZXBvcnQgdGhlIG1ldGhvZCwgYnV0IHdvbid0IGxldCB5b3UgY2hhbmdlCitpdC4KKworV2hlbiB0aGUgUFdNIG1ldGhvZCBpcyB1c2VkLCB5b3UgY2FuIHNlbGVjdCB0aGUgb3BlcmF0aW5nIGZyZXF1ZW5jeSwKK2Zyb20gMTg3LjUga0h6IChkZWZhdWx0KSB0byAzMSBIei4gVGhlIGJlc3QgZnJlcXVlbmN5IGRlcGVuZHMgb24gdGhlCitmYW4gbW9kZWwuIEFzIGEgcnVsZSBvZiB0aHVtYiwgbG93ZXIgZnJlcXVlbmNpZXMgc2VlbSB0byBnaXZlIGJldHRlcgorY29udHJvbCwgYnV0IG1heSBnZW5lcmF0ZSBhbm5veWluZyBoaWdoLXBpdGNoIG5vaXNlLiBGaW50ZWsgcmVjb21tZW5kcworbm90IGdvaW5nIGJlbG93IDEga0h6LCBhcyB0aGUgZmFuIHRhY2hvbWV0ZXJzIGdldCBjb25mdXNlZCBieSBsb3dlcgorZnJlcXVlbmNpZXMgYXMgd2VsbC4KKworV2hlbiB0aGUgREMgbWV0aG9kIGlzIHVzZWQsIEZpbnRlayByZWNvbW1lbmRzIG5vdCBnb2luZyBiZWxvdyA1IFYsIHdoaWNoCitjb3JyZXNwb25kcyB0byBhIHB3bSB2YWx1ZSBvZiAxMDYgZm9yIHRoZSBkcml2ZXIuIFRoZSBkcml2ZXIgZG9lc24ndAorZW5mb3JjZSB0aGlzIGxpbWl0IHRob3VnaC4KKworVGhyZWUgZGlmZmVyZW50IGZhbiBjb250cm9sIG1vZGVzIGFyZSBzdXBwb3J0ZWQ6CisKKyogTWFudWFsIG1vZGUKKyAgWW91IGFzayBmb3IgYSBzcGVjaWZpYyBQV00gZHV0eSBjeWNsZSBvciBEQyB2b2x0YWdlLgorCisqIEZhbiBzcGVlZCBtb2RlCisgIFlvdSBhc2sgZm9yIGEgc3BlY2lmaWMgZmFuIHNwZWVkLiBUaGlzIG1vZGUgYXNzdW1lcyB0aGF0IHB3bTEKKyAgY29ycmVzcG9uZHMgdG8gZmFuMSwgcHdtMiB0byBmYW4yIGFuZCBwd20zIHRvIGZhbjMuCisKKyogVGVtcGVyYXR1cmUgbW9kZQorICBZb3UgZGVmaW5lIDMgdGVtcGVyYXR1cmUvZmFuIHNwZWVkIHRyaXAgcG9pbnRzLCBhbmQgdGhlIGZhbiBzcGVlZCBpcworICBhZGp1c3RlZCBkZXBlbmRpbmcgb24gdGhlIG1lYXN1cmVkIHRlbXBlcmF0dXJlLCB1c2luZyBpbnRlcnBvbGF0aW9uLgorICBUaGlzIG1vZGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NyBiL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NwppbmRleCBlNzgzZmQ2Li43NGE4MDk5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CkBAIC05LDggKzksNyBAQAogICAgICAgICAgICAgICAgaHR0cDovL3d3dy5pdGUuY29tLnR3LwogICAqIElUODcxMkYKICAgICBQcmVmaXg6ICdpdDg3MTInCi0gICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDJkCi0gICAgICAgICAgICAgICAgICAgICAgIGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZSAoOCBJL08gcG9ydHMpCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZSAoOCBJL08gcG9ydHMpCiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIElURSB3ZWJzaXRlCiAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lml0ZS5jb20udHcvCiAgICogSVQ4NzE2RgpAQCAtNTMsNiArNTIsMTggQEAKICAgbWlzY29uZmlndXJlZCBieSBCSU9TIC0gUFdNIHZhbHVlcyB3b3VsZCBiZSBpbnZlcnRlZC4gVGhpcyBvcHRpb24gdHJpZXMKICAgdG8gZml4IHRoaXMuIFBsZWFzZSBjb250YWN0IHlvdXIgQklPUyBtYW51ZmFjdHVyZXIgYW5kIGFzayBoaW0gZm9yIGZpeC4KIAorCitIYXJkd2FyZSBJbnRlcmZhY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsbCB0aGUgY2hpcHMgc3Vwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgYXJlIExQQyBTdXBlci1JL08gY2hpcHMsIGFjY2Vzc2VkCit0aHJvdWdoIHRoZSBMUEMgYnVzIChJU0EtbGlrZSBJL08gcG9ydHMpLiBUaGUgSVQ4NzEyRiBhZGRpdGlvbmFsbHkgaGFzIGFuCitTTUJ1cyBpbnRlcmZhY2UgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcgZnVuY3Rpb25zLiBUaGlzIGRyaXZlciBubworbG9uZ2VyIHN1cHBvcnRzIHRoaXMgaW50ZXJmYWNlIHRob3VnaCwgYXMgaXQgaXMgc2xvd2VyIGFuZCBsZXNzIHJlbGlhYmxlCit0aGFuIHRoZSBJU0EgYWNjZXNzLCBhbmQgd2FzIG9ubHkgYXZhaWxhYmxlIG9uIGEgc21hbGwgbnVtYmVyIG9mCittb3RoZXJib2FyZCBtb2RlbHMuCisKKwogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vazh0ZW1wIGIvRG9jdW1lbnRhdGlvbi9od21vbi9rOHRlbXAKaW5kZXggYmFiNDQ1YS4uMDAwNWM3MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9rOHRlbXAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9rOHRlbXAKQEAgLTIsMjEgKzIsMjQgQEAKID09PT09PT09PT09PT09PT09PT09CiAKIFN1cHBvcnRlZCBjaGlwczoKLSAgKiBBTUQgSzggQ1BVCisgICogQU1EIEF0aGxvbjY0L0ZYIG9yIE9wdGVyb24gQ1BVcwogICAgIFByZWZpeDogJ2s4dGVtcCcKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogUENJIHNwYWNlCiAgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LmFtZC5jb20vdXMtZW4vYXNzZXRzL2NvbnRlbnRfdHlwZS93aGl0ZV9wYXBlcnNfYW5kX3RlY2hfZG9jcy8zMjU1OS5wZGYKIAogQXV0aG9yOiBSdWRvbGYgTWFyZWsKLUNvbnRhY3Q6IFJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PgorQ29udGFjdDogUnVkb2xmIE1hcmVrIDxyLm1hcmVrQGFzc2VtYmxlci5jej4KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCiAKLVRoaXMgZHJpdmVyIHBlcm1pdHMgcmVhZGluZyB0ZW1wZXJhdHVyZSBzZW5zb3IocykgZW1iZWRkZWQgaW5zaWRlIEFNRCBLOCBDUFVzLgotT2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgaXQgd29ya3MgZnJvbSByZXZpc2lvbiBGIG9mIEs4IGNvcmUsIGJ1dAotaW4gZmFjdCBpdCBzZWVtcyB0byBiZSBpbXBsZW1lbnRlZCBmb3IgYWxsIHJldmlzaW9ucyBvZiBLOCBleGNlcHQgdGhlIGZpcnN0Ci10d28gcmV2aXNpb25zIChTSC1CMCBhbmQgU0gtQjMpLgorVGhpcyBkcml2ZXIgcGVybWl0cyByZWFkaW5nIHRlbXBlcmF0dXJlIHNlbnNvcihzKSBlbWJlZGRlZCBpbnNpZGUgQU1EIEs4CitmYW1pbHkgQ1BVcyAoQXRobG9uNjQvRlgsIE9wdGVyb24pLiBPZmZpY2lhbCBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBpdCB3b3JrcworZnJvbSByZXZpc2lvbiBGIG9mIEs4IGNvcmUsIGJ1dCBpbiBmYWN0IGl0IHNlZW1zIHRvIGJlIGltcGxlbWVudGVkIGZvciBhbGwKK3JldmlzaW9ucyBvZiBLOCBleGNlcHQgdGhlIGZpcnN0IHR3byByZXZpc2lvbnMgKFNILUIwIGFuZCBTSC1CMykuCisKK1BsZWFzZSBub3RlIHRoYXQgeW91IHdpbGwgbmVlZCBhdCBsZWFzdCBsbS1zZW5zb3JzIDIuMTAuMSBmb3IgcHJvcGVyIHVzZXJzcGFjZQorc3VwcG9ydC4KIAogVGhlcmUgY2FuIGJlIHVwIHRvIGZvdXIgdGVtcGVyYXR1cmUgc2Vuc29ycyBpbnNpZGUgc2luZ2xlIENQVS4gVGhlIGRyaXZlcgogd2lsbCBhdXRvLWRldGVjdCB0aGUgc2Vuc29ycyBhbmQgd2lsbCBkaXNwbGF5IG9ubHkgdGVtcGVyYXR1cmVzIGZyb20KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vcGM4NzQyNyBiL0RvY3VtZW50YXRpb24vaHdtb24vcGM4NzQyNwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTA3MDhmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9wYzg3NDI3CkBAIC0wLDAgKzEsMzggQEAKK0tlcm5lbCBkcml2ZXIgcGM4NzQyNworPT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODc0MjcKKyAgICBQcmVmaXg6ICdwYzg3NDI3JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LndpbmJvbmQuY29tLnR3L0UtV0lOQk9OREhUTS9wYXJ0bmVyL2FwY18wMDcuaHRtbAorCitBdXRob3I6IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorCitUaGFua3MgdG8gQW1pciBIYWJpYmkgYXQgQ2FuZGVsaXMgZm9yIHNldHRpbmcgdXAgYSB0ZXN0IHN5c3RlbSwgYW5kIHRvCitNaWNoYWVsIEtyZXNzIGZvciB0ZXN0aW5nIHNldmVyYWwgaXRlcmF0aW9ucyBvZiB0aGlzIGRyaXZlci4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgU3VwZXIgSS9PIGNoaXAgaW5jbHVkZXMgY29tcGxldGUgaGFyZHdhcmUKK21vbml0b3JpbmcgY2FwYWJpbGl0aWVzLiBJdCBjYW4gbW9uaXRvciB1cCB0byAxOCB2b2x0YWdlcywgOCBmYW5zIGFuZAorNiB0ZW1wZXJhdHVyZSBzZW5zb3JzLiBPbmx5IHRoZSBmYW5zIGFyZSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudC4KKworVGhpcyBjaGlwIGFsc28gaGFzIGZhbiBjb250cm9sbGluZyBmZWF0dXJlcywgd2hpY2ggYXJlIG5vdCB5ZXQgc3VwcG9ydGVkCitieSB0aGlzIGRyaXZlciBlaXRoZXIuCisKK1RoZSBkcml2ZXIgYXNzdW1lcyB0aGF0IG5vIG1vcmUgdGhhbiBvbmUgY2hpcCBpcyBwcmVzZW50LCB3aGljaCBzZWVtcworcmVhc29uYWJsZS4KKworCitGYW4gTW9uaXRvcmluZworLS0tLS0tLS0tLS0tLS0KKworRmFuIHJvdGF0aW9uIHNwZWVkcyBhcmUgcmVwb3J0ZWQgYXMgMTQtYml0IHZhbHVlcyBmcm9tIGEgZ2F0ZWQgY2xvY2sKK3NpZ25hbC4gU3BlZWRzIGRvd24gdG8gODMgUlBNIGNhbiBiZSBtZWFzdXJlZC4KKworQW4gYWxhcm0gaXMgdHJpZ2dlcmVkIGlmIHRoZSByb3RhdGlvbiBzcGVlZCBkcm9wcyBiZWxvdyBhIHByb2dyYW1tYWJsZQorbGltaXQuIEFub3RoZXIgYWxhcm0gaXMgdHJpZ2dlcmVkIGlmIHRoZSBzcGVlZCBpcyB0b28gbG93IHRvIHRvIGJlIG1lYXN1cmVkCisoaW5jbHVkaW5nIHN0YWxsZWQgb3IgbWlzc2luZyBmYW4pLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMSBiL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3bTEKaW5kZXggYzE1YmJlNi4uMDRhMTExMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N20xCkBAIC0yLDEyICsyLDE0IEBACiA9PT09PT09PT09PT09PT09PT09PT09CiAKIFN1cHBvcnRlZCBjaGlwczoKLSAgKiBTTVNDIExQQzQ3QjI3eCwgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4IGFuZCBMUEM0N00xOTIKKyAgKiBTTVNDIExQQzQ3QjI3eCwgTFBDNDdNMTEyLCBMUEM0N00xMHgsIExQQzQ3TTEzeCwgTFBDNDdNMTR4LAorICAgIExQQzQ3TTE1eCBhbmQgTFBDNDdNMTkyCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKICAgICBQcmVmaXg6ICdzbXNjNDdtMScKICAgICBEYXRhc2hlZXRzOgogICAgICAgICBodHRwOi8vd3d3LnNtc2MuY29tL21haW4vZGF0YXNoZWV0cy80N2IyN3gucGRmCiAgICAgICAgIGh0dHA6Ly93d3cuc21zYy5jb20vbWFpbi9kYXRhc2hlZXRzLzQ3bTEweC5wZGYKKyAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL2RhdGFzaGVldHMvNDdtMTEyLnBkZgogICAgICAgICBodHRwOi8vd3d3LnNtc2MuY29tL21haW4vdG9vbHMvZGlzY29udGludWVkLzQ3bTEzeC5wZGYKICAgICAgICAgaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL2RhdGFzaGVldHMvNDdtMTR4LnBkZgogICAgICAgICBodHRwOi8vd3d3LnNtc2MuY29tL21haW4vdG9vbHMvZGlzY29udGludWVkLzQ3bTE1eC5wZGYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKaW5kZXggZDFkMzkwYS4uZWZlZjNiOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKQEAgLTIwOCwxMiArMjA4LDE0IEBACiAqKioqKioqKioqKioqKioqCiAKIHRlbXBbMS0qXV90eXBlCVNlbnNvciB0eXBlIHNlbGVjdGlvbi4KLQkJSW50ZWdlcnMgMSB0byA0IG9yIHRoZXJtaXN0b3IgQmV0YSB2YWx1ZSAodHlwaWNhbGx5IDM0MzUpCisJCUludGVnZXJzIDEgdG8gNiBvciB0aGVybWlzdG9yIEJldGEgdmFsdWUgKHR5cGljYWxseSAzNDM1KQogCQlSVwogCQkxOiBQSUkvQ2VsZXJvbiBEaW9kZQogCQkyOiAzOTA0IHRyYW5zaXN0b3IKIAkJMzogdGhlcm1hbCBkaW9kZQogCQk0OiB0aGVybWlzdG9yIChkZWZhdWx0L3Vua25vd24gQmV0YSkKKwkJNTogQU1EIEFNRFNJCisJCTY6IEludGVsIFBFQ0kKIAkJTm90IGFsbCB0eXBlcyBhcmUgc3VwcG9ydGVkIGJ5IGFsbCBjaGlwcwogCiB0ZW1wWzEtKl1fbWF4CVRlbXBlcmF0dXJlIG1heCB2YWx1ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3ZWhmIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdlaGYKaW5kZXggZmFlM2I3OC4uOGExNWE3NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdlaGYKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdlaGYKQEAgLTEwLDcgKzEwLDcgQEAKIEF1dGhvcnM6CiAgICAgICAgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgogICAgICAgICBZdWFuIE11IChXaW5ib25kKQotICAgICAgICBSdWRvbGYgTWFyZWsgPHIubWFyZWtAc2guY3Z1dC5jej4KKyAgICAgICAgUnVkb2xmIE1hcmVrIDxyLm1hcmVrQGFzc2VtYmxlci5jej4KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCkBAIC0yNiw3ICsyNiw3IEBACiBUZW1wZXJhdHVyZXMgYXJlIG1lYXN1cmVkIGluIGRlZ3JlZXMgQ2Vsc2l1cyBhbmQgbWVhc3VyZW1lbnQgcmVzb2x1dGlvbiBpcyAxCiBkZWdDIGZvciB0ZW1wMSBhbmQgMC41IGRlZ0MgZm9yIHRlbXAyIGFuZCB0ZW1wMy4gQW4gYWxhcm0gaXMgdHJpZ2dlcmVkIHdoZW4KIHRoZSB0ZW1wZXJhdHVyZSBnZXRzIGhpZ2hlciB0aGFuIGhpZ2ggbGltaXQ7IGl0IHN0YXlzIG9uIHVudGlsIHRoZSB0ZW1wZXJhdHVyZQotZmFsbHMgYmVsb3cgdGhlIEh5c3RlcmVzaXMgdmFsdWUuCitmYWxscyBiZWxvdyB0aGUgaHlzdGVyZXNpcyB2YWx1ZS4KIAogRmFuIHJvdGF0aW9uIHNwZWVkcyBhcmUgcmVwb3J0ZWQgaW4gUlBNIChyb3RhdGlvbnMgcGVyIG1pbnV0ZSkuIEFuIGFsYXJtIGlzCiB0cmlnZ2VyZWQgaWYgdGhlIHJvdGF0aW9uIHNwZWVkIGhhcyBkcm9wcGVkIGJlbG93IGEgcHJvZ3JhbW1hYmxlIGxpbWl0LiBGYW4KQEAgLTY3LDkgKzY3LDkgQEAKIAogSWYgdGhlIHRlbXBlcmF0dXJlIGlzIGluIHRoZSByYW5nZSBkZWZpbmVkIGJ5OgogCi1wd21bMS00XV90YXJnZXQgICAgLSBzZXQgdGFyZ2V0IHRlbXBlcmF0dXJlLCB1bml0IG1pbGxpZGVncmVlIENlbGNpdXMKK3B3bVsxLTRdX3RhcmdldCAgICAtIHNldCB0YXJnZXQgdGVtcGVyYXR1cmUsIHVuaXQgbWlsbGlkZWdyZWUgQ2Vsc2l1cwogCQkgICAgIChyYW5nZSAwIC0gMTI3MDAwKQotcHdtWzEtNF1fdG9sZXJhbmNlIC0gdG9sZXJhbmNlLCB1bml0IG1pbGxpZGVncmVlIENlbGNpdXMgKHJhbmdlIDAgLSAxNTAwMCkKK3B3bVsxLTRdX3RvbGVyYW5jZSAtIHRvbGVyYW5jZSwgdW5pdCBtaWxsaWRlZ3JlZSBDZWxzaXVzIChyYW5nZSAwIC0gMTUwMDApCiAKIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRvIGZhbiBzcGVlZC4gT25jZSB0aGUgdGVtcGVyYXR1cmUgbGVhdmVzIHRoZSBpbnRlcnZhbCwKIGZhbiBzcGVlZCBpbmNyZWFzZXMgKHRlbXAgaXMgaGlnaGVyKSBvciBkZWNyZWFzZXMgaWYgbG93ZXIgdGhhbiBkZXNpcmVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM3OTFkIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM3OTFkCmluZGV4IDE5YjJlZDcuLmRiOTg4MWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzkxZAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MWQKQEAgLTE4LDcgKzE4LDcgQEAKICAgICBhbmQgTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPgogICB3ODM3OTJkLmM6CiAgICAgQ2h1bmhhbyBIdWFuZyA8RFpTaGVuQFdpbmJvbmQuY29tLnR3PiwKLSAgICBSdWRvbGYgTWFyZWsgPHIubWFyZWtAc2guY3Z1dC5jej4KKyAgICBSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PgogCiBBZGRpdGlvbmFsIGNvbnRyaWJ1dG9yczoKICAgICBTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MyBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzkzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTU0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MwpAQCAtMCwwICsxLDExMCBAQAorS2VybmVsIGRyaXZlciB3ODM3OTMKKz09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBXaW5ib25kIFc4Mzc5M0cvVzgzNzkzUgorICAgIFByZWZpeDogJ3c4Mzc5MycKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmMgLSAweDJmCisgICAgRGF0YXNoZWV0OiBTdGlsbCBub3QgcHVibGlzaGVkCisKK0F1dGhvcnM6CisgICAgWXVhbiBNdSAoV2luYm9uZCBFbGVjdHJvbmljcykKKyAgICBSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PgorCisKK01vZHVsZSBwYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tLQorCisqIHJlc2V0IGludAorICAoZGVmYXVsdCAwKQorICBUaGlzIHBhcmFtZXRlciBpcyBub3QgcmVjb21tZW5kZWQsIGl0IHdpbGwgbG9zZSBtb3RoZXJib2FyZCBzcGVjaWZpYworICBzZXR0aW5ncy4gVXNlICdyZXNldD0xJyB0byByZXNldCB0aGUgY2hpcCB3aGVuIGxvYWRpbmcgdGhpcyBtb2R1bGUuCisKKyogZm9yY2Vfc3ViY2xpZW50cz1idXMsY2FkZHIsc2FkZHIxLHNhZGRyMgorICBUaGlzIGlzIHVzZWQgdG8gZm9yY2UgdGhlIGkyYyBhZGRyZXNzZXMgZm9yIHN1YmNsaWVudHMgb2YKKyAgYSBjZXJ0YWluIGNoaXAuIFR5cGljYWwgdXNhZ2UgaXMgYGZvcmNlX3N1YmNsaWVudHM9MCwweDJmLDB4NGEsMHg0YicKKyAgdG8gZm9yY2UgdGhlIHN1YmNsaWVudHMgb2YgY2hpcCAweDJmIG9uIGJ1cyAwIHRvIGkyYyBhZGRyZXNzZXMKKyAgMHg0YSBhbmQgMHg0Yi4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBXaW5ib25kIFc4Mzc5M0cvVzgzNzkzUiBjaGlwcy4KKworKiBFeHBvcnRlZCBmZWF0dXJlcworICBUaGlzIGRyaXZlciBleHBvcnRzIDEwIHZvbHRhZ2Ugc2Vuc29ycywgdXAgdG8gMTIgZmFuIHRhY2hvbWV0ZXIgaW5wdXRzLAorICA2IHJlbW90ZSB0ZW1wZXJhdHVyZXMsIHVwIHRvIDggc2V0cyBvZiBQV00gZmFuIGNvbnRyb2xzLCBTbWFydEZhbgorICAoYXV0b21hdGljIGZhbiBzcGVlZCBjb250cm9sKSBvbiBhbGwgdGVtcGVyYXR1cmUvUFdNIGNvbWJpbmF0aW9ucywgMgorICBzZXRzIG9mIDYtcGluIENQVSBWSUQgaW5wdXQuCisKKyogU2Vuc29yIHJlc29sdXRpb25zCisgIElmIHlvdXIgbW90aGVyYm9hcmQgbWFrZXIgdXNlZCB0aGUgcmVmZXJlbmNlIGRlc2lnbiwgdGhlIHJlc29sdXRpb24gb2YKKyAgdm9sdGFnZTAtMiBpcyAybVYsIHJlc29sdXRpb24gb2Ygdm9sdGFnZTMvNC81IGlzIDE2bVYsIDhtViBmb3Igdm9sdGFnZTYsCisgIDI0bVYgZm9yIHZvbHRhZ2U3LzguIFRlbXAxLTQgaGF2ZSBhIDAuMjUgZGVncmVlIENlbHNpdXMgcmVzb2x1dGlvbiwKKyAgdGVtcDUtNiBoYXZlIGEgMSBkZWdyZWUgQ2Vsc2lpcyByZXNvbHV0aW9uLgorCisqIFRlbXBlcmF0dXJlIHNlbnNvciB0eXBlcworICBUZW1wMS00IGhhdmUgMyBwb3NzaWJsZSB0eXBlcy4gSXQgY2FuIGJlIHJlYWQgZnJvbSAoYW5kIHdyaXR0ZW4gdG8pCisgIHRlbXBbMS00XV90eXBlLgorICAtIElmIHRoZSB2YWx1ZSBvZiAwLCB0aGUgcmVsYXRlZCB0ZW1wZXJhdHVyZSBjaGFubmVsIHN0b3BzCisgICAgbW9uaXRvcmluZy4KKyAgLSBJZiB0aGUgdmFsdWUgaXMgMywgaXQgc3RhcnRzIG1vbml0b3JpbmcgdXNpbmcgYSByZW1vdGUgdGVybWFsIGRpb2RlCisgICAgKGRlZmF1bHQpLgorICAtIElmIHRoZSB2YWx1ZSBpcyA1LCBpdCBzdGFydHMgbW9uaXRvcmluZyB1c2luZyB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yCisgICAgaW4gQU1EIENQVSBhbmQgZ2V0IHJlc3VsdCBieSBBTURTSS4KKyAgLSBJZiB0aGUgdmFsdWUgaXMgNiwgaXQgc3RhcnRzIG1vbml0b3JpbmcgdXNpbmcgdGhlIHRlbXBlcmF0dXJlIHNlbnNvcgorICAgIGluIEludGVsIENQVSBhbmQgZ2V0IHJlc3VsdCBieSBQRUNJLgorICBUZW1wNS02IGNhbiBiZSBjb25uZWN0ZWQgdG8gZXh0ZXJuYWwgdGhlcm1pc3RvcnMgKHZhbHVlIG9mCisgIHRlbXBbNS02XV90eXBlIGlzIDQpLiBUaGV5IGNhbiBhbHNvIGJlIGRpc2FibGVkICh2YWx1ZSBpcyAwKS4KKworKiBBbGFybSBtZWNoYW5pc20KKyAgRm9yIHZvbHRhZ2Ugc2Vuc29ycywgYW4gYWxhcm0gdHJpZ2dlcnMgaWYgdGhlIG1lYXN1cmVkIHZhbHVlIGlzIGJlbG93CisgIHRoZSBsb3cgdm9sdGFnZSBsaW1pdCBvciBvdmVyIHRoZSBoaWdoIHZvbHRhZ2UgbGltaXQuCisgIEZvciB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBhbiBhbGFybSB0cmlnZ2VycyBpZiB0aGUgbWVhc3VyZWQgdmFsdWUgZ29lcworICBhYm92ZSB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBsaW1pdCwgYW5kIHdlYXJzIG9mZiBvbmx5IGFmdGVyIHRoZSBtZWFzdXJlZAorICB2YWx1ZSBkcm9wcyBiZWxvdyB0aGUgaHlzdGVyZXNpcyB2YWx1ZS4KKyAgRm9yIGZhbiBzZW5zb3JzLCBhbiBhbGFybSB0cmlnZ2VycyBpZiB0aGUgbWVhc3VyZWQgdmFsdWUgaXMgYmVsb3cgdGhlCisgIGxvdyBzcGVlZCBsaW1pdC4KKworKiBTbWFydEZhbi9QV00gY29udHJvbAorICBJZiB5b3Ugd2FudCB0byBzZXQgYSBwd20gZmFuIHRvIG1hbnVhbCBtb2RlLCB5b3UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSBpdAorICBpcyBub3QgY29udHJvbGxlZCBieSBhbnkgdGVtcCBjaGFubmVsLCBmb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gc2V0IGZhbjEKKyAgdG8gbWFudWFsIG1vZGUsIHlvdSBuZWVkIHRvIGNoZWNrIHRoZSB2YWx1ZSBvZiB0ZW1wWzEtNl1fZmFuX21hcCwgbWFrZQorICBzdXJlIGJpdCAwIGlzIGNsZWFyZWQgaW4gdGhlIDYgdmFsdWVzLiBBbmQgdGhlbiBzZXQgdGhlIHB3bTEgdmFsdWUgdG8KKyAgY29udHJvbCB0aGUgZmFuLgorCisgIEVhY2ggdGVtcGVyYXR1cmUgY2hhbm5lbCBjYW4gY29udHJvbCBhbGwgdGhlIDggUFdNIG91dHB1dHMgKGJ5IHNldHRpbmcgdGhlCisgIGNvcnJlc3BvbmRpbmcgYml0IGluIHRlbXBYX2Zhbl9tYXApLCB5b3UgY2FuIHNldCB0aGUgdGVtcGVyYXR1cmUgY2hhbm5lbAorICBtb2RlIHVzaW5nIHRlbXBbMS02XV9wd21fZW5hYmxlLCAyIGlzIFRoZXJtYWwgQ3J1aXNlIG1vZGUgYW5kIDMKKyAgaXMgdGhlIFNtYXJ0RmFuSUkgbW9kZS4gVGVtcGVyYXR1cmUgY2hhbm5lbHMgd2lsbCB0cnkgdG8gc3BlZWQgdXAgb3IKKyAgc2xvdyBkb3duIGFsbCBjb250cm9sbGVkIGZhbnMsIHRoaXMgbWVhbnMgb25lIGZhbiBjYW4gcmVjZWl2ZSBkaWZmZXJlbnQKKyAgUFdNIHZhbHVlIHJlcXVlc3RzIGZyb20gZGlmZmVyZW50IHRlbXBlcmF0dXJlIGNoYW5uZWxzLCBidXQgdGhlIGNoaXAKKyAgd2lsbCBhbHdheXMgcGljayB0aGUgc2FmZXN0IChtYXgpIFBXTSB2YWx1ZSBmb3IgZWFjaCBmYW4uCisKKyAgSW4gVGhlcm1hbCBDcnVpc2UgbW9kZSwgdGhlIGNoaXAgYXR0ZW1wdHMgdG8ga2VlcCB0aGUgdGVtcGVyYXR1cmUgYXQgYQorICBwcmVkZWZpbmVkIHZhbHVlLCB3aXRoaW4gYSB0b2xlcmFuY2UgbWFyZ2luLiBTbyBpZiB0ZW1wWF9pbnB1dCA+CisgIHRoZXJtYWxfY3J1aXNlWCArIHRvbGVyYW5jZVgsIHRoZSBjaGlwIHdpbGwgaW5jcmVhc2UgdGhlIFBXTSB2YWx1ZSwKKyAgaWYgdGVtcFhfaW5wdXQgPCB0aGVybWFsX2NydWlzZVggLSB0b2xlcmFuY2VYLCB0aGUgY2hpcCB3aWxsIGRlY3JlYXNlCisgIHRoZSBQV00gdmFsdWUuIElmIHRoZSB0ZW1wZXJhdHVyZSBpcyB3aXRoaW4gdGhlIHRvbGVyYW5jZSByYW5nZSwgdGhlIFBXTQorICB2YWx1ZSBpcyBsZWZ0IHVuY2hhbmdlZC4KKworICBTbWFydEZhbklJIHdvcmtzIGRpZmZlcmVudGx5LCB5b3UgaGF2ZSB0byBkZWZpbmUgdXAgdG8gNyBQV00sIHRlbXBlcmF0dXJlCisgIHRyaXAgcG9pbnRzLCBkZWZpbmluZyBhIFBXTS90ZW1wZXJhdHVyZSBjdXJ2ZSB3aGljaCB0aGUgY2hpcCB3aWxsIGZvbGxvdy4KKyAgV2hpbGUgbm90IGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IGZyb20gdGhlIFRoZXJtYWwgQ3J1aXNlIG1vZGUsIHRoZQorICBpbXBsZW1lbnRhdGlvbiBpcyBxdWl0ZSBkaWZmZXJlbnQsIGdpdmluZyB5b3UgYSBmaW5lci1ncmFpbmVkIGNvbnRyb2wuCisKKyogQ2hhc3NpcworICBJZiB0aGUgY2FzZSBvcGVuIGFsYXJtIHRyaWdnZXJzLCBpdCB3aWxsIHN0YXkgaW4gdGhpcyBzdGF0ZSB1bmxlc3MgY2xlYXJlZAorICBieSBhbnkgd3JpdGUgdG8gdGhlIHN5c2ZzIGZpbGUgImNoYXNzaXMiLgorCisqIFZJRCBhbmQgVlJNCisgIFRoZSBWUk0gdmVyc2lvbiBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LCBkb24ndCBtb2RpZnkgdGhlIGl0IHVubGVzcyB5b3UKKyAgKmRvKiBrbm93IHRoZSBjcHUgVlJNIHZlcnNpb24gYW5kIGl0J3Mgbm90IHByb3Blcmx5IGRldGVjdGVkLgorCisKK05vdGVzCistLS0tLQorCisgIE9ubHkgRmFuMS01IGFuZCBQV00xLTMgYXJlIGd1YXJhbnRlZWQgdG8gYWx3YXlzIGV4aXN0LCBvdGhlciBmYW4gaW5wdXRzIGFuZAorICBQV00gb3V0cHV0cyBtYXkgb3IgbWF5IG5vdCBleGlzdCBkZXBlbmRpbmcgb24gdGhlIGNoaXAgcGluIGNvbmZpZ3VyYXRpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWFtZDgxMTEgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWFtZDgxMTEKaW5kZXggZGIyOTRlZS4uNDYwZGQ2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1hbWQ4MTExCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtYW1kODExMQpAQCAtNSw3ICs1LDcgQEAKIAogRGF0YXNoZWV0czoKIAlBTUQgZGF0YXNoZWV0IG5vdCB5ZXQgYXZhaWxhYmxlLCBidXQgYWxtb3N0IGV2ZXJ5dGhpbmcgY2FuIGJlIGZvdW5kCi0JaW4gcHVibGljYWxseSBhdmFpbGFibGUgQUNQSSAyLjAgc3BlY2lmaWNhdGlvbiwgd2hpY2ggdGhlIGFkYXB0ZXIgCisJaW4gdGhlIHB1YmxpY2x5IGF2YWlsYWJsZSBBQ1BJIDIuMCBzcGVjaWZpY2F0aW9uLCB3aGljaCB0aGUgYWRhcHRlcgogCWZvbGxvd3MuCiAKIEF1dGhvcjogVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtaTgwMSBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtaTgwMQppbmRleCBlNDZjMjM0Li4zZGI2OWEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWk4MDEKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1pODAxCkBAIC05LDcgKzksMTAgQEAKICAgKiBJbnRlbCA4MjgwMUVCL0VSIChJQ0g1KSAoSFcgUEVDIHN1cHBvcnRlZCwgMzIgYnl0ZSBidWZmZXIgbm90IHN1cHBvcnRlZCkKICAgKiBJbnRlbCA2MzAwRVNCCiAgICogSW50ZWwgODI4MDFGQi9GUi9GVy9GUlcgKElDSDYpCi0gICogSW50ZWwgSUNINworICAqIEludGVsIDgyODAxRyAoSUNINykKKyAgKiBJbnRlbCA2MzF4RVNCLzYzMnhFU0IgKEVTQjIpCisgICogSW50ZWwgODI4MDFIIChJQ0g4KQorICAqIEludGVsIElDSDkKICAgICBEYXRhc2hlZXRzOiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIEludGVsIHdlYnNpdGUKIAogQXV0aG9yczogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIKaW5kZXggY2Q0OWM0Mi4uN2Y2MWZiYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMgpAQCAtMTAsMTEgKzEwLDExIEBACiAgICogbkZvcmNlNCBNQ1A1MSAgICAgICAgICAgICAgMTBkZTowMjY0CiAgICogbkZvcmNlNCBNQ1A1NSAgICAgICAgICAgICAgMTBkZTowMzY4CiAKLURhdGFzaGVldDogbm90IHB1YmxpY2FsbHkgYXZhaWxhYmxlLCBidXQgc2VlbXMgdG8gYmUgc2ltaWxhciB0byB0aGUKK0RhdGFzaGVldDogbm90IHB1YmxpY2x5IGF2YWlsYWJsZSwgYnV0IHNlZW1zIHRvIGJlIHNpbWlsYXIgdG8gdGhlCiAgICAgICAgICAgIEFNRC04MTExIFNNQnVzIDIuMCBhZGFwdGVyLgogCiBBdXRob3JzOgotCUhhbnMtRnJpZWRlciBWb2d0IDxoZnZvZ3RAYXJjb3IuZGU+LCAKKwlIYW5zLUZyaWVkZXIgVm9ndCA8aGZ2b2d0QGdteC5uZXQ+LAogCVRob21hcyBMZWlib2xkIDx0aG9tYXNAcGx4LmNvbT4sIAogICAgICAgICBQYXRyaWNrIERyZWtlciA8cGF0cmlja0BkcmVrZXIuZGU+CiAJCkBAIC0zOCw3ICszOCw3IEBACiAtLS0tLQogCiBUaGUgU01CdXMgYWRhcHRlciBpbiB0aGUgbkZvcmNlMiBjaGlwc2V0IHNlZW1zIHRvIGJlIHZlcnkgc2ltaWxhciB0byB0aGUKLVNNQnVzIDIuMCBhZGFwdGVyIGluIHRoZSBBTUQtODExMSBzb3V0aGJyaWRnZS4gSG93ZXZlciwgSSBjb3VsZCBvbmx5IGdldAorU01CdXMgMi4wIGFkYXB0ZXIgaW4gdGhlIEFNRC04MTExIHNvdXRoIGJyaWRnZS4gSG93ZXZlciwgSSBjb3VsZCBvbmx5IGdldAogdGhlIGRyaXZlciB0byB3b3JrIHdpdGggZGlyZWN0IEkvTyBhY2Nlc3MsIHdoaWNoIGlzIGRpZmZlcmVudCB0byB0aGUgRUMKIGludGVyZmFjZSBvZiB0aGUgQU1ELTgxMTEuIFRlc3RlZCBvbiBBc3VzIEE3TjhYLiBUaGUgQUNQSSBEU0RUIHRhYmxlIG9mIHRoZQogQXN1cyBBN044WCBsaXN0cyB0d28gU01CdXNlcywgYm90aCBvZiB3aGljaCBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0IGIvRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0CmluZGV4IGM1MTMxNGIuLjk1NzVkZTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTM4Ni9ib290LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2kzODYvYm9vdC50eHQKQEAgLTIsNyArMiw3IEBACiAJCSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAJCSAgICBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4KLQkJCUxhc3QgdXBkYXRlIDIwMDUtMDktMDIKKwkJCUxhc3QgdXBkYXRlIDIwMDYtMTEtMTcKIAogT24gdGhlIGkzODYgcGxhdGZvcm0sIHRoZSBMaW51eCBrZXJuZWwgdXNlcyBhIHJhdGhlciBjb21wbGljYXRlZCBib290CiBjb252ZW50aW9uLiAgVGhpcyBoYXMgZXZvbHZlZCBwYXJ0aWFsbHkgZHVlIHRvIGhpc3RvcmljYWwgYXNwZWN0cywgYXMKQEAgLTM1LDYgKzM1LDggQEAKIAkJaW5pdHJkIGFkZHJlc3MgYXZhaWxhYmxlIHRvIHRoZSBib290bG9hZGVyLgogCiBQcm90b2NvbCAyLjA0OgkoS2VybmVsIDIuNi4xNCkgRXh0ZW5kIHRoZSBzeXNzaXplIGZpZWxkIHRvIGZvdXIgYnl0ZXMuCitQcm90b2NvbCAyLjA1OgkoS2VybmVsIDIuNi4yMCkgTWFrZSBwcm90ZWN0ZWQgbW9kZSBrZXJuZWwgcmVsb2NhdGFibGUuCisJCUludHJvZHVjZSByZWxvY2F0YWJsZV9rZXJuZWwgYW5kIGtlcm5lbF9hbGlnbm1lbnQgZmllbGRzLgogCiAKICoqKiogTUVNT1JZIExBWU9VVApAQCAtMTI5LDYgKzEzMSw4IEBACiAwMjI2LzIJTi9BCXBhZDEJCVVudXNlZAogMDIyOC80CTIuMDIrCWNtZF9saW5lX3B0cgkzMi1iaXQgcG9pbnRlciB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZQogMDIyQy80CTIuMDMrCWluaXRyZF9hZGRyX21heAlIaWdoZXN0IGxlZ2FsIGluaXRyZCBhZGRyZXNzCiswMjMwLzQJMi4wNSsJa2VybmVsX2FsaWdubWVudCBQaHlzaWNhbCBhZGRyIGFsaWdubWVudCByZXF1aXJlZCBmb3Iga2VybmVsCiswMjM0LzEJMi4wNSsJcmVsb2NhdGFibGVfa2VybmVsIFdoZXRoZXIga2VybmVsIGlzIHJlbG9jYXRhYmxlIG9yIG5vdAogCiAoMSkgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpZiB0aGUgc2V0dXBfc2VjdHMgZmllbGQgY29udGFpbnMgMCwgdGhlCiAgICAgcmVhbCB2YWx1ZSBpcyA0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pYm0tYWNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2libS1hY3BpLnR4dAppbmRleCA3MWFhNDAzLi4wMTMyZDM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2libS1hY3BpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2libS1hY3BpLnR4dApAQCAtMzAsOSArMzAsMTAgQEAKIAktIEFDUEkgc291bmRzCiAJLSB0ZW1wZXJhdHVyZSBzZW5zb3JzCiAJLSBFeHBlcmltZW50YWw6IGVtYmVkZGVkIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZHVtcAotCS0gRXhwZXJpbWVudGFsOiBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sCi0JLSBFeHBlcmltZW50YWw6IHZvbHVtZSBjb250cm9sCisJLSBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sCisJLSBWb2x1bWUgY29udHJvbAogCS0gRXhwZXJpbWVudGFsOiBmYW4gc3BlZWQsIGZhbiBlbmFibGUvZGlzYWJsZQorCS0gRXhwZXJpbWVudGFsOiBXQU4gZW5hYmxlIGFuZCBkaXNhYmxlCiAKIEEgY29tcGF0aWJpbGl0eSB0YWJsZSBieSBtb2RlbCBhbmQgZmVhdHVyZSBpcyBtYWludGFpbmVkIG9uIHRoZSB3ZWIKIHNpdGUsIGh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvLiBJIGFwcHJlY2lhdGUgYW55IHN1Y2Nlc3Mgb3IgZmFpbHVyZQpAQCAtNTIsNDAgKzUzLDcgQEAKIAogSWYgeW91IGFyZSBjb21waWxpbmcgdGhpcyBkcml2ZXIgYXMgaW5jbHVkZWQgaW4gdGhlIExpbnV4IGtlcm5lbAogc291cmNlcywgc2ltcGx5IGVuYWJsZSB0aGUgQ09ORklHX0FDUElfSUJNIG9wdGlvbiAoUG93ZXIgTWFuYWdlbWVudCAvCi1BQ1BJIC8gSUJNIFRoaW5rUGFkIExhcHRvcCBFeHRyYXMpLiBUaGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24gZGVzY3JpYmVzCi1ob3cgdG8gaW5zdGFsbCB0aGlzIGRyaXZlciB3aGVuIGRvd25sb2FkZWQgZnJvbSB0aGUgd2ViIHNpdGUuCi0KLUZpcnN0LCB5b3UgbmVlZCB0byBnZXQgYSBrZXJuZWwgd2l0aCBBQ1BJIHN1cHBvcnQgdXAgYW5kIHJ1bm5pbmcuCi1QbGVhc2UgcmVmZXIgdG8gaHR0cDovL2FjcGkuc291cmNlZm9yZ2UubmV0LyBmb3IgaGVscCB3aXRoIHRoaXMKLXN0ZXAuIEhvdyBzdWNjZXNzZnVsIHlvdSB3aWxsIGJlIGRlcGVuZHMgYSBsb3Qgb24geW91IFRoaW5rUGFkIG1vZGVsLAotdGhlIGtlcm5lbCB5b3UgYXJlIHVzaW5nIGFuZCBhbnkgYWRkaXRpb25hbCBwYXRjaGVzIGFwcGxpZWQuIFRoZQota2VybmVsIHByb3ZpZGVkIHdpdGggeW91ciBkaXN0cmlidXRpb24gbWF5IG5vdCBiZSBnb29kIGVub3VnaC4gSQotbmVlZGVkIHRvIGNvbXBpbGUgYSAyLjYuNyBrZXJuZWwgd2l0aCB0aGUgMjAwNDA3MTUgQUNQSSBwYXRjaCB0byBnZXQKLUFDUEkgd29ya2luZyByZWxpYWJseSBvbiBteSBUaGlua1BhZCBYNDAuIE9sZCBUaGlua1BhZCBtb2RlbHMgbWF5IG5vdAotYmUgc3VwcG9ydGVkIGF0IGFsbC4KLQotQXNzdW1pbmcgeW91IGhhdmUgdGhlIGJhc2ljIEFDUEkgc3VwcG9ydCB3b3JraW5nIChlLmcuIHlvdSBjYW4gc2VlIHRoZQotL3Byb2MvYWNwaSBkaXJlY3RvcnkpLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBpbnN0YWxsIHRoaXMKLWRyaXZlcjoKLQotCS0gdW5wYWNrIHRoZSBhcmNoaXZlOgotCi0JCXRhciB4enZmIGlibS1hY3BpLXgueS50YXIuZ3o7IGNkIGlibS1hY3BpLXgueQotCi0JLSBjb21waWxlIHRoZSBkcml2ZXI6Ci0KLQkJbWFrZQotCi0JLSBpbnN0YWxsIHRoZSBtb2R1bGUgaW4geW91ciBrZXJuZWwgbW9kdWxlcyBkaXJlY3Rvcnk6Ci0KLQkJbWFrZSBpbnN0YWxsCi0KLQktIGxvYWQgdGhlIG1vZHVsZToKLQotCQltb2Rwcm9iZSBpYm1fYWNwaQotCi1BZnRlciBsb2FkaW5nIHRoZSBtb2R1bGUsIGNoZWNrIHRoZSAiZG1lc2ciIG91dHB1dCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzLgotCitBQ1BJIC8gSUJNIFRoaW5rUGFkIExhcHRvcCBFeHRyYXMpLgogCiBGZWF0dXJlcwogLS0tLS0tLS0KQEAgLTQzMCwyNiArMzk4LDY4IEBACiAKIE1vc3QgVGhpbmtQYWRzIGluY2x1ZGUgc2l4IG9yIG1vcmUgc2VwYXJhdGUgdGVtcGVyYXR1cmUgc2Vuc29ycyBidXQKIG9ubHkgZXhwb3NlIHRoZSBDUFUgdGVtcGVyYXR1cmUgdGhyb3VnaCB0aGUgc3RhbmRhcmQgQUNQSSBtZXRob2RzLgotVGhpcyBmZWF0dXJlIHNob3dzIHJlYWRpbmdzIGZyb20gdXAgdG8gZWlnaHQgZGlmZmVyZW50IHNlbnNvcnMuIFNvbWUKLXJlYWRpbmdzIG1heSBub3QgYmUgdmFsaWQsIGUuZy4gbWF5IHNob3cgbGFyZ2UgbmVnYXRpdmUgdmFsdWVzLiBGb3IKLWV4YW1wbGUsIG9uIHRoZSBYNDAsIGEgdHlwaWNhbCBvdXRwdXQgbWF5IGJlOgotCi10ZW1wZXJhdHVyZXM6ICAgNDIgNDIgNDUgNDEgMzYgLTEyOCAzMyAtMTI4Ci0KLVRob21hcyBHcnViZXIgdG9vayBoaXMgUjUxIGFwYXJ0IGFuZCB0cmFjZWQgYWxsIHNpeCBhY3RpdmUgc2Vuc29ycyBpbgotaGlzIGxhcHRvcCAodGhlIGxvY2F0aW9uIG9mIHNlbnNvcnMgbWF5IHZhcnkgb24gb3RoZXIgbW9kZWxzKToKLQotMTogIENQVQotMjogIE1pbmkgUENJIE1vZHVsZQotMzogIEhERAotNDogIEdQVQotNTogIEJhdHRlcnkKLTY6ICBOL0EKLTc6ICBCYXR0ZXJ5Ci04OiAgTi9BCitUaGlzIGZlYXR1cmUgc2hvd3MgcmVhZGluZ3MgZnJvbSB1cCB0byBlaWdodCBkaWZmZXJlbnQgc2Vuc29ycyBvbiBvbGRlcgorVGhpbmtQYWRzLCBhbmQgaXQgaGFzIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB1cCB0byBzaXh0ZWVuIGRpZmZlcmVudAorc2Vuc29ycyBvbiBuZXdlciBUaGlua1BhZHMuICBSZWFkaW5ncyBmcm9tIHNlbnNvcnMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZQorcmV0dXJuIC0xMjguCiAKIE5vIGNvbW1hbmRzIGNhbiBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZS4KIAorRVhQRVJJTUVOVEFMOiBUaGUgMTYtc2Vuc29ycyBmZWF0dXJlIGlzIG1hcmtlZCBFWFBFUklNRU5UQUwgYmVjYXVzZSB0aGUKK2ltcGxlbWVudGF0aW9uIGRpcmVjdGx5IGFjY2Vzc2VzIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgbWF5IG5vdCB3b3JrIGFzCitleHBlY3RlZC4gVVNFIFdJVEggQ0FVVElPTiEgVG8gdXNlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gc3VwcGx5IHRoZQorZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlLiAgV2hlbiBFWFBFUklNRU5UQUwKK21vZGUgaXMgZW5hYmxlZCwgcmVhZGluZyB0aGUgZmlyc3QgOCBzZW5zb3JzIG9uIG5ld2VyIFRoaW5rUGFkcyB3aWxsCithbHNvIHVzZSBhbiBuZXcgZXhwZXJpbWVudGFsIHRoZXJtYWwgc2Vuc29yIGFjY2VzcyBtb2RlLgorCitGb3IgZXhhbXBsZSwgb24gdGhlIFg0MCwgYSB0eXBpY2FsIG91dHB1dCBtYXkgYmU6Cit0ZW1wZXJhdHVyZXM6ICAgNDIgNDIgNDUgNDEgMzYgLTEyOCAzMyAtMTI4CisKK0VYUEVSSU1FTlRBTDogT24gdGhlIFQ0My9wLCBhIHR5cGljYWwgb3V0cHV0IG1heSBiZToKK3RlbXBlcmF0dXJlczogICA0OCA0OCAzNiA1MiAzOCAtMTI4IDMxIC0xMjggNDggNTIgNDggLTEyOCAtMTI4IC0xMjggLTEyOCAtMTI4CisKK1RoZSBtYXBwaW5nIG9mIHRoZXJtYWwgc2Vuc29ycyB0byBwaHlzaWNhbCBsb2NhdGlvbnMgdmFyaWVzIGRlcGVuZGluZyBvbgorc3lzdGVtLWJvYXJkIG1vZGVsIChhbmQgdGh1cywgb24gVGhpbmtQYWQgbW9kZWwpLgorCitodHRwOi8vdGhpbmt3aWtpLm9yZy93aWtpL1RoZXJtYWxfU2Vuc29ycyBpcyBhIHB1YmxpYyB3aWtpIHBhZ2UgdGhhdAordHJpZXMgdG8gdHJhY2sgZG93biB0aGVzZSBsb2NhdGlvbnMgZm9yIHZhcmlvdXMgbW9kZWxzLgorCitNb3N0IChuZXdlcj8pIG1vZGVscyBzZWVtIHRvIGZvbGxvdyB0aGlzIHBhdHRlcm46CisKKzE6ICBDUFUKKzI6ICAoZGVwZW5kcyBvbiBtb2RlbCkKKzM6ICAoZGVwZW5kcyBvbiBtb2RlbCkKKzQ6ICBHUFUKKzU6ICBNYWluIGJhdHRlcnk6IG1haW4gc2Vuc29yCis2OiAgQmF5IGJhdHRlcnk6IG1haW4gc2Vuc29yCis3OiAgTWFpbiBiYXR0ZXJ5OiBzZWNvbmRhcnkgc2Vuc29yCis4OiAgQmF5IGJhdHRlcnk6IHNlY29uZGFyeSBzZW5zb3IKKzktMTU6IChkZXBlbmRzIG9uIG1vZGVsKQorCitGb3IgdGhlIFI1MSAoc291cmNlOiBUaG9tYXMgR3J1YmVyKToKKzI6ICBNaW5pLVBDSQorMzogIEludGVybmFsIEhERAorCitGb3IgdGhlIFQ0MywgVDQzL3AgKHNvdXJjZTogU2htaWRvYXgvVGhpbmt3aWtpLm9yZykKK2h0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvVGhlcm1hbF9TZW5zb3JzI1RoaW5rUGFkX1Q0My4yQ19UNDNwCisyOiAgU3lzdGVtIGJvYXJkLCBsZWZ0IHNpZGUgKG5lYXIgUENNQ0lBIHNsb3QpLCByZXBvcnRlZCBhcyBIREFQUyB0ZW1wCiszOiAgUENNQ0lBIHNsb3QKKzk6ICBNQ0ggKG5vcnRoYnJpZGdlKSB0byBEUkFNIEJ1cworMTA6IElDSCAoc291dGhicmlkZ2UpLCB1bmRlciBNaW5pLVBDSSBjYXJkLCB1bmRlciB0b3VjaHBhZAorMTE6IFBvd2VyIHJlZ3VsYXRvciwgdW5kZXJzaWRlIG9mIHN5c3RlbSBib2FyZCwgYmVsb3cgRjIga2V5CisKK1RoZSBBMzEgaGFzIGEgdmVyeSBhdHlwaWNhbCBsYXlvdXQgZm9yIHRoZSB0aGVybWFsIHNlbnNvcnMKKyhzb3VyY2U6IE1pbG9zIFBvcG92aWMsIGh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvVGhlcm1hbF9TZW5zb3JzI1RoaW5rUGFkX0EzMSkKKzE6ICBDUFUKKzI6ICBNYWluIEJhdHRlcnk6IG1haW4gc2Vuc29yCiszOiAgUG93ZXIgQ29udmVydGVyCis0OiAgQmF5IEJhdHRlcnk6IG1haW4gc2Vuc29yCis1OiAgTUNIIChub3J0aGJyaWRnZSkKKzY6ICBQQ01DSUEvYW1iaWVudAorNzogIE1haW4gQmF0dGVyeTogc2Vjb25kYXJ5IHNlbnNvcgorODogIEJheSBCYXR0ZXJ5OiBzZWNvbmRhcnkgc2Vuc29yCisKKwogRVhQRVJJTUVOVEFMOiBFbWJlZGRlZCBjb250cm9sbGVyIHJlZ2lzdGVyIGR1bXAgLS0gL3Byb2MvYWNwaS9pYm0vZWNkdW1wCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNTIzLDEzICs1MzMsOCBAQAogd2l0aCB0aGlzLCBkbyBzZW5kIG1lIHlvdXIgcmVzdWx0cyAoaW5jbHVkaW5nIHNvbWUgY29tcGxldGUgZHVtcHMgd2l0aAogYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZGl0aW9ucyB3aGVuIHRoZXkgd2VyZSB0YWtlbi4pCiAKLUVYUEVSSU1FTlRBTDogTENEIGJyaWdodG5lc3MgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS9icmlnaHRuZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIGZlYXR1cmUgaXMgbWFya2VkIEVYUEVSSU1FTlRBTCBiZWNhdXNlIHRoZSBpbXBsZW1lbnRhdGlvbgotZGlyZWN0bHkgYWNjZXNzZXMgaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIFVTRQotV0lUSCBDQVVUSU9OISBUbyB1c2UgdGhpcyBmZWF0dXJlLCB5b3UgbmVlZCB0byBzdXBwbHkgdGhlCi1leHBlcmltZW50YWw9MSBwYXJhbWV0ZXIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCitMQ0QgYnJpZ2h0bmVzcyBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL2JyaWdodG5lc3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGZlYXR1cmUgYWxsb3dzIHNvZnR3YXJlIGNvbnRyb2wgb2YgdGhlIExDRCBicmlnaHRuZXNzIG9uIFRoaW5rUGFkCiBtb2RlbHMgd2hpY2ggZG9uJ3QgaGF2ZSBhIGhhcmR3YXJlIGJyaWdodG5lc3Mgc2xpZGVyLiBUaGUgYXZhaWxhYmxlCkBAIC01NDIsMTMgKzU0Nyw4IEBACiBUaGUgPGxldmVsPiBudW1iZXIgcmFuZ2UgaXMgMCB0byA3LCBhbHRob3VnaCBub3QgYWxsIG9mIHRoZW0gbWF5IGJlCiBkaXN0aW5jdC4gVGhlIGN1cnJlbnQgYnJpZ2h0bmVzcyBsZXZlbCBpcyBzaG93biBpbiB0aGUgZmlsZS4KIAotRVhQRVJJTUVOVEFMOiBWb2x1bWUgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS92b2x1bWUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgZmVhdHVyZSBpcyBtYXJrZWQgRVhQRVJJTUVOVEFMIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uCi1kaXJlY3RseSBhY2Nlc3NlcyBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFCi1XSVRIIENBVVRJT04hIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUKLWV4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KK1ZvbHVtZSBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL3ZvbHVtZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZmVhdHVyZSBhbGxvd3Mgdm9sdW1lIGNvbnRyb2wgb24gVGhpbmtQYWQgbW9kZWxzIHdoaWNoIGRvbid0IGhhdmUKIGEgaGFyZHdhcmUgdm9sdW1lIGtub2IuIFRoZSBhdmFpbGFibGUgY29tbWFuZHMgYXJlOgpAQCAtNTcxLDI3ICs1NzEsNTcgQEAKIFdJVEggQ0FVVElPTiEgVG8gdXNlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gc3VwcGx5IHRoZQogZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlLgogCi1UaGlzIGZlYXR1cmUgYXR0ZW1wdHMgdG8gc2hvdyB0aGUgY3VycmVudCBmYW4gc3BlZWQuIFRoZSBzcGVlZCBpcyByZWFkCi1kaXJlY3RseSBmcm9tIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgb2YgdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIuIFRoaXMKLWlzIGtub3duIHRvIHdvcmsgb24gbGF0ZXIgUiwgVCBhbmQgWCBzZXJpZXMgVGhpbmtQYWRzIGJ1dCBtYXkgc2hvdyBhCi1ib2d1cyB2YWx1ZSBvbiBvdGhlciBtb2RlbHMuCitUaGlzIGZlYXR1cmUgYXR0ZW1wdHMgdG8gc2hvdyB0aGUgY3VycmVudCBmYW4gc3BlZWQsIGNvbnRyb2wgbW9kZSBhbmQKK290aGVyIGZhbiBkYXRhIHRoYXQgbWlnaHQgYmUgYXZhaWxhYmxlLiAgVGhlIHNwZWVkIGlzIHJlYWQgZGlyZWN0bHkKK2Zyb20gdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyBvZiB0aGUgZW1iZWRkZWQgY29udHJvbGxlci4gIFRoaXMgaXMga25vd24KK3RvIHdvcmsgb24gbGF0ZXIgUiwgVCBhbmQgWCBzZXJpZXMgVGhpbmtQYWRzIGJ1dCBtYXkgc2hvdyBhIGJvZ3VzCit2YWx1ZSBvbiBvdGhlciBtb2RlbHMuCisKK01vc3QgVGhpbmtQYWQgZmFucyB3b3JrIGluICJsZXZlbHMiLiAgTGV2ZWwgMCBzdG9wcyB0aGUgZmFuLiAgVGhlIGhpZ2hlcgordGhlIGxldmVsLCB0aGUgaGlnaGVyIHRoZSBmYW4gc3BlZWQsIGFsdGhvdWdoIGFkamFjZW50IGxldmVscyBvZnRlbiBtYXAKK3RvIHRoZSBzYW1lIGZhbiBzcGVlZC4gIDcgaXMgdGhlIGhpZ2hlc3QgbGV2ZWwsIHdoZXJlIHRoZSBmYW4gcmVhY2hlcwordGhlIG1heGltdW0gcmVjb21tZW5kZWQgc3BlZWQuICBMZXZlbCAiYXV0byIgbWVhbnMgdGhlIEVDIGNoYW5nZXMgdGhlCitmYW4gbGV2ZWwgYWNjb3JkaW5nIHRvIHNvbWUgaW50ZXJuYWwgYWxnb3JpdGhtLCB1c3VhbGx5IGJhc2VkIG9uCityZWFkaW5ncyBmcm9tIHRoZSB0aGVybWFsIHNlbnNvcnMuICBMZXZlbCAiZGlzZW5nYWdlZCIgbWVhbnMgdGhlIEVDCitkaXNhYmxlcyB0aGUgc3BlZWQtbG9ja2VkIGNsb3NlZC1sb29wIGZhbiBjb250cm9sLCBhbmQgZHJpdmVzIHRoZSBmYW4gYXMKK2Zhc3QgYXMgaXQgY2FuIGdvLCB3aGljaCBtaWdodCBleGNlZWQgaGFyZHdhcmUgbGltaXRzLCBzbyB1c2UgdGhpcyBsZXZlbAord2l0aCBjYXV0aW9uLgorCitUaGUgZmFuIHVzdWFsbHkgcmFtcHMgdXAgb3IgZG93biBzbG93bHkgZnJvbSBvbmUgc3BlZWQgdG8gYW5vdGhlciwKK2FuZCBpdCBpcyBub3JtYWwgZm9yIHRoZSBFQyB0byB0YWtlIHNldmVyYWwgc2Vjb25kcyB0byByZWFjdCB0byBmYW4KK2NvbW1hbmRzLgogCiBUaGUgZmFuIG1heSBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kczoKIAogCWVjaG8gZW5hYmxlICA+L3Byb2MvYWNwaS9pYm0vZmFuCiAJZWNobyBkaXNhYmxlID4vcHJvYy9hY3BpL2libS9mYW4KIAotV0FSTklORyBXQVJOSU5HIFdBUk5JTkc6IGRvIG5vdCBsZWF2ZSB0aGUgZmFuIGRpc2FibGVkIHVubGVzcyB5b3UgYXJlCi1tb25pdG9yaW5nIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmVhZGluZ3MgYW5kIHlvdSBhcmUgcmVhZHkgdG8gZW5hYmxlCi1pdCBpZiBuZWNlc3NhcnkgdG8gYXZvaWQgb3ZlcmhlYXRpbmcuCitQbGFjaW5nIGEgZmFuIG9uIGxldmVsIDAgaXMgdGhlIHNhbWUgYXMgZGlzYWJsaW5nIGl0LiAgRW5hYmxpbmcgYSBmYW4KK3dpbGwgdHJ5IHRvIHBsYWNlIGl0IGluIGEgc2FmZSBsZXZlbCBpZiBpdCBpcyB0b28gc2xvdyBvciBkaXNhYmxlZC4KIAotVGhlIGZhbiBvbmx5IHJ1bnMgaWYgaXQncyBlbmFibGVkICphbmQqIHRoZSB2YXJpb3VzIHRlbXBlcmF0dXJlCi1zZW5zb3JzIHdoaWNoIGNvbnRyb2wgaXQgcmVhZCBoaWdoIGVub3VnaC4gT24gdGhlIFg0MCwgdGhpcyBzZWVtcyB0bwotZGVwZW5kIG9uIHRoZSBDUFUgYW5kIEhERCB0ZW1wZXJhdHVyZXMuIFNwZWNpZmljYWxseSwgdGhlIGZhbiBpcwotdHVybmVkIG9uIHdoZW4gZWl0aGVyIHRoZSBDUFUgdGVtcGVyYXR1cmUgY2xpbWJzIHRvIDU2IGRlZ3JlZXMgb3IgdGhlCi1IREQgdGVtcGVyYXR1cmUgY2xpbWJzIHRvIDQ2IGRlZ3JlZXMuIFRoZSBmYW4gaXMgdHVybmVkIG9mZiB3aGVuIHRoZQotQ1BVIHRlbXBlcmF0dXJlIGRyb3BzIHRvIDQ5IGRlZ3JlZXMgYW5kIHRoZSBIREQgdGVtcGVyYXR1cmUgZHJvcHMgdG8KLTQxIGRlZ3JlZXMuIFRoZXNlIHRocmVzaG9sZHMgY2Fubm90IGN1cnJlbnRseSBiZSBjb250cm9sbGVkLgorV0FSTklORyBXQVJOSU5HIFdBUk5JTkc6IGRvIG5vdCBsZWF2ZSB0aGUgZmFuIGRpc2FibGVkIHVubGVzcyB5b3UgYXJlCittb25pdG9yaW5nIGFsbCBvZiB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yIHJlYWRpbmdzIGFuZCB5b3UgYXJlIHJlYWR5IHRvCitlbmFibGUgaXQgaWYgbmVjZXNzYXJ5IHRvIGF2b2lkIG92ZXJoZWF0aW5nLgorCitBbiBlbmFibGVkIGZhbiBpbiBsZXZlbCAiYXV0byIgbWF5IHN0b3Agc3Bpbm5pbmcgaWYgdGhlIEVDIGRlY2lkZXMgdGhlCitUaGlua1BhZCBpcyBjb29sIGVub3VnaCBhbmQgZG9lc24ndCBuZWVkIHRoZSBleHRyYSBhaXJmbG93LiAgVGhpcyBpcworbm9ybWFsLCBhbmQgdGhlIEVDIHdpbGwgc3BpbiB0aGUgZmFuIHVwIGlmIHRoZSB2YXJpb3MgdGhlcm1hbCByZWFkaW5ncworcmlzZSB0b28gbXVjaC4KKworT24gdGhlIFg0MCwgdGhpcyBzZWVtcyB0byBkZXBlbmQgb24gdGhlIENQVSBhbmQgSEREIHRlbXBlcmF0dXJlcy4KK1NwZWNpZmljYWxseSwgdGhlIGZhbiBpcyB0dXJuZWQgb24gd2hlbiBlaXRoZXIgdGhlIENQVSB0ZW1wZXJhdHVyZQorY2xpbWJzIHRvIDU2IGRlZ3JlZXMgb3IgdGhlIEhERCB0ZW1wZXJhdHVyZSBjbGltYnMgdG8gNDYgZGVncmVlcy4gIFRoZQorZmFuIGlzIHR1cm5lZCBvZmYgd2hlbiB0aGUgQ1BVIHRlbXBlcmF0dXJlIGRyb3BzIHRvIDQ5IGRlZ3JlZXMgYW5kIHRoZQorSEREIHRlbXBlcmF0dXJlIGRyb3BzIHRvIDQxIGRlZ3JlZXMuICBUaGVzZSB0aHJlc2hvbGRzIGNhbm5vdAorY3VycmVudGx5IGJlIGNvbnRyb2xsZWQuCisKK1RoZSBmYW4gbGV2ZWwgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgY29tbWFuZDoKKworCWVjaG8gJ2xldmVsIDxsZXZlbD4nID4gL3Byb2MvYWNwaS9pYm0vdGhlcm1hbAorCitXaGVyZSA8bGV2ZWw+IGlzIGFuIGludGVnZXIgZnJvbSAwIHRvIDcsIG9yIG9uZSBvZiB0aGUgd29yZHMgImF1dG8iCitvciAiZGlzZW5nYWdlZCIgKHdpdGhvdXQgdGhlIHF1b3RlcykuICBOb3QgYWxsIFRoaW5rUGFkcyBzdXBwb3J0IHRoZQorImF1dG8iIGFuZCAiZGlzZW5nYWdlZCIgbGV2ZWxzLgogCiBPbiB0aGUgWDMxIGFuZCBYNDAgKGFuZCBPTkxZIG9uIHRob3NlIG1vZGVscyksIHRoZSBmYW4gc3BlZWQgY2FuIGJlCiBjb250cm9sbGVkIHRvIGEgY2VydGFpbiBkZWdyZWUuIE9uY2UgdGhlIGZhbiBpcyBydW5uaW5nLCBpdCBjYW4gYmUKQEAgLTYwNCwxMyArNjM0LDI3IEBACiBhbnkgZWZmZWN0IG9yIHRoZSBmYW4gc3BlZWQgZXZlbnR1YWxseSBzZXR0bGVzIHNvbWV3aGVyZSBpbiB0aGF0CiByYW5nZS4gVGhlIGZhbiBjYW5ub3QgYmUgc3RvcHBlZCBvciBzdGFydGVkIHdpdGggdGhpcyBjb21tYW5kLgogCi1PbiB0aGUgNTcwLCB0ZW1wZXJhdHVyZSByZWFkaW5ncyBhcmUgbm90IGF2YWlsYWJsZSB0aHJvdWdoIHRoaXMKLWZlYXR1cmUgYW5kIHRoZSBmYW4gY29udHJvbCB3b3JrcyBhIGxpdHRsZSBkaWZmZXJlbnRseS4gVGhlIGZhbiBzcGVlZAotaXMgcmVwb3J0ZWQgaW4gbGV2ZWxzIGZyb20gMCAob2ZmKSB0byA3IChtYXgpIGFuZCBjYW4gYmUgY29udHJvbGxlZAotd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CitUaGUgVGhpbmtQYWQncyBBQ1BJIERTRFQgY29kZSB3aWxsIHJlcHJvZ3JhbSB0aGUgZmFuIG9uIGl0cyBvd24gd2hlbgorY2VydGFpbiBjb25kaXRpb25zIGFyZSBtZXQuICBJdCB3aWxsIG92ZXJyaWRlIGFueSBmYW4gcHJvZ3JhbW1pbmcgZG9uZQordGhyb3VnaCBpYm0tYWNwaS4KIAotCWVjaG8gJ2xldmVsIDxsZXZlbD4nID4gL3Byb2MvYWNwaS9pYm0vdGhlcm1hbAorRVhQRVJJTUVOVEFMOiBXQU4gLS0gL3Byb2MvYWNwaS9pYm0vd2FuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorVGhpcyBmZWF0dXJlIGlzIG1hcmtlZCBFWFBFUklNRU5UQUwgYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24KK2RpcmVjdGx5IGFjY2Vzc2VzIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBVU0UKK1dJVEggQ0FVVElPTiEgVG8gdXNlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gc3VwcGx5IHRoZQorZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlLgorCitUaGlzIGZlYXR1cmUgc2hvd3MgdGhlIHByZXNlbmNlIGFuZCBjdXJyZW50IHN0YXRlIG9mIGEgV0FOIChTaWVycmEKK1dpcmVsZXNzIEVWLURPKSBkZXZpY2UuIElmIFdBTiBpcyBpbnN0YWxsZWQsIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgY2FuCitiZSB1c2VkOgorCisJZWNobyBlbmFibGUgPiAvcHJvYy9hY3BpL2libS93YW4KKwllY2hvIGRpc2FibGUgPiAvcHJvYy9hY3BpL2libS93YW4KKworSXQgd2FzIHRlc3RlZCBvbiBhIExlbm92byBUaGlua3BhZCBYNjAuIEl0IHNob3VsZCBwcm9iYWJseSB3b3JrIG9uIG90aGVyCitUaGlua3BhZCBtb2RlbHMgd2hpY2ggY29tZSB3aXRoIHRoaXMgbW9kdWxlIGluc3RhbGxlZC4KIAogTXVsdGlwbGUgQ29tbWFuZHMsIE1vZHVsZSBQYXJhbWV0ZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYyNiw2ICs2NzAsMjYgQEAKIAogCW1vZHByb2JlIGlibV9hY3BpIGhvdGtleT1lbmFibGUsMHhmZmZmIHZpZGVvPWF1dG9fZGlzYWJsZQogCitUaGUgaWJtLWFjcGkga2VybmVsIGRyaXZlciBjYW4gYmUgcHJvZ3JhbW1lZCB0byByZXZlcnQgdGhlIGZhbiBsZXZlbAordG8gYSBzYWZlIHNldHRpbmcgaWYgdXNlcnNwYWNlIGRvZXMgbm90IGlzc3VlIG9uZSBvZiB0aGUgZmFuIGNvbW1hbmRzOgorImVuYWJsZSIsICJkaXNhYmxlIiwgImxldmVsIiBvciAid2F0Y2hkb2ciIHdpdGhpbiBhIGNvbmZpZ3VyYWJsZQorYW1tb3VudCBvZiB0aW1lLiAgVG8gZG8gdGhpcywgdXNlIHRoZSAid2F0Y2hkb2ciIGNvbW1hbmQuCisKKwllY2hvICd3YXRjaGRvZyA8aW50ZXJ2YWw+JyA+IC9wcm9jL2FjcGkvaWJtL2ZhbgorCitJbnRlcnZhbCBpcyB0aGUgYW1tb3VudCBvZiB0aW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3Igb25lIG9mIHRoZQorYWJvdmUgbWVudGlvbmVkIGZhbiBjb21tYW5kcyBiZWZvcmUgcmVzZXRpbmcgdGhlIGZhbiBsZXZlbCB0byBhIHNhZmUKK29uZS4gIElmIHNldCB0byB6ZXJvLCB0aGUgd2F0Y2hkb2cgaXMgZGlzYWJsZWQgKGRlZmF1bHQpLiAgV2hlbiB0aGUKK3dhdGNoZG9nIHRpbWVyIHJ1bnMgb3V0LCBpdCBkb2VzIHRoZSBleGFjdCBlcXVpdmFsZW50IG9mIHRoZSAiZW5hYmxlIgorZmFuIGNvbW1hbmQuCisKK05vdGUgdGhhdCB0aGUgd2F0Y2hkb2cgdGltZXIgc3RvcHMgYWZ0ZXIgaXQgZW5hYmxlcyB0aGUgZmFuLiAgSXQgd2lsbAorYmUgcmVhcm1lZCBhZ2FpbiBhdXRvbWF0aWNhbGx5ICh1c2luZyB0aGUgc2FtZSBpbnRlcnZhbCkgd2hlbiBvbmUgb2YKK3RoZSBhYm92ZSBtZW50aW9uZWQgZmFuIGNvbW1hbmRzIGlzIHJlY2VpdmVkLiAgVGhlIGZhbiB3YXRjaGRvZyBpcywKK3RoZXJlZm9yZSwgbm90IHN1aXRhYmxlIHRvIHByb3RlY3QgYWdhaW5zdCBmYW4gbW9kZSBjaGFuZ2VzIG1hZGUKK3Rocm91Z2ggbWVhbnMgb3RoZXIgdGhhbiB0aGUgImVuYWJsZSIsICJkaXNhYmxlIiwgYW5kICJsZXZlbCIgZmFuCitjb21tYW5kcy4KKwogCiBFeGFtcGxlIENvbmZpZ3VyYXRpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pZGUudHh0IGIvRG9jdW1lbnRhdGlvbi9pZGUudHh0CmluZGV4IDBiZjM4YmEuLjc4NmMzYTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaWRlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lkZS50eHQKQEAgLTM5MCw1ICszOTAsNSBAQAogV2VkIEFwciAxNyAyMjo1Mjo0NCBDRVNUIDIwMDIgZWRpdGVkIGJ5IE1hcmNpbiBEYWxlY2tpLCB0aGUgY3VycmVudAogbWFpbnRhaW5lci4KIAotV2VkIEF1ZyAyMCAyMjozMToyOSBDRVNUIDIwMDMgdXBkYXRlZCBpZGUgYm9vdCB1cHRpb25zIHRvIGN1cnJlbnQgaWRlLmMKK1dlZCBBdWcgMjAgMjI6MzE6MjkgQ0VTVCAyMDAzIHVwZGF0ZWQgaWRlIGJvb3Qgb3B0aW9ucyB0byBjdXJyZW50IGlkZS5jCiBjb21tZW50cyBhdCAyLjYuMC10ZXN0NCB0aW1lLiBNYWNpZWogU29sdHlzaWFrIDxzb2x0QGRucy50b3hpY2ZpbG1zLnR2PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9hbWlqb3kudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9hbWlqb3kudHh0CmluZGV4IDRmMGU4OWQuLjdkYzRmMTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvYW1pam95LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2FtaWpveS50eHQKQEAgLTkxLDggKzkxLDggQEAKICAgICAgICAgIHwgICAxICAgIHwgTTBIUSAgICAgfCBKT1kwREFUIEhvcml6b250YWwgQ2xvY2sgKHF1YWRyYXR1cmUpICAgfAogICAgICAgICAgfCAgIDIgICAgfCBNMFYgICAgICB8IEpPWTBEQVQgVmVydGljYWwgQ2xvY2sgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICB8ICAgMyAgICB8IE0wVlEgICAgIHwgSk9ZMERBVCBWZXJ0aWNhbCBDbG9jayAgKHF1YWRyYXR1cmUpICAgIHwKLSAgICAgICAgIHwgICA0ICAgIHwgTTFWICAgICAgfCBKT1kxREFUIEhvcml6b250YWxsIENsb2NrICAgICAgICAgICAgICAgfAotICAgICAgICAgfCAgIDUgICAgfCBNMVZRICAgICB8IEpPWTFEQVQgSG9yaXpvbnRhbGwgQ2xvY2sgKHF1YWRyYXR1cmUpICB8CisgICAgICAgICB8ICAgNCAgICB8IE0xViAgICAgIHwgSk9ZMURBVCBIb3Jpem9udGFsIENsb2NrICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIHwgICA1ICAgIHwgTTFWUSAgICAgfCBKT1kxREFUIEhvcml6b250YWwgQ2xvY2sgKHF1YWRyYXR1cmUpICAgfAogICAgICAgICAgfCAgIDYgICAgfCBNMVYgICAgICB8IEpPWTFEQVQgVmVydGljYWwgQ2xvY2sgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICB8ICAgNyAgICB8IE0xVlEgICAgIHwgSk9ZMURBVCBWZXJ0aWNhbCBDbG9jayAocXVhZHJhdHVyZSkgICAgIHwKICAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9hdGFyaWtiZC50eHQgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2F0YXJpa2JkLnR4dAppbmRleCAxZTdlNTg1Li42NjhmNGQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lucHV0L2F0YXJpa2JkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2F0YXJpa2JkLnR4dApAQCAtMTAzLDcgKzEwMyw3IEBACiAKIDUuMSBKb3lzdGljayBFdmVudCBSZXBvcnRpbmcKIAotSW4gdGhpcyBtb2RlLCB0aGUgaWtiZCBnZW5lcmF0ZXMgYSByZWNvcmQgd2hldmVyIHRoZSBqb3lzdGljayBwb3NpdGlvbiBpcworSW4gdGhpcyBtb2RlLCB0aGUgaWtiZCBnZW5lcmF0ZXMgYSByZWNvcmQgd2hlbmV2ZXIgdGhlIGpveXN0aWNrIHBvc2l0aW9uIGlzCiBjaGFuZ2VkIChpLmUuIGZvciBlYWNoIG9wZW5pbmcgb3IgY2xvc2luZyBvZiBhIGpveXN0aWNrIHN3aXRjaCBvciB0cmlnZ2VyKS4KIAogVGhlIGpveXN0aWNrIGV2ZW50IHJlY29yZCBpcyB0d28gYnl0ZXMgb2YgdGhlIGZvcm06CkBAIC0yNzcsOCArMjc3LDggQEAKIDkuNyBTRVQgTU9VU0UgU0NBTEUKIAogICAgIDB4MEMKLSAgICBYICAgICAgICAgICAgICAgICAgIDsgaG9yaXpvbnRhbCBtb3VzZSB0aWNrcyBwZXIgaW50ZXJuZWwgWAotICAgIFkgICAgICAgICAgICAgICAgICAgOyB2ZXJ0aWNhbCBtb3VzZSB0aWNrcyBwZXIgaW50ZXJuZWwgWQorICAgIFggICAgICAgICAgICAgICAgICAgOyBob3Jpem9udGFsIG1vdXNlIHRpY2tzIHBlciBpbnRlcm5hbCBYCisgICAgWSAgICAgICAgICAgICAgICAgICA7IHZlcnRpY2FsIG1vdXNlIHRpY2tzIHBlciBpbnRlcm5hbCBZCiAKIFRoaXMgY29tbWFuZCBzZXRzIHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBBQlNPTFVURSBNT1VTRSBQT1NJVElPTklORyBtb2RlLgogSW4gdGhpcyBtb2RlLCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb3VzZSBwaGFzZSBjaGFuZ2VzICgnY2xpY2tzJykgbXVzdApAQCAtMzIzLDcgKzMyMyw3IEBACiAgICAgMHgwRgogCiBUaGlzIGNvbW1hbmQgbWFrZXMgdGhlIG9yaWdpbiBvZiB0aGUgWSBheGlzIHRvIGJlIGF0IHRoZSBib3R0b20gb2YgdGhlCi1sb2dpY2FsIGNvb3JkaW5hdGUgc3lzdGVtIGludGVybmVsIHRvIHRoZSBpa2JkIGZvciBhbGwgcmVsYXRpdmUgb3IgYWJzb2x1dGUKK2xvZ2ljYWwgY29vcmRpbmF0ZSBzeXN0ZW0gaW50ZXJuYWwgdG8gdGhlIGlrYmQgZm9yIGFsbCByZWxhdGl2ZSBvciBhYnNvbHV0ZQogbW91c2UgbW90aW9uLiBUaGlzIGNhdXNlcyBtb3VzZSBtb3Rpb24gdG93YXJkIHRoZSB1c2VyIHRvIGJlIG5lZ2F0aXZlIGluIHNpZ24KIGFuZCBhd2F5IGZyb20gdGhlIHVzZXIgdG8gYmUgcG9zaXRpdmUuCiAKQEAgLTU5Nyw4ICs1OTcsOCBAQAogCiAxMC4gU0NBTiBDT0RFUwogCi1UaGUga2V5IHNjYW4gY29kZXMgcmV0dXJuIGJ5IHRoZSBpa2JkIGFyZSBjaG9zZW4gdG8gc2ltcGxpZnkgdGhlCi1pbXBsZW1lbnRhaW9uIG9mIEdTWC4KK1RoZSBrZXkgc2NhbiBjb2RlcyByZXR1cm5lZCBieSB0aGUgaWtiZCBhcmUgY2hvc2VuIHRvIHNpbXBsaWZ5IHRoZQoraW1wbGVtZW50YXRpb24gb2YgR1NYLgogCiBHU1ggU3RhbmRhcmQgS2V5Ym9hcmQgTWFwcGluZy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC94cGFkLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQveHBhZC50eHQKaW5kZXggYjkxMTFhNy4uNTQyN2JkZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC94cGFkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lucHV0L3hwYWQudHh0CkBAIC0zLDIwICszLDM3IEBACiBUaGlzIGlzIHRoZSB2ZXJ5IGZpcnN0IHJlbGVhc2Ugb2YgYSBkcml2ZXIgZm9yIFgtQm94IGdhbWVwYWRzLgogQmFzaWNhbGx5LCB0aGlzIHdhcyBoYWNrZWQgYXdheSBpbiBqdXN0IGEgZmV3IGhvdXJzLCBzbyBkb24ndCBleHBlY3QKIG1pcmFjbGVzLgorCiBJbiBwYXJ0aWN1bGFyLCB0aGVyZSBpcyBjdXJyZW50bHkgTk8gc3VwcG9ydCBmb3IgdGhlIHJ1bWJsZSBwYWNrLgogWW91IHdvbid0IGZpbmQgbWFueSBmZi1hd2FyZSBsaW51eCBhcHBsaWNhdGlvbnMgYW55d2F5LgogCiAKLTAuIFN0YXR1cwotLS0tLS0tLS0tCiswLiBOb3RlcworLS0tLS0tLS0KIAotRm9yIG5vdywgdGhpcyBkcml2ZXIgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgb24ganVzdCBvbmUgTGludXgtQm94LgotVGhpcyBvbmUgaXMgcnVubmluZyBhIDIuNC4xOCBrZXJuZWwgd2l0aCB1c2ItdWhjaSBvbiBhbiBhbWQgYXRobG9uIDYwMC4KK0RyaXZlciB1cGRhdGVkIGZvciBrZXJuZWwgMi42LjE3LjExLiAoQmFzZWQgb24gYSBwYXRjaCBmb3IgMi42LjExLjQuKQogCi1UaGUganN0ZXN0LXByb2dyYW0gZnJvbSBqb3lzdGljay0xLjIuMTUgKGpzdGVzdC12ZXJzaW9uIDIuMS4wKSByZXBvcnRzCi04IGF4ZXMgYW5kIDEwIGJ1dHRvbnMuCitUaGUgbnVtYmVyIG9mIGJ1dHRvbnMvYXhlcyByZXBvcnRlZCB2YXJpZXMgYmFzZWQgb24gMyB0aGluZ3M6CistIGlmIHlvdSBhcmUgdXNpbmcgYSBrbm93biBjb250cm9sbGVyCistIGlmIHlvdSBhcmUgdXNpbmcgYSBrbm93biBkYW5jZSBwYWQKKy0gaWYgdXNpbmcgYW4gdW5rbm93biBkZXZpY2UgKG9uZSBub3QgbGlzdGVkIGJlbG93KSwgd2hhdCB5b3Ugc2V0IGluIHRoZQorICBtb2R1bGUgY29uZmlndXJhdGlvbiBmb3IgIk1hcCBELVBBRCB0byBidXR0b25zIHJhdGhlciB0aGFuIGF4ZXMgZm9yIHVua25vd24KKyAgcGFkcyIgKG1vZHVsZSBvcHRpb24gZHBhZF90b19idXR0b25zKQogCi1BbGxzIDggYXhlcyB3b3JrLCB0aG91Z2ggdGhleSBhbGwgaGF2ZSB0aGUgc2FtZSByYW5nZSAoLTMyNzY4Li4zMjc2NykKK0lmIHlvdSBzZXQgZHBhZF90b19idXR0b25zIHRvIDAgYW5kIHlvdSBhcmUgdXNpbmcgYW4gdW5rbm93biBkZXZpY2UgKG9uZQorbm90IGxpc3RlZCBiZWxvdyksIHRoZSBkcml2ZXIgd2lsbCBtYXAgdGhlIGRpcmVjdGlvbmFsIHBhZCB0byBheGVzIChYL1kpLAoraWYgeW91IHNhaWQgTiBpdCB3aWxsIG1hcCB0aGUgZC1wYWQgdG8gYnV0dG9ucywgd2hpY2ggaXMgbmVlZGVkIGZvciBkYW5jZQorc3R5bGUgZ2FtZXMgdG8gZnVuY3Rpb24gY29ycmVjdGx5LiAgVGhlIGRlZmF1bHQgaXMgWS4KKworZHBhZF90b19idXR0b25zIGhhcyBubyBlZmZlY3QgZm9yIGtub3duIHBhZHMuCisKKzAuMSBOb3JtYWwgQ29udHJvbGxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1dpdGggYSBub3JtYWwgY29udHJvbGxlciwgdGhlIGRpcmVjdGlvbmFsIHBhZCBpcyBtYXBwZWQgdG8gaXRzIG93biBYL1kgYXhlcy4KK1RoZSBqc3Rlc3QtcHJvZ3JhbSBmcm9tIGpveXN0aWNrLTEuMi4xNSAoanN0ZXN0LXZlcnNpb24gMi4xLjApIHdpbGwgcmVwb3J0IDgKK2F4ZXMgYW5kIDEwIGJ1dHRvbnMuCisKK0FsbCA4IGF4ZXMgd29yaywgdGhvdWdoIHRoZXkgYWxsIGhhdmUgdGhlIHNhbWUgcmFuZ2UgKC0zMjc2OC4uMzI3NjcpCiBhbmQgdGhlIHplcm8tc2V0dGluZyBpcyBub3QgY29ycmVjdCBmb3IgdGhlIHRyaWdnZXJzIChJIGRvbid0IGtub3cgaWYgdGhhdAogaXMgc29tZSBsaW1pdGF0aW9uIG9mIGpzdGVzdCwgc2luY2UgdGhlIGlucHV0IGRldmljZSBzZXR1cCBzaG91bGQgYmUgZmluZS4gSQogZGlkbid0IGhhdmUgYSBsb29rIGF0IGpzdGVzdCBpdHNlbGYgeWV0KS4KQEAgLTMwLDE2ICs0Nyw1MCBAQAogcGxheSBmaXJzdCBwZXJzb24gc2hvb3RlcnMgd2l0aCBhIHBhZC4gWW91ciBtaWxlYWdlIG1heSB2YXJ5LgogCiAKKzAuMiBYYm94IERhbmNlIFBhZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK1doZW4gdXNpbmcgYSBrbm93biBkYW5jZSBwYWQsIGpzdGVzdCB3aWxsIHJlcG9ydCA2IGF4ZXMgYW5kIDE0IGJ1dHRvbnMuCisKK0ZvciBkYW5jZSBzdHlsZSBwYWRzIChsaWtlIHRoZSByZWRvY3RhbmUgcGFkKSBzZXZlcmFsIGNoYW5nZXMKK2hhdmUgYmVlbiBtYWRlLiAgVGhlIG9sZCBkcml2ZXIgd291bGQgbWFwIHRoZSBkLXBhZCB0byBheGVzLCByZXN1bHRpbmcKK2luIHRoZSBkcml2ZXIgYmVpbmcgdW5hYmxlIHRvIHJlcG9ydCB3aGVuIHRoZSB1c2VyIHdhcyBwcmVzc2luZyBib3RoCitsZWZ0K3JpZ2h0IG9yIHVwK2Rvd24sIG1ha2luZyBERFIgc3R5bGUgZ2FtZXMgdW5wbGF5YWJsZS4KKworS25vd24gZGFuY2UgcGFkcyBhdXRvbWF0aWNhbGx5IG1hcCB0aGUgZC1wYWQgdG8gYnV0dG9ucyBhbmQgd2lsbCB3b3JrCitjb3JyZWN0bHkgb3V0IG9mIHRoZSBib3guCisKK0lmIHlvdXIgZGFuY2UgcGFkIGlzIHJlY29nbml6ZWQgYnkgdGhlIGRyaXZlciBidXQgaXMgdXNpbmcgYXhlcyBpbnN0ZWFkCitvZiBidXR0b25zLCBzZWUgc2VjdGlvbiAwLjMgLSBVbmtub3duIENvbnRyb2xsZXJzCisKK0kndmUgdGVzdGVkIHRoaXMgd2l0aCBTdGVwbWFuaWEsIGFuZCBpdCB3b3JrcyBxdWl0ZSB3ZWxsLgorCisKKzAuMyBVbmtvd24gQ29udHJvbGxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lmIHlvdSBoYXZlIGFuIHVua293biB4Ym94IGNvbnRyb2xsZXIsIGl0IHNob3VsZCB3b3JrIGp1c3QgZmluZSB3aXRoCit0aGUgZGVmYXVsdCBzZXR0aW5ncy4KKworSE9XRVZFUiBpZiB5b3UgaGF2ZSBhbiB1bmtub3duIGRhbmNlIHBhZCBub3QgbGlzdGVkIGJlbG93LCBpdCB3aWxsIG5vdAord29yayBVTkxFU1MgeW91IHNldCAiZHBhZF90b19idXR0b25zIiB0byAxIGluIHRoZSBtb2R1bGUgY29uZmlndXJhdGlvbi4KKworUExFQVNFIGlmIHlvdSBoYXZlIGFuIHVua293biBjb250cm9sbGVyLCBlbWFpbCBEb20gPGJpbmFyeTEyMzBAeWFob28uY29tPiB3aXRoCithIGR1bXAgZnJvbSAvcHJvYy9idXMvdXNiIGFuZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWQgKG1hbnVmYWN0dXJlciwgY291bnRyeSwKK3doZXRoZXIgaXQgaXMgYSBkYW5jZSBwYWQgb3Igbm9ybWFsIGNvbnRyb2xsZXIpIHNvIHRoYXQgd2UgY2FuIGFkZCB5b3VyIHBhZAordG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMsIGVuc3VyaW5nIHRoYXQgaXQgd2lsbCB3b3JrIG91dCBvZiB0aGUKK2JveCBpbiB0aGUgZnV0dXJlLgorCisKIDEuIFVTQiBhZGFwdGVyCiAtLS0tLS0tLS0tLS0tLQogCiBCZWZvcmUgeW91IGNhbiBhY3R1YWxseSB1c2UgdGhlIGRyaXZlciwgeW91IG5lZWQgdG8gZ2V0IHlvdXJzZWxmIGFuCi1hZGFwdGVyIGNhYmxlIHRvIGNvbm5lY3QgdGhlIFgtQm94IGNvbnRyb2xsZXIgdG8geW91ciBMaW51eC1Cb3guCithZGFwdGVyIGNhYmxlIHRvIGNvbm5lY3QgdGhlIFgtQm94IGNvbnRyb2xsZXIgdG8geW91ciBMaW51eC1Cb3guIFlvdQorY2FuIGJ1eSB0aGVzZSBvbmxpbmUgZmFpcmx5IGNoZWFwLCBvciBidWlsZCB5b3VyIG93bi4KIAotU3VjaCBhIGNhYmxlIGlzIHByZXR0eSBlYXN5IHRvIGJ1aWxkLiBUaGUgQ29udHJvbGxlciBpdHNlbGYgaXMgYSBVU0IgY29tcG91bmQKLWRldmljZSAoYSBodWIgd2l0aCB0aHJlZSBwb3J0cyBmb3IgdHdvIGV4cGFuc2lvbiBzbG90cyBhbmQgdGhlIGNvbnRyb2xsZXIKLWRldmljZSkgd2l0aCB0aGUgb25seSBkaWZmZXJlbmNlIGluIGEgbm9uc3RhbmRhcmQgY29ubmVjdG9yICg1IHBpbnMgdnMuIDQgb24KLXN0YW5kYXJkIFVTQiBjb25uZWN0b3IpLgorU3VjaCBhIGNhYmxlIGlzIHByZXR0eSBlYXN5IHRvIGJ1aWxkLiBUaGUgQ29udHJvbGxlciBpdHNlbGYgaXMgYSBVU0IKK2NvbXBvdW5kIGRldmljZSAoYSBodWIgd2l0aCB0aHJlZSBwb3J0cyBmb3IgdHdvIGV4cGFuc2lvbiBzbG90cyBhbmQKK3RoZSBjb250cm9sbGVyIGRldmljZSkgd2l0aCB0aGUgb25seSBkaWZmZXJlbmNlIGluIGEgbm9uc3RhbmRhcmQgY29ubmVjdG9yCisoNSBwaW5zIHZzLiA0IG9uIHN0YW5kYXJkIFVTQiBjb25uZWN0b3IpLgogCiBZb3UganVzdCBuZWVkIHRvIHNvbGRlciBhIFVTQiBjb25uZWN0b3Igb250byB0aGUgY2FibGUgYW5kIGtlZXAgdGhlCiB5ZWxsb3cgd2lyZSB1bmNvbm5lY3RlZC4gVGhlIG90aGVyIHBpbnMgaGF2ZSB0aGUgc2FtZSBvcmRlciBvbiBib3RoCkBAIC01MSwzNiArMTAyLDM2IEBACiB5b3UgY2FuIHN0aWxsIHVzZSB0aGUgY29udHJvbGxlciB3aXRoIHlvdXIgWC1Cb3gsIGlmIHlvdSBoYXZlIG9uZSA7KQogCiAKLTIuIGRyaXZlciBpbnN0YWxsYXRpb24KKzIuIERyaXZlciBJbnN0YWxsYXRpb24KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogT25jZSB5b3UgaGF2ZSB0aGUgYWRhcHRlciBjYWJsZSBhbmQgdGhlIGNvbnRyb2xsZXIgaXMgY29ubmVjdGVkLCB5b3UgbmVlZAogdG8gbG9hZCB5b3VyIFVTQiBzdWJzeXN0ZW0gYW5kIHNob3VsZCBjYXQgL3Byb2MvYnVzL3VzYi9kZXZpY2VzLgogVGhlcmUgc2hvdWxkIGJlIGFuIGVudHJ5IGxpa2UgdGhlIG9uZSBhdCB0aGUgZW5kIFs0XS4KIAotQ3VycmVudGx5IChhcyBvZiB2ZXJzaW9uIDAuMC40KSwgdGhlIGZvbGxvd2luZyB0aHJlZSBkZXZpY2VzIGFyZSBpbmNsdWRlZDoKK0N1cnJlbnRseSAoYXMgb2YgdmVyc2lvbiAwLjAuNiksIHRoZSBmb2xsb3dpbmcgZGV2aWNlcyBhcmUgaW5jbHVkZWQ6CiAgb3JpZ2luYWwgTWljcm9zb2Z0IFhCT1ggY29udHJvbGxlciAoVVMpLCB2ZW5kb3I9MHgwNDVlLCBwcm9kdWN0PTB4MDIwMgorIHNtYWxsZXIgIE1pY3Jvc29mdCBYQk9YIGNvbnRyb2xsZXIgKFVTKSwgdmVuZG9yPTB4MDQ1ZSwgcHJvZHVjdD0weDAyODkKICBvcmlnaW5hbCBNaWNyb3NvZnQgWEJPWCBjb250cm9sbGVyIChKYXBhbiksIHZlbmRvcj0weDA0NWUsIHByb2R1Y3Q9MHgwMjg1CiAgSW50ZXJBY3QgUG93ZXJQYWQgUHJvIChHZXJtYW55KSwgdmVuZG9yPTB4MDVmZCwgcHJvZHVjdD0weDEwN2EKKyBSZWRPY3RhbmUgWGJveCBEYW5jZSBQYWQgKFVTKSwgdmVuZG9yPTB4MGMxMiwgcHJvZHVjdD0weDg4MDkKIAotSWYgeW91IGhhdmUgYW5vdGhlciBjb250cm9sbGVyIHRoYXQgaXMgbm90IGxpc3RlZCBhYm92ZSBhbmQgaXMgbm90IHJlY29nbml6ZWQKLWJ5IHRoZSBkcml2ZXIsIHBsZWFzZSBkcm9wIG1lIGEgbGluZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBpbmZvICh0aGF0IGlzLCBpbmNsdWRlCi10aGUgbmFtZSwgdmVuZG9yIGFuZCBwcm9kdWN0IElELCBhcyB3ZWxsIGFzIHRoZSBjb3VudHJ5IHdoZXJlIHlvdSBib3VnaHQgaXQ7Ci1zZW5kaW5nIHRoZSB3aG9sZSBkdW1wIG91dCBvZiAvcHJvYy9idXMvdXNiL2RldmljZXMgYWxvbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIpLgorVGhlIGRyaXZlciBzaG91bGQgd29yayB3aXRoIHhib3ggcGFkcyBub3QgbGlzdGVkIGFib3ZlIGFzIHdlbGwsIGhvd2V2ZXIKK3lvdSB3aWxsIG5lZWQgdG8gZG8gc29tZXRoaW5nIGV4dHJhIGZvciBkYW5jZSBwYWRzIHRvIHdvcmsuCiAKLUluIHRoZW9yeSwgdGhlIGRyaXZlciBzaG91bGQgd29yayB3aXRoIG90aGVyIGNvbnRyb2xsZXJzIHRoYW4gbWluZQotKEludGVyQWN0IFBvd2VyUGFkIHBybywgYm91Z2h0IGluIEdlcm1hbnkpIGp1c3QgZmluZSwgYnV0IEkgY2Fubm90IHRlc3QgdGhpcwotZm9yIEkgb25seSBoYXZlIHRoaXMgb25lIGNvbnRyb2xsZXIuCitJZiB5b3UgaGF2ZSBhIGNvbnRyb2xsZXIgbm90IGxpc3RlZCBhYm92ZSwgc2VlIDAuMyAtIFVua25vd24gQ29udHJvbGxlcnMKIAogSWYgeW91IGNvbXBpbGVkIGFuZCBpbnN0YWxsZWQgdGhlIGRyaXZlciwgdGVzdCB0aGUgZnVuY3Rpb25hbGl0eToKID4gbW9kcHJvYmUgeHBhZAogPiBtb2Rwcm9iZSBqb3lkZXYKID4ganN0ZXN0IC9kZXYvanMwCiAKLVRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBsaW5lIHNob3dpbmcgMTggaW5wdXRzICg4IGF4ZXMsIDEwIGJ1dHRvbnMpLCBhbmQKLWl0J3MgdmFsdWVzIHNob3VsZCBjaGFuZ2UgaWYgeW91IG1vdmUgdGhlIHN0aWNrcyBhbmQgcHVzaCB0aGUgYnV0dG9ucy4KK0lmIHlvdSdyZSB1c2luZyBhIG5vcm1hbCBjb250cm9sbGVyLCB0aGVyZSBzaG91bGQgYmUgYSBzaW5nbGUgbGluZSBzaG93aW5nCisxOCBpbnB1dHMgKDggYXhlcywgMTAgYnV0dG9ucyksIGFuZCBpdHMgdmFsdWVzIHNob3VsZCBjaGFuZ2UgaWYgeW91IG1vdmUKK3RoZSBzdGlja3MgYW5kIHB1c2ggdGhlIGJ1dHRvbnMuICBJZiB5b3UncmUgdXNpbmcgYSBkYW5jZSBwYWQsIGl0IHNob3VsZAorc2hvdyAyMCBpbnB1dHMgKDYgYXhlcywgMTQgYnV0dG9ucykuCiAKLUl0IHdvcmtzPyBWb2lsYSwgeW91ciBkb25lIDspCitJdCB3b3Jrcz8gVm9pbGEsIHlvdSdyZSBkb25lIDspCiAKIAogMy4gVGhhbmtzCkBAIC0xMTEsNiArMTYyLDIyIEBACiBFOiAgQWQ9ODEoSSkgQXRyPTAzKEludC4pIE14UFM9ICAzMiBJdmw9IDEwbXMKIEU6ICBBZD0wMihPKSBBdHI9MDMoSW50LikgTXhQUz0gIDMyIEl2bD0gMTBtcwogCis1LiAvcHJvYy9idXMvdXNiL2RldmljZXMgLSBkdW1wIGZyb20gUmVkb2N0YW5lIFhib3ggRGFuY2UgUGFkIChVUyk6CisKK1Q6ICBCdXM9MDEgTGV2PTAyIFBybnQ9MDkgUG9ydD0wMCBDbnQ9MDEgRGV2Iz0gMTAgU3BkPTEyICBNeENoPSAwCitEOiAgVmVyPSAxLjEwIENscz0wMCg+aWZjICkgU3ViPTAwIFByb3Q9MDAgTXhQUz0gOCAjQ2Zncz0gIDEKK1A6ICBWZW5kb3I9MGMxMiBQcm9kSUQ9ODgwOSBSZXY9IDAuMDEKK1M6ICBQcm9kdWN0PVhCT1ggRERSCitDOiogI0lmcz0gMSBDZmcjPSAxIEF0cj04MCBNeFB3cj0xMDBtQQorSTogIElmIz0gMCBBbHQ9IDAgI0VQcz0gMiBDbHM9NTgodW5rLiApIFN1Yj00MiBQcm90PTAwIERyaXZlcj14cGFkCitFOiAgQWQ9ODIoSSkgQXRyPTAzKEludC4pIE14UFM9ICAzMiBJdmw9NG1zCitFOiAgQWQ9MDIoTykgQXRyPTAzKEludC4pIE14UFM9ICAzMiBJdmw9NG1zCisKIC0tIAogTWFya28gRnJpZWRlbWFubiA8bWZyQGJteC1jaGVtbml0ei5kZT4KIDIwMDItMDctMTYKKyAtIG9yaWdpbmFsIGRvYworCitEb21pbmljIENlcnF1ZXR0aSA8YmluYXJ5MTIzMEB5YWhvby5jb20+CisyMDA1LTAzLTE5CisgLSBhZGRlZCBzdHVmZiBmb3IgZGFuY2UgcGFkcywgbmV3IGQtcGFkLT5heGVzIG1hcHBpbmdzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L3llYWxpbmsudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC95ZWFsaW5rLnR4dAppbmRleCAwYThjOTdlLi41MzYwZTQzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lucHV0L3llYWxpbmsudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQveWVhbGluay50eHQKQEAgLTEzNCw3ICsxMzQsNyBAQAogICA4ODg4ODg4ODg4ODgKICAgTGludXggUm9ja3MhCiAKLVdyaXRpbmcgdG8gL3N5cy8uLi9saW5lWCB3aWxsIHNldCB0aGUgY29yZXNwb25kaW5nIExDRCBsaW5lLgorV3JpdGluZyB0byAvc3lzLy4uL2xpbmVYIHdpbGwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIExDRCBsaW5lLgogIC0gRXhjZXNzIGNoYXJhY3RlcnMgYXJlIGlnbm9yZWQuCiAgLSBJZiBsZXNzIGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhhbiBhbGxvd2VkLCB0aGUgcmVtYWluaW5nIGRpZ2l0cyBhcmUKICAgIHVuY2hhbmdlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwtbnVtYmVyLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwtbnVtYmVyLnR4dAppbmRleCBlZGMwNGQ3Li41YThiZDViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lvY3RsLW51bWJlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0CkBAIC0xOTEsMyArMTkxLDUgQEAKIAkJCQkJPG1haWx0bzphaGVycm1hbkBkZS5pYm0uY29tPgogMHhGMwkwMC0zRgl2aWRlby9zaXNmYi5oCQlzaXNmYiAoaW4gZGV2ZWxvcG1lbnQpCiAJCQkJCTxtYWlsdG86dGhvbWFzQHdpbmlzY2hob2Zlci5uZXQ+CisweEY0CTAwLTFGCXZpZGVvL21ieGZiLmgJCW1ieGZiCisJCQkJCTxtYWlsdG86cmFwaEA4ZC5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2Nkcm9tLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CmluZGV4IDhlYzMyY2MuLjYyZDRhZjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwvY2Ryb20udHh0CkBAIC03MzUsNyArNzM1LDcgQEAKIAkgICAgT2ssIHRoaXMgaXMgd2hlcmUgcHJvYmxlbXMgc3RhcnQuICBUaGUgY3VycmVudCBpbnRlcmZhY2UgZm9yCiAJICAgIHRoZSBDRFJPTV9ESVNDX1NUQVRVUyBpb2N0bCBpcyBmbGF3ZWQuICBJdCBtYWtlcyB0aGUgZmFsc2UKIAkgICAgYXNzdW1wdGlvbiB0aGF0IENEcyBhcmUgYWxsIENEU19EQVRBXzEgb3IgYWxsIENEU19BVURJTywgZXRjLgotCSAgICBVbmZvcnR1bmF0bHksIHdoaWxlIHRoaXMgaXMgb2Z0ZW4gdGhlIGNhc2UsIGl0IGlzIGFsc28KKwkgICAgVW5mb3J0dW5hdGVseSwgd2hpbGUgdGhpcyBpcyBvZnRlbiB0aGUgY2FzZSwgaXQgaXMgYWxzbwogCSAgICB2ZXJ5IGNvbW1vbiBmb3IgQ0RzIHRvIGhhdmUgc29tZSB0cmFja3Mgd2l0aCBkYXRhLCBhbmQgc29tZQogCSAgICB0cmFja3Mgd2l0aCBhdWRpby4JSnVzdCBiZWNhdXNlIEkgZmVlbCBsaWtlIGl0LCBJIGRlY2xhcmUKIAkgICAgdGhlIGZvbGxvd2luZyB0byBiZSB0aGUgYmVzdCB3YXkgdG8gY29wZS4gIElmIHRoZSBDRCBoYXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtZGVjb2RpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1kZWNvZGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkZjdmMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtZGVjb2RpbmcudHh0CkBAIC0wLDAgKzEsMjQgQEAKK1RvIGRlY29kZSBhIGhleCBJT0NUTCBjb2RlOgorCitNb3N0IGFyY2hpdGVjdXJlcyB1c2UgdGhpcyBnZW5lcmljIGZvcm1hdCwgYnV0IGNoZWNrCitpbmNsdWRlL0FSQ0gvaW9jdGwuaCBmb3Igc3BlY2lmaWNzLCBlLmcuIHBvd2VycGMKK3VzZXMgMyBiaXRzIHRvIGVuY29kZSByZWFkL3dyaXRlIGFuZCAxMyBiaXRzIGZvciBzaXplLgorCisgYml0cyAgICBtZWFuaW5nCisgMzEtMzAJMDAgLSBubyBwYXJhbWV0ZXJzOiB1c2VzIF9JTyBtYWNybworCTEwIC0gcmVhZDogX0lPUgorCTAxIC0gd3JpdGU6IF9JT1cKKwkxMSAtIHJlYWQvd3JpdGU6IF9JT1dSCisKKyAyOS0xNglzaXplIG9mIGFyZ3VtZW50cworCisgMTUtOAlhc2NpaSBjaGFyYWN0ZXIgc3VwcG9zZWRseQorCXVuaXF1ZSB0byBlYWNoIGRyaXZlcgorCisgNy0wCWZ1bmN0aW9uICMKKworCisgU28gZm9yIGV4YW1wbGUgMHg4MjE4NzIwMSBpcyBhIHJlYWQgd2l0aCBhcmcgbGVuZ3RoIG9mIDB4MjE4LAorY2hhcmFjdGVyICdyJyBmdW5jdGlvbiAxLiBHcmVwcGluZyB0aGUgc291cmNlIHJldmVhbHMgdGhpcyBpczoKKworI2RlZmluZSBWRkFUX0lPQ1RMX1JFQURESVJfQk9USCAgICAgICAgIF9JT1IoJ3InLCAxLCBzdHJ1Y3QgZGlyZW50IFsyXSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQKaW5kZXggMTI1MDkzYy4uNTM2ZDViZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQKQEAgLTI5LDcgKzI5LDcgQEAKIAogY29uZmlnIE1PRFZFUlNJT05TCiAJYm9vbCAiU2V0IHZlcnNpb24gaW5mb3JtYXRpb24gb24gYWxsIG1vZHVsZSBzeW1ib2xzIgotCWRlcGVuZHMgTU9EVUxFUworCWRlcGVuZHMgb24gTU9EVUxFUwogCWhlbHAKIAkgIFVzdWFsbHksIG1vZHVsZXMgaGF2ZSB0byBiZSByZWNvbXBpbGVkIHdoZW5ldmVyIHlvdSBzd2l0Y2ggdG8gYSBuZXcKIAkgIGtlcm5lbC4gIC4uLgpAQCAtMTYzLDcgKzE2Myw3IEBACiBpdCBjYW4gYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHk6CiAKIG1lbnUgIk5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBORVQKKwlkZXBlbmRzIG9uIE5FVAogCiBjb25maWcgTkVUREVWSUNFUwogCS4uLgpAQCAtMTg4LDEwICsxODgsMTAgQEAKIAogY29uZmlnIE1PRFZFUlNJT05TCiAJYm9vbCAiU2V0IHZlcnNpb24gaW5mb3JtYXRpb24gb24gYWxsIG1vZHVsZSBzeW1ib2xzIgotCWRlcGVuZHMgTU9EVUxFUworCWRlcGVuZHMgb24gTU9EVUxFUwogCiBjb21tZW50ICJtb2R1bGUgc3VwcG9ydCBkaXNhYmxlZCIKLQlkZXBlbmRzICFNT0RVTEVTCisJZGVwZW5kcyBvbiAhTU9EVUxFUwogCiBNT0RWRVJTSU9OUyBkaXJlY3RseSBkZXBlbmRzIG9uIE1PRFVMRVMsIHRoaXMgbWVhbnMgaXQncyBvbmx5IHZpc2libGUgaWYKIE1PRFVMRVMgaXMgZGlmZmVyZW50IGZyb20gJ24nLiBUaGUgY29tbWVudCBvbiB0aGUgb3RoZXIgaGFuZCBpcyBhbHdheXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CmluZGV4IDUwZjRlZGQuLjRiM2Q2NzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dApAQCAtMjI3LDkgKzIyNyw5IEBACiAJYmUgaW5jbHVkZWQgaW4gYSBsaWJyYXJ5LCBsaWIuYS4KIAlBbGwgb2JqZWN0cyBsaXN0ZWQgd2l0aCBsaWIteSBhcmUgY29tYmluZWQgaW4gYSBzaW5nbGUKIAlsaWJyYXJ5IGZvciB0aGF0IGRpcmVjdG9yeS4KLQlPYmplY3RzIHRoYXQgYXJlIGxpc3RlZCBpbiBvYmoteSBhbmQgYWRkaXRpb25hbHkgbGlzdGVkIGluCi0JbGliLXkgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnksIHNpbmNlIHRoZXkgd2lsbCBhbnl3YXkKLQliZSBhY2Nlc3NpYmxlLgorCU9iamVjdHMgdGhhdCBhcmUgbGlzdGVkIGluIG9iai15IGFuZCBhZGRpdGlvbmFsbHkgbGlzdGVkIGluCisJbGliLXkgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnksIHNpbmNlIHRoZXkgd2lsbAorCWJlIGFjY2Vzc2libGUgYW55d2F5LgogCUZvciBjb25zaXN0ZW5jeSwgb2JqZWN0cyBsaXN0ZWQgaW4gbGliLW0gd2lsbCBiZSBpbmNsdWRlZCBpbiBsaWIuYS4KIAogCU5vdGUgdGhhdCB0aGUgc2FtZSBrYnVpbGQgbWFrZWZpbGUgbWF5IGxpc3QgZmlsZXMgdG8gYmUgYnVpbHQtaW4KQEAgLTUzNSw3ICs1MzUsNyBAQAogCUhvc3QgcHJvZ3JhbXMgY2FuIGJlIG1hZGUgdXAgYmFzZWQgb24gY29tcG9zaXRlIG9iamVjdHMuCiAJVGhlIHN5bnRheCB1c2VkIHRvIGRlZmluZSBjb21wb3NpdGUgb2JqZWN0cyBmb3IgaG9zdCBwcm9ncmFtcyBpcwogCXNpbWlsYXIgdG8gdGhlIHN5bnRheCB1c2VkIGZvciBrZXJuZWwgb2JqZWN0cy4KLQkkKDxleGVjdXRlYWJsZT4tb2JqcykgbGlzdHMgYWxsIG9iamVjdHMgdXNlZCB0byBsaW5rIHRoZSBmaW5hbAorCSQoPGV4ZWN1dGFibGU+LW9ianMpIGxpc3RzIGFsbCBvYmplY3RzIHVzZWQgdG8gbGluayB0aGUgZmluYWwKIAlleGVjdXRhYmxlLgogCiAJRXhhbXBsZToKQEAgLTEwMjIsNyArMTAyMiw3IEBACiAJSW4gdGhpcyBleGFtcGxlLCB0aGVyZSBhcmUgdHdvIHBvc3NpYmxlIHRhcmdldHMsIHJlcXVpcmluZyBkaWZmZXJlbnQKIAlvcHRpb25zIHRvIHRoZSBsaW5rZXIuIFRoZSBsaW5rZXIgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZQogCUxERkxBR1NfJEAgc3ludGF4IC0gb25lIGZvciBlYWNoIHBvdGVudGlhbCB0YXJnZXQuCi0JJCh0YXJnZXRzKSBhcmUgYXNzaW5nZWQgYWxsIHBvdGVudGlhbCB0YXJnZXRzLCBieSB3aGljaCBrYnVpbGQga25vd3MKKwkkKHRhcmdldHMpIGFyZSBhc3NpZ25lZCBhbGwgcG90ZW50aWFsIHRhcmdldHMsIGJ5IHdoaWNoIGtidWlsZCBrbm93cwogCXRoZSB0YXJnZXRzIGFuZCB3aWxsOgogCQkxKSBjaGVjayBmb3IgY29tbWFuZGxpbmUgY2hhbmdlcwogCQkyKSBkZWxldGUgdGFyZ2V0IGR1cmluZyBtYWtlIGNsZWFuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQKaW5kZXggYzY1MjMzZC4uMjg0ZTdlMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dApAQCAtMTcsNyArMTcsNyBAQAogICBzcGVjaWFsIHBsYWNlLWhvbGRlcnMgZm9yIHdoZXJlIHRoZSBleHRyYWN0ZWQgZG9jdW1lbnRhdGlvbiBzaG91bGQKICAgZ28uCiAKLS0gc2NyaXB0cy9kb2Nwcm9jLmMKKy0gc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKIAogICBUaGlzIGlzIGEgcHJvZ3JhbSBmb3IgY29udmVydGluZyBTR01MIHRlbXBsYXRlIGZpbGVzIGludG8gU0dNTAogICBmaWxlcy4gV2hlbiBhIGZpbGUgaXMgcmVmZXJlbmNlZCBpdCBpcyBzZWFyY2hlZCBmb3Igc3ltYm9scwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCBmZjU3MWY5Li5lZjY5Yzc1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMTY0LDYgKzE2NCwxMCBAQAogCWFjcGlfc2tpcF90aW1lcl9vdmVycmlkZSBbSFcsQUNQSV0KIAkJCVJlY29nbml6ZSBhbmQgaWdub3JlIElSUTAvcGluMiBJbnRlcnJ1cHQgT3ZlcnJpZGUuCiAJCQlGb3IgYnJva2VuIG5Gb3JjZTIgQklPUyByZXN1bHRpbmcgaW4gWFQtUElDIHRpbWVyLgorCWFjcGlfdXNlX3RpbWVyX292ZXJyaWRlIFtIVyxBQ1BJfQorCQkJVXNlIHRpbWVyIG92ZXJyaWRlLiBGb3Igc29tZSBicm9rZW4gTnZpZGlhIE5GNSBib2FyZHMKKwkJCXRoYXQgcmVxdWlyZSBhIHRpbWVyIG92ZXJyaWRlLCBidXQgZG9uJ3QgaGF2ZQorCQkJSFBFVAogCiAJYWNwaV9kYmdfbGF5ZXI9CVtIVyxBQ1BJXQogCQkJRm9ybWF0OiA8aW50PgpAQCAtNTQ0LDYgKzU0OCwxMyBAQAogCWV1cndkdD0JCVtIVyxXRFRdIEV1cm90ZWNoIENQVS0xMjIwLzE0MTAgb25ib2FyZCB3YXRjaGRvZy4KIAkJCUZvcm1hdDogPGlvPlssPGlycT5dCiAKKwlmYWlsc2xhYj0KKwlmYWlsX3BhZ2VfYWxsb2M9CisJZmFpbF9tYWtlX3JlcXVlc3Q9W0tOTF0KKwkJCUdlbmVyYWwgZmF1bHQgaW5qZWN0aW9uIG1lY2hhbmlzbS4KKwkJCUZvcm1hdDogPGludGVydmFsPiw8cHJvYmFiaWxpdHk+LDxzcGFjZT4sPHRpbWVzPgorCQkJU2VlIGFsc28gL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uLy4KKwogCWZkX21jcz0JCVtIVyxTQ1NJXQogCQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL3Njc2kvZmRfbWNzLmMuCiAKQEAgLTU1Myw5ICs1NjQsNiBAQAogCWZsb3BweT0JCVtIV10KIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Zsb3BweS50eHQuCiAKLQlmdGFwZT0JCVtIV10gRmxvcHB5IFRhcGUgc3Vic3lzdGVtIGRlYnVnZ2luZyBvcHRpb25zLgotCQkJU2VlIERvY3VtZW50YXRpb24vZnRhcGUudHh0LgotCiAJZ2FtZWNvbi5tYXBbMnwzXT0KIAkJCVtIVyxKT1ldIE11bHRpc3lzdGVtIGpveXN0aWNrIGFuZCBORVMvU05FUy9QU1ggcGFkCiAJCQlzdXBwb3J0IHZpYSBwYXJhbGxlbCBwb3J0ICh1cCB0byA1IGRldmljZXMgcGVyIHBvcnQpCkBAIC01OTgsOCArNjA2LDYgQEAKIAogCWh1Z2VwYWdlcz0JW0hXLElBLTMyLElBLTY0XSBNYXhpbWFsIG51bWJlciBvZiBIdWdlVExCIHBhZ2VzLgogCi0Jbm9pcnFiYWxhbmNlCVtJQS0zMixTTVAsS05MXSBEaXNhYmxlIGtlcm5lbCBpcnEgYmFsYW5jaW5nCi0KIAlpODA0Mi5kaXJlY3QJW0hXXSBQdXQga2V5Ym9hcmQgcG9ydCBpbnRvIG5vbi10cmFuc2xhdGVkIG1vZGUKIAlpODA0Mi5kdW1ia2JkCVtIV10gUHJldGVuZCB0aGF0IGNvbnRyb2xsZXIgY2FuIG9ubHkgcmVhZCBkYXRhIGZyb20KIAkJCSAgICAga2V5Ym9hcmQgYW5kIGNhbm5vdCBjb250cm9sIGl0cyBzdGF0ZQpAQCAtNjQ5LDYgKzY1NSwxMCBAQAogCWlkbGU9CQlbSFddCiAJCQlGb3JtYXQ6IGlkbGU9cG9sbCBvciBpZGxlPWhhbHQKIAorCWlnbm9yZV9sb2dsZXZlbAlbS05MXQorCQkJSWdub3JlIGxvZ2xldmVsIHNldHRpbmcgLSB0aGlzIHdpbGwgcHJpbnQgL2FsbC8KKwkJCWtlcm5lbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKIAlpaGFzaF9lbnRyaWVzPQlbS05MXQogCQkJU2V0IG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIGlub2RlIGNhY2hlLgogCkBAIC03MTMsNyArNzIzLDEyIEBACiAJCQlGb3JtYXQ6IDxSRFA+LDxyZXNldD4sPHBjaV9zY2FuPiw8dmVyYm9zaXR5PgogCiAJaXNvbGNwdXM9CVtLTkwsU01QXSBJc29sYXRlIENQVXMgZnJvbSB0aGUgZ2VuZXJhbCBzY2hlZHVsZXIuCi0JCQlGb3JtYXQ6IDxjcHUgbnVtYmVyPiwuLi4sPGNwdSBudW1iZXI+CisJCQlGb3JtYXQ6CisJCQk8Y3B1IG51bWJlcj4sLi4uLDxjcHUgbnVtYmVyPgorCQkJb3IKKwkJCTxjcHUgbnVtYmVyPi08Y3B1IG51bWJlcj4gIChtdXN0IGJlIGEgcG9zaXRpdmUgcmFuZ2UgaW4gYXNjZW5kaW5nIG9yZGVyKQorCQkJb3IgYSBtaXh0dXJlCisJCQk8Y3B1IG51bWJlcj4sLi4uLDxjcHUgbnVtYmVyPi08Y3B1IG51bWJlcj4KIAkJCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgQ1BVcwogCQkJdG8gaXNvbGF0ZSBmcm9tIHRoZSBnZW5lcmFsIFNNUCBiYWxhbmNpbmcgYW5kIHNjaGVkdWxpbmcKIAkJCWFsZ29yaXRobXMuIFRoZSBvbmx5IHdheSB0byBtb3ZlIGEgcHJvY2VzcyBvbnRvIG9yIG9mZgpAQCAtMTAxMSw2ICsxMDI2LDEwIEBACiAJCQllbXVsYXRpb24gbGlicmFyeSBldmVuIGlmIGEgMzg3IG1hdGhzIGNvcHJvY2Vzc29yCiAJCQlpcyBwcmVzZW50LgogCisJbm9hbGllbmNhY2hlCVtNTSwgTlVNQV0gRGlzYWJsZXMgdGhlIGFsbGNvYXRpb24gb2YgYWxpZW4gY2FjaGVzIGluCisJCQl0aGUgc2xhYiBhbGxvY2F0b3IuICBTYXZlcyBwZXItbm9kZSBtZW1vcnksIGJ1dCB3aWxsCisJCQlpbXBhY3QgcGVyZm9ybWFuY2Ugb24gcmVhbCBOVU1BIGhhcmR3YXJlLgorCiAJbm9hbGlnbgkJW0tOTCxBUk1dCiAKIAlub2FwaWMJCVtTTVAsQVBJQ10gVGVsbHMgdGhlIGtlcm5lbCB0byBub3QgbWFrZSB1c2Ugb2YgYW55CkBAIC0xMDUxLDkgKzEwNzAsMTQgQEAKIAkJCWluIGNlcnRhaW4gZW52aXJvbm1lbnRzIHN1Y2ggYXMgbmV0d29ya2VkIHNlcnZlcnMgb3IKIAkJCXJlYWwtdGltZSBzeXN0ZW1zLgogCisJbm9pcnFiYWxhbmNlCVtJQS0zMixTTVAsS05MXSBEaXNhYmxlIGtlcm5lbCBpcnEgYmFsYW5jaW5nCisKIAlub2lycWRlYnVnCVtJQS0zMl0gRGlzYWJsZXMgdGhlIGNvZGUgd2hpY2ggYXR0ZW1wdHMgdG8gZGV0ZWN0IGFuZAogCQkJZGlzYWJsZSB1bmhhbmRsZWQgaW50ZXJydXB0IHNvdXJjZXMuCiAKKwlub190aW1lcl9jaGVjawlbSUEtMzIsWDg2XzY0LEFQSUNdIERpc2FibGVzIHRoZSBjb2RlIHdoaWNoIHRlc3RzIGZvcgorCQkJYnJva2VuIHRpbWVyIElSUSBzb3VyY2VzLgorCiAJbm9pc2FwbnAJW0lTQVBOUF0gRGlzYWJsZXMgSVNBIFBuUCBjb2RlLgogCiAJbm9pbml0cmQJW1JBTV0gVGVsbHMgdGhlIGtlcm5lbCBub3QgdG8gbG9hZCBhbnkgY29uZmlndXJlZApAQCAtMTIzMSw2ICsxMjU1LDExIEBACiAJCQkJbWFjaGluZSBjaGVjayB3aGVuIHNvbWUgZGV2aWNlcycgY29uZmlnIHNwYWNlCiAJCQkJaXMgcmVhZC4gQnV0IHZhcmlvdXMgd29ya2Fyb3VuZHMgYXJlIGRpc2FibGVkCiAJCQkJYW5kIHNvbWUgSU9NTVUgZHJpdmVycyB3aWxsIG5vdCB3b3JrLgorCQliZnNvcnQJCVNvcnQgUENJIGRldmljZXMgaW50byBicmVhZHRoLWZpcnN0IG9yZGVyLgorCQkJCVRoaXMgc29ydGluZyBpcyBkb25lIHRvIGdldCBhIGRldmljZQorCQkJCW9yZGVyIGNvbXBhdGlibGUgd2l0aCBvbGRlciAoPD0gMi40KSBrZXJuZWxzLgorCQlub2Jmc29ydAlEb24ndCBzb3J0IFBDSSBkZXZpY2VzIGludG8gYnJlYWR0aC1maXJzdCBvcmRlci4KKwogCXBjbXY9CQlbSFcsUENNQ0lBXSBCYWRnZVBBRCA0CiAKIAlwZC4JCVtQQVJJREVdCkBAIC0xMjc5LDYgKzEzMDgsNyBAQAogCQkJUGFyYW06ICJzY2hlZHVsZSIgLSBwcm9maWxlIHNjaGVkdWxlIHBvaW50cy4KIAkJCVBhcmFtOiA8bnVtYmVyPiAtIHN0ZXAvYnVja2V0IHNpemUgYXMgYSBwb3dlciBvZiAyIGZvcgogCQkJCXN0YXRpc3RpY2FsIHRpbWUgYmFzZWQgcHJvZmlsaW5nLgorCQkJUGFyYW06ICJzbGVlcCIgLSBwcm9maWxlIEQtc3RhdGUgc2xlZXBpbmcgKG1pbGxpc2VjcykKIAogCXByb2Nlc3Nvci5tYXhfY3N0YXRlPQlbSFcsQUNQSV0KIAkJCUxpbWl0IHByb2Nlc3NvciB0byBtYXhpbXVtIEMtc3RhdGUKQEAgLTEzNjAsNiArMTM5MCwxMiBAQAogCXJlc3VtZT0JCVtTV1NVU1BdCiAJCQlTcGVjaWZ5IHRoZSBwYXJ0aXRpb24gZGV2aWNlIGZvciBzb2Z0d2FyZSBzdXNwZW5kCiAKKwlyZXN1bWVfb2Zmc2V0PQlbU1dTVVNQXQorCQkJU3BlY2lmeSB0aGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFydGl0aW9uCisJCQlnaXZlbiBieSAicmVzdW1lPSIgYXQgd2hpY2ggdGhlIHN3YXAgaGVhZGVyIGlzIGxvY2F0ZWQsCisJCQlpbiA8UEFHRV9TSVpFPiB1bml0cyAobmVlZGVkIG9ubHkgZm9yIHN3YXAgZmlsZXMpLgorCQkJU2VlICBEb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC1hbmQtc3dhcC1maWxlcy50eHQKKwogCXJoYXNoX2VudHJpZXM9CVtLTkwsTkVUXQogCQkJU2V0IG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIHJvdXRlIGNhY2hlCiAKQEAgLTE0MTAsNiArMTQ0NiwxMSBAQAogCiAJc2NzaV9sb2dnaW5nPQlbU0NTSV0KIAorCXNjc2lfbW9kLnNjYW49CVtTQ1NJXSBzeW5jIChkZWZhdWx0KSBzY2FucyBTQ1NJIGJ1c3NlcyBhcyB0aGV5IGFyZQorCQkJZGlzY292ZXJlZC4gIGFzeW5jIHNjYW5zIHRoZW0gaW4ga2VybmVsIHRocmVhZHMsCisJCQlhbGxvd2luZyBib290IHRvIHByb2NlZWQuICBub25lIGlnbm9yZXMgdGhlbSwgZXhwZWN0aW5nCisJCQl1c2VyIHNwYWNlIHRvIGRvIHRoZSBzY2FuLgorCiAJc2VsaW51eAkJW1NFTElOVVhdIERpc2FibGUgb3IgZW5hYmxlIFNFTGludXggYXQgYm9vdCB0aW1lLgogCQkJRm9ybWF0OiB7ICIwIiB8ICIxIiB9CiAJCQlTZWUgc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnIGhlbHAgdGV4dC4KQEAgLTE2MTUsNiArMTY1NiwxMiBAQAogCXN5bTUzYzQxNj0JW0hXLFNDU0ldCiAJCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS9zeW01M2M0MTYuYy4KIAorCXN5c3JxX2Fsd2F5c19lbmFibGVkCisJCQlbS05MXQorCQkJSWdub3JlIHN5c3JxIHNldHRpbmcgLSB0aGlzIGJvb3QgcGFyYW1ldGVyIHdpbGwKKwkJCW5ldXRyYWxpemUgYW55IGVmZmVjdCBvZiAvcHJvYy9zeXMva2VybmVsL3N5c3JxLgorCQkJVXNlZnVsIGZvciBkZWJ1Z2dpbmcuCisKIAl0MTI4PQkJW0hXLFNDU0ldCiAJCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS90MTI4LmMuCiAKQEAgLTE3MjEsNiArMTc2OCw5IEBACiAJbm9yYW5kbWFwcwlEb24ndCB1c2UgYWRkcmVzcyBzcGFjZSByYW5kb21pemF0aW9uCiAJCQlFcXVpdmFsZW50IHRvIGVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvcmFuZG9taXplX3ZhX3NwYWNlCiAKKyAJdW53aW5kX2RlYnVnPU4gCU4gPiAwIHdpbGwgZW5hYmxlIGR3YXJmMiB1bndpbmRlciBkZWJ1Z2dpbmcKKwkJCVRoaXMgaXMgdXNlZnVsIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uIHdoeQorCQkJeW91IGdvdCBhICJkd2FyZjIgdW53aW5kZXIgc3R1Y2siCiAKIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dCBiL0RvY3VtZW50YXRpb24va2V5cy50eHQKaW5kZXggM2RhNTg2Yi4uNjBjNjY1ZDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2V5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dApAQCAtMzA0LDcgKzMwNCw3IEBACiAJUglSZXZva2VkCiAJRAlEZWFkCiAJUQlDb250cmlidXRlcyB0byB1c2VyJ3MgcXVvdGEKLQlVCVVuZGVyIGNvbnRydWN0aW9uIGJ5IGNhbGxiYWNrIHRvIHVzZXJzcGFjZQorCVUJVW5kZXIgY29uc3RydWN0aW9uIGJ5IGNhbGxiYWNrIHRvIHVzZXJzcGFjZQogCU4JTmVnYXRpdmUga2V5CiAKICAgICAgVGhpcyBmaWxlIG11c3QgYmUgZW5hYmxlZCBhdCBrZXJuZWwgY29uZmlndXJhdGlvbiB0aW1lIGFzIGl0IGFsbG93cyBhbnlvbmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CmluZGV4IGJhMjYyMDEuLmQ3MWZhZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dApAQCAtNDQyLDkgKzQ0MiwxMCBAQAogCWtwLmZhdWx0X2hhbmRsZXIgPSBoYW5kbGVyX2ZhdWx0OwogCWtwLnN5bWJvbF9uYW1lID0gImRvX2ZvcmsiOwogCi0JaWYgKChyZXQgPSByZWdpc3Rlcl9rcHJvYmUoJmtwKSA8IDApKSB7CisJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZrcCk7CisJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKCJyZWdpc3Rlcl9rcHJvYmUgZmFpbGVkLCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gcmV0OwogCX0KIAlwcmludGsoImtwcm9iZSByZWdpc3RlcmVkXG4iKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGFwdG9wLW1vZGUudHh0IGIvRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQKaW5kZXggYzQ4NzE4Ni4uNmY2MzllMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQKQEAgLTEyMSw3ICsxMjEsNyBAQAogTUFYX0FHRToKIAogTWF4aW11bSB0aW1lLCBpbiBzZWNvbmRzLCBvZiBoYXJkIGRyaXZlIHNwaW5kb3duIHRpbWUgdGhhdCB5b3UgYXJlCi1jb25mb3J0YWJsZSB3aXRoLiBXb3JzdCBjYXNlLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91IGNvdWxkIGxvc2UgdGhpcworY29tZm9ydGFibGUgd2l0aC4gV29yc3QgY2FzZSwgaXQncyBwb3NzaWJsZSB0aGF0IHlvdSBjb3VsZCBsb3NlIHRoaXMKIGFtb3VudCBvZiB3b3JrIGlmIHlvdXIgYmF0dGVyeSBmYWlscyB3aGlsZSB5b3UncmUgaW4gbGFwdG9wIG1vZGUuCiAKIE1JTklNVU1fQkFUVEVSWV9NSU5VVEVTOgpAQCAtMjM1LDcgKzIzNSw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tQ09ORklHIEZJTEUgQkVHSU4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIE1heGltdW0gdGltZSwgaW4gc2Vjb25kcywgb2YgaGFyZCBkcml2ZSBzcGluZG93biB0aW1lIHRoYXQgeW91IGFyZQotIyBjb25mb3J0YWJsZSB3aXRoLiBXb3JzdCBjYXNlLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91IGNvdWxkIGxvc2UgdGhpcworIyBjb21mb3J0YWJsZSB3aXRoLiBXb3JzdCBjYXNlLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91IGNvdWxkIGxvc2UgdGhpcwogIyBhbW91bnQgb2Ygd29yayBpZiB5b3VyIGJhdHRlcnkgZmFpbHMgeW91IHdoaWxlIGluIGxhcHRvcCBtb2RlLgogI01BWF9BR0U9NjAwCiAKQEAgLTM1MCw3ICszNTAsNyBAQAogIyBzZXQgZGVmYXVsdHMgaW5zdGVhZDoKIAogIyBNYXhpbXVtIHRpbWUsIGluIHNlY29uZHMsIG9mIGhhcmQgZHJpdmUgc3BpbmRvd24gdGltZSB0aGF0IHlvdSBhcmUKLSMgY29uZm9ydGFibGUgd2l0aC4gV29yc3QgY2FzZSwgaXQncyBwb3NzaWJsZSB0aGF0IHlvdSBjb3VsZCBsb3NlIHRoaXMKKyMgY29tZm9ydGFibGUgd2l0aC4gV29yc3QgY2FzZSwgaXQncyBwb3NzaWJsZSB0aGF0IHlvdSBjb3VsZCBsb3NlIHRoaXMKICMgYW1vdW50IG9mIHdvcmsgaWYgeW91ciBiYXR0ZXJ5IGZhaWxzIHlvdSB3aGlsZSBpbiBsYXB0b3AgbW9kZS4KIE1BWF9BR0U9JHtNQVhfQUdFOi0nNjAwJ30KIApAQCAtNjk5LDcgKzY5OSw3IEBACiBEYXggS2Vsc29uIHN1Ym1pdHRlZCB0aGlzIHNvIHRoYXQgdGhlIEFDUEkgYWNwaWQgZGFlbW9uIHdpbGwKIGtpY2sgb2ZmIHRoZSBsYXB0b3BfbW9kZSBzY3JpcHQgYW5kIHJ1biBoZHBhcm0uIFRoZSBwYXJ0IHRoYXQKIGF1dG9tYXRpY2FsbHkgZGlzYWJsZXMgbGFwdG9wIG1vZGUgd2hlbiB0aGUgYmF0dGVyeSBpcyBsb3cgd2FzCi13cml0ZW4gYnkgSmFuIFRvcGluc2tpLgord3JpdHRlbiBieSBKYW4gVG9waW5za2kuCiAKIC0tLS0tLS0tLS0tLS0tLS0tL2V0Yy9hY3BpL2V2ZW50cy9hY19hZGFwdGVyIEJFR0lOLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBldmVudD1hY19hZGFwdGVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQgYi9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKaW5kZXggOTk0MzU1Yi4uNTg0MDhkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dApAQCAtMjEyLDcgKzIxMiw3IEBACiAKIAlTVE9SRSAqWCA9IGMsIGQgPSBMT0FEICpYCiAKLSAgICAgKExvYWRzIGFuZCBzdG9yZXMgb3ZlcmxhcCBpZiB0aGV5IGFyZSB0YXJnZXR0ZWQgYXQgb3ZlcmxhcHBpbmcgcGllY2VzIG9mCisgICAgIChMb2FkcyBhbmQgc3RvcmVzIG92ZXJsYXAgaWYgdGhleSBhcmUgdGFyZ2V0ZWQgYXQgb3ZlcmxhcHBpbmcgcGllY2VzIG9mCiAgICAgIG1lbW9yeSkuCiAKIEFuZCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgdGhpbmdzIHRoYXQgX211c3RfIG9yIF9tdXN0X25vdF8gYmUgYXNzdW1lZDoKQEAgLTEwMTYsNyArMTAxNiw3IEBACiAKICAoKikgc2V0X21iKHZhciwgdmFsdWUpCiAKLSAgICAgVGhpcyBhc3NpZ25zIHRoZSB2YWx1ZSB0byB0aGUgdmFyaWFibGUgYW5kIHRoZW4gaW5zZXJ0cyBhdCBsZWFzdCBhIHdyaXRlCisgICAgIFRoaXMgYXNzaWducyB0aGUgdmFsdWUgdG8gdGhlIHZhcmlhYmxlIGFuZCB0aGVuIGluc2VydHMgYSBmdWxsIG1lbW9yeQogICAgICBiYXJyaWVyIGFmdGVyIGl0LCBkZXBlbmRpbmcgb24gdGhlIGZ1bmN0aW9uLiAgSXQgaXNuJ3QgZ3VhcmFudGVlZCB0bwogICAgICBpbnNlcnQgYW55dGhpbmcgbW9yZSB0aGFuIGEgY29tcGlsZXIgYmFycmllciBpbiBhIFVQIGNvbXBpbGF0aW9uLgogCkBAIC0xODk4LDcgKzE4OTgsNyBAQAogCXNtcF93bWIoKTsKIAk8QTptb2RpZnkgdj0yPgk8QzpidXN5PgogCQkJPEM6cXVldWUgdj0yPgotCXAgPSAmYjsJCXEgPSBwOworCXAgPSAmdjsJCXEgPSBwOwogCQkJPEQ6cmVxdWVzdCBwPgogCTxCOm1vZGlmeSBwPSZ2Pgk8RDpjb21taXQgcD0mdj4KIAkJICAJPEQ6cmVhZCBwPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9taXBzL3RpbWUuUkVBRE1FIGIvRG9jdW1lbnRhdGlvbi9taXBzL3RpbWUuUkVBRE1FCmluZGV4IDY5ZGRjNWMuLmE0Y2U2MDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWlwcy90aW1lLlJFQURNRQorKysgYi9Eb2N1bWVudGF0aW9uL21pcHMvdGltZS5SRUFETUUKQEAgLTM4LDE5ICszOCwxNCBAQAogCiAgIGEpIEltcGxlbWVudHMgZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IExpbnV4IGNvbW1vbiBjb2RlOgogCXRpbWVfaW5pdAotCWRvX2dldHRpbWVvZmRheQotCWRvX3NldHRpbWVvZmRheQogCiAgIGIpIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIG9mIFJUQyBhbmQgbnVsbCBSVEMgaW1wbGVtZW50YXRpb24gYXMgZGVmYXVsdC4KIAlleHRlcm4gdW5zaWduZWQgbG9uZyAoKnJ0Y19nZXRfdGltZSkodm9pZCk7CiAJZXh0ZXJuIGludCAoKnJ0Y19zZXRfdGltZSkodW5zaWduZWQgbG9uZyk7CiAKLSAgYykgYSBzZXQgb2YgZ2V0dGltZW9mZnNldCBmdW5jdGlvbnMgZm9yIGRpZmZlcmVudCBDUFVzIGFuZCBkaWZmZXJlbnQKLSAgICAgbmVlZHMuCi0KLSAgZCkgaGlnaC1sZXZlbCBhbmQgbG93LWxldmVsIHRpbWVyIGludGVycnVwdCByb3V0aW5lcyB3aGVyZSB0aGUgdGltZXIgCi0gICAgIGludGVycnVwdCBzb3VyY2UgIG1heSBvciBtYXkgbm90IGJlIHRoZSBDUFUgdGltZXIuICBUaGUgaGlnaC1sZXZlbCAKLSAgICAgcm91dGluZSBpcyBkaXNwYXRjaGVkIHRocm91Z2ggZG9fSVJRKCkgd2hpbGUgdGhlIGxvdy1sZXZlbCBpcyAKKyAgYykgaGlnaC1sZXZlbCBhbmQgbG93LWxldmVsIHRpbWVyIGludGVycnVwdCByb3V0aW5lcyB3aGVyZSB0aGUgdGltZXIKKyAgICAgaW50ZXJydXB0IHNvdXJjZSAgbWF5IG9yIG1heSBub3QgYmUgdGhlIENQVSB0aW1lci4gIFRoZSBoaWdoLWxldmVsCisgICAgIHJvdXRpbmUgaXMgZGlzcGF0Y2hlZCB0aHJvdWdoIGRvX0lSUSgpIHdoaWxlIHRoZSBsb3ctbGV2ZWwgaXMKICAgICAgZGlzcGF0Y2hlZCBpbiBhc3NlbWFibHkgY29kZSAodXN1YWxseSBpbnQtaGFuZGxlci5TKQogCiAKQEAgLTYzLDcgKzU4LDcgQEAKICAgYSkgYm9hcmRfdGltZV9pbml0IC0gYSBmdW5jdGlvbiBwb2ludGVyLiAgSW52b2tlZCBhdCB0aGUgYmVnaW5uaWcgb2YKICAgICAgdGltZV9pbml0KCkuICBJdCBpcyBvcHRpb25hbC4KIAkxLiAob3B0aW9uYWwpIHNldCB1cCBSVEMgcm91dGluZXMKLQkyLiAob3B0aW9uYWwpIGNhbGlicmF0ZSBhbmQgc2V0IHRoZSBtaXBzX2NvdW50ZXJfZnJlcXVlbmN5CisJMi4gKG9wdGlvbmFsKSBjYWxpYnJhdGUgYW5kIHNldCB0aGUgbWlwc19ocHRfZnJlcXVlbmN5CiAKICAgYikgcGxhdF90aW1lcl9zZXR1cCAtIGEgZnVuY3Rpb24gcG9pbnRlci4gIEludm9rZWQgYXQgdGhlIGVuZCBvZiB0aW1lX2luaXQoKQogCTEuIChvcHRpb25hbCkgb3Zlci1yaWRlIGFueSBkZWNpc2lvbnMgbWFkZSBpbiB0aW1lX2luaXQoKQpAQCAtNzIsOSArNjcsOCBAQAogCiAgIGMpIChvcHRpb25hbCkgYm9hcmQtc3BlY2lmaWMgUlRDIHJvdXRpbmVzLgogCi0gIGQpIChvcHRpb25hbCkgbWlwc19jb3VudGVyX2ZyZXF1ZW5jeSAtIEl0IG11c3QgYmUgZGVmaW5pZWQgaWYgdGhlIGJvYXJkCi0gICAgIGlzIHVzaW5nIENQVSBjb3VudGVyIGZvciB0aW1lciBpbnRlcnJ1cHQgb3IgaXQgaXMgdXNpbmcgZml4ZWQgcmF0ZQotICAgICBnZXR0aW1lb2Zmc2V0KCkuCisgIGQpIChvcHRpb25hbCkgbWlwc19ocHRfZnJlcXVlbmN5IC0gSXQgbXVzdCBiZSBkZWZpbmllZCBpZiB0aGUgYm9hcmQKKyAgICAgaXMgdXNpbmcgQ1BVIGNvdW50ZXIgZm9yIHRpbWVyIGludGVycnVwdC4KIAogCiBQT1JUSU5HIEdVSURFCkBAIC04OSwyMiArODMsMTIgQEAKICAgICAgSWYgdGhlIGFuc3dlciBpcyBubywgeW91IG5lZWQgYSB0aW1lciB0byBwcm92aWRlIHRoZSB0aW1lciBpbnRlcnJ1cHQKICAgICAgYXQgMTAwIEhaIHNwZWVkLgogCi0gICAgIFlvdSBjYW5ub3QgdXNlIHRoZSBmYXN0IGdldHRpbWVvZmZzZXQgZnVuY3Rpb25zLCBpLmUuLAotCi0JdW5zaWduZWQgbG9uZyBmaXhlZF9yYXRlX2dldHRpbWVvZmZzZXQodm9pZCk7Ci0JdW5zaWduZWQgbG9uZyBjYWxpYnJhdGVfZGl2MzJfZ2V0dGltZW9mZnNldCh2b2lkKTsKLQl1bnNpZ25lZCBsb25nIGNhbGlicmF0ZV9kaXY2NF9nZXR0aW1lb2Zmc2V0KHZvaWQpOwotCi0gICAgWW91IGNhbiB1c2UgbnVsbF9nZXR0aW1lb2Zmc2V0KCkgd2lsbCBnaXZlcyB0aGUgc2FtZSB0aW1lIHJlc29sdXRpb24gYXMKLSAgICBqaWZmeS4gIE9yIHlvdSBjYW4gaW1wbGVtZW50IHlvdXIgb3duIGdldHRpbWVvZmZzZXQgKHByb2JhYmx5IGJhc2VkIG9uIAotICAgIHNvbWUgYWQgaG9jIGhhcmR3YXJlIG9uIHlvdXIgbWFjaGluZS4pCi0KICAgYykgVGhlIGZvbGxvd2luZyBzdWIgc3RlcHMgYXNzdW1lIHlvdXIgQ1BVIGhhcyBjb3VudGVyIHJlZ2lzdGVyLgogICAgICBEbyB5b3UgcGxhbiB0byB1c2UgdGhlIENQVSBjb3VudGVyIHJlZ2lzdGVyIGFzIHRoZSB0aW1lciBpbnRlcnJ1cHQKICAgICAgb3IgdXNlIGFuIGV4bnRlcm5hbCB0aW1lcj8KIAogICAgICBJbiBvcmRlciB0byB1c2UgQ1BVIGNvdW50ZXIgcmVnaXN0ZXIgYXMgdGhlIHRpbWVyIGludGVycnVwdCBzb3VyY2UsIHlvdQotICAgICBtdXN0IGtub3cgdGhlIGNvdW50ZXIgc3BlZWQgKG1pcHNfY291bnRlcl9mcmVxdWVuY3kpLiAgSXQgaXMgdXN1YWxseSB0aGUKKyAgICAgbXVzdCBrbm93IHRoZSBjb3VudGVyIHNwZWVkIChtaXBzX2hwdF9mcmVxdWVuY3kpLiAgSXQgaXMgdXN1YWxseSB0aGUKICAgICAgc2FtZSBhcyB0aGUgQ1BVIHNwZWVkIG9yIGFuIGludGVncmFsIGRpdmlzb3Igb2YgaXQuCiAKICAgZCkgZGVjaWRlIG9uIHdoZXRoZXIgeW91IHdhbnQgdG8gdXNlIGhpZ2gtbGV2ZWwgb3IgbG93LWxldmVsIHRpbWVyCkBAIC0xMjEsMTAgKzEwNSwxMCBAQAogICBpZiBuZWVkZWQuCiAKICAgYm9hcmRfdGltZV9pbml0KCkgLQotICAJYSkgKG9wdGlvbmFsKSBzZXQgdXAgUlRDIHJvdXRpbmVzLCAKLSAgICAgICAgYikgKG9wdGlvbmFsKSBjYWxpYnJhdGUgYW5kIHNldCB0aGUgbWlwc19jb3VudGVyX2ZyZXF1ZW5jeQotIAkgICAgKG9ubHkgbmVlZGVkIGlmIHlvdSBpbnRlbmRlZCB0byB1c2UgZml4ZWRfcmF0ZV9nZXR0aW1lb2Zmc2V0Ci0gCSAgICAgb3IgdXNlIGNwdSBjb3VudGVyIGFzIHRpbWVyIGludGVycnVwdCBzb3VyY2UpCisgIAlhKSAob3B0aW9uYWwpIHNldCB1cCBSVEMgcm91dGluZXMsCisgICAgICAgIGIpIChvcHRpb25hbCkgY2FsaWJyYXRlIGFuZCBzZXQgdGhlIG1pcHNfaHB0X2ZyZXF1ZW5jeQorIAkgICAgKG9ubHkgbmVlZGVkIGlmIHlvdSBpbnRlbmRlZCB0byB1c2UgY3B1IGNvdW50ZXIgYXMgdGltZXIgaW50ZXJydXB0CisgCSAgICAgc291cmNlKQogCiAgIHBsYXRfdGltZXJfc2V0dXAoKSAtCiAgCWEpIChvcHRpb25hbCkgb3Zlci13cml0ZSBhbnkgY2hvaWNlcyBtYWRlIGFib3ZlIGJ5IHRpbWVfaW5pdCgpLgpAQCAtMTU0LDggKzEzOCw4IEBACiBGb3IgZXhhbXBsZSwgeW91IG1heSBkZWZpbmUgeW91ciBvd24gdGltZXIgaW50ZXJydXB0IHJvdXRpbmUsIHdoaWNoIGRvZXMKIHNvbWUgb2YgaXRzIG93biBwcm9jZXNzaW5nIGFuZCB0aGVuIGNhbGxzIHRpbWVyX2ludGVycnVwdCgpLgogCi1Zb3UgY2FuIGFsc28gb3Zlci1yaWRlIGFueSBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zIChnZXR0aW1lb2Zmc2V0LAotUlRDIHJvdXRpbmVzIGFuZC9vciB0aW1lciBpbnRlcnJ1cHQgcm91dGluZSkuCitZb3UgY2FuIGFsc28gb3Zlci1yaWRlIGFueSBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zIChSVEMgcm91dGluZXMKK2FuZC9vciB0aW1lciBpbnRlcnJ1cHQgcm91dGluZSkuCiAKIAogUE9SVElORyBOT1RFUyBGT1IgU01QCkBAIC0xODcsMTAgKzE3MSwzIEBACiAKIAlZb3UgY2FuIGFsc28gZG8gdGhlIGxvdy1sZXZlbCB2ZXJzaW9uIG9mIHRob3NlIGludGVycnVwdCByb3V0aW5lcywKIAlmb2xsb3dpbmcgc2ltaWxhciBkaXNwYXRjaGluZyByb3V0ZXMgZGVzY3JpYmVkIGFib3ZlLgotCi1Ob3RlIGFib3V0IGRvX2dldHRpbWVvZmZzZXQoKToKLQotICBJdCBpcyB2ZXJ5IGxpa2VseSB0aGUgQ1BVIGNvdW50ZXIgcmVnaXN0ZXJzIGFyZSBub3Qgc3luYydlZCB1cCBpbiBhIFNNUCBib3guCi0gIFRoZXJlZm9yZSB5b3UgY2Fubm90IHJlYWxseSB1c2UgdGhlIG1hbnkgb2YgdGhlIGV4aXN0aW5nIHJvdXRpbmVzIHRoYXQKLSAgYXJlIGJhc2VkIG9uIENQVSBjb3VudGVyLiAgWW91IHNob3VsZCB3aXJ0ZSB5b3VyIG93biBnZXR0aW1lb2Zmc2V0IHJvdWludGUKLSAgaWYgeW91IHdhbnQgaW50cmEtamlmZnkgcmVzb2x1dGlvbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWAppbmRleCBiMTE4MWNlLi5lMDZiNmUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzAwLUlOREVYCkBAIC01OCw2ICs1OCw4IEBACiAJLSBGT1JFIFN5c3RlbXMgUENBLTIwMEUvU0JBLTIwMEUgQVRNIE5JQyBkcml2ZXIgaW5mby4KIGZyYW1lcmVsYXkudHh0CiAJLSBpbmZvIG9uIHVzaW5nIEZyYW1lIFJlbGF5L0RhdGEgTGluayBDb25uZWN0aW9uIElkZW50aWZpZXIgKERMQ0kpLgorZ2VuZXJpY19uZXRsaW5rLnR4dAorCS0gaW5mbyBvbiBHZW5lcmljIE5ldGxpbmsKIGlwLXN5c2N0bC50eHQKIAktIC9wcm9jL3N5cy9uZXQvaXB2NC8qIHZhcmlhYmxlcwogaXBfZHluYWRkci50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9OQVBJX0hPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9OQVBJX0hPV1RPLnR4dAppbmRleCA5M2FmM2U4Li5mYjhkYzY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL05BUElfSE9XVE8udHh0CkBAIC05NSw4ICs5NSw4IEBACiAJCU1vdmUgYWxsIHRvIGRldi0+cG9sbCgpCiAKIEMpIEFiaWxpdHkgdG8gZGV0ZWN0IG5ldyB3b3JrIGNvcnJlY3RseS4KLU5BUEkgd29ya3MgYnkgc2h1dHRpbmcgZG93biBldmVudCBpbnRlcnJ1cHRzIHdoZW4gdGhlcmVzIHdvcmsgYW5kCi10dXJuaW5nIHRoZW0gb24gd2hlbiB0aGVyZXMgbm9uZS4gCitOQVBJIHdvcmtzIGJ5IHNodXR0aW5nIGRvd24gZXZlbnQgaW50ZXJydXB0cyB3aGVuIHRoZXJlJ3Mgd29yayBhbmQKK3R1cm5pbmcgdGhlbSBvbiB3aGVuIHRoZXJlJ3Mgbm9uZS4gCiBOZXcgcGFja2V0cyBtaWdodCBzaG93IHVwIGluIHRoZSBzbWFsbCB3aW5kb3cgd2hpbGUgaW50ZXJydXB0cyB3ZXJlIGJlaW5nIAogcmUtZW5hYmxlZCAocmVmZXIgdG8gYXBwZW5kaXggMikuICBBIHBhY2tldCBtaWdodCBzbmVhayBpbiBkdXJpbmcgdGhlIHBlcmlvZCAKIHdlIGFyZSBlbmFibGluZyBpbnRlcnJ1cHRzLiBXZSBvbmx5IGdldCB0byBrbm93IGFib3V0IHN1Y2ggYSBwYWNrZXQgd2hlbiB0aGUgCkBAIC0xMTQsNyArMTE0LDcgQEAKIG9ubHkgb25lIENQVSBjYW4gcGljayB0aGUgaW5pdGlhbCBpbnRlcnJ1cHQgYW5kIGhlbmNlIHRoZSBpbml0aWFsCiBuZXRpZl9yeF9zY2hlZHVsZShkZXYpOwogLSBUaGUgY29yZSBsYXllciBpbnZva2VzIGRldmljZXMgdG8gc2VuZCBwYWNrZXRzIGluIGEgcm91bmQgcm9iaW4gZm9ybWF0LgotVGhpcyBpbXBsaWVzIHJlY2VpdmUgaXMgdG90YWx5IGxvY2tsZXNzIGJlY2F1c2Ugb2YgdGhlIGd1YXJhbnRlZSBvbmx5IHRoYXQgCitUaGlzIGltcGxpZXMgcmVjZWl2ZSBpcyB0b3RhbGx5IGxvY2tsZXNzIGJlY2F1c2Ugb2YgdGhlIGd1YXJhbnRlZSB0aGF0IG9ubHkgCiBvbmUgQ1BVIGlzIGV4ZWN1dGluZyBpdC4KIC0gIGNvbnRlbnRpb24gY2FuIG9ubHkgYmUgdGhlIHJlc3VsdCBvZiBzb21lIG90aGVyIENQVSBhY2Nlc3NpbmcgdGhlIHJ4CiByaW5nLiBUaGlzIGhhcHBlbnMgb25seSBpbiBjbG9zZSgpIGFuZCBzdXNwZW5kKCkgKHdoZW4gdGhlc2UgbWV0aG9kcwpAQCAtNTEwLDcgKzUxMCw3IEBACiAJCQlhbiBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKIAl9Ci0JLyogZG9uZSEgYXQgbGVhc3QgdGhhdHMgd2hhdCBpdCBsb29rcyBsaWtlIDstPgorCS8qIGRvbmUhIGF0IGxlYXN0IHRoYXQncyB3aGF0IGl0IGxvb2tzIGxpa2UgOy0+CiAJaWYgbmV3IHBhY2tldHMgY2FtZSBpbiBhZnRlciBvdXIgbGFzdCBjaGVjayBvbiBzdGF0dXMgYml0cwogCXRoZXknbGwgYmUgY2F1Z2h0IGJ5IHRoZSB3aGlsZSBjaGVjayBhbmQgd2UgZ28gYmFjayBhbmQgY2xlYXIgdGhlbSAKIAlzaW5jZSB3ZSBoYXZlbnQgZXhjZWVkZWQgb3VyIHF1b3RhICovCkBAIC01MzUsMTEgKzUzNSwxMSBAQAogICAgICAgICAqIDEuIGl0IGNhbiByYWNlIHdpdGggZGlzYWJsaW5nIGlycXMgaW4gaXJxIGhhbmRsZXIgKHdoaWNoIGFyZSBkb25lIHRvIAogCSogc2NoZWR1bGUgcG9sbHMpCiAgICAgICAgICogMi4gaXQgY2FuIHJhY2Ugd2l0aCBkaXMvZW5hYmxpbmcgaXJxcyBpbiBvdGhlciBwb2xsIHRocmVhZHMKLSAgICAgICAgKiAzLiBpZiBhbiBpcnEgcmFpc2VkIGFmdGVyIHRoZSBiZWdpbmluZyBvZiB0aGUgb3V0ZXIgIGJlZ2lubmluZyAKLSAgICAgICAgKiBsb29wKG1hcmtlZCBpbiB0aGUgY29kZSBhYm92ZSksIGl0IHdpbGwgYmUgaW1tZWRpYXRlbHkKKyAgICAgICAgKiAzLiBpZiBhbiBpcnEgcmFpc2VkIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dGVyIGJlZ2lubmluZyAKKyAgICAgICAgKiBsb29wIChtYXJrZWQgaW4gdGhlIGNvZGUgYWJvdmUpLCBpdCB3aWxsIGJlIGltbWVkaWF0ZWx5CiAgICAgICAgICogdHJpZ2dlcmVkIGhlcmUuCiAgICAgICAgICoKLSAgICAgICAgKiBTdW1tYXJpemluZzogdGhlIGxvZ2ljIG1heSByZXN1bHRzIGluIHNvbWUgcmVkdW5kYW50IGlycXMgYm90aAorICAgICAgICAqIFN1bW1hcml6aW5nOiB0aGUgbG9naWMgbWF5IHJlc3VsdCBpbiBzb21lIHJlZHVuZGFudCBpcnFzIGJvdGgKICAgICAgICAgKiBkdWUgdG8gcmFjZXMgaW4gbWFza2luZyBhbmQgZHVlIHRvIHRvbyBsYXRlIGFja2luZyBvZiBhbHJlYWR5CiAgICAgICAgICogcHJvY2Vzc2VkIGlycXMuIFRoZSBnb29kIG5ld3M6IG5vIGV2ZW50cyBhcmUgZXZlciBsb3N0LgogICAgICAgICAqLwpAQCAtNjAxLDcgKzYwMSw3IEBACiAJCiA1KSBkZXYtPmNsb3NlKCkgYW5kIGRldi0+c3VzcGVuZCgpIGlzc3VlcwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1UaGUgZHJpdmVyIHdyaXR0ZXIgbmVlZG50IHdvcnJ5IGFib3V0IHRoaXMuIFRoZSB0b3AgbmV0IGxheWVyIHRha2VzCitUaGUgZHJpdmVyIHdyaXRlciBuZWVkbid0IHdvcnJ5IGFib3V0IHRoaXM7IHRoZSB0b3AgbmV0IGxheWVyIHRha2VzCiBjYXJlIG9mIGl0LgogCiA2KSBBZGRpbmcgbmV3IFN0YXRzIHRvIC9wcm9jIApAQCAtNjIyLDkgKzYyMiw5IEBACiBwYWNrZXRzIGZhc3QgZW5vdWdoIGkuZSBzZW5kIGEgcGF1c2Ugb25seSB3aGVuIHlvdSBydW4gb3V0IG9mIHJ4IGJ1ZmZlcnMuCiBOb3RlIEZDIGluIGl0c2VsZiBpcyBhIGdvb2Qgc29sdXRpb24gYnV0IHdlIGhhdmUgZm91bmQgaXQgdG8gbm90IGJlCiBtdWNoIG9mIGEgY29tbW9kaXR5IGZlYXR1cmUgKGJvdGggaW4gTklDcyBhbmQgc3dpdGNoZXMpIGFuZCBoZW5jZSBmYWxscwotdW5kZXIgdGhlIHNhbWUgY2F0ZWdvcnkgYXMgdXNpbmcgTklDIGJhc2VkIG1pdGlnYXRpb24uIEFsc28gZXhwZXJpbWVudHMKLWluZGljYXRlIHRoYXQgaXRzIG11Y2ggaGFyZGVyIHRvIHJlc29sdmUgdGhlIHJlc291cmNlIGFsbG9jYXRpb24KLWlzc3VlIChha2EgbGF6eSByZWNlaXZpbmcgdGhhdCBOQVBJIG9mZmVycykgYW5kIGhlbmNlIHF1YW50aWZ5IGl0cyB1c2VmdWxsbmVzcwordW5kZXIgdGhlIHNhbWUgY2F0ZWdvcnkgYXMgdXNpbmcgTklDIGJhc2VkIG1pdGlnYXRpb24uIEFsc28sIGV4cGVyaW1lbnRzCitpbmRpY2F0ZSB0aGF0IGl0J3MgbXVjaCBoYXJkZXIgdG8gcmVzb2x2ZSB0aGUgcmVzb3VyY2UgYWxsb2NhdGlvbgoraXNzdWUgKGFrYSBsYXp5IHJlY2VpdmluZyB0aGF0IE5BUEkgb2ZmZXJzKSBhbmQgaGVuY2UgcXVhbnRpZnkgaXRzIHVzZWZ1bG5lc3MKIHByb3ZlZCBoYXJkZXIuIEluIGFueSBjYXNlLCBGQyB3b3JrcyBldmVuIGJldHRlciB3aXRoIE5BUEkgYnV0IGlzIG5vdAogbmVjZXNzYXJ5LgogCkBAIC02NzgsMTAgKzY3OCwxMCBAQAogQ1NSNSBiaXQgb2YgaW50ZXJlc3QgaXMgb25seSB0aGUgcnggc3RhdHVzLiAKIElmIHlvdSBsb29rIGF0IHRoZSBsYXN0IGlmIHN0YXRlbWVudDogCiB5b3UganVzdCBmaW5pc2hlZCBncmFiYmluZyBhbGwgdGhlIHBhY2tldHMgZnJvbSB0aGUgcnggcmluZyAuLiB5b3UgY2hlY2sgaWYKLXN0YXR1cyBiaXQgc2F5cyB0aGVyZXMgbW9yZSBwYWNrZXRzIGp1c3QgaW4gLi4uIGl0IHNheXMgbm9uZTsgeW91IHRoZW4KK3N0YXR1cyBiaXQgc2F5cyB0aGVyZSBhcmUgbW9yZSBwYWNrZXRzIGp1c3QgaW4gLi4uIGl0IHNheXMgbm9uZTsgeW91IHRoZW4KIGVuYWJsZSByeCBpbnRlcnJ1cHRzIGFnYWluOyBpZiBhIG5ldyBwYWNrZXQganVzdCBjYW1lIGluIGR1cmluZyB0aGlzIGNoZWNrLAogd2UgYXJlIGNvdW50aW5nIHRoYXQgQ1NSNSB3aWxsIGJlIHNldCBpbiB0aGF0IHNtYWxsIHdpbmRvdyBvZiBvcHBvcnR1bml0eQotYW5kIHRoYXQgYnkgcmUtZW5hYmxpbmcgaW50ZXJydXB0cywgd2Ugd291bGQgYWN0dWFsbHkgdHJpZ2VyIGFuIGludGVycnVwdAorYW5kIHRoYXQgYnkgcmUtZW5hYmxpbmcgaW50ZXJydXB0cywgd2Ugd291bGQgYWN0dWFsbHkgdHJpZ2dlciBhbiBpbnRlcnJ1cHQKIHRvIHJlZ2lzdGVyIHRoZSBuZXcgcGFja2V0IGZvciBwcm9jZXNzaW5nLgogCiBbVGhlIGFib3ZlIGRlc2NyaXB0aW9uIG5heSBiZSB2ZXJ5IHZlcmJvc2UsIGlmIHlvdSBoYXZlIGJldHRlciB3b3JkaW5nIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NzODl4MC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dAppbmRleCA2NDg5NjQ3Li42Mzg3ZDNkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dApAQCAtMjQ4LDcgKzI0OCw3IEBACiAgICB3aXRoIGRldmljZSBwcm9iaW5nLiAgVG8gYXZvaWQgdGhpcyBiZWhhdmlvdXIsIGFkZCBvbmUKICAgIHRvIHRoZSBgaW89JyBtb2R1bGUgcGFyYW1ldGVyLiAgVGhpcyBkb2Vzbid0IGFjdHVhbGx5IGNoYW5nZQogICAgdGhlIEkvTyBhZGRyZXNzLCBidXQgaXQgaXMgYSBmbGFnIHRvIHRlbGwgdGhlIGRyaXZlcgotICAgdG9wYXJ0aWFsbHkgaW5pdGlhbGlzZSB0aGUgaGFyZHdhcmUgYmVmb3JlIHRyeWluZyB0bworICAgdG8gcGFydGlhbGx5IGluaXRpYWxpc2UgdGhlIGhhcmR3YXJlIGJlZm9yZSB0cnlpbmcgdG8KICAgIGlkZW50aWZ5IHRoZSBjYXJkLiAgVGhpcyBjb3VsZCBiZSBkYW5nZXJvdXMgaWYgeW91IGFyZQogICAgbm90IHN1cmUgdGhhdCB0aGVyZSBpcyBhIGNzODl4MCBjYXJkIGF0IHRoZSBwcm92aWRlZCBhZGRyZXNzLgogCkBAIC02MjAsOCArNjIwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICAgICAgIE1vdXNlIChQUy8yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogTWVtb3J5IEFkZHJlc3MgIERldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgTWF0aCBDb3Byb2Nlc3NvcgogLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgMTQgICAgICAgSGFyZCBEaXNrIGNvbnRyb2xsZXIKLUEwMDAtQkZGRglFR0EgR3JhcGhpY3MgQWRwYXRlcgotQTAwMC1DN0ZGCVZHQSBHcmFwaGljcyBBZHBhdGVyCitBMDAwLUJGRkYJRUdBIEdyYXBoaWNzIEFkYXB0ZXIKK0EwMDAtQzdGRglWR0EgR3JhcGhpY3MgQWRhcHRlcgogQjAwMC1CRkZGCU1vbm8gR3JhcGhpY3MgQWRhcHRlcgogQjgwMC1CRkZGCUNvbG9yIEdyYXBoaWNzIEFkYXB0ZXIKIEUwMDAtRkZGRglBVCBCSU9TCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGNjcC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGNjcC50eHQKaW5kZXggNzQ1NjNiMy4uMzg3NDgyZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RjY3AudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kY2NwLnR4dApAQCAtMTksNDAgKzE5LDkyIEBACiAKIEl0IGhhcyBhIGJhc2UgcHJvdG9jb2wgYW5kIHBsdWdnYWJsZSBjb25nZXN0aW9uIGNvbnRyb2wgSURzIChDQ0lEcykuCiAKLUl0IGlzIGF0IGRyYWZ0IFJGQyBzdGF0dXMgYW5kIHRoZSBob21lcGFnZSBmb3IgRENDUCBhcyBhIHByb3RvY29sIGlzIGF0OgotCWh0dHA6Ly93d3cuaWNpci5vcmcva29obGVyL2RjcC8KK0l0IGlzIGF0IHByb3Bvc2VkIHN0YW5kYXJkIFJGQyBzdGF0dXMgYW5kIHRoZSBob21lcGFnZSBmb3IgRENDUCBhcyBhIHByb3RvY29sCitpcyBhdDoKKwlodHRwOi8vd3d3LnJlYWQuY3MudWNsYS5lZHUvZGNjcC8KIAogTWlzc2luZyBmZWF0dXJlcwogPT09PT09PT09PT09PT09PQogCiBUaGUgRENDUCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZSBhbGwgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGluCi10aGUgZHJhZnQgUkZDLgordGhlIFJGQy4KIAotSW4gcGFydGljdWxhciB0aGUgZm9sbG93aW5nIGFyZSBtaXNzaW5nOgotLSBDQ0lEMiBzdXBwb3J0Ci0tIGZlYXR1cmUgbmVnb3RpYXRpb24KLQotV2hlbiB0ZXN0aW5nIGFnYWluc3Qgb3RoZXIgaW1wbGVtZW50YXRpb25zIGl0IGFwcGVhcnMgdGhhdCBlbGFwc2VkIHRpbWUKLW9wdGlvbnMgYXJlIG5vdCBjb2RlZCBjb21wbGlhbnQgdG8gdGhlIHNwZWNpZmljYXRpb24uCitUaGUga25vd24gYnVncyBhcmUgYXQ6CisJaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvVE9ETyNEQ0NQCiAKIFNvY2tldCBvcHRpb25zCiA9PT09PT09PT09PT09PQogCi1EQ0NQX1NPQ0tPUFRfUEFDS0VUX1NJWkUgaXMgdXNlZCBmb3IgQ0NJRDMgdG8gc2V0IGRlZmF1bHQgcGFja2V0IHNpemUgZm9yCi1jYWxjdWxhdGlvbnMuCi0KIERDQ1BfU09DS09QVF9TRVJWSUNFIHNldHMgdGhlIHNlcnZpY2UuIFRoZSBzcGVjaWZpY2F0aW9uIG1hbmRhdGVzIHVzZSBvZgogc2VydmljZSBjb2RlcyAoUkZDIDQzNDAsIHNlYy4gOC4xLjIpOyBpZiB0aGlzIHNvY2tldCBvcHRpb24gaXMgbm90IHNldCwKIHRoZSBzb2NrZXQgd2lsbCBmYWxsIGJhY2sgdG8gMCAod2hpY2ggbWVhbnMgdGhhdCBubyBtZWFuaW5nZnVsIHNlcnZpY2UgY29kZQogaXMgcHJlc2VudCkuIENvbm5lY3Rpbmcgc29ja2V0cyBzZXQgYXQgbW9zdCBvbmUgc2VydmljZSBvcHRpb247IGZvcgogbGlzdGVuaW5nIHNvY2tldHMsIG11bHRpcGxlIHNlcnZpY2UgY29kZXMgY2FuIGJlIHNwZWNpZmllZC4KIAorRENDUF9TT0NLT1BUX1NFTkRfQ1NDT1YgYW5kIERDQ1BfU09DS09QVF9SRUNWX0NTQ09WIGFyZSB1c2VkIGZvciBzZXR0aW5nIHRoZQorcGFydGlhbCBjaGVja3N1bSBjb3ZlcmFnZSAoUkZDIDQzNDAsIHNlYy4gOS4yKS4gVGhlIGRlZmF1bHQgaXMgdGhhdCBjaGVja3N1bXMKK2Fsd2F5cyBjb3ZlciB0aGUgZW50aXJlIHBhY2tldCBhbmQgdGhhdCBvbmx5IGZ1bGx5IGNvdmVyZWQgYXBwbGljYXRpb24gZGF0YSBpcworYWNjZXB0ZWQgYnkgdGhlIHJlY2VpdmVyLiBIZW5jZSwgd2hlbiB1c2luZyB0aGlzIGZlYXR1cmUgb24gdGhlIHNlbmRlciwgaXQgbXVzdAorYmUgZW5hYmxlZCBhdCB0aGUgcmVjZWl2ZXIsIHRvbyB3aXRoIHN1aXRhYmxlIGNob2ljZSBvZiBDc0Nvdi4KKworRENDUF9TT0NLT1BUX1NFTkRfQ1NDT1Ygc2V0cyB0aGUgc2VuZGVyIGNoZWNrc3VtIGNvdmVyYWdlLiBWYWx1ZXMgaW4gdGhlCisJcmFuZ2UgMC4uMTUgYXJlIGFjY2VwdGFibGUuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgMCAoZnVsbCBjb3ZlcmFnZSksCisJdmFsdWVzIGJldHdlZW4gMS4uMTUgaW5kaWNhdGUgcGFydGlhbCBjb3ZlcmFnZS4KK0RDQ1BfU09DS09QVF9TRU5EX0NTQ09WIGlzIGZvciB0aGUgcmVjZWl2ZXIgYW5kIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nOiBpdAorCXNldHMgYSB0aHJlc2hvbGQsIHdoZXJlIGFnYWluIHZhbHVlcyAwLi4xNSBhcmUgYWNjZXB0YWJsZS4gVGhlIGRlZmF1bHQKKwlvZiAwIG1lYW5zIHRoYXQgYWxsIHBhY2tldHMgd2l0aCBhIHBhcnRpYWwgY292ZXJhZ2Ugd2lsbCBiZSBkaXNjYXJkZWQuCisJVmFsdWVzIGluIHRoZSByYW5nZSAxLi4xNSBpbmRpY2F0ZSB0aGF0IHBhY2tldHMgd2l0aCBtaW5pbWFsbHkgc3VjaCBhCisJY292ZXJhZ2UgdmFsdWUgYXJlIGFsc28gYWNjZXB0YWJsZS4gVGhlIGhpZ2hlciB0aGUgbnVtYmVyLCB0aGUgbW9yZQorCXJlc3RyaWN0aXZlIHRoaXMgc2V0dGluZyAoc2VlIFtSRkMgNDM0MCwgc2VjLiA5LjIuMV0pLgorCitTeXNjdGwgdmFyaWFibGVzCis9PT09PT09PT09PT09PT09CitTZXZlcmFsIERDQ1AgZGVmYXVsdCBwYXJhbWV0ZXJzIGNhbiBiZSBtYW5hZ2VkIGJ5IHRoZSBmb2xsb3dpbmcgc3lzY3RscworKHN5c2N0bCBuZXQuZGNjcC5kZWZhdWx0IG9yIC9wcm9jL3N5cy9uZXQvZGNjcC9kZWZhdWx0KToKKworcmVxdWVzdF9yZXRyaWVzCisJVGhlIG51bWJlciBvZiBhY3RpdmUgY29ubmVjdGlvbiBpbml0aWF0aW9uIHJldHJpZXMgKHRoZSBudW1iZXIgb2YKKwlSZXF1ZXN0cyBtaW51cyBvbmUpIGJlZm9yZSB0aW1pbmcgb3V0LiBJbiBhZGRpdGlvbiwgaXQgYWxzbyBnb3Zlcm5zCisJdGhlIGJlaGF2aW91ciBvZiB0aGUgb3RoZXIsIHBhc3NpdmUgc2lkZTogdGhpcyB2YXJpYWJsZSBhbHNvIHNldHMKKwl0aGUgbnVtYmVyIG9mIHRpbWVzIERDQ1AgcmVwZWF0cyBzZW5kaW5nIGEgUmVzcG9uc2Ugd2hlbiB0aGUgaW5pdGlhbAorCWhhbmRzaGFrZSBkb2VzIG5vdCBwcm9ncmVzcyBmcm9tIFJFU1BPTkQgdG8gT1BFTiAoaS5lLiB3aGVuIG5vIEFjaworCWlzIHJlY2VpdmVkIGFmdGVyIHRoZSBpbml0aWFsIFJlcXVlc3QpLiAgVGhpcyB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlcgorCXRoYW4gMCwgc3VnZ2VzdGVkIGlzIGxlc3MgdGhhbiAxMC4gQW5hbG9ndWUgb2YgdGNwX3N5bl9yZXRyaWVzLgorCityZXRyaWVzMQorCUhvdyBvZnRlbiBhIERDQ1AgUmVzcG9uc2UgaXMgcmV0cmFuc21pdHRlZCB1bnRpbCB0aGUgbGlzdGVuaW5nIERDQ1AKKwlzaWRlIGNvbnNpZGVycyBpdHMgY29ubmVjdGluZyBwZWVyIGRlYWQuIEFuYWxvZ3VlIG9mIHRjcF9yZXRyaWVzMS4KKworcmV0cmllczIKKwlUaGUgbnVtYmVyIG9mIHRpbWVzIGEgZ2VuZXJhbCBEQ0NQIHBhY2tldCBpcyByZXRyYW5zbWl0dGVkLiBUaGlzIGhhcworCWltcG9ydGFuY2UgZm9yIHJldHJhbnNtaXR0ZWQgYWNrbm93bGVkZ21lbnRzIGFuZCBmZWF0dXJlIG5lZ290aWF0aW9uLAorCWRhdGEgcGFja2V0cyBhcmUgbmV2ZXIgcmV0cmFuc21pdHRlZC4gQW5hbG9ndWUgb2YgdGNwX3JldHJpZXMyLgorCitzZW5kX25kcCA9IDEKKwlXaGV0aGVyIG9yIG5vdCB0byBzZW5kIE5EUCBjb3VudCBvcHRpb25zIChzZWMuIDcuNy4yKS4KKworc2VuZF9hY2t2ZWMgPSAxCisJV2hldGhlciBvciBub3QgdG8gc2VuZCBBY2sgVmVjdG9yIG9wdGlvbnMgKHNlYy4gMTEuNSkuCisKK2Fja19yYXRpbyA9IDIKKwlUaGUgZGVmYXVsdCBBY2sgUmF0aW8gKHNlYy4gMTEuMykgdG8gdXNlLgorCit0eF9jY2lkID0gMgorCURlZmF1bHQgQ0NJRCBmb3IgdGhlIHNlbmRlci1yZWNlaXZlciBoYWxmLWNvbm5lY3Rpb24uCisKK3J4X2NjaWQgPSAyCisJRGVmYXVsdCBDQ0lEIGZvciB0aGUgcmVjZWl2ZXItc2VuZGVyIGhhbGYtY29ubmVjdGlvbi4KKworc2VxX3dpbmRvdyA9IDEwMAorCVRoZSBpbml0aWFsIHNlcXVlbmNlIHdpbmRvdyAoc2VjLiA3LjUuMikuCisKK3R4X3FsZW4gPSA1CisJVGhlIHNpemUgb2YgdGhlIHRyYW5zbWl0IGJ1ZmZlciBpbiBwYWNrZXRzLiBBIHZhbHVlIG9mIDAgY29ycmVzcG9uZHMKKwl0byBhbiB1bmJvdW5kZWQgdHJhbnNtaXQgYnVmZmVyLgorCiBOb3RlcwogPT09PT0KIAotU0VMaW51eCBkb2VzIG5vdCB5ZXQgaGF2ZSBzdXBwb3J0IGZvciBEQ0NQLiBZb3Ugd2lsbCBuZWVkIHRvIHR1cm4gaXQgb2ZmIG9yCi1lbHNlIHlvdSB3aWxsIGdldCBFQUNDRVMuCi0KLURDQ1AgZG9lcyBub3QgdHJhdmVsIHRocm91Z2ggTkFUIHN1Y2Nlc3NmdWxseSBhdCBwcmVzZW50LiBUaGlzIGlzIGJlY2F1c2UKLXRoZSBjaGVja3N1bSBjb3ZlcnMgdGhlIHBzdWVkby1oZWFkZXIgYXMgcGVyIFRDUCBhbmQgVURQLiBJdCBzaG91bGQgYmUKLXJlbGF0aXZlbHkgdHJpdmlhbCB0byBhZGQgTGludXggTkFUIHN1cHBvcnQgZm9yIERDQ1AuCitEQ0NQIGRvZXMgbm90IHRyYXZlbCB0aHJvdWdoIE5BVCBzdWNjZXNzZnVsbHkgYXQgcHJlc2VudCBvbiBtYW55IGJveGVzLiBUaGlzIGlzCitiZWNhdXNlIHRoZSBjaGVja3N1bSBjb3ZlcnMgdGhlIHBzdWVkby1oZWFkZXIgYXMgcGVyIFRDUCBhbmQgVURQLiBMaW51eCBOQVQKK3N1cHBvcnQgZm9yIERDQ1AgaGFzIGJlZW4gYWRkZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZTEwMDAudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2UxMDAwLnR4dAppbmRleCA1YzBhNWNjLi42MWIxNzFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZTEwMDAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9lMTAwMC50eHQKQEAgLTEsNyArMSw3IEBACiBMaW51eCogQmFzZSBEcml2ZXIgZm9yIHRoZSBJbnRlbChSKSBQUk8vMTAwMCBGYW1pbHkgb2YgQWRhcHRlcnMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1Ob3ZlbWJlciAxNSwgMjAwNQorU2VwdGVtYmVyIDI2LCAyMDA2CiAKIAogQ29udGVudHMKQEAgLTksNiArOSw3IEBACiAKIC0gSW4gVGhpcyBSZWxlYXNlCiAtIElkZW50aWZ5aW5nIFlvdXIgQWRhcHRlcgorLSBCdWlsZGluZyBhbmQgSW5zdGFsbGF0aW9uCiAtIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzCiAtIFNwZWVkIGFuZCBEdXBsZXggQ29uZmlndXJhdGlvbgogLSBBZGRpdGlvbmFsIENvbmZpZ3VyYXRpb25zCkBAIC00MSw2ICs0Miw5IEBACiBJbnN0cnVjdGlvbnMgb24gdXBkYXRpbmcgZXRodG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHNlY3Rpb24gIkFkZGl0aW9uYWwKIENvbmZpZ3VyYXRpb25zIiBsYXRlciBpbiB0aGlzIGRvY3VtZW50LgogCitOT1RFOiBUaGUgSW50ZWwoUikgODI1NjJ2IDEwLzEwMCBOZXR3b3JrIENvbm5lY3Rpb24gb25seSBwcm92aWRlcyAxMC8xMDAKK3N1cHBvcnQuCisKIAogSWRlbnRpZnlpbmcgWW91ciBBZGFwdGVyCiA9PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTUxLDI4ICs1NSwyNyBAQAogICAgIGh0dHA6Ly9zdXBwb3J0LmludGVsLmNvbS9zdXBwb3J0L25ldHdvcmsvYWRhcHRlci9wcm8xMDAvMjEzOTcuaHRtCiAKIEZvciB0aGUgbGF0ZXN0IEludGVsIG5ldHdvcmsgZHJpdmVycyBmb3IgTGludXgsIHJlZmVyIHRvIHRoZSBmb2xsb3dpbmcKLXdlYnNpdGUuIEluIHRoZSBzZWFyY2ggZmllbGQsIGVudGVyIHlvdXIgYWRhcHRlciBuYW1lIG9yIHR5cGUsIG9yIHVzZSB0aGUKK3dlYnNpdGUuICBJbiB0aGUgc2VhcmNoIGZpZWxkLCBlbnRlciB5b3VyIGFkYXB0ZXIgbmFtZSBvciB0eXBlLCBvciB1c2UgdGhlCiBuZXR3b3JraW5nIGxpbmsgb24gdGhlIGxlZnQgdG8gc2VhcmNoIGZvciB5b3VyIGFkYXB0ZXI6CiAKICAgICBodHRwOi8vZG93bmxvYWRmaW5kZXIuaW50ZWwuY29tL3NjcmlwdHMtZGYvc3VwcG9ydF9pbnRlbC5hc3AKIAogCi1Db21tYW5kIExpbmUgUGFyYW1ldGVycyA9PT09PT09PT09PT09PT09PT09PT09PQorQ29tbWFuZCBMaW5lIFBhcmFtZXRlcnMKKz09PT09PT09PT09PT09PT09PT09PT09CiAKIElmIHRoZSBkcml2ZXIgaXMgYnVpbHQgYXMgYSBtb2R1bGUsIHRoZSAgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnMKLWFyZSB1c2VkIGJ5IGVudGVyaW5nIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoIHRoZSBtb2Rwcm9iZSBvciBpbnNtb2QKLWNvbW1hbmQgdXNpbmcgdGhpcyBzeW50YXg6CithcmUgdXNlZCBieSBlbnRlcmluZyB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCB0aGUgbW9kcHJvYmUgY29tbWFuZAordXNpbmcgdGhpcyBzeW50YXg6CiAKICAgICAgbW9kcHJvYmUgZTEwMDAgWzxvcHRpb24+PTxWQUwxPiw8VkFMMj4sLi4uXQogCi0gICAgIGluc21vZCBlMTAwMCBbPG9wdGlvbj49PFZBTDE+LDxWQUwyPiwuLi5dCi0KIEZvciBleGFtcGxlLCB3aXRoIHR3byBQUk8vMTAwMCBQQ0kgYWRhcHRlcnMsIGVudGVyaW5nOgogCi0gICAgIGluc21vZCBlMTAwMCBUeERlc2NyaXB0b3JzPTgwLDEyOAorICAgICBtb2Rwcm9iZSBlMTAwMCBUeERlc2NyaXB0b3JzPTgwLDEyOAogCi1sb2FkcyB0aGUgZTEwMDAgZHJpdmVyIHdpdGggODAgVFggZGVzY3JpcHRvcnMgZm9yIHRoZSBmaXJzdCBhZGFwdGVyIGFuZCAxMjgKLVRYIGRlc2NyaXB0b3JzIGZvciB0aGUgc2Vjb25kIGFkYXB0ZXIuCitsb2FkcyB0aGUgZTEwMDAgZHJpdmVyIHdpdGggODAgVFggZGVzY3JpcHRvcnMgZm9yIHRoZSBmaXJzdCBhZGFwdGVyIGFuZAorMTI4IFRYIGRlc2NyaXB0b3JzIGZvciB0aGUgc2Vjb25kIGFkYXB0ZXIuCiAKIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIHBhcmFtZXRlciBpcyBnZW5lcmFsbHkgdGhlIHJlY29tbWVuZGVkIHNldHRpbmcsCiB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLgpAQCAtODcsNyArOTAsNyBAQAogICAgICAgICBodHRwOi8vd3d3LmludGVsLmNvbS9kZXNpZ24vbmV0d29yay9hcHBsbm90cy9hcDQ1MC5odG0KIAogICAgICAgICBBIGRlc2NyaXB0b3IgZGVzY3JpYmVzIGEgZGF0YSBidWZmZXIgYW5kIGF0dHJpYnV0ZXMgcmVsYXRlZCB0bwotICAgICAgICB0aGUgZGF0YSBidWZmZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWNjZXNzZWQgYnkgdGhlIGhhcmR3YXJlLgorICAgICAgICB0aGUgZGF0YSBidWZmZXIuICBUaGlzIGluZm9ybWF0aW9uIGlzIGFjY2Vzc2VkIGJ5IHRoZSBoYXJkd2FyZS4KIAogCiBBdXRvTmVnCkBAIC05Niw5ICs5OSw5IEBACiBWYWxpZCBSYW5nZTogICAweDAxLTB4MEYsIDB4MjAtMHgyRgogRGVmYXVsdCBWYWx1ZTogMHgyRgogCi1UaGlzIHBhcmFtZXRlciBpcyBhIGJpdCBtYXNrIHRoYXQgc3BlY2lmaWVzIHdoaWNoIHNwZWVkIGFuZCBkdXBsZXgKLXNldHRpbmdzIHRoZSBib2FyZCBhZHZlcnRpc2VzLiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHVzZWQsIHRoZSBTcGVlZAotYW5kIER1cGxleCBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIHNwZWNpZmllZC4KK1RoaXMgcGFyYW1ldGVyIGlzIGEgYml0LW1hc2sgdGhhdCBzcGVjaWZpZXMgdGhlIHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3MKK2FkdmVydGlzZWQgYnkgdGhlIGFkYXB0ZXIuICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHVzZWQsIHRoZSBTcGVlZCBhbmQKK0R1cGxleCBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIHNwZWNpZmllZC4KIAogTk9URTogIFJlZmVyIHRvIHRoZSBTcGVlZCBhbmQgRHVwbGV4IHNlY3Rpb24gb2YgdGhpcyByZWFkbWUgZm9yIG1vcmUKICAgICAgICBpbmZvcm1hdGlvbiBvbiB0aGUgQXV0b05lZyBwYXJhbWV0ZXIuCkBAIC0xMTAsMTQgKzExMywxNSBAQAogVmFsaWQgUmFuZ2U6ICAgMC0yICgwPWF1dG8tbmVnb3RpYXRlLCAxPWhhbGYsIDI9ZnVsbCkKIERlZmF1bHQgVmFsdWU6IDAKIAotRGVmaW5lcyB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIGRhdGEgaXMgYWxsb3dlZCB0byBmbG93LiBDYW4gYmUgZWl0aGVyCi1vbmUgb3IgdHdvLWRpcmVjdGlvbmFsLiBJZiBib3RoIER1cGxleCBhbmQgdGhlIGxpbmsgcGFydG5lciBhcmUgc2V0IHRvCi1hdXRvLW5lZ290aWF0ZSwgdGhlIGJvYXJkIGF1dG8tZGV0ZWN0cyB0aGUgY29ycmVjdCBkdXBsZXguIElmIHRoZSBsaW5rCi1wYXJ0bmVyIGlzIGZvcmNlZCAoZWl0aGVyIGZ1bGwgb3IgaGFsZiksIER1cGxleCBkZWZhdWx0cyB0byBoYWxmLWR1cGxleC4KK1RoaXMgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIGRhdGEgaXMgYWxsb3dlZCB0byBmbG93LiAgQ2FuIGJlCitlaXRoZXIgb25lIG9yIHR3by1kaXJlY3Rpb25hbC4gIElmIGJvdGggRHVwbGV4IGFuZCB0aGUgbGluayBwYXJ0bmVyIGFyZQorc2V0IHRvIGF1dG8tbmVnb3RpYXRlLCB0aGUgYm9hcmQgYXV0by1kZXRlY3RzIHRoZSBjb3JyZWN0IGR1cGxleC4gIElmIHRoZQorbGluayBwYXJ0bmVyIGlzIGZvcmNlZCAoZWl0aGVyIGZ1bGwgb3IgaGFsZiksIER1cGxleCBkZWZhdWx0cyB0byBoYWxmLQorZHVwbGV4LgogCiAKIEZsb3dDb250cm9sCi0tLS0tLS0tLS0tCistLS0tLS0tLS0tLQogVmFsaWQgUmFuZ2U6ICAgMC0zICgwPW5vbmUsIDE9Unggb25seSwgMj1UeCBvbmx5LCAzPVJ4JlR4KQogRGVmYXVsdCBWYWx1ZTogUmVhZHMgZmxvdyBjb250cm9sIHNldHRpbmdzIGZyb20gdGhlIEVFUFJPTQogCkBAIC0xMjcsNTcgKzEzMSwxMDcgQEAKIAogSW50ZXJydXB0VGhyb3R0bGVSYXRlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub3Qgc3VwcG9ydGVkIG9uIEludGVsIDgyNTQyLCA4MjU0MyBvciA4MjU0NC1iYXNlZCBhZGFwdGVycykKLVZhbGlkIFJhbmdlOiAgIDEwMC0xMDAwMDAgKDA9b2ZmLCAxPWR5bmFtaWMpCi1EZWZhdWx0IFZhbHVlOiA4MDAwCisobm90IHN1cHBvcnRlZCBvbiBJbnRlbChSKSA4MjU0MiwgODI1NDMgb3IgODI1NDQtYmFzZWQgYWRhcHRlcnMpCitWYWxpZCBSYW5nZTogICAwLDEsMywxMDAtMTAwMDAwICgwPW9mZiwgMT1keW5hbWljLCAzPWR5bmFtaWMgY29uc2VydmF0aXZlKQorRGVmYXVsdCBWYWx1ZTogMwogCi1UaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGludGVycnVwdHMgcGVyIHNlY29uZCB0aGUKLWNvbnRyb2xsZXIgZ2VuZXJhdGVzLiBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgaXMgYW5vdGhlciBzZXR0aW5nIHVzZWQgaW4KLWludGVycnVwdCBtb2RlcmF0aW9uLiBEeW5hbWljIG1vZGUgdXNlcyBhIGhldXJpc3RpYyBhbGdvcml0aG0gdG8gYWRqdXN0Ci1JbnRlcnJ1cHRUaHJvdHRsZVJhdGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdHJhZmZpYyBsb2FkLgorVGhlIGRyaXZlciBjYW4gbGltaXQgdGhlIGFtb3VudCBvZiBpbnRlcnJ1cHRzIHBlciBzZWNvbmQgdGhhdCB0aGUgYWRhcHRlcgord2lsbCBnZW5lcmF0ZSBmb3IgaW5jb21pbmcgcGFja2V0cy4gSXQgZG9lcyB0aGlzIGJ5IHdyaXRpbmcgYSB2YWx1ZSB0byB0aGUgCithZGFwdGVyIHRoYXQgaXMgYmFzZWQgb24gdGhlIG1heGltdW0gYW1vdW50IG9mIGludGVycnVwdHMgdGhhdCB0aGUgYWRhcHRlciAKK3dpbGwgZ2VuZXJhdGUgcGVyIHNlY29uZC4KKworU2V0dGluZyBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdG8gYSB2YWx1ZSBncmVhdGVyIG9yIGVxdWFsIHRvIDEwMAord2lsbCBwcm9ncmFtIHRoZSBhZGFwdGVyIHRvIHNlbmQgb3V0IGEgbWF4aW11bSBvZiB0aGF0IG1hbnkgaW50ZXJydXB0cworcGVyIHNlY29uZCwgZXZlbiBpZiBtb3JlIHBhY2tldHMgaGF2ZSBjb21lIGluLiBUaGlzIHJlZHVjZXMgaW50ZXJydXB0Citsb2FkIG9uIHRoZSBzeXN0ZW0gYW5kIGNhbiBsb3dlciBDUFUgdXRpbGl6YXRpb24gdW5kZXIgaGVhdnkgbG9hZCwKK2J1dCB3aWxsIGluY3JlYXNlIGxhdGVuY3kgYXMgcGFja2V0cyBhcmUgbm90IHByb2Nlc3NlZCBhcyBxdWlja2x5LgorCitUaGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgdGhlIGRyaXZlciBwcmV2aW91c2x5IGFzc3VtZWQgYSBzdGF0aWMgCitJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdmFsdWUgb2YgODAwMCwgcHJvdmlkaW5nIGEgZ29vZCBmYWxsYmFjayB2YWx1ZSBmb3IgCithbGwgdHJhZmZpYyB0eXBlcyxidXQgbGFja2luZyBpbiBzbWFsbCBwYWNrZXQgcGVyZm9ybWFuY2UgYW5kIGxhdGVuY3kuIAorVGhlIGhhcmR3YXJlIGNhbiBoYW5kbGUgbWFueSBtb3JlIHNtYWxsIHBhY2tldHMgcGVyIHNlY29uZCBob3dldmVyLCBhbmQgCitmb3IgdGhpcyByZWFzb24gYW4gYWRhcHRpdmUgaW50ZXJydXB0IG1vZGVyYXRpb24gYWxnb3JpdGhtIHdhcyBpbXBsZW1lbnRlZC4KKworU2luY2UgNy4zLngsIHRoZSBkcml2ZXIgaGFzIHR3byBhZGFwdGl2ZSBtb2RlcyAoc2V0dGluZyAxIG9yIDMpIGluIHdoaWNoCitpdCBkeW5hbWljYWxseSBhZGp1c3RzIHRoZSBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdmFsdWUgYmFzZWQgb24gdGhlIHRyYWZmaWMgCit0aGF0IGl0IHJlY2VpdmVzLiBBZnRlciBkZXRlcm1pbmluZyB0aGUgdHlwZSBvZiBpbmNvbWluZyB0cmFmZmljIGluIHRoZSBsYXN0Cit0aW1lZnJhbWUsIGl0IHdpbGwgYWRqdXN0IHRoZSBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUgCitmb3IgdGhhdCB0cmFmZmljLgorCitUaGUgYWxnb3JpdGhtIGNsYXNzaWZpZXMgdGhlIGluY29taW5nIHRyYWZmaWMgZXZlcnkgaW50ZXJ2YWwgaW50bworY2xhc3Nlcy4gIE9uY2UgdGhlIGNsYXNzIGlzIGRldGVybWluZWQsIHRoZSBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdmFsdWUgaXMgCithZGp1c3RlZCB0byBzdWl0IHRoYXQgdHJhZmZpYyB0eXBlIHRoZSBiZXN0LiBUaGVyZSBhcmUgdGhyZWUgY2xhc3NlcyBkZWZpbmVkOiAKKyJCdWxrIHRyYWZmaWMiLCBmb3IgbGFyZ2UgYW1vdW50cyBvZiBwYWNrZXRzIG9mIG5vcm1hbCBzaXplOyAiTG93IGxhdGVuY3kiLAorZm9yIHNtYWxsIGFtb3VudHMgb2YgdHJhZmZpYyBhbmQvb3IgYSBzaWduaWZpY2FudCBwZXJjZW50YWdlIG9mIHNtYWxsCitwYWNrZXRzOyBhbmQgIkxvd2VzdCBsYXRlbmN5IiwgZm9yIGFsbW9zdCBjb21wbGV0ZWx5IHNtYWxsIHBhY2tldHMgb3IgCittaW5pbWFsIHRyYWZmaWMuCisKK0luIGR5bmFtaWMgY29uc2VydmF0aXZlIG1vZGUsIHRoZSBJbnRlcnJ1cHRUaHJvdHRsZVJhdGUgdmFsdWUgaXMgc2V0IHRvIDQwMDAgCitmb3IgdHJhZmZpYyB0aGF0IGZhbGxzIGluIGNsYXNzICJCdWxrIHRyYWZmaWMiLiBJZiB0cmFmZmljIGZhbGxzIGluIHRoZSAiTG93IAorbGF0ZW5jeSIgb3IgIkxvd2VzdCBsYXRlbmN5IiBjbGFzcywgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSBpcyBpbmNyZWFzZWQgCitzdGVwd2lzZSB0byAyMDAwMC4gVGhpcyBkZWZhdWx0IG1vZGUgaXMgc3VpdGFibGUgZm9yIG1vc3QgYXBwbGljYXRpb25zLgorCitGb3Igc2l0dWF0aW9ucyB3aGVyZSBsb3cgbGF0ZW5jeSBpcyB2aXRhbCBzdWNoIGFzIGNsdXN0ZXIgb3IKK2dyaWQgY29tcHV0aW5nLCB0aGUgYWxnb3JpdGhtIGNhbiByZWR1Y2UgbGF0ZW5jeSBldmVuIG1vcmUgd2hlbgorSW50ZXJydXB0VGhyb3R0bGVSYXRlIGlzIHNldCB0byBtb2RlIDEuIEluIHRoaXMgbW9kZSwgd2hpY2ggb3BlcmF0ZXMKK3RoZSBzYW1lIGFzIG1vZGUgMywgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSB3aWxsIGJlIGluY3JlYXNlZCBzdGVwd2lzZSB0byAKKzcwMDAwIGZvciB0cmFmZmljIGluIGNsYXNzICJMb3dlc3QgbGF0ZW5jeSIuCisKK1NldHRpbmcgSW50ZXJydXB0VGhyb3R0bGVSYXRlIHRvIDAgdHVybnMgb2ZmIGFueSBpbnRlcnJ1cHQgbW9kZXJhdGlvbgorYW5kIG1heSBpbXByb3ZlIHNtYWxsIHBhY2tldCBsYXRlbmN5LCBidXQgaXMgZ2VuZXJhbGx5IG5vdCBzdWl0YWJsZQorZm9yIGJ1bGsgdGhyb3VnaHB1dCB0cmFmZmljLgogCiBOT1RFOiAgSW50ZXJydXB0VGhyb3R0bGVSYXRlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgVHhBYnNJbnREZWxheSBhbmQKLSAgICAgICBSeEFic0ludERlbGF5IHBhcmFtZXRlcnMuIEluIG90aGVyIHdvcmRzLCBtaW5pbWl6aW5nIHRoZSByZWNlaXZlCisgICAgICAgUnhBYnNJbnREZWxheSBwYXJhbWV0ZXJzLiAgSW4gb3RoZXIgd29yZHMsIG1pbmltaXppbmcgdGhlIHJlY2VpdmUKICAgICAgICBhbmQvb3IgdHJhbnNtaXQgYWJzb2x1dGUgZGVsYXlzIGRvZXMgbm90IGZvcmNlIHRoZSBjb250cm9sbGVyIHRvCiAgICAgICAgZ2VuZXJhdGUgbW9yZSBpbnRlcnJ1cHRzIHRoYW4gd2hhdCB0aGUgSW50ZXJydXB0IFRocm90dGxlIFJhdGUKICAgICAgICBhbGxvd3MuCiAKLUNBVVRJT046ICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBJbnRlbCBQUk8vMTAwMCBDVCBOZXR3b3JrIENvbm5lY3Rpb24KK0NBVVRJT046ICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBJbnRlbChSKSBQUk8vMTAwMCBDVCBOZXR3b3JrIENvbm5lY3Rpb24KICAgICAgICAgICAoY29udHJvbGxlciA4MjU0NyksIHNldHRpbmcgSW50ZXJydXB0VGhyb3R0bGVSYXRlIHRvIGEgdmFsdWUKICAgICAgICAgICBncmVhdGVyIHRoYW4gNzUsMDAwLCBtYXkgaGFuZyAoc3RvcCB0cmFuc21pdHRpbmcpIGFkYXB0ZXJzCi0gICAgICAgICAgdW5kZXIgY2VydGFpbiBuZXR3b3JrIGNvbmRpdGlvbnMuIElmIHRoaXMgb2NjdXJzIGEgTkVUREVWCi0gICAgICAgICAgV0FUQ0hET0cgbWVzc2FnZSBpcyBsb2dnZWQgaW4gdGhlIHN5c3RlbSBldmVudCBsb2cuIEluCisgICAgICAgICAgdW5kZXIgY2VydGFpbiBuZXR3b3JrIGNvbmRpdGlvbnMuICBJZiB0aGlzIG9jY3VycyBhIE5FVERFVgorICAgICAgICAgIFdBVENIRE9HIG1lc3NhZ2UgaXMgbG9nZ2VkIGluIHRoZSBzeXN0ZW0gZXZlbnQgbG9nLiAgSW4KICAgICAgICAgICBhZGRpdGlvbiwgdGhlIGNvbnRyb2xsZXIgaXMgYXV0b21hdGljYWxseSByZXNldCwgcmVzdG9yaW5nCi0gICAgICAgICAgdGhlIG5ldHdvcmsgY29ubmVjdGlvbi4gVG8gZWxpbWluYXRlIHRoZSBwb3RlbnRpYWwgZm9yIHRoZQorICAgICAgICAgIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24uICBUbyBlbGltaW5hdGUgdGhlIHBvdGVudGlhbCBmb3IgdGhlCiAgICAgICAgICAgaGFuZywgZW5zdXJlIHRoYXQgSW50ZXJydXB0VGhyb3R0bGVSYXRlIGlzIHNldCBubyBncmVhdGVyCiAgICAgICAgICAgdGhhbiA3NSwwMDAgYW5kIGlzIG5vdCBzZXQgdG8gMC4KIAogTk9URTogIFdoZW4gZTEwMDAgaXMgbG9hZGVkIHdpdGggZGVmYXVsdCBzZXR0aW5ncyBhbmQgbXVsdGlwbGUgYWRhcHRlcnMKICAgICAgICBhcmUgaW4gdXNlIHNpbXVsdGFuZW91c2x5LCB0aGUgQ1BVIHV0aWxpemF0aW9uIG1heSBpbmNyZWFzZSBub24tCi0gICAgICAgbGluZWFybHkuIEluIG9yZGVyIHRvIGxpbWl0IHRoZSBDUFUgdXRpbGl6YXRpb24gd2l0aG91dCBpbXBhY3RpbmcKKyAgICAgICBsaW5lYXJseS4gIEluIG9yZGVyIHRvIGxpbWl0IHRoZSBDUFUgdXRpbGl6YXRpb24gd2l0aG91dCBpbXBhY3RpbmcKICAgICAgICB0aGUgb3ZlcmFsbCB0aHJvdWdocHV0LCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgbG9hZCB0aGUgZHJpdmVyIGFzCiAgICAgICAgZm9sbG93czoKIAotICAgICAgICAgICBpbnNtb2QgZTEwMDAubyBJbnRlcnJ1cHRUaHJvdHRsZVJhdGU9MzAwMCwzMDAwLDMwMDAKKyAgICAgICAgICAgbW9kcHJvYmUgZTEwMDAgSW50ZXJydXB0VGhyb3R0bGVSYXRlPTMwMDAsMzAwMCwzMDAwCiAKICAgICAgICBUaGlzIHNldHMgdGhlIEludGVycnVwdFRocm90dGxlUmF0ZSB0byAzMDAwIGludGVycnVwdHMvc2VjIGZvcgotICAgICAgIHRoZSBmaXJzdCwgc2Vjb25kLCBhbmQgdGhpcmQgaW5zdGFuY2VzIG9mIHRoZSBkcml2ZXIuIFRoZSByYW5nZQorICAgICAgIHRoZSBmaXJzdCwgc2Vjb25kLCBhbmQgdGhpcmQgaW5zdGFuY2VzIG9mIHRoZSBkcml2ZXIuICBUaGUgcmFuZ2UKICAgICAgICBvZiAyMDAwIHRvIDMwMDAgaW50ZXJydXB0cyBwZXIgc2Vjb25kIHdvcmtzIG9uIGEgbWFqb3JpdHkgb2YKICAgICAgICBzeXN0ZW1zIGFuZCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQsIGJ1dCB0aGUgb3B0aW1hbCB2YWx1ZSB3aWxsCi0gICAgICAgYmUgcGxhdGZvcm0tc3BlY2lmaWMuIElmIENQVSB1dGlsaXphdGlvbiBpcyBub3QgYSBjb25jZXJuLCB1c2UKKyAgICAgICBiZSBwbGF0Zm9ybS1zcGVjaWZpYy4gIElmIENQVSB1dGlsaXphdGlvbiBpcyBub3QgYSBjb25jZXJuLCB1c2UKICAgICAgICBSWF9QT0xMSU5HIChOQVBJKSBhbmQgZGVmYXVsdCBkcml2ZXIgc2V0dGluZ3MuCiAKIAorCiBSeERlc2NyaXB0b3JzCiAtLS0tLS0tLS0tLS0tCiBWYWxpZCBSYW5nZTogICA4MC0yNTYgZm9yIDgyNTQyIGFuZCA4MjU0My1iYXNlZCBhZGFwdGVycwogICAgICAgICAgICAgICAgODAtNDA5NiBmb3IgYWxsIG90aGVyIHN1cHBvcnRlZCBhZGFwdGVycwogRGVmYXVsdCBWYWx1ZTogMjU2CiAKLVRoaXMgdmFsdWUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQgYnkgdGhlCi1kcml2ZXIuIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSBhbGxvd3MgdGhlIGRyaXZlciB0byBidWZmZXIgbW9yZSBpbmNvbWluZwotcGFja2V0cy4gIEVhY2ggZGVzY3JpcHRvciBpcyAxNiBieXRlcy4gIEEgcmVjZWl2ZSBidWZmZXIgaXMgYWxzbwotYWxsb2NhdGVkIGZvciBlYWNoIGRlc2NyaXB0b3IgYW5kIGlzIDIwNDguCitUaGlzIHZhbHVlIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzIGFsbG9jYXRlZAorYnkgdGhlIGRyaXZlci4gIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSBhbGxvd3MgdGhlIGRyaXZlciB0byBidWZmZXIgbW9yZQoraW5jb21pbmcgcGFja2V0cywgYXQgdGhlIGV4cGVuc2Ugb2YgaW5jcmVhc2VkIHN5c3RlbSBtZW1vcnkgdXRpbGl6YXRpb24uCisKK0VhY2ggZGVzY3JpcHRvciBpcyAxNiBieXRlcy4gIEEgcmVjZWl2ZSBidWZmZXIgaXMgYWxzbyBhbGxvY2F0ZWQgZm9yIGVhY2gKK2Rlc2NyaXB0b3IgYW5kIGNhbiBiZSBlaXRoZXIgMjA0OCwgNDA5NiwgODE5Miwgb3IgMTYzODQgYnl0ZXMsIGRlcGVuZGluZyAKK29uIHRoZSBNVFUgc2V0dGluZy4gVGhlIG1heGltdW0gTVRVIHNpemUgaXMgMTYxMTAuCisKK05PVEU6ICBNVFUgZGVzaWduYXRlcyB0aGUgZnJhbWUgc2l6ZS4gIEl0IG9ubHkgbmVlZHMgdG8gYmUgc2V0IGZvciBKdW1ibyAKKyAgICAgICBGcmFtZXMuICBEZXBlbmRpbmcgb24gdGhlIGF2YWlsYWJsZSBzeXN0ZW0gcmVzb3VyY2VzLCB0aGUgcmVxdWVzdCAKKyAgICAgICBmb3IgYSBoaWdoZXIgbnVtYmVyIG9mIHJlY2VpdmUgZGVzY3JpcHRvcnMgbWF5IGJlIGRlbmllZC4gIEluIHRoaXMgCisgICAgICAgY2FzZSwgdXNlIGEgbG93ZXIgbnVtYmVyLgogCiAKIFJ4SW50RGVsYXkKQEAgLTE4NywxNyArMjQxLDE3IEBACiAKIFRoaXMgdmFsdWUgZGVsYXlzIHRoZSBnZW5lcmF0aW9uIG9mIHJlY2VpdmUgaW50ZXJydXB0cyBpbiB1bml0cyBvZiAxLjAyNAogbWljcm9zZWNvbmRzLiAgUmVjZWl2ZSBpbnRlcnJ1cHQgcmVkdWN0aW9uIGNhbiBpbXByb3ZlIENQVSBlZmZpY2llbmN5IGlmCi1wcm9wZXJseSB0dW5lZCBmb3Igc3BlY2lmaWMgbmV0d29yayB0cmFmZmljLiBJbmNyZWFzaW5nIHRoaXMgdmFsdWUgYWRkcworcHJvcGVybHkgdHVuZWQgZm9yIHNwZWNpZmljIG5ldHdvcmsgdHJhZmZpYy4gIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSBhZGRzCiBleHRyYSBsYXRlbmN5IHRvIGZyYW1lIHJlY2VwdGlvbiBhbmQgY2FuIGVuZCB1cCBkZWNyZWFzaW5nIHRoZSB0aHJvdWdocHV0Ci1vZiBUQ1AgdHJhZmZpYy4gSWYgdGhlIHN5c3RlbSBpcyByZXBvcnRpbmcgZHJvcHBlZCByZWNlaXZlcywgdGhpcyB2YWx1ZQorb2YgVENQIHRyYWZmaWMuICBJZiB0aGUgc3lzdGVtIGlzIHJlcG9ydGluZyBkcm9wcGVkIHJlY2VpdmVzLCB0aGlzIHZhbHVlCiBtYXkgYmUgc2V0IHRvbyBoaWdoLCBjYXVzaW5nIHRoZSBkcml2ZXIgdG8gcnVuIG91dCBvZiBhdmFpbGFibGUgcmVjZWl2ZQogZGVzY3JpcHRvcnMuCiAKIENBVVRJT046ICBXaGVuIHNldHRpbmcgUnhJbnREZWxheSB0byBhIHZhbHVlIG90aGVyIHRoYW4gMCwgYWRhcHRlcnMgbWF5Ci0gICAgICAgICAgaGFuZyAoc3RvcCB0cmFuc21pdHRpbmcpIHVuZGVyIGNlcnRhaW4gbmV0d29yayBjb25kaXRpb25zLiBJZgorICAgICAgICAgIGhhbmcgKHN0b3AgdHJhbnNtaXR0aW5nKSB1bmRlciBjZXJ0YWluIG5ldHdvcmsgY29uZGl0aW9ucy4gIElmCiAgICAgICAgICAgdGhpcyBvY2N1cnMgYSBORVRERVYgV0FUQ0hET0cgbWVzc2FnZSBpcyBsb2dnZWQgaW4gdGhlIHN5c3RlbQotICAgICAgICAgIGV2ZW50IGxvZy4gSW4gYWRkaXRpb24sIHRoZSBjb250cm9sbGVyIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQsCi0gICAgICAgICAgcmVzdG9yaW5nIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24uIFRvIGVsaW1pbmF0ZSB0aGUgcG90ZW50aWFsCisgICAgICAgICAgZXZlbnQgbG9nLiAgSW4gYWRkaXRpb24sIHRoZSBjb250cm9sbGVyIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQsCisgICAgICAgICAgcmVzdG9yaW5nIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24uICBUbyBlbGltaW5hdGUgdGhlIHBvdGVudGlhbAogICAgICAgICAgIGZvciB0aGUgaGFuZyBlbnN1cmUgdGhhdCBSeEludERlbGF5IGlzIHNldCB0byAwLgogCiAKQEAgLTIwOCw3ICsyNjIsNyBAQAogRGVmYXVsdCBWYWx1ZTogMTI4CiAKIFRoaXMgdmFsdWUsIGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcywgbGltaXRzIHRoZSBkZWxheSBpbiB3aGljaCBhCi1yZWNlaXZlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQuIFVzZWZ1bCBvbmx5IGlmIFJ4SW50RGVsYXkgaXMgbm9uLXplcm8sCityZWNlaXZlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQuICBVc2VmdWwgb25seSBpZiBSeEludERlbGF5IGlzIG5vbi16ZXJvLAogdGhpcyB2YWx1ZSBlbnN1cmVzIHRoYXQgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBhZnRlciB0aGUgaW5pdGlhbAogcGFja2V0IGlzIHJlY2VpdmVkIHdpdGhpbiB0aGUgc2V0IGFtb3VudCBvZiB0aW1lLiAgUHJvcGVyIHR1bmluZywKIGFsb25nIHdpdGggUnhJbnREZWxheSwgbWF5IGltcHJvdmUgdHJhZmZpYyB0aHJvdWdocHV0IGluIHNwZWNpZmljIG5ldHdvcmsKQEAgLTIyMiw5ICsyNzYsOSBAQAogRGVmYXVsdCBWYWx1ZTogIDAgKGF1dG8tbmVnb3RpYXRlIGF0IGFsbCBzdXBwb3J0ZWQgc3BlZWRzKQogCiBTcGVlZCBmb3JjZXMgdGhlIGxpbmUgc3BlZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiBtZWdhYml0cyBwZXIgc2Vjb25kCi0oTWJwcykuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvIDAgYW5kIHRoZSBsaW5rCisoTWJwcykuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0byAwIGFuZCB0aGUgbGluawogcGFydG5lciBpcyBzZXQgdG8gYXV0by1uZWdvdGlhdGUsIHRoZSBib2FyZCB3aWxsIGF1dG8tZGV0ZWN0IHRoZSBjb3JyZWN0Ci1zcGVlZC4gRHVwbGV4IHNob3VsZCBhbHNvIGJlIHNldCB3aGVuIFNwZWVkIGlzIHNldCB0byBlaXRoZXIgMTAgb3IgMTAwLgorc3BlZWQuICBEdXBsZXggc2hvdWxkIGFsc28gYmUgc2V0IHdoZW4gU3BlZWQgaXMgc2V0IHRvIGVpdGhlciAxMCBvciAxMDAuCiAKIAogVHhEZXNjcmlwdG9ycwpAQCAtMjM0LDcgKzI4OCw3IEBACiBEZWZhdWx0IFZhbHVlOiAyNTYKIAogVGhpcyB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRyYW5zbWl0IGRlc2NyaXB0b3JzIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyLgotSW5jcmVhc2luZyB0aGlzIHZhbHVlIGFsbG93cyB0aGUgZHJpdmVyIHRvIHF1ZXVlIG1vcmUgdHJhbnNtaXRzLiBFYWNoCitJbmNyZWFzaW5nIHRoaXMgdmFsdWUgYWxsb3dzIHRoZSBkcml2ZXIgdG8gcXVldWUgbW9yZSB0cmFuc21pdHMuICBFYWNoCiBkZXNjcmlwdG9yIGlzIDE2IGJ5dGVzLgogCiBOT1RFOiAgRGVwZW5kaW5nIG9uIHRoZSBhdmFpbGFibGUgc3lzdGVtIHJlc291cmNlcywgdGhlIHJlcXVlc3QgZm9yIGEKQEAgLTI0OCw4ICszMDIsOCBAQAogRGVmYXVsdCBWYWx1ZTogNjQKIAogVGhpcyB2YWx1ZSBkZWxheXMgdGhlIGdlbmVyYXRpb24gb2YgdHJhbnNtaXQgaW50ZXJydXB0cyBpbiB1bml0cyBvZgotMS4wMjQgbWljcm9zZWNvbmRzLiBUcmFuc21pdCBpbnRlcnJ1cHQgcmVkdWN0aW9uIGNhbiBpbXByb3ZlIENQVQotZWZmaWNpZW5jeSBpZiBwcm9wZXJseSB0dW5lZCBmb3Igc3BlY2lmaWMgbmV0d29yayB0cmFmZmljLiBJZiB0aGUKKzEuMDI0IG1pY3Jvc2Vjb25kcy4gIFRyYW5zbWl0IGludGVycnVwdCByZWR1Y3Rpb24gY2FuIGltcHJvdmUgQ1BVCitlZmZpY2llbmN5IGlmIHByb3Blcmx5IHR1bmVkIGZvciBzcGVjaWZpYyBuZXR3b3JrIHRyYWZmaWMuICBJZiB0aGUKIHN5c3RlbSBpcyByZXBvcnRpbmcgZHJvcHBlZCB0cmFuc21pdHMsIHRoaXMgdmFsdWUgbWF5IGJlIHNldCB0b28gaGlnaAogY2F1c2luZyB0aGUgZHJpdmVyIHRvIHJ1biBvdXQgb2YgYXZhaWxhYmxlIHRyYW5zbWl0IGRlc2NyaXB0b3JzLgogCkBAIC0yNjEsNyArMzE1LDcgQEAKIERlZmF1bHQgVmFsdWU6IDY0CiAKIFRoaXMgdmFsdWUsIGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcywgbGltaXRzIHRoZSBkZWxheSBpbiB3aGljaCBhCi10cmFuc21pdCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkLiBVc2VmdWwgb25seSBpZiBUeEludERlbGF5IGlzIG5vbi16ZXJvLAordHJhbnNtaXQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZC4gIFVzZWZ1bCBvbmx5IGlmIFR4SW50RGVsYXkgaXMgbm9uLXplcm8sCiB0aGlzIHZhbHVlIGVuc3VyZXMgdGhhdCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGFmdGVyIHRoZSBpbml0aWFsCiBwYWNrZXQgaXMgc2VudCBvbiB0aGUgd2lyZSB3aXRoaW4gdGhlIHNldCBhbW91bnQgb2YgdGltZS4gIFByb3BlciB0dW5pbmcsCiBhbG9uZyB3aXRoIFR4SW50RGVsYXksIG1heSBpbXByb3ZlIHRyYWZmaWMgdGhyb3VnaHB1dCBpbiBzcGVjaWZpYwpAQCAtMjg4LDE1ICszNDIsMTUgQEAKIAogRm9yIGNvcHBlci1iYXNlZCBib2FyZHMsIHRoZSBrZXl3b3JkcyBpbnRlcmFjdCBhcyBmb2xsb3dzOgogCi0gIFRoZSBkZWZhdWx0IG9wZXJhdGlvbiBpcyBhdXRvLW5lZ290aWF0ZS4gVGhlIGJvYXJkIGFkdmVydGlzZXMgYWxsCisgIFRoZSBkZWZhdWx0IG9wZXJhdGlvbiBpcyBhdXRvLW5lZ290aWF0ZS4gIFRoZSBib2FyZCBhZHZlcnRpc2VzIGFsbAogICBzdXBwb3J0ZWQgc3BlZWQgYW5kIGR1cGxleCBjb21iaW5hdGlvbnMsIGFuZCBpdCBsaW5rcyBhdCB0aGUgaGlnaGVzdAogICBjb21tb24gc3BlZWQgYW5kIGR1cGxleCBtb2RlIElGIHRoZSBsaW5rIHBhcnRuZXIgaXMgc2V0IHRvIGF1dG8tbmVnb3RpYXRlLgogCiAgIElmIFNwZWVkID0gMTAwMCwgbGltaXRlZCBhdXRvLW5lZ290aWF0aW9uIGlzIGVuYWJsZWQgYW5kIG9ubHkgMTAwMCBNYnBzCiAgIGlzIGFkdmVydGlzZWQgKFRoZSAxMDAwQmFzZVQgc3BlYyByZXF1aXJlcyBhdXRvLW5lZ290aWF0aW9uLikKIAotICBJZiBTcGVlZCA9IDEwIG9yIDEwMCwgdGhlbiBib3RoIFNwZWVkIGFuZCBEdXBsZXggc2hvdWxkIGJlIHNldC4gQXV0by0KLSAgbmVnb3RpYXRpb24gaXMgZGlzYWJsZWQsIGFuZCB0aGUgQXV0b05lZyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gUGFydG5lcgorICBJZiBTcGVlZCA9IDEwIG9yIDEwMCwgdGhlbiBib3RoIFNwZWVkIGFuZCBEdXBsZXggc2hvdWxkIGJlIHNldC4gIEF1dG8tCisgIG5lZ290aWF0aW9uIGlzIGRpc2FibGVkLCBhbmQgdGhlIEF1dG9OZWcgcGFyYW1ldGVyIGlzIGlnbm9yZWQuICBQYXJ0bmVyCiAgIFNIT1VMRCBhbHNvIGJlIGZvcmNlZC4KIAogVGhlIEF1dG9OZWcgcGFyYW1ldGVyIGlzIHVzZWQgd2hlbiBtb3JlIGNvbnRyb2wgaXMgcmVxdWlyZWQgb3ZlciB0aGUKQEAgLTMwNCw3ICszNTgsNyBAQAogc3BlZWQgYW5kIGR1cGxleCBjb21iaW5hdGlvbnMgYXJlIGFkdmVydGlzZWQgZHVyaW5nIHRoZSBhdXRvLW5lZ290aWF0aW9uCiBwcm9jZXNzLgogCi1UaGUgcGFyYW1ldGVyIG1heSBiZSBzcGVjaWZpZWQgYXMgZWl0aGVyIGEgZGVjaW1hbCBvciBoZXhpZGVjaW1hbCB2YWx1ZSBhcworVGhlIHBhcmFtZXRlciBtYXkgYmUgc3BlY2lmaWVkIGFzIGVpdGhlciBhIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwgdmFsdWUgYXMKIGRldGVybWluZWQgYnkgdGhlIGJpdG1hcCBiZWxvdy4KIAogQml0IHBvc2l0aW9uICAgNyAgICAgIDYgICAgICA1ICAgICAgIDQgICAgICAgMyAgICAgIDIgICAgICAxICAgICAgIDAKQEAgLTMzNywyMCArMzkxLDE5IEBACiAKICAgQ29uZmlndXJpbmcgdGhlIERyaXZlciBvbiBEaWZmZXJlbnQgRGlzdHJpYnV0aW9ucwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KICAgQ29uZmlndXJpbmcgYSBuZXR3b3JrIGRyaXZlciB0byBsb2FkIHByb3Blcmx5IHdoZW4gdGhlIHN5c3RlbSBpcyBzdGFydGVkCi0gIGlzIGRpc3RyaWJ1dGlvbiBkZXBlbmRlbnQuIFR5cGljYWxseSwgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyBpbnZvbHZlcworICBpcyBkaXN0cmlidXRpb24gZGVwZW5kZW50LiAgVHlwaWNhbGx5LCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzIGludm9sdmVzCiAgIGFkZGluZyBhbiBhbGlhcyBsaW5lIHRvIC9ldGMvbW9kdWxlcy5jb25mIG9yIC9ldGMvbW9kcHJvYmUuY29uZiBhcyB3ZWxsCi0gIGFzIGVkaXRpbmcgb3RoZXIgc3lzdGVtIHN0YXJ0dXAgc2NyaXB0cyBhbmQvb3IgY29uZmlndXJhdGlvbiBmaWxlcy4gTWFueQorICBhcyBlZGl0aW5nIG90aGVyIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMgYW5kL29yIGNvbmZpZ3VyYXRpb24gZmlsZXMuICBNYW55CiAgIHBvcHVsYXIgTGludXggZGlzdHJpYnV0aW9ucyBzaGlwIHdpdGggdG9vbHMgdG8gbWFrZSB0aGVzZSBjaGFuZ2VzIGZvciB5b3UuCiAgIFRvIGxlYXJuIHRoZSBwcm9wZXIgd2F5IHRvIGNvbmZpZ3VyZSBhIG5ldHdvcmsgZGV2aWNlIGZvciB5b3VyIHN5c3RlbSwKLSAgcmVmZXIgdG8geW91ciBkaXN0cmlidXRpb24gZG9jdW1lbnRhdGlvbi4gSWYgZHVyaW5nIHRoaXMgcHJvY2VzcyB5b3UgYXJlCisgIHJlZmVyIHRvIHlvdXIgZGlzdHJpYnV0aW9uIGRvY3VtZW50YXRpb24uICBJZiBkdXJpbmcgdGhpcyBwcm9jZXNzIHlvdSBhcmUKICAgYXNrZWQgZm9yIHRoZSBkcml2ZXIgb3IgbW9kdWxlIG5hbWUsIHRoZSBuYW1lIGZvciB0aGUgTGludXggQmFzZSBEcml2ZXIKLSAgZm9yIHRoZSBJbnRlbCBQUk8vMTAwMCBGYW1pbHkgb2YgQWRhcHRlcnMgaXMgZTEwMDAuCisgIGZvciB0aGUgSW50ZWwoUikgUFJPLzEwMDAgRmFtaWx5IG9mIEFkYXB0ZXJzIGlzIGUxMDAwLgogCiAgIEFzIGFuIGV4YW1wbGUsIGlmIHlvdSBpbnN0YWxsIHRoZSBlMTAwMCBkcml2ZXIgZm9yIHR3byBQUk8vMTAwMCBhZGFwdGVycwogICAoZXRoMCBhbmQgZXRoMSkgYW5kIHNldCB0aGUgc3BlZWQgYW5kIGR1cGxleCB0byAxMGZ1bGwgYW5kIDEwMGhhbGYsIGFkZAotICB0aGUgZm9sbG93aW5nIHRvIG1vZHVsZXMuY29uZiBvciBtb2Rwcm9iZS5jb25mOgorICB0aGUgZm9sbG93aW5nIHRvIG1vZHVsZXMuY29uZiBvciBvciBtb2Rwcm9iZS5jb25mOgogCiAgICAgICAgYWxpYXMgZXRoMCBlMTAwMAogICAgICAgIGFsaWFzIGV0aDEgZTEwMDAKQEAgLTM1OCw5ICs0MTEsOCBAQAogCiAgIFZpZXdpbmcgTGluayBNZXNzYWdlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogICBMaW5rIG1lc3NhZ2VzIHdpbGwgbm90IGJlIGRpc3BsYXllZCB0byB0aGUgY29uc29sZSBpZiB0aGUgZGlzdHJpYnV0aW9uIGlzCi0gIHJlc3RyaWN0aW5nIHN5c3RlbSBtZXNzYWdlcy4gSW4gb3JkZXIgdG8gc2VlIG5ldHdvcmsgZHJpdmVyIGxpbmsgbWVzc2FnZXMKKyAgcmVzdHJpY3Rpbmcgc3lzdGVtIG1lc3NhZ2VzLiAgSW4gb3JkZXIgdG8gc2VlIG5ldHdvcmsgZHJpdmVyIGxpbmsgbWVzc2FnZXMKICAgb24geW91ciBjb25zb2xlLCBzZXQgZG1lc2cgdG8gZWlnaHQgYnkgZW50ZXJpbmcgdGhlIGZvbGxvd2luZzoKIAogICAgICAgIGRtZXNnIC1uIDgKQEAgLTM2OSwxMSArNDIxLDkgQEAKIAogICBKdW1ibyBGcmFtZXMKICAgLS0tLS0tLS0tLS0tCi0KLSAgVGhlIGRyaXZlciBzdXBwb3J0cyBKdW1ibyBGcmFtZXMgZm9yIGFsbCBhZGFwdGVycyBleGNlcHQgODI1NDIgYW5kCi0gIDgyNTczLWJhc2VkIGFkYXB0ZXJzLiBKdW1ibyBGcmFtZXMgc3VwcG9ydCBpcyBlbmFibGVkIGJ5IGNoYW5naW5nIHRoZQotICBNVFUgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUgZGVmYXVsdCBvZiAxNTAwLiBVc2UgdGhlIGlmY29uZmlnIGNvbW1hbmQKLSAgdG8gaW5jcmVhc2UgdGhlIE1UVSBzaXplLiBGb3IgZXhhbXBsZToKKyAgSnVtYm8gRnJhbWVzIHN1cHBvcnQgaXMgZW5hYmxlZCBieSBjaGFuZ2luZyB0aGUgTVRVIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4KKyAgdGhlIGRlZmF1bHQgb2YgMTUwMC4gIFVzZSB0aGUgaWZjb25maWcgY29tbWFuZCB0byBpbmNyZWFzZSB0aGUgTVRVIHNpemUuCisgIEZvciBleGFtcGxlOgogCiAgICAgICAgaWZjb25maWcgZXRoPHg+IG10dSA5MDAwIHVwCiAKQEAgLTM5MCwyNiArNDQwLDQ5IEBACiAKICAgLSBUbyBlbmFibGUgSnVtYm8gRnJhbWVzLCBpbmNyZWFzZSB0aGUgTVRVIHNpemUgb24gdGhlIGludGVyZmFjZSBiZXlvbmQKICAgICAxNTAwLgotICAtIFRoZSBtYXhpbXVtIE1UVSBzZXR0aW5nIGZvciBKdW1ibyBGcmFtZXMgaXMgMTYxMTAuIFRoaXMgdmFsdWUgY29pbmNpZGVzCisKKyAgLSBUaGUgbWF4aW11bSBNVFUgc2V0dGluZyBmb3IgSnVtYm8gRnJhbWVzIGlzIDE2MTEwLiAgVGhpcyB2YWx1ZSBjb2luY2lkZXMKICAgICB3aXRoIHRoZSBtYXhpbXVtIEp1bWJvIEZyYW1lcyBzaXplIG9mIDE2MTI4LgorCiAgIC0gVXNpbmcgSnVtYm8gRnJhbWVzIGF0IDEwIG9yIDEwMCBNYnBzIG1heSByZXN1bHQgaW4gcG9vciBwZXJmb3JtYW5jZSBvcgogICAgIGxvc3Mgb2YgbGluay4KKwogICAtIFNvbWUgSW50ZWwgZ2lnYWJpdCBhZGFwdGVycyB0aGF0IHN1cHBvcnQgSnVtYm8gRnJhbWVzIGhhdmUgYSBmcmFtZSBzaXplCiAgICAgbGltaXQgb2YgOTIzOCBieXRlcywgd2l0aCBhIGNvcnJlc3BvbmRpbmcgTVRVIHNpemUgbGltaXQgb2YgOTIxNiBieXRlcy4KLSAgICBUaGUgYWRhcHRlcnMgd2l0aCB0aGlzIGxpbWl0YXRpb24gYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCA4MjU3MUVCIGFuZAotICAgIDgyNTcyRUkgY29udHJvbGxlcnMsIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlc2UgcHJvZHVjdCBuYW1lczoKLSAgICAgSW50ZWyuIFBSTy8xMDAwIFBUIER1YWwgUG9ydCBTZXJ2ZXIgQWRhcHRlcgotICAgICBJbnRlbK4gUFJPLzEwMDAgUEYgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCi0gICAgIEludGVsriBQUk8vMTAwMCBQVCBTZXJ2ZXIgQWRhcHRlcgotICAgICBJbnRlbK4gUFJPLzEwMDAgUFQgRGVza3RvcCBBZGFwdGVyCi0gICAgIEludGVsriBQUk8vMTAwMCBQRiBTZXJ2ZXIgQWRhcHRlcgorICAgIFRoZSBhZGFwdGVycyB3aXRoIHRoaXMgbGltaXRhdGlvbiBhcmUgYmFzZWQgb24gdGhlIEludGVsKFIpIDgyNTcxRUIsCisgICAgODI1NzJFSSwgODI1NzNMIGFuZCA4MDAwM0VTMkxBTiBjb250cm9sbGVyLiAgVGhlc2UgY29ycmVzcG9uZCB0byB0aGUKKyAgICBmb2xsb3dpbmcgcHJvZHVjdCBuYW1lczoKKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgUFQgU2VydmVyIEFkYXB0ZXIKKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgUFQgRGVza3RvcCBBZGFwdGVyCisgICAgIEludGVsKFIpIFBSTy8xMDAwIFBUIE5ldHdvcmsgQ29ubmVjdGlvbgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQVCBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgUFQgRHVhbCBQb3J0IE5ldHdvcmsgQ29ubmVjdGlvbgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQRiBTZXJ2ZXIgQWRhcHRlcgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQRiBOZXR3b3JrIENvbm5lY3Rpb24KKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgUEYgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCisgICAgIEludGVsKFIpIFBSTy8xMDAwIFBCIFNlcnZlciBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIFBSTy8xMDAwIFBMIE5ldHdvcmsgQ29ubmVjdGlvbgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBFQiBOZXR3b3JrIENvbm5lY3Rpb24gd2l0aCBJL08gQWNjZWxlcmF0aW9uCisgICAgIEludGVsKFIpIFBSTy8xMDAwIEVCIEJhY2twbGFuZSBDb25uZWN0aW9uIHdpdGggSS9PIEFjY2VsZXJhdGlvbgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQVCBRdWFkIFBvcnQgU2VydmVyIEFkYXB0ZXIKIAotICAtIFRoZSBJbnRlbCBQUk8vMTAwMCBQTSBOZXR3b3JrIENvbm5lY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBqdW1ibyBmcmFtZXMuCisgIC0gQWRhcHRlcnMgYmFzZWQgb24gdGhlIEludGVsKFIpIDgyNTQyIGFuZCA4MjU3M1YvRSBjb250cm9sbGVyIGRvIG5vdAorICAgIHN1cHBvcnQgSnVtYm8gRnJhbWVzLiBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBmb2xsb3dpbmcgcHJvZHVjdCBuYW1lczoKKyAgICAgSW50ZWwoUikgUFJPLzEwMDAgR2lnYWJpdCBTZXJ2ZXIgQWRhcHRlcgorICAgICBJbnRlbChSKSBQUk8vMTAwMCBQTSBOZXR3b3JrIENvbm5lY3Rpb24KKworICAtIFRoZSBmb2xsb3dpbmcgYWRhcHRlcnMgZG8gbm90IHN1cHBvcnQgSnVtYm8gRnJhbWVzOgorICAgICBJbnRlbChSKSA4MjU2MlYgMTAvMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgorICAgICBJbnRlbChSKSA4MjU2NkRNIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIDgyNTY2REMgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KKyAgICAgSW50ZWwoUikgODI1NjZNTSBHaWdhYml0IE5ldHdvcmsgQ29ubmVjdGlvbgorICAgICBJbnRlbChSKSA4MjU2Nk1DIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCisgICAgIEludGVsKFIpIDgyNTYyR1QgMTAvMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgorICAgICBJbnRlbChSKSA4MjU2MkcgMTAvMTAwIE5ldHdvcmsgQ29ubmVjdGlvbgogCiAKICAgRXRodG9vbAogICAtLS0tLS0tCi0KICAgVGhlIGRyaXZlciB1dGlsaXplcyB0aGUgZXRodG9vbCBpbnRlcmZhY2UgZm9yIGRyaXZlciBjb25maWd1cmF0aW9uIGFuZAogICBkaWFnbm9zdGljcywgYXMgd2VsbCBhcyBkaXNwbGF5aW5nIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uLiAgRXRodG9vbAogICB2ZXJzaW9uIDEuNiBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5LgpAQCAtNDE3LDE1ICs0OTAsMTQgQEAKICAgVGhlIGxhdGVzdCByZWxlYXNlIG9mIGV0aHRvb2wgY2FuIGJlIGZvdW5kIGZyb20KICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9na2VybmVsLgogCi0gIE5PVEU6IEV0aHRvb2wgMS42IG9ubHkgc3VwcG9ydHMgYSBsaW1pdGVkIHNldCBvZiBldGh0b29sIG9wdGlvbnMuIFN1cHBvcnQKKyAgTk9URTogRXRodG9vbCAxLjYgb25seSBzdXBwb3J0cyBhIGxpbWl0ZWQgc2V0IG9mIGV0aHRvb2wgb3B0aW9ucy4gIFN1cHBvcnQKICAgZm9yIGEgbW9yZSBjb21wbGV0ZSBldGh0b29sIGZlYXR1cmUgc2V0IGNhbiBiZSBlbmFibGVkIGJ5IHVwZ3JhZGluZwogICBldGh0b29sIHRvIGV0aHRvb2wtMS44LjEuCiAKICAgRW5hYmxpbmcgV2FrZSBvbiBMQU4qIChXb0wpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFdvTCBpcyBjb25maWd1cmVkIHRocm91Z2ggdGhlIEV0aHRvb2wqIHV0aWxpdHkuIEV0aHRvb2wgaXMgaW5jbHVkZWQgd2l0aAotICBhbGwgdmVyc2lvbnMgb2YgUmVkIEhhdCBhZnRlciBSZWQgSGF0IDcuMi4gRm9yIG90aGVyIExpbnV4IGRpc3RyaWJ1dGlvbnMsCisgIFdvTCBpcyBjb25maWd1cmVkIHRocm91Z2ggdGhlIEV0aHRvb2wqIHV0aWxpdHkuICBFdGh0b29sIGlzIGluY2x1ZGVkIHdpdGgKKyAgYWxsIHZlcnNpb25zIG9mIFJlZCBIYXQgYWZ0ZXIgUmVkIEhhdCA3LjIuICBGb3Igb3RoZXIgTGludXggZGlzdHJpYnV0aW9ucywKICAgZG93bmxvYWQgYW5kIGluc3RhbGwgRXRodG9vbCBmcm9tIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9na2VybmVsLgogCkBAIC00MzYsMTEgKzUwOCwxNyBAQAogICBGb3IgdGhpcyBkcml2ZXIgdmVyc2lvbiwgaW4gb3JkZXIgdG8gZW5hYmxlIFdvTCwgdGhlIGUxMDAwIGRyaXZlciBtdXN0IGJlCiAgIGxvYWRlZCB3aGVuIHNodXR0aW5nIGRvd24gb3IgcmVib290aW5nIHRoZSBzeXN0ZW0uCiAKKyAgV2FrZSBPbiBMQU4gaXMgb25seSBzdXBwb3J0ZWQgb24gcG9ydCBBIGZvciB0aGUgZm9sbG93aW5nIGRldmljZXM6CisgIEludGVsKFIpIFBSTy8xMDAwIFBUIER1YWwgUG9ydCBOZXR3b3JrIENvbm5lY3Rpb24KKyAgSW50ZWwoUikgUFJPLzEwMDAgUFQgRHVhbCBQb3J0IFNlcnZlciBDb25uZWN0aW9uCisgIEludGVsKFIpIFBSTy8xMDAwIFBUIER1YWwgUG9ydCBTZXJ2ZXIgQWRhcHRlcgorICBJbnRlbChSKSBQUk8vMTAwMCBQRiBEdWFsIFBvcnQgU2VydmVyIEFkYXB0ZXIKKyAgSW50ZWwoUikgUFJPLzEwMDAgUFQgUXVhZCBQb3J0IFNlcnZlciBBZGFwdGVyIAorCiAgIE5BUEkKICAgLS0tLQotCi0gIE5BUEkgKFJ4IHBvbGxpbmcgbW9kZSkgaXMgc3VwcG9ydGVkIGluIHRoZSBlMTAwMCBkcml2ZXIuIE5BUEkgaXMgZW5hYmxlZAotICBvciBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUga2VybmVsLiBUbyBvdmVycmlkZQorICBOQVBJIChSeCBwb2xsaW5nIG1vZGUpIGlzIHN1cHBvcnRlZCBpbiB0aGUgZTEwMDAgZHJpdmVyLiAgTkFQSSBpcyBlbmFibGVkCisgIG9yIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBrZXJuZWwuICBUbyBvdmVycmlkZQogICB0aGUgZGVmYXVsdCwgdXNlIHRoZSBmb2xsb3dpbmcgY29tcGlsZS10aW1lIGZsYWdzLgogCiAgIFRvIGVuYWJsZSBOQVBJLCBjb21waWxlIHRoZSBkcml2ZXIgbW9kdWxlLCBwYXNzaW5nIGluIGEgY29uZmlndXJhdGlvbiBvcHRpb246CkBAIC00NTcsODggKzUzNSwxMDUgQEAKIEtub3duIElzc3VlcwogPT09PT09PT09PT09CiAKLSAgSnVtYm8gRnJhbWVzIFN5c3RlbSBSZXF1aXJlbWVudAotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEcm9wcGVkIFJlY2VpdmUgUGFja2V0cyBvbiBIYWxmLWR1cGxleCAxMC8xMDAgTmV0d29ya3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSWYgeW91IGhhdmUgYW4gSW50ZWwgUENJIEV4cHJlc3MgYWRhcHRlciBydW5uaW5nIGF0IDEwbWJwcyBvciAxMDBtYnBzLCBoYWxmLQorZHVwbGV4LCB5b3UgbWF5IG9ic2VydmUgb2NjYXNpb25hbCBkcm9wcGVkIHJlY2VpdmUgcGFja2V0cy4gIFRoZXJlIGFyZSBubword29ya2Fyb3VuZHMgZm9yIHRoaXMgcHJvYmxlbSBpbiB0aGlzIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gIFRoZSBuZXR3b3JrIG11c3QKK2JlIHVwZGF0ZWQgdG8gb3BlcmF0ZSBpbiBmdWxsLWR1cGxleCwgYW5kL29yIDEwMDBtYnBzIG9ubHkuCiAKLSAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMgaGF2ZSBiZWVuIG9ic2VydmVkIG9uIExpbnV4IHN5c3RlbXMgd2l0aCA2NCBNQgotICBvZiBSQU0gb3IgbGVzcyB0aGF0IGFyZSBydW5uaW5nIEp1bWJvIEZyYW1lcy4gSWYgeW91IGFyZSB1c2luZyBKdW1ibwotICBGcmFtZXMsIHlvdXIgc3lzdGVtIG1heSByZXF1aXJlIG1vcmUgdGhhbiB0aGUgYWR2ZXJ0aXNlZCBtaW5pbXVtCi0gIHJlcXVpcmVtZW50IG9mIDY0IE1CIG9mIHN5c3RlbSBtZW1vcnkuCitKdW1ibyBGcmFtZXMgU3lzdGVtIFJlcXVpcmVtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcyBoYXZlIGJlZW4gb2JzZXJ2ZWQgb24gTGludXggc3lzdGVtcyB3aXRoIDY0IE1CCitvZiBSQU0gb3IgbGVzcyB0aGF0IGFyZSBydW5uaW5nIEp1bWJvIEZyYW1lcy4gIElmIHlvdSBhcmUgdXNpbmcgSnVtYm8KK0ZyYW1lcywgeW91ciBzeXN0ZW0gbWF5IHJlcXVpcmUgbW9yZSB0aGFuIHRoZSBhZHZlcnRpc2VkIG1pbmltdW0KK3JlcXVpcmVtZW50IG9mIDY0IE1CIG9mIHN5c3RlbSBtZW1vcnkuCiAKLSAgUGVyZm9ybWFuY2UgRGVncmFkYXRpb24gd2l0aCBKdW1ibyBGcmFtZXMKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BlcmZvcm1hbmNlIERlZ3JhZGF0aW9uIHdpdGggSnVtYm8gRnJhbWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRGVncmFkYXRpb24gaW4gdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSBtYXkgYmUgb2JzZXJ2ZWQgaW4gc29tZSBKdW1ibyBmcmFtZXMKK2Vudmlyb25tZW50cy4gIElmIHRoaXMgaXMgb2JzZXJ2ZWQsIGluY3JlYXNpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc29ja2V0CitidWZmZXIgc2l6ZSBhbmQvb3IgaW5jcmVhc2luZyB0aGUgL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF8qbWVtIGVudHJ5IHZhbHVlcworbWF5IGhlbHAuICBTZWUgdGhlIHNwZWNpZmljIGFwcGxpY2F0aW9uIG1hbnVhbCBhbmQKKy91c3Ivc3JjL2xpbnV4Ki9Eb2N1bWVudGF0aW9uLworbmV0d29ya2luZy9pcC1zeXNjdGwudHh0IGZvciBtb3JlIGRldGFpbHMuCiAKLSAgRGVncmFkYXRpb24gaW4gdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSBtYXkgYmUgb2JzZXJ2ZWQgaW4gc29tZSBKdW1ibyBmcmFtZXMKLSAgZW52aXJvbm1lbnRzLiBJZiB0aGlzIGlzIG9ic2VydmVkLCBpbmNyZWFzaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNvY2tldAotICBidWZmZXIgc2l6ZSBhbmQvb3IgaW5jcmVhc2luZyB0aGUgL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF8qbWVtIGVudHJ5IHZhbHVlcwotICBtYXkgaGVscC4gU2VlIHRoZSBzcGVjaWZpYyBhcHBsaWNhdGlvbiBtYW51YWwgYW5kCi0gIC91c3Ivc3JjL2xpbnV4Ki9Eb2N1bWVudGF0aW9uLwotICBuZXR3b3JraW5nL2lwLXN5c2N0bC50eHQgZm9yIG1vcmUgZGV0YWlscy4KK0p1bWJvIEZyYW1lcyBvbiBGb3VuZHJ5IEJpZ0lyb24gODAwMCBzd2l0Y2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGlzIGEga25vd24gaXNzdWUgdXNpbmcgSnVtYm8gZnJhbWVzIHdoZW4gY29ubmVjdGVkIHRvIGEgRm91bmRyeQorQmlnSXJvbiA4MDAwIHN3aXRjaC4gIFRoaXMgaXMgYSAzcmQgcGFydHkgbGltaXRhdGlvbi4gIElmIHlvdSBleHBlcmllbmNlCitsb3NzIG9mIHBhY2tldHMsIGxvd2VyIHRoZSBNVFUgc2l6ZS4KIAotICBKdW1ibyBmcmFtZXMgb24gRm91bmRyeSBCaWdJcm9uIDgwMDAgc3dpdGNoCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgVGhlcmUgaXMgYSBrbm93biBpc3N1ZSB1c2luZyBKdW1ibyBmcmFtZXMgd2hlbiBjb25uZWN0ZWQgdG8gYSBGb3VuZHJ5Ci0gIEJpZ0lyb24gODAwMCBzd2l0Y2guIFRoaXMgaXMgYSAzcmQgcGFydHkgbGltaXRhdGlvbi4gSWYgeW91IGV4cGVyaWVuY2UKLSAgbG9zcyBvZiBwYWNrZXRzLCBsb3dlciB0aGUgTVRVIHNpemUuCitBbGxvY2F0aW5nIFJ4IEJ1ZmZlcnMgd2hlbiBVc2luZyBKdW1ibyBGcmFtZXMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbG9jYXRpbmcgUnggYnVmZmVycyB3aGVuIHVzaW5nIEp1bWJvIEZyYW1lcyBvbiAyLjYueCBrZXJuZWxzIG1heSBmYWlsIGlmIAordGhlIGF2YWlsYWJsZSBtZW1vcnkgaXMgaGVhdmlseSBmcmFnbWVudGVkLiBUaGlzIGlzc3VlIG1heSBiZSBzZWVuIHdpdGggUENJLVggCithZGFwdGVycyBvciB3aXRoIHBhY2tldCBzcGxpdCBkaXNhYmxlZC4gVGhpcyBjYW4gYmUgcmVkdWNlZCBvciBlbGltaW5hdGVkIAorYnkgY2hhbmdpbmcgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5IGZvciByZWNlaXZlIGJ1ZmZlciBhbGxvY2F0aW9uLCBieQoraW5jcmVhc2luZyAvcHJvYy9zeXMvdm0vbWluX2ZyZWVfa2J5dGVzLiAKIAotICBNdWx0aXBsZSBJbnRlcmZhY2VzIG9uIFNhbWUgRXRoZXJuZXQgQnJvYWRjYXN0IE5ldHdvcmsKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNdWx0aXBsZSBJbnRlcmZhY2VzIG9uIFNhbWUgRXRoZXJuZXQgQnJvYWRjYXN0IE5ldHdvcmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRHVlIHRvIHRoZSBkZWZhdWx0IEFSUCBiZWhhdmlvciBvbiBMaW51eCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUKK29uZSBzeXN0ZW0gb24gdHdvIElQIG5ldHdvcmtzIGluIHRoZSBzYW1lIEV0aGVybmV0IGJyb2FkY2FzdCBkb21haW4KKyhub24tcGFydGl0aW9uZWQgc3dpdGNoKSBiZWhhdmUgYXMgZXhwZWN0ZWQuICBBbGwgRXRoZXJuZXQgaW50ZXJmYWNlcword2lsbCByZXNwb25kIHRvIElQIHRyYWZmaWMgZm9yIGFueSBJUCBhZGRyZXNzIGFzc2lnbmVkIHRvIHRoZSBzeXN0ZW0uCitUaGlzIHJlc3VsdHMgaW4gdW5iYWxhbmNlZCByZWNlaXZlIHRyYWZmaWMuCiAKLSAgRHVlIHRvIHRoZSBkZWZhdWx0IEFSUCBiZWhhdmlvciBvbiBMaW51eCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUKLSAgb25lIHN5c3RlbSBvbiB0d28gSVAgbmV0d29ya3MgaW4gdGhlIHNhbWUgRXRoZXJuZXQgYnJvYWRjYXN0IGRvbWFpbgotICAobm9uLXBhcnRpdGlvbmVkIHN3aXRjaCkgYmVoYXZlIGFzIGV4cGVjdGVkLiBBbGwgRXRoZXJuZXQgaW50ZXJmYWNlcwotICB3aWxsIHJlc3BvbmQgdG8gSVAgdHJhZmZpYyBmb3IgYW55IElQIGFkZHJlc3MgYXNzaWduZWQgdG8gdGhlIHN5c3RlbS4KLSAgVGhpcyByZXN1bHRzIGluIHVuYmFsYW5jZWQgcmVjZWl2ZSB0cmFmZmljLgorSWYgeW91IGhhdmUgbXVsdGlwbGUgaW50ZXJmYWNlcyBpbiBhIHNlcnZlciwgZWl0aGVyIHR1cm4gb24gQVJQCitmaWx0ZXJpbmcgYnkgZW50ZXJpbmc6CiAKLSAgSWYgeW91IGhhdmUgbXVsdGlwbGUgaW50ZXJmYWNlcyBpbiBhIHNlcnZlciwgZWl0aGVyIHR1cm4gb24gQVJQCi0gIGZpbHRlcmluZyBieSBlbnRlcmluZzoKKyAgICBlY2hvIDEgPiAvcHJvYy9zeXMvbmV0L2lwdjQvY29uZi9hbGwvYXJwX2ZpbHRlcgorKHRoaXMgb25seSB3b3JrcyBpZiB5b3VyIGtlcm5lbCdzIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gMi40LjUpLAogCi0gICAgICBlY2hvIDEgPiAvcHJvYy9zeXMvbmV0L2lwdjQvY29uZi9hbGwvYXJwX2ZpbHRlcgotICAodGhpcyBvbmx5IHdvcmtzIGlmIHlvdXIga2VybmVsJ3MgdmVyc2lvbiBpcyBoaWdoZXIgdGhhbiAyLjQuNSksCitOT1RFOiBUaGlzIHNldHRpbmcgaXMgbm90IHNhdmVkIGFjcm9zcyByZWJvb3RzLiAgVGhlIGNvbmZpZ3VyYXRpb24KK2NoYW5nZSBjYW4gYmUgbWFkZSBwZXJtYW5lbnQgYnkgYWRkaW5nIHRoZSBsaW5lOgorICAgIG5ldC5pcHY0LmNvbmYuYWxsLmFycF9maWx0ZXIgPSAxCit0byB0aGUgZmlsZSAvZXRjL3N5c2N0bC5jb25mCiAKLSAgTk9URTogVGhpcyBzZXR0aW5nIGlzIG5vdCBzYXZlZCBhY3Jvc3MgcmVib290cy4gVGhlIGNvbmZpZ3VyYXRpb24KLSAgY2hhbmdlIGNhbiBiZSBtYWRlIHBlcm1hbmVudCBieSBhZGRpbmcgdGhlIGxpbmU6Ci0gICAgICBuZXQuaXB2NC5jb25mLmFsbC5hcnBfZmlsdGVyID0gMQotICB0byB0aGUgZmlsZSAvZXRjL3N5c2N0bC5jb25mCisgICAgICBvciwKIAotICAgICAgICBvciwKK2luc3RhbGwgdGhlIGludGVyZmFjZXMgaW4gc2VwYXJhdGUgYnJvYWRjYXN0IGRvbWFpbnMgKGVpdGhlciBpbgorZGlmZmVyZW50IHN3aXRjaGVzIG9yIGluIGEgc3dpdGNoIHBhcnRpdGlvbmVkIHRvIFZMQU5zKS4KIAotICBpbnN0YWxsIHRoZSBpbnRlcmZhY2VzIGluIHNlcGFyYXRlIGJyb2FkY2FzdCBkb21haW5zIChlaXRoZXIgaW4KLSAgZGlmZmVyZW50IHN3aXRjaGVzIG9yIGluIGEgc3dpdGNoIHBhcnRpdGlvbmVkIHRvIFZMQU5zKS4KKzgyNTQxLzgyNTQ3IGNhbid0IGxpbmsgb3IgYXJlIHNsb3cgdG8gbGluayB3aXRoIHNvbWUgbGluayBwYXJ0bmVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGlzIGEga25vd24gY29tcGF0aWJpbGl0eSBpc3N1ZSB3aXRoIDgyNTQxLzgyNTQ3IGFuZCBzb21lCitsb3ctZW5kIHN3aXRjaGVzIHdoZXJlIHRoZSBsaW5rIHdpbGwgbm90IGJlIGVzdGFibGlzaGVkLCBvciB3aWxsCitiZSBzbG93IHRvIGVzdGFibGlzaC4gIEluIHBhcnRpY3VsYXIsIHRoZXNlIHN3aXRjaGVzIGFyZSBrbm93biB0bworYmUgaW5jb21wYXRpYmxlIHdpdGggODI1NDEvODI1NDc6CiAKLSAgODI1NDEvODI1NDcgY2FuJ3QgbGluayBvciBhcmUgc2xvdyB0byBsaW5rIHdpdGggc29tZSBsaW5rIHBhcnRuZXJzCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGxhbmV4IEZYRy0wOFRFCisgICAgSS1PIERhdGEgRVRHLVNIOAogCi0gIFRoZXJlIGlzIGEga25vd24gY29tcGF0aWJpbGl0eSBpc3N1ZSB3aXRoIDgyNTQxLzgyNTQ3IGFuZCBzb21lCi0gIGxvdy1lbmQgc3dpdGNoZXMgd2hlcmUgdGhlIGxpbmsgd2lsbCBub3QgYmUgZXN0YWJsaXNoZWQsIG9yIHdpbGwKLSAgYmUgc2xvdyB0byBlc3RhYmxpc2guICBJbiBwYXJ0aWN1bGFyLCB0aGVzZSBzd2l0Y2hlcyBhcmUga25vd24gdG8KLSAgYmUgaW5jb21wYXRpYmxlIHdpdGggODI1NDEvODI1NDc6CitUbyB3b3JrYXJvdW5kIHRoaXMgaXNzdWUsIHRoZSBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkIHdpdGggYW4gb3ZlcnJpZGUKK29mIHRoZSBQSFkncyBtYXN0ZXIvc2xhdmUgc2V0dGluZy4gIEZvcmNpbmcgbWFzdGVyIG9yIGZvcmNpbmcgc2xhdmUKK21vZGUgd2lsbCBpbXByb3ZlIHRpbWUtdG8tbGluay4KIAotICAgICAgUGxhbmV4IEZYRy0wOFRFCi0gICAgICBJLU8gRGF0YSBFVEctU0g4CisgICAgIyBtYWtlIENGTEFHU19FWFRSQT0tREUxMDAwX01BU1RFUl9TTEFWRT08bj4KIAotICBUbyB3b3JrYXJvdW5kIHRoaXMgaXNzdWUsIHRoZSBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkIHdpdGggYW4gb3ZlcnJpZGUKLSAgb2YgdGhlIFBIWSdzIG1hc3Rlci9zbGF2ZSBzZXR0aW5nLiAgRm9yY2luZyBtYXN0ZXIgb3IgZm9yY2luZyBzbGF2ZQotICBtb2RlIHdpbGwgaW1wcm92ZSB0aW1lLXRvLWxpbmsuCitXaGVyZSA8bj4gaXM6CiAKLSAgICAgICMgbWFrZSBFWFRSQV9DRkxBR1M9LURFMTAwMF9NQVNURVJfU0xBVkU9PG4+CisgICAgMCA9IEhhcmR3YXJlIGRlZmF1bHQKKyAgICAxID0gTWFzdGVyIG1vZGUKKyAgICAyID0gU2xhdmUgbW9kZQorICAgIDMgPSBBdXRvIG1hc3Rlci9zbGF2ZQogCi0gIFdoZXJlIDxuPiBpczoKK0Rpc2FibGUgcnggZmxvdyBjb250cm9sIHdpdGggZXRodG9vbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbiBvcmRlciB0byBkaXNhYmxlIHJlY2VpdmUgZmxvdyBjb250cm9sIHVzaW5nIGV0aHRvb2wsIHlvdSBtdXN0IHR1cm4KK29mZiBhdXRvLW5lZ290aWF0aW9uIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZS4KIAotICAgICAgMCA9IEhhcmR3YXJlIGRlZmF1bHQKLSAgICAgIDEgPSBNYXN0ZXIgbW9kZQotICAgICAgMiA9IFNsYXZlIG1vZGUKLSAgICAgIDMgPSBBdXRvIG1hc3Rlci9zbGF2ZQorRm9yIGV4YW1wbGU6CiAKLSAgRGlzYWJsZSByeCBmbG93IGNvbnRyb2wgd2l0aCBldGh0b29sCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZXRodG9vbCAtQSBldGg/IGF1dG9uZWcgb2ZmIHJ4IG9mZgogCi0gIEluIG9yZGVyIHRvIGRpc2FibGUgcmVjZWl2ZSBmbG93IGNvbnRyb2wgdXNpbmcgZXRodG9vbCwgeW91IG11c3QgdHVybgotICBvZmYgYXV0by1uZWdvdGlhdGlvbiBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUuCi0KLSAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgZXRodG9vbCAtQSBldGg/IGF1dG9uZWcgb2ZmIHJ4IG9mZgorVW5wbHVnZ2luZyBuZXR3b3JrIGNhYmxlIHdoaWxlIGV0aHRvb2wgLXAgaXMgcnVubmluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW4ga2VybmVsIHZlcnNpb25zIDIuNS41MCBhbmQgbGF0ZXIgKGluY2x1ZGluZyAyLjYga2VybmVsKSwgdW5wbHVnZ2luZwordGhlIG5ldHdvcmsgY2FibGUgd2hpbGUgZXRodG9vbCAtcCBpcyBydW5uaW5nIHdpbGwgY2F1c2UgdGhlIHN5c3RlbSB0bworYmVjb21lIHVucmVzcG9uc2l2ZSB0byBrZXlib2FyZCBjb21tYW5kcywgZXhjZXB0IGZvciBjb250cm9sLWFsdC1kZWxldGUuCitSZXN0YXJ0aW5nIHRoZSBzeXN0ZW0gYXBwZWFycyB0byBiZSB0aGUgb25seSByZW1lZHkuCiAKIAogU3VwcG9ydApAQCAtNTQ4LDI0ICs2NDMsMTAgQEAKIAogICAgIGh0dHA6Ly9zdXBwb3J0LmludGVsLmNvbQogCi0gICAgb3IgdGhlIEludGVsIFdpcmVkIE5ldHdvcmtpbmcgcHJvamVjdCBob3N0ZWQgYnkgU291cmNlZm9yZ2UgYXQ6CitvciB0aGUgSW50ZWwgV2lyZWQgTmV0d29ya2luZyBwcm9qZWN0IGhvc3RlZCBieSBTb3VyY2Vmb3JnZSBhdDoKIAogICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZTEwMDAKIAogSWYgYW4gaXNzdWUgaXMgaWRlbnRpZmllZCB3aXRoIHRoZSByZWxlYXNlZCBzb3VyY2UgY29kZSBvbiB0aGUgc3VwcG9ydGVkCiBrZXJuZWwgd2l0aCBhIHN1cHBvcnRlZCBhZGFwdGVyLCBlbWFpbCB0aGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gcmVsYXRlZAotdG8gdGhlIGlzc3VlIHRvIGUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotCi0KLUxpY2Vuc2UKLT09PT09PT0KLQotVGhpcyBzb2Z0d2FyZSBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIGxpY2Vuc2UgYWdyZWVtZW50Ci1iZXR3ZWVuIHlvdSAoJ0xpY2Vuc2VlJykgYW5kIEludGVsLiBEbyBub3QgdXNlIG9yIGxvYWQgdGhpcyBzb2Z0d2FyZSBvciBhbnkKLWFzc29jaWF0ZWQgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHksIHRoZSAnU29mdHdhcmUnKSB1bnRpbCB5b3UgaGF2ZSBjYXJlZnVsbHkKLXJlYWQgdGhlIGZ1bGwgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGZpbGUgQ09QWUlORyBsb2NhdGVkIGluIHRoaXMgc29mdHdhcmUKLXBhY2thZ2UuIEJ5IGxvYWRpbmcgb3IgdXNpbmcgdGhlIFNvZnR3YXJlLCB5b3UgYWdyZWUgdG8gdGhlIHRlcm1zIG9mIHRoaXMKLUFncmVlbWVudC4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZG8gbm90Ci1pbnN0YWxsIG9yIHVzZSB0aGUgU29mdHdhcmUuCi0KLSogT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgordG8gdGhlIGlzc3VlIHRvIGUxMDAwLWRldmVsQGxpc3RzLnNmLm5ldApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2dlbmVyaWNfbmV0bGluay50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZ2VuZXJpY19uZXRsaW5rLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGY4YjhiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2dlbmVyaWNfbmV0bGluay50eHQKQEAgLTAsMCArMSwzIEBACitBIHdpa2kgZG9jdW1lbnQgb24gaG93IHRvIHVzZSBHZW5lcmljIE5ldGxpbmsgY2FuIGJlIGZvdW5kIGhlcmU6CisKKyAqIGh0dHA6Ly9saW51eC1uZXQub3NkbC5vcmcvaW5kZXgucGhwL0dlbmVyaWNfTmV0bGlua19IT1dUTwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAppbmRleCBmZDNjMGMwLi5hMGY2ODQyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dApAQCAtMTAxLDYgKzEwMSwxMSBAQAogCiBUQ1AgdmFyaWFibGVzOiAKIAorc29tYXhjb25uIC0gSU5URUdFUgorCUxpbWl0IG9mIHNvY2tldCBsaXN0ZW4oKSBiYWNrbG9nLCBrbm93biBpbiB1c2Vyc3BhY2UgYXMgU09NQVhDT05OLgorCURlZmF1bHRzIHRvIDEyOC4gIFNlZSBhbHNvIHRjcF9tYXhfc3luX2JhY2tsb2cgZm9yIGFkZGl0aW9uYWwgdHVuaW5nCisJZm9yIFRDUCBzb2NrZXRzLgorCiB0Y3BfYWJjIC0gSU5URUdFUgogCUNvbnRyb2xzIEFwcHJvcHJpYXRlIEJ5dGUgQ291bnQgKEFCQykgZGVmaW5lZCBpbiBSRkMzNDY1LgogCUFCQyBpcyBhIHdheSBvZiBpbmNyZWFzaW5nIGNvbmdlc3Rpb24gd2luZG93IChjd25kKSBtb3JlIHNsb3dseQpAQCAtMTEyLDE1ICsxMTcsNjggQEAKIAkJICBvZiB0d28gc2VnbWVudHMgdG8gY29tcGVuc2F0ZSBmb3IgZGVsYXllZCBhY2tub3dsZWRnbWVudHMuCiAJRGVmYXVsdDogMCAob2ZmKQogCi10Y3Bfc3luX3JldHJpZXMgLSBJTlRFR0VSCi0JTnVtYmVyIG9mIHRpbWVzIGluaXRpYWwgU1lOcyBmb3IgYW4gYWN0aXZlIFRDUCBjb25uZWN0aW9uIGF0dGVtcHQKLQl3aWxsIGJlIHJldHJhbnNtaXR0ZWQuIFNob3VsZCBub3QgYmUgaGlnaGVyIHRoYW4gMjU1LiBEZWZhdWx0IHZhbHVlCi0JaXMgNSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gfjE4MHNlY29uZHMuCit0Y3BfYWJvcnRfb25fb3ZlcmZsb3cgLSBCT09MRUFOCisJSWYgbGlzdGVuaW5nIHNlcnZpY2UgaXMgdG9vIHNsb3cgdG8gYWNjZXB0IG5ldyBjb25uZWN0aW9ucywKKwlyZXNldCB0aGVtLiBEZWZhdWx0IHN0YXRlIGlzIEZBTFNFLiBJdCBtZWFucyB0aGF0IGlmIG92ZXJmbG93CisJb2NjdXJyZWQgZHVlIHRvIGEgYnVyc3QsIGNvbm5lY3Rpb24gd2lsbCByZWNvdmVyLiBFbmFibGUgdGhpcworCW9wdGlvbiBfb25seV8gaWYgeW91IGFyZSByZWFsbHkgc3VyZSB0aGF0IGxpc3RlbmluZyBkYWVtb24KKwljYW5ub3QgYmUgdHVuZWQgdG8gYWNjZXB0IGNvbm5lY3Rpb25zIGZhc3Rlci4gRW5hYmxpbmcgdGhpcworCW9wdGlvbiBjYW4gaGFybSBjbGllbnRzIG9mIHlvdXIgc2VydmVyLgogCi10Y3Bfc3luYWNrX3JldHJpZXMgLSBJTlRFR0VSCi0JTnVtYmVyIG9mIHRpbWVzIFNZTkFDS3MgZm9yIGEgcGFzc2l2ZSBUQ1AgY29ubmVjdGlvbiBhdHRlbXB0IHdpbGwKLQliZSByZXRyYW5zbWl0dGVkLiBTaG91bGQgbm90IGJlIGhpZ2hlciB0aGFuIDI1NS4gRGVmYXVsdCB2YWx1ZQotCWlzIDUsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIH4xODBzZWNvbmRzLgordGNwX2Fkdl93aW5fc2NhbGUgLSBJTlRFR0VSCisJQ291bnQgYnVmZmVyaW5nIG92ZXJoZWFkIGFzIGJ5dGVzLzJedGNwX2Fkdl93aW5fc2NhbGUKKwkoaWYgdGNwX2Fkdl93aW5fc2NhbGUgPiAwKSBvciBieXRlcy1ieXRlcy8yXigtdGNwX2Fkdl93aW5fc2NhbGUpLAorCWlmIGl0IGlzIDw9IDAuCisJRGVmYXVsdDogMgorCit0Y3BfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wgLSBTVFJJTkcKKwlTaG93L3NldCB0aGUgY29uZ2VzdGlvbiBjb250cm9sIGNob2ljZXMgYXZhaWxhYmxlIHRvIG5vbi1wcml2aWxlZ2VkCisJcHJvY2Vzc2VzLiBUaGUgbGlzdCBpcyBhIHN1YnNldCBvZiB0aG9zZSBsaXN0ZWQgaW4KKwl0Y3BfYXZhaWxhYmxlX2Nvbmdlc3Rpb25fY29udHJvbC4KKwlEZWZhdWx0IGlzICJyZW5vIiBhbmQgdGhlIGRlZmF1bHQgc2V0dGluZyAodGNwX2Nvbmdlc3Rpb25fY29udHJvbCkuCisKK3RjcF9hcHBfd2luIC0gSU5URUdFUgorCVJlc2VydmUgbWF4KHdpbmRvdy8yXnRjcF9hcHBfd2luLCBtc3MpIG9mIHdpbmRvdyBmb3IgYXBwbGljYXRpb24KKwlidWZmZXIuIFZhbHVlIDAgaXMgc3BlY2lhbCwgaXQgbWVhbnMgdGhhdCBub3RoaW5nIGlzIHJlc2VydmVkLgorCURlZmF1bHQ6IDMxCisKK3RjcF9hdmFpbGFibGVfY29uZ2VzdGlvbl9jb250cm9sIC0gU1RSSU5HCisJU2hvd3MgdGhlIGF2YWlsYWJsZSBjb25nZXN0aW9uIGNvbnRyb2wgY2hvaWNlcyB0aGF0IGFyZSByZWdpc3RlcmVkLgorCU1vcmUgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobXMgbWF5IGJlIGF2YWlsYWJsZSBhcyBtb2R1bGVzLAorCWJ1dCBub3QgbG9hZGVkLgorCit0Y3BfY29uZ2VzdGlvbl9jb250cm9sIC0gU1RSSU5HCisJU2V0IHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtIHRvIGJlIHVzZWQgZm9yIG5ldworCWNvbm5lY3Rpb25zLiBUaGUgYWxnb3JpdGhtICJyZW5vIiBpcyBhbHdheXMgYXZhaWxhYmxlLCBidXQKKwlhZGRpdGlvbmFsIGNob2ljZXMgbWF5IGJlIGF2YWlsYWJsZSBiYXNlZCBvbiBrZXJuZWwgY29uZmlndXJhdGlvbi4KKwlEZWZhdWx0IGlzIHNldCBhcyBwYXJ0IG9mIGtlcm5lbCBjb25maWd1cmF0aW9uLgorCit0Y3BfZHNhY2sgLSBCT09MRUFOCisJQWxsb3dzIFRDUCB0byBzZW5kICJkdXBsaWNhdGUiIFNBQ0tzLgorCit0Y3BfZWNuIC0gQk9PTEVBTgorCUVuYWJsZSBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiBpbiBUQ1AuCisKK3RjcF9mYWNrIC0gQk9PTEVBTgorCUVuYWJsZSBGQUNLIGNvbmdlc3Rpb24gYXZvaWRhbmNlIGFuZCBmYXN0IHJldHJhbnNtaXNzaW9uLgorCVRoZSB2YWx1ZSBpcyBub3QgdXNlZCwgaWYgdGNwX3NhY2sgaXMgbm90IGVuYWJsZWQuCisKK3RjcF9maW5fdGltZW91dCAtIElOVEVHRVIKKwlUaW1lIHRvIGhvbGQgc29ja2V0IGluIHN0YXRlIEZJTi1XQUlULTIsIGlmIGl0IHdhcyBjbG9zZWQKKwlieSBvdXIgc2lkZS4gUGVlciBjYW4gYmUgYnJva2VuIGFuZCBuZXZlciBjbG9zZSBpdHMgc2lkZSwKKwlvciBldmVuIGRpZWQgdW5leHBlY3RlZGx5LiBEZWZhdWx0IHZhbHVlIGlzIDYwc2VjLgorCVVzdWFsIHZhbHVlIHVzZWQgaW4gMi4yIHdhcyAxODAgc2Vjb25kcywgeW91IG1heSByZXN0b3JlCisJaXQsIGJ1dCByZW1lbWJlciB0aGF0IGlmIHlvdXIgbWFjaGluZSBpcyBldmVuIHVuZGVybG9hZGVkIFdFQiBzZXJ2ZXIsCisJeW91IHJpc2sgdG8gb3ZlcmZsb3cgbWVtb3J5IHdpdGgga2lsb3RvbnMgb2YgZGVhZCBzb2NrZXRzLAorCUZJTi1XQUlULTIgc29ja2V0cyBhcmUgbGVzcyBkYW5nZXJvdXMgdGhhbiBGSU4tV0FJVC0xLAorCWJlY2F1c2UgdGhleSBlYXQgbWF4aW11bSAxLjVLIG9mIG1lbW9yeSwgYnV0IHRoZXkgdGVuZAorCXRvIGxpdmUgbG9uZ2VyLglDZi4gdGNwX21heF9vcnBoYW5zLgorCit0Y3BfZnJ0byAtIEJPT0xFQU4KKwlFbmFibGVzIEYtUlRPLCBhbiBlbmhhbmNlZCByZWNvdmVyeSBhbGdvcml0aG0gZm9yIFRDUCByZXRyYW5zbWlzc2lvbgorCXRpbWVvdXRzLiAgSXQgaXMgcGFydGljdWxhcmx5IGJlbmVmaWNpYWwgaW4gd2lyZWxlc3MgZW52aXJvbm1lbnRzCisJd2hlcmUgcGFja2V0IGxvc3MgaXMgdHlwaWNhbGx5IGR1ZSB0byByYW5kb20gcmFkaW8gaW50ZXJmZXJlbmNlCisJcmF0aGVyIHRoYW4gaW50ZXJtZWRpYXRlIHJvdXRlciBjb25nZXN0aW9uLgogCiB0Y3Bfa2VlcGFsaXZlX3RpbWUgLSBJTlRFR0VSCiAJSG93IG9mdGVuIFRDUCBzZW5kcyBvdXQga2VlcGFsaXZlIG1lc3NhZ2VzIHdoZW4ga2VlcGFsaXZlIGlzIGVuYWJsZWQuCkBAIC0xMzYsNTQgKzE5NCwxMyBAQAogCWFmdGVyIHByb2JlcyBzdGFydGVkLiBEZWZhdWx0IHZhbHVlOiA3NXNlYyBpLmUuIGNvbm5lY3Rpb24KIAl3aWxsIGJlIGFib3J0ZWQgYWZ0ZXIgfjExIG1pbnV0ZXMgb2YgcmV0cmllcy4KIAotdGNwX3JldHJpZXMxIC0gSU5URUdFUgotCUhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGJlZm9yZSBkZWNpZGluZyB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZwotCWFuZCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVwb3J0IHRoaXMgc3VzcGljaW9uIHRvIG5ldHdvcmsgbGF5ZXIuCi0JTWluaW1hbCBSRkMgdmFsdWUgaXMgMywgaXQgaXMgZGVmYXVsdCwgd2hpY2ggY29ycmVzcG9uZHMKLQl0byB+M3NlYy04bWluIGRlcGVuZGluZyBvbiBSVE8uCi0KLXRjcF9yZXRyaWVzMiAtIElOVEVHRVIKLQlIb3cgbWF5IHRpbWVzIHRvIHJldHJ5IGJlZm9yZSBraWxsaW5nIGFsaXZlIFRDUCBjb25uZWN0aW9uLgotCVJGQzExMjIgc2F5cyB0aGF0IHRoZSBsaW1pdCBzaG91bGQgYmUgbG9uZ2VyIHRoYW4gMTAwIHNlYy4KLQlJdCBpcyB0b28gc21hbGwgbnVtYmVyLglEZWZhdWx0IHZhbHVlIDE1IGNvcnJlc3BvbmRzIHRvIH4xMy0zMG1pbgotCWRlcGVuZGluZyBvbiBSVE8uCi0KLXRjcF9vcnBoYW5fcmV0cmllcyAtIElOVEVHRVIKLQlIb3cgbWF5IHRpbWVzIHRvIHJldHJ5IGJlZm9yZSBraWxsaW5nIFRDUCBjb25uZWN0aW9uLCBjbG9zZWQKLQlieSBvdXIgc2lkZS4gRGVmYXVsdCB2YWx1ZSA3IGNvcnJlc3BvbmRzIHRvIH41MHNlYy0xNm1pbgotCWRlcGVuZGluZyBvbiBSVE8uIElmIHlvdSBtYWNoaW5lIGlzIGxvYWRlZCBXRUIgc2VydmVyLAotCXlvdSBzaG91bGQgdGhpbmsgYWJvdXQgbG93ZXJpbmcgdGhpcyB2YWx1ZSwgc3VjaCBzb2NrZXRzCi0JbWF5IGNvbnN1bWUgc2lnbmlmaWNhbnQgcmVzb3VyY2VzLiBDZi4gdGNwX21heF9vcnBoYW5zLgotCi10Y3BfZmluX3RpbWVvdXQgLSBJTlRFR0VSCi0JVGltZSB0byBob2xkIHNvY2tldCBpbiBzdGF0ZSBGSU4tV0FJVC0yLCBpZiBpdCB3YXMgY2xvc2VkCi0JYnkgb3VyIHNpZGUuIFBlZXIgY2FuIGJlIGJyb2tlbiBhbmQgbmV2ZXIgY2xvc2UgaXRzIHNpZGUsCi0Jb3IgZXZlbiBkaWVkIHVuZXhwZWN0ZWRseS4gRGVmYXVsdCB2YWx1ZSBpcyA2MHNlYy4KLQlVc3VhbCB2YWx1ZSB1c2VkIGluIDIuMiB3YXMgMTgwIHNlY29uZHMsIHlvdSBtYXkgcmVzdG9yZQotCWl0LCBidXQgcmVtZW1iZXIgdGhhdCBpZiB5b3VyIG1hY2hpbmUgaXMgZXZlbiB1bmRlcmxvYWRlZCBXRUIgc2VydmVyLAotCXlvdSByaXNrIHRvIG92ZXJmbG93IG1lbW9yeSB3aXRoIGtpbG90b25zIG9mIGRlYWQgc29ja2V0cywKLQlGSU4tV0FJVC0yIHNvY2tldHMgYXJlIGxlc3MgZGFuZ2Vyb3VzIHRoYW4gRklOLVdBSVQtMSwKLQliZWNhdXNlIHRoZXkgZWF0IG1heGltdW0gMS41SyBvZiBtZW1vcnksIGJ1dCB0aGV5IHRlbmQKLQl0byBsaXZlIGxvbmdlci4JQ2YuIHRjcF9tYXhfb3JwaGFucy4KLQotdGNwX21heF90d19idWNrZXRzIC0gSU5URUdFUgotCU1heGltYWwgbnVtYmVyIG9mIHRpbWV3YWl0IHNvY2tldHMgaGVsZCBieSBzeXN0ZW0gc2ltdWx0YW5lb3VzbHkuCi0JSWYgdGhpcyBudW1iZXIgaXMgZXhjZWVkZWQgdGltZS13YWl0IHNvY2tldCBpcyBpbW1lZGlhdGVseSBkZXN0cm95ZWQKLQlhbmQgd2FybmluZyBpcyBwcmludGVkLiBUaGlzIGxpbWl0IGV4aXN0cyBvbmx5IHRvIHByZXZlbnQKLQlzaW1wbGUgRG9TIGF0dGFja3MsIHlvdSBfbXVzdF8gbm90IGxvd2VyIHRoZSBsaW1pdCBhcnRpZmljaWFsbHksCi0JYnV0IHJhdGhlciBpbmNyZWFzZSBpdCAocHJvYmFibHksIGFmdGVyIGluY3JlYXNpbmcgaW5zdGFsbGVkIG1lbW9yeSksCi0JaWYgbmV0d29yayBjb25kaXRpb25zIHJlcXVpcmUgbW9yZSB0aGFuIGRlZmF1bHQgdmFsdWUuCi0KLXRjcF90d19yZWN5Y2xlIC0gQk9PTEVBTgotCUVuYWJsZSBmYXN0IHJlY3ljbGluZyBUSU1FLVdBSVQgc29ja2V0cy4gRGVmYXVsdCB2YWx1ZSBpcyAwLgotCUl0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aXRob3V0IGFkdmljZS9yZXF1ZXN0IG9mIHRlY2huaWNhbAotCWV4cGVydHMuCi0KLXRjcF90d19yZXVzZSAtIEJPT0xFQU4KLQlBbGxvdyB0byByZXVzZSBUSU1FLVdBSVQgc29ja2V0cyBmb3IgbmV3IGNvbm5lY3Rpb25zIHdoZW4gaXQgaXMKLQlzYWZlIGZyb20gcHJvdG9jb2wgdmlld3BvaW50LiBEZWZhdWx0IHZhbHVlIGlzIDAuCi0JSXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgYWR2aWNlL3JlcXVlc3Qgb2YgdGVjaG5pY2FsCi0JZXhwZXJ0cy4KK3RjcF9sb3dfbGF0ZW5jeSAtIEJPT0xFQU4KKwlJZiBzZXQsIHRoZSBUQ1Agc3RhY2sgbWFrZXMgZGVjaXNpb25zIHRoYXQgcHJlZmVyIGxvd2VyCisJbGF0ZW5jeSBhcyBvcHBvc2VkIHRvIGhpZ2hlciB0aHJvdWdocHV0LiAgQnkgZGVmYXVsdCwgdGhpcworCW9wdGlvbiBpcyBub3Qgc2V0IG1lYW5pbmcgdGhhdCBoaWdoZXIgdGhyb3VnaHB1dCBpcyBwcmVmZXJyZWQuCisJQW4gZXhhbXBsZSBvZiBhbiBhcHBsaWNhdGlvbiB3aGVyZSB0aGlzIGRlZmF1bHQgc2hvdWxkIGJlCisJY2hhbmdlZCB3b3VsZCBiZSBhIEJlb3d1bGYgY29tcHV0ZSBjbHVzdGVyLgorCURlZmF1bHQ6IDAKIAogdGNwX21heF9vcnBoYW5zIC0gSU5URUdFUgogCU1heGltYWwgbnVtYmVyIG9mIFRDUCBzb2NrZXRzIG5vdCBhdHRhY2hlZCB0byBhbnkgdXNlciBmaWxlIGhhbmRsZSwKQEAgLTE5Nyw0MSArMjE0LDYgQEAKIAltb3JlIGFnZ3Jlc3NpdmVseS4gTGV0IG1lIHRvIHJlbWluZCBhZ2FpbjogZWFjaCBvcnBoYW4gZWF0cwogCXVwIHRvIH42NEsgb2YgdW5zd2FwcGFibGUgbWVtb3J5LgogCi10Y3BfYWJvcnRfb25fb3ZlcmZsb3cgLSBCT09MRUFOCi0JSWYgbGlzdGVuaW5nIHNlcnZpY2UgaXMgdG9vIHNsb3cgdG8gYWNjZXB0IG5ldyBjb25uZWN0aW9ucywKLQlyZXNldCB0aGVtLiBEZWZhdWx0IHN0YXRlIGlzIEZBTFNFLiBJdCBtZWFucyB0aGF0IGlmIG92ZXJmbG93Ci0Jb2NjdXJyZWQgZHVlIHRvIGEgYnVyc3QsIGNvbm5lY3Rpb24gd2lsbCByZWNvdmVyLiBFbmFibGUgdGhpcwotCW9wdGlvbiBfb25seV8gaWYgeW91IGFyZSByZWFsbHkgc3VyZSB0aGF0IGxpc3RlbmluZyBkYWVtb24KLQljYW5ub3QgYmUgdHVuZWQgdG8gYWNjZXB0IGNvbm5lY3Rpb25zIGZhc3Rlci4gRW5hYmxpbmcgdGhpcwotCW9wdGlvbiBjYW4gaGFybSBjbGllbnRzIG9mIHlvdXIgc2VydmVyLgotCi10Y3Bfc3luY29va2llcyAtIEJPT0xFQU4KLQlPbmx5IHZhbGlkIHdoZW4gdGhlIGtlcm5lbCB3YXMgY29tcGlsZWQgd2l0aCBDT05GSUdfU1lOQ09PS0lFUwotCVNlbmQgb3V0IHN5bmNvb2tpZXMgd2hlbiB0aGUgc3luIGJhY2tsb2cgcXVldWUgb2YgYSBzb2NrZXQgCi0Jb3ZlcmZsb3dzLiBUaGlzIGlzIHRvIHByZXZlbnQgYWdhaW5zdCB0aGUgY29tbW9uICdzeW4gZmxvb2QgYXR0YWNrJwotCURlZmF1bHQ6IEZBTFNFCi0KLQlOb3RlLCB0aGF0IHN5bmNvb2tpZXMgaXMgZmFsbGJhY2sgZmFjaWxpdHkuCi0JSXQgTVVTVCBOT1QgYmUgdXNlZCB0byBoZWxwIGhpZ2hseSBsb2FkZWQgc2VydmVycyB0byBzdGFuZAotCWFnYWluc3QgbGVnYWwgY29ubmVjdGlvbiByYXRlLiBJZiB5b3Ugc2VlIHN5bmZsb29kIHdhcm5pbmdzCi0JaW4geW91ciBsb2dzLCBidXQgaW52ZXN0aWdhdGlvbglzaG93cyB0aGF0IHRoZXkgb2NjdXIKLQliZWNhdXNlIG9mIG92ZXJsb2FkIHdpdGggbGVnYWwgY29ubmVjdGlvbnMsIHlvdSBzaG91bGQgdHVuZQotCWFub3RoZXIgcGFyYW1ldGVycyB1bnRpbCB0aGlzIHdhcm5pbmcgZGlzYXBwZWFyLgotCVNlZTogdGNwX21heF9zeW5fYmFja2xvZywgdGNwX3N5bmFja19yZXRyaWVzLCB0Y3BfYWJvcnRfb25fb3ZlcmZsb3cuCi0KLQlzeW5jb29raWVzIHNlcmlvdXNseSB2aW9sYXRlIFRDUCBwcm90b2NvbCwgZG8gbm90IGFsbG93Ci0JdG8gdXNlIFRDUCBleHRlbnNpb25zLCBjYW4gcmVzdWx0IGluIHNlcmlvdXMgZGVncmFkYXRpb24KLQlvZiBzb21lIHNlcnZpY2VzIChmLmUuIFNNVFAgcmVsYXlpbmcpLCB2aXNpYmxlIG5vdCBieSB5b3UsCi0JYnV0IHlvdXIgY2xpZW50cyBhbmQgcmVsYXlzLCBjb250YWN0aW5nIHlvdS4gV2hpbGUgeW91IHNlZQotCXN5bmZsb29kIHdhcm5pbmdzIGluIGxvZ3Mgbm90IGJlaW5nIHJlYWxseSBmbG9vZGVkLCB5b3VyIHNlcnZlcgotCWlzIHNlcmlvdXNseSBtaXNjb25maWd1cmVkLgotCi10Y3Bfc3RkdXJnIC0gQk9PTEVBTgotCVVzZSB0aGUgSG9zdCByZXF1aXJlbWVudHMgaW50ZXJwcmV0YXRpb24gb2YgdGhlIFRDUCB1cmcgcG9pbnRlciBmaWVsZC4KLQlNb3N0IGhvc3RzIHVzZSB0aGUgb2xkZXIgQlNEIGludGVycHJldGF0aW9uLCBzbyBpZiB5b3UgdHVybiB0aGlzIG9uCi0JTGludXggbWlnaHQgbm90IGNvbW11bmljYXRlIGNvcnJlY3RseSB3aXRoIHRoZW0uCQotCURlZmF1bHQ6IEZBTFNFIAotCQogdGNwX21heF9zeW5fYmFja2xvZyAtIElOVEVHRVIKIAlNYXhpbWFsIG51bWJlciBvZiByZW1lbWJlcmVkIGNvbm5lY3Rpb24gcmVxdWVzdHMsIHdoaWNoIGFyZQogCXN0aWxsIGRpZCBub3QgcmVjZWl2ZSBhbiBhY2tub3dsZWRnbWVudCBmcm9tIGNvbm5lY3RpbmcgY2xpZW50LgpAQCAtMjM5LDI0ICsyMjEsMzQgQEAKIAlhbmQgMTI4IGZvciBsb3cgbWVtb3J5IG1hY2hpbmVzLiBJZiBzZXJ2ZXIgc3VmZmVycyBvZiBvdmVybG9hZCwKIAl0cnkgdG8gaW5jcmVhc2UgdGhpcyBudW1iZXIuCiAKLXRjcF93aW5kb3dfc2NhbGluZyAtIEJPT0xFQU4KLQlFbmFibGUgd2luZG93IHNjYWxpbmcgYXMgZGVmaW5lZCBpbiBSRkMxMzIzLgordGNwX21heF90d19idWNrZXRzIC0gSU5URUdFUgorCU1heGltYWwgbnVtYmVyIG9mIHRpbWV3YWl0IHNvY2tldHMgaGVsZCBieSBzeXN0ZW0gc2ltdWx0YW5lb3VzbHkuCisJSWYgdGhpcyBudW1iZXIgaXMgZXhjZWVkZWQgdGltZS13YWl0IHNvY2tldCBpcyBpbW1lZGlhdGVseSBkZXN0cm95ZWQKKwlhbmQgd2FybmluZyBpcyBwcmludGVkLiBUaGlzIGxpbWl0IGV4aXN0cyBvbmx5IHRvIHByZXZlbnQKKwlzaW1wbGUgRG9TIGF0dGFja3MsIHlvdSBfbXVzdF8gbm90IGxvd2VyIHRoZSBsaW1pdCBhcnRpZmljaWFsbHksCisJYnV0IHJhdGhlciBpbmNyZWFzZSBpdCAocHJvYmFibHksIGFmdGVyIGluY3JlYXNpbmcgaW5zdGFsbGVkIG1lbW9yeSksCisJaWYgbmV0d29yayBjb25kaXRpb25zIHJlcXVpcmUgbW9yZSB0aGFuIGRlZmF1bHQgdmFsdWUuCiAKLXRjcF90aW1lc3RhbXBzIC0gQk9PTEVBTgotCUVuYWJsZSB0aW1lc3RhbXBzIGFzIGRlZmluZWQgaW4gUkZDMTMyMy4KK3RjcF9tZW0gLSB2ZWN0b3Igb2YgMyBJTlRFR0VSczogbWluLCBwcmVzc3VyZSwgbWF4CisJbWluOiBiZWxvdyB0aGlzIG51bWJlciBvZiBwYWdlcyBUQ1AgaXMgbm90IGJvdGhlcmVkIGFib3V0IGl0cworCW1lbW9yeSBhcHBldGl0ZS4KIAotdGNwX3NhY2sgLSBCT09MRUFOCi0JRW5hYmxlIHNlbGVjdCBhY2tub3dsZWRnbWVudHMgKFNBQ0tTKS4KKwlwcmVzc3VyZTogd2hlbiBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSBUQ1AgZXhjZWVkcyB0aGlzIG51bWJlcgorCW9mIHBhZ2VzLCBUQ1AgbW9kZXJhdGVzIGl0cyBtZW1vcnkgY29uc3VtcHRpb24gYW5kIGVudGVycyBtZW1vcnkKKwlwcmVzc3VyZSBtb2RlLCB3aGljaCBpcyBleGl0ZWQgd2hlbiBtZW1vcnkgY29uc3VtcHRpb24gZmFsbHMKKwl1bmRlciAibWluIi4KIAotdGNwX2ZhY2sgLSBCT09MRUFOCi0JRW5hYmxlIEZBQ0sgY29uZ2VzdGlvbiBhdm9pZGFuY2UgYW5kIGZhc3QgcmV0cmFuc21pc3Npb24uCi0JVGhlIHZhbHVlIGlzIG5vdCB1c2VkLCBpZiB0Y3Bfc2FjayBpcyBub3QgZW5hYmxlZC4KKwltYXg6IG51bWJlciBvZiBwYWdlcyBhbGxvd2VkIGZvciBxdWV1ZWluZyBieSBhbGwgVENQIHNvY2tldHMuCiAKLXRjcF9kc2FjayAtIEJPT0xFQU4KLQlBbGxvd3MgVENQIHRvIHNlbmQgImR1cGxpY2F0ZSIgU0FDS3MuCisJRGVmYXVsdHMgYXJlIGNhbGN1bGF0ZWQgYXQgYm9vdCB0aW1lIGZyb20gYW1vdW50IG9mIGF2YWlsYWJsZQorCW1lbW9yeS4KIAotdGNwX2VjbiAtIEJPT0xFQU4KLQlFbmFibGUgRXhwbGljaXQgQ29uZ2VzdGlvbiBOb3RpZmljYXRpb24gaW4gVENQLgordGNwX29ycGhhbl9yZXRyaWVzIC0gSU5URUdFUgorCUhvdyBtYXkgdGltZXMgdG8gcmV0cnkgYmVmb3JlIGtpbGxpbmcgVENQIGNvbm5lY3Rpb24sIGNsb3NlZAorCWJ5IG91ciBzaWRlLiBEZWZhdWx0IHZhbHVlIDcgY29ycmVzcG9uZHMgdG8gfjUwc2VjLTE2bWluCisJZGVwZW5kaW5nIG9uIFJUTy4gSWYgeW91IG1hY2hpbmUgaXMgbG9hZGVkIFdFQiBzZXJ2ZXIsCisJeW91IHNob3VsZCB0aGluayBhYm91dCBsb3dlcmluZyB0aGlzIHZhbHVlLCBzdWNoIHNvY2tldHMKKwltYXkgY29uc3VtZSBzaWduaWZpY2FudCByZXNvdXJjZXMuIENmLiB0Y3BfbWF4X29ycGhhbnMuCiAKIHRjcF9yZW9yZGVyaW5nIC0gSU5URUdFUgogCU1heGltYWwgcmVvcmRlcmluZyBvZiBwYWNrZXRzIGluIGEgVENQIHN0cmVhbS4KQEAgLTI2NywyMCArMjU5LDIzIEBACiAJT24gcmV0cmFuc21pdCB0cnkgdG8gc2VuZCBiaWdnZXIgcGFja2V0cyB0byB3b3JrIGFyb3VuZCBidWdzIGluCiAJY2VydGFpbiBUQ1Agc3RhY2tzLgogCi10Y3Bfd21lbSAtIHZlY3RvciBvZiAzIElOVEVHRVJzOiBtaW4sIGRlZmF1bHQsIG1heAotCW1pbjogQW1vdW50IG9mIG1lbW9yeSByZXNlcnZlZCBmb3Igc2VuZCBidWZmZXJzIGZvciBUQ1Agc29ja2V0LgotCUVhY2ggVENQIHNvY2tldCBoYXMgcmlnaHRzIHRvIHVzZSBpdCBkdWUgdG8gZmFjdCBvZiBpdHMgYmlydGguCi0JRGVmYXVsdDogNEsKK3RjcF9yZXRyaWVzMSAtIElOVEVHRVIKKwlIb3cgbWFueSB0aW1lcyB0byByZXRyeSBiZWZvcmUgZGVjaWRpbmcgdGhhdCBzb21ldGhpbmcgaXMgd3JvbmcKKwlhbmQgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlcG9ydCB0aGlzIHN1c3BpY2lvbiB0byBuZXR3b3JrIGxheWVyLgorCU1pbmltYWwgUkZDIHZhbHVlIGlzIDMsIGl0IGlzIGRlZmF1bHQsIHdoaWNoIGNvcnJlc3BvbmRzCisJdG8gfjNzZWMtOG1pbiBkZXBlbmRpbmcgb24gUlRPLgogCi0JZGVmYXVsdDogQW1vdW50IG9mIG1lbW9yeSBhbGxvd2VkIGZvciBzZW5kIGJ1ZmZlcnMgZm9yIFRDUCBzb2NrZXQKLQlieSBkZWZhdWx0LiBUaGlzIHZhbHVlIG92ZXJyaWRlcyBuZXQuY29yZS53bWVtX2RlZmF1bHQgdXNlZAotCWJ5IG90aGVyIHByb3RvY29scywgaXQgaXMgdXN1YWxseSBsb3dlciB0aGFuIG5ldC5jb3JlLndtZW1fZGVmYXVsdC4KLQlEZWZhdWx0OiAxNksKK3RjcF9yZXRyaWVzMiAtIElOVEVHRVIKKwlIb3cgbWF5IHRpbWVzIHRvIHJldHJ5IGJlZm9yZSBraWxsaW5nIGFsaXZlIFRDUCBjb25uZWN0aW9uLgorCVJGQzExMjIgc2F5cyB0aGF0IHRoZSBsaW1pdCBzaG91bGQgYmUgbG9uZ2VyIHRoYW4gMTAwIHNlYy4KKwlJdCBpcyB0b28gc21hbGwgbnVtYmVyLglEZWZhdWx0IHZhbHVlIDE1IGNvcnJlc3BvbmRzIHRvIH4xMy0zMG1pbgorCWRlcGVuZGluZyBvbiBSVE8uCiAKLQltYXg6IE1heGltYWwgYW1vdW50IG9mIG1lbW9yeSBhbGxvd2VkIGZvciBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkCi0Jc2VuZCBidWZmZXJzIGZvciBUQ1Agc29ja2V0LiBUaGlzIHZhbHVlIGRvZXMgbm90IG92ZXJyaWRlCi0JbmV0LmNvcmUud21lbV9tYXgsICJzdGF0aWMiIHNlbGVjdGlvbiB2aWEgU09fU05EQlVGIGRvZXMgbm90IHVzZSB0aGlzLgotCURlZmF1bHQ6IDEyOEsKK3RjcF9yZmMxMzM3IC0gQk9PTEVBTgorCUlmIHNldCwgdGhlIFRDUCBzdGFjayBiZWhhdmVzIGNvbmZvcm1pbmcgdG8gUkZDMTMzNy4gSWYgdW5zZXQsCisJd2UgYXJlIG5vdCBjb25mb3JtaW5nIHRvIFJGQywgYnV0IHByZXZlbnQgVENQIFRJTUVfV0FJVAorCWFzc2Fzc2luYXRpb24uCisJRGVmYXVsdDogMAogCiB0Y3Bfcm1lbSAtIHZlY3RvciBvZiAzIElOVEVHRVJzOiBtaW4sIGRlZmF1bHQsIG1heAogCW1pbjogTWluaW1hbCBzaXplIG9mIHJlY2VpdmUgYnVmZmVyIHVzZWQgYnkgVENQIHNvY2tldHMuCkBAIC0yOTksNzQgKzI5NCw4IEBACiAJbmV0LmNvcmUucm1lbV9tYXgsICJzdGF0aWMiIHNlbGVjdGlvbiB2aWEgU09fUkNWQlVGIGRvZXMgbm90IHVzZSB0aGlzLgogCURlZmF1bHQ6IDg3MzgwKjIgYnl0ZXMuCiAKLXRjcF9tZW0gLSB2ZWN0b3Igb2YgMyBJTlRFR0VSczogbWluLCBwcmVzc3VyZSwgbWF4Ci0JbWluOiBiZWxvdyB0aGlzIG51bWJlciBvZiBwYWdlcyBUQ1AgaXMgbm90IGJvdGhlcmVkIGFib3V0IGl0cwotCW1lbW9yeSBhcHBldGl0ZS4KLQotCXByZXNzdXJlOiB3aGVuIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkIGJ5IFRDUCBleGNlZWRzIHRoaXMgbnVtYmVyCi0Jb2YgcGFnZXMsIFRDUCBtb2RlcmF0ZXMgaXRzIG1lbW9yeSBjb25zdW1wdGlvbiBhbmQgZW50ZXJzIG1lbW9yeQotCXByZXNzdXJlIG1vZGUsIHdoaWNoIGlzIGV4aXRlZCB3aGVuIG1lbW9yeSBjb25zdW1wdGlvbiBmYWxscwotCXVuZGVyICJtaW4iLgotCi0JbWF4OiBudW1iZXIgb2YgcGFnZXMgYWxsb3dlZCBmb3IgcXVldWVpbmcgYnkgYWxsIFRDUCBzb2NrZXRzLgotCi0JRGVmYXVsdHMgYXJlIGNhbGN1bGF0ZWQgYXQgYm9vdCB0aW1lIGZyb20gYW1vdW50IG9mIGF2YWlsYWJsZQotCW1lbW9yeS4KLQotdGNwX2FwcF93aW4gLSBJTlRFR0VSCi0JUmVzZXJ2ZSBtYXgod2luZG93LzJedGNwX2FwcF93aW4sIG1zcykgb2Ygd2luZG93IGZvciBhcHBsaWNhdGlvbgotCWJ1ZmZlci4gVmFsdWUgMCBpcyBzcGVjaWFsLCBpdCBtZWFucyB0aGF0IG5vdGhpbmcgaXMgcmVzZXJ2ZWQuCi0JRGVmYXVsdDogMzEKLQotdGNwX2Fkdl93aW5fc2NhbGUgLSBJTlRFR0VSCi0JQ291bnQgYnVmZmVyaW5nIG92ZXJoZWFkIGFzIGJ5dGVzLzJedGNwX2Fkdl93aW5fc2NhbGUKLQkoaWYgdGNwX2Fkdl93aW5fc2NhbGUgPiAwKSBvciBieXRlcy1ieXRlcy8yXigtdGNwX2Fkdl93aW5fc2NhbGUpLAotCWlmIGl0IGlzIDw9IDAuCi0JRGVmYXVsdDogMgotCi10Y3BfcmZjMTMzNyAtIEJPT0xFQU4KLQlJZiBzZXQsIHRoZSBUQ1Agc3RhY2sgYmVoYXZlcyBjb25mb3JtaW5nIHRvIFJGQzEzMzcuIElmIHVuc2V0LAotCXdlIGFyZSBub3QgY29uZm9ybWluZyB0byBSRkMsIGJ1dCBwcmV2ZW50IFRDUCBUSU1FX1dBSVQKLQlhc3Nhc3NpbmF0aW9uLiAgIAotCURlZmF1bHQ6IDAKLQotdGNwX2xvd19sYXRlbmN5IC0gQk9PTEVBTgotCUlmIHNldCwgdGhlIFRDUCBzdGFjayBtYWtlcyBkZWNpc2lvbnMgdGhhdCBwcmVmZXIgbG93ZXIKLQlsYXRlbmN5IGFzIG9wcG9zZWQgdG8gaGlnaGVyIHRocm91Z2hwdXQuICBCeSBkZWZhdWx0LCB0aGlzCi0Jb3B0aW9uIGlzIG5vdCBzZXQgbWVhbmluZyB0aGF0IGhpZ2hlciB0aHJvdWdocHV0IGlzIHByZWZlcnJlZC4KLQlBbiBleGFtcGxlIG9mIGFuIGFwcGxpY2F0aW9uIHdoZXJlIHRoaXMgZGVmYXVsdCBzaG91bGQgYmUKLQljaGFuZ2VkIHdvdWxkIGJlIGEgQmVvd3VsZiBjb21wdXRlIGNsdXN0ZXIuCi0JRGVmYXVsdDogMAotCi10Y3BfdHNvX3dpbl9kaXZpc29yIC0gSU5URUdFUgotICAgICAgIFRoaXMgYWxsb3dzIGNvbnRyb2wgb3ZlciB3aGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGNvbmdlc3Rpb24gd2luZG93Ci0gICAgICAgY2FuIGJlIGNvbnN1bWVkIGJ5IGEgc2luZ2xlIFRTTyBmcmFtZS4KLSAgICAgICBUaGUgc2V0dGluZyBvZiB0aGlzIHBhcmFtZXRlciBpcyBhIGNob2ljZSBiZXR3ZWVuIGJ1cnN0aW5lc3MgYW5kCi0gICAgICAgYnVpbGRpbmcgbGFyZ2VyIFRTTyBmcmFtZXMuCi0gICAgICAgRGVmYXVsdDogMwotCi10Y3BfZnJ0byAtIEJPT0xFQU4KLQlFbmFibGVzIEYtUlRPLCBhbiBlbmhhbmNlZCByZWNvdmVyeSBhbGdvcml0aG0gZm9yIFRDUCByZXRyYW5zbWlzc2lvbgotCXRpbWVvdXRzLiAgSXQgaXMgcGFydGljdWxhcmx5IGJlbmVmaWNpYWwgaW4gd2lyZWxlc3MgZW52aXJvbm1lbnRzCi0Jd2hlcmUgcGFja2V0IGxvc3MgaXMgdHlwaWNhbGx5IGR1ZSB0byByYW5kb20gcmFkaW8gaW50ZXJmZXJlbmNlCi0JcmF0aGVyIHRoYW4gaW50ZXJtZWRpYXRlIHJvdXRlciBjb25nZXN0aW9uLgotCi10Y3BfY29uZ2VzdGlvbl9jb250cm9sIC0gU1RSSU5HCi0JU2V0IHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtIHRvIGJlIHVzZWQgZm9yIG5ldwotCWNvbm5lY3Rpb25zLiBUaGUgYWxnb3JpdGhtICJyZW5vIiBpcyBhbHdheXMgYXZhaWxhYmxlLCBidXQKLQlhZGRpdGlvbmFsIGNob2ljZXMgbWF5IGJlIGF2YWlsYWJsZSBiYXNlZCBvbiBrZXJuZWwgY29uZmlndXJhdGlvbi4KLQotc29tYXhjb25uIC0gSU5URUdFUgotCUxpbWl0IG9mIHNvY2tldCBsaXN0ZW4oKSBiYWNrbG9nLCBrbm93biBpbiB1c2Vyc3BhY2UgYXMgU09NQVhDT05OLgotCURlZmF1bHRzIHRvIDEyOC4gIFNlZSBhbHNvIHRjcF9tYXhfc3luX2JhY2tsb2cgZm9yIGFkZGl0aW9uYWwgdHVuaW5nCi0JZm9yIFRDUCBzb2NrZXRzLgotCi10Y3Bfd29ya2Fyb3VuZF9zaWduZWRfd2luZG93cyAtIEJPT0xFQU4KLQlJZiBzZXQsIGFzc3VtZSBubyByZWNlaXB0IG9mIGEgd2luZG93IHNjYWxpbmcgb3B0aW9uIG1lYW5zIHRoZQotCXJlbW90ZSBUQ1AgaXMgYnJva2VuIGFuZCB0cmVhdHMgdGhlIHdpbmRvdyBhcyBhIHNpZ25lZCBxdWFudGl0eS4KLQlJZiB1bnNldCwgYXNzdW1lIHRoZSByZW1vdGUgVENQIGlzIG5vdCBicm9rZW4gZXZlbiBpZiB3ZSBkbwotCW5vdCByZWNlaXZlIGEgd2luZG93IHNjYWxpbmcgb3B0aW9uIGZyb20gdGhlbS4KLQlEZWZhdWx0OiAwCit0Y3Bfc2FjayAtIEJPT0xFQU4KKwlFbmFibGUgc2VsZWN0IGFja25vd2xlZGdtZW50cyAoU0FDS1MpLgogCiB0Y3Bfc2xvd19zdGFydF9hZnRlcl9pZGxlIC0gQk9PTEVBTgogCUlmIHNldCwgcHJvdmlkZSBSRkMyODYxIGJlaGF2aW9yIGFuZCB0aW1lIG91dCB0aGUgY29uZ2VzdGlvbgpAQCAtMzc1LDYgKzMwNCw4OSBAQAogCWJlIHRpbWVkIG91dCBhZnRlciBhbiBpZGxlIHBlcmlvZC4KIAlEZWZhdWx0OiAxCiAKK3RjcF9zdGR1cmcgLSBCT09MRUFOCisJVXNlIHRoZSBIb3N0IHJlcXVpcmVtZW50cyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVENQIHVyZyBwb2ludGVyIGZpZWxkLgorCU1vc3QgaG9zdHMgdXNlIHRoZSBvbGRlciBCU0QgaW50ZXJwcmV0YXRpb24sIHNvIGlmIHlvdSB0dXJuIHRoaXMgb24KKwlMaW51eCBtaWdodCBub3QgY29tbXVuaWNhdGUgY29ycmVjdGx5IHdpdGggdGhlbS4KKwlEZWZhdWx0OiBGQUxTRQorCit0Y3Bfc3luYWNrX3JldHJpZXMgLSBJTlRFR0VSCisJTnVtYmVyIG9mIHRpbWVzIFNZTkFDS3MgZm9yIGEgcGFzc2l2ZSBUQ1AgY29ubmVjdGlvbiBhdHRlbXB0IHdpbGwKKwliZSByZXRyYW5zbWl0dGVkLiBTaG91bGQgbm90IGJlIGhpZ2hlciB0aGFuIDI1NS4gRGVmYXVsdCB2YWx1ZQorCWlzIDUsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIH4xODBzZWNvbmRzLgorCit0Y3Bfc3luY29va2llcyAtIEJPT0xFQU4KKwlPbmx5IHZhbGlkIHdoZW4gdGhlIGtlcm5lbCB3YXMgY29tcGlsZWQgd2l0aCBDT05GSUdfU1lOQ09PS0lFUworCVNlbmQgb3V0IHN5bmNvb2tpZXMgd2hlbiB0aGUgc3luIGJhY2tsb2cgcXVldWUgb2YgYSBzb2NrZXQKKwlvdmVyZmxvd3MuIFRoaXMgaXMgdG8gcHJldmVudCBhZ2FpbnN0IHRoZSBjb21tb24gJ3N5biBmbG9vZCBhdHRhY2snCisJRGVmYXVsdDogRkFMU0UKKworCU5vdGUsIHRoYXQgc3luY29va2llcyBpcyBmYWxsYmFjayBmYWNpbGl0eS4KKwlJdCBNVVNUIE5PVCBiZSB1c2VkIHRvIGhlbHAgaGlnaGx5IGxvYWRlZCBzZXJ2ZXJzIHRvIHN0YW5kCisJYWdhaW5zdCBsZWdhbCBjb25uZWN0aW9uIHJhdGUuIElmIHlvdSBzZWUgc3luZmxvb2Qgd2FybmluZ3MKKwlpbiB5b3VyIGxvZ3MsIGJ1dCBpbnZlc3RpZ2F0aW9uCXNob3dzIHRoYXQgdGhleSBvY2N1cgorCWJlY2F1c2Ugb2Ygb3ZlcmxvYWQgd2l0aCBsZWdhbCBjb25uZWN0aW9ucywgeW91IHNob3VsZCB0dW5lCisJYW5vdGhlciBwYXJhbWV0ZXJzIHVudGlsIHRoaXMgd2FybmluZyBkaXNhcHBlYXIuCisJU2VlOiB0Y3BfbWF4X3N5bl9iYWNrbG9nLCB0Y3Bfc3luYWNrX3JldHJpZXMsIHRjcF9hYm9ydF9vbl9vdmVyZmxvdy4KKworCXN5bmNvb2tpZXMgc2VyaW91c2x5IHZpb2xhdGUgVENQIHByb3RvY29sLCBkbyBub3QgYWxsb3cKKwl0byB1c2UgVENQIGV4dGVuc2lvbnMsIGNhbiByZXN1bHQgaW4gc2VyaW91cyBkZWdyYWRhdGlvbgorCW9mIHNvbWUgc2VydmljZXMgKGYuZS4gU01UUCByZWxheWluZyksIHZpc2libGUgbm90IGJ5IHlvdSwKKwlidXQgeW91ciBjbGllbnRzIGFuZCByZWxheXMsIGNvbnRhY3RpbmcgeW91LiBXaGlsZSB5b3Ugc2VlCisJc3luZmxvb2Qgd2FybmluZ3MgaW4gbG9ncyBub3QgYmVpbmcgcmVhbGx5IGZsb29kZWQsIHlvdXIgc2VydmVyCisJaXMgc2VyaW91c2x5IG1pc2NvbmZpZ3VyZWQuCisKK3RjcF9zeW5fcmV0cmllcyAtIElOVEVHRVIKKwlOdW1iZXIgb2YgdGltZXMgaW5pdGlhbCBTWU5zIGZvciBhbiBhY3RpdmUgVENQIGNvbm5lY3Rpb24gYXR0ZW1wdAorCXdpbGwgYmUgcmV0cmFuc21pdHRlZC4gU2hvdWxkIG5vdCBiZSBoaWdoZXIgdGhhbiAyNTUuIERlZmF1bHQgdmFsdWUKKwlpcyA1LCB3aGljaCBjb3JyZXNwb25kcyB0byB+MTgwc2Vjb25kcy4KKwordGNwX3RpbWVzdGFtcHMgLSBCT09MRUFOCisJRW5hYmxlIHRpbWVzdGFtcHMgYXMgZGVmaW5lZCBpbiBSRkMxMzIzLgorCit0Y3BfdHNvX3dpbl9kaXZpc29yIC0gSU5URUdFUgorCVRoaXMgYWxsb3dzIGNvbnRyb2wgb3ZlciB3aGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGNvbmdlc3Rpb24gd2luZG93CisJY2FuIGJlIGNvbnN1bWVkIGJ5IGEgc2luZ2xlIFRTTyBmcmFtZS4KKwlUaGUgc2V0dGluZyBvZiB0aGlzIHBhcmFtZXRlciBpcyBhIGNob2ljZSBiZXR3ZWVuIGJ1cnN0aW5lc3MgYW5kCisJYnVpbGRpbmcgbGFyZ2VyIFRTTyBmcmFtZXMuCisJRGVmYXVsdDogMworCit0Y3BfdHdfcmVjeWNsZSAtIEJPT0xFQU4KKwlFbmFibGUgZmFzdCByZWN5Y2xpbmcgVElNRS1XQUlUIHNvY2tldHMuIERlZmF1bHQgdmFsdWUgaXMgMC4KKwlJdCBzaG91bGQgbm90IGJlIGNoYW5nZWQgd2l0aG91dCBhZHZpY2UvcmVxdWVzdCBvZiB0ZWNobmljYWwKKwlleHBlcnRzLgorCit0Y3BfdHdfcmV1c2UgLSBCT09MRUFOCisJQWxsb3cgdG8gcmV1c2UgVElNRS1XQUlUIHNvY2tldHMgZm9yIG5ldyBjb25uZWN0aW9ucyB3aGVuIGl0IGlzCisJc2FmZSBmcm9tIHByb3RvY29sIHZpZXdwb2ludC4gRGVmYXVsdCB2YWx1ZSBpcyAwLgorCUl0IHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aXRob3V0IGFkdmljZS9yZXF1ZXN0IG9mIHRlY2huaWNhbAorCWV4cGVydHMuCisKK3RjcF93aW5kb3dfc2NhbGluZyAtIEJPT0xFQU4KKwlFbmFibGUgd2luZG93IHNjYWxpbmcgYXMgZGVmaW5lZCBpbiBSRkMxMzIzLgorCit0Y3Bfd21lbSAtIHZlY3RvciBvZiAzIElOVEVHRVJzOiBtaW4sIGRlZmF1bHQsIG1heAorCW1pbjogQW1vdW50IG9mIG1lbW9yeSByZXNlcnZlZCBmb3Igc2VuZCBidWZmZXJzIGZvciBUQ1Agc29ja2V0LgorCUVhY2ggVENQIHNvY2tldCBoYXMgcmlnaHRzIHRvIHVzZSBpdCBkdWUgdG8gZmFjdCBvZiBpdHMgYmlydGguCisJRGVmYXVsdDogNEsKKworCWRlZmF1bHQ6IEFtb3VudCBvZiBtZW1vcnkgYWxsb3dlZCBmb3Igc2VuZCBidWZmZXJzIGZvciBUQ1Agc29ja2V0CisJYnkgZGVmYXVsdC4gVGhpcyB2YWx1ZSBvdmVycmlkZXMgbmV0LmNvcmUud21lbV9kZWZhdWx0IHVzZWQKKwlieSBvdGhlciBwcm90b2NvbHMsIGl0IGlzIHVzdWFsbHkgbG93ZXIgdGhhbiBuZXQuY29yZS53bWVtX2RlZmF1bHQuCisJRGVmYXVsdDogMTZLCisKKwltYXg6IE1heGltYWwgYW1vdW50IG9mIG1lbW9yeSBhbGxvd2VkIGZvciBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkCisJc2VuZCBidWZmZXJzIGZvciBUQ1Agc29ja2V0LiBUaGlzIHZhbHVlIGRvZXMgbm90IG92ZXJyaWRlCisJbmV0LmNvcmUud21lbV9tYXgsICJzdGF0aWMiIHNlbGVjdGlvbiB2aWEgU09fU05EQlVGIGRvZXMgbm90IHVzZSB0aGlzLgorCURlZmF1bHQ6IDEyOEsKKwordGNwX3dvcmthcm91bmRfc2lnbmVkX3dpbmRvd3MgLSBCT09MRUFOCisJSWYgc2V0LCBhc3N1bWUgbm8gcmVjZWlwdCBvZiBhIHdpbmRvdyBzY2FsaW5nIG9wdGlvbiBtZWFucyB0aGUKKwlyZW1vdGUgVENQIGlzIGJyb2tlbiBhbmQgdHJlYXRzIHRoZSB3aW5kb3cgYXMgYSBzaWduZWQgcXVhbnRpdHkuCisJSWYgdW5zZXQsIGFzc3VtZSB0aGUgcmVtb3RlIFRDUCBpcyBub3QgYnJva2VuIGV2ZW4gaWYgd2UgZG8KKwlub3QgcmVjZWl2ZSBhIHdpbmRvdyBzY2FsaW5nIG9wdGlvbiBmcm9tIHRoZW0uCisJRGVmYXVsdDogMAorCiBDSVBTT3Y0IFZhcmlhYmxlczoKIAogY2lwc29fY2FjaGVfZW5hYmxlIC0gQk9PTEVBTgpAQCAtOTc0LDQgKzk4NiwzIEBACiBzbG90X3RpbWVvdXQgRklYTUUKIHdhcm5fbm9yZXBseV90aW1lIEZJWE1FCiAKLSRJZDogaXAtc3lzY3RsLnR4dCx2IDEuMjAgMjAwMS8xMi8xMyAwOTowMDoxOCBkYXZlbSBFeHAgJApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwaGFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBoYXNlLnR4dAppbmRleCA0OTMyMDNhLi41NWVhYzRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBoYXNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXBoYXNlLnR4dApAQCAtODEsNyArODEsNyBAQAogICAgIDFNLiBUaGUgUkFNIHNpemUgZGVjaWRlcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYW5kIGJ1ZmZlciBzaXplLiBUaGUgZGVmYXVsdCAKICAgICBzaXplIGFuZCBudW1iZXIgb2YgYnVmZmVycyBhcmUgc2V0IGFzIGZvbGxvd2luZzogCiAKLSAgICAgICAgICBUb3RvbCAgICBSeCBSQU0gICBUeCBSQU0gICBSeCBCdWYgICBUeCBCdWYgICBSeCBidWYgICBUeCBidWYKKyAgICAgICAgICBUb3RhbCAgICBSeCBSQU0gICBUeCBSQU0gICBSeCBCdWYgICBUeCBCdWYgICBSeCBidWYgICBUeCBidWYKICAgICAgICAgIFJBTSBzaXplICAgc2l6ZSAgICAgc2l6ZSAgICAgc2l6ZSAgICAgc2l6ZSAgICAgIGNudCAgICAgIGNudAogICAgICAgICAgLS0tLS0tLS0gIC0tLS0tLSAgIC0tLS0tLSAgIC0tLS0tLSAgIC0tLS0tLSAgIC0tLS0tLSAgIC0tLS0tLQogICAgICAgICAgICAxMjhLICAgICAgNjRLICAgICAgNjRLICAgICAgMTBLICAgICAgMTBLICAgICAgIDYgICAgICAgIDYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGFja2V0X21tYXAudHh0CmluZGV4IDEyYTAwOGEuLjVhMjMyZDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dApAQCAtMjg0LDcgKzI4NCw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSBjaGVjayB0aGUgc291cmNlIGNvZGUgeW91IHdpbGwgc2VlIHRoYXQgd2hhdCBJIGRyYXcgaGVyZSBhcyBhIGZyYW1lCi1pcyBub3Qgb25seSB0aGUgbGluayBsZXZlbCBmcmFtZS4gQXQgdGhlIGJlZ2luaW5nIG9mIGVhY2ggZnJhbWUgdGhlcmUgaXMgYSAKK2lzIG5vdCBvbmx5IHRoZSBsaW5rIGxldmVsIGZyYW1lLiBBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZnJhbWUgdGhlcmUgaXMgYSAKIGhlYWRlciBjYWxsZWQgc3RydWN0IHRwYWNrZXRfaGRyIHVzZWQgaW4gUEFDS0VUX01NQVAgdG8gaG9sZCBsaW5rIGxldmVsJ3MgZnJhbWUKIG1ldGEgaW5mb3JtYXRpb24gbGlrZSB0aW1lc3RhbXAuIFNvIHdoYXQgd2UgZHJhdyBoZXJlIGEgZnJhbWUgaXQncyByZWFsbHkgCiB0aGUgZm9sbG93aW5nIChmcm9tIGluY2x1ZGUvbGludXgvaWZfcGFja2V0LmgpOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BoeS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGh5LnR4dAppbmRleCAyOWNjYWU0Li4wYmM5NWVhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGh5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGh5LnR4dApAQCAtMSw3ICsxLDcgQEAKIAogLS0tLS0tLQogUEhZIEFic3RyYWN0aW9uIExheWVyCi0oVXBkYXRlZCAyMDA1LTA3LTIxKQorKFVwZGF0ZWQgMjAwNi0xMS0zMCkKIAogUHVycG9zZQogCkBAIC05NywxMSArOTcsMTIgQEAKICAKICBOZXh0LCB5b3UgbmVlZCB0byBrbm93IHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgUEhZIGNvbm5lY3RlZCB0byB0aGlzIGRldmljZS4gCiAgVGhlIG5hbWUgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlLCAicGh5MDowIiwgd2hlcmUgdGhlIGZpcnN0IG51bWJlciBpcyB0aGUKLSBidXMgaWQsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBQSFkncyBhZGRyZXNzIG9uIHRoYXQgYnVzLgorIGJ1cyBpZCwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIFBIWSdzIGFkZHJlc3Mgb24gdGhhdCBidXMuICBUeXBpY2FsbHksCisgdGhlIGJ1cyBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nIGl0cyBJRCB1bmlxdWUuCiAgCiAgTm93LCB0byBjb25uZWN0LCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbjoKICAKLSAgIHBoeWRldiA9IHBoeV9jb25uZWN0KGRldiwgcGh5X25hbWUsICZhZGp1c3RfbGluaywgZmxhZ3MpOworICAgcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlfbmFtZSwgJmFkanVzdF9saW5rLCBmbGFncywgaW50ZXJmYWNlKTsKIAogIHBoeWRldiBpcyBhIHBvaW50ZXIgdG8gdGhlIHBoeV9kZXZpY2Ugc3RydWN0dXJlIHdoaWNoIHJlcHJlc2VudHMgdGhlIFBIWS4gIElmCiAgcGh5X2Nvbm5lY3QgaXMgc3VjY2Vzc2Z1bCwgaXQgd2lsbCByZXR1cm4gdGhlIHBvaW50ZXIuICBkZXYsIGhlcmUsIGlzIHRoZQpAQCAtMTE1LDYgKzExNiwxMCBAQAogIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBzeXN0ZW0gaGFzIHB1dCBoYXJkd2FyZSByZXN0cmljdGlvbnMgb24KICB0aGUgUEhZL2NvbnRyb2xsZXIsIG9mIHdoaWNoIHRoZSBQSFkgbmVlZHMgdG8gYmUgYXdhcmUuCiAKKyBpbnRlcmZhY2UgaXMgYSB1MzIgd2hpY2ggc3BlY2lmaWVzIHRoZSBjb25uZWN0aW9uIHR5cGUgdXNlZAorIGJldHdlZW4gdGhlIGNvbnRyb2xsZXIgYW5kIHRoZSBQSFkuICBFeGFtcGxlcyBhcmUgR01JSSwgTUlJLAorIFJHTUlJLCBhbmQgU0dNSUkuICBGb3IgYSBmdWxsIGxpc3QsIHNlZSBpbmNsdWRlL2xpbnV4L3BoeS5oCisKICBOb3cganVzdCBtYWtlIHN1cmUgdGhhdCBwaHlkZXYtPnN1cHBvcnRlZCBhbmQgcGh5ZGV2LT5hZHZlcnRpc2luZyBoYXZlIGFueQogIHZhbHVlcyBwcnVuZWQgZnJvbSB0aGVtIHdoaWNoIGRvbid0IG1ha2Ugc2Vuc2UgZm9yIHlvdXIgY29udHJvbGxlciAoYSAxMC8xMDAKICBjb250cm9sbGVyIG1heSBiZSBjb25uZWN0ZWQgdG8gYSBnaWdhYml0IGNhcGFibGUgUEhZLCBzbyB5b3Ugd291bGQgbmVlZCB0bwpAQCAtMTkxLDcgKzE5Niw3IEBACiAgICBzdGFydCwgb3IgZGlzYWJsZXMgdGhlbiBmcmVlcyB0aGVtIGZvciBzdG9wLgogCiAgc3RydWN0IHBoeV9kZXZpY2UgKiBwaHlfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnBoeV9pZCwKLQkJIHUzMiBmbGFncyk7CisJCSB1MzIgZmxhZ3MsIHBoeV9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpOwogCiAgICBBdHRhY2hlcyBhIG5ldHdvcmsgZGV2aWNlIHRvIGEgcGFydGljdWxhciBQSFksIGJpbmRpbmcgdGhlIFBIWSB0byBhIGdlbmVyaWMKICAgIGRyaXZlciBpZiBub25lIHdhcyBmb3VuZCBkdXJpbmcgYnVzIGluaXRpYWxpemF0aW9uLiAgUGFzc2VzIGluCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGt0Z2VuLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CmluZGV4IGM4ZWVlMjMuLmM2Y2Y0YTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CkBAIC02Myw4ICs2Myw4IEBACiBSZXN1bHQ6IE9LOiAxMzEwMTE0MihjMTIyMjA3NDErZDg4MDQwMSkgdXNlYywgMTAwMDAwMDAgKDYwYnl0ZSwwZnJhZ3MpCiAgIDc2MzI5MnBwcyAzOTBNYi9zZWMgKDM5MDgwNTUwNGJwcykgZXJyb3JzOiAzOTY2NAogCi1Db25mZ3VyaW5nIHRocmVhZHMgYW5kIGRldmljZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ29uZmlndXJpbmcgdGhyZWFkcyBhbmQgZGV2aWNlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFRoaXMgaXMgZG9uZSB2aWEgdGhlIC9wcm9jIGludGVyZmFjZSBlYXNpZXN0IGRvbmUgdmlhIHBnc2V0IGluIHRoZSBzY3JpcHRzCiAKIEV4YW1wbGVzOgpAQCAtMTE2LDcgKzExNiw3IEBACiAJCQkJCSB0aGVyZSBtdXN0IGJlIG5vIHNwYWNlcyBiZXR3ZWVuIHRoZQogCQkJCQkgYXJndW1lbnRzLiBMZWFkaW5nIHplcm9zIGFyZSByZXF1aXJlZC4KIAkJCQkJIERvIG5vdCBzZXQgdGhlIGJvdHRvbSBvZiBzdGFjayBiaXQsCi0JCQkJCSB0aGF0cyBkb25lIGF1dG9tYXRpY2FsbHkuIElmIHlvdSBkbworCQkJCQkgdGhhdCdzIGRvbmUgYXV0b21hdGljYWxseS4gSWYgeW91IGRvCiAJCQkJCSBzZXQgdGhlIGJvdHRvbSBvZiBzdGFjayBiaXQsIHRoYXQKIAkJCQkJIGluZGljYXRlcyB0aGF0IHlvdSB3YW50IHRvIHJhbmRvbWx5CiAJCQkJCSBnZW5lcmF0ZSB0aGF0IGFkZHJlc3MgYW5kIHRoZSBmbGFnCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcHJvY19uZXRfdGNwLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wcm9jX25ldF90Y3AudHh0CmluZGV4IDU5Y2I5MTUuLjVlMjFmN2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wcm9jX25ldF90Y3AudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wcm9jX25ldF90Y3AudHh0CkBAIC0yNSw3ICsyNSw3IEBACiAKICAgIDEwMDAgICAgICAgIDAgNTQxNjU3ODUgNCBjZDFlNjA0MCAyNSA0IDI3IDMgLTEKICAgICB8ICAgICAgICAgIHwgICAgfCAgICAgfCAgICB8ICAgICB8ICB8IHwgIHwgfC0tPiBzbG93IHN0YXJ0IHNpemUgdGhyZXNob2xkLCAKLSAgICB8ICAgICAgICAgIHwgICAgfCAgICAgfCAgICB8ICAgICB8ICB8IHwgIHwgICAgICBvciAtMSBpZiB0aGUgdHJlc2hvbGQKKyAgICB8ICAgICAgICAgIHwgICAgfCAgICAgfCAgICB8ICAgICB8ICB8IHwgIHwgICAgICBvciAtMSBpZiB0aGUgdGhyZXNob2xkCiAgICAgfCAgICAgICAgICB8ICAgIHwgICAgIHwgICAgfCAgICAgfCAgfCB8ICB8ICAgICAgaXMgPj0gMHhGRkZGCiAgICAgfCAgICAgICAgICB8ICAgIHwgICAgIHwgICAgfCAgICAgfCAgfCB8ICB8LS0tLT4gc2VuZGluZyBjb25nZXN0aW9uIHdpbmRvdwogICAgIHwgICAgICAgICAgfCAgICB8ICAgICB8ICAgIHwgICAgIHwgIHwgfC0tLS0tLS0+IChhY2sucXVpY2s8PDEpfGFjay5waW5ncG9uZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NrOThsaW4udHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NrOThsaW4udHh0CmluZGV4IDRlMWNjNzQuLjg1OTBhOTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zazk4bGluLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2s5OGxpbi50eHQKQEAgLTM0Niw3ICszNDYsNyBAQAogICAgICAgZGVwZW5kaW5nIG9uIHRoZSBsb2FkIG9mIHRoZSBzeXN0ZW0uIElmIHRoZSBkcml2ZXIgZGV0ZWN0cyB0aGF0IHRoZQogICAgICAgc3lzdGVtIGxvYWQgaXMgdG9vIGhpZ2gsIHRoZSBkcml2ZXIgdHJpZXMgdG8gc2hpZWxkIHRoZSBzeXN0ZW0gYWdhaW5zdCAKICAgICAgIHRvbyBtdWNoIG5ldHdvcmsgbG9hZCBieSBlbmFibGluZyBpbnRlcnJ1cHQgbW9kZXJhdGlvbi4gSWYgLSBhdCBhIGxhdGVyCi0gICAgICB0aW1lIC0gdGhlIENQVSB1dGlsaXphdG9uIGRlY3JlYXNlcyBhZ2FpbiAob3IgaWYgdGhlIG5ldHdvcmsgbG9hZCBpcyAKKyAgICAgIHRpbWUgLSB0aGUgQ1BVIHV0aWxpemF0aW9uIGRlY3JlYXNlcyBhZ2FpbiAob3IgaWYgdGhlIG5ldHdvcmsgbG9hZCBpcyAKICAgICAgIG5lZ2xpZ2libGUpIHRoZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCiAKIEludGVycnVwdCBtb2RlcmF0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGRyaXZlciBoYXMgdG8gaGFuZGxlIG9uZSBvciBtb3JlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2xpY2Vjb20udHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NsaWNlY29tLnR4dAppbmRleCAyZjA0YzkyLi4zMmQzYjkxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2xpY2Vjb20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zbGljZWNvbS50eHQKQEAgLTEyNiw3ICsxMjYsNyBAQAogCiBUaG91Z2ggdGhlIG9wdGlvbnMgYmVsb3cgYXJlIHRvIGJlIHNldCBvbiBhIHNpbmdsZSBpbnRlcmZhY2UsIHRoZXkgYXBwbHkgdG8gdGhlCiB3aG9sZSBib2FyZC4gVGhlIHJlc3RyaWN0aW9uLCB0byB1c2UgdGhlbSBvbiAnVVAnIGludGVyZmFjZXMsIGlzIGJlY2F1c2UgdGhlIAotY29tbWFuZCBzZXF1ZW5jZSBiZWxvdyBjb3VsZCBsZWFkIHRvIHVucHJlZGljYWJsZSByZXN1bHRzLgorY29tbWFuZCBzZXF1ZW5jZSBiZWxvdyBjb3VsZCBsZWFkIHRvIHVucHJlZGljdGFibGUgcmVzdWx0cy4KIAogCSMgZWNobyAwICAgICAgICA+Ym9hcmRudW0KIAkjIGVjaG8gaW50ZXJuYWwgPmNsb2NrX3NvdXJjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3VkcGxpdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3VkcGxpdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmY0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdWRwbGl0ZS50eHQKQEAgLTAsMCArMSwyODEgQEAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICAgICAgICAgVGhlIFVEUC1MaXRlIHByb3RvY29sIChSRkMgMzgyOCkKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworICBVRFAtTGl0ZSBpcyBhIFN0YW5kYXJkcy1UcmFjayBJRVRGIHRyYW5zcG9ydCBwcm90b2NvbCB3aG9zZSBjaGFyYWN0ZXJpc3RpYworICBpcyBhIHZhcmlhYmxlLWxlbmd0aCBjaGVja3N1bS4gVGhpcyBoYXMgYWR2YW50YWdlcyBmb3IgdHJhbnNwb3J0IG9mIG11bHRpbWVkaWEKKyAgKHZpZGVvLCBWb0lQKSBvdmVyIHdpcmVsZXNzIG5ldHdvcmtzLCBhcyBwYXJ0bHkgZGFtYWdlZCBwYWNrZXRzIGNhbiBzdGlsbCBiZQorICBmZWQgaW50byB0aGUgY29kZWMgaW5zdGVhZCBvZiBiZWluZyBkaXNjYXJkZWQgZHVlIHRvIGEgZmFpbGVkIGNoZWNrc3VtIHRlc3QuCisKKyAgVGhpcyBmaWxlIGJyaWVmbHkgZGVzY3JpYmVzIHRoZSBleGlzdGluZyBrZXJuZWwgc3VwcG9ydCBhbmQgdGhlIHNvY2tldCBBUEkuCisgIEZvciBpbi1kZXB0aCBpbmZvcm1hdGlvbiwgeW91IGNhbiBjb25zdWx0OgorCisgICBvIFRoZSBVRFAtTGl0ZSBIb21lcGFnZTogaHR0cDovL3d3dy5lcmcuYWJkbi5hYy51ay91c2Vycy9nZXJyaXQvdWRwLWxpdGUvCisgICAgICAgRm9tIGhlcmUgeW91IGNhbiBhbHNvIGRvd25sb2FkIHNvbWUgZXhhbXBsZSBhcHBsaWNhdGlvbiBzb3VyY2UgY29kZS4KKworICAgbyBUaGUgVURQLUxpdGUgSE9XVE8gb24KKyAgICAgICBodHRwOi8vd3d3LmVyZy5hYmRuLmFjLnVrL3VzZXJzL2dlcnJpdC91ZHAtbGl0ZS9maWxlcy9VRFAtTGl0ZS1IT1dUTy50eHQKKworICAgbyBUaGUgV2lyZXNoYXJrIFVEUC1MaXRlIFdpS2kgKHdpdGggY2FwdHVyZSBmaWxlcyk6CisgICAgICAgaHR0cDovL3dpa2kud2lyZXNoYXJrLm9yZy9MaWdodHdlaWdodF9Vc2VyX0RhdGFncmFtX1Byb3RvY29sCisKKyAgIG8gVGhlIFByb3RvY29sIFNwZWMsIFJGQyAzODI4LCBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzODI4LnR4dAorCisKKyAgSSkgQVBQTElDQVRJT05TCisKKyAgU2V2ZXJhbCBhcHBsaWNhdGlvbnMgaGF2ZSBiZWVuIHBvcnRlZCBzdWNjZXNzZnVsbHkgdG8gVURQLUxpdGUuIEV0aGVyZWFsCisgIChub3cgY2FsbGVkIHdpcmVzaGFyaykgaGFzIFVEUC1MaXRldjQvdjYgc3VwcG9ydCBieSBkZWZhdWx0LiBUaGUgdGFyYmFsbCBvbgorCisgICBodHRwOi8vd3d3LmVyZy5hYmRuLmFjLnVrL3VzZXJzL2dlcnJpdC91ZHAtbGl0ZS9maWxlcy91ZHBsaXRlX2xpbnV4LnRhci5negorCisgIGhhcyBzb3VyY2UgY29kZSBmb3Igc2V2ZXJhbCB2NC92NiBjbGllbnQtc2VydmVyIGFuZCBuZXR3b3JrIHRlc3RpbmcgZXhhbXBsZXMuCisKKyAgUG9ydGluZyBhcHBsaWNhdGlvbnMgdG8gVURQLUxpdGUgaXMgc3RyYWlnaHRmb3J3YXJkOiBvbmx5IHNvY2tldCBsZXZlbCBhbmQKKyAgSVBQUk9UTyBuZWVkIHRvIGJlIGNoYW5nZWQ7IHNlbmRlcnMgYWRkaXRpb25hbGx5IHNldCB0aGUgY2hlY2tzdW0gY292ZXJhZ2UKKyAgbGVuZ3RoIChkZWZhdWx0ID0gaGVhZGVyIGxlbmd0aCA9IDgpLiBEZXRhaWxzIGFyZSBpbiB0aGUgbmV4dCBzZWN0aW9uLgorCisKKyAgSUkpIFBST0dSQU1NSU5HIEFQSQorCisgIFVEUC1MaXRlIHByb3ZpZGVzIGEgY29ubmVjdGlvbmxlc3MsIHVucmVsaWFibGUgZGF0YWdyYW0gc2VydmljZSBhbmQgaGVuY2UKKyAgdXNlcyB0aGUgc2FtZSBzb2NrZXQgdHlwZSBhcyBVRFAuIEluIGZhY3QsIHBvcnRpbmcgZnJvbSBVRFAgdG8gVURQLUxpdGUgaXMKKyAgdmVyeSBlYXN5OiBzaW1wbHkgYWRkIGBJUFBST1RPX1VEUExJVEUnIGFzIHRoZSBsYXN0IGFyZ3VtZW50IG9mIHRoZSBzb2NrZXQoMikKKyAgY2FsbCBzbyB0aGF0IHRoZSBzdGF0ZW1lbnQgbG9va3MgbGlrZToKKworICAgICAgcyA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUExJVEUpOworCisgICAgICAgICAgICAgICAgICAgICAgb3IsIHJlc3BlY3RpdmVseSwKKworICAgICAgcyA9IHNvY2tldChQRl9JTkVUNiwgU09DS19ER1JBTSwgSVBQUk9UT19VRFBMSVRFKTsKKworICBXaXRoIGp1c3QgdGhlIGFib3ZlIGNoYW5nZSB5b3UgYXJlIGFibGUgdG8gcnVuIFVEUC1MaXRlIHNlcnZpY2VzIG9yIGNvbm5lY3QKKyAgdG8gVURQLUxpdGUgc2VydmVycy4gVGhlIGtlcm5lbCB3aWxsIGFzc3VtZSB0aGF0IHlvdSBhcmUgbm90IGludGVyZXN0ZWQgaW4KKyAgdXNpbmcgcGFydGlhbCBjaGVja3N1bSBjb3ZlcmFnZSBhbmQgc28gZW11bGF0ZSBVRFAgbW9kZSAoZnVsbCBjb3ZlcmFnZSkuCisKKyAgVG8gbWFrZSB1c2Ugb2YgdGhlIHBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UgZmFjaWxpdGllcyByZXF1aXJlcyBzZXR0aW5nIGEKKyAgc2luZ2xlIHNvY2tldCBvcHRpb24sIHdoaWNoIHRha2VzIGFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgY292ZXJhZ2UgbGVuZ3RoOgorCisgICAgKiBTZW5kZXIgY2hlY2tzdW0gY292ZXJhZ2U6IFVEUExJVEVfU0VORF9DU0NPVgorCisgICAgICBGb3IgZXhhbXBsZSwKKworICAgICAgICBpbnQgdmFsID0gMjA7CisgICAgICAgIHNldHNvY2tvcHQocywgU09MX1VEUExJVEUsIFVEUExJVEVfU0VORF9DU0NPViwgJnZhbCwgc2l6ZW9mKGludCkpOworCisgICAgICBzZXRzIHRoZSBjaGVja3N1bSBjb3ZlcmFnZSBsZW5ndGggdG8gMjAgYnl0ZXMgKDEyYiBkYXRhICsgOGIgaGVhZGVyKS4KKyAgICAgIE9mIGVhY2ggcGFja2V0IG9ubHkgdGhlIGZpcnN0IDIwIGJ5dGVzIChwbHVzIHRoZSBwc2V1ZG8taGVhZGVyKSB3aWxsIGJlCisgICAgICBjaGVja3N1bW1lZC4gVGhpcyBpcyB1c2VmdWwgZm9yIFJUUCBhcHBsaWNhdGlvbnMgd2hpY2ggaGF2ZSBhIDEyLWJ5dGUKKyAgICAgIGJhc2UgaGVhZGVyLgorCisKKyAgICAqIFJlY2VpdmVyIGNoZWNrc3VtIGNvdmVyYWdlOiBVRFBMSVRFX1JFQ1ZfQ1NDT1YKKworICAgICAgVGhpcyBvcHRpb24gaXMgdGhlIHJlY2VpdmVyLXNpZGUgYW5hbG9ndWUuIEl0IGlzIHRydWx5IG9wdGlvbmFsLCBpLmUuIG5vdAorICAgICAgcmVxdWlyZWQgdG8gZW5hYmxlIHRyYWZmaWMgd2l0aCBwYXJ0aWFsIGNoZWNrc3VtIGNvdmVyYWdlLiBJdHMgZnVuY3Rpb24gaXMKKyAgICAgIHRoYXQgb2YgYSB0cmFmZmljIGZpbHRlcjogd2hlbiBlbmFibGVkLCBpdCBpbnN0cnVjdHMgdGhlIGtlcm5lbCB0byBkcm9wCisgICAgICBhbGwgcGFja2V0cyB3aGljaCBoYXZlIGEgY292ZXJhZ2UgX2xlc3NfIHRoYW4gdGhpcyB2YWx1ZS4gRm9yIGV4YW1wbGUsIGlmCisgICAgICBSVFAgYW5kIFVEUCBoZWFkZXJzIGFyZSB0byBiZSBwcm90ZWN0ZWQsIGEgcmVjZWl2ZXIgY2FuIGVuZm9yY2UgdGhhdCBvbmx5CisgICAgICBwYWNrZXRzIHdpdGggYSBtaW5pbXVtIGNvdmVyYWdlIG9mIDIwIGFyZSBhZG1pdHRlZDoKKworICAgICAgICBpbnQgbWluID0gMjA7CisgICAgICAgIHNldHNvY2tvcHQocywgU09MX1VEUExJVEUsIFVEUExJVEVfUkVDVl9DU0NPViwgJm1pbiwgc2l6ZW9mKGludCkpOworCisgIFRoZSBjYWxscyB0byBnZXRzb2Nrb3B0KDIpIGFyZSBhbmFsb2dvdXMuIEJlaW5nIGFuIGV4dGVuc2lvbiBhbmQgbm90IGEgc3RhbmQtCisgIGFsb25lIHByb3RvY29sLCBhbGwgc29ja2V0IG9wdGlvbnMga25vd24gZnJvbSBVRFAgY2FuIGJlIHVzZWQgaW4gZXhhY3RseSB0aGUKKyAgc2FtZSBtYW5uZXIgYXMgYmVmb3JlLCBlLmcuIFVEUF9DT1JLIG9yIFVEUF9FTkNBUC4KKworICBBIGRldGFpbGVkIGRpc2N1c3Npb24gb2YgVURQLUxpdGUgY2hlY2tzdW0gY292ZXJhZ2Ugb3B0aW9ucyBpcyBpbiBzZWN0aW9uIElWLgorCisKKyAgSUlJKSBIRUFERVIgRklMRVMKKworICBUaGUgc29ja2V0IEFQSSByZXF1aXJlcyBzdXBwb3J0IHRocm91Z2ggaGVhZGVyIGZpbGVzIGluIC91c3IvaW5jbHVkZToKKworICAgICogL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaAorICAgICAgICB0byBkZWZpbmUgSVBQUk9UT19VRFBMSVRFCisKKyAgICAqIC91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcGxpdGUuaAorICAgICAgICBmb3IgVURQLUxpdGUgaGVhZGVyIGZpZWxkcyBhbmQgcHJvdG9jb2wgY29uc3RhbnRzCisKKyAgRm9yIHRlc3RpbmcgcHVycG9zZXMsIHRoZSBmb2xsb3dpbmcgY2FuIHNlcnZlIGFzIGEgYG1pbmknIGhlYWRlciBmaWxlOgorCisgICAgI2RlZmluZSBJUFBST1RPX1VEUExJVEUgICAgICAgMTM2CisgICAgI2RlZmluZSBTT0xfVURQTElURSAgICAgICAgICAgMTM2CisgICAgI2RlZmluZSBVRFBMSVRFX1NFTkRfQ1NDT1YgICAgIDEwCisgICAgI2RlZmluZSBVRFBMSVRFX1JFQ1ZfQ1NDT1YgICAgIDExCisKKyAgUmVhZHktbWFkZSBoZWFkZXIgZmlsZXMgZm9yIHZhcmlvdXMgZGlzdHJvcyBhcmUgaW4gdGhlIFVEUC1MaXRlIHRhcmJhbGwuCisKKworICBJVikgS0VSTkVMIEJFSEFWSU9VUiBXSVRIIFJFR0FSRCBUTyBUSEUgVkFSSU9VUyBTT0NLRVQgT1BUSU9OUworCisgIFRvIGVuYWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMsIHRoZSBsb2cgbGV2ZWwgbmVlZCB0byBiZSBzZXQgdG8gOCwgYXMgbW9zdAorICBtZXNzYWdlcyB1c2UgdGhlIEtFUk5fREVCVUcgbGV2ZWwgKDcpLgorCisgIDEpIFNlbmRlciBTb2NrZXQgT3B0aW9ucworCisgIElmIHRoZSBzZW5kZXIgc3BlY2lmaWVzIGEgdmFsdWUgb2YgMCBhcyBjb3ZlcmFnZSBsZW5ndGgsIHRoZSBtb2R1bGUKKyAgYXNzdW1lcyBmdWxsIGNvdmVyYWdlLCB0cmFuc21pdHMgYSBwYWNrZXQgd2l0aCBjb3ZlcmFnZSBsZW5ndGggb2YgMAorICBhbmQgYWNjb3JkaW5nIGNoZWNrc3VtLiAgSWYgdGhlIHNlbmRlciBzcGVjaWZpZXMgYSBjb3ZlcmFnZSA8IDggYW5kCisgIGRpZmZlcmVudCBmcm9tIDAsIHRoZSBrZXJuZWwgYXNzdW1lcyA4IGFzIGRlZmF1bHQgdmFsdWUuICBGaW5hbGx5LAorICBpZiB0aGUgc3BlY2lmaWVkIGNvdmVyYWdlIGxlbmd0aCBleGNlZWRzIHRoZSBwYWNrZXQgbGVuZ3RoLCB0aGUgcGFja2V0CisgIGxlbmd0aCBpcyB1c2VkIGluc3RlYWQgYXMgY292ZXJhZ2UgbGVuZ3RoLgorCisgIDIpIFJlY2VpdmVyIFNvY2tldCBPcHRpb25zCisKKyAgVGhlIHJlY2VpdmVyIHNwZWNpZmllcyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgY292ZXJhZ2UgbGVuZ3RoIGl0CisgIGlzIHdpbGxpbmcgdG8gYWNjZXB0LiAgQSB2YWx1ZSBvZiAwIGhlcmUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlY2VpdmVyCisgIGFsd2F5cyB3YW50cyB0aGUgd2hvbGUgb2YgdGhlIHBhY2tldCBjb3ZlcmVkLiBJbiB0aGlzIGNhc2UsIGFsbAorICBwYXJ0aWFsbHkgY292ZXJlZCBwYWNrZXRzIGFyZSBkcm9wcGVkIGFuZCBhbiBlcnJvciBpcyBsb2dnZWQuCisKKyAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHNwZWNpZnkgaWxsZWdhbCB2YWx1ZXMgKDwwIGFuZCA8OCk7IGluIHRoZXNlCisgIGNhc2VzIHRoZSBkZWZhdWx0IG9mIDggaXMgYXNzdW1lZC4KKworICBBbGwgcGFja2V0cyBhcnJpdmluZyB3aXRoIGEgY292ZXJhZ2UgdmFsdWUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQKKyAgdGhyZXNob2xkIGFyZSBkaXNjYXJkZWQsIHRoZXNlIGV2ZW50cyBhcmUgYWxzbyBsb2dnZWQuCisKKyAgMykgRGlzYWJsaW5nIHRoZSBDaGVja3N1bSBDb21wdXRhdGlvbgorCisgIE9uIGJvdGggc2VuZGVyIGFuZCByZWNlaXZlciwgY2hlY2tzdW1taW5nIHdpbGwgYWx3YXlzIGJlIHBlcmZvcm1lZAorICBhbmQgY2FuIG5vdCBiZSBkaXNhYmxlZCB1c2luZyBTT19OT19DSEVDSy4gVGh1cworCisgICAgICAgIHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19OT19DSEVDSywgIC4uLiApOworCisgIHdpbGwgYWx3YXlzIHdpbGwgYmUgaWdub3JlZCwgd2hpbGUgdGhlIHZhbHVlIG9mCisKKyAgICAgICAgZ2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX05PX0NIRUNLLCAmdmFsdWUsIC4uLik7CisKKyAgaXMgbWVhbmluZ2xlc3MgKGFzIGluIFRDUCkuIFBhY2tldHMgd2l0aCBhIHplcm8gY2hlY2tzdW0gZmllbGQgYXJlCisgIGlsbGVnYWwgKGNmLiBSRkMgMzgyOCwgc2VjLiAzLjEpIHdpbGwgYmUgc2lsZW50bHkgZGlzY2FyZGVkLgorCisgIDQpIEZyYWdtZW50YXRpb24KKworICBUaGUgY2hlY2tzdW0gY29tcHV0YXRpb24gcmVzcGVjdHMgYm90aCBidWZmZXJzaXplIGFuZCBNVFUuIFRoZSBzaXplCisgIG9mIFVEUC1MaXRlIHBhY2tldHMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2l6ZSBvZiB0aGUgc2VuZCBidWZmZXIuIFRoZQorICBtaW5pbXVtIHNpemUgb2YgdGhlIHNlbmQgYnVmZmVyIGlzIDIwNDggKGRlZmluZWQgYXMgU09DS19NSU5fU05EQlVGCisgIGluIGluY2x1ZGUvbmV0L3NvY2suaCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGNvbmZpZ3VyYWJsZSBhcworICBuZXQuY29yZS53bWVtX2RlZmF1bHQgb3IgdmlhIHNldHRpbmcgdGhlIFNPX1NOREJVRiBzb2NrZXQoNykKKyAgb3B0aW9uLiBUaGUgbWF4aW11bSB1cHBlciBib3VuZCBmb3IgdGhlIHNlbmQgYnVmZmVyIGlzIGRldGVybWluZWQKKyAgYnkgbmV0LmNvcmUud21lbV9tYXguCisKKyAgR2l2ZW4gYSBwYXlsb2FkIHNpemUgbGFyZ2VyIHRoYW4gdGhlIHNlbmQgYnVmZmVyIHNpemUsIFVEUC1MaXRlIHdpbGwKKyAgc3BsaXQgdGhlIHBheWxvYWQgaW50byBzZXZlcmFsIGluZGl2aWR1YWwgcGFja2V0cywgZmlsbGluZyB1cCB0aGUKKyAgc2VuZCBidWZmZXIgc2l6ZSBpbiBlYWNoIGNhc2UuCisKKyAgVGhlIHByZWNpc2UgdmFsdWUgYWxzbyBkZXBlbmRzIG9uIHRoZSBpbnRlcmZhY2UgTVRVLiBUaGUgaW50ZXJmYWNlIE1UVSwKKyAgaW4gdHVybiwgbWF5IHRyaWdnZXIgSVAgZnJhZ21lbnRhdGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgZ2VuZXJhdGVkCisgIFVEUC1MaXRlIHBhY2tldCBpcyBzcGxpdCBpbnRvIHNldmVyYWwgSVAgcGFja2V0cywgb2Ygd2hpY2ggb25seSB0aGUKKyAgZmlyc3Qgb25lIGNvbnRhaW5zIHRoZSBMNCBoZWFkZXIuCisKKyAgVGhlIHNlbmQgYnVmZmVyIHNpemUgaGFzIGltcGxpY2F0aW9ucyBvbiB0aGUgY2hlY2tzdW0gY292ZXJhZ2UgbGVuZ3RoLgorICBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKKyAgUGF5bG9hZDogMTUzNiBieXRlcyAgICAgICAgICBTZW5kIEJ1ZmZlcjogICAgIDEwMjQgYnl0ZXMKKyAgTVRVOiAgICAgMTUwMCBieXRlcyAgICAgICAgICBDb3ZlcmFnZSBMZW5ndGg6ICA4NTYgYnl0ZXMKKworICBVRFAtTGl0ZSB3aWxsIHNoaXAgdGhlIDE1MzYgYnl0ZXMgaW4gdHdvIHNlcGFyYXRlIHBhY2tldHM6CisKKyAgUGFja2V0IDE6IDEwMjQgcGF5bG9hZCArIDggYnl0ZSBoZWFkZXIgKyAyMCBieXRlIElQIGhlYWRlciA9IDEwNTIgYnl0ZXMKKyAgUGFja2V0IDI6ICA1MTIgcGF5bG9hZCArIDggYnl0ZSBoZWFkZXIgKyAyMCBieXRlIElQIGhlYWRlciA9ICA1NDAgYnl0ZXMKKworICBUaGUgY292ZXJhZ2UgcGFja2V0IGNvdmVycyB0aGUgVURQLUxpdGUgaGVhZGVyIGFuZCA4NDggYnl0ZXMgb2YgdGhlCisgIHBheWxvYWQgaW4gdGhlIGZpcnN0IHBhY2tldCwgdGhlIHNlY29uZCBwYWNrZXQgaXMgZnVsbHkgY292ZXJlZC4gTm90ZQorICB0aGF0IGZvciB0aGUgc2Vjb25kIHBhY2tldCwgdGhlIGNvdmVyYWdlIGxlbmd0aCBleGNlZWRzIHRoZSBwYWNrZXQKKyAgbGVuZ3RoLiBUaGUga2VybmVsIGFsd2F5cyByZS1hZGp1c3RzIHRoZSBjb3ZlcmFnZSBsZW5ndGggdG8gdGhlIHBhY2tldAorICBsZW5ndGggaW4gc3VjaCBjYXNlcy4KKworICBBcyBhbiBleGFtcGxlIG9mIHdoYXQgaGFwcGVucyB3aGVuIG9uZSBVRFAtTGl0ZSBwYWNrZXQgaXMgc3BsaXQgaW50bworICBzZXZlcmFsIHRpbnkgZnJhZ21lbnRzLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCisKKyAgUGF5bG9hZDogMTAyNCBieXRlcyAgICAgICAgICAgIFNlbmQgYnVmZmVyIHNpemU6IDEwMjQgYnl0ZXMKKyAgTVRVOiAgICAgIDMwMCBieXRlcyAgICAgICAgICAgIENvdmVyYWdlIGxlbmd0aDogICA1NzUgYnl0ZXMKKworICArLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgfDh8ICAgIDI3MiAgICB8ICAgICAgMjgwICAgICB8ICAgICAyODAgICAgICB8ICAgICAyODAgICAgICB8CisgICstKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgMjgwICAgICAgICAgICAgNTYwICAgICAgICAgICAgODQwICAgICAgICAgICAxMDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICoqKioqY2hlY2tzdW0gY292ZXJhZ2UqKioqKioqKioqKioqCisKKyAgVGhlIFVEUC1MaXRlIG1vZHVsZSBnZW5lcmF0ZXMgb25lIDEwMzIgYnl0ZSBwYWNrZXQgKDEwMjQgKyA4IGJ5dGUKKyAgaGVhZGVyKS4gQWNjb3JkaW5nIHRvIHRoZSBpbnRlcmZhY2UgTVRVLCB0aGVzZSBhcmUgc3BsaXQgaW50byA0IElQCisgIHBhY2tldHMgKDI4MCBieXRlIElQIHBheWxvYWQgKyAyMCBieXRlIElQIGhlYWRlcikuIFRoZSBrZXJuZWwgbW9kdWxlCisgIHN1bXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRpcmUgZmlyc3QgdHdvIHBhY2tldHMsIHBsdXMgMTUgYnl0ZXMgb2YKKyAgdGhlIGxhc3QgcGFja2V0IGJlZm9yZSByZWxlYXNpbmcgdGhlIGZyYWdtZW50cyB0byB0aGUgSVAgbW9kdWxlLgorCisgIFRvIHNlZSB0aGUgYW5hbG9nb3VzIGNhc2UgZm9yIElQdjYgZnJhZ21lbnRhdGlvbiwgY29uc2lkZXIgYSBsaW5rCisgIE1UVSBvZiAxMjgwIGJ5dGVzIGFuZCBhIHdyaXRlIGJ1ZmZlciBvZiAzMzU2IGJ5dGVzLiBJZiB0aGUgY2hlY2tzdW0KKyAgY292ZXJhZ2UgaXMgbGVzcyB0aGFuIDEyMzIgYnl0ZXMgKE1UVSBtaW51cyBJUHY2L2ZyYWdtZW50IGhlYWRlcgorICBsZW5ndGhzKSwgb25seSB0aGUgZmlyc3QgZnJhZ21lbnQgbmVlZHMgdG8gYmUgY29uc2lkZXJlZC4gV2hlbiB1c2luZworICBsYXJnZXIgY2hlY2tzdW0gY292ZXJhZ2UgbGVuZ3RocywgZWFjaCBlbGlnaWJsZSBmcmFnbWVudCBuZWVkcyB0byBiZQorICBjaGVja3N1bW1lZC4gU3VwcG9zZSB3ZSBoYXZlIGEgY2hlY2tzdW0gY292ZXJhZ2Ugb2YgMzA2Mi4gVGhlIGJ1ZmZlcgorICBvZiAzMzU2IGJ5dGVzIHdpbGwgYmUgc3BsaXQgaW50byB0aGUgZm9sbG93aW5nIGZyYWdtZW50czoKKworICAgIEZyYWdtZW50IDE6IDEyODAgYnl0ZXMgY2FycnlpbmcgIDEyMzIgYnl0ZXMgb2YgVURQLUxpdGUgZGF0YQorICAgIEZyYWdtZW50IDI6IDEyODAgYnl0ZXMgY2FycnlpbmcgIDEyMzIgYnl0ZXMgb2YgVURQLUxpdGUgZGF0YQorICAgIEZyYWdtZW50IDM6ICA5NDggYnl0ZXMgY2FycnlpbmcgICA5MDAgYnl0ZXMgb2YgVURQLUxpdGUgZGF0YQorCisgIFRoZSBmaXJzdCB0d28gZnJhZ21lbnRzIGhhdmUgdG8gYmUgY2hlY2tzdW1tZWQgaW4gZnVsbCwgb2YgdGhlIGxhc3QKKyAgZnJhZ21lbnQgb25seSA1OTggKD0gMzA2MiAtIDIqMTIzMikgYnl0ZXMgYXJlIGNoZWNrc3VtbWVkLgorCisgIFdoaWxlIGl0IGlzIGltcG9ydGFudCB0aGF0IHN1Y2ggY2FzZXMgYXJlIGRlYWx0IHdpdGggY29ycmVjdGx5LCB0aGV5CisgIGFyZSAoYW5ub3lpbmdseSkgcmFyZTogVURQLUxpdGUgaXMgZGVzaWduZWQgZm9yIG9wdGltaXNpbmcgbXVsdGltZWRpYQorICBwZXJmb3JtYW5jZSBvdmVyIHdpcmVsZXNzIChvciBnZW5lcmFsbHkgbm9pc3kpIGxpbmtzIGFuZCB0aHVzIHNtYWxsZXIKKyAgY292ZXJhZ2UgbGVuZ2h0cyBhcmUgbGlrZWx5IHRvIGJlIGV4cGVjdGVkLgorCisKKyAgVikgVURQLUxJVEUgUlVOVElNRSBTVEFUSVNUSUNTIEFORCBUSEVJUiBNRUFOSU5HCisKKyAgRXhjZXB0aW9uYWwgYW5kIGVycm9yIGNvbmRpdGlvbnMgYXJlIGxvZ2dlZCB0byBzeXNsb2cgYXQgdGhlIEtFUk5fREVCVUcKKyAgbGV2ZWwuICBMaXZlIHN0YXRpc3RpY3MgYWJvdXQgVURQLUxpdGUgYXJlIGF2YWlsYWJsZSBpbiAvcHJvYy9uZXQvc25tcAorICBhbmQgY2FuICh3aXRoIG5ld2VyIHZlcnNpb25zIG9mIG5ldHN0YXQpIGJlIHZpZXdlZCB1c2luZworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c3RhdCAtc3Z1CisKKyAgVGhpcyBkaXNwbGF5cyBVRFAtTGl0ZSBzdGF0aXN0aWNzIHZhcmlhYmxlcywgd2hvc2UgbWVhbmluZyBpcyBhcyBmb2xsb3dzLgorCisgICBJbkRhdGFncmFtczogICAgIFRvdGFsIG51bWJlciBvZiByZWNlaXZlZCBkYXRhZ3JhbXMuCisKKyAgIE5vUG9ydHM6ICAgICAgICAgTnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgdG8gYW4gdW5rbm93biBwb3J0LgorICAgICAgICAgICAgICAgICAgICBUaGVzZSBjYXNlcyBhcmUgY291bnRlZCBzZXBhcmF0ZWx5IChub3QgYXMgSW5FcnJvcnMpLgorCisgICBJbkVycm9yczogICAgICAgIE51bWJlciBvZiBlcnJvbmVvdXMgVURQLUxpdGUgcGFja2V0cy4gRXJyb3JzIGluY2x1ZGU6CisgICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcm5hbCBzb2NrZXQgcXVldWUgcmVjZWl2ZSBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAqIHBhY2tldCB0b28gc2hvcnQgKGxlc3MgdGhhbiA4IGJ5dGVzIG9yIHN0YXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2UgbGVuZ3RoIGV4Y2VlZHMgcmVjZWl2ZWQgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICogeGZybTRfcG9saWN5X2NoZWNrKCkgcmV0dXJuZWQgd2l0aCBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICogYXBwbGljYXRpb24gaGFzIHNwZWNpZmllZCBsYXJnZXIgbWluLiBjb3ZlcmFnZQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIHRoYW4gdGhhdCBvZiBpbmNvbWluZyBwYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgICAqIGNoZWNrc3VtIGNvdmVyYWdlIHZpb2xhdGVkCisgICAgICAgICAgICAgICAgICAgICAgKiBiYWQgY2hlY2tzdW0KKworICAgT3V0RGF0YWdyYW1zOiAgICBUb3RhbCBudW1iZXIgb2Ygc2VudCBkYXRhZ3JhbXMuCisKKyAgIFRoZXNlIHN0YXRpc3RpY3MgZGVyaXZlIGZyb20gdGhlIFVEUCBNSUIgKFJGQyAyMDEzKS4KKworCisgIFZJKSBJUFRBQkxFUworCisgIFRoZXJlIGlzIHBhY2tldCBtYXRjaCBzdXBwb3J0IGZvciBVRFAtTGl0ZSBhcyB3ZWxsIGFzIHN1cHBvcnQgZm9yIHRoZSBMT0cgdGFyZ2V0LgorICBJZiB5b3UgY29weSBhbmQgcGFzdGUgdGhlIGZvbGxvd2luZyBsaW5lIGludG8gL2V0Yy9wcm90Y29scywKKworICB1ZHBsaXRlIDEzNiAgICAgVURQLUxpdGUgICAgICAgICMgVURQLUxpdGUgW1JGQyAzODI4XQorCisgIHRoZW4KKyAgICAgICAgICAgICAgaXB0YWJsZXMgLUEgSU5QVVQgLXAgdWRwbGl0ZSAtaiBMT0cKKworICB3aWxsIHByb2R1Y2UgbG9nZ2luZyBvdXRwdXQgdG8gc3lzbG9nLiBEcm9wcGluZyBhbmQgcmVqZWN0aW5nIHBhY2tldHMgYWxzbyB3b3Jrcy4KKworCisgIFZJSSkgTUFJTlRBSU5FUiBBRERSRVNTCisKKyAgVGhlIFVEUC1MaXRlIHBhdGNoIHdhcyBkZXZlbG9wZWQgYXQKKyAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBvZiBBYmVyZGVlbgorICAgICAgICAgICAgICAgICAgICBFbGVjdHJvbmljcyBSZXNlYXJjaCBHcm91cAorICAgICAgICAgICAgICAgICAgICBEZXBhcnRtZW50IG9mIEVuZ2luZWVyaW5nCisgICAgICAgICAgICAgICAgICAgIEZyYXNlciBOb2JsZSBCdWlsZGluZworICAgICAgICAgICAgICAgICAgICBBYmVyZGVlbiBBQjI0IDNVRTsgVUsKKyAgVGhlIGN1cnJlbnQgbWFpbnRhaW5lciBpcyBHZXJyaXQgUmVua2VyLCA8Z2Vycml0QGVyZy5hYmRuLmFjLnVrPi4gSW5pdGlhbAorICBjb2RlIHdhcyBkZXZlbG9wZWQgYnkgV2lsbGlhbSAgU3RhbmlzbGF1cywgPHdpbGxpYW1AZXJnLmFiZG4uYWMudWs+LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0CmluZGV4IDBjZjY1NDEuLjY1Mzk3OGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQKQEAgLTQxMiw3ICs0MTIsNyBAQAogCiBiZXRhMy0yLjEuNCBKdWwgMjAwMAkJbyBYMjUgTV9CSVQgUHJvYmxlbSBmaXguCiAJCQkJbyBBZGRlZCB0aGUgTXVsdGktUG9ydCBQUFAKLQkJCQkgIFVwZGF0ZWQgdXRpbGl0ZXMgZm9yIHRoZSBNdWx0aS1Qb3J0IFBQUC4KKwkJCQkgIFVwZGF0ZWQgdXRpbGl0aWVzIGZvciB0aGUgTXVsdGktUG9ydCBQUFAuCiAKIDIuMS40CUF1dCAyMDAwCiAJCQkJbyBJbiBYMjVBUEk6CkBAIC00NDQsMTMgKzQ0NCwxMyBAQAogCQkJCQkKIAkJCQlvIENwaXBlbW9uCiAJCQkJCS0gQWRkZWQgc2V0IEZUMSBjb21tYW5kcyB0byB0aGUgY3BpcGVtb24uIFRodXMgQ1NVL0RTVQotCQkJCQkgIGNvbmZpZ3VyYWl0b24gY2FuIGJlIHBlcmZvcm1lZCB1c2luZyBjcGlwZW1vbi4KKwkJCQkJICBjb25maWd1cmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgdXNpbmcgY3BpcGVtb24uCiAJCQkJCSAgQWxsIHN5c3RlbXMgdGhhdCBjYW5ub3QgcnVuIGNmZ2Z0MSBHVUkgdXRpbGl0eSBzaG91bGQKIAkJCQkJICB1c2UgY3BpcGVtb24gdG8gY29uZmlndXJlIHRoZSBvbiBib2FyZCBDU1UvRFNVLgogCiAKIAkJCQlvIEtleWJvYXJkIExlZCBNb25pdG9yL0RlYnVnZ2VyCi0JCQkJCS0gQSBuZXcgdXRpbHR5IC91c3Ivc2Jpbi93cGtiZG1vbiB1c2VzIGtleWJvYXJkIGxlZHMKKwkJCQkJLSBBIG5ldyB1dGlsaXR5IC91c3Ivc2Jpbi93cGtiZG1vbiB1c2VzIGtleWJvYXJkIGxlZHMKIAkJCQkJICB0byBjb252ZXkgb3BlcmF0aW9uYWwgc3RhdGlzdGljIGluZm9ybWF0aW9uIG9mIHRoZSAKIAkJCQkJICBTYW5nb21hIFdBTlBJUEUgY2FyZHMuCiAJCQkJCU5VTV9MT0NLICAgID0gTGluZSBTdGF0ZSAgKE9uPWNvbm5lY3RlZCwgICAgT2ZmPWRpc2Nvbm5lY3RlZCkKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCQkJCQktIEFwcHJvcHJpYXRlIG51bWJlciBvZiBkZXZpY2VzIGFyZSBkeW5hbWljYWxseSBsb2FkZWQgCiAJCQkJCSAgYmFzZWQgb24gdGhlIG51bWJlciBvZiBTYW5nb21hIGNhcmRzIGZvdW5kLgogCi0JCQkJCSAgTm90ZTogVGhlIGtlcm5lbCBjb25maWd1cmFpdG9uIG9wdGlvbiAKKwkJCQkJICBOb3RlOiBUaGUga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9uIAogCQkJCQkJQ09ORklHX1dBTlBJUEVfQ0FSRFMgaGFzIGJlZW4gdGFrZW4gb3V0LgogCQkJCQkKIAkJCQlvIEZpeGVkIHRoZSBGcmFtZSBSZWxheSBhbmQgQ2hkbGMgbmV0d29yayBpbnRlcmZhY2VzIHNvIHRoZXkgYXJlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveGZybV9zeW5jLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy94ZnJtX3N5bmMudHh0CmluZGV4IDhiZTYyNmYuLmQ3YWFjOWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy94ZnJtX3N5bmMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy94ZnJtX3N5bmMudHh0CkBAIC00NywxMCArNDcsMTMgQEAKIAogICAgc3RydWN0IHhmcm1fYWV2ZW50X2lkIHsKICAgICAgICAgICAgICBzdHJ1Y3QgeGZybV91c2Vyc2FfaWQgICAgICAgICAgIHNhX2lkOworICAgICAgICAgICAgIHhmcm1fYWRkcmVzc190ICAgICAgICAgICAgICAgICAgc2FkZHI7CiAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKKyAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcWlkOwogICAgfTsKIAoteGZybV91c2Vyc2FfaWQgaW4gdGhpcyBtZXNzYWdlIGxheW91dCBpZGVudGlmaWVzIHRoZSBTQS4KK1RoZSB1bmlxdWUgU0EgaXMgaWRlbnRpZmllZCBieSB0aGUgY29tYmluYXRpb24gb2YgeGZybV91c2Vyc2FfaWQsCityZXFpZCBhbmQgc2FkZHIuCiAKIGZsYWdzIGFyZSB1c2VkIHRvIGluZGljYXRlIGRpZmZlcmVudCB0aGluZ3MuIFRoZSBwb3NzaWJsZQogZmxhZ3MgYXJlOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wbnAudHh0IGIvRG9jdW1lbnRhdGlvbi9wbnAudHh0CmluZGV4IDlmZjk2NmIuLjI4MDM3YWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG5wLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3BucC50eHQKQEAgLTE4NCw3ICsxODQsNyBAQAogUGxlYXNlIG5vdGUgdGhhdCB0aGUgY2hhcmFjdGVyICdYJyBjYW4gYmUgdXNlZCBhcyBhIHdpbGQgY2FyZCBpbiB0aGUgZnVuY3Rpb24KIHBvcnRpb24gKGxhc3QgZm91ciBjaGFyYWN0ZXJzKS4KIGV4OgotCS8qIFVua293biBQblAgbW9kZW1zICovCisJLyogVW5rbm93biBQblAgbW9kZW1zICovCiAJewkiUE5QQ1hYWCIsCQlVTktOT1dOX0RFVgl9LAogCiBTdXBwb3J0ZWQgUG5QIGNhcmQgSURzIGNhbiBvcHRpb25hbGx5IGJlIGRlZmluZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQKaW5kZXggYTY2YmVjMi4uNzQzMTFkNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9pbnRlcmZhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvaW50ZXJmYWNlLnR4dApAQCAtMzAsNiArMzAsMTcgQEAKIHRoYXQgaXMga25vd24gYSBwcmlvcmkuIEJ1dCwgdGhlIHVzZXIgbWF5IGNob29zZSAnc2h1dGRvd24nIG9yCiAncmVib290JyBhcyBhbHRlcm5hdGl2ZXMuIAogCitBZGRpdGlvbmFsbHksIC9zeXMvcG93ZXIvZGlzayBjYW4gYmUgdXNlZCB0byB0dXJuIG9uIG9uZSBvZiB0aGUgdHdvIHRlc3RpbmcKK21vZGVzIG9mIHRoZSBzdXNwZW5kLXRvLWRpc2sgbWVjaGFuaXNtOiAndGVzdHByb2MnIG9yICd0ZXN0Jy4gIElmIHRoZQorc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbSBpcyBpbiB0aGUgJ3Rlc3Rwcm9jJyBtb2RlLCB3cml0aW5nICdkaXNrJyB0bworL3N5cy9wb3dlci9zdGF0ZSB3aWxsIGNhdXNlIHRoZSBrZXJuZWwgdG8gZGlzYWJsZSBub25ib290IENQVXMgYW5kIGZyZWV6ZQordGFza3MsIHdhaXQgZm9yIDUgc2Vjb25kcywgdW5mcmVlemUgdGFza3MgYW5kIGVuYWJsZSBub25ib290IENQVXMuICBJZiBpdCBpcworaW4gdGhlICd0ZXN0JyBtb2RlLCB3cml0aW5nICdkaXNrJyB0byAvc3lzL3Bvd2VyL3N0YXRlIHdpbGwgY2F1c2UgdGhlIGtlcm5lbAordG8gZGlzYWJsZSBub25ib290IENQVXMgYW5kIGZyZWV6ZSB0YXNrcywgc2hyaW5rIG1lbW9yeSwgc3VzcGVuZCBkZXZpY2VzLCB3YWl0Citmb3IgNSBzZWNvbmRzLCByZXN1bWUgZGV2aWNlcywgdW5mcmVlemUgdGFza3MgYW5kIGVuYWJsZSBub25ib290IENQVXMuICBUaGVuLAord2UgYXJlIGFibGUgdG8gbG9vayBpbiB0aGUgbG9nIG1lc3NhZ2VzIGFuZCB3b3JrIG91dCwgZm9yIGV4YW1wbGUsIHdoaWNoIGNvZGUKK2lzIGJlaW5nIHNsb3cgYW5kIHdoaWNoIGRldmljZSBkcml2ZXJzIGFyZSBtaXNiZWhhdmluZy4KKwogUmVhZGluZyBmcm9tIHRoaXMgZmlsZSB3aWxsIGRpc3BsYXkgd2hhdCB0aGUgbW9kZSBpcyBjdXJyZW50bHkgc2V0CiB0by4gV3JpdGluZyB0byB0aGlzIGZpbGUgd2lsbCBhY2NlcHQgb25lIG9mCiAKQEAgLTM3LDYgKzQ4LDggQEAKICAgICAgICAncGxhdGZvcm0nCiAgICAgICAgJ3NodXRkb3duJwogICAgICAgICdyZWJvb3QnCisgICAgICAgJ3Rlc3Rwcm9jJworICAgICAgICd0ZXN0JwogCiBJdCB3aWxsIG9ubHkgY2hhbmdlIHRvICdmaXJtd2FyZScgb3IgJ3BsYXRmb3JtJyBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzCiBpdC4gCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3BjaS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3BjaS50eHQKaW5kZXggMjRlZGYyNS4uYzc1MGY5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9wY2kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvcGNpLnR4dApAQCAtMTUzLDcgKzE1Myw3IEBACiAJZXZlbnRzLCB3aGljaCBpcyBpbXBsaWNpdCBpZiBpdCBkb2Vzbid0IGV2ZW4gc3VwcG9ydCBpdCBpbiB0aGUgZmlyc3QKIAlwbGFjZSkuCiAKLQlOb3RlIHRoYXQgdGhlIFBNQyBSZWdpc3RlciBpbiB0aGUgZGV2aWNlJ3MgUE0gQ2FwYWJpbHRpZXMgaGFzIGEgYml0bWFzaworCU5vdGUgdGhhdCB0aGUgUE1DIFJlZ2lzdGVyIGluIHRoZSBkZXZpY2UncyBQTSBDYXBhYmlsaXRpZXMgaGFzIGEgYml0bWFzawogCW9mIHRoZSBzdGF0ZXMgaXQgc3VwcG9ydHMgZ2VuZXJhdGluZyBQTUUjIGZyb20uIEQzaG90IGlzIGJpdCAzIGFuZAogCUQzY29sZCBpcyBiaXQgNC4gU28sIHdoaWxlIGEgdmFsdWUgb2YgNCBhcyB0aGUgc3RhdGUgbWF5IG5vdCBzZWVtCiAJc2VtYW50aWNhbGx5IGNvcnJlY3QsIGl0IGlzLiAKQEAgLTI2OCw3ICsyNjgsNyBAQAogc29tZSBub24tc3RhbmRhcmQgd2F5IG9mIGdlbmVyYXRpbmcgYSB3YWtlIGV2ZW50IG9uIHNsZWVwLikKIAogQml0cyAxNToxMSBvZiB0aGUgUE1DIChQb3dlciBNZ210IENhcGFiaWxpdGllcykgUmVnaXN0ZXIgaW4gYSBkZXZpY2UncwotUE0gQ2FwYWJpbHRpZXMgZGVzY3JpYmUgd2hhdCBwb3dlciBzdGF0ZXMgdGhlIGRldmljZSBzdXBwb3J0cyBnZW5lcmF0aW5nIGEgCitQTSBDYXBhYmlsaXRpZXMgZGVzY3JpYmUgd2hhdCBwb3dlciBzdGF0ZXMgdGhlIGRldmljZSBzdXBwb3J0cyBnZW5lcmF0aW5nIGEgCiB3YWtlIGV2ZW50IGZyb206CiAKICstLS0tLS0tLS0tLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3MycmFtLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvczJyYW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWY1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3MycmFtLnR4dApAQCAtMCwwICsxLDU2IEBACisJCQlIb3cgdG8gZ2V0IHMycmFtIHdvcmtpbmcKKwkJCX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCQkJMjAwNiBMaW51cyBUb3J2YWxkcworCQkJMjAwNiBQYXZlbCBNYWNoZWsKKworMSkgQ2hlY2sgc3VzcGVuZC5zZi5uZXQsIHByb2dyYW0gczJyYW0gdGhlcmUgaGFzIGxvbmcgd2hpdGVsaXN0IG9mCisgICAia25vd24gb2siIG1hY2hpbmVzLCBhbG9uZyB3aXRoIHRyaWNrcyB0byB1c2Ugb24gZWFjaCBvbmUuCisKKzIpIElmIHRoYXQgZG9lcyBub3QgaGVscCwgdHJ5IHJlYWRpbmcgdHJpY2tzLnR4dCBhbmQKKyAgIHZpZGVvLnR4dC4gUGVyaGFwcyBwcm9ibGVtIGlzIGFzIHNpbXBsZSBhcyBicm9rZW4gbW9kdWxlLCBhbmQKKyAgIHNpbXBsZSBtb2R1bGUgdW5sb2FkIGNhbiBmaXggaXQuCisKKzMpIFlvdSBjYW4gdXNlIExpbnVzJyBUUkFDRV9SRVNVTUUgaW5mcmFzdHJ1Y3R1cmUsIGRlc2NyaWJlZCBiZWxvdy4KKworCQkgICAgICBVc2luZyBUUkFDRV9SRVNVTUUKKwkJICAgICAgfn5+fn5+fn5+fn5+fn5+fn5+CisKK0kndmUgYmVlbiB3b3JraW5nIGF0IG1ha2luZyB0aGUgbWFjaGluZXMgSSBoYXZlIGFibGUgdG8gU1RSLCBhbmQgYWxtb3N0CithbHdheXMgaXQncyBhIGRyaXZlciB0aGF0IGlzIGJ1Z2d5LiBUaGFuayBHb2QgZm9yIHRoZSBzdXNwZW5kL3Jlc3VtZQorZGVidWdnaW5nIC0gdGhlIHRoaW5nIHRoYXQgQ2h1Y2sgdHJpZWQgdG8gZGlzYWJsZS4gVGhhdCdzIG9mdGVuIHRoZSBfb25seV8KK3dheSB0byBkZWJ1ZyB0aGVzZSB0aGluZ3MsIGFuZCBpdCdzIGFjdHVhbGx5IHByZXR0eSBwb3dlcmZ1bCAoYnV0Cit0aW1lLWNvbnN1bWluZyAtIGhhdmluZyB0byBpbnNlcnQgVFJBQ0VfUkVTVU1FKCkgbWFya2VycyBpbnRvIHRoZSBkZXZpY2UKK2RyaXZlciB0aGF0IGRvZXNuJ3QgcmVzdW1lIGFuZCByZWNvbXBpbGUgYW5kIHJlYm9vdCkuCisKK0FueXdheSwgdGhlIHdheSB0byBkZWJ1ZyB0aGlzIGZvciBwZW9wbGUgd2hvIGFyZSBpbnRlcmVzdGVkIChoYXZlIGEKK21hY2hpbmUgdGhhdCBkb2Vzbid0IGJvb3QpIGlzOgorCisgLSBlbmFibGUgUE1fREVCVUcsIGFuZCBQTV9UUkFDRQorCisgLSB1c2UgYSBzY3JpcHQgbGlrZSB0aGlzOgorCisJIyEvYmluL3NoCisJc3luYworCWVjaG8gMSA+IC9zeXMvcG93ZXIvcG1fdHJhY2UKKwllY2hvIG1lbSA+IC9zeXMvcG93ZXIvc3RhdGUKKworICAgdG8gc3VzcGVuZAorCisgLSBpZiBpdCBkb2Vzbid0IGNvbWUgYmFjayB1cCAod2hpY2ggaXMgdXN1YWxseSB0aGUgcHJvYmxlbSksIHJlYm9vdCBieQorICAgaG9sZGluZyB0aGUgcG93ZXIgYnV0dG9uIGRvd24sIGFuZCBsb29rIGF0IHRoZSBkbWVzZyBvdXRwdXQgZm9yIHRoaW5ncworICAgbGlrZQorCisJTWFnaWMgbnVtYmVyOiA0OjE1Njo3MjUKKwloYXNoIG1hdGNoZXMgZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jOjI4CisJaGFzaCBtYXRjaGVzIGRldmljZSAwMDAwOjAxOjAwLjAKKworICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbGFzdCB0cmFjZSBldmVudCB3YXMganVzdCBiZWZvcmUgdHJ5aW5nIHRvIHJlc3VtZQorICAgZGV2aWNlIDAwMDA6MDE6MDAuMC4gVGhlbiBmaWd1cmUgb3V0IHdoYXQgZHJpdmVyIGlzIGNvbnRyb2xsaW5nIHRoYXQKKyAgIGRldmljZSAobHNwY2kgYW5kIC9zeXMvZGV2aWNlcy9wY2kqIGlzIHlvdXIgZnJpZW5kKSwgYW5kIHNlZSBpZiB5b3UgY2FuCisgICBmaXggaXQsIGRpc2FibGUgaXQsIG9yIHRyYWNlIGludG8gaXRzIHJlc3VtZSBmdW5jdGlvbi4KKworRm9yIGV4YW1wbGUsIHRoZSBhYm92ZSBoYXBwZW5zIHRvIGJlIHRoZSBWR0EgZGV2aWNlIG9uIG15IEVWTywgd2hpY2ggSQordXNlZCB0byBydW4gd2l0aCAicmFkZW9uZmIiIChpdCdzIGFuIEFUSSBSYWRlb24gbW9iaWxpdHkpLiBJdCB0dXJucyBvdXQKK3RoYXQgInJhZGVvbmZiIiBzaW1wbHkgY2Fubm90IHJlc3VtZSB0aGF0IGRldmljZSAtIGl0IHRyaWVzIHRvIHNldCB0aGUKK1BMTCdzLCBhbmQgaXQganVzdCBfaGFuZ3NfLiBVc2luZyB0aGUgcmVndWxhciBWR0EgY29uc29sZSBhbmQgbGV0dGluZyBYCityZXN1bWUgaXQgaW5zdGVhZCB3b3JrcyBmaW5lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zdGF0ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zdGF0ZXMudHh0CmluZGV4IDNlNWU1ZDMuLjA5MzFhMzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3RhdGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N0YXRlcy50eHQKQEAgLTYyLDcgKzYyLDcgQEAKIGluY29udmVuaWVuY2UsIHRoaXMgbWV0aG9kIHJlcXVpcmVzIG1pbmltYWwgd29yayBieSB0aGUga2VybmVsLCBzaW5jZQogdGhlIGZpcm13YXJlIHdpbGwgYWxzbyBoYW5kbGUgcmVzdG9yaW5nIG1lbW9yeSBjb250ZW50cyBvbiByZXN1bWUuIAogCi1JZiB0aGUga2VybmVsIGlzIHJlc3BvbnNpYmxlIGZvciBwZXJzaXN0YW50bHkgc2F2aW5nIHN0YXRlLCBhIG1lY2hhbmlzbSAKK0lmIHRoZSBrZXJuZWwgaXMgcmVzcG9uc2libGUgZm9yIHBlcnNpc3RlbnRseSBzYXZpbmcgc3RhdGUsIGEgbWVjaGFuaXNtCiBjYWxsZWQgJ3N3c3VzcCcgKFN3YXAgU3VzcGVuZCkgaXMgdXNlZCB0byB3cml0ZSBtZW1vcnkgY29udGVudHMgdG8KIGZyZWUgc3dhcCBzcGFjZS4gc3dzdXNwIGhhcyBzb21lIHJlc3RyaWN0aXZlIHJlcXVpcmVtZW50cywgYnV0IHNob3VsZAogd29yayBpbiBtb3N0IGNhc2VzLiBTb21lLCBhbGJlaXQgb3V0ZGF0ZWQsIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC1hbmQtc3dhcC1maWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC1hbmQtc3dhcC1maWxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmOTExYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLWFuZC1zd2FwLWZpbGVzLnR4dApAQCAtMCwwICsxLDYwIEBACitVc2luZyBzd2FwIGZpbGVzIHdpdGggc29mdHdhcmUgc3VzcGVuZCAoc3dzdXNwKQorCShDKSAyMDA2IFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4KKworVGhlIExpbnV4IGtlcm5lbCBoYW5kbGVzIHN3YXAgZmlsZXMgYWxtb3N0IGluIHRoZSBzYW1lIHdheSBhcyBpdCBoYW5kbGVzIHN3YXAKK3BhcnRpdGlvbnMgYW5kIHRoZXJlIGFyZSBvbmx5IHR3byBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIHR3byB0eXBlcyBvZiBzd2FwCithcmVhczoKKygxKSBzd2FwIGZpbGVzIG5lZWQgbm90IGJlIGNvbnRpZ3VvdXMsCisoMikgdGhlIGhlYWRlciBvZiBhIHN3YXAgZmlsZSBpcyBub3QgaW4gdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBwYXJ0aXRpb24gdGhhdAoraG9sZHMgaXQuICBGcm9tIHRoZSBzd3N1c3AncyBwb2ludCBvZiB2aWV3ICgxKSBpcyBub3QgYSBwcm9ibGVtLCBiZWNhdXNlIGl0IGlzCithbHJlYWR5IHRha2VuIGNhcmUgb2YgYnkgdGhlIHN3YXAtaGFuZGxpbmcgY29kZSwgYnV0ICgyKSBoYXMgdG8gYmUgdGFrZW4gaW50bworY29uc2lkZXJhdGlvbi4KKworSW4gcHJpbmNpcGxlIHRoZSBsb2NhdGlvbiBvZiBhIHN3YXAgZmlsZSdzIGhlYWRlciBtYXkgYmUgZGV0ZXJtaW5lZCB3aXRoIHRoZQoraGVscCBvZiBhcHByb3ByaWF0ZSBmaWxlc3lzdGVtIGRyaXZlci4gIFVuZm9ydHVuYXRlbHksIGhvd2V2ZXIsIGl0IHJlcXVpcmVzIHRoZQorZmlsZXN5c3RlbSBob2xkaW5nIHRoZSBzd2FwIGZpbGUgdG8gYmUgbW91bnRlZCwgYW5kIGlmIHRoaXMgZmlsZXN5c3RlbSBpcworam91cm5hbGVkLCBpdCBjYW5ub3QgYmUgbW91bnRlZCBkdXJpbmcgcmVzdW1lIGZyb20gZGlzay4gIEZvciB0aGlzIHJlYXNvbiB0bworaWRlbnRpZnkgYSBzd2FwIGZpbGUgc3dzdXNwIHVzZXMgdGhlIG5hbWUgb2YgdGhlIHBhcnRpdGlvbiB0aGF0IGhvbGRzIHRoZSBmaWxlCithbmQgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbiBhdCB3aGljaCB0aGUgc3dhcCBmaWxlJ3MKK2hlYWRlciBpcyBsb2NhdGVkLiAgRm9yIGNvbnZlbmllbmNlLCB0aGlzIG9mZnNldCBpcyBleHByZXNzZWQgaW4gPFBBR0VfU0laRT4KK3VuaXRzLgorCitJbiBvcmRlciB0byB1c2UgYSBzd2FwIGZpbGUgd2l0aCBzd3N1c3AsIHlvdSBuZWVkIHRvOgorCisxKSBDcmVhdGUgdGhlIHN3YXAgZmlsZSBhbmQgbWFrZSBpdCBhY3RpdmUsIGVnLgorCisjIGRkIGlmPS9kZXYvemVybyBvZj08c3dhcF9maWxlX3BhdGg+IGJzPTEwMjQgY291bnQ9PHN3YXBfZmlsZV9zaXplX2luX2s+CisjIG1rc3dhcCA8c3dhcF9maWxlX3BhdGg+CisjIHN3YXBvbiA8c3dhcF9maWxlX3BhdGg+CisKKzIpIFVzZSBhbiBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgYm1hcCB0aGUgc3dhcCBmaWxlIHdpdGggdGhlIGhlbHAgb2YgdGhlCitGSUJNQVAgaW9jdGwgYW5kIGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUncyBzd2FwIGhlYWRlciwgYXMgdGhlCitvZmZzZXQsIGluIDxQQUdFX1NJWkU+IHVuaXRzLCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbiB3aGljaAoraG9sZHMgdGhlIHN3YXAgZmlsZS4KKworMykgQWRkIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZToKKworcmVzdW1lPTxzd2FwX2ZpbGVfcGFydGl0aW9uPiByZXN1bWVfb2Zmc2V0PTxzd2FwX2ZpbGVfb2Zmc2V0PgorCit3aGVyZSA8c3dhcF9maWxlX3BhcnRpdGlvbj4gaXMgdGhlIHBhcnRpdGlvbiBvbiB3aGljaCB0aGUgc3dhcCBmaWxlIGlzIGxvY2F0ZWQKK2FuZCA8c3dhcF9maWxlX29mZnNldD4gaXMgdGhlIG9mZnNldCBvZiB0aGUgc3dhcCBoZWFkZXIgZGV0ZXJtaW5lZCBieSB0aGUKK2FwcGxpY2F0aW9uIGluIDIpIChvZiBjb3Vyc2UsIHRoaXMgc3RlcCBtYXkgYmUgY2FycmllZCBvdXQgYXV0b21hdGljYWxseQorYnkgdGhlIHNhbWUgYXBwbGljYXRpb24gdGhhdCBkZXRlcm1pZXMgdGhlIHN3YXAgZmlsZSdzIGhlYWRlciBvZmZzZXQgdXNpbmcgdGhlCitGSUJNQVAgaW9jdGwpCisKK09SCisKK1VzZSBhIHVzZXJsYW5kIHN1c3BlbmQgYXBwbGljYXRpb24gdGhhdCB3aWxsIHNldCB0aGUgcGFydGl0aW9uIGFuZCBvZmZzZXQKK3dpdGggdGhlIGhlbHAgb2YgdGhlIFNOQVBTSE9UX1NFVF9TV0FQX0FSRUEgaW9jdGwgZGVzY3JpYmVkIGluCitEb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC50eHQgKHRoaXMgaXMgdGhlIG9ubHkgbWV0aG9kIHRvIHN1c3BlbmQKK3RvIGEgc3dhcCBmaWxlIGFsbG93aW5nIHRoZSByZXN1bWUgdG8gYmUgaW5pdGlhdGVkIGZyb20gYW4gaW5pdHJkIG9yIGluaXRyYW1mcworaW1hZ2UpLgorCitOb3csIHN3c3VzcCB3aWxsIHVzZSB0aGUgc3dhcCBmaWxlIGluIHRoZSBzYW1lIHdheSBpbiB3aGljaCBpdCB3b3VsZCB1c2UgYSBzd2FwCitwYXJ0aXRpb24uICBJbiBwYXJ0aWN1bGFyLCB0aGUgc3dhcCBmaWxlIGhhcyB0byBiZSBhY3RpdmUgKGllLiBiZSBwcmVzZW50IGluCisvcHJvYy9zd2Fwcykgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBmb3Igc3VzcGVuZGluZy4KKworTm90ZSB0aGF0IGlmIHRoZSBzd2FwIGZpbGUgdXNlZCBmb3Igc3VzcGVuZGluZyBpcyBkZWxldGVkIGFuZCByZWNyZWF0ZWQsCit0aGUgbG9jYXRpb24gb2YgaXRzIGhlYWRlciBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcyBiZWZvcmUuICBUaHVzIGV2ZXJ5IHRpbWUKK3RoaXMgaGFwcGVucyB0aGUgdmFsdWUgb2YgdGhlICJyZXN1bWVfb2Zmc2V0PSIga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIKK2hhcyB0byBiZSB1cGRhdGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CmluZGV4IDllYTIyMDguLjA3NjFmZjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiBJZiB0aGUgdGhyZWFkIGlzIG5lZWRlZCBmb3Igd3JpdGluZyB0aGUgaW1hZ2UgdG8gc3RvcmFnZSwgeW91IHNob3VsZAogaW5zdGVhZCBzZXQgdGhlIFBGX05PRlJFRVpFIHByb2Nlc3MgZmxhZyB3aGVuIGNyZWF0aW5nIHRoZSB0aHJlYWQgKGFuZAotYmUgdmVyeSBjYXJlZnVsbCkuCitiZSB2ZXJ5IGNhcmVmdWwpLgogCiAKIFE6IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAicGxhdGZvcm0iLCAic2h1dGRvd24iIGFuZApAQCAtMjk3LDIwICsyOTcsMTIgQEAKIHN1c3BlbmQgaW1hZ2UgdG8gcHJldmVudCBzZW5zaXRpdmUgZGF0YSBmcm9tIGJlaW5nIHN0b2xlbiBhZnRlcgogcmVzdW1lLgogCi1ROiBXaHkgY2FuJ3Qgd2Ugc3VzcGVuZCB0byBhIHN3YXAgZmlsZT8KK1E6IENhbiBJIHN1c3BlbmQgdG8gYSBzd2FwIGZpbGU/CiAKLUE6IEJlY2F1c2UgYWNjZXNzaW5nIHN3YXAgZmlsZSBuZWVkcyB0aGUgZmlsZXN5c3RlbSBtb3VudGVkLCBhbmQKLWZpbGVzeXN0ZW0gbWlnaHQgZG8gc29tZXRoaW5nIHdyb25nIChsaWtlIHJlcGxheWluZyB0aGUgam91cm5hbCkKLWR1cmluZyBtb3VudC4KLQotVGhlcmUgYXJlIGZldyB3YXlzIHRvIGdldCB0aGF0IGZpeGVkOgotCi0xKSBQcm9iYWJseSBjb3VsZCBiZSBzb2x2ZWQgYnkgbW9kaWZ5aW5nIGV2ZXJ5IGZpbGVzeXN0ZW0gdG8gc3VwcG9ydAotc29tZSBraW5kIG9mICJyZWFsbHkgcmVhZC1vbmx5ISIgb3B0aW9uLiBQYXRjaGVzIHdlbGNvbWUuCi0KLTIpIHN1c3BlbmQyIGdldHMgYXJvdW5kIHRoYXQgYnkgc3RvcmluZyBhYnNvbHV0ZSBwb3NpdGlvbnMgaW4gb24tZGlzawotaW1hZ2UgKGFuZCBibG9ja3NpemUpLCB3aXRoIHJlc3VtZSBwYXJhbWV0ZXIgcG9pbnRpbmcgZGlyZWN0bHkgdG8KLXN1c3BlbmQgaGVhZGVyLgorQTogR2VuZXJhbGx5LCB5ZXMsIHlvdSBjYW4uICBIb3dldmVyLCBpdCByZXF1aXJlcyB5b3UgdG8gdXNlIHRoZSAicmVzdW1lPSIgYW5kCisicmVzdW1lX29mZnNldD0iIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycywgc28gdGhlIHJlc3VtZSBmcm9tIGEgc3dhcCBmaWxlCitjYW5ub3QgYmUgaW5pdGlhdGVkIGZyb20gYW4gaW5pdHJkIG9yIGluaXRyYW1mcyBpbWFnZS4gIFNlZQorc3dzdXNwLWFuZC1zd2FwLWZpbGVzLnR4dCBmb3IgZGV0YWlscy4KIAogUTogSXMgdGhlcmUgYSBtYXhpbXVtIHN5c3RlbSBSQU0gc2l6ZSB0aGF0IGlzIHN1cHBvcnRlZCBieSBzd3N1c3A/CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnR4dAppbmRleCA2NDc1NWU5Li4wMDA1NTZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AudHh0CkBAIC05LDkgKzksOCBAQAogTm93LCB0byB1c2UgdGhlIHVzZXJsYW5kIGludGVyZmFjZSBmb3Igc29mdHdhcmUgc3VzcGVuZCB5b3UgbmVlZCBzcGVjaWFsCiB1dGlsaXRpZXMgdGhhdCB3aWxsIHJlYWQvd3JpdGUgdGhlIHN5c3RlbSBtZW1vcnkgc25hcHNob3QgZnJvbS90byB0aGUKIGtlcm5lbC4gIFN1Y2ggdXRpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGZvciBleGFtcGxlLCBmcm9tCi08aHR0cDovL3d3dy5zaXNrLnBsL2tlcm5lbC91dGlsaXRpZXMvc3VzcGVuZD4uICBZb3UgbWF5IHdhbnQgdG8gaGF2ZQotYSBsb29rIGF0IHRoZW0gaWYgeW91IGFyZSBnb2luZyB0byBkZXZlbG9wIHlvdXIgb3duIHN1c3BlbmQvcmVzdW1lCi11dGlsaXRpZXMuCis8aHR0cDovL3N1c3BlbmQuc291cmNlZm9yZ2UubmV0Pi4gIFlvdSBtYXkgd2FudCB0byBoYXZlIGEgbG9vayBhdCB0aGVtIGlmIHlvdQorYXJlIGdvaW5nIHRvIGRldmVsb3AgeW91ciBvd24gc3VzcGVuZC9yZXN1bWUgdXRpbGl0aWVzLgogCiBUaGUgaW50ZXJmYWNlIGNvbnNpc3RzIG9mIGEgY2hhcmFjdGVyIGRldmljZSBwcm92aWRpbmcgdGhlIG9wZW4oKSwKIHJlbGVhc2UoKSwgcmVhZCgpLCBhbmQgd3JpdGUoKSBvcGVyYXRpb25zIGFzIHdlbGwgYXMgc2V2ZXJhbCBpb2N0bCgpCkBAIC0yMSw5ICsyMCw5IEBACiAKIFRoZSBkZXZpY2UgY2FuIGJlIG9wZW4gZWl0aGVyIGZvciByZWFkaW5nIG9yIGZvciB3cml0aW5nLiAgSWYgb3BlbiBmb3IKIHJlYWRpbmcsIGl0IGlzIGNvbnNpZGVyZWQgdG8gYmUgaW4gdGhlIHN1c3BlbmQgbW9kZS4gIE90aGVyd2lzZSBpdCBpcwotYXNzdW1lZCB0byBiZSBpbiB0aGUgcmVzdW1lIG1vZGUuICBUaGUgZGV2aWNlIGNhbm5vdCBiZSBvcGVuIGZvciByZWFkaW5nCi1hbmQgd3JpdGluZy4gIEl0IGlzIGFsc28gaW1wb3NzaWJsZSB0byBoYXZlIHRoZSBkZXZpY2Ugb3BlbiBtb3JlIHRoYW4gb25jZQotYXQgYSB0aW1lLgorYXNzdW1lZCB0byBiZSBpbiB0aGUgcmVzdW1lIG1vZGUuICBUaGUgZGV2aWNlIGNhbm5vdCBiZSBvcGVuIGZvciBzaW11bHRhbmVvdXMKK3JlYWRpbmcgYW5kIHdyaXRpbmcuICBJdCBpcyBhbHNvIGltcG9zc2libGUgdG8gaGF2ZSB0aGUgZGV2aWNlIG9wZW4gbW9yZSB0aGFuCitvbmNlIGF0IGEgdGltZS4KIAogVGhlIGlvY3RsKCkgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgZGV2aWNlIGFyZToKIApAQCAtNjksOSArNjgsNDYgQEAKIFNOQVBTSE9UX1NFVF9TV0FQX0ZJTEUgLSBzZXQgdGhlIHJlc3VtZSBwYXJ0aXRpb24gKHRoZSBsYXN0IGlvY3RsKCkgYXJndW1lbnQKIAlzaG91bGQgc3BlY2lmeSB0aGUgZGV2aWNlJ3MgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgaW4gdGhlIG9sZAogCXR3by1ieXRlIGZvcm1hdCwgYXMgcmV0dXJuZWQgYnkgdGhlIHN0YXQoKSBmdW5jdGlvbiBpbiB0aGUgLnN0X3JkZXYKLQltZW1iZXIgb2YgdGhlIHN0YXQgc3RydWN0dXJlKTsgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWx3YXlzIHVzZSB0aGlzCi0JY2FsbCwgYmVjYXVzZSB0aGUgY29kZSB0byBzZXQgdGhlIHJlc3VtZSBwYXJ0aXRpb24gY291bGQgYmUgcmVtb3ZlZCBmcm9tCi0JZnV0dXJlIGtlcm5lbHMKKwltZW1iZXIgb2YgdGhlIHN0YXQgc3RydWN0dXJlKQorCitTTkFQU0hPVF9TRVRfU1dBUF9BUkVBIC0gc2V0IHRoZSByZXN1bWUgcGFydGl0aW9uIGFuZCB0aGUgb2Zmc2V0IChpbiA8UEFHRV9TSVpFPgorCXVuaXRzKSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbiBhdCB3aGljaCB0aGUgc3dhcCBoZWFkZXIgaXMKKwlsb2NhdGVkICh0aGUgbGFzdCBpb2N0bCgpIGFyZ3VtZW50IHNob3VsZCBwb2ludCB0byBhIHN0cnVjdAorCXJlc3VtZV9zd2FwX2FyZWEsIGFzIGRlZmluZWQgaW4ga2VybmVsL3Bvd2VyL3Bvd2VyLmgsIGNvbnRhaW5pbmcgdGhlCisJcmVzdW1lIGRldmljZSBzcGVjaWZpY2F0aW9uLCBhcyBmb3IgdGhlIFNOQVBTSE9UX1NFVF9TV0FQX0ZJTEUgaW9jdGwoKSwKKwlhbmQgdGhlIG9mZnNldCk7IGZvciBzd2FwIHBhcnRpdGlvbnMgdGhlIG9mZnNldCBpcyBhbHdheXMgMCwgYnV0IGl0IGlzCisJZGlmZmVyZW50IHRvIHplcm8gZm9yIHN3YXAgZmlsZXMgKHBsZWFzZSBzZWUKKwlEb2N1bWVudGF0aW9uL3N3c3VzcC1hbmQtc3dhcC1maWxlcy50eHQgZm9yIGRldGFpbHMpLgorCVRoZSBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBIGlvY3RsKCkgaXMgY29uc2lkZXJlZCBhcyBhIHJlcGxhY2VtZW50IGZvcgorCVNOQVBTSE9UX1NFVF9TV0FQX0ZJTEUgd2hpY2ggaXMgcmVnYXJkZWQgYXMgb2Jzb2xldGUuICAgSXQgaXMKKwlyZWNvbW1lbmRlZCB0byBhbHdheXMgdXNlIHRoaXMgY2FsbCwgYmVjYXVzZSB0aGUgY29kZSB0byBzZXQgdGhlIHJlc3VtZQorCXBhcnRpdGlvbiBtYXkgYmUgcmVtb3ZlZCBmcm9tIGZ1dHVyZSBrZXJuZWxzCisKK1NOQVBTSE9UX1MyUkFNIC0gc3VzcGVuZCB0byBSQU07IHVzaW5nIHRoaXMgY2FsbCBjYXVzZXMgdGhlIGtlcm5lbCB0bworCWltbWVkaWF0ZWx5IGVudGVyIHRoZSBzdXNwZW5kLXRvLVJBTSBzdGF0ZSwgc28gdGhpcyBjYWxsIG11c3QgYWx3YXlzCisJYmUgcHJlY2VkZWQgYnkgdGhlIFNOQVBTSE9UX0ZSRUVaRSBjYWxsIGFuZCBpdCBpcyBhbHNvIG5lY2Vzc2FyeQorCXRvIHVzZSB0aGUgU05BUFNIT1RfVU5GUkVFWkUgY2FsbCBhZnRlciB0aGUgc3lzdGVtIHdha2VzIHVwLiAgVGhpcyBjYWxsCisJaXMgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgc3VzcGVuZC10by1ib3RoIG1lY2hhbmlzbSBpbiB3aGljaCB0aGUKKwlzdXNwZW5kIGltYWdlIGlzIGZpcnN0IGNyZWF0ZWQsIGFzIHRob3VnaCB0aGUgc3lzdGVtIGhhZCBiZWVuIHN1c3BlbmRlZAorCXRvIGRpc2ssIGFuZCB0aGVuIHRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkIHRvIFJBTSAodGhpcyBtYWtlcyBpdCBwb3NzaWJsZQorCXRvIHJlc3VtZSB0aGUgc3lzdGVtIGZyb20gUkFNIGlmIHRoZXJlJ3MgZW5vdWdoIGJhdHRlcnkgcG93ZXIgb3IgcmVzdG9yZQorCWl0cyBzdGF0ZSBvbiB0aGUgYmFzaXMgb2YgdGhlIHNhdmVkIHN1c3BlbmQgaW1hZ2Ugb3RoZXJ3aXNlKQorCitTTkFQU0hPVF9QTU9QUyAtIGVuYWJsZSB0aGUgdXNhZ2Ugb2YgdGhlIHBtb3BzLT5wcmVwYXJlLCBwbW9wcy0+ZW50ZXIgYW5kCisJcG1vcHMtPmZpbmlzaCBtZXRob2RzICh0aGUgaW4ta2VybmVsIHN3c3VzcCBrbm93cyB0aGVzZSBhcyB0aGUgInBsYXRmb3JtCisJbWV0aG9kIikgd2hpY2ggYXJlIG5lZWRlZCBvbiBtYW55IG1hY2hpbmVzIHRvIChhbW9uZyBvdGhlcnMpIHNwZWVkIHVwCisJdGhlIHJlc3VtZSBieSBsZXR0aW5nIHRoZSBCSU9TIHNraXAgc29tZSBzdGVwcyBvciB0byBsZXQgdGhlIHN5c3RlbQorCXJlY29nbmlzZSB0aGUgY29ycmVjdCBzdGF0ZSBvZiB0aGUgaGFyZHdhcmUgYWZ0ZXIgdGhlIHJlc3VtZSAoaW4KKwlwYXJ0aWN1bGFyIG9uIG1hbnkgbWFjaGluZXMgdGhpcyBlbnN1cmVzIHRoYXQgdW5wbHVnZ2VkIEFDCisJYWRhcHRlcnMgZ2V0IGNvcnJlY3RseSBkZXRlY3RlZCBhbmQgdGhhdCBrYWNwaWQgZG9lcyBub3QgcnVuIHdpbGQgYWZ0ZXIKKwl0aGUgcmVzdW1lKS4gIFRoZSBsYXN0IGlvY3RsKCkgYXJndW1lbnQgY2FuIHRha2Ugb25lIG9mIHRoZSB0aHJlZQorCXZhbHVlcywgZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcG93ZXIuaDoKKwlQTU9QU19QUkVQQVJFIC0gbWFrZSB0aGUga2VybmVsIGNhcnJ5IG91dCB0aGUKKwkJcG1fb3BzLT5wcmVwYXJlKFBNX1NVU1BFTkRfRElTSykgb3BlcmF0aW9uCisJUE1PUFNfRU5URVIgLSBtYWtlIHRoZSBrZXJuZWwgcG93ZXIgb2ZmIHRoZSBzeXN0ZW0gYnkgY2FsbGluZworCQlwbV9vcHMtPmVudGVyKFBNX1NVU1BFTkRfRElTSykKKwlQTU9QU19GSU5JU0ggLSBtYWtlIHRoZSBrZXJuZWwgY2Fycnkgb3V0IHRoZQorCQlwbV9vcHMtPmZpbmlzaChQTV9TVVNQRU5EX0RJU0spIG9wZXJhdGlvbgogCiBUaGUgZGV2aWNlJ3MgcmVhZCgpIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciB0aGUgc25hcHNob3QgaW1hZ2UgZnJvbQogdGhlIGtlcm5lbC4gIEl0IGhhcyB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOgpAQCAtOTEsMTAgKzEyNywxMiBAQAogc3RpbGwgZnJvemVuIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyBjbG9zZWQpLgogCiBDdXJyZW50bHkgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB1c2VybGFuZCB1dGlsaXRpZXMgcmVhZGluZy93cml0aW5nIHRoZQotc25hcHNob3QgaW1hZ2UgZnJvbS90byB0aGUga2VybmVsIHdpbGwgdXNlIGEgc3dhcCBwYXJ0aXRpb24sIGNhbGxlZCB0aGUgcmVzdW1lCi1wYXJ0aXRpb24sIGFzIHN0b3JhZ2Ugc3BhY2UuICBIb3dldmVyLCB0aGlzIGlzIG5vdCByZWFsbHkgcmVxdWlyZWQsIGFzIHRoZXkKLWNhbiB1c2UsIGZvciBleGFtcGxlLCBhIHNwZWNpYWwgKGJsYW5rKSBzdXNwZW5kIHBhcnRpdGlvbiBvciBhIGZpbGUgb24gYSBwYXJ0aXRpb24KLXRoYXQgaXMgdW5tb3VudGVkIGJlZm9yZSBTTkFQU0hPVF9BVE9NSUNfU05BUFNIT1QgYW5kIG1vdW50ZWQgYWZ0ZXJ3YXJkcy4KK3NuYXBzaG90IGltYWdlIGZyb20vdG8gdGhlIGtlcm5lbCB3aWxsIHVzZSBhIHN3YXAgcGFyaXRpb24sIGNhbGxlZCB0aGUgcmVzdW1lCitwYXJ0aXRpb24sIG9yIGEgc3dhcCBmaWxlIGFzIHN0b3JhZ2Ugc3BhY2UgKGlmIGEgc3dhcCBmaWxlIGlzIHVzZWQsIHRoZSByZXN1bWUKK3BhcnRpdGlvbiBpcyB0aGUgcGFydGl0aW9uIHRoYXQgaG9sZHMgdGhpcyBmaWxlKS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHJlYWxseQorcmVxdWlyZWQsIGFzIHRoZXkgY2FuIHVzZSwgZm9yIGV4YW1wbGUsIGEgc3BlY2lhbCAoYmxhbmspIHN1c3BlbmQgcGFydGl0aW9uIG9yCithIGZpbGUgb24gYSBwYXJ0aXRpb24gdGhhdCBpcyB1bm1vdW50ZWQgYmVmb3JlIFNOQVBTSE9UX0FUT01JQ19TTkFQU0hPVCBhbmQKK21vdW50ZWQgYWZ0ZXJ3YXJkcy4KIAogVGhlc2UgdXRpbGl0aWVzIFNIT1VMRCBOT1QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgcmVnYXJkaW5nIHRoZSBvcmRlcmluZyBvZgogZGF0YSB3aXRoaW4gdGhlIHNuYXBzaG90IGltYWdlLCBleGNlcHQgZm9yIHRoZSBpbWFnZSBoZWFkZXIgdGhhdCBNQVkgYmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKaW5kZXggMjdiNDU3Yy4uYjNiZDM2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKQEAgLTYsNiArNiw4IEBACiAgICAgSUJNIENvcnAuCiAoYykgMjAwNSBCZWNreSBCcnVjZSA8YmVja3kuYnJ1Y2UgYXQgZnJlZXNjYWxlLmNvbT4sCiAgICAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEZTTCBTT0MgYW5kIDMyLWJpdCBhZGRpdGlvbnMKKyhjKSAyMDA2IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAgICBGbGFzaCBjaGlwIG5vZGUgZGVmaW5pdGlvbgogCiAgICBNYXkgMTgsIDIwMDU6IFJldiAwLjEgLSBJbml0aWFsIGRyYWZ0LCBubyBjaGFwdGVyIElJSSB5ZXQuCiAKQEAgLTMzLDEzICszNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIC0gQ2hhbmdlIHZlcnNpb24gMTYgZm9ybWF0IHRvIGFsd2F5cyBhbGlnbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgZGF0YSB0byA0IGJ5dGVzLiBTaW5jZSB0b2tlbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGFsaWduZWQsIHRoYXQgbWVhbnMgbm8gc3BlY2lmaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGFsaWduZW1lbnQgYmV0d2VlbiBwcm9wZXJ0eSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBhbGlnbm1lbnQgYmV0d2VlbiBwcm9wZXJ0eSBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcHJvcGVydHkgZGF0YS4gVGhlIG9sZCBzdHlsZSB2YXJpYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50IHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSB0byBkbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbXBsZSIgaW5zZXJ0aW9uIG9mIHByb3BlcnRpZXMgdXNpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW92ZSAodGhhbmtzIE1pbHRvbiBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGljaW5nKS4gVXBkYXRlZCBrZXJuZWwgcGF0Y2ggYXMgd2VsbAotCQkJIC0gQ29ycmVjdCBhIGZldyBtb3JlIGFsaWduZW1lbnQgY29uc3RyYWludHMKKwkJCSAtIENvcnJlY3QgYSBmZXcgbW9yZSBhbGlnbm1lbnQgY29uc3RyYWludHMKIAkJCSAtIEFkZCBhIGNoYXB0ZXIgYWJvdXQgdGhlIGRldmljZS10cmVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlciBhbmQgdGhlIHRleHR1cmFsIHJlcHJlc2VudGF0aW9uIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJlZSB0aGF0IGNhbiBiZSAiY29tcGlsZWQiIGJ5IGR0Yy4KQEAgLTg1NCw3ICs4NTYsNyBAQAogICAgICAgY29uc29sZSBkZXZpY2UgaWYgYW55LiBUeXBpY2FsbHksIGlmIHlvdSBoYXZlIHNlcmlhbCBkZXZpY2VzIG9uCiAgICAgICB5b3VyIGJvYXJkLCB5b3UgbWF5IHdhbnQgdG8gcHV0IHRoZSBmdWxsIHBhdGggdG8gdGhlIG9uZSBzZXQgYXMKICAgICAgIHRoZSBkZWZhdWx0IGNvbnNvbGUgaW4gdGhlIGZpcm13YXJlIGhlcmUsIGZvciB0aGUga2VybmVsIHRvIHBpY2sKLSAgICAgIGl0IHVwIGFzIGl0J3Mgb3duIGRlZmF1bHQgY29uc29sZS4gSWYgeW91IGxvb2sgYXQgdGhlIGZ1bmNpdG9uCisgICAgICBpdCB1cCBhcyBpdHMgb3duIGRlZmF1bHQgY29uc29sZS4gSWYgeW91IGxvb2sgYXQgdGhlIGZ1bmN0aW9uCiAgICAgICBzZXRfcHJlZmVycmVkX2NvbnNvbGUoKSBpbiBhcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jLCB5b3UnbGwgc2VlCiAgICAgICB0aGF0IHRoZSBrZXJuZWwgdHJpZXMgdG8gZmluZCBvdXQgdGhlIGRlZmF1bHQgY29uc29sZSBhbmQgaGFzCiAgICAgICBrbm93bGVkZ2Ugb2YgdmFyaW91cyB0eXBlcyBsaWtlIDgyNTAgc2VyaWFsIHBvcnRzLiBZb3UgbWF5IHdhbnQKQEAgLTExMjQsNyArMTEyNiw3IEBACiAJLSBpbnRlcnJ1cHQtcGFyZW50IDogY29udGFpbnMgdGhlIHBoYW5kbGUgb2YgdGhlIGludGVycnVwdAogICAgICAgICAgIGNvbnRyb2xsZXIgd2hpY2ggaGFuZGxlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZQogCS0gaW50ZXJydXB0cyA6IGEgbGlzdCBvZiB0dXBsZXMgcmVwcmVzZW50aW5nIHRoZSBpbnRlcnJ1cHQKLSAgICAgICAgICBudW1iZXIgYW5kIHRoZSBpbnRlcnJ1cHQgc2Vuc2UgYW5kIGxldmVsIGZvciBlYWNoIGludGVydXB0CisgICAgICAgICAgbnVtYmVyIGFuZCB0aGUgaW50ZXJydXB0IHNlbnNlIGFuZCBsZXZlbCBmb3IgZWFjaCBpbnRlcnJ1cHQKICAgICAgICAgICBmb3IgdGhpcyBkZXZpY2UuCiAKIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBieSB0aGUga2VybmVsIHRvIGJ1aWxkIHRoZSBpbnRlcnJ1cHQgdGFibGUKQEAgLTE2OTMsNiArMTY5NSw0MyBAQAogCQl9OwogCX07CiAKKyAgICBnKSBGbGFzaCBjaGlwIG5vZGVzCisKKyAgICBGbGFzaCBjaGlwcyAoTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcykgYXJlIG9mdGVuIHVzZWQgZm9yIHNvbGlkIHN0YXRlCisgICAgZmlsZSBzeXN0ZW1zIG9uIGVtYmVkZGVkIGRldmljZXMuCisKKyAgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgICAgIC0gZGV2aWNlX3R5cGUgOiBoYXMgdG8gYmUgInJvbSIKKyAgICAgLSBjb21wYXRpYmxlIDogU2hvdWxkIHNwZWNpZnkgd2hhdCB0aGlzIFJPTSBkZXZpY2UgaXMgY29tcGF0aWJsZSB3aXRoCisgICAgICAgKGkuZS4gIm9uZW5hbmQiKS4gQ3VycmVudGx5LCB0aGlzIGlzIG1vc3QgbGlrZWx5IHRvIGJlICJkaXJlY3QtbWFwcGVkIgorICAgICAgICh3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgTVREIHBoeXNtYXAgbWFwcGluZyBkcml2ZXIpLgorICAgICAtIHJlZ3MgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IChvciBtZW1vcnkgbWFwcGluZykgZm9yCisgICAgICAgdGhlIGRldmljZS4KKworICAgIFJlY29tbWVuZGVkIHByb3BlcnRpZXMgOgorCisgICAgIC0gYmFuay13aWR0aCA6IFdpZHRoIG9mIHRoZSBmbGFzaCBkYXRhIGJ1cyBpbiBieXRlcy4gUmVxdWlyZWQKKyAgICAgICBmb3IgdGhlIE5PUiBmbGFzaGVzIChjb21wYXRpYmxlID09ICJkaXJlY3QtbWFwcGVkIiBhbmQgb3RoZXJzKSBPTkxZLgorICAgICAtIHBhcnRpdGlvbnMgOiBTZXZlcmFsIHBhaXJzIG9mIDMyLWJpdCB2YWx1ZXMgd2hlcmUgdGhlIGZpcnN0IHZhbHVlIGlzCisgICAgICAgcGFydGl0aW9uJ3Mgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkZXZpY2UgYW5kIHRoZSBzZWNvbmQgb25lIGlzCisgICAgICAgcGFydGl0aW9uIHNpemUgaW4gYnl0ZXMgd2l0aCBMU0IgdXNlZCB0byBzaWduaWZ5IGEgcmVhZCBvbmx5CisgICAgICAgcGFydGl0aXRvbiAoc28sIHRoZSBwYXJpdGlvbiBzaXplIHNob3VsZCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIpLgorICAgICAtIHBhcnRpdGlvbi1uYW1lcyA6IFRoZSBsaXN0IG9mIGNvbmNhdGVuYXRlZCB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5ncworICAgICAgIHJlcHJlc2VudGluZyB0aGUgcGFydGl0aW9uIG5hbWVzLgorCisgICBFeGFtcGxlOgorCisgCWZsYXNoQGZmMDAwMDAwIHsKKyAJCWRldmljZV90eXBlID0gInJvbSI7CisgCQljb21wYXRpYmxlID0gImRpcmVjdC1tYXBwZWQiOworIAkJcmVncyA9IDxmZjAwMDAwMCAwMTAwMDAwMD47CisgCQliYW5rLXdpZHRoID0gPDQ+OworIAkJcGFydGl0aW9ucyA9IDwwMDAwMDAwMCAwMGY4MDAwMAorIAkJCSAgICAgIDAwZjgwMDAwIDAwMDgwMDAxPjsKKyAJCXBhcnRpdGlvbi1uYW1lcyA9ICJmc1wwZmlybXdhcmUiOworIAl9OworCiAgICBNb3JlIGRldmljZXMgd2lsbCBiZSBkZWZpbmVkIGFzIHRoaXMgc3BlYyBtYXR1cmVzLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9tcGM1Mnh4LWRldmljZS10cmVlLWJpbmRpbmdzLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9tcGM1Mnh4LWRldmljZS10cmVlLWJpbmRpbmdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc3ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL21wYzUyeHgtZGV2aWNlLXRyZWUtYmluZGluZ3MudHh0CkBAIC0wLDAgKzEsMTg5IEBACitNUEM1Mnh4IERldmljZSBUcmVlIEJpbmRpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhjKSAyMDA2IFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZAorR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHkgYXQgc2VjcmV0bGFiLmNhPgorCitJIC0gSW50cm9kdWN0aW9uCis9PT09PT09PT09PT09PT09CitCb2FyZHMgc3VwcG9ydGVkIGJ5IHRoZSBhcmNoL3Bvd2VycGMgYXJjaGl0ZWN0dXJlIHJlcXVpcmUgZGV2aWNlIHRyZWUgYmUKK3Bhc3NlZCBieSB0aGUgYm9vdCBsb2FkZXIgdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuICBUaGUgZGV2aWNlIHRyZWUKK2Rlc2NyaWJlcyB3aGF0IGRldmljZXMgYXJlIHByZXNlbnQgb24gdGhlIGJvYXJkIGFuZCBob3cgdGhleSBhcmUKK2Nvbm5lY3RlZC4gIFRoZSBkZXZpY2UgdHJlZSBjYW4gZWl0aGVyIGJlIHBhc3NlZCBhcyBhIGJpbmFyeSBibG9iIChhcworZGVzY3JpYmVkIGluIERvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0KSwgb3IgcGFzc2VkCitieSBPcGVuIEZpcm1hcmUgKElFRUUgMTI3NSkgY29tcGF0aWJsZSBmaXJtd2FyZSB1c2luZyBhbiBPRiBjb21wYXRpYmxlCitjbGllbnQgaW50ZXJmYWNlIEFQSS4KKworVGhpcyBkb2N1bWVudCBzcGVjaWZpZXMgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUgZGV2aWNlLXRyZWUgZm9yIG1wYzUyeHgKK2Jhc2VkIGJvYXJkcy4gIFRoZXNlIHJlcXVpcmVtZW50cyBhcmUgYWJvdmUgYW5kIGJleW9uZCB0aGUgZGV0YWlscworc3BlY2lmaWVkIGluIGVpdGhlciB0aGUgT3BlbkZpcm13YXJlIHNwZWMgb3IgYm9vdGluZy13aXRob3V0LW9mLnR4dAorCitBbGwgbmV3IG1wYzUyeHgtYmFzZWQgYm9hcmRzIGFyZSBleHBlY3RlZCB0byBtYXRjaCB0aGlzIGRvY3VtZW50LiAgSW4KK2Nhc2VzIHdoZXJlIHRoaXMgZG9jdW1lbnQgaXMgbm90IHN1ZmZpY2llbnQgdG8gc3VwcG9ydCBhIG5ldyBib2FyZCBwb3J0LAordGhpcyBkb2N1bWVudCBzaG91bGQgYmUgdXBkYXRlZCBhcyBwYXJ0IG9mIGFkZGluZyB0aGUgbmV3IGJvYXJkIHN1cHBvcnQuCisKK0lJIC0gUGhpbG9zb3BoeQorPT09PT09PT09PT09PT09CitUaGUgY29yZSBvZiB0aGlzIGRvY3VtZW50IGlzIG5hbWluZyBjb252ZW50aW9uLiAgVGhlIHdob2xlIHBvaW50IG9mCitkZWZpbmluZyB0aGlzIGNvbnZlbnRpb24gaXMgdG8gcmVkdWNlIG9yIGVsaW1pbmF0ZSB0aGUgbnVtYmVyIG9mCitzcGVjaWFsIGNhc2VzIHJlcXVpcmVkIHRvIHN1cHBvcnQgYSA1Mnh4IGJvYXJkLiAgSWYgYWxsIDUyeHggYm9hcmRzCitmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbiwgdGhlbiBnZW5lcmljIDUyeHggc3VwcG9ydCBjb2RlIHdpbGwgd29yaworcmF0aGVyIHRoYW4gY29kaW5nIHNwZWNpYWwgY2FzZXMgZm9yIGVhY2ggbmV3IGJvYXJkLgorCitUaGlzIHNlY3Rpb24gdHJpZXMgdG8gY2FwdHVyZSB0aGUgdGhvdWdodCBwcm9jZXNzIGJlaGluZCB3aHkgdGhlIG5hbWluZworY29udmVudGlvbiBpcyB3aGF0IGl0IGlzLgorCisxLiBOb2RlIG5hbWVzCistLS0tLS0tLS0tLS0tCitUaGVyZSBpcyBzdHJvbmcgY29udmVudGlvbi9yZXF1aXJlbWVudHMgYWxyZWFkeSBlc3RhYmxpc2hlZCBmb3IgY2hpbGRyZW4KK29mIHRoZSByb290IG5vZGUuICAnY3B1cycgZGVzY3JpYmVzIHRoZSBwcm9jZXNzb3IgY29yZXMsICdtZW1vcnknCitkZXNjcmliZXMgbWVtb3J5LCBhbmQgJ2Nob3NlbicgcHJvdmlkZXMgYm9vdCBjb25maWd1cmF0aW9uLiAgT3RoZXIgbm9kZXMKK2FyZSBhZGRlZCB0byBkZXNjcmliZSBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSBwcm9jZXNzb3IgbG9jYWwgYnVzLgorRm9sbG93aW5nIGNvbnZlbnRpb24gYWxyZWFkeSBlc3RhYmxpc2hlZCB3aXRoIG90aGVyIHN5c3RlbS1vbi1jaGlwCitwcm9jZXNzb3JzLCBNUEM1Mnh4IGJvYXJkcyBtdXN0IGhhdmUgYW4gJ3NvYzUyMDAnIG5vZGUgYXMgYSBjaGlsZCBvZiB0aGUKK3Jvb3Qgbm9kZS4KKworVGhlIHNvYzUyMDAgbm9kZSBob2xkcyBjaGlsZCBub2RlcyBmb3IgYWxsIG9uIGNoaXAgZGV2aWNlcy4gIENoaWxkIG5vZGVzCithcmUgdHlwaWNhbGx5IG5hbWVkIGFmdGVyIHRoZSBjb25maWd1cmVkIGZ1bmN0aW9uLiAgaWUuIHRoZSBGRUMgbm9kZSBpcworbmFtZWQgJ2V0aGVybmV0JywgYW5kIGEgUFNDIGluIHVhcnQgbW9kZSBpcyBuYW1lZCAnc2VyaWFsJy4KKworMi4gZGV2aWNlX3R5cGUgcHJvcGVydHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzaW1pbGFyIHRvIHRoZSBub2RlIG5hbWUgY29udmVudGlvbiBhYm92ZTsgdGhlIGRldmljZV90eXBlIHJlZmxlY3RzIHRoZQorY29uZmlndXJlZCBmdW5jdGlvbiBvZiBhIGRldmljZS4gIGllLiAnc2VyaWFsJyBmb3IgYSB1YXJ0IGFuZCAnc3BpJyBmb3IKK2FuIHNwaSBjb250cm9sbGVyLiAgSG93ZXZlciwgd2hpbGUgbm9kZSBuYW1lcyAqc2hvdWxkKiByZWZsZWN0IHRoZQorY29uZmlndXJlZCBmdW5jdGlvbiwgZGV2aWNlX3R5cGUgKm11c3QqIG1hdGNoIHRoZSBjb25maWd1cmVkIGZ1bmN0aW9uCitleGFjdGx5LgorCiszLiBjb21wYXRpYmxlIHByb3BlcnR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTaW5jZSBkZXZpY2VfdHlwZSBpc24ndCBlbm91Z2ggdG8gbWF0Y2ggZGV2aWNlcyB0byBkcml2ZXJzLCB0aGVyZSBhbHNvCituZWVkcyB0byBiZSBhIG5hbWluZyBjb252ZW50aW9uIGZvciB0aGUgY29tcGF0aWJsZSBwcm9wZXJ0eS4gIENvbXBhdGlibGUKK2lzIGFuIGxpc3Qgb2YgZGV2aWNlIGRlc2NyaXB0aW9ucyBzb3J0ZWQgZnJvbSBzcGVjaWZpYyB0byBnZW5lcmljLiAgRm9yCit0aGUgbXBjNTJ4eCwgdGhlIHJlcXVpcmVkIGZvcm1hdCBmb3IgZWFjaCBjb21wYXRpYmxlIHZhbHVlIGlzCis8Y2hpcD4tPGRldmljZT5bLTxtb2RlPl0uICBBdCB0aGUgbWluaW11bSwgdGhlIGxpc3Qgc2hhbGwgY29udGFpbiB0d28KK2l0ZW1zOyB0aGUgZmlyc3Qgc3BlY2lmeWluZyB0aGUgZXhhY3QgY2hpcCwgYW5kIHRoZSBzZWNvbmQgc3BlY2lmeWluZworbXBjNTJ4eCBmb3IgdGhlIGNoaXAuCisKK2llLiBldGhlcm5ldCBvbiBtcGM1MjAwYjogY29tcGF0aWJsZSA9ICJtcGM1MjAwYi1ldGhlcm5ldFwwbXBjNTJ4eC1ldGhlcm5ldCIKKworVGhlIGlkZWEgaGVyZSBpcyB0aGF0IG1vc3QgZHJpdmVycyB3aWxsIG1hdGNoIHRvIHRoZSBtb3N0IGdlbmVyaWMgZmllbGQKK2luIHRoZSBjb21wYXRpYmxlIGxpc3QgKG1wYzUyeHgtKiksIGJ1dCBjYW4gYWxzbyB0ZXN0IHRoZSBtb3JlIHNwZWNpZmljCitmaWVsZCBmb3IgZW5hYmxpbmcgYnVnIGZpeGVzIG9yIGV4dHJhIGZlYXR1cmVzLgorCitNb2RhbCBkZXZpY2VzLCBsaWtlIFBTQ3MsIGFsc28gYXBwZW5kIHRoZSBjb25maWd1cmVkIGZ1bmN0aW9uIHRvIHRoZQorZW5kIG9mIHRoZSBjb21wYXRpYmxlIGZpZWxkLiAgaWUuIEEgUFNDIGluIGkycyBtb2RlIHdvdWxkIHNwZWNpZnkKKyJtcGM1Mnh4LXBzYy1pMnMiLCBub3QgIm1wYzUyeHgtaTJzIi4gIFRoaXMgY29udmVudGlvbiBpcyBjaG9zZW4gdG8KK2F2b2lkIG5hbWluZyBjb25mbGljdHMgd2l0aCBub24tcHNjIGRldmljZXMgcHJvdmlkaW5nIHRoZSBzYW1lCitmdW5jdGlvbi4gIEZvciBleGFtcGxlLCAibXBjNTJ4eC1zcGkiIGFuZCAibXBjNTJ4eC1wc2Mtc3BpIiBkZXNjcmliZQordGhlIG1wYzUyMDAgc2ltcGxlIHNwaSBkZXZpY2UgYW5kIGEgUFNDIHNwaSBtb2RlIHJlc3BlY3RpdmVseS4KKworSWYgdGhlIHNvYyBkZXZpY2UgaXMgbW9yZSBnZW5lcmljIGFuZCBwcmVzZW50IG9uIG90aGVyIFNPQ3MsIHRoZQorY29tcGF0aWJsZSBwcm9wZXJ0eSBjYW4gc3BlY2lmeSB0aGUgbW9yZSBnZW5lcmljIGRldmljZSB0eXBlIGFsc28uCisKK2llLiBtc2NhbjogY29tcGF0aWJsZSA9ICJtcGM1MjAwLW1zY2FuXDBtcGM1Mnh4LW1zY2FuXDBmc2wsbXNjYW4iOworCitBdCB0aGUgdGltZSBvZiB3cml0aW5nLCBleGFjdCBjaGlwIG1heSBiZSBlaXRoZXIgJ21wYzUyMDAnIG9yCisnbXBjNTIwMGInLgorCitEZXZpY2UgZHJpdmVycyBzaG91bGQgYWx3YXlzIHRyeSB0byBtYXRjaCBhcyBnZW5lcmljYWxseSBhcyBwb3NzaWJsZS4KKworSUlJIC0gU3RydWN0dXJlCis9PT09PT09PT09PT09PT0KK1RoZSBkZXZpY2UgdHJlZSBmb3IgYW4gbXBjNTJ4eCBib2FyZCBmb2xsb3dzIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lZCBpbgorYm9vdGluZy13aXRob3V0LW9mLnR4dCB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBub3RlczoKKworMCkgdGhlIHJvb3Qgbm9kZQorLS0tLS0tLS0tLS0tLS0tLQorVHlwaWNhbCByb290IGRlc2NyaXB0aW9uIG5vZGU7IHNlZSBib290aW5nLXdpdGhvdXQtb2YKKworMSkgVGhlIGNwdXMgbm9kZQorLS0tLS0tLS0tLS0tLS0tLQorVGhlIGNwdXMgbm9kZSBmb2xsb3dzIHRoZSBiYXNpYyBsYXlvdXQgZGVzY3JpYmVkIGluIGJvb3Rpbmctd2l0aG91dC1vZi4KK1RoZSBidXMtZnJlcXVlbmN5IHByb3BlcnR5IGhvbGRzIHRoZSBYTEIgYnVzIGZyZXF1ZW5jeQorVGhlIGNsb2NrLWZyZXF1ZW5jeSBwcm9wZXJ0eSBob2xkcyB0aGUgY29yZSBmcmVxdWVuY3kKKworMikgVGhlIG1lbW9yeSBub2RlCistLS0tLS0tLS0tLS0tLS0tLS0KK1R5cGljYWwgbWVtb3J5IGRlc2NyaXB0aW9uIG5vZGU7IHNlZSBib290aW5nLXdpdGhvdXQtb2YuCisKKzMpIFRoZSBzb2M1MjAwIG5vZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgbm9kZSBkZXNjcmliZXMgdGhlIG9uIGNoaXAgU09DIHBlcmlwaGVyYWxzLiAgRXZlcnkgbXBjNTJ4eCBiYXNlZAorYm9hcmQgd2lsbCBoYXZlIHRoaXMgbm9kZSwgYW5kIGFzIHN1Y2ggdGhlcmUgaXMgYSBjb21tb24gbmFtaW5nCitjb252ZW50aW9uIGZvciBTT0MgZGV2aWNlcy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKK25hbWUJCQl0eXBlCQlkZXNjcmlwdGlvbgorLS0tLQkJCS0tLS0JCS0tLS0tLS0tLS0tCitkZXZpY2VfdHlwZQkJc3RyaW5nCQltdXN0IGJlICJzb2MiCityYW5nZXMJCQlpbnQJCXNob3VsZCBiZSA8MCBiYXNlYWRkciBiYXNlYWRkcisxMDAwMD4KK3JlZwkJCWludAkJbXVzdCBiZSA8YmFzZWFkZHIgMTAwMDA+CisKK1JlY29tbWVuZGVkIHByb3BlcnRpZXM6CituYW1lCQkJdHlwZQkJZGVzY3JpcHRpb24KKy0tLS0JCQktLS0tCQktLS0tLS0tLS0tLQorY29tcGF0aWJsZQkJc3RyaW5nCQlzaG91bGQgYmUgIjxjaGlwPi1zb2NcMG1wYzUyeHgtc29jIgorCQkJCQlpZS4gIm1wYzUyMDBiLXNvY1wwbXBjNTJ4eC1zb2MiCisjaW50ZXJydXB0LWNlbGxzCWludAkJbXVzdCBiZSA8Mz4uICBJZiBpdCBpcyBub3QgZGVmaW5lZAorCQkJCQloZXJlIHRoZW4gaXQgbXVzdCBiZSBkZWZpbmVkIGluIGV2ZXJ5CisJCQkJCXNvYyBkZXZpY2Ugbm9kZS4KK2J1cy1mcmVxdWVuY3kJCWludAkJSVBCIGJ1cyBmcmVxdWVuY3kgaW4gSFouICBDbG9jayByYXRlCisJCQkJCXVzZWQgYnkgbW9zdCBvZiB0aGUgc29jIGRldmljZXMuCisJCQkJCURlZmluaW5nIGl0IGhlcmUgYXZvaWRzIG5lZWRpbmcgaXQKKwkJCQkJYWRkZWQgdG8gZXZlcnkgZGV2aWNlIG5vZGUuCisKKzQpIHNvYzUyMDAgY2hpbGQgbm9kZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FueSBvbiBjaGlwIFNPQyBkZXZpY2VzIGF2YWlsYWJsZSB0byBMaW51eCBtdXN0IGFwcGVhciBhcyBzb2M1MjAwIGNoaWxkIG5vZGVzLgorCitOb3RlOiBpbiB0aGUgdGFibGVzIGJlbG93LCAnKicgbWF0Y2hlcyBhbGwgPGNoaXA+IHZhbHVlcy4gIGllLgorKi1waWMgd291bGQgdHJhbnNsYXRlIHRvICJtcGM1MjAwLXBpY1wwbXBjNTJ4eC1waWMiCisKK1JlcXVpcmVkIHNvYzUyMDAgY2hpbGQgbm9kZXM6CituYW1lCQlkZXZpY2VfdHlwZQkJY29tcGF0aWJsZQlEZXNjcmlwdGlvbgorLS0tLQkJLS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0KK2NkbUA8YWRkcj4JY2RtCQkJKi1jbWQJCUNsb2NrIERpc3RyaWJ1dGlvbgorcGljQDxhZGRyPglpbnRlcnJ1cHQtY29udHJvbGxlcgkqLXBpYwkJbmVlZCBhbiBpbnRlcnJ1cHQKKwkJCQkJCQljb250cm9sbGVyIHRvIGJvb3QKK2Jlc3Rjb21tQDxhZGRyPglkbWEtY29udHJvbGxlcgkJKi1iZXN0Y29tbQk1Mnh4IHBpYyBhbHNvIHJlcXVpcmVzCisJCQkJCQkJdGhlIGJlc3Rjb21tIGRldmljZQorCitSZWNvbW1lbmRlZCBzb2M1MjAwIGNoaWxkIG5vZGVzOyBwb3B1bGF0ZSBhcyBuZWVkZWQgZm9yIHlvdXIgYm9hcmQKK25hbWUJCWRldmljZV90eXBlCWNvbXBhdGlibGUJRGVzY3JpcHRpb24KKy0tLS0JCS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0KK2dwdEA8YWRkcj4JZ3B0CQkqLWdwdAkJR2VuZXJhbCBwdXJwb3NlIHRpbWVycworcnRjQDxhZGRyPglydGMJCSotcnRjCQlSZWFsIHRpbWUgY2xvY2sKK21zY2FuQDxhZGRyPgltc2NhbgkJKi1tc2NhbgkJQ0FOIGJ1cyBjb250cm9sbGVyCitwY2lAPGFkZHI+CXBjaQkJKi1wY2kJCVBDSSBicmlkZ2UKK3NlcmlhbEA8YWRkcj4Jc2VyaWFsCQkqLXBzYy11YXJ0CVBTQyBpbiBzZXJpYWwgbW9kZQoraTJzQDxhZGRyPglpMnMJCSotcHNjLWkycwlQU0MgaW4gaTJzIG1vZGUKK2FjOTdAPGFkZHI+CWFjOTcJCSotcHNjLWFjOTcJUFNDIGluIGFjOTcgbW9kZQorc3BpQDxhZGRyPglzcGkJCSotcHNjLXNwaQlQU0MgaW4gc3BpIG1vZGUKK2lyZGFAPGFkZHI+CWlyZGEJCSotcHNjLWlyZGEJUFNDIGluIElyREEgbW9kZQorc3BpQDxhZGRyPglzcGkJCSotc3BpCQlNUEM1Mnh4IHNwaSBkZXZpY2UKK2V0aGVybmV0QDxhZGRyPgluZXR3b3JrCQkqLWZlYwkJTVBDNTJ4eCBldGhlcm5ldCBkZXZpY2UKK2F0YUA8YWRkcj4JYXRhCQkqLWF0YQkJSURFIEFUQSBpbnRlcmZhY2UKK2kyY0A8YWRkcj4JaTJjCQkqLWkyYwkJSTJDIGNvbnRyb2xsZXIKK3VzYkA8YWRkcj4JdXNiLW9oY2ktYmUJKi1vaGNpLG9oY2ktYmUJVVNCIGNvbnRyb2xsZXIKK3hsYkA8YWRkcj4JeGxiCQkqLXhsYgkJWExCIGFyYnJpdHJhdG9yCisKK0lWIC0gRXh0cmEgTm90ZXMKKz09PT09PT09PT09PT09PT0KKworMS4gSW50ZXJydXB0IG1hcHBpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgbXBjNTJ4eCBwaWMgZHJpdmVyIHNwbGl0cyBoYXJkd2FyZSBJUlEgbnVtYmVycyBpbnRvIHR3byBsZXZlbHMuICBUaGUKK3NwbGl0IHJlZmxlY3RzIHRoZSBsYXlvdXQgb2YgdGhlIFBJQyBoYXJkd2FyZSBpdHNlbGYsIHdoaWNoIGdyb3VwcworaW50ZXJydXB0cyBpbnRvIG9uZSBvZiB0aHJlZSBncm91cHM7IENSSVQsIE1BSU4gb3IgUEVSUC4gIEFsc28sIHRoZQorQmVzdGNvbW0gZG1hIGVuZ2luZSBoYXMgaXQncyBvd24gc2V0IG9mIGludGVycnVwdCBzb3VyY2VzIHdoaWNoIGFyZQorY2FzY2FkZWQgb2ZmIG9mIHBlcmlwaGVyYWwgaW50ZXJydXB0IDAsIHdoaWNoIHRoZSBkcml2ZXIgaW50ZXJwcmV0cyBhcyBhCitmb3VydGggZ3JvdXAsIFNETUEuCisKK1RoZSBpbnRlcnJ1cHRzIHByb3BlcnR5IGZvciBkZXZpY2Ugbm9kZXMgdXNpbmcgdGhlIG1wYzUyeHggcGljIGNvbnNpc3RzCitvZiB0aHJlZSBjZWxsczsgPEwxIEwyIGxldmVsPgorCisgICAgTDEgOj0gW0NSSVQ9MCwgTUFJTj0xLCBQRVJQPTIsIFNETUE9M10KKyAgICBMMiA6PSBpbnRlcnJ1cHQgbnVtYmVyOyBkaXJlY3RseSBtYXBwZWQgZnJvbSB0aGUgdmFsdWUgaW4gdGhlCisgICAgICAgICAgIklDVEwgUGVyU3RhdCwgTWFpblN0YXQsIENyaXRTdGF0IEVuY29kZWQgUmVnaXN0ZXIiCisgICAgbGV2ZWwgOj0gW0xFVkVMX0hJR0g9MCwgRURHRV9SSVNJTkc9MSwgRURHRV9GQUxMSU5HPTIsIExFVkVMX0xPVz0zXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yb2J1c3QtZnV0ZXgtQUJJLnR4dCBiL0RvY3VtZW50YXRpb24vcm9idXN0LWZ1dGV4LUFCSS50eHQKaW5kZXggODUyOWExNy4uNTM1ZjY5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9yb2J1c3QtZnV0ZXgtQUJJLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3JvYnVzdC1mdXRleC1BQkkudHh0CkBAIC0xNzAsNyArMTcwLDcgQEAKICAxKSB0aGUgJ2hlYWQnIHBvaW50ZXIgb3IgYW4gc3Vic2VxdWVudCBsaW5rZWQgbGlzdCBwb2ludGVyCiAgICAgaXMgbm90IGEgdmFsaWQgYWRkcmVzcyBvZiBhIHVzZXIgc3BhY2Ugd29yZAogIDIpIHRoZSBjYWxjdWxhdGVkIGxvY2F0aW9uIG9mIHRoZSAnbG9jayB3b3JkJyAoYWRkcmVzcyBwbHVzCi0gICAgJ29mZnNldCcpIGlzIG5vdCB0aGUgdmFsdWQgYWRkcmVzcyBvZiBhIDMyIGJpdCB1c2VyIHNwYWNlCisgICAgJ29mZnNldCcpIGlzIG5vdCB0aGUgdmFsaWQgYWRkcmVzcyBvZiBhIDMyIGJpdCB1c2VyIHNwYWNlCiAgICAgd29yZAogIDMpIGlmIHRoZSBsaXN0IGNvbnRhaW5zIG1vcmUgdGhhbiAxIG1pbGxpb24gKHN1YmplY3QgdG8KICAgICBmdXR1cmUga2VybmVsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcykgZWxlbWVudHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JvYnVzdC1mdXRleGVzLnR4dCBiL0RvY3VtZW50YXRpb24vcm9idXN0LWZ1dGV4ZXMudHh0CmluZGV4IDc2ZTgwNjQuLjBhOTQ0NmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcm9idXN0LWZ1dGV4ZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcm9idXN0LWZ1dGV4ZXMudHh0CkBAIC0xODEsNyArMTgxLDcgQEAKIFNvIHRoZXJlIGlzIHZpcnR1YWxseSB6ZXJvIG92ZXJoZWFkIGZvciB0YXNrcyBub3QgdXNpbmcgcm9idXN0IGZ1dGV4ZXMsCiBhbmQgZXZlbiBmb3Igcm9idXN0IGZ1dGV4IHVzZXJzLCB0aGVyZSBpcyBvbmx5IG9uZSBleHRyYSBzeXNjYWxsIHBlcgogdGhyZWFkIGxpZmV0aW1lLCBhbmQgdGhlIGNsZWFudXAgb3BlcmF0aW9uLCBpZiBpdCBoYXBwZW5zLCBpcyBmYXN0IGFuZAotc3RyYWlnaHRmb3J3YXJkLiBUaGUga2VybmVsIGRvZXNudCBoYXZlIGFueSBpbnRlcm5hbCBkaXN0aW5jdGlvbiBiZXR3ZWVuCitzdHJhaWdodGZvcndhcmQuIFRoZSBrZXJuZWwgZG9lc24ndCBoYXZlIGFueSBpbnRlcm5hbCBkaXN0aW5jdGlvbiBiZXR3ZWVuCiByb2J1c3QgYW5kIG5vcm1hbCBmdXRleGVzLgogCiBJZiBhIGZ1dGV4IGlzIGZvdW5kIHRvIGJlIGhlbGQgYXQgZXhpdCB0aW1lLCB0aGUga2VybmVsIHNldHMgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3J0Yy50eHQgYi9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKaW5kZXggMmE1OGY5OC4uN2NmMWVjNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ydGMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcnRjLnR4dApAQCAtMSwxMiArMSw0OSBAQAogCi0JUmVhbCBUaW1lIENsb2NrIERyaXZlciBmb3IgTGludXgKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJlYWwgVGltZSBDbG9jayAoUlRDKSBEcml2ZXJzIGZvciBMaW51eAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGVuIExpbnV4IGRldmVsb3BlcnMgdGFsayBhYm91dCBhICJSZWFsIFRpbWUgQ2xvY2siLCB0aGV5IHVzdWFsbHkgbWVhbgorc29tZXRoaW5nIHRoYXQgdHJhY2tzIHdhbGwgY2xvY2sgdGltZSBhbmQgaXMgYmF0dGVyeSBiYWNrZWQgc28gdGhhdCBpdAord29ya3MgZXZlbiB3aXRoIHN5c3RlbSBwb3dlciBvZmYuICBTdWNoIGNsb2NrcyB3aWxsIG5vcm1hbGx5IG5vdCB0cmFjawordGhlIGxvY2FsIHRpbWUgem9uZSBvciBkYXlsaWdodCBzYXZpbmdzIHRpbWUgLS0gdW5sZXNzIHRoZXkgZHVhbCBib290Cit3aXRoIE1TLVdpbmRvd3MgLS0gYnV0IHdpbGwgaW5zdGVhZCBiZSBzZXQgdG8gQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUKKyhVVEMsIGZvcm1lcmx5ICJHcmVlbndpY2ggTWVhbiBUaW1lIikuCisKK1RoZSBuZXdlc3Qgbm9uLVBDIGhhcmR3YXJlIHRlbmRzIHRvIGp1c3QgY291bnQgc2Vjb25kcywgbGlrZSB0aGUgdGltZSgyKQorc3lzdGVtIGNhbGwgcmVwb3J0cywgYnV0IFJUQ3MgYWxzbyB2ZXJ5IGNvbW1vbmx5IHJlcHJlc2VudCB0aW1lIHVzaW5nCit0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIGFuZCAyNCBob3VyIHRpbWUsIGFzIHJlcG9ydGVkIGJ5IGdtdGltZSgzKS4KKworTGludXggaGFzIHR3byBsYXJnZWx5LWNvbXBhdGlibGUgdXNlcnNwYWNlIFJUQyBBUEkgZmFtaWxpZXMgeW91IG1heQorbmVlZCB0byBrbm93IGFib3V0OgorCisgICAgKgkvZGV2L3J0YyAuLi4gaXMgdGhlIFJUQyBwcm92aWRlZCBieSBQQyBjb21wYXRpYmxlIHN5c3RlbXMsCisJc28gaXQncyBub3QgdmVyeSBwb3J0YWJsZSB0byBub24teDg2IHN5c3RlbXMuCisKKyAgICAqCS9kZXYvcnRjMCwgL2Rldi9ydGMxIC4uLiBhcmUgcGFydCBvZiBhIGZyYW1ld29yayB0aGF0J3MKKwlzdXBwb3J0ZWQgYnkgYSB3aWRlIHZhcmlldHkgb2YgUlRDIGNoaXBzIG9uIGFsbCBzeXN0ZW1zLgorCitQcm9ncmFtbWVycyBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUgUEMvQVQgZnVuY3Rpb25hbGl0eSBpcyBub3QKK2Fsd2F5cyBhdmFpbGFibGUsIGFuZCBzb21lIHN5c3RlbXMgY2FuIGRvIG11Y2ggbW9yZS4gIFRoYXQgaXMsIHRoZQorUlRDcyB1c2UgdGhlIHNhbWUgQVBJIHRvIG1ha2UgcmVxdWVzdHMgaW4gYm90aCBSVEMgZnJhbWV3b3JrcyAodXNpbmcKK2RpZmZlcmVudCBmaWxlbmFtZXMgb2YgY291cnNlKSwgYnV0IHRoZSBoYXJkd2FyZSBtYXkgbm90IG9mZmVyIHRoZQorc2FtZSBmdW5jdGlvbmFsaXR5LiAgRm9yIGV4YW1wbGUsIG5vdCBldmVyeSBSVEMgaXMgaG9va2VkIHVwIHRvIGFuCitJUlEsIHNvIHRoZXkgY2FuJ3QgYWxsIGlzc3VlIGFsYXJtczsgYW5kIHdoZXJlIHN0YW5kYXJkIFBDIFJUQ3MgY2FuCitvbmx5IGlzc3VlIGFuIGFsYXJtIHVwIHRvIDI0IGhvdXJzIGluIHRoZSBmdXR1cmUsIG90aGVyIGhhcmR3YXJlIG1heQorYmUgYWJsZSB0byBzY2hlZHVsZSBvbmUgYW55IHRpbWUgaW4gdGhlIHVwY29taW5nIGNlbnR1cnkuCisKKworCU9sZCBQQy9BVC1Db21wYXRpYmxlIGRyaXZlcjogIC9kZXYvcnRjCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQWxsIFBDcyAoZXZlbiBBbHBoYSBtYWNoaW5lcykgaGF2ZSBhIFJlYWwgVGltZSBDbG9jayBidWlsdCBpbnRvIHRoZW0uCiBVc3VhbGx5IHRoZXkgYXJlIGJ1aWx0IGludG8gdGhlIGNoaXBzZXQgb2YgdGhlIGNvbXB1dGVyLCBidXQgc29tZSBtYXkKIGFjdHVhbGx5IGhhdmUgYSBNb3Rvcm9sYSBNQzE0NjgxOCAob3IgY2xvbmUpIG9uIHRoZSBib2FyZC4gVGhpcyBpcyB0aGUKIGNsb2NrIHRoYXQga2VlcHMgdGhlIGRhdGUgYW5kIHRpbWUgd2hpbGUgeW91ciBjb21wdXRlciBpcyB0dXJuZWQgb2ZmLgogCitBQ1BJIGhhcyBzdGFuZGFyZGl6ZWQgdGhhdCBNQzE0NjgxOCBmdW5jdGlvbmFsaXR5LCBhbmQgZXh0ZW5kZWQgaXQgaW4KK2EgZmV3IHdheXMgKGVuYWJsaW5nIGxvbmdlciBhbGFybSBwZXJpb2RzLCBhbmQgd2FrZS1mcm9tLWhpYmVybmF0ZSkuCitUaGF0IGZ1bmN0aW9uYWxpdHkgaXMgTk9UIGV4cG9zZWQgaW4gdGhlIG9sZCBkcml2ZXIuCisKIEhvd2V2ZXIgaXQgY2FuIGFsc28gYmUgdXNlZCB0byBnZW5lcmF0ZSBzaWduYWxzIGZyb20gYSBzbG93IDJIeiB0byBhCiByZWxhdGl2ZWx5IGZhc3QgODE5Mkh6LCBpbiBpbmNyZW1lbnRzIG9mIHBvd2VycyBvZiB0d28uIFRoZXNlIHNpZ25hbHMKIGFyZSByZXBvcnRlZCBieSBpbnRlcnJ1cHQgbnVtYmVyIDguIChPaCEgU28gKnRoYXQqIGlzIHdoYXQgSVJRIDggaXMKQEAgLTYzLDIyMyArMTAwLDMzMSBAQAogcGVyaGFwcyBtb3JlIHVzZWZ1bCB0byBpbmNsdWRlIGEgc21hbGwgdGVzdCBwcm9ncmFtIHRoYXQgZGVtb25zdHJhdGVzCiBob3cgdG8gdXNlIHRoZW0sIGFuZCBkZW1vbnN0cmF0ZXMgdGhlIGZlYXR1cmVzIG9mIHRoZSBkcml2ZXIuIFRoaXMgaXMKIHByb2JhYmx5IGEgbG90IG1vcmUgdXNlZnVsIHRvIHBlb3BsZSBpbnRlcmVzdGVkIGluIHdyaXRpbmcgYXBwbGljYXRpb25zCi10aGF0IHdpbGwgYmUgdXNpbmcgdGhpcyBkcml2ZXIuCit0aGF0IHdpbGwgYmUgdXNpbmcgdGhpcyBkcml2ZXIuICBTZWUgdGhlIGNvZGUgYXQgdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50LgogCi0JCQkJCQlQYXVsIEdvcnRtYWtlcgorKFRoZSBvcmlnaW5hbCAvZGV2L3J0YyBkcml2ZXIgd2FzIHdyaXR0ZW4gYnkgUGF1bCBHb3J0bWFrZXIuKQorCisKKwlOZXcgcG9ydGFibGUgIlJUQyBDbGFzcyIgZHJpdmVyczogIC9kZXYvcnRjTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JlY2F1c2UgTGludXggc3VwcG9ydHMgbWFueSBub24tQUNQSSBhbmQgbm9uLVBDIHBsYXRmb3Jtcywgc29tZSBvZiB3aGljaAoraGF2ZSBtb3JlIHRoYW4gb25lIFJUQyBzdHlsZSBjbG9jaywgaXQgbmVlZGVkIGEgbW9yZSBwb3J0YWJsZSBzb2x1dGlvbgordGhhbiBleHBlY3RpbmcgYSBzaW5nbGUgYmF0dGVyeS1iYWNrZWQgTUMxNDY4MTggY2xvbmUgb24gZXZlcnkgc3lzdGVtLgorQWNjb3JkaW5nbHksIGEgbmV3ICJSVEMgQ2xhc3MiIGZyYW1ld29yayBoYXMgYmVlbiBkZWZpbmVkLiAgSXQgb2ZmZXJzCit0aHJlZSBkaWZmZXJlbnQgdXNlcnNwYWNlIGludGVyZmFjZXM6CisKKyAgICAqCS9kZXYvcnRjTiAuLi4gbXVjaCB0aGUgc2FtZSBhcyB0aGUgb2xkZXIgL2Rldi9ydGMgaW50ZXJmYWNlCisKKyAgICAqCS9zeXMvY2xhc3MvcnRjL3J0Y04gLi4uIHN5c2ZzIGF0dHJpYnV0ZXMgc3VwcG9ydCByZWFkb25seQorCWFjY2VzcyB0byBzb21lIFJUQyBhdHRyaWJ1dGVzLgorCisgICAgKgkvcHJvYy9kcml2ZXIvcnRjIC4uLiB0aGUgZmlyc3QgUlRDIChydGMwKSBtYXkgZXhwb3NlIGl0c2VsZgorCXVzaW5nIGEgcHJvY2ZzIGludGVyZmFjZS4gIE1vcmUgaW5mb3JtYXRpb24gaXMgKGN1cnJlbnRseSkgc2hvd24KKwloZXJlIHRoYW4gdGhyb3VnaCBzeXNmcy4KKworVGhlIFJUQyBDbGFzcyBmcmFtZXdvcmsgc3VwcG9ydHMgYSB3aWRlIHZhcmlldHkgb2YgUlRDcywgcmFuZ2luZyBmcm9tIHRob3NlCitpbnRlZ3JhdGVkIGludG8gZW1iZWRkYWJsZSBzeXN0ZW0tb24tY2hpcCAoU09DKSBwcm9jZXNzb3JzIHRvIGRpc2NyZXRlIGNoaXBzCit1c2luZyBJMkMsIFNQSSwgb3Igc29tZSBvdGhlciBidXMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgaG9zdCBDUFUuICBUaGVyZSdzCitldmVuIHN1cHBvcnQgZm9yIFBDLXN0eWxlIFJUQ3MgLi4uIGluY2x1ZGluZyB0aGUgZmVhdHVyZXMgZXhwb3NlZCBvbiBuZXdlciBQQ3MKK3Rocm91Z2ggQUNQSS4KKworVGhlIG5ldyBmcmFtZXdvcmsgYWxzbyByZW1vdmVzIHRoZSAib25lIFJUQyBwZXIgc3lzdGVtIiByZXN0cmljdGlvbi4gIEZvcgorZXhhbXBsZSwgbWF5YmUgdGhlIGxvdy1wb3dlciBiYXR0ZXJ5LWJhY2tlZCBSVEMgaXMgYSBkaXNjcmV0ZSBJMkMgY2hpcCwgYnV0CithIGhpZ2ggZnVuY3Rpb25hbGl0eSBSVEMgaXMgaW50ZWdyYXRlZCBpbnRvIHRoZSBTT0MuICBUaGF0IHN5c3RlbSBtaWdodCByZWFkCit0aGUgc3lzdGVtIGNsb2NrIGZyb20gdGhlIGRpc2NyZXRlIFJUQywgYnV0IHVzZSB0aGUgaW50ZWdyYXRlZCBvbmUgZm9yIGFsbAorb3RoZXIgdGFza3MsIGJlY2F1c2Ugb2YgaXRzIGdyZWF0ZXIgZnVuY3Rpb25hbGl0eS4KKworVGhlIGlvY3RsKCkgY2FsbHMgc3VwcG9ydGVkIGJ5IC9kZXYvcnRjIGFyZSBhbHNvIHN1cHBvcnRlZCBieSB0aGUgUlRDIGNsYXNzCitmcmFtZXdvcmsuICBIb3dldmVyLCBiZWNhdXNlIHRoZSBjaGlwcyBhbmQgc3lzdGVtcyBhcmUgbm90IHN0YW5kYXJkaXplZCwKK3NvbWUgUEMvQVQgZnVuY3Rpb25hbGl0eSBtaWdodCBub3QgYmUgcHJvdmlkZWQuICBBbmQgaW4gdGhlIHNhbWUgd2F5LCBzb21lCituZXdlciBmZWF0dXJlcyAtLSBpbmNsdWRpbmcgdGhvc2UgZW5hYmxlZCBieSBBQ1BJIC0tIGFyZSBleHBvc2VkIGJ5IHRoZQorUlRDIGNsYXNzIGZyYW1ld29yaywgYnV0IGNhbid0IGJlIHN1cHBvcnRlZCBieSB0aGUgb2xkZXIgZHJpdmVyLgorCisgICAgKglSVENfUkRfVElNRSwgUlRDX1NFVF9USU1FIC4uLiBldmVyeSBSVEMgc3VwcG9ydHMgYXQgbGVhc3QgcmVhZGluZworCXRpbWUsIHJldHVybmluZyB0aGUgcmVzdWx0IGFzIGEgR3JlZ29yaWFuIGNhbGVuZGFyIGRhdGUgYW5kIDI0IGhvdXIKKwl3YWxsIGNsb2NrIHRpbWUuICBUbyBiZSBtb3N0IHVzZWZ1bCwgdGhpcyB0aW1lIG1heSBhbHNvIGJlIHVwZGF0ZWQuCisKKyAgICAqCVJUQ19BSUVfT04sIFJUQ19BSUVfT0ZGLCBSVENfQUxNX1NFVCwgUlRDX0FMTV9SRUFEIC4uLiB3aGVuIHRoZSBSVEMKKwlpcyBjb25uZWN0ZWQgdG8gYW4gSVJRIGxpbmUsIGl0IGNhbiBvZnRlbiBpc3N1ZSBhbiBhbGFybSBJUlEgdXAgdG8KKwkyNCBob3VycyBpbiB0aGUgZnV0dXJlLgorCisgICAgKglSVENfV0tBTE1fU0VULCBSVENfV0tBTE1fUkVBRCAuLi4gUlRDcyB0aGF0IGNhbiBpc3N1ZSBhbGFybXMgYmV5b25kCisJdGhlIG5leHQgMjQgaG91cnMgdXNlIGEgc2xpZ2h0bHkgbW9yZSBwb3dlcmZ1bCBBUEksIHdoaWNoIHN1cHBvcnRzCisJc2V0dGluZyB0aGUgbG9uZ2VyIGFsYXJtIHRpbWUgYW5kIGVuYWJsaW5nIGl0cyBJUlEgdXNpbmcgYSBzaW5nbGUKKwlyZXF1ZXN0ICh1c2luZyB0aGUgc2FtZSBtb2RlbCBhcyBFRkkgZmlybXdhcmUpLgorCisgICAgKglSVENfVUlFX09OLCBSVENfVUlFX09GRiAuLi4gaWYgdGhlIFJUQyBvZmZlcnMgSVJRcywgaXQgcHJvYmFibHkKKwlhbHNvIG9mZmVycyB1cGRhdGUgSVJRcyB3aGVuZXZlciB0aGUgInNlY29uZHMiIGNvdW50ZXIgY2hhbmdlcy4KKwlJZiBuZWVkZWQsIHRoZSBSVEMgZnJhbWV3b3JrIGNhbiBlbXVsYXRlIHRoaXMgbWVjaGFuaXNtLgorCisgICAgKglSVENfUElFX09OLCBSVENfUElFX09GRiwgUlRDX0lSUVBfU0VULCBSVENfSVJRUF9SRUFEIC4uLiBhbm90aGVyCisJZmVhdHVyZSBvZnRlbiBhY2Nlc3NpYmxlIHdpdGggYW4gSVJRIGxpbmUgaXMgYSBwZXJpb2RpYyBJUlEsIGlzc3VlZAorCWF0IHNldHRhYmxlIGZyZXF1ZW5jaWVzICh1c3VhbGx5IDJeTiBIeikuCisKK0luIG1hbnkgY2FzZXMsIHRoZSBSVEMgYWxhcm0gY2FuIGJlIGEgc3lzdGVtIHdha2UgZXZlbnQsIHVzZWQgdG8gZm9yY2UKK0xpbnV4IG91dCBvZiBhIGxvdyBwb3dlciBzbGVlcCBzdGF0ZSAob3IgaGliZXJuYXRpb24pIGJhY2sgdG8gYSBmdWxseQorb3BlcmF0aW9uYWwgc3RhdGUuICBGb3IgZXhhbXBsZSwgYSBzeXN0ZW0gY291bGQgZW50ZXIgYSBkZWVwIHBvd2VyIHNhdmluZworc3RhdGUgdW50aWwgaXQncyB0aW1lIHRvIGV4ZWN1dGUgc29tZSBzY2hlZHVsZWQgdGFza3MuCisKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0gODwgLS0tLS0tLS0tLS0tLS0tLSA4PCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvKgotICoJUmVhbCBUaW1lIENsb2NrIERyaXZlciBUZXN0L0V4YW1wbGUgUHJvZ3JhbQorICogICAgICBSZWFsIFRpbWUgQ2xvY2sgRHJpdmVyIFRlc3QvRXhhbXBsZSBQcm9ncmFtCiAgKgotICoJQ29tcGlsZSB3aXRoOgotICoJCWdjYyAtcyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIHJ0Y3Rlc3QuYyAtbyBydGN0ZXN0CisgKiAgICAgIENvbXBpbGUgd2l0aDoKKyAqCQkgICAgIGdjYyAtcyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIHJ0Y3Rlc3QuYyAtbyBydGN0ZXN0CiAgKgotICoJQ29weXJpZ2h0IChDKSAxOTk2LCBQYXVsIEdvcnRtYWtlci4KKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCBQYXVsIEdvcnRtYWtlci4KICAqCi0gKglSZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLSAqCWluY2x1ZGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiAgICAgIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAorICogICAgICBpbmNsdWRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgogICoKICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KIAotaW50IG1haW4odm9pZCkgewogCi1pbnQgaSwgZmQsIHJldHZhbCwgaXJxY291bnQgPSAwOwotdW5zaWduZWQgbG9uZyB0bXAsIGRhdGE7Ci1zdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworLyoKKyAqIFRoaXMgZXhwZWN0cyB0aGUgbmV3IFJUQyBjbGFzcyBkcml2ZXIgZnJhbWV3b3JrLCB3b3JraW5nIHdpdGgKKyAqIGNsb2NrcyB0aGF0IHdpbGwgb2Z0ZW4gbm90IGJlIGNsb25lcyBvZiB3aGF0IHRoZSBQQy1BVCBoYWQuCisgKiBVc2UgdGhlIGNvbW1hbmQgbGluZSB0byBzcGVjaWZ5IGFub3RoZXIgUlRDIGlmIHlvdSBuZWVkIG9uZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdF9ydGNbXSA9ICIvZGV2L3J0YzAiOwogCi1mZCA9IG9wZW4gKCIvZGV2L3J0YyIsIE9fUkRPTkxZKTsKIAotaWYgKGZkID09ICAtMSkgewotCXBlcnJvcigiL2Rldi9ydGMiKTsKLQlleGl0KGVycm5vKTsKLX0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgZmQsIHJldHZhbCwgaXJxY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgdG1wLCBkYXRhOworCXN0cnVjdCBydGNfdGltZSBydGNfdG07CisJY29uc3QgY2hhciAqcnRjID0gZGVmYXVsdF9ydGM7CiAKLWZwcmludGYoc3RkZXJyLCAiXG5cdFx0XHRSVEMgRHJpdmVyIFRlc3QgRXhhbXBsZS5cblxuIik7CisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAyOgorCQlydGMgPSBhcmd2WzFdOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgMToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogIHJ0Y3Rlc3QgW3J0Y2Rldl1cbiIpOworCQlyZXR1cm4gMTsKKwl9CiAKLS8qIFR1cm4gb24gdXBkYXRlIGludGVycnVwdHMgKG9uZSBwZXIgc2Vjb25kKSAqLwotcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19VSUVfT04sIDApOwotaWYgKHJldHZhbCA9PSAtMSkgewotCXBlcnJvcigiaW9jdGwiKTsKLQlleGl0KGVycm5vKTsKLX0KKwlmZCA9IG9wZW4ocnRjLCBPX1JET05MWSk7CiAKLWZwcmludGYoc3RkZXJyLCAiQ291bnRpbmcgNSB1cGRhdGUgKDEvc2VjKSBpbnRlcnJ1cHRzIGZyb20gcmVhZGluZyAvZGV2L3J0YzoiKTsKLWZmbHVzaChzdGRlcnIpOwotZm9yIChpPTE7IGk8NjsgaSsrKSB7Ci0JLyogVGhpcyByZWFkIHdpbGwgYmxvY2sgKi8KLQlyZXR2YWwgPSByZWFkKGZkLCAmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQlpZiAocmV0dmFsID09IC0xKSB7Ci0JCXBlcnJvcigicmVhZCIpOworCWlmIChmZCA9PSAgLTEpIHsKKwkJcGVycm9yKHJ0Yyk7CiAJCWV4aXQoZXJybm8pOwogCX0KLQlmcHJpbnRmKHN0ZGVyciwgIiAlZCIsaSk7Ci0JZmZsdXNoKHN0ZGVycik7Ci0JaXJxY291bnQrKzsKLX0KIAotZnByaW50ZihzdGRlcnIsICJcbkFnYWluLCBmcm9tIHVzaW5nIHNlbGVjdCgyKSBvbiAvZGV2L3J0YzoiKTsKLWZmbHVzaChzdGRlcnIpOwotZm9yIChpPTE7IGk8NjsgaSsrKSB7Ci0Jc3RydWN0IHRpbWV2YWwgdHYgPSB7NSwgMH07CS8qIDUgc2Vjb25kIHRpbWVvdXQgb24gc2VsZWN0ICovCi0JZmRfc2V0IHJlYWRmZHM7CisJZnByaW50ZihzdGRlcnIsICJcblx0XHRcdFJUQyBEcml2ZXIgVGVzdCBFeGFtcGxlLlxuXG4iKTsKIAotCUZEX1pFUk8oJnJlYWRmZHMpOwotCUZEX1NFVChmZCwgJnJlYWRmZHMpOwotCS8qIFRoZSBzZWxlY3Qgd2lsbCB3YWl0IHVudGlsIGFuIFJUQyBpbnRlcnJ1cHQgaGFwcGVucy4gKi8KLQlyZXR2YWwgPSBzZWxlY3QoZmQrMSwgJnJlYWRmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisJLyogVHVybiBvbiB1cGRhdGUgaW50ZXJydXB0cyAob25lIHBlciBzZWNvbmQpICovCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19VSUVfT04sIDApOwogCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJcGVycm9yKCJzZWxlY3QiKTsKLQkJZXhpdChlcnJubyk7Ci0JfQotCS8qIFRoaXMgcmVhZCB3b24ndCBibG9jayB1bmxpa2UgdGhlIHNlbGVjdC1sZXNzIGNhc2UgYWJvdmUuICovCi0JcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JaWYgKHJldHZhbCA9PSAtMSkgewotCQlwZXJyb3IoInJlYWQiKTsKLQkJZXhpdChlcnJubyk7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAiICVkIixpKTsKLQlmZmx1c2goc3RkZXJyKTsKLQlpcnFjb3VudCsrOwotfQotCi0vKiBUdXJuIG9mZiB1cGRhdGUgaW50ZXJydXB0cyAqLwotcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19VSUVfT0ZGLCAwKTsKLWlmIChyZXR2YWwgPT0gLTEpIHsKLQlwZXJyb3IoImlvY3RsIik7Ci0JZXhpdChlcnJubyk7Ci19Ci0KLS8qIFJlYWQgdGhlIFJUQyB0aW1lL2RhdGUgKi8KLXJldHZhbCA9IGlvY3RsKGZkLCBSVENfUkRfVElNRSwgJnJ0Y190bSk7Ci1pZiAocmV0dmFsID09IC0xKSB7Ci0JcGVycm9yKCJpb2N0bCIpOwotCWV4aXQoZXJybm8pOwotfQotCi1mcHJpbnRmKHN0ZGVyciwgIlxuXG5DdXJyZW50IFJUQyBkYXRlL3RpbWUgaXMgJWQtJWQtJWQsICUwMmQ6JTAyZDolMDJkLlxuIiwKLQlydGNfdG0udG1fbWRheSwgcnRjX3RtLnRtX21vbiArIDEsIHJ0Y190bS50bV95ZWFyICsgMTkwMCwKLQlydGNfdG0udG1faG91ciwgcnRjX3RtLnRtX21pbiwgcnRjX3RtLnRtX3NlYyk7Ci0KLS8qIFNldCB0aGUgYWxhcm0gdG8gNSBzZWMgaW4gdGhlIGZ1dHVyZSwgYW5kIGNoZWNrIGZvciByb2xsb3ZlciAqLwotcnRjX3RtLnRtX3NlYyArPSA1OwotaWYgKHJ0Y190bS50bV9zZWMgPj0gNjApIHsKLQlydGNfdG0udG1fc2VjICU9IDYwOwotCXJ0Y190bS50bV9taW4rKzsKLX0KLWlmICAocnRjX3RtLnRtX21pbiA9PSA2MCkgewotCXJ0Y190bS50bV9taW4gPSAwOwotCXJ0Y190bS50bV9ob3VyKys7Ci19Ci1pZiAgKHJ0Y190bS50bV9ob3VyID09IDI0KQotCXJ0Y190bS50bV9ob3VyID0gMDsKLQotcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BTE1fU0VULCAmcnRjX3RtKTsKLWlmIChyZXR2YWwgPT0gLTEpIHsKLQlwZXJyb3IoImlvY3RsIik7Ci0JZXhpdChlcnJubyk7Ci19Ci0KLS8qIFJlYWQgdGhlIGN1cnJlbnQgYWxhcm0gc2V0dGluZ3MgKi8KLXJldHZhbCA9IGlvY3RsKGZkLCBSVENfQUxNX1JFQUQsICZydGNfdG0pOwotaWYgKHJldHZhbCA9PSAtMSkgewotCXBlcnJvcigiaW9jdGwiKTsKLQlleGl0KGVycm5vKTsKLX0KLQotZnByaW50ZihzdGRlcnIsICJBbGFybSB0aW1lIG5vdyBzZXQgdG8gJTAyZDolMDJkOiUwMmQuXG4iLAotCXJ0Y190bS50bV9ob3VyLCBydGNfdG0udG1fbWluLCBydGNfdG0udG1fc2VjKTsKLQotLyogRW5hYmxlIGFsYXJtIGludGVycnVwdHMgKi8KLXJldHZhbCA9IGlvY3RsKGZkLCBSVENfQUlFX09OLCAwKTsKLWlmIChyZXR2YWwgPT0gLTEpIHsKLQlwZXJyb3IoImlvY3RsIik7Ci0JZXhpdChlcnJubyk7Ci19Ci0KLWZwcmludGYoc3RkZXJyLCAiV2FpdGluZyA1IHNlY29uZHMgZm9yIGFsYXJtLi4uIik7Ci1mZmx1c2goc3RkZXJyKTsKLS8qIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBhbGFybSByaW5nIGNhdXNlcyBhbiBpbnRlcnJ1cHQgKi8KLXJldHZhbCA9IHJlYWQoZmQsICZkYXRhLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotaWYgKHJldHZhbCA9PSAtMSkgewotCXBlcnJvcigicmVhZCIpOwotCWV4aXQoZXJybm8pOwotfQotaXJxY291bnQrKzsKLWZwcmludGYoc3RkZXJyLCAiIG9rYXkuIEFsYXJtIHJhbmcuXG4iKTsKLQotLyogRGlzYWJsZSBhbGFybSBpbnRlcnJ1cHRzICovCi1yZXR2YWwgPSBpb2N0bChmZCwgUlRDX0FJRV9PRkYsIDApOwotaWYgKHJldHZhbCA9PSAtMSkgewotCXBlcnJvcigiaW9jdGwiKTsKLQlleGl0KGVycm5vKTsKLX0KLQotLyogUmVhZCBwZXJpb2RpYyBJUlEgcmF0ZSAqLwotcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19JUlFQX1JFQUQsICZ0bXApOwotaWYgKHJldHZhbCA9PSAtMSkgewotCXBlcnJvcigiaW9jdGwiKTsKLQlleGl0KGVycm5vKTsKLX0KLWZwcmludGYoc3RkZXJyLCAiXG5QZXJpb2RpYyBJUlEgcmF0ZSB3YXMgJWxkSHouXG4iLCB0bXApOwotCi1mcHJpbnRmKHN0ZGVyciwgIkNvdW50aW5nIDIwIGludGVycnVwdHMgYXQ6Iik7Ci1mZmx1c2goc3RkZXJyKTsKLQotLyogVGhlIGZyZXF1ZW5jaWVzIDEyOEh6LCAyNTZIeiwgLi4uIDgxOTJIeiBhcmUgb25seSBhbGxvd2VkIGZvciByb290LiAqLwotZm9yICh0bXA9MjsgdG1wPD02NDsgdG1wKj0yKSB7Ci0KLQlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0lSUVBfU0VULCB0bXApOwotCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVOT1RUWSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlxuLi4uVXBkYXRlIElSUXMgbm90IHN1cHBvcnRlZC5cbiIpOworCQkJZ290byB0ZXN0X1JFQUQ7CisJCX0KIAkJcGVycm9yKCJpb2N0bCIpOwogCQlleGl0KGVycm5vKTsKIAl9CiAKLQlmcHJpbnRmKHN0ZGVyciwgIlxuJWxkSHo6XHQiLCB0bXApOworCWZwcmludGYoc3RkZXJyLCAiQ291bnRpbmcgNSB1cGRhdGUgKDEvc2VjKSBpbnRlcnJ1cHRzIGZyb20gcmVhZGluZyAlczoiLAorCQkJcnRjKTsKIAlmZmx1c2goc3RkZXJyKTsKLQotCS8qIEVuYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHRzICovCi0JcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19QSUVfT04sIDApOwotCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJcGVycm9yKCJpb2N0bCIpOwotCQlleGl0KGVycm5vKTsKLQl9Ci0KLQlmb3IgKGk9MTsgaTwyMTsgaSsrKSB7Ci0JCS8qIFRoaXMgYmxvY2tzICovCisJZm9yIChpPTE7IGk8NjsgaSsrKSB7CisJCS8qIFRoaXMgcmVhZCB3aWxsIGJsb2NrICovCiAJCXJldHZhbCA9IHJlYWQoZmQsICZkYXRhLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCQlpZiAocmV0dmFsID09IC0xKSB7Ci0JCQlwZXJyb3IoInJlYWQiKTsKLQkJCWV4aXQoZXJybm8pOworCQkgICAgICAgIHBlcnJvcigicmVhZCIpOworCQkgICAgICAgIGV4aXQoZXJybm8pOwogCQl9CiAJCWZwcmludGYoc3RkZXJyLCAiICVkIixpKTsKIAkJZmZsdXNoKHN0ZGVycik7CiAJCWlycWNvdW50Kys7CiAJfQogCi0JLyogRGlzYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHRzICovCi0JcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19QSUVfT0ZGLCAwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuQWdhaW4sIGZyb20gdXNpbmcgc2VsZWN0KDIpIG9uIC9kZXYvcnRjOiIpOworCWZmbHVzaChzdGRlcnIpOworCWZvciAoaT0xOyBpPDY7IGkrKykgeworCQlzdHJ1Y3QgdGltZXZhbCB0diA9IHs1LCAwfTsgICAgIC8qIDUgc2Vjb25kIHRpbWVvdXQgb24gc2VsZWN0ICovCisJCWZkX3NldCByZWFkZmRzOworCisJCUZEX1pFUk8oJnJlYWRmZHMpOworCQlGRF9TRVQoZmQsICZyZWFkZmRzKTsKKwkJLyogVGhlIHNlbGVjdCB3aWxsIHdhaXQgdW50aWwgYW4gUlRDIGludGVycnVwdCBoYXBwZW5zLiAqLworCQlyZXR2YWwgPSBzZWxlY3QoZmQrMSwgJnJlYWRmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisJCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJICAgICAgICBwZXJyb3IoInNlbGVjdCIpOworCQkgICAgICAgIGV4aXQoZXJybm8pOworCQl9CisJCS8qIFRoaXMgcmVhZCB3b24ndCBibG9jayB1bmxpa2UgdGhlIHNlbGVjdC1sZXNzIGNhc2UgYWJvdmUuICovCisJCXJldHZhbCA9IHJlYWQoZmQsICZkYXRhLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCSAgICAgICAgcGVycm9yKCJyZWFkIik7CisJCSAgICAgICAgZXhpdChlcnJubyk7CisJCX0KKwkJZnByaW50ZihzdGRlcnIsICIgJWQiLGkpOworCQlmZmx1c2goc3RkZXJyKTsKKwkJaXJxY291bnQrKzsKKwl9CisKKwkvKiBUdXJuIG9mZiB1cGRhdGUgaW50ZXJydXB0cyAqLworCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfVUlFX09GRiwgMCk7CiAJaWYgKHJldHZhbCA9PSAtMSkgewogCQlwZXJyb3IoImlvY3RsIik7CiAJCWV4aXQoZXJybm8pOwogCX0KKwordGVzdF9SRUFEOgorCS8qIFJlYWQgdGhlIFJUQyB0aW1lL2RhdGUgKi8KKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX1JEX1RJTUUsICZydGNfdG0pOworCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJcGVycm9yKCJpb2N0bCIpOworCQlleGl0KGVycm5vKTsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIlxuXG5DdXJyZW50IFJUQyBkYXRlL3RpbWUgaXMgJWQtJWQtJWQsICUwMmQ6JTAyZDolMDJkLlxuIiwKKwkJcnRjX3RtLnRtX21kYXksIHJ0Y190bS50bV9tb24gKyAxLCBydGNfdG0udG1feWVhciArIDE5MDAsCisJCXJ0Y190bS50bV9ob3VyLCBydGNfdG0udG1fbWluLCBydGNfdG0udG1fc2VjKTsKKworCS8qIFNldCB0aGUgYWxhcm0gdG8gNSBzZWMgaW4gdGhlIGZ1dHVyZSwgYW5kIGNoZWNrIGZvciByb2xsb3ZlciAqLworCXJ0Y190bS50bV9zZWMgKz0gNTsKKwlpZiAocnRjX3RtLnRtX3NlYyA+PSA2MCkgeworCQlydGNfdG0udG1fc2VjICU9IDYwOworCQlydGNfdG0udG1fbWluKys7CisJfQorCWlmICAocnRjX3RtLnRtX21pbiA9PSA2MCkgeworCQlydGNfdG0udG1fbWluID0gMDsKKwkJcnRjX3RtLnRtX2hvdXIrKzsKKwl9CisJaWYgIChydGNfdG0udG1faG91ciA9PSAyNCkKKwkJcnRjX3RtLnRtX2hvdXIgPSAwOworCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BTE1fU0VULCAmcnRjX3RtKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFTk9UVFkpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJcbi4uLkFsYXJtIElSUXMgbm90IHN1cHBvcnRlZC5cbiIpOworCQkJZ290byB0ZXN0X1BJRTsKKwkJfQorCQlwZXJyb3IoImlvY3RsIik7CisJCWV4aXQoZXJybm8pOworCX0KKworCS8qIFJlYWQgdGhlIGN1cnJlbnQgYWxhcm0gc2V0dGluZ3MgKi8KKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0FMTV9SRUFELCAmcnRjX3RtKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCXBlcnJvcigiaW9jdGwiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJBbGFybSB0aW1lIG5vdyBzZXQgdG8gJTAyZDolMDJkOiUwMmQuXG4iLAorCQlydGNfdG0udG1faG91ciwgcnRjX3RtLnRtX21pbiwgcnRjX3RtLnRtX3NlYyk7CisKKwkvKiBFbmFibGUgYWxhcm0gaW50ZXJydXB0cyAqLworCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfQUlFX09OLCAwKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCXBlcnJvcigiaW9jdGwiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJXYWl0aW5nIDUgc2Vjb25kcyBmb3IgYWxhcm0uLi4iKTsKKwlmZmx1c2goc3RkZXJyKTsKKwkvKiBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgYWxhcm0gcmluZyBjYXVzZXMgYW4gaW50ZXJydXB0ICovCisJcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaWYgKHJldHZhbCA9PSAtMSkgeworCQlwZXJyb3IoInJlYWQiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCWlycWNvdW50Kys7CisJZnByaW50ZihzdGRlcnIsICIgb2theS4gQWxhcm0gcmFuZy5cbiIpOworCisJLyogRGlzYWJsZSBhbGFybSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BSUVfT0ZGLCAwKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCXBlcnJvcigiaW9jdGwiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCit0ZXN0X1BJRToKKwkvKiBSZWFkIHBlcmlvZGljIElSUSByYXRlICovCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19JUlFQX1JFQUQsICZ0bXApOworCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJLyogbm90IGFsbCBSVENzIHN1cHBvcnQgcGVyaW9kaWMgSVJRcyAqLworCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuTm8gcGVyaW9kaWMgSVJRIHN1cHBvcnRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGVycm9yKCJpb2N0bCIpOworCQlleGl0KGVycm5vKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJcblBlcmlvZGljIElSUSByYXRlIGlzICVsZEh6LlxuIiwgdG1wKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ291bnRpbmcgMjAgaW50ZXJydXB0cyBhdDoiKTsKKwlmZmx1c2goc3RkZXJyKTsKKworCS8qIFRoZSBmcmVxdWVuY2llcyAxMjhIeiwgMjU2SHosIC4uLiA4MTkySHogYXJlIG9ubHkgYWxsb3dlZCBmb3Igcm9vdC4gKi8KKwlmb3IgKHRtcD0yOyB0bXA8PTY0OyB0bXAqPTIpIHsKKworCQlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0lSUVBfU0VULCB0bXApOworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQkvKiBub3QgYWxsIFJUQ3MgY2FuIGNoYW5nZSB0aGVpciBwZXJpb2RpYyBJUlEgcmF0ZSAqLworCQkJaWYgKGVycm5vID09IEVOT1RUWSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiXG4uLi5QZXJpb2RpYyBJUlEgcmF0ZSBpcyBmaXhlZFxuIik7CisJCQkJZ290byBkb25lOworCQkJfQorCQkgICAgICAgIHBlcnJvcigiaW9jdGwiKTsKKwkJICAgICAgICBleGl0KGVycm5vKTsKKwkJfQorCisJCWZwcmludGYoc3RkZXJyLCAiXG4lbGRIejpcdCIsIHRtcCk7CisJCWZmbHVzaChzdGRlcnIpOworCisJCS8qIEVuYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHRzICovCisJCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfUElFX09OLCAwKTsKKwkJaWYgKHJldHZhbCA9PSAtMSkgeworCQkgICAgICAgIHBlcnJvcigiaW9jdGwiKTsKKwkJICAgICAgICBleGl0KGVycm5vKTsKKwkJfQorCisJCWZvciAoaT0xOyBpPDIxOyBpKyspIHsKKwkJICAgICAgICAvKiBUaGlzIGJsb2NrcyAqLworCQkgICAgICAgIHJldHZhbCA9IHJlYWQoZmQsICZkYXRhLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQkgICAgICAgIGlmIChyZXR2YWwgPT0gLTEpIHsKKwkJCQkgICAgICAgcGVycm9yKCJyZWFkIik7CisJCQkJICAgICAgIGV4aXQoZXJybm8pOworCQkgICAgICAgIH0KKwkJICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlZCIsaSk7CisJCSAgICAgICAgZmZsdXNoKHN0ZGVycik7CisJCSAgICAgICAgaXJxY291bnQrKzsKKwkJfQorCisJCS8qIERpc2FibGUgcGVyaW9kaWMgaW50ZXJydXB0cyAqLworCQlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX1BJRV9PRkYsIDApOworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCSAgICAgICAgcGVycm9yKCJpb2N0bCIpOworCQkgICAgICAgIGV4aXQoZXJybm8pOworCQl9CisJfQorCitkb25lOgorCWZwcmludGYoc3RkZXJyLCAiXG5cblx0XHRcdCAqKiogVGVzdCBjb21wbGV0ZSAqKipcbiIpOworCisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7CiB9Ci0KLWZwcmludGYoc3RkZXJyLCAiXG5cblx0XHRcdCAqKiogVGVzdCBjb21wbGV0ZSAqKipcbiIpOwotZnByaW50ZihzdGRlcnIsICJcblR5cGluZyBcImNhdCAvcHJvYy9pbnRlcnJ1cHRzXCIgd2lsbCBzaG93ICVkIG1vcmUgZXZlbnRzIG9uIElSUSA4LlxuXG4iLAotCQkJCQkJCQkgaXJxY291bnQpOwotCi1jbG9zZShmZCk7Ci1yZXR1cm4gMDsKLQotfSAvKiBlbmQgbWFpbiAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL0NvbW1vbklPIGIvRG9jdW1lbnRhdGlvbi9zMzkwL0NvbW1vbklPCmluZGV4IDU5ZDExNjYuLjIyZjgyZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9Db21tb25JTworKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvQ29tbW9uSU8KQEAgLTY2LDcgKzY2LDcgQEAKIAogICBXaGVuIGEgZGV2aWNlIGlzIHVuLWlnbm9yZWQsIGRldmljZSByZWNvZ25pdGlvbiBhbmQgc2Vuc2luZyBpcyBwZXJmb3JtZWQgYW5kIAogICB0aGUgZGV2aWNlIGRyaXZlciB3aWxsIGJlIG5vdGlmaWVkIGlmIHBvc3NpYmxlLCBzbyB0aGUgZGV2aWNlIHdpbGwgYmVjb21lCi0gIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4gTm90ZSB0aGF0IHVuLWlnbm9yaW5nIGlzIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS4KIAogICBZb3UgY2FuIGFsc28gYWRkIHJhbmdlcyBvZiBkZXZpY2VzIHRvIGJlIGlnbm9yZWQgYnkgcGlwaW5nIHRvIAogICAvcHJvYy9jaW9faWdub3JlOyAiYWRkIDxkZXZpY2UgcmFuZ2U+LCA8ZGV2aWNlIHJhbmdlPiwgLi4uIiB3aWxsIGlnbm9yZSB0aGUKQEAgLTc0LDcgKzc0LDcgQEAKIAogICBOb3RlOiBXaGlsZSBhbHJlYWR5IGtub3duIGRldmljZXMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGRldmljZXMgdG8gYmUKICAgICAgICAgaWdub3JlZCwgdGhlcmUgd2lsbCBiZSBubyBlZmZlY3Qgb24gdGhlbi4gSG93ZXZlciwgaWYgc3VjaCBhIGRldmljZQotICAgICAgICBkaXNhcHBlYXJzIGFuZCB0aGVuIHJlYXBwZWFyZXMsIGl0IHdpbGwgdGhlbiBiZSBpZ25vcmVkLgorCWRpc2FwcGVhcnMgYW5kIHRoZW4gcmVhcHBlYXJzLCBpdCB3aWxsIHRoZW4gYmUgaWdub3JlZC4KIAogICBGb3IgZXhhbXBsZSwKIAkiZWNobyBhZGQgMC4wLmEwMDAtMC4wLmFjY2MsIDAuMC5hZjAwLTAuMC5hZmZmID4gL3Byb2MvY2lvX2lnbm9yZSIKQEAgLTgyLDcgKzgyLDcgQEAKICAgZGV2aWNlcy4KIAogICBUaGUgZGV2aWNlcyBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBieSBidXMgaWQgKDAuMC5hYmNkKSBvciwgZm9yIDIuNCBiYWNrd2FyZAotICBjb21wYXRpYmlsdHksIGJ5IHRoZSBkZXZpY2UgbnVtYmVyIGluIGhleGFkZWNpbWFsICgweGFiY2Qgb3IgYWJjZCkuCisgIGNvbXBhdGliaWxpdHksIGJ5IHRoZSBkZXZpY2UgbnVtYmVyIGluIGhleGFkZWNpbWFsICgweGFiY2Qgb3IgYWJjZCkuCiAKIAogKiAvcHJvYy9zMzkwZGJmL2Npb18qLyAoUy8zOTAgZGVidWcgZmVhdHVyZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKaW5kZXggNGRkMjVlZS4uM2Y5ZGRiYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL0RlYnVnZ2luZzM5MC50eHQKQEAgLTcsNyArNyw3IEBACiAKIE92ZXJ2aWV3IG9mIERvY3VtZW50OgogPT09PT09PT09PT09PT09PT09PT09Ci1UaGlzIGRvY3VtZW50IGlzIGludGVuZGVkIHRvIGdpdmUgYW4gZ29vZCBvdmVydmlldyBvZiBob3cgdG8gZGVidWcgCitUaGlzIGRvY3VtZW50IGlzIGludGVuZGVkIHRvIGdpdmUgYSBnb29kIG92ZXJ2aWV3IG9mIGhvdyB0byBkZWJ1ZwogTGludXggZm9yIHMvMzkwICYgei9BcmNoaXRlY3R1cmUuIEl0IGlzbid0IGludGVuZGVkIGFzIGEgY29tcGxldGUgcmVmZXJlbmNlICYgbm90IGEKIHR1dG9yaWFsIG9uIHRoZSBmdW5kYW1lbnRhbHMgb2YgQyAmIGFzc2VtYmx5LiBJdCBkb2Vzbid0IGdvIGludG8KIDM5MCBJTyBpbiBhbnkgZGV0YWlsLiBJdCBpcyBpbnRlbmRlZCB0byBjb21wbGVtZW50IHRoZSBkb2N1bWVudHMgaW4gdGhlCkBAIC0zMDAsNyArMzAwLDcgQEAKIGJ1dCBvbmx5IG1lc3Mgd2l0aCAyIHNlZ21lbnQgaW5kaWNlcyBlYWNoIHRpbWUgd2UgbWVzcyB3aXRoCiBhIFBNRC4KIAotMykgQXMgei9BcmNoaXRlY3R1cmUgc3VwcG9ydHMgdXB0byBhIG1hc3NpdmUgNS1sZXZlbCBwYWdlIHRhYmxlIGxvb2t1cCB3ZSAKKzMpIEFzIHovQXJjaGl0ZWN0dXJlIHN1cHBvcnRzIHVwIHRvIGEgbWFzc2l2ZSA1LWxldmVsIHBhZ2UgdGFibGUgbG9va3VwIHdlCiBjYW4gb25seSB1c2UgMyBjdXJyZW50bHkgb24gTGludXggKCBhcyB0aGlzIGlzIGFsbCB0aGUgZ2VuZXJpYyBrZXJuZWwKIGN1cnJlbnRseSBzdXBwb3J0cyApIGhvd2V2ZXIgdGhpcyBtYXkgY2hhbmdlIGluIGZ1dHVyZQogdGhpcyBhbGxvd3MgdXMgdG8gYWNjZXNzICggYWNjb3JkaW5nIHRvIG15IHN1bXMgKQpAQCAtNTAyLDcgKzUwMiw3IEBACiAtLS0tLS0KIDEpIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSB1c2VkCiBieSB0aGUgY2FsbGVlIGFyZSBzYXZlZCwgZS5nLiB0aGUgY29tcGlsZXIgaXMgcGVyZmVjdGx5Ci1jYXBpYmxlIG9mIHVzaW5nIHIxMSBmb3IgcHVycG9zZXMgb3RoZXIgdGhhbiBhIGZyYW1lIGEKK2NhcGFibGUgb2YgdXNpbmcgcjExIGZvciBwdXJwb3NlcyBvdGhlciB0aGFuIGEgZnJhbWUgYQogZnJhbWUgcG9pbnRlciBpZiBhIGZyYW1lIHBvaW50ZXIgaXMgbm90IG5lZWRlZC4KIDIpIEluIGZ1bmN0aW9ucyB3aXRoIHZhcmlhYmxlIGFyZ3VtZW50cyBlLmcuIHByaW50ZiB0aGUgY2FsbGluZyBwcm9jZWR1cmUgCiBpcyBpZGVudGljYWwgdG8gb25lIHdpdGhvdXQgdmFyaWFibGUgYXJndW1lbnRzICYgdGhlIHNhbWUgbnVtYmVyIG9mIApAQCAtODQ2LDcgKzg0Niw3IEBACiBpbnN0ZWFkIGlmIHRoZSBjb2RlIGlzbid0IGNvbXBpbGVkIC1nLCBhcyBpdCBpcyBtdWNoIGZhc3RlcjoKIG9iamR1bXAgLS1kaXNhc3NlbWJsZS1hbGwgLS1zeW1zIHZtbGludXggPiB2bWxpbnV4LmxzdCAgCiAKLUFzIGhhcmQgZHJpdmUgc3BhY2UgaXMgdmFsdWJsZSBtb3N0IG9mIHVzIHVzZSB0aGUgZm9sbG93aW5nIGFwcHJvYWNoLgorQXMgaGFyZCBkcml2ZSBzcGFjZSBpcyB2YWx1YWJsZSBtb3N0IG9mIHVzIHVzZSB0aGUgZm9sbG93aW5nIGFwcHJvYWNoLgogMSkgTG9vayBhdCB0aGUgZW1pdHRlZCBwc3cgb24gdGhlIGNvbnNvbGUgdG8gZmluZCB0aGUgY3Jhc2ggYWRkcmVzcyBpbiB0aGUga2VybmVsLgogMikgTG9vayBhdCB0aGUgZmlsZSBTeXN0ZW0ubWFwICggaW4gdGhlIGxpbnV4IGRpcmVjdG9yeSApIHByb2R1Y2VkIHdoZW4gYnVpbGRpbmcgCiB0aGUga2VybmVsIHRvIGZpbmQgdGhlIGNsb3Nlc3QgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgUFNXIHRvIGZpbmQgdGhlCkBAIC05MDIsNyArOTAyLDcgQEAKIHRvIGEgZmlsZSAmIG9uIHRoZSBzY3JlZW4uCiAKIFEuIFdoYXQgdXNlIGlzIGl0ID8KLUEuIFlvdSBjYW4gdXNlZCBpdCB0byBmaW5kIG91dCB3aGF0IGZpbGVzIGEgcGFydGljdWxhciBwcm9ncmFtIG9wZW5zLgorQS4gWW91IGNhbiB1c2UgaXQgdG8gZmluZCBvdXQgd2hhdCBmaWxlcyBhIHBhcnRpY3VsYXIgcHJvZ3JhbSBvcGVucy4KIAogCiAKQEAgLTkxMSw3ICs5MTEsNyBAQAogSWYgeW91IHdhbnRlZCB0byBrbm93IGRvZXMgcGluZyB3b3JrIGJ1dCBkaWRuJ3QgaGF2ZSB0aGUgc291cmNlIAogc3RyYWNlIHBpbmcgLWMgMSAxMjcuMC4wLjEgIAogJiB0aGVuIGxvb2sgYXQgdGhlIG1hbiBwYWdlcyBmb3IgZWFjaCBvZiB0aGUgc3lzY2FsbHMgYmVsb3csCi0oIEluIGZhY3QgdGhpcyBpcyBzb21ldGltZXMgZWFzaWVyIHRoYW4gbG9va2luZyBhdCBzb21lIHNwYWdldHRpCisoIEluIGZhY3QgdGhpcyBpcyBzb21ldGltZXMgZWFzaWVyIHRoYW4gbG9va2luZyBhdCBzb21lIHNwYWdoZXR0aQogc291cmNlIHdoaWNoIGNvbmRpdGlvbmFsbHkgY29tcGlsZXMgZm9yIHNldmVyYWwgYXJjaGl0ZWN0dXJlcyApLgogTm90IGV2ZXJ5dGhpbmcgdGhhdCBpdCB0aHJvd3Mgb3V0IG5lZWRzIHRvIG1ha2Ugc2Vuc2UgaW1tZWRpYXRlbHkuCiAKQEAgLTEwMzcsNyArMTAzNyw3IEBACiAKIFBlcmZvcm1hbmNlIERlYnVnZ2luZwogPT09PT09PT09PT09PT09PT09PT09Ci1nY2MgaXMgY2FwaWJsZSBvZiBjb21waWxpbmcgaW4gcHJvZmlsaW5nIGNvZGUganVzdCBhZGQgdGhlIC1wIG9wdGlvbgorZ2NjIGlzIGNhcGFibGUgb2YgY29tcGlsaW5nIGluIHByb2ZpbGluZyBjb2RlIGp1c3QgYWRkIHRoZSAtcCBvcHRpb24KIHRvIHRoZSBDRkxBR1MsIHRoaXMgb2J2aW91c2x5IGFmZmVjdHMgcHJvZ3JhbSBzaXplICYgcGVyZm9ybWFuY2UuCiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRoZSBncHJvZiBnbnUgcHJvZmlsaW5nIHRvb2wgb3IgdGhlCiBnY292IHRoZSBnbnUgY29kZSBjb3ZlcmFnZSB0b29sICggY29kZSBjb3ZlcmFnZSBpcyBhIG1lYW5zIG9mIHRlc3RpbmcKQEAgLTE0MTksNyArMTQxOSw3IEBACiBUbyBpc3N1ZSBhIGNvbW1hbmQgdG8gYSBwYXJ0aWN1bGFyIGNwdSB0cnkgY3B1IDxjcHUgbnVtYmVyPiBlLmcuCiBDUFUgMDEgVFIgSSBSIDIwMDAuMzAwMAogSWYgeW91IGFyZSBydW5uaW5nIG9uIGEgZ3Vlc3Qgd2l0aCBzZXZlcmFsIGNwdXMgJiB5b3UgaGF2ZSBhIElPIHJlbGF0ZWQgcHJvYmxlbQotJiBjYW5ub3QgZm9sbG93IHRoZSBmbG93IG9mIGNvZGUgYnV0IHlvdSBrbm93IGl0IGlzbnQgc21wIHJlbGF0ZWQuCismIGNhbm5vdCBmb2xsb3cgdGhlIGZsb3cgb2YgY29kZSBidXQgeW91IGtub3cgaXQgaXNuJ3Qgc21wIHJlbGF0ZWQuCiBmcm9tIHRoZSBiYXNoIHByb21wdCBpc3N1ZQogc2h1dGRvd24gLWggbm93IG9yIGhhbHQuCiBkbyBhIFEgQ1BVUyB0byBmaW5kIG91dCBob3cgbWFueSBjcHVzIHlvdSBoYXZlCkBAIC0xNjAyLDcgKzE2MDIsNyBAQAogb3VyIDNyZCByZXR1cm4gYWRkcmVzcyBpcyA4MDAxMDg1QQogCiBhcyB0aGUgMDRCNTIwMDIgbG9va3Mgc3VzcGljaW91c2x5IGxpa2UgcnViYmlzaCBpdCBpcyBmYWlyIHRvIGFzc3VtZSB0aGF0IHRoZSBrZXJuZWwgZW50cnkgcm91dGluZXMKLWZvciB0aGUgc2FrZSBvZiBvcHRpbWlzYXRpb24gZG9udCBzZXQgdXAgYSBiYWNrY2hhaW4uCitmb3IgdGhlIHNha2Ugb2Ygb3B0aW1pc2F0aW9uIGRvbid0IHNldCB1cCBhIGJhY2tjaGFpbi4KIAogbm93IGxvb2sgYXQgU3lzdGVtLm1hcCB0byBzZWUgaWYgdGhlIGFkZHJlc3NlcyBtYWtlIGFueSBzZW5zZS4KIApAQCAtMTYzOCwxMSArMTYzOCwxMSBAQAogCiBVbmxpa2Ugb3RoZXIgYnVzIGFyY2hpdGVjdHVyZXMgbW9kZXJuIDM5MCBzeXN0ZW1zIGRvIHRoZWlyIElPIHVzaW5nIG1vc3RseQogZmlicmUgb3B0aWNzICYgZGV2aWNlcyBzdWNoIGFzIHRhcGVzICYgZGlza3MgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIHNldmVyYWwgbWFpbmZyYW1lcywKLWFsc28gUzM5MCBjYW4gc3VwcG9ydCB1cHRvIDY1NTM2IGRldmljZXMgd2hpbGUgYSBoaWdoIGVuZCBQQyBiYXNlZCBzeXN0ZW0gbWlnaHQgYmUgY2hva2luZyAKK2Fsc28gUzM5MCBjYW4gc3VwcG9ydCB1cCB0byA2NTUzNiBkZXZpY2VzIHdoaWxlIGEgaGlnaCBlbmQgUEMgYmFzZWQgc3lzdGVtIG1pZ2h0IGJlIGNob2tpbmcKIHdpdGggYXJvdW5kIDY0LiBIZXJlIGlzIHNvbWUgb2YgdGhlIGNvbW1vbiBJTyB0ZXJtaW5vbG9neQogCiBTdWJjaGFubmVsOgotVGhpcyBpcyB0aGUgbG9naWNhbCBudW1iZXIgbW9zdCBJTyBjb21tYW5kcyB1c2UgdG8gdGFsayB0byBhbiBJTyBkZXZpY2UgdGhlcmUgY2FuIGJlIHVwdG8KK1RoaXMgaXMgdGhlIGxvZ2ljYWwgbnVtYmVyIG1vc3QgSU8gY29tbWFuZHMgdXNlIHRvIHRhbGsgdG8gYW4gSU8gZGV2aWNlIHRoZXJlIGNhbiBiZSB1cCB0bwogMHgxMDAwMCAoNjU1MzYpIG9mIHRoZXNlIGluIGEgY29uZmlndXJhdGlvbiB0eXBpY2FsbHkgdGhlcmUgaXMgYSBmZXcgaHVuZHJlZC4gVW5kZXIgVk0KIGZvciBzaW1wbGljaXR5IHRoZXkgYXJlIGFsbG9jYXRlZCBjb250aWd1b3VzbHksIGhvd2V2ZXIgb24gdGhlIG5hdGl2ZSBoYXJkd2FyZSB0aGV5IGFyZSBub3QKIHRoZXkgdHlwaWNhbGx5IHN0YXkgY29uc2lzdGVudCBiZXR3ZWVuIGJvb3RzIHByb3ZpZGVkIG5vIG5ldyBoYXJkd2FyZSBpcyBpbnNlcnRlZCBvciByZW1vdmVkLgpAQCAtMTY1MSw3ICsxNjUxLDcgQEAKIFRFU1QgU1VCQ0hBTk5FTCApIHdlIHVzZSB0aGlzIGFzIHRoZSBJRCBvZiB0aGUgZGV2aWNlIHdlIHdpc2ggdG8gdGFsayB0bywgdGhlIG1vc3QKIGltcG9ydGFudCBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgYXJlIFNUQVJUIFNVQkNIQU5ORUwgKCB0byBzdGFydCBJTyApLCBURVNUIFNVQkNIQU5ORUwgKCB0byBjaGVjawogd2hldGhlciB0aGUgSU8gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSApLCAmIEhBTFQgU1VCQ0hBTk5FTCAoIHRvIGtpbGwgSU8gKSwgYSBzdWJjaGFubmVsCi1jYW4gaGF2ZSB1cCB0byA4IGNoYW5uZWwgcGF0aHMgdG8gYSBkZXZpY2UgdGhpcyBvZmZlcnMgcmVkdW5hbmN5IGlmIG9uZSBpcyBub3QgYXZhaWxhYmxlLgorY2FuIGhhdmUgdXAgdG8gOCBjaGFubmVsIHBhdGhzIHRvIGEgZGV2aWNlIHRoaXMgb2ZmZXJzIHJlZHVuZGFuY3kgaWYgb25lIGlzIG5vdCBhdmFpbGFibGUuCiAKIAogRGV2aWNlIE51bWJlcjoKQEAgLTE2NTksNyArMTY1OSw3IEBACiBhbHNvIHRoZXkgYXJlIG1hZGUgdXAgb2YgYSBDSFBJRCAoIENoYW5uZWwgUGF0aCBJRCwgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgOCBiaXRzICkgCiAmIGFub3RoZXIgbHNiIDggYml0cy4gVGhlc2UgcmVtYWluIHN0YXRpYyBldmVuIGlmIG1vcmUgZGV2aWNlcyBhcmUgaW5zZXJ0ZWQgb3IgcmVtb3ZlZAogZnJvbSB0aGUgaGFyZHdhcmUsIHRoZXJlIGlzIGEgMSB0byAxIG1hcHBpbmcgYmV0d2VlbiBTdWJjaGFubmVscyAmIERldmljZSBOdW1iZXJzIHByb3ZpZGVkCi1kZXZpY2VzIGFyZW50IGluc2VydGVkIG9yIHJlbW92ZWQuCitkZXZpY2VzIGFyZW4ndCBpbnNlcnRlZCBvciByZW1vdmVkLgogCiBDaGFubmVsIENvbnRyb2wgV29yZHM6CiBDQ1dTIGFyZSBsaW5rZWQgbGlzdHMgb2YgaW5zdHJ1Y3Rpb25zIGluaXRpYWxseSBwb2ludGVkIHRvIGJ5IGFuIG9wZXJhdGlvbiByZXF1ZXN0IGJsb2NrIChPUkIpLApAQCAtMTY3NCw3ICsxNjc0LDcgQEAKIGZyb20gd2hpY2ggeW91IHJlY2VpdmUgYW4gSW50ZXJydXB0aW9uIHJlc3BvbnNlIGJsb2NrIChJUkIpLiBJZiB5b3UgZ2V0IGNoYW5uZWwgJiBkZXZpY2UgZW5kIAogc3RhdHVzIGluIHRoZSBJUkIgd2l0aG91dCBjaGFubmVsIGNoZWNrcyBldGMuIHlvdXIgSU8gcHJvYmFibHkgd2VudCBva2F5LiBJZiB5b3UgZGlkbid0IHlvdQogcHJvYmFibHkgbmVlZCBhIGRvY3RvciB0byBleGFtaW5lIHRoZSBJUkIgJiBleHRlbmRlZCBzdGF0dXMgd29yZCBldGMuCi1JZiBhbiBlcnJvciBvY2N1cnMsIG1vcmUgc29waGlzdG9jYXRlZCBjb250cm9sIHVuaXRzIGhhdmUgYSBmYWNpdGl0eSBrbm93biBhcworSWYgYW4gZXJyb3Igb2NjdXJzLCBtb3JlIHNvcGhpc3RpY2F0ZWQgY29udHJvbCB1bml0cyBoYXZlIGEgZmFjaWxpdHkga25vd24gYXMKIGNvbmN1cnJlbnQgc2Vuc2UgdGhpcyBtZWFucyB0aGF0IGlmIGFuIGVycm9yIG9jY3VycyBFeHRlbmRlZCBzZW5zZSBpbmZvcm1hdGlvbiB3aWxsCiBiZSBwcmVzZW50ZWQgaW4gdGhlIEV4dGVuZGVkIHN0YXR1cyB3b3JkIGluIHRoZSBJUkIgaWYgbm90IHlvdSBoYXZlIHRvIGlzc3VlIGEKIHN1YnNlcXVlbnQgU0VOU0UgQ0NXIGNvbW1hbmQgYWZ0ZXIgdGhlIHRlc3Qgc3ViY2hhbm5lbC4gCkBAIC0xNzQ5LDcgKzE3NDksNyBAQAogVGhpcyBieXRlIHdpZGUgUGFyYWxsZWwgY2hhbm5lbCBwYXRoL2J1cyBoYXMgcGFyaXR5ICYgZGF0YSBvbiB0aGUgIkJ1cyIgY2FibGUgCiAmIGNvbnRyb2wgbGluZXMgb24gdGhlICJUYWciIGNhYmxlLiBUaGVzZSBjYW4gb3BlcmF0ZSBpbiBieXRlIG11bHRpcGxleCBtb2RlIGZvcgogc2hhcmluZyBiZXR3ZWVuIHNldmVyYWwgc2xvdyBkZXZpY2VzIG9yIGJ1cnN0IG1vZGUgJiBtb25vcG9saXplIHRoZSBjaGFubmVsIGZvciB0aGUKLXdob2xlIGJ1cnN0LiBVcHRvIDI1NiBkZXZpY2VzIGNhbiBiZSBhZGRyZXNzZWQgIG9uIG9uZSBvZiB0aGVzZSBjYWJsZXMuIFRoZXNlIGNhYmxlcyBhcmUKK3dob2xlIGJ1cnN0LiBVcCB0byAyNTYgZGV2aWNlcyBjYW4gYmUgYWRkcmVzc2VkICBvbiBvbmUgb2YgdGhlc2UgY2FibGVzLiBUaGVzZSBjYWJsZXMgYXJlCiBhYm91dCBvbmUgaW5jaCBpbiBkaWFtZXRlci4gVGhlIG1heGltdW0gdW5leHRlbmRlZCBsZW5ndGggc3VwcG9ydGVkIGJ5IHRoZXNlIGNhYmxlcyBpcwogMTI1IE1ldGVycyBidXQgdGhpcyBjYW4gYmUgZXh0ZW5kZWQgdXAgdG8gMmttIHdpdGggYSBmaWJyZSBvcHRpYyBjaGFubmVsIGV4dGVuZGVkIAogc3VjaCBhcyBhIDMwNDQuIFRoZSBtYXhpbXVtIGJ1cnN0IHNwZWVkIHN1cHBvcnRlZCBpcyA0LjUgbWVnYWJ5dGVzIHBlciBzZWNvbmQgaG93ZXZlcgpAQCAtMTc1OSw3ICsxNzU5LDcgQEAKIAogRVNDT04gaWYgZmlicmUgb3B0aWMgaXQgaXMgYWxzbyBjYWxsZWQgRklDT04gCiBXYXMgaW50cm9kdWNlZCBieSBJQk0gaW4gMTk5MC4gSGFzIDIgZmlicmUgb3B0aWMgY2FibGVzICYgdXNlcyBlaXRoZXIgbGVkcyBvciBsYXNlcnMKLWZvciBjb21tdW5pY2F0aW9uIGF0IGEgc2lnbmFsaW5nIHJhdGUgb2YgdXB0byAyMDAgbWVnYWJpdHMvc2VjLiBBcyAxMGJpdHMgYXJlIHRyYW5zZmVycmVkCitmb3IgY29tbXVuaWNhdGlvbiBhdCBhIHNpZ25hbGluZyByYXRlIG9mIHVwIHRvIDIwMCBtZWdhYml0cy9zZWMuIEFzIDEwYml0cyBhcmUgdHJhbnNmZXJyZWQKIGZvciBldmVyeSA4IGJpdHMgaW5mbyB0aGlzIGRyb3BzIHRvIDE2MCBtZWdhYml0cy9zZWMgJiB0byAxOC42IE1lZ2FieXRlcy9zZWMgb25jZQogY29udHJvbCBpbmZvICYgQ1JDIGFyZSBhZGRlZC4gRVNDT04gb25seSBvcGVyYXRlcyBpbiBidXJzdCBtb2RlLgogIApAQCAtMTc2Nyw3ICsxNzY3LDcgQEAKIGtub3duIGFzIFhERiAoIGV4dGVuZGVkIGRpc3RhbmNlIGZhY2lsaXR5ICkuIFRoaXMgY2FuIGJlIGZ1cnRoZXIgZXh0ZW5kZWQgYnkgdXNpbmcgYW4KIEVTQ09OIGRpcmVjdG9yIHdoaWNoIHRyaXBsZXMgdGhlIGFib3ZlIG1lbnRpb25lZCByYW5nZXMuIFVubGlrZSBCdXMgJiBUYWcgYXMgRVNDT04gaXMKIHNlcmlhbCBpdCB1c2VzIGEgcGFja2V0IHN3aXRjaGluZyBhcmNoaXRlY3R1cmUgdGhlIHN0YW5kYXJkIEJ1cyAmIFRhZyBjb250cm9sIHByb3RvY29sCi1pcyBob3dldmVyIHByZXNlbnQgd2l0aGluIHRoZSBwYWNrZXRzLiBVcHRvIDI1NiBkZXZpY2VzIGNhbiBiZSBhdHRhY2hlZCB0byBlYWNoIGNvbnRyb2wgCitpcyBob3dldmVyIHByZXNlbnQgd2l0aGluIHRoZSBwYWNrZXRzLiBVcCB0byAyNTYgZGV2aWNlcyBjYW4gYmUgYXR0YWNoZWQgdG8gZWFjaCBjb250cm9sCiB1bml0IHRoYXQgdXNlcyBvbmUgb2YgdGhlc2UgaW50ZXJmYWNlcy4KIAogQ29tbW9uIDM5MCBEZXZpY2VzIGluY2x1ZGU6CkBAIC0yMDUwLDcgKzIwNTAsNyBAQAogCiBkaXJlY3Rvcnk6CiBBZGRzIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkIGZvciBzb3VyY2UgaWYgZ2RiIGNhbm5vdCBmaW5kIHRoZSBzb3VyY2UuCi0obm90ZSBpdCBpcyBhIGJpdCBzZW5zaXRpdGl2ZSBhYm91dCBzbGFzaGVzKSAKKyhub3RlIGl0IGlzIGEgYml0IHNlbnNpdGl2ZSBhYm91dCBzbGFzaGVzKQogZS5nLiBUbyBhZGQgdGhlIHJvb3Qgb2YgdGhlIGZpbGVzeXN0ZW0gdG8gdGhlIHNlYXJjaHBhdGggZG8KIGRpcmVjdG9yeSAvLwogCkBAIC0yMTUyLDcgKzIxNTIsNyBAQAogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KIFRoaXMgaXMgdmVyeSB1c2VmdWwgaW4gdGhhdCBhIGN1c3RvbWVyIGNhbiBtYWlsIGEgY29yZSBkdW1wIHRvIGEgdGVjaG5pY2FsIHN1cHBvcnQgZGVwYXJ0bWVudAogJiB0aGUgdGVjaG5pY2FsIHN1cHBvcnQgZGVwYXJ0bWVudCBjYW4gcmVjb25zdHJ1Y3Qgd2hhdCBoYXBwZW5lZC4KLVByb3ZpZGVkIHRoZSBoYXZlIGFuIGlkZW50aWNhbCBjb3B5IG9mIHRoaXMgcHJvZ3JhbSB3aXRoIGRlYnVnZ2luZyBzeW1ib2xzIGNvbXBpbGVkIGluICYgCitQcm92aWRlZCB0aGV5IGhhdmUgYW4gaWRlbnRpY2FsIGNvcHkgb2YgdGhpcyBwcm9ncmFtIHdpdGggZGVidWdnaW5nIHN5bWJvbHMgY29tcGlsZWQgaW4gJgogdGhlIHNvdXJjZSBiYXNlIG9mIHRoaXMgYnVpbGQgaXMgYXZhaWxhYmxlLgogSW4gc2hvcnQgaXQgaXMgZmFyIG1vcmUgdXNlZnVsIHRoYW4gc29tZXRoaW5nIGxpa2UgYSBjcmFzaCBsb2cgY291bGQgZXZlciBob3BlIHRvIGJlLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvY2RzLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9jZHMudHh0CmluZGV4IGQ4MGU1NzMuLjA1YTJiNGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9jZHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vczM5MC9jZHMudHh0CkBAIC05OCw3ICs5OCw3IEBACiBMaW51eC8zOTAgY29tbW9uIGRldmljZSBzdXBwb3J0IChDRFMpIHByb3ZpZGVzIHRvIGFsbG93IGZvciBkZXZpY2Ugc3BlY2lmaWMKIGRyaXZlciBpbXBsZW1lbnRhdGlvbnMgb24gdGhlIElCTSBFU0EvMzkwIGhhcmR3YXJlIHBsYXRmb3JtLiBUaG9zZSBpbnRlcmZhY2VzCiBpbnRlbmQgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBieSBldmVyeSBkZXZpY2UgZHJpdmVyCi1pbXBsZW1lbnRhaW9uIHRvIGFsbG93IHRvIGRyaXZlIGEgc3BlY2lmaWMgaGFyZHdhcmUgZGV2aWNlIG9uIHRoZSBFU0EvMzkwCitpbXBsZW1lbnRhdGlvbiB0byBhbGxvdyB0byBkcml2ZSBhIHNwZWNpZmljIGhhcmR3YXJlIGRldmljZSBvbiB0aGUgRVNBLzM5MAogcGxhdGZvcm0uIFNvbWUgb2YgdGhlIGludGVyZmFjZSByb3V0aW5lcyBhcmUgc3BlY2lmaWMgdG8gTGludXgvMzkwIGFuZCBzb21lCiBvZiB0aGVtIGNhbiBiZSBmb3VuZCBvbiBvdGhlciBMaW51eCBwbGF0Zm9ybXMgaW1wbGVtZW50YXRpb25zIHRvby4KIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb24gcHJvdG90eXBlcywgZGF0YSBkZWNsYXJhdGlvbnMsIGFuZCBtYWNybyBkZWZpbml0aW9ucwpAQCAtMTE0LDcgKzExNCw3IEBACiBwcm92aWRlcyBhIHVuaWZpZWQgdmlldyBvZiB0aGUgZGV2aWNlcyBwaHlzaWNhbGx5IGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW1zLgogVGhvdWdoIHRoZSBFU0EvMzkwIGhhcmR3YXJlIHBsYXRmb3JtIGtub3dzIGFib3V0IGEgaHVnZSB2YXJpZXR5IG9mIGRpZmZlcmVudAogcGVyaXBoZXJhbCBhdHRhY2htZW50cyBsaWtlIGRpc2sgZGV2aWNlcyAoYWthLiBEQVNEcyksIHRhcGVzLCBjb21tdW5pY2F0aW9uCi1jb250cm9sbGVycywgZXRjLiB0aGV5IGNhbiBhbGwgYnkgYWNjZXNzZWQgYnkgYSB3ZWxsIGRlZmluZWQgYWNjZXNzIG1ldGhvZCBhbmQKK2NvbnRyb2xsZXJzLCBldGMuIHRoZXkgY2FuIGFsbCBiZSBhY2Nlc3NlZCBieSBhIHdlbGwgZGVmaW5lZCBhY2Nlc3MgbWV0aG9kIGFuZAogdGhleSBhcmUgcHJlc2VudGluZyBJL08gY29tcGxldGlvbiBhIHVuaWZpZWQgd2F5IDogSS9PIGludGVycnVwdGlvbnMuIEV2ZXJ5CiBzaW5nbGUgZGV2aWNlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgdG8gdGhlIHN5c3RlbSBieSBhIHNvIGNhbGxlZCBzdWJjaGFubmVsLAogd2hlcmUgdGhlIEVTQS8zOTAgYXJjaGl0ZWN0dXJlIGFsbG93cyBmb3IgNjRrIGRldmljZXMgYmUgYXR0YWNoZWQuCkBAIC0xNzQsMTQgKzE3NCwxMCBAQAogCiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgY2hhcmFjdGVyaXN0aWNzIGZvciB0aGUgZGV2aWNlIHNwZWNpZmllZC4KIAotVGhlIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGNhbGxlZCB3aXRoIGFuIGlycSBoYW5kbGVyIGluIHBsYWNlOyB0aGF0IGlzLAorVGhlIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBkZXZpY2UgYWxyZWFkeSBlbmFibGVkOyB0aGF0IGlzLAogYXQgZWFybGllc3QgZHVyaW5nIHNldF9vbmxpbmUoKSBwcm9jZXNzaW5nLgogCi1XaGlsZSB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWQgc3luY2hyb25vdXNseSwgdGhlIGRldmljZSBpbnRlcnJ1cHQKLWhhbmRsZXIgaXMgY2FsbGVkIGZvciBmaW5hbCBlbmRpbmcgc3RhdHVzLiBJbiBjYXNlIG9mIGVycm9yIHNpdHVhdGlvbnMgdGhlCi1pbnRlcnJ1cHQgaGFuZGxlciBtYXkgcmVjb3ZlciBhcHByb3ByaWF0ZWx5LiBUaGUgZGV2aWNlIGlycSBoYW5kbGVyIGNhbgotcmVjb2duaXplIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdHMgYnkgdGhlIGludGVycnVwdGlvbiBwYXJhbWV0ZXIgYmUKLTB4MDA1MjQ0NDMuIFRoZSBjY3dfZGV2aWNlIG11c3Qgbm90IGJlIGxvY2tlZCBwcmlvciB0byBjYWxsaW5nIHJlYWRfZGV2X2NoYXJzKCkuCitUaGUgY2N3X2RldmljZSBtdXN0IG5vdCBiZSBsb2NrZWQgcHJpb3IgdG8gY2FsbGluZyByZWFkX2Rldl9jaGFycygpLgogCiBUaGUgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBlbmFibGVkIG9yIGRpc2FibGVkLgogCkBAIC0zNDIsNyArMzM4LDcgQEAKIFRoZSBjY3dfZGV2aWNlX3N0YXJ0KCkgZnVuY3Rpb24gcmV0dXJucyA6CiAKICAgICAgIDAgLSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb3IgcmVxdWVzdCBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkCi0tRUJVU1kgIC0gVGhlIGRldmljZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyBhIHByZXZpb3VzIEkvTyByZXF1ZXN0LCBvciB0aGVyIGlzCistRUJVU1kJLSBUaGUgZGV2aWNlIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIGEgcHJldmlvdXMgSS9PIHJlcXVlc3QsIG9yIHRoZXJlIGlzCiAgICAgICAgICAgYSBzdGF0dXMgcGVuZGluZyBhdCB0aGUgZGV2aWNlLgogLUVOT0RFViAtIGNkZXYgaXMgaW52YWxpZCwgdGhlIGRldmljZSBpcyBub3Qgb3BlcmF0aW9uYWwgb3IgdGhlIGNjd19kZXZpY2UgaXMKICAgICAgICAgICBub3Qgb25saW5lLgpAQCAtMzY1LDcgKzM2MSw3IEBACiAtRUlPOiAgICAgICB0aGUgY29tbW9uIEkvTyBsYXllciB0ZXJtaW5hdGVkIHRoZSByZXF1ZXN0IGR1ZSB0byBhbiBlcnJvciBzdGF0ZQogCiBJZiB0aGUgY29uY3VycmVudCBzZW5zZSBmbGFnIGluIHRoZSBleHRlbmRlZCBzdGF0dXMgd29yZCBpbiB0aGUgaXJiIGlzIHNldCwgdGhlCi1maWVsZCBpcmItPnNjc3cuY291bnQgZGVzY3JpYmVzIHRoZSBudW1lciBvZiBkZXZpY2Ugc3BlY2lmaWMgc2Vuc2UgYnl0ZXMKK2ZpZWxkIGlyYi0+c2Nzdy5jb3VudCBkZXNjcmliZXMgdGhlIG51bWJlciBvZiBkZXZpY2Ugc3BlY2lmaWMgc2Vuc2UgYnl0ZXMKIGF2YWlsYWJsZSBpbiB0aGUgZXh0ZW5kZWQgY29udHJvbCB3b3JkIGlyYi0+c2Nzdy5lY3dbMF0uIE5vIGRldmljZSBzZW5zaW5nIGJ5CiB0aGUgZGV2aWNlIGRyaXZlciBpdHNlbGYgaXMgcmVxdWlyZWQuCiAKQEAgLTQxMCwzMCArNDA2LDExIEBACiAKIFVzYWdlIE5vdGVzIDoKIAotUHJpb3IgdG8gY2FsbCBjY3dfZGV2aWNlX3N0YXJ0KCkgdGhlIGRldmljZSBkcml2ZXIgbXVzdCBhc3N1cmUgZGlzYWJsZWQgc3RhdGUsCi1pLmUuIHRoZSBJL08gbWFzayB2YWx1ZSBpbiB0aGUgUFNXIG11c3QgYmUgZGlzYWJsZWQuIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZAotYnkgY2FsbGluZyBsb2NhbF9zYXZlX2ZsYWdzKCBmbGFncykuIFRoZSBjdXJyZW50IFBTVyBmbGFncyBhcmUgcHJlc2VydmVkIGFuZAotY2FuIGJlIHJlc3RvcmVkIGJ5IGxvY2FsX2lycV9yZXN0b3JlKCBmbGFncykgYXQgYSBsYXRlciB0aW1lLgotCi1JZiB0aGUgZGV2aWNlIGRyaXZlciB2aW9sYXRlcyB0aGlzIHJ1bGUgd2hpbGUgcnVubmluZyBpbiBhIHVuaS1wcm9jZXNzb3IKLWVudmlyb25tZW50IGFuIGludGVycnVwdCBtaWdodCBiZSBwcmVzZW50ZWQgcHJpb3IgdG8gdGhlIGNjd19kZXZpY2Vfc3RhcnQoKQotcm91dGluZSByZXR1cm5pbmcgdG8gdGhlIGRldmljZSBkcml2ZXIgbWFpbiBwYXRoLiBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCBlbmQgaW4gYQotZGVhZGxvY2sgc2l0dWF0aW9uIGFzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIHRyeSB0byBvYnRhaW4gdGhlIGlycQotbG9jayB0aGUgZGV2aWNlIGRyaXZlciBzdGlsbCBvd25zIChzZWUgYmVsb3cpICEKLQotVGhlIGRyaXZlciBtdXN0IGFzc3VyZSB0byBob2xkIHRoZSBkZXZpY2Ugc3BlY2lmaWMgbG9jay4gVGhpcyBjYW4gYmUKLWFjY29tcGxpc2hlZCBieQotCi0oaSkgIHNwaW5fbG9jayhnZXRfY2N3ZGV2X2xvY2soY2RldikpLCBvcgotKGlpKSBzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2RldiksIGZsYWdzKQotCi1PcHRpb24gKGkpIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBjYWxsaW5nIHJvdXRpbmUgaXMgcnVubmluZyBkaXNhYmxlZCBmb3IKLUkvTyBpbnRlcnJ1cHRzIChzZWUgYWJvdmUpIGFscmVhZHkuIE9wdGlvbiAoaWkpIG9idGFpbnMgdGhlIGRldmljZSBnYXRlIHVuZAotcHV0cyB0aGUgQ1BVIGludG8gSS9PIGRpc2FibGVkIHN0YXRlIGJ5IHByZXNlcnZpbmcgdGhlIGN1cnJlbnQgUFNXIGZsYWdzLgorY2N3X2RldmljZV9zdGFydCgpIG11c3QgYmUgY2FsbGVkIGRpc2FibGVkIGFuZCB3aXRoIHRoZSBjY3cgZGV2aWNlIGxvY2sgaGVsZC4KIAogVGhlIGRldmljZSBkcml2ZXIgaXMgYWxsb3dlZCB0byBpc3N1ZSB0aGUgbmV4dCBjY3dfZGV2aWNlX3N0YXJ0KCkgY2FsbCBmcm9tCiB3aXRoaW4gaXRzIGludGVycnVwdCBoYW5kbGVyIGFscmVhZHkuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBzY2hlZHVsZSBhCi1ib3R0b20taGFsZiwgdW5sZXNzIGFuIG5vbiBkZXRlcm1pbmlzdGljYWxseSBsb25nIHJ1bm5pbmcgZXJyb3IgcmVjb3ZlcnkgcHJvY2VkdXJlCitib3R0b20taGFsZiwgdW5sZXNzIGEgbm9uIGRldGVybWluaXN0aWNhbGx5IGxvbmcgcnVubmluZyBlcnJvciByZWNvdmVyeSBwcm9jZWR1cmUKIG9yIHNpbWlsYXIgbmVlZHMgdG8gYmUgc2NoZWR1bGVkLiBEdXJpbmcgSS9PIHByb2Nlc3NpbmcgdGhlIExpbnV4LzM5MCBnZW5lcmljCiBJL08gZGV2aWNlIGRyaXZlciBzdXBwb3J0IGhhcyBhbHJlYWR5IG9idGFpbmVkIHRoZSBJUlEgbG9jaywgaS5lLiB0aGUgaGFuZGxlcgogbXVzdCBub3QgdHJ5IHRvIG9idGFpbiBpdCBhZ2FpbiB3aGVuIGNhbGxpbmcgY2N3X2RldmljZV9zdGFydCgpIG9yIHdlIGVuZCBpbiBhCkBAIC00NTQsNyArNDMxLDcgQEAKIGNhc2UgYWxsIEkvTyBpbnRlcnJ1cHRpb25zIGFyZSBwcmVzZW50ZWQgdG8gdGhlIGRldmljZSBkcml2ZXIgdW50aWwgZmluYWwKIHN0YXR1cyBpcyByZWNvZ25pemVkLgogCi1JZiBhIGRldmljZSBpcyBhYmxlIHRvIHJlY292ZXIgZnJvbSBhc3luY2hyb25vc2x5IHByZXNlbnRlZCBJL08gZXJyb3JzLCBpdCBjYW4KK0lmIGEgZGV2aWNlIGlzIGFibGUgdG8gcmVjb3ZlciBmcm9tIGFzeW5jaHJvbm91c2x5IHByZXNlbnRlZCBJL08gZXJyb3JzLCBpdCBjYW4KIHBlcmZvcm0gb3ZlcmxhcHBpbmcgSS9PIHVzaW5nIHRoZSBET0lPX0VBUkxZX05PVElGSUNBVElPTiBmbGFnLiBXaGlsZSBzb21lCiBkZXZpY2VzIGFsd2F5cyByZXBvcnQgY2hhbm5lbC1lbmQgYW5kIGRldmljZS1lbmQgdG9nZXRoZXIsIHdpdGggYSBzaW5nbGUKIGludGVycnVwdCwgb3RoZXJzIHByZXNlbnQgcHJpbWFyeSBzdGF0dXMgKGNoYW5uZWwtZW5kKSB3aGVuIHRoZSBjaGFubmVsIGlzCkBAIC00ODgsNyArNDY1LDcgQEAKIAogY2RldiAtIGNjd19kZXZpY2UgdGhlIHJlc3VtZSBvcGVyYXRpb24gaXMgcmVxdWVzdGVkIGZvcgogCi1UaGUgcmVzdW1lX0lPKCkgZnVuY3Rpb24gcmV0dXJuczoKK1RoZSBjY3dfZGV2aWNlX3Jlc3VtZSgpIGZ1bmN0aW9uIHJldHVybnM6CiAKICAgICAgICAgMCAgLSBzdXNwZW5kZWQgY2hhbm5lbCBwcm9ncmFtIGlzIHJlc3VtZWQKIC1FQlVTWSAgICAgLSBzdGF0dXMgcGVuZGluZwpAQCAtNTA3LDYgKzQ4NCw4IEBACiBhIGhhbHQgc3ViY2hhbm5lbCAoSFNDSCkgSS9PIGNvbW1hbmQuIEZvciB0aG9zZSBwdXJwb3NlcyB0aGUgY2N3X2RldmljZV9oYWx0KCkKIGNvbW1hbmQgaXMgcHJvdmlkZWQuCiAKK2Njd19kZXZpY2VfaGFsdCgpIG11c3QgYmUgY2FsbGVkIGRpc2FibGVkIGFuZCB3aXRoIHRoZSBjY3cgZGV2aWNlIGxvY2sgaGVsZC4KKwogaW50IGNjd19kZXZpY2VfaGFsdChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwKICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnRwYXJtKTsKIApAQCAtNTE3LDcgKzQ5Niw3IEBACiAKIFRoZSBjY3dfZGV2aWNlX2hhbHQoKSBmdW5jdGlvbiByZXR1cm5zIDoKIAotICAgICAgMCAtIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvciByZXF1ZXN0IHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQKKyAgICAgIDAgLSByZXF1ZXN0IHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQKIC1FQlVTWSAgLSB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBidXN5LCBvciBzdGF0dXMgcGVuZGluZy4KIC1FTk9ERVYgLSBjZGV2IGludmFsaWQuCiAtRUlOVkFMIC0gVGhlIGRldmljZSBpcyBub3Qgb3BlcmF0aW9uYWwgb3IgdGhlIGNjdyBkZXZpY2UgaXMgbm90IG9ubGluZS4KQEAgLTUzMyw2ICs1MTIsMjMgQEAKIHJlYWQgdG8gYSBuZXR3b3JrIGRldmljZSAod2l0aCBvciB3aXRob3V0IFBDSSBmbGFnKSBhIGNjd19kZXZpY2VfaGFsdCgpCiBpcyByZXF1aXJlZCB0byBlbmQgdGhlIHBlbmRpbmcgb3BlcmF0aW9uLgogCitjY3dfZGV2aWNlX2NsZWFyKCkgLSBUZXJtaW5hZ2UgSS9PIFJlcXVlc3QgUHJvY2Vzc2luZworCitJbiBvcmRlciB0byB0ZXJtaW5hdGUgYWxsIEkvTyBwcm9jZXNzaW5nIGF0IHRoZSBzdWJjaGFubmVsLCB0aGUgY2xlYXIgc3ViY2hhbm5lbAorKENTQ0gpIGNvbW1hbmQgaXMgdXNlZC4gSXQgY2FuIGJlIGlzc3VlZCB2aWEgY2N3X2RldmljZV9jbGVhcigpLgorCitjY3dfZGV2aWNlX2NsZWFyKCkgbXVzdCBiZSBjYWxsZWQgZGlzYWJsZWQgYW5kIHdpdGggdGhlIGNjdyBkZXZpY2UgbG9jayBoZWxkLgorCitpbnQgY2N3X2RldmljZV9jbGVhcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgdW5zaWduZWQgbG9uZyBpbnRwYXJtKTsKKworY2RldjoJIGNjd19kZXZpY2UgdGhlIGNsZWFyIG9wZXJhdGlvbiBpcyByZXF1ZXN0ZWQgZm9yCitpbnRwYXJtOiBpbnRlcnJ1cHRpb24gcGFyYW1ldGVyIChzZWUgY2N3X2RldmljZV9oYWx0KCkpCisKK1RoZSBjY3dfZGV2aWNlX2NsZWFyKCkgZnVuY3Rpb24gcmV0dXJuczoKKworICAgICAgMCAtIHJlcXVlc3Qgc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZAorLUVOT0RFViAtIGNkZXYgaW52YWxpZAorLUVJTlZBTCAtIFRoZSBkZXZpY2UgaXMgbm90IG9wZXJhdGlvbmFsIG9yIHRoZSBjY3cgZGV2aWNlIGlzIG5vdCBvbmxpbmUuCiAKIE1pc2NlbGxhbmVvdXMgU3VwcG9ydCBSb3V0aW5lcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvY3J5cHRvL2NyeXB0by1BUEkudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL2NyeXB0by9jcnlwdG8tQVBJLnR4dAppbmRleCAyOWRlZTc5Li43MWFlNmNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvY3J5cHRvL2NyeXB0by1BUEkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vczM5MC9jcnlwdG8vY3J5cHRvLUFQSS50eHQKQEAgLTE3LDggKzE3LDggQEAKIDIuIFByb2JpbmcgZm9yIGF2YWlsYWJpbGl0eSBvZiBNU0EKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgS2VybmVscyB3aXRoIHRoZSB6OTkwIGNyeXB0byBpbXBsZW1lbnRhdGlvbnMgYm90aAotb24gbWFjaGluZXMgd2l0aCBNU0EgYXZhaWxhYmxlIGFuIG9uIHRob3NlIHdpdGhvdXQgTVNBIChwcmUgejk5MCBvciB6OTkwCi13aXRob3V0IE1TQSkuIFRoZXJlZm9yZSBhIHNpbXBsZSBwcm9iaW5nIG1lY2hhbmlzbXMgaGFzIGJlZW4gaW1wbGVtZW50ZWQ6CitvbiBtYWNoaW5lcyB3aXRoIE1TQSBhdmFpbGFibGUgYW5kIG9uIHRob3NlIHdpdGhvdXQgTVNBIChwcmUgejk5MCBvciB6OTkwCit3aXRob3V0IE1TQSkuIFRoZXJlZm9yZSBhIHNpbXBsZSBwcm9iaW5nIG1lY2hhbmlzbSBoYXMgYmVlbiBpbXBsZW1lbnRlZDoKIEluIHRoZSBpbml0IGZ1bmN0aW9uIG9mIGVhY2ggY3J5cHRvIG1vZHVsZSB0aGUgYXZhaWxhYmlsaXR5IG9mIE1TQSBhbmQgb2YgdGhlCiByZXNwZWN0aXZlIGNyeXB0byBhbGdvcml0aG0gaW4gcGFydGljdWxhciB3aWxsIGJlIHRlc3RlZC4gSWYgdGhlIGFsZ29yaXRobSBpcwogYXZhaWxhYmxlIHRoZSBtb2R1bGUgd2lsbCBsb2FkIGFuZCByZWdpc3RlciBpdHMgYWxnb3JpdGhtIHdpdGggdGhlIGNyeXB0byBBUEkuCkBAIC0yNiw3ICsyNiw3IEBACiBJZiB0aGUgcmVzcGVjdGl2ZSBjcnlwdG8gYWxnb3JpdGhtIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBpbml0IGZ1bmN0aW9uIHdpbGwKIHJldHVybiAtRU5PU1lTLiBJbiB0aGF0IGNhc2UgYSBmYWxsYmFjayB0byB0aGUgc3RhbmRhcmQgc29mdHdhcmUgaW1wbGVtZW50YXRpb24KIG9mIHRoZSBjcnlwdG8gYWxnb3JpdGhtIG11c3QgYmUgdGFrZW4gKCAtPiB0aGUgc3RhbmRhcmQgY3J5cHRvIG1vZHVsZXMgYXJlCi1hbHNvIGJ1aWxkIHdoZW4gY29tcGlsaW5nIHRoZSBrZXJuZWwpLgorYWxzbyBidWlsdCB3aGVuIGNvbXBpbGluZyB0aGUga2VybmVsKS4KIAogCiAzLiBFbnN1cmluZyB6OTkwIGNyeXB0byBtb2R1bGUgcHJlZmVyZW5jZQpAQCAtNzUsOCArNzUsOCBAQAogCiAtIFNIQTEgRGlnZXN0IEFsZ29yaXRobSBbc2hhMSAtPiBzaGExX3o5OTBdCiAtIERFUyBFbmNyeXB0L0RlY3J5cHQgQWxnb3JpdGhtICg2NGJpdCBrZXkpIFtkZXMgLT4gZGVzX3o5OTBdCi0tIFRyaXBwbGUgREVTIEVuY3J5cHQvRGVjcnlwdCBBbGdvcml0aG0gKDEyOGJpdCBrZXkpIFtkZXMzX2VkZTEyOCAtPiBkZXNfejk5MF0KLS0gVHJpcHBsZSBERVMgRW5jcnlwdC9EZWNyeXB0IEFsZ29yaXRobSAoMTkyYml0IGtleSkgW2RlczNfZWRlIC0+IGRlc196OTkwXQorLSBUcmlwbGUgREVTIEVuY3J5cHQvRGVjcnlwdCBBbGdvcml0aG0gKDEyOGJpdCBrZXkpIFtkZXMzX2VkZTEyOCAtPiBkZXNfejk5MF0KKy0gVHJpcGxlIERFUyBFbmNyeXB0L0RlY3J5cHQgQWxnb3JpdGhtICgxOTJiaXQga2V5KSBbZGVzM19lZGUgLT4gZGVzX3o5OTBdCiAKIEluIG9yZGVyIHRvIGxvYWQsIGZvciBleGFtcGxlLCB0aGUgc2hhMV96OTkwIG1vZHVsZSB3aGVuIHRoZSBzaGExIGFsZ29yaXRobSBpcwogcmVxdWVzdGVkIChzZWUgMy4yLikgYWRkICdhbGlhcyBzaGExIHNoYTFfejk5MCcgdG8gL2V0Yy9tb2Rwcm9iZS5jb25mLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL2RyaXZlci1tb2RlbC50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvZHJpdmVyLW1vZGVsLnR4dAppbmRleCA2MmMwODIzLi5lOTM4YzQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvZHJpdmVyLW1vZGVsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvZHJpdmVyLW1vZGVsLnR4dApAQCAtMTgsMTEgKzE4LDE4IEBACiAJICAgLSAwLjAuMDAwMi8KIAkgICAtIDAuMS4wMDAwLzAuMS4xMjM0LwogCSAgIC4uLgorCSAgIC0gZGVmdW5jdC8KIAogSW4gdGhpcyBleGFtcGxlLCBkZXZpY2UgMDgxNSBpcyBhY2Nlc3NlZCB2aWEgc3ViY2hhbm5lbCAwIGluIHN1YmNoYW5uZWwgc2V0IDAsCiBkZXZpY2UgNDcxMSB2aWEgc3ViY2hhbm5lbCAxIGluIHN1YmNoYW5uZWwgc2V0IDAsIGFuZCBzdWJjaGFubmVsIDIgaXMgYSBub24tSS9PCiBzdWJjaGFubmVsLiBEZXZpY2UgMTIzNCBpcyBhY2Nlc3NlZCB2aWEgc3ViY2hhbm5lbCAwIGluIHN1YmNoYW5uZWwgc2V0IDEuCiAKK1RoZSBzdWJjaGFubmVsIG5hbWVkICdkZWZ1bmN0JyBkb2VzIG5vdCByZXByZXNlbnQgYW55IHJlYWwgc3ViY2hhbm5lbCBvbiB0aGUKK3N5c3RlbTsgaXQgaXMgYSBwc2V1ZG8gc3ViY2hhbm5lbCB3aGVyZSBkaXNjb25ubmVjdGVkIGNjdyBkZXZpY2VzIGFyZSBtb3ZlZCB0bworaWYgdGhleSBhcmUgZGlzcGxhY2VkIGJ5IGFub3RoZXIgY2N3IGRldmljZSBiZWNvbWluZyBvcGVyYXRpb25hbCBvbiB0aGVpcgorZm9ybWVyIHN1YmNoYW5uZWwuIFRoZSBjY3cgZGV2aWNlcyB3aWxsIGJlIG1vdmVkIGFnYWluIHRvIGEgcHJvcGVyIHN1YmNoYW5uZWwKK2lmIHRoZXkgYmVjb21lIG9wZXJhdGlvbmFsIGFnYWluIG9uIHRoYXQgc3ViY2hhbm5lbC4KKwogWW91IHNob3VsZCBhZGRyZXNzIGEgY2N3IGRldmljZSB2aWEgaXRzIGJ1cyBpZCAoZS5nLiAwLjAuNDcxMSk7IHRoZSBkZXZpY2UgY2FuCiBiZSBmb3VuZCB1bmRlciBidXMvY2N3L2RldmljZXMvLgogCkBAIC0yMzksNiArMjQ2LDkgQEAKIAogdHlwZSAtIFRoZSBwaHlzaWNhbCB0eXBlIG9mIHRoZSBjaGFubmVsIHBhdGguCiAKK3NoYXJlZCAtIFdoZXRoZXIgdGhlIGNoYW5uZWwgcGF0aCBpcyBzaGFyZWQuCisKK2NtZyAtIFRoZSBjaGFubmVsIG1lYXN1cmVtZW50IGdyb3VwLgogCiAzLiBTeXN0ZW0gZGV2aWNlcwogLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dAppbmRleCAwMDAyMzBjLi4wZWI3YzU4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CkBAIC0zNiw3ICszNiw3IEBACiB0aGF0IHRoZSByZWNvcmRzIHdoaWNoIGRlc2NyaWJlIHRoZSBvcmlnaW4gb2YgdGhlIGV4Y2VwdGlvbiBhcmUgbm90CiBvdmVyd3JpdHRlbiB3aGVuIGEgd3JhcCBhcm91bmQgZm9yIHRoZSBjdXJyZW50IGFyZWEgb2NjdXJzLgogCi1UaGUgZGVidWcgYXJlYXMgaXRzZWx2ZSBhcmUgYWxzbyBvcmRlcmVkIGluIGZvcm0gb2YgYSByaW5nIGJ1ZmZlci4gCitUaGUgZGVidWcgYXJlYXMgdGhlbXNlbHZlcyBhcmUgYWxzbyBvcmRlcmVkIGluIGZvcm0gb2YgYSByaW5nIGJ1ZmZlci4KIFdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUgbGFzdCBkZWJ1ZyBhcmVhLCB0aGUgZm9sbG93aW5nIGRlYnVnIAogZW50cmllcyBhcmUgdGhlbiB3cml0dGVuIGFnYWluIGluIHRoZSB2ZXJ5IGZpcnN0IGFyZWEuCiAKQEAgLTU1LDcgKzU1LDcgQEAKIHRoZSBkZWJ1Z2ZzLWZpbGVzeXN0ZW0uIFVuZGVyIHRoZSB0b3BsZXZlbCBkaXJlY3RvcnkgInMzOTBkYmYiIHRoZXJlIGlzCiBhIGRpcmVjdG9yeSBmb3IgZWFjaCByZWdpc3RlcmVkIGNvbXBvbmVudCwgd2hpY2ggaXMgbmFtZWQgbGlrZSB0aGUKIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50LiBUaGUgZGVidWdmcyBub3JtYWxseSBzaG91bGQgYmUgbW91bnRlZCB0bwotL3N5cy9rZXJuZWwvZGVidWcgdGhlcmVmb3JlIHRoZSBkZWJ1ZyBmZWF0dXJlIGNhbiBiZSBhY2Nlc3NlZCB1bnRlcgorL3N5cy9rZXJuZWwvZGVidWcgdGhlcmVmb3JlIHRoZSBkZWJ1ZyBmZWF0dXJlIGNhbiBiZSBhY2Nlc3NlZCB1bmRlcgogL3N5cy9rZXJuZWwvZGVidWcvczM5MGRiZi4KIAogVGhlIGNvbnRlbnQgb2YgdGhlIGRpcmVjdG9yaWVzIGFyZSBmaWxlcyB3aGljaCByZXByZXNlbnQgZGlmZmVyZW50IHZpZXdzCkBAIC04NywxMSArODcsMTEgQEAKIGdsb2JhbGx5LiBUaGUgZmlyc3QgcG9zc2liaWxpdHkgaXMgdG8gdXNlIHRoZSAiZGVidWdfYWN0aXZlIiBzeXNjdGwuIElmCiBzZXQgdG8gMSB0aGUgZGVidWcgZmVhdHVyZSBpcyBydW5uaW5nLiBJZiAiZGVidWdfYWN0aXZlIiBpcyBzZXQgdG8gMCB0aGUKIGRlYnVnIGZlYXR1cmUgaXMgdHVybmVkIG9mZi4KLVRoZSBzZWNvbmQgdHJpZ2dlciB3aGljaCBzdG9wcyB0aGUgZGVidWcgZmVhdHVyZSBpcyBhbiBrZXJuZWwgb29wcy4KK1RoZSBzZWNvbmQgdHJpZ2dlciB3aGljaCBzdG9wcyB0aGUgZGVidWcgZmVhdHVyZSBpcyBhIGtlcm5lbCBvb3BzLgogVGhhdCBwcmV2ZW50cyB0aGUgZGVidWcgZmVhdHVyZSBmcm9tIG92ZXJ3cml0aW5nIGRlYnVnIGluZm9ybWF0aW9uIHRoYXQKIGhhcHBlbmVkIGJlZm9yZSB0aGUgb29wcy4gQWZ0ZXIgYW4gb29wcyB5b3UgY2FuIHJlYWN0aXZhdGUgdGhlIGRlYnVnIGZlYXR1cmUKIGJ5IHBpcGluZyAxIHRvIC9wcm9jL3N5cy9zMzkwZGJmL2RlYnVnX2FjdGl2ZS4gTmV2ZXJ0aGVsZXNzLCBpdHMgbm90Ci1zdWdnZXN0ZWQgdG8gdXNlIGFuIG9vcHNlZCBrZXJuZWwgaW4gYW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4KK3N1Z2dlc3RlZCB0byB1c2UgYW4gb29wc2VkIGtlcm5lbCBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuCiBJZiB5b3Ugd2FudCB0byBkaXNhbGxvdyB0aGUgZGVhY3RpdmF0aW9uIG9mIHRoZSBkZWJ1ZyBmZWF0dXJlLCB5b3UgY2FuIHVzZQogdGhlICJkZWJ1Z19zdG9wcGFibGUiIHN5c2N0bC4gSWYgeW91IHNldCAiZGVidWdfc3RvcHBhYmxlIiB0byAwIHRoZSBkZWJ1ZwogZmVhdHVyZSBjYW5ub3QgYmUgc3RvcHBlZC4gSWYgdGhlIGRlYnVnIGZlYXR1cmUgaXMgYWxyZWFkeSBzdG9wcGVkLCBpdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzc5eHgudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzc5eHgudHh0CmluZGV4IDkwNGQ0OWUuLjZhYTlhODkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9haWM3OXh4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWljNzl4eC50eHQKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAtIENvcnJlY3QgYSByZWZlcmVuY2UgdG8gZnJlZSdlZCBtZW1vcnkgZHVyaW5nIGNvbnRyb2xsZXIKICAgICAgICAgICBzaHV0ZG93bi4KICAgICAgICAgLSBSZXNldCB0aGUgYnVzIG9uIGFuIFNFLT5MVkQgY2hhbmdlLiAgVGhpcyBpcyByZXF1aXJlZAotICAgICAgICAgIHRvIHJlc2V0IG91ciB0cmFuc2NpZXZlcnMuCisgICAgICAgICAgdG8gcmVzZXQgb3VyIHRyYW5zY2VpdmVycy4KIAogICAgMS4zLjUgKE1hcmNoIDI0dGgsIDIwMDMpCiAgICAgICAgIC0gRml4IGEgZmV3IHJlZ2lzdGVyIHdpbmRvdyBtb2RlIGJ1Z3MuCkBAIC0xNjksNyArMTY5LDcgQEAKICAgIDEuMy4wIChKYW51YXJ5IDIxc3QsIDIwMDMpCiAgICAgICAgIC0gRnVsbCByZWdyZXNzaW9uIHRlc3RpbmcgZm9yIGFsbCBVMzIwIHByb2R1Y3RzIGNvbXBsZXRlZC4KICAgICAgICAgLSBBZGRlZCBhYm9ydCBhbmQgdGFyZ2V0L2x1biByZXNldCBlcnJvciByZWNvdmVyeSBoYW5kbGVyIGFuZAotICAgICAgICAgIGludGVycnVwdCBjb2FsZXNzaW5nLgorICAgICAgICAgIGludGVycnVwdCBjb2FsZXNjaW5nLgogCiAgICAxLjIuMCAoTm92ZW1iZXIgMTR0aCwgMjAwMikKICAgICAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBEb21haW4gVmFsaWRhdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzd4eHhfb2xkLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9haWM3eHh4X29sZC50eHQKaW5kZXggYzkyZjQ0Ny4uMDU2NjdlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL2FpYzd4eHhfb2xkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvYWljN3h4eF9vbGQudHh0CkBAIC0yNTYsNyArMjU2LDcgQEAKIAkgICAgICBFbi9EaXNhYmxlIEhpZ2ggQnl0ZSBMVkQgVGVybWluYXRpb24KIAogCVRoZSB1cHBlciAyIGJpdHMgdGhhdCBkZWFsIHdpdGggTFZEIHRlcm1pbmF0aW9uIG9ubHkgYXBwbHkgdG8gVWx0cmEyCi0JY29udHJvbGxlcnMuICBGdXRoZXJtb3JlLCBkdWUgdG8gdGhlIGN1cnJlbnQgVWx0cmEyIGNvbnRyb2xsZXIKKwljb250cm9sbGVycy4gIEZ1cnRoZXJtb3JlLCBkdWUgdG8gdGhlIGN1cnJlbnQgVWx0cmEyIGNvbnRyb2xsZXIKIAlkZXNpZ25zLCB0aGVzZSBiaXRzIGFyZSB0aWVkIHRvZ2V0aGVyIHN1Y2ggdGhhdCBzZXR0aW5nIGVpdGhlciBiaXQKIAllbmFibGVzIGJvdGggbG93IGFuZCBoaWdoIGJ5dGUgTFZEIHRlcm1pbmF0aW9uLiAgSXQgaXMgbm90IHBvc3NpYmxlCiAJdG8gb25seSBzZXQgaGlnaCBvciBsb3cgYnl0ZSBMVkQgdGVybWluYXRpb24gaW4gdGhpcyBtYW5uZXIuICBUaGlzIGlzCkBAIC00MzYsNyArNDM2LDcgQEAKICAgICB0aGUgY29tbWFzIHRvIHBlcmlvZHMsIGluc21vZCB3b24ndCBpbnRlcnByZXQgdGhpcyBhcyBtb3JlIHRoYW4gb25lCiAgICAgc3RyaW5nIGFuZCB3cml0ZSBqdW5rIGludG8gb3VyIGJpbmFyeSBpbWFnZS4gIEkgY29uc2lkZXIgaXQgYSBidWcgaW4KICAgICB0aGUgaW5zbW9kIHByb2dyYW0gdGhhdCBldmVuIGlmIHlvdSB3cmFwIHlvdXIgc3RyaW5nIGluIHF1b3RlcyAocXVvdGVzCi0gICAgdGhhdCBwYXNzIHRoZSBzaGVsbCBtaW5kIHlvdSBhbmQgdGhhdCBpbnNtb2Qgc2VlcykgaXQgc3RpbGwgdHJlYXRlcworICAgIHRoYXQgcGFzcyB0aGUgc2hlbGwgbWluZCB5b3UgYW5kIHRoYXQgaW5zbW9kIHNlZXMpIGl0IHN0aWxsIHRyZWF0cwogICAgIGEgY29tbWEgaW5zaWRlIG9mIHRob3NlIHF1b3RlcyBhcyBzdGFydGluZyBhIG5ldyB2YXJpYWJsZSwgcmVzdWx0aW5nCiAgICAgaW4gbWVtb3J5IHNjcmliYmxlcyBpZiB5b3UgZG9uJ3Qgc3dpdGNoIHRoZSBjb21tYXMgdG8gcGVyaW9kcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2libW1jYS50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dAppbmRleCAzNWY2YjhlLi45NzA3OTQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaWJtbWNhLnR4dApAQCAtNDYxLDcgKzQ2MSw3IEBACiAgICAgICBUaGlzIG5lZWRzIHRoZSBSRC1CaXQgdG8gYmUgZGlzYWJsZWQgb24gSU1fT1RIRVJfU0NTSV9DTURfQ01EIHdoaWNoIAogICAgICAgYWxsb3dzIGRhdGEgdG8gYmUgd3JpdHRlbiBmcm9tIHRoZSBzeXN0ZW0gdG8gdGhlIGRldmljZS4gSXQgaXMgYQogICAgICAgbmVjZXNzYXJ5IHN0ZXAgdG8gYmUgYWxsb3dlZCB0byBzZXQgYmxvY2tzaXplIG9mIFNDU0ktdGFwZS1kcml2ZXMgYW5kIAotICAgICAgdGhlIHRhcGUtc3BlZWQsIHdoaXRob3V0IGNvbmZ1c2luZyB0aGUgU0NTSS1TdWJzeXN0ZW0uCisgICAgICB0aGUgdGFwZS1zcGVlZCwgd2l0aG91dCBjb25mdXNpbmcgdGhlIFNDU0ktU3Vic3lzdGVtLgogICAgMikgVGhlIHJlY29nbml0aW9uIG9mIGEgdGFwZSBpcyBpbmNsdWRlZCBpbiB0aGUgY2hlY2tfZGV2aWNlcyByb3V0aW5lLgogICAgICAgVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIGZvciBUWVBFX1RBUEUsIHRoYXQgaXMgYWxyZWFkeSBkZWZpbmVkIGluCiAgICAgICB0aGUga2VybmVsLXNjc2ktZW52aXJvbm1lbnQuIFRoZSBtYXJrdXAgb2YgYSB0YXBlIGlzIGRvbmUgaW4gdGhlIApAQCAtNzEwLDggKzcxMCw4IEBACiAgICAgICBvZiB0cm91YmxlcyB3aXRoIHNvbWUgY29udHJvbGxlcnMgYW5kIGFmdGVyIEkgd2FudGVkIHRvIGFwcGx5IHNvbWUKICAgICAgIGV4dGVuc2lvbnMsIGl0IGp1bXBlZCBvdXQgaW4gdGhlIHNhbWUgc2l0dWF0aW9uLCBvbiBteSB3L2NhY2hlLCBhcyBsaWtlIAogICAgICAgb24gRC4gV2VpbmVoYWxscycgTW9kZWwgNTYsIGhhdmluZyBpbnRlZ3JhdGVkIFNDU0kuIFRoaXMgZ2F2ZSBtZSB0aGUgCi0gICAgICBkZXNjaXNzaXZlIGhpbnQgdG8gbW92ZSB0aGUgY29kZS1wYXJ0IG91dCBhbmQgZGVjbGFyZSBpdCBnbG9iYWwuIE5vdywKLSAgICAgIGl0IHNlZW1zIHRvIHdvcmsgYnkgZmFyIG11Y2ggYmV0dGVyIGFuIG1vcmUgc3RhYmxlLiBMZXQgdXMgc2VlLCB3aGF0CisgICAgICBkZWNpc2l2ZSBoaW50IHRvIG1vdmUgdGhlIGNvZGUtcGFydCBvdXQgYW5kIGRlY2xhcmUgaXQgZ2xvYmFsLiBOb3cKKyAgICAgIGl0IHNlZW1zIHRvIHdvcmsgZmFyIGJldHRlciBhbmQgbW9yZSBzdGFibGUuIExldCB1cyBzZWUgd2hhdAogICAgICAgdGhlIHdvcmxkIHRoaW5rcyBvZiBpdC4uLgogICAgMykgQnkgdGhlIHdheSwgb25seSBTb255IERBVC1kcml2ZXMgc2VlbSB0byBzaG93IGRlbnNpdHkgY29kZSAweDEzLiBBCiAgICAgICB0ZXN0IHdpdGggYSBIUCBkcml2ZSBnYXZlIHJpZ2h0IHJlc3VsdHMsIHNvIHRoZSBwcm9ibGVtIGlzIHZlbmRvci0KQEAgLTgyMiwxMCArODIyLDEwIEBACiAgICBBIGxvbmcgcGVyaW9kIG9mIGNvbGxlY3RpbmcgYnVncmVwb3J0cyBmcm9tIGFsbCBjb3JuZXJzIG9mIHRoZSB3b3JsZAogICAgbm93IGxlYWQgdG8gdGhlIGZvbGxvd2luZyBjb3JyZWN0aW9ucyB0byB0aGUgY29kZToKICAgIDEpIFNDU0ktMiBGL1cgc3VwcG9ydCBjcmFzaGVkIHdpdGggYSBDT01NQU5EIEVSUk9SLiBUaGUgcmVhc29uIGZvciB0aGlzIAotICAgICAgd2FzLCB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGRpc2JhbGUgRmFzdC1TQ1NJIGZvciB0aGUgZXh0ZXJuYWwgYnVzLgotICAgICAgVGhlIGZlYXR1cmUtY29udHJvbCBjb21tYW5kLCB3aGVyZSB0aGlzIGNyYXNoIGFwcGVhcmVkIHJlZ3VsYXJseSB0cmllZAorICAgICAgd2FzIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZGlzYWJsZSBGYXN0LVNDU0kgZm9yIHRoZSBleHRlcm5hbCBidXMuCisgICAgICBUaGUgZmVhdHVyZS1jb250cm9sIGNvbW1hbmQsIHdoZXJlIHRoaXMgY3Jhc2ggYXBwZWFyZWQgcmVndWxhcmx5LCB0cmllZAogICAgICAgdG8gc2V0IHRoZSBtYXhpbXVtIHNwZWVkIG9mIDEwTUh6IHN5bmNocm9ub3VzIHRyYW5zZmVyIHNwZWVkIGFuZCB0aGF0Ci0gICAgICByZXBvcnRzIGEgQ09NTUFORCBFUlJPUiwgaWYgZXh0ZXJuYWwgYnVzIEZhc3QtU0NTSSBpcyBkaXNhYmxlZC4gTm93LAorICAgICAgcmVwb3J0cyBhIENPTU1BTkQgRVJST1IgaWYgZXh0ZXJuYWwgYnVzIEZhc3QtU0NTSSBpcyBkaXNhYmxlZC4gTm93LAogICAgICAgdGhlIGZlYXR1cmUtY29tbWFuZCBwcm9iZXMgZG93biBmcm9tIG1heGltdW0gc3BlZWQgdW50aWwgdGhlIGFkYXB0ZXIgCiAgICAgICBzdG9wcyB0byBjb21wbGFpbiwgd2hpY2ggaXMgYXQgdGhlIHNhbWUgdGltZSB0aGUgbWF4aW11bSBwb3NzaWJsZQogICAgICAgc3BlZWQgc2VsZWN0ZWQgaW4gdGhlIHJlZmVyZW5jZSBwcm9ncmFtLiBTbywgRi9XIGV4dGVybmFsIGNhbiBydW4gYXQKQEAgLTkyMCw3ICs5MjAsNyBAQAogICAgICAgY29tcGxldGVkIGluIHN1Y2ggYSB3YXksIHRoYXQgdGhleSBhcmUgbm93IGNvbXBsZXRlbHkgY29uZm9ybSB0byB0aGUKICAgICAgIGRlbWFuZHMgaW4gdGhlIHRlY2huaWNhbCBkZXNjcmlwdGlvbiBvZiBJQk0uIE1haW4gY2FuZGlkYXRlcyB3ZXJlIHRoZQogICAgICAgREVWSUNFX0lOUVVJUlksIFJFUVVFU1RfU0VOU0UgYW5kIERFVklDRV9DQVBBQ0lUWSBjb21tYW5kcy4gVGhleSBtdXN0Ci0gICAgICBiZSB0cmFuZmVycmVkIGJ5IGJ5cGFzc2luZyB0aGUgaW50ZXJuYWwgY29tbWFuZCBidWZmZXIgb2YgdGhlIGFkYXB0ZXIKKyAgICAgIGJlIHRyYW5zZmVycmVkIGJ5IGJ5cGFzc2luZyB0aGUgaW50ZXJuYWwgY29tbWFuZCBidWZmZXIgb2YgdGhlIGFkYXB0ZXIKICAgICAgIG9yIGVsc2UgdGhlIHJlc3BvbnNlIGNhbiBiZSBhIHJhbmRvbSByZXN1bHQuIEdFVF9QT1NfSU5GTyB3b3VsZCBiZSBtb3JlCiAgICAgICBzYWZlIGluIHVzYWdlLCBpZiBvbmUgY291bGQgdXNlIHRoZSBTVVBSRVNTX0VYQ0VQVElPTl9TSE9SVCwgYnV0IHRoaXMKICAgICAgIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSB0ZWNobmljYWwgcmVmZXJlbmNlcyBvZiBJQk0uIChTb3JyeSwgZm9sa3MsIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2luMjAwMC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaW4yMDAwLnR4dAppbmRleCA4MGYxMDQwLi5jM2UyYTkwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvaW4yMDAwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvaW4yMDAwLnR4dApAQCAtMjQsNyArMjQsNyBAQAogVVBEQVRFIE5FV1M6IHZlcnNpb24gMS4zMSAtIDYgSnVsIDk3CiAKICAgIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIGluY29ycmVjdCBTQ1NJIHN0YXR1cyBieXRlcyB0byBiZQotICAgcmV0dXJuZWQgZnJvbSBjb21tYW5kcyBzZW50IHRvIExVTidzIGdyZWF0ZXIgdGhhbiAwLiBUaGlzCisgICByZXR1cm5lZCBmcm9tIGNvbW1hbmRzIHNlbnQgdG8gTFVOcyBncmVhdGVyIHRoYW4gMC4gVGhpcwogICAgbWVhbnMgdGhhdCBDRFJPTSBjaGFuZ2VycyB3b3JrIG5vdyEgRml4ZWQgYSBidWcgaW4gdGhlCiAgICBoYW5kbGluZyBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlLgogICAgQWxzbyBwdXQgYWxsIHRoZSBoZWFkZXIgZGF0YSBpbiBpbjIwMDAuaCB3aGVyZSBpdCBiZWxvbmdzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL2xpYnNhcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvbGlic2FzLnR4dAppbmRleCA5ZTIwNzhiLi5hYTU0ZjU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvbGlic2FzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvbGlic2FzLnR4dApAQCAtMzkzLDcgKzM5Myw3IEBACiAJdGFza19wcm90byAtLSBfb25lXyBvZiBlbnVtIHNhc19wcm90bwogCXNjYXR0ZXIgLS0gcG9pbnRlciB0byBzY2F0dGVyIGdhdGhlciBsaXN0IGFycmF5CiAJbnVtX3NjYXR0ZXIgLS0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHNjYXR0ZXIKLQl0b3RhbF94ZmVyX2xlbiAtLSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgdG8gYmUgdHJhbnNmZXJlZAorCXRvdGFsX3hmZXJfbGVuIC0tIHRvdGFsIG51bWJlciBvZiBieXRlcyBleHBlY3RlZCB0byBiZSB0cmFuc2ZlcnJlZAogCWRhdGFfZGlyIC0tIFBDSV9ETUFfLi4uCiAJdGFza19kb25lIC0tIGNhbGxiYWNrIHdoZW4gdGhlIHRhc2sgaGFzIGZpbmlzaGVkIGV4ZWN1dGlvbgogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9uY3I1M2M4eHgudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL25jcjUzYzh4eC50eHQKaW5kZXggNThhZDhkYi4uY2FmMTBiMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL25jcjUzYzh4eC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL25jcjUzYzh4eC50eHQKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAgICAgICAgICAgZnRwOi8vZnRwLnN5bWJpb3MuY29tLwogCi1Vc2VmdWxsIFNDU0kgdG9vbHMgd3JpdHRlbiBieSBFcmljIFlvdW5nZGFsZSBhcmUgYXZhaWxhYmxlIGF0IHRzeC0xMToKK1VzZWZ1bCBTQ1NJIHRvb2xzIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZ2RhbGUgYXJlIGF2YWlsYWJsZSBhdCB0c3gtMTE6CiAKICAgICAgICAgICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvc2NzaS9zY3NpaW5mby1YLlkudGFyLmd6CiAgICAgICAgICAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL3Njc2kvc2NzaWRldi1YLlkudGFyLmd6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1jaGFuZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpLWNoYW5nZXIudHh0CmluZGV4IGQ3NGJiZDIuLjAzMjM5OWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpLWNoYW5nZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpLWNoYW5nZXIudHh0CkBAIC04OCw3ICs4OCw3IEBACiBkZXZpY2UgWyB0cnkgImRtZXNnIiBpZiB5b3UgZG9uJ3Qgc2VlIGFueXRoaW5nIF0gYW5kIHNob3VsZCBzaG93IHVwIGluCiAvcHJvYy9kZXZpY2VzLiBJZiBub3QuLi4uICBzb21lIGNoYW5nZXJzIHVzZSBJRCA/IC8gTFVOIDAgZm9yIHRoZQogZGV2aWNlIGFuZCBJRCA/IC8gTFVOIDEgZm9yIHRoZSByb2JvdCBtZWNoYW5pc20uIEJ1dCBMaW51eCBkb2VzICpub3QqCi1sb29rIGZvciBMVU4ncyBvdGhlciB0aGFuIDAgYXMgZGVmYXVsdCwgYmVjYXVjZSB0aGVyZSBhcmUgdG8gbWFueQorbG9vayBmb3IgTFVOcyBvdGhlciB0aGFuIDAgYXMgZGVmYXVsdCwgYmVjYXVzZSB0aGVyZSBhcmUgdG9vIG1hbnkKIGJyb2tlbiBkZXZpY2VzLiBTbyB5b3UgY2FuIHRyeToKIAogICAxKSBlY2hvICJzY3NpIGFkZC1zaW5nbGUtZGV2aWNlIDAgMCBJRCAxIiA+IC9wcm9jL3Njc2kvc2NzaQpAQCAtMTA3LDcgKzEwNyw3IEBACiBzdHJpbmdzIHRoZW4uCiAKIFlvdSBjYW4gZGlzcGxheSB0aGVzZSBtZXNzYWdlcyB3aXRoIHRoZSBkbWVzZyBjb21tYW5kIChvciBjaGVjayB0aGUKLWxvZ2ZpbGVzKS4gIElmIHlvdSBlbWFpbCBtZSBzb21lIHF1ZXN0aW9uIGJlY2F1Y2Ugb2YgYSBwcm9ibGVtIHdpdGggdGhlCitsb2dmaWxlcykuICBJZiB5b3UgZW1haWwgbWUgc29tZSBxdWVzdGlvbiBiZWNhdXNlIG9mIGEgcHJvYmxlbSB3aXRoIHRoZQogZHJpdmVyLCBwbGVhc2UgaW5jbHVkZSB0aGVzZSBtZXNzYWdlcy4KIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9laC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9laC50eHQKaW5kZXggYjk2NGVlZi4uN2FjYmViYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZWgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2VoLnR4dApAQCAtNzUsNyArNzUsNyBAQAogCiAgLSBvdGhlcndpc2UKIAlzY3NpX2VoX3NjbWRfYWRkKHNjbWQsIDApIGlzIGludm9rZWQgZm9yIHRoZSBjb21tYW5kLiAgU2VlCi0JWzEtM10gZm9yIGRldGFpbHMgb2YgdGhpcyBmdW5jaXRvbi4KKwlbMS0zXSBmb3IgZGV0YWlscyBvZiB0aGlzIGZ1bmN0aW9uLgogCiAKIFsxLTItMl0gQ29tcGxldGluZyBhIHNjbWQgdy8gdGltZW91dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0CmluZGV4IDc1YTUzNWEuLjZmNzBmMmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX21pZF9sb3dfYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9taWRfbG93X2FwaS50eHQKQEAgLTM3NSw3ICszNzUsNiBAQAogICAgc2NzaV9hZGRfZGV2aWNlIC0gY3JlYXRlcyBuZXcgc2NzaSBkZXZpY2UgKGx1KSBpbnN0YW5jZQogICAgc2NzaV9hZGRfaG9zdCAtIHBlcmZvcm0gc3lzZnMgcmVnaXN0cmF0aW9uIGFuZCBzZXQgdXAgdHJhbnNwb3J0IGNsYXNzCiAgICBzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aCAtIGNoYW5nZSB0aGUgcXVldWUgZGVwdGggb24gYSBTQ1NJIGRldmljZQotICAgc2NzaV9hc3NpZ25fbG9jayAtIHJlcGxhY2UgZGVmYXVsdCBob3N0X2xvY2sgd2l0aCBnaXZlbiBsb2NrCiAgICBzY3NpX2Jpb3NfcHRhYmxlIC0gcmV0dXJuIGNvcHkgb2YgYmxvY2sgZGV2aWNlJ3MgcGFydGl0aW9uIHRhYmxlCiAgICBzY3NpX2Jsb2NrX3JlcXVlc3RzIC0gcHJldmVudCBmdXJ0aGVyIGNvbW1hbmRzIGJlaW5nIHF1ZXVlZCB0byBnaXZlbiBob3N0CiAgICBzY3NpX2RlYWN0aXZhdGVfdGNxIC0gdHVybiBvZmYgdGFnIGNvbW1hbmQgcXVldWVpbmcKQEAgLTQ4OSwyMCArNDg4LDYgQEAKIAogCiAvKioKLSAqIHNjc2lfYXNzaWduX2xvY2sgLSByZXBsYWNlIGRlZmF1bHQgaG9zdF9sb2NrIHdpdGggZ2l2ZW4gbG9jawotICogQHNob3N0OiBhIHBvaW50ZXIgdG8gYSBzY3NpIGhvc3QgaW5zdGFuY2UKLSAqIEBsb2NrOiBwb2ludGVyIHRvIGxvY2sgdG8gcmVwbGFjZSBob3N0X2xvY2sgZm9yIHRoaXMgaG9zdAotICoKLSAqICAgICAgUmV0dXJucyBub3RoaW5nCi0gKgotICogICAgICBNaWdodCBibG9jazogbm8KLSAqCi0gKiAgICAgIERlZmluZWQgaW46IGluY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaCAuCi0gKiovCi12b2lkIHNjc2lfYXNzaWduX2xvY2soc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHNwaW5sb2NrX3QgKmxvY2spCi0KLQotLyoqCiAgKiBzY3NpX2Jpb3NfcHRhYmxlIC0gcmV0dXJuIGNvcHkgb2YgYmxvY2sgZGV2aWNlJ3MgcGFydGl0aW9uIHRhYmxlCiAgKiBAZGV2OiAgICAgICAgcG9pbnRlciB0byBibG9jayBkZXZpY2UKICAqCkBAIC0xMzY2LDE3ICsxMzUxLDExIEBACiBFYWNoIHN0cnVjdCBTY3NpX0hvc3QgaW5zdGFuY2UgaGFzIGEgc3Bpbl9sb2NrIGNhbGxlZCBzdHJ1Y3QgCiBTY3NpX0hvc3Q6OmRlZmF1bHRfbG9jayB3aGljaCBpcyBpbml0aWFsaXplZCBpbiBzY3NpX2hvc3RfYWxsb2MoKSBbZm91bmQgaW4gCiBob3N0cy5jXS4gV2l0aGluIHRoZSBzYW1lIGZ1bmN0aW9uIHRoZSBzdHJ1Y3QgU2NzaV9Ib3N0Ojpob3N0X2xvY2sgcG9pbnRlcgotaXMgaW5pdGlhbGl6ZWQgdG8gcG9pbnQgYXQgZGVmYXVsdF9sb2NrIHdpdGggdGhlIHNjc2lfYXNzaWduX2xvY2soKSBmdW5jdGlvbi4KLVRoZXJlYWZ0ZXIgbG9jayBhbmQgdW5sb2NrIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZSBtaWQgbGV2ZWwgdXNlIHRoZQotc3RydWN0IFNjc2lfSG9zdDo6aG9zdF9sb2NrIHBvaW50ZXIuCitpcyBpbml0aWFsaXplZCB0byBwb2ludCBhdCBkZWZhdWx0X2xvY2suICBUaGVyZWFmdGVyIGxvY2sgYW5kIHVubG9jaworb3BlcmF0aW9ucyBwZXJmb3JtZWQgYnkgdGhlIG1pZCBsZXZlbCB1c2UgdGhlIHN0cnVjdCBTY3NpX0hvc3Q6Omhvc3RfbG9jaworcG9pbnRlci4gIFByZXZpb3VzbHkgZHJpdmVycyBjb3VsZCBvdmVycmlkZSB0aGUgaG9zdF9sb2NrIHBvaW50ZXIgYnV0Cit0aGlzIGlzIG5vdCBhbGxvd2VkIGFueW1vcmUuCiAKLUxMRHMgY2FuIG92ZXJyaWRlIHRoZSB1c2Ugb2Ygc3RydWN0IFNjc2lfSG9zdDo6ZGVmYXVsdF9sb2NrIGJ5Ci11c2luZyBzY3NpX2Fzc2lnbl9sb2NrKCkuIFRoZSBlYXJsaWVzdCBvcHBvcnR1bml0eSB0byBkbyB0aGlzIHdvdWxkCi1iZSBpbiB0aGUgZGV0ZWN0KCkgZnVuY3Rpb24gYWZ0ZXIgaXQgaGFzIGludm9rZWQgc2NzaV9yZWdpc3RlcigpLiBJdAotY291bGQgYmUgcmVwbGFjZWQgYnkgYSBjb2Fyc2VyIGdyYWluIGxvY2sgKGUuZy4gcGVyIGRyaXZlcikgb3IgYQotbG9jayBvZiBlcXVhbCBncmFudWxhcml0eSAoaS5lLiBwZXIgaG9zdCkuIFVzaW5nIGZpbmVyIGdyYWluIGxvY2tzIAotKGUuZy4gcGVyIFNDU0kgZGV2aWNlKSBtYXkgYmUgcG9zc2libGUgYnkganVnZ2xpbmcgbG9ja3MgaW4KLXF1ZXVlY29tbWFuZCgpLgogCiBBdXRvc2Vuc2UKID09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zdC50eHQKaW5kZXggNWZmNjViMS4uM2MxMjQyMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc3QudHh0CkBAIC0yNjEsNyArMjYxLDcgQEAKIHVzZWQgaW5zdGVhZCBvZiB0aGUgZXF1YWwgbWFyay4gVGhlIGRlZmluaXRpb24gaXMgcHJlcGVuZGVkIGJ5IHRoZQogc3RyaW5nIHN0PS4gSGVyZSBpcyBhbiBleGFtcGxlOgogCi0Jc3Q9YnVmZmVyX2ticzo2NCx3cml0ZV90aHJlaG9sZF9rYnM6NjAKKwlzdD1idWZmZXJfa2JzOjY0LHdyaXRlX3RocmVzaG9sZF9rYnM6NjAKIAogVGhlIGZvbGxvd2luZyBzeW50YXggdXNlZCBieSB0aGUgb2xkIGtlcm5lbCB2ZXJzaW9ucyBpcyBhbHNvIHN1cHBvcnRlZDoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3N5bTUzYzh4eF8yLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zeW01M2M4eHhfMi50eHQKaW5kZXggMjZjOGEwOC4uMmMxNzQ1YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3N5bTUzYzh4eF8yLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc3ltNTNjOHh4XzIudHh0CkBAIC02MDksNyArNjA5LDcgQEAKIGJlIHN1cmUgSSB3aWxsIHJlY2VpdmUgaXQuICBPYnZpb3VzbHksIGEgYnVnIGluIHRoZSBkcml2ZXIgY29kZSBpcwogcG9zc2libGUuCiAKLSAgTXkgY3lycmVudCBlbWFpbCBhZGRyZXNzOiBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KKyAgTXkgY3VycmVudCBlbWFpbCBhZGRyZXNzOiBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4KIAogQWxsb3dpbmcgZGlzY29ubmVjdGlvbnMgaXMgaW1wb3J0YW50IGlmIHlvdSB1c2Ugc2V2ZXJhbCBkZXZpY2VzIG9uCiB5b3VyIFNDU0kgYnVzIGJ1dCBvZnRlbiBjYXVzZXMgcHJvYmxlbXMgd2l0aCBidWdneSBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zaGFyZWRzdWJ0cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vc2hhcmVkc3VidHJlZS50eHQKaW5kZXggMmQ4ZjQwMy4uY2NmMWNlYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zaGFyZWRzdWJ0cmVlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NoYXJlZHN1YnRyZWUudHh0CkBAIC05NDIsMTMgKzk0MiwxMyBAQAogCS0+bW50X3NsYXZlCiAJLT5tbnRfbWFzdGVyCiAKLQktPm1udF9zaGFyZSBsaW5rcyB0b2dhdGhlciBhbGwgdGhlIG1vdW50IHRvL2Zyb20gd2hpY2ggdGhpcyB2ZnNtb3VudAorCS0+bW50X3NoYXJlIGxpbmtzIHRvZ2V0aGVyIGFsbCB0aGUgbW91bnQgdG8vZnJvbSB3aGljaCB0aGlzIHZmc21vdW50CiAJCXNlbmQvcmVjZWl2ZXMgcHJvcGFnYXRpb24gZXZlbnRzLgogCiAJLT5tbnRfc2xhdmVfbGlzdCBsaW5rcyBhbGwgdGhlIG1vdW50cyB0byB3aGljaCB0aGlzIHZmc21vdW50IHByb3BhZ2F0ZXMKIAkJdG8uCiAKLQktPm1udF9zbGF2ZSBsaW5rcyB0b2dhdGhlciBhbGwgdGhlIHNsYXZlcyB0aGF0IGl0cyBtYXN0ZXIgdmZzbW91bnQKKwktPm1udF9zbGF2ZSBsaW5rcyB0b2dldGhlciBhbGwgdGhlIHNsYXZlcyB0aGF0IGl0cyBtYXN0ZXIgdmZzbW91bnQKIAkJcHJvcGFnYXRlcyB0by4KIAogCS0+bW50X21hc3RlciBwb2ludHMgdG8gdGhlIG1hc3RlciB2ZnNtb3VudCBmcm9tIHdoaWNoIHRoaXMgdmZzbW91bnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKaW5kZXggMTM4NjczYS4uOWZlZjIxMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKQEAgLTc1Myw3ICs3NTMsNyBAQAogICAgIHBvc2l0aW9uX2ZpeCAtIEZpeCBETUEgcG9pbnRlciAoMCA9IGF1dG8sIDEgPSBub25lLCAyID0gUE9TQlVGLCAzID0gRklGTyBzaXplKQogICAgIHNpbmdsZV9jbWQgIC0gVXNlIHNpbmdsZSBpbW1lZGlhdGUgY29tbWFuZHMgdG8gY29tbXVuaWNhdGUgd2l0aAogCQljb2RlY3MgKGZvciBkZWJ1Z2dpbmcgb25seSkKLSAgICBkaXNhYmxlX21zaSAtIERpc2FibGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHQgKE1TSSkKKyAgICBlbmFibGVfbXNpCS0gRW5hYmxlIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0IChNU0kpIChkZWZhdWx0ID0gb2ZmKQogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgb25lIGNhcmQgYW5kIGF1dG9wcm9iZS4KIApAQCAtOTU1LDcgKzk1NSw3IEBACiAJCSAgZG14NmZpcmUsIGRzcDI0LCBkc3AyNF92YWx1ZSwgZHNwMjRfNzEsIGV6OCwKIAkJICBwaGFzZTg4LCBtZWRpYXN0YXRpb24KICAgICBvbW5pCS0gT21uaSBJL08gc3VwcG9ydCBmb3IgTWlkaU1hbiBNLUF1ZGlvIERlbHRhNDQvNjYKLSAgICBjczg0MjdfdGltZW91dCAtIHJlc2V0IHRpbWVvdXQgZm9yIHRoZSBDUzg0MjcgY2hpcCAoUy9QRElGIHRyYW5zY2lldmVyKQorICAgIGNzODQyN190aW1lb3V0IC0gcmVzZXQgdGltZW91dCBmb3IgdGhlIENTODQyNyBjaGlwIChTL1BESUYgdHJhbnNjZWl2ZXIpCiAgICAgICAgICAgICAgICAgICAgICBpbiBtc2VjIHJlc29sdXRpb24sIGRlZmF1bHQgdmFsdWUgaXMgNTAwICgwLjUgc2VjKQogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgbXVsdGlwbGUgY2FyZHMgYW5kIGF1dG9wcm9iZS4gTm90ZTogVGhlIGNvbnN1bWVyIHBhcnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BdWRpZ3ktbWl4ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0F1ZGlneS1taXhlci50eHQKaW5kZXggNTEzMmZkOS4uN2YxMGRjNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0F1ZGlneS1taXhlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0F1ZGlneS1taXhlci50eHQKQEAgLTYsNyArNiw3IEBACiAKIFRoZSBFTVUxMEsyIGNoaXBzIGhhdmUgYSBEU1AgcGFydCB3aGljaCBjYW4gYmUgcHJvZ3JhbW1lZCB0byBzdXBwb3J0IAogdmFyaW91cyB3YXlzIG9mIHNhbXBsZSBwcm9jZXNzaW5nLCB3aGljaCBpcyBkZXNjcmliZWQgaGVyZS4KLShUaGlzIGFjdGljbGUgZG9lcyBub3QgZGVhbCB3aXRoIHRoZSBvdmVyYWxsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIAorKFRoaXMgYXJ0aWNsZSBkb2VzIG5vdCBkZWFsIHdpdGggdGhlIG92ZXJhbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgCiBFTVUxMEsyIGNoaXBzLiBTZWUgdGhlIG1hbnVhbHMgc2VjdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLikKIAogVGhlIEFMU0EgZHJpdmVyIHByb2dyYW1zIHRoaXMgcG9ydGlvbiBvZiBjaGlwIGJ5IGRlZmF1bHQgY29kZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL1NCLUxpdmUtbWl4ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL1NCLUxpdmUtbWl4ZXIudHh0CmluZGV4IDY1MWFkYWYuLmY1NjM5ZDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9TQi1MaXZlLW1peGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvU0ItTGl2ZS1taXhlci50eHQKQEAgLTUsNyArNSw3IEBACiAKIFRoZSBFTVUxMEsxIGNoaXBzIGhhdmUgYSBEU1AgcGFydCB3aGljaCBjYW4gYmUgcHJvZ3JhbW1lZCB0byBzdXBwb3J0CiB2YXJpb3VzIHdheXMgb2Ygc2FtcGxlIHByb2Nlc3NpbmcsIHdoaWNoIGlzIGRlc2NyaWJlZCBoZXJlLgotKFRoaXMgYWN0aWNsZSBkb2VzIG5vdCBkZWFsIHdpdGggdGhlIG92ZXJhbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgCisoVGhpcyBhcnRpY2xlIGRvZXMgbm90IGRlYWwgd2l0aCB0aGUgb3ZlcmFsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSAKIEVNVTEwSzEgY2hpcHMuIFNlZSB0aGUgbWFudWFscyBzZWN0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHMuKQogCiBUaGUgQUxTQSBkcml2ZXIgcHJvZ3JhbXMgdGhpcyBwb3J0aW9uIG9mIGNoaXAgYnkgZGVmYXVsdCBjb2RlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9weGEyeHggYi9Eb2N1bWVudGF0aW9uL3NwaS9weGEyeHgKaW5kZXggYTFlMGVlMi4uZjk3MTdmZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGkvcHhhMnh4CisrKyBiL0RvY3VtZW50YXRpb24vc3BpL3B4YTJ4eApAQCAtMTAyLDcgKzEwMiw3IEBACiAJdTggdHhfdGhyZXNob2xkOwogCXU4IHJ4X3RocmVzaG9sZDsKIAl1OCBkbWFfYnVyc3Rfc2l6ZTsKLQl1MzIgdGltZW91dF9taWNyb3NlY3M7CisJdTMyIHRpbWVvdXQ7CiAJdTggZW5hYmxlX2xvb3BiYWNrOwogCXZvaWQgKCpjc19jb250cm9sKSh1MzIgY29tbWFuZCk7CiB9OwpAQCAtMTIxLDcgKzEyMSw3IEBACiB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmFsdWUuIEFuIFNTUCBjb25maWd1cmVkIGZvciBieXRlLXdpZGUgdHJhbnNmZXJzIHdvdWxkCiB1c2UgYSB2YWx1ZSBvZiA4LgogCi1UaGUgInB4YTJ4eF9zcGlfY2hpcC50aW1lb3V0X21pY3Jvc2VjcyIgZmllbGRzIGlzIHVzZWQgdG8gZWZmaWNpZW50bHkgaGFuZGxlCitUaGUgInB4YTJ4eF9zcGlfY2hpcC50aW1lb3V0IiBmaWVsZHMgaXMgdXNlZCB0byBlZmZpY2llbnRseSBoYW5kbGUKIHRyYWlsaW5nIGJ5dGVzIGluIHRoZSBTU1AgcmVjZWl2ZXIgZmlmby4gIFRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzCiBkZXBlbmRlbnQgb24gdGhlIFNQSSBidXMgc3BlZWQgKCJzcGlfYm9hcmRfaW5mby5tYXhfc3BlZWRfaHoiKSBhbmQgdGhlIHNwZWNpZmljCiBzbGF2ZSBkZXZpY2UuICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBQWEEyeHggU1NQIDEgZG9lcyBub3Qgc3VwcG9ydCB0cmFpbGluZyBieXRlCkBAIC0xNjIsMTggKzE2MiwxOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHB4YTJ4eF9zcGlfY2hpcCBjczg0MTVhX2NoaXBfaW5mbyA9IHsKLQkudHhfdGhyZXNob2xkID0gMTIsIC8qIFNTUCBoYXJkd2FyZCBGSUZPIHRocmVzaG9sZCAqLwotCS5yeF90aHJlc2hvbGQgPSA0LCAvKiBTU1AgaGFyZHdhcmQgRklGTyB0aHJlc2hvbGQgKi8KKwkudHhfdGhyZXNob2xkID0gOCwgLyogU1NQIGhhcmR3YXJkIEZJRk8gdGhyZXNob2xkICovCisJLnJ4X3RocmVzaG9sZCA9IDgsIC8qIFNTUCBoYXJkd2FyZCBGSUZPIHRocmVzaG9sZCAqLwogCS5kbWFfYnVyc3Rfc2l6ZSA9IDgsIC8qIEJ5dGUgd2lkZSB0cmFuc2ZlcnMgdXNlZCBzbyA4IGJ5dGUgYnVyc3RzICovCi0JLnRpbWVvdXRfbWljcm9zZWNzID0gNjQsIC8qIFdhaXQgYXQgbGVhc3QgNjR1c2VjIHRvIGhhbmRsZSB0cmFpbGluZyAqLworCS50aW1lb3V0ID0gMjM1LCAvKiBTZWUgSW50ZWwgZG9jdW1lbnRhdGlvbiAqLwogCS5jc19jb250cm9sID0gY3M4NDE1YV9jc19jb250cm9sLCAvKiBVc2UgZXh0ZXJuYWwgY2hpcCBzZWxlY3QgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwIGNzODQwNWFfY2hpcF9pbmZvID0gewotCS50eF90aHJlc2hvbGQgPSAxMiwgLyogU1NQIGhhcmR3YXJkIEZJRk8gdGhyZXNob2xkICovCi0JLnJ4X3RocmVzaG9sZCA9IDQsIC8qIFNTUCBoYXJkd2FyZCBGSUZPIHRocmVzaG9sZCAqLworCS50eF90aHJlc2hvbGQgPSA4LCAvKiBTU1AgaGFyZHdhcmQgRklGTyB0aHJlc2hvbGQgKi8KKwkucnhfdGhyZXNob2xkID0gOCwgLyogU1NQIGhhcmR3YXJkIEZJRk8gdGhyZXNob2xkICovCiAJLmRtYV9idXJzdF9zaXplID0gOCwgLyogQnl0ZSB3aWRlIHRyYW5zZmVycyB1c2VkIHNvIDggYnl0ZSBidXJzdHMgKi8KLQkudGltZW91dF9taWNyb3NlY3MgPSA2NCwgLyogV2FpdCBhdCBsZWFzdCA2NHVzZWMgdG8gaGFuZGxlIHRyYWlsaW5nICovCisJLnRpbWVvdXQgPSAyMzUsIC8qIFNlZSBJbnRlbCBkb2N1bWVudGF0aW9uICovCiAJLmNzX2NvbnRyb2wgPSBjczg0MDVhX2NzX2NvbnRyb2wsIC8qIFVzZSBleHRlcm5hbCBjaGlwIHNlbGVjdCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dCBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQKaW5kZXggZjM5YzlkNy4uYTJhZmNhMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0CkBAIC02Miw5ICs2Miw2IEBACiAgICAgICAtIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIGNhbiBjb250YWluIGRpZmZlcmVudCBmaWVsZHMKICAgICAgIC0gU29tZSBmdW5jdGlvbnMgbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBhdCBhbGwsIChpLmUuIHNvbWUgbG9ja3MKIAljb21waWxlIGF3YXkgdG8gbm90aGluZyBmb3Igbm9uLVNNUCBidWlsZHMuKQotICAgICAgLSBQYXJhbWV0ZXIgcGFzc2luZyBvZiB2YXJpYWJsZXMgZnJvbSBmdW5jdGlvbiB0byBmdW5jdGlvbiBjYW4gYmUKLQlkb25lIGluIGRpZmZlcmVudCB3YXlzICh0aGUgQ09ORklHX1JFR1BBUk0gb3B0aW9uIGNvbnRyb2xzCi0JdGhpcy4pCiAgICAgICAtIE1lbW9yeSB3aXRoaW4gdGhlIGtlcm5lbCBjYW4gYmUgYWxpZ25lZCBpbiBkaWZmZXJlbnQgd2F5cywKIAlkZXBlbmRpbmcgb24gdGhlIGJ1aWxkIG9wdGlvbnMuCiAgIC0gTGludXggcnVucyBvbiBhIHdpZGUgcmFuZ2Ugb2YgZGlmZmVyZW50IHByb2Nlc3NvciBhcmNoaXRlY3R1cmVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dCBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKaW5kZXggMDJhNDgxMi4uYzgxNWM1MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CkBAIC01MCw3ICs1MCw3IEBACiAgICBDb250YWN0IHRoZSBrZXJuZWwgc2VjdXJpdHkgdGVhbSBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgcHJvY2VkdXJlLgogCiAKLVJldmlldyBjb21taXR0ZToKK1JldmlldyBjb21taXR0ZWU6CiAKICAtIFRoaXMgaXMgbWFkZSB1cCBvZiBhIG51bWJlciBvZiBrZXJuZWwgZGV2ZWxvcGVycyB3aG8gaGF2ZSB2b2x1bnRlZXJlZCBmb3IKICAgIHRoaXMgdGFzaywgYW5kIGEgZmV3IHRoYXQgaGF2ZW4ndC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dAppbmRleCA1YzNhNTE5Li5hYTk4NmEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9mcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvZnMudHh0CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlyZWFkYWJsZSBieSByb290IG9ubHkuIFRoaXMgYWxsb3dzIHRoZSBlbmQgdXNlciB0byByZW1vdmUKIAlzdWNoIGEgZHVtcCBidXQgbm90IGFjY2VzcyBpdCBkaXJlY3RseS4gRm9yIHNlY3VyaXR5IHJlYXNvbnMKIAljb3JlIGR1bXBzIGluIHRoaXMgbW9kZSB3aWxsIG5vdCBvdmVyd3JpdGUgb25lIGFub3RoZXIgb3IKLQlvdGhlciBmaWxlcy4gVGhpcyBtb2RlIGlzIGFwcHJvcHJpYXRlIHdoZW4gYWRtaW5zdHJhdG9ycyBhcmUKKwlvdGhlciBmaWxlcy4gVGhpcyBtb2RlIGlzIGFwcHJvcHJpYXRlIHdoZW4gYWRtaW5pc3RyYXRvcnMgYXJlCiAJYXR0ZW1wdGluZyB0byBkZWJ1ZyBwcm9ibGVtcyBpbiBhIG5vcm1hbCBlbnZpcm9ubWVudC4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IDBiYzdmMWUuLjU5MjJlODQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtMjcsNiArMjcsNyBAQAogLSBob3RwbHVnCiAtIGphdmEtYXBwbGV0dmlld2VyICAgICAgICAgICBbIGJpbmZtdF9qYXZhLCBvYnNvbGV0ZSBdCiAtIGphdmEtaW50ZXJwcmV0ZXIgICAgICAgICAgICBbIGJpbmZtdF9qYXZhLCBvYnNvbGV0ZSBdCistIGtzdGFja19kZXB0aF90b19wcmludCAgICAgICBbIFg4NiBvbmx5IF0KIC0gbDJjciAgICAgICAgICAgICAgICAgICAgICAgIFsgUFBDIG9ubHkgXQogLSBtb2Rwcm9iZSAgICAgICAgICAgICAgICAgICAgPT0+IERvY3VtZW50YXRpb24va21vZC50eHQKIC0gbXNnbWF4CkBAIC0xNzAsNiArMTcxLDEzIEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK2tzdGFja19kZXB0aF90b19wcmludDogKFg4NiBvbmx5KQorCitDb250cm9scyB0aGUgbnVtYmVyIG9mIHdvcmRzIHRvIHByaW50IHdoZW4gZHVtcGluZyB0aGUgcmF3CitrZXJuZWwgc3RhY2suCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIG9zcmVsZWFzZSwgb3N0eXBlICYgdmVyc2lvbjoKIAogIyBjYXQgb3NyZWxlYXNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKaW5kZXggMjBkMGQ3OS4uZTk2YTM0MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dApAQCAtMTI5LDcgKzEyOSw3IEBACiAKIHpvbmVfcmVjbGFpbV9tb2RlOgogCi1ab25lX3JlY2xhaW1fbW9kZSBhbGxvd3MgdG8gc2V0IG1vcmUgb3IgbGVzcyBhZ3Jlc3NpdmUgYXBwcm9hY2hlcyB0bworWm9uZV9yZWNsYWltX21vZGUgYWxsb3dzIHNvbWVvbmUgdG8gc2V0IG1vcmUgb3IgbGVzcyBhZ2dyZXNzaXZlIGFwcHJvYWNoZXMgdG8KIHJlY2xhaW0gbWVtb3J5IHdoZW4gYSB6b25lIHJ1bnMgb3V0IG9mIG1lbW9yeS4gSWYgaXQgaXMgc2V0IHRvIHplcm8gdGhlbiBubwogem9uZSByZWNsYWltIG9jY3Vycy4gQWxsb2NhdGlvbnMgd2lsbCBiZSBzYXRpc2ZpZWQgZnJvbSBvdGhlciB6b25lcyAvIG5vZGVzCiBpbiB0aGUgc3lzdGVtLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91bWwvVXNlck1vZGVMaW51eC1IT1dUTy50eHQgYi9Eb2N1bWVudGF0aW9uL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dAppbmRleCBiNjA1OTBlLi42MjgwMTNmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VtbC9Vc2VyTW9kZUxpbnV4LUhPV1RPLnR4dApAQCAtMTQ3Nyw3ICsxNDc3LDcgQEAKIAogCiAKLSAgTWFraW5nIGl0IHdvcmxkLXdyaXRlYWJsZSBsb29rcyBiYWQsIGJ1dCBpdCBzZWVtcyBub3QgdG8gYmUKKyAgTWFraW5nIGl0IHdvcmxkLXdyaXRhYmxlIGxvb2tzIGJhZCwgYnV0IGl0IHNlZW1zIG5vdCB0byBiZQogICBleHBsb2l0YWJsZSBhcyBhIHNlY3VyaXR5IGhvbGUuICBIb3dldmVyLCBpdCBkb2VzIGFsbG93IGFueW9uZSB0byBjcmUtCiAgIGF0ZSB1c2VsZXNzIHRhcCBkZXZpY2VzICh1c2VsZXNzIGJlY2F1c2UgdGhleSBjYW4ndCBjb25maWd1cmUgdGhlbSksCiAgIHdoaWNoIGlzIGEgRE9TIGF0dGFjay4gIEEgc29tZXdoYXQgbW9yZSBzZWN1cmUgYWx0ZXJuYXRpdmUgd291bGQgdG8gYmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL2hpZGRldi50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9oaWRkZXYudHh0CmluZGV4IDZhNzkwNzUuLjZlOGM5ZjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL2hpZGRldi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvaGlkZGV2LnR4dApAQCAtOCw3ICs4LDcgQEAKIGV4YW1wbGVzIGZvciB0aGlzIGFyZSBwb3dlciBkZXZpY2VzIChlc3BlY2lhbGx5IHVuaW50ZXJydXB0YWJsZSBwb3dlcgogc3VwcGxpZXMpIGFuZCBtb25pdG9yIGNvbnRyb2wgb24gaGlnaGVyIGVuZCBtb25pdG9ycy4KIAotVG8gc3VwcG9ydCB0aGVzZSBkaXNwYXJpdGUgcmVxdWlyZW1lbnRzLCB0aGUgTGludXggVVNCIHN5c3RlbSBwcm92aWRlcworVG8gc3VwcG9ydCB0aGVzZSBkaXNwYXJhdGUgcmVxdWlyZW1lbnRzLCB0aGUgTGludXggVVNCIHN5c3RlbSBwcm92aWRlcwogSElEIGV2ZW50cyB0byB0d28gc2VwYXJhdGUgaW50ZXJmYWNlczoKICogdGhlIGlucHV0IHN1YnN5c3RlbSwgd2hpY2ggY29udmVydHMgSElEIGV2ZW50cyBpbnRvIG5vcm1hbCBpbnB1dAogZGV2aWNlIGludGVyZmFjZXMgKHN1Y2ggYXMga2V5Ym9hcmQsIG1vdXNlIGFuZCBqb3lzdGljaykgYW5kIGEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3Jpby50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi9yaW8udHh0CmluZGV4IGFiMjFkYjQuLmFlZTcxNWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL3Jpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvcmlvLnR4dApAQCAtMjQsMTAgKzI0LDEwIEBACiBpbmNvbnNlcXVlbnRpYWwuCiAKIEl0IHNlZW1zIHRoYXQgdGhlIFJpbyBoYXMgYSBwcm9ibGVtIHdoZW4gc2VuZGluZyAubXAzIHdpdGggbG93IGJhdHRlcmllcy4KLUkgc3VnZ2VzdCB3aGVuIHRoZSBiYXR0ZXJpZXMgYXJlIGxvdyBhbmQgd2FudCB0byB0cmFuc2ZlciBzdHVmZiB0aGF0IHlvdQorSSBzdWdnZXN0IHdoZW4gdGhlIGJhdHRlcmllcyBhcmUgbG93IGFuZCB5b3Ugd2FudCB0byB0cmFuc2ZlciBzdHVmZiB0aGF0IHlvdQogcmVwbGFjZSBpdCB3aXRoIGEgZnJlc2ggb25lLiBJbiBteSBjYXNlLCB3aGF0IGhhcHBlbmVkIGlzIEkgbG9zdCB0d28gMTZrYgogYmxvY2tzICh0aGV5IGFyZSBubyBsb25nZXIgdXNhYmxlIHRvIHN0b3JlIGluZm9ybWF0aW9uIHRvIGl0KS4gQnV0IEkgZG9uJ3QKLWtub3cgaWYgdGhhdHMgbm9ybWFsIG9yIG5vdC4gSXQgY291bGQgc2ltcGx5IGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBmbGFzaCAKK2tub3cgaWYgdGhhdCdzIG5vcm1hbCBvciBub3Q7IGl0IGNvdWxkIHNpbXBseSBiZSBhIHByb2JsZW0gd2l0aCB0aGUgZmxhc2ggCiBtZW1vcnkuCiAKIEluIGFuIGV4dHJlbWUgY2FzZSwgSSBsZWZ0IG15IFJpbyBwbGF5aW5nIG92ZXJuaWdodCBhbmQgdGhlIGJhdHRlcmllcyB3b3JlIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dAppbmRleCA4ZGMyYmFjLi5kNjFmNmU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dApAQCAtMTc1LDcgKzE3NSw3IEBACiAgIAogICBDdXJyZW50IHN0YXR1czoKICAgICBUaGUgVVNBLTE4WCwgVVNBLTI4WCwgVVNBLTE5LCBVU0EtMTlXIGFuZCBVU0EtNDlXIGFyZSBzdXBwb3J0ZWQgYW5kCi0gICAgaGF2ZSBiZWVuIHByZXR0eSB0aHJvdWdobHkgdGVzdGVkIGF0IHZhcmlvdXMgYmF1ZCByYXRlcyB3aXRoIDgtTi0xCisgICAgaGF2ZSBiZWVuIHByZXR0eSB0aG9yb3VnaGx5IHRlc3RlZCBhdCB2YXJpb3VzIGJhdWQgcmF0ZXMgd2l0aCA4LU4tMQogICAgIGNoYXJhY3RlciBzZXR0aW5ncy4gIE90aGVyIGNoYXJhY3RlciBsZW5ndGhzIGFuZCBwYXJpdHkgc2V0dXBzIGFyZQogICAgIHByZXNlbnRseSB1bnRlc3RlZC4KIApAQCAtMjUzLDcgKzI1Myw3IEBACiAJdG9nZXRoZXIgd2l0aG91dCBoYWNraW5nIHRoZSBhZGFwdGVyIHRvIHNldCB0aGUgbGluZSBoaWdoLgogCiAJVGhlIGRyaXZlciBpcyBzbXAgc2FmZS4gIFBlcmZvcm1hbmNlIHdpdGggdGhlIGRyaXZlciBpcyByYXRoZXIgbG93IHdoZW4gdXNpbmcKLQlpdCBmb3IgdHJhbnNmZXJpbmcgZmlsZXMuICBUaGlzIGlzIGJlaW5nIHdvcmtlZCBvbiwgYnV0IEkgd291bGQgYmUgd2lsbGluZyB0bworCWl0IGZvciB0cmFuc2ZlcnJpbmcgZmlsZXMuICBUaGlzIGlzIGJlaW5nIHdvcmtlZCBvbiwgYnV0IEkgd291bGQgYmUgd2lsbGluZyB0bwogCWFjY2VwdCBwYXRjaGVzLiAgQW4gdXJiIHF1ZXVlIG9yIHBhY2tldCBidWZmZXIgd291bGQgbGlrZWx5IGZpdCB0aGUgYmlsbCBoZXJlLgogCiAJSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucywgcHJvYmxlbXMsIHBhdGNoZXMsIGZlYXR1cmUgcmVxdWVzdHMsIGV0Yy4geW91IGNhbgpAQCAtMjk3LDcgKzI5Nyw3IEBACiAgICAgICBQYXJpdHkgICAgICAgTixFLE8sTSxTCiAgICAgICBIYW5kc2hha2UgICAgTm9uZSwgU29mdHdhcmUgKFhPTi9YT0ZGKSwgSGFyZHdhcmUgKENUU1JUUyxDVFNEVFIpKgogICAgICAgQnJlYWsgICAgICAgIFNldCBhbmQgY2xlYXIKLSAgICAgIExpbmUgY29udHJsICBJbnB1dC9PdXRwdXQgcXVlcnkgYW5kIGNvbnRyb2wgKioKKyAgICAgIExpbmUgY29udHJvbCBJbnB1dC9PdXRwdXQgcXVlcnkgYW5kIGNvbnRyb2wgKioKIAogICAgICAgKiAgSGFyZHdhcmUgaW5wdXQgZmxvdyBjb250cm9sIGlzIG9ubHkgZW5hYmxlZCBmb3IgZmlybXdhcmUKICAgICAgICAgIGxldmVscyBhYm92ZSAyLjA2LiAgUmVhZCBzb3VyY2UgY29kZSBjb21tZW50cyBkZXNjcmliaW5nIEJlbGtpbgpAQCAtMzA5LDcgKzMwOSw3IEBACiAgICAgICAgICBhdXRvbWF0aWMgaGFyZHdhcmUgZmxvdyBjb250cm9sLgogCiAgIFRPIERPIExpc3Q6Ci0gICAgLS0gQWRkIHRydWUgbW9kZW0gY29udG9sIGxpbmUgcXVlcnkgY2FwYWJpbGl0eS4gIEN1cnJlbnRseSB0cmFja3MgdGhlCisgICAgLS0gQWRkIHRydWUgbW9kZW0gY29udHJvbCBsaW5lIHF1ZXJ5IGNhcGFiaWxpdHkuICBDdXJyZW50bHkgdHJhY2tzIHRoZQogICAgICAgIHN0YXRlcyByZXBvcnRlZCBieSB0aGUgaW50ZXJydXB0IGFuZCB0aGUgc3RhdGVzIHJlcXVlc3RlZC4KICAgICAtLSBBZGQgZXJyb3IgcmVwb3J0aW5nIGJhY2sgdG8gYXBwbGljYXRpb24gZm9yIFVBUlQgZXJyb3IgY29uZGl0aW9ucy4KICAgICAtLSBBZGQgc3VwcG9ydCBmb3IgZmx1c2ggaW9jdGxzLgpAQCAtNDI4LDEyICs0MjgsNiBAQAogICBTZWUgaHR0cDovL3d3dy51dWhhdXMuZGUvbGludXgvcGFsbWNvbm5lY3QuaHRtbCBmb3IgdXAtdG8tZGF0ZQogICBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlci4KIAotQUlSY2FibGUgVVNCIERvbmdsZSBCbHVldG9vdGggZHJpdmVyCi0gIElmIHRoZXJlIGlzIHRoZSBjZGNfYWNtIGRyaXZlciBsb2FkZWQgaW4gdGhlIHN5c3RlbSwgeW91IHdpbGwgZmluZCB0aGF0IHRoZQotICBjZGNfYWNtIGNsYWltcyB0aGUgZGV2aWNlIGJlZm9yZSBBSVJjYWJsZSBjYW4uIFRoaXMgaXMgc2ltcGx5IGNvcnJlY3RlZAotICBieSB1bmxvYWRpbmcgYm90aCBtb2R1bGVzIGFuZCB0aGVuIGxvYWRpbmcgdGhlIGFpcmNhYmxlIG1vZHVsZSBiZWZvcmUKLSAgY2RjX2FjbSBtb2R1bGUKLQogR2VuZXJpYyBTZXJpYWwgZHJpdmVyCiAKICAgSWYgeW91ciBkZXZpY2UgaXMgbm90IG9uZSBvZiB0aGUgYWJvdmUgbGlzdGVkIGRldmljZXMsIGNvbXBhdGlibGUgd2l0aApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CmluZGV4IDEyNmU1OWQ5Li42MmUzMmI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CkBAIC00Myw3ICs0Myw3IEBACiAgNDIgLT4gZGlnaXRhbG5vdyBETlRWIExpdmUhIERWQi1UIFBybyAgICAgICAgICAgICAgICAgICAgIFsxODIyOjAwMjUsMTgyMjowMDE5XQogIDQzIC0+IEtXb3JsZC9WU3RyZWFtIFhQZXJ0IERWQi1UIHdpdGggY3gyMjcwMiAgICAgICAgICAgICBbMTdkZTowOGExLDEyYWI6MjMwMF0KICA0NCAtPiBEVmlDTyBGdXNpb25IRFRWIERWQi1UIER1YWwgRGlnaXRhbCAgICAgICAgICAgICAgICAgWzE4YWM6ZGI1MCwxOGFjOmRiNTRdCi0gNDUgLT4gS1dvcmxkIEhhcmR3YXJlTXBlZ1RWIFhQZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgIFsxN2RlOjA4NDBdCisgNDUgLT4gS1dvcmxkIEhhcmR3YXJlTXBlZ1RWIFhQZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgIFsxN2RlOjA4NDAsMTQyMTowMzA1XQogIDQ2IC0+IERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgSHlicmlkICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkYjQwLDE4YWM6ZGI0NF0KICA0NyAtPiBwY0hEVFYgSEQ1NTAwIEhEVFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzcwNjM6NTUwMF0KICA0OCAtPiBLd29ybGQgTUNFIDIwMCBEZWx1eGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE3ZGU6MDg0MV0KQEAgLTUxLDcgKzUxLDcgQEAKICA1MCAtPiBOUEcgVGVjaCBSZWFsIFRWIEZNIFRvcCAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgWzE0ZjE6MDg0Ml0KICA1MSAtPiBXaW5GYXN0IERUVjIwMDAgSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwN2Q6NjY1ZV0KICA1MiAtPiBHZW5pYXRlY2ggRFZCLVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE0ZjE6MDA4NF0KLSA1MyAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMzAwMCBUcmlNb2RlIEFuYWxvZy9EVkItUy9EVkItVCAgWzAwNzA6MTQwNF0KKyA1MyAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMzAwMCBUcmlNb2RlIEFuYWxvZy9EVkItUy9EVkItVCAgWzAwNzA6MTQwNCwwMDcwOjE0MDAsMDA3MDoxNDAxLDAwNzA6MTQwMl0KICA1NCAtPiBOb3J3b29kIE1pY3JvIFRWIFR1bmVyCiAgNTUgLT4gU2hlbnpoZW4gVHVuZ3N0ZW4gQWdlcyBUZWNoIFRFLURUVi0yNTAgLyBTd2FubiBPRU0gIFtjMTgwOmM5ODBdCiAgNTYgLT4gSGF1cHBhdWdlIFdpblRWLUhWUjEzMDAgRFZCLVQvSHlicmlkIE1QRUcgRW5jb2RlciAgIFswMDcwOjk2MDAsMDA3MDo5NjAxLDAwNzA6OTYwMl0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAppbmRleCA1M2NlNmEzLi5mNjIwMWNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CkBAIC03Niw3ICs3Niw3IEBACiAgNzUgLT4gQVZlck1lZGlhIEFWZXJUVkhEIE1DRSBBMTgwICAgICAgICAgICAgICBbMTQ2MToxMDQ0XQogIDc2IC0+IFNLTmV0IE1vbnN0ZXJUViBNb2JpbGUgICAgICAgICAgICAgICAgICAgWzExMzE6NGVlOV0KICA3NyAtPiBQaW5uYWNsZSBQQ1RWIDQwaS81MGkvMTEwaSAoc2FhNzEzMykgICAgIFsxMWJkOjAwMmVdCi0gNzggLT4gQVNVU1RlSyBQNzEzMSBEdWFsICAgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODYyXQorIDc4IC0+IEFTVVNUZUsgUDcxMzEgRHVhbCAgICAgICAgICAgICAgICAgICAgICAgWzEwNDM6NDg2MiwxMDQzOjQ4NzZdCiAgNzkgLT4gU2VkbmEvTXVjaFRWIFBDIFRWIENhcmRidXMgVFYvUmFkaW8gKElUTzI1IFJldjoyQikKICA4MCAtPiBBU1VTIERpZ2ltYXRyaXggVFYgICAgICAgICAgICAgICAgICAgICAgIFsxMDQzOjAyMTBdCiAgODEgLT4gUGhpbGlwcyBUaWdlciByZWZlcmVuY2UgZGVzaWduICAgICAgICAgICBbMTEzMToyMDE4XQpAQCAtOTksMyArOTksOCBAQAogIDk4IC0+IFByb3RldXMgUHJvIDIzMDkgICAgICAgICAgICAgICAgICAgICAgICAgWzA5MTk6MjAwM10KICA5OSAtPiBBVmVyTWVkaWEgVFYgSHlicmlkIEExNkFSICAgICAgICAgICAgICAgIFsxNDYxOjJjMDBdCiAxMDAgLT4gQXN1cyBFdXJvcGEyIE9FTSAgICAgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODYwXQorMTAxIC0+IFBpbm5hY2xlIFBDVFYgMzEwaSAgICAgICAgICAgICAgICAgICAgICAgWzExYmQ6MDAyZl0KKzEwMiAtPiBBdmVybWVkaWEgQVZlclRWIFN0dWRpbyA1MDcgICAgICAgICAgICAgIFsxNDYxOjk3MTVdCisxMDMgLT4gQ29tcHJvIFZpZGVvbWF0ZSBEVkItVDIwMEEKKzEwNCAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTExMCBEVkItVC9IeWJyaWQgICAgIFswMDcwOjY3MDFdCisxMDUgLT4gVGVycmF0ZWMgQ2luZXJneSBIVCBQQ01DSUEgICAgICAgICAgICAgICBbMTUzYjoxMTcyXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jYWZlX2NjaWMgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2NhZmVfY2NpYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODgyMTAyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jYWZlX2NjaWMKQEAgLTAsMCArMSw1NCBAQAorImNhZmVfY2NpYyIgaXMgYSBkcml2ZXIgZm9yIHRoZSBNYXJ2ZWxsIDg4QUxQMDEgImNhZmUiIENNT1MgY2FtZXJhCitjb250cm9sbGVyLiAgVGhpcyBpcyB0aGUgY29udHJvbGxlciBmb3VuZCBpbiBmaXJzdC1nZW5lcmF0aW9uIE9MUEMgc3lzdGVtcywKK2FuZCB0aGlzIGRyaXZlciB3YXMgd3JpdHRlbiB3aXRoIHN1cHBvcnQgZnJvbSB0aGUgT0xQQyBwcm9qZWN0LgorCitDdXJyZW50IHN0YXR1czogdGhlIGNvcmUgZHJpdmVyIHdvcmtzLiAgSXQgY2FuIGdlbmVyYXRlIGRhdGEgaW4gWVVWNDIyLAorUkdCNTY1LCBhbmQgUkdCNDQ0IGZvcm1hdHMuICAoQW55Ym9keSBsb29raW5nIGF0IHRoZSBjb2RlIHdpbGwgc2VlIFJHQjMyIGFzCit3ZWxsLCBidXQgdGhhdCBpcyBhIGRlYnVnZ2luZyBhaWQgd2hpY2ggd2lsbCBiZSByZW1vdmVkIHNob3J0bHkpLiAgVkdBIGFuZAorUVZHQSBtb2RlcyB3b3JrOyBDSUYgaXMgdGhlcmUgYnV0IHRoZSBjb2xvcnMgcmVtYWluIGZ1bmt5LiAgT25seSB0aGUgT1Y3NjcwCitzZW5zb3IgaXMga25vd24gdG8gd29yayB3aXRoIHRoaXMgY29udHJvbGxlciBhdCB0aGlzIHRpbWUuCisKK1RvIHRyeSBpdCBvdXQ6IGVpdGhlciBvZiB0aGVzZSBjb21tYW5kcyB3aWxsIHdvcms6CisKKyAgICAgbXBsYXllciB0djovLyAtdHYgZHJpdmVyPXY0bDI6d2lkdGg9NjQwOmhlaWdodD00ODAgLW5vc291bmQKKyAgICAgbXBsYXllciB0djovLyAtdHYgZHJpdmVyPXY0bDI6d2lkdGg9NjQwOmhlaWdodD00ODA6b3V0Zm10PWJncjE2IC1ub3NvdW5kCisKK1RoZSAieGF3dHYiIHV0aWxpdHkgYWxzbyB3b3JrczsgZ3FjYW0gZG9lcyBub3QsIGZvciB1bmtub3duIHJlYXNvbnMuCisKK1RoZXJlIGFyZSBhIGZldyBsb2FkLXRpbWUgb3B0aW9ucywgbW9zdCBvZiB3aGljaCBjYW4gYmUgY2hhbmdlZCBhZnRlcgorbG9hZGluZyB2aWEgc3lzZnMgYXMgd2VsbDoKKworIC0gYWxsb2NfYnVmc19hdF9sb2FkOiAgTm9ybWFsbHksIHRoZSBkcml2ZXIgd2lsbCBub3QgYWxsb2NhdGUgYW55IERNQQorICAgYnVmZmVycyB1bnRpbCB0aGUgdGltZSBjb21lcyB0byB0cmFuc2ZlciBkYXRhLiAgSWYgdGhpcyBvcHRpb24gaXMgc2V0LAorICAgdGhlbiB3b3JzdC1jYXNlLXNpemVkIGJ1ZmZlcnMgd2lsbCBiZSBhbGxvY2F0ZWQgYXQgbW9kdWxlIGxvYWQgdGltZS4KKyAgIFRoaXMgb3B0aW9uIG5haWxzIGRvd24gdGhlIG1lbW9yeSBmb3IgdGhlIGxpZmUgb2YgdGhlIG1vZHVsZSwgYnV0CisgICBwZXJoYXBzIGRlY3JlYXNlcyB0aGUgY2hhbmNlcyBvZiBhbiBhbGxvY2F0aW9uIGZhaWx1cmUgbGF0ZXIgb24uCisKKyAtIGRtYV9idWZfc2l6ZTogVGhlIHNpemUgb2YgRE1BIGJ1ZmZlcnMgdG8gYWxsb2NhdGUuICBOb3RlIHRoYXQgdGhpcworICAgb3B0aW9uIGlzIG9ubHkgY29uc3VsdGVkIGZvciBsb2FkLXRpbWUgYWxsb2NhdGlvbjsgd2hlbiBidWZmZXJzIGFyZQorICAgYWxsb2NhdGVkIGF0IHJ1biB0aW1lLCB0aGV5IHdpbGwgYmUgc2l6ZWQgYXBwcm9wcmlhdGVseSBmb3IgdGhlIGN1cnJlbnQKKyAgIGNhbWVyYSBzZXR0aW5ncy4KKworIC0gbl9kbWFfYnVmczogVGhlIGNvbnRyb2xsZXIgY2FuIGN5Y2xlIHRocm91Z2ggZWl0aGVyIHR3byBvciB0aHJlZSBETUEKKyAgIGJ1ZmZlcnMuICBOb3JtYWxseSwgdGhlIGRyaXZlciB0cmllcyB0byB1c2UgdGhyZWUgYnVmZmVyczsgb24gZmFzdGVyCisgICBzeXN0ZW1zLCBob3dldmVyLCBpdCB3aWxsIHdvcmsgd2VsbCB3aXRoIG9ubHkgdHdvLgorCisgLSBtaW5fYnVmZmVyczogVGhlIG1pbmltdW0gbnVtYmVyIG9mIHN0cmVhbWluZyBJL08gYnVmZmVycyB0aGF0IHRoZSBkcml2ZXIKKyAgIHdpbGwgY29uc2VudCB0byB3b3JrIHdpdGguICBEZWZhdWx0IGlzIG9uZSwgYnV0LCBvbiBzbG93ZXIgc3lzdGVtcywKKyAgIGJldHRlciBiZWhhdmlvciB3aXRoIG1wbGF5ZXIgY2FuIGJlIGFjaGlldmVkIGJ5IHNldHRpbmcgdG8gYSBoaWdoZXIKKyAgIHZhbHVlIChsaWtlIHNpeCkuCisKKyAtIG1heF9idWZmZXJzOiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtaW5nIEkvTyBidWZmZXJzOyBkZWZhdWx0IGlzCisgICB0ZW4uICBUaGF0IG51bWJlciB3YXMgY2FyZWZ1bGx5IHBpY2tlZCBvdXQgb2YgYSBoYXQgYW5kIHNob3VsZCBub3QgYmUKKyAgIGFzc3VtZWQgdG8gYWN0dWFsbHkgbWVhbiBtdWNoIG9mIGFueXRoaW5nLgorCisgLSBmbGlwOiBJZiB0aGlzIGJvb2xlYW4gcGFyYW1ldGVyIGlzIHNldCwgdGhlIHNlbnNvciB3aWxsIGJlIGluc3RydWN0ZWQgdG8KKyAgIGludmVydCB0aGUgdmlkZW8gaW1hZ2UuICBXaGV0aGVyIGl0IG1ha2VzIHNlbnNlIGlzIGRldGVybWluZWQgYnkgaG93CisgICB5b3VyIHBhcnRpY3VsYXIgY2FtZXJhIGlzIG1vdW50ZWQuCisKK1dvcmsgaXMgb25nb2luZyB3aXRoIHRoaXMgZHJpdmVyLCBzdGF5IHR1bmVkLgorCitqb24KKworSm9uYXRoYW4gQ29yYmV0Citjb3JiZXRAbHduLm5ldApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96cjM2MTIwLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvenIzNjEyMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWMyZDAuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96cjM2MTIwLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi1Ecml2ZXIgZm9yIFRydXN0IENvbXB1dGVyIFByb2R1Y3RzIEZyYW1lZ3JhYmJlciwgdmVyc2lvbiAwLjYuMQotLS0tLS0tIC0tLSAtLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0gIC0tLS0tLS0gLSAtIC0KLQotLSBaT1JBTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBBdXRob3I6IFBhdWxpbmUgTWlkZGVsaW5rIDxtaWRkZWxpbkBwb2x5d2FyZS5ubD4KLSAgIERhdGU6IDE4IFNlcHRlbWJlciAxOTk5Ci1WZXJzaW9uOiAwLjYuMQotCi0tIERlc2NyaXB0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1WaWRlbzRMaW51eCBjb21wYXRpYmxlIGRyaXZlciBmb3IgYW4gdW5rbm93biBicmFuZCBmcmFtZWdyYWJiZXIKLShTb2xkIGluIHRoZSBOZXRoZXJsYW5kcyBieSBUUlVTVCBDb21wdXRlciBQcm9kdWN0cykgYW5kIHZhcmlvdXMKLW90aGVyIHpvcmFuIHpyMzYxMjAgYmFzZWQgZnJhbWVncmFiYmVycy4KLQotVGhlIGNhcmQgY29udGFpbnMgYSBaUjM2MTIwIE11bHRpbWVkaWEgUENJIEludGVyZmFjZSBhbmQgYSBQaGlsaXBzCi1TQUE3MTEwIE9uZWNoaXAgRnJvbnRlbmQgdmlkZW9kZWNvZGVyLiBUaGVyZSBpcyBhbHNvIGFuIERTUCBvZgotd2hpY2ggSSBoYXZlIGZvcmdvdHRlbiB0aGUgbnVtYmVyLCBzaW5jZSBpIHdpbGwgbmV2ZXIgZ2V0IHRoYXQgdGhpbmcKLXRvIHdvcmsgd2l0aG91dCBzcGVjcyBmcm9tIHRoZSB2ZW5kb3IgaXRzZWxmLgotCi1UaGUgU0FBNzExeCBhcmUgY2FwYWJsZSBvZiBwcm9jZXNzaW5nIDYgZGlmZmVyZW50IHZpZGVvIGlucHV0cywKLUNWQlMxLi42IGFuZCBZMStDMSwgWTIrQzIsIFkzK0MzLiBBbGwgaW4gNTAvNjBIeiwgTlRTQywgUEFMIG9yCi1TRUNBTSBhbmQgZGVsaXZlcmluZyBhIFlVViBkYXRhc3RyZWFtLiAgT24gbXkgY2FyZCB0aGUgaW5wdXQKLSdDVkJTLTAnIGNvcnJlc3BvbmRzIHRvIGNoYW5uZWwgQ1ZCUzIgYW5kICdTLVZpZGVvJyB0byBZMitDMi4KLQotSSBoYXZlIHNvbWUgcmVwb3J0cyBvZiBvdGhlciBjYXJkcyB3b3JraW5nIHdpdGggdGhlIG1lbnRpb25lZAotY2hpcCBzZXRzLiBGb3IgYSBsaXN0IG9mIG90aGVyIHdvcmtpbmcgY2FyZHMgcGxlYXNlIGhhdmUgYSBsb29rCi1hdCB0aGUgY2FyZHMgbmFtZWQgaW4gdGhlIHR2Y2FyZHMgc3RydWN0IGluIHRoZSBiZWdpbm5pbmcgb2YKLXpyMzYxMjAuYwotCi1BZnRlciBzb21lIHRlc3RpbmcsIEkgZGlzY292ZXJlZCB0aGF0IHRoZSBjYXJkZGVzaWduZXIgbWVzc2VkIHVwCi1vbiB0aGUgSTJDIGludGVyZmFjZS4gVGhlIFpvcmFuIGNoaXAgaW5jbHVkZXMgMiBsaW5lcyBTREEgYW5kIFNDTAotd2hpY2ggKHMpaGUgY29ubmVjdGVkIHJldmVyc2VseS4gU28gd2UgaGF2ZSB0byBjbG9jayBvbiB0aGUgU0RBCi1hbmQgci93IGRhdGEgb24gdGhlIFNDTCBwaW4uIExpZmUgaXMgZnVuLi4uIEVhY2ggY2FyZHR5cGUgbm93IGhhcwotYSBiaXQgd2hpY2ggc2lnbmlmaWVzIGlmIHlvdSBoYXZlIGEgY2FyZCB3aXRoIHRoZSBzYW1lIGRlZmljaWVuY3kuCi0KLU9oLCBmb3IgdGhlIGNvbXBsZXRlbmVzcyBvZiB0aGlzIHN0b3J5IEkgbXVzdCBtZW50aW9uIHRoYXQgbXkKLWNhcmQgZGVsaXZlcnMgdGhlIFZTWU5DIHB1bHNlIG9mIHRoZSBTQUEgY2hpcCB0byBHSVJRMSwgbm90Ci1HSVJRMCBhcyBzb21lIG90aGVyIGNhcmRzIGhhdmUuIFRoaXMgaXMgYWxzbyBpbmNvcnBvcmF0ZWQgaW4KLXRoZSBkcml2ZXIgYmUgY2xlYXJpbmcvc2V0dGluZyB0aGUgJ3VzZWlycTEnIGJpdCBpbiB0aGUgdHZjYXJkCi1kZXNjcmlwdGlvbi4KLQotQW5vdGhlciBwcm9ibGVtcyBvZiBjb250aW51b3VzIGNhcHR1cmluZyBkYXRhIHdpdGggYSBab3JhbiBjaGlwCi1pcyBzb21ldGhpbmcgbmFzdHkgaW5zaWRlIHRoZSBjaGlwLiBJdCBlZmZlY3RpdmVseSBoYWx2ZXMgdGhlCi1mcHMgd2Ugb3VnaHQgdG8gZ2V0Li4uIEhlcmUgaXMgdGhlIHNjZW5hcmlvOiBjYXB0dXJpbmcgZnJhbWVzCi10byBtZW1vcnkgaXMgZG9uZSBpbiB0aGUgc28tY2FsbGVkIHNuYXBzaG90IG1vZGUuIEluIHRoaXMgbW9kZQotdGhlIFpvcmFuIHN0b3BzIGFmdGVyIGNhcHR1cmluZyBhIGZyYW1lIHdvcnRoIG9mIGRhdGEgYW5kIHdhaXQKLXRpbGwgdGhlIGFwcGxpY2F0aW9uIHNldCBHUkFCIGJpdCB0byBpbmRpY2F0ZSByZWFkaW5lc3MgZm9yIHRoZQotbmV4dCBmcmFtZS4gQWZ0ZXIgZGV0ZWN0aW5nIGEgc2V0IGJpdCwgdGhlIGNoaXAgbmVhdGx5IHdhaXRzCi10aWxsIHRoZSBzdGFydCBvZiBhIGZyYW1lLCBjYXB0dXJlcyBpdCBhbmQgaXQgZ29lcyBiYWNrIHRvIG9mZi4KLVNtYXJ0IHBwbCB3aWxsIG5vdGljZSB0aGUgcHJvYmxlbSBoZXJlLiBJdHMgdGhlIHdhaXRpbmcgb24gdGhlCi1fbmV4dF8gZnJhbWUgZWFjaCB0aW1lIHdlIHNldCB0aGUgR1JBQiBiaXQuLi4gT2ggd2VsbCwgMTIsNSBmcHMKLWlzIHN0aWxsIHBsZW50eSBmYXN0IGZvciBtZS4KLS0tIHVwZGF0ZSAyOC83LzE5OTkgLS0KLURvbid0IGJlbGlldmUgYSB3b3JkIEkganVzdCBzYWlkLi4uIFByb29mIGlzIHRoZSBvdXRwdXQKLW9mIGBzdHJlYW1lciAtdCAzMDAgLXIgMjUgLWYgYXZpMTUgLW8gL2Rldi9udWxsYAotCSsrLS0rLSstKy0rLSstKy0rLSstKy0rLSstKy1zKy0rLSstKy0rLSstKy0rLSstKy0rLSAyNS8yNQotCSstcystKy0rLSstKy0rLSstKy0rLSstKy0rLSstcystKy0rLSstKy0rLSstKy0rLSstKy0gMjUvMjUKLQkrLXMrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLXMrLSstKy0rLSstKy0rLSstKy0rLSstIDI1LzI1Ci0JKy1zKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1zKy0rLSstKy0rLSstKy0rLSstKy0rLSAyNS8yNQotCSstcystKy0rLSstKy0rLSstKy0rLSstKy0rLSstcystKy0rLSstKy0rLSstKy0rLSstKy0gMjUvMjUKLQkrLXMrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLXMrLSstKy0rLSstKy0rLSstKy0rLSstIDI1LzI1Ci0JKy1zKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1zKy0rLSstKy0rLSstKy0rLSstKy0rLSAyNS8yNQotCSstcystKy0rLSstKy0rLSstKy0rLSstKy0rLSstcystKy0rLSstKy0rLSstKy0rLSstKy0gMjUvMjUKLQkrLXMrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLXMrLSstKy0rLSstKy0rLSstKy0rLSstIDI1LzI1Ci0JKy1zKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1zKy0rLSstKy0rLSstKy0rLSstKy0rLSAyNS8yNQotCSstcystKy0rLSstKy0rLSstKy0rLSstKy0rLSstcystKy0rLSstKy0rLSstKy0rLSstKy0gMjUvMjUKLQkrLXMrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLXMrLSstKy0rLSstKy0rLSstKy0rLSstCi0Jc3luY2VyOiBkb25lCi0Jd3JpdGVyOiBkb25lCi0obm90ZSB0aGUgL2Rldi9udWxsIGlzIHBydWRlbnQgaGVyZSwgbXkgc3lzdGVtIGlzIG5vdCBhYmxlIHRvCi0gZ3JhYiAvYW5kLyB3cml0ZSAyNSBmcHMgdG8gYSBmaWxlLi4uIGdpZnRzIHdlbGNvbWUgOikgKQotVGhlIHRlY2huaWNhbCByZWFzb25pbmcgZm9sbG93czogVGhlIHpvcmFuIGNvbXBsZXRlZCB0aGUgbGFzdAotZnJhbWUsIHRoZSBWU1lOQyBnb2VzIGxvdywgYW5kIEdSQUIgaXMgY2xlYXJlZC4gVGhlIGludGVycnVwdAotcm91dGluZSBzdGFydHMgdG8gd29yayBzaW5jZSBpdHMgVlNZTkMgZHJpdmVuLCBhbmQgYWdhaW4KLWFjdGl2YXRlcyB0aGUgR1JBQiBiaXQuIEEgZmV3IG1zIGxhdGVyIHRoZSBWU1lOQyAocmUtKXJpc2VzIGFuZAotdGhlIHpvcmFuIHN0YXJ0cyB0byB3b3JrIG9uIGEgbmV3IGFuZCBmcmVzaGx5IGJyb2FkY2FzdGVkIGZyYW1lLi4uLgotCi1Gb3IgcG9pbnRlcnMgSSB1c2VkIHRoZSBzcGVjcyBvZiBib3RoIGNoaXBzLiBCZWxvdyBhcmUgdGhlIFVSTHM6Ci0gIGh0dHA6Ly93d3cuem9yYW4uY29tL2Z0cC9kb3dubG9hZC9kZXZpY2VzL3BjaS9aUjM2MTIwLzM2MTIwZGF0YS5wZGYKLSAgaHR0cDovL3d3dy11cy5zZW1pY29uZHVjdG9yLnBoaWxpcHMuY29tL2Fjcm9iYXQvZGF0YXNoZWV0cy9TQUFfNzExMF9BXzEucGRmCi1Tb21lIGFsdGVybmF0aXZlcyBmb3IgdGhlIFBoaWxpcHMgU0FBIDcxMTAgZGF0YXNoZWV0IGFyZToKLSAgaHR0cDovL3d3dy5kYXRhc2hlZXRjYXRhbG9nLmNvbS9kYXRhc2hlZXRzX3BkZi9TL0EvQS83L1NBQTcxMTAuc2h0bWwKLSAgaHR0cDovL3d3dy5kYXRhc2hlZXRhcmNoaXZlLmNvbS9zZWFyY2gucGhwP3NlYXJjaD1TQUE3MTEwJnNUeXBlPXBhcnQKLQotVGhlIGRvY3VtZW50YXRpb24gaGFzIHZlcnkgbGl0dGxlIG9uIGFic29sdXRlIG51bWJlcnMgb3IgdGltaW5ncwotbmVlZGVkIGZvciB0aGUgdmFyaW91cyBtb2Rlcy9yZXNvbHV0aW9ucywgYnV0IHRoZXJlIGFyZSBvdGhlcgotcHJvZ3JhbXMgeW91IGNhbiBib3Jyb3cgdGhvc2UgZnJvbS4KLQotLS0tLS0tIEluc3RhbGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVJlYWQgdGhlIGZpbGUgY2FsbGVkIFRPRE8uICBOb3RlIGl0cyBsb25nIGxpc3Qgb2YgbGltaXRhdGlvbnMuCi0KLUJ1aWxkIGEga2VybmVsIHdpdGggVklERU80TElOVVggZW5hYmxlZC4gQWN0aXZhdGUgdGhlCi1CVDg0OCBkcml2ZXI7IHdlIG5lZWQgdGhpcyBiZWNhdXNlIHdlIGhhdmUgbmVlZCBmb3IgdGhlCi1vdGhlciBtb2R1bGVzIChpMmMgYW5kIHZpZGVvZGV2KSBpdCBlbmFibGVzLgotCi1UbyBpbnN0YWxsIHRoaXMgc29mdHdhcmUsIGV4dHJhY3QgaXQgaW50byBhIHN1aXRhYmxlIGRpcmVjdG9yeS4KLUV4YW1pbmUgdGhlIG1ha2VmaWxlIGFuZCBjaGFuZ2UgYW55dGhpbmcgeW91IGRvbid0IGxpa2UuICBUeXBlICJtYWtlIi4KLQotQWZ0ZXIgbWFraW5nIHRoZSBtb2R1bGVzIGNoZWNrIGlmIHlvdSBoYXZlIHRoZSBtdWNoIG5lZWRlZAotL2Rldi92aWRlbyBkZXZpY2VzLiBJZiBub3QsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyA0IGxpbmVzOgotCW1rbm9kIC9kZXYvdmlkZW8gYyA4MSAwCi0JbWtub2QgL2Rldi92aWRlbzEgYyA4MSAxCi0JbWtub2QgL2Rldi92aWRlbzIgYyA4MSAyCi0JbWtub2QgL2Rldi92aWRlbzMgYyA4MSAzCi0JbWtub2QgL2Rldi92aWRlbzQgYyA4MSA0Ci0KLUFmdGVyIG1ha2luZy9jaGVja2luZyB0aGUgZGV2aWNlcyBkbzoKLQltb2Rwcm9iZSBpMmMKLQltb2Rwcm9iZSB2aWRlb2RldgotCW1vZHByb2JlIHNhYTcxMTAJKG9wdGlvbmFsKQotCW1vZHByb2JlIHNhYTcxMTEJKG9wdGlvbmFsKQotCW1vZHByb2JlIHR1bmVyCQkob3B0aW9uYWwpCi0JaW5zbW9kIHpvcmFuIGNhcmR0eXBlPTxuPgotCi08bj4gaXMgdGhlIGNhcmR0eXBlIG9mIHRoZSBjYXJkIHlvdSBoYXZlLiBUaGUgY2FyZG51bWJlciBjYW4KLWJlIGZvdW5kIGluIHRoZSBzb3VyY2Ugb2YgenIzNjEyMC4gTG9vayBmb3IgdHZjYXJkcy4gSWYgeW91cgotY2FyZCBpcyBub3QgdGhlcmUsIHBsZWFzZSB0cnkgaWYgYW55IG90aGVyIGNhcmQgZ2l2ZXMgc29tZQotcmVzcG9uc2UsIGFuZCBtYWlsIG1lIGlmIHlvdSBnb3QgYSB3b3JraW5nIHR2Y2FyZCBhZGRpdGlvbi4KLQotUFMuIDxUVkNhcmQgZWRpdG9ycyBiZWhvbGQhKQotICAgIERvbid0IGZvcmdldCB0byBzZXQgdmlkZW9faW5wdXQgdG8gdGhlIG51bWJlciBvZiBpbnB1dHMKLSAgICB5b3UgZGVmaW5lZCBpbiB0aGUgdmlkZW9fbXV4IHBhcnQgb2YgdGhlIHR2Y2FyZCBkZWZpbml0aW9uLgotICAgIEl0J3MgYSBjb21tb24gZXJyb3IgdG8gYWRkIGEgY2hhbm5lbCBidXQgbm90IGluY3JlbWVudGluZwotICAgIHZpZGVvX2lucHV0IGFuZCBnZXR0aW5nIGFuZ3J5IHdpdGggbWUvdjRsL2xpbnV4L2xpbnVzIDooCi0KLVlvdSBhcmUgbm93IHJlYWR5IHRvIHRlc3QgdGhlIGZyYW1lZ3JhYmJlciB3aXRoIHlvdXIgZmF2b3JpdGUKLXZpZGVvNGxpbnV4IGNvbXBhdGlibGUgdG9vbAotCi0tLS0tLS0gQXBwbGljYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIGRldmljZSB3b3JrcyB3aXRoIGFsbCBWaWRlbzRMaW51eCBjb21wYXRpYmxlIGFwcGxpY2F0aW9ucywKLWdpdmVuIHRoZSBsaW1pdGF0aW9ucyBpbiB0aGUgVE9ETyBmaWxlLgotCi0tLS0tLS0gQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIHVzZXMgdGhlIFY0TCBpbnRlcmZhY2UgYXMgb2Yga2VybmVsIHJlbGVhc2UgMi4xLjExNiwgYW5kIGluCi1mYWN0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgb24gYW55IGxvd2VyIHZlcnNpb24uICBUaGVyZSBhcmUgYSBjb3VwbGUKLW9mIG1pbm9yIGRpZmZlcmVuY2VzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBhbW91bnQgb2YgZGF0YSByZXR1cm5lZAotd2l0aCBlYWNoIGZyYW1lIHZhcmllcywgYW5kIG5vIGRvdWJ0IHRoZXJlIGFyZSBkaXNjcmVwYW5jaWVzIGR1ZSB0byBteQotbWlzdW5kZXJzdGFuZGluZyBvZiB0aGUgQVBJLiAgSSBpbnRlbmQgdG8gY29udmVydCB0aGlzIGRyaXZlciB0byB0aGUKLW5ldyBWNEwyIEFQSSB3aGVuIGl0IGhhcyBzdGFiaWxpemVkIG1vcmUuCi0KLS0tLS0tLSBDdXJyZW50IHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBvdmVybGF5aW5nIGEgdmlkZW8gaW1hZ2UgaW4gc2NyZWVuLCBhbmQKLWV2ZW4gY2FwYWJsZSBvZiBncmFiYmluZyBmcmFtZXMuIEl0IHVzZXMgdGhlIEJJR1BIWVNBUkVBIHBhdGNoCi10byBhbGxvY2F0ZSBsb3RzIG9mIGxhcmdlIG1lbW9yeSBibG9ja3Mgd2hlbiB0aXMgcGF0Y2ggaXMKLWZvdW5kIGluIHRoZSBrZXJuZWwsIGJ1dCBpdCBkb2Vzbid0IG5lZWQgaXQuCi1UaGUgY29uc2VxdWVuY2UgaXMgdGhhdCwgd2hlbiBsb2FkaW5nIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUsCi10aGUgbW9kdWxlIG1heSB0ZWxsIHlvdSBpdCdzIG91dCBvZiBtZW1vcnksIGJ1dCAnZnJlZScgc2F5cwotb3RoZXJ3aXNlLiBUaGUgcmVhc29uIGlzIHNpbXBsZTsgdGhlIG1vZHVsZXMgd2FudHMgaXRzIG1lbW9yeQotY29udGlndW91cywgbm90IGZyYWdtZW50ZWQsIGFuZCBhZnRlciBhIGxvbmcgdXB0aW1lIHRoZXJlCi1wcm9iYWJseSBpc24ndCBhIGZyYWdtZW50IG9mIG1lbW9yeSBsYXJnZSBlbm91Z2guLi4KLQotVGhlIGRyaXZlciB1c2VzIGEgZG91YmxlIGJ1ZmZlcmluZyBzY2hlbWUsIHdoaWNoIHNob3VsZCByZWFsbHkKLWJlIGFuIG4td2F5IGJ1ZmZlciwgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIGFsbG9jYXRlZCBmcmFtZWJ1ZmZlcgotYW5kIHRoZSByZXF1ZXN0ZWQgZ3JhYi1zaXplL2Zvcm1hdC4KLVRoaXMgY3VycmVudCB2ZXJzaW9uIGFsc28gZml4ZXMgYSBkZWFkLWxvY2sgc2l0dWF0aW9uIGR1cmluZyBpcnEKLXRpbWUsIHdoaWNoIHJlYWxseSwgcmVhbGx5IGZyb3plIG15IHN5c3RlbS4uLiA6KQotCi1Hb29kIGx1Y2suCi0gIFBhdWxpbmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvc3JjL3dhdGNoZG9nLXNpbXBsZS5jIGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy9zcmMvd2F0Y2hkb2ctc2ltcGxlLmMKaW5kZXggODVjZjE3Yy4uNDc4MDFiYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy9zcmMvd2F0Y2hkb2ctc2ltcGxlLmMKKysrIGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy9zcmMvd2F0Y2hkb2ctc2ltcGxlLmMKQEAgLTEsNCArMSw2IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWFwaS50eHQKaW5kZXggN2U4YWU4My4uOGQxNmY2ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1hcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2ctYXBpLnR4dApAQCAtMjE0LDcgKzIxNCw3IEBACiAKIEZpbmFsbHkgdGhlIFNFVE9QVElPTlMgaW9jdGwgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBzb21lIGFzcGVjdHMgb2YKIHRoZSBjYXJkcyBvcGVyYXRpb247IHJpZ2h0IG5vdyB0aGUgcGN3ZCBkcml2ZXIgaXMgdGhlIG9ubHkgb25lCi1zdXBwb3J0aW5nIHRoaXNzIGlvY3RsLgorc3VwcG9ydGluZyB0aGlzIGlvY3RsLgogCiAgICAgaW50IG9wdGlvbnMgPSAwOwogICAgIGlvY3RsKGZkLCBXRElPQ19TRVRPUFRJT05TLCBvcHRpb25zKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24veDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0CmluZGV4IGYzYzU3ZjQuLmRiZGNhZjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24veDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi94ODZfNjQvYm9vdC1vcHRpb25zLnR4dApAQCAtNTIsMTAgKzUyLDYgQEAKIAkJIGFwaWNtYWludGltZXIuIFVzZWZ1bCB3aGVuIHlvdXIgUElUIHRpbWVyIGlzIHRvdGFsbHkKIAkJIGJyb2tlbi4KIAotICAgZGlzYWJsZV84MjU0X3RpbWVyIC8gZW5hYmxlXzgyNTRfdGltZXIKLQkJIEVuYWJsZSBpbnRlcnJ1cHQgMCB0aW1lciByb3V0aW5nIG92ZXIgdGhlIDgyNTQgaW4gYWRkaXRpb24gdG8gb3ZlcgotCSAgICAgICAgIHRoZSBJTy1BUElDLiBUaGUga2VybmVsIHRyaWVzIHRvIHNldCBhIHNlbnNpYmxlIGRlZmF1bHQuCi0KIEVhcmx5IENvbnNvbGUKIAogICAgc3ludGF4OiBlYXJseXByaW50az12Z2EKQEAgLTE4Myw3ICsxNzksNyBAQAogSU9NTVUKIAogIGlvbW11PVtzaXplXVssbm9hZ3BdWyxvZmZdWyxmb3JjZV1bLG5vZm9yY2VdWyxsZWFrXVssbWVtYXBlcls9b3JkZXJdXVssbWVyZ2VdCi0gICAgICAgICBbLGZvcmNlc2FjXVssZnVsbGZsdXNoXVssbm9tZXJnZV1bLG5vYXBlcnR1cmVdCisgICAgICAgICBbLGZvcmNlc2FjXVssZnVsbGZsdXNoXVssbm9tZXJnZV1bLG5vYXBlcnR1cmVdWyxjYWxnYXJ5XQogICAgc2l6ZSAgc2V0IHNpemUgb2YgaW9tbXUgKGluIGJ5dGVzKQogICAgbm9hZ3AgZG9uJ3QgaW5pdGlhbGl6ZSB0aGUgQUdQIGRyaXZlciBhbmQgdXNlIGZ1bGwgYXBlcnR1cmUuCiAgICBvZmYgICBkb24ndCB1c2UgdGhlIElPTU1VCkBAIC0yMDQsNiArMjAwLDcgQEAKIAkgICAgYnVmZmVyaW5nLgogICAgbm9kYWMgICAgRm9yYmlkIERNQSA+NEdCCiAgICBwYW5pYyAgICBBbHdheXMgcGFuaWMgd2hlbiBJT01NVSBvdmVyZmxvd3MKKyAgIGNhbGdhcnkgIFVzZSB0aGUgQ2FsZ2FyeSBJT01NVSBpZiBpdCBpcyBhdmFpbGFibGUKIAogICBzd2lvdGxiPXBhZ2VzWyxmb3JjZV0KIApkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAxYjU0MzBhLi43ZjdjN2RiIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTU1LDE2ICsxNTUsMTYgQEAKIFM6CU1haW50YWluZWQKIAogOVAgRklMRSBTWVNURU0KLVA6ICAgICAgRXJpYyBWYW4gSGVuc2JlcmdlbgotTTogICAgICBlcmljdmhAZ21haWwuY29tCi1QOiAgICAgIFJvbiBNaW5uaWNoCi1NOiAgICAgIHJtaW5uaWNoQGxhbmwuZ292Ci1QOiAgICAgIExhdGNoZXNhciBJb25rb3YKLU06ICAgICAgbHVjaG9AaW9ua292Lm5ldAotTDogICAgICB2OWZzLWRldmVsb3BlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKLVc6ICAgICAgaHR0cDovL3Y5ZnMuc2YubmV0Ci1UOiAgICAgIGdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9lcmljdmgvdjlmcy5naXQKLVM6ICAgICAgTWFpbnRhaW5lZAorUDoJRXJpYyBWYW4gSGVuc2JlcmdlbgorTToJZXJpY3ZoQGdtYWlsLmNvbQorUDoJUm9uIE1pbm5pY2gKK006CXJtaW5uaWNoQGxhbmwuZ292CitQOglMYXRjaGVzYXIgSW9ua292CitNOglsdWNob0Bpb25rb3YubmV0CitMOgl2OWZzLWRldmVsb3BlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1c6CWh0dHA6Ly92OWZzLnNmLm5ldAorVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2VyaWN2aC92OWZzLmdpdAorUzoJTWFpbnRhaW5lZAogCiBBMjIzMiBTRVJJQUwgQk9BUkQgRFJJVkVSCiBQOglFbnZlciBIYWFzZQpAQCAtMjc3LDcgKzI3Nyw3IEBACiAKIEFMSTE1NjMgSTJDIERSSVZFUgogUDoJUnVkb2xmIE1hcmVrCi1NOglyLm1hcmVrQHNoLmN2dXQuY3oKK006CXIubWFyZWtAYXNzZW1ibGVyLmN6CiBMOglpMmNAbG0tc2Vuc29ycy5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtMjkwLDEyICsyOTAsMTkgQEAKIFM6CU1haW50YWluZWQgZm9yIDIuNDsgUENJIHN1cHBvcnQgZm9yIDIuNi4KIAogQU1EIEdFT0RFIFBST0NFU1NPUi9DSElQU0VUIFNVUFBPUlQKLVA6ICAgICAgSm9yZGFuIENyb3VzZQotTTogICAgICBpbmZvLWxpbnV4QGdlb2RlLmFtZC5jb20KK1A6CUpvcmRhbiBDcm91c2UKK006CWluZm8tbGludXhAZ2VvZGUuYW1kLmNvbQogTDoJaW5mby1saW51eEBnZW9kZS5hbWQuY29tCiBXOglodHRwOi8vd3d3LmFtZC5jb20vdXMtZW4vQ29ubmVjdGl2aXR5U29sdXRpb25zL1RlY2huaWNhbFJlc291cmNlcy8wLCw1MF8yMzM0XzI0NTJfMTEzNjMsMDAuaHRtbAogUzoJU3VwcG9ydGVkCiAKK0FNUyAoQXBwbGUgTW90aW9uIFNlbnNvcikgRFJJVkVSCitQOglTdGVsaWFuIFBvcAorTToJc3RlbGlhbkBwb3BpZXMubmV0CitQOglNaWNoYWVsIEhhbnNlbG1hbm4KK006CWxpbnV4LWtlcm5lbEBoYW5zbWkuY2gKK1M6CVN1cHBvcnRlZAorCiBBTVNPMTEwMCBSTklDIERSSVZFUgogUDoJVG9tIFR1Y2tlcgogTToJdG9tQG9wZW5ncmlkY29tcHV0aW5nLmNvbQpAQCAtMzQ4LDExICszNTUsMjQgQEAKIE06CXNweXJvQGYycy5jb20KIFM6CU1haW50YWluZWQKIAorQVJNL0FUTUVMIEFUOTFSTTkyMDAgQVJNIEFSQ0hJVEVDVFVSRQorUDogICAgICBBbmRyZXcgVmljdG9yCitNOiAgICAgIGFuZHJld0BzYW5wZW9wbGUuY29tCitMOiAgICAgIGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuYXJtLmxpbnV4Lm9yZy51ayAoc3Vic2NyaWJlcnMtb25seSkKK1c6ICAgICAgaHR0cDovL21heGltLm9yZy56YS9hdDkxXzI2Lmh0bWwKK1M6ICAgICAgTWFpbnRhaW5lZAorCiBBUk0vQ09SR0kgTUFDSElORSBTVVBQT1JUCiBQOglSaWNoYXJkIFB1cmRpZQogTToJcnB1cmRpZUBycHN5cy5uZXQKIFM6CU1haW50YWluZWQKIAorQVJNL0hQIEpPUk5BREEgN1hYIE1BQ0hJTkUgU1VQUE9SVAorUDogICAgICBLcmlzdG9mZmVyIEVyaWNzb24KK006ICAgICAga3Jpc3RvZmZlcl9lMUBob3RtYWlsLmNvbQorVzogICAgICB3d3cuamxpbWUuY29tCitTOiAgICAgIE1haW50YWluZWQKKwogQVJNL1RPU0EgTUFDSElORSBTVVBQT1JUCiBQOglEaXJrIE9wZmVyCiBNOglkaXJrQG9wZmVyLW9ubGluZS5kZQpAQCAtNDI2LDYgKzQ0NiwxMyBAQAogVzoJaHR0cDovL2xpbnV4LWF0bS5zb3VyY2Vmb3JnZS5uZXQKIFM6CU1haW50YWluZWQKIAorQVRNRUwgTUFDQiBFVEhFUk5FVCBEUklWRVIKK1A6CUF0bWVsIEFWUjMyIFN1cHBvcnQgVGVhbQorTToJYXZyMzJAYXRtZWwuY29tCitQOglIYWF2YXJkIFNraW5uZW1vZW4KK006CWhza2lubmVtb2VuQGF0bWVsLmNvbQorUzoJU3VwcG9ydGVkCisKIEFUTUVMIFdJUkVMRVNTIERSSVZFUgogUDoJU2ltb24gS2VsbGV5CiBNOglzaW1vbkB0aGVrZWxsZXlzLm9yZy51awpAQCAtNDkzLDcgKzUyMCw3IEBACiAKIEJGUyBGSUxFIFNZU1RFTQogUDoJVGlncmFuIEEuIEFpdmF6aWFuCi1NOgl0aWdyYW5AdmVyaXRhcy5jb20KK006CXRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51awogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC01OTUsMTMgKzYyMiwxMyBAQAogUzoJTWFpbnRhaW5lZAogCiBCT05ESU5HIERSSVZFUgotUDogICBDaGFkIFRpbmRlbAotTTogICBjdGluZGVsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAotUDogICBKYXkgVm9zYnVyZ2gKLU06ICAgZnViYXJAdXMuaWJtLmNvbQotTDogICBib25kaW5nLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotVzogICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2JvbmRpbmcvCi1TOiAgIFN1cHBvcnRlZAorUDoJQ2hhZCBUaW5kZWwKK006CWN0aW5kZWxAdXNlcnMuc291cmNlZm9yZ2UubmV0CitQOglKYXkgVm9zYnVyZ2gKK006CWZ1YmFyQHVzLmlibS5jb20KK0w6CWJvbmRpbmctZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitXOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2JvbmRpbmcvCitTOglTdXBwb3J0ZWQKIAogQlJPQURCQU5EIFBST0NFU1NPUiBBUkNISVRFQ1RVUkUKIFA6CUFybmQgQmVyZ21hbm4KQEAgLTY2NCw3ICs2OTEsNyBAQAogQ0lSUlVTIExPR0lDIEdFTkVSSUMgRkJERVYgRFJJVkVSCiBQOglKZWZmIEdhcnppawogTToJamdhcnppa0Bwb2JveC5jb20KLUw6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpYmVycy1vbmx5KQogUzoJT2RkIEZpeGVzCiAKIENJUlJVUyBMT0dJQyBDUzQyODAvQ1M0NjF4IFNPVU5ERFJJVkVSCkBAIC03MjAsNyArNzQ3LDcgQEAKIE06CWRhdmVqQGNvZGVtb25rZXkub3JnLnVrCiBMOgljcHVmcmVxQGxpc3RzLmxpbnV4Lm9yZy51awogVzoJaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9jcHVmcmVxLwotVDoJZ2l0IGtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZGF2ZWovY3B1ZnJlcS5naXQKK1Q6CWdpdCBrZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9kYXZlai9jcHVmcmVxLmdpdAogUzoJTWFpbnRhaW5lZAogCiBDUFVJRC9NU1IgRFJJVkVSCkBAIC03MzgsOCArNzY1LDggQEAKIFM6CVN1cHBvcnRlZAogCiBDUkFNRlMgRklMRVNZU1RFTQotVzogICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY3JhbWZzLwotUzogICAgIE9ycGhhbgorVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9jcmFtZnMvCitTOglPcnBoYW4KIAogQ1JJUyBQT1JUCiBQOglNaWthZWwgU3RhcnZpawpAQCAtNzcxLDcgKzc5OCw3IEBACiBDWUJMQUZCIEZSQU1FQlVGRkVSIERSSVZFUgogUDoJS251dCBQZXRlcnNlbgogTToJS251dF9QZXRlcnNlbkB0LW9ubGluZS5kZQotTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitMOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmliZXJzLW9ubHkpCiBTOglNYWludGFpbmVkCiAKIENZQ0xBREVTIDJYIFNZTkMgQ0FSRCBEUklWRVIKQEAgLTEwNDgsMTEgKzEwNzUsMTEgQEAKIFM6CU1haW50YWluZWQKIAogRU1VTEVYIExQRkMgRkMgU0NTSSBEUklWRVIKLVA6ICAgICAgSmFtZXMgU21hcnQKLU06ICAgICAgamFtZXMuc21hcnRAZW11bGV4LmNvbQotTDogICAgICBsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwotVzogICAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xwZmN4eHh4Ci1TOiAgICAgIFN1cHBvcnRlZAorUDoJSmFtZXMgU21hcnQKK006CWphbWVzLnNtYXJ0QGVtdWxleC5jb20KK0w6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xwZmN4eHh4CitTOglTdXBwb3J0ZWQKIAogRVBTT04gMTM1NSBGUkFNRUJVRkZFUiBEUklWRVIKIFA6CUNocmlzdG9waGVyIEhvb3ZlcgpAQCAtMTA3OCwxMyArMTEwNSwxOSBAQAogUzoJTWFpbnRhaW5lZAogCiBFWFQyIEZJTEUgU1lTVEVNCi1MOglleHQyLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJbGludXgtZXh0NEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAogRVhUMyBGSUxFIFNZU1RFTQogUDoJU3RlcGhlbiBUd2VlZGllLCBBbmRyZXcgTW9ydG9uCiBNOglzY3RAcmVkaGF0LmNvbSwgYWtwbUBvc2RsLm9yZywgYWRpbGdlckBjbHVzdGVyZnMuY29tCi1MOglleHQyLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJbGludXgtZXh0NEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKworRVhUNCBGSUxFIFNZU1RFTQorUDoJU3RlcGhlbiBUd2VlZGllLCBBbmRyZXcgTW9ydG9uCitNOglzY3RAcmVkaGF0LmNvbSwgYWtwbUBvc2RsLm9yZywgYWRpbGdlckBjbHVzdGVyZnMuY29tCitMOglsaW51eC1leHQ0QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBGNzE4MDVGIEhBUkRXQVJFIE1PTklUT1JJTkcgRFJJVkVSCkBAIC0xMTAyLDcgKzExMzUsNyBAQAogRlJBTUVCVUZGRVIgTEFZRVIKIFA6CUFudG9uaW5vIERhcGxhcwogTToJYWRhcGxhc0Bwb2wubmV0Ci1MOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQJCitMOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmliZXJzLW9ubHkpCiBXOglodHRwOi8vbGludXgtZmJkZXYuc291cmNlZm9yZ2UubmV0LwogUzoJTWFpbnRhaW5lZAogCkBAIC0xMTUzLDExICsxMTg2LDYgQEAKIE06CWRob3dlbGxzQHJlZGhhdC5jb20KIFM6CU1haW50YWluZWQKIAotRlRBUEUvUUlDLTExNwotTDoJbGludXgtdGFwZUB2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZnRhcGUKLVM6CU9ycGhhbgotCiBGVVNFOiBGSUxFU1lTVEVNIElOIFVTRVJTUEFDRQogUDoJTWlrbG9zIFN6ZXJlZGkKIE06CW1pa2xvc0BzemVyZWRpLmh1CkBAIC0xMjA2LDcgKzEyMzQsOCBAQAogUDoJSmVhbiBEZWx2YXJlCiBNOglraGFsaUBsaW51eC1mci5vcmcKIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKLVc6CWh0dHA6Ly93d3cubG0tc2Vuc29ycy5udS8KK1c6CWh0dHA6Ly93d3cubG0tc2Vuc29ycy5vcmcvCitUOglxdWlsdCBodHRwOi8va2hhbGkubGludXgtZnIub3JnL2RldmVsL2xpbnV4LTIuNi9qZGVsdmFyZS1od21vbi8KIFM6CU1haW50YWluZWQKIAogSEFSRFdBUkUgUkFORE9NIE5VTUJFUiBHRU5FUkFUT1IgQ09SRQpAQCAtMTMzMiw4ICsxMzYxLDcgQEAKIFA6CUplYW4gRGVsdmFyZQogTToJa2hhbGlAbGludXgtZnIub3JnCiBMOglpMmNAbG0tc2Vuc29ycy5vcmcKLVc6CWh0dHA6Ly93d3cubG0tc2Vuc29ycy5udS8KLVQ6CXF1aWx0IGtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvZ3JlZ2toL2dyZWdraC0yLjYvCitUOglxdWlsdCBodHRwOi8va2hhbGkubGludXgtZnIub3JnL2RldmVsL2xpbnV4LTIuNi9qZGVsdmFyZS1pMmMvCiBTOglNYWludGFpbmVkCiAKIEkyTwpAQCAtMTM2OSw2ICsxMzk3LDE1IEBACiBUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FlZ2wvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCitJQk0gQUNQSSBFWFRSQVMgRFJJVkVSCitQOglIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWgKK006CWlibS1hY3BpQGhtaC5lbmcuYnIKK0w6CWlibS1hY3BpLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorVzoJaHR0cDovL2libS1hY3BpLnNvdXJjZWZvcmdlLm5ldAorVzoJaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9JYm0tYWNwaQorVDoJZ2l0IHJlcG8ub3IuY3ovbGludXgtMi42L2xpbnV4LWFjcGktMi42L2libS1hY3BpLTIuNi5naXQKK1M6CU1haW50YWluZWQKKwogU04tSUE2NCAoSXRhbml1bSkgU1VCLVBMQVRGT1JNCiBQOglKZXMgU29yZW5zZW4KIE06CWplc0BzZ2kuY29tCkBAIC0xNDU4LDcgKzE0OTUsNyBAQAogSU1TIFRXSU5UVVJCTyBGUkFNRUJVRkZFUiBEUklWRVIKIFA6CVBhdWwgTXVuZHQKIE06CWxldGhhbEBjaGFvdGljZHJlYW1zLm9yZwotTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitMOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmliZXJzLW9ubHkpCiBTOglNYWludGFpbmVkCiAKIElORklOSUJBTkQgU1VCU1lTVEVNCkBAIC0xNDgzLDIyICsxNTIwLDI0IEBACiBTOglNYWludGFpbmVkCiAKIElOT1RJRlkKLVA6CUpvaG4gTWNDdXRjaGFuIGFuZCBSb2JlcnQgTG92ZQotTToJdHRiQHRlbnRhY2xlLmRocy5vcmcgYW5kIHJtbEBub3ZlbGwuY29tCitQOglKb2huIE1jQ3V0Y2hhbgorTToJdHRiQHRlbnRhY2xlLmRocy5vcmcKK1A6CVJvYmVydCBMb3ZlCitNOglybWxAbm92ZWxsLmNvbQogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBJTlRFTCBGUkFNRUJVRkZFUiBEUklWRVIgKGV4Y2x1ZGluZyA4MTAgYW5kIDgxNSkKLVA6ICAgICAgU3lsdmFpbiBNZXllcgotTTogICAgICBzeWx2YWluLm1leWVyQHdvcmxkb25saW5lLmZyCi1MOiAgICAgIGxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotUzogICAgICBNYWludGFpbmVkCitQOglTeWx2YWluIE1leWVyCitNOglzeWx2YWluLm1leWVyQHdvcmxkb25saW5lLmZyCitMOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmliZXJzLW9ubHkpCitTOglNYWludGFpbmVkCiAKIElOVEVMIDgxMC84MTUgRlJBTUVCVUZGRVIgRFJJVkVSCi1QOiAgICAgIEFudG9uaW5vIERhcGxhcwotTTogICAgICBhZGFwbGFzQHBvbC5uZXQKLUw6ICAgICAgbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1TOiAgICAgIE1haW50YWluZWQKK1A6CUFudG9uaW5vIERhcGxhcworTToJYWRhcGxhc0Bwb2wubmV0CitMOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmliZXJzLW9ubHkpCitTOglNYWludGFpbmVkCiAKIElOVEVMIEFQSUMvSU9BUElDLCBMT1dMRVZFTCBYODYgU01QIFNVUFBPUlQKIFA6CUluZ28gTW9sbmFyCkBAIC0xNTEzLDcgKzE1NTIsNyBAQAogCiBJTlRFTCBJQTMyIE1JQ1JPQ09ERSBVUERBVEUgU1VQUE9SVAogUDoJVGlncmFuIEFpdmF6aWFuCi1NOgl0aWdyYW5AdmVyaXRhcy5jb20KK006CXRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51awogUzoJTWFpbnRhaW5lZAogCiBJTlRFTCBJWFA0WFggUkFORE9NIE5VTUJFUiBHRU5FUkFUT1IgU1VQUE9SVApAQCAtMTY2NSw3ICsxNzA0LDEzIEBACiBKT1VSTkFMTElORyBMQVlFUiBGT1IgQkxPQ0sgREVWSUNFUyAoSkJEKQogUDoJU3RlcGhlbiBUd2VlZGllLCBBbmRyZXcgTW9ydG9uCiBNOglzY3RAcmVkaGF0LmNvbSwgYWtwbUBvc2RsLm9yZwotTDoJZXh0Mi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0w6CWxpbnV4LWV4dDRAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCisKK0s4VEVNUCBIQVJEV0FSRSBNT05JVE9SSU5HIERSSVZFUgorUDoJUnVkb2xmIE1hcmVrCitNOglyLm1hcmVrQGFzc2VtYmxlci5jegorTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwogUzoJTWFpbnRhaW5lZAogCiBLQ09ORklHCkBAIC0xNzE4LDYgKzE3NjMsMTMgQEAKIFc6CWh0dHA6Ly93d3cuY3NlLnVuc3cuZWR1LmF1L35uZWlsYi9wYXRjaGVzL2xpbnV4LWRldmVsLwogUzoJTWFpbnRhaW5lZAogCitLRVJORUwgVklSVFVBTCBNQUNISU5FIChLVk0pCitQOglBdmkgS2l2aXR5CitNOglhdmlAcXVtcmFuZXQuY29tCitMOglrdm0tZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitXOglrdm0uc291cmNlZm9yZ2UubmV0CitTOglTdXBwb3J0ZWQKKwogS0VYRUMKIFA6CUVyaWMgQmllZGVybWFuCiBNOgllYmllZGVybUB4bWlzc2lvbi5jb20KQEAgLTE4MTgsMTEgKzE4NzAsMTEgQEAKIFM6CU1haW50YWluZWQKIAogTElOVVggRk9SIFBPV0VSUEMgRU1CRURERUQgUFBDODNYWCBBTkQgUFBDODVYWAotUDogICAgIEt1bWFyIEdhbGEKLU06ICAgICBnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnCi1XOiAgICAgaHR0cDovL3d3dy5wZW5ndWlucHBjLm9yZy8KLUw6ICAgICBsaW51eHBwYy1lbWJlZGRlZEBvemxhYnMub3JnCi1TOiAgICAgTWFpbnRhaW5lZAorUDoJS3VtYXIgR2FsYQorTToJZ2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZworVzoJaHR0cDovL3d3dy5wZW5ndWlucHBjLm9yZy8KK0w6CWxpbnV4cHBjLWVtYmVkZGVkQG96bGFicy5vcmcKK1M6CU1haW50YWluZWQKIAogTElOVVggRk9SIFBPV0VSUEMgUEEgU0VNSSBQV1JGSUNJRU5UCiBQOglPbG9mIEpvaGFuc3NvbgpAQCAtMTkyMSwxMCArMTk3MywxMCBAQAogUzogCVN1cHBvcnRlZAogCiBNQU4tUEFHRVM6IE1BTlVBTCBQQUdFUyBGT1IgTElOVVggLS0gU2VjdGlvbnMgMiwgMywgNCwgNSwgYW5kIDcKLVA6IE1pY2hhZWwgS2VycmlzawotTTogbXRrLW1hbnBhZ2VzQGdteC5uZXQKLVc6IGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9kb2NzL21hbnBhZ2VzCi1TOiBNYWludGFpbmVkCitQOglNaWNoYWVsIEtlcnJpc2sKK006CW10ay1tYW5wYWdlc0BnbXgubmV0CitXOglmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvZG9jcy9tYW5wYWdlcworUzoJTWFpbnRhaW5lZAogCiBNQVJWRUxMIE1WNjQzWFggRVRIRVJORVQgRFJJVkVSCiBQOglEYWxlIEZhcm5zd29ydGgKQEAgLTE5MzcsMTUgKzE5ODksMTUgQEAKIE1BVFJPWCBGUkFNRUJVRkZFUiBEUklWRVIKIFA6CVBldHIgVmFuZHJvdmVjCiBNOgl2YW5kcm92ZUB2Yy5jdnV0LmN6Ci1MOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0w6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaWJlcnMtb25seSkKIFM6CU1haW50YWluZWQKIAogTUVHQVJBSUQgU0NTSSBEUklWRVJTCi1QOiAgICAgTmVlbGEgU3lhbSBLb2xsaQotTTogICAgIE5lZWxhLktvbGxpQGVuZ2VuaW8uY29tCi1TOiAgICAgbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKLVc6ICAgICBodHRwOi8vbWVnYXJhaWQubHNpbG9naWMuY29tCi1TOiAgICAgTWFpbnRhaW5lZAorUDoJTmVlbGEgU3lhbSBLb2xsaQorTToJTmVlbGEuS29sbGlAZW5nZW5pby5jb20KK1M6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vbWVnYXJhaWQubHNpbG9naWMuY29tCitTOglNYWludGFpbmVkCiAKIE1FTU9SWSBNQU5BR0VNRU5UCiBMOglsaW51eC1tbUBrdmFjay5vcmcKQEAgLTE5OTgsNiArMjA1MCwxOSBAQAogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCitNT1hBIFNNQVJUSU8vSU5EVVNUSU8gU0VSSUFMIENBUkQgKE1YU0VSIDIuMCkKK1A6CUppcmkgU2xhYnkKK006CWppcmlzbGFieUBnbWFpbC5jb20KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKworTVNJIExBUFRPUCBTVVBQT1JUCitQOglMZW5uYXJ0IFBvZXR0ZXJpbmcKK006CW16eHJlYXJ5QDBwb2ludGVyLmRlCitMOglodHRwczovL3RhbmdvLjBwb2ludGVyLmRlL21haWxtYW4vbGlzdGluZm8vczI3MC1saW51eAorVzoJaHR0cDovLzBwb2ludGVyLmRlL2xlbm5hcnQvdGNoaWJvLmh0bWwKK1M6CU1haW50YWluZWQKKwogTVRSUiBBTkQgU0lNSUxBUiBTVVBQT1JUIFtpMzg2XQogUDoJUmljaGFyZCBHb29jaAogTToJcmdvb2NoQGF0bmYuY3Npcm8uYXUKQEAgLTIwMDUsMTQgKzIwNzAsMjMgQEAKIFc6CWh0dHA6Ly93d3cuYXRuZi5jc2lyby5hdS9+cmdvb2NoL2xpbnV4L2tlcm5lbC1wYXRjaGVzLmh0bWwKIFM6CU1haW50YWluZWQKIAotTVVMVElNRURJQSBDQVJEIChNTUMpIFNVQlNZU1RFTQotUzoJT3JwaGFuCitNVUxUSU1FRElBIENBUkQgKE1NQykgQU5EIFNFQ1VSRSBESUdJVEFMIChTRCkgU1VCU1lTVEVNCitQOglQaWVycmUgT3NzbWFuCitNOglkcnpldXMtbW1jQGRyemV1cy5jeAorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAogCiBNVUxUSVNPVU5EIFNPVU5EIERSSVZFUgogUDoJQW5kcmV3IFZlbGlhdGgKIE06CWFuZHJld3R2QHVzYS5uZXQKIFM6CU1haW50YWluZWQKIAorTVVMVElURUNIIE1VTFRJUE9SVCBDQVJEIChJU0lDT00pCitQOglKaXJpIFNsYWJ5CitNOglqaXJpc2xhYnlAZ21haWwuY29tCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCisKIE5BVFNFTUkgRVRIRVJORVQgRFJJVkVSIChEUDgzODF4KQogUDogCVRpbSBIb2NraW4KIE06CXRob2NraW5AaG9ja2luLm9yZwpAQCAtMjA0MiwxMSArMjExNiwxMyBAQAogUDoJSmFtZXMgTW9ycmlzCiBQOglIYXJhbGQgV2VsdGUKIFA6CUpvenNlZiBLYWRsZWNzaWsKLU06CWNvcmV0ZWFtQG5ldGZpbHRlci5vcmcKK1A6CVBhdHJpY2sgTWNIYXJkeQorTToJa2FiZXJAdHJhc2gubmV0CitMOgluZXRmaWx0ZXItZGV2ZWxAbGlzdHMubmV0ZmlsdGVyLm9yZworTDoJbmV0ZmlsdGVyQGxpc3RzLm5ldGZpbHRlci5vcmcKK0w6CWNvcmV0ZWFtQG5ldGZpbHRlci5vcmcKIFc6CWh0dHA6Ly93d3cubmV0ZmlsdGVyLm9yZy8KIFc6CWh0dHA6Ly93d3cuaXB0YWJsZXMub3JnLwotTDoJbmV0ZmlsdGVyQGxpc3RzLm5ldGZpbHRlci5vcmcKLUw6CW5ldGZpbHRlci1kZXZlbEBsaXN0cy5uZXRmaWx0ZXIub3JnCiBTOglTdXBwb3J0ZWQKIAogTkVUTEFCRUwKQEAgLTIxMDgsNiArMjE4NCwxMyBAQAogVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9saW52aWxsZS93aXJlbGVzcy0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKK05FVFhFTiAoMS8xMCkgR2JFIFNVUFBPUlQKK1A6CUFtaXQgUy4gS2FsZQorTToJYW1pdGthbGVAbmV0eGVuLmNvbQorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5uZXR4ZW4uY29tCitTOglTdXBwb3J0ZWQKKwogSVBWUwogUDoJV2Vuc29uZyBaaGFuZwogTToJd2Vuc29uZ0BsaW51eC12cy5vcmcKQEAgLTIxNjIsMTAgKzIyNDUsMTAgQEAKIFM6CU1haW50YWluZWQKIAogTlZJRElBIChyaXZhZmIgYW5kIG52aWRpYWZiKSBGUkFNRUJVRkZFUiBEUklWRVIKLVA6ICAgICAgQW50b25pbm8gRGFwbGFzCi1NOiAgICAgIGFkYXBsYXNAcG9sLm5ldAotTDogICAgICBsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKLVM6ICAgICAgTWFpbnRhaW5lZAorUDoJQW50b25pbm8gRGFwbGFzCitNOglhZGFwbGFzQHBvbC5uZXQKK0w6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaWJlcnMtb25seSkKK1M6CU1haW50YWluZWQKIAogT1BFTkNPUkVTIEkyQyBCVVMgRFJJVkVSCiBQOglQZXRlciBLb3JzZ2FhcmQKQEAgLTIyOTcsOCArMjM4MCw4IEBACiBTOglTdXBwb3J0ZWQKIAogUENJIEhPVFBMVUcgQ09SRQotUDoJR3JlZyBLcm9haC1IYXJ0bWFuCi1NOglncmVna2hAc3VzZS5kZQorUDogCUtyaXN0ZW4gQ2FybHNvbiBBY2NhcmRpCitNOglrcmlzdGVuLmMuYWNjYXJkaUBpbnRlbC5jb20KIFM6CVN1cHBvcnRlZAogCiBQQ0kgSE9UUExVRyBDT01QQVEgRFJJVkVSCkBAIC0yNDA1LDYgKzI0ODgsMTMgQEAKIFc6CWh0dHA6Ly93d3cucG5kLXBjLmRlbW9uLmNvLnVrL3Byb21pc2UvCiBTOglNYWludGFpbmVkCiAKK1BTMyBQTEFURk9STSBTVVBQT1JUCitQOglHZW9mZiBMZXZhbmQKK006CWdlb2ZmcmV5LmxldmFuZEBhbS5zb255LmNvbQorTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKK0w6CWNiZS1vc3MtZGV2QG96bGFicy5vcmcKK1M6CVN1cHBvcnRlZAorCiBQVlJVU0IyIFZJREVPNExJTlVYIERSSVZFUgogUDoJTWlrZSBJc2VseQogTToJaXNlbHlAcG9ib3guY29tCkBAIC0yNDQxLDEzICsyNTMxLDEzIEBACiBSQURFT04gRlJBTUVCVUZGRVIgRElTUExBWSBEUklWRVIKIFA6CUJlbmphbWluIEhlcnJlbnNjaG1pZHQKIE06CWJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZwotTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitMOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKHN1YnNjcmliZXJzLW9ubHkpCiBTOglNYWludGFpbmVkCiAKIFJBR0UxMjggRlJBTUVCVUZGRVIgRElTUExBWSBEUklWRVIKIFA6CVBhdWwgTWFja2VycmFzCiBNOglwYXVsdXNAc2FtYmEub3JnCi1MOglsaW51eC1mYmRldi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0w6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaWJlcnMtb25seSkKIFM6CU1haW50YWluZWQKIAogUkFZTElOSy9XRUJHRUFSIDgwMi4xMSBXSVJFTEVTUyBMQU4gRFJJVkVSCkBAIC0yNDg5LDcgKzI1NzksNyBAQAogUkVBTCBUSU1FIENMT0NLIChSVEMpIFNVQlNZU1RFTQogUDoJQWxlc3NhbmRybyBadW1tbwogTToJYS56dW1tb0B0b3dlcnRlY2guaXQKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK0w6CXJ0Yy1saW51eEBnb29nbGVncm91cHMuY29tCiBTOglNYWludGFpbmVkCiAKIFJFSVNFUkZTIEZJTEUgU1lTVEVNCkBAIC0yNTE1LDEwICsyNjA1LDEwIEBACiBTOglPcnBoYW4KIAogUzMgU0FWQUdFIEZSQU1FQlVGRkVSIERSSVZFUgotUDogICAgICBBbnRvbmlubyBEYXBsYXMKLU06ICAgICAgYWRhcGxhc0Bwb2wubmV0Ci1MOiAgICAgIGxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotUzogICAgICBNYWludGFpbmVkCitQOglBbnRvbmlubyBEYXBsYXMKK006CWFkYXBsYXNAcG9sLm5ldAorTDoJbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpYmVycy1vbmx5KQorUzoJTWFpbnRhaW5lZAogCiBTMzkwCiBQOglNYXJ0aW4gU2Nod2lkZWZza3kKQEAgLTI1OTksMTAgKzI2ODksMTAgQEAKIFM6CU1haW50YWluZWQKIAogU0NUUCBQUk9UT0NPTAotUDogU3JpZGhhciBTYW11ZHJhbGEKLU06IHNyaUB1cy5pYm0uY29tCi1MOiBsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKLVM6IFN1cHBvcnRlZAorUDoJU3JpZGhhciBTYW11ZHJhbGEKK006CXNyaUB1cy5pYm0uY29tCitMOglsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1M6CVN1cHBvcnRlZAogCiBTQ3gyMDAgQ1BVIFNVUFBPUlQKIFA6CUppbSBDcm9taWUKQEAgLTI3NzAsOSArMjg2MCw5IEBACiBTOglNYWludGFpbmVkCiAKIFRlbGVjb20gQ2xvY2sgRHJpdmVyIGZvciBNQ1BMMDAxMAotUDogTWFyayBHcm9zcwotTTogbWFyay5ncm9zc0BpbnRlbC5jb20KLVM6IFN1cHBvcnRlZAorUDoJTWFyayBHcm9zcworTToJbWFyay5ncm9zc0BpbnRlbC5jb20KK1M6CVN1cHBvcnRlZAogCiBURU5TSUxJQ0EgWFRFTlNBIFBPUlQgKHh0ZW5zYSk6CiBQOglDaHJpcyBaYW5rZWwKQEAgLTI4NzMsNyArMjk2Myw2IEBACiBTVU4zLzNYCiBQOglTYW0gQ3JlYXNleQogTToJc2FtbXlAc2FtbXkubmV0Ci1MOglzdW4zLWxpc3RAcmVkaGF0LmNvbQogVzoJaHR0cDovL3NhbW15Lm5ldC9zdW4zLwogUzoJTWFpbnRhaW5lZAogCkBAIC0yOTE5LDkgKzMwMDgsOSBAQAogUzoJTWFpbnRhaW5lZAogCiBUSSBQQVJBTExFTCBMSU5LIENBQkxFIERSSVZFUgotUDogICAgIFJvbWFpbiBMaWV2aW4KLU06ICAgICByb21zQGxwZy50aWNhbGMub3JnCi1TOiAgICAgTWFpbnRhaW5lZAorUDoJUm9tYWluIExpZXZpbgorTToJcm9tc0BscGcudGljYWxjLm9yZworUzoJTWFpbnRhaW5lZAogCiBUSVBDIE5FVFdPUksgTEFZRVIKIFA6CVBlciBMaWRlbgpAQCAtMjk3MSwxMiArMzA2MCwxMiBAQAogUzoJTWFpbnRhaW5lZAogCiBUUklWSUFMIFBBVENIRVMKLVA6ICAgICAgQWRyaWFuIEJ1bmsKLU06ICAgICAgdHJpdmlhbEBrZXJuZWwub3JnCi1MOiAgICAgIGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVc6ICAgICAgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL2J1bmsvdHJpdmlhbC8KLVQ6ICAgICAgZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9idW5rL3RyaXZpYWwuZ2l0Ci1TOiAgICAgIE1haW50YWluZWQKK1A6CUFkcmlhbiBCdW5rCitNOgl0cml2aWFsQGtlcm5lbC5vcmcKK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9idW5rL3RyaXZpYWwvCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2J1bmsvdHJpdmlhbC5naXQKK1M6CU1haW50YWluZWQKIAogVE1TMzgwIFRPS0VOLVJJTkcgTkVUV09SSyBEUklWRVIKIFA6CUFkYW0gRnJpdHpsZXIKQEAgLTMwNTQsNiArMzE0MywxMyBAQAogVzoJaHR0cDovL3d3dy5saW51eC1wcm9qZWN0cy5vcmcKIFM6CU1haW50YWluZWQKIAorVVNCIEdBREdFVC9QRVJJUEhFUkFMIFNVQlNZU1RFTQorUDoJRGF2aWQgQnJvd25lbGwKK006CWRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKK0w6CWxpbnV4LXVzYi1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1c6CWh0dHA6Ly93d3cubGludXgtdXNiLm9yZy9nYWRnZXQKK1M6CU1haW50YWluZWQKKwogVVNCIEhJRC9ISURCUCBEUklWRVJTCiBQOglWb2p0ZWNoIFBhdmxpawogTToJdm9qdGVjaEBzdXNlLmN6CkBAIC0zMjM3LDEwICszMzMzLDExIEBACiBMOglsaW51eC11c2ItZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiAKLVVTQiAiVVNCTkVUIiBEUklWRVIKK1VTQiAiVVNCTkVUIiBEUklWRVIgRlJBTUVXT1JLCiBQOglEYXZpZCBCcm93bmVsbAogTToJZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAogTDoJbGludXgtdXNiLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorVzoJaHR0cDovL3d3dy5saW51eC11c2Iub3JnL3VzYm5ldAogUzoJTWFpbnRhaW5lZAogCiBVU0IgVzk5Nls4N11DRiBEUklWRVIKQEAgLTMzNTUsNiArMzQ1MiwxMiBAQAogTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwogUzoJTWFpbnRhaW5lZAogCitXODM3OTMgSEFSRFdBUkUgTU9OSVRPUklORyBEUklWRVIKK1A6CVJ1ZG9sZiBNYXJlaworTToJci5tYXJla0Bhc3NlbWJsZXIuY3oKK0w6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKK1M6CU1haW50YWluZWQKKwogVzgzTDUxeEQgU0QvTU1DIENBUkQgSU5URVJGQUNFIERSSVZFUgogUDoJUGllcnJlIE9zc21hbgogTToJZHJ6ZXVzLXdic2RAZHJ6ZXVzLmN4CkBAIC0zNDA2LDYgKzM1MDksMTIgQEAKIFQ6CWdpdCBnaXQ6Ly9vc3Muc2dpLmNvbTo4MDkwL3hmcy94ZnMtMi42CiBTOglTdXBwb3J0ZWQKIAorWElMSU5YIFVBUlRMSVRFIFNFUklBTCBEUklWRVIKK1A6CVBldGVyIEtvcnNnYWFyZAorTToJamFjbWV0QHN1bnNpdGUuZGsKK0w6CWxpbnV4LXNlcmlhbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogWDg2IDMtTEVWRUwgUEFHSU5HIChQQUUpIFNVUFBPUlQKIFA6CUluZ28gTW9sbmFyCiBNOgltaW5nb0ByZWRoYXQuY29tCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDcwM2Q0MGEuLmRjODI0NjIgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDIKIFBBVENITEVWRUwgPSA2Ci1TVUJMRVZFTCA9IDE5Ci1FWFRSQVZFUlNJT04gPS1yYzIKK1NVQkxFVkVMID0gMjAKK0VYVFJBVkVSU0lPTiA9LXJjMQogTkFNRT1BdmFzdCEgQSBiaWxnZSByYXQhCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0xMCw4ICsxMCwxMSBAQAogIyBDb21tZW50cyBpbiB0aGlzIGZpbGUgYXJlIHRhcmdldGVkIG9ubHkgdG8gdGhlIGRldmVsb3BlciwgZG8gbm90CiAjIGV4cGVjdCB0byBsZWFybiBob3cgdG8gYnVpbGQgdGhlIGtlcm5lbCByZWFkaW5nIHRoaXMgZmlsZS4KIAotIyBEbyBub3QgcHJpbnQgIkVudGVyaW5nIGRpcmVjdG9yeSAuLi4iCi1NQUtFRkxBR1MgKz0gLS1uby1wcmludC1kaXJlY3RvcnkKKyMgRG8gbm90OgorIyBvICB1c2UgbWFrZSdzIGJ1aWx0LWluIHJ1bGVzIGFuZCB2YXJpYWJsZXMKKyMgICAgKHRoaXMgaW5jcmVhc2VzIHBlcmZvcm1hbmNlIGFuZCBhdm9pZCBoYXJkLXRvLWRlYnVnIGJlaGF2b3VyKTsKKyMgbyAgcHJpbnQgIkVudGVyaW5nIGRpcmVjdG9yeSAuLi4iOworTUFLRUZMQUdTICs9IC1yUiAtLW5vLXByaW50LWRpcmVjdG9yeQogCiAjIFdlIGFyZSB1c2luZyBhIHJlY3Vyc2l2ZSBidWlsZCwgc28gd2UgbmVlZCB0byBkbyBhIGxpdHRsZSB0aGlua2luZwogIyB0byBnZXQgdGhlIG9yZGVyaW5nIHJpZ2h0LgpAQCAtMjcxLDEyICsyNzQsOCBAQAogIyBMb29rIGZvciBtYWtlIGluY2x1ZGUgZmlsZXMgcmVsYXRpdmUgdG8gcm9vdCBvZiBrZXJuZWwgc3JjCiBNQUtFRkxBR1MgKz0gLS1pbmNsdWRlLWRpcj0kKHNyY3RyZWUpCiAKLSMgV2UgbmVlZCBzb21lIGdlbmVyaWMgZGVmaW5pdGlvbnMKLWluY2x1ZGUgICQoc3JjdHJlZSkvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQotCi0jIERvIG5vdCB1c2UgbWFrZSdzIGJ1aWx0LWluIHJ1bGVzIGFuZCB2YXJpYWJsZXMKLSMgVGhpcyBpbmNyZWFzZXMgcGVyZm9ybWFuY2UgYW5kIGF2b2lkIGhhcmQtdG8tZGVidWcgYmVoYXZvdXIKLU1BS0VGTEFHUyArPSAtclIKKyMgV2UgbmVlZCBzb21lIGdlbmVyaWMgZGVmaW5pdGlvbnMuCitpbmNsdWRlICQoc3JjdHJlZSkvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQogCiAjIE1ha2UgdmFyaWFibGVzIChDQywgZXRjLi4uKQogCkBAIC00OTksNiArNDk4LDcgQEAKIAogaWZkZWYgQ09ORklHX1VOV0lORF9JTkZPCiBDRkxBR1MJCSs9IC1mYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMKK0xERkxBR1Nfdm1saW51eAkrPSAtLWVoLWZyYW1lLWhkcgogZW5kaWYKIAogaWZkZWYgQ09ORklHX0RFQlVHX0lORk8KQEAgLTExMDAsOSArMTEwMCw5IEBACiAKIGhlbHA6CiAJQGVjaG8gICdDbGVhbmluZyB0YXJnZXRzOicKLQlAZWNobyAgJyAgY2xlYW4JCSAgLSByZW1vdmUgbW9zdCBnZW5lcmF0ZWQgZmlsZXMgYnV0IGtlZXAgdGhlIGNvbmZpZyBhbmQnCisJQGVjaG8gICcgIGNsZWFuCQkgIC0gUmVtb3ZlIG1vc3QgZ2VuZXJhdGVkIGZpbGVzIGJ1dCBrZWVwIHRoZSBjb25maWcgYW5kJwogCUBlY2hvICAnICAgICAgICAgICAgICAgICAgICBlbm91Z2ggYnVpbGQgc3VwcG9ydCB0byBidWlsZCBleHRlcm5hbCBtb2R1bGVzJwotCUBlY2hvICAnICBtcnByb3BlcgkgIC0gcmVtb3ZlIGFsbCBnZW5lcmF0ZWQgZmlsZXMgKyBjb25maWcgKyB2YXJpb3VzIGJhY2t1cCBmaWxlcycKKwlAZWNobyAgJyAgbXJwcm9wZXIJICAtIFJlbW92ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzICsgY29uZmlnICsgdmFyaW91cyBiYWNrdXAgZmlsZXMnCiAJQGVjaG8gICcgIGRpc3RjbGVhbgkgIC0gbXJwcm9wZXIgKyByZW1vdmUgZWRpdG9yIGJhY2t1cCBhbmQgcGF0Y2ggZmlsZXMnCiAJQGVjaG8gICcnCiAJQGVjaG8gICdDb25maWd1cmF0aW9uIHRhcmdldHM6JwpAQCAtMTMxOSw3ICsxMzE5LDggQEAKIAkgICAgJChhbGwtc291cmNlcykgfCB4YXJncyAkMSAtYSBcCiAJCS1JIF9faW5pdGRhdGEsX19leGl0ZGF0YSxfX2FjcXVpcmVzLF9fcmVsZWFzZXMgXAogCQktSSBFWFBPUlRfU1lNQk9MLEVYUE9SVF9TWU1CT0xfR1BMIFwKLQkJLS1leHRyYT0rZiAtLWMta2luZHM9K3B4OyBcCisJCS0tZXh0cmE9K2YgLS1jLWtpbmRzPStweCBcCisJCS0tcmVnZXgtYXNtPScvRU5UUllcKChbXildKilcKS4qL1wxLyc7IFwKIAkgICAgJChhbGwta2NvbmZpZ3MpIHwgeGFyZ3MgJDEgLWEgXAogCQktLWxhbmdkZWY9a2NvbmZpZyBcCiAJCS0tbGFuZ3VhZ2UtZm9yY2U9a2NvbmZpZyBcCkBAIC0xMzg5LDEyICsxMzkwLDE4IEBACiAKIFBIT05ZICs9IGNoZWNrc3RhY2sga2VybmVscmVsZWFzZSBrZXJuZWx2ZXJzaW9uCiAKLSMgVXNlICQoU1VCQVJDSCkgaGVyZSBpbnN0ZWFkIG9mICQoQVJDSCkgc28gdGhhdCB0aGlzIHdvcmtzIGZvciBVTUwuCi0jIEluIHRoZSBVTUwgY2FzZSwgJChTVUJBUkNIKSBpcyB0aGUgbmFtZSBvZiB0aGUgdW5kZXJseWluZwotIyBhcmNoaXRlY3R1cmUsIHdoaWxlIGZvciBhbGwgb3RoZXIgYXJjaGVzLCBpdCBpcyB0aGUgc2FtZSBhcyAkKEFSQ0gpLgorIyBVTUwgbmVlZHMgYSBsaXR0bGUgc3BlY2lhbCB0cmVhdG1lbnQgaGVyZS4gIEl0IHdhbnRzIHRvIHVzZSB0aGUgaG9zdAorIyB0b29sY2hhaW4sIHNvIG5lZWRzICQoU1VCQVJDSCkgcGFzc2VkIHRvIGNoZWNrc3RhY2sucGwuICBFdmVyeW9uZQorIyBlbHNlIHdhbnRzICQoQVJDSCksIGluY2x1ZGluZyBwZW9wbGUgZG9pbmcgY3Jvc3MtYnVpbGRzLCB3aGljaCBtZWFucworIyB0aGF0ICQoU1VCQVJDSCkgZG9lc24ndCB3b3JrIGhlcmUuCitpZmVxICgkKEFSQ0gpLCB1bSkKK0NIRUNLU1RBQ0tfQVJDSCA6PSAkKFNVQkFSQ0gpCitlbHNlCitDSEVDS1NUQUNLX0FSQ0ggOj0gJChBUkNIKQorZW5kaWYKIGNoZWNrc3RhY2s6CiAJJChPQkpEVU1QKSAtZCB2bWxpbnV4ICQkKGZpbmQgLiAtbmFtZSAnKi5rbycpIHwgXAotCSQoUEVSTCkgJChzcmMpL3NjcmlwdHMvY2hlY2tzdGFjay5wbCAkKFNVQkFSQ0gpCisJJChQRVJMKSAkKHNyYykvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQ0hFQ0tTVEFDS19BUkNIKQogCiBrZXJuZWxyZWxlYXNlOgogCSQoaWYgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSksICQoUSllY2hvICQoS0VSTkVMUkVMRUFTRSksIFwKQEAgLTE0ODIsNiArMTQ4OSw4IEBACiBQSE9OWSArPSBGT1JDRQogRk9SQ0U6CiAKKyMgQ2FuY2VsIGltcGxpY2l0IHJ1bGVzIG9uIHRvcCBNYWtlZmlsZSwgYC1yUicgd2lsbCBhcHBseSB0byBzdWItbWFrZXMuCitNYWtlZmlsZTogOwogCiAjIERlY2xhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSAuUEhPTlkgdmFyaWFibGUgYXMgcGhvbnkuICBXZSBrZWVwIHRoYXQKICMgaW5mb3JtYXRpb24gaW4gYSB2YXJpYWJsZSBzZSB3ZSBjYW4gdXNlIGl0IGluIGlmX2NoYW5nZWQgYW5kIGZyaWVuZHMuCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggM2UyNjQ3Mi4uYzA1NTYxNSAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw0ICsxLDQgQEAKLQlMaW51eCBrZXJuZWwgcmVsZWFzZSAyLjYueHggPGh0dHA6Ly9rZXJuZWwub3JnPgorCUxpbnV4IGtlcm5lbCByZWxlYXNlIDIuNi54eCA8aHR0cDovL2tlcm5lbC5vcmcvPgogCiBUaGVzZSBhcmUgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIExpbnV4IHZlcnNpb24gMi42LiAgUmVhZCB0aGVtIGNhcmVmdWxseSwKIGFzIHRoZXkgdGVsbCB5b3Ugd2hhdCB0aGlzIGlzIGFsbCBhYm91dCwgZXhwbGFpbiBob3cgdG8gaW5zdGFsbCB0aGUKQEAgLTIyLDE1ICsyMiwxNyBAQAogCiAgIEFsdGhvdWdoIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGZpcnN0IGZvciAzMi1iaXQgeDg2LWJhc2VkIFBDcyAoMzg2IG9yIGhpZ2hlciksCiAgIHRvZGF5IExpbnV4IGFsc28gcnVucyBvbiAoYXQgbGVhc3QpIHRoZSBDb21wYXEgQWxwaGEgQVhQLCBTdW4gU1BBUkMgYW5kCi0gIFVsdHJhU1BBUkMsIE1vdG9yb2xhIDY4MDAwLCBQb3dlclBDLCBQb3dlclBDNjQsIEFSTSwgSGl0YWNoaSBTdXBlckgsCisgIFVsdHJhU1BBUkMsIE1vdG9yb2xhIDY4MDAwLCBQb3dlclBDLCBQb3dlclBDNjQsIEFSTSwgSGl0YWNoaSBTdXBlckgsIENlbGwsCiAgIElCTSBTLzM5MCwgTUlQUywgSFAgUEEtUklTQywgSW50ZWwgSUEtNjQsIERFQyBWQVgsIEFNRCB4ODYtNjQsIEFYSVMgQ1JJUywKLSAgYW5kIFJlbmVzYXMgTTMyUiBhcmNoaXRlY3R1cmVzLgorICBDcmlzLCBYdGVuc2EsIEFWUjMyIGFuZCBSZW5lc2FzIE0zMlIgYXJjaGl0ZWN0dXJlcy4KIAogICBMaW51eCBpcyBlYXNpbHkgcG9ydGFibGUgdG8gbW9zdCBnZW5lcmFsLXB1cnBvc2UgMzItIG9yIDY0LWJpdCBhcmNoaXRlY3R1cmVzCiAgIGFzIGxvbmcgYXMgdGhleSBoYXZlIGEgcGFnZWQgbWVtb3J5IG1hbmFnZW1lbnQgdW5pdCAoUE1NVSkgYW5kIGEgcG9ydCBvZiB0aGUKICAgR05VIEMgY29tcGlsZXIgKGdjYykgKHBhcnQgb2YgVGhlIEdOVSBDb21waWxlciBDb2xsZWN0aW9uLCBHQ0MpLiBMaW51eCBoYXMKICAgYWxzbyBiZWVuIHBvcnRlZCB0byBhIG51bWJlciBvZiBhcmNoaXRlY3R1cmVzIHdpdGhvdXQgYSBQTU1VLCBhbHRob3VnaAogICBmdW5jdGlvbmFsaXR5IGlzIHRoZW4gb2J2aW91c2x5IHNvbWV3aGF0IGxpbWl0ZWQuCisgIExpbnV4IGhhcyBhbHNvIGJlZW4gcG9ydGVkIHRvIGl0c2VsZi4gWW91IGNhbiBub3cgcnVuIHRoZSBrZXJuZWwgYXMgYQorICB1c2Vyc3BhY2UgYXBwbGljYXRpb24gLSB0aGlzIGlzIGNhbGxlZCBVc2VyTW9kZSBMaW51eCAoVU1MKS4KIAogRE9DVU1FTlRBVElPTjoKIApAQCAtMTEzLDYgKzExNSw3IEBACiAgICB2ZXJzaW9uIDIuNi4xMi4yIGFuZCB3YW50IHRvIGp1bXAgdG8gMi42LjEyLjMsIHlvdSBtdXN0IGZpcnN0CiAgICByZXZlcnNlIHRoZSAyLjYuMTIuMiBwYXRjaCAodGhhdCBpcywgcGF0Y2ggLVIpIF9iZWZvcmVfIGFwcGx5aW5nCiAgICB0aGUgMi42LjEyLjMgcGF0Y2guCisgICBZb3UgY2FuIHJlYWQgbW9yZSBvbiB0aGlzIGluIERvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQKIAogIC0gTWFrZSBzdXJlIHlvdSBoYXZlIG5vIHN0YWxlIC5vIGZpbGVzIGFuZCBkZXBlbmRlbmNpZXMgbHlpbmcgYXJvdW5kOgogCkBAIC0xNjEsNiArMTY0LDcgQEAKICAgIG9ubHkgYXNrIHlvdSBmb3IgdGhlIGFuc3dlcnMgdG8gbmV3IHF1ZXN0aW9ucy4KIAogIC0gQWx0ZXJuYXRlIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMgYXJlOgorCSJtYWtlIGNvbmZpZyIgICAgICBQbGFpbiB0ZXh0IGludGVyZmFjZS4KIAkibWFrZSBtZW51Y29uZmlnIiAgVGV4dCBiYXNlZCBjb2xvciBtZW51cywgcmFkaW9saXN0cyAmIGRpYWxvZ3MuCiAJIm1ha2UgeGNvbmZpZyIgICAgIFggd2luZG93cyAoUXQpIGJhc2VkIGNvbmZpZ3VyYXRpb24gdG9vbC4KIAkibWFrZSBnY29uZmlnIiAgICAgWCB3aW5kb3dzIChHdGspIGJhc2VkIGNvbmZpZ3VyYXRpb24gdG9vbC4KQEAgLTMwMyw4ICszMDcsOSBAQAogCiAgLSBJZiB5b3UgY29tcGlsZWQgdGhlIGtlcm5lbCB3aXRoIENPTkZJR19LQUxMU1lNUyB5b3UgY2FuIHNlbmQgdGhlIGR1bXAKICAgIGFzIGlzLCBvdGhlcndpc2UgeW91IHdpbGwgaGF2ZSB0byB1c2UgdGhlICJrc3ltb29wcyIgcHJvZ3JhbSB0byBtYWtlCi0gICBzZW5zZSBvZiB0aGUgZHVtcC4gIFRoaXMgdXRpbGl0eSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tCi0gICBmdHA6Ly9mdHAuPGNvdW50cnk+Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9rc3ltb29wcy4KKyAgIHNlbnNlIG9mIHRoZSBkdW1wIChidXQgY29tcGlsaW5nIHdpdGggQ09ORklHX0tBTExTWU1TIGlzIHVzdWFsbHkgcHJlZmVycmVkKS4KKyAgIFRoaXMgdXRpbGl0eSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tCisgICBmdHA6Ly9mdHAuPGNvdW50cnk+Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9rc3ltb29wcy8gLgogICAgQWx0ZXJuYXRlbHkgeW91IGNhbiBkbyB0aGUgZHVtcCBsb29rdXAgYnkgaGFuZDoKIAogIC0gSW4gZGVidWdnaW5nIGR1bXBzIGxpa2UgdGhlIGFib3ZlLCBpdCBoZWxwcyBlbm9ybW91c2x5IGlmIHlvdSBjYW4KQEAgLTMzNiw3ICszNDEsNyBAQAogCiAgICBJZiB5b3UgZm9yIHNvbWUgcmVhc29uIGNhbm5vdCBkbyB0aGUgYWJvdmUgKHlvdSBoYXZlIGEgcHJlLWNvbXBpbGVkCiAgICBrZXJuZWwgaW1hZ2Ugb3Igc2ltaWxhciksIHRlbGxpbmcgbWUgYXMgbXVjaCBhYm91dCB5b3VyIHNldHVwIGFzCi0gICBwb3NzaWJsZSB3aWxsIGhlbHAuIAorICAgcG9zc2libGUgd2lsbCBoZWxwLiAgUGxlYXNlIHJlYWQgdGhlIFJFUE9SVElORy1CVUdTIGRvY3VtZW50IGZvciBkZXRhaWxzLgogCiAgLSBBbHRlcm5hdGVseSwgeW91IGNhbiB1c2UgZ2RiIG9uIGEgcnVubmluZyBrZXJuZWwuIChyZWFkLW9ubHk7IGkuZS4geW91CiAgICBjYW5ub3QgY2hhbmdlIHZhbHVlcyBvciBzZXQgYnJlYWsgcG9pbnRzLikgVG8gZG8gdGhpcywgZmlyc3QgY29tcGlsZSB0aGUKZGlmZiAtLWdpdCBhL1JFUE9SVElORy1CVUdTIGIvUkVQT1JUSU5HLUJVR1MKaW5kZXggZjlkYTgyNy4uYWMwMmU0MiAxMDA2NDQKLS0tIGEvUkVQT1JUSU5HLUJVR1MKKysrIGIvUkVQT1JUSU5HLUJVR1MKQEAgLTQwLDcgKzQwLDkgQEAKIFsxLl0gT25lIGxpbmUgc3VtbWFyeSBvZiB0aGUgcHJvYmxlbToKIFsyLl0gRnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbS9yZXBvcnQ6CiBbMy5dIEtleXdvcmRzIChpLmUuLCBtb2R1bGVzLCBuZXR3b3JraW5nLCBrZXJuZWwpOgotWzQuXSBLZXJuZWwgdmVyc2lvbiAoZnJvbSAvcHJvYy92ZXJzaW9uKToKK1s0Ll0gS2VybmVsIGluZm9ybWF0aW9uCitbNC4xLl0gS2VybmVsIHZlcnNpb24gKGZyb20gL3Byb2MvdmVyc2lvbik6CitbNC4yLl0gS2VybmVsIC5jb25maWcgZmlsZToKIFs1Ll0gTW9zdCByZWNlbnQga2VybmVsIHZlcnNpb24gd2hpY2ggZGlkIG5vdCBoYXZlIHRoZSBidWc6CiBbNi5dIE91dHB1dCBvZiBPb3BzLi4gbWVzc2FnZSAoaWYgYXBwbGljYWJsZSkgd2l0aCBzeW1ib2xpYyBpbmZvcm1hdGlvbgogICAgICByZXNvbHZlZCAoc2VlIERvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dCkKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvS2NvbmZpZyBiL2FyY2gvYWxwaGEvS2NvbmZpZwppbmRleCA3ZTU1ZWE2Li44NGNhZjUwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL0tjb25maWcKKysrIGIvYXJjaC9hbHBoYS9LY29uZmlnCkBAIC0yNSw2ICsyNSwxNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogY29uZmlnIEdFTkVSSUNfRklORF9ORVhUX0JJVAogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYyBiL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYwppbmRleCBhZDYxNzM2Li5iZTEzM2YxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCkBAIC0yNzcsNyArMjc3LDcgQEAKIAlyZXR2YWwgPSAtRUJBREY7CiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmIChmaWxlKSB7Ci0JCXJldHZhbCA9IGRvX29zZl9zdGF0ZnMoZmlsZS0+Zl9kZW50cnksIGJ1ZmZlciwgYnVmc2l6KTsKKwkJcmV0dmFsID0gZG9fb3NmX3N0YXRmcyhmaWxlLT5mX3BhdGguZGVudHJ5LCBidWZmZXIsIGJ1ZnNpeik7CiAJCWZwdXQoZmlsZSk7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC05NzksNyArOTc5LDcgQEAKIAlsb25nIHRpbWVvdXQ7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAJc3RydWN0IGZkdGFibGUgKmZkdDsKLQlpbnQgbWF4X2Zkc2V0OworCWludCBtYXhfZmRzOwogCiAJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCWlmICh0dnApIHsKQEAgLTEwMDMsOSArMTAwMyw5IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7Ci0JbWF4X2Zkc2V0ID0gZmR0LT5tYXhfZmRzZXQ7CisJbWF4X2ZkcyA9IGZkdC0+bWF4X2ZkczsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlpZiAobiA8IDAgfHwgbiA+IG1heF9mZHNldCkKKwlpZiAobiA8IDAgfHwgbiA+IG1heF9mZHMpCiAJCWdvdG8gb3V0X25vZmRzOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKaW5kZXggZmZiN2Q1NC4uM2MxMGI5YSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKQEAgLTUxNiwxMCArNTE2LDExIEBACiAJCWlmIChidXMgPT0gMCAmJiBkZm4gPT0gMCkgewogCQkJaG9zZSA9IHBjaV9pc2FfaG9zZTsKIAkJfSBlbHNlIHsKLQkJCWRldiA9IHBjaV9maW5kX3Nsb3QoYnVzLCBkZm4pOworCQkJZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoYnVzLCBkZm4pOwogCQkJaWYgKCFkZXYpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQlob3NlID0gZGV2LT5zeXNkYXRhOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3JtX2Vudi5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3JtX2Vudi5jCmluZGV4IDk5MGFjNjEuLmY3ZGQwODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NybV9lbnYuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zcm1fZW52LmMKQEAgLTIsNyArMiw3IEBACiAgKiBzcm1fZW52LmMgLSBBY2Nlc3MgdG8gU1JNIGVudmlyb25tZW50CiAgKiAgICAgICAgICAgICB2YXJpYWJsZXMgdGhyb3VnaCBsaW51eCcgcHJvY2ZzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgSmFuLUJlbmVkaWN0IEdsYXcgPGpiZ2xhd0BsdWctb3dsLmRlPgorICogKEMpIDIwMDEsMjAwMiwyMDA2IGJ5IEphbi1CZW5lZGljdCBHbGF3IDxqYmdsYXdAbHVnLW93bC5kZT4KICAqCiAgKiBUaGlzIGRyaXZlciBpcyBhdCBhbGwgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIEVyaWsgTW91dydzCiAgKiBEb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzX2V4YW1wbGUuYywgc286IHRoYW5rCkBAIC0yMSw3ICsyMSw3IEBACiAgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogICogZGV0YWlscy4KLSAqIAorICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLApAQCAtMjksMzMgKzI5LDYgQEAKICAqCiAgKi8KIAotLyoKLSAqIENoYW5nZWxvZwotICogfn5+fn5+fn5+Ci0gKgotICogVGh1LCAyMiBBdWcgMjAwMiAxNToxMDo0MyArMDIwMAotICogCS0gVXBkYXRlIENvbmZpZy5oZWxwIGVudHJ5LiBJIGdvdCBhIG51bWJlciBvZiBlbWFpbHMgYXNraW5nCi0gKiAJICBtZSB0byB0ZWxsIHRoZWlyIHNlbmRlcnMgaWYgdGhleSBjb3VsZCBtYWtlIHVzZSBvZiB0aGlzCi0gKiAJICBwaWVjZSBvZiBjb2RlLi4uIFNvOiAiU1JNIGlzIHNvbWV0aGluZyBsaWtlIEJJT1MgZm9yIHlvdXIKLSAqIAkgIEFscGhhIgotICogCS0gVXBkYXRlIGNvZGUgZm9ybWF0dGluZyBhIGJpdCB0byBiZXR0ZXIgY29uZm9ybSBDb2RpbmdTdHlsZQotICogCSAgcnVsZXMuCi0gKiAJLSBTbyB0aGlzIGlzIHYwLjAuNSwgd2l0aCBubyBjaGFuZ2VzIChleGNlcHQgZm9ybWF0dGluZykKLSAqIAkKLSAqIFdlZCwgMjIgTWF5IDIwMDIgMDA6MTE6MjEgKzAyMDAKLSAqIAktIEZpeCB0eXBvIG9uIGNvbW1lbnQgKFNSQyAtPiBTUk0pCi0gKiAJLSBDYWxsIHRoaXMgIlZlcnNpb24gMC4wLjQiCi0gKgotICogVHVlLCAgOSBBcHIgMjAwMiAxODo0NDo0MCArMDIwMAotICogCS0gSW1wbGVtZW50IGFjY2VzcyBieSB2YXJpYWJsZSBuYW1lIGFuZCBhZGRpdGlvbmFsbHkKLSAqIAkgIGJ5IG51bWJlci4gVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nIHR3byBzdWJkaXJlY3RvcmllcwotICogCSAgd2hlcmUgb25lIGhvbGRzIGFsbCBuYW1lcyAobGlrZSB0aGUgb2xkIGRpcmVjdG9yeQotICogCSAgZGlkKSBhbmQgdGhlIG90aGVyIGhvbGRpbmcgMjU2IGZpbGVzIG5hbWVkIGxpa2UgIjAiLAotICogCSAgIjEiIGFuZCBzbyBvbi4KLSAqIAktIENhbGwgdGhpcyAiVmVyc2lvbiAwLjAuMyIKLSAqCi0gKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTY3LDcgKzQwLDcgQEAKICNkZWZpbmUgQkFTRV9ESVIJInNybV9lbnZpcm9ubWVudCIJLyogU3ViZGlyIGluIC9wcm9jLwkJKi8KICNkZWZpbmUgTkFNRURfRElSCSJuYW1lZF92YXJpYWJsZXMiCS8qIFN1YmRpciBmb3Iga25vd24gdmFyaWFibGVzCSovCiAjZGVmaW5lIE5VTUJFUkVEX0RJUgkibnVtYmVyZWRfdmFyaWFibGVzIgkvKiBTdWJkaXIgZm9yIGFsbCB2YXJpYWJsZXMJKi8KLSNkZWZpbmUgVkVSU0lPTgkJIjAuMC41IgkJCS8qIE1vZHVsZSB2ZXJzaW9uCQkqLworI2RlZmluZSBWRVJTSU9OCQkiMC4wLjYiCQkJLyogTW9kdWxlIHZlcnNpb24JCSovCiAjZGVmaW5lIE5BTUUJCSJzcm1fZW52IgkJLyogTW9kdWxlIG5hbWUJCQkqLwogCiBNT0RVTEVfQVVUSE9SKCJKYW4tQmVuZWRpY3QgR2xhdyA8amJnbGF3QGx1Zy1vd2wuZGU+Iik7CkBAIC0xMDYsNyArNzksNiBAQAogc3RhdGljIHNybV9lbnZfdAlzcm1fbnVtYmVyZWRfZW50cmllc1syNTZdOwogCiAKLQogc3RhdGljIGludAogc3JtX2Vudl9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAogCQl2b2lkICpkYXRhKQpAQCAtMTE1LDIxICs4NywyMyBAQAogCXVuc2lnbmVkIGxvbmcJcmV0OwogCXNybV9lbnZfdAkqZW50cnk7CiAKLQlpZihvZmYgIT0gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKG9mZiAhPSAwKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CiAKIAllbnRyeQk9IChzcm1fZW52X3QgKikgZGF0YTsKIAlyZXQJPSBjYWxsYmFja19nZXRlbnYoZW50cnktPmlkLCBwYWdlLCBjb3VudCk7CiAKLQlpZigocmV0ID4+IDYxKSA9PSAwKQorCWlmICgocmV0ID4+IDYxKSA9PSAwKSB7CiAJCW5ieXRlcyA9IChpbnQpIHJldDsKLQllbHNlCisJCSplb2YgPSAxOworCX0gZWxzZQogCQluYnl0ZXMgPSAtRUZBVUxUOwogCiAJcmV0dXJuIG5ieXRlczsKIH0KIAotCiBzdGF0aWMgaW50CiBzcm1fZW52X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LAogCQl2b2lkICpkYXRhKQpAQCAtMTU1LDcgKzEyOSw3IEBACiAKIAlyZXQxID0gY2FsbGJhY2tfc2V0ZW52KGVudHJ5LT5pZCwgYnVmLCBjb3VudCk7CiAJaWYgKChyZXQxID4+IDYxKSA9PSAwKSB7Ci0JCWRvIAorCQlkbwogCQkJcmV0MiA9IGNhbGxiYWNrX3NhdmVfZW52KCk7CiAJCXdoaWxlKChyZXQyID4+IDYxKSA9PSAxKTsKIAkJcmVzID0gKGludCkgcmV0MTsKQEAgLTE3MiwxNCArMTQ2LDE0IEBACiAJc3JtX2Vudl90CSplbnRyeTsKIAl1bnNpZ25lZCBsb25nCXZhcl9udW07CiAKLQlpZihiYXNlX2RpcikgeworCWlmIChiYXNlX2RpcikgewogCQkvKgogCQkgKiBSZW1vdmUgbmFtZWQgZW50cmllcwogCQkgKi8KLQkJaWYobmFtZWRfZGlyKSB7CisJCWlmIChuYW1lZF9kaXIpIHsKIAkJCWVudHJ5ID0gc3JtX25hbWVkX2VudHJpZXM7Ci0JCQl3aGlsZShlbnRyeS0+bmFtZSAhPSBOVUxMICYmIGVudHJ5LT5pZCAhPSAwKSB7Ci0JCQkJaWYoZW50cnktPnByb2NfZW50cnkpIHsKKwkJCXdoaWxlIChlbnRyeS0+bmFtZSAhPSBOVUxMICYmIGVudHJ5LT5pZCAhPSAwKSB7CisJCQkJaWYgKGVudHJ5LT5wcm9jX2VudHJ5KSB7CiAJCQkJCXJlbW92ZV9wcm9jX2VudHJ5KGVudHJ5LT5uYW1lLAogCQkJCQkJCW5hbWVkX2Rpcik7CiAJCQkJCWVudHJ5LT5wcm9jX2VudHJ5ID0gTlVMTDsKQEAgLTE5MiwxMSArMTY2LDExIEBACiAJCS8qCiAJCSAqIFJlbW92ZSBudW1iZXJlZCBlbnRyaWVzCiAJCSAqLwotCQlpZihudW1iZXJlZF9kaXIpIHsKLQkJCWZvcih2YXJfbnVtID0gMDsgdmFyX251bSA8PSAyNTU7IHZhcl9udW0rKykgeworCQlpZiAobnVtYmVyZWRfZGlyKSB7CisJCQlmb3IgKHZhcl9udW0gPSAwOyB2YXJfbnVtIDw9IDI1NTsgdmFyX251bSsrKSB7CiAJCQkJZW50cnkgPQkmc3JtX251bWJlcmVkX2VudHJpZXNbdmFyX251bV07CiAKLQkJCQlpZihlbnRyeS0+cHJvY19lbnRyeSkgeworCQkJCWlmIChlbnRyeS0+cHJvY19lbnRyeSkgewogCQkJCQlyZW1vdmVfcHJvY19lbnRyeShlbnRyeS0+bmFtZSwKIAkJCQkJCQludW1iZXJlZF9kaXIpOwogCQkJCQllbnRyeS0+cHJvY19lbnRyeQk9IE5VTEw7CkBAIC0yMTIsNyArMTg2LDYgQEAKIAlyZXR1cm47CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQKIHNybV9lbnZfaW5pdCh2b2lkKQogewpAQCAtMjIyLDcgKzE5NSw3IEBACiAJLyoKIAkgKiBDaGVjayBzeXN0ZW0KIAkgKi8KLQlpZighYWxwaGFfdXNpbmdfc3JtKSB7CisJaWYgKCFhbHBoYV91c2luZ19zcm0pIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRoaXMgQWxwaGEgc3lzdGVtIGRvZXNuJ3QgIgogCQkJCSJrbm93IGFib3V0IFNSTSAob3IgeW91J3ZlIGJvb3RlZCAiCiAJCQkJIlNSTS0+TUlMTy0+TGludXgsIHdoaWNoIGdldHMgIgpAQCAtMjMzLDE0ICsyMDYsMTQgQEAKIAkvKgogCSAqIEluaXQgbnVtYmVycwogCSAqLwotCWZvcih2YXJfbnVtID0gMDsgdmFyX251bSA8PSAyNTU7IHZhcl9udW0rKykKKwlmb3IgKHZhcl9udW0gPSAwOyB2YXJfbnVtIDw9IDI1NTsgdmFyX251bSsrKQogCQlzcHJpbnRmKG51bWJlclt2YXJfbnVtXSwgIiVsZCIsIHZhcl9udW0pOwogCiAJLyoKIAkgKiBDcmVhdGUgYmFzZSBkaXJlY3RvcnkKIAkgKi8KIAliYXNlX2RpciA9IHByb2NfbWtkaXIoQkFTRV9ESVIsIE5VTEwpOwotCWlmKGJhc2VfZGlyID09IE5VTEwpIHsKKwlpZiAoIWJhc2VfZGlyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgY3JlYXRlIGJhc2UgZGlyIC9wcm9jLyVzXG4iLAogCQkJCUJBU0VfRElSKTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMjUxLDcgKzIyNCw3IEBACiAJICogQ3JlYXRlIHBlci1uYW1lIHN1YmRpcmVjdG9yeQogCSAqLwogCW5hbWVkX2RpciA9IHByb2NfbWtkaXIoTkFNRURfRElSLCBiYXNlX2Rpcik7Ci0JaWYobmFtZWRfZGlyID09IE5VTEwpIHsKKwlpZiAoIW5hbWVkX2RpcikgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGNyZWF0ZSBkaXIgL3Byb2MvJXMvJXNcbiIsCiAJCQkJQkFTRV9ESVIsIE5BTUVEX0RJUik7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTI2Miw3ICsyMzUsNyBAQAogCSAqIENyZWF0ZSBwZXItbnVtYmVyIHN1YmRpcmVjdG9yeQogCSAqLwogCW51bWJlcmVkX2RpciA9IHByb2NfbWtkaXIoTlVNQkVSRURfRElSLCBiYXNlX2Rpcik7Ci0JaWYobnVtYmVyZWRfZGlyID09IE5VTEwpIHsKKwlpZiAoIW51bWJlcmVkX2RpcikgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGNyZWF0ZSBkaXIgL3Byb2MvJXMvJXNcbiIsCiAJCQkJQkFTRV9ESVIsIE5VTUJFUkVEX0RJUik7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTI3NCwxMCArMjQ3LDEwIEBACiAJICogQ3JlYXRlIGFsbCBuYW1lZCBub2RlcwogCSAqLwogCWVudHJ5ID0gc3JtX25hbWVkX2VudHJpZXM7Ci0Jd2hpbGUoZW50cnktPm5hbWUgIT0gTlVMTCAmJiBlbnRyeS0+aWQgIT0gMCkgeworCXdoaWxlIChlbnRyeS0+bmFtZSAmJiBlbnRyeS0+aWQpIHsKIAkJZW50cnktPnByb2NfZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShlbnRyeS0+bmFtZSwKIAkJCQkwNjQ0LCBuYW1lZF9kaXIpOwotCQlpZihlbnRyeS0+cHJvY19lbnRyeSA9PSBOVUxMKQorCQlpZiAoIWVudHJ5LT5wcm9jX2VudHJ5KQogCQkJZ290byBjbGVhbnVwOwogCiAJCWVudHJ5LT5wcm9jX2VudHJ5LT5kYXRhCQk9ICh2b2lkICopIGVudHJ5OwpAQCAtMjkxLDEzICsyNjQsMTMgQEAKIAkvKgogCSAqIENyZWF0ZSBhbGwgbnVtYmVyZWQgbm9kZXMKIAkgKi8KLQlmb3IodmFyX251bSA9IDA7IHZhcl9udW0gPD0gMjU1OyB2YXJfbnVtKyspIHsKKwlmb3IgKHZhcl9udW0gPSAwOyB2YXJfbnVtIDw9IDI1NTsgdmFyX251bSsrKSB7CiAJCWVudHJ5ID0gJnNybV9udW1iZXJlZF9lbnRyaWVzW3Zhcl9udW1dOwogCQllbnRyeS0+bmFtZSA9IG51bWJlclt2YXJfbnVtXTsKIAogCQllbnRyeS0+cHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGVudHJ5LT5uYW1lLAogCQkJCTA2NDQsIG51bWJlcmVkX2Rpcik7Ci0JCWlmKGVudHJ5LT5wcm9jX2VudHJ5ID09IE5VTEwpCisJCWlmICghZW50cnktPnByb2NfZW50cnkpCiAJCQlnb3RvIGNsZWFudXA7CiAKIAkJZW50cnktPmlkCQkJPSB2YXJfbnVtOwpAQCAtMzE4LDcgKzI5MSw2IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLQogc3RhdGljIHZvaWQgX19leGl0CiBzcm1fZW52X2V4aXQodm9pZCkKIHsKQEAgLTMyOCw3ICszMDAsNSBAQAogCXJldHVybjsKIH0KIAotCiBtb2R1bGVfaW5pdChzcm1fZW52X2luaXQpOwogbW9kdWxlX2V4aXQoc3JtX2Vudl9leGl0KTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pYXRhLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwppbmRleCBiOGI4MTdmLi45MTBiNDNjIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwpAQCAtMTgzLDExICsxODMsMTUgQEAKIAogCWlmKChzbG90ID09IDcpICYmIChQQ0lfRlVOQyhkZXYtPmRldmZuKSA9PSAzKSkgewogCQl1OCBpcnE9MDsKLQotCQlpZihwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZmluZF9zbG90KGRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4gJiB+KDcpKSwgMHg0MCwmaXJxKSE9UENJQklPU19TVUNDRVNTRlVMKQorCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBjaV9nZXRfc2xvdChkZXYtPmJ1cywgZGV2LT5kZXZmbiAmIH43KTsKKwkJaWYocGRldiA9PSBOVUxMIHx8IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDAsJmlycSkgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJCQlwY2lfZGV2X3B1dChwZGV2KTsKIAkJCXJldHVybiAtMTsKLQkJZWxzZQkKKwkJfQorCQllbHNlCXsKKwkJCXBjaV9kZXZfcHV0KHBkZXYpOwogCQkJcmV0dXJuIGlycTsKKwkJfQogCX0KIAogCXJldHVybiBDT01NT05fVEFCTEVfTE9PS1VQOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25hdXRpbHVzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYwppbmRleCA5Mzc0NGJhLi5lNzU5NGE3IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJYnVzID0gcGNpX3NjYW5fYnVzKDAsIGFscGhhX212LnBjaV9vcHMsIGhvc2UpOwogCWhvc2UtPmJ1cyA9IGJ1czsKIAotCWlyb25nYXRlID0gcGNpX2ZpbmRfc2xvdCgwLCAwKTsKKwlpcm9uZ2F0ZSA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDAsIDApOwogCWJ1cy0+c2VsZiA9IGlyb25nYXRlOwogCWJ1cy0+cmVzb3VyY2VbMV0gPSAmaXJvbmdhdGVfbWVtOwogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9hbHBoYS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA3MTQ3MGU5Li43NmJmMDcxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ4LDEzICs0OCw3IEBACiAgIC4gPSBBTElHTig4KTsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KSAKLQkqKC5pbml0Y2FsbDIuaW5pdCkgCi0JKiguaW5pdGNhbGwzLmluaXQpIAotCSooLmluaXRjYWxsNC5pbml0KSAKLQkqKC5pbml0Y2FsbDUuaW5pdCkgCi0JKiguaW5pdGNhbGw2LmluaXQpIAotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYyBiL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMKaW5kZXggODkwNDRlNi4uYWIzNzYxYyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL2FscGhhL2xpYi9jaGVja3N1bS5jCkBAIC00MSwyOCArNDEsMjUgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZC4KICAqLwotdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK19fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJICAgX193c3VtIHN1bSkKIHsKLQlyZXR1cm4gfmZyb202NHRvMTYoc2FkZHIgKyBkYWRkciArIHN1bSArCi0JCSgodW5zaWduZWQgbG9uZykgbnRvaHMobGVuKSA8PCAxNikgKwotCQkoKHVuc2lnbmVkIGxvbmcpIHByb3RvIDw8IDgpKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZnJvbTY0dG8xNigKKwkJKF9fZm9yY2UgdTY0KXNhZGRyICsgKF9fZm9yY2UgdTY0KWRhZGRyICsKKwkJKF9fZm9yY2UgdTY0KXN1bSArICgobGVuICsgcHJvdG8pIDw8IDgpKTsKIH0KIAotdW5zaWduZWQgaW50IGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQ7CiAKLQlyZXN1bHQgPSAoc2FkZHIgKyBkYWRkciArIHN1bSArCi0JCSAgKCh1bnNpZ25lZCBsb25nKSBudG9ocyhsZW4pIDw8IDE2KSArCi0JCSAgKCh1bnNpZ25lZCBsb25nKSBwcm90byA8PCA4KSk7CisJcmVzdWx0ID0gKF9fZm9yY2UgdTY0KXNhZGRyICsgKF9fZm9yY2UgdTY0KWRhZGRyICsKKwkJIChfX2ZvcmNlIHU2NClzdW0gKyAoKGxlbiArIHByb3RvKSA8PCA4KTsKIAogCS8qIEZvbGQgZG93biB0byAzMi1iaXRzIHNvIHdlIGRvbid0IGxvc2UgaW4gdGhlIHR5cGVkZWYtbGVzcyAKIAkgICBuZXR3b3JrIHN0YWNrLiAgKi8KQEAgLTcwLDcgKzY3LDcgQEAKIAlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmZmZmZikgKyAocmVzdWx0ID4+IDMyKTsKIAkvKiAzMyB0byAzMiAqLwogCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmKSArIChyZXN1bHQgPj4gMzIpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CiAKIC8qCkBAIC0xNDYsOSArMTQzLDkgQEAKICAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewotCXJldHVybiB+ZG9fY3N1bShpcGgsaWhsKjQpOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5kb19jc3VtKGlwaCxpaGwqNCk7CiB9CiAKIC8qCkBAIC0xNjMsMTUgKzE2MCwxNSBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOwogCiAJLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCi0JcmVzdWx0ICs9IHN1bTsKKwlyZXN1bHQgKz0gKF9fZm9yY2UgdTMyKXN1bTsKIAkvKiAzMitjIGJpdHMgLT4gMzIgYml0cyAqLwogCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmKSArIChyZXN1bHQgPj4gMzIpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKQEAgLTE4MCw3ICsxNzcsNyBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7Ci0JcmV0dXJuIH5mcm9tNjR0bzE2KGRvX2NzdW0oYnVmZixsZW4pKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZnJvbTY0dG8xNihkb19jc3VtKGJ1ZmYsbGVuKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jIGIvYXJjaC9hbHBoYS9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYwppbmRleCBhMzc5NDhmLi40Y2E3NWM3IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCisrKyBiL2FyY2gvYWxwaGEvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKQEAgLTMyOSwxMSArMzI5LDExIEBACiAJcmV0dXJuIGNoZWNrc3VtOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kb19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBzdW0sIGludCAqZXJycCkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCSAgICAgICBfX3dzdW0gc3VtLCBpbnQgKmVycnApCiB7Ci0JdW5zaWduZWQgbG9uZyBjaGVja3N1bSA9ICh1bnNpZ25lZCkgc3VtOworCXVuc2lnbmVkIGxvbmcgY2hlY2tzdW0gPSAoX19mb3JjZSB1MzIpIHN1bTsKIAl1bnNpZ25lZCBsb25nIHNvZmYgPSA3ICYgKHVuc2lnbmVkIGxvbmcpIHNyYzsKIAl1bnNpZ25lZCBsb25nIGRvZmYgPSA3ICYgKHVuc2lnbmVkIGxvbmcpIGRzdDsKIApAQCAtMzY3LDI1ICszNjcsMTIgQEAKIAkJfQogCQljaGVja3N1bSA9IGZyb202NHRvMTYgKGNoZWNrc3VtKTsKIAl9Ci0JcmV0dXJuIGNoZWNrc3VtOworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pY2hlY2tzdW07CiB9CiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycnApCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNyYywgbGVuKSkgewotCQkqZXJycCA9IC1FRkFVTFQ7Ci0JCW1lbXNldChkc3QsIDAsIGxlbik7Ci0JCXJldHVybiBzdW07Ci0JfQotCi0JcmV0dXJuIGRvX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihzcmMsIGRzdCwgbGVuLCBzdW0sIGVycnApOwotfQotCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgY2hhciBfX3VzZXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJICB1bnNpZ25lZCBpbnQgc3VtKQotewotCXJldHVybiBkb19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMKTsKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKChfX2ZvcmNlIGNvbnN0IHZvaWQgX191c2VyICopc3JjLAorCQkJZHN0LCBsZW4sIHN1bSwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL21tL2ZhdWx0LmMgYi9hcmNoL2FscGhhL21tL2ZhdWx0LmMKaW5kZXggODg3MTUyOS4uOGFhOWRiOCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9tbS9mYXVsdC5jCisrKyBiL2FyY2gvYWxwaGEvbW0vZmF1bHQuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAKIAkvKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dCwgb3IgaGF2ZSBubyB1c2VyIGNvbnRleHQsCiAJICAgd2UgbXVzdCBub3QgdGFrZSB0aGUgZmF1bHQuICAqLwotCWlmICghbW0gfHwgaW5faW50ZXJydXB0KCkpCisJaWYgKCFtbSB8fCBpbl9hdG9taWMoKSkKIAkJZ290byBub19jb250ZXh0OwogCiAjaWZkZWYgQ09ORklHX0FMUEhBX0xBUkdFX1ZNQUxMT0MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IGFkYjA1ZGUuLjY3ODNjMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtNzQsNiArNzQsMTQgQEAKIGNvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQogCWJvb2wKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogY29uZmlnIEdFTkVSSUNfSFdFSUdIVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTIyMyw2ICsyMzEsMTIgQEAKIAloZWxwCiAJICBTdXBwb3J0IGZvciBJbnRlbCdzIElPUDMzWCAoWFNjYWxlKSBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KIAorY29uZmlnIEFSQ0hfSU9QMTNYWAorCWJvb2wgIklPUDEzeHgtYmFzZWQiCisJc2VsZWN0IFBDSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIEludGVsJ3MgSU9QMTNYWCAoWFNjYWxlKSBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KKwogY29uZmlnIEFSQ0hfSVhQNFhYCiAJYm9vbCAiSVhQNHh4LWJhc2VkIgogCWRlcGVuZHMgb24gTU1VCkBAIC0zMzEsNiArMzQ1LDggQEAKIAogc291cmNlICJhcmNoL2FybS9tYWNoLWlvcDMzeC9LY29uZmlnIgogCitzb3VyY2UgImFyY2gvYXJtL21hY2gtaW9wMTN4eC9LY29uZmlnIgorCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9hcm0vbWFjaC1peHAyMDAwL0tjb25maWciCkBAIC0zNzQsNiArMzkwLDE0IEBACiAKIHNvdXJjZSBhcmNoL2FybS9tbS9LY29uZmlnCiAKK2NvbmZpZyBJV01NWFQKKwlib29sICJFbmFibGUgaVdNTVh0IHN1cHBvcnQiCisJZGVwZW5kcyBDUFVfWFNDQUxFIHx8IENQVV9YU0MzCisJZGVmYXVsdCB5IGlmIFBYQTI3eAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBpV01NWHQgY29udGV4dCBzd2l0Y2hpbmcgYXQgcnVuIHRpbWUgaWYKKwkgIHJ1bm5pbmcgb24gYSBDUFUgdGhhdCBzdXBwb3J0cyBpdC4KKwogIyAgYm9vbCAnVXNlIFhTY2FsZSBQTVUgYXMgdGltZXIgc291cmNlJyBDT05GSUdfWFNDQUxFX1BNVV9USU1FUgogY29uZmlnIFhTQ0FMRV9QTVUKIAlib29sCkBAIC01ODMsNyArNjA3LDcgQEAKIAkJICAgQVJDSF9MVUJCT0NLIHx8IE1BQ0hfTUFJTlNUT05FIHx8IEFSQ0hfTkVUV0lOREVSIHx8IFwKIAkJICAgQVJDSF9PTUFQIHx8IEFSQ0hfUDcyMFQgfHwgQVJDSF9QWEFfSURQIHx8IFwKIAkJICAgQVJDSF9TQTExMDAgfHwgQVJDSF9TSEFSSyB8fCBBUkNIX1ZFUlNBVElMRSB8fCBcCi0JCSAgIEFSQ0hfQVQ5MVJNOTIwMCB8fCBNQUNIX1RSSVpFUFM0CisJCSAgIEFSQ0hfQVQ5MSB8fCBNQUNIX1RSSVpFUFM0CiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBMRURzIG9uIHlvdXIgbWFjaGluZSB3aWxsIGJlIHVzZWQKIAkgIHRvIHByb3ZpZGUgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgY3VycmVudCBzeXN0ZW0gc3RhdHVzLgpAQCAtNzE2LDcgKzc0MCw3IEBACiAKIGVuZG1lbnUKIAotaWYgKEFSQ0hfU0ExMTAwIHx8IEFSQ0hfSU5URUdSQVRPUiB8fCBBUkNIX09NQVApCitpZiAoQVJDSF9TQTExMDAgfHwgQVJDSF9JTlRFR1JBVE9SIHx8IEFSQ0hfT01BUCB8fCBBUkNIX0lNWCApCiAKIG1lbnUgIkNQVSBGcmVxdWVuY3kgc2NhbGluZyIKIApAQCAtNzQzLDYgKzc2NywxNSBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IFkuCiAKK2NvbmZpZyBDUFVfRlJFUV9JTVgKKwl0cmlzdGF0ZSAiQ1BVZnJlcSBkcml2ZXIgZm9yIGkuTVggQ1BVcyIKKwlkZXBlbmRzIG9uIEFSQ0hfSU1YICYmIENQVV9GUkVRCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBDUFVmcmVxIGRyaXZlciBmb3IgaS5NWCBDUFVzLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKIGVuZG1lbnUKIAogZW5kaWYKQEAgLTg3OSw2ICs5MTIsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc2NzaS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvYXRhL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9tZC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVzc2FnZS9mdXNpb24vS2NvbmZpZyIKQEAgLTkxOSw2ICs5NTQsOCBAQAogCiBzb3VyY2UgInNvdW5kL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9oaWQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3VzYi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbW1jL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnIGIvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZwppbmRleCBkMjJmMzhiLi40MGM1ZWIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvYXJtL0tjb25maWcuZGVidWcKQEAgLTMyLDEwICszMiw2IEBACiAJICAgICAgOCAtIFNJR1NFR1YgZmF1bHRzCiAJICAgICAxNiAtIFNJR0JVUyBmYXVsdHMKIAotY29uZmlnIERFQlVHX1dBSVRRCi0JYm9vbCAiV2FpdCBxdWV1ZSBkZWJ1Z2dpbmciCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwKLQogY29uZmlnIERFQlVHX0VSUk9SUwogCWJvb2wgIlZlcmJvc2Uga2VybmVsIGVycm9yIG1lc3NhZ2VzIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDJhMGIyYzguLjAwMGYxMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0xNSw2ICsxNSw4IEBACiBPQkpDT1BZRkxBR1MJOj0tTyBiaW5hcnkgLVIgLm5vdGUgLVIgLmNvbW1lbnQgLVMKIEdaRkxBR1MJCTo9LTkKICNDRkxBR1MJCSs9LXBpcGUKKyMgRXhwbGljaXRseSBzcGVjaWZpeSAzMi1iaXQgQVJNIElTQSBzaW5jZSB0b29sY2hhaW4gZGVmYXVsdCBjYW4gYmUgLW10aHVtYjoKK0NGTEFHUwkJKz0kKGNhbGwgY2Mtb3B0aW9uLC1tYXJtLCkKIAogIyBEbyBub3QgdXNlIGFyY2gvYXJtL2RlZmNvbmZpZyAtIGl0J3MgYWx3YXlzIG91dGRhdGVkLgogIyBTZWxlY3QgYSBwbGF0Zm9ybSB0aHQgaXMga2VwdCB1cC10by1kYXRlCkBAIC0xMDgsNiArMTEwLDcgQEAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfQ0xQUzcxMVgpICAgOj0gY2xwczcxMXgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSU9QMzJYKQkgICA6PSBpb3AzMngKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSU9QMzNYKQkgICA6PSBpb3AzM3gKKyBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSU9QMTNYWCkJICAgOj0gaW9wMTN4eAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9JWFA0WFgpCSAgIDo9IGl4cDR4eAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9JWFAyMDAwKSAgICA6PSBpeHAyMDAwCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX0lYUDIzWFgpICAgIDo9IGl4cDIzeHgKQEAgLTE3NCwxMSArMTc3LDEzIEBACiAKICMgRGVmYXVsdCB0YXJnZXQgd2hlbiBleGVjdXRpbmcgcGxhaW4gbWFrZQogaWZlcSAoJChDT05GSUdfWElQX0tFUk5FTCkseSkKLWFsbDogeGlwSW1hZ2UKK0tCVUlMRF9JTUFHRSA6PSB4aXBJbWFnZQogZWxzZQotYWxsOiB6SW1hZ2UKK0tCVUlMRF9JTUFHRSA6PSB6SW1hZ2UKIGVuZGlmCiAKK2FsbDoJJChLQlVJTERfSU1BR0UpCisKIGJvb3QgOj0gYXJjaC9hcm0vYm9vdAogCiAjCVVwZGF0ZSBtYWNoaW5lIGFyY2ggYW5kIHByb2Mgc3ltbGlua3MgaWYgc29tZXRoaW5nIHdoaWNoIGFmZmVjdHMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYyBiL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYwppbmRleCAwMjhiZGM5Li4yZTYzNWI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vZG1hYm91bmNlLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCkBAIC02NjIsNyArNjYyLDggQEAKIEVYUE9SVF9TWU1CT0woZG1hX3VubWFwX3NpbmdsZSk7CiBFWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2cpOwogRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2cpOwotRVhQT1JUX1NZTUJPTChkbWFfc3luY19zaW5nbGUpOworRVhQT1JUX1NZTUJPTChkbWFfc3luY19zaW5nbGVfZm9yX2NwdSk7CitFWFBPUlRfU1lNQk9MKGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2cpOwogRVhQT1JUX1NZTUJPTChkbWFib3VuY2VfcmVnaXN0ZXJfZGV2KTsKIEVYUE9SVF9TWU1CT0woZG1hYm91bmNlX3VucmVnaXN0ZXJfZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9naWMuYyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwppbmRleCBmM2UwMjBmLi4wOWI5ZDFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vZ2ljLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2dpYy5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkgKi8KIAlmb3IgKGkgPSAyOTsgaSA8IG1heF9pcnE7IGkrKykgewogCQlzZXRfaXJxX2NoaXAoaSwgJmdpY19jaGlwKTsKLQkJc2V0X2lycV9oYW5kbGVyKGksIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vbG9jb21vLmMgYi9hcmNoL2FybS9jb21tb24vbG9jb21vLmMKaW5kZXggODBhNzJjNy4uY2ZlNmY0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYwpAQCAtMTYzLDExICsxNjMsMTEgQEAKICNkZWZpbmUJTE9DT01PX0lSUV9MVF9TVEFSVAkoSVJRX0xPQ09NT19MVCkKICNkZWZpbmUJTE9DT01PX0lSUV9TUElfU1RBUlQJKElSUV9MT0NPTU9fU1BJX1JGUikKIAotc3RhdGljIHZvaWQgbG9jb21vX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBsb2NvbW9faGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IHJlcSwgaTsKLQlzdHJ1Y3QgaXJxZGVzYyAqZDsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkOworCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAKIAkvKiBBY2tub3dsZWRnZSB0aGUgcGFyZW50IElSUSAqLwogCWRlc2MtPmNoaXAtPmFjayhpcnEpOwpAQCAtMTk0LDcgKzE5NCw3IEBACiAKIHN0YXRpYyB2b2lkIGxvY29tb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGludCByOwogCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19JQ1IpOwogCXIgJj0gfigweDAwMTAgPDwgKGlycSAtIExPQ09NT19JUlFfU1RBUlQpKTsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCiBzdGF0aWMgdm9pZCBsb2NvbW9fdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGludCByOwogCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19JQ1IpOwogCXIgfD0gKDB4MDAxMCA8PCAoaXJxIC0gTE9DT01PX0lSUV9TVEFSVCkpOwpAQCAtMjE3LDEwICsyMTcsMTAgQEAKIAkudW5tYXNrCT0gbG9jb21vX3VubWFza19pcnEsCiB9OwogCi1zdGF0aWMgdm9pZCBsb2NvbW9fa2V5X2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBsb2NvbW9fa2V5X2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCXN0cnVjdCBpcnFkZXNjICpkOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAogCWlmIChsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpICYgMHgwMDAxKSB7CiAJCWQgPSBpcnFfZGVzYyArIExPQ09NT19JUlFfS0VZX1NUQVJUOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAKIHN0YXRpYyB2b2lkIGxvY29tb19rZXlfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGludCByOwogCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpOwogCXIgJj0gfigweDAxMDAgPDwgKGlycSAtIExPQ09NT19JUlFfS0VZX1NUQVJUKSk7CkBAIC0yMzksNyArMjM5LDcgQEAKIAogc3RhdGljIHZvaWQgbG9jb21vX2tleV9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGludCByOwogCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19LRVlCT0FSRCArIExPQ09NT19LSUMpOwogCXIgJj0gfigweDAwMTAgPDwgKGlycSAtIExPQ09NT19JUlFfS0VZX1NUQVJUKSk7CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAogc3RhdGljIHZvaWQgbG9jb21vX2tleV91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJdW5zaWduZWQgaW50IHI7CiAJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0tFWUJPQVJEICsgTE9DT01PX0tJQyk7CiAJciB8PSAoMHgwMDEwIDw8IChpcnEgLSBMT0NPTU9fSVJRX0tFWV9TVEFSVCkpOwpAQCAtMjYyLDExICsyNjIsMTEgQEAKIAkudW5tYXNrCT0gbG9jb21vX2tleV91bm1hc2tfaXJxLAogfTsKIAotc3RhdGljIHZvaWQgbG9jb21vX2dwaW9faGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIGxvY29tb19ncGlvX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWludCByZXEsIGk7Ci0Jc3RydWN0IGlycWRlc2MgKmQ7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXN0cnVjdCBpcnFfZGVzYyAqZDsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCiAJcmVxID0gCWxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0dJUikgJgogCQlsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19HUEQpICYKQEAgLTI4NSw3ICsyODUsNyBAQAogCiBzdGF0aWMgdm9pZCBsb2NvbW9fZ3Bpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJdW5zaWduZWQgaW50IHI7CiAJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0dXRSk7CiAJciB8PSAoMHgwMDAxIDw8IChpcnEgLSBMT0NPTU9fSVJRX0dQSU9fU1RBUlQpKTsKQEAgLTMwMiw3ICszMDIsNyBAQAogCiBzdGF0aWMgdm9pZCBsb2NvbW9fZ3Bpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGludCByOwogCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19HSUUpOwogCXIgJj0gfigweDAwMDEgPDwgKGlycSAtIExPQ09NT19JUlFfR1BJT19TVEFSVCkpOwpAQCAtMzExLDcgKzMxMSw3IEBACiAKIHN0YXRpYyB2b2lkIGxvY29tb19ncGlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAl1bnNpZ25lZCBpbnQgcjsKIAlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fR0lFKTsKIAlyIHw9ICgweDAwMDEgPDwgKGlycSAtIExPQ09NT19JUlFfR1BJT19TVEFSVCkpOwpAQCAtMzI1LDEwICszMjUsMTAgQEAKIAkudW5tYXNrCT0gbG9jb21vX2dwaW9fdW5tYXNrX2lycSwKIH07CiAKLXN0YXRpYyB2b2lkIGxvY29tb19sdF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorc3RhdGljIHZvaWQgbG9jb21vX2x0X2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCXN0cnVjdCBpcnFkZXNjICpkOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAogCWlmIChsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19MVElOVCkgJiAweDAwMDEpIHsKIAkJZCA9IGlycV9kZXNjICsgTE9DT01PX0lSUV9MVF9TVEFSVDsKQEAgLTMzOCw3ICszMzgsNyBAQAogCiBzdGF0aWMgdm9pZCBsb2NvbW9fbHRfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGludCByOwogCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19MVElOVCk7CiAJciAmPSB+KDB4MDEwMCA8PCAoaXJxIC0gTE9DT01PX0lSUV9MVF9TVEFSVCkpOwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGxvY29tb19sdF9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGludCByOwogCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19MVElOVCk7CiAJciAmPSB+KDB4MDAxMCA8PCAoaXJxIC0gTE9DT01PX0lSUV9MVF9TVEFSVCkpOwpAQCAtMzU2LDcgKzM1Niw3IEBACiAKIHN0YXRpYyB2b2lkIGxvY29tb19sdF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJdW5zaWduZWQgaW50IHI7CiAJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX0xUSU5UKTsKIAlyIHw9ICgweDAwMTAgPDwgKGlycSAtIExPQ09NT19JUlFfTFRfU1RBUlQpKTsKQEAgLTM3MCwxMSArMzcwLDExIEBACiAJLnVubWFzawk9IGxvY29tb19sdF91bm1hc2tfaXJxLAogfTsKIAotc3RhdGljIHZvaWQgbG9jb21vX3NwaV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorc3RhdGljIHZvaWQgbG9jb21vX3NwaV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlpbnQgcmVxLCBpOwotCXN0cnVjdCBpcnFkZXNjICpkOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAogCXJlcSA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX1NQSSArIExPQ09NT19TUElJUikgJiAweDAwMEY7CiAJaWYgKHJlcSkgewpAQCAtMzkxLDcgKzM5MSw3IEBACiAKIHN0YXRpYyB2b2lkIGxvY29tb19zcGlfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGludCByOwogCXIgPSBsb2NvbW9fcmVhZGwobWFwYmFzZSArIExPQ09NT19TUEkgKyBMT0NPTU9fU1BJV0UpOwogCXIgfD0gKDB4MDAwMSA8PCAoaXJxIC0gTE9DT01PX0lSUV9TUElfU1RBUlQpKTsKQEAgLTQwOCw3ICs0MDgsNyBAQAogCiBzdGF0aWMgdm9pZCBsb2NvbW9fc3BpX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJdW5zaWduZWQgaW50IHI7CiAJciA9IGxvY29tb19yZWFkbChtYXBiYXNlICsgTE9DT01PX1NQSSArIExPQ09NT19TUElJRSk7CiAJciAmPSB+KDB4MDAwMSA8PCAoaXJxIC0gTE9DT01PX0lSUV9TUElfU1RBUlQpKTsKQEAgLTQxNyw3ICs0MTcsNyBAQAogCiBzdGF0aWMgdm9pZCBsb2NvbW9fc3BpX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAl1bnNpZ25lZCBpbnQgcjsKIAlyID0gbG9jb21vX3JlYWRsKG1hcGJhc2UgKyBMT0NPTU9fU1BJICsgTE9DT01PX1NQSUlFKTsKIAlyIHw9ICgweDAwMDEgPDwgKGlycSAtIExPQ09NT19JUlFfU1BJX1NUQVJUKSk7CkBAIC00NDAsNTUgKzQ0MCw1NSBAQAogCSAqIEluc3RhbGwgaGFuZGxlciBmb3IgSVJRX0xPQ09NT19IVy4KIAkgKi8KIAlzZXRfaXJxX3R5cGUobGNoaXAtPmlycSwgSVJRVF9GQUxMSU5HKTsKLQlzZXRfaXJxX2NoaXBkYXRhKGxjaGlwLT5pcnEsIGlycWJhc2UpOworCXNldF9pcnFfY2hpcF9kYXRhKGxjaGlwLT5pcnEsIGlycWJhc2UpOwogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGxjaGlwLT5pcnEsIGxvY29tb19oYW5kbGVyKTsKIAogCS8qIEluc3RhbGwgaGFuZGxlcnMgZm9yIElSUV9MT0NPTU9fKl9CQVNFICovCiAJc2V0X2lycV9jaGlwKElSUV9MT0NPTU9fS0VZX0JBU0UsICZsb2NvbW9fY2hpcCk7Ci0Jc2V0X2lycV9jaGlwZGF0YShJUlFfTE9DT01PX0tFWV9CQVNFLCBpcnFiYXNlKTsKKwlzZXRfaXJxX2NoaXBfZGF0YShJUlFfTE9DT01PX0tFWV9CQVNFLCBpcnFiYXNlKTsKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTE9DT01PX0tFWV9CQVNFLCBsb2NvbW9fa2V5X2hhbmRsZXIpOwogCXNldF9pcnFfZmxhZ3MoSVJRX0xPQ09NT19LRVlfQkFTRSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCiAJc2V0X2lycV9jaGlwKElSUV9MT0NPTU9fR1BJT19CQVNFLCAmbG9jb21vX2NoaXApOwotCXNldF9pcnFfY2hpcGRhdGEoSVJRX0xPQ09NT19HUElPX0JBU0UsIGlycWJhc2UpOworCXNldF9pcnFfY2hpcF9kYXRhKElSUV9MT0NPTU9fR1BJT19CQVNFLCBpcnFiYXNlKTsKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTE9DT01PX0dQSU9fQkFTRSwgbG9jb21vX2dwaW9faGFuZGxlcik7CiAJc2V0X2lycV9mbGFncyhJUlFfTE9DT01PX0dQSU9fQkFTRSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCiAJc2V0X2lycV9jaGlwKElSUV9MT0NPTU9fTFRfQkFTRSwgJmxvY29tb19jaGlwKTsKLQlzZXRfaXJxX2NoaXBkYXRhKElSUV9MT0NPTU9fTFRfQkFTRSwgaXJxYmFzZSk7CisJc2V0X2lycV9jaGlwX2RhdGEoSVJRX0xPQ09NT19MVF9CQVNFLCBpcnFiYXNlKTsKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTE9DT01PX0xUX0JBU0UsIGxvY29tb19sdF9oYW5kbGVyKTsKIAlzZXRfaXJxX2ZsYWdzKElSUV9MT0NPTU9fTFRfQkFTRSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCiAJc2V0X2lycV9jaGlwKElSUV9MT0NPTU9fU1BJX0JBU0UsICZsb2NvbW9fY2hpcCk7Ci0Jc2V0X2lycV9jaGlwZGF0YShJUlFfTE9DT01PX1NQSV9CQVNFLCBpcnFiYXNlKTsKKwlzZXRfaXJxX2NoaXBfZGF0YShJUlFfTE9DT01PX1NQSV9CQVNFLCBpcnFiYXNlKTsKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfTE9DT01PX1NQSV9CQVNFLCBsb2NvbW9fc3BpX2hhbmRsZXIpOwogCXNldF9pcnFfZmxhZ3MoSVJRX0xPQ09NT19TUElfQkFTRSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCiAJLyogaW5zdGFsbCBoYW5kbGVycyBmb3IgSVJRX0xPQ09NT19LRVlfQkFTRSBnZW5lcmF0ZWQgaW50ZXJydXB0cyAqLwogCXNldF9pcnFfY2hpcChMT0NPTU9fSVJRX0tFWV9TVEFSVCwgJmxvY29tb19rZXlfY2hpcCk7Ci0Jc2V0X2lycV9jaGlwZGF0YShMT0NPTU9fSVJRX0tFWV9TVEFSVCwgaXJxYmFzZSk7Ci0Jc2V0X2lycV9oYW5kbGVyKExPQ09NT19JUlFfS0VZX1NUQVJULCBkb19lZGdlX0lSUSk7CisJc2V0X2lycV9jaGlwX2RhdGEoTE9DT01PX0lSUV9LRVlfU1RBUlQsIGlycWJhc2UpOworCXNldF9pcnFfaGFuZGxlcihMT0NPTU9fSVJRX0tFWV9TVEFSVCwgaGFuZGxlX2VkZ2VfaXJxKTsKIAlzZXRfaXJxX2ZsYWdzKExPQ09NT19JUlFfS0VZX1NUQVJULCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAKIAkvKiBpbnN0YWxsIGhhbmRsZXJzIGZvciBJUlFfTE9DT01PX0dQSU9fQkFTRSBnZW5lcmF0ZWQgaW50ZXJydXB0cyAqLwogCWZvciAoaXJxID0gTE9DT01PX0lSUV9HUElPX1NUQVJUOyBpcnEgPCBMT0NPTU9fSVJRX0dQSU9fU1RBUlQgKyAxNjsgaXJxKyspIHsKIAkJc2V0X2lycV9jaGlwKGlycSwgJmxvY29tb19ncGlvX2NoaXApOwotCQlzZXRfaXJxX2NoaXBkYXRhKGlycSwgaXJxYmFzZSk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCBpcnFiYXNlKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAl9CiAKIAkvKiBpbnN0YWxsIGhhbmRsZXJzIGZvciBJUlFfTE9DT01PX0xUX0JBU0UgZ2VuZXJhdGVkIGludGVycnVwdHMgKi8KIAlzZXRfaXJxX2NoaXAoTE9DT01PX0lSUV9MVF9TVEFSVCwgJmxvY29tb19sdF9jaGlwKTsKLQlzZXRfaXJxX2NoaXBkYXRhKExPQ09NT19JUlFfTFRfU1RBUlQsIGlycWJhc2UpOwotCXNldF9pcnFfaGFuZGxlcihMT0NPTU9fSVJRX0xUX1NUQVJULCBkb19lZGdlX0lSUSk7CisJc2V0X2lycV9jaGlwX2RhdGEoTE9DT01PX0lSUV9MVF9TVEFSVCwgaXJxYmFzZSk7CisJc2V0X2lycV9oYW5kbGVyKExPQ09NT19JUlFfTFRfU1RBUlQsIGhhbmRsZV9lZGdlX2lycSk7CiAJc2V0X2lycV9mbGFncyhMT0NPTU9fSVJRX0xUX1NUQVJULCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAKIAkvKiBpbnN0YWxsIGhhbmRsZXJzIGZvciBJUlFfTE9DT01PX1NQSV9CQVNFIGdlbmVyYXRlZCBpbnRlcnJ1cHRzICovCiAJZm9yIChpcnEgPSBMT0NPTU9fSVJRX1NQSV9TVEFSVDsgaXJxIDwgTE9DT01PX0lSUV9TUElfU1RBUlQgKyAzOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmbG9jb21vX3NwaV9jaGlwKTsKLQkJc2V0X2lycV9jaGlwZGF0YShpcnEsIGlycWJhc2UpOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgaXJxYmFzZSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCmluZGV4IGQ1ZjcyMDEuLmZlM2YwNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYworKysgYi9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICogd2lsbCBjYWxsIHVzIGFnYWluIGlmIHRoZXJlIGFyZSBtb3JlIGludGVycnVwdHMgdG8gcHJvY2Vzcy4KICAqLwogc3RhdGljIHZvaWQKLXNhMTExMV9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3NhMTExMV9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IHN0YXQwLCBzdGF0MSwgaTsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBnZXRfaXJxX2RhdGEoaXJxKTsKQEAgLTE4Nyw3ICsxODcsNyBAQAogCiBzdGF0aWMgdm9pZCBzYTExMTFfbWFza19sb3dpcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGllMDsKIAogCWllMCA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAogc3RhdGljIHZvaWQgc2ExMTExX3VubWFza19sb3dpcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGllMDsKIAogCWllMCA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7CkBAIC0yMTUsNyArMjE1LDcgQEAKIHN0YXRpYyBpbnQgc2ExMTExX3JldHJpZ2dlcl9sb3dpcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0xPKGlycSk7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwZGF0YShpcnEpOworCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJdW5zaWduZWQgbG9uZyBpcDA7CiAJaW50IGk7CiAKQEAgLTIzNiw3ICsyMzYsNyBAQAogc3RhdGljIGludCBzYTExMTFfdHlwZV9sb3dpcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gU0ExMTExX0lSUU1BU0tfTE8oaXJxKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGlwMDsKIAogCWlmIChmbGFncyA9PSBJUlFUX1BST0JFKQpAQCAtMjU5LDcgKzI1OSw3IEBACiBzdGF0aWMgaW50IHNhMTExMV93YWtlX2xvd2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgb24pCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSBTQTExMTFfSVJRTUFTS19MTyhpcnEpOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGxvbmcgd2UwOwogCiAJd2UwID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfV0FLRUVOMCk7CkBAIC0yODQsNyArMjg0LDcgQEAKIAogc3RhdGljIHZvaWQgc2ExMTExX21hc2tfaGlnaGlycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGxvbmcgaWUxOwogCiAJaWUxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKQEAgLTI5NCw3ICsyOTQsNyBAQAogCiBzdGF0aWMgdm9pZCBzYTExMTFfdW5tYXNrX2hpZ2hpcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGllMTsKIAogCWllMSA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMSk7CkBAIC0zMTIsNyArMzEyLDcgQEAKIHN0YXRpYyBpbnQgc2ExMTExX3JldHJpZ2dlcl9oaWdoaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSBTQTExMTFfSVJRTUFTS19ISShpcnEpOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGxvbmcgaXAxOwogCWludCBpOwogCkBAIC0zMzMsNyArMzMzLDcgQEAKIHN0YXRpYyBpbnQgc2ExMTExX3R5cGVfaGlnaGlycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSBTQTExMTFfSVJRTUFTS19ISShpcnEpOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGxvbmcgaXAxOwogCiAJaWYgKGZsYWdzID09IElSUVRfUFJPQkUpCkBAIC0zNTYsNyArMzU2LDcgQEAKIHN0YXRpYyBpbnQgc2ExMTExX3dha2VfaGlnaGlycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgb24pCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSBTQTExMTFfSVJRTUFTS19ISShpcnEpOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCXVuc2lnbmVkIGxvbmcgd2UxOwogCiAJd2UxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfV0FLRUVOMSk7CkBAIC00MTAsMTUgKzQxMCwxNSBAQAogCiAJZm9yIChpcnEgPSBJUlFfR1BBSU4wOyBpcnEgPD0gU1NQUk9SOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmc2ExMTExX2xvd19jaGlwKTsKLQkJc2V0X2lycV9jaGlwZGF0YShpcnEsIGlycWJhc2UpOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgaXJxYmFzZSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJfQogCiAJZm9yIChpcnEgPSBBVURYTVRETUFET05FQTsgaXJxIDw9IElSUV9TMV9CVkQxX1NUU0NIRzsgaXJxKyspIHsKIAkJc2V0X2lycV9jaGlwKGlycSwgJnNhMTExMV9oaWdoX2NoaXApOwotCQlzZXRfaXJxX2NoaXBkYXRhKGlycSwgaXJxYmFzZSk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCBpcnFiYXNlKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9zaGFycHNsX3BtLmMgYi9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wbS5jCmluZGV4IDYwNWRlZGYuLmIzNTk5NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9zaGFycHNsX3BtLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL3NoYXJwc2xfcG0uYwpAQCAtNjAsMTYgKzYwLDE2IEBACiBzdGF0aWMgaW50IHNoYXJwc2xfZmF0YWxfY2hlY2sodm9pZCk7CiBzdGF0aWMgaW50IHNoYXJwc2xfYXZlcmFnZV92YWx1ZShpbnQgYWQpOwogc3RhdGljIHZvaWQgc2hhcnBzbF9hdmVyYWdlX2NsZWFyKHZvaWQpOwotc3RhdGljIHZvaWQgc2hhcnBzbF9jaGFyZ2VfdG9nZ2xlKHZvaWQgKnByaXZhdGVfKTsKLXN0YXRpYyB2b2lkIHNoYXJwc2xfYmF0dGVyeV90aHJlYWQodm9pZCAqcHJpdmF0ZV8pOworc3RhdGljIHZvaWQgc2hhcnBzbF9jaGFyZ2VfdG9nZ2xlKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHJpdmF0ZV8pOworc3RhdGljIHZvaWQgc2hhcnBzbF9iYXR0ZXJ5X3RocmVhZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnByaXZhdGVfKTsKIAogCiAvKgogICogVmFyaWFibGVzCiAgKi8KIHN0cnVjdCBzaGFycHNsX3BtX3N0YXR1cyBzaGFycHNsX3BtOwotREVDTEFSRV9XT1JLKHRvZ2dsZV9jaGFyZ2VyLCBzaGFycHNsX2NoYXJnZV90b2dnbGUsIE5VTEwpOwotREVDTEFSRV9XT1JLKHNoYXJwc2xfYmF0LCBzaGFycHNsX2JhdHRlcnlfdGhyZWFkLCBOVUxMKTsKK0RFQ0xBUkVfREVMQVlFRF9XT1JLKHRvZ2dsZV9jaGFyZ2VyLCBzaGFycHNsX2NoYXJnZV90b2dnbGUpOworREVDTEFSRV9ERUxBWUVEX1dPUksoc2hhcnBzbF9iYXQsIHNoYXJwc2xfYmF0dGVyeV90aHJlYWQpOwogREVGSU5FX0xFRF9UUklHR0VSKHNoYXJwc2xfY2hhcmdlX2xlZF90cmlnZ2VyKTsKIAogCkBAIC0xMTYsNyArMTE2LDcgQEAKIEVYUE9SVF9TWU1CT0woc2hhcnBzbF9iYXR0ZXJ5X2tpY2spOwogCiAKLXN0YXRpYyB2b2lkIHNoYXJwc2xfYmF0dGVyeV90aHJlYWQodm9pZCAqcHJpdmF0ZV8pCitzdGF0aWMgdm9pZCBzaGFycHNsX2JhdHRlcnlfdGhyZWFkKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHJpdmF0ZV8pCiB7CiAJaW50IHZvbHRhZ2UsIHBlcmNlbnQsIGFwbV9zdGF0dXMsIGkgPSAwOwogCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkvKiBDb3JnaSBjYW5ub3QgY29uZmlybSB3aGVuIGJhdHRlcnkgZnVsbHkgY2hhcmdlZCBzbyBwZXJpb2RpY2FsbHkga2ljayEgKi8KIAlpZiAoIXNoYXJwc2xfcG0ubWFjaGluZm8tPmJhdGZ1bGxfaXJxICYmIChzaGFycHNsX3BtLmNoYXJnZV9tb2RlID09IENIUkdfT04pCiAJCQkmJiB0aW1lX2FmdGVyKGppZmZpZXMsIHNoYXJwc2xfcG0uY2hhcmdlX3N0YXJ0X3RpbWUgKyAgU0hBUlBTTF9DSEFSR0VfT05fVElNRV9JTlRFUlZBTCkpCi0JCXNjaGVkdWxlX3dvcmsoJnRvZ2dsZV9jaGFyZ2VyKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0b2dnbGVfY2hhcmdlciwgMCk7CiAKIAl3aGlsZSgxKSB7CiAJCXZvbHRhZ2UgPSBzaGFycHNsX3BtLm1hY2hpbmZvLT5yZWFkX2RldmRhdGEoU0hBUlBTTF9CQVRUX1ZPTFQpOwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJc2hhcnBzbF9wbV9sZWQoU0hBUlBTTF9MRURfT0ZGKTsKIAlzaGFycHNsX3BtLmNoYXJnZV9tb2RlID0gQ0hSR19PRkY7CiAKLQlzY2hlZHVsZV93b3JrKCZzaGFycHNsX2JhdCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzaGFycHNsX2JhdCwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNoYXJwc2xfY2hhcmdlX2Vycm9yKHZvaWQpCkBAIC0yMjIsNyArMjIyLDcgQEAKIAlzaGFycHNsX3BtLmNoYXJnZV9tb2RlID0gQ0hSR19FUlJPUjsKIH0KIAotc3RhdGljIHZvaWQgc2hhcnBzbF9jaGFyZ2VfdG9nZ2xlKHZvaWQgKnByaXZhdGVfKQorc3RhdGljIHZvaWQgc2hhcnBzbF9jaGFyZ2VfdG9nZ2xlKHN0cnVjdCB3b3JrX3N0cnVjdCAqcHJpdmF0ZV8pCiB7CiAJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIlRvb2dsaW5nIENoYXJnZXIgYXQgdGltZTogJWx4XG4iLCBqaWZmaWVzKTsKIApAQCAtMjU0LDcgKzI1NCw3IEBACiAJZWxzZSBpZiAoc2hhcnBzbF9wbS5jaGFyZ2VfbW9kZSA9PSBDSFJHX09OKQogCQlzaGFycHNsX2NoYXJnZV9vZmYoKTsKIAotCXNjaGVkdWxlX3dvcmsoJnNoYXJwc2xfYmF0KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNoYXJwc2xfYmF0LCAwKTsKIH0KIAogCkBAIC0yNzksMTAgKzI3OSwxMCBAQAogCQkJc2hhcnBzbF9jaGFyZ2Vfb2ZmKCk7CiAJfSBlbHNlIGlmIChzaGFycHNsX3BtLmZ1bGxfY291bnQgPCAyKSB7CiAJCWRldl9kYmcoc2hhcnBzbF9wbS5kZXYsICJDaGFyZ2UgRnVsbDogQ291bnQgdG9vIGxvd1xuIik7Ci0JCXNjaGVkdWxlX3dvcmsoJnRvZ2dsZV9jaGFyZ2VyKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0b2dnbGVfY2hhcmdlciwgMCk7CiAJfSBlbHNlIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHNoYXJwc2xfcG0uY2hhcmdlX3N0YXJ0X3RpbWUgKyBTSEFSUFNMX0NIQVJHRV9GSU5JU0hfVElNRSkpIHsKIAkJZGV2X2RiZyhzaGFycHNsX3BtLmRldiwgIkNoYXJnZSBGdWxsOiBJbnRlcnJ1cHQgZ2VuZXJhdGVkIHRvbyBzbG93bHkgLSByZXRyeS5cbiIpOwotCQlzY2hlZHVsZV93b3JrKCZ0b2dnbGVfY2hhcmdlcik7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdG9nZ2xlX2NoYXJnZXIsIDApOwogCX0gZWxzZSB7CiAJCXNoYXJwc2xfY2hhcmdlX29mZigpOwogCQlzaGFycHNsX3BtLmNoYXJnZV9tb2RlID0gQ0hSR19ET05FOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3ZpYy5jIGIvYXJjaC9hcm0vY29tbW9uL3ZpYy5jCmluZGV4IDQzZDI3ODEuLmMwMjZmYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi92aWMuYworKysgYi9hcmNoL2FybS9jb21tb24vdmljLmMKQEAgLTI3LDE0ICsyNywxNCBAQAogCiBzdGF0aWMgdm9pZCB2aWNfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBnZXRfaXJxX2NoaXBkYXRhKGlycSk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKIAlpcnEgJj0gMzE7CiAJd3JpdGVsKDEgPDwgaXJxLCBiYXNlICsgVklDX0lOVF9FTkFCTEVfQ0xFQVIpOwogfQogCiBzdGF0aWMgdm9pZCB2aWNfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXZvaWQgX19pb21lbSAqYmFzZSA9IGdldF9pcnFfY2hpcGRhdGEoaXJxKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCWlycSAmPSAzMTsKIAl3cml0ZWwoMSA8PCBpcnEsIGJhc2UgKyBWSUNfSU5UX0VOQUJMRSk7CiB9CkBAIC04OCwxMCArODgsMTAgQEAKIAkJdW5zaWduZWQgaW50IGlycSA9IGlycV9zdGFydCArIGk7CiAKIAkJc2V0X2lycV9jaGlwKGlycSwgJnZpY19jaGlwKTsKLQkJc2V0X2lycV9jaGlwZGF0YShpcnEsIGJhc2UpOworCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsIGJhc2UpOwogCiAJCWlmICh2aWNfc291cmNlcyAmICgxIDw8IGkpKSB7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9hc3NhYmV0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXNzYWJldF9kZWZjb25maWcKaW5kZXggMDg5YzlkNS4uYjFjZDMzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9hc3NhYmV0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2Fzc2FiZXRfZGVmY29uZmlnCkBAIC0xODQsNiArMTg0LDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrX2RlZmNvbmZpZwppbmRleCBjODJlNDY2Li5lMTBkMDAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBka19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZGtfZGVmY29uZmlnCkBAIC0zNTcsOSArMzU3LDkgQEAKICMKICMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUEhZU01BUD15Ci1DT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgxMDAwMDAwMAotQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDIwMDAwMAotQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0wCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTAKICMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldApAQCAtNTc3LDcgKzU3Nyw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKIAogIwogIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKQEAgLTU4NSw3ICs1ODUsOSBAQAogIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVEMgaXMgbm90IHNldAotQ09ORklHX0FUOTFfUlRDPXkKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfQVQ5MVJNOTIwMD15CiAjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKIApAQCAtOTc5LDcgKzk4MSw2IEBACiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXJtOTIwMGVrX2RlZmNvbmZpZwppbmRleCBiOTgzZmM1Li44MzRkZGRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2F0OTFybTkyMDBla19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9hdDkxcm05MjAwZWtfZGVmY29uZmlnCkBAIC0zNDgsOSArMzQ4LDkgQEAKICMKICMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfUEhZU01BUD15Ci1DT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgxMDAwMDAwMAotQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDgwMDAwMAotQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0wCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTAKICMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfSU1QQTcgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldApAQCAtNTU4LDcgKzU1OCw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKIAogIwogIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKQEAgLTU2Niw3ICs1NjYsOSBAQAogIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVEMgaXMgbm90IHNldAotQ09ORklHX0FUOTFfUlRDPXkKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfQVQ5MVJNOTIwMD15CiAjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKIApAQCAtOTY4LDcgKzk3MCw2IEBACiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXNhbTkyNjBla19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2F0OTFzYW05MjYwZWtfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDQ5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2F0OTFzYW05MjYwZWtfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTUwIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmM2CisjIEZyaSBOb3YgMTcgMTg6NDI6MjEgMjAwNgorIworQ09ORklHX0FSTT15CisjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1NMQUI9eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBCbG9jayBsYXllcgorIworQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQVQ5MT15CisjIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMzNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MNzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0CisKKyMKKyMgQXRtZWwgQVQ5MSBTeXN0ZW0tb24tQ2hpcAorIworIyBDT05GSUdfQVJDSF9BVDkxUk05MjAwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0FUOTFTQU05MjYwPXkKKyMgQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjEgaXMgbm90IHNldAorCisjCisjIEFUOTFTQU05MjYwIEJvYXJkIFR5cGUKKyMKK0NPTkZJR19NQUNIX0FUOTFTQU05MjYwRUs9eQorCisjCisjIEFUOTEgQm9hcmQgT3B0aW9ucworIworIyBDT05GSUdfTVREX05BTkRfQVQ5MV9CVVNXSURUSF8xNiBpcyBub3Qgc2V0CisKKyMKKyMgQVQ5MSBGZWF0dXJlIFNlbGVjdGlvbnMKKyMKKyMgQ09ORklHX0FUOTFfUFJPR1JBTU1BQkxFX0NMT0NLUyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9BUk05MjZUPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VEo9eQorQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKK0NPTkZJR19DUFVfQ09QWV9WNFdCPXkKK0NPTkZJR19DUFVfVExCX1Y0V0JJPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKKyMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9DQUNIRV9ST1VORF9ST0JJTiBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0xMDAKKyMgQ09ORklHX0FFQUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00MDk2CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAorQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCitDT05GSUdfQ01ETElORT0ibWVtPTY0TSBjb25zb2xlPXR0eVMwLDExNTIwMCBpbml0cmQ9MHgyMTEwMDAwMCwzMTQ1NzI4IHJvb3Q9L2Rldi9yYW0wIHJ3IgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisjIENPTkZJR19WRlAgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKK0NPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQVRNRUw9eQorQ09ORklHX1NFUklBTF9BVE1FTF9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9BVE1FTF9UVFlBVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElBTj15CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9eQorQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKKyMgQ09ORklHX1VTQl9ISUQgaXMgbm90IHNldAorCisjCisjIFVTQiBISUQgQm9vdCBQcm90b2NvbCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XQUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUNFQ0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQlRBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVF9NSUkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworCisjCisjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfU0VMRUNURUQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX0FUOTE9eQorQ09ORklHX1VTQl9BVDkxPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVNTVlfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRFVBTFNQRUVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfWkVSTz1tCisjIENPTkZJR19VU0JfRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VURlM9bQorQ09ORklHX1VTQl9GSUxFX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR19TRVJJQUw9bQorIyBDT05GSUdfVVNCX01JRElfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKKyMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUldTRU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1BMSVNUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXQ5MXNhbTkyNjFla19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2F0OTFzYW05MjYxZWtfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NGFkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jb25maWdzL2F0OTFzYW05MjYxZWtfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTEwNiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjNgorIyBGcmkgTm92IDE3IDE4OjAwOjM4IDIwMDYKKyMKK0NPTkZJR19BUk09eQorIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0FUOTE9eQorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorCisjCisjIEF0bWVsIEFUOTEgU3lzdGVtLW9uLUNoaXAKKyMKKyMgQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTFTQU05MjYwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0FUOTFTQU05MjYxPXkKKworIworIyBBVDkxU0FNOTI2MSBCb2FyZCBUeXBlCisjCitDT05GSUdfTUFDSF9BVDkxU0FNOTI2MUVLPXkKKworIworIyBBVDkxIEJvYXJkIE9wdGlvbnMKKyMKKyMgQ09ORklHX01URF9OQU5EX0FUOTFfQlVTV0lEVEhfMTYgaXMgbm90IHNldAorCisjCisjIEFUOTEgRmVhdHVyZSBTZWxlY3Rpb25zCisjCisjIENPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1MgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKK0NPTkZJR19DUFVfQVJNOTI2VD15CitDT05GSUdfQ1BVXzMydjU9eQorQ09ORklHX0NQVV9BQlJUX0VWNVRKPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX0NPUFlfVjRXQj15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfQ0FDSEVfUk9VTkRfUk9CSU4gaXMgbm90IHNldAorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCisjIENPTkZJR19BRUFCSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFMgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9Im1lbT02NE0gY29uc29sZT10dHlTMCwxMTUyMDAgaW5pdHJkPTB4MjExMDAwMDAsMzE0NTcyOCByb290PS9kZXYvcmFtMCBydyIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorIyBDT05GSUdfVkZQIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUE0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorCisjCisjIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCisjIENPTkZJR19NVERfQ0hBUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCisjIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCitDT05GSUdfTVREX05BTkQ9eQorIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0VDQ19TTUMgaXMgbm90IHNldAorQ09ORklHX01URF9OQU5EX0lEUz15CisjIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9BVDkxPXkKKyMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CitDT05GSUdfRE05MDAwPXkKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9BVE1FTD15CitDT05GSUdfU0VSSUFMX0FUTUVMX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0FUTUVMX1RUWUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKK0NPTkZJR19XQVRDSERPRz15CitDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQ9eQorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCitDT05GSUdfSTJDX0FUOTE9eQorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBTUEkgc3VwcG9ydAorIworIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CitDT05GSUdfVVNCX1NUT1JBR0VfREVCVUc9eQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworQ09ORklHX1VTQl9HQURHRVQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CisjIENPTkZJR19VU0JfR0FER0VUX05FVDIyODAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9QWEEyWFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9HT0tVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX09NQVAgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfQVQ5MT15CitDT05GSUdfVVNCX0FUOTE9eQorIyBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9aRVJPPW0KKyMgQ09ORklHX1VTQl9FVEggaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRGUz1tCitDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfRklMRV9TVE9SQUdFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX1VTQl9HX1NFUklBTD1tCisjIENPTkZJR19VU0JfTUlESV9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19NTUM9eQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfQkxPQ0s9eQorQ09ORklHX01NQ19BVDkxPW0KKyMgQ09ORklHX01NQ19USUZNX1NEIGlzIG5vdCBzZXQKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKK0NPTkZJR19SVENfTElCPXkKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUkFNRlM9eQorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKKyMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUldTRU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CisjIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xMPXkKKyMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1BMSVNUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYXRlYjkyMDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9hdGViOTIwMF9kZWZjb25maWcKaW5kZXggMTVlNmIwYi4uM2RlNWM2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9hdGViOTIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9hdGViOTIwMF9kZWZjb25maWcKQEAgLTIxNyw3ICsyMTcsNyBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15Ci1DT05GSUdfUE1fTEVHQUNZPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUE0gaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2JhZGdlNF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2JhZGdlNF9kZWZjb25maWcKaW5kZXggY2ZlNmJkOC4uODIxODY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9iYWRnZTRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYmFkZ2U0X2RlZmNvbmZpZwpAQCAtMTIxNiw3ICsxMjE2LDYgQEAKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19FUlJPUlM9eQogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2Jhc3RfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9iYXN0X2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4NTY0Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL2Jhc3RfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsOTQ3ICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCi0jIFN1biBNYXIgMjcgMDI6MjQ6MTYgMjAwNQotIwotQ09ORklHX0FSTT15Ci1DT05GSUdfTU1VPXkKLUNPTkZJR19VSUQxNj15Ci1DT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15Ci1DT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX0dFTkVSSUNfSU9NQVA9eQotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfQ0xFQU5fQ09NUElMRT15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX1NXQVA9eQotQ09ORklHX1NZU1ZJUEM9eQotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLUNPTkZJR19LT0JKRUNUX1VFVkVOVD15Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0VQT0xMPXkKLUNPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCi1DT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKLUNPTkZJR19DQ19BTElHTl9MT09QUz0wCi1DT05GSUdfQ0NfQUxJR05fSlVNUFM9MAotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLSMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLQotIwotIyBTeXN0ZW0gVHlwZQotIwotIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfUzNDMjQxMD15Ci0jIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0Ci0KLSMKLSMgUzNDMjRYWCBJbXBsZW1lbnRhdGlvbnMKLSMKLUNPTkZJR19BUkNIX0JBU1Q9eQotIyBDT05GSUdfQVJDSF9IMTk0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX04zMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NNREsyNDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUzNDMjQ0MCBpcyBub3Qgc2V0Ci1DT05GSUdfTUFDSF9WUjEwMDA9eQotIyBDT05GSUdfTUFDSF9SWDM3MTUgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9PVE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfTkVYQ09ERVJfMjQ0MCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX1MzQzI0MTA9eQotCi0jCi0jIFMzQzI0MTAgQm9vdAotIwotIyBDT05GSUdfUzNDMjQxMF9CT09UX1dBVENIRE9HIGlzIG5vdCBzZXQKLQotIwotIyBTM0MyNDEwIFNldHVwCi0jCi1DT05GSUdfUzNDMjQxMF9ETUE9eQotIyBDT05GSUdfUzNDMjQxMF9ETUFfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfUzNDMjQxMF9QTV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TM0MyNDEwX1BNX0NIRUNLIGlzIG5vdCBzZXQKLUNPTkZJR19TM0MyNDEwX0xPV0xFVkVMX1VBUlRfUE9SVD0wCi0KLSMKLSMgUHJvY2Vzc29yIFR5cGUKLSMKLUNPTkZJR19DUFVfMzI9eQotQ09ORklHX0NQVV9BUk05MjBUPXkKLUNPTkZJR19DUFVfMzJ2ND15Ci1DT05GSUdfQ1BVX0FCUlRfRVY0VD15Ci1DT05GSUdfQ1BVX0NBQ0hFX1Y0V1Q9eQotQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKLUNPTkZJR19DUFVfQ09QWV9WNFdCPXkKLUNPTkZJR19DUFVfVExCX1Y0V0JJPXkKLQotIwotIyBQcm9jZXNzb3IgRmVhdHVyZXMKLSMKLSMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLQotIwotIyBCdXMgc3VwcG9ydAotIwotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIEZlYXR1cmVzCi0jCi0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19BTElHTk1FTlRfVFJBUD15Ci0KLSMKLSMgQm9vdCBvcHRpb25zCi0jCi1DT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCi1DT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJyb290PS9kZXYvaGRhMSBybyBpbml0PS9iaW4vYmFzaCBjb25zb2xlPXR0eVNBQzAiCi0jIENPTkZJR19YSVBfS0VSTkVMIGlzIG5vdCBzZXQKLQotIwotIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KLSMKLQotIwotIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKLSMKLUNPTkZJR19GUEVfTldGUEU9eQotIyBDT05GSUdfRlBFX05XRlBFX1hQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKLQotIwotIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKLSMKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfQU9VVD15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwotIwotQ09ORklHX1BNPXkKLUNPTkZJR19BUE09eQotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotQ09ORklHX01URD15Ci0jIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQotQ09ORklHX01URF9SRURCT09UX1BBUlRTPXkKLUNPTkZJR19NVERfUkVEQk9PVF9ESVJFQ1RPUllfQkxPQ0s9LTEKLUNPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRD15Ci0jIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQotIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKLSMKLUNPTkZJR19NVERfQ0hBUj15Ci1DT05GSUdfTVREX0JMT0NLPXkKLSMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKLQotIwotIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwotIwotQ09ORklHX01URF9DRkk9eQotQ09ORklHX01URF9KRURFQ1BST0JFPXkKLUNPTkZJR19NVERfR0VOX1BST0JFPXkKLSMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNj15Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSTE9eQotQ09ORklHX01URF9DRklfSTI9eQotIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKLSMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9VVElMPXkKLSMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKLQotIwotIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCi0jCi0jIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0lNUEE3IGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQkFTVD15Ci1DT05GSUdfTVREX0JBU1RfTUFYU0laRT00Ci0KLSMKLSMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKLQotIwotIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX01URF9OQU5EPXkKLSMgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX05BTkRfSURTPXkKLUNPTkZJR19NVERfTkFORF9TM0MyNDEwPXkKLSMgQ09ORklHX01URF9OQU5EX1MzQzI0MTBfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTVREX05BTkRfUzNDMjQxMF9IV0VDQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9OQU5EX05BTkRTSU0gaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1BBUlBPUlQ9eQotIyBDT05GSUdfUEFSUE9SVF9QQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJQT1JUX0FSQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJQT1JUX0dTQyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFSUE9SVF8xMjg0PXkKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUklERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD15Ci0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTkJEPW0KLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX0lOSVRSRD15Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi1DT05GSUdfSURFPXkKLUNPTkZJR19CTEtfREVWX0lERT15Ci0KLSMKLSMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCi0jCi0jIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURJU0s9eQotIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERUNEPXkKLUNPTkZJR19CTEtfREVWX0lERVRBUEU9bQotQ09ORklHX0JMS19ERVZfSURFRkxPUFBZPW0KLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi1DT05GSUdfSURFX0dFTkVSSUM9eQotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVfQkFTVD15Ci0jIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lQX1RDUERJQUc9eQotIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLSMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19TRVJQT1JUPXkKLSMgQ09ORklHX1NFUklPX1BBUktCRCBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15Ci0jIENPTkZJR19DT01QVVRPTkUgaXMgbm90IHNldAotIyBDT05GSUdfUk9DS0VUUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DWUNMQURFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ESUdJRVBDQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1hBX0lOVEVMTElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PWEFfU01BUlRJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JU0kgaXMgbm90IHNldAotIyBDT05GSUdfU1lOQ0xJTktNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OX0hETEMgaXMgbm90IHNldAotIyBDT05GSUdfUklTQ09NOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEVDSUFMSVggaXMgbm90IHNldAotIyBDT05GSUdfU1ggaXMgbm90IHNldAotIyBDT05GSUdfUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUQUxEUlYgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTgKLUNPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15Ci1DT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKLSMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMXzgyNTBfTVVMVElQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF84MjUwX1JTQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9TM0MyNDEwPXkKLUNPTkZJR19TRVJJQUxfUzNDMjQxMF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotQ09ORklHX1BSSU5URVI9eQotIyBDT05GSUdfTFBfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfUFBERVY9eQotIyBDT05GSUdfVElQQVIgaXMgbm90IHNldAotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLUNPTkZJR19XQVRDSERPRz15Ci0jIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX1MzQzI0MTBfV0FUQ0hET0c9eQotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLUNPTkZJR19TM0MyNDEwX1JUQz15Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLUNPTkZJR19JMkM9eQotQ09ORklHX0kyQ19DSEFSREVWPW0KLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotQ09ORklHX0kyQ19BTEdPQklUPW0KLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotQ09ORklHX0kyQ19TM0MyNDEwPXkKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAotIwotQ09ORklHX0kyQ19TRU5TT1I9bQotIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VOU09SU19MTTc1PW0KLSMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VOU09SU19MTTc4PW0KLSMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAotQ09ORklHX1NFTlNPUlNfTE04NT1tCi0jIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKLSMKLUNPTkZJR19TRU5TT1JTX0VFUFJPTT1tCi0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi1DT05GSUdfRkI9eQotIyBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DRkJfSU1BR0VCTElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NPRlRfQ1VSU09SIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9NT0RFX0hFTFBFUlM9eQotIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19FWFQzX0ZTX1hBVFRSPXkKLSMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZTX01CQ0FDSEU9eQotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBYRlMgc3VwcG9ydAotIwotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ST01GU19GUz15Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19GQVRfRlM9eQotQ09ORklHX01TRE9TX0ZTPXkKLUNPTkZJR19WRkFUX0ZTPXkKLUNPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKLUNPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19KRkZTX0ZTPXkKLUNPTkZJR19KRkZTX0ZTX1ZFUkJPU0U9MAotIyBDT05GSUdfSkZGU19QUk9DX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19KRkZTMl9GUz15Ci1DT05GSUdfSkZGUzJfRlNfREVCVUc9MAotIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX1pMSUI9eQotQ09ORklHX0pGRlMyX1JUSU1FPXkKLSMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci0jIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci0jIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci1DT05GSUdfQlNEX0RJU0tMQUJFTD15Ci0jIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAotQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTj15Ci0jIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNgotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQotQ09ORklHX0RFQlVHX0lORk89eQotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAotQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19MTD15Ci0jIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX1MzQzI0MTBfUE9SVD15Ci1DT05GSUdfREVCVUdfUzNDMjQxMF9VQVJUPTAKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi0jIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0Ci1DT05GSUdfWkxJQl9JTkZMQVRFPXkKLUNPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jYXJtZXZhX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY2FybWV2YV9kZWZjb25maWcKaW5kZXggZDI0YWU4Ny4uZDM5MjgzMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jYXJtZXZhX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2Nhcm1ldmFfZGVmY29uZmlnCkBAIC00NzQsNyArNDc0LDcgQEAKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVDkxX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVDkxUk05MjAwX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jZXJmY3ViZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZwppbmRleCBmODFhNjAwLi5lZTEzMGI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2NlcmZjdWJlX2RlZmNvbmZpZwpAQCAtMTk0LDYgKzE5NCw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUE0gaXMgbm90IHNldAogCiAjCkBAIC04NTAsNyArODUxLDYgQEAKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19FUlJPUlM9eQogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NvbGxpZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NvbGxpZV9kZWZjb25maWcKaW5kZXggMDc0YzQ3YS4uOTcwYzhjNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jb2xsaWVfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY29sbGllX2RlZmNvbmZpZwpAQCAtMjE5LDcgKzIxOSw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLUNPTkZJR19QTV9MRUdBQ1k9eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19BUE09eQogCkBAIC05MzQsNyArOTM0LDYgQEAKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19FUlJPUlM9eQogIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NvcmdpX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY29yZ2lfZGVmY29uZmlnCmluZGV4IDNjMzQ2MWUuLmU4OTgwYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvY29yZ2lfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY29yZ2lfZGVmY29uZmlnCkBAIC0yMDgsNiArMjA4LDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKIENPTkZJR19BUE09eQogCiAjCkBAIC0xNTEyLDcgKzE1MTMsNiBAQAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19FUlJPUlM9eQogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2NzYjMzN19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NzYjMzN19kZWZjb25maWcKaW5kZXggYTJkNmZkMy4uMmNhZGQ1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jc2IzMzdfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvY3NiMzM3X2RlZmNvbmZpZwpAQCAtNjE1LDcgKzYxNSw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKIAogIwogIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKQEAgLTExMTMsNyArMTExMyw2IEBACiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvY3NiNjM3X2RlZmNvbmZpZwppbmRleCAyYTFhYzZjLi45NDkwOGMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2NzYjYzN19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9jc2I2MzdfZGVmY29uZmlnCkBAIC02MTUsNyArNjE1LDcgQEAKICMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0FUOTFfV0FUQ0hET0c9eQorQ09ORklHX0FUOTFSTTkyMDBfV0FUQ0hET0c9eQogCiAjCiAjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcwpAQCAtNjIzLDcgKzYyMyw3IEBACiAjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKIENPTkZJR19SVEM9eQotIyBDT05GSUdfQVQ5MV9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfQVQ5MVJNOTIwMF9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAKQEAgLTEwNjIsNyArMTA2Miw2IEBACiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZXA5M3h4X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZXA5M3h4X2RlZmNvbmZpZwppbmRleCAzYjQ4MDJhLi5mOGE2NmI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2VwOTN4eF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9lcDkzeHhfZGVmY29uZmlnCkBAIC0xMjUsNiArMTI1LDcgQEAKICMKICMgRVA5M3h4IFBsYXRmb3JtcwogIworQ09ORklHX01BQ0hfQURTU1BIRVJFPXkKIENPTkZJR19NQUNIX0VEQjkzMDI9eQogQ09ORklHX01BQ0hfRURCOTMxMj15CiBDT05GSUdfTUFDSF9FREI5MzE1PXkKQEAgLTExMzQsNyArMTEzNSw2IEBACiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQotQ09ORklHX0RFQlVHX1dBSVRRPXkKIENPTkZJR19ERUJVR19FUlJPUlM9eQogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2gzNjAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnCmluZGV4IDdhMGRhMGIuLjhmOTg2ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaDM2MDBfZGVmY29uZmlnCkBAIC0xOTQsNiArMTk0LDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaDcyMDJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9oNzIwMl9kZWZjb25maWcKaW5kZXggOWQ2MmVkMS4uMGU3MzlhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9oNzIwMl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9oNzIwMl9kZWZjb25maWcKQEAgLTcwMiw3ICs3MDIsNiBAQAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9oYWNra2l0X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaGFja2tpdF9kZWZjb25maWcKaW5kZXggYTQ1YjU3NS4uMWM4ZmI4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9oYWNra2l0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2hhY2traXRfZGVmY29uZmlnCkBAIC03NDAsNyArNzQwLDYgQEAKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKIENPTkZJR19ERUJVR19VU0VSPXkKLUNPTkZJR19ERUJVR19XQUlUUT15CiBDT05GSUdfREVCVUdfRVJST1JTPXkKIENPTkZJR19ERUJVR19MTD15CiAjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pbnRlZ3JhdG9yX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW50ZWdyYXRvcl9kZWZjb25maWcKaW5kZXggZDFiYTdmZC4uM2NlOTZlNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9pbnRlZ3JhdG9yX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2ludGVncmF0b3JfZGVmY29uZmlnCkBAIC0xOTAsNiArMTkwLDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKICMKQEAgLTgzNCw3ICs4MzUsNiBAQAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKICMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9pb3AxM3h4X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW9wMTN4eF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlNDYxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW9wMTN4eF9kZWZjb25maWcKQEAgLTAsMCArMSwxMTM0IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTkKKyMgRnJpIERlYyAgMSAxMDo1MTowMSAyMDA2CisjCitDT05GSUdfQVJNPXkKKyMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1NMQUI9eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFZFUlNJT05TPXkKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9ERUFETElORT15CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iZGVhZGxpbmUiCisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BVDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ0xQUzc1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VQOTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ORVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorQ09ORklHX0FSQ0hfSU9QMTNYWD15CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorCisjCisjIElPUDEzWFggSW1wbGVtZW50YXRpb24gT3B0aW9ucworIworCisjCisjIElPUDEzWFggUGxhdGZvcm0gU3VwcG9ydAorIworQ09ORklHX01BQ0hfSVE4MTM0MFNDPXkKK0NPTkZJR19NQUNIX0lRODEzNDBNQz15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0MzPXkKK0NPTkZJR19DUFVfMzJ2NT15CitDT05GSUdfQ1BVX0FCUlRfRVY1VD15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQorQ09ORklHX0NQVV9UTEJfVjRXQkk9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQorQ09ORklHX0lPXzM2PXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKKworIworIyBCdXMgc3VwcG9ydAorIworQ09ORklHX1BDST15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCisjIENPTkZJR19BRUFCSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKK0NPTkZJR19DTURMSU5FPSJpcD1ib290cCByb290PW5mcyBjb25zb2xlPXR0eVMwLDExNTIwMCBuZnNyb290PSx0Y3AsdjMsd3NpemU9ODE5Mixyc2l6ZT04MTkyIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCitDT05GSUdfRlBFX05XRlBFPXkKKyMgQ09ORklHX0ZQRV9OV0ZQRV9YUCBpcyBub3Qgc2V0CisjIENPTkZJR19GUEVfRkFTVEZQRSBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorCisjCisjIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorQ09ORklHX01URF9SRURCT09UX1BBUlRTX1VOQUxMT0NBVEVEPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWT15CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworIyBDT05GSUdfTVREX0NIQVIgaXMgbm90IHNldAorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfTk9TV0FQPXkKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfR0VPTUVUUlkgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX09UUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHhmYTAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0yCitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorQ09ORklHX0NIUl9ERVZfU0c9eQorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTPXkKK0NPTkZJR19TQ1NJX1NBU19BVFRSUz15CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCisjCisjIENPTkZJR19BVEEgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCitDT05GSUdfTUQ9eQorQ09ORklHX0JMS19ERVZfTUQ9eQorIyBDT05GSUdfTURfTElORUFSIGlzIG5vdCBzZXQKK0NPTkZJR19NRF9SQUlEMD15CitDT05GSUdfTURfUkFJRDE9eQorQ09ORklHX01EX1JBSUQxMD15CitDT05GSUdfTURfUkFJRDQ1Nj15CisjIENPTkZJR19NRF9SQUlENV9SRVNIQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfRE09eQorIyBDT05GSUdfRE1fREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1fQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfRE1fU05BUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfRE1fTUlSUk9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX1pFUk8gaXMgbm90IHNldAorIyBDT05GSUdfRE1fTVVMVElQQVRIIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworIyBDT05GSUdfTkVUX0VUSEVSTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorQ09ORklHX0UxMDAwPXkKK0NPTkZJR19FMTAwMF9OQVBJPXkKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX1BDST15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MgorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9bQorQ09ORklHX0kyQ19BTEdPUENGPW0KK0NPTkZJR19JMkNfQUxHT1BDQT1tCisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0lPUDNYWD15CisjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCitDT05GSUdfUlRDX0xJQj15CisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEX1RDUD15CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CitDT05GSUdfU01CX0ZTPW0KKyMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfQ0lGUz1tCisjIENPTkZJR19DSUZTX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfV0VBS19QV19IQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19ERUJVRzIgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVVNFUj15CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19DUkNfQ0NJVFQ9eQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKK0NPTkZJR19MSUJDUkMzMkM9eQorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19QTElTVD15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2lvcDMyeF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2lvcDMyeF9kZWZjb25maWcKaW5kZXggMGQ2N2Y2Ni4uYjI3NWM1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9pb3AzMnhfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW9wMzJ4X2RlZmNvbmZpZwpAQCAtMTIwNCw3ICsxMjA0LDYgQEAKICMgQ09ORklHX0ZPUkNFRF9JTkxJTklORyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaW9wMzN4X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW9wMzN4X2RlZmNvbmZpZwppbmRleCAyYThmYzE1Li44NDhlM2FjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2lvcDMzeF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9pb3AzM3hfZGVmY29uZmlnCkBAIC0xMDUxLDcgKzEwNTEsNiBAQAogIyBDT05GSUdfRk9SQ0VEX0lOTElOSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19MTD15CiAjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peHAyMDAwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhwMjAwMF9kZWZjb25maWcKaW5kZXggMjdiM2UzMS4uYmJkMmRjZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9peHAyMDAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4cDIwMDBfZGVmY29uZmlnCkBAIC0xMDI2LDcgKzEwMjYsNiBAQAogQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19FUlJPUlM9eQogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2l4cDIzeHhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peHAyM3h4X2RlZmNvbmZpZwppbmRleCA3YjE4OTk3Li4wNmRlZWZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4cDIzeHhfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhwMjN4eF9kZWZjb25maWcKQEAgLTEzMDUsNyArMTMwNSw2IEBACiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhwNHh4X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaXhwNHh4X2RlZmNvbmZpZwppbmRleCA0OTc1YjkxLi5mYWJmNzRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4cDR4eF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9peHA0eHhfZGVmY29uZmlnCkBAIC0yMDYsMTAgKzIwNiw4IEBACiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwotQ09ORklHX1BNPXkKLUNPTkZJR19QTV9MRUdBQ1k9eQotIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAotQ09ORklHX0FQTT15CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUE0gaXMgbm90IHNldAogCiAjCiAjIE5ldHdvcmtpbmcKQEAgLTEyNDUsNyArMTI0Myw2IEBACiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvam9ybmFkYTcyMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2pvcm5hZGE3MjBfZGVmY29uZmlnCmluZGV4IGFkMTA0OGQuLjBjNTU2MjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvam9ybmFkYTcyMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9qb3JuYWRhNzIwX2RlZmNvbmZpZwpAQCAtMTgyLDYgKzE4Miw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUE0gaXMgbm90IHNldAogCiAjCkBAIC04ODgsNyArODg5LDYgQEAKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKICMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mva2FmYV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2thZmFfZGVmY29uZmlnCmluZGV4IDU0ZmNkNzUuLmE0Y2RhZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mva2FmYV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9rYWZhX2RlZmNvbmZpZwpAQCAtNTYwLDcgKzU2MCw3IEBACiAjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiAjCiAjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKLUNPTkZJR19BVDkxX1dBVENIRE9HPXkKK0NPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HPXkKICMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9rYjkyMDJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9rYjkyMDJfZGVmY29uZmlnCmluZGV4IGI0Y2Q0YjQuLmMxNjUzN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mva2I5MjAyX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2tiOTIwMl9kZWZjb25maWcKQEAgLTQzNyw3ICs0MzcsNyBAQAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAogIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUOTFfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUOTFSTTkyMDBfUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogCkBAIC03NTMsNyArNzUzLDYgQEAKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19FUlJPUlM9eQogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2xhcnRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9sYXJ0X2RlZmNvbmZpZwppbmRleCBjM2E5MzI4Li5hMWNjMzRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2xhcnRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbGFydF9kZWZjb25maWcKQEAgLTE4MCw2ICsxODAsNyBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15CisjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogQ09ORklHX0FQTT1tCiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbHBkMjcwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHBkMjcwX2RlZmNvbmZpZwppbmRleCA0YjI5ZTA5Li5lMTQ2MTg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2xwZDI3MF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9scGQyNzBfZGVmY29uZmlnCkBAIC05NDksNyArOTQ5LDYgQEAKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKIENPTkZJR19ERUJVR19MTD15CiAjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9scGQ3YTQwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2xwZDdhNDAwX2RlZmNvbmZpZwppbmRleCBiZjljZjljLi5mOGFjMjlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2xwZDdhNDAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2xwZDdhNDAwX2RlZmNvbmZpZwpAQCAtODUwLDcgKzg1MCw2IEBACiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKICMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9scGQ3YTQwNF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2xwZDdhNDA0X2RlZmNvbmZpZwppbmRleCAzYTU3YmUzLi40NmEwZjdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2xwZDdhNDA0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2xwZDdhNDA0X2RlZmNvbmZpZwpAQCAtMTEwMCw3ICsxMTAwLDYgQEAKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKICMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9sdWJib2NrX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHViYm9ja19kZWZjb25maWcKaW5kZXggODFkYWFkYy4uZTU0NGJmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9sdWJib2NrX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2x1YmJvY2tfZGVmY29uZmlnCkBAIC03NzIsNyArNzcyLDYgQEAKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKIENPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19FUlJPUlM9eQogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL21haW5zdG9uZV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL21haW5zdG9uZV9kZWZjb25maWcKaW5kZXggYjExMmJkNy4uY2M4Yzk1YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9tYWluc3RvbmVfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbWFpbnN0b25lX2RlZmNvbmZpZwpAQCAtNzY2LDcgKzc2Niw2IEBACiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKIENPTkZJR19ERUJVR19MTD15CiAjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9teDFhZHNfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9teDFhZHNfZGVmY29uZmlnCmluZGV4IGQxNmY2Y2QuLjU3N2Q3ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbXgxYWRzX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL214MWFkc19kZWZjb25maWcKQEAgLTY5MSw3ICs2OTEsNiBAQAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15CiAjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbmVwb25zZXRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9uZXBvbnNldF9kZWZjb25maWcKaW5kZXggM2QzNTI1NS4uZTg2Nzk0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9uZXBvbnNldF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9uZXBvbnNldF9kZWZjb25maWcKQEAgLTE5MCw2ICsxOTAsNyBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15CisjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogQ09ORklHX0FQTT15CiAKICMKQEAgLTExMTQsNyArMTExNSw2IEBACiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKIENPTkZJR19ERUJVR19MTD15CiAjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9uZXR3aW5kZXJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9uZXR3aW5kZXJfZGVmY29uZmlnCmluZGV4IDJjYWUxZWEuLmMxYTYzYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbmV0d2luZGVyX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL25ldHdpbmRlcl9kZWZjb25maWcKQEAgLTk5NCw3ICs5OTQsNiBAQAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRVJST1JTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9uZXR4X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbmV0eF9kZWZjb25maWcKaW5kZXggNjExMTVhNy4uNTdmMzJmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9uZXR4X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL25ldHhfZGVmY29uZmlnCkBAIC04NzIsNyArODcyLDYgQEAKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19FUlJPUlM9eQogIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcKaW5kZXggMDVhZGIwYi4uYjBlZmQ0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLUNPTkZJR19QTV9MRUdBQ1k9eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb25lYXJtX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb25lYXJtX2RlZmNvbmZpZwppbmRleCBjYjFkOTRmLi4wNDk4ZWJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29uZWFybV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9vbmVhcm1fZGVmY29uZmlnCkBAIC02MDcsNyArNjA3LDcgQEAKICMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0FUOTFfV0FUQ0hET0c9eQorQ09ORklHX0FUOTFSTTkyMDBfV0FUQ0hET0c9eQogCiAjCiAjIFVTQi1iYXNlZCBXYXRjaGRvZyBDYXJkcwpAQCAtMTA0NSw3ICsxMDQ1LDYgQEAKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3BsZWJfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9wbGViX2RlZmNvbmZpZwppbmRleCAyNGU4YmRkLi5hNmI0N2VhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3BsZWJfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvcGxlYl9kZWZjb25maWcKQEAgLTcyMSw3ICs3MjEsNiBAQAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3BueDQwMDhfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9wbng0MDA4X2RlZmNvbmZpZwppbmRleCBhNDk4OWY0Li5iNWUxMWFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3BueDQwMDhfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvcG54NDAwOF9kZWZjb25maWcKQEAgLTE2MDQsNyArMTYwNCw2IEBACiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3B4YTI1NS1pZHBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9weGEyNTUtaWRwX2RlZmNvbmZpZwppbmRleCBiNzFkMzFhLi40NmU1MDg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3B4YTI1NS1pZHBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvcHhhMjU1LWlkcF9kZWZjb25maWcKQEAgLTc2OCw3ICs3NjgsNiBAQAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvcmVhbHZpZXctc21wX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvcmVhbHZpZXctc21wX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzM5YmExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlldy1zbXBfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTkzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMzCisjIFdlZCBPY3QgMjUgMTQ6MTI6MDAgMjAwNgorIworQ09ORklHX0FSTT15CisjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKK0NPTkZJR19TVE9QX01BQ0hJTkU9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfREVBRExJTkU9eQorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImRlYWRsaW5lIgorCisjCisjIFN5c3RlbSBUeXBlCisjCisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU5URUdSQVRPUiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9SRUFMVklFVz15CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorCisjCisjIFJlYWxWaWV3IHBsYXRmb3JtIHR5cGUKKyMKK0NPTkZJR19NQUNIX1JFQUxWSUVXX0VCPXkKK0NPTkZJR19SRUFMVklFV19NUENPUkU9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVXzMyPXkKKyMgQ09ORklHX0NQVV9BUk05MjZUIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfVjY9eQorQ09ORklHX0NQVV8zMnY2Sz15CitDT05GSUdfQ1BVXzMydjY9eQorQ09ORklHX0NQVV9BQlJUX0VWNj15CitDT05GSUdfQ1BVX0NBQ0hFX1Y2PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklQVD15CitDT05GSUdfQ1BVX0NPUFlfVjY9eQorQ09ORklHX0NQVV9UTEJfVjY9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfVExTX1JFRz15CitDT05GSUdfQVJNX0dJQz15CitDT05GSUdfSUNTVDMwNz15CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKK0NPTkZJR19BUk1fQU1CQT15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9NAorQ09ORklHX0hPVFBMVUdfQ1BVPXkKK0NPTkZJR19MT0NBTF9USU1FUlM9eQorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0xMDAKKyMgQ09ORklHX0FFQUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xMC4xLjY5LjM6L3dvcmsvbmZzcm9vdCBpcD1kaGNwIGNvbnNvbGU9dHR5QU1BMCBtZW09MTI4TSIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorQ09ORklHX1ZGUD15CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorCisjCisjIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0FSTV9JTlRFR1JBVE9SPXkKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19TTUM5MVg9eQorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0FNQkFLTUk9eQorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19TRVJJQUxfQU1CQV9QTDAxMCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0FNQkFfUEwwMTE9eQorQ09ORklHX1NFUklBTF9BTUJBX1BMMDExX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CitDT05GSUdfRkI9eQorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9BUk1DTENEPXkKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CisKKyMKKyMgTG9nbyBjb25maWd1cmF0aW9uCisjCitDT05GSUdfTE9HTz15CisjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAorIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CitDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKK0NPTkZJR19TT1VORD15CisKKyMKKyMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCisjCitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfVElNRVI9eQorQ09ORklHX1NORF9QQ009eQorIyBDT05GSUdfU05EX1NFUVVFTkNFUiBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTPXkKK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorCisjCisjIEdlbmVyaWMgZGV2aWNlcworIworQ09ORklHX1NORF9BQzk3X0NPREVDPW0KK0NPTkZJR19TTkRfQUM5N19CVVM9bQorIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKworIworIyBBTFNBIEFSTSBkZXZpY2VzCisjCitDT05GSUdfU05EX0FSTUFBQ0k9bQorCisjCisjIE9wZW4gU291bmQgU3lzdGVtCisjCisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworQ09ORklHX01NQz15CisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01NQ19CTE9DSz15CitDT05GSUdfTU1DX0FSTU1NQ0k9eQorIyBDT05GSUdfTU1DX1RJRk1fU0QgaXMgbm90IHNldAorCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKK0NPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUw9eQorCisjCisjIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9QTDAzMT15CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKKyMgQ09ORklHX0lOT1RJRllfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1BJTkxPQ0s9eQorQ09ORklHX0RFQlVHX01VVEVYRVM9eQorQ09ORklHX0RFQlVHX1JXU0VNUz15CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1VTRVI9eQorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfUExJU1Q9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9yZWFsdmlld19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3X2RlZmNvbmZpZwppbmRleCAzZjFlYzRlLi5hY2NiZjUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3JlYWx2aWV3X2RlZmNvbmZpZwpAQCAtNzU5LDcgKzc1OSw2IEBACiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKICMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9ycGNfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9ycGNfZGVmY29uZmlnCmluZGV4IGI0OThhZmQuLmJjMDkxMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvcnBjX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3JwY19kZWZjb25maWcKQEAgLTkxMCw3ICs5MTAsNiBAQAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnCmluZGV4IGE4MzIyMjYuLjNiMzFhMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZwpAQCAtMSw5ICsxLDEwIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgV2VkIFNlcCAyMCAyMDoyNzozMSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmM0CisjIEZyaSBOb3YgIDMgMTc6NDE6MzEgMjAwNgogIwogQ09ORklHX0FSTT15CisjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAogQ09ORklHX01NVT15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CkBAIC0yOSwxNyArMzAsMjAgQEAKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKLUNPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTYyLDcgKzY2LDggQEAKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKICMKIENPTkZJR19NT0RVTEVTPXkKLSMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0tNT0Q9eQpAQCAtNzAsNiArNzUsNyBAQAogIwogIyBCbG9jayBsYXllcgogIworQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogCiAjCkBAIC0xMjAsNiArMTI2LDcgQEAKICMKICMgUzNDMjRYWCBJbXBsZW1lbnRhdGlvbnMKICMKKyMgQ09ORklHX01BQ0hfQU1MX001OTAwIGlzIG5vdCBzZXQKIENPTkZJR19NQUNIX0FOVUJJUz15CiBDT05GSUdfTUFDSF9PU0lSSVM9eQogQ09ORklHX0FSQ0hfQkFTVD15CkBAIC0xNzgsNiArMTg1LDggQEAKIENPTkZJR19DUFVfQ0FDSEVfVklWVD15CiBDT05GSUdfQ1BVX0NPUFlfVjRXQj15CiBDT05GSUdfQ1BVX1RMQl9WNFdCST15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CiAKICMKICMgUHJvY2Vzc29yIEZlYXR1cmVzCkBAIC0yNDksOCArMjU4LDkgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQotQ09ORklHX1BNX0xFR0FDWT15CisjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUE1fU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiBDT05GSUdfQVBNPXkKIAogIwpAQCAtMjY2LDYgKzI3Niw3IEBACiBDT05GSUdfVU5JWD15CiBDT05GSUdfWEZSTT15CiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTI4NiwxMCArMjk3LDEyIEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQklDPXkKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CkBAIC0zNzcsNiArMzkwLDcgQEAKICMgQ09ORklHX05GVEwgaXMgbm90IHNldAogIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAogIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CiAKICMKICMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKQEAgLTQxOCw2ICs0MzIsOCBAQAogIwogIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01URF9EQVRBRkxBU0ggaXMgbm90IHNldAorIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldApAQCAtNTEyLDYgKzUyOCw3IEBACiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQpAQCAtNjA2LDYgKzYyMyw3IEBACiAjIElucHV0IGRldmljZSBzdXBwb3J0CiAjCiBDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CiAKICMKICMgVXNlcmxhbmQgaW50ZXJmYWNlcwpAQCAtNjI4LDYgKzY0Niw3IEBACiAjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAogQ09ORklHX0lOUFVUX01PVVNFPXkKIENPTkZJR19NT1VTRV9QUzI9eQogIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKQEAgLTczNCw3ICs3NTMsNiBAQAogIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKICMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19TM0MyNDEwX1JUQz15CiAjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKIApAQCAtNzQ3LDcgKzc2NSw2IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgc3VwcG9ydApAQCAtNzkyLDEyICs4MDksMjYgQEAKICMKICMgU1BJIHN1cHBvcnQKICMKLSMgQ09ORklHX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TUElfTUFTVEVSPXkKKworIworIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1NQSV9CSVRCQU5HPW0KKyMgQ09ORklHX1NQSV9CVVRURVJGTFkgaXMgbm90IHNldAorQ09ORklHX1NQSV9TM0MyNFhYX0dQSU89bQorQ09ORklHX1NQSV9TM0MyNFhYPW0KKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIwogCiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKQEAgLTgyMCw2ICs4NTEsNyBAQAogIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTcwIGlzIG5vdCBzZXQKIENPTkZJR19TRU5TT1JTX0xNNzU9bQogIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKIENPTkZJR19TRU5TT1JTX0xNNzg9bQpAQCAtODM0LDYgKzg2Niw3IEBACiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldApAQCAtODQ1LDI1ICs4NzgsMzEgQEAKICMKICMgTWlzYyBkZXZpY2VzCiAjCisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAogCiAjCiAjIExFRCBkZXZpY2VzCiAjCi0jIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CitDT05GSUdfTkVXX0xFRFM9eQorQ09ORklHX0xFRFNfQ0xBU1M9bQogCiAjCiAjIExFRCBkcml2ZXJzCiAjCitDT05GSUdfTEVEU19TM0MyNFhYPW0KIAogIwogIyBMRUQgVHJpZ2dlcnMKICMKK0NPTkZJR19MRURTX1RSSUdHRVJTPXkKK0NPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9bQorIyBDT05GSUdfTEVEU19UUklHR0VSX0lERV9ESVNLIGlzIG5vdCBzZXQKK0NPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPW0KIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15CiAKICMKICMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwpAQCAtODc2LDYgKzkxNSw3IEBACiAjCiBDT05GSUdfRklSTVdBUkVfRURJRD15CiBDT05GSUdfRkI9eQorIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKIENPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQogQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CiBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CkBAIC05NTEsNyArOTkxLDYgQEAKICMKICMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgogIwotIyBDT05GSUdfVVNCX1NUT1JBR0UgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtMTAwNyw2ICsxMDQ2LDcgQEAKICMKICMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CkBAIC0xMDE0LDExICsxMDU0LDEyIEBACiAjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTAzOSw3ICsxMDgwLDM3IEBACiAjIFJlYWwgVGltZSBDbG9jawogIwogQ09ORklHX1JUQ19MSUI9eQotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorCisjCisjIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfUzNDPXkKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCkBAIC0xMDUxLDYgKzExMjIsNyBAQAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKQEAgLTEwNTgsNiArMTEzMCw3IEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CkBAIC0xMDg5LDYgKzExNjIsNyBAQAogIyBQc2V1ZG8gZmlsZXN5c3RlbXMKICMKIENPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKQEAgLTEyMTksNiArMTI5Myw3IEBACiAjIEtlcm5lbCBoYWNraW5nCiAjCiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQpAQCAtMTIzOCwxMiArMTMxMywxMiBAQAogQ09ORklHX0RFQlVHX0lORk89eQogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15Ci0jIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0xMPXkKICMgQ09ORklHX0RFQlVHX0lDRURDQyBpcyBub3Qgc2V0CkBAIC0xMjYyLDEwICsxMzM3LDYgQEAKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zaGFya19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3NoYXJrX2RlZmNvbmZpZwppbmRleCBjNDhkMTcwLi45YjY1NjFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3NoYXJrX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3NoYXJrX2RlZmNvbmZpZwpAQCAtOTY1LDcgKzk2NSw2IEBACiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19FUlJPUlMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3NpbXBhZF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3NpbXBhZF9kZWZjb25maWcKaW5kZXggMmU1YTYxNi4uMDNmNzgzZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zaW1wYWRfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc2ltcGFkX2RlZmNvbmZpZwpAQCAtMTgwLDYgKzE4MCw3IEBACiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiBDT05GSUdfQVBNPXkKIAogIwpAQCAtOTMzLDcgKzkzNCw2IEBACiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfREVCVUdfVVNFUj15Ci0jIENPTkZJR19ERUJVR19XQUlUUSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRVJST1JTPXkKIENPTkZJR19ERUJVR19MTD15CiAjIENPTkZJR19ERUJVR19JQ0VEQ0MgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zbWRrMjQxMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3NtZGsyNDEwX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxMjNkMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL3NtZGsyNDEwX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDczNSArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgotIyBTdW4gTWFyIDI3IDIyOjQyOjQwIDIwMDUKLSMKLUNPTkZJR19BUk09eQotQ09ORklHX01NVT15Ci1DT05GSUdfVUlEMTY9eQotQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci1DT05GSUdfS09CSkVDVF9VRVZFTlQ9eQotIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAotIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAotQ09ORklHX0tBTExTWU1TPXkKLSMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gVHlwZQotIwotIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfUzNDMjQxMD15Ci0jIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0Ci0KLSMKLSMgUzNDMjRYWCBJbXBsZW1lbnRhdGlvbnMKLSMKLSMgQ09ORklHX0FSQ0hfQkFTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0gxOTQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfTjMwIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1NNREsyNDEwPXkKLSMgQ09ORklHX0FSQ0hfUzNDMjQ0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX1ZSMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX1JYMzcxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX09UT00gaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9ORVhDT0RFUl8yNDQwIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfUzNDMjQxMD15Ci0KLSMKLSMgUzNDMjQxMCBCb290Ci0jCi0KLSMKLSMgUzNDMjQxMCBTZXR1cAotIwotIyBDT05GSUdfUzNDMjQxMF9ETUEgaXMgbm90IHNldAotQ09ORklHX1MzQzI0MTBfTE9XTEVWRUxfVUFSVF9QT1JUPTAKLQotIwotIyBQcm9jZXNzb3IgVHlwZQotIwotQ09ORklHX0NQVV8zMj15Ci1DT05GSUdfQ1BVX0FSTTkyMFQ9eQotQ09ORklHX0NQVV8zMnY0PXkKLUNPTkZJR19DUFVfQUJSVF9FVjRUPXkKLUNPTkZJR19DUFVfQ0FDSEVfVjRXVD15Ci1DT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQotQ09ORklHX0NQVV9DT1BZX1Y0V0I9eQotQ09ORklHX0NQVV9UTEJfVjRXQkk9eQotCi0jCi0jIFByb2Nlc3NvciBGZWF0dXJlcwotIwotQ09ORklHX0FSTV9USFVNQj15Ci0jIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9EQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLQotIwotIyBCdXMgc3VwcG9ydAotIwotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIEZlYXR1cmVzCi0jCi0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19BTElHTk1FTlRfVFJBUD15Ci0KLSMKLSMgQm9vdCBvcHRpb25zCi0jCi1DT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCi1DT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJyb290PTFmMDQgbWVtPTMyTSIKLSMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAotCi0jCi0jIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgotIwotCi0jCi0jIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAotIwotIyBDT05GSUdfRlBFX05XRlBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKLQotIwotIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKLSMKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfQU9VVD15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwotIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotQ09ORklHX01URD15Ci0jIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEFSVElUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKLSMKLUNPTkZJR19NVERfQ0hBUj15Ci1DT05GSUdfTVREX0JMT0NLPXkKLSMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKLQotIwotIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwotIwotQ09ORklHX01URF9DRkk9eQotIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAotQ09ORklHX01URF9HRU5fUFJPQkU9eQotIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0kxPXkKLUNPTkZJR19NVERfQ0ZJX0kyPXkKLSMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0NGSV9JTlRFTEVYVD15Ci0jIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfVVRJTD15Ci0jIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfWElQIGlzIG5vdCBzZXQKLQotIwotIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCi0jCi0jIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQVJNX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0VEQjczMTIgaXMgbm90IHNldAotCi0jCi0jIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBOZXR3b3JraW5nIHN1cHBvcnQKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QPXkKLSMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUM5MVggaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi1DT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQotQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKLSMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAotQ09ORklHX0lOUFVUX01PVVNFPXkKLUNPTkZJR19NT1VTRV9QUzI9eQotIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotQ09ORklHX1NFUklPX1NFUlBPUlQ9eQotQ09ORklHX1NFUklPX0xJQlBTMj15Ci0jIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotQ09ORklHX1ZUPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLSMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX1MzQzI0MTA9eQotQ09ORklHX1NFUklBTF9TM0MyNDEwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MzQzI0MTBfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIFRQTSBkZXZpY2VzCi0jCi0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi1DT05GSUdfRkI9eQotQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15Ci1DT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKLUNPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKLUNPTkZJR19GQl9TT0ZUX0NVUlNPUj15Ci0jIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9WSVJUVUFMPXkKLQotIwotIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLUNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKLSMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKLUNPTkZJR19GT05UXzh4OD15Ci1DT05GSUdfRk9OVF84eDE2PXkKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0xPR08gaXMgbm90IHNldAotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCi1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0IgaXMgbm90IHNldAotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLSMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KQkQgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBYRlMgc3VwcG9ydAotIwotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ST01GU19GUz15Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKLUNPTkZJR19ORlNfRlM9eQotIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLUNPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQotIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi0jIENPTkZJR19OTFMgaXMgbm90IHNldAotCi0jCi0jIFByb2ZpbGluZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfQlVHVkVSQk9TRT15Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19GUkFNRV9QT0lOVEVSPXkKLUNPTkZJR19ERUJVR19VU0VSPXkKLSMgQ09ORklHX0RFQlVHX1dBSVRRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0VSUk9SUyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfTEw9eQotIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19TM0MyNDEwX1BPUlQ9eQotQ09ORklHX0RFQlVHX1MzQzI0MTBfVUFSVD0wCi0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0Ci0KLSMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCi0jCi0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCi0jCi0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLUNPTkZJR19DUkMzMj15Ci1DT05GSUdfTElCQ1JDMzJDPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvc3BpdHpfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zcGl0el9kZWZjb25maWcKaW5kZXggZDFhY2UzYS4uYWE3YTAxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zcGl0el9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zcGl0el9kZWZjb25maWcKQEAgLTIwNyw2ICsyMDcsNyBAQAogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15CisjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogQ09ORklHX0FQTT15CiAKICMKQEAgLTE0MDUsNyArMTQwNiw2IEBACiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvdmVyc2F0aWxlX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvdmVyc2F0aWxlX2RlZmNvbmZpZwppbmRleCA5NmI3YTc3Li40OGRjYTY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3ZlcnNhdGlsZV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy92ZXJzYXRpbGVfZGVmY29uZmlnCkBAIC0yMDAsNyArMjAwLDcgQEAKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQotQ09ORklHX1BNX0xFR0FDWT15CisjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKIApAQCAtOTcyLDcgKzk3Miw2IEBACiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0VSUk9SUz15CiBDT05GSUdfREVCVUdfTEw9eQogIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQppbmRleCAxMzIwYTBlLi5hYjA2YTg2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCkBAIC0yNCw3ICsyNCw5IEBACiBvYmotJChDT05GSUdfQ1JVTkNIKQkJKz0gY3J1bmNoLm8gY3J1bmNoLWJpdHMubwogQUZMQUdTX2NydW5jaC1iaXRzLm8JCTo9IC1XYSwtbWNwdT1lcDkzMTIKIAotb2JqLSQoQ09ORklHX0lXTU1YVCkJCSs9IGl3bW14dC5vIGl3bW14dC1ub3RpZmllci5vCitvYmotJChDT05GSUdfQ1BVX1hTQ0FMRSkJKz0geHNjYWxlLWNwMC5vCitvYmotJChDT05GSUdfQ1BVX1hTQzMpCQkrPSB4c2NhbGUtY3AwLm8KK29iai0kKENPTkZJR19JV01NWFQpCQkrPSBpd21teHQubwogQUZMQUdTX2l3bW14dC5vCQkJOj0gLVdhLC1tY3B1PWl3bW14dAogCiBpZm5lcSAoJChDT05GSUdfQVJDSF9FQlNBMTEwKSx5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FwbS5jIGIvYXJjaC9hcm0va2VybmVsL2FwbS5jCmluZGV4IGVjZjRmOTQuLjJjMzdiNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2FybS9rZXJuZWwvYXBtLmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgpAQCAtMjYsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vYXBtLmg+IC8qIGFwbV9wb3dlcl9pbmZvICovCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNzEsNyArNzEsOCBAQAogI2RlZmluZSBTVVNQRU5EX1BFTkRJTkcJMQkJLyogc3VzcGVuZCBwZW5kaW5nIHJlYWQgKi8KICNkZWZpbmUgU1VTUEVORF9SRUFECTIJCS8qIHN1c3BlbmQgcmVhZCwgcGVuZGluZyBhY2sgKi8KICNkZWZpbmUgU1VTUEVORF9BQ0tFRAkzCQkvKiBzdXNwZW5kIGFja2VkICovCi0jZGVmaW5lIFNVU1BFTkRfRE9ORQk0CQkvKiBzdXNwZW5kIGNvbXBsZXRlZCAqLworI2RlZmluZSBTVVNQRU5EX1dBSVQJNAkJLyogd2FpdGluZyBmb3Igc3VzcGVuZCAqLworI2RlZmluZSBTVVNQRU5EX0RPTkUJNQkJLyogc3VzcGVuZCBjb21wbGV0ZWQgKi8KIAogCXN0cnVjdCBhcG1fcXVldWUJcXVldWU7CiB9OwpAQCAtMTAxLDYgKzEwMiw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGthcG1kX3F1ZXVlX2xvY2spOwogc3RhdGljIHN0cnVjdCBhcG1fcXVldWUga2FwbWRfcXVldWU7CiAKK3N0YXRpYyBERUZJTkVfTVVURVgoc3RhdGVfbG9jayk7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl92ZXJzaW9uW10gPSAiMS4xMyI7CS8qIG5vIHNwYWNlcyAqLwogCkBAIC0xNDgsNDAgKzE1MCw2MiBAQAogCXEtPmV2ZW50c1txLT5ldmVudF9oZWFkXSA9IGV2ZW50OwogfQogCi1zdGF0aWMgdm9pZCBxdWV1ZV9ldmVudF9vbmVfdXNlcihzdHJ1Y3QgYXBtX3VzZXIgKmFzLCBhcG1fZXZlbnRfdCBldmVudCkKLXsKLQlpZiAoYXMtPnN1c2VyICYmIGFzLT53cml0ZXIpIHsKLQkJc3dpdGNoIChldmVudCkgewotCQljYXNlIEFQTV9TWVNfU1VTUEVORDoKLQkJY2FzZSBBUE1fVVNFUl9TVVNQRU5EOgotCQkJLyoKLQkJCSAqIElmIHRoaXMgdXNlciBhbHJlYWR5IGhhcyBhIHN1c3BlbmQgcGVuZGluZywKLQkJCSAqIGRvbid0IHF1ZXVlIGFub3RoZXIgb25lLgotCQkJICovCi0JCQlpZiAoYXMtPnN1c3BlbmRfc3RhdGUgIT0gU1VTUEVORF9OT05FKQotCQkJCXJldHVybjsKLQotCQkJYXMtPnN1c3BlbmRfc3RhdGUgPSBTVVNQRU5EX1BFTkRJTkc7Ci0JCQlzdXNwZW5kc19wZW5kaW5nKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlxdWV1ZV9hZGRfZXZlbnQoJmFzLT5xdWV1ZSwgZXZlbnQpOwotfQotCi1zdGF0aWMgdm9pZCBxdWV1ZV9ldmVudChhcG1fZXZlbnRfdCBldmVudCwgc3RydWN0IGFwbV91c2VyICpzZW5kZXIpCitzdGF0aWMgdm9pZCBxdWV1ZV9ldmVudChhcG1fZXZlbnRfdCBldmVudCkKIHsKIAlzdHJ1Y3QgYXBtX3VzZXIgKmFzOwogCiAJZG93bl9yZWFkKCZ1c2VyX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhcywgJmFwbV91c2VyX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGFzICE9IHNlbmRlciAmJiBhcy0+cmVhZGVyKQotCQkJcXVldWVfZXZlbnRfb25lX3VzZXIoYXMsIGV2ZW50KTsKKwkJaWYgKGFzLT5yZWFkZXIpCisJCQlxdWV1ZV9hZGRfZXZlbnQoJmFzLT5xdWV1ZSwgZXZlbnQpOwogCX0KIAl1cF9yZWFkKCZ1c2VyX2xpc3RfbG9jayk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhcG1fd2FpdHF1ZXVlKTsKIH0KIAorLyoKKyAqIHF1ZXVlX3N1c3BlbmRfZXZlbnQgLSBxdWV1ZSBhbiBBUE0gc3VzcGVuZCBldmVudC4KKyAqCisgKiBDaGVjayB0aGF0IHdlJ3JlIGluIGEgc3RhdGUgd2hlcmUgd2UgY2FuIHN1c3BlbmQuICBJZiBub3QsCisgKiByZXR1cm4gLUVCVVNZLiAgT3RoZXJ3aXNlLCBxdWV1ZSBhbiBldmVudCB0byBhbGwgIndyaXRlciIKKyAqIHVzZXJzLiAgSWYgdGhlcmUgYXJlIG5vICJ3cml0ZXIiIHVzZXJzLCByZXR1cm4gJzEnIHRvCisgKiBpbmRpY2F0ZSB0aGF0IHdlIGNhbiBpbW1lZGlhdGVseSBzdXNwZW5kLgorICovCitzdGF0aWMgaW50IHF1ZXVlX3N1c3BlbmRfZXZlbnQoYXBtX2V2ZW50X3QgZXZlbnQsIHN0cnVjdCBhcG1fdXNlciAqc2VuZGVyKQoreworCXN0cnVjdCBhcG1fdXNlciAqYXM7CisJaW50IHJldCA9IDE7CisKKwltdXRleF9sb2NrKCZzdGF0ZV9sb2NrKTsKKwlkb3duX3JlYWQoJnVzZXJfbGlzdF9sb2NrKTsKKworCS8qCisJICogSWYgYSB0aHJlYWQgaXMgc3RpbGwgcHJvY2Vzc2luZywgd2UgY2FuJ3Qgc3VzcGVuZCwgc28gcmVqZWN0CisJICogdGhlIHJlcXVlc3QuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhcywgJmFwbV91c2VyX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGFzICE9IHNlbmRlciAmJiBhcy0+cmVhZGVyICYmIGFzLT53cml0ZXIgJiYgYXMtPnN1c2VyICYmCisJCSAgICBhcy0+c3VzcGVuZF9zdGF0ZSAhPSBTVVNQRU5EX05PTkUpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhcywgJmFwbV91c2VyX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGFzICE9IHNlbmRlciAmJiBhcy0+cmVhZGVyICYmIGFzLT53cml0ZXIgJiYgYXMtPnN1c2VyKSB7CisJCQlhcy0+c3VzcGVuZF9zdGF0ZSA9IFNVU1BFTkRfUEVORElORzsKKwkJCXN1c3BlbmRzX3BlbmRpbmcrKzsKKwkJCXF1ZXVlX2FkZF9ldmVudCgmYXMtPnF1ZXVlLCBldmVudCk7CisJCQlyZXQgPSAwOworCQl9CisJfQorIG91dDoKKwl1cF9yZWFkKCZ1c2VyX2xpc3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZV9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFwbV93YWl0cXVldWUpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIGFwbV9zdXNwZW5kKHZvaWQpCiB7CiAJc3RydWN0IGFwbV91c2VyICphczsKQEAgLTE5MSwxNyArMjE1LDIyIEBACiAJICogQW55b25lIG9uIHRoZSBBUE0gcXVldWVzIHdpbGwgdGhpbmsgd2UncmUgc3RpbGwgc3VzcGVuZGVkLgogCSAqIFNlbmQgYSBtZXNzYWdlIHNvIGV2ZXJ5b25lIGtub3dzIHdlJ3JlIG5vdyBhd2FrZSBhZ2Fpbi4KIAkgKi8KLQlxdWV1ZV9ldmVudChBUE1fTk9STUFMX1JFU1VNRSwgTlVMTCk7CisJcXVldWVfZXZlbnQoQVBNX05PUk1BTF9SRVNVTUUpOwogCiAJLyoKIAkgKiBGaW5hbGx5LCB3YWtlIHVwIGFueW9uZSB3aG8gaXMgc2xlZXBpbmcgb24gdGhlIHN1c3BlbmQuCiAJICovCisJbXV0ZXhfbG9jaygmc3RhdGVfbG9jayk7CiAJZG93bl9yZWFkKCZ1c2VyX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhcywgJmFwbV91c2VyX2xpc3QsIGxpc3QpIHsKLQkJYXMtPnN1c3BlbmRfcmVzdWx0ID0gZXJyOwotCQlhcy0+c3VzcGVuZF9zdGF0ZSA9IFNVU1BFTkRfRE9ORTsKKwkJaWYgKGFzLT5zdXNwZW5kX3N0YXRlID09IFNVU1BFTkRfV0FJVCB8fAorCQkgICAgYXMtPnN1c3BlbmRfc3RhdGUgPT0gU1VTUEVORF9BQ0tFRCkgeworCSAgCQlhcy0+c3VzcGVuZF9yZXN1bHQgPSBlcnI7CisJCQlhcy0+c3VzcGVuZF9zdGF0ZSA9IFNVU1BFTkRfRE9ORTsKKwkJfQogCX0KIAl1cF9yZWFkKCZ1c2VyX2xpc3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZV9sb2NrKTsKIAogCXdha2VfdXAoJmFwbV9zdXNwZW5kX3dhaXRxdWV1ZSk7CiB9CkBAIC0yMjcsOCArMjU2LDExIEBACiAJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZXZlbnQsIHNpemVvZihldmVudCkpKQogCQkJYnJlYWs7CiAKLQkJaWYgKGV2ZW50ID09IEFQTV9TWVNfU1VTUEVORCB8fCBldmVudCA9PSBBUE1fVVNFUl9TVVNQRU5EKQorCQltdXRleF9sb2NrKCZzdGF0ZV9sb2NrKTsKKwkJaWYgKGFzLT5zdXNwZW5kX3N0YXRlID09IFNVU1BFTkRfUEVORElORyAmJgorCQkgICAgKGV2ZW50ID09IEFQTV9TWVNfU1VTUEVORCB8fCBldmVudCA9PSBBUE1fVVNFUl9TVVNQRU5EKSkKIAkJCWFzLT5zdXNwZW5kX3N0YXRlID0gU1VTUEVORF9SRUFEOworCQltdXRleF91bmxvY2soJnN0YXRlX2xvY2spOwogCiAJCWJ1ZiArPSBzaXplb2YoZXZlbnQpOwogCQlpIC09IHNpemVvZihldmVudCk7CkBAIC0yNzAsOSArMzAyLDEzIEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgQVBNX0lPQ19TVVNQRU5EOgorCQltdXRleF9sb2NrKCZzdGF0ZV9sb2NrKTsKKwogCQlhcy0+c3VzcGVuZF9yZXN1bHQgPSAtRUlOVFI7CiAKIAkJaWYgKGFzLT5zdXNwZW5kX3N0YXRlID09IFNVU1BFTkRfUkVBRCkgeworCQkJaW50IHBlbmRpbmc7CisKIAkJCS8qCiAJCQkgKiBJZiB3ZSByZWFkIGEgc3VzcGVuZCBjb21tYW5kIGZyb20gL2Rldi9hcG1fYmlvcywKIAkJCSAqIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgQVBNX0lPQ19TVVNQRU5EIGlvY3RsIGlzCkBAIC0yODAsNDcgKzMxNiw3MyBAQAogCQkJICovCiAJCQlhcy0+c3VzcGVuZF9zdGF0ZSA9IFNVU1BFTkRfQUNLRUQ7CiAJCQlzdXNwZW5kc19wZW5kaW5nLS07CisJCQlwZW5kaW5nID0gc3VzcGVuZHNfcGVuZGluZyA9PSAwOworCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZV9sb2NrKTsKKworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBubyBmdXJ0aGVyIGFja25vd2xlZGdlcyByZXF1aXJlZCwKKwkJCSAqIHN1c3BlbmQgdGhlIHN5c3RlbS4KKwkJCSAqLworCQkJaWYgKHBlbmRpbmcpCisJCQkJYXBtX3N1c3BlbmQoKTsKKworCQkJLyoKKwkJCSAqIFdhaXQgZm9yIHRoZSBzdXNwZW5kL3Jlc3VtZSB0byBjb21wbGV0ZS4gIElmIHRoZXJlCisJCQkgKiBhcmUgcGVuZGluZyBhY2tub3dsZWRnZXMsIHdlIHdhaXQgaGVyZSBmb3IgdGhlbS4KKwkJCSAqCisJCQkgKiBOb3RlOiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBQTSBzdWJzeXN0ZW0gZG9lcworCQkJICogbm90IGtpY2sgdXMgb3V0IG9mIHRoZSB3YWl0IHdoZW4gaXQgc3VzcGVuZHMgdGhlCisJCQkgKiB0aHJlYWRzLgorCQkJICovCisJCQlmbGFncyA9IGN1cnJlbnQtPmZsYWdzOworCQkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKwkJCXdhaXRfZXZlbnQoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlLAorCQkJCSAgIGFzLT5zdXNwZW5kX3N0YXRlID09IFNVU1BFTkRfRE9ORSk7CiAJCX0gZWxzZSB7CisJCQlhcy0+c3VzcGVuZF9zdGF0ZSA9IFNVU1BFTkRfV0FJVDsKKwkJCW11dGV4X3VubG9jaygmc3RhdGVfbG9jayk7CisKIAkJCS8qCiAJCQkgKiBPdGhlcndpc2UgaXQgaXMgYSByZXF1ZXN0IHRvIHN1c3BlbmQgdGhlIHN5c3RlbS4KIAkJCSAqIFF1ZXVlIGFuIGV2ZW50IGZvciBhbGwgcmVhZGVycywgYW5kIGV4cGVjdCBhbgogCQkJICogYWNrbm93bGVkZ2UgZnJvbSBhbGwgd3JpdGVycyB3aG8gaGF2ZW4ndCBhbHJlYWR5CiAJCQkgKiBhY2tub3dsZWRnZWQuCiAJCQkgKi8KLQkJCXF1ZXVlX2V2ZW50KEFQTV9VU0VSX1NVU1BFTkQsIGFzKTsKLQkJfQorCQkJZXJyID0gcXVldWVfc3VzcGVuZF9ldmVudChBUE1fVVNFUl9TVVNQRU5ELCBhcyk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCS8qCisJCQkJICogQXZvaWQgdGFraW5nIHRoZSBsb2NrIGhlcmUgLSB0aGlzCisJCQkJICogc2hvdWxkIGJlIGZpbmUuCisJCQkJICovCisJCQkJYXMtPnN1c3BlbmRfc3RhdGUgPSBTVVNQRU5EX05PTkU7CisJCQkJYnJlYWs7CisJCQl9CiAKLQkJLyoKLQkJICogSWYgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgYWNrbm93bGVkZ2VzIHJlcXVpcmVkLCBzdXNwZW5kCi0JCSAqIHRoZSBzeXN0ZW0uCi0JCSAqLwotCQlpZiAoc3VzcGVuZHNfcGVuZGluZyA9PSAwKQotCQkJYXBtX3N1c3BlbmQoKTsKKwkJCWlmIChlcnIgPiAwKQorCQkJCWFwbV9zdXNwZW5kKCk7CiAKLQkJLyoKLQkJICogV2FpdCBmb3IgdGhlIHN1c3BlbmQvcmVzdW1lIHRvIGNvbXBsZXRlLiAgSWYgdGhlcmUgYXJlCi0JCSAqIHBlbmRpbmcgYWNrbm93bGVkZ2VzLCB3ZSB3YWl0IGhlcmUgZm9yIHRoZW0uCi0JCSAqCi0JCSAqIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBQTSBzdWJzeXN0ZW0gZG9lcwotCQkgKiBub3Qga2ljayB1cyBvdXQgb2YgdGhlIHdhaXQgd2hlbiBpdCBzdXNwZW5kcyB0aGUgdGhyZWFkcy4KLQkJICovCi0JCWZsYWdzID0gY3VycmVudC0+ZmxhZ3M7Ci0JCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCQkJLyoKKwkJCSAqIFdhaXQgZm9yIHRoZSBzdXNwZW5kL3Jlc3VtZSB0byBjb21wbGV0ZS4gIElmIHRoZXJlCisJCQkgKiBhcmUgcGVuZGluZyBhY2tub3dsZWRnZXMsIHdlIHdhaXQgaGVyZSBmb3IgdGhlbS4KKwkJCSAqCisJCQkgKiBOb3RlOiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBQTSBzdWJzeXN0ZW0gZG9lcworCQkJICogbm90IGtpY2sgdXMgb3V0IG9mIHRoZSB3YWl0IHdoZW4gaXQgc3VzcGVuZHMgdGhlCisJCQkgKiB0aHJlYWRzLgorCQkJICovCisJCQlmbGFncyA9IGN1cnJlbnQtPmZsYWdzOworCQkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKLQkJLyoKLQkJICogTm90ZTogZG8gbm90IGFsbG93IGEgdGhyZWFkIHdoaWNoIGlzIGFja2luZyB0aGUgc3VzcGVuZAotCQkgKiB0byBlc2NhcGUgdW50aWwgdGhlIHJlc3VtZSBpcyBjb21wbGV0ZS4KLQkJICovCi0JCWlmIChhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0FDS0VEKQotCQkJd2FpdF9ldmVudChhcG1fc3VzcGVuZF93YWl0cXVldWUsCi0JCQkJCSBhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0RPTkUpOwotCQllbHNlCiAJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlLAogCQkJCQkgYXMtPnN1c3BlbmRfc3RhdGUgPT0gU1VTUEVORF9ET05FKTsKKwkJfQogCiAJCWN1cnJlbnQtPmZsYWdzID0gZmxhZ3M7CisKKwkJbXV0ZXhfbG9jaygmc3RhdGVfbG9jayk7CiAJCWVyciA9IGFzLT5zdXNwZW5kX3Jlc3VsdDsKIAkJYXMtPnN1c3BlbmRfc3RhdGUgPSBTVVNQRU5EX05PTkU7CisJCW11dGV4X3VubG9jaygmc3RhdGVfbG9jayk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzMwLDYgKzM5Miw4IEBACiBzdGF0aWMgaW50IGFwbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7CiAJc3RydWN0IGFwbV91c2VyICphcyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcGVuZGluZyA9IDA7CisKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogCiAJZG93bl93cml0ZSgmdXNlcl9saXN0X2xvY2spOwpAQCAtMzQyLDExICs0MDYsMTQgQEAKIAkgKiBuZWVkIHRvIGJhbGFuY2Ugc3VzcGVuZHNfcGVuZGluZywgd2hpY2ggbWVhbnMgdGhlCiAJICogcG9zc2liaWxpdHkgb2Ygc2xlZXBpbmcuCiAJICovCisJbXV0ZXhfbG9jaygmc3RhdGVfbG9jayk7CiAJaWYgKGFzLT5zdXNwZW5kX3N0YXRlICE9IFNVU1BFTkRfTk9ORSkgewogCQlzdXNwZW5kc19wZW5kaW5nIC09IDE7Ci0JCWlmIChzdXNwZW5kc19wZW5kaW5nID09IDApCi0JCQlhcG1fc3VzcGVuZCgpOworCQlwZW5kaW5nID0gc3VzcGVuZHNfcGVuZGluZyA9PSAwOwogCX0KKwltdXRleF91bmxvY2soJnN0YXRlX2xvY2spOworCWlmIChwZW5kaW5nKQorCQlhcG1fc3VzcGVuZCgpOwogCiAJa2ZyZWUoYXMpOwogCXJldHVybiAwOwpAQCAtMzU2LDcgKzQyMyw3IEBACiB7CiAJc3RydWN0IGFwbV91c2VyICphczsKIAotCWFzID0gKHN0cnVjdCBhcG1fdXNlciAqKWt6YWxsb2Moc2l6ZW9mKCphcyksIEdGUF9LRVJORUwpOworCWFzID0ga3phbGxvYyhzaXplb2YoKmFzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFzKSB7CiAJCS8qCiAJCSAqIFhYWCAtIHRoaXMgaXMgYSB0aW55IGJpdCBicm9rZW4sIHdoZW4gd2UgY29uc2lkZXIgQlNECkBAIC00NzAsNiArNTM3LDcgQEAKIHsKIAlkbyB7CiAJCWFwbV9ldmVudF90IGV2ZW50OworCQlpbnQgcmV0OwogCiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShrYXBtZF93YWl0LAogCQkJCSFxdWV1ZV9lbXB0eSgma2FwbWRfcXVldWUpIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CkBAIC00ODksMTMgKzU1NywyMCBAQAogCiAJCWNhc2UgQVBNX0xPV19CQVRURVJZOgogCQljYXNlIEFQTV9QT1dFUl9TVEFUVVNfQ0hBTkdFOgotCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJcXVldWVfZXZlbnQoZXZlbnQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBUE1fVVNFUl9TVVNQRU5EOgogCQljYXNlIEFQTV9TWVNfU1VTUEVORDoKLQkJCXF1ZXVlX2V2ZW50KGV2ZW50LCBOVUxMKTsKLQkJCWlmIChzdXNwZW5kc19wZW5kaW5nID09IDApCisJCQlyZXQgPSBxdWV1ZV9zdXNwZW5kX2V2ZW50KGV2ZW50LCBOVUxMKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJLyoKKwkJCQkgKiBXZSB3ZXJlIGJ1c3kuICBUcnkgYWdhaW4gaW4gNTBtcy4KKwkJCQkgKi8KKwkJCQlxdWV1ZV9hZGRfZXZlbnQoJmthcG1kX3F1ZXVlLCBldmVudCk7CisJCQkJbXNsZWVwKDUwKTsKKwkJCX0KKwkJCWlmIChyZXQgPiAwKQogCQkJCWFwbV9zdXNwZW5kKCk7CiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2FybS9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCBjYzJkNThkLi4zYzA3OGUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAKIC8qCiAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgYW5kIHRhcmdldCBhcmUgY29tcGF0aWJsZS4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TIGIvYXJjaC9hcm0va2VybmVsL2NhbGxzLlMKaW5kZXggMzE3MzkyNC4uZThmNzQzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2NhbGxzLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2NhbGxzLlMKQEAgLTMzMSw2ICszMzEsMTkgQEAKIAkJQ0FMTChzeXNfbWJpbmQpCiAvKiAzMjAgKi8JQ0FMTChzeXNfZ2V0X21lbXBvbGljeSkKIAkJQ0FMTChzeXNfc2V0X21lbXBvbGljeSkKKwkJQ0FMTChzeXNfb3BlbmF0KQorCQlDQUxMKHN5c19ta2RpcmF0KQorCQlDQUxMKHN5c19ta25vZGF0KQorLyogMzI1ICovCUNBTEwoc3lzX2ZjaG93bmF0KQorCQlDQUxMKHN5c19mdXRpbWVzYXQpCisJCUNBTEwoc3lzX2ZzdGF0YXQ2NCkKKwkJQ0FMTChzeXNfdW5saW5rYXQpCisJCUNBTEwoc3lzX3JlbmFtZWF0KQorLyogMzMwICovCUNBTEwoc3lzX2xpbmthdCkKKwkJQ0FMTChzeXNfc3ltbGlua2F0KQorCQlDQUxMKHN5c19yZWFkbGlua2F0KQorCQlDQUxMKHN5c19mY2htb2RhdCkKKwkJQ0FMTChzeXNfZmFjY2Vzc2F0KQogI2lmbmRlZiBzeXNjYWxsc19jb3VudGVkCiAuZXF1IHN5c2NhbGxzX3BhZGRpbmcsICgoTlJfc3lzY2FsbHMgKyAzKSAmIH4zKSAtIE5SX3N5c2NhbGxzCiAjZGVmaW5lIHN5c2NhbGxzX2NvdW50ZWQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKaW5kZXggYjI3NTEzYS4uNzEyNTdlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKQEAgLTM1Myw3ICszNTMsNyBAQAogCQl9CiAJCWlmIChjX2lkKCZleGNkKSA9PSAweDgwKSB7IC8qIGxvYWRlciAqLwogCQkJaWYgKCFlYy0+bG9hZGVyKSB7Ci0JCQkJZWMtPmxvYWRlciA9IChsb2FkZXJfdClrbWFsbG9jKGNfbGVuKCZleGNkKSwKKwkJCQllYy0+bG9hZGVyID0ga21hbGxvYyhjX2xlbigmZXhjZCksCiAJCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwogCQkJCWlmIChlYy0+bG9hZGVyKQogCQkJCQllY2FyZF9yZWFkYnl0ZXMoZWMtPmxvYWRlciwgZWMsCkBAIC01MjksNyArNTI5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGVjYXJkX2NoZWNrX2xvY2t1cChzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIGVjYXJkX2NoZWNrX2xvY2t1cChzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdDsKIAlzdGF0aWMgaW50IGxvY2t1cDsKQEAgLTU2Nyw3ICs1NjcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotZWNhcmRfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitlY2FyZF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJZWNhcmRfdCAqZWM7CiAJaW50IGNhbGxlZCA9IDA7CkBAIC01ODUsNyArNTg1LDcgQEAKIAkJCXBlbmRpbmcgPSBlY2FyZF9kZWZhdWx0X29wcy5pcnFwZW5kaW5nKGVjKTsKIAogCQlpZiAocGVuZGluZykgewotCQkJc3RydWN0IGlycWRlc2MgKmQgPSBpcnFfZGVzYyArIGVjLT5pcnE7CisJCQlzdHJ1Y3QgaXJxX2Rlc2MgKmQgPSBpcnFfZGVzYyArIGVjLT5pcnE7CiAJCQlkZXNjX2hhbmRsZV9pcnEoZWMtPmlycSwgZCk7CiAJCQljYWxsZWQgKys7CiAJCX0KQEAgLTYwOSw3ICs2MDksNyBAQAogfTsKIAogc3RhdGljIHZvaWQKLWVjYXJkX2lycWV4cF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorZWNhcmRfaXJxZXhwX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWNvbnN0IHVuc2lnbmVkIGludCBzdGF0dXNtYXNrID0gMTU7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKQEAgLTEwMjIsNyArMTAyMiw3IEBACiAJaWYgKHNsb3QgPCA4KSB7CiAJCWVjLT5pcnEgPSAzMiArIHNsb3Q7CiAJCXNldF9pcnFfY2hpcChlYy0+aXJxLCAmZWNhcmRfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihlYy0+aXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoZWMtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoZWMtPmlycSwgSVJRRl9WQUxJRCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwppbmRleCBiZDYyM2I3Li4yZGI0MmIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKQEAgLTU4OSwxMCArNTg5LDYgQEAKIAlzdHJleAlyNSwgcjQsIFtpcF0JCQlAIENsZWFyIGV4Y2x1c2l2ZSBtb25pdG9yCiAjZW5kaWYKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9YU0NBTEUpICYmICFkZWZpbmVkKENPTkZJR19JV01NWFQpCi0JbXJhCXI0LCByNSwgYWNjMAotCXN0bWlhICAgaXAsIHtyNCwgcjV9Ci0jZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19IQVNfVExTX1JFRykKIAltY3IJcDE1LCAwLCByMywgYzEzLCBjMCwgMwkJQCBzZXQgVExTIHJlZ2lzdGVyCiAjZWxpZiAhZGVmaW5lZChDT05GSUdfVExTX1JFR19FTVVMKQpAQCAtNjAyLDExICs1OTgsNiBAQAogI2lmZGVmIENPTkZJR19NTVUKIAltY3IJcDE1LCAwLCByNiwgYzMsIGMwLCAwCQlAIFNldCBkb21haW4gcmVnaXN0ZXIKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9YU0NBTEUpICYmICFkZWZpbmVkKENPTkZJR19JV01NWFQpCi0JYWRkCXI0LCByMiwgI1RJX0NQVV9ET01BSU4gKyA0MAlAIGNwdV9jb250ZXh0X3NhdmUtPmV4dHJhCi0JbGRtaWIJcjQsIHtyNCwgcjV9Ci0JbWFyCWFjYzAsIHI0LCByNQotI2VuZGlmCiAJbW92CXI1LCByMAogCWFkZAlyNCwgcjIsICNUSV9DUFVfU0FWRQogCWxkcglyMCwgPXRocmVhZF9ub3RpZnlfaGVhZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2hlYWQtbm9tbXUuUyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLW5vbW11LlMKaW5kZXggZjM1OWExOC4uMDExOWMwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2hlYWQtbm9tbXUuUworKysgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC1ub21tdS5TCkBAIC0xNiw3ICsxNiw2IEBACiAKICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwppbmRleCBlYmMzZTc0Li5kOTk0NTYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKQEAgLTE2LDM3ICsxNiwzNyBAQAogCiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9kb21haW4uaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2RlZmluZSBLRVJORUxfUkFNX0FERFIJKFBBR0VfT0ZGU0VUICsgVEVYVF9PRkZTRVQpCisjZGVmaW5lIEtFUk5FTF9SQU1fVkFERFIJKFBBR0VfT0ZGU0VUICsgVEVYVF9PRkZTRVQpCisjZGVmaW5lIEtFUk5FTF9SQU1fUEFERFIJKFBIWVNfT0ZGU0VUICsgVEVYVF9PRkZTRVQpCiAKIC8qCiAgKiBzd2FwcGVyX3BnX2RpciBpcyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBpbml0aWFsIHBhZ2UgdGFibGUuCi0gKiBXZSBwbGFjZSB0aGUgcGFnZSB0YWJsZXMgMTZLIGJlbG93IEtFUk5FTF9SQU1fQUREUi4gIFRoZXJlZm9yZSwgd2UgbXVzdAotICogbWFrZSBzdXJlIHRoYXQgS0VSTkVMX1JBTV9BRERSIGlzIGNvcnJlY3RseSBzZXQuICBDdXJyZW50bHksIHdlIGV4cGVjdAorICogV2UgcGxhY2UgdGhlIHBhZ2UgdGFibGVzIDE2SyBiZWxvdyBLRVJORUxfUkFNX1ZBRERSLiAgVGhlcmVmb3JlLCB3ZSBtdXN0CisgKiBtYWtlIHN1cmUgdGhhdCBLRVJORUxfUkFNX1ZBRERSIGlzIGNvcnJlY3RseSBzZXQuICBDdXJyZW50bHksIHdlIGV4cGVjdAogICogdGhlIGxlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgdG8gYmUgMHg4MDAwLCBidXQgd2UgY291bGQgcHJvYmFibHkKLSAqIHJlbGF4IHRoaXMgcmVzdHJpY3Rpb24gdG8gS0VSTkVMX1JBTV9BRERSID49IFBBR0VfT0ZGU0VUICsgMHg0MDAwLgorICogcmVsYXggdGhpcyByZXN0cmljdGlvbiB0byBLRVJORUxfUkFNX1ZBRERSID49IFBBR0VfT0ZGU0VUICsgMHg0MDAwLgogICovCi0jaWYgKEtFUk5FTF9SQU1fQUREUiAmIDB4ZmZmZikgIT0gMHg4MDAwCi0jZXJyb3IgS0VSTkVMX1JBTV9BRERSIG11c3Qgc3RhcnQgYXQgMHhYWFhYODAwMAorI2lmIChLRVJORUxfUkFNX1ZBRERSICYgMHhmZmZmKSAhPSAweDgwMDAKKyNlcnJvciBLRVJORUxfUkFNX1ZBRERSIG11c3Qgc3RhcnQgYXQgMHhYWFhYODAwMAogI2VuZGlmCiAKIAkuZ2xvYmwJc3dhcHBlcl9wZ19kaXIKLQkuZXF1CXN3YXBwZXJfcGdfZGlyLCBLRVJORUxfUkFNX0FERFIgLSAweDQwMDAKKwkuZXF1CXN3YXBwZXJfcGdfZGlyLCBLRVJORUxfUkFNX1ZBRERSIC0gMHg0MDAwCiAKIAkubWFjcm8JcGd0YmwsIHJkCi0JbGRyCVxyZCwgPShfX3ZpcnRfdG9fcGh5cyhLRVJORUxfUkFNX0FERFIgLSAweDQwMDApKQorCWxkcglccmQsID0oS0VSTkVMX1JBTV9QQUREUiAtIDB4NDAwMCkKIAkuZW5kbQogCiAjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKICNkZWZpbmUgVEVYVEFERFIgIFhJUF9WSVJUX0FERFIoQ09ORklHX1hJUF9QSFlTX0FERFIpCiAjZWxzZQotI2RlZmluZSBURVhUQUREUiAgS0VSTkVMX1JBTV9BRERSCisjZGVmaW5lIFRFWFRBRERSICBLRVJORUxfUkFNX1ZBRERSCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pcnEuYyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwppbmRleCAyYzRmZjFjLi5lYzAxZjA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2lycS5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBhc21fZG9fSVJRKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKLQlzdHJ1Y3QgaXJxZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwogCiAJLyoKIAkgKiBTb21lIGhhcmR3YXJlIGdpdmVzIHJhbmRvbWx5IHdyb25nIGludGVycnVwdHMuICBSYXRoZXIKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiB2b2lkIHNldF9pcnFfZmxhZ3ModW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGlmbGFncykKIHsKLQlzdHJ1Y3QgaXJxZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChpcnEgPj0gTlJfSVJRUykgewpAQCAtMTcxLDcgKzE3MSw3IEBACiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAotc3RhdGljIHZvaWQgcm91dGVfaXJxKHN0cnVjdCBpcnFkZXNjICpkZXNjLCB1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIHZvaWQgcm91dGVfaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlwcl9kZWJ1ZygiSVJRJXU6IG1vdmluZyBmcm9tIGNwdSV1IHRvIGNwdSV1XG4iLCBpcnEsIGRlc2MtPmNwdSwgY3B1KTsKIApAQCAtMTkwLDcgKzE5MCw3IEBACiAJdW5zaWduZWQgaW50IGksIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJc3RydWN0IGlycWRlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGk7CisJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaTsKIAogCQlpZiAoZGVzYy0+Y3B1ID09IGNwdSkgewogCQkJdW5zaWduZWQgaW50IG5ld2NwdSA9IGFueV9vbmxpbmVfY3B1KGRlc2MtPmFmZmluaXR5KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pd21teHQtbm90aWZpZXIuYyBiL2FyY2gvYXJtL2tlcm5lbC9pd21teHQtbm90aWZpZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxYTFkYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaXdtbXh0LW5vdGlmaWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9pd21teHQtbm90aWZpZXIuYwotICoKLSAqICBYU2NhbGUgaVdNTVh0IChDb25jYW4pIGNvbnRleHQgc3dpdGNoaW5nIGFuZCBoYW5kbGluZwotICoKLSAqICBJbml0aWFsIGNvZGU6Ci0gKiAgQ29weXJpZ2h0IChjKSAyMDAzLCBJbnRlbCBDb3Jwb3JhdGlvbgotICoKLSAqICBGdWxsIGxhenkgc3dpdGNoaW5nIHN1cHBvcnQsIG9wdGltaXphdGlvbnMgYW5kIG1vcmUsIGJ5IE5pY29sYXMgUGl0cmUKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCwgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9ub3RpZnkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotc3RhdGljIGludCBpd21teHRfZG8oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqdCkKLXsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHQ7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVEhSRUFEX05PVElGWV9GTFVTSDoKLQkJLyoKLQkJICogZmx1c2hfdGhyZWFkKCkgemVyb2VzIHRocmVhZC0+ZnBzdGF0ZSwgc28gbm8gbmVlZAotCQkgKiB0byBkbyBhbnl0aGluZyBoZXJlLgotCQkgKgotCQkgKiBGQUxMVEhST1VHSDogRW5zdXJlIHdlIGRvbid0IHRyeSB0byBvdmVyd3JpdGUgb3VyIG5ld2x5Ci0JCSAqIGluaXRpYWxpc2VkIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaXJzdCBmYXVsdC4KLQkJICovCi0KLQljYXNlIFRIUkVBRF9OT1RJRllfUkVMRUFTRToKLQkJaXdtbXh0X3Rhc2tfcmVsZWFzZSh0aHJlYWQpOwotCQlicmVhazsKLQotCWNhc2UgVEhSRUFEX05PVElGWV9TV0lUQ0g6Ci0JCWl3bW14dF90YXNrX3N3aXRjaCh0aHJlYWQpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXdtbXh0X25vdGlmaWVyX2Jsb2NrID0gewotCS5ub3RpZmllcl9jYWxsCT0gaXdtbXh0X2RvLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaXdtbXh0X2luaXQodm9pZCkKLXsKLQl0aHJlYWRfcmVnaXN0ZXJfbm90aWZpZXIoJml3bW14dF9ub3RpZmllcl9ibG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotbGF0ZV9pbml0Y2FsbChpd21teHRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwppbmRleCBiZjM1YzE3Li5hOWU4ZjdlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI4MSw2NyArMjgxLDYgQEAKIH0KIAogLyoKLSAqIFRhc2sgc3RydWN0dXJlIGFuZCBrZXJuZWwgc3RhY2sgYWxsb2NhdGlvbi4KLSAqLwotc3RydWN0IHRocmVhZF9pbmZvX2xpc3QgewotCXVuc2lnbmVkIGxvbmcgKmhlYWQ7Ci0JdW5zaWduZWQgaW50IG5yOwotfTsKLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0aHJlYWRfaW5mb19saXN0LCB0aHJlYWRfaW5mb19saXN0KSA9IHsgTlVMTCwgMCB9OwotCi0jZGVmaW5lIEVYVFJBX1RBU0tfU1RSVUNUCTQKLQotc3RydWN0IHRocmVhZF9pbmZvICphbGxvY190aHJlYWRfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSBOVUxMOwotCi0JaWYgKEVYVFJBX1RBU0tfU1RSVUNUKSB7Ci0JCXN0cnVjdCB0aHJlYWRfaW5mb19saXN0ICp0aCA9ICZnZXRfY3B1X3Zhcih0aHJlYWRfaW5mb19saXN0KTsKLQkJdW5zaWduZWQgbG9uZyAqcCA9IHRoLT5oZWFkOwotCi0JCWlmIChwKSB7Ci0JCQl0aC0+aGVhZCA9ICh1bnNpZ25lZCBsb25nICopcFswXTsKLQkJCXRoLT5uciAtPSAxOwotCQl9Ci0JCXB1dF9jcHVfdmFyKHRocmVhZF9pbmZvX2xpc3QpOwotCi0JCXRocmVhZCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKilwOwotCX0KLQotCWlmICghdGhyZWFkKQotCQl0aHJlYWQgPSAoc3RydWN0IHRocmVhZF9pbmZvICopCi0JCQkgICBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFRIUkVBRF9TSVpFX09SREVSKTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS19VU0FHRQotCS8qCi0JICogVGhlIHN0YWNrIG11c3QgYmUgY2xlYXJlZCBpZiB5b3Ugd2FudCBTWVNSUS1UIHRvCi0JICogZ2l2ZSBzZW5zaWJsZSBzdGFjayB1c2FnZSBpbmZvcm1hdGlvbgotCSAqLwotCWlmICh0aHJlYWQpCi0JCW1lbXplcm8odGhyZWFkLCBUSFJFQURfU0laRSk7Ci0jZW5kaWYKLQlyZXR1cm4gdGhyZWFkOwotfQotCi12b2lkIGZyZWVfdGhyZWFkX2luZm8oc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQpCi17Ci0JaWYgKEVYVFJBX1RBU0tfU1RSVUNUKSB7Ci0JCXN0cnVjdCB0aHJlYWRfaW5mb19saXN0ICp0aCA9ICZnZXRfY3B1X3Zhcih0aHJlYWRfaW5mb19saXN0KTsKLQkJaWYgKHRoLT5uciA8IEVYVFJBX1RBU0tfU1RSVUNUKSB7Ci0JCQl1bnNpZ25lZCBsb25nICpwID0gKHVuc2lnbmVkIGxvbmcgKil0aHJlYWQ7Ci0JCQlwWzBdID0gKHVuc2lnbmVkIGxvbmcpdGgtPmhlYWQ7Ci0JCQl0aC0+aGVhZCA9IHA7Ci0JCQl0aC0+bnIgKz0gMTsKLQkJCXB1dF9jcHVfdmFyKHRocmVhZF9pbmZvX2xpc3QpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXB1dF9jcHVfdmFyKHRocmVhZF9pbmZvX2xpc3QpOwotCX0KLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXRocmVhZCwgVEhSRUFEX1NJWkVfT1JERVIpOwotfQotCi0vKgogICogRnJlZSBjdXJyZW50IHRocmVhZCBkYXRhIHN0cnVjdHVyZXMgZXRjLi4KICAqLwogdm9pZCBleGl0X3RocmVhZCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwppbmRleCA2YmJkOTNkLi5jZjJiZDQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwpAQCAtMzU0LDkgKzM1NCw2IEBACiAjaWZuZGVmIENPTkZJR19BUk1fVEhVTUIKIAllbGZfaHdjYXAgJj0gfkhXQ0FQX1RIVU1COwogI2VuZGlmCi0jaWZuZGVmIENPTkZJR19WRlAKLQllbGZfaHdjYXAgJj0gfkhXQ0FQX1ZGUDsKLSNlbmRpZgogCiAJY3B1X3Byb2NfaW5pdCgpOwogfQpAQCAtNDM4LDE2ICs0MzUsMTkgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGFybV9hZGRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKKwlzdHJ1Y3QgbWVtYmFuayAqYmFuazsKKwogCS8qCiAJICogRW5zdXJlIHRoYXQgc3RhcnQvc2l6ZSBhcmUgYWxpZ25lZCB0byBhIHBhZ2UgYm91bmRhcnkuCiAJICogU2l6ZSBpcyBhcHByb3ByaWF0ZWx5IHJvdW5kZWQgZG93biwgc3RhcnQgaXMgcm91bmRlZCB1cC4KIAkgKi8KIAlzaXplIC09IHN0YXJ0ICYgflBBR0VfTUFTSzsKIAotCW1lbWluZm8uYmFua1ttZW1pbmZvLm5yX2JhbmtzXS5zdGFydCA9IFBBR0VfQUxJR04oc3RhcnQpOwotCW1lbWluZm8uYmFua1ttZW1pbmZvLm5yX2JhbmtzXS5zaXplICA9IHNpemUgJiBQQUdFX01BU0s7Ci0JbWVtaW5mby5iYW5rW21lbWluZm8ubnJfYmFua3NdLm5vZGUgID0gUEhZU19UT19OSUQoc3RhcnQpOwotCW1lbWluZm8ubnJfYmFua3MgKz0gMTsKKwliYW5rID0gJm1lbWluZm8uYmFua1ttZW1pbmZvLm5yX2JhbmtzKytdOworCisJYmFuay0+c3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0KTsKKwliYW5rLT5zaXplICA9IHNpemUgJiBQQUdFX01BU0s7CisJYmFuay0+bm9kZSAgPSBQSFlTX1RPX05JRChzdGFydCk7CiB9CiAKIC8qCkBAIC04NTQsNiArODU0LDcgQEAKIAkidmZwIiwKIAkiZWRzcCIsCiAJImphdmEiLAorCSJpd21teHQiLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYwppbmRleCA0OGNmN2ZmLi4zODQzZDNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCkBAIC0xMSw3ICsxMSw5IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IDQyMTMyOWYuLjA3MGJjYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTcsNiArNyw3IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMTksNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTQ0OSw2ICs0NTEsNyBAQAogCXJldHVybiBzbXBfY2FsbF9mdW5jdGlvbl9vbl9jcHUoZnVuYywgaW5mbywgcmV0cnksIHdhaXQsCiAJCQkJCWNwdV9vbmxpbmVfbWFwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNtcF9jYWxsX2Z1bmN0aW9uKTsKIAogdm9pZCBzaG93X2lwaV9saXN0KHN0cnVjdCBzZXFfZmlsZSAqcCkKIHsKQEAgLTQ3NCwyNSArNDc3LDI2IEBACiAJc2VxX3B1dGMocCwgJ1xuJyk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwaV90aW1lcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIGlwaV90aW1lcih2b2lkKQogewotCWludCB1c2VyID0gdXNlcl9tb2RlKHJlZ3MpOwotCiAJaXJxX2VudGVyKCk7Ci0JcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcsIHJlZ3MpOwotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXIpOworCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKKwl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKIAlpcnFfZXhpdCgpOwogfQogCiAjaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwogYXNtbGlua2FnZSB2b2lkIGRvX2xvY2FsX3RpbWVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJaWYgKGxvY2FsX3RpbWVyX2FjaygpKSB7CiAJCWlycV9zdGF0W2NwdV0ubG9jYWxfdGltZXJfaXJxcysrOwotCQlpcGlfdGltZXIocmVncyk7CisJCWlwaV90aW1lcigpOwogCX0KKworCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CiAjZW5kaWYKIApAQCAtNTUxLDYgKzU1NSw3IEBACiB7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgaXBpX2RhdGEgKmlwaSA9ICZwZXJfY3B1KGlwaV9kYXRhLCBjcHUpOworCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKIAogCWlwaS0+aXBpX2NvdW50Kys7CiAKQEAgLTU3NCw3ICs1NzksNyBAQAogCiAJCQlzd2l0Y2ggKG5leHRtc2cpIHsKIAkJCWNhc2UgSVBJX1RJTUVSOgotCQkJCWlwaV90aW1lcihyZWdzKTsKKwkJCQlpcGlfdGltZXIoKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBJUElfUkVTQ0hFRFVMRToKQEAgLTU5OSw2ICs2MDQsOCBAQAogCQkJfQogCQl9IHdoaWxlIChtc2dzKTsKIAl9CisKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCmluZGV4IGMwM2NhYjUuLjZmZjVlM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwpAQCAtMjIwLDEwICsyMjAsMTAgQEAKICNpZmRlZiBDT05GSUdfTEVEU19USU1FUgogc3RhdGljIGlubGluZSB2b2lkIGRvX2xlZHModm9pZCkKIHsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50ID0gNTA7CisJc3RhdGljIHVuc2lnbmVkIGludCBjb3VudCA9IEhaLzI7CiAKIAlpZiAoLS1jb3VudCA9PSAwKSB7Ci0JCWNvdW50ID0gNTA7CisJCWNvdW50ID0gSFovMjsKIAkJbGVkc19ldmVudChsZWRfdGltZXIpOwogCX0KIH0KQEAgLTMyNywxMyArMzI3LDEyIEBACiAgKi8KIHZvaWQgdGltZXJfdGljayh2b2lkKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X2lycV9yZWdzKCk7CiAJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOwogCWRvX2xlZHMoKTsKIAlkb19zZXRfcnRjKCk7CiAJZG9fdGltZXIoMSk7CiAjaWZuZGVmIENPTkZJR19TTVAKLQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUocmVncykpOworCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggYmVkZTM4MC4uMDQyYTEyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTYzMSwxMiArNjMxLDkgQEAKIAlub3RpZnlfZGllKCJ1bmtub3duIGRhdGEgYWJvcnQgY29kZSIsIHJlZ3MsICZpbmZvLCBpbnN0ciwgMCk7CiB9CiAKLXZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSBfX2J1Zyhjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgdm9pZCAqZGF0YSkKK3ZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSBfX2J1Zyhjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKIHsKLQlwcmludGsoS0VSTl9DUklUImtlcm5lbCBCVUcgYXQgJXM6JWQhIiwgZmlsZSwgbGluZSk7Ci0JaWYgKGRhdGEpCi0JCXByaW50aygiIC0gZXh0cmEgZGF0YSA9ICVwIiwgZGF0YSk7Ci0JcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0NSSVQia2VybmVsIEJVRyBhdCAlczolZCFcbiIsIGZpbGUsIGxpbmUpOwogCSooaW50ICopMCA9IDA7CiAKIAkvKiBBdm9pZCAibm9yZXR1cm4gZnVuY3Rpb24gZG9lcyByZXR1cm4iICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDNjYTU3NGUuLmE4ZmE3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC00NSwxMyArNDUsNyBAQAogCQkJKiguZWFybHlfcGFyYW0uaW5pdCkKIAkJX19lYXJseV9lbmQgPSAuOwogCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJCSooLmluaXRjYWxsMS5pbml0KQotCQkJKiguaW5pdGNhbGwyLmluaXQpCi0JCQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkJCSooLmluaXRjYWxsNC5pbml0KQotCQkJKiguaW5pdGNhbGw1LmluaXQpCi0JCQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkJCSooLmluaXRjYWxsNy5pbml0KQorCQkJSU5JVENBTExTCiAJCV9faW5pdGNhbGxfZW5kID0gLjsKIAkJX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwogCQkJKiguY29uX2luaXRjYWxsLmluaXQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwveHNjYWxlLWNwMC5jIGIvYXJjaC9hcm0va2VybmVsL3hzY2FsZS1jcDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAwMDBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL3hzY2FsZS1jcDAuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC94c2NhbGUtY3AwLmMKKyAqCisgKiBYU2NhbGUgRFNQIGFuZCBpV01NWHQgY29wcm9jZXNzb3IgY29udGV4dCBzd2l0Y2hpbmcgYW5kIGhhbmRsaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX25vdGlmeS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZHNwX3NhdmVfc3RhdGUodTMyICpzdGF0ZSkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJtcnJjCXAwLCAwLCAlMCwgJTEsIGMwXG4iCisJCTogIj1yIiAoc3RhdGVbMF0pLCAiPXIiIChzdGF0ZVsxXSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHNwX2xvYWRfc3RhdGUodTMyICpzdGF0ZSkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJtY3JyCXAwLCAwLCAlMCwgJTEsIGMwXG4iCisJCTogOiAiciIgKHN0YXRlWzBdKSwgInIiIChzdGF0ZVsxXSkpOworfQorCitzdGF0aWMgaW50IGRzcF9kbyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICp0KQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gdDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSFJFQURfTk9USUZZX0ZMVVNIOgorCQl0aHJlYWQtPmNwdV9jb250ZXh0LmV4dHJhWzBdID0gMDsKKwkJdGhyZWFkLT5jcHVfY29udGV4dC5leHRyYVsxXSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBUSFJFQURfTk9USUZZX1NXSVRDSDoKKwkJZHNwX3NhdmVfc3RhdGUoY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHVfY29udGV4dC5leHRyYSk7CisJCWRzcF9sb2FkX3N0YXRlKHRocmVhZC0+Y3B1X2NvbnRleHQuZXh0cmEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZHNwX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsCT0gZHNwX2RvLAorfTsKKworCisjaWZkZWYgQ09ORklHX0lXTU1YVAorc3RhdGljIGludCBpd21teHRfZG8oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqdCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IHQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVEhSRUFEX05PVElGWV9GTFVTSDoKKwkJLyoKKwkJICogZmx1c2hfdGhyZWFkKCkgemVyb2VzIHRocmVhZC0+ZnBzdGF0ZSwgc28gbm8gbmVlZAorCQkgKiB0byBkbyBhbnl0aGluZyBoZXJlLgorCQkgKgorCQkgKiBGQUxMVEhST1VHSDogRW5zdXJlIHdlIGRvbid0IHRyeSB0byBvdmVyd3JpdGUgb3VyIG5ld2x5CisJCSAqIGluaXRpYWxpc2VkIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaXJzdCBmYXVsdC4KKwkJICovCisKKwljYXNlIFRIUkVBRF9OT1RJRllfUkVMRUFTRToKKwkJaXdtbXh0X3Rhc2tfcmVsZWFzZSh0aHJlYWQpOworCQlicmVhazsKKworCWNhc2UgVEhSRUFEX05PVElGWV9TV0lUQ0g6CisJCWl3bW14dF90YXNrX3N3aXRjaCh0aHJlYWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXdtbXh0X25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsCT0gaXdtbXh0X2RvLAorfTsKKyNlbmRpZgorCisKK3N0YXRpYyB1MzIgX19pbml0IHhzY2FsZV9jcF9hY2Nlc3NfcmVhZCh2b2lkKQoreworCXUzMiB2YWx1ZTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIm1yYwlwMTUsIDAsICUwLCBjMTUsIGMxLCAwXG5cdCIKKwkJOiAiPXIiICh2YWx1ZSkpOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgeHNjYWxlX2NwX2FjY2Vzc193cml0ZSh1MzIgdmFsdWUpCit7CisJdTMyIHRlbXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJtY3IJcDE1LCAwLCAlMSwgYzE1LCBjMSwgMFxuXHQiCisJCSJtcmMJcDE1LCAwLCAlMCwgYzE1LCBjMSwgMFxuXHQiCisJCSJtb3YJJTAsICUwXG5cdCIKKwkJInN1YglwYywgcGMsICM0XG5cdCIKKwkJOiAiPXIiICh0ZW1wKSA6ICJyIiAodmFsdWUpKTsKK30KKworLyoKKyAqIERldGVjdCB3aGV0aGVyIHdlIGhhdmUgYSBNQUMgY29wcm9jZXNzb3IgKDQwIGJpdCByZWdpc3Rlcikgb3IgYW4KKyAqIGlXTU1YdCBjb3Byb2Nlc3NvciAoNjQgYml0IHJlZ2lzdGVycykgYnkgbG9hZGluZyAwMDAwMDEwMDowMDAwMDAwMAorICogaW50byBhIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIGFuZCByZWFkaW5nIGl0IGJhY2ssIGFuZCBjaGVja2luZworICogd2hldGhlciB0aGUgdXBwZXIgd29yZCBzdXJ2aXZlZCBpbnRhY3QuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNwdV9oYXNfaXdtbXh0KHZvaWQpCit7CisJdTMyIGxvOworCXUzMiBoaTsKKworCS8qCisJICogVGhpcyBzZXF1ZW5jZSBpcyBpbnRlcnByZXRlZCBieSB0aGUgRFNQIGNvcHJvY2Vzc29yIGFzOgorCSAqCW1hcglhY2MwLCAlMiwgJTMKKwkgKgltcmEJJTAsICUxLCBhY2MwCisJICoKKwkgKiBBbmQgYnkgdGhlIGlXTU1YdCBjb3Byb2Nlc3NvciBhczoKKwkgKgl0bWNycgl3UjAsICUyLCAlMworCSAqCXRtcnJjCSUwLCAlMSwgd1IwCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkibWNycglwMCwgMCwgJTIsICUzLCBjMFxuIgorCQkibXJyYwlwMCwgMCwgJTAsICUxLCBjMFxuIgorCQk6ICI9ciIgKGxvKSwgIj1yIiAoaGkpCisJCTogInIiICgwKSwgInIiICgweDEwMCkpOworCisJcmV0dXJuICEhaGk7Cit9CisKKworLyoKKyAqIElmIHdlIGRldGVjdCB0aGF0IHRoZSBDUFUgaGFzIGlXTU1YdCAoYW5kIENPTkZJR19JV01NWFQ9eSksIHdlCisgKiBkaXNhYmxlIENQMC9DUDEgb24gYm9vdCwgYW5kIGxldCBjYWxsX2ZwZSgpIGFuZCB0aGUgaVdNTVh0IGxhenkKKyAqIHN3aXRjaCBjb2RlIGhhbmRsZSBpV01NWHQgY29udGV4dCBzd2l0Y2hpbmcuICBJZiBvbiB0aGUgb3RoZXIKKyAqIGhhbmQgdGhlIENQVSBoYXMgYSBEU1AgY29wcm9jZXNzb3IsIHdlIGtlZXAgYWNjZXNzIHRvIENQMCBlbmFibGVkCisgKiBhbGwgdGhlIHRpbWUsIGFuZCBzYXZlL3Jlc3RvcmUgYWNjMCBvbiBjb250ZXh0IHN3aXRjaCBpbiBub24tbGF6eQorICogZmFzaGlvbi4KKyAqLworc3RhdGljIGludCBfX2luaXQgeHNjYWxlX2NwMF9pbml0KHZvaWQpCit7CisJdTMyIGNwX2FjY2VzczsKKworCWNwX2FjY2VzcyA9IHhzY2FsZV9jcF9hY2Nlc3NfcmVhZCgpICYgfjM7CisJeHNjYWxlX2NwX2FjY2Vzc193cml0ZShjcF9hY2Nlc3MgfCAxKTsKKworCWlmIChjcHVfaGFzX2l3bW14dCgpKSB7CisjaWZuZGVmIENPTkZJR19JV01NWFQKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0FVVElPTjogWFNjYWxlIGlXTU1YdCBjb3Byb2Nlc3NvciAiCisJCQkiZGV0ZWN0ZWQsIGJ1dCBrZXJuZWwgc3VwcG9ydCBpcyBtaXNzaW5nLlxuIik7CisjZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJYU2NhbGUgaVdNTVh0IGNvcHJvY2Vzc29yIGRldGVjdGVkLlxuIik7CisJCWVsZl9od2NhcCB8PSBIV0NBUF9JV01NWFQ7CisJCXRocmVhZF9yZWdpc3Rlcl9ub3RpZmllcigmaXdtbXh0X25vdGlmaWVyX2Jsb2NrKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIlhTY2FsZSBEU1AgY29wcm9jZXNzb3IgZGV0ZWN0ZWQuXG4iKTsKKwkJdGhyZWFkX3JlZ2lzdGVyX25vdGlmaWVyKCZkc3Bfbm90aWZpZXJfYmxvY2spOworCQljcF9hY2Nlc3MgfD0gMTsKKwl9CisKKwl4c2NhbGVfY3BfYWNjZXNzX3dyaXRlKGNwX2FjY2Vzcyk7CisKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbCh4c2NhbGVfY3AwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwppbmRleCBmZTNkMjk3Li5hOTUwMTYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwpAQCAtODIsNyArODIsNyBAQAogCUlSUV9JTlRFTlMgfD0gKDEgPDwgaXJxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGFhZWMyMDAwX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhYWVjMjAwMF9pcnFfY2hpcCA9IHsKIAkuYWNrCT0gYWFlYzIwMDBfaW50X2FjaywKIAkubWFzawk9IGFhZWMyMDAwX2ludF9tYXNrLAogCS51bm1hc2sJPSBhYWVjMjAwMF9pbnRfdW5tYXNrLApAQCAtOTMsNyArOTMsNyBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2NoaXAoaSwgJmFhZWMyMDAwX2lycV9jaGlwKTsKIAkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9LY29uZmlnCmluZGV4IDJmODVlODYuLjlmMTFkYjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9LY29uZmlnCkBAIC0yLDcgKzIsOCBAQAogCiBtZW51ICJBdG1lbCBBVDkxIFN5c3RlbS1vbi1DaGlwIgogCi1jb21tZW50ICJBdG1lbCBBVDkxIFByb2Nlc3NvcnMiCitjaG9pY2UKKwlwcm9tcHQgIkF0bWVsIEFUOTEgUHJvY2Vzc29yIgogCiBjb25maWcgQVJDSF9BVDkxUk05MjAwCiAJYm9vbCAiQVQ5MVJNOTIwMCIKQEAgLTEzLDYgKzE0LDggQEAKIGNvbmZpZyBBUkNIX0FUOTFTQU05MjYxCiAJYm9vbCAiQVQ5MVNBTTkyNjEiCiAKK2VuZGNob2ljZQorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogaWYgQVJDSF9BVDkxUk05MjAwCkBAIC0zMyw3ICszNiw2IEBACiAJICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIEF0bWVsJ3MgQVQ5MVJNOTIwMC1ESyBEZXZlbG9wbWVudCBib2FyZC4KIAkgIChEaXNjb250aW51ZWQpCiAKLQogY29uZmlnIE1BQ0hfQVQ5MVJNOTIwMEVLCiAJYm9vbCAiQXRtZWwgQVQ5MVJNOTIwMC1FSyBFdmFsdWF0aW9uIEtpdCIKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVJNOTIwMApAQCAtOTAsNiArOTIsMTMgQEAKIAogY29tbWVudCAiQVQ5MVNBTTkyNjAgQm9hcmQgVHlwZSIKIAorY29uZmlnIE1BQ0hfQVQ5MVNBTTkyNjBFSworCWJvb2wgIkF0bWVsIEFUOTFTQU05MjYwLUVLIEV2YWx1YXRpb24gS2l0IgorCWRlcGVuZHMgb24gQVJDSF9BVDkxU0FNOTI2MAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgQXRtZWwncyBBVDkxU0FNOTI2MC1FSyBFdmFsdWF0aW9uIEtpdC4KKwkgIDxodHRwOi8vd3d3LmF0bWVsLmNvbS9keW4vcHJvZHVjdHMvdG9vbHNfY2FyZC5hc3A/dG9vbF9pZD0zOTMzPgorCiBlbmRpZgogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk4LDggKzEwNywzMSBAQAogCiBjb21tZW50ICJBVDkxU0FNOTI2MSBCb2FyZCBUeXBlIgogCitjb25maWcgTUFDSF9BVDkxU0FNOTI2MUVLCisJYm9vbCAiQXRtZWwgQVQ5MVNBTTkyNjEtRUsgRXZhbHVhdGlvbiBLaXQiCisJZGVwZW5kcyBvbiBBUkNIX0FUOTFTQU05MjYxCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSB1c2luZyBBdG1lbCdzIEFUOTFTQU05MjYxLUVLIEV2YWx1YXRpb24gS2l0LgorCSAgPGh0dHA6Ly93d3cuYXRtZWwuY29tL2R5bi9wcm9kdWN0cy90b29sc19jYXJkLmFzcD90b29sX2lkPTM4MjA+CisKIGVuZGlmCiAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb21tZW50ICJBVDkxIEJvYXJkIE9wdGlvbnMiCisKK2NvbmZpZyBNVERfQVQ5MV9EQVRBRkxBU0hfQ0FSRAorCWJvb2wgIkVuYWJsZSBEYXRhRmxhc2ggQ2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gKEFSQ0hfQVQ5MVJNOTIwMERLIHx8IE1BQ0hfQVQ5MVJNOTIwMEVLIHx8IE1BQ0hfQVQ5MVNBTTkyNjBFSyB8fCBNQUNIX0FUOTFTQU05MjYxRUspCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBEYXRhRmxhc2ggY2FyZC4KKworY29uZmlnIE1URF9OQU5EX0FUOTFfQlVTV0lEVEhfMTYKKwlib29sICJFbmFibGUgMTYtYml0IGRhdGEgYnVzIGludGVyZmFjZSB0byBOQU5EIGZsYXNoIgorCWRlcGVuZHMgb24gKE1BQ0hfQVQ5MVNBTTkyNjFFSyB8fCBNQUNIX0FUOTFTQU05MjYwRUspCisJaGVscAorCSAgT24gQVQ5MVNBTTkyNnggYm9hcmRzIGJvdGggdHlwZXMgb2YgTkFORCBmbGFzaCBjYW4gYmUgcHJlc2VudAorCSAgKDggYW5kIDE2IGJpdCBkYXRhIGJ1cyB3aWR0aCkuCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvTWFrZWZpbGUKaW5kZXggYzE3NDgwNS4uY2Y3NzcwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCiAjCiAKLW9iai15CQk6PSBjbG9jay5vIGlycS5vIGdwaW8ubyBkZXZpY2VzLm8KK29iai15CQk6PSBjbG9jay5vIGlycS5vIGdwaW8ubwogb2JqLW0JCTo9CiBvYmotbgkJOj0KIG9iai0JCTo9CkBAIC0xMCwxMSArMTAsMTEgQEAKIG9iai0kKENPTkZJR19QTSkJCSs9IHBtLm8KIAogIyBDUFUtc3BlY2lmaWMgc3VwcG9ydAotb2JqLSQoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCkJKz0gYXQ5MXJtOTIwMC5vIGF0OTFybTkyMDBfdGltZS5vCi1vYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MCkJKz0KLW9iai0kKENPTkZJR19BUkNIX0FUOTFTQU05MjYxKQkrPQorb2JqLSQoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCkJKz0gYXQ5MXJtOTIwMC5vIGF0OTFybTkyMDBfdGltZS5vIGF0OTFybTkyMDBfZGV2aWNlcy5vCitvYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MCkJKz0gYXQ5MXNhbTkyNjAubyBhdDkxc2FtOTI2eF90aW1lLm8gYXQ5MXNhbTkyNjBfZGV2aWNlcy5vCitvYmotJChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MSkJKz0gYXQ5MXNhbTkyNjEubyBhdDkxc2FtOTI2eF90aW1lLm8gYXQ5MXNhbTkyNjFfZGV2aWNlcy5vCiAKLSMgQVQ5MVJNOTIwMCBCb2FyZC1zcGVjaWZpYyBzdXBwb3J0CisjIEFUOTFSTTkyMDAgYm9hcmQtc3BlY2lmaWMgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfT05FQVJNKQkrPSBib2FyZC0xYXJtLm8KIG9iai0kKENPTkZJR19BUkNIX0FUOTFSTTkyMDBESykJKz0gYm9hcmQtZGsubwogb2JqLSQoQ09ORklHX01BQ0hfQVQ5MVJNOTIwMEVLKQkrPSBib2FyZC1lay5vCkBAIC0yNiw4ICsyNiwxMCBAQAogb2JqLSQoQ09ORklHX01BQ0hfS0FGQSkJCSs9IGJvYXJkLWthZmEubwogCiAjIEFUOTFTQU05MjYwIGJvYXJkLXNwZWNpZmljIHN1cHBvcnQKK29iai0kKENPTkZJR19NQUNIX0FUOTFTQU05MjYwRUspICs9IGJvYXJkLXNhbTkyNjBlay5vCiAKICMgQVQ5MVNBTTkyNjEgYm9hcmQtc3BlY2lmaWMgc3VwcG9ydAorb2JqLSQoQ09ORklHX01BQ0hfQVQ5MVNBTTkyNjFFSykgKz0gYm9hcmQtc2FtOTI2MWVrLm8KIAogIyBMRURzIHN1cHBvcnQKIGxlZC0kKENPTkZJR19BUkNIX0FUOTFSTTkyMDBESykJKz0gbGVkcy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFybTkyMDAuYwppbmRleCBkY2Y2MTM2Li5hOTJlOWE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwLmMKQEAgLTE0LDggKzE0LDEwIEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MXJtOTIwMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfcG1jLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9zdC5oPgogCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKQEAgLTI2LDMyICsyOCwxMiBAQAogCQkubGVuZ3RoCQk9IFNaXzRLLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwgewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TUEksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxUk05MjAwX0JBU0VfU1BJKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7CiAJCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX0VNQUMsCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxUk05MjAwX0JBU0VfRU1BQyksCiAJCS5sZW5ndGgJCT0gU1pfMTZLLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwgewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9UV0ksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxUk05MjAwX0JBU0VfVFdJKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX01DSSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFSTTkyMDBfQkFTRV9NQ0kpLAotCQkubGVuZ3RoCQk9IFNaXzE2SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfVURQLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVJNOTIwMF9CQVNFX1VEUCksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IEFUOTFfU1JBTV9WSVJUX0JBU0UsCisJCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxUk05MjAwX1NSQU1fU0laRSwKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFSTTkyMDBfU1JBTV9CQVNFKSwKIAkJLmxlbmd0aAkJPSBBVDkxUk05MjAwX1NSQU1fU0laRSwKIAkJLnR5cGUJCT0gTVRfREVWSUNFLApAQCAtMjIyLDYgKzIwNCwxNiBAQAogCX0KIH07CiAKK3N0YXRpYyB2b2lkIGF0OTFybTkyMDBfcmVzZXQodm9pZCkKK3sKKwkvKgorCSAqIFBlcmZvcm0gYSBoYXJkd2FyZSByZXNldCB3aXRoIHRoZSB1c2Ugb2YgdGhlIFdhdGNoZG9nIHRpbWVyLgorCSAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfV0RNUiwgQVQ5MV9TVF9SU1RFTiB8IEFUOTFfU1RfRVhURU4gfCAxKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX1NUX0NSLCBBVDkxX1NUX1dEUlNUKTsKK30KKworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIEFUOTFSTTkyMDAgcHJvY2Vzc29yIGluaXRpYWxpemF0aW9uCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjMwLDYgKzIyMiwxMiBAQAogCS8qIE1hcCBwZXJpcGhlcmFscyAqLwogCWlvdGFibGVfaW5pdChhdDkxcm05MjAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXJtOTIwMF9pb19kZXNjKSk7CiAKKwlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxcm05MjAwX3Jlc2V0OworCWF0OTFfZXh0ZXJuX2lycSA9ICgxIDw8IEFUOTFSTTkyMDBfSURfSVJRMCkgfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTEpCisJCQl8ICgxIDw8IEFUOTFSTTkyMDBfSURfSVJRMikgfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTMpCisJCQl8ICgxIDw8IEFUOTFSTTkyMDBfSURfSVJRNCkgfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTUpCisJCQl8ICgxIDw8IEFUOTFSTTkyMDBfSURfSVJRNik7CisKIAkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLwogCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfZGV2aWNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDFiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9kZXZpY2VzLmMKQEAgLTAsMCArMSw4NzUgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9kZXZpY2VzLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFRoaWJhdXQgVkFSRU5FIDx2YXJlbmV0QHBhcmlzYy1saW51eC5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFybTkyMDAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxcm05MjAwX21jLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKyNkZWZpbmUgU1pfNTEyCTB4MDAwMDAyMDAKKyNkZWZpbmUgU1pfMjU2CTB4MDAwMDAxMDAKKyNkZWZpbmUgU1pfMTYJMHgwMDAwMDAxMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFVTQiBIb3N0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorc3RhdGljIHU2NCBvaGNpX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CitzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIHVzYmhfZGF0YTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JoX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9VSFBfQkFTRSwKKwkJLmVuZAk9IEFUOTFSTTkyMDBfVUhQX0JBU0UgKyBTWl8xTSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxUk05MjAwX0lEX1VIUCwKKwkJLmVuZAk9IEFUOTFSTTkyMDBfSURfVUhQLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF91c2JoX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXQ5MV9vaGNpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCQkJLmRtYV9tYXNrCQk9ICZvaGNpX2RtYW1hc2ssCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKKwkJCQkucGxhdGZvcm1fZGF0YQkJPSAmdXNiaF9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdXNiaF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVzYmhfcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91c2JoKHN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqZGF0YSkKK3sKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCXVzYmhfZGF0YSA9ICpkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXJtOTIwMF91c2JoX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBVU0IgRGV2aWNlIChHYWRnZXQpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQVQ5MQorc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIHVkY19kYXRhOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHVkY19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFSTTkyMDBfQkFTRV9VRFAsCisJCS5lbmQJPSBBVDkxUk05MjAwX0JBU0VfVURQICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFSTTkyMDBfSURfVURQLAorCQkuZW5kCT0gQVQ5MVJNOTIwMF9JRF9VRFAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3VkY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0OTFfdWRjIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJCT0gJnVkY19kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdWRjX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWRjX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdWRjKHN0cnVjdCBhdDkxX3VkY19kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKGRhdGEtPnZidXNfcGluKSB7CisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+dmJ1c19waW4sIDApOworCQlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT52YnVzX3BpbiwgMSk7CisJfQorCWlmIChkYXRhLT5wdWxsdXBfcGluKQorCQlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT5wdWxsdXBfcGluLCAwKTsKKworCXVkY19kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxcm05MjAwX3VkY19kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91ZGMoc3RydWN0IGF0OTFfdWRjX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEV0aGVybmV0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVJNX0FUOTFfRVRIRVIpIHx8IGRlZmluZWQoQ09ORklHX0FSTV9BVDkxX0VUSEVSX01PRFVMRSkKK3N0YXRpYyB1NjQgZXRoX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CitzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgZXRoX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXRoX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MV9WQV9CQVNFX0VNQUMsCisJCS5lbmQJPSBBVDkxX1ZBX0JBU0VfRU1BQyArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxUk05MjAwX0lEX0VNQUMsCisJCS5lbmQJPSBBVDkxUk05MjAwX0lEX0VNQUMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX2V0aF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0OTFfZXRoZXIiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJmV0aF9kbWFtYXNrLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJCQkJLnBsYXRmb3JtX2RhdGEJCT0gJmV0aF9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gZXRoX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXRoX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfZXRoKHN0cnVjdCBhdDkxX2V0aF9kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKGRhdGEtPnBoeV9pcnFfcGluKSB7CisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+cGh5X2lycV9waW4sIDApOworCQlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT5waHlfaXJxX3BpbiwgMSk7CisJfQorCisJLyogUGlucyB1c2VkIGZvciBNSUkgYW5kIFJNSUkgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTE2LCAwKTsJLyogRU1ESU8gKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTE1LCAwKTsJLyogRU1EQyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTQsIDApOwkvKiBFUlhFUiAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTMsIDApOwkvKiBFUlgxICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExMiwgMCk7CS8qIEVSWDAgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTExLCAwKTsJLyogRUNSU19FQ1JTRFYgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTEwLCAwKTsJLyogRVRYMSAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBOSwgMCk7CS8qIEVUWDAgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTgsIDApOwkvKiBFVFhFTiAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBNywgMCk7CS8qIEVUWENLX0VSRUZDSyAqLworCisJaWYgKCFkYXRhLT5pc19ybWlpKSB7CisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMTksIDApOwkvKiBFUlhDSyAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjE4LCAwKTsJLyogRUNPTCAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjE3LCAwKTsJLyogRVJYRFYgKi8KKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxNiwgMCk7CS8qIEVSWDMgKi8KKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxNSwgMCk7CS8qIEVSWDIgKi8KKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxNCwgMCk7CS8qIEVUWEVSICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMTMsIDApOwkvKiBFVFgzICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMTIsIDApOwkvKiBFVFgyICovCisJfQorCisJZXRoX2RhdGEgPSAqZGF0YTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfZXRoX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2V0aChzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSAqZGF0YSkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQ29tcGFjdCBGbGFzaCAvIFBDTUNJQQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FUOTFfQ0YpIHx8IGRlZmluZWQoQ09ORklHX0FUOTFfQ0ZfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBhdDkxX2NmX2RhdGEgY2ZfZGF0YTsKKworI2RlZmluZSBDRl9CQVNFCQlBVDkxX0NISVBTRUxFQ1RfNAorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNmX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQ0ZfQkFTRSwKKwkJLyogdGllcyB1cCBDUzQsIENTNSBhbmQgQ1M2ICovCisJCS5lbmQJPSBDRl9CQVNFICsgKDB4MzAwMDAwMDAgLSAxKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX01FTV84QU5EMTZCSVQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfY2ZfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX2NmIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJCT0gJmNmX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBjZl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNmX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfY2Yoc3RydWN0IGF0OTFfY2ZfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgY3NhOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwlkYXRhLT5jaGlwc2VsZWN0ID0gNDsJCS8qIGNhbiBvbmx5IHVzZSBFQkkgQ2hpcFNlbGVjdCA0ICovCisKKwkvKiBDRiB0YWtlcyBvdmVyIENTNCwgQ1M1LCBDUzYgKi8KKwljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfRUJJX0NTQSk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9FQklfQ1NBLCBjc2EgfCBBVDkxX0VCSV9DUzRBX1NNQ19DT01QQUNURkxBU0gpOworCisJLyoKKwkgKiBTdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIgdGltaW5nIGFkanVzdG1lbnRzLgorCSAqIFJFVklTSVQ6ICB0aGVzZSB0aW1pbmdzIGFyZSBpbiB0ZXJtcyBvZiBNQ0sgY3ljbGVzLCBzbworCSAqIHdoZW4gTUNLIGNoYW5nZXMgKGNwdWZyZXEgZXRjKSBzbyBtdXN0IHRoZXNlIHZhbHVlcy4uLgorCSAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX0NTUig0KSwKKwkJCQkgIEFUOTFfU01DX0FDU1NfU1RECisJCQkJfCBBVDkxX1NNQ19EQldfMTYKKwkJCQl8IEFUOTFfU01DX0JBVAorCQkJCXwgQVQ5MV9TTUNfV1NFTgorCQkJCXwgQVQ5MV9TTUNfTldTXygzMikJLyogd2FpdCBzdGF0ZXMgKi8KKwkJCQl8IEFUOTFfU01DX1JXU0VUVVBfKDYpCS8qIHNldHVwIHRpbWUgKi8KKwkJCQl8IEFUOTFfU01DX1JXSE9MRF8oNCkJLyogaG9sZCB0aW1lICovCisJKTsKKworCS8qIGlucHV0L2lycSAqLworCWlmIChkYXRhLT5pcnFfcGluKSB7CisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+aXJxX3BpbiwgMSk7CisJCWF0OTFfc2V0X2RlZ2xpdGNoKGRhdGEtPmlycV9waW4sIDEpOworCX0KKwlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPmRldF9waW4sIDEpOworCWF0OTFfc2V0X2RlZ2xpdGNoKGRhdGEtPmRldF9waW4sIDEpOworCisJLyogb3V0cHV0cywgaW5pdGlhbGx5IG9mZiAqLworCWlmIChkYXRhLT52Y2NfcGluKQorCQlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT52Y2NfcGluLCAwKTsKKwlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT5yc3RfcGluLCAwKTsKKworCS8qIGZvcmNlIHBvd2Vyb24gZGVmYXVsdHMgZm9yIHRoZXNlIHBpbnMgLi4uICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEM5LCAwKTsJLyogQTI1L0NGUk5XICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxMCwgMCk7CS8qIE5DUzQvQ0ZDUyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDMTEsIDApOwkvKiBOQ1M1L0NGQ0UxICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxMiwgMCk7CS8qIE5DUzYvQ0ZDRTIgKi8KKworCS8qIG5XQUlUIGlzIF9ub3RfIGEgZGVmYXVsdCBzZXR0aW5nICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEM2LCAxKTsJLyogIG5XQUlUICovCisKKwljZl9kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxcm05MjAwX2NmX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2NmKHN0cnVjdCBhdDkxX2NmX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE1NQyAvIFNECisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX0FUOTEpIHx8IGRlZmluZWQoQ09ORklHX01NQ19BVDkxX01PRFVMRSkKK3N0YXRpYyB1NjQgbW1jX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CitzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgbW1jX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW1jX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9CQVNFX01DSSwKKwkJLmVuZAk9IEFUOTFSTTkyMDBfQkFTRV9NQ0kgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9JRF9NQ0ksCisJCS5lbmQJPSBBVDkxUk05MjAwX0lEX01DSSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfbW1jX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXQ5MV9tY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJm1tY19kbWFtYXNrLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJCQkJLnBsYXRmb3JtX2RhdGEJCT0gJm1tY19kYXRhLAorCX0sCisJLnJlc291cmNlCT0gbW1jX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobW1jX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbW1jKHN0cnVjdCBhdDkxX21tY19kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJLyogaW5wdXQvaXJxICovCisJaWYgKGRhdGEtPmRldF9waW4pIHsKKwkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5kZXRfcGluLCAxKTsKKwkJYXQ5MV9zZXRfZGVnbGl0Y2goZGF0YS0+ZGV0X3BpbiwgMSk7CisJfQorCWlmIChkYXRhLT53cF9waW4pCisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+d3BfcGluLCAxKTsKKwlpZiAoZGF0YS0+dmNjX3BpbikKKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+dmNjX3BpbiwgMCk7CisKKwkvKiBDTEsgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI3LCAwKTsKKworCWlmIChkYXRhLT5zbG90X2IpIHsKKwkJLyogQ01EICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBOCwgMSk7CisKKwkJLyogREFUMCwgbWF5YmUgREFUMS4uREFUMyAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTksIDEpOworCQlpZiAoZGF0YS0+d2lyZTQpIHsKKwkJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMTAsIDEpOworCQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEExMSwgMSk7CisJCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTEyLCAxKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIENNRCAqLworCQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI4LCAxKTsKKworCQkvKiBEQVQwLCBtYXliZSBEQVQxLi5EQVQzICovCisJCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMjksIDEpOworCQlpZiAoZGF0YS0+d2lyZTQpIHsKKwkJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMywgMSk7CisJCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjQsIDEpOworCQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEI1LCAxKTsKKwkJfQorCX0KKworCW1tY19kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxcm05MjAwX21tY19kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9tbWMoc3RydWN0IGF0OTFfbW1jX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE5BTkQgLyBTbWFydE1lZGlhCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQVQ5MSkgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQVQ5MV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGF0OTFfbmFuZF9kYXRhIG5hbmRfZGF0YTsKKworI2RlZmluZSBOQU5EX0JBU0UJQVQ5MV9DSElQU0VMRUNUXzMKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBuYW5kX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gTkFORF9CQVNFLAorCQkuZW5kCT0gTkFORF9CQVNFICsgU1pfOE0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX25hbmRfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX25hbmQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9ICZuYW5kX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBuYW5kX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobmFuZF9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX25hbmQoc3RydWN0IGF0OTFfbmFuZF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjc2E7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybjsKKworCS8qIGVuYWJsZSB0aGUgYWRkcmVzcyByYW5nZSBvZiBDUzMgKi8KKwljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfRUJJX0NTQSk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9FQklfQ1NBLCBjc2EgfCBBVDkxX0VCSV9DUzNBX1NNQ19TTUFSVE1FRElBKTsKKworCS8qIHNldCB0aGUgYnVzIGludGVyZmFjZSBjaGFyYWN0ZXJpc3RpY3MgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DU1IoMyksIEFUOTFfU01DX0FDU1NfU1REIHwgQVQ5MV9TTUNfREJXXzggfCBBVDkxX1NNQ19XU0VOCisJCXwgQVQ5MV9TTUNfTldTXyg1KQorCQl8IEFUOTFfU01DX1RERl8oMSkKKwkJfCBBVDkxX1NNQ19SV1NFVFVQXygwKQkvKiB0RFMgRGF0YSBTZXQgdXAgVGltZSAzMCAtIG5zICovCisJCXwgQVQ5MV9TTUNfUldIT0xEXygxKQkvKiB0REggRGF0YSBIb2xkIFRpbWUgMjAgLSBucyAqLworCSk7CisKKwkvKiBlbmFibGUgcGluICovCisJaWYgKGRhdGEtPmVuYWJsZV9waW4pCisJCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPmVuYWJsZV9waW4sIDEpOworCisJLyogcmVhZHkvYnVzeSBwaW4gKi8KKwlpZiAoZGF0YS0+cmR5X3BpbikKKwkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5yZHlfcGluLCAxKTsKKworCS8qIGNhcmQgZGV0ZWN0IHBpbiAqLworCWlmIChkYXRhLT5kZXRfcGluKQorCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPmRldF9waW4sIDEpOworCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxLCAwKTsJCS8qIFNNT0UgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzMsIDApOwkJLyogU01XRSAqLworCisJbmFuZF9kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxcm05MjAwX25hbmRfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbmFuZChzdHJ1Y3QgYXQ5MV9uYW5kX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRXSSAoaTJjKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19BVDkxKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQVQ5MV9NT0RVTEUpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdHdpX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9CQVNFX1RXSSwKKwkJLmVuZAk9IEFUOTFSTTkyMDBfQkFTRV9UV0kgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9JRF9UV0ksCisJCS5lbmQJPSBBVDkxUk05MjAwX0lEX1RXSSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfdHdpX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXQ5MV9pMmMiLAorCS5pZAkJPSAtMSwKKwkucmVzb3VyY2UJPSB0d2lfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0d2lfcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9pMmModm9pZCkKK3sKKwkvKiBwaW5zIHVzZWQgZm9yIFRXSSBpbnRlcmZhY2UgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI1LCAwKTsJCS8qIFRXRCAqLworCWF0OTFfc2V0X211bHRpX2RyaXZlKEFUOTFfUElOX1BBMjUsIDEpOworCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEyNiwgMCk7CQkvKiBUV0NLICovCisJYXQ5MV9zZXRfbXVsdGlfZHJpdmUoQVQ5MV9QSU5fUEEyNiwgMSk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfdHdpX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2kyYyh2b2lkKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBTUEkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQVQ5MSkgfHwgZGVmaW5lZChDT05GSUdfU1BJX0FUOTFfTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfQVQ5MV9TUElfTU9EVUxFKQorc3RhdGljIHU2NCBzcGlfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzcGlfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxUk05MjAwX0JBU0VfU1BJLAorCQkuZW5kCT0gQVQ5MVJNOTIwMF9CQVNFX1NQSSArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxUk05MjAwX0lEX1NQSSwKKwkJLmVuZAk9IEFUOTFSTTkyMDBfSURfU1BJLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF9zcGlfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX3NwaSIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCQkJLmRtYV9tYXNrCQk9ICZzcGlfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gc3BpX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc3BpX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpX3N0YW5kYXJkX2NzWzRdID0geyBBVDkxX1BJTl9QQTMsIEFUOTFfUElOX1BBNCwgQVQ5MV9QSU5fUEE1LCBBVDkxX1BJTl9QQTYgfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3NwaShzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmRldmljZXMsIGludCBucl9kZXZpY2VzKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgY3NfcGluOworCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEwLCAwKTsJLyogTUlTTyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMSwgMCk7CS8qIE1PU0kgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIsIDApOwkvKiBTUENLICovCisKKwkvKiBFbmFibGUgU1BJIGNoaXAtc2VsZWN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBucl9kZXZpY2VzOyBpKyspIHsKKwkJaWYgKGRldmljZXNbaV0uY29udHJvbGxlcl9kYXRhKQorCQkJY3NfcGluID0gKHVuc2lnbmVkIGxvbmcpIGRldmljZXNbaV0uY29udHJvbGxlcl9kYXRhOworCQllbHNlCisJCQljc19waW4gPSBzcGlfc3RhbmRhcmRfY3NbZGV2aWNlc1tpXS5jaGlwX3NlbGVjdF07CisKKyNpZmRlZiBDT05GSUdfU1BJX0FUOTFfTUFOVUFMX0NTCisJCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGNzX3BpbiwgMSk7CisjZWxzZQorCQlhdDkxX3NldF9BX3BlcmlwaChjc19waW4sIDApOworI2VuZGlmCisKKwkJLyogcGFzcyBjaGlwLXNlbGVjdCBwaW4gdG8gZHJpdmVyICovCisJCWRldmljZXNbaV0uY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgY3NfcGluOworCX0KKworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGRldmljZXMsIG5yX2RldmljZXMpOworCWF0OTFfY2xvY2tfYXNzb2NpYXRlKCJzcGlfY2xrIiwgJmF0OTFybTkyMDBfc3BpX2RldmljZS5kZXYsICJzcGkiKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfc3BpX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3NwaShzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmRldmljZXMsIGludCBucl9kZXZpY2VzKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBSVEMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0FUOTFSTTkyMDApIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQVQ5MVJNOTIwMF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3J0Y19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0OTFfcnRjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSAwLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9ydGModm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfcnRjX2RldmljZSk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9ydGModm9pZCkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgV2F0Y2hkb2cKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxUk05MjAwX1dBVENIRE9HX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfd2R0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXQ5MV93ZHQiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IDAsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3dhdGNoZG9nKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxcm05MjAwX3dkdF9kZXZpY2UpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfd2F0Y2hkb2codm9pZCkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgTEVEcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0xFRFMpCit1OCBhdDkxX2xlZHNfY3B1OwordTggYXQ5MV9sZWRzX3RpbWVyOworCit2b2lkIF9faW5pdCBhdDkxX2luaXRfbGVkcyh1OCBjcHVfbGVkLCB1OCB0aW1lcl9sZWQpCit7CisJYXQ5MV9sZWRzX2NwdQk9IGNwdV9sZWQ7CisJYXQ5MV9sZWRzX3RpbWVyCT0gdGltZXJfbGVkOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfaW5pdF9sZWRzKHU4IGNwdV9sZWQsIHU4IHRpbWVyX2xlZCkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVUFSVAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9BVE1FTCkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGJndV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCisJCS5lbmQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFfSURfU1lTLAorCQkuZW5kCT0gQVQ5MV9JRF9TWVMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSBkYmd1X2RhdGEgPSB7CisJLnVzZV9kbWFfdHgJPSAwLAorCS51c2VfZG1hX3J4CT0gMCwJCS8qIERCR1Ugbm90IGNhcGFibGUgb2YgcmVjZWl2ZSBETUEgKi8KKwkucmVncwkJPSAodm9pZCBfX2lvbWVtICopKEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF9kYmd1X2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJmRiZ3VfZGF0YSwKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gZGJndV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRiZ3VfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfZGJndV9waW5zKHZvaWQpCit7CisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEzMCwgMCk7CQkvKiBEUlhEICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEzMSwgMSk7CQkvKiBEVFhEICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxUk05MjAwX0JBU0VfVVMwLAorCQkuZW5kCT0gQVQ5MVJNOTIwMF9CQVNFX1VTMCArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxUk05MjAwX0lEX1VTMCwKKwkJLmVuZAk9IEFUOTFSTTkyMDBfSURfVVMwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgdWFydDBfZGF0YSA9IHsKKwkudXNlX2RtYV90eAk9IDEsCisJLnVzZV9kbWFfcngJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF91YXJ0MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX3VzYXJ0IiwKKwkuaWQJCT0gMSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9ICZ1YXJ0MF9kYXRhLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkucmVzb3VyY2UJPSB1YXJ0MF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVhcnQwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlndXJlX3VzYXJ0MF9waW5zKHZvaWQpCit7CisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExNywgMSk7CQkvKiBUWEQwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExOCwgMCk7CQkvKiBSWEQwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEyMCwgMCk7CQkvKiBDVFMwICovCisKKwkvKgorCSAqIEFUOTFSTTkyMDAgRXJyYXRhICMzOSAtIFJUUzAgaXMgbm90IGludGVybmFsbHkgY29ubmVjdGVkIHRvIFBBMjEuCisJICogIFdlIG5lZWQgdG8gZHJpdmUgdGhlIHBpbiBtYW51YWxseS4gIERlZmF1bHQgaXMgb2ZmIChSVFMgaXMgYWN0aXZlIGxvdykuCisJICovCisJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoQVQ5MV9QSU5fUEEyMSwgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxUk05MjAwX0JBU0VfVVMxLAorCQkuZW5kCT0gQVQ5MVJNOTIwMF9CQVNFX1VTMSArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxUk05MjAwX0lEX1VTMSwKKwkJLmVuZAk9IEFUOTFSTTkyMDBfSURfVVMxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgdWFydDFfZGF0YSA9IHsKKwkudXNlX2RtYV90eAk9IDEsCisJLnVzZV9kbWFfcngJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF91YXJ0MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX3VzYXJ0IiwKKwkuaWQJCT0gMiwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9ICZ1YXJ0MV9kYXRhLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkucmVzb3VyY2UJPSB1YXJ0MV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVhcnQxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlndXJlX3VzYXJ0MV9waW5zKHZvaWQpCit7CisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxOCwgMCk7CQkvKiBSSTEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjE5LCAwKTsJCS8qIERUUjEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjIwLCAxKTsJCS8qIFRYRDEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjIxLCAwKTsJCS8qIFJYRDEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjIzLCAwKTsJCS8qIERDRDEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI0LCAwKTsJCS8qIENUUzEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI1LCAwKTsJCS8qIERTUjEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI2LCAwKTsJCS8qIFJUUzEgKi8KK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0Ml9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFSTTkyMDBfQkFTRV9VUzIsCisJCS5lbmQJPSBBVDkxUk05MjAwX0JBU0VfVVMyICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFSTTkyMDBfSURfVVMyLAorCQkuZW5kCT0gQVQ5MVJNOTIwMF9JRF9VUzIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSB1YXJ0Ml9kYXRhID0geworCS51c2VfZG1hX3R4CT0gMSwKKwkudXNlX2RtYV9yeAk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3VhcnQyX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAorCS5pZAkJPSAzLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnVhcnQyX2RhdGEsCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5yZXNvdXJjZQk9IHVhcnQyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydDJfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQyX3BpbnModm9pZCkKK3sKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIyLCAwKTsJCS8qIFJYRDIgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIzLCAxKTsJCS8qIFRYRDIgKi8KK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0M19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFSTTkyMDBfQkFTRV9VUzMsCisJCS5lbmQJPSBBVDkxUk05MjAwX0JBU0VfVVMzICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFSTTkyMDBfSURfVVMzLAorCQkuZW5kCT0gQVQ5MVJNOTIwMF9JRF9VUzMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSB1YXJ0M19kYXRhID0geworCS51c2VfZG1hX3R4CT0gMSwKKwkudXNlX2RtYV9yeAk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3VhcnQzX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAorCS5pZAkJPSA0LAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnVhcnQzX2RhdGEsCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5yZXNvdXJjZQk9IHVhcnQzX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydDNfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQzX3BpbnModm9pZCkKK3sKKwlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTUsIDEpOwkJLyogVFhEMyAqLworCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBNiwgMCk7CQkvKiBSWEQzICovCit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF0OTFfdWFydHNbQVRNRUxfTUFYX1VBUlRdOwkvKiB0aGUgVUFSVHMgdG8gdXNlICovCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlOwkvKiB0aGUgc2VyaWFsIGNvbnNvbGUgZGV2aWNlICovCisKK3ZvaWQgX19pbml0IGF0OTFfaW5pdF9zZXJpYWwoc3RydWN0IGF0OTFfdWFydF9jb25maWcgKmNvbmZpZykKK3sKKwlpbnQgaTsKKworCS8qIEZpbGwgaW4gbGlzdCBvZiBzdXBwb3J0ZWQgVUFSVHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5ucl90dHk7IGkrKykgeworCQlzd2l0Y2ggKGNvbmZpZy0+dHR5X21hcFtpXSkgeworCQkJY2FzZSAwOgorCQkJCWNvbmZpZ3VyZV91c2FydDBfcGlucygpOworCQkJCWF0OTFfdWFydHNbaV0gPSAmYXQ5MXJtOTIwMF91YXJ0MF9kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0MF9jbGsiLCAmYXQ5MXJtOTIwMF91YXJ0MF9kZXZpY2UuZGV2LCAidXNhcnQiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQljb25maWd1cmVfdXNhcnQxX3BpbnMoKTsKKwkJCQlhdDkxX3VhcnRzW2ldID0gJmF0OTFybTkyMDBfdWFydDFfZGV2aWNlOworCQkJCWF0OTFfY2xvY2tfYXNzb2NpYXRlKCJ1c2FydDFfY2xrIiwgJmF0OTFybTkyMDBfdWFydDFfZGV2aWNlLmRldiwgInVzYXJ0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJY29uZmlndXJlX3VzYXJ0Ml9waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxcm05MjAwX3VhcnQyX2RldmljZTsKKwkJCQlhdDkxX2Nsb2NrX2Fzc29jaWF0ZSgidXNhcnQyX2NsayIsICZhdDkxcm05MjAwX3VhcnQyX2RldmljZS5kZXYsICJ1c2FydCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWNvbmZpZ3VyZV91c2FydDNfcGlucygpOworCQkJCWF0OTFfdWFydHNbaV0gPSAmYXQ5MXJtOTIwMF91YXJ0M19kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0M19jbGsiLCAmYXQ5MXJtOTIwMF91YXJ0M19kZXZpY2UuZGV2LCAidXNhcnQiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQljb25maWd1cmVfZGJndV9waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxcm05MjAwX2RiZ3VfZGV2aWNlOworCQkJCWF0OTFfY2xvY2tfYXNzb2NpYXRlKCJtY2siLCAmYXQ5MXJtOTIwMF9kYmd1X2RldmljZS5kZXYsICJ1c2FydCIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljb250aW51ZTsKKwkJfQorCQlhdDkxX3VhcnRzW2ldLT5pZCA9IGk7CQkvKiB1cGRhdGUgSUQgbnVtYmVyIHRvIG1hcHBlZCBJRCAqLworCX0KKworCS8qIFNldCBzZXJpYWwgY29uc29sZSBkZXZpY2UgKi8KKwlpZiAoY29uZmlnLT5jb25zb2xlX3R0eSA8IEFUTUVMX01BWF9VQVJUKQorCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlID0gYXQ5MV91YXJ0c1tjb25maWctPmNvbnNvbGVfdHR5XTsKKwlpZiAoIWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UpCisJCXByaW50ayhLRVJOX0lORk8gIkFUOTE6IE5vIGRlZmF1bHQgc2VyaWFsIGNvbnNvbGUgZGVmaW5lZC5cbiIpOworfQorCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfc2VyaWFsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUFYX1VBUlQ7IGkrKykgeworCQlpZiAoYXQ5MV91YXJ0c1tpXSkKKwkJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihhdDkxX3VhcnRzW2ldKTsKKwl9Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9pbml0X3NlcmlhbChzdHJ1Y3QgYXQ5MV91YXJ0X2NvbmZpZyAqY29uZmlnKSB7fQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCh2b2lkKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRoZXNlIGRldmljZXMgYXJlIGFsd2F5cyBwcmVzZW50IGFuZCBkb24ndCBuZWVkIGFueSBib2FyZC1zcGVjaWZpYworICogc2V0dXAuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGF0OTFfYWRkX3N0YW5kYXJkX2RldmljZXModm9pZCkKK3sKKwlhdDkxX2FkZF9kZXZpY2VfcnRjKCk7CisJYXQ5MV9hZGRfZGV2aWNlX3dhdGNoZG9nKCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoYXQ5MV9hZGRfc3RhbmRhcmRfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF90aW1lLmMKaW5kZXggMDdjOWNlYS4uYjk5OWUxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3RpbWUuYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfc3QuaD4KKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9jcnRyOwogCiAvKgpAQCAtOTksNiArMTAxLDkgQEAKIAkvKiBTZXQgUGVyaW9kIEludGVydmFsIHRpbWVyICovCiAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TVF9QSU1SLCBMQVRDSCk7CiAKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJKHZvaWQpIGF0OTFfc3lzX3JlYWQoQVQ5MV9TVF9TUik7CisKIAkvKiBFbmFibGUgUGVyaW9kIEludGVydmFsIFRpbWVyIGludGVycnVwdCAqLwogCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfSUVSLCBBVDkxX1NUX1BJVFMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDNmMDczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYwLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjAuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU0FOIFBlb3BsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxc2FtOTI2MC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfcG1jLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOTI2MF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAorCQkubGVuZ3RoCQk9IFNaXzE2SywKKwkJLnR5cGUJCT0gTVRfREVWSUNFLAorCX0sIHsKKwkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05MjYwX1NSQU0wX1NJWkUsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOTI2MF9TUkFNMF9CQVNFKSwKKwkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MF9TUkFNMF9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTkyNjBfU1JBTTBfU0laRSAtIEFUOTFTQU05MjYwX1NSQU0xX1NJWkUsCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOTI2MF9TUkFNMV9CQVNFKSwKKwkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MF9TUkFNMV9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQ2xvY2tzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGhlIHBlcmlwaGVyYWwgY2xvY2tzLgorICovCitzdGF0aWMgc3RydWN0IGNsayBwaW9BX2NsayA9IHsKKwkubmFtZQkJPSAicGlvQV9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjBfSURfUElPQSwKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBpb0JfY2xrID0geworCS5uYW1lCQk9ICJwaW9CX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MF9JRF9QSU9CLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgcGlvQ19jbGsgPSB7CisJLm5hbWUJCT0gInBpb0NfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYwX0lEX1BJT0MsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayBhZGNfY2xrID0geworCS5uYW1lCQk9ICJhZGNfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYwX0lEX0FEQywKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYXJ0MF9jbGsgPSB7CisJLm5hbWUJCT0gInVzYXJ0MF9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjBfSURfVVMwLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgdXNhcnQxX2NsayA9IHsKKwkubmFtZQkJPSAidXNhcnQxX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MF9JRF9VUzEsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayB1c2FydDJfY2xrID0geworCS5uYW1lCQk9ICJ1c2FydDJfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYwX0lEX1VTMiwKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tY19jbGsgPSB7CisJLm5hbWUJCT0gIm1jaV9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjBfSURfTUNJLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgdWRjX2NsayA9IHsKKwkubmFtZQkJPSAidWRjX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MF9JRF9VRFAsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayB0d2lfY2xrID0geworCS5uYW1lCQk9ICJ0d2lfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYwX0lEX1RXSSwKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNwaTBfY2xrID0geworCS5uYW1lCQk9ICJzcGkwX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MF9JRF9TUEkwLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgc3BpMV9jbGsgPSB7CisJLm5hbWUJCT0gInNwaTFfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYwX0lEX1NQSTEsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayBvaGNpX2NsayA9IHsKKwkubmFtZQkJPSAib2hjaV9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjBfSURfVUhQLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgZXRoZXJfY2xrID0geworCS5uYW1lCQk9ICJldGhlcl9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjBfSURfRU1BQywKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGlzaV9jbGsgPSB7CisJLm5hbWUJCT0gImlzaV9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjBfSURfSVNJLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgdXNhcnQzX2NsayA9IHsKKwkubmFtZQkJPSAidXNhcnQzX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MF9JRF9VUzMsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayB1c2FydDRfY2xrID0geworCS5uYW1lCQk9ICJ1c2FydDRfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYwX0lEX1VTNCwKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYXJ0NV9jbGsgPSB7CisJLm5hbWUJCT0gInVzYXJ0NV9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjBfSURfVVM1LAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqcGVyaXBoX2Nsb2Nrc1tdIF9faW5pdGRhdGEgPSB7CisJJnBpb0FfY2xrLAorCSZwaW9CX2NsaywKKwkmcGlvQ19jbGssCisJJmFkY19jbGssCisJJnVzYXJ0MF9jbGssCisJJnVzYXJ0MV9jbGssCisJJnVzYXJ0Ml9jbGssCisJJm1tY19jbGssCisJJnVkY19jbGssCisJJnR3aV9jbGssCisJJnNwaTBfY2xrLAorCSZzcGkxX2NsaywKKwkvLyBzc2MKKwkvLyB0YzAgLi4gdGMyCisJJm9oY2lfY2xrLAorCSZldGhlcl9jbGssCisJJmlzaV9jbGssCisJJnVzYXJ0M19jbGssCisJJnVzYXJ0NF9jbGssCisJJnVzYXJ0NV9jbGssCisJLy8gdGMzIC4uIHRjNQorCS8vIGlycTAgLi4gaXJxMgorfTsKKworLyoKKyAqIFRoZSB0d28gcHJvZ3JhbW1hYmxlIGNsb2Nrcy4KKyAqIFlvdSBtdXN0IGNvbmZpZ3VyZSBwaW4gbXVsdGlwbGV4aW5nIHRvIGJyaW5nIHRoZXNlIHNpZ25hbHMgb3V0LgorICovCitzdGF0aWMgc3RydWN0IGNsayBwY2swID0geworCS5uYW1lCQk9ICJwY2swIiwKKwkucG1jX21hc2sJPSBBVDkxX1BNQ19QQ0swLAorCS50eXBlCQk9IENMS19UWVBFX1BST0dSQU1NQUJMRSwKKwkuaWQJCT0gMCwKK307CitzdGF0aWMgc3RydWN0IGNsayBwY2sxID0geworCS5uYW1lCQk9ICJwY2sxIiwKKwkucG1jX21hc2sJPSBBVDkxX1BNQ19QQ0sxLAorCS50eXBlCQk9IENMS19UWVBFX1BST0dSQU1NQUJMRSwKKwkuaWQJCT0gMSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9yZWdpc3Rlcl9jbG9ja3Modm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBlcmlwaF9jbG9ja3MpOyBpKyspCisJCWNsa19yZWdpc3RlcihwZXJpcGhfY2xvY2tzW2ldKTsKKworCWNsa19yZWdpc3RlcigmcGNrMCk7CisJY2xrX3JlZ2lzdGVyKCZwY2sxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBHUElPCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGF0OTFfZ3Bpb19iYW5rIGF0OTFzYW05MjYwX2dwaW9bXSA9IHsKKwl7CisJCS5pZAkJPSBBVDkxU0FNOTI2MF9JRF9QSU9BLAorCQkub2Zmc2V0CQk9IEFUOTFfUElPQSwKKwkJLmNsb2NrCQk9ICZwaW9BX2NsaywKKwl9LCB7CisJCS5pZAkJPSBBVDkxU0FNOTI2MF9JRF9QSU9CLAorCQkub2Zmc2V0CQk9IEFUOTFfUElPQiwKKwkJLmNsb2NrCQk9ICZwaW9CX2NsaywKKwl9LCB7CisJCS5pZAkJPSBBVDkxU0FNOTI2MF9JRF9QSU9DLAorCQkub2Zmc2V0CQk9IEFUOTFfUElPQywKKwkJLmNsb2NrCQk9ICZwaW9DX2NsaywKKwl9Cit9OworCitzdGF0aWMgdm9pZCBhdDkxc2FtOTI2MF9yZXNldCh2b2lkKQoreworI3dhcm5pbmcgIkltcGxlbWVudCBDUFUgcmVzZXQiCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBBVDkxU0FNOTI2MCBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQoreworCS8qIE1hcCBwZXJpcGhlcmFscyAqLworCWlvdGFibGVfaW5pdChhdDkxc2FtOTI2MF9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05MjYwX2lvX2Rlc2MpKTsKKworCWF0OTFfYXJjaF9yZXNldCA9IGF0OTFzYW05MjYwX3Jlc2V0OworCWF0OTFfZXh0ZXJuX2lycSA9ICgxIDw8IEFUOTFTQU05MjYwX0lEX0lSUTApIHwgKDEgPDwgQVQ5MVNBTTkyNjBfSURfSVJRMSkKKwkJCXwgKDEgPDwgQVQ5MVNBTTkyNjBfSURfSVJRMik7CisKKwkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLworCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY2xvY2tzICovCisJYXQ5MXNhbTkyNjBfcmVnaXN0ZXJfY2xvY2tzKCk7CisKKwkvKiBSZWdpc3RlciBHUElPIHN1YnN5c3RlbSAqLworCWF0OTFfZ3Bpb19pbml0KGF0OTFzYW05MjYwX2dwaW8sIDMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEludGVycnVwdCBpbml0aWFsaXphdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRoZSBkZWZhdWx0IGludGVycnVwdCBwcmlvcml0eSBsZXZlbHMgKDAgPSBsb3dlc3QsIDcgPSBoaWdoZXN0KS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdDkxc2FtOTI2MF9kZWZhdWx0X2lycV9wcmlvcml0eVtOUl9BSUNfSVJRU10gX19pbml0ZGF0YSA9IHsKKwk3LAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLworCTcsCS8qIFN5c3RlbSBQZXJpcGhlcmFscyAqLworCTAsCS8qIFBhcmFsbGVsIElPIENvbnRyb2xsZXIgQSAqLworCTAsCS8qIFBhcmFsbGVsIElPIENvbnRyb2xsZXIgQiAqLworCTAsCS8qIFBhcmFsbGVsIElPIENvbnRyb2xsZXIgQyAqLworCTAsCS8qIEFuYWxvZy10by1EaWdpdGFsIENvbnZlcnRlciAqLworCTYsCS8qIFVTQVJUIDAgKi8KKwk2LAkvKiBVU0FSVCAxICovCisJNiwJLyogVVNBUlQgMiAqLworCTAsCS8qIE11bHRpbWVkaWEgQ2FyZCBJbnRlcmZhY2UgKi8KKwk0LAkvKiBVU0IgRGV2aWNlIFBvcnQgKi8KKwkwLAkvKiBUd28tV2lyZSBJbnRlcmZhY2UgKi8KKwk2LAkvKiBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgMCAqLworCTYsCS8qIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAxICovCisJNSwJLyogU2VyaWFsIFN5bmNocm9ub3VzIENvbnRyb2xsZXIgKi8KKwkwLAorCTAsCisJMCwJLyogVGltZXIgQ291bnRlciAwICovCisJMCwJLyogVGltZXIgQ291bnRlciAxICovCisJMCwJLyogVGltZXIgQ291bnRlciAyICovCisJMywJLyogVVNCIEhvc3QgcG9ydCAqLworCTMsCS8qIEV0aGVybmV0ICovCisJMCwJLyogSW1hZ2UgU2Vuc29yIEludGVyZmFjZSAqLworCTYsCS8qIFVTQVJUIDMgKi8KKwk2LAkvKiBVU0FSVCA0ICovCisJNiwJLyogVVNBUlQgNSAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgMyAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgNCAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgNSAqLworCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCisJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KKwkwLAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLworfTsKKwordm9pZCBfX2luaXQgYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtOUl9BSUNfSVJRU10pCit7CisJaWYgKCFwcmlvcml0eSkKKwkJcHJpb3JpdHkgPSBhdDkxc2FtOTI2MF9kZWZhdWx0X2lycV9wcmlvcml0eTsKKworCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOworCisJLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLworCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MmQzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCkBAIC0wLDAgKzEsODY3IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYwX2RldmljZXMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgQXRtZWwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MXNhbTkyNjAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxc2FtOTI2eF9tYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFzYW05MjYwX21hdHJpeC5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisjZGVmaW5lIFNaXzUxMgkweDAwMDAwMjAwCisjZGVmaW5lIFNaXzI1NgkweDAwMDAwMTAwCisjZGVmaW5lIFNaXzE2CTB4MDAwMDAwMTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBVU0IgSG9zdAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKK3N0YXRpYyB1NjQgb2hjaV9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSB1c2JoX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdXNiaF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYwX1VIUF9CQVNFLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjBfVUhQX0JBU0UgKyBTWl8xTSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9JRF9VSFAsCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9JRF9VSFAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxX3VzYmhfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX29oY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJm9oY2lfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1c2JoX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB1c2JoX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodXNiaF9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJdXNiaF9kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxX3VzYmhfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdXNiaChzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFVTQiBEZXZpY2UgKEdhZGdldCkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9BVDkxCitzdGF0aWMgc3RydWN0IGF0OTFfdWRjX2RhdGEgdWRjX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWRjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfQkFTRV9VRFAsCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9CQVNFX1VEUCArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9JRF9VRFAsCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9JRF9VRFAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxX3VkY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0OTFfdWRjIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJCT0gJnVkY19kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdWRjX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWRjX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdWRjKHN0cnVjdCBhdDkxX3VkY19kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKGRhdGEtPnZidXNfcGluKSB7CisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+dmJ1c19waW4sIDApOworCQlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT52YnVzX3BpbiwgMSk7CisJfQorCisJLyogUHVsbHVwIHBpbiBpcyBoYW5kbGVkIGludGVybmFsbHkgYnkgVVNCIGRldmljZSBwZXJpcGhlcmFsICovCisKKwl1ZGNfZGF0YSA9ICpkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MV91ZGNfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdWRjKHN0cnVjdCBhdDkxX3VkY19kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBFdGhlcm5ldAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX01BQ0IpIHx8IGRlZmluZWQoQ09ORklHX01BQ0JfTU9EVUxFKQorc3RhdGljIHU2NCBldGhfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKK3N0YXRpYyBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgZXRoX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXRoX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfQkFTRV9FTUFDLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjBfQkFTRV9FTUFDICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYwX0lEX0VNQUMsCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9JRF9FTUFDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjBfZXRoX2RldmljZSA9IHsKKwkubmFtZQkJPSAibWFjYiIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkJCS5kbWFfbWFzawkJPSAmZXRoX2RtYW1hc2ssCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKKwkJCQkucGxhdGZvcm1fZGF0YQkJPSAmZXRoX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBldGhfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShldGhfcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9ldGgoc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKGRhdGEtPnBoeV9pcnFfcGluKSB7CisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+cGh5X2lycV9waW4sIDApOworCQlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT5waHlfaXJxX3BpbiwgMSk7CisJfQorCisJLyogUGlucyB1c2VkIGZvciBNSUkgYW5kIFJNSUkgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTE5LCAwKTsJLyogRVRYQ0tfRVJFRkNLICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExNywgMCk7CS8qIEVSWERWICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExNCwgMCk7CS8qIEVSWDAgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTE1LCAwKTsJLyogRVJYMSAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTgsIDApOwkvKiBFUlhFUiAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTYsIDApOwkvKiBFVFhFTiAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTIsIDApOwkvKiBFVFgwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExMywgMCk7CS8qIEVUWDEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIxLCAwKTsJLyogRU1ESU8gKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIwLCAwKTsJLyogRU1EQyAqLworCisJaWYgKCFkYXRhLT5pc19ybWlpKSB7CisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMjgsIDApOwkvKiBFQ1JTICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMjksIDApOwkvKiBFQ09MICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMjUsIDApOwkvKiBFUlgyICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMjYsIDApOwkvKiBFUlgzICovCisJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMjcsIDApOwkvKiBFUlhDSyAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTIzLCAwKTsJLyogRVRYMiAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTI0LCAwKTsJLyogRVRYMyAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTIyLCAwKTsJLyogRVRYRVIgKi8KKwl9CisKKwlldGhfZGF0YSA9ICpkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTkyNjBfZXRoX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2V0aChzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE1NQyAvIFNECisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX0FUOTEpIHx8IGRlZmluZWQoQ09ORklHX01NQ19BVDkxX01PRFVMRSkKK3N0YXRpYyB1NjQgbW1jX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CitzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgbW1jX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbW1jX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfQkFTRV9NQ0ksCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9CQVNFX01DSSArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9JRF9NQ0ksCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9JRF9NQ0ksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOTI2MF9tbWNfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX21jaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkJCS5kbWFfbWFzawkJPSAmbW1jX2RtYW1hc2ssCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKKwkJCQkucGxhdGZvcm1fZGF0YQkJPSAmbW1jX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBtbWNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtbWNfcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9tbWMoc3RydWN0IGF0OTFfbW1jX2RhdGEgKmRhdGEpCit7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwkvKiBpbnB1dC9pcnEgKi8KKwlpZiAoZGF0YS0+ZGV0X3BpbikgeworCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPmRldF9waW4sIDEpOworCQlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT5kZXRfcGluLCAxKTsKKwl9CisJaWYgKGRhdGEtPndwX3BpbikKKwkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT53cF9waW4sIDEpOworCWlmIChkYXRhLT52Y2NfcGluKQorCQlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT52Y2NfcGluLCAwKTsKKworCS8qIENMSyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBOCwgMCk7CisKKwlpZiAoZGF0YS0+c2xvdF9iKSB7CisJCS8qIENNRCAqLworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTEsIDEpOworCisJCS8qIERBVDAsIG1heWJlIERBVDEuLkRBVDMgKi8KKwkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEEwLCAxKTsKKwkJaWYgKGRhdGEtPndpcmU0KSB7CisJCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTUsIDEpOworCQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEE0LCAxKTsKKwkJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMywgMSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDTUQgKi8KKwkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEE3LCAxKTsKKworCQkvKiBEQVQwLCBtYXliZSBEQVQxLi5EQVQzICovCisJCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBNiwgMSk7CisJCWlmIChkYXRhLT53aXJlNCkgeworCQkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEE5LCAxKTsKKwkJCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTAsIDEpOworCQkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExMSwgMSk7CisJCX0KKwl9CisKKwltbWNfZGF0YSA9ICpkYXRhOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTkyNjBfbW1jX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX21tYyhzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSAqZGF0YSkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgTkFORCAvIFNtYXJ0TWVkaWEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9BVDkxKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9BVDkxX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9uYW5kX2RhdGEgbmFuZF9kYXRhOworCisjZGVmaW5lIE5BTkRfQkFTRQlBVDkxX0NISVBTRUxFQ1RfMworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG5hbmRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBOQU5EX0JBU0UsCisJCS5lbmQJPSBOQU5EX0JBU0UgKyBTWl84TSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYwX25hbmRfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX25hbmQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9ICZuYW5kX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBuYW5kX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobmFuZF9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX25hbmQoc3RydWN0IGF0OTFfbmFuZF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgY3NhLCBtb2RlOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX0VCSUNTQSk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9NQVRSSVhfRUJJQ1NBLCBjc2EgfCBBVDkxX01BVFJJWF9DUzNBX1NNQyk7CisKKwkvKiBzZXQgdGhlIGJ1cyBpbnRlcmZhY2UgY2hhcmFjdGVyaXN0aWNzICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfU0VUVVAoMyksIEFUOTFfU01DX05XRVNFVFVQXygwKSB8IEFUOTFfU01DX05DU19XUlNFVFVQXygwKQorCQkJfCBBVDkxX1NNQ19OUkRTRVRVUF8oMCkgfCBBVDkxX1NNQ19OQ1NfUkRTRVRVUF8oMCkpOworCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfUFVMU0UoMyksIEFUOTFfU01DX05XRVBVTFNFXygyKSB8IEFUOTFfU01DX05DU19XUlBVTFNFXyg1KQorCQkJfCBBVDkxX1NNQ19OUkRQVUxTRV8oMikgfCBBVDkxX1NNQ19OQ1NfUkRQVUxTRV8oNSkpOworCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfQ1lDTEUoMyksIEFUOTFfU01DX05XRUNZQ0xFXyg3KSB8IEFUOTFfU01DX05SRENZQ0xFXyg3KSk7CisKKwlpZiAoZGF0YS0+YnVzX3dpZHRoXzE2KQorCQltb2RlID0gQVQ5MV9TTUNfREJXXzE2OworCWVsc2UKKwkJbW9kZSA9IEFUOTFfU01DX0RCV184OworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX01PREUoMyksIG1vZGUgfCBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUgfCBBVDkxX1NNQ19UREZfKDEpKTsKKworCS8qIGVuYWJsZSBwaW4gKi8KKwlpZiAoZGF0YS0+ZW5hYmxlX3BpbikKKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+ZW5hYmxlX3BpbiwgMSk7CisKKwkvKiByZWFkeS9idXN5IHBpbiAqLworCWlmIChkYXRhLT5yZHlfcGluKQorCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPnJkeV9waW4sIDEpOworCisJLyogY2FyZCBkZXRlY3QgcGluICovCisJaWYgKGRhdGEtPmRldF9waW4pCisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+ZGV0X3BpbiwgMSk7CisKKwluYW5kX2RhdGEgPSAqZGF0YTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFzYW05MjYwX25hbmRfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbmFuZChzdHJ1Y3QgYXQ5MV9uYW5kX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRXSSAoaTJjKQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19BVDkxKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQVQ5MV9NT0RVTEUpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdHdpX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfQkFTRV9UV0ksCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9CQVNFX1RXSSArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9JRF9UV0ksCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9JRF9UV0ksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOTI2MF90d2lfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX2kyYyIsCisJLmlkCQk9IC0xLAorCS5yZXNvdXJjZQk9IHR3aV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHR3aV9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2kyYyh2b2lkKQoreworCS8qIHBpbnMgdXNlZCBmb3IgVFdJIGludGVyZmFjZSAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMjMsIDApOwkJLyogVFdEICovCisJYXQ5MV9zZXRfbXVsdGlfZHJpdmUoQVQ5MV9QSU5fUEEyMywgMSk7CisKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI0LCAwKTsJCS8qIFRXQ0sgKi8KKwlhdDkxX3NldF9tdWx0aV9kcml2ZShBVDkxX1BJTl9QQTI0LCAxKTsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTkyNjBfdHdpX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2kyYyh2b2lkKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBTUEkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQVRNRUwpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9BVE1FTF9NT0RVTEUpCitzdGF0aWMgdTY0IHNwaV9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNwaTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9CQVNFX1NQSTAsCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9CQVNFX1NQSTAgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfSURfU1BJMCwKKwkJLmVuZAk9IEFUOTFTQU05MjYwX0lEX1NQSTAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOTI2MF9zcGkwX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfc3BpIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJnNwaV9kbWFtYXNrLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJfSwKKwkucmVzb3VyY2UJPSBzcGkwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc3BpMF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTBfc3RhbmRhcmRfY3NbNF0gPSB7IEFUOTFfUElOX1BBMywgQVQ5MV9QSU5fUEMxMSwgQVQ5MV9QSU5fUEMxNiwgQVQ5MV9QSU5fUEMxNyB9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNwaTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9CQVNFX1NQSTEsCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9CQVNFX1NQSTEgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfSURfU1BJMSwKKwkJLmVuZAk9IEFUOTFTQU05MjYwX0lEX1NQSTEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOTI2MF9zcGkxX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfc3BpIiwKKwkuaWQJCT0gMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJnNwaV9kbWFtYXNrLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJfSwKKwkucmVzb3VyY2UJPSBzcGkxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc3BpMV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTFfc3RhbmRhcmRfY3NbNF0gPSB7IEFUOTFfUElOX1BCMywgQVQ5MV9QSU5fUEM1LCBBVDkxX1BJTl9QQzQsIEFUOTFfUElOX1BDMyB9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfc3BpKHN0cnVjdCBzcGlfYm9hcmRfaW5mbyAqZGV2aWNlcywgaW50IG5yX2RldmljZXMpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBjc19waW47CisJc2hvcnQgZW5hYmxlX3NwaTAgPSAwOworCXNob3J0IGVuYWJsZV9zcGkxID0gMDsKKworCS8qIENob29zZSBTUEkgY2hpcC1zZWxlY3RzICovCisJZm9yIChpID0gMDsgaSA8IG5yX2RldmljZXM7IGkrKykgeworCQlpZiAoZGV2aWNlc1tpXS5jb250cm9sbGVyX2RhdGEpCisJCQljc19waW4gPSAodW5zaWduZWQgbG9uZykgZGV2aWNlc1tpXS5jb250cm9sbGVyX2RhdGE7CisJCWVsc2UgaWYgKGRldmljZXNbaV0uYnVzX251bSA9PSAwKQorCQkJY3NfcGluID0gc3BpMF9zdGFuZGFyZF9jc1tkZXZpY2VzW2ldLmNoaXBfc2VsZWN0XTsKKwkJZWxzZQorCQkJY3NfcGluID0gc3BpMV9zdGFuZGFyZF9jc1tkZXZpY2VzW2ldLmNoaXBfc2VsZWN0XTsKKworCQlpZiAoZGV2aWNlc1tpXS5idXNfbnVtID09IDApCisJCQllbmFibGVfc3BpMCA9IDE7CisJCWVsc2UKKwkJCWVuYWJsZV9zcGkxID0gMTsKKworCQkvKiBlbmFibGUgY2hpcC1zZWxlY3QgcGluICovCisJCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGNzX3BpbiwgMSk7CisKKwkJLyogcGFzcyBjaGlwLXNlbGVjdCBwaW4gdG8gZHJpdmVyICovCisJCWRldmljZXNbaV0uY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgY3NfcGluOworCX0KKworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGRldmljZXMsIG5yX2RldmljZXMpOworCisJLyogQ29uZmlndXJlIFNQSSBidXMoZXMpICovCisJaWYgKGVuYWJsZV9zcGkwKSB7CisJCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMCwgMCk7CS8qIFNQSTBfTUlTTyAqLworCQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTEsIDApOwkvKiBTUEkwX01PU0kgKi8KKwkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEyLCAwKTsJLyogU1BJMV9TUENLICovCisKKwkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInNwaTBfY2xrIiwgJmF0OTFzYW05MjYwX3NwaTBfZGV2aWNlLmRldiwgInNwaV9jbGsiKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxc2FtOTI2MF9zcGkwX2RldmljZSk7CisJfQorCWlmIChlbmFibGVfc3BpMSkgeworCQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjAsIDApOwkvKiBTUEkxX01JU08gKi8KKwkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxLCAwKTsJLyogU1BJMV9NT1NJICovCisJCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMiwgMCk7CS8qIFNQSTFfU1BDSyAqLworCisJCWF0OTFfY2xvY2tfYXNzb2NpYXRlKCJzcGkxX2NsayIsICZhdDkxc2FtOTI2MF9zcGkxX2RldmljZS5kZXYsICJzcGlfY2xrIik7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXNhbTkyNjBfc3BpMV9kZXZpY2UpOworCX0KK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfc3BpKHN0cnVjdCBzcGlfYm9hcmRfaW5mbyAqZGV2aWNlcywgaW50IG5yX2RldmljZXMpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIExFRHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19MRURTKQordTggYXQ5MV9sZWRzX2NwdTsKK3U4IGF0OTFfbGVkc190aW1lcjsKKwordm9pZCBfX2luaXQgYXQ5MV9pbml0X2xlZHModTggY3B1X2xlZCwgdTggdGltZXJfbGVkKQoreworCWF0OTFfbGVkc19jcHUJPSBjcHVfbGVkOworCWF0OTFfbGVkc190aW1lcgk9IHRpbWVyX2xlZDsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2luaXRfbGVkcyh1OCBjcHVfbGVkLCB1OCB0aW1lcl9sZWQpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFVBUlQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0FUTUVMKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYmd1X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSwKKwkJLmVuZAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UgKyBTWl81MTIgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MV9JRF9TWVMsCisJCS5lbmQJPSBBVDkxX0lEX1NZUywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIGRiZ3VfZGF0YSA9IHsKKwkudXNlX2RtYV90eAk9IDAsCisJLnVzZV9kbWFfcngJPSAwLAkJLyogREJHVSBub3QgY2FwYWJsZSBvZiByZWNlaXZlIERNQSAqLworCS5yZWdzCQk9ICh2b2lkIF9faW9tZW0gKikoQVQ5MV9WQV9CQVNFX1NZUyArIEFUOTFfREJHVSksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOTI2MF9kYmd1X2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJmRiZ3VfZGF0YSwKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gZGJndV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRiZ3VfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfZGJndV9waW5zKHZvaWQpCit7CisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxNCwgMCk7CQkvKiBEUlhEICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxNSwgMSk7CQkvKiBEVFhEICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9CQVNFX1VTMCwKKwkJLmVuZAk9IEFUOTFTQU05MjYwX0JBU0VfVVMwICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYwX0lEX1VTMCwKKwkJLmVuZAk9IEFUOTFTQU05MjYwX0lEX1VTMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIHVhcnQwX2RhdGEgPSB7CisJLnVzZV9kbWFfdHgJPSAxLAorCS51c2VfZG1hX3J4CT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYwX3VhcnQwX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAorCS5pZAkJPSAxLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnVhcnQwX2RhdGEsCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5yZXNvdXJjZQk9IHVhcnQwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydDBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQwX3BpbnModm9pZCkKK3sKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjQsIDEpOwkJLyogVFhEMCAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCNSwgMCk7CQkvKiBSWEQwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIyNiwgMCk7CQkvKiBSVFMwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIyNywgMCk7CQkvKiBDVFMwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIyNCwgMCk7CQkvKiBEVFIwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIyMiwgMCk7CQkvKiBEU1IwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIyMywgMCk7CQkvKiBEQ0QwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIyNSwgMCk7CQkvKiBSSTAgKi8KK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0MV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYwX0JBU0VfVVMxLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjBfQkFTRV9VUzEgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfSURfVVMxLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjBfSURfVVMxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgdWFydDFfZGF0YSA9IHsKKwkudXNlX2RtYV90eAk9IDEsCisJLnVzZV9kbWFfcngJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjBfdWFydDFfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdG1lbF91c2FydCIsCisJLmlkCQk9IDIsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJPSAmdWFydDFfZGF0YSwKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gdWFydDFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1YXJ0MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ3VyZV91c2FydDFfcGlucyh2b2lkKQoreworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCNiwgMSk7CQkvKiBUWEQxICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEI3LCAwKTsJCS8qIFJYRDEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI4LCAwKTsJCS8qIFJUUzEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI5LCAwKTsJCS8qIENUUzEgKi8KK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0Ml9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYwX0JBU0VfVVMyLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjBfQkFTRV9VUzIgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfSURfVVMyLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjBfSURfVVMyLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgdWFydDJfZGF0YSA9IHsKKwkudXNlX2RtYV90eAk9IDEsCisJLnVzZV9kbWFfcngJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjBfdWFydDJfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdG1lbF91c2FydCIsCisJLmlkCQk9IDMsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJPSAmdWFydDJfZGF0YSwKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gdWFydDJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1YXJ0Ml9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ3VyZV91c2FydDJfcGlucyh2b2lkKQoreworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCOCwgMSk7CQkvKiBUWEQyICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEI5LCAwKTsJCS8qIFJYRDIgKi8KK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0M19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYwX0JBU0VfVVMzLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjBfQkFTRV9VUzMgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfSURfVVMzLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjBfSURfVVMzLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgdWFydDNfZGF0YSA9IHsKKwkudXNlX2RtYV90eAk9IDEsCisJLnVzZV9kbWFfcngJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjBfdWFydDNfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdG1lbF91c2FydCIsCisJLmlkCQk9IDQsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJPSAmdWFydDNfZGF0YSwKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gdWFydDNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1YXJ0M19yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ3VyZV91c2FydDNfcGlucyh2b2lkKQoreworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMTAsIDEpOwkJLyogVFhEMyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMTEsIDApOwkJLyogUlhEMyAqLworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHVhcnQ0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjBfQkFTRV9VUzQsCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9CQVNFX1VTNCArIFNaXzE2SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9JRF9VUzQsCisJCS5lbmQJPSBBVDkxU0FNOTI2MF9JRF9VUzQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSB1YXJ0NF9kYXRhID0geworCS51c2VfZG1hX3R4CT0gMSwKKwkudXNlX2RtYV9yeAk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxc2FtOTI2MF91YXJ0NF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX3VzYXJ0IiwKKwkuaWQJCT0gNSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9ICZ1YXJ0NF9kYXRhLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCisJfSwKKwkucmVzb3VyY2UJPSB1YXJ0NF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVhcnQ0X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlndXJlX3VzYXJ0NF9waW5zKHZvaWQpCit7CisJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEEzMSwgMSk7CQkvKiBUWEQ0ICovCisJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEEzMCwgMCk7CQkvKiBSWEQ0ICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDVfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MF9CQVNFX1VTNSwKKwkJLmVuZAk9IEFUOTFTQU05MjYwX0JBU0VfVVM1ICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYwX0lEX1VTNSwKKwkJLmVuZAk9IEFUOTFTQU05MjYwX0lEX1VTNSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIHVhcnQ1X2RhdGEgPSB7CisJLnVzZV9kbWFfdHgJPSAxLAorCS51c2VfZG1hX3J4CT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYwX3VhcnQ1X2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAorCS5pZAkJPSA2LAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnVhcnQ1X2RhdGEsCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5yZXNvdXJjZQk9IHVhcnQ1X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydDVfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQ1X3BpbnModm9pZCkKK3sKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjEyLCAxKTsJCS8qIFRYRDUgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjEzLCAwKTsJCS8qIFJYRDUgKi8KK30KKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXQ5MV91YXJ0c1tBVE1FTF9NQVhfVUFSVF07CS8qIHRoZSBVQVJUcyB0byB1c2UgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2U7CS8qIHRoZSBzZXJpYWwgY29uc29sZSBkZXZpY2UgKi8KKwordm9pZCBfX2luaXQgYXQ5MV9pbml0X3NlcmlhbChzdHJ1Y3QgYXQ5MV91YXJ0X2NvbmZpZyAqY29uZmlnKQoreworCWludCBpOworCisJLyogRmlsbCBpbiBsaXN0IG9mIHN1cHBvcnRlZCBVQVJUcyAqLworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPm5yX3R0eTsgaSsrKSB7CisJCXN3aXRjaCAoY29uZmlnLT50dHlfbWFwW2ldKSB7CisJCQljYXNlIDA6CisJCQkJY29uZmlndXJlX3VzYXJ0MF9waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxc2FtOTI2MF91YXJ0MF9kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0MF9jbGsiLCAmYXQ5MXNhbTkyNjBfdWFydDBfZGV2aWNlLmRldiwgInVzYXJ0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJY29uZmlndXJlX3VzYXJ0MV9waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxc2FtOTI2MF91YXJ0MV9kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0MV9jbGsiLCAmYXQ5MXNhbTkyNjBfdWFydDFfZGV2aWNlLmRldiwgInVzYXJ0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJY29uZmlndXJlX3VzYXJ0Ml9waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxc2FtOTI2MF91YXJ0Ml9kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0Ml9jbGsiLCAmYXQ5MXNhbTkyNjBfdWFydDJfZGV2aWNlLmRldiwgInVzYXJ0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJY29uZmlndXJlX3VzYXJ0M19waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxc2FtOTI2MF91YXJ0M19kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0M19jbGsiLCAmYXQ5MXNhbTkyNjBfdWFydDNfZGV2aWNlLmRldiwgInVzYXJ0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJY29uZmlndXJlX3VzYXJ0NF9waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxc2FtOTI2MF91YXJ0NF9kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0NF9jbGsiLCAmYXQ5MXNhbTkyNjBfdWFydDRfZGV2aWNlLmRldiwgInVzYXJ0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJY29uZmlndXJlX3VzYXJ0NV9waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxc2FtOTI2MF91YXJ0NV9kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0NV9jbGsiLCAmYXQ5MXNhbTkyNjBfdWFydDVfZGV2aWNlLmRldiwgInVzYXJ0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJY29uZmlndXJlX2RiZ3VfcGlucygpOworCQkJCWF0OTFfdWFydHNbaV0gPSAmYXQ5MXNhbTkyNjBfZGJndV9kZXZpY2U7CisJCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoIm1jayIsICZhdDkxc2FtOTI2MF9kYmd1X2RldmljZS5kZXYsICJ1c2FydCIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljb250aW51ZTsKKwkJfQorCQlhdDkxX3VhcnRzW2ldLT5pZCA9IGk7CQkvKiB1cGRhdGUgSUQgbnVtYmVyIHRvIG1hcHBlZCBJRCAqLworCX0KKworCS8qIFNldCBzZXJpYWwgY29uc29sZSBkZXZpY2UgKi8KKwlpZiAoY29uZmlnLT5jb25zb2xlX3R0eSA8IEFUTUVMX01BWF9VQVJUKQorCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlID0gYXQ5MV91YXJ0c1tjb25maWctPmNvbnNvbGVfdHR5XTsKKwlpZiAoIWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UpCisJCXByaW50ayhLRVJOX0lORk8gIkFUOTE6IE5vIGRlZmF1bHQgc2VyaWFsIGNvbnNvbGUgZGVmaW5lZC5cbiIpOworfQorCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfc2VyaWFsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUFYX1VBUlQ7IGkrKykgeworCQlpZiAoYXQ5MV91YXJ0c1tpXSkKKwkJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihhdDkxX3VhcnRzW2ldKTsKKwl9Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9pbml0X3NlcmlhbChzdHJ1Y3QgYXQ5MV91YXJ0X2NvbmZpZyAqY29uZmlnKSB7fQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCh2b2lkKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGVzZSBkZXZpY2VzIGFyZSBhbHdheXMgcHJlc2VudCBhbmQgZG9uJ3QgbmVlZCBhbnkgYm9hcmQtc3BlY2lmaWMKKyAqIHNldHVwLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX2FkZF9zdGFuZGFyZF9kZXZpY2VzKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoYXQ5MV9hZGRfc3RhbmRhcmRfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODJmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjEuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFzYW05MjYxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9wbWMuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKyNpbmNsdWRlICJjbG9jay5oIgorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFzYW05MjYxX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCXsKKwkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfSwgeworCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTkyNjFfU1JBTV9TSVpFLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjFfU1JBTV9CQVNFKSwKKwkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MV9TUkFNX1NJWkUsCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBDbG9ja3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGUgcGVyaXBoZXJhbCBjbG9ja3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHBpb0FfY2xrID0geworCS5uYW1lCQk9ICJwaW9BX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MV9JRF9QSU9BLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgcGlvQl9jbGsgPSB7CisJLm5hbWUJCT0gInBpb0JfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYxX0lEX1BJT0IsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayBwaW9DX2NsayA9IHsKKwkubmFtZQkJPSAicGlvQ19jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjFfSURfUElPQywKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYXJ0MF9jbGsgPSB7CisJLm5hbWUJCT0gInVzYXJ0MF9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjFfSURfVVMwLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgdXNhcnQxX2NsayA9IHsKKwkubmFtZQkJPSAidXNhcnQxX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MV9JRF9VUzEsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayB1c2FydDJfY2xrID0geworCS5uYW1lCQk9ICJ1c2FydDJfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYxX0lEX1VTMiwKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tY19jbGsgPSB7CisJLm5hbWUJCT0gIm1jaV9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjFfSURfTUNJLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgdWRjX2NsayA9IHsKKwkubmFtZQkJPSAidWRjX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MV9JRF9VRFAsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayB0d2lfY2xrID0geworCS5uYW1lCQk9ICJ0d2lfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYxX0lEX1RXSSwKKwkudHlwZQkJPSBDTEtfVFlQRV9QRVJJUEhFUkFMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNwaTBfY2xrID0geworCS5uYW1lCQk9ICJzcGkwX2NsayIsCisJLnBtY19tYXNrCT0gMSA8PCBBVDkxU0FNOTI2MV9JRF9TUEkwLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgc3BpMV9jbGsgPSB7CisJLm5hbWUJCT0gInNwaTFfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYxX0lEX1NQSTEsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CitzdGF0aWMgc3RydWN0IGNsayBvaGNpX2NsayA9IHsKKwkubmFtZQkJPSAib2hjaV9jbGsiLAorCS5wbWNfbWFzawk9IDEgPDwgQVQ5MVNBTTkyNjFfSURfVUhQLAorCS50eXBlCQk9IENMS19UWVBFX1BFUklQSEVSQUwsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgbGNkY19jbGsgPSB7CisJLm5hbWUJCT0gImxjZGNfY2xrIiwKKwkucG1jX21hc2sJPSAxIDw8IEFUOTFTQU05MjYxX0lEX0xDREMsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUEVSSVBIRVJBTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpwZXJpcGhfY2xvY2tzW10gX19pbml0ZGF0YSA9IHsKKwkmcGlvQV9jbGssCisJJnBpb0JfY2xrLAorCSZwaW9DX2NsaywKKwkmdXNhcnQwX2NsaywKKwkmdXNhcnQxX2NsaywKKwkmdXNhcnQyX2NsaywKKwkmbW1jX2NsaywKKwkmdWRjX2NsaywKKwkmdHdpX2NsaywKKwkmc3BpMF9jbGssCisJJnNwaTFfY2xrLAorCS8vIHNzYyAwIC4uIHNzYzIKKwkvLyB0YzAgLi4gdGMyCisJJm9oY2lfY2xrLAorCSZsY2RjX2NsaywKKwkvLyBpcnEwIC4uIGlycTIKK307CisKKy8qCisgKiBUaGUgZm91ciBwcm9ncmFtbWFibGUgY2xvY2tzLgorICogWW91IG11c3QgY29uZmlndXJlIHBpbiBtdWx0aXBsZXhpbmcgdG8gYnJpbmcgdGhlc2Ugc2lnbmFscyBvdXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjazAgPSB7CisJLm5hbWUJCT0gInBjazAiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1BDSzAsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUFJPR1JBTU1BQkxFLAorCS5pZAkJPSAwLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjazEgPSB7CisJLm5hbWUJCT0gInBjazEiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1BDSzEsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUFJPR1JBTU1BQkxFLAorCS5pZAkJPSAxLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjazIgPSB7CisJLm5hbWUJCT0gInBjazIiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1BDSzIsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUFJPR1JBTU1BQkxFLAorCS5pZAkJPSAyLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjazMgPSB7CisJLm5hbWUJCT0gInBjazMiLAorCS5wbWNfbWFzawk9IEFUOTFfUE1DX1BDSzMsCisJLnR5cGUJCT0gQ0xLX1RZUEVfUFJPR1JBTU1BQkxFLAorCS5pZAkJPSAzLAorfTsKKworLyogSENsb2NrcyAqLworc3RhdGljIHN0cnVjdCBjbGsgaGNrMCA9IHsKKwkubmFtZQkJPSAiaGNrMCIsCisJLnBtY19tYXNrCT0gQVQ5MV9QTUNfSENLMCwKKwkudHlwZQkJPSBDTEtfVFlQRV9TWVNURU0sCisJLmlkCQk9IDAsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgaGNrMSA9IHsKKwkubmFtZQkJPSAiaGNrMSIsCisJLnBtY19tYXNrCT0gQVQ5MV9QTUNfSENLMSwKKwkudHlwZQkJPSBDTEtfVFlQRV9TWVNURU0sCisJLmlkCQk9IDEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfcmVnaXN0ZXJfY2xvY2tzKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwZXJpcGhfY2xvY2tzKTsgaSsrKQorCQljbGtfcmVnaXN0ZXIocGVyaXBoX2Nsb2Nrc1tpXSk7CisKKwljbGtfcmVnaXN0ZXIoJnBjazApOworCWNsa19yZWdpc3RlcigmcGNrMSk7CisJY2xrX3JlZ2lzdGVyKCZwY2syKTsKKwljbGtfcmVnaXN0ZXIoJnBjazMpOworCisJY2xrX3JlZ2lzdGVyKCZoY2swKTsKKwljbGtfcmVnaXN0ZXIoJmhjazEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEdQSU8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9ncGlvX2JhbmsgYXQ5MXNhbTkyNjFfZ3Bpb1tdID0geworCXsKKwkJLmlkCQk9IEFUOTFTQU05MjYxX0lEX1BJT0EsCisJCS5vZmZzZXQJCT0gQVQ5MV9QSU9BLAorCQkuY2xvY2sJCT0gJnBpb0FfY2xrLAorCX0sIHsKKwkJLmlkCQk9IEFUOTFTQU05MjYxX0lEX1BJT0IsCisJCS5vZmZzZXQJCT0gQVQ5MV9QSU9CLAorCQkuY2xvY2sJCT0gJnBpb0JfY2xrLAorCX0sIHsKKwkJLmlkCQk9IEFUOTFTQU05MjYxX0lEX1BJT0MsCisJCS5vZmZzZXQJCT0gQVQ5MV9QSU9DLAorCQkuY2xvY2sJCT0gJnBpb0NfY2xrLAorCX0KK307CisKK3N0YXRpYyB2b2lkIGF0OTFzYW05MjYxX3Jlc2V0KHZvaWQpCit7Cisjd2FybmluZyAiSW1wbGVtZW50IENQVSByZXNldCIKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEFUOTFTQU05MjYxIHByb2Nlc3NvciBpbml0aWFsaXphdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spCit7CisJLyogTWFwIHBlcmlwaGVyYWxzICovCisJaW90YWJsZV9pbml0KGF0OTFzYW05MjYxX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXNhbTkyNjFfaW9fZGVzYykpOworCisJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXNhbTkyNjFfcmVzZXQ7CisJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVNBTTkyNjFfSURfSVJRMCkgfCAoMSA8PCBBVDkxU0FNOTI2MV9JRF9JUlExKQorCQkJfCAoMSA8PCBBVDkxU0FNOTI2MV9JRF9JUlEyKTsKKworCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCisJYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOworCisJLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KKwlhdDkxc2FtOTI2MV9yZWdpc3Rlcl9jbG9ja3MoKTsKKworCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCisJYXQ5MV9ncGlvX2luaXQoYXQ5MXNhbTkyNjFfZ3BpbywgMyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgSW50ZXJydXB0IGluaXRpYWxpemF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGhlIGRlZmF1bHQgaW50ZXJydXB0IHByaW9yaXR5IGxldmVscyAoMCA9IGxvd2VzdCwgNyA9IGhpZ2hlc3QpLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGF0OTFzYW05MjYxX2RlZmF1bHRfaXJxX3ByaW9yaXR5W05SX0FJQ19JUlFTXSBfX2luaXRkYXRhID0geworCTcsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCisJNywJLyogU3lzdGVtIFBlcmlwaGVyYWxzICovCisJMCwJLyogUGFyYWxsZWwgSU8gQ29udHJvbGxlciBBICovCisJMCwJLyogUGFyYWxsZWwgSU8gQ29udHJvbGxlciBCICovCisJMCwJLyogUGFyYWxsZWwgSU8gQ29udHJvbGxlciBDICovCisJMCwKKwk2LAkvKiBVU0FSVCAwICovCisJNiwJLyogVVNBUlQgMSAqLworCTYsCS8qIFVTQVJUIDIgKi8KKwkwLAkvKiBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlICovCisJNCwJLyogVVNCIERldmljZSBQb3J0ICovCisJMCwJLyogVHdvLVdpcmUgSW50ZXJmYWNlICovCisJNiwJLyogU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIDAgKi8KKwk2LAkvKiBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgMSAqLworCTUsCS8qIFNlcmlhbCBTeW5jaHJvbm91cyBDb250cm9sbGVyIDAgKi8KKwk1LAkvKiBTZXJpYWwgU3luY2hyb25vdXMgQ29udHJvbGxlciAxICovCisJNSwJLyogU2VyaWFsIFN5bmNocm9ub3VzIENvbnRyb2xsZXIgMiAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgMCAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgMSAqLworCTAsCS8qIFRpbWVyIENvdW50ZXIgMiAqLworCTMsCS8qIFVTQiBIb3N0IHBvcnQgKi8KKwkzLAkvKiBMQ0QgQ29udHJvbGxlciAqLworCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KKwkwLAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLworCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCit9OworCit2b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKK3sKKwlpZiAoIXByaW9yaXR5KQorCQlwcmlvcml0eSA9IGF0OTFzYW05MjYxX2RlZmF1bHRfaXJxX3ByaW9yaXR5OworCisJLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCisJYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7CisKKwkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCisJYXQ5MV9ncGlvX2lycV9zZXR1cCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYxX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxZDc5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKQEAgLTAsMCArMSw3NDEgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBUaGliYXV0IFZBUkVORSA8dmFyZW5ldEBwYXJpc2MtbGludXgub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNSBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxc2FtOTI2MS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFzYW05MjYxX21hdHJpeC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFzYW05MjZ4X21jLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKyNkZWZpbmUgU1pfNTEyCTB4MDAwMDAyMDAKKyNkZWZpbmUgU1pfMjU2CTB4MDAwMDAxMDAKKyNkZWZpbmUgU1pfMTYJMHgwMDAwMDAxMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFVTQiBIb3N0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorc3RhdGljIHU2NCBvaGNpX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7CitzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIHVzYmhfZGF0YTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2JoX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjFfVUhQX0JBU0UsCisJCS5lbmQJPSBBVDkxU0FNOTI2MV9VSFBfQkFTRSArIFNaXzFNIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0lEX1VIUCwKKwkJLmVuZAk9IEFUOTFTQU05MjYxX0lEX1VIUCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYxX3VzYmhfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX29oY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJm9oY2lfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1c2JoX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB1c2JoX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodXNiaF9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJdXNiaF9kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxc2FtOTI2MV91c2JoX2RldmljZSk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBVU0IgRGV2aWNlIChHYWRnZXQpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQVQ5MQorc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIHVkY19kYXRhOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHVkY19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0JBU0VfVURQLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjFfQkFTRV9VRFAgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjFfSURfVURQLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjFfSURfVURQLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjFfdWRjX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXQ5MV91ZGMiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQkJPSAmdWRjX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB1ZGNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1ZGNfcmVzb3VyY2VzKSwKK307CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91ZGMoc3RydWN0IGF0OTFfdWRjX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB4OworCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwlpZiAoZGF0YS0+dmJ1c19waW4pIHsKKwkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT52YnVzX3BpbiwgMCk7CisJCWF0OTFfc2V0X2RlZ2xpdGNoKGRhdGEtPnZidXNfcGluLCAxKTsKKwl9CisKKwkvKiBQdWxsdXAgcGluIGlzIGhhbmRsZWQgaW50ZXJuYWxseSAqLworCXggPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX1VTQlBVQ1IpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfTUFUUklYX1VTQlBVQ1IsIHggfCBBVDkxX01BVFJJWF9VU0JQVUNSX1BVT04pOworCisJdWRjX2RhdGEgPSAqZGF0YTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFzYW05MjYxX3VkY19kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91ZGMoc3RydWN0IGF0OTFfdWRjX2RhdGEgKmRhdGEpIHt9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBNTUMgLyBTRAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX01NQ19BVDkxKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfQVQ5MV9NT0RVTEUpCitzdGF0aWMgdTY0IG1tY19kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworc3RhdGljIHN0cnVjdCBhdDkxX21tY19kYXRhIG1tY19kYXRhOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1tY19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0JBU0VfTUNJLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjFfQkFTRV9NQ0kgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjFfSURfTUNJLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjFfSURfTUNJLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjFfbW1jX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXQ5MV9tY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJm1tY19kbWFtYXNrLAorCQkJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJCQkJLnBsYXRmb3JtX2RhdGEJCT0gJm1tY19kYXRhLAorCX0sCisJLnJlc291cmNlCT0gbW1jX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobW1jX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbW1jKHN0cnVjdCBhdDkxX21tY19kYXRhICpkYXRhKQoreworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJLyogaW5wdXQvaXJxICovCisJaWYgKGRhdGEtPmRldF9waW4pIHsKKwkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5kZXRfcGluLCAxKTsKKwkJYXQ5MV9zZXRfZGVnbGl0Y2goZGF0YS0+ZGV0X3BpbiwgMSk7CisJfQorCWlmIChkYXRhLT53cF9waW4pCisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+d3BfcGluLCAxKTsKKwlpZiAoZGF0YS0+dmNjX3BpbikKKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+dmNjX3BpbiwgMCk7CisKKwkvKiBDTEsgKi8KKwlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTIsIDApOworCisJLyogQ01EICovCisJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEExLCAxKTsKKworCS8qIERBVDAsIG1heWJlIERBVDEuLkRBVDMgKi8KKwlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTAsIDEpOworCWlmIChkYXRhLT53aXJlNCkgeworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTQsIDEpOworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTUsIDEpOworCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTYsIDEpOworCX0KKworCW1tY19kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxc2FtOTI2MV9tbWNfZGV2aWNlKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbW1jKHN0cnVjdCBhdDkxX21tY19kYXRhICpkYXRhKSB7fQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBOQU5EIC8gU21hcnRNZWRpYQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0FUOTEpIHx8IGRlZmluZWQoQ09ORklHX01URF9OQU5EX0FUOTFfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBhdDkxX25hbmRfZGF0YSBuYW5kX2RhdGE7CisKKyNkZWZpbmUgTkFORF9CQVNFCUFUOTFfQ0hJUFNFTEVDVF8zCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbmFuZF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IE5BTkRfQkFTRSwKKwkJLmVuZAk9IE5BTkRfQkFTRSArIFNaXzI1Nk0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxX25hbmRfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxX25hbmQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9ICZuYW5kX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBuYW5kX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobmFuZF9yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX25hbmQoc3RydWN0IGF0OTFfbmFuZF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgY3NhLCBtb2RlOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfTUFUUklYX0VCSUNTQSk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9NQVRSSVhfRUJJQ1NBLCBjc2EgfCBBVDkxX01BVFJJWF9DUzNBX1NNQyk7CisKKwkvKiBzZXQgdGhlIGJ1cyBpbnRlcmZhY2UgY2hhcmFjdGVyaXN0aWNzICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfU0VUVVAoMyksIEFUOTFfU01DX05XRVNFVFVQXygwKSB8IEFUOTFfU01DX05DU19XUlNFVFVQXygwKQorCQkJfCBBVDkxX1NNQ19OUkRTRVRVUF8oMCkgfCBBVDkxX1NNQ19OQ1NfUkRTRVRVUF8oMCkpOworCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfUFVMU0UoMyksIEFUOTFfU01DX05XRVBVTFNFXygyKSB8IEFUOTFfU01DX05DU19XUlBVTFNFXyg1KQorCQkJfCBBVDkxX1NNQ19OUkRQVUxTRV8oMikgfCBBVDkxX1NNQ19OQ1NfUkRQVUxTRV8oNSkpOworCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfQ1lDTEUoMyksIEFUOTFfU01DX05XRUNZQ0xFXyg3KSB8IEFUOTFfU01DX05SRENZQ0xFXyg3KSk7CisKKwlpZiAoZGF0YS0+YnVzX3dpZHRoXzE2KQorCQltb2RlID0gQVQ5MV9TTUNfREJXXzE2OworCWVsc2UKKwkJbW9kZSA9IEFUOTFfU01DX0RCV184OworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX01PREUoMyksIG1vZGUgfCBBVDkxX1NNQ19SRUFETU9ERSB8IEFUOTFfU01DX1dSSVRFTU9ERSB8IEFUOTFfU01DX0VYTldNT0RFX0RJU0FCTEUgfCBBVDkxX1NNQ19UREZfKDEpKTsKKworCS8qIGVuYWJsZSBwaW4gKi8KKwlpZiAoZGF0YS0+ZW5hYmxlX3BpbikKKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoZGF0YS0+ZW5hYmxlX3BpbiwgMSk7CisKKwkvKiByZWFkeS9idXN5IHBpbiAqLworCWlmIChkYXRhLT5yZHlfcGluKQorCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPnJkeV9waW4sIDEpOworCisJLyogY2FyZCBkZXRlY3QgcGluICovCisJaWYgKGRhdGEtPmRldF9waW4pCisJCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+ZGV0X3BpbiwgMSk7CisKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzAsIDApOwkJLyogTkFORE9FICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxLCAwKTsJCS8qIE5BTkRXRSAqLworCisJbmFuZF9kYXRhID0gKmRhdGE7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxX25hbmRfZGV2aWNlKTsKK30KKworI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9uYW5kKHN0cnVjdCBhdDkxX25hbmRfZGF0YSAqZGF0YSkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVFdJIChpMmMpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX0FUOTEpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19BVDkxX01PRFVMRSkKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0d2lfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MV9CQVNFX1RXSSwKKwkJLmVuZAk9IEFUOTFTQU05MjYxX0JBU0VfVFdJICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0lEX1RXSSwKKwkJLmVuZAk9IEFUOTFTQU05MjYxX0lEX1RXSSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYxX3R3aV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0OTFfaTJjIiwKKwkuaWQJCT0gLTEsCisJLnJlc291cmNlCT0gdHdpX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodHdpX3Jlc291cmNlcyksCit9OworCit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfaTJjKHZvaWQpCit7CisJLyogcGlucyB1c2VkIGZvciBUV0kgaW50ZXJmYWNlICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEE3LCAwKTsJCS8qIFRXRCAqLworCWF0OTFfc2V0X211bHRpX2RyaXZlKEFUOTFfUElOX1BBNywgMSk7CisKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTgsIDApOwkJLyogVFdDSyAqLworCWF0OTFfc2V0X211bHRpX2RyaXZlKEFUOTFfUElOX1BBOCwgMSk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFzYW05MjYxX3R3aV9kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9pMmModm9pZCkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgU1BJCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0FUTUVMKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQVRNRUxfTU9EVUxFKQorc3RhdGljIHU2NCBzcGlfZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzcGkwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjFfQkFTRV9TUEkwLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjFfQkFTRV9TUEkwICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0lEX1NQSTAsCisJCS5lbmQJPSBBVDkxU0FNOTI2MV9JRF9TUEkwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjFfc3BpMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX3NwaSIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCQkJLmRtYV9tYXNrCQk9ICZzcGlfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gc3BpMF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNwaTBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcGkwX3N0YW5kYXJkX2NzWzRdID0geyBBVDkxX1BJTl9QQTMsIEFUOTFfUElOX1BBNCwgQVQ5MV9QSU5fUEE1LCBBVDkxX1BJTl9QQTYgfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzcGkxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjFfQkFTRV9TUEkxLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjFfQkFTRV9TUEkxICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0lEX1NQSTEsCisJCS5lbmQJPSBBVDkxU0FNOTI2MV9JRF9TUEkxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjFfc3BpMV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX3NwaSIsCisJLmlkCQk9IDEsCisJLmRldgkJPSB7CisJCQkJLmRtYV9tYXNrCQk9ICZzcGlfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gc3BpMV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNwaTFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcGkxX3N0YW5kYXJkX2NzWzRdID0geyBBVDkxX1BJTl9QQjI4LCBBVDkxX1BJTl9QQTI0LCBBVDkxX1BJTl9QQTI1LCBBVDkxX1BJTl9QQTI2IH07CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9zcGkoc3RydWN0IHNwaV9ib2FyZF9pbmZvICpkZXZpY2VzLCBpbnQgbnJfZGV2aWNlcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGNzX3BpbjsKKwlzaG9ydCBlbmFibGVfc3BpMCA9IDA7CisJc2hvcnQgZW5hYmxlX3NwaTEgPSAwOworCisJLyogQ2hvb3NlIFNQSSBjaGlwLXNlbGVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfZGV2aWNlczsgaSsrKSB7CisJCWlmIChkZXZpY2VzW2ldLmNvbnRyb2xsZXJfZGF0YSkKKwkJCWNzX3BpbiA9ICh1bnNpZ25lZCBsb25nKSBkZXZpY2VzW2ldLmNvbnRyb2xsZXJfZGF0YTsKKwkJZWxzZSBpZiAoZGV2aWNlc1tpXS5idXNfbnVtID09IDApCisJCQljc19waW4gPSBzcGkwX3N0YW5kYXJkX2NzW2RldmljZXNbaV0uY2hpcF9zZWxlY3RdOworCQllbHNlCisJCQljc19waW4gPSBzcGkxX3N0YW5kYXJkX2NzW2RldmljZXNbaV0uY2hpcF9zZWxlY3RdOworCisJCWlmIChkZXZpY2VzW2ldLmJ1c19udW0gPT0gMCkKKwkJCWVuYWJsZV9zcGkwID0gMTsKKwkJZWxzZQorCQkJZW5hYmxlX3NwaTEgPSAxOworCisJCS8qIGVuYWJsZSBjaGlwLXNlbGVjdCBwaW4gKi8KKwkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoY3NfcGluLCAxKTsKKworCQkvKiBwYXNzIGNoaXAtc2VsZWN0IHBpbiB0byBkcml2ZXIgKi8KKwkJZGV2aWNlc1tpXS5jb250cm9sbGVyX2RhdGEgPSAodm9pZCAqKSBjc19waW47CisJfQorCisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oZGV2aWNlcywgbnJfZGV2aWNlcyk7CisKKwkvKiBDb25maWd1cmUgU1BJIGJ1cyhlcykgKi8KKwlpZiAoZW5hYmxlX3NwaTApIHsKKwkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEwLCAwKTsJLyogU1BJMF9NSVNPICovCisJCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMSwgMCk7CS8qIFNQSTBfTU9TSSAqLworCQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIsIDApOwkvKiBTUEkwX1NQQ0sgKi8KKworCQlhdDkxX2Nsb2NrX2Fzc29jaWF0ZSgic3BpMF9jbGsiLCAmYXQ5MXNhbTkyNjFfc3BpMF9kZXZpY2UuZGV2LCAic3BpX2NsayIpOworCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFzYW05MjYxX3NwaTBfZGV2aWNlKTsKKwl9CisJaWYgKGVuYWJsZV9zcGkxKSB7CisJCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMzAsIDApOwkvKiBTUEkxX01JU08gKi8KKwkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIzMSwgMCk7CS8qIFNQSTFfTU9TSSAqLworCQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI5LCAwKTsJLyogU1BJMV9TUENLICovCisKKwkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInNwaTFfY2xrIiwgJmF0OTFzYW05MjYxX3NwaTFfZGV2aWNlLmRldiwgInNwaV9jbGsiKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxc2FtOTI2MV9zcGkxX2RldmljZSk7CisJfQorfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9zcGkoc3RydWN0IHNwaV9ib2FyZF9pbmZvICpkZXZpY2VzLCBpbnQgbnJfZGV2aWNlcykge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgTENEIENvbnRyb2xsZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9BVDkxKSB8fCBkZWZpbmVkKENPTkZJR19GQl9BVDkxX01PRFVMRSkKK3N0YXRpYyB1NjQgbGNkY19kbWFtYXNrID0gMHhmZmZmZmZmZlVMOworc3RhdGljIHN0cnVjdCBhdDkxZmJfaW5mbyBsY2RjX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbGNkY19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0xDRENfQkFTRSwKKwkJLmVuZAk9IEFUOTFTQU05MjYxX0xDRENfQkFTRSArIFNaXzRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0lEX0xDREMsCisJCS5lbmQJPSBBVDkxU0FNOTI2MV9JRF9MQ0RDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorI2lmIGRlZmluZWQoQ09ORklHX0ZCX0lOVFNSQU0pCisJWzJdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MV9TUkFNX0JBU0UsCisJCS5lbmQJPSBBVDkxU0FNOTI2MV9TUkFNX0JBU0UgKyBBVDkxU0FNOTI2MV9TUkFNX1NJWkUgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxX2xjZGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdDkxLWZiIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJCQkuZG1hX21hc2sJCT0gJmxjZGNfZG1hbWFzaywKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZsY2RjX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBsY2RjX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobGNkY19yZXNvdXJjZXMpLAorfTsKKwordm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2xjZGMoc3RydWN0IGF0OTFmYl9pbmZvICpkYXRhKQoreworCWlmICghZGF0YSkgeworCQlyZXR1cm47CisJfQorCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxLCAwKTsJLyogTENESFNZTkMgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjIsIDApOwkvKiBMQ0RET1RDSyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMywgMCk7CS8qIExDRERFTiAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCNCwgMCk7CS8qIExDRENDICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEI3LCAwKTsJLyogTENERDIgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjgsIDApOwkvKiBMQ0REMyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCOSwgMCk7CS8qIExDREQ0ICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxMCwgMCk7CS8qIExDREQ1ICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxMSwgMCk7CS8qIExDREQ2ICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxMiwgMCk7CS8qIExDREQ3ICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxNSwgMCk7CS8qIExDREQxMCAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMTYsIDApOwkvKiBMQ0REMTEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjE3LCAwKTsJLyogTENERDEyICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxOCwgMCk7CS8qIExDREQxMyAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BCMTksIDApOwkvKiBMQ0REMTQgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjIwLCAwKTsJLyogTENERDE1ICovCisJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIyMywgMCk7CS8qIExDREQxOCAqLworCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMjQsIDApOwkvKiBMQ0REMTkgKi8KKwlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjI1LCAwKTsJLyogTENERDIwICovCisJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIyNiwgMCk7CS8qIExDREQyMSAqLworCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMjcsIDApOwkvKiBMQ0REMjIgKi8KKwlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjI4LCAwKTsJLyogTENERDIzICovCisKKwlsY2RjX2RhdGEgPSAqZGF0YTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFfbGNkY19kZXZpY2UpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9sY2RjKHN0cnVjdCBhdDkxZmJfaW5mbyAqZGF0YSkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgTEVEcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0xFRFMpCit1OCBhdDkxX2xlZHNfY3B1OwordTggYXQ5MV9sZWRzX3RpbWVyOworCit2b2lkIF9faW5pdCBhdDkxX2luaXRfbGVkcyh1OCBjcHVfbGVkLCB1OCB0aW1lcl9sZWQpCit7CisJYXQ5MV9sZWRzX2NwdQk9IGNwdV9sZWQ7CisJYXQ5MV9sZWRzX3RpbWVyCT0gdGltZXJfbGVkOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGF0OTFfaW5pdF9sZWRzKHU4IGNwdV9sZWQsIHU4IHRpbWVyX2xlZCkge30KKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVUFSVAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9BVE1FTCkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGJndV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCisJCS5lbmQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFfSURfU1lTLAorCQkuZW5kCT0gQVQ5MV9JRF9TWVMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSBkYmd1X2RhdGEgPSB7CisJLnVzZV9kbWFfdHgJPSAwLAorCS51c2VfZG1hX3J4CT0gMCwJCS8qIERCR1Ugbm90IGNhcGFibGUgb2YgcmVjZWl2ZSBETUEgKi8KKwkucmVncwkJPSAodm9pZCBfX2lvbWVtICopKEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjFfZGJndV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImF0bWVsX3VzYXJ0IiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9ICZkYmd1X2RhdGEsCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5yZXNvdXJjZQk9IGRiZ3VfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShkYmd1X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlndXJlX2RiZ3VfcGlucyh2b2lkKQoreworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBOSwgMCk7CQkvKiBEUlhEICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExMCwgMSk7CQkvKiBEVFhEICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MV9CQVNFX1VTMCwKKwkJLmVuZAk9IEFUOTFTQU05MjYxX0JBU0VfVVMwICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0lEX1VTMCwKKwkJLmVuZAk9IEFUOTFTQU05MjYxX0lEX1VTMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIHVhcnQwX2RhdGEgPSB7CisJLnVzZV9kbWFfdHgJPSAxLAorCS51c2VfZG1hX3J4CT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYxX3VhcnQwX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAorCS5pZAkJPSAxLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnVhcnQwX2RhdGEsCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5yZXNvdXJjZQk9IHVhcnQwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydDBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQwX3BpbnModm9pZCkKK3sKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzgsIDEpOwkJLyogVFhEMCAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDOSwgMCk7CQkvKiBSWEQwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxMCwgMCk7CQkvKiBSVFMwICovCisJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxMSwgMCk7CQkvKiBDVFMwICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBBVDkxU0FNOTI2MV9CQVNFX1VTMSwKKwkJLmVuZAk9IEFUOTFTQU05MjYxX0JBU0VfVVMxICsgU1pfMTZLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0lEX1VTMSwKKwkJLmVuZAk9IEFUOTFTQU05MjYxX0lEX1VTMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZWxfdWFydF9kYXRhIHVhcnQxX2RhdGEgPSB7CisJLnVzZV9kbWFfdHgJPSAxLAorCS51c2VfZG1hX3J4CT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYxX3VhcnQxX2RldmljZSA9IHsKKwkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAorCS5pZAkJPSAyLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnVhcnQxX2RhdGEsCisJCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorCS5yZXNvdXJjZQk9IHVhcnQxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydDFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQxX3BpbnModm9pZCkKK3sKKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzEyLCAxKTsJCS8qIFRYRDEgKi8KKwlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzEzLCAwKTsJCS8qIFJYRDEgKi8KK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0Ml9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IEFUOTFTQU05MjYxX0JBU0VfVVMyLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjFfQkFTRV9VUzIgKyBTWl8xNksgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MVNBTTkyNjFfSURfVVMyLAorCQkuZW5kCT0gQVQ5MVNBTTkyNjFfSURfVVMyLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgdWFydDJfZGF0YSA9IHsKKwkudXNlX2RtYV90eAk9IDEsCisJLnVzZV9kbWFfcngJPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXNhbTkyNjFfdWFydDJfZGV2aWNlID0geworCS5uYW1lCQk9ICJhdG1lbF91c2FydCIsCisJLmlkCQk9IDMsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJPSAmdWFydDJfZGF0YSwKKwkJCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCX0sCisJLnJlc291cmNlCT0gdWFydDJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1YXJ0Ml9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ3VyZV91c2FydDJfcGlucyh2b2lkKQoreworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDMTUsIDApOwkJLyogUlhEMiAqLworCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDMTQsIDEpOwkJLyogVFhEMiAqLworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDkxX3VhcnRzW0FUTUVMX01BWF9VQVJUXTsJLyogdGhlIFVBUlRzIHRvIHVzZSAqLworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZTsJLyogdGhlIHNlcmlhbCBjb25zb2xlIGRldmljZSAqLworCit2b2lkIF9faW5pdCBhdDkxX2luaXRfc2VyaWFsKHN0cnVjdCBhdDkxX3VhcnRfY29uZmlnICpjb25maWcpCit7CisJaW50IGk7CisKKwkvKiBGaWxsIGluIGxpc3Qgb2Ygc3VwcG9ydGVkIFVBUlRzICovCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+bnJfdHR5OyBpKyspIHsKKwkJc3dpdGNoIChjb25maWctPnR0eV9tYXBbaV0pIHsKKwkJCWNhc2UgMDoKKwkJCQljb25maWd1cmVfdXNhcnQwX3BpbnMoKTsKKwkJCQlhdDkxX3VhcnRzW2ldID0gJmF0OTFzYW05MjYxX3VhcnQwX2RldmljZTsKKwkJCQlhdDkxX2Nsb2NrX2Fzc29jaWF0ZSgidXNhcnQwX2NsayIsICZhdDkxc2FtOTI2MV91YXJ0MF9kZXZpY2UuZGV2LCAidXNhcnQiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQljb25maWd1cmVfdXNhcnQxX3BpbnMoKTsKKwkJCQlhdDkxX3VhcnRzW2ldID0gJmF0OTFzYW05MjYxX3VhcnQxX2RldmljZTsKKwkJCQlhdDkxX2Nsb2NrX2Fzc29jaWF0ZSgidXNhcnQxX2NsayIsICZhdDkxc2FtOTI2MV91YXJ0MV9kZXZpY2UuZGV2LCAidXNhcnQiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQljb25maWd1cmVfdXNhcnQyX3BpbnMoKTsKKwkJCQlhdDkxX3VhcnRzW2ldID0gJmF0OTFzYW05MjYxX3VhcnQyX2RldmljZTsKKwkJCQlhdDkxX2Nsb2NrX2Fzc29jaWF0ZSgidXNhcnQyX2NsayIsICZhdDkxc2FtOTI2MV91YXJ0Ml9kZXZpY2UuZGV2LCAidXNhcnQiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQljb25maWd1cmVfZGJndV9waW5zKCk7CisJCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxc2FtOTI2MV9kYmd1X2RldmljZTsKKwkJCQlhdDkxX2Nsb2NrX2Fzc29jaWF0ZSgibWNrIiwgJmF0OTFzYW05MjYxX2RiZ3VfZGV2aWNlLmRldiwgInVzYXJ0Iik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQl9CisJCWF0OTFfdWFydHNbaV0tPmlkID0gaTsJCS8qIHVwZGF0ZSBJRCBudW1iZXIgdG8gbWFwcGVkIElEICovCisJfQorCisJLyogU2V0IHNlcmlhbCBjb25zb2xlIGRldmljZSAqLworCWlmIChjb25maWctPmNvbnNvbGVfdHR5IDwgQVRNRUxfTUFYX1VBUlQpCisJCWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UgPSBhdDkxX3VhcnRzW2NvbmZpZy0+Y29uc29sZV90dHldOworCWlmICghYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQVQ5MTogTm8gZGVmYXVsdCBzZXJpYWwgY29uc29sZSBkZWZpbmVkLlxuIik7Cit9CisKK3ZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9zZXJpYWwodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBVE1FTF9NQVhfVUFSVDsgaSsrKSB7CisJCWlmIChhdDkxX3VhcnRzW2ldKQorCQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKGF0OTFfdWFydHNbaV0pOworCX0KK30KKyNlbHNlCit2b2lkIF9faW5pdCBhdDkxX2luaXRfc2VyaWFsKHN0cnVjdCBhdDkxX3VhcnRfY29uZmlnICpjb25maWcpIHt9Cit2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfc2VyaWFsKHZvaWQpIHt9CisjZW5kaWYKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGhlc2UgZGV2aWNlcyBhcmUgYWx3YXlzIHByZXNlbnQgYW5kIGRvbid0IG5lZWQgYW55IGJvYXJkLXNwZWNpZmljCisgKiBzZXR1cC4KKyAqLworc3RhdGljIGludCBfX2luaXQgYXQ5MV9hZGRfc3RhbmRhcmRfZGV2aWNlcyh2b2lkKQoreworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGF0OTFfYWRkX3N0YW5kYXJkX2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2F0OTFzYW05MjZ4X3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2eF90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkZjVmNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2eF90aW1lLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNnhfdGltZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgTS4gQW1pbmUgU0FZQSwgQVRNRUwgUm91c3NldCwgRnJhbmNlCisgKiBSZXZpc2lvbgkgMjAwNSBNLiBOaWNvbGFzIERpcmVtZGppYW4sIEFUTUVMIFJvdXNzZXQsIEZyYW5jZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfcGl0Lmg+CisKKworI2RlZmluZSBQSVRfQ1BJVih4KQkoKHgpICYgQVQ5MV9QSVRfQ1BJVikKKyNkZWZpbmUgUElUX1BJQ05UKHgpCSgoKHgpICYgQVQ5MV9QSVRfUElDTlQpID4+IDIwKQorCisvKgorICogUmV0dXJucyBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHNpbmNlIGxhc3QgdGltZXIgaW50ZXJydXB0LiAgTm90ZSB0aGF0IGludGVycnVwdHMKKyAqIHdpbGwgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IGRvX2dldHRpbWVvZmRheSgpCisgKiAgJ0xBVENIJyBpcyBod2Nsb2NrIHRpY2tzIChzZWUgQ0xPQ0tfVElDS19SQVRFIGluIHRpbWV4LmgpIHBlciBqaWZmeS4KKyAqICAndGljaycgaXMgdXNlY3MgcGVyIGppZmZ5IChsaW51eC90aW1leC5oKS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgYXQ5MXNhbTkyNnhfZ2V0dGltZW9mZnNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZDsKKwl1bnNpZ25lZCBsb25nIHQgPSBhdDkxX3N5c19yZWFkKEFUOTFfUElUX1BJSVIpOworCisJZWxhcHNlZCA9IChQSVRfUElDTlQodCkgKiBMQVRDSCkgKyBQSVRfQ1BJVih0KTsJCS8qIGhhcmR3YXJlIGNsb2NrIGN5Y2xlcyAqLworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKShlbGFwc2VkICogMTAwMDAwMCkgLyBMQVRDSDsKK30KKworLyoKKyAqIElSUSBoYW5kbGVyIGZvciB0aGUgdGltZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhdDkxc2FtOTI2eF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXZvbGF0aWxlIGxvbmcgbnJfdGlja3M7CisKKwlpZiAoYXQ5MV9zeXNfcmVhZChBVDkxX1BJVF9TUikgJiBBVDkxX1BJVF9QSVRTKSB7CS8qIFRoaXMgaXMgYSBzaGFyZWQgaW50ZXJydXB0ICovCisJCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJCS8qIEdldCBudW1iZXIgdG8gdGlja3MgcGVyZm9ybWVkIGJlZm9yZSBpbnRlcnJ1cHQgYW5kIGNsZWFyIFBJVCBpbnRlcnJ1cHQgKi8KKwkJbnJfdGlja3MgPSBQSVRfUElDTlQoYXQ5MV9zeXNfcmVhZChBVDkxX1BJVF9QSVZSKSk7CisJCWRvIHsKKwkJCXRpbWVyX3RpY2soKTsKKwkJCW5yX3RpY2tzLS07CisJCX0gd2hpbGUgKG5yX3RpY2tzKTsKKworCQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlCisJCXJldHVybiBJUlFfTk9ORTsJCS8qIG5vdCBoYW5kbGVkICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGF0OTFzYW05MjZ4X3RpbWVyX2lycSA9IHsKKwkubmFtZQkJPSAiYXQ5MV90aWNrIiwKKwkuZmxhZ3MJCT0gSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiwKKwkuaGFuZGxlcgk9IGF0OTFzYW05MjZ4X3RpbWVyX2ludGVycnVwdAorfTsKKwordm9pZCBhdDkxc2FtOTI2eF90aW1lcl9yZXNldCh2b2lkKQoreworCS8qIERpc2FibGUgdGltZXIgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1BJVF9NUiwgMCk7CisKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJKHZvaWQpIGF0OTFfc3lzX3JlYWQoQVQ5MV9QSVRfUElWUik7CisKKwkvKiBTZXQgUGVyaW9kIEludGVydmFsIHRpbWVyIGFuZCBlbmFibGUgaXRzIGludGVycnVwdCAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElUX01SLCAoTEFUQ0ggJiBBVDkxX1BJVF9QSVYpIHwgQVQ5MV9QSVRfUElUSUVOIHwgQVQ5MV9QSVRfUElURU4pOworfQorCisvKgorICogU2V0IHVwIHRpbWVyIGludGVycnVwdC4KKyAqLwordm9pZCBfX2luaXQgYXQ5MXNhbTkyNnhfdGltZXJfaW5pdCh2b2lkKQoreworCS8qIEluaXRpYWxpemUgYW5kIGVuYWJsZSB0aGUgdGltZXIgKi8KKwlhdDkxc2FtOTI2eF90aW1lcl9yZXNldCgpOworCisJLyogTWFrZSBJUlFzIGhhcHBlbiBmb3IgdGhlIHN5c3RlbSB0aW1lci4gKi8KKwlzZXR1cF9pcnEoQVQ5MV9JRF9TWVMsICZhdDkxc2FtOTI2eF90aW1lcl9pcnEpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZCBhdDkxc2FtOTI2eF90aW1lcl9zdXNwZW5kKHZvaWQpCit7CisJLyogRGlzYWJsZSB0aW1lciAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUElUX01SLCAwKTsKK30KKyNlbHNlCisjZGVmaW5lIGF0OTFzYW05MjZ4X3RpbWVyX3N1c3BlbmQJTlVMTAorI2VuZGlmCisKK3N0cnVjdCBzeXNfdGltZXIgYXQ5MXNhbTkyNnhfdGltZXIgPSB7CisJLmluaXQJCT0gYXQ5MXNhbTkyNnhfdGltZXJfaW5pdCwKKwkub2Zmc2V0CQk9IGF0OTFzYW05MjZ4X2dldHRpbWVvZmZzZXQsCisJLnN1c3BlbmQJPSBhdDkxc2FtOTI2eF90aW1lcl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXQ5MXNhbTkyNnhfdGltZXJfcmVzZXQsCit9OworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtY2FybWV2YS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWNhcm1ldmEuYwppbmRleCA5ODIwODc0Li42NTRmMDM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtY2FybWV2YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jYXJtZXZhLmMKQEAgLTY1LDcgKzY1LDYgQEAKIAlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKIH0KIAotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBjYXJtZXZhX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKIAkuaXNfcm1paQk9IDEsCkBAIC04OSw4ICs4OCwzMyBAQAogLy8gfTsKIAogc3RhdGljIHN0cnVjdCBhdDkxX21tY19kYXRhIF9faW5pdGRhdGEgY2FybWV2YV9tbWNfZGF0YSA9IHsKLQkuaXNfYgkJPSAwLAorCS5zbG90X2IJCT0gMCwKIAkud2lyZTQJCT0gMSwKKwkuZGV0X3Bpbgk9IEFUOTFfUElOX1BCMTAsCisJLndwX3BpbgkJPSBBVDkxX1BJTl9QQzE0LAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBjYXJtZXZhX3NwaV9kZXZpY2VzW10gPSB7CisJeyAvKiBEYXRhRmxhc2ggY2hpcCAqLworCQkubW9kYWxpYXMgPSAibXRkX2RhdGFmbGFzaCIsCisJCS5jaGlwX3NlbGVjdCAgPSAwLAorCQkubWF4X3NwZWVkX2h6ID0gMTAgKiAxMDAwICogMTAwMCwKKwl9LAorCXsgLyogVXNlciBhY2Nlc3NhYmxlIHNwaSAtIGNzMSAoMjUwS0h6KSAqLworCQkubW9kYWxpYXMgPSAic3BpLWNzMSIsCisJCS5jaGlwX3NlbGVjdCAgPSAxLAorCQkubWF4X3NwZWVkX2h6ID0gMjUwICogIDEwMDAsCisJfSwKKwl7IC8qIFVzZXIgYWNjZXNzYWJsZSBzcGkgLSBjczIgKDFNSHopICovCisJCS5tb2RhbGlhcyA9ICJzcGktY3MyIiwKKwkJLmNoaXBfc2VsZWN0ICA9IDIsCisJCS5tYXhfc3BlZWRfaHogPSAxICogMTAwMCAqICAxMDAwLAorCX0sCisJeyAvKiBVc2VyIGFjY2Vzc2FibGUgc3BpIC0gY3MzICgxME1IeikgKi8KKwkJLm1vZGFsaWFzID0gInNwaS1jczMiLAorCQkuY2hpcF9zZWxlY3QgID0gMywKKwkJLm1heF9zcGVlZF9oeiA9IDEwICogMTAwMCAqICAxMDAwLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY2FybWV2YV9ib2FyZF9pbml0KHZvaWQpCkBAIC0xMDUsMTAgKzEyOSwxMCBAQAogCWF0OTFfYWRkX2RldmljZV91ZGMoJmNhcm1ldmFfdWRjX2RhdGEpOwogCS8qIEkyQyAqLwogCWF0OTFfYWRkX2RldmljZV9pMmMoKTsKKwkvKiBTUEkgKi8KKwlhdDkxX2FkZF9kZXZpY2Vfc3BpKGNhcm1ldmFfc3BpX2RldmljZXMsIEFSUkFZX1NJWkUoY2FybWV2YV9zcGlfZGV2aWNlcykpOwogCS8qIENvbXBhY3QgRmxhc2ggKi8KIC8vCWF0OTFfYWRkX2RldmljZV9jZigmY2FybWV2YV9jZl9kYXRhKTsKLQkvKiBTUEkgKi8KLS8vCWF0OTFfYWRkX2RldmljZV9zcGkoTlVMTCwgMCk7CiAJLyogTU1DICovCiAJYXQ5MV9hZGRfZGV2aWNlX21tYygmY2FybWV2YV9tbWNfZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtY3NiMzM3LmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtY3NiMzM3LmMKaW5kZXggOGVlYWU0OS4uYjhiYjgwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWNzYjMzNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1jc2IzMzcuYwpAQCAtOTksNyArOTksNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgX19pbml0ZGF0YSBjc2IzMzdfbW1jX2RhdGEgPSB7CiAJLmRldF9waW4JPSBBVDkxX1BJTl9QRDUsCi0JLmlzX2IJCT0gMCwKKwkuc2xvdF9iCQk9IDAsCiAJLndpcmU0CQk9IDEsCiAJLndwX3BpbgkJPSBBVDkxX1BJTl9QRDYsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWRrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZGsuYwppbmRleCBjNjk5ZjM5Li43NTIyYmY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZGsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZGsuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC0zOSw2ICs0MCw3IEBACiAKICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxcm05MjAwX21jLmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKQEAgLTkzLDcgKzk1LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSBfX2luaXRkYXRhIGRrX21tY19kYXRhID0gewotCS5pc19iCQk9IDAsCisJLnNsb3RfYgkJPSAwLAogCS53aXJlNAkJPSAxLAogfTsKIApAQCAtMTQ1LDYgKzE0NywzMCBAQAogCS5wYXJ0aXRpb25faW5mbwk9IG5hbmRfcGFydGl0aW9ucywKIH07CiAKKyNkZWZpbmUgREtfRkxBU0hfQkFTRQlBVDkxX0NISVBTRUxFQ1RfMAorI2RlZmluZSBES19GTEFTSF9TSVpFCTB4MjAwMDAwCisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGRrX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGtfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IERLX0ZMQVNIX0JBU0UsCisJLmVuZAkJPSBES19GTEFTSF9CQVNFICsgREtfRkxBU0hfU0laRSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZGtfZmxhc2ggPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJmRrX2ZsYXNoX2RhdGEsCisJCQl9LAorCS5yZXNvdXJjZQk9ICZka19mbGFzaF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCit9OworCisKIHN0YXRpYyB2b2lkIF9faW5pdCBka19ib2FyZF9pbml0KHZvaWQpCiB7CiAJLyogU2VyaWFsICovCkBAIC0xNzIsNiArMTk4LDggQEAKICNlbmRpZgogCS8qIE5BTkQgKi8KIAlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZGtfbmFuZF9kYXRhKTsKKwkvKiBOT1IgRmxhc2ggKi8KKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmRrX2ZsYXNoKTsKIAkvKiBWR0EgKi8KIC8vCWRrX2FkZF9kZXZpY2VfdmlkZW8oKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lYjkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lYjkyMDAuYwppbmRleCA2NWU4NjdiLi44MGI3MmNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZWI5MjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWViOTIwMC5jCkBAIC04Nyw3ICs4Nyw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgX19pbml0ZGF0YSBlYjkyMDBfbW1jX2RhdGEgPSB7Ci0JLmlzX2IJCT0gMCwKKwkuc2xvdF9iCQk9IDAsCiAJLndpcmU0CQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lay5jCmluZGV4IDgzMGViNzkuLmM0ZmRiNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lay5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTM5LDYgKzQwLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFybTkyMDBfbWMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIApAQCAtODcsNyArODksNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgX19pbml0ZGF0YSBla19tbWNfZGF0YSA9IHsKIAkuZGV0X3Bpbgk9IEFUOTFfUElOX1BCMjcsCi0JLmlzX2IJCT0gMCwKKwkuc2xvdF9iCQk9IDAsCiAJLndpcmU0CQk9IDEsCiAJLndwX3BpbgkJPSBBVDkxX1BJTl9QQTE3LAogfTsKQEAgLTEwNyw2ICsxMDksMzAgQEAKICNlbmRpZgogfTsKIAorI2RlZmluZSBFS19GTEFTSF9CQVNFCUFUOTFfQ0hJUFNFTEVDVF8wCisjZGVmaW5lIEVLX0ZMQVNIX1NJWkUJMHgyMDAwMDAKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZWtfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBla19mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gRUtfRkxBU0hfQkFTRSwKKwkuZW5kCQk9IEVLX0ZMQVNIX0JBU0UgKyBFS19GTEFTSF9TSVpFIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBla19mbGFzaCA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJPSAmZWtfZmxhc2hfZGF0YSwKKwkJCX0sCisJLnJlc291cmNlCT0gJmVrX2ZsYXNoX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gMSwKK307CisKKwogc3RhdGljIHZvaWQgX19pbml0IGVrX2JvYXJkX2luaXQodm9pZCkKIHsKIAkvKiBTZXJpYWwgKi8KQEAgLTEzMCw2ICsxNTYsOCBAQAogCWF0OTFfc2V0X2dwaW9fb3V0cHV0KEFUOTFfUElOX1BCMjIsIDEpOwkvKiB0aGlzIE1NQyBjYXJkIHNsb3QgY2FuIG9wdGlvbmFsbHkgdXNlIFNQSSBzaWduYWxpbmcgKENTMykuICovCiAJYXQ5MV9hZGRfZGV2aWNlX21tYygmZWtfbW1jX2RhdGEpOwogI2VuZGlmCisJLyogTk9SIEZsYXNoICovCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZla19mbGFzaCk7CiAJLyogVkdBICovCiAvLwlla19hZGRfZGV2aWNlX3ZpZGVvKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQta2I5MjAyLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQta2I5MjAyLmMKaW5kZXggMzVhOTU0YS4uNzU5ZDgxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLWtiOTIwMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1rYjkyMDIuYwpAQCAtODQsNyArODQsNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgX19pbml0ZGF0YSBrYjkyMDJfbW1jX2RhdGEgPSB7CiAJLmRldF9waW4JPSBBVDkxX1BJTl9QQjIsCi0JLmlzX2IJCT0gMCwKKwkuc2xvdF9iCQk9IDAsCiAJLndpcmU0CQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtc2FtOTI2MGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtc2FtOTI2MGVrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1ZDU4YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1zYW05MjYwZWsuYwpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ib2FyZC1lay5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEF0bWVsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MXNhbTkyNnhfbWMuaD4KKworI2luY2x1ZGUgImdlbmVyaWMuaCIKKworCisvKgorICogU2VyaWFsIHBvcnQgY29uZmlndXJhdGlvbi4KKyAqICAgIDAgLi4gNSA9IFVTQVJUMCAuLiBVU0FSVDUKKyAqICAgIDYgICAgICA9IERCR1UKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3VhcnRfY29uZmlnIF9faW5pdGRhdGEgZWtfdWFydF9jb25maWcgPSB7CisJLmNvbnNvbGVfdHR5CT0gMCwJCQkJLyogdHR5UzAgKi8KKwkubnJfdHR5CQk9IDMsCisJLnR0eV9tYXAJPSB7IDYsIDAsIDEsIC0xLCAtMSwgLTEsIC0xIH0JLyogdHR5UzAsIC4uLiwgdHR5UzYgKi8KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19tYXBfaW8odm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCisJYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisKKwkvKiBTZXR1cCB0aGUgc2VyaWFsIHBvcnRzIGFuZCBjb25zb2xlICovCisJYXQ5MV9pbml0X3NlcmlhbCgmZWtfdWFydF9jb25maWcpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKK3sKKwlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Cit9CisKKworLyoKKyAqIFVTQiBIb3N0IHBvcnQKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIGVrX3VzYmhfZGF0YSA9IHsKKwkucG9ydHMJCT0gMiwKK307CisKKy8qCisgKiBVU0IgRGV2aWNlIHBvcnQKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIF9faW5pdGRhdGEgZWtfdWRjX2RhdGEgPSB7CisJLnZidXNfcGluCT0gQVQ5MV9QSU5fUEM1LAorCS5wdWxsdXBfcGluCT0gMCwJCS8qIHB1bGwtdXAgZHJpdmVuIGJ5IFVEQyAqLworfTsKKworCisvKgorICogU1BJIGRldmljZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gZWtfc3BpX2RldmljZXNbXSA9IHsKKyNpZiAhZGVmaW5lZChDT05GSUdfTU1DX0FUOTEpCisJewkvKiBEYXRhRmxhc2ggY2hpcCAqLworCQkubW9kYWxpYXMJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5jaGlwX3NlbGVjdAk9IDEsCisJCS5tYXhfc3BlZWRfaHoJPSAxNSAqIDEwMDAgKiAxMDAwLAorCQkuYnVzX251bQk9IDAsCisJfSwKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfQVQ5MV9EQVRBRkxBU0hfQ0FSRCkKKwl7CS8qIERhdGFGbGFzaCBjYXJkICovCisJCS5tb2RhbGlhcwk9ICJtdGRfZGF0YWZsYXNoIiwKKwkJLmNoaXBfc2VsZWN0CT0gMCwKKwkJLm1heF9zcGVlZF9oegk9IDE1ICogMTAwMCAqIDEwMDAsCisJCS5idXNfbnVtCT0gMCwKKwl9LAorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfQVQ3M0MyMTMpCisJewkvKiBBVDczQzIxMyBEQUMgKi8KKwkJLm1vZGFsaWFzCT0gInNuZF9hdDczYzIxMyIsCisJCS5jaGlwX3NlbGVjdAk9IDAsCisJCS5tYXhfc3BlZWRfaHoJPSAxMCAqIDEwMDAgKiAxMDAwLAorCQkuYnVzX251bQk9IDEsCisJfSwKKyNlbmRpZgorfTsKKworCisvKgorICogTUFDQiBFdGhlcm5ldCBkZXZpY2UKKyAqLworc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIGV0aF9wbGF0Zm9ybV9kYXRhIGVrX21hY2JfZGF0YSA9IHsKKwkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQTcsCisJLmlzX3JtaWkJPSAxLAorfTsKKworCisvKgorICogTkFORCBmbGFzaAorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gX19pbml0ZGF0YSBla19uYW5kX3BhcnRpdGlvbltdID0geworCXsKKwkJLm5hbWUJPSAiUGFydGl0aW9uIDEiLAorCQkub2Zmc2V0CT0gMCwKKwkJLnNpemUJPSAyNTYgKiAxMDI0LAorCX0sCisJeworCQkubmFtZQk9ICJQYXJ0aXRpb24gMiIsCisJCS5vZmZzZXQJPSAyNTYgKiAxMDI0LAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbmFuZF9wYXJ0aXRpb25zKGludCBzaXplLCBpbnQgKm51bV9wYXJ0aXRpb25zKQoreworCSpudW1fcGFydGl0aW9ucyA9IEFSUkFZX1NJWkUoZWtfbmFuZF9wYXJ0aXRpb24pOworCXJldHVybiBla19uYW5kX3BhcnRpdGlvbjsKK30KKworc3RhdGljIHN0cnVjdCBhdDkxX25hbmRfZGF0YSBfX2luaXRkYXRhIGVrX25hbmRfZGF0YSA9IHsKKwkuYWxlCQk9IDIxLAorCS5jbGUJCT0gMjIsCisvLwkuZGV0X3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCisJLnJkeV9waW4JPSBBVDkxX1BJTl9QQzEzLAorCS5lbmFibGVfcGluCT0gQVQ5MV9QSU5fUEMxNCwKKwkucGFydGl0aW9uX2luZm8JPSBuYW5kX3BhcnRpdGlvbnMsCisjaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQVQ5MV9CVVNXSURUSF8xNikKKwkuYnVzX3dpZHRoXzE2CT0gMSwKKyNlbHNlCisJLmJ1c193aWR0aF8xNgk9IDAsCisjZW5kaWYKK307CisKKworLyoKKyAqIE1DSSAoU0QvTU1DKQorICovCitzdGF0aWMgc3RydWN0IGF0OTFfbW1jX2RhdGEgX19pbml0ZGF0YSBla19tbWNfZGF0YSA9IHsKKwkuc2xvdF9iCQk9IDEsCisJLndpcmU0CQk9IDEsCisvLwkuZGV0X3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCisvLwkud3BfcGluCQk9IC4uLiBub3QgY29ubmVjdGVkCisvLwkudmNjX3Bpbgk9IC4uLiBub3QgY29ubmVjdGVkCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYm9hcmRfaW5pdCh2b2lkKQoreworCS8qIFNlcmlhbCAqLworCWF0OTFfYWRkX2RldmljZV9zZXJpYWwoKTsKKwkvKiBVU0IgSG9zdCAqLworCWF0OTFfYWRkX2RldmljZV91c2JoKCZla191c2JoX2RhdGEpOworCS8qIFVTQiBEZXZpY2UgKi8KKwlhdDkxX2FkZF9kZXZpY2VfdWRjKCZla191ZGNfZGF0YSk7CisJLyogU1BJICovCisJYXQ5MV9hZGRfZGV2aWNlX3NwaShla19zcGlfZGV2aWNlcywgQVJSQVlfU0laRShla19zcGlfZGV2aWNlcykpOworCS8qIE5BTkQgKi8KKwlhdDkxX2FkZF9kZXZpY2VfbmFuZCgmZWtfbmFuZF9kYXRhKTsKKwkvKiBFdGhlcm5ldCAqLworCWF0OTFfYWRkX2RldmljZV9ldGgoJmVrX21hY2JfZGF0YSk7CisJLyogTU1DICovCisJYXQ5MV9hZGRfZGV2aWNlX21tYygmZWtfbW1jX2RhdGEpOworfQorCitNQUNISU5FX1NUQVJUKEFUOTFTQU05MjYwRUssICJBdG1lbCBBVDkxU0FNOTI2MC1FSyIpCisJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KKwkucGh5c19pbwk9IEFUOTFfQkFTRV9TWVMsCisJLmlvX3BnX29mZnN0CT0gKEFUOTFfVkFfQkFTRV9TWVMgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IEFUOTFfU0RSQU1fQkFTRSArIDB4MTAwLAorCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCisJLm1hcF9pbwkJPSBla19tYXBfaW8sCisJLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLXNhbTkyNjFlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2JvYXJkLXNhbTkyNjFlay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjQ5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtc2FtOTI2MWVrLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvYm9hcmQtZWsuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgU0FOIFBlb3BsZQorICogIENvcHlyaWdodCAoQykgMjAwNiBBdG1lbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZG05MDAwLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFzYW05MjZ4X21jLmg+CisKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKKworLyoKKyAqIFNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24uCisgKiAgICAwIC4uIDIgPSBVU0FSVDAgLi4gVVNBUlQyCisgKiAgICAzICAgICAgPSBEQkdVCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV91YXJ0X2NvbmZpZyBfX2luaXRkYXRhIGVrX3VhcnRfY29uZmlnID0geworCS5jb25zb2xlX3R0eQk9IDAsCQkJCS8qIHR0eVMwICovCisJLm5yX3R0eQkJPSAxLAorCS50dHlfbWFwCT0geyAzLCAtMSwgLTEsIC0xIH0JCS8qIHR0eVMwLCAuLi4sIHR0eVMzICovCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfbWFwX2lvKHZvaWQpCit7CisJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLworCWF0OTFzYW05MjYxX2luaXRpYWxpemUoMTg0MzIwMDApOworCisJLyogU2V0dXAgdGhlIHNlcmlhbCBwb3J0cyBhbmQgY29uc29sZSAqLworCWF0OTFfaW5pdF9zZXJpYWwoJmVrX3VhcnRfY29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCit7CisJYXQ5MXNhbTkyNjFfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOworfQorCisKKy8qCisgKiBETTkwMDAgZXRoZXJuZXQgZGV2aWNlCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19ETTkwMDApCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF0OTFzYW05MjYxX2RtOTAwMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MV9DSElQU0VMRUNUXzIsCisJCS5lbmQJPSBBVDkxX0NISVBTRUxFQ1RfMiArIDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IEFUOTFfQ0hJUFNFTEVDVF8yICsgMHg0NCwKKwkJLmVuZAk9IEFUOTFfQ0hJUFNFTEVDVF8yICsgMHhGRiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gQVQ5MV9QSU5fUEMxMSwKKwkJLmVuZAk9IEFUOTFfUElOX1BDMTEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBkbTkwMDBfcGxhdF9kYXRhIGRtOTAwMF9wbGF0ZGF0YSA9IHsKKwkuZmxhZ3MJCT0gRE05MDAwX1BMQVRGXzE2QklUT05MWSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFzYW05MjYxX2RtOTAwMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImRtOTAwMCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF0OTFzYW05MjYxX2RtOTAwMF9yZXNvdXJjZSksCisJLnJlc291cmNlCT0gYXQ5MXNhbTkyNjFfZG05MDAwX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZkbTkwMDBfcGxhdGRhdGEsCisJfQorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGVrX2FkZF9kZXZpY2VfZG05MDAwKHZvaWQpCit7CisJLyoKKwkgKiBDb25maWd1cmUgQ2hpcC1TZWxlY3QgMiBvbiBTTUMgZm9yIHRoZSBETTkwMDAuCisJICogTm90ZTogVGhlc2UgdGltaW5ncyB3ZXJlIGNhbGN1bGF0ZWQgZm9yIE1BU1RFUl9DTE9DSyA9IDEwMDAwMDAwMAorCSAqICBhY2NvcmRpbmcgdG8gdGhlIERNOTAwMCB0aW1pbmdzLgorCSAqLworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1NFVFVQKDIpLCBBVDkxX1NNQ19OV0VTRVRVUF8oMikgfCBBVDkxX1NNQ19OQ1NfV1JTRVRVUF8oMCkgfCBBVDkxX1NNQ19OUkRTRVRVUF8oMikgfCBBVDkxX1NNQ19OQ1NfUkRTRVRVUF8oMCkpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX1BVTFNFKDIpLCBBVDkxX1NNQ19OV0VQVUxTRV8oNCkgfCBBVDkxX1NNQ19OQ1NfV1JQVUxTRV8oOCkgfCBBVDkxX1NNQ19OUkRQVUxTRV8oNCkgfCBBVDkxX1NNQ19OQ1NfUkRQVUxTRV8oOCkpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX0NZQ0xFKDIpLCBBVDkxX1NNQ19OV0VDWUNMRV8oMTYpIHwgQVQ5MV9TTUNfTlJEQ1lDTEVfKDE2KSk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfTU9ERSgyKSwgQVQ5MV9TTUNfUkVBRE1PREUgfCBBVDkxX1NNQ19XUklURU1PREUgfCBBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFIHwgQVQ5MV9TTUNfQkFUX1dSSVRFIHwgQVQ5MV9TTUNfREJXXzE2IHwgQVQ5MV9TTUNfVERGXygxKSk7CisKKwkvKiBDb25maWd1cmUgUmVzZXQgc2lnbmFsIGFzIG91dHB1dCAqLworCWF0OTFfc2V0X2dwaW9fb3V0cHV0KEFUOTFfUElOX1BDMTAsIDApOworCisJLyogQ29uZmlndXJlIEludGVycnVwdCBwaW4gYXMgaW5wdXQsIG5vIHB1bGwtdXAgKi8KKwlhdDkxX3NldF9ncGlvX2lucHV0KEFUOTFfUElOX1BDMTEsIDApOworCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxc2FtOTI2MV9kbTkwMDBfZGV2aWNlKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgZWtfYWRkX2RldmljZV9kbTkwMDAodm9pZCkge30KKyNlbmRpZiAvKiBDT05GSUdfRE05MDAwICovCisKKworLyoKKyAqIFVTQiBIb3N0IFBvcnQKKyAqLworc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIGVrX3VzYmhfZGF0YSA9IHsKKwkucG9ydHMJCT0gMiwKK307CisKKworLyoKKyAqIFVTQiBEZXZpY2UgUG9ydAorICovCitzdGF0aWMgc3RydWN0IGF0OTFfdWRjX2RhdGEgX19pbml0ZGF0YSBla191ZGNfZGF0YSA9IHsKKwkudmJ1c19waW4JPSBBVDkxX1BJTl9QQjI5LAorCS5wdWxsdXBfcGluCT0gMCwJCS8qIHB1bGwtdXAgZHJpdmVuIGJ5IFVEQyAqLworfTsKKworCisvKgorICogTUNJIChTRC9NTUMpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSBfX2luaXRkYXRhIGVrX21tY19kYXRhID0geworCS53aXJlNAkJPSAxLAorLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAorLy8JLndwX3BpbgkJPSAuLi4gbm90IGNvbm5lY3RlZAorLy8JLnZjY19waW4JPSAuLi4gbm90IGNvbm5lY3RlZAorfTsKKworCisvKgorICogTkFORCBmbGFzaAorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gX19pbml0ZGF0YSBla19uYW5kX3BhcnRpdGlvbltdID0geworCXsKKwkJLm5hbWUJPSAiUGFydGl0aW9uIDEiLAorCQkub2Zmc2V0CT0gMCwKKwkJLnNpemUJPSAyNTYgKiAxMDI0LAorCX0sCisJeworCQkubmFtZQk9ICJQYXJ0aXRpb24gMiIsCisJCS5vZmZzZXQJPSAyNTYgKiAxMDI0ICwKKwkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKm5hbmRfcGFydGl0aW9ucyhpbnQgc2l6ZSwgaW50ICpudW1fcGFydGl0aW9ucykKK3sKKwkqbnVtX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKGVrX25hbmRfcGFydGl0aW9uKTsKKwlyZXR1cm4gZWtfbmFuZF9wYXJ0aXRpb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXQ5MV9uYW5kX2RhdGEgX19pbml0ZGF0YSBla19uYW5kX2RhdGEgPSB7CisJLmFsZQkJPSAyMiwKKwkuY2xlCQk9IDIxLAorLy8JLmRldF9waW4JPSAuLi4gbm90IGNvbm5lY3RlZAorCS5yZHlfcGluCT0gQVQ5MV9QSU5fUEMxNSwKKwkuZW5hYmxlX3Bpbgk9IEFUOTFfUElOX1BDMTQsCisJLnBhcnRpdGlvbl9pbmZvCT0gbmFuZF9wYXJ0aXRpb25zLAorI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0FUOTFfQlVTV0lEVEhfMTYpCisJLmJ1c193aWR0aF8xNgk9IDEsCisjZWxzZQorCS5idXNfd2lkdGhfMTYJPSAwLAorI2VuZGlmCit9OworCisvKgorICogU1BJIGRldmljZXMKKyAqLworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBla19zcGlfZGV2aWNlc1tdID0geworCXsJLyogRGF0YUZsYXNoIGNoaXAgKi8KKwkJLm1vZGFsaWFzCT0gIm10ZF9kYXRhZmxhc2giLAorCQkuY2hpcF9zZWxlY3QJPSAwLAorCQkubWF4X3NwZWVkX2h6CT0gMTUgKiAxMDAwICogMTAwMCwKKwkJLmJ1c19udW0JPSAwLAorCX0sCisjaWYgZGVmaW5lZChDT05GSUdfTVREX0FUOTFfREFUQUZMQVNIX0NBUkQpCisJewkvKiBEYXRhRmxhc2ggY2FyZCAtIGp1bXBlciAoSjEyKSBjb25maWd1cmFibGUgdG8gQ1MzIG9yIENTMCAqLworCQkubW9kYWxpYXMJPSAibXRkX2RhdGFmbGFzaCIsCisJCS5jaGlwX3NlbGVjdAk9IDMsCisJCS5tYXhfc3BlZWRfaHoJPSAxNSAqIDEwMDAgKiAxMDAwLAorCQkuYnVzX251bQk9IDAsCisJfSwKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NORF9BVDczQzIxMykKKwl7CS8qIEFUNzNDMjEzIERBQyAqLworCQkubW9kYWxpYXMJPSAic25kX2F0NzNjMjEzIiwKKwkJLmNoaXBfc2VsZWN0CT0gMywKKwkJLm1heF9zcGVlZF9oegk9IDEwICogMTAwMCAqIDEwMDAsCisJCS5idXNfbnVtCT0gMCwKKwl9LAorI2VuZGlmCit9OworCisKK3N0YXRpYyB2b2lkIF9faW5pdCBla19ib2FyZF9pbml0KHZvaWQpCit7CisJLyogU2VyaWFsICovCisJYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCgpOworCS8qIFVTQiBIb3N0ICovCisJYXQ5MV9hZGRfZGV2aWNlX3VzYmgoJmVrX3VzYmhfZGF0YSk7CisJLyogVVNCIERldmljZSAqLworCWF0OTFfYWRkX2RldmljZV91ZGMoJmVrX3VkY19kYXRhKTsKKwkvKiBJMkMgKi8KKwlhdDkxX2FkZF9kZXZpY2VfaTJjKCk7CisJLyogTkFORCAqLworCWF0OTFfYWRkX2RldmljZV9uYW5kKCZla19uYW5kX2RhdGEpOworCS8qIERNOTAwMCBldGhlcm5ldCAqLworCWVrX2FkZF9kZXZpY2VfZG05MDAwKCk7CisKKwkvKiBzcGkwIGFuZCBtbWMvc2Qgc2hhcmUgdGhlIHNhbWUgUElPIHBpbnMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQVRNRUwpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9BVE1FTF9NT0RVTEUpCisJLyogU1BJICovCisJYXQ5MV9hZGRfZGV2aWNlX3NwaShla19zcGlfZGV2aWNlcywgQVJSQVlfU0laRShla19zcGlfZGV2aWNlcykpOworI2Vsc2UKKwkvKiBNTUMgKi8KKwlhdDkxX2FkZF9kZXZpY2VfbW1jKCZla19tbWNfZGF0YSk7CisjZW5kaWYKK30KKworTUFDSElORV9TVEFSVChBVDkxU0FNOTI2MUVLLCAiQXRtZWwgQVQ5MVNBTTkyNjEtRUsiKQorCS8qIE1haW50YWluZXI6IEF0bWVsICovCisJLnBoeXNfaW8JPSBBVDkxX0JBU0VfU1lTLAorCS5pb19wZ19vZmZzdAk9IChBVDkxX1ZBX0JBU0VfU1lTID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBBVDkxX1NEUkFNX0JBU0UgKyAweDEwMCwKKwkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAorCS5tYXBfaW8JCT0gZWtfbWFwX2lvLAorCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2Nsb2NrLmMKaW5kZXggYTQzYjA2MS4uNGRlZTIxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2Nsb2NrLmMKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9wbWMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KIAogI2luY2x1ZGUgImNsb2NrLmgiCiAKQEAgLTQxLDYgKzQzLDcgQEAKICNkZWZpbmUgY2xrX2lzX3ByaW1hcnkoeCkJKCh4KS0+dHlwZSAmIENMS19UWVBFX1BSSU1BUlkpCiAjZGVmaW5lIGNsa19pc19wcm9ncmFtbWFibGUoeCkJKCh4KS0+dHlwZSAmIENMS19UWVBFX1BST0dSQU1NQUJMRSkKICNkZWZpbmUgY2xrX2lzX3BlcmlwaGVyYWwoeCkJKCh4KS0+dHlwZSAmIENMS19UWVBFX1BFUklQSEVSQUwpCisjZGVmaW5lIGNsa19pc19zeXMoeCkJCSgoeCktPnR5cGUgJiBDTEtfVFlQRV9TWVNURU0pCiAKIAogc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwpAQCAtMTE0LDEzICsxMTcsMTEgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHVkcGNrID0gewogCS5uYW1lCQk9ICJ1ZHBjayIsCiAJLnBhcmVudAkJPSAmcGxsYiwKLQkucG1jX21hc2sJPSBBVDkxX1BNQ19VRFAsCiAJLm1vZGUJCT0gcG1jX3N5c19tb2RlLAogfTsKIHN0YXRpYyBzdHJ1Y3QgY2xrIHVocGNrID0gewogCS5uYW1lCQk9ICJ1aHBjayIsCiAJLnBhcmVudAkJPSAmcGxsYiwKLQkucG1jX21hc2sJPSBBVDkxX1BNQ19VSFAsCiAJLm1vZGUJCT0gcG1jX3N5c19tb2RlLAogfTsKIApAQCAtNDM0LDYgKzQzNSwxMiBAQAogCQljbGstPm1vZGUgPSBwbWNfcGVyaXBoX21vZGU7CiAJCWxpc3RfYWRkX3RhaWwoJmNsay0+bm9kZSwgJmNsb2Nrcyk7CiAJfQorCWVsc2UgaWYgKGNsa19pc19zeXMoY2xrKSkgeworCQljbGstPnBhcmVudCA9ICZtY2s7CisJCWNsay0+bW9kZSA9IHBtY19zeXNfbW9kZTsKKworCQlsaXN0X2FkZF90YWlsKCZjbGstPm5vZGUsICZjbG9ja3MpOworCX0KICNpZmRlZiBDT05GSUdfQVQ5MV9QUk9HUkFNTUFCTEVfQ0xPQ0tTCiAJZWxzZSBpZiAoY2xrX2lzX3Byb2dyYW1tYWJsZShjbGspKSB7CiAJCWNsay0+bW9kZSA9IHBtY19zeXNfbW9kZTsKQEAgLTU4Niw5ICs1OTMsMjEgQEAKIAkgKi8KIAlhdDkxX3BsbGJfdXNiX2luaXQgPSBhdDkxX3BsbF9jYWxjKG1haW5fY2xvY2ssIDQ4MDAwMDAwICogMikgfCBBVDkxX1BNQ19VU0I5Nk07CiAJcGxsYi5yYXRlX2h6ID0gYXQ5MV9wbGxfcmF0ZSgmcGxsYiwgbWFpbl9jbG9jaywgYXQ5MV9wbGxiX3VzYl9pbml0KTsKLQlhdDkxX3N5c193cml0ZShBVDkxX1BNQ19TQ0RSLCBBVDkxX1BNQ19VSFAgfCBBVDkxX1BNQ19VRFApOworCWlmIChjcHVfaXNfYXQ5MXJtOTIwMCgpKSB7CisJCXVocGNrLnBtY19tYXNrID0gQVQ5MVJNOTIwMF9QTUNfVUhQOworCQl1ZHBjay5wbWNfbWFzayA9IEFUOTFSTTkyMDBfUE1DX1VEUDsKKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfU0NEUiwgQVQ5MVJNOTIwMF9QTUNfVUhQIHwgQVQ5MVJNOTIwMF9QTUNfVURQKTsKKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfU0NFUiwgQVQ5MVJNOTIwMF9QTUNfTUNLVURQKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOTI2MCgpKSB7CisJCXVocGNrLnBtY19tYXNrID0gQVQ5MVNBTTkyNnhfUE1DX1VIUDsKKwkJdWRwY2sucG1jX21hc2sgPSBBVDkxU0FNOTI2eF9QTUNfVURQOworCQlhdDkxX3N5c193cml0ZShBVDkxX1BNQ19TQ0RSLCBBVDkxU0FNOTI2eF9QTUNfVUhQIHwgQVQ5MVNBTTkyNnhfUE1DX1VEUCk7CisJfSBlbHNlIGlmIChjcHVfaXNfYXQ5MXNhbTkyNjEoKSkgeworCQl1aHBjay5wbWNfbWFzayA9IChBVDkxU0FNOTI2eF9QTUNfVUhQIHwgQVQ5MV9QTUNfSENLMCk7CisJCXVkcGNrLnBtY19tYXNrID0gQVQ5MVNBTTkyNnhfUE1DX1VEUDsKKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfU0NEUiwgQVQ5MVNBTTkyNnhfUE1DX1VIUCB8IEFUOTFfUE1DX0hDSzAgfCBBVDkxU0FNOTI2eF9QTUNfVURQKTsKKwl9CiAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9DS0dSX1BMTEJSLCAwKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX1BNQ19TQ0VSLCBBVDkxX1BNQ19NQ0tVRFApOwogCiAJdWRwY2sucmF0ZV9oeiA9IGF0OTFfdXNiX3JhdGUoJnBsbGIsIHBsbGIucmF0ZV9oeiwgYXQ5MV9wbGxiX3VzYl9pbml0KTsKIAl1aHBjay5yYXRlX2h6ID0gYXQ5MV91c2JfcmF0ZSgmcGxsYiwgcGxsYi5yYXRlX2h6LCBhdDkxX3BsbGJfdXNiX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2Nsb2NrLmggYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvY2xvY2suaAppbmRleCAwNTkyZTY2Li5iNWM3YTJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvY2xvY2suaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvY2xvY2suaApAQCAtMTAsNiArMTAsNyBAQAogI2RlZmluZSBDTEtfVFlQRV9QTEwJCTB4MgogI2RlZmluZSBDTEtfVFlQRV9QUk9HUkFNTUFCTEUJMHg0CiAjZGVmaW5lIENMS19UWVBFX1BFUklQSEVSQUwJMHg4CisjZGVmaW5lIENMS19UWVBFX1NZU1RFTQkJMHgxMAogCiAKIHN0cnVjdCBjbGsgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9kZXZpY2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OTgyNDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2RldmljZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDgxMyArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2RldmljZXMuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgVGhpYmF1dCBWQVJFTkUgPHZhcmVuZXRAcGFyaXNjLWxpbnV4Lm9yZz4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgQnJvd25lbGwKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+Ci0KLSNpbmNsdWRlICJnZW5lcmljLmgiCi0KLSNkZWZpbmUgU1pfNTEyCTB4MDAwMDAyMDAKLSNkZWZpbmUgU1pfMjU2CTB4MDAwMDAxMDAKLSNkZWZpbmUgU1pfMTYJMHgwMDAwMDAxMAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIFVTQiBIb3N0Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQotc3RhdGljIHU2NCBvaGNpX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci1zdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIHVzYmhfZGF0YTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdDkxX3VzYmhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBBVDkxUk05MjAwX1VIUF9CQVNFLAotCQkuZW5kCT0gQVQ5MVJNOTIwMF9VSFBfQkFTRSArIFNaXzFNIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IEFUOTFSTTkyMDBfSURfVUhQLAotCQkuZW5kCT0gQVQ5MVJNOTIwMF9JRF9VSFAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3VzYmhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJhdDkxX29oY2kiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJCQkuZG1hX21hc2sJCT0gJm9oY2lfZG1hbWFzaywKLQkJCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAotCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZ1c2JoX2RhdGEsCi0JfSwKLQkucmVzb3VyY2UJPSBhdDkxX3VzYmhfcmVzb3VyY2VzLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdDkxX3VzYmhfcmVzb3VyY2VzKSwKLX07Ci0KLXZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91c2JoKHN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqZGF0YSkKLXsKLQlpZiAoIWRhdGEpCi0JCXJldHVybjsKLQotCXVzYmhfZGF0YSA9ICpkYXRhOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXJtOTIwMF91c2JoX2RldmljZSk7Ci19Ci0jZWxzZQotdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3VzYmgoc3RydWN0IGF0OTFfdXNiaF9kYXRhICpkYXRhKSB7fQotI2VuZGlmCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICBVU0IgRGV2aWNlIChHYWRnZXQpCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQVQ5MQotc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIHVkY19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF0OTFfdWRjX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9CQVNFX1VEUCwKLQkJLmVuZAk9IEFUOTFSTTkyMDBfQkFTRV9VRFAgKyBTWl8xNksgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9JRF9VRFAsCi0JCS5lbmQJPSBBVDkxUk05MjAwX0lEX1VEUCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfdWRjX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXQ5MV91ZGMiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJCQkucGxhdGZvcm1fZGF0YQkJPSAmdWRjX2RhdGEsCi0JfSwKLQkucmVzb3VyY2UJPSBhdDkxX3VkY19yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF0OTFfdWRjX3Jlc291cmNlcyksCi19OwotCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfdWRjKHN0cnVjdCBhdDkxX3VkY19kYXRhICpkYXRhKQotewotCWlmICghZGF0YSkKLQkJcmV0dXJuOwotCi0JaWYgKGRhdGEtPnZidXNfcGluKSB7Ci0JCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+dmJ1c19waW4sIDApOwotCQlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT52YnVzX3BpbiwgMSk7Ci0JfQotCWlmIChkYXRhLT5wdWxsdXBfcGluKQotCQlhdDkxX3NldF9ncGlvX291dHB1dChkYXRhLT5wdWxsdXBfcGluLCAwKTsKLQotCXVkY19kYXRhID0gKmRhdGE7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxcm05MjAwX3VkY19kZXZpY2UpOwotfQotI2Vsc2UKLXZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV91ZGMoc3RydWN0IGF0OTFfdWRjX2RhdGEgKmRhdGEpIHt9Ci0jZW5kaWYKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIEV0aGVybmV0Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNX0FUOTFfRVRIRVIpIHx8IGRlZmluZWQoQ09ORklHX0FSTV9BVDkxX0VUSEVSX01PRFVMRSkKLXN0YXRpYyB1NjQgZXRoX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci1zdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgZXRoX2RhdGE7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXQ5MV9ldGhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBBVDkxX1ZBX0JBU0VfRU1BQywKLQkJLmVuZAk9IEFUOTFfVkFfQkFTRV9FTUFDICsgU1pfMTZLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IEFUOTFSTTkyMDBfSURfRU1BQywKLQkJLmVuZAk9IEFUOTFSTTkyMDBfSURfRU1BQywKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfZXRoX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXQ5MV9ldGhlciIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkJCS5kbWFfbWFzawkJPSAmZXRoX2RtYW1hc2ssCi0JCQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKLQkJCQkucGxhdGZvcm1fZGF0YQkJPSAmZXRoX2RhdGEsCi0JfSwKLQkucmVzb3VyY2UJPSBhdDkxX2V0aF9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF0OTFfZXRoX3Jlc291cmNlcyksCi19OwotCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfZXRoKHN0cnVjdCBhdDkxX2V0aF9kYXRhICpkYXRhKQotewotCWlmICghZGF0YSkKLQkJcmV0dXJuOwotCi0JaWYgKGRhdGEtPnBoeV9pcnFfcGluKSB7Ci0JCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+cGh5X2lycV9waW4sIDApOwotCQlhdDkxX3NldF9kZWdsaXRjaChkYXRhLT5waHlfaXJxX3BpbiwgMSk7Ci0JfQotCi0JLyogUGlucyB1c2VkIGZvciBNSUkgYW5kIFJNSUkgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTE2LCAwKTsJLyogRU1ESU8gKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTE1LCAwKTsJLyogRU1EQyAqLwotCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTQsIDApOwkvKiBFUlhFUiAqLwotCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMTMsIDApOwkvKiBFUlgxICovCi0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExMiwgMCk7CS8qIEVSWDAgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTExLCAwKTsJLyogRUNSU19FQ1JTRFYgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTEwLCAwKTsJLyogRVRYMSAqLwotCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBOSwgMCk7CS8qIEVUWDAgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTgsIDApOwkvKiBFVFhFTiAqLwotCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBNywgMCk7CS8qIEVUWENLX0VSRUZDSyAqLwotCi0JaWYgKCFkYXRhLT5pc19ybWlpKSB7Ci0JCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMTksIDApOwkvKiBFUlhDSyAqLwotCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjE4LCAwKTsJLyogRUNPTCAqLwotCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjE3LCAwKTsJLyogRVJYRFYgKi8KLQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxNiwgMCk7CS8qIEVSWDMgKi8KLQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxNSwgMCk7CS8qIEVSWDIgKi8KLQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEIxNCwgMCk7CS8qIEVUWEVSICovCi0JCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMTMsIDApOwkvKiBFVFgzICovCi0JCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCMTIsIDApOwkvKiBFVFgyICovCi0JfQotCi0JZXRoX2RhdGEgPSAqZGF0YTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfZXRoX2RldmljZSk7Ci19Ci0jZWxzZQotdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2V0aChzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSAqZGF0YSkge30KLSNlbmRpZgotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgQ29tcGFjdCBGbGFzaCAvIFBDTUNJQQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0FUOTFfQ0YpIHx8IGRlZmluZWQoQ09ORklHX0FUOTFfQ0ZfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBhdDkxX2NmX2RhdGEgY2ZfZGF0YTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdDkxX2NmX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MV9DRl9CQVNFLAotCQkvKiB0aWVzIHVwIENTNCwgQ1M1IGFuZCBDUzYgKi8KLQkJLmVuZAk9IEFUOTFfQ0ZfQkFTRSArICgweDMwMDAwMDAwIC0gMSksCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9NRU1fOEFORDE2QklULAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX2NmX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXQ5MV9jZiIsCi0JLmlkCQk9IC0xLAotCS5kZXYJCT0gewotCQkJCS5wbGF0Zm9ybV9kYXRhCQk9ICZjZl9kYXRhLAotCX0sCi0JLnJlc291cmNlCT0gYXQ5MV9jZl9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF0OTFfY2ZfcmVzb3VyY2VzKSwKLX07Ci0KLXZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9jZihzdHJ1Y3QgYXQ5MV9jZl9kYXRhICpkYXRhKQotewotCWlmICghZGF0YSkKLQkJcmV0dXJuOwotCi0JLyogaW5wdXQvaXJxICovCi0JaWYgKGRhdGEtPmlycV9waW4pIHsKLQkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5pcnFfcGluLCAxKTsKLQkJYXQ5MV9zZXRfZGVnbGl0Y2goZGF0YS0+aXJxX3BpbiwgMSk7Ci0JfQotCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+ZGV0X3BpbiwgMSk7Ci0JYXQ5MV9zZXRfZGVnbGl0Y2goZGF0YS0+ZGV0X3BpbiwgMSk7Ci0KLQkvKiBvdXRwdXRzLCBpbml0aWFsbHkgb2ZmICovCi0JaWYgKGRhdGEtPnZjY19waW4pCi0JCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPnZjY19waW4sIDApOwotCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPnJzdF9waW4sIDApOwotCi0JLyogZm9yY2UgcG93ZXJvbiBkZWZhdWx0cyBmb3IgdGhlc2UgcGlucyAuLi4gKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzksIDApOwkvKiBBMjUvQ0ZSTlcgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzEwLCAwKTsJLyogTkNTNC9DRkNTICovCi0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxMSwgMCk7CS8qIE5DUzUvQ0ZDRTEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzEyLCAwKTsJLyogTkNTNi9DRkNFMiAqLwotCi0JY2ZfZGF0YSA9ICpkYXRhOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXJtOTIwMF9jZl9kZXZpY2UpOwotfQotI2Vsc2UKLXZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9jZihzdHJ1Y3QgYXQ5MV9jZl9kYXRhICpkYXRhKSB7fQotI2VuZGlmCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICBNTUMgLyBTRAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX01NQ19BVDkxUk05MjAwKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfQVQ5MVJNOTIwMF9NT0RVTEUpCi1zdGF0aWMgdTY0IG1tY19kbWFtYXNrID0gMHhmZmZmZmZmZlVMOwotc3RhdGljIHN0cnVjdCBhdDkxX21tY19kYXRhIG1tY19kYXRhOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF0OTFfbW1jX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9CQVNFX01DSSwKLQkJLmVuZAk9IEFUOTFSTTkyMDBfQkFTRV9NQ0kgKyBTWl8xNksgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9JRF9NQ0ksCi0JCS5lbmQJPSBBVDkxUk05MjAwX0lEX01DSSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfbW1jX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXQ5MV9tY2kiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJCQkuZG1hX21hc2sJCT0gJm1tY19kbWFtYXNrLAotCQkJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCi0JCQkJLnBsYXRmb3JtX2RhdGEJCT0gJm1tY19kYXRhLAotCX0sCi0JLnJlc291cmNlCT0gYXQ5MV9tbWNfcmVzb3VyY2VzLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdDkxX21tY19yZXNvdXJjZXMpLAotfTsKLQotdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX21tYyhzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSAqZGF0YSkKLXsKLQlpZiAoIWRhdGEpCi0JCXJldHVybjsKLQotCS8qIGlucHV0L2lycSAqLwotCWlmIChkYXRhLT5kZXRfcGluKSB7Ci0JCWF0OTFfc2V0X2dwaW9faW5wdXQoZGF0YS0+ZGV0X3BpbiwgMSk7Ci0JCWF0OTFfc2V0X2RlZ2xpdGNoKGRhdGEtPmRldF9waW4sIDEpOwotCX0KLQlpZiAoZGF0YS0+d3BfcGluKQotCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPndwX3BpbiwgMSk7Ci0KLQkvKiBDTEsgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI3LCAwKTsKLQotCWlmIChkYXRhLT5pc19iKSB7Ci0JCS8qIENNRCAqLwotCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTgsIDApOwotCi0JCS8qIERBVDAsIG1heWJlIERBVDEuLkRBVDMgKi8KLQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEE5LCAwKTsKLQkJaWYgKGRhdGEtPndpcmU0KSB7Ci0JCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTEwLCAwKTsKLQkJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBMTEsIDApOwotCQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEExMiwgMCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBDTUQgKi8KLQkJYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEyOCwgMCk7Ci0KLQkJLyogREFUMCwgbWF5YmUgREFUMS4uREFUMyAqLwotCQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI5LCAwKTsKLQkJaWYgKGRhdGEtPndpcmU0KSB7Ci0JCQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQjMsIDApOwotCQkJYXQ5MV9zZXRfQl9wZXJpcGgoQVQ5MV9QSU5fUEI0LCAwKTsKLQkJCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BCNSwgMCk7Ci0JCX0KLQl9Ci0KLQltbWNfZGF0YSA9ICpkYXRhOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXJtOTIwMF9tbWNfZGV2aWNlKTsKLX0KLSNlbHNlCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbW1jKHN0cnVjdCBhdDkxX21tY19kYXRhICpkYXRhKSB7fQotI2VuZGlmCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICBOQU5EIC8gU21hcnRNZWRpYQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0FUOTEpIHx8IGRlZmluZWQoQ09ORklHX01URF9OQU5EX0FUOTFfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBhdDkxX25hbmRfZGF0YSBuYW5kX2RhdGE7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXQ5MV9uYW5kX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gQVQ5MV9TTUFSVE1FRElBX0JBU0UsCi0JCS5lbmQJPSBBVDkxX1NNQVJUTUVESUFfQkFTRSArIFNaXzhNIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MV9uYW5kX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXQ5MV9uYW5kIiwKLQkuaWQJCT0gLTEsCi0JLmRldgkJPSB7Ci0JCQkJLnBsYXRmb3JtX2RhdGEJPSAmbmFuZF9kYXRhLAotCX0sCi0JLnJlc291cmNlCT0gYXQ5MV9uYW5kX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXQ5MV9uYW5kX3Jlc291cmNlcyksCi19OwotCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbmFuZChzdHJ1Y3QgYXQ5MV9uYW5kX2RhdGEgKmRhdGEpCi17Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm47Ci0KLQkvKiBlbmFibGUgcGluICovCi0JaWYgKGRhdGEtPmVuYWJsZV9waW4pCi0JCWF0OTFfc2V0X2dwaW9fb3V0cHV0KGRhdGEtPmVuYWJsZV9waW4sIDEpOwotCi0JLyogcmVhZHkvYnVzeSBwaW4gKi8KLQlpZiAoZGF0YS0+cmR5X3BpbikKLQkJYXQ5MV9zZXRfZ3Bpb19pbnB1dChkYXRhLT5yZHlfcGluLCAxKTsKLQotCS8qIGNhcmQgZGV0ZWN0IHBpbiAqLwotCWlmIChkYXRhLT5kZXRfcGluKQotCQlhdDkxX3NldF9ncGlvX2lucHV0KGRhdGEtPmRldF9waW4sIDEpOwotCi0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxLCAwKTsJCS8qIFNNT0UgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQzMsIDApOwkJLyogU01XRSAqLwotCi0JbmFuZF9kYXRhID0gKmRhdGE7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxX25hbmRfZGV2aWNlKTsKLX0KLSNlbHNlCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfbmFuZChzdHJ1Y3QgYXQ5MV9uYW5kX2RhdGEgKmRhdGEpIHt9Ci0jZW5kaWYKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIFRXSSAoaTJjKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0kyQ19BVDkxKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQVQ5MV9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3R3aV9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImF0OTFfaTJjIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSAwLAotfTsKLQotdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2kyYyh2b2lkKQotewotCS8qIHBpbnMgdXNlZCBmb3IgVFdJIGludGVyZmFjZSAqLwotCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMjUsIDApOwkJLyogVFdEICovCi0JYXQ5MV9zZXRfbXVsdGlfZHJpdmUoQVQ5MV9QSU5fUEEyNSwgMSk7Ci0KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTI2LCAwKTsJCS8qIFRXQ0sgKi8KLQlhdDkxX3NldF9tdWx0aV9kcml2ZShBVDkxX1BJTl9QQTI2LCAxKTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXQ5MXJtOTIwMF90d2lfZGV2aWNlKTsKLX0KLSNlbHNlCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2VfaTJjKHZvaWQpIHt9Ci0jZW5kaWYKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIFNQSQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9BVDkxKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQVQ5MV9NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX0FUOTFfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxX1NQSV9NT0RVTEUpCi1zdGF0aWMgdTY0IHNwaV9kbWFtYXNrID0gMHhmZmZmZmZmZlVMOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF0OTFfc3BpX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9CQVNFX1NQSSwKLQkJLmVuZAk9IEFUOTFSTTkyMDBfQkFTRV9TUEkgKyBTWl8xNksgLSAxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gQVQ5MVJNOTIwMF9JRF9TUEksCi0JCS5lbmQJPSBBVDkxUk05MjAwX0lEX1NQSSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfc3BpX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXQ5MV9zcGkiLAotCS5pZAkJPSAwLAotCS5kZXYJCT0gewotCQkuZG1hX21hc2sJCT0gJnNwaV9kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAotCX0sCi0JLnJlc291cmNlCT0gYXQ5MV9zcGlfcmVzb3VyY2VzLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShhdDkxX3NwaV9yZXNvdXJjZXMpLAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGF0OTFfc3BpX3N0YW5kYXJkX2NzWzRdID0geyBBVDkxX1BJTl9QQTMsIEFUOTFfUElOX1BBNCwgQVQ5MV9QSU5fUEE1LCBBVDkxX1BJTl9QQTYgfTsKLQotdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3NwaShzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmRldmljZXMsIGludCBucl9kZXZpY2VzKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgY3NfcGluOwotCi0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEwLCAwKTsJLyogTUlTTyAqLwotCWF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BBMSwgMCk7CS8qIE1PU0kgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIsIDApOwkvKiBTUENLICovCi0KLQkvKiBFbmFibGUgU1BJIGNoaXAtc2VsZWN0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBucl9kZXZpY2VzOyBpKyspIHsKLQkJaWYgKGRldmljZXNbaV0uY29udHJvbGxlcl9kYXRhKQotCQkJY3NfcGluID0gKHVuc2lnbmVkIGxvbmcpIGRldmljZXNbaV0uY29udHJvbGxlcl9kYXRhOwotCQllbHNlCi0JCQljc19waW4gPSBhdDkxX3NwaV9zdGFuZGFyZF9jc1tkZXZpY2VzW2ldLmNoaXBfc2VsZWN0XTsKLQotI2lmZGVmIENPTkZJR19TUElfQVQ5MV9NQU5VQUxfQ1MKLQkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoY3NfcGluLCAxKTsKLSNlbHNlCi0JCWF0OTFfc2V0X0FfcGVyaXBoKGNzX3BpbiwgMCk7Ci0jZW5kaWYKLQotCQkvKiBwYXNzIGNoaXAtc2VsZWN0IHBpbiB0byBkcml2ZXIgKi8KLQkJZGV2aWNlc1tpXS5jb250cm9sbGVyX2RhdGEgPSAodm9pZCAqKSBjc19waW47Ci0JfQotCi0Jc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oZGV2aWNlcywgbnJfZGV2aWNlcyk7Ci0JYXQ5MV9jbG9ja19hc3NvY2lhdGUoInNwaTBfY2xrIiwgJmF0OTFybTkyMDBfc3BpX2RldmljZS5kZXYsICJzcGkiKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfc3BpX2RldmljZSk7Ci19Ci0jZWxzZQotdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3NwaShzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmRldmljZXMsIGludCBucl9kZXZpY2VzKSB7fQotI2VuZGlmCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICBSVEMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0FUOTEpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQVQ5MV9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3J0Y19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImF0OTFfcnRjIiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSAwLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9ydGModm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmF0OTFybTkyMDBfcnRjX2RldmljZSk7Ci19Ci0jZWxzZQotc3RhdGljIHZvaWQgX19pbml0IGF0OTFfYWRkX2RldmljZV9ydGModm9pZCkge30KLSNlbmRpZgotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgV2F0Y2hkb2cKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BVDkxX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19BVDkxX1dBVENIRE9HX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF0OTFybTkyMDBfd2R0X2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXQ5MV93ZHQiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IDAsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3dhdGNoZG9nKHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDkxcm05MjAwX3dkdF9kZXZpY2UpOwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfd2F0Y2hkb2codm9pZCkge30KLSNlbmRpZgotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgTEVEcwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0xFRFMpCi11OCBhdDkxX2xlZHNfY3B1OwotdTggYXQ5MV9sZWRzX3RpbWVyOwotCi12b2lkIF9faW5pdCBhdDkxX2luaXRfbGVkcyh1OCBjcHVfbGVkLCB1OCB0aW1lcl9sZWQpCi17Ci0JYXQ5MV9sZWRzX2NwdQk9IGNwdV9sZWQ7Ci0JYXQ5MV9sZWRzX3RpbWVyCT0gdGltZXJfbGVkOwotfQotI2Vsc2UKLXZvaWQgX19pbml0IGF0OTFfaW5pdF9sZWRzKHU4IGNwdV9sZWQsIHU4IHRpbWVyX2xlZCkge30KLSNlbmRpZgotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgVUFSVAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9BVE1FTCkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZGJndV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UsCi0JCS5lbmQJPSBBVDkxX1ZBX0JBU0VfU1lTICsgQVQ5MV9EQkdVICsgU1pfNTEyIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IEFUOTFfSURfU1lTLAotCQkuZW5kCT0gQVQ5MV9JRF9TWVMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSBkYmd1X2RhdGEgPSB7Ci0JLnVzZV9kbWFfdHgJPSAwLAotCS51c2VfZG1hX3J4CT0gMCwJCS8qIERCR1Ugbm90IGNhcGFibGUgb2YgcmVjZWl2ZSBETUEgKi8KLQkucmVncwkJPSAodm9pZCBfX2lvbWVtICopKEFUOTFfVkFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF9kYmd1X2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAotCS5pZAkJPSAwLAotCS5kZXYJCT0gewotCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJmRiZ3VfZGF0YSwKLQkJCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAotCX0sCi0JLnJlc291cmNlCT0gZGJndV9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGRiZ3VfcmVzb3VyY2VzKSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfZGJndV9waW5zKHZvaWQpCi17Ci0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEzMCwgMCk7CQkvKiBEUlhEICovCi0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEzMSwgMSk7CQkvKiBEVFhEICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDBfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBBVDkxUk05MjAwX0JBU0VfVVMwLAotCQkuZW5kCT0gQVQ5MVJNOTIwMF9CQVNFX1VTMCArIFNaXzE2SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBBVDkxUk05MjAwX0lEX1VTMCwKLQkJLmVuZAk9IEFUOTFSTTkyMDBfSURfVVMwLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgdWFydDBfZGF0YSA9IHsKLQkudXNlX2RtYV90eAk9IDEsCi0JLnVzZV9kbWFfcngJPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF91YXJ0MF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImF0bWVsX3VzYXJ0IiwKLQkuaWQJCT0gMSwKLQkuZGV2CQk9IHsKLQkJCQkucGxhdGZvcm1fZGF0YQk9ICZ1YXJ0MF9kYXRhLAotCQkJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCi0JfSwKLQkucmVzb3VyY2UJPSB1YXJ0MF9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVhcnQwX3Jlc291cmNlcyksCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgY29uZmlndXJlX3VzYXJ0MF9waW5zKHZvaWQpCi17Ci0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExNywgMSk7CQkvKiBUWEQwICovCi0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEExOCwgMCk7CQkvKiBSWEQwICovCi0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEEyMCwgMCk7CQkvKiBDVFMwICovCi0KLQkvKgotCSAqIEFUOTFSTTkyMDAgRXJyYXRhICMzOSAtIFJUUzAgaXMgbm90IGludGVybmFsbHkgY29ubmVjdGVkIHRvIFBBMjEuCi0JICogIFdlIG5lZWQgdG8gZHJpdmUgdGhlIHBpbiBtYW51YWxseS4gIERlZmF1bHQgaXMgb2ZmIChSVFMgaXMgYWN0aXZlIGxvdykuCi0JICovCi0JYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoQVQ5MV9QSU5fUEEyMSwgMSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDFfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBBVDkxUk05MjAwX0JBU0VfVVMxLAotCQkuZW5kCT0gQVQ5MVJNOTIwMF9CQVNFX1VTMSArIFNaXzE2SyAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBBVDkxUk05MjAwX0lEX1VTMSwKLQkJLmVuZAk9IEFUOTFSTTkyMDBfSURfVVMxLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgdWFydDFfZGF0YSA9IHsKLQkudXNlX2RtYV90eAk9IDEsCi0JLnVzZV9kbWFfcngJPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQ5MXJtOTIwMF91YXJ0MV9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gImF0bWVsX3VzYXJ0IiwKLQkuaWQJCT0gMiwKLQkuZGV2CQk9IHsKLQkJCQkucGxhdGZvcm1fZGF0YQk9ICZ1YXJ0MV9kYXRhLAotCQkJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmYsCi0JfSwKLQkucmVzb3VyY2UJPSB1YXJ0MV9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHVhcnQxX3Jlc291cmNlcyksCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgY29uZmlndXJlX3VzYXJ0MV9waW5zKHZvaWQpCi17Ci0JYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEIxOCwgMCk7CQkvKiBSSTEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjE5LCAwKTsJCS8qIERUUjEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjIwLCAxKTsJCS8qIFRYRDEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjIxLCAwKTsJCS8qIFJYRDEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjIzLCAwKTsJCS8qIERDRDEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI0LCAwKTsJCS8qIENUUzEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI1LCAwKTsJCS8qIERTUjEgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQjI2LCAwKTsJCS8qIFJUUzEgKi8KLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0Ml9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IEFUOTFSTTkyMDBfQkFTRV9VUzIsCi0JCS5lbmQJPSBBVDkxUk05MjAwX0JBU0VfVVMyICsgU1pfMTZLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IEFUOTFSTTkyMDBfSURfVVMyLAotCQkuZW5kCT0gQVQ5MVJNOTIwMF9JRF9VUzIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSB1YXJ0Ml9kYXRhID0gewotCS51c2VfZG1hX3R4CT0gMSwKLQkudXNlX2RtYV9yeAk9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3VhcnQyX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAotCS5pZAkJPSAzLAotCS5kZXYJCT0gewotCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnVhcnQyX2RhdGEsCi0JCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKLQl9LAotCS5yZXNvdXJjZQk9IHVhcnQyX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydDJfcmVzb3VyY2VzKSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQyX3BpbnModm9pZCkKLXsKLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIyLCAwKTsJCS8qIFJYRDIgKi8KLQlhdDkxX3NldF9BX3BlcmlwaChBVDkxX1BJTl9QQTIzLCAxKTsJCS8qIFRYRDIgKi8KLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0M19yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IEFUOTFSTTkyMDBfQkFTRV9VUzMsCi0JCS5lbmQJPSBBVDkxUk05MjAwX0JBU0VfVVMzICsgU1pfMTZLIC0gMSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IEFUOTFSTTkyMDBfSURfVVMzLAotCQkuZW5kCT0gQVQ5MVJNOTIwMF9JRF9VUzMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfZGF0YSB1YXJ0M19kYXRhID0gewotCS51c2VfZG1hX3R4CT0gMSwKLQkudXNlX2RtYV9yeAk9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDkxcm05MjAwX3VhcnQzX2RldmljZSA9IHsKLQkubmFtZQkJPSAiYXRtZWxfdXNhcnQiLAotCS5pZAkJPSA0LAotCS5kZXYJCT0gewotCQkJCS5wbGF0Zm9ybV9kYXRhCT0gJnVhcnQzX2RhdGEsCi0JCQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKLQl9LAotCS5yZXNvdXJjZQk9IHVhcnQzX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodWFydDNfcmVzb3VyY2VzKSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQzX3BpbnModm9pZCkKLXsKLQlhdDkxX3NldF9CX3BlcmlwaChBVDkxX1BJTl9QQTUsIDEpOwkJLyogVFhEMyAqLwotCWF0OTFfc2V0X0JfcGVyaXBoKEFUOTFfUElOX1BBNiwgMCk7CQkvKiBSWEQzICovCi19Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF0OTFfdWFydHNbQVRNRUxfTUFYX1VBUlRdOwkvKiB0aGUgVUFSVHMgdG8gdXNlICovCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlOwkvKiB0aGUgc2VyaWFsIGNvbnNvbGUgZGV2aWNlICovCi0KLXZvaWQgX19pbml0IGF0OTFfaW5pdF9zZXJpYWwoc3RydWN0IGF0OTFfdWFydF9jb25maWcgKmNvbmZpZykKLXsKLQlpbnQgaTsKLQotCS8qIEZpbGwgaW4gbGlzdCBvZiBzdXBwb3J0ZWQgVUFSVHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5ucl90dHk7IGkrKykgewotCQlzd2l0Y2ggKGNvbmZpZy0+dHR5X21hcFtpXSkgewotCQkJY2FzZSAwOgotCQkJCWNvbmZpZ3VyZV91c2FydDBfcGlucygpOwotCQkJCWF0OTFfdWFydHNbaV0gPSAmYXQ5MXJtOTIwMF91YXJ0MF9kZXZpY2U7Ci0JCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0MF9jbGsiLCAmYXQ5MXJtOTIwMF91YXJ0MF9kZXZpY2UuZGV2LCAidXNhcnQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQljb25maWd1cmVfdXNhcnQxX3BpbnMoKTsKLQkJCQlhdDkxX3VhcnRzW2ldID0gJmF0OTFybTkyMDBfdWFydDFfZGV2aWNlOwotCQkJCWF0OTFfY2xvY2tfYXNzb2NpYXRlKCJ1c2FydDFfY2xrIiwgJmF0OTFybTkyMDBfdWFydDFfZGV2aWNlLmRldiwgInVzYXJ0Iik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJY29uZmlndXJlX3VzYXJ0Ml9waW5zKCk7Ci0JCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxcm05MjAwX3VhcnQyX2RldmljZTsKLQkJCQlhdDkxX2Nsb2NrX2Fzc29jaWF0ZSgidXNhcnQyX2NsayIsICZhdDkxcm05MjAwX3VhcnQyX2RldmljZS5kZXYsICJ1c2FydCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCWNvbmZpZ3VyZV91c2FydDNfcGlucygpOwotCQkJCWF0OTFfdWFydHNbaV0gPSAmYXQ5MXJtOTIwMF91YXJ0M19kZXZpY2U7Ci0JCQkJYXQ5MV9jbG9ja19hc3NvY2lhdGUoInVzYXJ0M19jbGsiLCAmYXQ5MXJtOTIwMF91YXJ0M19kZXZpY2UuZGV2LCAidXNhcnQiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQljb25maWd1cmVfZGJndV9waW5zKCk7Ci0JCQkJYXQ5MV91YXJ0c1tpXSA9ICZhdDkxcm05MjAwX2RiZ3VfZGV2aWNlOwotCQkJCWF0OTFfY2xvY2tfYXNzb2NpYXRlKCJtY2siLCAmYXQ5MXJtOTIwMF9kYmd1X2RldmljZS5kZXYsICJ1c2FydCIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQljb250aW51ZTsKLQkJfQotCQlhdDkxX3VhcnRzW2ldLT5pZCA9IGk7CQkvKiB1cGRhdGUgSUQgbnVtYmVyIHRvIG1hcHBlZCBJRCAqLwotCX0KLQotCS8qIFNldCBzZXJpYWwgY29uc29sZSBkZXZpY2UgKi8KLQlpZiAoY29uZmlnLT5jb25zb2xlX3R0eSA8IEFUTUVMX01BWF9VQVJUKQotCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlID0gYXQ5MV91YXJ0c1tjb25maWctPmNvbnNvbGVfdHR5XTsKLQlpZiAoIWF0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UpCi0JCXByaW50ayhLRVJOX0lORk8gIkFUOTE6IE5vIGRlZmF1bHQgc2VyaWFsIGNvbnNvbGUgZGVmaW5lZC5cbiIpOwotfQotCi12b2lkIF9faW5pdCBhdDkxX2FkZF9kZXZpY2Vfc2VyaWFsKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVRNRUxfTUFYX1VBUlQ7IGkrKykgewotCQlpZiAoYXQ5MV91YXJ0c1tpXSkKLQkJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihhdDkxX3VhcnRzW2ldKTsKLQl9Ci19Ci0jZWxzZQotdm9pZCBfX2luaXQgYXQ5MV9pbml0X3NlcmlhbChzdHJ1Y3QgYXQ5MV91YXJ0X2NvbmZpZyAqY29uZmlnKSB7fQotdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX3NlcmlhbCh2b2lkKSB7fQotI2VuZGlmCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoKLSAqIFRoZXNlIGRldmljZXMgYXJlIGFsd2F5cyBwcmVzZW50IGFuZCBkb24ndCBuZWVkIGFueSBib2FyZC1zcGVjaWZpYwotICogc2V0dXAuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGF0OTFfYWRkX3N0YW5kYXJkX2RldmljZXModm9pZCkKLXsKLQlhdDkxX2FkZF9kZXZpY2VfcnRjKCk7Ci0JYXQ5MV9hZGRfZGV2aWNlX3dhdGNoZG9nKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWFyY2hfaW5pdGNhbGwoYXQ5MV9hZGRfc3RhbmRhcmRfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvZ2VuZXJpYy5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2dlbmVyaWMuaAppbmRleCA2OTRlNDExLi44YzRkNWE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvZ2VuZXJpYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9nZW5lcmljLmgKQEAgLTEwLDE0ICsxMCwxOSBAQAogCiAgLyogUHJvY2Vzc29ycyAqLwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFybTkyMDBfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2ssIHVuc2lnbmVkIHNob3J0IGJhbmtzKTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwogCiAgLyogSW50ZXJydXB0cyAqLwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOworZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYxX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9haWNfaW5pdCh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7CiAKICAvKiBUaW1lciAqLwogc3RydWN0IHN5c190aW1lcjsKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGF0OTFybTkyMDBfdGltZXI7CitleHRlcm4gc3RydWN0IHN5c190aW1lciBhdDkxc2FtOTI2eF90aW1lcjsKIAogIC8qIENsb2NrcyAqLwogZXh0ZXJuIGludCBfX2luaXQgYXQ5MV9jbG9ja19pbml0KHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7CkBAIC0zOSwzICs0NCw2IEBACiB9OwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfZ3Bpb19pbml0KHN0cnVjdCBhdDkxX2dwaW9fYmFuayAqLCBpbnQgbnJfYmFua3MpOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfZ3Bpb19pcnFfc2V0dXAodm9pZCk7CisKK2V4dGVybiB2b2lkICgqYXQ5MV9hcmNoX3Jlc2V0KSh2b2lkKTsKK2V4dGVybiBpbnQgYXQ5MV9leHRlcm5faXJxOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9ncGlvLmMKaW5kZXggNzQ2N2Q2NC4uM2YxODg1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvZ3Bpby5jCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxX3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfcG1jLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgpAQCAtMzMyLDEwICszMzQsMTAgQEAKIAkuc2V0X3dha2UJPSBncGlvX2lycV9zZXRfd2FrZSwKIH07CiAKLXN0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQJcGluOwotCXN0cnVjdCBpcnFkZXNjCSpncGlvOworCXN0cnVjdCBpcnFfZGVzYwkqZ3BpbzsKIAl2b2lkIF9faW9tZW0JKnBpbzsKIAl1MzIJCWlzcjsKIApAQCAtMzk2LDcgKzM5OCw3IEBACiAJCV9fcmF3X3dyaXRlbCh+MCwgY29udHJvbGxlciArIFBJT19JRFIpOwogCiAJCXNldF9pcnFfZGF0YShpZCwgKHZvaWQgKikgcGluKTsKLQkJc2V0X2lycV9jaGlwZGF0YShpZCwgY29udHJvbGxlcik7CisJCXNldF9pcnFfY2hpcF9kYXRhKGlkLCBjb250cm9sbGVyKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgcGluKyspIHsKIAkJCS8qCkBAIC00MDQsNyArNDA2LDcgQEAKIAkJCSAqIHNob3J0ZXIsIGFuZCB0aGUgQUlDIGhhbmRsZXMgaW50ZXJ1cHRzIHNhbmVseS4KIAkJCSAqLwogCQkJc2V0X2lycV9jaGlwKHBpbiwgJmdwaW9faXJxY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIocGluLCBkb19zaW1wbGVfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihwaW4sIGhhbmRsZV9zaW1wbGVfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MocGluLCBJUlFGX1ZBTElEKTsKIAkJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvaXJxLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvaXJxLmMKaW5kZXggM2U0ODgxMS4uMjE0OGRhYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MXJtOTIwMC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvaXJxLmMKQEAgLTQ3LDYgKzQ3LDEwIEBACiAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9BSUNfSUVDUiwgMSA8PCBpcnEpOwogfQogCit1bnNpZ25lZCBpbnQgYXQ5MV9leHRlcm5faXJxOworCisjZGVmaW5lIGlzX2V4dGVybl9pcnEoaXJxKSAoKDEgPDwgKGlycSkpICYgYXQ5MV9leHRlcm5faXJxKQorCiBzdGF0aWMgaW50IGF0OTFfYWljX3NldF90eXBlKHVuc2lnbmVkIGlycSwgdW5zaWduZWQgdHlwZSkKIHsKIAl1bnNpZ25lZCBpbnQgc21yLCBzcmN0eXBlOwpAQCAtNTksMTQgKzYzLDE2IEBACiAJCXNyY3R5cGUgPSBBVDkxX0FJQ19TUkNUWVBFX1JJU0lORzsKIAkJYnJlYWs7CiAJY2FzZSBJUlFUX0xPVzoKLQkJaWYgKChpcnEgPiBBVDkxX0lEX0ZJUSkgJiYgKGlycSA8IEFUOTFSTTkyMDBfSURfSVJRMCkpCS8qIG9ubHkgc3VwcG9ydGVkIG9uIGV4dGVybmFsIGludGVycnVwdHMgKi8KKwkJaWYgKChpcnEgPT0gQVQ5MV9JRF9GSVEpIHx8IGlzX2V4dGVybl9pcnEoaXJxKSkJCS8qIG9ubHkgc3VwcG9ydGVkIG9uIGV4dGVybmFsIGludGVycnVwdHMgKi8KKwkJCXNyY3R5cGUgPSBBVDkxX0FJQ19TUkNUWVBFX0xPVzsKKwkJZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXNyY3R5cGUgPSBBVDkxX0FJQ19TUkNUWVBFX0xPVzsKIAkJYnJlYWs7CiAJY2FzZSBJUlFUX0ZBTExJTkc6Ci0JCWlmICgoaXJxID4gQVQ5MV9JRF9GSVEpICYmIChpcnEgPCBBVDkxUk05MjAwX0lEX0lSUTApKQkvKiBvbmx5IHN1cHBvcnRlZCBvbiBleHRlcm5hbCBpbnRlcnJ1cHRzICovCisJCWlmICgoaXJxID09IEFUOTFfSURfRklRKSB8fCBpc19leHRlcm5faXJxKGlycSkpCQkvKiBvbmx5IHN1cHBvcnRlZCBvbiBleHRlcm5hbCBpbnRlcnJ1cHRzICovCisJCQlzcmN0eXBlID0gQVQ5MV9BSUNfU1JDVFlQRV9GQUxMSU5HOworCQllbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3JjdHlwZSA9IEFUOTFfQUlDX1NSQ1RZUEVfRkFMTElORzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzksNyArMTQ1LDcgQEAKIAkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9BSUNfU01SKGkpLCBBVDkxX0FJQ19TUkNUWVBFX0xPVyB8IHByaW9yaXR5W2ldKTsKIAogCQlzZXRfaXJxX2NoaXAoaSwgJmF0OTFfYWljX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAogCQkvKiBQZXJmb3JtIDggRW5kIE9mIEludGVycnVwdCBDb21tYW5kIHRvIG1ha2Ugc3VyZSBBSUMgd2lsbCBub3QgTG9jayBvdXQgbklSUSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxcm05MjAwL3BtLmMgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvcG0uYwppbmRleCAzMmM5NWQ4Li42N2FhNTU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTFybTkyMDAvcG0uYwpAQCAtMjYsNyArMjYsMTAgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9wbWMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxcm05MjAwX21jLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCkBAIC02OCw5ICs3MSwxNSBAQAogCXNjc3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfUE1DX1NDU1IpOwogCiAJLyogVVNCIG11c3Qgbm90IGJlIHVzaW5nIFBMTEIgKi8KLQlpZiAoKHNjc3IgJiAoQVQ5MV9QTUNfVUhQIHwgQVQ5MV9QTUNfVURQKSkgIT0gMCkgewotCQlwcl9kZWJ1ZygiQVQ5MTogUE0gLSBTdXNwZW5kLXRvLVJBTSB3aXRoIFVTQiBzdGlsbCBhY3RpdmVcbiIpOwotCQlyZXR1cm4gMDsKKwlpZiAoY3B1X2lzX2F0OTFybTkyMDAoKSkgeworCQlpZiAoKHNjc3IgJiAoQVQ5MVJNOTIwMF9QTUNfVUhQIHwgQVQ5MVJNOTIwMF9QTUNfVURQKSkgIT0gMCkgeworCQkJcHJfZGVidWcoIkFUOTE6IFBNIC0gU3VzcGVuZC10by1SQU0gd2l0aCBVU0Igc3RpbGwgYWN0aXZlXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmIChjcHVfaXNfYXQ5MXNhbTkyNjAoKSkgeworI3dhcm5pbmcgIkNoZWNrIFNBTTkyNjAgVVNCIGNsb2NrcyIKKwl9IGVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOTI2MSgpKSB7Cisjd2FybmluZyAiQ2hlY2sgU0FNOTI2MSBVU0IgY2xvY2tzIgogCX0KIAogI2lmZGVmIENPTkZJR19BVDkxX1BST0dSQU1NQUJMRV9DTE9DS1MKQEAgLTExMiw3ICsxMjEsNiBAQAogc3RhdGljIHZvaWQgKCpzbG93X2Nsb2NrKSh2b2lkKTsKIAogCi0KIHN0YXRpYyBpbnQgYXQ5MV9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCiB7CiAJYXQ5MV9ncGlvX3N1c3BlbmQoKTsKQEAgLTEyMywxMyArMTMxLDcgQEAKIAkJCShhdDkxX3N5c19yZWFkKEFUOTFfUE1DX1BDU1IpCiAJCQkJCXwgKDEgPDwgQVQ5MV9JRF9GSVEpCiAJCQkJCXwgKDEgPDwgQVQ5MV9JRF9TWVMpCi0JCQkJCXwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlEwKQotCQkJCQl8ICgxIDw8IEFUOTFSTTkyMDBfSURfSVJRMSkKLQkJCQkJfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTIpCi0JCQkJCXwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlEzKQotCQkJCQl8ICgxIDw8IEFUOTFSTTkyMDBfSURfSVJRNCkKLQkJCQkJfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTUpCi0JCQkJCXwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlE2KSkKKwkJCQkJfCAoYXQ5MV9leHRlcm5faXJxKSkKIAkJCQkmIGF0OTFfc3lzX3JlYWQoQVQ5MV9BSUNfSU1SKSwKIAkJCXN0YXRlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaXJxLmMKaW5kZXggN2VlOTI2ZS4uY2ExMDI5NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9pcnEuYwpAQCAtNjMsNyArNjMsNyBAQAogCWNscHNfd3JpdGVsKGludG1yMSwgSU5UTVIxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGludDFfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW50MV9jaGlwID0gewogCS5hY2sJPSBpbnQxX2FjaywKIAkubWFzawk9IGludDFfbWFzaywKIAkudW5tYXNrID0gaW50MV91bm1hc2ssCkBAIC0xMDAsNyArMTAwLDcgQEAKIAljbHBzX3dyaXRlbChpbnRtcjIsIElOVE1SMik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpbnQyX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGludDJfY2hpcCA9IHsKIAkuYWNrCT0gaW50Ml9hY2ssCiAJLm1hc2sJPSBpbnQyX21hc2ssCiAJLnVubWFzayA9IGludDJfdW5tYXNrLApAQCAtMTEyLDEyICsxMTIsMTIgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKIAkgICAgICAgIGlmIChJTlQxX0lSUVMgJiAoMSA8PCBpKSkgewotCSAgICAgICAgCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCSAgICAgICAgCXNldF9pcnFfaGFuZGxlcihpLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkgICAgICAgIAlzZXRfaXJxX2NoaXAoaSwgJmludDFfY2hpcCk7CiAJICAgICAgICAJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJCX0KIAkJaWYgKElOVDJfSVJRUyAmICgxIDw8IGkpKSB7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfY2hpcChpLCAmaW50Ml9jaGlwKTsKIAkJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCQl9CQkJCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jCmluZGV4IGZiMTBjZjIuLjIzMWI5MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJaW9tZF93cml0ZWIodmFsIHwgbWFzaywgSU9NRF9JUlFNQVNLQSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBjbHBzNzUwMF9hX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGNscHM3NTAwX2FfY2hpcCA9IHsKIAkuYWNrCT0gY2w3NTAwX2Fja19pcnFfYSwKIAkubWFzawk9IGNsNzUwMF9tYXNrX2lycV9hLAogCS51bm1hc2sJPSBjbDc1MDBfdW5tYXNrX2lycV9hLApAQCAtODEsNyArODEsNyBAQAogCWlvbWRfd3JpdGViKHZhbCB8IG1hc2ssIElPTURfSVJRTUFTS0IpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgY2xwczc1MDBfYl9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjbHBzNzUwMF9iX2NoaXAgPSB7CiAJLmFjawk9IGNsNzUwMF9tYXNrX2lycV9iLAogCS5tYXNrCT0gY2w3NTAwX21hc2tfaXJxX2IsCiAJLnVubWFzawk9IGNsNzUwMF91bm1hc2tfaXJxX2IsCkBAIC0xMDUsNyArMTA1LDcgQEAKIAlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0lSUU1BU0tDKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGNscHM3NTAwX2NfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY2xwczc1MDBfY19jaGlwID0gewogCS5hY2sJPSBjbDc1MDBfbWFza19pcnFfYywKIAkubWFzawk9IGNsNzUwMF9tYXNrX2lycV9jLAogCS51bm1hc2sJPSBjbDc1MDBfdW5tYXNrX2lycV9jLApAQCAtMTI5LDcgKzEyOSw3IEBACiAJaW9tZF93cml0ZWIodmFsIHwgbWFzaywgSU9NRF9JUlFNQVNLRCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBjbHBzNzUwMF9kX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGNscHM3NTAwX2RfY2hpcCA9IHsKIAkuYWNrCT0gY2w3NTAwX21hc2tfaXJxX2QsCiAJLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfZCwKIAkudW5tYXNrCT0gY2w3NTAwX3VubWFza19pcnFfZCwKQEAgLTE1Myw3ICsxNTMsNyBAQAogCWlvbWRfd3JpdGViKHZhbCB8IG1hc2ssIElPTURfRE1BTUFTSyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBjbHBzNzUwMF9kbWFfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY2xwczc1MDBfZG1hX2NoaXAgPSB7CiAJLmFjawk9IGNsNzUwMF9tYXNrX2lycV9kbWEsCiAJLm1hc2sJPSBjbDc1MDBfbWFza19pcnFfZG1hLAogCS51bm1hc2sJPSBjbDc1MDBfdW5tYXNrX2lycV9kbWEsCkBAIC0xNzcsNyArMTc3LDcgQEAKIAlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0ZJUU1BU0spOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgY2xwczc1MDBfZmlxX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGNscHM3NTAwX2ZpcV9jaGlwID0gewogCS5hY2sJPSBjbDc1MDBfbWFza19pcnFfZmlxLAogCS5tYXNrCT0gY2w3NTAwX21hc2tfaXJxX2ZpcSwKIAkudW5tYXNrCT0gY2w3NTAwX3VubWFza19pcnFfZmlxLApAQCAtMTg3LDcgKzE4Nyw3IEBACiB7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBjbHBzNzUwMF9ub19jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjbHBzNzUwMF9ub19jaGlwID0gewogCS5hY2sJPSBjbDc1MDBfbm9fYWN0aW9uLAogCS5tYXNrCT0gY2w3NTAwX25vX2FjdGlvbiwKIAkudW5tYXNrCT0gY2w3NTAwX25vX2FjdGlvbiwKQEAgLTIxNCw0MyArMjE0LDQzIEBACiAJCXN3aXRjaCAoaXJxKSB7CiAJCWNhc2UgMCAuLi4gNzoKIAkJCXNldF9pcnFfY2hpcChpcnEsICZjbHBzNzUwMF9hX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQkJc2V0X2lycV9mbGFncyhpcnEsIGZsYWdzKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgOCAuLi4gMTU6CiAJCQlzZXRfaXJxX2NoaXAoaXJxLCAmY2xwczc1MDBfYl9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CiAJCQlicmVhazsKIAogCQljYXNlIDE2IC4uLiAyMjoKIAkJCXNldF9pcnFfY2hpcChpcnEsICZjbHBzNzUwMF9kbWFfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCQlzZXRfaXJxX2ZsYWdzKGlycSwgZmxhZ3MpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAyNCAuLi4gMzE6CiAJCQlzZXRfaXJxX2NoaXAoaXJxLCAmY2xwczc1MDBfY19jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CiAJCQlicmVhazsKIAogCQljYXNlIDQwIC4uLiA0NzoKIAkJCXNldF9pcnFfY2hpcChpcnEsICZjbHBzNzUwMF9kX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQkJc2V0X2lycV9mbGFncyhpcnEsIGZsYWdzKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgNDggLi4uIDU1OgogCQkJc2V0X2lycV9jaGlwKGlycSwgJmNscHM3NTAwX25vX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQkJc2V0X2lycV9mbGFncyhpcnEsIGZsYWdzKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgNjQgLi4uIDcyOgogCQkJc2V0X2lycV9jaGlwKGlycSwgJmNscHM3NTAwX2ZpcV9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKaW5kZXggOTAxMDNhYi4uODQ1OTQzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCkBAIC00NSw3ICs0NSw3IEBACiAJX19yYXdfd3JpdGViKDEgPDwgaXJxLCBJUlFfTVNFVCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBlYnNhMTEwX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBlYnNhMTEwX2lycV9jaGlwID0gewogCS5hY2sJPSBlYnNhMTEwX21hc2tfaXJxLAogCS5tYXNrCT0gZWJzYTExMF9tYXNrX2lycSwKIAkudW5tYXNrID0gZWJzYTExMF91bm1hc2tfaXJxLApAQCAtNjcsNyArNjcsNyBAQAogCiAJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmZWJzYTExMF9pcnFfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZWJzYTExMC9pby5jIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2lvLmMKaW5kZXggYzY0OGJmYi4uZGIzOGFmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2lvLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpfX2lzYW1lbV9jb252ZXJ0X2FkZHIodm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIHZvaWQgX19pb21lbSAqX19pc2FtZW1fY29udmVydF9hZGRyKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAl1MzIgcmV0LCBhID0gKHUzMiBfX2ZvcmNlKSBhZGRyOwogCkBAIC02Myw3ICs2Myw3IEBACiAvKgogICogcmVhZFtid2xdIGFuZCB3cml0ZVtid2xdCiAgKi8KLXU4IF9fcmVhZGIodm9pZCBfX2lvbWVtICphZGRyKQordTggX19yZWFkYihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJdm9pZCBfX2lvbWVtICphID0gX19pc2FtZW1fY29udmVydF9hZGRyKGFkZHIpOwogCXUzMiByZXQ7CkBAIC03NSw3ICs3NSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdTE2IF9fcmVhZHcodm9pZCBfX2lvbWVtICphZGRyKQordTE2IF9fcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXZvaWQgX19pb21lbSAqYSA9IF9faXNhbWVtX2NvbnZlcnRfYWRkcihhZGRyKTsKIApAQCAtODUsNyArODUsNyBAQAogCXJldHVybiBfX3Jhd19yZWFkdyhhKTsKIH0KIAotdTMyIF9fcmVhZGwodm9pZCBfX2lvbWVtICphZGRyKQordTMyIF9fcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXZvaWQgX19pb21lbSAqYSA9IF9faXNhbWVtX2NvbnZlcnRfYWRkcihhZGRyKTsKIAl1MzIgcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L0tjb25maWcKaW5kZXggZTM0NmIwMy4uYWY3OTA0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9LY29uZmlnCkBAIC05LDEyICs5LDI0IEBACiAKIGNvbW1lbnQgIkVQOTN4eCBQbGF0Zm9ybXMiCiAKK2NvbmZpZyBNQUNIX0FEU1NQSEVSRQorCWJvb2wgIlN1cHBvcnQgQURTIFNwaGVyZSIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgQURTCisJICBTcGhlcmUgYm9hcmQuCisKIGNvbmZpZyBNQUNIX0VEQjkzMDIKIAlib29sICJTdXBwb3J0IENpcnJ1cyBMb2dpYyBFREI5MzAyIgogCWhlbHAKIAkgIFNheSAnWScgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIGtlcm5lbCB0byBzdXBwb3J0IHRoZSBDaXJydXMKIAkgIExvZ2ljIEVEQjkzMDIgRXZhbHVhdGlvbiBCb2FyZC4KIAorY29uZmlnIE1BQ0hfRURCOTMwMkEKKwlib29sICJTdXBwb3J0IENpcnJ1cyBMb2dpYyBFREI5MzAyQSIKKwloZWxwCisJICBTYXkgJ1knIGhlcmUgaWYgeW91IHdhbnQgeW91ciBrZXJuZWwgdG8gc3VwcG9ydCB0aGUgQ2lycnVzCisJICBMb2dpYyBFREI5MzAyQSBFdmFsdWF0aW9uIEJvYXJkLgorCiBjb25maWcgTUFDSF9FREI5MzEyCiAJYm9vbCAiU3VwcG9ydCBDaXJydXMgTG9naWMgRURCOTMxMiIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlCmluZGV4IGMyZWIxOGIuLmIwNjY0MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L01ha2VmaWxlCkBAIC02LDcgKzYsOSBAQAogb2JqLW4JCQk6PQogb2JqLQkJCTo9CiAKK29iai0kKENPTkZJR19NQUNIX0FEU1NQSEVSRSkJKz0gYWRzc3BoZXJlLm8KIG9iai0kKENPTkZJR19NQUNIX0VEQjkzMDIpCSs9IGVkYjkzMDIubworb2JqLSQoQ09ORklHX01BQ0hfRURCOTMwMkEpCSs9IGVkYjkzMDJhLm8KIG9iai0kKENPTkZJR19NQUNIX0VEQjkzMTIpCSs9IGVkYjkzMTIubwogb2JqLSQoQ09ORklHX01BQ0hfRURCOTMxNSkJKz0gZWRiOTMxNS5vCiBvYmotJChDT05GSUdfTUFDSF9FREI5MzE1QSkJKz0gZWRiOTMxNWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvYWRzc3BoZXJlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9hZHNzcGhlcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzVkNTgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvYWRzc3BoZXJlLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtZXA5M3h4L2Fkc3NwaGVyZS5jCisgKiBBRFMgU3BoZXJlIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgYWRzc3BoZXJlX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoCQk9IDQsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFkc3NwaGVyZV9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gMHg2MDAwMDAwMCwKKwkuZW5kCQk9IDB4NjFmZmZmZmYsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYWRzc3BoZXJlX2ZsYXNoID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmYWRzc3BoZXJlX2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJmFkc3NwaGVyZV9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXA5M3h4X2V0aF9kYXRhIGFkc3NwaGVyZV9ldGhfZGF0YSA9IHsKKwkucGh5X2lkCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFkc3NwaGVyZV9ldGhfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydAk9IEVQOTNYWF9FVEhFUk5FVF9QSFlTX0JBU0UsCisJCS5lbmQJPSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFICsgMHhmZmZmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydAk9IElSUV9FUDkzWFhfRVRIRVJORVQsCisJCS5lbmQJPSBJUlFfRVA5M1hYX0VUSEVSTkVULAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBhZHNzcGhlcmVfZXRoX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZXA5M3h4LWV0aCIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZhZHNzcGhlcmVfZXRoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDIsCisJLnJlc291cmNlCT0gYWRzc3BoZXJlX2V0aF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhZHNzcGhlcmVfaW5pdF9tYWNoaW5lKHZvaWQpCit7CisJZXA5M3h4X2luaXRfZGV2aWNlcygpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYWRzc3BoZXJlX2ZsYXNoKTsKKworCW1lbWNweShhZHNzcGhlcmVfZXRoX2RhdGEuZGV2X2FkZHIsCisJCSh2b2lkICopKEVQOTNYWF9FVEhFUk5FVF9CQVNFICsgMHg1MCksIDYpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYWRzc3BoZXJlX2V0aF9kZXZpY2UpOworfQorCitNQUNISU5FX1NUQVJUKEFEU1NQSEVSRSwgIkFEUyBTcGhlcmUgYm9hcmQiKQorCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAqLworCS5waHlzX2lvCT0gRVA5M1hYX0FQQl9QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChFUDkzWFhfQVBCX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAorCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKKwkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gYWRzc3BoZXJlX2luaXRfbWFjaGluZSwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKaW5kZXggZTNmZDFhYi4uZDY0OWIzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAgKiBFUDkzeHggSVJRIGhhbmRsaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIGVwOTN4eF9ncGlvX2FiX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsCi0JCXN0cnVjdCBpcnFkZXNjICpkZXNjKQorCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAJaW50IGk7CkBAIC0zMzUsNyArMzM1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGVwOTN4eF9ncGlvX2FiX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBlcDkzeHhfZ3Bpb19hYl9pcnFfY2hpcCA9IHsKIAkuYWNrCQk9IGVwOTN4eF9ncGlvX2FiX2lycV9tYXNrX2FjaywKIAkubWFzawkJPSBlcDkzeHhfZ3Bpb19hYl9pcnFfbWFzaywKIAkudW5tYXNrCQk9IGVwOTN4eF9ncGlvX2FiX2lycV91bm1hc2ssCkBAIC0zNTIsNyArMzUyLDcgQEAKIAogCWZvciAoaXJxID0gSVJRX0VQOTNYWF9HUElPKDApIDsgaXJxIDw9IElSUV9FUDkzWFhfR1BJTygxNSk7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZlcDkzeHhfZ3Bpb19hYl9pcnFfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CiAJfQogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9FUDkzWFhfR1BJT19BQiwgZXA5M3h4X2dwaW9fYWJfaXJxX2hhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZWRiOTMwMmEuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlMDY0YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDJhLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtZXA5M3h4L2VkYjkzMDJhLmMKKyAqIENpcnJ1cyBMb2dpYyBFREI5MzAyQSBzdXBwb3J0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGVkYjkzMDJhX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoCQk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGVkYjkzMDJhX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAkJPSAweDYwMDAwMDAwLAorCS5lbmQJCT0gMHg2MGZmZmZmZiwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlZGI5MzAyYV9mbGFzaCA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmVkYjkzMDJhX2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJmVkYjkzMDJhX2ZsYXNoX3Jlc291cmNlLAorfTsKKworc3RhdGljIHN0cnVjdCBlcDkzeHhfZXRoX2RhdGEgZWRiOTMwMmFfZXRoX2RhdGEgPSB7CisJLnBoeV9pZAkJCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZWRiOTMwMmFfZXRoX3Jlc291cmNlW10gPSB7CisJeworCQkuc3RhcnQJPSBFUDkzWFhfRVRIRVJORVRfUEhZU19CQVNFLAorCQkuZW5kCT0gRVA5M1hYX0VUSEVSTkVUX1BIWVNfQkFTRSArIDB4ZmZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQJPSBJUlFfRVA5M1hYX0VUSEVSTkVULAorCQkuZW5kCT0gSVJRX0VQOTNYWF9FVEhFUk5FVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZWRiOTMwMmFfZXRoX2RldmljZSA9IHsKKwkubmFtZQkJPSAiZXA5M3h4LWV0aCIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZlZGI5MzAyYV9ldGhfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMiwKKwkucmVzb3VyY2UJPSBlZGI5MzAyYV9ldGhfcmVzb3VyY2UsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZWRiOTMwMmFfaW5pdF9tYWNoaW5lKHZvaWQpCit7CisJZXA5M3h4X2luaXRfZGV2aWNlcygpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZWRiOTMwMmFfZmxhc2gpOworCisJbWVtY3B5KGVkYjkzMDJhX2V0aF9kYXRhLmRldl9hZGRyLAorCQkodm9pZCAqKShFUDkzWFhfRVRIRVJORVRfQkFTRSArIDB4NTApLCA2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmVkYjkzMDJhX2V0aF9kZXZpY2UpOworfQorCitNQUNISU5FX1NUQVJUKEVEQjkzMDJBLCAiQ2lycnVzIExvZ2ljIEVEQjkzMDJBIEV2YWx1YXRpb24gQm9hcmQiKQorCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAqLworCS5waHlzX2lvCT0gRVA5M1hYX0FQQl9QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChFUDkzWFhfQVBCX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBlcDkzeHhfbWFwX2lvLAorCS5pbml0X2lycQk9IGVwOTN4eF9pbml0X2lycSwKKwkudGltZXIJCT0gJmVwOTN4eF90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gZWRiOTMwMmFfaW5pdF9tYWNoaW5lLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYwppbmRleCBhZjkwMGY0Li5lZjI5ZmMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCkBAIC03OCw3ICs3OCw3IEBACiAJKkNTUl9JUlFfRU5BQkxFID0gZmJfaXJxX21hc2tbX0RDMjEyODVfSU5SKGlycSldOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgZmJfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZmJfY2hpcCA9IHsKIAkuYWNrCT0gZmJfbWFza19pcnEsCiAJLm1hc2sJPSBmYl9tYXNrX2lycSwKIAkudW5tYXNrID0gZmJfdW5tYXNrX2lycSwKQEAgLTk2LDcgKzk2LDcgQEAKIAogCWZvciAoaXJxID0gX0RDMjEyODVfSVJRKDApOyBpcnEgPCBfREMyMTI4NV9JUlEoMjApOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmZmJfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jCmluZGV4IGZhNWQ0OTcuLjE0NjMzMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS1pcnEuYwppbmRleCA4ODhkZWRkLi43OTQ0M2ZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAlvdXRiKGluYihQSUNfTUFTS19MTykgJiB+bWFzaywgUElDX01BU0tfTE8pOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaXNhX2xvX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlzYV9sb19jaGlwID0gewogCS5hY2sJPSBpc2FfYWNrX3BpY19sb19pcnEsCiAJLm1hc2sJPSBpc2FfbWFza19waWNfbG9faXJxLAogCS51bm1hc2sgPSBpc2FfdW5tYXNrX3BpY19sb19pcnEsCkBAIC03OCwxNCArNzgsMTQgQEAKIAlvdXRiKGluYihQSUNfTUFTS19ISSkgJiB+bWFzaywgUElDX01BU0tfSEkpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaXNhX2hpX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlzYV9oaV9jaGlwID0gewogCS5hY2sJPSBpc2FfYWNrX3BpY19oaV9pcnEsCiAJLm1hc2sJPSBpc2FfbWFza19waWNfaGlfaXJxLAogCS51bm1hc2sgPSBpc2FfdW5tYXNrX3BpY19oaV9pcnEsCiB9OwogCiBzdGF0aWMgdm9pZAotaXNhX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQoraXNhX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgaXNhX2lycSA9ICoodW5zaWduZWQgY2hhciAqKVBDSUlBQ0tfQkFTRTsKIApAQCAtMTUwLDEzICsxNTAsMTMgQEAKIAlpZiAoaG9zdF9pcnEgIT0gKHVuc2lnbmVkIGludCktMSkgewogCQlmb3IgKGlycSA9IF9JU0FfSVJRKDApOyBpcnEgPCBfSVNBX0lSUSg4KTsgaXJxKyspIHsKIAkJCXNldF9pcnFfY2hpcChpcnEsICZpc2FfbG9fY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCQl9CiAKIAkJZm9yIChpcnEgPSBfSVNBX0lSUSg4KTsgaXJxIDwgX0lTQV9JUlEoMTYpOyBpcnErKykgewogCQkJc2V0X2lycV9jaGlwKGlycSwgJmlzYV9oaV9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvY29tbW9uLmMKaW5kZXggNDcxOTIyOS4uN2YzMTgxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NvbW1vbi5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAogc3RhdGljIHZvaWQKIGg3MjB4X2dwaW9faGFuZGxlcih1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGlycSwKLSAgICAgICAgICAgICAgICAgc3RydWN0IGlycWRlc2MgKmRlc2MpCisgICAgICAgICAgICAgICAgIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlJUlFEQkcoIiVzIGlycTogJWRcbiIsX19GVU5DVElPTl9fLGlycSk7CiAJZGVzYyA9IGlycV9kZXNjICsgaXJxOwpAQCAtMTE3LDcgKzExNyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1oNzIweF9ncGlvYV9kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK2g3MjB4X2dwaW9hX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgbWFzaywgaXJxOwogCkBAIC0xMjgsNyArMTI4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWg3MjB4X2dwaW9iX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQoraDcyMHhfZ3Bpb2JfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBtYXNrLCBpcnE7CiAJbWFzayA9IENQVV9SRUcoR1BJT19CX1ZJUlQsR1BJT19TVEFUKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotaDcyMHhfZ3Bpb2NfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitoNzIweF9ncGlvY19kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IG1hc2ssIGlycTsKIApAQCAtMTQ5LDcgKzE0OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1oNzIweF9ncGlvZF9kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK2g3MjB4X2dwaW9kX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgbWFzaywgaXJxOwogCkBAIC0xNjEsNyArMTYxLDcgQEAKIAogI2lmZGVmIENPTkZJR19DUFVfSDcyMDIKIHN0YXRpYyB2b2lkCi1oNzIweF9ncGlvZV9kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK2g3MjB4X2dwaW9lX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgbWFzaywgaXJxOwogCkBAIC0xNzIsMTMgKzE3MiwxMyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBoNzIweF9nbG9iYWxfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaDcyMHhfZ2xvYmFsX2NoaXAgPSB7CiAJLmFjayA9IG1hc2tfZ2xvYmFsX2lycSwKIAkubWFzayA9IG1hc2tfZ2xvYmFsX2lycSwKIAkudW5tYXNrID0gdW5tYXNrX2dsb2JhbF9pcnEsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaDcyMHhfZ3Bpb19jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBoNzIweF9ncGlvX2NoaXAgPSB7CiAJLmFjayA9IGFja19ncGlvX2lycSwKIAkubWFzayA9IG1hc2tfZ3Bpb19pcnEsCiAJLnVubWFzayA9IHVubWFza19ncGlvX2lycSwKQEAgLTIwMywxNCArMjAzLDE0IEBACiAJLyogSW5pdGlhbGl6ZSBnbG9iYWwgSVJRJ3MsIGZhc3QgcGF0aCAqLwogCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfR0xCTF9JUlFTOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmaDcyMHhfZ2xvYmFsX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAl9CiAKIAkvKiBJbml0aWFsaXplIG11bHRpcGxleGVkIElSUSdzLCBzbG93IHBhdGggKi8KIAlmb3IgKGlycSA9IElSUV9DSEFJTkVEX0dQSU9BKDApIDsgaXJxIDw9IElSUV9DSEFJTkVEX0dQSU9EKDMxKTsgaXJxKyspIHsKIAkJc2V0X2lycV9jaGlwKGlycSwgJmg3MjB4X2dwaW9fY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgKTsKIAl9CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0dQSU9BLCBoNzIweF9ncGlvYV9kZW11eF9oYW5kbGVyKTsKQEAgLTIyMSw3ICsyMjEsNyBAQAogI2lmZGVmIENPTkZJR19DUFVfSDcyMDIKIAlmb3IgKGlycSA9IElSUV9DSEFJTkVEX0dQSU9FKDApIDsgaXJxIDw9IElSUV9DSEFJTkVEX0dQSU9FKDMxKTsgaXJxKyspIHsKIAkJc2V0X2lycV9jaGlwKGlycSwgJmg3MjB4X2dwaW9fY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgKTsKIAl9CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0dQSU9FLCBoNzIweF9ncGlvZV9kZW11eF9oYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAyLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jCmluZGV4IDA2ZmVjYWUuLjcwMzg3MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgKiB3ZSBoYXZlIHRvIGhhbmRsZSBhbGwgdGltZXIgaW50ZXJydXB0cyBpbiBvbmUgcGxhY2UuCiAgKi8KIHN0YXRpYyB2b2lkCi1oNzIwMl90aW1lcnhfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitoNzIwMl90aW1lcnhfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBtYXNrLCBpcnE7CiAKQEAgLTE2Miw3ICsxNjIsNyBAQAogCUNQVV9SRUcgKFRJTUVSX1ZJUlQsIFRJTUVSX1RPUENUUkwpIHw9IGJpdDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGg3MjAyX3RpbWVyeF9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBoNzIwMl90aW1lcnhfY2hpcCA9IHsKIAkuYWNrID0gbWFza190aW1lcnhfaXJxLAogCS5tYXNrID0gbWFza190aW1lcnhfaXJxLAogCS51bm1hc2sgPSB1bm1hc2tfdGltZXJ4X2lycSwKQEAgLTIwMiw3ICsyMDIsNyBAQAogCSAgICAgICAgICAgICAgICAgIGlycSA8IElSUV9DSEFJTkVEX1RJTUVSWChOUl9USU1FUlhfSVJRUyk7IGlycSsrKSB7CiAJCW1hc2tfdGltZXJ4X2lycShpcnEpOwogCQlzZXRfaXJxX2NoaXAoaXJxLCAmaDcyMDJfdGltZXJ4X2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEICk7CiAJfQogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9USU1FUlgsIGg3MjAyX3RpbWVyeF9kZW11eF9oYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUKaW5kZXggMGIyN2Q3OWYuLjAyMjcyYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlCkBAIC05LDYgKzksOCBAQAogCiBvYmoteQkJCSs9IGlycS5vIHRpbWUubyBkbWEubyBnZW5lcmljLm8KIAorb2JqLSQoQ09ORklHX0NQVV9GUkVRX0lNWCkJKz0gY3B1ZnJlcS5vCisKICMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydAogb2JqLSQoQ09ORklHX0FSQ0hfTVgxQURTKSArPSBteDFhZHMubwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jcHVmcmVxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1Zjk5OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdWZyZXEuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIGNwdS5jOiBjbG9jayBzY2FsaW5nIGZvciB0aGUgaU1YCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIDIwMDEsIFRoZSBEZWxmdCBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3kKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTYXNjaGEgSGF1ZXIgPHNhc2NoYUBzYXNjaGFoYXVlci5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBJbmt5IEx1bmcgPGlsdW5nQGN3bGludXguY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFBhdmVsIFBpc2EsIFBpS1JPTiA8cHBpc2FAcGlrcm9uLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBTQTExMDAgdmVyc2lvbiB3cml0dGVuIGJ5OgorICogLSBKb2hhbiBQb3V3ZWxzZSAoSi5BLlBvdXdlbHNlQGl0cy50dWRlbGZ0Lm5sKTogaW5pdGlhbCB2ZXJzaW9uCisgKiAtIEVyaWsgTW91dyAoSi5BLksuTW91d0BpdHMudHVkZWxmdC5ubCk6CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisvKiNkZWZpbmUgREVCVUcqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCisjaWZuZGVmIF9fdmFsMm1mbGQKKyNkZWZpbmUgX192YWwybWZsZChtYXNrLHZhbCkgKCgobWFzaykmfigobWFzayk8PDEpKSoodmFsKSYobWFzaykpCisjZW5kaWYKKyNpZm5kZWYgX19tZmxkMnZhbAorI2RlZmluZSBfX21mbGQydmFsKG1hc2ssdmFsKSAoKCh2YWwpJihtYXNrKSkvKChtYXNrKSZ+KChtYXNrKTw8MSkpKQorI2VuZGlmCisKKyNkZWZpbmUgQ1JfOTIwVF9DTE9DS19NT0RFCTB4QzAwMDAwMDAKKyNkZWZpbmUgQ1JfOTIwVF9GQVNUQlVTX01PREUJMHgwMDAwMDAwMAorI2RlZmluZSBDUl85MjBUX0FTWU5DX01PREUJMHhDMDAwMDAwMAorCitzdGF0aWMgdTMyIG1wY3RsMF9hdF9ib290OworCitzdGF0aWMgdm9pZCBpbXhfc2V0X2FzeW5jX21vZGUodm9pZCkKK3sKKwlhZGp1c3RfY3IoQ1JfOTIwVF9DTE9DS19NT0RFLCBDUl85MjBUX0FTWU5DX01PREUpOworfQorCitzdGF0aWMgdm9pZCBpbXhfc2V0X2Zhc3RidXNfbW9kZSh2b2lkKQoreworCWFkanVzdF9jcihDUl85MjBUX0NMT0NLX01PREUsIENSXzkyMFRfRkFTVEJVU19NT0RFKTsKK30KKworc3RhdGljIHZvaWQgaW14X3NldF9tcGN0bDAodTMyIG1wY3RsMCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG1wY3RsMCA9PSAwKSB7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJQ1NDUiAmPSB+Q1NDUl9NUEVOOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJTVBDVEwwID0gbXBjdGwwOworCUNTQ1IgfD0gQ1NDUl9NUEVOOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKiBpbXhfY29tcHV0ZV9tcGN0bCAtIGNvbXB1dGUgbmV3IFBMTCBwYXJhbWV0ZXJzCisgKiBAbmV3X21wY3RsOglwb2ludGVyIHRvIGxvY2F0aW9uIGFzc2lnbmVkIGJ5IG5ldyBQTEwgY29udHJvbCByZWdpc3RlciB2YWx1ZQorICogQGN1cl9tcGN0bDoJY3VycmVudCBQTEwgY29udHJvbCByZWdpc3RlciBwYXJhbWV0ZXJzCisgKiBAZnJlcToJcmVxdWlyZWQgZnJlcXVlbmN5IGluIEh6CisgKiBAcmVsYXRpb246CWlzIG9uZSBvZiAlQ1BVRlJFUV9SRUxBVElPTl9MIChzdXByZW11bSkKKyAqCQlhbmQgJUNQVUZSRVFfUkVMQVRJT05fSCAoaW5maW11bSkKKyAqLworbG9uZyBpbXhfY29tcHV0ZV9tcGN0bCh1MzIgKm5ld19tcGN0bCwgdTMyIGN1cl9tcGN0bCwgdW5zaWduZWQgbG9uZyBmcmVxLCBpbnQgcmVsYXRpb24pCit7CisgICAgICAgIHUzMiBmX3JlZiA9IChDU0NSICYgQ1NDUl9TWVNURU1fU0VMKSA/IDE2MDAwMDAwIDogKENMSzMyICogNTEyKTsKKyAgICAgICAgdTMyIG1maTsKKyAgICAgICAgdTMyIG1mbjsKKyAgICAgICAgdTMyIG1mZDsKKyAgICAgICAgdTMyIHBkOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsbDsKKwlsb25nIGw7CisJbG9uZyBxdW90OworCisJLyogRmRwcGw9MipGcmVmKihNRkkrTUZOLyhNRkQrMSkpLyhQRCsxKSAqLworCS8qICBQRD08MCwxNT4sIE1GRD08MSwxMDIzPiwgTUZJPTw1LDE1PiBNRk49PDAsMTAyMj4gKi8KKworCWlmIChjdXJfbXBjdGwpIHsKKwkJbWZkID0gKChjdXJfbXBjdGwgPj4gMTYpICYgMHgzZmYpICsgMTsKKwkJcGQgPSAgKChjdXJfbXBjdGwgPj4gMjYpICYgMHhmKSArIDE7CisJfSBlbHNlIHsKKwkJcGQ9MjsgbWZkPTMxMzsKKwl9CisKKwkvKiBwZD0yOyBtZmQ9MzEzOyBtZmk9ODsgbWZuPTE4MzsgKi8KKwkvKiAoTUZJK01GTi8oTUZEKSkgPSBGZHBwbCAvICgyKkZyZWYpICogKFBEKTsgKi8KKworCXF1b3QgPSAoZl9yZWYgKyAoMSA8PCA5KSkgPj4gMTA7CisJbCA9IChmcmVxICogcGQgKyBxdW90KSAvICgyICogcXVvdCk7CisJbWZpID0gbCA+PiAxMDsKKwltZm4gPSAoKGwgJiAoKDEgPDwgMTApIC0gMSkpICogbWZkICsgKDEgPDwgOSkpID4+IDEwOworCisJbWZkIC09IDE7CisJcGQgLT0gMTsKKworCSpuZXdfbXBjdGwgPSAoKG1maSAmIDB4ZikgPDwgMTApIHwgKG1mbiAmIDB4M2ZmKSB8ICgobWZkICYgMHgzZmYpIDw8IDE2KQorCQl8ICgocGQgJiAweGYpIDw8IDI2KTsKKworCWxsID0gMiAqICh1bnNpZ25lZCBsb25nIGxvbmcpZl9yZWYgKiAoIChtZmk8PDE2KSArIChtZm48PDE2KSAvIChtZmQrMSkgKTsKKwlxdW90ID0gKHBkKzEpICogKDE8PDE2KTsKKwlsbCArPSBxdW90IC8gMjsKKwlkb19kaXYobGwsIHF1b3QpOworCWZyZXEgPSBsbDsKKworCXByX2RlYnVnKEtFUk5fREVCVUcgImlteDogbmV3IFBMTCBwYXJhbWV0ZXJzIHBkPSVkIG1mZD0lZCBtZmk9JWQgbWZuPSVkLCBmcmVxPSVsZFxuIiwKKwkJcGQsIG1mZCwgbWZpLCBtZm4sIGZyZXEpOworCisJcmV0dXJuIGZyZXE7Cit9CisKKworc3RhdGljIGludCBpbXhfdmVyaWZ5X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWlmIChwb2xpY3ktPmNwdSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpbXhfZ2V0X3NwZWVkKHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgaW50IGZyZXE7CisJdW5zaWduZWQgaW50IGNyOworCXVuc2lnbmVkIGludCBjc2NyOworCXVuc2lnbmVkIGludCBiY2xrX2RpdjsKKworCWlmIChjcHUpCisJCXJldHVybiAwOworCisJY3NjciA9IENTQ1I7CisJYmNsa19kaXYgPSBfX21mbGQydmFsKENTQ1JfQkNMS19ESVYsIGNzY3IpICsgMTsKKwljciA9IGdldF9jcigpOworCisJaWYoKGNyICYgQ1JfOTIwVF9DTE9DS19NT0RFKSA9PSBDUl85MjBUX0ZBU1RCVVNfTU9ERSkgeworCQlmcmVxID0gaW14X2dldF9zeXN0ZW1fY2xrKCk7CisJCWZyZXEgPSAoZnJlcSArIGJjbGtfZGl2LzIpIC8gYmNsa19kaXY7CisJfSBlbHNlIHsKKwkJZnJlcSA9IGlteF9nZXRfbWN1X2NsaygpOworCQlpZiAoY3NjciAmIENTQ1JfTVBVX1BSRVNDKQorCQkJZnJlcSAvPSAyOworCX0KKworCWZyZXEgPSAoZnJlcSArIDUwMCkgLyAxMDAwOworCisJcmV0dXJuIGZyZXE7Cit9CisKK3N0YXRpYyBpbnQgaW14X3NldF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXUzMiBtcGN0bDAgPSAwOworCXUzMiBjc2NyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyBmcmVxOworCWxvbmcgc3lzY2xrOworCXVuc2lnbmVkIGludCBiY2xrX2RpdiA9IDE7CisKKwlmcmVxID0gdGFyZ2V0X2ZyZXEgKiAxMDAwOworCisJcHJfZGVidWcoS0VSTl9ERUJVRyAiaW14OiByZXF1ZXN0ZWQgZnJlcXVlbmN5ICVsZCBIeiwgbXBjdGwwIGF0IGJvb3QgMHglMDh4XG4iLAorCQkJZnJlcSwgbXBjdGwwX2F0X2Jvb3QpOworCisJc3lzY2xrID0gaW14X2dldF9zeXN0ZW1fY2xrKCk7CisKKwlpZiAoZnJlcSA+IHN5c2NsayArIDEwMDAwMDApIHsKKwkJZnJlcSA9IGlteF9jb21wdXRlX21wY3RsKCZtcGN0bDAsIG1wY3RsMF9hdF9ib290LCBmcmVxLCByZWxhdGlvbik7CisJCWlmIChmcmVxIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW14OiB0YXJnZXQgZnJlcXVlbmN5ICVsZCBIeiBjYW5ub3QgYmUgc2V0XG4iLCBmcmVxKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJaWYoZnJlcSArIDEwMDAgPCBzeXNjbGspIHsKKwkJCWlmIChyZWxhdGlvbiA9PSBDUFVGUkVRX1JFTEFUSU9OX0wpCisJCQkJYmNsa19kaXYgPSAoc3lzY2xrIC0gMTAwMCkgLyBmcmVxOworCQkJZWxzZQorCQkJCWJjbGtfZGl2ID0gKHN5c2NsayArIGZyZXEgKyAxMDAwKSAvIGZyZXE7CisKKwkJCWlmKGJjbGtfZGl2ID4gMTYpCisJCQkJYmNsa19kaXYgPSAxNjsKKwkJfQorCQlmcmVxID0gKHN5c2NsayArIGJjbGtfZGl2IC8gMikgLyBiY2xrX2RpdjsKKwl9CisKKwlmcmVxcy5vbGQgPSBpbXhfZ2V0X3NwZWVkKDApOworCWZyZXFzLm5ldyA9IChmcmVxICsgNTAwKSAvIDEwMDA7CisJZnJlcXMuY3B1ID0gMDsKKwlmcmVxcy5mbGFncyA9IDA7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaW14X3NldF9mYXN0YnVzX21vZGUoKTsKKworCWlteF9zZXRfbXBjdGwwKG1wY3RsMCk7CisKKwljc2NyID0gQ1NDUjsKKwljc2NyICY9IH5DU0NSX0JDTEtfRElWOworCWNzY3IgfD0gX192YWwybWZsZChDU0NSX0JDTEtfRElWLCBiY2xrX2RpdiAtIDEpOworCUNTQ1IgPSBjc2NyOworCisJaWYobXBjdGwwKSB7CisJCUNTQ1IgfD0gQ1NDUl9NUExMX1JFU1RBUlQ7CisKKwkJLyogV2FpdCB1bnRpbCBNUExMIGlzIHN0YWJsaXplZCAqLworCQl3aGlsZSggQ1NDUiAmIENTQ1JfTVBMTF9SRVNUQVJUICk7CisKKwkJaW14X3NldF9hc3luY19tb2RlKCk7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKwlwcl9kZWJ1ZyhLRVJOX0lORk8gImlteDogc2V0IGZyZXF1ZW5jeSAlbGQgSHosIHJ1bm5pbmcgZnJvbSAlc1xuIiwKKwkJCWZyZXEsIG1wY3RsMD8gIk1QTEwiOiAiU1BMTCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlteF9jcHVmcmVxX2RyaXZlcl9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXByaW50ayhLRVJOX0lORk8gImkuTVggY3B1IGZyZXEgY2hhbmdlIGRyaXZlciB2MS4wXG4iKTsKKworCWlmIChwb2xpY3ktPmNwdSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvbGljeS0+Y3VyID0gcG9saWN5LT5taW4gPSBwb2xpY3ktPm1heCA9IGlteF9nZXRfc3BlZWQoMCk7CisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEgPSA4MDAwOworCXBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSA9IDIwMDAwMDsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGlteF9kcml2ZXIgPSB7CisJLmZsYWdzCQk9IENQVUZSRVFfU1RJQ0tZLAorCS52ZXJpZnkJCT0gaW14X3ZlcmlmeV9zcGVlZCwKKwkudGFyZ2V0CQk9IGlteF9zZXRfdGFyZ2V0LAorCS5nZXQJCT0gaW14X2dldF9zcGVlZCwKKwkuaW5pdAkJPSBpbXhfY3B1ZnJlcV9kcml2ZXJfaW5pdCwKKwkubmFtZQkJPSAiaW14IiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlteF9jcHVmcmVxX2luaXQodm9pZCkKK3sKKworCW1wY3RsMF9hdF9ib290ID0gMDsKKworCWlmKChDU0NSICYgQ1NDUl9NUEVOKSAmJgorCSAgICgoZ2V0X2NyKCkgJiBDUl85MjBUX0NMT0NLX01PREUpICE9IENSXzkyMFRfRkFTVEJVU19NT0RFKSkKKwkJbXBjdGwwX2F0X2Jvb3QgPSBNUENUTDA7CisKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmlteF9kcml2ZXIpOworfQorCithcmNoX2luaXRjYWxsKGlteF9jcHVmcmVxX2luaXQpOworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLWlteC9nZW5lcmljLmMKaW5kZXggMTJlYTU4YS4uYjVhYTQ5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2dlbmVyaWMuYwpAQCAtMTA0LDYgKzEwNCw5IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW14X2RlY29kZV9wbGwodW5zaWduZWQgaW50IHBsbCkKIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGw7CisJdW5zaWduZWQgbG9uZyBxdW90OworCiAJdTMyIG1maSA9IChwbGwgPj4gMTApICYgMHhmOwogCXUzMiBtZm4gPSBwbGwgJiAweDNmZjsKIAl1MzIgbWZkID0gKHBsbCA+PiAxNikgJiAweDNmZjsKQEAgLTExMiw3ICsxMTUsMTEgQEAKIAogCW1maSA9IG1maSA8PSA1ID8gNSA6IG1maTsKIAotCXJldHVybiAoMiAqIChmX3JlZj4+MTApICogKCAobWZpPDwxMCkgKyAobWZuPDwxMCkgLyAobWZkKzEpICkpIC8gKHBkKzEpOworCWxsID0gMiAqICh1bnNpZ25lZCBsb25nIGxvbmcpZl9yZWYgKiAoIChtZmk8PDE2KSArIChtZm48PDE2KSAvIChtZmQrMSkgKTsKKwlxdW90ID0gKHBkKzEpICogKDE8PDE2KTsKKwlsbCArPSBxdW90IC8gMjsKKwlkb19kaXYobGwsIHF1b3QpOworCXJldHVybiAodW5zaWduZWQgaW50KSBsbDsKIH0KIAogdW5zaWduZWQgaW50IGlteF9nZXRfc3lzdGVtX2Nsayh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaXJxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9pcnEuYwppbmRleCAzNjhiMTNiLi4wNzkxYjU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9pcnEuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIHN0YXRpYyB2b2lkCiBpbXhfZ3Bpb19oYW5kbGVyKHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgaXJxLAotICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKKyAgICAgICAgICAgICAgICAgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKIAl3aGlsZSAobWFzaykgewpAQCAtMTYxLDcgKzE2MSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pbXhfZ3Bpb2FfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitpbXhfZ3Bpb2FfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBtYXNrLCBpcnE7CiAKQEAgLTE3MSw3ICsxNzEsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotaW14X2dwaW9iX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQoraW14X2dwaW9iX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgbWFzaywgaXJxOwogCkBAIC0xODEsNyArMTgxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWlteF9ncGlvY19kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK2lteF9ncGlvY19kZW11eF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnFfdW51c2VkLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IG1hc2ssIGlycTsKIApAQCAtMTkxLDcgKzE5MSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pbXhfZ3Bpb2RfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitpbXhfZ3Bpb2RfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBtYXNrLCBpcnE7CiAKQEAgLTIzMCwxMyArMjMwLDEzIEBACiAKIAlmb3IgKGlycSA9IDA7IGlycSA8IElNWF9JUlFTOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmaW14X2ludGVybmFsX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCX0KIAogCWZvciAoaXJxID0gSVJRX0dQSU9BKDApOyBpcnEgPCBJUlFfR1BJT0QoMzIpOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmaW14X2dwaW9fY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCmluZGV4IDhhZTRhMmM1Li40MDAzOWIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTI0LDMzICsyNSw3IEBACiAvKiBVc2UgdGltZXIgMSBhcyBzeXN0ZW0gdGltZXIgKi8KICNkZWZpbmUgVElNRVJfQkFTRSBJTVhfVElNMV9CQVNFCiAKLS8qCi0gKiBSZXR1cm5zIG51bWJlciBvZiB1cyBzaW5jZSBsYXN0IGNsb2NrIGludGVycnVwdC4gIE5vdGUgdGhhdCBpbnRlcnJ1cHRzCi0gKiB3aWxsIGhhdmUgYmVlbiBkaXNhYmxlZCBieSBkb19nZXR0aW1lb2Zmc2V0KCkKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW14X2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRpY2tzOwotCi0JLyoKLQkgKiBHZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRpY2tzLiAgTm90ZSB0aGF0IHRoZXJlIGlzIGEgcmFjZQotCSAqIGNvbmRpdGlvbiBiZXR3ZWVuIHVzIHJlYWRpbmcgdGhlIHRpbWVyIGFuZCBjaGVja2luZyBmb3IKLQkgKiBhbiBpbnRlcnJ1cHQuICBXZSBnZXQgYXJvdW5kIHRoaXMgYnkgZW5zdXJpbmcgdGhhdCB0aGUKLQkgKiBjb3VudGVyIGhhcyBub3QgcmVsb2FkZWQgYmV0d2VlbiBvdXIgdHdvIHJlYWRzLgotCSAqLwotCXRpY2tzID0gSU1YX1RDTihUSU1FUl9CQVNFKTsKLQotCS8qCi0JICogSW50ZXJydXB0IHBlbmRpbmc/ICBJZiBzbywgd2UndmUgcmVsb2FkZWQgb25jZSBhbHJlYWR5LgotCSAqLwotCWlmIChJTVhfVFNUQVQoVElNRVJfQkFTRSkgJiBUU1RBVF9DT01QKQotCQl0aWNrcyArPSBMQVRDSDsKLQotCS8qCi0JICogQ29udmVydCB0aGUgdGlja3MgdG8gdXNlY3MKLQkgKi8KLQlyZXR1cm4gKDEwMDAwMDAgLyBDTEszMikgKiB0aWNrczsKLX0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV2dF9kaWZmOwogCiAvKgogICogSVJRIGhhbmRsZXIgZm9yIHRoZSB0aW1lcgpAQCAtNTgsMTQgKzMzLDIzIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QKIGlteF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCXVpbnQzMl90IHRzdGF0OwogCiAJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLwotCWlmIChJTVhfVFNUQVQoVElNRVJfQkFTRSkpCi0JCUlNWF9UU1RBVChUSU1FUl9CQVNFKSA9IDA7CisJdHN0YXQgPSBJTVhfVFNUQVQoVElNRVJfQkFTRSk7CisJSU1YX1RTVEFUKFRJTUVSX0JBU0UpID0gMDsKIAotCXRpbWVyX3RpY2soKTsKLQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCWlmICh0c3RhdCAmIFRTVEFUX0NPTVApIHsKKwkJZG8geworCisJCQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwkJCXRpbWVyX3RpY2soKTsKKwkJCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJCQlJTVhfVENNUChUSU1FUl9CQVNFKSArPSBldnRfZGlmZjsKKworCQl9IHdoaWxlICh1bmxpa2VseSgoaW50MzJfdCkoSU1YX1RDTVAoVElNRVJfQkFTRSkKKwkJCQkJLSBJTVhfVENOKFRJTUVSX0JBU0UpKSA8IDApKTsKKwl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC03Nyw5ICs2MSw5IEBACiB9OwogCiAvKgotICogU2V0IHVwIHRpbWVyIGludGVycnVwdCwgYW5kIHJldHVybiB0aGUgY3VycmVudCB0aW1lIGluIHNlY29uZHMuCisgKiBTZXQgdXAgdGltZXIgaGFyZHdhcmUgaW50byBleHBlY3RlZCBtb2RlIGFuZCBzdGF0ZS4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IGlteF90aW1lcl9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgaW14X3RpbWVyX2hhcmR3YXJlX2luaXQodm9pZCkKIHsKIAkvKgogCSAqIEluaXRpYWxpc2UgdG8gYSBrbm93biBzdGF0ZSAoYWxsIHRpbWVycyBvZmYsIGFuZCB0aW1pbmcgcmVzZXQpCkBAIC04Nyw3ICs3MSwzOCBAQAogCUlNWF9UQ1RMKFRJTUVSX0JBU0UpID0gMDsKIAlJTVhfVFBSRVIoVElNRVJfQkFTRSkgPSAwOwogCUlNWF9UQ01QKFRJTUVSX0JBU0UpID0gTEFUQ0ggLSAxOwotCUlNWF9UQ1RMKFRJTUVSX0JBU0UpID0gVENUTF9DTEtfMzIgfCBUQ1RMX0lSUUVOIHwgVENUTF9URU47CisKKwlJTVhfVENUTChUSU1FUl9CQVNFKSA9IFRDVExfRlJSIHwgVENUTF9DTEtfUENMSzEgfCBUQ1RMX0lSUUVOIHwgVENUTF9URU47CisJZXZ0X2RpZmYgPSBMQVRDSDsKK30KKworY3ljbGVfdCBpbXhfZ2V0X2N5Y2xlcyh2b2lkKQoreworCXJldHVybiBJTVhfVENOKFRJTUVSX0JBU0UpOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2lteCA9IHsKKwkubmFtZSAJCT0gImlteF90aW1lcjEiLAorCS5yYXRpbmcJCT0gMjAwLAorCS5yZWFkCQk9IGlteF9nZXRfY3ljbGVzLAorCS5tYXNrCQk9IDB4RkZGRkZGRkYsCisJLnNoaWZ0IAkJPSAyMCwKKwkuaXNfY29udGludW91cyAJPSAxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW14X2Nsb2Nrc291cmNlX2luaXQodm9pZCkKK3sKKwljbG9ja3NvdXJjZV9pbXgubXVsdCA9CisJCWNsb2Nrc291cmNlX2h6Mm11bHQoaW14X2dldF9wZXJjbGsxKCksIGNsb2Nrc291cmNlX2lteC5zaGlmdCk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2lteCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlteF90aW1lcl9pbml0KHZvaWQpCit7CisJaW14X3RpbWVyX2hhcmR3YXJlX2luaXQoKTsKKwlpbXhfY2xvY2tzb3VyY2VfaW5pdCgpOwogCiAJLyoKIAkgKiBNYWtlIGlycXMgaGFwcGVuIGZvciB0aGUgc3lzdGVtIHRpbWVyCkBAIC05Nyw1ICsxMTIsNCBAQAogCiBzdHJ1Y3Qgc3lzX3RpbWVyIGlteF90aW1lciA9IHsKIAkuaW5pdAkJPSBpbXhfdGltZXJfaW5pdCwKLQkub2Zmc2V0CQk9IGlteF9nZXR0aW1lb2Zmc2V0LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCmluZGV4IDE5MWM1N2EuLjcyMjgwNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewogCQlpZiAoKCgxIDw8IGkpICYgSU5URUdSQVRPUl9TQ19WQUxJRF9JTlQpICE9IDApIHsKIAkJCXNldF9pcnFfY2hpcChpLCAmc2NfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKaW5kZXggNzcxYjY1Yi4uOTEzZjY0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIH07CiAKIHN0YXRpYyB2b2lkCi1zaWNfaGFuZGxlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3NpY19oYW5kbGVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IHNpY19yZWFkbChJTlRDUF9WQV9TSUNfQkFTRSArIElSUV9TVEFUVVMpOwogCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJaWYgKGkgPT0gMjkpCiAJCQlicmVhazsKIAkJc2V0X2lycV9jaGlwKGksICZwaWNfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCX0KIApAQCAtMjQ3LDcgKzI0Nyw3IEBACiAKIAlmb3IgKGkgPSBJUlFfQ0lDX1NUQVJUOyBpIDw9IElSUV9DSUNfRU5EOyBpKyspIHsKIAkJc2V0X2lycV9jaGlwKGksICZjaWNfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7CiAJfQogCkBAIC0yNTYsNyArMjU2LDcgQEAKIAogCWZvciAoaSA9IElSUV9TSUNfU1RBUlQ7IGkgPD0gSVJRX1NJQ19FTkQ7IGkrKykgewogCQlzZXRfaXJxX2NoaXAoaSwgJnNpY19jaGlwKTsKLQkJc2V0X2lycV9oYW5kbGVyKGksIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BsYXRzbXAuYwppbmRleCAxYmM4NTM0Li42MTNiODQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wbGF0c21wLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjMmQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9LY29uZmlnCkBAIC0wLDAgKzEsMjAgQEAKK2lmIEFSQ0hfSU9QMTNYWAorCittZW51ICJJT1AxM1hYIEltcGxlbWVudGF0aW9uIE9wdGlvbnMiCisKK2NvbW1lbnQgIklPUDEzWFggUGxhdGZvcm0gU3VwcG9ydCIKKworY29uZmlnIE1BQ0hfSVE4MTM0MFNDCisJYm9vbCAiRW5hYmxlIElRODEzNDBTQyBIYXJkd2FyZSBTdXBwb3J0IgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBydW5uaW5nIG9uIHRoZSBJbnRlbCBJUTgxMzQwU0MKKwkgIGV2YWx1YXRpb24ga2l0LgorCitjb25maWcgTUFDSF9JUTgxMzQwTUMKKwlib29sICJFbmFibGUgSVE4MTM0ME1DIEhhcmR3YXJlIFN1cHBvcnQiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IHJ1bm5pbmcgb24gdGhlIEludGVsIElRODEzNDBNQworCSAgZXZhbHVhdGlvbiBraXQuCisKK2VuZG1lbnUKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkNmMwOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitvYmoteQkJCTo9CitvYmotbQkJCTo9CitvYmotbgkJCTo9CitvYmotCQkJOj0KKworb2JqLSQoQ09ORklHX0FSQ0hfSU9QMTNYWCkgKz0gc2V0dXAubworb2JqLSQoQ09ORklHX0FSQ0hfSU9QMTNYWCkgKz0gaXJxLm8KK29iai0kKENPTkZJR19BUkNIX0lPUDEzWFgpICs9IHRpbWUubworb2JqLSQoQ09ORklHX0FSQ0hfSU9QMTNYWCkgKz0gcGNpLm8KK29iai0kKENPTkZJR19BUkNIX0lPUDEzWFgpICs9IGlvLm8KK29iai0kKENPTkZJR19NQUNIX0lRODEzNDBTQykgKz0gaXE4MTM0MHNjLm8KK29iai0kKENPTkZJR19NQUNIX0lRODEzNDBNQykgKz0gaXE4MTM0MG1jLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwZTE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsMyBAQAorICAgenJlbGFkZHIteSAgIDo9IDB4MDAwMDgwMDAKK3BhcmFtc19waHlzLXkJOj0gMHgwMDAwMDEwMAoraW5pdHJkX3BoeXMteSAJOj0gMHgwMDgwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lvLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY5Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lvLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIGlvcDEzeHggY3VzdG9tIGlvcmVtYXAgaW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorICogUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3ZvaWQgKiBfX2lvbWVtIF9faW9wMTN4eF9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgY29va2llLCBzaXplX3Qgc2l6ZSwKKwl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXZvaWQgX19pb21lbSAqIHJldHZhbDsKKworCXN3aXRjaCAoY29va2llKSB7CisJY2FzZSBJT1AxM1hYX1BDSVhfTE9XRVJfTUVNX1JBIC4uLiBJT1AxM1hYX1BDSVhfVVBQRVJfTUVNX1JBOgorCQlpZiAodW5saWtlbHkoIWlvcDEzeHhfYXR1eF9tZW1fYmFzZSkpCisJCQlyZXR2YWwgPSBOVUxMOworCQllbHNlCisJCQlyZXR2YWwgPSAodm9pZCAqKShpb3AxM3h4X2F0dXhfbWVtX2Jhc2UgKworCQkJICAgICAgICAgKGNvb2tpZSAtIElPUDEzWFhfUENJWF9MT1dFUl9NRU1fUkEpKTsKKwkJYnJlYWs7CisJY2FzZSBJT1AxM1hYX1BDSUVfTE9XRVJfTUVNX1JBIC4uLiBJT1AxM1hYX1BDSUVfVVBQRVJfTUVNX1JBOgorCQlpZiAodW5saWtlbHkoIWlvcDEzeHhfYXR1ZV9tZW1fYmFzZSkpCisJCQlyZXR2YWwgPSBOVUxMOworCQllbHNlCisJCQlyZXR2YWwgPSAodm9pZCAqKShpb3AxM3h4X2F0dWVfbWVtX2Jhc2UgKworCQkJICAgICAgICAgKGNvb2tpZSAtIElPUDEzWFhfUENJRV9MT1dFUl9NRU1fUkEpKTsKKwkJYnJlYWs7CisJY2FzZSBJT1AxM1hYX1BCSV9MT1dFUl9NRU1fUkEgLi4uIElPUDEzWFhfUEJJX1VQUEVSX01FTV9SQToKKwkJcmV0dmFsID0gX19pb3JlbWFwKElPUDEzWFhfUEJJX0xPV0VSX01FTV9QQSArCisJCQkJICAoY29va2llIC0gSU9QMTNYWF9QQklfTE9XRVJfTUVNX1JBKSwKKwkJCQkgIHNpemUsIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBJT1AxM1hYX1BDSUVfTE9XRVJfSU9fUEEgLi4uIElPUDEzWFhfUENJRV9VUFBFUl9JT19QQToKKwkJcmV0dmFsID0gKHZvaWQgKikgSU9QMTNYWF9QQ0lFX0lPX1BIWVNfVE9fVklSVChjb29raWUpOworCQlicmVhazsKKwljYXNlIElPUDEzWFhfUENJWF9MT1dFUl9JT19QQSAuLi4gSU9QMTNYWF9QQ0lYX1VQUEVSX0lPX1BBOgorCQlyZXR2YWwgPSAodm9pZCAqKSBJT1AxM1hYX1BDSVhfSU9fUEhZU19UT19WSVJUKGNvb2tpZSk7CisJCWJyZWFrOworCWNhc2UgSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UgLi4uIElPUDEzWFhfUE1NUl9VUFBFUl9NRU1fUEE6CisJCXJldHZhbCA9ICh2b2lkICopIElPUDEzWFhfUE1NUl9QSFlTX1RPX1ZJUlQoY29va2llKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gX19pb3JlbWFwKGNvb2tpZSwgc2l6ZSwgZmxhZ3MpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKF9faW9wMTN4eF9pb3JlbWFwKTsKKwordm9pZCBfX2lvcDEzeHhfaW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJZXh0ZXJuIHZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CisKKwlpZiAoaW9wMTN4eF9hdHVlX21lbV9iYXNlKQorCQlpZiAoYWRkciA+PSAodm9pZCBfX2lvbWVtICopIGlvcDEzeHhfYXR1ZV9tZW1fYmFzZSAmJgorCSAJICAgIGFkZHIgPCAodm9pZCBfX2lvbWVtICopIChpb3AxM3h4X2F0dWVfbWVtX2Jhc2UgKworCSAJICAgIAkJCSAgICAgaW9wMTN4eF9hdHVlX21lbV9zaXplKSkKKwkJICAgIGdvdG8gc2tpcDsKKworCWlmIChpb3AxM3h4X2F0dXhfbWVtX2Jhc2UpCisJCWlmIChhZGRyID49ICh2b2lkIF9faW9tZW0gKikgaW9wMTN4eF9hdHV4X21lbV9iYXNlICYmCisJIAkgICAgYWRkciA8ICh2b2lkIF9faW9tZW0gKikgKGlvcDEzeHhfYXR1eF9tZW1fYmFzZSArCisJIAkgICAgCQkJICAgICBpb3AxM3h4X2F0dXhfbWVtX3NpemUpKQorCQkgICAgZ290byBza2lwOworCisJc3dpdGNoICgodTMyKSBhZGRyKSB7CisJY2FzZSBJT1AxM1hYX1BDSUVfTE9XRVJfSU9fVkEgLi4uIElPUDEzWFhfUENJRV9VUFBFUl9JT19WQToKKwljYXNlIElPUDEzWFhfUENJWF9MT1dFUl9JT19WQSAuLi4gSU9QMTNYWF9QQ0lYX1VQUEVSX0lPX1ZBOgorCWNhc2UgSU9QMTNYWF9QTU1SX1ZJUlRfTUVNX0JBU0UgLi4uIElPUDEzWFhfUE1NUl9VUFBFUl9NRU1fVkE6CisJCWdvdG8gc2tpcDsKKwl9CisJX19pb3VubWFwKGFkZHIpOworCitza2lwOgorCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0woX19pb3AxM3h4X2lvdW5tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBtYy5jIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBtYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTk1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIGlxODEzNDBtYyBib2FyZCBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworZXh0ZXJuIGludCBpbml0X2F0dTsgLyogRmxhZyB0byBzZWxlY3Qgd2hpY2ggQVRVKHMpIHRvIGluaXRpYWxpemUgLyBkaXNhYmxlICovCisKK3N0YXRpYyBpbnQgX19pbml0CitpcTgxMzQwbWNfcGNpeF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLCB1OCBwaW4pCit7CisJc3dpdGNoIChpZHNlbCkgeworCWNhc2UgMToKKwkJc3dpdGNoIChwaW4pIHsKKwkJY2FzZSAxOiByZXR1cm4gQVRVWF9JTlRCOworCQljYXNlIDI6IHJldHVybiBBVFVYX0lOVEM7CisJCWNhc2UgMzogcmV0dXJuIEFUVVhfSU5URDsKKwkJY2FzZSA0OiByZXR1cm4gQVRVWF9JTlRBOworCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCX0KKwljYXNlIDI6CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFUVVhfSU5UQzsKKwkJY2FzZSAyOiByZXR1cm4gQVRVWF9JTlREOworCQljYXNlIDM6IHJldHVybiBBVFVYX0lOVEM7CisJCWNhc2UgNDogcmV0dXJuIEFUVVhfSU5URDsKKwkJZGVmYXVsdDogcmV0dXJuIC0xOworCQl9CisJZGVmYXVsdDogcmV0dXJuIC0xOworCX0KK30KKworc3RhdGljIHN0cnVjdCBod19wY2kgaXE4MTM0MG1jX3BjaSBfX2luaXRkYXRhID0geworCS5zd2l6emxlCT0gcGNpX3N0ZF9zd2l6emxlLAorCS5ucl9jb250cm9sbGVycyA9IDAsCisJLnNldHVwCQk9IGlvcDEzeHhfcGNpX3NldHVwLAorCS5tYXBfaXJxCT0gaXE4MTM0MG1jX3BjaXhfbWFwX2lycSwKKwkuc2NhbgkJPSBpb3AxM3h4X3NjYW5fYnVzLAorCS5wcmVpbml0CT0gaW9wMTN4eF9wY2lfaW5pdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlxODEzNDBtY19wY2lfaW5pdCh2b2lkKQoreworCWlvcDEzeHhfYXR1X3NlbGVjdCgmaXE4MTM0MG1jX3BjaSk7CisJcGNpX2NvbW1vbl9pbml0KCZpcTgxMzQwbWNfcGNpKTsKKwlpb3AxM3h4X21hcF9wY2lfbWVtb3J5KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlxODEzNDBtY19pbml0KHZvaWQpCit7CisJaW9wMTN4eF9wbGF0Zm9ybV9pbml0KCk7CisJaXE4MTM0MG1jX3BjaV9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpcTgxMzQwbWNfdGltZXJfaW5pdCh2b2lkKQoreworCWlvcDEzeHhfaW5pdF90aW1lKDQwMDAwMDAwMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyIGlxODEzNDBtY190aW1lciA9IHsKKyAgICAgICAuaW5pdCAgICAgICA9IGlxODEzNDBtY190aW1lcl9pbml0LAorICAgICAgIC5vZmZzZXQgICAgID0gaW9wMTN4eF9nZXR0aW1lb2Zmc2V0LAorfTsKKworTUFDSElORV9TVEFSVChJUTgxMzQwTUMsICJJbnRlbCBJUTgxMzQwTUMiKQorCS8qIE1haW50YWluZXI6IERhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tPiAqLworCS5waHlzX2lvICAgICAgICA9IFBIWVNfSU8sCisJLmlvX3BnX29mZnN0ICAgID0gSU9fUEdfT0ZGU0VULAorCS5tYXBfaW8gICAgICAgICA9IGlvcDEzeHhfbWFwX2lvLAorCS5pbml0X2lycSAgICAgICA9IGlvcDEzeHhfaW5pdF9pcnEsCisJLnRpbWVyICAgICAgICAgID0gJmlxODEzNDBtY190aW1lciwKKwkuYm9vdF9wYXJhbXMgICAgPSBCT09UX1BBUkFNX09GRlNFVCwKKwkuaW5pdF9tYWNoaW5lICAgPSBpcTgxMzQwbWNfaW5pdCwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MHNjLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MHNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3N2UxNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwc2MuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIGlxODEzNDBzYyBib2FyZCBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworZXh0ZXJuIGludCBpbml0X2F0dTsKKworc3RhdGljIGludCBfX2luaXQKK2lxODEzNDBzY19hdHV4X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggaWRzZWwsIHU4IHBpbikKK3sKKwlXQVJOX09OKGlkc2VsIDwgMSB8fCBpZHNlbCA+IDIpOworCisJc3dpdGNoIChpZHNlbCkgeworCWNhc2UgMToKKwkJc3dpdGNoIChwaW4pIHsKKwkJY2FzZSAxOiByZXR1cm4gQVRVWF9JTlRCOworCQljYXNlIDI6IHJldHVybiBBVFVYX0lOVEM7CisJCWNhc2UgMzogcmV0dXJuIEFUVVhfSU5URDsKKwkJY2FzZSA0OiByZXR1cm4gQVRVWF9JTlRBOworCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJCX0KKwljYXNlIDI6CisJCXN3aXRjaCAocGluKSB7CisJCWNhc2UgMTogcmV0dXJuIEFUVVhfSU5UQzsKKwkJY2FzZSAyOiByZXR1cm4gQVRVWF9JTlRDOworCQljYXNlIDM6IHJldHVybiBBVFVYX0lOVEM7CisJCWNhc2UgNDogcmV0dXJuIEFUVVhfSU5UQzsKKwkJZGVmYXVsdDogcmV0dXJuIC0xOworCQl9CisJZGVmYXVsdDogcmV0dXJuIC0xOworCX0KK30KKworc3RhdGljIHN0cnVjdCBod19wY2kgaXE4MTM0MHNjX3BjaSBfX2luaXRkYXRhID0geworCS5zd2l6emxlCT0gcGNpX3N0ZF9zd2l6emxlLAorCS5ucl9jb250cm9sbGVycyA9IDAsCisJLnNldHVwCQk9IGlvcDEzeHhfcGNpX3NldHVwLAorCS5zY2FuCQk9IGlvcDEzeHhfc2Nhbl9idXMsCisJLm1hcF9pcnEJPSBpcTgxMzQwc2NfYXR1eF9tYXBfaXJxLAorCS5wcmVpbml0CT0gaW9wMTN4eF9wY2lfaW5pdAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXE4MTM0MHNjX3BjaV9pbml0KHZvaWQpCit7CisJaW9wMTN4eF9hdHVfc2VsZWN0KCZpcTgxMzQwc2NfcGNpKTsKKwlwY2lfY29tbW9uX2luaXQoJmlxODEzNDBzY19wY2kpOworCWlvcDEzeHhfbWFwX3BjaV9tZW1vcnkoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaXE4MTM0MHNjX2luaXQodm9pZCkKK3sKKwlpb3AxM3h4X3BsYXRmb3JtX2luaXQoKTsKKwlpcTgxMzQwc2NfcGNpX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlxODEzNDBzY190aW1lcl9pbml0KHZvaWQpCit7CisJaW9wMTN4eF9pbml0X3RpbWUoNDAwMDAwMDAwKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNfdGltZXIgaXE4MTM0MHNjX3RpbWVyID0geworICAgICAgIC5pbml0ICAgICAgID0gaXE4MTM0MHNjX3RpbWVyX2luaXQsCisgICAgICAgLm9mZnNldCAgICAgPSBpb3AxM3h4X2dldHRpbWVvZmZzZXQsCit9OworCitNQUNISU5FX1NUQVJUKElRODEzNDBTQywgIkludGVsIElRODEzNDBTQyIpCisJLyogTWFpbnRhaW5lcjogRGFuIFdpbGxpYW1zIDxkYW4uai53aWxsaWFtc0BpbnRlbC5jb20+ICovCisJLnBoeXNfaW8gICAgICAgID0gUEhZU19JTywKKwkuaW9fcGdfb2Zmc3QgICAgPSBJT19QR19PRkZTRVQsCisJLm1hcF9pbyAgICAgICAgID0gaW9wMTN4eF9tYXBfaW8sCisJLmluaXRfaXJxICAgICAgID0gaW9wMTN4eF9pbml0X2lycSwKKwkudGltZXIgICAgICAgICAgPSAmaXE4MTM0MHNjX3RpbWVyLAorCS5ib290X3BhcmFtcyAgICA9IEJPT1RfUEFSQU1fT0ZGU0VULAorCS5pbml0X21hY2hpbmUgICA9IGlxODEzNDBzY19pbml0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ5YzhjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lycS5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogaW9wMTN4eCBJUlEgaGFuZGxpbmcgLyBzdXBwb3J0IGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisgKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorCisvKiBJTlRDVEwwIENQNiBSMCBQYWdlIDQKKyAqLworc3RhdGljIGlubGluZSB1MzIgcmVhZF9pbnRjdGxfMCh2b2lkKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjMCwgYzQsIDAiOiI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfaW50Y3RsXzAodTMyIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGMwLCBjNCwgMCI6OiJyIiAodmFsKSk7Cit9CisKKy8qIElOVENUTDEgQ1A2IFIxIFBhZ2UgNAorICovCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX2ludGN0bF8xKHZvaWQpCit7CisJdTMyIHZhbDsKKwlhc20gdm9sYXRpbGUoIm1yYyBwNiwgMCwgJTAsIGMxLCBjNCwgMCI6Ij1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9pbnRjdGxfMSh1MzIgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzEsIGM0LCAwIjo6InIiICh2YWwpKTsKK30KKworLyogSU5UQ1RMMiBDUDYgUjIgUGFnZSA0CisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfaW50Y3RsXzIodm9pZCkKK3sKKwl1MzIgdmFsOworCWFzbSB2b2xhdGlsZSgibXJjIHA2LCAwLCAlMCwgYzIsIGM0LCAwIjoiPXIiICh2YWwpKTsKKwlyZXR1cm4gdmFsOworfQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2ludGN0bF8yKHUzMiB2YWwpCit7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUwLCBjMiwgYzQsIDAiOjoiciIgKHZhbCkpOworfQorCisvKiBJTlRDVEwzIENQNiBSMyBQYWdlIDQKKyAqLworc3RhdGljIGlubGluZSB1MzIgcmVhZF9pbnRjdGxfMyh2b2lkKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjMywgYzQsIDAiOiI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfaW50Y3RsXzModTMyIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGMzLCBjNCwgMCI6OiJyIiAodmFsKSk7Cit9CisKKy8qIElOVFNUUjAgQ1A2IFIwIFBhZ2UgNQorICovCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX2ludHN0cl8wKHZvaWQpCit7CisJdTMyIHZhbDsKKwlhc20gdm9sYXRpbGUoIm1yYyBwNiwgMCwgJTAsIGMwLCBjNSwgMCI6Ij1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9pbnRzdHJfMCh1MzIgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzAsIGM1LCAwIjo6InIiICh2YWwpKTsKK30KKworLyogSU5UU1RSMSBDUDYgUjEgUGFnZSA1CisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfaW50c3RyXzEodm9pZCkKK3sKKwl1MzIgdmFsOworCWFzbSB2b2xhdGlsZSgibXJjIHA2LCAwLCAlMCwgYzEsIGM1LCAwIjoiPXIiICh2YWwpKTsKKwlyZXR1cm4gdmFsOworfQorc3RhdGljIHZvaWQgd3JpdGVfaW50c3RyXzEodTMyIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGMxLCBjNSwgMCI6OiJyIiAodmFsKSk7Cit9CisKKy8qIElOVFNUUjIgQ1A2IFIyIFBhZ2UgNQorICovCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX2ludHN0cl8yKHZvaWQpCit7CisJdTMyIHZhbDsKKwlhc20gdm9sYXRpbGUoIm1yYyBwNiwgMCwgJTAsIGMyLCBjNSwgMCI6Ij1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KK3N0YXRpYyB2b2lkIHdyaXRlX2ludHN0cl8yKHUzMiB2YWwpCit7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUwLCBjMiwgYzUsIDAiOjoiciIgKHZhbCkpOworfQorCisvKiBJTlRTVFIzIENQNiBSMyBQYWdlIDUKKyAqLworc3RhdGljIGlubGluZSB1MzIgcmVhZF9pbnRzdHJfMyh2b2lkKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjMywgYzUsIDAiOiI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CitzdGF0aWMgdm9pZCB3cml0ZV9pbnRzdHJfMyh1MzIgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzMsIGM1LCAwIjo6InIiICh2YWwpKTsKK30KKworLyogSU5UQkFTRSBDUDYgUjAgUGFnZSAyCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfaW50YmFzZSh2b2lkKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjMCwgYzIsIDAiOiI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CitzdGF0aWMgdm9pZCB3cml0ZV9pbnRiYXNlKHUzMiB2YWwpCit7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDYsIDAsICUwLCBjMCwgYzIsIDAiOjoiciIgKHZhbCkpOworfQorCisvKiBJTlRTSVpFIENQNiBSMiBQYWdlIDIKKyAqLworc3RhdGljIGlubGluZSB1MzIgcmVhZF9pbnRzaXplKHZvaWQpCit7CisJdTMyIHZhbDsKKwlhc20gdm9sYXRpbGUoIm1yYyBwNiwgMCwgJTAsIGMyLCBjMiwgMCI6Ij1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KK3N0YXRpYyB2b2lkIHdyaXRlX2ludHNpemUodTMyIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGMyLCBjMiwgMCI6OiJyIiAodmFsKSk7Cit9CisKKy8qIDAgPSBJbnRlcnJ1cHQgTWFza2VkIGFuZCAxID0gSW50ZXJydXB0IG5vdCBtYXNrZWQgKi8KK3N0YXRpYyB2b2lkCitpb3AxM3h4X2lycV9tYXNrMCAodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgY3BfZmxhZ3MgPSBpb3AxM3h4X2NwNl9zYXZlKCk7CisJd3JpdGVfaW50Y3RsXzAocmVhZF9pbnRjdGxfMCgpICYgfigxIDw8IChpcnEgLSAwKSkpOworCWlvcDEzeHhfY3A2X3Jlc3RvcmUoY3BfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAoraW9wMTN4eF9pcnFfbWFzazEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIGNwX2ZsYWdzID0gaW9wMTN4eF9jcDZfc2F2ZSgpOworCXdyaXRlX2ludGN0bF8xKHJlYWRfaW50Y3RsXzEoKSAmIH4oMSA8PCAoaXJxIC0gMzIpKSk7CisJaW9wMTN4eF9jcDZfcmVzdG9yZShjcF9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitpb3AxM3h4X2lycV9tYXNrMiAodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgY3BfZmxhZ3MgPSBpb3AxM3h4X2NwNl9zYXZlKCk7CisJd3JpdGVfaW50Y3RsXzIocmVhZF9pbnRjdGxfMigpICYgfigxIDw8IChpcnEgLSA2NCkpKTsKKwlpb3AxM3h4X2NwNl9yZXN0b3JlKGNwX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2lvcDEzeHhfaXJxX21hc2szICh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiBjcF9mbGFncyA9IGlvcDEzeHhfY3A2X3NhdmUoKTsKKwl3cml0ZV9pbnRjdGxfMyhyZWFkX2ludGN0bF8zKCkgJiB+KDEgPDwgKGlycSAtIDk2KSkpOworCWlvcDEzeHhfY3A2X3Jlc3RvcmUoY3BfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAoraW9wMTN4eF9pcnFfdW5tYXNrMCh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiBjcF9mbGFncyA9IGlvcDEzeHhfY3A2X3NhdmUoKTsKKwl3cml0ZV9pbnRjdGxfMChyZWFkX2ludGN0bF8wKCkgfCAoMSA8PCAoaXJxIC0gMCkpKTsKKwlpb3AxM3h4X2NwNl9yZXN0b3JlKGNwX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2lvcDEzeHhfaXJxX3VubWFzazEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgY3BfZmxhZ3MgPSBpb3AxM3h4X2NwNl9zYXZlKCk7CisJd3JpdGVfaW50Y3RsXzEocmVhZF9pbnRjdGxfMSgpIHwgKDEgPDwgKGlycSAtIDMyKSkpOworCWlvcDEzeHhfY3A2X3Jlc3RvcmUoY3BfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAoraW9wMTN4eF9pcnFfdW5tYXNrMih1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiBjcF9mbGFncyA9IGlvcDEzeHhfY3A2X3NhdmUoKTsKKwl3cml0ZV9pbnRjdGxfMihyZWFkX2ludGN0bF8yKCkgfCAoMSA8PCAoaXJxIC0gNjQpKSk7CisJaW9wMTN4eF9jcDZfcmVzdG9yZShjcF9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitpb3AxM3h4X2lycV91bm1hc2szKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIGNwX2ZsYWdzID0gaW9wMTN4eF9jcDZfc2F2ZSgpOworCXdyaXRlX2ludGN0bF8zKHJlYWRfaW50Y3RsXzMoKSB8ICgxIDw8IChpcnEgLSA5NikpKTsKKwlpb3AxM3h4X2NwNl9yZXN0b3JlKGNwX2ZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGlvcDEzeHhfaXJxY2hpcDAgPSB7CisJLmFjayAgICA9IGlvcDEzeHhfaXJxX21hc2swLAorCS5tYXNrICAgPSBpb3AxM3h4X2lycV9tYXNrMCwKKwkudW5tYXNrID0gaW9wMTN4eF9pcnFfdW5tYXNrMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpb3AxM3h4X2lycWNoaXAxID0geworCS5hY2sgICAgPSBpb3AxM3h4X2lycV9tYXNrMSwKKwkubWFzayAgID0gaW9wMTN4eF9pcnFfbWFzazEsCisJLnVubWFzayA9IGlvcDEzeHhfaXJxX3VubWFzazEsCit9OworCitzdGF0aWMgc3RydWN0IGlycWNoaXAgaW9wMTN4eF9pcnFjaGlwMiA9IHsKKwkuYWNrICAgID0gaW9wMTN4eF9pcnFfbWFzazIsCisJLm1hc2sgICA9IGlvcDEzeHhfaXJxX21hc2syLAorCS51bm1hc2sgPSBpb3AxM3h4X2lycV91bm1hc2syLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIGlvcDEzeHhfaXJxY2hpcDMgPSB7CisJLmFjayAgICA9IGlvcDEzeHhfaXJxX21hc2szLAorCS5tYXNrICAgPSBpb3AxM3h4X2lycV9tYXNrMywKKwkudW5tYXNrID0gaW9wMTN4eF9pcnFfdW5tYXNrMywKK307CisKK3ZvaWQgX19pbml0IGlvcDEzeHhfaW5pdF9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXUzMiBjcF9mbGFncyA9IGlvcDEzeHhfY3A2X3NhdmUoKTsKKworCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwl3cml0ZV9pbnRjdGxfMCgwKTsKKwl3cml0ZV9pbnRjdGxfMSgwKTsKKwl3cml0ZV9pbnRjdGxfMigwKTsKKwl3cml0ZV9pbnRjdGxfMygwKTsKKworCS8qIHRyZWF0IGFsbCBhcyBJUlEgKi8KKwl3cml0ZV9pbnRzdHJfMCgwKTsKKwl3cml0ZV9pbnRzdHJfMSgwKTsKKwl3cml0ZV9pbnRzdHJfMigwKTsKKwl3cml0ZV9pbnRzdHJfMygwKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGludGVycnVwdCB2ZWN0b3IgZ2VuZXJhdG9yICovCisJd3JpdGVfaW50YmFzZShJTlRCQVNFKTsKKwl3cml0ZV9pbnRzaXplKElOVFNJWkVfNCk7CisKKwlmb3IoaSA9IDA7IGkgPCBOUl9JT1AxM1hYX0lSUVM7IGkrKykgeworCQlpZiAoaSA8IDMyKQorCQkJc2V0X2lycV9jaGlwKGksICZpb3AxM3h4X2lycWNoaXAwKTsKKwkJZWxzZSBpZiAoaSA8IDY0KQorCQkJc2V0X2lycV9jaGlwKGksICZpb3AxM3h4X2lycWNoaXAxKTsKKwkJZWxzZSBpZiAoaSA8IDk2KQorCQkJc2V0X2lycV9jaGlwKGksICZpb3AxM3h4X2lycWNoaXAyKTsKKwkJZWxzZQorCQkJc2V0X2lycV9jaGlwKGksICZpb3AxM3h4X2lycWNoaXAzKTsKKworCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJaW9wMTN4eF9jcDZfcmVzdG9yZShjcF9mbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllYzcwZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYwpAQCAtMCwwICsxLDExMTMgQEAKKy8qCisgKiBpb3AxM3h4IFBDSSBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9wY2kuaD4KKworI2RlZmluZSBJT1AxM1hYX1BDSV9ERUJVRyAwCisjZGVmaW5lIFBSSU5USyh4Li4uKSAoKHZvaWQpKElPUDEzWFhfUENJX0RFQlVHICYmIHByaW50ayh4KSkpCisKK3UzMiBpb3AxM3h4X2F0dXhfcG1tcl9vZmZzZXQ7IC8qIFRoaXMgb2Zmc2V0IGNhbiBjaGFuZ2UgYmFzZWQgb24gc3RyYXBwaW5nICovCit1MzIgaW9wMTN4eF9hdHVlX3BtbXJfb2Zmc2V0OyAvKiBUaGlzIG9mZnNldCBjYW4gY2hhbmdlIGJhc2VkIG9uIHN0cmFwcGluZyAqLworc3RhdGljIHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzX2F0dXggPSAwOworc3RhdGljIHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzX2F0dWUgPSAwOwordTMyIGlvcDEzeHhfYXR1ZV9tZW1fYmFzZTsKK3UzMiBpb3AxM3h4X2F0dXhfbWVtX2Jhc2U7CitzaXplX3QgaW9wMTN4eF9hdHVlX21lbV9zaXplOworc2l6ZV90IGlvcDEzeHhfYXR1eF9tZW1fc2l6ZTsKK3Vuc2lnbmVkIGxvbmcgaW9wMTN4eF9wY2liaW9zX21pbl9pbyA9IDA7Cit1bnNpZ25lZCBsb25nIGlvcDEzeHhfcGNpYmlvc19taW5fbWVtID0gMDsKKworRVhQT1JUX1NZTUJPTChpb3AxM3h4X2F0dWVfbWVtX2Jhc2UpOworRVhQT1JUX1NZTUJPTChpb3AxM3h4X2F0dXhfbWVtX2Jhc2UpOworRVhQT1JUX1NZTUJPTChpb3AxM3h4X2F0dWVfbWVtX3NpemUpOworRVhQT1JUX1NZTUJPTChpb3AxM3h4X2F0dXhfbWVtX3NpemUpOworCitpbnQgaW5pdF9hdHUgPSAwOyAvKiBGbGFnIHRvIHNlbGVjdCB3aGljaCBBVFUocykgdG8gaW5pdGlhbGl6ZSAvIGRpc2FibGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF0dXhfdHJoZmFfdGltZW91dCA9IDA7IC8qIFRyaGZhID0gUlNUIyBoaWdoIHRvIGZpcnN0CisJCQkJCQkgYWNjZXNzICovCisKKy8qIFNjYW4gdGhlIGluaXRpYWxpemVkIGJ1c3NlcyBhbmQgaW9yZW1hcCB0aGUgcmVxdWVzdGVkIG1lbW9yeSByYW5nZQorICovCit2b2lkIGlvcDEzeHhfbWFwX3BjaV9tZW1vcnkodm9pZCkKK3sKKwlpbnQgYXR1OworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlyZXNvdXJjZV9zaXplX3QgZW5kID0gMDsKKworCWZvciAoYXR1ID0gMDsgYXR1IDwgMjsgYXR1KyspIHsKKwkJYnVzID0gYXR1ID8gcGNpX2J1c19hdHVlIDogcGNpX2J1c19hdHV4OworCQlpZiAoYnVzKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJCQlpbnQgaTsKKwkJCQlpbnQgbWF4ID0gNzsKKworCQkJCWlmIChkZXYtPnN1Ym9yZGluYXRlKQorCQkJCQltYXggPSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCQkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKwkJCQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJCQkJCWVuZCA9IG1heChyZXMtPmVuZCwgZW5kKTsKKwkJCQl9CisJCQl9CisKKwkJCXN3aXRjaChhdHUpIHsKKwkJCWNhc2UgMDoKKwkJCQlpb3AxM3h4X2F0dXhfbWVtX3NpemUgPQorCQkJCQkoZW5kIC0gSU9QMTNYWF9QQ0lYX0xPV0VSX01FTV9SQSkgKyAxOworCisJCQkJLyogMTZNQiBhbGlnbiB0aGUgcmVxdWVzdCAqLworCQkJCWlmIChpb3AxM3h4X2F0dXhfbWVtX3NpemUgJiAoU1pfMTZNIC0gMSkpIHsKKwkJCQkJaW9wMTN4eF9hdHV4X21lbV9zaXplICY9IH4oU1pfMTZNIC0gMSk7CisJCQkJCWlvcDEzeHhfYXR1eF9tZW1fc2l6ZSArPSBTWl8xNk07CisJCQkJfQorCisJCQkJaWYgKGVuZCkgeworCQkJCQlpb3AxM3h4X2F0dXhfbWVtX2Jhc2UgPQorCQkJCQkodTMyKSBfX2lvcmVtYXBfcGZuKAorCQkJCQlfX3BoeXNfdG9fcGZuKElPUDEzWFhfUENJWF9MT1dFUl9NRU1fUEEpCisJCQkJCSwgMCwgaW9wMTN4eF9hdHV4X21lbV9zaXplLCAwKTsKKwkJCQkJaWYgKCFpb3AxM3h4X2F0dXhfbWVtX2Jhc2UpIHsKKwkJCQkJCXByaW50aygiJXM6IGF0dXggYWxsb2NhdGlvbiAiCisJCQkJCQkgICAgICAgImZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJCUJVRygpOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCWlvcDEzeHhfYXR1eF9tZW1fc2l6ZSA9IDA7CisJCQkJUFJJTlRLKCIlczogYXR1OiAlZCBidXNfc2l6ZTogJWQgbWVtX2Jhc2U6ICV4XG4iLAorCQkJCV9fRlVOQ1RJT05fXywgYXR1LCBpb3AxM3h4X2F0dXhfbWVtX3NpemUsCisJCQkJaW9wMTN4eF9hdHV4X21lbV9iYXNlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlpb3AxM3h4X2F0dWVfbWVtX3NpemUgPQorCQkJCQkoZW5kIC0gSU9QMTNYWF9QQ0lFX0xPV0VSX01FTV9SQSkgKyAxOworCisJCQkJLyogMTZNQiBhbGlnbiB0aGUgcmVxdWVzdCAqLworCQkJCWlmIChpb3AxM3h4X2F0dWVfbWVtX3NpemUgJiAoU1pfMTZNIC0gMSkpIHsKKwkJCQkJaW9wMTN4eF9hdHVlX21lbV9zaXplICY9IH4oU1pfMTZNIC0gMSk7CisJCQkJCWlvcDEzeHhfYXR1ZV9tZW1fc2l6ZSArPSBTWl8xNk07CisJCQkJfQorCisJCQkJaWYgKGVuZCkgeworCQkJCQlpb3AxM3h4X2F0dWVfbWVtX2Jhc2UgPQorCQkJCQkodTMyKSBfX2lvcmVtYXBfcGZuKAorCQkJCQlfX3BoeXNfdG9fcGZuKElPUDEzWFhfUENJRV9MT1dFUl9NRU1fUEEpCisJCQkJCSwgMCwgaW9wMTN4eF9hdHVlX21lbV9zaXplLCAwKTsKKwkJCQkJaWYgKCFpb3AxM3h4X2F0dWVfbWVtX2Jhc2UpIHsKKwkJCQkJCXByaW50aygiJXM6IGF0dWUgYWxsb2NhdGlvbiAiCisJCQkJCQkgICAgICAgImZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJCUJVRygpOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCWlvcDEzeHhfYXR1ZV9tZW1fc2l6ZSA9IDA7CisJCQkJUFJJTlRLKCIlczogYXR1OiAlZCBidXNfc2l6ZTogJWQgbWVtX2Jhc2U6ICV4XG4iLAorCQkJCV9fRlVOQ1RJT05fXywgYXR1LCBpb3AxM3h4X2F0dWVfbWVtX3NpemUsCisJCQkJaW9wMTN4eF9hdHVlX21lbV9iYXNlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHJpbnRrKCIlczogSW5pdGlhbGl6ZWQgKCV1TSBAIHJlc291cmNlL3ZpcnR1YWw6ICUwOGx4LyUwOHgpXG4iLAorCQkJYXR1ID8gIkFUVUUiIDogIkFUVVgiLAorCQkJKGF0dSA/IGlvcDEzeHhfYXR1ZV9tZW1fc2l6ZSA6IGlvcDEzeHhfYXR1eF9tZW1fc2l6ZSkgLworCQkJU1pfMU0sCisJCQlhdHUgPyBJT1AxM1hYX1BDSUVfTE9XRVJfTUVNX1JBIDoKKwkJCUlPUDEzWFhfUENJWF9MT1dFUl9NRU1fUkEsCisJCQlhdHUgPyBpb3AxM3h4X2F0dWVfbWVtX2Jhc2UgOgorCQkJaW9wMTN4eF9hdHV4X21lbV9iYXNlKTsKKwkJCWVuZCA9IDA7CisJCX0KKworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaW9wMTN4eF9hdHVfZnVuY3Rpb24oaW50IGF0dSkKK3sKKwlpbnQgZnVuYyA9IDA7CisJLyogdGhlIGZ1bmN0aW9uIG51bWJlciBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUKKwkgKiBJT1AxM1hYX0lOVEVSRkFDRV9TRUxfUENJWCByZXNldCBzdHJhcAorCSAqIHNlZSBDLVNwZWMgc2VjdGlvbiAzLjE3CisJICovCisJc3dpdGNoKGF0dSkgeworCWNhc2UgSU9QMTNYWF9JTklUX0FUVV9BVFVYOgorCQlpZiAoX19yYXdfcmVhZGwoSU9QMTNYWF9FU1NSMCkgJiBJT1AxM1hYX0lOVEVSRkFDRV9TRUxfUENJWCkKKwkJCWZ1bmMgPSA1OworCQllbHNlCisJCQlmdW5jID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJT1AxM1hYX0lOSVRfQVRVX0FUVUU6CisJCWlmIChfX3Jhd19yZWFkbChJT1AxM1hYX0VTU1IwKSAmIElPUDEzWFhfSU5URVJGQUNFX1NFTF9QQ0lYKQorCQkJZnVuYyA9IDA7CisJCWVsc2UKKwkJCWZ1bmMgPSA1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gZnVuYzsKK30KKworLyogaW9wMTN4eF9hdHV4X2NmZ19hZGRyZXNzIC0gZm9ybWF0IGEgY29uZmlndXJhdGlvbiBhZGRyZXNzIGZvciBhdHV4CisgKiBAYnVzOiBUYXJnZXQgYnVzIHRvIGFjY2VzcworICogQGRldmZuOiBDb21iaW5lZCBkZXZpY2UgbnVtYmVyIGFuZCBmdW5jdGlvbiBudW1iZXIKKyAqIEB3aGVyZTogRGVzaXJlZCByZWdpc3RlcidzIGFkZHJlc3Mgb2Zmc2V0CisgKgorICogQ29udmVydCB0aGUgcGFyYW1ldGVycyB0byBhIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyBmb3JtYXR0ZWQKKyAqIGFjY29yZGluZyB0aGUgUENJLVggMi4wIHNwZWNpZmljYXRpb24KKyAqLworc3RhdGljIHUzMiBpb3AxM3h4X2F0dXhfY2ZnX2FkZHJlc3Moc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuLCBpbnQgd2hlcmUpCit7CisJc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzID0gYnVzLT5zeXNkYXRhOworCXUzMiBhZGRyOworCisJaWYgKHN5cy0+YnVzbnIgPT0gYnVzLT5udW1iZXIpCisJCWFkZHIgPSAxIDw8IChQQ0lfU0xPVChkZXZmbikgKyAxNikgfCAoUENJX1NMT1QoZGV2Zm4pIDw8IDExKTsKKwllbHNlCisJCWFkZHIgPSBidXMtPm51bWJlciA8PCAxNiB8IFBDSV9TTE9UKGRldmZuKSA8PCAxMSB8IDE7CisKKwlhZGRyIHw9CVBDSV9GVU5DKGRldmZuKSA8PCA4IHwgKCh3aGVyZSAmIDB4ZmYpICYgfjMpOworCWFkZHIgfD0gKCh3aGVyZSAmIDB4ZjAwKSA+PiA4KSA8PCAyNDsgLyogdXBwZXIgcmVnaXN0ZXIgbnVtYmVyICovCisKKwlyZXR1cm4gYWRkcjsKK30KKworLyogaW9wMTN4eF9hdHVlX2NmZ19hZGRyZXNzIC0gZm9ybWF0IGEgY29uZmlndXJhdGlvbiBhZGRyZXNzIGZvciBhdHVlCisgKiBAYnVzOiBUYXJnZXQgYnVzIHRvIGFjY2VzcworICogQGRldmZuOiBDb21iaW5lZCBkZXZpY2UgbnVtYmVyIGFuZCBmdW5jdGlvbiBudW1iZXIKKyAqIEB3aGVyZTogRGVzaXJlZCByZWdpc3RlcidzIGFkZHJlc3Mgb2Zmc2V0CisgKgorICogQ29udmVydCB0aGUgcGFyYW1ldGVycyB0byBhbiBhZGRyZXNzIHVzYWJsZSBieSB0aGUgQVRVRV9PQ0NBUgorICovCitzdGF0aWMgdTMyIGlvcDEzeHhfYXR1ZV9jZmdfYWRkcmVzcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4sIGludCB3aGVyZSkKK3sKKwlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMgPSBidXMtPnN5c2RhdGE7CisJdTMyIGFkZHI7CisKKwlQUklOVEsoImlvcDEzeHhfYXR1ZV9jZmdfYWRkcmVzczogYnVzOiAlZCBkZXY6ICVkIGZ1bmM6ICVkIiwKKwkJYnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pKTsKKwlhZGRyID0gKCh1MzIpIGJ1cy0+bnVtYmVyKSAgICAgPDwgSU9QMTNYWF9BVFVFX09DQ0FSX0JVU19OVU0gfAorCQkgICAoKHUzMikgUENJX1NMT1QoZGV2Zm4pKSA8PCBJT1AxM1hYX0FUVUVfT0NDQVJfREVWX05VTSB8CisJCSAgICgodTMyKSBQQ0lfRlVOQyhkZXZmbikpIDw8IElPUDEzWFhfQVRVRV9PQ0NBUl9GVU5DX05VTSB8CisJCSAgICh3aGVyZSAmIH4weDMpOworCisJaWYgKHN5cy0+YnVzbnIgIT0gYnVzLT5udW1iZXIpCisJCWFkZHIgfD0gMTsgLyogdHlwZSAxIGFjY2VzcyAqLworCisJcmV0dXJuIGFkZHI7Cit9CisKKy8qIFRoaXMgcm91dGluZSBjaGVja3MgdGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBjb25maWd1cmF0aW9uIGN5Y2xlLiAgSWYgYW4gZXJyb3IKKyAqIHdhcyBkZXRlY3RlZCBpdCByZXR1cm5zID4wLCBlbHNlIGl0IHJldHVybnMgYSAwLiAgVGhlIGVycm9ycyBiZWluZyBjaGVja2VkCisgKiBhcmUgcGFyaXR5LCBtYXN0ZXIgYWJvcnQsIHRhcmdldCBhYm9ydCAobWFzdGVyIGFuZCB0YXJnZXQpLiAgVGhlc2UgdHlwZXMgb2YKKyAqIGVycm9ycyBvY2N1cmUgZHVyaW5nIGEgY29uZmlnIGN5Y2xlIHdoZXJlIHRoZXJlIGlzIG5vIGRldmljZSwgbGlrZSBkdXJpbmcKKyAqIHRoZSBkaXNjb3Zlcnkgc3RhZ2UuCisgKi8KK3N0YXRpYyBpbnQgaW9wMTN4eF9hdHV4X3BjaV9zdGF0dXMoaW50IGNsZWFyKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IGVyciA9IDA7CisKKwkvKgorCSAqIENoZWNrIHRoZSBzdGF0dXMgcmVnaXN0ZXJzLgorCSAqLworCXN0YXR1cyA9IF9fcmF3X3JlYWR3KElPUDEzWFhfQVRVWF9BVFVTUik7CisJaWYgKHN0YXR1cyAmIElPUF9QQ0lfU1RBVFVTX0VSUk9SKQorCXsKKwkJUFJJTlRLKCJcdFx0XHRQQ0kgZXJyb3I6IEFUVVNSICUjMDh4Iiwgc3RhdHVzKTsKKwkJaWYoY2xlYXIpCisJCQlfX3Jhd193cml0ZXcoc3RhdHVzICYgSU9QX1BDSV9TVEFUVVNfRVJST1IsCisJCQkJSU9QMTNYWF9BVFVYX0FUVVNSKTsKKwkJZXJyID0gMTsKKwl9CisJc3RhdHVzID0gX19yYXdfcmVhZGwoSU9QMTNYWF9BVFVYX0FUVUlTUik7CisJaWYgKHN0YXR1cyAmIElPUDEzWFhfQVRVWF9BVFVJU1JfRVJST1IpCisJeworCQlQUklOVEsoIlx0XHRcdFBDSSBlcnJvciBpbnRlcnJ1cHQ6ICBBVFVJU1IgJSMwOHgiLCBzdGF0dXMpOworCQlpZihjbGVhcikKKwkJCV9fcmF3X3dyaXRlbChzdGF0dXMgJiBJT1AxM1hYX0FUVVhfQVRVSVNSX0VSUk9SLAorCQkJCUlPUDEzWFhfQVRVWF9BVFVJU1IpOworCQllcnIgPSAxOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBTaW1wbHkgd3JpdGUgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgYW5kIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24KKyAqIGRhdGEuICBOb3RlIHRoYXQgdGhlIGRhdGEgZGVwZW5kZW5jeSBvbiAlMCBlbmNvdXJhZ2VzIGFuIGFib3J0CisgKiB0byBiZSBkZXRlY3RlZCBiZWZvcmUgd2UgcmV0dXJuLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBpb3AxM3h4X2F0dXhfcmVhZCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdTMyIHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkic3RyCSUxLCBbJTJdXG5cdCIKKwkJImxkcgklMCwgWyUzXVxuXHQiCisJCSJtb3YJJTAsICUwXG5cdCIKKwkJOiAiPXIiICh2YWwpCisJCTogInIiIChhZGRyKSwgInIiIChJT1AxM1hYX0FUVVhfT0NDQVIpLCAiciIgKElPUDEzWFhfQVRVWF9PQ0NEUikpOworCisJcmV0dXJuIHZhbDsKK30KKworLyogVGhlIHJlYWQgcm91dGluZXMgbXVzdCBjaGVjayB0aGUgZXJyb3Igc3RhdHVzIG9mIHRoZSBsYXN0IGNvbmZpZ3VyYXRpb24KKyAqIGN5Y2xlLiAgSWYgdGhlcmUgd2FzIGFuIGVycm9yLCB0aGUgcm91dGluZSByZXR1cm5zIGFsbCBoZXggZidzLgorICovCitzdGF0aWMgaW50Citpb3AxM3h4X2F0dXhfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsCisJCWludCBzaXplLCB1MzIgKnZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGlvcDEzeHhfYXR1eF9jZmdfYWRkcmVzcyhidXMsIGRldmZuLCB3aGVyZSk7CisJdTMyIHZhbCA9IGlvcDEzeHhfYXR1eF9yZWFkKGFkZHIpID4+ICgod2hlcmUgJiAzKSAqIDgpOworCisJaWYgKGlvcDEzeHhfYXR1eF9wY2lfc3RhdHVzKDEpIHx8IGlzX2F0dXhfb2NjZHJfZXJyb3IoKSkgeworCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoSU9QMTNYWF9YQkdfQkVDU1IpICYgMywKKwkJCUlPUDEzWFhfWEJHX0JFQ1NSKTsKKwkJdmFsID0gMHhmZmZmZmZmZjsKKwl9CisKKwkqdmFsdWUgPSB2YWw7CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50Citpb3AxM3h4X2F0dXhfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLAorCQlpbnQgc2l6ZSwgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGlvcDEzeHhfYXR1eF9jZmdfYWRkcmVzcyhidXMsIGRldmZuLCB3aGVyZSk7CisJdTMyIHZhbDsKKworCWlmIChzaXplICE9IDQpIHsKKwkJdmFsID0gaW9wMTN4eF9hdHV4X3JlYWQoYWRkcik7CisJCWlmICghaW9wMTN4eF9hdHV4X3BjaV9zdGF0dXMoMSkgPT0gMCkKKwkJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CisKKwkJd2hlcmUgPSAod2hlcmUgJiAzKSAqIDg7CisKKwkJaWYgKHNpemUgPT0gMSkKKwkJCXZhbCAmPSB+KDB4ZmYgPDwgd2hlcmUpOworCQllbHNlCisJCQl2YWwgJj0gfigweGZmZmYgPDwgd2hlcmUpOworCisJCV9fcmF3X3dyaXRlbCh2YWwgfCB2YWx1ZSA8PCB3aGVyZSwgSU9QMTNYWF9BVFVYX09DQ0RSKTsKKwl9IGVsc2UgeworCQlfX3Jhd193cml0ZWwoYWRkciwgSU9QMTNYWF9BVFVYX09DQ0FSKTsKKwkJX19yYXdfd3JpdGVsKHZhbHVlLCBJT1AxM1hYX0FUVVhfT0NDRFIpOworCX0KKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBpb3AxM3h4X2F0dXhfb3BzID0geworCS5yZWFkCT0gaW9wMTN4eF9hdHV4X3JlYWRfY29uZmlnLAorCS53cml0ZQk9IGlvcDEzeHhfYXR1eF93cml0ZV9jb25maWcsCit9OworCisvKiBUaGlzIHJvdXRpbmUgY2hlY2tzIHRoZSBzdGF0dXMgb2YgdGhlIGxhc3QgY29uZmlndXJhdGlvbiBjeWNsZS4gIElmIGFuIGVycm9yCisgKiB3YXMgZGV0ZWN0ZWQgaXQgcmV0dXJucyA+MCwgZWxzZSBpdCByZXR1cm5zIGEgMC4gIFRoZSBlcnJvcnMgYmVpbmcgY2hlY2tlZAorICogYXJlIHBhcml0eSwgbWFzdGVyIGFib3J0LCB0YXJnZXQgYWJvcnQgKG1hc3RlciBhbmQgdGFyZ2V0KS4gIFRoZXNlIHR5cGVzIG9mCisgKiBlcnJvcnMgb2NjdXJlIGR1cmluZyBhIGNvbmZpZyBjeWNsZSB3aGVyZSB0aGVyZSBpcyBubyBkZXZpY2UsIGxpa2UgZHVyaW5nCisgKiB0aGUgZGlzY292ZXJ5IHN0YWdlLgorICovCitzdGF0aWMgaW50IGlvcDEzeHhfYXR1ZV9wY2lfc3RhdHVzKGludCBjbGVhcikKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWludCBlcnIgPSAwOworCisJLyoKKwkgKiBDaGVjayB0aGUgc3RhdHVzIHJlZ2lzdGVycy4KKwkgKi8KKworCS8qIHN0YW5kYXJkIHBjaSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlzdGF0dXMgPSBfX3Jhd19yZWFkdyhJT1AxM1hYX0FUVUVfQVRVU1IpOworCWlmIChzdGF0dXMgJiBJT1BfUENJX1NUQVRVU19FUlJPUikgeworCQlQUklOVEsoIlx0XHRcdFBDSSBlcnJvcjogQVRVU1IgJSMwOHgiLCBzdGF0dXMpOworCQlpZihjbGVhcikKKwkJCV9fcmF3X3dyaXRldyhzdGF0dXMgJiBJT1BfUENJX1NUQVRVU19FUlJPUiwKKwkJCQlJT1AxM1hYX0FUVUVfQVRVU1IpOworCQllcnIrKzsKKwl9CisKKwkvKiBjaGVjayB0aGUgbm9ybWFsIHN0YXR1cyBiaXRzIGluIHRoZSBBVFVJU1IgKi8KKwlzdGF0dXMgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVUVfQVRVSVNSKTsKKwlpZiAoc3RhdHVzICYgSU9QMTNYWF9BVFVFX0FUVUlTUl9FUlJPUikJeworCQlQUklOVEsoIlx0XHRcdFBDSSBlcnJvcjogQVRVSVNSICUjMDh4Iiwgc3RhdHVzKTsKKwkJaWYgKGNsZWFyKQorCQkJX19yYXdfd3JpdGV3KHN0YXR1cyAmIElPUDEzWFhfQVRVRV9BVFVJU1JfRVJST1IsCisJCQkJSU9QMTNYWF9BVFVFX0FUVUlTUik7CisJCWVycisrOworCisJCS8qIGNoZWNrIHRoZSBQQ0ktRSBzdGF0dXMgaWYgdGhlIEFUVUlTUiByZXBvcnRzIGFuIGludGVyZmFjZSBlcnJvciAqLworCQlpZiAoc3RhdHVzICYgSU9QMTNYWF9BVFVFX1NUQVRfUENJX0lGQUNFX0VSUikgeworCQkJLyogZ2V0IHRoZSB1bm1hc2tlZCBlcnJvcnMgKi8KKwkJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9QSUVfU1RTKSAmCisJCQkJCX4oX19yYXdfcmVhZGwoSU9QMTNYWF9BVFVFX1BJRV9NU0spKTsKKworCQkJaWYgKHN0YXR1cykgeworCQkJCVBSSU5USygiXHRcdFx0UENJLUUgZXJyb3I6IEFUVUVfUElFX1NUUyAlIzA4eCIsCisJCQkJCV9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9QSUVfU1RTKSk7CisJCQkJZXJyKys7CisJCQl9IGVsc2UgeworCQkJCVBSSU5USygiXHRcdFx0UENJLUUgZXJyb3I6IEFUVUVfUElFX1NUUyAlIzA4eCIsCisJCQkJCV9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9QSUVfU1RTKSk7CisJCQkJUFJJTlRLKCJcdFx0XHRQQ0ktRSBlcnJvcjogQVRVRV9QSUVfTVNLICUjMDh4IiwKKwkJCQkJX19yYXdfcmVhZGwoSU9QMTNYWF9BVFVFX1BJRV9NU0spKTsKKwkJCQlCVUcoKTsKKwkJCX0KKworCQkJaWYoY2xlYXIpCisJCQkJX19yYXdfd3JpdGVsKHN0YXR1cywgSU9QMTNYWF9BVFVFX1BJRV9TVFMpOworCQl9CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19pbml0Citpb3AxM3h4X3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBpZHNlbCwgdTggcGluKQoreworCVdBUk5fT04oaWRzZWwgIT0gMCk7CisKKwlzd2l0Y2ggKHBpbikgeworCWNhc2UgMTogcmV0dXJuIEFUVUVfSU5UQTsKKwljYXNlIDI6IHJldHVybiBBVFVFX0lOVEI7CisJY2FzZSAzOiByZXR1cm4gQVRVRV9JTlRDOworCWNhc2UgNDogcmV0dXJuIEFUVUVfSU5URDsKKwlkZWZhdWx0OiByZXR1cm4gLTE7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHUzMiBpb3AxM3h4X2F0dWVfcmVhZCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdTMyIHZhbDsKKworCV9fcmF3X3dyaXRlbChhZGRyLCBJT1AxM1hYX0FUVUVfT0NDQVIpOworCXZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9PQ0NEUik7CisKKwlybWIoKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qIFRoZSByZWFkIHJvdXRpbmVzIG11c3QgY2hlY2sgdGhlIGVycm9yIHN0YXR1cyBvZiB0aGUgbGFzdCBjb25maWd1cmF0aW9uCisgKiBjeWNsZS4gIElmIHRoZXJlIHdhcyBhbiBlcnJvciwgdGhlIHJvdXRpbmUgcmV0dXJucyBhbGwgaGV4IGYncy4KKyAqLworc3RhdGljIGludAoraW9wMTN4eF9hdHVlX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLAorCQlpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKK3sKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGlvcDEzeHhfYXR1ZV9jZmdfYWRkcmVzcyhidXMsIGRldmZuLCB3aGVyZSk7CisKKwkvKiBIaWRlIGRldmljZSBudW1iZXJzID4gMCBvbiB0aGUgbG9jYWwgUENJLUUgYnVzIChUeXBlIDAgYWNjZXNzKSAqLworCWlmICghUENJX1NMT1QoZGV2Zm4pIHx8IChhZGRyICYgMSkpIHsKKwkJdmFsID0gaW9wMTN4eF9hdHVlX3JlYWQoYWRkcikgPj4gKCh3aGVyZSAmIDMpICogOCk7CisJCWlmKCBpb3AxM3h4X2F0dWVfcGNpX3N0YXR1cygxKSB8fCBpc19hdHVlX29jY2RyX2Vycm9yKCkgKSB7CisJCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoSU9QMTNYWF9YQkdfQkVDU1IpICYgMywKKwkJCQlJT1AxM1hYX1hCR19CRUNTUik7CisJCQl2YWwgPSAweGZmZmZmZmZmOworCQl9CisKKwkJUFJJTlRLKCJhZGRyPSUjMGx4LCB2YWw9JSMwMTB4IiwgYWRkciwgdmFsKTsKKwl9IGVsc2UKKwkJdmFsID0gMHhmZmZmZmZmZjsKKworCSp2YWx1ZSA9IHZhbDsKKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQKK2lvcDEzeHhfYXR1ZV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsCisJCWludCBzaXplLCB1MzIgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gaW9wMTN4eF9hdHVlX2NmZ19hZGRyZXNzKGJ1cywgZGV2Zm4sIHdoZXJlKTsKKwl1MzIgdmFsOworCisJaWYgKHNpemUgIT0gNCkgeworCQl2YWwgPSBpb3AxM3h4X2F0dWVfcmVhZChhZGRyKTsKKwkJaWYgKCFpb3AxM3h4X2F0dWVfcGNpX3N0YXR1cygxKSA9PSAwKQorCQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKKworCQl3aGVyZSA9ICh3aGVyZSAmIDMpICogODsKKworCQlpZiAoc2l6ZSA9PSAxKQorCQkJdmFsICY9IH4oMHhmZiA8PCB3aGVyZSk7CisJCWVsc2UKKwkJCXZhbCAmPSB+KDB4ZmZmZiA8PCB3aGVyZSk7CisKKwkJX19yYXdfd3JpdGVsKHZhbCB8IHZhbHVlIDw8IHdoZXJlLCBJT1AxM1hYX0FUVUVfT0NDRFIpOworCX0gZWxzZSB7CisJCV9fcmF3X3dyaXRlbChhZGRyLCBJT1AxM1hYX0FUVUVfT0NDQVIpOworCQlfX3Jhd193cml0ZWwodmFsdWUsIElPUDEzWFhfQVRVRV9PQ0NEUik7CisJfQorCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIGlvcDEzeHhfYXR1ZV9vcHMgPSB7CisJLnJlYWQJPSBpb3AxM3h4X2F0dWVfcmVhZF9jb25maWcsCisJLndyaXRlCT0gaW9wMTN4eF9hdHVlX3dyaXRlX2NvbmZpZywKK307CisKKy8qIFdoZW4gYSBQQ0kgZGV2aWNlIGRvZXMgbm90IGV4aXN0IGR1cmluZyBjb25maWcgY3ljbGVzLCB0aGUgWFNjYWxlIGdldHMgYQorICogYnVzIGVycm9yIGluc3RlYWQgb2YgcmV0dXJuaW5nIDB4ZmZmZmZmZmYuICBXZSBjYW4ndCByZWx5IG9uIHRoZSBBVFUgc3RhdHVzCisgKiBiaXRzIHRvIHRlbGwgdXMgdGhhdCBpdCB3YXMgaW5kZWVkIGEgY29uZmlndXJhdGlvbiBjeWNsZSB0aGF0IGNhdXNlZCB0aGlzCisgKiBlcnJvciBlc3BlY2lhbGx5IGluIHRoZSBjYXNlIHdoZW4gdGhlIEFUVUUgbGluayBpcyBkb3duLiAgSW5zdGVhZCB3ZSByZWx5CisgKiBvbiBkYXRhIGZyb20gdGhlIHNvdXRoIFhTSSBicmlkZ2UgdG8gdmFsaWRhdGUgdGhlIGFib3J0CisgKi8KK2ludAoraW9wMTN4eF9wY2lfYWJvcnQodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZnNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlQUklOVEsoIkRhdGEgYWJvcnQ6IGFkZHJlc3MgPSAweCUwOGx4ICIKKwkJICAgICJmc3IgPSAweCUwM3ggUEMgPSAweCUwOGx4IExSID0gMHglMDhseCIsCisJCWFkZHIsIGZzciwgcmVncy0+QVJNX3BjLCByZWdzLT5BUk1fbHIpOworCisJUFJJTlRLKCJJT1AxM1hYX1hCR19CRUNTUjogJSMxMHgiLCBfX3Jhd19yZWFkbChJT1AxM1hYX1hCR19CRUNTUikpOworCVBSSU5USygiSU9QMTNYWF9YQkdfQkVSQVI6ICUjMTB4IiwgX19yYXdfcmVhZGwoSU9QMTNYWF9YQkdfQkVSQVIpKTsKKwlQUklOVEsoIklPUDEzWFhfWEJHX0JFUlVBUjogJSMxMHgiLCBfX3Jhd19yZWFkbChJT1AxM1hYX1hCR19CRVJVQVIpKTsKKworCS8qICBJZiBpdCB3YXMgYW4gaW1wcmVjaXNlIGFib3J0LCB0aGVuIHdlIG5lZWQgdG8gY29ycmVjdCB0aGUKKwkgKiAgcmV0dXJuIGFkZHJlc3MgdG8gYmUgX2FmdGVyXyB0aGUgaW5zdHJ1Y3Rpb24uCisJICovCisJaWYgKGZzciAmICgxIDw8IDEwKSkKKwkJcmVncy0+QVJNX3BjICs9IDQ7CisKKwlpZiAoaXNfYXR1ZV9vY2Nkcl9lcnJvcigpIHx8IGlzX2F0dXhfb2NjZHJfZXJyb3IoKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworLyogU2NhbiBhbiBJT1AxM1hYIFBDSSBidXMuICBuciBzZWxlY3RzIHdoaWNoIEFUVSB3ZSB1c2UuCisgKi8KK3N0cnVjdCBwY2lfYnVzICppb3AxM3h4X3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQoreworCWludCB3aGljaF9hdHU7CisJc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisKKwlzd2l0Y2ggKGluaXRfYXR1KSB7CisJY2FzZSBJT1AxM1hYX0lOSVRfQVRVX0FUVVg6CisJCXdoaWNoX2F0dSA9IG5yID8gMCA6IElPUDEzWFhfSU5JVF9BVFVfQVRVWDsKKwkJYnJlYWs7CisJY2FzZSBJT1AxM1hYX0lOSVRfQVRVX0FUVUU6CisJCXdoaWNoX2F0dSA9IG5yID8gMCA6IElPUDEzWFhfSU5JVF9BVFVfQVRVRTsKKwkJYnJlYWs7CisJY2FzZSAoSU9QMTNYWF9JTklUX0FUVV9BVFVYIHwgSU9QMTNYWF9JTklUX0FUVV9BVFVFKToKKwkJd2hpY2hfYXR1ID0gbnIgPyBJT1AxM1hYX0lOSVRfQVRVX0FUVUUgOiBJT1AxM1hYX0lOSVRfQVRVX0FUVVg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXdoaWNoX2F0dSA9IDA7CisJfQorCisJaWYgKCF3aGljaF9hdHUpIHsKKwkJQlVHKCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAod2hpY2hfYXR1KSB7CisJY2FzZSBJT1AxM1hYX0lOSVRfQVRVX0FUVVg6CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApLAorCQkJCSAgYXR1eF90cmhmYV90aW1lb3V0KSkgIC8qIGVuc3VyZSBub3Qgd3JhcCAqLworCQkJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgYXR1eF90cmhmYV90aW1lb3V0KSkKKwkJCQl1ZGVsYXkoMTAwKTsKKworCQlidXMgPSBwY2lfYnVzX2F0dXggPSBwY2lfc2Nhbl9idXMoc3lzLT5idXNuciwKKwkJCQkJCSAgJmlvcDEzeHhfYXR1eF9vcHMsCisJCQkJCQkgIHN5cyk7CisJCWJyZWFrOworCWNhc2UgSU9QMTNYWF9JTklUX0FUVV9BVFVFOgorCQlidXMgPSBwY2lfYnVzX2F0dWUgPSBwY2lfc2Nhbl9idXMoc3lzLT5idXNuciwKKwkJCQkJCSAgJmlvcDEzeHhfYXR1ZV9vcHMsCisJCQkJCQkgIHN5cyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBidXM7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gaW9wMTN4eF9wY2lfaW5pdCgpIGFmdGVyIGFzc2lnbmluZyB2YWxpZAorICogdmFsdWVzIHRvIGlvcDEzeHhfYXR1ZV9wbW1yX29mZnNldC4gIFRoaXMgaXMgdGhlIGxvY2F0aW9uIGZvciBjb21tb24KKyAqIHNldHVwIG9mIEFUVUUgZm9yIGFsbCBJT1AxM1hYIGltcGxlbWVudGF0aW9ucy4KKyAqLwordm9pZCBfX2luaXQgaW9wMTN4eF9hdHVlX3NldHVwKHZvaWQpCit7CisJaW50IGZ1bmMgPSBpb3AxM3h4X2F0dV9mdW5jdGlvbihJT1AxM1hYX0lOSVRfQVRVX0FUVUUpOworCXUzMiByZWdfdmFsOworCisJLyogQkFSIDEgKDE6MSBtYXBwaW5nIHdpdGggUGh5c2ljYWwgUkFNKSAqLworCS8qIFNldCBsaW1pdCBhbmQgZW5hYmxlICovCisJX19yYXdfd3JpdGVsKH4oSU9QMTNYWF9NQVhfUkFNX1NJWkUgLSBQSFlTX09GRlNFVCAtIDEpICYgfjB4MSwKKwkJCUlPUDEzWFhfQVRVRV9JQUxSMSk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVFX0lBVUJBUjEpOworCisJLyogU2V0IGJhc2UgYXQgdGhlIHRvcCBvZiB0aGUgcmVzZXJ2ZWQgYWRkcmVzcyBzcGFjZSAqLworCV9fcmF3X3dyaXRlbChQSFlTX09GRlNFVCB8IFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQgfAorCQkJUENJX0JBU0VfQUREUkVTU19NRU1fUFJFRkVUQ0gsIElPUDEzWFhfQVRVRV9JQUJBUjEpOworCisJLyogMToxIG1hcHBpbmcgd2l0aCBwaHlzaWNhbCByYW0KKwkgKiAobGVhdmUgYmlnIGVuZGlhbiBieXRlIHN3YXAgZGlzYWJsZWQpCisJICovCisJIF9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVRV9JQVVUVlIxKTsKKwkgX19yYXdfd3JpdGVsKFBIWVNfT0ZGU0VULCBJT1AxM1hYX0FUVUVfSUFUVlIxKTsKKworCS8qIE91dGJvdW5kIHdpbmRvdyAxIChQQ0lYL1BDSUUgbWVtb3J5IHdpbmRvdykgKi8KKwkvKiAzMiBiaXQgQWRkcmVzcyBTcGFjZSAqLworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVRV9PVU1XVFZSMSk7CisJLyogUEFbMzU6MzJdICovCisJX19yYXdfd3JpdGVsKElPUDEzWFhfQVRVRV9PVU1CQVJfRU5BQkxFIHwKKwkJCShJT1AxM1hYX1BDSUVfTUVNX1BIWVNfT0ZGU0VUID4+IDMyKSwKKwkJCUlPUDEzWFhfQVRVRV9PVU1CQVIxKTsKKworCS8qIFNldHVwIHRoZSBJL08gQmFyCisJICogQVszNS0xNl0gaW4gMzEtMTIKKwkgKi8KKwlfX3Jhd193cml0ZWwoKChJT1AxM1hYX1BDSUVfTE9XRVJfSU9fUEEgPj4gMHg0KSAmIDB4ZmZmZmYwMDApLAorCQlJT1AxM1hYX0FUVUVfT0lPQkFSKTsKKwlfX3Jhd193cml0ZWwoSU9QMTNYWF9QQ0lFX0xPV0VSX0lPX0JBLCBJT1AxM1hYX0FUVUVfT0lPV1RWUik7CisKKwkvKiBjbGVhciBzdGFydHVwIGVycm9ycyAqLworCWlvcDEzeHhfYXR1ZV9wY2lfc3RhdHVzKDEpOworCisJLyogT0lPQkFSIGZ1bmN0aW9uIG51bWJlcgorCSAqLworCXJlZ192YWwgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVUVfT0lPQkFSKTsKKwlyZWdfdmFsICY9IH4weDc7CisJcmVnX3ZhbCB8PSBmdW5jOworCV9fcmF3X3dyaXRlbChyZWdfdmFsLCBJT1AxM1hYX0FUVUVfT0lPQkFSKTsKKworCS8qIE9VTUJBUiBmdW5jdGlvbiBudW1iZXJzCisJICovCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9PVU1CQVIwKTsKKwlyZWdfdmFsICY9IH4oSU9QMTNYWF9BVFVfT1VNQkFSX0ZVTkNfTlVNX01BU0sgPDwKKwkJCUlPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTSk7CisJcmVnX3ZhbCB8PSBmdW5jIDw8IElPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVFX09VTUJBUjApOworCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9PVU1CQVIxKTsKKwlyZWdfdmFsICY9IH4oSU9QMTNYWF9BVFVfT1VNQkFSX0ZVTkNfTlVNX01BU0sgPDwKKwkJCUlPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTSk7CisJcmVnX3ZhbCB8PSBmdW5jIDw8IElPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVFX09VTUJBUjEpOworCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9PVU1CQVIyKTsKKwlyZWdfdmFsICY9IH4oSU9QMTNYWF9BVFVfT1VNQkFSX0ZVTkNfTlVNX01BU0sgPDwKKwkJCUlPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTSk7CisJcmVnX3ZhbCB8PSBmdW5jIDw8IElPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVFX09VTUJBUjIpOworCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9PVU1CQVIzKTsKKwlyZWdfdmFsICY9IH4oSU9QMTNYWF9BVFVfT1VNQkFSX0ZVTkNfTlVNX01BU0sgPDwKKwkJCUlPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTSk7CisJcmVnX3ZhbCB8PSBmdW5jIDw8IElPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVFX09VTUJBUjMpOworCisJLyogRW5hYmxlIGluYm91bmQgYW5kIG91dGJvdW5kIGN5Y2xlcworCSAqLworCXJlZ192YWwgPSBfX3Jhd19yZWFkdyhJT1AxM1hYX0FUVUVfQVRVQ01EKTsKKwlyZWdfdmFsIHw9IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUiB8CisJCQlQQ0lfQ09NTUFORF9QQVJJVFkgfCBQQ0lfQ09NTUFORF9TRVJSOworCV9fcmF3X3dyaXRldyhyZWdfdmFsLCBJT1AxM1hYX0FUVUVfQVRVQ01EKTsKKworCXJlZ192YWwgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVUVfQVRVQ1IpOworCXJlZ192YWwgfD0gSU9QMTNYWF9BVFVFX0FUVUNSX09VVF9FTiB8CisJCQlJT1AxM1hYX0FUVUVfQVRVQ1JfSVZNOworCV9fcmF3X3dyaXRlbChyZWdfdmFsLCBJT1AxM1hYX0FUVUVfQVRVQ1IpOworfQorCit2b2lkIF9faW5pdCBpb3AxM3h4X2F0dWVfZGlzYWJsZSh2b2lkKQoreworCXUzMiByZWdfdmFsOworCisJX19yYXdfd3JpdGV3KDB4MCwgSU9QMTNYWF9BVFVFX0FUVUNNRCk7CisJX19yYXdfd3JpdGVsKElPUDEzWFhfQVRVRV9BVFVDUl9JVk0sIElPUDEzWFhfQVRVRV9BVFVDUik7CisKKwkvKiB3YWl0IGZvciBjeWNsZXMgdG8gcXVpZXNjZSAqLworCXdoaWxlIChfX3Jhd19yZWFkbChJT1AxM1hYX0FUVUVfUENTUikgJiAoSU9QMTNYWF9BVFVFX1BDU1JfT1VUX1FfQlVTWSB8CisJCQkJCSAgICAgSU9QMTNYWF9BVFVFX1BDU1JfSU5fUV9CVVNZIHwKKwkJCQkJICAgICBJT1AxM1hYX0FUVUVfUENTUl9MTFJCX0JVU1kpKQorCQljcHVfcmVsYXgoKTsKKworCS8qIEJBUiAwICggRGlzYWJsZWQgKSAqLworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVRV9JQVVCQVIwKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVUVfSUFCQVIwKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVUVfSUFVVFZSMCk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVFX0lBVFZSMCk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVFX0lBTFIwKTsKKwlyZWdfdmFsID0gX19yYXdfcmVhZGwoSU9QMTNYWF9BVFVFX09VTUJBUjApOworCXJlZ192YWwgJj0gfklPUDEzWFhfQVRVRV9PVU1CQVJfRU5BQkxFOworCV9fcmF3X3dyaXRlbChyZWdfdmFsLCBJT1AxM1hYX0FUVUVfT1VNQkFSMCk7CisKKwkvKiBCQVIgMSAoIERpc2FibGVkICkgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVUVfSUFVQkFSMSk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVFX0lBQkFSMSk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVFX0lBVVRWUjEpOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVRV9JQVRWUjEpOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVRV9JQUxSMSk7CisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9PVU1CQVIxKTsKKwlyZWdfdmFsICY9IH5JT1AxM1hYX0FUVUVfT1VNQkFSX0VOQUJMRTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVFX09VTUJBUjEpOworCisJLyogQkFSIDIgKCBEaXNhYmxlZCApICovCisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVFX0lBVUJBUjIpOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVRV9JQUJBUjIpOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVRV9JQVVUVlIyKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVUVfSUFUVlIyKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVUVfSUFMUjIpOworCXJlZ192YWwgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVUVfT1VNQkFSMik7CisJcmVnX3ZhbCAmPSB+SU9QMTNYWF9BVFVFX09VTUJBUl9FTkFCTEU7CisJX19yYXdfd3JpdGVsKHJlZ192YWwsIElPUDEzWFhfQVRVRV9PVU1CQVIyKTsKKworCS8qIEJBUiAzICggRGlzYWJsZWQgKSAqLworCXJlZ192YWwgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVUVfT1VNQkFSMyk7CisJcmVnX3ZhbCAmPSB+SU9QMTNYWF9BVFVFX09VTUJBUl9FTkFCTEU7CisJX19yYXdfd3JpdGVsKHJlZ192YWwsIElPUDEzWFhfQVRVRV9PVU1CQVIzKTsKKworCS8qIFNldHVwIHRoZSBJL08gQmFyCisJICogQVszNS0xNl0gaW4gMzEtMTIKKwkgKi8KKwlfX3Jhd193cml0ZWwoKElPUDEzWFhfUENJRV9MT1dFUl9JT19QQSA+PiAweDQpICYgMHhmZmZmZjAwMCwKKwkJCUlPUDEzWFhfQVRVRV9PSU9CQVIpOworCV9fcmF3X3dyaXRlbChJT1AxM1hYX1BDSUVfTE9XRVJfSU9fQkEsIElPUDEzWFhfQVRVRV9PSU9XVFZSKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBpb3AxM3h4X3BjaV9pbml0KCkgYWZ0ZXIgYXNzaWduaW5nIHZhbGlkCisgKiB2YWx1ZXMgdG8gaW9wMTN4eF9hdHV4X3BtbXJfb2Zmc2V0LiAgVGhpcyBpcyB0aGUgbG9jYXRpb24gZm9yIGNvbW1vbgorICogc2V0dXAgb2YgQVRVWCBmb3IgYWxsIElPUDEzWFggaW1wbGVtZW50YXRpb25zLgorICovCit2b2lkIF9faW5pdCBpb3AxM3h4X2F0dXhfc2V0dXAodm9pZCkKK3sKKwl1MzIgcmVnX3ZhbDsKKwlpbnQgZnVuYyA9IGlvcDEzeHhfYXR1X2Z1bmN0aW9uKElPUDEzWFhfSU5JVF9BVFVfQVRVWCk7CisKKwkvKiBUYWtlIFBDSS1YIGJ1cyBvdXQgb2YgcmVzZXQgaWYgYm9vdGxvYWRlciBoYXNuJ3QgYWxyZWFkeS4KKwkgKiBBY2NvcmRpbmcgdG8gc3BlYywgd2Ugc2hvdWxkIHdhaXQgZm9yIDJeMjUgUENJIGNsb2NrcyB0byBtZWV0CisJICogdGhlIFBDSSB0aW1pbmcgcGFyYW1ldGVyIFRyaGZhIChSU1QjIGhpZ2ggdG8gZmlyc3QgYWNjZXNzKS4KKwkgKiBUaGlzIGlzIHJhcmVseSBuZWNlc3NhcnkgYW5kIG9mdGVuIGlnbm9yZWQuCisJICovCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVWF9QQ1NSKTsKKwlpZiAocmVnX3ZhbCAmIElPUDEzWFhfQVRVWF9QQ1NSX1BfUlNUT1VUKSB7CisJCWludCBtc2VjID0gKHJlZ192YWwgPj4gSU9QMTNYWF9BVFVYX1BDU1JfRlJFUV9PRkZTRVQpICYgMHg3OworCQltc2VjID0gMTAwMCAvICg4LW1zZWMpOyAvKiBiaXRzIDEwMD0xMzNNSHosIDExMT0+MzNNSHogKi8KKwkJX19yYXdfd3JpdGVsKHJlZ192YWwgJiB+SU9QMTNYWF9BVFVYX1BDU1JfUF9SU1RPVVQsCisJCQkJSU9QMTNYWF9BVFVYX1BDU1IpOworCQlhdHV4X3RyaGZhX3RpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtc2VjKTsKKwl9CisJZWxzZQorCQlhdHV4X3RyaGZhX3RpbWVvdXQgPSBqaWZmaWVzOworCisJLyogQkFSIDEgKDE6MSBtYXBwaW5nIHdpdGggUGh5c2ljYWwgUkFNKSAqLworCS8qIFNldCBsaW1pdCBhbmQgZW5hYmxlICovCisJX19yYXdfd3JpdGVsKH4oSU9QMTNYWF9NQVhfUkFNX1NJWkUgLSBQSFlTX09GRlNFVCAtIDEpICYgfjB4MSwKKwkJCUlPUDEzWFhfQVRVWF9JQUxSMSk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBVUJBUjEpOworCisJLyogU2V0IGJhc2UgYXQgdGhlIHRvcCBvZiB0aGUgcmVzZXJ2ZWQgYWRkcmVzcyBzcGFjZSAqLworCV9fcmF3X3dyaXRlbChQSFlTX09GRlNFVCB8IFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQgfAorCQkJUENJX0JBU0VfQUREUkVTU19NRU1fUFJFRkVUQ0gsIElPUDEzWFhfQVRVWF9JQUJBUjEpOworCisJLyogMToxIG1hcHBpbmcgd2l0aCBwaHlzaWNhbCByYW0KKwkgKiAobGVhdmUgYmlnIGVuZGlhbiBieXRlIHN3YXAgZGlzYWJsZWQpCisJICovCisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBVVRWUjEpOworCV9fcmF3X3dyaXRlbChQSFlTX09GRlNFVCwgSU9QMTNYWF9BVFVYX0lBVFZSMSk7CisKKwkvKiBPdXRib3VuZCB3aW5kb3cgMSAoUENJWC9QQ0lFIG1lbW9yeSB3aW5kb3cpICovCisJLyogMzIgYml0IEFkZHJlc3MgU3BhY2UgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVVhfT1VNV1RWUjEpOworCS8qIFBBWzM1OjMyXSAqLworCV9fcmF3X3dyaXRlbChJT1AxM1hYX0FUVVhfT1VNQkFSX0VOQUJMRSB8CisJCQlJT1AxM1hYX1BDSVhfTUVNX1BIWVNfT0ZGU0VUID4+IDMyLAorCQkJSU9QMTNYWF9BVFVYX09VTUJBUjEpOworCisJLyogU2V0dXAgdGhlIEkvTyBCYXIKKwkgKiBBWzM1LTE2XSBpbiAzMS0xMgorCSAqLworCV9fcmF3X3dyaXRlbCgoSU9QMTNYWF9QQ0lYX0xPV0VSX0lPX1BBID4+IDB4NCkgJiAweGZmZmZmMDAwLAorCQlJT1AxM1hYX0FUVVhfT0lPQkFSKTsKKwlfX3Jhd193cml0ZWwoSU9QMTNYWF9QQ0lYX0xPV0VSX0lPX0JBLCBJT1AxM1hYX0FUVVhfT0lPV1RWUik7CisKKwkvKiBjbGVhciBzdGFydHVwIGVycm9ycyAqLworCWlvcDEzeHhfYXR1eF9wY2lfc3RhdHVzKDEpOworCisJLyogT0lPQkFSIGZ1bmN0aW9uIG51bWJlcgorCSAqLworCXJlZ192YWwgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVVhfT0lPQkFSKTsKKwlyZWdfdmFsICY9IH4weDc7CisJcmVnX3ZhbCB8PSBmdW5jOworCV9fcmF3X3dyaXRlbChyZWdfdmFsLCBJT1AxM1hYX0FUVVhfT0lPQkFSKTsKKworCS8qIE9VTUJBUiBmdW5jdGlvbiBudW1iZXJzCisJICovCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVWF9PVU1CQVIwKTsKKwlyZWdfdmFsICY9IH4oSU9QMTNYWF9BVFVfT1VNQkFSX0ZVTkNfTlVNX01BU0sgPDwKKwkJCUlPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTSk7CisJcmVnX3ZhbCB8PSBmdW5jIDw8IElPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVYX09VTUJBUjApOworCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVWF9PVU1CQVIxKTsKKwlyZWdfdmFsICY9IH4oSU9QMTNYWF9BVFVfT1VNQkFSX0ZVTkNfTlVNX01BU0sgPDwKKwkJCUlPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTSk7CisJcmVnX3ZhbCB8PSBmdW5jIDw8IElPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVYX09VTUJBUjEpOworCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVWF9PVU1CQVIyKTsKKwlyZWdfdmFsICY9IH4oSU9QMTNYWF9BVFVfT1VNQkFSX0ZVTkNfTlVNX01BU0sgPDwKKwkJCUlPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTSk7CisJcmVnX3ZhbCB8PSBmdW5jIDw8IElPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVYX09VTUJBUjIpOworCisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVWF9PVU1CQVIzKTsKKwlyZWdfdmFsICY9IH4oSU9QMTNYWF9BVFVfT1VNQkFSX0ZVTkNfTlVNX01BU0sgPDwKKwkJCUlPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTSk7CisJcmVnX3ZhbCB8PSBmdW5jIDw8IElPUDEzWFhfQVRVX09VTUJBUl9GVU5DX05VTTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVYX09VTUJBUjMpOworCisJLyogRW5hYmxlIGluYm91bmQgYW5kIG91dGJvdW5kIGN5Y2xlcworCSAqLworCXJlZ192YWwgPSBfX3Jhd19yZWFkdyhJT1AxM1hYX0FUVVhfQVRVQ01EKTsKKwlyZWdfdmFsIHw9IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUiB8CisJCSAgICAgICAgUENJX0NPTU1BTkRfUEFSSVRZIHwgUENJX0NPTU1BTkRfU0VSUjsKKwlfX3Jhd193cml0ZXcocmVnX3ZhbCwgSU9QMTNYWF9BVFVYX0FUVUNNRCk7CisKKwlyZWdfdmFsID0gX19yYXdfcmVhZGwoSU9QMTNYWF9BVFVYX0FUVUNSKTsKKwlyZWdfdmFsIHw9IElPUDEzWFhfQVRVWF9BVFVDUl9PVVRfRU47CisJX19yYXdfd3JpdGVsKHJlZ192YWwsIElPUDEzWFhfQVRVWF9BVFVDUik7Cit9CisKK3ZvaWQgX19pbml0IGlvcDEzeHhfYXR1eF9kaXNhYmxlKHZvaWQpCit7CisJdTMyIHJlZ192YWw7CisKKwlfX3Jhd193cml0ZXcoMHgwLCBJT1AxM1hYX0FUVVhfQVRVQ01EKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVVhfQVRVQ1IpOworCisJLyogd2FpdCBmb3IgY3ljbGVzIHRvIHF1aWVzY2UgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoSU9QMTNYWF9BVFVYX1BDU1IpICYgKElPUDEzWFhfQVRVWF9QQ1NSX09VVF9RX0JVU1kgfAorCQkJCSAgICAgSU9QMTNYWF9BVFVYX1BDU1JfSU5fUV9CVVNZKSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBCQVIgMCAoIERpc2FibGVkICkgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVVhfSUFVQkFSMCk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBQkFSMCk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBVVRWUjApOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVWF9JQVRWUjApOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVWF9JQUxSMCk7CisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVWF9PVU1CQVIwKTsKKwlyZWdfdmFsICY9IH5JT1AxM1hYX0FUVVhfT1VNQkFSX0VOQUJMRTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVYX09VTUJBUjApOworCisJLyogQkFSIDEgKCBEaXNhYmxlZCApICovCisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBVUJBUjEpOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVWF9JQUJBUjEpOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVWF9JQVVUVlIxKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVVhfSUFUVlIxKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVVhfSUFMUjEpOworCXJlZ192YWwgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVVhfT1VNQkFSMSk7CisJcmVnX3ZhbCAmPSB+SU9QMTNYWF9BVFVYX09VTUJBUl9FTkFCTEU7CisJX19yYXdfd3JpdGVsKHJlZ192YWwsIElPUDEzWFhfQVRVWF9PVU1CQVIxKTsKKworCS8qIEJBUiAyICggRGlzYWJsZWQgKSAqLworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVWF9JQVVCQVIyKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVVhfSUFCQVIyKTsKKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVVhfSUFVVFZSMik7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBVFZSMik7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBTFIyKTsKKwlyZWdfdmFsID0gX19yYXdfcmVhZGwoSU9QMTNYWF9BVFVYX09VTUJBUjIpOworCXJlZ192YWwgJj0gfklPUDEzWFhfQVRVWF9PVU1CQVJfRU5BQkxFOworCV9fcmF3X3dyaXRlbChyZWdfdmFsLCBJT1AxM1hYX0FUVVhfT1VNQkFSMik7CisKKwkvKiBCQVIgMyAoIERpc2FibGVkICkgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBJT1AxM1hYX0FUVVhfSUFVQkFSMyk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBQkFSMyk7CisJX19yYXdfd3JpdGVsKDB4MCwgSU9QMTNYWF9BVFVYX0lBVVRWUjMpOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVWF9JQVRWUjMpOworCV9fcmF3X3dyaXRlbCgweDAsIElPUDEzWFhfQVRVWF9JQUxSMyk7CisJcmVnX3ZhbCA9IF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVWF9PVU1CQVIzKTsKKwlyZWdfdmFsICY9IH5JT1AxM1hYX0FUVVhfT1VNQkFSX0VOQUJMRTsKKwlfX3Jhd193cml0ZWwocmVnX3ZhbCwgSU9QMTNYWF9BVFVYX09VTUJBUjMpOworCisJLyogU2V0dXAgdGhlIEkvTyBCYXIKKwkqIEFbMzUtMTZdIGluIDMxLTEyCisJKi8KKwlfX3Jhd193cml0ZWwoKElPUDEzWFhfUENJWF9MT1dFUl9JT19QQSA+PiAweDQpICYgMHhmZmZmZjAwMCwKKwkJCUlPUDEzWFhfQVRVWF9PSU9CQVIpOworCV9fcmF3X3dyaXRlbChJT1AxM1hYX1BDSVhfTE9XRVJfSU9fQkEsIElPUDEzWFhfQVRVWF9PSU9XVFZSKTsKK30KKwordm9pZCBfX2luaXQgaW9wMTN4eF9zZXRfYXR1X21tcl9iYXNlcyh2b2lkKQoreworCS8qIEJhc2VkIG9uIEVTU1IwLCBkZXRlcm1pbmUgdGhlIEFUVSBYL0Ugb2Zmc2V0cyAqLworCXN3aXRjaChfX3Jhd19yZWFkbChJT1AxM1hYX0VTU1IwKSAmCisJCShJT1AxM1hYX0NPTlRST0xMRVJfT05MWSB8IElPUDEzWFhfSU5URVJGQUNFX1NFTF9QQ0lYKSkgeworCS8qIGJvdGggYXNzZXJ0ZWQgKi8KKwljYXNlIDA6CisJCWlvcDEzeHhfYXR1eF9wbW1yX29mZnNldCA9IElPUDEzWFhfQVRVMV9QTU1SX09GRlNFVDsKKwkJaW9wMTN4eF9hdHVlX3BtbXJfb2Zmc2V0ID0gSU9QMTNYWF9BVFUyX1BNTVJfT0ZGU0VUOworCQlicmVhazsKKwkvKiBJT1AxM1hYX0NPTlRST0xMRVJfT05MWSA9IGRlYXNzZXJ0ZWQKKwkgKiBJT1AxM1hYX0lOVEVSRkFDRV9TRUxfUENJWCA9IGFzc2VydGVkCisJICovCisJY2FzZSBJT1AxM1hYX0NPTlRST0xMRVJfT05MWToKKwkJaW9wMTN4eF9hdHV4X3BtbXJfb2Zmc2V0ID0gSU9QMTNYWF9BVFUwX1BNTVJfT0ZGU0VUOworCQlpb3AxM3h4X2F0dWVfcG1tcl9vZmZzZXQgPSBJT1AxM1hYX0FUVTJfUE1NUl9PRkZTRVQ7CisJCWJyZWFrOworCS8qIElPUDEzWFhfQ09OVFJPTExFUl9PTkxZID0gYXNzZXJ0ZWQKKwkgKiBJT1AxM1hYX0lOVEVSRkFDRV9TRUxfUENJWCA9IGRlYXNzZXJ0ZWQKKwkgKi8KKwljYXNlIElPUDEzWFhfSU5URVJGQUNFX1NFTF9QQ0lYOgorCQlpb3AxM3h4X2F0dXhfcG1tcl9vZmZzZXQgPSBJT1AxM1hYX0FUVTFfUE1NUl9PRkZTRVQ7CisJCWlvcDEzeHhfYXR1ZV9wbW1yX29mZnNldCA9IElPUDEzWFhfQVRVMl9QTU1SX09GRlNFVDsKKwkJYnJlYWs7CisJLyogYm90aCBkZWFzc2VydGVkICovCisJY2FzZSBJT1AxM1hYX0NPTlRST0xMRVJfT05MWSB8IElPUDEzWFhfSU5URVJGQUNFX1NFTF9QQ0lYOgorCQlpb3AxM3h4X2F0dXhfcG1tcl9vZmZzZXQgPSBJT1AxM1hYX0FUVTJfUE1NUl9PRkZTRVQ7CisJCWlvcDEzeHhfYXR1ZV9wbW1yX29mZnNldCA9IElPUDEzWFhfQVRVMF9QTU1SX09GRlNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCit2b2lkIF9faW5pdCBpb3AxM3h4X2F0dV9zZWxlY3Qoc3RydWN0IGh3X3BjaSAqcGxhdF9wY2kpCit7CisJaW50IGk7CisKKwkvKiBzZXQgc3lzdGVtIGRlZmF1bHRzCisJICogbm90ZTogaWYgImlvcDEzeHhfaW5pdF9hdHU9IiBpcyBzcGVjaWZpZWQgdGhpcyBhdXRvZGV0ZWN0CisJICogc2VxdWVuY2Ugd2lsbCBiZSBieXBhc3NlZAorCSAqLworCWlmIChpbml0X2F0dSA9PSBJT1AxM1hYX0lOSVRfQVRVX0RFRkFVTFQpIHsKKwkJLyogY2hlY2sgZm9yIHNpbmdsZS9kdWFsIGludGVyZmFjZSAqLworCQlpZiAoX19yYXdfcmVhZGwoSU9QMTNYWF9FU1NSMCkgJiBJT1AxM1hYX0lOVEVSRkFDRV9TRUxfUENJWCkgeworCQkJLyogQVRVRSBtdXN0IGJlIHByZXNlbnQgY2hlY2sgdGhlIGRldmljZSBpZAorCQkJICogdG8gc2VlIGlmIEFUVVggaXMgcHJlc2VudC4KKwkJCSAqLworCQkJaW5pdF9hdHUgfD0gSU9QMTNYWF9JTklUX0FUVV9BVFVFOworCQkJc3dpdGNoIChfX3Jhd19yZWFkdyhJT1AxM1hYX0FUVUVfRElEKSAmIDB4ZjApIHsKKwkJCWNhc2UgMHg3MDoKKwkJCWNhc2UgMHg4MDoKKwkJCWNhc2UgMHhjMDoKKwkJCQlpbml0X2F0dSB8PSBJT1AxM1hYX0lOSVRfQVRVX0FUVVg7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBBVFVYIG11c3QgYmUgcHJlc2VudCBjaGVjayB0aGUgZGV2aWNlIGlkCisJCQkgKiB0byBzZWUgaWYgQVRVRSBpcyBwcmVzZW50LgorCQkJICovCisJCQlpbml0X2F0dSB8PSBJT1AxM1hYX0lOSVRfQVRVX0FUVVg7CisJCQlzd2l0Y2ggKF9fcmF3X3JlYWR3KElPUDEzWFhfQVRVWF9ESUQpICYgMHhmMCkgeworCQkJY2FzZSAweDcwOgorCQkJY2FzZSAweDgwOgorCQkJY2FzZSAweGMwOgorCQkJCWluaXRfYXR1IHw9IElPUDEzWFhfSU5JVF9BVFVfQVRVRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIGNoZWNrIGNlbnRyYWwgcmVzb3VyY2UgYW5kIHJvb3QgY29tcGxleCBjYXBhYmlsaXR5ICovCisJCWlmIChpbml0X2F0dSAmIElPUDEzWFhfSU5JVF9BVFVfQVRVWCkKKwkJCWlmICghKF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVWF9QQ1NSKSAmCisJCQkJSU9QMTNYWF9BVFVYX1BDU1JfQ0VOVFJBTF9SRVMpKQorCQkJCWluaXRfYXR1ICY9IH5JT1AxM1hYX0lOSVRfQVRVX0FUVVg7CisKKwkJaWYgKGluaXRfYXR1ICYgSU9QMTNYWF9JTklUX0FUVV9BVFVFKQorCQkJaWYgKF9fcmF3X3JlYWRsKElPUDEzWFhfQVRVRV9QQ1NSKSAmCisJCQkJSU9QMTNYWF9BVFVFX1BDU1JfRU5EX1BPSU5UKQorCQkJCWluaXRfYXR1ICY9IH5JT1AxM1hYX0lOSVRfQVRVX0FUVUU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZigoaW5pdF9hdHUgJiAoMSA8PCBpKSkgPT0gKDEgPDwgaSkpCisJCQlwbGF0X3BjaS0+bnJfY29udHJvbGxlcnMrKzsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGlvcDEzeHhfcGNpX2luaXQodm9pZCkKK3sKKwkvKiBjbGVhciBwcmUtZXhpc3Rpbmcgc291dGggYnJpZGdlIGVycm9ycyAqLworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChJT1AxM1hYX1hCR19CRUNTUikgJiAzLCBJT1AxM1hYX1hCR19CRUNTUik7CisKKwkvKiBTZXR1cCB0aGUgTWluIEFkZHJlc3MgZm9yIFBDSSBtZW1vcnkuLi4gKi8KKwlpb3AxM3h4X3BjaWJpb3NfbWluX21lbSA9IElPUDEzWFhfUENJWF9MT1dFUl9NRU1fQkE7CisKKwkvKiBpZiBMaW51eCBpcyBnaXZlbiBjb250cm9sIG9mIGFuIEFUVQorCSAqIGNsZWFyIG91dCBpdHMgcHJpb3IgY29uZmlndXJhdGlvbiwKKwkgKiBvdGhlcndpc2UgZG8gbm90IHRvdWNoIHRoZSByZWdpc3RlcnMKKwkgKi8KKwlpZiAoaW5pdF9hdHUgJiBJT1AxM1hYX0lOSVRfQVRVX0FUVUUpIHsKKwkJaW9wMTN4eF9hdHVlX2Rpc2FibGUoKTsKKwkJaW9wMTN4eF9hdHVlX3NldHVwKCk7CisJfQorCisJaWYgKGluaXRfYXR1ICYgSU9QMTNYWF9JTklUX0FUVV9BVFVYKSB7CisJCWlvcDEzeHhfYXR1eF9kaXNhYmxlKCk7CisJCWlvcDEzeHhfYXR1eF9zZXR1cCgpOworCX0KKworCWhvb2tfZmF1bHRfY29kZSgxNis2LCBpb3AxM3h4X3BjaV9hYm9ydCwgU0lHQlVTLAorCQkJImltcHJlY2lzZSBleHRlcm5hbCBhYm9ydCIpOworfQorCisvKiBpbnRpYWxpemUgdGhlIHBjaSBtZW1vcnkgc3BhY2UuICBoYW5kbGUgYW55IGNvbWJpbmF0aW9uIG9mCisgKiBhdHVlIGFuZCBhdHV4IGVuYWJsZWQvZGlzYWJsZWQKKyAqLworaW50IGlvcDEzeHhfcGNpX3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCB3aGljaF9hdHU7CisJdTMyIHBjaXhzciwgcGNzcjsKKworCWlmIChuciA+IDEpCisJCXJldHVybiAwOworCisJcmVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIDIsIEdGUF9LRVJORUwpOworCWlmICghcmVzKQorCQlwYW5pYygiUENJOiB1bmFibGUgdG8gYWxsb2MgcmVzb3VyY2VzIik7CisKKwltZW1zZXQocmVzLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIDIpOworCisJLyogJ25yJyBhc3N1bXB0aW9uczoKKwkgKiBBVFVYIGlzIGFsd2F5cyAwCisJICogQVRVRSBpcyAxIHdoZW4gQVRVWCBpcyBhbHNvIGVuYWJsZWQKKwkgKiBBVFVFIGlzIDAgd2hlbiBBVFVYIGlzIGRpc2FibGVkCisJICovCisJc3dpdGNoKGluaXRfYXR1KSB7CisJY2FzZSBJT1AxM1hYX0lOSVRfQVRVX0FUVVg6CisJCXdoaWNoX2F0dSA9IG5yID8gMCA6IElPUDEzWFhfSU5JVF9BVFVfQVRVWDsKKwkJYnJlYWs7CisJY2FzZSBJT1AxM1hYX0lOSVRfQVRVX0FUVUU6CisJCXdoaWNoX2F0dSA9IG5yID8gMCA6IElPUDEzWFhfSU5JVF9BVFVfQVRVRTsKKwkJYnJlYWs7CisJY2FzZSAoSU9QMTNYWF9JTklUX0FUVV9BVFVYIHwgSU9QMTNYWF9JTklUX0FUVV9BVFVFKToKKwkJd2hpY2hfYXR1ID0gbnIgPyBJT1AxM1hYX0lOSVRfQVRVX0FUVUUgOiBJT1AxM1hYX0lOSVRfQVRVX0FUVVg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXdoaWNoX2F0dSA9IDA7CisJfQorCisJaWYgKCF3aGljaF9hdHUpCisJCXJldHVybiAwOworCisJc3dpdGNoKHdoaWNoX2F0dSkgeworCWNhc2UgSU9QMTNYWF9JTklUX0FUVV9BVFVYOgorCQlwY2l4c3IgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVVhfUENJWFNSKTsKKwkJcGNpeHNyICY9IH4weGZmZmY7CisJCXBjaXhzciB8PSBzeXMtPmJ1c25yIDw8IElPUDEzWFhfQVRVWF9QQ0lYU1JfQlVTX05VTSB8CisJCQkgIDAgPDwgSU9QMTNYWF9BVFVYX1BDSVhTUl9ERVZfTlVNIHwKKwkJCSAgaW9wMTN4eF9hdHVfZnVuY3Rpb24oSU9QMTNYWF9JTklUX0FUVV9BVFVYKQorCQkJCSAgPDwgSU9QMTNYWF9BVFVYX1BDSVhTUl9GVU5DX05VTTsKKwkJX19yYXdfd3JpdGVsKHBjaXhzciwgSU9QMTNYWF9BVFVYX1BDSVhTUik7CisKKwkJcmVzWzBdLnN0YXJ0ID0gSU9QMTNYWF9QQ0lYX0xPV0VSX0lPX1BBOworCQlyZXNbMF0uZW5kICAgPSBJT1AxM1hYX1BDSVhfVVBQRVJfSU9fUEE7CisJCXJlc1swXS5uYW1lICA9ICJJUTgxMzQwIEFUVVggUENJIEkvTyBTcGFjZSI7CisJCXJlc1swXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisKKwkJcmVzWzFdLnN0YXJ0ID0gSU9QMTNYWF9QQ0lYX0xPV0VSX01FTV9SQTsKKwkJcmVzWzFdLmVuZCAgID0gSU9QMTNYWF9QQ0lYX1VQUEVSX01FTV9SQTsKKwkJcmVzWzFdLm5hbWUgID0gIklRODEzNDAgQVRVWCBQQ0kgTWVtb3J5IFNwYWNlIjsKKwkJcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCXN5cy0+bWVtX29mZnNldCA9IElPUDEzWFhfUENJWF9NRU1fT0ZGU0VUOworCQlzeXMtPmlvX29mZnNldCA9IElPUDEzWFhfUENJWF9JT19PRkZTRVQ7CisJCWJyZWFrOworCWNhc2UgSU9QMTNYWF9JTklUX0FUVV9BVFVFOgorCQkvKiBOb3RlOiB0aGUgZnVuY3Rpb24gbnVtYmVyIGZpZWxkIGluIHRoZSBQQ1NSIGlzIHJvICovCisJCXBjc3IgPSBfX3Jhd19yZWFkbChJT1AxM1hYX0FUVUVfUENTUik7CisJCXBjc3IgJj0gfigweGZmZjggPDwgMTYpOworCQlwY3NyIHw9IHN5cy0+YnVzbnIgPDwgSU9QMTNYWF9BVFVFX1BDU1JfQlVTX05VTSB8CisJCQkJMCA8PCBJT1AxM1hYX0FUVUVfUENTUl9ERVZfTlVNOworCisJCV9fcmF3X3dyaXRlbChwY3NyLCBJT1AxM1hYX0FUVUVfUENTUik7CisKKwkJcmVzWzBdLnN0YXJ0ID0gSU9QMTNYWF9QQ0lFX0xPV0VSX0lPX1BBOworCQlyZXNbMF0uZW5kICAgPSBJT1AxM1hYX1BDSUVfVVBQRVJfSU9fUEE7CisJCXJlc1swXS5uYW1lICA9ICJJUTgxMzQwIEFUVUUgUENJIEkvTyBTcGFjZSI7CisJCXJlc1swXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisKKwkJcmVzWzFdLnN0YXJ0ID0gSU9QMTNYWF9QQ0lFX0xPV0VSX01FTV9SQTsKKwkJcmVzWzFdLmVuZCAgID0gSU9QMTNYWF9QQ0lFX1VQUEVSX01FTV9SQTsKKwkJcmVzWzFdLm5hbWUgID0gIklRODEzNDAgQVRVRSBQQ0kgTWVtb3J5IFNwYWNlIjsKKwkJcmVzWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCXN5cy0+bWVtX29mZnNldCA9IElPUDEzWFhfUENJRV9NRU1fT0ZGU0VUOworCQlzeXMtPmlvX29mZnNldCA9IElPUDEzWFhfUENJRV9JT19PRkZTRVQ7CisJCXN5cy0+bWFwX2lycSA9IGlvcDEzeHhfcGNpZV9tYXBfaXJxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZyZXNbMF0pOworCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmcmVzWzFdKTsKKworCXN5cy0+cmVzb3VyY2VbMF0gPSAmcmVzWzBdOworCXN5cy0+cmVzb3VyY2VbMV0gPSAmcmVzWzFdOworCXN5cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCisJcmV0dXJuIDE7Cit9CisKK3UxNiBpb3AxM3h4X2Rldl9pZCh2b2lkKQoreworCWlmIChfX3Jhd19yZWFkbChJT1AxM1hYX0VTU1IwKSAmIElPUDEzWFhfSU5URVJGQUNFX1NFTF9QQ0lYKQorCQlyZXR1cm4gX19yYXdfcmVhZHcoSU9QMTNYWF9BVFVFX0RJRCk7CisJZWxzZQorCQlyZXR1cm4gX19yYXdfcmVhZHcoSU9QMTNYWF9BVFVYX0RJRCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlvcDEzeHhfaW5pdF9hdHVfc2V0dXAoY2hhciAqc3RyKQoreworICAgICAgICBpbml0X2F0dSA9IElPUDEzWFhfSU5JVF9BVFVfTk9ORTsKKyAgICAgICAgaWYgKHN0cikgeworICAgICAgICAgICAgICAgIHdoaWxlICgqc3RyICE9ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKnN0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9hdHUgfD0gSU9QMTNYWF9JTklUX0FUVV9BVFVYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2F0dSAmPSB+SU9QMTNYWF9JTklUX0FUVV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfYXR1IHw9IElPUDEzWFhfSU5JVF9BVFVfQVRVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9hdHUgJj0gfklPUDEzWFhfSU5JVF9BVFVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5USygiXCJpb3AxM3h4X2luaXRfYXR1XCIgbWFsZm9ybWVkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYXJhY3RlcjogXCclY1wnIiwgKnN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3RyICsgMSkgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2F0dSA9IElPUDEzWFhfSU5JVF9BVFVfREVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKK30KKworX19zZXR1cCgiaW9wMTN4eF9pbml0X2F0dSIsIGlvcDEzeHhfaW5pdF9hdHVfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3NldHVwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU2ZDJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3NldHVwLmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBpb3AxM3h4IHBsYXRmb3JtIEluaXRpYWxpemF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpZmRlZiBDT05GSUdfTVREX1BIWVNNQVAKKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2VuZGlmCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIElPUDEzWFhfVUFSVF9YVEFMIDMzMzM0MDAwCisjZGVmaW5lIElPUDEzWFhfU0VUVVBfREVCVUcgMAorI2RlZmluZSBQUklOVEsoeC4uLikgKCh2b2lkKShJT1AxM1hYX1NFVFVQX0RFQlVHICYmIHByaW50ayh4KSkpCisKKy8qIFN0YW5kYXJkIElPIG1hcHBpbmcgZm9yIGFsbCBJT1AxM1hYIGJhc2VkIHN5c3RlbXMKKyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpb3AxM3h4X3N0ZF9kZXNjW10gX19pbml0ZGF0YSA9IHsKKwl7ICAgIC8qIG1lbSBtYXBwZWQgcmVnaXN0ZXJzICovCisJCS52aXJ0dWFsID0gSU9QMTNYWF9QTU1SX1ZJUlRfTUVNX0JBU0UsCisJCS5wZm4gCSA9IF9fcGh5c190b19wZm4oSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UpLAorCQkubGVuZ3RoICA9IElPUDEzWFhfUE1NUl9TSVpFLAorCQkudHlwZQkgPSBNVF9ERVZJQ0UsCisJfSwgeyAvKiBQQ0lFIElPIHNwYWNlICovCisJCS52aXJ0dWFsID0gSU9QMTNYWF9QQ0lFX0xPV0VSX0lPX1ZBLAorCQkucGZuIAkgPSBfX3BoeXNfdG9fcGZuKElPUDEzWFhfUENJRV9MT1dFUl9JT19QQSksCisJCS5sZW5ndGggID0gSU9QMTNYWF9QQ0lYX0lPX1dJTkRPV19TSVpFLAorCQkudHlwZQkgPSBNVF9ERVZJQ0UsCisJfSwgeyAvKiBQQ0lYIElPIHNwYWNlICovCisJCS52aXJ0dWFsID0gSU9QMTNYWF9QQ0lYX0xPV0VSX0lPX1ZBLAorCQkucGZuIAkgPSBfX3BoeXNfdG9fcGZuKElPUDEzWFhfUENJWF9MT1dFUl9JT19QQSksCisJCS5sZW5ndGggID0gSU9QMTNYWF9QQ0lYX0lPX1dJTkRPV19TSVpFLAorCQkudHlwZQkgPSBNVF9ERVZJQ0UsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wMTN4eF91YXJ0MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IElPUDEzWFhfVUFSVDBfUEhZUywKKwkJLmVuZCA9IElPUDEzWFhfVUFSVDBfUEhZUyArIDB4M2YsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfSU9QMTNYWF9VQVJUMCwKKwkJLmVuZCA9IElSUV9JT1AxM1hYX1VBUlQwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wMTN4eF91YXJ0MV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IElPUDEzWFhfVUFSVDFfUEhZUywKKwkJLmVuZCA9IElPUDEzWFhfVUFSVDFfUEhZUyArIDB4M2YsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfSU9QMTNYWF9VQVJUMSwKKwkJLmVuZCA9IElSUV9JT1AxM1hYX1VBUlQxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgaW9wMTN4eF91YXJ0MF9kYXRhW10gPSB7CisJeworICAgICAgIC5tZW1iYXNlICAgICA9IChjaGFyKikoSU9QMTNYWF9VQVJUMF9WSVJUKSwKKyAgICAgICAubWFwYmFzZSAgICAgPSAoSU9QMTNYWF9VQVJUMF9QSFlTKSwKKyAgICAgICAuaXJxICAgICAgICAgPSBJUlFfSU9QMTNYWF9VQVJUMCwKKyAgICAgICAudWFydGNsayAgICAgPSBJT1AxM1hYX1VBUlRfWFRBTCwKKyAgICAgICAucmVnc2hpZnQgICAgPSAyLAorICAgICAgIC5pb3R5cGUgICAgICA9IFVQSU9fTUVNLAorICAgICAgIC5mbGFncyAgICAgICA9IFVQRl9TS0lQX1RFU1QsCisJfSwKKwl7ICB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBpb3AxM3h4X3VhcnQxX2RhdGFbXSA9IHsKKwl7CisgICAgICAgLm1lbWJhc2UgICAgID0gKGNoYXIqKShJT1AxM1hYX1VBUlQxX1ZJUlQpLAorICAgICAgIC5tYXBiYXNlICAgICA9IChJT1AxM1hYX1VBUlQxX1BIWVMpLAorICAgICAgIC5pcnEgICAgICAgICA9IElSUV9JT1AxM1hYX1VBUlQxLAorICAgICAgIC51YXJ0Y2xrICAgICA9IElPUDEzWFhfVUFSVF9YVEFMLAorICAgICAgIC5yZWdzaGlmdCAgICA9IDIsCisgICAgICAgLmlvdHlwZSAgICAgID0gVVBJT19NRU0sCisgICAgICAgLmZsYWdzICAgICAgID0gVVBGX1NLSVBfVEVTVCwKKwl9LAorCXsgIH0sCit9OworCisvKiBUaGUgaWRzIGFyZSBmaXhlZCB1cCBsYXRlciBpbiBpb3AxM3h4X3BsYXRmb3JtX2luaXQgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlvcDEzeHhfdWFydDAgPSB7CisgICAgICAgLm5hbWUgPSAic2VyaWFsODI1MCIsCisgICAgICAgLmlkID0gMCwKKyAgICAgICAuZGV2LnBsYXRmb3JtX2RhdGEgPSBpb3AxM3h4X3VhcnQwX2RhdGEsCisgICAgICAgLm51bV9yZXNvdXJjZXMgPSAyLAorICAgICAgIC5yZXNvdXJjZSA9IGlvcDEzeHhfdWFydDBfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW9wMTN4eF91YXJ0MSA9IHsKKyAgICAgICAubmFtZSA9ICJzZXJpYWw4MjUwIiwKKyAgICAgICAuaWQgPSAwLAorICAgICAgIC5kZXYucGxhdGZvcm1fZGF0YSA9IGlvcDEzeHhfdWFydDFfZGF0YSwKKyAgICAgICAubnVtX3Jlc291cmNlcyA9IDIsCisgICAgICAgLnJlc291cmNlID0gaW9wMTN4eF91YXJ0MV9yZXNvdXJjZXMKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW9wMTN4eF9pMmNfMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IElPUDEzWFhfSTJDMF9QSFlTLAorCQkuZW5kID0gSU9QMTNYWF9JMkMwX1BIWVMgKyAweDE4LAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX0lPUDEzWFhfSTJDXzAsCisJCS5lbmQgPSBJUlFfSU9QMTNYWF9JMkNfMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlvcDEzeHhfaTJjXzFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBJT1AxM1hYX0kyQzFfUEhZUywKKwkJLmVuZCA9IElPUDEzWFhfSTJDMV9QSFlTICsgMHgxOCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9JT1AxM1hYX0kyQ18xLAorCQkuZW5kID0gSVJRX0lPUDEzWFhfSTJDXzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpb3AxM3h4X2kyY18yX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gSU9QMTNYWF9JMkMyX1BIWVMsCisJCS5lbmQgPSBJT1AxM1hYX0kyQzJfUEhZUyArIDB4MTgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfSU9QMTNYWF9JMkNfMiwKKwkJLmVuZCA9IElSUV9JT1AxM1hYX0kyQ18yLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUQorCX0KK307CisKKy8qIEkyQyBjb250cm9sbGVycy4gVGhlIElPUDEzWFggdXNlcyB0aGUgc2FtZSBibG9jayBhcyB0aGUgSU9QM3h4LCBzbworICogd2UganVzdCB1c2UgdGhlIHNhbWUgZGV2aWNlIG5hbWUuCisgKi8KKworLyogVGhlIGlkcyBhcmUgZml4ZWQgdXAgbGF0ZXIgaW4gaW9wMTN4eF9wbGF0Zm9ybV9pbml0ICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpb3AxM3h4X2kyY18wX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUgPSAiSU9QM3h4LUkyQyIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IDIsCisJLnJlc291cmNlID0gaW9wMTN4eF9pMmNfMF9yZXNvdXJjZXMKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlvcDEzeHhfaTJjXzFfY29udHJvbGxlciA9IHsKKwkubmFtZSA9ICJJT1AzeHgtSTJDIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gMiwKKwkucmVzb3VyY2UgPSBpb3AxM3h4X2kyY18xX3Jlc291cmNlcworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW9wMTN4eF9pMmNfMl9jb250cm9sbGVyID0geworCS5uYW1lID0gIklPUDN4eC1JMkMiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSAyLAorCS5yZXNvdXJjZSA9IGlvcDEzeHhfaTJjXzJfcmVzb3VyY2VzCit9OworCisjaWZkZWYgQ09ORklHX01URF9QSFlTTUFQCisvKiBQQkkgRmxhc2ggRGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGlxODEzNHhfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGggPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpcTgxMzR4X2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IElRODEzNDBfRkxBU0hCQVNFLAorCS5lbmQgICA9IDAsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpcTgxMzR4X2ZsYXNoID0geworCS5uYW1lICAgICAgICAgICA9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQgICAgICAgICAgICAgPSAwLAorCS5kZXYgICAgICAgICAgICA9IHsgLnBsYXRmb3JtX2RhdGEgID0gJmlxODEzNHhfZmxhc2hfZGF0YSwgfSwKKwkubnVtX3Jlc291cmNlcyAgPSAxLAorCS5yZXNvdXJjZSAgICAgICA9ICZpcTgxMzR4X2ZsYXNoX3Jlc291cmNlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXE4MTM0eF9wcm9iZV9mbGFzaF9zaXplKHZvaWQpCit7CisJdWludDhfdCBfX2lvbWVtICpmbGFzaF9hZGRyID0gaW9yZW1hcChJUTgxMzQwX0ZMQVNIQkFTRSwgUEFHRV9TSVpFKTsKKwlpbnQgaTsKKwljaGFyIHF1ZXJ5WzNdOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJaW50IHdpZHRoID0gaXE4MTM0eF9mbGFzaF9kYXRhLndpZHRoOworCisJaWYgKGZsYXNoX2FkZHIpIHsKKwkJLyogc2VuZCBDRkkgJ3F1ZXJ5JyBjb21tYW5kICovCisJCXdyaXRldygweDk4LCBmbGFzaF9hZGRyKTsKKworCQkvKiBjaGVjayBmb3IgQ0ZJIGNvbXBsaWFuY2UgKi8KKwkJZm9yIChpID0gMDsgaSA8IDMgKiB3aWR0aDsgaSArPSB3aWR0aCkKKwkJCXF1ZXJ5W2kgLyB3aWR0aF0gPSByZWFkYihmbGFzaF9hZGRyICsgKDB4MTAgKiB3aWR0aCkgKyBpKTsKKworCQkvKiByZWFkIHRoZSBzaXplICovCisJCWlmIChtZW1jbXAocXVlcnksICJRUlkiLCAzKSA9PSAwKQorCQkJc2l6ZSA9IDEgPDwgcmVhZGIoZmxhc2hfYWRkciArICgweDI3ICogd2lkdGgpKTsKKworCQkvKiBzZW5kIENGSSAncmVhZCBhcnJheScgY29tbWFuZCAqLworCQl3cml0ZXcoMHhmZiwgZmxhc2hfYWRkcik7CisKKwkJaW91bm1hcChmbGFzaF9hZGRyKTsKKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCBpb3AxM3h4X21hcF9pbyh2b2lkKQoreworCS8qIEluaXRpYWxpemUgdGhlIFN0YXRpYyBQYWdlIFRhYmxlIG1hcHMgKi8KKwlpb3RhYmxlX2luaXQoaW9wMTN4eF9zdGRfZGVzYywgQVJSQVlfU0laRShpb3AxM3h4X3N0ZF9kZXNjKSk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF91YXJ0ID0gMDsKK3N0YXRpYyBpbnQgaW5pdF9pMmMgPSAwOworCit2b2lkIF9faW5pdCBpb3AxM3h4X3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdWFydF9pZHgsIGkyY19pZHgsIHBsYXRfaWR4OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlvcDEzeHhfZGV2aWNlc1tJUTgxMzQwX01BWF9QTEFUX0RFVklDRVNdOworCisJLyogc2V0IHRoZSBiYXNlcyBzbyB3ZSBjYW4gcmVhZCB0aGUgZGV2aWNlIGlkICovCisJaW9wMTN4eF9zZXRfYXR1X21tcl9iYXNlcygpOworCisJbWVtc2V0KGlvcDEzeHhfZGV2aWNlcywgMCwgc2l6ZW9mKGlvcDEzeHhfZGV2aWNlcykpOworCisJaWYgKGluaXRfdWFydCA9PSBJT1AxM1hYX0lOSVRfVUFSVF9ERUZBVUxUKSB7CisJCXN3aXRjaCAoaW9wMTN4eF9kZXZfaWQoKSkgeworCQkvKiBlbmFibGUgYm90aCB1YXJ0cyBvbiBpb3AzNDEgYW5kIGlvcDM0MiAqLworCQljYXNlIDB4MzM4MDoKKwkJY2FzZSAweDMzODQ6CisJCWNhc2UgMHgzMzg4OgorCQljYXNlIDB4MzM4YzoKKwkJY2FzZSAweDMzODI6CisJCWNhc2UgMHgzMzg2OgorCQljYXNlIDB4MzM4YToKKwkJY2FzZSAweDMzOGU6CisJCQlpbml0X3VhcnQgfD0gSU9QMTNYWF9JTklUX1VBUlRfMDsKKwkJCWluaXRfdWFydCB8PSBJT1AxM1hYX0lOSVRfVUFSVF8xOworCQkJYnJlYWs7CisJCS8qIG9ubHkgZW5hYmxlIHVhcnQgMSAqLworCQlkZWZhdWx0OgorCQkJaW5pdF91YXJ0IHw9IElPUDEzWFhfSU5JVF9VQVJUXzE7CisJCX0KKwl9CisKKwlpZiAoaW5pdF9pMmMgPT0gSU9QMTNYWF9JTklUX0kyQ19ERUZBVUxUKSB7CisJCXN3aXRjaCAoaW9wMTN4eF9kZXZfaWQoKSkgeworCQkvKiBlbmFibGUgYWxsIGkyYyB1bml0cyBvbiBpb3AzNDEgYW5kIGlvcDM0MiAqLworCQljYXNlIDB4MzM4MDoKKwkJY2FzZSAweDMzODQ6CisJCWNhc2UgMHgzMzg4OgorCQljYXNlIDB4MzM4YzoKKwkJY2FzZSAweDMzODI6CisJCWNhc2UgMHgzMzg2OgorCQljYXNlIDB4MzM4YToKKwkJY2FzZSAweDMzOGU6CisJCQlpbml0X2kyYyB8PSBJT1AxM1hYX0lOSVRfSTJDXzA7CisJCQlpbml0X2kyYyB8PSBJT1AxM1hYX0lOSVRfSTJDXzE7CisJCQlpbml0X2kyYyB8PSBJT1AxM1hYX0lOSVRfSTJDXzI7CisJCQlicmVhazsKKwkJLyogb25seSBlbmFibGUgaTJjIDEgYW5kIDIgKi8KKwkJZGVmYXVsdDoKKwkJCWluaXRfaTJjIHw9IElPUDEzWFhfSU5JVF9JMkNfMTsKKwkJCWluaXRfaTJjIHw9IElPUDEzWFhfSU5JVF9JMkNfMjsKKwkJfQorCX0KKworCXBsYXRfaWR4ID0gMDsKKwl1YXJ0X2lkeCA9IDA7CisJaTJjX2lkeCA9IDA7CisKKwkvKiB1YXJ0IDEgKGlmIGVuYWJsZWQpIGlzIHR0eVMwICovCisJaWYgKGluaXRfdWFydCAmIElPUDEzWFhfSU5JVF9VQVJUXzEpIHsKKwkJUFJJTlRLKCJBZGRpbmcgdWFydDEgdG8gcGxhdGZvcm0gZGV2aWNlIGxpc3RcbiIpOworCQlpb3AxM3h4X3VhcnQxLmlkID0gdWFydF9pZHgrKzsKKwkJaW9wMTN4eF9kZXZpY2VzW3BsYXRfaWR4KytdID0gJmlvcDEzeHhfdWFydDE7CisJfQorCWlmIChpbml0X3VhcnQgJiBJT1AxM1hYX0lOSVRfVUFSVF8wKSB7CisJCVBSSU5USygiQWRkaW5nIHVhcnQwIHRvIHBsYXRmb3JtIGRldmljZSBsaXN0XG4iKTsKKwkJaW9wMTN4eF91YXJ0MC5pZCA9IHVhcnRfaWR4Kys7CisJCWlvcDEzeHhfZGV2aWNlc1twbGF0X2lkeCsrXSA9ICZpb3AxM3h4X3VhcnQwOworCX0KKworCWZvcihpID0gMDsgaSA8IElRODEzNDBfTlVNX0kyQzsgaSsrKSB7CisJCWlmICgoaW5pdF9pMmMgJiAoMSA8PCBpKSkgJiYgSU9QMTNYWF9TRVRVUF9ERUJVRykKKwkJCXByaW50aygiQWRkaW5nIGkyYyVkIHRvIHBsYXRmb3JtIGRldmljZSBsaXN0XG4iLCBpKTsKKwkJc3dpdGNoKGluaXRfaTJjICYgKDEgPDwgaSkpIHsKKwkJY2FzZSBJT1AxM1hYX0lOSVRfSTJDXzA6CisJCQlpb3AxM3h4X2kyY18wX2NvbnRyb2xsZXIuaWQgPSBpMmNfaWR4Kys7CisJCQlpb3AxM3h4X2RldmljZXNbcGxhdF9pZHgrK10gPQorCQkJCSZpb3AxM3h4X2kyY18wX2NvbnRyb2xsZXI7CisJCQlicmVhazsKKwkJY2FzZSBJT1AxM1hYX0lOSVRfSTJDXzE6CisJCQlpb3AxM3h4X2kyY18xX2NvbnRyb2xsZXIuaWQgPSBpMmNfaWR4Kys7CisJCQlpb3AxM3h4X2RldmljZXNbcGxhdF9pZHgrK10gPQorCQkJCSZpb3AxM3h4X2kyY18xX2NvbnRyb2xsZXI7CisJCQlicmVhazsKKwkJY2FzZSBJT1AxM1hYX0lOSVRfSTJDXzI6CisJCQlpb3AxM3h4X2kyY18yX2NvbnRyb2xsZXIuaWQgPSBpMmNfaWR4Kys7CisJCQlpb3AxM3h4X2RldmljZXNbcGxhdF9pZHgrK10gPQorCQkJCSZpb3AxM3h4X2kyY18yX2NvbnRyb2xsZXI7CisJCQlicmVhazsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19NVERfUEhZU01BUAorCWlxODEzNHhfZmxhc2hfcmVzb3VyY2UuZW5kID0gaXE4MTM0eF9mbGFzaF9yZXNvdXJjZS5zdGFydCArCisJCQkJaXE4MTM0eF9wcm9iZV9mbGFzaF9zaXplKCk7CisJaWYgKGlxODEzNHhfZmxhc2hfcmVzb3VyY2UuZW5kID4gaXE4MTM0eF9mbGFzaF9yZXNvdXJjZS5zdGFydCkKKwkJaW9wMTN4eF9kZXZpY2VzW3BsYXRfaWR4KytdID0gJmlxODEzNHhfZmxhc2g7CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gcHJvYmUgZmxhc2ggc2l6ZVxuIiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCisJcGxhdGZvcm1fYWRkX2RldmljZXMoaW9wMTN4eF9kZXZpY2VzLCBwbGF0X2lkeCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlvcDEzeHhfaW5pdF91YXJ0X3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoc3RyKSB7CisJCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJCXN3aXRjaCgqc3RyKSB7CisJCQljYXNlICcwJzoKKwkJCQlpbml0X3VhcnQgfD0gSU9QMTNYWF9JTklUX1VBUlRfMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzEnOgorCQkJCWluaXRfdWFydCB8PSBJT1AxM1hYX0lOSVRfVUFSVF8xOworCQkJCWJyZWFrOworCQkJY2FzZSAnLCc6CisJCQljYXNlICc9JzoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJUFJJTlRLKCJcImlvcDEzeHhfaW5pdF91YXJ0XCIgbWFsZm9ybWVkIgorCQkJCQkgICAgIiBhdCBjaGFyYWN0ZXI6IFwnJWNcJyIsICpzdHIpOworCQkJCSooc3RyICsgMSkgPSAnXDAnOworCQkJCWluaXRfdWFydCA9IElPUDEzWFhfSU5JVF9VQVJUX0RFRkFVTFQ7CisJCQl9CisJCQlzdHIrKzsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW9wMTN4eF9pbml0X2kyY19zZXR1cChjaGFyICpzdHIpCit7CisJaWYgKHN0cikgeworCQl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCQlzd2l0Y2goKnN0cikgeworCQkJY2FzZSAnMCc6CisJCQkJaW5pdF9pMmMgfD0gSU9QMTNYWF9JTklUX0kyQ18wOworCQkJCWJyZWFrOworCQkJY2FzZSAnMSc6CisJCQkJaW5pdF9pMmMgfD0gSU9QMTNYWF9JTklUX0kyQ18xOworCQkJCWJyZWFrOworCQkJY2FzZSAnMic6CisJCQkJaW5pdF9pMmMgfD0gSU9QMTNYWF9JTklUX0kyQ18yOworCQkJCWJyZWFrOworCQkJY2FzZSAnLCc6CisJCQljYXNlICc9JzoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJUFJJTlRLKCJcImlvcDEzeHhfaW5pdF9pMmNcIiBtYWxmb3JtZWQiCisJCQkJCSAgICAiIGF0IGNoYXJhY3RlcjogXCclY1wnIiwgKnN0cik7CisJCQkJKihzdHIgKyAxKSA9ICdcMCc7CisJCQkJaW5pdF9pMmMgPSBJT1AxM1hYX0lOSVRfSTJDX0RFRkFVTFQ7CisJCQl9CisJCQlzdHIrKzsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiaW9wMTN4eF9pbml0X3VhcnQiLCBpb3AxM3h4X2luaXRfdWFydF9zZXR1cCk7CitfX3NldHVwKCJpb3AxM3h4X2luaXRfaTJjIiwgaW9wMTN4eF9pbml0X2kyY19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIxMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3RpbWUuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtaW9wMTN4eC90aW1lLmMKKyAqCisgKiBUaW1lciBjb2RlIGZvciBJT1AxM3h4IChjb3BpZWQgZnJvbSBJT1AzMngvSU9QMzN4IGltcGxlbWVudGF0aW9uKQorICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBtdmlzdGEuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGlja3NfcGVyX2ppZmZ5Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGlja3NfcGVyX3VzZWM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2ppZmZ5X3RpbWU7CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfdGNyMSh2b2lkKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjMywgYzksIDAiIDogIj1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKwordW5zaWduZWQgbG9uZyBpb3AxM3h4X2dldHRpbWVvZmZzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1MzIgY3BfZmxhZ3M7CisKKwljcF9mbGFncyA9IGlvcDEzeHhfY3A2X3NhdmUoKTsKKwlvZmZzZXQgPSBuZXh0X2ppZmZ5X3RpbWUgLSByZWFkX3RjcjEoKTsKKwlpb3AxM3h4X2NwNl9yZXN0b3JlKGNwX2ZsYWdzKTsKKworCXJldHVybiBvZmZzZXQgLyB0aWNrc19wZXJfdXNlYzsKK30KKworc3RhdGljIGlycXJldHVybl90Citpb3AxM3h4X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIGNwX2ZsYWdzID0gaW9wMTN4eF9jcDZfc2F2ZSgpOworCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGM2LCBjOSwgMCIgOiA6ICJyIiAoMSkpOworCisJd2hpbGUgKChzaWduZWQgbG9uZykobmV4dF9qaWZmeV90aW1lIC0gcmVhZF90Y3IxKCkpCisJCQkJCQkJPj0gdGlja3NfcGVyX2ppZmZ5KSB7CisJCXRpbWVyX3RpY2soKTsKKwkJbmV4dF9qaWZmeV90aW1lIC09IHRpY2tzX3Blcl9qaWZmeTsKKwl9CisKKwl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCisJaW9wMTN4eF9jcDZfcmVzdG9yZShjcF9mbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlvcDEzeHhfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJJT1AxM1hYIFRpbWVyIFRpY2siLAorCS5oYW5kbGVyCT0gaW9wMTN4eF90aW1lcl9pbnRlcnJ1cHQsCisJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSLAorfTsKKwordm9pZCBfX2luaXQgaW9wMTN4eF9pbml0X3RpbWUodW5zaWduZWQgbG9uZyB0aWNrX3JhdGUpCit7CisJdTMyIHRpbWVyX2N0bDsKKwl1MzIgY3BfZmxhZ3M7CisKKwl0aWNrc19wZXJfamlmZnkgPSAodGlja19yYXRlICsgSFovMikgLyBIWjsKKwl0aWNrc19wZXJfdXNlYyA9IHRpY2tfcmF0ZSAvIDEwMDAwMDA7CisJbmV4dF9qaWZmeV90aW1lID0gMHhmZmZmZmZmZjsKKworCXRpbWVyX2N0bCA9IElPUDEzWFhfVE1SX0VOIHwgSU9QMTNYWF9UTVJfUFJJVklMRUdFRCB8CisJCQlJT1AxM1hYX1RNUl9SRUxPQUQgfCBJT1AxM1hYX1RNUl9SQVRJT18xXzE7CisKKwkvKgorCSAqIFdlIHVzZSB0aW1lciAwIGZvciBvdXIgdGltZXIgaW50ZXJydXB0LCBhbmQgdGltZXIgMSBhcworCSAqIG1vbm90b25pYyBjb3VudGVyIGZvciB0cmFja2luZyBtaXNzZWQgamlmZmllcy4KKwkgKi8KKwljcF9mbGFncyA9IGlvcDEzeHhfY3A2X3NhdmUoKTsKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGM0LCBjOSwgMCIgOiA6ICJyIiAodGlja3NfcGVyX2ppZmZ5IC0gMSkpOworCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzAsIGM5LCAwIiA6IDogInIiICh0aW1lcl9jdGwpKTsKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGM1LCBjOSwgMCIgOiA6ICJyIiAoMHhmZmZmZmZmZikpOworCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzEsIGM5LCAwIiA6IDogInIiICh0aW1lcl9jdGwpKTsKKwlpb3AxM3h4X2NwNl9yZXN0b3JlKGNwX2ZsYWdzKTsKKworCXNldHVwX2lycShJUlFfSU9QMTNYWF9USU1FUjAsICZpb3AxM3h4X3RpbWVyX2lycSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lycS5jCmluZGV4IDY5ZDYzMDIuLjNlYzFjZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lycS5jCkBAIC03MCw3ICs3MCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7CiAJCXNldF9pcnFfY2hpcChpLCAmZXh0X2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwppbmRleCBhMmM5NGE0Li4yNDk5YTc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAkJaXJxID0gSVJRX0lPUDMyWF9YSU5UMDsKIAl9IGVsc2UgaWYgKFBDSV9TTE9UKGRldi0+ZGV2Zm4pID09IDIpIHsKIAkJLyogUlRMODExMFNCICMyICovCi0JCWlycSA9IElSUV9JT1AzMlhfWElOVDE7CisJCWlycSA9IElSUV9JT1AzMlhfWElOVDM7CiAJfSBlbHNlIGlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSA9PSAzKSB7CiAJCS8qIFNpbDM1MTIgKi8KIAkJaXJxID0gSVJRX0lPUDMyWF9YSU5UMjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lycS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXJxLmMKaW5kZXggNjMzMDRiMy4uMDBiMzdmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXJxLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewogCQlzZXRfaXJxX2NoaXAoaSwgKGkgPCAzMikgPyAmaW9wMzN4X2lycWNoaXAxIDogJmlvcDMzeF9pcnFjaGlwMik7Ci0JCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCmluZGV4IDIyYzk4ZTkuLjI3Yjc0ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYwpAQCAtMzA4LDcgKzMwOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSVJRIGhhbmRsaW5nIElYUDIwMDAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaXhwMjAwMF9HUElPX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorc3RhdGljIHZvaWQgaXhwMjAwMF9HUElPX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXMgPSAqSVhQMjAwMF9HUElPX0lOU1Q7CkBAIC0zNzMsNyArMzczLDcgQEAKIAlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fSU5TUiwgKDEgPDwgKGlycSAtIElSUV9JWFAyMDAwX0dQSU8wKSkpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaXhwMjAwMF9HUElPX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeHAyMDAwX0dQSU9faXJxX2NoaXAgPSB7CiAJLmFjawkJPSBpeHAyMDAwX0dQSU9faXJxX21hc2tfYWNrLAogCS5tYXNrCQk9IGl4cDIwMDBfR1BJT19pcnFfbWFzaywKIAkudW5tYXNrCQk9IGl4cDIwMDBfR1BJT19pcnFfdW5tYXNrLApAQCAtNDAxLDcgKzQwMSw3IEBACiAvKgogICogRXJyb3IgaW50ZXJydXB0cy4gVGhlc2UgYXJlIHVzZWQgZXh0ZW5zaXZlbHkgYnkgdGhlIG1pY3JvZW5naW5lIGRyaXZlcnMKICAqLwotc3RhdGljIHZvaWQgaXhwMjAwMF9lcnJfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBpeHAyMDAwX2Vycl9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXMgPSAqSVhQMjAwMF9JUlFfRVJSX1NUQVRVUzsKQEAgLTQyNiwxMyArNDI2LDEzIEBACiAJCQkoMSA8PCAoaXJxIC0gSVJRX0lYUDIwMDBfRFJBTTBfTUlOX0VSUikpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGl4cDIwMDBfZXJyX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeHAyMDAwX2Vycl9pcnFfY2hpcCA9IHsKIAkuYWNrCT0gaXhwMjAwMF9lcnJfaXJxX21hc2ssCiAJLm1hc2sJPSBpeHAyMDAwX2Vycl9pcnFfbWFzaywKIAkudW5tYXNrCT0gaXhwMjAwMF9lcnJfaXJxX3VubWFzawogfTsKIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGl4cDIwMDBfcGNpX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeHAyMDAwX3BjaV9pcnFfY2hpcCA9IHsKIAkuYWNrCT0gaXhwMjAwMF9wY2lfaXJxX21hc2ssCiAJLm1hc2sJPSBpeHAyMDAwX3BjaV9pcnFfbWFzaywKIAkudW5tYXNrCT0gaXhwMjAwMF9wY2lfaXJxX3VubWFzawpAQCAtNDQ4LDcgKzQ0OCw3IEBACiAJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9JUlFfRU5BQkxFX1NFVCwgKDEgPDwgaXJxKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHAyMDAwX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeHAyMDAwX2lycV9jaGlwID0gewogCS5hY2sJPSBpeHAyMDAwX2lycV9tYXNrLAogCS5tYXNrCT0gaXhwMjAwMF9pcnFfbWFzaywKIAkudW5tYXNrCT0gaXhwMjAwMF9pcnFfdW5tYXNrCkBAIC00ODQsNyArNDg0LDcgQEAKIAlmb3IgKGlycSA9IElSUV9JWFAyMDAwX1NPRlRfSU5UOyBpcnEgPD0gSVJRX0lYUDIwMDBfVEhEQjM7IGlycSsrKSB7CiAJCWlmICgoMSA8PCBpcnEpICYgSVhQMjAwMF9WQUxJRF9JUlFfTUFTSykgewogCQkJc2V0X2lycV9jaGlwKGlycSwgJml4cDIwMDBfaXJxX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCQl9IGVsc2Ugc2V0X2lycV9mbGFncyhpcnEsIDApOwogCX0KQEAgLTQ5Myw3ICs0OTMsNyBAQAogCQlpZigoMSA8PCAoaXJxIC0gSVJRX0lYUDIwMDBfRFJBTTBfTUlOX0VSUikpICYKIAkJCQlJWFAyMDAwX1ZBTElEX0VSUl9JUlFfTUFTSykgewogCQkJc2V0X2lycV9jaGlwKGlycSwgJml4cDIwMDBfZXJyX2lycV9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKIAkJfQogCQllbHNlCkBAIC01MDMsNyArNTAzLDcgQEAKIAogCWZvciAoaXJxID0gSVJRX0lYUDIwMDBfR1BJTzA7IGlycSA8PSBJUlFfSVhQMjAwMF9HUElPNzsgaXJxKyspIHsKIAkJc2V0X2lycV9jaGlwKGlycSwgJml4cDIwMDBfR1BJT19pcnFfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CiAJfQogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9JWFAyMDAwX0dQSU8sIGl4cDIwMDBfR1BJT19pcnFfaGFuZGxlcik7CkBAIC01MTYsNyArNTE2LDcgQEAKIAlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0lSUV9FTkFCTEVfU0VULCAoMSA8PCBJUlFfSVhQMjAwMF9QQ0kpKTsKIAlmb3IgKGlycSA9IElSUV9JWFAyMDAwX1BDSUE7IGlycSA8PSBJUlFfSVhQMjAwMF9QQ0lCOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhwMjAwMF9wY2lfaXJxX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKaW5kZXggYTZmMTQ4MC4uMGZkZDAzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKQEAgLTEzMywxMSArMTMzLDEzIEBACiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAogCWlmIChpeGRwMngwMF9tYXN0ZXJfbnB1KCkpIHsKLQkJZGV2ID0gcGNpX2ZpbmRfc2xvdCgxLCBJWERQMjQwMF9TTEFWRV9FTkVUX0RFVkZOKTsKKwkJZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMSwgSVhEUDI0MDBfU0xBVkVfRU5FVF9ERVZGTik7CiAJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCQlwY2lfZGV2X3B1dChkZXYpOwogCX0gZWxzZSB7Ci0JCWRldiA9IHBjaV9maW5kX3Nsb3QoMSwgSVhEUDI0MDBfTUFTVEVSX0VORVRfREVWRk4pOworCQlkZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgxLCBJWERQMjQwMF9NQVNURVJfRU5FVF9ERVZGTik7CiAJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCQlwY2lfZGV2X3B1dChkZXYpOwogCiAJCWl4ZHAyeDAwX3NsYXZlX3BjaV9wb3N0aW5pdCgpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKaW5kZXggOTFkMzZkOS4uNzBkMjQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKQEAgLTI2MSwxNCArMjYxLDE2IEBACiAKIAkJcGNpX2NvbW1vbl9pbml0KCZpeGRwMjgwMF9wY2kpOwogCQlpZiAoaXhkcDJ4MDBfbWFzdGVyX25wdSgpKSB7Ci0JCQlkZXYgPSBwY2lfZmluZF9zbG90KDEsIElYRFAyODAwX1NMQVZFX0VORVRfREVWRk4pOworCQkJZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMSwgSVhEUDI4MDBfU0xBVkVfRU5FVF9ERVZGTik7CiAJCQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CiAKIAkJCWl4ZHAyODAwX21hc3Rlcl9lbmFibGVfc2xhdmUoKTsKIAkJCWl4ZHAyODAwX21hc3Rlcl93YWl0X2Zvcl9zbGF2ZV9idXNfc2NhbigpOwogCQl9IGVsc2UgewotCQkJZGV2ID0gcGNpX2ZpbmRfc2xvdCgxLCBJWERQMjgwMF9NQVNURVJfRU5FVF9ERVZGTik7CisJCQlkZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgxLCBJWERQMjgwMF9NQVNURVJfRU5FVF9ERVZGTik7CiAJCQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKaW5kZXggYWY0OGNiNS4uNTJiMzY4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQlpeHAyMDAwX3JlbGVhc2Vfc2xvd3BvcnQoJm9sZF9jZmcpOwogfQogCi1zdGF0aWMgdm9pZCBpeGRwMngwMF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIGl4ZHAyeDAwX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKICAgICAgICAgdm9sYXRpbGUgdTMyIGV4X2ludGVycnVwdCA9IDA7CiAJc3RhdGljIHN0cnVjdCBzbG93cG9ydF9jZmcgb2xkX2NmZzsKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJZm9yKGkgPSAwOyBpIDwgYm9hcmRfaXJxX2NvdW50OyBpKyspIHsKIAkJaWYoZXhfaW50ZXJydXB0ICYgKDEgPDwgaSkpICB7Ci0JCQlzdHJ1Y3QgaXJxZGVzYyAqY3BsZF9kZXNjOworCQkJc3RydWN0IGlycV9kZXNjICpjcGxkX2Rlc2M7CiAJCQlpbnQgY3BsZF9pcnEgPSBJWFAyMDAwX0JPQVJEX0lSUSgwKSArIGk7CiAJCQljcGxkX2Rlc2MgPSBpcnFfZGVzYyArIGNwbGRfaXJxOwogCQkJZGVzY19oYW5kbGVfaXJxKGNwbGRfaXJxLCBjcGxkX2Rlc2MpOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeGRwMngwMF9jcGxkX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeGRwMngwMF9jcGxkX2lycV9jaGlwID0gewogCS5hY2sJPSBpeGRwMngwMF9pcnFfbWFzaywKIAkubWFzawk9IGl4ZHAyeDAwX2lycV9tYXNrLAogCS51bm1hc2sJPSBpeGRwMngwMF9pcnFfdW5tYXNrCkBAIC0xNjIsNyArMTYyLDcgQEAKIAogCWZvcihpcnEgPSBJWFAyMDAwX0JPQVJEX0lSUSgwKTsgaXJxIDwgSVhQMjAwMF9CT0FSRF9JUlEoYm9hcmRfaXJxX2NvdW50KTsgaXJxKyspIHsKIAkJc2V0X2lycV9jaGlwKGlycSwgJml4ZHAyeDAwX2NwbGRfaXJxX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCX0KIApAQCAtMjQxLDExICsyNDEsMTQgQEAKIAkvKgogCSAqIFJlbW92ZSBQTUMgZGV2aWNlIGlzIHRoZXJlIGlzIG9uZQogCSAqLwotCWlmKChkZXYgPSBwY2lfZmluZF9zbG90KDEsIElYRFAyWDAwX1BNQ19ERVZGTikpKQorCWlmKChkZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgxLCBJWERQMlgwMF9QTUNfREVWRk4pKSkgewogCQlwY2lfcmVtb3ZlX2J1c19kZXZpY2UoZGV2KTsKKwkJcGNpX2Rldl9wdXQoZGV2KTsKKwl9CiAKLQlkZXYgPSBwY2lfZmluZF9zbG90KDAsIElYRFAyWDAwXzIxNTU1X0RFVkZOKTsKKwlkZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBJWERQMlgwMF8yMTU1NV9ERVZGTik7CiAJcGNpX3JlbW92ZV9idXNfZGV2aWNlKGRldik7CisJcGNpX2Rldl9wdXQoZGV2KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCmluZGV4IDljY2FlOWUuLjMwODRhNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCkBAIC02Myw3ICs2Myw3IEBACiAKIHN0YXRpYyB1MzIgdmFsaWRfaXJxX21hc2s7CiAKLXN0YXRpYyB2b2lkIGl4ZHAyeDAxX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorc3RhdGljIHZvaWQgaXhkcDJ4MDFfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXUzMiBleF9pbnRlcnJ1cHQ7CiAJaW50IGk7CkBAIC03OSw3ICs3OSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgSVhQMjAwMF9CT0FSRF9JUlFTOyBpKyspIHsKIAkJaWYgKGV4X2ludGVycnVwdCAmICgxIDw8IGkpKSB7Ci0JCQlzdHJ1Y3QgaXJxZGVzYyAqY3BsZF9kZXNjOworCQkJc3RydWN0IGlycV9kZXNjICpjcGxkX2Rlc2M7CiAJCQlpbnQgY3BsZF9pcnEgPSBJWFAyMDAwX0JPQVJEX0lSUSgwKSArIGk7CiAJCQljcGxkX2Rlc2MgPSBpcnFfZGVzYyArIGNwbGRfaXJxOwogCQkJZGVzY19oYW5kbGVfaXJxKGNwbGRfaXJxLCBjcGxkX2Rlc2MpOwpAQCAtODksNyArODksNyBAQAogCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaXhkcDJ4MDFfaXJxX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGl4ZHAyeDAxX2lycV9jaGlwID0gewogCS5tYXNrCT0gaXhkcDJ4MDFfaXJxX21hc2ssCiAJLmFjawk9IGl4ZHAyeDAxX2lycV9tYXNrLAogCS51bm1hc2sJPSBpeGRwMngwMV9pcnFfdW5tYXNrCkBAIC0xMTksNyArMTE5LDcgQEAKIAlmb3IgKGlycSA9IE5SX0lYUDIwMDBfSVJRUzsgaXJxIDwgTlJfSVhEUDJYMDFfSVJRUzsgaXJxKyspIHsKIAkJaWYgKGlycSAmIHZhbGlkX2lycV9tYXNrKSB7CiAJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhkcDJ4MDFfaXJxX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCQl9IGVsc2UgewogCQkJc2V0X2lycV9mbGFncyhpcnEsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL3BjaS5jCmluZGV4IGQ0YmYxZTEuLjVhMDlhOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvcGNpLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogCi1zdGF0aWMgaW50IHBjaV9tYXN0ZXJfYWJvcnRzID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcGNpX21hc3Rlcl9hYm9ydHMgPSAwOwogCiBzdGF0aWMgaW50IGNsZWFyX21hc3Rlcl9hYm9ydHModm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvY29yZS5jCmluZGV4IGE3MDRhMTguLmNlNmFkNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2NvcmUuYwpAQCAtMjI0LDE0ICsyMjQsMTQgQEAKIAkqaW50cl9yZWcgfD0gKDEgPDwgKGlycSAlIDMyKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHAyM3h4X2lycV9sZXZlbF9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeHAyM3h4X2lycV9sZXZlbF9jaGlwID0gewogCS5hY2sJCT0gaXhwMjN4eF9pcnFfbWFzaywKIAkubWFzawkJPSBpeHAyM3h4X2lycV9tYXNrLAogCS51bm1hc2sJCT0gaXhwMjN4eF9pcnFfbGV2ZWxfdW5tYXNrLAogCS5zZXRfdHlwZQk9IGl4cDIzeHhfaXJxX3NldF90eXBlCiB9OwogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaXhwMjN4eF9pcnFfZWRnZV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeHAyM3h4X2lycV9lZGdlX2NoaXAgPSB7CiAJLmFjawkJPSBpeHAyM3h4X2lycV9hY2ssCiAJLm1hc2sJCT0gaXhwMjN4eF9pcnFfbWFzaywKIAkudW5tYXNrCQk9IGl4cDIzeHhfaXJxX2VkZ2VfdW5tYXNrLApAQCAtMjUxLDExICsyNTEsMTEgQEAKIC8qCiAgKiBUT0RPOiBTaG91bGQgdGhpcyBqdXN0IGJlIGRvbmUgYXQgQVNNIGxldmVsPwogICovCi1zdGF0aWMgdm9pZCBwY2lfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIHBjaV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1MzIgcGNpX2ludGVycnVwdDsKIAl1bnNpZ25lZCBpbnQgaXJxbm87Ci0Jc3RydWN0IGlycWRlc2MgKmludF9kZXNjOworCXN0cnVjdCBpcnFfZGVzYyAqaW50X2Rlc2M7CiAKIAlwY2lfaW50ZXJydXB0ID0gKklYUDIzWFhfUENJX1hTQ0FMRV9JTlRfU1RBVFVTOwogCkBAIC0yNzYsNyArMjc2LDcgQEAKIAlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGl4cDIzeHhfcGNpX2lycV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeHAyM3h4X3BjaV9pcnFfY2hpcCA9IHsKIAkuYWNrCT0gaXhwMjN4eF9wY2lfaXJxX21hc2ssCiAJLm1hc2sJPSBpeHAyM3h4X3BjaV9pcnFfbWFzaywKIAkudW5tYXNrCT0gaXhwMjN4eF9wY2lfaXJxX3VubWFzawpAQCAtMjg3LDExICsyODcsMTEgQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIElYUDIzWFhfSVJRX0xFVkVMOgogCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhwMjN4eF9pcnFfbGV2ZWxfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlicmVhazsKIAljYXNlIElYUDIzWFhfSVJRX0VER0U6CiAJCXNldF9pcnFfY2hpcChpcnEsICZpeHAyM3h4X2lycV9lZGdlX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJCWJyZWFrOwogCX0KIAlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CkBAIC0zMjIsNyArMzIyLDcgQEAKIAogCWZvciAoaXJxID0gSVJRX0lYUDIzWFhfSU5UQTsgaXJxIDw9IElSUV9JWFAyM1hYX0lOVEI7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZpeHAyM3h4X3BjaV9pcnFfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCmluZGV4IGI2YWIwZTguLjdhODZhMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCkBAIC02MCw3ICs2MCw3IEBACiAJKklYRFAyMzUxX0NQTERfSU5UQV9NQVNLX0NMUl9SRUcgPSBJWERQMjM1MV9JTlRBX0lSUV9NQVNLKGlycSk7CiB9CiAKLXN0YXRpYyB2b2lkIGl4ZHAyMzUxX2ludGFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIGl4ZHAyMzUxX2ludGFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdTE2IGV4X2ludGVycnVwdCA9CiAJCSpJWERQMjM1MV9DUExEX0lOVEFfU1RBVF9SRUcgJiBJWERQMjM1MV9JTlRBX0lSUV9WQUxJRDsKQEAgLTcwLDcgKzcwLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBJWERQMjM1MV9JTlRBX0lSUV9OVU07IGkrKykgewogCQlpZiAoZXhfaW50ZXJydXB0ICYgKDEgPDwgaSkpIHsKLQkJCXN0cnVjdCBpcnFkZXNjICpjcGxkX2Rlc2M7CisJCQlzdHJ1Y3QgaXJxX2Rlc2MgKmNwbGRfZGVzYzsKIAkJCWludCBjcGxkX2lycSA9CiAJCQkJSVhQMjNYWF9NQUNIX0lSUShJWERQMjM1MV9JTlRBX0lSUV9CQVNFICsgaSk7CiAJCQljcGxkX2Rlc2MgPSBpcnFfZGVzYyArIGNwbGRfaXJxOwpAQCAtODEsNyArODEsNyBAQAogCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaXhkcDIzNTFfaW50YV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeGRwMjM1MV9pbnRhX2NoaXAgPSB7CiAJLmFjawk9IGl4ZHAyMzUxX2ludGFfbWFzaywKIAkubWFzawk9IGl4ZHAyMzUxX2ludGFfbWFzaywKIAkudW5tYXNrCT0gaXhkcDIzNTFfaW50YV91bm1hc2sKQEAgLTk3LDcgKzk3LDcgQEAKIAkqSVhEUDIzNTFfQ1BMRF9JTlRCX01BU0tfQ0xSX1JFRyA9IElYRFAyMzUxX0lOVEJfSVJRX01BU0soaXJxKTsKIH0KIAotc3RhdGljIHZvaWQgaXhkcDIzNTFfaW50Yl9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorc3RhdGljIHZvaWQgaXhkcDIzNTFfaW50Yl9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1MTYgZXhfaW50ZXJydXB0ID0KIAkJKklYRFAyMzUxX0NQTERfSU5UQl9TVEFUX1JFRyAmIElYRFAyMzUxX0lOVEJfSVJRX1ZBTElEOwpAQCAtMTA3LDcgKzEwNyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgSVhEUDIzNTFfSU5UQl9JUlFfTlVNOyBpKyspIHsKIAkJaWYgKGV4X2ludGVycnVwdCAmICgxIDw8IGkpKSB7Ci0JCQlzdHJ1Y3QgaXJxZGVzYyAqY3BsZF9kZXNjOworCQkJc3RydWN0IGlycV9kZXNjICpjcGxkX2Rlc2M7CiAJCQlpbnQgY3BsZF9pcnEgPQogCQkJCUlYUDIzWFhfTUFDSF9JUlEoSVhEUDIzNTFfSU5UQl9JUlFfQkFTRSArIGkpOwogCQkJY3BsZF9kZXNjID0gaXJxX2Rlc2MgKyBjcGxkX2lycTsKQEAgLTExOCw3ICsxMTgsNyBAQAogCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaXhkcDIzNTFfaW50Yl9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpeGRwMjM1MV9pbnRiX2NoaXAgPSB7CiAJLmFjawk9IGl4ZHAyMzUxX2ludGJfbWFzaywKIAkubWFzawk9IGl4ZHAyMzUxX2ludGJfbWFzaywKIAkudW5tYXNrCT0gaXhkcDIzNTFfaW50Yl91bm1hc2sKQEAgLTE0Miw3ICsxNDIsNyBAQAogCSAgICAgaXJxKyspIHsKIAkJaWYgKElYRFAyMzUxX0lOVEFfSVJRX01BU0soaXJxKSAmIElYRFAyMzUxX0lOVEFfSVJRX1ZBTElEKSB7CiAJCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhkcDIzNTFfaW50YV9jaGlwKTsKIAkJfQogCX0KQEAgLTE1Myw3ICsxNTMsNyBAQAogCSAgICAgaXJxKyspIHsKIAkJaWYgKElYRFAyMzUxX0lOVEJfSVJRX01BU0soaXJxKSAmIElYRFAyMzUxX0lOVEJfSVJRX1ZBTElEKSB7CiAJCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCQlzZXRfaXJxX2NoaXAoaXJxLCAmaXhkcDIzNTFfaW50Yl9jaGlwKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9wY2kuYwppbmRleCAzYjM0ZmEzLi5hYzdkNDNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3BjaS5jCkBAIC0zNiw3ICszNiw3IEBACiAKIGV4dGVybiBpbnQgKCpleHRlcm5hbF9mYXVsdCkgKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBwdF9yZWdzICopOwogCi1zdGF0aWMgaW50IHBjaV9tYXN0ZXJfYWJvcnRzID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcGNpX21hc3Rlcl9hYm9ydHMgPSAwOwogCiAjaWZkZWYgREVCVUcKICNkZWZpbmUgREJHKHguLi4pCXByaW50ayh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L0tjb25maWcKaW5kZXggNTdmMjNiNC4uZTMxNmJkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9LY29uZmlnCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgICAgICBpbnRvIHRoZSBrZXJuZWwgYW5kIHdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIHJlYWRbYndsXS93cml0ZVtid2xdCiAgICAgICAgICAgICAgbWFjcm9zLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGR1ZSB0byBzcGVlZCBidXQgaXQKICAgICAgICAgICAgICBsaW1pdHMgdGhlIHN5c3RlbSB0byBqdXN0IDY0TUIgb2YgUENJIG1lbW9yeS4gVGhpcyBjYW4gYmUgCi0gICAgICAgICAgICAgcHJvYmxhbWF0aWMgaWYgdXNpbmcgdmlkZW8gY2FyZHMgYW5kIG90aGVyIG1lbW9yeS1oZWF2eSBkZXZpY2VzLgorICAgICAgICAgICAgIHByb2JsZW1hdGljIGlmIHVzaW5nIHZpZGVvIGNhcmRzIGFuZCBvdGhlciBtZW1vcnktaGVhdnkgZGV2aWNlcy4KICAgICAgICAgICAKICAgICAgICAgICAyKSBJZiA+IDY0TUIgb2YgbWVtb3J5IHNwYWNlIGlzIHJlcXVpcmVkLCB0aGUgSVhQNHh4IGNhbiBiZSAKIAkgICAgIGNvbmZpZ3VyZWQgdG8gdXNlIGluZGlyZWN0IHJlZ2lzdGVycyB0byBhY2Nlc3MgUENJIFRoaXMgYWxsb3dzIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwppbmRleCBjNzUxM2Y2Li4yZWM5YTllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KIAorI2luY2x1ZGUgPGFzbS9hcmNoL3VkYy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0zOSw2ICs0MCw4IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCitzdGF0aWMgaW50IF9faW5pdCBpeHA0eHhfY2xvY2tzb3VyY2VfaW5pdCh2b2lkKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElYUDR4eCBjaGlwc2V0IEkvTyBtYXBwaW5nCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTg2LDcgKzg5LDggQEAKIAlJWFA0WFhfSVJRX0xFVkVMLCBJWFA0WFhfSVJRX0VER0UKIH07CiAKLXN0YXRpYyB2b2lkIGl4cDR4eF9jb25maWdfaXJxKHVuc2lnbmVkIGlycSwgZW51bSBpeHA0eHhfaXJxX3R5cGUgdHlwZSk7CisvKiBFYWNoIGJpdCByZXByZXNlbnRzIGFuIElSUTogMTogZWRnZS10cmlnZ2VyZWQsIDA6IGxldmVsIHRyaWdnZXJlZCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBpeHA0eHhfaXJxX2VkZ2UgPSAwOwogCiAvKgogICogSVJRIC0+IEdQSU8gbWFwcGluZyB0YWJsZQpAQCAtMTM1LDcgKzEzOSwxMSBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpeHA0eHhfY29uZmlnX2lycShpcnEsIGlycV90eXBlKTsKKworCWlmIChpcnFfdHlwZSA9PSBJWFA0WFhfSVJRX0VER0UpCisJCWl4cDR4eF9pcnFfZWRnZSB8PSAoMSA8PCBpcnEpOworCWVsc2UKKwkJaXhwNHh4X2lycV9lZGdlICY9IH4oMSA8PCBpcnEpOwogCiAJaWYgKGxpbmUgPj0gOCkgewkvKiBwaW5zIDgtMTUgKi8KIAkJbGluZSAtPSA4OwpAQCAtMTY3LDE0ICsxNzUsNiBAQAogCQkqSVhQNFhYX0lDTVIgJj0gfigxIDw8IGlycSk7CiB9CiAKLXN0YXRpYyB2b2lkIGl4cDR4eF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKGNwdV9pc19peHA0NngoKSAmJiBpcnEgPj0gMzIpCi0JCSpJWFA0WFhfSUNNUjIgfD0gKDEgPDwgKGlycSAtIDMyKSk7Ci0JZWxzZQotCQkqSVhQNFhYX0lDTVIgfD0gKDEgPDwgaXJxKTsKLX0KLQogc3RhdGljIHZvaWQgaXhwNHh4X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKIAlpbnQgbGluZSA9IChpcnEgPCAzMikgPyBpcnEyZ3Bpb1tpcnFdIDogLTE7CkBAIC0xODcsNDEgKzE4NywyNSBAQAogICogTGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgb24gR1BJTyBsaW5lcyBjYW4gb25seSBiZSBjbGVhcmVkIHdoZW4gdGhlCiAgKiBpbnRlcnJ1cHQgY29uZGl0aW9uIGRpc2FwcGVhcnMuCiAgKi8KLXN0YXRpYyB2b2lkIGl4cDR4eF9pcnFfbGV2ZWxfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBpeHA0eHhfaXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQogewotCWl4cDR4eF9pcnFfYWNrKGlycSk7Ci0JaXhwNHh4X2lycV91bm1hc2soaXJxKTsKKwlpZiAoIShpeHA0eHhfaXJxX2VkZ2UgJiAoMSA8PCBpcnEpKSkKKwkJaXhwNHh4X2lycV9hY2soaXJxKTsKKworCWlmIChjcHVfaXNfaXhwNDZ4KCkgJiYgaXJxID49IDMyKQorCQkqSVhQNFhYX0lDTVIyIHw9ICgxIDw8IChpcnEgLSAzMikpOworCWVsc2UKKwkJKklYUDRYWF9JQ01SIHw9ICgxIDw8IGlycSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHA0eHhfaXJxX2xldmVsX2NoaXAgPSB7Ci0JLmFjawkJPSBpeHA0eHhfaXJxX21hc2ssCi0JLm1hc2sJCT0gaXhwNHh4X2lycV9tYXNrLAotCS51bm1hc2sJCT0gaXhwNHh4X2lycV9sZXZlbF91bm1hc2ssCi0JLnNldF90eXBlCT0gaXhwNHh4X3NldF9pcnFfdHlwZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpeHA0eHhfaXJxX2VkZ2VfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXhwNHh4X2lycV9jaGlwID0geworCS5uYW1lCQk9ICJJWFA0eHgiLAogCS5hY2sJCT0gaXhwNHh4X2lycV9hY2ssCiAJLm1hc2sJCT0gaXhwNHh4X2lycV9tYXNrLAogCS51bm1hc2sJCT0gaXhwNHh4X2lycV91bm1hc2ssCiAJLnNldF90eXBlCT0gaXhwNHh4X3NldF9pcnFfdHlwZSwKIH07CiAKLXN0YXRpYyB2b2lkIGl4cDR4eF9jb25maWdfaXJxKHVuc2lnbmVkIGlycSwgZW51bSBpeHA0eHhfaXJxX3R5cGUgdHlwZSkKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElYUDRYWF9JUlFfTEVWRUw6Ci0JCXNldF9pcnFfY2hpcChpcnEsICZpeHA0eHhfaXJxX2xldmVsX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOwotCQlicmVhazsKLQljYXNlIElYUDRYWF9JUlFfRURHRToKLQkJc2V0X2lycV9jaGlwKGlycSwgJml4cDR4eF9pcnFfZWRnZV9jaGlwKTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fZWRnZV9JUlEpOwotCQlicmVhazsKLQl9Ci0Jc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwotfQotCiB2b2lkIF9faW5pdCBpeHA0eHhfaW5pdF9pcnEodm9pZCkKIHsKIAlpbnQgaSA9IDA7CkBAIC0yNDEsOCArMjI1LDExIEBACiAJfQogCiAgICAgICAgIC8qIERlZmF1bHQgdG8gYWxsIGxldmVsIHRyaWdnZXJlZCAqLwotCWZvcihpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykKLQkJaXhwNHh4X2NvbmZpZ19pcnEoaSwgSVhQNFhYX0lSUV9MRVZFTCk7CisJZm9yKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7CisJCXNldF9pcnFfY2hpcChpLCAmaXhwNHh4X2lycV9jaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGksIGhhbmRsZV9sZXZlbF9pcnEpOworCQlzZXRfaXJxX2ZsYWdzKGksIElSUUZfVkFMSUQpOworCX0KIH0KIAogCkBAIC0yOTYsMTIgKzI4Myw1MiBAQAogCiAJLyogQ29ubmVjdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCiAJc2V0dXBfaXJxKElSUV9JWFA0WFhfVElNRVIxLCAmaXhwNHh4X3RpbWVyX2lycSk7CisKKwlpeHA0eHhfY2xvY2tzb3VyY2VfaW5pdCgpOwogfQogCiBzdHJ1Y3Qgc3lzX3RpbWVyIGl4cDR4eF90aW1lciA9IHsKIAkuaW5pdAkJPSBpeHA0eHhfdGltZXJfaW5pdCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gaXhwNHh4X3VkY19pbmZvOworCit2b2lkIF9faW5pdCBpeHA0eHhfc2V0X3VkY19pbmZvKHN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbyAqaW5mbykKK3sKKwltZW1jcHkoJml4cDR4eF91ZGNfaW5mbywgaW5mbywgc2l6ZW9mICppbmZvKTsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpeHA0eHhfdWRjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ICA9IDB4YzgwMGIwMDAsCisJCS5lbmQgICAgPSAweGM4MDBiZmZmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBJUlFfSVhQNFhYX1VTQiwKKwkJLmVuZCAgICA9IElSUV9JWFA0WFhfVVNCLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKKy8qCisgKiBVU0IgZGV2aWNlIGNvbnRyb2xsZXIuIFRoZSBJWFA0eHggdXNlcyB0aGUgc2FtZSBjb250cm9sbGVyIGFzIFBYQTJYWCwKKyAqIHNvIHdlIGp1c3QgdXNlIHRoZSBzYW1lIGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaXhwNHh4X3VkY19kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gInB4YTJ4eC11ZGMiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5udW1fcmVzb3VyY2VzICA9IDIsCisJLnJlc291cmNlICAgICAgID0gaXhwNHh4X3VkY19yZXNvdXJjZXMsCisJLmRldiAgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpeHA0eHhfdWRjX2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppeHA0eHhfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJml4cDR4eF91ZGNfZGV2aWNlLAorfTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpeHA0NnhfaTJjX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0IAk9IDB4YzgwMTEwMDAsCkBAIC0zMzcsNiArMzY0LDggQEAKIHsKIAlpeHA0eHhfZXhwX2J1c19zaXplID0gU1pfMTZNOwogCisJcGxhdGZvcm1fYWRkX2RldmljZXMoaXhwNHh4X2RldmljZXMsIEFSUkFZX1NJWkUoaXhwNHh4X2RldmljZXMpKTsKKwogCWlmIChjcHVfaXNfaXhwNDZ4KCkpIHsKIAkJaW50IHJlZ2lvbjsKIApAQCAtMzc5LDUgKzQwOCwzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQotZGV2aWNlX2luaXRjYWxsKGl4cDR4eF9jbG9ja3NvdXJjZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1sNzIwMC9jb3JlLmMKaW5kZXggYjdhZjU2NDAuLjU2MWEwZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCkBAIC01NSw3ICs1NSw3IEBACiAJSVJRX0VOQUJMRSA9IDEgPDwgaXJxOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgbDcyMDBfaXJxX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGw3MjAwX2lycV9jaGlwID0gewogCS5hY2sJCT0gbDcyMDBfbWFza19pcnEsCiAJLm1hc2sJCT0gbDcyMDBfbWFza19pcnEsCiAJLnVubWFzawkJPSBsNzIwMF91bm1hc2tfaXJxCkBAIC03MSw3ICs3MSw3IEBACiAJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmbDcyMDBfaXJxX2NoaXApOwogCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCX0KIAogCWluaXRfRklRKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9LY29uZmlnCmluZGV4IDU1OGEzNGYuLjZmNGM2YTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9LY29uZmlnCkBAIC04LDEzICs4LDEzIEBACiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBTaGFycCBLRVY3QTQwMCBkZXZlbG9wbWVudAogCSAgYm9hcmQuICBUaGlzIGhhcmR3YXJlIGlzIGRpc2NvbnRpbnVlZCwgc28gSSdkIGJlIHZlcnkKLQkgIHN1cHJpc2VkIGlmIHlvdSB3YW50ZWQgdGhpcyBvcHRpb24uCisJICBzdXJwcmlzZWQgaWYgeW91IHdhbnRlZCB0aGlzIG9wdGlvbi4KIAogY29uZmlnIE1BQ0hfTFBEN0E0MDAKIAlib29sICJMUEQ3QTQwMCBDYXJkIEVuZ2luZSIKIAlzZWxlY3QgQVJDSF9MSDdBNDAwCiAjCXNlbGVjdCBJREVfUE9MTAotCXNlbGVjdCBIQVNfVE9VQ0hTQ1JFRU5fQURTNzg0M19MSDcKKyMJc2VsZWN0IEhBU19UT1VDSFNDUkVFTl9BRFM3ODQzX0xINwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyBMb2dpYyBQcm9kdWN0IERldmVsb3BtZW50J3MKIAkgIExQRDdBNDAwIENhcmRFbmdpbmUuICBGb3IgdGhlIHRpbWUgYmVpbmcsIHRoZSBMUEQ3QTQwMCBhbmQKQEAgLTI0LDcgKzI0LDcgQEAKIAlib29sICJMUEQ3QTQwNCBDYXJkIEVuZ2luZSIKIAlzZWxlY3QgQVJDSF9MSDdBNDA0CiAjCXNlbGVjdCBJREVfUE9MTAotCXNlbGVjdCBIQVNfVE9VQ0hTQ1JFRU5fQURDX0xINworIwlzZWxlY3QgSEFTX1RPVUNIU0NSRUVOX0FEQ19MSDcKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgTG9naWMgUHJvZHVjdCBEZXZlbG9wbWVudCdzCiAJICBMUEQ3QTQwNCBDYXJkRW5naW5lLiBGb3IgdGhlIHRpbWUgYmVpbmcsIHRoZSBMUEQ3QTQwMCBhbmQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWtldjdhNDAwLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jCmluZGV4IDE1ZmJjYzkuLjZkMjY2NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWtldjdhNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gta2V2N2E0MDAuYwpAQCAtNzEsNyArNzEsNyBAQAogfTsKIAogCi1zdGF0aWMgdm9pZCBrZXY3YTQwMF9jcGxkX2hhbmRsZXIgKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorc3RhdGljIHZvaWQga2V2N2E0MDBfY3BsZF9oYW5kbGVyICh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdTMyIG1hc2sgPSBDUExEX0xBVENIRURfSU5UUzsKIAlpcnEgPSBJUlFfS0VWN0E0MDBfQ1BMRDsKQEAgLTg4LDcgKzg4LDcgQEAKIAlmb3IgKGlycSA9IElSUV9LRVY3QTQwMF9DUExEOwogCSAgICAgaXJxIDwgSVJRX0tFVjdBNDAwX0NQTEQgKyBOUl9JUlFfQk9BUkQ7ICsraXJxKSB7CiAJCXNldF9pcnFfY2hpcCAoaXJxLCAma2V2N2E0MDBfY3BsZF9jaGlwKTsKLQkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MgKGlycSwgSVJRRl9WQUxJRCk7CiAJfQogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyIChJUlFfQ1BMRCwga2V2N2E0MDBfY3BsZF9oYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jCmluZGV4IDg0NDFlMGEuLmZlNjQ5NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gtbHBkN2E0MHguYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJLnVubWFzawk9IGxoN2E0MHhfdW5tYXNrX2NwbGRfaXJxLAogfTsKIAotc3RhdGljIHZvaWQgbHBkN2E0MHhfY3BsZF9oYW5kbGVyICh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIGxwZDdhNDB4X2NwbGRfaGFuZGxlciAodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gQ1BMRF9JTlRFUlJVUFRTOwogCkBAIC0yNzksNyArMjc5LDcgQEAKIAlmb3IgKGlycSA9IElSUV9CT0FSRF9TVEFSVDsKIAkgICAgIGlycSA8IElSUV9CT0FSRF9TVEFSVCArIE5SX0lSUV9CT0FSRDsgKytpcnEpIHsKIAkJc2V0X2lycV9jaGlwIChpcnEsICZscGQ3YTQweF9jcGxkX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIgKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzIChpcnEsIElSUUZfVkFMSUQpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NvbW1vbi5oCmluZGV4IDE4ZThiYjQuLjBjYTIwYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY29tbW9uLmgKQEAgLTE1LDQgKzE1LDQgQEAKIGV4dGVybiB2b2lkIGxoN2E0MHhfY2xjZF9pbml0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGxoN2E0MHhfaW5pdF9ib2FyZF9pcnEgKHZvaWQpOwogCi0jZGVmaW5lIElSUV9ESVNQQVRDSChpcnEpIGRlc2NfaGFuZGxlX2lycSgoaXJxKSwoaXJxX2Rlc2MgKyBpcnEpLCByZWdzKQorI2RlZmluZSBJUlFfRElTUEFUQ0goaXJxKSBkZXNjX2hhbmRsZV9pcnEoKGlycSksKGlycV9kZXNjICsgaXJxKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEta2V2N2E0MDAuYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEta2V2N2E0MDAuYwppbmRleCA2NDYwNzEzLi5jNzQzM2IzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWtldjdhNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1rZXY3YTQwMC5jCkBAIC01MSw3ICs1MSw3IEBACiB9OwogCiBzdGF0aWMgdm9pZAotbGg3YTQwMF9jcGxkX2hhbmRsZXIgKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorbGg3YTQwMF9jcGxkX2hhbmRsZXIgKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1MzIgbWFzayA9IENQTERfTEFUQ0hFRF9JTlRTOwogCWlycSA9IElSUV9LRVZfN0E0MDBfQ1BMRDsKQEAgLTcxLDcgKzcxLDcgQEAKIAlmb3IgKGlycSA9IElSUV9LRVY3QTQwMF9DUExEOwogCSAgICAgaXJxIDwgSVJRX0tFVjdBNDAwX0NQTEQgKyBOUl9JUlFfS0VWN0E0MDBfQ1BMRDsgKytpcnEpIHsKIAkJc2V0X2lycV9jaGlwIChpcnEsICZsaDdhNDAwX2NwbGRfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlciAoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlciAoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzIChpcnEsIElSUUZfVkFMSUQpOwogCX0KIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlciAoSVJRX0NQTEQsIGtldjdhNDAwX2NwbGRfaGFuZGxlcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWxoN2E0MDAuYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbGg3YTQwMC5jCmluZGV4IDA5MWIyZGMuLjBiOTM4ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbGg3YTQwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbGg3YTQwMC5jCkBAIC03NCwxMSArNzQsMTEgQEAKIAkJY2FzZSBJUlFfR1BJTzZJTlRSOgogCQljYXNlIElSUV9HUElPN0lOVFI6CiAJCQlzZXRfaXJxX2NoaXAgKGlycSwgJmxoN2E0MDBfZ3Bpb19jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlciAoaXJxLCBkb19sZXZlbF9JUlEpOyAvKiBPSyBkZWZhdWx0ICovCisJCQlzZXRfaXJxX2hhbmRsZXIgKGlycSwgaGFuZGxlX2xldmVsX2lycSk7IC8qIE9LIGRlZmF1bHQgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJc2V0X2lycV9jaGlwIChpcnEsICZsaDdhNDAwX2ludGVybmFsX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIgKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCX0KIAkJc2V0X2lycV9mbGFncyAoaXJxLCBJUlFGX1ZBTElEKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWxoN2E0MDQuYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbGg3YTQwNC5jCmluZGV4IDcwNTliOTguLjU3NjBmOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbGg3YTQwNC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbGg3YTQwNC5jCkBAIC0xNjEsMTMgKzE2MSwxMyBAQAogCQkJc2V0X2lycV9jaGlwIChpcnEsIGlycSA8IDMyCiAJCQkJICAgICAgPyAmbGg3YTQwNF9ncGlvX3ZpYzFfY2hpcAogCQkJCSAgICAgIDogJmxoN2E0MDRfZ3Bpb192aWMyX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGRvX2xldmVsX0lSUSk7IC8qIE9LIGRlZmF1bHQgKi8KKwkJCXNldF9pcnFfaGFuZGxlciAoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsgLyogT0sgZGVmYXVsdCAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlzZXRfaXJxX2NoaXAgKGlycSwgaXJxIDwgMzIKIAkJCQkgICAgICA/ICZsaDdhNDA0X3ZpYzFfY2hpcAogCQkJCSAgICAgIDogJmxoN2E0MDRfdmljMl9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlciAoaXJxLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9oYW5kbGVyIChpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQl9CiAJCXNldF9pcnFfZmxhZ3MgKGlycSwgSVJRRl9WQUxJRCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1scGQ3YTQweC5jIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2lycS1scGQ3YTQweC5jCmluZGV4IGIyMDM3NjguLjE1Yjk1NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9pcnEtbHBkN2E0MHguYworKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvaXJxLWxwZDdhNDB4LmMKQEAgLTU3LDcgKzU3LDcgQEAKIAkudW5tYXNrCT0gbGg3YTQweF91bm1hc2tfY3BsZF9pcnEsCiB9OwogCi1zdGF0aWMgdm9pZCBsaDdhNDB4X2NwbGRfaGFuZGxlciAodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBsaDdhNDB4X2NwbGRfaGFuZGxlciAodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gQ1BMRF9JTlRFUlJVUFRTOwogCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlmb3IgKGlycSA9IElSUV9CT0FSRF9TVEFSVDsKIAkgICAgIGlycSA8IElSUV9CT0FSRF9TVEFSVCArIE5SX0lSUV9CT0FSRDsgKytpcnEpIHsKIAkJc2V0X2lycV9jaGlwIChpcnEsICZsaDdhNDB4X2NwbGRfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlciAoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlciAoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzIChpcnEsIElSUUZfVkFMSUQpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtbmV0eC9nZW5lcmljLmMKaW5kZXggZWRiYmJkYy4uYjljYThmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L2dlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvZ2VuZXJpYy5jCkBAIC02OSw3ICs2OSw3IEBACiAjZW5kaWYKIAogc3RhdGljIHZvaWQKLW5ldHhfaGlmX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycV91bnVzZWQsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorbmV0eF9oaWZfZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxX3VudXNlZCwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBpcnEgPSBORVRYX0lSUV9ISUZfQ0hBSU5FRCgwKTsKIAl1bnNpZ25lZCBpbnQgc3RhdDsKQEAgLTE2MCw3ICsxNjAsNyBAQAogCURFQlVHX0lSUSgiJXM6IGlycSAlZFxuIiwgX19GVU5DVElPTl9fLCBfaXJxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIG5ldHhfaGlmX2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG5ldHhfaGlmX2NoaXAgPSB7CiAJLmFjayA9IG5ldHhfaGlmX2Fja19pcnEsCiAJLm1hc2sgPSBuZXR4X2hpZl9tYXNrX2lycSwKIAkudW5tYXNrID0gbmV0eF9oaWZfdW5tYXNrX2lycSwKQEAgLTE3NSw3ICsxNzUsNyBAQAogCiAJZm9yIChpcnEgPSBORVRYX0lSUV9ISUZfQ0hBSU5FRCgwKTsgaXJxIDw9IE5FVFhfSVJRX0hJRl9MQVNUOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmbmV0eF9oaWZfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYwppbmRleCAwOTkzMzM2Li41NzczYjU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0yNiwxNSArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL25ldHgtcmVncy5oPgogCiAvKgotICogUmV0dXJucyBudW1iZXIgb2YgdXMgc2luY2UgbGFzdCBjbG9jayBpbnRlcnJ1cHQuICBOb3RlIHRoYXQgaW50ZXJydXB0cwotICogd2lsbCBoYXZlIGJlZW4gZGlzYWJsZWQgYnkgZG9fZ2V0dGltZW9mZnNldCgpCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5ldHhfZ2V0dGltZW9mZnNldCh2b2lkKQotewotCXJldHVybiByZWFkbChORVRYX0dQSU9fQ09VTlRFUl9DVVJSRU5UKDApKSAvIDEwMDsKLX0KLQotLyoKICAqIElSUSBoYW5kbGVyIGZvciB0aGUgdGltZXIKICAqLwogc3RhdGljIGlycXJldHVybl90CkBAIC00Myw2ICszNiw3IEBACiAJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CiAKIAl0aW1lcl90aWNrKCk7CisKIAl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwogCiAJLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCkBAIC01MSwxMyArNDUsMjYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbmV0eF90aW1lcl9pcnEgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIk5ldFggVGltZXIgVGljayIsCiAJLmZsYWdzICAgICAgICAgID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCiAJLmhhbmRsZXIgICAgICAgID0gbmV0eF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCitjeWNsZV90IG5ldHhfZ2V0X2N5Y2xlcyh2b2lkKQoreworCXJldHVybiByZWFkbChORVRYX0dQSU9fQ09VTlRFUl9DVVJSRU5UKDEpKTsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9uZXR4ID0geworCS5uYW1lIAkJPSAibmV0eF90aW1lciIsCisJLnJhdGluZwkJPSAyMDAsCisJLnJlYWQJCT0gbmV0eF9nZXRfY3ljbGVzLAorCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAorCS5zaGlmdCAJCT0gMjAsCisJLmlzX2NvbnRpbnVvdXMgCT0gMSwKK307CisKIC8qCiAgKiBTZXQgdXAgdGltZXIgaW50ZXJydXB0CiAgKi8KQEAgLTgwLDkgKzg3LDIwIEBACiAJCU5FVFhfR1BJT19DT1VOVEVSX0NUUkwoMCkpOwogCiAJc2V0dXBfaXJxKE5FVFhfSVJRX1RJTUVSMCwgJm5ldHhfdGltZXJfaXJxKTsKKworCS8qIFNldHVwIHRpbWVyIG9uZSBmb3IgY2xvY2tzb3VyY2UgKi8KKyAgICAgICAgd3JpdGVsKDAsIE5FVFhfR1BJT19DT1VOVEVSX0NUUkwoMSkpOworICAgICAgICB3cml0ZWwoMCwgTkVUWF9HUElPX0NPVU5URVJfQ1VSUkVOVCgxKSk7CisgICAgICAgIHdyaXRlbCgweEZGRkZGRkZGLCBORVRYX0dQSU9fQ09VTlRFUl9NQVgoMSkpOworCisgICAgICAgIHdyaXRlbChORVRYX0dQSU9fQ09VTlRFUl9DVFJMX1JVTiwKKyAgICAgICAgICAgICAgICBORVRYX0dQSU9fQ09VTlRFUl9DVFJMKDEpKTsKKworCWNsb2Nrc291cmNlX25ldHgubXVsdCA9CisJCWNsb2Nrc291cmNlX2h6Mm11bHQoQ0xPQ0tfVElDS19SQVRFLCBjbG9ja3NvdXJjZV9uZXR4LnNoaWZ0KTsKKwljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfbmV0eCk7CiB9CiAKIHN0cnVjdCBzeXNfdGltZXIgbmV0eF90aW1lciA9IHsKLQkuaW5pdCAgICAgICAgICAgPSBuZXR4X3RpbWVyX2luaXQsCi0JLm9mZnNldCAgICAgICAgID0gbmV0eF9nZXR0aW1lb2Zmc2V0LAorCS5pbml0CQk9IG5ldHhfdGltZXJfaW5pdCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcKaW5kZXggZDEzNTU2OC4uODc4MWFhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZwpAQCAtNDMsNiArNDMsNyBAQAogY29uZmlnIE1BQ0hfT01BUF9PU0sKIAlib29sICJUSSBPU0sgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTZYWAorCXNlbGVjdCBUUFM2NTAxMAogICAgIAloZWxwCiAJICBUSSBPTUFQIDU5MTIgT1NLIChPTUFQIFN0YXJ0ZXIgS2l0KSBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlCiAgICAgICAgICAgaWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCmluZGV4IGYyMjVhMDguLjlkMjM0NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKQEAgLTMyMyw3ICszMjMsOCBAQAogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaXJkYV9jb25maWctPmdwaW9fZXhwYSk7CiAJUFJFUEFSRV9XT1JLKCZpcmRhX2NvbmZpZy0+Z3Bpb19leHBhLCBzZXRfdHJhbnNfbW9kZSwgJm1vZGUpOwotCXNjaGVkdWxlX3dvcmsoJmlyZGFfY29uZmlnLT5ncGlvX2V4cGEpOworI2Vycm9yIHRoaXMgaXMgbm90IHBlcm1pdHRlZCAtIG1vZGUgaXMgYW4gYXJndW1lbnQgdmFyaWFibGUKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmlyZGFfY29uZmlnLT5ncGlvX2V4cGEsIDApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMKaW5kZXggZGJjNTU1ZC4uY2JlOTA5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYwpAQCAtNzQsNyArNzQsNyBAQAogCS5yb3dzCQk9IDgsCiAJLmNvbHMJCT0gOCwKIAkua2V5bWFwCQk9IG5va2lhNzcwX2tleW1hcCwKLQkua2V5bWFwc2l6ZQk9IEFSUkFZX1NJWkUobm9raWE3NzBfa2V5bWFwKQorCS5rZXltYXBzaXplCT0gQVJSQVlfU0laRShub2tpYTc3MF9rZXltYXApLAogCS5kZWxheQkJPSA0LAogfTsKIApAQCAtMTkxLDcgKzE5MSw3IEBACiAJCXByaW50aygiSFAgY29ubmVjdGVkXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgY29kZWNfZGVsYXllZF9wb3dlcl9kb3duKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGNvZGVjX2RlbGF5ZWRfcG93ZXJfZG93bihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJZG93bigmYXVkaW9fcHdyX3NlbSk7CiAJaWYgKGF1ZGlvX3B3cl9zdGF0ZSA9PSAtMSkKQEAgLTIwMCw3ICsyMDAsNyBAQAogCXVwKCZhdWRpb19wd3Jfc2VtKTsKIH0KIAotc3RhdGljIERFQ0xBUkVfV09SSyhjb2RlY19wb3dlcl9kb3duX3dvcmssIGNvZGVjX2RlbGF5ZWRfcG93ZXJfZG93biwgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoY29kZWNfcG93ZXJfZG93bl93b3JrLCBjb2RlY19kZWxheWVkX3Bvd2VyX2Rvd24pOwogCiBzdGF0aWMgdm9pZCBub2tpYTc3MF9hdWRpb19wd3JfZG93bih2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKaW5kZXggM2E2MjI4MC4uN2QwY2Y3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jCmluZGV4IGE2MTFjM2IuLjZkY2QxMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZGV2aWNlcy5jCkBAIC01NSw3ICs1NSw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZglkZWZpbmVkKENPTkZJR19PTUFQX1JUQykgfHwgZGVmaW5lZChDT05GSUdfT01BUF9SVEMpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX09NQVBfTU9EVUxFKQogCiAjZGVmaW5lCU9NQVBfUlRDX0JBU0UJCTB4ZmZmYjQ4MDAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9mcGdhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYwppbmRleCA4ZTQwMjA4Li4zMGUxODgxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYwpAQCAtODQsOSArODQsOSBAQAogCWZwZ2FfYWNrX2lycShpcnEpOwogfQogCi12b2lkIGlubm92YXRvcl9mcGdhX0lSUV9kZW11eCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3ZvaWQgaW5ub3ZhdG9yX2ZwZ2FfSVJRX2RlbXV4KHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQlzdHJ1Y3QgaXJxZGVzYyAqZDsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmQ7CiAJdTMyIHN0YXQ7CiAJaW50IGZwZ2FfaXJxOwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJCXNldF9pcnFfY2hpcChpLCAmb21hcF9mcGdhX2lycSk7CiAJCX0KIAotCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lycS5jCmluZGV4IDNlYTE0MGIuLjYzODNhMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCQlvbWFwX2lycV9zZXRfY2ZnKGosIDAsIDAsIGlycV90cmlnZ2VyKTsKIAogCQkJc2V0X2lycV9jaGlwKGosICZvbWFwX2lycV9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihqLCBkb19sZXZlbF9JUlEpOworCQkJc2V0X2lycV9oYW5kbGVyKGosIGhhbmRsZV9sZXZlbF9pcnEpOwogCQkJc2V0X2lycV9mbGFncyhqLCBJUlFGX1ZBTElEKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1vc2suYwppbmRleCAzYjI5ZTU5Li4wY2JmMWIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCkBAIC0zNSw3ICszNSw3IEBACiAKIHN0YXRpYyB1OCB0cHNfbGVkc19jaGFuZ2U7CiAKLXN0YXRpYyB2b2lkIHRwc193b3JrKHZvaWQgKnVudXNlZCkKK3N0YXRpYyB2b2lkIHRwc193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKQogewogCWZvciAoOzspIHsKIAkJdTgJbGVkczsKQEAgLTYxLDcgKzYxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBERUNMQVJFX1dPUksod29yaywgdHBzX3dvcmssIE5VTEwpOworc3RhdGljIERFQ0xBUkVfV09SSyh3b3JrLCB0cHNfd29yayk7CiAKICNpZmRlZglDT05GSUdfT01BUF9PU0tfTUlTVFJBTAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWg0LmMKaW5kZXggMjZhOTVhNi4uM2IxYWQxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1oNC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaDQuYwpAQCAtMjA2LDcgKzIwNiw4IEBACiAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZpcmRhX2NvbmZpZy0+Z3Bpb19leHBhKTsKIAlQUkVQQVJFX1dPUksoJmlyZGFfY29uZmlnLT5ncGlvX2V4cGEsIHNldF90cmFuc19tb2RlLCAmbW9kZSk7Ci0Jc2NoZWR1bGVfd29yaygmaXJkYV9jb25maWctPmdwaW9fZXhwYSk7CisjZXJyb3IgdGhpcyBpcyBub3QgcGVybWl0dGVkIC0gbW9kZSBpcyBhbiBhcmd1bWVudCB2YXJpYWJsZQorCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaXJkYV9jb25maWctPmdwaW9fZXhwYSwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lycS5jCmluZGV4IDExODcwMDkuLmEzOWQzMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pcnEuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CiAJCXNldF9pcnFfY2hpcChpLCAmb21hcF9pcnFfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L01ha2VmaWxlCmluZGV4IGI0NTdjYTAuLjc3NzU2NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgogIwogCi1vYmoteQkJCTo9IGNvcmUubyBpcnEubyB0aW1lLm8gY2xvY2subyBncGlvLm8gc2VyaWFsLm8gZG1hLm8KK29iai15CQkJOj0gY29yZS5vIGlycS5vIHRpbWUubyBjbG9jay5vIGdwaW8ubyBzZXJpYWwubyBkbWEubyBpMmMubwogb2JqLW0JCQk6PQogb2JqLW4JCQk6PQogb2JqLQkJCTo9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2NvcmUuYwppbmRleCAzZDczYzFlLi40MjljNzk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9jb3JlLmMKQEAgLTEzMywxMCArMTMzLDc5IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG5hbmRfZmxhc2hfZGV2aWNlID0geworCS5uYW1lID0gInBueDQwMDgtZmxhc2giLAorCS5pZCA9IC0xLAorCS5kZXYgPSB7CisJCS5jb2hlcmVudF9kbWFfbWFzayA9IDB4RkZGRkZGRkYsCisJfSwKK307CisKKy8qIFRoZSBkbWFtYXNrIG11c3QgYmUgc2V0IGZvciBPSENJIHRvIHdvcmsgKi8KK3N0YXRpYyB1NjQgb2hjaV9kbWFtYXNrID0gfih1MzIpIDA7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb2hjaV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IElPX0FERFJFU1MoUE5YNDAwOF9VU0JfQ09ORklHX0JBU0UpLAorCQkuZW5kID0gSU9fQUREUkVTUyhQTlg0MDA4X1VTQl9DT05GSUdfQkFTRSArIDB4MTAwKSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQgPSBVU0JfSE9TVF9JTlQsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvaGNpX2RldmljZSA9IHsKKwkubmFtZSA9ICJwbng0MDA4LXVzYi1vaGNpIiwKKwkuaWQgPSAtMSwKKwkuZGV2ID0geworCQkuZG1hX21hc2sgPSAmb2hjaV9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmLAorCQl9LAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShvaGNpX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gb2hjaV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZHVtX2RldmljZSA9IHsKKwkubmFtZSA9ICJwbng0MDA4LXNkdW0iLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcmdiZmJfZGV2aWNlID0geworCS5uYW1lID0gInBueDQwMDgtcmdiZmIiLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZiwKKwl9Cit9OworCitzdHJ1Y3QgcmVzb3VyY2Ugd2F0Y2hkb2dfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBQTlg0MDA4X1dET0dfQkFTRSwKKwkJLmVuZCA9IFBOWDQwMDhfV0RPR19CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugd2F0Y2hkb2dfZGV2aWNlID0geworCS5uYW1lID0gInBueDQwMDgtd2F0Y2hkb2ciLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3YXRjaGRvZ19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IHdhdGNoZG9nX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmc3BpcG54XzEsCiAJJnNwaXBueF8yLAogCSZzZXJpYWxfZGV2aWNlLAorCSZvaGNpX2RldmljZSwKKwkmbmFuZF9mbGFzaF9kZXZpY2UsCisJJnNkdW1fZGV2aWNlLAorCSZyZ2JmYl9kZXZpY2UsCisJJndhdGNoZG9nX2RldmljZSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2kyYy5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzA4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaTJjLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBJMkMgaW5pdGlhbGl6YXRpb24gZm9yIFBOWDQwMDguCisgKgorICogQXV0aG9yOiBWaXRhbHkgV29vbCA8dml0YWx5d29vbEBnbWFpbC5jb20+CisgKgorICogMjAwNS0yMDA2IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtcG54Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pMmMuaD4KKworc3RhdGljIGludCBzZXRfY2xvY2tfcnVuKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNsayAqY2xrOworCWNoYXIgbmFtZVsxMF07CisJaW50IHJldHZhbCA9IDA7CisKKwlzbnByaW50ZihuYW1lLCAxMCwgImkyYyVkX2NrIiwgcGRldi0+aWQpOworCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgbmFtZSk7CisJaWYgKCFJU19FUlIoY2xrKSkgeworCQljbGtfc2V0X3JhdGUoY2xrLCAxKTsKKwkJY2xrX3B1dChjbGspOworCX0gZWxzZQorCQlyZXR2YWwgPSAtRU5PRU5UOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzZXRfY2xvY2tfc3RvcChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjbGsgKmNsazsKKwljaGFyIG5hbWVbMTBdOworCWludCByZXR2YWwgPSAwOworCisJc25wcmludGYobmFtZSwgMTAsICJpMmMlZF9jayIsIHBkZXYtPmlkKTsKKwljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIG5hbWUpOworCWlmICghSVNfRVJSKGNsaykpIHsKKwkJY2xrX3NldF9yYXRlKGNsaywgMCk7CisJCWNsa19wdXQoY2xrKTsKKwl9IGVsc2UKKwkJcmV0dmFsID0gLUVOT0VOVDsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3BueF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKyNpZmRlZiBDT05GSUdfUE0KKwlyZXR2YWwgPSBzZXRfY2xvY2tfcnVuKHBkZXYpOworI2VuZGlmCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBpMmNfcG54X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXR2YWwgPSAwOworI2lmZGVmIENPTkZJR19QTQorCXJldHZhbCA9IHNldF9jbG9ja19ydW4ocGRldik7CisjZW5kaWYKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdTMyIGNhbGN1bGF0ZV9pbnB1dF9mcmVxKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIEhDTEtfTUhaOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX3BueF9hbGdvX2RhdGEgcG54X2FsZ29fZGF0YTAgPSB7CisJLmJhc2UgPSBQTlg0MDA4X0kyQzFfQkFTRSwKKwkuaXJxID0gSTJDXzFfSU5ULAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfcG54X2FsZ29fZGF0YSBwbnhfYWxnb19kYXRhMSA9IHsKKwkuYmFzZSA9IFBOWDQwMDhfSTJDMl9CQVNFLAorCS5pcnEgPSBJMkNfMl9JTlQsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19wbnhfYWxnb19kYXRhIHBueF9hbGdvX2RhdGEyID0geworCS5iYXNlID0gKFBOWDQwMDhfVVNCX0NPTkZJR19CQVNFICsgMHgzMDApLAorCS5pcnEgPSBVU0JfSTJDX0lOVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgcG54X2FkYXB0ZXIwID0geworCS5uYW1lID0gSTJDX0NISVBfTkFNRSAiMCIsCisJLmFsZ29fZGF0YSA9ICZwbnhfYWxnb19kYXRhMCwKK307CitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHBueF9hZGFwdGVyMSA9IHsKKwkubmFtZSA9IEkyQ19DSElQX05BTUUgIjEiLAorCS5hbGdvX2RhdGEgPSAmcG54X2FsZ29fZGF0YTEsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHBueF9hZGFwdGVyMiA9IHsKKwkubmFtZSA9ICJVU0ItSTJDIiwKKwkuYWxnb19kYXRhID0gJnBueF9hbGdvX2RhdGEyLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfcG54X2RhdGEgaTJjMF9kYXRhID0geworCS5zdXNwZW5kID0gaTJjX3BueF9zdXNwZW5kLAorCS5yZXN1bWUgPSBpMmNfcG54X3Jlc3VtZSwKKwkuY2FsY3VsYXRlX2lucHV0X2ZyZXEgPSBjYWxjdWxhdGVfaW5wdXRfZnJlcSwKKwkuc2V0X2Nsb2NrX3J1biA9IHNldF9jbG9ja19ydW4sCisJLnNldF9jbG9ja19zdG9wID0gc2V0X2Nsb2NrX3N0b3AsCisJLmFkYXB0ZXIgPSAmcG54X2FkYXB0ZXIwLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfcG54X2RhdGEgaTJjMV9kYXRhID0geworCS5zdXNwZW5kID0gaTJjX3BueF9zdXNwZW5kLAorCS5yZXN1bWUgPSBpMmNfcG54X3Jlc3VtZSwKKwkuY2FsY3VsYXRlX2lucHV0X2ZyZXEgPSBjYWxjdWxhdGVfaW5wdXRfZnJlcSwKKwkuc2V0X2Nsb2NrX3J1biA9IHNldF9jbG9ja19ydW4sCisJLnNldF9jbG9ja19zdG9wID0gc2V0X2Nsb2NrX3N0b3AsCisJLmFkYXB0ZXIgPSAmcG54X2FkYXB0ZXIxLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfcG54X2RhdGEgaTJjMl9kYXRhID0geworCS5zdXNwZW5kID0gaTJjX3BueF9zdXNwZW5kLAorCS5yZXN1bWUgPSBpMmNfcG54X3Jlc3VtZSwKKwkuY2FsY3VsYXRlX2lucHV0X2ZyZXEgPSBjYWxjdWxhdGVfaW5wdXRfZnJlcSwKKwkuc2V0X2Nsb2NrX3J1biA9IHNldF9jbG9ja19ydW4sCisJLnNldF9jbG9ja19zdG9wID0gc2V0X2Nsb2NrX3N0b3AsCisJLmFkYXB0ZXIgPSAmcG54X2FkYXB0ZXIyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAicG54LWkyYyIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpMmMwX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyYzFfZGV2aWNlID0geworCS5uYW1lID0gInBueC1pMmMiLAorCS5pZCA9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaTJjMV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmMyX2RldmljZSA9IHsKKwkubmFtZSA9ICJwbngtaTJjIiwKKwkuaWQgPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmkyYzJfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZpMmMwX2RldmljZSwKKwkmaTJjMV9kZXZpY2UsCisJJmkyYzJfZGV2aWNlLAorfTsKKwordm9pZCBfX2luaXQgcG54NDAwOF9yZWdpc3Rlcl9pMmNfZGV2aWNlcyh2b2lkKQoreworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2lycS5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2lycS5jCmluZGV4IDNhNGJjZjMuLjk2OGQwYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaXJxLmMKQEAgLTU5LDIyICs1OSwyMiBAQAogCWNhc2UgSVJRVF9SSVNJTkc6CiAJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChJTlRDX0FUUihpcnEpKSB8IElOVENfQklUKGlycSksIElOVENfQVRSKGlycSkpOwkvKmVkZ2Ugc2Vuc2l0aXZlICovCiAJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChJTlRDX0FQUihpcnEpKSB8IElOVENfQklUKGlycSksIElOVENfQVBSKGlycSkpOwkvKnJpc2luZyBlZGdlICovCi0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJYnJlYWs7CiAJY2FzZSBJUlFUX0ZBTExJTkc6CiAJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChJTlRDX0FUUihpcnEpKSB8IElOVENfQklUKGlycSksIElOVENfQVRSKGlycSkpOwkvKmVkZ2Ugc2Vuc2l0aXZlICovCiAJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChJTlRDX0FQUihpcnEpKSAmIH5JTlRDX0JJVChpcnEpLCBJTlRDX0FQUihpcnEpKTsJLypmYWxsaW5nIGVkZ2UgKi8KLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlicmVhazsKIAljYXNlIElSUVRfTE9XOgogCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoSU5UQ19BVFIoaXJxKSkgJiB+SU5UQ19CSVQoaXJxKSwgSU5UQ19BVFIoaXJxKSk7CS8qbGV2ZWwgc2Vuc2l0aXZlICovCiAJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChJTlRDX0FQUihpcnEpKSAmIH5JTlRDX0JJVChpcnEpLCBJTlRDX0FQUihpcnEpKTsJLypsb3cgbGV2ZWwgKi8KLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCWJyZWFrOwogCWNhc2UgSVJRVF9ISUdIOgogCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoSU5UQ19BVFIoaXJxKSkgJiB+SU5UQ19CSVQoaXJxKSwgSU5UQ19BVFIoaXJxKSk7CS8qbGV2ZWwgc2Vuc2l0aXZlICovCiAJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChJTlRDX0FQUihpcnEpKSB8IElOVENfQklUKGlycSksIElOVENfQVBSKGlycSkpOwkvKiBoaWdoIGxldmVsICovCi0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlicmVhazsKIAogCS8qIElSUVRfQk9USEVER0UgaXMgbm90IHN1cHBvcnRlZCAqLwpAQCAtODUsNyArODUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgcG54NDAwOF9pcnFfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcG54NDAwOF9pcnFfY2hpcCA9IHsKIAkuYWNrID0gcG54NDAwOF9tYXNrX2Fja19pcnEsCiAJLm1hc2sgPSBwbng0MDA4X21hc2tfaXJxLAogCS51bm1hc2sgPSBwbng0MDA4X3VubWFza19pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1weGEvS2NvbmZpZwppbmRleCAwM2QwN2NhLi41YzBhMTAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL0tjb25maWcKQEAgLTEzLDEyICsxMywxMCBAQAogY29uZmlnIE1BQ0hfTE9HSUNQRF9QWEEyNzAKIAlib29sICJMb2dpY1BEIFBYQTI3MCBDYXJkIEVuZ2luZSBEZXZlbG9wbWVudCBQbGF0Zm9ybSIKIAlzZWxlY3QgUFhBMjd4Ci0Jc2VsZWN0IElXTU1YVAogCiBjb25maWcgTUFDSF9NQUlOU1RPTkUKIAlib29sICJJbnRlbCBIQ0REQkJWQTAgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iCiAJc2VsZWN0IFBYQTI3eAotCXNlbGVjdCBJV01NWFQKIAogY29uZmlnIEFSQ0hfUFhBX0lEUAogCWJvb2wgIkFjY2VsZW50IFhzY2FsZSBJRFAiCkBAIC01Myw3ICs1MSw2IEBACiBjb25maWcgUFhBX1NIQVJQU0xfMjd4CiAJYm9vbCAiU2hhcnAgUFhBMjcwIG1vZGVscyAoU0wtQ3h4MDApIgogCXNlbGVjdCBQWEEyN3gKLQlzZWxlY3QgSVdNTVhUCiAKIGVuZGNob2ljZQogCkBAIC03OCwyOCArNzUsMjggQEAKIAogY29uZmlnIE1BQ0hfUE9PRExFCiAJYm9vbCAiRW5hYmxlIFNoYXJwIFNMLTU2MDAgKFBvb2RsZSkgU3VwcG9ydCIKLQlkZXBlbmRzIFBYQV9TSEFSUFNMXzI1eAorCWRlcGVuZHMgb24gUFhBX1NIQVJQU0xfMjV4CiAJc2VsZWN0IFNIQVJQX0xPQ09NTwogCXNlbGVjdCBQWEFfU1NQCiAKIGNvbmZpZyBNQUNIX0NPUkdJCiAJYm9vbCAiRW5hYmxlIFNoYXJwIFNMLUM3MDAgKENvcmdpKSBTdXBwb3J0IgotCWRlcGVuZHMgUFhBX1NIQVJQU0xfMjV4CisJZGVwZW5kcyBvbiBQWEFfU0hBUlBTTF8yNXgKIAlzZWxlY3QgUFhBX1NIQVJQX0M3eHgKIAogY29uZmlnIE1BQ0hfU0hFUEhFUkQKIAlib29sICJFbmFibGUgU2hhcnAgU0wtQzc1MCAoU2hlcGhlcmQpIFN1cHBvcnQiCi0JZGVwZW5kcyBQWEFfU0hBUlBTTF8yNXgKKwlkZXBlbmRzIG9uIFBYQV9TSEFSUFNMXzI1eAogCXNlbGVjdCBQWEFfU0hBUlBfQzd4eAogCiBjb25maWcgTUFDSF9IVVNLWQogCWJvb2wgIkVuYWJsZSBTaGFycCBTTC1DNzYwIChIdXNreSkgU3VwcG9ydCIKLQlkZXBlbmRzIFBYQV9TSEFSUFNMXzI1eAorCWRlcGVuZHMgb24gUFhBX1NIQVJQU0xfMjV4CiAJc2VsZWN0IFBYQV9TSEFSUF9DN3h4CiAKIGNvbmZpZyBNQUNIX0FLSVRBCiAJYm9vbCAiRW5hYmxlIFNoYXJwIFNMLTEwMDAgKEFraXRhKSBTdXBwb3J0IgotCWRlcGVuZHMgUFhBX1NIQVJQU0xfMjd4CisJZGVwZW5kcyBvbiBQWEFfU0hBUlBTTF8yN3gKIAlzZWxlY3QgUFhBX1NIQVJQX0N4eDAwCiAJc2VsZWN0IE1BQ0hfU1BJVFoKIAlzZWxlY3QgSTJDCkBAIC0xMDcsMTcgKzEwNCwxNyBAQAogCiBjb25maWcgTUFDSF9TUElUWgogCWJvb2wgIkVuYWJsZSBTaGFycCBaYXVydXMgU0wtMzAwMCAoU3BpdHopIFN1cHBvcnQiCi0JZGVwZW5kcyBQWEFfU0hBUlBTTF8yN3gKKwlkZXBlbmRzIG9uIFBYQV9TSEFSUFNMXzI3eAogCXNlbGVjdCBQWEFfU0hBUlBfQ3h4MDAKIAogY29uZmlnIE1BQ0hfQk9SWk9JCiAJYm9vbCAiRW5hYmxlIFNoYXJwIFphdXJ1cyBTTC0zMTAwIChCb3J6b2kpIFN1cHBvcnQiCi0JZGVwZW5kcyBQWEFfU0hBUlBTTF8yN3gKKwlkZXBlbmRzIG9uIFBYQV9TSEFSUFNMXzI3eAogCXNlbGVjdCBQWEFfU0hBUlBfQ3h4MDAKIAogY29uZmlnIE1BQ0hfVE9TQQogCWJvb2wgIkVuYWJsZSBTaGFycCBTTC02MDAweCAoVG9zYSkgU3VwcG9ydCIKLQlkZXBlbmRzIFBYQV9TSEFSUFNMXzI1eAorCWRlcGVuZHMgb24gUFhBX1NIQVJQU0xfMjV4CiAKIGNvbmZpZyBQWEEyNXgKIAlib29sCkBAIC0xMjksMTEgKzEyNiw2IEBACiAJaGVscAogCSAgU2VsZWN0IGNvZGUgc3BlY2lmaWMgdG8gUFhBMjd4IHZhcmlhbnRzCiAKLWNvbmZpZyBJV01NWFQKLQlib29sCi0JaGVscAotCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGlXTU1YdAotCiBjb25maWcgUFhBX1NIQVJQX0M3eHgKIAlib29sCiAJc2VsZWN0IFBYQV9TU1AKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2FraXRhLWlvZXhwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9ha2l0YS1pb2V4cC5jCmluZGV4IDFiMzk4NzQuLjEyZDJmZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2FraXRhLWlvZXhwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvYWtpdGEtaW9leHAuYwpAQCAtMzYsMTEgKzM2LDExIEBACiAKIHN0YXRpYyBpbnQgbWF4NzMxMF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgYWRkcmVzcywgaW50IGRhdGEpOwogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IG1heDczMTBfdGVtcGxhdGU7Ci1zdGF0aWMgdm9pZCBha2l0YV9pb2V4cF93b3JrKHZvaWQgKnByaXZhdGVfKTsKK3N0YXRpYyB2b2lkIGFraXRhX2lvZXhwX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpwcml2YXRlXyk7CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpha2l0YV9pb2V4cF9kZXZpY2U7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpb2V4cF9vdXRwdXRfdmFsdWUgPSBBS0lUQV9JT0VYUF9JT19PVVQ7Ci1ERUNMQVJFX1dPUksoYWtpdGFfaW9leHAsIGFraXRhX2lvZXhwX3dvcmssIE5VTEwpOworREVDTEFSRV9XT1JLKGFraXRhX2lvZXhwLCBha2l0YV9pb2V4cF93b3JrKTsKIAogCiAvKgpAQCAtMTU4LDcgKzE1OCw3IEBACiBFWFBPUlRfU1lNQk9MKGFraXRhX3NldF9pb2V4cCk7CiBFWFBPUlRfU1lNQk9MKGFraXRhX3Jlc2V0X2lvZXhwKTsKIAotc3RhdGljIHZvaWQgYWtpdGFfaW9leHBfd29yayh2b2lkICpwcml2YXRlXykKK3N0YXRpYyB2b2lkIGFraXRhX2lvZXhwX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpwcml2YXRlXykKIHsKIAlpZiAoYWtpdGFfaW9leHBfZGV2aWNlKQogCQltYXg3MzEwX3NldF9vdXB1dHMoYWtpdGFfaW9leHBfZGV2aWNlLCBpb2V4cF9vdXRwdXRfdmFsdWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZ2VuZXJpYy5jCmluZGV4IDQ1ZmIyYzMuLjZhZTYwNTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2dlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9nZW5lcmljLmMKQEAgLTI1LDYgKzI1LDEwIEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2NudDMyX3RvXzYzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNDEsNiArNDUsNjIgQEAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKIC8qCisgKiBUaGlzIGlzIHRoZSBQWEEyeHggc2NoZWRfY2xvY2sgaW1wbGVtZW50YXRpb24uIFRoaXMgaGFzIGEgcmVzb2x1dGlvbgorICogb2YgYXQgbGVhc3QgMzA4bnMgYW5kIGEgbWF4aW11bSB2YWx1ZSB0aGF0IGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mCisgKiBDTE9DS19USUNLX1JBVEUuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIG1vbm90b25pYyBpbiB0aGF0IHJhbmdlIGFzCisgKiBsb25nIGFzIHRoZXJlIGlzIGFsd2F5cyBsZXNzIHRoYW4gNTgyIHNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlCisgKiBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdiA9IGNudDMyX3RvXzYzKE9TQ1IpOworCS8qIE5vdGU6IHRvcCBiaXQgb3YgdiBuZWVkcyBjbGVhcmVkIHVubGVzcyBtdWx0aXBsaWVyIGlzIGV2ZW4uICovCisKKyNpZglDTE9DS19USUNLX1JBVEUgPT0gMzY4NjQwMAorCS8qIDFFOSAvIDM2ODY0MDAgPT4gNzgxMjUgLyAyODgsIG1heCB2YWx1ZSA9IDMyMDI1NTk3cyAoMzcwIGRheXMpLiAqLworCS8qIFRoZSA8PDEgaXMgdXNlZCB0byBnZXQgcmlkIG9mIHRpY2suaGkgdG9wIGJpdCAqLworCXYgKj0gNzgxMjU8PDE7CisJZG9fZGl2KHYsIDI4ODw8MSk7CisjZWxpZglDTE9DS19USUNLX1JBVEUgPT0gMzI1MDAwMAorCS8qIDFFOSAvIDMyNTAwMDAgPT4gNDAwMCAvIDEzLCBtYXggdmFsdWUgPSA3MDk0OTAxNTZzICg4MjExIGRheXMpICovCisJdiAqPSA0MDAwOworCWRvX2Rpdih2LCAxMyk7CisjZWxpZglDTE9DS19USUNLX1JBVEUgPT0gMzI0OTYwMAorCS8qIDFFOSAvIDMyNDk2MDAgPT4gNjI1MDAwIC8gMjAzMSwgbWF4IHZhbHVlID0gNDU0MTI5NXMgKDUyIGRheXMpICovCisJdiAqPSA2MjUwMDA7CisJZG9fZGl2KHYsIDIwMzEpOworI2Vsc2UKKyN3YXJuaW5nICJjb25zaWRlciBmaXhpbmcgc2NoZWRfY2xvY2sgZm9yIHlvdXIgdmFsdWUgb2YgQ0xPQ0tfVElDS19SQVRFIgorCS8qCisJICogOTYtYml0IG1hdGggdG8gcGVyZm9ybSB0aWNrICogTlNFQ19QRVJfU0VDIC8gQ0xPQ0tfVElDS19SQVRFIGZvcgorCSAqIGFueSB2YWx1ZSBvZiBDTE9DS19USUNLX1JBVEUuIE1heCB2YWx1ZSBpcyBpbiB0aGUgODAgdGhvdXNhbmQKKwkgKiB5ZWFycyByYW5nZSB3aGljaCBpcyBuaWNlLCBidXQgd2l0aCBoaWdoZXIgY29tcHV0YXRpb24gY29zdC4KKwkgKi8KKwl7CisJCXVuaW9uIHsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisJCQlzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIGxvLCBoaTsgfTsKKwkJfSB4OworCQl1bnNpZ25lZCBsb25nIGxvbmcgeTsKKworCQl4LnZhbCA9IHY7CisJCXguaGkgJj0gMHg3ZmZmZmZmZjsKKwkJeSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpeC5sbyAqIE5TRUNfUEVSX1NFQzsKKwkJeC5sbyA9IHk7CisJCXkgPSAoeSA+PiAzMikgKyAodW5zaWduZWQgbG9uZyBsb25nKXguaGkgKiBOU0VDX1BFUl9TRUM7CisJCXguaGkgPSBkb19kaXYoeSwgQ0xPQ0tfVElDS19SQVRFKTsKKwkJZG9fZGl2KHgudmFsLCBDTE9DS19USUNLX1JBVEUpOworCQl4LmhpICs9IHk7CisJCXYgPSB4LnZhbDsKKwl9CisjZW5kaWYKKworCXJldHVybiB2OworfQorCisvKgogICogSGFuZHkgZnVuY3Rpb24gdG8gc2V0IEdQSU8gYWx0ZXJuYXRlIGZ1bmN0aW9ucwogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKaW5kZXggYWIxYTE2MC4uZjgxNTY3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogICogRGVtdXggaGFuZGxlciBmb3IgR1BJTz49MiBlZGdlIGRldGVjdCBpbnRlcnJ1cHRzCiAgKi8KIAotc3RhdGljIHZvaWQgcHhhX2dwaW9fZGVtdXhfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIHB4YV9ncGlvX2RlbXV4X2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGludCBtYXNrOwogCWludCBsb29wOwpAQCAtMjg2LDI3ICsyODYsMjcgQEAKIAogCWZvciAoaXJxID0gUFhBX0lSUShQWEFfSVJRX1NLSVApOyBpcnEgPD0gUFhBX0lSUSgzMSk7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZweGFfaW50ZXJuYWxfY2hpcF9sb3cpOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCX0KIAogI2lmIFBYQV9JTlRFUk5BTF9JUlFTID4gMzIKIAlmb3IgKGlycSA9IFBYQV9JUlEoMzIpOyBpcnEgPCBQWEFfSVJRKFBYQV9JTlRFUk5BTF9JUlFTKTsgaXJxKyspIHsKIAkJc2V0X2lycV9jaGlwKGlycSwgJnB4YV9pbnRlcm5hbF9jaGlwX2hpZ2gpOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOwogCX0KICNlbmRpZgogCiAJZm9yIChpcnEgPSBJUlFfR1BJTzA7IGlycSA8PSBJUlFfR1BJTzE7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZweGFfbG93X2dwaW9fY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAl9CiAKIAlmb3IgKGlycSA9IElSUV9HUElPKDIpOyBpcnEgPD0gSVJRX0dQSU8oUFhBX0xBU1RfR1BJTyk7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZweGFfbXV4ZWRfZ3Bpb19jaGlwKTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fZWRnZV9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHBkMjcwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9scGQyNzAuYwppbmRleCA1NzQ5ZjZiLi44ZTI3YTY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9scGQyNzAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9scGQyNzAuYwpAQCAtNzUsNyArNzUsNyBAQAogCS51bm1hc2sJCT0gbHBkMjcwX3VubWFza19pcnEsCiB9OwogCi1zdGF0aWMgdm9pZCBscGQyNzBfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBscGQyNzBfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGxvbmcgcGVuZGluZzsKIApAQCAtMTA1LDcgKzEwNSw3IEBACiAJLyogc2V0dXAgZXh0cmEgTG9naWNQRCBQWEEyNzAgaXJxcyAqLwogCWZvciAoaXJxID0gTFBEMjcwX0lSUSgyKTsgaXJxIDw9IExQRDI3MF9JUlEoNCk7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZscGQyNzBfaXJxX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAl9CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0dQSU8oMCksIGxwZDI3MF9pcnFfaGFuZGxlcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKaW5kZXggZWU4MGQ2Mi4uMDU1ZGU3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwpAQCAtODUsNyArODUsNyBAQAogCS51bm1hc2sJCT0gbHViYm9ja191bm1hc2tfaXJxLAogfTsKIAotc3RhdGljIHZvaWQgbHViYm9ja19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIGx1YmJvY2tfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXVuc2lnbmVkIGxvbmcgcGVuZGluZyA9IExVQl9JUlFfU0VUX0NMUiAmIGx1YmJvY2tfaXJxX2VuYWJsZWQ7CiAJZG8gewpAQCAtMTA4LDcgKzEwOCw3IEBACiAJLyogc2V0dXAgZXh0cmEgbHViYm9jayBpcnFzICovCiAJZm9yIChpcnEgPSBMVUJCT0NLX0lSUSgwKTsgaXJxIDw9IExVQkJPQ0tfTEFTVF9JUlE7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZsdWJib2NrX2lycV9jaGlwKTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJfQogCkBAIC0zOTcsNyArMzk3LDcgQEAKIAlpZiAoTFVCX0lSUV9TRVRfQ0xSICYgKDEgPDwgMCkpCiAJCW1vZF90aW1lcigmbW1jX3RpbWVyLCBqaWZmaWVzICsgTU1DX1BPTExfUkFURSk7CiAJZWxzZSB7Ci0JCSh2b2lkKSBtbWNfZGV0ZWN0X2ludChMVUJCT0NLX1NEX0lSUSwgKHZvaWQgKilkYXRhLCBOVUxMKTsKKwkJKHZvaWQpIG1tY19kZXRlY3RfaW50KExVQkJPQ0tfU0RfSVJRLCAodm9pZCAqKWRhdGEpOwogCQllbmFibGVfaXJxKExVQkJPQ0tfU0RfSVJRKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCmluZGV4IDQ5YzM0ZDkuLjU2ZDk0ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCkBAIC03MSw3ICs3MSw3IEBACiAJLnVubWFzawkJPSBtYWluc3RvbmVfdW5tYXNrX2lycSwKIH07CiAKLXN0YXRpYyB2b2lkIG1haW5zdG9uZV9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK3N0YXRpYyB2b2lkIG1haW5zdG9uZV9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgbG9uZyBwZW5kaW5nID0gTVNUX0lOVFNFVENMUiAmIG1haW5zdG9uZV9pcnFfZW5hYmxlZDsKIAlkbyB7CkBAIC05NCw3ICs5NCw3IEBACiAJLyogc2V0dXAgZXh0cmEgTWFpbnN0b25lIGlycXMgKi8KIAlmb3IoaXJxID0gTUFJTlNUT05FX0lSUSgwKTsgaXJxIDw9IE1BSU5TVE9ORV9JUlEoMTUpOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmbWFpbnN0b25lX2lycV9jaGlwKTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCWlmIChpcnEgPT0gTUFJTlNUT05FX0lSUSgxMCkgfHwgaXJxID09IE1BSU5TVE9ORV9JUlEoMTQpKQogCQkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFIHwgSVJRRl9OT0FVVE9FTik7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wbS5jCmluZGV4IDIxMTJjNDEuLmI0ZDgyNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG0uYwpAQCAtODMsNyArODMsOCBAQAogCiAjaWZkZWYgQ09ORklHX0lXTU1YVAogCS8qIGZvcmNlIGFueSBpV01NWHQgY29udGV4dCB0byByYW0gKiovCi0JaXdtbXh0X3Rhc2tfZGlzYWJsZShOVUxMKTsKKwlpZiAoZWxmX2h3Y2FwICYgSFdDQVBfSVdNTVhUKQorCQlpd21teHRfdGFza19kaXNhYmxlKE5VTEwpOwogI2VuZGlmCiAKIAkvKiBwcmVzZXJ2ZSBjdXJyZW50IHRpbWUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYwppbmRleCAzYWMyNjhmLi4zNzc1YjhmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CkBAIC00OCwyNyArNDksNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBJUlFzIGFyZSBkaXNhYmxlZCBiZWZvcmUgZW50ZXJpbmcgaGVyZSBmcm9tIGRvX2dldHRpbWVvZmRheSgpICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBweGFfZ2V0dGltZW9mZnNldCAodm9pZCkKLXsKLQlsb25nIHRpY2tzX3RvX21hdGNoLCBlbGFwc2VkLCB1c2VjOwotCi0JLyogR2V0IHRpY2tzIGJlZm9yZSBuZXh0IHRpbWVyIG1hdGNoICovCi0JdGlja3NfdG9fbWF0Y2ggPSBPU01SMCAtIE9TQ1I7Ci0KLQkvKiBXZSBuZWVkIGVsYXBzZWQgdGlja3Mgc2luY2UgbGFzdCBtYXRjaCAqLwotCWVsYXBzZWQgPSBMQVRDSCAtIHRpY2tzX3RvX21hdGNoOwotCi0JLyogZG9uJ3QgZ2V0IGZvb2xlZCBieSB0aGUgd29ya2Fyb3VuZCBpbiBweGFfdGltZXJfaW50ZXJydXB0KCkgKi8KLQlpZiAoZWxhcHNlZCA8PSAwKQotCQlyZXR1cm4gMDsKLQotCS8qIE5vdyBjb252ZXJ0IHRoZW0gdG8gdXNlYyAqLwotCXVzZWMgPSAodW5zaWduZWQgbG9uZykoZWxhcHNlZCAqICh0aWNrX25zZWMgLyAxMDAwKSkvTEFUQ0g7Ci0KLQlyZXR1cm4gdXNlYzsKLX0KLQogI2lmZGVmIENPTkZJR19OT19JRExFX0haCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpbml0aWFsX21hdGNoOwogc3RhdGljIGludCBtYXRjaF9wb3Nwb25lZDsKQEAgLTEyMSw5ICsxMDEsMjQgQEAKIAkuaGFuZGxlcgk9IHB4YV90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCitjeWNsZV90IHB4YV9nZXRfY3ljbGVzKHZvaWQpCit7CisJcmV0dXJuIE9TQ1I7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfcHhhID0geworCS5uYW1lICAgICAgICAgICA9ICJweGFfdGltZXIiLAorCS5yYXRpbmcgICAgICAgICA9IDIwMCwKKwkucmVhZCAgICAgICAgICAgPSBweGFfZ2V0X2N5Y2xlcywKKwkubWFzayAgICAgICAgICAgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKKwkuc2hpZnQgICAgICAgICAgPSAyMCwKKwkuaXNfY29udGludW91cyAgPSAxLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IHB4YV90aW1lcl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHRpbWVzcGVjIHR2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzZXRfcnRjID0gcHhhX3NldF9ydGM7CiAKQEAgLTEzMiwxMiArMTI3LDIwIEBACiAJZG9fc2V0dGltZW9mZGF5KCZ0dik7CiAKIAlPSUVSID0gMDsJCS8qIGRpc2FibGUgYW55IHRpbWVyIGludGVycnVwdHMgKi8KLQlPU0NSID0gTEFUQ0gqMjsJCS8qIHB1c2ggT1NDUiBvdXQgb2YgdGhlIHdheSAqLwotCU9TTVIwID0gTEFUQ0g7CQkvKiBzZXQgaW5pdGlhbCBtYXRjaCAqLwogCU9TU1IgPSAweGY7CQkvKiBjbGVhciBzdGF0dXMgb24gYWxsIHRpbWVycyAqLwogCXNldHVwX2lycShJUlFfT1NUMCwgJnB4YV90aW1lcl9pcnEpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlPSUVSID0gT0lFUl9FMDsJCS8qIGVuYWJsZSBtYXRjaCBvbiB0aW1lciAwIHRvIGNhdXNlIGludGVycnVwdHMgKi8KLQlPU0NSID0gMDsJCS8qIGluaXRpYWxpemUgZnJlZS1ydW5uaW5nIHRpbWVyICovCisJT1NNUjAgPSBPU0NSICsgTEFUQ0g7CS8qIHNldCBpbml0aWFsIG1hdGNoICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogb24gUFhBIE9TQ1IgcnVucyBjb250aW5pb3VzbHkgYW5kIGlzIG5vdCB3cml0dGVuIHRvLCBzbyB3ZSBjYW4gdXNlIGl0CisJICogYXMgY2xvY2sgc291cmNlIGRpcmVjdGx5LgorCSAqLworCWNsb2Nrc291cmNlX3B4YS5tdWx0ID0KKwkJY2xvY2tzb3VyY2VfaHoybXVsdChDTE9DS19USUNLX1JBVEUsIGNsb2Nrc291cmNlX3B4YS5zaGlmdCk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX3B4YSk7CisKIH0KIAogI2lmZGVmIENPTkZJR19OT19JRExFX0haCkBAIC0yMTAsNyArMjEzLDYgQEAKIAkuaW5pdAkJPSBweGFfdGltZXJfaW5pdCwKIAkuc3VzcGVuZAk9IHB4YV90aW1lcl9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcHhhX3RpbWVyX3Jlc3VtZSwKLQkub2Zmc2V0CQk9IHB4YV9nZXR0aW1lb2Zmc2V0LAogI2lmZGVmIENPTkZJR19OT19JRExFX0haCiAJLmR5bl90aWNrCT0gJnB4YV9keW5fdGljaywKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3RyaXplcHM0LmMKaW5kZXggYzE4MjdkMC4uMTE5YzY0YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdHJpemVwczQuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS90cml6ZXBzNC5jCkBAIC0zOTMsMTAgKzM5Myw2IEBACiAgICAgLnB4YWZiX2JhY2tsaWdodF9wb3dlciA9IGJvYXJkX2JhY2tsaWdodF9wb3dlciwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB0cml6ZXBzNF9maXh1cChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLCBzdHJ1Y3QgdGFnICp0YWdzLCBjaGFyICoqY21kbGluZSwgc3RydWN0IG1lbWluZm8gKm1pKQotewotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgdHJpemVwczRfaW5pdCh2b2lkKQogewogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHRyaXplcHM0X2RldmljZXMsIEFSUkFZX1NJWkUodHJpemVwczRfZGV2aWNlcykpOwpAQCAtNDY5LDcgKzQ2NSw2IEBACiAJLnBoeXNfaW8JPSAweDQwMDAwMDAwLAogCS5pb19wZ19vZmZzdAk9IChpb19wMnYoMHg0MDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAogCS5ib290X3BhcmFtcwk9IFRSSVpFUFM0X1NEUkFNX0JBU0UgKyAweDEwMCwKLQkuZml4dXAJCT0gdHJpemVwczRfZml4dXAsCiAJLmluaXRfbWFjaGluZQk9IHRyaXplcHM0X2luaXQsCiAJLm1hcF9pbwkJPSB0cml6ZXBzNF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gcHhhX2luaXRfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwppbmRleCA2OGM2NzA1Li44NGQzZmU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwpAQCAtMTQxLDYgKzE0MSwxOSBAQAogCS5yZXNvdXJjZQk9IHJlYWx2aWV3X3NtYzkxeF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJlYWx2aWV3X2kyY19yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gUkVBTFZJRVdfSTJDX0JBU0UsCisJLmVuZAkJPSBSRUFMVklFV19JMkNfQkFTRSArIFNaXzRLIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJlYWx2aWV3X2kyY19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInZlcnNhdGlsZS1pMmMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJnJlYWx2aWV3X2kyY19yZXNvdXJjZSwKK307CisKICNkZWZpbmUgUkVBTFZJRVdfU1lTTUNJCShfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpICsgUkVBTFZJRVdfU1lTX01DSV9PRkZTRVQpCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmVhbHZpZXdfbW1jX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCmluZGV4IDkzZTg2ZDkuLjJiNTM0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCkBAIC0xMDgsNiArMTA4LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcmVhbHZpZXdfZmxhc2hfZGV2aWNlOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcmVhbHZpZXdfc21jOTF4X2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJlYWx2aWV3X2kyY19kZXZpY2U7CiBleHRlcm4gc3RydWN0IG1tY19wbGF0Zm9ybV9kYXRhIHJlYWx2aWV3X21tYzBfcGxhdF9kYXRhOwogZXh0ZXJuIHN0cnVjdCBtbWNfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMxX3BsYXRfZGF0YTsKIGV4dGVybiBzdHJ1Y3QgY2xrIHJlYWx2aWV3X2NsY2RfY2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19lYi5jCmluZGV4IDg0YTk1OTUuLjk3NDFiNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKQEAgLTE1NSw2ICsxNTUsNyBAQAogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19mbGFzaF9kZXZpY2UpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfc21jOTF4X2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19pMmNfZGV2aWNlKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtYmFfZGV2cyk7IGkrKykgewogCQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmQgPSBhbWJhX2RldnNbaV07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJwYy9pcnEuYyBiL2FyY2gvYXJtL21hY2gtcnBjL2lycS5jCmluZGV4IDU2YjI3MTYuLjdhMDI5NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcnBjL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcnBjL2lycS5jCkBAIC0zNCw3ICszNCw3IEBACiAJaW9tZF93cml0ZWIodmFsIHwgbWFzaywgSU9NRF9JUlFNQVNLQSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpb21kX2FfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW9tZF9hX2NoaXAgPSB7CiAJLmFjawk9IGlvbWRfYWNrX2lycV9hLAogCS5tYXNrCT0gaW9tZF9tYXNrX2lycV9hLAogCS51bm1hc2sgPSBpb21kX3VubWFza19pcnFfYSwKQEAgLTU4LDcgKzU4LDcgQEAKIAlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0lSUU1BU0tCKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIGlvbWRfYl9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpb21kX2JfY2hpcCA9IHsKIAkuYWNrCT0gaW9tZF9tYXNrX2lycV9iLAogCS5tYXNrCT0gaW9tZF9tYXNrX2lycV9iLAogCS51bm1hc2sgPSBpb21kX3VubWFza19pcnFfYiwKQEAgLTgyLDcgKzgyLDcgQEAKIAlpb21kX3dyaXRlYih2YWwgfCBtYXNrLCBJT01EX0RNQU1BU0spOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgaW9tZF9kbWFfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW9tZF9kbWFfY2hpcCA9IHsKIAkuYWNrCT0gaW9tZF9tYXNrX2lycV9kbWEsCiAJLm1hc2sJPSBpb21kX21hc2tfaXJxX2RtYSwKIAkudW5tYXNrID0gaW9tZF91bm1hc2tfaXJxX2RtYSwKQEAgLTEwNiw3ICsxMDYsNyBAQAogCWlvbWRfd3JpdGViKHZhbCB8IG1hc2ssIElPTURfRklRTUFTSyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBpb21kX2ZpcV9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpb21kX2ZpcV9jaGlwID0gewogCS5hY2sJPSBpb21kX21hc2tfaXJxX2ZpcSwKIAkubWFzawk9IGlvbWRfbWFza19pcnFfZmlxLAogCS51bm1hc2sgPSBpb21kX3VubWFza19pcnFfZmlxLApAQCAtMTM0LDE5ICsxMzQsMTkgQEAKIAkJc3dpdGNoIChpcnEpIHsKIAkJY2FzZSAwIC4uLiA3OgogCQkJc2V0X2lycV9jaGlwKGlycSwgJmlvbWRfYV9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CiAJCQlicmVhazsKIAogCQljYXNlIDggLi4uIDE1OgogCQkJc2V0X2lycV9jaGlwKGlycSwgJmlvbWRfYl9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CiAJCQlicmVhazsKIAogCQljYXNlIDE2IC4uLiAyMToKIAkJCXNldF9pcnFfY2hpcChpcnEsICZpb21kX2RtYV9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBmbGFncyk7CiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwppbmRleCA2Mzk2NWM3Li45ZjQ2YmYzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwpAQCAtNDEsOSArNDEsMTYgQEAKIAkgIFNheSBZCWhlcmUgdG8gZW5hYmxlIHRoZSBQQzEwNCBJUlEgcm91dGluZyBvbiB0aGUKIAkgIFNpbXRlYyBCQVNUIChFQjI0MTBJVFgpCiAKK2NvbmZpZyBQTV9IMTk0MAorCWJvb2wKKwlkZXBlbmRzIG9uIFBNCisJaGVscAorCSAgSW50ZXJuYWwgbm9kZSBmb3IgSDE5NDAgYW5kIHJlbGF0ZWQgUE0KKwogY29uZmlnIEFSQ0hfSDE5NDAKIAlib29sICJJUEFRIEgxOTQwIgogCXNlbGVjdCBDUFVfUzNDMjQxMAorCXNlbGVjdCBQTV9IMTk0MAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgSFAgSVBBUSBIMTk0MAogCkBAIC05MSw3ICs5OCw3IEBACiBjb25maWcgTUFDSF9TM0MyNDEzCiAJYm9vbAogCWhlbHAKLQkgIEludGVybmFsIG5vZGUgZm9yIFMzQzI0MTMgdmVyaXNvbiBvZiBTTURLMjQxMywgc28gdGhhdAorCSAgSW50ZXJuYWwgbm9kZSBmb3IgUzNDMjQxMyB2ZXJzaW9uIG9mIFNNREsyNDEzLCBzbyB0aGF0CiAJICBtYWNoaW5lX2lzX3MzYzI0MTMoKSB3aWxsIHdvcmsgd2hlbiBNQUNIX1NNREsyNDEzIGlzCiAJICBzZWxlY3RlZAogCkBAIC0xMTUsNiArMTIyLDcgQEAKIGNvbmZpZyBNQUNIX1JYMzcxNQogCWJvb2wgIkhQIGlQQVEgcngzNzE1IgogCXNlbGVjdCBDUFVfUzNDMjQ0MAorCXNlbGVjdCBQTV9IMTk0MAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSB1c2luZyB0aGUgSFAgaVBBUSByeDM3MTUuCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQppbmRleCBkNjYwMTMzLi4yNzY2M2UyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCkBAIC0zMSw2ICszMSw3IEBACiAKIG9iai0kKENPTkZJR19QTSkJCSs9IHBtLm8gc2xlZXAubwogb2JqLSQoQ09ORklHX1BNX1NJTVRFQykJCSs9IHBtLXNpbXRlYy5vCitvYmotJChDT05GSUdfUE1fSDE5NDApCQkrPSBwbS1oMTk0MC5vCiAKICMgUzNDMjQxMiBzdXBwb3J0CiBvYmotJChDT05GSUdfQ1BVX1MzQzI0MTIpCSs9IHMzYzI0MTIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Jhc3QtaXJxLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvYmFzdC1pcnEuYwppbmRleCAyM2Q1YmVlLi4zNzllZmU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvYmFzdC1pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvYmFzdC1pcnEuYwpAQCAtODgsNyArODgsNyBAQAogc3RhdGljIHZvaWQKIGJhc3RfcGMxMDRfbWFza2Fjayh1bnNpZ25lZCBpbnQgaXJxbm8pCiB7Ci0Jc3RydWN0IGlycWRlc2MgKmRlc2MgPSBpcnFfZGVzYyArIElSUV9JU0E7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBJUlFfSVNBOwogCiAJYmFzdF9wYzEwNF9tYXNrKGlycW5vKTsKIAlkZXNjLT5jaGlwLT5hY2soSVJRX0lTQSk7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAlfX3Jhd193cml0ZWIodGVtcCwgQkFTVF9WQV9QQzEwNF9JUlFNQVNLKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwICBiYXN0X3BjMTA0X2NoaXAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwICBiYXN0X3BjMTA0X2NoaXAgPSB7CiAJLm1hc2sJICAgICA9IGJhc3RfcGMxMDRfbWFzaywKIAkudW5tYXNrCSAgICAgPSBiYXN0X3BjMTA0X3VubWFzaywKIAkuYWNrCSAgICAgPSBiYXN0X3BjMTA0X21hc2thY2sKQEAgLTExMiw3ICsxMTIsNyBAQAogCiBzdGF0aWMgdm9pZAogYmFzdF9pcnFfcGMxMDRfZGVtdXgodW5zaWduZWQgaW50IGlycSwKLQkJICAgICBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKKwkJICAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IHN0YXQ7CiAJdW5zaWduZWQgaW50IGlycW5vOwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCQl1bnNpZ25lZCBpbnQgaXJxbm8gPSBiYXN0X3BjMTA0X2lycXNbaV07CiAKIAkJCXNldF9pcnFfY2hpcChpcnFubywgJmJhc3RfcGMxMDRfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGhhbmRsZV9sZXZlbF9pcnEpOwogCQkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZG1hLmMKaW5kZXggM2QyMTFkYy4uMDFhYmIwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kbWEuYwpAQCAtNDAsNyArNDAsNyBAQAogCiAvKiBpbyBtYXAgZm9yIGRtYSAqLwogc3RhdGljIHZvaWQgX19pb21lbSAqZG1hX2Jhc2U7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpkbWFfa21lbTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZG1hX2ttZW07CiAKIHN0cnVjdCBzM2MyNHh4X2RtYV9zZWxlY3Rpb24gZG1hX3NlbDsKIApAQCAtMTI3MSw3ICsxMjcxLDcgQEAKIAogLyoga21lbSBjYWNoZSBpbXBsZW1lbnRhdGlvbiAqLwogCi1zdGF0aWMgdm9pZCBzM2MyNDEwX2RtYV9jYWNoZV9jdG9yKHZvaWQgKnAsIGttZW1fY2FjaGVfdCAqYywgdW5zaWduZWQgbG9uZyBmKQorc3RhdGljIHZvaWQgczNjMjQxMF9kbWFfY2FjaGVfY3Rvcih2b2lkICpwLCBzdHJ1Y3Qga21lbV9jYWNoZSAqYywgdW5zaWduZWQgbG9uZyBmKQogewogCW1lbXNldChwLCAwLCBzaXplb2Yoc3RydWN0IHMzYzI0MTBfZG1hX2J1ZikpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9ncGlvLmMKaW5kZXggZGI2MzkzYy4uYmEzNDY1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZ3Bpby5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCiAgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CiAgKgotICogUzNDMjQxMCBHUElPIHN1cHBvcnQKKyAqIFMzQzI0WFggR1BJTyBzdXBwb3J0CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNjMsMyArMTYzLDIyIEBACiB9CiAKIEVYUE9SVF9TWU1CT0woczNjMjQxMF9tb2RpZnlfbWlzY2NyKTsKKworaW50IHMzYzI0MTBfZ3Bpb19nZXRpcnEodW5zaWduZWQgaW50IHBpbikKK3sKKwlpZiAocGluIDwgUzNDMjQxMF9HUEYwIHx8IHBpbiA+IFMzQzI0MTBfR1BHMTUpCisJCXJldHVybiAtMTsJLyogbm90IHZhbGlkIGludGVycnVwdHMgKi8KKworCWlmIChwaW4gPCBTM0MyNDEwX0dQRzAgJiYgcGluID4gUzNDMjQxMF9HUEY3KQorCQlyZXR1cm4gLTE7CS8qIG5vdCB2YWxpZCBwaW4gKi8KKworCWlmIChwaW4gPCBTM0MyNDEwX0dQRjQpCisJCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEYwKSArIElSUV9FSU5UMDsKKworCWlmIChwaW4gPCBTM0MyNDEwX0dQRzApCisJCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEY0KSArIElSUV9FSU5UNDsKKworCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEcwKSArIElSUV9FSU5UODsKK30KKworRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9fZ2V0aXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYwppbmRleCA2ODNiMzQ5Li4zYzBlZDc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCkBAIC0xODAsNyArMTgwLDcgQEAKIAlfX3Jhd193cml0ZWwobWFzaywgUzNDMjQxMF9JTlRNU0spOwogfQogCi1zdHJ1Y3QgaXJxY2hpcCBzM2NfaXJxX2xldmVsX2NoaXAgPSB7CitzdHJ1Y3QgaXJxX2NoaXAgczNjX2lycV9sZXZlbF9jaGlwID0gewogCS5uYW1lCQk9ICJzM2MtbGV2ZWwiLAogCS5hY2sJCT0gczNjX2lycV9tYXNrYWNrLAogCS5tYXNrCQk9IHMzY19pcnFfbWFzaywKQEAgLTE4OCw3ICsxODgsNyBAQAogCS5zZXRfd2FrZQk9IHMzY19pcnFfd2FrZQogfTsKIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzY19pcnFfY2hpcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgczNjX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJzM2MiLAogCS5hY2sJCT0gczNjX2lycV9hY2ssCiAJLm1hc2sJCT0gczNjX2lycV9tYXNrLApAQCAtMjA2LDE4ICsyMDYsNiBAQAogCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNFhYX0VJTlRNQVNLKTsKIAltYXNrIHw9ICggMVVMIDw8IGlycW5vKTsKIAlfX3Jhd193cml0ZWwobWFzaywgUzNDMjRYWF9FSU5UTUFTSyk7Ci0KLQlpZiAoaXJxbm8gPD0gKElSUV9FSU5UNyAtIEVYVElOVF9PRkYpKSB7Ci0JCS8qIGNoZWNrIHRvIHNlZSBpZiBhbGwgbmVlZCBtYXNraW5nICovCi0KLQkJaWYgKChtYXNrICYgKDB4ZiA8PCA0KSkgPT0gKDB4ZiA8PCA0KSkgewotCQkJLyogYWxsIG1hc2tlZCwgbWFzayB0aGUgcGFyZW50ICovCi0JCQlzM2NfaXJxX21hc2soSVJRX0VJTlQ0dDcpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogdG9kbzogdGhlIHNhbWUgY2hlY2sgYXMgYWJvdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBpcnEgcmVncy4uLiovCi0KLQl9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMjksNyArMjE3LDYgQEAKIAogCWJpdCA9IDFVTCA8PCAoaXJxbm8gLSBFWFRJTlRfT0ZGKTsKIAotCiAJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRUlOVE1BU0spOwogCiAJX19yYXdfd3JpdGVsKGJpdCwgUzNDMjRYWF9FSU5UUEVORCk7CkBAIC0yNTgsOCArMjQ1LDYgQEAKIAltYXNrID0gX19yYXdfcmVhZGwoUzNDMjRYWF9FSU5UTUFTSyk7CiAJbWFzayAmPSB+KCAxVUwgPDwgaXJxbm8pOwogCV9fcmF3X3dyaXRlbChtYXNrLCBTM0MyNFhYX0VJTlRNQVNLKTsKLQotCXMzY19pcnFfdW5tYXNrKChpcnFubyA8PSAoSVJRX0VJTlQ3IC0gRVhUSU5UX09GRikpID8gSVJRX0VJTlQ0dDcgOiBJUlFfRUlOVDh0MjMpOwogfQogCiBpbnQKQEAgLTM0NCw3ICszMjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgczNjX2lycWV4dF9jaGlwID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzM2NfaXJxZXh0X2NoaXAgPSB7CiAJLm5hbWUJCT0gInMzYy1leHQiLAogCS5tYXNrCQk9IHMzY19pcnFleHRfbWFzaywKIAkudW5tYXNrCQk9IHMzY19pcnFleHRfdW5tYXNrLApAQCAtMzUzLDcgKzMzOCw3IEBACiAJLnNldF93YWtlCT0gczNjX2lycWV4dF93YWtlCiB9OwogCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgczNjX2lycV9laW50MHQ0ID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzM2NfaXJxX2VpbnQwdDQgPSB7CiAJLm5hbWUJCT0gInMzYy1leHQwIiwKIAkuYWNrCQk9IHMzY19pcnFfYWNrLAogCS5tYXNrCQk9IHMzY19pcnFfbWFzaywKQEAgLTM5MCw3ICszNzUsNyBAQAogCXMzY19pcnFzdWJfbWFza2FjayhpcnFubywgSU5UTVNLX1VBUlQwLCA3KTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzY19pcnFfdWFydDAgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHMzY19pcnFfdWFydDAgPSB7CiAJLm5hbWUJCT0gInMzYy11YXJ0MCIsCiAJLm1hc2sJCT0gczNjX2lycV91YXJ0MF9tYXNrLAogCS51bm1hc2sJCT0gczNjX2lycV91YXJ0MF91bm1hc2ssCkBAIC00MTcsNyArNDAyLDcgQEAKIAlzM2NfaXJxc3ViX21hc2thY2soaXJxbm8sIElOVE1TS19VQVJUMSwgNyA8PCAzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzY19pcnFfdWFydDEgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHMzY19pcnFfdWFydDEgPSB7CiAJLm5hbWUJCT0gInMzYy11YXJ0MSIsCiAJLm1hc2sJCT0gczNjX2lycV91YXJ0MV9tYXNrLAogCS51bm1hc2sJCT0gczNjX2lycV91YXJ0MV91bm1hc2ssCkBAIC00NDQsNyArNDI5LDcgQEAKIAlzM2NfaXJxc3ViX21hc2thY2soaXJxbm8sIElOVE1TS19VQVJUMiwgNyA8PCA2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzY19pcnFfdWFydDIgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHMzY19pcnFfdWFydDIgPSB7CiAJLm5hbWUJCT0gInMzYy11YXJ0MiIsCiAJLm1hc2sJCT0gczNjX2lycV91YXJ0Ml9tYXNrLAogCS51bm1hc2sJCT0gczNjX2lycV91YXJ0Ml91bm1hc2ssCkBAIC00NzEsNyArNDU2LDcgQEAKIAlzM2NfaXJxc3ViX2FjayhpcnFubywgSU5UTVNLX0FEQ1BBUkVOVCwgMyA8PCA5KTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFjaGlwIHMzY19pcnFfYWRjID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzM2NfaXJxX2FkYyA9IHsKIAkubmFtZQkJPSAiczNjLWFkYyIsCiAJLm1hc2sJCT0gczNjX2lycV9hZGNfbWFzaywKIAkudW5tYXNrCQk9IHMzY19pcnFfYWRjX3VubWFzaywKQEAgLTQ4MCwxMSArNDY1LDExIEBACiAKIC8qIGlycSBkZW11eCBmb3IgYWRjICovCiBzdGF0aWMgdm9pZCBzM2NfaXJxX2RlbXV4X2FkYyh1bnNpZ25lZCBpbnQgaXJxLAotCQkJICAgICAgc3RydWN0IGlycWRlc2MgKmRlc2MpCisJCQkgICAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IHN1YnNyYywgc3VibXNrOwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSA5OwotCXN0cnVjdCBpcnFkZXNjICpteWRlc2M7CisJc3RydWN0IGlycV9kZXNjICpteWRlc2M7CiAKIAkvKiByZWFkIHRoZSBjdXJyZW50IHBlbmRpbmcgaW50ZXJydXB0cywgYW5kIHRoZSBtYXNrCiAJICogZm9yIHdoYXQgaXQgaXMgYXZhaWxhYmxlICovCkBAIC01MTIsNyArNDk3LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgc3Vic3JjLCBzdWJtc2s7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IHN0YXJ0IC0gSVJRX1MzQ1VBUlRfUlgwOwotCXN0cnVjdCBpcnFkZXNjICpkZXNjOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAogCS8qIHJlYWQgdGhlIGN1cnJlbnQgcGVuZGluZyBpbnRlcnJ1cHRzLCBhbmQgdGhlIG1hc2sKIAkgKiBmb3Igd2hhdCBpdCBpcyBhdmFpbGFibGUgKi8KQEAgLTU0OSw3ICs1MzQsNyBAQAogCiBzdGF0aWMgdm9pZAogczNjX2lycV9kZW11eF91YXJ0MCh1bnNpZ25lZCBpbnQgaXJxLAotCQkgICAgc3RydWN0IGlycWRlc2MgKmRlc2MpCisJCSAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaXJxID0gaXJxOwogCXMzY19pcnFfZGVtdXhfdWFydChJUlFfUzNDVUFSVF9SWDApOwpAQCAtNTU3LDcgKzU0Miw3IEBACiAKIHN0YXRpYyB2b2lkCiBzM2NfaXJxX2RlbXV4X3VhcnQxKHVuc2lnbmVkIGludCBpcnEsCi0JCSAgICBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKKwkJICAgIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAlpcnEgPSBpcnE7CiAJczNjX2lycV9kZW11eF91YXJ0KElSUV9TM0NVQVJUX1JYMSk7CkBAIC01NjUsNyArNTUwLDcgQEAKIAogc3RhdGljIHZvaWQKIHMzY19pcnFfZGVtdXhfdWFydDIodW5zaWduZWQgaW50IGlycSwKLQkJICAgIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorCQkgICAgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWlycSA9IGlycTsKIAlzM2NfaXJxX2RlbXV4X3VhcnQoSVJRX1MzQ1VBUlRfUlgyKTsKQEAgLTU3Myw3ICs1NTgsNyBAQAogCiBzdGF0aWMgdm9pZAogczNjX2lycV9kZW11eF9leHRpbnQ4KHVuc2lnbmVkIGludCBpcnEsCi0JCSAgICAgIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorCQkgICAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgbG9uZyBlaW50cG5kID0gX19yYXdfcmVhZGwoUzNDMjRYWF9FSU5UUEVORCk7CiAJdW5zaWduZWQgbG9uZyBlaW50bXNrID0gX19yYXdfcmVhZGwoUzNDMjRYWF9FSU5UTUFTSyk7CkBAIC01OTUsNyArNTgwLDcgQEAKIAogc3RhdGljIHZvaWQKIHMzY19pcnFfZGVtdXhfZXh0aW50NHQ3KHVuc2lnbmVkIGludCBpcnEsCi0JCQlzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKKwkJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBsb25nIGVpbnRwbmQgPSBfX3Jhd19yZWFkbChTM0MyNFhYX0VJTlRQRU5EKTsKIAl1bnNpZ25lZCBsb25nIGVpbnRtc2sgPSBfX3Jhd19yZWFkbChTM0MyNFhYX0VJTlRNQVNLKTsKQEAgLTczOCw3ICs3MjMsNyBAQAogCQljYXNlIElSUV9VQVJUMjoKIAkJY2FzZSBJUlFfQURDUEFSRU5UOgogCQkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV9sZXZlbF9jaGlwKTsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpcnFubywgaGFuZGxlX2xldmVsX2lycSk7CiAJCQlicmVhazsKIAogCQljYXNlIElSUV9SRVNFUlZFRDY6CkBAIC03NDksNyArNzM0LDcgQEAKIAkJZGVmYXVsdDoKIAkJCS8vaXJxZGJmKCJyZWdpc3RlcmluZyBpcnEgJWQgKHMzYyBpcnEpXG4iLCBpcnFubyk7CiAJCQlzZXRfaXJxX2NoaXAoaXJxbm8sICZzM2NfaXJxX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19lZGdlX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGhhbmRsZV9lZGdlX2lycSk7CiAJCQlzZXRfaXJxX2ZsYWdzKGlycW5vLCBJUlFGX1ZBTElEKTsKIAkJfQogCX0KQEAgLTc2OSwxNCArNzU0LDE0IEBACiAJZm9yIChpcnFubyA9IElSUV9FSU5UMDsgaXJxbm8gPD0gSVJRX0VJTlQzOyBpcnFubysrKSB7CiAJCWlycWRiZigicmVnaXN0ZXJpbmcgaXJxICVkIChleHQgaW50KVxuIiwgaXJxbm8pOwogCQlzZXRfaXJxX2NoaXAoaXJxbm8sICZzM2NfaXJxX2VpbnQwdDQpOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycW5vLCBJUlFGX1ZBTElEKTsKIAl9CiAKIAlmb3IgKGlycW5vID0gSVJRX0VJTlQ0OyBpcnFubyA8PSBJUlFfRUlOVDIzOyBpcnFubysrKSB7CiAJCWlycWRiZigicmVnaXN0ZXJpbmcgaXJxICVkIChleHRlbmRlZCBzM2MgaXJxKVxuIiwgaXJxbm8pOwogCQlzZXRfaXJxX2NoaXAoaXJxbm8sICZzM2NfaXJxZXh0X2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycW5vLCBJUlFGX1ZBTElEKTsKIAl9CiAKQEAgLTc4NywyOCArNzcyLDI4IEBACiAJZm9yIChpcnFubyA9IElSUV9TM0NVQVJUX1JYMDsgaXJxbm8gPD0gSVJRX1MzQ1VBUlRfRVJSMDsgaXJxbm8rKykgewogCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIHVhcnQwIGlycSlcbiIsIGlycW5vKTsKIAkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV91YXJ0MCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CiAJfQogCiAJZm9yIChpcnFubyA9IElSUV9TM0NVQVJUX1JYMTsgaXJxbm8gPD0gSVJRX1MzQ1VBUlRfRVJSMTsgaXJxbm8rKykgewogCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIHVhcnQxIGlycSlcbiIsIGlycW5vKTsKIAkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV91YXJ0MSk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CiAJfQogCiAJZm9yIChpcnFubyA9IElSUV9TM0NVQVJUX1JYMjsgaXJxbm8gPD0gSVJRX1MzQ1VBUlRfRVJSMjsgaXJxbm8rKykgewogCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIHVhcnQyIGlycSlcbiIsIGlycW5vKTsKIAkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV91YXJ0Mik7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CiAJfQogCiAJZm9yIChpcnFubyA9IElSUV9UQzsgaXJxbm8gPD0gSVJRX0FEQzsgaXJxbm8rKykgewogCQlpcnFkYmYoInJlZ2lzdGVyaW5nIGlycSAlZCAoczNjIGFkYyBpcnEpXG4iLCBpcnFubyk7CiAJCXNldF9pcnFfY2hpcChpcnFubywgJnMzY19pcnFfYWRjKTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnFubywgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmgKaW5kZXggODQyYTlmNC4uMzY4NmEwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuaApAQCAtMTcsNyArMTcsNyBAQAogCiAjZGVmaW5lIEVYVElOVF9PRkYgKElSUV9FSU5UNCAtIDQpCiAKLWV4dGVybiBzdHJ1Y3QgaXJxY2hpcCBzM2NfaXJxX2xldmVsX2NoaXA7CitleHRlcm4gc3RydWN0IGlycV9jaGlwIHMzY19pcnFfbGV2ZWxfY2hpcDsKIAogc3RhdGljIGlubGluZSB2b2lkCiBzM2NfaXJxc3ViX21hc2sodW5zaWduZWQgaW50IGlycW5vLCB1bnNpZ25lZCBpbnQgcGFyZW50Yml0LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKaW5kZXggOGM4OTVjMC4uZjViOTgwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWxjZC5oPgogCisjaW5jbHVkZSA8YXNtL2FyY2gvaDE5NDAuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9oMTk0MC1sYXRjaC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2ZiLmg+CiAKQEAgLTQxLDYgKzQyLDcgQEAKICNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgImRldnMuaCIKICNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJwbS5oIgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGgxOTQwX2lvZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJWzBdID0gewpAQCAtMTY0LDEyICsxNjYsMTYgQEAKIAlzM2MyNHh4X2luaXRfY2xvY2tzKDApOwogCXMzYzI0eHhfaW5pdF91YXJ0cyhoMTk0MF91YXJ0Y2ZncywgQVJSQVlfU0laRShoMTk0MF91YXJ0Y2ZncykpOwogCXMzYzI0eHhfc2V0X2JvYXJkKCZoMTk0MF9ib2FyZCk7CisKKwkvKiBzZXR1cCBQTSAqLworCisJbWVtY3B5KHBoeXNfdG9fdmlydChIMTk0MF9TVVNQRU5EX1JFU1VNRUFUKSwgaDE5NDBfcG1fcmV0dXJuLCAxMDI0KTsKKwlzM2MyNDEwX3BtX2luaXQoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGgxOTQwX2luaXRfaXJxKHZvaWQpCiB7CiAJczNjMjR4eF9pbml0X2lycSgpOwotCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBoMTk0MF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vc2lyaXMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW9zaXJpcy5jCmluZGV4IGUxOTNiYTYuLmE0YWIxNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW9zaXJpcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW9zaXJpcy5jCkBAIC0xMTQsNiArMTE0LDE1IEBACiAJCS5jbG9ja3MJICAgICA9IG9zaXJpc19zZXJpYWxfY2xvY2tzLAogCQkuY2xvY2tzX3NpemUgPSBBUlJBWV9TSVpFKG9zaXJpc19zZXJpYWxfY2xvY2tzKSwKIAl9LAorCVsyXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMiwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gVUNPTiwKKwkJLnVsY29uCSAgICAgPSBVTENPTiwKKwkJLnVmY29uCSAgICAgPSBVRkNPTiwKKwkJLmNsb2NrcwkgICAgID0gb3NpcmlzX3NlcmlhbF9jbG9ja3MsCisJCS5jbG9ja3Nfc2l6ZSA9IEFSUkFZX1NJWkUob3NpcmlzX3NlcmlhbF9jbG9ja3MpLAorCX0KIH07CiAKIC8qIE5BTkQgRmxhc2ggb24gT3NpcmlzIGJvYXJkICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1yeDM3MTUuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXJ4MzcxNS5jCmluZGV4IDIzZDdjMDUuLmVjYmNkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXJ4MzcxNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXJ4MzcxNS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1sY2QuaD4KIAorI2luY2x1ZGUgPGFzbS9hcmNoL2gxOTQwLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbmFuZC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2ZiLmg+CiAKQEAgLTIyNCw3ICsyMjUsOSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgcngzNzE1X2luaXRfbWFjaGluZSh2b2lkKQogeworCW1lbWNweShwaHlzX3RvX3ZpcnQoSDE5NDBfU1VTUEVORF9SRVNVTUVBVCksIGgxOTQwX3BtX3JldHVybiwgMTAyNCk7CiAJczNjMjQxMF9wbV9pbml0KCk7CisKIAlzM2MyNHh4X2ZiX3NldF9wbGF0ZGF0YSgmcngzNzE1X2xjZGNmZyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXZyMTAwMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKaW5kZXggYTBkNzY5Mi4uZTJlZGEzOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3Mtc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbGVkcy1ncGlvLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgogI2luY2x1ZGUgImRldnMuaCIKQEAgLTMxMyw2ICszMTQsNTAgQEAKIAl9CiB9OwogCisvKiBMRURTICovCisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9sZWRfcGxhdGRhdGEgdnIxMDAwX2xlZDFfcGRhdGEgPSB7CisJLm5hbWUJCT0gImxlZDEiLAorCS5ncGlvCQk9IFMzQzI0MTBfR1BCMCwKKwkuZGVmX3RyaWdnZXIJPSAiIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9sZWRfcGxhdGRhdGEgdnIxMDAwX2xlZDJfcGRhdGEgPSB7CisJLm5hbWUJCT0gImxlZDIiLAorCS5ncGlvCQk9IFMzQzI0MTBfR1BCMSwKKwkuZGVmX3RyaWdnZXIJPSAiIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9sZWRfcGxhdGRhdGEgdnIxMDAwX2xlZDNfcGRhdGEgPSB7CisJLm5hbWUJCT0gImxlZDMiLAorCS5ncGlvCQk9IFMzQzI0MTBfR1BCMiwKKwkuZGVmX3RyaWdnZXIJPSAiIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZyMTAwMF9sZWQxID0geworCS5uYW1lCQk9ICJzM2MyNHh4X2xlZCIsCisJLmlkCQk9IDEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnZyMTAwMF9sZWQxX3BkYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2cjEwMDBfbGVkMiA9IHsKKwkubmFtZQkJPSAiczNjMjR4eF9sZWQiLAorCS5pZAkJPSAyLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ2cjEwMDBfbGVkMl9wZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdnIxMDAwX2xlZDMgPSB7CisJLm5hbWUJCT0gInMzYzI0eHhfbGVkIiwKKwkuaWQJCT0gMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdnIxMDAwX2xlZDNfcGRhdGEsCisJfSwKK307CisKIC8qIGRldmljZXMgZm9yIHRoaXMgYm9hcmQgKi8KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnZyMTAwMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKQEAgLTMyNSw3ICszNzAsMTAgQEAKIAkmc2VyaWFsX2RldmljZSwKIAkmdnIxMDAwX25vciwKIAkmdnIxMDAwX2RtOWswLAotCSZ2cjEwMDBfZG05azEKKwkmdnIxMDAwX2RtOWsxLAorCSZ2cjEwMDBfbGVkMSwKKwkmdnIxMDAwX2xlZDIsCisJJnZyMTAwMF9sZWQzLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKnZyMTAwMF9jbG9ja3NbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1oMTk0MC5TIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLWgxOTQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2NmRlNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1oMTk0MC5TCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1oMTk0MC5TCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KKyAqCisgKiBIMTk0MCBTdXNwZW5kIHRvIFJBTQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tYXAuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorCisJLnRleHQKKwkuZ2xvYmFsCWgxOTQwX3BtX3JldHVybgorCitoMTk0MF9wbV9yZXR1cm46CisJbW92CXIwLCAjUzNDMjQxMF9QQV9HUElPCisJbGRyCXBjLCBbIHIwLCAjUzNDMjQxMF9HU1RBVFVTMyAtIFMzQzI0WFhfVkFfR1BJTyBdCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC1ncGlvLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC1ncGlvLmMKaW5kZXggYTIwOThmNi4uZWMzYTI3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAtZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLWdwaW8uYwpAQCAtNjksMjIgKzY5LDMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9faXJxZmlsdGVyKTsKLQotaW50IHMzYzI0MTBfZ3Bpb19nZXRpcnEodW5zaWduZWQgaW50IHBpbikKLXsKLQlpZiAocGluIDwgUzNDMjQxMF9HUEYwIHx8IHBpbiA+IFMzQzI0MTBfR1BHMTUpCi0JCXJldHVybiAtMTsJLyogbm90IHZhbGlkIGludGVycnVwdHMgKi8KLQotCWlmIChwaW4gPCBTM0MyNDEwX0dQRzAgJiYgcGluID4gUzNDMjQxMF9HUEY3KQotCQlyZXR1cm4gLTE7CS8qIG5vdCB2YWxpZCBwaW4gKi8KLQotCWlmIChwaW4gPCBTM0MyNDEwX0dQRjQpCi0JCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEYwKSArIElSUV9FSU5UMDsKLQotCWlmIChwaW4gPCBTM0MyNDEwX0dQRzApCi0JCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEY0KSArIElSUV9FSU5UNDsKLQotCXJldHVybiAocGluIC0gUzNDMjQxMF9HUEcwKSArIElSUV9FSU5UODsKLX0KLQotRVhQT1JUX1NZTUJPTChzM2MyNDEwX2dwaW9fZ2V0aXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLXBtLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC1wbS5jCmluZGV4IGU1MWQ3NjYuLjc3YzY4MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLXBtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAtcG0uYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oMTk0MC5oPgogCiAjaW5jbHVkZSAiY3B1LmgiCiAjaW5jbHVkZSAicG0uaCIKQEAgLTUyLDYgKzUzLDM1IEBACiAJREJHKCJHU1RBVFVTMyAweCUwOHhcbiIsIF9fcmF3X3JlYWRsKFMzQzI0MTBfR1NUQVRVUzMpKTsKIAlEQkcoIkdTVEFUVVM0IDB4JTA4eFxuIiwgX19yYXdfcmVhZGwoUzNDMjQxMF9HU1RBVFVTNCkpOwogCisJaWYgKG1hY2hpbmVfaXNfaDE5NDAoKSkgeworCQl2b2lkICpiYXNlID0gcGh5c190b192aXJ0KEgxOTQwX1NVU1BFTkRfQ0hFQ0spOworCQl1bnNpZ25lZCBsb25nIHB0cjsKKwkJdW5zaWduZWQgbG9uZyBjYWxjID0gMDsKKworCQkvKiBnZW5lcmF0ZSBjaGVjayBmb3IgdGhlIGJvb3Rsb2FkZXIgdG8gY2hlY2sgb24gcmVzdW1lICovCisKKwkJZm9yIChwdHIgPSAwOyBwdHIgPCAweDQwMDAwOyBwdHIgKz0gMHg0MDApCisJCQljYWxjICs9IF9fcmF3X3JlYWRsKGJhc2UrcHRyKTsKKworCQlfX3Jhd193cml0ZWwoY2FsYywgcGh5c190b192aXJ0KEgxOTQwX1NVU1BFTkRfQ0hFQ0tTVU0pKTsKKwl9CisKKwkvKiB0aGUgUlgzNzE1IHVzZXMgc2ltaWxhciBjb2RlIGFuZCB0aGUgc2FtZSBIMTk0MCBhbmQgdGhlCisJICogc2FtZSBvZmZzZXRzIGZvciByZXN1bWUgYW5kIGNoZWNrc3VtIHBvaW50ZXJzICovCisKKwlpZiAobWFjaGluZV9pc19yeDM3MTUoKSkgeworCQl2b2lkICpiYXNlID0gcGh5c190b192aXJ0KEgxOTQwX1NVU1BFTkRfQ0hFQ0spOworCQl1bnNpZ25lZCBsb25nIHB0cjsKKwkJdW5zaWduZWQgbG9uZyBjYWxjID0gMDsKKworCQkvKiBnZW5lcmF0ZSBjaGVjayBmb3IgdGhlIGJvb3Rsb2FkZXIgdG8gY2hlY2sgb24gcmVzdW1lICovCisKKwkJZm9yIChwdHIgPSAwOyBwdHIgPCAweDQwMDAwOyBwdHIgKz0gMHg0KQorCQkJY2FsYyArPSBfX3Jhd19yZWFkbChiYXNlK3B0cik7CisKKwkJX19yYXdfd3JpdGVsKGNhbGMsIHBoeXNfdG9fdmlydChIMTk0MF9TVVNQRU5EX0NIRUNLU1VNKSk7CisJfQorCiAJaWYgKCBtYWNoaW5lX2lzX2FtbF9tNTkwMCgpICkKIAkJczNjMjQxMF9ncGlvX3NldHBpbihTM0MyNDEwX0dQRjIsIDEpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMi1pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLWlycS5jCmluZGV4IDdmNzQxNTQuLmZmY2MzMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLWlycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLWlycS5jCkBAIC05OCw3ICs5OCw3IEBACiAJX19yYXdfd3JpdGVsKG1hc2sgJiB+Yml0dmFsLCBTM0MyNDEwX0lOVE1TSyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBzM2MyNDEyX2lycV9laW50MHQ0ID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzM2MyNDEyX2lycV9laW50MHQ0ID0gewogCS5hY2sJICAgPSBzM2MyNDEyX2lycV9hY2ssCiAJLm1hc2sJICAgPSBzM2MyNDEyX2lycV9tYXNrLAogCS51bm1hc2sJICAgPSBzM2MyNDEyX2lycV91bm1hc2ssCkBAIC0xMTIsNyArMTEyLDcgQEAKIAogCWZvciAoaXJxbm8gPSBJUlFfRUlOVDA7IGlycW5vIDw9IElSUV9FSU5UMzsgaXJxbm8rKykgewogCQlzZXRfaXJxX2NoaXAoaXJxbm8sICZzM2MyNDEyX2lycV9laW50MHQ0KTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnFubywgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC1pcnEuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWlycS5jCmluZGV4IDM5ZGIwNzUuLjFiYTE5YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWlycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWlycS5jCkBAIC00MiwxMCArNDIsMTAgQEAKIC8qIFdEVC9BQzk3ICovCiAKIHN0YXRpYyB2b2lkIHMzY19pcnFfZGVtdXhfd2R0YWM5Nyh1bnNpZ25lZCBpbnQgaXJxLAotCQkJCSAgc3RydWN0IGlycWRlc2MgKmRlc2MpCisJCQkJICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IHN1YnNyYywgc3VibXNrOwotCXN0cnVjdCBpcnFkZXNjICpteWRlc2M7CisJc3RydWN0IGlycV9kZXNjICpteWRlc2M7CiAKIAkvKiByZWFkIHRoZSBjdXJyZW50IHBlbmRpbmcgaW50ZXJydXB0cywgYW5kIHRoZSBtYXNrCiAJICogZm9yIHdoYXQgaXQgaXMgYXZhaWxhYmxlICovCkBAIC05MCw3ICs5MCw3IEBACiAJczNjX2lycXN1Yl9tYXNrYWNrKGlycW5vLCBJTlRNU0tfV0RULCAzPDwxMyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBzM2NfaXJxX3dkdGFjOTcgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHMzY19pcnFfd2R0YWM5NyA9IHsKIAkubWFzawkgICAgPSBzM2NfaXJxX3dkdGFjOTdfbWFzaywKIAkudW5tYXNrCSAgICA9IHMzY19pcnFfd2R0YWM5N191bm1hc2ssCiAJLmFjawkgICAgPSBzM2NfaXJxX3dkdGFjOTdfYWNrLApAQCAtMTA1LDEyICsxMDUsMTIgQEAKIAkvKiBhZGQgbmV3IGNoYWluZWQgaGFuZGxlciBmb3Igd2R0LCBhYzcgKi8KIAogCXNldF9pcnFfY2hpcChJUlFfV0RULCAmczNjX2lycV9sZXZlbF9jaGlwKTsKLQlzZXRfaXJxX2hhbmRsZXIoSVJRX1dEVCwgZG9fbGV2ZWxfSVJRKTsKKwlzZXRfaXJxX2hhbmRsZXIoSVJRX1dEVCwgaGFuZGxlX2xldmVsX2lycSk7CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX1dEVCwgczNjX2lycV9kZW11eF93ZHRhYzk3KTsKIAogCWZvciAoaXJxbm8gPSBJUlFfUzNDMjQ0MF9XRFQ7IGlycW5vIDw9IElSUV9TM0MyNDQwX0FDOTc7IGlycW5vKyspIHsKIAkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV93ZHRhYzk3KTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBkb19sZXZlbF9JUlEpOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxbm8sIGhhbmRsZV9sZXZlbF9pcnEpOwogCQlzZXRfaXJxX2ZsYWdzKGlycW5vLCBJUlFGX1ZBTElEKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDR4LWlycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NHgtaXJxLmMKaW5kZXggMTQ2ZjIxMC4uZWRlOTQ2MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NHgtaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NHgtaXJxLmMKQEAgLTQyLDEwICs0MiwxMCBAQAogLyogY2FtZXJhIGlycSAqLwogCiBzdGF0aWMgdm9pZCBzM2NfaXJxX2RlbXV4X2NhbSh1bnNpZ25lZCBpbnQgaXJxLAotCQkJICAgICAgc3RydWN0IGlycWRlc2MgKmRlc2MpCisJCQkgICAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IHN1YnNyYywgc3VibXNrOwotCXN0cnVjdCBpcnFkZXNjICpteWRlc2M7CisJc3RydWN0IGlycV9kZXNjICpteWRlc2M7CiAKIAkvKiByZWFkIHRoZSBjdXJyZW50IHBlbmRpbmcgaW50ZXJydXB0cywgYW5kIHRoZSBtYXNrCiAJICogZm9yIHdoYXQgaXQgaXMgYXZhaWxhYmxlICovCkBAIC04OSw3ICs4OSw3IEBACiAJczNjX2lycXN1Yl9tYXNrYWNrKGlycW5vLCBJTlRNU0tfQ0FNLCAzPDwxMSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBzM2NfaXJxX2NhbSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgczNjX2lycV9jYW0gPSB7CiAJLm1hc2sJICAgID0gczNjX2lycV9jYW1fbWFzaywKIAkudW5tYXNrCSAgICA9IHMzY19pcnFfY2FtX3VubWFzaywKIAkuYWNrCSAgICA9IHMzY19pcnFfY2FtX2FjaywKQEAgLTEwMCwxOCArMTAwLDE4IEBACiAJdW5zaWduZWQgaW50IGlycW5vOwogCiAJc2V0X2lycV9jaGlwKElSUV9ORkNPTiwgJnMzY19pcnFfbGV2ZWxfY2hpcCk7Ci0Jc2V0X2lycV9oYW5kbGVyKElSUV9ORkNPTiwgZG9fbGV2ZWxfSVJRKTsKKwlzZXRfaXJxX2hhbmRsZXIoSVJRX05GQ09OLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAlzZXRfaXJxX2ZsYWdzKElSUV9ORkNPTiwgSVJRRl9WQUxJRCk7CiAKIAkvKiBhZGQgY2hhaW5lZCBoYW5kbGVyIGZvciBjYW1lcmEgKi8KIAogCXNldF9pcnFfY2hpcChJUlFfQ0FNLCAmczNjX2lycV9sZXZlbF9jaGlwKTsKLQlzZXRfaXJxX2hhbmRsZXIoSVJRX0NBTSwgZG9fbGV2ZWxfSVJRKTsKKwlzZXRfaXJxX2hhbmRsZXIoSVJRX0NBTSwgaGFuZGxlX2xldmVsX2lycSk7CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0NBTSwgczNjX2lycV9kZW11eF9jYW0pOwogCiAJZm9yIChpcnFubyA9IElSUV9TM0MyNDQwX0NBTV9DOyBpcnFubyA8PSBJUlFfUzNDMjQ0MF9DQU1fUDsgaXJxbm8rKykgewogCQlzZXRfaXJxX2NoaXAoaXJxbm8sICZzM2NfaXJxX2NhbSk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycW5vLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnFubywgSVJRRl9WQUxJRCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMKaW5kZXggNjM5NTk3Ny4uNzhmNGMxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTExMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMTAuYwpAQCAtODIsNiArODIsMTQgQEAKIAkJLnR3cgkJPSA5LAogCQkucmVmcmVzaAk9IDY0MDAwLAogCQkuY2FzX2xhdGVuY3kJPSAzLAorCX0sIHsgICAgLyogU2Ftc3VuZyBLNFMyODE2MzJCLTFIICovCisJICAgICAgICAubmFtZSAgICAgICAgICAgPSAiSzRTMjgxNjMyQi0xSCIsCisJCS5yb3dzICAgICAgICAgICA9IDEyLAorCQkudGNrICAgICAgICAgICAgPSAxMCwKKwkJLnRycCAgICAgICAgICAgID0gMjAsCisJCS50d3IgICAgICAgICAgICA9IDEwLAorCQkucmVmcmVzaCAgICAgICAgPSA2NDAwMCwKKwkJLmNhc19sYXRlbmN5ICAgID0gMywKIAl9LCB7CS8qIFNhbXN1bmcgS000MTZTNDAzMENUICovCiAJCS5uYW1lCQk9ICJLTTQxNlM0MDMwQ1QiLAogCQkucm93cwkJPSAxMywKQEAgLTM2Niw2ICszNzQsOCBAQAogCiAJCWlmIChtYWNoaW5lX2lzX2gzMTAwKCkpCiAJCQluYW1lID0gIktNNDE2UzQwMzBDVCI7CisJCWlmIChtYWNoaW5lX2lzX2pvcm5hZGE3MjAoKSkKKwkJICAgICAgICBuYW1lID0gIks0UzI4MTYzMkItMUgiOwogCX0KIAogCXNkcmFtID0gc2ExMTEwX2ZpbmRfc2RyYW0obmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMKaW5kZXggNDU3NWYzMS4uZTUxMDI5NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8YXNtL2NudDMyX3RvXzYzLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0xMTgsMTUgKzExOSwyMSBAQAogCiAvKgogICogVGhpcyBpcyB0aGUgU0ExMXgwIHNjaGVkX2Nsb2NrIGltcGxlbWVudGF0aW9uLiAgVGhpcyBoYXMKLSAqIGEgcmVzb2x1dGlvbiBvZiAyNzFucywgYW5kIGEgbWF4aW11bSB2YWx1ZSBvZiAxMTY1cy4KKyAqIGEgcmVzb2x1dGlvbiBvZiAyNzFucywgYW5kIGEgbWF4aW11bSB2YWx1ZSBvZiAzMjAyNTU5N3MgKDM3MCBkYXlzKS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbW9ub3RvbmljIGluIHRoYXQgcmFuZ2UgYXMKKyAqIGxvbmcgYXMgdGhlcmUgaXMgYWx3YXlzIGxlc3MgdGhhbiA1ODIgc2Vjb25kcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKKyAqIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgKgogICogICggKiAxRTkgLyAzNjg2NDAwID0+ICogNzgxMjUgLyAyODgpCiAgKi8KIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbG9uZyB2OworCXVuc2lnbmVkIGxvbmcgbG9uZyB2ID0gY250MzJfdG9fNjMoT1NDUik7CiAKLQl2ID0gKHVuc2lnbmVkIGxvbmcgbG9uZylPU0NSICogNzgxMjU7Ci0JZG9fZGl2KHYsIDI4OCk7CisJLyogdGhlIDw8MSBnZXRzIHJpZCBvZiB0aGUgY250XzMyX3RvXzYzIHRvcCBiaXQgc2F2aW5nIG9uIGEgYmljIGluc24gKi8KKwl2ICo9IDc4MTI1PDwxOworCWRvX2Rpdih2LCAyODg8PDEpOwogCiAJcmV0dXJuIHY7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDM2MDAuYwppbmRleCBmYTZkYzcxLi5iMDM0YWQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9oMzYwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKQEAgLTcwMiw3ICs3MDIsNyBAQAogCUdQSU8yX1NEX0NPTl9TTFQsCiB9OwogCi1zdGF0aWMgdm9pZCBoMzgwMF9JUlFfZGVtdXgodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBoMzgwMF9JUlFfZGVtdXgodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCWludCBpOwogCkBAIC03MTksMTQgKzcxOSwxNCBAQAogCQlpZiAoMCkgcHJpbnRrKCIlcyBLUElPIDB4JTA4WFxuIiwgX19GVU5DVElPTl9fLCBpcnEpOwogCQlmb3IgKGogPSAwOyBqIDwgSDM4MDBfS1BJT19JUlFfQ09VTlQ7IGorKykKIAkJCWlmIChpcnEgJiBrcGlvX2lycV9tYXNrW2pdKQotCQkJCWRvX2VkZ2VfSVJRKEgzODAwX0tQSU9fSVJRX0NPVU5UICsgaiwgaXJxX2Rlc2MgKyBIMzgwMF9LUElPX0lSUV9DT1VOVCArIGopOworCQkJCWhhbmRsZV9lZGdlX2lycShIMzgwMF9LUElPX0lSUV9DT1VOVCArIGosIGlycV9kZXNjICsgSDM4MDBfS1BJT19JUlFfQ09VTlQgKyBqKTsKIAogCQkvKiBHUElPMiAqLwogCQlpcnEgPSBIMzgwMF9BU0lDMl9HUElJTlRGTEFHOwogCQlpZiAoMCkgcHJpbnRrKCIlcyBHUElPIDB4JTA4WFxuIiwgX19GVU5DVElPTl9fLCBpcnEpOwogCQlmb3IgKGogPSAwOyBqIDwgSDM4MDBfR1BJT19JUlFfQ09VTlQ7IGorKykKIAkJCWlmIChpcnEgJiBncGlvX2lycV9tYXNrW2pdKQotCQkJCWRvX2VkZ2VfSVJRKEgzODAwX0dQSU9fSVJRX0NPVU5UICsgaiwgaXJxX2Rlc2MgKyBIMzgwMF9HUElPX0lSUV9DT1VOVCArIGopOworCQkJCWhhbmRsZV9lZGdlX2lycShIMzgwMF9HUElPX0lSUV9DT1VOVCArIGosIGlycV9kZXNjICsgSDM4MDBfR1BJT19JUlFfQ09VTlQgKyBqKTsKIAl9CiAKIAlpZiAoaSA+PSBNQVhfQVNJQ19JU1JfTE9PUFMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pcnEuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jCmluZGV4IGY0YzYzMjIuLjU2NDJhZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2lycS5jCkBAIC0xMTAsNyArMTEwLDcgQEAKICAqIGFuZCBjYWxsIHRoZSBoYW5kbGVyLgogICovCiBzdGF0aWMgdm9pZAotc2ExMTAwX2hpZ2hfZ3Bpb19oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorc2ExMTAwX2hpZ2hfZ3Bpb19oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgbWFzazsKIApAQCAtMzI3LDE5ICszMjcsMTkgQEAKIAogCWZvciAoaXJxID0gMDsgaXJxIDw9IDEwOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmc2ExMTAwX2xvd19ncGlvX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJfQogCiAJZm9yIChpcnEgPSAxMjsgaXJxIDw9IDMxOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmc2ExMTAwX25vcm1hbF9jaGlwKTsKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKIAl9CiAKIAlmb3IgKGlycSA9IDMyOyBpcnEgPD0gNDg7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZzYTExMDBfaGlnaF9ncGlvX2NoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBkb19lZGdlX0lSUSk7CisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKaW5kZXggMTdmNWE0My4uNTRlY2RhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYwpAQCAtMSw1ICsxLDE1IEBACiAvKgogICogbGludXgvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCisgKgorICogSFAgSm9ybmFkYTcyMCBpbml0IGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRmlsaXAgWnl6bmlld3NraSA8ZmlsaXAuenl6bmlld3NraUB0ZWZuZXQucGw+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IE1pY2hhZWwgR2Vybm90aCA8bWljaGFlbEBnZXJub3RoLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTAsMTMgKzIwLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8dmlkZW8vczFkMTN4eHhmYi5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL3NhMTExMS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CkBAIC0yNCwxMyArMzQsMTcwIEBACiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKKy8qCisgKiBIUCBEb2N1bWVudGF0aW9uIHJlZmVycmVkIGluIHRoaXMgZmlsZToKKyAqIGh0dHA6Ly93d3cuamxpbWUuY29tL2Rvd25sb2Fkcy9kZXZlbG9wbWVudC9kb2NzL2pvcm5hZGE3eHgvam9ybmFkYTcyMC50eHQKKyAqLwogCi0jZGVmaW5lIEpPUlRVQ1JfVkFMCTB4MjAwMDA0MDAKKy8qIGxpbmUgMTEwIG9mIEhQJ3MgZG9jICovCisjZGVmaW5lIFRVQ1JfVkFMCTB4MjAwMDA0MDAKKworLyogbWVtb3J5IHNwYWNlIChsaW5lIDUyIG9mIEhQJ3MgZG9jKSAqLworI2RlZmluZSBTQTExMTFSRUdTVEFSVAkweDQwMDAwMDAwCisjZGVmaW5lIFNBMTExMVJFR0xFTgkweDAwMDAxZmZmCisjZGVmaW5lIEVQU09OUkVHU1RBUlQJMHg0ODAwMDAwMAorI2RlZmluZSBFUFNPTlJFR0xFTgkweDAwMTAwMDAwCisjZGVmaW5lIEVQU09ORkJTVEFSVAkweDQ4MjAwMDAwCisvKiA1MTJrQiBmcmFtZWJ1ZmZlciAqLworI2RlZmluZSBFUFNPTkZCTEVOCTUxMioxMDI0CisKK3N0YXRpYyBzdHJ1Y3QgczFkMTN4eHhmYl9yZWd2YWwgczFkMTN4eHhmYl9pbml0cmVnc1tdID0geworCS8qIGxpbmUgMzQ0IG9mIEhQJ3MgZG9jICovCisJezB4MDAwMSwweDAwfSwJLy8gTWlzY2VsbGFuZW91cyBSZWdpc3RlcgorCXsweDAxRkMsMHgwMH0sCS8vIERpc3BsYXkgTW9kZSBSZWdpc3RlcgorCXsweDAwMDQsMHgwMH0sCS8vIEdlbmVyYWwgSU8gUGlucyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAKKwl7MHgwMDA1LDB4MDB9LAkvLyBHZW5lcmFsIElPIFBpbnMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCisJezB4MDAwOCwweDAwfSwJLy8gR2VuZXJhbCBJTyBQaW5zIENvbnRyb2wgUmVnaXN0ZXIgMAorCXsweDAwMDksMHgwMH0sCS8vIEdlbmVyYWwgSU8gUGlucyBDb250cm9sIFJlZ2lzdGVyIDEKKwl7MHgwMDEwLDB4MDF9LAkvLyBNZW1vcnkgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCXsweDAwMTQsMHgxMX0sCS8vIExDRCBQaXhlbCBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisJezB4MDAxOCwweDAxfSwJLy8gQ1JUL1RWIFBpeGVsIENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKwl7MHgwMDFDLDB4MDF9LAkvLyBNZWRpYVBsdWcgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCXsweDAwMUUsMHgwMX0sCS8vIENQVSBUbyBNZW1vcnkgV2FpdCBTdGF0ZSBTZWxlY3QgUmVnaXN0ZXIKKwl7MHgwMDIwLDB4MDB9LAkvLyBNZW1vcnkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCXsweDAwMjEsMHg0NX0sCS8vIERSQU0gUmVmcmVzaCBSYXRlIFJlZ2lzdGVyCisJezB4MDAyQSwweDAxfSwJLy8gRFJBTSBUaW1pbmdzIENvbnRyb2wgUmVnaXN0ZXIgMAorCXsweDAwMkIsMHgwM30sCS8vIERSQU0gVGltaW5ncyBDb250cm9sIFJlZ2lzdGVyIDEKKwl7MHgwMDMwLDB4MWN9LAkvLyBQYW5lbCBUeXBlIFJlZ2lzdGVyCisJezB4MDAzMSwweDAwfSwJLy8gTU9EIFJhdGUgUmVnaXN0ZXIKKwl7MHgwMDMyLDB4NEZ9LAkvLyBMQ0QgSG9yaXpvbnRhbCBEaXNwbGF5IFdpZHRoIFJlZ2lzdGVyCisJezB4MDAzNCwweDA3fSwJLy8gTENEIEhvcml6b250YWwgTm9uLURpc3BsYXkgUGVyaW9kIFJlZ2lzdGVyCisJezB4MDAzNSwweDAxfSwJLy8gVEZUIEZQTElORSBTdGFydCBQb3NpdGlvbiBSZWdpc3RlcgorCXsweDAwMzYsMHgwQn0sCS8vIFRGVCBGUExJTkUgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKwl7MHgwMDM4LDB4RUZ9LAkvLyBMQ0QgVmVydGljYWwgRGlzcGxheSBIZWlnaHQgUmVnaXN0ZXIgMAorCXsweDAwMzksMHgwMH0sCS8vIExDRCBWZXJ0aWNhbCBEaXNwbGF5IEhlaWdodCBSZWdpc3RlciAxCisJezB4MDAzQSwweDEzfSwJLy8gTENEIFZlcnRpY2FsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorCXsweDAwM0IsMHgwQn0sCS8vIFRGVCBGUEZSQU1FIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisJezB4MDAzQywweDAxfSwJLy8gVEZUIEZQRlJBTUUgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKwl7MHgwMDQwLDB4MDV9LAkvLyBMQ0QgRGlzcGxheSBNb2RlIFJlZ2lzdGVyICgyOjRicHAsMzo4YnBwLDU6MTZicHApCisJezB4MDA0MSwweDAwfSwJLy8gTENEIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXIKKwl7MHgwMDQyLDB4MDB9LAkvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKwl7MHgwMDQzLDB4MDB9LAkvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKwl7MHgwMDQ0LDB4MDB9LAkvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDIKKwl7MHgwMDQ2LDB4ODB9LAkvLyBMQ0QgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDAKKwl7MHgwMDQ3LDB4MDJ9LAkvLyBMQ0QgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDEKKwl7MHgwMDQ4LDB4MDB9LAkvLyBMQ0QgUGl4ZWwgUGFubmluZyBSZWdpc3RlcgorCXsweDAwNEEsMHgwMH0sCS8vIExDRCBEaXNwbGF5IEZJRk8gSGlnaCBUaHJlc2hvbGQgQ29udHJvbCBSZWdpc3RlcgorCXsweDAwNEIsMHgwMH0sCS8vIExDRCBEaXNwbGF5IEZJRk8gTG93IFRocmVzaG9sZCBDb250cm9sIFJlZ2lzdGVyCisJezB4MDA1MCwweDRGfSwJLy8gQ1JUL1RWIEhvcml6b250YWwgRGlzcGxheSBXaWR0aCBSZWdpc3RlcgorCXsweDAwNTIsMHgxM30sCS8vIENSVC9UViBIb3Jpem9udGFsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorCXsweDAwNTMsMHgwMX0sCS8vIENSVC9UViBIUlRDIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisJezB4MDA1NCwweDBCfSwJLy8gQ1JUL1RWIEhSVEMgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKwl7MHgwMDU2LDB4REZ9LAkvLyBDUlQvVFYgVmVydGljYWwgRGlzcGxheSBIZWlnaHQgUmVnaXN0ZXIgMAorCXsweDAwNTcsMHgwMX0sCS8vIENSVC9UViBWZXJ0aWNhbCBEaXNwbGF5IEhlaWdodCBSZWdpc3RlciAxCisJezB4MDA1OCwweDJCfSwJLy8gQ1JUL1RWIFZlcnRpY2FsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorCXsweDAwNTksMHgwOX0sCS8vIENSVC9UViBWUlRDIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisJezB4MDA1QSwweDAxfSwJLy8gQ1JUL1RWIFZSVEMgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKwl7MHgwMDVCLDB4MTB9LAkvLyBUViBPdXRwdXQgQ29udHJvbCBSZWdpc3RlcgorCXsweDAwNjAsMHgwM30sCS8vIENSVC9UViBEaXNwbGF5IE1vZGUgUmVnaXN0ZXIgKDI6NGJwcCwzOjhicHAsNToxNmJwcCkKKwl7MHgwMDYyLDB4MDB9LAkvLyBDUlQvVFYgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKwl7MHgwMDYzLDB4MDB9LAkvLyBDUlQvVFYgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKwl7MHgwMDY0LDB4MDB9LAkvLyBDUlQvVFYgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDIKKwl7MHgwMDY2LDB4NDB9LAkvLyBDUlQvVFYgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDAKKwl7MHgwMDY3LDB4MDF9LAkvLyBDUlQvVFYgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDEKKwl7MHgwMDY4LDB4MDB9LAkvLyBDUlQvVFYgUGl4ZWwgUGFubmluZyBSZWdpc3RlcgorCXsweDAwNkEsMHgwMH0sCS8vIENSVC9UViBEaXNwbGF5IEZJRk8gSGlnaCBUaHJlc2hvbGQgQ29udHJvbCBSZWdpc3RlcgorCXsweDAwNkIsMHgwMH0sCS8vIENSVC9UViBEaXNwbGF5IEZJRk8gTG93IFRocmVzaG9sZCBDb250cm9sIFJlZ2lzdGVyCisJezB4MDA3MCwweDAwfSwJLy8gTENEIEluay9DdXJzb3IgQ29udHJvbCBSZWdpc3RlcgorCXsweDAwNzEsMHgwMX0sCS8vIExDRCBJbmsvQ3Vyc29yIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIKKwl7MHgwMDcyLDB4MDB9LAkvLyBMQ0QgQ3Vyc29yIFggUG9zaXRpb24gUmVnaXN0ZXIgMAorCXsweDAwNzMsMHgwMH0sCS8vIExDRCBDdXJzb3IgWCBQb3NpdGlvbiBSZWdpc3RlciAxCisJezB4MDA3NCwweDAwfSwJLy8gTENEIEN1cnNvciBZIFBvc2l0aW9uIFJlZ2lzdGVyIDAKKwl7MHgwMDc1LDB4MDB9LAkvLyBMQ0QgQ3Vyc29yIFkgUG9zaXRpb24gUmVnaXN0ZXIgMQorCXsweDAwNzYsMHgwMH0sCS8vIExDRCBJbmsvQ3Vyc29yIEJsdWUgQ29sb3IgMCBSZWdpc3RlcgorCXsweDAwNzcsMHgwMH0sCS8vIExDRCBJbmsvQ3Vyc29yIEdyZWVuIENvbG9yIDAgUmVnaXN0ZXIKKwl7MHgwMDc4LDB4MDB9LAkvLyBMQ0QgSW5rL0N1cnNvciBSZWQgQ29sb3IgMCBSZWdpc3RlcgorCXsweDAwN0EsMHgxRn0sCS8vIExDRCBJbmsvQ3Vyc29yIEJsdWUgQ29sb3IgMSBSZWdpc3RlcgorCXsweDAwN0IsMHgzRn0sCS8vIExDRCBJbmsvQ3Vyc29yIEdyZWVuIENvbG9yIDEgUmVnaXN0ZXIKKwl7MHgwMDdDLDB4MUZ9LAkvLyBMQ0QgSW5rL0N1cnNvciBSZWQgQ29sb3IgMSBSZWdpc3RlcgorCXsweDAwN0UsMHgwMH0sCS8vIExDRCBJbmsvQ3Vyc29yIEZJRk8gVGhyZXNob2xkIFJlZ2lzdGVyCisJezB4MDA4MCwweDAwfSwJLy8gQ1JUL1RWIEluay9DdXJzb3IgQ29udHJvbCBSZWdpc3RlcgorCXsweDAwODEsMHgwMX0sCS8vIENSVC9UViBJbmsvQ3Vyc29yIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIKKwl7MHgwMDgyLDB4MDB9LAkvLyBDUlQvVFYgQ3Vyc29yIFggUG9zaXRpb24gUmVnaXN0ZXIgMAorCXsweDAwODMsMHgwMH0sCS8vIENSVC9UViBDdXJzb3IgWCBQb3NpdGlvbiBSZWdpc3RlciAxCisJezB4MDA4NCwweDAwfSwJLy8gQ1JUL1RWIEN1cnNvciBZIFBvc2l0aW9uIFJlZ2lzdGVyIDAKKwl7MHgwMDg1LDB4MDB9LAkvLyBDUlQvVFYgQ3Vyc29yIFkgUG9zaXRpb24gUmVnaXN0ZXIgMQorCXsweDAwODYsMHgwMH0sCS8vIENSVC9UViBJbmsvQ3Vyc29yIEJsdWUgQ29sb3IgMCBSZWdpc3RlcgorCXsweDAwODcsMHgwMH0sCS8vIENSVC9UViBJbmsvQ3Vyc29yIEdyZWVuIENvbG9yIDAgUmVnaXN0ZXIKKwl7MHgwMDg4LDB4MDB9LAkvLyBDUlQvVFYgSW5rL0N1cnNvciBSZWQgQ29sb3IgMCBSZWdpc3RlcgorCXsweDAwOEEsMHgxRn0sCS8vIENSVC9UViBJbmsvQ3Vyc29yIEJsdWUgQ29sb3IgMSBSZWdpc3RlcgorCXsweDAwOEIsMHgzRn0sCS8vIENSVC9UViBJbmsvQ3Vyc29yIEdyZWVuIENvbG9yIDEgUmVnaXN0ZXIKKwl7MHgwMDhDLDB4MUZ9LAkvLyBDUlQvVFYgSW5rL0N1cnNvciBSZWQgQ29sb3IgMSBSZWdpc3RlcgorCXsweDAwOEUsMHgwMH0sCS8vIENSVC9UViBJbmsvQ3Vyc29yIEZJRk8gVGhyZXNob2xkIFJlZ2lzdGVyCisJezB4MDEwMCwweDAwfSwJLy8gQml0Qmx0IENvbnRyb2wgUmVnaXN0ZXIgMAorCXsweDAxMDEsMHgwMH0sCS8vIEJpdEJsdCBDb250cm9sIFJlZ2lzdGVyIDEKKwl7MHgwMTAyLDB4MDB9LAkvLyBCaXRCbHQgUk9QIENvZGUvQ29sb3IgRXhwYW5zaW9uIFJlZ2lzdGVyCisJezB4MDEwMywweDAwfSwJLy8gQml0Qmx0IE9wZXJhdGlvbiBSZWdpc3RlcgorCXsweDAxMDQsMHgwMH0sCS8vIEJpdEJsdCBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAwCisJezB4MDEwNSwweDAwfSwJLy8gQml0Qmx0IFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKwl7MHgwMTA2LDB4MDB9LAkvLyBCaXRCbHQgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMgorCXsweDAxMDgsMHgwMH0sCS8vIEJpdEJsdCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKwl7MHgwMTA5LDB4MDB9LAkvLyBCaXRCbHQgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAxCisJezB4MDEwQSwweDAwfSwJLy8gQml0Qmx0IERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMgorCXsweDAxMEMsMHgwMH0sCS8vIEJpdEJsdCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMAorCXsweDAxMEQsMHgwMH0sCS8vIEJpdEJsdCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMQorCXsweDAxMTAsMHgwMH0sCS8vIEJpdEJsdCBXaWR0aCBSZWdpc3RlciAwCisJezB4MDExMSwweDAwfSwJLy8gQml0Qmx0IFdpZHRoIFJlZ2lzdGVyIDEKKwl7MHgwMTEyLDB4MDB9LAkvLyBCaXRCbHQgSGVpZ2h0IFJlZ2lzdGVyIDAKKwl7MHgwMTEzLDB4MDB9LAkvLyBCaXRCbHQgSGVpZ2h0IFJlZ2lzdGVyIDEKKwl7MHgwMTE0LDB4MDB9LAkvLyBCaXRCbHQgQmFja2dyb3VuZCBDb2xvciBSZWdpc3RlciAwCisJezB4MDExNSwweDAwfSwJLy8gQml0Qmx0IEJhY2tncm91bmQgQ29sb3IgUmVnaXN0ZXIgMQorCXsweDAxMTgsMHgwMH0sCS8vIEJpdEJsdCBGb3JlZ3JvdW5kIENvbG9yIFJlZ2lzdGVyIDAKKwl7MHgwMTE5LDB4MDB9LAkvLyBCaXRCbHQgRm9yZWdyb3VuZCBDb2xvciBSZWdpc3RlciAxCisJezB4MDFFMCwweDAwfSwJLy8gTG9vay1VcCBUYWJsZSBNb2RlIFJlZ2lzdGVyCisJezB4MDFFMiwweDAwfSwJLy8gTG9vay1VcCBUYWJsZSBBZGRyZXNzIFJlZ2lzdGVyCisJLyogbm90IHN1cmUsIHdvdWxkbid0IGxpa2UgdG8gbWVzcyB3aXRoIHRoZSBkcml2ZXIgKi8KKwl7MHgwMUU0LDB4MDB9LAkvLyBMb29rLVVwIFRhYmxlIERhdGEgUmVnaXN0ZXIKKwkvKiBqb3JuYWRhIGRvYyBzYXlzIDB4MDAsIGJ1dCBJIHRydXN0IHRoZSBkcml2ZXIgKi8KKwl7MHgwMUYwLDB4MTB9LAkvLyBQb3dlciBTYXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKwl7MHgwMUYxLDB4MDB9LAkvLyBQb3dlciBTYXZlIFN0YXR1cyBSZWdpc3RlcgorCXsweDAxRjQsMHgwMH0sCS8vIENQVS10by1NZW1vcnkgQWNjZXNzIFdhdGNoZG9nIFRpbWVyIFJlZ2lzdGVyCisJezB4MDFGQywweDAxfSwJLy8gRGlzcGxheSBNb2RlIFJlZ2lzdGVyKDB4MDE6TENELCAweDAyOkNSVCwgMHgwMzpMQ0QmQ1JUKQorfTsKKworc3RhdGljIHN0cnVjdCBzMWQxM3h4eGZiX3BkYXRhIHMxZDEzeHh4ZmJfZGF0YSA9IHsKKwkuaW5pdHJlZ3MJCT0gczFkMTN4eHhmYl9pbml0cmVncywKKwkuaW5pdHJlZ3NzaXplCQk9IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9pbml0cmVncyksCisJLnBsYXRmb3JtX2luaXRfdmlkZW8JPSBOVUxMCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMxZDEzeHh4ZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBFUFNPTkZCU1RBUlQsCisJCS5lbmQJPSBFUFNPTkZCU1RBUlQgKyBFUFNPTkZCTEVOLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gRVBTT05SRUdTVEFSVCwKKwkJLmVuZAk9IEVQU09OUkVHU1RBUlQgKyBFUFNPTlJFR0xFTiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczFkMTN4eHhmYl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gUzFEX0RFVklDRU5BTUUsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnMxZDEzeHh4ZmJfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzMWQxM3h4eGZiX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gczFkMTN4eHhmYl9yZXNvdXJjZXMsCit9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNhMTExMV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5zdGFydAkJPSAweDQwMDAwMDAwLAotCQkuZW5kCQk9IDB4NDAwMDFmZmYsCisJCS5zdGFydAkJPSBTQTExMTFSRUdTVEFSVCwKKwkJLmVuZAkJPSBTQTExMTFSRUdTVEFSVCArIFNBMTExMVJFR0xFTiwKIAkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewpAQCAtNTMsMTggKzIyMCwzMiBAQAogCS5yZXNvdXJjZQk9IHNhMTExMV9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBqb3JuYWRhNzIwX21jdV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImpvcm5hZGE3MjBfbWN1IiwKKwkuaWQJCT0gLTEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNhMTExMV9kZXZpY2UsCisJJmpvcm5hZGE3MjBfbWN1X2RldmljZSwKKwkmczFkMTN4eHhmYl9kZXZpY2UsCiB9OwogCisvKiBhIHN0dWIgZm9yIG5vdywgd2UgdGhlb3JldGljYWxseSBjYW5ub3Qgc3VzcGVuZCB3aXRob3V0IGEgZmxhc2hib2FyZCAqLworaW50IHBtX3N1c3BlbmQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXJldHVybiAtMTsKK30KKwogc3RhdGljIGludCBfX2luaXQgam9ybmFkYTcyMF9pbml0KHZvaWQpCiB7CiAJaW50IHJldCA9IC1FTk9ERVY7CiAKIAlpZiAobWFjaGluZV9pc19qb3JuYWRhNzIwKCkpIHsKIAkJR1BEUiB8PSBHUElPX0dQSU8yMDsKLQkJVFVDUiA9IEpPUlRVQ1JfVkFMOwkvKiBzZXQgdGhlIG9zY2lsbGF0b3Igb3V0IHRvIHRoZSBTQS0xMTAxICovCi0KKwkJLyogb3NjaWxsYXRvciBzZXR1cCAobGluZSAxMTYgb2YgSFAncyBkb2MpICovCisJCVRVQ1IgPSBUVUNSX1ZBTDsKKwkJLyogcmVzZXR0aW5nIFNBMTExMSAobGluZSAxMTggb2YgSFAncyBkb2MpICovCiAJCUdQU1IgPSBHUElPX0dQSU8yMDsKIAkJdWRlbGF5KDEpOwogCQlHUENSID0gR1BJT19HUElPMjA7CkBAIC03MiwxMCArMjUzLDYgQEAKIAkJR1BTUiA9IEdQSU9fR1BJTzIwOwogCQl1ZGVsYXkoMjApOwogCi0JCS8qIExERDQgaXMgc3BlYWtlciwgTEREMyBpcyBtaWNyb3Bob25lICovCi0JCVBQU1IgJj0gfihQUENfTEREMyB8IFBQQ19MREQ0KTsKLQkJUFBEUiB8PSBQUENfTEREMyB8IFBQQ19MREQ0OwotCiAJCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtODUsMTkgKzI2MiwxOSBAQAogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGpvcm5hZGE3MjBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJewkvKiBFcHNvbiByZWdpc3RlcnMgKi8KLQkJLnZpcnR1YWwJPSAgMHhmMDAwMDAwMCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKDB4NDgwMDAwMDApLAotCQkubGVuZ3RoCQk9IDB4MDAxMDAwMDAsCisJCS52aXJ0dWFsCT0gMHhmMDAwMDAwMCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVQU09OUkVHU1RBUlQpLAorCQkubGVuZ3RoCQk9IEVQU09OUkVHTEVOLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UKIAl9LCB7CS8qIEVwc29uIGZyYW1lIGJ1ZmZlciAqLwotCQkudmlydHVhbAk9ICAweGYxMDAwMDAwLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oMHg0ODIwMDAwMCksCi0JCS5sZW5ndGgJCT0gMHgwMDEwMDAwMCwKKwkJLnZpcnR1YWwJPSAweGYxMDAwMDAwLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oRVBTT05GQlNUQVJUKSwKKwkJLmxlbmd0aAkJPSBFUFNPTkZCTEVOLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UKIAl9LCB7CS8qIFNBLTExMTEgKi8KLQkJLnZpcnR1YWwJPSAgMHhmNDAwMDAwMCwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKDB4NDAwMDAwMDApLAotCQkubGVuZ3RoCQk9IDB4MDAxMDAwMDAsCisJCS52aXJ0dWFsCT0gMHhmNDAwMDAwMCwKKwkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFNBMTExMVJFR1NUQVJUKSwKKwkJLmxlbmd0aAkJPSBTQTExMTFSRUdMRU4sCiAJCS50eXBlCQk9IE1UX0RFVklDRQogCX0KIH07CkBAIC0xMDYsNyArMjgzLDcgQEAKIHsKIAlzYTExMDBfbWFwX2lvKCk7CiAJaW90YWJsZV9pbml0KGpvcm5hZGE3MjBfaW9fZGVzYywgQVJSQVlfU0laRShqb3JuYWRhNzIwX2lvX2Rlc2MpKTsKLQkKKwogCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDAsIDMpOwogCXNhMTEwMF9yZWdpc3Rlcl91YXJ0KDEsIDEpOwogfQpAQCAtMTE2LDcgKzI5Myw3IEBACiAJCS5uYW1lCQk9ICJKT1JOQURBNzIwIGJvb3QgZmlybXdhcmUiLAogCQkuc2l6ZQkJPSAweDAwMDQwMDAwLAogCQkub2Zmc2V0CQk9IDAsCi0JCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwgIC8qIGZvcmNlIHJlYWQtb25seSAqLworCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLwogCX0sIHsKIAkJLm5hbWUJCT0gIkpPUk5BREE3MjAga2VybmVsIiwKIAkJLnNpemUJCT0gMHgwMDBjMDAwMCwKQEAgLTEzOSw3ICszMTYsNyBAQAogCQkub2Zmc2V0CQk9IDB4MDA1NDAwMDAsCiAJfSwgewogCQkubmFtZQkJPSAiSk9STkFEQTcyMCB1c3IgbG9jYWwiLAotCQkuc2l6ZQkJPSAwLCAgLyogd2lsbCBleHBhbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmxhc2ggKi8KKwkJLnNpemUJCT0gMCwgLyogd2lsbCBleHBhbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmxhc2ggKi8KIAkJLm9mZnNldAkJPSAweDAwZDAwMDAwLAogCX0KIH07CkBAIC0xNDcsMTAgKzMyNCwxMiBAQAogc3RhdGljIHZvaWQgam9ybmFkYTcyMF9zZXRfdnBwKGludCB2cHApCiB7CiAJaWYgKHZwcCkKLQkJUFBTUiB8PSAweDgwOworCQkvKiBlbmFibGluZyBmbGFzaCB3cml0ZSAobGluZSA0NzAgb2YgSFAncyBkb2MpICovCisJCVBQU1IgfD0gUFBDX0xERDc7CiAJZWxzZQotCQlQUFNSICY9IH4weDgwOwotCVBQRFIgfD0gMHg4MDsKKwkJLyogZGlzYWJsaW5nIGZsYXNoIHdyaXRlIChsaW5lIDQ3MCBvZiBIUCdzIGRvYykgKi8KKwkJUFBTUiAmPSB+UFBDX0xERDc7CisJUFBEUiB8PSBQUENfTERENzsKIH0KIAogc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGpvcm5hZGE3MjBfZmxhc2hfZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL25lcG9uc2V0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9uZXBvbnNldC5jCmluZGV4IDM1NGQ1ZTkuLjA3NWQ0ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL25lcG9uc2V0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvbmVwb25zZXQuYwpAQCAtMjksMTIgKzI5LDEyIEBACiAgKiBpcyByYXRoZXIgdW5mb3J0dW5hdGUuCiAgKi8KIHN0YXRpYyB2b2lkCi1uZXBvbnNldF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYykKK25lcG9uc2V0X2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgaXJyOwogCiAJd2hpbGUgKDEpIHsKLQkJc3RydWN0IGlycWRlc2MgKmQ7CisJCXN0cnVjdCBpcnFfZGVzYyAqZDsKIAogCQkvKgogCQkgKiBBY2tub3dsZWRnZSB0aGUgcGFyZW50IElSUS4KQEAgLTE2OCw5ICsxNjgsOSBAQAogCSAqIFNldHVwIG90aGVyIE5lcG9uc2V0IElSUXMuICBTQTExMTEgd2lsbCBiZSBkb25lIGJ5IHRoZQogCSAqIGdlbmVyaWMgU0ExMTExIGNvZGUuCiAJICovCi0Jc2V0X2lycV9oYW5kbGVyKElSUV9ORVBPTlNFVF9TTUM5MTk2LCBkb19zaW1wbGVfSVJRKTsKKwlzZXRfaXJxX2hhbmRsZXIoSVJRX05FUE9OU0VUX1NNQzkxOTYsIGhhbmRsZV9zaW1wbGVfaXJxKTsKIAlzZXRfaXJxX2ZsYWdzKElSUV9ORVBPTlNFVF9TTUM5MTk2LCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7Ci0Jc2V0X2lycV9oYW5kbGVyKElSUV9ORVBPTlNFVF9VU0FSLCBkb19zaW1wbGVfSVJRKTsKKwlzZXRfaXJxX2hhbmRsZXIoSVJRX05FUE9OU0VUX1VTQVIsIGhhbmRsZV9zaW1wbGVfaXJxKTsKIAlzZXRfaXJxX2ZsYWdzKElSUV9ORVBPTlNFVF9VU0FSLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvdGltZS5jCmluZGV4IDQyODRiZDYuLjI5Yzg5ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMKQEAgLTExOCw2ICsxMTgsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHNhMTEwMF90aW1lcl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHRpbWVzcGVjIHR2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzZXRfcnRjID0gc2ExMTAwX3NldF9ydGM7CiAKQEAgLTEyNiwxMiArMTI3LDEyIEBACiAJZG9fc2V0dGltZW9mZGF5KCZ0dik7CiAKIAlPSUVSID0gMDsJCS8qIGRpc2FibGUgYW55IHRpbWVyIGludGVycnVwdHMgKi8KLQlPU0NSID0gTEFUQ0gqMjsJCS8qIHB1c2ggT1NDUiBvdXQgb2YgdGhlIHdheSAqLwotCU9TTVIwID0gTEFUQ0g7CQkvKiBzZXQgaW5pdGlhbCBtYXRjaCAqLwogCU9TU1IgPSAweGY7CQkvKiBjbGVhciBzdGF0dXMgb24gYWxsIHRpbWVycyAqLwogCXNldHVwX2lycShJUlFfT1NUMCwgJnNhMTEwMF90aW1lcl9pcnEpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlPSUVSID0gT0lFUl9FMDsJCS8qIGVuYWJsZSBtYXRjaCBvbiB0aW1lciAwIHRvIGNhdXNlIGludGVycnVwdHMgKi8KLQlPU0NSID0gMDsJCS8qIGluaXRpYWxpemUgZnJlZS1ydW5uaW5nIHRpbWVyICovCisJT1NNUjAgPSBPU0NSICsgTEFUQ0g7CS8qIHNldCBpbml0aWFsIG1hdGNoICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaXJxLmMgYi9hcmNoL2FybS9tYWNoLXNoYXJrL2lycS5jCmluZGV4IDI5N2VjZjEuLjAwYTZjMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9pcnEuYwpAQCAtODIsNyArODIsNyBAQAogCiAJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgewogCQlzZXRfaXJxX2NoaXAoaXJxLCAmZmJfY2hpcCk7Ci0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGRvX2VkZ2VfSVJRKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCAzYjg1NzYxLi5iZjcxNTA3YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CiAKKyNpbmNsdWRlIDxhc20vY250MzJfdG9fNjMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC03Nyw3ICs3OCw3IEBACiB9OwogCiBzdGF0aWMgdm9pZAotc2ljX2hhbmRsZV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MpCitzaWNfaGFuZGxlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXMgPSByZWFkbChWQV9TSUNfQkFTRSArIFNJQ19JUlFfU1RBVFVTKTsKIApAQCAtMTIzLDcgKzEyNCw3IEBACiAJZm9yIChpID0gSVJRX1NJQ19TVEFSVDsgaSA8PSBJUlFfU0lDX0VORDsgaSsrKSB7CiAJCWlmICgoUElDX01BU0sgJiAoMSA8PCAoaSAtIElSUV9TSUNfU1RBUlQpKSkgPT0gMCkgewogCQkJc2V0X2lycV9jaGlwKGksICZzaWNfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaSwgZG9fbGV2ZWxfSVJRKTsKKwkJCXNldF9pcnFfaGFuZGxlcihpLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAkJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCB8IElSUUZfUFJPQkUpOwogCQl9CiAJfQpAQCAtMjI4LDE0ICsyMjksMTkgQEAKIAogLyoKICAqIFRoaXMgaXMgdGhlIFZlcnNhdGlsZSBzY2hlZF9jbG9jayBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaGFzCi0gKiBhIHJlc29sdXRpb24gb2YgNDEuN25zLCBhbmQgYSBtYXhpbXVtIHZhbHVlIG9mIGFib3V0IDE3OXMuCisgKiBhIHJlc29sdXRpb24gb2YgNDEuN25zLCBhbmQgYSBtYXhpbXVtIHZhbHVlIG9mIGFib3V0IDM1NTgzIGRheXMuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIG1vbm90b25pYyBpbiB0aGF0IHJhbmdlIGFzCisgKiBsb25nIGFzIHRoZXJlIGlzIGFsd2F5cyBsZXNzIHRoYW4gODkgc2Vjb25kcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKKyAqIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCiAgKi8KIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbG9uZyB2OworCXVuc2lnbmVkIGxvbmcgbG9uZyB2ID0gY250MzJfdG9fNjMocmVhZGwoVkVSU0FUSUxFX1JFRkNPVU5URVIpKTsKIAotCXYgPSAodW5zaWduZWQgbG9uZyBsb25nKXJlYWRsKFZFUlNBVElMRV9SRUZDT1VOVEVSKSAqIDEyNTsKLQlkb19kaXYodiwgMyk7CisJLyogdGhlIDw8MSBnZXRzIHJpZCBvZiB0aGUgY250XzMyX3RvXzYzIHRvcCBiaXQgc2F2aW5nIG9uIGEgYmljIGluc24gKi8KKwl2ICo9IDEyNTw8MTsKKwlkb19kaXYodiwgMzw8MSk7CiAKIAlyZXR1cm4gdjsKIH0KQEAgLTMxOSw2ICszMjUsMTkgQEAKIAkucmVzb3VyY2UJPSBzbWM5MXhfcmVzb3VyY2VzLAogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2ZXJzYXRpbGVfaTJjX3Jlc291cmNlID0geworCS5zdGFydAkJCT0gVkVSU0FUSUxFX0kyQ19CQVNFLAorCS5lbmQJCQk9IFZFUlNBVElMRV9JMkNfQkFTRSArIFNaXzRLIC0gMSwKKwkuZmxhZ3MJCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdmVyc2F0aWxlX2kyY19kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJ2ZXJzYXRpbGUtaTJjIiwKKwkuaWQJCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCQk9IDEsCisJLnJlc291cmNlCQk9ICZ2ZXJzYXRpbGVfaTJjX3Jlc291cmNlLAorfTsKKwogI2RlZmluZSBWRVJTQVRJTEVfU1lTTUNJCShfX2lvX2FkZHJlc3MoVkVSU0FUSUxFX1NZU19CQVNFKSArIFZFUlNBVElMRV9TWVNfTUNJX09GRlNFVCkKIAogdW5zaWduZWQgaW50IG1tY19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtNzY5LDYgKzc4OCw3IEBACiAJY2xrX3JlZ2lzdGVyKCZ2ZXJzYXRpbGVfY2xjZF9jbGspOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ2ZXJzYXRpbGVfZmxhc2hfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnZlcnNhdGlsZV9pMmNfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYW1iYV9kZXZzKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfcGIuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCmluZGV4IDUwMzcyNWIuLmJlNDM5YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jCkBAIC04MSwyMiArODEsMTggQEAKIAkmbW1jMV9kZXZpY2UsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCB2ZXJzYXRpbGVfcGJfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHZlcnNhdGlsZV9wYl9pbml0KHZvaWQpCiB7CiAJaW50IGk7CiAKLQlpZiAobWFjaGluZV9pc192ZXJzYXRpbGVfcGIoKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKLQkJCXN0cnVjdCBhbWJhX2RldmljZSAqZCA9IGFtYmFfZGV2c1tpXTsKLQkJCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKGQsICZpb21lbV9yZXNvdXJjZSk7Ci0JCX0KKwl2ZXJzYXRpbGVfaW5pdCgpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYW1iYV9kZXZzKTsgaSsrKSB7CisJCXN0cnVjdCBhbWJhX2RldmljZSAqZCA9IGFtYmFfZGV2c1tpXTsKKwkJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoZCwgJmlvbWVtX3Jlc291cmNlKTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAotYXJjaF9pbml0Y2FsbCh2ZXJzYXRpbGVfcGJfaW5pdCk7Ci0KIE1BQ0hJTkVfU1RBUlQoVkVSU0FUSUxFX1BCLCAiQVJNLVZlcnNhdGlsZSBQQiIpCiAJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwogCS5waHlzX2lvCT0gMHgxMDFmMTAwMCwKQEAgLTEwNSw1ICsxMDEsNSBAQAogCS5tYXBfaW8JCT0gdmVyc2F0aWxlX21hcF9pbywKIAkuaW5pdF9pcnEJPSB2ZXJzYXRpbGVfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZ2ZXJzYXRpbGVfdGltZXIsCi0JLmluaXRfbWFjaGluZQk9IHZlcnNhdGlsZV9pbml0LAorCS5pbml0X21hY2hpbmUJPSB2ZXJzYXRpbGVfcGJfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9LY29uZmlnIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwppbmRleCBjMGJmYjgyLi5hYWRlMmY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCXNlbGVjdCBDUFVfQ1AxNV9NUFUKIAloZWxwCiAJICBBUk05NDBUIGlzIGEgbWVtYmVyIG9mIHRoZSBBUk05VERNSSBmYW1pbHkgb2YgZ2VuZXJhbC0KLQkgIHB1cnBvc2UgbWljcm9wcm9jZXNzb3JzIHdpdGggTVBVIGFuZCBzZXBlcmF0ZSA0S0IKKwkgIHB1cnBvc2UgbWljcm9wcm9jZXNzb3JzIHdpdGggTVBVIGFuZCBzZXBhcmF0ZSA0S0IKIAkgIGluc3RydWN0aW9uIGFuZCA0S0IgZGF0YSBjYXNlcywgZWFjaCB3aXRoIGEgNC13b3JkIGxpbmUKIAkgIGxlbmd0aC4KIApAQCAtMzMzLDcgKzMzMyw3IEBACiAjIFhTY2FsZSBDb3JlIFZlcnNpb24gMwogY29uZmlnIENQVV9YU0MzCiAJYm9vbAotCWRlcGVuZHMgb24gQVJDSF9JWFAyM1hYCisJZGVwZW5kcyBvbiBBUkNIX0lYUDIzWFggfHwgQVJDSF9JT1AxM1hYCiAJZGVmYXVsdCB5CiAJc2VsZWN0IENQVV8zMnY1CiAJc2VsZWN0IENQVV9BQlJUX0VWNVQKQEAgLTU4MCw3ICs1ODAsNyBAQAogCiBjb25maWcgQ1BVX0JQUkVESUNUX0RJU0FCTEUKIAlib29sICJEaXNhYmxlIGJyYW5jaCBwcmVkaWN0aW9uIgotCWRlcGVuZHMgb24gQ1BVX0FSTTEwMjAgfHwgQ1BVX1Y2CisJZGVwZW5kcyBvbiBDUFVfQVJNMTAyMCB8fCBDUFVfVjYgfHwgQ1BVX1hTQzMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgYnJhbmNoIHByZWRpY3Rpb24uICBJZiB1bnN1cmUsIHNheSBOLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jb25zaXN0ZW50LmMgYi9hcmNoL2FybS9tbS9jb25zaXN0ZW50LmMKaW5kZXggNTBlNmI2Yi4uNmE5YzM2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29uc2lzdGVudC5jCisrKyBiL2FyY2gvYXJtL21tL2NvbnNpc3RlbnQuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAJCQkgKiB4ODYgZG9lcyBub3QgbWFyayB0aGUgcGFnZXMgcmVzZXJ2ZWQuLi4KIAkJCSAqLwogCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOwotCQkJc2V0X3B0ZShwdGUsIG1rX3B0ZShwYWdlLCBwcm90KSk7CisJCQlzZXRfcHRlX2V4dChwdGUsIG1rX3B0ZShwYWdlLCBwcm90KSwgMCk7CiAJCQlwYWdlKys7CiAJCQlwdGUrKzsKIAkJCW9mZisrOwpAQCAtNDc2LDYgKzQ3Niw5IEBACiAKIC8qCiAgKiBNYWtlIGFuIGFyZWEgY29uc2lzdGVudCBmb3IgZGV2aWNlcy4KKyAqIE5vdGU6IERyaXZlcnMgc2hvdWxkIE5PVCB1c2UgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSwgYXMgaXQgd2lsbCBicmVhaworICogcGxhdGZvcm1zIHdpdGggQ09ORklHX0RNQUJPVU5DRS4KKyAqIFVzZSB0aGUgZHJpdmVyIERNQSBzdXBwb3J0IC0gc2VlIGRtYS1tYXBwaW5nLmggKGRtYV9zeW5jXyopCiAgKi8KIHZvaWQgY29uc2lzdGVudF9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0bWMuYyBiL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY0bWMuYwppbmRleCBkZjE2NDVlLi40MDhiMDVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jb3B5cGFnZS12NG1jLmMKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjRtYy5jCkBAIC03MSw3ICs3MSw3IEBACiB7CiAJc3Bpbl9sb2NrKCZtaW5pY2FjaGVfbG9jayk7CiAKLQlzZXRfcHRlKFRPUF9QVEUoMHhmZmZmODAwMCksIHBmbl9wdGUoX19wYShrZnJvbSkgPj4gUEFHRV9TSElGVCwgbWluaWNhY2hlX3BncHJvdCkpOworCXNldF9wdGVfZXh0KFRPUF9QVEUoMHhmZmZmODAwMCksIHBmbl9wdGUoX19wYShrZnJvbSkgPj4gUEFHRV9TSElGVCwgbWluaWNhY2hlX3BncHJvdCksIDApOwogCWZsdXNoX3RsYl9rZXJuZWxfcGFnZSgweGZmZmY4MDAwKTsKIAogCW1jX2NvcHlfdXNlcl9wYWdlKCh2b2lkICopMHhmZmZmODAwMCwga3RvKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12Ni5jCmluZGV4IDNkMGQzYTkuLjg2NTc3N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYwpAQCAtNzAsOCArNzAsOCBAQAogCSAqLwogCXNwaW5fbG9jaygmdjZfbG9jayk7CiAKLQlzZXRfcHRlKFRPUF9QVEUoZnJvbV9hZGRyZXNzKSArIG9mZnNldCwgcGZuX3B0ZShfX3BhKGtmcm9tKSA+PiBQQUdFX1NISUZULCBQQUdFX0tFUk5FTCkpOwotCXNldF9wdGUoVE9QX1BURSh0b19hZGRyZXNzKSArIG9mZnNldCwgcGZuX3B0ZShfX3BhKGt0bykgPj4gUEFHRV9TSElGVCwgUEFHRV9LRVJORUwpKTsKKwlzZXRfcHRlX2V4dChUT1BfUFRFKGZyb21fYWRkcmVzcykgKyBvZmZzZXQsIHBmbl9wdGUoX19wYShrZnJvbSkgPj4gUEFHRV9TSElGVCwgUEFHRV9LRVJORUwpLCAwKTsKKwlzZXRfcHRlX2V4dChUT1BfUFRFKHRvX2FkZHJlc3MpICsgb2Zmc2V0LCBwZm5fcHRlKF9fcGEoa3RvKSA+PiBQQUdFX1NISUZULCBQQUdFX0tFUk5FTCksIDApOwogCiAJZnJvbSA9IGZyb21fYWRkcmVzcyArIChvZmZzZXQgPDwgUEFHRV9TSElGVCk7CiAJdG8gICA9IHRvX2FkZHJlc3MgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJICovCiAJc3Bpbl9sb2NrKCZ2Nl9sb2NrKTsKIAotCXNldF9wdGUoVE9QX1BURSh0b19hZGRyZXNzKSArIG9mZnNldCwgcGZuX3B0ZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZULCBQQUdFX0tFUk5FTCkpOworCXNldF9wdGVfZXh0KFRPUF9QVEUodG9fYWRkcmVzcykgKyBvZmZzZXQsIHBmbl9wdGUoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCwgUEFHRV9LRVJORUwpLCAwKTsKIAlmbHVzaF90bGJfa2VybmVsX3BhZ2UodG8pOwogCWNsZWFyX3BhZ2UoKHZvaWQgKil0byk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXhzY2FsZS5jIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLmMKaW5kZXggODRlYmUwYS4uYWVhNWRhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLmMKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UteHNjYWxlLmMKQEAgLTkzLDcgKzkzLDcgQEAKIHsKIAlzcGluX2xvY2soJm1pbmljYWNoZV9sb2NrKTsKIAotCXNldF9wdGUoVE9QX1BURShDT1BZUEFHRV9NSU5JQ0FDSEUpLCBwZm5fcHRlKF9fcGEoa2Zyb20pID4+IFBBR0VfU0hJRlQsIG1pbmljYWNoZV9wZ3Byb3QpKTsKKwlzZXRfcHRlX2V4dChUT1BfUFRFKENPUFlQQUdFX01JTklDQUNIRSksIHBmbl9wdGUoX19wYShrZnJvbSkgPj4gUEFHRV9TSElGVCwgbWluaWNhY2hlX3BncHJvdCksIDApOwogCWZsdXNoX3RsYl9rZXJuZWxfcGFnZShDT1BZUEFHRV9NSU5JQ0FDSEUpOwogCiAJbWNfY29weV91c2VyX3BhZ2UoKHZvaWQgKilDT1BZUEFHRV9NSU5JQ0FDSEUsIGt0byk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMgYi9hcmNoL2FybS9tbS9mYXVsdC1hcm12LmMKaW5kZXggN2ZjMWIzNS4uY2Y5NWM1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQtYXJtdi5jCisrKyBiL2FyY2gvYXJtL21tL2ZhdWx0LWFybXYuYwpAQCAtNjEsNyArNjEsNyBAQAogCWlmIChwdGVfcHJlc2VudChlbnRyeSkgJiYgcHRlX3ZhbChlbnRyeSkgJiBzaGFyZWRfcHRlX21hc2spIHsKIAkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZV9wZm4oZW50cnkpKTsKIAkJcHRlX3ZhbChlbnRyeSkgJj0gfnNoYXJlZF9wdGVfbWFzazsKLQkJc2V0X3B0ZShwdGUsIGVudHJ5KTsKKwkJc2V0X3B0ZV9hdCh2bWEtPnZtX21tLCBhZGRyZXNzLCBwdGUsIGVudHJ5KTsKIAkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsKIAkJcmV0ID0gMTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9mYXVsdC5jIGIvYXJjaC9hcm0vbW0vZmF1bHQuYwppbmRleCA1ZTY1OGE4Li45ZmQ2ZDJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9mYXVsdC5jCisrKyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKQEAgLTIzMCw3ICsyMzAsNyBAQAogCSAqIElmIHdlJ3JlIGluIGFuIGludGVycnVwdCBvciBoYXZlIG5vIHVzZXIKIAkgKiBjb250ZXh0LCB3ZSBtdXN0IG5vdCB0YWtlIHRoZSBmYXVsdC4uCiAJICovCi0JaWYgKGluX2ludGVycnVwdCgpIHx8ICFtbSkKKwlpZiAoaW5fYXRvbWljKCkgfHwgIW1tKQogCQlnb3RvIG5vX2NvbnRleHQ7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmx1c2guYyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKaW5kZXggNDU0MjA1Yi4uNjI4MzQ4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmx1c2guYworKysgYi9hcmNoL2FybS9tbS9mbHVzaC5jCkBAIC0yNiw3ICsyNiw3IEBACiAJdW5zaWduZWQgbG9uZyB0byA9IEFMSUFTX0ZMVVNIX1NUQVJUICsgKENBQ0hFX0NPTE9VUih2YWRkcikgPDwgUEFHRV9TSElGVCk7CiAJY29uc3QgaW50IHplcm8gPSAwOwogCi0Jc2V0X3B0ZShUT1BfUFRFKHRvKSwgcGZuX3B0ZShwZm4sIFBBR0VfS0VSTkVMKSk7CisJc2V0X3B0ZV9leHQoVE9QX1BURSh0byksIHBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTCksIDApOwogCWZsdXNoX3RsYl9rZXJuZWxfcGFnZSh0byk7CiAKIAlhc20oCSJtY3JyCXAxNSwgMCwgJTEsICUwLCBjMTRcbiIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCAyMjIxN2ZlLi5iNTgxNGI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC0zMiw0MCArMzIsNTEgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBoeXNfaW5pdHJkX3NpemU7CiAKIC8qCi0gKiBUaGUgc29sZSB1c2Ugb2YgdGhpcyBpcyB0byBwYXNzIG1lbW9yeSBjb25maWd1cmF0aW9uCi0gKiBkYXRhIGZyb20gcGFnaW5nX2luaXQgdG8gbWVtX2luaXQuCisgKiBUaGlzIGlzIHVzZWQgdG8gcGFzcyBtZW1vcnkgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gcGFnaW5nX2luaXQKKyAqIHRvIG1lbV9pbml0LCBhbmQgYnkgc2hvd19tZW0oKSB0byBza2lwIGhvbGVzIGluIHRoZSBtZW1vcnkgbWFwLgogICovCi1zdGF0aWMgc3RydWN0IG1lbWluZm8gbWVtaW5mbyBfX2luaXRkYXRhID0geyAwLCB9Oworc3RhdGljIHN0cnVjdCBtZW1pbmZvIG1lbWluZm8gPSB7IDAsIH07CisKKyNkZWZpbmUgZm9yX2VhY2hfbm9kZWJhbmsoaXRlcixtaSxubykJCQlcCisJZm9yIChpdGVyID0gMDsgaXRlciA8IG1pLT5ucl9iYW5rczsgaXRlcisrKQlcCisJCWlmIChtaS0+YmFua1tpdGVyXS5ub2RlID09IG5vKQogCiB2b2lkIHNob3dfbWVtKHZvaWQpCiB7CiAJaW50IGZyZWUgPSAwLCB0b3RhbCA9IDAsIHJlc2VydmVkID0gMDsKLQlpbnQgc2hhcmVkID0gMCwgY2FjaGVkID0gMCwgc2xhYiA9IDAsIG5vZGU7CisJaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDAsIHNsYWIgPSAwLCBub2RlLCBpOworCXN0cnVjdCBtZW1pbmZvICogbWkgPSAmbWVtaW5mbzsKIAogCXByaW50aygiTWVtLWluZm86XG4iKTsKIAlzaG93X2ZyZWVfYXJlYXMoKTsKIAlwcmludGsoIkZyZWUgc3dhcDogICAgICAgJTZsZGtCXG4iLCBucl9zd2FwX3BhZ2VzPDwoUEFHRV9TSElGVC0xMCkpOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgKmVuZDsKKwkJZm9yX2VhY2hfbm9kZWJhbmsgKGksbWksbm9kZSkgeworCQkJdW5zaWduZWQgaW50IHBmbjEsIHBmbjI7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgKmVuZDsKIAotCQlwYWdlID0gTk9ERV9NRU1fTUFQKG5vZGUpOwotCQllbmQgID0gcGFnZSArIE5PREVfREFUQShub2RlKS0+bm9kZV9zcGFubmVkX3BhZ2VzOworCQkJcGZuMSA9IG1pLT5iYW5rW2ldLnN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJCQlwZm4yID0gKG1pLT5iYW5rW2ldLnNpemUgKyBtaS0+YmFua1tpXS5zdGFydCkgPj4gUEFHRV9TSElGVDsKIAotCQlkbyB7Ci0JCQl0b3RhbCsrOwotCQkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKLQkJCQlyZXNlcnZlZCsrOwotCQkJZWxzZSBpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKLQkJCQljYWNoZWQrKzsKLQkJCWVsc2UgaWYgKFBhZ2VTbGFiKHBhZ2UpKQotCQkJCXNsYWIrKzsKLQkJCWVsc2UgaWYgKCFwYWdlX2NvdW50KHBhZ2UpKQotCQkJCWZyZWUrKzsKLQkJCWVsc2UKLQkJCQlzaGFyZWQgKz0gcGFnZV9jb3VudChwYWdlKSAtIDE7Ci0JCQlwYWdlKys7Ci0JCX0gd2hpbGUgKHBhZ2UgPCBlbmQpOworCQkJcGFnZSA9IE5PREVfTUVNX01BUChub2RlKSArIHBmbjE7CisJCQllbmQgID0gTk9ERV9NRU1fTUFQKG5vZGUpICsgcGZuMjsKKworCQkJZG8geworCQkJCXRvdGFsKys7CisJCQkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKKwkJCQkJcmVzZXJ2ZWQrKzsKKwkJCQllbHNlIGlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQkJCQljYWNoZWQrKzsKKwkJCQllbHNlIGlmIChQYWdlU2xhYihwYWdlKSkKKwkJCQkJc2xhYisrOworCQkJCWVsc2UgaWYgKCFwYWdlX2NvdW50KHBhZ2UpKQorCQkJCQlmcmVlKys7CisJCQkJZWxzZQorCQkJCQlzaGFyZWQgKz0gcGFnZV9jb3VudChwYWdlKSAtIDE7CisJCQkJcGFnZSsrOworCQkJfSB3aGlsZSAocGFnZSA8IGVuZCk7CisJCX0KIAl9CiAKIAlwcmludGsoIiVkIHBhZ2VzIG9mIFJBTVxuIiwgdG90YWwpOwpAQCAtNzYsMTAgKzg3LDYgQEAKIAlwcmludGsoIiVkIHBhZ2VzIHN3YXAgY2FjaGVkXG4iLCBjYWNoZWQpOwogfQogCi0jZGVmaW5lIGZvcl9lYWNoX25vZGViYW5rKGl0ZXIsbWksbm8pCQkJXAotCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBtaS0+bnJfYmFua3M7IGl0ZXIrKykJXAotCQlpZiAobWktPmJhbmtbaXRlcl0ubm9kZSA9PSBubykKLQogLyoKICAqIEZJWE1FOiBXZSByZWFsbHkgd2FudCB0byBhdm9pZCBhbGxvY2F0aW5nIHRoZSBib290bWFwIGJpdG1hcAogICogb3ZlciB0aGUgdG9wIG9mIHRoZSBpbml0cmQuICBIb3BlZnVsbHksIHRoaXMgaXMgbG9jYXRlZCB0b3dhcmRzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9pb3JlbWFwLmMgYi9hcmNoL2FybS9tbS9pb3JlbWFwLmMKaW5kZXggNDY1NDQwNS4uM2JiMzk1MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vaW9yZW1hcC5jCisrKyBiL2FyY2gvYXJtL21tL2lvcmVtYXAuYwpAQCAtMzgsODkgKzM4LDcxIEBACiAgKi8KICNkZWZpbmUgVk1fQVJNX1NFQ1RJT05fTUFQUElORwkweDgwMDAwMDAwCiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVtYXBfYXJlYV9wdGUocHRlX3QgKiBwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLAotCSAgICAgICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgcGdwcm90X3QgcGdwcm90KQorc3RhdGljIGludCByZW1hcF9hcmVhX3B0ZShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKIHsKLQl1bnNpZ25lZCBsb25nIGVuZDsKKwlwdGVfdCAqcHRlOwogCi0JYWRkcmVzcyAmPSB+UE1EX01BU0s7Ci0JZW5kID0gYWRkcmVzcyArIHNpemU7Ci0JaWYgKGVuZCA+IFBNRF9TSVpFKQotCQllbmQgPSBQTURfU0laRTsKLQlCVUdfT04oYWRkcmVzcyA+PSBlbmQpOworCXB0ZSA9IHB0ZV9hbGxvY19rZXJuZWwocG1kLCBhZGRyKTsKKwlpZiAoIXB0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlkbyB7CiAJCWlmICghcHRlX25vbmUoKnB0ZSkpCiAJCQlnb3RvIGJhZDsKIAotCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwaHlzX2FkZHIgPj4gUEFHRV9TSElGVCwgcGdwcm90KSk7Ci0JCWFkZHJlc3MgKz0gUEFHRV9TSVpFOworCQlzZXRfcHRlX2V4dChwdGUsIHBmbl9wdGUocGh5c19hZGRyID4+IFBBR0VfU0hJRlQsIHByb3QpLCAwKTsKIAkJcGh5c19hZGRyICs9IFBBR0VfU0laRTsKLQkJcHRlKys7Ci0JfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOwotCXJldHVybjsKKwl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKKwlyZXR1cm4gMDsKIAogIGJhZDoKLQlwcmludGsoInJlbWFwX2FyZWFfcHRlOiBwYWdlIGFscmVhZHkgZXhpc3RzXG4iKTsKKwlwcmludGsoS0VSTl9DUklUICJyZW1hcF9hcmVhX3B0ZTogcGFnZSBhbHJlYWR5IGV4aXN0c1xuIik7CiAJQlVHKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1yZW1hcF9hcmVhX3BtZChwbWRfdCAqIHBtZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIGlubGluZSBpbnQgcmVtYXBfYXJlYV9wbWQocGdkX3QgKnBnZCwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSB1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJCQkJIHBncHJvdF90IHByb3QpCiB7Ci0JdW5zaWduZWQgbG9uZyBlbmQ7Ci0JcGdwcm90X3QgcGdwcm90OworCXVuc2lnbmVkIGxvbmcgbmV4dDsKKwlwbWRfdCAqcG1kOworCWludCByZXQgPSAwOwogCi0JYWRkcmVzcyAmPSB+UEdESVJfTUFTSzsKLQllbmQgPSBhZGRyZXNzICsgc2l6ZTsKKwlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHBnZCwgYWRkcik7CisJaWYgKCFwbWQpCisJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKGVuZCA+IFBHRElSX1NJWkUpCi0JCWVuZCA9IFBHRElSX1NJWkU7Ci0KLQlwaHlzX2FkZHIgLT0gYWRkcmVzczsKLQlCVUdfT04oYWRkcmVzcyA+PSBlbmQpOwotCi0JcGdwcm90ID0gX19wZ3Byb3QoTF9QVEVfUFJFU0VOVCB8IExfUFRFX1lPVU5HIHwgTF9QVEVfRElSVFkgfCBMX1BURV9XUklURSB8IGZsYWdzKTsKIAlkbyB7Ci0JCXB0ZV90ICogcHRlID0gcHRlX2FsbG9jX2tlcm5lbChwbWQsIGFkZHJlc3MpOwotCQlpZiAoIXB0ZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlyZW1hcF9hcmVhX3B0ZShwdGUsIGFkZHJlc3MsIGVuZCAtIGFkZHJlc3MsIGFkZHJlc3MgKyBwaHlzX2FkZHIsIHBncHJvdCk7Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBNRF9TSVpFKSAmIFBNRF9NQVNLOwotCQlwbWQrKzsKLQl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7Ci0JcmV0dXJuIDA7CisJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJcmV0ID0gcmVtYXBfYXJlYV9wdGUocG1kLCBhZGRyLCBuZXh0LCBwaHlzX2FkZHIsIHByb3QpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcGh5c19hZGRyICs9IG5leHQgLSBhZGRyOworCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQKLXJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBwZm4sCi0JCSB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgaW50IHJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBwZm4sCisJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBzaXplOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgbmV4dCwgZW5kID0gc3RhcnQgKyBzaXplOwogCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gX19wZm5fdG9fcGh5cyhwZm4pOworCXBncHJvdF90IHByb3QgPSBfX3BncHJvdChMX1BURV9QUkVTRU5UIHwgTF9QVEVfWU9VTkcgfAorCQkJCSBMX1BURV9ESVJUWSB8IExfUFRFX1dSSVRFIHwgZmxhZ3MpOworCXBnZF90ICpwZ2Q7CiAJaW50IGVyciA9IDA7Ci0JcGdkX3QgKiBkaXI7CiAKLQlwaHlzX2FkZHIgLT0gYWRkcmVzczsKLQlkaXIgPSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCBhZGRyZXNzKTsKLQlCVUdfT04oYWRkcmVzcyA+PSBlbmQpOworCUJVR19PTihhZGRyID49IGVuZCk7CisJcGdkID0gcGdkX29mZnNldF9rKGFkZHIpOwogCWRvIHsKLQkJcG1kX3QgKnBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgZGlyLCBhZGRyZXNzKTsKLQkJaWYgKCFwbWQpIHsKLQkJCWVyciA9IC1FTk9NRU07CisJCW5leHQgPSBwZ2RfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJZXJyID0gcmVtYXBfYXJlYV9wbWQocGdkLCBhZGRyLCBuZXh0LCBwaHlzX2FkZHIsIHByb3QpOworCQlpZiAoZXJyKQogCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJlbWFwX2FyZWFfcG1kKHBtZCwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywKLQkJCQkJIHBoeXNfYWRkciArIGFkZHJlc3MsIGZsYWdzKSkgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYWRkcmVzcyA9IChhZGRyZXNzICsgUEdESVJfU0laRSkgJiBQR0RJUl9NQVNLOwotCQlkaXIrKzsKLQl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7CisJCXBoeXNfYWRkciArPSBuZXh0IC0gYWRkcjsKKwl9IHdoaWxlIChwZ2QrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbS5oIGIvYXJjaC9hcm0vbW0vbW0uaAppbmRleCBiYjJiYzlhLi5hNDRlMzA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbS5oCisrKyBiL2FyY2gvYXJtL21tL21tLmgKQEAgLTEsNCArMSw3IEBACiAvKiB0aGUgdXBwZXItbW9zdCBwYWdlIHRhYmxlIHBvaW50ZXIgKi8KKworI2lmZGVmIENPTkZJR19NTVUKKwogZXh0ZXJuIHBtZF90ICp0b3BfcG1kOwogCiAjZGVmaW5lIFRPUF9QVEUoeCkJcHRlX29mZnNldF9rZXJuZWwodG9wX3BtZCwgeCkKQEAgLTEzLDYgKzE2LDggQEAKIAlyZXR1cm4gcG1kX29mZihwZ2Rfb2Zmc2V0X2sodmlydCksIHZpcnQpOwogfQogCisjZW5kaWYKKwogc3RydWN0IG1hcF9kZXNjOwogc3RydWN0IG1lbWluZm87CiBzdHJ1Y3QgcGdsaXN0X2RhdGE7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IGY4NjZiZjYuLmYwMjhhZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAlpZiAoYXJjaF9pc19jb2hlcmVudCgpKSB7CiAJCWlmIChjcHVfaXNfeHNjMygpKSB7CiAJCQltZW1fdHlwZXNbTVRfTUVNT1JZXS5wcm90X3NlY3QgfD0gUE1EX1NFQ1RfUzsKLQkJCW1lbV90eXBlc1tNVF9NRU1PUlldLnByb3RfcHRlIHw9IExfUFRFX0NPSEVSRU5UOworCQkJbWVtX3R5cGVzW01UX01FTU9SWV0ucHJvdF9wdGUgfD0gTF9QVEVfU0hBUkVEOwogCQl9CiAJfQogCkBAIC0yOTQsMTIgKzI5NCw2IEBACiAJCW1lbV90eXBlc1tNVF9ERVZJQ0VdLnByb3RfcHRlIHw9IExfUFRFX0JVRkZFUkFCTEU7CiAJCW1lbV90eXBlc1tNVF9ERVZJQ0VdLnByb3Rfc2VjdCB8PSBQTURfU0VDVF9CVUZGRVJFRDsKIAotCQkvKgotCQkgKiBVc2VyIHBhZ2VzIG5lZWQgdG8gYmUgbWFwcGVkIHdpdGggdGhlIEFTSUQKLQkJICogKGlvdywgbm9uLWdsb2JhbCkKLQkJICovCi0JCXVzZXJfcGdwcm90IHw9IExfUFRFX0FTSUQ7Ci0KICNpZmRlZiBDT05GSUdfU01QCiAJCS8qCiAJCSAqIE1hcmsgbWVtb3J5IHdpdGggdGhlICJzaGFyZWQiIGF0dHJpYnV0ZSBmb3IgU01QIHN5c3RlbXMKQEAgLTQwOCw3ICs0MDIsNyBAQAogCX0KIAlwdGVwID0gcHRlX29mZnNldF9rZXJuZWwocG1kcCwgdmlydCk7CiAKLQlzZXRfcHRlKHB0ZXAsIHBmbl9wdGUocGh5cyA+PiBQQUdFX1NISUZULCBwcm90KSk7CisJc2V0X3B0ZV9leHQocHRlcCwgcGZuX3B0ZShwaHlzID4+IFBBR0VfU0hJRlQsIHByb3QpLCAwKTsKIH0KIAogLyoKQEAgLTYxOSw2ICs2MTMsMTMgQEAKIAlpZiAobWFjaGluZV9pc19wNzIwdCgpKQogCQlyZXNfc2l6ZSA9IDB4MDAwMTQwMDA7CiAKKwkvKiBIMTk0MCBhbmQgUlgzNzE1IG5lZWQgdG8gcmVzZXJ2ZSB0aGlzIGZvciBzdXNwZW5kICovCisKKwlpZiAobWFjaGluZV9pc19oMTk0MCgpIHx8IG1hY2hpbmVfaXNfcngzNzE1KCkpIHsKKwkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIDB4MzAwMDMwMDAsIDB4MTAwMCk7CisJCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCAweDMwMDgxMDAwLCAweDEwMDApOworCX0KKwogI2lmZGVmIENPTkZJR19TQTExMTEKIAkvKgogCSAqIEJlY2F1c2Ugb2YgdGhlIFNBMTExMSBETUEgYnVnLCB3ZSB3YW50IHRvIHByZXNlcnZlIG91cgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vbm9tbXUuYyBiL2FyY2gvYXJtL21tL25vbW11LmMKaW5kZXggZDBlNjY0Mi4uMDU4MThmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbm9tbXUuYworKysgYi9hcmNoL2FybS9tbS9ub21tdS5jCkBAIC02LDEwICs2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogI2luY2x1ZGUgIm1tLmgiCiAKQEAgLTc2LDcgKzc4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKIAotdm9pZCBfX2lvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKQordm9pZCBfX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogfQogRVhQT1JUX1NZTUJPTChfX2lvdW5tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcGdkLmMgYi9hcmNoL2FybS9tbS9wZ2QuYwppbmRleCAyMGMxYjBkLi41MGI5YWVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wZ2QuYworKysgYi9hcmNoL2FybS9tbS9wZ2QuYwpAQCAtNTcsNyArNTcsNyBAQAogCiAJCWluaXRfcG1kID0gcG1kX29mZnNldChpbml0X3BnZCwgMCk7CiAJCWluaXRfcHRlID0gcHRlX29mZnNldF9tYXBfbmVzdGVkKGluaXRfcG1kLCAwKTsKLQkJc2V0X3B0ZShuZXdfcHRlLCAqaW5pdF9wdGUpOworCQlzZXRfcHRlX2V4dChuZXdfcHRlLCAqaW5pdF9wdGUsIDApOwogCQlwdGVfdW5tYXBfbmVzdGVkKGluaXRfcHRlKTsKIAkJcHRlX3VubWFwKG5ld19wdGUpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKaW5kZXggMWQ4MzE2Zi4uNzAwYzA0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMKQEAgLTI5LDkgKzI5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKQEAgLTM5Nyw3ICszOTcsNyBAQAogICogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQKICAqLwogCS5hbGlnbgk1Ci1FTlRSWShjcHVfYXJtMTAyMF9zZXRfcHRlKQorRU5UUlkoY3B1X2FybTEwMjBfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQogCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KIApAQCAtNDc3LDcgKzQ3Nyw3IEBACiAJLndvcmQJY3B1X2FybTEwMjBfZG9faWRsZQogCS53b3JkCWNwdV9hcm0xMDIwX2RjYWNoZV9jbGVhbl9hcmVhCiAJLndvcmQJY3B1X2FybTEwMjBfc3dpdGNoX21tCi0JLndvcmQJY3B1X2FybTEwMjBfc2V0X3B0ZQorCS53b3JkCWNwdV9hcm0xMDIwX3NldF9wdGVfZXh0CiAJLnNpemUJYXJtMTAyMF9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyMF9wcm9jZXNzb3JfZnVuY3Rpb25zCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUwppbmRleCA4OWIxZDZkLi4xY2MyMDZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCkBAIC0yOSw5ICsyOSw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCkBAIC0zODEsNyArMzgxLDcgQEAKICAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CiAgKi8KIAkuYWxpZ24JNQotRU5UUlkoY3B1X2FybTEwMjBlX3NldF9wdGUpCitFTlRSWShjcHVfYXJtMTAyMGVfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQogCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KIApAQCAtNDU4LDcgKzQ1OCw3IEBACiAJLndvcmQJY3B1X2FybTEwMjBlX2RvX2lkbGUKIAkud29yZAljcHVfYXJtMTAyMGVfZGNhY2hlX2NsZWFuX2FyZWEKIAkud29yZAljcHVfYXJtMTAyMGVfc3dpdGNoX21tCi0JLndvcmQJY3B1X2FybTEwMjBlX3NldF9wdGUKKwkud29yZAljcHVfYXJtMTAyMGVfc2V0X3B0ZV9leHQKIAkuc2l6ZQlhcm0xMDIwZV9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyMGVfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjIuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TCmluZGV4IGEwODk1MjguLmFmZjBlYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TCkBAIC0xOCw5ICsxOCw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCkBAIC0zNTgsMTIgKzM1OCwxMiBAQAogCW1vdglwYywgbHIKICAgICAgICAgCiAvKgotICogY3B1X2FybTEwMjJfc2V0X3B0ZShwdGVwLCBwdGUpCisgKiBjcHVfYXJtMTAyMl9zZXRfcHRlX2V4dChwdGVwLCBwdGUsIGV4dCkKICAqCiAgKiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dAogICovCiAJLmFsaWduCTUKLUVOVFJZKGNwdV9hcm0xMDIyX3NldF9wdGUpCitFTlRSWShjcHVfYXJtMTAyMl9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCiAJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgogCkBAIC00NDEsNyArNDQxLDcgQEAKIAkud29yZAljcHVfYXJtMTAyMl9kb19pZGxlCiAJLndvcmQJY3B1X2FybTEwMjJfZGNhY2hlX2NsZWFuX2FyZWEKIAkud29yZAljcHVfYXJtMTAyMl9zd2l0Y2hfbW0KLQkud29yZAljcHVfYXJtMTAyMl9zZXRfcHRlCisJLndvcmQJY3B1X2FybTEwMjJfc2V0X3B0ZV9leHQKIAkuc2l6ZQlhcm0xMDIyX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm0xMDIyX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAogCS5zZWN0aW9uICIucm9kYXRhIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwppbmRleCBkNmQ4NGQ5Li42NWU0M2ExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUwpAQCAtMTgsOSArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgpAQCAtMzQ3LDEyICszNDcsMTIgQEAKIAltb3YJcGMsIGxyCiAgICAgICAgIAogLyoKLSAqIGNwdV9hcm0xMDI2X3NldF9wdGUocHRlcCwgcHRlKQorICogY3B1X2FybTEwMjZfc2V0X3B0ZV9leHQocHRlcCwgcHRlLCBleHQpCiAgKgogICogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQKICAqLwogCS5hbGlnbgk1Ci1FTlRSWShjcHVfYXJtMTAyNl9zZXRfcHRlKQorRU5UUlkoY3B1X2FybTEwMjZfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQogCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KIApAQCAtNDM2LDcgKzQzNiw3IEBACiAJLndvcmQJY3B1X2FybTEwMjZfZG9faWRsZQogCS53b3JkCWNwdV9hcm0xMDI2X2RjYWNoZV9jbGVhbl9hcmVhCiAJLndvcmQJY3B1X2FybTEwMjZfc3dpdGNoX21tCi0JLndvcmQJY3B1X2FybTEwMjZfc2V0X3B0ZQorCS53b3JkCWNwdV9hcm0xMDI2X3NldF9wdGVfZXh0CiAJLnNpemUJYXJtMTAyNl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtMTAyNl9wcm9jZXNzb3JfZnVuY3Rpb25zCiAKIAkuc2VjdGlvbiAucm9kYXRhCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm02XzcuUwppbmRleCAwNDMyZTQ4Li4xMjNhN2RjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTZfNy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNl83LlMKQEAgLTE1LDkgKzE1LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiBFTlRSWShjcHVfYXJtNl9kY2FjaGVfY2xlYW5fYXJlYSkKQEAgLTIwOSwxNCArMjA5LDE0IEBACiAJCW1vdglwYywgbHIKIAogLyoKLSAqIEZ1bmN0aW9uOiBhcm02Xzdfc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQorICogRnVuY3Rpb246IGFybTZfN19zZXRfcHRlX2V4dChwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZXh0KQogICogUGFyYW1zICA6IHIwID0gQWRkcmVzcyB0byBzZXQKICAqCSAgIDogcjEgPSB2YWx1ZSB0byBzZXQKICAqIFB1cnBvc2UgOiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dCBvZiBhbnkgV0IgY2FjaGUKICAqLwogCQkuYWxpZ24JNQotRU5UUlkoY3B1X2FybTZfc2V0X3B0ZSkKLUVOVFJZKGNwdV9hcm03X3NldF9wdGUpCitFTlRSWShjcHVfYXJtNl9zZXRfcHRlX2V4dCkKK0VOVFJZKGNwdV9hcm03X3NldF9wdGVfZXh0KQogI2lmZGVmIENPTkZJR19NTVUKIAkJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgogCkBAIC0yOTksNyArMjk5LDcgQEAKIAkJLndvcmQJY3B1X2FybTZfZG9faWRsZQogCQkud29yZAljcHVfYXJtNl9kY2FjaGVfY2xlYW5fYXJlYQogCQkud29yZAljcHVfYXJtNl9zd2l0Y2hfbW0KLQkJLndvcmQJY3B1X2FybTZfc2V0X3B0ZQorCQkud29yZAljcHVfYXJtNl9zZXRfcHRlX2V4dAogCQkuc2l6ZQlhcm02X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm02X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAogLyoKQEAgLTMxNSw3ICszMTUsNyBAQAogCQkud29yZAljcHVfYXJtN19kb19pZGxlCiAJCS53b3JkCWNwdV9hcm03X2RjYWNoZV9jbGVhbl9hcmVhCiAJCS53b3JkCWNwdV9hcm03X3N3aXRjaF9tbQotCQkud29yZAljcHVfYXJtN19zZXRfcHRlCisJCS53b3JkCWNwdV9hcm03X3NldF9wdGVfZXh0CiAJCS5zaXplCWFybTdfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTdfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCiAJCS5zZWN0aW9uICIucm9kYXRhIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKaW5kZXggYzJmMDcwNS4uZGM3NjNiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TCkBAIC0zNiw5ICszNiw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCkBAIC04OCwxMyArODgsMTMgQEAKIAkJbW92CXBjLCBscgogCiAvKgotICogRnVuY3Rpb246IGFybTcyMF9zZXRfcHRlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCisgKiBGdW5jdGlvbjogYXJtNzIwX3NldF9wdGVfZXh0KHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUsIHVuc2lnbmVkIGludCBleHQpCiAgKiBQYXJhbXMgIDogcjAgPSBBZGRyZXNzIHRvIHNldAogICoJICAgOiByMSA9IHZhbHVlIHRvIHNldAogICogUHVycG9zZSA6IFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0IG9mIGFueSBXQiBjYWNoZQogICovCiAJCS5hbGlnbgk1Ci1FTlRSWShjcHVfYXJtNzIwX3NldF9wdGUpCitFTlRSWShjcHVfYXJtNzIwX3NldF9wdGVfZXh0KQogI2lmZGVmIENPTkZJR19NTVUKIAkJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgogCkBAIC0yMDQsNyArMjA0LDcgQEAKIAkJLndvcmQJY3B1X2FybTcyMF9kb19pZGxlCiAJCS53b3JkCWNwdV9hcm03MjBfZGNhY2hlX2NsZWFuX2FyZWEKIAkJLndvcmQJY3B1X2FybTcyMF9zd2l0Y2hfbW0KLQkJLndvcmQJY3B1X2FybTcyMF9zZXRfcHRlCisJCS53b3JkCWNwdV9hcm03MjBfc2V0X3B0ZV9leHQKIAkJLnNpemUJYXJtNzIwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm03MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCiAJCS5zZWN0aW9uICIucm9kYXRhIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzQwLlMKaW5kZXggNDA3MTM4MS4uNzA2OWY0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTc0MC5TCkBAIC0xMiw5ICsxMiw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogCS50ZXh0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMKaW5kZXggMjJkN2UzMS4uZDA5MWMyNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUwpAQCAtMTIsOSArMTIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIAkudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMKaW5kZXggNGFkYjQ2Yi4uNzVjOTQ1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TCkBAIC0yOCw5ICsyOCw5IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgpAQCAtMzQ0LDEyICszNDQsMTIgQEAKIAltb3YJcGMsIGxyCiAKIC8qCi0gKiBjcHVfYXJtOTIwX3NldF9wdGUocHRlcCwgcHRlKQorICogY3B1X2FybTkyMF9zZXRfcHRlKHB0ZXAsIHB0ZSwgZXh0KQogICoKICAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CiAgKi8KIAkuYWxpZ24JNQotRU5UUlkoY3B1X2FybTkyMF9zZXRfcHRlKQorRU5UUlkoY3B1X2FybTkyMF9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCiAJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgogCkBAIC00MjMsNyArNDIzLDcgQEAKIAkud29yZCAgIGNwdV9hcm05MjBfZG9faWRsZQogCS53b3JkCWNwdV9hcm05MjBfZGNhY2hlX2NsZWFuX2FyZWEKIAkud29yZAljcHVfYXJtOTIwX3N3aXRjaF9tbQotCS53b3JkCWNwdV9hcm05MjBfc2V0X3B0ZQorCS53b3JkCWNwdV9hcm05MjBfc2V0X3B0ZV9leHQKIAkuc2l6ZQlhcm05MjBfcHJvY2Vzc29yX2Z1bmN0aW9ucywgLiAtIGFybTkyMF9wcm9jZXNzb3JfZnVuY3Rpb25zCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TCmluZGV4IDU3MWYwODIuLmZmYjc1MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUwpAQCAtMjksOSArMjksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKQEAgLTM0OCwxMiArMzQ4LDEyIEBACiAJbW92CXBjLCBscgogCiAvKgotICogY3B1X2FybTkyMl9zZXRfcHRlKHB0ZXAsIHB0ZSkKKyAqIGNwdV9hcm05MjJfc2V0X3B0ZV9leHQocHRlcCwgcHRlLCBleHQpCiAgKgogICogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQKICAqLwogCS5hbGlnbgk1Ci1FTlRSWShjcHVfYXJtOTIyX3NldF9wdGUpCitFTlRSWShjcHVfYXJtOTIyX3NldF9wdGVfZXh0KQogI2lmZGVmIENPTkZJR19NTVUKIAlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCiAKQEAgLTQyNyw3ICs0MjcsNyBAQAogCS53b3JkICAgY3B1X2FybTkyMl9kb19pZGxlCiAJLndvcmQJY3B1X2FybTkyMl9kY2FjaGVfY2xlYW5fYXJlYQogCS53b3JkCWNwdV9hcm05MjJfc3dpdGNoX21tCi0JLndvcmQJY3B1X2FybTkyMl9zZXRfcHRlCisJLndvcmQJY3B1X2FybTkyMl9zZXRfcHRlX2V4dAogCS5zaXplCWFybTkyMl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gYXJtOTIyX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAogCS5zZWN0aW9uICIucm9kYXRhIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMKaW5kZXggOGQ5YTlmOS4uNDRjMmM5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TCkBAIC01Miw5ICs1Miw5IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgpAQCAtMzkxLDEyICszOTEsMTIgQEAKIAltb3YJcGMsIGxyCiAKIC8qCi0gKiBjcHVfYXJtOTI1X3NldF9wdGUocHRlcCwgcHRlKQorICogY3B1X2FybTkyNV9zZXRfcHRlX2V4dChwdGVwLCBwdGUsIGV4dCkKICAqCiAgKiBTZXQgYSBQVEUgYW5kIGZsdXNoIGl0IG91dAogICovCiAJLmFsaWduCTUKLUVOVFJZKGNwdV9hcm05MjVfc2V0X3B0ZSkKK0VOVFJZKGNwdV9hcm05MjVfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQogCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KIApAQCAtNDkwLDcgKzQ5MCw3IEBACiAJLndvcmQgICBjcHVfYXJtOTI1X2RvX2lkbGUKIAkud29yZAljcHVfYXJtOTI1X2RjYWNoZV9jbGVhbl9hcmVhCiAJLndvcmQJY3B1X2FybTkyNV9zd2l0Y2hfbW0KLQkud29yZAljcHVfYXJtOTI1X3NldF9wdGUKKwkud29yZAljcHVfYXJtOTI1X3NldF9wdGVfZXh0CiAJLnNpemUJYXJtOTI1X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm05MjVfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUwppbmRleCA0NGE3YTY1Li41YjgwYjZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKQEAgLTI4LDkgKzI4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCkBAIC0zNDgsMTIgKzM0OCwxMiBAQAogCW1vdglwYywgbHIKIAogLyoKLSAqIGNwdV9hcm05MjZfc2V0X3B0ZShwdGVwLCBwdGUpCisgKiBjcHVfYXJtOTI2X3NldF9wdGVfZXh0KHB0ZXAsIHB0ZSwgZXh0KQogICoKICAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CiAgKi8KIAkuYWxpZ24JNQotRU5UUlkoY3B1X2FybTkyNl9zZXRfcHRlKQorRU5UUlkoY3B1X2FybTkyNl9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCiAJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgogCkBAIC00MzksNyArNDM5LDcgQEAKIAkud29yZAljcHVfYXJtOTI2X2RvX2lkbGUKIAkud29yZAljcHVfYXJtOTI2X2RjYWNoZV9jbGVhbl9hcmVhCiAJLndvcmQJY3B1X2FybTkyNl9zd2l0Y2hfbW0KLQkud29yZAljcHVfYXJtOTI2X3NldF9wdGUKKwkud29yZAljcHVfYXJtOTI2X3NldF9wdGVfZXh0CiAJLnNpemUJYXJtOTI2X3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBhcm05MjZfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCkBAIC00ODAsNyArNDgwLDcgQEAKIAliCV9fYXJtOTI2X3NldHVwCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9WRlB8SFdDQVBfRURTUHxIV0NBUF9KQVZBCisJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1B8SFdDQVBfSkFWQQogCS5sb25nCWNwdV9hcm05MjZfbmFtZQogCS5sb25nCWFybTkyNl9wcm9jZXNzb3JfZnVuY3Rpb25zCiAJLmxvbmcJdjR3YmlfdGxiX2ZucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQwLlMKaW5kZXggMjM5N2Y0YjYuLjc4NmM1OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUwpAQCAtMTEsOSArMTEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAvKiBBUk05NDBUIGhhcyBhIDRLQiBEQ2FjaGUgY29tcHJpc2luZyAyNTYgbGluZXMgb2YgNCB3b3JkcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQ2LlMKaW5kZXggZTE4NjE3NS4uYTYwYzE0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTk0Ni5TCkBAIC0xMyw5ICsxMyw5IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMKaW5kZXggOTE4ZWJmNi4uNDg0OGVlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUwpAQCAtMTIsOSArMTIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIAkudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TCmluZGV4IGM4NzgwNjQuLjZlMjI2ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS9wcm9jaW5mby5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0xNDYsMTIgKzE0NiwxMiBAQAogI2VuZGlmCiAKIC8qCi0gKiBjcHVfc2ExMTBfc2V0X3B0ZShwdGVwLCBwdGUpCisgKiBjcHVfc2ExMTBfc2V0X3B0ZV9leHQocHRlcCwgcHRlLCBleHQpCiAgKgogICogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQKICAqLwogCS5hbGlnbgk1Ci1FTlRSWShjcHVfc2ExMTBfc2V0X3B0ZSkKK0VOVFJZKGNwdV9zYTExMF9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCiAJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgogCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkud29yZAljcHVfc2ExMTBfZG9faWRsZQogCS53b3JkCWNwdV9zYTExMF9kY2FjaGVfY2xlYW5fYXJlYQogCS53b3JkCWNwdV9zYTExMF9zd2l0Y2hfbW0KLQkud29yZAljcHVfc2ExMTBfc2V0X3B0ZQorCS53b3JkCWNwdV9zYTExMF9zZXRfcHRlX2V4dAogCS5zaXplCXNhMTEwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBzYTExMF9wcm9jZXNzb3JfZnVuY3Rpb25zCiAKIAkuc2VjdGlvbiAiLnJvZGF0YSIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCmluZGV4IGIyM2I2NmEuLjlhZmIxMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLWh3ZGVmLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTE1OSwxMiArMTU5LDEyIEBACiAjZW5kaWYKIAogLyoKLSAqIGNwdV9zYTExMDBfc2V0X3B0ZShwdGVwLCBwdGUpCisgKiBjcHVfc2ExMTAwX3NldF9wdGVfZXh0KHB0ZXAsIHB0ZSwgZXh0KQogICoKICAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CiAgKi8KIAkuYWxpZ24JNQotRU5UUlkoY3B1X3NhMTEwMF9zZXRfcHRlKQorRU5UUlkoY3B1X3NhMTEwMF9zZXRfcHRlX2V4dCkKICNpZmRlZiBDT05GSUdfTU1VCiAJc3RyCXIxLCBbcjBdLCAjLTIwNDgJCUAgbGludXggdmVyc2lvbgogCkBAIC0yMzcsNyArMjM3LDcgQEAKIAkud29yZAljcHVfc2ExMTAwX2RvX2lkbGUKIAkud29yZAljcHVfc2ExMTAwX2RjYWNoZV9jbGVhbl9hcmVhCiAJLndvcmQJY3B1X3NhMTEwMF9zd2l0Y2hfbW0KLQkud29yZAljcHVfc2ExMTAwX3NldF9wdGUKKwkud29yZAljcHVfc2ExMTAwX3NldF9wdGVfZXh0CiAJLnNpemUJc2ExMTAwX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSBzYTExMDBfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXN5bXMuYyBiL2FyY2gvYXJtL21tL3Byb2Mtc3ltcy5jCmluZGV4IGFiMTQzNTUuLjlmMzk2YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc3ltcy5jCisrKyBiL2FyY2gvYXJtL21tL3Byb2Mtc3ltcy5jCkBAIC0xNyw3ICsxNyw3IEBACiAKICNpZm5kZWYgTVVMVElfQ1BVCiBFWFBPUlRfU1lNQk9MKGNwdV9kY2FjaGVfY2xlYW5fYXJlYSk7Ci1FWFBPUlRfU1lNQk9MKGNwdV9zZXRfcHRlKTsKK0VYUE9SVF9TWU1CT0woY3B1X3NldF9wdGVfZXh0KTsKICNlbHNlCiBFWFBPUlRfU1lNQk9MKHByb2Nlc3Nvcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjYuUwppbmRleCA2ZjcyNTQ5Li43YjE4NDNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY2LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCkBAIC0xMyw4ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FybV9zY3UuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKQEAgLTEwMywxMyArMTAzLDE0IEBACiAJbW92CXBjLCBscgogCiAvKgotICoJY3B1X3Y2X3NldF9wdGUocHRlcCwgcHRlKQorICoJY3B1X3Y2X3NldF9wdGVfZXh0KHB0ZXAsIHB0ZSwgZXh0KQogICoKICAqCVNldCBhIGxldmVsIDIgdHJhbnNsYXRpb24gdGFibGUgZW50cnkuCiAgKgogICoJLSBwdGVwICAtIHBvaW50ZXIgdG8gbGV2ZWwgMiB0cmFuc2xhdGlvbiB0YWJsZSBlbnRyeQogICoJCSAgKGhhcmR3YXJlIHZlcnNpb24gaXMgc3RvcmVkIGF0IC0xMDI0IGJ5dGVzKQogICoJLSBwdGUgICAtIFBURSB2YWx1ZSB0byBzdG9yZQorICoJLSBleHQJLSB2YWx1ZSBmb3IgZXh0ZW5kZWQgUFRFIGJpdHMKICAqCiAgKglQZXJtaXNzaW9uczoKICAqCSAgWVVXRCAgQVBYIEFQMSBBUDAJU1ZDCVVzZXIKQEAgLTEyMSwzMyArMTIyLDM0IEBACiAgKgkgIDExeDAgICAwICAgMSAgIDAJci93CXIvbwogICoJICAxMTExICAgMCAgIDEgICAxCXIvdwlyL3cKICAqLwotRU5UUlkoY3B1X3Y2X3NldF9wdGUpCitFTlRSWShjcHVfdjZfc2V0X3B0ZV9leHQpCiAjaWZkZWYgQ09ORklHX01NVQogCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KIAotCWJpYwlyMiwgcjEsICMweDAwMDAwM2YwCi0JYmljCXIyLCByMiwgIzB4MDAwMDAwMDMKLQlvcnIJcjIsIHIyLCAjUFRFX0VYVF9BUDAgfCAyCisJYmljCXIzLCByMSwgIzB4MDAwMDAzZjAKKwliaWMJcjMsIHIzLCAjMHgwMDAwMDAwMworCW9ycglyMywgcjMsIHIyCisJb3JyCXIzLCByMywgI1BURV9FWFRfQVAwIHwgMgogCiAJdHN0CXIxLCAjTF9QVEVfV1JJVEUKIAl0c3RuZQlyMSwgI0xfUFRFX0RJUlRZCi0Jb3JyZXEJcjIsIHIyLCAjUFRFX0VYVF9BUFgKKwlvcnJlcQlyMywgcjMsICNQVEVfRVhUX0FQWAogCiAJdHN0CXIxLCAjTF9QVEVfVVNFUgotCW9ycm5lCXIyLCByMiwgI1BURV9FWFRfQVAxCi0JdHN0bmUJcjIsICNQVEVfRVhUX0FQWAotCWJpY25lCXIyLCByMiwgI1BURV9FWFRfQVBYIHwgUFRFX0VYVF9BUDAKKwlvcnJuZQlyMywgcjMsICNQVEVfRVhUX0FQMQorCXRzdG5lCXIzLCAjUFRFX0VYVF9BUFgKKwliaWNuZQlyMywgcjMsICNQVEVfRVhUX0FQWCB8IFBURV9FWFRfQVAwCiAKIAl0c3QJcjEsICNMX1BURV9ZT1VORwotCWJpY2VxCXIyLCByMiwgI1BURV9FWFRfQVBYIHwgUFRFX0VYVF9BUF9NQVNLCisJYmljZXEJcjMsIHIzLCAjUFRFX0VYVF9BUFggfCBQVEVfRVhUX0FQX01BU0sKIAogCXRzdAlyMSwgI0xfUFRFX0VYRUMKLQlvcnJlcQlyMiwgcjIsICNQVEVfRVhUX1hOCisJb3JyZXEJcjMsIHIzLCAjUFRFX0VYVF9YTgogCiAJdHN0CXIxLCAjTF9QVEVfUFJFU0VOVAotCW1vdmVxCXIyLCAjMAorCW1vdmVxCXIzLCAjMAogCi0Jc3RyCXIyLCBbcjBdCisJc3RyCXIzLCBbcjBdCiAJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDEgQCBmbHVzaF9wdGUKICNlbmRpZgogCW1vdglwYywgbHIKQEAgLTE1Niw3ICsxNTgsNyBAQAogCiAKIGNwdV92Nl9uYW1lOgotCS5hc2NpegkiU29tZSBSYW5kb20gVjYgUHJvY2Vzc29yIgorCS5hc2NpegkiQVJNdjYtY29tcGF0aWJsZSBwcm9jZXNzb3IiCiAJLmFsaWduCiAKIAkuc2VjdGlvbiAiLnRleHQuaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgpAQCAtMjA3LDExICsyMDksNiBAQAogI2VuZGlmCiAJbWNyCXAxNSwgMCwgcjQsIGMyLCBjMCwgMQkJQCBsb2FkIFRUQjEKICNlbmRpZiAvKiBDT05GSUdfTU1VICovCi0jaWZkZWYgQ09ORklHX1ZGUAotCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDIKLQlvcnIJcjAsIHIwLCAjKDB4ZiA8PCAyMCkKLQltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAyCQlAIEVuYWJsZSBmdWxsIGFjY2VzcyB0byBWRlAKLSNlbmRpZgogCWFkcglyNSwgdjZfY3J2YWwKIAlsZG1pYQlyNSwge3I1LCByNn0KIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIHJlYWQgY29udHJvbCByZWdpc3RlcgpAQCAtMjM4LDcgKzIzNSw3IEBACiAJLndvcmQJY3B1X3Y2X2RvX2lkbGUKIAkud29yZAljcHVfdjZfZGNhY2hlX2NsZWFuX2FyZWEKIAkud29yZAljcHVfdjZfc3dpdGNoX21tCi0JLndvcmQJY3B1X3Y2X3NldF9wdGUKKwkud29yZAljcHVfdjZfc2V0X3B0ZV9leHQKIAkuc2l6ZQl2Nl9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0gdjZfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCiAJLnR5cGUJY3B1X2FyY2hfbmFtZSwgI29iamVjdApAQCAtMjczLDcgKzI3MCw3IEBACiAJYglfX3Y2X3NldHVwCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9WRlB8SFdDQVBfRURTUHxIV0NBUF9KQVZBCisJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1B8SFdDQVBfSkFWQQogCS5sb25nCWNwdV92Nl9uYW1lCiAJLmxvbmcJdjZfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCS5sb25nCXY2d2JpX3RsYl9mbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TIGIvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKaW5kZXggNGFjZTJkOC4uNDM0OTRhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy14c2MzLlMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgpAQCAtNTcsMTEgKzU3LDYgQEAKICNkZWZpbmUgTDJfQ0FDSEVfRU5BQkxFCTEKIAogLyoKLSAqIEVuYWJsZSB0aGUgQnJhbmNoIFRhcmdldCBCdWZmZXIgKGNhbiBjYXVzZSBjcmFzaGVzLCBzZWUgZXJyYXR1bSAjNDIuKQotICovCi0jZGVmaW5lIEJUQl9FTkFCTEUJMAotCi0vKgogICogVGhpcyBtYWNybyBpcyB1c2VkIHRvIHdhaXQgZm9yIGEgQ1AxNSB3cml0ZSBhbmQgaXMgbmVlZGVkCiAgKiB3aGVuIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGxhc3Qgb3BlcmF0aW9uIHRvIHRoZSBjby1wcm8KICAqIHdhcyBjb21wbGV0ZWQgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCBvcGVyYXRpb24uCkBAIC0zNjIsMTcgKzM1NywxOSBAQAogCWNwd2FpdF9yZXQgbHIsIGlwCiAKIC8qCi0gKiBjcHVfeHNjM19zZXRfcHRlKHB0ZXAsIHB0ZSkKKyAqIGNwdV94c2MzX3NldF9wdGVfZXh0KHB0ZXAsIHB0ZSwgZXh0KQogICoKICAqIFNldCBhIFBURSBhbmQgZmx1c2ggaXQgb3V0CiAgKgogICovCiAJLmFsaWduCTUKLUVOVFJZKGNwdV94c2MzX3NldF9wdGUpCitFTlRSWShjcHVfeHNjM19zZXRfcHRlX2V4dCkKIAlzdHIJcjEsIFtyMF0sICMtMjA0OAkJQCBsaW51eCB2ZXJzaW9uCiAKLQliaWMJcjIsIHIxLCAjMHhkZjAJCQlAIEtlZXAgQywgQiwgY29oZXJlbmN5IGJpdHMKKwliaWMJcjIsIHIxLCAjMHhmZjAJCQlAIEtlZXAgQywgQiBiaXRzCiAJb3JyCXIyLCByMiwgI1BURV9UWVBFX0VYVAkJQCBleHRlbmRlZCBwYWdlCisJdHN0CXIxLCAjTF9QVEVfU0hBUkVECQlAIFNoYXJlZD8KKwlvcnJuZQlyMiwgcjIsICMweDIwMAogCiAJZW9yCXIzLCByMSwgI0xfUFRFX1BSRVNFTlQgfCBMX1BURV9ZT1VORyB8IExfUFRFX1dSSVRFIHwgTF9QVEVfRElSVFkKIApAQCAtNDMyLDkgKzQyOSw3IEBACiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBnZXQgY29udHJvbCByZWdpc3RlcgogCWJpYwlyMCwgcjAsIHI1CQkJQCAuLi4uIC4uLi4gLi4uLiAuLkEuCiAJb3JyCXIwLCByMCwgcjYJCQlAIC4uLi4gLi4uLiAuLi4uIC5DLk0KLSNpZiBCVEJfRU5BQkxFCiAJb3JyCXIwLCByMCwgIzB4MDAwMDA4MDAJCUAgLi5WSSBaLi5TIC4uLi4gLi4uLgotI2VuZGlmCiAjaWYgTDJfQ0FDSEVfRU5BQkxFCiAJb3JyIAlyMCwgcjAsICMweDA0MDAwMDAwCQlAIEwyIGVuYWJsZQogI2VuZGlmCkBAIC00NjIsNyArNDU3LDcgQEAKIAkud29yZAljcHVfeHNjM19kb19pZGxlCiAJLndvcmQJY3B1X3hzYzNfZGNhY2hlX2NsZWFuX2FyZWEKIAkud29yZAljcHVfeHNjM19zd2l0Y2hfbW0KLQkud29yZAljcHVfeHNjM19zZXRfcHRlCisJLndvcmQJY3B1X3hzYzNfc2V0X3B0ZV9leHQKIAkuc2l6ZQl4c2MzX3Byb2Nlc3Nvcl9mdW5jdGlvbnMsIC4gLSB4c2MzX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAogCS5zZWN0aW9uICIucm9kYXRhIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUyBiL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKaW5kZXggZThiMzc3ZC4uNDkwZTExYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNDIxLDE0ICs0MjEsMTQgQEAKIAljcHdhaXRfcmV0IGxyLCBpcAogCiAvKgotICogY3B1X3hzY2FsZV9zZXRfcHRlKHB0ZXAsIHB0ZSkKKyAqIGNwdV94c2NhbGVfc2V0X3B0ZV9leHQocHRlcCwgcHRlLCBleHQpCiAgKgogICogU2V0IGEgUFRFIGFuZCBmbHVzaCBpdCBvdXQKICAqCiAgKiBFcnJhdGEgNDA6IG11c3Qgc2V0IG1lbW9yeSB0byB3cml0ZS10aHJvdWdoIGZvciB1c2VyIHJlYWQtb25seSBwYWdlcy4KICAqLwogCS5hbGlnbgk1Ci1FTlRSWShjcHVfeHNjYWxlX3NldF9wdGUpCitFTlRSWShjcHVfeHNjYWxlX3NldF9wdGVfZXh0KQogCXN0cglyMSwgW3IwXSwgIy0yMDQ4CQlAIGxpbnV4IHZlcnNpb24KIAogCWJpYwlyMiwgcjEsICMweGZmMApAQCAtNDkxLDEyICs0OTEsNyBAQAogCW1jcglwMTUsIDAsIGlwLCBjNywgYzcsIDAJCUAgaW52YWxpZGF0ZSBJLCBEIGNhY2hlcyAmIEJUQgogCW1jcglwMTUsIDAsIGlwLCBjNywgYzEwLCA0CQlAIERyYWluIFdyaXRlICgmIEZpbGwpIEJ1ZmZlcgogCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgaW52YWxpZGF0ZSBJLCBEIFRMQnMKLSNpZmRlZiBDT05GSUdfSVdNTVhUCi0JbW92CXIwLCAjMAkJCQlAIGluaXRpYWxseSBkaXNhbGxvdyBhY2Nlc3MgdG8gQ1AwL0NQMQotI2Vsc2UKLQltb3YJcjAsICMxCQkJCUAgQWxsb3cgYWNjZXNzIHRvIENQMAotI2VuZGlmCi0Jb3JyICAgICByMCwgcjAsICMxIDw8IDYJCQlAIGNwNiBmb3IgSU9QM3h4IGFuZCBCdWx2ZXJkZQorCW1vdglyMCwgIzEgPDwgNgkJCUAgY3A2IGZvciBJT1AzeHggYW5kIEJ1bHZlcmRlCiAJb3JyCXIwLCByMCwgIzEgPDwgMTMJCUAgSXRzIHVuZGVmaW5lZCB3aGV0aGVyIHRoaXMKIAltY3IJcDE1LCAwLCByMCwgYzE1LCBjMSwgMAkJQCBhZmZlY3RzIFVTUiBvciBTVkMgbW9kZXMKIApAQCAtNTM0LDcgKzUyOSw3IEBACiAJLndvcmQJY3B1X3hzY2FsZV9kb19pZGxlCiAJLndvcmQJY3B1X3hzY2FsZV9kY2FjaGVfY2xlYW5fYXJlYQogCS53b3JkCWNwdV94c2NhbGVfc3dpdGNoX21tCi0JLndvcmQJY3B1X3hzY2FsZV9zZXRfcHRlCisJLndvcmQJY3B1X3hzY2FsZV9zZXRfcHRlX2V4dAogCS5zaXplCXhzY2FsZV9wcm9jZXNzb3JfZnVuY3Rpb25zLCAuIC0geHNjYWxlX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAogCS5zZWN0aW9uICIucm9kYXRhIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfY291bnRlci5oIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfY291bnRlci5oCmluZGV4IDhjNTM1MWQuLmNhOTQyYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL29wcm9maWxlL29wX2NvdW50ZXIuaAorKysgYi9hcmNoL2FybS9vcHJvZmlsZS9vcF9jb3VudGVyLmgKQEAgLTEwLDggKzEwLDYgQEAKICNpZm5kZWYgT1BfQ09VTlRFUl9ICiAjZGVmaW5lIE9QX0NPVU5URVJfSAogCi0jZGVmaW5lIE9QX01BWF9DT1VOVEVSIDUKLQogLyogUGVyIHBlcmZvcm1hbmNlIG1vbml0b3IgY29uZmlndXJhdGlvbiBhcyBzZXQgdmlhCiAgKiBvcHJvZmlsZWZzLgogICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9vcHJvZmlsZS9vcF9tb2RlbF94c2NhbGUuYyBiL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3hzY2FsZS5jCmluZGV4IDc4OTlkM2MuLjdjMzI4OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3hzY2FsZS5jCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL29wX21vZGVsX3hzY2FsZS5jCkBAIC0yMCw3ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKwogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogI2luY2x1ZGUgIm9wX2NvdW50ZXIuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKaW5kZXggZWM3NTJlMS4uZjJkYzM2MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKQEAgLTExMyw3ICsxMTMsNyBAQAogCiBjb25maWcgT01BUF9TRVJJQUxfV0FLRQogCWJvb2wgIkVuYWJsZSB3YWtlLXVwIGV2ZW50cyBmb3Igc2VyaWFsIHBvcnRzIgotCWRlcGVuZHMgT01BUF9NVVgKKwlkZXBlbmRzIG9uIE9NQVBfTVVYCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGhhdmUgeW91ciBzeXN0ZW0gd2FrZSB1cApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKaW5kZXggODE2MmVlZC4uNGYyZmQ1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCkBAIC00MTAsNyArNDEwLDcgQEAKIAkJdHJpZ2dlciAmIF9fSVJRVF9SSVNFREdFKTsKIAlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0ZBTExJTkdERVRFQ1QsIGdwaW9fYml0LAogCQl0cmlnZ2VyICYgX19JUlFUX0ZBTEVER0UpOwotCS8qIEZJWE1FOiBQb3NzaWJseSBkbyAnc2V0X2lycV9oYW5kbGVyKGosIGRvX2xldmVsX0lSUSknIGlmIG9ubHkgbGV2ZWwKKwkvKiBGSVhNRTogUG9zc2libHkgZG8gJ3NldF9pcnFfaGFuZGxlcihqLCBoYW5kbGVfbGV2ZWxfaXJxKScgaWYgb25seSBsZXZlbAogCSAqIHRyaWdnZXJpbmcgcmVxdWVzdGVkLiAqLwogfQogCkBAIC03ODMsNyArNzgzLDcgQEAKICAqIGxpbmUncyBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgYmVlbiBydW4sIHdlIG1heSBtaXNzIHNvbWUgbmVzdGVkCiAgKiBpbnRlcnJ1cHRzLgogICovCi1zdGF0aWMgdm9pZCBncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFkZXNjICpkZXNjKQorc3RhdGljIHZvaWQgZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdm9pZCBfX2lvbWVtICppc3JfcmVnID0gTlVMTDsKIAl1MzIgaXNyOwpAQCAtODUzLDcgKzg1Myw3IEBACiAKIAkJZ3Bpb19pcnEgPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKIAkJZm9yICg7IGlzciAhPSAwOyBpc3IgPj49IDEsIGdwaW9faXJxKyspIHsKLQkJCXN0cnVjdCBpcnFkZXNjICpkOworCQkJc3RydWN0IGlycV9kZXNjICpkOwogCQkJaW50IGlycV9tYXNrOwogCQkJaWYgKCEoaXNyICYgMSkpCiAJCQkJY29udGludWU7CkBAIC0xMDkyLDcgKzEwOTIsNyBAQAogCQkJCXNldF9pcnFfY2hpcChqLCAmbXB1aW9faXJxX2NoaXApOwogCQkJZWxzZQogCQkJCXNldF9pcnFfY2hpcChqLCAmZ3Bpb19pcnFfY2hpcCk7Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaiwgZG9fc2ltcGxlX0lSUSk7CisJCQlzZXRfaXJxX2hhbmRsZXIoaiwgaGFuZGxlX3NpbXBsZV9pcnEpOwogCQkJc2V0X2lycV9mbGFncyhqLCBJUlFGX1ZBTElEKTsKIAkJfQogCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihiYW5rLT5pcnEsIGdwaW9faXJxX2hhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKaW5kZXggYjAyYWYxZC4uOGJjYjgzOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCkBAIC00LDcgKzQsNyBAQAogIwogIyBVcCB0byBkYXRlIHZlcnNpb25zIG9mIHRoaXMgZmlsZSBjYW4gYmUgb2J0YWluZWQgZnJvbToKICMKLSMgICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZGV2ZWxvcGVyL21hY2hpbmVzLz9hY3Rpb249ZG93bmxvYWQKKyMgICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZGV2ZWxvcGVyL21hY2hpbmVzL2Rvd25sb2FkLnBocAogIwogIyBQbGVhc2UgZG8gbm90IHNlbmQgcGF0Y2hlcyB0byB0aGlzIGZpbGU7IGl0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIQogIyBUbyBhZGQgYW4gZW50cnkgaW50byB0aGlzIGRhdGFiYXNlLCBwbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vYXJtL1JFQURNRSwKQEAgLTEyLDcgKzEyLDcgQEAKICMKICMgICBodHRwOi8vd3d3LmFybS5saW51eC5vcmcudWsvZGV2ZWxvcGVyL21hY2hpbmVzLz9hY3Rpb249bmV3CiAjCi0jIExhc3QgdXBkYXRlOiBTYXQgU2VwIDIzIDEzOjIwOjQzIDIwMDYKKyMgTGFzdCB1cGRhdGU6IFRodSBEZWMgNyAxNzoxOToyMCAyMDA2CiAjCiAjIG1hY2hpbmVfaXNfeHh4CUNPTkZJR194eHh4CQlNQUNIX1RZUEVfeHh4CQludW1iZXIKICMKQEAgLTc5LDcgKzc5LDcgQEAKIGFsbgkJCVNBMTEwMF9BTE4JCUFMTgkJCTYxCiBlcHhhCQkJQVJDSF9DQU1FTE9UCQlDQU1FTE9UCQkJNjIKIGdkczIyMDAJCQlTQTExMDBfR0RTMjIwMAkJR0RTMjIwMAkJCTYzCi1wc2lvbl9zZXJpZXM3CQlTQTExMDBfUFNJT05fU0VSSUVTNwlQU0lPTl9TRVJJRVM3CQk2NAorbmV0Ym9vawkJCVNBMTEwMF9QU0lPTl9TRVJJRVM3CVBTSU9OX1NFUklFUzcJCTY0CiB4ZmlsZQkJCVNBMTEwMF9YRklMRQkJWEZJTEUJCQk2NQogYWNjZWxlbnRfZXA5MzEyCQlBUkNIX0FDQ0VMRU5UX0VQOTMxMglBQ0NFTEVOVF9FUDkzMTIJCTY2CiBpYzIwMAkJCUFSQ0hfSUMyMDAJCUlDMjAwCQkJNjcKQEAgLTgxMCw5ICs4MTAsOSBAQAogcm05MjAwCQkJTUFDSF9STTkyMDAJCVJNOTIwMAkJCTc5NgogZG1hMDMJCQlNQUNIX0RNQTAzCQlETUEwMwkJCTc5Nwogcm9hZF9zMTAxCQlNQUNIX1JPQURfUzEwMQkJUk9BRF9TMTAxCQk3OTgKLWlxX25leHRnZW5fYQkJTUFDSF9JUV9ORVhUR0VOX0EJSVFfTkVYVEdFTl9BCQk3OTkKK2lxODEzNDBzYwkJTUFDSF9JUTgxMzQwU0MJCUlRODEzNDBTQwkJNzk5CiBpcV9uZXh0Z2VuX2IJCU1BQ0hfSVFfTkVYVEdFTl9CCUlRX05FWFRHRU5fQgkJODAwCi1pcV9uZXh0Z2VuX2MJCU1BQ0hfSVFfTkVYVEdFTl9DCUlRX05FWFRHRU5fQwkJODAxCitpcTgxMzQwbWMJCU1BQ0hfSVE4MTM0ME1DCQlJUTgxMzQwTUMJCTgwMQogaXFfbmV4dGdlbl9kCQlNQUNIX0lRX05FWFRHRU5fRAlJUV9ORVhUR0VOX0QJCTgwMgogaXFfbmV4dGdlbl9lCQlNQUNIX0lRX05FWFRHRU5fRQlJUV9ORVhUR0VOX0UJCTgwMwogbWFsbG93X2F0OTEJCU1BQ0hfTUFMTE9XX0FUOTEJTUFMTE9XX0FUOTEJCTgwNApAQCAtMTE1NywzICsxMTU3LDY1IEBACiBvdGk0MTEwCQkJTUFDSF9PVEk0MTEwCQlPVEk0MTEwCQkJMTE0NAogaG1lX3B4YQkJCU1BQ0hfSE1FX1BYQQkJSE1FX1BYQQkJCTExNDUKIGRlaXN0ZXJkY2EJCU1BQ0hfREVJU1RFUkRDQQkJREVJU1RFUkRDQQkJMTE0NgorY2VzX3NzZW0yCQlNQUNIX0NFU19TU0VNMgkJQ0VTX1NTRU0yCQkxMTQ3CitjZXNfbXRyCQkJTUFDSF9DRVNfTVRSCQlDRVNfTVRSCQkJMTE0OAordGRzX2F2bmdfc2JjCQlNQUNIX1REU19BVk5HX1NCQwlURFNfQVZOR19TQkMJCTExNDkKK2V2ZXJlc3QJCQlNQUNIX0VWRVJFU1QJCUVWRVJFU1QJCQkxMTUwCitwbng0MDEwCQkJTUFDSF9QTlg0MDEwCQlQTlg0MDEwCQkJMTE1MQorb3huYXMJCQlNQUNIX09YTkFTCQlPWE5BUwkJCTExNTIKK2Zpb3JpCQkJTUFDSF9GSU9SSQkJRklPUkkJCQkxMTUzCittbDEyMDAJCQlNQUNIX01MMTIwMAkJTUwxMjAwCQkJMTE1NAorcGVjb3MJCQlNQUNIX1BFQ09TCQlQRUNPUwkJCTExNTUKK25iMnh4eAkJCU1BQ0hfTkIyWFhYCQlOQjJYWFgJCQkxMTU2CitodzY5MDAJCQlNQUNIX0hXNjkwMAkJSFc2OTAwCQkJMTE1NworY2Rjc19xdW9sbAkJTUFDSF9DRENTX1FVT0xMCQlDRENTX1FVT0xMCQkxMTU4CitxdWlja3NpbHZlcgkJTUFDSF9RVUlDS1NJTFZFUglRVUlDS1NJTFZFUgkJMTE1OQordXBsYXQ5MjYJCU1BQ0hfVVBMQVQ5MjYJCVVQTEFUOTI2CQkxMTYwCitkZXAyNDEwX2RlcDI0MTAJCU1BQ0hfREVQMjQxMF9USE9NQVMJREVQMjQxMF9USE9NQVMJCTExNjEKK2R0azI0MTAJCQlNQUNIX0RUSzI0MTAJCURUSzI0MTAJCQkxMTYyCitjaGlsaQkJCU1BQ0hfQ0hJTEkJCUNISUxJCQkJMTE2MworZGVtZXRlcgkJCU1BQ0hfREVNRVRFUgkJREVNRVRFUgkJCTExNjQKK2Rpb255c3VzCQlNQUNIX0RJT05ZU1VTCQlESU9OWVNVUwkJMTE2NQorYXMzNTJ4CQkJTUFDSF9BUzM1MlgJCUFTMzUyWAkJCTExNjYKK3NlcnZpY2UJCQlNQUNIX1NFUlZJQ0UJCVNFUlZJQ0UJCQkxMTY3Citjc19lOTMwMQkJTUFDSF9DU19FOTMwMQkJQ1NfRTkzMDEJCTExNjgKK21pY3JvOW0JCQlNQUNIX01JQ1JPOU0JCU1JQ1JPOU0JCQkxMTY5CitpYV9tb3NwY2sJCU1BQ0hfSUFfTU9TUENLCQlJQV9NT1NQQ0sJCTExNzAKK3FsMjAxYgkJCU1BQ0hfUUwyMDFCCQlRTDIwMUIJCQkxMTcxCitiYm0JCQlNQUNIX0JCTQkJQkJNCQkJMTE3NAorZXh4eAkJCU1BQ0hfRVhYWAkJRVhYWAkJCTExNzUKK3dtYTExYgkJCU1BQ0hfV01BMTFCCQlXTUExMUIJCQkxMTc2CitwZWxjb19hdGxhcwkJTUFDSF9QRUxDT19BVExBUwlQRUxDT19BVExBUwkJMTE3NworZzUwMAkJCU1BQ0hfRzUwMAkJRzUwMAkJCTExNzgKK2J1ZwkJCU1BQ0hfQlVHCQlCVUcJCQkxMTc5CitteDMzYWRzCQkJTUFDSF9NWDMzQURTCQlNWDMzQURTCQkJMTE4MAorY2h1YgkJCU1BQ0hfQ0hVQgkJQ0hVQgkJCTExODEKK2d0YTAxCQkJTUFDSF9HVEEwMQkJR1RBMDEJCQkxMTgyCit3OTBuNzQwCQkJTUFDSF9XOTBONzQwCQlXOTBONzQwCQkJMTE4MworbWVkYWxsaW9uX3NhMjQxMAlNQUNIX01FREFMTElPTl9TQTI0MTAJTUVEQUxMSU9OX1NBMjQxMAkxMTg0CitpYV9jcHVfOTIwMF8yCQlNQUNIX0lBX0NQVV85MjAwXzIJSUFfQ1BVXzkyMDBfMgkJMTE4NQorZGltbXJtOTIwMAkJTUFDSF9ESU1NUk05MjAwCQlESU1NUk05MjAwCQkxMTg2CitwbTkyNjEJCQlNQUNIX1BNOTI2MQkJUE05MjYxCQkJMTE4NworbXgyMQkJCU1BQ0hfTVgyMQkJTVgyMQkJCTExODgKK21sNzMwNAkJCU1BQ0hfTUw3MzA0CQlNTDczMDQJCQkxMTg5Cit1Y3AyNTAJCQlNQUNIX1VDUDI1MAkJVUNQMjUwCQkJMTE5MAoraW50Ym9hcmQJCU1BQ0hfSU5UQk9BUkQJCUlOVEJPQVJECQkxMTkxCitndWxmc3RyZWFtCQlNQUNIX0dVTEZTVFJFQU0JCUdVTEZTVFJFQU0JCTExOTIKK2xhYnF1ZXN0CQlNQUNIX0xBQlFVRVNUCQlMQUJRVUVTVAkJMTE5MwordmNteDMxMwkJCU1BQ0hfVkNNWDMxMwkJVkNNWDMxMwkJCTExOTQKK3VyZzIwMAkJCU1BQ0hfVVJHMjAwCQlVUkcyMDAJCQkxMTk1CitjcHV4MjU1bGNkbmV0CQlNQUNIX0NQVVgyNTVMQ0RORVQJQ1BVWDI1NUxDRE5FVAkJMTE5NgorbmV0ZGN1OQkJCU1BQ0hfTkVURENVOQkJTkVURENVOQkJCTExOTcKK25ldGRjdTEwCQlNQUNIX05FVERDVTEwCQlORVREQ1UxMAkJMTE5OAorZHNwZ19kZ2EJCU1BQ0hfRFNQR19ER0EJCURTUEdfREdBCQkxMTk5Citkc3BnX2R2dwkJTUFDSF9EU1BHX0RWVwkJRFNQR19EVlcJCTEyMDAKK3NvbG9zCQkJTUFDSF9TT0xPUwkJU09MT1MJCQkxMjAxCithdDkxc2FtOTI2M2VrCQlNQUNIX0FUOTFTQU05MjYzRUsJQVQ5MVNBTTkyNjNFSwkJMTIwMgorb3NzdGJveAkJCU1BQ0hfT1NTVEJPWAkJT1NTVEJPWAkJCTEyMDMKK2tiYXQ5MjYxCQlNQUNIX0tCQVQ5MjYxCQlLQkFUOTI2MQkJMTIwNAorY3QxMTAwCQkJTUFDSF9DVDExMDAJCUNUMTEwMAkJCTEyMDUKK2FrY3BweGEJCQlNQUNIX0FLQ1BQWEEJCUFLQ1BQWEEJCQkxMjA2Cit6ZXZpb18xMDIwCQlNQUNIX1pFVklPXzEwMjAJCVpFVklPXzEwMjAJCTEyMDcKK2hpdHJhY2sJCQlNQUNIX0hJVFJBQ0sJCUhJVFJBQ0sJCQkxMjA4CitzeW1lMQkJCU1BQ0hfU1lNRTEJCVNZTUUxCQkJMTIwOQorc3lobDEJCQlNQUNIX1NZSEwxCQlTWUhMMQkJCTEyMTAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYwppbmRleCA0ZmMwNWVlLi5lNDRiOWVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwZG91YmxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcGRvdWJsZS5jCkBAIC01Niw3ICs1Niw3IEBACiB7CiAJaW50IGJpdHMgPSAzMSAtIGZscyh2ZC0+c2lnbmlmaWNhbmQgPj4gMzIpOwogCWlmIChiaXRzID09IDMxKQotCQliaXRzID0gNjIgLSBmbHModmQtPnNpZ25pZmljYW5kKTsKKwkJYml0cyA9IDYzIC0gZmxzKHZkLT5zaWduaWZpY2FuZCk7CiAKIAl2ZnBfZG91YmxlX2R1bXAoIm5vcm1hbGlzZV9kZW5vcm1hbDogaW4iLCB2ZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwppbmRleCBhNjU3YTI4Li5lMjZjYzFmIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCkBAIC0xNDgsNiArMTQ4LDcgQEAKIAkvKgogCSAqIFRoZXNlIGFyZSBhcnJhbmdlZCBpbiBwcmlvcml0eSBvcmRlciwgbGVhc3QgdG8gaGlnaGVzdC4KIAkgKi8KKwlSQUlTRShGUFNDUl9EWkMsIEZQU0NSX0RaRSwgRlBFX0ZMVERJVik7CiAJUkFJU0UoRlBTQ1JfSVhDLCBGUFNDUl9JWEUsIEZQRV9GTFRSRVMpOwogCVJBSVNFKEZQU0NSX1VGQywgRlBTQ1JfVUZFLCBGUEVfRkxUVU5EKTsKIAlSQUlTRShGUFNDUl9PRkMsIEZQU0NSX09GRSwgRlBFX0ZMVE9WRik7CkBAIC0yNjIsMTMgKzI2MywyNCBAQAogCWlmIChleGNlcHRpb25zKQogCQl2ZnBfcmFpc2VfZXhjZXB0aW9ucyhleGNlcHRpb25zLCB0cmlnZ2VyLCBvcmlnX2Zwc2NyLCByZWdzKTsKIH0KLSAKKwogLyoKICAqIFZGUCBzdXBwb3J0IGNvZGUgaW5pdGlhbGlzYXRpb24uCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHZmcF9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHZmcHNpZDsKKwl1bnNpZ25lZCBpbnQgY3B1X2FyY2ggPSBjcHVfYXJjaGl0ZWN0dXJlKCk7CisJdTMyIGFjY2VzcyA9IDA7CisKKwlpZiAoY3B1X2FyY2ggPj0gQ1BVX0FSQ0hfQVJNdjYpIHsKKwkJYWNjZXNzID0gZ2V0X2NvcHJvX2FjY2VzcygpOworCisJCS8qCisJCSAqIEVuYWJsZSBmdWxsIGFjY2VzcyB0byBWRlAgKGNwMTAgYW5kIGNwMTEpCisJCSAqLworCQlzZXRfY29wcm9fYWNjZXNzKGFjY2VzcyB8IENQQUNDX0ZVTEwoMTApIHwgQ1BBQ0NfRlVMTCgxMSkpOworCX0KIAogCS8qCiAJICogRmlyc3QgY2hlY2sgdGhhdCB0aGVyZSBpcyBhIFZGUCB0aGF0IHdlIGNhbiB1c2UuCkBAIC0yODAsNiArMjkyLDEyIEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiVkZQIHN1cHBvcnQgdjAuMzogIik7CiAJaWYgKFZGUF9hcmNoKSB7CiAJCXByaW50aygibm90IHByZXNlbnRcbiIpOworCisJCS8qCisJCSAqIFJlc3RvcmUgdGhlIGNvcHJvIGFjY2VzcyByZWdpc3Rlci4KKwkJICovCisJCWlmIChjcHVfYXJjaCA+PSBDUFVfQVJDSF9BUk12NikKKwkJCXNldF9jb3Byb19hY2Nlc3MoYWNjZXNzKTsKIAl9IGVsc2UgaWYgKHZmcHNpZCAmIEZQU0lEX05PRE9VQkxFKSB7CiAJCXByaW50aygibm8gZG91YmxlIHByZWNpc2lvbiBzdXBwb3J0XG4iKTsKIAl9IGVsc2UgewpAQCAtMjkwLDkgKzMwOCwxNiBAQAogCQkJKHZmcHNpZCAmIEZQU0lEX1BBUlRfTUFTSykgPj4gRlBTSURfUEFSVF9CSVQsCiAJCQkodmZwc2lkICYgRlBTSURfVkFSSUFOVF9NQVNLKSA+PiBGUFNJRF9WQVJJQU5UX0JJVCwKIAkJCSh2ZnBzaWQgJiBGUFNJRF9SRVZfTUFTSykgPj4gRlBTSURfUkVWX0JJVCk7CisKIAkJdmZwX3ZlY3RvciA9IHZmcF9zdXBwb3J0X2VudHJ5OwogCiAJCXRocmVhZF9yZWdpc3Rlcl9ub3RpZmllcigmdmZwX25vdGlmaWVyX2Jsb2NrKTsKKworCQkvKgorCQkgKiBXZSBkZXRlY3RlZCBWRlAsIGFuZCB0aGUgc3VwcG9ydCBjb2RlIGlzCisJCSAqIGluIHBsYWNlOyByZXBvcnQgVkZQIHN1cHBvcnQgdG8gdXNlcnNwYWNlLgorCQkgKi8KKwkJZWxmX2h3Y2FwIHw9IEhXQ0FQX1ZGUDsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L0tjb25maWcgYi9hcmNoL2FybTI2L0tjb25maWcKaW5kZXggYzE0ZmU5MS4uNzRlYmE4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9LY29uZmlnCisrKyBiL2FyY2gvYXJtMjYvS2NvbmZpZwpAQCAtNDEsNiArNDEsMTQgQEAKIGNvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQogCWJvb2wKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogY29uZmlnIEdFTkVSSUNfSFdFSUdIVAogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL2VjYXJkLmMgYi9hcmNoL2FybTI2L2tlcm5lbC9lY2FyZC5jCmluZGV4IDA0N2QwYTQuLjlkYmMxNzI0IDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC9lY2FyZC5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL2VjYXJkLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCQl9CiAJCWlmIChjX2lkKCZleGNkKSA9PSAweDgwKSB7IC8qIGxvYWRlciAqLwogCQkJaWYgKCFlYy0+bG9hZGVyKSB7Ci0JCQkJZWMtPmxvYWRlciA9IChsb2FkZXJfdClrbWFsbG9jKGNfbGVuKCZleGNkKSwKKwkJCQllYy0+bG9hZGVyID0ga21hbGxvYyhjX2xlbigmZXhjZCksCiAJCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwogCQkJCWlmIChlYy0+bG9hZGVyKQogCQkJCQllY2FyZF9yZWFkYnl0ZXMoZWMtPmxvYWRlciwgZWMsCkBAIC02MjAsMTIgKzYyMCwxMCBAQAogCXN0cnVjdCBleF9lY2lkIGNpZDsKIAlpbnQgaSwgcmMgPSAtRU5PTUVNOwogCi0JZWMgPSBrbWFsbG9jKHNpemVvZihlY2FyZF90KSwgR0ZQX0tFUk5FTCk7CisJZWMgPSBremFsbG9jKHNpemVvZihlY2FyZF90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlYykKIAkJZ290byBub21lbTsKIAotCW1lbXNldChlYywgMCwgc2l6ZW9mKGVjYXJkX3QpKTsKLQogCWVjLT5zbG90X25vCT0gc2xvdDsKIAllYy0+dHlwZSAgICAgICAgPSB0eXBlOwogCWVjLT5pcnEJCT0gTk9fSVJROwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9rZXJuZWwvaXJxLmMgYi9hcmNoL2FybTI2L2tlcm5lbC9pcnEuYwppbmRleCBkODdkNjhiLi5kNTMzODJjIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2FybTI2L2tlcm5lbC9pcnEuYwpAQCAtNTQ1LDcgKzU0NSw3IEBACiAJICAgIChpcnFfZmxhZ3MgJiBJUlFGX1NIQVJFRCAmJiAhZGV2X2lkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlhY3Rpb24gPSAoc3RydWN0IGlycWFjdGlvbiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFhY3Rpb24pLCBHRlBfS0VSTkVMKTsKKwlhY3Rpb24gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJxYWN0aW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhY3Rpb24pCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L21tL2ZhdWx0LmMgYi9hcmNoL2FybTI2L21tL2ZhdWx0LmMKaW5kZXggYTFmNmQ4YS4uOTNjMGNlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9tbS9mYXVsdC5jCisrKyBiL2FyY2gvYXJtMjYvbW0vZmF1bHQuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJICogSWYgd2UncmUgaW4gYW4gaW50ZXJydXB0IG9yIGhhdmUgbm8gdXNlcgogCSAqIGNvbnRleHQsIHdlIG11c3Qgbm90IHRha2UgdGhlIGZhdWx0Li4KIAkgKi8KLQlpZiAoaW5faW50ZXJydXB0KCkgfHwgIW1tKQorCWlmIChpbl9hdG9taWMoKSB8fCAhbW0pCiAJCWdvdG8gbm9fY29udGV4dDsKIAogCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvbW0vbWVtYy5jIGIvYXJjaC9hcm0yNi9tbS9tZW1jLmMKaW5kZXggMzRkZWY2My4uZjI5MDE1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0yNi9tbS9tZW1jLmMKKysrIGIvYXJjaC9hcm0yNi9tbS9tZW1jLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2RlZmluZSBNRU1DX1RBQkxFX1NJWkUgKDI1NipzaXplb2YodW5zaWduZWQgbG9uZykpCiAKLWttZW1fY2FjaGVfdCAqcHRlX2NhY2hlLCAqcGdkX2NhY2hlOworc3RydWN0IGttZW1fY2FjaGUgKnB0ZV9jYWNoZSwgKnBnZF9jYWNoZTsKIGludCBwYWdlX25yOwogCiAvKgpAQCAtMTYyLDEyICsxNjIsMTIgQEAKIHsKIH0KIAotc3RhdGljIHZvaWQgcHRlX2NhY2hlX2N0b3Iodm9pZCAqcHRlLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgcHRlX2NhY2hlX2N0b3Iodm9pZCAqcHRlLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJbWVtemVybyhwdGUsIHNpemVvZihwdGVfdCkgKiBQVFJTX1BFUl9QVEUpOwogfQogCi1zdGF0aWMgdm9pZCBwZ2RfY2FjaGVfY3Rvcih2b2lkICpwZ2QsIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBwZ2RfY2FjaGVfY3Rvcih2b2lkICpwZ2QsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAltZW16ZXJvKHBnZCArIE1FTUNfVEFCTEVfU0laRSwgVVNFUl9QVFJTX1BFUl9QR0QgKiBzaXplb2YocGdkX3QpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvS2NvbmZpZyBiL2FyY2gvYXZyMzIvS2NvbmZpZwppbmRleCA1ZjE2OTRlLi5iYjA1OWE0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL0tjb25maWcKKysrIGIvYXJjaC9hdnIzMi9LY29uZmlnCkBAIC00NSw2ICs0NSwxNCBAQAogY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCiAJYm9vbAogCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgR0VORVJJQ19CVVNUX1NQSU5MT0NLCiAJYm9vbAogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL01ha2VmaWxlIGIvYXJjaC9hdnIzMi9NYWtlZmlsZQppbmRleCBjZWZjOTVhLi43Yjg0MmU5IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL01ha2VmaWxlCisrKyBiL2FyY2gvYXZyMzIvTWFrZWZpbGUKQEAgLTcsNyArNyw3IEBACiAKICMgRGVmYXVsdCB0YXJnZXQgd2hlbiBleGVjdXRpbmcgcGxhaW4gbWFrZQogLlBIT05ZOiBhbGwKLWFsbDogdUltYWdlIHZtbGludXguZWxmIGxpbnV4LmxzdAorYWxsOiB1SW1hZ2Ugdm1saW51eC5lbGYKIAogS0JVSUxEX0RFRkNPTkZJRwk6PSBhdHN0azEwMDJfZGVmY29uZmlnCiAKQEAgLTIxLDkgKzIxLDcgQEAKIENGTEFHUwkJKz0gJChjcHVmbGFncy15KQogQUZMQUdTCQkrPSAkKGNwdWZsYWdzLXkpCiAKLUNIRUNLRkxBR1MJKz0gLURfX2F2cjMyX18KLQotTElCR0NDCQk6PSAkKHNoZWxsICQoQ0MpICQoQ0ZMQUdTKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSkKK0NIRUNLRkxBR1MJKz0gLURfX2F2cjMyX18gLURfX0JJR19FTkRJQU4KIAogaGVhZC0kKENPTkZJR19MT0FERVJfVV9CT09UKQkJKz0gYXJjaC9hdnIzMi9ib290L3UtYm9vdC9oZWFkLm8KIGhlYWQteQkJCQkJKz0gYXJjaC9hdnIzMi9rZXJuZWwvaGVhZC5vCkBAIC0zMiw3ICszMCw3IEBACiBjb3JlLSQoQ09ORklHX0xPQURFUl9VX0JPT1QpCQkrPSBhcmNoL2F2cjMyL2Jvb3QvdS1ib290LwogY29yZS15CQkJCQkrPSBhcmNoL2F2cjMyL2tlcm5lbC8KIGNvcmUteQkJCQkJKz0gYXJjaC9hdnIzMi9tbS8KLWxpYnMteQkJCQkJKz0gYXJjaC9hdnIzMi9saWIvICMkKExJQkdDQykKK2xpYnMteQkJCQkJKz0gYXJjaC9hdnIzMi9saWIvCiAKIGFyY2hpbmNkaXItJChDT05GSUdfUExBVEZPUk1fQVQzMkFQKQk6PSBhcmNoLWF0MzJhcAogCkBAIC00OCw2ICs0Niw4IEBACiAKIGFyY2hwcmVwYXJlOiBpbmNsdWRlL2FzbS1hdnIzMi8uYXJjaAogCitDTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS1hdnIzMi8uYXJjaCBpbmNsdWRlL2FzbS1hdnIzMi9hcmNoCisKIEJPT1RfVEFSR0VUUyA6PSB2bWxpbnV4LmVsZiB2bWxpbnV4LmJpbiB1SW1hZ2UgdUltYWdlLnNyZWMKIAogLlBIT05ZOiAkKEJPT1RfVEFSR0VUUykgaW5zdGFsbApAQCAtNzEsMTQgKzcxLDE5IEBACiBpbnN0YWxsOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBCT09USU1BR0U9JChLQlVJTERfSU1BR0UpICRACiAKLWxpbnV4LnM6IHZtbGludXgKK3ZtbGludXguczogdm1saW51eAogCSQoY2FsbCBpZl9jaGFuZ2VkLGRpc2FzbSkKIAotbGludXgubHN0OiB2bWxpbnV4Cit2bWxpbnV4LmxzdDogdm1saW51eAogCSQoY2FsbCBpZl9jaGFuZ2VkLGxpc3RpbmcpCiAKK0NMRUFOX0ZJTEVTICs9IHZtbGludXgucyB2bWxpbnV4LmxzdAorCithcmNoY2xlYW46CisJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQorCiBkZWZpbmUgYXJjaGhlbHAKICAgQGVjaG8gJyogdm1saW51eC5lbGYJCS0gRUxGIGltYWdlIHdpdGggbG9hZCBhZGRyZXNzIDAnCiAgIEBlY2hvICcgIHZtbGludXguY3NvCQktIFBhdGhGaW5kZXIgQ1NPIGltYWdlJwotICBAZWNobyAnICB1SW1hZ2UJCS0gQ3JlYXRlIGEgYm9vdGFibGUgaW1hZ2UgZm9yIFUtQm9vdCcKKyAgQGVjaG8gJyogdUltYWdlCQktIENyZWF0ZSBhIGJvb3RhYmxlIGltYWdlIGZvciBVLUJvb3QnCiBlbmRlZgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCmluZGV4IGNjZWQ3M2MuLjMyYjM2MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKQEAgLTcsMjAgKzcsODMgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2luaXQuaD4KIAotc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgZXRoMF9kYXRhID0gewotCS52YWxpZAkJPSAxLAotCS5taWlfcGh5X2FkZHIJPSAweDEwLAotCS5pc19ybWlpCT0gMCwKLQkuaHdfYWRkcgk9IHsgMHg2YSwgMHg4NywgMHg3MSwgMHgxNCwgMHhjZCwgMHhjYiB9LAorc3RydWN0IGV0aF9hZGRyIHsKKwl1OCBhZGRyWzZdOwogfTsKIAorc3RhdGljIHN0cnVjdCBldGhfYWRkciBfX2luaXRkYXRhIGh3X2FkZHJbMl07CisKK3N0YXRpYyBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBldGhfZGF0YVsyXTsKIGV4dGVybiBzdHJ1Y3QgbGNkY19wbGF0Zm9ybV9kYXRhIGF0c3RrMTAwMF9mYjBfZGF0YTsKIAorLyoKKyAqIFRoZSBuZXh0IHR3byBmdW5jdGlvbnMgc2hvdWxkIGdvIGF3YXkgYXMgdGhlIGJvb3QgbG9hZGVyIGlzCisgKiBzdXBwb3NlZCB0byBpbml0aWFsaXplIHRoZSBtYWNiIGFkZHJlc3MgcmVnaXN0ZXJzIHdpdGggYSB2YWxpZAorICogZXRoZXJuZXQgYWRkcmVzcy4gQnV0IHdlIG5lZWQgdG8ga2VlcCBpdCBhcm91bmQgZm9yIGEgd2hpbGUgdW50aWwKKyAqIHdlIGNhbiBiZSByZWFzb25hYmx5IHN1cmUgdGhlIGJvb3QgbG9hZGVyIGRvZXMgdGhpcy4KKyAqCisgKiBUaGUgcGh5X2lkIGlzIGlnbm9yZWQgYXMgdGhlIGRyaXZlciB3aWxsIHByb2JlIGZvciBpdC4KKyAqLworc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX2V0aGVybmV0KHN0cnVjdCB0YWcgKnRhZykKK3sKKwlpbnQgaTsKKworCWkgPSB0YWctPnUuZXRoZXJuZXQubWFjX2luZGV4OworCWlmIChpIDwgQVJSQVlfU0laRShod19hZGRyKSkKKwkJbWVtY3B5KGh3X2FkZHJbaV0uYWRkciwgdGFnLT51LmV0aGVybmV0Lmh3X2FkZHJlc3MsCisJCSAgICAgICBzaXplb2YoaHdfYWRkcltpXS5hZGRyKSk7CisKKwlyZXR1cm4gMDsKK30KK19fdGFndGFibGUoQVRBR19FVEhFUk5FVCwgcGFyc2VfdGFnX2V0aGVybmV0KTsKKworc3RhdGljIHZvaWQgX19pbml0IHNldF9od19hZGRyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWNvbnN0IHU4ICphZGRyOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgY2xrICpwY2xrOworCisJaWYgKCFyZXMpCisJCXJldHVybjsKKwlpZiAocGRldi0+aWQgPj0gQVJSQVlfU0laRShod19hZGRyKSkKKwkJcmV0dXJuOworCisJYWRkciA9IGh3X2FkZHJbcGRldi0+aWRdLmFkZHI7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHIpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNpbmNlIHRoaXMgaXMgYm9hcmQtc3BlY2lmaWMgY29kZSwgd2UnbGwgY2hlYXQgYW5kIHVzZSB0aGUKKwkgKiBwaHlzaWNhbCBhZGRyZXNzIGRpcmVjdGx5IGFzIHdlIGhhcHBlbiB0byBrbm93IHRoYXQgaXQncworCSAqIHRoZSBzYW1lIGFzIHRoZSB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJcmVncyA9ICh2b2lkIF9faW9tZW0gX19mb3JjZSAqKXJlcy0+c3RhcnQ7CisJcGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInBjbGsiKTsKKwlpZiAoIXBjbGspCisJCXJldHVybjsKKworCWNsa19lbmFibGUocGNsayk7CisJX19yYXdfd3JpdGVsKChhZGRyWzNdIDw8IDI0KSB8IChhZGRyWzJdIDw8IDE2KQorCQkgICAgIHwgKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdLCByZWdzICsgMHg5OCk7CisJX19yYXdfd3JpdGVsKChhZGRyWzVdIDw8IDgpIHwgYWRkcls0XSwgcmVncyArIDB4OWMpOworCWNsa19kaXNhYmxlKHBjbGspOworCWNsa19wdXQocGNsayk7Cit9CisKIHZvaWQgX19pbml0IHNldHVwX2JvYXJkKHZvaWQpCiB7CiAJYXQzMl9tYXBfdXNhcnQoMSwgMCk7CS8qIC9kZXYvdHR5UzAgKi8KQEAgLTM4LDcgKzEwMSw4IEBACiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDEpOwogCWF0MzJfYWRkX2RldmljZV91c2FydCgyKTsKIAotCWF0MzJfYWRkX2RldmljZV9ldGgoMCwgJmV0aDBfZGF0YSk7CisJc2V0X2h3X2FkZHIoYXQzMl9hZGRfZGV2aWNlX2V0aCgwLCAmZXRoX2RhdGFbMF0pKTsKKwogCWF0MzJfYWRkX2RldmljZV9zcGkoMCk7CiAJYXQzMl9hZGRfZGV2aWNlX2xjZGMoMCwgJmF0c3RrMTAwMF9mYjBfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NldHVwLmMKaW5kZXggMTkxYWI4NS4uMjcyYzAxMSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NldHVwLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NldHVwLmMKQEAgLTIxLDE1ICsyMSw2IEBACiAKIHN0cnVjdCBsY2RjX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBhdHN0azEwMDBfZmIwX2RhdGE7CiAKLWFzbWxpbmthZ2Ugdm9pZCBfX2luaXQgYm9hcmRfZWFybHlfaW5pdCh2b2lkKQotewotCWV4dGVybiB2b2lkIHNkcmFtX2luaXQodm9pZCk7Ci0KLSNpZmRlZiBDT05GSUdfTE9BREVSX1NUQU5EQUxPTkUKLQlzZHJhbV9pbml0KCk7Ci0jZW5kaWYKLX0KLQogdm9pZCBfX2luaXQgYm9hcmRfc2V0dXBfZmJtZW0odW5zaWduZWQgbG9uZyBmYm1lbV9zdGFydCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmJtZW1fc2l6ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9vdC9pbWFnZXMvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL2Jvb3QvaW1hZ2VzL01ha2VmaWxlCmluZGV4IGNjZDc0ZWVlLi4yMTk3MjBhIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2Jvb3QvaW1hZ2VzL01ha2VmaWxlCisrKyBiL2FyY2gvYXZyMzIvYm9vdC9pbWFnZXMvTWFrZWZpbGUKQEAgLTM3LDE0ICszNywxMiBAQAogCQkJICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIC5kYXRhLTB4ODAwMDAwMDAgXAogCQkJICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIC5pbml0LTB4ODAwMDAwMDAgXAogCQkJICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIC5ic3MtMHg4MDAwMDAwMCBcCi0JCQkgICAgLS1jaGFuZ2Utc2VjdGlvbi1sbWEgLmluaXRyZC0weDgwMDAwMDAwIFwKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSBfX3BhcmFtLTB4ODAwMDAwMDAgXAogCQkJICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIF9fa3N5bXRhYi0weDgwMDAwMDAwIFwKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSBfX2tzeW10YWJfZ3BsLTB4ODAwMDAwMDAgXAogCQkJICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIF9fa2NyY3RhYi0weDgwMDAwMDAwIFwKIAkJCSAgICAtLWNoYW5nZS1zZWN0aW9uLWxtYSBfX2tjcmN0YWJfZ3BsLTB4ODAwMDAwMDAgXAogCQkJICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIF9fa3N5bXRhYl9zdHJpbmdzLTB4ODAwMDAwMDAgXAotCQkJICAgIC0tY2hhbmdlLXNlY3Rpb24tbG1hIC5nb3QtMHg4MDAwMDAwMCBcCiAJCQkgICAgLS1zZXQtc3RhcnQgMHhhMDAwMDAwMAogJChvYmopL3ZtbGludXguZWxmOiB2bWxpbnV4IEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKQEAgLTU5LDQgKzU3LDQgQEAKIAlzaCAkKHNyY3RyZWUpL2luc3RhbGwta2VybmVsLnNoICQ8CiAKICMgR2VuZXJhdGVkIGZpbGVzIHRvIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCi1jbGVhbi1maWxlcwk6PSB2bWxpbnV4KiB1SW1hZ2UgdUltYWdlLnNyZWMKK2NsZWFuLWZpbGVzCTo9IHZtbGludXguZWxmIHZtbGludXguYmluIHZtbGludXguZ3ogdUltYWdlIHVJbWFnZS5zcmVjCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCmluZGV4IDZjMmM1ZTAuLmFlOTJhMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCkBAIC0xLDEzICsxLDE0IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgtcmMxCi0jIFR1ZSBKdWwgMTEgMTI6NDE6MzYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjMgorIyBGcmkgT2N0IDIwIDExOjUyOjM3IDIwMDYKICMKIENPTkZJR19BVlIzMj15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCkBAIC0yNSwxNiArMjYsMjMgQEAKIENPTkZJR19MT0NBTFZFUlNJT049IiIKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKLSMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CitDT05GSUdfVEFTS1NUQVRTPXkKK0NPTkZJR19UQVNLX0RFTEFZX0FDQ1Q9eQorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVD15CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfUkVMQVk9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CisjIENPTkZJR19UQVNLX1hBQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CkBAIC00MywxNCArNTEsMTUgQEAKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSE1FTT15Ci0jIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTEKLUNPTkZJR19TTE9CPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC02NSw2ICs3NCw3IEBACiAjCiAjIEJsb2NrIGxheWVyCiAjCitDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAKICMKQEAgLTE2NiwxMCArMTc2LDEyIEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQklDPXkKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CkBAIC0xOTksNyArMjExLDYgQEAKICMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKICMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAogCkBAIC0yMTIsNyArMjIzLDYgQEAKICMgTmV0d29yayB0ZXN0aW5nCiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9UQ1BQUk9CRSBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKQEAgLTIzOSw3ICsyNDksODQgQEAKICMKICMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQogIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDgwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHgwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKIAogIwogIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKQEAgLTI2MCwxMSArMzQ3LDE4IEBACiBDT05GSUdfQkxLX0RFVl9SQU09bQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKICMKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CkBAIC0yNzQsNiArMzY4LDEyIEBACiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKQEAgLTMwNSwxNCArNDA1LDExIEBACiAjCiAjIFBIWSBkZXZpY2Ugc3VwcG9ydAogIwotIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKICMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX01JST15Ci1DT05GSUdfTUFDQj15CisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwIE1iaXQpCkBAIC0zNDEsMTAgKzQzOCwxMSBAQAogQ09ORklHX1BQUF9BU1lOQz1tCiAjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAogQ09ORklHX1BQUF9ERUZMQVRFPW0KLSMgQ09ORklHX1BQUF9CU0RDT01QIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfQlNEQ09NUD1tCiAjIENPTkZJR19QUFBfTVBQRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19TTEhDPW0KICMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldApAQCAtNDE3LDcgKzUxNSw2IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgc3VwcG9ydApAQCAtNDI3LDIzICs1MjQsMTMgQEAKICMKICMgU1BJIHN1cHBvcnQKICMKLUNPTkZJR19TUEk9eQotIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19TUElfTUFTVEVSPXkKLQotIwotIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwotIwotQ09ORklHX1NQSV9BVE1FTD1tCi0jIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIFByb3RvY29sIE1hc3RlcnMKLSMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKIAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CkBAIC00NTIsMTQgKzUzOSw5IEBACiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogCiAjCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19WNEwyPXkKIAogIwogIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCkBAIC00NzAsMjggKzU1Miw4IEBACiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAotQ09ORklHX0ZCPW0KLUNPTkZJR19GQl9DRkJfRklMTFJFQ1Q9bQotQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT1tCi1DT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD1tCi0jIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfU0lEU0E9bQotQ09ORklHX0ZCX1NJRFNBX0RFRkFVTFRfQlBQPTI0Ci0jIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0xPR08gaXMgbm90IHNldAotQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15Ci0jIENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFIGlzIG5vdCBzZXQKLUNPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPW0KLUNPTkZJR19MQ0RfREVWSUNFPXkKLUNPTkZJR19MQ0RfTFRWMzUwUVY9bQorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZApAQCAtNTYxLDE4ICs2MjMsMjEgQEAKICMKICMgRmlsZSBzeXN0ZW1zCiAjCi1DT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GUz1tCiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSU5JWF9GUz1tCi1DT05GSUdfUk9NRlNfRlM9bQotIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTYwMCw4ICs2NjUsMTAgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKIENPTkZJR19DT05GSUdGU19GUz1tCkBAIC02MTYsNiArNjgzLDE2IEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldApAQCAtNjI2LDI2ICs3MDMsMTAgQEAKICMKICMgTmV0d29yayBGaWxlIFN5c3RlbXMKICMKLUNPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfTE9DS0RfVjQ9eQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotQ09ORklHX0NJRlM9bQotIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTY2NSw3ICs3MjYsNyBAQAogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQogIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLUNPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldApAQCAtNzA1LDEzICs3NjYsMTcgQEAKICMgS2VybmVsIGhhY2tpbmcKICMKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLUNPTkZJR19QUklOVEtfVElNRT15CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldApAQCAtNzIyLDExICs3ODcsMTMgQEAKICMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAotQ09ORklHX0tQUk9CRVM9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtNzQwLDE1ICs4MDcsMTMgQEAKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKLUNPTkZJR19DUkMzMj1tCitDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19aTElCX0lORkxBVEU9bQotQ09ORklHX1pMSUJfREVGTEFURT1tCitDT05GSUdfQVVESVRfR0VORVJJQz15CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorQ09ORklHX1BMSVNUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9hdnIzMl9rc3ltcy5jCmluZGV4IDA0Zjc2N2EuLjdjNGM3NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvYXZyMzJfa3N5bXMuYwpAQCAtNywxMSArNywxMiBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KIAogLyoKICAqIEdDQyBmdW5jdGlvbnMKQEAgLTUzLDMgKzU0LDExIEBACiBFWFBPUlRfU1lNQk9MKGZpbmRfZmlyc3RfYml0KTsKIEVYUE9SVF9TWU1CT0woZmluZF9uZXh0X2JpdCk7CiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmluZF9uZXh0X3plcm9fbGVfYml0KTsKKworLyogSS9PIHByaW1pdGl2ZXMgKGxpYi9pby0qLlMpICovCitFWFBPUlRfU1lNQk9MKF9fcmF3X3JlYWRzYik7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3JlYWRzdyk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3JlYWRzbCk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlc2IpOworRVhQT1JUX1NZTUJPTChfX3Jhd193cml0ZXN3KTsKK0VYUE9SVF9TWU1CT0woX19yYXdfd3JpdGVzbCk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9oZWFkLlMgYi9hcmNoL2F2cjMyL2tlcm5lbC9oZWFkLlMKaW5kZXggNzczYjdhZC4uNjE2M2JkMCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL2hlYWQuUwpAQCAtMzAsOSArMzAsNiBAQAogCW1vdglyNywgMAogI2VuZGlmCiAKLQkvKiBTZXQgdXAgdGhlIFBJTywgU0RSQU0gY29udHJvbGxlciwgZWFybHkgcHJpbnRrLCBldGMuICovCi0JcmNhbGwJYm9hcmRfZWFybHlfaW5pdAotCiAJLyogU3RhcnQgdGhlIHNob3cgKi8KIAlsZGRwYyAgIHBjLCBrZXJuZWxfc3RhcnRfYWRkcgogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggNmNhZjllOC4uZDBhYmJjYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL2twcm9iZXMuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJdm9pZCAqYWRkciA9ICh2b2lkICopcmVncy0+cGM7CiAJaW50IHJldCA9IDA7CiAKLQlwcl9kZWJ1Zygia3Byb2JlX2hhbmRsZXI6IGtwcm9iZV9ydW5uaW5nPSVkXG4iLAorCXByX2RlYnVnKCJrcHJvYmVfaGFuZGxlcjoga3Byb2JlX3J1bm5pbmc9JXBcbiIsCiAJCSBrcHJvYmVfcnVubmluZygpKTsKIAogCS8qCkBAIC0xNTQsNiArMTU0LDcgQEAKIAlyZXR1cm4gMTsKIAogbm9fa3Byb2JlOgorCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvYXZyMzIva2VybmVsL21vZHVsZS5jCmluZGV4IGRmYzMyZjIuLmI1OTllYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL21vZHVsZS5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJCSAqIHZhbHVlIG9mIFBDLiAgSnVzdCBzdWJ0cmFjdCB0aGUgdmFsdWUgb2YKIAkJCSAqIEdPVCwgYW5kIHdlJ3JlIGRvbmUuCiAJCQkgKi8KLQkJCXByX2RlYnVnKCJHT1RQQzogUEM9MHglbHgsIGdvdF9vZmZzZXQ9MHglbHgsIGNvcmU9MHglcFxuIiwKKwkJCXByX2RlYnVnKCJHT1RQQzogUEM9MHgleCwgZ290X29mZnNldD0weCVseCwgY29yZT0weCVwXG4iLAogCQkJCSByZWxvY2F0aW9uLCBtb2R1bGUtPmFyY2guZ290X29mZnNldCwKIAkJCQkgbW9kdWxlLT5tb2R1bGVfY29yZSk7CiAJCQlyZWxvY2F0aW9uIC09ICgodW5zaWduZWQgbG9uZyltb2R1bGUtPm1vZHVsZV9jb3JlCkBAIC0yODIsNyArMjgyLDcgQEAKIAkJCSAgICAmJiAocmVsb2NhdGlvbiAmIDB4ZmZmZjAwMDApICE9IDB4ZmZmZjAwMDApCiAJCQkJcmV0dXJuIHJlbG9jX292ZXJmbG93KG1vZHVsZSwgIlJfQVZSMzJfR09UMTZTIiwKIAkJCQkJCSAgICAgIHJlbG9jYXRpb24pOwotCQkJcHJfZGVidWcoIkdPVCByZWxvYyBAIDB4JWx4IC0+ICVsdVxuIiwKKwkJCXByX2RlYnVnKCJHT1QgcmVsb2MgQCAweCV4IC0+ICV1XG4iLAogCQkJCSByZWwtPnJfb2Zmc2V0LCByZWxvY2F0aW9uKTsKIAkJCXZhbHVlID0gKmxvY2F0aW9uOwogCQkJdmFsdWUgPSAoKHZhbHVlICYgMHhmZmZmMDAwMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYwppbmRleCAzMTdkYzUwLi4wYjQzMjU5IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zOCw2ICszOCwxMyBAQAogCiB2b2lkIG1hY2hpbmVfaGFsdCh2b2lkKQogeworCS8qCisJICogRW50ZXIgU3RvcCBtb2RlLiBUaGUgMzIga0h6IG9zY2lsbGF0b3Igd2lsbCBrZWVwIHJ1bm5pbmcgc28KKwkgKiB0aGUgUlRDIHdpbGwga2VlcCB0aGUgdGltZSBwcm9wZXJseSBhbmQgdGhlIHN5c3RlbSB3aWxsCisJICogYm9vdCBxdWlja2x5LgorCSAqLworCWFzbSB2b2xhdGlsZSgic2xlZXAgM1xuXHQiCisJCSAgICAgInN1YiBwYywgLTIiKTsKIH0KIAogdm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9wdHJhY2UuYwppbmRleCAzYzg5ZTU5Li5mMmU4MWNkIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHJldDsKIAotCXByX2RlYnVnKCJhcmNoX3B0cmFjZSglbGQsICVsZCwgJSNseCwgJSNseClcbiIsCisJcHJfZGVidWcoImFyY2hfcHRyYWNlKCVsZCwgJWQsICUjbHgsICUjbHgpXG4iLAogCQkgcmVxdWVzdCwgY2hpbGQtPnBpZCwgYWRkciwgZGF0YSk7CiAKIAlwcl9kZWJ1ZygicHRyYWNlOiBFbmFibGluZyBtb25pdG9yIG1vZGUuLi5cbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMKaW5kZXggZWEyZDFmZi4uYTM0MjExNiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jCkBAIC0yMjksMzAgKzIyOSw2IEBACiB9CiBfX3RhZ3RhYmxlKEFUQUdfUlNWRF9NRU0sIHBhcnNlX3RhZ19yc3ZkX21lbSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19ldGhlcm5ldChzdHJ1Y3QgdGFnICp0YWcpCi17Ci0jaWYgMAotCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0KLQkvKgotCSAqIFdlIHJlYWxseSBuZWVkIGEgYnVzIHR5cGUgdGhhdCBzdXBwb3J0cyAiY2xhc3NlcyIuLi50aGlzCi0JICogd2lsbCBkbyBmb3Igbm93ICh1bnRpbCB3ZSBtdXN0IGhhbmRsZSBvdGhlciBraW5kcyBvZgotCSAqIGV0aGVybmV0IGNvbnRyb2xsZXJzKQotCSAqLwotCXBkZXYgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlKCJtYWNiIiwgdGFnLT51LmV0aGVybmV0Lm1hY19pbmRleCk7Ci0JaWYgKHBkZXYgJiYgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpIHsKLQkJc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhICpkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQkJZGF0YS0+dmFsaWQgPSAxOwotCQlkYXRhLT5taWlfcGh5X2FkZHIgPSB0YWctPnUuZXRoZXJuZXQubWlpX3BoeV9hZGRyOwotCQltZW1jcHkoZGF0YS0+aHdfYWRkciwgdGFnLT51LmV0aGVybmV0Lmh3X2FkZHJlc3MsCi0JCSAgICAgICBzaXplb2YoZGF0YS0+aHdfYWRkcikpOwotCX0KLSNlbmRpZgotCXJldHVybiAwOwotfQotX190YWd0YWJsZShBVEFHX0VUSEVSTkVULCBwYXJzZV90YWdfZXRoZXJuZXQpOwotCiAvKgogICogU2NhbiB0aGUgdGFnIHRhYmxlIGZvciB0aGlzIHRhZywgYW5kIGNhbGwgaXRzIHBhcnNlIGZ1bmN0aW9uLiBUaGUKICAqIHRhZyB0YWJsZSBpcyBidWlsdCBieSB0aGUgbGlua2VyIGZyb20gYWxsIHRoZSBfX3RhZ3RhYmxlCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvYXZyMzIva2VybmVsL3NpZ25hbC5jCmluZGV4IDMzMDk2NjUuLjBlYzE0ODU0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zaWduYWwuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsLXN0dWJzLlMKaW5kZXggNzU4OWE5Yi4uODkwMjg2YSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbC1zdHVicy5TCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGwtc3R1YnMuUwpAQCAtMTAwLDMgKzEwMCwxMiBAQAogCXJjYWxsCXN5c19zcGxpY2UKIAlzdWIJc3AsIC00CiAJcG9wbQlwYworCisJLmdsb2JhbAlfX3N5c19lcG9sbF9wd2FpdAorCS50eXBlCV9fc3lzX2Vwb2xsX3B3YWl0LEBmdW5jdGlvbgorX19zeXNfZXBvbGxfcHdhaXQ6CisJcHVzaG0JbHIKKwlzdC53CS0tc3AsIEFSRzYKKwlyY2FsbAlzeXNfZXBvbGxfcHdhaXQKKwlzdWIJc3AsIC00CisJcG9wbQlwYwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IDYzYjIwNjkuLmRiOGY4YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTI4Niw0ICsyODYsNSBAQAogCS5sb25nCXN5c19zeW5jX2ZpbGVfcmFuZ2UKIAkubG9uZwlzeXNfdGVlCiAJLmxvbmcJc3lzX3Ztc3BsaWNlCisJLmxvbmcJX19zeXNfZXBvbGxfcHdhaXQJLyogMjY1ICovCiAJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHI4IGlzIHNhdHVyYXRlZCBhdCBucl9zeXNjYWxscyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdm1saW51eC5sZHMuYyBiL2FyY2gvYXZyMzIva2VybmVsL3ZtbGludXgubGRzLmMKaW5kZXggY2RkNjI3Yy4uNWM0NDI0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdm1saW51eC5sZHMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC92bWxpbnV4Lmxkcy5jCkBAIC0zOCwxMyArMzgsNyBAQAogCQlfX3NldHVwX2VuZCA9IC47CiAJCS4gPSBBTElHTig0KTsKIAkJX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JCQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkJCSooLmluaXRjYWxsMi5pbml0KQotCQkJKiguaW5pdGNhbGwzLmluaXQpCi0JCQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkJCSooLmluaXRjYWxsNS5pbml0KQotCQkJKiguaW5pdGNhbGw2LmluaXQpCi0JCQkqKC5pbml0Y2FsbDcuaW5pdCkKKwkJCUlOSVRDQUxMUwogCQlfX2luaXRjYWxsX2VuZCA9IC47CiAJCV9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKIAkJCSooLmNvbl9pbml0Y2FsbC5pbml0KQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9saWIvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL2xpYi9NYWtlZmlsZQppbmRleCAwOWFjNDNlLi4wODRkOTViIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL2F2cjMyL2xpYi9NYWtlZmlsZQpAQCAtNyw0ICs3LDUgQEAKIGxpYi15CSs9IGRlbGF5Lm8gbWVtc2V0Lm8gbWVtY3B5Lm8gZmluZGJpdC5vCiBsaWIteQkrPSBjc3VtX3BhcnRpYWwubyBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljLm8KIGxpYi15CSs9IGlvLXJlYWRzdy5vIGlvLXJlYWRzbC5vIGlvLXdyaXRlc3cubyBpby13cml0ZXNsLm8KK2xpYi15CSs9IGlvLXJlYWRzYi5vIGlvLXdyaXRlc2IubwogbGliLXkJKz0gX19hdnIzMl9sc2w2NC5vIF9fYXZyMzJfbHNyNjQubyBfX2F2cjMyX2FzcjY0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbGliL2RlbGF5LmMgYi9hcmNoL2F2cjMyL2xpYi9kZWxheS5jCmluZGV4IDQ2MmM4MzAuLmIzYmMwYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbGliL2RlbGF5LmMKKysrIGIvYXJjaC9hdnIzMi9saWIvZGVsYXkuYwpAQCAtMTIsOSArMTIsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2xpYi9maW5kYml0LlMgYi9hcmNoL2F2cjMyL2xpYi9maW5kYml0LlMKaW5kZXggMmI0ODU2Zi4uYzZiOTFkZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9saWIvZmluZGJpdC5TCisrKyBiL2FyY2gvYXZyMzIvbGliL2ZpbmRiaXQuUwpAQCAtMTM2LDYgKzEzNiw3IEBACiAJLyogb2Zmc2V0IGlzIG5vdCB3b3JkLWFsaWduZWQuIEhhbmRsZSB0aGUgZmlyc3QgKDMyIC0gcjEwKSBiaXRzICovCiAJbGRzd3AudwlyOCwgcjEyWzBdCiAJc3ViCXIxMiwgLTQKKwljb20JcjgKIAlsc3IJcjgsIHI4LCByMTAKIAlicm5lCS5MX2ZvdW5kCiAKQEAgLTE0Niw3ICsxNDcsNyBAQAogCiAJLyogTWFpbiBsb29wLiBvZmZzZXQgbXVzdCBiZSB3b3JkLWFsaWduZWQgKi8KIDE6CWxkc3dwLncJcjgsIHIxMlswXQotCWNwLncJcjgsIDAKKwljb20JcjgKIAlicm5lCS5MX2ZvdW5kCiAJc3ViCXIxMiwgLTQKIAlzdWIJcjksIDMyCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2xpYi9pby1yZWFkc2IuUyBiL2FyY2gvYXZyMzIvbGliL2lvLXJlYWRzYi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTVkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2xpYi9pby1yZWFkc2IuUwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgQXRtZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKwkudGV4dAorLkxub3Rfd29yZF9hbGlnbmVkOgorMToJbGQudWIJcjgsIHIxMlswXQorCXN1YglyMTAsIDEKKwlzdC5iCXIxMSsrLCByOAorCXJldGVxCXIxMgorCXRzdAlyMTEsIHI5CisJYnJuZQkxYgorCisJLyogZmFsbCB0aHJvdWdoICovCisKKwkuZ2xvYmFsCV9fcmF3X3JlYWRzYgorCS50eXBlCV9fcmF3X3JlYWRzYixAZnVuY3Rpb24KK19fcmF3X3JlYWRzYjoKKwljcC53CXIxMCwgMAorCW1vdglyOSwgMworCXJldGVxCXIxMgorCisJdHN0CXIxMSwgcjkKKwlicm5lCS5Mbm90X3dvcmRfYWxpZ25lZAorCisJc3ViCXIxMCwgNAorCWJybHQJMmYKKworMToJbGRpbnMuYglyODp0LCByMTJbMF0KKwlsZGlucy5iCXI4OnUsIHIxMlswXQorCWxkaW5zLmIJcjg6bCwgcjEyWzBdCisJbGRpbnMuYiByODpiLCByMTJbMF0KKwlzdC53CXIxMSsrLCByOAorCXN1YglyMTAsIDQKKwlicmdlCTFiCisKKzI6CXN1YglyMTAsIC00CisJcmV0ZXEJcjEyCisKKzM6CWxkLnVoCXI4LCByMTJbMF0KKwlzdWIJcjEwLCAxCisJc3QuYglyMTErKywgcjgKKwlicm5lCTNiCisKKwlyZXRhbAlyMTIKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbGliL2lvLXdyaXRlc2IuUyBiL2FyY2gvYXZyMzIvbGliL2lvLXdyaXRlc2IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGViYWFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9saWIvaW8td3JpdGVzYi5TCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworCS50ZXh0CisuTG5vdF93b3JkX2FsaWduZWQ6CisxOglsZC51YglyOCwgcjExKysKKwlzdWIJcjEwLCAxCisJc3QuYglyMTJbMF0sIHI4CisJcmV0ZXEJcjEyCisJdHN0CXIxMSwgcjkKKwlicm5lCTFiCisKKwkvKiBmYWxsIHRocm91Z2ggKi8KKworCS5nbG9iYWwJX19yYXdfd3JpdGVzYgorCS50eXBlCV9fcmF3X3dyaXRlc2IsQGZ1bmN0aW9uCitfX3Jhd193cml0ZXNiOgorCWNwLncJcjEwLCAwCisJbW92CXI5LCAzCisJcmV0ZXEJcjEyCisKKwl0c3QJcjExLCByOQorCWJybmUJLkxub3Rfd29yZF9hbGlnbmVkCisKKwlzdWIJcjEwLCA0CisJYnJsdAkyZgorCisxOglsZC53CXI4LCByMTErKworCWJmZXh0dQlyOSwgcjgsIDI0LCA4CisJc3QuYglyMTJbMF0sIHI5CisJYmZleHR1CXI5LCByOCwgMTYsIDgKKwlzdC5iCXIxMlswXSwgcjkKKwliZmV4dHUJcjksIHI4LCA4LCA4CisJc3QuYglyMTJbMF0sIHI5CisJc3QuYglyMTJbMF0sIHI4CisJc3ViCXIxMCwgNAorCWJyZ2UJMWIKKworMjoJc3ViCXIxMCwgLTQKKwlyZXRlcQlyMTIKKworMzoJbGQudWIJcjgsIHIxMSsrCisJc3ViCXIxMCwgMQorCXN0LmIJcjEyWzBdLCByOAorCWJybmUJM2IKKworCXJldGFsCXIxMgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYwppbmRleCA3ZmY2YWQ4Li40OGY0ZWYzIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKKyNpbmNsdWRlIDxhc20vYXJjaC9hdDMyYXA3MDAwLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9wb3J0bXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvc20uaD4KQEAgLTU3LDYgKzU4LDkgQEAKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoX25hbWUjI19pZCMjX3Jlc291cmNlKSwJXAogfQogCisjZGVmaW5lIHNlbGVjdF9wZXJpcGhlcmFsKHBpbiwgcGVyaXBoLCBmbGFncykJCQlcCisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElOXyMjcGluLCBHUElPXyMjcGVyaXBoLCBmbGFncykKKwogI2RlZmluZSBERVZfQ0xLKF9uYW1lLCBkZXZuYW1lLCBidXMsIF9pbmRleCkJCQlcCiBzdGF0aWMgc3RydWN0IGNsayBkZXZuYW1lIyNfIyNfbmFtZSA9IHsJCQkJXAogCS5uYW1lCQk9ICNfbmFtZSwJCQkJXApAQCAtNjcsMTggKzcxLDYgQEAKIAkuaW5kZXgJCT0gX2luZGV4LAkJCQlcCiB9CiAKLWVudW0gewotCVBJT0EsCi0JUElPQiwKLQlQSU9DLAotCVBJT0QsCi19OwotCi1lbnVtIHsKLQlGVU5DX0EsCi0JRlVOQ19CLAotfTsKLQogdW5zaWduZWQgbG9uZyBhdDMyYXA3MDAwX29zY19yYXRlc1szXSA9IHsKIAlbMF0gPSAzMjc2OCwKIAkvKiBGSVhNRTogdGhlc2UgYXJlIEFUU1RLMTAwMi1zcGVjaWZpYyAqLwpAQCAtNTY5LDI2ICs1NjEsMjYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ3VyZV91c2FydDBfcGlucyh2b2lkKQogewotCXBvcnRtdXhfc2V0X2Z1bmMoUElPQSwgIDgsIEZVTkNfQik7CS8qIFJYRAkqLwotCXBvcnRtdXhfc2V0X2Z1bmMoUElPQSwgIDksIEZVTkNfQik7CS8qIFRYRAkqLworCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDgpLCAgUEVSSVBIX0IsIDApOwkvKiBSWEQJKi8KKwlzZWxlY3RfcGVyaXBoZXJhbChQQSg5KSwgIFBFUklQSF9CLCAwKTsJLyogVFhECSovCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb25maWd1cmVfdXNhcnQxX3BpbnModm9pZCkKIHsKLQlwb3J0bXV4X3NldF9mdW5jKFBJT0EsIDE3LCBGVU5DX0EpOwkvKiBSWEQJKi8KLQlwb3J0bXV4X3NldF9mdW5jKFBJT0EsIDE4LCBGVU5DX0EpOwkvKiBUWEQJKi8KKwlzZWxlY3RfcGVyaXBoZXJhbChQQSgxNyksIFBFUklQSF9BLCAwKTsJLyogUlhECSovCisJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMTgpLCBQRVJJUEhfQSwgMCk7CS8qIFRYRAkqLwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlndXJlX3VzYXJ0Ml9waW5zKHZvaWQpCiB7Ci0JcG9ydG11eF9zZXRfZnVuYyhQSU9CLCAyNiwgRlVOQ19CKTsJLyogUlhECSovCi0JcG9ydG11eF9zZXRfZnVuYyhQSU9CLCAyNywgRlVOQ19CKTsJLyogVFhECSovCisJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMjYpLCBQRVJJUEhfQiwgMCk7CS8qIFJYRAkqLworCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDI3KSwgUEVSSVBIX0IsIDApOwkvKiBUWEQJKi8KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ3VyZV91c2FydDNfcGlucyh2b2lkKQogewotCXBvcnRtdXhfc2V0X2Z1bmMoUElPQiwgMTgsIEZVTkNfQik7CS8qIFJYRAkqLwotCXBvcnRtdXhfc2V0X2Z1bmMoUElPQiwgMTcsIEZVTkNfQik7CS8qIFRYRAkqLworCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDE4KSwgUEVSSVBIX0IsIDApOwkvKiBSWEQJKi8KKwlzZWxlY3RfcGVyaXBoZXJhbChQQigxNyksIFBFUklQSF9CLCAwKTsJLyogVFhECSovCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDMyX3VzYXJ0c1s0XTsKQEAgLTY1NCw2ICs2NDYsMTUgQEAKIERFVl9DTEsoaGNsaywgbWFjYjAsIGhzYiwgOCk7CiBERVZfQ0xLKHBjbGssIG1hY2IwLCBwYmIsIDYpOwogCitzdGF0aWMgc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIG1hY2IxX2RhdGE7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1hY2IxX3Jlc291cmNlW10gPSB7CisJUEJNRU0oMHhmZmYwMWMwMCksCisJSVJRKDI2KSwKK307CitERUZJTkVfREVWX0RBVEEobWFjYiwgMSk7CitERVZfQ0xLKGhjbGssIG1hY2IxLCBoc2IsIDkpOworREVWX0NMSyhwY2xrLCBtYWNiMSwgcGJiLCA3KTsKKwogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0CiBhdDMyX2FkZF9kZXZpY2VfZXRoKHVuc2lnbmVkIGludCBpZCwgc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhICpkYXRhKQogewpAQCAtNjYzLDI3ICs2NjQsNTQgQEAKIAljYXNlIDA6CiAJCXBkZXYgPSAmbWFjYjBfZGV2aWNlOwogCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgIDMsIEZVTkNfQSk7CS8qIFRYRDAJKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAgNCwgRlVOQ19BKTsJLyogVFhEMQkqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0MsICA3LCBGVU5DX0EpOwkvKiBUWEVOCSovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgIDgsIEZVTkNfQSk7CS8qIFRYQ0sgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAgOSwgRlVOQ19BKTsJLyogUlhEMAkqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0MsIDEwLCBGVU5DX0EpOwkvKiBSWEQxCSovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgMTMsIEZVTkNfQSk7CS8qIFJYRVIJKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAxNSwgRlVOQ19BKTsJLyogUlhEVgkqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0MsIDE2LCBGVU5DX0EpOwkvKiBNREMJKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAxNywgRlVOQ19BKTsJLyogTURJTwkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygzKSwgIFBFUklQSF9BLCAwKTsJLyogVFhEMAkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg0KSwgIFBFUklQSF9BLCAwKTsJLyogVFhEMQkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg3KSwgIFBFUklQSF9BLCAwKTsJLyogVFhFTgkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg4KSwgIFBFUklQSF9BLCAwKTsJLyogVFhDSyAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQyg5KSwgIFBFUklQSF9BLCAwKTsJLyogUlhEMAkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxMCksIFBFUklQSF9BLCAwKTsJLyogUlhEMQkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxMyksIFBFUklQSF9BLCAwKTsJLyogUlhFUgkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxNSksIFBFUklQSF9BLCAwKTsJLyogUlhEVgkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxNiksIFBFUklQSF9BLCAwKTsJLyogTURDCSovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDE3KSwgUEVSSVBIX0EsIDApOwkvKiBNRElPCSovCiAKIAkJaWYgKCFkYXRhLT5pc19ybWlpKSB7Ci0JCQlwb3J0bXV4X3NldF9mdW5jKFBJT0MsICAwLCBGVU5DX0EpOwkvKiBDT0wJKi8KLQkJCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgIDEsIEZVTkNfQSk7CS8qIENSUwkqLwotCQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAgMiwgRlVOQ19BKTsJLyogVFhFUgkqLwotCQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAgNSwgRlVOQ19BKTsJLyogVFhEMgkqLwotCQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAgNiwgRlVOQ19BKTsJLyogVFhEMyAqLwotCQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAxMSwgRlVOQ19BKTsJLyogUlhEMgkqLwotCQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAxMiwgRlVOQ19BKTsJLyogUlhEMwkqLwotCQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAxNCwgRlVOQ19BKTsJLyogUlhDSwkqLwotCQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAxOCwgRlVOQ19BKTsJLyogU1BECSovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygwKSwgIFBFUklQSF9BLCAwKTsJLyogQ09MCSovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxKSwgIFBFUklQSF9BLCAwKTsJLyogQ1JTCSovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyKSwgIFBFUklQSF9BLCAwKTsJLyogVFhFUgkqLworCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoNSksICBQRVJJUEhfQSwgMCk7CS8qIFRYRDIJKi8KKwkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDYpLCAgUEVSSVBIX0EsIDApOwkvKiBUWEQzICovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxMSksIFBFUklQSF9BLCAwKTsJLyogUlhEMgkqLworCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMTIpLCBQRVJJUEhfQSwgMCk7CS8qIFJYRDMJKi8KKwkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDE0KSwgUEVSSVBIX0EsIDApOwkvKiBSWENLCSovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxOCksIFBFUklQSF9BLCAwKTsJLyogU1BECSovCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCXBkZXYgPSAmbWFjYjFfZGV2aWNlOworCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDEzKSwgUEVSSVBIX0IsIDApOwkJLyogVFhEMAkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxNCksIFBFUklQSF9CLCAwKTsJCS8qIFRYRDEJKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMTEpLCBQRVJJUEhfQiwgMCk7CQkvKiBUWEVOCSovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDEyKSwgUEVSSVBIX0IsIDApOwkJLyogVFhDSyAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxMCksIFBFUklQSF9CLCAwKTsJCS8qIFJYRDAJKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoNiksICBQRVJJUEhfQiwgMCk7CQkvKiBSWEQxCSovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDUpLCAgUEVSSVBIX0IsIDApOwkJLyogUlhFUgkqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCg0KSwgIFBFUklQSF9CLCAwKTsJCS8qIFJYRFYJKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMyksICBQRVJJUEhfQiwgMCk7CQkvKiBNREMJKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMiksICBQRVJJUEhfQiwgMCk7CQkvKiBNRElPCSovCisKKwkJaWYgKCFkYXRhLT5pc19ybWlpKSB7CisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxOSksIFBFUklQSF9CLCAwKTsJLyogQ09MCSovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyMyksIFBFUklQSF9CLCAwKTsJLyogQ1JTCSovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyNiksIFBFUklQSF9CLCAwKTsJLyogVFhFUgkqLworCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjcpLCBQRVJJUEhfQiwgMCk7CS8qIFRYRDIJKi8KKwkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI4KSwgUEVSSVBIX0IsIDApOwkvKiBUWEQzICovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyOSksIFBFUklQSF9CLCAwKTsJLyogUlhEMgkqLworCQkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMzApLCBQRVJJUEhfQiwgMCk7CS8qIFJYRDMJKi8KKwkJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI0KSwgUEVSSVBIX0IsIDApOwkvKiBSWENLCSovCisJCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxNSksIFBFUklQSF9CLCAwKTsJLyogU1BECSovCiAJCX0KIAkJYnJlYWs7CiAKQEAgLTcxNCwxMiArNzQyLDEyIEBACiAJc3dpdGNoIChpZCkgewogCWNhc2UgMDoKIAkJcGRldiA9ICZzcGkwX2RldmljZTsKLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9BLCAgMCwgRlVOQ19BKTsJLyogTUlTTwkgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9BLCAgMSwgRlVOQ19BKTsJLyogTU9TSQkgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9BLCAgMiwgRlVOQ19BKTsJLyogU0NLCSAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0EsICAzLCBGVU5DX0EpOwkvKiBOUENTMCAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0EsICA0LCBGVU5DX0EpOwkvKiBOUENTMSAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0EsICA1LCBGVU5DX0EpOwkvKiBOUENTMiAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgwKSwgIFBFUklQSF9BLCAwKTsJLyogTUlTTwkgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMSksICBQRVJJUEhfQSwgMCk7CS8qIE1PU0kJICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDIpLCAgUEVSSVBIX0EsIDApOwkvKiBTQ0sJICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDMpLCAgUEVSSVBIX0EsIDApOwkvKiBOUENTMCAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQSg0KSwgIFBFUklQSF9BLCAwKTsJLyogTlBDUzEgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoNSksICBQRVJJUEhfQSwgMCk7CS8qIE5QQ1MyICovCiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTc2MiwzNyArNzkwLDM3IEBACiAJc3dpdGNoIChpZCkgewogCWNhc2UgMDoKIAkJcGRldiA9ICZsY2RjMF9kZXZpY2U7Ci0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgMTksIEZVTkNfQSk7CS8qIENDCSAgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAyMCwgRlVOQ19BKTsJLyogSFNZTkMgICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgMjEsIEZVTkNfQSk7CS8qIFBDTEsJICAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0MsIDIyLCBGVU5DX0EpOwkvKiBWU1lOQyAgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAyMywgRlVOQ19BKTsJLyogRFZBTAkgICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgMjQsIEZVTkNfQSk7CS8qIE1PREUJICAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0MsIDI1LCBGVU5DX0EpOwkvKiBQV1IJICAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0MsIDI2LCBGVU5DX0EpOwkvKiBEQVRBMCAgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAyNywgRlVOQ19BKTsJLyogREFUQTEgICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgMjgsIEZVTkNfQSk7CS8qIERBVEEyICAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0MsIDI5LCBGVU5DX0EpOwkvKiBEQVRBMyAgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9DLCAzMCwgRlVOQ19BKTsJLyogREFUQTQgICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPQywgMzEsIEZVTkNfQSk7CS8qIERBVEE1ICAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0QsICAwLCBGVU5DX0EpOwkvKiBEQVRBNiAgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9ELCAgMSwgRlVOQ19BKTsJLyogREFUQTcgICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPRCwgIDIsIEZVTkNfQSk7CS8qIERBVEE4ICAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0QsICAzLCBGVU5DX0EpOwkvKiBEQVRBOSAgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9ELCAgNCwgRlVOQ19BKTsJLyogREFUQTEwICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPRCwgIDUsIEZVTkNfQSk7CS8qIERBVEExMSAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0QsICA2LCBGVU5DX0EpOwkvKiBEQVRBMTIgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9ELCAgNywgRlVOQ19BKTsJLyogREFUQTEzICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPRCwgIDgsIEZVTkNfQSk7CS8qIERBVEExNCAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0QsICA5LCBGVU5DX0EpOwkvKiBEQVRBMTUgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9ELCAxMCwgRlVOQ19BKTsJLyogREFUQTE2ICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPRCwgMTEsIEZVTkNfQSk7CS8qIERBVEExNyAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0QsIDEyLCBGVU5DX0EpOwkvKiBEQVRBMTggKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9ELCAxMywgRlVOQ19BKTsJLyogREFUQTE5ICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPRCwgMTQsIEZVTkNfQSk7CS8qIERBVEEyMCAqLwotCQlwb3J0bXV4X3NldF9mdW5jKFBJT0QsIDE1LCBGVU5DX0EpOwkvKiBEQVRBMjEgKi8KLQkJcG9ydG11eF9zZXRfZnVuYyhQSU9ELCAxNiwgRlVOQ19BKTsJLyogREFUQTIyICovCi0JCXBvcnRtdXhfc2V0X2Z1bmMoUElPRCwgMTcsIEZVTkNfQSk7CS8qIERBVEEyMyAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygxOSksIFBFUklQSF9BLCAwKTsJLyogQ0MJICAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyMCksIFBFUklQSF9BLCAwKTsJLyogSFNZTkMgICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDIxKSwgUEVSSVBIX0EsIDApOwkvKiBQQ0xLCSAgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjIpLCBQRVJJUEhfQSwgMCk7CS8qIFZTWU5DICAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyMyksIFBFUklQSF9BLCAwKTsJLyogRFZBTAkgICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI0KSwgUEVSSVBIX0EsIDApOwkvKiBNT0RFCSAgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjUpLCBQRVJJUEhfQSwgMCk7CS8qIFBXUgkgICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI2KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMCAgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMjcpLCBQRVJJUEhfQSwgMCk7CS8qIERBVEExICAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygyOCksIFBFUklQSF9BLCAwKTsJLyogREFUQTIgICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBDKDI5KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMyAgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEMoMzApLCBQRVJJUEhfQSwgMCk7CS8qIERBVEE0ICAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQQygzMSksIFBFUklQSF9BLCAwKTsJLyogREFUQTUgICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDApLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBNiAgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMSksICBQRVJJUEhfQSwgMCk7CS8qIERBVEE3ICAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgyKSwgIFBFUklQSF9BLCAwKTsJLyogREFUQTggICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDMpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBOSAgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoNCksICBQRVJJUEhfQSwgMCk7CS8qIERBVEExMCAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCg1KSwgIFBFUklQSF9BLCAwKTsJLyogREFUQTExICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDYpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTIgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoNyksICBQRVJJUEhfQSwgMCk7CS8qIERBVEExMyAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCg4KSwgIFBFUklQSF9BLCAwKTsJLyogREFUQTE0ICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDkpLCAgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTUgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMTApLCBQRVJJUEhfQSwgMCk7CS8qIERBVEExNiAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxMSksIFBFUklQSF9BLCAwKTsJLyogREFUQTE3ICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDEyKSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMTggKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMTMpLCBQRVJJUEhfQSwgMCk7CS8qIERBVEExOSAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxNCksIFBFUklQSF9BLCAwKTsJLyogREFUQTIwICovCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBEKDE1KSwgUEVSSVBIX0EsIDApOwkvKiBEQVRBMjEgKi8KKwkJc2VsZWN0X3BlcmlwaGVyYWwoUEQoMTYpLCBQRVJJUEhfQSwgMCk7CS8qIERBVEEyMiAqLworCQlzZWxlY3RfcGVyaXBoZXJhbChQRCgxNyksIFBFUklQSF9BLCAwKTsJLyogREFUQTIzICovCiAKIAkJY2xrX3NldF9wYXJlbnQoJmxjZGMwX3BpeGNsaywgJnBsbDApOwogCQljbGtfc2V0X3JhdGUoJmxjZGMwX3BpeGNsaywgY2xrX2dldF9yYXRlKCZwbGwwKSk7CkBAIC04MzgsNiArODY2LDggQEAKIAkmYXRtZWxfdXNhcnQzX3VzYXJ0LAogCSZtYWNiMF9oY2xrLAogCSZtYWNiMF9wY2xrLAorCSZtYWNiMV9oY2xrLAorCSZtYWNiMV9wY2xrLAogCSZzcGkwX21jaywKIAkmbGNkYzBfaGNsaywKIAkmbGNkYzBfcGl4Y2xrLApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9leHRpbnQuYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvZXh0aW50LmMKaW5kZXggNGRmZjFmOS4uYjU5MjcyZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9leHRpbnQuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2V4dGludC5jCkBAIC00OSwxMiArNDksMjUgQEAKIHN0YXRpYyBpbnQgZWltX3NldF9pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQogewogCXN0cnVjdCBhdDMyX3NtICpzbSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXVuc2lnbmVkIGludCBpID0gaXJxIC0gc20tPmVpbV9maXJzdF9pcnE7CiAJdTMyIG1vZGUsIGVkZ2UsIGxldmVsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKLQlmbG93X3R5cGUgJj0gSVJRX1RZUEVfU0VOU0VfTUFTSzsKKwlpZiAoZmxvd190eXBlID09IElSUV9UWVBFX05PTkUpCisJCWZsb3dfdHlwZSA9IElSUV9UWVBFX0xFVkVMX0xPVzsKKworCWRlc2MgPSAmaXJxX2Rlc2NbaXJxXTsKKwlkZXNjLT5zdGF0dXMgJj0gfihJUlFfVFlQRV9TRU5TRV9NQVNLIHwgSVJRX0xFVkVMKTsKKwlkZXNjLT5zdGF0dXMgfD0gZmxvd190eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSzsKKworCWlmIChmbG93X3R5cGUgJiAoSVJRX1RZUEVfTEVWRUxfTE9XIHwgSVJRX1RZUEVfTEVWRUxfSElHSCkpIHsKKwkJZGVzYy0+c3RhdHVzIHw9IElSUV9MRVZFTDsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJfSBlbHNlIHsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc20tPmxvY2ssIGZsYWdzKTsKIApAQCAtMTQ4LDEwICsxNjEsMTUgQEAKIAlwYXR0ZXJuID0gc21fcmVhZGwoc20sIEVJTV9NT0RFKTsKIAlucl9pcnFzID0gZmxzKHBhdHRlcm4pOwogCisJLyogVHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2UgdW5sZXNzIG92ZXJyaWRkZW4gYnkgZHJpdmVyICovCisJc21fd3JpdGVsKHNtLCBFSU1fTU9ERSwgMFVMKTsKKwlzbV93cml0ZWwoc20sIEVJTV9FREdFLCAwVUwpOworCiAJc20tPmVpbV9jaGlwID0gJmVpbV9jaGlwOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewotCQlzZXRfaXJxX2NoaXAoc20tPmVpbV9maXJzdF9pcnEgKyBpLCAmZWltX2NoaXApOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoc20tPmVpbV9maXJzdF9pcnEgKyBpLCAmZWltX2NoaXAsCisJCQkJCSBoYW5kbGVfZWRnZV9pcnEpOwogCQlzZXRfaXJxX2NoaXBfZGF0YShzbS0+ZWltX2ZpcnN0X2lycSArIGksIHNtKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaHNtYy5oIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmgKaW5kZXggNTY4MTI3Ni4uZDFkNDhlMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9oc21jLmgKQEAgLTEyMCw4ICsxMjAsOCBAQAogCiAvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIGhzbWNfcmVhZGwocG9ydCxyZWcpCQkJCQkJXAotCXJlYWRsKChwb3J0KS0+cmVncyArIEhTTUNfIyNyZWcpCisJX19yYXdfcmVhZGwoKHBvcnQpLT5yZWdzICsgSFNNQ18jI3JlZykKICNkZWZpbmUgaHNtY193cml0ZWwocG9ydCxyZWcsdmFsdWUpCQkJCQlcCi0Jd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIEhTTUNfIyNyZWcpCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIEhTTUNfIyNyZWcpCiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9IU01DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbnRjLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwppbmRleCBlYjg3YTE4Li5kZDVjMDA5IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuYwpAQCAtMTM2LDMgKzEzNiw3IEBACiAJcGFuaWMoIkludGVycnVwdCBjb250cm9sbGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCFcbiIpOwogfQogCit1bnNpZ25lZCBsb25nIGludGNfZ2V0X3BlbmRpbmcoaW50IGdyb3VwKQoreworCXJldHVybiBpbnRjX3JlYWRsKCZpbnRjMCwgSU5UUkVRMCArIDQgKiBncm91cCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2ludGMuaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5oCmluZGV4IGQyODljYTIuLjRkMzY2NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW50Yy5oCkBAIC0zMjEsNyArMzIxLDkgQEAKICNkZWZpbmUgSU5UQ19NS0JGKG5hbWUsIHZhbHVlKSAgICAgICAoKCh2YWx1ZSkgJiAoKDEgPDwgSU5UQ18jI25hbWUjI19TSVpFKSAtIDEpKSA8PCBJTlRDXyMjbmFtZSMjX09GRlNFVCkKICNkZWZpbmUgSU5UQ19HRVRCRihuYW1lLCB2YWx1ZSkgICAgICAoKCh2YWx1ZSkgPj4gSU5UQ18jI25hbWUjI19PRkZTRVQpICYgKCgxIDw8IElOVENfIyNuYW1lIyNfU0laRSkgLSAxKSkKIAotI2RlZmluZSBpbnRjX3JlYWRsKHBvcnQscmVnKSAgICAgICAgIHJlYWRsKChwb3J0KS0+cmVncyArIElOVENfIyNyZWcpCi0jZGVmaW5lIGludGNfd3JpdGVsKHBvcnQscmVnLHZhbHVlKSAgd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIElOVENfIyNyZWcpCisjZGVmaW5lIGludGNfcmVhZGwocG9ydCxyZWcpCQkJCQlcCisJX19yYXdfcmVhZGwoKHBvcnQpLT5yZWdzICsgSU5UQ18jI3JlZykKKyNkZWZpbmUgaW50Y193cml0ZWwocG9ydCxyZWcsdmFsdWUpCQkJCVwKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgSU5UQ18jI3JlZykKIAogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX1BFUklIUF9JTlRDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKaW5kZXggZDNhYWJmYy4uZjEyODBlZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCkBAIC0yNSwyNyArMjUsOTggQEAKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3QgY2xrICpjbGs7Ci0JdTMyIGFsbG9jX21hc2s7CisJdTMyIHBpbm11eF9tYXNrOwogCWNoYXIgbmFtZVszMl07CiB9OwogCiBzdGF0aWMgc3RydWN0IHBpb19kZXZpY2UgcGlvX2RldltNQVhfTlJfUElPX0RFVklDRVNdOwogCi12b2lkIHBvcnRtdXhfc2V0X2Z1bmModW5zaWduZWQgaW50IHBvcnRtdXhfaWQsIHVuc2lnbmVkIGludCBwaW5faWQsCi0JCSAgICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbl9pZCkKK3N0YXRpYyBzdHJ1Y3QgcGlvX2RldmljZSAqZ3Bpb190b19waW8odW5zaWduZWQgaW50IGdwaW8pCiB7CiAJc3RydWN0IHBpb19kZXZpY2UgKnBpbzsKLQl1MzIgbWFzayA9IDEgPDwgcGluX2lkOworCXVuc2lnbmVkIGludCBpbmRleDsKIAotCUJVR19PTihwb3J0bXV4X2lkID49IE1BWF9OUl9QSU9fREVWSUNFUyk7CisJaW5kZXggPSBncGlvID4+IDU7CisJaWYgKGluZGV4ID49IE1BWF9OUl9QSU9fREVWSUNFUykKKwkJcmV0dXJuIE5VTEw7CisJcGlvID0gJnBpb19kZXZbaW5kZXhdOworCWlmICghcGlvLT5yZWdzKQorCQlyZXR1cm4gTlVMTDsKIAotCXBpbyA9ICZwaW9fZGV2W3BvcnRtdXhfaWRdOworCXJldHVybiBwaW87Cit9CiAKLQlpZiAoZnVuY3Rpb25faWQpCisvKiBQaW4gbXVsdGlwbGV4aW5nIEFQSSAqLworCit2b2lkIF9faW5pdCBhdDMyX3NlbGVjdF9wZXJpcGgodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHBlcmlwaCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87CisJdW5zaWduZWQgaW50IHBpbl9pbmRleCA9IHBpbiAmIDB4MWY7CisJdTMyIG1hc2sgPSAxIDw8IHBpbl9pbmRleDsKKworCXBpbyA9IGdwaW9fdG9fcGlvKHBpbik7CisJaWYgKHVubGlrZWx5KCFwaW8pKSB7CisJCXByaW50aygicGlvOiBpbnZhbGlkIHBpbiAldVxuIiwgcGluKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICh1bmxpa2VseSh0ZXN0X2FuZF9zZXRfYml0KHBpbl9pbmRleCwgJnBpby0+cGlubXV4X21hc2spKSkgeworCQlwcmludGsoIiVzOiBwaW4gJXUgaXMgYnVzeVxuIiwgcGlvLT5uYW1lLCBwaW5faW5kZXgpOworCQlnb3RvIGZhaWw7CisJfQorCisJcGlvX3dyaXRlbChwaW8sIFBVRVIsIG1hc2spOworCWlmIChwZXJpcGgpCiAJCXBpb193cml0ZWwocGlvLCBCU1IsIG1hc2spOwogCWVsc2UKIAkJcGlvX3dyaXRlbChwaW8sIEFTUiwgbWFzayk7CisKIAlwaW9fd3JpdGVsKHBpbywgUERSLCBtYXNrKTsKKwlpZiAoIShmbGFncyAmIEFUMzJfR1BJT0ZfUFVMTFVQKSkKKwkJcGlvX3dyaXRlbChwaW8sIFBVRFIsIG1hc2spOworCisJcmV0dXJuOworCitmYWlsOgorCWR1bXBfc3RhY2soKTsKK30KKwordm9pZCBfX2luaXQgYXQzMl9zZWxlY3RfZ3Bpbyh1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87CisJdW5zaWduZWQgaW50IHBpbl9pbmRleCA9IHBpbiAmIDB4MWY7CisJdTMyIG1hc2sgPSAxIDw8IHBpbl9pbmRleDsKKworCXBpbyA9IGdwaW9fdG9fcGlvKHBpbik7CisJaWYgKHVubGlrZWx5KCFwaW8pKSB7CisJCXByaW50aygicGlvOiBpbnZhbGlkIHBpbiAldVxuIiwgcGluKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICh1bmxpa2VseSh0ZXN0X2FuZF9zZXRfYml0KHBpbl9pbmRleCwgJnBpby0+cGlubXV4X21hc2spKSkgeworCQlwcmludGsoIiVzOiBwaW4gJXUgaXMgYnVzeVxuIiwgcGlvLT5uYW1lLCBwaW5faW5kZXgpOworCQlnb3RvIGZhaWw7CisJfQorCisJcGlvX3dyaXRlbChwaW8sIFBVRVIsIG1hc2spOworCWlmIChmbGFncyAmIEFUMzJfR1BJT0ZfSElHSCkKKwkJcGlvX3dyaXRlbChwaW8sIFNPRFIsIG1hc2spOworCWVsc2UKKwkJcGlvX3dyaXRlbChwaW8sIENPRFIsIG1hc2spOworCWlmIChmbGFncyAmIEFUMzJfR1BJT0ZfT1VUUFVUKQorCQlwaW9fd3JpdGVsKHBpbywgT0VSLCBtYXNrKTsKKwllbHNlCisJCXBpb193cml0ZWwocGlvLCBPRFIsIG1hc2spOworCisJcGlvX3dyaXRlbChwaW8sIFBFUiwgbWFzayk7CisJaWYgKCEoZmxhZ3MgJiBBVDMyX0dQSU9GX1BVTExVUCkpCisJCXBpb193cml0ZWwocGlvLCBQVURSLCBtYXNrKTsKKworCXJldHVybjsKKworZmFpbDoKKwlkdW1wX3N0YWNrKCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmgKaW5kZXggY2ZlYTEyMy4uNTBmYTNhYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uaAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5oCkBAIC0xNzAsOCArMTcwLDEwIEBACiAjZGVmaW5lIFBJT19CRklOUyhuYW1lLHZhbHVlLG9sZCkgICAgICAgICAgICAgICgoKG9sZCkgJiB+KCgoMSA8PCBQSU9fIyNuYW1lIyNfU0laRSkgLSAxKSA8PCBQSU9fIyNuYW1lIyNfT0ZGU0VUKSkgfCBQSU9fQkYobmFtZSx2YWx1ZSkpCiAKIC8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KLSNkZWZpbmUgcGlvX3JlYWRsKHBvcnQscmVnKSAgICAgICAgICAgICAgICAgICAgcmVhZGwoKHBvcnQpLT5yZWdzICsgUElPXyMjcmVnKQotI2RlZmluZSBwaW9fd3JpdGVsKHBvcnQscmVnLHZhbHVlKSAgICAgICAgICAgICB3cml0ZWwoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgUElPXyMjcmVnKQorI2RlZmluZSBwaW9fcmVhZGwocG9ydCxyZWcpCQkJCQlcCisJX19yYXdfcmVhZGwoKHBvcnQpLT5yZWdzICsgUElPXyMjcmVnKQorI2RlZmluZSBwaW9fd3JpdGVsKHBvcnQscmVnLHZhbHVlKQkJCQlcCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIFBJT18jI3JlZykKIAogdm9pZCBhdDMyX2luaXRfcGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3NtLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3NtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMzA2ZWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9zbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBTeXN0ZW0gTWFuYWdlciBkcml2ZXIgZm9yIEFUMzJBUCBDUFVzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2IEF0bWVsIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2luY2x1ZGUgPGFzbS9pbnRjLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvc20uaD4KLQotI2luY2x1ZGUgInNtLmgiCi0KLSNkZWZpbmUgU01fRUlNX0lSUV9SRVNPVVJDRQkxCi0jZGVmaW5lIFNNX1BNX0lSUV9SRVNPVVJDRQkyCi0jZGVmaW5lIFNNX1JUQ19JUlFfUkVTT1VSQ0UJMwotCi0jZGVmaW5lIHRvX2VpbShpcnFjKSBjb250YWluZXJfb2YoaXJxYywgc3RydWN0IGF0MzJfc20sIGlycWMpCi0KLXN0cnVjdCBhdDMyX3NtIHN5c3RlbV9tYW5hZ2VyOwotCi1pbnQgX19pbml0IGF0MzJfc21faW5pdCh2b2lkKQotewotCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKLQlzdHJ1Y3QgYXQzMl9zbSAqc20gPSAmc3lzdGVtX21hbmFnZXI7Ci0JaW50IHJldCA9IC1FTlhJTzsKLQotCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoJmF0MzJfc21fZGV2aWNlLCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZWdzKQotCQlnb3RvIGZhaWw7Ci0KLQlzcGluX2xvY2tfaW5pdCgmc20tPmxvY2spOwotCXNtLT5wZGV2ID0gJmF0MzJfc21fZGV2aWNlOwotCi0JcmV0ID0gLUVOT01FTTsKLQlzbS0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlZ3MtPmVuZCAtIHJlZ3MtPnN0YXJ0ICsgMSk7Ci0JaWYgKCFzbS0+cmVncykKLQkJZ290byBmYWlsOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBTeXN0ZW0gTWFuYWdlcjogJWRcbiIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEV4dGVybmFsIEludGVycnVwdCBNb2R1bGUgKEVJTSkuCi0gKgotICogRUlNIGdldHMgbGV2ZWwtIG9yIGVkZ2UtdHJpZ2dlcmVkIGludGVycnVwdHMgb2YgZWl0aGVyIHBvbGFyaXR5Ci0gKiBmcm9tIHRoZSBvdXRzaWRlIGFuZCBjb252ZXJ0cyBpdCB0byBhY3RpdmUtaGlnaCBsZXZlbC10cmlnZ2VyZWQKLSAqIGludGVycnVwdHMgdGhhdCB0aGUgaW50ZXJuYWwgaW50ZXJydXB0IGNvbnRyb2xsZXIgY2FuIGhhbmRsZS4gRUlNCi0gKiBhbHNvIHByb3ZpZGVzIG1hc2tpbmcvdW5tYXNraW5nIG9mIGludGVycnVwdHMsIGFzIHdlbGwgYXMKLSAqIGFja25vd2xlZGdpbmcgb2YgZWRnZS10cmlnZ2VyZWQgaW50ZXJydXB0cy4KLSAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc3B1cmlvdXNfZWltX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCi0JCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgRUlNIGludGVycnVwdCAlZFxuIiwgaXJxKTsKLQlkaXNhYmxlX2lycShpcnEpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gZWltX3NwdXJpb3VzX2FjdGlvbiA9IHsKLQkuaGFuZGxlciA9IHNwdXJpb3VzX2VpbV9pbnRlcnJ1cHQsCi19OwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZWltX2hhbmRsZV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKiBpcnFjID0gZGV2X2lkOwotCXN0cnVjdCBhdDMyX3NtICpzbSA9IHRvX2VpbShpcnFjKTsKLQl1bnNpZ25lZCBsb25nIHBlbmRpbmc7Ci0KLQkvKgotCSAqIE5vIG5lZWQgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGdsb2JhbGx5LiAgVGhlIGludGVycnVwdAotCSAqIGxldmVsIHJlbGV2YW50IHRvIHRoaXMgZ3JvdXAgbXVzdCBiZSBtYXNrZWQgYWxsIHRoZSB0aW1lLAotCSAqIHNvIHdlIGtub3cgdGhhdCB0aGlzIHBhcnRpY3VsYXIgRUlNIGluc3RhbmNlIHdpbGwgbm90IGJlCi0JICogcmUtZW50ZXJlZC4KLQkgKi8KLQlzcGluX2xvY2soJnNtLT5sb2NrKTsKLQotCXBlbmRpbmcgPSBpbnRjX2dldF9wZW5kaW5nKHNtLT5pcnFjLmlycV9ncm91cCk7Ci0JaWYgKHVubGlrZWx5KCFwZW5kaW5nKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVJTSAoZ3JvdXAgJXUpOiBObyBpbnRlcnJ1cHRzIHBlbmRpbmchXG4iLAotCQkgICAgICAgc20tPmlycWMuaXJxX2dyb3VwKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JZG8gewotCQlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb247Ci0JCXVuc2lnbmVkIGludCBpOwotCi0JCWkgPSBmbHMocGVuZGluZykgLSAxOwotCQlwZW5kaW5nICY9IH4oMSA8PCBpKTsKLQkJYWN0aW9uID0gc20tPmFjdGlvbltpXTsKLQotCQkvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCi0JCXNtX3dyaXRlbChzbSwgRUlNX0lDUiwgMSA8PCBpKTsKLQotCQlzcGluX3VubG9jaygmc20tPmxvY2spOwotCi0JCWlmIChhY3Rpb24tPmZsYWdzICYgU0FfSU5URVJSVVBUKQotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJYWN0aW9uLT5oYW5kbGVyKHNtLT5pcnFjLmZpcnN0X2lycSArIGksIGFjdGlvbi0+ZGV2X2lkLCByZWdzKTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQlzcGluX2xvY2soJnNtLT5sb2NrKTsKLQkJaWYgKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TQU1QTEVfUkFORE9NKQotCQkJYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKHNtLT5pcnFjLmZpcnN0X2lycSArIGkpOwotCX0gd2hpbGUgKHBlbmRpbmcpOwotCi11bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJnNtLT5sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGVpbV9tYXNrKHN0cnVjdCBpcnFfY29udHJvbGxlciAqaXJxYywgdW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgYXQzMl9zbSAqc20gPSB0b19laW0oaXJxYyk7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpID0gaXJxIC0gc20tPmlycWMuZmlyc3RfaXJxOwotCXNtX3dyaXRlbChzbSwgRUlNX0lEUiwgMSA8PCBpKTsKLX0KLQotc3RhdGljIHZvaWQgZWltX3VubWFzayhzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmlycWMsIHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGF0MzJfc20gKnNtID0gdG9fZWltKGlycWMpOwotCXVuc2lnbmVkIGludCBpOwotCi0JaSA9IGlycSAtIHNtLT5pcnFjLmZpcnN0X2lycTsKLQlzbV93cml0ZWwoc20sIEVJTV9JRVIsIDEgPDwgaSk7Ci19Ci0KLXN0YXRpYyBpbnQgZWltX3NldHVwKHN0cnVjdCBpcnFfY29udHJvbGxlciAqaXJxYywgdW5zaWduZWQgaW50IGlycSwKLQkJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQotewotCXN0cnVjdCBhdDMyX3NtICpzbSA9IHRvX2VpbShpcnFjKTsKLQlzbS0+YWN0aW9uW2lycSAtIHNtLT5pcnFjLmZpcnN0X2lycV0gPSBhY3Rpb247Ci0JLyogQWNrbm93bGVkZ2UgZWFybGllciBpbnRlcnJ1cHRzICovCi0Jc21fd3JpdGVsKHNtLCBFSU1fSUNSLCAoMTw8KGlycSAtIHNtLT5pcnFjLmZpcnN0X2lycSkpKTsKLQllaW1fdW5tYXNrKGlycWMsIGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGVpbV9mcmVlKHN0cnVjdCBpcnFfY29udHJvbGxlciAqaXJxYywgdW5zaWduZWQgaW50IGlycSwKLQkJdm9pZCAqZGV2KQotewotCXN0cnVjdCBhdDMyX3NtICpzbSA9IHRvX2VpbShpcnFjKTsKLQllaW1fbWFzayhpcnFjLCBpcnEpOwotCXNtLT5hY3Rpb25baXJxIC0gc20tPmlycWMuZmlyc3RfaXJxXSA9ICZlaW1fc3B1cmlvdXNfYWN0aW9uOwotfQotCi1zdGF0aWMgaW50IGVpbV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmlycWMsIHVuc2lnbmVkIGludCBpcnEsCi0JCQl1bnNpZ25lZCBpbnQgdHlwZSkKLXsKLQlzdHJ1Y3QgYXQzMl9zbSAqc20gPSB0b19laW0oaXJxYyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsdWUsIHBhdHRlcm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc20tPmxvY2ssIGZsYWdzKTsKLQotCXBhdHRlcm4gPSAxIDw8IChpcnEgLSBzbS0+aXJxYy5maXJzdF9pcnEpOwotCi0JdmFsdWUgPSBzbV9yZWFkbChzbSwgRUlNX01PREUpOwotCWlmICh0eXBlICYgSVJRX1RZUEVfTEVWRUwpCi0JCXZhbHVlIHw9IHBhdHRlcm47Ci0JZWxzZQotCQl2YWx1ZSAmPSB+cGF0dGVybjsKLQlzbV93cml0ZWwoc20sIEVJTV9NT0RFLCB2YWx1ZSk7Ci0JdmFsdWUgPSBzbV9yZWFkbChzbSwgRUlNX0VER0UpOwotCWlmICh0eXBlICYgSVJRX0VER0VfUklTSU5HKQotCQl2YWx1ZSB8PSBwYXR0ZXJuOwotCWVsc2UKLQkJdmFsdWUgJj0gfnBhdHRlcm47Ci0Jc21fd3JpdGVsKHNtLCBFSU1fRURHRSwgdmFsdWUpOwotCXZhbHVlID0gc21fcmVhZGwoc20sIEVJTV9MRVZFTCk7Ci0JaWYgKHR5cGUgJiBJUlFfTEVWRUxfSElHSCkKLQkJdmFsdWUgfD0gcGF0dGVybjsKLQllbHNlCi0JCXZhbHVlICY9IH5wYXR0ZXJuOwotCXNtX3dyaXRlbChzbSwgRUlNX0xFVkVMLCB2YWx1ZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbS0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZWltX2dldF90eXBlKHN0cnVjdCBpcnFfY29udHJvbGxlciAqaXJxYywKLQkJCQkgdW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgYXQzMl9zbSAqc20gPSB0b19laW0oaXJxYyk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgdHlwZSA9IDA7Ci0JdTMyIG1vZGUsIGVkZ2UsIGxldmVsLCBwYXR0ZXJuOwotCi0JcGF0dGVybiA9IDEgPDwgKGlycSAtIHNtLT5pcnFjLmZpcnN0X2lycSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc20tPmxvY2ssIGZsYWdzKTsKLQltb2RlID0gc21fcmVhZGwoc20sIEVJTV9NT0RFKTsKLQllZGdlID0gc21fcmVhZGwoc20sIEVJTV9FREdFKTsKLQlsZXZlbCA9IHNtX3JlYWRsKHNtLCBFSU1fTEVWRUwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAobW9kZSAmIHBhdHRlcm4pCi0JCXR5cGUgfD0gSVJRX1RZUEVfTEVWRUw7Ci0JaWYgKGVkZ2UgJiBwYXR0ZXJuKQotCQl0eXBlIHw9IElSUV9FREdFX1JJU0lORzsKLQlpZiAobGV2ZWwgJiBwYXR0ZXJuKQotCQl0eXBlIHw9IElSUV9MRVZFTF9ISUdIOwotCi0JcmV0dXJuIHR5cGU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXJfY2xhc3MgZWltX2lycV9jbGFzcyA9IHsKLQkudHlwZW5hbWUJPSAiRUlNIiwKLQkuaGFuZGxlCQk9IGVpbV9oYW5kbGVfaXJxLAotCS5zZXR1cAkJPSBlaW1fc2V0dXAsCi0JLmZyZWUJCT0gZWltX2ZyZWUsCi0JLm1hc2sJCT0gZWltX21hc2ssCi0JLnVubWFzawkJPSBlaW1fdW5tYXNrLAotCS5zZXRfdHlwZQk9IGVpbV9zZXRfdHlwZSwKLQkuZ2V0X3R5cGUJPSBlaW1fZ2V0X3R5cGUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBlaW1faW5pdCh2b2lkKQotewotCXN0cnVjdCBhdDMyX3NtICpzbSA9ICZzeXN0ZW1fbWFuYWdlcjsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1MzIgcGF0dGVybjsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBUaGUgRUlNIGlzIHJlYWxseSB0aGUgc2FtZSBtb2R1bGUgYXMgU00sIHNvIHJlZ2lzdGVyCi0JICogbWFwcGluZywgZXRjLiBoYXMgYmVlbiB0YWtlbiBjYXJlIG9mIGFscmVhZHkuCi0JICovCi0KLQkvKgotCSAqIEZpbmQgb3V0IGhvdyBtYW55IGludGVycnVwdCBsaW5lcyB0aGF0IGFyZSBhY3R1YWxseQotCSAqIGltcGxlbWVudGVkIGluIGhhcmR3YXJlLgotCSAqLwotCXNtX3dyaXRlbChzbSwgRUlNX0lEUiwgfjBVTCk7Ci0Jc21fd3JpdGVsKHNtLCBFSU1fTU9ERSwgfjBVTCk7Ci0JcGF0dGVybiA9IHNtX3JlYWRsKHNtLCBFSU1fTU9ERSk7Ci0Jc20tPmlycWMubnJfaXJxcyA9IGZscyhwYXR0ZXJuKTsKLQotCXJldCA9IC1FTk9NRU07Ci0Jc20tPmFjdGlvbiA9IGttYWxsb2Moc2l6ZW9mKCpzbS0+YWN0aW9uKSAqIHNtLT5pcnFjLm5yX2lycXMsCi0JCQkgICAgIEdGUF9LRVJORUwpOwotCWlmICghc20tPmFjdGlvbikKLQkJZ290byBvdXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc20tPmlycWMubnJfaXJxczsgaSsrKQotCQlzbS0+YWN0aW9uW2ldID0gJmVpbV9zcHVyaW91c19hY3Rpb247Ci0KLQlzcGluX2xvY2tfaW5pdCgmc20tPmxvY2spOwotCXNtLT5pcnFjLmlycV9ncm91cCA9IHNtLT5wZGV2LT5yZXNvdXJjZVtTTV9FSU1fSVJRX1JFU09VUkNFXS5zdGFydDsKLQlzbS0+aXJxYy5jbGFzcyA9ICZlaW1faXJxX2NsYXNzOwotCi0JcmV0ID0gaW50Y19yZWdpc3Rlcl9jb250cm9sbGVyKCZzbS0+aXJxYyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfYWN0aW9uczsKLQotCXByaW50aygiRUlNOiBFeHRlcm5hbCBJbnRlcnJ1cHQgTW9kdWxlIGF0IDB4JXAsIElSUSBncm91cCAldVxuIiwKLQkgICAgICAgc20tPnJlZ3MsIHNtLT5pcnFjLmlycV9ncm91cCk7Ci0JcHJpbnRrKCJFSU06IEhhbmRsaW5nICV1IGV4dGVybmFsIElSUXMsIHN0YXJ0aW5nIHdpdGggSVJRJXVcbiIsCi0JICAgICAgIHNtLT5pcnFjLm5yX2lycXMsIHNtLT5pcnFjLmZpcnN0X2lycSk7Ci0KLQlyZXR1cm4gMDsKLQotb3V0X2ZyZWVfYWN0aW9uczoKLQlrZnJlZShzbS0+YWN0aW9uKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotYXJjaF9pbml0Y2FsbChlaW1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3NtLmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3NtLmgKaW5kZXggMjc1NjU4Mi4uY2FkMDJiNSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9zbS5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvc20uaApAQCAtMjM0LDcgKzIzNCw5IEBACiAjZGVmaW5lIFNNX0JGSU5TKG5hbWUsdmFsdWUsb2xkKSAgICAgICAgICAgICAgICAoKChvbGQpICYgfigoKDEgPDwgU01fIyNuYW1lIyNfU0laRSkgLSAxKSA8PCBTTV8jI25hbWUjI19PRkZTRVQpKSB8IFNNX0JGKG5hbWUsdmFsdWUpKQogCiAvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCi0jZGVmaW5lIHNtX3JlYWRsKHBvcnQscmVnKSAgICAgICAgICAgICAgICAgICAgICByZWFkbCgocG9ydCktPnJlZ3MgKyBTTV8jI3JlZykKLSNkZWZpbmUgc21fd3JpdGVsKHBvcnQscmVnLHZhbHVlKSAgICAgICAgICAgICAgIHdyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyBTTV8jI3JlZykKKyNkZWZpbmUgc21fcmVhZGwocG9ydCxyZWcpCQkJCQlcCisJX19yYXdfcmVhZGwoKHBvcnQpLT5yZWdzICsgU01fIyNyZWcpCisjZGVmaW5lIHNtX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkJCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyBTTV8jI3JlZykKIAogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX1NNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tbS9kbWEtY29oZXJlbnQuYyBiL2FyY2gvYXZyMzIvbW0vZG1hLWNvaGVyZW50LmMKaW5kZXggNDRhYjhhNy4uYjY4ZDY2OSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9kbWEtY29oZXJlbnQuYworKysgYi9hcmNoL2F2cjMyL21tL2RtYS1jb2hlcmVudC5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKLXZvaWQgZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQordm9pZCBkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKIAkvKgogCSAqIE5vIG5lZWQgdG8gc3luYyBhbiB1bmNhY2hlZCBhcmVhCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21tL2luaXQuYyBiL2FyY2gvYXZyMzIvbW0vaW5pdC5jCmluZGV4IDNlNmM0MTAuLjcwZGE2ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXZyMzIvbW0vaW5pdC5jCkBAIC0yMDYsNyArMjA2LDcgQEAKIAogCWlmIChtZW1fcmFtZGlzaykgewogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCQlpbml0cmRfc3RhcnQgPSBfX3ZhKG1lbV9yYW1kaXNrLT5hZGRyKTsKKwkJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX192YShtZW1fcmFtZGlzay0+YWRkcik7CiAJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBtZW1fcmFtZGlzay0+c2l6ZTsKIAogCQlwcmludF9tZW1vcnlfbWFwKCJSQU1ESVNLIGltYWdlcyIsIG1lbV9yYW1kaXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vaW9yZW1hcC5jIGIvYXJjaC9hdnIzMi9tbS9pb3JlbWFwLmMKaW5kZXggOGNmZWM2NS4uMzQzN2M4MiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC9hdnIzMi9tbS9pb3JlbWFwLmMKQEAgLTc3LDYgKzc3LDggQEAKIAogCWlmICgodW5zaWduZWQgbG9uZylhZGRyID49IFA0U0VHKQogCQlyZXR1cm47CisJaWYgKFBYU0VHKGFkZHIpID09IFAyU0VHKQorCQlyZXR1cm47CiAKIAlwID0gcmVtb3ZlX3ZtX2FyZWEoKHZvaWQgKikoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyKSk7CiAJaWYgKHVubGlrZWx5KCFwKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL0tjb25maWcgYi9hcmNoL2NyaXMvS2NvbmZpZwppbmRleCA2YTEyMzhhLi4zNDc0MzA5IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvS2NvbmZpZworKysgYi9hcmNoL2NyaXMvS2NvbmZpZwpAQCAtMTYsNiArMTYsMTQgQEAKIGNvbmZpZyBSV1NFTV9YQ0hHQUREX0FMR09SSVRITQogCWJvb2wKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogY29uZmlnIEdFTkVSSUNfRklORF9ORVhUX0JJVAogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9LY29uZmlnIGIvYXJjaC9jcmlzL2FyY2gtdjEwL0tjb25maWcKaW5kZXggNDRlYjFiOS4uYzdlYTllZiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL0tjb25maWcKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL0tjb25maWcKQEAgLTMyMyw3ICszMjMsNyBAQAogCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMTAKIAlkZWZhdWx0ICI5NWE2IgogCWhlbHAKLQkgIFdhaXRzdGF0ZXMgZm9yIFNSQU0sIEZsYXNoIGFuZCBwZXJpcGhlcmlhbHMgKG5vdCBEUkFNKS4gIDk1ZjggaXMgYQorCSAgV2FpdHN0YXRlcyBmb3IgU1JBTSwgRmxhc2ggYW5kIHBlcmlwaGVyYWxzIChub3QgRFJBTSkuICA5NWY4IGlzIGEKIAkgIGdvb2QgY2hvaWNlIGZvciBtb3N0IEF4aXMgcHJvZHVjdHMuLi4KIAogY29uZmlnIEVUUkFYX0RFRl9SX0JVU19DT05GSUcKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL0tjb25maWcgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9LY29uZmlnCmluZGV4IDczNGQ1ZjMuLmU3ZTcyNGJjIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9LY29uZmlnCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL0tjb25maWcKQEAgLTgzOSw3ICs4MzksNyBAQAogCWRlZmF1bHQgIjAiCiAJaGVscAogCSAgVGhpcyBjb250cm9scyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgdHJpY2tsZSBjaGFyZ2UgcmVnaXN0ZXIuCi0JICAwID0gZGlzYWJsZWQgKHVzZSB0aGlzIGlmIHlvdSBhcmUgdW5zdXJlIG9yIGhhdmUgYSBub24gcmVjaGFyZ2FibGUgYmF0dGVyeSkKKwkgIDAgPSBkaXNhYmxlZCAodXNlIHRoaXMgaWYgeW91IGFyZSB1bnN1cmUgb3IgaGF2ZSBhIG5vbiByZWNoYXJnZWFibGUgYmF0dGVyeSkKIAkgIE90aGVyd2lzZSB0aGUgZm9sbG93aW5nIHZhbHVlcyBjYW4gYmUgT1I6ZWQgdG9nZXRoZXIgdG8gY29udHJvbCB0aGUKIAkgIGNoYXJnZSBjdXJyZW50OgogCSAgMSA9IDJrb2htLCAyID0gNGtvaG0sIDMgPSA0a29obQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvYXhpc2ZsYXNobWFwLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9heGlzZmxhc2htYXAuYwppbmRleCA0ZmE4MWFiLi5mZmFkZTE5IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9heGlzZmxhc2htYXAuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9heGlzZmxhc2htYXAuYwpAQCAtNTE2LDcgKzUxNiw3IEBACiAjZWxzZQogCQlzdHJ1Y3QgbXRkX2luZm8gKm10ZF9yYW07CiAKLQkJbXRkX3JhbSA9IChzdHJ1Y3QgbXRkX2luZm8gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLAorCQltdGRfcmFtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwKIAkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghbXRkX3JhbSkgewogCQkJcGFuaWMoImF4aXNmbGFzaG1hcCBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2VlcHJvbS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvZWVwcm9tLmMKaW5kZXggNmUxZjE5MS4uMjg0ZWJmZCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvZWVwcm9tLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvZWVwcm9tLmMKQEAgLTEsNyArMSw3IEBACiAvKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiEKLSohICBJbXBsZW1lbnRzIGFuIGludGVyZmFjZSBmb3IgaTJjIGNvbXBhdGlibGUgZWVwcm9tcyB0byBydW4gdW5kZXIgbGludXguCi0qISAgU3VwcG9ydHMgMmssIDhrKD8pIGFuZCAxNmsuIFVzZXMgYWRhcHRpdmUgdGltaW5nIGFkanVzdGVudHMgYnkKKyohICBJbXBsZW1lbnRzIGFuIGludGVyZmFjZSBmb3IgaTJjIGNvbXBhdGlibGUgZWVwcm9tcyB0byBydW4gdW5kZXIgTGludXguCisqISAgU3VwcG9ydHMgMmssIDhrKD8pIGFuZCAxNmsuIFVzZXMgYWRhcHRpdmUgdGltaW5nIGFkanVzdG1lbnRzIGJ5CiAqISAgSm9oYW4uQWRvbGZzc29uQGF4aXMuY29tCiAqIQogKiEgIFByb2JpbmcgcmVzdWx0czoKQEAgLTUxLDcgKzUxLDcgQEAKICohICBSZXZpc2lvbiAxLjggIDIwMDEvMDYvMTUgMTM6MjQ6MjkgIGpvbmFzaGcKICohICAqIEFkZGVkIHZlcmlmaWNhdGlvbiBvZiBwb2ludGVycyBmcm9tIHVzZXJzcGFjZSBpbiByZWFkIGFuZCB3cml0ZS4KICohICAqIE1hZGUgYnVzeSBjb3VudGVyIHZvbGF0aWxlLgotKiEgICogQWRkZWQgZGVmaW5lIGZvciBpbml0YWwgd3JpdGUgZGVsYXkuCisqISAgKiBBZGRlZCBkZWZpbmUgZm9yIGluaXRpYWwgd3JpdGUgZGVsYXkuCiAqISAgKiBSZW1vdmVkIHdhcm5pbmdzIGJ5IHVzaW5nIGxvZmZfdCBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuCiAqIQogKiEgIFJldmlzaW9uIDEuNyAgMjAwMS8wNi8xNCAxNToyNjo1NCAgam9uYXNoZwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvZ3Bpby5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvZ3Bpby5jCmluZGV4IGZjYmE2NjMuLjlhYmExOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2dwaW8uYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9ncGlvLmMKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCWlmIChwID4gR1BJT19NSU5PUl9MQVNUKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByaXYgPSAoc3RydWN0IGdwaW9fcHJpdmF0ZSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBncGlvX3ByaXZhdGUpLCAKKwlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdwaW9fcHJpdmF0ZSksCiAJCQkJCSAgICAgIEdGUF9LRVJORUwpOwogCiAJaWYgKCFwcml2KQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvaTJjLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9pMmMuYwppbmRleCA2MTE0NTk2Li4wOTJjNzI0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9pMmMuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9pMmMuYwpAQCAtNDcsNyArNDcsNyBAQAogKiEgVXBkYXRlIFBvcnQgQiByZWdpc3RlciBhbmQgc2hhZG93IGV2ZW4gd2hlbiBydW5uaW5nIHdpdGggaGFyZHdhcmUgc3VwcG9ydAogKiEgICB0byBhdm9pZCBnbGl0Y2hlcyB3aGVuIHJlYWRpbmcgYml0cwogKiEgTmV2ZXIgc2V0IGRpcmVjdGlvbiB0byBvdXQgaW4gaTJjX2luYnl0ZQotKiEgUmVtb3ZlZCBpbmNvcnJlY3QgY2xvY2sgdG9nbGluZyBhdCBlbmQgb2YgaTJjX2luYnl0ZQorKiEgUmVtb3ZlZCBpbmNvcnJlY3QgY2xvY2sgdG9nZ2xpbmcgYXQgZW5kIG9mIGkyY19pbmJ5dGUKICohCiAqISBSZXZpc2lvbiAxLjggIDIwMDIvMDgvMTMgMDY6MzE6NTMgIHN0YXJ2aWsKICohIE1hZGUgU0RBIGFuZCBTQ0wgbGluZSBjb25maWd1cmFibGUKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwva2dkYi5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9rZ2RiLmMKaW5kZXggMzQ1MjhkYS4uMDc2MjhhMSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9rZ2RiLmMKQEAgLTMzLDcgKzMzLDcgQEAKICohCiAqISBSZXZpc2lvbiAxLjIgIDIwMDIvMTEvMTkgMTQ6MzU6MjQgIHN0YXJ2aWsKICohIENoYW5nZXMgZnJvbSBsaW51eCAyLjQKLSohIENoYW5nZWQgc3RydWN0IGluaXRpYWxpemVyIHN5bnRheCB0byB0aGUgY3VycmVudGx5IHByZWZlcmVkIG5vdGF0aW9uCisqISBDaGFuZ2VkIHN0cnVjdCBpbml0aWFsaXplciBzeW50YXggdG8gdGhlIGN1cnJlbnRseSBwcmVmZXJyZWQgbm90YXRpb24KICohCiAqISBSZXZpc2lvbiAxLjEgIDIwMDEvMTIvMTcgMTM6NTk6MjcgIGJqb3JudwogKiEgSW5pdGlhbCByZXZpc2lvbgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9vbGRfY2hlY2tzdW0uYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvb2xkX2NoZWNrc3VtLmMKaW5kZXggMjJhNmYwYS4uNDk3NjM0YSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9vbGRfY2hlY2tzdW0uYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvbGliL29sZF9jaGVja3N1bS5jCkBAIC00NywzOSArNDcsNDEgQEAKIAogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpwLCBpbnQgbGVuLCBfX3dzdW0gX19zdW0pCiB7Ci0gIC8qCi0gICAqIEV4cGVyaW1lbnRzIHdpdGggZXRoZXJuZXQgYW5kIHNsaXAgY29ubmVjdGlvbnMgc2hvdyB0aGF0IGJ1ZmYKLSAgICogaXMgYWxpZ25lZCBvbiBlaXRoZXIgYSAyLWJ5dGUgb3IgNC1ieXRlIGJvdW5kYXJ5LgotICAgKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kTWFya2VyID0gYnVmZiArIGxlbjsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqbWFya2VyID0gZW5kTWFya2VyIC0gKGxlbiAlIDE2KTsKKwl1MzIgc3VtID0gKF9fZm9yY2UgdTMyKV9fc3VtOworCWNvbnN0IHUxNiAqYnVmZiA9IHA7CisJLyoKKwkqIEV4cGVyaW1lbnRzIHdpdGggZXRoZXJuZXQgYW5kIHNsaXAgY29ubmVjdGlvbnMgc2hvdyB0aGF0IGJ1ZmYKKwkqIGlzIGFsaWduZWQgb24gZWl0aGVyIGEgMi1ieXRlIG9yIDQtYnl0ZSBib3VuZGFyeS4KKwkqLworCWNvbnN0IHZvaWQgKmVuZE1hcmtlciA9IHAgKyBsZW47CisJY29uc3Qgdm9pZCAqbWFya2VyID0gZW5kTWFya2VyIC0gKGxlbiAlIDE2KTsKICNpZiAwCi0gIGlmKChpbnQpYnVmZiAmIDB4MykKLSAgICBwcmludGsoInVuYWxpZ25lZCBidWZmICVwXG4iLCBidWZmKTsKLSAgX19kZWxheSg5MDApOyAvKiBleHRyYSBkZWxheSBvZiA5MCB1cyB0byB0ZXN0IHBlcmZvcm1hbmNlIGhpdCAqLworCWlmKChpbnQpYnVmZiAmIDB4MykKKwkJcHJpbnRrKCJ1bmFsaWduZWQgYnVmZiAlcFxuIiwgYnVmZik7CisJX19kZWxheSg5MDApOyAvKiBleHRyYSBkZWxheSBvZiA5MCB1cyB0byB0ZXN0IHBlcmZvcm1hbmNlIGhpdCAqLwogI2VuZGlmCi0gIEJJVE9OOwotICB3aGlsZSAoYnVmZiA8IG1hcmtlcikgewotICAgIHN1bSArPSAqKCh1bnNpZ25lZCBzaG9ydCAqKWJ1ZmYpKys7Ci0gICAgc3VtICs9ICooKHVuc2lnbmVkIHNob3J0ICopYnVmZikrKzsKLSAgICBzdW0gKz0gKigodW5zaWduZWQgc2hvcnQgKilidWZmKSsrOwotICAgIHN1bSArPSAqKCh1bnNpZ25lZCBzaG9ydCAqKWJ1ZmYpKys7Ci0gICAgc3VtICs9ICooKHVuc2lnbmVkIHNob3J0ICopYnVmZikrKzsKLSAgICBzdW0gKz0gKigodW5zaWduZWQgc2hvcnQgKilidWZmKSsrOwotICAgIHN1bSArPSAqKCh1bnNpZ25lZCBzaG9ydCAqKWJ1ZmYpKys7Ci0gICAgc3VtICs9ICooKHVuc2lnbmVkIHNob3J0ICopYnVmZikrKzsKLSAgfQotICBtYXJrZXIgPSBlbmRNYXJrZXIgLSAobGVuICUgMik7Ci0gIHdoaWxlKGJ1ZmYgPCBtYXJrZXIpIHsKLSAgICBzdW0gKz0gKigodW5zaWduZWQgc2hvcnQgKilidWZmKSsrOwotICB9Ci0gIGlmKGVuZE1hcmtlciAtIGJ1ZmYgPiAwKSB7Ci0gICAgc3VtICs9ICpidWZmOyAgICAgICAgICAgICAgICAgLyogYWRkIGV4dHJhIGJ5dGUgc2VwZXJhdGVseSAqLwotICB9Ci0gIEJJVE9GRjsKLSAgcmV0dXJuKHN1bSk7CisJQklUT047CisJd2hpbGUgKGJ1ZmYgPCBtYXJrZXIpIHsKKwkJc3VtICs9ICpidWZmKys7CisJCXN1bSArPSAqYnVmZisrOworCQlzdW0gKz0gKmJ1ZmYrKzsKKwkJc3VtICs9ICpidWZmKys7CisJCXN1bSArPSAqYnVmZisrOworCQlzdW0gKz0gKmJ1ZmYrKzsKKwkJc3VtICs9ICpidWZmKys7CisJCXN1bSArPSAqYnVmZisrOworCX0KKwltYXJrZXIgPSBlbmRNYXJrZXIgLSAobGVuICUgMik7CisJd2hpbGUgKGJ1ZmYgPCBtYXJrZXIpCisJCXN1bSArPSAqYnVmZisrOworCisJaWYgKGVuZE1hcmtlciA+IGJ1ZmYpCisJCXN1bSArPSAqKGNvbnN0IHU4ICopYnVmZjsJLyogYWRkIGV4dHJhIGJ5dGUgc2VwZXJhdGVseSAqLworCisJQklUT0ZGOworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pc3VtOwogfQogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9LY29uZmlnIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvS2NvbmZpZwppbmRleCBhMzMwOTdmLi5mNjQ2MjRmIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9LY29uZmlnCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL0tjb25maWcKQEAgLTg4LDcgKzg4LDcgQEAKIAloZWxwCiAJICBFbmFibGVzIHRoZSBETUE3IGlucHV0IGNoYW5uZWwgZm9yIHNlcjAgKHR0eVMwKS4KIAkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCi0JICB1c2VkIHdoZW4gcmVjZWl2ZWluZyBkYXRhLgorCSAgdXNlZCB3aGVuIHJlY2VpdmluZyBkYXRhLgogCSAgTm9ybWFsbHkgeW91IHdhbnQgdG8gdXNlIERNQSwgdW5sZXNzIHlvdSB1c2UgdGhlIERNQSBjaGFubmVsIGZvcgogCSAgc29tZXRoaW5nIGVsc2UuCiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCWhlbHAKIAkgIEVuYWJsZXMgdGhlIERNQTUgaW5wdXQgY2hhbm5lbCBmb3Igc2VyMSAodHR5UzEpLgogCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKLQkgIHVzZWQgd2hlbiByZWNlaXZlaW5nIGRhdGEuCisJICB1c2VkIHdoZW4gcmVjZWl2aW5nIGRhdGEuCiAJICBOb3JtYWxseSB5b3Ugd2FudCB0aGlzIG9uLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCiAJICBzb21ldGhpbmcgZWxzZS4KIApAQCAtMjI4LDcgKzIyOCw3IEBACiAJaGVscAogCSAgRW5hYmxlcyB0aGUgRE1BMyBpbnB1dCBjaGFubmVsIGZvciBzZXIyICh0dHlTMikuCiAJICBJZiB5b3UgZG8gbm90IGVuYWJsZSBETUEsIGFuIGludGVycnVwdCBmb3IgZWFjaCBjaGFyYWN0ZXIgd2lsbCBiZQotCSAgdXNlZCB3aGVuIHJlY2VpdmVpbmcgZGF0YS4KKwkgIHVzZWQgd2hlbiByZWNlaXZpbmcgZGF0YS4KIAkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKIAkgIHNvbWV0aGluZyBlbHNlLgogCkBAIC0yOTcsNyArMjk3LDcgQEAKIAloZWxwCiAJICBFbmFibGVzIHRoZSBETUE5IGlucHV0IGNoYW5uZWwgZm9yIHNlcjMgKHR0eVMzKS4KIAkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCi0JICB1c2VkIHdoZW4gcmVjZWl2ZWluZyBkYXRhLgorCSAgdXNlZCB3aGVuIHJlY2VpdmluZyBkYXRhLgogCSAgTm9ybWFsbHkgeW91IHdhbnQgdG8gdXNlIERNQSwgdW5sZXNzIHlvdSB1c2UgdGhlIERNQSBjaGFubmVsIGZvcgogCSAgc29tZXRoaW5nIGVsc2UuCiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2F4aXNmbGFzaG1hcC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvYXhpc2ZsYXNobWFwLmMKaW5kZXggNDE5NTIzMi4uNTE4MGQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvYXhpc2ZsYXNobWFwLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvYXhpc2ZsYXNobWFwLmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogI2Vsc2UKIAkJc3RydWN0IG10ZF9pbmZvICptdGRfcmFtOwogCi0JCW10ZF9yYW0gPSAoc3RydWN0IG10ZF9pbmZvICopa21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwKKwkJbXRkX3JhbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbyksCiAJCQkJCQkgICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIW10ZF9yYW0pIHsKIAkJCXBhbmljKCJheGlzZmxhc2htYXAgY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAiCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCmluZGV4IGJhMDk2ZWIuLjI0NDk2MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCkBAIC0yMDUxLDcgKzIwNTEsNiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcnlwdG9jb3BfcHJvY2Vzc19sb2NrLCBwcm9jZXNzX2ZsYWdzKTsKIAogCS8qIEVtcHR5IHRoZSBqb2IgcXVldWUuICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNyeXB0b2NvcF9wcm9jZXNzX2xvY2ssIHByb2Nlc3NfZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBjcnlwdG9jb3BfcHJpb19ub19wcmlvczsgaSsrKXsKIAkJaWYgKCFsaXN0X2VtcHR5KCYoY3J5cHRvY29wX2pvYl9xdWV1ZXNbaV0uam9icykpKXsKIAkJCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCB0bXAsICYoY3J5cHRvY29wX2pvYl9xdWV1ZXNbaV0uam9icykpIHsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2dwaW8uYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2dwaW8uYwppbmRleCBjM2Y4NzZiLi4wOGQzNmYwIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9ncGlvLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvZ3Bpby5jCkBAIC00MjMsNyArNDIzLDcgQEAKIAlpZiAocCA+IEdQSU9fTUlOT1JfTEFTVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcml2ID0gKHN0cnVjdCBncGlvX3ByaXZhdGUgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ3Bpb19wcml2YXRlKSwKKwlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdwaW9fcHJpdmF0ZSksCiAJCQkJCSAgICAgIEdGUF9LRVJORUwpOwogCiAJaWYgKCFwcml2KQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvc3luY19zZXJpYWwuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3N5bmNfc2VyaWFsLmMKaW5kZXggZTA2NzgwNi4uNDI0ZWIwZSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvc3luY19zZXJpYWwuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9zeW5jX3NlcmlhbC5jCkBAIC01MDQsNyArNTA0LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBzeW5jX3NlcmlhbF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewotCWludCBkZXYgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBkZXYgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCXN5bmNfcG9ydCogcG9ydDsKIAlERUJVR1BPTEwoIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJldl9tYXNrID0gMDsgKTsKQEAgLTUzMSw3ICs1MzEsNyBAQAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWludCByZXR1cm5fdmFsID0gMDsKLQlpbnQgZGV2ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgZGV2ID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN5bmNfcG9ydCogcG9ydDsKIAlyZWdfc3Nlcl9yd190cl9jZmcgdHJfY2ZnOwogCXJlZ19zc2VyX3J3X3JlY19jZmcgcmVjX2NmZzsKQEAgLTc4OSw3ICs3ODksNyBAQAogc3RhdGljIHNzaXplX3Qgc3luY19zZXJpYWxfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyICogYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IGRldiA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlzeW5jX3BvcnQgKnBvcnQ7CiAJdW5zaWduZWQgbG9uZyBjLCBjMTsKQEAgLTkxOSw3ICs5MTksNyBAQAogc3RhdGljIHNzaXplX3Qgc3luY19zZXJpYWxfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgKiBidWYsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IGRldiA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQgYXZhaWw7CiAJc3luY19wb3J0ICpwb3J0OwogCXVuc2lnbmVkIGNoYXIqIHN0YXJ0OwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggOTllNTliMy4uN2NkNmFjOCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NpZ25hbC5jCkBAIC02ODYsNyArNjg2LDcgQEAKIGludCBfX2luaXQKIGNyaXNfaW5pdF9zaWduYWwodm9pZCkKIHsKLQl1MTYqIGRhdGEgPSAodTE2KilrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJdTE2KiBkYXRhID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCiAJLyogVGhpcyBpcyBtb3Z1LncgX19OUl9zaWdyZXR1cm4sIHI5OyBicmVhayAxMzsgKi8KIAlkYXRhWzBdID0gMHg5YzVmOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2tlcm5lbC9wcm9maWxlLmMgYi9hcmNoL2NyaXMva2VybmVsL3Byb2ZpbGUuYwppbmRleCA2OWM1MjE4Li5mNjBhYjc4IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMva2VybmVsL3Byb2ZpbGUuYworKysgYi9hcmNoL2NyaXMva2VybmVsL3Byb2ZpbGUuYwpAQCAtNTksNyArNTksNyBAQAogX19pbml0IGluaXRfY3Jpc19wcm9maWxlKHZvaWQpCiB7CiAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7Ci0gIHNhbXBsZV9idWZmZXIgPSAoY2hhciopa21hbGxvYyhTQU1QTEVfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworICBzYW1wbGVfYnVmZmVyID0ga21hbGxvYyhTQU1QTEVfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwogICBzYW1wbGVfYnVmZmVyX3BvcyA9IHNhbXBsZV9idWZmZXI7CiAgIGVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInN5c3RlbV9wcm9maWxlIiwgU19JV1VTUiB8IFNfSVJVR08sIE5VTEwpOwogICBpZiAoZW50cnkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9tbS9mYXVsdC5jIGIvYXJjaC9jcmlzL21tL2ZhdWx0LmMKaW5kZXggOTM0YzUxMC4uYzczZTkxZiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9jcmlzL21tL2ZhdWx0LmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogCSAqIGNvbnRleHQsIHdlIG11c3Qgbm90IHRha2UgdGhlIGZhdWx0Li4KIAkgKi8KIAotCWlmIChpbl9pbnRlcnJ1cHQoKSB8fCAhbW0pCisJaWYgKGluX2F0b21pYygpIHx8ICFtbSkKIAkJZ290byBub19jb250ZXh0OwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvS2NvbmZpZyBiL2FyY2gvZnJ2L0tjb25maWcKaW5kZXggY2YxYzQ0Ni4uNzU2MWQ3YiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvS2NvbmZpZworKysgYi9hcmNoL2Zydi9LY29uZmlnCkBAIC00MSw2ICs0MSwxNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IHkKKwogbWFpbm1lbnUgIkZ1aml0c3UgRlItViBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAogc291cmNlICJpbml0L0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvZnV0ZXguYyBiL2FyY2gvZnJ2L2tlcm5lbC9mdXRleC5jCmluZGV4IGVhZTg3NGEuLjE0ZjY0YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9mdXRleC5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9mdXRleC5jCkBAIC0xMCw5ICsxMCw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9mdXRleC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKIC8qCiAgKiB0aGUgdmFyaW91cyBmdXRleCBvcGVyYXRpb25zOyBNTVUgZmF1bHQgY2hlY2tpbmcgaXMgaWdub3JlZCB1bmRlciBuby1NTVUKQEAgLTIwMCw3ICsyMDAsNyBAQAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpbmNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBGVVRFWF9PUF9TRVQ6CkBAIC0yMjMsNyArMjIzLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlpZiAoIXJldCkgewogCQlzd2l0Y2ggKGNtcCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3BtLmMgYi9hcmNoL2Zydi9rZXJuZWwvcG0uYwppbmRleCBjMWQ5ZmM4Li5lZTY3N2NlIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvcG0uYworKysgYi9hcmNoL2Zydi9rZXJuZWwvcG0uYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAKIHN0YXRpYyBpbnQgY21vZGVfc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAogCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKIAlpZiAob2xkdmFsICYmIG9sZGxlbnApIHsKIAkJc2l6ZV90IG9sZGxlbjsKQEAgLTMyNiw3ICszMjYsNyBAQAogCiBzdGF0aWMgaW50IHAwX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJICAgICB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAotCQkgICAgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorCQkgICAgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJaWYgKG9sZHZhbCAmJiBvbGRsZW5wKSB7CiAJCXNpemVfdCBvbGRsZW47CkBAIC0zNzAsNyArMzcwLDcgQEAKIAogc3RhdGljIGludCBjbV9zeXNjdGwoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCSAgICAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCB2b2lkICoqY29udGV4dCkKKwkJICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWlmIChvbGR2YWwgJiYgb2xkbGVucCkgewogCQlzaXplX3Qgb2xkbGVuOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwppbmRleCBhOGM2MWRhLi4xYTVlYjZjIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwpAQCAtOTQ3LDcgKzk0Nyw3IEBACiAJaWYgKExPQURFUl9UWVBFICYmIElOSVRSRF9TVEFSVCkgewogCQlpZiAoSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUgPD0gKGxvd190b3BfcGZuIDw8IFBBR0VfU0hJRlQpKSB7CiAJCQlyZXNlcnZlX2Jvb3RtZW0oSU5JVFJEX1NUQVJULCBJTklUUkRfU0laRSk7Ci0JCQlpbml0cmRfc3RhcnQgPSBJTklUUkRfU1RBUlQgPyBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVCA6IDA7CisJCQlpbml0cmRfc3RhcnQgPSBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVDsKIAkJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBJTklUUkRfU0laRTsKIAkJfQogCQllbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYwppbmRleCBiOGE1ODgyLi44NWJhZWFlIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3NpZ25hbC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZjQ3NDUzNC4uOWMxZmIxMiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9mcnYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTQ0LDEzICs0NCw3IEBACiAKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KQotCSooLmluaXRjYWxsMi5pbml0KQotCSooLmluaXRjYWxsMy5pbml0KQotCSooLmluaXRjYWxsNC5pbml0KQotCSooLmluaXRjYWxsNS5pbml0KQotCSooLmluaXRjYWxsNi5pbml0KQotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbGliL2NoZWNrc3VtLmMgYi9hcmNoL2Zydi9saWIvY2hlY2tzdW0uYwppbmRleCAyMGU3ZGZjLi40NGUxNmQ1IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL2Zydi9saWIvY2hlY2tzdW0uYwpAQCAtMzIsNyArMzIsNiBAQAogICAgb2YgdGhlIGFzc2VtYmx5IGhhcyB0byBnby4gKi8KIAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGZyb20zMnRvMTYodW5zaWduZWQgbG9uZyB4KQpAQCAtMTA1LDE1ICsxMDQsMTUgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOwogCiAJLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCi0JcmVzdWx0ICs9IHN1bTsKLQlpZiAoc3VtID4gcmVzdWx0KQorCXJlc3VsdCArPSAoX19mb3JjZSB1MzIpc3VtOworCWlmICgoX19mb3JjZSB1MzIpc3VtID4gcmVzdWx0KQogCQlyZXN1bHQgKz0gMTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CkBAIC0xMjIsOSArMTIxLDkgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi11bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewotCXJldHVybiB+ZG9fY3N1bShidWZmLCBsZW4pOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5kb19jc3VtKGJ1ZmYsIGxlbik7CiB9CiAKIEVYUE9SVF9TWU1CT0woaXBfY29tcHV0ZV9jc3VtKTsKQEAgLTEzMiw5ICsxMzEsOSBAQAogLyoKICAqIGNvcHkgZnJvbSBmcyB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbAogICovCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBjaGFyICpkc3QsCi0JCQkgICAgaW50IGxlbiwgaW50IHN1bSwgaW50ICpjc3VtX2VycikKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCSAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmNzdW1fZXJyKQogewogCWludCByZW07CiAKQEAgLTE1NywxMSArMTU2LDExIEBACiAvKgogICogY29weSBmcm9tIGRzIHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCiAgKi8KLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0pCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CiAKLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHkpOworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21tL2VsZi1mZHBpYy5jIGIvYXJjaC9mcnYvbW0vZWxmLWZkcGljLmMKaW5kZXggZjVhNjUzMC4uOTQ3N2NjYyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbW0vZWxmLWZkcGljLmMKKysrIGIvYXJjaC9mcnYvbW0vZWxmLWZkcGljLmMKQEAgLTExMCwxNCArMTEwLDE0IEBACiAKICNpZiAwCiAJcHJpbnRrKCJbYXJlYV0gbD0lbHggKEVOT01FTSkgZj0nJXMnXG4iLAotCSAgICAgICBsZW4sIGZpbHAgPyBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUgOiAiIik7CisJICAgICAgIGxlbiwgZmlscCA/IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lIDogIiIpOwogI2VuZGlmCiAJcmV0dXJuIC1FTk9NRU07CiAKICBzdWNjZXNzOgogI2lmIDAKIAlwcmludGsoIlthcmVhXSBsPSVseCBhZD0lbHggZj0nJXMnXG4iLAotCSAgICAgICBsZW4sIGFkZHIsIGZpbHAgPyBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUgOiAiIik7CisJICAgICAgIGxlbiwgYWRkciwgZmlscCA/IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lIDogIiIpOwogI2VuZGlmCiAJcmV0dXJuIGFkZHI7CiB9IC8qIGVuZCBhcmNoX2dldF91bm1hcHBlZF9hcmVhKCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21tL2ZhdWx0LmMgYi9hcmNoL2Zydi9tbS9mYXVsdC5jCmluZGV4IDhiM2ViNTAuLjNmMTIyOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9mcnYvbW0vZmF1bHQuYwpAQCAtNzgsNyArNzgsNyBAQAogCSAqIElmIHdlJ3JlIGluIGFuIGludGVycnVwdCBvciBoYXZlIG5vIHVzZXIKIAkgKiBjb250ZXh0LCB3ZSBtdXN0IG5vdCB0YWtlIHRoZSBmYXVsdC4uCiAJICovCi0JaWYgKGluX2ludGVycnVwdCgpIHx8ICFtbSkKKwlpZiAoaW5fYXRvbWljKCkgfHwgIW1tKQogCQlnb3RvIG5vX2NvbnRleHQ7CiAKIAlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tbS9wZ2FsbG9jLmMgYi9hcmNoL2Zydi9tbS9wZ2FsbG9jLmMKaW5kZXggZjc2ZGQwMy4uMTliMTNiZSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbW0vcGdhbGxvYy5jCisrKyBiL2FyY2gvZnJ2L21tL3BnYWxsb2MuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChQQUdFX1NJWkUpKSk7Ci1rbWVtX2NhY2hlX3QgKnBnZF9jYWNoZTsKK3N0cnVjdCBrbWVtX2NhY2hlICpwZ2RfY2FjaGU7CiAKIHB0ZV90ICpwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCXNldF9wYWdlX3ByaXZhdGUobmV4dCwgKHVuc2lnbmVkIGxvbmcpIHBwcmV2KTsKIH0KIAotdm9pZCBwZ2RfY3Rvcih2b2lkICpwZ2QsIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgdW51c2VkKQordm9pZCBwZ2RfY3Rvcih2b2lkICpwZ2QsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgdW5zaWduZWQgbG9uZyB1bnVzZWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTIwLDcgKzEyMCw3IEBACiB9CiAKIC8qIG5ldmVyIGNhbGxlZCB3aGVuIFBUUlNfUEVSX1BNRCA+IDEgKi8KLXZvaWQgcGdkX2R0b3Iodm9pZCAqcGdkLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIHVudXNlZCkKK3ZvaWQgcGdkX2R0b3Iodm9pZCAqcGdkLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgdW51c2VkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IC8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL0tjb25maWcgYi9hcmNoL2g4MzAwL0tjb25maWcKaW5kZXggY2FiZjBiZi4uMzRhODRiYyAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9LY29uZmlnCisrKyBiL2FyY2gvaDgzMDAvS2NvbmZpZwpAQCAtMjksNiArMjksMTQgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VMzIKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VNjQKKwlib29sCisJZGVmYXVsdCBuCisKIGNvbmZpZyBHRU5FUklDX0ZJTkRfTkVYVF9CSVQKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9oODMwMF9rc3ltcy5jIGIvYXJjaC9oODMwMC9rZXJuZWwvaDgzMDBfa3N5bXMuYwppbmRleCA5YjRiZTA1Li5kMWIxNTI2IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9oODMwMF9rc3ltcy5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL2g4MzAwX2tzeW1zLmMKQEAgLTM5LDcgKzM5LDcgQEAKIEVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnEpOwogCiAvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHkpOworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKIAogLyogVGhlIGZvbGxvd2luZyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZXkncmUgbm90IGNhbGxlZAogICAgZXhwbGljaXRseSAodGhlIEMgY29tcGlsZXIgZ2VuZXJhdGVzIHRoZW0pLiAgRm9ydHVuYXRlbHksCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMKaW5kZXggMWJmYzc3ZS4uNTg3ZWY3ZiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvaW50cy5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL2ludHMuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAodXNlX2ttYWxsb2MpCi0JCWlycV9oYW5kbGUgPSAoaXJxX2hhbmRsZXJfdCAqKWttYWxsb2Moc2l6ZW9mKGlycV9oYW5kbGVyX3QpLCBHRlBfQVRPTUlDKTsKKwkJaXJxX2hhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKGlycV9oYW5kbGVyX3QpLCBHRlBfQVRPTUlDKTsKIAllbHNlIHsKIAkJLyogdXNlIGJvb3RtZW0gYWxsb2NhdGVyICovCiAJCWlycV9oYW5kbGUgPSAoaXJxX2hhbmRsZXJfdCAqKWFsbG9jX2Jvb3RtZW0oc2l6ZW9mKGlycV9oYW5kbGVyX3QpKTsKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3NldHVwLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zZXR1cC5jCmluZGV4IDEwNzdiNzEuLjZhZGY4ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc2V0dXAuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAjZW5kaWYKICNlbHNlCiAJaWYgKChtZW1vcnlfZW5kIDwgQ09ORklHX0JMS0RFVl9SRVNFUlZFX0FERFJFU1MpICYmIAotCSAgICAobWVtb3J5X2VuZCA+IENPTkZJR19CTEtERVZfUkVTRVJWRV9BRERSRVNTKQorCSAgICAobWVtb3J5X2VuZCA+IENPTkZJR19CTEtERVZfUkVTRVJWRV9BRERSRVNTKSkKIAkgICAgLyogb3ZlcmxhcCB1c2VyYXJlYSAqLwogCSAgICBtZW1vcnlfZW5kID0gQ09ORklHX0JMS0RFVl9SRVNFUlZFX0FERFJFU1M7IAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvaDgzMDAva2VybmVsL3NpZ25hbC5jCmluZGV4IDc3ODdmNzAuLjAyOTU1NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3NpZ25hbC5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9oODMwMC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA2NDA2YzM4Li5mMDUyODhiIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTcwLDYgKzcwLDcgQEAKICNlbmRpZgogICAgICAgICAudGV4dCA6CiAJeworCV90ZXh0ID0gLjsKICNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCiAJKiguaW50X3JlZGlyZWN0KQogI2VuZGlmCkBAIC0xMTgsMTMgKzExOSw3IEBACiAJLiA9IEFMSUdOKDB4NCkgOwogCV9fX3NldHVwX2VuZCA9IC47CiAJX19faW5pdGNhbGxfc3RhcnQgPSAuOwotCQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkJKiguaW5pdGNhbGwyLmluaXQpCi0JCSooLmluaXRjYWxsMy5pbml0KQotCQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkJKiguaW5pdGNhbGw1LmluaXQpCi0JCSooLmluaXRjYWxsNi5pbml0KQotCQkqKC5pbml0Y2FsbDcuaW5pdCkKKwkJSU5JVENBTExTCiAJX19faW5pdGNhbGxfZW5kID0gLjsKIAlfX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwogCQkqKC5jb25faW5pdGNhbGwuaW5pdCkKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvbGliL2NoZWNrc3VtLmMgYi9hcmNoL2g4MzAwL2xpYi9jaGVja3N1bS5jCmluZGV4IDVhYTY4OGQuLmJkYzViMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9oODMwMC9saWIvY2hlY2tzdW0uYwpAQCAtOTYsOSArOTYsOSBAQAogICoJVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLAogICoJd2hpY2ggYWx3YXlzIGNoZWNrc3VtIG9uIDQgb2N0ZXQgYm91bmRhcmllcy4KICAqLwotdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsIHVuc2lnbmVkIGludCBpaGwpCitfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7Ci0JcmV0dXJuIH5kb19jc3VtKGlwaCxpaGwqNCk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmRvX2NzdW0oaXBoLGlobCo0KTsKIH0KIAogLyoKQEAgLTExMywxNSArMTEzLDE5IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pCisvKgorICogRWdhZHMuLi4gIFRoYXQgdGhpbmcgYXBwYXJlbnRseSBhc3N1bWVzIHRoYXQgKmFsbCogY2hlY2tzdW1zIGl0IGV2ZXIgc2VlcyB3aWxsCisgKiBiZSBmb2xkZWQuICBWZXJ5IGxpa2VseSBhIGJ1Zy4KKyAqLworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCByZXN1bHQgPSBkb19jc3VtKGJ1ZmYsIGxlbik7CiAKIAkvKiBhZGQgaW4gb2xkIHN1bSwgYW5kIGNhcnJ5Li4gKi8KLQlyZXN1bHQgKz0gc3VtOworCXJlc3VsdCArPSAoX19mb3JjZSB1MzIpc3VtOwogCS8qIDE2K2MgYml0cyAtPiAxNiBiaXRzICovCiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZikgKyAocmVzdWx0ID4+IDE2KTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CkBAIC0xMzAsMjAgKzEzNCwyMSBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7Ci0JcmV0dXJuIH5kb19jc3VtKGJ1ZmYsbGVuKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShidWZmLGxlbik7CiB9CiAKIC8qCiAgKiBjb3B5IGZyb20gZnMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwogCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSwgaW50ICpjc3VtX2VycikKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCSAgICBfX3dzdW0gc3VtLCBpbnQgKmNzdW1fZXJyKQogewogCWlmIChjc3VtX2VycikgKmNzdW1fZXJyID0gMDsKLQltZW1jcHkoZHN0LCBzcmMsIGxlbik7CisJbWVtY3B5KGRzdCwgKF9fZm9yY2UgY29uc3Qgdm9pZCAqKXNyYywgbGVuKTsKIAlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOwogfQogCkBAIC0xNTEsOCArMTU2LDggQEAKICAqIGNvcHkgZnJvbSBkcyB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbAogICovCiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0pCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9pbnRzLmMgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9pbnRzLmMKaW5kZXggMjcwNDQwZC4uNTY3ZjY4MSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvaW50cy5jCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2ludHMuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJfQkJCiAKIAlpZiAodXNlX2ttYWxsb2MpCi0JCWlycV9oYW5kbGUgPSAoaXJxX2hhbmRsZXJfdCAqKWttYWxsb2Moc2l6ZW9mKGlycV9oYW5kbGVyX3QpLCBHRlBfQVRPTUlDKTsKKwkJaXJxX2hhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKGlycV9oYW5kbGVyX3QpLCBHRlBfQVRPTUlDKTsKIAllbHNlIHsKIAkJLyogdXNlIGJvb3RtZW0gYWxsb2NhdGVyICovCiAJCWlycV9oYW5kbGUgPSAoaXJxX2hhbmRsZXJfdCAqKWFsbG9jX2Jvb3RtZW0oc2l6ZW9mKGlycV9oYW5kbGVyX3QpKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggOGZmMWM2Zi4uMGQ2N2EwYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTQ5LDYgKzQ5LDExIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgR0VORVJJQ19CVUcKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCVUcKKwogY29uZmlnIEdFTkVSSUNfSFdFSUdIVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTE4Miw2ICsxODcsMTggQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBQQVJBVklSVAorCWJvb2wgIlBhcmF2aXJ0dWFsaXphdGlvbiBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiAhKFg4Nl9WSVNXUyB8fCBYODZfVk9ZQUdFUikKKwloZWxwCisJICBQYXJhdmlydHVhbGl6YXRpb24gaXMgYSB3YXkgb2YgcnVubmluZyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YKKwkgIExpbnV4IG9uIHRoZSBzYW1lIG1hY2hpbmUsIHVuZGVyIGEgaHlwZXJ2aXNvci4gIFRoaXMgb3B0aW9uCisJICBjaGFuZ2VzIHRoZSBrZXJuZWwgc28gaXQgY2FuIG1vZGlmeSBpdHNlbGYgd2hlbiBpdCBpcyBydW4KKwkgIHVuZGVyIGEgaHlwZXJ2aXNvciwgaW1wcm92aW5nIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuCisJICBIb3dldmVyLCB3aGVuIHJ1biB3aXRob3V0IGEgaHlwZXJ2aXNvciB0aGUga2VybmVsIGlzCisJICB0aGVvcmV0aWNhbGx5IHNsb3dlci4gIElmIGluIGRvdWJ0LCBzYXkgTi4KKwogY29uZmlnIEFDUElfU1JBVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTQ0Myw3ICs0NjAsOCBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIkhpZ2ggTWVtb3J5IFN1cHBvcnQiCi0JZGVmYXVsdCBOT0hJR0hNRU0KKwlkZWZhdWx0IEhJR0hNRU00RyBpZiAhWDg2X05VTUFRCisJZGVmYXVsdCBISUdITUVNNjRHIGlmIFg4Nl9OVU1BUQogCiBjb25maWcgTk9ISUdITUVNCiAJYm9vbCAib2ZmIgpAQCAtNzEwLDIwICs3MjgsNiBAQAogCWRlcGVuZHMgb24gKCgoWDg2X1NVTU1JVCB8fCBYODZfR0VORVJJQ0FSQ0gpICYmIE5VTUEpIHx8IChYODYgJiYgRUZJKSkKIAlkZWZhdWx0IHkKIAotY29uZmlnIFJFR1BBUk0KLQlib29sICJVc2UgcmVnaXN0ZXIgYXJndW1lbnRzIgotCWRlZmF1bHQgeQotCWhlbHAKLQlDb21waWxlIHRoZSBrZXJuZWwgd2l0aCAtbXJlZ3Bhcm09My4gVGhpcyBpbnN0cnVjdHMgZ2NjIHRvIHVzZQotCWEgbW9yZSBlZmZpY2llbnQgZnVuY3Rpb24gY2FsbCBBQkkgd2hpY2ggcGFzc2VzIHRoZSBmaXJzdCB0aHJlZQotCWFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIGNhbGwgdmlhIHJlZ2lzdGVycywgd2hpY2ggcmVzdWx0cyBpbiBkZW5zZXIKLQlhbmQgZmFzdGVyIGNvZGUuCi0KLQlJZiB0aGlzIG9wdGlvbiBpcyBkaXNhYmxlZCwgdGhlbiB0aGUgZGVmYXVsdCBBQkkgb2YgcGFzc2luZwotCWFyZ3VtZW50cyB2aWEgdGhlIHN0YWNrIGlzIHVzZWQuCi0KLQlJZiB1bnN1cmUsIHNheSBZLgotCiBjb25maWcgU0VDQ09NUAogCWJvb2wgIkVuYWJsZSBzZWNjb21wIHRvIHNhZmVseSBjb21wdXRlIHVudHJ1c3RlZCBieXRlY29kZSIKIAlkZXBlbmRzIG9uIFBST0NfRlMKQEAgLTc3MywyMyArNzc3LDM5IEBACiAgICAgICAgICAgUEhZU0lDQUxfU1RBUlQuCiAJICBGb3IgbW9yZSBkZXRhaWxzIHNlZSBEb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAogCi1jb25maWcgUEhZU0lDQUxfU1RBUlQKLQloZXggIlBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQiIGlmIChFTUJFRERFRCB8fCBDUkFTSF9EVU1QKQotCi0JZGVmYXVsdCAiMHgxMDAwMDAwIiBpZiBDUkFTSF9EVU1QCi0JZGVmYXVsdCAiMHgxMDAwMDAiCitjb25maWcgUkVMT0NBVEFCTEUKKwlib29sICJCdWlsZCBhIHJlbG9jYXRhYmxlIGtlcm5lbChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAotCSAgVGhpcyBnaXZlcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZC4gTm9ybWFsbHkKLQkgIGZvciByZWd1bGFyIGtlcm5lbHMgdGhpcyB2YWx1ZSBpcyAweDEwMDAwMCAoMU1CKS4gQnV0IGluIHRoZSBjYXNlCi0JICBvZiBrZXhlYyBvbiBwYW5pYyB0aGUgZmFpbCBzYWZlIGtlcm5lbCBuZWVkcyB0byBydW4gYXQgYSBkaWZmZXJlbnQKLQkgIGFkZHJlc3MgdGhhbiB0aGUgcGFuaWMtZWQga2VybmVsLiBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgbG9hZAotCSAgYWRkcmVzcyBmb3Iga2VybmVscyB1c2VkIHRvIGNhcHR1cmUgY3Jhc2ggZHVtcCBvbiBiZWluZyBrZXhlYydlZAotCSAgYWZ0ZXIgcGFuaWMuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBjcmFzaCBkdW1wIGtlcm5lbHMgaXMKLQkgIDB4MTAwMDAwMCAoMTZNQikuIFRoaXMgY2FuIGFsc28gYmUgc2V0IGJhc2VkIG9uIHRoZSAiWCIgdmFsdWUgYXMKLQkgIHNwZWNpZmllZCBpbiB0aGUgImNyYXNoa2VybmVsPVlNQFhNIiBjb21tYW5kIGxpbmUgYm9vdCBwYXJhbWV0ZXIKLQkgIHBhc3NlZCB0byB0aGUgcGFuaWMtZWQga2VybmVsLiBUeXBpY2FsbHkgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IGFzCi0JICBjcmFzaGtlcm5lbD02NE1AMTZNLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQKLQkgIERvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgY3Jhc2ggZHVtcHMuCisJICBUaGlzIGJ1aWxkIGEga2VybmVsIGltYWdlIHRoYXQgcmV0YWlucyByZWxvY2F0aW9uIGluZm9ybWF0aW9uCisgICAgICAgICAgc28gaXQgY2FuIGJlIGxvYWRlZCBzb21lcGxhY2UgYmVzaWRlcyB0aGUgZGVmYXVsdCAxTUIuCisJICBUaGUgcmVsb2NhdGlvbnMgdGVuZCB0byB0aGUga2VybmVsIGJpbmFyeSBhYm91dCAxMCUgbGFyZ2VyLAorICAgICAgICAgIGJ1dCBhcmUgZGlzY2FyZGVkIGF0IHJ1bnRpbWUuCisKKwkgIE9uZSB1c2UgaXMgZm9yIHRoZSBrZXhlYyBvbiBwYW5pYyBjYXNlIHdoZXJlIHRoZSByZWNvdmVyeSBrZXJuZWwKKyAgICAgICAgICBtdXN0IGxpdmUgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVzcyB0aGFuIHRoZSBwcmltYXJ5CisgICAgICAgICAga2VybmVsLgorCitjb25maWcgUEhZU0lDQUxfQUxJR04KKwloZXggIkFsaWdubWVudCB2YWx1ZSB0byB3aGljaCBrZXJuZWwgc2hvdWxkIGJlIGFsaWduZWQiCisJZGVmYXVsdCAiMHgxMDAwMDAiCisJcmFuZ2UgMHgyMDAwIDB4NDAwMDAwCisJaGVscAorCSAgVGhpcyB2YWx1ZSBwdXRzIHRoZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIG9uIHBoeXNpY2FsIGFkZHJlc3MKKyAJICB3aGVyZSBrZXJuZWwgaXMgbG9hZGVkIGFuZCBydW4gZnJvbS4gS2VybmVsIGlzIGNvbXBpbGVkIGZvciBhbgorIAkgIGFkZHJlc3Mgd2hpY2ggbWVldHMgYWJvdmUgYWxpZ25tZW50IHJlc3RyaWN0aW9uLgorCisgCSAgSWYgYm9vdGxvYWRlciBsb2FkcyB0aGUga2VybmVsIGF0IGEgbm9uLWFsaWduZWQgYWRkcmVzcyBhbmQKKyAJICBDT05GSUdfUkVMT0NBVEFCTEUgaXMgc2V0LCBrZXJuZWwgd2lsbCBtb3ZlIGl0c2VsZiB0byBuZWFyZXN0CisgCSAgYWRkcmVzcyBhbGlnbmVkIHRvIGFib3ZlIHZhbHVlIGFuZCBydW4gZnJvbSB0aGVyZS4KKworIAkgIElmIGJvb3Rsb2FkZXIgbG9hZHMgdGhlIGtlcm5lbCBhdCBhIG5vbi1hbGlnbmVkIGFkZHJlc3MgYW5kCisgCSAgQ09ORklHX1JFTE9DQVRBQkxFIGlzIG5vdCBzZXQsIGtlcm5lbCB3aWxsIGlnbm9yZSB0aGUgcnVuIHRpbWUKKyAJICBsb2FkIGFkZHJlc3MgYW5kIGRlY29tcHJlc3MgaXRzZWxmIHRvIHRoZSBhZGRyZXNzIGl0IGhhcyBiZWVuCisgCSAgY29tcGlsZWQgZm9yIGFuZCBydW4gZnJvbSB0aGVyZS4gVGhlIGFkZHJlc3MgZm9yIHdoaWNoIGtlcm5lbCBpcworIAkgIGNvbXBpbGVkIGFscmVhZHkgbWVldHMgYWJvdmUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gSGVuY2UgdGhlCisgCSAgZW5kIHJlc3VsdCBpcyB0aGF0IGtlcm5lbCBydW5zIGZyb20gYSBwaHlzaWNhbCBhZGRyZXNzIG1lZXRpbmcKKwkgIGFib3ZlIGFsaWdubWVudCByZXN0cmljdGlvbnMuCiAKIAkgIERvbid0IGNoYW5nZSB0aGlzIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnLmNwdSBiL2FyY2gvaTM4Ni9LY29uZmlnLmNwdQppbmRleCBmYzRmMmFiLi4yYWVjZmJhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZy5jcHUKKysrIGIvYXJjaC9pMzg2L0tjb25maWcuY3B1CkBAIC0xMDMsOCArMTAzLDE1IEBACiAJICBTZWxlY3QgdGhpcyBmb3IgSW50ZWwgUGVudGl1bSBNIChub3QgUGVudGl1bS00IE0pCiAJICBub3RlYm9vayBjaGlwcy4KIAorY29uZmlnIE1DT1JFMgorCWJvb2wgIkNvcmUgMi9uZXdlciBYZW9uIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBJbnRlbCBDb3JlIDIgYW5kIG5ld2VyIENvcmUgMiBYZW9ucyAoWGVvbiA1MXh4IGFuZCA1M3h4KQorCSAgQ1BVcy4gWW91IGNhbiBkaXN0aW5ndXNoIG5ld2VyIGZyb20gb2xkZXIgWGVvbnMgYnkgdGhlIENQVSBmYW1pbHkKKwkgIGluIC9wcm9jL2NwdWluZm8uIE5ld2VyIG9uZXMgaGF2ZSA2LgorCiBjb25maWcgTVBFTlRJVU00Ci0JYm9vbCAiUGVudGl1bS00L0NlbGVyb24oUDQtYmFzZWQpL1BlbnRpdW0tNCBNL1hlb24iCisJYm9vbCAiUGVudGl1bS00L0NlbGVyb24oUDQtYmFzZWQpL1BlbnRpdW0tNCBNL29sZGVyIFhlb24iCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgZm9yIEludGVsIFBlbnRpdW0gNCBjaGlwcy4gIFRoaXMgaW5jbHVkZXMgdGhlCiAJICBQZW50aXVtIDQsIFA0LWJhc2VkIENlbGVyb24gYW5kIFhlb24sIGFuZCBQZW50aXVtLTQgTQpAQCAtMjI5LDcgKzIzNiw3IEBACiAJZGVmYXVsdCAiNyIgaWYgTVBFTlRJVU00IHx8IFg4Nl9HRU5FUklDCiAJZGVmYXVsdCAiNCIgaWYgWDg2X0VMQU4gfHwgTTQ4NiB8fCBNMzg2IHx8IE1HRU9ERUdYMQogCWRlZmF1bHQgIjUiIGlmIE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1XSU5DSElQQzYgfHwgTUNSVVNPRSB8fCBNRUZGSUNFT04gfHwgTUNZUklYSUlJIHx8IE1LNiB8fCBNUEVOVElVTUlJSSB8fCBNUEVOVElVTUlJIHx8IE02ODYgfHwgTTU4Nk1NWCB8fCBNNTg2VFNDIHx8IE01ODYgfHwgTVZJQUMzXzIgfHwgTUdFT0RFX0xYCi0JZGVmYXVsdCAiNiIgaWYgTUs3IHx8IE1LOCB8fCBNUEVOVElVTU0KKwlkZWZhdWx0ICI2IiBpZiBNSzcgfHwgTUs4IHx8IE1QRU5USVVNTSB8fCBNQ09SRTIKIAogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlib29sCkBAIC0yNDEsNiArMjQ4LDE0IEBACiAJZGVwZW5kcyBvbiAhTTM4NgogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgR0VORVJJQ19DQUxJQlJBVEVfREVMQVkKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0yODcsMTcgKzMwMiwxNyBAQAogCiBjb25maWcgWDg2X0dPT0RfQVBJQwogCWJvb2wKLQlkZXBlbmRzIG9uIE1LNyB8fCBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE1LOCB8fCBNRUZGSUNFT04KKwlkZXBlbmRzIG9uIE1LNyB8fCBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE1LOCB8fCBNRUZGSUNFT04gfHwgTUNPUkUyCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBYODZfSU5URUxfVVNFUkNPUFkKIAlib29sCi0JZGVwZW5kcyBvbiBNUEVOVElVTTQgfHwgTVBFTlRJVU1NIHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTU4Nk1NWCB8fCBYODZfR0VORVJJQyB8fCBNSzggfHwgTUs3IHx8IE1FRkZJQ0VPTgorCWRlcGVuZHMgb24gTVBFTlRJVU00IHx8IE1QRU5USVVNTSB8fCBNUEVOVElVTUlJSSB8fCBNUEVOVElVTUlJIHx8IE01ODZNTVggfHwgWDg2X0dFTkVSSUMgfHwgTUs4IHx8IE1LNyB8fCBNRUZGSUNFT04gfHwgTUNPUkUyCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBYODZfVVNFX1BQUk9fQ0hFQ0tTVU0KIAlib29sCi0JZGVwZW5kcyBvbiBNV0lOQ0hJUDNEIHx8IE1XSU5DSElQMiB8fCBNV0lOQ0hJUEM2IHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE1LOCB8fCBNVklBQzNfMiB8fCBNRUZGSUNFT04gfHwgTUdFT0RFX0xYCisJZGVwZW5kcyBvbiBNV0lOQ0hJUDNEIHx8IE1XSU5DSElQMiB8fCBNV0lOQ0hJUEM2IHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE1LOCB8fCBNVklBQzNfMiB8fCBNRUZGSUNFT04gfHwgTUdFT0RFX0xYIHx8IE1DT1JFMgogCWRlZmF1bHQgeQogCiBjb25maWcgWDg2X1VTRV8zRE5PVwpAQCAtMzEyLDUgKzMyNyw1IEBACiAKIGNvbmZpZyBYODZfVFNDCiAJYm9vbAotCWRlcGVuZHMgb24gKE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1DUlVTT0UgfHwgTUVGRklDRU9OIHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNSzggfHwgTVZJQUMzXzIgfHwgTUdFT0RFR1gxIHx8IE1HRU9ERV9MWCkgJiYgIVg4Nl9OVU1BUQorCWRlcGVuZHMgb24gKE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1DUlVTT0UgfHwgTUVGRklDRU9OIHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNSzggfHwgTVZJQUMzXzIgfHwgTUdFT0RFR1gxIHx8IE1HRU9ERV9MWCB8fCBNQ09SRTIpICYmICFYODZfTlVNQVEKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnLmRlYnVnIGIvYXJjaC9pMzg2L0tjb25maWcuZGVidWcKaW5kZXggYjMxYzA4MC4uZjY4Y2M2ZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcuZGVidWcKQEAgLTg1LDQgKzg1LDE0IEBACiAgICAgICAgICAgb3B0aW9uIHNhdmVzIGFib3V0IDRrIGFuZCBtaWdodCBjYXVzZSB5b3UgbXVjaCBhZGRpdGlvbmFsIGdyZXkKICAgICAgICAgICBoYWlyLgogCitjb25maWcgREVCVUdfUEFSQVZJUlQKKwlib29sICJFbmFibGUgc29tZSBwYXJhdmlydHVhbGl6YXRpb24gZGVidWdnaW5nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUEFSQVZJUlQgJiYgREVCVUdfS0VSTkVMCisJaGVscAorCSAgQ3VycmVudGx5IGRlbGliZXJhdGVseSBjbG9iYmVycyByZWdzIHdoaWNoIGFyZSBhbGxvd2VkIHRvIGJlCisJICBjbG9iYmVyZWQgaW4gaW5saW5lZCBwYXJhdmlydCBob29rcywgZXZlbiBpbiBuYXRpdmUgbW9kZS4KKwkgIElmIHR1cm5pbmcgdGhpcyBvZmYgc29sdmVzIGEgcHJvYmxlbSwgdGhlbiBESVNBQkxFX0lOVEVSUlVQVFMoKSBvcgorCSAgRU5BQkxFX0lOVEVSUlVQVFMoKSBpcyBseWluZyBhYm91dCB3aGF0IHJlZ2lzdGVycyBjYW4gYmUgY2xvYmJlcmVkLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKaW5kZXggN2NjMGIxOC4uZjdhYzFhZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtMjYsMTAgKzI2LDEyIEBACiAKIExERkxBR1MJCTo9IC1tIGVsZl9pMzg2CiBPQkpDT1BZRkxBR1MJOj0gLU8gYmluYXJ5IC1SIC5ub3RlIC1SIC5jb21tZW50IC1TCi1MREZMQUdTX3ZtbGludXggOj0KK2lmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQorTERGTEFHU192bWxpbnV4IDo9IC0tZW1pdC1yZWxvY3MKK2VuZGlmCiBDSEVDS0ZMQUdTCSs9IC1EX19pMzg2X18KIAotQ0ZMQUdTICs9IC1waXBlIC1tc29mdC1mbG9hdAorQ0ZMQUdTICs9IC1waXBlIC1tc29mdC1mbG9hdCAtbXJlZ3Bhcm09MwogCiAjIHByZXZlbnQgZ2NjIGZyb20ga2VlcGluZyB0aGUgc3RhY2sgMTYgYnl0ZSBhbGlnbmVkCiBDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yKQpAQCAtMzcsMTEgKzM5LDEzIEBACiAjIENQVS1zcGVjaWZpYyB0dW5pbmcuIEFueXRoaW5nIHdoaWNoIGNhbiBiZSBzaGFyZWQgd2l0aCBVTUwgc2hvdWxkIGdvIGhlcmUuCiBpbmNsdWRlICQoc3JjdHJlZSkvYXJjaC9pMzg2L01ha2VmaWxlLmNwdQogCi1jZmxhZ3MtJChDT05GSUdfUkVHUEFSTSkgKz0gLW1yZWdwYXJtPTMKLQogIyB0ZW1wb3JhcnkgdW50aWwgc3RyaW5nLmggaXMgZml4ZWQKIGNmbGFncy15ICs9IC1mZnJlZXN0YW5kaW5nCiAKKyMgdGhpcyB3b3JrcyBhcm91bmQgc29tZSBpc3N1ZXMgd2l0aCBnZW5lcmF0aW5nIHVud2luZCB0YWJsZXMgaW4gb2xkZXIgZ2NjcworIyBuZXdlciBnY2NzIGRvIGl0IGJ5IGRlZmF1bHQKK2NmbGFncy15ICs9IC1tYWNjdW11bGF0ZS1vdXRnb2luZy1hcmdzCisKICMgRGlzYWJsZSB1bml0LWF0LWEtdGltZSBtb2RlIG9uIHByZS1nY2MtNC4wIGNvbXBpbGVycywgaXQgbWFrZXMgZ2NjIHVzZQogIyBhIGxvdCBtb3JlIHN0YWNrIGR1ZSB0byB0aGUgbGFjayBvZiBzaGFyaW5nIG9mIHN0YWNrbG90czoKIENGTEFHUwkJCQkrPSAkKHNoZWxsIGlmIFsgJChjYWxsIGNjLXZlcnNpb24pIC1sdCAwNDAwIF0gOyB0aGVuIGVjaG8gJChjYWxsIGNjLW9wdGlvbiwtZm5vLXVuaXQtYXQtYS10aW1lKTsgZmkgOykKQEAgLTUxLDggKzU1LDggQEAKIEFGTEFHUyArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfZW5kcHJvYywtRENPTkZJR19BU19DRkk9MSwpCiAKICMgaXMgLmNmaV9zaWduYWxfZnJhbWUgc3VwcG9ydGVkIHRvbz8KLWNmbGFncy15ICs9ICQoY2FsbCBhcy1pbnN0ciwuY2ZpX3N0YXJ0cHJvY1xuLmNmaV9lbmRwcm9jLC1EQ09ORklHX0FTX0NGST0xLCkKLUFGTEFHUyArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfZW5kcHJvYywtRENPTkZJR19BU19DRkk9MSwpCitjZmxhZ3MteSArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfc2lnbmFsX2ZyYW1lXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJX1NJR05BTF9GUkFNRT0xLCkKK0FGTEFHUyArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfc2lnbmFsX2ZyYW1lXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJX1NJR05BTF9GUkFNRT0xLCkKIAogQ0ZMQUdTICs9ICQoY2ZsYWdzLXkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9NYWtlZmlsZS5jcHUgYi9hcmNoL2kzODYvTWFrZWZpbGUuY3B1CmluZGV4IGExMWJlZmIuLmEzMmMwMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9NYWtlZmlsZS5jcHUKKysrIGIvYXJjaC9pMzg2L01ha2VmaWxlLmNwdQpAQCAtMzIsNiArMzIsNyBAQAogY2ZsYWdzLSQoQ09ORklHX01XSU5DSElQM0QpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXdpbmNoaXAyLC1tYXJjaD1pNTg2KQogY2ZsYWdzLSQoQ09ORklHX01DWVJJWElJSSkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9YzMsLW1hcmNoPWk0ODYpICQoYWxpZ24pLWZ1bmN0aW9ucz0wICQoYWxpZ24pLWp1bXBzPTAgJChhbGlnbiktbG9vcHM9MAogY2ZsYWdzLSQoQ09ORklHX01WSUFDM18yKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1jMy0yLC1tYXJjaD1pNjg2KQorY2ZsYWdzLSQoQ09ORklHX01DT1JFMikJCSs9IC1tYXJjaD1pNjg2ICQoY2FsbCBjYy1vcHRpb24sLW10dW5lPWNvcmUyLCQoY2FsbCBjYy1vcHRpb24sLW10dW5lPWdlbmVyaWMsLW10dW5lPWk2ODYpKQogCiAjIEFNRCBFbGFuIHN1cHBvcnQKIGNmbGFncy0kKENPTkZJR19YODZfRUxBTikJKz0gLW1hcmNoPWk0ODYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDI1OGVhOTUuLmE2NjEyMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtNCwyMiArNCw0MiBAQAogIyBjcmVhdGUgYSBjb21wcmVzc2VkIHZtbGludXggaW1hZ2UgZnJvbSB0aGUgb3JpZ2luYWwgdm1saW51eAogIwogCi10YXJnZXRzCQk6PSB2bWxpbnV4IHZtbGludXguYmluIHZtbGludXguYmluLmd6IGhlYWQubyBtaXNjLm8gcGlnZ3kubwordGFyZ2V0cwkJOj0gdm1saW51eCB2bWxpbnV4LmJpbiB2bWxpbnV4LmJpbi5neiBoZWFkLm8gbWlzYy5vIHBpZ2d5Lm8gXAorCQkJdm1saW51eC5iaW4uYWxsIHZtbGludXgucmVsb2NzCiBFWFRSQV9BRkxBR1MJOj0gLXRyYWRpdGlvbmFsCiAKLUxERkxBR1Nfdm1saW51eCA6PSAtVHRleHQgJChJTUFHRV9PRkZTRVQpIC1lIHN0YXJ0dXBfMzIKK0xERkxBR1Nfdm1saW51eCA6PSAtVAorQ0ZMQUdTX21pc2MubyArPSAtZlBJQworaG9zdHByb2dzLXkJOj0gcmVsb2NzCiAKLSQob2JqKS92bWxpbnV4OiAkKG9iaikvaGVhZC5vICQob2JqKS9taXNjLm8gJChvYmopL3BpZ2d5Lm8gRk9SQ0UKKyQob2JqKS92bWxpbnV4OiAkKHNyYykvdm1saW51eC5sZHMgJChvYmopL2hlYWQubyAkKG9iaikvbWlzYy5vICQob2JqKS9waWdneS5vIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbGQpCiAJQDoKIAogJChvYmopL3ZtbGludXguYmluOiB2bWxpbnV4IEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKIAorcXVpZXRfY21kX3JlbG9jcyA9IFJFTE9DUyAgJEAKKyAgICAgIGNtZF9yZWxvY3MgPSAkKG9iaikvcmVsb2NzICQ8ID4gJEA7JChvYmopL3JlbG9jcyAtLWFicy1yZWxvY3MgJDwKKyQob2JqKS92bWxpbnV4LnJlbG9jczogdm1saW51eCAkKG9iaikvcmVsb2NzIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQscmVsb2NzKQorCit2bWxpbnV4LmJpbi5hbGwteSA6PSAkKG9iaikvdm1saW51eC5iaW4KK3ZtbGludXguYmluLmFsbC0kKENPTkZJR19SRUxPQ0FUQUJMRSkgKz0gJChvYmopL3ZtbGludXgucmVsb2NzCitxdWlldF9jbWRfcmVsb2NiaW4gPSBCVUlMRCAgICRACisgICAgICBjbWRfcmVsb2NiaW4gPSBjYXQgJChmaWx0ZXItb3V0IEZPUkNFLCReKSA+ICRACiskKG9iaikvdm1saW51eC5iaW4uYWxsOiAkKHZtbGludXguYmluLmFsbC15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHJlbG9jYmluKQorCitpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKyQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluLmFsbCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCitlbHNlCiAkKG9iaikvdm1saW51eC5iaW4uZ3o6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCitlbmRpZgogCiBMREZMQUdTX3BpZ2d5Lm8gOj0gLXIgLS1mb3JtYXQgYmluYXJ5IC0tb2Zvcm1hdCBlbGYzMi1pMzg2IC1UCiAKLSQob2JqKS9waWdneS5vOiAkKG9iaikvdm1saW51eC5zY3IgJChvYmopL3ZtbGludXguYmluLmd6IEZPUkNFCiskKG9iaikvcGlnZ3kubzogJChzcmMpL3ZtbGludXguc2NyICQob2JqKS92bWxpbnV4LmJpbi5neiBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwppbmRleCBiNTg5M2U0Li5mMzk1YTRiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtMjYsOSArMjYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9ib290Lmg+CiAKKy5zZWN0aW9uICIudGV4dC5oZWFkIgogCS5nbG9ibCBzdGFydHVwXzMyCi0JCisKIHN0YXJ0dXBfMzI6CiAJY2xkCiAJY2xpCkBAIC0zNyw5MyArMzksMTQyIEBACiAJbW92bCAlZWF4LCVlcwogCW1vdmwgJWVheCwlZnMKIAltb3ZsICVlYXgsJWdzCisJbW92bCAlZWF4LCVzcwogCi0JbHNzIHN0YWNrX3N0YXJ0LCVlc3AKLQl4b3JsICVlYXgsJWVheAotMToJaW5jbCAlZWF4CQkjIGNoZWNrIHRoYXQgQTIwIHJlYWxseSBJUyBlbmFibGVkCi0JbW92bCAlZWF4LDB4MDAwMDAwCSMgbG9vcCBmb3JldmVyIGlmIGl0IGlzbid0Ci0JY21wbCAlZWF4LDB4MTAwMDAwCi0JamUgMWIKKy8qIENhbGN1bGF0ZSB0aGUgZGVsdGEgYmV0d2VlbiB3aGVyZSB3ZSB3ZXJlIGNvbXBpbGVkIHRvIHJ1bgorICogYXQgYW5kIHdoZXJlIHdlIHdlcmUgYWN0dWFsbHkgbG9hZGVkIGF0LiAgVGhpcyBjYW4gb25seSBiZSBkb25lCisgKiB3aXRoIGEgc2hvcnQgbG9jYWwgY2FsbCBvbiB4ODYuICBOb3RoaW5nICBlbHNlIHdpbGwgdGVsbCB1cyB3aGF0CisgKiBhZGRyZXNzIHdlIGFyZSBydW5uaW5nIGF0LiAgVGhlIHJlc2VydmVkIGNodW5rIG9mIHRoZSByZWFsLW1vZGUKKyAqIGRhdGEgYXQgMHgzNC0weDNmIGFyZSB1c2VkIGFzIHRoZSBzdGFjayBmb3IgdGhpcyBjYWxjdWxhdGlvbi4KKyAqIE9ubHkgNCBieXRlcyBhcmUgbmVlZGVkLgorICovCisJbGVhbCAweDQwKCVlc2kpLCAlZXNwCisJY2FsbCAxZgorMToJcG9wbCAlZWJwCisJc3VibCAkMWIsICVlYnAKKworLyogJWVicCBjb250YWlucyB0aGUgYWRkcmVzcyB3ZSBhcmUgbG9hZGVkIGF0IGJ5IHRoZSBib290IGxvYWRlciBhbmQgJWVieAorICogY29udGFpbnMgdGhlIGFkZHJlc3Mgd2hlcmUgd2Ugc2hvdWxkIG1vdmUgdGhlIGtlcm5lbCBpbWFnZSB0ZW1wb3JhcmlseQorICogZm9yIHNhZmUgaW4tcGxhY2UgZGVjb21wcmVzc2lvbi4KKyAqLworCisjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJbW92bCAJJWVicCwgJWVieAorCWFkZGwgICAgJChDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSwgJWVieAorCWFuZGwgICAgJCh+KENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKSwgJWVieAorI2Vsc2UKKwltb3ZsICRMT0FEX1BIWVNJQ0FMX0FERFIsICVlYngKKyNlbmRpZgorCisJLyogUmVwbGFjZSB0aGUgY29tcHJlc3NlZCBkYXRhIHNpemUgd2l0aCB0aGUgdW5jb21wcmVzc2VkIHNpemUgKi8KKwlzdWJsIGlucHV0X2xlbiglZWJwKSwgJWVieAorCW1vdmwgb3V0cHV0X2xlbiglZWJwKSwgJWVheAorCWFkZGwgJWVheCwgJWVieAorCS8qIEFkZCA4IGJ5dGVzIGZvciBldmVyeSAzMksgaW5wdXQgYmxvY2sgKi8KKwlzaHJsICQxMiwgJWVheAorCWFkZGwgJWVheCwgJWVieAorCS8qIEFkZCAzMksgKyAxOCBieXRlcyBvZiBleHRyYSBzbGFjayAqLworCWFkZGwgJCgzMjc2OCArIDE4KSwgJWVieAorCS8qIEFsaWduIG9uIGEgNEsgYm91bmRhcnkgKi8KKwlhZGRsICQ0MDk1LCAlZWJ4CisJYW5kbCAkfjQwOTUsICVlYngKKworLyogQ29weSB0aGUgY29tcHJlc3NlZCBrZXJuZWwgdG8gdGhlIGVuZCBvZiBvdXIgYnVmZmVyCisgKiB3aGVyZSBkZWNvbXByZXNzaW9uIGluIHBsYWNlIGJlY29tZXMgc2FmZS4KKyAqLworCXB1c2hsICVlc2kKKwlsZWFsIF9lbmQoJWVicCksICVlc2kKKwlsZWFsIF9lbmQoJWVieCksICVlZGkKKwltb3ZsICQoX2VuZCAtIHN0YXJ0dXBfMzIpLCAlZWN4CisJc3RkCisJcmVwCisJbW92c2IKKwljbGQKKwlwb3BsICVlc2kKKworLyogQ29tcHV0ZSB0aGUga2VybmVsIHN0YXJ0IGFkZHJlc3MuCisgKi8KKyNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKwlhZGRsICAgICQoQ09ORklHX1BIWVNJQ0FMX0FMSUdOIC0gMSksICVlYnAKKwlhbmRsICAgICQofihDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSksICVlYnAKKyNlbHNlCisJbW92bAkkTE9BRF9QSFlTSUNBTF9BRERSLCAlZWJwCisjZW5kaWYKIAogLyoKLSAqIEluaXRpYWxpemUgZWZsYWdzLiAgU29tZSBCSU9TJ3MgbGVhdmUgYml0cyBsaWtlIE5UIHNldC4gIFRoaXMgd291bGQKLSAqIGNvbmZ1c2UgdGhlIGRlYnVnZ2VyIGlmIHRoaXMgY29kZSBpcyB0cmFjZWQuCi0gKiBYWFggLSBiZXN0IHRvIGluaXRpYWxpemUgYmVmb3JlIHN3aXRjaGluZyB0byBwcm90ZWN0ZWQgbW9kZS4KKyAqIEp1bXAgdG8gdGhlIHJlbG9jYXRlZCBhZGRyZXNzLgogICovCi0JcHVzaGwgJDAKLQlwb3BmbAorCWxlYWwgcmVsb2NhdGVkKCVlYngpLCAlZWF4CisJam1wIColZWF4Cisuc2VjdGlvbiAiLnRleHQiCityZWxvY2F0ZWQ6CisKIC8qCiAgKiBDbGVhciBCU1MKICAqLwogCXhvcmwgJWVheCwlZWF4Ci0JbW92bCAkX2VkYXRhLCVlZGkKLQltb3ZsICRfZW5kLCVlY3gKKwlsZWFsIF9lZGF0YSglZWJ4KSwlZWRpCisJbGVhbCBfZW5kKCVlYngpLCAlZWN4CiAJc3VibCAlZWRpLCVlY3gKIAljbGQKIAlyZXAKIAlzdG9zYgorCisvKgorICogU2V0dXAgdGhlIHN0YWNrIGZvciB0aGUgZGVjb21wcmVzc29yCisgKi8KKwlsZWFsIHN0YWNrX2VuZCglZWJ4KSwgJWVzcAorCiAvKgogICogRG8gdGhlIGRlY29tcHJlc3Npb24sIGFuZCBqdW1wIHRvIHRoZSBuZXcga2VybmVsLi4KICAqLwotCXN1YmwgJDE2LCVlc3AJIyBwbGFjZSBmb3Igc3RydWN0dXJlIG9uIHRoZSBzdGFjawotCW1vdmwgJWVzcCwlZWF4CisJbW92bCBvdXRwdXRfbGVuKCVlYngpLCAlZWF4CisJcHVzaGwgJWVheAorCXB1c2hsICVlYnAJIyBvdXRwdXQgYWRkcmVzcworCW1vdmwgaW5wdXRfbGVuKCVlYngpLCAlZWF4CisJcHVzaGwgJWVheAkjIGlucHV0X2xlbgorCWxlYWwgaW5wdXRfZGF0YSglZWJ4KSwgJWVheAorCXB1c2hsICVlYXgJIyBpbnB1dF9kYXRhCisJbGVhbCBfZW5kKCVlYngpLCAlZWF4CisJcHVzaGwgJWVheAkjIGVuZCBvZiB0aGUgaW1hZ2UgYXMgdGhpcmQgYXJndW1lbnQKIAlwdXNobCAlZXNpCSMgcmVhbCBtb2RlIHBvaW50ZXIgYXMgc2Vjb25kIGFyZwotCXB1c2hsICVlYXgJIyBhZGRyZXNzIG9mIHN0cnVjdHVyZSBhcyBmaXJzdCBhcmcKIAljYWxsIGRlY29tcHJlc3Nfa2VybmVsCi0Jb3JsICAlZWF4LCVlYXggCi0Jam56ICAzZgotCXBvcGwgJWVzaQkjIGRpc2NhcmQgYWRkcmVzcwotCXBvcGwgJWVzaQkjIHJlYWwgbW9kZSBwb2ludGVyCi0JeG9ybCAlZWJ4LCVlYngKLQlsam1wICQoX19CT09UX0NTKSwgJF9fUEhZU0lDQUxfU1RBUlQKKwlhZGRsICQyMCwgJWVzcAorCXBvcGwgJWVjeAorCisjaWYgQ09ORklHX1JFTE9DQVRBQkxFCisvKiBGaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9ucy4KKyAqLworCW1vdmwgJWVicCwgJWVkaQorCWFkZGwgJWVjeCwgJWVkaQorCisvKiBDYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gd2hlcmUgdm1saW51eCB3YXMgY29tcGlsZWQgdG8gcnVuCisgKiBhbmQgd2hlcmUgaXQgd2FzIGFjdHVhbGx5IGxvYWRlZC4KKyAqLworCW1vdmwgJWVicCwgJWVieAorCXN1YmwgJExPQURfUEhZU0lDQUxfQUREUiwgJWVieAorCWp6ICAgMmYJCS8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiBsb2FkZWQgYXQgY29tcGlsZWQgYWRkci4gKi8KKy8qCisgKiBQcm9jZXNzIHJlbG9jYXRpb25zLgorICovCisKKzE6CXN1YmwgJDQsICVlZGkKKwltb3ZsIDAoJWVkaSksICVlY3gKKwl0ZXN0bCAlZWN4LCAlZWN4CisJanogMmYKKwlhZGRsICVlYngsIC1fX1BBR0VfT0ZGU0VUKCVlYngsICVlY3gpCisJam1wIDFiCisyOgorI2VuZGlmCiAKIC8qCi0gKiBXZSBjb21lIGhlcmUsIGlmIHdlIHdlcmUgbG9hZGVkIGhpZ2guCi0gKiBXZSBuZWVkIHRvIG1vdmUgdGhlIG1vdmUtaW4tcGxhY2Ugcm91dGluZSBkb3duIHRvIDB4MTAwMAotICogYW5kIHRoZW4gc3RhcnQgaXQgd2l0aCB0aGUgYnVmZmVyIGFkZHJlc3NlcyBpbiByZWdpc3RlcnMsCi0gKiB3aGljaCB3ZSBnb3QgZnJvbSB0aGUgc3RhY2suCisgKiBKdW1wIHRvIHRoZSBkZWNvbXByZXNzZWQga2VybmVsLgogICovCi0zOgotCW1vdmwgJG1vdmVfcm91dGluZV9zdGFydCwlZXNpCi0JbW92bCAkMHgxMDAwLCVlZGkKLQltb3ZsICRtb3ZlX3JvdXRpbmVfZW5kLCVlY3gKLQlzdWJsICVlc2ksJWVjeAotCWFkZGwgJDMsJWVjeAotCXNocmwgJDIsJWVjeAotCWNsZAotCXJlcAotCW1vdnNsCi0KLQlwb3BsICVlc2kJIyBkaXNjYXJkIHRoZSBhZGRyZXNzCi0JcG9wbCAlZWJ4CSMgcmVhbCBtb2RlIHBvaW50ZXIKLQlwb3BsICVlc2kJIyBsb3dfYnVmZmVyX3N0YXJ0Ci0JcG9wbCAlZWN4CSMgbGNvdW50Ci0JcG9wbCAlZWR4CSMgaGlnaF9idWZmZXJfc3RhcnQKLQlwb3BsICVlYXgJIyBoY291bnQKLQltb3ZsICRfX1BIWVNJQ0FMX1NUQVJULCVlZGkKLQljbGkJCSMgbWFrZSBzdXJlIHdlIGRvbid0IGdldCBpbnRlcnJ1cHRlZAotCWxqbXAgJChfX0JPT1RfQ1MpLCAkMHgxMDAwICMgYW5kIGp1bXAgdG8gdGhlIG1vdmUgcm91dGluZQotCi0vKgotICogUm91dGluZSAodGVtcGxhdGUpIGZvciBtb3ZpbmcgdGhlIGRlY29tcHJlc3NlZCBrZXJuZWwgaW4gcGxhY2UsCi0gKiBpZiB3ZSB3ZXJlIGhpZ2ggbG9hZGVkLiBUaGlzIF9tdXN0XyBQSUMtY29kZSAhCi0gKi8KLW1vdmVfcm91dGluZV9zdGFydDoKLQltb3ZsICVlY3gsJWVicAotCXNocmwgJDIsJWVjeAotCXJlcAotCW1vdnNsCi0JbW92bCAlZWJwLCVlY3gKLQlhbmRsICQzLCVlY3gKLQlyZXAKLQltb3ZzYgotCW1vdmwgJWVkeCwlZXNpCi0JbW92bCAlZWF4LCVlY3gJIyBOT1RFOiByZXAgbW92c2Igd29uJ3QgbW92ZSBpZiAlZWN4ID09IDAKLQlhZGRsICQzLCVlY3gKLQlzaHJsICQyLCVlY3gKLQlyZXAKLQltb3ZzbAotCW1vdmwgJWVieCwlZXNpCSMgUmVzdG9yZSBzZXR1cCBwb2ludGVyCiAJeG9ybCAlZWJ4LCVlYngKLQlsam1wICQoX19CT09UX0NTKSwgJF9fUEhZU0lDQUxfU1RBUlQKLW1vdmVfcm91dGluZV9lbmQ6CisJam1wIColZWJwCisKKy5ic3MKKy5iYWxpZ24gNAorc3RhY2s6CisJLmZpbGwgNDA5NiwgMSwgMAorc3RhY2tfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCBiMmNjZDU0Li4xY2U3MDE3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtOSwxMSArOSw5NCBAQAogICogSGlnaCBsb2FkZWQgc3R1ZmYgYnkgSGFucyBMZXJtZW4gJiBXZXJuZXIgQWxtZXNiZXJnZXIsIEZlYi4gMTk5NgogICovCiAKKyN1bmRlZiBDT05GSUdfUEFSQVZJUlQKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vYm9vdC5oPgorCisvKiBXQVJOSU5HISEKKyAqIFRoaXMgY29kZSBpcyBjb21waWxlZCB3aXRoIC1mUElDIGFuZCBpdCBpcyByZWxvY2F0ZWQgZHluYW1pY2FsbHkKKyAqIGF0IHJ1biB0aW1lLCBidXQgbm8gcmVsb2NhdGlvbiBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZC4KKyAqIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBub3Qgc2FmZSB0byBwbGFjZSBwb2ludGVycyBpbiBzdGF0aWMgc3RydWN0dXJlcy4KKyAqLworCisvKgorICogR2V0dGluZyB0byBwcm92YWJsZSBzYWZlIGluIHBsYWNlIGRlY29tcHJlc3Npb24gaXMgaGFyZC4KKyAqIFdvcnN0IGNhc2UgYmVoYXZpb3VycyBuZWVkIHRvIGJlIGFuYWxpemVkLgorICogQmFja2dyb3VuZCBpbmZvcm1hdGlvbjoKKyAqCisgKiBUaGUgZmlsZSBsYXlvdXQgaXM6CisgKiAgICBtYWdpY1syXQorICogICAgbWV0aG9kWzFdCisgKiAgICBmbGFnc1sxXQorICogICAgdGltZXN0YW1wWzRdCisgKiAgICBleHRyYWZsYWdzWzFdCisgKiAgICBvc1sxXQorICogICAgY29tcHJlc3NlZCBkYXRhIGJsb2Nrc1tOXQorICogICAgY3JjWzRdIG9yaWdfbGVuWzRdCisgKgorICogcmVzdWx0aW5nIGluIDE4IGJ5dGVzIG9mIG5vbiBjb21wcmVzc2VkIGRhdGEgb3ZlcmhlYWQuCisgKgorICogRmlsZXMgZGl2aWRlZCBpbnRvIGJsb2NrcworICogMSBiaXQgKGxhc3QgYmxvY2sgZmxhZykKKyAqIDIgYml0cyAoYmxvY2sgdHlwZSkKKyAqCisgKiAxIGJsb2NrIG9jY3VycyBldmVyeSAzMksgLTEgYnl0ZXMgb3Igd2hlbiB0aGVyZSA1MCUgY29tcHJlc3Npb24gaGFzIGJlZW4gYWNoaWV2ZWQuCisgKiBUaGUgc21hbGxlc3QgYmxvY2sgdHlwZSBlbmNvZGluZyBpcyBhbHdheXMgdXNlZC4KKyAqCisgKiBzdG9yZWQ6CisgKiAgICAzMiBiaXRzIGxlbmd0aCBpbiBieXRlcy4KKyAqCisgKiBmaXhlZDoKKyAqICAgIG1hZ2ljIGZpeGVkIHRyZWUuCisgKiAgICBzeW1ib2xzLgorICoKKyAqIGR5bmFtaWM6CisgKiAgICBkeW5hbWljIHRyZWUgZW5jb2RpbmcuCisgKiAgICBzeW1ib2xzLgorICoKKyAqCisgKiBUaGUgYnVmZmVyIGZvciBkZWNvbXByZXNzaW9uIGluIHBsYWNlIGlzIHRoZSBsZW5ndGggb2YgdGhlCisgKiB1bmNvbXByZXNzZWQgZGF0YSwgcGx1cyBhIHNtYWxsIGFtb3VudCBleHRyYSB0byBrZWVwIHRoZSBhbGdvcml0aG0gc2FmZS4KKyAqIFRoZSBjb21wcmVzc2VkIGRhdGEgaXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gIFRoZSBvdXRwdXQKKyAqIHBvaW50ZXIgaXMgcGxhY2VkIGF0IHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIGFuZCB0aGUgaW5wdXQgcG9pbnRlcgorICogaXMgcGxhY2VkIHdoZXJlIHRoZSBjb21wcmVzc2VkIGRhdGEgc3RhcnRzLiAgUHJvYmxlbXMgd2lsbCBvY2N1cgorICogd2hlbiB0aGUgb3V0cHV0IHBvaW50ZXIgb3ZlcnJ1bnMgdGhlIGlucHV0IHBvaW50ZXIuCisgKgorICogVGhlIG91dHB1dCBwb2ludGVyIGNhbiBvbmx5IG92ZXJydW4gdGhlIGlucHV0IHBvaW50ZXIgaWYgdGhlIGlucHV0CisgKiBwb2ludGVyIGlzIG1vdmluZyBmYXN0ZXIgdGhhbiB0aGUgb3V0cHV0IHBvaW50ZXIuICBBIGNvbmRpdGlvbiBvbmx5CisgKiB0cmlnZ2VyZWQgYnkgZGF0YSB3aG9zZSBjb21wcmVzc2VkIGZvcm0gaXMgbGFyZ2VyIHRoYW4gdGhlIHVuY29tcHJlc3NlZAorICogZm9ybS4KKyAqCisgKiBUaGUgd29yc3QgY2FzZSBhdCB0aGUgYmxvY2sgbGV2ZWwgaXMgYSBncm93dGggb2YgdGhlIGNvbXByZXNzZWQgZGF0YQorICogb2YgNSBieXRlcyBwZXIgMzI3NjcgYnl0ZXMuCisgKgorICogVGhlIHdvcnN0IGNhc2UgaW50ZXJuYWwgdG8gYSBjb21wcmVzc2VkIGJsb2NrIGlzIHZlcnkgaGFyZCB0byBmaWd1cmUuCisgKiBUaGUgd29yc3QgY2FzZSBjYW4gYXQgbGVhc3QgYmUgYm91bmRpbmVkIGJ5IGhhdmluZyBvbmUgYml0IHRoYXQgcmVwcmVzZW50cworICogMzI3NjQgYnl0ZXMgYW5kIHRoZW4gYWxsIG9mIHRoZSByZXN0IG9mIHRoZSBieXRlcyByZXByZXNlbnRpbmcgdGhlIHZlcnkKKyAqIHZlcnkgbGFzdCBieXRlLgorICoKKyAqIEFsbCBvZiB3aGljaCBpcyBlbm91Z2ggdG8gY29tcHV0ZSBhbiBhbW91bnQgb2YgZXh0cmEgZGF0YSB0aGF0IGlzIHJlcXVpcmVkCisgKiB0byBiZSBzYWZlLiAgVG8gYXZvaWQgcHJvYmxlbXMgYXQgdGhlIGJsb2NrIGxldmVsIGFsbG9jYXRpbmcgNSBleHRyYSBieXRlcworICogcGVyIDMyNzY3IGJ5dGVzIG9mIGRhdGEgaXMgc3VmZmljaWVudC4gIFRvIGF2b2luZCBwcm9ibGVtcyBpbnRlcm5hbCB0byBhIGJsb2NrCisgKiBhZGRpbmcgYW4gZXh0cmEgMzI3NjcgYnl0ZXMgKHRoZSB3b3JzdCBjYXNlIHVuY29tcHJlc3NlZCBibG9jayBzaXplKSBpcworICogc3VmZmljaWVudCwgdG8gZW5zdXJlIHRoYXQgaW4gdGhlIHdvcnN0IGNhc2UgdGhlIGRlY29tcHJlc3NlZCBkYXRhIGZvcgorICogYmxvY2sgd2lsbCBzdG9wIHRoZSBieXRlIGJlZm9yZSB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBhIGJsb2NrIGJlZ2lucy4KKyAqIFRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGhlIGNvbXByZXNzZWQgZGF0YSdzIG1ldGEgaW5mb3JtYXRpb24gYW4gZXh0cmEgMTgKKyAqIGJ5dGVzIGFyZSBuZWVkZWQuICBMZWFkaW5nIHRvIHRoZSBmb3JtdWxhOgorICoKKyAqIGV4dHJhX2J5dGVzID0gKHVuY29tcHJlc3NlZF9zaXplID4+IDEyKSArIDMyNzY4ICsgMTggKyBkZWNvbXByZXNzb3Jfc2l6ZS4KKyAqCisgKiBBZGRpbmcgOCBieXRlcyBwZXIgMzJLIGlzIGEgYml0IGV4Y2Vzc2l2ZSBidXQgbXVjaCBlYXNpZXIgdG8gY2FsY3VsYXRlLgorICogQWRkaW5nIDMyNzY4IGluc3RlYWQgb2YgMzI3NjcganVzdCBtYWtlcyBmb3Igcm91bmQgbnVtYmVycy4KKyAqIEFkZGluZyB0aGUgZGVjb21wcmVzc29yX3NpemUgaXMgbmVjZXNzYXJ5IGFzIGl0IG11c2h0IGxpdmUgYWZ0ZXIgYWxsCisgKiBvZiB0aGUgZGF0YSBhcyB3ZWxsLiAgTGFzdCBJIG1lYXN1cmVkIHRoZSBkZWNvbXByZXNzb3IgaXMgYWJvdXQgMTRLLgorICogMTBLIG9mIGFjdHVhbGwgZGF0YSBhbmQgNEsgb2YgYnNzLgorICoKKyAqLwogCiAvKgogICogZ3ppcCBkZWNsYXJhdGlvbnMKQEAgLTMwLDE1ICsxMTMsMjAgQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNoOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1bGc7CiAKLSNkZWZpbmUgV1NJWkUgMHg4MDAwCQkvKiBXaW5kb3cgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDMyaywgKi8KLQkJCQkvKiBhbmQgYSBwb3dlciBvZiB0d28gKi8KKyNkZWZpbmUgV1NJWkUgMHg4MDAwMDAwMAkvKiBXaW5kb3cgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDMyaywKKwkJCQkgKiBhbmQgYSBwb3dlciBvZiB0d28KKwkJCQkgKiBXZSBkb24ndCBhY3R1YWxseSBoYXZlIGEgd2luZG93IGp1c3QKKwkJCQkgKiBhIGh1Z2Ugb3V0cHV0IGJ1ZmZlciBzbyBJIHJlcG9ydAorCQkJCSAqIGEgMkcgd2luZG93cyBzaXplLCBhcyB0aGF0IHNob3VsZAorCQkJCSAqIGFsd2F5cyBiZSBsYXJnZXIgdGhhbiBvdXIgb3V0cHV0IGJ1ZmZlci4KKwkJCQkgKi8KIAotc3RhdGljIHVjaCAqaW5idWY7CSAgICAgLyogaW5wdXQgYnVmZmVyICovCi1zdGF0aWMgdWNoIHdpbmRvd1tXU0laRV07ICAgIC8qIFNsaWRpbmcgd2luZG93IGJ1ZmZlciAqLworc3RhdGljIHVjaCAqaW5idWY7CS8qIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIHVjaCAqd2luZG93OwkvKiBTbGlkaW5nIHdpbmRvdyBidWZmZXIsIChhbmQgZmluYWwgb3V0cHV0IGJ1ZmZlcikgKi8KIAotc3RhdGljIHVuc2lnbmVkIGluc2l6ZSA9IDA7ICAvKiB2YWxpZCBieXRlcyBpbiBpbmJ1ZiAqLwotc3RhdGljIHVuc2lnbmVkIGlucHRyID0gMDsgICAvKiBpbmRleCBvZiBuZXh0IGJ5dGUgdG8gYmUgcHJvY2Vzc2VkIGluIGluYnVmICovCi1zdGF0aWMgdW5zaWduZWQgb3V0Y250ID0gMDsgIC8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnNpemU7ICAvKiB2YWxpZCBieXRlcyBpbiBpbmJ1ZiAqLworc3RhdGljIHVuc2lnbmVkIGlucHRyOyAgIC8qIGluZGV4IG9mIG5leHQgYnl0ZSB0byBiZSBwcm9jZXNzZWQgaW4gaW5idWYgKi8KK3N0YXRpYyB1bnNpZ25lZCBvdXRjbnQ7ICAvKiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCiAKIC8qIGd6aXAgZmxhZyBieXRlICovCiAjZGVmaW5lIEFTQ0lJX0ZMQUcgICAweDAxIC8qIGJpdCAwIHNldDogZmlsZSBwcm9iYWJseSBBU0NJSSB0ZXh0ICovCkBAIC04OSw4ICsxNzcsNiBAQAogZXh0ZXJuIGludCBpbnB1dF9sZW47CiAKIHN0YXRpYyBsb25nIGJ5dGVzX291dCA9IDA7Ci1zdGF0aWMgdWNoICpvdXRwdXRfZGF0YTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG91dHB1dF9wdHIgPSAwOwogCiBzdGF0aWMgdm9pZCAqbWFsbG9jKGludCBzaXplKTsKIHN0YXRpYyB2b2lkIGZyZWUodm9pZCAqd2hlcmUpOwpAQCAtMTAwLDI0ICsxODYsMTcgQEAKIAogc3RhdGljIHZvaWQgcHV0c3RyKGNvbnN0IGNoYXIgKik7CiAKLWV4dGVybiBpbnQgZW5kOwotc3RhdGljIGxvbmcgZnJlZV9tZW1fcHRyID0gKGxvbmcpJmVuZDsKLXN0YXRpYyBsb25nIGZyZWVfbWVtX2VuZF9wdHI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBmcmVlX21lbV9wdHI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBmcmVlX21lbV9lbmRfcHRyOwogCi0jZGVmaW5lIElOUExBQ0VfTU9WRV9ST1VUSU5FICAweDEwMDAKLSNkZWZpbmUgTE9XX0JVRkZFUl9TVEFSVCAgICAgIDB4MjAwMAotI2RlZmluZSBMT1dfQlVGRkVSX01BWCAgICAgICAweDkwMDAwCiAjZGVmaW5lIEhFQVBfU0laRSAgICAgICAgICAgICAweDMwMDAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbG93X2J1ZmZlcl9lbmQsIGxvd19idWZmZXJfc2l6ZTsKLXN0YXRpYyBpbnQgaGlnaF9sb2FkZWQgPTA7Ci1zdGF0aWMgdWNoICpoaWdoX2J1ZmZlcl9zdGFydCAvKiA9ICh1Y2ggKikoKCh1bGcpJmVuZCkgKyBIRUFQX1NJWkUpKi87CiAKIHN0YXRpYyBjaGFyICp2aWRtZW0gPSAoY2hhciAqKTB4YjgwMDA7CiBzdGF0aWMgaW50IHZpZHBvcnQ7CiBzdGF0aWMgaW50IGxpbmVzLCBjb2xzOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQotc3RhdGljIHZvaWQgKiB4cXVhZF9wb3J0aW8gPSBOVUxMOwordm9pZCAqeHF1YWRfcG9ydGlvOwogI2VuZGlmCiAKICNpbmNsdWRlICIuLi8uLi8uLi8uLi9saWIvaW5mbGF0ZS5jIgpAQCAtMTUxLDcgKzIzMCw3IEBACiAKIHN0YXRpYyB2b2lkIGd6aXBfcmVsZWFzZSh2b2lkICoqcHRyKQogewotCWZyZWVfbWVtX3B0ciA9IChsb25nKSAqcHRyOworCWZyZWVfbWVtX3B0ciA9ICh1bnNpZ25lZCBsb25nKSAqcHRyOwogfQogIAogc3RhdGljIHZvaWQgc2Nyb2xsKHZvaWQpCkBAIC0xNzksNyArMjU4LDcgQEAKIAkJCQl5LS07CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl2aWRtZW0gWyAoIHggKyBjb2xzICogeSApICogMiBdID0gYzsgCisJCQl2aWRtZW0gWyAoIHggKyBjb2xzICogeSApICogMiBdID0gYzsKIAkJCWlmICggKyt4ID49IGNvbHMgKSB7CiAJCQkJeCA9IDA7CiAJCQkJaWYgKCArK3kgPj0gbGluZXMgKSB7CkBAIC0yMjQsNTggKzMwMywzMSBAQAogICovCiBzdGF0aWMgaW50IGZpbGxfaW5idWYodm9pZCkKIHsKLQlpZiAoaW5zaXplICE9IDApIHsKLQkJZXJyb3IoInJhbiBvdXQgb2YgaW5wdXQgZGF0YSIpOwotCX0KLQotCWluYnVmID0gaW5wdXRfZGF0YTsKLQlpbnNpemUgPSBpbnB1dF9sZW47Ci0JaW5wdHIgPSAxOwotCXJldHVybiBpbmJ1ZlswXTsKKwllcnJvcigicmFuIG91dCBvZiBpbnB1dCBkYXRhIik7CisJcmV0dXJuIDA7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogV3JpdGUgdGhlIG91dHB1dCB3aW5kb3cgd2luZG93WzAuLm91dGNudC0xXSBhbmQgdXBkYXRlIGNyYyBhbmQgYnl0ZXNfb3V0LgogICogKFVzZWQgZm9yIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBvbmx5LikKICAqLwotc3RhdGljIHZvaWQgZmx1c2hfd2luZG93X2xvdyh2b2lkKQotewotICAgIHVsZyBjID0gY3JjOyAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLwotICAgIHVuc2lnbmVkIG47Ci0gICAgdWNoICppbiwgKm91dCwgY2g7Ci0gICAgCi0gICAgaW4gPSB3aW5kb3c7Ci0gICAgb3V0ID0gJm91dHB1dF9kYXRhW291dHB1dF9wdHJdOyAKLSAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKLQkgICAgY2ggPSAqb3V0KysgPSAqaW4rKzsKLQkgICAgYyA9IGNyY18zMl90YWJbKChpbnQpYyBeIGNoKSAmIDB4ZmZdIF4gKGMgPj4gOCk7Ci0gICAgfQotICAgIGNyYyA9IGM7Ci0gICAgYnl0ZXNfb3V0ICs9ICh1bGcpb3V0Y250OwotICAgIG91dHB1dF9wdHIgKz0gKHVsZylvdXRjbnQ7Ci0gICAgb3V0Y250ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgZmx1c2hfd2luZG93X2hpZ2godm9pZCkKLXsKLSAgICB1bGcgYyA9IGNyYzsgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KLSAgICB1bnNpZ25lZCBuOwotICAgIHVjaCAqaW4sICBjaDsKLSAgICBpbiA9IHdpbmRvdzsKLSAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKLQljaCA9ICpvdXRwdXRfZGF0YSsrID0gKmluKys7Ci0JaWYgKCh1bGcpb3V0cHV0X2RhdGEgPT0gbG93X2J1ZmZlcl9lbmQpIG91dHB1dF9kYXRhPWhpZ2hfYnVmZmVyX3N0YXJ0OwotCWMgPSBjcmNfMzJfdGFiWygoaW50KWMgXiBjaCkgJiAweGZmXSBeIChjID4+IDgpOwotICAgIH0KLSAgICBjcmMgPSBjOwotICAgIGJ5dGVzX291dCArPSAodWxnKW91dGNudDsKLSAgICBvdXRjbnQgPSAwOwotfQotCiBzdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCkKIHsKLQlpZiAoaGlnaF9sb2FkZWQpIGZsdXNoX3dpbmRvd19oaWdoKCk7Ci0JZWxzZSBmbHVzaF93aW5kb3dfbG93KCk7CisJLyogV2l0aCBteSB3aW5kb3cgZXF1YWwgdG8gbXkgb3V0cHV0IGJ1ZmZlcgorCSAqIEkgb25seSBuZWVkIHRvIGNvbXB1dGUgdGhlIGNyYyBoZXJlLgorCSAqLworCXVsZyBjID0gY3JjOyAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworCXVuc2lnbmVkIG47CisJdWNoICppbiwgY2g7CisKKwlpbiA9IHdpbmRvdzsKKwlmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKKwkJY2ggPSAqaW4rKzsKKwkJYyA9IGNyY18zMl90YWJbKChpbnQpYyBeIGNoKSAmIDB4ZmZdIF4gKGMgPj4gOCk7CisJfQorCWNyYyA9IGM7CisJYnl0ZXNfb3V0ICs9ICh1bGcpb3V0Y250OworCW91dGNudCA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIGVycm9yKGNoYXIgKngpCkBAIC0yODcsNjYgKzMzOSw4IEBACiAJd2hpbGUoMSk7CS8qIEhhbHQgKi8KIH0KIAotI2RlZmluZSBTVEFDS19TSVpFICg0MDk2KQotCi1sb25nIHVzZXJfc3RhY2sgW1NUQUNLX1NJWkVdOwotCi1zdHJ1Y3QgewotCWxvbmcgKiBhOwotCXNob3J0IGI7Ci0JfSBzdGFja19zdGFydCA9IHsgJiB1c2VyX3N0YWNrIFtTVEFDS19TSVpFXSAsIF9fQk9PVF9EUyB9OwotCi1zdGF0aWMgdm9pZCBzZXR1cF9ub3JtYWxfb3V0cHV0X2J1ZmZlcih2b2lkKQotewotI2lmZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKLQlpZiAoUk1fRVhUX01FTV9LIDwgMTAyNCkgZXJyb3IoIkxlc3MgdGhhbiAyTUIgb2YgbWVtb3J5Iik7Ci0jZWxzZQotCWlmICgoUk1fQUxUX01FTV9LID4gUk1fRVhUX01FTV9LID8gUk1fQUxUX01FTV9LIDogUk1fRVhUX01FTV9LKSA8IDEwMjQpIGVycm9yKCJMZXNzIHRoYW4gMk1CIG9mIG1lbW9yeSIpOwotI2VuZGlmCi0Jb3V0cHV0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKV9fUEhZU0lDQUxfU1RBUlQ7IC8qIE5vcm1hbGx5IFBvaW50cyB0byAxTSAqLwotCWZyZWVfbWVtX2VuZF9wdHIgPSAobG9uZylyZWFsX21vZGU7Ci19Ci0KLXN0cnVjdCBtb3ZlcGFyYW1zIHsKLQl1Y2ggKmxvd19idWZmZXJfc3RhcnQ7ICBpbnQgbGNvdW50OwotCXVjaCAqaGlnaF9idWZmZXJfc3RhcnQ7IGludCBoY291bnQ7Ci19OwotCi1zdGF0aWMgdm9pZCBzZXR1cF9vdXRwdXRfYnVmZmVyX2lmX3dlX3J1bl9oaWdoKHN0cnVjdCBtb3ZlcGFyYW1zICptdikKLXsKLQloaWdoX2J1ZmZlcl9zdGFydCA9ICh1Y2ggKikoKCh1bGcpJmVuZCkgKyBIRUFQX1NJWkUpOwotI2lmZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKLQlpZiAoUk1fRVhUX01FTV9LIDwgKDMqMTAyNCkpIGVycm9yKCJMZXNzIHRoYW4gNE1CIG9mIG1lbW9yeSIpOwotI2Vsc2UKLQlpZiAoKFJNX0FMVF9NRU1fSyA+IFJNX0VYVF9NRU1fSyA/IFJNX0FMVF9NRU1fSyA6IFJNX0VYVF9NRU1fSykgPCAoMyoxMDI0KSkgZXJyb3IoIkxlc3MgdGhhbiA0TUIgb2YgbWVtb3J5Iik7Ci0jZW5kaWYJCi0JbXYtPmxvd19idWZmZXJfc3RhcnQgPSBvdXRwdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopTE9XX0JVRkZFUl9TVEFSVDsKLQlsb3dfYnVmZmVyX2VuZCA9ICgodW5zaWduZWQgaW50KXJlYWxfbW9kZSA+IExPV19CVUZGRVJfTUFYCi0JICA/IExPV19CVUZGRVJfTUFYIDogKHVuc2lnbmVkIGludClyZWFsX21vZGUpICYgfjB4ZmZmOwotCWxvd19idWZmZXJfc2l6ZSA9IGxvd19idWZmZXJfZW5kIC0gTE9XX0JVRkZFUl9TVEFSVDsKLQloaWdoX2xvYWRlZCA9IDE7Ci0JZnJlZV9tZW1fZW5kX3B0ciA9IChsb25nKWhpZ2hfYnVmZmVyX3N0YXJ0OwotCWlmICggKF9fUEhZU0lDQUxfU1RBUlQgKyBsb3dfYnVmZmVyX3NpemUpID4gKCh1bGcpaGlnaF9idWZmZXJfc3RhcnQpKSB7Ci0JCWhpZ2hfYnVmZmVyX3N0YXJ0ID0gKHVjaCAqKShfX1BIWVNJQ0FMX1NUQVJUICsgbG93X2J1ZmZlcl9zaXplKTsKLQkJbXYtPmhjb3VudCA9IDA7IC8qIHNheTogd2UgbmVlZCBub3QgdG8gbW92ZSBoaWdoX2J1ZmZlciAqLwotCX0KLQllbHNlIG12LT5oY291bnQgPSAtMTsKLQltdi0+aGlnaF9idWZmZXJfc3RhcnQgPSBoaWdoX2J1ZmZlcl9zdGFydDsKLX0KLQotc3RhdGljIHZvaWQgY2xvc2Vfb3V0cHV0X2J1ZmZlcl9pZl93ZV9ydW5faGlnaChzdHJ1Y3QgbW92ZXBhcmFtcyAqbXYpCi17Ci0JaWYgKGJ5dGVzX291dCA+IGxvd19idWZmZXJfc2l6ZSkgewotCQltdi0+bGNvdW50ID0gbG93X2J1ZmZlcl9zaXplOwotCQlpZiAobXYtPmhjb3VudCkKLQkJCW12LT5oY291bnQgPSBieXRlc19vdXQgLSBsb3dfYnVmZmVyX3NpemU7Ci0JfSBlbHNlIHsKLQkJbXYtPmxjb3VudCA9IGJ5dGVzX291dDsKLQkJbXYtPmhjb3VudCA9IDA7Ci0JfQotfQotCi1hc21saW5rYWdlIGludCBkZWNvbXByZXNzX2tlcm5lbChzdHJ1Y3QgbW92ZXBhcmFtcyAqbXYsIHZvaWQgKnJtb2RlKQorYXNtbGlua2FnZSB2b2lkIGRlY29tcHJlc3Nfa2VybmVsKHZvaWQgKnJtb2RlLCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJCXVjaCAqaW5wdXRfZGF0YSwgdW5zaWduZWQgbG9uZyBpbnB1dF9sZW4sIHVjaCAqb3V0cHV0KQogewogCXJlYWxfbW9kZSA9IHJtb2RlOwogCkBAIC0zNjEsMTMgKzM1NSwyNSBAQAogCWxpbmVzID0gUk1fU0NSRUVOX0lORk8ub3JpZ192aWRlb19saW5lczsKIAljb2xzID0gUk1fU0NSRUVOX0lORk8ub3JpZ192aWRlb19jb2xzOwogCi0JaWYgKGZyZWVfbWVtX3B0ciA8IDB4MTAwMDAwKSBzZXR1cF9ub3JtYWxfb3V0cHV0X2J1ZmZlcigpOwotCWVsc2Ugc2V0dXBfb3V0cHV0X2J1ZmZlcl9pZl93ZV9ydW5faGlnaChtdik7CisJd2luZG93ID0gb3V0cHV0OyAgCS8qIE91dHB1dCBidWZmZXIgKE5vcm1hbGx5IGF0IDFNKSAqLworCWZyZWVfbWVtX3B0ciAgICAgPSBlbmQ7CS8qIEhlYXAgICovCisJZnJlZV9tZW1fZW5kX3B0ciA9IGVuZCArIEhFQVBfU0laRTsKKwlpbmJ1ZiAgPSBpbnB1dF9kYXRhOwkvKiBJbnB1dCBidWZmZXIgKi8KKwlpbnNpemUgPSBpbnB1dF9sZW47CisJaW5wdHIgID0gMDsKKworCWlmICgodTMyKW91dHB1dCAmIChDT05GSUdfUEhZU0lDQUxfQUxJR04gLTEpKQorCQllcnJvcigiRGVzdGluYXRpb24gYWRkcmVzcyBub3QgQ09ORklHX1BIWVNJQ0FMX0FMSUdOIGFsaWduZWQiKTsKKwlpZiAoZW5kID4gKCgtX19QQUdFX09GRlNFVC0oNTEyIDw8MjApLTEpICYgMHg3ZmZmZmZmZikpCisJCWVycm9yKCJEZXN0aW5hdGlvbiBhZGRyZXNzIHRvbyBsYXJnZSIpOworI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKwlpZiAoKHUzMilvdXRwdXQgIT0gTE9BRF9QSFlTSUNBTF9BRERSKQorCQllcnJvcigiV3JvbmcgZGVzdGluYXRpb24gYWRkcmVzcyIpOworI2VuZGlmCiAKIAltYWtlY3JjKCk7CiAJcHV0c3RyKCJVbmNvbXByZXNzaW5nIExpbnV4Li4uICIpOwogCWd1bnppcCgpOwogCXB1dHN0cigiT2ssIGJvb3RpbmcgdGhlIGtlcm5lbC5cbiIpOwotCWlmIChoaWdoX2xvYWRlZCkgY2xvc2Vfb3V0cHV0X2J1ZmZlcl9pZl93ZV9ydW5faGlnaChtdik7Ci0JcmV0dXJuIGhpZ2hfbG9hZGVkOworCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvcmVsb2NzLmMgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3JlbG9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OGRhODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3JlbG9jcy5jCkBAIC0wLDAgKzEsNjI1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZGVmaW5lIFVTRV9CU0QKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworI2RlZmluZSBNQVhfU0hEUlMgMTAwCitzdGF0aWMgRWxmMzJfRWhkciBlaGRyOworc3RhdGljIEVsZjMyX1NoZHIgc2hkcltNQVhfU0hEUlNdOworc3RhdGljIEVsZjMyX1N5bSAgKnN5bXRhYltNQVhfU0hEUlNdOworc3RhdGljIEVsZjMyX1JlbCAgKnJlbHRhYltNQVhfU0hEUlNdOworc3RhdGljIGNoYXIgKnN0cnRhYltNQVhfU0hEUlNdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVsb2NfY291bnQsIHJlbG9jX2lkeDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICpyZWxvY3M7CisKKy8qCisgKiBGb2xsb3dpbmcgc3ltYm9scyBoYXZlIGJlZW4gYXVkaXRlZC4gVGhlcmUgdmFsdWVzIGFyZSBjb25zdGFudCBhbmQgZG8KKyAqIG5vdCBjaGFuZ2UgaWYgYnpJbWFnZSBpcyBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVzcyB0aGFuCisgKiB0aGUgYWRkcmVzcyBmb3Igd2hpY2ggaXQgaGFzIGJlZW4gY29tcGlsZWQuIERvbid0IHdhcm4gdXNlciBhYm91dAorICogYWJzb2x1dGUgcmVsb2NhdGlvbnMgcHJlc2VudCB3LnIudCB0aGVzZSBzeW1ib2xzLgorICovCitzdGF0aWMgY29uc3QgY2hhciogc2FmZV9hYnNfcmVsb2NzW10gPSB7CisJCSJfX2tlcm5lbF92c3lzY2FsbCIsCisJCSJfX2tlcm5lbF9ydF9zaWdyZXR1cm4iLAorCQkiX19rZXJuZWxfc2lncmV0dXJuIiwKKwkJIlNZU0VOVEVSX1JFVFVSTiIsCit9OworCitzdGF0aWMgaW50IGlzX3NhZmVfYWJzX3JlbG9jKGNvbnN0IGNoYXIqIHN5bV9uYW1lKQoreworCWludCBpLCBhcnJheV9zaXplOworCisJYXJyYXlfc2l6ZSA9IHNpemVvZihzYWZlX2Fic19yZWxvY3MpL3NpemVvZihjaGFyKik7CisKKwlmb3IoaSA9IDA7IGkgPCBhcnJheV9zaXplOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoc3ltX25hbWUsIHNhZmVfYWJzX3JlbG9jc1tpXSkpCisJCQkvKiBNYXRjaCBmb3VuZCAqLworCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaWUoY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJZXhpdCgxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnN5bV90eXBlKHVuc2lnbmVkIHR5cGUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZVtdID0geworI2RlZmluZSBTWU1fVFlQRShYKSBbWF0gPSAjWAorCQlTWU1fVFlQRShTVFRfTk9UWVBFKSwKKwkJU1lNX1RZUEUoU1RUX09CSkVDVCksCisJCVNZTV9UWVBFKFNUVF9GVU5DKSwKKwkJU1lNX1RZUEUoU1RUX1NFQ1RJT04pLAorCQlTWU1fVFlQRShTVFRfRklMRSksCisJCVNZTV9UWVBFKFNUVF9DT01NT04pLAorCQlTWU1fVFlQRShTVFRfVExTKSwKKyN1bmRlZiBTWU1fVFlQRQorCX07CisJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIHN5bSB0eXBlIG5hbWUiOworCWlmICh0eXBlIDwgc2l6ZW9mKHR5cGVfbmFtZSkvc2l6ZW9mKHR5cGVfbmFtZVswXSkpIHsKKwkJbmFtZSA9IHR5cGVfbmFtZVt0eXBlXTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzeW1fYmluZCh1bnNpZ25lZCBiaW5kKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpiaW5kX25hbWVbXSA9IHsKKyNkZWZpbmUgU1lNX0JJTkQoWCkgW1hdID0gI1gKKwkJU1lNX0JJTkQoU1RCX0xPQ0FMKSwKKwkJU1lNX0JJTkQoU1RCX0dMT0JBTCksCisJCVNZTV9CSU5EKFNUQl9XRUFLKSwKKyN1bmRlZiBTWU1fQklORAorCX07CisJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIHN5bSBiaW5kIG5hbWUiOworCWlmIChiaW5kIDwgc2l6ZW9mKGJpbmRfbmFtZSkvc2l6ZW9mKGJpbmRfbmFtZVswXSkpIHsKKwkJbmFtZSA9IGJpbmRfbmFtZVtiaW5kXTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzeW1fdmlzaWJpbGl0eSh1bnNpZ25lZCB2aXNpYmlsaXR5KQoreworCXN0YXRpYyBjb25zdCBjaGFyICp2aXNpYmlsaXR5X25hbWVbXSA9IHsKKyNkZWZpbmUgU1lNX1ZJU0lCSUxJVFkoWCkgW1hdID0gI1gKKwkJU1lNX1ZJU0lCSUxJVFkoU1RWX0RFRkFVTFQpLAorCQlTWU1fVklTSUJJTElUWShTVFZfSU5URVJOQUwpLAorCQlTWU1fVklTSUJJTElUWShTVFZfSElEREVOKSwKKwkJU1lNX1ZJU0lCSUxJVFkoU1RWX1BST1RFQ1RFRCksCisjdW5kZWYgU1lNX1ZJU0lCSUxJVFkKKwl9OworCWNvbnN0IGNoYXIgKm5hbWUgPSAidW5rbm93biBzeW0gdmlzaWJpbGl0eSBuYW1lIjsKKwlpZiAodmlzaWJpbGl0eSA8IHNpemVvZih2aXNpYmlsaXR5X25hbWUpL3NpemVvZih2aXNpYmlsaXR5X25hbWVbMF0pKSB7CisJCW5hbWUgPSB2aXNpYmlsaXR5X25hbWVbdmlzaWJpbGl0eV07CisJfQorCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcmVsX3R5cGUodW5zaWduZWQgdHlwZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lW10gPSB7CisjZGVmaW5lIFJFTF9UWVBFKFgpIFtYXSA9ICNYCisJCVJFTF9UWVBFKFJfMzg2X05PTkUpLAorCQlSRUxfVFlQRShSXzM4Nl8zMiksCisJCVJFTF9UWVBFKFJfMzg2X1BDMzIpLAorCQlSRUxfVFlQRShSXzM4Nl9HT1QzMiksCisJCVJFTF9UWVBFKFJfMzg2X1BMVDMyKSwKKwkJUkVMX1RZUEUoUl8zODZfQ09QWSksCisJCVJFTF9UWVBFKFJfMzg2X0dMT0JfREFUKSwKKwkJUkVMX1RZUEUoUl8zODZfSk1QX1NMT1QpLAorCQlSRUxfVFlQRShSXzM4Nl9SRUxBVElWRSksCisJCVJFTF9UWVBFKFJfMzg2X0dPVE9GRiksCisJCVJFTF9UWVBFKFJfMzg2X0dPVFBDKSwKKyN1bmRlZiBSRUxfVFlQRQorCX07CisJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIHR5cGUgcmVsIHR5cGUgbmFtZSI7CisJaWYgKHR5cGUgPCBzaXplb2YodHlwZV9uYW1lKS9zaXplb2YodHlwZV9uYW1lWzBdKSkgeworCQluYW1lID0gdHlwZV9uYW1lW3R5cGVdOworCX0KKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNlY19uYW1lKHVuc2lnbmVkIHNobmR4KQoreworCWNvbnN0IGNoYXIgKnNlY19zdHJ0YWI7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzZWNfc3RydGFiID0gc3RydGFiW2VoZHIuZV9zaHN0cm5keF07CisJbmFtZSA9ICI8bm9uYW1lPiI7CisJaWYgKHNobmR4IDwgZWhkci5lX3NobnVtKSB7CisJCW5hbWUgPSBzZWNfc3RydGFiICsgc2hkcltzaG5keF0uc2hfbmFtZTsKKwl9CisJZWxzZSBpZiAoc2huZHggPT0gU0hOX0FCUykgeworCQluYW1lID0gIkFCU09MVVRFIjsKKwl9CisJZWxzZSBpZiAoc2huZHggPT0gU0hOX0NPTU1PTikgeworCQluYW1lID0gIkNPTU1PTiI7CisJfQorCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3ltX25hbWUoY29uc3QgY2hhciAqc3ltX3N0cnRhYiwgRWxmMzJfU3ltICpzeW0pCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwluYW1lID0gIjxub25hbWU+IjsKKwlpZiAoc3ltLT5zdF9uYW1lKSB7CisJCW5hbWUgPSBzeW1fc3RydGFiICsgc3ltLT5zdF9uYW1lOworCX0KKwllbHNlIHsKKwkJbmFtZSA9IHNlY19uYW1lKHNoZHJbc3ltLT5zdF9zaG5keF0uc2hfbmFtZSk7CisJfQorCXJldHVybiBuYW1lOworfQorCisKKworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorI2RlZmluZSBsZTE2X3RvX2NwdSh2YWwpICh2YWwpCisjZGVmaW5lIGxlMzJfdG9fY3B1KHZhbCkgKHZhbCkKKyNlbmRpZgorI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorI2RlZmluZSBsZTE2X3RvX2NwdSh2YWwpIGJzd2FwXzE2KHZhbCkKKyNkZWZpbmUgbGUzMl90b19jcHUodmFsKSBic3dhcF8zMih2YWwpCisjZW5kaWYKKworc3RhdGljIHVpbnQxNl90IGVsZjE2X3RvX2NwdSh1aW50MTZfdCB2YWwpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KHZhbCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBlbGYzMl90b19jcHUodWludDMyX3QgdmFsKQoreworCXJldHVybiBsZTMyX3RvX2NwdSh2YWwpOworfQorCitzdGF0aWMgdm9pZCByZWFkX2VoZHIoRklMRSAqZnApCit7CisJaWYgKGZyZWFkKCZlaGRyLCBzaXplb2YoZWhkciksIDEsIGZwKSAhPSAxKSB7CisJCWRpZSgiQ2Fubm90IHJlYWQgRUxGIGhlYWRlcjogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCX0KKwlpZiAobWVtY21wKGVoZHIuZV9pZGVudCwgRUxGTUFHLCA0KSAhPSAwKSB7CisJCWRpZSgiTm8gRUxGIG1hZ2ljXG4iKTsKKwl9CisJaWYgKGVoZHIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1MzMikgeworCQlkaWUoIk5vdCBhIDMyIGJpdCBleGVjdXRhYmxlXG4iKTsKKwl9CisJaWYgKGVoZHIuZV9pZGVudFtFSV9EQVRBXSAhPSBFTEZEQVRBMkxTQikgeworCQlkaWUoIk5vdCBhIExTQiBFTEYgZXhlY3V0YWJsZVxuIik7CisJfQorCWlmIChlaGRyLmVfaWRlbnRbRUlfVkVSU0lPTl0gIT0gRVZfQ1VSUkVOVCkgeworCQlkaWUoIlVua25vd24gRUxGIHZlcnNpb25cbiIpOworCX0KKwkvKiBDb252ZXJ0IHRoZSBmaWVsZHMgdG8gbmF0aXZlIGVuZGlhbiAqLworCWVoZHIuZV90eXBlICAgICAgPSBlbGYxNl90b19jcHUoZWhkci5lX3R5cGUpOworCWVoZHIuZV9tYWNoaW5lICAgPSBlbGYxNl90b19jcHUoZWhkci5lX21hY2hpbmUpOworCWVoZHIuZV92ZXJzaW9uICAgPSBlbGYzMl90b19jcHUoZWhkci5lX3ZlcnNpb24pOworCWVoZHIuZV9lbnRyeSAgICAgPSBlbGYzMl90b19jcHUoZWhkci5lX2VudHJ5KTsKKwllaGRyLmVfcGhvZmYgICAgID0gZWxmMzJfdG9fY3B1KGVoZHIuZV9waG9mZik7CisJZWhkci5lX3Nob2ZmICAgICA9IGVsZjMyX3RvX2NwdShlaGRyLmVfc2hvZmYpOworCWVoZHIuZV9mbGFncyAgICAgPSBlbGYzMl90b19jcHUoZWhkci5lX2ZsYWdzKTsKKwllaGRyLmVfZWhzaXplICAgID0gZWxmMTZfdG9fY3B1KGVoZHIuZV9laHNpemUpOworCWVoZHIuZV9waGVudHNpemUgPSBlbGYxNl90b19jcHUoZWhkci5lX3BoZW50c2l6ZSk7CisJZWhkci5lX3BobnVtICAgICA9IGVsZjE2X3RvX2NwdShlaGRyLmVfcGhudW0pOworCWVoZHIuZV9zaGVudHNpemUgPSBlbGYxNl90b19jcHUoZWhkci5lX3NoZW50c2l6ZSk7CisJZWhkci5lX3NobnVtICAgICA9IGVsZjE2X3RvX2NwdShlaGRyLmVfc2hudW0pOworCWVoZHIuZV9zaHN0cm5keCAgPSBlbGYxNl90b19jcHUoZWhkci5lX3Noc3RybmR4KTsKKworCWlmICgoZWhkci5lX3R5cGUgIT0gRVRfRVhFQykgJiYgKGVoZHIuZV90eXBlICE9IEVUX0RZTikpIHsKKwkJZGllKCJVbnN1cHBvcnRlZCBFTEYgaGVhZGVyIHR5cGVcbiIpOworCX0KKwlpZiAoZWhkci5lX21hY2hpbmUgIT0gRU1fMzg2KSB7CisJCWRpZSgiTm90IGZvciB4ODZcbiIpOworCX0KKwlpZiAoZWhkci5lX3ZlcnNpb24gIT0gRVZfQ1VSUkVOVCkgeworCQlkaWUoIlVua25vd24gRUxGIHZlcnNpb25cbiIpOworCX0KKwlpZiAoZWhkci5lX2Voc2l6ZSAhPSBzaXplb2YoRWxmMzJfRWhkcikpIHsKKwkJZGllKCJCYWQgRWxmIGhlYWRlciBzaXplXG4iKTsKKwl9CisJaWYgKGVoZHIuZV9waGVudHNpemUgIT0gc2l6ZW9mKEVsZjMyX1BoZHIpKSB7CisJCWRpZSgiQmFkIHByb2dyYW0gaGVhZGVyIGVudHJ5XG4iKTsKKwl9CisJaWYgKGVoZHIuZV9zaGVudHNpemUgIT0gc2l6ZW9mKEVsZjMyX1NoZHIpKSB7CisJCWRpZSgiQmFkIHNlY3Rpb24gaGVhZGVyIGVudHJ5XG4iKTsKKwl9CisJaWYgKGVoZHIuZV9zaHN0cm5keCA+PSBlaGRyLmVfc2hudW0pIHsKKwkJZGllKCJTdHJpbmcgdGFibGUgaW5kZXggb3V0IG9mIGJvdW5kc1xuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWFkX3NoZHJzKEZJTEUgKmZwKQoreworCWludCBpOworCWlmIChlaGRyLmVfc2hudW0gPiBNQVhfU0hEUlMpIHsKKwkJZGllKCIlZCBzZWN0aW9uIGhlYWRlcnMgc3VwcG9ydGVkOiAlZFxuIiwKKwkJCWVoZHIuZV9zaG51bSwgTUFYX1NIRFJTKTsKKwl9CisJaWYgKGZzZWVrKGZwLCBlaGRyLmVfc2hvZmYsIFNFRUtfU0VUKSA8IDApIHsKKwkJZGllKCJTZWVrIHRvICVkIGZhaWxlZDogJXNcbiIsCisJCQllaGRyLmVfc2hvZmYsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWlmIChmcmVhZCgmc2hkciwgc2l6ZW9mKHNoZHJbMF0pLCBlaGRyLmVfc2hudW0sIGZwKSAhPSBlaGRyLmVfc2hudW0pIHsKKwkJZGllKCJDYW5ub3QgcmVhZCBFTEYgc2VjdGlvbiBoZWFkZXJzOiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJfQorCWZvcihpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7CisJCXNoZHJbaV0uc2hfbmFtZSAgICAgID0gZWxmMzJfdG9fY3B1KHNoZHJbaV0uc2hfbmFtZSk7CisJCXNoZHJbaV0uc2hfdHlwZSAgICAgID0gZWxmMzJfdG9fY3B1KHNoZHJbaV0uc2hfdHlwZSk7CisJCXNoZHJbaV0uc2hfZmxhZ3MgICAgID0gZWxmMzJfdG9fY3B1KHNoZHJbaV0uc2hfZmxhZ3MpOworCQlzaGRyW2ldLnNoX2FkZHIgICAgICA9IGVsZjMyX3RvX2NwdShzaGRyW2ldLnNoX2FkZHIpOworCQlzaGRyW2ldLnNoX29mZnNldCAgICA9IGVsZjMyX3RvX2NwdShzaGRyW2ldLnNoX29mZnNldCk7CisJCXNoZHJbaV0uc2hfc2l6ZSAgICAgID0gZWxmMzJfdG9fY3B1KHNoZHJbaV0uc2hfc2l6ZSk7CisJCXNoZHJbaV0uc2hfbGluayAgICAgID0gZWxmMzJfdG9fY3B1KHNoZHJbaV0uc2hfbGluayk7CisJCXNoZHJbaV0uc2hfaW5mbyAgICAgID0gZWxmMzJfdG9fY3B1KHNoZHJbaV0uc2hfaW5mbyk7CisJCXNoZHJbaV0uc2hfYWRkcmFsaWduID0gZWxmMzJfdG9fY3B1KHNoZHJbaV0uc2hfYWRkcmFsaWduKTsKKwkJc2hkcltpXS5zaF9lbnRzaXplICAgPSBlbGYzMl90b19jcHUoc2hkcltpXS5zaF9lbnRzaXplKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgcmVhZF9zdHJ0YWJzKEZJTEUgKmZwKQoreworCWludCBpOworCWZvcihpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7CisJCWlmIChzaGRyW2ldLnNoX3R5cGUgIT0gU0hUX1NUUlRBQikgeworCQkJY29udGludWU7CisJCX0KKwkJc3RydGFiW2ldID0gbWFsbG9jKHNoZHJbaV0uc2hfc2l6ZSk7CisJCWlmICghc3RydGFiW2ldKSB7CisJCQlkaWUoIm1hbGxvYyBvZiAlZCBieXRlcyBmb3Igc3RydGFiIGZhaWxlZFxuIiwKKwkJCQlzaGRyW2ldLnNoX3NpemUpOworCQl9CisJCWlmIChmc2VlayhmcCwgc2hkcltpXS5zaF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApIHsKKwkJCWRpZSgiU2VlayB0byAlZCBmYWlsZWQ6ICVzXG4iLAorCQkJCXNoZHJbaV0uc2hfb2Zmc2V0LCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWlmIChmcmVhZChzdHJ0YWJbaV0sIDEsIHNoZHJbaV0uc2hfc2l6ZSwgZnApICE9IHNoZHJbaV0uc2hfc2l6ZSkgeworCQkJZGllKCJDYW5ub3QgcmVhZCBzeW1ib2wgdGFibGU6ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfc3ltdGFicyhGSUxFICpmcCkKK3sKKwlpbnQgaSxqOworCWZvcihpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7CisJCWlmIChzaGRyW2ldLnNoX3R5cGUgIT0gU0hUX1NZTVRBQikgeworCQkJY29udGludWU7CisJCX0KKwkJc3ltdGFiW2ldID0gbWFsbG9jKHNoZHJbaV0uc2hfc2l6ZSk7CisJCWlmICghc3ltdGFiW2ldKSB7CisJCQlkaWUoIm1hbGxvYyBvZiAlZCBieXRlcyBmb3Igc3ltdGFiIGZhaWxlZFxuIiwKKwkJCQlzaGRyW2ldLnNoX3NpemUpOworCQl9CisJCWlmIChmc2VlayhmcCwgc2hkcltpXS5zaF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApIHsKKwkJCWRpZSgiU2VlayB0byAlZCBmYWlsZWQ6ICVzXG4iLAorCQkJCXNoZHJbaV0uc2hfb2Zmc2V0LCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWlmIChmcmVhZChzeW10YWJbaV0sIDEsIHNoZHJbaV0uc2hfc2l6ZSwgZnApICE9IHNoZHJbaV0uc2hfc2l6ZSkgeworCQkJZGllKCJDYW5ub3QgcmVhZCBzeW1ib2wgdGFibGU6ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJZm9yKGogPSAwOyBqIDwgc2hkcltpXS5zaF9zaXplL3NpemVvZihzeW10YWJbaV1bMF0pOyBqKyspIHsKKwkJCXN5bXRhYltpXVtqXS5zdF9uYW1lICA9IGVsZjMyX3RvX2NwdShzeW10YWJbaV1bal0uc3RfbmFtZSk7CisJCQlzeW10YWJbaV1bal0uc3RfdmFsdWUgPSBlbGYzMl90b19jcHUoc3ltdGFiW2ldW2pdLnN0X3ZhbHVlKTsKKwkJCXN5bXRhYltpXVtqXS5zdF9zaXplICA9IGVsZjMyX3RvX2NwdShzeW10YWJbaV1bal0uc3Rfc2l6ZSk7CisJCQlzeW10YWJbaV1bal0uc3Rfc2huZHggPSBlbGYxNl90b19jcHUoc3ltdGFiW2ldW2pdLnN0X3NobmR4KTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCByZWFkX3JlbG9jcyhGSUxFICpmcCkKK3sKKwlpbnQgaSxqOworCWZvcihpID0gMDsgaSA8IGVoZHIuZV9zaG51bTsgaSsrKSB7CisJCWlmIChzaGRyW2ldLnNoX3R5cGUgIT0gU0hUX1JFTCkgeworCQkJY29udGludWU7CisJCX0KKwkJcmVsdGFiW2ldID0gbWFsbG9jKHNoZHJbaV0uc2hfc2l6ZSk7CisJCWlmICghcmVsdGFiW2ldKSB7CisJCQlkaWUoIm1hbGxvYyBvZiAlZCBieXRlcyBmb3IgcmVsb2NzIGZhaWxlZFxuIiwKKwkJCQlzaGRyW2ldLnNoX3NpemUpOworCQl9CisJCWlmIChmc2VlayhmcCwgc2hkcltpXS5zaF9vZmZzZXQsIFNFRUtfU0VUKSA8IDApIHsKKwkJCWRpZSgiU2VlayB0byAlZCBmYWlsZWQ6ICVzXG4iLAorCQkJCXNoZHJbaV0uc2hfb2Zmc2V0LCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWlmIChmcmVhZChyZWx0YWJbaV0sIDEsIHNoZHJbaV0uc2hfc2l6ZSwgZnApICE9IHNoZHJbaV0uc2hfc2l6ZSkgeworCQkJZGllKCJDYW5ub3QgcmVhZCBzeW1ib2wgdGFibGU6ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJZm9yKGogPSAwOyBqIDwgc2hkcltpXS5zaF9zaXplL3NpemVvZihyZWx0YWJbMF1bMF0pOyBqKyspIHsKKwkJCXJlbHRhYltpXVtqXS5yX29mZnNldCA9IGVsZjMyX3RvX2NwdShyZWx0YWJbaV1bal0ucl9vZmZzZXQpOworCQkJcmVsdGFiW2ldW2pdLnJfaW5mbyAgID0gZWxmMzJfdG9fY3B1KHJlbHRhYltpXVtqXS5yX2luZm8pOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHByaW50X2Fic29sdXRlX3N5bWJvbHModm9pZCkKK3sKKwlpbnQgaTsKKwlwcmludGYoIkFic29sdXRlIHN5bWJvbHNcbiIpOworCXByaW50ZigiIE51bTogICAgVmFsdWUgU2l6ZSAgVHlwZSAgICAgICBCaW5kICAgICAgICBWaXNpYmlsaXR5ICBOYW1lXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBlaGRyLmVfc2hudW07IGkrKykgeworCQljaGFyICpzeW1fc3RydGFiOworCQlFbGYzMl9TeW0gKnNoX3N5bXRhYjsKKwkJaW50IGo7CisJCWlmIChzaGRyW2ldLnNoX3R5cGUgIT0gU0hUX1NZTVRBQikgeworCQkJY29udGludWU7CisJCX0KKwkJc2hfc3ltdGFiID0gc3ltdGFiW2ldOworCQlzeW1fc3RydGFiID0gc3RydGFiW3NoZHJbaV0uc2hfbGlua107CisJCWZvcihqID0gMDsgaiA8IHNoZHJbaV0uc2hfc2l6ZS9zaXplb2Yoc3ltdGFiWzBdWzBdKTsgaisrKSB7CisJCQlFbGYzMl9TeW0gKnN5bTsKKwkJCWNvbnN0IGNoYXIgKm5hbWU7CisJCQlzeW0gPSAmc3ltdGFiW2ldW2pdOworCQkJbmFtZSA9IHN5bV9uYW1lKHN5bV9zdHJ0YWIsIHN5bSk7CisJCQlpZiAoc3ltLT5zdF9zaG5keCAhPSBTSE5fQUJTKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwcmludGYoIiU1ZCAlMDh4ICU1ZCAlMTBzICUxMHMgJTEycyAlc1xuIiwKKwkJCQlqLCBzeW0tPnN0X3ZhbHVlLCBzeW0tPnN0X3NpemUsCisJCQkJc3ltX3R5cGUoRUxGMzJfU1RfVFlQRShzeW0tPnN0X2luZm8pKSwKKwkJCQlzeW1fYmluZChFTEYzMl9TVF9CSU5EKHN5bS0+c3RfaW5mbykpLAorCQkJCXN5bV92aXNpYmlsaXR5KEVMRjMyX1NUX1ZJU0lCSUxJVFkoc3ltLT5zdF9vdGhlcikpLAorCQkJCW5hbWUpOworCQl9CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfYWJzb2x1dGVfcmVsb2NzKHZvaWQpCit7CisJaW50IGksIHByaW50ZWQgPSAwOworCisJZm9yKGkgPSAwOyBpIDwgZWhkci5lX3NobnVtOyBpKyspIHsKKwkJY2hhciAqc3ltX3N0cnRhYjsKKwkJRWxmMzJfU3ltICpzaF9zeW10YWI7CisJCXVuc2lnbmVkIHNlY19hcHBsaWVzLCBzZWNfc3ltdGFiOworCQlpbnQgajsKKwkJaWYgKHNoZHJbaV0uc2hfdHlwZSAhPSBTSFRfUkVMKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlzZWNfc3ltdGFiICA9IHNoZHJbaV0uc2hfbGluazsKKwkJc2VjX2FwcGxpZXMgPSBzaGRyW2ldLnNoX2luZm87CisJCWlmICghKHNoZHJbc2VjX2FwcGxpZXNdLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkgeworCQkJY29udGludWU7CisJCX0KKwkJc2hfc3ltdGFiID0gc3ltdGFiW3NlY19zeW10YWJdOworCQlzeW1fc3RydGFiID0gc3RydGFiW3NoZHJbc2VjX3N5bXRhYl0uc2hfbGlua107CisJCWZvcihqID0gMDsgaiA8IHNoZHJbaV0uc2hfc2l6ZS9zaXplb2YocmVsdGFiWzBdWzBdKTsgaisrKSB7CisJCQlFbGYzMl9SZWwgKnJlbDsKKwkJCUVsZjMyX1N5bSAqc3ltOworCQkJY29uc3QgY2hhciAqbmFtZTsKKwkJCXJlbCA9ICZyZWx0YWJbaV1bal07CisJCQlzeW0gPSAmc2hfc3ltdGFiW0VMRjMyX1JfU1lNKHJlbC0+cl9pbmZvKV07CisJCQluYW1lID0gc3ltX25hbWUoc3ltX3N0cnRhYiwgc3ltKTsKKwkJCWlmIChzeW0tPnN0X3NobmR4ICE9IFNITl9BQlMpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogQWJzb2x1dGUgc3ltYm9scyBhcmUgbm90IHJlbG9jYXRlZCBpZiBiekltYWdlIGlzCisJCQkgKiBsb2FkZWQgYXQgYSBub24tY29tcGlsZWQgYWRkcmVzcy4gRGlzcGxheSBhIHdhcm5pbmcKKwkJCSAqIHRvIHVzZXIgYXQgY29tcGlsZSB0aW1lIGFib3V0IHRoZSBhYnNvbHV0ZQorCQkJICogcmVsb2NhdGlvbnMgcHJlc2VudC4KKwkJCSAqCisJCQkgKiBVc2VyIG5lZWQgdG8gYXVkaXQgdGhlIGNvZGUgdG8gbWFrZSBzdXJlCisJCQkgKiBzb21lIHN5bWJvbHMgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiBzZWN0aW9uCisJCQkgKiByZWxhdGl2ZSBoYXZlIG5vdCBiZWNvbWUgYWJzb2x1dGUgYmVjYXVzZSBvZiBzb21lCisJCQkgKiBsaW5rZXIgb3B0aW1pemF0aW9uIG9yIHdyb25nIHByb2dyYW1taW5nIHVzYWdlLgorCQkJICoKKwkJCSAqIEJlZm9yZSB3YXJuaW5nIGNoZWNrIGlmIHRoaXMgYWJzb2x1dGUgc3ltYm9sCisJCQkgKiByZWxvY2F0aW9uIGlzIGhhcm1sZXNzLgorCQkJICovCisJCQlpZiAoaXNfc2FmZV9hYnNfcmVsb2MobmFtZSkpCisJCQkJY29udGludWU7CisKKwkJCWlmICghcHJpbnRlZCkgeworCQkJCXByaW50ZigiV0FSTklORzogQWJzb2x1dGUgcmVsb2NhdGlvbnMiCisJCQkJCSIgcHJlc2VudFxuIik7CisJCQkJcHJpbnRmKCJPZmZzZXQgICAgIEluZm8gICAgIFR5cGUgICAgIFN5bS5WYWx1ZSAiCisJCQkJCSJTeW0uTmFtZVxuIik7CisJCQkJcHJpbnRlZCA9IDE7CisJCQl9CisKKwkJCXByaW50ZigiJTA4eCAlMDh4ICUxMHMgJTA4eCAgJXNcbiIsCisJCQkJcmVsLT5yX29mZnNldCwKKwkJCQlyZWwtPnJfaW5mbywKKwkJCQlyZWxfdHlwZShFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pKSwKKwkJCQlzeW0tPnN0X3ZhbHVlLAorCQkJCW5hbWUpOworCQl9CisJfQorCisJaWYgKHByaW50ZWQpCisJCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2Fsa19yZWxvY3Modm9pZCAoKnZpc2l0KShFbGYzMl9SZWwgKnJlbCwgRWxmMzJfU3ltICpzeW0pKQoreworCWludCBpOworCS8qIFdhbGsgdGhyb3VnaCB0aGUgcmVsb2NhdGlvbnMgKi8KKwlmb3IoaSA9IDA7IGkgPCBlaGRyLmVfc2hudW07IGkrKykgeworCQljaGFyICpzeW1fc3RydGFiOworCQlFbGYzMl9TeW0gKnNoX3N5bXRhYjsKKwkJdW5zaWduZWQgc2VjX2FwcGxpZXMsIHNlY19zeW10YWI7CisJCWludCBqOworCQlpZiAoc2hkcltpXS5zaF90eXBlICE9IFNIVF9SRUwpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNlY19zeW10YWIgID0gc2hkcltpXS5zaF9saW5rOworCQlzZWNfYXBwbGllcyA9IHNoZHJbaV0uc2hfaW5mbzsKKwkJaWYgKCEoc2hkcltzZWNfYXBwbGllc10uc2hfZmxhZ3MgJiBTSEZfQUxMT0MpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlzaF9zeW10YWIgPSBzeW10YWJbc2VjX3N5bXRhYl07CisJCXN5bV9zdHJ0YWIgPSBzdHJ0YWJbc2hkcltzZWNfc3ltdGFiXS5zaF9saW5rXTsKKwkJZm9yKGogPSAwOyBqIDwgc2hkcltpXS5zaF9zaXplL3NpemVvZihyZWx0YWJbMF1bMF0pOyBqKyspIHsKKwkJCUVsZjMyX1JlbCAqcmVsOworCQkJRWxmMzJfU3ltICpzeW07CisJCQl1bnNpZ25lZCByX3R5cGU7CisJCQlyZWwgPSAmcmVsdGFiW2ldW2pdOworCQkJc3ltID0gJnNoX3N5bXRhYltFTEYzMl9SX1NZTShyZWwtPnJfaW5mbyldOworCQkJcl90eXBlID0gRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKTsKKwkJCS8qIERvbid0IHZpc2l0IHJlbG9jYXRpb25zIHRvIGFic29sdXRlIHN5bWJvbHMgKi8KKwkJCWlmIChzeW0tPnN0X3NobmR4ID09IFNITl9BQlMpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChyX3R5cGUgPT0gUl8zODZfUEMzMikgeworCQkJCS8qIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQgKi8KKwkJCX0KKwkJCWVsc2UgaWYgKHJfdHlwZSA9PSBSXzM4Nl8zMikgeworCQkJCS8qIFZpc2l0IHJlbG9jYXRpb25zIHRoYXQgbmVlZCB0byBiZSBhZGp1c3RlZCAqLworCQkJCXZpc2l0KHJlbCwgc3ltKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWRpZSgiVW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlOiAlZFxuIiwgcl90eXBlKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY291bnRfcmVsb2MoRWxmMzJfUmVsICpyZWwsIEVsZjMyX1N5bSAqc3ltKQoreworCXJlbG9jX2NvdW50ICs9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxlY3RfcmVsb2MoRWxmMzJfUmVsICpyZWwsIEVsZjMyX1N5bSAqc3ltKQoreworCS8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzIHRoYXQgbmVlZHMgdG8gYmUgYWRqdXN0ZWQuICovCisJcmVsb2NzW3JlbG9jX2lkeCsrXSA9IHJlbC0+cl9vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgY21wX3JlbG9jcyhjb25zdCB2b2lkICp2YSwgY29uc3Qgdm9pZCAqdmIpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqYSwgKmI7CisJYSA9IHZhOyBiID0gdmI7CisJcmV0dXJuICgqYSA9PSAqYik/IDAgOiAoKmEgPiAqYik/IDEgOiAtMTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9yZWxvY3MoaW50IGFzX3RleHQpCit7CisJaW50IGk7CisJLyogQ291bnQgaG93IG1hbnkgcmVsb2NhdGlvbnMgSSBoYXZlIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlbS4gKi8KKwlyZWxvY19jb3VudCA9IDA7CisJd2Fsa19yZWxvY3MoY291bnRfcmVsb2MpOworCXJlbG9jcyA9IG1hbGxvYyhyZWxvY19jb3VudCAqIHNpemVvZihyZWxvY3NbMF0pKTsKKwlpZiAoIXJlbG9jcykgeworCQlkaWUoIm1hbGxvYyBvZiAlZCBlbnRyaWVzIGZvciByZWxvY3MgZmFpbGVkXG4iLAorCQkJcmVsb2NfY291bnQpOworCX0KKwkvKiBDb2xsZWN0IHVwIHRoZSByZWxvY2F0aW9ucyAqLworCXJlbG9jX2lkeCA9IDA7CisJd2Fsa19yZWxvY3MoY29sbGVjdF9yZWxvYyk7CisKKwkvKiBPcmRlciB0aGUgcmVsb2NhdGlvbnMgZm9yIG1vcmUgZWZmaWNpZW50IHByb2Nlc3NpbmcgKi8KKwlxc29ydChyZWxvY3MsIHJlbG9jX2NvdW50LCBzaXplb2YocmVsb2NzWzBdKSwgY21wX3JlbG9jcyk7CisKKwkvKiBQcmludCB0aGUgcmVsb2NhdGlvbnMgKi8KKwlpZiAoYXNfdGV4dCkgeworCQkvKiBQcmludCB0aGUgcmVsb2NhdGlvbnMgaW4gYSBmb3JtIHN1aXRhYmxlIHRoYXQKKwkJICogZ2FzIHdpbGwgbGlrZS4KKwkJICovCisJCXByaW50ZigiLnNlY3Rpb24gXCIuZGF0YS5yZWxvY1wiLFwiYVwiXG4iKTsKKwkJcHJpbnRmKCIuYmFsaWduIDRcbiIpOworCQlmb3IoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKSB7CisJCQlwcmludGYoIlx0IC5sb25nIDB4JTA4bHhcbiIsIHJlbG9jc1tpXSk7CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCX0KKwllbHNlIHsKKwkJdW5zaWduZWQgY2hhciBidWZbNF07CisJCWJ1ZlswXSA9IGJ1ZlsxXSA9IGJ1ZlsyXSA9IGJ1ZlszXSA9IDA7CisJCS8qIFByaW50IGEgc3RvcCAqLworCQlwcmludGYoIiVjJWMlYyVjIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsKKwkJLyogTm93IHByaW50IGVhY2ggcmVsb2NhdGlvbiAqLworCQlmb3IoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKSB7CisJCQlidWZbMF0gPSAocmVsb2NzW2ldID4+ICAwKSAmIDB4ZmY7CisJCQlidWZbMV0gPSAocmVsb2NzW2ldID4+ICA4KSAmIDB4ZmY7CisJCQlidWZbMl0gPSAocmVsb2NzW2ldID4+IDE2KSAmIDB4ZmY7CisJCQlidWZbM10gPSAocmVsb2NzW2ldID4+IDI0KSAmIDB4ZmY7CisJCQlwcmludGYoIiVjJWMlYyVjIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlkaWUoInJlbG9jcyBbLS1hYnMtc3ltcyB8LS1hYnMtcmVsb2NzIHwgLS10ZXh0XSB2bWxpbnV4XG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBzaG93X2Fic29sdXRlX3N5bXMsIHNob3dfYWJzb2x1dGVfcmVsb2NzOworCWludCBhc190ZXh0OworCWNvbnN0IGNoYXIgKmZuYW1lOworCUZJTEUgKmZwOworCWludCBpOworCisJc2hvd19hYnNvbHV0ZV9zeW1zID0gMDsKKwlzaG93X2Fic29sdXRlX3JlbG9jcyA9IDA7CisJYXNfdGV4dCA9IDA7CisJZm5hbWUgPSBOVUxMOworCWZvcihpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmIChzdHJjbXAoYXJndlsxXSwgIi0tYWJzLXN5bXMiKSA9PSAwKSB7CisJCQkJc2hvd19hYnNvbHV0ZV9zeW1zID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHN0cmNtcChhcmd2WzFdLCAiLS1hYnMtcmVsb2NzIikgPT0gMCkgeworCQkJCXNob3dfYWJzb2x1dGVfcmVsb2NzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiLS10ZXh0IikgPT0gMCkgeworCQkJCWFzX3RleHQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFmbmFtZSkgeworCQkJZm5hbWUgPSBhcmc7CisJCQljb250aW51ZTsKKwkJfQorCQl1c2FnZSgpOworCX0KKwlpZiAoIWZuYW1lKSB7CisJCXVzYWdlKCk7CisJfQorCWZwID0gZm9wZW4oZm5hbWUsICJyIik7CisJaWYgKCFmcCkgeworCQlkaWUoIkNhbm5vdCBvcGVuICVzOiAlc1xuIiwKKwkJCWZuYW1lLCBzdHJlcnJvcihlcnJubykpOworCX0KKwlyZWFkX2VoZHIoZnApOworCXJlYWRfc2hkcnMoZnApOworCXJlYWRfc3RydGFicyhmcCk7CisJcmVhZF9zeW10YWJzKGZwKTsKKwlyZWFkX3JlbG9jcyhmcCk7CisJaWYgKHNob3dfYWJzb2x1dGVfc3ltcykgeworCQlwcmludF9hYnNvbHV0ZV9zeW1ib2xzKCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoc2hvd19hYnNvbHV0ZV9yZWxvY3MpIHsKKwkJcHJpbnRfYWJzb2x1dGVfcmVsb2NzKCk7CisJCXJldHVybiAwOworCX0KKwllbWl0X3JlbG9jcyhhc190ZXh0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDg1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzCkBAIC0wLDAgKzEsNDMgQEAKK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShzdGFydHVwXzMyKQorU0VDVElPTlMKK3sKKyAgICAgICAgLyogQmUgY2FyZWZ1bCBwYXJ0cyBvZiBoZWFkLlMgYXNzdW1lIHN0YXJ0dXBfMzIgaXMgYXQKKyAgICAgICAgICogYWRkcmVzcyAwLgorCSAqLworCS4gPSAgMCAJOworCS50ZXh0LmhlYWQgOiB7CisJCV9oZWFkID0gLiA7CisJCSooLnRleHQuaGVhZCkKKwkJX2VoZWFkID0gLiA7CisJfQorCS5kYXRhLmNvbXByZXNzZWQgOiB7CisJCSooLmRhdGEuY29tcHJlc3NlZCkKKwl9CisJLnRleHQgOgl7CisJCV90ZXh0ID0gLjsgCS8qIFRleHQgKi8KKwkJKigudGV4dCkKKwkJKigudGV4dC4qKQorCQlfZXRleHQgPSAuIDsKKwl9CisJLnJvZGF0YSA6IHsKKwkJX3JvZGF0YSA9IC4gOworCQkqKC5yb2RhdGEpCSAvKiByZWFkLW9ubHkgZGF0YSAqLworCQkqKC5yb2RhdGEuKikKKwkJX2Vyb2RhdGEgPSAuIDsKKwl9CisJLmRhdGEgOgl7CisJCV9kYXRhID0gLiA7CisJCSooLmRhdGEpCisJCSooLmRhdGEuKikKKwkJX2VkYXRhID0gLiA7CisJfQorCS5ic3MgOiB7CisJCV9ic3MgPSAuIDsKKwkJKiguYnNzKQorCQkqKC5ic3MuKikKKwkJKihDT01NT04pCisJCV9lbmQgPSAuIDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyIGIvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LnNjcgppbmRleCAxZWQ5ZDc5Li43MDdhODhmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyCisrKyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IKQEAgLTEsOSArMSwxMCBAQAogU0VDVElPTlMKIHsKLSAgLmRhdGEgOiB7IAorICAuZGF0YS5jb21wcmVzc2VkIDogewogCWlucHV0X2xlbiA9IC47CiAJTE9ORyhpbnB1dF9kYXRhX2VuZCAtIGlucHV0X2RhdGEpIGlucHV0X2RhdGEgPSAuOyAKIAkqKC5kYXRhKSAKKwlvdXRwdXRfbGVuID0gLiAtIDQ7CiAJaW5wdXRfZGF0YV9lbmQgPSAuOyAKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9zZXR1cC5TIGIvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUwppbmRleCAzYWVjNDUzOC4uMDZlZGYxYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUworKysgYi9hcmNoL2kzODYvYm9vdC9zZXR1cC5TCkBAIC04MSw3ICs4MSw3IEBACiAjIFRoaXMgaXMgdGhlIHNldHVwIGhlYWRlciwgYW5kIGl0IG11c3Qgc3RhcnQgYXQgJWNzOjIgKG9sZCAweDkwMjA6MikKIAogCQkuYXNjaWkJIkhkclMiCQkjIGhlYWRlciBzaWduYXR1cmUKLQkJLndvcmQJMHgwMjA0CQkjIGhlYWRlciB2ZXJzaW9uIG51bWJlciAoPj0gMHgwMTA1KQorCQkud29yZAkweDAyMDUJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCiAJCQkJCSMgb3IgZWxzZSBvbGQgbG9hZGxpbi0xLjUgd2lsbCBmYWlsKQogcmVhbG1vZGVfc3d0Y2g6CS53b3JkCTAsIDAJCSMgZGVmYXVsdF9zd2l0Y2gsIFNFVFVQU0VHCiBzdGFydF9zeXNfc2VnOgkud29yZAlTWVNTRUcKQEAgLTE2MCw2ICsxNjAsMTcgQEAKIAkJCQkJIyBUaGUgaGlnaGVzdCBzYWZlIGFkZHJlc3MgZm9yCiAJCQkJCSMgdGhlIGNvbnRlbnRzIG9mIGFuIGluaXRyZAogCitrZXJuZWxfYWxpZ25tZW50OiAgLmxvbmcgQ09ORklHX1BIWVNJQ0FMX0FMSUdOIAkjcGh5c2ljYWwgYWRkciBhbGlnbm1lbnQKKwkJCQkJCSNyZXF1aXJlZCBmb3IgcHJvdGVjdGVkIG1vZGUKKwkJCQkJCSNrZXJuZWwKKyNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKK3JlbG9jYXRhYmxlX2tlcm5lbDogICAgLmJ5dGUgMQorI2Vsc2UKK3JlbG9jYXRhYmxlX2tlcm5lbDogICAgLmJ5dGUgMAorI2VuZGlmCitwYWQyOgkJCS5ieXRlIDAKK3BhZDM6CQkJLndvcmQgMAorCiB0cmFtcG9saW5lOgljYWxsCXN0YXJ0X29mX3NldHVwCiAJCS5hbGlnbiAxNgogCQkJCQkjIFRoZSBvZmZzZXQgYXQgdGhpcyBwb2ludCBpcyAweDI0MApAQCAtNTg4LDExICs1OTksNiBAQAogCWNhbGwJZGVmYXVsdF9zd2l0Y2gKIAogcm1vZGVzd3RjaF9lbmQ6Ci0jIHdlIGdldCB0aGUgY29kZTMyIHN0YXJ0IGFkZHJlc3MgYW5kIG1vZGlmeSB0aGUgYmVsb3cgJ2ptcGknCi0jIChsb2FkZXIgbWF5IGhhdmUgY2hhbmdlZCBpdCkKLQltb3ZsCSVjczpjb2RlMzJfc3RhcnQsICVlYXgKLQltb3ZsCSVlYXgsICVjczpjb2RlMzIKLQogIyBOb3cgd2UgbW92ZSB0aGUgc3lzdGVtIHRvIGl0cyByaWdodGZ1bCBwbGFjZSAuLi4gYnV0IHdlIGNoZWNrIGlmIHdlIGhhdmUgYQogIyBiaWcta2VybmVsLiBJbiB0aGF0IGNhc2Ugd2UgKm11c3QqIG5vdCBtb3ZlIGl0IC4uLgogCXRlc3RiCSRMT0FERURfSElHSCwgJWNzOmxvYWRmbGFncwpAQCAtNzg4LDExICs3OTQsMTIgQEAKIGEyMF9kb25lOgogCiAjZW5kaWYgLyogQ09ORklHX1g4Nl9WT1lBR0VSICovCi0jIHNldCB1cCBnZHQgYW5kIGlkdAorIyBzZXQgdXAgZ2R0IGFuZCBpZHQgYW5kIDMyYml0IHN0YXJ0IGFkZHJlc3MKIAlsaWR0CWlkdF80OAkJCQkjIGxvYWQgaWR0IHdpdGggMCwwCiAJeG9ybAklZWF4LCAlZWF4CQkJIyBDb21wdXRlIGdkdF9iYXNlCiAJbW92dwklZHMsICVheAkJCSMgKENvbnZlcnQgJWRzOmdkdCB0byBhIGxpbmVhciBwdHIpCiAJc2hsbAkkNCwgJWVheAorCWFkZGwJJWVheCwgY29kZTMyCiAJYWRkbAkkZ2R0LCAlZWF4CiAJbW92bAklZWF4LCAoZ2R0XzQ4KzIpCiAJbGdkdAlnZHRfNDgJCQkJIyBsb2FkIGdkdCB3aXRoIHdoYXRldmVyIGlzCkBAIC04NTEsOSArODU4LDI2IEBACiAjCU1hbnVhbCwgTWl4aW5nIDE2LWJpdCBhbmQgMzItYml0IGNvZGUsIHBhZ2UgMTYtNikKIAogCS5ieXRlIDB4NjYsIDB4ZWEJCQkjIHByZWZpeCArIGptcGktb3Bjb2RlCi1jb2RlMzI6CS5sb25nCTB4MTAwMAkJCQkjIHdpbGwgYmUgc2V0IHRvIDB4MTAwMDAwCi0JCQkJCQkjIGZvciBiaWcga2VybmVscworY29kZTMyOgkubG9uZwlzdGFydHVwXzMyCQkJIyB3aWxsIGJlIHNldCB0byAlY3Mrc3RhcnR1cF8zMgogCS53b3JkCV9fQk9PVF9DUworLmNvZGUzMgorc3RhcnR1cF8zMjoKKwltb3ZsICQoX19CT09UX0RTKSwgJWVheAorCW1vdmwgJWVheCwgJWRzCisJbW92bCAlZWF4LCAlZXMKKwltb3ZsICVlYXgsICVmcworCW1vdmwgJWVheCwgJWdzCisJbW92bCAlZWF4LCAlc3MKKworCXhvcmwgJWVheCwgJWVheAorMToJaW5jbCAlZWF4CQkJCSMgY2hlY2sgdGhhdCBBMjAgcmVhbGx5IElTIGVuYWJsZWQKKwltb3ZsICVlYXgsIDB4MDAwMDAwMDAJCQkjIGxvb3AgZm9yZXZlciBpZiBpdCBpc24ndAorCWNtcGwgJWVheCwgMHgwMDEwMDAwMAorCWplIDFiCisKKwkjIEp1bXAgdG8gdGhlIDMyYml0IGVudHJ5IHBvaW50CisJam1wbCAqKGNvZGUzMl9zdGFydCAtIHN0YXJ0ICsgKERFTFRBX0lOSVRTRUcgPDwgNCkpKCVlc2kpCisuY29kZTE2CiAKICMgSGVyZSdzIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBjdXJyZW50IGtlcm5lbC4uCiBrZXJuZWxfdmVyc2lvbjoJLmFzY2lpCVVUU19SRUxFQVNFCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvZGVmY29uZmlnIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwppbmRleCA2MGMwYzAyLi4zMjY1MjA4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvZGVmY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMxCi0jIFRodSBPY3QgIDUgMTM6MDQ6NTMgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LWdpdDE0CisjIFNhdCBEZWMgIDkgMjE6MjM6MTQgMjAwNgogIwogQ09ORklHX1g4Nl8zMj15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKQEAgLTEyLDYgKzEyLDcgQEAKIENPTkZJR19NTVU9eQogQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CiBDT05GSUdfR0VORVJJQ19JT01BUD15CitDT05GSUdfR0VORVJJQ19CVUc9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQogQ09ORklHX0RNST15CkBAIC00MCwxMyArNDEsMTQgQEAKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiAjIENPTkZJR19DUFVTRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQotIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldApAQCAtMTEwLDYgKzExMiw3IEBACiAjIENPTkZJR19YODZfVklTV1MgaXMgbm90IHNldAogQ09ORklHX1g4Nl9HRU5FUklDQVJDSD15CiAjIENPTkZJR19YODZfRVM3MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUkFWSVJUIGlzIG5vdCBzZXQKIENPTkZJR19YODZfQ1lDTE9ORV9USU1FUj15CiAjIENPTkZJR19NMzg2IGlzIG5vdCBzZXQKICMgQ09ORklHX000ODYgaXMgbm90IHNldApAQCAtMTIwLDYgKzEyMyw3IEBACiAjIENPTkZJR19NUEVOVElVTUlJIGlzIG5vdCBzZXQKIENPTkZJR19NUEVOVElVTUlJST15CiAjIENPTkZJR19NUEVOVElVTU0gaXMgbm90IHNldAorIyBDT05GSUdfTUNPUkUyIGlzIG5vdCBzZXQKICMgQ09ORklHX01QRU5USVVNNCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSzYgaXMgbm90IHNldAogIyBDT05GSUdfTUs3IGlzIG5vdCBzZXQKQEAgLTEzOCw2ICsxNDIsOCBAQAogQ09ORklHX1g4Nl9YQUREPXkKIENPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQ9NwogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19YODZfV1BfV09SS1NfT0s9eQogQ09ORklHX1g4Nl9JTlZMUEc9eQpAQCAtMTk3LDE1ICsyMDMsMTYgQEAKIENPTkZJR19NVFJSPXkKICMgQ09ORklHX0VGSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUlFCQUxBTkNFIGlzIG5vdCBzZXQKLUNPTkZJR19SRUdQQVJNPXkKIENPTkZJR19TRUNDT01QPXkKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAotQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MTAwMDAwCisjIENPTkZJR19SRUxPQ0FUQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEhZU0lDQUxfQUxJR049MHgxMDAwMDAKICMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVRfVkRTTz15CiBDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQpAQCAtMzY3LDYgKzM3NCw3IEBACiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiBDT05GSUdfSVBWNj15CiAjIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNl9ST1VURVJfUFJFRiBpcyBub3Qgc2V0CkBAIC0zODAsOCArMzg4LDggQEAKIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKICMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfSVBWNl9TSVQ9eQogIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTQ4Myw2ICs0OTEsMTMgQEAKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19JQk1fQVNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwogQ09ORklHX0lERT15CkBAIC01NTIsNiArNTY3LDcgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAogQ09ORklHX1NDU0lfTkVUTElOSz15CiAjIENPTkZJR19TQ1NJX1BST0NfRlMgaXMgbm90IHNldAogCkBAIC01NzIsNiArNTg4LDcgQEAKICMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgVHJhbnNwb3J0cwpAQCAtNjMxLDYgKzY0OCw3IEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAogCiAjCiAjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwpAQCAtNjcwLDYgKzY4OCw3IEBACiAjIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldApAQCAtODQzLDYgKzg2Miw3IEBACiAjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKICMgQ09ORklHX1MySU8gaXMgbm90IHNldAogIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CiAKICMKICMgVG9rZW4gUmluZyBkZXZpY2VzCkBAIC05NzcsMTAgKzk5Nyw2IEBACiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TT05ZUEkgaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwogQ09ORklHX0FHUD15CiAjIENPTkZJR19BR1BfQUxJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FHUF9BVEkgaXMgbm90IHNldApAQCAtMTAyNCw2ICsxMDQwLDcgQEAKICMKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIworIyBDT05GSUdfVzEgaXMgbm90IHNldAogCiAjCiAjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydApAQCAtMTAzMiwxMiArMTA0OSw2IEBACiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogCiAjCi0jIE1pc2MgZGV2aWNlcwotIwotIyBDT05GSUdfSUJNX0FTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotCi0jCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKQEAgLTEwNzgsMTAgKzEwODksNyBAQAogIyBPcGVuIFNvdW5kIFN5c3RlbQogIwogQ09ORklHX1NPVU5EX1BSSU1FPXkKLUNPTkZJR19PU1NfT0JTT0xFVEVfRFJJVkVSPXkKICMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0VNVTEwSzEgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfRlVTSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX0VTMTM3MSBpcyBub3Qgc2V0CiBDT05GSUdfU09VTkRfSUNIPXkKICMgQ09ORklHX1NPVU5EX1RSSURFTlQgaXMgbm90IHNldApAQCAtMTA5MSw2ICsxMDk5LDExIEBACiAjIENPTkZJR19TT1VORF9PU1MgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKworIwogIyBVU0Igc3VwcG9ydAogIwogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQpAQCAtMTEwNiw2ICsxMTE5LDcgQEAKICMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVUxUSVRIUkVBRF9QUk9CRSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKIAogIwpAQCAtMTE1Myw4ICsxMTY3LDcgQEAKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKLUNPTkZJR19VU0JfSElESU5QVVQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEX1BPV0VSQk9PSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfRkYgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQUlQVEVLIGlzIG5vdCBzZXQKQEAgLTExNjksNyArMTE4Miw2IEBACiAjIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEltYWdpbmcgZGV2aWNlcwpAQCAtMTE4NCw2ICsxMTk2LDcgQEAKICMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVF9NSUkgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX01PTj15CiAKQEAgLTEyMTUsNiArMTIyOCw3IEBACiAjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CiAKICMKQEAgLTEyODQsNiArMTI5OCw3IEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKQEAgLTEzMDcsNiArMTMyMiw3IEBACiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0FVVE9GUzRfRlM9eQogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19BQ0w9eQogCiAjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKQEAgLTEzODQsNyArMTQwMCw2IEBACiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfR0VORVJJQ19BQ0w9eQogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtMTQzOSw2ICsxNDU0LDcgQEAKICMKICMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCiAjCisjIENPTkZJR19ETE0gaXMgbm90IHNldAogCiAjCiAjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CkBAIC0xNDgwLDYgKzE0OTYsNyBAQAogQ09ORklHX1VOV0lORF9JTkZPPXkKIENPTkZJR19TVEFDS19VTldJTkQ9eQogIyBDT05GSUdfRk9SQ0VEX0lOTElOSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MS0RUTSBpcyBub3Qgc2V0CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKQEAgLTE1MDUsNiArMTUyMiw3IEBACiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMWE4ODRiNi4uMWU4OTg4ZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogCiBvYmoteQk6PSBwcm9jZXNzLm8gc2lnbmFsLm8gZW50cnkubyB0cmFwcy5vIGlycS5vIFwKIAkJcHRyYWNlLm8gdGltZS5vIGlvcG9ydC5vIGxkdC5vIHNldHVwLm8gaTgyNTkubyBzeXNfaTM4Ni5vIFwKLQkJcGNpLWRtYS5vIGkzODZfa3N5bXMubyBpMzg3Lm8gYm9vdGZsYWcubyBcCisJCXBjaS1kbWEubyBpMzg2X2tzeW1zLm8gaTM4Ny5vIGJvb3RmbGFnLm8gZTgyMC5vXAogCQlxdWlya3MubyBpODIzNy5vIHRvcG9sb2d5Lm8gYWx0ZXJuYXRpdmUubyBpODI1My5vIHRzYy5vCiAKIG9iai0kKENPTkZJR19TVEFDS1RSQUNFKQkrPSBzdGFja3RyYWNlLm8KQEAgLTQwLDYgKzQwLDkgQEAKIG9iai0kKENPTkZJR19IUEVUX1RJTUVSKSAJKz0gaHBldC5vCiBvYmotJChDT05GSUdfSzhfTkIpCQkrPSBrOC5vCiAKKyMgTWFrZSBzdXJlIHRoaXMgaXMgbGlua2VkIGFmdGVyIGFueSBvdGhlciBwYXJhdmlydF9vcHMgc3RydWN0czogc2VlIGhlYWQuUworb2JqLSQoQ09ORklHX1BBUkFWSVJUKQkJKz0gcGFyYXZpcnQubworCiBFWFRSQV9BRkxBR1MgICA6PSAtdHJhZGl0aW9uYWwKIAogb2JqLSQoQ09ORklHX1NDeDIwMCkJCSs9IHNjeDIwMC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwppbmRleCA5MmY3OWNkLi4wOTQzMDBiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTcwLDcgKzcwLDcgQEAKIAogI2RlZmluZSBQUkVGSVgJCQkiQUNQSTogIgogCi1pbnQgYWNwaV9ub2lycSBfX2luaXRkYXRhOwkvKiBza2lwIEFDUEkgSVJRIGluaXRpYWxpemF0aW9uICovCitpbnQgYWNwaV9ub2lycTsJCQkJLyogc2tpcCBBQ1BJIElSUSBpbml0aWFsaXphdGlvbiAqLwogaW50IGFjcGlfcGNpX2Rpc2FibGVkIF9faW5pdGRhdGE7CS8qIHNraXAgQUNQSSBQQ0kgc2NhbiBhbmQgSVJRIGluaXRpYWxpemF0aW9uICovCiBpbnQgYWNwaV9odCBfX2luaXRkYXRhID0gMTsJLyogZW5hYmxlIEhUICovCiAKQEAgLTgyLDYgKzgyLDcgQEAKIGFjcGlfaW50ZXJydXB0X2ZsYWdzIGFjcGlfc2NpX2ZsYWdzIF9faW5pdGRhdGE7CiBpbnQgYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpIF9faW5pdGRhdGE7CiBpbnQgYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIF9faW5pdGRhdGE7CitpbnQgYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUgX19pbml0ZGF0YTsKIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogc3RhdGljIHU2NCBhY3BpX2xhcGljX2FkZHIgX19pbml0ZGF0YSA9IEFQSUNfREVGQVVMVF9QSFlTX0JBU0U7CkBAIC0xMzAwLDYgKzEzMDEsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X3BhcmFtKCJhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUiLCBwYXJzZV9hY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUpOworCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9hY3BpX3VzZV90aW1lcl9vdmVycmlkZShjaGFyICphcmcpCit7CisJYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUgPSAxOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImFjcGlfdXNlX3RpbWVyX292ZXJyaWRlIiwgcGFyc2VfYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUpOwogI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLwogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hY3BpX3NjaShjaGFyICpzKQpAQCAtMTMxOSwzICsxMzI3LDI1IEBACiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgiYWNwaV9zY2kiLCBzZXR1cF9hY3BpX3NjaSk7CisKK2ludCBfX2FjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayh1bnNpZ25lZCBpbnQgKmxvY2spCit7CisJdW5zaWduZWQgaW50IG9sZCwgbmV3LCB2YWw7CisJZG8geworCQlvbGQgPSAqbG9jazsKKwkJbmV3ID0gKCgob2xkICYgfjB4MykgKyAyKSArICgob2xkID4+IDEpICYgMHgxKSk7CisJCXZhbCA9IGNtcHhjaGcobG9jaywgb2xkLCBuZXcpOworCX0gd2hpbGUgKHVubGlrZWx5ICh2YWwgIT0gb2xkKSk7CisJcmV0dXJuIChuZXcgPCAzKSA/IC0xIDogMDsKK30KKworaW50IF9fYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKHVuc2lnbmVkIGludCAqbG9jaykKK3sKKwl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHZhbDsKKwlkbyB7CisJCW9sZCA9ICpsb2NrOworCQluZXcgPSBvbGQgJiB+MHgzOworCQl2YWwgPSBjbXB4Y2hnKGxvY2ssIG9sZCwgbmV3KTsKKwl9IHdoaWxlICh1bmxpa2VseSAodmFsICE9IG9sZCkpOworCXJldHVybiBvbGQgJiAweDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMKaW5kZXggMjVkYjQ5ZS4uMTJlOTM3YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwpAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2FjcGkuaD4KQEAgLTQxLDUgKzQzLDEyMiBAQAogCQlmbGFncy0+Ym1fY2hlY2sgPSAxOwogCX0KIH0KLQogRVhQT1JUX1NZTUJPTChhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X2JtX2NoZWNrKTsKKworLyogVGhlIGNvZGUgYmVsb3cgaGFuZGxlcyBjc3RhdGUgZW50cnkgd2l0aCBtb25pdG9yLW13YWl0IHBhaXIgb24gSW50ZWwqLworCitzdHJ1Y3QgY3N0YXRlX2VudHJ5X3MgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCBlYXg7CisJCXVuc2lnbmVkIGludCBlY3g7CisJfSBzdGF0ZXNbQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSXTsKK307CitzdGF0aWMgc3RydWN0IGNzdGF0ZV9lbnRyeV9zICpjcHVfY3N0YXRlX2VudHJ5OwkvKiBwZXIgQ1BVIHB0ciAqLworCitzdGF0aWMgc2hvcnQgbXdhaXRfc3VwcG9ydGVkW0FDUElfUFJPQ0VTU09SX01BWF9QT1dFUl07CisKKyNkZWZpbmUgTVdBSVRfU1VCU1RBVEVfTUFTSwkoMHhmKQorI2RlZmluZSBNV0FJVF9TVUJTVEFURV9TSVpFCSg0KQorCisjZGVmaW5lIENQVUlEX01XQUlUX0xFQUYgKDUpCisjZGVmaW5lIENQVUlENV9FQ1hfRVhURU5TSU9OU19TVVBQT1JURUQgKDB4MSkKKyNkZWZpbmUgQ1BVSUQ1X0VDWF9JTlRFUlJVUFRfQlJFQUsJKDB4MikKKworI2RlZmluZSBNV0FJVF9FQ1hfSU5URVJSVVBUX0JSRUFLCSgweDEpCisKKyNkZWZpbmUgTkFUSVZFX0NTVEFURV9CRVlPTkRfSEFMVAkoMikKKworaW50IGFjcGlfcHJvY2Vzc29yX2ZmaF9jc3RhdGVfcHJvYmUodW5zaWduZWQgaW50IGNwdSwKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCwgc3RydWN0IGFjcGlfcG93ZXJfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgY3N0YXRlX2VudHJ5X3MgKnBlcmNwdV9lbnRyeTsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKKworCWNwdW1hc2tfdCBzYXZlZF9tYXNrOworCWludCByZXR2YWw7CisJdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsKKwl1bnNpZ25lZCBpbnQgZWR4X3BhcnQ7CisJdW5zaWduZWQgaW50IGNzdGF0ZV90eXBlOyAvKiBDLXN0YXRlIHR5cGUgYW5kIG5vdCBBQ1BJIEMtc3RhdGUgdHlwZSAqLworCXVuc2lnbmVkIGludCBudW1fY3N0YXRlX3N1YnR5cGU7CisKKwlpZiAoIWNwdV9jc3RhdGVfZW50cnkgfHwgYy0+Y3B1aWRfbGV2ZWwgPCBDUFVJRF9NV0FJVF9MRUFGICkKKwkJcmV0dXJuIC0xOworCisJaWYgKHJlZy0+Yml0X29mZnNldCAhPSBOQVRJVkVfQ1NUQVRFX0JFWU9ORF9IQUxUKQorCQlyZXR1cm4gLTE7CisKKwlwZXJjcHVfZW50cnkgPSBwZXJfY3B1X3B0cihjcHVfY3N0YXRlX2VudHJ5LCBjcHUpOworCXBlcmNwdV9lbnRyeS0+c3RhdGVzW2N4LT5pbmRleF0uZWF4ID0gMDsKKwlwZXJjcHVfZW50cnktPnN0YXRlc1tjeC0+aW5kZXhdLmVjeCA9IDA7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgb24gcmlnaHQgQ1BVICovCisJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwlyZXR2YWwgPSBzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCWlmIChyZXR2YWwpCisJCXJldHVybiAtMTsKKworCWNwdWlkKENQVUlEX01XQUlUX0xFQUYsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCisJLyogQ2hlY2sgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgY3hfdHlwZSAoaW4gQ1NUKSBpcyBzdXBwb3J0ZWQgb3Igbm90ICovCisJY3N0YXRlX3R5cGUgPSAoY3gtPmFkZHJlc3MgPj4gTVdBSVRfU1VCU1RBVEVfU0laRSkgKyAxOworCWVkeF9wYXJ0ID0gZWR4ID4+IChjc3RhdGVfdHlwZSAqIE1XQUlUX1NVQlNUQVRFX1NJWkUpOworCW51bV9jc3RhdGVfc3VidHlwZSA9IGVkeF9wYXJ0ICYgTVdBSVRfU1VCU1RBVEVfTUFTSzsKKworCXJldHZhbCA9IDA7CisJaWYgKG51bV9jc3RhdGVfc3VidHlwZSA8IChjeC0+YWRkcmVzcyAmIE1XQUlUX1NVQlNUQVRFX01BU0spKSB7CisJCXJldHZhbCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBtd2FpdCBlY3ggZXh0ZW5zaW9ucyBJTlRFUlJVUFRfQlJFQUsgc2hvdWxkIGJlIHN1cHBvcnRlZCBmb3IgQzIvQzMgKi8KKwlpZiAoIShlY3ggJiBDUFVJRDVfRUNYX0VYVEVOU0lPTlNfU1VQUE9SVEVEKSB8fAorCSAgICAhKGVjeCAmIENQVUlENV9FQ1hfSU5URVJSVVBUX0JSRUFLKSkgeworCQlyZXR2YWwgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCXBlcmNwdV9lbnRyeS0+c3RhdGVzW2N4LT5pbmRleF0uZWN4ID0gTVdBSVRfRUNYX0lOVEVSUlVQVF9CUkVBSzsKKworCS8qIFVzZSB0aGUgaGludCBpbiBDU1QgKi8KKwlwZXJjcHVfZW50cnktPnN0YXRlc1tjeC0+aW5kZXhdLmVheCA9IGN4LT5hZGRyZXNzOworCisJaWYgKCFtd2FpdF9zdXBwb3J0ZWRbY3N0YXRlX3R5cGVdKSB7CisJCW13YWl0X3N1cHBvcnRlZFtjc3RhdGVfdHlwZV0gPSAxOworCQlwcmludGsoS0VSTl9ERUJVRyAiTW9uaXRvci1Nd2FpdCB3aWxsIGJlIHVzZWQgdG8gZW50ZXIgQy0lZCAiCisJCSAgICAgICAic3RhdGVcbiIsIGN4LT50eXBlKTsKKwl9CisKK291dDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX3Byb2JlKTsKKwordm9pZCBhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX2VudGVyKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgY3N0YXRlX2VudHJ5X3MgKnBlcmNwdV9lbnRyeTsKKworCXBlcmNwdV9lbnRyeSA9IHBlcl9jcHVfcHRyKGNwdV9jc3RhdGVfZW50cnksIGNwdSk7CisJbXdhaXRfaWRsZV93aXRoX2hpbnRzKHBlcmNwdV9lbnRyeS0+c3RhdGVzW2N4LT5pbmRleF0uZWF4LAorCSAgICAgICAgICAgICAgICAgICAgICBwZXJjcHVfZW50cnktPnN0YXRlc1tjeC0+aW5kZXhdLmVjeCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX2VudGVyKTsKKworc3RhdGljIGludCBfX2luaXQgZmZoX2NzdGF0ZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7CisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcmV0dXJuIC0xOworCisJY3B1X2NzdGF0ZV9lbnRyeSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgY3N0YXRlX2VudHJ5X3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmZoX2NzdGF0ZV9leGl0KHZvaWQpCit7CisJZnJlZV9wZXJjcHUoY3B1X2NzdGF0ZV9lbnRyeSk7CisJY3B1X2NzdGF0ZV9lbnRyeSA9IE5VTEw7Cit9CisKK2FyY2hfaW5pdGNhbGwoZmZoX2NzdGF0ZV9pbml0KTsKK19fZXhpdGNhbGwoZmZoX2NzdGF0ZV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jCmluZGV4IGZlNzk5YjEuLjRiNjBhZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CiAjaW5jbHVkZSA8YXNtL2FjcGkuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2lmZGVmIENPTkZJR19BQ1BJCiAKQEAgLTI3LDExICsyOCwxNyBAQAogI2lmZGVmIENPTkZJR19BQ1BJCiAJLyogQWNjb3JkaW5nIHRvIE52aWRpYSBhbGwgdGltZXIgb3ZlcnJpZGVzIGFyZSBib2d1cyB1bmxlc3MgSFBFVAogCSAgIGlzIGVuYWJsZWQuICovCi0JaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05WSURJQSkgeworCWlmICghYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUgJiYgdmVuZG9yID09IFBDSV9WRU5ET1JfSURfTlZJRElBKSB7CiAJCW52aWRpYV9ocGV0X2RldGVjdGVkID0gMDsKIAkJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsIG52aWRpYV9ocGV0X2NoZWNrKTsKIAkJaWYgKG52aWRpYV9ocGV0X2RldGVjdGVkID09IDApIHsKIAkJCWFjcGlfc2tpcF90aW1lcl9vdmVycmlkZSA9IDE7CisJCQkgIHByaW50ayhLRVJOX0lORk8gIk52aWRpYSBib2FyZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJkZXRlY3RlZC4gSWdub3JpbmcgQUNQSSAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lciBvdmVycmlkZS5cbiIpOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIklmIHlvdSBnb3QgdGltZXIgdHJvdWJsZSAiCisJCQkgCSAidHJ5IGFjcGlfdXNlX3RpbWVyX292ZXJyaWRlXG4iKTsKKwogCQl9CiAJfQogI2VuZGlmCkBAIC00Myw2ICs1MCwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBjaGVja19pbnRlbCh2b2lkKQoreworCXUxNiB2ZW5kb3IsIGRldmljZTsKKworCXZlbmRvciA9IHJlYWRfcGNpX2NvbmZpZ18xNigwLCAwLCAwLCBQQ0lfVkVORE9SX0lEKTsKKworCWlmICh2ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9JTlRFTCkKKwkJcmV0dXJuOworCisJZGV2aWNlID0gcmVhZF9wY2lfY29uZmlnXzE2KDAsIDAsIDAsIFBDSV9ERVZJQ0VfSUQpOworI2lmZGVmIENPTkZJR19TTVAKKwlpZiAoZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRTczMjBfTUNIIHx8CisJICAgIGRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTIwX01DSCB8fAorCSAgICBkZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9FNzUyNV9NQ0gpCisJCXF1aXJrX2ludGVsX2lycWJhbGFuY2UoKTsKKyNlbmRpZgorfQorCiB2b2lkIF9faW5pdCBjaGVja19hY3BpX3BjaSh2b2lkKQogewogCWludCBudW0sIHNsb3QsIGZ1bmM7CkBAIC01NCw2ICs3OSw4IEBACiAJaWYgKCFlYXJseV9wY2lfYWxsb3dlZCgpKQogCQlyZXR1cm47CiAKKwljaGVja19pbnRlbCgpOworCiAJLyogUG9vciBtYW4ncyBQQ0kgZGlzY292ZXJ5ICovCiAJZm9yIChudW0gPSAwOyBudW0gPCAzMjsgbnVtKyspIHsKIAkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDMyOyBzbG90KyspIHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYwppbmRleCAyOGFiODA2Li45ZWNhMjFiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FsdGVybmF0aXZlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLmg+CkBAIC0xMjMsNiArMTI0LDIwIEBACiAKICNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCiAKK3N0YXRpYyB2b2lkIG5vcF9vdXQodm9pZCAqaW5zbnMsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqKm5vcHRhYmxlID0gZmluZF9ub3BfdGFibGUoKTsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXVuc2lnbmVkIGludCBub3BsZW4gPSBsZW47CisJCWlmIChub3BsZW4gPiBBU01fTk9QX01BWCkKKwkJCW5vcGxlbiA9IEFTTV9OT1BfTUFYOworCQltZW1jcHkoaW5zbnMsIG5vcHRhYmxlW25vcGxlbl0sIG5vcGxlbik7CisJCWluc25zICs9IG5vcGxlbjsKKwkJbGVuIC09IG5vcGxlbjsKKwl9Cit9CisKIGV4dGVybiBzdHJ1Y3QgYWx0X2luc3RyIF9fYWx0X2luc3RydWN0aW9uc1tdLCBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kW107CiBleHRlcm4gc3RydWN0IGFsdF9pbnN0ciBfX3NtcF9hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fc21wX2FsdF9pbnN0cnVjdGlvbnNfZW5kW107CiBleHRlcm4gdTggKl9fc21wX2xvY2tzW10sICpfX3NtcF9sb2Nrc19lbmRbXTsKQEAgLTEzNywxMCArMTUyLDkgQEAKIAogdm9pZCBhcHBseV9hbHRlcm5hdGl2ZXMoc3RydWN0IGFsdF9pbnN0ciAqc3RhcnQsIHN0cnVjdCBhbHRfaW5zdHIgKmVuZCkKIHsKLQl1bnNpZ25lZCBjaGFyICoqbm9wdGFibGUgPSBmaW5kX25vcF90YWJsZSgpOwogCXN0cnVjdCBhbHRfaW5zdHIgKmE7CiAJdTggKmluc3RyOwotCWludCBkaWZmLCBpLCBrOworCWludCBkaWZmOwogCiAJRFBSSU5USygiJXM6IGFsdCB0YWJsZSAlcCAtPiAlcFxuIiwgX19GVU5DVElPTl9fLCBzdGFydCwgZW5kKTsKIAlmb3IgKGEgPSBzdGFydDsgYSA8IGVuZDsgYSsrKSB7CkBAIC0xNTgsMTMgKzE3Miw3IEBACiAjZW5kaWYKIAkJbWVtY3B5KGluc3RyLCBhLT5yZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4pOwogCQlkaWZmID0gYS0+aW5zdHJsZW4gLSBhLT5yZXBsYWNlbWVudGxlbjsKLQkJLyogUGFkIHRoZSByZXN0IHdpdGggbm9wcyAqLwotCQlmb3IgKGkgPSBhLT5yZXBsYWNlbWVudGxlbjsgZGlmZiA+IDA7IGRpZmYgLT0gaywgaSArPSBrKSB7Ci0JCQlrID0gZGlmZjsKLQkJCWlmIChrID4gQVNNX05PUF9NQVgpCi0JCQkJayA9IEFTTV9OT1BfTUFYOwotCQkJbWVtY3B5KGEtPmluc3RyICsgaSwgbm9wdGFibGVba10sIGspOwotCQl9CisJCW5vcF9vdXQoaW5zdHIgKyBhLT5yZXBsYWNlbWVudGxlbiwgZGlmZik7CiAJfQogfQogCkBAIC0yMDgsNyArMjE2LDYgQEAKIAogc3RhdGljIHZvaWQgYWx0ZXJuYXRpdmVzX3NtcF91bmxvY2sodTggKipzdGFydCwgdTggKiplbmQsIHU4ICp0ZXh0LCB1OCAqdGV4dF9lbmQpCiB7Ci0JdW5zaWduZWQgY2hhciAqKm5vcHRhYmxlID0gZmluZF9ub3BfdGFibGUoKTsKIAl1OCAqKnB0cjsKIAogCWZvciAocHRyID0gc3RhcnQ7IHB0ciA8IGVuZDsgcHRyKyspIHsKQEAgLTIxNiw3ICsyMjMsNyBAQAogCQkJY29udGludWU7CiAJCWlmICgqcHRyID4gdGV4dF9lbmQpCiAJCQljb250aW51ZTsKLQkJKipwdHIgPSBub3B0YWJsZVsxXVswXTsKKwkJbm9wX291dCgqcHRyLCAxKTsKIAl9OwogfQogCkBAIC0zNDIsOCArMzQ5LDQzIEBACiAKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCit2b2lkIGFwcGx5X3BhcmF2aXJ0KHN0cnVjdCBwYXJhdmlydF9wYXRjaCAqc3RhcnQsIHN0cnVjdCBwYXJhdmlydF9wYXRjaCAqZW5kKQoreworCXN0cnVjdCBwYXJhdmlydF9wYXRjaCAqcDsKKworCWZvciAocCA9IHN0YXJ0OyBwIDwgZW5kOyBwKyspIHsKKwkJdW5zaWduZWQgaW50IHVzZWQ7CisKKwkJdXNlZCA9IHBhcmF2aXJ0X29wcy5wYXRjaChwLT5pbnN0cnR5cGUsIHAtPmNsb2JiZXJzLCBwLT5pbnN0ciwKKwkJCQkJICBwLT5sZW4pOworI2lmZGVmIENPTkZJR19ERUJVR19QQVJBVklSVAorCQl7CisJCWludCBpOworCQkvKiBEZWxpYmVyYXRlbHkgY2xvYmJlciByZWdzIHVzaW5nICJub3QgJXJlZyIgdG8gZmluZCBidWdzLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlpZiAocC0+bGVuIC0gdXNlZCA+PSAyICYmIChwLT5jbG9iYmVycyAmICgxIDw8IGkpKSkgeworCQkJCW1lbWNweShwLT5pbnN0ciArIHVzZWQsICJceGY3XHhkMCIsIDIpOworCQkJCXAtPmluc3RyW3VzZWQrMV0gfD0gaTsKKwkJCQl1c2VkICs9IDI7CisJCQl9CisJCX0KKwkJfQorI2VuZGlmCisJCS8qIFBhZCB0aGUgcmVzdCB3aXRoIG5vcHMgKi8KKwkJbm9wX291dChwLT5pbnN0ciArIHVzZWQsIHAtPmxlbiAtIHVzZWQpOworCX0KKworCS8qIFN5bmMgdG8gYmUgY29uc2VydmF0aXZlLCBpbiBjYXNlIHdlIHBhdGNoZWQgZm9sbG93aW5nIGluc3RydWN0aW9ucyAqLworCXN5bmNfY29yZSgpOworfQorZXh0ZXJuIHN0cnVjdCBwYXJhdmlydF9wYXRjaCBfX3N0YXJ0X3BhcmFpbnN0cnVjdGlvbnNbXSwKKwlfX3N0b3BfcGFyYWluc3RydWN0aW9uc1tdOworI2VuZGlmCS8qIENPTkZJR19QQVJBVklSVCAqLworCiB2b2lkIF9faW5pdCBhbHRlcm5hdGl2ZV9pbnN0cnVjdGlvbnModm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWlmIChub19yZXBsYWNlbWVudCkgewogCQlwcmludGsoS0VSTl9JTkZPICIoU01QLSlhbHRlcm5hdGl2ZXMgdHVybmVkIG9mZlxuIik7CiAJCWZyZWVfaW5pdF9wYWdlcygiU01QIGFsdGVybmF0aXZlcyIsCkBAIC0zNTEsNiArMzkzLDggQEAKIAkJCQkodW5zaWduZWQgbG9uZylfX3NtcF9hbHRfZW5kKTsKIAkJcmV0dXJuOwogCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlhcHBseV9hbHRlcm5hdGl2ZXMoX19hbHRfaW5zdHJ1Y3Rpb25zLCBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kKTsKIAogCS8qIHN3aXRjaCB0byBwYXRjaC1vbmNlLWF0LWJvb3R0aW1lLW9ubHkgbW9kZSBhbmQgZnJlZSB0aGUKQEAgLTM4Niw0ICs0MzAsNiBAQAogCQlhbHRlcm5hdGl2ZXNfc21wX3N3aXRjaCgwKTsKIAl9CiAjZW5kaWYKKyAJYXBwbHlfcGFyYXZpcnQoX19zdGFydF9wYXJhaW5zdHJ1Y3Rpb25zLCBfX3N0b3BfcGFyYWluc3RydWN0aW9ucyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwppbmRleCAyZmQ0YjdkLi43NzZkOWJlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwpAQCAtNjQ3LDIzICs2NDcsMzAgQEAKIHN0YXRpYyBpbnQgbGFwaWNfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWF4bHZ0OwogCiAJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKIAkJcmV0dXJuIDA7CiAKKwltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisKIAlhcGljX3BtX3N0YXRlLmFwaWNfaWQgPSBhcGljX3JlYWQoQVBJQ19JRCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX3Rhc2twcmkgPSBhcGljX3JlYWQoQVBJQ19UQVNLUFJJKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfbGRyID0gYXBpY19yZWFkKEFQSUNfTERSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfZGZyID0gYXBpY19yZWFkKEFQSUNfREZSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfc3BpdiA9IGFwaWNfcmVhZChBUElDX1NQSVYpOwogCWFwaWNfcG1fc3RhdGUuYXBpY19sdnR0ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7Ci0JYXBpY19wbV9zdGF0ZS5hcGljX2x2dHBjID0gYXBpY19yZWFkKEFQSUNfTFZUUEMpOworCWlmIChtYXhsdnQgPj0gNCkKKwkJYXBpY19wbV9zdGF0ZS5hcGljX2x2dHBjID0gYXBpY19yZWFkKEFQSUNfTFZUUEMpOwogCWFwaWNfcG1fc3RhdGUuYXBpY19sdnQwID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX2x2dDEgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0ZXJyID0gYXBpY19yZWFkKEFQSUNfTFZURVJSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfdG1pY3QgPSBhcGljX3JlYWQoQVBJQ19UTUlDVCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX3RkY3IgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKLQlhcGljX3BtX3N0YXRlLmFwaWNfdGhtciA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOworI2lmZGVmIENPTkZJR19YODZfTUNFX1A0VEhFUk1BTAorCWlmIChtYXhsdnQgPj0gNSkKKwkJYXBpY19wbV9zdGF0ZS5hcGljX3RobXIgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKKyNlbmRpZgogCQogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlkaXNhYmxlX2xvY2FsX0FQSUMoKTsKQEAgLTY3NSwxMCArNjgyLDEzIEBACiB7CiAJdW5zaWduZWQgaW50IGwsIGg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWF4bHZ0OwogCiAJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKIAkJcmV0dXJuIDA7CiAKKwltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAkvKgpAQCAtNzAwLDggKzcxMCwxMiBAQAogCWFwaWNfd3JpdGUoQVBJQ19TUElWLCBhcGljX3BtX3N0YXRlLmFwaWNfc3Bpdik7CiAJYXBpY193cml0ZShBUElDX0xWVDAsIGFwaWNfcG1fc3RhdGUuYXBpY19sdnQwKTsKIAlhcGljX3dyaXRlKEFQSUNfTFZUMSwgYXBpY19wbV9zdGF0ZS5hcGljX2x2dDEpOwotCWFwaWNfd3JpdGUoQVBJQ19MVlRUSE1SLCBhcGljX3BtX3N0YXRlLmFwaWNfdGhtcik7Ci0JYXBpY193cml0ZShBUElDX0xWVFBDLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0cGMpOworI2lmZGVmIENPTkZJR19YODZfTUNFX1A0VEhFUk1BTAorCWlmIChtYXhsdnQgPj0gNSkKKwkJYXBpY193cml0ZShBUElDX0xWVFRITVIsIGFwaWNfcG1fc3RhdGUuYXBpY190aG1yKTsKKyNlbmRpZgorCWlmIChtYXhsdnQgPj0gNCkKKwkJYXBpY193cml0ZShBUElDX0xWVFBDLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0cGMpOwogCWFwaWNfd3JpdGUoQVBJQ19MVlRULCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0dCk7CiAJYXBpY193cml0ZShBUElDX1REQ1IsIGFwaWNfcG1fc3RhdGUuYXBpY190ZGNyKTsKIAlhcGljX3dyaXRlKEFQSUNfVE1JQ1QsIGFwaWNfcG1fc3RhdGUuYXBpY190bWljdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYwppbmRleCBiNDJmMmQ5Li5iNzVjZmYyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwbS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogICogICAoQVBNKSBCSU9TIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uLCBSZXZpc2lvbiAxLjIsIEZlYnJ1YXJ5IDE5OTYuCiAgKgogICogW1RoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGZyb20gTWljcm9zb2Z0IGF0OgotICogICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2h3ZGV2L2J1c2Jpb3MvYW1wXzEyLmh0bV0KKyAqICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL2FyY2hpdmUvYW1wXzEyLm1zcHhdCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjMxLDYgKzIzMSw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9pODI1My5oPgorI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgogCiAjaW5jbHVkZSAiaW9fcG9ydHMuaCIKIApAQCAtNTQwLDEyICs1NDEsMzEgQEAKICAqIEFsc28sIHdlIEtOT1cgdGhhdCBmb3IgdGhlIG5vbiBlcnJvciBjYXNlIG9mIGFwbV9iaW9zX2NhbGwsIHRoZXJlCiAgKiBpcyBubyB1c2VmdWwgZGF0YSByZXR1cm5lZCBpbiB0aGUgbG93IG9yZGVyIDggYml0cyBvZiBlYXguCiAgKi8KLSNkZWZpbmUgQVBNX0RPX0NMSQlcCi0JaWYgKGFwbV9pbmZvLmFsbG93X2ludHMpIFwKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOyBcCi0JZWxzZSBcCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2FwbV9pcnFfc2F2ZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisJaWYgKGFwbV9pbmZvLmFsbG93X2ludHMpIHsKKwkJaWYgKGlycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpKQorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0gZWxzZQogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCisJcmV0dXJuIGZsYWdzOworfQorCisjZGVmaW5lIGFwbV9pcnFfc2F2ZShmbGFncykgXAorCWRvIHsgZmxhZ3MgPSBfX2FwbV9pcnFfc2F2ZSgpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXBtX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaWYgKGlycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpKQorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWVsc2UgaWYgKGlycXNfZGlzYWJsZWQoKSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCiAjaWZkZWYgQVBNX1pFUk9fU0VHUwogIwlkZWZpbmUgQVBNX0RFQ0xfU0VHUyBcCiAJCXVuc2lnbmVkIGludCBzYXZlZF9mczsgdW5zaWduZWQgaW50IHNhdmVkX2dzOwpAQCAtNTk2LDEyICs2MTYsMTEgQEAKIAlzYXZlX2Rlc2NfNDAgPSBnZHRbMHg0MCAvIDhdOwogCWdkdFsweDQwIC8gOF0gPSBiYWRfYmlvc19kZXNjOwogCi0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0JQVBNX0RPX0NMSTsKKwlhcG1faXJxX3NhdmUoZmxhZ3MpOwogCUFQTV9ET19TQVZFX1NFR1M7CiAJYXBtX2Jpb3NfY2FsbF9hc20oZnVuYywgZWJ4X2luLCBlY3hfaW4sIGVheCwgZWJ4LCBlY3gsIGVkeCwgZXNpKTsKIAlBUE1fRE9fUkVTVE9SRV9TRUdTOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlhcG1faXJxX3Jlc3RvcmUoZmxhZ3MpOwogCWdkdFsweDQwIC8gOF0gPSBzYXZlX2Rlc2NfNDA7CiAJcHV0X2NwdSgpOwogCWFwbV9yZXN0b3JlX2NwdXMoY3B1cyk7CkBAIC02NDAsMTIgKzY1OSwxMSBAQAogCXNhdmVfZGVzY180MCA9IGdkdFsweDQwIC8gOF07CiAJZ2R0WzB4NDAgLyA4XSA9IGJhZF9iaW9zX2Rlc2M7CiAKLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLQlBUE1fRE9fQ0xJOworCWFwbV9pcnFfc2F2ZShmbGFncyk7CiAJQVBNX0RPX1NBVkVfU0VHUzsKIAllcnJvciA9IGFwbV9iaW9zX2NhbGxfc2ltcGxlX2FzbShmdW5jLCBlYnhfaW4sIGVjeF9pbiwgZWF4KTsKIAlBUE1fRE9fUkVTVE9SRV9TRUdTOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlhcG1faXJxX3Jlc3RvcmUoZmxhZ3MpOwogCWdkdFsweDQwIC8gOF0gPSBzYXZlX2Rlc2NfNDA7CiAJcHV0X2NwdSgpOwogCWFwbV9yZXN0b3JlX2NwdXMoY3B1cyk7CkBAIC0xNTg2LDcgKzE2MDQsNyBAQAogewogCXN0cnVjdCBhcG1fdXNlciAqCWFzOwogCi0JYXMgPSAoc3RydWN0IGFwbV91c2VyICopa21hbGxvYyhzaXplb2YoKmFzKSwgR0ZQX0tFUk5FTCk7CisJYXMgPSBrbWFsbG9jKHNpemVvZigqYXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYXMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImFwbTogY2Fubm90IGFsbG9jYXRlIHN0cnVjdCBvZiBzaXplICVkIGJ5dGVzXG4iLAogCQkgICAgICAgc2l6ZW9mKCphcykpOwpAQCAtMjIxOCw3ICsyMjM2LDcgQEAKIAogCWRtaV9jaGVja19zeXN0ZW0oYXBtX2RtaV90YWJsZSk7CiAKLQlpZiAoYXBtX2luZm8uYmlvcy52ZXJzaW9uID09IDApIHsKKwlpZiAoYXBtX2luZm8uYmlvcy52ZXJzaW9uID09IDAgfHwgcGFyYXZpcnRfZW5hYmxlZCgpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImFwbTogQklPUyBub3QgZm91bmQuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGM4MDI3MWYuLjFiMmYzY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KIAogI2RlZmluZSBERUZJTkUoc3ltLCB2YWwpIFwKICAgICAgICAgYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCkBAIC01MSwxMyArNTIsMzUgQEAKIAlPRkZTRVQoVElfZXhlY19kb21haW4sIHRocmVhZF9pbmZvLCBleGVjX2RvbWFpbik7CiAJT0ZGU0VUKFRJX2ZsYWdzLCB0aHJlYWRfaW5mbywgZmxhZ3MpOwogCU9GRlNFVChUSV9zdGF0dXMsIHRocmVhZF9pbmZvLCBzdGF0dXMpOwotCU9GRlNFVChUSV9jcHUsIHRocmVhZF9pbmZvLCBjcHUpOwogCU9GRlNFVChUSV9wcmVlbXB0X2NvdW50LCB0aHJlYWRfaW5mbywgcHJlZW1wdF9jb3VudCk7CiAJT0ZGU0VUKFRJX2FkZHJfbGltaXQsIHRocmVhZF9pbmZvLCBhZGRyX2xpbWl0KTsKIAlPRkZTRVQoVElfcmVzdGFydF9ibG9jaywgdGhyZWFkX2luZm8sIHJlc3RhcnRfYmxvY2spOwogCU9GRlNFVChUSV9zeXNlbnRlcl9yZXR1cm4sIHRocmVhZF9pbmZvLCBzeXNlbnRlcl9yZXR1cm4pOwogCUJMQU5LKCk7CiAKKwlPRkZTRVQoR0RTX3NpemUsIFhndF9kZXNjX3N0cnVjdCwgc2l6ZSk7CisJT0ZGU0VUKEdEU19hZGRyZXNzLCBYZ3RfZGVzY19zdHJ1Y3QsIGFkZHJlc3MpOworCU9GRlNFVChHRFNfcGFkLCBYZ3RfZGVzY19zdHJ1Y3QsIHBhZCk7CisJQkxBTksoKTsKKworCU9GRlNFVChQVF9FQlgsIHB0X3JlZ3MsIGVieCk7CisJT0ZGU0VUKFBUX0VDWCwgcHRfcmVncywgZWN4KTsKKwlPRkZTRVQoUFRfRURYLCBwdF9yZWdzLCBlZHgpOworCU9GRlNFVChQVF9FU0ksIHB0X3JlZ3MsIGVzaSk7CisJT0ZGU0VUKFBUX0VESSwgcHRfcmVncywgZWRpKTsKKwlPRkZTRVQoUFRfRUJQLCBwdF9yZWdzLCBlYnApOworCU9GRlNFVChQVF9FQVgsIHB0X3JlZ3MsIGVheCk7CisJT0ZGU0VUKFBUX0RTLCAgcHRfcmVncywgeGRzKTsKKwlPRkZTRVQoUFRfRVMsICBwdF9yZWdzLCB4ZXMpOworCU9GRlNFVChQVF9HUywgIHB0X3JlZ3MsIHhncyk7CisJT0ZGU0VUKFBUX09SSUdfRUFYLCBwdF9yZWdzLCBvcmlnX2VheCk7CisJT0ZGU0VUKFBUX0VJUCwgcHRfcmVncywgZWlwKTsKKwlPRkZTRVQoUFRfQ1MsICBwdF9yZWdzLCB4Y3MpOworCU9GRlNFVChQVF9FRkxBR1MsIHB0X3JlZ3MsIGVmbGFncyk7CisJT0ZGU0VUKFBUX09MREVTUCwgcHRfcmVncywgZXNwKTsKKwlPRkZTRVQoUFRfT0xEU1MsICBwdF9yZWdzLCB4c3MpOworCUJMQU5LKCk7CisKIAlPRkZTRVQoRVhFQ19ET01BSU5faGFuZGxlciwgZXhlY19kb21haW4sIGhhbmRsZXIpOwogCU9GRlNFVChSVF9TSUdGUkFNRV9zaWdjb250ZXh0LCBydF9zaWdmcmFtZSwgdWMudWNfbWNvbnRleHQpOwogCUJMQU5LKCk7CkBAIC03NCw0ICs5NywxOCBAQAogCURFRklORShWRFNPX1BSRUxJTkssIFZEU09fUFJFTElOSyk7CiAKIAlPRkZTRVQoY3J5cHRvX3RmbV9jdHhfb2Zmc2V0LCBjcnlwdG9fdGZtLCBfX2NydF9jdHgpOworCisJQkxBTksoKTsKKyAJT0ZGU0VUKFBEQV9jcHUsIGkzODZfcGRhLCBjcHVfbnVtYmVyKTsKKwlPRkZTRVQoUERBX3BjdXJyZW50LCBpMzg2X3BkYSwgcGN1cnJlbnQpOworCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisJQkxBTksoKTsKKwlPRkZTRVQoUEFSQVZJUlRfZW5hYmxlZCwgcGFyYXZpcnRfb3BzLCBwYXJhdmlydF9lbmFibGVkKTsKKwlPRkZTRVQoUEFSQVZJUlRfaXJxX2Rpc2FibGUsIHBhcmF2aXJ0X29wcywgaXJxX2Rpc2FibGUpOworCU9GRlNFVChQQVJBVklSVF9pcnFfZW5hYmxlLCBwYXJhdmlydF9vcHMsIGlycV9lbmFibGUpOworCU9GRlNFVChQQVJBVklSVF9pcnFfZW5hYmxlX3N5c2V4aXQsIHBhcmF2aXJ0X29wcywgaXJxX2VuYWJsZV9zeXNleGl0KTsKKwlPRkZTRVQoUEFSQVZJUlRfaXJldCwgcGFyYXZpcnRfb3BzLCBpcmV0KTsKKwlPRkZTRVQoUEFSQVZJUlRfcmVhZF9jcjAsIHBhcmF2aXJ0X29wcywgcmVhZF9jcjApOworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9hbWQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IGU0NzU4MDkuLjQxY2ZlYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCkBAIC0xMDQsMTAgKzEwNCw3IEBACiAJCQkJCWZfdmlkZSgpOwogCQkJCXJkdHNjbChkMik7CiAJCQkJZCA9IGQyLWQ7Ci0JCQkJCi0JCQkJLyogS25vY2sgdGhlc2UgdHdvIGxpbmVzIG91dCBpZiBpdCBkZWJ1Z3Mgb3V0IG9rICovCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEs2IHN0ZXBwaW5nIEIgZGV0ZWN0ZWQgLSAiKTsKLQkJCQkvKiAtLSBjdXQgaGVyZSAtLSAqLworCiAJCQkJaWYgKGQgPiAyMCpLNl9CVUdfTE9PUCkgCiAJCQkJCXByaW50aygic3lzdGVtIHN0YWJpbGl0eSBtYXkgYmUgaW1wYWlyZWQgd2hlbiBtb3JlIHRoYW4gMzIgTUIgYXJlIHVzZWQuXG4iKTsKIAkJCQllbHNlIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCBkOWYzZTNjLi4xYjM0YzU2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMTgsMTQgKzE4LDE1IEBACiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KICNlbmRpZgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KIAogI2luY2x1ZGUgImNwdS5oIgogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgWGd0X2Rlc2Nfc3RydWN0LCBjcHVfZ2R0X2Rlc2NyKTsKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTChjcHVfZ2R0X2Rlc2NyKTsKIAotREVGSU5FX1BFUl9DUFUodW5zaWduZWQgY2hhciwgY3B1XzE2Yml0X3N0YWNrW0NQVV8xNkJJVF9TVEFDS19TSVpFXSk7Ci1FWFBPUlRfUEVSX0NQVV9TWU1CT0woY3B1XzE2Yml0X3N0YWNrKTsKK3N0cnVjdCBpMzg2X3BkYSAqX2NwdV9wZGFbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woX2NwdV9wZGEpOwogCiBzdGF0aWMgaW50IGNhY2hlc2l6ZV9vdmVycmlkZSBfX2NwdWluaXRkYXRhID0gLTE7CiBzdGF0aWMgaW50IGRpc2FibGVfeDg2X2Z4c3IgX19jcHVpbml0ZGF0YTsKQEAgLTIzNSwyOSArMjM2LDE0IEBACiAJcmV0dXJuIGZsYWdfaXNfY2hhbmdlYWJsZV9wKFg4Nl9FRkxBR1NfSUQpOwogfQogCi0vKiBEbyBtaW5pbXVtIENQVSBkZXRlY3Rpb24gZWFybHkuCi0gICBGaWVsZHMgcmVhbGx5IG5lZWRlZDogdmVuZG9yLCBjcHVpZF9sZXZlbCwgZmFtaWx5LCBtb2RlbCwgbWFzaywgY2FjaGUgYWxpZ25tZW50LgotICAgVGhlIG90aGVycyBhcmUgbm90IHRvdWNoZWQgdG8gYXZvaWQgdW53YW50ZWQgc2lkZSBlZmZlY3RzLgotCi0gICBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uIHRoZSBCUC4gIERvbid0IGFkZCBjb2RlIGhlcmUKLSAgIHRoYXQgaXMgc3VwcG9zZWQgdG8gcnVuIG9uIGFsbCBDUFVzLiAqLwotc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X2NwdV9kZXRlY3Qodm9pZCkKK3ZvaWQgX19pbml0IGNwdV9kZXRlY3Qoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewotCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOwotCi0JYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IDMyOwotCi0JaWYgKCFoYXZlX2NwdWlkX3AoKSkKLQkJcmV0dXJuOwotCiAJLyogR2V0IHZlbmRvciBuYW1lICovCiAJY3B1aWQoMHgwMDAwMDAwMCwgJmMtPmNwdWlkX2xldmVsLAogCSAgICAgIChpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFswXSwKIAkgICAgICAoaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbOF0sCiAJICAgICAgKGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzRdKTsKIAotCWdldF9jcHVfdmVuZG9yKGMsIDEpOwotCiAJYy0+eDg2ID0gNDsKIAlpZiAoYy0+Y3B1aWRfbGV2ZWwgPj0gMHgwMDAwMDAwMSkgewogCQl1MzIganVuaywgdGZtcywgY2FwMCwgbWlzYzsKQEAgLTI3NCw2ICsyNjAsMjYgQEAKIAl9CiB9CiAKKy8qIERvIG1pbmltdW0gQ1BVIGRldGVjdGlvbiBlYXJseS4KKyAgIEZpZWxkcyByZWFsbHkgbmVlZGVkOiB2ZW5kb3IsIGNwdWlkX2xldmVsLCBmYW1pbHksIG1vZGVsLCBtYXNrLCBjYWNoZSBhbGlnbm1lbnQuCisgICBUaGUgb3RoZXJzIGFyZSBub3QgdG91Y2hlZCB0byBhdm9pZCB1bndhbnRlZCBzaWRlIGVmZmVjdHMuCisKKyAgIFdBUk5JTkc6IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb24gdGhlIEJQLiAgRG9uJ3QgYWRkIGNvZGUgaGVyZQorICAgdGhhdCBpcyBzdXBwb3NlZCB0byBydW4gb24gYWxsIENQVXMuICovCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfY3B1X2RldGVjdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOworCisJYy0+eDg2X2NhY2hlX2FsaWdubWVudCA9IDMyOworCisJaWYgKCFoYXZlX2NwdWlkX3AoKSkKKwkJcmV0dXJuOworCisJY3B1X2RldGVjdChjKTsKKworCWdldF9jcHVfdmVuZG9yKGMsIDEpOworfQorCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgZ2VuZXJpY19pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQogewogCXUzMiB0Zm1zLCB4bHZsOwpAQCAtMzA4LDYgKzMxNCw4IEBACiAjZWxzZQogCQkJYy0+YXBpY2lkID0gKGVieCA+PiAyNCkgJiAweEZGOwogI2VuZGlmCisJCQlpZiAoYy0+eDg2X2NhcGFiaWxpdHlbMF0gJiAoMTw8MTkpKQorCQkJCWMtPng4Nl9jbGZsdXNoX3NpemUgPSAoKGVieCA+PiA4KSAmIDB4ZmYpICogODsKIAkJfSBlbHNlIHsKIAkJCS8qIEhhdmUgQ1BVSUQgbGV2ZWwgMCBvbmx5IC0gdW5oZWFyZCBvZiAqLwogCQkJYy0+eDg2ID0gNDsKQEAgLTM3Miw2ICszODAsNyBAQAogCWMtPng4Nl92ZW5kb3JfaWRbMF0gPSAnXDAnOyAvKiBVbnNldCAqLwogCWMtPng4Nl9tb2RlbF9pZFswXSA9ICdcMCc7ICAvKiBVbnNldCAqLwogCWMtPng4Nl9tYXhfY29yZXMgPSAxOworCWMtPng4Nl9jbGZsdXNoX3NpemUgPSAzMjsKIAltZW1zZXQoJmMtPng4Nl9jYXBhYmlsaXR5LCAwLCBzaXplb2YgYy0+eDg2X2NhcGFiaWxpdHkpOwogCiAJaWYgKCFoYXZlX2NwdWlkX3AoKSkgewpAQCAtNTkxLDI1ICs2MDAsMTM0IEBACiAJZGlzYWJsZV9wc2UgPSAxOwogI2VuZGlmCiB9Ci0vKgotICogY3B1X2luaXQoKSBpbml0aWFsaXplcyBzdGF0ZSB0aGF0IGlzIHBlci1DUFUuIFNvbWUgZGF0YSBpcyBhbHJlYWR5Ci0gKiBpbml0aWFsaXplZCAobmF0dXJhbGx5KSBpbiB0aGUgYm9vdHN0cmFwIHByb2Nlc3MsIHN1Y2ggYXMgdGhlIEdEVAotICogYW5kIElEVC4gV2UgcmVsb2FkIHRoZW0gbmV2ZXJ0aGVsZXNzLCB0aGlzIGZ1bmN0aW9uIGFjdHMgYXMgYQotICogJ0NQVSBzdGF0ZSBiYXJyaWVyJywgbm90aGluZyBzaG91bGQgZ2V0IGFjcm9zcy4KLSAqLwotdm9pZCBfX2NwdWluaXQgY3B1X2luaXQodm9pZCkKKworLyogTWFrZSBzdXJlICVncyBpcyBpbml0aWFsaXplZCBwcm9wZXJseSBpbiBpZGxlIHRocmVhZHMgKi8KK3N0cnVjdCBwdF9yZWdzICogX19kZXZpbml0IGlkbGVfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCB0c3Nfc3RydWN0ICogdCA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOwotCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQgPSAmY3VycmVudC0+dGhyZWFkOwotCXN0cnVjdCBkZXNjX3N0cnVjdCAqZ2R0OwotCV9fdTMyIHN0azE2X29mZiA9IChfX3UzMikmcGVyX2NwdShjcHVfMTZiaXRfc3RhY2ssIGNwdSk7CisJbWVtc2V0KHJlZ3MsIDAsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCXJlZ3MtPnhncyA9IF9fS0VSTkVMX1BEQTsKKwlyZXR1cm4gcmVnczsKK30KKworc3RhdGljIF9fY3B1aW5pdCBpbnQgYWxsb2NfZ2R0KGludCBjcHUpCit7CiAJc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqY3B1X2dkdF9kZXNjciA9ICZwZXJfY3B1KGNwdV9nZHRfZGVzY3IsIGNwdSk7CisJc3RydWN0IGRlc2Nfc3RydWN0ICpnZHQ7CisJc3RydWN0IGkzODZfcGRhICpwZGE7CisKKwlnZHQgPSAoc3RydWN0IGRlc2Nfc3RydWN0ICopY3B1X2dkdF9kZXNjci0+YWRkcmVzczsKKwlwZGEgPSBjcHVfcGRhKGNwdSk7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBob3JyaWJsZSBoYWNrIHRvIGFsbG9jYXRlIHRoZSBHRFQuICBUaGUgcHJvYmxlbQorCSAqIGlzIHRoYXQgY3B1X2luaXQoKSBpcyBjYWxsZWQgcmVhbGx5IGVhcmx5IGZvciB0aGUgYm9vdCBDUFUKKwkgKiAoYW5kIGhlbmNlIG5lZWRzIGJvb3RtZW0pIGJ1dCBtdWNoIGxhdGVyIGZvciB0aGUgc2Vjb25kYXJ5CisJICogQ1BVcywgd2hlbiBib290bWVtIHdpbGwgaGF2ZSBnb25lIGF3YXkKKwkgKi8KKwlpZiAoTk9ERV9EQVRBKDApLT5iZGF0YS0+bm9kZV9ib290bWVtX21hcCkgeworCQlCVUdfT04oZ2R0ICE9IE5VTEwgfHwgcGRhICE9IE5VTEwpOworCisJCWdkdCA9IGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKKwkJcGRhID0gYWxsb2NfYm9vdG1lbShzaXplb2YoKnBkYSkpOworCQkvKiBhbGxvY19ib290bWVtKF9wYWdlcykgcGFuaWNzIG9uIGZhaWx1cmUsIHNvIG5vIGNoZWNrICovCisKKwkJbWVtc2V0KGdkdCwgMCwgUEFHRV9TSVpFKTsKKwkJbWVtc2V0KHBkYSwgMCwgc2l6ZW9mKCpwZGEpKTsKKwl9IGVsc2UgeworCQkvKiBHRFQgYW5kIFBEQSBtaWdodCBhbHJlYWR5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgaWYKKwkJICAgdGhpcyBpcyBhIENQVSBob3RwbHVnIHJlLWluc2VydGlvbi4gKi8KKwkJaWYgKGdkdCA9PSBOVUxMKQorCQkJZ2R0ID0gKHN0cnVjdCBkZXNjX3N0cnVjdCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKworCQlpZiAocGRhID09IE5VTEwpCisJCQlwZGEgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpwZGEpLCBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjcHUpKTsKKworCQlpZiAodW5saWtlbHkoIWdkdCB8fCAhcGRhKSkgeworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylnZHQsIDApOworCQkJa2ZyZWUocGRhKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisgCWNwdV9nZHRfZGVzY3ItPmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylnZHQ7CisJY3B1X3BkYShjcHUpID0gcGRhOworCisJcmV0dXJuIDE7Cit9CisKKy8qIEluaXRpYWwgUERBIHVzZWQgYnkgYm9vdCBDUFUgKi8KK3N0cnVjdCBpMzg2X3BkYSBib290X3BkYSA9IHsKKwkuX3BkYSA9ICZib290X3BkYSwKKwkuY3B1X251bWJlciA9IDAsCisJLnBjdXJyZW50ID0gJmluaXRfdGFzaywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfa2VybmVsX2dzKHZvaWQpCit7CisJLyogU2V0ICVncyBmb3IgdGhpcyBDUFUncyBQREEuICBNZW1vcnkgY2xvYmJlciBpcyB0byBjcmVhdGUgYQorCSAgIGJhcnJpZXIgd2l0aCByZXNwZWN0IHRvIGFueSBQREEgb3BlcmF0aW9ucywgc28gdGhlIGNvbXBpbGVyCisJICAgZG9lc24ndCBtb3ZlIGFueSBiZWZvcmUgaGVyZS4gKi8KKwlhc20gdm9sYXRpbGUgKCJtb3YgJTAsICUlZ3MiIDogOiAiciIgKF9fS0VSTkVMX1BEQSkgOiAibWVtb3J5Iik7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIENQVSdzIEdEVCBhbmQgUERBLiAgVGhlIGJvb3QgQ1BVIGRvZXMgdGhpcyBmb3IKKyAgIGl0c2VsZiwgYnV0IHNlY29uZGFyaWVzIGZpbmQgdGhpcyBkb25lIGZvciB0aGVtLiAqLworX19jcHVpbml0IGludCBpbml0X2dkdChpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqY3B1X2dkdF9kZXNjciA9ICZwZXJfY3B1KGNwdV9nZHRfZGVzY3IsIGNwdSk7CisJc3RydWN0IGRlc2Nfc3RydWN0ICpnZHQ7CisJc3RydWN0IGkzODZfcGRhICpwZGE7CisKKwkvKiBGb3Igbm9uLWJvb3QgQ1BVcywgdGhlIEdEVCBhbmQgUERBIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbgorCSAgIGFsbG9jYXRlZC4gKi8KKwlpZiAoIWFsbG9jX2dkdChjcHUpKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIkNQVSVkIGZhaWxlZCB0byBhbGxvY2F0ZSBHRFQgb3IgUERBXG4iLCBjcHUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlnZHQgPSAoc3RydWN0IGRlc2Nfc3RydWN0ICopY3B1X2dkdF9kZXNjci0+YWRkcmVzczsKKwlwZGEgPSBjcHVfcGRhKGNwdSk7CisKKwlCVUdfT04oZ2R0ID09IE5VTEwgfHwgcGRhID09IE5VTEwpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBwZXItQ1BVIEdEVCB3aXRoIHRoZSBib290IEdEVCwKKwkgKiBhbmQgc2V0IHVwIHRoZSBHRFQgZGVzY3JpcHRvcjoKKwkgKi8KKyAJbWVtY3B5KGdkdCwgY3B1X2dkdF90YWJsZSwgR0RUX1NJWkUpOworCWNwdV9nZHRfZGVzY3ItPnNpemUgPSBHRFRfU0laRSAtIDE7CisKKwlwYWNrX2Rlc2NyaXB0b3IoKHUzMiAqKSZnZHRbR0RUX0VOVFJZX1BEQV0uYSwKKwkJCSh1MzIgKikmZ2R0W0dEVF9FTlRSWV9QREFdLmIsCisJCQkodW5zaWduZWQgbG9uZylwZGEsIHNpemVvZigqcGRhKSAtIDEsCisJCQkweDgwIHwgREVTQ1RZUEVfUyB8IDB4MiwgMCk7IC8qIHByZXNlbnQgcmVhZC13cml0ZSBkYXRhIHNlZ21lbnQgKi8KKworCW1lbXNldChwZGEsIDAsIHNpemVvZigqcGRhKSk7CisJcGRhLT5fcGRhID0gcGRhOworCXBkYS0+Y3B1X251bWJlciA9IGNwdTsKKwlwZGEtPnBjdXJyZW50ID0gaWRsZTsKKworCXJldHVybiAxOworfQorCisvKiBDb21tb24gQ1BVIGluaXQgZm9yIGJvdGggYm9vdCBhbmQgc2Vjb25kYXJ5IENQVXMgKi8KK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBfY3B1X2luaXQoaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQoreworCXN0cnVjdCB0c3Nfc3RydWN0ICogdCA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQgPSAmY3Vyci0+dGhyZWFkOworCXN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgKmNwdV9nZHRfZGVzY3IgPSAmcGVyX2NwdShjcHVfZ2R0X2Rlc2NyLCBjcHUpOworCisJLyogUmVpbml0IHRoZXNlIGFueXdheSwgZXZlbiBpZiB0aGV5J3ZlIGFscmVhZHkgYmVlbiBkb25lIChvbgorCSAgIHRoZSBib290IENQVSwgdGhpcyB3aWxsIHRyYW5zaXRpb24gZnJvbSB0aGUgYm9vdCBnZHQrcGRhIHRvCisJICAgdGhlIHJlYWwgb25lcykuICovCisJbG9hZF9nZHQoY3B1X2dkdF9kZXNjcik7CisJc2V0X2tlcm5lbF9ncygpOwogCiAJaWYgKGNwdV90ZXN0X2FuZF9zZXQoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNQVSMlZCBhbHJlYWR5IGluaXRpYWxpemVkIVxuIiwgY3B1KTsKIAkJZm9yICg7OykgbG9jYWxfaXJxX2VuYWJsZSgpOwogCX0KKwogCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemluZyBDUFUjJWRcbiIsIGNwdSk7CiAKIAlpZiAoY3B1X2hhc192bWUgfHwgY3B1X2hhc190c2MgfHwgY3B1X2hhc19kZSkKQEAgLTYyMSw1NiArNzM5LDE2IEBACiAJCXNldF9pbl9jcjQoWDg2X0NSNF9UU0QpOwogCX0KIAotCS8qIFRoZSBDUFUgaG90cGx1ZyBjYXNlICovCi0JaWYgKGNwdV9nZHRfZGVzY3ItPmFkZHJlc3MpIHsKLQkJZ2R0ID0gKHN0cnVjdCBkZXNjX3N0cnVjdCAqKWNwdV9nZHRfZGVzY3ItPmFkZHJlc3M7Ci0JCW1lbXNldChnZHQsIDAsIFBBR0VfU0laRSk7Ci0JCWdvdG8gb2xkX2dkdDsKLQl9Ci0JLyoKLQkgKiBUaGlzIGlzIGEgaG9ycmlibGUgaGFjayB0byBhbGxvY2F0ZSB0aGUgR0RULiAgVGhlIHByb2JsZW0KLQkgKiBpcyB0aGF0IGNwdV9pbml0KCkgaXMgY2FsbGVkIHJlYWxseSBlYXJseSBmb3IgdGhlIGJvb3QgQ1BVCi0JICogKGFuZCBoZW5jZSBuZWVkcyBib290bWVtKSBidXQgbXVjaCBsYXRlciBmb3IgdGhlIHNlY29uZGFyeQotCSAqIENQVXMsIHdoZW4gYm9vdG1lbSB3aWxsIGhhdmUgZ29uZSBhd2F5Ci0JICovCi0JaWYgKE5PREVfREFUQSgwKS0+YmRhdGEtPm5vZGVfYm9vdG1lbV9tYXApIHsKLQkJZ2R0ID0gKHN0cnVjdCBkZXNjX3N0cnVjdCAqKWFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKLQkJLyogYWxsb2NfYm9vdG1lbV9wYWdlcyBwYW5pY3Mgb24gZmFpbHVyZSwgc28gbm8gY2hlY2sgKi8KLQkJbWVtc2V0KGdkdCwgMCwgUEFHRV9TSVpFKTsKLQl9IGVsc2UgewotCQlnZHQgPSAoc3RydWN0IGRlc2Nfc3RydWN0ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAodW5saWtlbHkoIWdkdCkpIHsKLQkJCXByaW50ayhLRVJOX0NSSVQgIkNQVSVkIGZhaWxlZCB0byBhbGxvY2F0ZSBHRFRcbiIsIGNwdSk7Ci0JCQlmb3IgKDs7KQotCQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJfQotCX0KLW9sZF9nZHQ6Ci0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBwZXItQ1BVIEdEVCB3aXRoIHRoZSBib290IEdEVCwKLQkgKiBhbmQgc2V0IHVwIHRoZSBHRFQgZGVzY3JpcHRvcjoKLQkgKi8KLSAJbWVtY3B5KGdkdCwgY3B1X2dkdF90YWJsZSwgR0RUX1NJWkUpOwotCi0JLyogU2V0IHVwIEdEVCBlbnRyeSBmb3IgMTZiaXQgc3RhY2sgKi8KLSAJKihfX3U2NCAqKSgmZ2R0W0dEVF9FTlRSWV9FU1BGSVhfU1NdKSB8PQotCQkoKCgoX191NjQpc3RrMTZfb2ZmKSA8PCAxNikgJiAweDAwMDAwMGZmZmZmZjAwMDBVTEwpIHwKLQkJKCgoKF9fdTY0KXN0azE2X29mZikgPDwgMzIpICYgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSB8Ci0JCShDUFVfMTZCSVRfU1RBQ0tfU0laRSAtIDEpOwotCi0JY3B1X2dkdF9kZXNjci0+c2l6ZSA9IEdEVF9TSVpFIC0gMTsKLSAJY3B1X2dkdF9kZXNjci0+YWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWdkdDsKLQotCWxvYWRfZ2R0KGNwdV9nZHRfZGVzY3IpOwogCWxvYWRfaWR0KCZpZHRfZGVzY3IpOwogCiAJLyoKIAkgKiBTZXQgdXAgYW5kIGxvYWQgdGhlIHBlci1DUFUgVFNTIGFuZCBMRFQKIAkgKi8KIAlhdG9taWNfaW5jKCZpbml0X21tLm1tX2NvdW50KTsKLQljdXJyZW50LT5hY3RpdmVfbW0gPSAmaW5pdF9tbTsKLQlCVUdfT04oY3VycmVudC0+bW0pOwotCWVudGVyX2xhenlfdGxiKCZpbml0X21tLCBjdXJyZW50KTsKKwljdXJyLT5hY3RpdmVfbW0gPSAmaW5pdF9tbTsKKwlpZiAoY3Vyci0+bW0pCisJCUJVRygpOworCWVudGVyX2xhenlfdGxiKCZpbml0X21tLCBjdXJyKTsKIAogCWxvYWRfZXNwMCh0LCB0aHJlYWQpOwogCXNldF90c3NfZGVzYyhjcHUsdCk7CkBAIC02ODIsOCArNzYwLDggQEAKIAlfX3NldF90c3NfZGVzYyhjcHUsIEdEVF9FTlRSWV9ET1VCTEVGQVVMVF9UU1MsICZkb3VibGVmYXVsdF90c3MpOwogI2VuZGlmCiAKLQkvKiBDbGVhciAlZnMgYW5kICVncy4gKi8KLQlhc20gdm9sYXRpbGUgKCJtb3ZsICUwLCAlJWZzOyBtb3ZsICUwLCAlJWdzIiA6IDogInIiICgwKSk7CisJLyogQ2xlYXIgJWZzLiAqLworCWFzbSB2b2xhdGlsZSAoIm1vdiAlMCwgJSVmcyIgOiA6ICJyIiAoMCkpOwogCiAJLyogQ2xlYXIgYWxsIDYgZGVidWcgcmVnaXN0ZXJzOiAqLwogCXNldF9kZWJ1Z3JlZygwLCAwKTsKQEAgLTcwMSw2ICs3NzksMzcgQEAKIAlteGNzcl9mZWF0dXJlX21hc2tfaW5pdCgpOwogfQogCisvKiBFbnRyeXBvaW50IHRvIGluaXRpYWxpemUgc2Vjb25kYXJ5IENQVSAqLwordm9pZCBfX2NwdWluaXQgc2Vjb25kYXJ5X2NwdV9pbml0KHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OworCisJX2NwdV9pbml0KGNwdSwgY3Vycik7Cit9CisKKy8qCisgKiBjcHVfaW5pdCgpIGluaXRpYWxpemVzIHN0YXRlIHRoYXQgaXMgcGVyLUNQVS4gU29tZSBkYXRhIGlzIGFscmVhZHkKKyAqIGluaXRpYWxpemVkIChuYXR1cmFsbHkpIGluIHRoZSBib290c3RyYXAgcHJvY2Vzcywgc3VjaCBhcyB0aGUgR0RUCisgKiBhbmQgSURULiBXZSByZWxvYWQgdGhlbSBuZXZlcnRoZWxlc3MsIHRoaXMgZnVuY3Rpb24gYWN0cyBhcyBhCisgKiAnQ1BVIHN0YXRlIGJhcnJpZXInLCBub3RoaW5nIHNob3VsZCBnZXQgYWNyb3NzLgorICovCit2b2lkIF9fY3B1aW5pdCBjcHVfaW5pdCh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyID0gY3VycmVudDsKKworCS8qIFNldCB1cCB0aGUgcmVhbCBHRFQgYW5kIFBEQSwgc28gd2UgY2FuIHRyYW5zaXRpb24gZnJvbSB0aGUKKwkgICBib290IHZlcnNpb25zLiAqLworCWlmICghaW5pdF9nZHQoY3B1LCBjdXJyKSkgeworCQkvKiBmYWlsZWQgdG8gYWxsb2NhdGUgc29tZXRoaW5nOyBub3QgbXVjaCB3ZSBjYW4gZG8uLi4gKi8KKwkJZm9yICg7OykKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisKKwlfY3B1X2luaXQoY3B1LCBjdXJyKTsKK30KKwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogdm9pZCBfX2NwdWluaXQgY3B1X3VuaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCmluZGV4IGNjYzFlZGYuLjUyOTljNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKQEAgLTE3LDYgKzE3LDcgQEAKIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIGEgQ1BVRnJlcSBkcml2ZXIgd2hpY2ggdXRpbGl6ZXMgdGhlIEFDUEkKIAkgIFByb2Nlc3NvciBQZXJmb3JtYW5jZSBTdGF0ZXMuCisJICBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIEludGVsIEVuaGFuY2VkIFNwZWVkc3RlcC4KIAogCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KIApAQCAtMTIxLDExICsxMjIsMTQgQEAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAogY29uZmlnIFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSQotCWJvb2wgIlVzZSBBQ1BJIHRhYmxlcyB0byBkZWNvZGUgdmFsaWQgZnJlcXVlbmN5L3ZvbHRhZ2UgcGFpcnMiCisJYm9vbCAiVXNlIEFDUEkgdGFibGVzIHRvIGRlY29kZSB2YWxpZCBmcmVxdWVuY3kvdm9sdGFnZSAoZGVwcmVjYXRlZCkiCiAJZGVwZW5kcyBvbiBYODZfU1BFRURTVEVQX0NFTlRSSU5PICYmIEFDUElfUFJPQ0VTU09SCiAJZGVwZW5kcyBvbiAhKFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk8gPSB5ICYmIEFDUElfUFJPQ0VTU09SID0gbSkKIAlkZWZhdWx0IHkKIAloZWxwCisJICBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3cgbWVyZ2VkIGludG8KKwkgIGFjcGlfY3B1ZnJlcSAoWDg2X0FDUElfQ1BVRlJFUSkuIFVzZSB0aGF0IGRyaXZlciBpbnN0ZWFkIG9mCisJICBzcGVlZHN0ZXBfY2VudHJpbm8uCiAJICBVc2UgcHJpbWFyaWx5IHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgQklPUyBBQ1BJIHRhYmxlcwogCSAgdG8gZGV0ZXJtaW5lIHZhbGlkIENQVSBmcmVxdWVuY3kgYW5kIHZvbHRhZ2UgcGFpcmluZ3MuIEl0IGlzCiAJICByZXF1aXJlZCBmb3IgdGhlIGRyaXZlciB0byB3b3JrIG9uIG5vbi1CYW5pYXMgQ1BVcy4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCmluZGV4IDJlODk0ZjEuLjhkZTNhYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQpAQCAtNyw5ICs3LDkgQEAKIG9iai0kKENPTkZJR19YODZfTE9OR1JVTikJCSs9IGxvbmdydW4ubyAgCiBvYmotJChDT05GSUdfWDg2X0dYX1NVU1BNT0QpCQkrPSBneC1zdXNwbW9kLm8KIG9iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0lDSCkJCSs9IHNwZWVkc3RlcC1pY2gubwotb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk8pCSs9IHNwZWVkc3RlcC1jZW50cmluby5vCiBvYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9MSUIpCQkrPSBzcGVlZHN0ZXAtbGliLm8KIG9iai0kKENPTkZJR19YODZfU1BFRURTVEVQX1NNSSkJCSs9IHNwZWVkc3RlcC1zbWkubwogb2JqLSQoQ09ORklHX1g4Nl9BQ1BJX0NQVUZSRVEpCQkrPSBhY3BpLWNwdWZyZXEubworb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk8pCSs9IHNwZWVkc3RlcC1jZW50cmluby5vCiBvYmotJChDT05GSUdfWDg2X1A0X0NMT0NLTU9EKQkJKz0gcDQtY2xvY2ttb2Qubwogb2JqLSQoQ09ORklHX1g4Nl9DUFVGUkVRX05GT1JDRTIpCSs9IGNwdWZyZXEtbmZvcmNlMi5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCA1N2M4ODBiLi4xOGY0NzE1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTEsOSArMSwxMCBAQAogLyoKLSAqIGFjcGktY3B1ZnJlcS5jIC0gQUNQSSBQcm9jZXNzb3IgUC1TdGF0ZXMgRHJpdmVyICgkUmV2aXNpb246IDEuMyAkKQorICogYWNwaS1jcHVmcmVxLmMgLSBBQ1BJIFByb2Nlc3NvciBQLVN0YXRlcyBEcml2ZXIgKCRSZXZpc2lvbjogMS40ICQpCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBBbmR5IEdyb3ZlciA8YW5kcmV3Lmdyb3ZlckBpbnRlbC5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFBhdWwgRGllZmVuYmF1Z2ggPHBhdWwucy5kaWVmZW5iYXVnaEBpbnRlbC5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNCBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICAgICAgIERlbmlzIFNhZHlrb3YgPGRlbmlzLm0uc2FkeWtvdkBpbnRlbC5jb20+CiAgKgogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqCkBAIC0yNywyMDIgKzI4LDM4NyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGN1cnJlbnQgKi8KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKwogI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJhY3BpLWNwdWZyZXEiLCBtc2cpCiAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2gsIERvbWluaWsgQnJvZG93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgUHJvY2Vzc29yIFAtU3RhdGVzIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0KLXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gewotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQkqYWNwaV9kYXRhOwotCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZQkJKmZyZXFfdGFibGU7Ci0JdW5zaWduZWQgaW50CQkJCXJlc3VtZTsKK2VudW0geworCVVOREVGSU5FRF9DQVBBQkxFID0gMCwKKwlTWVNURU1fSU5URUxfTVNSX0NBUEFCTEUsCisJU1lTVEVNX0lPX0NBUEFCTEUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqYWNwaV9pb19kYXRhW05SX0NQVVNdOwotc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQkqYWNwaV9wZXJmX2RhdGFbTlJfQ1BVU107CisjZGVmaW5lIElOVEVMX01TUl9SQU5HRQkJKDB4ZmZmZikKKyNkZWZpbmUgQ1BVSURfNl9FQ1hfQVBFUkZNUEVSRl9DQVBBQklMSVRZCSgweDEpCisKK3N0cnVjdCBhY3BpX2NwdWZyZXFfZGF0YSB7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICphY3BpX2RhdGE7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlOworCXVuc2lnbmVkIGludCBtYXhfZnJlcTsKKwl1bnNpZ25lZCBpbnQgcmVzdW1lOworCXVuc2lnbmVkIGludCBjcHVfZmVhdHVyZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRydl9kYXRhW05SX0NQVVNdOworc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqYWNwaV9wZXJmX2RhdGFbTlJfQ1BVU107CiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgYWNwaV9jcHVmcmVxX2RyaXZlcjsKIAogc3RhdGljIHVuc2lnbmVkIGludCBhY3BpX3BzdGF0ZV9zdHJpY3Q7CiAKLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX3dyaXRlX3BvcnQoCi0JdTE2CXBvcnQsCi0JdTgJYml0X3dpZHRoLAotCXUzMgl2YWx1ZSkKK3N0YXRpYyBpbnQgY2hlY2tfZXN0X2NwdSh1bnNpZ25lZCBpbnQgY3B1aWQpCiB7Ci0JaWYgKGJpdF93aWR0aCA8PSA4KSB7Ci0JCW91dGIodmFsdWUsIHBvcnQpOwotCX0gZWxzZSBpZiAoYml0X3dpZHRoIDw9IDE2KSB7Ci0JCW91dHcodmFsdWUsIHBvcnQpOwotCX0gZWxzZSBpZiAoYml0X3dpZHRoIDw9IDMyKSB7Ci0JCW91dGwodmFsdWUsIHBvcnQpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRU5PREVWOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqY3B1ID0gJmNwdV9kYXRhW2NwdWlkXTsKKworCWlmIChjcHUtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fAorCSAgICAhY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBleHRyYWN0X2lvKHUzMiB2YWx1ZSwgc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqcGVyZjsKKwlpbnQgaTsKKworCXBlcmYgPSBkYXRhLT5hY3BpX2RhdGE7CisKKwlmb3IgKGk9MDsgaTxwZXJmLT5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCWlmICh2YWx1ZSA9PSBwZXJmLT5zdGF0ZXNbaV0uc3RhdHVzKQorCQkJcmV0dXJuIGRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5OwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotYWNwaV9wcm9jZXNzb3JfcmVhZF9wb3J0KAotCXUxNglwb3J0LAotCXU4CWJpdF93aWR0aCwKLQl1MzIJKnJldCkKK3N0YXRpYyB1bnNpZ25lZCBleHRyYWN0X21zcih1MzIgbXNyLCBzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmOworCisJbXNyICY9IElOVEVMX01TUl9SQU5HRTsKKwlwZXJmID0gZGF0YS0+YWNwaV9kYXRhOworCisJZm9yIChpPTA7IGRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EOyBpKyspIHsKKwkJaWYgKG1zciA9PSBwZXJmLT5zdGF0ZXNbZGF0YS0+ZnJlcV90YWJsZVtpXS5pbmRleF0uc3RhdHVzKQorCQkJcmV0dXJuIGRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5OworCX0KKwlyZXR1cm4gZGF0YS0+ZnJlcV90YWJsZVswXS5mcmVxdWVuY3k7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBleHRyYWN0X2ZyZXEodTMyIHZhbCwgc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhKQoreworCXN3aXRjaCAoZGF0YS0+Y3B1X2ZlYXR1cmUpIHsKKwljYXNlIFNZU1RFTV9JTlRFTF9NU1JfQ0FQQUJMRToKKwkJcmV0dXJuIGV4dHJhY3RfbXNyKHZhbCwgZGF0YSk7CisJY2FzZSBTWVNURU1fSU9fQ0FQQUJMRToKKwkJcmV0dXJuIGV4dHJhY3RfaW8odmFsLCBkYXRhKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdycG9ydCh1MTYgcG9ydCwgdTggYml0X3dpZHRoLCB1MzIgdmFsdWUpCit7CisJaWYgKGJpdF93aWR0aCA8PSA4KQorCQlvdXRiKHZhbHVlLCBwb3J0KTsKKwllbHNlIGlmIChiaXRfd2lkdGggPD0gMTYpCisJCW91dHcodmFsdWUsIHBvcnQpOworCWVsc2UgaWYgKGJpdF93aWR0aCA8PSAzMikKKwkJb3V0bCh2YWx1ZSwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHJkcG9ydCh1MTYgcG9ydCwgdTggYml0X3dpZHRoLCB1MzIgKiByZXQpCiB7CiAJKnJldCA9IDA7Ci0JaWYgKGJpdF93aWR0aCA8PSA4KSB7CisJaWYgKGJpdF93aWR0aCA8PSA4KQogCQkqcmV0ID0gaW5iKHBvcnQpOwotCX0gZWxzZSBpZiAoYml0X3dpZHRoIDw9IDE2KSB7CisJZWxzZSBpZiAoYml0X3dpZHRoIDw9IDE2KQogCQkqcmV0ID0gaW53KHBvcnQpOwotCX0gZWxzZSBpZiAoYml0X3dpZHRoIDw9IDMyKSB7CisJZWxzZSBpZiAoYml0X3dpZHRoIDw9IDMyKQogCQkqcmV0ID0gaW5sKHBvcnQpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRU5PREVWOworfQorCitzdHJ1Y3QgbXNyX2FkZHIgeworCXUzMiByZWc7Cit9OworCitzdHJ1Y3QgaW9fYWRkciB7CisJdTE2IHBvcnQ7CisJdTggYml0X3dpZHRoOworfTsKKwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IG1zcl9hZGRyIG1zcjsKKwlzdHJ1Y3QgaW9fYWRkciBpbzsKK30gZHJ2X2FkZHJfdW5pb247CisKK3N0cnVjdCBkcnZfY21kIHsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwljcHVtYXNrX3QgbWFzazsKKwlkcnZfYWRkcl91bmlvbiBhZGRyOworCXUzMiB2YWw7Cit9OworCitzdGF0aWMgdm9pZCBkb19kcnZfcmVhZChzdHJ1Y3QgZHJ2X2NtZCAqY21kKQoreworCXUzMiBoOworCisJc3dpdGNoIChjbWQtPnR5cGUpIHsKKwljYXNlIFNZU1RFTV9JTlRFTF9NU1JfQ0FQQUJMRToKKwkJcmRtc3IoY21kLT5hZGRyLm1zci5yZWcsIGNtZC0+dmFsLCBoKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNURU1fSU9fQ0FQQUJMRToKKwkJcmRwb3J0KGNtZC0+YWRkci5pby5wb3J0LCBjbWQtPmFkZHIuaW8uYml0X3dpZHRoLCAmY21kLT52YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2Rydl93cml0ZShzdHJ1Y3QgZHJ2X2NtZCAqY21kKQoreworCXUzMiBoID0gMDsKKworCXN3aXRjaCAoY21kLT50eXBlKSB7CisJY2FzZSBTWVNURU1fSU5URUxfTVNSX0NBUEFCTEU6CisJCXdybXNyKGNtZC0+YWRkci5tc3IucmVnLCBjbWQtPnZhbCwgaCk7CisJCWJyZWFrOworCWNhc2UgU1lTVEVNX0lPX0NBUEFCTEU6CisJCXdycG9ydChjbWQtPmFkZHIuaW8ucG9ydCwgY21kLT5hZGRyLmlvLmJpdF93aWR0aCwgY21kLT52YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRydl9yZWFkKHN0cnVjdCBkcnZfY21kICpjbWQpCit7CisJY3B1bWFza190IHNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJY21kLT52YWwgPSAwOworCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjbWQtPm1hc2spOworCWRvX2Rydl9yZWFkKGNtZCk7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKK30KKworc3RhdGljIHZvaWQgZHJ2X3dyaXRlKHN0cnVjdCBkcnZfY21kICpjbWQpCit7CisJY3B1bWFza190IHNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBjbWQtPm1hc2spIHsKKwkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShpKSk7CisJCWRvX2Rydl93cml0ZShjbWQpOworCX0KKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2F2ZWRfbWFzayk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdTMyIGdldF9jdXJfdmFsKGNwdW1hc2tfdCBtYXNrKQoreworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqcGVyZjsKKwlzdHJ1Y3QgZHJ2X2NtZCBjbWQ7CisKKwlpZiAodW5saWtlbHkoY3B1c19lbXB0eShtYXNrKSkpCisJCXJldHVybiAwOworCisJc3dpdGNoIChkcnZfZGF0YVtmaXJzdF9jcHUobWFzayldLT5jcHVfZmVhdHVyZSkgeworCWNhc2UgU1lTVEVNX0lOVEVMX01TUl9DQVBBQkxFOgorCQljbWQudHlwZSA9IFNZU1RFTV9JTlRFTF9NU1JfQ0FQQUJMRTsKKwkJY21kLmFkZHIubXNyLnJlZyA9IE1TUl9JQTMyX1BFUkZfU1RBVFVTOworCQlicmVhazsKKwljYXNlIFNZU1RFTV9JT19DQVBBQkxFOgorCQljbWQudHlwZSA9IFNZU1RFTV9JT19DQVBBQkxFOworCQlwZXJmID0gZHJ2X2RhdGFbZmlyc3RfY3B1KG1hc2spXS0+YWNwaV9kYXRhOworCQljbWQuYWRkci5pby5wb3J0ID0gcGVyZi0+Y29udHJvbF9yZWdpc3Rlci5hZGRyZXNzOworCQljbWQuYWRkci5pby5iaXRfd2lkdGggPSBwZXJmLT5jb250cm9sX3JlZ2lzdGVyLmJpdF93aWR0aDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJY21kLm1hc2sgPSBtYXNrOworCisJZHJ2X3JlYWQoJmNtZCk7CisKKwlkcHJpbnRrKCJnZXRfY3VyX3ZhbCA9ICV1XG4iLCBjbWQudmFsKTsKKworCXJldHVybiBjbWQudmFsOworfQorCisvKgorICogUmV0dXJuIHRoZSBtZWFzdXJlZCBhY3RpdmUgKEMwKSBmcmVxdWVuY3kgb24gdGhpcyBDUFUgc2luY2UgbGFzdCBjYWxsCisgKiB0byB0aGlzIGZ1bmN0aW9uLgorICogSW5wdXQ6IGNwdSBudW1iZXIKKyAqIFJldHVybjogQXZlcmFnZSBDUFUgZnJlcXVlbmN5IGluIHRlcm1zIG9mIG1heCBmcmVxdWVuY3kgKHplcm8gb24gZXJyb3IpCisgKgorICogV2UgdXNlIElBMzJfTVBFUkYgYW5kIElBMzJfQVBFUkYgTVNScyB0byBnZXQgdGhlIG1lYXN1cmVkIHBlcmZvcm1hbmNlCisgKiBvdmVyIGEgcGVyaW9kIG9mIHRpbWUsIHdoaWxlIENQVSBpcyBpbiBDMCBzdGF0ZS4KKyAqIElBMzJfTVBFUkYgY291bnRzIGF0IHRoZSByYXRlIG9mIG1heCBhZHZlcnRpc2VkIGZyZXF1ZW5jeQorICogSUEzMl9BUEVSRiBjb3VudHMgYXQgdGhlIHJhdGUgb2YgYWN0dWFsIENQVSBmcmVxdWVuY3kKKyAqIE9ubHkgSUEzMl9BUEVSRi9JQTMyX01QRVJGIHJhdGlvIGlzIGFyY2hpdGVjdHVyYWxseSBkZWZpbmVkIGFuZAorICogbm8gbWVhbmluZyBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGFic29sdXRlIHZhbHVlcyBvZiB0aGVzZSBNU1JzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9tZWFzdXJlZF9wZXJmKHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGxvOworCQkJdTMyIGhpOworCQl9IHNwbGl0OworCQl1NjQgd2hvbGU7CisJfSBhcGVyZl9jdXIsIG1wZXJmX2N1cjsKKworCWNwdW1hc2tfdCBzYXZlZF9tYXNrOworCXVuc2lnbmVkIGludCBwZXJmX3BlcmNlbnQ7CisJdW5zaWduZWQgaW50IHJldHZhbDsKKworCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlpZiAoZ2V0X2NwdSgpICE9IGNwdSkgeworCQkvKiBXZSB3ZXJlIG5vdCBhYmxlIHRvIHJ1biBvbiByZXF1ZXN0ZWQgcHJvY2Vzc29yICovCisJCXB1dF9jcHUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmRtc3IoTVNSX0lBMzJfQVBFUkYsIGFwZXJmX2N1ci5zcGxpdC5sbywgYXBlcmZfY3VyLnNwbGl0LmhpKTsKKwlyZG1zcihNU1JfSUEzMl9NUEVSRiwgbXBlcmZfY3VyLnNwbGl0LmxvLCBtcGVyZl9jdXIuc3BsaXQuaGkpOworCisJd3Jtc3IoTVNSX0lBMzJfQVBFUkYsIDAsMCk7CisJd3Jtc3IoTVNSX0lBMzJfTVBFUkYsIDAsMCk7CisKKyNpZmRlZiBfX2kzODZfXworCS8qCisJICogV2UgZG9udCB3YW50IHRvIGRvIDY0IGJpdCBkaXZpZGUgd2l0aCAzMiBiaXQga2VybmVsCisJICogR2V0IGFuIGFwcHJveGltYXRlIHZhbHVlLiBSZXR1cm4gZmFpbHVyZSBpbiBjYXNlIHdlIGNhbm5vdCBnZXQKKwkgKiBhbiBhcHByb3hpbWF0ZSB2YWx1ZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoYXBlcmZfY3VyLnNwbGl0LmhpIHx8IG1wZXJmX2N1ci5zcGxpdC5oaSkpIHsKKwkJaW50IHNoaWZ0X2NvdW50OworCQl1MzIgaDsKKworCQloID0gbWF4X3QodTMyLCBhcGVyZl9jdXIuc3BsaXQuaGksIG1wZXJmX2N1ci5zcGxpdC5oaSk7CisJCXNoaWZ0X2NvdW50ID0gZmxzKGgpOworCisJCWFwZXJmX2N1ci53aG9sZSA+Pj0gc2hpZnRfY291bnQ7CisJCW1wZXJmX2N1ci53aG9sZSA+Pj0gc2hpZnRfY291bnQ7CisJfQorCisJaWYgKCgodW5zaWduZWQgbG9uZykoLTEpIC8gMTAwKSA8IGFwZXJmX2N1ci5zcGxpdC5sbykgeworCQlpbnQgc2hpZnRfY291bnQgPSA3OworCQlhcGVyZl9jdXIuc3BsaXQubG8gPj49IHNoaWZ0X2NvdW50OworCQltcGVyZl9jdXIuc3BsaXQubG8gPj49IHNoaWZ0X2NvdW50OworCX0KKworCWlmIChhcGVyZl9jdXIuc3BsaXQubG8gJiYgbXBlcmZfY3VyLnNwbGl0LmxvKQorCQlwZXJmX3BlcmNlbnQgPSAoYXBlcmZfY3VyLnNwbGl0LmxvICogMTAwKSAvIG1wZXJmX2N1ci5zcGxpdC5sbzsKKwllbHNlCisJCXBlcmZfcGVyY2VudCA9IDA7CisKKyNlbHNlCisJaWYgKHVubGlrZWx5KCgodW5zaWduZWQgbG9uZykoLTEpIC8gMTAwKSA8IGFwZXJmX2N1ci53aG9sZSkpIHsKKwkJaW50IHNoaWZ0X2NvdW50ID0gNzsKKwkJYXBlcmZfY3VyLndob2xlID4+PSBzaGlmdF9jb3VudDsKKwkJbXBlcmZfY3VyLndob2xlID4+PSBzaGlmdF9jb3VudDsKKwl9CisKKwlpZiAoYXBlcmZfY3VyLndob2xlICYmIG1wZXJmX2N1ci53aG9sZSkKKwkJcGVyZl9wZXJjZW50ID0gKGFwZXJmX2N1ci53aG9sZSAqIDEwMCkgLyBtcGVyZl9jdXIud2hvbGU7CisJZWxzZQorCQlwZXJmX3BlcmNlbnQgPSAwOworCisjZW5kaWYKKworCXJldHZhbCA9IGRydl9kYXRhW2NwdV0tPm1heF9mcmVxICogcGVyZl9wZXJjZW50IC8gMTAwOworCisJcHV0X2NwdSgpOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2F2ZWRfbWFzayk7CisKKwlkcHJpbnRrKCJjcHUgJWQ6IHBlcmZvcm1hbmNlIHBlcmNlbnQgJWRcbiIsIGNwdSwgcGVyZl9wZXJjZW50KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9jdXJfZnJlcV9vbl9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRhdGEgPSBkcnZfZGF0YVtjcHVdOworCXVuc2lnbmVkIGludCBmcmVxOworCisJZHByaW50aygiZ2V0X2N1cl9mcmVxX29uX2NwdSAoJWQpXG4iLCBjcHUpOworCisJaWYgKHVubGlrZWx5KGRhdGEgPT0gTlVMTCB8fAorCQkgICAgIGRhdGEtPmFjcGlfZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmZyZXFfdGFibGUgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJZnJlcSA9IGV4dHJhY3RfZnJlcShnZXRfY3VyX3ZhbChjcHVtYXNrX29mX2NwdShjcHUpKSwgZGF0YSk7CisJZHByaW50aygiY3VyIGZyZXEgPSAldVxuIiwgZnJlcSk7CisKKwlyZXR1cm4gZnJlcTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjaGVja19mcmVxcyhjcHVtYXNrX3QgbWFzaywgdW5zaWduZWQgaW50IGZyZXEsCisJCQkJc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjdXJfZnJlcTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaT0wOyBpPDEwMDsgaSsrKSB7CisJCWN1cl9mcmVxID0gZXh0cmFjdF9mcmVxKGdldF9jdXJfdmFsKG1hc2spLCBkYXRhKTsKKwkJaWYgKGN1cl9mcmVxID09IGZyZXEpCisJCQlyZXR1cm4gMTsKKwkJdWRlbGF5KDEwKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfcHJvY2Vzc29yX3NldF9wZXJmb3JtYW5jZSAoCi0Jc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqZGF0YSwKLQl1bnNpZ25lZCBpbnQJCWNwdSwKLQlpbnQJCQlzdGF0ZSkKK3N0YXRpYyBpbnQgYWNwaV9jcHVmcmVxX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsIHVuc2lnbmVkIGludCByZWxhdGlvbikKIHsKLQl1MTYJCQlwb3J0ID0gMDsKLQl1OAkJCWJpdF93aWR0aCA9IDA7Ci0JaW50CQkJaSA9IDA7Ci0JaW50CQkJcmV0ID0gMDsKLQl1MzIJCQl2YWx1ZSA9IDA7Ci0JaW50CQkJcmV0dmFsOwotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQkqcGVyZjsKLQotCWRwcmludGsoImFjcGlfcHJvY2Vzc29yX3NldF9wZXJmb3JtYW5jZVxuIik7Ci0KLQlyZXR2YWwgPSAwOwotCXBlcmYgPSBkYXRhLT5hY3BpX2RhdGE7CQotCWlmIChzdGF0ZSA9PSBwZXJmLT5zdGF0ZSkgewotCQlpZiAodW5saWtlbHkoZGF0YS0+cmVzdW1lKSkgewotCQkJZHByaW50aygiQ2FsbGVkIGFmdGVyIHJlc3VtZSwgcmVzZXR0aW5nIHRvIFAlZFxuIiwgc3RhdGUpOwotCQkJZGF0YS0+cmVzdW1lID0gMDsKLQkJfSBlbHNlIHsKLQkJCWRwcmludGsoIkFscmVhZHkgYXQgdGFyZ2V0IHN0YXRlIChQJWQpXG4iLCBzdGF0ZSk7Ci0JCQlyZXR1cm4gKHJldHZhbCk7Ci0JCX0KLQl9Ci0KLQlkcHJpbnRrKCJUcmFuc2l0aW9uaW5nIGZyb20gUCVkIHRvIFAlZFxuIiwgcGVyZi0+c3RhdGUsIHN0YXRlKTsKLQotCS8qCi0JICogRmlyc3Qgd2Ugd3JpdGUgdGhlIHRhcmdldCBzdGF0ZSdzICdjb250cm9sJyB2YWx1ZSB0byB0aGUKLQkgKiBjb250cm9sX3JlZ2lzdGVyLgotCSAqLwotCi0JcG9ydCA9IHBlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuYWRkcmVzczsKLQliaXRfd2lkdGggPSBwZXJmLT5jb250cm9sX3JlZ2lzdGVyLmJpdF93aWR0aDsKLQl2YWx1ZSA9ICh1MzIpIHBlcmYtPnN0YXRlc1tzdGF0ZV0uY29udHJvbDsKLQotCWRwcmludGsoIldyaXRpbmcgMHglMDh4IHRvIHBvcnQgMHglMDR4XG4iLCB2YWx1ZSwgcG9ydCk7Ci0KLQlyZXQgPSBhY3BpX3Byb2Nlc3Nvcl93cml0ZV9wb3J0KHBvcnQsIGJpdF93aWR0aCwgdmFsdWUpOwotCWlmIChyZXQpIHsKLQkJZHByaW50aygiSW52YWxpZCBwb3J0IHdpZHRoIDB4JTA0eFxuIiwgYml0X3dpZHRoKTsKLQkJcmV0dXJuIChyZXQpOwotCX0KLQotCS8qCi0JICogQXNzdW1lIHRoZSB3cml0ZSB3ZW50IHRocm91Z2ggd2hlbiBhY3BpX3BzdGF0ZV9zdHJpY3QgaXMgbm90IHVzZWQuCi0JICogQXMgcmVhZCBzdGF0dXNfcmVnaXN0ZXIgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiBhbmQgdGhlcmUgCi0JICogYXJlIG5vIHNwZWNpZmljIGVycm9yIGNhc2VzIHdoZXJlIGFuIElPIHBvcnQgd3JpdGUgd2lsbCBmYWlsLgotCSAqLwotCWlmIChhY3BpX3BzdGF0ZV9zdHJpY3QpIHsKLQkJLyogVGhlbiB3ZSByZWFkIHRoZSAnc3RhdHVzX3JlZ2lzdGVyJyBhbmQgY29tcGFyZSB0aGUgdmFsdWUgCi0JCSAqIHdpdGggdGhlIHRhcmdldCBzdGF0ZSdzICdzdGF0dXMnIHRvIG1ha2Ugc3VyZSB0aGUgCi0JCSAqIHRyYW5zaXRpb24gd2FzIHN1Y2Nlc3NmdWwuCi0JCSAqIE5vdGUgdGhhdCB3ZSdsbCBwb2xsIGZvciB1cCB0byAxbXMgKDEwMCBjeWNsZXMgb2YgMTB1cykgCi0JCSAqIGJlZm9yZSBnaXZpbmcgdXAuCi0JCSAqLwotCi0JCXBvcnQgPSBwZXJmLT5zdGF0dXNfcmVnaXN0ZXIuYWRkcmVzczsKLQkJYml0X3dpZHRoID0gcGVyZi0+c3RhdHVzX3JlZ2lzdGVyLmJpdF93aWR0aDsKLQotCQlkcHJpbnRrKCJMb29raW5nIGZvciAweCUwOHggZnJvbSBwb3J0IDB4JTA0eFxuIiwKLQkJCSh1MzIpIHBlcmYtPnN0YXRlc1tzdGF0ZV0uc3RhdHVzLCBwb3J0KTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJCXJldCA9IGFjcGlfcHJvY2Vzc29yX3JlYWRfcG9ydChwb3J0LCBiaXRfd2lkdGgsICZ2YWx1ZSk7Ci0JCQlpZiAocmV0KSB7CQotCQkJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7Ci0JCQkJcmV0dXJuIChyZXQpOwotCQkJfQotCQkJaWYgKHZhbHVlID09ICh1MzIpIHBlcmYtPnN0YXRlc1tzdGF0ZV0uc3RhdHVzKQotCQkJCWJyZWFrOwotCQkJdWRlbGF5KDEwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXZhbHVlID0gKHUzMikgcGVyZi0+c3RhdGVzW3N0YXRlXS5zdGF0dXM7Ci0JfQotCi0JaWYgKHVubGlrZWx5KHZhbHVlICE9ICh1MzIpIHBlcmYtPnN0YXRlc1tzdGF0ZV0uc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhY3BpLWNwdWZyZXE6IFRyYW5zaXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dmFsID0gLUVOT0RFVjsKLQkJcmV0dXJuIChyZXR2YWwpOwotCX0KLQotCWRwcmludGsoIlRyYW5zaXRpb24gc3VjY2Vzc2Z1bCBhZnRlciAlZCBtaWNyb3NlY29uZHNcbiIsIGkgKiAxMCk7Ci0KLQlwZXJmLT5zdGF0ZSA9IHN0YXRlOwotCXJldHVybiAocmV0dmFsKTsKLX0KLQotCi1zdGF0aWMgaW50Ci1hY3BpX2NwdWZyZXFfdGFyZ2V0ICgKLQlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5LAotCXVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKLQl1bnNpZ25lZCBpbnQgcmVsYXRpb24pCi17Ci0Jc3RydWN0IGNwdWZyZXFfYWNwaV9pbyAqZGF0YSA9IGFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV07CisJc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gZHJ2X2RhdGFbcG9saWN5LT5jcHVdOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqcGVyZjsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKIAljcHVtYXNrX3Qgb25saW5lX3BvbGljeV9jcHVzOwotCWNwdW1hc2tfdCBzYXZlZF9tYXNrOwotCWNwdW1hc2tfdCBzZXRfbWFzazsKLQljcHVtYXNrX3QgY292ZXJlZF9jcHVzOwotCXVuc2lnbmVkIGludCBjdXJfc3RhdGUgPSAwOworCXN0cnVjdCBkcnZfY21kIGNtZDsKKwl1bnNpZ25lZCBpbnQgbXNyOwogCXVuc2lnbmVkIGludCBuZXh0X3N0YXRlID0gMDsKLQl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgajsKLQl1bnNpZ25lZCBpbnQgdG1wOworCXVuc2lnbmVkIGludCBuZXh0X3BlcmZfc3RhdGUgPSAwOworCXVuc2lnbmVkIGludCBpOworCWludCByZXN1bHQgPSAwOwogCi0JZHByaW50aygiYWNwaV9jcHVmcmVxX3NldHBvbGljeVxuIik7CisJZHByaW50aygiYWNwaV9jcHVmcmVxX3RhcmdldCAlZCAoJWQpXG4iLCB0YXJnZXRfZnJlcSwgcG9saWN5LT5jcHUpOwogCi0JcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwKLQkJCWRhdGEtPmZyZXFfdGFibGUsCi0JCQl0YXJnZXRfZnJlcSwKLQkJCXJlbGF0aW9uLAotCQkJJm5leHRfc3RhdGUpOwotCWlmICh1bmxpa2VseShyZXN1bHQpKQotCQlyZXR1cm4gKHJlc3VsdCk7CisJaWYgKHVubGlrZWx5KGRhdGEgPT0gTlVMTCB8fAorCSAgICAgZGF0YS0+YWNwaV9kYXRhID09IE5VTEwgfHwgZGF0YS0+ZnJlcV90YWJsZSA9PSBOVUxMKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlwZXJmID0gZGF0YS0+YWNwaV9kYXRhOwotCWN1cl9zdGF0ZSA9IHBlcmYtPnN0YXRlOwotCWZyZXFzLm9sZCA9IGRhdGEtPmZyZXFfdGFibGVbY3VyX3N0YXRlXS5mcmVxdWVuY3k7Ci0JZnJlcXMubmV3ID0gZGF0YS0+ZnJlcV90YWJsZVtuZXh0X3N0YXRlXS5mcmVxdWVuY3k7CisJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwKKwkJCQkJCWRhdGEtPmZyZXFfdGFibGUsCisJCQkJCQl0YXJnZXRfZnJlcSwKKwkJCQkJCXJlbGF0aW9uLCAmbmV4dF9zdGF0ZSk7CisJaWYgKHVubGlrZWx5KHJlc3VsdCkpCisJCXJldHVybiAtRU5PREVWOwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJLyogY3B1ZnJlcSBob2xkcyB0aGUgaG90cGx1ZyBsb2NrLCBzbyB3ZSBhcmUgc2FmZSBmcm9tIGhlcmUgb24gKi8KQEAgLTIzMSwxMDYgKzQxNyw4NCBAQAogCW9ubGluZV9wb2xpY3lfY3B1cyA9IHBvbGljeS0+Y3B1czsKICNlbmRpZgogCi0JZm9yX2VhY2hfY3B1X21hc2soaiwgb25saW5lX3BvbGljeV9jcHVzKSB7Ci0JCWZyZXFzLmNwdSA9IGo7CisJbmV4dF9wZXJmX3N0YXRlID0gZGF0YS0+ZnJlcV90YWJsZVtuZXh0X3N0YXRlXS5pbmRleDsKKwlpZiAocGVyZi0+c3RhdGUgPT0gbmV4dF9wZXJmX3N0YXRlKSB7CisJCWlmICh1bmxpa2VseShkYXRhLT5yZXN1bWUpKSB7CisJCQlkcHJpbnRrKCJDYWxsZWQgYWZ0ZXIgcmVzdW1lLCByZXNldHRpbmcgdG8gUCVkXG4iLAorCQkJCW5leHRfcGVyZl9zdGF0ZSk7CisJCQlkYXRhLT5yZXN1bWUgPSAwOworCQl9IGVsc2UgeworCQkJZHByaW50aygiQWxyZWFkeSBhdCB0YXJnZXQgc3RhdGUgKFAlZClcbiIsCisJCQkJbmV4dF9wZXJmX3N0YXRlKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc3dpdGNoIChkYXRhLT5jcHVfZmVhdHVyZSkgeworCWNhc2UgU1lTVEVNX0lOVEVMX01TUl9DQVBBQkxFOgorCQljbWQudHlwZSA9IFNZU1RFTV9JTlRFTF9NU1JfQ0FQQUJMRTsKKwkJY21kLmFkZHIubXNyLnJlZyA9IE1TUl9JQTMyX1BFUkZfQ1RMOworCQltc3IgPQorCQkgICAgKHUzMikgcGVyZi0+c3RhdGVzW25leHRfcGVyZl9zdGF0ZV0uCisJCSAgICBjb250cm9sICYgSU5URUxfTVNSX1JBTkdFOworCQljbWQudmFsID0gKGNtZC52YWwgJiB+SU5URUxfTVNSX1JBTkdFKSB8IG1zcjsKKwkJYnJlYWs7CisJY2FzZSBTWVNURU1fSU9fQ0FQQUJMRToKKwkJY21kLnR5cGUgPSBTWVNURU1fSU9fQ0FQQUJMRTsKKwkJY21kLmFkZHIuaW8ucG9ydCA9IHBlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuYWRkcmVzczsKKwkJY21kLmFkZHIuaW8uYml0X3dpZHRoID0gcGVyZi0+Y29udHJvbF9yZWdpc3Rlci5iaXRfd2lkdGg7CisJCWNtZC52YWwgPSAodTMyKSBwZXJmLT5zdGF0ZXNbbmV4dF9wZXJmX3N0YXRlXS5jb250cm9sOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljcHVzX2NsZWFyKGNtZC5tYXNrKTsKKworCWlmIChwb2xpY3ktPnNoYXJlZF90eXBlICE9IENQVUZSRVFfU0hBUkVEX1RZUEVfQU5ZKQorCQljbWQubWFzayA9IG9ubGluZV9wb2xpY3lfY3B1czsKKwllbHNlCisJCWNwdV9zZXQocG9saWN5LT5jcHUsIGNtZC5tYXNrKTsKKworCWZyZXFzLm9sZCA9IGRhdGEtPmZyZXFfdGFibGVbcGVyZi0+c3RhdGVdLmZyZXF1ZW5jeTsKKwlmcmVxcy5uZXcgPSBkYXRhLT5mcmVxX3RhYmxlW25leHRfcGVyZl9zdGF0ZV0uZnJlcXVlbmN5OworCWZvcl9lYWNoX2NwdV9tYXNrKGksIGNtZC5tYXNrKSB7CisJCWZyZXFzLmNwdSA9IGk7CiAJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CiAJfQogCi0JLyoKLQkgKiBXZSBuZWVkIHRvIGNhbGwgZHJpdmVyLT50YXJnZXQoKSBvbiBhbGwgb3IgYW55IENQVSBpbgotCSAqIHBvbGljeS0+Y3B1cywgZGVwZW5kaW5nIG9uIHBvbGljeS0+c2hhcmVkX3R5cGUuCi0JICovCi0Jc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQljcHVzX2NsZWFyKGNvdmVyZWRfY3B1cyk7Ci0JZm9yX2VhY2hfY3B1X21hc2soaiwgb25saW5lX3BvbGljeV9jcHVzKSB7Ci0JCS8qCi0JCSAqIFN1cHBvcnQgZm9yIFNNUCBzeXN0ZW1zLgotCQkgKiBNYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgb24gQ1BVIHRoYXQgd2FudHMgdG8gY2hhbmdlIGZyZXEKLQkJICovCi0JCWNwdXNfY2xlYXIoc2V0X21hc2spOwotCQlpZiAocG9saWN5LT5zaGFyZWRfdHlwZSA9PSBDUFVGUkVRX1NIQVJFRF9UWVBFX0FOWSkKLQkJCWNwdXNfb3Ioc2V0X21hc2ssIHNldF9tYXNrLCBvbmxpbmVfcG9saWN5X2NwdXMpOwotCQllbHNlCi0JCQljcHVfc2V0KGosIHNldF9tYXNrKTsKKwlkcnZfd3JpdGUoJmNtZCk7CiAKLQkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzZXRfbWFzayk7Ci0JCWlmICh1bmxpa2VseSghY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgc2V0X21hc2spKSkgewotCQkJZHByaW50aygiY291bGRuJ3QgbGltaXQgdG8gQ1BVcyBpbiB0aGlzIGRvbWFpblxuIik7Ci0JCQlyZXN1bHQgPSAtRUFHQUlOOwotCQkJYnJlYWs7CisJaWYgKGFjcGlfcHN0YXRlX3N0cmljdCkgeworCQlpZiAoIWNoZWNrX2ZyZXFzKGNtZC5tYXNrLCBmcmVxcy5uZXcsIGRhdGEpKSB7CisJCQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfdGFyZ2V0IGZhaWxlZCAoJWQpXG4iLAorCQkJCXBvbGljeS0+Y3B1KTsKKwkJCXJldHVybiAtRUFHQUlOOwogCQl9Ci0KLQkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc2V0X3BlcmZvcm1hbmNlIChkYXRhLCBqLCBuZXh0X3N0YXRlKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJcmVzdWx0ID0gLUVBR0FJTjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHBvbGljeS0+c2hhcmVkX3R5cGUgPT0gQ1BVRlJFUV9TSEFSRURfVFlQRV9BTlkpCi0JCQlicmVhazsKLSAKLQkJY3B1X3NldChqLCBjb3ZlcmVkX2NwdXMpOwogCX0KIAotCWZvcl9lYWNoX2NwdV9tYXNrKGosIG9ubGluZV9wb2xpY3lfY3B1cykgewotCQlmcmVxcy5jcHUgPSBqOworCWZvcl9lYWNoX2NwdV9tYXNrKGksIGNtZC5tYXNrKSB7CisJCWZyZXFzLmNwdSA9IGk7CiAJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwogCX0KKwlwZXJmLT5zdGF0ZSA9IG5leHRfcGVyZl9zdGF0ZTsKIAotCWlmICh1bmxpa2VseShyZXN1bHQpKSB7Ci0JCS8qCi0JCSAqIFdlIGhhdmUgZmFpbGVkIGhhbGZ3YXkgdGhyb3VnaCB0aGUgZnJlcXVlbmN5IGNoYW5nZS4KLQkJICogV2UgaGF2ZSBzZW50IGNhbGxiYWNrcyB0byBvbmxpbmVfcG9saWN5X2NwdXMgYW5kCi0JCSAqIGFjcGlfcHJvY2Vzc29yX3NldF9wZXJmb3JtYW5jZSgpIGhhcyBiZWVuIGNhbGxlZCBvbiAKLQkJICogY292ZXJkX2NwdXMuIEJlc3QgZWZmb3J0IHVuZG8uLgotCQkgKi8KLQotCQlpZiAoIWNwdXNfZW1wdHkoY292ZXJlZF9jcHVzKSkgewotCQkJZm9yX2VhY2hfY3B1X21hc2soaiwgY292ZXJlZF9jcHVzKSB7Ci0JCQkJcG9saWN5LT5jcHUgPSBqOwotCQkJCWFjcGlfcHJvY2Vzc29yX3NldF9wZXJmb3JtYW5jZSAoZGF0YSwgCi0JCQkJCQlqLCAKLQkJCQkJCWN1cl9zdGF0ZSk7Ci0JCQl9Ci0JCX0KLQotCQl0bXAgPSBmcmVxcy5uZXc7Ci0JCWZyZXFzLm5ldyA9IGZyZXFzLm9sZDsKLQkJZnJlcXMub2xkID0gdG1wOwotCQlmb3JfZWFjaF9jcHVfbWFzayhqLCBvbmxpbmVfcG9saWN5X2NwdXMpIHsKLQkJCWZyZXFzLmNwdSA9IGo7Ci0JCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwotCQkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0JCX0KLQl9Ci0KLQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOwotCXJldHVybiAocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfY3B1ZnJlcV92ZXJpZnkgKAotCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAgICpwb2xpY3kpCitzdGF0aWMgaW50IGFjcGlfY3B1ZnJlcV92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0JdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IGNwdWZyZXFfYWNwaV9pbyAqZGF0YSA9IGFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV07CisJc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gZHJ2X2RhdGFbcG9saWN5LT5jcHVdOwogCiAJZHByaW50aygiYWNwaV9jcHVmcmVxX3ZlcmlmeVxuIik7CiAKLQlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCAKLQkJCWRhdGEtPmZyZXFfdGFibGUpOwotCi0JcmV0dXJuIChyZXN1bHQpOworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBkYXRhLT5mcmVxX3RhYmxlKTsKIH0KIAotCiBzdGF0aWMgdW5zaWduZWQgbG9uZwotYWNwaV9jcHVmcmVxX2d1ZXNzX2ZyZXEgKAotCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmRhdGEsCi0JdW5zaWduZWQgaW50CQljcHUpCithY3BpX2NwdWZyZXFfZ3Vlc3NfZnJlcShzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCSpwZXJmID0gZGF0YS0+YWNwaV9kYXRhOworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqcGVyZiA9IGRhdGEtPmFjcGlfZGF0YTsKIAogCWlmIChjcHVfa2h6KSB7CiAJCS8qIHNlYXJjaCB0aGUgY2xvc2VzdCBtYXRjaCB0byBjcHVfa2h6ICovCkBAIC0zMzgsMTYgKzUwMiwxNiBAQAogCQl1bnNpZ25lZCBsb25nIGZyZXE7CiAJCXVuc2lnbmVkIGxvbmcgZnJlcW4gPSBwZXJmLT5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwogCi0JCWZvciAoaSA9IDA7IGkgPCAocGVyZi0+c3RhdGVfY291bnQgLSAxKTsgaSsrKSB7CisJCWZvciAoaT0wOyBpPChwZXJmLT5zdGF0ZV9jb3VudC0xKTsgaSsrKSB7CiAJCQlmcmVxID0gZnJlcW47CiAJCQlmcmVxbiA9IHBlcmYtPnN0YXRlc1tpKzFdLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKIAkJCWlmICgoMiAqIGNwdV9raHopID4gKGZyZXFuICsgZnJlcSkpIHsKIAkJCQlwZXJmLT5zdGF0ZSA9IGk7Ci0JCQkJcmV0dXJuIChmcmVxKTsKKwkJCQlyZXR1cm4gZnJlcTsKIAkJCX0KIAkJfQotCQlwZXJmLT5zdGF0ZSA9IHBlcmYtPnN0YXRlX2NvdW50IC0gMTsKLQkJcmV0dXJuIChmcmVxbik7CisJCXBlcmYtPnN0YXRlID0gcGVyZi0+c3RhdGVfY291bnQtMTsKKwkJcmV0dXJuIGZyZXFuOwogCX0gZWxzZSB7CiAJCS8qIGFzc3VtZSBDUFUgaXMgYXQgUDAuLi4gKi8KIAkJcGVyZi0+c3RhdGUgPSAwOwpAQCAtMzU1LDcgKzUxOSw2IEBACiAJfQogfQogCi0KIC8qCiAgKiBhY3BpX2NwdWZyZXFfZWFybHlfaW5pdCAtIGluaXRpYWxpemUgQUNQSSBQLVN0YXRlcyBsaWJyYXJ5CiAgKgpAQCAtMzY0LDMwICs1MjcsMzQgQEAKICAqIGRvIF9QREMgYW5kIF9QU0QgYW5kIGZpbmQgb3V0IHRoZSBwcm9jZXNzb3IgZGVwZW5kZW5jeSBmb3IgdGhlCiAgKiBhY3R1YWwgaW5pdCB0aGF0IHdpbGwgaGFwcGVuIGxhdGVyLi4uCiAgKi8KLXN0YXRpYyBpbnQgYWNwaV9jcHVmcmVxX2Vhcmx5X2luaXRfYWNwaSh2b2lkKQorc3RhdGljIGludCBhY3BpX2NwdWZyZXFfZWFybHlfaW5pdCh2b2lkKQogewotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQkqZGF0YTsKLQl1bnNpZ25lZCBpbnQJCQkJaSwgajsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKmRhdGE7CisJY3B1bWFza190IGNvdmVyZWQ7CisJdW5zaWduZWQgaW50IGksIGo7CiAKIAlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfZWFybHlfaW5pdFxuIik7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlKSwgCi0JCQlHRlBfS0VSTkVMKTsKKwkJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGF0YSkgewotCQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKKwkJCWZvcl9lYWNoX2NwdV9tYXNrKGosIGNvdmVyZWQpIHsKIAkJCQlrZnJlZShhY3BpX3BlcmZfZGF0YVtqXSk7CiAJCQkJYWNwaV9wZXJmX2RhdGFbal0gPSBOVUxMOwogCQkJfQotCQkJcmV0dXJuICgtRU5PTUVNKTsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWFjcGlfcGVyZl9kYXRhW2ldID0gZGF0YTsKKwkJY3B1X3NldChpLCBjb3ZlcmVkKTsKIAl9CiAKIAkvKiBEbyBpbml0aWFsaXphdGlvbiBpbiBBQ1BJIGNvcmUgKi8KLQlyZXR1cm4gYWNwaV9wcm9jZXNzb3JfcHJlcmVnaXN0ZXJfcGVyZm9ybWFuY2UoYWNwaV9wZXJmX2RhdGEpOworCWFjcGlfcHJvY2Vzc29yX3ByZXJlZ2lzdGVyX3BlcmZvcm1hbmNlKGFjcGlfcGVyZl9kYXRhKTsKKwlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19TTVAKIC8qCiAgKiBTb21lIEJJT1NlcyBkbyBTV19BTlkgY29vcmRpbmF0aW9uIGludGVybmFsbHksIGVpdGhlciBzZXQgaXQgdXAgaW4gaHcKICAqIG9yIGRvIGl0IGluIEJJT1MgZmlybXdhcmUgYW5kIHdvbid0IGluZm9ybSBhYm91dCBpdCB0byBPUy4gSWYgbm90CkBAIC00MTQsMzkgKzU4MSw0MiBAQAogCX0sCiAJeyB9CiB9OworI2VuZGlmCiAKLXN0YXRpYyBpbnQKLWFjcGlfY3B1ZnJlcV9jcHVfaW5pdCAoCi0Jc3RydWN0IGNwdWZyZXFfcG9saWN5ICAgKnBvbGljeSkKK3N0YXRpYyBpbnQgYWNwaV9jcHVmcmVxX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewotCXVuc2lnbmVkIGludAkJaTsKLQl1bnNpZ25lZCBpbnQJCWNwdSA9IHBvbGljeS0+Y3B1OwotCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmRhdGE7Ci0JdW5zaWduZWQgaW50CQlyZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCB2YWxpZF9zdGF0ZXMgPSAwOworCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKwlzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhW3BvbGljeS0+Y3B1XTsKLQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UJKnBlcmY7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmOwogCiAJZHByaW50aygiYWNwaV9jcHVmcmVxX2NwdV9pbml0XG4iKTsKIAogCWlmICghYWNwaV9wZXJmX2RhdGFbY3B1XSkKLQkJcmV0dXJuICgtRU5PREVWKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwdWZyZXFfYWNwaV9pbyksIEdGUF9LRVJORUwpOworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9jcHVmcmVxX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCi0JCXJldHVybiAoLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVNOwogCiAJZGF0YS0+YWNwaV9kYXRhID0gYWNwaV9wZXJmX2RhdGFbY3B1XTsKLQlhY3BpX2lvX2RhdGFbY3B1XSA9IGRhdGE7CisJZHJ2X2RhdGFbY3B1XSA9IGRhdGE7CisKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKQorCQlhY3BpX2NwdWZyZXFfZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CiAKIAlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZShkYXRhLT5hY3BpX2RhdGEsIGNwdSk7Ci0KIAlpZiAocmVzdWx0KQogCQlnb3RvIGVycl9mcmVlOwogCiAJcGVyZiA9IGRhdGEtPmFjcGlfZGF0YTsKIAlwb2xpY3ktPnNoYXJlZF90eXBlID0gcGVyZi0+c2hhcmVkX3R5cGU7CisKIAkvKgotCSAqIFdpbGwgbGV0IHBvbGljeS0+Y3B1cyBrbm93IGFib3V0IGRlcGVuZGVuY3kgb25seSB3aGVuIHNvZnR3YXJlIAorCSAqIFdpbGwgbGV0IHBvbGljeS0+Y3B1cyBrbm93IGFib3V0IGRlcGVuZGVuY3kgb25seSB3aGVuIHNvZnR3YXJlCiAJICogY29vcmRpbmF0aW9uIGlzIHJlcXVpcmVkLgogCSAqLwogCWlmIChwb2xpY3ktPnNoYXJlZF90eXBlID09IENQVUZSRVFfU0hBUkVEX1RZUEVfQUxMIHx8CkBAIC00NjIsMTAgKzYzMiw2IEBACiAJfQogI2VuZGlmCiAKLQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKSB7Ci0JCWFjcGlfY3B1ZnJlcV9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKLQl9Ci0KIAkvKiBjYXBhYmlsaXR5IGNoZWNrICovCiAJaWYgKHBlcmYtPnN0YXRlX2NvdW50IDw9IDEpIHsKIAkJZHByaW50aygiTm8gUC1TdGF0ZXNcbiIpOwpAQCAtNDczLDE3ICs2MzksMzMgQEAKIAkJZ290byBlcnJfdW5yZWc7CiAJfQogCi0JaWYgKChwZXJmLT5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykgfHwKLQkgICAgKHBlcmYtPnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pKSB7Ci0JCWRwcmludGsoIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2UgWyVkLCAlZF1cbiIsCi0JCQkodTMyKSAocGVyZi0+Y29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCksCi0JCQkodTMyKSAocGVyZi0+c3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkKSk7CisJaWYgKHBlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gcGVyZi0+c3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkKSB7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX3VucmVnOwogCX0KIAotCS8qIGFsbG9jIGZyZXFfdGFibGUgKi8KLQlkYXRhLT5mcmVxX3RhYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqIChwZXJmLT5zdGF0ZV9jb3VudCArIDEpLCBHRlBfS0VSTkVMKTsKKwlzd2l0Y2ggKHBlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQpIHsKKwljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzoKKwkJZHByaW50aygiU1lTVEVNIElPIGFkZHIgc3BhY2VcbiIpOworCQlkYXRhLT5jcHVfZmVhdHVyZSA9IFNZU1RFTV9JT19DQVBBQkxFOworCQlicmVhazsKKwljYXNlIEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFOgorCQlkcHJpbnRrKCJIQVJEV0FSRSBhZGRyIHNwYWNlXG4iKTsKKwkJaWYgKCFjaGVja19lc3RfY3B1KGNwdSkpIHsKKwkJCXJlc3VsdCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl91bnJlZzsKKwkJfQorCQlkYXRhLT5jcHVfZmVhdHVyZSA9IFNZU1RFTV9JTlRFTF9NU1JfQ0FQQUJMRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHByaW50aygiVW5rbm93biBhZGRyIHNwYWNlICVkXG4iLAorCQkJKHUzMikgKHBlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5yZWc7CisJfQorCisJZGF0YS0+ZnJlcV90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkgKgorCQkgICAgKHBlcmYtPnN0YXRlX2NvdW50KzEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEtPmZyZXFfdGFibGUpIHsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5yZWc7CkBAIC00OTIsMTI5ICs2NzQsMTQwIEBACiAJLyogZGV0ZWN0IHRyYW5zaXRpb24gbGF0ZW5jeSAqLwogCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAwOwogCWZvciAoaT0wOyBpPHBlcmYtPnN0YXRlX2NvdW50OyBpKyspIHsKLQkJaWYgKChwZXJmLT5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwMCkgPiBwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5KQotCQkJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IHBlcmYtPnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kgKiAxMDAwOworCQlpZiAoKHBlcmYtPnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kgKiAxMDAwKSA+CisJCSAgICBwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5KQorCQkJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9CisJCQkgICAgcGVyZi0+c3RhdGVzW2ldLnRyYW5zaXRpb25fbGF0ZW5jeSAqIDEwMDA7CiAJfQogCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CiAKLQkvKiBUaGUgY3VycmVudCBzcGVlZCBpcyB1bmtub3duIGFuZCBub3QgZGV0ZWN0YWJsZSBieSBBQ1BJLi4uICAqLwotCXBvbGljeS0+Y3VyID0gYWNwaV9jcHVmcmVxX2d1ZXNzX2ZyZXEoZGF0YSwgcG9saWN5LT5jcHUpOwotCisJZGF0YS0+bWF4X2ZyZXEgPSBwZXJmLT5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwogCS8qIHRhYmxlIGluaXQgKi8KLQlmb3IgKGk9MDsgaTw9cGVyZi0+c3RhdGVfY291bnQ7IGkrKykKLQl7Ci0JCWRhdGEtPmZyZXFfdGFibGVbaV0uaW5kZXggPSBpOwotCQlpZiAoaTxwZXJmLT5zdGF0ZV9jb3VudCkKLQkJCWRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gcGVyZi0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKLQkJZWxzZQotCQkJZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwlmb3IgKGk9MDsgaTxwZXJmLT5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCWlmIChpPjAgJiYgcGVyZi0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ID09CisJCSAgICBwZXJmLT5zdGF0ZXNbaS0xXS5jb3JlX2ZyZXF1ZW5jeSkKKwkJCWNvbnRpbnVlOworCisJCWRhdGEtPmZyZXFfdGFibGVbdmFsaWRfc3RhdGVzXS5pbmRleCA9IGk7CisJCWRhdGEtPmZyZXFfdGFibGVbdmFsaWRfc3RhdGVzXS5mcmVxdWVuY3kgPQorCQkgICAgcGVyZi0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwkJdmFsaWRfc3RhdGVzKys7CiAJfQorCWRhdGEtPmZyZXFfdGFibGVbdmFsaWRfc3RhdGVzXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKIAogCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBkYXRhLT5mcmVxX3RhYmxlKTsKLQlpZiAocmVzdWx0KSB7CisJaWYgKHJlc3VsdCkKIAkJZ290byBlcnJfZnJlcWZyZWU7CisKKwlzd2l0Y2ggKGRhdGEtPmNwdV9mZWF0dXJlKSB7CisJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU86CisJCS8qIEN1cnJlbnQgc3BlZWQgaXMgdW5rbm93biBhbmQgbm90IGRldGVjdGFibGUgYnkgSU8gcG9ydCAqLworCQlwb2xpY3ktPmN1ciA9IGFjcGlfY3B1ZnJlcV9ndWVzc19mcmVxKGRhdGEsIHBvbGljeS0+Y3B1KTsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRToKKwkJYWNwaV9jcHVmcmVxX2RyaXZlci5nZXQgPSBnZXRfY3VyX2ZyZXFfb25fY3B1OworCQlnZXRfY3VyX2ZyZXFfb25fY3B1KGNwdSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCS8qIG5vdGlmeSBCSU9TIHRoYXQgd2UgZXhpc3QgKi8KIAlhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKFRISVNfTU9EVUxFKTsKIAotCXByaW50ayhLRVJOX0lORk8gImFjcGktY3B1ZnJlcTogQ1BVJXUgLSBBQ1BJIHBlcmZvcm1hbmNlIG1hbmFnZW1lbnQgYWN0aXZhdGVkLlxuIiwKLQkgICAgICAgY3B1KTsKKwkvKiBDaGVjayBmb3IgQVBFUkYvTVBFUkYgc3VwcG9ydCBpbiBoYXJkd2FyZSAqLworCWlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwgJiYgYy0+Y3B1aWRfbGV2ZWwgPj0gNikgeworCQl1bnNpZ25lZCBpbnQgZWN4OworCQllY3ggPSBjcHVpZF9lY3goNik7CisJCWlmIChlY3ggJiBDUFVJRF82X0VDWF9BUEVSRk1QRVJGX0NBUEFCSUxJVFkpCisJCQlhY3BpX2NwdWZyZXFfZHJpdmVyLmdldGF2ZyA9IGdldF9tZWFzdXJlZF9wZXJmOworCX0KKworCWRwcmludGsoIkNQVSV1IC0gQUNQSSBwZXJmb3JtYW5jZSBtYW5hZ2VtZW50IGFjdGl2YXRlZC5cbiIsIGNwdSk7CiAJZm9yIChpID0gMDsgaSA8IHBlcmYtPnN0YXRlX2NvdW50OyBpKyspCiAJCWRwcmludGsoIiAgICAgJWNQJWQ6ICVkIE1IeiwgJWQgbVcsICVkIHVTXG4iLAotCQkJKGkgPT0gcGVyZi0+c3RhdGU/JyonOicgJyksIGksCisJCQkoaSA9PSBwZXJmLT5zdGF0ZSA/ICcqJyA6ICcgJyksIGksCiAJCQkodTMyKSBwZXJmLT5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3ksCiAJCQkodTMyKSBwZXJmLT5zdGF0ZXNbaV0ucG93ZXIsCiAJCQkodTMyKSBwZXJmLT5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5KTsKIAogCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGRhdGEtPmZyZXFfdGFibGUsIHBvbGljeS0+Y3B1KTsKLQkKKwogCS8qCiAJICogdGhlIGZpcnN0IGNhbGwgdG8gLT50YXJnZXQoKSBzaG91bGQgcmVzdWx0IGluIHVzIGFjdHVhbGx5CiAJICogd3JpdGluZyBzb21ldGhpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVycy4KIAkgKi8KIAlkYXRhLT5yZXN1bWUgPSAxOwotCQotCXJldHVybiAocmVzdWx0KTsKIAotIGVycl9mcmVxZnJlZToKKwlyZXR1cm4gcmVzdWx0OworCitlcnJfZnJlcWZyZWU6CiAJa2ZyZWUoZGF0YS0+ZnJlcV90YWJsZSk7Ci0gZXJyX3VucmVnOgorZXJyX3VucmVnOgogCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UocGVyZiwgY3B1KTsKLSBlcnJfZnJlZToKK2Vycl9mcmVlOgogCWtmcmVlKGRhdGEpOwotCWFjcGlfaW9fZGF0YVtjcHVdID0gTlVMTDsKKwlkcnZfZGF0YVtjcHVdID0gTlVMTDsKIAotCXJldHVybiAocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCi0KLXN0YXRpYyBpbnQKLWFjcGlfY3B1ZnJlcV9jcHVfZXhpdCAoCi0Jc3RydWN0IGNwdWZyZXFfcG9saWN5ICAgKnBvbGljeSkKK3N0YXRpYyBpbnQgYWNwaV9jcHVmcmVxX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewotCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEgPSBhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdOwotCisJc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gZHJ2X2RhdGFbcG9saWN5LT5jcHVdOwogCiAJZHByaW50aygiYWNwaV9jcHVmcmVxX2NwdV9leGl0XG4iKTsKIAogCWlmIChkYXRhKSB7CiAJCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKLQkJYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XSA9IE5VTEw7Ci0JCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoZGF0YS0+YWNwaV9kYXRhLCBwb2xpY3ktPmNwdSk7CisJCWRydl9kYXRhW3BvbGljeS0+Y3B1XSA9IE5VTEw7CisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoZGF0YS0+YWNwaV9kYXRhLAorCQkJCQkJICAgICAgcG9saWN5LT5jcHUpOwogCQlrZnJlZShkYXRhKTsKIAl9CiAKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1hY3BpX2NwdWZyZXFfcmVzdW1lICgKLQlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQorc3RhdGljIGludCBhY3BpX2NwdWZyZXFfcmVzdW1lKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewotCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEgPSBhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdOwotCisJc3RydWN0IGFjcGlfY3B1ZnJlcV9kYXRhICpkYXRhID0gZHJ2X2RhdGFbcG9saWN5LT5jcHVdOwogCiAJZHByaW50aygiYWNwaV9jcHVmcmVxX3Jlc3VtZVxuIik7CiAKIAlkYXRhLT5yZXN1bWUgPSAxOwogCi0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogYWNwaV9jcHVmcmVxX2F0dHJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyICphY3BpX2NwdWZyZXFfYXR0cltdID0gewogCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKIAlOVUxMLAogfTsKIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBhY3BpX2NwdWZyZXFfZHJpdmVyID0gewotCS52ZXJpZnkJPSBhY3BpX2NwdWZyZXFfdmVyaWZ5LAotCS50YXJnZXQJPSBhY3BpX2NwdWZyZXFfdGFyZ2V0LAotCS5pbml0CT0gYWNwaV9jcHVmcmVxX2NwdV9pbml0LAotCS5leGl0CT0gYWNwaV9jcHVmcmVxX2NwdV9leGl0LAotCS5yZXN1bWUJPSBhY3BpX2NwdWZyZXFfcmVzdW1lLAotCS5uYW1lCT0gImFjcGktY3B1ZnJlcSIsCi0JLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JLmF0dHIJPSBhY3BpX2NwdWZyZXFfYXR0ciwKKwkudmVyaWZ5ID0gYWNwaV9jcHVmcmVxX3ZlcmlmeSwKKwkudGFyZ2V0ID0gYWNwaV9jcHVmcmVxX3RhcmdldCwKKwkuaW5pdCA9IGFjcGlfY3B1ZnJlcV9jcHVfaW5pdCwKKwkuZXhpdCA9IGFjcGlfY3B1ZnJlcV9jcHVfZXhpdCwKKwkucmVzdW1lID0gYWNwaV9jcHVmcmVxX3Jlc3VtZSwKKwkubmFtZSA9ICJhY3BpLWNwdWZyZXEiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5hdHRyID0gYWNwaV9jcHVmcmVxX2F0dHIsCiB9OwogCi0KLXN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX2NwdWZyZXFfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfY3B1ZnJlcV9pbml0KHZvaWQpCiB7CiAJZHByaW50aygiYWNwaV9jcHVmcmVxX2luaXRcbiIpOwogCi0JYWNwaV9jcHVmcmVxX2Vhcmx5X2luaXRfYWNwaSgpOworCWFjcGlfY3B1ZnJlcV9lYXJseV9pbml0KCk7CiAKIAlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOwogfQogCi0KLXN0YXRpYyB2b2lkIF9fZXhpdAotYWNwaV9jcHVmcmVxX2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9jcHVmcmVxX2V4aXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQJaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfZXhpdFxuIik7CiAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2NwdWZyZXFfZHJpdmVyKTsKQEAgLTYyNyw3ICs4MjAsOSBAQAogfQogCiBtb2R1bGVfcGFyYW0oYWNwaV9wc3RhdGVfc3RyaWN0LCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoYWNwaV9wc3RhdGVfc3RyaWN0LCAidmFsdWUgMCBvciBub24temVyby4gbm9uLXplcm8gLT4gc3RyaWN0IEFDUEkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgZHVyaW5nIGZyZXF1ZW5jeSBjaGFuZ2VzLiIpOworTU9EVUxFX1BBUk1fREVTQyhhY3BpX3BzdGF0ZV9zdHJpY3QsCisJInZhbHVlIDAgb3Igbm9uLXplcm8uIG5vbi16ZXJvIC0+IHN0cmljdCBBQ1BJIGNoZWNrcyBhcmUgIgorCSJwZXJmb3JtZWQgZHVyaW5nIGZyZXF1ZW5jeSBjaGFuZ2VzLiIpOwogCiBsYXRlX2luaXRjYWxsKGFjcGlfY3B1ZnJlcV9pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfY3B1ZnJlcV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKaW5kZXggOTJhZmEzYi4uNjY2N2U5YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKQEAgLTQ0Nyw3ICs0NDcsNiBAQAogCWludCByZXQ7CiAJc3RydWN0IGd4ZnJlcV9wYXJhbXMgKnBhcmFtczsKIAlzdHJ1Y3QgcGNpX2RldiAqZ3hfcGNpOwotCXUzMiBjbGFzc19yZXY7CiAKIAkvKiBUZXN0IGlmIHdlIGhhdmUgdGhlIHJpZ2h0IGhhcmR3YXJlICovCiAJaWYgKChneF9wY2kgPSBneF9kZXRlY3RfY2hpcHNldCgpKSA9PSBOVUxMKQpAQCAtNDcyLDggKzQ3MSw3IEBACiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9QTUVSMiwgJihwYXJhbXMtPnBjaV9wbWVyMikpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmFtcy0+Y3M1NXgwLCBQQ0lfTU9ET04sICYocGFyYW1zLT5vbl9kdXJhdGlvbikpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmFtcy0+Y3M1NXgwLCBQQ0lfTU9ET0ZGLCAmKHBhcmFtcy0+b2ZmX2R1cmF0aW9uKSk7Ci0gICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwYXJhbXMtPmNzNTV4MCwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3NfcmV2KTsKLQlwYXJhbXMtPnBjaV9yZXYgPSBjbGFzc19yZXYgJiYgMHhmZjsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwYXJhbXMtPmNzNTV4MCwgUENJX1JFVklTSU9OX0lELCAmcGFyYW1zLT5wY2lfcmV2KTsKIAogCWlmICgocmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmd4X3N1c3Btb2RfZHJpdmVyKSkpIHsKIAkJa2ZyZWUocGFyYW1zKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwppbmRleCA3MjMzYWJlLi5jNTQ4ZGFhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCkBAIC00MTAsNyArNDEwLDcgQEAKIAkJCW1heG11bHQ9bG9uZ2hhdWxfZ2V0X2NwdV9tdWx0KCk7CiAKIAkJCS8qIFN0YXJ0aW5nIHdpdGggdGhlIDEuMkdIeiBwYXJ0cywgdGhlcmVzIGEgMjAwTUh6IGJ1cy4gKi8KLQkJCWlmICgoY3B1X2toei8xMDAwKSA+IDEyMDApCisJCQlpZiAoKGNwdV9raHovbWF4bXVsdCkgPiAxMzQwMCkKIAkJCQlmc2IgPSAyMDA7CiAJCQllbHNlCiAJCQkJZnNiID0gZWJsY3JfZnNiX3RhYmxlX3YyW2xvbmdoYXVsLmJpdHMuTWF4TUh6RlNCXTsKQEAgLTU4Myw2ICs1ODMsMTAgQEAKIAlpZiAoZGV2ID09IE5VTEwpIHsKIAkJcmVnID0gMHg3NjsKIAkJZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84NjJYXzAsIE5VTEwpOworCQkvKiBGaW5kIENONDAwIFYtTGluayBob3N0IGJyaWRnZSAqLworCQlpZiAoZGV2ID09IE5VTEwpCisJCQlkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsIDB4NzI1OSwgTlVMTCk7CisKIAl9CiAJaWYgKGRldiAhPSBOVUxMKSB7CiAJCS8qIEVuYWJsZSBhY2Nlc3MgdG8gcG9ydCAweDIyICovCkBAIC03MzQsNyArNzM4LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX2FjcGk6Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gQUNQSSBzdXBwb3J0LiBObyBWVDg2MDEgb3IgVlQ4NjIzIG5vcnRoYnJpZGdlLiBBYm9ydGluZy5cbiIpOworCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIEFDUEkgc3VwcG9ydC4gVW5zdXBwb3J0ZWQgbm9ydGhicmlkZ2UuIEFib3J0aW5nLlxuIik7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYwppbmRleCAzMDRkMmVhLi5iZWM1MDE3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCkBAIC0xNjMsMjkgKzE2MywyNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfcDRfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7Ci0JaWYgKChjLT54ODYgPT0gMHgwNikgJiYgKGMtPng4Nl9tb2RlbCA9PSAweDA5KSkgewotCQkvKiBQZW50aXVtIE0gKEJhbmlhcykgKi8KLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIldhcm5pbmc6IFBlbnRpdW0gTSBkZXRlY3RlZC4gIgotCQkgICAgICAgIlRoZSBzcGVlZHN0ZXBfY2VudHJpbm8gbW9kdWxlIG9mZmVycyB2b2x0YWdlIHNjYWxpbmciCi0JCSAgICAgICAiIGluIGFkZGl0aW9uIG9mIGZyZXF1ZW5jeSBzY2FsaW5nLiBZb3Ugc2hvdWxkIHVzZSAiCi0JCSAgICAgICAidGhhdCBpbnN0ZWFkIG9mIHA0LWNsb2NrbW9kLCBpZiBwb3NzaWJsZS5cbiIpOwotCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUE0pOwotCX0KLQotCWlmICgoYy0+eDg2ID09IDB4MDYpICYmIChjLT54ODZfbW9kZWwgPT0gMHgwRCkpIHsKLQkJLyogUGVudGl1bSBNIChEb3RoYW4pICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJXYXJuaW5nOiBQZW50aXVtIE0gZGV0ZWN0ZWQuICIKLQkJICAgICAgICJUaGUgc3BlZWRzdGVwX2NlbnRyaW5vIG1vZHVsZSBvZmZlcnMgdm9sdGFnZSBzY2FsaW5nIgotCQkgICAgICAgIiBpbiBhZGRpdGlvbiBvZiBmcmVxdWVuY3kgc2NhbGluZy4gWW91IHNob3VsZCB1c2UgIgotCQkgICAgICAgInRoYXQgaW5zdGVhZCBvZiBwNC1jbG9ja21vZCwgaWYgcG9zc2libGUuXG4iKTsKLQkJLyogb24gUC00cywgdGhlIFRTQyBydW5zIHdpdGggY29uc3RhbnQgZnJlcXVlbmN5IGluZGVwZW5kZW50IHdoZXRoZXIKLQkJICogdGhyb3R0bGluZyBpcyBhY3RpdmUgb3Igbm90LiAqLwotCQlwNGNsb2NrbW9kX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOwotCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUE0pOworCWlmIChjLT54ODYgPT0gMHgwNikgeworCQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIldhcm5pbmc6IEVTVC1jYXBhYmxlIENQVSBkZXRlY3RlZC4gIgorCQkJICAgICAgICJUaGUgYWNwaS1jcHVmcmVxIG1vZHVsZSBvZmZlcnMgdm9sdGFnZSBzY2FsaW5nIgorCQkJICAgICAgICIgaW4gYWRkaXRpb24gb2YgZnJlcXVlbmN5IHNjYWxpbmcuIFlvdSBzaG91bGQgdXNlICIKKwkJCSAgICAgICAidGhhdCBpbnN0ZWFkIG9mIHA0LWNsb2NrbW9kLCBpZiBwb3NzaWJsZS5cbiIpOworCQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgeworCQljYXNlIDB4MEU6IC8qIENvcmUgKi8KKwkJY2FzZSAweDBGOiAvKiBDb3JlIER1byAqLworCQkJcDRjbG9ja21vZF9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKKwkJCXJldHVybiBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koU1BFRURTVEVQX1BST0NFU1NPUl9QQ09SRSk7CisJCWNhc2UgMHgwRDogLyogUGVudGl1bSBNIChEb3RoYW4pICovCisJCQlwNGNsb2NrbW9kX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgMHgwOTogLyogUGVudGl1bSBNIChCYW5pYXMpICovCisJCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUE0pOworCQl9CiAJfQogCiAJaWYgKGMtPng4NiAhPSAweEYpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVua25vd24gcDQtY2xvY2ttb2QtY2FwYWJsZSBDUFUuIFBsZWFzZSBzZW5kIGFuIGUtbWFpbCB0byA8bGludXhAYnJvZG8uZGU+XG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVua25vd24gcDQtY2xvY2ttb2QtY2FwYWJsZSBDUFUuIFBsZWFzZSBzZW5kIGFuIGUtbWFpbCB0byA8Y3B1ZnJlcUBsaXN0cy5saW51eC5vcmcudWs+XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NjNTIwX2ZyZXEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc2M1MjBfZnJlcS5jCmluZGV4IGVmNDU3ZDUuLmI4ZmI0YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc2M1MjBfZnJlcS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc2M1MjBfZnJlcS5jCkBAIC0xNTMsNiArMTUzLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHNjNTIwX2ZyZXFfaW5pdCh2b2lkKQogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCWludCBlcnI7CiAKIAkvKiBUZXN0IGlmIHdlIGhhdmUgdGhlIHJpZ2h0IGhhcmR3YXJlICovCiAJaWYoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCB8fApAQCAtMTY2LDcgKzE2NywxMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnNjNTIwX2ZyZXFfZHJpdmVyKTsKKwllcnIgPSBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmc2M1MjBfZnJlcV9kcml2ZXIpOworCWlmIChlcnIpCisJCWlvdW5tYXAoY3B1Y3RsKTsKKworCXJldHVybiBlcnI7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKaW5kZXggZTg5OTNiYS4uNTExM2U5MiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLWNlbnRyaW5vIiwgbXNnKQogCisjZGVmaW5lIElOVEVMX01TUl9SQU5HRQkoMHhmZmZmKQogCiBzdHJ1Y3QgY3B1X2lkCiB7CkBAIC0zNzksNiArMzgwLDcgQEAKIH0KIAogCisjaWZkZWYgQ09ORklHX1NNUAogLyoKICAqIFNvbWUgQklPU2VzIGRvIFNXX0FOWSBjb29yZGluYXRpb24gaW50ZXJuYWxseSwgZWl0aGVyIHNldCBpdCB1cCBpbiBodwogICogb3IgZG8gaXQgaW4gQklPUyBmaXJtd2FyZSBhbmQgd29uJ3QgaW5mb3JtIGFib3V0IGl0IHRvIE9TLiBJZiBub3QKQEAgLTM5Miw3ICszOTQsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBzd19hbnlfYnVnX2RtaV90YWJsZVtdID0gewogCXsKIAkJLmNhbGxiYWNrID0gc3dfYW55X2J1Z19mb3VuZCwKQEAgLTQwNSw3ICs0MDYsNyBAQAogCX0sCiAJeyB9CiB9OwotCisjZW5kaWYKIAogLyoKICAqIGNlbnRyaW5vX2NwdV9pbml0X2FjcGkgLSByZWdpc3RlciB3aXRoIEFDUEkgUC1TdGF0ZXMgbGlicmFyeQpAQCAtNDYzLDggKzQ2NCw5IEBACiAJfQogCiAJZm9yIChpPTA7IGk8cC0+c3RhdGVfY291bnQ7IGkrKykgewotCQlpZiAocC0+c3RhdGVzW2ldLmNvbnRyb2wgIT0gcC0+c3RhdGVzW2ldLnN0YXR1cykgewotCQkJZHByaW50aygiRGlmZmVyZW50IGNvbnRyb2wgKCVsbHUpIGFuZCBzdGF0dXMgdmFsdWVzICglbGx1KVxuIiwKKwkJaWYgKChwLT5zdGF0ZXNbaV0uY29udHJvbCAmIElOVEVMX01TUl9SQU5HRSkgIT0KKwkJICAgIChwLT5zdGF0ZXNbaV0uc3RhdHVzICYgSU5URUxfTVNSX1JBTkdFKSkgeworCQkJZHByaW50aygiRGlmZmVyZW50IE1TUiBiaXRzIGluIGNvbnRyb2wgKCVsbHUpIGFuZCBzdGF0dXMgKCVsbHUpXG4iLAogCQkJCXAtPnN0YXRlc1tpXS5jb250cm9sLCBwLT5zdGF0ZXNbaV0uc3RhdHVzKTsKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl91bnJlZzsKQEAgLTUwMCw3ICs1MDIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpPTA7IGk8cC0+c3RhdGVfY291bnQ7IGkrKykgewotCQljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXggPSBwLT5zdGF0ZXNbaV0uY29udHJvbDsKKwkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmluZGV4ID0gcC0+c3RhdGVzW2ldLmNvbnRyb2wgJiBJTlRFTF9NU1JfUkFOR0U7CiAJCWNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kgPSBwLT5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwogCQlkcHJpbnRrKCJhZGRpbmcgc3RhdGUgJWkgd2l0aCBmcmVxdWVuY3kgJXUgYW5kIGNvbnRyb2wgdmFsdWUgJTA0eFxuIiwgCiAJCQlpLCBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5LCBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXgpOwpAQCAtNTMxLDYgKzUzMyw5IEBACiAKIAkvKiBub3RpZnkgQklPUyB0aGF0IHdlIGV4aXN0ICovCiAJYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbShUSElTX01PRFVMRSk7CisJcHJpbnRrKCJzcGVlZHN0ZXAtY2VudHJpbm8gd2l0aCBYODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkiCisJCQkiY29uZmlnIGlzIGRlcHJlY2F0ZWQuXG4gIgorCQkJIlVzZSBYODZfQUNQSV9DUFVGUkVRIChhY3BpLWNwdWZyZXEgaW5zdGVhZC5cbiIgKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCmluZGV4IDRmNDZjYWMuLmQ1OTI3N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCkBAIC0xMjMsNiArMTIzLDM2IEBACiAJcmV0dXJuIChtc3JfdG1wICogMTAwICogMTAwMCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVudGl1bV9jb3JlX2dldF9mcmVxdWVuY3kodm9pZCkKK3sKKwl1MzIgZnNiID0gMDsKKwl1MzIgbXNyX2xvLCBtc3JfdG1wOworCisJcmRtc3IoTVNSX0ZTQl9GUkVRLCBtc3JfbG8sIG1zcl90bXApOworCS8qIHNlZSB0YWJsZSBCLTIgb2YgMjUzNjY5MjAucGRmICovCisJc3dpdGNoIChtc3JfbG8gJiAweDA3KSB7CisJY2FzZSA1OgorCQlmc2IgPSAxMDAwMDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZnNiID0gMTMzMzMzOworCQlicmVhazsKKwljYXNlIDM6CisJCWZzYiA9IDE2NjY2NzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ09SRSAtIE1TUl9GU0JfRlJFUSB1bmRlZmluZWQgdmFsdWUiKTsKKwl9CisKKwlyZG1zcihNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbXNyX2xvLCBtc3JfdG1wKTsKKwlkcHJpbnRrKCJQQ09SRSAtIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX3RtcCk7CisKKwltc3JfdG1wID0gKG1zcl9sbyA+PiAyMikgJiAweDFmOworCWRwcmludGsoImJpdHMgMjItMjYgYXJlIDB4JXgsIHNwZWVkIGlzICV1XG4iLCBtc3JfdG1wLCAobXNyX3RtcCAqIGZzYikpOworCisJcmV0dXJuIChtc3JfdG1wICogZnNiKTsKK30KKwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHBlbnRpdW00X2dldF9mcmVxdWVuY3kodm9pZCkKIHsKQEAgLTE3NCw2ICsyMDQsOCBAQAogdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgcHJvY2Vzc29yKQogewogCXN3aXRjaCAocHJvY2Vzc29yKSB7CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BDT1JFOgorCQlyZXR1cm4gcGVudGl1bV9jb3JlX2dldF9mcmVxdWVuY3koKTsKIAljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUE06CiAJCXJldHVybiBwZW50aXVtTV9nZXRfZnJlcXVlbmN5KCk7CiAJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0RDoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5oIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmgKaW5kZXggYjczNTQyOS4uYjExYmNjNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmgKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmgKQEAgLTIyLDYgKzIyLDcgQEAKICAqIHRoZSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koKSBjYWxsLiAqLwogI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BNCQkJMHhGRkZGRkYwMyAgLyogUGVudGl1bSBNICAqLwogI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0RAkJCTB4RkZGRkZGMDQgIC8qIGRlc2t0b3AgUDQgICovCisjZGVmaW5lIFNQRUVEU1RFUF9QUk9DRVNTT1JfUENPUkUJCTB4RkZGRkZGMDUgIC8qIENvcmUgKi8KIAogLyogc3BlZWRzdGVwIHN0YXRlcyAtLSBvbmx5IHR3byBvZiB0aGVtICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKaW5kZXggYzI4MzMzZC4uZmYwZDg5OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKQEAgLTM2MCw5ICszNjAsNiBAQAogCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0M6CiAJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWToKIAkJYnJlYWs7Ci0JY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TToKLQkJcHJpbnRrKEtFUk5fSU5GTyAic3BlZWRzdGVwLXNtaTogeW91J3JlIHRyeWluZyB0byB1c2UgdGhpcyBjcHVmcmVxIGRyaXZlciBvbiBhIFBlbnRpdW0gNC1iYXNlZCBDUFUuIE1vc3QgbGlrZWx5IGl0IHdpbGwgbm90IHdvcmsuXG4iKTsKLQkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc3BlZWRzdGVwX3Byb2Nlc3NvciA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKaW5kZXggOTRhOTVhYS4uNTZmZTI2NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKiBOb3RlIHRoYXQgdGhlIHdvcmthcm91bmQgb25seSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgb25jZS4uLgogCSAqLwogCWMtPmYwMGZfYnVnID0gMDsKLQlpZiAoIGMtPng4NiA9PSA1ICkgeworCWlmICghcGFyYXZpcnRfZW5hYmxlZCgpICYmIGMtPng4NiA9PSA1KSB7CiAJCXN0YXRpYyBpbnQgZjAwZl93b3JrYXJvdW5kX2VuYWJsZWQgPSAwOwogCiAJCWMtPmYwMGZfYnVnID0gMTsKQEAgLTE5NSw4ICsxOTUsMTYgQEAKIAlpZiAoKGMtPng4NiA9PSAweGYgJiYgYy0+eDg2X21vZGVsID49IDB4MDMpIHx8CiAJCShjLT54ODYgPT0gMHg2ICYmIGMtPng4Nl9tb2RlbCA+PSAweDBlKSkKIAkJc2V0X2JpdChYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MsIGMtPng4Nl9jYXBhYmlsaXR5KTsKLX0KIAorCWlmIChjcHVfaGFzX2RzKSB7CisJCXVuc2lnbmVkIGludCBsMTsKKwkJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwxLCBsMik7CisJCWlmICghKGwxICYgKDE8PDExKSkpCisJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0JUUywgYy0+eDg2X2NhcGFiaWxpdHkpOworCQlpZiAoIShsMSAmICgxPDwxMikpKQorCQkJc2V0X2JpdChYODZfRkVBVFVSRV9QRUJTLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJfQorfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IF9fY3B1aW5pdCBpbnRlbF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYwppbmRleCA1YzQzYmU0Li44MGI0YzVkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYwpAQCAtNDgwLDEyICs0ODAsMTAgQEAKIAlpZiAobnVtX2NhY2hlX2xlYXZlcyA9PSAwKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWNwdWlkNF9pbmZvW2NwdV0gPSBrbWFsbG9jKAorCWNwdWlkNF9pbmZvW2NwdV0gPSBremFsbG9jKAogCSAgICBzaXplb2Yoc3RydWN0IF9jcHVpZDRfaW5mbykgKiBudW1fY2FjaGVfbGVhdmVzLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoY3B1aWQ0X2luZm9bY3B1XSA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGNwdWlkNF9pbmZvW2NwdV0sIDAsCi0JICAgIHNpemVvZihzdHJ1Y3QgX2NwdWlkNF9pbmZvKSAqIG51bV9jYWNoZV9sZWF2ZXMpOwogCiAJb2xkbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKIAlyZXR2YWwgPSBzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOwpAQCAtNjU4LDE3ICs2NTYsMTQgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAkvKiBBbGxvY2F0ZSBhbGwgcmVxdWlyZWQgbWVtb3J5ICovCi0JY2FjaGVfa29iamVjdFtjcHVdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtvYmplY3QpLCBHRlBfS0VSTkVMKTsKKwljYWNoZV9rb2JqZWN0W2NwdV0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga29iamVjdCksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseShjYWNoZV9rb2JqZWN0W2NwdV0gPT0gTlVMTCkpCiAJCWdvdG8gZXJyX291dDsKLQltZW1zZXQoY2FjaGVfa29iamVjdFtjcHVdLCAwLCBzaXplb2Yoc3RydWN0IGtvYmplY3QpKTsKIAotCWluZGV4X2tvYmplY3RbY3B1XSA9IGttYWxsb2MoCisJaW5kZXhfa29iamVjdFtjcHVdID0ga3phbGxvYygKIAkgICAgc2l6ZW9mKHN0cnVjdCBfaW5kZXhfa29iamVjdCApICogbnVtX2NhY2hlX2xlYXZlcywgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KGluZGV4X2tvYmplY3RbY3B1XSA9PSBOVUxMKSkKIAkJZ290byBlcnJfb3V0OwotCW1lbXNldChpbmRleF9rb2JqZWN0W2NwdV0sIDAsCi0JICAgIHNpemVvZihzdHJ1Y3QgX2luZGV4X2tvYmplY3QpICogbnVtX2NhY2hlX2xlYXZlcyk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL25vbi1mYXRhbC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL25vbi1mYXRhbC5jCmluZGV4IDFmOTE1M2EuLjZiNWQzNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9ub24tZmF0YWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbm9uLWZhdGFsLmMKQEAgLTUxLDEwICs1MSwxMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbWNlX3dvcmtfZm4odm9pZCAqZGF0YSk7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKG1jZV93b3JrLCBtY2Vfd29ya19mbiwgTlVMTCk7CitzdGF0aWMgdm9pZCBtY2Vfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKG1jZV93b3JrLCBtY2Vfd29ya19mbik7CiAKLXN0YXRpYyB2b2lkIG1jZV93b3JrX2ZuKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBtY2Vfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7IAogCW9uX2VhY2hfY3B1KG1jZV9jaGVja3JlZ3MsIE5VTEwsIDEsIDEpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbWNlX3dvcmssIE1DRV9SQVRFKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKaW5kZXggMmQ4NzAzYi4uMDY1MDA1YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL3RoZXJtX3Rocm90Lmg+CiAKIC8qIEhvdyBsb25nIHRvIHdhaXQgYmV0d2VlbiByZXBvcnRpbmcgdGhlcm1hbCBldmVudHMgKi8KQEAgLTExNSw3ICsxMTYsNiBAQAogCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0aGVybWFsX3Rocm90dGxlX2F0dHJfZ3JvdXApOwogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgX19jcHVpbml0IHZvaWQgdGhlcm1hbF90aHJvdHRsZV9yZW1vdmVfZGV2KHN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQogewogCXJldHVybiBzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0aGVybWFsX3Rocm90dGxlX2F0dHJfZ3JvdXApOwpAQCAtMTUyLDcgKzE1Miw2IEBACiB7CiAJLm5vdGlmaWVyX2NhbGwgPSB0aGVybWFsX3Rocm90dGxlX2NwdV9jYWxsYmFjaywKIH07Ci0jZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIHN0YXRpYyBfX2luaXQgaW50IHRoZXJtYWxfdGhyb3R0bGVfaW5pdF9kZXZpY2Uodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL01ha2VmaWxlCmluZGV4IGEyNWI3MDEuLjE5MWZjMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9NYWtlZmlsZQpAQCAtMSw1ICsxLDMgQEAKIG9iai15CQk6PSBtYWluLm8gaWYubyBnZW5lcmljLm8gc3RhdGUubwotb2JqLXkJCSs9IGFtZC5vCi1vYmoteQkJKz0gY3lyaXgubwotb2JqLXkJCSs9IGNlbnRhdXIubworb2JqLSQoQ09ORklHX1g4Nl8zMikgKz0gYW1kLm8gY3lyaXgubyBjZW50YXVyLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9hbWQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvYW1kLmMKaW5kZXggMWExZTA0Yi4uMDk0OWNkYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9hbWQuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2FtZC5jCkBAIC03LDcgKzcsNyBAQAogCiBzdGF0aWMgdm9pZAogYW1kX2dldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgKmJhc2UsCi0JICAgICB1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpCisJICAgICB1bnNpZ25lZCBsb25nICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKQogewogCXVuc2lnbmVkIGxvbmcgbG93LCBoaWdoOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NlbnRhdXIuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY2VudGF1ci5jCmluZGV4IDMzZjAwYWMuLmNiOWFhM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY2VudGF1ci5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY2VudGF1ci5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKi8KIAogc3RhdGljIGludAotY2VudGF1cl9nZXRfZnJlZV9yZWdpb24odW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpCitjZW50YXVyX2dldF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHJlcGxhY2VfcmVnKQogLyogIFtTVU1NQVJZXSBHZXQgYSBmcmVlIE1UUlIuCiAgICAgPGJhc2U+IFRoZSBzdGFydGluZyAoYmFzZSkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgogICAgIDxzaXplPiBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZWdpb24uCkBAIC0yNiwxMCArMjYsMTEgQEAKIHsKIAlpbnQgaSwgbWF4OwogCW10cnJfdHlwZSBsdHlwZTsKLQl1bnNpZ25lZCBsb25nIGxiYXNlOwotCXVuc2lnbmVkIGludCBsc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGxiYXNlLCBsc2l6ZTsKIAogCW1heCA9IG51bV92YXJfcmFuZ2VzOworCWlmIChyZXBsYWNlX3JlZyA+PSAwICYmIHJlcGxhY2VfcmVnIDwgbWF4KQorCQlyZXR1cm4gcmVwbGFjZV9yZWc7CiAJZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7CiAJCWlmIChjZW50YXVyX21jcl9yZXNlcnZlZCAmICgxIDw8IGkpKQogCQkJY29udGludWU7CkBAIC00OSw3ICs1MCw3IEBACiAKIHN0YXRpYyB2b2lkCiBjZW50YXVyX2dldF9tY3IodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKLQkJdW5zaWduZWQgaW50ICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKQorCQl1bnNpZ25lZCBsb25nICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKQogewogCSpiYXNlID0gY2VudGF1cl9tY3JbcmVnXS5oaWdoID4+IFBBR0VfU0hJRlQ7CiAJKnNpemUgPSAtKGNlbnRhdXJfbWNyW3JlZ10ubG93ICYgMHhmZmZmZjAwMCkgPj4gUEFHRV9TSElGVDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY3lyaXguYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvY3lyaXguYwppbmRleCA5MDI3YTk4Li4wNzM3YTU5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2N5cml4LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jeXJpeC5jCkBAIC05LDcgKzksNyBAQAogCiBzdGF0aWMgdm9pZAogY3lyaXhfZ2V0X2Fycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nICpiYXNlLAotCSAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgbXRycl90eXBlICogdHlwZSkKKwkgICAgICB1bnNpZ25lZCBsb25nICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBhcnIsIGNjcjMsIHJjciwgc2hpZnQ7CkBAIC03Nyw3ICs3Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWN5cml4X2dldF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2N5cml4X2dldF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHJlcGxhY2VfcmVnKQogLyogIFtTVU1NQVJZXSBHZXQgYSBmcmVlIEFSUi4KICAgICA8YmFzZT4gVGhlIHN0YXJ0aW5nIChiYXNlKSBhZGRyZXNzIG9mIHRoZSByZWdpb24uCiAgICAgPHNpemU+IFRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIHJlZ2lvbi4KQEAgLTg2LDkgKzg2LDI0IEBACiB7CiAJaW50IGk7CiAJbXRycl90eXBlIGx0eXBlOwotCXVuc2lnbmVkIGxvbmcgbGJhc2U7Ci0JdW5zaWduZWQgaW50ICBsc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGxiYXNlLCBsc2l6ZTsKIAorCXN3aXRjaCAocmVwbGFjZV9yZWcpIHsKKwljYXNlIDc6CisJCWlmIChzaXplIDwgMHg0MCkKKwkJCWJyZWFrOworCWNhc2UgNjoKKwljYXNlIDU6CisJY2FzZSA0OgorCQlyZXR1cm4gcmVwbGFjZV9yZWc7CisJY2FzZSAzOgorCQlpZiAoYXJyM19wcm90ZWN0ZWQpCisJCQlicmVhazsKKwljYXNlIDI6CisJY2FzZSAxOgorCWNhc2UgMDoKKwkJcmV0dXJuIHJlcGxhY2VfcmVnOworCX0KIAkvKiBJZiB3ZSBhcmUgdG8gc2V0IHVwIGEgcmVnaW9uID4zMk0gdGhlbiBsb29rIGF0IEFSUjcgaW1tZWRpYXRlbHkgKi8KIAlpZiAoc2l6ZSA+IDB4MjAwMCkgewogCQljeXJpeF9nZXRfYXJyKDcsICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOwpAQCAtMjE0LDcgKzIyOSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAl1bnNpZ25lZCBsb25nIGJhc2U7Ci0JdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgbG9uZyBzaXplOwogCW10cnJfdHlwZSB0eXBlOwogfSBhcnJfc3RhdGVfdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwppbmRleCAwYjYxZWVkLi5mNzdmYzUzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwpAQCAtMyw2ICszLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL210cnIuaD4KICNpbmNsdWRlIDxhc20vbXNyLmg+CkBAIC0xNSwxMiArMTYsMTkgQEAKIAlzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZhcl9yYW5nZXM7CiAJbXRycl90eXBlIGZpeGVkX3Jhbmdlc1tOVU1fRklYRURfUkFOR0VTXTsKIAl1bnNpZ25lZCBjaGFyIGVuYWJsZWQ7CisJdW5zaWduZWQgY2hhciBoYXZlX2ZpeGVkOwogCW10cnJfdHlwZSBkZWZfdHlwZTsKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNtcF9jaGFuZ2VzX21hc2s7CiBzdGF0aWMgc3RydWN0IG10cnJfc3RhdGUgbXRycl9zdGF0ZSA9IHt9OwogCisjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAorI2RlZmluZSBNT0RVTEVfUEFSQU1fUFJFRklYICJtdHJyLiIKKworc3RhdGljIF9faW5pdGRhdGEgaW50IG10cnJfc2hvdzsKK21vZHVsZV9wYXJhbV9uYW1lZChzaG93LCBtdHJyX3Nob3csIGJvb2wsIDApOworCiAvKiAgR2V0IHRoZSBNU1IgcGFpciByZWxhdGluZyB0byBhIHZhciByYW5nZSAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdAogZ2V0X210cnJfdmFyX3JhbmdlKHVuc2lnbmVkIGludCBpbmRleCwgc3RydWN0IG10cnJfdmFyX3JhbmdlICp2cikKQEAgLTQzLDYgKzUxLDE0IEBACiAJCXJkbXNyKE1UUlJmaXg0S19DMDAwMF9NU1IgKyBpLCBwWzYgKyBpICogMl0sIHBbNyArIGkgKiAyXSk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwcmludF9maXhlZCh1bnNpZ25lZCBiYXNlLCB1bnNpZ25lZCBzdGVwLCBjb25zdCBtdHJyX3R5cGUqdHlwZXMpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyArK2ksICsrdHlwZXMsIGJhc2UgKz0gc3RlcCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVRSUiAlMDVYLSUwNVggJXNcbiIsIGJhc2UsIGJhc2UgKyBzdGVwIC0gMSwgbXRycl9hdHRyaWJfdG9fc3RyKCp0eXBlcykpOworfQorCiAvKiAgR3JhYiBhbGwgb2YgdGhlIE1UUlIgc3RhdGUgZm9yIHRoaXMgQ1BVIGludG8gKnN0YXRlICAqLwogdm9pZCBfX2luaXQgZ2V0X210cnJfc3RhdGUodm9pZCkKIHsKQEAgLTU4LDEzICs3NCw0OSBAQAogCX0gCiAJdnJzID0gbXRycl9zdGF0ZS52YXJfcmFuZ2VzOwogCisJcmRtc3IoTVRSUmNhcF9NU1IsIGxvLCBkdW1teSk7CisJbXRycl9zdGF0ZS5oYXZlX2ZpeGVkID0gKGxvID4+IDgpICYgMTsKKwogCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgaSsrKQogCQlnZXRfbXRycl92YXJfcmFuZ2UoaSwgJnZyc1tpXSk7Ci0JZ2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3N0YXRlLmZpeGVkX3Jhbmdlcyk7CisJaWYgKG10cnJfc3RhdGUuaGF2ZV9maXhlZCkKKwkJZ2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3N0YXRlLmZpeGVkX3Jhbmdlcyk7CiAKIAlyZG1zcihNVFJSZGVmVHlwZV9NU1IsIGxvLCBkdW1teSk7CiAJbXRycl9zdGF0ZS5kZWZfdHlwZSA9IChsbyAmIDB4ZmYpOwogCW10cnJfc3RhdGUuZW5hYmxlZCA9IChsbyAmIDB4YzAwKSA+PiAxMDsKKworCWlmIChtdHJyX3Nob3cpIHsKKwkJaW50IGhpZ2hfd2lkdGg7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVRSUiBkZWZhdWx0IHR5cGU6ICVzXG4iLCBtdHJyX2F0dHJpYl90b19zdHIobXRycl9zdGF0ZS5kZWZfdHlwZSkpOworCQlpZiAobXRycl9zdGF0ZS5oYXZlX2ZpeGVkKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJNVFJSIGZpeGVkIHJhbmdlcyAlc2FibGVkOlxuIiwKKwkJCSAgICAgICBtdHJyX3N0YXRlLmVuYWJsZWQgJiAxID8gImVuIiA6ICJkaXMiKTsKKwkJCXByaW50X2ZpeGVkKDB4MDAwMDAsIDB4MTAwMDAsIG10cnJfc3RhdGUuZml4ZWRfcmFuZ2VzICsgMCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKQorCQkJCXByaW50X2ZpeGVkKDB4ODAwMDAgKyBpICogMHgyMDAwMCwgMHgwNDAwMCwgbXRycl9zdGF0ZS5maXhlZF9yYW5nZXMgKyAoaSArIDEpICogOCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCQkJCXByaW50X2ZpeGVkKDB4QzAwMDAgKyBpICogMHgwODAwMCwgMHgwMTAwMCwgbXRycl9zdGF0ZS5maXhlZF9yYW5nZXMgKyAoaSArIDMpICogOCk7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVRSUiB2YXJpYWJsZSByYW5nZXMgJXNhYmxlZDpcbiIsCisJCSAgICAgICBtdHJyX3N0YXRlLmVuYWJsZWQgJiAyID8gImVuIiA6ICJkaXMiKTsKKwkJaGlnaF93aWR0aCA9ICgoc2l6ZV9vcl9tYXNrID8gZmZzKHNpemVfb3JfbWFzaykgLSAxIDogMzIpIC0gKDMyIC0gUEFHRV9TSElGVCkgKyAzKSAvIDQ7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgKytpKSB7CisJCQlpZiAobXRycl9zdGF0ZS52YXJfcmFuZ2VzW2ldLm1hc2tfbG8gJiAoMSA8PCAxMSkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiTVRSUiAldSBiYXNlICUwKlglMDVYMDAwIG1hc2sgJTAqWCUwNVgwMDAgJXNcbiIsCisJCQkJICAgICAgIGksCisJCQkJICAgICAgIGhpZ2hfd2lkdGgsCisJCQkJICAgICAgIG10cnJfc3RhdGUudmFyX3Jhbmdlc1tpXS5iYXNlX2hpLAorCQkJCSAgICAgICBtdHJyX3N0YXRlLnZhcl9yYW5nZXNbaV0uYmFzZV9sbyA+PiAxMiwKKwkJCQkgICAgICAgaGlnaF93aWR0aCwKKwkJCQkgICAgICAgbXRycl9zdGF0ZS52YXJfcmFuZ2VzW2ldLm1hc2tfaGksCisJCQkJICAgICAgIG10cnJfc3RhdGUudmFyX3Jhbmdlc1tpXS5tYXNrX2xvID4+IDEyLAorCQkJCSAgICAgICBtdHJyX2F0dHJpYl90b19zdHIobXRycl9zdGF0ZS52YXJfcmFuZ2VzW2ldLmJhc2VfbG8gJiAweGZmKSk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiTVRSUiAldSBkaXNhYmxlZFxuIiwgaSk7CisJCX0KKwl9CiB9CiAKIC8qICBTb21lIEJJT1MncyBhcmUgZnVja2VkIGFuZCBkb24ndCBzZXQgYWxsIE1UUlJzIHRoZSBzYW1lISAgKi8KQEAgLTk1LDcgKzE0Nyw3IEBACiAJCQlzbXBfcHJvY2Vzc29yX2lkKCksIG1zciwgYSwgYik7CiB9CiAKLWludCBnZW5lcmljX2dldF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2ludCBnZW5lcmljX2dldF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHJlcGxhY2VfcmVnKQogLyogIFtTVU1NQVJZXSBHZXQgYSBmcmVlIE1UUlIuCiAgICAgPGJhc2U+IFRoZSBzdGFydGluZyAoYmFzZSkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgogICAgIDxzaXplPiBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZWdpb24uCkBAIC0xMDQsMTAgKzE1NiwxMSBAQAogewogCWludCBpLCBtYXg7CiAJbXRycl90eXBlIGx0eXBlOwotCXVuc2lnbmVkIGxvbmcgbGJhc2U7Ci0JdW5zaWduZWQgbHNpemU7CisJdW5zaWduZWQgbG9uZyBsYmFzZSwgbHNpemU7CiAKIAltYXggPSBudW1fdmFyX3JhbmdlczsKKwlpZiAocmVwbGFjZV9yZWcgPj0gMCAmJiByZXBsYWNlX3JlZyA8IG1heCkKKwkJcmV0dXJuIHJlcGxhY2VfcmVnOwogCWZvciAoaSA9IDA7IGkgPCBtYXg7ICsraSkgewogCQltdHJyX2lmLT5nZXQoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CiAJCWlmIChsc2l6ZSA9PSAwKQpAQCAtMTE3LDcgKzE3MCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGdlbmVyaWNfZ2V0X210cnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKLQkJCSAgICAgdW5zaWduZWQgaW50ICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKQorCQkJICAgICB1bnNpZ25lZCBsb25nICpzaXplLCBtdHJyX3R5cGUgKnR5cGUpCiB7CiAJdW5zaWduZWQgaW50IG1hc2tfbG8sIG1hc2tfaGksIGJhc2VfbG8sIGJhc2VfaGk7CiAKQEAgLTIwMiw3ICsyNTUsOSBAQAogCXJldHVybiBjaGFuZ2VkOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfbXRycl9zdGF0ZSh1MzIgZGVmdHlwZV9sbywgdTMyIGRlZnR5cGVfaGkpCitzdGF0aWMgdTMyIGRlZnR5cGVfbG8sIGRlZnR5cGVfaGk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9tdHJyX3N0YXRlKHZvaWQpCiAvKiAgW1NVTU1BUlldIFNldCB0aGUgTVRSUiBzdGF0ZSBmb3IgdGhpcyBDUFUuCiAgICAgPHN0YXRlPiBUaGUgTVRSUiBzdGF0ZSBpbmZvcm1hdGlvbiB0byByZWFkLgogICAgIDxjdHh0PiBTb21lIHJlbGV2YW50IENQVSBjb250ZXh0LgpAQCAtMjE3LDE0ICsyNzIsMTQgQEAKIAkJaWYgKHNldF9tdHJyX3Zhcl9yYW5nZXMoaSwgJm10cnJfc3RhdGUudmFyX3Jhbmdlc1tpXSkpCiAJCQljaGFuZ2VfbWFzayB8PSBNVFJSX0NIQU5HRV9NQVNLX1ZBUklBQkxFOwogCi0JaWYgKHNldF9maXhlZF9yYW5nZXMobXRycl9zdGF0ZS5maXhlZF9yYW5nZXMpKQorCWlmIChtdHJyX3N0YXRlLmhhdmVfZml4ZWQgJiYgc2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3N0YXRlLmZpeGVkX3JhbmdlcykpCiAJCWNoYW5nZV9tYXNrIHw9IE1UUlJfQ0hBTkdFX01BU0tfRklYRUQ7CiAKIAkvKiAgU2V0X210cnJfcmVzdG9yZSByZXN0b3JlcyB0aGUgb2xkIHZhbHVlIG9mIE1UUlJkZWZUeXBlLAogCSAgIHNvIHRvIHNldCBpdCB3ZSBmaWRkbGUgd2l0aCB0aGUgc2F2ZWQgdmFsdWUgICovCiAJaWYgKChkZWZ0eXBlX2xvICYgMHhmZikgIT0gbXRycl9zdGF0ZS5kZWZfdHlwZQogCSAgICB8fCAoKGRlZnR5cGVfbG8gJiAweGMwMCkgPj4gMTApICE9IG10cnJfc3RhdGUuZW5hYmxlZCkgewotCQlkZWZ0eXBlX2xvIHw9IChtdHJyX3N0YXRlLmRlZl90eXBlIHwgbXRycl9zdGF0ZS5lbmFibGVkIDw8IDEwKTsKKwkJZGVmdHlwZV9sbyA9IChkZWZ0eXBlX2xvICYgfjB4Y2ZmKSB8IG10cnJfc3RhdGUuZGVmX3R5cGUgfCAobXRycl9zdGF0ZS5lbmFibGVkIDw8IDEwKTsKIAkJY2hhbmdlX21hc2sgfD0gTVRSUl9DSEFOR0VfTUFTS19ERUZUWVBFOwogCX0KIApAQCAtMjMzLDcgKzI4OCw2IEBACiAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3I0ID0gMDsKLXN0YXRpYyB1MzIgZGVmdHlwZV9sbywgZGVmdHlwZV9oaTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2V0X2F0b21pY2l0eV9sb2NrKTsKIAogLyoKQEAgLTI3MSw3ICszMjUsNyBAQAogCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmdHlwZV9sbywgZGVmdHlwZV9oaSk7CiAKIAkvKiAgRGlzYWJsZSBNVFJScywgYW5kIHNldCB0aGUgZGVmYXVsdCB0eXBlIHRvIHVuY2FjaGVkICAqLwotCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBkZWZ0eXBlX2xvICYgMHhmMzAwVUwsIGRlZnR5cGVfaGkpOworCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBkZWZ0eXBlX2xvICYgfjB4Y2ZmLCBkZWZ0eXBlX2hpKTsKIH0KIAogc3RhdGljIHZvaWQgcG9zdF9zZXQodm9pZCkgX19yZWxlYXNlcyhzZXRfYXRvbWljaXR5X2xvY2spCkBAIC0zMDAsNyArMzU0LDcgQEAKIAlwcmVwYXJlX3NldCgpOwogCiAJLyogQWN0dWFsbHkgc2V0IHRoZSBzdGF0ZSAqLwotCW1hc2sgPSBzZXRfbXRycl9zdGF0ZShkZWZ0eXBlX2xvLGRlZnR5cGVfaGkpOworCW1hc2sgPSBzZXRfbXRycl9zdGF0ZSgpOwogCiAJcG9zdF9zZXQoKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC0zNjYsNyArNDIwLDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IGJhc2UoMHglbHgwMDApIGlzIG5vdCA0IE1pQiBhbGlnbmVkXG4iLCBiYXNlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWlmICghKGJhc2UgKyBzaXplIDwgMHg3MDAwMDAwMCB8fCBiYXNlID4gMHg3MDAzRkZGRikgJiYKKwkJaWYgKCEoYmFzZSArIHNpemUgPCAweDcwMDAwIHx8IGJhc2UgPiAweDcwMDNGKSAmJgogCQkgICAgKHR5cGUgPT0gTVRSUl9UWVBFX1dSQ09NQgogCQkgICAgIHx8IHR5cGUgPT0gTVRSUl9UWVBFX1dSQkFDSykpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IHdyaXRhYmxlIG10cnIgYmV0d2VlbiAweDcwMDAwMDAwIGFuZCAweDcwMDNGRkZGIG1heSBoYW5nIHRoZSBDUFUuXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvaWYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvaWYuYwppbmRleCA1YWMwNTFiLi41YWUxNzA1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2lmLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9pZi5jCkBAIC0xNyw3ICsxNyw3IEBACiAKICNkZWZpbmUgRklMRV9GQ09VTlQoZikgKCgoc3RydWN0IHNlcV9maWxlICopKChmKS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGUpCiAKLXN0YXRpYyBjaGFyICptdHJyX3N0cmluZ3NbTVRSUl9OVU1fVFlQRVNdID0KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtdHJyX3N0cmluZ3NbTVRSUl9OVU1fVFlQRVNdID0KIHsKICAgICAidW5jYWNoYWJsZSIsICAgICAgICAgICAgICAgLyogMCAqLwogICAgICJ3cml0ZS1jb21iaW5pbmciLCAgICAgICAgICAvKiAxICovCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgIndyaXRlLWJhY2siLCAgICAgICAgICAgICAgIC8qIDYgKi8KIH07CiAKLWNoYXIgKm10cnJfYXR0cmliX3RvX3N0cihpbnQgeCkKK2NvbnN0IGNoYXIgKm10cnJfYXR0cmliX3RvX3N0cihpbnQgeCkKIHsKIAlyZXR1cm4gKHggPD0gNikgPyBtdHJyX3N0cmluZ3NbeF0gOiAiPyI7CiB9CkBAIC00NCwxMCArNDQsOSBAQAogCiAJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CiAJaWYgKGZjb3VudCA9PSBOVUxMKSB7Ci0JCWZjb3VudCA9IGttYWxsb2MobWF4ICogc2l6ZW9mICpmY291bnQsIEdGUF9LRVJORUwpOworCQlmY291bnQgPSBremFsbG9jKG1heCAqIHNpemVvZiAqZmNvdW50LCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFmY291bnQpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJbWVtc2V0KGZjb3VudCwgMCwgbWF4ICogc2l6ZW9mICpmY291bnQpOwogCQlGSUxFX0ZDT1VOVChmaWxlKSA9IGZjb3VudDsKIAl9CiAJaWYgKCFwYWdlKSB7CkBAIC0xNTUsNiArMTU0LDcgQEAKIHsKIAlpbnQgZXJyID0gMDsKIAltdHJyX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CiAJc3RydWN0IG10cnJfc2VudHJ5IHNlbnRyeTsKIAlzdHJ1Y3QgbXRycl9nZW50cnkgZ2VudHJ5OwogCXZvaWQgX191c2VyICphcmcgPSAodm9pZCBfX3VzZXIgKikgX19hcmc7CkBAIC0yMzUsMTUgKzIzNSwxNSBAQAogCWNhc2UgTVRSUklPQ19HRVRfRU5UUlk6CiAJCWlmIChnZW50cnkucmVnbnVtID49IG51bV92YXJfcmFuZ2VzKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW10cnJfaWYtPmdldChnZW50cnkucmVnbnVtLCAmZ2VudHJ5LmJhc2UsICZnZW50cnkuc2l6ZSwgJnR5cGUpOworCQltdHJyX2lmLT5nZXQoZ2VudHJ5LnJlZ251bSwgJmdlbnRyeS5iYXNlLCAmc2l6ZSwgJnR5cGUpOwogCiAJCS8qIEhpZGUgZW50cmllcyB0aGF0IGdvIGFib3ZlIDRHQiAqLwotCQlpZiAoZ2VudHJ5LmJhc2UgKyBnZW50cnkuc2l6ZSA+IDB4MTAwMDAwCi0JCSAgICB8fCBnZW50cnkuc2l6ZSA9PSAweDEwMDAwMCkKKwkJaWYgKGdlbnRyeS5iYXNlICsgc2l6ZSAtIDEgPj0gKDFVTCA8PCAoOCAqIHNpemVvZihnZW50cnkuc2l6ZSkgLSBQQUdFX1NISUZUKSkKKwkJICAgIHx8IHNpemUgPj0gKDFVTCA8PCAoOCAqIHNpemVvZihnZW50cnkuc2l6ZSkgLSBQQUdFX1NISUZUKSkpCiAJCQlnZW50cnkuYmFzZSA9IGdlbnRyeS5zaXplID0gZ2VudHJ5LnR5cGUgPSAwOwogCQllbHNlIHsKIAkJCWdlbnRyeS5iYXNlIDw8PSBQQUdFX1NISUZUOwotCQkJZ2VudHJ5LnNpemUgPDw9IFBBR0VfU0hJRlQ7CisJCQlnZW50cnkuc2l6ZSA9IHNpemUgPDwgUEFHRV9TSElGVDsKIAkJCWdlbnRyeS50eXBlID0gdHlwZTsKIAkJfQogCkBAIC0yNzMsOCArMjczLDE0IEBACiAJY2FzZSBNVFJSSU9DX0dFVF9QQUdFX0VOVFJZOgogCQlpZiAoZ2VudHJ5LnJlZ251bSA+PSBudW1fdmFyX3JhbmdlcykKIAkJCXJldHVybiAtRUlOVkFMOwotCQltdHJyX2lmLT5nZXQoZ2VudHJ5LnJlZ251bSwgJmdlbnRyeS5iYXNlLCAmZ2VudHJ5LnNpemUsICZ0eXBlKTsKLQkJZ2VudHJ5LnR5cGUgPSB0eXBlOworCQltdHJyX2lmLT5nZXQoZ2VudHJ5LnJlZ251bSwgJmdlbnRyeS5iYXNlLCAmc2l6ZSwgJnR5cGUpOworCQkvKiBIaWRlIGVudHJpZXMgdGhhdCB3b3VsZCBvdmVyZmxvdyAqLworCQlpZiAoc2l6ZSAhPSAoX190eXBlb2ZfXyhnZW50cnkuc2l6ZSkpc2l6ZSkKKwkJCWdlbnRyeS5iYXNlID0gZ2VudHJ5LnNpemUgPSBnZW50cnkudHlwZSA9IDA7CisJCWVsc2UgeworCQkJZ2VudHJ5LnNpemUgPSBzaXplOworCQkJZ2VudHJ5LnR5cGUgPSB0eXBlOworCQl9CiAJCWJyZWFrOwogCX0KIApAQCAtMzUzLDggKzM1OSw3IEBACiAJY2hhciBmYWN0b3I7CiAJaW50IGksIG1heCwgbGVuOwogCW10cnJfdHlwZSB0eXBlOwotCXVuc2lnbmVkIGxvbmcgYmFzZTsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIHNpemU7CiAKIAlsZW4gPSAwOwogCW1heCA9IG51bV92YXJfcmFuZ2VzOwpAQCAtMzczLDcgKzM3OCw3IEBACiAJCQl9CiAJCQkvKiBSRUQtUEVOOiBiYXNlIGNhbiBiZSA+IDMyYml0ICovIAogCQkJbGVuICs9IHNlcV9wcmludGYoc2VxLCAKLQkJCQkgICAicmVnJTAyaTogYmFzZT0weCUwNWx4MDAwICglNGxpTUIpLCBzaXplPSU0aSVjQjogJXMsIGNvdW50PSVkXG4iLAorCQkJCSAgICJyZWclMDJpOiBiYXNlPTB4JTA1bHgwMDAgKCU0bHVNQiksIHNpemU9JTRsdSVjQjogJXMsIGNvdW50PSVkXG4iLAogCQkJICAgICBpLCBiYXNlLCBiYXNlID4+ICgyMCAtIFBBR0VfU0hJRlQpLCBzaXplLCBmYWN0b3IsCiAJCQkgICAgIG10cnJfYXR0cmliX3RvX3N0cih0eXBlKSwgdXNhZ2VfdGFibGVbaV0pOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCmluZGV4IGZmZjkwYmRhNC4uMTZiYjdlYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKQEAgLTU5LDcgKzU5LDExIEBACiBzdGF0aWMgdm9pZCBzZXRfbXRycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIGJhc2UsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSk7CiAKKyNpZm5kZWYgQ09ORklHX1g4Nl82NAogZXh0ZXJuIGludCBhcnIzX3Byb3RlY3RlZDsKKyNlbHNlCisjZGVmaW5lIGFycjNfcHJvdGVjdGVkIDAKKyNlbmRpZgogCiB2b2lkIHNldF9tdHJyX29wcyhzdHJ1Y3QgbXRycl9vcHMgKiBvcHMpCiB7CkBAIC0xNjgsNiArMTcyLDEzIEBACiAKICNlbmRpZgogCitzdGF0aWMgaW5saW5lIGludCB0eXBlc19jb21wYXRpYmxlKG10cnJfdHlwZSB0eXBlMSwgbXRycl90eXBlIHR5cGUyKSB7CisJcmV0dXJuIHR5cGUxID09IE1UUlJfVFlQRV9VTkNBQ0hBQkxFIHx8CisJICAgICAgIHR5cGUyID09IE1UUlJfVFlQRV9VTkNBQ0hBQkxFIHx8CisJICAgICAgICh0eXBlMSA9PSBNVFJSX1RZUEVfV1JUSFJPVUdIICYmIHR5cGUyID09IE1UUlJfVFlQRV9XUkJBQ0spIHx8CisJICAgICAgICh0eXBlMSA9PSBNVFJSX1RZUEVfV1JCQUNLICYmIHR5cGUyID09IE1UUlJfVFlQRV9XUlRIUk9VR0gpOworfQorCiAvKioKICAqIHNldF9tdHJyIC0gdXBkYXRlIG10cnJzIG9uIGFsbCBwcm9jZXNzb3JzCiAgKiBAcmVnOgltdHJyIGluIHF1ZXN0aW9uCkBAIC0yNjMsOCArMjc0LDggQEAKIAogLyoqCiAgKgltdHJyX2FkZF9wYWdlIC0gQWRkIGEgbWVtb3J5IHR5cGUgcmVnaW9uCi0gKglAYmFzZTogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHJlZ2lvbiBpbiBwYWdlcyAoNCBLQikKLSAqCUBzaXplOiBQaHlzaWNhbCBzaXplIG9mIHJlZ2lvbiBpbiBwYWdlcyAoNCBLQikKKyAqCUBiYXNlOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgcmVnaW9uIGluIHBhZ2VzIChpbiB1bml0cyBvZiA0IGtCISkKKyAqCUBzaXplOiBQaHlzaWNhbCBzaXplIG9mIHJlZ2lvbiBpbiBwYWdlcyAoNCBrQikKICAqCUB0eXBlOiBUeXBlIG9mIE1UUlIgZGVzaXJlZAogICoJQGluY3JlbWVudDogSWYgdGhpcyBpcyB0cnVlIGRvIHVzYWdlIGNvdW50aW5nIG9uIHRoZSByZWdpb24KICAqCkBAIC0zMDAsMTEgKzMxMSw5IEBACiBpbnQgbXRycl9hZGRfcGFnZSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgCiAJCSAgdW5zaWduZWQgaW50IHR5cGUsIGNoYXIgaW5jcmVtZW50KQogewotCWludCBpOworCWludCBpLCByZXBsYWNlLCBlcnJvcjsKIAltdHJyX3R5cGUgbHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBsYmFzZTsKLQl1bnNpZ25lZCBpbnQgbHNpemU7Ci0JaW50IGVycm9yOworCXVuc2lnbmVkIGxvbmcgbGJhc2UsIGxzaXplOwogCiAJaWYgKCFtdHJyX2lmKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMzI0LDEyICszMzMsMTggQEAKIAkJcmV0dXJuIC1FTk9TWVM7CiAJfQogCisJaWYgKCFzaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IHplcm8gc2l6ZWQgcmVxdWVzdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmIChiYXNlICYgc2l6ZV9vcl9tYXNrIHx8IHNpemUgJiBzaXplX29yX21hc2spIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogYmFzZSBvciBzaXplIGV4Y2VlZHMgdGhlIE1UUlIgd2lkdGhcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAllcnJvciA9IC1FSU5WQUw7CisJcmVwbGFjZSA9IC0xOwogCiAJLyogTm8gQ1BVIGhvdHBsdWcgd2hlbiB3ZSBjaGFuZ2UgTVRSUiBlbnRyaWVzICovCiAJbG9ja19jcHVfaG90cGx1ZygpOwpAQCAtMzM3LDIxICszNTIsMjggQEAKIAltdXRleF9sb2NrKCZtdHJyX211dGV4KTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7ICsraSkgewogCQltdHJyX2lmLT5nZXQoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7Ci0JCWlmIChiYXNlID49IGxiYXNlICsgbHNpemUpCi0JCQljb250aW51ZTsKLQkJaWYgKChiYXNlIDwgbGJhc2UpICYmIChiYXNlICsgc2l6ZSA8PSBsYmFzZSkpCisJCWlmICghbHNpemUgfHwgYmFzZSA+IGxiYXNlICsgbHNpemUgLSAxIHx8IGJhc2UgKyBzaXplIC0gMSA8IGxiYXNlKQogCQkJY29udGludWU7CiAJCS8qICBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlcmUgaXMgc29tZSBraW5kIG9mIG92ZXJsYXAvZW5jbG9zdXJlICAqLwotCQlpZiAoKGJhc2UgPCBsYmFzZSkgfHwgKGJhc2UgKyBzaXplID4gbGJhc2UgKyBsc2l6ZSkpIHsKKwkJaWYgKGJhc2UgPCBsYmFzZSB8fCBiYXNlICsgc2l6ZSAtIDEgPiBsYmFzZSArIGxzaXplIC0gMSkgeworCQkJaWYgKGJhc2UgPD0gbGJhc2UgJiYgYmFzZSArIHNpemUgLSAxID49IGxiYXNlICsgbHNpemUgLSAxKSB7CisJCQkJLyogIE5ldyByZWdpb24gZW5jbG9zZXMgYW4gZXhpc3RpbmcgcmVnaW9uICAqLworCQkJCWlmICh0eXBlID09IGx0eXBlKSB7CisJCQkJCXJlcGxhY2UgPSByZXBsYWNlID09IC0xID8gaSA6IC0yOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJZWxzZSBpZiAodHlwZXNfY29tcGF0aWJsZSh0eXBlLCBsdHlwZSkpCisJCQkJCWNvbnRpbnVlOworCQkJfQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICJtdHJyOiAweCVseDAwMCwweCVseDAwMCBvdmVybGFwcyBleGlzdGluZyIKLQkJCSAgICAgICAiIDB4JWx4MDAwLDB4JXgwMDBcbiIsIGJhc2UsIHNpemUsIGxiYXNlLAorCQkJICAgICAgICIgMHglbHgwMDAsMHglbHgwMDBcbiIsIGJhc2UsIHNpemUsIGxiYXNlLAogCQkJICAgICAgIGxzaXplKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCS8qICBOZXcgcmVnaW9uIGlzIGVuY2xvc2VkIGJ5IGFuIGV4aXN0aW5nIHJlZ2lvbiAgKi8KIAkJaWYgKGx0eXBlICE9IHR5cGUpIHsKLQkJCWlmICh0eXBlID09IE1UUlJfVFlQRV9VTkNBQ0hBQkxFKQorCQkJaWYgKHR5cGVzX2NvbXBhdGlibGUodHlwZSwgbHR5cGUpKQogCQkJCWNvbnRpbnVlOwogCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm10cnI6IHR5cGUgbWlzbWF0Y2ggZm9yICVseDAwMCwlbHgwMDAgb2xkOiAlcyBuZXc6ICVzXG4iLAogCQkJICAgICBiYXNlLCBzaXplLCBtdHJyX2F0dHJpYl90b19zdHIobHR5cGUpLApAQCAtMzY0LDEwICszODYsMTggQEAKIAkJZ290byBvdXQ7CiAJfQogCS8qICBTZWFyY2ggZm9yIGFuIGVtcHR5IE1UUlIgICovCi0JaSA9IG10cnJfaWYtPmdldF9mcmVlX3JlZ2lvbihiYXNlLCBzaXplKTsKKwlpID0gbXRycl9pZi0+Z2V0X2ZyZWVfcmVnaW9uKGJhc2UsIHNpemUsIHJlcGxhY2UpOwogCWlmIChpID49IDApIHsKIAkJc2V0X210cnIoaSwgYmFzZSwgc2l6ZSwgdHlwZSk7Ci0JCXVzYWdlX3RhYmxlW2ldID0gMTsKKwkJaWYgKGxpa2VseShyZXBsYWNlIDwgMCkpCisJCQl1c2FnZV90YWJsZVtpXSA9IDE7CisJCWVsc2UgeworCQkJdXNhZ2VfdGFibGVbaV0gPSB1c2FnZV90YWJsZVtyZXBsYWNlXSArICEhaW5jcmVtZW50OworCQkJaWYgKHVubGlrZWx5KHJlcGxhY2UgIT0gaSkpIHsKKwkJCQlzZXRfbXRycihyZXBsYWNlLCAwLCAwLCAwKTsKKwkJCQl1c2FnZV90YWJsZVtyZXBsYWNlXSA9IDA7CisJCQl9CisJCX0KIAl9IGVsc2UKIAkJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogbm8gbW9yZSBNVFJScyBhdmFpbGFibGVcbiIpOwogCWVycm9yID0gaTsKQEAgLTQ1NSw4ICs0ODUsNyBAQAogewogCWludCBpLCBtYXg7CiAJbXRycl90eXBlIGx0eXBlOwotCXVuc2lnbmVkIGxvbmcgbGJhc2U7Ci0JdW5zaWduZWQgaW50IGxzaXplOworCXVuc2lnbmVkIGxvbmcgbGJhc2UsIGxzaXplOwogCWludCBlcnJvciA9IC1FSU5WQUw7CiAKIAlpZiAoIW10cnJfaWYpCkBAIC01NDQsOSArNTczLDExIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2lmcyh2b2lkKQogeworI2lmbmRlZiBDT05GSUdfWDg2XzY0CiAJYW1kX2luaXRfbXRycigpOwogCWN5cml4X2luaXRfbXRycigpOwogCWNlbnRhdXJfaW5pdF9tdHJyKCk7CisjZW5kaWYKIH0KIAogLyogVGhlIHN1c3BlbmQvcmVzdW1lIG1ldGhvZHMgYXJlIG9ubHkgZm9yIENQVSB3aXRob3V0IE1UUlIuIENQVSB1c2luZyBnZW5lcmljCkBAIC01NTUsNyArNTg2LDcgQEAKIHN0cnVjdCBtdHJyX3ZhbHVlIHsKIAltdHJyX3R5cGUJbHR5cGU7CiAJdW5zaWduZWQgbG9uZwlsYmFzZTsKLQl1bnNpZ25lZCBpbnQJbHNpemU7CisJdW5zaWduZWQgbG9uZwlsc2l6ZTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXRycl92YWx1ZSAqIG10cnJfc3RhdGU7CkBAIC01NjUsMTAgKzU5Niw4IEBACiAJaW50IGk7CiAJaW50IHNpemUgPSBudW1fdmFyX3JhbmdlcyAqIHNpemVvZihzdHJ1Y3QgbXRycl92YWx1ZSk7CiAKLQltdHJyX3N0YXRlID0ga21hbGxvYyhzaXplLEdGUF9BVE9NSUMpOwotCWlmIChtdHJyX3N0YXRlKQotCQltZW1zZXQobXRycl9zdGF0ZSwwLHNpemUpOwotCWVsc2UKKwltdHJyX3N0YXRlID0ga3phbGxvYyhzaXplLEdGUF9BVE9NSUMpOworCWlmICghbXRycl9zdGF0ZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7IGkrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaAppbmRleCA5OWM5ZjI2Li5kNjFlYTlkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaApAQCAtNDMsMTUgKzQzLDE2IEBACiAJdm9pZAkoKnNldF9hbGwpKHZvaWQpOwogCiAJdm9pZAkoKmdldCkodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgbXRycl90eXBlICogdHlwZSk7Ci0JaW50CSgqZ2V0X2ZyZWVfcmVnaW9uKSAodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpOwotCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKTsKKwlpbnQJKCpnZXRfZnJlZV9yZWdpb24pKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgIGludCByZXBsYWNlX3JlZyk7CiAJaW50CSgqdmFsaWRhdGVfYWRkX3BhZ2UpKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHR5cGUpOwogCWludAkoKmhhdmVfd3Jjb21iKSh2b2lkKTsKIH07CiAKLWV4dGVybiBpbnQgZ2VuZXJpY19nZXRfZnJlZV9yZWdpb24odW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCBnZW5lcmljX2dldF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICBpbnQgcmVwbGFjZV9yZWcpOwogZXh0ZXJuIGludCBnZW5lcmljX3ZhbGlkYXRlX2FkZF9wYWdlKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHR5cGUpOwogCkBAIC02MiwxNyArNjMsMTcgQEAKIC8qIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMgcm91dGluZXMgKi8KIHN0cnVjdCBzZXRfbXRycl9jb250ZXh0IHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZGVmdHlwZV9sbzsKLQl1bnNpZ25lZCBsb25nIGRlZnR5cGVfaGk7CiAJdW5zaWduZWQgbG9uZyBjcjR2YWw7Ci0JdW5zaWduZWQgbG9uZyBjY3IzOworCXUzMiBkZWZ0eXBlX2xvOworCXUzMiBkZWZ0eXBlX2hpOworCXUzMiBjY3IzOwogfTsKIAogc3RydWN0IG10cnJfdmFyX3JhbmdlIHsKLQl1bnNpZ25lZCBsb25nIGJhc2VfbG87Ci0JdW5zaWduZWQgbG9uZyBiYXNlX2hpOwotCXVuc2lnbmVkIGxvbmcgbWFza19sbzsKLQl1bnNpZ25lZCBsb25nIG1hc2tfaGk7CisJdTMyIGJhc2VfbG87CisJdTMyIGJhc2VfaGk7CisJdTMyIG1hc2tfbG87CisJdTMyIG1hc2tfaGk7CiB9OwogCiB2b2lkIHNldF9tdHJyX2RvbmUoc3RydWN0IHNldF9tdHJyX2NvbnRleHQgKmN0eHQpOwpAQCAtOTIsNiArOTMsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fdmFyX3JhbmdlczsKIAogdm9pZCBtdHJyX3N0YXRlX3dhcm4odm9pZCk7Ci1jaGFyICptdHJyX2F0dHJpYl90b19zdHIoaW50IHgpOworY29uc3QgY2hhciAqbXRycl9hdHRyaWJfdG9fc3RyKGludCB4KTsKIHZvaWQgbXRycl93cm1zcih1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jCmluZGV4IDc2YWFjMDguLjY2MjRkODUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Byb2MuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMKQEAgLTE1Miw5ICsxNTIsMTAgQEAKIAkJCQlzZXFfcHJpbnRmKG0sICIgWyVkXSIsIGkpOwogCQl9CiAKLQlzZXFfcHJpbnRmKG0sICJcbmJvZ29taXBzXHQ6ICVsdS4lMDJsdVxuXG4iLAorCXNlcV9wcmludGYobSwgIlxuYm9nb21pcHNcdDogJWx1LiUwMmx1XG4iLAogCQkgICAgIGMtPmxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKIAkJICAgICAoYy0+bG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDApOworCXNlcV9wcmludGYobSwgImNsZmx1c2ggc2l6ZVx0OiAldVxuXG4iLCBjLT54ODZfY2xmbHVzaF9zaXplKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jCmluZGV4IGZkZThiZWEuLjUxMTMwYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1aWQuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdWlkLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CkBAIC0xMTcsNyArMTE2LDcgQEAKIAljaGFyIF9fdXNlciAqdG1wID0gYnVmOwogCXUzMiBkYXRhWzRdOwogCXUzMiByZWcgPSAqcHBvczsKLQlpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCiAJaWYgKGNvdW50ICUgMTYpCiAJCXJldHVybiAtRUlOVkFMOwkvKiBJbnZhbGlkIGNodW5rIHNpemUgKi8KQEAgLTEzNSw3ICsxMzQsNyBAQAogCiBzdGF0aWMgaW50IGNwdWlkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJdW5zaWduZWQgaW50IGNwdSA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmKGNwdV9kYXRhKVtjcHVdOwogCiAJaWYgKGNwdSA+PSBOUl9DUFVTIHx8ICFjcHVfb25saW5lKGNwdSkpCkBAIC0xNTYsMjggKzE1NSwyNyBAQAogCS5vcGVuID0gY3B1aWRfb3BlbiwKIH07CiAKLXN0YXRpYyBpbnQgY3B1aWRfY2xhc3NfZGV2aWNlX2NyZWF0ZShpbnQgaSkKK3N0YXRpYyBpbnQgY3B1aWRfZGV2aWNlX2NyZWF0ZShpbnQgaSkKIHsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19lcnI7CisJc3RydWN0IGRldmljZSAqZGV2OwogCi0JY2xhc3NfZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShjcHVpZF9jbGFzcywgTlVMTCwgTUtERVYoQ1BVSURfTUFKT1IsIGkpLCBOVUxMLCAiY3B1JWQiLGkpOwotCWlmIChJU19FUlIoY2xhc3NfZXJyKSkKLQkJZXJyID0gUFRSX0VSUihjbGFzc19lcnIpOworCWRldiA9IGRldmljZV9jcmVhdGUoY3B1aWRfY2xhc3MsIE5VTEwsIE1LREVWKENQVUlEX01BSk9SLCBpKSwgImNwdSVkIixpKTsKKwlpZiAoSVNfRVJSKGRldikpCisJCWVyciA9IFBUUl9FUlIoZGV2KTsKIAlyZXR1cm4gZXJyOwogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgaW50IGNwdWlkX2NsYXNzX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX09OTElORToKLQkJY3B1aWRfY2xhc3NfZGV2aWNlX2NyZWF0ZShjcHUpOworCQljcHVpZF9kZXZpY2VfY3JlYXRlKGNwdSk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX0RFQUQ6Ci0JCWNsYXNzX2RldmljZV9kZXN0cm95KGNwdWlkX2NsYXNzLCBNS0RFVihDUFVJRF9NQUpPUiwgY3B1KSk7CisJCWRldmljZV9kZXN0cm95KGNwdWlkX2NsYXNzLCBNS0RFVihDUFVJRF9NQUpPUiwgY3B1KSk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gTk9USUZZX09LOwpAQCAtMTg3LDcgKzE4NSw2IEBACiB7CiAJLm5vdGlmaWVyX2NhbGwgPSBjcHVpZF9jbGFzc19jcHVfY2FsbGJhY2ssCiB9OwotI2VuZGlmIC8qICFDT05GSUdfSE9UUExVR19DUFUgKi8KIAogc3RhdGljIGludCBfX2luaXQgY3B1aWRfaW5pdCh2b2lkKQogewpAQCAtMjA2LDcgKzIwMyw3IEBACiAJCWdvdG8gb3V0X2NocmRldjsKIAl9CiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCWVyciA9IGNwdWlkX2NsYXNzX2RldmljZV9jcmVhdGUoaSk7CisJCWVyciA9IGNwdWlkX2RldmljZV9jcmVhdGUoaSk7CiAJCWlmIChlcnIgIT0gMCkgCiAJCQlnb3RvIG91dF9jbGFzczsKIAl9CkBAIC0yMTgsNyArMjE1LDcgQEAKIG91dF9jbGFzczoKIAlpID0gMDsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koY3B1aWRfY2xhc3MsIE1LREVWKENQVUlEX01BSk9SLCBpKSk7CisJCWRldmljZV9kZXN0cm95KGNwdWlkX2NsYXNzLCBNS0RFVihDUFVJRF9NQUpPUiwgaSkpOwogCX0KIAljbGFzc19kZXN0cm95KGNwdWlkX2NsYXNzKTsKIG91dF9jaHJkZXY6CkBAIC0yMzIsNyArMjI5LDcgQEAKIAlpbnQgY3B1ID0gMDsKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQljbGFzc19kZXZpY2VfZGVzdHJveShjcHVpZF9jbGFzcywgTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOworCQlkZXZpY2VfZGVzdHJveShjcHVpZF9jbGFzcywgTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOwogCWNsYXNzX2Rlc3Ryb3koY3B1aWRfY2xhc3MpOwogCXVucmVnaXN0ZXJfY2hyZGV2KENQVUlEX01BSk9SLCAiY3B1L2NwdWlkIik7CiAJdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmNwdWlkX2NsYXNzX2NwdV9ub3RpZmllcik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMgYi9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMKaW5kZXggMTQ0YjQzMi4uYTVlMGU5OSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYwpAQCAtMzEsNjggKzMxLDYgQEAKIC8qIFRoaXMga2VlcHMgYSB0cmFjayBvZiB3aGljaCBvbmUgaXMgY3Jhc2hpbmcgY3B1LiAqLwogc3RhdGljIGludCBjcmFzaGluZ19jcHU7CiAKLXN0YXRpYyB1MzIgKmFwcGVuZF9lbGZfbm90ZSh1MzIgKmJ1ZiwgY2hhciAqbmFtZSwgdW5zaWduZWQgdHlwZSwgdm9pZCAqZGF0YSwKLQkJCQkJCQkgICAgICAgc2l6ZV90IGRhdGFfbGVuKQotewotCXN0cnVjdCBlbGZfbm90ZSBub3RlOwotCi0Jbm90ZS5uX25hbWVzeiA9IHN0cmxlbihuYW1lKSArIDE7Ci0Jbm90ZS5uX2Rlc2NzeiA9IGRhdGFfbGVuOwotCW5vdGUubl90eXBlICAgPSB0eXBlOwotCW1lbWNweShidWYsICZub3RlLCBzaXplb2Yobm90ZSkpOwotCWJ1ZiArPSAoc2l6ZW9mKG5vdGUpICszKS80OwotCW1lbWNweShidWYsIG5hbWUsIG5vdGUubl9uYW1lc3opOwotCWJ1ZiArPSAobm90ZS5uX25hbWVzeiArIDMpLzQ7Ci0JbWVtY3B5KGJ1ZiwgZGF0YSwgbm90ZS5uX2Rlc2Nzeik7Ci0JYnVmICs9IChub3RlLm5fZGVzY3N6ICsgMykvNDsKLQotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbmFsX25vdGUodTMyICpidWYpCi17Ci0Jc3RydWN0IGVsZl9ub3RlIG5vdGU7Ci0KLQlub3RlLm5fbmFtZXN6ID0gMDsKLQlub3RlLm5fZGVzY3N6ID0gMDsKLQlub3RlLm5fdHlwZSAgID0gMDsKLQltZW1jcHkoYnVmLCAmbm90ZSwgc2l6ZW9mKG5vdGUpKTsKLX0KLQotc3RhdGljIHZvaWQgY3Jhc2hfc2F2ZV90aGlzX2NwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgZWxmX3Byc3RhdHVzIHByc3RhdHVzOwotCXUzMiAqYnVmOwotCi0JaWYgKChjcHUgPCAwKSB8fCAoY3B1ID49IE5SX0NQVVMpKQotCQlyZXR1cm47Ci0KLQkvKiBVc2luZyBFTEYgbm90ZXMgaGVyZSBpcyBvcHBvcnR1bmlzdGljLgotCSAqIEkgbmVlZCBhIHdlbGwgZGVmaW5lZCBzdHJ1Y3R1cmUgZm9ybWF0Ci0JICogZm9yIHRoZSBkYXRhIEkgcGFzcywgYW5kIEkgbmVlZCB0YWdzCi0JICogb24gdGhlIGRhdGEgdG8gaW5kaWNhdGUgd2hhdCBpbmZvcm1hdGlvbiBJIGhhdmUKLQkgKiBzcXVpcnJlbGxlZCBhd2F5LiAgRUxGIG5vdGVzIGhhcHBlbiB0byBwcm92aWRlCi0JICogYWxsIG9mIHRoYXQsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW52ZW50IHNvbWV0aGluZyBuZXcuCi0JICovCi0JYnVmID0gKHUzMiopcGVyX2NwdV9wdHIoY3Jhc2hfbm90ZXMsIGNwdSk7Ci0JaWYgKCFidWYpCi0JCXJldHVybjsKLQltZW1zZXQoJnByc3RhdHVzLCAwLCBzaXplb2YocHJzdGF0dXMpKTsKLQlwcnN0YXR1cy5wcl9waWQgPSBjdXJyZW50LT5waWQ7Ci0JZWxmX2NvcmVfY29weV9yZWdzKCZwcnN0YXR1cy5wcl9yZWcsIHJlZ3MpOwotCWJ1ZiA9IGFwcGVuZF9lbGZfbm90ZShidWYsICJDT1JFIiwgTlRfUFJTVEFUVVMsICZwcnN0YXR1cywKLQkJCQlzaXplb2YocHJzdGF0dXMpKTsKLQlmaW5hbF9ub3RlKGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNyYXNoX3NhdmVfc2VsZihzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgY3B1OwotCi0JY3B1ID0gc2FmZV9zbXBfcHJvY2Vzc29yX2lkKCk7Ci0JY3Jhc2hfc2F2ZV90aGlzX2NwdShyZWdzLCBjcHUpOwotfQotCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19YODZfTE9DQUxfQVBJQykKIHN0YXRpYyBhdG9taWNfdCB3YWl0aW5nX2Zvcl9jcmFzaF9pcGk7CiAKQEAgLTEyMSw3ICs1OSw3IEBACiAJCWNyYXNoX2ZpeHVwX3NzX2VzcCgmZml4ZWRfcmVncywgcmVncyk7CiAJCXJlZ3MgPSAmZml4ZWRfcmVnczsKIAl9Ci0JY3Jhc2hfc2F2ZV90aGlzX2NwdShyZWdzLCBjcHUpOworCWNyYXNoX3NhdmVfY3B1KHJlZ3MsIGNwdSk7CiAJZGlzYWJsZV9sb2NhbF9BUElDKCk7CiAJYXRvbWljX2RlYygmd2FpdGluZ19mb3JfY3Jhc2hfaXBpKTsKIAkvKiBBc3N1bWUgaGx0IHdvcmtzICovCkBAIC0xOTUsNSArMTMzLDUgQEAKICNpZiBkZWZpbmVkKENPTkZJR19YODZfSU9fQVBJQykKIAlkaXNhYmxlX0lPX0FQSUMoKTsKICNlbmRpZgotCWNyYXNoX3NhdmVfc2VsZihyZWdzKTsKKwljcmFzaF9zYXZlX2NwdShyZWdzLCBzYWZlX3NtcF9wcm9jZXNzb3JfaWQoKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2U4MjAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvZTgyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2QwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2U4MjAuYwpAQCAtMCwwICsxLDg5NCBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisKKyNpZmRlZiBDT05GSUdfRUZJCitpbnQgZWZpX2VuYWJsZWQgPSAwOworRVhQT1JUX1NZTUJPTChlZmlfZW5hYmxlZCk7CisjZW5kaWYKKworc3RydWN0IGU4MjBtYXAgZTgyMDsKK3N0cnVjdCBjaGFuZ2VfbWVtYmVyIHsKKwlzdHJ1Y3QgZTgyMGVudHJ5ICpwYmlvczsgLyogcG9pbnRlciB0byBvcmlnaW5hbCBiaW9zIGVudHJ5ICovCisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7IC8qIGFkZHJlc3MgZm9yIHRoaXMgY2hhbmdlIHBvaW50ICovCit9Oworc3RhdGljIHN0cnVjdCBjaGFuZ2VfbWVtYmVyIGNoYW5nZV9wb2ludF9saXN0WzIqRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3BvaW50WzIqRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5ICpvdmVybGFwX2xpc3RbRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5IG5ld19iaW9zW0U4MjBNQVhdIF9faW5pdGRhdGE7CisvKiBGb3IgUENJIG9yIG90aGVyIG1lbW9yeS1tYXBwZWQgcmVzb3VyY2VzICovCit1bnNpZ25lZCBsb25nIHBjaV9tZW1fc3RhcnQgPSAweDEwMDAwMDAwOworI2lmZGVmIENPTkZJR19QQ0kKK0VYUE9SVF9TWU1CT0wocGNpX21lbV9zdGFydCk7CisjZW5kaWYKK2V4dGVybiBpbnQgdXNlcl9kZWZpbmVkX21lbW1hcDsKK3N0cnVjdCByZXNvdXJjZSBkYXRhX3Jlc291cmNlID0geworCS5uYW1lCT0gIktlcm5lbCBkYXRhIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdHJ1Y3QgcmVzb3VyY2UgY29kZV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJLZXJuZWwgY29kZSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzeXN0ZW1fcm9tX3Jlc291cmNlID0geworCS5uYW1lCT0gIlN5c3RlbSBST00iLAorCS5zdGFydAk9IDB4ZjAwMDAsCisJLmVuZAk9IDB4ZmZmZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGV4dGVuc2lvbl9yb21fcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAiRXh0ZW5zaW9uIFJPTSIsCisJLnN0YXJ0CT0gMHhlMDAwMCwKKwkuZW5kCT0gMHhlZmZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWRhcHRlcl9yb21fcmVzb3VyY2VzW10gPSB7IHsKKwkubmFtZSAJPSAiQWRhcHRlciBST00iLAorCS5zdGFydAk9IDB4YzgwMDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9LCB7CisJLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfSwgeworCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK30sIHsKKwkubmFtZSAJPSAiQWRhcHRlciBST00iLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9LCB7CisJLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfSwgeworCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK30gfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2aWRlb19yb21fcmVzb3VyY2UgPSB7CisJLm5hbWUgCT0gIlZpZGVvIFJPTSIsCisJLnN0YXJ0CT0gMHhjMDAwMCwKKwkuZW5kCT0gMHhjN2ZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdmlkZW9fcmFtX3Jlc291cmNlID0geworCS5uYW1lCT0gIlZpZGVvIFJBTSBhcmVhIiwKKwkuc3RhcnQJPSAweGEwMDAwLAorCS5lbmQJPSAweGJmZmZmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHN0YW5kYXJkX2lvX3Jlc291cmNlc1tdID0geyB7CisJLm5hbWUJPSAiZG1hMSIsCisJLnN0YXJ0CT0gMHgwMDAwLAorCS5lbmQJPSAweDAwMWYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSwgeworCS5uYW1lCT0gInBpYzEiLAorCS5zdGFydAk9IDB4MDAyMCwKKwkuZW5kCT0gMHgwMDIxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZSAgID0gInRpbWVyMCIsCisJLnN0YXJ0CT0gMHgwMDQwLAorCS5lbmQgICAgPSAweDAwNDMsCisJLmZsYWdzICA9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZSAgID0gInRpbWVyMSIsCisJLnN0YXJ0ICA9IDB4MDA1MCwKKwkuZW5kICAgID0gMHgwMDUzLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJrZXlib2FyZCIsCisJLnN0YXJ0CT0gMHgwMDYwLAorCS5lbmQJPSAweDAwNmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSwgeworCS5uYW1lCT0gImRtYSBwYWdlIHJlZyIsCisJLnN0YXJ0CT0gMHgwMDgwLAorCS5lbmQJPSAweDAwOGYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSwgeworCS5uYW1lCT0gInBpYzIiLAorCS5zdGFydAk9IDB4MDBhMCwKKwkuZW5kCT0gMHgwMGExLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJkbWEyIiwKKwkuc3RhcnQJPSAweDAwYzAsCisJLmVuZAk9IDB4MDBkZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUJPSAiZnB1IiwKKwkuc3RhcnQJPSAweDAwZjAsCisJLmVuZAk9IDB4MDBmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9IH07CisKK3N0YXRpYyBpbnQgcm9tc2lnbmF0dXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKngpCit7CisJdW5zaWduZWQgc2hvcnQgc2lnOworCWludCByZXQgPSAwOworCWlmIChwcm9iZV9rZXJuZWxfYWRkcmVzcygoY29uc3QgdW5zaWduZWQgc2hvcnQgKil4LCBzaWcpID09IDApCisJCXJldCA9IChzaWcgPT0gMHhhYTU1KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCByb21jaGVja3N1bSh1bnNpZ25lZCBjaGFyICpyb20sIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCXVuc2lnbmVkIGNoYXIgKnAsIHN1bSA9IDA7CisKKwlmb3IgKHAgPSByb207IHAgPCByb20gKyBsZW5ndGg7IHArKykKKwkJc3VtICs9ICpwOworCXJldHVybiBzdW0gPT0gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHByb2JlX3JvbXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBsZW5ndGgsIHVwcGVyOworCXVuc2lnbmVkIGNoYXIgKnJvbTsKKwlpbnQJICAgICAgaTsKKworCS8qIHZpZGVvIHJvbSAqLworCXVwcGVyID0gYWRhcHRlcl9yb21fcmVzb3VyY2VzWzBdLnN0YXJ0OworCWZvciAoc3RhcnQgPSB2aWRlb19yb21fcmVzb3VyY2Uuc3RhcnQ7IHN0YXJ0IDwgdXBwZXI7IHN0YXJ0ICs9IDIwNDgpIHsKKwkJcm9tID0gaXNhX2J1c190b192aXJ0KHN0YXJ0KTsKKwkJaWYgKCFyb21zaWduYXR1cmUocm9tKSkKKwkJCWNvbnRpbnVlOworCisJCXZpZGVvX3JvbV9yZXNvdXJjZS5zdGFydCA9IHN0YXJ0OworCisJCS8qIDAgPCBsZW5ndGggPD0gMHg3ZiAqIDUxMiwgaGlzdG9yaWNhbGx5ICovCisJCWxlbmd0aCA9IHJvbVsyXSAqIDUxMjsKKworCQkvKiBpZiBjaGVja3N1bSBva2F5LCB0cnVzdCBsZW5ndGggYnl0ZSAqLworCQlpZiAobGVuZ3RoICYmIHJvbWNoZWNrc3VtKHJvbSwgbGVuZ3RoKSkKKwkJCXZpZGVvX3JvbV9yZXNvdXJjZS5lbmQgPSBzdGFydCArIGxlbmd0aCAtIDE7CisKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZ2aWRlb19yb21fcmVzb3VyY2UpOworCQlicmVhazsKKwl9CisKKwlzdGFydCA9ICh2aWRlb19yb21fcmVzb3VyY2UuZW5kICsgMSArIDIwNDcpICYgfjIwNDdVTDsKKwlpZiAoc3RhcnQgPCB1cHBlcikKKwkJc3RhcnQgPSB1cHBlcjsKKworCS8qIHN5c3RlbSByb20gKi8KKwlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnN5c3RlbV9yb21fcmVzb3VyY2UpOworCXVwcGVyID0gc3lzdGVtX3JvbV9yZXNvdXJjZS5zdGFydDsKKworCS8qIGNoZWNrIGZvciBleHRlbnNpb24gcm9tIChpZ25vcmUgbGVuZ3RoIGJ5dGUhKSAqLworCXJvbSA9IGlzYV9idXNfdG9fdmlydChleHRlbnNpb25fcm9tX3Jlc291cmNlLnN0YXJ0KTsKKwlpZiAocm9tc2lnbmF0dXJlKHJvbSkpIHsKKwkJbGVuZ3RoID0gZXh0ZW5zaW9uX3JvbV9yZXNvdXJjZS5lbmQgLSBleHRlbnNpb25fcm9tX3Jlc291cmNlLnN0YXJ0ICsgMTsKKwkJaWYgKHJvbWNoZWNrc3VtKHJvbSwgbGVuZ3RoKSkgeworCQkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZleHRlbnNpb25fcm9tX3Jlc291cmNlKTsKKwkJCXVwcGVyID0gZXh0ZW5zaW9uX3JvbV9yZXNvdXJjZS5zdGFydDsKKwkJfQorCX0KKworCS8qIGNoZWNrIGZvciBhZGFwdGVyIHJvbXMgb24gMmsgYm91bmRhcmllcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkYXB0ZXJfcm9tX3Jlc291cmNlcykgJiYgc3RhcnQgPCB1cHBlcjsgc3RhcnQgKz0gMjA0OCkgeworCQlyb20gPSBpc2FfYnVzX3RvX3ZpcnQoc3RhcnQpOworCQlpZiAoIXJvbXNpZ25hdHVyZShyb20pKQorCQkJY29udGludWU7CisKKwkJLyogMCA8IGxlbmd0aCA8PSAweDdmICogNTEyLCBoaXN0b3JpY2FsbHkgKi8KKwkJbGVuZ3RoID0gcm9tWzJdICogNTEyOworCisJCS8qIGJ1dCBhY2NlcHQgYW55IGxlbmd0aCB0aGF0IGZpdHMgaWYgY2hlY2tzdW0gb2theSAqLworCQlpZiAoIWxlbmd0aCB8fCBzdGFydCArIGxlbmd0aCA+IHVwcGVyIHx8ICFyb21jaGVja3N1bShyb20sIGxlbmd0aCkpCisJCQljb250aW51ZTsKKworCQlhZGFwdGVyX3JvbV9yZXNvdXJjZXNbaV0uc3RhcnQgPSBzdGFydDsKKwkJYWRhcHRlcl9yb21fcmVzb3VyY2VzW2ldLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZhZGFwdGVyX3JvbV9yZXNvdXJjZXNbaV0pOworCisJCXN0YXJ0ID0gYWRhcHRlcl9yb21fcmVzb3VyY2VzW2krK10uZW5kICYgfjIwNDdVTDsKKwl9Cit9CisKKy8qCisgKiBSZXF1ZXN0IGFkZHJlc3Mgc3BhY2UgZm9yIGFsbCBzdGFuZGFyZCBSQU0gYW5kIFJPTSByZXNvdXJjZXMKKyAqIGFuZCBhbHNvIGZvciByZWdpb25zIHJlcG9ydGVkIGFzIHJlc2VydmVkIGJ5IHRoZSBlODIwLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQKK2xlZ2FjeV9pbml0X2lvbWVtX3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKmNvZGVfcmVzb3VyY2UsIHN0cnVjdCByZXNvdXJjZSAqZGF0YV9yZXNvdXJjZSkKK3sKKwlpbnQgaTsKKworCXByb2JlX3JvbXMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKyNpZm5kZWYgQ09ORklHX1JFU09VUkNFU182NEJJVAorCQlpZiAoZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUgPiAweDEwMDAwMDAwMFVMTCkKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9BVE9NSUMpOworCQlzd2l0Y2ggKGU4MjAubWFwW2ldLnR5cGUpIHsKKwkJY2FzZSBFODIwX1JBTToJcmVzLT5uYW1lID0gIlN5c3RlbSBSQU0iOyBicmVhazsKKwkJY2FzZSBFODIwX0FDUEk6CXJlcy0+bmFtZSA9ICJBQ1BJIFRhYmxlcyI7IGJyZWFrOworCQljYXNlIEU4MjBfTlZTOglyZXMtPm5hbWUgPSAiQUNQSSBOb24tdm9sYXRpbGUgU3RvcmFnZSI7IGJyZWFrOworCQlkZWZhdWx0OglyZXMtPm5hbWUgPSAicmVzZXJ2ZWQiOworCQl9CisJCXJlcy0+c3RhcnQgPSBlODIwLm1hcFtpXS5hZGRyOworCQlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyBlODIwLm1hcFtpXS5zaXplIC0gMTsKKwkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOworCQlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcykpIHsKKwkJCWtmcmVlKHJlcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZTgyMC5tYXBbaV0udHlwZSA9PSBFODIwX1JBTSkgeworCQkJLyoKKwkJCSAqICBXZSBkb24ndCBrbm93IHdoaWNoIFJBTSByZWdpb24gY29udGFpbnMga2VybmVsIGRhdGEsCisJCQkgKiAgc28gd2UgdHJ5IGl0IHJlcGVhdGVkbHkgYW5kIGxldCB0aGUgcmVzb3VyY2UgbWFuYWdlcgorCQkJICogIHRlc3QgaXQuCisJCQkgKi8KKwkJCXJlcXVlc3RfcmVzb3VyY2UocmVzLCBjb2RlX3Jlc291cmNlKTsKKwkJCXJlcXVlc3RfcmVzb3VyY2UocmVzLCBkYXRhX3Jlc291cmNlKTsKKyNpZmRlZiBDT05GSUdfS0VYRUMKKwkJCXJlcXVlc3RfcmVzb3VyY2UocmVzLCAmY3Jhc2hrX3Jlcyk7CisjZW5kaWYKKwkJfQorCX0KK30KKworLyoKKyAqIFJlcXVlc3QgYWRkcmVzcyBzcGFjZSBmb3IgYWxsIHN0YW5kYXJkIHJlc291cmNlcworICoKKyAqIFRoaXMgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHBjaWJpb3NfaW5pdCgpLCB3aGljaCBpcyBhbHNvIGEKKyAqIHN1YnN5c19pbml0Y2FsbCwgYnV0IGlzIGxpbmtlZCBpbiBsYXRlciAoaW4gYXJjaC9pMzg2L3BjaS9jb21tb24uYykuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJlcXVlc3Rfc3RhbmRhcmRfcmVzb3VyY2VzKHZvaWQpCit7CisJaW50IGk7CisKKwlwcmludGsoIlNldHRpbmcgdXAgc3RhbmRhcmQgUENJIHJlc291cmNlc1xuIik7CisJaWYgKGVmaV9lbmFibGVkKQorCQllZmlfaW5pdGlhbGl6ZV9pb21lbV9yZXNvdXJjZXMoJmNvZGVfcmVzb3VyY2UsICZkYXRhX3Jlc291cmNlKTsKKwllbHNlCisJCWxlZ2FjeV9pbml0X2lvbWVtX3Jlc291cmNlcygmY29kZV9yZXNvdXJjZSwgJmRhdGFfcmVzb3VyY2UpOworCisJLyogRUZJIHN5c3RlbXMgbWF5IHN0aWxsIGhhdmUgVkdBICovCisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZ2aWRlb19yYW1fcmVzb3VyY2UpOworCisJLyogcmVxdWVzdCBJL08gc3BhY2UgZm9yIGRldmljZXMgdXNlZCBvbiBhbGwgaVszNDVdODYgUENzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhbmRhcmRfaW9fcmVzb3VyY2VzKTsgaSsrKQorCQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZzdGFuZGFyZF9pb19yZXNvdXJjZXNbaV0pOworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwocmVxdWVzdF9zdGFuZGFyZF9yZXNvdXJjZXMpOworCit2b2lkIF9faW5pdCBhZGRfbWVtb3J5X3JlZ2lvbih1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgaW50IHR5cGUpCit7CisJaW50IHg7CisKKwlpZiAoIWVmaV9lbmFibGVkKSB7CisgICAgICAgCQl4ID0gZTgyMC5ucl9tYXA7CisKKwkJaWYgKHggPT0gRTgyME1BWCkgeworCQkgICAgcHJpbnRrKEtFUk5fRVJSICJPb29wcyEgVG9vIG1hbnkgZW50cmllcyBpbiB0aGUgbWVtb3J5IG1hcCFcbiIpOworCQkgICAgcmV0dXJuOworCQl9CisKKwkJZTgyMC5tYXBbeF0uYWRkciA9IHN0YXJ0OworCQllODIwLm1hcFt4XS5zaXplID0gc2l6ZTsKKwkJZTgyMC5tYXBbeF0udHlwZSA9IHR5cGU7CisJCWU4MjAubnJfbWFwKys7CisJfQorfSAvKiBhZGRfbWVtb3J5X3JlZ2lvbiAqLworCisvKgorICogU2FuaXRpemUgdGhlIEJJT1MgZTgyMCBtYXAuCisgKgorICogU29tZSBlODIwIHJlc3BvbnNlcyBpbmNsdWRlIG92ZXJsYXBwaW5nIGVudHJpZXMuICBUaGUgZm9sbG93aW5nCisgKiByZXBsYWNlcyB0aGUgb3JpZ2luYWwgZTgyMCBtYXAgd2l0aCBhIG5ldyBvbmUsIHJlbW92aW5nIG92ZXJsYXBzLgorICoKKyAqLworaW50IF9faW5pdCBzYW5pdGl6ZV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgY2hhciAqIHBucl9tYXApCit7CisJc3RydWN0IGNoYW5nZV9tZW1iZXIgKmNoYW5nZV90bXA7CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X3R5cGUsIGxhc3RfdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9hZGRyOworCWludCBjaGdpZHgsIHN0aWxsX2NoYW5naW5nOworCWludCBvdmVybGFwX2VudHJpZXM7CisJaW50IG5ld19iaW9zX2VudHJ5OworCWludCBvbGRfbnIsIG5ld19uciwgY2hnX25yOworCWludCBpOworCisJLyoKKwkJVmlzdWFsbHkgd2UncmUgcGVyZm9ybWluZyB0aGUgZm9sbG93aW5nICgxLDIsMyw0ID0gbWVtb3J5IHR5cGVzKS4uLgorCisJCVNhbXBsZSBtZW1vcnkgbWFwICh3L292ZXJsYXBzKToKKwkJICAgX19fXzIyX19fX19fX19fX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fX180XworCQkgICBfX19fMTExMV9fX19fX19fX19fX19fX18KKwkJICAgXzQ0X19fX19fX19fX19fX19fX19fX19fCisJCSAgIDExMTExMTExX19fX19fX19fX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fXzMzX18KKwkJICAgX19fX19fX19fX180NF9fX19fX19fX19fCisJCSAgIF9fX19fX19fX18zMzMzM19fX19fX19fXworCQkgICBfX19fX19fX19fX19fXzIyX19fX19fX18KKwkJICAgX19fX19fX19fX19fX19fX19fXzIyMjJfCisJCSAgIF9fX19fX19fXzExMTExMTExMV9fX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fX18xMV8KKwkJICAgX19fX19fX19fX19fX19fX180X19fX19fCisKKwkJU2FuaXRpemVkIGVxdWl2YWxlbnQgKG5vIG92ZXJsYXApOgorCQkgICAxX19fX19fX19fX19fX19fX19fX19fX18KKwkJICAgXzQ0X19fX19fX19fX19fX19fX19fX19fCisJCSAgIF9fXzFfX19fX19fX19fX19fX19fX19fXworCQkgICBfX19fMjJfX19fX19fX19fX19fX19fX18KKwkJICAgX19fX19fMTFfX19fX19fX19fX19fX19fCisJCSAgIF9fX19fX19fXzFfX19fX19fX19fX19fXworCQkgICBfX19fX19fX19fM19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fX180NF9fX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX18zM19fX19fX19fXworCQkgICBfX19fX19fX19fX19fX18yX19fX19fX18KKwkJICAgX19fX19fX19fX19fX19fXzFfX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fNF9fX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fMl9fX18KKwkJICAgX19fX19fX19fX19fX19fX19fX18zM19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fX180XworCSovCisJcHJpbnRrKCJzYW5pdGl6ZSBzdGFydFxuIik7CisJLyogaWYgdGhlcmUncyBvbmx5IG9uZSBtZW1vcnkgcmVnaW9uLCBkb24ndCBib3RoZXIgKi8KKwlpZiAoKnBucl9tYXAgPCAyKSB7CisJCXByaW50aygic2FuaXRpemUgYmFpbCAwXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW9sZF9uciA9ICpwbnJfbWFwOworCisJLyogYmFpbCBvdXQgaWYgd2UgZmluZCBhbnkgdW5yZWFzb25hYmxlIGFkZHJlc3NlcyBpbiBiaW9zIG1hcCAqLworCWZvciAoaT0wOyBpPG9sZF9ucjsgaSsrKQorCQlpZiAoYmlvc21hcFtpXS5hZGRyICsgYmlvc21hcFtpXS5zaXplIDwgYmlvc21hcFtpXS5hZGRyKSB7CisJCQlwcmludGsoInNhbml0aXplIGJhaWwgMVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCS8qIGNyZWF0ZSBwb2ludGVycyBmb3IgaW5pdGlhbCBjaGFuZ2UtcG9pbnQgaW5mb3JtYXRpb24gKGZvciBzb3J0aW5nKSAqLworCWZvciAoaT0wOyBpIDwgMipvbGRfbnI7IGkrKykKKwkJY2hhbmdlX3BvaW50W2ldID0gJmNoYW5nZV9wb2ludF9saXN0W2ldOworCisJLyogcmVjb3JkIGFsbCBrbm93biBjaGFuZ2UtcG9pbnRzIChzdGFydGluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcyksCisJICAgb21pdHRpbmcgdGhvc2UgdGhhdCBhcmUgZm9yIGVtcHR5IG1lbW9yeSByZWdpb25zICovCisJY2hnaWR4ID0gMDsKKwlmb3IgKGk9MDsgaSA8IG9sZF9ucjsgaSsrKQl7CisJCWlmIChiaW9zbWFwW2ldLnNpemUgIT0gMCkgeworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPSBiaW9zbWFwW2ldLmFkZHI7CisJCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wYmlvcyA9ICZiaW9zbWFwW2ldOworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPSBiaW9zbWFwW2ldLmFkZHIgKyBiaW9zbWFwW2ldLnNpemU7CisJCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wYmlvcyA9ICZiaW9zbWFwW2ldOworCQl9CisJfQorCWNoZ19uciA9IGNoZ2lkeDsgICAgCS8qIHRydWUgbnVtYmVyIG9mIGNoYW5nZS1wb2ludHMgKi8KKworCS8qIHNvcnQgY2hhbmdlLXBvaW50IGxpc3QgYnkgbWVtb3J5IGFkZHJlc3NlcyAobG93IC0+IGhpZ2gpICovCisJc3RpbGxfY2hhbmdpbmcgPSAxOworCXdoaWxlIChzdGlsbF9jaGFuZ2luZykJeworCQlzdGlsbF9jaGFuZ2luZyA9IDA7CisJCWZvciAoaT0xOyBpIDwgY2hnX25yOyBpKyspICB7CisJCQkvKiBpZiA8Y3VycmVudF9hZGRyPiA+IDxsYXN0X2FkZHI+LCBzd2FwICovCisJCQkvKiBvciwgaWYgY3VycmVudD08c3RhcnRfYWRkcj4gJiBsYXN0PTxlbmRfYWRkcj4sIHN3YXAgKi8KKwkJCWlmICgoY2hhbmdlX3BvaW50W2ldLT5hZGRyIDwgY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpIHx8CisJCQkJKChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpICYmCisJCQkJIChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2ldLT5wYmlvcy0+YWRkcikgJiYKKwkJCQkgKGNoYW5nZV9wb2ludFtpLTFdLT5hZGRyICE9IGNoYW5nZV9wb2ludFtpLTFdLT5wYmlvcy0+YWRkcikpCisJCQkgICApCisJCQl7CisJCQkJY2hhbmdlX3RtcCA9IGNoYW5nZV9wb2ludFtpXTsKKwkJCQljaGFuZ2VfcG9pbnRbaV0gPSBjaGFuZ2VfcG9pbnRbaS0xXTsKKwkJCQljaGFuZ2VfcG9pbnRbaS0xXSA9IGNoYW5nZV90bXA7CisJCQkJc3RpbGxfY2hhbmdpbmc9MTsKKwkJCX0KKwkJfQorCX0KKworCS8qIGNyZWF0ZSBhIG5ldyBiaW9zIG1lbW9yeSBtYXAsIHJlbW92aW5nIG92ZXJsYXBzICovCisJb3ZlcmxhcF9lbnRyaWVzPTA7CSAvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgb3ZlcmxhcCB0YWJsZSAqLworCW5ld19iaW9zX2VudHJ5PTA7CSAvKiBpbmRleCBmb3IgY3JlYXRpbmcgbmV3IGJpb3MgbWFwIGVudHJpZXMgKi8KKwlsYXN0X3R5cGUgPSAwOwkJIC8qIHN0YXJ0IHdpdGggdW5kZWZpbmVkIG1lbW9yeSB0eXBlICovCisJbGFzdF9hZGRyID0gMDsJCSAvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCisJLyogbG9vcCB0aHJvdWdoIGNoYW5nZS1wb2ludHMsIGRldGVybWluaW5nIGFmZmVjdCBvbiB0aGUgbmV3IGJpb3MgbWFwICovCisJZm9yIChjaGdpZHg9MDsgY2hnaWR4IDwgY2hnX25yOyBjaGdpZHgrKykKKwl7CisJCS8qIGtlZXAgdHJhY2sgb2YgYWxsIG92ZXJsYXBwaW5nIGJpb3MgZW50cmllcyAqLworCQlpZiAoY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBiaW9zLT5hZGRyKQorCQl7CisJCQkvKiBhZGQgbWFwIGVudHJ5IHRvIG92ZXJsYXAgbGlzdCAoPiAxIGVudHJ5IGltcGxpZXMgYW4gb3ZlcmxhcCkgKi8KKwkJCW92ZXJsYXBfbGlzdFtvdmVybGFwX2VudHJpZXMrK109Y2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBiaW9zOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCAob3JkZXIgaW5kZXBlbmRlbnQsIHNvIHN3YXAgd2l0aCBsYXN0KSAqLworCQkJZm9yIChpPTA7IGk8b3ZlcmxhcF9lbnRyaWVzOyBpKyspCisJCQl7CisJCQkJaWYgKG92ZXJsYXBfbGlzdFtpXSA9PSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+cGJpb3MpCisJCQkJCW92ZXJsYXBfbGlzdFtpXSA9IG92ZXJsYXBfbGlzdFtvdmVybGFwX2VudHJpZXMtMV07CisJCQl9CisJCQlvdmVybGFwX2VudHJpZXMtLTsKKwkJfQorCQkvKiBpZiB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgZW50cmllcywgZGVjaWRlIHdoaWNoICJ0eXBlIiB0byB1c2UgKi8KKwkJLyogKGxhcmdlciB2YWx1ZSB0YWtlcyBwcmVjZWRlbmNlIC0tIDE9dXNhYmxlLCAyLDMsNCw0Kz11bnVzYWJsZSkgKi8KKwkJY3VycmVudF90eXBlID0gMDsKKwkJZm9yIChpPTA7IGk8b3ZlcmxhcF9lbnRyaWVzOyBpKyspCisJCQlpZiAob3ZlcmxhcF9saXN0W2ldLT50eXBlID4gY3VycmVudF90eXBlKQorCQkJCWN1cnJlbnRfdHlwZSA9IG92ZXJsYXBfbGlzdFtpXS0+dHlwZTsKKwkJLyogY29udGludWUgYnVpbGRpbmcgdXAgbmV3IGJpb3MgbWFwIGJhc2VkIG9uIHRoaXMgaW5mb3JtYXRpb24gKi8KKwkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUpCXsKKwkJCWlmIChsYXN0X3R5cGUgIT0gMCkJIHsKKwkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0uc2l6ZSA9CisJCQkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyIC0gbGFzdF9hZGRyOworCQkJCS8qIG1vdmUgZm9yd2FyZCBvbmx5IGlmIHRoZSBuZXcgc2l6ZSB3YXMgbm9uLXplcm8gKi8KKwkJCQlpZiAobmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLnNpemUgIT0gMCkKKwkJCQkJaWYgKCsrbmV3X2Jpb3NfZW50cnkgPj0gRTgyME1BWCkKKwkJCQkJCWJyZWFrOyAJLyogbm8gbW9yZSBzcGFjZSBsZWZ0IGZvciBuZXcgYmlvcyBlbnRyaWVzICovCisJCQl9CisJCQlpZiAoY3VycmVudF90eXBlICE9IDApCXsKKwkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0uYWRkciA9IGNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyOworCQkJCW5ld19iaW9zW25ld19iaW9zX2VudHJ5XS50eXBlID0gY3VycmVudF90eXBlOworCQkJCWxhc3RfYWRkcj1jaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKKwkJCX0KKwkJCWxhc3RfdHlwZSA9IGN1cnJlbnRfdHlwZTsKKwkJfQorCX0KKwluZXdfbnIgPSBuZXdfYmlvc19lbnRyeTsgICAvKiByZXRhaW4gY291bnQgZm9yIG5ldyBiaW9zIGVudHJpZXMgKi8KKworCS8qIGNvcHkgbmV3IGJpb3MgbWFwcGluZyBpbnRvIG9yaWdpbmFsIGxvY2F0aW9uICovCisJbWVtY3B5KGJpb3NtYXAsIG5ld19iaW9zLCBuZXdfbnIqc2l6ZW9mKHN0cnVjdCBlODIwZW50cnkpKTsKKwkqcG5yX21hcCA9IG5ld19ucjsKKworCXByaW50aygic2FuaXRpemUgZW5kXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgdGhlIEJJT1MgZTgyMCBtYXAgaW50byBhIHNhZmUgcGxhY2UuCisgKgorICogU2FuaXR5LWNoZWNrIGl0IHdoaWxlIHdlJ3JlIGF0IGl0Li4KKyAqCisgKiBJZiB3ZSdyZSBsdWNreSBhbmQgbGl2ZSBvbiBhIG1vZGVybiBzeXN0ZW0sIHRoZSBzZXR1cCBjb2RlCisgKiB3aWxsIGhhdmUgZ2l2ZW4gdXMgYSBtZW1vcnkgbWFwIHRoYXQgd2UgY2FuIHVzZSB0byBwcm9wZXJseQorICogc2V0IHVwIG1lbW9yeS4gIElmIHdlIGFyZW4ndCwgd2UnbGwgZmFrZSBhIG1lbW9yeSBtYXAuCisgKgorICogV2UgY2hlY2sgdG8gc2VlIHRoYXQgdGhlIG1lbW9yeSBtYXAgY29udGFpbnMgYXQgbGVhc3QgMiBlbGVtZW50cworICogYmVmb3JlIHdlJ2xsIHVzZSBpdCwgYmVjYXVzZSB0aGUgZGV0ZWN0aW9uIGNvZGUgaW4gc2V0dXAuUyBtYXkKKyAqIG5vdCBiZSBwZXJmZWN0IGFuZCBtb3N0IGV2ZXJ5IFBDIGtub3duIHRvIG1hbiBoYXMgdHdvIG1lbW9yeQorICogcmVnaW9uczogb25lIGZyb20gMCB0byA2NDBrLCBhbmQgb25lIGZyb20gMW1iIHVwLiAgKFRoZSBJQk0KKyAqIHRoaW5rcGFkIDU2MHgsIGZvciBleGFtcGxlLCBkb2VzIG5vdCBjb29wZXJhdGUgd2l0aCB0aGUgbWVtb3J5CisgKiBkZXRlY3Rpb24gY29kZS4pCisgKi8KK2ludCBfX2luaXQgY29weV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgaW50IG5yX21hcCkKK3sKKwkvKiBPbmx5IG9uZSBtZW1vcnkgcmVnaW9uIChvciBuZWdhdGl2ZSk/IElnbm9yZSBpdCAqLworCWlmIChucl9tYXAgPCAyKQorCQlyZXR1cm4gLTE7CisKKwlkbyB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IGJpb3NtYXAtPmFkZHI7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gYmlvc21hcC0+c2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGVuZCA9IHN0YXJ0ICsgc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyB0eXBlID0gYmlvc21hcC0+dHlwZTsKKwkJcHJpbnRrKCJjb3B5X2U4MjBfbWFwKCkgc3RhcnQ6ICUwMTZMeCBzaXplOiAlMDE2THggZW5kOiAlMDE2THggdHlwZTogJWxkXG4iLCBzdGFydCwgc2l6ZSwgZW5kLCB0eXBlKTsKKworCQkvKiBPdmVyZmxvdyBpbiA2NCBiaXRzPyBJZ25vcmUgdGhlIG1lbW9yeSBtYXAuICovCisJCWlmIChzdGFydCA+IGVuZCkKKwkJCXJldHVybiAtMTsKKworCQkvKgorCQkgKiBTb21lIEJJT1NlcyBjbGFpbSBSQU0gaW4gdGhlIDY0MGsgLSAxTSByZWdpb24uCisJCSAqIE5vdCByaWdodC4gRml4IGl0IHVwLgorCQkgKi8KKwkJaWYgKHR5cGUgPT0gRTgyMF9SQU0pIHsKKwkJCXByaW50aygiY29weV9lODIwX21hcCgpIHR5cGUgaXMgRTgyMF9SQU1cbiIpOworCQkJaWYgKHN0YXJ0IDwgMHgxMDAwMDBVTEwgJiYgZW5kID4gMHhBMDAwMFVMTCkgeworCQkJCXByaW50aygiY29weV9lODIwX21hcCgpIGxpZXMgaW4gcmFuZ2UuLi5cbiIpOworCQkJCWlmIChzdGFydCA8IDB4QTAwMDBVTEwpIHsKKwkJCQkJcHJpbnRrKCJjb3B5X2U4MjBfbWFwKCkgc3RhcnQgPCAweEEwMDAwVUxMXG4iKTsKKwkJCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnQsIDB4QTAwMDBVTEwtc3RhcnQsIHR5cGUpOworCQkJCX0KKwkJCQlpZiAoZW5kIDw9IDB4MTAwMDAwVUxMKSB7CisJCQkJCXByaW50aygiY29weV9lODIwX21hcCgpIGVuZCA8PSAweDEwMDAwMFVMTFxuIik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlzdGFydCA9IDB4MTAwMDAwVUxMOworCQkJCXNpemUgPSBlbmQgLSBzdGFydDsKKwkJCX0KKwkJfQorCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydCwgc2l6ZSwgdHlwZSk7CisJfSB3aGlsZSAoYmlvc21hcCsrLC0tbnJfbWFwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxiYWNrIGZvciBlZmlfbWVtb3J5X3dhbGsuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitlZmlfZmluZF9tYXhfcGZuKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyAqbWF4X3BmbiA9IGFyZywgcGZuOworCisJaWYgKHN0YXJ0IDwgZW5kKSB7CisJCXBmbiA9IFBGTl9VUChlbmQgLTEpOworCQlpZiAocGZuID4gKm1heF9wZm4pCisJCQkqbWF4X3BmbiA9IHBmbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitlZmlfbWVtb3J5X3ByZXNlbnRfd3JhcHBlcih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgdm9pZCAqYXJnKQoreworCW1lbW9yeV9wcmVzZW50KDAsIFBGTl9VUChzdGFydCksIFBGTl9ET1dOKGVuZCkpOworCXJldHVybiAwOworfQorCisvKgorICogRmluZCB0aGUgaGlnaGVzdCBwYWdlIGZyYW1lIG51bWJlciB3ZSBoYXZlIGF2YWlsYWJsZQorICovCit2b2lkIF9faW5pdCBmaW5kX21heF9wZm4odm9pZCkKK3sKKwlpbnQgaTsKKworCW1heF9wZm4gPSAwOworCWlmIChlZmlfZW5hYmxlZCkgeworCQllZmlfbWVtbWFwX3dhbGsoZWZpX2ZpbmRfbWF4X3BmbiwgJm1heF9wZm4pOworCQllZmlfbWVtbWFwX3dhbGsoZWZpX21lbW9yeV9wcmVzZW50X3dyYXBwZXIsIE5VTEwpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCQkvKiBSQU0/ICovCisJCWlmIChlODIwLm1hcFtpXS50eXBlICE9IEU4MjBfUkFNKQorCQkJY29udGludWU7CisJCXN0YXJ0ID0gUEZOX1VQKGU4MjAubWFwW2ldLmFkZHIpOworCQllbmQgPSBQRk5fRE9XTihlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSk7CisJCWlmIChzdGFydCA+PSBlbmQpCisJCQljb250aW51ZTsKKwkJaWYgKGVuZCA+IG1heF9wZm4pCisJCQltYXhfcGZuID0gZW5kOworCQltZW1vcnlfcHJlc2VudCgwLCBzdGFydCwgZW5kKTsKKwl9Cit9CisKKy8qCisgKiBGcmVlIGFsbCBhdmFpbGFibGUgbWVtb3J5IGZvciBib290IHRpbWUgYWxsb2NhdGlvbi4gIFVzZWQKKyAqIGFzIGEgY2FsbGJhY2sgZnVuY3Rpb24gYnkgZWZpX21lbW9yeV93YWxrKCkKKyAqLworCitzdGF0aWMgaW50IF9faW5pdAorZnJlZV9hdmFpbGFibGVfbWVtb3J5KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpCit7CisJLyogY2hlY2sgbWF4X2xvd19wZm4gKi8KKwlpZiAoc3RhcnQgPj0gKG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gMDsKKwlpZiAoZW5kID49IChtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUKSkKKwkJZW5kID0gbWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVDsKKwlpZiAoc3RhcnQgPCBlbmQpCisJCWZyZWVfYm9vdG1lbShzdGFydCwgZW5kIC0gc3RhcnQpOworCisJcmV0dXJuIDA7Cit9CisvKgorICogUmVnaXN0ZXIgZnVsbHkgYXZhaWxhYmxlIGxvdyBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCisgKi8KK3ZvaWQgX19pbml0IHJlZ2lzdGVyX2Jvb3RtZW1fbG93X3BhZ2VzKHVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm4pCit7CisJaW50IGk7CisKKwlpZiAoZWZpX2VuYWJsZWQpIHsKKwkJZWZpX21lbW1hcF93YWxrKGZyZWVfYXZhaWxhYmxlX21lbW9yeSwgTlVMTCk7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBjdXJyX3BmbiwgbGFzdF9wZm4sIHNpemU7CisJCS8qCisJCSAqIFJlc2VydmUgdXNhYmxlIGxvdyBtZW1vcnkKKwkJICovCisJCWlmIChlODIwLm1hcFtpXS50eXBlICE9IEU4MjBfUkFNKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFdlIGFyZSByb3VuZGluZyB1cCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB1c2FibGUgbWVtb3J5OgorCQkgKi8KKwkJY3Vycl9wZm4gPSBQRk5fVVAoZTgyMC5tYXBbaV0uYWRkcik7CisJCWlmIChjdXJyX3BmbiA+PSBtYXhfbG93X3BmbikKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiAuLi4gYW5kIGF0IHRoZSBlbmQgb2YgdGhlIHVzYWJsZSByYW5nZSBkb3dud2FyZHM6CisJCSAqLworCQlsYXN0X3BmbiA9IFBGTl9ET1dOKGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplKTsKKworCQlpZiAobGFzdF9wZm4gPiBtYXhfbG93X3BmbikKKwkJCWxhc3RfcGZuID0gbWF4X2xvd19wZm47CisKKwkJLyoKKwkJICogLi4gZmluYWxseSwgZGlkIGFsbCB0aGUgcm91bmRpbmcgYW5kIHBsYXlpbmcKKwkJICogYXJvdW5kIGp1c3QgbWFrZSB0aGUgYXJlYSBnbyBhd2F5PworCQkgKi8KKwkJaWYgKGxhc3RfcGZuIDw9IGN1cnJfcGZuKQorCQkJY29udGludWU7CisKKwkJc2l6ZSA9IGxhc3RfcGZuIC0gY3Vycl9wZm47CisJCWZyZWVfYm9vdG1lbShQRk5fUEhZUyhjdXJyX3BmbiksIFBGTl9QSFlTKHNpemUpKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IHJlZ2lzdGVyX21lbW9yeSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZ2Fwc3RhcnQsIGdhcHNpemUsIHJvdW5kOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0OworCWludCBpOworCisJLyoKKwkgKiBTZWFyY2ggZm9yIHRoZSBiaWdlc3QgZ2FwIGluIHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgZTgyMAorCSAqIG1lbW9yeSBzcGFjZS4KKwkgKi8KKwlsYXN0ID0gMHgxMDAwMDAwMDB1bGw7CisJZ2Fwc3RhcnQgPSAweDEwMDAwMDAwOworCWdhcHNpemUgPSAweDQwMDAwMDsKKwlpID0gZTgyMC5ucl9tYXA7CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IGU4MjAubWFwW2ldLmFkZHI7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQgPSBzdGFydCArIGU4MjAubWFwW2ldLnNpemU7CisKKwkJLyoKKwkJICogU2luY2UgImxhc3QiIGlzIGF0IG1vc3QgNEdCLCB3ZSBrbm93IHdlJ2xsCisJCSAqIGZpdCBpbiAzMiBiaXRzIGlmIHRoaXMgY29uZGl0aW9uIGlzIHRydWUKKwkJICovCisJCWlmIChsYXN0ID4gZW5kKSB7CisJCQl1bnNpZ25lZCBsb25nIGdhcCA9IGxhc3QgLSBlbmQ7CisKKwkJCWlmIChnYXAgPiBnYXBzaXplKSB7CisJCQkJZ2Fwc2l6ZSA9IGdhcDsKKwkJCQlnYXBzdGFydCA9IGVuZDsKKwkJCX0KKwkJfQorCQlpZiAoc3RhcnQgPCBsYXN0KQorCQkJbGFzdCA9IHN0YXJ0OworCX0KKworCS8qCisJICogU2VlIGhvdyBtdWNoIHdlIHdhbnQgdG8gcm91bmQgdXA6IHN0YXJ0IG9mZiB3aXRoCisJICogcm91bmRpbmcgdG8gdGhlIG5leHQgMU1CIGFyZWEuCisJICovCisJcm91bmQgPSAweDEwMDAwMDsKKwl3aGlsZSAoKGdhcHNpemUgPj4gNCkgPiByb3VuZCkKKwkJcm91bmQgKz0gcm91bmQ7CisJLyogRnVuIHdpdGggdHdvJ3MgY29tcGxlbWVudCAqLworCXBjaV9tZW1fc3RhcnQgPSAoZ2Fwc3RhcnQgKyByb3VuZCkgJiAtcm91bmQ7CisKKwlwcmludGsoIkFsbG9jYXRpbmcgUENJIHJlc291cmNlcyBzdGFydGluZyBhdCAlMDhseCAoZ2FwOiAlMDhseDolMDhseClcbiIsCisJCXBjaV9tZW1fc3RhcnQsIGdhcHN0YXJ0LCBnYXBzaXplKTsKK30KKwordm9pZCBfX2luaXQgcHJpbnRfbWVtb3J5X21hcChjaGFyICp3aG8pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQlwcmludGsoIiAlczogJTAxNkx4IC0gJTAxNkx4ICIsIHdobywKKwkJCWU4MjAubWFwW2ldLmFkZHIsCisJCQllODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSk7CisJCXN3aXRjaCAoZTgyMC5tYXBbaV0udHlwZSkgeworCQljYXNlIEU4MjBfUkFNOglwcmludGsoIih1c2FibGUpXG4iKTsKKwkJCQlicmVhazsKKwkJY2FzZSBFODIwX1JFU0VSVkVEOgorCQkJCXByaW50aygiKHJlc2VydmVkKVxuIik7CisJCQkJYnJlYWs7CisJCWNhc2UgRTgyMF9BQ1BJOgorCQkJCXByaW50aygiKEFDUEkgZGF0YSlcbiIpOworCQkJCWJyZWFrOworCQljYXNlIEU4MjBfTlZTOgorCQkJCXByaW50aygiKEFDUEkgTlZTKVxuIik7CisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CXByaW50aygidHlwZSAlbHVcbiIsIGU4MjAubWFwW2ldLnR5cGUpOworCQkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgX19pbml0IF9fYWx3YXlzX2lubGluZSB2b2lkIGVmaV9saW1pdF9yZWdpb25zKHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJyZW50X2FkZHIgPSAwOworCWVmaV9tZW1vcnlfZGVzY190ICptZCwgKm5leHRfbWQ7CisJdm9pZCAqcCwgKnAxOworCWludCBpLCBqOworCisJaiA9IDA7CisJcDEgPSBtZW1tYXAubWFwOworCWZvciAocCA9IHAxLCBpID0gMDsgcCA8IG1lbW1hcC5tYXBfZW5kOyBwICs9IG1lbW1hcC5kZXNjX3NpemUsIGkrKykgeworCQltZCA9IHA7CisJCW5leHRfbWQgPSBwMTsKKwkJY3VycmVudF9hZGRyID0gbWQtPnBoeXNfYWRkciArCisJCQlQRk5fUEhZUyhtZC0+bnVtX3BhZ2VzKTsKKwkJaWYgKGlzX2F2YWlsYWJsZV9tZW1vcnkobWQpKSB7CisJCQlpZiAobWQtPnBoeXNfYWRkciA+PSBzaXplKSBjb250aW51ZTsKKwkJCW1lbWNweShuZXh0X21kLCBtZCwgbWVtbWFwLmRlc2Nfc2l6ZSk7CisJCQlpZiAoY3VycmVudF9hZGRyID49IHNpemUpIHsKKwkJCQluZXh0X21kLT5udW1fcGFnZXMgLT0KKwkJCQkJUEZOX1VQKGN1cnJlbnRfYWRkci1zaXplKTsKKwkJCX0KKwkJCXAxICs9IG1lbW1hcC5kZXNjX3NpemU7CisJCQluZXh0X21kID0gcDE7CisJCQlqKys7CisJCX0gZWxzZSBpZiAoKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpID09CisJCQkgICBFRklfTUVNT1JZX1JVTlRJTUUpIHsKKwkJCS8qIEluIG9yZGVyIHRvIG1ha2UgcnVudGltZSBzZXJ2aWNlcworCQkJICogYXZhaWxhYmxlIHdlIGhhdmUgdG8gaW5jbHVkZSBydW50aW1lCisJCQkgKiBtZW1vcnkgcmVnaW9ucyBpbiBtZW1vcnkgbWFwICovCisJCQltZW1jcHkobmV4dF9tZCwgbWQsIG1lbW1hcC5kZXNjX3NpemUpOworCQkJcDEgKz0gbWVtbWFwLmRlc2Nfc2l6ZTsKKwkJCW5leHRfbWQgPSBwMTsKKwkJCWorKzsKKwkJfQorCX0KKwltZW1tYXAubnJfbWFwID0gajsKKwltZW1tYXAubWFwX2VuZCA9IG1lbW1hcC5tYXAgKworCQkobWVtbWFwLm5yX21hcCAqIG1lbW1hcC5kZXNjX3NpemUpOworfQorCit2b2lkIF9faW5pdCBsaW1pdF9yZWdpb25zKHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJyZW50X2FkZHI7CisJaW50IGk7CisKKwlwcmludF9tZW1vcnlfbWFwKCJsaW1pdF9yZWdpb25zIHN0YXJ0Iik7CisJaWYgKGVmaV9lbmFibGVkKSB7CisJCWVmaV9saW1pdF9yZWdpb25zKHNpemUpOworCQlyZXR1cm47CisJfQorCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCWN1cnJlbnRfYWRkciA9IGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplOworCQlpZiAoY3VycmVudF9hZGRyIDwgc2l6ZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChlODIwLm1hcFtpXS50eXBlICE9IEU4MjBfUkFNKQorCQkJY29udGludWU7CisKKwkJaWYgKGU4MjAubWFwW2ldLmFkZHIgPj0gc2l6ZSkgeworCQkJLyoKKwkJCSAqIFRoaXMgcmVnaW9uIHN0YXJ0cyBwYXN0IHRoZSBlbmQgb2YgdGhlCisJCQkgKiByZXF1ZXN0ZWQgc2l6ZSwgc2tpcCBpdCBjb21wbGV0ZWx5LgorCQkJICovCisJCQllODIwLm5yX21hcCA9IGk7CisJCX0gZWxzZSB7CisJCQllODIwLm5yX21hcCA9IGkgKyAxOworCQkJZTgyMC5tYXBbaV0uc2l6ZSAtPSBjdXJyZW50X2FkZHIgLSBzaXplOworCQl9CisJCXByaW50X21lbW9yeV9tYXAoImxpbWl0X3JlZ2lvbnMgZW5kZm9yIik7CisJCXJldHVybjsKKwl9CisJcHJpbnRfbWVtb3J5X21hcCgibGltaXRfcmVnaW9ucyBlbmRmdW5jIik7Cit9CisKKyAvKgorICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBlbnRpcmUgcmFuZ2UgPHN0YXJ0LGVuZD4gaXMgbWFwcGVkIHdpdGggdHlwZS4KKyAgKgorICAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBjb3JyZWN0IGlmIHRoZSBlODIwIHRhYmxlIGlzIHNvcnRlZCBhbmQKKyAgKiBub3Qtb3ZlcmxhcHBpbmcsIHdoaWNoIGlzIHRoZSBjYXNlCisgICovCitpbnQgX19pbml0CitlODIwX2FsbF9tYXBwZWQodW5zaWduZWQgbG9uZyBzLCB1bnNpZ25lZCBsb25nIGUsIHVuc2lnbmVkIHR5cGUpCit7CisJdTY0IHN0YXJ0ID0gczsKKwl1NjQgZW5kID0gZTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwkJaWYgKHR5cGUgJiYgZWktPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCQkvKiBpcyB0aGUgcmVnaW9uIChwYXJ0KSBpbiBvdmVybGFwIHdpdGggdGhlIGN1cnJlbnQgcmVnaW9uID8qLworCQlpZiAoZWktPmFkZHIgPj0gZW5kIHx8IGVpLT5hZGRyICsgZWktPnNpemUgPD0gc3RhcnQpCisJCQljb250aW51ZTsKKwkJLyogaWYgdGhlIHJlZ2lvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIDxzdGFydCxlbmQ+IHdlIG1vdmUKKwkJICogc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUgcmVnaW9uIHNpbmNlIGl0J3Mgb2sgdW50aWwgdGhlcmUKKwkJICovCisJCWlmIChlaS0+YWRkciA8PSBzdGFydCkKKwkJCXN0YXJ0ID0gZWktPmFkZHIgKyBlaS0+c2l6ZTsKKwkJLyogaWYgc3RhcnQgaXMgbm93IGF0IG9yIGJleW9uZCBlbmQsIHdlJ3JlIGRvbmUsIGZ1bGwKKwkJICogY292ZXJhZ2UgKi8KKwkJaWYgKHN0YXJ0ID49IGVuZCkKKwkJCXJldHVybiAxOyAvKiB3ZSdyZSBkb25lICovCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9tZW1tYXAoY2hhciAqYXJnKQoreworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJjbXAoYXJnLCAiZXhhY3RtYXAiKSA9PSAwKSB7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwkJLyogSWYgd2UgYXJlIGRvaW5nIGEgY3Jhc2ggZHVtcCwgd2UKKwkJICogc3RpbGwgbmVlZCB0byBrbm93IHRoZSByZWFsIG1lbQorCQkgKiBzaXplIGJlZm9yZSBvcmlnaW5hbCBtZW1vcnkgbWFwIGlzCisJCSAqIHJlc2V0LgorCQkgKi8KKwkJZmluZF9tYXhfcGZuKCk7CisJCXNhdmVkX21heF9wZm4gPSBtYXhfcGZuOworI2VuZGlmCisJCWU4MjAubnJfbWFwID0gMDsKKwkJdXNlcl9kZWZpbmVkX21lbW1hcCA9IDE7CisJfSBlbHNlIHsKKwkJLyogSWYgdGhlIHVzZXIgc3BlY2lmaWVzIG1lbW9yeSBzaXplLCB3ZQorCQkgKiBsaW1pdCB0aGUgQklPUy1wcm92aWRlZCBtZW1vcnkgbWFwIHRvCisJCSAqIHRoYXQgc2l6ZS4gZXhhY3RtYXAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorCQkgKiB0aGUgZXhhY3QgbWFwLiBtZW09bnVtYmVyIGNhbiBiZSB1c2VkIHRvCisJCSAqIHRyaW0gdGhlIGV4aXN0aW5nIG1lbW9yeSBtYXAuCisJCSAqLworCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnRfYXQsIG1lbV9zaXplOworCisJCW1lbV9zaXplID0gbWVtcGFyc2UoYXJnLCAmYXJnKTsKKwkJaWYgKCphcmcgPT0gJ0AnKSB7CisJCQlzdGFydF9hdCA9IG1lbXBhcnNlKGFyZysxLCAmYXJnKTsKKwkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9SQU0pOworCQl9IGVsc2UgaWYgKCphcmcgPT0gJyMnKSB7CisJCQlzdGFydF9hdCA9IG1lbXBhcnNlKGFyZysxLCAmYXJnKTsKKwkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9BQ1BJKTsKKwkJfSBlbHNlIGlmICgqYXJnID09ICckJykgeworCQkJc3RhcnRfYXQgPSBtZW1wYXJzZShhcmcrMSwgJmFyZyk7CisJCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydF9hdCwgbWVtX3NpemUsIEU4MjBfUkVTRVJWRUQpOworCQl9IGVsc2UgeworCQkJbGltaXRfcmVnaW9ucyhtZW1fc2l6ZSk7CisJCQl1c2VyX2RlZmluZWRfbWVtbWFwID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJtZW1tYXAiLCBwYXJzZV9tZW1tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWZpLmMKaW5kZXggOGI0MDY0OC4uYjkyYzdmMCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYworKysgYi9hcmNoL2kzODYva2VybmVsL2VmaS5jCkBAIC0xOTQsMTcgKzE5NCwyNCBAQAogCXJldHVybiAwOwogfQogLyoKLSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBkdXJpbmcga2VybmVsIGluaXQgYW5kIGJlZm9yZSBydW50aW1lCi0gKiBzZXJ2aWNlcyBoYXZlIGJlZW4gcmVtYXBwZWQsIHRoZXJlZm9yZSwgd2UnbGwgbmVlZCB0byBjYWxsIGluIHBoeXNpY2FsCi0gKiBtb2RlLiAgTm90ZSwgdGhpcyBjYWxsIGlzbid0IHVzZWQgbGF0ZXIsIHNvIG1hcmsgaXQgX19pbml0LgorICogVGhpcyBpcyB1c2VkIGR1cmluZyBrZXJuZWwgaW5pdCBiZWZvcmUgcnVudGltZQorICogc2VydmljZXMgaGF2ZSBiZWVuIHJlbWFwcGVkIGFuZCBhbHNvIGR1cmluZyBzdXNwZW5kLCB0aGVyZWZvcmUsCisgKiB3ZSdsbCBuZWVkIHRvIGNhbGwgYm90aCBpbiBwaHlzaWNhbCBhbmQgdmlydHVhbCBtb2Rlcy4KICAqLwotaW5saW5lIHVuc2lnbmVkIGxvbmcgX19pbml0IGVmaV9nZXRfdGltZSh2b2lkKQoraW5saW5lIHVuc2lnbmVkIGxvbmcgZWZpX2dldF90aW1lKHZvaWQpCiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAllZmlfdGltZV90IGVmdDsKIAllZmlfdGltZV9jYXBfdCBjYXA7CiAKLQlzdGF0dXMgPSBwaHlzX2VmaV9nZXRfdGltZSgmZWZ0LCAmY2FwKTsKKwlpZiAoZWZpLmdldF90aW1lKSB7CisJCS8qIGlmIHdlIGFyZSBpbiB2aXJ0dWFsIG1vZGUgdXNlIHJlbWFwcGVkIGZ1bmN0aW9uICovCisgCQlzdGF0dXMgPSBlZmkuZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CisJfSBlbHNlIHsKKwkJLyogd2UgYXJlIGluIHBoeXNpY2FsIG1vZGUgKi8KKwkJc3RhdHVzID0gcGh5c19lZmlfZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CisJfQorCiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJcHJpbnRrKCJPb3BzOiBlZml0aW1lOiBjYW4ndCByZWFkIHRpbWUgc3RhdHVzOiAweCVseFxuIixzdGF0dXMpOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMgYi9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMKaW5kZXggNWE2M2Q2Zi4uZGUzNGI3ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMKQEAgLTMwLDEyICszMCwxMyBAQAogICoJMTgoJWVzcCkgLSAlZWF4CiAgKgkxQyglZXNwKSAtICVkcwogICoJMjAoJWVzcCkgLSAlZXMKLSAqCTI0KCVlc3ApIC0gb3JpZ19lYXgKLSAqCTI4KCVlc3ApIC0gJWVpcAotICoJMkMoJWVzcCkgLSAlY3MKLSAqCTMwKCVlc3ApIC0gJWVmbGFncwotICoJMzQoJWVzcCkgLSAlb2xkZXNwCi0gKgkzOCglZXNwKSAtICVvbGRzcworICoJMjQoJWVzcCkgLSAlZ3MKKyAqCTI4KCVlc3ApIC0gb3JpZ19lYXgKKyAqCTJDKCVlc3ApIC0gJWVpcAorICoJMzAoJWVzcCkgLSAlY3MKKyAqCTM0KCVlc3ApIC0gJWVmbGFncworICoJMzgoJWVzcCkgLSAlb2xkZXNwCisgKgkzQyglZXNwKSAtICVvbGRzcwogICoKICAqICJjdXJyZW50IiBpcyBpbiByZWdpc3RlciAlZWJ4IGR1cmluZyBhbnkgc2xvdyBlbnRyaWVzLgogICovCkBAIC00OCwyNiArNDksMjQgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSAiaXJxX3ZlY3RvcnMuaCIKIAotI2RlZmluZSBucl9zeXNjYWxscyAoKHN5c2NhbGxfdGFibGVfc2l6ZSkvNCkKKy8qCisgKiBXZSB1c2UgbWFjcm9zIGZvciBsb3ctbGV2ZWwgb3BlcmF0aW9ucyB3aGljaCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4KKyAqIGZvciBwYXJhdmlydHVhbGl6YXRpb24uICBUaGUgZm9sbG93aW5nIHdpbGwgbmV2ZXIgY2xvYmJlciBhbnkgcmVnaXN0ZXJzOgorICogICBJTlRFUlJVUFRfUkVUVVJOIChha2EuICJpcmV0IikKKyAqICAgR0VUX0NSMF9JTlRPX0VBWCAoYWthLiAibW92bCAlY3IwLCAlZWF4IikKKyAqICAgRU5BQkxFX0lOVEVSUlVQVFNfU1lTRVhJVCAoYWthICJzdGk7IHN5c2V4aXQiKS4KKyAqCisgKiBGb3IgRElTQUJMRV9JTlRFUlJVUFRTL0VOQUJMRV9JTlRFUlJVUFRTIChha2EgImNsaSIvInN0aSIpLCB5b3UgbXVzdAorICogc3BlY2lmeSB3aGF0IHJlZ2lzdGVycyBjYW4gYmUgb3ZlcndyaXR0ZW4gKENMQlJfTk9ORSwgQ0xCUl9FQVgvRURYL0VDWC9BTlkpLgorICogQWxsb3dpbmcgYSByZWdpc3RlciB0byBiZSBjbG9iYmVyZWQgY2FuIHNocmluayB0aGUgcGFyYXZpcnQgcmVwbGFjZW1lbnQKKyAqIGVub3VnaCB0byBwYXRjaCBpbmxpbmUsIGluY3JlYXNpbmcgcGVyZm9ybWFuY2UuCisgKi8KIAotRUJYCQk9IDB4MDAKLUVDWAkJPSAweDA0Ci1FRFgJCT0gMHgwOAotRVNJCQk9IDB4MEMKLUVESQkJPSAweDEwCi1FQlAJCT0gMHgxNAotRUFYCQk9IDB4MTgKLURTCQk9IDB4MUMKLUVTCQk9IDB4MjAKLU9SSUdfRUFYCT0gMHgyNAotRUlQCQk9IDB4MjgKLUNTCQk9IDB4MkMKLUVGTEFHUwkJPSAweDMwCi1PTERFU1AJCT0gMHgzNAotT0xEU1MJCT0gMHgzOAorI2RlZmluZSBucl9zeXNjYWxscyAoKHN5c2NhbGxfdGFibGVfc2l6ZSkvNCkKIAogQ0ZfTUFTSwkJPSAweDAwMDAwMDAxCiBURl9NQVNLCQk9IDB4MDAwMDAxMDAKQEAgLTc2LDIzICs3NSwxNiBAQAogTlRfTUFTSwkJPSAweDAwMDA0MDAwCiBWTV9NQVNLCQk9IDB4MDAwMjAwMDAKIAotLyogVGhlc2UgYXJlIHJlcGxhY2VzIGZvciBwYXJhdmlydHVhbGl6YXRpb24gKi8KLSNkZWZpbmUgRElTQUJMRV9JTlRFUlJVUFRTCQljbGkKLSNkZWZpbmUgRU5BQkxFX0lOVEVSUlVQVFMJCXN0aQotI2RlZmluZSBFTkFCTEVfSU5URVJSVVBUU19TWVNFWElUCXN0aTsgc3lzZXhpdAotI2RlZmluZSBJTlRFUlJVUFRfUkVUVVJOCQlpcmV0Ci0jZGVmaW5lIEdFVF9DUjBfSU5UT19FQVgJCW1vdmwgJWNyMCwgJWVheAotCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKLSNkZWZpbmUgcHJlZW1wdF9zdG9wCQlESVNBQkxFX0lOVEVSUlVQVFM7IFRSQUNFX0lSUVNfT0ZGCisjZGVmaW5lIHByZWVtcHRfc3RvcChjbG9iYmVycykJRElTQUJMRV9JTlRFUlJVUFRTKGNsb2JiZXJzKTsgVFJBQ0VfSVJRU19PRkYKICNlbHNlCi0jZGVmaW5lIHByZWVtcHRfc3RvcAorI2RlZmluZSBwcmVlbXB0X3N0b3AoY2xvYmJlcnMpCiAjZGVmaW5lIHJlc3VtZV9rZXJuZWwJCXJlc3RvcmVfbm9jaGVjawogI2VuZGlmCiAKIC5tYWNybyBUUkFDRV9JUlFTX0lSRVQKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKLQl0ZXN0bCAkSUZfTUFTSyxFRkxBR1MoJWVzcCkgICAgICMgaW50ZXJydXB0cyBvZmY/CisJdGVzdGwgJElGX01BU0ssUFRfRUZMQUdTKCVlc3ApICAgICAjIGludGVycnVwdHMgb2ZmPwogCWp6IDFmCiAJVFJBQ0VfSVJRU19PTgogMToKQEAgLTEwNyw2ICs5OSw5IEBACiAKICNkZWZpbmUgU0FWRV9BTEwgXAogCWNsZDsgXAorCXB1c2hsICVnczsgXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0O1wKKwkvKkNGSV9SRUxfT0ZGU0VUIGdzLCAwOyovXAogCXB1c2hsICVlczsgXAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0O1wKIAkvKkNGSV9SRUxfT0ZGU0VUIGVzLCAwOyovXApAQCAtMTM2LDcgKzEzMSw5IEBACiAJQ0ZJX1JFTF9PRkZTRVQgZWJ4LCAwO1wKIAltb3ZsICQoX19VU0VSX0RTKSwgJWVkeDsgXAogCW1vdmwgJWVkeCwgJWRzOyBcCi0JbW92bCAlZWR4LCAlZXM7CisJbW92bCAlZWR4LCAlZXM7IFwKKwltb3ZsICQoX19LRVJORUxfUERBKSwgJWVkeDsgXAorCW1vdmwgJWVkeCwgJWdzCiAKICNkZWZpbmUgUkVTVE9SRV9JTlRfUkVHUyBcCiAJcG9wbCAlZWJ4OwlcCkBAIC0xNjksMTcgKzE2NiwyMiBAQAogMjoJcG9wbCAlZXM7CVwKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQ7XAogCS8qQ0ZJX1JFU1RPUkUgZXM7Ki9cCi0uc2VjdGlvbiAuZml4dXAsImF4IjsJXAotMzoJbW92bCAkMCwoJWVzcCk7CVwKLQlqbXAgMWI7CQlcCiszOglwb3BsICVnczsJXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNDtcCisJLypDRklfUkVTVE9SRSBnczsqL1wKKy5wdXNoc2VjdGlvbiAuZml4dXAsImF4IjsJXAogNDoJbW92bCAkMCwoJWVzcCk7CVwKKwlqbXAgMWI7CQlcCis1Ogltb3ZsICQwLCglZXNwKTsJXAogCWptcCAyYjsJCVwKLS5wcmV2aW91czsJCVwKKzY6CW1vdmwgJDAsKCVlc3ApOwlcCisJam1wIDNiOwkJXAogLnNlY3Rpb24gX19leF90YWJsZSwiYSI7XAogCS5hbGlnbiA0OwlcCi0JLmxvbmcgMWIsM2I7CVwKLQkubG9uZyAyYiw0YjsJXAotLnByZXZpb3VzCisJLmxvbmcgMWIsNGI7CVwKKwkubG9uZyAyYiw1YjsJXAorCS5sb25nIDNiLDZiOwlcCisucG9wc2VjdGlvbgogCiAjZGVmaW5lIFJJTkcwX0lOVF9GUkFNRSBcCiAJQ0ZJX1NUQVJUUFJPQyBzaW1wbGU7XApAQCAtMTk4LDE4ICsyMDAsMTggQEAKICNkZWZpbmUgUklORzBfUFRSRUdTX0ZSQU1FIFwKIAlDRklfU1RBUlRQUk9DIHNpbXBsZTtcCiAJQ0ZJX1NJR05BTF9GUkFNRTtcCi0JQ0ZJX0RFRl9DRkEgZXNwLCBPTERFU1AtRUJYO1wKLQkvKkNGSV9PRkZTRVQgY3MsIENTLU9MREVTUDsqL1wKLQlDRklfT0ZGU0VUIGVpcCwgRUlQLU9MREVTUDtcCi0JLypDRklfT0ZGU0VUIGVzLCBFUy1PTERFU1A7Ki9cCi0JLypDRklfT0ZGU0VUIGRzLCBEUy1PTERFU1A7Ki9cCi0JQ0ZJX09GRlNFVCBlYXgsIEVBWC1PTERFU1A7XAotCUNGSV9PRkZTRVQgZWJwLCBFQlAtT0xERVNQO1wKLQlDRklfT0ZGU0VUIGVkaSwgRURJLU9MREVTUDtcCi0JQ0ZJX09GRlNFVCBlc2ksIEVTSS1PTERFU1A7XAotCUNGSV9PRkZTRVQgZWR4LCBFRFgtT0xERVNQO1wKLQlDRklfT0ZGU0VUIGVjeCwgRUNYLU9MREVTUDtcCi0JQ0ZJX09GRlNFVCBlYngsIEVCWC1PTERFU1AKKwlDRklfREVGX0NGQSBlc3AsIFBUX09MREVTUC1QVF9FQlg7XAorCS8qQ0ZJX09GRlNFVCBjcywgUFRfQ1MtUFRfT0xERVNQOyovXAorCUNGSV9PRkZTRVQgZWlwLCBQVF9FSVAtUFRfT0xERVNQO1wKKwkvKkNGSV9PRkZTRVQgZXMsIFBUX0VTLVBUX09MREVTUDsqL1wKKwkvKkNGSV9PRkZTRVQgZHMsIFBUX0RTLVBUX09MREVTUDsqL1wKKwlDRklfT0ZGU0VUIGVheCwgUFRfRUFYLVBUX09MREVTUDtcCisJQ0ZJX09GRlNFVCBlYnAsIFBUX0VCUC1QVF9PTERFU1A7XAorCUNGSV9PRkZTRVQgZWRpLCBQVF9FREktUFRfT0xERVNQO1wKKwlDRklfT0ZGU0VUIGVzaSwgUFRfRVNJLVBUX09MREVTUDtcCisJQ0ZJX09GRlNFVCBlZHgsIFBUX0VEWC1QVF9PTERFU1A7XAorCUNGSV9PRkZTRVQgZWN4LCBQVF9FQ1gtUFRfT0xERVNQO1wKKwlDRklfT0ZGU0VUIGVieCwgUFRfRUJYLVBUX09MREVTUAogCiBFTlRSWShyZXRfZnJvbV9mb3JrKQogCUNGSV9TVEFSVFBST0MKQEAgLTIzNywxNyArMjM5LDE4IEBACiAJQUxJR04KIAlSSU5HMF9QVFJFR1NfRlJBTUUKIHJldF9mcm9tX2V4Y2VwdGlvbjoKLQlwcmVlbXB0X3N0b3AKKwlwcmVlbXB0X3N0b3AoQ0xCUl9BTlkpCiByZXRfZnJvbV9pbnRyOgogCUdFVF9USFJFQURfSU5GTyglZWJwKQogY2hlY2tfdXNlcnNwYWNlOgotCW1vdmwgRUZMQUdTKCVlc3ApLCAlZWF4CQkjIG1peCBFRkxBR1MgYW5kIENTCi0JbW92YiBDUyglZXNwKSwgJWFsCisJbW92bCBQVF9FRkxBR1MoJWVzcCksICVlYXgJIyBtaXggRUZMQUdTIGFuZCBDUworCW1vdmIgUFRfQ1MoJWVzcCksICVhbAogCWFuZGwgJChWTV9NQVNLIHwgU0VHTUVOVF9SUExfTUFTSyksICVlYXgKIAljbXBsICRVU0VSX1JQTCwgJWVheAogCWpiIHJlc3VtZV9rZXJuZWwJCSMgbm90IHJldHVybmluZyB0byB2ODA4NiBvciB1c2Vyc3BhY2UKKwogRU5UUlkocmVzdW1lX3VzZXJzcGFjZSkKLSAJRElTQUJMRV9JTlRFUlJVUFRTCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBtaXNzIGFuIGludGVycnVwdAorIAlESVNBQkxFX0lOVEVSUlVQVFMoQ0xCUl9BTlkpCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0CiAJCQkJCSMgc2V0dGluZyBuZWVkX3Jlc2NoZWQgb3Igc2lncGVuZGluZwogCQkJCQkjIGJldHdlZW4gc2FtcGxpbmcgYW5kIHRoZSBpcmV0CiAJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeApAQCAtMjU4LDE0ICsyNjEsMTQgQEAKIAogI2lmZGVmIENPTkZJR19QUkVFTVBUCiBFTlRSWShyZXN1bWVfa2VybmVsKQotCURJU0FCTEVfSU5URVJSVVBUUworCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX0FOWSkKIAljbXBsICQwLFRJX3ByZWVtcHRfY291bnQoJWVicCkJIyBub24temVybyBwcmVlbXB0X2NvdW50ID8KIAlqbnogcmVzdG9yZV9ub2NoZWNrCiBuZWVkX3Jlc2NoZWQ6CiAJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAkjIG5lZWRfcmVzY2hlZCBzZXQgPwogCXRlc3RiICRfVElGX05FRURfUkVTQ0hFRCwgJWNsCiAJanogcmVzdG9yZV9hbGwKLQl0ZXN0bCAkSUZfTUFTSyxFRkxBR1MoJWVzcCkgICAgICMgaW50ZXJydXB0cyBvZmYgKGV4Y2VwdGlvbiBwYXRoKSA/CisJdGVzdGwgJElGX01BU0ssUFRfRUZMQUdTKCVlc3ApCSMgaW50ZXJydXB0cyBvZmYgKGV4Y2VwdGlvbiBwYXRoKSA/CiAJanogcmVzdG9yZV9hbGwKIAljYWxsIHByZWVtcHRfc2NoZWR1bGVfaXJxCiAJam1wIG5lZWRfcmVzY2hlZApAQCAtMjg3LDcgKzI5MCw3IEBACiAJICogTm8gbmVlZCB0byBmb2xsb3cgdGhpcyBpcnFzIG9uL29mZiBzZWN0aW9uOiB0aGUgc3lzY2FsbAogCSAqIGRpc2FibGVkIGlycXMgYW5kIGhlcmUgd2UgZW5hYmxlIGl0IHN0cmFpZ2h0IGFmdGVyIGVudHJ5OgogCSAqLwotCUVOQUJMRV9JTlRFUlJVUFRTCisJRU5BQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQogCXB1c2hsICQoX19VU0VSX0RTKQogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJLypDRklfUkVMX09GRlNFVCBzcywgMCovCkBAIC0zMzEsMjAgKzMzNCwyNyBAQAogCWNtcGwgJChucl9zeXNjYWxscyksICVlYXgKIAlqYWUgc3lzY2FsbF9iYWRzeXMKIAljYWxsICpzeXNfY2FsbF90YWJsZSgsJWVheCw0KQotCW1vdmwgJWVheCxFQVgoJWVzcCkKLQlESVNBQkxFX0lOVEVSUlVQVFMKKwltb3ZsICVlYXgsUFRfRUFYKCVlc3ApCisJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfRUNYfENMQlJfRURYKQogCVRSQUNFX0lSUVNfT0ZGCiAJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAogCXRlc3R3ICRfVElGX0FMTFdPUktfTUFTSywgJWN4CiAJam5lIHN5c2NhbGxfZXhpdF93b3JrCiAvKiBpZiBzb21ldGhpbmcgbW9kaWZpZXMgcmVnaXN0ZXJzIGl0IG11c3QgYWxzbyBkaXNhYmxlIHN5c2V4aXQgKi8KLQltb3ZsIEVJUCglZXNwKSwgJWVkeAotCW1vdmwgT0xERVNQKCVlc3ApLCAlZWN4CisJbW92bCBQVF9FSVAoJWVzcCksICVlZHgKKwltb3ZsIFBUX09MREVTUCglZXNwKSwgJWVjeAogCXhvcmwgJWVicCwlZWJwCiAJVFJBQ0VfSVJRU19PTgorMToJbW92ICBQVF9HUyglZXNwKSwgJWdzCiAJRU5BQkxFX0lOVEVSUlVQVFNfU1lTRVhJVAogCUNGSV9FTkRQUk9DCi0KKy5wdXNoc2VjdGlvbiAuZml4dXAsImF4IgorMjoJbW92bCAkMCxQVF9HUyglZXNwKQorCWptcCAxYgorLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24gNAorCS5sb25nIDFiLDJiCisucG9wc2VjdGlvbgogCiAJIyBzeXN0ZW0gY2FsbCBoYW5kbGVyIHN0dWIKIEVOVFJZKHN5c3RlbV9jYWxsKQpAQCAtMzUzLDcgKzM2Myw3IEBACiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlTQVZFX0FMTAogCUdFVF9USFJFQURfSU5GTyglZWJwKQotCXRlc3RsICRURl9NQVNLLEVGTEFHUyglZXNwKQorCXRlc3RsICRURl9NQVNLLFBUX0VGTEFHUyglZXNwKQogCWp6IG5vX3NpbmdsZXN0ZXAKIAlvcmwgJF9USUZfU0lOR0xFU1RFUCxUSV9mbGFncyglZWJwKQogbm9fc2luZ2xlc3RlcDoKQEAgLTM2NSw5ICszNzUsOSBAQAogCWphZSBzeXNjYWxsX2JhZHN5cwogc3lzY2FsbF9jYWxsOgogCWNhbGwgKnN5c19jYWxsX3RhYmxlKCwlZWF4LDQpCi0JbW92bCAlZWF4LEVBWCglZXNwKQkJIyBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlCisJbW92bCAlZWF4LFBUX0VBWCglZXNwKQkJIyBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlCiBzeXNjYWxsX2V4aXQ6Ci0JRElTQUJMRV9JTlRFUlJVUFRTCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBtaXNzIGFuIGludGVycnVwdAorCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX0FOWSkJIyBtYWtlIHN1cmUgd2UgZG9uJ3QgbWlzcyBhbiBpbnRlcnJ1cHQKIAkJCQkJIyBzZXR0aW5nIG5lZWRfcmVzY2hlZCBvciBzaWdwZW5kaW5nCiAJCQkJCSMgYmV0d2VlbiBzYW1wbGluZyBhbmQgdGhlIGlyZXQKIAlUUkFDRV9JUlFTX09GRgpAQCAtMzc2LDEyICszODYsMTIgQEAKIAlqbmUgc3lzY2FsbF9leGl0X3dvcmsKIAogcmVzdG9yZV9hbGw6Ci0JbW92bCBFRkxBR1MoJWVzcCksICVlYXgJCSMgbWl4IEVGTEFHUywgU1MgYW5kIENTCi0JIyBXYXJuaW5nOiBPTERTUyglZXNwKSBjb250YWlucyB0aGUgd3JvbmcvcmFuZG9tIHZhbHVlcyBpZiB3ZQorCW1vdmwgUFRfRUZMQUdTKCVlc3ApLCAlZWF4CSMgbWl4IEVGTEFHUywgU1MgYW5kIENTCisJIyBXYXJuaW5nOiBQVF9PTERTUyglZXNwKSBjb250YWlucyB0aGUgd3JvbmcvcmFuZG9tIHZhbHVlcyBpZiB3ZQogCSMgYXJlIHJldHVybmluZyB0byB0aGUga2VybmVsLgogCSMgU2VlIGNvbW1lbnRzIGluIHByb2Nlc3MuYzpjb3B5X3RocmVhZCgpIGZvciBkZXRhaWxzLgotCW1vdmIgT0xEU1MoJWVzcCksICVhaAotCW1vdmIgQ1MoJWVzcCksICVhbAorCW1vdmIgUFRfT0xEU1MoJWVzcCksICVhaAorCW1vdmIgUFRfQ1MoJWVzcCksICVhbAogCWFuZGwgJChWTV9NQVNLIHwgKFNFR01FTlRfVElfTUFTSyA8PCA4KSB8IFNFR01FTlRfUlBMX01BU0spLCAlZWF4CiAJY21wbCAkKChTRUdNRU5UX0xEVCA8PCA4KSB8IFVTRVJfUlBMKSwgJWVheAogCUNGSV9SRU1FTUJFUl9TVEFURQpAQCAtMzkwLDEzICs0MDAsMTMgQEAKIAlUUkFDRV9JUlFTX0lSRVQKIHJlc3RvcmVfbm9jaGVja19ub3RyYWNlOgogCVJFU1RPUkVfUkVHUwotCWFkZGwgJDQsICVlc3AKKwlhZGRsICQ0LCAlZXNwCQkJIyBza2lwIG9yaWdfZWF4L2Vycm9yX2NvZGUKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKIDE6CUlOVEVSUlVQVF9SRVRVUk4KIC5zZWN0aW9uIC5maXh1cCwiYXgiCiBpcmV0X2V4YzoKIAlUUkFDRV9JUlFTX09OCi0JRU5BQkxFX0lOVEVSUlVQVFMKKwlFTkFCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCiAJcHVzaGwgJDAJCQkjIG5vIGVycm9yIGNvZGUKIAlwdXNobCAkZG9faXJldF9lcnJvcgogCWptcCBlcnJvcl9jb2RlCkBAIC00MDgsMzMgKzQxOCw0MiBAQAogCiAJQ0ZJX1JFU1RPUkVfU1RBVEUKIGxkdF9zczoKLQlsYXJsIE9MRFNTKCVlc3ApLCAlZWF4CisJbGFybCBQVF9PTERTUyglZXNwKSwgJWVheAogCWpueiByZXN0b3JlX25vY2hlY2sKIAl0ZXN0bCAkMHgwMDQwMDAwMCwgJWVheAkJIyByZXR1cm5pbmcgdG8gMzJiaXQgc3RhY2s/CiAJam56IHJlc3RvcmVfbm9jaGVjawkJIyBhbGxyaWdodCwgbm9ybWFsIHJldHVybgorCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisJLyoKKwkgKiBUaGUga2VybmVsIGNhbid0IHJ1biBvbiBhIG5vbi1mbGF0IHN0YWNrIGlmIHBhcmF2aXJ0IG1vZGUKKwkgKiBpcyBhY3RpdmUuICBSYXRoZXIgdGhhbiB0cnkgdG8gZml4dXAgdGhlIGhpZ2ggYml0cyBvZgorCSAqIEVTUCwgYnlwYXNzIHRoaXMgY29kZSBlbnRpcmVseS4gIFRoaXMgbWF5IGJyZWFrIERPU2VtdQorCSAqIGFuZC9vciBXaW5lIHN1cHBvcnQgaW4gYSBwYXJhdmlydCBWTSwgYWx0aG91Z2ggdGhlIG9wdGlvbgorCSAqIGlzIHN0aWxsIGF2YWlsYWJsZSB0byBpbXBsZW1lbnQgdGhlIHNldHRpbmcgb2YgdGhlIGhpZ2gKKwkgKiAxNi1iaXRzIGluIHRoZSBJTlRFUlJVUFRfUkVUVVJOIHBhcmF2aXJ0LW9wLgorCSAqLworCWNtcGwgJDAsIHBhcmF2aXJ0X29wcytQQVJBVklSVF9lbmFibGVkCisJam5lIHJlc3RvcmVfbm9jaGVjaworI2VuZGlmCisKIAkvKiBJZiByZXR1cm5pbmcgdG8gdXNlcnNwYWNlIHdpdGggMTZiaXQgc3RhY2ssCiAJICogdHJ5IHRvIGZpeCB0aGUgaGlnaGVyIHdvcmQgb2YgRVNQLCBhcyB0aGUgQ1BVCiAJICogd29uJ3QgcmVzdG9yZSBpdC4KIAkgKiBUaGlzIGlzIGFuICJvZmZpY2lhbCIgYnVnIG9mIGFsbCB0aGUgeDg2LWNvbXBhdGlibGUKIAkgKiBDUFVzLCB3aGljaCB3ZSBjYW4gdHJ5IHRvIHdvcmsgYXJvdW5kIHRvIG1ha2UKIAkgKiBkb3NlbXUgYW5kIHdpbmUgaGFwcHkuICovCi0Jc3VibCAkOCwgJWVzcAkJIyByZXNlcnZlIHNwYWNlIGZvciBzd2l0Y2gxNiBwb2ludGVyCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDgKLQlESVNBQkxFX0lOVEVSUlVQVFMKKwltb3ZsIFBUX09MREVTUCglZXNwKSwgJWVheAorCW1vdmwgJWVzcCwgJWVkeAorCWNhbGwgcGF0Y2hfZXNwZml4X2Rlc2MKKwlwdXNobCAkX19FU1BGSVhfU1MKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCXB1c2hsICVlYXgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX0VBWCkKIAlUUkFDRV9JUlFTX09GRgotCW1vdmwgJWVzcCwgJWVheAotCS8qIFNldCB1cCB0aGUgMTZiaXQgc3RhY2sgZnJhbWUgd2l0aCBzd2l0Y2gzMiBwb2ludGVyIG9uIHRvcCwKLQkgKiBhbmQgYSBzd2l0Y2gxNiBwb2ludGVyIG9uIHRvcCBvZiB0aGUgY3VycmVudCBmcmFtZS4gKi8KLQljYWxsIHNldHVwX3g4Nl9ib2d1c19zdGFjawotCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtOAkjIGZyYW1lIGhhcyBtb3ZlZAotCVRSQUNFX0lSUVNfSVJFVAotCVJFU1RPUkVfUkVHUwotCWxzcyAyMCs0KCVlc3ApLCAlZXNwCSMgc3dpdGNoIHRvIDE2Yml0IHN0YWNrCi0xOglJTlRFUlJVUFRfUkVUVVJOCi0uc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgotCS5hbGlnbiA0Ci0JLmxvbmcgMWIsaXJldF9leGMKLS5wcmV2aW91cworCWxzcyAoJWVzcCksICVlc3AKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTgKKwlqbXAgcmVzdG9yZV9ub2NoZWNrCiAJQ0ZJX0VORFBST0MKIAogCSMgcGVyZm9ybSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVzdW1wdGlvbgpAQCAtNDQ1LDcgKzQ2NCw3IEBACiAJanogd29ya19ub3RpZnlzaWcKIHdvcmtfcmVzY2hlZDoKIAljYWxsIHNjaGVkdWxlCi0JRElTQUJMRV9JTlRFUlJVUFRTCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBtaXNzIGFuIGludGVycnVwdAorCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX0FOWSkJIyBtYWtlIHN1cmUgd2UgZG9uJ3QgbWlzcyBhbiBpbnRlcnJ1cHQKIAkJCQkJIyBzZXR0aW5nIG5lZWRfcmVzY2hlZCBvciBzaWdwZW5kaW5nCiAJCQkJCSMgYmV0d2VlbiBzYW1wbGluZyBhbmQgdGhlIGlyZXQKIAlUUkFDRV9JUlFTX09GRgpAQCAtNDU4LDcgKzQ3Nyw4IEBACiAKIHdvcmtfbm90aWZ5c2lnOgkJCQkjIGRlYWwgd2l0aCBwZW5kaW5nIHNpZ25hbHMgYW5kCiAJCQkJCSMgbm90aWZ5LXJlc3VtZSByZXF1ZXN0cwotCXRlc3RsICRWTV9NQVNLLCBFRkxBR1MoJWVzcCkKKyNpZmRlZiBDT05GSUdfVk04NgorCXRlc3RsICRWTV9NQVNLLCBQVF9FRkxBR1MoJWVzcCkKIAltb3ZsICVlc3AsICVlYXgKIAlqbmUgd29ya19ub3RpZnlzaWdfdjg2CQkjIHJldHVybmluZyB0byBrZXJuZWwtc3BhY2Ugb3IKIAkJCQkJIyB2bTg2LXNwYWNlCkBAIC00NjgsMjkgKzQ4OCwzMCBAQAogCiAJQUxJR04KIHdvcmtfbm90aWZ5c2lnX3Y4NjoKLSNpZmRlZiBDT05GSUdfVk04NgogCXB1c2hsICVlY3gJCQkjIHNhdmUgdGlfZmxhZ3MgZm9yIGRvX25vdGlmeV9yZXN1bWUKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCWNhbGwgc2F2ZV92ODZfc3RhdGUJCSMgJWVheCBjb250YWlucyBwdF9yZWdzIHBvaW50ZXIKIAlwb3BsICVlY3gKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKIAltb3ZsICVlYXgsICVlc3AKKyNlbHNlCisJbW92bCAlZXNwLCAlZWF4CisjZW5kaWYKIAl4b3JsICVlZHgsICVlZHgKIAljYWxsIGRvX25vdGlmeV9yZXN1bWUKIAlqbXAgcmVzdW1lX3VzZXJzcGFjZV9zaWcKLSNlbmRpZgogCiAJIyBwZXJmb3JtIHN5c2NhbGwgZXhpdCB0cmFjaW5nCiAJQUxJR04KIHN5c2NhbGxfdHJhY2VfZW50cnk6Ci0JbW92bCAkLUVOT1NZUyxFQVgoJWVzcCkKKwltb3ZsICQtRU5PU1lTLFBUX0VBWCglZXNwKQogCW1vdmwgJWVzcCwgJWVheAogCXhvcmwgJWVkeCwlZWR4CiAJY2FsbCBkb19zeXNjYWxsX3RyYWNlCiAJY21wbCAkMCwgJWVheAogCWpuZSByZXN1bWVfdXNlcnNwYWNlCQkjIHJldCAhPSAwIC0+IHJ1bm5pbmcgdW5kZXIgUFRSQUNFX1NZU0VNVSwKIAkJCQkJIyBzbyBtdXN0IHNraXAgYWN0dWFsIHN5c2NhbGwKLQltb3ZsIE9SSUdfRUFYKCVlc3ApLCAlZWF4CisJbW92bCBQVF9PUklHX0VBWCglZXNwKSwgJWVheAogCWNtcGwgJChucl9zeXNjYWxscyksICVlYXgKIAlqbmFlIHN5c2NhbGxfY2FsbAogCWptcCBzeXNjYWxsX2V4aXQKQEAgLTUwMSw3ICs1MjIsNyBAQAogCXRlc3RiICQoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVHxfVElGX1NJTkdMRVNURVApLCAlY2wKIAlqeiB3b3JrX3BlbmRpbmcKIAlUUkFDRV9JUlFTX09OCi0JRU5BQkxFX0lOVEVSUlVQVFMJCSMgY291bGQgbGV0IGRvX3N5c2NhbGxfdHJhY2UoKSBjYWxsCisJRU5BQkxFX0lOVEVSUlVQVFMoQ0xCUl9BTlkpCSMgY291bGQgbGV0IGRvX3N5c2NhbGxfdHJhY2UoKSBjYWxsCiAJCQkJCSMgc2NoZWR1bGUoKSBpbnN0ZWFkCiAJbW92bCAlZXNwLCAlZWF4CiAJbW92bCAkMSwgJWVkeApAQCAtNTE1LDM5ICs1MzYsMzggQEAKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCVNBVkVfQUxMCiAJR0VUX1RIUkVBRF9JTkZPKCVlYnApCi0JbW92bCAkLUVGQVVMVCxFQVgoJWVzcCkKKwltb3ZsICQtRUZBVUxULFBUX0VBWCglZXNwKQogCWptcCByZXN1bWVfdXNlcnNwYWNlCiAKIHN5c2NhbGxfYmFkc3lzOgotCW1vdmwgJC1FTk9TWVMsRUFYKCVlc3ApCisJbW92bCAkLUVOT1NZUyxQVF9FQVgoJWVzcCkKIAlqbXAgcmVzdW1lX3VzZXJzcGFjZQogCUNGSV9FTkRQUk9DCiAKICNkZWZpbmUgRklYVVBfRVNQRklYX1NUQUNLIFwKLQltb3ZsICVlc3AsICVlYXg7IFwKLQkvKiBzd2l0Y2ggdG8gMzJiaXQgc3RhY2sgdXNpbmcgdGhlIHBvaW50ZXIgb24gdG9wIG9mIDE2Yml0IHN0YWNrICovIFwKLQlsc3MgJXNzOkNQVV8xNkJJVF9TVEFDS19TSVpFLTgsICVlc3A7IFwKLQkvKiBjb3B5IGRhdGEgZnJvbSAxNmJpdCBzdGFjayB0byAzMmJpdCBzdGFjayAqLyBcCi0JY2FsbCBmaXh1cF94ODZfYm9ndXNfc3RhY2s7IFwKLQkvKiBwdXQgRVNQIHRvIHRoZSBwcm9wZXIgbG9jYXRpb24gKi8gXAotCW1vdmwgJWVheCwgJWVzcDsKLSNkZWZpbmUgVU5XSU5EX0VTUEZJWF9TVEFDSyBcCisJLyogc2luY2Ugd2UgYXJlIG9uIGEgd3Jvbmcgc3RhY2ssIHdlIGNhbnQgbWFrZSBpdCBhIEMgY29kZSA6KCAqLyBcCisJbW92bCAlZ3M6UERBX2NwdSwgJWVieDsgXAorCVBFUl9DUFUoY3B1X2dkdF9kZXNjciwgJWVieCk7IFwKKwltb3ZsIEdEU19hZGRyZXNzKCVlYngpLCAlZWJ4OyBcCisJR0VUX0RFU0NfQkFTRShHRFRfRU5UUllfRVNQRklYX1NTLCAlZWJ4LCAlZWF4LCAlYXgsICVhbCwgJWFoKTsgXAorCWFkZGwgJWVzcCwgJWVheDsgXAorCXB1c2hsICRfX0tFUk5FTF9EUzsgXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0OyBcCiAJcHVzaGwgJWVheDsgXAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0OyBcCisJbHNzICglZXNwKSwgJWVzcDsgXAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtODsKKyNkZWZpbmUgVU5XSU5EX0VTUEZJWF9TVEFDSyBcCiAJbW92bCAlc3MsICVlYXg7IFwKLQkvKiBzZWUgaWYgb24gMTZiaXQgc3RhY2sgKi8gXAorCS8qIHNlZSBpZiBvbiBlc3BmaXggc3RhY2sgKi8gXAogCWNtcHcgJF9fRVNQRklYX1NTLCAlYXg7IFwKLQlqZSAyOGY7IFwKLTI3Oglwb3BsICVlYXg7IFwKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQ7IFwKLS5zZWN0aW9uIC5maXh1cCwiYXgiOyBcCi0yODoJbW92bCAkX19LRVJORUxfRFMsICVlYXg7IFwKKwlqbmUgMjdmOyBcCisJbW92bCAkX19LRVJORUxfRFMsICVlYXg7IFwKIAltb3ZsICVlYXgsICVkczsgXAogCW1vdmwgJWVheCwgJWVzOyBcCi0JLyogc3dpdGNoIHRvIDMyYml0IHN0YWNrICovIFwKKwkvKiBzd2l0Y2ggdG8gbm9ybWFsIHN0YWNrICovIFwKIAlGSVhVUF9FU1BGSVhfU1RBQ0s7IFwKLQlqbXAgMjdiOyBcCi0ucHJldmlvdXMKKzI3OjsKIAogLyoKICAqIEJ1aWxkIHRoZSBlbnRyeSBzdHVicyBhbmQgcG9pbnRlciB0YWJsZSB3aXRoCkBAIC02MDgsMTMgKzYyOCwxNiBAQAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJQUxJR04KIGVycm9yX2NvZGU6CisJLyogdGhlIGZ1bmN0aW9uIGFkZHJlc3MgaXMgaW4gJWdzJ3Mgc2xvdCBvbiB0aGUgc3RhY2sgKi8KKwlwdXNobCAlZXMKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCS8qQ0ZJX1JFTF9PRkZTRVQgZXMsIDAqLwogCXB1c2hsICVkcwogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJLypDRklfUkVMX09GRlNFVCBkcywgMCovCiAJcHVzaGwgJWVheAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJQ0ZJX1JFTF9PRkZTRVQgZWF4LCAwCi0JeG9ybCAlZWF4LCAlZWF4CiAJcHVzaGwgJWVicAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJQ0ZJX1JFTF9PRkZTRVQgZWJwLCAwCkBAIC02MjcsNyArNjUwLDYgQEAKIAlwdXNobCAlZWR4CiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlDRklfUkVMX09GRlNFVCBlZHgsIDAKLQlkZWNsICVlYXgJCQkjIGVheCA9IC0xCiAJcHVzaGwgJWVjeAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJQ0ZJX1JFTF9PRkZTRVQgZWN4LCAwCkBAIC02MzUsMTggKzY1NywyMCBAQAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJQ0ZJX1JFTF9PRkZTRVQgZWJ4LCAwCiAJY2xkCi0JcHVzaGwgJWVzCisJcHVzaGwgJWdzCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKLQkvKkNGSV9SRUxfT0ZGU0VUIGVzLCAwKi8KKwkvKkNGSV9SRUxfT0ZGU0VUIGdzLCAwKi8KKwltb3ZsICQoX19LRVJORUxfUERBKSwgJWVjeAorCW1vdmwgJWVjeCwgJWdzCiAJVU5XSU5EX0VTUEZJWF9TVEFDSwogCXBvcGwgJWVjeAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAogCS8qQ0ZJX1JFR0lTVEVSIGVzLCBlY3gqLwotCW1vdmwgRVMoJWVzcCksICVlZGkJCSMgZ2V0IHRoZSBmdW5jdGlvbiBhZGRyZXNzCi0JbW92bCBPUklHX0VBWCglZXNwKSwgJWVkeAkjIGdldCB0aGUgZXJyb3IgY29kZQotCW1vdmwgJWVheCwgT1JJR19FQVgoJWVzcCkKLQltb3ZsICVlY3gsIEVTKCVlc3ApCi0JLypDRklfUkVMX09GRlNFVCBlcywgRVMqLworCW1vdmwgUFRfR1MoJWVzcCksICVlZGkJCSMgZ2V0IHRoZSBmdW5jdGlvbiBhZGRyZXNzCisJbW92bCBQVF9PUklHX0VBWCglZXNwKSwgJWVkeAkjIGdldCB0aGUgZXJyb3IgY29kZQorCW1vdmwgJC0xLCBQVF9PUklHX0VBWCglZXNwKQkjIG5vIHN5c2NhbGwgdG8gcmVzdGFydAorCW1vdiAgJWVjeCwgUFRfR1MoJWVzcCkKKwkvKkNGSV9SRUxfT0ZGU0VUIGdzLCBFUyovCiAJbW92bCAkKF9fVVNFUl9EUyksICVlY3gKIAltb3ZsICVlY3gsICVkcwogCW1vdmwgJWVjeCwgJWVzCkBAIC02ODIsNyArNzA2LDcgQEAKIAlHRVRfQ1IwX0lOVE9fRUFYCiAJdGVzdGwgJDB4NCwgJWVheAkJIyBFTSAobWF0aCBlbXVsYXRpb24gYml0KQogCWpuZSBkZXZpY2Vfbm90X2F2YWlsYWJsZV9lbXVsYXRlCi0JcHJlZW1wdF9zdG9wCisJcHJlZW1wdF9zdG9wKENMQlJfQU5ZKQogCWNhbGwgbWF0aF9zdGF0ZV9yZXN0b3JlCiAJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgogZGV2aWNlX25vdF9hdmFpbGFibGVfZW11bGF0ZToKQEAgLTc1NCw3ICs3NzgsNyBAQAogCWNtcHcgJF9fRVNQRklYX1NTLCAlYXgKIAlwb3BsICVlYXgKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKLQlqZSBubWlfMTZiaXRfc3RhY2sKKwlqZSBubWlfZXNwZml4X3N0YWNrCiAJY21wbCAkc3lzZW50ZXJfZW50cnksKCVlc3ApCiAJamUgbm1pX3N0YWNrX2ZpeHVwCiAJcHVzaGwgJWVheApAQCAtNzk3LDcgKzgyMSw3IEBACiAJRklYX1NUQUNLKDI0LG5taV9zdGFja19jb3JyZWN0LCAxKQogCWptcCBubWlfc3RhY2tfY29ycmVjdAogCi1ubWlfMTZiaXRfc3RhY2s6CitubWlfZXNwZml4X3N0YWNrOgogCS8qIFdlIGhhdmUgYSBSSU5HMF9JTlRfRlJBTUUgaGVyZS4KIAkgKgogCSAqIGNyZWF0ZSB0aGUgcG9pbnRlciB0byBsc3MgYmFjawpAQCAtODA2LDcgKzgzMCw2IEBACiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlwdXNobCAlZXNwCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKLQltb3Z6d2wgJXNwLCAlZXNwCiAJYWRkdyAkNCwgKCVlc3ApCiAJLyogY29weSB0aGUgaXJldCBmcmFtZSBvZiAxMiBieXRlcyAqLwogCS5yZXB0IDMKQEAgLTgxNywxMSArODQwLDExIEBACiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlTQVZFX0FMTAogCUZJWFVQX0VTUEZJWF9TVEFDSwkJIyAlZWF4ID09ICVlc3AKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTIwCSMgdGhlIGZyYW1lIGhhcyBub3cgbW92ZWQKIAl4b3JsICVlZHgsJWVkeAkJCSMgemVybyBlcnJvciBjb2RlCiAJY2FsbCBkb19ubWkKIAlSRVNUT1JFX1JFR1MKLQlsc3MgMTIrNCglZXNwKSwgJWVzcAkJIyBiYWNrIHRvIDE2Yml0IHN0YWNrCisJbHNzIDEyKzQoJWVzcCksICVlc3AJCSMgYmFjayB0byBlc3BmaXggc3RhY2sKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTI0CiAxOglJTlRFUlJVUFRfUkVUVVJOCiAJQ0ZJX0VORFBST0MKIC5zZWN0aW9uIF9fZXhfdGFibGUsImEiCkBAIC04MzAsNiArODUzLDE5IEBACiAucHJldmlvdXMKIEtQUk9CRV9FTkQobm1pKQogCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCitFTlRSWShuYXRpdmVfaXJldCkKKzE6CWlyZXQKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduIDQKKwkubG9uZyAxYixpcmV0X2V4YworLnByZXZpb3VzCisKK0VOVFJZKG5hdGl2ZV9pcnFfZW5hYmxlX3N5c2V4aXQpCisJc3RpCisJc3lzZXhpdAorI2VuZGlmCisKIEtQUk9CRV9FTlRSWShpbnQzKQogCVJJTkcwX0lOVF9GUkFNRQogCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludApAQCAtOTQ5LDI2ICs5ODUsMjcgQEAKIAltb3ZsCTQoJWVzcCksICVlZHgKIAltb3ZsCSglZXNwKSwgJWVjeAogCWxlYWwJNCglZXNwKSwgJWVheAotCW1vdmwJJWVieCwgRUJYKCVlZHgpCisJbW92bAklZWJ4LCBQVF9FQlgoJWVkeCkKIAl4b3JsCSVlYngsICVlYngKLQltb3ZsCSVlYngsIEVDWCglZWR4KQotCW1vdmwJJWVieCwgRURYKCVlZHgpCi0JbW92bAklZXNpLCBFU0koJWVkeCkKLQltb3ZsCSVlZGksIEVESSglZWR4KQotCW1vdmwJJWVicCwgRUJQKCVlZHgpCi0JbW92bAklZWJ4LCBFQVgoJWVkeCkKLQltb3ZsCSRfX1VTRVJfRFMsIERTKCVlZHgpCi0JbW92bAkkX19VU0VSX0RTLCBFUyglZWR4KQotCW1vdmwJJWVieCwgT1JJR19FQVgoJWVkeCkKLQltb3ZsCSVlY3gsIEVJUCglZWR4KQorCW1vdmwJJWVieCwgUFRfRUNYKCVlZHgpCisJbW92bAklZWJ4LCBQVF9FRFgoJWVkeCkKKwltb3ZsCSVlc2ksIFBUX0VTSSglZWR4KQorCW1vdmwJJWVkaSwgUFRfRURJKCVlZHgpCisJbW92bAklZWJwLCBQVF9FQlAoJWVkeCkKKwltb3ZsCSVlYngsIFBUX0VBWCglZWR4KQorCW1vdmwJJF9fVVNFUl9EUywgUFRfRFMoJWVkeCkKKwltb3ZsCSRfX1VTRVJfRFMsIFBUX0VTKCVlZHgpCisJbW92bAkkMCwgUFRfR1MoJWVkeCkKKwltb3ZsCSVlYngsIFBUX09SSUdfRUFYKCVlZHgpCisJbW92bAklZWN4LCBQVF9FSVAoJWVkeCkKIAltb3ZsCTEyKCVlc3ApLCAlZWN4Ci0JbW92bAkkX19LRVJORUxfQ1MsIENTKCVlZHgpCi0JbW92bAklZWJ4LCBFRkxBR1MoJWVkeCkKLQltb3ZsCSVlYXgsIE9MREVTUCglZWR4KQorCW1vdmwJJF9fS0VSTkVMX0NTLCBQVF9DUyglZWR4KQorCW1vdmwJJWVieCwgUFRfRUZMQUdTKCVlZHgpCisJbW92bAklZWF4LCBQVF9PTERFU1AoJWVkeCkKIAltb3ZsCTgoJWVzcCksICVlYXgKIAltb3ZsCSVlY3gsIDgoJWVzcCkKLQltb3ZsCUVCWCglZWR4KSwgJWVieAotCW1vdmwJJF9fS0VSTkVMX0RTLCBPTERTUyglZWR4KQorCW1vdmwJUFRfRUJYKCVlZHgpLCAlZWJ4CisJbW92bAkkX19LRVJORUxfRFMsIFBUX09MRFNTKCVlZHgpCiAJam1wbAkqJWVheAogCUNGSV9FTkRQUk9DCiBFTkRQUk9DKGFyY2hfdW53aW5kX2luaXRfcnVubmluZykKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TIGIvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKaW5kZXggYmU5ZDg4My4uZWRlZjUwOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKQEAgLTU1LDYgKzU1LDEyIEBACiAgKi8KIEVOVFJZKHN0YXJ0dXBfMzIpCiAKKyNpZmRlZiBDT05GSUdfUEFSQVZJUlQKKyAgICAgICAgbW92bCAlY3MsICVlYXgKKyAgICAgICAgdGVzdGwgJDB4MywgJWVheAorICAgICAgICBqbnogc3RhcnR1cF9wYXJhdmlydAorI2VuZGlmCisKIC8qCiAgKiBTZXQgc2VnbWVudHMgdG8ga25vd24gdmFsdWVzLgogICovCkBAIC0zMDIsNiArMzA4LDcgQEAKIAltb3ZsICVlYXgsJWNyMAogCiAJY2FsbCBjaGVja194ODcKKwljYWxsIHNldHVwX3BkYQogCWxnZHQgY3B1X2dkdF9kZXNjcgogCWxpZHQgaWR0X2Rlc2NyCiAJbGptcCAkKF9fS0VSTkVMX0NTKSwkMWYKQEAgLTMxMiwxMiArMzE5LDE1IEBACiAJbW92bCAlZWF4LCVkcwogCW1vdmwgJWVheCwlZXMKIAotCXhvcmwgJWVheCwlZWF4CQkJIyBDbGVhciBGUy9HUyBhbmQgTERUCisJeG9ybCAlZWF4LCVlYXgJCQkjIENsZWFyIEZTIGFuZCBMRFQKIAltb3ZsICVlYXgsJWZzCi0JbW92bCAlZWF4LCVncwogCWxsZHQgJWF4CisKKwltb3ZsICQoX19LRVJORUxfUERBKSwlZWF4CisJbW92ICAlZWF4LCVncworCiAJY2xkCQkJIyBnY2MyIHdhbnRzIHRoZSBkaXJlY3Rpb24gZmxhZyBjbGVhcmVkIGF0IGFsbCB0aW1lcwotCXB1c2hsICVlYXgJCSMgZmFrZSByZXR1cm4gYWRkcmVzcworCXB1c2hsICQwCQkjIGZha2UgcmV0dXJuIGFkZHJlc3MgZm9yIHVud2luZGVyCiAjaWZkZWYgQ09ORklHX1NNUAogCW1vdmIgcmVhZHksICVjbAogCW1vdmIgJDEsIHJlYWR5CkBAIC0zNDYsNiArMzU2LDIzIEBACiAJcmV0CiAKIC8qCisgKiBQb2ludCB0aGUgR0RUIGF0IHRoaXMgQ1BVJ3MgUERBLiAgT24gYm9vdCB0aGlzIHdpbGwgYmUKKyAqIGNwdV9nZHRfdGFibGUgYW5kIGJvb3RfcGRhOyBmb3Igc2Vjb25kYXJ5IENQVXMsIHRoZXNlIHdpbGwgYmUKKyAqIHRoYXQgQ1BVJ3MgR0RUIGFuZCBQREEuCisgKi8KK3NldHVwX3BkYToKKwkvKiBnZXQgdGhlIFBEQSBwb2ludGVyICovCisJbW92bCBzdGFydF9wZGEsICVlYXgKKworCS8qIHNsb3QgdGhlIFBEQSBhZGRyZXNzIGludG8gdGhlIEdEVCAqLworCW1vdiBjcHVfZ2R0X2Rlc2NyKzIsICVlY3gKKwltb3YgJWF4LCAoX19LRVJORUxfUERBKzArMikoJWVjeCkJCS8qIGJhc2UgJiAweDAwMDBmZmZmICovCisJc2hyICQxNiwgJWVheAorCW1vdiAlYWwsIChfX0tFUk5FTF9QREErNCswKSglZWN4KQkJLyogYmFzZSAmIDB4MDBmZjAwMDAgKi8KKwltb3YgJWFoLCAoX19LRVJORUxfUERBKzQrMykoJWVjeCkJCS8qIGJhc2UgJiAweGZmMDAwMDAwICovCisJcmV0CisKKy8qCiAgKiAgc2V0dXBfaWR0CiAgKgogICogIHNldHMgdXAgYSBpZHQgd2l0aCAyNTYgZW50cmllcyBwb2ludGluZyB0bwpAQCAtNDY1LDYgKzQ5MiwzMyBAQAogI2VuZGlmCiAJaXJldAogCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCitzdGFydHVwX3BhcmF2aXJ0OgorCWNsZAorIAltb3ZsICQoaW5pdF90aHJlYWRfdW5pb24rVEhSRUFEX1NJWkUpLCVlc3AKKworCS8qIFdlIHRha2UgcGFpbnMgdG8gcHJlc2VydmUgYWxsIHRoZSByZWdzLiAqLworCXB1c2hsCSVlZHgKKwlwdXNobAklZWN4CisJcHVzaGwJJWVheAorCisJLyogcGFyYXZpcnQubyBpcyBsYXN0IGluIGxpbmssIGFuZCB0aGF0IHByb2JlIGZuIG5ldmVyIHJldHVybnMgKi8KKwlwdXNobAkkX19zdGFydF9wYXJhdmlydHByb2JlCisxOgorCW1vdmwJMCglZXNwKSwgJWVheAorCXB1c2hsCSglZWF4KQorCW1vdmwJOCglZXNwKSwgJWVheAorCWNhbGwJKiglZXNwKQorCXBvcGwJJWVheAorCisJbW92bAk0KCVlc3ApLCAlZWF4CisJbW92bAk4KCVlc3ApLCAlZWN4CisJbW92bAkxMiglZXNwKSwgJWVkeAorCisJYWRkbAkkNCwgKCVlc3ApCisJam1wCTFiCisjZW5kaWYKKwogLyoKICAqIFJlYWwgYmVnaW5uaW5nIG9mIG5vcm1hbCAidGV4dCIgc2VnbWVudAogICovCkBAIC00ODQsNiArNTM4LDggQEAKICAqIFRoaXMgc3RhcnRzIHRoZSBkYXRhIHNlY3Rpb24uCiAgKi8KIC5kYXRhCitFTlRSWShzdGFydF9wZGEpCisJLmxvbmcgYm9vdF9wZGEKIAogRU5UUlkoc3RhY2tfc3RhcnQpCiAJLmxvbmcgaW5pdF90aHJlYWRfdW5pb24rVEhSRUFEX1NJWkUKQEAgLTUyNSw3ICs1ODEsNyBAQAogCiAjIGJvb3QgR0RUIGRlc2NyaXB0b3IgKGxhdGVyIG9uIHVzZWQgYnkgQ1BVIzApOgogCS53b3JkIDAJCQkJIyAzMiBiaXQgYWxpZ24gZ2R0X2Rlc2MuYWRkcmVzcwotY3B1X2dkdF9kZXNjcjoKK0VOVFJZKGNwdV9nZHRfZGVzY3IpCiAJLndvcmQgR0RUX0VOVFJJRVMqOC0xCiAJLmxvbmcgY3B1X2dkdF90YWJsZQogCkBAIC01ODQsOCArNjQwLDggQEAKIAkucXVhZCAweDAwMDA5YTAwMDAwMGZmZmYJLyogMHhjMCBBUE0gQ1MgMTYgY29kZSAoMTYgYml0KSAqLwogCS5xdWFkIDB4MDA0MDkyMDAwMDAwZmZmZgkvKiAweGM4IEFQTSBEUyAgICBkYXRhICovCiAKLQkucXVhZCAweDAwMDA5MjAwMDAwMDAwMDAJLyogMHhkMCAtIEVTUEZJWCAxNi1iaXQgU1MgKi8KLQkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHhkOCAtIHVudXNlZCAqLworCS5xdWFkIDB4MDBjMDkyMDAwMDAwMDAwMAkvKiAweGQwIC0gRVNQRklYIFNTICovCisJLnF1YWQgMHgwMGNmOTIwMDAwMDBmZmZmCS8qIDB4ZDggLSBQREEgKi8KIAkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHhlMCAtIHVudXNlZCAqLwogCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweGU4IC0gdW51c2VkICovCiAJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ZjAgLSB1bnVzZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9ocGV0LmMKaW5kZXggMTc2NDdhNS4uNDVhODY4NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9ocGV0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9ocGV0LmMKQEAgLTM0LDYgKzM0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGhwZXRfcGVyaW9kOwogCXZvaWQgX19pb21lbSogaHBldF9iYXNlOwogCXU2NCB0bXA7CisJaW50IGVycjsKIAogCWlmICghaXNfaHBldF9lbmFibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNjEsNyArNjIsMTEgQEAKIAlkb19kaXYodG1wLCBGU0VDX1BFUl9OU0VDKTsKIAljbG9ja3NvdXJjZV9ocGV0Lm11bHQgPSAodTMyKXRtcDsKIAotCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfaHBldCk7CisJZXJyID0gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2hwZXQpOworCWlmIChlcnIpCisJCWlvdW5tYXAoaHBldF9iYXNlKTsKKworCXJldHVybiBlcnI7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfaHBldF9jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2k4MjUzLmMgYi9hcmNoL2kzODYva2VybmVsL2k4MjUzLmMKaW5kZXggNDc3YjI0ZC4uOWEwMDYwYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTMuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcGl0X2Nsb2Nrc291cmNlKHZvaWQpCiB7Ci0JaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiA0KSAvKiBQSVQgZG9lcyBub3Qgc2NhbGUhICovCisJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKSAvKiBQSVQgZG9lcyBub3Qgc2NhbGUhICovCiAJCXJldHVybiAwOwogCiAJY2xvY2tzb3VyY2VfcGl0Lm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KENMT0NLX1RJQ0tfUkFURSwgMjApOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCmluZGV4IGQ1M2VhZmIuLmM4ZDQ1ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKQEAgLTExMyw3ICsxMTMsOCBAQAogewogCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwogCWlvX2FwaWNfaXJxcyAmPSB+KDE8PGlycSk7Ci0Jc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmk4MjU5QV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpODI1OUFfY2hpcCwgaGFuZGxlX2xldmVsX2lycSwKKwkJCQkgICAgICAiWFQiKTsKIAllbmFibGVfaXJxKGlycSk7CiB9CiAKQEAgLTM2OSw4ICszNzAsOCBAQAogCQkJLyoKIAkJCSAqIDE2IG9sZC1zdHlsZSBJTlRBLWN5Y2xlIGludGVycnVwdHM6CiAJCQkgKi8KLQkJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmaTgyNTlBX2NoaXAsCi0JCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpLCAmaTgyNTlBX2NoaXAsCisJCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAiWFQiKTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiAnaGlnaCcgUENJIElSUXMgZmlsbGVkIGluIG9uIGRlbWFuZApAQCAtMzgwLDcgKzM4MSwxMCBAQAogCX0KIH0KIAotdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKKy8qIE92ZXJyaWRkZW4gaW4gcGFyYXZpcnQuYyAqLwordm9pZCBpbml0X0lSUSh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygibmF0aXZlX2luaXRfSVJRIikpKTsKKwordm9pZCBfX2luaXQgbmF0aXZlX2luaXRfSVJRKHZvaWQpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggMjdiY2VhZi4uMjQyNGNjOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9odGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KQEAgLTkxLDYgKzkyLDQ2IEBACiAJaW50IGFwaWMsIHBpbiwgbmV4dDsKIH0gaXJxXzJfcGluW1BJTl9NQVBfU0laRV07CiAKK3N0cnVjdCBpb19hcGljIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHVudXNlZFszXTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKK307CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9jb25zdF9fIHN0cnVjdCBpb19hcGljIF9faW9tZW0gKmlvX2FwaWNfYmFzZShpbnQgaWR4KQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopIF9fZml4X3RvX3ZpcnQoRklYX0lPX0FQSUNfQkFTRV8wICsgaWR4KQorCQkrIChtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyICYgflBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlvX2FwaWNfcmVhZCh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOworCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CisJcmV0dXJuIHJlYWRsKCZpb19hcGljLT5kYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfd3JpdGUodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOworCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CisJd3JpdGVsKHZhbHVlLCAmaW9fYXBpYy0+ZGF0YSk7Cit9CisKKy8qCisgKiBSZS13cml0ZSBhIHZhbHVlOiB0byBiZSB1c2VkIGZvciByZWFkLW1vZGlmeS13cml0ZQorICogY3ljbGVzIHdoZXJlIHRoZSByZWFkIGFscmVhZHkgc2V0IHVwIHRoZSBpbmRleCByZWdpc3Rlci4KKyAqCisgKiBPbGRlciBTaVMgQVBJQyByZXF1aXJlcyB3ZSByZXdyaXRlIHRoZSBpbmRleCByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19tb2RpZnkodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgaW9fYXBpYyAqaW9fYXBpYyA9IGlvX2FwaWNfYmFzZShhcGljKTsKKwlpZiAoc2lzX2FwaWNfYnVnKQorCQl3cml0ZWwocmVnLCAmaW9fYXBpYy0+aW5kZXgpOworCXdyaXRlbCh2YWx1ZSwgJmlvX2FwaWMtPmRhdGEpOworfQorCiB1bmlvbiBlbnRyeV91bmlvbiB7CiAJc3RydWN0IHsgdTMyIHcxLCB3MjsgfTsKIAlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKQEAgLTEwNywxMSArMTQ4LDM5IEBACiAJcmV0dXJuIGV1LmVudHJ5OwogfQogCisvKgorICogV2hlbiB3ZSB3cml0ZSBhIG5ldyBJTyBBUElDIHJvdXRpbmcgZW50cnksIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGhpZ2gKKyAqIHdvcmQgZmlyc3QhIElmIHRoZSBtYXNrIGJpdCBpbiB0aGUgbG93IHdvcmQgaXMgY2xlYXIsIHdlIHdpbGwgZW5hYmxlCisgKiB0aGUgaW50ZXJydXB0LCBhbmQgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGVudHJ5IGlzIGZ1bGx5IHBvcHVsYXRlZAorICogYmVmb3JlIHRoYXQgaGFwcGVucy4KKyAqLworc3RhdGljIHZvaWQKK19faW9hcGljX3dyaXRlX2VudHJ5KGludCBhcGljLCBpbnQgcGluLCBzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlKQoreworCXVuaW9uIGVudHJ5X3VuaW9uIGV1OworCWV1LmVudHJ5ID0gZTsKKwlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyAyKnBpbiwgZXUudzIpOworCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMCArIDIqcGluLCBldS53MSk7Cit9CisKIHN0YXRpYyB2b2lkIGlvYXBpY193cml0ZV9lbnRyeShpbnQgYXBpYywgaW50IHBpbiwgc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuaW9uIGVudHJ5X3VuaW9uIGV1OwotCWV1LmVudHJ5ID0gZTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlfX2lvYXBpY193cml0ZV9lbnRyeShhcGljLCBwaW4sIGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBXaGVuIHdlIG1hc2sgYW4gSU8gQVBJQyByb3V0aW5nIGVudHJ5LCB3ZSBuZWVkIHRvIHdyaXRlIHRoZSBsb3cKKyAqIHdvcmQgZmlyc3QsIGluIG9yZGVyIHRvIHNldCB0aGUgbWFzayBiaXQgYmVmb3JlIHdlIGNoYW5nZSB0aGUKKyAqIGhpZ2ggYml0cyEKKyAqLworc3RhdGljIHZvaWQgaW9hcGljX21hc2tfZW50cnkoaW50IGFwaWMsIGludCBwaW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBlbnRyeV91bmlvbiBldSA9IHsgLmVudHJ5Lm1hc2sgPSAxIH07CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTAgKyAyKnBpbiwgZXUudzEpOwogCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIDIqcGluLCBldS53Mik7CkBAIC0yMzQsOSArMzAzLDcgQEAKIAkvKgogCSAqIERpc2FibGUgaXQgaW4gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CiAJICovCi0JbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7Ci0JZW50cnkubWFzayA9IDE7Ci0JaW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZW50cnkpOworCWlvYXBpY19tYXNrX2VudHJ5KGFwaWMsIHBpbik7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFyX0lPX0FQSUMgKHZvaWQpCkBAIC03NzYsOCArODQzLDcgQEAKIAogCQlpZiAoKG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19JU0EgfHwKIAkJICAgICBtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfRUlTQSB8fAotCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19NQ0EgfHwKLQkJICAgICBtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfTkVDOTgKKwkJICAgICBtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfTUNBCiAJCSAgICApICYmCiAJCSAgICAobXBfaXJxc1tpXS5tcGNfaXJxdHlwZSA9PSB0eXBlKSAmJgogCQkgICAgKG1wX2lycXNbaV0ubXBjX3NyY2J1c2lycSA9PSBpcnEpKQpAQCAtNzk2LDggKzg2Miw3IEBACiAKIAkJaWYgKChtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfSVNBIHx8CiAJCSAgICAgbXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX0VJU0EgfHwKLQkJICAgICBtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfTUNBIHx8Ci0JCSAgICAgbXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX05FQzk4CisJCSAgICAgbXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX01DQQogCQkgICAgKSAmJgogCQkgICAgKG1wX2lycXNbaV0ubXBjX2lycXR5cGUgPT0gdHlwZSkgJiYKIAkJICAgIChtcF9pcnFzW2ldLm1wY19zcmNidXNpcnEgPT0gaXJxKSkKQEAgLTkyNywxMiArOTkyLDYgQEAKICNkZWZpbmUgZGVmYXVsdF9NQ0FfdHJpZ2dlcihpZHgpCSgxKQogI2RlZmluZSBkZWZhdWx0X01DQV9wb2xhcml0eShpZHgpCSgwKQogCi0vKiBORUM5OCBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgcG9sYXJpdHkgemVybyBlZGdlIHRyaWdnZXJlZCwKLSAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLwotCi0jZGVmaW5lIGRlZmF1bHRfTkVDOThfdHJpZ2dlcihpZHgpICAgICAoMCkKLSNkZWZpbmUgZGVmYXVsdF9ORUM5OF9wb2xhcml0eShpZHgpICAgICgwKQotCiBzdGF0aWMgaW50IF9faW5pdCBNUEJJT1NfcG9sYXJpdHkoaW50IGlkeCkKIHsKIAlpbnQgYnVzID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXM7CkBAIC05NjcsMTEgKzEwMjYsNiBAQAogCQkJCQlwb2xhcml0eSA9IGRlZmF1bHRfTUNBX3BvbGFyaXR5KGlkeCk7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQljYXNlIE1QX0JVU19ORUM5ODogLyogTkVDIDk4IHBpbiAqLwotCQkJCXsKLQkJCQkJcG9sYXJpdHkgPSBkZWZhdWx0X05FQzk4X3BvbGFyaXR5KGlkeCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KIAkJCQlkZWZhdWx0OgogCQkJCXsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnJva2VuIEJJT1MhIVxuIik7CkBAIC0xMDQxLDExICsxMDk1LDYgQEAKIAkJCQkJdHJpZ2dlciA9IGRlZmF1bHRfTUNBX3RyaWdnZXIoaWR4KTsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWNhc2UgTVBfQlVTX05FQzk4OiAvKiBORUMgOTggcGluICovCi0JCQkJewotCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9ORUM5OF90cmlnZ2VyKGlkeCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KIAkJCQlkZWZhdWx0OgogCQkJCXsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnJva2VuIEJJT1MhIVxuIik7CkBAIC0xMTA3LDcgKzExNTYsNiBAQAogCQljYXNlIE1QX0JVU19JU0E6IC8qIElTQSBwaW4gKi8KIAkJY2FzZSBNUF9CVVNfRUlTQToKIAkJY2FzZSBNUF9CVVNfTUNBOgotCQljYXNlIE1QX0JVU19ORUM5ODoKIAkJewogCQkJaXJxID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXNpcnE7CiAJCQlicmVhazsKQEAgLTExNzUsNyArMTIyMyw3IEBACiB9CiAKIC8qIGlycV92ZWN0b3JzIGlzIGluZGV4ZWQgYnkgdGhlIHN1bSBvZiBhbGwgUlRFcyBpbiBhbGwgSS9PIEFQSUNzLiAqLwotdTggaXJxX3ZlY3RvcltOUl9JUlFfVkVDVE9SU10gX19yZWFkX21vc3RseSA9IHsgRklSU1RfREVWSUNFX1ZFQ1RPUiAsIDAgfTsKK3N0YXRpYyB1OCBpcnFfdmVjdG9yW05SX0lSUV9WRUNUT1JTXSBfX3JlYWRfbW9zdGx5ID0geyBGSVJTVF9ERVZJQ0VfVkVDVE9SICwgMCB9OwogCiBzdGF0aWMgaW50IF9fYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSkKIHsKQEAgLTEyMjUsMTEgKzEyNzMsMTMgQEAKIHsKIAlpZiAoKHRyaWdnZXIgPT0gSU9BUElDX0FVVE8gJiYgSU9fQVBJQ19pcnFfdHJpZ2dlcihpcnEpKSB8fAogCQkJdHJpZ2dlciA9PSBJT0FQSUNfTEVWRUwpCi0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZpb2FwaWNfY2hpcCwKLQkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSk7Ci0JZWxzZQotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmaW9hcGljX2NoaXAsCi0JCQkJCSBoYW5kbGVfZWRnZV9pcnEpOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpb2FwaWNfY2hpcCwKKwkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSwgImZhc3Rlb2kiKTsKKwllbHNlIHsKKwkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgfD0gSVJRX0RFTEFZRURfRElTQUJMRTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaW9hcGljX2NoaXAsCisJCQkJCSBoYW5kbGVfZWRnZV9pcnEsICJlZGdlIik7CisJfQogCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbaXJxXSk7CiB9CiAKQEAgLTEyOTgsOCArMTM0OCw4IEBACiAJCQlpZiAoIWFwaWMgJiYgKGlycSA8IDE2KSkKIAkJCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOwogCQl9Ci0JCWlvYXBpY193cml0ZV9lbnRyeShhcGljLCBwaW4sIGVudHJ5KTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCV9faW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZW50cnkpOwogCQlzZXRfbmF0aXZlX2lycV9pbmZvKGlycSwgVEFSR0VUX0NQVVMpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCX0KQEAgLTE4NjQsNiArMTkxNCwxNSBAQAogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2lvYXBpY19pZHNfZnJvbV9tcGModm9pZCkgeyB9CiAjZW5kaWYKIAorc3RhdGljIGludCBub190aW1lcl9jaGVjayBfX2luaXRkYXRhOworCitzdGF0aWMgaW50IF9faW5pdCBub3RpbWVyY2hlY2soY2hhciAqcykKK3sKKwlub190aW1lcl9jaGVjayA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJub190aW1lcl9jaGVjayIsIG5vdGltZXJjaGVjayk7CisKIC8qCiAgKiBUaGVyZSBpcyBhIG5hc3R5IGJ1ZyBpbiBzb21lIG9sZGVyIFNNUCBib2FyZHMsIHRoZWlyIG1wdGFibGUgbGllcwogICogYWJvdXQgdGhlIHRpbWVyIElSUS4gV2UgZG8gdGhlIGZvbGxvd2luZyB0byB3b3JrIGFyb3VuZCB0aGUgc2l0dWF0aW9uOgpAQCAtMTg3MiwxMCArMTkzMSwxMyBAQAogICoJLSBpZiB0aGlzIGZ1bmN0aW9uIGRldGVjdHMgdGhhdCB0aW1lciBJUlFzIGFyZSBkZWZ1bmN0LCB0aGVuIHdlIGZhbGwKICAqCSAgYmFjayB0byBJU0EgdGltZXIgSVJRcwogICovCi1zdGF0aWMgaW50IF9faW5pdCB0aW1lcl9pcnFfd29ya3Modm9pZCkKK2ludCBfX2luaXQgdGltZXJfaXJxX3dvcmtzKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0MSA9IGppZmZpZXM7CiAKKwlpZiAobm9fdGltZXJfY2hlY2spCisJCXJldHVybiAxOworCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCS8qIExldCB0ZW4gdGlja3MgcGFzcy4uLiAqLwogCW1kZWxheSgoMTAgKiAxMDAwKSAvIEhaKTsKQEAgLTIwOTksOSArMjE2MSwxNSBAQAogCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sLCBzYXZlX2ZyZXFfc2VsZWN0OwogCiAJcGluICA9IGZpbmRfaXNhX2lycV9waW4oOCwgbXBfSU5UKTsKLQlhcGljID0gZmluZF9pc2FfaXJxX2FwaWMoOCwgbXBfSU5UKTsKLQlpZiAocGluID09IC0xKQorCWlmIChwaW4gPT0gLTEpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOwogCQlyZXR1cm47CisJfQorCWFwaWMgPSBmaW5kX2lzYV9pcnFfYXBpYyg4LCBtcF9JTlQpOworCWlmIChhcGljID09IC0xKSB7CisJCVdBUk5fT05fT05DRSgxKTsKKwkJcmV0dXJuOworCX0KIAogCWVudHJ5MCA9IGlvYXBpY19yZWFkX2VudHJ5KGFwaWMsIHBpbik7CiAJY2xlYXJfSU9fQVBJQ19waW4oYXBpYywgcGluKTsKQEAgLTIxNDYsNyArMjIxNCw3IEBACiAgKiBpcyBzbyBzY3Jld3kuICBUaGFua3MgdG8gQnJpYW4gUGVya2lucyBmb3IgdGVzdGluZy9oYWNraW5nIHRoaXMgYmVhc3QKICAqIGZhbmF0aWNhbGx5IG9uIGhpcyB0cnVseSBidWdneSBib2FyZC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3RpbWVyKHZvaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IGNoZWNrX3RpbWVyKHZvaWQpCiB7CiAJaW50IGFwaWMxLCBwaW4xLCBhcGljMiwgcGluMjsKIAlpbnQgdmVjdG9yOwpAQCAtMjIzNSw3ICsyMzAzLDggQEAKIAlwcmludGsoS0VSTl9JTkZPICIuLi50cnlpbmcgdG8gc2V0IHVwIHRpbWVyIGFzIFZpcnR1YWwgV2lyZSBJUlEuLi4iKTsKIAogCWRpc2FibGVfODI1OUFfaXJxKDApOwotCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcigwLCAmbGFwaWNfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZSgwLCAmbGFwaWNfY2hpcCwgaGFuZGxlX2Zhc3Rlb2lfaXJxLAorCQkJCSAgICAgICJmYXN0ZWlvIik7CiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0RNX0ZJWEVEIHwgdmVjdG9yKTsJLyogRml4ZWQgbW9kZSAqLwogCWVuYWJsZV84MjU5QV9pcnEoMCk7CiAKQEAgLTI0MTYsNyArMjQ4NSw3IEBACiBpbnQgY3JlYXRlX2lycSh2b2lkKQogewogCS8qIEFsbG9jYXRlIGFuIHVudXNlZCBpcnEgKi8KLQlpbnQgaXJxLCBuZXcsIHZlY3RvcjsKKwlpbnQgaXJxLCBuZXcsIHZlY3RvciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlycSA9IC1FTk9TUEM7CkBAIC0yNTQxLDcgKzI2MTAsOCBAQAogCiAJd3JpdGVfbXNpX21zZyhpcnEsICZtc2cpOwogCi0Jc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJm1zaV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJm1zaV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEsCisJCQkJICAgICAgImVkZ2UiKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjU2MiwxOCArMjYzMiwxNiBAQAogCiBzdGF0aWMgdm9pZCB0YXJnZXRfaHRfaXJxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBkZXN0KQogewotCXUzMiBsb3csIGhpZ2g7Ci0JbG93ICA9IHJlYWRfaHRfaXJxX2xvdyhpcnEpOwotCWhpZ2ggPSByZWFkX2h0X2lycV9oaWdoKGlycSk7CisJc3RydWN0IGh0X2lycV9tc2cgbXNnOworCWZldGNoX2h0X2lycV9tc2coaXJxLCAmbXNnKTsKIAotCWxvdyAgJj0gfihIVF9JUlFfTE9XX0RFU1RfSURfTUFTSyk7Ci0JaGlnaCAmPSB+KEhUX0lSUV9ISUdIX0RFU1RfSURfTUFTSyk7CisJbXNnLmFkZHJlc3NfbG8gJj0gfihIVF9JUlFfTE9XX0RFU1RfSURfTUFTSyk7CisJbXNnLmFkZHJlc3NfaGkgJj0gfihIVF9JUlFfSElHSF9ERVNUX0lEX01BU0spOwogCi0JbG93ICB8PSBIVF9JUlFfTE9XX0RFU1RfSUQoZGVzdCk7Ci0JaGlnaCB8PSBIVF9JUlFfSElHSF9ERVNUX0lEKGRlc3QpOworCW1zZy5hZGRyZXNzX2xvIHw9IEhUX0lSUV9MT1dfREVTVF9JRChkZXN0KTsKKwltc2cuYWRkcmVzc19oaSB8PSBIVF9JUlFfSElHSF9ERVNUX0lEKGRlc3QpOwogCi0Jd3JpdGVfaHRfaXJxX2xvdyhpcnEsIGxvdyk7Ci0Jd3JpdGVfaHRfaXJxX2hpZ2goaXJxLCBoaWdoKTsKKwl3cml0ZV9odF9pcnFfbXNnKGlycSwgJm1zZyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9odF9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IG1hc2spCkBAIC0yNjExLDcgKzI2NzksNyBAQAogCiAJdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoaXJxKTsKIAlpZiAodmVjdG9yID49IDApIHsKLQkJdTMyIGxvdywgaGlnaDsKKwkJc3RydWN0IGh0X2lycV9tc2cgbXNnOwogCQl1bnNpZ25lZCBkZXN0OwogCQljcHVtYXNrX3QgdG1wOwogCkBAIC0yNjE5LDkgKzI2ODcsMTAgQEAKIAkJY3B1X3NldCh2ZWN0b3IgPj4gOCwgdG1wKTsKIAkJZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZCh0bXApOwogCi0JCWhpZ2ggPSAJSFRfSVJRX0hJR0hfREVTVF9JRChkZXN0KTsKKwkJbXNnLmFkZHJlc3NfaGkgPSBIVF9JUlFfSElHSF9ERVNUX0lEKGRlc3QpOwogCi0JCWxvdyA9CUhUX0lSUV9MT1dfQkFTRSB8CisJCW1zZy5hZGRyZXNzX2xvID0KKwkJCUhUX0lSUV9MT1dfQkFTRSB8CiAJCQlIVF9JUlFfTE9XX0RFU1RfSUQoZGVzdCkgfAogCQkJSFRfSVJRX0xPV19WRUNUT1IodmVjdG9yKSB8CiAJCQkoKElOVF9ERVNUX01PREUgPT0gMCkgPwpAQCAtMjYzMywxMCArMjcwMiwxMCBAQAogCQkJCUhUX0lSUV9MT1dfTVRfQVJCSVRSQVRFRCkgfAogCQkJSFRfSVJRX0xPV19JUlFfTUFTS0VEOwogCi0JCXdyaXRlX2h0X2lycV9sb3coaXJxLCBsb3cpOwotCQl3cml0ZV9odF9pcnFfaGlnaChpcnEsIGhpZ2gpOworCQl3cml0ZV9odF9pcnFfbXNnKGlycSwgJm1zZyk7CiAKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmh0X2lycV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZodF9pcnFfY2hpcCwKKwkJCQkJICAgICAgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwogCX0KIAlyZXR1cm4gdmVjdG9yOwogfQpAQCAtMjc5Myw4ICsyODYyLDggQEAKIAlpZiAoIWlvYXBpYyAmJiAoaXJxIDwgMTYpKQogCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOwogCi0JaW9hcGljX3dyaXRlX2VudHJ5KGlvYXBpYywgcGluLCBlbnRyeSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJX19pb2FwaWNfd3JpdGVfZW50cnkoaW9hcGljLCBwaW4sIGVudHJ5KTsKIAlzZXRfbmF0aXZlX2lycV9pbmZvKGlycSwgVEFSR0VUX0NQVVMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCmluZGV4IDhjZmM3ZGIuLjMyMDFkNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKICNlbmRpZgogCQlzZXFfcHJpbnRmKHAsICIgJThzIiwgaXJxX2Rlc2NbaV0uY2hpcC0+bmFtZSk7Ci0JCXNlcV9wcmludGYocCwgIi0lcyIsIGhhbmRsZV9pcnFfbmFtZShpcnFfZGVzY1tpXS5oYW5kbGVfaXJxKSk7CisJCXNlcV9wcmludGYocCwgIi0lLThzIiwgaXJxX2Rlc2NbaV0ubmFtZSk7CiAJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOwogCiAJCWZvciAoYWN0aW9uPWFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGQ5OGU0NGIuLmFmMWQ1MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCkBAIC0xODQsNyArMTg0LDcgQEAKIHZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7Ci0JZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbik7CisJZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbiwgKHAtPmFpbnNuLmJvb3N0YWJsZSA9PSAxKSk7CiAJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOwogfQogCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkJcmV0dXJuIDE7CiAKIHNzX3Byb2JlOgotI2lmbmRlZiBDT05GSUdfUFJFRU1QVAorI2lmICFkZWZpbmVkKENPTkZJR19QUkVFTVBUKSB8fCBkZWZpbmVkKENPTkZJR19QTSkKIAlpZiAocC0+YWluc24uYm9vc3RhYmxlID09IDEgJiYgIXAtPnBvc3RfaGFuZGxlcil7CiAJCS8qIEJvb3N0IHVwIC0tIHdlIGNhbiBleGVjdXRlIGNvcGllZCBpbnN0cnVjdGlvbnMgZGlyZWN0bHkgKi8KIAkJcmVzZXRfY3VycmVudF9rcHJvYmUoKTsKQEAgLTM2MSw4ICszNjEsMTEgQEAKIAlhc20gdm9sYXRpbGUgKCAiLmdsb2JhbCBrcmV0cHJvYmVfdHJhbXBvbGluZVxuIgogCQkJImtyZXRwcm9iZV90cmFtcG9saW5lOiBcbiIKIAkJCSIJcHVzaGZcbiIKLQkJCS8qIHNraXAgY3MsIGVpcCwgb3JpZ19lYXgsIGVzLCBkcyAqLwotCQkJIglzdWJsICQyMCwgJWVzcFxuIgorCQkJLyogc2tpcCBjcywgZWlwLCBvcmlnX2VheCAqLworCQkJIglzdWJsICQxMiwgJWVzcFxuIgorCQkJIglwdXNobCAlZ3NcbiIKKwkJCSIJcHVzaGwgJWRzXG4iCisJCQkiCXB1c2hsICVlc1xuIgogCQkJIglwdXNobCAlZWF4XG4iCiAJCQkiCXB1c2hsICVlYnBcbiIKIAkJCSIJcHVzaGwgJWVkaVxuIgpAQCAtMzczLDEwICszNzYsMTAgQEAKIAkJCSIJbW92bCAlZXNwLCAlZWF4XG4iCiAJCQkiCWNhbGwgdHJhbXBvbGluZV9oYW5kbGVyXG4iCiAJCQkvKiBtb3ZlIGVmbGFncyB0byBjcyAqLwotCQkJIgltb3ZsIDQ4KCVlc3ApLCAlZWR4XG4iCi0JCQkiCW1vdmwgJWVkeCwgNDQoJWVzcClcbiIKKwkJCSIJbW92bCA1MiglZXNwKSwgJWVkeFxuIgorCQkJIgltb3ZsICVlZHgsIDQ4KCVlc3ApXG4iCiAJCQkvKiBzYXZlIHRydWUgcmV0dXJuIGFkZHJlc3Mgb24gZWZsYWdzICovCi0JCQkiCW1vdmwgJWVheCwgNDgoJWVzcClcbiIKKwkJCSIJbW92bCAlZWF4LCA1MiglZXNwKVxuIgogCQkJIglwb3BsICVlYnhcbiIKIAkJCSIJcG9wbCAlZWN4XG4iCiAJCQkiCXBvcGwgJWVkeFxuIgpAQCAtMzg0LDggKzM4Nyw4IEBACiAJCQkiCXBvcGwgJWVkaVxuIgogCQkJIglwb3BsICVlYnBcbiIKIAkJCSIJcG9wbCAlZWF4XG4iCi0JCQkvKiBza2lwIGVpcCwgb3JpZ19lYXgsIGVzLCBkcyAqLwotCQkJIglhZGRsICQxNiwgJWVzcFxuIgorCQkJLyogc2tpcCBlaXAsIG9yaWdfZWF4LCBlcywgZHMsIGdzICovCisJCQkiCWFkZGwgJDIwLCAlZXNwXG4iCiAJCQkiCXBvcGZcbiIKIAkJCSIJcmV0XG4iKTsKIH0KQEAgLTQwNCw2ICs0MDcsMTAgQEAKIAlJTklUX0hMSVNUX0hFQUQoJmVtcHR5X3JwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgma3JldHByb2JlX2xvY2ssIGZsYWdzKTsKIAloZWFkID0ga3JldHByb2JlX2luc3RfdGFibGVfaGVhZChjdXJyZW50KTsKKwkvKiBmaXh1cCByZWdpc3RlcnMgKi8KKwlyZWdzLT54Y3MgPSBfX0tFUk5FTF9DUzsKKwlyZWdzLT5laXAgPSB0cmFtcG9saW5lX2FkZHJlc3M7CisJcmVncy0+b3JpZ19lYXggPSAweGZmZmZmZmZmOwogCiAJLyoKIAkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgpAQCAtNDI1LDYgKzQzMiw3IEBACiAKIAkJaWYgKHJpLT5ycCAmJiByaS0+cnAtPmhhbmRsZXIpewogCQkJX19nZXRfY3B1X3ZhcihjdXJyZW50X2twcm9iZSkgPSAmcmktPnJwLT5rcDsKKwkJCWdldF9rcHJvYmVfY3RsYmxrKCktPmtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfSElUX0FDVElWRTsKIAkJCXJpLT5ycC0+aGFuZGxlcihyaSwgcmVncyk7CiAJCQlfX2dldF9jcHVfdmFyKGN1cnJlbnRfa3Byb2JlKSA9IE5VTEw7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbGR0LmMgYi9hcmNoL2kzODYva2VybmVsL2xkdC5jCmluZGV4IDQ0NTIxMWUuLmI0MTBlNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbGR0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9sZHQuYwpAQCAtMTYwLDE2ICsxNjAsMTQgQEAKIHsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl2b2lkICphZGRyZXNzOwogCiAJZXJyID0gMDsKLQlhZGRyZXNzID0gJmRlZmF1bHRfbGR0WzBdOwogCXNpemUgPSA1KnNpemVvZihzdHJ1Y3QgZGVzY19zdHJ1Y3QpOwogCWlmIChzaXplID4gYnl0ZWNvdW50KQogCQlzaXplID0gYnl0ZWNvdW50OwogCiAJZXJyID0gc2l6ZTsKLQlpZiAoY29weV90b191c2VyKHB0ciwgYWRkcmVzcywgc2l6ZSkpCisJaWYgKGNsZWFyX3VzZXIocHRyLCBzaXplKSkKIAkJZXJyID0gLUVGQVVMVDsKIAogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21jYS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9tY2EuYwppbmRleCBlYjU3YTg1Li5iODM2NzJiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL21jYS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWNhLmMKQEAgLTI4MywxMCArMjgzLDkgQEAKIAlidXMtPmYubWNhX3RyYW5zZm9ybV9tZW1vcnkgPSBtY2FfZHVtbXlfdHJhbnNmb3JtX21lbW9yeTsKIAogCS8qIGdldCB0aGUgbW90aGVyYm9hcmQgZGV2aWNlICovCi0JbWNhX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJbWNhX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYodW5saWtlbHkoIW1jYV9kZXYpKQogCQlnb3RvIG91dF9ub21lbTsKLQltZW1zZXQobWNhX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSk7CiAKIAkvKgogCSAqIFdlIGRvIG5vdCBleHBlY3QgbWFueSBNQ0EgaW50ZXJydXB0cyBkdXJpbmcgaW5pdGlhbGl6YXRpb24sCkBAIC0zMTAsMTEgKzMwOSw5IEBACiAJbWNhX2Rldi0+c2xvdCA9IE1DQV9NT1RIRVJCT0FSRDsKIAltY2FfcmVnaXN0ZXJfZGV2aWNlKE1DQV9QUklNQVJZX0JVUywgbWNhX2Rldik7CiAKLQltY2FfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKwltY2FfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKIAlpZih1bmxpa2VseSghbWNhX2RldikpCiAJCWdvdG8gb3V0X3VubG9ja19ub21lbTsKLQltZW1zZXQobWNhX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSk7Ci0KIAogCS8qIFB1dCBtb3RoZXJib2FyZCBpbnRvIHZpZGVvIHNldHVwIG1vZGUsIHJlYWQgaW50ZWdyYXRlZCB2aWRlbwogCSAqIFBPUyByZWdpc3RlcnMsIGFuZCB0dXJuIG1vdGhlcmJvYXJkIHNldHVwIG9mZi4KQEAgLTM0OSwxMCArMzQ2LDkgQEAKIAl9CiAJaWYod2hpY2hfc2NzaSkgewogCQkvKiBmb3VuZCBhIHNjc2kgY2FyZCAqLwotCQltY2FfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKwkJbWNhX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSwgR0ZQX0FUT01JQyk7CiAJCWlmKHVubGlrZWx5KCFtY2FfZGV2KSkKIAkJCWdvdG8gb3V0X3VubG9ja19ub21lbTsKLQkJbWVtc2V0KG1jYV9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgbWNhX2RldmljZSkpOwogCiAJCWZvcihqID0gMDsgaiA8IDg7IGorKykKIAkJCW1jYV9kZXYtPnBvc1tqXSA9IHBvc1tqXTsKQEAgLTM3OCwxMCArMzc0LDkgQEAKIAkJaWYoIW1jYV9yZWFkX2FuZF9zdG9yZV9wb3MocG9zKSkKIAkJCWNvbnRpbnVlOwogCi0JCW1jYV9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWNhX2RldmljZSksIEdGUF9BVE9NSUMpOworCQltY2FfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKIAkJaWYodW5saWtlbHkoIW1jYV9kZXYpKQogCQkJZ290byBvdXRfdW5sb2NrX25vbWVtOwotCQltZW1zZXQobWNhX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSk7CiAKIAkJZm9yKGo9MDsgajw4OyBqKyspCiAJCQltY2FfZGV2LT5wb3Nbal09cG9zW2pdOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMKaW5kZXggYzRkMDI5MS4uNDdmZmVjNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYworKysgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqCUludGVsIENQVSBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciBmb3IgTGludXgKICAqCi0gKglDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBUaWdyYW4gQWl2YXppYW4KKyAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDA2IFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPgogICoJCSAgICAgIDIwMDYJU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CiAgKgogICoJVGhpcyBkcml2ZXIgYWxsb3dzIHRvIHVwZ3JhZGUgbWljcm9jb2RlIG9uIEludGVsIHByb2Nlc3NvcnMKQEAgLTkyLDcgKzkyLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgQ1BVIChJQS0zMikgTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIlRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPiIpOworTU9EVUxFX0FVVEhPUigiVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNkZWZpbmUgTUlDUk9DT0RFX1ZFUlNJT04gCSIxLjE0YSIKQEAgLTU3Nyw3ICs1NzcsNyBAQAogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CiAJbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKIAljb2xsZWN0X2NwdV9pbmZvKGNwdSk7Ci0JaWYgKHVjaS0+dmFsaWQpCisJaWYgKHVjaS0+dmFsaWQgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKQogCQljcHVfcmVxdWVzdF9taWNyb2NvZGUoY3B1KTsKIAltdXRleF91bmxvY2soJm1pY3JvY29kZV9tdXRleCk7CiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGQpOwpAQCAtNzAzLDcgKzcwMyw2IEBACiAJLnJlc3VtZSA9IG1jX3N5c2Rldl9yZXN1bWUsCiB9OwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgX19jcHVpbml0IGludAogbWNfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewpAQCAtNzI2LDcgKzcyNSw2IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1jX2NwdV9ub3RpZmllciA9IHsKIAkubm90aWZpZXJfY2FsbCA9IG1jX2NwdV9jYWxsYmFjaywKIH07Ci0jZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgbWljcm9jb2RlX2luaXQgKHZvaWQpCiB7CkBAIC03NTQsNyArNzUyLDcgQEAKIAlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1jX2NwdV9ub3RpZmllcik7CiAKIAlwcmludGsoS0VSTl9JTkZPIAotCQkiSUEtMzIgTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXI6IHYiIE1JQ1JPQ09ERV9WRVJTSU9OICIgPHRpZ3JhbkB2ZXJpdGFzLmNvbT5cbiIpOworCQkiSUEtMzIgTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXI6IHYiIE1JQ1JPQ09ERV9WRVJTSU9OICIgPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az5cbiIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21vZHVsZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9tb2R1bGUuYwppbmRleCA0NzBjZjk3Li4zZGIwYTU0NCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2kzODYva2VybmVsL21vZHVsZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KIAogI2lmIDAKICNkZWZpbmUgREVCVUdQIHByaW50awpAQCAtMTA4LDcgKzEwOSw4IEBACiAJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKIAkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQogewotCWNvbnN0IEVsZl9TaGRyICpzLCAqdGV4dCA9IE5VTEwsICphbHQgPSBOVUxMLCAqbG9ja3MgPSBOVUxMOworCWNvbnN0IEVsZl9TaGRyICpzLCAqdGV4dCA9IE5VTEwsICphbHQgPSBOVUxMLCAqbG9ja3MgPSBOVUxMLAorCQkqcGFyYSA9IE5VTEw7CiAJY2hhciAqc2Vjc3RyaW5ncyA9ICh2b2lkICopaGRyICsgc2VjaGRyc1toZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKIAogCWZvciAocyA9IHNlY2hkcnM7IHMgPCBzZWNoZHJzICsgaGRyLT5lX3NobnVtOyBzKyspIHsgCkBAIC0xMTgsNiArMTIwLDggQEAKIAkJCWFsdCA9IHM7CiAJCWlmICghc3RyY21wKCIuc21wX2xvY2tzIiwgc2Vjc3RyaW5ncyArIHMtPnNoX25hbWUpKQogCQkJbG9ja3M9IHM7CisJCWlmICghc3RyY21wKCIucGFyYWluc3RydWN0aW9ucyIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKSkKKwkJCXBhcmEgPSBzOwogCX0KIAogCWlmIChhbHQpIHsKQEAgLTEzMiwxMCArMTM2LDE3IEBACiAJCQkJCSAgICBsc2VnLCBsc2VnICsgbG9ja3MtPnNoX3NpemUsCiAJCQkJCSAgICB0c2VnLCB0c2VnICsgdGV4dC0+c2hfc2l6ZSk7CiAJfQotCXJldHVybiAwOworCisJaWYgKHBhcmEpIHsKKwkJdm9pZCAqcHNlZyA9ICh2b2lkICopcGFyYS0+c2hfYWRkcjsKKwkJYXBwbHlfcGFyYXZpcnQocHNlZywgcHNlZyArIHBhcmEtPnNoX3NpemUpOworCX0KKworCXJldHVybiBtb2R1bGVfYnVnX2ZpbmFsaXplKGhkciwgc2VjaGRycywgbWUpOwogfQogCiB2b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQogewogCWFsdGVybmF0aXZlc19zbXBfbW9kdWxlX2RlbChtb2QpOworCW1vZHVsZV9idWdfY2xlYW51cChtb2QpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwppbmRleCA0NDJhYWY4Li4yY2U2NzIyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYworKysgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwpAQCAtMjQ5LDggKzI0OSw2IEBACiAJCW1wX2N1cnJlbnRfcGNpX2lkKys7CiAJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9NQ0EsIHNpemVvZihCVVNUWVBFX01DQSktMSkgPT0gMCkgewogCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX01DQTsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX05FQzk4LCBzaXplb2YoQlVTVFlQRV9ORUM5OCktMSkgPT0gMCkgewotCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX05FQzk4OwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVua25vd24gYnVzdHlwZSAlcyAtIGlnbm9yaW5nXG4iLCBzdHIpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMgYi9hcmNoL2kzODYva2VybmVsL21zci5jCmluZGV4IGQ1MzVjZGIuLjRhNDcyYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tc3IuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJdTMyIF9fdXNlciAqdG1wID0gKHUzMiBfX3VzZXIgKikgYnVmOwogCXUzMiBkYXRhWzJdOwogCXUzMiByZWcgPSAqcHBvczsKLQlpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWludCBlcnI7CiAKIAlpZiAoY291bnQgJSA4KQpAQCAtMTk1LDE1ICsxOTUsMTQgQEAKIHsKIAljb25zdCB1MzIgX191c2VyICp0bXAgPSAoY29uc3QgdTMyIF9fdXNlciAqKWJ1ZjsKIAl1MzIgZGF0YVsyXTsKLQlzaXplX3QgcnY7CiAJdTMyIHJlZyA9ICpwcG9zOwotCWludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJaW50IGVycjsKIAogCWlmIChjb3VudCAlIDgpCiAJCXJldHVybiAtRUlOVkFMOwkvKiBJbnZhbGlkIGNodW5rIHNpemUgKi8KIAotCWZvciAocnYgPSAwOyBjb3VudDsgY291bnQgLT0gOCkgeworCWZvciAoOyBjb3VudDsgY291bnQgLT0gOCkgewogCQlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsIHRtcCwgOCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJZXJyID0gZG9fd3Jtc3IoY3B1LCByZWcsIGRhdGFbMF0sIGRhdGFbMV0pOwpAQCAtMjE3LDcgKzIxNiw3IEBACiAKIHN0YXRpYyBpbnQgbXNyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJdW5zaWduZWQgaW50IGNwdSA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmKGNwdV9kYXRhKVtjcHVdOwogCiAJaWYgKGNwdSA+PSBOUl9DUFVTIHx8ICFjcHVfb25saW5lKGNwdSkpCkBAIC0yMzksMTggKzIzOCwxNyBAQAogCS5vcGVuID0gbXNyX29wZW4sCiB9OwogCi1zdGF0aWMgaW50IG1zcl9jbGFzc19kZXZpY2VfY3JlYXRlKGludCBpKQorc3RhdGljIGludCBtc3JfZGV2aWNlX2NyZWF0ZShpbnQgaSkKIHsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19lcnI7CisJc3RydWN0IGRldmljZSAqZGV2OwogCi0JY2xhc3NfZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShtc3JfY2xhc3MsIE5VTEwsIE1LREVWKE1TUl9NQUpPUiwgaSksIE5VTEwsICJtc3IlZCIsaSk7Ci0JaWYgKElTX0VSUihjbGFzc19lcnIpKSAKLQkJZXJyID0gUFRSX0VSUihjbGFzc19lcnIpOworCWRldiA9IGRldmljZV9jcmVhdGUobXNyX2NsYXNzLCBOVUxMLCBNS0RFVihNU1JfTUFKT1IsIGkpLCAibXNyJWQiLGkpOworCWlmIChJU19FUlIoZGV2KSkKKwkJZXJyID0gUFRSX0VSUihkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIHN0YXRpYyBpbnQgbXNyX2NsYXNzX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKIAkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKQEAgLTI1OCwxMCArMjU2LDEwIEBACiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX09OTElORToKLQkJbXNyX2NsYXNzX2RldmljZV9jcmVhdGUoY3B1KTsKKwkJbXNyX2RldmljZV9jcmVhdGUoY3B1KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfREVBRDoKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3kobXNyX2NsYXNzLCBNS0RFVihNU1JfTUFKT1IsIGNwdSkpOworCQlkZXZpY2VfZGVzdHJveShtc3JfY2xhc3MsIE1LREVWKE1TUl9NQUpPUiwgY3B1KSk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gTk9USUZZX09LOwpAQCAtMjcxLDcgKzI2OSw2IEBACiB7CiAJLm5vdGlmaWVyX2NhbGwgPSBtc3JfY2xhc3NfY3B1X2NhbGxiYWNrLAogfTsKLSNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdCBtc3JfaW5pdCh2b2lkKQogewpAQCAtMjkwLDcgKzI4Nyw3IEBACiAJCWdvdG8gb3V0X2NocmRldjsKIAl9CiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCWVyciA9IG1zcl9jbGFzc19kZXZpY2VfY3JlYXRlKGkpOworCQllcnIgPSBtc3JfZGV2aWNlX2NyZWF0ZShpKTsKIAkJaWYgKGVyciAhPSAwKQogCQkJZ290byBvdXRfY2xhc3M7CiAJfQpAQCAtMzAyLDcgKzI5OSw3IEBACiBvdXRfY2xhc3M6CiAJaSA9IDA7CiAJZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQljbGFzc19kZXZpY2VfZGVzdHJveShtc3JfY2xhc3MsIE1LREVWKE1TUl9NQUpPUiwgaSkpOworCQlkZXZpY2VfZGVzdHJveShtc3JfY2xhc3MsIE1LREVWKE1TUl9NQUpPUiwgaSkpOwogCWNsYXNzX2Rlc3Ryb3kobXNyX2NsYXNzKTsKIG91dF9jaHJkZXY6CiAJdW5yZWdpc3Rlcl9jaHJkZXYoTVNSX01BSk9SLCAiY3B1L21zciIpOwpAQCAtMzE0LDcgKzMxMSw3IEBACiB7CiAJaW50IGNwdSA9IDA7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCWNsYXNzX2RldmljZV9kZXN0cm95KG1zcl9jbGFzcywgTUtERVYoTVNSX01BSk9SLCBjcHUpKTsKKwkJZGV2aWNlX2Rlc3Ryb3kobXNyX2NsYXNzLCBNS0RFVihNU1JfTUFKT1IsIGNwdSkpOwogCWNsYXNzX2Rlc3Ryb3kobXNyX2NsYXNzKTsKIAl1bnJlZ2lzdGVyX2NocmRldihNU1JfTUFKT1IsICJjcHUvbXNyIik7CiAJdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1zcl9jbGFzc19jcHVfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKaW5kZXggM2U4ZTNhZC4uYTVlMzRkNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vbm1pLmg+CkBAIC00Miw2ICs0Myw4IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgcGVyZmN0cl9ubWlfb3duZXIpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGV2bnRzZWxfbm1pX293bmVyWzNdKTsKIAorc3RhdGljIGNwdW1hc2tfdCBiYWNrdHJhY2VfbWFzayA9IENQVV9NQVNLX05PTkU7CisKIC8qIHRoaXMgbnVtYmVyIGlzIGNhbGN1bGF0ZWQgZnJvbSBJbnRlbCdzIE1TUl9QNF9DUlVfRVNDUjUgcmVnaXN0ZXIgYW5kIGl0J3MKICAqIG9mZnNldCBmcm9tIE1TUl9QNF9CU1VfRVNDUjAuICBJdCB3aWxsIGJlIHRoZSBtYXggZm9yIGFsbCBwbGF0Zm9ybXMgKGZvciBub3cpCiAgKi8KQEAgLTE5Miw2ICsxOTUsOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGVuZGZsYWcgX19pbml0ZGF0YSA9IDA7CisKICNpZmRlZiBDT05GSUdfU01QCiAvKiBUaGUgcGVyZm9ybWFuY2UgY291bnRlcnMgdXNlZCBieSBOTUlfTE9DQUxfQVBJQyBkb24ndCB0cmlnZ2VyIHdoZW4KICAqIHRoZSBDUFUgaXMgaWRsZS4gVG8gbWFrZSBzdXJlIHRoZSBOTUkgd2F0Y2hkb2cgcmVhbGx5IHRpY2tzIG9uIGFsbApAQCAtMTk5LDcgKzIwNCw2IEBACiAgKi8KIHN0YXRpYyBfX2luaXQgdm9pZCBubWlfY3B1X2J1c3kodm9pZCAqZGF0YSkKIHsKLQl2b2xhdGlsZSBpbnQgKmVuZGZsYWcgPSBkYXRhOwogCWxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOwogCS8qIEludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGNwdV9yZWxheCBoZXJlLiBUaGlzIGlzCiAJICAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVhbGx5IHRpY2tzLApAQCAtMjA3LDIzICsyMTEsMjIgQEAKIAkgICBwYXVzZSBpbnN0cnVjdGlvbi4gT24gYSByZWFsIEhUIG1hY2hpbmUgdGhpcyBpcyBmaW5lIGJlY2F1c2UKIAkgICBhbGwgb3RoZXIgQ1BVcyBhcmUgYnVzeSB3aXRoICJ1c2VsZXNzIiBkZWxheSBsb29wcyBhbmQgZG9uJ3QKIAkgICBjYXJlIGlmIHRoZXkgZ2V0IHNvbWV3aGF0IGxlc3MgY3ljbGVzLiAqLwotCXdoaWxlICgqZW5kZmxhZyA9PSAwKQotCQliYXJyaWVyKCk7CisJd2hpbGUgKGVuZGZsYWcgPT0gMCkKKwkJbWIoKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdCBjaGVja19ubWlfd2F0Y2hkb2codm9pZCkKIHsKLQl2b2xhdGlsZSBpbnQgZW5kZmxhZyA9IDA7CiAJdW5zaWduZWQgaW50ICpwcmV2X25taV9jb3VudDsKIAlpbnQgY3B1OwogCiAJLyogRW5hYmxlIE5NSSB3YXRjaGRvZyBmb3IgbmV3ZXIgc3lzdGVtcy4KLSAgICAgICAgICAgQWN0dWFsbHkgaXQgc2hvdWxkIGJlIHNhZmUgZm9yIG1vc3Qgc3lzdGVtcyBiZWZvcmUgMjAwNCB0b28gZXhjZXB0Ci0JICAgZm9yIHNvbWUgSUJNIHN5c3RlbXMgdGhhdCBjb3JydXB0IHJlZ2lzdGVycyB3aGVuIE5NSSBoYXBwZW5zCi0JICAgZHVyaW5nIFNNTS4gVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlIG1vcmUgZXhhY3QgaW5mb3JtYXRpb24KLSAJICAgb24gdGhlc2UgYW5kIHVzZSB0aGlzIGNvYXJzZSBjaGVjay4gKi8KLQlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9ERUZBVUxUICYmIGRtaV9nZXRfeWVhcihETUlfQklPU19EQVRFKSA+PSAyMDA0KQorCSAgIFByb2JhYmx5IHNhZmUgb24gbW9zdCBvbGRlciBzeXN0ZW1zIHRvbywgYnV0IGxldCdzIGJlIGNhcmVmdWwuCisJICAgSUJNIFRoaW5rUGFkcyB1c2UgSU5UMTAgaW5zaWRlIFNNTSBhbmQgdGhhdCBhbGxvd3MgZWFybHkgTk1JIGluc2lkZSBTTU0KKwkgICB3aGljaCBoYW5ncyB0aGUgc3lzdGVtLiBEaXNhYmxlIHdhdGNoZG9nIGZvciBhbGwgdGhpbmtwYWRzICovCisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfREVGQVVMVCAmJiBkbWlfZ2V0X3llYXIoRE1JX0JJT1NfREFURSkgPj0gMjAwNCAmJgorCQkhZG1pX25hbWVfaW5fdmVuZG9ycygiVGhpbmtQYWQiKSkKIAkJbm1pX3dhdGNoZG9nID0gTk1JX0xPQ0FMX0FQSUM7CiAKIAlpZiAoKG5taV93YXRjaGRvZyA9PSBOTUlfTk9ORSkgfHwgKG5taV93YXRjaGRvZyA9PSBOTUlfREVGQVVMVCkpCkBAIC04NjcsMTQgKzg3MCwxNiBAQAogCiB2b2lkIHRvdWNoX25taV93YXRjaGRvZyAodm9pZCkKIHsKLQlpbnQgaTsKKwlpZiAobm1pX3dhdGNoZG9nID4gMCkgeworCQl1bnNpZ25lZCBjcHU7CiAKLQkvKgotCSAqIEp1c3QgcmVzZXQgdGhlIGFsZXJ0IGNvdW50ZXJzLCAob3RoZXIgQ1BVcyBtaWdodCBiZQotCSAqIHNwaW5uaW5nIG9uIGxvY2tzIHdlIGhvbGQpOgotCSAqLwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQlhbGVydF9jb3VudGVyW2ldID0gMDsKKwkJLyoKKwkJICogSnVzdCByZXNldCB0aGUgYWxlcnQgY291bnRlcnMsIChvdGhlciBDUFVzIG1pZ2h0IGJlCisJCSAqIHNwaW5uaW5nIG9uIGxvY2tzIHdlIGhvbGQpOgorCQkgKi8KKwkJZm9yX2VhY2hfcHJlc2VudF9jcHUgKGNwdSkKKwkJCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CisJfQogCiAJLyoKIAkgKiBUaWNrbGUgdGhlIHNvZnRsb2NrdXAgZGV0ZWN0b3IgdG9vOgpAQCAtOTA3LDYgKzkxMiwxNiBAQAogCQl0b3VjaGVkID0gMTsKIAl9CiAKKwlpZiAoY3B1X2lzc2V0KGNwdSwgYmFja3RyYWNlX21hc2spKSB7CisJCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CS8qIFNlcmlhbGlzZSB0aGUgcHJpbnRrcyAqLworCisJCXNwaW5fbG9jaygmbG9jayk7CisJCXByaW50aygiTk1JIGJhY2t0cmFjZSBmb3IgY3B1ICVkXG4iLCBjcHUpOworCQlkdW1wX3N0YWNrKCk7CisJCXNwaW5fdW5sb2NrKCZsb2NrKTsKKwkJY3B1X2NsZWFyKGNwdSwgYmFja3RyYWNlX21hc2spOworCX0KKwogCXN1bSA9IHBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzOwogCiAJLyogaWYgdGhlIGFwaWMgdGltZXIgaXNuJ3QgZmlyaW5nLCB0aGlzIGNwdSBpc24ndCBkb2luZyBtdWNoICovCkBAIC0xMDMzLDYgKzEwNDgsMTkgQEAKIAogI2VuZGlmCiAKK3ZvaWQgX190cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKHZvaWQpCit7CisJaW50IGk7CisKKwliYWNrdHJhY2VfbWFzayA9IGNwdV9vbmxpbmVfbWFwOworCS8qIFdhaXQgZm9yIHVwIHRvIDEwIHNlY29uZHMgZm9yIGFsbCBDUFVzIHRvIGRvIHRoZSBiYWNrdHJhY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAgKiAxMDAwOyBpKyspIHsKKwkJaWYgKGNwdXNfZW1wdHkoYmFja3RyYWNlX21hc2spKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9Cit9CisKIEVYUE9SVF9TWU1CT0wobm1pX2FjdGl2ZSk7CiBFWFBPUlRfU1lNQk9MKG5taV93YXRjaGRvZyk7CiBFWFBPUlRfU1lNQk9MKGF2YWlsX3RvX3Jlc3J2X3BlcmZjdHJfbm1pKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcGFyYXZpcnQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcGFyYXZpcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNlYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wYXJhdmlydC5jCkBAIC0wLDAgKzEsNTY5IEBACisvKiAgUGFyYXZpcnR1YWxpemF0aW9uIGludGVyZmFjZXMKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgUnVzdHkgUnVzc2VsbCBJQk0gQ29ycG9yYXRpb24KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvc3RhcnRfa2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vYnVnLmg+CisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCisvKiBub3Agc3R1YiAqLworc3RhdGljIHZvaWQgbmF0aXZlX25vcCh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZGVmYXVsdF9iYW5uZXIodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJCb290aW5nIHBhcmF2aXJ0dWFsaXplZCBrZXJuZWwgb24gJXNcbiIsCisJICAgICAgIHBhcmF2aXJ0X29wcy5uYW1lKTsKK30KKworY2hhciAqbWVtb3J5X3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBhcmF2aXJ0X29wcy5tZW1vcnlfc2V0dXAoKTsKK30KKworLyogU2ltcGxlIGluc3RydWN0aW9uIHBhdGNoaW5nIGNvZGUuICovCisjZGVmaW5lIERFRl9OQVRJVkUobmFtZSwgY29kZSkJCQkJCVwKKwlleHRlcm4gY29uc3QgY2hhciBzdGFydF8jI25hbWVbXSwgZW5kXyMjbmFtZVtdOwkJXAorCWFzbSgic3RhcnRfIiAjbmFtZSAiOiAiIGNvZGUgIjsgZW5kXyIgI25hbWUgIjoiKQorREVGX05BVElWRShjbGksICJjbGkiKTsKK0RFRl9OQVRJVkUoc3RpLCAic3RpIik7CitERUZfTkFUSVZFKHBvcGYsICJwdXNoICVlYXg7IHBvcGYiKTsKK0RFRl9OQVRJVkUocHVzaGYsICJwdXNoZjsgcG9wICVlYXgiKTsKK0RFRl9OQVRJVkUocHVzaGZfY2xpLCAicHVzaGY7IHBvcCAlZWF4OyBjbGkiKTsKK0RFRl9OQVRJVkUoaXJldCwgImlyZXQiKTsKK0RFRl9OQVRJVkUoc3RpX3N5c2V4aXQsICJzdGk7IHN5c2V4aXQiKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuYXRpdmVfaW5zbnMKK3sKKwljb25zdCBjaGFyICpzdGFydCwgKmVuZDsKK30gbmF0aXZlX2luc25zW10gPSB7CisJW1BBUkFWSVJUX0lSUV9ESVNBQkxFXSA9IHsgc3RhcnRfY2xpLCBlbmRfY2xpIH0sCisJW1BBUkFWSVJUX0lSUV9FTkFCTEVdID0geyBzdGFydF9zdGksIGVuZF9zdGkgfSwKKwlbUEFSQVZJUlRfUkVTVE9SRV9GTEFHU10gPSB7IHN0YXJ0X3BvcGYsIGVuZF9wb3BmIH0sCisJW1BBUkFWSVJUX1NBVkVfRkxBR1NdID0geyBzdGFydF9wdXNoZiwgZW5kX3B1c2hmIH0sCisJW1BBUkFWSVJUX1NBVkVfRkxBR1NfSVJRX0RJU0FCTEVdID0geyBzdGFydF9wdXNoZl9jbGksIGVuZF9wdXNoZl9jbGkgfSwKKwlbUEFSQVZJUlRfSU5URVJSVVBUX1JFVFVSTl0gPSB7IHN0YXJ0X2lyZXQsIGVuZF9pcmV0IH0sCisJW1BBUkFWSVJUX1NUSV9TWVNFWElUXSA9IHsgc3RhcnRfc3RpX3N5c2V4aXQsIGVuZF9zdGlfc3lzZXhpdCB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIG5hdGl2ZV9wYXRjaCh1OCB0eXBlLCB1MTYgY2xvYmJlcnMsIHZvaWQgKmluc25zLCB1bnNpZ25lZCBsZW4pCit7CisJdW5zaWduZWQgaW50IGluc25fbGVuOworCisJLyogRG9uJ3QgdG91Y2ggaXQgaWYgd2UgZG9uJ3QgaGF2ZSBhIHJlcGxhY2VtZW50ICovCisJaWYgKHR5cGUgPj0gQVJSQVlfU0laRShuYXRpdmVfaW5zbnMpIHx8ICFuYXRpdmVfaW5zbnNbdHlwZV0uc3RhcnQpCisJCXJldHVybiBsZW47CisKKwlpbnNuX2xlbiA9IG5hdGl2ZV9pbnNuc1t0eXBlXS5lbmQgLSBuYXRpdmVfaW5zbnNbdHlwZV0uc3RhcnQ7CisKKwkvKiBTaW1pbGFybHkgaWYgd2UgY2FuJ3QgZml0IHJlcGxhY2VtZW50LiAqLworCWlmIChsZW4gPCBpbnNuX2xlbikKKwkJcmV0dXJuIGxlbjsKKworCW1lbWNweShpbnNucywgbmF0aXZlX2luc25zW3R5cGVdLnN0YXJ0LCBpbnNuX2xlbik7CisJcmV0dXJuIGluc25fbGVuOworfQorCitzdGF0aWMgZmFzdGNhbGwgdW5zaWduZWQgbG9uZyBuYXRpdmVfZ2V0X2RlYnVncmVnKGludCByZWdubykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCA9IDA7IAkvKiBEYW1uIHlvdSwgZ2NjISAqLworCisJc3dpdGNoIChyZWdubykgeworCWNhc2UgMDoKKwkJYXNtKCJtb3ZsICUlZGIwLCAlMCIgOiI9ciIgKHZhbCkpOyBicmVhazsKKwljYXNlIDE6CisJCWFzbSgibW92bCAlJWRiMSwgJTAiIDoiPXIiICh2YWwpKTsgYnJlYWs7CisJY2FzZSAyOgorCQlhc20oIm1vdmwgJSVkYjIsICUwIiA6Ij1yIiAodmFsKSk7IGJyZWFrOworCWNhc2UgMzoKKwkJYXNtKCJtb3ZsICUlZGIzLCAlMCIgOiI9ciIgKHZhbCkpOyBicmVhazsKKwljYXNlIDY6CisJCWFzbSgibW92bCAlJWRiNiwgJTAiIDoiPXIiICh2YWwpKTsgYnJlYWs7CisJY2FzZSA3OgorCQlhc20oIm1vdmwgJSVkYjcsICUwIiA6Ij1yIiAodmFsKSk7IGJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfc2V0X2RlYnVncmVnKGludCByZWdubywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlzd2l0Y2ggKHJlZ25vKSB7CisJY2FzZSAwOgorCQlhc20oIm1vdmwgJTAsJSVkYjAiCTogLyogbm8gb3V0cHV0ICovIDoiciIgKHZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYXNtKCJtb3ZsICUwLCUlZGIxIgk6IC8qIG5vIG91dHB1dCAqLyA6InIiICh2YWx1ZSkpOworCQlicmVhazsKKwljYXNlIDI6CisJCWFzbSgibW92bCAlMCwlJWRiMiIJOiAvKiBubyBvdXRwdXQgKi8gOiJyIiAodmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhc20oIm1vdmwgJTAsJSVkYjMiCTogLyogbm8gb3V0cHV0ICovIDoiciIgKHZhbHVlKSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJYXNtKCJtb3ZsICUwLCUlZGI2Igk6IC8qIG5vIG91dHB1dCAqLyA6InIiICh2YWx1ZSkpOworCQlicmVhazsKKwljYXNlIDc6CisJCWFzbSgibW92bCAlMCwlJWRiNyIJOiAvKiBubyBvdXRwdXQgKi8gOiJyIiAodmFsdWUpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCit2b2lkIGluaXRfSVJRKHZvaWQpCit7CisJcGFyYXZpcnRfb3BzLmluaXRfSVJRKCk7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9jbHRzKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlICgiY2x0cyIpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdW5zaWduZWQgbG9uZyBuYXRpdmVfcmVhZF9jcjAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlhc20gdm9sYXRpbGUoIm1vdmwgJSVjcjAsJTBcblx0IiA6Ij1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgbmF0aXZlX3dyaXRlX2NyMCh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVjcjAiOiA6InIiICh2YWwpKTsKK30KKworc3RhdGljIGZhc3RjYWxsIHVuc2lnbmVkIGxvbmcgbmF0aXZlX3JlYWRfY3IyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJYXNtIHZvbGF0aWxlKCJtb3ZsICUlY3IyLCUwXG5cdCIgOiI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV93cml0ZV9jcjIodW5zaWduZWQgbG9uZyB2YWwpCit7CisJYXNtIHZvbGF0aWxlKCJtb3ZsICUwLCUlY3IyIjogOiJyIiAodmFsKSk7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB1bnNpZ25lZCBsb25nIG5hdGl2ZV9yZWFkX2NyMyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWNyMywlMFxuXHQiIDoiPXIiICh2YWwpKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfd3JpdGVfY3IzKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibW92bCAlMCwlJWNyMyI6IDoiciIgKHZhbCkpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdW5zaWduZWQgbG9uZyBuYXRpdmVfcmVhZF9jcjQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlhc20gdm9sYXRpbGUoIm1vdmwgJSVjcjQsJTBcblx0IiA6Ij1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGZhc3RjYWxsIHVuc2lnbmVkIGxvbmcgbmF0aXZlX3JlYWRfY3I0X3NhZmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwkvKiBUaGlzIGNvdWxkIGZhdWx0IGlmICVjcjQgZG9lcyBub3QgZXhpc3QgKi8KKwlhc20oIjE6IG1vdmwgJSVjcjQsICUwCQlcbiIKKwkJIjI6CQkJCVxuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIglcbiIKKwkJIi5sb25nIDFiLDJiCQkJXG4iCisJCSIucHJldmlvdXMJCQlcbiIKKwkJOiAiPXIiICh2YWwpOiAiMCIgKDApKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfd3JpdGVfY3I0KHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibW92bCAlMCwlJWNyNCI6IDoiciIgKHZhbCkpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdW5zaWduZWQgbG9uZyBuYXRpdmVfc2F2ZV9mbCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZjsKKwlhc20gdm9sYXRpbGUoInB1c2hmbCA7IHBvcGwgJTAiOiI9ZyIgKGYpOiAvKiBubyBpbnB1dCAqLyk7CisJcmV0dXJuIGY7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9yZXN0b3JlX2ZsKHVuc2lnbmVkIGxvbmcgZikKK3sKKwlhc20gdm9sYXRpbGUoInB1c2hsICUwIDsgcG9wZmwiOiAvKiBubyBvdXRwdXQgKi8KKwkJCSAgICAgOiJnIiAoZikKKwkJCSAgICAgOiJtZW1vcnkiLCAiY2MiKTsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgbmF0aXZlX2lycV9kaXNhYmxlKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlKCJjbGkiOiA6IDoibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9pcnFfZW5hYmxlKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlKCJzdGkiOiA6IDoibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9zYWZlX2hhbHQodm9pZCkKK3sKKwlhc20gdm9sYXRpbGUoInN0aTsgaGx0IjogOiA6Im1lbW9yeSIpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfaGFsdCh2b2lkKQoreworCWFzbSB2b2xhdGlsZSgiaGx0IjogOiA6Im1lbW9yeSIpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfd2JpbnZkKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlKCJ3YmludmQiOiA6IDoibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB1bnNpZ25lZCBsb25nIGxvbmcgbmF0aXZlX3JlYWRfbXNyKHVuc2lnbmVkIGludCBtc3IsIGludCAqZXJyKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisKKwlhc20gdm9sYXRpbGUoIjI6IHJkbXNyIDsgeG9ybCAlMCwlMFxuIgorCQkgICAgICIxOlxuXHQiCisJCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcblx0IgorCQkgICAgICIzOiAgbW92bCAlMywlMCA7IGptcCAxYlxuXHQiCisJCSAgICAgIi5wcmV2aW91c1xuXHQiCisgCQkgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCisJCSAgICAgIiAgIC5hbGlnbiA0XG5cdCIKKwkJICAgICAiICAgLmxvbmcgCTJiLDNiXG5cdCIKKwkJICAgICAiLnByZXZpb3VzIgorCQkgICAgIDogIj1yIiAoKmVyciksICI9QSIgKHZhbCkKKwkJICAgICA6ICJjIiAobXNyKSwgImkiICgtRUZBVUxUKSk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgZmFzdGNhbGwgaW50IG5hdGl2ZV93cml0ZV9tc3IodW5zaWduZWQgaW50IG1zciwgdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKK3sKKwlpbnQgZXJyOworCWFzbSB2b2xhdGlsZSgiMjogd3Jtc3IgOyB4b3JsICUwLCUwXG4iCisJCSAgICAgIjE6XG5cdCIKKwkJICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuXHQiCisJCSAgICAgIjM6ICBtb3ZsICU0LCUwIDsgam1wIDFiXG5cdCIKKwkJICAgICAiLnByZXZpb3VzXG5cdCIKKyAJCSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJICAgICAiICAgLmFsaWduIDRcblx0IgorCQkgICAgICIgICAubG9uZyAJMmIsM2Jcblx0IgorCQkgICAgICIucHJldmlvdXMiCisJCSAgICAgOiAiPWEiIChlcnIpCisJCSAgICAgOiAiYyIgKG1zciksICIwIiAoKHUzMil2YWwpLCAiZCIgKCh1MzIpKHZhbD4+MzIpKSwKKwkJICAgICAgICJpIiAoLUVGQVVMVCkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB1bnNpZ25lZCBsb25nIGxvbmcgbmF0aXZlX3JlYWRfdHNjKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlhc20gdm9sYXRpbGUoInJkdHNjIiA6ICI9QSIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB1bnNpZ25lZCBsb25nIGxvbmcgbmF0aXZlX3JlYWRfcG1jKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlhc20gdm9sYXRpbGUoInJkcG1jIiA6ICI9QSIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9sb2FkX3RyX2Rlc2Modm9pZCkKK3sKKwlhc20gdm9sYXRpbGUoImx0ciAldzAiOjoicSIgKEdEVF9FTlRSWV9UU1MqOCkpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfbG9hZF9nZHQoY29uc3Qgc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqZHRyKQoreworCWFzbSB2b2xhdGlsZSgibGdkdCAlMCI6OiJtIiAoKmR0cikpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfbG9hZF9pZHQoY29uc3Qgc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqZHRyKQoreworCWFzbSB2b2xhdGlsZSgibGlkdCAlMCI6OiJtIiAoKmR0cikpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfc3RvcmVfZ2R0KHN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgKmR0cikKK3sKKwlhc20gKCJzZ2R0ICUwIjoiPW0iICgqZHRyKSk7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9zdG9yZV9pZHQoc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqZHRyKQoreworCWFzbSAoInNpZHQgJTAiOiI9bSIgKCpkdHIpKTsKK30KKworc3RhdGljIGZhc3RjYWxsIHVuc2lnbmVkIGxvbmcgbmF0aXZlX3N0b3JlX3RyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0cjsKKwlhc20gKCJzdHIgJTAiOiI9ciIgKHRyKSk7CisJcmV0dXJuIHRyOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfbG9hZF90bHMoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQsIHVuc2lnbmVkIGludCBjcHUpCit7CisjZGVmaW5lIEMoaSkgZ2V0X2NwdV9nZHRfdGFibGUoY3B1KVtHRFRfRU5UUllfVExTX01JTiArIGldID0gdC0+dGxzX2FycmF5W2ldCisJQygwKTsgQygxKTsgQygyKTsKKyN1bmRlZiBDCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfd3JpdGVfZHRfZW50cnkodm9pZCAqZHQsIGludCBlbnRyeSwgdTMyIGVudHJ5X2xvdywgdTMyIGVudHJ5X2hpZ2gpCit7CisJdTMyICpscCA9ICh1MzIgKikoKGNoYXIgKilkdCArIGVudHJ5KjgpOworCWxwWzBdID0gZW50cnlfbG93OworCWxwWzFdID0gZW50cnlfaGlnaDsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgbmF0aXZlX3dyaXRlX2xkdF9lbnRyeSh2b2lkICpkdCwgaW50IGVudHJ5bnVtLCB1MzIgbG93LCB1MzIgaGlnaCkKK3sKKwluYXRpdmVfd3JpdGVfZHRfZW50cnkoZHQsIGVudHJ5bnVtLCBsb3csIGhpZ2gpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfd3JpdGVfZ2R0X2VudHJ5KHZvaWQgKmR0LCBpbnQgZW50cnludW0sIHUzMiBsb3csIHUzMiBoaWdoKQoreworCW5hdGl2ZV93cml0ZV9kdF9lbnRyeShkdCwgZW50cnludW0sIGxvdywgaGlnaCk7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV93cml0ZV9pZHRfZW50cnkodm9pZCAqZHQsIGludCBlbnRyeW51bSwgdTMyIGxvdywgdTMyIGhpZ2gpCit7CisJbmF0aXZlX3dyaXRlX2R0X2VudHJ5KGR0LCBlbnRyeW51bSwgbG93LCBoaWdoKTsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgbmF0aXZlX2xvYWRfZXNwMChzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzLAorCQkJCSAgICAgIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpCit7CisJdHNzLT5lc3AwID0gdGhyZWFkLT5lc3AwOworCisJLyogVGhpcyBjYW4gb25seSBoYXBwZW4gd2hlbiBTRVAgaXMgZW5hYmxlZCwgbm8gbmVlZCB0byB0ZXN0ICJTRVAiYXJhdGVseSAqLworCWlmICh1bmxpa2VseSh0c3MtPnNzMSAhPSB0aHJlYWQtPnN5c2VudGVyX2NzKSkgeworCQl0c3MtPnNzMSA9IHRocmVhZC0+c3lzZW50ZXJfY3M7CisJCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCB0aHJlYWQtPnN5c2VudGVyX2NzLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9pb19kZWxheSh2b2lkKQoreworCWFzbSB2b2xhdGlsZSgib3V0YiAlYWwsJDB4ODAiKTsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgbmF0aXZlX2ZsdXNoX3RsYih2b2lkKQoreworCV9fbmF0aXZlX2ZsdXNoX3RsYigpOworfQorCisvKgorICogR2xvYmFsIHBhZ2VzIGhhdmUgdG8gYmUgZmx1c2hlZCBhIGJpdCBkaWZmZXJlbnRseS4gTm90IGEgcmVhbAorICogcGVyZm9ybWFuY2UgcHJvYmxlbSBiZWNhdXNlIHRoaXMgZG9lcyBub3QgaGFwcGVuIG9mdGVuLgorICovCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfZmx1c2hfdGxiX2dsb2JhbCh2b2lkKQoreworCV9fbmF0aXZlX2ZsdXNoX3RsYl9nbG9iYWwoKTsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgbmF0aXZlX2ZsdXNoX3RsYl9zaW5nbGUodTMyIGFkZHIpCit7CisJX19uYXRpdmVfZmx1c2hfdGxiX3NpbmdsZShhZGRyKTsKK30KKworI2lmbmRlZiBDT05GSUdfWDg2X1BBRQorc3RhdGljIGZhc3RjYWxsIHZvaWQgbmF0aXZlX3NldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKK3sKKwkqcHRlcCA9IHB0ZXZhbDsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgbmF0aXZlX3NldF9wdGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBhZGRyLCBwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQoreworCSpwdGVwID0gcHRldmFsOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfc2V0X3BtZChwbWRfdCAqcG1kcCwgcG1kX3QgcG1kdmFsKQoreworCSpwbWRwID0gcG1kdmFsOworfQorCisjZWxzZSAvKiBDT05GSUdfWDg2X1BBRSAqLworCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKQoreworCXB0ZXAtPnB0ZV9oaWdoID0gcHRlLnB0ZV9oaWdoOworCXNtcF93bWIoKTsKKwlwdGVwLT5wdGVfbG93ID0gcHRlLnB0ZV9sb3c7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9zZXRfcHRlX2F0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgYWRkciwgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKK3sKKwlwdGVwLT5wdGVfaGlnaCA9IHB0ZS5wdGVfaGlnaDsKKwlzbXBfd21iKCk7CisJcHRlcC0+cHRlX2xvdyA9IHB0ZS5wdGVfbG93OworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfc2V0X3B0ZV9wcmVzZW50KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCit7CisJcHRlcC0+cHRlX2xvdyA9IDA7CisJc21wX3dtYigpOworCXB0ZXAtPnB0ZV9oaWdoID0gcHRlLnB0ZV9oaWdoOworCXNtcF93bWIoKTsKKwlwdGVwLT5wdGVfbG93ID0gcHRlLnB0ZV9sb3c7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9zZXRfcHRlX2F0b21pYyhwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQoreworCXNldF82NGJpdCgodW5zaWduZWQgbG9uZyBsb25nICopcHRlcCxwdGVfdmFsKHB0ZXZhbCkpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfc2V0X3BtZChwbWRfdCAqcG1kcCwgcG1kX3QgcG1kdmFsKQoreworCXNldF82NGJpdCgodW5zaWduZWQgbG9uZyBsb25nICopcG1kcCxwbWRfdmFsKHBtZHZhbCkpOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfc2V0X3B1ZChwdWRfdCAqcHVkcCwgcHVkX3QgcHVkdmFsKQoreworCSpwdWRwID0gcHVkdmFsOworfQorCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBuYXRpdmVfcHRlX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQoreworCXB0ZXAtPnB0ZV9sb3cgPSAwOworCXNtcF93bWIoKTsKKwlwdGVwLT5wdGVfaGlnaCA9IDA7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9wbWRfY2xlYXIocG1kX3QgKnBtZCkKK3sKKwl1MzIgKnRtcCA9ICh1MzIgKilwbWQ7CisJKnRtcCA9IDA7CisJc21wX3dtYigpOworCSoodG1wICsgMSkgPSAwOworfQorI2VuZGlmIC8qIENPTkZJR19YODZfUEFFICovCisKKy8qIFRoZXNlIGFyZSBpbiBlbnRyeS5TICovCitleHRlcm4gZmFzdGNhbGwgdm9pZCBuYXRpdmVfaXJldCh2b2lkKTsKK2V4dGVybiBmYXN0Y2FsbCB2b2lkIG5hdGl2ZV9pcnFfZW5hYmxlX3N5c2V4aXQodm9pZCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHByaW50X2Jhbm5lcih2b2lkKQoreworCXBhcmF2aXJ0X29wcy5iYW5uZXIoKTsKKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNhbGwocHJpbnRfYmFubmVyKTsKKworLyogV2Ugc2ltcGx5IGRlY2xhcmUgc3RhcnRfa2VybmVsIHRvIGJlIHRoZSBwYXJhdmlydCBwcm9iZSBvZiBsYXN0IHJlc29ydC4gKi8KK3BhcmF2aXJ0X3Byb2JlKHN0YXJ0X2tlcm5lbCk7CisKK3N0cnVjdCBwYXJhdmlydF9vcHMgcGFyYXZpcnRfb3BzID0geworCS5uYW1lID0gImJhcmUgaGFyZHdhcmUiLAorCS5wYXJhdmlydF9lbmFibGVkID0gMCwKKwkua2VybmVsX3JwbCA9IDAsCisKKyAJLnBhdGNoID0gbmF0aXZlX3BhdGNoLAorCS5iYW5uZXIgPSBkZWZhdWx0X2Jhbm5lciwKKwkuYXJjaF9zZXR1cCA9IG5hdGl2ZV9ub3AsCisJLm1lbW9yeV9zZXR1cCA9IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwLAorCS5nZXRfd2FsbGNsb2NrID0gbmF0aXZlX2dldF93YWxsY2xvY2ssCisJLnNldF93YWxsY2xvY2sgPSBuYXRpdmVfc2V0X3dhbGxjbG9jaywKKwkudGltZV9pbml0ID0gdGltZV9pbml0X2hvb2ssCisJLmluaXRfSVJRID0gbmF0aXZlX2luaXRfSVJRLAorCisJLmNwdWlkID0gbmF0aXZlX2NwdWlkLAorCS5nZXRfZGVidWdyZWcgPSBuYXRpdmVfZ2V0X2RlYnVncmVnLAorCS5zZXRfZGVidWdyZWcgPSBuYXRpdmVfc2V0X2RlYnVncmVnLAorCS5jbHRzID0gbmF0aXZlX2NsdHMsCisJLnJlYWRfY3IwID0gbmF0aXZlX3JlYWRfY3IwLAorCS53cml0ZV9jcjAgPSBuYXRpdmVfd3JpdGVfY3IwLAorCS5yZWFkX2NyMiA9IG5hdGl2ZV9yZWFkX2NyMiwKKwkud3JpdGVfY3IyID0gbmF0aXZlX3dyaXRlX2NyMiwKKwkucmVhZF9jcjMgPSBuYXRpdmVfcmVhZF9jcjMsCisJLndyaXRlX2NyMyA9IG5hdGl2ZV93cml0ZV9jcjMsCisJLnJlYWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LAorCS5yZWFkX2NyNF9zYWZlID0gbmF0aXZlX3JlYWRfY3I0X3NhZmUsCisJLndyaXRlX2NyNCA9IG5hdGl2ZV93cml0ZV9jcjQsCisJLnNhdmVfZmwgPSBuYXRpdmVfc2F2ZV9mbCwKKwkucmVzdG9yZV9mbCA9IG5hdGl2ZV9yZXN0b3JlX2ZsLAorCS5pcnFfZGlzYWJsZSA9IG5hdGl2ZV9pcnFfZGlzYWJsZSwKKwkuaXJxX2VuYWJsZSA9IG5hdGl2ZV9pcnFfZW5hYmxlLAorCS5zYWZlX2hhbHQgPSBuYXRpdmVfc2FmZV9oYWx0LAorCS5oYWx0ID0gbmF0aXZlX2hhbHQsCisJLndiaW52ZCA9IG5hdGl2ZV93YmludmQsCisJLnJlYWRfbXNyID0gbmF0aXZlX3JlYWRfbXNyLAorCS53cml0ZV9tc3IgPSBuYXRpdmVfd3JpdGVfbXNyLAorCS5yZWFkX3RzYyA9IG5hdGl2ZV9yZWFkX3RzYywKKwkucmVhZF9wbWMgPSBuYXRpdmVfcmVhZF9wbWMsCisJLmxvYWRfdHJfZGVzYyA9IG5hdGl2ZV9sb2FkX3RyX2Rlc2MsCisJLnNldF9sZHQgPSBuYXRpdmVfc2V0X2xkdCwKKwkubG9hZF9nZHQgPSBuYXRpdmVfbG9hZF9nZHQsCisJLmxvYWRfaWR0ID0gbmF0aXZlX2xvYWRfaWR0LAorCS5zdG9yZV9nZHQgPSBuYXRpdmVfc3RvcmVfZ2R0LAorCS5zdG9yZV9pZHQgPSBuYXRpdmVfc3RvcmVfaWR0LAorCS5zdG9yZV90ciA9IG5hdGl2ZV9zdG9yZV90ciwKKwkubG9hZF90bHMgPSBuYXRpdmVfbG9hZF90bHMsCisJLndyaXRlX2xkdF9lbnRyeSA9IG5hdGl2ZV93cml0ZV9sZHRfZW50cnksCisJLndyaXRlX2dkdF9lbnRyeSA9IG5hdGl2ZV93cml0ZV9nZHRfZW50cnksCisJLndyaXRlX2lkdF9lbnRyeSA9IG5hdGl2ZV93cml0ZV9pZHRfZW50cnksCisJLmxvYWRfZXNwMCA9IG5hdGl2ZV9sb2FkX2VzcDAsCisKKwkuc2V0X2lvcGxfbWFzayA9IG5hdGl2ZV9zZXRfaW9wbF9tYXNrLAorCS5pb19kZWxheSA9IG5hdGl2ZV9pb19kZWxheSwKKwkuY29uc3RfdWRlbGF5ID0gX19jb25zdF91ZGVsYXksCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwkuYXBpY193cml0ZSA9IG5hdGl2ZV9hcGljX3dyaXRlLAorCS5hcGljX3dyaXRlX2F0b21pYyA9IG5hdGl2ZV9hcGljX3dyaXRlX2F0b21pYywKKwkuYXBpY19yZWFkID0gbmF0aXZlX2FwaWNfcmVhZCwKKyNlbmRpZgorCisJLmZsdXNoX3RsYl91c2VyID0gbmF0aXZlX2ZsdXNoX3RsYiwKKwkuZmx1c2hfdGxiX2tlcm5lbCA9IG5hdGl2ZV9mbHVzaF90bGJfZ2xvYmFsLAorCS5mbHVzaF90bGJfc2luZ2xlID0gbmF0aXZlX2ZsdXNoX3RsYl9zaW5nbGUsCisKKwkuc2V0X3B0ZSA9IG5hdGl2ZV9zZXRfcHRlLAorCS5zZXRfcHRlX2F0ID0gbmF0aXZlX3NldF9wdGVfYXQsCisJLnNldF9wbWQgPSBuYXRpdmVfc2V0X3BtZCwKKwkucHRlX3VwZGF0ZSA9ICh2b2lkICopbmF0aXZlX25vcCwKKwkucHRlX3VwZGF0ZV9kZWZlciA9ICh2b2lkICopbmF0aXZlX25vcCwKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCS5zZXRfcHRlX2F0b21pYyA9IG5hdGl2ZV9zZXRfcHRlX2F0b21pYywKKwkuc2V0X3B0ZV9wcmVzZW50ID0gbmF0aXZlX3NldF9wdGVfcHJlc2VudCwKKwkuc2V0X3B1ZCA9IG5hdGl2ZV9zZXRfcHVkLAorCS5wdGVfY2xlYXIgPSBuYXRpdmVfcHRlX2NsZWFyLAorCS5wbWRfY2xlYXIgPSBuYXRpdmVfcG1kX2NsZWFyLAorI2VuZGlmCisKKwkuaXJxX2VuYWJsZV9zeXNleGl0ID0gbmF0aXZlX2lycV9lbmFibGVfc3lzZXhpdCwKKwkuaXJldCA9IG5hdGl2ZV9pcmV0LAorfTsKK0VYUE9SVF9TWU1CT0wocGFyYXZpcnRfb3BzKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcGNpLWRtYS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggMjVmZTY2OC4uNDFhZjY5MiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wY2ktZG1hLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wY2ktZG1hLmMKQEAgLTc1LDcgKzc1LDcgQEAKIGludCBkbWFfZGVjbGFyZV9jb2hlcmVudF9tZW1vcnkoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGJ1c19hZGRyLAogCQkJCWRtYV9hZGRyX3QgZGV2aWNlX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0Jdm9pZCBfX2lvbWVtICptZW1fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1lbV9iYXNlID0gTlVMTDsKIAlpbnQgcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CiAJaW50IGJpdG1hcF9zaXplID0gKHBhZ2VzICsgMzEpLzMyOwogCkBAIC05MiwxNCArOTIsMTIgQEAKIAlpZiAoIW1lbV9iYXNlKQogCQlnb3RvIG91dDsKIAotCWRldi0+ZG1hX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfY29oZXJlbnRfbWVtKSwgR0ZQX0tFUk5FTCk7CisJZGV2LT5kbWFfbWVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRtYV9jb2hlcmVudF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+ZG1hX21lbSkKIAkJZ290byBvdXQ7Ci0JbWVtc2V0KGRldi0+ZG1hX21lbSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFfY29oZXJlbnRfbWVtKSk7Ci0JZGV2LT5kbWFfbWVtLT5iaXRtYXAgPSBrbWFsbG9jKGJpdG1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlkZXYtPmRtYV9tZW0tPmJpdG1hcCA9IGt6YWxsb2MoYml0bWFwX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghZGV2LT5kbWFfbWVtLT5iaXRtYXApCiAJCWdvdG8gZnJlZTFfb3V0OwotCW1lbXNldChkZXYtPmRtYV9tZW0tPmJpdG1hcCwgMCwgYml0bWFwX3NpemUpOwogCiAJZGV2LT5kbWFfbWVtLT52aXJ0X2Jhc2UgPSBtZW1fYmFzZTsKIAlkZXYtPmRtYV9tZW0tPmRldmljZV9iYXNlID0gZGV2aWNlX2FkZHI7CkBAIC0xMTQsNiArMTEyLDggQEAKICBmcmVlMV9vdXQ6CiAJa2ZyZWUoZGV2LT5kbWFfbWVtLT5iaXRtYXApOwogIG91dDoKKwlpZiAobWVtX2Jhc2UpCisJCWlvdW5tYXAobWVtX2Jhc2UpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChkbWFfZGVjbGFyZV9jb2hlcmVudF9tZW1vcnkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCBiMGEwNzgwLi45OTMwODUxIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtNTYsNiArNTYsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KIAogYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCkgX19hc21fXygicmV0X2Zyb21fZm9yayIpOwogCkBAIC05OSwyMiArMTAwLDE4IEBACiAgKi8KIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCiB7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCiAJaWYgKCFobHRfY291bnRlciAmJiBib290X2NwdV9kYXRhLmhsdF93b3Jrc19vaykgewogCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmPSB+VFNfUE9MTElORzsKIAkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKLQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJCWlmICghbmVlZF9yZXNjaGVkKCkpCi0JCQkJc2FmZV9oYWx0KCk7Ci0JCQllbHNlCi0JCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQl9CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCQlzYWZlX2hhbHQoKTsJLyogZW5hYmxlcyBpbnRlcnJ1cHRzIHJhY2VsZXNzbHkgKi8KKwkJZWxzZQorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOwogCX0gZWxzZSB7Ci0JCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCi0JCQljcHVfcmVsYXgoKTsKKwkJLyogbG9vcCBpcyBkb25lIGJ5IHRoZSBjYWxsZXIgKi8KKwkJY3B1X3JlbGF4KCk7CiAJfQogfQogI2lmZGVmIENPTkZJR19BUE1fTU9EVUxFCkBAIC0xMjgsMTQgKzEyNSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHBvbGxfaWRsZSAodm9pZCkKIHsKLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLQlhc20gdm9sYXRpbGUoCi0JCSIyOiIKLQkJInRlc3RsICUwLCAlMTsiCi0JCSJyZXA7IG5vcDsiCi0JCSJqZSAyYjsiCi0JCTogOiAiaSIoX1RJRl9ORUVEX1JFU0NIRUQpLCAibSIgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MpKTsKKwljcHVfcmVsYXgoKTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpAQCAtMjA1LDcgKzE5NSw3IEBACiB2b2lkIGNwdV9pZGxlX3dhaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1LCB0aGlzX2NwdSA9IGdldF9jcHUoKTsKLQljcHVtYXNrX3QgbWFwOworCWNwdW1hc2tfdCBtYXAsIHRtcCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKIAogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUodGhpc19jcHUpKTsKIAlwdXRfY3B1KCk7CkBAIC0yMjcsNiArMjE3LDggQEAKIAkJfQogCQljcHVzX2FuZChtYXAsIG1hcCwgY3B1X29ubGluZV9tYXApOwogCX0gd2hpbGUgKCFjcHVzX2VtcHR5KG1hcCkpOworCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCB0bXApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2lkbGVfd2FpdCk7CiAKQEAgLTIzNiwxOCArMjI4LDI1IEBACiAgKiBXZSBleGVjdXRlIE1PTklUT1IgYWdhaW5zdCBuZWVkX3Jlc2NoZWQgYW5kIGVudGVyIG9wdGltaXplZCB3YWl0IHN0YXRlCiAgKiB0aHJvdWdoIE1XQUlULiBXaGVuZXZlciBzb21lb25lIGNoYW5nZXMgbmVlZF9yZXNjaGVkLCB3ZSB3b3VsZCBiZSB3b2tlbgogICogdXAgZnJvbSBNV0FJVCAod2l0aG91dCBhbiBJUEkpLgorICoKKyAqIE5ldyB3aXRoIENvcmUgRHVvIHByb2Nlc3NvcnMsIE1XQUlUIGNhbiB0YWtlIHNvbWUgaGludHMgYmFzZWQgb24gQ1BVCisgKiBjYXBhYmlsaXR5LgogICovCit2b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGVheCwgdW5zaWduZWQgbG9uZyBlY3gpCit7CisJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgeworCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7CisJCXNtcF9tYigpOworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJX19td2FpdChlYXgsIGVjeCk7CisJfQorfQorCisvKiBEZWZhdWx0IE1PTklUT1IvTVdBSVQgd2l0aCBubyBoaW50cywgdXNlZCBmb3IgZGVmYXVsdCBDMSBzdGF0ZSAqLwogc3RhdGljIHZvaWQgbXdhaXRfaWRsZSh2b2lkKQogewogCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJX19tb25pdG9yKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIDAsIDApOwotCQlzbXBfbWIoKTsKLQkJaWYgKG5lZWRfcmVzY2hlZCgpKQotCQkJYnJlYWs7Ci0JCV9fbXdhaXQoMCwgMCk7Ci0JfQorCW13YWl0X2lkbGVfd2l0aF9oaW50cygwLCAwKTsKIH0KIAogdm9pZCBfX2RldmluaXQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC0zMDQsOCArMzAzLDggQEAKIAkJcmVncy0+ZWF4LHJlZ3MtPmVieCxyZWdzLT5lY3gscmVncy0+ZWR4KTsKIAlwcmludGsoIkVTSTogJTA4bHggRURJOiAlMDhseCBFQlA6ICUwOGx4IiwKIAkJcmVncy0+ZXNpLCByZWdzLT5lZGksIHJlZ3MtPmVicCk7Ci0JcHJpbnRrKCIgRFM6ICUwNHggRVM6ICUwNHhcbiIsCi0JCTB4ZmZmZiAmIHJlZ3MtPnhkcywweGZmZmYgJiByZWdzLT54ZXMpOworCXByaW50aygiIERTOiAlMDR4IEVTOiAlMDR4IEdTOiAlMDR4XG4iLAorCSAgICAgICAweGZmZmYgJiByZWdzLT54ZHMsMHhmZmZmICYgcmVncy0+eGVzLCAweGZmZmYgJiByZWdzLT54Z3MpOwogCiAJY3IwID0gcmVhZF9jcjAoKTsKIAljcjIgPSByZWFkX2NyMigpOwpAQCAtMzI4LDcgKzMyNyw2IEBACiBpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgcHRfcmVncyByZWdzOwotCWludCBlcnI7CiAKIAltZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7CiAKQEAgLTMzNywxNiArMzM1LDE0IEBACiAKIAlyZWdzLnhkcyA9IF9fVVNFUl9EUzsKIAlyZWdzLnhlcyA9IF9fVVNFUl9EUzsKKwlyZWdzLnhncyA9IF9fS0VSTkVMX1BEQTsKIAlyZWdzLm9yaWdfZWF4ID0gLTE7CiAJcmVncy5laXAgPSAodW5zaWduZWQgbG9uZykga2VybmVsX3RocmVhZF9oZWxwZXI7CiAJcmVncy54Y3MgPSBfX0tFUk5FTF9DUyB8IGdldF9rZXJuZWxfcnBsKCk7CiAJcmVncy5lZmxhZ3MgPSBYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19TRiB8IFg4Nl9FRkxBR1NfUEYgfCAweDI7CiAKIAkvKiBPaywgY3JlYXRlIHRoZSBuZXcgcHJvY2Vzcy4uICovCi0JZXJyID0gZG9fZm9yayhmbGFncyB8IENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQsIDAsICZyZWdzLCAwLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyID09IDApIC8qIHRlcm1pbmF0ZSBrZXJuZWwgc3RhY2sgKi8KLQkJdGFza19wdF9yZWdzKGN1cnJlbnQpLT5laXAgPSAwOwotCXJldHVybiBlcnI7CisJcmV0dXJuIGRvX2ZvcmsoZmxhZ3MgfCBDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VELCAwLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwogCkBAIC00MjUsNyArNDIxLDYgQEAKIAlwLT50aHJlYWQuZWlwID0gKHVuc2lnbmVkIGxvbmcpIHJldF9mcm9tX2Zvcms7CiAKIAlzYXZlc2VnbWVudChmcyxwLT50aHJlYWQuZnMpOwotCXNhdmVzZWdtZW50KGdzLHAtPnRocmVhZC5ncyk7CiAKIAl0c2sgPSBjdXJyZW50OwogCWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9JT19CSVRNQVApKSkgewpAQCAtNTAyLDcgKzQ5Nyw3IEBACiAJZHVtcC0+cmVncy5kcyA9IHJlZ3MtPnhkczsKIAlkdW1wLT5yZWdzLmVzID0gcmVncy0+eGVzOwogCXNhdmVzZWdtZW50KGZzLGR1bXAtPnJlZ3MuZnMpOwotCXNhdmVzZWdtZW50KGdzLGR1bXAtPnJlZ3MuZ3MpOworCWR1bXAtPnJlZ3MuZ3MgPSByZWdzLT54Z3M7CiAJZHVtcC0+cmVncy5vcmlnX2VheCA9IHJlZ3MtPm9yaWdfZWF4OwogCWR1bXAtPnJlZ3MuZWlwID0gcmVncy0+ZWlwOwogCWR1bXAtPnJlZ3MuY3MgPSByZWdzLT54Y3M7CkBAIC02NDIsMjIgKzYzNywyNyBAQAogCiAJX191bmxhenlfZnB1KHByZXZfcCk7CiAKKworCS8qIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGlzIHNvb24sIGFmdGVyIGEgZmV3IGV4cGVuc2l2ZSB0aGluZ3MgKi8KKwlpZiAobmV4dF9wLT5mcHVfY291bnRlciA+IDUpCisJCXByZWZldGNoKCZuZXh0LT5pMzg3LmZ4c2F2ZSk7CisKIAkvKgogCSAqIFJlbG9hZCBlc3AwLgogCSAqLwogCWxvYWRfZXNwMCh0c3MsIG5leHQpOwogCiAJLyoKLQkgKiBTYXZlIGF3YXkgJWZzIGFuZCAlZ3MuIE5vIG5lZWQgdG8gc2F2ZSAlZXMgYW5kICVkcywgYXMKLQkgKiB0aG9zZSBhcmUgYWx3YXlzIGtlcm5lbCBzZWdtZW50cyB3aGlsZSBpbnNpZGUgdGhlIGtlcm5lbC4KLQkgKiBEb2luZyB0aGlzIGJlZm9yZSBzZXR0aW5nIHRoZSBuZXcgVExTIGRlc2NyaXB0b3JzIGF2b2lkcwotCSAqIHRoZSBzaXR1YXRpb24gd2hlcmUgd2UgdGVtcG9yYXJpbHkgaGF2ZSBub24tcmVsb2FkYWJsZQotCSAqIHNlZ21lbnRzIGluICVmcyBhbmQgJWdzLiAgVGhpcyBjb3VsZCBiZSBhbiBpc3N1ZSBpZiB0aGUKLQkgKiBOTUkgaGFuZGxlciBldmVyIHVzZWQgJWZzIG9yICVncyAoaXQgZG9lcyBub3QgdG9kYXkpLCBvcgotCSAqIGlmIHRoZSBrZXJuZWwgaXMgcnVubmluZyBpbnNpZGUgb2YgYSBoeXBlcnZpc29yIGxheWVyLgorCSAqIFNhdmUgYXdheSAlZnMuIE5vIG5lZWQgdG8gc2F2ZSAlZ3MsIGFzIGl0IHdhcyBzYXZlZCBvbiB0aGUKKwkgKiBzdGFjayBvbiBlbnRyeS4gIE5vIG5lZWQgdG8gc2F2ZSAlZXMgYW5kICVkcywgYXMgdGhvc2UgYXJlCisJICogYWx3YXlzIGtlcm5lbCBzZWdtZW50cyB3aGlsZSBpbnNpZGUgdGhlIGtlcm5lbC4gIERvaW5nIHRoaXMKKwkgKiBiZWZvcmUgc2V0dGluZyB0aGUgbmV3IFRMUyBkZXNjcmlwdG9ycyBhdm9pZHMgdGhlIHNpdHVhdGlvbgorCSAqIHdoZXJlIHdlIHRlbXBvcmFyaWx5IGhhdmUgbm9uLXJlbG9hZGFibGUgc2VnbWVudHMgaW4gJWZzCisJICogYW5kICVncy4gIFRoaXMgY291bGQgYmUgYW4gaXNzdWUgaWYgdGhlIE5NSSBoYW5kbGVyIGV2ZXIKKwkgKiB1c2VkICVmcyBvciAlZ3MgKGl0IGRvZXMgbm90IHRvZGF5KSwgb3IgaWYgdGhlIGtlcm5lbCBpcworCSAqIHJ1bm5pbmcgaW5zaWRlIG9mIGEgaHlwZXJ2aXNvciBsYXllci4KIAkgKi8KIAlzYXZlc2VnbWVudChmcywgcHJldi0+ZnMpOwotCXNhdmVzZWdtZW50KGdzLCBwcmV2LT5ncyk7CiAKIAkvKgogCSAqIExvYWQgdGhlIHBlci10aHJlYWQgVGhyZWFkLUxvY2FsIFN0b3JhZ2UgZGVzY3JpcHRvci4KQEAgLTY2NSwyMiArNjY1LDE0IEBACiAJbG9hZF9UTFMobmV4dCwgY3B1KTsKIAogCS8qCi0JICogUmVzdG9yZSAlZnMgYW5kICVncyBpZiBuZWVkZWQuCisJICogUmVzdG9yZSAlZnMgaWYgbmVlZGVkLgogCSAqCi0JICogR2xpYmMgbm9ybWFsbHkgbWFrZXMgJWZzIGJlIHplcm8sIGFuZCAlZ3MgaXMgb25lIG9mCi0JICogdGhlIFRMUyBzZWdtZW50cy4KKwkgKiBHbGliYyBub3JtYWxseSBtYWtlcyAlZnMgYmUgemVyby4KIAkgKi8KIAlpZiAodW5saWtlbHkocHJldi0+ZnMgfCBuZXh0LT5mcykpCiAJCWxvYWRzZWdtZW50KGZzLCBuZXh0LT5mcyk7CiAKLQlpZiAocHJldi0+Z3MgfCBuZXh0LT5ncykKLQkJbG9hZHNlZ21lbnQoZ3MsIG5leHQtPmdzKTsKLQotCS8qCi0JICogUmVzdG9yZSBJT1BMIGlmIG5lZWRlZC4KLQkgKi8KLQlpZiAodW5saWtlbHkocHJldi0+aW9wbCAhPSBuZXh0LT5pb3BsKSkKLQkJc2V0X2lvcGxfbWFzayhuZXh0LT5pb3BsKTsKKwl3cml0ZV9wZGEocGN1cnJlbnQsIG5leHRfcCk7CiAKIAkvKgogCSAqIE5vdyBtYXliZSBoYW5kbGUgZGVidWcgcmVnaXN0ZXJzIGFuZC9vciBJTyBiaXRtYXBzCkBAIC02OTEsNiArNjgzLDEzIEBACiAKIAlkaXNhYmxlX3RzYyhwcmV2X3AsIG5leHRfcCk7CiAKKwkvKiBJZiB0aGUgdGFzayBoYXMgdXNlZCBmcHUgdGhlIGxhc3QgNSB0aW1lc2xpY2VzLCBqdXN0IGRvIGEgZnVsbAorCSAqIHJlc3RvcmUgb2YgdGhlIG1hdGggc3RhdGUgaW1tZWRpYXRlbHkgdG8gYXZvaWQgdGhlIHRyYXA7IHRoZQorCSAqIGNoYW5jZXMgb2YgbmVlZGluZyBGUFUgc29vbiBhcmUgb2J2aW91c2x5IGhpZ2ggbm93CisJICovCisJaWYgKG5leHRfcC0+ZnB1X2NvdW50ZXIgPiA1KQorCQltYXRoX3N0YXRlX3Jlc3RvcmUoKTsKKwogCXJldHVybiBwcmV2X3A7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCmluZGV4IDc3NWY1MGUuLmYzZjk0YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwpAQCAtOTQsMTMgKzk0LDkgQEAKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCWNoaWxkLT50aHJlYWQuZnMgPSB2YWx1ZTsKIAkJCXJldHVybiAwOwotCQljYXNlIEdTOgotCQkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQljaGlsZC0+dGhyZWFkLmdzID0gdmFsdWU7Ci0JCQlyZXR1cm4gMDsKIAkJY2FzZSBEUzoKIAkJY2FzZSBFUzoKKwkJY2FzZSBHUzoKIAkJCWlmICh2YWx1ZSAmJiAodmFsdWUgJiAzKSAhPSAzKQogCQkJCXJldHVybiAtRUlPOwogCQkJdmFsdWUgJj0gMHhmZmZmOwpAQCAtMTE2LDggKzExMiw4IEBACiAJCQl2YWx1ZSB8PSBnZXRfc3RhY2tfbG9uZyhjaGlsZCwgRUZMX09GRlNFVCkgJiB+RkxBR19NQVNLOwogCQkJYnJlYWs7CiAJfQotCWlmIChyZWdubyA+IEdTKjQpCi0JCXJlZ25vIC09IDIqNDsKKwlpZiAocmVnbm8gPiBFUyo0KQorCQlyZWdubyAtPSAxKjQ7CiAJcHV0X3N0YWNrX2xvbmcoY2hpbGQsIHJlZ25vIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSwgdmFsdWUpOwogCXJldHVybiAwOwogfQpAQCAtMTMxLDE4ICsxMjcsMTYgQEAKIAkJY2FzZSBGUzoKIAkJCXJldHZhbCA9IGNoaWxkLT50aHJlYWQuZnM7CiAJCQlicmVhazsKLQkJY2FzZSBHUzoKLQkJCXJldHZhbCA9IGNoaWxkLT50aHJlYWQuZ3M7Ci0JCQlicmVhazsKIAkJY2FzZSBEUzoKIAkJY2FzZSBFUzoKKwkJY2FzZSBHUzoKIAkJY2FzZSBTUzoKIAkJY2FzZSBDUzoKIAkJCXJldHZhbCA9IDB4ZmZmZjsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQlkZWZhdWx0OgotCQkJaWYgKHJlZ25vID4gR1MqNCkKLQkJCQlyZWdubyAtPSAyKjQ7CisJCQlpZiAocmVnbm8gPiBFUyo0KQorCQkJCXJlZ25vIC09IDEqNDsKIAkJCXJlZ25vID0gcmVnbm8gLSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpOwogCQkJcmV0dmFsICY9IGdldF9zdGFja19sb25nKGNoaWxkLCByZWdubyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9xdWlya3MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcXVpcmtzLmMKaW5kZXggOWY2YWIxNy4uMzQ4NzRjMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9xdWlya3MuYworKysgYi9hcmNoL2kzODYva2VybmVsL3F1aXJrcy5jCkBAIC0zLDEwICszLDQ4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgorI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CisjaW5jbHVkZSA8YXNtL2NwdS5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfUENJKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHZlcmlmeV9xdWlya19pbnRlbF9pcnFiYWxhbmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTggY29uZmlnLCByZXY7CisJdTMyIHdvcmQ7CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19pbnRlbF9pcnFiYWxhbmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCisJLyogQklPUyBtYXkgZW5hYmxlIGhhcmR3YXJlIElSUSBiYWxhbmNpbmcgZm9yCisJICogRTc1MjAvRTczMjAvRTc1MjUocmV2aXNpb24gSUQgMHg5IGFuZCBiZWxvdykKKwkgKiBiYXNlZCBwbGF0Zm9ybXMuCisJICogRm9yIHRob3NlIHBsYXRmb3JtcywgbWFrZSBzdXJlIHRoYXQgdGhlIGdlbmFwaWMgaXMgc2V0IHRvICdmbGF0JworCSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2KTsKKwlpZiAocmV2ID4gMHg5KQorCQlyZXR1cm47CisKKwkvKiBlbmFibGUgYWNjZXNzIHRvIGNvbmZpZyBzcGFjZSovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGY0LCAmY29uZmlnKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGY0LCBjb25maWd8MHgyKTsKKworCS8qIHJlYWQgeFRQUiByZWdpc3RlciAqLworCXJhd19wY2lfb3BzLT5yZWFkKDAsIDAsIDB4NDAsIDB4NGMsIDIsICZ3b3JkKTsKKworCWlmICghKHdvcmQgJiAoMSA8PCAxMykpKSB7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQlpZiAoZ2VuYXBpYyAhPSAgJmFwaWNfZmxhdCkKKwkJCXBhbmljKCJBUElDIG1vZGUgbXVzdCBiZSBmbGF0IG9uIHRoaXMgc3lzdGVtXG4iKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1g4Nl9HRU5FUklDQVJDSCkKKwkJaWYgKGdlbmFwaWMgIT0gJmFwaWNfZGVmYXVsdCkKKwkJCXBhbmljKCJBUElDIG1vZGUgbXVzdCBiZSBkZWZhdWx0KGZsYXQpIG9uIHRoaXMgc3lzdGVtLiBVc2UgYXBpYz1kZWZhdWx0XG4iKTsKKyNlbmRpZgorCX0KKworCS8qIHB1dCBiYWNrIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgY29uZmlnIHNwYWNlKi8KKwlpZiAoIShjb25maWcgJiAweDIpKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGY0LCBjb25maWcpOworfQorCit2b2lkIF9faW5pdCBxdWlya19pbnRlbF9pcnFiYWxhbmNlKHZvaWQpCiB7CiAJdTggY29uZmlnLCByZXY7CiAJdTMyIHdvcmQ7CkBAIC0xNiwxOCArNTQsMTggQEAKIAkgKiBiYXNlZCBwbGF0Zm9ybXMuCiAJICogRGlzYWJsZSBTVyBpcnFiYWxhbmNlL2FmZmluaXR5IG9uIHRob3NlIHBsYXRmb3Jtcy4KIAkgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldik7CisJcmV2ID0gcmVhZF9wY2lfY29uZmlnX2J5dGUoMCwgMCwgMCwgUENJX0NMQVNTX1JFVklTSU9OKTsKIAlpZiAocmV2ID4gMHg5KQogCQlyZXR1cm47CiAKIAlwcmludGsoS0VSTl9JTkZPICJJbnRlbCBFNzUyMC83MzIwLzc1MjUgZGV0ZWN0ZWQuIik7CiAKLQkvKiBlbmFibGUgYWNjZXNzIHRvIGNvbmZpZyBzcGFjZSovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGY0LCAmY29uZmlnKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGY0LCBjb25maWd8MHgyKTsKKwkvKiBlbmFibGUgYWNjZXNzIHRvIGNvbmZpZyBzcGFjZSAqLworCWNvbmZpZyA9IHJlYWRfcGNpX2NvbmZpZ19ieXRlKDAsIDAsIDAsIDB4ZjQpOworCXdyaXRlX3BjaV9jb25maWdfYnl0ZSgwLCAwLCAwLCAweGY0LCBjb25maWd8MHgyKTsKIAogCS8qIHJlYWQgeFRQUiByZWdpc3RlciAqLwotCXJhd19wY2lfb3BzLT5yZWFkKDAsIDAsIDB4NDAsIDB4NGMsIDIsICZ3b3JkKTsKKwl3b3JkID0gcmVhZF9wY2lfY29uZmlnXzE2KDAsIDAsIDB4NDAsIDB4NGMpOwogCiAJaWYgKCEod29yZCAmICgxIDw8IDEzKSkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIGlycSBiYWxhbmNpbmcgYW5kIGFmZmluaXR5XG4iKTsKQEAgLTM4LDEzICs3NiwyNCBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJCW5vX2lycV9hZmZpbml0eSA9IDE7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIGNwdSBob3RwbHVnIGNvbnRyb2xcbiIpOworCQllbmFibGVfY3B1X2hvdHBsdWcgPSAwOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQkvKiBmb3JjZSB0aGUgZ2VuYXBpYyBzZWxlY3Rpb24gdG8gZmxhdCBtb2RlIHNvIHRoYXQKKwkJICogaW50ZXJydXB0cyBjYW4gYmUgcmVkaXJlY3RlZCB0byBtb3JlIHRoYW4gb25lIENQVS4KKwkJICovCisJCWdlbmFwaWNfZm9yY2UgPSAmYXBpY19mbGF0OworI2VuZGlmCiAJfQogCi0JLyogcHV0IGJhY2sgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBjb25maWcgc3BhY2UqLworCS8qIHB1dCBiYWNrIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgY29uZmlnIHNwYWNlICovCiAJaWYgKCEoY29uZmlnICYgMHgyKSkKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHhmNCwgY29uZmlnKTsKKwkJd3JpdGVfcGNpX2NvbmZpZ19ieXRlKDAsIDAsIDAsIDB4ZjQsIGNvbmZpZyk7CiB9Ci1ERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3MzIwX01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTI1X01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTIwX01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLCAgIFBDSV9ERVZJQ0VfSURfSU5URUxfRTczMjBfTUNILCAgdmVyaWZ5X3F1aXJrX2ludGVsX2lycWJhbGFuY2UpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTI1X01DSCwgIHZlcmlmeV9xdWlya19pbnRlbF9pcnFiYWxhbmNlKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsICAgUENJX0RFVklDRV9JRF9JTlRFTF9FNzUyMF9NQ0gsICB2ZXJpZnlfcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggODQyNzhlMC4uMzUxNGI0MSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCmluZGV4IDUxOWU2M2MuLjc5ZGY2ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKQEAgLTYzLDkgKzYzLDYgQEAKICNpbmNsdWRlIDxzZXR1cF9hcmNoLmg+CiAjaW5jbHVkZSA8Ymlvc19lYmRhLmg+CiAKLS8qIEZvcndhcmQgRGVjbGFyYXRpb24uICovCi12b2lkIF9faW5pdCBmaW5kX21heF9wZm4odm9pZCk7Ci0KIC8qIFRoaXMgdmFsdWUgaXMgc2V0IHVwIGJ5IHRoZSBlYXJseSBib290IGNvZGUgdG8gcG9pbnQgdG8gdGhlIHZhbHVlCiAgICBpbW1lZGlhdGVseSBhZnRlciB0aGUgYm9vdCB0aW1lIHBhZ2UgdGFibGVzLiAgSXQgY29udGFpbnMgYSAqcGh5c2ljYWwqCiAgICBhZGRyZXNzLCBhbmQgbXVzdCBub3QgYmUgaW4gdGhlIC5ic3Mgc2VnbWVudCEgKi8KQEAgLTc2LDExICs3Myw4IEBACiAvKgogICogTWFjaGluZSBzZXR1cC4uCiAgKi8KLQotI2lmZGVmIENPTkZJR19FRkkKLWludCBlZmlfZW5hYmxlZCA9IDA7Ci1FWFBPUlRfU1lNQk9MKGVmaV9lbmFibGVkKTsKLSNlbmRpZgorZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBjb2RlX3Jlc291cmNlOworZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBkYXRhX3Jlc291cmNlOwogCiAvKiBjcHUgZGF0YSBhcyBkZXRlY3RlZCBieSB0aGUgYXNzZW1ibHkgY29kZSBpbiBoZWFkLlMgKi8KIHN0cnVjdCBjcHVpbmZvX3g4NiBuZXdfY3B1X2RhdGEgX19pbml0ZGF0YSA9IHsgMCwgMCwgMCwgMCwgLTEsIDEsIDAsIDAsIC0xIH07CkBAIC05OSwxMiArOTMsNiBAQAogdW5zaWduZWQgaW50IEJJT1NfcmV2aXNpb247CiB1bnNpZ25lZCBpbnQgbWNhX3BlbnRpdW1fZmxhZzsKIAotLyogRm9yIFBDSSBvciBvdGhlciBtZW1vcnktbWFwcGVkIHJlc291cmNlcyAqLwotdW5zaWduZWQgbG9uZyBwY2lfbWVtX3N0YXJ0ID0gMHgxMDAwMDAwMDsKLSNpZmRlZiBDT05GSUdfUENJCi1FWFBPUlRfU1lNQk9MKHBjaV9tZW1fc3RhcnQpOwotI2VuZGlmCi0KIC8qIEJvb3QgbG9hZGVyIElEIGFzIGFuIGludGVnZXIsIGZvciB0aGUgYmVuZWZpdCBvZiBwcm9jX2RvaW50dmVjICovCiBpbnQgYm9vdGxvYWRlcl90eXBlOwogCkBAIC0xMzQsNyArMTIyLDYgQEAKIAlkZWZpbmVkKENPTkZJR19YODZfU1BFRURTVEVQX1NNSV9NT0RVTEUpCiBFWFBPUlRfU1lNQk9MKGlzdF9pbmZvKTsKICNlbmRpZgotc3RydWN0IGU4MjBtYXAgZTgyMDsKIAogZXh0ZXJuIHZvaWQgZWFybHlfY3B1X2luaXQodm9pZCk7CiBleHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKQEAgLTE0OSw1MTYgKzEzNiw2IEBACiAKIHVuc2lnbmVkIGNoYXIgX19pbml0ZGF0YSBib290X3BhcmFtc1tQQVJBTV9TSVpFXTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXRhX3Jlc291cmNlID0gewotCS5uYW1lCT0gIktlcm5lbCBkYXRhIiwKLQkuc3RhcnQJPSAwLAotCS5lbmQJPSAwLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGNvZGVfcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiS2VybmVsIGNvZGUiLAotCS5zdGFydAk9IDAsCi0JLmVuZAk9IDAsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3lzdGVtX3JvbV9yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJTeXN0ZW0gUk9NIiwKLQkuc3RhcnQJPSAweGYwMDAwLAotCS5lbmQJPSAweGZmZmZmLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBleHRlbnNpb25fcm9tX3Jlc291cmNlID0gewotCS5uYW1lCT0gIkV4dGVuc2lvbiBST00iLAotCS5zdGFydAk9IDB4ZTAwMDAsCi0JLmVuZAk9IDB4ZWZmZmYsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGFkYXB0ZXJfcm9tX3Jlc291cmNlc1tdID0geyB7Ci0JLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKLQkuc3RhcnQJPSAweGM4MDAwLAotCS5lbmQJPSAwLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQotfSwgewotCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCi0JLnN0YXJ0CT0gMCwKLQkuZW5kCT0gMCwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KLX0sIHsKLQkubmFtZSAJPSAiQWRhcHRlciBST00iLAotCS5zdGFydAk9IDAsCi0JLmVuZAk9IDAsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCi19LCB7Ci0JLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKLQkuc3RhcnQJPSAwLAotCS5lbmQJPSAwLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQotfSwgewotCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCi0JLnN0YXJ0CT0gMCwKLQkuZW5kCT0gMCwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KLX0sIHsKLQkubmFtZSAJPSAiQWRhcHRlciBST00iLAotCS5zdGFydAk9IDAsCi0JLmVuZAk9IDAsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCi19IH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdmlkZW9fcm9tX3Jlc291cmNlID0gewotCS5uYW1lIAk9ICJWaWRlbyBST00iLAotCS5zdGFydAk9IDB4YzAwMDAsCi0JLmVuZAk9IDB4YzdmZmYsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHZpZGVvX3JhbV9yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJWaWRlbyBSQU0gYXJlYSIsCi0JLnN0YXJ0CT0gMHhhMDAwMCwKLQkuZW5kCT0gMHhiZmZmZiwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX01FTQotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzdGFuZGFyZF9pb19yZXNvdXJjZXNbXSA9IHsgewotCS5uYW1lCT0gImRtYTEiLAotCS5zdGFydAk9IDB4MDAwMCwKLQkuZW5kCT0gMHgwMDFmLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KLX0sIHsKLQkubmFtZQk9ICJwaWMxIiwKLQkuc3RhcnQJPSAweDAwMjAsCi0JLmVuZAk9IDB4MDAyMSwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCi19LCB7Ci0JLm5hbWUgICA9ICJ0aW1lcjAiLAotCS5zdGFydAk9IDB4MDA0MCwKLQkuZW5kICAgID0gMHgwMDQzLAotCS5mbGFncyAgPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCi19LCB7Ci0JLm5hbWUgICA9ICJ0aW1lcjEiLAotCS5zdGFydCAgPSAweDAwNTAsCi0JLmVuZCAgICA9IDB4MDA1MywKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCi19LCB7Ci0JLm5hbWUJPSAia2V5Ym9hcmQiLAotCS5zdGFydAk9IDB4MDA2MCwKLQkuZW5kCT0gMHgwMDZmLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KLX0sIHsKLQkubmFtZQk9ICJkbWEgcGFnZSByZWciLAotCS5zdGFydAk9IDB4MDA4MCwKLQkuZW5kCT0gMHgwMDhmLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KLX0sIHsKLQkubmFtZQk9ICJwaWMyIiwKLQkuc3RhcnQJPSAweDAwYTAsCi0JLmVuZAk9IDB4MDBhMSwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCi19LCB7Ci0JLm5hbWUJPSAiZG1hMiIsCi0JLnN0YXJ0CT0gMHgwMGMwLAotCS5lbmQJPSAweDAwZGYsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTwotfSwgewotCS5uYW1lCT0gImZwdSIsCi0JLnN0YXJ0CT0gMHgwMGYwLAotCS5lbmQJPSAweDAwZmYsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTwotfSB9OwotCi0jZGVmaW5lIHJvbXNpZ25hdHVyZSh4KSAoKih1bnNpZ25lZCBzaG9ydCAqKSh4KSA9PSAweGFhNTUpCi0KLXN0YXRpYyBpbnQgX19pbml0IHJvbWNoZWNrc3VtKHVuc2lnbmVkIGNoYXIgKnJvbSwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCi17Ci0JdW5zaWduZWQgY2hhciAqcCwgc3VtID0gMDsKLQotCWZvciAocCA9IHJvbTsgcCA8IHJvbSArIGxlbmd0aDsgcCsrKQotCQlzdW0gKz0gKnA7Ci0JcmV0dXJuIHN1bSA9PSAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcHJvYmVfcm9tcyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGxlbmd0aCwgdXBwZXI7Ci0JdW5zaWduZWQgY2hhciAqcm9tOwotCWludAkgICAgICBpOwotCi0JLyogdmlkZW8gcm9tICovCi0JdXBwZXIgPSBhZGFwdGVyX3JvbV9yZXNvdXJjZXNbMF0uc3RhcnQ7Ci0JZm9yIChzdGFydCA9IHZpZGVvX3JvbV9yZXNvdXJjZS5zdGFydDsgc3RhcnQgPCB1cHBlcjsgc3RhcnQgKz0gMjA0OCkgewotCQlyb20gPSBpc2FfYnVzX3RvX3ZpcnQoc3RhcnQpOwotCQlpZiAoIXJvbXNpZ25hdHVyZShyb20pKQotCQkJY29udGludWU7Ci0KLQkJdmlkZW9fcm9tX3Jlc291cmNlLnN0YXJ0ID0gc3RhcnQ7Ci0KLQkJLyogMCA8IGxlbmd0aCA8PSAweDdmICogNTEyLCBoaXN0b3JpY2FsbHkgKi8KLQkJbGVuZ3RoID0gcm9tWzJdICogNTEyOwotCi0JCS8qIGlmIGNoZWNrc3VtIG9rYXksIHRydXN0IGxlbmd0aCBieXRlICovCi0JCWlmIChsZW5ndGggJiYgcm9tY2hlY2tzdW0ocm9tLCBsZW5ndGgpKQotCQkJdmlkZW9fcm9tX3Jlc291cmNlLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsKLQotCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnZpZGVvX3JvbV9yZXNvdXJjZSk7Ci0JCWJyZWFrOwotCX0KLQotCXN0YXJ0ID0gKHZpZGVvX3JvbV9yZXNvdXJjZS5lbmQgKyAxICsgMjA0NykgJiB+MjA0N1VMOwotCWlmIChzdGFydCA8IHVwcGVyKQotCQlzdGFydCA9IHVwcGVyOwotCi0JLyogc3lzdGVtIHJvbSAqLwotCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmc3lzdGVtX3JvbV9yZXNvdXJjZSk7Ci0JdXBwZXIgPSBzeXN0ZW1fcm9tX3Jlc291cmNlLnN0YXJ0OwotCi0JLyogY2hlY2sgZm9yIGV4dGVuc2lvbiByb20gKGlnbm9yZSBsZW5ndGggYnl0ZSEpICovCi0Jcm9tID0gaXNhX2J1c190b192aXJ0KGV4dGVuc2lvbl9yb21fcmVzb3VyY2Uuc3RhcnQpOwotCWlmIChyb21zaWduYXR1cmUocm9tKSkgewotCQlsZW5ndGggPSBleHRlbnNpb25fcm9tX3Jlc291cmNlLmVuZCAtIGV4dGVuc2lvbl9yb21fcmVzb3VyY2Uuc3RhcnQgKyAxOwotCQlpZiAocm9tY2hlY2tzdW0ocm9tLCBsZW5ndGgpKSB7Ci0JCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmV4dGVuc2lvbl9yb21fcmVzb3VyY2UpOwotCQkJdXBwZXIgPSBleHRlbnNpb25fcm9tX3Jlc291cmNlLnN0YXJ0OwotCQl9Ci0JfQotCi0JLyogY2hlY2sgZm9yIGFkYXB0ZXIgcm9tcyBvbiAyayBib3VuZGFyaWVzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWRhcHRlcl9yb21fcmVzb3VyY2VzKSAmJiBzdGFydCA8IHVwcGVyOyBzdGFydCArPSAyMDQ4KSB7Ci0JCXJvbSA9IGlzYV9idXNfdG9fdmlydChzdGFydCk7Ci0JCWlmICghcm9tc2lnbmF0dXJlKHJvbSkpCi0JCQljb250aW51ZTsKLQotCQkvKiAwIDwgbGVuZ3RoIDw9IDB4N2YgKiA1MTIsIGhpc3RvcmljYWxseSAqLwotCQlsZW5ndGggPSByb21bMl0gKiA1MTI7Ci0KLQkJLyogYnV0IGFjY2VwdCBhbnkgbGVuZ3RoIHRoYXQgZml0cyBpZiBjaGVja3N1bSBva2F5ICovCi0JCWlmICghbGVuZ3RoIHx8IHN0YXJ0ICsgbGVuZ3RoID4gdXBwZXIgfHwgIXJvbWNoZWNrc3VtKHJvbSwgbGVuZ3RoKSkKLQkJCWNvbnRpbnVlOwotCi0JCWFkYXB0ZXJfcm9tX3Jlc291cmNlc1tpXS5zdGFydCA9IHN0YXJ0OwotCQlhZGFwdGVyX3JvbV9yZXNvdXJjZXNbaV0uZW5kID0gc3RhcnQgKyBsZW5ndGggLSAxOwotCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmFkYXB0ZXJfcm9tX3Jlc291cmNlc1tpXSk7Ci0KLQkJc3RhcnQgPSBhZGFwdGVyX3JvbV9yZXNvdXJjZXNbaSsrXS5lbmQgJiB+MjA0N1VMOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGxpbWl0X3JlZ2lvbnModW5zaWduZWQgbG9uZyBsb25nIHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIGN1cnJlbnRfYWRkciA9IDA7Ci0JaW50IGk7Ci0KLQlpZiAoZWZpX2VuYWJsZWQpIHsKLQkJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwotCQl2b2lkICpwOwotCi0JCWZvciAocCA9IG1lbW1hcC5tYXAsIGkgPSAwOyBwIDwgbWVtbWFwLm1hcF9lbmQ7Ci0JCQlwICs9IG1lbW1hcC5kZXNjX3NpemUsIGkrKykgewotCQkJbWQgPSBwOwotCQkJY3VycmVudF9hZGRyID0gbWQtPnBoeXNfYWRkciArIChtZC0+bnVtX3BhZ2VzIDw8IDEyKTsKLQkJCWlmIChtZC0+dHlwZSA9PSBFRklfQ09OVkVOVElPTkFMX01FTU9SWSkgewotCQkJCWlmIChjdXJyZW50X2FkZHIgPj0gc2l6ZSkgewotCQkJCQltZC0+bnVtX3BhZ2VzIC09Ci0JCQkJCQkoKChjdXJyZW50X2FkZHItc2l6ZSkgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVCk7Ci0JCQkJCW1lbW1hcC5ucl9tYXAgPSBpICsgMTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQljdXJyZW50X2FkZHIgPSBlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZTsKLQkJaWYgKGN1cnJlbnRfYWRkciA8IHNpemUpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChlODIwLm1hcFtpXS5hZGRyID49IHNpemUpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIHJlZ2lvbiBzdGFydHMgcGFzdCB0aGUgZW5kIG9mIHRoZQotCQkJICogcmVxdWVzdGVkIHNpemUsIHNraXAgaXQgY29tcGxldGVseS4KLQkJCSAqLwotCQkJZTgyMC5ucl9tYXAgPSBpOwotCQl9IGVsc2UgewotCQkJZTgyMC5ucl9tYXAgPSBpICsgMTsKLQkJCWU4MjAubWFwW2ldLnNpemUgLT0gY3VycmVudF9hZGRyIC0gc2l6ZTsKLQkJfQotCQlyZXR1cm47Ci0JfQotfQotCi12b2lkIF9faW5pdCBhZGRfbWVtb3J5X3JlZ2lvbih1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgaW50IHR5cGUpCi17Ci0JaW50IHg7Ci0KLQlpZiAoIWVmaV9lbmFibGVkKSB7Ci0gICAgICAgCQl4ID0gZTgyMC5ucl9tYXA7Ci0KLQkJaWYgKHggPT0gRTgyME1BWCkgewotCQkgICAgcHJpbnRrKEtFUk5fRVJSICJPb29wcyEgVG9vIG1hbnkgZW50cmllcyBpbiB0aGUgbWVtb3J5IG1hcCFcbiIpOwotCQkgICAgcmV0dXJuOwotCQl9Ci0KLQkJZTgyMC5tYXBbeF0uYWRkciA9IHN0YXJ0OwotCQllODIwLm1hcFt4XS5zaXplID0gc2l6ZTsKLQkJZTgyMC5tYXBbeF0udHlwZSA9IHR5cGU7Ci0JCWU4MjAubnJfbWFwKys7Ci0JfQotfSAvKiBhZGRfbWVtb3J5X3JlZ2lvbiAqLwotCi0jZGVmaW5lIEU4MjBfREVCVUcJMQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcHJpbnRfbWVtb3J5X21hcChjaGFyICp3aG8pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlwcmludGsoIiAlczogJTAxNkx4IC0gJTAxNkx4ICIsIHdobywKLQkJCWU4MjAubWFwW2ldLmFkZHIsCi0JCQllODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSk7Ci0JCXN3aXRjaCAoZTgyMC5tYXBbaV0udHlwZSkgewotCQljYXNlIEU4MjBfUkFNOglwcmludGsoIih1c2FibGUpXG4iKTsKLQkJCQlicmVhazsKLQkJY2FzZSBFODIwX1JFU0VSVkVEOgotCQkJCXByaW50aygiKHJlc2VydmVkKVxuIik7Ci0JCQkJYnJlYWs7Ci0JCWNhc2UgRTgyMF9BQ1BJOgotCQkJCXByaW50aygiKEFDUEkgZGF0YSlcbiIpOwotCQkJCWJyZWFrOwotCQljYXNlIEU4MjBfTlZTOgotCQkJCXByaW50aygiKEFDUEkgTlZTKVxuIik7Ci0JCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CXByaW50aygidHlwZSAlbHVcbiIsIGU4MjAubWFwW2ldLnR5cGUpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0vKgotICogU2FuaXRpemUgdGhlIEJJT1MgZTgyMCBtYXAuCi0gKgotICogU29tZSBlODIwIHJlc3BvbnNlcyBpbmNsdWRlIG92ZXJsYXBwaW5nIGVudHJpZXMuICBUaGUgZm9sbG93aW5nIAotICogcmVwbGFjZXMgdGhlIG9yaWdpbmFsIGU4MjAgbWFwIHdpdGggYSBuZXcgb25lLCByZW1vdmluZyBvdmVybGFwcy4KLSAqCi0gKi8KLXN0cnVjdCBjaGFuZ2VfbWVtYmVyIHsKLQlzdHJ1Y3QgZTgyMGVudHJ5ICpwYmlvczsgLyogcG9pbnRlciB0byBvcmlnaW5hbCBiaW9zIGVudHJ5ICovCi0JdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7IC8qIGFkZHJlc3MgZm9yIHRoaXMgY2hhbmdlIHBvaW50ICovCi19Owotc3RhdGljIHN0cnVjdCBjaGFuZ2VfbWVtYmVyIGNoYW5nZV9wb2ludF9saXN0WzIqRTgyME1BWF0gX19pbml0ZGF0YTsKLXN0YXRpYyBzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3BvaW50WzIqRTgyME1BWF0gX19pbml0ZGF0YTsKLXN0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5ICpvdmVybGFwX2xpc3RbRTgyME1BWF0gX19pbml0ZGF0YTsKLXN0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5IG5ld19iaW9zW0U4MjBNQVhdIF9faW5pdGRhdGE7Ci0KLWludCBfX2luaXQgc2FuaXRpemVfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqIGJpb3NtYXAsIGNoYXIgKiBwbnJfbWFwKQotewotCXN0cnVjdCBjaGFuZ2VfbWVtYmVyICpjaGFuZ2VfdG1wOwotCXVuc2lnbmVkIGxvbmcgY3VycmVudF90eXBlLCBsYXN0X3R5cGU7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGxhc3RfYWRkcjsKLQlpbnQgY2hnaWR4LCBzdGlsbF9jaGFuZ2luZzsKLQlpbnQgb3ZlcmxhcF9lbnRyaWVzOwotCWludCBuZXdfYmlvc19lbnRyeTsKLQlpbnQgb2xkX25yLCBuZXdfbnIsIGNoZ19ucjsKLQlpbnQgaTsKLQotCS8qCi0JCVZpc3VhbGx5IHdlJ3JlIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZyAoMSwyLDMsNCA9IG1lbW9yeSB0eXBlcykuLi4KLQotCQlTYW1wbGUgbWVtb3J5IG1hcCAody9vdmVybGFwcyk6Ci0JCSAgIF9fX18yMl9fX19fX19fX19fX19fX19fXwotCQkgICBfX19fX19fX19fX19fX19fX19fX19fNF8KLQkJICAgX19fXzExMTFfX19fX19fX19fX19fX19fCi0JCSAgIF80NF9fX19fX19fX19fX19fX19fX19fXwotCQkgICAxMTExMTExMV9fX19fX19fX19fX19fX18KLQkJICAgX19fX19fX19fX19fX19fX19fX18zM19fCi0JCSAgIF9fX19fX19fX19fNDRfX19fX19fX19fXwotCQkgICBfX19fX19fX19fMzMzMzNfX19fX19fX18KLQkJICAgX19fX19fX19fX19fX18yMl9fX19fX19fCi0JCSAgIF9fX19fX19fX19fX19fX19fX18yMjIyXwotCQkgICBfX19fX19fX18xMTExMTExMTFfX19fX18KLQkJICAgX19fX19fX19fX19fX19fX19fX19fMTFfCi0JCSAgIF9fX19fX19fX19fX19fX19fNF9fX19fXwotCi0JCVNhbml0aXplZCBlcXVpdmFsZW50IChubyBvdmVybGFwKToKLQkJICAgMV9fX19fX19fX19fX19fX19fX19fX19fCi0JCSAgIF80NF9fX19fX19fX19fX19fX19fX19fXwotCQkgICBfX18xX19fX19fX19fX19fX19fX19fX18KLQkJICAgX19fXzIyX19fX19fX19fX19fX19fX19fCi0JCSAgIF9fX19fXzExX19fX19fX19fX19fX19fXwotCQkgICBfX19fX19fX18xX19fX19fX19fX19fX18KLQkJICAgX19fX19fX19fXzNfX19fX19fX19fX19fCi0JCSAgIF9fX19fX19fX19fNDRfX19fX19fX19fXwotCQkgICBfX19fX19fX19fX19fMzNfX19fX19fX18KLQkJICAgX19fX19fX19fX19fX19fMl9fX19fX19fCi0JCSAgIF9fX19fX19fX19fX19fX18xX19fX19fXwotCQkgICBfX19fX19fX19fX19fX19fXzRfX19fX18KLQkJICAgX19fX19fX19fX19fX19fX19fXzJfX19fCi0JCSAgIF9fX19fX19fX19fX19fX19fX19fMzNfXwotCQkgICBfX19fX19fX19fX19fX19fX19fX19fNF8KLQkqLwotCi0JLyogaWYgdGhlcmUncyBvbmx5IG9uZSBtZW1vcnkgcmVnaW9uLCBkb24ndCBib3RoZXIgKi8KLQlpZiAoKnBucl9tYXAgPCAyKQotCQlyZXR1cm4gLTE7Ci0KLQlvbGRfbnIgPSAqcG5yX21hcDsKLQotCS8qIGJhaWwgb3V0IGlmIHdlIGZpbmQgYW55IHVucmVhc29uYWJsZSBhZGRyZXNzZXMgaW4gYmlvcyBtYXAgKi8KLQlmb3IgKGk9MDsgaTxvbGRfbnI7IGkrKykKLQkJaWYgKGJpb3NtYXBbaV0uYWRkciArIGJpb3NtYXBbaV0uc2l6ZSA8IGJpb3NtYXBbaV0uYWRkcikKLQkJCXJldHVybiAtMTsKLQotCS8qIGNyZWF0ZSBwb2ludGVycyBmb3IgaW5pdGlhbCBjaGFuZ2UtcG9pbnQgaW5mb3JtYXRpb24gKGZvciBzb3J0aW5nKSAqLwotCWZvciAoaT0wOyBpIDwgMipvbGRfbnI7IGkrKykKLQkJY2hhbmdlX3BvaW50W2ldID0gJmNoYW5nZV9wb2ludF9saXN0W2ldOwotCi0JLyogcmVjb3JkIGFsbCBrbm93biBjaGFuZ2UtcG9pbnRzIChzdGFydGluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcyksCi0JICAgb21pdHRpbmcgdGhvc2UgdGhhdCBhcmUgZm9yIGVtcHR5IG1lbW9yeSByZWdpb25zICovCi0JY2hnaWR4ID0gMDsKLQlmb3IgKGk9MDsgaSA8IG9sZF9ucjsgaSsrKQl7Ci0JCWlmIChiaW9zbWFwW2ldLnNpemUgIT0gMCkgewotCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPSBiaW9zbWFwW2ldLmFkZHI7Ci0JCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wYmlvcyA9ICZiaW9zbWFwW2ldOwotCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPSBiaW9zbWFwW2ldLmFkZHIgKyBiaW9zbWFwW2ldLnNpemU7Ci0JCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wYmlvcyA9ICZiaW9zbWFwW2ldOwotCQl9Ci0JfQotCWNoZ19uciA9IGNoZ2lkeDsgICAgCS8qIHRydWUgbnVtYmVyIG9mIGNoYW5nZS1wb2ludHMgKi8KLQotCS8qIHNvcnQgY2hhbmdlLXBvaW50IGxpc3QgYnkgbWVtb3J5IGFkZHJlc3NlcyAobG93IC0+IGhpZ2gpICovCi0Jc3RpbGxfY2hhbmdpbmcgPSAxOwotCXdoaWxlIChzdGlsbF9jaGFuZ2luZykJewotCQlzdGlsbF9jaGFuZ2luZyA9IDA7Ci0JCWZvciAoaT0xOyBpIDwgY2hnX25yOyBpKyspICB7Ci0JCQkvKiBpZiA8Y3VycmVudF9hZGRyPiA+IDxsYXN0X2FkZHI+LCBzd2FwICovCi0JCQkvKiBvciwgaWYgY3VycmVudD08c3RhcnRfYWRkcj4gJiBsYXN0PTxlbmRfYWRkcj4sIHN3YXAgKi8KLQkJCWlmICgoY2hhbmdlX3BvaW50W2ldLT5hZGRyIDwgY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpIHx8Ci0JCQkJKChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpICYmCi0JCQkJIChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2ldLT5wYmlvcy0+YWRkcikgJiYKLQkJCQkgKGNoYW5nZV9wb2ludFtpLTFdLT5hZGRyICE9IGNoYW5nZV9wb2ludFtpLTFdLT5wYmlvcy0+YWRkcikpCi0JCQkgICApCi0JCQl7Ci0JCQkJY2hhbmdlX3RtcCA9IGNoYW5nZV9wb2ludFtpXTsKLQkJCQljaGFuZ2VfcG9pbnRbaV0gPSBjaGFuZ2VfcG9pbnRbaS0xXTsKLQkJCQljaGFuZ2VfcG9pbnRbaS0xXSA9IGNoYW5nZV90bXA7Ci0JCQkJc3RpbGxfY2hhbmdpbmc9MTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIGNyZWF0ZSBhIG5ldyBiaW9zIG1lbW9yeSBtYXAsIHJlbW92aW5nIG92ZXJsYXBzICovCi0Jb3ZlcmxhcF9lbnRyaWVzPTA7CSAvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgb3ZlcmxhcCB0YWJsZSAqLwotCW5ld19iaW9zX2VudHJ5PTA7CSAvKiBpbmRleCBmb3IgY3JlYXRpbmcgbmV3IGJpb3MgbWFwIGVudHJpZXMgKi8KLQlsYXN0X3R5cGUgPSAwOwkJIC8qIHN0YXJ0IHdpdGggdW5kZWZpbmVkIG1lbW9yeSB0eXBlICovCi0JbGFzdF9hZGRyID0gMDsJCSAvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCi0JLyogbG9vcCB0aHJvdWdoIGNoYW5nZS1wb2ludHMsIGRldGVybWluaW5nIGFmZmVjdCBvbiB0aGUgbmV3IGJpb3MgbWFwICovCi0JZm9yIChjaGdpZHg9MDsgY2hnaWR4IDwgY2hnX25yOyBjaGdpZHgrKykKLQl7Ci0JCS8qIGtlZXAgdHJhY2sgb2YgYWxsIG92ZXJsYXBwaW5nIGJpb3MgZW50cmllcyAqLwotCQlpZiAoY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBiaW9zLT5hZGRyKQotCQl7Ci0JCQkvKiBhZGQgbWFwIGVudHJ5IHRvIG92ZXJsYXAgbGlzdCAoPiAxIGVudHJ5IGltcGxpZXMgYW4gb3ZlcmxhcCkgKi8KLQkJCW92ZXJsYXBfbGlzdFtvdmVybGFwX2VudHJpZXMrK109Y2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBiaW9zOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyogcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCAob3JkZXIgaW5kZXBlbmRlbnQsIHNvIHN3YXAgd2l0aCBsYXN0KSAqLwotCQkJZm9yIChpPTA7IGk8b3ZlcmxhcF9lbnRyaWVzOyBpKyspCi0JCQl7Ci0JCQkJaWYgKG92ZXJsYXBfbGlzdFtpXSA9PSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+cGJpb3MpCi0JCQkJCW92ZXJsYXBfbGlzdFtpXSA9IG92ZXJsYXBfbGlzdFtvdmVybGFwX2VudHJpZXMtMV07Ci0JCQl9Ci0JCQlvdmVybGFwX2VudHJpZXMtLTsKLQkJfQotCQkvKiBpZiB0aGVyZSBhcmUgb3ZlcmxhcHBpbmcgZW50cmllcywgZGVjaWRlIHdoaWNoICJ0eXBlIiB0byB1c2UgKi8KLQkJLyogKGxhcmdlciB2YWx1ZSB0YWtlcyBwcmVjZWRlbmNlIC0tIDE9dXNhYmxlLCAyLDMsNCw0Kz11bnVzYWJsZSkgKi8KLQkJY3VycmVudF90eXBlID0gMDsKLQkJZm9yIChpPTA7IGk8b3ZlcmxhcF9lbnRyaWVzOyBpKyspCi0JCQlpZiAob3ZlcmxhcF9saXN0W2ldLT50eXBlID4gY3VycmVudF90eXBlKQotCQkJCWN1cnJlbnRfdHlwZSA9IG92ZXJsYXBfbGlzdFtpXS0+dHlwZTsKLQkJLyogY29udGludWUgYnVpbGRpbmcgdXAgbmV3IGJpb3MgbWFwIGJhc2VkIG9uIHRoaXMgaW5mb3JtYXRpb24gKi8KLQkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUpCXsKLQkJCWlmIChsYXN0X3R5cGUgIT0gMCkJIHsKLQkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0uc2l6ZSA9Ci0JCQkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyIC0gbGFzdF9hZGRyOwotCQkJCS8qIG1vdmUgZm9yd2FyZCBvbmx5IGlmIHRoZSBuZXcgc2l6ZSB3YXMgbm9uLXplcm8gKi8KLQkJCQlpZiAobmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLnNpemUgIT0gMCkKLQkJCQkJaWYgKCsrbmV3X2Jpb3NfZW50cnkgPj0gRTgyME1BWCkKLQkJCQkJCWJyZWFrOyAJLyogbm8gbW9yZSBzcGFjZSBsZWZ0IGZvciBuZXcgYmlvcyBlbnRyaWVzICovCi0JCQl9Ci0JCQlpZiAoY3VycmVudF90eXBlICE9IDApCXsKLQkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0uYWRkciA9IGNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyOwotCQkJCW5ld19iaW9zW25ld19iaW9zX2VudHJ5XS50eXBlID0gY3VycmVudF90eXBlOwotCQkJCWxhc3RfYWRkcj1jaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKLQkJCX0KLQkJCWxhc3RfdHlwZSA9IGN1cnJlbnRfdHlwZTsKLQkJfQotCX0KLQluZXdfbnIgPSBuZXdfYmlvc19lbnRyeTsgICAvKiByZXRhaW4gY291bnQgZm9yIG5ldyBiaW9zIGVudHJpZXMgKi8KLQotCS8qIGNvcHkgbmV3IGJpb3MgbWFwcGluZyBpbnRvIG9yaWdpbmFsIGxvY2F0aW9uICovCi0JbWVtY3B5KGJpb3NtYXAsIG5ld19iaW9zLCBuZXdfbnIqc2l6ZW9mKHN0cnVjdCBlODIwZW50cnkpKTsKLQkqcG5yX21hcCA9IG5ld19ucjsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ29weSB0aGUgQklPUyBlODIwIG1hcCBpbnRvIGEgc2FmZSBwbGFjZS4KLSAqCi0gKiBTYW5pdHktY2hlY2sgaXQgd2hpbGUgd2UncmUgYXQgaXQuLgotICoKLSAqIElmIHdlJ3JlIGx1Y2t5IGFuZCBsaXZlIG9uIGEgbW9kZXJuIHN5c3RlbSwgdGhlIHNldHVwIGNvZGUKLSAqIHdpbGwgaGF2ZSBnaXZlbiB1cyBhIG1lbW9yeSBtYXAgdGhhdCB3ZSBjYW4gdXNlIHRvIHByb3Blcmx5Ci0gKiBzZXQgdXAgbWVtb3J5LiAgSWYgd2UgYXJlbid0LCB3ZSdsbCBmYWtlIGEgbWVtb3J5IG1hcC4KLSAqCi0gKiBXZSBjaGVjayB0byBzZWUgdGhhdCB0aGUgbWVtb3J5IG1hcCBjb250YWlucyBhdCBsZWFzdCAyIGVsZW1lbnRzCi0gKiBiZWZvcmUgd2UnbGwgdXNlIGl0LCBiZWNhdXNlIHRoZSBkZXRlY3Rpb24gY29kZSBpbiBzZXR1cC5TIG1heQotICogbm90IGJlIHBlcmZlY3QgYW5kIG1vc3QgZXZlcnkgUEMga25vd24gdG8gbWFuIGhhcyB0d28gbWVtb3J5Ci0gKiByZWdpb25zOiBvbmUgZnJvbSAwIHRvIDY0MGssIGFuZCBvbmUgZnJvbSAxbWIgdXAuICAoVGhlIElCTQotICogdGhpbmtwYWQgNTYweCwgZm9yIGV4YW1wbGUsIGRvZXMgbm90IGNvb3BlcmF0ZSB3aXRoIHRoZSBtZW1vcnkKLSAqIGRldGVjdGlvbiBjb2RlLikKLSAqLwotaW50IF9faW5pdCBjb3B5X2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBpbnQgbnJfbWFwKQotewotCS8qIE9ubHkgb25lIG1lbW9yeSByZWdpb24gKG9yIG5lZ2F0aXZlKT8gSWdub3JlIGl0ICovCi0JaWYgKG5yX21hcCA8IDIpCi0JCXJldHVybiAtMTsKLQotCWRvIHsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gYmlvc21hcC0+YWRkcjsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHNpemUgPSBiaW9zbWFwLT5zaXplOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgZW5kID0gc3RhcnQgKyBzaXplOwotCQl1bnNpZ25lZCBsb25nIHR5cGUgPSBiaW9zbWFwLT50eXBlOwotCi0JCS8qIE92ZXJmbG93IGluIDY0IGJpdHM/IElnbm9yZSB0aGUgbWVtb3J5IG1hcC4gKi8KLQkJaWYgKHN0YXJ0ID4gZW5kKQotCQkJcmV0dXJuIC0xOwotCi0JCS8qCi0JCSAqIFNvbWUgQklPU2VzIGNsYWltIFJBTSBpbiB0aGUgNjQwayAtIDFNIHJlZ2lvbi4KLQkJICogTm90IHJpZ2h0LiBGaXggaXQgdXAuCi0JCSAqLwotCQlpZiAodHlwZSA9PSBFODIwX1JBTSkgewotCQkJaWYgKHN0YXJ0IDwgMHgxMDAwMDBVTEwgJiYgZW5kID4gMHhBMDAwMFVMTCkgewotCQkJCWlmIChzdGFydCA8IDB4QTAwMDBVTEwpCi0JCQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0LCAweEEwMDAwVUxMLXN0YXJ0LCB0eXBlKTsKLQkJCQlpZiAoZW5kIDw9IDB4MTAwMDAwVUxMKQotCQkJCQljb250aW51ZTsKLQkJCQlzdGFydCA9IDB4MTAwMDAwVUxMOwotCQkJCXNpemUgPSBlbmQgLSBzdGFydDsKLQkJCX0KLQkJfQotCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydCwgc2l6ZSwgdHlwZSk7Ci0JfSB3aGlsZSAoYmlvc21hcCsrLC0tbnJfbWFwKTsKLQlyZXR1cm4gMDsKLX0KLQogI2lmIGRlZmluZWQoQ09ORklHX0VERCkgfHwgZGVmaW5lZChDT05GSUdfRUREX01PRFVMRSkKIHN0cnVjdCBlZGQgZWRkOwogI2lmZGVmIENPTkZJR19FRERfTU9EVUxFCkBAIC02ODIsNyArMTU5LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgdXNlcl9kZWZpbmVkX21lbW1hcCA9IDA7CitpbnQgX19pbml0ZGF0YSB1c2VyX2RlZmluZWRfbWVtbWFwID0gMDsKIAogLyoKICAqICJtZW09bm9wZW50aXVtIiBkaXNhYmxlcyB0aGUgNE1CIHBhZ2UgdGFibGVzLgpAQCAtNzE5LDUxICsxOTYsNiBAQAogfQogZWFybHlfcGFyYW0oIm1lbSIsIHBhcnNlX21lbSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX21lbW1hcChjaGFyICphcmcpCi17Ci0JaWYgKCFhcmcpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHN0cmNtcChhcmcsICJleGFjdG1hcCIpID09IDApIHsKLSNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAotCQkvKiBJZiB3ZSBhcmUgZG9pbmcgYSBjcmFzaCBkdW1wLCB3ZQotCQkgKiBzdGlsbCBuZWVkIHRvIGtub3cgdGhlIHJlYWwgbWVtCi0JCSAqIHNpemUgYmVmb3JlIG9yaWdpbmFsIG1lbW9yeSBtYXAgaXMKLQkJICogcmVzZXQuCi0JCSAqLwotCQlmaW5kX21heF9wZm4oKTsKLQkJc2F2ZWRfbWF4X3BmbiA9IG1heF9wZm47Ci0jZW5kaWYKLQkJZTgyMC5ucl9tYXAgPSAwOwotCQl1c2VyX2RlZmluZWRfbWVtbWFwID0gMTsKLQl9IGVsc2UgewotCQkvKiBJZiB0aGUgdXNlciBzcGVjaWZpZXMgbWVtb3J5IHNpemUsIHdlCi0JCSAqIGxpbWl0IHRoZSBCSU9TLXByb3ZpZGVkIG1lbW9yeSBtYXAgdG8KLQkJICogdGhhdCBzaXplLiBleGFjdG1hcCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5Ci0JCSAqIHRoZSBleGFjdCBtYXAuIG1lbT1udW1iZXIgY2FuIGJlIHVzZWQgdG8KLQkJICogdHJpbSB0aGUgZXhpc3RpbmcgbWVtb3J5IG1hcC4KLQkJICovCi0JCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydF9hdCwgbWVtX3NpemU7Ci0KLQkJbWVtX3NpemUgPSBtZW1wYXJzZShhcmcsICZhcmcpOwotCQlpZiAoKmFyZyA9PSAnQCcpIHsKLQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoYXJnKzEsICZhcmcpOwotCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX1JBTSk7Ci0JCX0gZWxzZSBpZiAoKmFyZyA9PSAnIycpIHsKLQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoYXJnKzEsICZhcmcpOwotCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX0FDUEkpOwotCQl9IGVsc2UgaWYgKCphcmcgPT0gJyQnKSB7Ci0JCQlzdGFydF9hdCA9IG1lbXBhcnNlKGFyZysxLCAmYXJnKTsKLQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9SRVNFUlZFRCk7Ci0JCX0gZWxzZSB7Ci0JCQlsaW1pdF9yZWdpb25zKG1lbV9zaXplKTsKLQkJCXVzZXJfZGVmaW5lZF9tZW1tYXAgPSAxOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oIm1lbW1hcCIsIHBhcnNlX21lbW1hcCk7Ci0KICNpZmRlZiBDT05GSUdfUFJPQ19WTUNPUkUKIC8qIGVsZmNvcmVoZHI9IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgZWxmIGNvcmUgaGVhZGVyCiAgKiBzdG9yZWQgYnkgdGhlIGNyYXNoZWQga2VybmVsLgpAQCAtODI4LDkwICsyNjAsNiBAQAogZWFybHlfcGFyYW0oInJlc2VydmV0b3AiLCBwYXJzZV9yZXNlcnZldG9wKTsKIAogLyoKLSAqIENhbGxiYWNrIGZvciBlZmlfbWVtb3J5X3dhbGsuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1lZmlfZmluZF9tYXhfcGZuKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpCi17Ci0JdW5zaWduZWQgbG9uZyAqbWF4X3BmbiA9IGFyZywgcGZuOwotCi0JaWYgKHN0YXJ0IDwgZW5kKSB7Ci0JCXBmbiA9IFBGTl9VUChlbmQgLTEpOwotCQlpZiAocGZuID4gKm1heF9wZm4pCi0JCQkqbWF4X3BmbiA9IHBmbjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0Ci1lZmlfbWVtb3J5X3ByZXNlbnRfd3JhcHBlcih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgdm9pZCAqYXJnKQotewotCW1lbW9yeV9wcmVzZW50KDAsIHN0YXJ0LCBlbmQpOwotCXJldHVybiAwOwotfQotCi0gLyoKLSAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZW50aXJlIHJhbmdlIDxzdGFydCxlbmQ+IGlzIG1hcHBlZCB3aXRoIHR5cGUuCi0gICoKLSAgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MgY29ycmVjdCBpZiB0aGUgZTgyMCB0YWJsZSBpcyBzb3J0ZWQgYW5kCi0gICogbm90LW92ZXJsYXBwaW5nLCB3aGljaCBpcyB0aGUgY2FzZQotICAqLwotaW50IF9faW5pdAotZTgyMF9hbGxfbWFwcGVkKHVuc2lnbmVkIGxvbmcgcywgdW5zaWduZWQgbG9uZyBlLCB1bnNpZ25lZCB0eXBlKQotewotCXU2NCBzdGFydCA9IHM7Ci0JdTY0IGVuZCA9IGU7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07Ci0JCWlmICh0eXBlICYmIGVpLT50eXBlICE9IHR5cGUpCi0JCQljb250aW51ZTsKLQkJLyogaXMgdGhlIHJlZ2lvbiAocGFydCkgaW4gb3ZlcmxhcCB3aXRoIHRoZSBjdXJyZW50IHJlZ2lvbiA/Ki8KLQkJaWYgKGVpLT5hZGRyID49IGVuZCB8fCBlaS0+YWRkciArIGVpLT5zaXplIDw9IHN0YXJ0KQotCQkJY29udGludWU7Ci0JCS8qIGlmIHRoZSByZWdpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiA8c3RhcnQsZW5kPiB3ZSBtb3ZlCi0JCSAqIHN0YXJ0IHRvIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbiBzaW5jZSBpdCdzIG9rIHVudGlsIHRoZXJlCi0JCSAqLwotCQlpZiAoZWktPmFkZHIgPD0gc3RhcnQpCi0JCQlzdGFydCA9IGVpLT5hZGRyICsgZWktPnNpemU7Ci0JCS8qIGlmIHN0YXJ0IGlzIG5vdyBhdCBvciBiZXlvbmQgZW5kLCB3ZSdyZSBkb25lLCBmdWxsCi0JCSAqIGNvdmVyYWdlICovCi0JCWlmIChzdGFydCA+PSBlbmQpCi0JCQlyZXR1cm4gMTsgLyogd2UncmUgZG9uZSAqLwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKLSAqLwotdm9pZCBfX2luaXQgZmluZF9tYXhfcGZuKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQltYXhfcGZuID0gMDsKLQlpZiAoZWZpX2VuYWJsZWQpIHsKLQkJZWZpX21lbW1hcF93YWxrKGVmaV9maW5kX21heF9wZm4sICZtYXhfcGZuKTsKLQkJZWZpX21lbW1hcF93YWxrKGVmaV9tZW1vcnlfcHJlc2VudF93cmFwcGVyLCBOVUxMKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKLQkJLyogUkFNPyAqLwotCQlpZiAoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKLQkJCWNvbnRpbnVlOwotCQlzdGFydCA9IFBGTl9VUChlODIwLm1hcFtpXS5hZGRyKTsKLQkJZW5kID0gUEZOX0RPV04oZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUpOwotCQlpZiAoc3RhcnQgPj0gZW5kKQotCQkJY29udGludWU7Ci0JCWlmIChlbmQgPiBtYXhfcGZuKQotCQkJbWF4X3BmbiA9IGVuZDsKLQkJbWVtb3J5X3ByZXNlbnQoMCwgc3RhcnQsIGVuZCk7Ci0JfQotfQotCi0vKgogICogRGV0ZXJtaW5lIGxvdyBhbmQgaGlnaCBtZW1vcnkgcmFuZ2VzOgogICovCiB1bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX21heF9sb3dfcGZuKHZvaWQpCkBAIC05NzEsNjggKzMxOSw2IEBACiB9CiAKIC8qCi0gKiBGcmVlIGFsbCBhdmFpbGFibGUgbWVtb3J5IGZvciBib290IHRpbWUgYWxsb2NhdGlvbi4gIFVzZWQKLSAqIGFzIGEgY2FsbGJhY2sgZnVuY3Rpb24gYnkgZWZpX21lbW9yeV93YWxrKCkKLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdAotZnJlZV9hdmFpbGFibGVfbWVtb3J5KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpCi17Ci0JLyogY2hlY2sgbWF4X2xvd19wZm4gKi8KLQlpZiAoc3RhcnQgPj0gKG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpKQotCQlyZXR1cm4gMDsKLQlpZiAoZW5kID49IChtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUKSkKLQkJZW5kID0gbWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVDsKLQlpZiAoc3RhcnQgPCBlbmQpCi0JCWZyZWVfYm9vdG1lbShzdGFydCwgZW5kIC0gc3RhcnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0vKgotICogUmVnaXN0ZXIgZnVsbHkgYXZhaWxhYmxlIGxvdyBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCByZWdpc3Rlcl9ib290bWVtX2xvd19wYWdlcyh1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuKQotewotCWludCBpOwotCi0JaWYgKGVmaV9lbmFibGVkKSB7Ci0JCWVmaV9tZW1tYXBfd2FsayhmcmVlX2F2YWlsYWJsZV9tZW1vcnksIE5VTEwpOwotCQlyZXR1cm47Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgY3Vycl9wZm4sIGxhc3RfcGZuLCBzaXplOwotCQkvKgotCQkgKiBSZXNlcnZlIHVzYWJsZSBsb3cgbWVtb3J5Ci0JCSAqLwotCQlpZiAoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKLQkJCWNvbnRpbnVlOwotCQkvKgotCQkgKiBXZSBhcmUgcm91bmRpbmcgdXAgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdXNhYmxlIG1lbW9yeToKLQkJICovCi0JCWN1cnJfcGZuID0gUEZOX1VQKGU4MjAubWFwW2ldLmFkZHIpOwotCQlpZiAoY3Vycl9wZm4gPj0gbWF4X2xvd19wZm4pCi0JCQljb250aW51ZTsKLQkJLyoKLQkJICogLi4uIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSB1c2FibGUgcmFuZ2UgZG93bndhcmRzOgotCQkgKi8KLQkJbGFzdF9wZm4gPSBQRk5fRE9XTihlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSk7Ci0KLQkJaWYgKGxhc3RfcGZuID4gbWF4X2xvd19wZm4pCi0JCQlsYXN0X3BmbiA9IG1heF9sb3dfcGZuOwotCi0JCS8qCi0JCSAqIC4uIGZpbmFsbHksIGRpZCBhbGwgdGhlIHJvdW5kaW5nIGFuZCBwbGF5aW5nCi0JCSAqIGFyb3VuZCBqdXN0IG1ha2UgdGhlIGFyZWEgZ28gYXdheT8KLQkJICovCi0JCWlmIChsYXN0X3BmbiA8PSBjdXJyX3BmbikKLQkJCWNvbnRpbnVlOwotCi0JCXNpemUgPSBsYXN0X3BmbiAtIGN1cnJfcGZuOwotCQlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoY3Vycl9wZm4pLCBQRk5fUEhZUyhzaXplKSk7Ci0JfQotfQotCi0vKgogICogd29ya2Fyb3VuZCBmb3IgRGVsbCBzeXN0ZW1zIHRoYXQgbmVnbGVjdCB0byByZXNlcnZlIEVCREEKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHJlc2VydmVfZWJkYV9yZWdpb24odm9pZCkKQEAgLTExMTgsOCArNDA0LDggQEAKIAkgKiB0aGUgKHZlcnkgdW5saWtlbHkpIGNhc2Ugb2YgdXMgYWNjaWRlbnRhbGx5IGluaXRpYWxpemluZyB0aGUKIAkgKiBib290bWVtIGFsbG9jYXRvciB3aXRoIGFuIGludmFsaWQgUkFNIGFyZWEuCiAJICovCi0JcmVzZXJ2ZV9ib290bWVtKF9fUEhZU0lDQUxfU1RBUlQsIChQRk5fUEhZUyhtaW5fbG93X3BmbikgKwotCQkJIGJvb3RtYXBfc2l6ZSArIFBBR0VfU0laRS0xKSAtIChfX1BIWVNJQ0FMX1NUQVJUKSk7CisJcmVzZXJ2ZV9ib290bWVtKF9fcGFfc3ltYm9sKF90ZXh0KSwgKFBGTl9QSFlTKG1pbl9sb3dfcGZuKSArCisJCQkgYm9vdG1hcF9zaXplICsgUEFHRV9TSVpFLTEpIC0gX19wYV9zeW1ib2woX3RleHQpKTsKIAogCS8qCiAJICogcmVzZXJ2ZSBwaHlzaWNhbCBwYWdlIDAgLSBpdCdzIGEgc3BlY2lhbCBCSU9TIHBhZ2Ugb24gbWFueSBib3hlcywKQEAgLTExNjIsOCArNDQ4LDcgQEAKIAlpZiAoTE9BREVSX1RZUEUgJiYgSU5JVFJEX1NUQVJUKSB7CiAJCWlmIChJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSA8PSAobWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVCkpIHsKIAkJCXJlc2VydmVfYm9vdG1lbShJTklUUkRfU1RBUlQsIElOSVRSRF9TSVpFKTsKLQkJCWluaXRyZF9zdGFydCA9Ci0JCQkJSU5JVFJEX1NUQVJUID8gSU5JVFJEX1NUQVJUICsgUEFHRV9PRkZTRVQgOiAwOworCQkJaW5pdHJkX3N0YXJ0ID0gSU5JVFJEX1NUQVJUICsgUEFHRV9PRkZTRVQ7CiAJCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0K0lOSVRSRF9TSVpFOwogCQl9CiAJCWVsc2UgewpAQCAtMTIwMCwxMjYgKzQ4NSw2IEBACiAJfQogfQogCi0vKgotICogUmVxdWVzdCBhZGRyZXNzIHNwYWNlIGZvciBhbGwgc3RhbmRhcmQgUkFNIGFuZCBST00gcmVzb3VyY2VzCi0gKiBhbmQgYWxzbyBmb3IgcmVnaW9ucyByZXBvcnRlZCBhcyByZXNlcnZlZCBieSB0aGUgZTgyMC4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0Ci1sZWdhY3lfaW5pdF9pb21lbV9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpjb2RlX3Jlc291cmNlLCBzdHJ1Y3QgcmVzb3VyY2UgKmRhdGFfcmVzb3VyY2UpCi17Ci0JaW50IGk7Ci0KLQlwcm9iZV9yb21zKCk7Ci0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXM7Ci0jaWZuZGVmIENPTkZJR19SRVNPVVJDRVNfNjRCSVQKLQkJaWYgKGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplID4gMHgxMDAwMDAwMDBVTEwpCi0JCQljb250aW51ZTsKLSNlbmRpZgotCQlyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLCBHRlBfQVRPTUlDKTsKLQkJc3dpdGNoIChlODIwLm1hcFtpXS50eXBlKSB7Ci0JCWNhc2UgRTgyMF9SQU06CXJlcy0+bmFtZSA9ICJTeXN0ZW0gUkFNIjsgYnJlYWs7Ci0JCWNhc2UgRTgyMF9BQ1BJOglyZXMtPm5hbWUgPSAiQUNQSSBUYWJsZXMiOyBicmVhazsKLQkJY2FzZSBFODIwX05WUzoJcmVzLT5uYW1lID0gIkFDUEkgTm9uLXZvbGF0aWxlIFN0b3JhZ2UiOyBicmVhazsKLQkJZGVmYXVsdDoJcmVzLT5uYW1lID0gInJlc2VydmVkIjsKLQkJfQotCQlyZXMtPnN0YXJ0ID0gZTgyMC5tYXBbaV0uYWRkcjsKLQkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgZTgyMC5tYXBbaV0uc2l6ZSAtIDE7Ci0JCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKLQkJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpKSB7Ci0JCQlrZnJlZShyZXMpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGU4MjAubWFwW2ldLnR5cGUgPT0gRTgyMF9SQU0pIHsKLQkJCS8qCi0JCQkgKiAgV2UgZG9uJ3Qga25vdyB3aGljaCBSQU0gcmVnaW9uIGNvbnRhaW5zIGtlcm5lbCBkYXRhLAotCQkJICogIHNvIHdlIHRyeSBpdCByZXBlYXRlZGx5IGFuZCBsZXQgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkJCSAqICB0ZXN0IGl0LgotCQkJICovCi0JCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgY29kZV9yZXNvdXJjZSk7Ci0JCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgZGF0YV9yZXNvdXJjZSk7Ci0jaWZkZWYgQ09ORklHX0tFWEVDCi0JCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgJmNyYXNoa19yZXMpOwotI2VuZGlmCi0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBSZXF1ZXN0IGFkZHJlc3Mgc3BhY2UgZm9yIGFsbCBzdGFuZGFyZCByZXNvdXJjZXMKLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBwY2liaW9zX2luaXQoKSwgd2hpY2ggaXMgYWxzbyBhCi0gKiBzdWJzeXNfaW5pdGNhbGwsIGJ1dCBpcyBsaW5rZWQgaW4gbGF0ZXIgKGluIGFyY2gvaTM4Ni9wY2kvY29tbW9uLmMpLgotICovCi1zdGF0aWMgaW50IF9faW5pdCByZXF1ZXN0X3N0YW5kYXJkX3Jlc291cmNlcyh2b2lkKQotewotCWludCBpOwotCi0JcHJpbnRrKCJTZXR0aW5nIHVwIHN0YW5kYXJkIFBDSSByZXNvdXJjZXNcbiIpOwotCWlmIChlZmlfZW5hYmxlZCkKLQkJZWZpX2luaXRpYWxpemVfaW9tZW1fcmVzb3VyY2VzKCZjb2RlX3Jlc291cmNlLCAmZGF0YV9yZXNvdXJjZSk7Ci0JZWxzZQotCQlsZWdhY3lfaW5pdF9pb21lbV9yZXNvdXJjZXMoJmNvZGVfcmVzb3VyY2UsICZkYXRhX3Jlc291cmNlKTsKLQotCS8qIEVGSSBzeXN0ZW1zIG1heSBzdGlsbCBoYXZlIFZHQSAqLwotCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmdmlkZW9fcmFtX3Jlc291cmNlKTsKLQotCS8qIHJlcXVlc3QgSS9PIHNwYWNlIGZvciBkZXZpY2VzIHVzZWQgb24gYWxsIGlbMzQ1XTg2IFBDcyAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YW5kYXJkX2lvX3Jlc291cmNlcyk7IGkrKykKLQkJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmc3RhbmRhcmRfaW9fcmVzb3VyY2VzW2ldKTsKLQlyZXR1cm4gMDsKLX0KLQotc3Vic3lzX2luaXRjYWxsKHJlcXVlc3Rfc3RhbmRhcmRfcmVzb3VyY2VzKTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJlZ2lzdGVyX21lbW9yeSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZ2Fwc3RhcnQsIGdhcHNpemUsIHJvdW5kOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0OwotCWludCBpOwotCi0JLyoKLQkgKiBTZWFyY2ggZm9yIHRoZSBiaWdlc3QgZ2FwIGluIHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgZTgyMAotCSAqIG1lbW9yeSBzcGFjZS4KLQkgKi8KLQlsYXN0ID0gMHgxMDAwMDAwMDB1bGw7Ci0JZ2Fwc3RhcnQgPSAweDEwMDAwMDAwOwotCWdhcHNpemUgPSAweDQwMDAwMDsKLQlpID0gZTgyMC5ucl9tYXA7Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IGU4MjAubWFwW2ldLmFkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQgPSBzdGFydCArIGU4MjAubWFwW2ldLnNpemU7Ci0KLQkJLyoKLQkJICogU2luY2UgImxhc3QiIGlzIGF0IG1vc3QgNEdCLCB3ZSBrbm93IHdlJ2xsCi0JCSAqIGZpdCBpbiAzMiBiaXRzIGlmIHRoaXMgY29uZGl0aW9uIGlzIHRydWUKLQkJICovCi0JCWlmIChsYXN0ID4gZW5kKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGdhcCA9IGxhc3QgLSBlbmQ7Ci0KLQkJCWlmIChnYXAgPiBnYXBzaXplKSB7Ci0JCQkJZ2Fwc2l6ZSA9IGdhcDsKLQkJCQlnYXBzdGFydCA9IGVuZDsKLQkJCX0KLQkJfQotCQlpZiAoc3RhcnQgPCBsYXN0KQotCQkJbGFzdCA9IHN0YXJ0OwotCX0KLQotCS8qCi0JICogU2VlIGhvdyBtdWNoIHdlIHdhbnQgdG8gcm91bmQgdXA6IHN0YXJ0IG9mZiB3aXRoCi0JICogcm91bmRpbmcgdG8gdGhlIG5leHQgMU1CIGFyZWEuCi0JICovCi0Jcm91bmQgPSAweDEwMDAwMDsKLQl3aGlsZSAoKGdhcHNpemUgPj4gNCkgPiByb3VuZCkKLQkJcm91bmQgKz0gcm91bmQ7Ci0JLyogRnVuIHdpdGggdHdvJ3MgY29tcGxlbWVudCAqLwotCXBjaV9tZW1fc3RhcnQgPSAoZ2Fwc3RhcnQgKyByb3VuZCkgJiAtcm91bmQ7Ci0KLQlwcmludGsoIkFsbG9jYXRpbmcgUENJIHJlc291cmNlcyBzdGFydGluZyBhdCAlMDhseCAoZ2FwOiAlMDhseDolMDhseClcbiIsCi0JCXBjaV9tZW1fc3RhcnQsIGdhcHN0YXJ0LCBnYXBzaXplKTsKLX0KLQogI2lmZGVmIENPTkZJR19NQ0EKIHN0YXRpYyB2b2lkIHNldF9tY2FfYnVzKGludCB4KQogewpAQCAtMTMyOSw2ICs0OTQsMTIgQEAKIHN0YXRpYyB2b2lkIHNldF9tY2FfYnVzKGludCB4KSB7IH0KICNlbmRpZgogCisvKiBPdmVycmlkZGVuIGluIHBhcmF2aXJ0LmMgaWYgQ09ORklHX1BBUkFWSVJUICovCitjaGFyICogX19hdHRyaWJ1dGVfXygod2VhaykpIG1lbW9yeV9zZXR1cCh2b2lkKQoreworCXJldHVybiBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCgpOworfQorCiAvKgogICogRGV0ZXJtaW5lIGlmIHdlIHdlcmUgbG9hZGVkIGJ5IGFuIEVGSSBsb2FkZXIuICBJZiBzbywgdGhlbiB3ZSBoYXZlIGFsc28gYmVlbgogICogcGFzc2VkIHRoZSBlZmkgbWVtbWFwLCBzeXN0YWIsIGV0Yy4sIHNvIHdlIHNob3VsZCB1c2UgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzCkBAIC0xMzgxLDcgKzU1Miw3IEBACiAJCWVmaV9pbml0KCk7CiAJZWxzZSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOwotCQlwcmludF9tZW1vcnlfbWFwKG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKCkpOworCQlwcmludF9tZW1vcnlfbWFwKG1lbW9yeV9zZXR1cCgpKTsKIAl9CiAKIAljb3B5X2VkZCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNDMwMDJjZi4uNjVkNzYyMCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJCSBYODZfRUZMQUdTX1RGIHwgWDg2X0VGTEFHU19TRiB8IFg4Nl9FRkxBR1NfWkYgfCBcCiAJCQkgWDg2X0VGTEFHU19BRiB8IFg4Nl9FRkxBR1NfUEYgfCBYODZfRUZMQUdTX0NGKQogCi0JR0VUX1NFRyhncyk7CisJQ09QWV9TRUcoZ3MpOwogCUdFVF9TRUcoZnMpOwogCUNPUFlfU0VHKGVzKTsKIAlDT1BZX1NFRyhkcyk7CkBAIC0yNDQsOSArMjQ0LDcgQEAKIHsKIAlpbnQgdG1wLCBlcnIgPSAwOwogCi0JdG1wID0gMDsKLQlzYXZlc2VnbWVudChncywgdG1wKTsKLQllcnIgfD0gX19wdXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5ncyk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+eGdzLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+Z3MpOwogCXNhdmVzZWdtZW50KGZzLCB0bXApOwogCWVyciB8PSBfX3B1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikmc2MtPmZzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMKaW5kZXggMzFlNWM2NS4uNTI4NWFmZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCkBAIC0zMjEsNyArMzIxLDYgQEAKIAogZmFzdGNhbGwgdm9pZCBzbXBfaW52YWxpZGF0ZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwogCXVuc2lnbmVkIGxvbmcgY3B1OwogCiAJY3B1ID0gZ2V0X2NwdSgpOwpAQCAtMzUyLDcgKzM1MSw2IEBACiAJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKIG91dDoKIAlwdXRfY3B1X25vX3Jlc2NoZWQoKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBmbHVzaF90bGJfb3RoZXJzKGNwdW1hc2tfdCBjcHVtYXNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKQEAgLTYwNywxNCArNjA1LDExIEBACiAgKi8KIGZhc3RjYWxsIHZvaWQgc21wX3Jlc2NoZWR1bGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKIAlhY2tfQVBJQ19pcnEoKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiBmYXN0Y2FsbCB2b2lkIHNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CiAJdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSA9IGNhbGxfZGF0YS0+ZnVuYzsKIAl2b2lkICppbmZvID0gY2FsbF9kYXRhLT5pbmZvOwogCWludCB3YWl0ID0gY2FsbF9kYXRhLT53YWl0OwpAQCAtNjM3LDcgKzYzMiw2IEBACiAJCW1iKCk7CiAJCWF0b21pY19pbmMoJmNhbGxfZGF0YS0+ZmluaXNoZWQpOwogCX0KLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiAvKgpAQCAtNjk5LDYgKzY5MywxMCBAQAogCQlwdXRfY3B1KCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQorCisJLyogQ2FuIGRlYWRsb2NrIHdoZW4gY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKKwogCXNwaW5fbG9ja19iaCgmY2FsbF9sb2NrKTsKIAlfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGZ1bmMsIGluZm8sIG5vbmF0b21pYywgd2FpdCk7CiAJc3Bpbl91bmxvY2tfYmgoJmNhbGxfbG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDRiYjhiNzcuLmFlZjM5YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC0zMyw2ICszMywxMSBAQAogICoJCURhdmUgSm9uZXMJOglSZXBvcnQgaW52YWxpZCBjb21iaW5hdGlvbnMgb2YgQXRobG9uIENQVXMuCiAqCQlSdXN0eSBSdXNzZWxsCToJSGFja2VkIGludG8gc2hhcGUgZm9yIG5ldyAiaG90cGx1ZyIgYm9vdCBwcm9jZXNzLiAqLwogCisKKy8qIFNNUCBib290IGFsd2F5cyB3YW50cyB0byB1c2UgcmVhbCB0aW1lIGRlbGF5IHRvIGFsbG93IHN1ZmZpY2llbnQgdGltZSBmb3IKKyAqIHRoZSBBUHMgdG8gY29tZSBvbmxpbmUgKi8KKyNkZWZpbmUgVVNFX1JFQUxfVElNRV9ERUxBWQorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNTIsNiArNTcsOCBAQAogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KICNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL3BkYS5oPgorI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CiAKICNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KICNpbmNsdWRlIDxtYWNoX3dha2VjcHUuaD4KQEAgLTYyLDkgKzY5LDcgQEAKIAogLyogTnVtYmVyIG9mIHNpYmxpbmdzIHBlciBDUFUgcGFja2FnZSAqLwogaW50IHNtcF9udW1fc2libGluZ3MgPSAxOwotI2lmZGVmIENPTkZJR19YODZfSFQKIEVYUE9SVF9TWU1CT0woc21wX251bV9zaWJsaW5ncyk7Ci0jZW5kaWYKIAogLyogTGFzdCBsZXZlbCBjYWNoZSBJRCBvZiBlYWNoIGxvZ2ljYWwgQ1BVICovCiBpbnQgY3B1X2xsY19pZFtOUl9DUFVTXSBfX2NwdWluaXRkYXRhID0ge1swIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRH07CkBAIC01MzYsMTEgKzU0MSwxMSBAQAogc3RhdGljIHZvaWQgX19kZXZpbml0IHN0YXJ0X3NlY29uZGFyeSh2b2lkICp1bnVzZWQpCiB7CiAJLyoKLQkgKiBEb250IHB1dCBhbnl0aGluZyBiZWZvcmUgc21wX2NhbGxpbigpLCBTTVAKKwkgKiBEb24ndCBwdXQgKmFueXRoaW5nKiBiZWZvcmUgc2Vjb25kYXJ5X2NwdV9pbml0KCksIFNNUAogCSAqIGJvb3RpbmcgaXMgdG9vIGZyYWdpbGUgdGhhdCB3ZSB3YW50IHRvIGxpbWl0IHRoZQogCSAqIHRoaW5ncyBkb25lIGhlcmUgdG8gdGhlIG1vc3QgbmVjZXNzYXJ5IHRoaW5ncy4KIAkgKi8KLQljcHVfaW5pdCgpOworCXNlY29uZGFyeV9jcHVfaW5pdCgpOwogCXByZWVtcHRfZGlzYWJsZSgpOwogCXNtcF9jYWxsaW4oKTsKIAl3aGlsZSAoIWNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHNtcF9jb21tZW5jZWRfbWFzaykpCkBAIC01OTksMTMgKzYwNCwxNiBAQAogCQkibW92bCAlMCwlJWVzcFxuXHQiCiAJCSJqbXAgKiUxIgogCQk6Ci0JCToiciIgKGN1cnJlbnQtPnRocmVhZC5lc3ApLCJyIiAoY3VycmVudC0+dGhyZWFkLmVpcCkpOworCQk6Im0iIChjdXJyZW50LT50aHJlYWQuZXNwKSwibSIgKGN1cnJlbnQtPnRocmVhZC5laXApKTsKIH0KIAorLyogU3RhdGljIHN0YXRlIGluIGhlYWQuUyB1c2VkIHRvIHNldCB1cCBhIENQVSAqLwogZXh0ZXJuIHN0cnVjdCB7CiAJdm9pZCAqIGVzcDsKIAl1bnNpZ25lZCBzaG9ydCBzczsKIH0gc3RhY2tfc3RhcnQ7CitleHRlcm4gc3RydWN0IGkzODZfcGRhICpzdGFydF9wZGE7CitleHRlcm4gc3RydWN0IFhndF9kZXNjX3N0cnVjdCBjcHVfZ2R0X2Rlc2NyOwogCiAjaWZkZWYgQ09ORklHX05VTUEKIApAQCAtOTM2LDkgKzk0NCw2IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydF9laXA7CiAJdW5zaWduZWQgc2hvcnQgbm1pX2hpZ2ggPSAwLCBubWlfbG93ID0gMDsKIAotCSsrY3B1Y291bnQ7Ci0JYWx0ZXJuYXRpdmVzX3NtcF9zd2l0Y2goMSk7Ci0KIAkvKgogCSAqIFdlIGNhbid0IHVzZSBrZXJuZWxfdGhyZWFkIHNpbmNlIHdlIG11c3QgYXZvaWQgdG8KIAkgKiByZXNjaGVkdWxlIHRoZSBjaGlsZC4KQEAgLTk0NiwxNSArOTUxLDMwIEBACiAJaWRsZSA9IGFsbG9jX2lkbGVfdGFzayhjcHUpOwogCWlmIChJU19FUlIoaWRsZSkpCiAJCXBhbmljKCJmYWlsZWQgZm9yayBmb3IgQ1BVICVkIiwgY3B1KTsKKworCS8qIFByZS1hbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgQ1BVJ3MgR0RUIGFuZCBQREEgc28gaXQKKwkgICBkb2Vzbid0IGhhdmUgdG8gZG8gYW55IG1lbW9yeSBhbGxvY2F0aW9uIGR1cmluZyB0aGUKKwkgICBkZWxpY2F0ZSBDUFUtYnJpbmd1cCBwaGFzZS4gKi8KKwlpZiAoIWluaXRfZ2R0KGNwdSwgaWRsZSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ291bGRuJ3QgYWxsb2NhdGUgR0RUL1BEQSBmb3IgQ1BVICVkXG4iLCBjcHUpOworCQlyZXR1cm4gLTE7CS8qID8gKi8KKwl9CisKIAlpZGxlLT50aHJlYWQuZWlwID0gKHVuc2lnbmVkIGxvbmcpIHN0YXJ0X3NlY29uZGFyeTsKIAkvKiBzdGFydF9laXAgaGFkIGJldHRlciBiZSBwYWdlLWFsaWduZWQhICovCiAJc3RhcnRfZWlwID0gc2V0dXBfdHJhbXBvbGluZSgpOwogCisJKytjcHVjb3VudDsKKwlhbHRlcm5hdGl2ZXNfc21wX3N3aXRjaCgxKTsKKwogCS8qIFNvIHdlIHNlZSB3aGF0J3MgdXAgICAqLwogCXByaW50aygiQm9vdGluZyBwcm9jZXNzb3IgJWQvJWQgZWlwICVseFxuIiwgY3B1LCBhcGljaWQsIHN0YXJ0X2VpcCk7CiAJLyogU3RhY2sgZm9yIHN0YXJ0dXBfMzIgY2FuIGJlIGp1c3QgYXMgZm9yIHN0YXJ0X3NlY29uZGFyeSBvbndhcmRzICovCiAJc3RhY2tfc3RhcnQuZXNwID0gKHZvaWQgKikgaWRsZS0+dGhyZWFkLmVzcDsKIAorCXN0YXJ0X3BkYSA9IGNwdV9wZGEoY3B1KTsKKwljcHVfZ2R0X2Rlc2NyID0gcGVyX2NwdShjcHVfZ2R0X2Rlc2NyLCBjcHUpOworCiAJaXJxX2N0eF9pbml0KGNwdSk7CiAKIAl4ODZfY3B1X3RvX2FwaWNpZFtjcHVdID0gYXBpY2lkOwpAQCAtMTA0OSwxMyArMTA2OSwxNSBAQAogCiBzdHJ1Y3Qgd2FybV9ib290X2NwdV9pbmZvIHsKIAlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGU7CisJc3RydWN0IHdvcmtfc3RydWN0IHRhc2s7CiAJaW50IGFwaWNpZDsKIAlpbnQgY3B1OwogfTsKIAotc3RhdGljIHZvaWQgX19jcHVpbml0IGRvX3dhcm1fYm9vdF9jcHUodm9pZCAqcCkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkb193YXJtX2Jvb3RfY3B1KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgd2FybV9ib290X2NwdV9pbmZvICppbmZvID0gcDsKKwlzdHJ1Y3Qgd2FybV9ib290X2NwdV9pbmZvICppbmZvID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3YXJtX2Jvb3RfY3B1X2luZm8sIHRhc2spOwogCWRvX2Jvb3RfY3B1KGluZm8tPmFwaWNpZCwgaW5mby0+Y3B1KTsKIAljb21wbGV0ZShpbmZvLT5jb21wbGV0ZSk7CiB9CkBAIC0xMDY0LDcgKzEwODYsNiBAQAogewogCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGRvbmUpOwogCXN0cnVjdCB3YXJtX2Jvb3RfY3B1X2luZm8gaW5mbzsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFzazsKIAlpbnQJYXBpY2lkLCByZXQ7CiAJc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqY3B1X2dkdF9kZXNjciA9ICZwZXJfY3B1KGNwdV9nZHRfZGVzY3IsIGNwdSk7CiAKQEAgLTEwODksMTUgKzExMTAsMTUgQEAKIAlpbmZvLmNvbXBsZXRlID0gJmRvbmU7CiAJaW5mby5hcGljaWQgPSBhcGljaWQ7CiAJaW5mby5jcHUgPSBjcHU7Ci0JSU5JVF9XT1JLKCZ0YXNrLCBkb193YXJtX2Jvb3RfY3B1LCAmaW5mbyk7CisJSU5JVF9XT1JLKCZpbmZvLnRhc2ssIGRvX3dhcm1fYm9vdF9jcHUpOwogCiAJdHNjX3N5bmNfZGlzYWJsZWQgPSAxOwogCiAJLyogaW5pdCBsb3cgbWVtIG1hcHBpbmcgKi8KIAljbG9uZV9wZ2RfcmFuZ2Uoc3dhcHBlcl9wZ19kaXIsIHN3YXBwZXJfcGdfZGlyICsgVVNFUl9QR0RfUFRSUywKLQkJCUtFUk5FTF9QR0RfUFRSUyk7CisJCQltaW5fdCh1bnNpZ25lZCBsb25nLCBLRVJORUxfUEdEX1BUUlMsIFVTRVJfUEdEX1BUUlMpKTsKIAlmbHVzaF90bGJfYWxsKCk7Ci0Jc2NoZWR1bGVfd29yaygmdGFzayk7CisJc2NoZWR1bGVfd29yaygmaW5mby50YXNrKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKIAogCXRzY19zeW5jX2Rpc2FibGVkID0gMDsKQEAgLTExMDgsMzQgKzExMjksMTUgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBzbXBfdHVuZV9zY2hlZHVsaW5nICh2b2lkKQorc3RhdGljIHZvaWQgc21wX3R1bmVfc2NoZWR1bGluZyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgY2FjaGVzaXplOyAgICAgICAvKiBrQiAgICovCi0JdW5zaWduZWQgbG9uZyBiYW5kd2lkdGggPSAzNTA7IC8qIE1CL3MgKi8KLQkvKgotCSAqIFJvdWdoIGVzdGltYXRpb24gZm9yIFNNUCBzY2hlZHVsaW5nLCB0aGlzIGlzIHRoZSBudW1iZXIgb2YKLQkgKiBjeWNsZXMgaXQgdGFrZXMgZm9yIGEgZnVsbHkgbWVtb3J5LWxpbWl0ZWQgcHJvY2VzcyB0byBmbHVzaAotCSAqIHRoZSBTTVAtbG9jYWwgY2FjaGUuCi0JICoKLQkgKiAoRm9yIGEgUDUgdGhpcyBwcmV0dHkgbXVjaCBtZWFucyB3ZSB3aWxsIGNob29zZSBhbm90aGVyIGlkbGUKLQkgKiAgQ1BVIGFsbW9zdCBhbHdheXMgYXQgd2FrZXVwIHRpbWUgKHRoaXMgaXMgZHVlIHRvIHRoZSBzbWFsbAotCSAqICBMMSBjYWNoZSksIG9uIFBJSXMgaXQncyBhcm91bmQgNTAtMTAwIHVzZWNzLCBkZXBlbmRpbmcgb24KLQkgKiAgdGhlIGNhY2hlIHNpemUpCi0JICovCiAKLQlpZiAoIWNwdV9raHopIHsKLQkJLyoKLQkJICogdGhpcyBiYXNpY2FsbHkgZGlzYWJsZXMgcHJvY2Vzc29yLWFmZmluaXR5Ci0JCSAqIHNjaGVkdWxpbmcgb24gU01QIHdpdGhvdXQgYSBUU0MuCi0JCSAqLwotCQlyZXR1cm47Ci0JfSBlbHNlIHsKKwlpZiAoY3B1X2toeikgewogCQljYWNoZXNpemUgPSBib290X2NwdV9kYXRhLng4Nl9jYWNoZV9zaXplOwotCQlpZiAoY2FjaGVzaXplID09IC0xKSB7Ci0JCQljYWNoZXNpemUgPSAxNjsgLyogUGVudGl1bXMsIDJ4OGtCIGNhY2hlICovCi0JCQliYW5kd2lkdGggPSAxMDA7Ci0JCX0KLQkJbWF4X2NhY2hlX3NpemUgPSBjYWNoZXNpemUgKiAxMDI0OworCisJCWlmIChjYWNoZXNpemUgPiAwKQorCQkJbWF4X2NhY2hlX3NpemUgPSBjYWNoZXNpemUgKiAxMDI0OwogCX0KIH0KIApAQCAtMTQ2MSw2ICsxNDYzLDEyIEBACiAJY3B1X3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7CiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCiAJCWNwdV9yZWxheCgpOworCisjaWZkZWYgQ09ORklHX1g4Nl9HRU5FUklDQVJDSAorCWlmIChudW1fb25saW5lX2NwdXMoKSA+IDggJiYgZ2VuYXBpYyA9PSAmYXBpY19kZWZhdWx0KQorCQlwYW5pYygiRGVmYXVsdCBmbGF0IEFQSUMgcm91dGluZyBjYW4ndCBiZSB1c2VkIHdpdGggPiA4IGNwdXNcbiIpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jCmluZGV4IDcxM2JhMzkuLjdkZTkxMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYworKysgYi9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMKQEAgLTI3LDcgKzI3LDExIEBACiAgKiBTaG91bGQgdGhlIGtlcm5lbCBtYXAgYSBWRFNPIHBhZ2UgaW50byBwcm9jZXNzZXMgYW5kIHBhc3MgaXRzCiAgKiBhZGRyZXNzIGRvd24gdG8gZ2xpYmMgdXBvbiBleGVjKCk/CiAgKi8KKyNpZmRlZiBDT05GSUdfUEFSQVZJUlQKK3Vuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IHZkc29fZW5hYmxlZCA9IDA7CisjZWxzZQogdW5zaWduZWQgaW50IF9fcmVhZF9tb3N0bHkgdmRzb19lbmFibGVkID0gMTsKKyNlbmRpZgogCiBFWFBPUlRfU1lNQk9MX0dQTCh2ZHNvX2VuYWJsZWQpOwogCkBAIC0xMzIsNyArMTM2LDcgQEAKIAkJZ290byB1cF9mYWlsOwogCX0KIAotCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJdm1hID0ga21lbV9jYWNoZV96YWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghdm1hKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gdXBfZmFpbDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKaW5kZXggNzhhZjU3Mi4uYzUwNWIxNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgogCiAjaW5jbHVkZSAibWFjaF90aW1lLmgiCiAKQEAgLTExNiwxMCArMTE3LDcgQEAKIAkvKiBnZXRzIHJlY2FsbGVkIHdpdGggaXJxIGxvY2FsbHkgZGlzYWJsZWQgKi8KIAkvKiBYWFggLSBkb2VzIGlycXNhdmUgcmVzb2x2ZSB0aGlzPyAtam9obnN0dWwgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKLQlpZiAoZWZpX2VuYWJsZWQpCi0JCXJldHZhbCA9IGVmaV9zZXRfcnRjX21tc3Mobm93dGltZSk7Ci0JZWxzZQotCQlyZXR2YWwgPSBtYWNoX3NldF9ydGNfbW1zcyhub3d0aW1lKTsKKwlyZXR2YWwgPSBzZXRfd2FsbGNsb2NrKG5vd3RpbWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMjIzLDEwICsyMjEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAKLQlpZiAoZWZpX2VuYWJsZWQpCi0JCXJldHZhbCA9IGVmaV9nZXRfdGltZSgpOwotCWVsc2UKLQkJcmV0dmFsID0gbWFjaF9nZXRfY21vc190aW1lKCk7CisJcmV0dmFsID0gZ2V0X3dhbGxjbG9jaygpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKIApAQCAtMzcwLDcgKzM2NSw3IEBACiAJCXByaW50aygiVXNpbmcgSFBFVCBmb3IgYmFzZS10aW1lclxuIik7CiAJfQogCi0JdGltZV9pbml0X2hvb2soKTsKKwlkb190aW1lX2luaXQoKTsKIH0KICNlbmRpZgogCkBAIC0zOTIsNSArMzg3LDUgQEAKIAogCWRvX3NldHRpbWVvZmRheSgmdHMpOwogCi0JdGltZV9pbml0X2hvb2soKTsKKwlkb190aW1lX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jCmluZGV4IDFhMmE5NzkuLjFlNDcwMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYwpAQCAtMTMyLDE0ICsxMzIsMjAgQEAKIAkgKiB0aGUgc2luZ2xlIEhQRVQgdGltZXIgZm9yIHN5c3RlbSB0aW1lLgogCSAqLwogI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCi0JaWYgKCEoaWQgJiBIUEVUX0lEX05VTUJFUikpCisJaWYgKCEoaWQgJiBIUEVUX0lEX05VTUJFUikpIHsKKwkJaW91bm1hcChocGV0X3ZpcnRfYWRkcmVzcyk7CisJCWhwZXRfdmlydF9hZGRyZXNzID0gTlVMTDsKIAkJcmV0dXJuIC0xOworCX0KICNlbmRpZgogCiAKIAlocGV0X3BlcmlvZCA9IGhwZXRfcmVhZGwoSFBFVF9QRVJJT0QpOwotCWlmICgoaHBldF9wZXJpb2QgPCBIUEVUX01JTl9QRVJJT0QpIHx8IChocGV0X3BlcmlvZCA+IEhQRVRfTUFYX1BFUklPRCkpCisJaWYgKChocGV0X3BlcmlvZCA8IEhQRVRfTUlOX1BFUklPRCkgfHwgKGhwZXRfcGVyaW9kID4gSFBFVF9NQVhfUEVSSU9EKSkgeworCQlpb3VubWFwKGhwZXRfdmlydF9hZGRyZXNzKTsKKwkJaHBldF92aXJ0X2FkZHJlc3MgPSBOVUxMOwogCQlyZXR1cm4gLTE7CisJfQogCiAJLyoKIAkgKiA2NCBiaXQgbWF0aApAQCAtMTU2LDggKzE2MiwxMSBAQAogCiAJaHBldF91c2VfdGltZXIgPSBpZCAmIEhQRVRfSURfTEVHU1VQOwogCi0JaWYgKGhwZXRfdGltZXJfc3RvcF9zZXRfZ28oaHBldF90aWNrKSkKKwlpZiAoaHBldF90aW1lcl9zdG9wX3NldF9nbyhocGV0X3RpY2spKSB7CisJCWlvdW5tYXAoaHBldF92aXJ0X2FkZHJlc3MpOworCQlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7CiAJCXJldHVybiAtMTsKKwl9CiAKIAl1c2VfaHBldCA9IDE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCAwN2Q2ZGEzLi43OWNmNjA4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90b3BvbG9neS5jCkBAIC00MCwxNCArNDAsMTggQEAKIAkgKiByZXN0cmljdGlvbnMgYW5kIGFzc3VtcHRpb25zIGluIGtlcm5lbC4gVGhpcyBiYXNpY2FsbHkKIAkgKiBkb2VzbnQgYWRkIGEgY29udHJvbCBmaWxlLCBvbmUgY2Fubm90IGF0dGVtcHQgdG8gb2ZmbGluZQogCSAqIEJTUC4KKwkgKgorCSAqIEFsc28gY2VydGFpbiBQQ0kgcXVpcmtzIHJlcXVpcmUgbm90IHRvIGVuYWJsZSBob3RwbHVnIGNvbnRyb2wKKwkgKiBmb3IgYWxsIENQVSdzLgogCSAqLwotCWlmICghbnVtKQotCQljcHVfZGV2aWNlc1tudW1dLmNwdS5ub19jb250cm9sID0gMTsKKwlpZiAobnVtICYmIGVuYWJsZV9jcHVfaG90cGx1ZykKKwkJY3B1X2RldmljZXNbbnVtXS5jcHUuaG90cGx1Z2dhYmxlID0gMTsKIAogCXJldHVybiByZWdpc3Rlcl9jcHUoJmNwdV9kZXZpY2VzW251bV0uY3B1LCBudW0pOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitpbnQgZW5hYmxlX2NwdV9ob3RwbHVnID0gMTsKIAogdm9pZCBhcmNoX3VucmVnaXN0ZXJfY3B1KGludCBudW0pIHsKIAlyZXR1cm4gdW5yZWdpc3Rlcl9jcHUoJmNwdV9kZXZpY2VzW251bV0uY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCAwMDQ4OWI3Li4yYjMwZGJmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCkBAIC0yOSw2ICsyOSw4IEBACiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAKICNpZmRlZiBDT05GSUdfRUlTQQogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtNjEsOSArNjMsNiBAQAogCiBhc21saW5rYWdlIGludCBzeXN0ZW1fY2FsbCh2b2lkKTsKIAotc3RydWN0IGRlc2Nfc3RydWN0IGRlZmF1bHRfbGR0W10gPSB7IHsgMCwgMCB9LCB7IDAsIDAgfSwgeyAwLCAwIH0sCi0JCXsgMCwgMCB9LCB7IDAsIDAgfSB9OwotCiAvKiBEbyB3ZSBpZ25vcmUgRlBVIGludGVycnVwdHMgPyAqLwogY2hhciBpZ25vcmVfZnB1X2lycSA9IDA7CiAKQEAgLTk0LDcgKzkzLDcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBzcHVyaW91c19pbnRlcnJ1cHRfYnVnKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIG1hY2hpbmVfY2hlY2sodm9pZCk7CiAKLXN0YXRpYyBpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMjQ7CitpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMjQ7CiAjaWZkZWYgQ09ORklHX1NUQUNLX1VOV0lORAogc3RhdGljIGludCBjYWxsX3RyYWNlID0gMTsKICNlbHNlCkBAIC0xMjksMTUgKzEyOCwxOSBAQAogCiAjaWZkZWYJQ09ORklHX0ZSQU1FX1BPSU5URVIKIAl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCAodm9pZCAqKWVicCkpIHsKKwkJdW5zaWduZWQgbG9uZyBuZXdfZWJwOwogCQlhZGRyID0gKih1bnNpZ25lZCBsb25nICopKGVicCArIDQpOwogCQlvcHMtPmFkZHJlc3MoZGF0YSwgYWRkcik7CiAJCS8qCiAJCSAqIGJyZWFrIG91dCBvZiByZWN1cnNpdmUgZW50cmllcyAoc3VjaCBhcwotCQkgKiBlbmRfb2Zfc3RhY2tfc3RvcF91bndpbmRfZnVuY3Rpb24pOgorCQkgKiBlbmRfb2Zfc3RhY2tfc3RvcF91bndpbmRfZnVuY3Rpb24pLiBBbHNvLAorCQkgKiB3ZSBjYW4gbmV2ZXIgYWxsb3cgYSBmcmFtZSBwb2ludGVyIHRvCisJCSAqIG1vdmUgZG93bndhcmRzIQogCSAJICovCi0JCWlmIChlYnAgPT0gKih1bnNpZ25lZCBsb25nICopZWJwKQorCSAJbmV3X2VicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKKwkJaWYgKG5ld19lYnAgPD0gZWJwKQogCQkJYnJlYWs7Ci0JCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKKwkJZWJwID0gbmV3X2VicDsKIAl9CiAjZWxzZQogCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSkgewpAQCAtMTU5LDE2ICsxNjIsMjUgQEAKIHsKIAlzdHJ1Y3Qgb3BzX2FuZF9kYXRhICpvYWQgPSAoc3RydWN0IG9wc19hbmRfZGF0YSAqKWRhdGE7CiAJaW50IG4gPSAwOworCXVuc2lnbmVkIGxvbmcgc3AgPSBVTldfU1AoaW5mbyk7CiAKKwlpZiAoYXJjaF91bndfdXNlcl9tb2RlKGluZm8pKQorCQlyZXR1cm4gLTE7CiAJd2hpbGUgKHVud2luZChpbmZvKSA9PSAwICYmIFVOV19QQyhpbmZvKSkgewogCQluKys7CiAJCW9hZC0+b3BzLT5hZGRyZXNzKG9hZC0+ZGF0YSwgVU5XX1BDKGluZm8pKTsKIAkJaWYgKGFyY2hfdW53X3VzZXJfbW9kZShpbmZvKSkKIAkJCWJyZWFrOworCQlpZiAoKHNwICYgfihQQUdFX1NJWkUgLSAxKSkgPT0gKFVOV19TUChpbmZvKSAmIH4oUEFHRV9TSVpFIC0gMSkpCisJCSAgICAmJiBzcCA+IFVOV19TUChpbmZvKSkKKwkJCWJyZWFrOworCQlzcCA9IFVOV19TUChpbmZvKTsKIAl9CiAJcmV0dXJuIG47CiB9CiAKKyNkZWZpbmUgTVNHKG1zZykgb3BzLT53YXJuaW5nKGRhdGEsIG1zZykKKwogdm9pZCBkdW1wX3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJICAgICAgICB1bnNpZ25lZCBsb25nICpzdGFjaywKIAkJc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCkBAIC0xODcsMjkgKzE5OSwzMSBAQAogCQkJaWYgKHVud2luZF9pbml0X2ZyYW1lX2luZm8oJmluZm8sIHRhc2ssIHJlZ3MpID09IDApCiAJCQkJdW53X3JldCA9IGR1bXBfdHJhY2VfdW53aW5kKCZpbmZvLCAmb2FkKTsKIAkJfSBlbHNlIGlmICh0YXNrID09IGN1cnJlbnQpCi0JCQl1bndfcmV0ID0gdW53aW5kX2luaXRfcnVubmluZygmaW5mbywgZHVtcF90cmFjZV91bndpbmQsICZvYWQpOworCQkJdW53X3JldCA9IHVud2luZF9pbml0X3J1bm5pbmcoJmluZm8sIGR1bXBfdHJhY2VfdW53aW5kLAorCQkJCQkJICAgICAgJm9hZCk7CiAJCWVsc2UgewogCQkJaWYgKHVud2luZF9pbml0X2Jsb2NrZWQoJmluZm8sIHRhc2spID09IDApCiAJCQkJdW53X3JldCA9IGR1bXBfdHJhY2VfdW53aW5kKCZpbmZvLCAmb2FkKTsKIAkJfQogCQlpZiAodW53X3JldCA+IDApIHsKIAkJCWlmIChjYWxsX3RyYWNlID09IDEgJiYgIWFyY2hfdW53X3VzZXJfbW9kZSgmaW5mbykpIHsKLQkJCQlvcHMtPndhcm5pbmdfc3ltYm9sKGRhdGEsICJEV0FSRjIgdW53aW5kZXIgc3R1Y2sgYXQgJXNcbiIsCisJCQkJb3BzLT53YXJuaW5nX3N5bWJvbChkYXRhLAorCQkJCQkgICAgICJEV0FSRjIgdW53aW5kZXIgc3R1Y2sgYXQgJXMiLAogCQkJCQkgICAgIFVOV19QQygmaW5mbykpOwogCQkJCWlmIChVTldfU1AoJmluZm8pID49IFBBR0VfT0ZGU0VUKSB7Ci0JCQkJCW9wcy0+d2FybmluZyhkYXRhLCAiTGVmdG92ZXIgaW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwkJCQkJTVNHKCJMZWZ0b3ZlciBpbmV4YWN0IGJhY2t0cmFjZToiKTsKIAkJCQkJc3RhY2sgPSAodm9pZCAqKVVOV19TUCgmaW5mbyk7CiAJCQkJCWlmICghc3RhY2spCiAJCQkJCQlyZXR1cm47CiAJCQkJCWVicCA9IFVOV19GUCgmaW5mbyk7CiAJCQkJfSBlbHNlCi0JCQkJCW9wcy0+d2FybmluZyhkYXRhLCAiRnVsbCBpbmV4YWN0IGJhY2t0cmFjZSBhZ2FpbjpcbiIpOworCQkJCQlNU0coIkZ1bGwgaW5leGFjdCBiYWNrdHJhY2UgYWdhaW46Iik7CiAJCQl9IGVsc2UgaWYgKGNhbGxfdHJhY2UgPj0gMSkKIAkJCQlyZXR1cm47CiAJCQllbHNlCi0JCQkJb3BzLT53YXJuaW5nKGRhdGEsICJGdWxsIGluZXhhY3QgYmFja3RyYWNlIGFnYWluOlxuIik7CisJCQkJTVNHKCJGdWxsIGluZXhhY3QgYmFja3RyYWNlIGFnYWluOiIpOwogCQl9IGVsc2UKLQkJCW9wcy0+d2FybmluZyhkYXRhLCAiSW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwkJCU1TRygiSW5leGFjdCBiYWNrdHJhY2U6Iik7CiAJfQogCWlmICghc3RhY2spIHsKIAkJdW5zaWduZWQgbG9uZyBkdW1teTsKQEAgLTI0Myw2ICsyNTcsNyBAQAogCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nKiljb250ZXh0LT5wcmV2aW91c19lc3A7CiAJCWlmICghc3RhY2spCiAJCQlicmVhazsKKwkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJfQogfQogRVhQT1JUX1NZTUJPTChkdW1wX3RyYWNlKTsKQEAgLTM3NSw3ICszOTAsNyBAQAogCSAqIHRpbWUgb2YgdGhlIGZhdWx0Li4KIAkgKi8KIAlpZiAoaW5fa2VybmVsKSB7Ci0JCXU4IF9fdXNlciAqZWlwOworCQl1OCAqZWlwOwogCQlpbnQgY29kZV9ieXRlcyA9IDY0OwogCQl1bnNpZ25lZCBjaGFyIGM7CiAKQEAgLTM4NCwxOCArMzk5LDIwIEBACiAKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIkNvZGU6ICIpOwogCi0JCWVpcCA9ICh1OCBfX3VzZXIgKilyZWdzLT5laXAgLSA0MzsKLQkJaWYgKGVpcCA8ICh1OCBfX3VzZXIgKilQQUdFX09GRlNFVCB8fCBfX2dldF91c2VyKGMsIGVpcCkpIHsKKwkJZWlwID0gKHU4ICopcmVncy0+ZWlwIC0gNDM7CisJCWlmIChlaXAgPCAodTggKilQQUdFX09GRlNFVCB8fAorCQkJcHJvYmVfa2VybmVsX2FkZHJlc3MoZWlwLCBjKSkgewogCQkJLyogdHJ5IHN0YXJ0aW5nIGF0IEVJUCAqLwotCQkJZWlwID0gKHU4IF9fdXNlciAqKXJlZ3MtPmVpcDsKKwkJCWVpcCA9ICh1OCAqKXJlZ3MtPmVpcDsKIAkJCWNvZGVfYnl0ZXMgPSAzMjsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgY29kZV9ieXRlczsgaSsrLCBlaXArKykgewotCQkJaWYgKGVpcCA8ICh1OCBfX3VzZXIgKilQQUdFX09GRlNFVCB8fCBfX2dldF91c2VyKGMsIGVpcCkpIHsKKwkJCWlmIChlaXAgPCAodTggKilQQUdFX09GRlNFVCB8fAorCQkJCXByb2JlX2tlcm5lbF9hZGRyZXNzKGVpcCwgYykpIHsKIAkJCQlwcmludGsoIiBCYWQgRUlQIHZhbHVlLiIpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKGVpcCA9PSAodTggX191c2VyICopcmVncy0+ZWlwKQorCQkJaWYgKGVpcCA9PSAodTggKilyZWdzLT5laXApCiAJCQkJcHJpbnRrKCI8JTAyeD4gIiwgYyk7CiAJCQllbHNlCiAJCQkJcHJpbnRrKCIlMDJ4ICIsIGMpOwpAQCAtNDA0LDQzICs0MjEsMjIgQEAKIAlwcmludGsoIlxuIik7CiB9CQogCi1zdGF0aWMgdm9pZCBoYW5kbGVfQlVHKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IGlzX3ZhbGlkX2J1Z2FkZHIodW5zaWduZWQgbG9uZyBlaXApCiB7Ci0JdW5zaWduZWQgbG9uZyBlaXAgPSByZWdzLT5laXA7CiAJdW5zaWduZWQgc2hvcnQgdWQyOwogCiAJaWYgKGVpcCA8IFBBR0VfT0ZGU0VUKQotCQlyZXR1cm47Ci0JaWYgKHByb2JlX2tlcm5lbF9hZGRyZXNzKCh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKillaXAsIHVkMikpCi0JCXJldHVybjsKLQlpZiAodWQyICE9IDB4MGIwZikKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKKwlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIHNob3J0ICopZWlwLCB1ZDIpKQorCQlyZXR1cm4gMDsKIAotCXByaW50ayhLRVJOX0VNRVJHICItLS0tLS0tLS0tLS1bIGN1dCBoZXJlIF0tLS0tLS0tLS0tLS1cbiIpOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKLQlkbyB7Ci0JCXVuc2lnbmVkIHNob3J0IGxpbmU7Ci0JCWNoYXIgKmZpbGU7Ci0JCWNoYXIgYzsKLQotCQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKShlaXAgKyAyKSwKLQkJCQkJbGluZSkpCi0JCQlicmVhazsKLQkJaWYgKF9fZ2V0X3VzZXIoZmlsZSwgKGNoYXIgKiBfX3VzZXIgKikoZWlwICsgNCkpIHx8Ci0JCSAgICAodW5zaWduZWQgbG9uZylmaWxlIDwgUEFHRV9PRkZTRVQgfHwgX19nZXRfdXNlcihjLCBmaWxlKSkKLQkJCWZpbGUgPSAiPGJhZCBmaWxlbmFtZT4iOwotCi0JCXByaW50ayhLRVJOX0VNRVJHICJrZXJuZWwgQlVHIGF0ICVzOiVkIVxuIiwgZmlsZSwgbGluZSk7Ci0JCXJldHVybjsKLQl9IHdoaWxlICgwKTsKLSNlbmRpZgotCXByaW50ayhLRVJOX0VNRVJHICJLZXJuZWwgQlVHIGF0IFt2ZXJib3NlIGRlYnVnIGluZm8gdW5hdmFpbGFibGVdXG4iKTsKKwlyZXR1cm4gdWQyID09IDB4MGIwZjsKIH0KIAotLyogVGhpcyBpcyBnb25lIHRocm91Z2ggd2hlbiBzb21ldGhpbmcgaW4gdGhlIGtlcm5lbAotICogaGFzIGRvbmUgc29tZXRoaW5nIGJhZCBhbmQgaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZC4KLSovCisvKgorICogVGhpcyBpcyBnb25lIHRocm91Z2ggd2hlbiBzb21ldGhpbmcgaW4gdGhlIGtlcm5lbCBoYXMgZG9uZSBzb21ldGhpbmcgYmFkIGFuZAorICogaXMgYWJvdXQgdG8gYmUgdGVybWluYXRlZC4KKyAqLwogdm9pZCBkaWUoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycikKIHsKIAlzdGF0aWMgc3RydWN0IHsKQEAgLTQ0OCw3ICs0NDQsNyBAQAogCQl1MzIgbG9ja19vd25lcjsKIAkJaW50IGxvY2tfb3duZXJfZGVwdGg7CiAJfSBkaWUgPSB7Ci0JCS5sb2NrID0JCQlTUElOX0xPQ0tfVU5MT0NLRUQsCisJCS5sb2NrID0JCQlfX1NQSU5fTE9DS19VTkxPQ0tFRChkaWUubG9jayksCiAJCS5sb2NrX293bmVyID0JCS0xLAogCQkubG9ja19vd25lcl9kZXB0aCA9CTAKIAl9OwpAQCAtNDcyLDcgKzQ2OCw4IEBACiAJCXVuc2lnbmVkIGxvbmcgZXNwOwogCQl1bnNpZ25lZCBzaG9ydCBzczsKIAotCQloYW5kbGVfQlVHKHJlZ3MpOworCQlyZXBvcnRfYnVnKHJlZ3MtPmVpcCk7CisKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOwogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAJCXByaW50ayhLRVJOX0VNRVJHICJQUkVFTVBUICIpOwpAQCAtNzAzLDggKzcwMCw3IEBACiB7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnggb24gIgogCQkiQ1BVICVkLlxuIiwgcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXByaW50ayhLRVJOX0VNRVJHICJZb3UgcHJvYmFibHkgaGF2ZSBhIGhhcmR3YXJlIHByb2JsZW0gd2l0aCB5b3VyIFJBTSAiCi0JCQkiY2hpcHNcbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJZb3UgaGF2ZSBzb21lIGhhcmR3YXJlIHByb2JsZW0sIGxpa2VseSBvbiB0aGUgUENJIGJ1cy5cbiIpOwogCWlmIChwYW5pY19vbl91bnJlY292ZXJlZF9ubWkpCiAgICAgICAgICAgICAgICAgcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKIApAQCAtNzY5LDcgKzc2NSw2IEBACiAJcHJpbnRrKCIgb24gQ1BVJWQsIGVpcCAlMDhseCwgcmVnaXN0ZXJzOlxuIiwKIAkJc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWdzLT5laXApOwogCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwotCXByaW50ayhLRVJOX0VNRVJHICJjb25zb2xlIHNodXRzIHVwIC4uLlxuIik7CiAJY29uc29sZV9zaWxlbnQoKTsKIAlzcGluX3VubG9jaygmbm1pX3ByaW50X2xvY2spOwogCWJ1c3Rfc3BpbmxvY2tzKDApOwpAQCAtMTA4NCw0OSArMTA3OSwyNCBAQAogI2VuZGlmCiB9CiAKLWZhc3RjYWxsIHZvaWQgc2V0dXBfeDg2X2JvZ3VzX3N0YWNrKHVuc2lnbmVkIGNoYXIgKiBzdGspCitmYXN0Y2FsbCB1bnNpZ25lZCBsb25nIHBhdGNoX2VzcGZpeF9kZXNjKHVuc2lnbmVkIGxvbmcgdWVzcCwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGtlc3ApCiB7Ci0JdW5zaWduZWQgbG9uZyAqc3dpdGNoMTZfcHRyLCAqc3dpdGNoMzJfcHRyOwotCXN0cnVjdCBwdF9yZWdzICpyZWdzOwotCXVuc2lnbmVkIGxvbmcgc3RhY2tfdG9wLCBzdGFja19ib3Q7Ci0JdW5zaWduZWQgc2hvcnQgaXJldF9mcmFtZTE2X29mZjsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCS8qIHJlc2VydmUgdGhlIHNwYWNlIG9uIDMyYml0IHN0YWNrIGZvciB0aGUgbWFnaWMgc3dpdGNoMTYgcG9pbnRlciAqLwotCW1lbW1vdmUoc3RrLCBzdGsgKyA4LCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKLQlzd2l0Y2gxNl9wdHIgPSAodW5zaWduZWQgbG9uZyAqKShzdGsgKyBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKLQlyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopc3RrOwotCS8qIG5vdyB0aGUgc3dpdGNoMzIgb24gMTZiaXQgc3RhY2sgKi8KLQlzdGFja19ib3QgPSAodW5zaWduZWQgbG9uZykmcGVyX2NwdShjcHVfMTZiaXRfc3RhY2ssIGNwdSk7Ci0Jc3RhY2tfdG9wID0gc3RhY2tfYm90ICsJQ1BVXzE2QklUX1NUQUNLX1NJWkU7Ci0Jc3dpdGNoMzJfcHRyID0gKHVuc2lnbmVkIGxvbmcgKikoc3RhY2tfdG9wIC0gOCk7Ci0JaXJldF9mcmFtZTE2X29mZiA9IENQVV8xNkJJVF9TVEFDS19TSVpFIC0gOCAtIDIwOwotCS8qIGNvcHkgaXJldCBmcmFtZSBvbiAxNmJpdCBzdGFjayAqLwotCW1lbWNweSgodm9pZCAqKShzdGFja19ib3QgKyBpcmV0X2ZyYW1lMTZfb2ZmKSwgJnJlZ3MtPmVpcCwgMjApOwotCS8qIGZpbGwgaW4gdGhlIHN3aXRjaCBwb2ludGVycyAqLwotCXN3aXRjaDE2X3B0clswXSA9IChyZWdzLT5lc3AgJiAweGZmZmYwMDAwKSB8IGlyZXRfZnJhbWUxNl9vZmY7Ci0Jc3dpdGNoMTZfcHRyWzFdID0gX19FU1BGSVhfU1M7Ci0Jc3dpdGNoMzJfcHRyWzBdID0gKHVuc2lnbmVkIGxvbmcpc3RrICsgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSArCi0JCTggLSBDUFVfMTZCSVRfU1RBQ0tfU0laRTsKLQlzd2l0Y2gzMl9wdHJbMV0gPSBfX0tFUk5FTF9EUzsKLX0KLQotZmFzdGNhbGwgdW5zaWduZWQgY2hhciAqIGZpeHVwX3g4Nl9ib2d1c19zdGFjayh1bnNpZ25lZCBzaG9ydCBzcCkKLXsKLQl1bnNpZ25lZCBsb25nICpzd2l0Y2gzMl9wdHI7Ci0JdW5zaWduZWQgY2hhciAqc3RhY2sxNiwgKnN0YWNrMzI7Ci0JdW5zaWduZWQgbG9uZyBzdGFja190b3AsIHN0YWNrX2JvdDsKLQlpbnQgbGVuOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RhY2tfYm90ID0gKHVuc2lnbmVkIGxvbmcpJnBlcl9jcHUoY3B1XzE2Yml0X3N0YWNrLCBjcHUpOwotCXN0YWNrX3RvcCA9IHN0YWNrX2JvdCArCUNQVV8xNkJJVF9TVEFDS19TSVpFOwotCXN3aXRjaDMyX3B0ciA9ICh1bnNpZ25lZCBsb25nICopKHN0YWNrX3RvcCAtIDgpOwotCS8qIGNvcHkgdGhlIGRhdGEgZnJvbSAxNmJpdCBzdGFjayB0byAzMmJpdCBzdGFjayAqLwotCWxlbiA9IENQVV8xNkJJVF9TVEFDS19TSVpFIC0gOCAtIHNwOwotCXN0YWNrMTYgPSAodW5zaWduZWQgY2hhciAqKShzdGFja19ib3QgKyBzcCk7Ci0Jc3RhY2szMiA9ICh1bnNpZ25lZCBjaGFyICopCi0JCShzd2l0Y2gzMl9wdHJbMF0gKyBDUFVfMTZCSVRfU1RBQ0tfU0laRSAtIDggLSBsZW4pOwotCW1lbWNweShzdGFjazMyLCBzdGFjazE2LCBsZW4pOwotCXJldHVybiBzdGFjazMyOworCXN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgKmNwdV9nZHRfZGVzY3IgPSAmcGVyX2NwdShjcHVfZ2R0X2Rlc2NyLCBjcHUpOworCXN0cnVjdCBkZXNjX3N0cnVjdCAqZ2R0ID0gKHN0cnVjdCBkZXNjX3N0cnVjdCAqKWNwdV9nZHRfZGVzY3ItPmFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gKGtlc3AgLSB1ZXNwKSAmIC1USFJFQURfU0laRTsKKwl1bnNpZ25lZCBsb25nIG5ld19rZXNwID0ga2VzcCAtIGJhc2U7CisJdW5zaWduZWQgbG9uZyBsaW1fcGFnZXMgPSAobmV3X2tlc3AgfCAoVEhSRUFEX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVDsKKwlfX3U2NCBkZXNjID0gKihfX3U2NCAqKSZnZHRbR0RUX0VOVFJZX0VTUEZJWF9TU107CisJLyogU2V0IHVwIGJhc2UgZm9yIGVzcGZpeCBzZWdtZW50ICovCisgCWRlc2MgJj0gMHgwMGYwZmYwMDAwMDAwMDAwVUxMOworIAlkZXNjIHw9CSgoKChfX3U2NCliYXNlKSA8PCAxNikgJiAweDAwMDAwMGZmZmZmZjAwMDBVTEwpIHwKKwkJKCgoKF9fdTY0KWJhc2UpIDw8IDMyKSAmIDB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgfAorCQkoKCgoX191NjQpbGltX3BhZ2VzKSA8PCAzMikgJiAweDAwMGYwMDAwMDAwMDAwMDBVTEwpIHwKKwkJKGxpbV9wYWdlcyAmIDB4ZmZmZik7CisJKihfX3U2NCAqKSZnZHRbR0RUX0VOVFJZX0VTUEZJWF9TU10gPSBkZXNjOworCXJldHVybiBuZXdfa2VzcDsKIH0KIAogLyoKQEAgLTExMzksNyArMTEwOSw3IEBACiAgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGtlcm5lbCBwcmVlbXB0aW9uIGRpc2FibGVkIChpbiB0aGlzIGNhc2UsCiAgKiBsb2NhbCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhdCB0aGUgY2FsbC1zaXRlIGluIGVudHJ5LlMpLgogICovCi1hc21saW5rYWdlIHZvaWQgbWF0aF9zdGF0ZV9yZXN0b3JlKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCithc21saW5rYWdlIHZvaWQgbWF0aF9zdGF0ZV9yZXN0b3JlKHZvaWQpCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSB0aHJlYWQtPnRhc2s7CkBAIC0xMTQ5LDYgKzExMTksNyBAQAogCQlpbml0X2ZwdSh0c2spOwogCXJlc3RvcmVfZnB1KHRzayk7CiAJdGhyZWFkLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsJLyogU28gd2UgZm5zYXZlIG9uIHN3aXRjaF90bygpICovCisJdHNrLT5mcHVfY291bnRlcisrOwogfQogCiAjaWZuZGVmIENPTkZJR19NQVRIX0VNVUxBVElPTgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90c2MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMKaW5kZXggYjhmYTBhOC4uMWJiZTQ1ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90c2MuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RzYy5jCkBAIC0xMyw3ICsxMyw2IEBACiAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vdHNjLmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlICJtYWNoX3RpbWVyLmgiCkBAIC0yMTcsNyArMjE2LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9pbml0ID0gMDsKIHN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrOwogCi1zdGF0aWMgdm9pZCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkICp2KQorc3RhdGljIHZvaWQgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXVuc2lnbmVkIGludCBjcHU7CiAKQEAgLTMwNiw3ICszMDUsNyBAQAogewogCWludCByZXQ7CiAKLQlJTklUX1dPUksoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yaywgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQsIE5VTEwpOworCUlOSVRfV09SSygmY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrLCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldCk7CiAJcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcigmdGltZV9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLAogCQkJCQlDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOwogCWlmICghcmV0KQpAQCAtMzQ5LDggKzM0OCw4IEBACiAJaW50IGNoYW5nZSA9IDA7CiAKIAkvKiBjaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHN3aXRjaCB0byB0aGUgc2FmZSBjbG9ja3NvdXJjZTogKi8KLQlpZiAoY2xvY2tzb3VyY2VfdHNjLnJhdGluZyAhPSA1MCAmJiBjaGVja190c2NfdW5zdGFibGUoKSkgewotCQljbG9ja3NvdXJjZV90c2MucmF0aW5nID0gNTA7CisJaWYgKGNsb2Nrc291cmNlX3RzYy5yYXRpbmcgIT0gMCAmJiBjaGVja190c2NfdW5zdGFibGUoKSkgeworCQljbG9ja3NvdXJjZV90c2MucmF0aW5nID0gMDsKIAkJY2xvY2tzb3VyY2VfcmVzZWxlY3QoKTsKIAkJY2hhbmdlID0gMTsKIAl9CkBAIC00NjEsNyArNDYwLDcgQEAKIAkJCQkJCQljbG9ja3NvdXJjZV90c2Muc2hpZnQpOwogCQkvKiBsb3dlciB0aGUgcmF0aW5nIGlmIHdlIGFscmVhZHkga25vdyBpdHMgdW5zdGFibGU6ICovCiAJCWlmIChjaGVja190c2NfdW5zdGFibGUoKSkKLQkJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSA1MDsKKwkJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSAwOwogCiAJCWluaXRfdGltZXIoJnZlcmlmeV90c2NfZnJlcV90aW1lcik7CiAJCXZlcmlmeV90c2NfZnJlcV90aW1lci5mdW5jdGlvbiA9IHZlcmlmeV90c2NfZnJlcTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jIGIvYXJjaC9pMzg2L2tlcm5lbC92bTg2LmMKaW5kZXggY2JjZDYxZC4uYmUyZjk2ZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92bTg2LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bTg2LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC03MiwxMCArNzMsMTAgQEAKIC8qCiAgKiA4LSBhbmQgMTYtYml0IHJlZ2lzdGVyIGRlZmluZXMuLgogICovCi0jZGVmaW5lIEFMKHJlZ3MpCSgoKHVuc2lnbmVkIGNoYXIgKikmKChyZWdzKS0+ZWF4KSlbMF0pCi0jZGVmaW5lIEFIKHJlZ3MpCSgoKHVuc2lnbmVkIGNoYXIgKikmKChyZWdzKS0+ZWF4KSlbMV0pCi0jZGVmaW5lIElQKHJlZ3MpCSgqKHVuc2lnbmVkIHNob3J0ICopJigocmVncyktPmVpcCkpCi0jZGVmaW5lIFNQKHJlZ3MpCSgqKHVuc2lnbmVkIHNob3J0ICopJigocmVncyktPmVzcCkpCisjZGVmaW5lIEFMKHJlZ3MpCSgoKHVuc2lnbmVkIGNoYXIgKikmKChyZWdzKS0+cHQuZWF4KSlbMF0pCisjZGVmaW5lIEFIKHJlZ3MpCSgoKHVuc2lnbmVkIGNoYXIgKikmKChyZWdzKS0+cHQuZWF4KSlbMV0pCisjZGVmaW5lIElQKHJlZ3MpCSgqKHVuc2lnbmVkIHNob3J0ICopJigocmVncyktPnB0LmVpcCkpCisjZGVmaW5lIFNQKHJlZ3MpCSgqKHVuc2lnbmVkIHNob3J0ICopJigocmVncyktPnB0LmVzcCkpCiAKIC8qCiAgKiB2aXJ0dWFsIGZsYWdzICgxNiBhbmQgMzItYml0IHZlcnNpb25zKQpAQCAtODksMTAgKzkwLDM3IEBACiAjZGVmaW5lIFNBRkVfTUFTSwkoMHhERDUpCiAjZGVmaW5lIFJFVFVSTl9NQVNLCSgweERGRikKIAotI2RlZmluZSBWTTg2X1JFR1NfUEFSVDIgb3JpZ19lYXgKLSNkZWZpbmUgVk04Nl9SRUdTX1NJWkUxIFwKLSAgICAgICAgKCAodW5zaWduZWQpKCAmICgoKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICopMCktPlZNODZfUkVHU19QQVJUMikgKSApCi0jZGVmaW5lIFZNODZfUkVHU19TSVpFMiAoc2l6ZW9mKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzKSAtIFZNODZfUkVHU19TSVpFMSkKKy8qIGNvbnZlcnQga2VybmVsX3ZtODZfcmVncyB0byB2bTg2X3JlZ3MgKi8KK3N0YXRpYyBpbnQgY29weV92bTg2X3JlZ3NfdG9fdXNlcihzdHJ1Y3Qgdm04Nl9yZWdzIF9fdXNlciAqdXNlciwKKwkJCQkgIGNvbnN0IHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICpyZWdzKQoreworCWludCByZXQgPSAwOworCisJLyoga2VybmVsX3ZtODZfcmVncyBpcyBtaXNzaW5nIHhmcywgc28gY29weSBldmVyeXRoaW5nIHVwIHRvCisJICAgKGJ1dCBub3QgaW5jbHVkaW5nKSB4Z3MsIGFuZCB0aGVuIHJlc3QgYWZ0ZXIgeGdzLiAqLworCXJldCArPSBjb3B5X3RvX3VzZXIodXNlciwgcmVncywgb2Zmc2V0b2Yoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MsIHB0LnhncykpOworCXJldCArPSBjb3B5X3RvX3VzZXIoJnVzZXItPl9fbnVsbF9ncywgJnJlZ3MtPnB0LnhncywKKwkJCSAgICBzaXplb2Yoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MpIC0KKwkJCSAgICBvZmZzZXRvZihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncywgcHQueGdzKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjb252ZXJ0IHZtODZfcmVncyB0byBrZXJuZWxfdm04Nl9yZWdzICovCitzdGF0aWMgaW50IGNvcHlfdm04Nl9yZWdzX2Zyb21fdXNlcihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqcmVncywKKwkJCQkgICAgY29uc3Qgc3RydWN0IHZtODZfcmVncyBfX3VzZXIgKnVzZXIsCisJCQkJICAgIHVuc2lnbmVkIGV4dHJhKQoreworCWludCByZXQgPSAwOworCisJcmV0ICs9IGNvcHlfZnJvbV91c2VyKHJlZ3MsIHVzZXIsIG9mZnNldG9mKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzLCBwdC54Z3MpKTsKKwlyZXQgKz0gY29weV9mcm9tX3VzZXIoJnJlZ3MtPnB0LnhncywgJnVzZXItPl9fbnVsbF9ncywKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncykgLQorCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MsIHB0LnhncykgKworCQkJICAgICAgZXh0cmEpOworCisJcmV0dXJuIHJldDsKK30KIAogc3RydWN0IHB0X3JlZ3MgKiBGQVNUQ0FMTChzYXZlX3Y4Nl9zdGF0ZShzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpKTsKIHN0cnVjdCBwdF9yZWdzICogZmFzdGNhbGwgc2F2ZV92ODZfc3RhdGUoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQpAQCAtMTEyLDEwICsxNDAsOCBAQAogCQlwcmludGsoIm5vIHZtODZfaW5mbzogQkFEXG4iKTsKIAkJZG9fZXhpdChTSUdTRUdWKTsKIAl9Ci0Jc2V0X2ZsYWdzKHJlZ3MtPmVmbGFncywgVkVGTEFHUywgVklGX01BU0sgfCBjdXJyZW50LT50aHJlYWQudjg2bWFzayk7Ci0JdG1wID0gY29weV90b191c2VyKCZjdXJyZW50LT50aHJlYWQudm04Nl9pbmZvLT5yZWdzLHJlZ3MsIFZNODZfUkVHU19TSVpFMSk7Ci0JdG1wICs9IGNvcHlfdG9fdXNlcigmY3VycmVudC0+dGhyZWFkLnZtODZfaW5mby0+cmVncy5WTTg2X1JFR1NfUEFSVDIsCi0JCSZyZWdzLT5WTTg2X1JFR1NfUEFSVDIsIFZNODZfUkVHU19TSVpFMik7CisJc2V0X2ZsYWdzKHJlZ3MtPnB0LmVmbGFncywgVkVGTEFHUywgVklGX01BU0sgfCBjdXJyZW50LT50aHJlYWQudjg2bWFzayk7CisJdG1wID0gY29weV92bTg2X3JlZ3NfdG9fdXNlcigmY3VycmVudC0+dGhyZWFkLnZtODZfaW5mby0+cmVncyxyZWdzKTsKIAl0bXAgKz0gcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnNjcmVlbl9iaXRtYXAsJmN1cnJlbnQtPnRocmVhZC52bTg2X2luZm8tPnNjcmVlbl9iaXRtYXApOwogCWlmICh0bXApIHsKIAkJcHJpbnRrKCJ2bTg2OiBjb3VsZCBub3QgYWNjZXNzIHVzZXJzcGFjZSB2bTg2X2luZm9cbiIpOwpAQCAtMTI5LDkgKzE1NSwxMSBAQAogCWN1cnJlbnQtPnRocmVhZC5zYXZlZF9lc3AwID0gMDsKIAlwdXRfY3B1KCk7CiAKLQlsb2Fkc2VnbWVudChmcywgY3VycmVudC0+dGhyZWFkLnNhdmVkX2ZzKTsKLQlsb2Fkc2VnbWVudChncywgY3VycmVudC0+dGhyZWFkLnNhdmVkX2dzKTsKIAlyZXQgPSBLVk04Ni0+cmVnczMyOworCisJbG9hZHNlZ21lbnQoZnMsIGN1cnJlbnQtPnRocmVhZC5zYXZlZF9mcyk7CisJcmV0LT54Z3MgPSBjdXJyZW50LT50aHJlYWQuc2F2ZWRfZ3M7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xODMsOSArMjExLDkgQEAKIAl0c2sgPSBjdXJyZW50OwogCWlmICh0c2stPnRocmVhZC5zYXZlZF9lc3AwKQogCQlnb3RvIG91dDsKLQl0bXAgID0gY29weV9mcm9tX3VzZXIoJmluZm8sIHY4NiwgVk04Nl9SRUdTX1NJWkUxKTsKLQl0bXAgKz0gY29weV9mcm9tX3VzZXIoJmluZm8ucmVncy5WTTg2X1JFR1NfUEFSVDIsICZ2ODYtPnJlZ3MuVk04Nl9SRUdTX1BBUlQyLAotCQkobG9uZykmaW5mby52bTg2cGx1cyAtIChsb25nKSZpbmZvLnJlZ3MuVk04Nl9SRUdTX1BBUlQyKTsKKwl0bXAgPSBjb3B5X3ZtODZfcmVnc19mcm9tX3VzZXIoJmluZm8ucmVncywgJnY4Ni0+cmVncywKKwkJCQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGtlcm5lbF92bTg2X3N0cnVjdCwgdm04NnBsdXMpIC0KKwkJCQkgICAgICAgc2l6ZW9mKGluZm8ucmVncykpOwogCXJldCA9IC1FRkFVTFQ7CiAJaWYgKHRtcCkKIAkJZ290byBvdXQ7CkBAIC0yMzMsOSArMjYxLDkgQEAKIAlpZiAodHNrLT50aHJlYWQuc2F2ZWRfZXNwMCkKIAkJZ290byBvdXQ7CiAJdjg2ID0gKHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgX191c2VyICopcmVncy5lY3g7Ci0JdG1wICA9IGNvcHlfZnJvbV91c2VyKCZpbmZvLCB2ODYsIFZNODZfUkVHU19TSVpFMSk7Ci0JdG1wICs9IGNvcHlfZnJvbV91c2VyKCZpbmZvLnJlZ3MuVk04Nl9SRUdTX1BBUlQyLCAmdjg2LT5yZWdzLlZNODZfUkVHU19QQVJUMiwKLQkJKGxvbmcpJmluZm8ucmVnczMyIC0gKGxvbmcpJmluZm8ucmVncy5WTTg2X1JFR1NfUEFSVDIpOworCXRtcCA9IGNvcHlfdm04Nl9yZWdzX2Zyb21fdXNlcigmaW5mby5yZWdzLCAmdjg2LT5yZWdzLAorCQkJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3Qga2VybmVsX3ZtODZfc3RydWN0LCByZWdzMzIpIC0KKwkJCQkgICAgICAgc2l6ZW9mKGluZm8ucmVncykpOwogCXJldCA9IC1FRkFVTFQ7CiAJaWYgKHRtcCkKIAkJZ290byBvdXQ7CkBAIC0yNTIsMTUgKzI4MCwxNSBAQAogc3RhdGljIHZvaWQgZG9fc3lzX3ZtODYoc3RydWN0IGtlcm5lbF92bTg2X3N0cnVjdCAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKLQlsb25nIGVheDsKIC8qCiAgKiBtYWtlIHN1cmUgdGhlIHZtODYoKSBzeXN0ZW0gY2FsbCBkb2Vzbid0IHRyeSB0byBkbyBhbnl0aGluZyBzaWxseQogICovCi0JaW5mby0+cmVncy5fX251bGxfZHMgPSAwOwotCWluZm8tPnJlZ3MuX19udWxsX2VzID0gMDsKKwlpbmZvLT5yZWdzLnB0LnhkcyA9IDA7CisJaW5mby0+cmVncy5wdC54ZXMgPSAwOworCWluZm8tPnJlZ3MucHQueGdzID0gMDsKIAotLyogd2UgYXJlIGNsZWFyaW5nIGZzLGdzIGxhdGVyIGp1c3QgYmVmb3JlICJqbXAgcmVzdW1lX3VzZXJzcGFjZSIsCi0gKiBiZWNhdXNlIHN0YXJ0aW5nIHdpdGggTGludXggMi4xLnggdGhleSBhcmVuJ3Qgbm8gbG9uZ2VyIHNhdmVkL3Jlc3RvcmVkCisvKiB3ZSBhcmUgY2xlYXJpbmcgZnMgbGF0ZXIganVzdCBiZWZvcmUgImptcCByZXN1bWVfdXNlcnNwYWNlIiwKKyAqIGJlY2F1c2UgaXQgaXMgbm90IHNhdmVkL3Jlc3RvcmVkLgogICovCiAKIC8qCkBAIC0yNjgsMTAgKzI5NiwxMCBAQAogICogaGFzIHNldCBpdCB1cCBzYWZlbHksIHNvIHRoaXMgbWFrZXMgc3VyZSBpbnRlcnJ1cHQgZXRjIGZsYWdzIGFyZQogICogaW5oZXJpdGVkIGZyb20gcHJvdGVjdGVkIG1vZGUuCiAgKi8KLSAJVkVGTEFHUyA9IGluZm8tPnJlZ3MuZWZsYWdzOwotCWluZm8tPnJlZ3MuZWZsYWdzICY9IFNBRkVfTUFTSzsKLQlpbmZvLT5yZWdzLmVmbGFncyB8PSBpbmZvLT5yZWdzMzItPmVmbGFncyAmIH5TQUZFX01BU0s7Ci0JaW5mby0+cmVncy5lZmxhZ3MgfD0gVk1fTUFTSzsKKyAJVkVGTEFHUyA9IGluZm8tPnJlZ3MucHQuZWZsYWdzOworCWluZm8tPnJlZ3MucHQuZWZsYWdzICY9IFNBRkVfTUFTSzsKKwlpbmZvLT5yZWdzLnB0LmVmbGFncyB8PSBpbmZvLT5yZWdzMzItPmVmbGFncyAmIH5TQUZFX01BU0s7CisJaW5mby0+cmVncy5wdC5lZmxhZ3MgfD0gVk1fTUFTSzsKIAogCXN3aXRjaCAoaW5mby0+Y3B1X3R5cGUpIHsKIAkJY2FzZSBDUFVfMjg2OgpAQCAtMjk0LDcgKzMyMiw3IEBACiAJaW5mby0+cmVnczMyLT5lYXggPSAwOwogCXRzay0+dGhyZWFkLnNhdmVkX2VzcDAgPSB0c2stPnRocmVhZC5lc3AwOwogCXNhdmVzZWdtZW50KGZzLCB0c2stPnRocmVhZC5zYXZlZF9mcyk7Ci0Jc2F2ZXNlZ21lbnQoZ3MsIHRzay0+dGhyZWFkLnNhdmVkX2dzKTsKKwl0c2stPnRocmVhZC5zYXZlZF9ncyA9IGluZm8tPnJlZ3MzMi0+eGdzOwogCiAJdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGdldF9jcHUoKSk7CiAJdHNrLT50aHJlYWQuZXNwMCA9ICh1bnNpZ25lZCBsb25nKSAmaW5mby0+Vk04Nl9UU1NfRVNQMDsKQEAgLTMwNiwxOSArMzM0LDE4IEBACiAJdHNrLT50aHJlYWQuc2NyZWVuX2JpdG1hcCA9IGluZm8tPnNjcmVlbl9iaXRtYXA7CiAJaWYgKGluZm8tPmZsYWdzICYgVk04Nl9TQ1JFRU5fQklUTUFQKQogCQltYXJrX3NjcmVlbl9yZG9ubHkodHNrLT5tbSk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInhvcmwgJWVheCwlZWF4OyBtb3ZsICVlYXgsJWZzOyBtb3ZsICVlYXgsJWdzXG5cdCIpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZWF4LCAlMFxuIiA6Ij1yIihlYXgpKTsKIAogCS8qY2FsbCBhdWRpdF9zeXNjYWxsX2V4aXQgc2luY2Ugd2UgZG8gbm90IGV4aXQgdmlhIHRoZSBub3JtYWwgcGF0aHMgKi8KIAlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkpCi0JCWF1ZGl0X3N5c2NhbGxfZXhpdChBVURJVFNDX1JFU1VMVChlYXgpLCBlYXgpOworCQlhdWRpdF9zeXNjYWxsX2V4aXQoQVVESVRTQ19SRVNVTFQoMCksIDApOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSJtb3ZsICUwLCUlZXNwXG5cdCIKIAkJIm1vdmwgJTEsJSVlYnBcblx0IgorCQkibW92ICAlMiwgJSVmc1xuXHQiCiAJCSJqbXAgcmVzdW1lX3VzZXJzcGFjZSIKIAkJOiAvKiBubyBvdXRwdXRzICovCi0JCToiciIgKCZpbmZvLT5yZWdzKSwgInIiICh0YXNrX3RocmVhZF9pbmZvKHRzaykpKTsKKwkJOiJyIiAoJmluZm8tPnJlZ3MpLCAiciIgKHRhc2tfdGhyZWFkX2luZm8odHNrKSksICJyIiAoMCkpOwogCS8qIHdlIG5ldmVyIHJldHVybiBoZXJlICovCiB9CiAKQEAgLTM0OCwxMiArMzc1LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9URihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCiB7Ci0JcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOworCXJlZ3MtPnB0LmVmbGFncyAmPSB+VEZfTUFTSzsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX0FDKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykKIHsKLQlyZWdzLT5lZmxhZ3MgJj0gfkFDX01BU0s7CisJcmVncy0+cHQuZWZsYWdzICY9IH5BQ19NQVNLOwogfQogCiAvKiBJdCBpcyBjb3JyZWN0IHRvIGNhbGwgc2V0X0lGKHJlZ3MpIGZyb20gdGhlIHNldF92ZmxhZ3NfKgpAQCAtMzcwLDcgKzM5Nyw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3ZmbGFnc19sb25nKHVuc2lnbmVkIGxvbmcgZWZsYWdzLCBzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCiB7CiAJc2V0X2ZsYWdzKFZFRkxBR1MsIGVmbGFncywgY3VycmVudC0+dGhyZWFkLnY4Nm1hc2spOwotCXNldF9mbGFncyhyZWdzLT5lZmxhZ3MsIGVmbGFncywgU0FGRV9NQVNLKTsKKwlzZXRfZmxhZ3MocmVncy0+cHQuZWZsYWdzLCBlZmxhZ3MsIFNBRkVfTUFTSyk7CiAJaWYgKGVmbGFncyAmIElGX01BU0spCiAJCXNldF9JRihyZWdzKTsKIAllbHNlCkBAIC0zODAsNyArNDA3LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdmZsYWdzX3Nob3J0KHVuc2lnbmVkIHNob3J0IGZsYWdzLCBzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCiB7CiAJc2V0X2ZsYWdzKFZGTEFHUywgZmxhZ3MsIGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKLQlzZXRfZmxhZ3MocmVncy0+ZWZsYWdzLCBmbGFncywgU0FGRV9NQVNLKTsKKwlzZXRfZmxhZ3MocmVncy0+cHQuZWZsYWdzLCBmbGFncywgU0FGRV9NQVNLKTsKIAlpZiAoZmxhZ3MgJiBJRl9NQVNLKQogCQlzZXRfSUYocmVncyk7CiAJZWxzZQpAQCAtMzg5LDcgKzQxNiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdmZsYWdzKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gcmVncy0+ZWZsYWdzICYgUkVUVVJOX01BU0s7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHJlZ3MtPnB0LmVmbGFncyAmIFJFVFVSTl9NQVNLOwogCiAJaWYgKFZFRkxBR1MgJiBWSUZfTUFTSykKIAkJZmxhZ3MgfD0gSUZfTUFTSzsKQEAgLTQ5Myw3ICs1MjAsNyBAQAogCXVuc2lnbmVkIGxvbmcgX191c2VyICppbnRyX3B0cjsKIAl1bnNpZ25lZCBsb25nIHNlZ29mZnM7CiAKLQlpZiAocmVncy0+Y3MgPT0gQklPU1NFRykKKwlpZiAocmVncy0+cHQueGNzID09IEJJT1NTRUcpCiAJCWdvdG8gY2Fubm90X2hhbmRsZTsKIAlpZiAoaXNfcmV2ZWN0b3JlZChpLCAmS1ZNODYtPmludF9yZXZlY3RvcmVkKSkKIAkJZ290byBjYW5ub3RfaGFuZGxlOwpAQCAtNTA1LDkgKzUzMiw5IEBACiAJaWYgKChzZWdvZmZzID4+IDE2KSA9PSBCSU9TU0VHKQogCQlnb3RvIGNhbm5vdF9oYW5kbGU7CiAJcHVzaHcoc3NwLCBzcCwgZ2V0X3ZmbGFncyhyZWdzKSwgY2Fubm90X2hhbmRsZSk7Ci0JcHVzaHcoc3NwLCBzcCwgcmVncy0+Y3MsIGNhbm5vdF9oYW5kbGUpOworCXB1c2h3KHNzcCwgc3AsIHJlZ3MtPnB0LnhjcywgY2Fubm90X2hhbmRsZSk7CiAJcHVzaHcoc3NwLCBzcCwgSVAocmVncyksIGNhbm5vdF9oYW5kbGUpOwotCXJlZ3MtPmNzID0gc2Vnb2ZmcyA+PiAxNjsKKwlyZWdzLT5wdC54Y3MgPSBzZWdvZmZzID4+IDE2OwogCVNQKHJlZ3MpIC09IDY7CiAJSVAocmVncykgPSBzZWdvZmZzICYgMHhmZmZmOwogCWNsZWFyX1RGKHJlZ3MpOwpAQCAtNTI0LDcgKzU1MSw3IEBACiAJaWYgKFZNUEkuaXNfdm04NnB1cykgewogCQlpZiAoICh0cmFwbm89PTMpIHx8ICh0cmFwbm89PTEpICkKIAkJCXJldHVybl90b18zMmJpdChyZWdzLCBWTTg2X1RSQVAgKyAodHJhcG5vIDw8IDgpKTsKLQkJZG9faW50KHJlZ3MsIHRyYXBubywgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5zcyA8PCA0KSwgU1AocmVncykpOworCQlkb19pbnQocmVncywgdHJhcG5vLCAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgKHJlZ3MtPnB0LnhzcyA8PCA0KSwgU1AocmVncykpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHRyYXBubyAhPTEpCkBAIC01NjAsMTAgKzU4NywxMCBAQAogCQloYW5kbGVfdm04Nl90cmFwKHJlZ3MsIDAsIDEpOyBcCiAJcmV0dXJuOyB9IHdoaWxlICgwKQogCi0Jb3JpZ19mbGFncyA9ICoodW5zaWduZWQgc2hvcnQgKikmcmVncy0+ZWZsYWdzOworCW9yaWdfZmxhZ3MgPSAqKHVuc2lnbmVkIHNob3J0ICopJnJlZ3MtPnB0LmVmbGFnczsKIAotCWNzcCA9ICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKSAocmVncy0+Y3MgPDwgNCk7Ci0Jc3NwID0gKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5zcyA8PCA0KTsKKwljc3AgPSAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgKHJlZ3MtPnB0LnhjcyA8PCA0KTsKKwlzc3AgPSAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgKHJlZ3MtPnB0LnhzcyA8PCA0KTsKIAlzcCA9IFNQKHJlZ3MpOwogCWlwID0gSVAocmVncyk7CiAKQEAgLTY1MCw3ICs2NzcsNyBAQAogCQkJU1AocmVncykgKz0gNjsKIAkJfQogCQlJUChyZWdzKSA9IG5ld2lwOwotCQlyZWdzLT5jcyA9IG5ld2NzOworCQlyZWdzLT5wdC54Y3MgPSBuZXdjczsKIAkJQ0hFQ0tfSUZfSU5fVFJBUDsKIAkJaWYgKGRhdGEzMikgewogCQkJc2V0X3ZmbGFnc19sb25nKG5ld2ZsYWdzLCByZWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAxZTdhYzFjLi5hNTNjOGIxIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xLDE4ICsxLDMyIEBACiAvKiBsZCBzY3JpcHQgdG8gbWFrZSBpMzg2IExpbnV4IGtlcm5lbAogICogV3JpdHRlbiBieSBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej47CisgKgorICogRG9uJ3QgZGVmaW5lIGFic29sdXRlIHN5bWJvbHMgdW50aWwgYW5kIHVubGVzcyB5b3Uga25vdyB0aGF0IHN5bWJvbAorICogdmFsdWUgaXMgc2hvdWxkIHJlbWFpbiBjb25zdGFudCBldmVuIGlmIGtlcm5lbCBpbWFnZSBpcyByZWxvY2F0ZWQKKyAqIGF0IHJ1biB0aW1lLiBBYnNvbHV0ZSBzeW1ib2xzIGFyZSBub3QgcmVsb2NhdGVkLiBJZiBzeW1ib2wgdmFsdWUgc2hvdWxkCisgKiBjaGFuZ2UgaWYga2VybmVsIGlzIHJlbG9jYXRlZCwgbWFrZSB0aGUgc3ltYm9sIHNlY3Rpb24gcmVsYXRpdmUgYW5kCisgKiBwdXQgaXQgaW5zaWRlIHRoZSBzZWN0aW9uIGRlZmluaXRpb24uCiAgKi8KIAorLyogRG9uJ3QgZGVmaW5lIGFic29sdXRlIHN5bWJvbHMgdW50aWwgYW5kIHVubGVzcyB5b3Uga25vdyB0aGF0IHN5bWJvbAorICogdmFsdWUgaXMgc2hvdWxkIHJlbWFpbiBjb25zdGFudCBldmVuIGlmIGtlcm5lbCBpbWFnZSBpcyByZWxvY2F0ZWQKKyAqIGF0IHJ1biB0aW1lLiBBYnNvbHV0ZSBzeW1ib2xzIGFyZSBub3QgcmVsb2NhdGVkLiBJZiBzeW1ib2wgdmFsdWUgc2hvdWxkCisgKiBjaGFuZ2UgaWYga2VybmVsIGlzIHJlbG9jYXRlZCwgbWFrZSB0aGUgc3ltYm9sIHNlY3Rpb24gcmVsYXRpdmUgYW5kCisgKiBwdXQgaXQgaW5zaWRlIHRoZSBzZWN0aW9uIGRlZmluaXRpb24uCisgKi8KICNkZWZpbmUgTE9BRF9PRkZTRVQgX19QQUdFX09GRlNFVAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9ib290Lmg+CiAKIE9VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKIE9VVFBVVF9BUkNIKGkzODYpCiBFTlRSWShwaHlzX3N0YXJ0dXBfMzIpCiBqaWZmaWVzID0gamlmZmllc182NDsKK19wcm94eV9wZGEgPSAwOwogCiBQSERSUyB7CiAJdGV4dCBQVF9MT0FEIEZMQUdTKDUpOwkvKiBSX0UgKi8KQEAgLTIxLDQ2ICszNSw1OCBAQAogfQogU0VDVElPTlMKIHsKLSAgLiA9IF9fS0VSTkVMX1NUQVJUOworICAuID0gTE9BRF9PRkZTRVQgKyBMT0FEX1BIWVNJQ0FMX0FERFI7CiAgIHBoeXNfc3RhcnR1cF8zMiA9IHN0YXJ0dXBfMzIgLSBMT0FEX09GRlNFVDsKICAgLyogcmVhZC1vbmx5ICovCi0gIF90ZXh0ID0gLjsJCQkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YSAqLwogICAudGV4dCA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKKyAgCV90ZXh0ID0gLjsJCQkvKiBUZXh0IGFuZCByZWFkLW9ubHkgZGF0YSAqLwogCSooLnRleHQpCiAJU0NIRURfVEVYVAogCUxPQ0tfVEVYVAogCUtQUk9CRVNfVEVYVAogCSooLmZpeHVwKQogCSooLmdudS53YXJuaW5nKQotCX0gOnRleHQgPSAweDkwOTAKLQotICBfZXRleHQgPSAuOwkJCS8qIEVuZCBvZiB0ZXh0IHNlY3Rpb24gKi8KKyAgCV9ldGV4dCA9IC47CQkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworICB9IDp0ZXh0ID0gMHg5MDkwCiAKICAgLiA9IEFMSUdOKDE2KTsJCS8qIEV4Y2VwdGlvbiB0YWJsZSAqLwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogQVQoQUREUihfX2V4X3RhYmxlKSAtIExPQURfT0ZGU0VUKSB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiBBVChBRERSKF9fZXhfdGFibGUpIC0gTE9BRF9PRkZTRVQpIHsKKyAgCV9fc3RhcnRfX19leF90YWJsZSA9IC47CisJICooX19leF90YWJsZSkKKyAgCV9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKyAgfQogCiAgIFJPREFUQQogCisgIEJVR19UQUJMRQorCiAgIC4gPSBBTElHTig0KTsKLSAgX190cmFjZWRhdGFfc3RhcnQgPSAuOwogICAudHJhY2VkYXRhIDogQVQoQUREUigudHJhY2VkYXRhKSAtIExPQURfT0ZGU0VUKSB7CisgIAlfX3RyYWNlZGF0YV9zdGFydCA9IC47CiAJKigudHJhY2VkYXRhKQorICAJX190cmFjZWRhdGFfZW5kID0gLjsKICAgfQotICBfX3RyYWNlZGF0YV9lbmQgPSAuOwogCiAgIC8qIHdyaXRlYWJsZSAqLworICAuID0gQUxJR04oNDA5Nik7CiAgIC5kYXRhIDogQVQoQUREUiguZGF0YSkgLSBMT0FEX09GRlNFVCkgewkvKiBEYXRhICovCiAJKiguZGF0YSkKIAlDT05TVFJVQ1RPUlMKIAl9IDpkYXRhCiAKKyAgLnBhcmF2aXJ0cHJvYmUgOiBBVChBRERSKC5wYXJhdmlydHByb2JlKSAtIExPQURfT0ZGU0VUKSB7CisgIAlfX3N0YXJ0X3BhcmF2aXJ0cHJvYmUgPSAuOworCSooLnBhcmF2aXJ0cHJvYmUpCisgIAlfX3N0b3BfcGFyYXZpcnRwcm9iZSA9IC47CisgIH0KKwogICAuID0gQUxJR04oNDA5Nik7Ci0gIF9fbm9zYXZlX2JlZ2luID0gLjsKLSAgLmRhdGFfbm9zYXZlIDogQVQoQUREUiguZGF0YV9ub3NhdmUpIC0gTE9BRF9PRkZTRVQpIHsgKiguZGF0YS5ub3NhdmUpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX25vc2F2ZV9lbmQgPSAuOworICAuZGF0YV9ub3NhdmUgOiBBVChBRERSKC5kYXRhX25vc2F2ZSkgLSBMT0FEX09GRlNFVCkgeworICAJX19ub3NhdmVfYmVnaW4gPSAuOworCSooLmRhdGEubm9zYXZlKQorICAJLiA9IEFMSUdOKDQwOTYpOworICAJX19ub3NhdmVfZW5kID0gLjsKKyAgfQogCiAgIC4gPSBBTElHTig0MDk2KTsKICAgLmRhdGEucGFnZV9hbGlnbmVkIDogQVQoQUREUiguZGF0YS5wYWdlX2FsaWduZWQpIC0gTE9BRF9PRkZTRVQpIHsKQEAgLTc0LDE3ICsxMDAsMTAgQEAKIAogICAvKiByYXJlbHkgY2hhbmdlZCBkYXRhIGxpa2UgY3B1IG1hcHMgKi8KICAgLiA9IEFMSUdOKDMyKTsKLSAgLmRhdGEucmVhZF9tb3N0bHkgOiBBVChBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSAtIExPQURfT0ZGU0VUKSB7ICooLmRhdGEucmVhZF9tb3N0bHkpIH0KLSAgX2VkYXRhID0gLjsJCQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCi0KLSNpZmRlZiBDT05GSUdfU1RBQ0tfVU5XSU5ECi0gIC4gPSBBTElHTig0KTsKLSAgLmVoX2ZyYW1lIDogQVQoQUREUiguZWhfZnJhbWUpIC0gTE9BRF9PRkZTRVQpIHsKLQlfX3N0YXJ0X3Vud2luZCA9IC47Ci0gIAkqKC5laF9mcmFtZSkKLQlfX2VuZF91bndpbmQgPSAuOworICAuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsKKwkqKC5kYXRhLnJlYWRfbW9zdGx5KQorCV9lZGF0YSA9IC47CQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCiAgIH0KLSNlbmRpZgogCiAgIC4gPSBBTElHTihUSFJFQURfU0laRSk7CS8qIGluaXRfdGFzayAqLwogICAuZGF0YS5pbml0X3Rhc2sgOiBBVChBRERSKC5kYXRhLmluaXRfdGFzaykgLSBMT0FEX09GRlNFVCkgewpAQCAtOTMsOTQgKzExMiwxMDIgQEAKIAogICAvKiBtaWdodCBnZXQgZnJlZWQgYWZ0ZXIgaW5pdCAqLwogICAuID0gQUxJR04oNDA5Nik7Ci0gIF9fc21wX2FsdF9iZWdpbiA9IC47Ci0gIF9fc21wX2FsdF9pbnN0cnVjdGlvbnMgPSAuOwogICAuc21wX2FsdGluc3RydWN0aW9ucyA6IEFUKEFERFIoLnNtcF9hbHRpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKKwlfX3NtcF9hbHRfYmVnaW4gPSAuOworCV9fc21wX2FsdF9pbnN0cnVjdGlvbnMgPSAuOwogCSooLnNtcF9hbHRpbnN0cnVjdGlvbnMpCisJX19zbXBfYWx0X2luc3RydWN0aW9uc19lbmQgPSAuOwogICB9Ci0gIF9fc21wX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsKICAgLiA9IEFMSUdOKDQpOwotICBfX3NtcF9sb2NrcyA9IC47CiAgIC5zbXBfbG9ja3MgOiBBVChBRERSKC5zbXBfbG9ja3MpIC0gTE9BRF9PRkZTRVQpIHsKKyAgCV9fc21wX2xvY2tzID0gLjsKIAkqKC5zbXBfbG9ja3MpCisJX19zbXBfbG9ja3NfZW5kID0gLjsKICAgfQotICBfX3NtcF9sb2Nrc19lbmQgPSAuOwogICAuc21wX2FsdGluc3RyX3JlcGxhY2VtZW50IDogQVQoQUREUiguc21wX2FsdGluc3RyX3JlcGxhY2VtZW50KSAtIExPQURfT0ZGU0VUKSB7CiAJKiguc21wX2FsdGluc3RyX3JlcGxhY2VtZW50KQorICAJX19zbXBfYWx0X2VuZCA9IC47CiAgIH0KKyAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0CisgICAqIEZvbGxvd2luZyBBTElHTigpIGlzIHJlcXVpcmVkIHRvIG1ha2Ugc3VyZSBubyBvdGhlciBkYXRhIGZhbGxzIG9uIHRoZQorICAgKiBzYW1lIHBhZ2Ugd2hlcmUgX19zbXBfYWx0X2VuZCBpcyBwb2ludGluZyBhcyB0aGF0IHBhZ2UgbWlnaHQgYmUgZnJlZWQKKyAgICogYWZ0ZXIgYm9vdC4gQWx3YXlzIG1ha2Ugc3VyZSB0aGF0IEFMSUdOKCkgZGlyZWN0aXZlIGlzIHByZXNlbnQgYWZ0ZXIKKyAgICogdGhlIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgX19zbXBfYWx0X2VuZC4KKyAgICovCiAgIC4gPSBBTElHTig0MDk2KTsKLSAgX19zbXBfYWx0X2VuZCA9IC47CiAKICAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0ICovCiAgIC4gPSBBTElHTig0MDk2KTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwotICBfX2luaXRfYmVnaW4gPSAuOwogICAuaW5pdC50ZXh0IDogQVQoQUREUiguaW5pdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7CisgIAlfX2luaXRfYmVnaW4gPSAuOwogCV9zaW5pdHRleHQgPSAuOwogCSooLmluaXQudGV4dCkKIAlfZWluaXR0ZXh0ID0gLjsKICAgfQogICAuaW5pdC5kYXRhIDogQVQoQUREUiguaW5pdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7ICooLmluaXQuZGF0YSkgfQogICAuID0gQUxJR04oMTYpOwotICBfX3NldHVwX3N0YXJ0ID0gLjsKLSAgLmluaXQuc2V0dXAgOiBBVChBRERSKC5pbml0LnNldHVwKSAtIExPQURfT0ZGU0VUKSB7ICooLmluaXQuc2V0dXApIH0KLSAgX19zZXR1cF9lbmQgPSAuOwotICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKKyAgLmluaXQuc2V0dXAgOiBBVChBRERSKC5pbml0LnNldHVwKSAtIExPQURfT0ZGU0VUKSB7CisgIAlfX3NldHVwX3N0YXJ0ID0gLjsKKwkqKC5pbml0LnNldHVwKQorICAJX19zZXR1cF9lbmQgPSAuOworICAgfQogICAuaW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmluaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpIHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkgCi0JKiguaW5pdGNhbGwyLmluaXQpIAotCSooLmluaXRjYWxsMy5pbml0KSAKLQkqKC5pbml0Y2FsbDQuaW5pdCkgCi0JKiguaW5pdGNhbGw1LmluaXQpIAotCSooLmluaXRjYWxsNi5pbml0KSAKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKyAgCV9faW5pdGNhbGxfc3RhcnQgPSAuOworCUlOSVRDQUxMUworICAJX19pbml0Y2FsbF9lbmQgPSAuOwogICB9Ci0gIF9faW5pdGNhbGxfZW5kID0gLjsKLSAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuY29uX2luaXRjYWxsLmluaXQgOiBBVChBRERSKC5jb25faW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworICAJX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwogCSooLmNvbl9pbml0Y2FsbC5pbml0KQorICAJX19jb25faW5pdGNhbGxfZW5kID0gLjsKICAgfQotICBfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwogICBTRUNVUklUWV9JTklUCiAgIC4gPSBBTElHTig0KTsKLSAgX19hbHRfaW5zdHJ1Y3Rpb25zID0gLjsKICAgLmFsdGluc3RydWN0aW9ucyA6IEFUKEFERFIoLmFsdGluc3RydWN0aW9ucykgLSBMT0FEX09GRlNFVCkgeworICAJX19hbHRfaW5zdHJ1Y3Rpb25zID0gLjsKIAkqKC5hbHRpbnN0cnVjdGlvbnMpCisJX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCA9IC47CiAgIH0KLSAgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCA9IC47IAogICAuYWx0aW5zdHJfcmVwbGFjZW1lbnQgOiBBVChBRERSKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgLSBMT0FEX09GRlNFVCkgewogCSooLmFsdGluc3RyX3JlcGxhY2VtZW50KQogICB9CisgIC4gPSBBTElHTig0KTsKKyAgLnBhcmFpbnN0cnVjdGlvbnMgOiBBVChBRERSKC5wYXJhaW5zdHJ1Y3Rpb25zKSAtIExPQURfT0ZGU0VUKSB7CisgIAlfX3N0YXJ0X3BhcmFpbnN0cnVjdGlvbnMgPSAuOworCSooLnBhcmFpbnN0cnVjdGlvbnMpCisgIAlfX3N0b3BfcGFyYWluc3RydWN0aW9ucyA9IC47CisgIH0KICAgLyogLmV4aXQudGV4dCBpcyBkaXNjYXJkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aCByZWZlcmVuY2VzCiAgICAgIGZyb20gLmFsdGluc3RydWN0aW9ucyBhbmQgLmVoX2ZyYW1lICovCiAgIC5leGl0LnRleHQgOiBBVChBRERSKC5leGl0LnRleHQpIC0gTE9BRF9PRkZTRVQpIHsgKiguZXhpdC50ZXh0KSB9CiAgIC5leGl0LmRhdGEgOiBBVChBRERSKC5leGl0LmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsgKiguZXhpdC5kYXRhKSB9CiAgIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0cmFtZnNfc3RhcnQgPSAuOwotICAuaW5pdC5yYW1mcyA6IEFUKEFERFIoLmluaXQucmFtZnMpIC0gTE9BRF9PRkZTRVQpIHsgKiguaW5pdC5yYW1mcykgfQotICBfX2luaXRyYW1mc19lbmQgPSAuOworICAuaW5pdC5yYW1mcyA6IEFUKEFERFIoLmluaXQucmFtZnMpIC0gTE9BRF9PRkZTRVQpIHsKKwlfX2luaXRyYW1mc19zdGFydCA9IC47CisJKiguaW5pdC5yYW1mcykKKwlfX2luaXRyYW1mc19lbmQgPSAuOworICB9CiAgIC4gPSBBTElHTihMMV9DQUNIRV9CWVRFUyk7Ci0gIF9fcGVyX2NwdV9zdGFydCA9IC47Ci0gIC5kYXRhLnBlcmNwdSAgOiBBVChBRERSKC5kYXRhLnBlcmNwdSkgLSBMT0FEX09GRlNFVCkgeyAqKC5kYXRhLnBlcmNwdSkgfQotICBfX3Blcl9jcHVfZW5kID0gLjsKKyAgLmRhdGEucGVyY3B1ICA6IEFUKEFERFIoLmRhdGEucGVyY3B1KSAtIExPQURfT0ZGU0VUKSB7CisJX19wZXJfY3B1X3N0YXJ0ID0gLjsKKwkqKC5kYXRhLnBlcmNwdSkKKwlfX3Blcl9jcHVfZW5kID0gLjsKKyAgfQogICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwogICAvKiBmcmVlZCBhZnRlciBpbml0IGVuZHMgaGVyZSAqLwogCQotICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLSAgLmJzcy5wYWdlX2FsaWduZWQgOiBBVChBRERSKC5ic3MucGFnZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7Ci0JKiguYnNzLnBhZ2VfYWxpZ25lZCkKLSAgfQogICAuYnNzIDogQVQoQUREUiguYnNzKSAtIExPQURfT0ZGU0VUKSB7CisJX19pbml0X2VuZCA9IC47CisJX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTICovCisJKiguYnNzLnBhZ2VfYWxpZ25lZCkKIAkqKC5ic3MpCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0b3AgPSAuOworICAJX2VuZCA9IC4gOworCS8qIFRoaXMgaXMgd2hlcmUgdGhlIGtlcm5lbCBjcmVhdGVzIHRoZSBlYXJseSBib290IHBhZ2UgdGFibGVzICovCisJLiA9IEFMSUdOKDQwOTYpOworCXBnMCA9IC4gOwogICB9Ci0gIC4gPSBBTElHTig0KTsKLSAgX19ic3Nfc3RvcCA9IC47IAotCi0gIF9lbmQgPSAuIDsKLQotICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgY3JlYXRlcyB0aGUgZWFybHkgYm9vdCBwYWdlIHRhYmxlcyAqLwotICAuID0gQUxJR04oNDA5Nik7Ci0gIHBnMCA9IC47CiAKICAgLyogU2VjdGlvbnMgdG8gYmUgZGlzY2FyZGVkICovCiAgIC9ESVNDQVJELyA6IHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9saWIvdXNlcmNvcHkuYyBiL2FyY2gvaTM4Ni9saWIvdXNlcmNvcHkuYwppbmRleCAyNThkZjZiLi5kMjJjZmM5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbGliL3VzZXJjb3B5LmMKKysrIGIvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21teC5oPgogCkBAIC03NDEsNyArNzQyLDcgQEAKIAogCQkJaWYgKHJldHZhbCA9PSAtRU5PTUVNICYmIGlzX2luaXQoY3VycmVudCkpIHsKIAkJCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwkJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAkJCQlnb3RvIHN1cnZpdmU7CiAJCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvcHJvYmUuYyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvcHJvYmUuYwppbmRleCA5NGIxZmQ5Li5hN2IzOTk5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL3Byb2JlLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9wcm9iZS5jCkBAIC00NSw3ICs0NSw5IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIFBhcnNlZCBhZ2FpbiBieSBfX3NldHVwIGZvciBkZWJ1Zy92ZXJib3NlICovCisJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgiYXBpYyIsIHBhcnNlX2FwaWMpOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12aXN3cy9zZXR1cC5jIGIvYXJjaC9pMzg2L21hY2gtdmlzd3Mvc2V0dXAuYwppbmRleCA4ODVjN2NiLi4yMzNlZTIwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12aXN3cy9zZXR1cC5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3NldHVwLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CkBAIC0xNDIsNiArMTQzLDggQEAKIAogdW5zaWduZWQgbG9uZyBzZ2l2d2ZiX21lbV9waHlzOwogdW5zaWduZWQgbG9uZyBzZ2l2d2ZiX21lbV9zaXplOworRVhQT1JUX1NZTUJPTChzZ2l2d2ZiX21lbV9waHlzKTsKK0VYUE9SVF9TWU1CT0woc2dpdndmYl9tZW1fc2l6ZSk7CiAKIGxvbmcgbG9uZyBtZW1fc2l6ZSBfX2luaXRkYXRhID0gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3Mvdmlzd3NfYXBpYy5jIGIvYXJjaC9pMzg2L21hY2gtdmlzd3Mvdmlzd3NfYXBpYy5jCmluZGV4IDA3MDk3ZWQuLjM4YzJiMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3Zpc3dzX2FwaWMuYworKysgYi9hcmNoL2kzODYvbWFjaC12aXN3cy92aXN3c19hcGljLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgY29iYWx0X2lycV90eXBlID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjb2JhbHRfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0JIkNvYmFsdC1BUElDIiwKIAkuc3RhcnR1cCA9CXN0YXJ0dXBfY29iYWx0X2lycSwKIAkuc2h1dGRvd24gPQlkaXNhYmxlX2NvYmFsdF9pcnEsCkBAIC0xNTksNyArMTU5LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb2JhbHRfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHBpaXg0X21hc3Rlcl9pcnFfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcGlpeDRfbWFzdGVyX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9CSJQSUlYNC1tYXN0ZXIiLAogCS5zdGFydHVwID0Jc3RhcnR1cF9waWl4NF9tYXN0ZXJfaXJxLAogCS5hY2sgPQkJYWNrX2NvYmFsdF9pcnEsCkBAIC0xNjcsOSArMTY3LDggQEAKIH07CiAKIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBwaWl4NF92aXJ0dWFsX2lycV90eXBlID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwaWl4NF92aXJ0dWFsX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9CSJQSUlYNC12aXJ0dWFsIiwKLQkuc3RhcnR1cCA9CXN0YXJ0dXBfODI1OUFfaXJxLAogCS5zaHV0ZG93biA9CWRpc2FibGVfODI1OUFfaXJxLAogCS5lbmFibGUgPQllbmFibGVfODI1OUFfaXJxLAogCS5kaXNhYmxlID0JZGlzYWJsZV84MjU5QV9pcnEsCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfY2F0LmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfY2F0LmMKaW5kZXggZjUwYzZjNi4uOTQzYTk0NyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2NhdC5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9jYXQuYwpAQCAtNzc2LDcgKzc3Niw3IEBACiAJCWZvcihhc2ljPTA7IGFzaWMgPCAoKm1vZHBwKS0+bnVtX2FzaWNzOyBhc2ljKyspIHsKIAkJCWludCBqOwogCQkJdm95YWdlcl9hc2ljX3QgKmFzaWNwID0gKmFzaWNwcCAKLQkJCQk9IGttYWxsb2Moc2l6ZW9mKHZveWFnZXJfYXNpY190KSwgR0ZQX0tFUk5FTCk7IC8qJnZveWFnZXJfYXNpY19zdG9yYWdlW2FzaWNfY291bnQrK107Ki8KKwkJCQk9IGt6YWxsb2Moc2l6ZW9mKHZveWFnZXJfYXNpY190KSwgR0ZQX0tFUk5FTCk7IC8qJnZveWFnZXJfYXNpY19zdG9yYWdlW2FzaWNfY291bnQrK107Ki8KIAkJCXZveWFnZXJfc3BfdGFibGVfdCAqc3BfdGFibGU7CiAJCQl2b3lhZ2VyX2F0X3QgKmFzaWNfdGFibGU7CiAJCQl2b3lhZ2VyX2p0dF90ICpqdGFnX3RhYmxlOwpAQCAtNzg1LDcgKzc4NSw2IEBACiAJCQkJcHJpbnRrKCIqKldBUk5JTkcqKiBrbWFsbG9jIGZhaWx1cmUgaW4gY2F0X2luaXRcbiIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJbWVtc2V0KGFzaWNwLCAwLCBzaXplb2Yodm95YWdlcl9hc2ljX3QpKTsKIAkJCWFzaWNwcCA9ICYoYXNpY3AtPm5leHQpOwogCQkJYXNpY3AtPmFzaWNfbG9jYXRpb24gPSBhc2ljOwogCQkJc3BfdGFibGUgPSAodm95YWdlcl9zcF90YWJsZV90ICopKGVwcm9tX2J1ZiArIHNwX29mZnNldCk7CkBAIC04NTEsOCArODUwLDcgQEAKICNlbmRpZgogCiAJCXsKLQkJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSxHRlBfS0VSTkVMKTsKLQkJCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSxHRlBfS0VSTkVMKTsKIAkJCXJlcy0+bmFtZSA9IGttYWxsb2MoMTI4LCBHRlBfS0VSTkVMKTsKIAkJCXNwcmludGYoKGNoYXIgKilyZXMtPm5hbWUsICJWb3lhZ2VyICVzIFF1YWQgQ1BJIiwgY2F0X21vZHVsZV9uYW1lKGkpKTsKIAkJCXJlcy0+c3RhcnQgPSBxaWNfYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYwppbmRleCBmM2ZlYTJhLi41NTQyOGU2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3NtcC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KIAogLyogVExCIHN0YXRlIC0tIHZpc2libGUgZXh0ZXJuYWxseSwgaW5kZXhlZCBwaHlzaWNhbGx5ICovCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGxiX3N0YXRlLCBjcHVfdGxic3RhdGUpIF9fX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsgJmluaXRfbW0sIDAgfTsKQEAgLTQyMiw2ICs0MjMsNyBAQAogCSAgICAgVk9ZQUdFUl9TVVNfSU5fQ09OVFJPTF9QT1JUKTsKIAogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1ID0gYm9vdF9jcHVfaWQ7CisJd3JpdGVfcGRhKGNwdV9udW1iZXIsIGJvb3RfY3B1X2lkKTsKIH0KIAogLyoKQEAgLTQ1OCw3ICs0NjAsNyBAQAogCS8qIGV4dGVybmFsIGZ1bmN0aW9ucyBub3QgZGVmaW5lZCBpbiB0aGUgaGVhZGVycyAqLwogCWV4dGVybiB2b2lkIGNhbGlicmF0ZV9kZWxheSh2b2lkKTsKIAotCWNwdV9pbml0KCk7CisJc2Vjb25kYXJ5X2NwdV9pbml0KCk7CiAKIAkvKiBPSywgd2UncmUgaW4gdGhlIHJvdXRpbmUgKi8KIAlhY2tfQ1BJKFZJQ19DUFVfQk9PVF9DUEkpOwpAQCAtNTc4LDYgKzU4MCwxNSBAQAogCS8qIGluaXRfdGFza3MgKGluIHNjaGVkLmMpIGlzIGluZGV4ZWQgbG9naWNhbGx5ICovCiAJc3RhY2tfc3RhcnQuZXNwID0gKHZvaWQgKikgaWRsZS0+dGhyZWFkLmVzcDsKIAorCS8qIFByZS1hbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgQ1BVJ3MgR0RUIGFuZCBQREEgc28gaXQKKwkgICBkb2Vzbid0IGhhdmUgdG8gZG8gYW55IG1lbW9yeSBhbGxvY2F0aW9uIGR1cmluZyB0aGUKKwkgICBkZWxpY2F0ZSBDUFUtYnJpbmd1cCBwaGFzZS4gKi8KKwlpZiAoIWluaXRfZ2R0KGNwdSwgaWRsZSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ291bGRuJ3QgYWxsb2NhdGUgR0RUL1BEQSBmb3IgQ1BVICVkXG4iLCBjcHUpOworCQljcHVjb3VudC0tOworCQlyZXR1cm47CisJfQorCiAJaXJxX2N0eF9pbml0KGNwdSk7CiAKIAkvKiBOb3RlOiBEb24ndCBtb2RpZnkgaW5pdGlhbCBzcyBvdmVycmlkZSAqLwpAQCAtMTk2Myw0ICsxOTc0LDUgQEAKIHNtcF9zZXR1cF9wcm9jZXNzb3JfaWQodm9pZCkKIHsKIAljdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXdyaXRlX3BkYShjcHVfbnVtYmVyLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2VtdS5oIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9lbXUuaAppbmRleCBkNjJiMjBhLi42NTEyMGY1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2VtdS5oCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW11LmgKQEAgLTU3LDYgKzU3LDcgQEAKICNkZWZpbmUgVEFHX1NwZWNpYWwJQ29uc3QoMikJLyogRGUtbm9ybWFsLCArIG9yIC0gaW5maW5pdHksCiAJCQkJCSAgIG9yIE5vdCBhIE51bWJlciAqLwogI2RlZmluZSBUQUdfRW1wdHkJQ29uc3QoMykJLyogZW1wdHkgKi8KKyNkZWZpbmUgVEFHX0Vycm9yCUNvbnN0KDB4ODApCS8qIHByb2JhYmx5IG5lZWQgdG8gYWJvcnQgKi8KIAogI2RlZmluZSBMT0FERURfREFUQQlDb25zdCgxMDEwMSkJLyogU3BlY2lhbCBzdCgpIG51bWJlciB0byBpZGVudGlmeQogCQkJCQkgICBsb2FkZWQgZGF0YSAobm90IG9uIHN0YWNrKS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW50cnkuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW50cnkuYwppbmRleCBkOTNmMTZlLi5kZGY4ZmEzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2VudHJ5LmMKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9lbnRyeS5jCkBAIC03NDIsNyArNzQyLDggQEAKICAgUzM4Ny0+ZmNzICY9IH4weGY4MDAwMDAwOwogICBTMzg3LT5mb3MgfD0gMHhmZmZmMDAwMDsKICNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KLSAgX19jb3B5X3RvX3VzZXIoZCwgJlMzODctPmN3ZCwgNyo0KTsKKyAgaWYgKF9fY29weV90b191c2VyKGQsICZTMzg3LT5jd2QsIDcqNCkpCisgICAgcmV0dXJuIC0xOwogICBSRV9FTlRSQU5UX0NIRUNLX09OOwogCiAgIGQgKz0gNyo0OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9zeXN0ZW0uaCBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfc3lzdGVtLmgKaW5kZXggYmYyNjM0MS4uYTNhZTI4YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9zeXN0ZW0uaAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3N5c3RlbS5oCkBAIC02OCw2ICs2OCw3IEBACiAKICNkZWZpbmUgRlBVX2FjY2Vzc19vayh4LHkseikJaWYgKCAhYWNjZXNzX29rKHgseSx6KSApIFwKIAkJCQltYXRoX2Fib3J0KEZQVV9pbmZvLFNJR1NFR1YpCisjZGVmaW5lIEZQVV9hYm9ydAkJbWF0aF9hYm9ydChGUFVfaW5mbywgU0lHU0VHVikKIAogI3VuZGVmIEZQVV9JR05PUkVfQ09ERV9TRUdWCiAjaWZkZWYgRlBVX0lHTk9SRV9DT0RFX1NFR1YKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9sb2FkX3N0b3JlLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvbG9hZF9zdG9yZS5jCmluZGV4IDg1MzE0YmUuLmVlYmQ2ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9sb2FkX3N0b3JlLmMKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2xvYWRfc3RvcmUuYwpAQCAtMjI3LDYgKzIyNyw4IEBACiAgICAgY2FzZSAwMjc6ICAgICAgLyogZmlsZCBtNjRpbnQgKi8KICAgICAgIGNsZWFyX0MxKCk7CiAgICAgICBsb2FkZWRfdGFnID0gRlBVX2xvYWRfaW50NjQoKGxvbmcgbG9uZyBfX3VzZXIgKilkYXRhX2FkZHJlc3MpOworICAgICAgaWYgKGxvYWRlZF90YWcgPT0gVEFHX0Vycm9yKQorCXJldHVybiAwOwogICAgICAgRlBVX3NldHRhZzAobG9hZGVkX3RhZyk7CiAgICAgICBicmVhazsKICAgICBjYXNlIDAzMDogICAgIC8qIGZzdGVudiAgbTE0LzI4Ynl0ZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19sZF9zdHIuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfbGRfc3RyLmMKaW5kZXggZjA2ZWQ0MS4uZTk3NmNhZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19sZF9zdHIuYworKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2xkX3N0ci5jCkBAIC0yNDQsNyArMjQ0LDggQEAKIAogICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKICAgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwgX3MsIDgpOwotICBjb3B5X2Zyb21fdXNlcigmcyxfcyw4KTsKKyAgaWYgKGNvcHlfZnJvbV91c2VyKCZzLF9zLDgpKQorICAgIEZQVV9hYm9ydDsKICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKIAogICBpZiAocyA9PSAwKQpAQCAtOTA3LDcgKzkwOCw4IEBACiAKICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CiAgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLGQsOCk7Ci0gIGNvcHlfdG9fdXNlcihkLCAmdGxsLCA4KTsKKyAgaWYgKGNvcHlfdG9fdXNlcihkLCAmdGxsLCA4KSkKKyAgICBGUFVfYWJvcnQ7CiAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CiAKICAgcmV0dXJuIDE7CkBAIC0xMzM2LDcgKzEzMzgsOCBAQAogICAgICAgSTM4Ny5zb2Z0LmZjcyAmPSB+MHhmODAwMDAwMDsKICAgICAgIEkzODcuc29mdC5mb3MgfD0gMHhmZmZmMDAwMDsKICNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KLSAgICAgIF9fY29weV90b191c2VyKGQsICZjb250cm9sX3dvcmQsIDcqNCk7CisgICAgICBpZiAoX19jb3B5X3RvX3VzZXIoZCwgJmNvbnRyb2xfd29yZCwgNyo0KSkKKwlGUFVfYWJvcnQ7CiAgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOwogICAgICAgZCArPSAweDFjOwogICAgIH0KQEAgLTEzNTksOSArMTM2MiwxMSBAQAogICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkLDgwKTsKIAogICAvKiBDb3B5IGFsbCByZWdpc3RlcnMgaW4gc3RhY2sgb3JkZXIuICovCi0gIF9fY29weV90b191c2VyKGQsIHJlZ2lzdGVyX2Jhc2Urb2Zmc2V0LCBvdGhlcik7CisgIGlmIChfX2NvcHlfdG9fdXNlcihkLCByZWdpc3Rlcl9iYXNlK29mZnNldCwgb3RoZXIpKQorICAgIEZQVV9hYm9ydDsKICAgaWYgKCBvZmZzZXQgKQotICAgIF9fY29weV90b191c2VyKGQrb3RoZXIsIHJlZ2lzdGVyX2Jhc2UsIG9mZnNldCk7CisgICAgaWYgKF9fY29weV90b191c2VyKGQrb3RoZXIsIHJlZ2lzdGVyX2Jhc2UsIG9mZnNldCkpCisgICAgICBGUFVfYWJvcnQ7CiAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CiAKICAgZmluaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9ib290X2lvcmVtYXAuYyBiL2FyY2gvaTM4Ni9tbS9ib290X2lvcmVtYXAuYwppbmRleCA0ZGUxMWY1Li40ZGU5NWExIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vYm9vdF9pb3JlbWFwLmMKKysrIGIvYXJjaC9pMzg2L21tL2Jvb3RfaW9yZW1hcC5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI3VuZGVmIENPTkZJR19YODZfUEFFCisjdW5kZWYgQ09ORklHX1BBUkFWSVJUCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jIGIvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jCmluZGV4IGRkYmRiMDMuLjEwM2I3NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYworKysgYi9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCWlmIChuaWQgJiYgbm9kZV9oYXNfb25saW5lX21lbShuaWQpKQogCQlOT0RFX0RBVEEobmlkKSA9IChwZ19kYXRhX3QgKilub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF07CiAJZWxzZSB7Ci0JCU5PREVfREFUQShuaWQpID0gKHBnX2RhdGFfdCAqKShfX3ZhKG1pbl9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpKTsKKwkJTk9ERV9EQVRBKG5pZCkgPSAocGdfZGF0YV90ICopKHBmbl90b19rYWRkcihtaW5fbG93X3BmbikpOwogCQltaW5fbG93X3BmbiArPSBQRk5fVVAoc2l6ZW9mKHBnX2RhdGFfdCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9mYXVsdC5jIGIvYXJjaC9pMzg2L21tL2ZhdWx0LmMKaW5kZXggMjU4MTU3NS4uYWFhYTRkMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9pMzg2L21tL2ZhdWx0LmMKQEAgLTIyLDkgKzIyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CkBAIC0xNjcsNyArMTY3LDcgQEAKIHN0YXRpYyBpbnQgX19pc19wcmVmZXRjaChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyKQogeyAKIAl1bnNpZ25lZCBsb25nIGxpbWl0OwotCXVuc2lnbmVkIGxvbmcgaW5zdHIgPSBnZXRfc2VnbWVudF9laXAgKHJlZ3MsICZsaW1pdCk7CisJdW5zaWduZWQgY2hhciAqaW5zdHIgPSAodW5zaWduZWQgY2hhciAqKWdldF9zZWdtZW50X2VpcCAocmVncywgJmxpbWl0KTsKIAlpbnQgc2Nhbl9tb3JlID0gMTsKIAlpbnQgcHJlZmV0Y2ggPSAwOyAKIAlpbnQgaTsKQEAgLTE3Nyw5ICsxNzcsOSBAQAogCQl1bnNpZ25lZCBjaGFyIGluc3RyX2hpOwogCQl1bnNpZ25lZCBjaGFyIGluc3RyX2xvOwogCi0JCWlmIChpbnN0ciA+IGxpbWl0KQorCQlpZiAoaW5zdHIgPiAodW5zaWduZWQgY2hhciAqKWxpbWl0KQogCQkJYnJlYWs7Ci0JCWlmIChfX2dldF91c2VyKG9wY29kZSwgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIGluc3RyKSkKKwkJaWYgKHByb2JlX2tlcm5lbF9hZGRyZXNzKGluc3RyLCBvcGNvZGUpKQogCQkJYnJlYWs7IAogCiAJCWluc3RyX2hpID0gb3Bjb2RlICYgMHhmMDsgCkBAIC0yMDQsOSArMjA0LDkgQEAKIAkJY2FzZSAweDAwOgogCQkJLyogUHJlZmV0Y2ggaW5zdHJ1Y3Rpb24gaXMgMHgwRjBEIG9yIDB4MEYxOCAqLwogCQkJc2Nhbl9tb3JlID0gMDsKLQkJCWlmIChpbnN0ciA+IGxpbWl0KQorCQkJaWYgKGluc3RyID4gKHVuc2lnbmVkIGNoYXIgKilsaW1pdCkKIAkJCQlicmVhazsKLQkJCWlmIChfX2dldF91c2VyKG9wY29kZSwgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIGluc3RyKSkKKwkJCWlmIChwcm9iZV9rZXJuZWxfYWRkcmVzcyhpbnN0ciwgb3Bjb2RlKSkKIAkJCQlicmVhazsKIAkJCXByZWZldGNoID0gKGluc3RyX2xvID09IDB4RikgJiYKIAkJCQkob3Bjb2RlID09IDB4MEQgfHwgb3Bjb2RlID09IDB4MTgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2hpZ2htZW0uYyBiL2FyY2gvaTM4Ni9tbS9oaWdobWVtLmMKaW5kZXggZjlmNjQ3Yy4uZTBmYTZjYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2hpZ2htZW0uYworKysgYi9hcmNoL2kzODYvbW0vaGlnaG1lbS5jCkBAIC0zMiw3ICszMiw3IEBACiAJdW5zaWduZWQgbG9uZyB2YWRkcjsKIAogCS8qIGV2ZW4gIUNPTkZJR19QUkVFTVBUIG5lZWRzIHRoaXMsIGZvciBpbl9hdG9taWMgaW4gZG9fcGFnZV9mYXVsdCAqLwotCWluY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKIAlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKQogCQlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCkBAIC01MCwyNiArNTAsMjIgQEAKIAl1bnNpZ25lZCBsb25nIHZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGt2YWRkciAmIFBBR0VfTUFTSzsKIAllbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHggPSB0eXBlICsgS01fVFlQRV9OUipzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLSNpZmRlZiBDT05GSUdfREVCVUdfSElHSE1FTQotCWlmICh2YWRkciA+PSBQQUdFX09GRlNFVCAmJiB2YWRkciA8ICh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5KSB7Ci0JCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0JCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHZhZGRyICE9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4raWR4KSkKLQkJQlVHKCk7Ci0jZW5kaWYKIAkvKgogCSAqIEZvcmNlIG90aGVyIG1hcHBpbmdzIHRvIE9vcHMgaWYgdGhleSdsbCB0cnkgdG8gYWNjZXNzIHRoaXMgcHRlCiAJICogd2l0aG91dCBmaXJzdCByZW1hcCBpdC4gIEtlZXBpbmcgc3RhbGUgbWFwcGluZ3MgYXJvdW5kIGlzIGEgYmFkIGlkZWEKIAkgKiBhbHNvLCBpbiBjYXNlIHRoZSBwYWdlIGNoYW5nZXMgY2FjaGVhYmlsaXR5IGF0dHJpYnV0ZXMgb3IgYmVjb21lcwogCSAqIGEgcHJvdGVjdGVkIHBhZ2UgaW4gYSBoeXBlcnZpc29yLgogCSAqLwotCWtwdGVfY2xlYXJfZmx1c2goa21hcF9wdGUtaWR4LCB2YWRkcik7CisJaWYgKHZhZGRyID09IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4raWR4KSkKKwkJa3B0ZV9jbGVhcl9mbHVzaChrbWFwX3B0ZS1pZHgsIHZhZGRyKTsKKwllbHNlIHsKKyNpZmRlZiBDT05GSUdfREVCVUdfSElHSE1FTQorCQlCVUdfT04odmFkZHIgPCBQQUdFX09GRlNFVCk7CisJCUJVR19PTih2YWRkciA+PSAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSk7CisjZW5kaWYKKwl9CiAKLQlkZWNfcHJlZW1wdF9jb3VudCgpOwotCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKIH0KIAogLyogVGhpcyBpcyB0aGUgc2FtZSBhcyBrbWFwX2F0b21pYygpIGJ1dCBjYW4gbWFwIG1lbW9yeSB0aGF0IGRvZXNuJ3QKQEAgLTgwLDcgKzc2LDcgQEAKIAllbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHg7CiAJdW5zaWduZWQgbG9uZyB2YWRkcjsKIAotCWluY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKIAogCWlkeCA9IHR5cGUgKyBLTV9UWVBFX05SKnNtcF9wcm9jZXNzb3JfaWQoKTsKIAl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4gKyBpZHgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL2kzODYvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCAxNzE5YTgxLi4zNDcyOGU0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL2kzODYvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtMTcsNiArMTcsMTEzIEBACiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3RhYmxlX3NoYXJlYWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnN2bWEsCisJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBhZGRyLCBwZ29mZl90IGlkeCkKK3sKKwl1bnNpZ25lZCBsb25nIHNhZGRyID0gKChpZHggLSBzdm1hLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVCkgKworCQkJCXN2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2Jhc2UgPSBzYWRkciAmIFBVRF9NQVNLOworCXVuc2lnbmVkIGxvbmcgc19lbmQgPSBzYmFzZSArIFBVRF9TSVpFOworCisJLyoKKwkgKiBtYXRjaCB0aGUgdmlydHVhbCBhZGRyZXNzZXMsIHBlcm1pc3Npb24gYW5kIHRoZSBhbGlnbm1lbnQgb2YgdGhlCisJICogcGFnZSB0YWJsZSBwYWdlLgorCSAqLworCWlmIChwbWRfaW5kZXgoYWRkcikgIT0gcG1kX2luZGV4KHNhZGRyKSB8fAorCSAgICB2bWEtPnZtX2ZsYWdzICE9IHN2bWEtPnZtX2ZsYWdzIHx8CisJICAgIHNiYXNlIDwgc3ZtYS0+dm1fc3RhcnQgfHwgc3ZtYS0+dm1fZW5kIDwgc19lbmQpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNhZGRyOworfQorCitzdGF0aWMgaW50IHZtYV9zaGFyZWFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBhZGRyICYgUFVEX01BU0s7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBiYXNlICsgUFVEX1NJWkU7CisKKwkvKgorCSAqIGNoZWNrIG9uIHByb3BlciB2bV9mbGFncyBhbmQgcGFnZSB0YWJsZSBhbGlnbm1lbnQKKwkgKi8KKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFICYmCisJICAgIHZtYS0+dm1fc3RhcnQgPD0gYmFzZSAmJiBlbmQgPD0gdm1hLT52bV9lbmQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogc2VhcmNoIGZvciBhIHNoYXJlYWJsZSBwbWQgcGFnZSBmb3IgaHVnZXRsYi4KKyAqLworc3RhdGljIHZvaWQgaHVnZV9wbWRfc2hhcmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHVkX3QgKnB1ZCkKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nOworCXBnb2ZmX3QgaWR4ID0gKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCkgKworCQkJdm1hLT52bV9wZ29mZjsKKwlzdHJ1Y3QgcHJpb190cmVlX2l0ZXIgaXRlcjsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnN2bWE7CisJdW5zaWduZWQgbG9uZyBzYWRkcjsKKwlwdGVfdCAqc3B0ZSA9IE5VTEw7CisKKwlpZiAoIXZtYV9zaGFyZWFibGUodm1hLCBhZGRyKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZtYXBwaW5nLT5pX21tYXBfbG9jayk7CisJdm1hX3ByaW9fdHJlZV9mb3JlYWNoKHN2bWEsICZpdGVyLCAmbWFwcGluZy0+aV9tbWFwLCBpZHgsIGlkeCkgeworCQlpZiAoc3ZtYSA9PSB2bWEpCisJCQljb250aW51ZTsKKworCQlzYWRkciA9IHBhZ2VfdGFibGVfc2hhcmVhYmxlKHN2bWEsIHZtYSwgYWRkciwgaWR4KTsKKwkJaWYgKHNhZGRyKSB7CisJCQlzcHRlID0gaHVnZV9wdGVfb2Zmc2V0KHN2bWEtPnZtX21tLCBzYWRkcik7CisJCQlpZiAoc3B0ZSkgeworCQkJCWdldF9wYWdlKHZpcnRfdG9fcGFnZShzcHRlKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXNwdGUpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlpZiAocHVkX25vbmUoKnB1ZCkpCisJCXB1ZF9wb3B1bGF0ZShtbSwgcHVkLCAodW5zaWduZWQgbG9uZykgc3B0ZSAmIFBBR0VfTUFTSyk7CisJZWxzZQorCQlwdXRfcGFnZSh2aXJ0X3RvX3BhZ2Uoc3B0ZSkpOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKK291dDoKKwlzcGluX3VubG9jaygmbWFwcGluZy0+aV9tbWFwX2xvY2spOworfQorCisvKgorICogdW5tYXAgaHVnZSBwYWdlIGJhY2tlZCBieSBzaGFyZWQgcHRlLgorICoKKyAqIEh1Z2V0bGIgcHRlIHBhZ2UgaXMgcmVmIGNvdW50ZWQgYXQgdGhlIHRpbWUgb2YgbWFwcGluZy4gIElmIHB0ZSBpcyBzaGFyZWQKKyAqIGluZGljYXRlZCBieSBwYWdlX2NvdW50ID4gMSwgdW5tYXAgaXMgYWNoaWV2ZWQgYnkgY2xlYXJpbmcgcHVkIGFuZAorICogZGVjcmVtZW50aW5nIHRoZSByZWYgY291bnQuIElmIGNvdW50ID09IDEsIHRoZSBwdGUgcGFnZSBpcyBub3Qgc2hhcmVkLgorICoKKyAqIGNhbGxlZCB3aXRoIHZtYS0+dm1fbW0tPnBhZ2VfdGFibGVfbG9jayBoZWxkLgorICoKKyAqIHJldHVybnM6IDEgc3VjY2Vzc2Z1bGx5IHVubWFwcGVkIGEgc2hhcmVkIHB0ZSBwYWdlCisgKgkgICAgMCB0aGUgdW5kZXJseWluZyBwdGUgcGFnZSBpcyBub3Qgc2hhcmVkLCBvciBpdCBpcyB0aGUgbGFzdCB1c2VyCisgKi8KK2ludCBodWdlX3BtZF91bnNoYXJlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICphZGRyLCBwdGVfdCAqcHRlcCkKK3sKKwlwZ2RfdCAqcGdkID0gcGdkX29mZnNldChtbSwgKmFkZHIpOworCXB1ZF90ICpwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgKmFkZHIpOworCisJQlVHX09OKHBhZ2VfY291bnQodmlydF90b19wYWdlKHB0ZXApKSA9PSAwKTsKKwlpZiAocGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2UocHRlcCkpID09IDEpCisJCXJldHVybiAwOworCisJcHVkX2NsZWFyKHB1ZCk7CisJcHV0X3BhZ2UodmlydF90b19wYWdlKHB0ZXApKTsKKwkqYWRkciA9IEFMSUdOKCphZGRyLCBIUEFHRV9TSVpFICogUFRSU19QRVJfUFRFKSAtIEhQQUdFX1NJWkU7CisJcmV0dXJuIDE7Cit9CisKIHB0ZV90ICpodWdlX3B0ZV9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXBnZF90ICpwZ2Q7CkBAIC0yNSw4ICsxMzIsMTEgQEAKIAogCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOwogCXB1ZCA9IHB1ZF9hbGxvYyhtbSwgcGdkLCBhZGRyKTsKLQlpZiAocHVkKQorCWlmIChwdWQpIHsKKwkJaWYgKHB1ZF9ub25lKCpwdWQpKQorCQkJaHVnZV9wbWRfc2hhcmUobW0sIGFkZHIsIHB1ZCk7CiAJCXB0ZSA9IChwdGVfdCAqKSBwbWRfYWxsb2MobW0sIHB1ZCwgYWRkcik7CisJfQogCUJVR19PTihwdGUgJiYgIXB0ZV9ub25lKCpwdGUpICYmICFwdGVfaHVnZSgqcHRlKSk7CiAKIAlyZXR1cm4gcHRlOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2luaXQuYyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKaW5kZXggMTY3NDE2MS4uODQ2OTdkZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2luaXQuYworKysgYi9hcmNoL2kzODYvbW0vaW5pdC5jCkBAIC0xOTIsOCArMTkyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotZXh0ZXJuIGludCBpc19hdmFpbGFibGVfbWVtb3J5KGVmaV9tZW1vcnlfZGVzY190ICopOwotCiBpbnQgcGFnZV9pc19yYW0odW5zaWduZWQgbG9uZyBwYWdlbnIpCiB7CiAJaW50IGk7CkBAIC02OTksOCArNjk3LDggQEAKICNlbmRpZgogI2VuZGlmCiAKLWttZW1fY2FjaGVfdCAqcGdkX2NhY2hlOwota21lbV9jYWNoZV90ICpwbWRfY2FjaGU7CitzdHJ1Y3Qga21lbV9jYWNoZSAqcGdkX2NhY2hlOworc3RydWN0IGttZW1fY2FjaGUgKnBtZF9jYWNoZTsKIAogdm9pZCBfX2luaXQgcGd0YWJsZV9jYWNoZV9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vcGFnZWF0dHIuYyBiL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jCmluZGV4IDg1NjRiNmEuLmFkOTE1MjggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jCkBAIC02NywxMSArNjcsMTcgQEAKIAlyZXR1cm4gYmFzZTsKIH0gCiAKLXN0YXRpYyB2b2lkIGZsdXNoX2tlcm5lbF9tYXAodm9pZCAqZHVtbXkpIAorc3RhdGljIHZvaWQgZmx1c2hfa2VybmVsX21hcCh2b2lkICphcmcpCiB7IAotCS8qIENvdWxkIHVzZSBDTEZMVVNIIGhlcmUgaWYgdGhlIENQVSBzdXBwb3J0cyBpdCAoSGFtbWVyLFA0KSAqLwotCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+PSA0KSAKKwl1bnNpZ25lZCBsb25nIGFkciA9ICh1bnNpZ25lZCBsb25nKWFyZzsKKworCWlmIChhZHIgJiYgY3B1X2hhc19jbGZsdXNoKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFOyBpICs9IGJvb3RfY3B1X2RhdGEueDg2X2NsZmx1c2hfc2l6ZSkKKwkJCWFzbSB2b2xhdGlsZSgiY2xmbHVzaCAoJTApIiA6OiAiciIgKGFkciArIGkpKTsKKwl9IGVsc2UgaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID49IDQpCiAJCXdiaW52ZCgpOworCiAJLyogRmx1c2ggYWxsIHRvIHdvcmsgYXJvdW5kIEVycmF0YSBpbiBlYXJseSBhdGhsb25zIHJlZ2FyZGluZyAKIAkgKiBsYXJnZSBwYWdlIGZsdXNoaW5nLiAKIAkgKi8KQEAgLTE3Myw5ICsxNzksOSBAQAogCXJldHVybiAwOwogfSAKIAotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX21hcCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX21hcCh2b2lkICphZHIpCiB7Ci0Jb25fZWFjaF9jcHUoZmx1c2hfa2VybmVsX21hcCwgTlVMTCwgMSwgMSk7CisJb25fZWFjaF9jcHUoZmx1c2hfa2VybmVsX21hcCwgYWRyLCAxLCAxKTsKIH0KIAogLyoKQEAgLTIxNyw5ICsyMjMsMTMgQEAKIAlzcGluX2xvY2tfaXJxKCZjcGFfbG9jayk7CiAJbGlzdF9yZXBsYWNlX2luaXQoJmRmX2xpc3QsICZsKTsKIAlzcGluX3VubG9ja19pcnEoJmNwYV9sb2NrKTsKLQlmbHVzaF9tYXAoKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGcsIG5leHQsICZsLCBscnUpCisJaWYgKCFjcHVfaGFzX2NsZmx1c2gpCisJCWZsdXNoX21hcCgwKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGcsIG5leHQsICZsLCBscnUpIHsKKwkJaWYgKGNwdV9oYXNfY2xmbHVzaCkKKwkJCWZsdXNoX21hcChwYWdlX2FkZHJlc3MocGcpKTsKIAkJX19mcmVlX3BhZ2UocGcpOworCX0KIH0KIAogI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMgYi9hcmNoL2kzODYvbW0vcGd0YWJsZS5jCmluZGV4IDEwMTI2ZTMuLmYzNDllYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9pMzg2L21tL3BndGFibGUuYwpAQCAtOTUsOCArOTUsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIHZhZGRyKTsKLQkvKiA8cGZuLGZsYWdzPiBzdG9yZWQgYXMtaXMsIHRvIHBlcm1pdCBjbGVhcmluZyBlbnRyaWVzICovCi0Jc2V0X3B0ZShwdGUsIHBmbl9wdGUocGZuLCBmbGFncykpOworCWlmIChwZ3Byb3RfdmFsKGZsYWdzKSkKKwkJLyogPHBmbixmbGFncz4gc3RvcmVkIGFzLWlzLCB0byBwZXJtaXQgY2xlYXJpbmcgZW50cmllcyAqLworCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwZm4sIGZsYWdzKSk7CisJZWxzZQorCQlwdGVfY2xlYXIoJmluaXRfbW0sIHZhZGRyLCBwdGUpOwogCiAJLyoKIAkgKiBJdCdzIGVub3VnaCB0byBmbHVzaCB0aGlzIG9uZSBtYXBwaW5nLgpAQCAtMTkzLDcgKzE5Niw3IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotdm9pZCBwbWRfY3Rvcih2b2lkICpwbWQsIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit2b2lkIHBtZF9jdG9yKHZvaWQgKnBtZCwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCW1lbXNldChwbWQsIDAsIFBUUlNfUEVSX1BNRCpzaXplb2YocG1kX3QpKTsKIH0KQEAgLTIzMyw3ICsyMzYsNyBAQAogCQlzZXRfcGFnZV9wcml2YXRlKG5leHQsICh1bnNpZ25lZCBsb25nKXBwcmV2KTsKIH0KIAotdm9pZCBwZ2RfY3Rvcih2b2lkICpwZ2QsIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgdW51c2VkKQordm9pZCBwZ2RfY3Rvcih2b2lkICpwZ2QsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgdW5zaWduZWQgbG9uZyB1bnVzZWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjUzLDcgKzI1Niw3IEBACiB9CiAKIC8qIG5ldmVyIGNhbGxlZCB3aGVuIFBUUlNfUEVSX1BNRCA+IDEgKi8KLXZvaWQgcGdkX2R0b3Iodm9pZCAqcGdkLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIHVudXNlZCkKK3ZvaWQgcGdkX2R0b3Iodm9pZCAqcGdkLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgdW51c2VkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IC8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2NvbW1vbi5jIGIvYXJjaC9pMzg2L3BjaS9jb21tb24uYwppbmRleCA2OGJjZTE5NC4uNTNjYTZlOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCkBAIC0yMCw2ICsyMCw3IEBACiB1bnNpZ25lZCBpbnQgcGNpX3Byb2JlID0gUENJX1BST0JFX0JJT1MgfCBQQ0lfUFJPQkVfQ09ORjEgfCBQQ0lfUFJPQkVfQ09ORjIgfAogCQkJCVBDSV9QUk9CRV9NTUNPTkY7CiAKK3N0YXRpYyBpbnQgcGNpX2JmX3NvcnQ7CiBpbnQgcGNpX3JvdXRlaXJxOwogaW50IHBjaWJpb3NfbGFzdF9idXMgPSAtMTsKIHVuc2lnbmVkIGxvbmcgcGlycV90YWJsZV9hZGRyOwpAQCAtMTE4LDYgKzExOSwyMCBAQAogfQogCiAvKgorICogT25seSB1c2UgRE1JIGluZm9ybWF0aW9uIHRvIHNldCB0aGlzIGlmIG5vdGhpbmcgd2FzIHBhc3NlZAorICogb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgKHdoaWNoIHdhcyBwYXJzZWQgZWFybGllcikuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgc2V0X2JmX3NvcnQoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJaWYgKHBjaV9iZl9zb3J0ID09IHBjaV9iZl9zb3J0X2RlZmF1bHQpIHsKKwkJcGNpX2JmX3NvcnQgPSBwY2lfZG1pX2JmOworCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6ICVzIGRldGVjdGVkLCBlbmFibGluZyBwY2k9YmZzb3J0LlxuIiwgZC0+aWRlbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKICAqIEVuYWJsZSByZW51bWJlcmluZyBvZiBQQ0kgYnVzIyByYW5nZXMgdG8gcmVhY2ggYWxsIFBDSSBidXNzZXMgKENhcmRidXMpCiAgKi8KICNpZmRlZiBfX2kzODZfXwpAQCAtMTMwLDExICsxNDUsMTEgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19kZXZpbml0ZGF0YSBwY2lwcm9iZV9kbWlfdGFibGVbXSA9IHsKKyNpZmRlZiBfX2kzODZfXwogLyoKICAqIExhcHRvcHMgd2hpY2ggbmVlZCBwY2k9YXNzaWduLWJ1c3NlcyB0byBzZWUgQ2FyZGJ1cyBjYXJkcwogICovCi1zdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19kZXZpbml0ZGF0YSBwY2lwcm9iZV9kbWlfdGFibGVbXSA9IHsKLSNpZmRlZiBfX2kzODZfXwogCXsKIAkJLmNhbGxiYWNrID0gYXNzaWduX2FsbF9idXNzZXMsCiAJCS5pZGVudCA9ICJTYW1zdW5nIFgyMCBMYXB0b3AiLApAQCAtMTQ0LDYgKzE1OSwzOCBAQAogCQl9LAogCX0sCiAjZW5kaWYJCS8qIF9faTM4Nl9fICovCisJeworCQkuY2FsbGJhY2sgPSBzZXRfYmZfc29ydCwKKwkJLmlkZW50ID0gIkRlbGwgUG93ZXJFZGdlIDE5NTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG93ZXJFZGdlIDE5NTAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gc2V0X2JmX3NvcnQsCisJCS5pZGVudCA9ICJEZWxsIFBvd2VyRWRnZSAxOTU1IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvd2VyRWRnZSAxOTU1IiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IHNldF9iZl9zb3J0LAorCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMjkwMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQb3dlckVkZ2UgMjkwMCIpLAorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBzZXRfYmZfc29ydCwKKwkJLmlkZW50ID0gIkRlbGwgUG93ZXJFZGdlIDI5NTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG93ZXJFZGdlIDI5NTAiKSwKKwkJfSwKKwl9LAogCXt9CiB9OwogCkBAIC0xODksNiArMjM2LDggQEAKIAogCXBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KCk7CiAKKwlpZiAocGNpX2JmX3NvcnQgPj0gcGNpX2ZvcmNlX2JmKQorCQlwY2lfc29ydF9icmVhZHRoZmlyc3QoKTsKICNpZmRlZiBDT05GSUdfUENJX0JJT1MKIAlpZiAoKHBjaV9wcm9iZSAmIFBDSV9CSU9TX1NPUlQpICYmICEocGNpX3Byb2JlICYgUENJX05PX1NPUlQpKQogCQlwY2liaW9zX3NvcnQoKTsKQEAgLTIwMyw2ICsyNTIsMTIgQEAKIAlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkgewogCQlwY2lfcHJvYmUgPSAwOwogCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYmZzb3J0IikpIHsKKwkJcGNpX2JmX3NvcnQgPSBwY2lfZm9yY2VfYmY7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub2Jmc29ydCIpKSB7CisJCXBjaV9iZl9zb3J0ID0gcGNpX2ZvcmNlX25vYmY7CisJCXJldHVybiBOVUxMOwogCX0KICNpZmRlZiBDT05GSUdfUENJX0JJT1MKIAllbHNlIGlmICghc3RyY21wKHN0ciwgImJpb3MiKSkgewpAQCAtMjg4LDcgKzM0Myw2IEBACiAKIHZvaWQgcGNpYmlvc19kaXNhYmxlX2RldmljZSAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlwY2liaW9zX2Rpc2FibGVfcmVzb3VyY2VzKGRldik7CiAJaWYgKHBjaWJpb3NfZGlzYWJsZV9pcnEpCiAJCXBjaWJpb3NfZGlzYWJsZV9pcnEoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvZWFybHkuYyBiL2FyY2gvaTM4Ni9wY2kvZWFybHkuYwppbmRleCA3MTNkNmM4Li40MmRmNGI2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2Vhcmx5LmMKKysrIGIvYXJjaC9pMzg2L3BjaS9lYXJseS5jCkBAIC00NSw2ICs0NSwxMyBAQAogCW91dGwodmFsLCAweGNmYyk7CiB9CiAKK3ZvaWQgd3JpdGVfcGNpX2NvbmZpZ19ieXRlKHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0LCB1OCB2YWwpCit7CisJUERwcmludGsoIiV4IHdyaXRpbmcgdG8gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHZhbCk7CisJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOworCW91dGIodmFsLCAweGNmYyk7Cit9CisKIGludCBlYXJseV9wY2lfYWxsb3dlZCh2b2lkKQogewogCXJldHVybiAocGNpX3Byb2JlICYgKFBDSV9QUk9CRV9DT05GMXxQQ0lfUFJPQkVfTk9FQVJMWSkpID09CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2ZpeHVwLmMgYi9hcmNoL2kzODYvcGNpL2ZpeHVwLmMKaW5kZXggYjYwZDdlOC4uY2RlMTE3MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9maXh1cC5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvZml4dXAuYwpAQCAtNzQsNTIgKzc0LDYgQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX05DUiwgUENJX0RFVklDRV9JRF9OQ1JfNTNDODEwLCBwY2lfZml4dXBfbmNyNTNjODEwKTsKIAotc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF9pZGVfYmFzZXMoc3RydWN0IHBjaV9kZXYgKmQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFBDSSBJREUgY29udHJvbGxlcnMgdXNlIG5vbi1zdGFuZGFyZCBJL08gcG9ydCBkZWNvZGluZywgcmVzcGVjdCBpdC4KLQkgKi8KLQlpZiAoKGQtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKLQkJcmV0dXJuOwotCURCRygiUENJOiBJREUgYmFzZSBhZGRyZXNzIGZpeHVwIGZvciAlc1xuIiwgcGNpX25hbWUoZCkpOwotCWZvcihpPTA7IGk8NDsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkLT5yZXNvdXJjZVtpXTsKLQkJaWYgKChyLT5zdGFydCAmIH4weDgwKSA9PSAweDM3NCkgewotCQkJci0+c3RhcnQgfD0gMjsKLQkJCXItPmVuZCA9IHItPnN0YXJ0OwotCQl9Ci0JfQotfQotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9maXh1cF9pZGVfYmFzZXMpOwotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgIHBjaV9maXh1cF9pZGVfdHJhc2goc3RydWN0IHBjaV9kZXYgKmQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFJ1bnMgdGhlIGZpeHVwIG9ubHkgZm9yIHRoZSBmaXJzdCBJREUgY29udHJvbGxlcgotCSAqIChTaGFpIEZ1bHRoZWltIC0gc2hhaUBmdGNvbi5jb20pCi0JICovCi0Jc3RhdGljIGludCBjYWxsZWQgPSAwOwotCWlmIChjYWxsZWQpCi0JCXJldHVybjsKLQljYWxsZWQgPSAxOwotCi0JLyoKLQkgKiBUaGVyZSBleGlzdCBQQ0kgSURFIGNvbnRyb2xsZXJzIHdoaWNoIGhhdmUgdXR0ZXIgZ2FyYmFnZQotCSAqIGluIGZpcnN0IGZvdXIgYmFzZSByZWdpc3RlcnMuIElnbm9yZSB0aGF0LgotCSAqLwotCURCRygiUENJOiBJREUgYmFzZSBhZGRyZXNzIHRyYXNoIGNsZWFyZWQgZm9yICVzXG4iLCBwY2lfbmFtZShkKSk7Ci0JZm9yKGk9MDsgaTw0OyBpKyspCi0JCWQtPnJlc291cmNlW2ldLnN0YXJ0ID0gZC0+cmVzb3VyY2VbaV0uZW5kID0gZC0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOwotfQotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNTUxMywgcGNpX2ZpeHVwX2lkZV90cmFzaCk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEwLCBwY2lfZml4dXBfaWRlX3RyYXNoKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTEsIHBjaV9maXh1cF9pZGVfdHJhc2gpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl85LCBwY2lfZml4dXBfaWRlX3RyYXNoKTsKLQogc3RhdGljIHZvaWQgX19kZXZpbml0ICBwY2lfZml4dXBfbGF0ZW5jeShzdHJ1Y3QgcGNpX2RldiAqZCkKIHsKIAkvKgpAQCAtMzQ4LDggKzMwMiw4IEBACiAgKiBGcm9tIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5ICJKb24gU21pcmwiIDxqb25zbWlybEBnbWFpbC5jb20+CiAgKgogICogVGhlIHN0YW5kYXJkIGJvb3QgUk9NIHNlcXVlbmNlIGZvciBhbiB4ODYgbWFjaGluZSB1c2VzIHRoZSBCSU9TCi0gKiB0byBzZWxlY3QgYW4gaW5pdGlhbCB2aWRlbyBjYXJkIGZvciBib290IGRpc3BsYXkuIFRoaXMgYm9vdCB2aWRlbyAKLSAqIGNhcmQgd2lsbCBoYXZlIGl0J3MgQklPUyBjb3BpZWQgdG8gQzAwMDAgaW4gc3lzdGVtIFJBTS4gCisgKiB0byBzZWxlY3QgYW4gaW5pdGlhbCB2aWRlbyBjYXJkIGZvciBib290IGRpc3BsYXkuIFRoaXMgYm9vdCB2aWRlbworICogY2FyZCB3aWxsIGhhdmUgaXQncyBCSU9TIGNvcGllZCB0byBDMDAwMCBpbiBzeXN0ZW0gUkFNLgogICogSU9SRVNPVVJDRV9ST01fU0hBRE9XIGlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBib290IHZpZGVvCiAgKiBjYXJkIHdpdGggdGhpcyBjb3B5LiBPbiBsYXB0b3BzIHRoaXMgY29weSBoYXMgdG8gYmUgdXNlZCBzaW5jZQogICogdGhlIG1haW4gUk9NIG1heSBiZSBjb21wcmVzc2VkIG9yIGNvbWJpbmVkIHdpdGggYW5vdGhlciBpbWFnZS4KQEAgLTM3MSw3ICszMjUsMTcgQEAKIAlidXMgPSBwZGV2LT5idXM7CiAJd2hpbGUgKGJ1cykgewogCQlicmlkZ2UgPSBidXMtPnNlbGY7Ci0JCWlmIChicmlkZ2UpIHsKKworCQkvKgorCQkgKiBGcm9tIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisJCSAqICJEYXZpZCBNaWxsZXIiIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorCQkgKiBUaGUgYnJpZGdlIGNvbnRyb2wgcmVnaXN0ZXIgaXMgdmFsaWQgZm9yIFBDSSBoZWFkZXIKKwkJICogdHlwZSBCUklER0UsIG9yIENBUkRCVVMuIEhvc3QgdG8gUENJIGNvbnRyb2xsZXJzIHVzZQorCQkgKiBQQ0kgaGVhZGVyIHR5cGUgTk9STUFMLgorCQkgKi8KKwkJaWYgKGJyaWRnZQorCQkgICAgJiYoKGJyaWRnZS0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkKKwkJICAgICAgIHx8KGJyaWRnZS0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0NBUkRCVVMpKSkgewogCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfQlJJREdFX0NPTlRST0wsCiAJCQkJCQkmY29uZmlnKTsKIAkJCWlmICghKGNvbmZpZyAmIFBDSV9CUklER0VfQ1RMX1ZHQSkpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2kzODYuYyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCmluZGV4IDEwMTU0YTIuLjQzMDA1ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCkBAIC0xMDQsMTYgKzEwNCwyNCBAQAogCS8qIERlcHRoLUZpcnN0IFNlYXJjaCBvbiBidXMgdHJlZSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCBidXNfbGlzdCwgbm9kZSkgewogCQlpZiAoKGRldiA9IGJ1cy0+c2VsZikpIHsKLQkJCWZvciAoaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7IGlkeCA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgeworCQkJZm9yIChpZHggPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsKKwkJCSAgICBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKIAkJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKIAkJCQlpZiAoIXItPmZsYWdzKQogCQkJCQljb250aW51ZTsKIAkJCQlwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOwotCQkJCWlmICghci0+c3RhcnQgfHwgIXByIHx8IHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkgewotCQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2Fubm90IGFsbG9jYXRlIHJlc291cmNlIHJlZ2lvbiAlZCBvZiBicmlkZ2UgJXNcbiIsIGlkeCwgcGNpX25hbWUoZGV2KSk7Ci0JCQkJCS8qIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSByZWdpb24uCi0JCQkJCSAgIEludmFsaWRhdGUgdGhlIHJlc291cmNlIHRvIHByZXZlbnQgY2hpbGQKLQkJCQkJICAgcmVzb3VyY2UgYWxsb2NhdGlvbnMgaW4gdGhpcyByYW5nZS4gKi8KKwkJCQlpZiAoIXItPnN0YXJ0IHx8ICFwciB8fAorCQkJCSAgICByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBhbGxvY2F0ZSAiCisJCQkJCQkicmVzb3VyY2UgcmVnaW9uICVkICIKKwkJCQkJCSJvZiBicmlkZ2UgJXNcbiIsCisJCQkJCQlpZHgsIHBjaV9uYW1lKGRldikpOworCQkJCQkvKgorCQkJCQkgKiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgcmVnaW9uLgorCQkJCQkgKiBJbnZhbGlkYXRlIHRoZSByZXNvdXJjZSB0byBwcmV2ZW50CisJCQkJCSAqIGNoaWxkIHJlc291cmNlIGFsbG9jYXRpb25zIGluIHRoaXMKKwkJCQkJICogcmFuZ2UuCisJCQkJCSAqLwogCQkJCQlyLT5mbGFncyA9IDA7CiAJCQkJfQogCQkJfQpAQCAtMTMxLDcgKzEzOSw3IEBACiAKIAlmb3JfZWFjaF9wY2lfZGV2KGRldikgewogCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7Ci0JCWZvcihpZHggPSAwOyBpZHggPCA2OyBpZHgrKykgeworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFBDSV9ST01fUkVTT1VSQ0U7IGlkeCsrKSB7CiAJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKIAkJCWlmIChyLT5wYXJlbnQpCQkvKiBBbHJlYWR5IGFsbG9jYXRlZCAqLwogCQkJCWNvbnRpbnVlOwpAQCAtMTQyLDExICsxNTAsMTUgQEAKIAkJCWVsc2UKIAkJCQlkaXNhYmxlZCA9ICEoY29tbWFuZCAmIFBDSV9DT01NQU5EX01FTU9SWSk7CiAJCQlpZiAocGFzcyA9PSBkaXNhYmxlZCkgewotCQkJCURCRygiUENJOiBSZXNvdXJjZSAlMDhseC0lMDhseCAoZj0lbHgsIGQ9JWQsIHA9JWQpXG4iLAorCQkJCURCRygiUENJOiBSZXNvdXJjZSAlMDhseC0lMDhseCAiCisJCQkJICAgICIoZj0lbHgsIGQ9JWQsIHA9JWQpXG4iLAogCQkJCSAgICByLT5zdGFydCwgci0+ZW5kLCByLT5mbGFncywgZGlzYWJsZWQsIHBhc3MpOwogCQkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7CiAJCQkJaWYgKCFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBhbGxvY2F0ZSByZXNvdXJjZSByZWdpb24gJWQgb2YgZGV2aWNlICVzXG4iLCBpZHgsIHBjaV9uYW1lKGRldikpOworCQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2Fubm90IGFsbG9jYXRlICIKKwkJCQkJCSJyZXNvdXJjZSByZWdpb24gJWQgIgorCQkJCQkJIm9mIGRldmljZSAlc1xuIiwKKwkJCQkJCWlkeCwgcGNpX25hbWUoZGV2KSk7CiAJCQkJCS8qIFdlJ2xsIGFzc2lnbiBhIG5ldyBhZGRyZXNzIGxhdGVyICovCiAJCQkJCXItPmVuZCAtPSByLT5zdGFydDsKIAkJCQkJci0+c3RhcnQgPSAwOwpAQCAtMTU2LDEyICsxNjgsMTYgQEAKIAkJaWYgKCFwYXNzKSB7CiAJCQlyID0gJmRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV07CiAJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9FTkFCTEUpIHsKLQkJCQkvKiBUdXJuIHRoZSBST00gb2ZmLCBsZWF2ZSB0aGUgcmVzb3VyY2UgcmVnaW9uLCBidXQga2VlcCBpdCB1bnJlZ2lzdGVyZWQuICovCisJCQkJLyogVHVybiB0aGUgUk9NIG9mZiwgbGVhdmUgdGhlIHJlc291cmNlIHJlZ2lvbiwKKwkJCQkgKiBidXQga2VlcCBpdCB1bnJlZ2lzdGVyZWQuICovCiAJCQkJdTMyIHJlZzsKLQkJCQlEQkcoIlBDSTogU3dpdGNoaW5nIG9mZiBST00gb2YgJXNcbiIsIHBjaV9uYW1lKGRldikpOworCQkJCURCRygiUENJOiBTd2l0Y2hpbmcgb2ZmIFJPTSBvZiAlc1xuIiwKKwkJCQkJcGNpX25hbWUoZGV2KSk7CiAJCQkJci0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfUk9NX0VOQUJMRTsKLQkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBkZXYtPnJvbV9iYXNlX3JlZywgJnJlZyk7Ci0JCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGRldi0+cm9tX2Jhc2VfcmVnLCByZWcgJiB+UENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CisJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwKKwkJCQkJCWRldi0+cm9tX2Jhc2VfcmVnLCAmcmVnKTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgZGV2LT5yb21fYmFzZV9yZWcsCisJCQkJCQlyZWcgJiB+UENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xNzMsOSArMTg5LDExIEBACiAJc3RydWN0IHJlc291cmNlICpyLCAqcHI7CiAKIAlpZiAoIShwY2lfcHJvYmUgJiBQQ0lfQVNTSUdOX1JPTVMpKSB7Ci0JCS8qIFRyeSB0byB1c2UgQklPUyBzZXR0aW5ncyBmb3IgUk9Ncywgb3RoZXJ3aXNlIGxldAotCQkgICBwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCkgYWxsb2NhdGUgdGhlIG5ldwotCQkgICBhZGRyZXNzZXMuICovCisJCS8qCisJCSAqIFRyeSB0byB1c2UgQklPUyBzZXR0aW5ncyBmb3IgUk9Ncywgb3RoZXJ3aXNlIGxldAorCQkgKiBwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCkgYWxsb2NhdGUgdGhlIG5ldworCQkgKiBhZGRyZXNzZXMuCisJCSAqLwogCQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewogCQkJciA9ICZkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOwogCQkJaWYgKCFyLT5mbGFncyB8fCAhci0+c3RhcnQpCkBAIC0yMTUsOSArMjMzLDkgQEAKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7Ci0JZm9yKGlkeCA9IDA7IGlkeCA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgeworCWZvciAoaWR4ID0gMDsgaWR4IDwgUENJX05VTV9SRVNPVVJDRVM7IGlkeCsrKSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1ZmYgKi8KLQkJaWYgKCEobWFzayAmICgxPDxpZHgpKSkKKwkJaWYgKCEobWFzayAmICgxIDw8IGlkeCkpKQogCQkJY29udGludWU7CiAKIAkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CkBAIC0yMjcsNyArMjQ1LDkgQEAKIAkJCQkoIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX0VOQUJMRSkpKQogCQkJY29udGludWU7CiAJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBwY2lfbmFtZShkZXYpKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZSAiCisJCQkJImJlY2F1c2Ugb2YgcmVzb3VyY2UgY29sbGlzaW9uc1xuIiwKKwkJCQlwY2lfbmFtZShkZXYpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCkBAIC0yMzYsMjEgKzI1NiwxMyBAQAogCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKIAl9CiAJaWYgKGNtZCAhPSBvbGRfY21kKSB7Ci0JCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7CisJCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsCisJCQlwY2lfbmFtZShkZXYpLCBvbGRfY21kLCBjbWQpOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcGNpYmlvc19kaXNhYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXUxNiBjbWQ7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQljbWQgJj0gfihQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSk7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci19Ci0KIC8qCiAgKiAgSWYgd2Ugc2V0IHVwIGEgZGV2aWNlIGZvciBidXMgbWFzdGVyaW5nLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBsYXRlbmN5CiAgKiAgdGltZXIgYXMgY2VydGFpbiBjcmFwcHkgQklPU2VzIGZvcmdldCB0byBzZXQgaXQgcHJvcGVybHkuCkBAIC0yNjcsNyArMjc5LDggQEAKIAkJbGF0ID0gcGNpYmlvc19tYXhfbGF0ZW5jeTsKIAllbHNlCiAJCXJldHVybjsKLQlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBTZXR0aW5nIGxhdGVuY3kgdGltZXIgb2YgZGV2aWNlICVzIHRvICVkXG4iLCBwY2lfbmFtZShkZXYpLCBsYXQpOworCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFNldHRpbmcgbGF0ZW5jeSB0aW1lciBvZiBkZXZpY2UgJXMgdG8gJWRcbiIsCisJCXBjaV9uYW1lKGRldiksIGxhdCk7CiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvaXJxLmMgYi9hcmNoL2kzODYvcGNpL2lycS5jCmluZGV4IGRiYzRhYWUuLmYyY2I5NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvaXJxLmMKKysrIGIvYXJjaC9pMzg2L3BjaS9pcnEuYwpAQCAtMjU1LDEzICsyNTUsMTMgQEAKICAqLwogc3RhdGljIGludCBwaXJxX3ZpYTU4Nl9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCiB7Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwaXJxbWFwWzRdID0geyAzLCAyLCA1LCAxIH07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwaXJxbWFwWzVdID0geyAzLCAyLCA1LCAxLCAxIH07CiAJcmV0dXJuIHJlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NTUsIHBpcnFtYXBbcGlycS0xXSk7CiB9CiAKIHN0YXRpYyBpbnQgcGlycV92aWE1ODZfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQogewotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGlycW1hcFs0XSA9IHsgMywgMiwgNSwgMSB9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGlycW1hcFs1XSA9IHsgMywgMiwgNSwgMSwgMSB9OwogCXdyaXRlX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDU1LCBwaXJxbWFwW3BpcnEtMV0sIGlycSk7CiAJcmV0dXJuIDE7CiB9CkBAIC01NDMsNiArNTQzLDEyIEBACiAJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzI6CiAJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzM6CiAJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQ6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzM6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzQ6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzU6CiAJCQlyLT5uYW1lID0gIlBJSVgvSUNIIjsKIAkJCXItPmdldCA9IHBpcnFfcGlpeF9nZXQ7CiAJCQlyLT5zZXQgPSBwaXJxX3BpaXhfc2V0OwpAQCAtNzU4LDcgKzc2NCw3IEBACiAJREJHKEtFUk5fREVCVUcgIlBDSTogQXR0ZW1wdGluZyB0byBmaW5kIElSUSByb3V0ZXIgZm9yICUwNHg6JTA0eFxuIiwKIAkgICAgcnQtPnJ0cl92ZW5kb3IsIHJ0LT5ydHJfZGV2aWNlKTsKIAotCXBpcnFfcm91dGVyX2RldiA9IHBjaV9maW5kX3Nsb3QocnQtPnJ0cl9idXMsIHJ0LT5ydHJfZGV2Zm4pOworCXBpcnFfcm91dGVyX2RldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KHJ0LT5ydHJfYnVzLCBydC0+cnRyX2RldmZuKTsKIAlpZiAoIXBpcnFfcm91dGVyX2RldikgewogCQlEQkcoS0VSTl9ERUJVRyAiUENJOiBJbnRlcnJ1cHQgcm91dGVyIG5vdCBmb3VuZCBhdCAiCiAJCQkiJTAyeDolMDJ4XG4iLCBydC0+cnRyX2J1cywgcnQtPnJ0cl9kZXZmbik7CkBAIC03NzgsNiArNzg0LDggQEAKIAkJcGlycV9yb3V0ZXJfZGV2LT52ZW5kb3IsCiAJCXBpcnFfcm91dGVyX2Rldi0+ZGV2aWNlLAogCQlwY2lfbmFtZShwaXJxX3JvdXRlcl9kZXYpKTsKKworCS8qIFRoZSBkZXZpY2UgcmVtYWlucyByZWZlcmVuY2VkIGZvciB0aGUga2VybmVsIGxpZmV0aW1lICovCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2luZm8gKnBpcnFfZ2V0X2luZm8oc3RydWN0IHBjaV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYyBiL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYwppbmRleCBkMGMzZGEzLi5jNmI2ZDliIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMKKysrIGIvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCkBAIC0xNTQsMzggKzE1NCw2IEBACiAJLndyaXRlID0JcGNpX21tY2ZnX3dyaXRlLAogfTsKIAotCi1zdGF0aWMgX19pbml0IHZvaWQgcGNpX21tY2ZnX2luc2VydF9yZXNvdXJjZXModm9pZCkKLXsKLSNkZWZpbmUgUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOIDE5Ci0JaW50IGk7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JY2hhciAqbmFtZXM7Ci0JdW5zaWduZWQgbnVtX2J1c2VzOwotCi0JcmVzID0ga2NhbGxvYyhQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4gKyBzaXplb2YoKnJlcyksCi0JCQlwY2lfbW1jZmdfY29uZmlnX251bSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIlBDSTogVW5hYmxlIHRvIGFsbG9jYXRlIE1NQ09ORklHIHJlc291cmNlc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQluYW1lcyA9ICh2b2lkICopJnJlc1twY2lfbW1jZmdfY29uZmlnX251bV07Ci0JZm9yIChpID0gMDsgaSA8IHBjaV9tbWNmZ19jb25maWdfbnVtOyBpKyssIHJlcysrKSB7Ci0JCW51bV9idXNlcyA9IHBjaV9tbWNmZ19jb25maWdbaV0uZW5kX2J1c19udW1iZXIgLQotCQkgICAgcGNpX21tY2ZnX2NvbmZpZ1tpXS5zdGFydF9idXNfbnVtYmVyICsgMTsKLQkJcmVzLT5uYW1lID0gbmFtZXM7Ci0JCXNucHJpbnRmKG5hbWVzLCBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4sICJQQ0kgTU1DT05GSUcgJXUiLAotCQkJcGNpX21tY2ZnX2NvbmZpZ1tpXS5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIpOwotCQlyZXMtPnN0YXJ0ID0gcGNpX21tY2ZnX2NvbmZpZ1tpXS5iYXNlX2FkZHJlc3M7Ci0JCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIChudW1fYnVzZXMgPDwgMjApIC0gMTsKLQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOwotCQlpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOwotCQluYW1lcyArPSBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU47Ci0JfQotfQotCiAvKiBLOCBzeXN0ZW1zIGhhdmUgc29tZSBkZXZpY2VzICh0eXBpY2FsbHkgaW4gdGhlIGJ1aWx0aW4gbm9ydGhicmlkZ2UpCiAgICB0aGF0IGFyZSBvbmx5IGFjY2Vzc2libGUgdXNpbmcgdHlwZTEKICAgIE5vcm1hbGx5IHRoaXMgY2FuIGJlIGV4cHJlc3NlZCBpbiB0aGUgTUNGRyBieSBub3QgbGlzdGluZyB0aGVtCkBAIC0yMjIsOCArMTkwLDYgQEAKIAl9CiB9CiAKLQotCiB2b2lkIF9faW5pdCBwY2lfbW1jZmdfaW5pdChpbnQgdHlwZSkKIHsKIAlpZiAoKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9NTUNPTkYpID09IDApCkBAIC0yNTEsNSArMjE3LDQgQEAKIAlwY2lfcHJvYmUgPSAocGNpX3Byb2JlICYgflBDSV9QUk9CRV9NQVNLKSB8IFBDSV9QUk9CRV9NTUNPTkY7CiAKIAl1bnJlYWNoYWJsZV9kZXZpY2VzKCk7Ci0JcGNpX21tY2ZnX2luc2VydF9yZXNvdXJjZXMoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvcGNiaW9zLmMgYi9hcmNoL2kzODYvcGNpL3BjYmlvcy5jCmluZGV4IGVkMTUxMmEuLjVmNTE5MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvcGNiaW9zLmMKKysrIGIvYXJjaC9pMzg2L3BjaS9wY2Jpb3MuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgInBjaS5oIgogI2luY2x1ZGUgInBjaS1mdW5jdGlvbnMuaCIKIApAQCAtMzE0LDYgKzMxNSwxMCBAQAogCWZvciAoY2hlY2sgPSAodW5pb24gYmlvczMyICopIF9fdmEoMHhlMDAwMCk7CiAJICAgICBjaGVjayA8PSAodW5pb24gYmlvczMyICopIF9fdmEoMHhmZmZmMCk7CiAJICAgICArK2NoZWNrKSB7CisJCWxvbmcgc2lnOworCQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoJmNoZWNrLT5maWVsZHMuc2lnbmF0dXJlLCBzaWcpKQorCQkJY29udGludWU7CisKIAkJaWYgKGNoZWNrLT5maWVsZHMuc2lnbmF0dXJlICE9IEJJT1MzMl9TSUdOQVRVUkUpCiAJCQljb250aW51ZTsKIAkJbGVuZ3RoID0gY2hlY2stPmZpZWxkcy5sZW5ndGggKiAxNjsKQEAgLTMzMSwxMSArMzM2LDEzIEBACiAJCX0KIAkJREJHKCJQQ0k6IEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSBzdHJ1Y3R1cmUgYXQgMHglcFxuIiwgY2hlY2spOwogCQlpZiAoY2hlY2stPmZpZWxkcy5lbnRyeSA+PSAweDEwMDAwMCkgewotCQkJcHJpbnRrKCJQQ0k6IEJJT1MzMiBlbnRyeSAoMHglcCkgaW4gaGlnaCBtZW1vcnksIGNhbm5vdCB1c2UuXG4iLCBjaGVjayk7CisJCQlwcmludGsoIlBDSTogQklPUzMyIGVudHJ5ICgweCVwKSBpbiBoaWdoIG1lbW9yeSwgIgorCQkJCQkiY2Fubm90IHVzZS5cbiIsIGNoZWNrKTsKIAkJCXJldHVybiBOVUxMOwogCQl9IGVsc2UgewogCQkJdW5zaWduZWQgbG9uZyBiaW9zMzJfZW50cnkgPSBjaGVjay0+ZmllbGRzLmVudHJ5OwotCQkJREJHKCJQQ0k6IEJJT1MzMiBTZXJ2aWNlIERpcmVjdG9yeSBlbnRyeSBhdCAweCVseFxuIiwgYmlvczMyX2VudHJ5KTsKKwkJCURCRygiUENJOiBCSU9TMzIgU2VydmljZSBEaXJlY3RvcnkgZW50cnkgYXQgMHglbHhcbiIsCisJCQkJCWJpb3MzMl9lbnRyeSk7CiAJCQliaW9zMzJfaW5kaXJlY3QuYWRkcmVzcyA9IGJpb3MzMl9lbnRyeSArIFBBR0VfT0ZGU0VUOwogCQkJaWYgKGNoZWNrX3BjaWJpb3MoKSkKIAkJCQlyZXR1cm4gJnBjaV9iaW9zX2FjY2VzczsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvcGNpLmggYi9hcmNoL2kzODYvcGNpL3BjaS5oCmluZGV4IDE4MTRmNzQuLmEwYTI1MTggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvcGNpLmgKKysrIGIvYXJjaC9pMzg2L3BjaS9wY2kuaApAQCAtMzAsMTMgKzMwLDE5IEBACiBleHRlcm4gdW5zaWduZWQgaW50IHBjaV9wcm9iZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBpcnFfdGFibGVfYWRkcjsKIAorZW51bSBwY2lfYmZfc29ydF9zdGF0ZSB7CisJcGNpX2JmX3NvcnRfZGVmYXVsdCwKKwlwY2lfZm9yY2Vfbm9iZiwKKwlwY2lfZm9yY2VfYmYsCisJcGNpX2RtaV9iZiwKK307CisKIC8qIHBjaS1pMzg2LmMgKi8KIAogZXh0ZXJuIHVuc2lnbmVkIGludCBwY2liaW9zX21heF9sYXRlbmN5OwogCiB2b2lkIHBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KHZvaWQpOwogaW50IHBjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqLCBpbnQpOwotdm9pZCBwY2liaW9zX2Rpc2FibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICopOwogCiAvKiBwY2ktcGMuYyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvTWFrZWZpbGUgYi9hcmNoL2kzODYvcG93ZXIvTWFrZWZpbGUKaW5kZXggOGNmYTRlOC4uMmRlN2JiZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3Bvd2VyL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9NYWtlZmlsZQpAQCAtMSwyICsxLDIgQEAKIG9iai0kKENPTkZJR19QTSkJCSs9IGNwdS5vCi1vYmotJChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkJKz0gc3dzdXNwLm8KK29iai0kKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQkrPSBzd3N1c3AubyBzdXNwZW5kLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wb3dlci9jcHUuYyBiL2FyY2gvaTM4Ni9wb3dlci9jcHUuYwppbmRleCA1YTFhYmVmLi4yYzE1NTAwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcG93ZXIvY3B1LmMKKysrIGIvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jCkBAIC0yNiw4ICsyNiw4IEBACiAJLyoKIAkgKiBkZXNjcmlwdG9yIHRhYmxlcwogCSAqLwotIAlzdG9yZV9nZHQoJmN0eHQtPmdkdF9saW1pdCk7Ci0gCXN0b3JlX2lkdCgmY3R4dC0+aWR0X2xpbWl0KTsKKyAJc3RvcmVfZ2R0KCZjdHh0LT5nZHQpOworIAlzdG9yZV9pZHQoJmN0eHQtPmlkdCk7CiAgCXN0b3JlX3RyKGN0eHQtPnRyKTsKIAogCS8qCkBAIC05OSw4ICs5OSw4IEBACiAJICogbm93IHJlc3RvcmUgdGhlIGRlc2NyaXB0b3IgdGFibGVzIHRvIHRoZWlyIHByb3BlciB2YWx1ZXMKIAkgKiBsdHIgaXMgZG9uZSBpIGZpeF9wcm9jZXNzb3JfY29udGV4dCgpLgogCSAqLwotIAlsb2FkX2dkdCgmY3R4dC0+Z2R0X2xpbWl0KTsKLSAJbG9hZF9pZHQoJmN0eHQtPmlkdF9saW1pdCk7CisgCWxvYWRfZ2R0KCZjdHh0LT5nZHQpOworIAlsb2FkX2lkdCgmY3R4dC0+aWR0KTsKIAogCS8qCiAJICogc2VnbWVudCByZWdpc3RlcnMKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wb3dlci9zdXNwZW5kLmMgYi9hcmNoL2kzODYvcG93ZXIvc3VzcGVuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNWU5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcG93ZXIvc3VzcGVuZC5jCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogU3VzcGVuZCBzdXBwb3J0IHNwZWNpZmljIGZvciBpMzg2IC0gdGVtcG9yYXJ5IHBhZ2UgdGFibGVzCisgKgorICogRGlzdHJpYnV0ZSB1bmRlciBHUEx2MgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKiBEZWZpbmVkIGluIGFyY2gvaTM4Ni9wb3dlci9zd3N1c3AuUyAqLworZXh0ZXJuIGludCByZXN0b3JlX2ltYWdlKHZvaWQpOworCisvKiBQb2ludGVyIHRvIHRoZSB0ZW1wb3JhcnkgcmVzdW1lIHBhZ2UgdGFibGVzICovCitwZ2RfdCAqcmVzdW1lX3BnX2RpcjsKKworLyogVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBhbmFsb2dvdXMgY29kZSBpbgorICogYXJjaC9pMzg2L21tL2luaXQuYworICovCisKKy8qCisgKiBDcmVhdGUgYSBtaWRkbGUgcGFnZSB0YWJsZSBvbiBhIHJlc3VtZS1zYWZlIHBhZ2UgYW5kIHB1dCBhIHBvaW50ZXIgdG8gaXQgaW4KKyAqIHRoZSBnaXZlbiBnbG9iYWwgZGlyZWN0b3J5IGVudHJ5LiAgVGhpcyBvbmx5IHJldHVybnMgdGhlIGdkIGVudHJ5CisgKiBpbiBub24tUEFFIGNvbXBpbGF0aW9uIG1vZGUsIHNpbmNlIHRoZSBtaWRkbGUgbGF5ZXIgaXMgZm9sZGVkLgorICovCitzdGF0aWMgcG1kX3QgKnJlc3VtZV9vbmVfbWRfdGFibGVfaW5pdChwZ2RfdCAqcGdkKQoreworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZF90YWJsZTsKKworI2lmZGVmIENPTkZJR19YODZfUEFFCisJcG1kX3RhYmxlID0gKHBtZF90ICopZ2V0X3NhZmVfcGFnZShHRlBfQVRPTUlDKTsKKwlpZiAoIXBtZF90YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzZXRfcGdkKHBnZCwgX19wZ2QoX19wYShwbWRfdGFibGUpIHwgX1BBR0VfUFJFU0VOVCkpOworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCAwKTsKKworCUJVR19PTihwbWRfdGFibGUgIT0gcG1kX29mZnNldChwdWQsIDApKTsKKyNlbHNlCisJcHVkID0gcHVkX29mZnNldChwZ2QsIDApOworCXBtZF90YWJsZSA9IHBtZF9vZmZzZXQocHVkLCAwKTsKKyNlbmRpZgorCisJcmV0dXJuIHBtZF90YWJsZTsKK30KKworLyoKKyAqIENyZWF0ZSBhIHBhZ2UgdGFibGUgb24gYSByZXN1bWUtc2FmZSBwYWdlIGFuZCBwbGFjZSBhIHBvaW50ZXIgdG8gaXQgaW4KKyAqIGEgbWlkZGxlIHBhZ2UgZGlyZWN0b3J5IGVudHJ5LgorICovCitzdGF0aWMgcHRlX3QgKnJlc3VtZV9vbmVfcGFnZV90YWJsZV9pbml0KHBtZF90ICpwbWQpCit7CisJaWYgKHBtZF9ub25lKCpwbWQpKSB7CisJCXB0ZV90ICpwYWdlX3RhYmxlID0gKHB0ZV90ICopZ2V0X3NhZmVfcGFnZShHRlBfQVRPTUlDKTsKKwkJaWYgKCFwYWdlX3RhYmxlKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJc2V0X3BtZChwbWQsIF9fcG1kKF9fcGEocGFnZV90YWJsZSkgfCBfUEFHRV9UQUJMRSkpOworCisJCUJVR19PTihwYWdlX3RhYmxlICE9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCkpOworCisJCXJldHVybiBwYWdlX3RhYmxlOworCX0KKworCXJldHVybiBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIDApOworfQorCisvKgorICogVGhpcyBtYXBzIHRoZSBwaHlzaWNhbCBtZW1vcnkgdG8ga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSwgYSB0b3RhbAorICogb2YgbWF4X2xvd19wZm4gcGFnZXMsIGJ5IGNyZWF0aW5nIHBhZ2UgdGFibGVzIHN0YXJ0aW5nIGZyb20gYWRkcmVzcworICogUEFHRV9PRkZTRVQuICBUaGUgcGFnZSB0YWJsZXMgYXJlIGFsbG9jYXRlZCBvdXQgb2YgcmVzdW1lLXNhZmUgcGFnZXMuCisgKi8KK3N0YXRpYyBpbnQgcmVzdW1lX3BoeXNpY2FsX21hcHBpbmdfaW5pdChwZ2RfdCAqcGdkX2Jhc2UpCit7CisJdW5zaWduZWQgbG9uZyBwZm47CisJcGdkX3QgKnBnZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGU7CisJaW50IHBnZF9pZHgsIHBtZF9pZHg7CisKKwlwZ2RfaWR4ID0gcGdkX2luZGV4KFBBR0VfT0ZGU0VUKTsKKwlwZ2QgPSBwZ2RfYmFzZSArIHBnZF9pZHg7CisJcGZuID0gMDsKKworCWZvciAoOyBwZ2RfaWR4IDwgUFRSU19QRVJfUEdEOyBwZ2QrKywgcGdkX2lkeCsrKSB7CisJCXBtZCA9IHJlc3VtZV9vbmVfbWRfdGFibGVfaW5pdChwZ2QpOworCQlpZiAoIXBtZCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChwZm4gPj0gbWF4X2xvd19wZm4pCisJCQljb250aW51ZTsKKworCQlmb3IgKHBtZF9pZHggPSAwOyBwbWRfaWR4IDwgUFRSU19QRVJfUE1EOyBwbWQrKywgcG1kX2lkeCsrKSB7CisJCQlpZiAocGZuID49IG1heF9sb3dfcGZuKQorCQkJCWJyZWFrOworCisJCQkvKiBNYXAgd2l0aCBiaWcgcGFnZXMgaWYgcG9zc2libGUsIG90aGVyd2lzZSBjcmVhdGUKKwkJCSAqIG5vcm1hbCBwYWdlIHRhYmxlcy4KKwkJCSAqIE5PVEU6IFdlIGNhbiBtYXJrIGV2ZXJ5dGhpbmcgYXMgZXhlY3V0YWJsZSBoZXJlCisJCQkgKi8KKwkJCWlmIChjcHVfaGFzX3BzZSkgeworCQkJCXNldF9wbWQocG1kLCBwZm5fcG1kKHBmbiwgUEFHRV9LRVJORUxfTEFSR0VfRVhFQykpOworCQkJCXBmbiArPSBQVFJTX1BFUl9QVEU7CisJCQl9IGVsc2UgeworCQkJCXB0ZV90ICptYXhfcHRlOworCisJCQkJcHRlID0gcmVzdW1lX29uZV9wYWdlX3RhYmxlX2luaXQocG1kKTsKKwkJCQlpZiAoIXB0ZSkKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCQltYXhfcHRlID0gcHRlICsgUFRSU19QRVJfUFRFOworCQkJCWZvciAoOyBwdGUgPCBtYXhfcHRlOyBwdGUrKywgcGZuKyspIHsKKwkJCQkJaWYgKHBmbiA+PSBtYXhfbG93X3BmbikKKwkJCQkJCWJyZWFrOworCisJCQkJCXNldF9wdGUocHRlLCBwZm5fcHRlKHBmbiwgUEFHRV9LRVJORUxfRVhFQykpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc3VtZV9pbml0X2ZpcnN0X2xldmVsX3BhZ2VfdGFibGUocGdkX3QgKnBnX2RpcikKK3sKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCWludCBpOworCisJLyogSW5pdCBlbnRyaWVzIG9mIHRoZSBmaXJzdC1sZXZlbCBwYWdlIHRhYmxlIHRvIHRoZSB6ZXJvIHBhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUEdEOyBpKyspCisJCXNldF9wZ2QocGdfZGlyICsgaSwKKwkJCV9fcGdkKF9fcGEoZW1wdHlfemVyb19wYWdlKSB8IF9QQUdFX1BSRVNFTlQpKTsKKyNlbmRpZgorfQorCitpbnQgc3dzdXNwX2FyY2hfcmVzdW1lKHZvaWQpCit7CisJaW50IGVycm9yOworCisJcmVzdW1lX3BnX2RpciA9IChwZ2RfdCAqKWdldF9zYWZlX3BhZ2UoR0ZQX0FUT01JQyk7CisJaWYgKCFyZXN1bWVfcGdfZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlc3VtZV9pbml0X2ZpcnN0X2xldmVsX3BhZ2VfdGFibGUocmVzdW1lX3BnX2Rpcik7CisJZXJyb3IgPSByZXN1bWVfcGh5c2ljYWxfbWFwcGluZ19pbml0KHJlc3VtZV9wZ19kaXIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyogV2UgaGF2ZSBnb3QgZW5vdWdoIG1lbW9yeSBhbmQgZnJvbSBub3cgb24gd2UgY2Fubm90IHJlY292ZXIgKi8KKwlyZXN0b3JlX2ltYWdlKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvc3dzdXNwLlMgYi9hcmNoL2kzODYvcG93ZXIvc3dzdXNwLlMKaW5kZXggOGEyYjUwYS4uNTM2NjJlMCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3Bvd2VyL3N3c3VzcC5TCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9zd3N1c3AuUwpAQCAtMjgsOCArMjgsOSBAQAogCWNhbGwgc3dzdXNwX3NhdmUKIAlyZXQKIAotRU5UUlkoc3dzdXNwX2FyY2hfcmVzdW1lKQotCW1vdmwJJHN3c3VzcF9wZ19kaXItX19QQUdFX09GRlNFVCwgJWVjeAorRU5UUlkocmVzdG9yZV9pbWFnZSkKKwltb3ZsCXJlc3VtZV9wZ19kaXIsICVlY3gKKwlzdWJsCSRfX1BBR0VfT0ZGU0VULCAlZWN4CiAJbW92bAklZWN4LCAlY3IzCiAKIAltb3ZsCXJlc3RvcmVfcGJsaXN0LCAlZWR4CkBAIC01MSw2ICs1MiwxMCBAQAogCS5wMmFsaWduIDQsLDcKIAogZG9uZToKKwkvKiBnbyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlcyAqLworCW1vdmwJJHN3YXBwZXJfcGdfZGlyLCAlZWN4CisJc3VibAkkX19QQUdFX09GRlNFVCwgJWVjeAorCW1vdmwJJWVjeCwgJWNyMwogCS8qIEZsdXNoIFRMQiwgaW5jbHVkaW5nICJnbG9iYWwiIHRoaW5ncyAodm1hbGxvYykgKi8KIAltb3ZsCW1tdV9jcjRfZmVhdHVyZXMsICVlYXgKIAltb3ZsCSVlYXgsICVlZHgKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggNzBmN2ViOS4uZmNhY2ZlMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTM0LDYgKzM0LDE0IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMzQxLDYgKzM0OSw3IEBACiAJYm9vbCAiTlVNQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gIUlBNjRfSFBfU0lNICYmICFGTEFUTUVNCiAJZGVmYXVsdCB5IGlmIElBNjRfU0dJX1NOMgorCXNlbGVjdCBBQ1BJX05VTUEgaWYgQUNQSQogCWhlbHAKIAkgIFNheSBZIHRvIGNvbXBpbGUgdGhlIGtlcm5lbCB0byBzdXBwb3J0IE5VTUEgKE5vbi1Vbmlmb3JtIE1lbW9yeQogCSAgQWNjZXNzKS4gIFRoaXMgb3B0aW9uIGlzIGZvciBjb25maWd1cmluZyBoaWdoLWVuZCBtdWx0aXByb2Nlc3NvcgpAQCAtNDMzLDYgKzQ0MiwyOSBAQAogCiBzb3VyY2UgImRyaXZlcnMvc24vS2NvbmZpZyIKIAorY29uZmlnIEtFWEVDCisJYm9vbCAia2V4ZWMgc3lzdGVtIGNhbGwgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgIUlBNjRfSFBfU0lNICYmICghU01QIHx8IEhPVFBMVUdfQ1BVKQorCWhlbHAKKwkgIGtleGVjIGlzIGEgc3lzdGVtIGNhbGwgdGhhdCBpbXBsZW1lbnRzIHRoZSBhYmlsaXR5IHRvIHNodXRkb3duIHlvdXIKKwkgIGN1cnJlbnQga2VybmVsLCBhbmQgdG8gc3RhcnQgYW5vdGhlciBrZXJuZWwuICBJdCBpcyBsaWtlIGEgcmVib290CisJICBidXQgaXQgaXMgaW5kZXBlZGVudCBvZiB0aGUgc3lzdGVtIGZpcm13YXJlLiAgIEFuZCBsaWtlIGEgcmVib290CisJICB5b3UgY2FuIHN0YXJ0IGFueSBrZXJuZWwgd2l0aCBpdCwgbm90IGp1c3QgTGludXguCisKKwkgIFRoZSBuYW1lIGNvbWVzIGZyb20gdGhlIHNpbWlsaWFyaXR5IHRvIHRoZSBleGVjIHN5c3RlbSBjYWxsLgorCisJICBJdCBpcyBhbiBvbmdvaW5nIHByb2Nlc3MgdG8gYmUgY2VydGFpbiB0aGUgaGFyZHdhcmUgaW4gYSBtYWNoaW5lCisJICBpcyBwcm9wZXJseSBzaHV0ZG93biwgc28gZG8gbm90IGJlIHN1cnByaXNlZCBpZiB0aGlzIGNvZGUgZG9lcyBub3QKKwkgIGluaXRpYWxseSB3b3JrIGZvciB5b3UuICBJdCBtYXkgaGVscCB0byBlbmFibGUgZGV2aWNlIGhvdHBsdWdnaW5nCisJICBzdXBwb3J0LiAgQXMgb2YgdGhpcyB3cml0aW5nIHRoZSBleGFjdCBoYXJkd2FyZSBpbnRlcmZhY2UgaXMKKwkgIHN0cm9uZ2x5IGluIGZsdXgsIHNvIG5vIGdvb2QgcmVjb21tZW5kYXRpb24gY2FuIGJlIG1hZGUuCisKK2NvbmZpZyBDUkFTSF9EVU1QCisJICBib29sICJrZXJuZWwgY3Jhc2ggZHVtcHMgKEVYUEVSSU1FTlRBTCkiCisJICBkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJQTY0X01DQV9SRUNPVkVSWSAmJiAhSUE2NF9IUF9TSU0gJiYgKCFTTVAgfHwgSE9UUExVR19DUFUpCisJICBoZWxwCisJICAgIEdlbmVyYXRlIGNyYXNoIGR1bXAgYWZ0ZXIgYmVpbmcgc3RhcnRlZCBieSBrZXhlYy4KKwogc291cmNlICJkcml2ZXJzL2Zpcm13YXJlL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZy5iaW5mbXQiCkBAIC00ODMsNiArNTE1LDE1IEBACiAKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCitjb25maWcgTVNQRUMKKwl0cmlzdGF0ZSAiTWVtb3J5IHNwZWNpYWwgb3BlcmF0aW9ucyBkcml2ZXIiCisJZGVwZW5kcyBvbiBJQTY0CisJc2VsZWN0IElBNjRfVU5DQUNIRURfQUxMT0NBVE9SCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gaWE2NCBhbmQgeW91IHdhbnQgdG8gZW5hYmxlIG1lbW9yeSBzcGVjaWFsCisJICBvcGVyYXRpb25zIHN1cHBvcnQgKGZvcm1lcmx5IGtub3duIGFzIGZldGNob3ApLCBzYXkgWSBoZXJlLAorCSAgb3RoZXJ3aXNlIHNheSBOLgorCiBzb3VyY2UgImZzL0tjb25maWciCiAKIHNvdXJjZSAibGliL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZwppbmRleCAwZjE0YTgyLi42NGU5NTFkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcKQEAgLTEsOCArMSw5IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTctcmMzCi0jIFRodSBBcHIgMjcgMTE6NDg6MjMgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjMQorIyBNb24gT2N0ICA5IDEwOjUzOjU5IDIwMDYKICMKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC0xOCwxNiArMTksMjIgQEAKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15CitDT05GSUdfVEFTS1NUQVRTPXkKKyMgQ09ORklHX1RBU0tfREVMQVlfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX0NQVVNFVFM9eQogQ09ORklHX1JFTEFZPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1RBU0tfWEFDQ1Q9eQorQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTQwLDYgKzQ3LDggQEAKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX1NMQUI9eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CkBAIC01OCw2ICs2Nyw3IEBACiAjCiAjIEJsb2NrIGxheWVyCiAjCitDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAKICMKQEAgLTg5LDcgKzk5LDcgQEAKIENPTkZJR19HRU5FUklDX0lPTUFQPXkKIENPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQogQ09ORklHX0lBNjRfVU5DQUNIRURfQUxMT0NBVE9SPXkKLUNPTkZJR19ETUFfSVNfRE1BMzI9eQorQ09ORklHX0FVRElUX0FSQ0g9eQogIyBDT05GSUdfSUE2NF9HRU5FUklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0lBNjRfRElHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lBNjRfSFBfWlgxIGlzIG5vdCBzZXQKQEAgLTExNiw2ICsxMjYsNyBAQAogQ09ORklHX1NNUD15CiBDT05GSUdfTlJfQ1BVUz0xMDI0CiAjIENPTkZJR19IT1RQTFVHX0NQVSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQogQ09ORklHX1NDSEVEX1NNVD15CiBDT05GSUdfUFJFRU1QVD15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0xMjgsNiArMTM5LDcgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIENPTkZJR19NSUdSQVRJT049eQorQ09ORklHX1JFU09VUkNFU182NEJJVD15CiBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEU9eQogQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQpAQCAtMTM1LDE1ICsxNDcsMjQgQEAKIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9ERUZBVUxUPXkKIENPTkZJR19OVU1BPXkKIENPTkZJR19OT0RFU19TSElGVD0xMAorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKIENPTkZJR19WSVJUVUFMX01FTV9NQVA9eQogQ09ORklHX0hPTEVTX0lOX1pPTkU9eQogQ09ORklHX0hBVkVfQVJDSF9FQVJMWV9QRk5fVE9fTklEPXkKK0NPTkZJR19IQVZFX0FSQ0hfTk9ERURBVEFfRVhURU5TSU9OPXkKIENPTkZJR19JQTMyX1NVUFBPUlQ9eQogQ09ORklHX0NPTVBBVD15CiBDT05GSUdfSUE2NF9NQ0FfUkVDT1ZFUlk9eQogQ09ORklHX1BFUkZNT049eQogQ09ORklHX0lBNjRfUEFMSU5GTz15CiBDT05GSUdfU0dJX1NOPXkKKyMgQ09ORklHX0lBNjRfRVNJIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCitDT05GSUdfU0dJX0lPQzQ9eQorQ09ORklHX1NHSV9JT0MzPXkKIAogIwogIyBGaXJtd2FyZSBEcml2ZXJzCkBAIC0xNTksNiArMTgwLDcgQEAKIENPTkZJR19QTT15CiAjIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUE1fU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAKICMKICMgQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBTdXBwb3J0CkBAIC0xNjYsNiArMTg4LDcgQEAKIENPTkZJR19BQ1BJPXkKICMgQ09ORklHX0FDUElfQlVUVE9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDUElfRkFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDUElfRE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ1BJX1BST0NFU1NPUiBpcyBub3Qgc2V0CiBDT05GSUdfQUNQSV9OVU1BPXkKIENPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTAKQEAgLTE4NSw3ICsyMDgsMTIgQEAKICMKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9ET01BSU5TPXkKK0NPTkZJR19QQ0lFUE9SVEJVUz15CitDT05GSUdfSE9UUExVR19QQ0lfUENJRT15CisjIENPTkZJR19IT1RQTFVHX1BDSV9QQ0lFX1BPTExfRVZFTlRfTU9ERSBpcyBub3Qgc2V0CitDT05GSUdfUENJRUFFUj15CiAjIENPTkZJR19QQ0lfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9NVUxUSVRIUkVBRF9QUk9CRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogCiAjCkBAIC0yMTUsNiArMjQzLDkgQEAKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1BBQ0tFVF9NTUFQPXkKIENPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiBDT05GSUdfSVBfTVVMVElDQVNUPXkKQEAgLTIzMSwxOSArMjYyLDMxIEBACiAjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPW0KIENPTkZJR19JTkVUX1RDUF9ESUFHPW0KICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKIENPTkZJR19JUFY2PW0KICMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X0FIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X0VTUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NSVA2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD1tCitDT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9bQorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfU1VCVFJFRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKICMKQEAgLTI2OSw3ICszMTIsNiBAQAogIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAogIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAKQEAgLTI5OCw2ICszNDAsNyBAQAogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogQ09ORklHX0ZXX0xPQURFUj15CiAjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogCiAjCiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKQEAgLTMzNSw2ICszNzgsNyBAQAogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiBDT05GSUdfQVRBX09WRVJfRVRIPW0KQEAgLTM4MSw2ICs0MjUsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9KTUlDUk9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lUODIxWCBpcyBub3Qgc2V0CkBAIC00MDQsNiArNDQ5LDcgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfTkVUTElOSz15CiBDT05GSUdfU0NTSV9QUk9DX0ZTPXkKIAogIwpAQCAtNDI1LDEyICs0NzEsMTQgQEAKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAKICMKLSMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIyBTQ1NJIFRyYW5zcG9ydHMKICMKIENPTkZJR19TQ1NJX1NQSV9BVFRSUz15CiBDT05GSUdfU0NTSV9GQ19BVFRSUz15CiBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUz1tCiBDT05GSUdfU0NTSV9TQVNfQVRUUlM9eQorQ09ORklHX1NDU0lfU0FTX0xJQlNBUz15CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVNfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKQEAgLTQ0Myw0NiArNDkxLDgyIEBACiAjIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1NBVEE9eQotIyBDT05GSUdfU0NTSV9TQVRBX0FIQ0kgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1NWVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FUQV9QSUlYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9NViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfTlYgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9QRENfQURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfUVNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1BST01JU0UgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1NYNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfU0lMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9TSUwyNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQV9VTEkgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1ZJQSBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TQVRBX1ZJVEVTU0U9eQorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwPXkKIENPTkZJR19TQ1NJX1FMQV9GQz15Ci1DT05GSUdfU0NTSV9RTEEyWFhYX0VNQkVEREVEX0ZJUk1XQVJFPXkKLSMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9RTEEyMlhYPXkKLUNPTkZJR19TQ1NJX1FMQTIzMDA9eQotQ09ORklHX1NDU0lfUUxBMjMyMj15Ci0jIENPTkZJR19TQ1NJX1FMQTI0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogCiAjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworQ09ORklHX0FUQT15CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSUEgaXMgbm90IHNldAorQ09ORklHX1NBVEFfVklURVNTRT15CisjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09MRFBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lMNjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfV0lOQk9ORCBpcyBub3Qgc2V0CisKKyMKICMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKICMKIENPTkZJR19NRD15CkBAIC00OTEsMTIgKzU3NSwxMiBAQAogQ09ORklHX01EX1JBSUQwPXkKIENPTkZJR19NRF9SQUlEMT15CiAjIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAotQ09ORklHX01EX1JBSUQ1PXkKK0NPTkZJR19NRF9SQUlENDU2PXkKICMgQ09ORklHX01EX1JBSUQ1X1JFU0hBUEUgaXMgbm90IHNldAotIyBDT05GSUdfTURfUkFJRDYgaXMgbm90IHNldAogQ09ORklHX01EX01VTFRJUEFUSD15CiAjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfRE09eQorIyBDT05GSUdfRE1fREVCVUcgaXMgbm90IHNldAogQ09ORklHX0RNX0NSWVBUPW0KIENPTkZJR19ETV9TTkFQU0hPVD1tCiBDT05GSUdfRE1fTUlSUk9SPW0KQEAgLTU2Myw2ICs2NDcsNyBAQAogIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CiBDT05GSUdfVElHT04zPXkKICMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCkBAIC01NzEsNiArNjU2LDcgQEAKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogQ09ORklHX1MySU89bQogIyBDT05GSUdfUzJJT19OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKQEAgLTYxMiw2ICs2OTgsNyBAQAogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTY0Niw2ICs3MzMsNyBAQAogQ09ORklHX1ZUPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKICMgQ09ORklHX0NPTVBVVE9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19ST0NLRVRQT1JUIGlzIG5vdCBzZXQKQEAgLTY1OSwxMCArNzQ3LDEyIEBACiAjIENPTkZJR19OX0hETEMgaXMgbm90IHNldAogIyBDT05GSUdfU1BFQ0lBTElYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFMRFJWIGlzIG5vdCBzZXQKIENPTkZJR19TR0lfU05TQz15CiBDT05GSUdfU0dJX1RJT0NYPXkKIENPTkZJR19TR0lfTUJDUz1tCitDT05GSUdfTVNQRUM9eQogCiAjCiAjIFNlcmlhbCBkcml2ZXJzCkBAIC03MDEsNiArNzkxLDcgQEAKICMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCiAjCiBDT05GSUdfQUdQPXkKKyMgQ09ORklHX0FHUF9TSVMgaXMgbm90IHNldAogIyBDT05GSUdfQUdQX1ZJQSBpcyBub3Qgc2V0CiBDT05GSUdfQUdQX1NHSV9USU9DQT15CiAjIENPTkZJR19EUk0gaXMgbm90IHNldApAQCAtNzMwLDcgKzgyMSw2IEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKQEAgLTc0MSw2ICs4MzEsNyBAQAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCkBAIC03NTYsNiArODQ3LDcgQEAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIworQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQogIyBDT05GSUdfRkIgaXMgbm90IHNldAogCiAjCkBAIC03NjQsNiArODU2LDcgQEAKIENPTkZJR19WR0FfQ09OU09MRT15CiAjIENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTc5NCw2ICs4ODcsNyBAQAogQ09ORklHX1VTQl9FSENJX0hDRD1tCiAjIENPTkZJR19VU0JfRUhDSV9TUExJVF9JU08gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9bQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTiBpcyBub3Qgc2V0CkBAIC04NDMsNiArOTM3LDcgQEAKICMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSW1hZ2luZyBkZXZpY2VzCkBAIC04NzQsMTUgKzk2OSwxOCBAQAogIwogIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAogCkBAIC05MTksMTggKzEwMTcsMTUgQEAKIENPTkZJR19JTkZJTklCQU5EPW0KICMgQ09ORklHX0lORklOSUJBTkRfVVNFUl9NQUQgaXMgbm90IHNldAogQ09ORklHX0lORklOSUJBTkRfVVNFUl9BQ0NFU1M9bQorQ09ORklHX0lORklOSUJBTkRfQUREUl9UUkFOUz15CiBDT05GSUdfSU5GSU5JQkFORF9NVEhDQT1tCiBDT05GSUdfSU5GSU5JQkFORF9NVEhDQV9ERUJVRz15CisjIENPTkZJR19JTkZJTklCQU5EX0FNU08xMTAwIGlzIG5vdCBzZXQKIENPTkZJR19JTkZJTklCQU5EX0lQT0lCPW0KIENPTkZJR19JTkZJTklCQU5EX0lQT0lCX0RFQlVHPXkKICMgQ09ORklHX0lORklOSUJBTkRfSVBPSUJfREVCVUdfREFUQSBpcyBub3Qgc2V0CiBDT05GSUdfSU5GSU5JQkFORF9TUlA9bQotCi0jCi0jIFNOIERldmljZXMKLSMKLUNPTkZJR19TR0lfSU9DND15Ci1DT05GSUdfU0dJX0lPQzM9eQorIyBDT05GSUdfSU5GSU5JQkFORF9JU0VSIGlzIG5vdCBzZXQKIAogIwogIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKQEAgLTk0Miw2ICsxMDM3LDE5IEBACiAjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAogCiAjCisjIERNQSBFbmdpbmUgc3VwcG9ydAorIworIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIENsaWVudHMKKyMKKworIworIyBETUEgRGV2aWNlcworIworCisjCiAjIEZpbGUgc3lzdGVtcwogIwogQ09ORklHX0VYVDJfRlM9eQpAQCAtOTY1LDE1ICsxMDczLDE2IEBACiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX1BPU0lYX0FDTD15CiBDT05GSUdfWEZTX0ZTPXkKLUNPTkZJR19YRlNfRVhQT1JUPXkKIENPTkZJR19YRlNfUVVPVEE9eQogIyBDT05GSUdfWEZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKIENPTkZJR19YRlNfUE9TSVhfQUNMPXkKIENPTkZJR19YRlNfUlQ9eQorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKIENPTkZJR19RVU9UQT15CiAjIENPTkZJR19RRk1UX1YxIGlzIG5vdCBzZXQKICMgQ09ORklHX1FGTVRfVjIgaXMgbm90IHNldApAQCAtMTAwNyw4ICsxMTE2LDEwIEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogQ09ORklHX0hVR0VUTEJGUz15CiBDT05GSUdfSFVHRVRMQl9QQUdFPXkKIENPTkZJR19SQU1GUz15CkBAIC0xMDQ2LDcgKzExNTcsNyBAQAogQ09ORklHX05GU0RfVENQPXkKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQotQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19FWFBPUlRGUz1tCiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPW0KIENPTkZJR19TVU5SUENfR1NTPW0KQEAgLTEwNTYsNyArMTE2Nyw5IEBACiAjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAogQ09ORklHX0NJRlM9bQogIyBDT05GSUdfQ0lGU19TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX1dFQUtfUFdfSEFTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DSUZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKQEAgLTExMjksNiArMTI0MiwxMCBAQAogQ09ORklHX05MU19VVEY4PXkKIAogIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKworIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldApAQCAtMTEzOCw5ICsxMjU1LDExIEBACiBDT05GSUdfWkxJQl9JTkZMQVRFPW0KIENPTkZJR19aTElCX0RFRkxBVEU9bQogQ09ORklHX0dFTkVSSUNfQUxMT0NBVE9SPXkKK0NPTkZJR19QTElTVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlE9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKIAogIwogIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydApAQCAtMTE1MiwyMCArMTI3MSwyNiBAQAogIyBLZXJuZWwgaGFja2luZwogIwogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTIwCiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19QUkVFTVBUPXkKLSMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0lORk89eQogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0lBNjRfR1JBTlVMRV8xNk1CPXkKQEAgLTExODYsNiArMTMxMSwxMCBAQAogIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKICMKIENPTkZJR19DUllQVE89eQorQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9bQorQ09ORklHX0NSWVBUT19IQVNIPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj1tCiBDT05GSUdfQ1JZUFRPX0hNQUM9eQogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CkBAIC0xMTk1LDYgKzEzMjQsOCBAQAogIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCitDT05GSUdfQ1JZUFRPX0NCQz1tCiBDT05GSUdfQ1JZUFRPX0RFUz1tCiAjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKaW5kZXggZGI4ZTFmYy4uY2U0OWZlMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYworKysgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCkBAIC03NSw3ICs3NSw3IEBACiAqKiBJZiBhIGRldmljZSBwcmVmZXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIGEgdmFsaWQgcGRpciBlbnRyeSwgaXQgd2lsbCBjYXVzZQogKiogYSBoYXJkIGZhaWx1cmUsIGllLiBNQ0EuICBWZXJzaW9uIDMuMCBhbmQgbGF0ZXIgb2YgdGhlIHp4MSBMQkEgc2hvdWxkCiAqKiBkaXNjb25uZWN0IG9uIDRrIGJvdW5kYXJpZXMgYW5kIHByZXZlbnQgc3VjaCBpc3N1ZXMuICBJZiB0aGUgZGV2aWNlIGlzCi0qKiBwYXJ0aWN1bGFybHkgYWdyZXNzaXZlLCB0aGlzIG9wdGlvbiB3aWxsIGtlZXAgdGhlIGVudGlyZSBwZGlyIHZhbGlkIHN1Y2gKKyoqIHBhcnRpY3VsYXJseSBhZ2dyZXNzaXZlLCB0aGlzIG9wdGlvbiB3aWxsIGtlZXAgdGhlIGVudGlyZSBwZGlyIHZhbGlkIHN1Y2gKICoqIHRoYXQgcHJlZmV0Y2hpbmcgd2lsbCBoaXQgYSB2YWxpZCBhZGRyZXNzLiAgVGhpcyBjb3VsZCBzZXZlcmVseSBpbXBhY3QKICoqIGVycm9yIGNvbnRhaW5tZW50LCBhbmQgaXMgdGhlcmVmb3JlIG9mZiBieSBkZWZhdWx0LiAgVGhlIHBhZ2UgdGhhdCBpcwogKiogdXNlZCBmb3Igc3BpbGwtb3ZlciBpcyBwb2lzb25lZCwgc28gdGhhdCBzaG91bGQgaGVscCBkZWJ1Z2dpbmcgc29tZXdoYXQuCkBAIC0yNTgsMTAgKzI1OCwxMCBAQAogCiAvKgogKiogRE1BX0NIVU5LX1NJWkUgaXMgdXNlZCBieSB0aGUgU0NTSSBtaWQtbGF5ZXIgdG8gYnJlYWsgdXAKLSoqIChvciByYXRoZXIgbm90IG1lcmdlKSBETUEncyBpbnRvIG1hbmFnYWJsZSBjaHVua3MuCisqKiAob3IgcmF0aGVyIG5vdCBtZXJnZSkgRE1BcyBpbnRvIG1hbmFnZWFibGUgY2h1bmtzLgogKiogT24gcGFyaXNjLCB0aGlzIGlzIG1vcmUgb2YgdGhlIHNvZnR3YXJlL3R1bmluZyBjb25zdHJhaW50Ci0qKiByYXRoZXIgdGhhbiB0aGUgSFcuIEkvTyBNTVUgYWxsb2NhdGlvbiBhbG9nb3JpdGhtcyBjYW4gYmUKLSoqIGZhc3RlciB3aXRoIHNtYWxsZXIgc2l6ZSBpcyAodG8gc29tZSBkZWdyZWUpLgorKiogcmF0aGVyIHRoYW4gdGhlIEhXLiBJL08gTU1VIGFsbG9jYXRpb24gYWxnb3JpdGhtcyBjYW4gYmUKKyoqIGZhc3RlciB3aXRoIHNtYWxsZXIgc2l6ZXMgKHRvIHNvbWUgZGVncmVlKS4KICovCiAjZGVmaW5lIERNQV9DSFVOS19TSVpFICAoQklUU19QRVJfTE9ORyppb3ZwX3NpemUpCiAKQEAgLTE2NzIsMTUgKzE2NzIsMTMgQEAKIAkgKiBTQUMgKHNpbmdsZSBhZGRyZXNzIGN5Y2xlKSBhZGRyZXNzYWJsZSwgc28gYWxsb2NhdGUgYQogCSAqIHBzZXVkby1kZXZpY2UgdG8gZW5mb3JjZSB0aGF0LgogCSAqLwotCXNhYyA9IGttYWxsb2Moc2l6ZW9mKCpzYWMpLCBHRlBfS0VSTkVMKTsKKwlzYWMgPSBremFsbG9jKHNpemVvZigqc2FjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYWMpCiAJCXBhbmljKFBGWCAiQ291bGRuJ3QgYWxsb2NhdGUgc3RydWN0IHBjaV9kZXYiKTsKLQltZW1zZXQoc2FjLCAwLCBzaXplb2YoKnNhYykpOwogCi0JY29udHJvbGxlciA9IGttYWxsb2Moc2l6ZW9mKCpjb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CisJY29udHJvbGxlciA9IGt6YWxsb2Moc2l6ZW9mKCpjb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb250cm9sbGVyKQogCQlwYW5pYyhQRlggIkNvdWxkbid0IGFsbG9jYXRlIHN0cnVjdCBwY2lfY29udHJvbGxlciIpOwotCW1lbXNldChjb250cm9sbGVyLCAwLCBzaXplb2YoKmNvbnRyb2xsZXIpKTsKIAogCWNvbnRyb2xsZXItPmlvbW11ID0gaW9jOwogCXNhYy0+c3lzZGF0YSA9IGNvbnRyb2xsZXI7CkBAIC0xNzM3LDEyICsxNzM1LDEwIEBACiAJc3RydWN0IGlvYyAqaW9jOwogCXN0cnVjdCBpb2NfaW9tbXUgKmluZm87CiAKLQlpb2MgPSBrbWFsbG9jKHNpemVvZigqaW9jKSwgR0ZQX0tFUk5FTCk7CisJaW9jID0ga3phbGxvYyhzaXplb2YoKmlvYyksIEdGUF9LRVJORUwpOwogCWlmICghaW9jKQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChpb2MsIDAsIHNpemVvZigqaW9jKSk7Ci0KIAlpb2MtPm5leHQgPSBpb2NfbGlzdDsKIAlpb2NfbGlzdCA9IGlvYzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9LY29uZmlnIGIvYXJjaC9pYTY0L2hwL3NpbS9LY29uZmlnCmluZGV4IDE4Y2NiMTIuLmY5MjMwNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vS2NvbmZpZworKysgYi9hcmNoL2lhNjQvaHAvc2ltL0tjb25maWcKQEAgLTEzLDggKzEzLDggQEAKIAlkZXBlbmRzIG9uIEhQX1NJTVNFUklBTAogCiBjb25maWcgSFBfU0lNU0NTSQotCXRyaXN0YXRlICJTaW11bGF0ZWQgU0NTSSBkaXNrIgotCWRlcGVuZHMgb24gU0NTSQorCWJvb2wgIlNpbXVsYXRlZCBTQ1NJIGRpc2siCisJZGVwZW5kcyBvbiBTQ1NJPXkKIAogZW5kbWVudQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvc2ltL2hwc2ltX2lycS5jIGIvYXJjaC9pYTY0L2hwL3NpbS9ocHNpbV9pcnEuYwppbmRleCA4MTQ1NTQ3Li5jMmY1OGZmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL2hwc2ltX2lycS5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vaHBzaW1faXJxLmMKQEAgLTI3LDcgKzI3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9ocF9zaW0gPSB7Ci0JLnR5cGVuYW1lID0JImhwc2ltIiwKKwkubmFtZSA9CQkiaHBzaW0iLAogCS5zdGFydHVwID0JaHBzaW1faXJxX3N0YXJ0dXAsCiAJLnNodXRkb3duID0JaHBzaW1faXJxX25vb3AsCiAJLmVuYWJsZSA9CWhwc2ltX2lycV9ub29wLApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKaW5kZXggY2FhYjk4Ni4uMzI0ZWE3NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYworKysgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCkBAIC0yMDksNyArMjA5LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBkb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKQorc3RhdGljIHZvaWQgZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnByaXZhdGVfKQogewogCXByaW50ayhLRVJOX0VSUiAic2ltc2VyaWFsOiBkb19zb2Z0aW50IGNhbGxlZFxuIik7CiB9CkBAIC00ODgsNyArNDg4LDcgQEAKIAogI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCiAKLXN0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJdW5zaWduZWQgaW50IGNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCkBAIC02ODQsMTIgKzY4NCwxMSBAQAogCQkqcmV0X2luZm8gPSBzc3RhdGUtPmluZm87CiAJCXJldHVybiAwOwogCX0KLQlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFzeW5jX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN5bmNfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKSB7CiAJCXNzdGF0ZS0+Y291bnQtLTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGFzeW5jX3N0cnVjdCkpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOwpAQCAtNjk4LDcgKzY5Nyw3IEBACiAJaW5mby0+ZmxhZ3MgPSBzc3RhdGUtPmZsYWdzOwogCWluZm8tPnhtaXRfZmlmb19zaXplID0gc3N0YXRlLT54bWl0X2ZpZm9fc2l6ZTsKIAlpbmZvLT5saW5lID0gbGluZTsKLQlJTklUX1dPUksoJmluZm8tPndvcmssIGRvX3NvZnRpbnQsIGluZm8pOworCUlOSVRfV09SSygmaW5mby0+d29yaywgZG9fc29mdGludCk7CiAJaW5mby0+c3RhdGUgPSBzc3RhdGU7CiAJaWYgKHNzdGF0ZS0+aW5mbykgewogCQlrZnJlZShpbmZvKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2JpbmZtdF9lbGYzMi5jIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKaW5kZXggZGFhNmI5MS4uNTc4NzM3ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKQEAgLTkxLDcgKzkxLDcgQEAKIAkgKiBpdCB3aXRoIHByaXZpbGVnZSBsZXZlbCAzIGJlY2F1c2UgdGhlIElWRSB1c2VzIG5vbi1wcml2aWxlZ2VkIGFjY2Vzc2VzIHRvIHRoZXNlCiAJICogdGFibGVzLiAgSUEtMzIgc2VnbWVudGF0aW9uIGlzIHVzZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IElBLTMyIGFjY2Vzc2VzIHRvIHRoZW0uCiAJICovCi0Jdm1hID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCXZtYSA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICh2bWEpIHsKIAkJbWVtc2V0KHZtYSwgMCwgc2l6ZW9mKCp2bWEpKTsKIAkJdm1hLT52bV9tbSA9IGN1cnJlbnQtPm1tOwpAQCAtMTE3LDcgKzExNyw3IEBACiAJICogY29kZSBpcyBsb2NrZWQgaW4gc3BlY2lmaWMgZ2F0ZSBwYWdlLCB3aGljaCBpcyBwb2ludGVkIGJ5IHByZXRjb2RlCiAJICogd2hlbiBzZXR1cF9mcmFtZV9pYTMyCiAJICovCi0Jdm1hID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCXZtYSA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICh2bWEpIHsKIAkJbWVtc2V0KHZtYSwgMCwgc2l6ZW9mKCp2bWEpKTsKIAkJdm1hLT52bV9tbSA9IGN1cnJlbnQtPm1tOwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJICogSW5zdGFsbCBMRFQgYXMgYW5vbnltb3VzIG1lbW9yeS4gIFRoaXMgZ2l2ZXMgdXMgYWxsLXplcm8gc2VnbWVudCBkZXNjcmlwdG9ycwogCSAqIHVudGlsIGEgdGFzayBtb2RpZmllcyB0aGVtIHZpYSBtb2RpZnlfbGR0KCkuCiAJICovCi0Jdm1hID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCXZtYSA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICh2bWEpIHsKIAkJbWVtc2V0KHZtYSwgMCwgc2l6ZW9mKCp2bWEpKTsKIAkJdm1hLT52bV9tbSA9IGN1cnJlbnQtPm1tOwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCWJwcm0tPmxvYWRlciArPSBzdGFja19iYXNlOwogCWJwcm0tPmV4ZWMgKz0gc3RhY2tfYmFzZTsKIAotCW1wbnQgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJbXBudCA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghbXBudCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfc3VwcG9ydC5jIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9zdXBwb3J0LmMKaW5kZXggYzE4Nzc0My4uNmFmNDAwYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9zdXBwb3J0LmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9zdXBwb3J0LmMKQEAgLTI0OSw3ICsyNDksNyBAQAogCiAjaWYgUEFHRV9TSElGVCA+IElBMzJfUEFHRV9TSElGVAogCXsKLQkJZXh0ZXJuIGttZW1fY2FjaGVfdCAqcGFydGlhbF9wYWdlX2NhY2hlcDsKKwkJZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpwYXJ0aWFsX3BhZ2VfY2FjaGVwOwogCiAJCXBhcnRpYWxfcGFnZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicGFydGlhbF9wYWdlX2NhY2hlIiwKIAkJCQkJCQlzaXplb2Yoc3RydWN0IHBhcnRpYWxfcGFnZSksIDAsIDAsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9pYTMycHJpdi5oIGIvYXJjaC9pYTY0L2lhMzIvaWEzMnByaXYuaAppbmRleCA3MDNhNjdjLi5jZmEwYmMwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9pYTMycHJpdi5oCisrKyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJwcml2LmgKQEAgLTMzMCw4ICszMzAsNiBAQAogdm9pZCBpYTY0X2VsZjMyX2luaXQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogI2RlZmluZSBFTEZfUExBVF9JTklUKF9yLCBsb2FkX2FkZHIpCWlhNjRfZWxmMzJfaW5pdChfcikKIAotI2RlZmluZSBlbGZfYWRkcl90CXUzMgotCiAvKiBUaGlzIG1hY3JvIHlpZWxkcyBhIGJpdG1hc2sgdGhhdCBwcm9ncmFtcyBjYW4gdXNlIHRvIGZpZ3VyZSBvdXQKICAgIHdoYXQgaW5zdHJ1Y3Rpb24gc2V0IHRoaXMgQ1BVIHN1cHBvcnRzLiAgKi8KICNkZWZpbmUgRUxGX0hXQ0FQCTAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMgYi9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCmluZGV4IDlkNmEzZjIuLjk1NzY4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAKIAlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7CiAJCS8qIHJlYWQgdGhlIGZpbGUgY29udGVudHMgKi8KLQkJaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCQlpZiAoIWlub2RlLT5pX2ZvcCB8fCAhZmlsZS0+Zl9vcC0+cmVhZAogCQkgICAgfHwgKCgqZmlsZS0+Zl9vcC0+cmVhZCkoZmlsZSwgKGNoYXIgX191c2VyICopIHN0YXJ0LCBlbmQgLSBzdGFydCwgJm9mZikgPCAwKSkKIAkJewpAQCAtMjU0LDcgKzI1NCw3IEBACiB9CiAKIC8qIFNMQUIgY2FjaGUgZm9yIHBhcnRpYWxfcGFnZSBzdHJ1Y3R1cmVzICovCi1rbWVtX2NhY2hlX3QgKnBhcnRpYWxfcGFnZV9jYWNoZXA7CitzdHJ1Y3Qga21lbV9jYWNoZSAqcGFydGlhbF9wYWdlX2NhY2hlcDsKIAogLyoKICAqIGluaXQgcGFydGlhbF9wYWdlX2xpc3QuCkBAIC04MzcsNyArODM3LDcgQEAKIAogCWlmICghaXNfY29uZ3J1ZW50KSB7CiAJCS8qIHJlYWQgdGhlIGZpbGUgY29udGVudHMgKi8KLQkJaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCQlpZiAoIWlub2RlLT5pX2ZvcCB8fCAhZmlsZS0+Zl9vcC0+cmVhZAogCQkgICAgfHwgKCgqZmlsZS0+Zl9vcC0+cmVhZCkoZmlsZSwgKGNoYXIgX191c2VyICopIHBzdGFydCwgcGVuZCAtIHBzdGFydCwgJnBvZmYpCiAJCQk8IDApKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2ZhMDk5Yi4uMDk4ZWU2MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCkBAIC0yOCw2ICsyOCw4IEBACiBvYmotJChDT05GSUdfQ1BVX0ZSRVEpCQkrPSBjcHVmcmVxLwogb2JqLSQoQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZKQkrPSBtY2FfcmVjb3Zlcnkubwogb2JqLSQoQ09ORklHX0tQUk9CRVMpCQkrPSBrcHJvYmVzLm8ganByb2Jlcy5vCitvYmotJChDT05GSUdfS0VYRUMpCQkrPSBtYWNoaW5lX2tleGVjLm8gcmVsb2NhdGVfa2VybmVsLm8gY3Jhc2gubworb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApCSs9IGNyYXNoX2R1bXAubwogb2JqLSQoQ09ORklHX0lBNjRfVU5DQUNIRURfQUxMT0NBVE9SKQkrPSB1bmNhY2hlZC5vCiBvYmotJChDT05GSUdfQVVESVQpCQkrPSBhdWRpdC5vCiBvYmotJChDT05GSUdfUENJX01TSSkJCSs9IG1zaV9pYTY0Lm8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggMzJjM2FiZWQuLjczZWY0YTg1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtNjQsOSArNjQsNiBAQAogdm9pZCAoKnBtX3Bvd2VyX29mZikgKHZvaWQpOwogRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOwogCi11bnNpZ25lZCBjaGFyIGFjcGlfa2JkX2NvbnRyb2xsZXJfcHJlc2VudCA9IDE7Ci11bnNpZ25lZCBjaGFyIGFjcGlfbGVnYWN5X2RldmljZXM7Ci0KIHVuc2lnbmVkIGludCBhY3BpX2NwZWlfb3ZlcnJpZGU7CiB1bnNpZ25lZCBpbnQgYWNwaV9jcGVpX3BoeXNfY3B1aWQ7CiAKQEAgLTYyOCwxMiArNjI1LDYgQEAKIAogCWZhZHQgPSAoc3RydWN0IGZhZHRfZGVzY3JpcHRvciAqKWZhZHRfaGVhZGVyOwogCi0JaWYgKCEoZmFkdC0+aWFwY19ib290X2FyY2ggJiBCQUZfODA0Ml9LRVlCT0FSRF9DT05UUk9MTEVSKSkKLQkJYWNwaV9rYmRfY29udHJvbGxlcl9wcmVzZW50ID0gMDsKLQotCWlmIChmYWR0LT5pYXBjX2Jvb3RfYXJjaCAmIEJBRl9MRUdBQ1lfREVWSUNFUykKLQkJYWNwaV9sZWdhY3lfZGV2aWNlcyA9IDE7Ci0KIAlhY3BpX3JlZ2lzdGVyX2dzaShmYWR0LT5zY2lfaW50LCBBQ1BJX0xFVkVMX1NFTlNJVElWRSwgQUNQSV9BQ1RJVkVfTE9XKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYyBiL2FyY2gvaWE2NC9rZXJuZWwvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCA4NmZhZjIyLi4wODhmMTMwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC02OCw3ICs2OCw4IEBACiAKIAlkcHJpbnRrKCJwcm9jZXNzb3JfZ2V0X3BzdGF0ZVxuIik7CiAKLQlyZXR2YWwgPSBpYTY0X3BhbF9nZXRfcHN0YXRlKCZwc3RhdGVfaW5kZXgpOworCXJldHZhbCA9IGlhNjRfcGFsX2dldF9wc3RhdGUoJnBzdGF0ZV9pbmRleCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTF9HRVRfUFNUQVRFX1RZUEVfSU5TVEFOVCk7CiAJKnZhbHVlID0gKHUzMikgcHN0YXRlX2luZGV4OwogCiAJaWYgKHJldHZhbCkKQEAgLTkxLDcgKzkyLDcgQEAKIAlkcHJpbnRrKCJleHRyYWN0X2Nsb2NrXG4iKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykgewotCQlpZiAodmFsdWUgPj0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sKQorCQlpZiAodmFsdWUgPT0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5zdGF0dXMpCiAJCQlyZXR1cm4gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeTsKIAl9CiAJcmV0dXJuIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaS0xXS5jb3JlX2ZyZXF1ZW5jeTsKQEAgLTExNywxMSArMTE4LDcgQEAKIAkJZ290byBtaWdyYXRlX2VuZDsKIAl9CiAKLQkvKgotCSAqIHByb2Nlc3Nvcl9nZXRfcHN0YXRlIGdldHMgdGhlIGF2ZXJhZ2UgZnJlcXVlbmN5IHNpbmNlIHRoZQotCSAqIGxhc3QgZ2V0LiBTbywgZG8gdHdvIFBBTF9nZXRfZnJlcSgpLi4uCi0JICovCi0JcmV0ID0gcHJvY2Vzc29yX2dldF9wc3RhdGUoJnZhbHVlKTsKKwkvKiBwcm9jZXNzb3JfZ2V0X3BzdGF0ZSBnZXRzIHRoZSBpbnN0YW50YW5lb3VzIGZyZXF1ZW5jeSAqLwogCXJldCA9IHByb2Nlc3Nvcl9nZXRfcHN0YXRlKCZ2YWx1ZSk7CiAKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2NyYXNoLmMgYi9hcmNoL2lhNjQva2VybmVsL2NyYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyZjY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvY3Jhc2guYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIGFyY2gvaWE2NC9rZXJuZWwvY3Jhc2guYworICoKKyAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyAoaWE2NCkgZnVuY3Rpb25zIGZvciBrZXhlYyBiYXNlZCBjcmFzaCBkdW1wcy4KKyAqCisgKiBDcmVhdGVkIGJ5OiBLaGFsaWQgQXppeiA8a2hhbGlkLmF6aXpAaHAuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA1IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSW50ZWwgQ29ycAlab3UgTmFuIGhhaSA8bmFuaGFpLnpvdUBpbnRlbC5jb20+CisgKgorICovCisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KKyNpbmNsdWRlIDxhc20vbWNhLmg+CisKK2ludCBrZHVtcF9zdGF0dXNbTlJfQ1BVU107CithdG9taWNfdCBrZHVtcF9jcHVfZnJlZXplZDsKK2F0b21pY190IGtkdW1wX2luX3Byb2dyZXNzOworaW50IGtkdW1wX29uX2luaXQgPSAxOworCitzdGF0aWMgaW5saW5lIEVsZjY0X1dvcmQKKyphcHBlbmRfZWxmX25vdGUoRWxmNjRfV29yZCAqYnVmLCBjaGFyICpuYW1lLCB1bnNpZ25lZCB0eXBlLCB2b2lkICpkYXRhLAorCQlzaXplX3QgZGF0YV9sZW4pCit7CisJc3RydWN0IGVsZl9ub3RlICpub3RlID0gKHN0cnVjdCBlbGZfbm90ZSAqKWJ1ZjsKKwlub3RlLT5uX25hbWVzeiA9IHN0cmxlbihuYW1lKSArIDE7CisJbm90ZS0+bl9kZXNjc3ogPSBkYXRhX2xlbjsKKwlub3RlLT5uX3R5cGUgICA9IHR5cGU7CisJYnVmICs9IChzaXplb2YoKm5vdGUpICsgMykvNDsKKwltZW1jcHkoYnVmLCBuYW1lLCBub3RlLT5uX25hbWVzeik7CisJYnVmICs9IChub3RlLT5uX25hbWVzeiArIDMpLzQ7CisJbWVtY3B5KGJ1ZiwgZGF0YSwgZGF0YV9sZW4pOworCWJ1ZiArPSAoZGF0YV9sZW4gKyAzKS80OworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5hbF9ub3RlKHZvaWQgKmJ1ZikKK3sKKwltZW1zZXQoYnVmLCAwLCBzaXplb2Yoc3RydWN0IGVsZl9ub3RlKSk7Cit9CisKK2V4dGVybiB2b2lkIGlhNjRfZHVtcF9jcHVfcmVncyh2b2lkICopOworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGVsZl9wcnN0YXR1cywgZWxmX3Byc3RhdHVzKTsKKwordm9pZAorY3Jhc2hfc2F2ZV90aGlzX2NwdSgpCit7CisJdm9pZCAqYnVmOworCXVuc2lnbmVkIGxvbmcgY2ZtLCBzb2YsIHNvbDsKKworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IGVsZl9wcnN0YXR1cyAqcHJzdGF0dXMgPSAmcGVyX2NwdShlbGZfcHJzdGF0dXMsIGNwdSk7CisKKwllbGZfZ3JlZ190ICpkc3QgPSAoZWxmX2dyZWdfdCAqKSYocHJzdGF0dXMtPnByX3JlZyk7CisJbWVtc2V0KHByc3RhdHVzLCAwLCBzaXplb2YoKnByc3RhdHVzKSk7CisJcHJzdGF0dXMtPnByX3BpZCA9IGN1cnJlbnQtPnBpZDsKKworCWlhNjRfZHVtcF9jcHVfcmVncyhkc3QpOworCWNmbSA9IGRzdFs0M107CisJc29sID0gKGNmbSA+PiA3KSAmIDB4N2Y7CisJc29mID0gY2ZtICYgMHg3ZjsKKwlkc3RbNDZdID0gKHVuc2lnbmVkIGxvbmcpaWE2NF9yc2Vfc2tpcF9yZWdzKCh1bnNpZ25lZCBsb25nICopZHN0WzQ2XSwKKwkJCXNvZiAtIHNvbCk7CisKKwlidWYgPSAodTY0ICopIHBlcl9jcHVfcHRyKGNyYXNoX25vdGVzLCBjcHUpOworCWlmICghYnVmKQorCQlyZXR1cm47CisJYnVmID0gYXBwZW5kX2VsZl9ub3RlKGJ1ZiwgIkNPUkUiLCBOVF9QUlNUQVRVUywgcHJzdGF0dXMsCisJCQlzaXplb2YoKnByc3RhdHVzKSk7CisJZmluYWxfbm90ZShidWYpOworfQorCitzdGF0aWMgaW50CitrZHVtcF93YWl0X2NwdV9mcmVlemUodm9pZCkKK3sKKwlpbnQgY3B1X251bSA9IG51bV9vbmxpbmVfY3B1cygpIC0gMTsKKwlpbnQgdGltZW91dCA9IDEwMDA7CisJd2hpbGUodGltZW91dC0tID4gMCkgeworCQlpZiAoYXRvbWljX3JlYWQoJmtkdW1wX2NwdV9mcmVlemVkKSA9PSBjcHVfbnVtKQorCQkJcmV0dXJuIDA7CisJCXVkZWxheSgxMDAwKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQKK21hY2hpbmVfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnB0KQoreworCS8qIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlIHN5c3RlbQorCSAqIGhhcyBwYW5pY2VkIG9yIGlzIG90aGVyd2lzZSBpbiBhIGNyaXRpY2FsIHN0YXRlLgorCSAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHRvIGFsbG93IGEga2V4ZWMnZCBrZXJuZWwKKwkgKiB0byBydW4gc3VjY2Vzc2Z1bGx5IG5lZWRzIHRvIGhhcHBlbiBoZXJlLgorCSAqCisJICogSW4gcHJhY3RpY2UgdGhpcyBtZWFucyBzaG9vdGluZyBkb3duIHRoZSBvdGhlciBjcHVzIGluCisJICogYW4gU01QIHN5c3RlbS4KKwkgKi8KKwlrZXhlY19kaXNhYmxlX2lvc2FwaWMoKTsKKyNpZmRlZiBDT05GSUdfU01QCisJa2R1bXBfc21wX3NlbmRfc3RvcCgpOworCWlmIChrZHVtcF93YWl0X2NwdV9mcmVlemUoKSAmJiBrZHVtcF9vbl9pbml0KSAJeworCQkvL25vdCBhbGwgY3B1IHJlc3BvbnNlIHRvIElQSSwgc2VuZCBJTklUIHRvIGZyZWV6ZSB0aGVtCisJCWtkdW1wX3NtcF9zZW5kX2luaXQoKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK21hY2hpbmVfa2R1bXBfb25faW5pdCh2b2lkKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJa2V4ZWNfZGlzYWJsZV9pb3NhcGljKCk7CisJbWFjaGluZV9rZXhlYyhpYTY0X2tpbWFnZSk7Cit9CisKK3ZvaWQKK2tkdW1wX2NwdV9mcmVlemUoc3RydWN0IHVud19mcmFtZV9pbmZvICppbmZvLCB2b2lkICphcmcpCit7CisJaW50IGNwdWlkOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJY3B1aWQgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3Jhc2hfc2F2ZV90aGlzX2NwdSgpOworCWN1cnJlbnQtPnRocmVhZC5rc3AgPSAoX191NjQpaW5mby0+c3cgLSAxNjsKKwlhdG9taWNfaW5jKCZrZHVtcF9jcHVfZnJlZXplZCk7CisJa2R1bXBfc3RhdHVzW2NwdWlkXSA9IDE7CisJbWIoKTsKKwlpZiAoY3B1aWQgPT0gMCkgeworCQlmb3IgKDs7KQorCQkJY3B1X3JlbGF4KCk7CisJfSBlbHNlCisJCWlhNjRfanVtcF90b19zYWwoJnNhbF9ib290X3JlbmRlel9zdGF0ZVtjcHVpZF0pOworfQorCitzdGF0aWMgaW50CitrZHVtcF9pbml0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlhNjRfbWNhX25vdGlmeV9kaWUgKm5kOworCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IGRhdGE7CisKKwlpZiAoIWtkdW1wX29uX2luaXQpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCWlmICh2YWwgIT0gRElFX0lOSVRfTU9OQVJDSF9FTlRFUiAmJgorCSAgICB2YWwgIT0gRElFX0lOSVRfU0xBVkVfRU5URVIgJiYKKwkgICAgdmFsICE9IERJRV9NQ0FfUkVORFpWT1VTX0xFQVZFICYmCisJICAgIHZhbCAhPSBESUVfTUNBX01PTkFSQ0hfTEVBVkUpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCW5kID0gKHN0cnVjdCBpYTY0X21jYV9ub3RpZnlfZGllICopYXJncy0+ZXJyOworCS8qIFJlYXNvbiBjb2RlIDEgbWVhbnMgbWFjaGluZSBjaGVjayByZW5kZXpvdXMqLworCWlmICgodmFsID09IERJRV9JTklUX01PTkFSQ0hfRU5URVIgfHwgRElFX0lOSVRfU0xBVkVfRU5URVIpICYmCisJCSBuZC0+c29zLT5ydl9yYyA9PSAxKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlzd2l0Y2ggKHZhbCkgeworCQljYXNlIERJRV9JTklUX01PTkFSQ0hfRU5URVI6CisJCQltYWNoaW5lX2tkdW1wX29uX2luaXQoKTsKKwkJCWJyZWFrOworCQljYXNlIERJRV9JTklUX1NMQVZFX0VOVEVSOgorCQkJdW53X2luaXRfcnVubmluZyhrZHVtcF9jcHVfZnJlZXplLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIERJRV9NQ0FfUkVORFpWT1VTX0xFQVZFOgorCQkJaWYgKGF0b21pY19yZWFkKCZrZHVtcF9pbl9wcm9ncmVzcykpCisJCQkJdW53X2luaXRfcnVubmluZyhrZHVtcF9jcHVfZnJlZXplLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIERJRV9NQ0FfTU9OQVJDSF9MRUFWRToKKwkJICAgICAvKiBkaWVfcmVnaXN0ZXItPnNpZ25yIGluZGljYXRlIGlmIE1DQSBpcyByZWNvdmVyYWJsZSAqLworCQkJaWYgKCFhcmdzLT5zaWducikKKwkJCQltYWNoaW5lX2tkdW1wX29uX2luaXQoKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgY3RsX3RhYmxlIGtkdW1wX29uX2luaXRfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZSA9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUgPSAia2R1bXBfb25faW5pdCIsCisJCS5kYXRhID0gJmtkdW1wX29uX2luaXQsCisJCS5tYXhsZW4gPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBzeXNfdGFibGVbXSA9IHsKKwl7CisJICAuY3RsX25hbWUgPSBDVExfS0VSTiwKKwkgIC5wcm9jbmFtZSA9ICJrZXJuZWwiLAorCSAgLm1vZGUgPSAwNTU1LAorCSAgLmNoaWxkID0ga2R1bXBfb25faW5pdF90YWJsZSwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQKK21hY2hpbmVfY3Jhc2hfc2V0dXAodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGtkdW1wX2luaXRfbm90aWZpZXJfbmIgPSB7CisJCS5ub3RpZmllcl9jYWxsID0ga2R1bXBfaW5pdF9ub3RpZmllciwKKwl9OworCWludCByZXQ7CisJaWYoKHJldCA9IHJlZ2lzdGVyX2RpZV9ub3RpZmllcigma2R1bXBfaW5pdF9ub3RpZmllcl9uYikpICE9IDApCisJCXJldHVybiByZXQ7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXJlZ2lzdGVyX3N5c2N0bF90YWJsZShzeXNfdGFibGUsIDApOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwobWFjaGluZV9jcmFzaF9zZXR1cCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvY3Jhc2hfZHVtcC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9jcmFzaF9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiOGM5MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvY3Jhc2hfZHVtcC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKglrZXJuZWwvY3Jhc2hfZHVtcC5jIC0gTWVtb3J5IHByZXNlcnZpbmcgcmVib290IHJlbGF0ZWQgY29kZS4KKyAqCisgKglDcmVhdGVkIGJ5OiBTaW1vbiBIb3JtYW4gPGhvcm1zQHZlcmdlLm5ldC5hdT4KKyAqCU9yaWdpbmFsIGNvZGUgbW92ZWQgZnJvbSBrZXJuZWwvY3Jhc2guYworICoJT3JpZ2luYWwgY29kZSBjb21tZW50IGNvcGllZCBmcm9tIHRoZSBpMzg2IHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworLyoqCisgKiBjb3B5X29sZG1lbV9wYWdlIC0gY29weSBvbmUgcGFnZSBmcm9tICJvbGRtZW0iCisgKiBAcGZuOiBwYWdlIGZyYW1lIG51bWJlciB0byBiZSBjb3BpZWQKKyAqIEBidWY6IHRhcmdldCBtZW1vcnkgYWRkcmVzcyBmb3IgdGhlIGNvcHk7IHRoaXMgY2FuIGJlIGluIGtlcm5lbCBhZGRyZXNzCisgKglzcGFjZSBvciB1c2VyIGFkZHJlc3Mgc3BhY2UgKHNlZSBAdXNlcmJ1ZikKKyAqIEBjc2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAqIEBvZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBpbnRvIHRoZSBwYWdlIChiYXNlZCBvbiBwZm4pIHRvIGJlZ2luIHRoZSBjb3B5CisgKiBAdXNlcmJ1ZjogaWYgc2V0LCBAYnVmIGlzIGluIHVzZXIgYWRkcmVzcyBzcGFjZSwgdXNlIGNvcHlfdG9fdXNlcigpLAorICoJb3RoZXJ3aXNlIEBidWYgaXMgaW4ga2VybmVsIGFkZHJlc3Mgc3BhY2UsIHVzZSBtZW1jcHkoKS4KKyAqCisgKiBDb3B5IGEgcGFnZSBmcm9tICJvbGRtZW0iLiBGb3IgdGhpcyBwYWdlLCB0aGVyZSBpcyBubyBwdGUgbWFwcGVkCisgKiBpbiB0aGUgY3VycmVudCBrZXJuZWwuIFdlIHN0aXRjaCB1cCBhIHB0ZSwgc2ltaWxhciB0byBrbWFwX2F0b21pYy4KKyAqCisgKiBDYWxsaW5nIGNvcHlfdG9fdXNlcigpIGluIGF0b21pYyBjb250ZXh0IGlzIG5vdCBkZXNpcmFibGUuIEhlbmNlIGZpcnN0CisgKiBjb3B5aW5nIHRoZSBkYXRhIHRvIGEgcHJlLWFsbG9jYXRlZCBrZXJuZWwgcGFnZSBhbmQgdGhlbiBjb3B5aW5nIHRvIHVzZXIKKyAqIHNwYWNlIGluIG5vbi1hdG9taWMgY29udGV4dC4KKyAqLworc3NpemVfdAorY29weV9vbGRtZW1fcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgY2hhciAqYnVmLAorCQlzaXplX3QgY3NpemUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgdXNlcmJ1ZikKK3sKKwl2b2lkICAqdmFkZHI7CisKKwlpZiAoIWNzaXplKQorCQlyZXR1cm4gMDsKKwl2YWRkciA9IF9fdmEocGZuPDxQQUdFX1NISUZUKTsKKwlpZiAodXNlcmJ1ZikgeworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgKHZhZGRyICsgb2Zmc2V0KSwgY3NpemUpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZQorCQltZW1jcHkoYnVmLCAodmFkZHIgKyBvZmZzZXQpLCBjc2l6ZSk7CisJcmV0dXJuIGNzaXplOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwppbmRleCBiYjg3NzBhLi4wYjI1YTdkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2tyZWdzLmg+CkBAIC00MSw3ICs0Miw3IEBACiBzdHJ1Y3QgZWZpIGVmaTsKIEVYUE9SVF9TWU1CT0woZWZpKTsKIHN0YXRpYyBlZmlfcnVudGltZV9zZXJ2aWNlc190ICpydW50aW1lOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2xpbWl0ID0gfjBVTCwgbWF4X2FkZHIgPSB+MFVMOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtX2xpbWl0ID0gfjBVTCwgbWF4X2FkZHIgPSB+MFVMLCBtaW5fYWRkciA9IDBVTDsKIAogI2RlZmluZSBlZmlfY2FsbF92aXJ0KGYsIGFyZ3MuLi4pCSgqKGYpKShhcmdzKQogCkBAIC0yMjQsNyArMjI1LDcgQEAKIH0KIAogc3RhdGljIGludAotaXNfYXZhaWxhYmxlX21lbW9yeSAoZWZpX21lbW9yeV9kZXNjX3QgKm1kKQoraXNfbWVtb3J5X2F2YWlsYWJsZSAoZWZpX21lbW9yeV9kZXNjX3QgKm1kKQogewogCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1dCKSkKIAkJcmV0dXJuIDA7CkBAIC00MjEsNiArNDIyLDggQEAKIAkJCW1lbV9saW1pdCA9IG1lbXBhcnNlKGNwICsgNCwgJmNwKTsKIAkJfSBlbHNlIGlmIChtZW1jbXAoY3AsICJtYXhfYWRkcj0iLCA5KSA9PSAwKSB7CiAJCQltYXhfYWRkciA9IEdSQU5VTEVST1VORERPV04obWVtcGFyc2UoY3AgKyA5LCAmY3ApKTsKKwkJfSBlbHNlIGlmIChtZW1jbXAoY3AsICJtaW5fYWRkcj0iLCA5KSA9PSAwKSB7CisJCQltaW5fYWRkciA9IEdSQU5VTEVST1VORERPV04obWVtcGFyc2UoY3AgKyA5LCAmY3ApKTsKIAkJfSBlbHNlIHsKIAkJCXdoaWxlICgqY3AgIT0gJyAnICYmICpjcCkKIAkJCQkrK2NwOwpAQCAtNDI4LDYgKzQzMSw4IEBACiAJCQkJKytjcDsKIAkJfQogCX0KKwlpZiAobWluX2FkZHIgIT0gMFVMKQorCQlwcmludGsoS0VSTl9JTkZPICJJZ25vcmluZyBtZW1vcnkgYmVsb3cgJWx1TUJcbiIsIG1pbl9hZGRyID4+IDIwKTsKIAlpZiAobWF4X2FkZHIgIT0gfjBVTCkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiSWdub3JpbmcgbWVtb3J5IGFib3ZlICVsdU1CXG4iLCBtYXhfYWRkciA+PiAyMCk7CiAKQEAgLTg4NywxNCArODkyLDE1IEBACiAJCQl9CiAJCQljb250aWdfaGlnaCA9IEdSQU5VTEVST1VORERPV04oY29udGlnX2hpZ2gpOwogCQl9Ci0JCWlmICghaXNfYXZhaWxhYmxlX21lbW9yeShtZCkgfHwgbWQtPnR5cGUgPT0gRUZJX0xPQURFUl9EQVRBKQorCQlpZiAoIWlzX21lbW9yeV9hdmFpbGFibGUobWQpIHx8IG1kLT50eXBlID09IEVGSV9MT0FERVJfREFUQSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIFJvdW5kIGVuZHMgaW53YXJkIHRvIGdyYW51bGUgYm91bmRhcmllcyAqLwogCQlhcyA9IG1heChjb250aWdfbG93LCBtZC0+cGh5c19hZGRyKTsKIAkJYWUgPSBtaW4oY29udGlnX2hpZ2gsIGVmaV9tZF9lbmQobWQpKTsKIAotCQkvKiBrZWVwIHdpdGhpbiBtYXhfYWRkcj0gY29tbWFuZCBsaW5lIGFyZyAqLworCQkvKiBrZWVwIHdpdGhpbiBtYXhfYWRkcj0gYW5kIG1pbl9hZGRyPSBjb21tYW5kIGxpbmUgYXJnICovCisJCWFzID0gbWF4KGFzLCBtaW5fYWRkcik7CiAJCWFlID0gbWluKGFlLCBtYXhfYWRkcik7CiAJCWlmIChhZSA8PSBhcykKIAkJCWNvbnRpbnVlOwpAQCAtOTYyLDcgKzk2OCw3IEBACiAJCQl9CiAJCQljb250aWdfaGlnaCA9IEdSQU5VTEVST1VORERPV04oY29udGlnX2hpZ2gpOwogCQl9Ci0JCWlmICghaXNfYXZhaWxhYmxlX21lbW9yeShtZCkpCisJCWlmICghaXNfbWVtb3J5X2F2YWlsYWJsZShtZCkpCiAJCQljb250aW51ZTsKIAogCQkvKgpAQCAtMTAwNCw3ICsxMDEwLDggQEAKIAkJfSBlbHNlCiAJCQlhZSA9IGVmaV9tZF9lbmQobWQpOwogCi0JCS8qIGtlZXAgd2l0aGluIG1heF9hZGRyPSBjb21tYW5kIGxpbmUgYXJnICovCisJCS8qIGtlZXAgd2l0aGluIG1heF9hZGRyPSBhbmQgbWluX2FkZHI9IGNvbW1hbmQgbGluZSBhcmcgKi8KKwkJYXMgPSBtYXgoYXMsIG1pbl9hZGRyKTsKIAkJYWUgPSBtaW4oYWUsIG1heF9hZGRyKTsKIAkJaWYgKGFlIDw9IGFzKQogCQkJY29udGludWU7CkBAIC0xMTE2LDYgKzExMjMsNTggQEAKIAkJCSAqLwogCQkJaW5zZXJ0X3Jlc291cmNlKHJlcywgY29kZV9yZXNvdXJjZSk7CiAJCQlpbnNlcnRfcmVzb3VyY2UocmVzLCBkYXRhX3Jlc291cmNlKTsKKyNpZmRlZiBDT05GSUdfS0VYRUMKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydF9yZXNvdXJjZShyZXMsICZlZmlfbWVtbWFwX3Jlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfcmVzb3VyY2UocmVzLCAmYm9vdF9wYXJhbV9yZXMpOworCQkJaWYgKGNyYXNoa19yZXMuZW5kID4gY3Jhc2hrX3Jlcy5zdGFydCkKKwkJCQlpbnNlcnRfcmVzb3VyY2UocmVzLCAmY3Jhc2hrX3Jlcyk7CisjZW5kaWYKIAkJfQogCX0KIH0KKworI2lmZGVmIENPTkZJR19LRVhFQworLyogZmluZCBhIGJsb2NrIG9mIG1lbW9yeSBhbGlnbmVkIHRvIDY0TSBleGNsdWRlIHJlc2VydmVkIHJlZ2lvbnMKKyAgIHJzdmRfcmVnaW9ucyBhcmUgc29ydGVkCisgKi8KK3Vuc2lnbmVkIGxvbmcKK2tkdW1wX2ZpbmRfcnN2ZF9yZWdpb24gKHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJc3RydWN0IHJzdmRfcmVnaW9uICpyLCBpbnQgbikKK3sKKyAgaW50IGk7CisgIHU2NCBzdGFydCwgZW5kOworICB1NjQgYWxpZ25tZW50ID0gMVVMIDw8IF9QQUdFX1NJWkVfNjRNOworICB2b2lkICplZmlfbWFwX3N0YXJ0LCAqZWZpX21hcF9lbmQsICpwOworICBlZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisgIHU2NCBlZmlfZGVzY19zaXplOworCisgIGVmaV9tYXBfc3RhcnQgPSBfX3ZhKGlhNjRfYm9vdF9wYXJhbS0+ZWZpX21lbW1hcCk7CisgIGVmaV9tYXBfZW5kICAgPSBlZmlfbWFwX3N0YXJ0ICsgaWE2NF9ib290X3BhcmFtLT5lZmlfbWVtbWFwX3NpemU7CisgIGVmaV9kZXNjX3NpemUgPSBpYTY0X2Jvb3RfcGFyYW0tPmVmaV9tZW1kZXNjX3NpemU7CisKKyAgZm9yIChwID0gZWZpX21hcF9zdGFydDsgcCA8IGVmaV9tYXBfZW5kOyBwICs9IGVmaV9kZXNjX3NpemUpIHsKKwkgIG1kID0gcDsKKwkgIGlmICghZWZpX3diKG1kKSkKKwkJICBjb250aW51ZTsKKwkgIHN0YXJ0ID0gQUxJR04obWQtPnBoeXNfYWRkciwgYWxpZ25tZW50KTsKKwkgIGVuZCA9IGVmaV9tZF9lbmQobWQpOworCSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlpZiAoX19wYShyW2ldLnN0YXJ0KSA+PSBzdGFydCAmJiBfX3BhKHJbaV0uZW5kKSA8IGVuZCkgeworCQkJaWYgKF9fcGEocltpXS5zdGFydCkgPiBzdGFydCArIHNpemUpCisJCQkJcmV0dXJuIHN0YXJ0OworCQkJc3RhcnQgPSBBTElHTihfX3BhKHJbaV0uZW5kKSwgYWxpZ25tZW50KTsKKwkJCWlmIChpIDwgbi0xICYmIF9fcGEocltpKzFdLnN0YXJ0KSA8IHN0YXJ0ICsgc2l6ZSkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfQorCSAgfQorCSAgaWYgKGVuZCA+IHN0YXJ0ICsgc2l6ZSkKKwkJcmV0dXJuIHN0YXJ0OworICB9CisKKyAgcHJpbnRrKEtFUk5fV0FSTklORyAiQ2Fubm90IHJlc2VydmUgMHglbHggYnl0ZSBvZiBtZW1vcnkgZm9yIGNyYXNoZHVtcFxuIiwKKwlzaXplKTsKKyAgcmV0dXJuIH4wVUw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCAzMzkwYjdjLi4xNTIzNGVkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNTc1LDcgKzE1NzUsNyBAQAogCWRhdGE4IHN5c19tcV90aW1lZHJlY2VpdmUJCS8vIDEyNjUKIAlkYXRhOCBzeXNfbXFfbm90aWZ5CiAJZGF0YTggc3lzX21xX2dldHNldGF0dHIKLQlkYXRhOCBzeXNfbmlfc3lzY2FsbAkJCS8vIHJlc2VydmVkIGZvciBrZXhlY19sb2FkCisJZGF0YTggc3lzX2tleGVjX2xvYWQKIAlkYXRhOCBzeXNfbmlfc3lzY2FsbAkJCS8vIHJlc2VydmVkIGZvciB2c2VydmVyCiAJZGF0YTggc3lzX3dhaXRpZAkJCS8vIDEyNzAKIAlkYXRhOCBzeXNfYWRkX2tleQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMgYi9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYwppbmRleCA4NzljMTgxLi5iZDE3MTkwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiBFWFBPUlRfU1lNQk9MKGlwX2Zhc3RfY3N1bSk7CQkvKiBoYW5kLWNvZGVkIGFzc2VtYmx5ICovCitFWFBPUlRfU1lNQk9MKGNzdW1faXB2Nl9tYWdpYyk7CiAKICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiBFWFBPUlRfU1lNQk9MKF9fZG93bik7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCmluZGV4IDliZjE1ZmUuLjBmYzVmYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCkBAIC0yODgsNiArMjg4LDI3IEBACiAJLyogZG8gbm90aGluZy4uLiAqLwogfQogCisKKyNpZmRlZiBDT05GSUdfS0VYRUMKK3ZvaWQKK2tleGVjX2Rpc2FibGVfaW9zYXBpYyh2b2lkKQoreworCXN0cnVjdCBpb3NhcGljX2ludHJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW9zYXBpY19ydGVfaW5mbyAqcnRlOworCXU4IHZlYyA9IDA7CisJZm9yIChpbmZvID0gaW9zYXBpY19pbnRyX2luZm87IGluZm8gPAorCQkJaW9zYXBpY19pbnRyX2luZm8gKyBJQTY0X05VTV9WRUNUT1JTOyArK2luZm8sICsrdmVjKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocnRlLCAmaW5mby0+cnRlcywKKwkJCQlydGVfbGlzdCkgeworCQkJaW9zYXBpY193cml0ZShydGUtPmFkZHIsCisJCQkJCUlPU0FQSUNfUlRFX0xPVyhydGUtPnJ0ZV9pbmRleCksCisJCQkJCUlPU0FQSUNfTUFTS3x2ZWMpOworCQkJaW9zYXBpY19lb2kocnRlLT5hZGRyLCB2ZWMpOworCQl9CisJfQorfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkCiBtYXNrX2lycSAodW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTQyNiw3ICs0NDcsNyBAQAogI2RlZmluZSBpb3NhcGljX2Fja19sZXZlbF9pcnEJCW5vcAogCiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaXJxX3R5cGVfaW9zYXBpY19sZXZlbCA9IHsKLQkudHlwZW5hbWUgPQkiSU8tU0FQSUMtbGV2ZWwiLAorCS5uYW1lID0JCSJJTy1TQVBJQy1sZXZlbCIsCiAJLnN0YXJ0dXAgPQlpb3NhcGljX3N0YXJ0dXBfbGV2ZWxfaXJxLAogCS5zaHV0ZG93biA9CWlvc2FwaWNfc2h1dGRvd25fbGV2ZWxfaXJxLAogCS5lbmFibGUgPQlpb3NhcGljX2VuYWJsZV9sZXZlbF9pcnEsCkBAIC00NzMsNyArNDk0LDcgQEAKICNkZWZpbmUgaW9zYXBpY19lbmRfZWRnZV9pcnEJCW5vcAogCiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaXJxX3R5cGVfaW9zYXBpY19lZGdlID0gewotCS50eXBlbmFtZSA9CSJJTy1TQVBJQy1lZGdlIiwKKwkubmFtZSA9CQkiSU8tU0FQSUMtZWRnZSIsCiAJLnN0YXJ0dXAgPQlpb3NhcGljX3N0YXJ0dXBfZWRnZV9pcnEsCiAJLnNodXRkb3duID0JaW9zYXBpY19kaXNhYmxlX2VkZ2VfaXJxLAogCS5lbmFibGUgPQlpb3NhcGljX2VuYWJsZV9lZGdlX2lycSwKQEAgLTY2NCw3ICs2ODUsNyBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICIlczogY2hhbmdpbmcgdmVjdG9yICVkIGZyb20gJXMgdG8gJXNcbiIsCiAJCQkgICAgICAgX19GVU5DVElPTl9fLCB2ZWN0b3IsCi0JCQkgICAgICAgaWRlc2MtPmNoaXAtPnR5cGVuYW1lLCBpcnFfdHlwZS0+dHlwZW5hbWUpOworCQkJICAgICAgIGlkZXNjLT5jaGlwLT5uYW1lLCBpcnFfdHlwZS0+bmFtZSk7CiAJCWlkZXNjLT5jaGlwID0gaXJxX3R5cGU7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxLmMKaW5kZXggZjA3YzA4Ni4uNTRkNTVlNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycS5jCkBAIC03Niw3ICs3Niw3IEBACiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKIAkJfQogI2VuZGlmCi0JCXNlcV9wcmludGYocCwgIiAlMTRzIiwgaXJxX2Rlc2NbaV0uY2hpcC0+dHlwZW5hbWUpOworCQlzZXFfcHJpbnRmKHAsICIgJTE0cyIsIGlycV9kZXNjW2ldLmNoaXAtPm5hbWUpOwogCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKIAogCQlmb3IgKGFjdGlvbj1hY3Rpb24tPm5leHQ7IGFjdGlvbjsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KQpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MoTlVMTCk7CiAKIAkJCXZlY3RvcnNfaW5fbWlncmF0aW9uW2lycV09MDsKLQkJCV9fZG9fSVJRKGlycSk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAkJCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKaW5kZXggNjgzMzlkZDAuLmJhM2JhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKQEAgLTE4MCwxMSArMTgwLDEzIEBACiAJc2F2ZWRfdHByID0gaWE2NF9nZXRyZWcoX0lBNjRfUkVHX0NSX1RQUik7CiAJaWE2NF9zcmx6X2QoKTsKIAl3aGlsZSAodmVjdG9yICE9IElBNjRfU1BVUklPVVNfSU5UX1ZFQ1RPUikgewotCQlpZiAoIUlTX1JFU0NIRURVTEUodmVjdG9yKSkgeworCQlpZiAodW5saWtlbHkoSVNfUkVTQ0hFRFVMRSh2ZWN0b3IpKSkKKwkJCSBrc3RhdF90aGlzX2NwdS5pcnFzW3ZlY3Rvcl0rKzsKKwkJZWxzZSB7CiAJCQlpYTY0X3NldHJlZyhfSUE2NF9SRUdfQ1JfVFBSLCB2ZWN0b3IpOwogCQkJaWE2NF9zcmx6X2QoKTsKIAotCQkJX19kb19JUlEobG9jYWxfdmVjdG9yX3RvX2lycSh2ZWN0b3IpKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShsb2NhbF92ZWN0b3JfdG9faXJxKHZlY3RvcikpOwogCiAJCQkvKgogCQkJICogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzZW5kIEVPSToKQEAgLTIyNSw3ICsyMjcsOSBAQAogCSAgKiBQZXJmb3JtIG5vcm1hbCBpbnRlcnJ1cHQgc3R5bGUgcHJvY2Vzc2luZwogCSAgKi8KIAl3aGlsZSAodmVjdG9yICE9IElBNjRfU1BVUklPVVNfSU5UX1ZFQ1RPUikgewotCQlpZiAoIUlTX1JFU0NIRURVTEUodmVjdG9yKSkgeworCQlpZiAodW5saWtlbHkoSVNfUkVTQ0hFRFVMRSh2ZWN0b3IpKSkKKwkJCSBrc3RhdF90aGlzX2NwdS5pcnFzW3ZlY3Rvcl0rKzsKKwkJZWxzZSB7CiAJCQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MoTlVMTCk7CiAKIAkJCWlhNjRfc2V0cmVnKF9JQTY0X1JFR19DUl9UUFIsIHZlY3Rvcik7CkBAIC0yMzgsNyArMjQyLDcgQEAKIAkJCSAqIFByb2JhYmx5IGNvdWxkIHNoYXJlZCBjb2RlLgogCQkJICovCiAJCQl2ZWN0b3JzX2luX21pZ3JhdGlvbltsb2NhbF92ZWN0b3JfdG9faXJxKHZlY3RvcildPTA7Ci0JCQlfX2RvX0lSUShsb2NhbF92ZWN0b3JfdG9faXJxKHZlY3RvcikpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGxvY2FsX3ZlY3Rvcl90b19pcnEodmVjdG9yKSk7CiAJCQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogCiAJCQkvKgpAQCAtMjU4LDExICsyNjIsMjIgQEAKICNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gaXJxcmV0dXJuX3QgaGFuZGxlX0lQSSAoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIAorc3RhdGljIGlycXJldHVybl90IGR1bW15X2hhbmRsZXIgKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlCVUcoKTsKK30KKwogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXBpX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWhhbmRsZV9JUEksCiAJLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKIAkubmFtZSA9CQkiSVBJIgogfTsKKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gcmVzY2hlZF9pcnFhY3Rpb24gPSB7CisJLmhhbmRsZXIgPQlkdW1teV9oYW5kbGVyLAorCS5mbGFncyA9CVNBX0lOVEVSUlVQVCwKKwkubmFtZSA9CQkicmVzY2hlZCIKK307CiAjZW5kaWYKIAogdm9pZApAQCAtMjg3LDYgKzMwMiw3IEBACiAJcmVnaXN0ZXJfcGVyY3B1X2lycShJQTY0X1NQVVJJT1VTX0lOVF9WRUNUT1IsIE5VTEwpOwogI2lmZGVmIENPTkZJR19TTVAKIAlyZWdpc3Rlcl9wZXJjcHVfaXJxKElBNjRfSVBJX1ZFQ1RPUiwgJmlwaV9pcnFhY3Rpb24pOworCXJlZ2lzdGVyX3BlcmNwdV9pcnEoSUE2NF9JUElfUkVTQ0hFRFVMRSwgJnJlc2NoZWRfaXJxYWN0aW9uKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19QRVJGTU9OCiAJcGZtX2luaXRfcGVyY3B1KCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lycV9sc2FwaWMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2xzYXBpYy5jCmluZGV4IDFhYjU4YjAuLmMyZjA3YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2xzYXBpYy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2xzYXBpYy5jCkBAIC0zNCw3ICszNCw3IEBACiB9CiAKIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9pYTY0X2xzYXBpYyA9IHsKLQkudHlwZW5hbWUgPQkiTFNBUElDIiwKKwkubmFtZSA9CQkiTFNBUElDIiwKIAkuc3RhcnR1cCA9CWxzYXBpY19ub29wX3N0YXJ0dXAsCiAJLnNodXRkb3duID0JbHNhcGljX25vb3AsCiAJLmVuYWJsZSA9CWxzYXBpY19ub29wLApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMgYi9hcmNoL2lhNjQva2VybmVsL2pwcm9iZXMuUwppbmRleCA1Y2Q2MjI2Zi4uNjIxNjMwMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9qcHJvYmVzLlMKQEAgLTQ1LDEzICs0NSwxNCBAQAogICogdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24uCiAgKi8KICNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KKyNpbmNsdWRlIDxhc20taWE2NC9icmVhay5oPgogCiAJLyoKIAkgKiB2b2lkIGpwcm9iZV9icmVhayh2b2lkKQogCSAqLwogCS5zZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKIEVOVFJZKGpwcm9iZV9icmVhaykKLQlicmVhay5tIDB4ODAzMDAKKwlicmVhay5tIF9fSUE2NF9CUkVBS19KUFJPQkUKIEVORChqcHJvYmVfYnJlYWspCiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwppbmRleCA1MTIxN2Q2Li42Y2I1NmRkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwpAQCAtODgsNiArODgsNyBAQAogewogCXAtPmFpbnNuLmluc3RfZmxhZyA9IDA7CiAJcC0+YWluc24udGFyZ2V0X2JyX3JlZyA9IDA7CisJcC0+YWluc24uc2xvdCA9IHNsb3Q7CiAKIAkvKiBDaGVjayBmb3IgQnJlYWsgaW5zdHJ1Y3Rpb24KIAkgKiBCaXRzIDM3OjQwIE1ham9yIG9wY29kZSB0byBiZSB6ZXJvCkBAIC0xMjksNDggKzEzMCw2IEBACiAKIC8qCiAgKiBJbiB0aGlzIGZ1bmN0aW9uIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAqIG9uIHdoaWNoIHdlIGFyZSBpbnNlcnRpbmcga3Byb2JlIGlzIHN1cHBvcnRlZC4KLSAqIFJldHVybnMgMCBpZiBzdXBwb3J0ZWQKLSAqIFJldHVybnMgLUVJTlZBTCBpZiB1bnN1cHBvcnRlZAotICovCi1zdGF0aWMgaW50IF9fa3Byb2JlcyB1bnN1cHBvcnRlZF9pbnN0KHVpbnQgdGVtcGxhdGUsIHVpbnQgIHNsb3QsCi0JCQkJICAgICAgdWludCBtYWpvcl9vcGNvZGUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdCwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JaWYgKGJ1bmRsZV9lbmNvZGluZ1t0ZW1wbGF0ZV1bc2xvdF0gPT0gSSkgewotCQlzd2l0Y2ggKG1ham9yX29wY29kZSkgewotCQkJY2FzZSAweDA6IC8vSV9VTklUX01JU0NfT1BDT0RFOgotCQkJLyoKLQkJCSAqIENoZWNrIGZvciBJbnRlZ2VyIHNwZWN1bGF0aW9uIGluc3RydWN0aW9uCi0JCQkgKiAtIEJpdCAzMy0zNSB0byBiZSBlcXVhbCB0byAweDEKLQkJCSAqLwotCQkJaWYgKCgoa3Byb2JlX2luc3QgPj4gMzMpICYgMHg3KSA9PSAxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkiS3Byb2JlcyBvbiBzcGVjdWxhdGlvbiBpbnN0IGF0IDwweCVseD4gbm90IHN1cHBvcnRlZFxuIiwKLQkJCQkJYWRkcik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJUCByZWxhdGl2ZSBtb3YgaW5zdHJ1Y3Rpb24KLQkJCSAqICAtIEJpdCAyNy0zNSB0byBiZSBlcXVhbCB0byAweDMwCi0JCQkgKi8KLQkJCWlmICgoKGtwcm9iZV9pbnN0ID4+IDI3KSAmIDB4MUZGKSA9PSAweDMwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkiS3Byb2JlcyBvbiBcIm1vdiByMT1pcFwiIGF0IDwweCVseD4gbm90IHN1cHBvcnRlZFxuIiwKLQkJCQkJYWRkcik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogSW4gdGhpcyBmdW5jdGlvbiB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGluc3RydWN0aW9uCiAgKiAocXApIGNtcHguY3JlbC5jdHlwZSBwMSxwMj1yMixyMwogICogb24gd2hpY2ggd2UgYXJlIGluc2VydGluZyBrcHJvYmUgaXMgY21wIGluc3RydWN0aW9uCiAgKiB3aXRoIGN0eXBlIGFzIHVuYy4KQEAgLTIwNiwyNiArMTY1LDEzNiBAQAogfQogCiAvKgorICogSW4gdGhpcyBmdW5jdGlvbiB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGluc3RydWN0aW9uCisgKiBvbiB3aGljaCB3ZSBhcmUgaW5zZXJ0aW5nIGtwcm9iZSBpcyBzdXBwb3J0ZWQuCisgKiBSZXR1cm5zIHFwIHZhbHVlIGlmIHN1cHBvcnRlZAorICogUmV0dXJucyAtRUlOVkFMIGlmIHVuc3VwcG9ydGVkCisgKi8KK3N0YXRpYyBpbnQgX19rcHJvYmVzIHVuc3VwcG9ydGVkX2luc3QodWludCB0ZW1wbGF0ZSwgdWludCAgc2xvdCwKKwkJCQkgICAgICB1aW50IG1ham9yX29wY29kZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgcXA7CisKKwlxcCA9IGtwcm9iZV9pbnN0ICYgMHgzZjsKKwlpZiAoaXNfY21wX2N0eXBlX3VuY19pbnN0KHRlbXBsYXRlLCBzbG90LCBtYWpvcl9vcGNvZGUsIGtwcm9iZV9pbnN0KSkgeworCQlpZiAoc2xvdCA9PSAxICYmIHFwKSAgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiS3Byb2JlcyBvbiBjbXAgdW5jIgorCQkJCQkiaW5zdHJ1Y3Rpb24gb24gc2xvdCAxIGF0IDwweCVseD4iCisJCQkJCSJpcyBub3Qgc3VwcG9ydGVkXG4iLCBhZGRyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCisJCX0KKwkJcXAgPSAwOworCX0KKwllbHNlIGlmIChidW5kbGVfZW5jb2RpbmdbdGVtcGxhdGVdW3Nsb3RdID09IEkpIHsKKwkJaWYgKG1ham9yX29wY29kZSA9PSAwKSB7CisJCQkvKgorCQkJICogQ2hlY2sgZm9yIEludGVnZXIgc3BlY3VsYXRpb24gaW5zdHJ1Y3Rpb24KKwkJCSAqIC0gQml0IDMzLTM1IHRvIGJlIGVxdWFsIHRvIDB4MQorCQkJICovCisJCQlpZiAoKChrcHJvYmVfaW5zdCA+PiAzMykgJiAweDcpID09IDEpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSJLcHJvYmVzIG9uIHNwZWN1bGF0aW9uIGluc3QgYXQgPDB4JWx4PiBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCQkJYWRkcik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQkvKgorCQkJICogSVAgcmVsYXRpdmUgbW92IGluc3RydWN0aW9uCisJCQkgKiAgLSBCaXQgMjctMzUgdG8gYmUgZXF1YWwgdG8gMHgzMAorCQkJICovCisJCQlpZiAoKChrcHJvYmVfaW5zdCA+PiAyNykgJiAweDFGRikgPT0gMHgzMCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIktwcm9iZXMgb24gXCJtb3YgcjE9aXBcIiBhdCA8MHglbHg+IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJCQlhZGRyKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJfQorCQl9CisJCWVsc2UgaWYgKChtYWpvcl9vcGNvZGUgPT0gNSkgJiYJIShrcHJvYmVfaW5zdCAmICgweEZVbCA8PCAzMykpICYmCisJCQkJKGtwcm9iZV9pbnN0ICYgKDB4MVVMIDw8IDEyKSkpIHsKKwkJCS8qIHRlc3QgYml0IGluc3RydWN0aW9ucywgdGJpdCx0bmF0LHRmCisJCQkgKiBiaXQgMzMtMzYgdG8gYmUgZXF1YWwgdG8gMAorCQkJICogYml0IDEyIHRvIGJlIGVxdWFsIHRvIDEKKwkJCSAqLworCQkJaWYgKHNsb3QgPT0gMSAmJiBxcCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIktwcm9iZXMgb24gdGVzdCBiaXQiCisJCQkJCQkiaW5zdHJ1Y3Rpb24gb24gc2xvdCBhdCA8MHglbHg+IgorCQkJCQkJImlzIG5vdCBzdXBwb3J0ZWRcbiIsIGFkZHIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcXAgPSAwOworCQl9CisJfQorCWVsc2UgaWYgKGJ1bmRsZV9lbmNvZGluZ1t0ZW1wbGF0ZV1bc2xvdF0gPT0gQikgeworCQlpZiAobWFqb3Jfb3Bjb2RlID09IDcpIHsKKwkJCS8qIElQLVJlbGF0aXZlIFByZWRpY3QgbWFqb3IgY29kZSBpcyA3ICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJLcHJvYmVzIG9uIElQLVJlbGF0aXZlIgorCQkJCQkiUHJlZGljdCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVsc2UgaWYgKG1ham9yX29wY29kZSA9PSAyKSB7CisJCQkvKiBJbmRpcmVjdCBQcmVkaWN0LCBtYWpvciBjb2RlIGlzIDIKKwkJCSAqIGJpdCAyNy0zMiB0byBiZSBlcXVhbCB0byAxMCBvciAxMQorCQkJICovCisJCQlpbnQgeDY9KGtwcm9iZV9pbnN0ID4+IDI3KSAmIDB4M0Y7CisJCQlpZiAoKHg2ID09IDB4MTApIHx8ICh4NiA9PSAweDExKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIktwcm9iZXMgb24iCisJCQkJCSJJbmRpcmVjdCBQcmVkaWN0IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCS8qIGtlcm5lbCBkb2VzIG5vdCB1c2UgZmxvYXQgaW5zdHJ1Y3Rpb24sIGhlcmUgZm9yIHNhZmV0eSBrcHJvYmUKKwkgKiB3aWxsIGp1ZGdlIHdoZXRoZXIgaXQgaXMgZmNtcC9mbGFzcy9mbG9hdCBhcHByb3hpbWF0aW9uIGluc3RydWN0aW9uCisJICovCisJZWxzZSBpZiAodW5saWtlbHkoYnVuZGxlX2VuY29kaW5nW3RlbXBsYXRlXVtzbG90XSA9PSBGKSkgeworCQlpZiAoKG1ham9yX29wY29kZSA9PSA0IHx8IG1ham9yX29wY29kZSA9PSA1KSAmJgorCQkJCShrcHJvYmVfaW5zdCAgJiAoMHgxIDw8IDEyKSkpIHsKKwkJCS8qIGZjbXAvZmNsYXNzIHVuYyBpbnN0cnVjdGlvbiAqLworCQkJaWYgKHNsb3QgPT0gMSAmJiBxcCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIktwcm9iZXMgb24gZmNtcC9mY2xhc3MgIgorCQkJCQkiaW5zdHJ1Y3Rpb24gb24gc2xvdCBhdCA8MHglbHg+ICIKKwkJCQkJImlzIG5vdCBzdXBwb3J0ZWRcbiIsIGFkZHIpOworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl9CisJCQlxcCA9IDA7CisJCX0KKwkJaWYgKChtYWpvcl9vcGNvZGUgPT0gMCB8fCBtYWpvcl9vcGNvZGUgPT0gMSkgJiYKKwkJCShrcHJvYmVfaW5zdCAmICgweDFVTCA8PCAzMykpKSB7CisJCQkvKiBmbG9hdCBBcHByb3hpbWF0aW9uIGluc3RydWN0aW9uICovCisJCQlpZiAoc2xvdCA9PSAxICYmIHFwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiS3Byb2JlcyBvbiBmbG9hdCBBcHByb3ggIgorCQkJCQkiaW5zdHIgYXQgPDB4JWx4PiBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCQkJYWRkcik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlxcCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHFwOworfQorCisvKgogICogSW4gdGhpcyBmdW5jdGlvbiB3ZSBvdmVycmlkZSB0aGUgYnVuZGxlIHdpdGgKICAqIHRoZSBicmVhayBpbnN0cnVjdGlvbiBhdCB0aGUgZ2l2ZW4gc2xvdC4KICAqLwogc3RhdGljIHZvaWQgX19rcHJvYmVzIHByZXBhcmVfYnJlYWtfaW5zdCh1aW50IHRlbXBsYXRlLCB1aW50ICBzbG90LAogCQkJCQkgdWludCBtYWpvcl9vcGNvZGUsCiAJCQkJCSB1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0LAotCQkJCQkgc3RydWN0IGtwcm9iZSAqcCkKKwkJCQkJIHN0cnVjdCBrcHJvYmUgKnAsCisJCQkJCSBpbnQgcXApCiB7CiAJdW5zaWduZWQgbG9uZyBicmVha19pbnN0ID0gQlJFQUtfSU5TVDsKIAlidW5kbGVfdCAqYnVuZGxlID0gJnAtPm9wY29kZS5idW5kbGU7CiAKIAkvKgogCSAqIENvcHkgdGhlIG9yaWdpbmFsIGtwcm9iZV9pbnN0IHF1YWxpZnlpbmcgcHJlZGljYXRlKHFwKQotCSAqIHRvIHRoZSBicmVhayBpbnN0cnVjdGlvbiBpZmYgIWlzX2NtcF9jdHlwZV91bmNfaW5zdAotCSAqIGJlY2F1c2UgZm9yIGNtcCBpbnN0cnVjdGlvbiB3aXRoIGN0eXBlIGVxdWFsIHRvIHVuYywKLQkgKiB3aGljaCBpcyBhIHNwZWNpYWwgaW5zdHJ1Y3Rpb24gYWx3YXlzIG5lZWRzIHRvIGJlCi0JICogZXhlY3V0ZWQgcmVncmFkbGVzcyBvZiBxcAorCSAqIHRvIHRoZSBicmVhayBpbnN0cnVjdGlvbgogCSAqLwotCWlmICghaXNfY21wX2N0eXBlX3VuY19pbnN0KHRlbXBsYXRlLCBzbG90LCBtYWpvcl9vcGNvZGUsIGtwcm9iZV9pbnN0KSkKLQkJYnJlYWtfaW5zdCB8PSAoMHgzZiAmIGtwcm9iZV9pbnN0KTsKKwlicmVha19pbnN0IHw9IHFwOwogCiAJc3dpdGNoIChzbG90KSB7CiAJICBjYXNlIDA6CkBAIC0yOTYsMTIgKzM2NSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChzbG90ID09IDEgJiYgYnVuZGxlX2VuY29kaW5nW3RlbXBsYXRlXVsxXSAhPSBMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkluc2VydGluZyBrcHJvYmVzIG9uIHNsb3QgIzEgIgotCQkgICAgICAgImlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDI3LDYgKzQ5MCw3IEBACiAJdW5zaWduZWQgbG9uZyBrcHJvYmVfaW5zdD0wOwogCXVuc2lnbmVkIGludCBzbG90ID0gYWRkciAmIDB4ZiwgdGVtcGxhdGUsIG1ham9yX29wY29kZSA9IDA7CiAJYnVuZGxlX3QgKmJ1bmRsZTsKKwlpbnQgcXA7CiAKIAlidW5kbGUgPSAmKChrcHJvYmVfb3Bjb2RlX3QgKilrcHJvYmVfYWRkciktPmJ1bmRsZTsKIAl0ZW1wbGF0ZSA9IGJ1bmRsZS0+cXVhZDAudGVtcGxhdGU7CkBAIC00NDEsOSArNTA1LDkgQEAKIAkvKiBHZXQga3Byb2JlX2luc3QgYW5kIG1ham9yX29wY29kZSBmcm9tIHRoZSBidW5kbGUgKi8KIAlnZXRfa3Byb2JlX2luc3QoYnVuZGxlLCBzbG90LCAma3Byb2JlX2luc3QsICZtYWpvcl9vcGNvZGUpOwogCi0JaWYgKHVuc3VwcG9ydGVkX2luc3QodGVtcGxhdGUsIHNsb3QsIG1ham9yX29wY29kZSwga3Byb2JlX2luc3QsIGFkZHIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KKwlxcCA9IHVuc3VwcG9ydGVkX2luc3QodGVtcGxhdGUsIHNsb3QsIG1ham9yX29wY29kZSwga3Byb2JlX2luc3QsIGFkZHIpOworCWlmIChxcCA8IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJcC0+YWluc24uaW5zbiA9IGdldF9pbnNuX3Nsb3QoKTsKIAlpZiAoIXAtPmFpbnNuLmluc24pCkBAIC00NTEsMzcgKzUxNSw2MyBAQAogCW1lbWNweSgmcC0+b3Bjb2RlLCBrcHJvYmVfYWRkciwgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogCW1lbWNweShwLT5haW5zbi5pbnNuLCBrcHJvYmVfYWRkciwgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogCi0JcHJlcGFyZV9icmVha19pbnN0KHRlbXBsYXRlLCBzbG90LCBtYWpvcl9vcGNvZGUsIGtwcm9iZV9pbnN0LCBwKTsKKwlwcmVwYXJlX2JyZWFrX2luc3QodGVtcGxhdGUsIHNsb3QsIG1ham9yX29wY29kZSwga3Byb2JlX2luc3QsIHAsIHFwKTsKIAogCXJldHVybiAwOwogfQogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOwotCXVuc2lnbmVkIGxvbmcgYXJtX2FkZHIgPSBhZGRyICYgfjB4RlVMTDsKKwl1bnNpZ25lZCBsb25nIGFybV9hZGRyOworCWJ1bmRsZV90ICpzcmMsICpkZXN0OworCisJYXJtX2FkZHIgPSAoKHVuc2lnbmVkIGxvbmcpcC0+YWRkcikgJiB+MHhGVUw7CisJZGVzdCA9ICYoKGtwcm9iZV9vcGNvZGVfdCAqKWFybV9hZGRyKS0+YnVuZGxlOworCXNyYyA9ICZwLT5vcGNvZGUuYnVuZGxlOwogCiAJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKXAtPmFpbnNuLmluc24sCiAJCQkodW5zaWduZWQgbG9uZylwLT5haW5zbi5pbnNuICsgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwotCW1lbWNweSgoY2hhciAqKWFybV9hZGRyLCAmcC0+b3Bjb2RlLCBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CisJc3dpdGNoIChwLT5haW5zbi5zbG90KSB7CisJCWNhc2UgMDoKKwkJCWRlc3QtPnF1YWQwLnNsb3QwID0gc3JjLT5xdWFkMC5zbG90MDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkZXN0LT5xdWFkMS5zbG90MV9wMSA9IHNyYy0+cXVhZDEuc2xvdDFfcDE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZGVzdC0+cXVhZDEuc2xvdDIgPSBzcmMtPnF1YWQxLnNsb3QyOworCQkJYnJlYWs7CisJfQogCWZsdXNoX2ljYWNoZV9yYW5nZShhcm1fYWRkciwgYXJtX2FkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewotCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7Ci0JdW5zaWduZWQgbG9uZyBhcm1fYWRkciA9IGFkZHIgJiB+MHhGVUxMOworCXVuc2lnbmVkIGxvbmcgYXJtX2FkZHI7CisJYnVuZGxlX3QgKnNyYywgKmRlc3Q7CiAKKwlhcm1fYWRkciA9ICgodW5zaWduZWQgbG9uZylwLT5hZGRyKSAmIH4weEZVTDsKKwlkZXN0ID0gJigoa3Byb2JlX29wY29kZV90ICopYXJtX2FkZHIpLT5idW5kbGU7CiAJLyogcC0+YWluc24uaW5zbiBjb250YWlucyB0aGUgb3JpZ2luYWwgdW5hbHRlcmVkIGtwcm9iZV9vcGNvZGVfdCAqLwotCW1lbWNweSgoY2hhciAqKSBhcm1fYWRkciwgKGNoYXIgKikgcC0+YWluc24uaW5zbiwKLQkJCQkJIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKKwlzcmMgPSAmcC0+YWluc24uaW5zbi0+YnVuZGxlOworCXN3aXRjaCAocC0+YWluc24uc2xvdCkgeworCQljYXNlIDA6CisJCQlkZXN0LT5xdWFkMC5zbG90MCA9IHNyYy0+cXVhZDAuc2xvdDA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZGVzdC0+cXVhZDEuc2xvdDFfcDEgPSBzcmMtPnF1YWQxLnNsb3QxX3AxOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWRlc3QtPnF1YWQxLnNsb3QyID0gc3JjLT5xdWFkMS5zbG90MjsKKwkJCWJyZWFrOworCX0KIAlmbHVzaF9pY2FjaGVfcmFuZ2UoYXJtX2FkZHIsIGFybV9hZGRyICsgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogfQogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24pOworCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOwogCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKIH0KIC8qCkBAIC04MDcsNyArODk3LDkgQEAKIAlzd2l0Y2godmFsKSB7CiAJY2FzZSBESUVfQlJFQUs6CiAJCS8qIGVyciBpcyBicmVhayBudW1iZXIgZnJvbSBpYTY0X2JhZF9icmVhaygpICovCi0JCWlmIChhcmdzLT5lcnIgPT0gMHg4MDIwMCB8fCBhcmdzLT5lcnIgPT0gMHg4MDMwMCB8fCBhcmdzLT5lcnIgPT0gMCkKKwkJaWYgKChhcmdzLT5lcnIgPj4gMTIpID09IChfX0lBNjRfQlJFQUtfS1BST0JFID4+IDEyKQorCQkJfHwgYXJncy0+ZXJyID09IF9fSUE2NF9CUkVBS19KUFJPQkUKKwkJCXx8IGFyZ3MtPmVyciA9PSAwKQogCQkJaWYgKHByZV9rcHJvYmVzX2hhbmRsZXIoYXJncykpCiAJCQkJcmV0ID0gTk9USUZZX1NUT1A7CiAJCWJyZWFrOwpAQCAtODUxLDcgKzk0Myw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9IHdoaWxlICh1bndfdW53aW5kKGluZm8pID49IDApOwotCWxwLT5ic3AgPSAwOworCWxwLT5ic3AgPSBOVUxMOwogCWxwLT5jZm0gPSAwOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjY2M5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogYXJjaC9pYTY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKyAqCisgKiBIYW5kbGUgdHJhbnNpdGlvbiBvZiBMaW51eCBib290aW5nIGFub3RoZXIga2VybmVsCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbWFwbnksIEwuUC4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBLaGFsaWQgQXppeiA8a2hhbGlkLmF6aXpAaHAuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2IEludGVsIENvcnAsIFpvdSBOYW4gaGFpIDxuYW5oYWkuem91QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vbWVtaW5pdC5oPgorCit0eXBlZGVmIE5PUkVUX1RZUEUgdm9pZCAoKnJlbG9jYXRlX25ld19rZXJuZWxfdCkoCisJCQkJCXVuc2lnbmVkIGxvbmcgaW5kaXJlY3Rpb25fcGFnZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLAorCQkJCQlzdHJ1Y3QgaWE2NF9ib290X3BhcmFtICpib290X3BhcmFtLAorCQkJCQl1bnNpZ25lZCBsb25nIHBhbF9hZGRyKSBBVFRSSUJfTk9SRVQ7CisKK3N0cnVjdCBraW1hZ2UgKmlhNjRfa2ltYWdlOworCitzdHJ1Y3QgcmVzb3VyY2UgZWZpX21lbW1hcF9yZXMgPSB7CisgICAgICAgIC5uYW1lICA9ICJFRkkgTWVtb3J5IE1hcCIsCisgICAgICAgIC5zdGFydCA9IDAsCisgICAgICAgIC5lbmQgICA9IDAsCisgICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdHJ1Y3QgcmVzb3VyY2UgYm9vdF9wYXJhbV9yZXMgPSB7CisgICAgICAgIC5uYW1lICA9ICJCb290IHBhcmFtZXRlciIsCisgICAgICAgIC5zdGFydCA9IDAsCisgICAgICAgIC5lbmQgICA9IDAsCisgICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCisKKy8qCisgKiBEbyB3aGF0IGV2ZXJ5IHNldHVwIGlzIG5lZWRlZCBvbiBpbWFnZSBhbmQgdGhlCisgKiByZWJvb3QgY29kZSBidWZmZXIgdG8gYWxsb3cgdXMgdG8gYXZvaWQgYWxsb2NhdGlvbnMKKyAqIGxhdGVyLgorICovCitpbnQgbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCXZvaWQgKmNvbnRyb2xfY29kZV9idWZmZXI7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuYzsKKworCWZ1bmMgPSAodW5zaWduZWQgbG9uZyAqKSZyZWxvY2F0ZV9uZXdfa2VybmVsOworCS8qIFByZS1sb2FkIGNvbnRyb2wgY29kZSBidWZmZXIgdG8gbWluaW1pemUgd29yayBpbiBrZXhlYyBwYXRoICovCisJY29udHJvbF9jb2RlX2J1ZmZlciA9IHBhZ2VfYWRkcmVzcyhpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpOworCW1lbWNweSgodm9pZCAqKWNvbnRyb2xfY29kZV9idWZmZXIsIChjb25zdCB2b2lkICopZnVuY1swXSwKKwkJCXJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZSk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWNvbnRyb2xfY29kZV9idWZmZXIsCisJCQkodW5zaWduZWQgbG9uZyljb250cm9sX2NvZGVfYnVmZmVyICsgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplKTsKKwlpYTY0X2tpbWFnZSA9IGltYWdlOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWFjaGluZV9rZXhlY19jbGVhbnVwKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworfQorCit2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCQljcHVfZG93bihjcHUpOworCX0KKwlrZXhlY19kaXNhYmxlX2lvc2FwaWMoKTsKK30KKworLyoKKyAqIERvIG5vdCBhbGxvY2F0ZSBtZW1vcnkgKG9yIGZhaWwgaW4gYW55IHdheSkgaW4gbWFjaGluZV9rZXhlYygpLgorICogV2UgYXJlIHBhc3QgdGhlIHBvaW50IG9mIG5vIHJldHVybiwgY29tbWl0dGVkIHRvIHJlYm9vdGluZyBub3cuCisgKi8KK2V4dGVybiB2b2lkICplZmlfZ2V0X3BhbF9hZGRyKHZvaWQpOworc3RhdGljIHZvaWQgaWE2NF9tYWNoaW5lX2tleGVjKHN0cnVjdCB1bndfZnJhbWVfaW5mbyAqaW5mbywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBraW1hZ2UgKmltYWdlID0gYXJnOworCXJlbG9jYXRlX25ld19rZXJuZWxfdCBybms7CisJdm9pZCAqcGFsX2FkZHIgPSBlZmlfZ2V0X3BhbF9hZGRyKCk7CisJdW5zaWduZWQgbG9uZyBjb2RlX2FkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MoaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKTsKKwl1bnNpZ25lZCBsb25nIHZlY3RvcjsKKwlpbnQgaWk7CisKKwlpZiAoaW1hZ2UtPnR5cGUgPT0gS0VYRUNfVFlQRV9DUkFTSCkgeworCQljcmFzaF9zYXZlX3RoaXNfY3B1KCk7CisJCWN1cnJlbnQtPnRocmVhZC5rc3AgPSAoX191NjQpaW5mby0+c3cgLSAxNjsKKwl9CisKKwkvKiBJbnRlcnJ1cHRzIGFyZW4ndCBhY2NlcHRhYmxlIHdoaWxlIHdlIHJlYm9vdCAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBNYXNrIENNQyBhbmQgUGVyZm9ybWFuY2UgTW9uaXRvciBpbnRlcnJ1cHRzICovCisJaWE2NF9zZXRyZWcoX0lBNjRfUkVHX0NSX1BNViwgMSA8PCAxNik7CisJaWE2NF9zZXRyZWcoX0lBNjRfUkVHX0NSX0NNQ1YsIDEgPDwgMTYpOworCisJLyogTWFzayBJVFYgYW5kIExvY2FsIFJlZGlyZWN0IFJlZ2lzdGVycyAqLworCWlhNjRfc2V0X2l0digxIDw8IDE2KTsKKwlpYTY0X3NldF9scnIwKDEgPDwgMTYpOworCWlhNjRfc2V0X2xycjEoMSA8PCAxNik7CisKKwkvKiB0ZXJtaW5hdGUgcG9zc2libGUgbmVzdGVkIGluLXNlcnZpY2UgaW50ZXJydXB0cyAqLworCWZvciAoaWkgPSAwOyBpaSA8IDE2OyBpaSsrKQorCQlpYTY0X2VvaSgpOworCisJLyogdW5tYXNrIFRQUiBhbmQgY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCWlhNjRfc2V0cmVnKF9JQTY0X1JFR19DUl9UUFIsIDApOworCWlhNjRfc3Jsel9kKCk7CisJdmVjdG9yID0gaWE2NF9nZXRfaXZyKCk7CisJd2hpbGUgKHZlY3RvciAhPSBJQTY0X1NQVVJJT1VTX0lOVF9WRUNUT1IpIHsKKwkJaWE2NF9lb2koKTsKKwkJdmVjdG9yID0gaWE2NF9nZXRfaXZyKCk7CisJfQorCXBsYXRmb3JtX2tlcm5lbF9sYXVuY2hfZXZlbnQoKTsKKwlybmsgPSAocmVsb2NhdGVfbmV3X2tlcm5lbF90KSZjb2RlX2FkZHI7CisJKCpybmspKGltYWdlLT5oZWFkLCBpbWFnZS0+c3RhcnQsIGlhNjRfYm9vdF9wYXJhbSwKKwkJICAgICBHUkFOVUxFUk9VTkRET1dOKCh1bnNpZ25lZCBsb25nKSBwYWxfYWRkcikpOworCUJVRygpOworfQorCit2b2lkIG1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJdW53X2luaXRfcnVubmluZyhpYTY0X21hY2hpbmVfa2V4ZWMsIGltYWdlKTsKKwlmb3IoOzspOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKaW5kZXggN2NmYTYzYTkuLmE3NmFkZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtODIsNiArODIsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc2FsLmg+CiAjaW5jbHVkZSA8YXNtL21jYS5oPgorI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KQEAgLTY3OCw3ICs2NzksNyBAQAogICogZGlzYWJsZSB0aGUgY21jIGludGVycnVwdCB2ZWN0b3IuCiAgKi8KIHN0YXRpYyB2b2lkCi1pYTY0X21jYV9jbWNfdmVjdG9yX2Rpc2FibGVfa2V2ZW50ZCh2b2lkICp1bnVzZWQpCitpYTY0X21jYV9jbWNfdmVjdG9yX2Rpc2FibGVfa2V2ZW50ZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKIHsKIAlvbl9lYWNoX2NwdShpYTY0X21jYV9jbWNfdmVjdG9yX2Rpc2FibGUsIE5VTEwsIDEsIDApOwogfQpAQCAtNjkwLDcgKzY5MSw3IEBACiAgKiBlbmFibGUgdGhlIGNtYyBpbnRlcnJ1cHQgdmVjdG9yLgogICovCiBzdGF0aWMgdm9pZAotaWE2NF9tY2FfY21jX3ZlY3Rvcl9lbmFibGVfa2V2ZW50ZCh2b2lkICp1bnVzZWQpCitpYTY0X21jYV9jbWNfdmVjdG9yX2VuYWJsZV9rZXZlbnRkKHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKQogewogCW9uX2VhY2hfY3B1KGlhNjRfbWNhX2NtY192ZWN0b3JfZW5hYmxlLCBOVUxMLCAxLCAwKTsKIH0KQEAgLTEyMzgsNiArMTIzOSwxMCBAQAogCX0gZWxzZSB7CiAJCS8qIER1bXAgYnVmZmVyZWQgbWVzc2FnZSB0byBjb25zb2xlICovCiAJCWlhNjRfbWxvZ2J1Zl9maW5pc2goMSk7CisjaWZkZWYgQ09ORklHX0tFWEVDCisJCWF0b21pY19zZXQoJmtkdW1wX2luX3Byb2dyZXNzLCAxKTsKKwkJbW9uYXJjaF9jcHUgPSAtMTsKKyNlbmRpZgogCX0KIAlpZiAobm90aWZ5X2RpZShESUVfTUNBX01PTkFSQ0hfTEVBVkUsICJNQ0EiLCByZWdzLCAobG9uZykmbmQsIDAsIHJlY292ZXIpCiAJCQk9PSBOT1RJRllfU1RPUCkKQEAgLTEyNDcsOCArMTI1Miw4IEBACiAJbW9uYXJjaF9jcHUgPSAtMTsKIH0KIAotc3RhdGljIERFQ0xBUkVfV09SSyhjbWNfZGlzYWJsZV93b3JrLCBpYTY0X21jYV9jbWNfdmVjdG9yX2Rpc2FibGVfa2V2ZW50ZCwgTlVMTCk7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKGNtY19lbmFibGVfd29yaywgaWE2NF9tY2FfY21jX3ZlY3Rvcl9lbmFibGVfa2V2ZW50ZCwgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9XT1JLKGNtY19kaXNhYmxlX3dvcmssIGlhNjRfbWNhX2NtY192ZWN0b3JfZGlzYWJsZV9rZXZlbnRkKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoY21jX2VuYWJsZV93b3JrLCBpYTY0X21jYV9jbWNfdmVjdG9yX2VuYWJsZV9rZXZlbnRkKTsKIAogLyoKICAqIGlhNjRfbWNhX2NtY19pbnRfaGFuZGxlcgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmMgYi9hcmNoL2lhNjQva2VybmVsL21jYV9kcnYuYwppbmRleCBhNDUwMDlkLi5hZmMxNDAzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYV9kcnYuYworKysgYi9hcmNoL2lhNjQva2VybmVsL21jYV9kcnYuYwpAQCAtNDM1LDYgKzQzNSw1MCBAQAogfQogCiAvKioKKyAqIGdldF90YXJnZXRfaWRlbnRpZmllciAtIEdldCB0aGUgdmFsaWQgQ2FjaGUgb3IgQnVzIGNoZWNrIHRhcmdldCBpZGVudGlmaWVyLgorICogQHBlaWR4Oglwb2ludGVyIG9mIGluZGV4IG9mIHByb2Nlc3NvciBlcnJvciBzZWN0aW9uCisgKgorICogUmV0dXJuIHZhbHVlOgorICoJdGFyZ2V0IGFkZHJlc3Mgb24gU3VjY2VzcyAvIDAgb24gRmFpbHVlCisgKi8KK3N0YXRpYyB1NjQKK2dldF90YXJnZXRfaWRlbnRpZmllcihwZWlkeF90YWJsZV90ICpwZWlkeCkKK3sKKwl1NjQgdGFyZ2V0X2FkZHJlc3MgPSAwOworCXNhbF9sb2dfbW9kX2Vycm9yX2luZm9fdCAqc21laTsKKwlwYWxfY2FjaGVfY2hlY2tfaW5mb190ICpwY2NpOworCWludCBpLCBsZXZlbCA9IDk7CisKKwkvKgorCSAqIExvb2sgdGhyb3VnaCB0aGUgY2FjaGUgY2hlY2tzIGZvciBhIHZhbGlkIHRhcmdldCBpZGVudGlmaWVyCisJICogSWYgbW9yZSB0aGFuIG9uZSB2YWxpZCB0YXJnZXQgaWRlbnRpZmllciwgcmV0dXJuIHRoZSBvbmUKKwkgKiB3aXRoIHRoZSBsb3dlc3QgY2FjaGUgbGV2ZWwuCisJICovCisJZm9yIChpID0gMDsgaSA8IHBlaWR4X2NhY2hlX2NoZWNrX251bShwZWlkeCk7IGkrKykgeworCQlzbWVpID0gKHNhbF9sb2dfbW9kX2Vycm9yX2luZm9fdCAqKXBlaWR4X2NhY2hlX2NoZWNrKHBlaWR4LCBpKTsKKwkJaWYgKHNtZWktPnZhbGlkLnRhcmdldF9pZGVudGlmaWVyICYmIHNtZWktPnRhcmdldF9pZGVudGlmaWVyKSB7CisJCQlwY2NpID0gKHBhbF9jYWNoZV9jaGVja19pbmZvX3QgKikmKHNtZWktPmNoZWNrX2luZm8pOworCQkJaWYgKCF0YXJnZXRfYWRkcmVzcyB8fCAocGNjaS0+bGV2ZWwgPCBsZXZlbCkpIHsKKwkJCQl0YXJnZXRfYWRkcmVzcyA9IHNtZWktPnRhcmdldF9pZGVudGlmaWVyOworCQkJCWxldmVsID0gcGNjaS0+bGV2ZWw7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwl9CisJaWYgKHRhcmdldF9hZGRyZXNzKQorCQlyZXR1cm4gdGFyZ2V0X2FkZHJlc3M7CisKKwkvKgorCSAqIExvb2sgYXQgdGhlIGJ1cyBjaGVjayBmb3IgYSB2YWxpZCB0YXJnZXQgaWRlbnRpZmllcgorCSAqLworCXNtZWkgPSBwZWlkeF9idXNfY2hlY2socGVpZHgsIDApOworCWlmIChzbWVpICYmIHNtZWktPnZhbGlkLnRhcmdldF9pZGVudGlmaWVyKQorCQlyZXR1cm4gc21laS0+dGFyZ2V0X2lkZW50aWZpZXI7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiByZWNvdmVyX2Zyb21fcmVhZF9lcnJvciAtIFRyeSB0byByZWNvdmVyIHRoZSBlcnJvcnMgd2hpY2ggdHlwZSBhcmUgInJlYWQicy4KICAqIEBzbGlkeDoJcG9pbnRlciBvZiBpbmRleCBvZiBTQUwgZXJyb3IgcmVjb3JkCiAgKiBAcGVpZHg6CXBvaW50ZXIgb2YgaW5kZXggb2YgcHJvY2Vzc29yIGVycm9yIHNlY3Rpb24KQEAgLTQ1MCwxMyArNDk0LDE0IEBACiAJCQlwZWlkeF90YWJsZV90ICpwZWlkeCwgcGFsX2J1c19jaGVja19pbmZvX3QgKnBiY2ksCiAJCQlzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgKnNvcykKIHsKLQlzYWxfbG9nX21vZF9lcnJvcl9pbmZvX3QgKnNtZWk7CisJdTY0IHRhcmdldF9pZGVudGlmaWVyOwogCXBhbF9taW5fc3RhdGVfYXJlYV90ICpwbXNhOwogCXN0cnVjdCBpYTY0X3BzciAqcHNyMSwgKnBzcjI7CiAJaWE2NF9mcHRyX3QgKm1jYV9oZGxyX2JoID0gKGlhNjRfZnB0cl90KiltY2FfaGFuZGxlcl9iaGhvb2s7CiAKIAkvKiBJcyB0YXJnZXQgYWRkcmVzcyB2YWxpZD8gKi8KLQlpZiAoIXBiY2ktPnR2KQorCXRhcmdldF9pZGVudGlmaWVyID0gZ2V0X3RhcmdldF9pZGVudGlmaWVyKHBlaWR4KTsKKwlpZiAoIXRhcmdldF9pZGVudGlmaWVyKQogCQlyZXR1cm4gZmF0YWxfbWNhKCJ0YXJnZXQgYWRkcmVzcyBub3QgdmFsaWQiKTsKIAogCS8qCkBAIC00ODcsMzIgKzUzMiwyOCBAQAogCXBtc2EgPSBzb3MtPnBhbF9taW5fc3RhdGU7CiAJaWYgKHBzcjEtPmNwbCAhPSAwIHx8CiAJICAgKChwc3IyLT5jcGwgIT0gMCkgJiYgbWNhX3JlY292ZXJfcmFuZ2UocG1zYS0+cG1zYV9paXApKSkgewotCQlzbWVpID0gcGVpZHhfYnVzX2NoZWNrKHBlaWR4LCAwKTsKLQkJaWYgKHNtZWktPnZhbGlkLnRhcmdldF9pZGVudGlmaWVyKSB7Ci0JCQkvKgotCQkJICogIHNldHVwIGZvciByZXN1bWUgdG8gYm90dG9tIGhhbGYgb2YgTUNBLAotCQkJICogIm1jYV9oYW5kbGVyX2JoaG9vayIKLQkJCSAqLwotCQkJLyogcGFzcyB0byBiaGhvb2sgYXMgYXJndW1lbnQgKGdyOCwgLi4uKSAqLwotCQkJcG1zYS0+cG1zYV9ncls4LTFdID0gc21laS0+dGFyZ2V0X2lkZW50aWZpZXI7Ci0JCQlwbXNhLT5wbXNhX2dyWzktMV0gPSBwbXNhLT5wbXNhX2lpcDsKLQkJCXBtc2EtPnBtc2FfZ3JbMTAtMV0gPSBwbXNhLT5wbXNhX2lwc3I7Ci0JCQkvKiBzZXQgaW50ZXJydXB0ZWQgcmV0dXJuIGFkZHJlc3MgKGJ1dCBubyB1c2UpICovCi0JCQlwbXNhLT5wbXNhX2JyMCA9IHBtc2EtPnBtc2FfaWlwOwotCQkJLyogY2hhbmdlIHJlc3VtZSBhZGRyZXNzIHRvIGJvdHRvbSBoYWxmICovCi0JCQlwbXNhLT5wbXNhX2lpcCA9IG1jYV9oZGxyX2JoLT5mcDsKLQkJCXBtc2EtPnBtc2FfZ3JbMS0xXSA9IG1jYV9oZGxyX2JoLT5ncDsKLQkJCS8qIHNldCBjcGwgd2l0aCBrZXJuZWwgbW9kZSAqLwotCQkJcHNyMiA9IChzdHJ1Y3QgaWE2NF9wc3IgKikmcG1zYS0+cG1zYV9pcHNyOwotCQkJcHNyMi0+Y3BsID0gMDsKLQkJCXBzcjItPnJpICA9IDA7Ci0JCQlwc3IyLT5ibiAgPSAxOwotCQkJcHNyMi0+aSAgPSAwOworCQkvKgorCQkgKiAgc2V0dXAgZm9yIHJlc3VtZSB0byBib3R0b20gaGFsZiBvZiBNQ0EsCisJCSAqICJtY2FfaGFuZGxlcl9iaGhvb2siCisJCSAqLworCQkvKiBwYXNzIHRvIGJoaG9vayBhcyBhcmd1bWVudCAoZ3I4LCAuLi4pICovCisJCXBtc2EtPnBtc2FfZ3JbOC0xXSA9IHRhcmdldF9pZGVudGlmaWVyOworCQlwbXNhLT5wbXNhX2dyWzktMV0gPSBwbXNhLT5wbXNhX2lpcDsKKwkJcG1zYS0+cG1zYV9nclsxMC0xXSA9IHBtc2EtPnBtc2FfaXBzcjsKKwkJLyogc2V0IGludGVycnVwdGVkIHJldHVybiBhZGRyZXNzIChidXQgbm8gdXNlKSAqLworCQlwbXNhLT5wbXNhX2JyMCA9IHBtc2EtPnBtc2FfaWlwOworCQkvKiBjaGFuZ2UgcmVzdW1lIGFkZHJlc3MgdG8gYm90dG9tIGhhbGYgKi8KKwkJcG1zYS0+cG1zYV9paXAgPSBtY2FfaGRscl9iaC0+ZnA7CisJCXBtc2EtPnBtc2FfZ3JbMS0xXSA9IG1jYV9oZGxyX2JoLT5ncDsKKwkJLyogc2V0IGNwbCB3aXRoIGtlcm5lbCBtb2RlICovCisJCXBzcjIgPSAoc3RydWN0IGlhNjRfcHNyICopJnBtc2EtPnBtc2FfaXBzcjsKKwkJcHNyMi0+Y3BsID0gMDsKKwkJcHNyMi0+cmkgID0gMDsKKwkJcHNyMi0+Ym4gID0gMTsKKwkJcHNyMi0+aSAgPSAwOwogCi0JCQlyZXR1cm4gbWNhX3JlY292ZXJlZCgidXNlciBtZW1vcnkgY29ycnVwdGlvbi4gIgorCQlyZXR1cm4gbWNhX3JlY292ZXJlZCgidXNlciBtZW1vcnkgY29ycnVwdGlvbi4gIgogCQkJCSJraWxsIGFmZmVjdGVkIHByb2Nlc3MgLSByZWNvdmVyZWQuIik7Ci0JCX0KLQogCX0KIAogCXJldHVybiBmYXRhbF9tY2EoImtlcm5lbCBjb250ZXh0IG5vdCByZWNvdmVyZWQsIGlpcCAweCVseFxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcGFsLlMgYi9hcmNoL2lhNjQva2VybmVsL3BhbC5TCmluZGV4IGViYWYxZTYuLjBiNTMzNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGFsLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wYWwuUwpAQCAtMjEsMTEgKzIxLDEyIEBACiAJLnRleHQKIAogLyoKLSAqIFNldCB0aGUgUEFMIGVudHJ5IHBvaW50IGFkZHJlc3MuICBUaGlzIGNvdWxkIGJlIHdyaXR0ZW4gaW4gQyBjb2RlLCBidXQgd2UgZG8gaXQgaGVyZQotICogdG8ga2VlcCBpdCBhbGwgaW4gb25lIG1vZHVsZSAoYmVzaWRlcywgaXQncyBzbyB0cml2aWFsIHRoYXQgaXQncworICogU2V0IHRoZSBQQUwgZW50cnkgcG9pbnQgYWRkcmVzcy4gIFRoaXMgY291bGQgYmUgd3JpdHRlbiBpbiBDIGNvZGUsIGJ1dCB3ZQorICogZG8gaXQgaGVyZSB0byBrZWVwIGl0IGFsbCBpbiBvbmUgbW9kdWxlIChiZXNpZGVzLCBpdCdzIHNvIHRyaXZpYWwgdGhhdCBpdCdzCiAgKiBub3QgYSBiaWcgZGVhbCkuCiAgKgotICogaW4wCQlBZGRyZXNzIG9mIHRoZSBQQUwgZW50cnkgcG9pbnQgKHRleHQgYWRkcmVzcywgTk9UIGEgZnVuY3Rpb24gZGVzY3JpcHRvcikuCisgKiBpbjAJCUFkZHJlc3Mgb2YgdGhlIFBBTCBlbnRyeSBwb2ludCAodGV4dCBhZGRyZXNzLCBOT1QgYSBmdW5jdGlvbgorICoJCWRlc2NyaXB0b3IpLgogICovCiBHTE9CQUxfRU5UUlkoaWE2NF9wYWxfaGFuZGxlcl9pbml0KQogCWFsbG9jIHIzPWFyLnBmcywxLDAsMCwwCkBAIC0zNiw5ICszNyw5IEBACiBFTkQoaWE2NF9wYWxfaGFuZGxlcl9pbml0KQogCiAvKgotICogRGVmYXVsdCBQQUwgY2FsbCBoYW5kbGVyLiAgVGhpcyBuZWVkcyB0byBiZSBjb2RlZCBpbiBhc3NlbWJseSBiZWNhdXNlIGl0IHVzZXMKLSAqIHRoZSBzdGF0aWMgY2FsbGluZyBjb252ZW50aW9uLCBpLmUuLCB0aGUgUlNFIG1heSBub3QgYmUgdXNlZCBhbmQgY2FsbHMgYXJlCi0gKiBkb25lIHZpYSAiYnIuY29uZCIgKG5vdCAiYnIuY2FsbCIpLgorICogRGVmYXVsdCBQQUwgY2FsbCBoYW5kbGVyLiAgVGhpcyBuZWVkcyB0byBiZSBjb2RlZCBpbiBhc3NlbWJseSBiZWNhdXNlIGl0CisgKiB1c2VzIHRoZSBzdGF0aWMgY2FsbGluZyBjb252ZW50aW9uLCBpLmUuLCB0aGUgUlNFIG1heSBub3QgYmUgdXNlZCBhbmQKKyAqIGNhbGxzIGFyZSBkb25lIHZpYSAiYnIuY29uZCIgKG5vdCAiYnIuY2FsbCIpLgogICovCiBHTE9CQUxfRU5UUlkoaWE2NF9wYWxfZGVmYXVsdF9oYW5kbGVyKQogCW1vdiByOD0tMQpAQCAtNTAsMTIgKzUxLDEwIEBACiAgKgogICogaW4wICAgICAgICAgSW5kZXggb2YgUEFMIHNlcnZpY2UKICAqIGluMSAtIGluMyAgIFJlbWFpbmluZyBQQUwgYXJndW1lbnRzCi0gKiBpbjQJICAgICAgIDEgPT0+IGNsZWFyIHBzci5pYywgIDAgPT0+IGRvbid0IGNsZWFyIHBzci5pYwotICoKICAqLwogR0xPQkFMX0VOVFJZKGlhNjRfcGFsX2NhbGxfc3RhdGljKQotCS5wcm9sb2d1ZSBBU01fVU5XX1BSTEdfUlB8QVNNX1VOV19QUkxHX1BGUywgQVNNX1VOV19QUkxHX0dSU0FWRSg1KQotCWFsbG9jIGxvYzEgPSBhci5wZnMsNSw1LDAsMAorCS5wcm9sb2d1ZSBBU01fVU5XX1BSTEdfUlB8QVNNX1VOV19QUkxHX1BGUywgQVNNX1VOV19QUkxHX0dSU0FWRSg0KQorCWFsbG9jIGxvYzEgPSBhci5wZnMsNCw1LDAsMAogCW1vdmwgbG9jMiA9IHBhbF9lbnRyeV9wb2ludAogMToJewogCSAgbW92IHIyOCA9IGluMApAQCAtNjQsNyArNjMsNiBAQAogCX0KIAk7OwogCWxkOCBsb2MyID0gW2xvYzJdCQkvLyBsb2MyIDwtIGVudHJ5IHBvaW50Ci0JdGJpdC5ueiBwNixwNyA9IGluNCwgMAogCWFkZHMgcjggPSAxZi0xYixyOAogCW1vdiBsb2M0PWFyLnJzYwkJCS8vIHNhdmUgUlNFIGNvbmZpZ3VyYXRpb24KIAk7OwpAQCAtNzQsMTMgKzcyLDExIEBACiAJLmJvZHkKIAltb3YgcjMwID0gaW4yCiAKLShwNikJcnNtIHBzci5pIHwgcHNyLmljCiAJbW92IHIzMSA9IGluMwogCW1vdiBiNyA9IGxvYzIKIAotKHA3KQlyc20gcHNyLmkKKwlyc20gcHNyLmkKIAk7OwotKHA2KQlzcmx6LmkKIAltb3YgcnAgPSByOAogCWJyLmNvbmQuc3B0ay5tYW55IGI3CiAxOgltb3YgcHNyLmwgPSBsb2MzCkBAIC05Niw4ICs5Miw4IEBACiAgKiBNYWtlIGEgUEFMIGNhbGwgdXNpbmcgdGhlIHN0YWNrZWQgcmVnaXN0ZXJzIGNhbGxpbmcgY29udmVudGlvbi4KICAqCiAgKiBJbnB1dHM6Ci0gKiAJaW4wICAgICAgICAgSW5kZXggb2YgUEFMIHNlcnZpY2UKLSAqIAlpbjIgLSBpbjMgICBSZW1hbmluZyBQQUwgYXJndW1lbnRzCisgKglpbjAgICAgICAgICBJbmRleCBvZiBQQUwgc2VydmljZQorICoJaW4yIC0gaW4zICAgUmVtYWluaW5nIFBBTCBhcmd1bWVudHMKICAqLwogR0xPQkFMX0VOVFJZKGlhNjRfcGFsX2NhbGxfc3RhY2tlZCkKIAkucHJvbG9ndWUgQVNNX1VOV19QUkxHX1JQfEFTTV9VTldfUFJMR19QRlMsIEFTTV9VTldfUFJMR19HUlNBVkUoNCkKQEAgLTEzMSwxOCArMTI3LDE4IEBACiAgKiBNYWtlIGEgcGh5c2ljYWwgbW9kZSBQQUwgY2FsbCB1c2luZyB0aGUgc3RhdGljIHJlZ2lzdGVycyBjYWxsaW5nIGNvbnZlbnRpb24uCiAgKgogICogSW5wdXRzOgotICogCWluMCAgICAgICAgIEluZGV4IG9mIFBBTCBzZXJ2aWNlCi0gKiAJaW4yIC0gaW4zICAgUmVtYW5pbmcgUEFMIGFyZ3VtZW50cworICoJaW4wICAgICAgICAgSW5kZXggb2YgUEFMIHNlcnZpY2UKKyAqCWluMiAtIGluMyAgIFJlbWFpbmluZyBQQUwgYXJndW1lbnRzCiAgKgogICogUFNSX0xQLCBQU1JfVEIsIFBTUl9JRCwgUFNSX0RBIGFyZSBuZXZlciBzZXQgYnkgdGhlIGtlcm5lbC4KICAqIFNvIHdlIGRvbid0IG5lZWQgdG8gY2xlYXIgdGhlbS4KICAqLwotI2RlZmluZSBQQUxfUFNSX0JJVFNfVE9fQ0xFQVIJCQkJCQkJXAotCShJQTY0X1BTUl9JIHwgSUE2NF9QU1JfSVQgfCBJQTY0X1BTUl9EVCAgfCBJQTY0X1BTUl9EQiB8IElBNjRfUFNSX1JUIHwJXAotCSBJQTY0X1BTUl9ERCB8IElBNjRfUFNSX1NTIHwgSUE2NF9QU1JfUkkgfCBJQTY0X1BTUl9FRCB8CQlcCisjZGVmaW5lIFBBTF9QU1JfQklUU19UT19DTEVBUgkJCQkJCSAgICAgIFwKKwkoSUE2NF9QU1JfSSB8IElBNjRfUFNSX0lUIHwgSUE2NF9QU1JfRFQgIHwgSUE2NF9QU1JfREIgfCBJQTY0X1BTUl9SVCB8XAorCSBJQTY0X1BTUl9ERCB8IElBNjRfUFNSX1NTIHwgSUE2NF9QU1JfUkkgfCBJQTY0X1BTUl9FRCB8CSAgICAgIFwKIAkgSUE2NF9QU1JfREZMIHwgSUE2NF9QU1JfREZIKQogCi0jZGVmaW5lIFBBTF9QU1JfQklUU19UT19TRVQJCQkJCQkJXAorI2RlZmluZSBQQUxfUFNSX0JJVFNfVE9fU0VUCQkJCQkJICAgICAgXAogCShJQTY0X1BTUl9CTikKIAogCkBAIC0xNzgsNyArMTc0LDcgQEAKIAk7OwogCWFuZGNtIHIxNj1sb2MzLHIxNgkJLy8gcmVtb3ZlcyBiaXRzIHRvIGNsZWFyIGZyb20gcHNyCiAJYnIuY2FsbC5zcHRrLm1hbnkgcnA9aWE2NF9zd2l0Y2hfbW9kZV9waHlzCi0ucmV0MToJbW92IHJwID0gcjgJCQkvLyBpbnN0YWxsIHJldHVybiBhZGRyZXNzIChwaHlzaWNhbCkKKwltb3YgcnAgPSByOAkJCS8vIGluc3RhbGwgcmV0dXJuIGFkZHJlc3MgKHBoeXNpY2FsKQogCW1vdiBsb2M1ID0gcjE5CiAJbW92IGxvYzYgPSByMjAKIAlici5jb25kLnNwdGsubWFueSBiNwpAQCAtMTg4LDcgKzE4NCw2IEBACiAJbW92IHIxOT1sb2M1CiAJbW92IHIyMD1sb2M2CiAJYnIuY2FsbC5zcHRrLm1hbnkgcnA9aWE2NF9zd2l0Y2hfbW9kZV92aXJ0IC8vIHJldHVybiB0byB2aXJ0dWFsIG1vZGUKLS5yZXQyOgogCW1vdiBwc3IubCA9IGxvYzMJCS8vIHJlc3RvcmUgaW5pdCBQU1IKIAogCW1vdiBhci5wZnMgPSBsb2MxCkBAIC0yMDMsOCArMTk4LDggQEAKICAqIE1ha2UgYSBQQUwgY2FsbCB1c2luZyB0aGUgc3RhY2tlZCByZWdpc3RlcnMgaW4gcGh5c2ljYWwgbW9kZS4KICAqCiAgKiBJbnB1dHM6Ci0gKiAJaW4wICAgICAgICAgSW5kZXggb2YgUEFMIHNlcnZpY2UKLSAqIAlpbjIgLSBpbjMgICBSZW1hbmluZyBQQUwgYXJndW1lbnRzCisgKglpbjAgICAgICAgICBJbmRleCBvZiBQQUwgc2VydmljZQorICoJaW4yIC0gaW4zICAgUmVtYWluaW5nIFBBTCBhcmd1bWVudHMKICAqLwogR0xPQkFMX0VOVFJZKGlhNjRfcGFsX2NhbGxfcGh5c19zdGFja2VkKQogCS5wcm9sb2d1ZSBBU01fVU5XX1BSTEdfUlB8QVNNX1VOV19QUkxHX1BGUywgQVNNX1VOV19QUkxHX0dSU0FWRSg1KQpAQCAtMjEyLDcgKzIwNyw3IEBACiAJbW92bAlsb2MyID0gcGFsX2VudHJ5X3BvaW50CiAxOgl7CiAJICBtb3YgcjI4ICA9IGluMAkJLy8gY29weSBwcm9jZWR1cmUgaW5kZXgKLQkgIG1vdiBsb2MwID0gcnAJCS8vIHNhdmUgcnAKKwkgIG1vdiBsb2MwID0gcnAJCQkvLyBzYXZlIHJwCiAJfQogCS5ib2R5CiAJOzsKQEAgLTI0NSw3ICsyNDAsNyBAQAogCW1vdiByMTY9bG9jMwkJCS8vIHIxNj0gb3JpZ2luYWwgcHNyCiAJbW92IHIxOT1sb2M1CiAJbW92IHIyMD1sb2M2Ci0JYnIuY2FsbC5zcHRrLm1hbnkgcnA9aWE2NF9zd2l0Y2hfbW9kZV92aXJ0CS8vIHJldHVybiB0byB2aXJ0dWFsIG1vZGUKKwlici5jYWxsLnNwdGsubWFueSBycD1pYTY0X3N3aXRjaF9tb2RlX3ZpcnQgLy8gcmV0dXJuIHRvIHZpcnR1YWwgbW9kZQogCiAJbW92IHBzci5sICA9IGxvYzMJCS8vIHJlc3RvcmUgaW5pdCBQU1IKIAltb3YgYXIucGZzID0gbG9jMQpAQCAtMjU3LDEwICsyNTIsMTEgQEAKIEVORChpYTY0X3BhbF9jYWxsX3BoeXNfc3RhY2tlZCkKIAogLyoKLSAqIFNhdmUgc2NyYXRjaCBmcCBzY3JhdGNoIHJlZ3Mgd2hpY2ggYXJlbid0IHNhdmVkIGluIHB0X3JlZ3MgYWxyZWFkeSAoZnAxMC1mcDE1KS4KKyAqIFNhdmUgc2NyYXRjaCBmcCBzY3JhdGNoIHJlZ3Mgd2hpY2ggYXJlbid0IHNhdmVkIGluIHB0X3JlZ3MgYWxyZWFkeQorICogKGZwMTAtZnAxNSkuCiAgKgotICogTk9URTogV2UgbmVlZCB0byBkbyB0aGlzIHNpbmNlIGZpcm13YXJlIChTQUwgYW5kIFBBTCkgbWF5IHVzZSBhbnkgb2YgdGhlIHNjcmF0Y2gKLSAqIHJlZ3MgZnAtbG93IHBhcnRpdGlvbi4KKyAqIE5PVEU6IFdlIG5lZWQgdG8gZG8gdGhpcyBzaW5jZSBmaXJtd2FyZSAoU0FMIGFuZCBQQUwpIG1heSB1c2UgYW55IG9mIHRoZQorICogc2NyYXRjaCByZWdzIGZwLWxvdyBwYXJ0aXRpb24uCiAgKgogICogSW5wdXRzOgogICogICAgICBpbjAJQWRkcmVzcyBvZiBzdGFjayBzdG9yYWdlIGZvciBmcCByZWdzCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BhbGluZm8uYyBiL2FyY2gvaWE2NC9rZXJuZWwvcGFsaW5mby5jCmluZGV4IDBiNTQ2ZTIuLmE3MWRmOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGFsaW5mby5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGFsaW5mby5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKiAwMi8wNS8yMDAxICAgUy5FcmFuaWFuCWZpeGVkIG1vZHVsZSBzdXBwb3J0CiAgKiAxMC8yMy8yMDAxCVMuRXJhbmlhbgl1cGRhdGVkIHBhbF9wZXJmX21vbl9pbmZvIGJ1ZyBmaXhlcwogICogMDMvMjQvMjAwNAlBc2hvayBSYWoJdXBkYXRlZCB0byB3b3JrIHdpdGggQ1BVIEhvdHBsdWcKKyAqIDEwLzI2LzIwMDYgICBSdXNzIEFuZGVyc29uCXVwZGF0ZWQgcHJvY2Vzc29yIGZlYXR1cmVzIHRvIHJldiAyLjIgc3BlYwogICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtMzE0LDEzICszMTUsMjAgQEAKIAkJICAgICAiUHJvdGVjdGlvbiBLZXkgUmVnaXN0ZXJzKFBLUikgIDogJWRcbiIKIAkJICAgICAiSW1wbGVtZW50ZWQgYml0cyBpbiBQS1Iua2V5ICAgIDogJWRcbiIKIAkJICAgICAiSGFzaCBUYWcgSUQgICAgICAgICAgICAgICAgICAgIDogMHgleFxuIgotCQkgICAgICJTaXplIG9mIFJSLnJpZCAgICAgICAgICAgICAgICAgOiAlZFxuIiwKKwkJICAgICAiU2l6ZSBvZiBSUi5yaWQgICAgICAgICAgICAgICAgIDogJWRcbiIKKwkJICAgICAiTWF4IFB1cmdlcyAgICAgICAgICAgICAgICAgICAgIDogIiwKIAkJICAgICB2bV9pbmZvXzEucGFsX3ZtX2luZm9fMV9zLnBoeXNfYWRkX3NpemUsCiAJCSAgICAgdm1faW5mb18yLnBhbF92bV9pbmZvXzJfcy5pbXBsX3ZhX21zYisxLAogCQkgICAgIHZtX2luZm9fMS5wYWxfdm1faW5mb18xX3MubWF4X3BrcisxLAogCQkgICAgIHZtX2luZm9fMS5wYWxfdm1faW5mb18xX3Mua2V5X3NpemUsCiAJCSAgICAgdm1faW5mb18xLnBhbF92bV9pbmZvXzFfcy5oYXNoX3RhZ19pZCwKIAkJICAgICB2bV9pbmZvXzIucGFsX3ZtX2luZm9fMl9zLnJpZF9zaXplKTsKKwkJaWYgKHZtX2luZm9fMi5wYWxfdm1faW5mb18yX3MubWF4X3B1cmdlcyA9PSBQQUxfTUFYX1BVUkdFUykKKwkJCXAgKz0gc3ByaW50ZihwLCAidW5saW1pdGVkXG4iKTsKKwkJZWxzZQorCQkJcCArPSBzcHJpbnRmKHAsICIlZFxuIiwKKwkJICAgICAJCXZtX2luZm9fMi5wYWxfdm1faW5mb18yX3MubWF4X3B1cmdlcyA/CisJCQkJdm1faW5mb18yLnBhbF92bV9pbmZvXzJfcy5tYXhfcHVyZ2VzIDogMSk7CiAJfQogCiAJaWYgKGlhNjRfcGFsX21lbV9hdHRyaWIoJmF0dHJpYikgPT0gMCkgewpAQCAtNDY3LDcgKzQ3NSwxMSBAQAogCU5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsIE5VTEwsTlVMTCwKIAlOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCwKIAlOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsIE5VTEwsTlVMTCxOVUxMLE5VTEwsCi0JTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLAorCSJVbmltcGxlbWVudGVkIGluc3RydWN0aW9uIGFkZHJlc3MgZmF1bHQiLAorCSJJTklULCBQTUksIGFuZCBMSU5UIHBpbnMiLAorCSJTaW1wbGUgdW5pbXBsZW1lbnRlZCBpbnN0ciBhZGRyZXNzZXMiLAorCSJWYXJpYWJsZSBQLXN0YXRlIHBlcmZvcm1hbmNlIiwKKwkiVmlydHVhbCBtYWNoaW5lIGZlYXR1cmVzIGltcGxlbWVudGVkIiwKIAkiWElQLFhQU1IsWEZTIGltcGxlbWVudGVkIiwKIAkiWFIxLVhSMyBpbXBsZW1lbnRlZCIsCiAJIkRpc2FibGUgZHluYW1pYyBwcmVkaWNhdGUgcHJlZGljdGlvbiIsCkBAIC00NzUsNyArNDg3LDExIEBACiAJIkRpc2FibGUgZHluYW1pYyBkYXRhIGNhY2hlIHByZWZldGNoIiwKIAkiRGlzYWJsZSBkeW5hbWljIGluc3QgY2FjaGUgcHJlZmV0Y2giLAogCSJEaXNhYmxlIGR5bmFtaWMgYnJhbmNoIHByZWRpY3Rpb24iLAotCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkiRGlzYWJsZSBQLXN0YXRlcyIsCisJIkVuYWJsZSBNQ0Egb24gRGF0YSBQb2lzb25pbmciLAorCSJFbmFibGUgdm1zdyBpbnN0cnVjdGlvbiIsCisJIkVuYWJsZSBleHRlcm4gZW52aXJvbm1lbnRhbCBub3RpZmljYXRpb24iLAogCSJEaXNhYmxlIEJJTklUIG9uIHByb2Nlc3NvciB0aW1lLW91dCIsCiAJIkRpc2FibGUgZHluYW1pYyBwb3dlciBtYW5hZ2VtZW50IChEUE0pIiwKIAkiRGlzYWJsZSBjb2hlcmVuY3kiLApAQCAtOTUyLDcgKzk2OCw2IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgaW50IHBhbGluZm9fY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKQEAgLTk3NCw3ICs5ODksNiBAQAogCS5ub3RpZmllcl9jYWxsID0gcGFsaW5mb19jcHVfY2FsbGJhY2ssCiAJLnByaW9yaXR5ID0gMCwKIH07Ci0jZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQKIHBhbGluZm9faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCAyODEwMDRmLi5hYTk0ZjYwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtODUzLDkgKzg1Myw4IEBACiAJICogYWxsb2NhdGUgY29udGV4dCBkZXNjcmlwdG9yIAogCSAqIG11c3QgYmUgYWJsZSB0byBmcmVlIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAogCSAqLwotCWN0eCA9IGttYWxsb2Moc2l6ZW9mKHBmbV9jb250ZXh0X3QpLCBHRlBfS0VSTkVMKTsKKwljdHggPSBremFsbG9jKHNpemVvZihwZm1fY29udGV4dF90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGN0eCkgewotCQltZW1zZXQoY3R4LCAwLCBzaXplb2YocGZtX2NvbnRleHRfdCkpOwogCQlEUFJJTlQoKCJhbGxvYyBjdHggQCVwXG4iLCBjdHgpKTsKIAl9CiAJcmV0dXJuIGN0eDsKQEAgLTIxODksMTMgKzIxODgsMTMgQEAKIAkvKgogCSAqIGFsbG9jYXRlIGEgbmV3IGRjYWNoZSBlbnRyeQogCSAqLwotCWZpbGUtPmZfZGVudHJ5ID0gZF9hbGxvYyhwZm1mc19tbnQtPm1udF9zYi0+c19yb290LCAmdGhpcyk7Ci0JaWYgKCFmaWxlLT5mX2RlbnRyeSkgZ290byBvdXQ7CisJZmlsZS0+Zl9wYXRoLmRlbnRyeSA9IGRfYWxsb2MocGZtZnNfbW50LT5tbnRfc2ItPnNfcm9vdCwgJnRoaXMpOworCWlmICghZmlsZS0+Zl9wYXRoLmRlbnRyeSkgZ290byBvdXQ7CiAKLQlmaWxlLT5mX2RlbnRyeS0+ZF9vcCA9ICZwZm1mc19kZW50cnlfb3BlcmF0aW9uczsKKwlmaWxlLT5mX3BhdGguZGVudHJ5LT5kX29wID0gJnBmbWZzX2RlbnRyeV9vcGVyYXRpb25zOwogCi0JZF9hZGQoZmlsZS0+Zl9kZW50cnksIGlub2RlKTsKLQlmaWxlLT5mX3Zmc21udCA9IG1udGdldChwZm1mc19tbnQpOworCWRfYWRkKGZpbGUtPmZfcGF0aC5kZW50cnksIGlub2RlKTsKKwlmaWxlLT5mX3BhdGgubW50ID0gbW50Z2V0KHBmbWZzX21udCk7CiAJZmlsZS0+Zl9tYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAogCWZpbGUtPmZfb3AgICAgPSAmcGZtX2ZpbGVfb3BzOwpAQCAtMjMwMiw3ICsyMzAxLDcgQEAKIAlEUFJJTlQoKCJzbXBsX2J1ZiBAJXBcbiIsIHNtcGxfYnVmKSk7CiAKIAkvKiBhbGxvY2F0ZSB2bWEgKi8KLQl2bWEgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJdm1hID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bWEpIHsKIAkJRFBSSU5UKCgiQ2Fubm90IGFsbG9jYXRlIHZtYVxuIikpOwogCQlnb3RvIGVycm9yX2ttZW07CkBAIC01NTU4LDEyICs1NTU3LDEzIEBACiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdAotcGZtX2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitwZm1faW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfY3ljbGVzLCB0b3RhbF9jeWNsZXM7CiAJdW5zaWduZWQgbG9uZyBtaW4sIG1heDsKIAlpbnQgdGhpc19jcHU7CiAJaW50IHJldDsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwogCiAJdGhpc19jcHUgPSBnZXRfY3B1KCk7CiAJaWYgKGxpa2VseSghcGZtX2FsdF9pbnRyX2hhbmRsZXIpKSB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb25fbW9udGVjaXRvLmggYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb25fbW9udGVjaXRvLmgKaW5kZXggY2QwNmFjNi4uN2Y4ZGE0YyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uX21vbnRlY2l0by5oCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbl9tb250ZWNpdG8uaApAQCAtNDUsMTYgKzQ1LDE2IEBACiAvKiBwbWMyOSAqLyB7IFBGTV9SRUdfTk9USU1QTCwgfSwKIC8qIHBtYzMwICovIHsgUEZNX1JFR19OT1RJTVBMLCB9LAogLyogcG1jMzEgKi8geyBQRk1fUkVHX05PVElNUEwsIH0sCi0vKiBwbWMzMiAqLyB7IFBGTV9SRUdfQ09ORklHLCAgMCwgMHgzMGYwMWZmZmZmZmZmZmYsIDB4MzBmMDFmZmZmZmZmZmZmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHswLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCi0vKiBwbWMzMyAqLyB7IFBGTV9SRUdfQ09ORklHLCAgMCwgMHgwLCAgMHgxZmZmZmZmZmZmZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAotLyogcG1jMzQgKi8geyBQRk1fUkVHX0NPTkZJRywgIDAsIDB4ZjAxZmZmZmZmZmZmZiwgMHhmMDFmZmZmZmZmZmZmLCBOVUxMLCBwZm1fbW9udF9wbWNfY2hlY2ssIHswLDAsIDAsIDB9LCB7MCwwLCAwLCAwfX0sCi0vKiBwbWMzNSAqLyB7IFBGTV9SRUdfQ09ORklHLCAgMCwgMHgwLCAgMHgxZmZmZmZmZmZmZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jMzIgKi8geyBQRk1fUkVHX0NPTkZJRywgIDAsIDB4MzBmMDFmZmZmZmZmZmZmVUwsIDB4MzBmMDFmZmZmZmZmZmZmVUwsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywgezAsMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKKy8qIHBtYzMzICovIHsgUEZNX1JFR19DT05GSUcsICAwLCAweDAsICAweDFmZmZmZmZmZmZmVUwsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywgezAsMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKKy8qIHBtYzM0ICovIHsgUEZNX1JFR19DT05GSUcsICAwLCAweGYwMWZmZmZmZmZmZmZVTCwgMHhmMDFmZmZmZmZmZmZmVUwsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywgezAsMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKKy8qIHBtYzM1ICovIHsgUEZNX1JFR19DT05GSUcsICAwLCAweDAsICAweDFmZmZmZmZmZmZmVUwsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywgezAsMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKIC8qIHBtYzM2ICovIHsgUEZNX1JFR19DT05GSUcsICAwLCAweGZmZmZmZmYwLCAweGYsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywgezAsMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKIC8qIHBtYzM3ICovIHsgUEZNX1JFR19NT05JVE9SLCA0LCAweDAsIDB4M2ZmZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7UkRFUF9NT05UX0lFQVIsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMH19LAogLyogcG1jMzggKi8geyBQRk1fUkVHX0NPTkZJRywgIDAsIDB4ZGI2LCAweDI0OTIsIE5VTEwsIHBmbV9tb250X3BtY19jaGVjaywgezAsMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKIC8qIHBtYzM5ICovIHsgUEZNX1JFR19NT05JVE9SLCA2LCAweDAsIDB4ZmZjZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7UkRFUF9NT05UX0VUQiwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAogLyogcG1jNDAgKi8geyBQRk1fUkVHX01PTklUT1IsIDYsIDB4MjAwMDAwMCwgMHhmMDFjZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7UkRFUF9NT05UX0RFQVIsMCwgMCwgMH0sIHswLDAsIDAsIDB9fSwKLS8qIHBtYzQxICovIHsgUEZNX1JFR19DT05GSUcsICAwLCAweDAwMDAyMDc4ZmVmZWZlZmUsIDB4MWUwMDAxODE4MTgxOCwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAorLyogcG1jNDEgKi8geyBQRk1fUkVHX0NPTkZJRywgIDAsIDB4MDAwMDIwNzhmZWZlZmVmZVVMLCAweDFlMDAwMTgxODE4MThVTCwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7MCwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAogLyogcG1jNDIgKi8geyBQRk1fUkVHX01PTklUT1IsIDYsIDB4MCwgMHg3ZmY0ZiwgTlVMTCwgcGZtX21vbnRfcG1jX2NoZWNrLCB7UkRFUF9NT05UX0VUQiwwLCAwLCAwfSwgezAsMCwgMCwgMH19LAogCSAgICB7IFBGTV9SRUdfRU5EICAgICwgMCwgMHgwLCAtMSwgTlVMTCwgTlVMTCwgezAsfSwgezAsfX0sIC8qIGVuZCBtYXJrZXIgKi8KIH07CkBAIC0xODUsNyArMTg1LDcgQEAKIAlEUFJJTlQoKCJjbnVtPSV1IHZhbD0weCVseCwgdXNpbmdfZGJyZWc9JWQgbG9hZGVkPSVkXG4iLCBjbnVtLCB0bXB2YWwsIGN0eC0+Y3R4X2ZsX3VzaW5nX2RicmVnLCBpc19sb2FkZWQpKTsKIAogCWlmIChjbnVtID09IDQxICYmIGlzX2xvYWRlZCAKLQkgICAgJiYgKHRtcHZhbCAmIDB4MWUwMDAwMDAwMDAwMCkgJiYgKHRtcHZhbCAmIDB4MTgxODE4MThVTCkgIT0gMHgxODE4MTgxOFVMICYmIGN0eC0+Y3R4X2ZsX3VzaW5nX2RicmVnID09IDApIHsKKwkgICAgJiYgKHRtcHZhbCAmIDB4MWUwMDAwMDAwMDAwMFVMKSAmJiAodG1wdmFsICYgMHgxODE4MTgxOFVMKSAhPSAweDE4MTgxODE4VUwgJiYgY3R4LT5jdHhfZmxfdXNpbmdfZGJyZWcgPT0gMCkgewogCiAJCURQUklOVCgoInBtY1slZF09MHglbHggaGFzIGFjdGl2ZSBwbWM0MSBzZXR0aW5ncywgY2xlYXJpbmcgZGJyXG4iLCBjbnVtLCB0bXB2YWwpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUyBiL2FyY2gvaWE2NC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NzNlMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiBhcmNoL2lhNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCisgKgorICogUmVsb2NhdGUga2V4ZWMnYWJsZSBrZXJuZWwgYW5kIHN0YXJ0IGl0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2hhbGlkIEF6aXogIDxraGFsaWQuYXppekBocC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSW50ZWwgQ29ycCwgIFpvdSBOYW4gaGFpIDxuYW5oYWkuem91QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KKyNpbmNsdWRlIDxhc20va3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21jYV9hc20uaD4KKworICAgICAgIC8qIE11c3QgYmUgcmVsb2NhdGFibGUgUElDIGNvZGUgY2FsbGFibGUgYXMgYSBDIGZ1bmN0aW9uCisgICAgICAgICovCitHTE9CQUxfRU5UUlkocmVsb2NhdGVfbmV3X2tlcm5lbCkKKwkucHJvbG9ndWUKKwlhbGxvYyByMzE9YXIucGZzLDQsMCwwLDAKKyAgICAgICAgLmJvZHkKKy5yZWxvY19lbnRyeToKK3sKKwlyc20gcHNyLml8IHBzci5pYworCW1vdiByMj1pcAorfQorCTs7Cit7CisgICAgICAgIGZsdXNocnMgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBmaXJzdCBpbnNuIGluIGdyb3VwCisgICAgICAgIHNybHouaQorfQorCTs7CisJZGVwIHIyPTAscjIsNjEsMwkJLy90byBwaHlzaWNhbCBhZGRyZXNzCisJOzsKKwkvL2ZpcnN0IHN3aXRjaCB0byBwaHlzaWNhbCBtb2RlCisJYWRkIHIzPTFmLS5yZWxvY19lbnRyeSwgcjIKKwltb3ZsIHIxNiA9IElBNjRfUFNSX0FDfElBNjRfUFNSX0JOfElBNjRfUFNSX0lDCisJbW92IGFyLnJzYz0wCSAgICAgICAgICAJLy8gcHV0IFJTRSBpbiBlbmZvcmNlZCBsYXp5IG1vZGUKKwk7OworCWFkZCBzcD0obWVtb3J5X3N0YWNrX2VuZCAtIDE2IC0gLnJlbG9jX2VudHJ5KSxyMgorCWFkZCByOD0ocmVnaXN0ZXJfc3RhY2sgLSAucmVsb2NfZW50cnkpLHIyCisJOzsKKwltb3YgcjE4PWFyLnJuYXQKKwltb3YgYXIuYnNwc3RvcmU9cjgKKwk7OworICAgICAgICBtb3YgY3IuaXBzcj1yMTYKKyAgICAgICAgbW92IGNyLmlpcD1yMworICAgICAgICBtb3YgY3IuaWZzPXIwCisJc3Jsei5pCisJOzsKKwltb3YgYXIucm5hdD1yMTgKKwlyZmkKKwk7OworMToKKwkvL3BoeXNpY2FsIG1vZGUgY29kZSBiZWdpbgorCW1vdiBiNj1pbjEKKwlkZXAgcjI4PTAsaW4yLDYxLDMJLy90byBwaHlzaWNhbCBhZGRyZXNzCisKKwkvLyBwdXJnZSBhbGwgVEMgZW50cmllcworI2RlZmluZSBPKG1lbWJlcikgICAgICAgSUE2NF9DUFVJTkZPXyMjbWVtYmVyIyNfT0ZGU0VUCisgICAgICAgIEdFVF9USElTX1BBRERSKHIyLCBjcHVfaW5mbykgICAgLy8gbG9hZCBwaHlzIGFkZHIgb2YgY3B1X2luZm8gaW50byByMgorICAgICAgICA7OworICAgICAgICBhZGRsIHIxNz1PKFBUQ0VfU1RSSURFKSxyMgorICAgICAgICBhZGRsIHIyPU8oUFRDRV9CQVNFKSxyMgorICAgICAgICA7OworICAgICAgICBsZDggcjE4PVtyMl0sKE8oUFRDRV9DT1VOVCktTyhQVENFX0JBU0UpKTs7ICAgIAkvLyByMTg9cHRjZV9iYXNlCisgICAgICAgIGxkNCByMTk9W3IyXSw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHIxOT1wdGNlX2NvdW50WzBdCisgICAgICAgIGxkNCByMjE9W3IxN10sNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHIyMT1wdGNlX3N0cmlkZVswXQorICAgICAgICA7OworICAgICAgICBsZDQgcjIwPVtyMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByMjA9cHRjZV9jb3VudFsxXQorICAgICAgICBsZDQgcjIyPVtyMTddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByMjI9cHRjZV9zdHJpZGVbMV0KKyAgICAgICAgbW92IHIyND1yMAorICAgICAgICA7OworICAgICAgICBhZGRzIHIyMD0tMSxyMjAKKyAgICAgICAgOzsKKyN1bmRlZiBPCisyOgorICAgICAgICBjbXAubHR1IHA2LHA3PXIyNCxyMTkKKyhwNykgICAgYnIuY29uZC5kcG50LmZldyA0ZgorICAgICAgICBtb3YgYXIubGM9cjIwCiszOgorICAgICAgICBwdGMuZSByMTgKKyAgICAgICAgOzsKKyAgICAgICAgYWRkIHIxOD1yMjIscjE4CisgICAgICAgIGJyLmNsb29wLnNwdGsuZmV3IDNiCisgICAgICAgIDs7CisgICAgICAgIGFkZCByMTg9cjIxLHIxOAorICAgICAgICBhZGQgcjI0PTEscjI0CisgICAgICAgIDs7CisgICAgICAgIGJyLnNwdGsuZmV3IDJiCis0OgorICAgICAgICBzcmx6LmkKKyAgICAgICAgOzsKKwkvL3B1cmdlIFRSIGVudHJ5IGZvciBrZXJuZWwgdGV4dCBhbmQgZGF0YQorICAgICAgICBtb3ZsIHIxNj1LRVJORUxfU1RBUlQKKyAgICAgICAgbW92IHIxOD1LRVJORUxfVFJfUEFHRV9TSElGVDw8MgorICAgICAgICA7OworICAgICAgICBwdHIuaSByMTYsIHIxOAorICAgICAgICBwdHIuZCByMTYsIHIxOAorICAgICAgICA7OworICAgICAgICBzcmx6LmkKKyAgICAgICAgOzsKKworCS8vIHB1cmdlIFRSIGVudHJ5IGZvciBwZXJjcHUgZGF0YQorICAgICAgICBtb3ZsIHIxNj1QRVJDUFVfQUREUgorICAgICAgICBtb3YgcjE4PVBFUkNQVV9QQUdFX1NISUZUPDwyCisgICAgICAgIDs7CisgICAgICAgIHB0ci5kIHIxNixyMTgKKyAgICAgICAgOzsKKyAgICAgICAgc3Jsei5kCisJOzsKKworICAgICAgICAvLyBwdXJnZSBUUiBlbnRyeSBmb3IgcGFsIGNvZGUKKyAgICAgICAgbW92IHIxNj1pbjMKKyAgICAgICAgbW92IHIxOD1JQTY0X0dSQU5VTEVfU0hJRlQ8PDIKKyAgICAgICAgOzsKKyAgICAgICAgcHRyLmkgcjE2LHIxOAorICAgICAgICA7OworICAgICAgICBzcmx6LmkKKwk7OworCisgICAgICAgIC8vIHB1cmdlIFRSIGVudHJ5IGZvciBzdGFjaworICAgICAgICBtb3YgcjE2PUlBNjRfS1IoQ1VSUkVOVF9TVEFDSykKKyAgICAgICAgOzsKKyAgICAgICAgc2hsIHIxNj1yMTYsSUE2NF9HUkFOVUxFX1NISUZUCisgICAgICAgIG1vdmwgcjE5PVBBR0VfT0ZGU0VUCisgICAgICAgIDs7CisgICAgICAgIGFkZCByMTY9cjE5LHIxNgorICAgICAgICBtb3YgcjE4PUlBNjRfR1JBTlVMRV9TSElGVDw8MgorICAgICAgICA7OworICAgICAgICBwdHIuZCByMTYscjE4CisgICAgICAgIDs7CisgICAgICAgIHNybHouaQorCTs7CisKKwkvL2NvcHkgc2VnbWVudHMKKwltb3ZsIHIxNj1QQUdFX01BU0sKKyAgICAgICAgbW92ICByMzA9aW4wICAgICAgICAgICAgICAgICAgICAvLyBpbjAgaXMgcGFnZV9saXN0CisgICAgICAgIGJyLnNwdGsuZmV3IC5kZXN0X3BhZ2UKKwk7OworLmxvb3A6CisJbGQ4ICByMzA9W2luMF0sIDg7OworLmRlc3RfcGFnZToKKwl0Yml0LnogcDAsIHA2PXIzMCwgMDs7ICAgIAkvLyAweDEgZGVzdCBwYWdlCisocDYpCWFuZCByMTc9cjMwLCByMTYKKyhwNikJYnIuY29uZC5zcHRrLmZldyAubG9vcDs7CisKKwl0Yml0LnogcDAsIHA2PXIzMCwgMTs7CQkvLyAweDIgaW5kaXJlY3QgcGFnZQorKHA2KQlhbmQgaW4wPXIzMCwgcjE2CisocDYpCWJyLmNvbmQuc3B0ay5mZXcgLmxvb3A7OworCisJdGJpdC56IHAwLCBwNj1yMzAsIDI7OwkJLy8gMHg0IGVuZCBmbGFnCisocDYpCWJyLmNvbmQuc3B0ay5mZXcgLmVuZF9sb29wOzsKKworCXRiaXQueiBwNiwgcDA9cjMwLCAzOzsJCS8vIDB4OCBzb3VyY2UgcGFnZQorKHA2KQlici5jb25kLnNwdGsuZmV3IC5sb29wCisKKwlhbmQgcjE4PXIzMCwgcjE2CisKKwkvLyBzaW1wbGUgY29weSBwYWdlLCBtYXkgb3B0aW1pemUgbGF0ZXIKKwltb3ZsIHIxND1QQUdFX1NJWkUvOCAtIDE7OworCW1vdiBhci5sYz1yMTQ7OworMToKKwlsZDggcjE0PVtyMThdLCA4OzsKKwlzdDggW3IxN109cjE0OzsKKwlmYy5pIHIxNworCWFkZCByMTc9OCwgcjE3CisJYnIuY3RvcC5zcHRrLmZldyAxYgorCWJyLnNwdGsuZmV3IC5sb29wCisJOzsKKworLmVuZF9sb29wOgorCXN5bmMuaQkJCS8vIGZvciBmYy5pCisJOzsKKwlzcmx6LmkKKwk7OworCXNybHouZAorCTs7CisJYnIuY2FsbC5zcHRrLm1hbnkgYjA9YjY7OworCisuYWxpZ24gIDMyCittZW1vcnlfc3RhY2s6CisJLmZpbGwgICAgICAgICAgIDgxOTIsIDEsIDAKK21lbW9yeV9zdGFja19lbmQ6CityZWdpc3Rlcl9zdGFjazoKKwkuZmlsbCAgICAgICAgICAgODE5MiwgMSwgMAorcmVnaXN0ZXJfc3RhY2tfZW5kOgorcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQ6CitFTkQocmVsb2NhdGVfbmV3X2tlcm5lbCkKKworLmdsb2JhbCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemUKK3JlbG9jYXRlX25ld19rZXJuZWxfc2l6ZToKKwlkYXRhOAlyZWxvY2F0ZV9uZXdfa2VybmVsX2VuZCAtIHJlbG9jYXRlX25ld19rZXJuZWwKKworR0xPQkFMX0VOVFJZKGlhNjRfZHVtcF9jcHVfcmVncykKKyAgICAgICAgLnByb2xvZ3VlCisgICAgICAgIGFsbG9jIGxvYzA9YXIucGZzLDEsMiwwLDAKKyAgICAgICAgLmJvZHkKKyAgICAgICAgbW92ICAgICBhci5yc2M9MCAgICAgICAgICAgICAgICAvLyBwdXQgUlNFIGluIGVuZm9yY2VkIGxhenkgbW9kZQorICAgICAgICBhZGQgICAgIGxvYzE9NCo4LCBpbjAgICAgICAgICAgIC8vIHNhdmUgcjQgYW5kIHI1IGZpcnN0CisgICAgICAgIDs7Cit7CisgICAgICAgIGZsdXNocnMgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmx1c2ggZGlydHkgcmVncyB0byBiYWNraW5nIHN0b3JlCisgICAgICAgIHNybHouaQorfQorICAgICAgICBzdDggW2xvYzFdPXI0LCA4CisgICAgICAgIDs7CisgICAgICAgIHN0OCBbbG9jMV09cjUsIDgKKyAgICAgICAgOzsKKyAgICAgICAgYWRkIGxvYzE9MzIqOCwgaW4wCisgICAgICAgIG1vdiByND1hci5ybmF0CisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yMCwgOAkJCS8vIHIwCisgICAgICAgIHN0OCBbbG9jMV09cjQsIDgJCS8vIHJuYXQKKyAgICAgICAgbW92IHI1PXByCisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yMSwgOAkJCS8vIHIxCisgICAgICAgIHN0OCBbbG9jMV09cjUsIDgJCS8vIHByCisgICAgICAgIG1vdiByND1iMAorICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjIsIDgJCQkvLyByMgorICAgICAgICBzdDggW2xvYzFdPXI0LCA4CQkvLyBiMAorICAgICAgICBtb3YgcjU9YjE7CisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yMywgMjQJCS8vIHIzCisgICAgICAgIHN0OCBbbG9jMV09cjUsIDgJCS8vIGIxCisgICAgICAgIG1vdiByND1iMgorICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjYsIDgJCQkvLyByNgorICAgICAgICBzdDggW2xvYzFdPXI0LCA4CQkvLyBiMgorCW1vdiByNT1iMworICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjcsIDgJCQkvLyByNworICAgICAgICBzdDggW2xvYzFdPXI1LCA4CQkvLyBiMworICAgICAgICBtb3YgcjQ9YjQKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXI4LCA4CQkJLy8gcjgKKyAgICAgICAgc3Q4IFtsb2MxXT1yNCwgOAkJLy8gYjQKKyAgICAgICAgbW92IHI1PWI1CisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yOSwgOAkJCS8vIHI5CisgICAgICAgIHN0OCBbbG9jMV09cjUsIDgJCS8vIGI1CisgICAgICAgIG1vdiByND1iNgorICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjEwLCA4CQkvLyByMTAKKyAgICAgICAgc3Q4IFtsb2MxXT1yNSwgOAkJLy8gYjYKKyAgICAgICAgbW92IHI1PWI3CisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yMTEsIDgJCS8vIHIxMQorICAgICAgICBzdDggW2xvYzFdPXI1LCA4CQkvLyBiNworICAgICAgICBtb3YgcjQ9YjAKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIxMiwgOAkJLy8gcjEyCisgICAgICAgIHN0OCBbbG9jMV09cjQsIDgJCS8vIGlwCisgICAgICAgIG1vdiByNT1sb2MwCisJOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIxMywgOAkJLy8gcjEzCisgICAgICAgIGV4dHIudSByNT1yNSwgMCwgMzgJCS8vIGFyLnBmcy5wZm0KKwltb3YgcjQ9cjAJCQkvLyB1c2VyIG1hc2sKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIxNCwgOAkJLy8gcjE0CisgICAgICAgIHN0OCBbbG9jMV09cjUsIDgJCS8vIGNmbQorICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjE1LCA4CQkvLyByMTUKKyAgICAgICAgc3Q4IFtsb2MxXT1yNCwgOCAgICAgICAgCS8vIHVzZXIgbWFzaworCW1vdiByNT1hci5yc2MKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIxNiwgOAkJLy8gcjE2CisgICAgICAgIHN0OCBbbG9jMV09cjUsIDggICAgICAgIAkvLyBhci5yc2MKKyAgICAgICAgbW92IHI0PWFyLmJzcAorICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjE3LCA4CQkvLyByMTcKKyAgICAgICAgc3Q4IFtsb2MxXT1yNCwgOCAgICAgICAgCS8vIGFyLmJzcAorICAgICAgICBtb3YgcjU9YXIuYnNwc3RvcmUKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIxOCwgOAkJLy8gcjE4CisgICAgICAgIHN0OCBbbG9jMV09cjUsIDggICAgICAgIAkvLyBhci5ic3BzdG9yZQorICAgICAgICBtb3YgcjQ9YXIucm5hdAorICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjE5LCA4CQkvLyByMTkKKyAgICAgICAgc3Q4IFtsb2MxXT1yNCwgOCAgICAgICAgCS8vIGFyLnJuYXQKKyAgICAgICAgbW92IHI1PWFyLmNjdgorICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjIwLCA4CQkvLyByMjAKKwlzdDggW2xvYzFdPXI1LCA4ICAgICAgICAJLy8gYXIuY2N2CisgICAgICAgIG1vdiByND1hci51bmF0CisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yMjEsIDgJCS8vIHIyMQorICAgICAgICBzdDggW2xvYzFdPXI0LCA4ICAgICAgICAJLy8gYXIudW5hdAorICAgICAgICBtb3YgcjUgPSBhci5mcHNyCisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yMjIsIDgJCS8vIHIyMgorICAgICAgICBzdDggW2xvYzFdPXI1LCA4ICAgICAgICAJLy8gYXIuZnBzcgorICAgICAgICBtb3YgcjQgPSBhci51bmF0CisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yMjMsIDgJCS8vIHIyMworICAgICAgICBzdDggW2xvYzFdPXI0LCA4ICAgICAgICAJLy8gdW5hdAorICAgICAgICBtb3YgcjUgPSBhci5mcHNyCisgICAgICAgIDs7CisgICAgICAgIHN0OCBbaW4wXT1yMjQsIDgJCS8vIHIyNAorICAgICAgICBzdDggW2xvYzFdPXI1LCA4ICAgICAgICAJLy8gZnBzcgorICAgICAgICBtb3YgcjQgPSBhci5wZnMKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIyNSwgOAkJLy8gcjI1CisgICAgICAgIHN0OCBbbG9jMV09cjQsIDggICAgICAgIAkvLyBhci5wZnMKKyAgICAgICAgbW92IHI1ID0gYXIubGMKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIyNiwgOAkJLy8gcjI2CisgICAgICAgIHN0OCBbbG9jMV09cjUsIDggICAgICAgIAkvLyBhci5sYworICAgICAgICBtb3YgcjQgPSBhci5lYworICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjI3LCA4CQkvLyByMjcKKyAgICAgICAgc3Q4IFtsb2MxXT1yNCwgOCAgICAgICAgCS8vIGFyLmVjCisgICAgICAgIG1vdiByNSA9IGFyLmNzZAorICAgICAgICA7OworICAgICAgICBzdDggW2luMF09cjI4LCA4CQkvLyByMjgKKyAgICAgICAgc3Q4IFtsb2MxXT1yNSwgOCAgICAgICAgCS8vIGFyLmNzZAorICAgICAgICBtb3YgcjQgPSBhci5zc2QKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIyOSwgOAkJLy8gcjI5CisgICAgICAgIHN0OCBbbG9jMV09cjQsIDggICAgICAgIAkvLyBhci5zc2QKKyAgICAgICAgOzsKKyAgICAgICAgc3Q4IFtpbjBdPXIzMCwgOAkJLy8gcjMwCisgICAgICAgIDs7CisJc3Q4IFtpbjBdPXIzMSwgOAkJLy8gcjMxCisgICAgICAgIG1vdiBhci5wZnM9bG9jMAorICAgICAgICA7OworICAgICAgICBici5yZXQuc3B0ay5tYW55IHJwCitFTkQoaWE2NF9kdW1wX2NwdV9yZWdzKQorCisKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc2FsLmMgYi9hcmNoL2lhNjQva2VybmVsL3NhbC5jCmluZGV4IDY0MmZkYzcuLjIwYmFkNzggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2FsLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zYWwuYwpAQCAtMjIzLDEyICsyMjMsMTMgQEAKICAqLwogc3RhdGljIGludCBzYWxfY2FjaGVfZmx1c2hfZHJvcHNfaW50ZXJydXB0czsKIAotc3RhdGljIHZvaWQgX19pbml0Cit2b2lkIF9faW5pdAogY2hlY2tfc2FsX2NhY2hlX2ZsdXNoICh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNwdTsKLQl1NjQgdmVjdG9yOworCXU2NCB2ZWN0b3IsIGNhY2hlX3R5cGUgPSAzOworCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgaXNydjsKIAogCWNwdSA9IGdldF9jcHUoKTsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CkBAIC0yNDMsNyArMjQ0LDEwIEBACiAJd2hpbGUgKCFpYTY0X2dldF9pcnIoSUE2NF9USU1FUl9WRUNUT1IpKQogCQljcHVfcmVsYXgoKTsKIAotCWlhNjRfc2FsX2NhY2hlX2ZsdXNoKDMpOworCVNBTF9DQUxMKGlzcnYsIFNBTF9DQUNIRV9GTFVTSCwgY2FjaGVfdHlwZSwgMCwgMCwgMCwgMCwgMCwgMCk7CisKKwlpZiAoaXNydi5zdGF0dXMpCisJCXByaW50ayhLRVJOX0VSUiAiU0FMX0NBTF9GTFVTSCBmYWlsZWQgd2l0aCAlbGRcbiIsIGlzcnYuc3RhdHVzKTsKIAogCWlmIChpYTY0X2dldF9pcnIoSUE2NF9USU1FUl9WRUNUT1IpKSB7CiAJCXZlY3RvciA9IGlhNjRfZ2V0X2l2cigpOwpAQCAtMzMxLDcgKzMzNSw2IEBACiAJCXAgKz0gU0FMX0RFU0NfU0laRSgqcCk7CiAJfQogCi0JY2hlY2tfc2FsX2NhY2hlX2ZsdXNoKCk7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zYWxpbmZvLmMgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwppbmRleCBlNjNiOGNhLi5lMzc1YTJmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwpAQCAtMzAyLDcgKzMwMiw3IEBACiBzdGF0aWMgc3NpemVfdAogc2FsaW5mb19ldmVudF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IFBERShpbm9kZSk7CiAJc3RydWN0IHNhbGluZm9fZGF0YSAqZGF0YSA9IGVudHJ5LT5kYXRhOwogCWNoYXIgY21kWzMyXTsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogc3RhdGljIHNzaXplX3QKIHNhbGluZm9fbG9nX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gUERFKGlub2RlKTsKIAlzdHJ1Y3Qgc2FsaW5mb19kYXRhICpkYXRhID0gZW50cnktPmRhdGE7CiAJdTggKmJ1ZjsKQEAgLTUyNSw3ICs1MjUsNyBAQAogc3RhdGljIHNzaXplX3QKIHNhbGluZm9fbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IFBERShpbm9kZSk7CiAJc3RydWN0IHNhbGluZm9fZGF0YSAqZGF0YSA9IGVudHJ5LT5kYXRhOwogCWNoYXIgY21kWzMyXTsKQEAgLTU3NSw3ICs1NzUsNiBAQAogCS53cml0ZSAgID0gc2FsaW5mb19sb2dfd3JpdGUsCiB9OwogCi0jaWZkZWYJQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogc2FsaW5mb19jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CkBAIC02MjAsNyArNjE5LDYgQEAKIAkubm90aWZpZXJfY2FsbCA9IHNhbGluZm9fY3B1X2NhbGxiYWNrLAogCS5wcmlvcml0eSA9IDAsCiB9OwotI2VuZGlmCS8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiBzdGF0aWMgaW50IF9faW5pdAogc2FsaW5mb19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggYzRjYWE4MC4uYWQ1NjdiOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKQEAgLTQzLDYgKzQzLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KIAogI2luY2x1ZGUgPGFzbS9pYTMyLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KQEAgLTI1Miw2ICsyNTQsNDcgQEAKIAllZmlfbWVtbWFwX2luaXQoJnJzdmRfcmVnaW9uW25dLnN0YXJ0LCAmcnN2ZF9yZWdpb25bbl0uZW5kKTsKIAluKys7CiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKKwkvKiBjcmFzaGtlcm5lbD1zaXplQG9mZnNldCBzcGVjaWZpZXMgdGhlIHNpemUgdG8gcmVzZXJ2ZSBmb3IgYSBjcmFzaAorCSAqIGtlcm5lbC4gSWYgb2Zmc2V0IGlzIDAsIHRoZW4gaXQgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LgorCSAqIEJ5IHJlc2VydmluZyB0aGlzIG1lbW9yeSB3ZSBndWFyYW50ZWUgdGhhdCBsaW51eCBuZXZlciBzZXQncyBpdAorCSAqIHVwIGFzIGEgRE1BIHRhcmdldC5Vc2VmdWwgZm9yIGhvbGRpbmcgY29kZSB0byBkbyBzb21ldGhpbmcKKwkgKiBhcHByb3ByaWF0ZSBhZnRlciBhIGtlcm5lbCBwYW5pYy4KKwkgKi8KKwl7CisJCWNoYXIgKmZyb20gPSBzdHJzdHIoc2F2ZWRfY29tbWFuZF9saW5lLCAiY3Jhc2hrZXJuZWw9Iik7CisJCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZTsKKwkJaWYgKGZyb20pIHsKKwkJCXNpemUgPSBtZW1wYXJzZShmcm9tICsgMTIsICZmcm9tKTsKKwkJCWlmICgqZnJvbSA9PSAnQCcpCisJCQkJYmFzZSA9IG1lbXBhcnNlKGZyb20rMSwgJmZyb20pOworCQkJZWxzZQorCQkJCWJhc2UgPSAwOworCQkJaWYgKHNpemUpIHsKKwkJCQlpZiAoIWJhc2UpIHsKKwkJCQkJc29ydF9yZWdpb25zKHJzdmRfcmVnaW9uLCBuKTsKKwkJCQkJYmFzZSA9IGtkdW1wX2ZpbmRfcnN2ZF9yZWdpb24oc2l6ZSwKKwkJCQkJCQkgICAgICAJcnN2ZF9yZWdpb24sIG4pOworCQkJCQl9CisJCQkJaWYgKGJhc2UgIT0gfjBVTCkgeworCQkJCQlyc3ZkX3JlZ2lvbltuXS5zdGFydCA9CisJCQkJCQkodW5zaWduZWQgbG9uZylfX3ZhKGJhc2UpOworCQkJCQlyc3ZkX3JlZ2lvbltuXS5lbmQgPQorCQkJCQkJKHVuc2lnbmVkIGxvbmcpX192YShiYXNlICsgc2l6ZSk7CisJCQkJCW4rKzsKKwkJCQkJY3Jhc2hrX3Jlcy5zdGFydCA9IGJhc2U7CisJCQkJCWNyYXNoa19yZXMuZW5kID0gYmFzZSArIHNpemUgLSAxOworCQkJCX0KKwkJCX0KKwkJfQorCQllZmlfbWVtbWFwX3Jlcy5zdGFydCA9IGlhNjRfYm9vdF9wYXJhbS0+ZWZpX21lbW1hcDsKKyAgICAgICAgICAgICAgICBlZmlfbWVtbWFwX3Jlcy5lbmQgPSBlZmlfbWVtbWFwX3Jlcy5zdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICBpYTY0X2Jvb3RfcGFyYW0tPmVmaV9tZW1tYXBfc2l6ZTsKKyAgICAgICAgICAgICAgICBib290X3BhcmFtX3Jlcy5zdGFydCA9IF9fcGEoaWE2NF9ib290X3BhcmFtKTsKKyAgICAgICAgICAgICAgICBib290X3BhcmFtX3Jlcy5lbmQgPSBib290X3BhcmFtX3Jlcy5zdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmlhNjRfYm9vdF9wYXJhbSk7CisJfQorI2VuZGlmCiAJLyogZW5kIG9mIG1lbW9yeSBtYXJrZXIgKi8KIAlyc3ZkX3JlZ2lvbltuXS5zdGFydCA9IH4wVUw7CiAJcnN2ZF9yZWdpb25bbl0uZW5kICAgPSB+MFVMOwpAQCAtMjYzLDYgKzMwNiw3IEBACiAJc29ydF9yZWdpb25zKHJzdmRfcmVnaW9uLCBudW1fcnN2ZF9yZWdpb25zKTsKIH0KIAorCiAvKioKICAqIGZpbmRfaW5pdHJkIC0gZ2V0IGluaXRyZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGJvb3QgcGFyYW1ldGVyIHN0cnVjdHVyZQogICoKQEAgLTM5Niw2ICs0NDAsMjEgQEAKIH0KIGVhcmx5X3BhcmFtKCJub21jYSIsIHNldHVwX25vbWNhKTsKIAorI2lmZGVmIENPTkZJR19QUk9DX1ZNQ09SRQorLyogZWxmY29yZWhkcj0gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBlbGYgY29yZSBoZWFkZXIKKyAqIHN0b3JlZCBieSB0aGUgY3Jhc2hlZCBrZXJuZWwuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2VsZmNvcmVoZHIoY2hhciAqYXJnKQoreworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBlbGZjb3JlaGRyX2FkZHIgPSBtZW1wYXJzZShhcmcsICZhcmcpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImVsZmNvcmVoZHIiLCBwYXJzZV9lbGZjb3JlaGRyKTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19WTUNPUkUgKi8KKwogdm9pZCBfX2luaXQKIHNldHVwX2FyY2ggKGNoYXIgKipjbWRsaW5lX3ApCiB7CkBAIC00NTcsNiArNTE2LDggQEAKIAljcHVfaW5pdCgpOwkvKiBpbml0aWFsaXplIHRoZSBib290c3RyYXAgQ1BVICovCiAJbW11X2NvbnRleHRfaW5pdCgpOwkvKiBpbml0aWFsaXplIGNvbnRleHRfaWQgYml0bWFwICovCiAKKwljaGVja19zYWxfY2FjaGVfZmx1c2goKTsKKwogI2lmZGVmIENPTkZJR19BQ1BJCiAJYWNwaV9ib290X2luaXQoKTsKICNlbmRpZgpAQCAtNjEzLDYgKzY3NCw3IEBACiB7CiAJY2hhciBicmFuZFsxMjhdOwogCisJbWVtY3B5KGJyYW5kLCAiVW5rbm93biIsIDgpOwogCWlmIChpYTY0X3BhbF9nZXRfYnJhbmRfaW5mbyhicmFuZCkpIHsKIAkJaWYgKGZhbWlseSA9PSAweDcpCiAJCQltZW1jcHkoYnJhbmQsICJNZXJjZWQiLCA3KTsKQEAgLTYyMCw4ICs2ODIsNyBAQAogCQkJY2FzZSAwOiBtZW1jcHkoYnJhbmQsICJNY0tpbmxleSIsIDkpOyBicmVhazsKIAkJCWNhc2UgMTogbWVtY3B5KGJyYW5kLCAiTWFkaXNvbiIsIDgpOyBicmVhazsKIAkJCWNhc2UgMjogbWVtY3B5KGJyYW5kLCAiTWFkaXNvbiB1cCB0byA5TSBjYWNoZSIsIDIzKTsgYnJlYWs7Ci0JCX0gZWxzZQotCQkJbWVtY3B5KGJyYW5kLCAiVW5rbm93biIsIDgpOworCQl9CiAJfQogCWlmIChicmFuZG5hbWVbMF0gPT0gJ1wwJykKIAkJcmV0dXJuIHN0cmNweShicmFuZG5hbWUsIGJyYW5kKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMgYi9hcmNoL2lhNjQva2VybmVsL3NtcC5jCmluZGV4IDY1N2FjOTkuLmY0YzdmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgpAQCAtNjYsNiArNjcsNyBAQAogCiAjZGVmaW5lIElQSV9DQUxMX0ZVTkMJCTAKICNkZWZpbmUgSVBJX0NQVV9TVE9QCQkxCisjZGVmaW5lIElQSV9LRFVNUF9DUFVfU1RPUAkzCiAKIC8qIFRoaXMgbmVlZHMgdG8gYmUgY2FjaGVsaW5lIGFsaWduZWQgYmVjYXVzZSBpdCBpcyB3cml0dGVuIHRvIGJ5ICpvdGhlciogQ1BVcy4gICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCBpcGlfb3BlcmF0aW9uKSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CkBAIC0xMDgsNyArMTEwLDcgQEAKIH0KIAogaXJxcmV0dXJuX3QKLWhhbmRsZV9JUEkgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitoYW5kbGVfSVBJIChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJaW50IHRoaXNfY3B1ID0gZ2V0X2NwdSgpOwogCXVuc2lnbmVkIGxvbmcgKnBlbmRpbmdfaXBpcyA9ICZfX2lhNjRfcGVyX2NwdV92YXIoaXBpX29wZXJhdGlvbik7CkBAIC0xNTUsNyArMTU3LDExIEBACiAJCQkgICAgICBjYXNlIElQSV9DUFVfU1RPUDoKIAkJCQlzdG9wX3RoaXNfY3B1KCk7CiAJCQkJYnJlYWs7Ci0KKyNpZmRlZiBDT05GSUdfS0VYRUMKKwkJCSAgICAgIGNhc2UgSVBJX0tEVU1QX0NQVV9TVE9QOgorCQkJCXVud19pbml0X3J1bm5pbmcoa2R1bXBfY3B1X2ZyZWV6ZSwgTlVMTCk7CisJCQkJYnJlYWs7CisjZW5kaWYKIAkJCSAgICAgIGRlZmF1bHQ6CiAJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiVW5rbm93biBJUEkgb24gQ1BVICVkOiAlbHVcbiIsIHRoaXNfY3B1LCB3aGljaCk7CiAJCQkJYnJlYWs7CkBAIC0yMTMsNiArMjE5LDI2IEBACiAJc2VuZF9JUElfc2luZ2xlKHNtcF9wcm9jZXNzb3JfaWQoKSwgb3ApOwogfQogCisjaWZkZWYgQ09ORklHX0tFWEVDCit2b2lkCitrZHVtcF9zbXBfc2VuZF9zdG9wKCkKK3sKKyAJc2VuZF9JUElfYWxsYnV0c2VsZihJUElfS0RVTVBfQ1BVX1NUT1ApOworfQorCit2b2lkCitrZHVtcF9zbXBfc2VuZF9pbml0KCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1LCBzZWxmX2NwdTsKKwlzZWxmX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY3B1ICE9IHNlbGZfY3B1KSB7CisJCQlpZihrZHVtcF9zdGF0dXNbY3B1XSA9PSAwKQorCQkJCXBsYXRmb3JtX3NlbmRfaXBpKGNwdSwgMCwgSUE2NF9JUElfRE1fSU5JVCwgMCk7CisJCX0KKwl9Cit9CisjZW5kaWYKIC8qCiAgKiBDYWxsZWQgd2l0aCBwcmVlZW1wdGlvbiBkaXNhYmxlZC4KICAqLwpAQCAtMzI4LDEwICszNTQsMTQgQEAKIHNtcF9jYWxsX2Z1bmN0aW9uICh2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLCBpbnQgbm9uYXRvbWljLCBpbnQgd2FpdCkKIHsKIAlzdHJ1Y3QgY2FsbF9kYXRhX3N0cnVjdCBkYXRhOwotCWludCBjcHVzID0gbnVtX29ubGluZV9jcHVzKCktMTsKKwlpbnQgY3B1czsKIAotCWlmICghY3B1cykKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CisJY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpIC0gMTsKKwlpZiAoIWNwdXMpIHsKKwkJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CiAJCXJldHVybiAwOworCX0KIAogCS8qIENhbiBkZWFkbG9jayB3aGVuIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKi8KIAlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CkBAIC0zNDMsOCArMzczLDYgQEAKIAlpZiAod2FpdCkKIAkJYXRvbWljX3NldCgmZGF0YS5maW5pc2hlZCwgMCk7CiAKLQlzcGluX2xvY2soJmNhbGxfbG9jayk7Ci0KIAljYWxsX2RhdGEgPSAmZGF0YTsKIAltYigpOwkvKiBlbnN1cmUgc3RvcmUgdG8gY2FsbF9kYXRhIHByZWNlZGVzIHNldHRpbmcgb2YgSVBJX0NBTExfRlVOQyAqLwogCXNlbmRfSVBJX2FsbGJ1dHNlbGYoSVBJX0NBTExfRlVOQyk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGY3ZDdmNTYuLmIyMWRkZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jCkBAIC00NjMsMTUgKzQ2MywxNyBAQAogfQogCiBzdHJ1Y3QgY3JlYXRlX2lkbGUgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogCWludCBjcHU7CiB9OwogCiB2b2lkCi1kb19mb3JrX2lkbGUodm9pZCAqX2NfaWRsZSkKK2RvX2ZvcmtfaWRsZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGNyZWF0ZV9pZGxlICpjX2lkbGUgPSBfY19pZGxlOworCXN0cnVjdCBjcmVhdGVfaWRsZSAqY19pZGxlID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjcmVhdGVfaWRsZSwgd29yayk7CiAKIAljX2lkbGUtPmlkbGUgPSBmb3JrX2lkbGUoY19pZGxlLT5jcHUpOwogCWNvbXBsZXRlKCZjX2lkbGUtPmRvbmUpOwpAQCAtNDgyLDEwICs0ODQsMTAgQEAKIHsKIAlpbnQgdGltZW91dDsKIAlzdHJ1Y3QgY3JlYXRlX2lkbGUgY19pZGxlID0geworCQkud29yayA9IF9fV09SS19JTklUSUFMSVpFUihjX2lkbGUud29yaywgZG9fZm9ya19pZGxlKSwKIAkJLmNwdQk9IGNwdSwKIAkJLmRvbmUJPSBDT01QTEVUSU9OX0lOSVRJQUxJWkVSKGNfaWRsZS5kb25lKSwKIAl9OwotCURFQ0xBUkVfV09SSyh3b3JrLCBkb19mb3JrX2lkbGUsICZjX2lkbGUpOwogCiAgCWNfaWRsZS5pZGxlID0gZ2V0X2lkbGVfZm9yX2NwdShjcHUpOwogIAlpZiAoY19pZGxlLmlkbGUpIHsKQEAgLTQ5Nyw5ICs0OTksOSBAQAogCSAqIFdlIGNhbid0IHVzZSBrZXJuZWxfdGhyZWFkIHNpbmNlIHdlIG11c3QgYXZvaWQgdG8gcmVzY2hlZHVsZSB0aGUgY2hpbGQuCiAJICovCiAJaWYgKCFrZXZlbnRkX3VwKCkgfHwgY3VycmVudF9pc19rZXZlbnRkKCkpCi0JCXdvcmsuZnVuYyh3b3JrLmRhdGEpOworCQljX2lkbGUud29yay5mdW5jKCZjX2lkbGUud29yayk7CiAJZWxzZSB7Ci0JCXNjaGVkdWxlX3dvcmsoJndvcmspOworCQlzY2hlZHVsZV93b3JrKCZjX2lkbGUud29yayk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNfaWRsZS5kb25lKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKaW5kZXggNDExNjlhOS4uMzllMGNkMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKQEAgLTg0LDYgKzg0LDEyIEBACiAKIAkJaWYgKHRpbWVfYWZ0ZXIobmV3X2l0bSwgaWE2NF9nZXRfaXRjKCkpKQogCQkJYnJlYWs7CisKKwkJLyoKKwkJICogQWxsb3cgSVBJcyB0byBpbnRlcnJ1cHQgdGhlIHRpbWVyIGxvb3AuCisJCSAqLworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJfQogCiAJZG8gewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jIGIvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCmluZGV4IDU2MjliNDUuLjY4NzUwMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKQEAgLTMxLDExICszMSwxMSBAQAogewogI2lmIGRlZmluZWQgKENPTkZJR19BQ1BJKSAmJiBkZWZpbmVkIChDT05GSUdfSE9UUExVR19DUFUpCiAJLyoKLQkgKiBJZiBDUEVJIGNhbm5vdCBiZSByZS10YXJnZXR0ZWQsIGFuZCB0aGlzIGlzCi0JICogQ1BFSSB0YXJnZXQsIHRoZW4gZG9udCBjcmVhdGUgdGhlIGNvbnRyb2wgZmlsZQorCSAqIElmIENQRUkgY2FuIGJlIHJlLXRhcmdldHRlZCBvciBpZiB0aGlzIGlzIG5vdAorCSAqIENQRUkgdGFyZ2V0LCB0aGVuIGl0IGlzIGhvdHBsdWdnYWJsZQogCSAqLwotCWlmICghY2FuX2NwZWlfcmV0YXJnZXQoKSAmJiBpc19jcHVfY3BlaV90YXJnZXQobnVtKSkKLQkJc3lzZnNfY3B1c1tudW1dLmNwdS5ub19jb250cm9sID0gMTsKKwlpZiAoY2FuX2NwZWlfcmV0YXJnZXQoKSB8fCAhaXNfY3B1X2NwZWlfdGFyZ2V0KG51bSkpCisJCXN5c2ZzX2NwdXNbbnVtXS5jcHUuaG90cGx1Z2dhYmxlID0gMTsKIAltYXBfY3B1X3RvX25vZGUobnVtLCBub2RlX2NwdWlkW251bV0ubmlkKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKaW5kZXggZmZmYTllMC4uYWI2ODQ3NCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYwpAQCAtMzA3LDYgKzMwNywxNSBAQAogCXJldHVybiByZXQuc3RhdHVzOwogfQogCitzdHJ1Y3QgZnB1X3N3YV9tc2cgeworCXVuc2lnbmVkIGxvbmcgY291bnQ7CisJdW5zaWduZWQgbG9uZyB0aW1lOworfTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZnB1X3N3YV9tc2csIGNwdWxhc3QpOworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBmcHVfc3dhX21zZywgY3B1bGFzdCk7CitzdGF0aWMgc3RydWN0IGZwdV9zd2FfbXNnIGxhc3QgX19jYWNoZWxpbmVfYWxpZ25lZDsKKworCiAvKgogICogSGFuZGxlIGZsb2F0aW5nLXBvaW50IGFzc2lzdCBmYXVsdHMgYW5kIHRyYXBzLgogICovCkBAIC0zMTYsOCArMzI1LDYgQEAKIAlsb25nIGV4Y2VwdGlvbiwgYnVuZGxlWzJdOwogCXVuc2lnbmVkIGxvbmcgZmF1bHRfaXA7CiAJc3RydWN0IHNpZ2luZm8gc2lnaW5mbzsKLQlzdGF0aWMgaW50IGZwdV9zd2FfY291bnQgPSAwOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfdGltZTsKIAogCWZhdWx0X2lwID0gcmVncy0+Y3JfaWlwOwogCWlmICghZnBfZmF1bHQgJiYgKGlhNjRfcHNyKHJlZ3MpLT5yaSA9PSAwKSkKQEAgLTMyNSwxNCArMzMyLDM3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKGJ1bmRsZSwgKHZvaWQgX191c2VyICopIGZhdWx0X2lwLCBzaXplb2YoYnVuZGxlKSkpCiAJCXJldHVybiAtMTsKIAotCWlmIChqaWZmaWVzIC0gbGFzdF90aW1lID4gNSpIWikKLQkJZnB1X3N3YV9jb3VudCA9IDA7Ci0JaWYgKChmcHVfc3dhX2NvdW50IDwgNCkgJiYgIShjdXJyZW50LT50aHJlYWQuZmxhZ3MgJiBJQTY0X1RIUkVBRF9GUEVNVV9OT1BSSU5UKSkgewotCQlsYXN0X3RpbWUgPSBqaWZmaWVzOwotCQkrK2ZwdV9zd2FfY291bnQ7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICIlcyglZCk6IGZsb2F0aW5nLXBvaW50IGFzc2lzdCBmYXVsdCBhdCBpcCAlMDE2bHgsIGlzciAlMDE2bHhcbiIsCi0JCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHJlZ3MtPmNyX2lpcCArIGlhNjRfcHNyKHJlZ3MpLT5yaSwgaXNyKTsKKwlpZiAoIShjdXJyZW50LT50aHJlYWQuZmxhZ3MgJiBJQTY0X1RIUkVBRF9GUEVNVV9OT1BSSU5UKSkgIHsKKwkJdW5zaWduZWQgbG9uZyBjb3VudCwgY3VycmVudF9qaWZmaWVzID0gamlmZmllczsKKwkJc3RydWN0IGZwdV9zd2FfbXNnICpjcCA9ICZfX2dldF9jcHVfdmFyKGNwdWxhc3QpOworCisJCWlmICh1bmxpa2VseShjdXJyZW50X2ppZmZpZXMgPiBjcC0+dGltZSkpCisJCQljcC0+Y291bnQgPSAwOworCQlpZiAodW5saWtlbHkoY3AtPmNvdW50IDwgNSkpIHsKKwkJCWNwLT5jb3VudCsrOworCQkJY3AtPnRpbWUgPSBjdXJyZW50X2ppZmZpZXMgKyA1ICogSFo7CisKKwkJCS8qIG1pbmltaXplIHJhY2VzIGJ5IGdyYWJiaW5nIGEgY29weSBvZiBjb3VudCBCRUZPUkUgY2hlY2tpbmcgbGFzdC50aW1lLiAqLworCQkJY291bnQgPSBsYXN0LmNvdW50OworCQkJYmFycmllcigpOworCisJCQkvKgorCQkJICogTG93ZXIgNCBiaXRzIGFyZSB1c2VkIGFzIGEgY291bnQuIFVwcGVyIGJpdHMgYXJlIGEgc2VxdWVuY2UKKwkJCSAqIG51bWJlciB0aGF0IGlzIHVwZGF0ZWQgd2hlbiBjb3VudCBpcyByZXNldC4gVGhlIGNtcHhjaGcgd2lsbAorCQkJICogZmFpbCBpcyBzZXFubyBoYXMgY2hhbmdlZC4gVGhpcyBtaW5pbWl6ZXMgbXV0aXBsZSBjcHVzCisJCQkgKiByZXNldGluZyB0aGUgY291bnQuCisJCQkgKi8KKwkJCWlmIChjdXJyZW50X2ppZmZpZXMgPiBsYXN0LnRpbWUpCisJCQkJKHZvaWQpIGNtcHhjaGdfYWNxKCZsYXN0LmNvdW50LCBjb3VudCwgMTYgKyAoY291bnQgJiB+MTUpKTsKKworCQkJLyogdXNlZCBmZXRjaGFkZCB0byBhdG9taWNhbGx5IHVwZGF0ZSB0aGUgY291bnQgKi8KKwkJCWlmICgobGFzdC5jb3VudCAmIDE1KSA8IDUgJiYgKGlhNjRfZmV0Y2hhZGQoMSwgJmxhc3QuY291bnQsIGFjcSkgJiAxNSkgPCA1KSB7CisJCQkJbGFzdC50aW1lID0gY3VycmVudF9qaWZmaWVzICsgNSAqIEhaOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgIAkJCSIlcyglZCk6IGZsb2F0aW5nLXBvaW50IGFzc2lzdCBmYXVsdCBhdCBpcCAlMDE2bHgsIGlzciAlMDE2bHhcbiIsCisJCSAgICAgICAJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHJlZ3MtPmNyX2lpcCArIGlhNjRfcHNyKHJlZ3MpLT5yaSwgaXNyKTsKKwkJCX0KKwkJfQogCX0KIAogCWV4Y2VwdGlvbiA9IGZwX2VtdWxhdGUoZnBfZmF1bHQsIGJ1bmRsZSwgJnJlZ3MtPmNyX2lwc3IsICZyZWdzLT5hcl9mcHNyLCAmaXNyLCAmcmVncy0+cHIsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYjNiMmUzOC4uZDYwODNhMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTI4LDEzICsxMjgsNyBAQAogICAuaW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmluaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpCiAJewogCSAgX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JICAqKC5pbml0Y2FsbDEuaW5pdCkKLQkgICooLmluaXRjYWxsMi5pbml0KQotCSAgKiguaW5pdGNhbGwzLmluaXQpCi0JICAqKC5pbml0Y2FsbDQuaW5pdCkKLQkgICooLmluaXRjYWxsNS5pbml0KQotCSAgKiguaW5pdGNhbGw2LmluaXQpCi0JICAqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKIAkgIF9faW5pdGNhbGxfZW5kID0gLjsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYyBiL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYwppbmRleCBiZWIxMTcyLi40NDExZDliIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9pYTY0L2xpYi9jaGVja3N1bS5jCkBAIC0zMywzMiArMzMsMzIgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZC4KICAqLwotdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX3RjcHVkcF9tYWdpYyAodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK19fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljIChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKLQlyZXR1cm4gfmZyb202NHRvMTYoc2FkZHIgKyBkYWRkciArIHN1bSArICgodW5zaWduZWQgbG9uZykgbnRvaHMobGVuKSA8PCAxNikgKwotCQkJICAgKCh1bnNpZ25lZCBsb25nKSBwcm90byA8PCA4KSk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmZyb202NHRvMTYoCisJCShfX2ZvcmNlIHU2NClzYWRkciArIChfX2ZvcmNlIHU2NClkYWRkciArCisJCShfX2ZvcmNlIHU2NClzdW0gKyAoKGxlbiArIHByb3RvKSA8PCA4KSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV90Y3B1ZHBfbWFnaWMpOwogCi11bnNpZ25lZCBpbnQKLWNzdW1fdGNwdWRwX25vZm9sZCAodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZCAoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCi0JcmVzdWx0ID0gKHNhZGRyICsgZGFkZHIgKyBzdW0gKwotCQkgICgodW5zaWduZWQgbG9uZykgbnRvaHMobGVuKSA8PCAxNikgKwotCQkgICgodW5zaWduZWQgbG9uZykgcHJvdG8gPDwgOCkpOworCXJlc3VsdCA9IChfX2ZvcmNlIHU2NClzYWRkciArIChfX2ZvcmNlIHU2NClkYWRkciArCisJCSAoX19mb3JjZSB1NjQpc3VtICsgKChsZW4gKyBwcm90bykgPDwgOCk7CiAKIAkvKiBGb2xkIGRvd24gdG8gMzItYml0cyBzbyB3ZSBkb24ndCBsb3NlIGluIHRoZSB0eXBlZGVmLWxlc3MgbmV0d29yayBzdGFjay4gICovCiAJLyogNjQgdG8gMzMgKi8KIAlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmZmZmZikgKyAocmVzdWx0ID4+IDMyKTsKIAkvKiAzMyB0byAzMiAqLwogCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmZmZmZmKSArIChyZXN1bHQgPj4gMzIpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX2NzdW0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgbG9uZyk7CkBAIC03NSwxNiArNzUsMTUgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewotCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOworCXU2NCByZXN1bHQgPSBkb19jc3VtKGJ1ZmYsIGxlbik7CiAKIAkvKiBhZGQgaW4gb2xkIHN1bSwgYW5kIGNhcnJ5Li4gKi8KLQlyZXN1bHQgKz0gc3VtOworCXJlc3VsdCArPSAoX19mb3JjZSB1MzIpc3VtOwogCS8qIDMyK2MgYml0cyAtPiAzMiBiaXRzICovCiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KIAogRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwpAQCAtOTMsMTAgKzkyLDkgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi11bnNpZ25lZCBzaG9ydAotaXBfY29tcHV0ZV9jc3VtICh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtIChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewotCXJldHVybiB+ZG9fY3N1bShidWZmLGxlbik7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmRvX2NzdW0oYnVmZixsZW4pOwogfQogCiBFWFBPUlRfU1lNQk9MKGlwX2NvbXB1dGVfY3N1bSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMgYi9hcmNoL2lhNjQvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKaW5kZXggMzY4NjZlOC4uNTAzZGZlNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCisrKyBiL2FyY2gvaWE2NC9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYwpAQCAtMTA0LDkgKzEwNCw5IEBACiAgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX2NzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqLCBsb25nKTsKIAotc3RhdGljIHVuc2lnbmVkIGludAotZG9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJaW50IGxlbiwgdW5zaWduZWQgaW50IHBzdW0sIGludCAqZXJycCkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQlpbnQgbGVuLCBfX3dzdW0gcHN1bSwgaW50ICplcnJwKQogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCkBAIC0xMjIsMzAgKzEyMiwxNyBAQAogCXJlc3VsdCA9IGRvX2NzdW0oZHN0LCBsZW4pOwogCiAJLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCi0JcmVzdWx0ICs9IHBzdW07CisJcmVzdWx0ICs9IChfX2ZvcmNlIHUzMilwc3VtOwogCS8qIDMyK2MgYml0cyAtPiAzMiBiaXRzICovCiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCSAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJwKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIGxlbikpIHsKLQkJKmVycnAgPSAtRUZBVUxUOwotCQltZW1zZXQoZHN0LCAwLCBsZW4pOwotCQlyZXR1cm4gc3VtOwotCX0KLQotCXJldHVybiBkb19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoc3JjLCBkc3QsIGxlbiwgc3VtLCBlcnJwKTsKLX0KLQotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCSAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKLXsKLQlyZXR1cm4gZG9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCk7CisJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcigoX19mb3JjZSBjb25zdCB2b2lkIF9fdXNlciAqKXNyYywKKwkJCQkJICAgZHN0LCBsZW4sIHN1bSwgTlVMTCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbGliL2lwX2Zhc3RfY3N1bS5TIGIvYXJjaC9pYTY0L2xpYi9pcF9mYXN0X2NzdW0uUwppbmRleCAxOTY3NGNhLi4xZjg2YWViIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2lwX2Zhc3RfY3N1bS5TCisrKyBiL2FyY2gvaWE2NC9saWIvaXBfZmFzdF9jc3VtLlMKQEAgLTgsOCArOCw4IEBACiAgKiAgICAgIGluMDogYWRkcmVzcyBvZiBidWZmZXIgdG8gY2hlY2tzdW0gKGNoYXIgKikKICAqICAgICAgaW4xOiBsZW5ndGggb2YgdGhlIGJ1ZmZlciAoaW50KQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBJbnRlbCBDb3JwLgotICogQ29weXJpZ2h0IChDKSAyMDAyIEtlbiBDaGVuIDxrZW5uZXRoLncuY2hlbkBpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDYgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiBLZW4gQ2hlbiA8a2VubmV0aC53LmNoZW5AaW50ZWwuY29tPgogICovCiAKICNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KQEAgLTI1LDYgKzI1LDkgQEAKIAogI2RlZmluZSBpbjAJcjMyCiAjZGVmaW5lIGluMQlyMzMKKyNkZWZpbmUgaW4yCXIzNAorI2RlZmluZSBpbjMJcjM1CisjZGVmaW5lIGluNAlyMzYKICNkZWZpbmUgcmV0MAlyOAogCiBHTE9CQUxfRU5UUlkoaXBfZmFzdF9jc3VtKQpAQCAtNjUsOCArNjgsOSBAQAogCXp4dDIJcjIwPXIyMAogCTs7CiAJYWRkCXIyMD1yZXQwLHIyMAorCW1vdglyOT0weGZmZmYKIAk7OwotCWFuZGNtCXJldDA9LTEscjIwCisJYW5kY20JcmV0MD1yOSxyMjAKIAkucmVzdG9yZSBzcAkJLy8gcmVzZXQgZnJhbWUgc3RhdGUKIAlici5yZXQuc3B0ay5tYW55IGIwCiAJOzsKQEAgLTg4LDMgKzkyLDUxIEBACiAJbW92CWIwPXIzNAogCWJyLnJldC5zcHRrLm1hbnkgYjAKIEVORChpcF9mYXN0X2NzdW0pCisKK0dMT0JBTF9FTlRSWShjc3VtX2lwdjZfbWFnaWMpCisJbGQ0CXIyMD1baW4wXSw0CisJbGQ0CXIyMT1baW4xXSw0CisJZGVwCXIxNT1pbjMsaW4yLDMyLDE2CisJOzsKKwlsZDQJcjIyPVtpbjBdLDQKKwlsZDQJcjIzPVtpbjFdLDQKKwltdXgxCXIxNT1yMTUsQHJldgorCTs7CisJbGQ0CXIyND1baW4wXSw0CisJbGQ0CXIyNT1baW4xXSw0CisJc2hyLnUJcjE1PXIxNSwxNgorCWFkZAlyMTY9cjIwLHIyMQorCWFkZAlyMTc9cjIyLHIyMworCTs7CisJbGQ0CXIyNj1baW4wXSw0CisJbGQ0CXIyNz1baW4xXSw0CisJYWRkCXIxOD1yMjQscjI1CisJYWRkCXI4PXIxNixyMTcKKwk7OworCWFkZAlyMTk9cjI2LHIyNworCWFkZAlyOD1yOCxyMTgKKwk7OworCWFkZAlyOD1yOCxyMTkKKwlhZGQJcjE1PXIxNSxpbjQKKwk7OworCWFkZAlyOD1yOCxyMTUKKwk7OworCXNoci51CXIxMD1yOCwzMgkvLyBub3cgZm9sZCBzdW0gaW50byBzaG9ydAorCXp4dDQJcjExPXI4CisJOzsKKwlhZGQJcjg9cjEwLHIxMQorCTs7CisJc2hyLnUJcjEwPXI4LDE2CS8vIHllYWgsIGtlZXAgaXQgcm9sbGluZworCXp4dDIJcjExPXI4CisJOzsKKwlhZGQJcjg9cjEwLHIxMQorCTs7CisJc2hyLnUJcjEwPXI4LDE2CS8vIHRocmVlIHRpbWVzIGx1Y2t5CisJenh0MglyMTE9cjgKKwk7OworCWFkZAlyOD1yMTAscjExCisJbW92CXI5PTB4ZmZmZgorCTs7CisJYW5kY20Jcjg9cjkscjgKKwlici5yZXQuc3B0ay5tYW55IGIwCitFTkQoY3N1bV9pcHY2X21hZ2ljKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2NvbnRpZy5jIGIvYXJjaC9pYTY0L21tL2NvbnRpZy5jCmluZGV4IDgyZGVhYTMuLjFlNzk1NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9jb250aWcuYworKysgYi9hcmNoL2lhNjQvbW0vY29udGlnLmMKQEAgLTE3NCw2ICsxNzQsMTIgQEAKIAlyZXNlcnZlX2Jvb3RtZW0oYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9zaXplKTsKIAogCWZpbmRfaW5pdHJkKCk7CisKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCS8qIElmIHdlIGFyZSBkb2luZyBhIGNyYXNoIGR1bXAsIHdlIHN0aWxsIG5lZWQgdG8ga25vdyB0aGUgcmVhbCBtZW0KKwkgKiBzaXplIGJlZm9yZSBvcmlnaW5hbCBtZW1vcnkgbWFwIGlzICogcmVzZXQuICovCisJc2F2ZWRfbWF4X3BmbiA9IG1heF9wZm47CisjZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTIyNiw3ICsyMzIsNiBAQAogcGFnaW5nX2luaXQgKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXhfZG1hOwotCXVuc2lnbmVkIGxvbmcgbmlkID0gMDsKIAl1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbnNbTUFYX05SX1pPTkVTXTsKIAogCW51bV9waHlzcGFnZXMgPSAwOwpAQCAtMjM4LDcgKzI0Myw3IEBACiAJbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBtYXhfbG93X3BmbjsKIAogI2lmZGVmIENPTkZJR19WSVJUVUFMX01FTV9NQVAKLQllZmlfbWVtbWFwX3dhbGsocmVnaXN0ZXJfYWN0aXZlX3JhbmdlcywgJm5pZCk7CisJZWZpX21lbW1hcF93YWxrKHJlZ2lzdGVyX2FjdGl2ZV9yYW5nZXMsIE5VTEwpOwogCWVmaV9tZW1tYXBfd2FsayhmaW5kX2xhcmdlc3RfaG9sZSwgKHU2NCAqKSZtYXhfZ2FwKTsKIAlpZiAobWF4X2dhcCA8IExBUkdFX0dBUCkgewogCQl2bWVtX21hcCA9IChzdHJ1Y3QgcGFnZSAqKSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL2lhNjQvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCBlZWU1YzFjZi4uMGM3ZTk0ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMKQEAgLTY0LDE0ICs2NCwyMSBAQAogCXJldHVybiBwdGU7CiB9CiAKK2ludCBodWdlX3BtZF91bnNoYXJlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nICphZGRyLCBwdGVfdCAqcHRlcCkKK3sKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSBta19wdGVfaHVnZShlbnRyeSkgeyBwdGVfdmFsKGVudHJ5KSB8PSBfUEFHRV9QOyB9CiAKIC8qCiAgKiBEb24ndCBhY3R1YWxseSBuZWVkIHRvIGRvIGFueSBwcmVwYXJhdGlvbiwgYnV0IG5lZWQgdG8gbWFrZSBzdXJlCiAgKiB0aGUgYWRkcmVzcyBpcyBpbiB0aGUgcmlnaHQgcmVnaW9uLgogICovCi1pbnQgcHJlcGFyZV9odWdlcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoraW50IHByZXBhcmVfaHVnZXBhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgcGdvZmZfdCBwZ29mZikKIHsKKwlpZiAocGdvZmYgJiAofkhQQUdFX01BU0sgPj4gUEFHRV9TSElGVCkpCisJCXJldHVybiAtRUlOVkFMOwogCWlmIChsZW4gJiB+SFBBR0VfTUFTSykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGFkZHIgJiB+SFBBR0VfTUFTSykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9pbml0LmMgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCmluZGV4IGZmODdhNWMuLjFhM2Q4YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9pYTY0L21tL2luaXQuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJICogdGhlIHByb2JsZW0uICBXaGVuIHRoZSBwcm9jZXNzIGF0dGVtcHRzIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlciBiYWNraW5nIHN0b3JlCiAJICogZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCB3aWxsIGdldCBhIFNFR0ZBVUxUIGluIHRoaXMgY2FzZS4KIAkgKi8KLQl2bWEgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJdm1hID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHZtYSkgewogCQltZW1zZXQodm1hLCAwLCBzaXplb2YoKnZtYSkpOwogCQl2bWEtPnZtX21tID0gY3VycmVudC0+bW07CkBAIC0xNzUsNyArMTc1LDcgQEAKIAogCS8qIG1hcCBOYVQtcGFnZSBhdCBhZGRyZXNzIHplcm8gdG8gc3BlZWQgdXAgc3BlY3VsYXRpdmUgZGVyZWZlcmVuY2luZyBvZiBOVUxMOiAqLwogCWlmICghKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgTU1BUF9QQUdFX1pFUk8pKSB7Ci0JCXZtYSA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwkJdm1hID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJCWlmICh2bWEpIHsKIAkJCW1lbXNldCh2bWEsIDAsIHNpemVvZigqdm1hKSk7CiAJCQl2bWEtPnZtX21tID0gY3VycmVudC0+bW07CkBAIC01OTUsMTQgKzU5NSw5IEBACiB9CiAKIGludCBfX2luaXQKLXJlZ2lzdGVyX2FjdGl2ZV9yYW5nZXModTY0IHN0YXJ0LCB1NjQgZW5kLCB2b2lkICpuaWQpCityZWdpc3Rlcl9hY3RpdmVfcmFuZ2VzKHU2NCBzdGFydCwgdTY0IGVuZCwgdm9pZCAqYXJnKQogewotCUJVR19PTihuaWQgPT0gTlVMTCk7Ci0JQlVHX09OKCoodW5zaWduZWQgbG9uZyAqKW5pZCA+PSBNQVhfTlVNTk9ERVMpOwotCi0JYWRkX2FjdGl2ZV9yYW5nZSgqKHVuc2lnbmVkIGxvbmcgKiluaWQsCi0JCQkJX19wYShzdGFydCkgPj4gUEFHRV9TSElGVCwKLQkJCQlfX3BhKGVuZCkgPj4gUEFHRV9TSElGVCk7CisJYWRkX2FjdGl2ZV9yYW5nZSgwLCBfX3BhKHN0YXJ0KSA+PiBQQUdFX1NISUZULCBfX3BhKGVuZCkgPj4gUEFHRV9TSElGVCk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX1ZJUlRVQUxfTUVNX01BUCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9NYWtlZmlsZSBiL2FyY2gvaWE2NC9wY2kvTWFrZWZpbGUKaW5kZXggZTY2ODg5ZS4uZmIxNGRjNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQvcGNpL01ha2VmaWxlCkBAIC0xLDQgKzEsNCBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIGlhNjQtc3BlY2lmaWMgcGFydHMgb2YgdGhlIHBjaSBidXMKICMKLW9iai15CQk6PSBwY2kubworb2JqLXkJCTo9IHBjaS5vIGZpeHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvZml4dXAuYyBiL2FyY2gvaWE2NC9wY2kvZml4dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDVkYzFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pYTY0L3BjaS9maXh1cC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBFeGNlcHRpb25zIGZvciBzcGVjaWZpYyBkZXZpY2VzLiBVc3VhbGx5IHdvcmstYXJvdW5kcyBmb3IgZmF0YWwgZGVzaWduIGZsYXdzLgorICogRGVyaXZlZCBmcm9tIGZpeHVwLmMgb2YgaTM4NiB0cmVlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorCisvKgorICogRml4dXAgdG8gbWFyayBib290IEJJT1MgdmlkZW8gc2VsZWN0ZWQgYnkgQklPUyBiZWZvcmUgaXQgY2hhbmdlcworICoKKyAqIEZyb20gaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgIkpvbiBTbWlybCIgPGpvbnNtaXJsQGdtYWlsLmNvbT4KKyAqCisgKiBUaGUgc3RhbmRhcmQgYm9vdCBST00gc2VxdWVuY2UgZm9yIGFuIHg4NiBtYWNoaW5lIHVzZXMgdGhlIEJJT1MKKyAqIHRvIHNlbGVjdCBhbiBpbml0aWFsIHZpZGVvIGNhcmQgZm9yIGJvb3QgZGlzcGxheS4gVGhpcyBib290IHZpZGVvCisgKiBjYXJkIHdpbGwgaGF2ZSBpdCdzIEJJT1MgY29waWVkIHRvIEMwMDAwIGluIHN5c3RlbSBSQU0uCisgKiBJT1JFU09VUkNFX1JPTV9TSEFET1cgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlIGJvb3QgdmlkZW8KKyAqIGNhcmQgd2l0aCB0aGlzIGNvcHkuIE9uIGxhcHRvcHMgdGhpcyBjb3B5IGhhcyB0byBiZSB1c2VkIHNpbmNlCisgKiB0aGUgbWFpbiBST00gbWF5IGJlIGNvbXByZXNzZWQgb3IgY29tYmluZWQgd2l0aCBhbm90aGVyIGltYWdlLgorICogU2VlIHBjaV9tYXBfcm9tKCkgZm9yIHVzZSBvZiB0aGlzIGZsYWcuIElPUkVTT1VSQ0VfUk9NX1NIQURPVworICogaXMgbWFya2VkIGhlcmUgc2luY2UgdGhlIGJvb3QgdmlkZW8gZGV2aWNlIHdpbGwgYmUgdGhlIG9ubHkgZW5hYmxlZAorICogdmlkZW8gZGV2aWNlIGF0IHRoaXMgcG9pbnQuCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF92aWRlbyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJdTE2IGNvbmZpZzsKKworCWlmICgoc3RyY21wKHBsYXRmb3JtX25hbWUsICJkaWciKSAhPSAwKQorCSAgICAmJiAoc3RyY21wKHBsYXRmb3JtX25hbWUsICJocHp4MSIpICAhPSAwKSkKKwkJcmV0dXJuOworCS8qIE1heWJlLCB0aGlzIG1hY2hpbmUgc3VwcG9ydHMgbGVnYWN5IG1lbW9yeSBtYXAuICovCisKKwlpZiAoKHBkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkKKwkJcmV0dXJuOworCisJLyogSXMgVkdBIHJvdXRlZCB0byB1cz8gKi8KKwlidXMgPSBwZGV2LT5idXM7CisJd2hpbGUgKGJ1cykgeworCQlicmlkZ2UgPSBidXMtPnNlbGY7CisKKwkJLyoKKwkJICogRnJvbSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorCQkgKiAiRGF2aWQgTWlsbGVyIiA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKwkJICogVGhlIGJyaWRnZSBjb250cm9sIHJlZ2lzdGVyIGlzIHZhbGlkIGZvciBQQ0kgaGVhZGVyCisJCSAqIHR5cGUgQlJJREdFLCBvciBDQVJEQlVTLiBIb3N0IHRvIFBDSSBjb250cm9sbGVycyB1c2UKKwkJICogUENJIGhlYWRlciB0eXBlIE5PUk1BTC4KKwkJICovCisJCWlmIChicmlkZ2UKKwkJICAgICYmKChicmlkZ2UtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpCisJCSAgICAgICB8fChicmlkZ2UtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTKSkpIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZSwgUENJX0JSSURHRV9DT05UUk9MLAorCQkJCQkJJmNvbmZpZyk7CisJCQlpZiAoIShjb25maWcgJiBQQ0lfQlJJREdFX0NUTF9WR0EpKQorCQkJCXJldHVybjsKKwkJfQorCQlidXMgPSBidXMtPnBhcmVudDsKKwl9CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjb25maWcpOworCWlmIChjb25maWcgJiAoUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlkpKSB7CisJCXBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9IElPUkVTT1VSQ0VfUk9NX1NIQURPVzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJvb3QgdmlkZW8gZGV2aWNlIGlzICVzXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9maXh1cF92aWRlbyk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvcGNpL3BjaS5jIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwppbmRleCBiMzBiZTdjLi40NzRkMTc5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL3BjaS5jCisrKyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKQEAgLTEyNSwxMSArMTI1LDEwIEBACiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyOwogCi0JY29udHJvbGxlciA9IGttYWxsb2Moc2l6ZW9mKCpjb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CisJY29udHJvbGxlciA9IGt6YWxsb2Moc2l6ZW9mKCpjb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb250cm9sbGVyKQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChjb250cm9sbGVyLCAwLCBzaXplb2YoKmNvbnRyb2xsZXIpKTsKIAljb250cm9sbGVyLT5zZWdtZW50ID0gc2VnOwogCWNvbnRyb2xsZXItPm5vZGUgPSAtMTsKIAlyZXR1cm4gY29udHJvbGxlcjsKQEAgLTQ2OSwxMCArNDY4LDExIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlwY2liaW9zX2ZpeHVwX3Jlc291cmNlcyhkZXYsIDAsIFBDSV9CUklER0VfUkVTT1VSQ0VTKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyk7CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2JyaWRnZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKQEAgLTQ5Myw2ICs0OTMsNyBAQAogCX0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmItPmRldmljZXMsIGJ1c19saXN0KQogCQlwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoZGV2KTsKKwlwbGF0Zm9ybV9wY2lfZml4dXBfYnVzKGIpOwogCiAJcmV0dXJuOwogfQpAQCAtNTYyLDggKzU2Myw4IEBACiB2b2lkCiBwY2liaW9zX2Rpc2FibGVfZGV2aWNlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWlmIChkZXYtPmlzX2VuYWJsZWQpCi0JCWFjcGlfcGNpX2lycV9kaXNhYmxlKGRldik7CisJQlVHX09OKGF0b21pY19yZWFkKCZkZXYtPmVuYWJsZV9jbnQpKTsKKwlhY3BpX3BjaV9pcnFfZGlzYWJsZShkZXYpOwogfQogCiB2b2lkCkBAIC03MzgsNzUgKzczOSw0NCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qIEl0J3MgZGVmaW5lZCBpbiBkcml2ZXJzL3BjaS9wY2kuYyAqLworZXh0ZXJuIHU4IHBjaV9jYWNoZV9saW5lX3NpemU7CisKIC8qKgotICogcGNpX2NhY2hlbGluZV9zaXplIC0gZGV0ZXJtaW5lIGNhY2hlbGluZSBzaXplIGZvciBQQ0kgZGV2aWNlcwotICogQGRldjogdm9pZAorICogc2V0X3BjaV9jYWNoZWxpbmVfc2l6ZSAtIGRldGVybWluZSBjYWNoZWxpbmUgc2l6ZSBmb3IgUENJIGRldmljZXMKICAqCiAgKiBXZSB3YW50IHRvIHVzZSB0aGUgbGluZS1zaXplIG9mIHRoZSBvdXRlci1tb3N0IGNhY2hlLiAgV2UgYXNzdW1lCiAgKiB0aGF0IHRoaXMgbGluZS1zaXplIGlzIHRoZSBzYW1lIGZvciBhbGwgQ1BVcy4KICAqCiAgKiBDb2RlIG1vc3RseSB0YWtlbiBmcm9tIGFyY2gvaWE2NC9rZXJuZWwvcGFsaW5mby5jOmNhY2hlX2luZm8oKS4KLSAqCi0gKiBSRVRVUk5TOiBBbiBhcHByb3ByaWF0ZSAtRVJSTk8gZXJyb3IgdmFsdWUgb24gZXJvciwgb3IgemVybyBmb3Igc3VjY2Vzcy4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXBjaV9jYWNoZWxpbmVfc2l6ZSAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfcGNpX2NhY2hlbGluZV9zaXplKHZvaWQpCiB7CiAJdTY0IGxldmVscywgdW5pcXVlX2NhY2hlczsKIAlzNjQgc3RhdHVzOwogCXBhbF9jYWNoZV9jb25maWdfaW5mb190IGNjaTsKLQlzdGF0aWMgdTggY2FjaGVsaW5lX3NpemU7Ci0KLQlpZiAoY2FjaGVsaW5lX3NpemUpCi0JCXJldHVybiBjYWNoZWxpbmVfc2l6ZTsKIAogCXN0YXR1cyA9IGlhNjRfcGFsX2NhY2hlX3N1bW1hcnkoJmxldmVscywgJnVuaXF1ZV9jYWNoZXMpOwogCWlmIChzdGF0dXMgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpYTY0X3BhbF9jYWNoZV9zdW1tYXJ5KCkgZmFpbGVkIChzdGF0dXM9JWxkKVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKLQkJcmV0dXJuIFNNUF9DQUNIRV9CWVRFUzsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaWE2NF9wYWxfY2FjaGVfc3VtbWFyeSgpIGZhaWxlZCAiCisJCQkiKHN0YXR1cz0lbGQpXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCXJldHVybjsKIAl9CiAKLQlzdGF0dXMgPSBpYTY0X3BhbF9jYWNoZV9jb25maWdfaW5mbyhsZXZlbHMgLSAxLCAvKiBjYWNoZV90eXBlIChkYXRhX29yX3VuaWZpZWQpPSAqLyAyLAotCQkJCQkgICAgJmNjaSk7CisJc3RhdHVzID0gaWE2NF9wYWxfY2FjaGVfY29uZmlnX2luZm8obGV2ZWxzIC0gMSwKKwkJCQkvKiBjYWNoZV90eXBlIChkYXRhX29yX3VuaWZpZWQpPSAqLyAyLCAmY2NpKTsKIAlpZiAoc3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogaWE2NF9wYWxfY2FjaGVfY29uZmlnX2luZm8oKSBmYWlsZWQgKHN0YXR1cz0lbGQpXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOwotCQlyZXR1cm4gU01QX0NBQ0hFX0JZVEVTOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpYTY0X3BhbF9jYWNoZV9jb25maWdfaW5mbygpIGZhaWxlZCAiCisJCQkiKHN0YXR1cz0lbGQpXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCXJldHVybjsKIAl9Ci0JY2FjaGVsaW5lX3NpemUgPSAxIDw8IGNjaS5wY2NpX2xpbmVfc2l6ZTsKLQlyZXR1cm4gY2FjaGVsaW5lX3NpemU7CisJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9ICgxIDw8IGNjaS5wY2NpX2xpbmVfc2l6ZSkgLyA0OwogfQogCi0vKioKLSAqIHBjaWJpb3NfcHJlcF9td2kgLSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRyaXZlcnMvcGNpL3BjaS5jOnBjaV9zZXRfbXdpKCkKLSAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlIGZvciB3aGljaCBNV0kgaXMgZW5hYmxlZAotICoKLSAqIEZvciBpYTY0LCB3ZSBjYW4gZ2V0IHRoZSBjYWNoZWxpbmUgc2l6ZXMgZnJvbSBQQUwuCi0gKgotICogUkVUVVJOUzogQW4gYXBwcm9wcmlhdGUgLUVSUk5PIGVycm9yIHZhbHVlIG9uIGVyb3IsIG9yIHplcm8gZm9yIHN1Y2Nlc3MuCi0gKi8KLWludAotcGNpYmlvc19wcmVwX213aSAoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZGVzaXJlZF9saW5lc2l6ZSwgY3VycmVudF9saW5lc2l6ZTsKLQlpbnQgcmMgPSAwOwotCXU4IHBjaV9saW5lc2l6ZTsKLQotCWRlc2lyZWRfbGluZXNpemUgPSBwY2lfY2FjaGVsaW5lX3NpemUoKTsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJnBjaV9saW5lc2l6ZSk7Ci0JY3VycmVudF9saW5lc2l6ZSA9IDQgKiBwY2lfbGluZXNpemU7Ci0JaWYgKGRlc2lyZWRfbGluZXNpemUgIT0gY3VycmVudF9saW5lc2l6ZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IHNsb3QgJXMgaGFzIGluY29ycmVjdCBQQ0kgY2FjaGUgbGluZSBzaXplIG9mICVsdSBieXRlcywiLAotCQkgICAgICAgcGNpX25hbWUoZGV2KSwgY3VycmVudF9saW5lc2l6ZSk7Ci0JCWlmIChjdXJyZW50X2xpbmVzaXplID4gZGVzaXJlZF9saW5lc2l6ZSkgewotCQkJcHJpbnRrKCIgZXhwZWN0ZWQgJWx1IGJ5dGVzIGluc3RlYWRcbiIsIGRlc2lyZWRfbGluZXNpemUpOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKCIgY29ycmVjdGluZyB0byAlbHVcbiIsIGRlc2lyZWRfbGluZXNpemUpOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgZGVzaXJlZF9saW5lc2l6ZSAvIDQpOwotCQl9Ci0JfQotCXJldHVybiByYzsKKwlzZXRfcGNpX2NhY2hlbGluZV9zaXplKCk7CisJcmV0dXJuIDA7CiB9CisKK3N1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMmQ3OGYzNC4uMGE1OTM3MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQvc24va2VybmVsL01ha2VmaWxlCkBAIC00LDEzICs0LDE0IEBACiAjIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICMgZm9yIG1vcmUgZGV0YWlscy4KICMKLSMgQ29weXJpZ2h0IChDKSAxOTk5LDIwMDEtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMS0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAKIENQUEZMQUdTICs9IC1JJChzcmN0cmVlKS9hcmNoL2lhNjQvc24vaW5jbHVkZQogCiBvYmoteQkJCQkrPSBzZXR1cC5vIGJ0ZS5vIGJ0ZV9lcnJvci5vIGlycS5vIG1jYS5vIGlkbGUubyBcCi0JCQkJICAgaHViZXJyb3IubyBpb19pbml0Lm8gaW9tdi5vIGtsY29uZmxpYi5vIHBpb19waHlzLm8gXAorCQkJCSAgIGh1YmVycm9yLm8gaW9fYWNwaV9pbml0Lm8gaW9fY29tbW9uLm8gXAorCQkJCSAgIGlvX2luaXQubyBpb212Lm8ga2xjb25mbGliLm8gcGlvX3BoeXMubyBcCiAJCQkJICAgc24yLwogb2JqLSQoQ09ORklHX0lBNjRfR0VORVJJQykgICAgICArPSBtYWNodmVjLm8KIG9iai0kKENPTkZJR19TR0lfVElPQ1gpCQkrPSB0aW9jeC5vCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2J0ZS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9idGUuYwppbmRleCA3ZjczYWQ0Li5mZjFjNTU2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2J0ZS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlLmMKQEAgLTM4MSwxNCArMzgxLDEzIEBACiAJCSAqIGJjb3B5IHRvIHRoZSBkZXN0aW5hdGlvbi4KIAkJICovCiAKLQkJLyogQWRkIHRoZSBsZWFkZXIgZnJvbSBzb3VyY2UgKi8KLQkJaGVhZEJ0ZUxlbiA9IGxlbiArIChzcmMgJiBMMV9DQUNIRV9NQVNLKTsKLQkJLyogQWRkIHRoZSB0cmFpbGluZyBieXRlcyBmcm9tIGZvb3Rlci4gKi8KLQkJaGVhZEJ0ZUxlbiArPSBMMV9DQUNIRV9CWVRFUyAtIChoZWFkQnRlTGVuICYgTDFfQ0FDSEVfTUFTSyk7Ci0JCWhlYWRCdGVTb3VyY2UgPSBzcmMgJiB+TDFfQ0FDSEVfTUFTSzsKIAkJaGVhZEJjb3B5U3JjT2Zmc2V0ID0gc3JjICYgTDFfQ0FDSEVfTUFTSzsKIAkJaGVhZEJjb3B5RGVzdCA9IGRlc3Q7CiAJCWhlYWRCY29weUxlbiA9IGxlbjsKKworCQloZWFkQnRlU291cmNlID0gc3JjIC0gaGVhZEJjb3B5U3JjT2Zmc2V0OworCQkvKiBBZGQgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGJ5dGVzIGZyb20gc291cmNlICovCisJCWhlYWRCdGVMZW4gPSBMMV9DQUNIRV9BTElHTihsZW4gKyBoZWFkQmNvcHlTcmNPZmZzZXQpOwogCX0KIAogCWlmIChoZWFkQmNvcHlMZW4gPiAwKSB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2FjcGlfaW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ3ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYwpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CisjaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisKKy8qCisgKiBUaGUgY29kZSBpbiB0aGlzIGZpbGUgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIHdoZW4gcnVubmluZyB3aXRoCisgKiBhIFBST00gdGhhdCBoYXMgQUNQSSBJTyBzdXBwb3J0LiAoaS5lLiwgU05fQUNQSV9CQVNFX1NVUFBPUlQoKSA9PSAxKQorICovCisKKworLyoKKyAqIFRoaXMgdmFsdWUgbXVzdCBtYXRjaCB0aGUgVVVJRCB0aGUgUFJPTSB1c2VzCisgKiAoaW8vYWNwaS9kZWZibGsuYykgd2hlbiBidWlsZGluZyBhIHZlbmRvciBkZXNjcmlwdG9yLgorICovCitzdHJ1Y3QgYWNwaV92ZW5kb3JfdXVpZCBzbl91dWlkID0geworCS5zdWJ0eXBlID0gMCwKKwkuZGF0YQk9IHsgMHgyYywgMHhjNiwgMHhhNiwgMHhmZSwgMHg5YywgMHg0NCwgMHhkYSwgMHgxMSwKKwkJICAgIDB4YTIsIDB4N2MsIDB4MDgsIDB4MDAsIDB4NjksIDB4MTMsIDB4ZWEsIDB4NTEgfSwKK307CisKKy8qCisgKiBQZXJmb3JtIHRoZSBlYXJseSBJTyBpbml0IGluIFBST00uCisgKi8KK3N0YXRpYyBzNjQKK3NhbF9pb2lmX2luaXQodTY0ICpyZXN1bHQpCit7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCBpc3J2ID0gezAsMCwwLDB9OworCisJU0FMX0NBTExfTk9MT0NLKGlzcnYsCisJCQlTTl9TQUxfSU9JRl9JTklULCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKwkqcmVzdWx0ID0gaXNydi52MDsKKwlyZXR1cm4gaXNydi5zdGF0dXM7Cit9CisKKy8qCisgKiBzbl9odWJkZXZfYWRkIC0gVGhlICdhZGQnIGZ1bmN0aW9uIG9mIHRoZSBhY3BpX3NuX2h1YmRldl9kcml2ZXIuCisgKgkJICAgQ2FsbGVkIGZvciBldmVyeSAiU0dJSFVCIiBvciAiU0dJVElPIiBkZXZpY2UgZGVmaW5lZAorICoJCSAgIGluIHRoZSBBQ1BJIG5hbWVzcGFjZS4KKyAqLworc3RhdGljIGludCBfX2luaXQKK3NuX2h1YmRldl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1NjQgYWRkcjsKKwlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldjsKKwlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldl9wdHI7CisJaW50IGk7CisJdTY0IG5hc2lkOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZTsKKwlpbnQgcmV0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yX3R5cGVkICp2ZW5kb3I7CisJZXh0ZXJuIHZvaWQgc25fY29tbW9uX2h1YmRldl9pbml0KHN0cnVjdCBodWJkZXZfaW5mbyAqKTsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZShkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCQkJICAmc25fdXVpZCwgJmJ1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInNuX2h1YmRldl9hZGQ6IGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZSgpIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICAgc3RhdHVzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmVzb3VyY2UgPSBidWZmZXIucG9pbnRlcjsKKwl2ZW5kb3IgPSAmcmVzb3VyY2UtPmRhdGEudmVuZG9yX3R5cGVkOworCWlmICgodmVuZG9yLT5ieXRlX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV92ZW5kb3JfdXVpZCkpICE9CisJICAgIHNpemVvZihzdHJ1Y3QgaHViZGV2X2luZm8gKikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAic25faHViZGV2X2FkZDogSW52YWxpZCB2ZW5kb3IgZGF0YSBsZW5ndGg6ICVkXG4iLAorCQkgICAgICAgIHZlbmRvci0+Ynl0ZV9sZW5ndGgpOworCQlyZXQgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCisJbWVtY3B5KCZhZGRyLCB2ZW5kb3ItPmJ5dGVfZGF0YSwgc2l6ZW9mKHN0cnVjdCBodWJkZXZfaW5mbyAqKSk7CisJaHViZGV2X3B0ciA9IF9fdmEoKHN0cnVjdCBodWJkZXZfaW5mbyAqKSBhZGRyKTsKKworCW5hc2lkID0gaHViZGV2X3B0ci0+aGRpX25hc2lkOworCWkgPSBuYXNpZF90b19jbm9kZWlkKG5hc2lkKTsKKwlodWJkZXYgPSAoc3RydWN0IGh1YmRldl9pbmZvICopKE5PREVQREEoaSktPnBkaW5mbyk7CisJKmh1YmRldiA9ICpodWJkZXZfcHRyOworCXNuX2NvbW1vbl9odWJkZXZfaW5pdChodWJkZXYpOworCitleGl0OgorCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc25fZ2V0X2J1c3NvZnRfcHRyKCkgLSBUaGUgcGNpYnVzX2J1c3NvZnQgcG9pbnRlciBpcyBmb3VuZCBpbgorICoJCQkgIHRoZSBBQ1BJIFZlbmRvciByZXNvdXJjZSBmb3IgdGhpcyBidXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKgorc25fZ2V0X2J1c3NvZnRfcHRyKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJdTY0IGFkZHI7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnRfcHRyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yX3R5cGVkICp2ZW5kb3I7CisKKworCWhhbmRsZSA9IFBDSV9DT05UUk9MTEVSKGJ1cyktPmFjcGlfaGFuZGxlOworCXN0YXR1cyA9IGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZShoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCisJCQkJCSAgJnNuX3V1aWQsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwcmludGsoS0VSTl9FUlIgImdldF9hY3BpX3BjaWJ1c19wdHI6ICIKKwkJICAgICAgICJnZXRfYWNwaV9idXNzb2Z0X2luZm8oKSBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgc3RhdHVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJlc291cmNlID0gYnVmZmVyLnBvaW50ZXI7CisJdmVuZG9yID0gJnJlc291cmNlLT5kYXRhLnZlbmRvcl90eXBlZDsKKworCWlmICgodmVuZG9yLT5ieXRlX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV92ZW5kb3JfdXVpZCkpICE9CisJICAgICBzaXplb2Yoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImdldF9hY3BpX2J1c3NvZnRfcHRyOiBJbnZhbGlkIHZlbmRvciBkYXRhICIKKwkJICAgICAgICJsZW5ndGggJWRcbiIsIHZlbmRvci0+Ynl0ZV9sZW5ndGgpOworCQlrZnJlZShidWZmZXIucG9pbnRlcik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1jcHkoJmFkZHIsIHZlbmRvci0+Ynl0ZV9kYXRhLCBzaXplb2Yoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopKTsKKwlwcm9tX2J1c3NvZnRfcHRyID0gX192YSgoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopIGFkZHIpOworCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKKworCXJldHVybiBwcm9tX2J1c3NvZnRfcHRyOworfQorCisvKgorICogc25fYWNwaV9idXNfZml4dXAKKyAqLwordm9pZAorc25fYWNwaV9idXNfZml4dXAoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnRfcHRyOworCWV4dGVybiB2b2lkIHNuX2NvbW1vbl9idXNfZml4dXAoc3RydWN0IHBjaV9idXMgKiwKKwkJCQkJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopOworCisJaWYgKCFidXMtPnBhcmVudCkgewkvKiBJZiByb290IGJ1cyAqLworCQlwcm9tX2J1c3NvZnRfcHRyID0gc25fZ2V0X2J1c3NvZnRfcHRyKGJ1cyk7CisJCWlmIChwcm9tX2J1c3NvZnRfcHRyID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJzbl9wY2lfZml4dXBfYnVzOiAweCUwNHg6MHglMDJ4IFVuYWJsZSB0byAiCisJCQkgICAgICAgIm9idGFpbiBwcm9tX2J1c3NvZnRfcHRyXG4iLAorCQkJICAgICAgIHBjaV9kb21haW5fbnIoYnVzKSwgYnVzLT5udW1iZXIpOworCQkJcmV0dXJuOworCQl9CisJCXNuX2NvbW1vbl9idXNfZml4dXAoYnVzLCBwcm9tX2J1c3NvZnRfcHRyKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwY2lfZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQlzbl9wY2lfZml4dXBfc2xvdChwY2lfZGV2KTsKKwl9Cit9CisKKy8qCisgKiBzbl9hY3BpX3Nsb3RfZml4dXAgLSBQZXJmb3JtIGFueSBTTiBzcGVjaWZpYyBzbG90IGZpeHVwLgorICoJCQlBdCBwcmVzZW50IHRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZQorICoJCQlhbnkgZ2VuZXJpYyB3YXkgdG8gaGFuZGxlIGEgUk9NIGltYWdlCisgKgkJCXRoYXQgaGFzIGJlZW4gc2hhZG93ZWQgYnkgdGhlIFBST00sIHNvCisgKgkJCXdlIHBhc3MgYSBwb2ludGVyIHRvIGl0CXdpdGhpbiB0aGUKKyAqCQkJcGNpZGV2X2luZm8gc3RydWN0dXJlLgorICovCisKK3ZvaWQKK3NuX2FjcGlfc2xvdF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvKQoreworCXZvaWQgX19pb21lbSAqYWRkcjsKKwlzaXplX3Qgc2l6ZTsKKworCWlmIChwY2lkZXZfaW5mby0+cGRpX3Bpb19tYXBwZWRfYWRkcltQQ0lfUk9NX1JFU09VUkNFXSkgeworCQkvKgorCQkgKiBBIHZhbGlkIFJPTSBpbWFnZSBleGlzdHMgYW5kIGhhcyBiZWVuIHNoYWRvd2VkIGJ5IHRoZQorCQkgKiBQUk9NLiBTZXR1cCB0aGUgcGNpX2RldiBST00gcmVzb3VyY2UgdG8gcG9pbnQgdG8KKwkJICogdGhlIHNoYWRvd2VkIGNvcHkuCisJCSAqLworCQlzaXplID0gZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5lbmQgLQorCQkJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQ7CisJCWFkZHIgPQorCQkgICAgIGlvcmVtYXAocGNpZGV2X2luZm8tPnBkaV9waW9fbWFwcGVkX2FkZHJbUENJX1JPTV9SRVNPVVJDRV0sCisJCQkgICAgIHNpemUpOworCQlkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CisJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZW5kID0KKwkJCQkJCSh1bnNpZ25lZCBsb25nKSBhZGRyICsgc2l6ZTsKKwkJZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5mbGFncyB8PSBJT1JFU09VUkNFX1JPTV9CSU9TX0NPUFk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfc25faHViZGV2X2RyaXZlciA9IHsKKwkubmFtZSA9ICJTR0kgSFVCREVWIERyaXZlciIsCisJLmlkcyA9ICJTR0lIVUIsU0dJVElPIiwKKwkub3BzID0geworCQkuYWRkID0gc25faHViZGV2X2FkZCwKKwkJfSwKK307CisKKworLyoKKyAqIHNuX2lvX2FjcGlfaW5pdCAtIFBST00gaGFzIEFDUEkgc3VwcG9ydCBmb3IgSU8sIGRlZmluaW5nIGF0IGEgbWluaW11bSB0aGUKKyAqCQkgICAgIG5vZGVzIGFuZCByb290IGJ1c2VzIGluIHRoZSBEU0RULiBBcyBhIHJlc3VsdCwgYnVzIHNjYW5uaW5nCisgKgkJICAgICB3aWxsIGJlIGluaXRpYXRlZCBieSB0aGUgTGludXggQUNQSSBjb2RlLgorICovCisKK3ZvaWQgX19pbml0Citzbl9pb19hY3BpX2luaXQodm9pZCkKK3sKKwl1NjQgcmVzdWx0OworCXM2NCBzdGF0dXM7CisKKwlhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfc25faHViZGV2X2RyaXZlcik7CisJc3RhdHVzID0gc2FsX2lvaWZfaW5pdCgmcmVzdWx0KTsKKwlpZiAoc3RhdHVzIHx8IHJlc3VsdCkKKwkJcGFuaWMoInNhbF9pb2lmX2luaXQgZmFpbGVkOiBbJWx4XSAlc1xuIiwKKwkJICAgICAgc3RhdHVzLCBpYTY0X3NhbF9zdHJlcnJvcihzdGF0dXMpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fY29tbW9uLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGQ4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9mZWF0dXJlX3NldHMuaD4KKyNpbmNsdWRlIDxhc20vc24vZ2VvLmg+CisjaW5jbHVkZSA8YXNtL3NuL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NuL2wxLmg+CisjaW5jbHVkZSA8YXNtL3NuL21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KKyNpbmNsdWRlIDxhc20vc24vc2ltdWxhdG9yLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgPGFzbS9zbi90aW9jYV9wcm92aWRlci5oPgorI2luY2x1ZGUgPGFzbS9zbi90aW9jZV9wcm92aWRlci5oPgorI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgorI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuMi9zbl9od3BlcmYuaD4KKyNpbmNsdWRlIDxhc20vc24vYWNwaS5oPgorCitleHRlcm4gdm9pZCBzbl9pbml0X2NwZWlfdGltZXIodm9pZCk7CitleHRlcm4gdm9pZCByZWdpc3Rlcl9zbl9wcm9jZnModm9pZCk7CitleHRlcm4gdm9pZCBzbl9hY3BpX2J1c19maXh1cChzdHJ1Y3QgcGNpX2J1cyAqKTsKK2V4dGVybiB2b2lkIHNuX2J1c19maXh1cChzdHJ1Y3QgcGNpX2J1cyAqKTsKK2V4dGVybiB2b2lkIHNuX2FjcGlfc2xvdF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3QgcGNpZGV2X2luZm8gKik7CitleHRlcm4gdm9pZCBzbl9tb3JlX3Nsb3RfZml4dXAoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHBjaWRldl9pbmZvICopOworZXh0ZXJuIHZvaWQgc25fbGVnYWN5X3BjaV93aW5kb3dfZml4dXAoc3RydWN0IHBjaV9jb250cm9sbGVyICosIHU2NCwgdTY0KTsKK2V4dGVybiB2b2lkIHNuX2lvX2FjcGlfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHNuX2lvX2luaXQodm9pZCk7CisKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc25fc3lzZGF0YV9saXN0OworCisvKiBzeXNkYXRhIGxpc3Qgc3RydWN0ICovCitzdHJ1Y3Qgc3lzZGF0YV9lbCB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwl2b2lkICpzeXNkYXRhOworfTsKKworaW50IHNuX2lvaWZfaW5pdGVkOwkJLyogU04gSS9PIGluZnJhc3RydWN0dXJlIGluaXRpYWxpemVkPyAqLworCitzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpzbl9wY2lfcHJvdmlkZXJbUENJSU9fQVNJQ19NQVhfVFlQRVNdOwkvKiBpbmRleGVkIGJ5IGFzaWMgdHlwZSAqLworCisvKgorICogSG9va3MgYW5kIHN0cnVjdCBmb3IgdW5zdXBwb3J0ZWQgcGNpIHByb3ZpZGVycworICovCisKK3N0YXRpYyBkbWFfYWRkcl90Citzbl9kZWZhdWx0X3BjaV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGxvbmcgcGFkZHIsIHNpemVfdCBzaXplLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NuX2RlZmF1bHRfcGNpX3VubWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkbWFfYWRkcl90IGFkZHIsIGludCBkaXJlY3Rpb24pCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCAqCitzbl9kZWZhdWx0X3BjaV9idXNfZml4dXAoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpzb2Z0LCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyIHNuX3BjaV9kZWZhdWx0X3Byb3ZpZGVyID0geworCS5kbWFfbWFwID0gc25fZGVmYXVsdF9wY2lfbWFwLAorCS5kbWFfbWFwX2NvbnNpc3RlbnQgPSBzbl9kZWZhdWx0X3BjaV9tYXAsCisJLmRtYV91bm1hcCA9IHNuX2RlZmF1bHRfcGNpX3VubWFwLAorCS5idXNfZml4dXAgPSBzbl9kZWZhdWx0X3BjaV9idXNfZml4dXAsCit9OworCisvKgorICogUmV0cmlldmUgdGhlIERNQSBGbHVzaCBMaXN0IGdpdmVuIG5hc2lkLCB3aWRnZXQsIGFuZCBkZXZpY2UuCisgKiBUaGlzIGxpc3QgaXMgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgV0FSIC0gRmx1c2ggRE1BIGRhdGEgb24gUElPIFJlYWRzLgorICovCitzdGF0aWMgaW5saW5lIHU2NAorc2FsX2dldF9kZXZpY2VfZG1hZmx1c2hfbGlzdCh1NjQgbmFzaWQsIHU2NCB3aWRnZXRfbnVtLCB1NjQgZGV2aWNlX251bSwKKwkJCSAgICAgdTY0IGFkZHJlc3MpCit7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CisJcmV0X3N0dWZmLnN0YXR1cyA9IDA7CisJcmV0X3N0dWZmLnYwID0gMDsKKworCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsCisJCQkodTY0KSBTTl9TQUxfSU9JRl9HRVRfREVWSUNFX0RNQUZMVVNIX0xJU1QsCisJCQkodTY0KSBuYXNpZCwgKHU2NCkgd2lkZ2V0X251bSwKKwkJCSh1NjQpIGRldmljZV9udW0sICh1NjQpIGFkZHJlc3MsIDAsIDAsIDApOworCXJldHVybiByZXRfc3R1ZmYuc3RhdHVzOworfQorCisvKgorICogUmV0cmlldmUgdGhlIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gZ2l2ZW4gdGhlIGJ1cyBhbmQgZGV2aWNlfGZ1bmN0aW9uIG51bWJlci4KKyAqLworc3RhdGljIGlubGluZSB1NjQKK3NhbF9nZXRfcGNpZGV2X2luZm8odTY0IHNlZ21lbnQsIHU2NCBidXNfbnVtYmVyLCB1NjQgZGV2Zm4sIHU2NCBwY2lfZGV2LAorCQkgICAgdTY0IHNuX2lycV9pbmZvKQoreworCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOworCXJldF9zdHVmZi5zdGF0dXMgPSAwOworCXJldF9zdHVmZi52MCA9IDA7CisKKwlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLAorCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX1BDSURFVl9JTkZPLAorCQkJKHU2NCkgc2VnbWVudCwgKHU2NCkgYnVzX251bWJlciwgKHU2NCkgZGV2Zm4sCisJCQkodTY0KSBwY2lfZGV2LAorCQkJc25faXJxX2luZm8sIDAsIDApOworCXJldHVybiByZXRfc3R1ZmYudjA7Cit9CisKKy8qCisgKiBzbl9wY2lkZXZfaW5mb19nZXQoKSAtIFJldHJpZXZlIHRoZSBwY2lkZXZfaW5mbyBzdHJ1Y3QgZm9yIHRoZSBzcGVjaWZpZWQKKyAqCQkJICBkZXZpY2UuCisgKi8KK2lubGluZSBzdHJ1Y3QgcGNpZGV2X2luZm8gKgorc25fcGNpZGV2X2luZm9fZ2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjaWRldiwKKwkJCSAgICAmKFNOX1BMQVRGT1JNX0RBVEEoZGV2KS0+cGNpZGV2X2luZm8pLCBwZGlfbGlzdCkgeworCQlpZiAocGNpZGV2LT5wZGlfbGludXhfcGNpZGV2ID09IGRldikKKwkJCXJldHVybiBwY2lkZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBPbGRlciBQUk9NIGZsdXNoIFdBUgorICoKKyAqIDAxLzE2LzA2IC0tIFRoaXMgd2FyIHdpbGwgYmUgaW4gcGxhY2UgdW50aWwgYSBuZXcgb2ZmaWNpYWwgUFJPTSBpcyByZWxlYXNlZC4KKyAqIEFkZGl0aW9uYWxseSBub3RlIHRoYXQgdGhlIHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfd2FyIGFsc28gaGFzIHRvIGJlCisgKiByZW1vdmVkIGZyb20gYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsvaHViZGV2LmgKKyAqLworc3RhdGljIHU4IHdhcl9pbXBsZW1lbnRlZCA9IDA7CisKK3N0YXRpYyBzNjQgc25fZGV2aWNlX2ZpeHVwX3dhcih1NjQgbmFzaWQsIHU2NCB3aWRnZXQsIGludCBkZXZpY2UsCisJCQkgICAgICAgc3RydWN0IHNuX2ZsdXNoX2RldmljZV9jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX3dhciAqd2FyX2xpc3Q7CisJc3RydWN0IHNuX2ZsdXNoX2RldmljZV93YXIgKmRldl9lbnRyeTsKKwlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIGlzcnYgPSB7MCwwLDAsMH07CisKKwlpZiAoIXdhcl9pbXBsZW1lbnRlZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQUk9NIHZlcnNpb24gPCA0LjUwIC0tIGltcGxlbWVudGluZyBvbGQgIgorCQkgICAgICAgIlBST00gZmx1c2ggV0FSXG4iKTsKKwkJd2FyX2ltcGxlbWVudGVkID0gMTsKKwl9CisKKwl3YXJfbGlzdCA9IGt6YWxsb2MoREVWX1BFUl9XSURHRVQgKiBzaXplb2YoKndhcl9saXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3YXJfbGlzdCkKKwkJQlVHKCk7CisKKwlTQUxfQ0FMTF9OT0xPQ0soaXNydiwgU05fU0FMX0lPSUZfR0VUX1dJREdFVF9ETUFGTFVTSF9MSVNULAorCQkJbmFzaWQsIHdpZGdldCwgX19wYSh3YXJfbGlzdCksIDAsIDAsIDAgLDApOworCWlmIChpc3J2LnN0YXR1cykKKwkJcGFuaWMoInNuX2RldmljZV9maXh1cF93YXIgZmFpbGVkOiAlc1xuIiwKKwkJICAgICAgaWE2NF9zYWxfc3RyZXJyb3IoaXNydi5zdGF0dXMpKTsKKworCWRldl9lbnRyeSA9IHdhcl9saXN0ICsgZGV2aWNlOworCW1lbWNweShjb21tb24sZGV2X2VudHJ5LCBzaXplb2YoKmNvbW1vbikpOworCWtmcmVlKHdhcl9saXN0KTsKKworCXJldHVybiBpc3J2LnN0YXR1czsKK30KKworLyoKKyAqIHNuX2NvbW1vbl9odWJkZXZfaW5pdCgpIC0gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBIVUIgZGF0YQorICoJCQkgICAgIHN0cnVjdHVyZSBmb3IgZWFjaCBub2RlIGluIHRoZSBzeXN0ZW0uCisgKi8KK3ZvaWQgX19pbml0Citzbl9jb21tb25faHViZGV2X2luaXQoc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXYpCit7CisKKwlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqc25fZmx1c2hfZGV2aWNlX2tlcm5lbDsKKwlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqZGV2X2VudHJ5OworCXM2NCBzdGF0dXM7CisJaW50IHdpZGdldCwgZGV2aWNlLCBzaXplOworCisJLyogQXR0YWNoIHRoZSBlcnJvciBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KKwlpZiAoaHViZGV2LT5oZGlfbmFzaWQgJiAxKQkvKiBJZiBUSU8gKi8KKwkJaWNlX2Vycm9yX2luaXQoaHViZGV2KTsKKwllbHNlCisJCWh1Yl9lcnJvcl9pbml0KGh1YmRldik7CisKKwlmb3IgKHdpZGdldCA9IDA7IHdpZGdldCA8PSBIVUJfV0lER0VUX0lEX01BWDsgd2lkZ2V0KyspCisJCWh1YmRldi0+aGRpX3h3aWRnZXRfaW5mb1t3aWRnZXRdLnh3aV9odWJpbmZvID0gaHViZGV2OworCisJaWYgKCFodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wKQorCQlyZXR1cm47CisKKwlzaXplID0gKEhVQl9XSURHRVRfSURfTUFYICsgMSkgKgorCQlzaXplb2Yoc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKik7CisJaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCA9CisJCWt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wKQorCQlCVUcoKTsKKworCWZvciAod2lkZ2V0ID0gMDsgd2lkZ2V0IDw9IEhVQl9XSURHRVRfSURfTUFYOyB3aWRnZXQrKykgeworCQlzaXplID0gREVWX1BFUl9XSURHRVQgKgorCQkJc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsKTsKKwkJc25fZmx1c2hfZGV2aWNlX2tlcm5lbCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc25fZmx1c2hfZGV2aWNlX2tlcm5lbCkKKwkJCUJVRygpOworCisJCWRldl9lbnRyeSA9IHNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CisJCWZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgREVWX1BFUl9XSURHRVQ7CisJCSAgICAgZGV2aWNlKyssIGRldl9lbnRyeSsrKSB7CisJCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfY29tbW9uKTsKKwkJCWRldl9lbnRyeS0+Y29tbW9uID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghZGV2X2VudHJ5LT5jb21tb24pCisJCQkJQlVHKCk7CisJCQlpZiAoc25fcHJvbV9mZWF0dXJlX2F2YWlsYWJsZShQUkZfREVWSUNFX0ZMVVNIX0xJU1QpKQorCQkJCXN0YXR1cyA9IHNhbF9nZXRfZGV2aWNlX2RtYWZsdXNoX2xpc3QoCisJCQkJCSAgICAgaHViZGV2LT5oZGlfbmFzaWQsIHdpZGdldCwgZGV2aWNlLAorCQkJCQkgICAgICh1NjQpKGRldl9lbnRyeS0+Y29tbW9uKSk7CisJCQllbHNlCisJCQkJc3RhdHVzID0gc25fZGV2aWNlX2ZpeHVwX3dhcihodWJkZXYtPmhkaV9uYXNpZCwKKwkJCQkJCQkgICAgIHdpZGdldCwgZGV2aWNlLAorCQkJCQkJCSAgICAgZGV2X2VudHJ5LT5jb21tb24pOworCQkJaWYgKHN0YXR1cyAhPSBTQUxSRVRfT0spCisJCQkJcGFuaWMoIlNBTCBjYWxsIGZhaWxlZDogJXNcbiIsCisJCQkJICAgICAgaWE2NF9zYWxfc3RyZXJyb3Ioc3RhdHVzKSk7CisKKwkJCXNwaW5fbG9ja19pbml0KCZkZXZfZW50cnktPnNmZGxfZmx1c2hfbG9jayk7CisJCX0KKworCQlpZiAoc25fZmx1c2hfZGV2aWNlX2tlcm5lbCkKKwkJCWh1YmRldi0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3Bbd2lkZ2V0XSA9CisJCQkJCQkJIHNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CisJfQorfQorCit2b2lkIHNuX3BjaV91bmZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqaG9zdF9wY2lfZGV2ID0gU05fUENJREVWX0lORk8oZGV2KS0+aG9zdF9wY2lfZGV2OworCisJc25faXJxX3VuZml4dXAoZGV2KTsKKwlwY2lfZGV2X3B1dChob3N0X3BjaV9kZXYpOworCXBjaV9kZXZfcHV0KGRldik7Cit9CisKKy8qCisgKiBzbl9wY2lfZml4dXBfc2xvdCgpIC0gVGhpcyByb3V0aW5lIHNldHMgdXAgYSBzbG90J3MgcmVzb3VyY2VzIGNvbnNpc3RlbnQKKyAqCQkJIHdpdGggdGhlIExpbnV4IFBDSSBhYnN0cmFjdGlvbiBsYXllci4gUmVzb3VyY2VzCisgKgkJCSBhY3F1aXJlZCBmcm9tIG91ciBQQ0kgcHJvdmlkZXIgaW5jbHVkZSBQSU8gbWFwcworICoJCQkgdG8gQkFSIHNwYWNlIGFuZCBpbnRlcnJ1cHQgb2JqZWN0cy4KKyAqLwordm9pZCBzbl9wY2lfZml4dXBfc2xvdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBzZWdtZW50ID0gcGNpX2RvbWFpbl9ucihkZXYtPmJ1cyk7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpiczsKKyAJc3RydWN0IHBjaV9idXMgKmhvc3RfcGNpX2J1czsKKyAJc3RydWN0IHBjaV9kZXYgKmhvc3RfcGNpX2RldjsKKwlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvOworIAlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvOworIAl1bnNpZ25lZCBpbnQgYnVzX25vLCBkZXZmbjsKKworCXBjaV9kZXZfZ2V0KGRldik7IC8qIGZvciB0aGUgc3lzZGF0YSBwb2ludGVyICovCisJcGNpZGV2X2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjaWRldl9pbmZvKQorCQlCVUcoKTsJCS8qIENhbm5vdCBhZmZvcmQgdG8gcnVuIG91dCBvZiBtZW1vcnkgKi8KKworCXNuX2lycV9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbl9pcnFfaW5mbykKKwkJQlVHKCk7CQkvKiBDYW5ub3QgYWZmb3JkIHRvIHJ1biBvdXQgb2YgbWVtb3J5ICovCisKKwkvKiBDYWxsIHRvIHJldHJpZXZlIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IGtlcm5lbC4gKi8KKwlzdGF0dXMgPSBzYWxfZ2V0X3BjaWRldl9pbmZvKCh1NjQpIHNlZ21lbnQsICh1NjQpIGRldi0+YnVzLT5udW1iZXIsCisJCQkJICAgICBkZXYtPmRldmZuLAorCQkJCSAgICAgKHU2NCkgX19wYShwY2lkZXZfaW5mbyksCisJCQkJICAgICAodTY0KSBfX3BhKHNuX2lycV9pbmZvKSk7CisJaWYgKHN0YXR1cykKKwkJQlVHKCk7IC8qIENhbm5vdCBnZXQgcGxhdGZvcm0gcGNpIGRldmljZSBpbmZvcm1hdGlvbiAqLworCisJLyogQWRkIHBjaWRldl9pbmZvIHRvIGxpc3QgaW4gcGNpX2NvbnRyb2xsZXIucGxhdGZvcm1fZGF0YSAqLworCWxpc3RfYWRkX3RhaWwoJnBjaWRldl9pbmZvLT5wZGlfbGlzdCwKKwkJICAgICAgJihTTl9QTEFURk9STV9EQVRBKGRldi0+YnVzKS0+cGNpZGV2X2luZm8pKTsKKworCWlmIChTTl9BQ1BJX0JBU0VfU1VQUE9SVCgpKQorCQlzbl9hY3BpX3Nsb3RfZml4dXAoZGV2LCBwY2lkZXZfaW5mbyk7CisJZWxzZQorCQlzbl9tb3JlX3Nsb3RfZml4dXAoZGV2LCBwY2lkZXZfaW5mbyk7CisJLyoKKwkgKiBVc2luZyB0aGUgUFJPTXMgdmFsdWVzIGZvciB0aGUgUENJIGhvc3QgYnVzLCBnZXQgdGhlIExpbnV4CisgCSAqIFBDSSBob3N0X3BjaV9kZXYgc3RydWN0IGFuZCBzZXQgdXAgaG9zdCBidXMgbGlua2FnZXMKKyAJICovCisKKwlidXNfbm8gPSAocGNpZGV2X2luZm8tPnBkaV9zbG90X2hvc3RfaGFuZGxlID4+IDMyKSAmIDB4ZmY7CisJZGV2Zm4gPSBwY2lkZXZfaW5mby0+cGRpX3Nsb3RfaG9zdF9oYW5kbGUgJiAweGZmZmZmZmZmOworIAlob3N0X3BjaV9idXMgPSBwY2lfZmluZF9idXMoc2VnbWVudCwgYnVzX25vKTsKKyAJaG9zdF9wY2lfZGV2ID0gcGNpX2dldF9zbG90KGhvc3RfcGNpX2J1cywgZGV2Zm4pOworCisJcGNpZGV2X2luZm8tPmhvc3RfcGNpX2RldiA9IGhvc3RfcGNpX2RldjsKKwlwY2lkZXZfaW5mby0+cGRpX2xpbnV4X3BjaWRldiA9IGRldjsKKwlwY2lkZXZfaW5mby0+cGRpX2hvc3RfcGNpZGV2X2luZm8gPSBTTl9QQ0lERVZfSU5GTyhob3N0X3BjaV9kZXYpOworCWJzID0gU05fUENJQlVTX0JVU1NPRlQoZGV2LT5idXMpOworCXBjaWRldl9pbmZvLT5wZGlfcGNpYnVzX2luZm8gPSBiczsKKworCWlmIChicyAmJiBicy0+YnNfYXNpY190eXBlIDwgUENJSU9fQVNJQ19NQVhfVFlQRVMpIHsKKwkJU05fUENJREVWX0JVU1BST1ZJREVSKGRldikgPSBzbl9wY2lfcHJvdmlkZXJbYnMtPmJzX2FzaWNfdHlwZV07CisJfSBlbHNlIHsKKwkJU05fUENJREVWX0JVU1BST1ZJREVSKGRldikgPSAmc25fcGNpX2RlZmF1bHRfcHJvdmlkZXI7CisJfQorCisJLyogT25seSBzZXQgdXAgSVJRIHN0dWZmIGlmIHRoaXMgZGV2aWNlIGhhcyBhIGhvc3QgYnVzIGNvbnRleHQgKi8KKwlpZiAoYnMgJiYgc25faXJxX2luZm8tPmlycV9pcnEpIHsKKwkJcGNpZGV2X2luZm8tPnBkaV9zbl9pcnFfaW5mbyA9IHNuX2lycV9pbmZvOworCQlkZXYtPmlycSA9IHBjaWRldl9pbmZvLT5wZGlfc25faXJxX2luZm8tPmlycV9pcnE7CisJCXNuX2lycV9maXh1cChkZXYsIHNuX2lycV9pbmZvKTsKKwl9IGVsc2UgeworCQlwY2lkZXZfaW5mby0+cGRpX3NuX2lycV9pbmZvID0gTlVMTDsKKwkJa2ZyZWUoc25faXJxX2luZm8pOworCX0KK30KKworLyoKKyAqIHNuX2NvbW1vbl9idXNfZml4dXAgLSBQZXJmb3JtIHBsYXRmb3JtIHNwZWNpZmljIGJ1cyBmaXh1cC4KKyAqCQkJIEV4ZWN1dGUgdGhlIEFTSUMgc3BlY2lmaWMgZml4dXAgcm91dGluZQorICoJCQkgZm9yIHRoaXMgYnVzLgorICovCit2b2lkCitzbl9jb21tb25fYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICpidXMsCisJCSAgICBzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKnByb21fYnVzc29mdF9wdHIpCit7CisJaW50IGNub2RlOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlcjsKKwlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldl9pbmZvOworCWludCBuYXNpZDsKKwl2b2lkICpwcm92aWRlcl9zb2Z0OworCXN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnByb3ZpZGVyOworCXN0cnVjdCBzbl9wbGF0Zm9ybV9kYXRhICpzbl9wbGF0Zm9ybV9kYXRhOworCisJY29udHJvbGxlciA9IFBDSV9DT05UUk9MTEVSKGJ1cyk7CisJLyoKKwkgKiBQZXItcHJvdmlkZXIgZml4dXAuICBDb3BpZXMgdGhlIGJ1cyBzb2Z0IHN0cnVjdHVyZSBmcm9tIHByb20KKwkgKiB0byBsb2NhbCBhcmVhIGFuZCBsaW5rcyBTTl9QQ0lCVVNfQlVTU09GVCgpLgorCSAqLworCisJaWYgKHByb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZSA+PSBQQ0lJT19BU0lDX01BWF9UWVBFUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzbl9jb21tb25fYnVzX2ZpeHVwOiBVbnN1cHBvcnRlZCBhc2ljIHR5cGUsICVkIiwKKwkJICAgICAgIHByb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9QUEIpCisJCXJldHVybjsJLyogbm8gZnVydGhlciBmaXh1cCBuZWNlc3NhcnkgKi8KKworCXByb3ZpZGVyID0gc25fcGNpX3Byb3ZpZGVyW3Byb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZV07CisJaWYgKHByb3ZpZGVyID09IE5VTEwpCisJCXBhbmljKCJzbl9jb21tb25fYnVzX2ZpeHVwOiBObyBwcm92aWRlciByZWdpc3RlcmVkIGZvciB0aGlzIGFzaWMgdHlwZSwgJWQiLAorCQkgICAgICBwcm9tX2J1c3NvZnRfcHRyLT5ic19hc2ljX3R5cGUpOworCisJaWYgKHByb3ZpZGVyLT5idXNfZml4dXApCisJCXByb3ZpZGVyX3NvZnQgPSAoKnByb3ZpZGVyLT5idXNfZml4dXApIChwcm9tX2J1c3NvZnRfcHRyLAorCQkJCSBjb250cm9sbGVyKTsKKwllbHNlCisJCXByb3ZpZGVyX3NvZnQgPSBOVUxMOworCisJLyoKKwkgKiBHZW5lcmljIGJ1cyBmaXh1cCBnb2VzIGhlcmUuICBEb24ndCByZWZlcmVuY2UgcHJvbV9idXNzb2Z0X3B0cgorCSAqIGFmdGVyIHRoaXMgcG9pbnQuCisJICovCisJY29udHJvbGxlci0+cGxhdGZvcm1fZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9wbGF0Zm9ybV9kYXRhKSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmIChjb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhID09IE5VTEwpCisJCUJVRygpOworCXNuX3BsYXRmb3JtX2RhdGEgPQorCQkJKHN0cnVjdCBzbl9wbGF0Zm9ybV9kYXRhICopIGNvbnRyb2xsZXItPnBsYXRmb3JtX2RhdGE7CisJc25fcGxhdGZvcm1fZGF0YS0+cHJvdmlkZXJfc29mdCA9IHByb3ZpZGVyX3NvZnQ7CisJSU5JVF9MSVNUX0hFQUQoJigoc3RydWN0IHNuX3BsYXRmb3JtX2RhdGEgKikKKwkJCSBjb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhKS0+cGNpZGV2X2luZm8pOworCW5hc2lkID0gTkFTSURfR0VUKFNOX1BDSUJVU19CVVNTT0ZUKGJ1cyktPmJzX2Jhc2UpOworCWNub2RlID0gbmFzaWRfdG9fY25vZGVpZChuYXNpZCk7CisJaHViZGV2X2luZm8gPSAoc3RydWN0IGh1YmRldl9pbmZvICopKE5PREVQREEoY25vZGUpLT5wZGluZm8pOworCVNOX1BDSUJVU19CVVNTT0ZUKGJ1cyktPmJzX3h3aWRnZXRfaW5mbyA9CisJICAgICYoaHViZGV2X2luZm8tPmhkaV94d2lkZ2V0X2luZm9bU05fUENJQlVTX0JVU1NPRlQoYnVzKS0+YnNfeGlkXSk7CisKKwkvKgorCSAqIElmIHRoZSBub2RlIGluZm9ybWF0aW9uIHdlIG9idGFpbmVkIGR1cmluZyB0aGUgZml4dXAgcGhhc2UgaXMKKwkgKiBpbnZhbGlkIHRoZW4gc2V0IGNvbnRyb2xsZXItPm5vZGUgdG8gLTEgKHVuZGV0ZXJtaW5lZCkKKwkgKi8KKwlpZiAoY29udHJvbGxlci0+bm9kZSA+PSBudW1fb25saW5lX25vZGVzKCkpIHsKKwkJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpiID0gU05fUENJQlVTX0JVU1NPRlQoYnVzKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZXZpY2UgQVNJQz0ldSBYSUQ9JXUgUEJVU05VTT0ldSIKKwkJICAgICAgICJMX0lPPSVseCBMX01FTT0lbHggQkFTRT0lbHhcbiIsCisJCSAgICAgICBiLT5ic19hc2ljX3R5cGUsIGItPmJzX3hpZCwgYi0+YnNfcGVyc2lzdF9idXNudW0sCisJCSAgICAgICBiLT5ic19sZWdhY3lfaW8sIGItPmJzX2xlZ2FjeV9tZW0sIGItPmJzX2Jhc2UpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvbiBub2RlICVkIGJ1dCBvbmx5ICVkIG5vZGVzIG9ubGluZS4iCisJCSAgICAgICAiQXNzb2NpYXRpb24gc2V0IHRvIHVuZGV0ZXJtaW5lZC5cbiIsCisJCSAgICAgICBjb250cm9sbGVyLT5ub2RlLCBudW1fb25saW5lX25vZGVzKCkpOworCQljb250cm9sbGVyLT5ub2RlID0gLTE7CisJfQorfQorCit2b2lkIHNuX2J1c19zdG9yZV9zeXNkYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHN5c2RhdGFfZWwgKmVsZW1lbnQ7CisKKwllbGVtZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN5c2RhdGFfZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZW1lbnQpIHsKKwkJZGV2X2RiZyhkZXYsICIlczogb3V0IG9mIG1lbW9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJZWxlbWVudC0+c3lzZGF0YSA9IFNOX1BDSURFVl9JTkZPKGRldik7CisJbGlzdF9hZGQoJmVsZW1lbnQtPmVudHJ5LCAmc25fc3lzZGF0YV9saXN0KTsKK30KKwordm9pZCBzbl9idXNfZnJlZV9zeXNkYXRhKHZvaWQpCit7CisJc3RydWN0IHN5c2RhdGFfZWwgKmVsZW1lbnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnNhZmU7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgc2FmZSwgJnNuX3N5c2RhdGFfbGlzdCkgeworCQllbGVtZW50ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc3lzZGF0YV9lbCwgZW50cnkpOworCQlsaXN0X2RlbCgmZWxlbWVudC0+ZW50cnkpOworCQlsaXN0X2RlbCgmKCgoc3RydWN0IHBjaWRldl9pbmZvICopCisJCQkgICAgIChlbGVtZW50LT5zeXNkYXRhKSktPnBkaV9saXN0KSk7CisJCWtmcmVlKGVsZW1lbnQtPnN5c2RhdGEpOworCQlrZnJlZShlbGVtZW50KTsKKwl9CisJcmV0dXJuOworfQorCisvKgorICogaHViZGV2X2luaXRfbm9kZSgpIC0gQ3JlYXRlcyB0aGUgSFVCIGRhdGEgc3RydWN0dXJlIGFuZCBsaW5rIHRoZW0gdG8gaXQncworICoJCQlvd24gTk9ERSBzcGVjaWZpYyBkYXRhIGFyZWEuCisgKi8KK3ZvaWQgaHViZGV2X2luaXRfbm9kZShub2RlcGRhX3QgKiBucGRhLCBjbm9kZWlkX3Qgbm9kZSkKK3sKKwlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldl9pbmZvOworCWludCBzaXplOworCXBnX2RhdGFfdCAqcGc7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBodWJkZXZfaW5mbyk7CisKKwlpZiAobm9kZSA+PSBudW1fb25saW5lX25vZGVzKCkpCS8qIEhlYWRsZXNzL21lbWxlc3MgSU8gbm9kZXMgKi8KKwkJcGcgPSBOT0RFX0RBVEEoMCk7CisJZWxzZQorCQlwZyA9IE5PREVfREFUQShub2RlKTsKKworCWh1YmRldl9pbmZvID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKWFsbG9jX2Jvb3RtZW1fbm9kZShwZywgc2l6ZSk7CisKKwlucGRhLT5wZGluZm8gPSAodm9pZCAqKWh1YmRldl9pbmZvOworfQorCitnZW9pZF90Citjbm9kZWlkX2dldF9nZW9pZChjbm9kZWlkX3QgY25vZGUpCit7CisJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXY7CisKKwlodWJkZXYgPSAoc3RydWN0IGh1YmRldl9pbmZvICopKE5PREVQREEoY25vZGUpLT5wZGluZm8pOworCXJldHVybiBodWJkZXYtPmhkaV9nZW9pZDsKK30KKwordm9pZCBzbl9nZW5lcmF0ZV9wYXRoKHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzLCBjaGFyICphZGRyZXNzKQoreworCW5hc2lkX3QgbmFzaWQ7CisJY25vZGVpZF90IGNub2RlOworCWdlb2lkX3QgZ2VvaWQ7CisJbW9kdWxlaWRfdCBtb2R1bGVpZDsKKwl1MTYgYnJpY2t0eXBlOworCisJbmFzaWQgPSBOQVNJRF9HRVQoU05fUENJQlVTX0JVU1NPRlQocGNpX2J1cyktPmJzX2Jhc2UpOworCWNub2RlID0gbmFzaWRfdG9fY25vZGVpZChuYXNpZCk7CisJZ2VvaWQgPSBjbm9kZWlkX2dldF9nZW9pZChjbm9kZSk7CisJbW9kdWxlaWQgPSBnZW9fbW9kdWxlKGdlb2lkKTsKKworCXNwcmludGYoYWRkcmVzcywgIm1vZHVsZV8lYyVjJWMlYyUuMmQiLAorCQknMCcrUkFDS19HRVRfQ0xBU1MoTU9EVUxFX0dFVF9SQUNLKG1vZHVsZWlkKSksCisJCScwJytSQUNLX0dFVF9HUk9VUChNT0RVTEVfR0VUX1JBQ0sobW9kdWxlaWQpKSwKKwkJJzAnK1JBQ0tfR0VUX05VTShNT0RVTEVfR0VUX1JBQ0sobW9kdWxlaWQpKSwKKwkJTU9EVUxFX0dFVF9CVENIQVIobW9kdWxlaWQpLCBNT0RVTEVfR0VUX0JQT1MobW9kdWxlaWQpKTsKKworCS8qIFRvbGxob3VzZSByZXF1aXJlcyBzbG90IGlkIHRvIGJlIGRpc3BsYXllZCAqLworCWJyaWNrdHlwZSA9IE1PRFVMRV9HRVRfQlRZUEUobW9kdWxlaWQpOworCWlmICgoYnJpY2t0eXBlID09IEwxX0JSSUNLVFlQRV8xOTEwMTApIHx8CisJICAgIChicmlja3R5cGUgPT0gTDFfQlJJQ0tUWVBFXzE5MzIpKQorCQkJc3ByaW50ZihhZGRyZXNzLCAiJXNeJWQiLCBhZGRyZXNzLCBnZW9fc2xvdChnZW9pZCkpOworfQorCisvKgorICogc25fcGNpX2ZpeHVwX2J1cygpIC0gUGVyZm9ybSBTTiBzcGVjaWZpYyBzZXR1cCBvZiBzb2Z0d2FyZSBzdHJ1Y3RzCisgKgkJCShwY2lidXNfYnVzc29mdCwgcGNpZGV2X2luZm8pIGFuZCBoYXJkd2FyZQorICoJCQlyZWdpc3RlcnMsIGZvciB0aGUgc3BlY2lmaWVkIGJ1cyBhbmQgZGV2aWNlcyB1bmRlciBpdC4KKyAqLwordm9pZCBfX2RldmluaXQKK3NuX3BjaV9maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKworCWlmIChTTl9BQ1BJX0JBU0VfU1VQUE9SVCgpKQorCQlzbl9hY3BpX2J1c19maXh1cChidXMpOworCWVsc2UKKwkJc25fYnVzX2ZpeHVwKGJ1cyk7Cit9CisKKy8qCisgKiBzbl9pb19lYXJseV9pbml0IC0gUGVyZm9ybSBlYXJseSBJTyAoYW5kIHNvbWUgbm9uLUlPKSBpbml0aWFsaXphdGlvbi4KKyAqCQkgICAgICBJbiBwYXJ0aWN1bGFyLCBzZXR1cCB0aGUgc25fcGNpX3Byb3ZpZGVyW10gYXJyYXkuCisgKgkJICAgICAgVGhpcyBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIGFueSBidXMgc2Nhbm5pbmcKKyAqCQkgICAgICAoYWNwaV9zY2FuX2luaXQoKSkgaW4gdGhlIEFDUEkgY2FzZSwgYXMgdGhlIFNOCisgKgkJICAgICAgYnVzIGZpeHVwIGNvZGUgd2lsbCByZWZlcmVuY2UgdGhlIGFycmF5LgorICovCitzdGF0aWMgaW50IF9faW5pdAorc25faW9fZWFybHlfaW5pdCh2b2lkKQoreworCWludCBpOworCisJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSB8fCBJU19SVU5OSU5HX09OX0ZBS0VfUFJPTSgpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogcHJpbWUgc25fcGNpX3Byb3ZpZGVyW10uICBJbmRpdmlkaWFsIHByb3ZpZGVyIGluaXQgcm91dGluZXMgd2lsbAorCSAqIG92ZXJyaWRlIHRoZWlyIHJlc3BlY3RpdmUgZGVmYXVsdCBlbnRyaWVzLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IFBDSUlPX0FTSUNfTUFYX1RZUEVTOyBpKyspCisJCXNuX3BjaV9wcm92aWRlcltpXSA9ICZzbl9wY2lfZGVmYXVsdF9wcm92aWRlcjsKKworCXBjaWJyX2luaXRfcHJvdmlkZXIoKTsKKwl0aW9jYV9pbml0X3Byb3ZpZGVyKCk7CisJdGlvY2VfaW5pdF9wcm92aWRlcigpOworCisJLyoKKwkgKiBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCBib3VuY2UgbGltaXQgY2hlY2tzIGluIHRoZSBibGsgbGF5ZXIKKwkgKi8KKwlpYTY0X21heF9pb21tdV9tZXJnZV9tYXNrID0gflBBR0VfTUFTSzsKKworCXNuX2lycV9saF9pbml0KCk7CisJSU5JVF9MSVNUX0hFQUQoJnNuX3N5c2RhdGFfbGlzdCk7CisJc25faW5pdF9jcGVpX3RpbWVyKCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlZ2lzdGVyX3NuX3Byb2NmcygpOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJBQ1BJICBEU0RUIE9FTSBSZXYgMHgleFxuIiwKKwkgICAgICAgYWNwaV9nYmxfRFNEVC0+b2VtX3JldmlzaW9uKTsKKwlpZiAoU05fQUNQSV9CQVNFX1NVUFBPUlQoKSkKKwkJc25faW9fYWNwaV9pbml0KCk7CisJZWxzZQorCQlzbl9pb19pbml0KCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoc25faW9fZWFybHlfaW5pdCk7CisKKy8qCisgKiBzbl9pb19sYXRlX2luaXQoKSAtIFBlcmZvcm0gYW55IGZpbmFsIHBsYXRmb3JtIHNwZWNpZmljIElPIGluaXRpYWxpemF0aW9uLgorICovCisKK2ludCBfX2luaXQKK3NuX2lvX2xhdGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpidXNzb2Z0OworCWNub2RlaWRfdCBjbm9kZTsKKwluYXNpZF90IG5hc2lkOworCWNub2RlaWRfdCBuZWFyX2Nub2RlOworCisJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSB8fCBJU19SVU5OSU5HX09OX0ZBS0VfUFJPTSgpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogU2V0dXAgY2xvc2VzdCBub2RlIGluIHBjaV9jb250cm9sbGVyLT5ub2RlIGZvcgorCSAqIFBJQywgVElPQ1AsIFRJT0NFIChUSU9DQSBkb2VzIGl0IGR1cmluZyBidXMgZml4dXAgdXNpbmcKKwkgKiBpbmZvIGZyb20gdGhlIFBST00pLgorCSAqLworCWJ1cyA9IE5VTEw7CisJd2hpbGUgKChidXMgPSBwY2lfZmluZF9uZXh0X2J1cyhidXMpKSAhPSBOVUxMKSB7CisJCWJ1c3NvZnQgPSBTTl9QQ0lCVVNfQlVTU09GVChidXMpOworCQluYXNpZCA9IE5BU0lEX0dFVChidXNzb2Z0LT5ic19iYXNlKTsKKwkJY25vZGUgPSBuYXNpZF90b19jbm9kZWlkKG5hc2lkKTsKKwkJaWYgKChidXNzb2Z0LT5ic19hc2ljX3R5cGUgPT0gUENJSU9fQVNJQ19UWVBFX1RJT0NQKSB8fAorCQkgICAgKGJ1c3NvZnQtPmJzX2FzaWNfdHlwZSA9PSBQQ0lJT19BU0lDX1RZUEVfVElPQ0UpKSB7CisJCQkvKiBUSU8gUENJIEJyaWRnZTogZmluZCBuZWFyZXN0IG5vZGUgd2l0aCBDUFVzICovCisJCQlpbnQgZSA9IHNuX2h3cGVyZl9nZXRfbmVhcmVzdF9ub2RlKGNub2RlLCBOVUxMLAorCQkJCQkJCSAgICZuZWFyX2Nub2RlKTsKKwkJCWlmIChlIDwgMCkgeworCQkJCW5lYXJfY25vZGUgPSAoY25vZGVpZF90KS0xOyAvKiB1c2UgYW55IG5vZGUgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2licl9idXNfZml4dXA6IGZhaWxlZCAiCisJCQkJICAgICAgICJ0byBmaW5kIG5lYXIgbm9kZSB3aXRoIENQVXMgdG8gVElPICIKKwkJCQkgICAgICAgIm5vZGUgJWQsIGVycj0lZFxuIiwgY25vZGUsIGUpOworCQkJfQorCQkJUENJX0NPTlRST0xMRVIoYnVzKS0+bm9kZSA9IG5lYXJfY25vZGU7CisJCX0gZWxzZSBpZiAoYnVzc29mdC0+YnNfYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9QSUMpIHsKKwkJCVBDSV9DT05UUk9MTEVSKGJ1cyktPm5vZGUgPSBjbm9kZTsKKwkJfQorCX0KKworCXNuX2lvaWZfaW5pdGVkID0gMTsJLyogU04gSS9PIGluZnJhc3RydWN0dXJlIG5vdyBpbml0aWFsaXplZCAqLworCisJcmV0dXJuIDA7Cit9CisKK2ZzX2luaXRjYWxsKHNuX2lvX2xhdGVfaW5pdCk7CisKK0VYUE9SVF9TWU1CT0woc25fcGNpX2ZpeHVwX3Nsb3QpOworRVhQT1JUX1NZTUJPTChzbl9wY2lfdW5maXh1cF9zbG90KTsKK0VYUE9SVF9TWU1CT0woc25fYnVzX3N0b3JlX3N5c2RhdGEpOworRVhQT1JUX1NZTUJPTChzbl9idXNfZnJlZV9zeXNkYXRhKTsKK0VYUE9SVF9TWU1CT0woc25fZ2VuZXJhdGVfcGF0aCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKaW5kZXggZGMwOWE2YS4uOWFkODQzZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKQEAgLTMsMTAzICszLDI4IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5MiAtIDE5OTcsIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgLSAxOTk3LCAyMDAwLTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KLSNpbmNsdWRlIDxhc20vc24vc25fZmVhdHVyZV9zZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3NuL2dlby5oPgogI2luY2x1ZGUgPGFzbS9zbi9pby5oPgotI2luY2x1ZGUgPGFzbS9zbi9sMS5oPgogI2luY2x1ZGUgPGFzbS9zbi9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhc20vc24vaW50ci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KLSNpbmNsdWRlIDxhc20vc24vc2ltdWxhdG9yLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgotI2luY2x1ZGUgPGFzbS9zbi90aW9jYV9wcm92aWRlci5oPgotI2luY2x1ZGUgPGFzbS9zbi90aW9jZV9wcm92aWRlci5oPgogI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgotI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKIAotCi1leHRlcm4gdm9pZCBzbl9pbml0X2NwZWlfdGltZXIodm9pZCk7Ci1leHRlcm4gdm9pZCByZWdpc3Rlcl9zbl9wcm9jZnModm9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNuX3N5c2RhdGFfbGlzdDsKLQotLyogc3lzZGF0YSBsaXN0IHN0cnVjdCAqLwotc3RydWN0IHN5c2RhdGFfZWwgewotCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7Ci0Jdm9pZCAqc3lzZGF0YTsKLX07Ci0KLXN0cnVjdCBzbGFiX2luZm8gewotCXN0cnVjdCBodWJkZXZfaW5mbyBodWJkZXY7Ci19OwotCi1zdHJ1Y3QgYnJpY2sgewotCW1vZHVsZWlkX3QgaWQ7CQkvKiBNb2R1bGUgSUQgb2YgdGhpcyBtb2R1bGUgICAgICAgICovCi0Jc3RydWN0IHNsYWJfaW5mbyBzbGFiX2luZm9bTUFYX1NMQUJTICsgMV07Ci19OwotCi1pbnQgc25faW9pZl9pbml0ZWQ7CQkvKiBTTiBJL08gaW5mcmFzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQ/ICovCi0KLXN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnNuX3BjaV9wcm92aWRlcltQQ0lJT19BU0lDX01BWF9UWVBFU107CS8qIGluZGV4ZWQgYnkgYXNpYyB0eXBlICovCisvKgorICogVGhlIGNvZGUgaW4gdGhpcyBmaWxlIHdpbGwgb25seSBiZSBleGVjdXRlZCB3aGVuIHJ1bm5pbmcgd2l0aAorICogYSBQUk9NIHRoYXQgZG9lcyBfbm90XyBoYXZlIGJhc2UgQUNQSSBJTyBzdXBwb3J0LgorICogKGkuZS4sIFNOX0FDUElfQkFTRV9TVVBQT1JUKCkgPT0gMCkKKyAqLwogCiBzdGF0aWMgaW50IG1heF9zZWdtZW50X251bWJlcjsJCSAvKiBEZWZhdWx0IGhpZ2hlc3Qgc2VnbWVudCBudW1iZXIgKi8KIHN0YXRpYyBpbnQgbWF4X3BjaWJ1c19udW1iZXIgPSAyNTU7CS8qIERlZmF1bHQgaGlnaGVzdCBwY2kgYnVzIG51bWJlciAqLwogCi0vKgotICogSG9va3MgYW5kIHN0cnVjdCBmb3IgdW5zdXBwb3J0ZWQgcGNpIHByb3ZpZGVycwotICovCi0KLXN0YXRpYyBkbWFfYWRkcl90Ci1zbl9kZWZhdWx0X3BjaV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGxvbmcgcGFkZHIsIHNpemVfdCBzaXplLCBpbnQgdHlwZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLXNuX2RlZmF1bHRfcGNpX3VubWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBkbWFfYWRkcl90IGFkZHIsIGludCBkaXJlY3Rpb24pCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCAqCi1zbl9kZWZhdWx0X3BjaV9idXNfZml4dXAoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpzb2Z0LCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyIHNuX3BjaV9kZWZhdWx0X3Byb3ZpZGVyID0gewotCS5kbWFfbWFwID0gc25fZGVmYXVsdF9wY2lfbWFwLAotCS5kbWFfbWFwX2NvbnNpc3RlbnQgPSBzbl9kZWZhdWx0X3BjaV9tYXAsCi0JLmRtYV91bm1hcCA9IHNuX2RlZmF1bHRfcGNpX3VubWFwLAotCS5idXNfZml4dXAgPSBzbl9kZWZhdWx0X3BjaV9idXNfZml4dXAsCi19OwotCi0vKgotICogUmV0cmlldmUgdGhlIERNQSBGbHVzaCBMaXN0IGdpdmVuIG5hc2lkLCB3aWRnZXQsIGFuZCBkZXZpY2UuCi0gKiBUaGlzIGxpc3QgaXMgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgV0FSIC0gRmx1c2ggRE1BIGRhdGEgb24gUElPIFJlYWRzLgotICovCi1zdGF0aWMgaW5saW5lIHU2NAotc2FsX2dldF9kZXZpY2VfZG1hZmx1c2hfbGlzdCh1NjQgbmFzaWQsIHU2NCB3aWRnZXRfbnVtLCB1NjQgZGV2aWNlX251bSwKLQkJCSAgICAgdTY0IGFkZHJlc3MpCi17Ci0Jc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7Ci0JcmV0X3N0dWZmLnN0YXR1cyA9IDA7Ci0JcmV0X3N0dWZmLnYwID0gMDsKLQotCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsCi0JCQkodTY0KSBTTl9TQUxfSU9JRl9HRVRfREVWSUNFX0RNQUZMVVNIX0xJU1QsCi0JCQkodTY0KSBuYXNpZCwgKHU2NCkgd2lkZ2V0X251bSwKLQkJCSh1NjQpIGRldmljZV9udW0sICh1NjQpIGFkZHJlc3MsIDAsIDAsIDApOwotCXJldHVybiByZXRfc3R1ZmYuc3RhdHVzOwotfQogCiAvKgogICogUmV0cmlldmUgdGhlIGh1YiBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBnaXZlbiBuYXNpZC4KQEAgLTEzMSw5MyArNTYsMjAgQEAKIAlyZXR1cm4gcmV0X3N0dWZmLnYwOwogfQogCi0vKgotICogUmV0cmlldmUgdGhlIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gZ2l2ZW4gdGhlIGJ1cyBhbmQgZGV2aWNlfGZ1bmN0aW9uIG51bWJlci4KLSAqLwotc3RhdGljIGlubGluZSB1NjQKLXNhbF9nZXRfcGNpZGV2X2luZm8odTY0IHNlZ21lbnQsIHU2NCBidXNfbnVtYmVyLCB1NjQgZGV2Zm4sIHU2NCBwY2lfZGV2LAotCQkgICAgdTY0IHNuX2lycV9pbmZvKQotewotCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOwotCXJldF9zdHVmZi5zdGF0dXMgPSAwOwotCXJldF9zdHVmZi52MCA9IDA7Ci0KLQlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLAotCQkJKHU2NCkgU05fU0FMX0lPSUZfR0VUX1BDSURFVl9JTkZPLAotCQkJKHU2NCkgc2VnbWVudCwgKHU2NCkgYnVzX251bWJlciwgKHU2NCkgZGV2Zm4sCi0JCQkodTY0KSBwY2lfZGV2LAotCQkJc25faXJxX2luZm8sIDAsIDApOwotCXJldHVybiByZXRfc3R1ZmYudjA7Ci19CiAKIC8qCi0gKiBzbl9wY2lkZXZfaW5mb19nZXQoKSAtIFJldHJpZXZlIHRoZSBwY2lkZXZfaW5mbyBzdHJ1Y3QgZm9yIHRoZSBzcGVjaWZpZWQKLSAqCQkJICBkZXZpY2UuCi0gKi8KLWlubGluZSBzdHJ1Y3QgcGNpZGV2X2luZm8gKgotc25fcGNpZGV2X2luZm9fZ2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXY7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjaWRldiwKLQkJCSAgICAmKFNOX1BDSV9DT05UUk9MTEVSKGRldiktPnBjaWRldl9pbmZvKSwgcGRpX2xpc3QpIHsKLQkJaWYgKHBjaWRldi0+cGRpX2xpbnV4X3BjaWRldiA9PSBkZXYpIHsKLQkJCXJldHVybiBwY2lkZXY7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIE9sZGVyIFBST00gZmx1c2ggV0FSCi0gKgotICogMDEvMTYvMDYgLS0gVGhpcyB3YXIgd2lsbCBiZSBpbiBwbGFjZSB1bnRpbCBhIG5ldyBvZmZpY2lhbCBQUk9NIGlzIHJlbGVhc2VkLgotICogQWRkaXRpb25hbGx5IG5vdGUgdGhhdCB0aGUgc3RydWN0IHNuX2ZsdXNoX2RldmljZV93YXIgYWxzbyBoYXMgdG8gYmUKLSAqIHJlbW92ZWQgZnJvbSBhcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaAotICovCi1zdGF0aWMgdTggd2FyX2ltcGxlbWVudGVkID0gMDsKLQotc3RhdGljIHM2NCBzbl9kZXZpY2VfZml4dXBfd2FyKHU2NCBuYXNpZCwgdTY0IHdpZGdldCwgaW50IGRldmljZSwKLQkJCSAgICAgICBzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2NvbW1vbiAqY29tbW9uKQotewotCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfd2FyICp3YXJfbGlzdDsKLQlzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX3dhciAqZGV2X2VudHJ5OwotCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgaXNydiA9IHswLDAsMCwwfTsKLQotCWlmICghd2FyX2ltcGxlbWVudGVkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlBST00gdmVyc2lvbiA8IDQuNTAgLS0gaW1wbGVtZW50aW5nIG9sZCAiCi0JCSAgICAgICAiUFJPTSBmbHVzaCBXQVJcbiIpOwotCQl3YXJfaW1wbGVtZW50ZWQgPSAxOwotCX0KLQotCXdhcl9saXN0ID0ga3phbGxvYyhERVZfUEVSX1dJREdFVCAqIHNpemVvZigqd2FyX2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdhcl9saXN0KQotCQlCVUcoKTsKLQotCVNBTF9DQUxMX05PTE9DSyhpc3J2LCBTTl9TQUxfSU9JRl9HRVRfV0lER0VUX0RNQUZMVVNIX0xJU1QsCi0JCQluYXNpZCwgd2lkZ2V0LCBfX3BhKHdhcl9saXN0KSwgMCwgMCwgMCAsMCk7Ci0JaWYgKGlzcnYuc3RhdHVzKQotCQlwYW5pYygic25fZGV2aWNlX2ZpeHVwX3dhciBmYWlsZWQ6ICVzXG4iLAotCQkgICAgICBpYTY0X3NhbF9zdHJlcnJvcihpc3J2LnN0YXR1cykpOwotCi0JZGV2X2VudHJ5ID0gd2FyX2xpc3QgKyBkZXZpY2U7Ci0JbWVtY3B5KGNvbW1vbixkZXZfZW50cnksIHNpemVvZigqY29tbW9uKSk7Ci0Ja2ZyZWUod2FyX2xpc3QpOwotCi0JcmV0dXJuIGlzcnYuc3RhdHVzOwotfQotCi0vKgotICogc25fZml4dXBfaW9ub2RlcygpIC0gVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBIVUIgZGF0YSBzdHJjdXR1cmUgZm9yCi0gKgllYWNoIG5vZGUgaW4gdGhlIHN5c3RlbS4KKyAqIHNuX2ZpeHVwX2lvbm9kZXMoKSAtIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgSFVCIGRhdGEgc3RydWN0dXJlIGZvcgorICoJCQllYWNoIG5vZGUgaW4gdGhlIHN5c3RlbS4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5CisgKgkJCWV4ZWN1dGVkIHdoZW4gcnVubmluZyB3aXRoIGEgbm9uLUFDUEkgY2FwYWJsZSBQUk9NLgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgc25fZml4dXBfaW9ub2Rlcyh2b2lkKQogewotCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICpzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOwotCXN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsICpkZXZfZW50cnk7CisKIAlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldjsKIAl1NjQgc3RhdHVzOwogCXU2NCBuYXNpZDsKLQlpbnQgaSwgd2lkZ2V0LCBkZXZpY2UsIHNpemU7CisJaW50IGk7CisJZXh0ZXJuIHZvaWQgc25fY29tbW9uX2h1YmRldl9pbml0KHN0cnVjdCBodWJkZXZfaW5mbyAqKTsKIAogCS8qCiAJICogR2V0IFNHSSBTcGVjaWZpYyBIVUIgY2hpcHNldCBpbmZvcm1hdGlvbi4KQEAgLTI0MCw3MCArOTIsNDcgQEAKIAkJCW1heF9zZWdtZW50X251bWJlciA9IGh1YmRldi0+bWF4X3NlZ21lbnRfbnVtYmVyOwogCQkJbWF4X3BjaWJ1c19udW1iZXIgPSBodWJkZXYtPm1heF9wY2lidXNfbnVtYmVyOwogCQl9Ci0KLQkJLyogQXR0YWNoIHRoZSBlcnJvciBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLQkJaWYgKG5hc2lkICYgMSkKLQkJCWljZV9lcnJvcl9pbml0KGh1YmRldik7Ci0JCWVsc2UKLQkJCWh1Yl9lcnJvcl9pbml0KGh1YmRldik7Ci0KLQkJZm9yICh3aWRnZXQgPSAwOyB3aWRnZXQgPD0gSFVCX1dJREdFVF9JRF9NQVg7IHdpZGdldCsrKQotCQkJaHViZGV2LT5oZGlfeHdpZGdldF9pbmZvW3dpZGdldF0ueHdpX2h1YmluZm8gPSBodWJkZXY7Ci0KLQkJaWYgKCFodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wKQotCQkJY29udGludWU7Ci0KLQkJc2l6ZSA9IChIVUJfV0lER0VUX0lEX01BWCArIDEpICoKLQkJCXNpemVvZihzdHJ1Y3Qgc25fZmx1c2hfZGV2aWNlX2tlcm5lbCAqKTsKLQkJaHViZGV2LT5oZGlfZmx1c2hfbmFzaWRfbGlzdC53aWRnZXRfcCA9Ci0JCQlremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIWh1YmRldi0+aGRpX2ZsdXNoX25hc2lkX2xpc3Qud2lkZ2V0X3ApCi0JCQlCVUcoKTsKLQotCQlmb3IgKHdpZGdldCA9IDA7IHdpZGdldCA8PSBIVUJfV0lER0VUX0lEX01BWDsgd2lkZ2V0KyspIHsKLQkJCXNpemUgPSBERVZfUEVSX1dJREdFVCAqCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsKTsKLQkJCXNuX2ZsdXNoX2RldmljZV9rZXJuZWwgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFzbl9mbHVzaF9kZXZpY2Vfa2VybmVsKQotCQkJCUJVRygpOwotCi0JCQlkZXZfZW50cnkgPSBzbl9mbHVzaF9kZXZpY2Vfa2VybmVsOwotCQkJZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBERVZfUEVSX1dJREdFVDsKLQkJCSAgICAgZGV2aWNlKyssZGV2X2VudHJ5KyspIHsKLQkJCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBzbl9mbHVzaF9kZXZpY2VfY29tbW9uKTsKLQkJCQlkZXZfZW50cnktPmNvbW1vbiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKCFkZXZfZW50cnktPmNvbW1vbikKLQkJCQkJQlVHKCk7Ci0KLQkJCQlpZiAoc25fcHJvbV9mZWF0dXJlX2F2YWlsYWJsZSgKLQkJCQkJCSAgICAgICBQUkZfREVWSUNFX0ZMVVNIX0xJU1QpKQotCQkJCQlzdGF0dXMgPSBzYWxfZ2V0X2RldmljZV9kbWFmbHVzaF9saXN0KAotCQkJCQkJICAgICBuYXNpZCwgd2lkZ2V0LCBkZXZpY2UsCi0JCQkJCQkgICAgICh1NjQpKGRldl9lbnRyeS0+Y29tbW9uKSk7Ci0JCQkJZWxzZQotCQkJCQlzdGF0dXMgPSBzbl9kZXZpY2VfZml4dXBfd2FyKG5hc2lkLAotCQkJCQkJICAgICB3aWRnZXQsIGRldmljZSwKLQkJCQkJCSAgICAgZGV2X2VudHJ5LT5jb21tb24pOwotCQkJCWlmIChzdGF0dXMgIT0gU0FMUkVUX09LKQotCQkJCQlwYW5pYygiU0FMIGNhbGwgZmFpbGVkOiAlc1xuIiwKLQkJCQkJICAgICAgaWE2NF9zYWxfc3RyZXJyb3Ioc3RhdHVzKSk7Ci0KLQkJCQlzcGluX2xvY2tfaW5pdCgmZGV2X2VudHJ5LT5zZmRsX2ZsdXNoX2xvY2spOwotCQkJfQotCi0JCQlpZiAoc25fZmx1c2hfZGV2aWNlX2tlcm5lbCkKLQkJCQlodWJkZXYtPmhkaV9mbHVzaF9uYXNpZF9saXN0LndpZGdldF9wW3dpZGdldF0gPQotCQkJCQkJICAgICAgIHNuX2ZsdXNoX2RldmljZV9rZXJuZWw7Ci0JICAgICAgICB9CisJCXNuX2NvbW1vbl9odWJkZXZfaW5pdChodWJkZXYpOwogCX0KIH0KIAogLyoKKyAqIHNuX3BjaV9sZWdhY3lfd2luZG93X2ZpeHVwIC0gQ3JlYXRlIFBDSSBjb250cm9sbGVyIHdpbmRvd3MgZm9yCisgKgkJCQlsZWdhY3kgSU8gYW5kIE1FTSBzcGFjZS4gVGhpcyBuZWVkcyB0bworICoJCQkJYmUgZG9uZSBoZXJlLCBhcyB0aGUgUFJPTSBkb2VzIG5vdCBoYXZlCisgKgkJCQlBQ1BJIHN1cHBvcnQgZGVmaW5pbmcgdGhlIHJvb3QgYnVzZXMKKyAqCQkJCWFuZCB0aGVpciByZXNvdXJjZXMgKF9DUlMpLAorICovCitzdGF0aWMgdm9pZAorc25fbGVnYWN5X3BjaV93aW5kb3dfZml4dXAoc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyLAorCQkJICAgdTY0IGxlZ2FjeV9pbywgdTY0IGxlZ2FjeV9tZW0pCit7CisJCWNvbnRyb2xsZXItPndpbmRvdyA9IGtjYWxsb2MoMiwgc2l6ZW9mKHN0cnVjdCBwY2lfd2luZG93KSwKKwkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKGNvbnRyb2xsZXItPndpbmRvdyA9PSBOVUxMKQorCQkJQlVHKCk7CisJCWNvbnRyb2xsZXItPndpbmRvd1swXS5vZmZzZXQgPSBsZWdhY3lfaW87CisJCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5uYW1lID0gImxlZ2FjeV9pbyI7CisJCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5zdGFydCA9IGxlZ2FjeV9pbzsKKwkJY29udHJvbGxlci0+d2luZG93WzBdLnJlc291cmNlLmVuZCA9CisJICAgIAkJCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5zdGFydCArIDB4ZmZmZjsKKwkJY29udHJvbGxlci0+d2luZG93WzBdLnJlc291cmNlLnBhcmVudCA9ICZpb3BvcnRfcmVzb3VyY2U7CisJCWNvbnRyb2xsZXItPndpbmRvd1sxXS5vZmZzZXQgPSBsZWdhY3lfbWVtOworCQljb250cm9sbGVyLT53aW5kb3dbMV0ucmVzb3VyY2UubmFtZSA9ICJsZWdhY3lfbWVtIjsKKwkJY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCWNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5zdGFydCA9IGxlZ2FjeV9tZW07CisJCWNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5lbmQgPQorCSAgICAJICAgICAgIGNvbnRyb2xsZXItPndpbmRvd1sxXS5yZXNvdXJjZS5zdGFydCArICgxMDI0ICogMTAyNCkgLSAxOworCQljb250cm9sbGVyLT53aW5kb3dbMV0ucmVzb3VyY2UucGFyZW50ID0gJmlvbWVtX3Jlc291cmNlOworCQljb250cm9sbGVyLT53aW5kb3dzID0gMjsKK30KKworLyoKICAqIHNuX3BjaV93aW5kb3dfZml4dXAoKSAtIENyZWF0ZSBhIHBjaV93aW5kb3cgZm9yIGVhY2ggZGV2aWNlIHJlc291cmNlLgotICoJCQkgICBVbnRpbCBBQ1BJIHN1cHBvcnQgaXMgYWRkZWQsIHdlIG5lZWQgdGhpcyBjb2RlCi0gKgkJCSAgIHRvIHNldHVwIHBjaV93aW5kb3dzIGZvciB1c2UgYnkKLSAqCQkJICAgcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoKSwKLSAqCQkJICAgcGNpYmlvc19yZXNvdXJjZV90b19idXMoKSwgZXRjLgorICoJCQkgICBJdCB3aWxsIHNldHVwIHBjaV93aW5kb3dzIGZvciB1c2UgYnkKKyAqCQkJICAgcGNpYmlvc19idXNfdG9fcmVzb3VyY2UoKSwgcGNpYmlvc19yZXNvdXJjZV90b19idXMoKSwKKyAqCQkJICAgZXRjLgogICovCiBzdGF0aWMgdm9pZAogc25fcGNpX3dpbmRvd19maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgY291bnQsCkBAIC0zNDIsNjAgKzE3MSwyMiBAQAogCWNvbnRyb2xsZXItPndpbmRvdyA9IG5ld193aW5kb3c7CiB9CiAKLXZvaWQgc25fcGNpX3VuZml4dXBfc2xvdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpob3N0X3BjaV9kZXYgPSBTTl9QQ0lERVZfSU5GTyhkZXYpLT5ob3N0X3BjaV9kZXY7Ci0KLQlzbl9pcnFfdW5maXh1cChkZXYpOwotCXBjaV9kZXZfcHV0KGhvc3RfcGNpX2Rldik7Ci0JcGNpX2Rldl9wdXQoZGV2KTsKLX0KLQogLyoKLSAqIHNuX3BjaV9maXh1cF9zbG90KCkgLSBUaGlzIHJvdXRpbmUgc2V0cyB1cCBhIHNsb3QncyByZXNvdXJjZXMKLSAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgTGludXggUENJIGFic3RyYWN0aW9uIGxheWVyLiAgUmVzb3VyY2VzIGFjcXVpcmVkCi0gKiBmcm9tIG91ciBQQ0kgcHJvdmlkZXIgaW5jbHVkZSBQSU8gbWFwcyB0byBCQVIgc3BhY2UgYW5kIGludGVycnVwdAotICogb2JqZWN0cy4KKyAqIHNuX21vcmVfc2xvdF9maXh1cCgpIC0gV2UgYXJlIG5vdCBydW5uaW5nIHdpdGggYW4gQUNQSSBjYXBhYmxlIFBST00sCisgKgkJCSAgYW5kIG5lZWQgdG8gY29udmVydCB0aGUgcGNpX2Rldi0+cmVzb3VyY2UKKyAqCQkJICAnc3RhcnQnIGFuZCAnZW5kJyBhZGRyZXNzZXMgdG8gbWFwcGVkIGFkZHJlc3NlcywKKyAqCQkJICBhbmQgc2V0dXAgdGhlIHBjaV9jb250cm9sbGVyLT53aW5kb3cgYXJyYXkgZW50cmllcy4KICAqLwotdm9pZCBzbl9wY2lfZml4dXBfc2xvdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQordm9pZAorc25fbW9yZV9zbG90X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2X2luZm8pCiB7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAlpbnQgaWR4OwotCWludCBzZWdtZW50ID0gcGNpX2RvbWFpbl9ucihkZXYtPmJ1cyk7Ci0JaW50IHN0YXR1cyA9IDA7Ci0Jc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpiczsKLSAJc3RydWN0IHBjaV9idXMgKmhvc3RfcGNpX2J1czsKLSAJc3RydWN0IHBjaV9kZXYgKmhvc3RfcGNpX2RldjsKLQlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvOwogCXM2NCBwY2lfYWRkcnNbUENJX1JPTV9SRVNPVVJDRSArIDFdOwotIAlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvOwotIAl1bnNpZ25lZCBsb25nIHNpemU7Ci0gCXVuc2lnbmVkIGludCBidXNfbm8sIGRldmZuOwotCi0JcGNpX2Rldl9nZXQoZGV2KTsgLyogZm9yIHRoZSBzeXNkYXRhIHBvaW50ZXIgKi8KLQlwY2lkZXZfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lkZXZfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghcGNpZGV2X2luZm8pCi0JCUJVRygpOwkJLyogQ2Fubm90IGFmZm9yZCB0byBydW4gb3V0IG9mIG1lbW9yeSAqLwotCi0Jc25faXJxX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25faXJxX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNuX2lycV9pbmZvKQotCQlCVUcoKTsJCS8qIENhbm5vdCBhZmZvcmQgdG8gcnVuIG91dCBvZiBtZW1vcnkgKi8KLQotCS8qIENhbGwgdG8gcmV0cmlldmUgcGNpIGRldmljZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkga2VybmVsLiAqLwotCXN0YXR1cyA9IHNhbF9nZXRfcGNpZGV2X2luZm8oKHU2NCkgc2VnbWVudCwgKHU2NCkgZGV2LT5idXMtPm51bWJlciwgCi0JCQkJICAgICBkZXYtPmRldmZuLAotCQkJCSAgICAgKHU2NCkgX19wYShwY2lkZXZfaW5mbyksCi0JCQkJICAgICAodTY0KSBfX3BhKHNuX2lycV9pbmZvKSk7Ci0JaWYgKHN0YXR1cykKLQkJQlVHKCk7IC8qIENhbm5vdCBnZXQgcGxhdGZvcm0gcGNpIGRldmljZSBpbmZvcm1hdGlvbiAqLwotCi0JLyogQWRkIHBjaWRldl9pbmZvIHRvIGxpc3QgaW4gc25fcGNpX2NvbnRyb2xsZXIgc3RydWN0ICovCi0JbGlzdF9hZGRfdGFpbCgmcGNpZGV2X2luZm8tPnBkaV9saXN0LAotCQkgICAgICAmKFNOX1BDSV9DT05UUk9MTEVSKGRldi0+YnVzKS0+cGNpZGV2X2luZm8pKTsKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGVuZCwgc2l6ZSwgc3RhcnQ7CiAKIAkvKiBDb3B5IG92ZXIgUElPIE1hcHBlZCBBZGRyZXNzZXMgKi8KIAlmb3IgKGlkeCA9IDA7IGlkeCA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpZHgrKykgewotCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQsIGFkZHI7CiAKIAkJaWYgKCFwY2lkZXZfaW5mby0+cGRpX3Bpb19tYXBwZWRfYWRkcltpZHhdKSB7CiAJCQlwY2lfYWRkcnNbaWR4XSA9IC0xOwpAQCAtNDE5LDYwICsyMTAsMjggQEAKIAkJCWRldi0+cmVzb3VyY2VbaWR4XS5wYXJlbnQgPSAmaW9wb3J0X3Jlc291cmNlOwogCQllbHNlCiAJCQlkZXYtPnJlc291cmNlW2lkeF0ucGFyZW50ID0gJmlvbWVtX3Jlc291cmNlOworCQkvKiBJZiBST00sIG1hcmsgYXMgc2hhZG93ZWQgaW4gUFJPTSAqLworCQlpZiAoaWR4ID09IFBDSV9ST01fUkVTT1VSQ0UpCisJCQlkZXYtPnJlc291cmNlW2lkeF0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fQklPU19DT1BZOwogCX0KIAkvKiBDcmVhdGUgYSBwY2lfd2luZG93IGluIHRoZSBwY2lfY29udHJvbGxlciBzdHJ1Y3QgZm9yCiAJICogZWFjaCBkZXZpY2UgcmVzb3VyY2UuCiAJICovCiAJaWYgKGNvdW50ID4gMCkKIAkJc25fcGNpX3dpbmRvd19maXh1cChkZXYsIGNvdW50LCBwY2lfYWRkcnMpOwotCi0JLyoKLQkgKiBVc2luZyB0aGUgUFJPTXMgdmFsdWVzIGZvciB0aGUgUENJIGhvc3QgYnVzLCBnZXQgdGhlIExpbnV4Ci0gCSAqIFBDSSBob3N0X3BjaV9kZXYgc3RydWN0IGFuZCBzZXQgdXAgaG9zdCBidXMgbGlua2FnZXMKLSAJICovCi0KLQlidXNfbm8gPSAocGNpZGV2X2luZm8tPnBkaV9zbG90X2hvc3RfaGFuZGxlID4+IDMyKSAmIDB4ZmY7Ci0JZGV2Zm4gPSBwY2lkZXZfaW5mby0+cGRpX3Nsb3RfaG9zdF9oYW5kbGUgJiAweGZmZmZmZmZmOwotIAlob3N0X3BjaV9idXMgPSBwY2lfZmluZF9idXMoc2VnbWVudCwgYnVzX25vKTsKLSAJaG9zdF9wY2lfZGV2ID0gcGNpX2dldF9zbG90KGhvc3RfcGNpX2J1cywgZGV2Zm4pOwotCi0JcGNpZGV2X2luZm8tPmhvc3RfcGNpX2RldiA9IGhvc3RfcGNpX2RldjsKLQlwY2lkZXZfaW5mby0+cGRpX2xpbnV4X3BjaWRldiA9IGRldjsKLQlwY2lkZXZfaW5mby0+cGRpX2hvc3RfcGNpZGV2X2luZm8gPSBTTl9QQ0lERVZfSU5GTyhob3N0X3BjaV9kZXYpOwotCWJzID0gU05fUENJQlVTX0JVU1NPRlQoZGV2LT5idXMpOwotCXBjaWRldl9pbmZvLT5wZGlfcGNpYnVzX2luZm8gPSBiczsKLQotCWlmIChicyAmJiBicy0+YnNfYXNpY190eXBlIDwgUENJSU9fQVNJQ19NQVhfVFlQRVMpIHsKLQkJU05fUENJREVWX0JVU1BST1ZJREVSKGRldikgPSBzbl9wY2lfcHJvdmlkZXJbYnMtPmJzX2FzaWNfdHlwZV07Ci0JfSBlbHNlIHsKLQkJU05fUENJREVWX0JVU1BST1ZJREVSKGRldikgPSAmc25fcGNpX2RlZmF1bHRfcHJvdmlkZXI7Ci0JfQotCi0JLyogT25seSBzZXQgdXAgSVJRIHN0dWZmIGlmIHRoaXMgZGV2aWNlIGhhcyBhIGhvc3QgYnVzIGNvbnRleHQgKi8KLQlpZiAoYnMgJiYgc25faXJxX2luZm8tPmlycV9pcnEpIHsKLQkJcGNpZGV2X2luZm8tPnBkaV9zbl9pcnFfaW5mbyA9IHNuX2lycV9pbmZvOwotCQlkZXYtPmlycSA9IHBjaWRldl9pbmZvLT5wZGlfc25faXJxX2luZm8tPmlycV9pcnE7Ci0JCXNuX2lycV9maXh1cChkZXYsIHNuX2lycV9pbmZvKTsKLQl9IGVsc2UgewotCQlwY2lkZXZfaW5mby0+cGRpX3NuX2lycV9pbmZvID0gTlVMTDsKLQkJa2ZyZWUoc25faXJxX2luZm8pOwotCX0KIH0KIAogLyoKICAqIHNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKCkgLSBUaGlzIHJvdXRpbmUgc2V0cyB1cCBhIGJ1cydzIHJlc291cmNlcwotICogY29uc2lzdGVudCB3aXRoIHRoZSBMaW51eCBQQ0kgYWJzdHJhY3Rpb24gbGF5ZXIuCisgKgkJCSAgICAgICBjb25zaXN0ZW50IHdpdGggdGhlIExpbnV4IFBDSSBhYnN0cmFjdGlvbiBsYXllci4KICAqLwotdm9pZCBzbl9wY2lfY29udHJvbGxlcl9maXh1cChpbnQgc2VnbWVudCwgaW50IGJ1c251bSwgc3RydWN0IHBjaV9idXMgKmJ1cykKK3N0YXRpYyB2b2lkCitzbl9wY2lfY29udHJvbGxlcl9maXh1cChpbnQgc2VnbWVudCwgaW50IGJ1c251bSwgc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQlpbnQgc3RhdHVzOwotCWludCBuYXNpZCwgY25vZGU7CisJczY0IHN0YXR1cyA9IDA7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyOwotCXN0cnVjdCBzbl9wY2lfY29udHJvbGxlciAqc25fY29udHJvbGxlcjsKIAlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKnByb21fYnVzc29mdF9wdHI7Ci0Jc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXZfaW5mbzsKLQl2b2lkICpwcm92aWRlcl9zb2Z0OwotCXN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnByb3ZpZGVyOworCiAKICAJc3RhdHVzID0gc2FsX2dldF9wY2lidXNfaW5mbygodTY0KSBzZWdtZW50LCAodTY0KSBidXNudW0sCiAgCQkJCSAgICAgKHU2NCkgaWE2NF90cGEoJnByb21fYnVzc29mdF9wdHIpKTsKQEAgLTQ4MCwyNjEgKzIzOSw3NyBAQAogCQlyZXR1cm47CQkvKmJ1cyAjIGRvZXMgbm90IGV4aXN0ICovCiAJcHJvbV9idXNzb2Z0X3B0ciA9IF9fdmEocHJvbV9idXNzb2Z0X3B0cik7CiAKLQkvKiBBbGxvY2F0ZSBhIHNuX3BjaV9jb250cm9sbGVyLCB3aGljaCBoYXMgYSBwY2lfY29udHJvbGxlciBzdHJ1Y3QKLQkgKiBhcyB0aGUgZmlyc3QgbWVtYmVyLgotCSAqLwotCXNuX2NvbnRyb2xsZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25fcGNpX2NvbnRyb2xsZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNuX2NvbnRyb2xsZXIpCisJY29udHJvbGxlciA9IGt6YWxsb2Moc2l6ZW9mKCpjb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb250cm9sbGVyKQogCQlCVUcoKTsKLQlJTklUX0xJU1RfSEVBRCgmc25fY29udHJvbGxlci0+cGNpZGV2X2luZm8pOwotCWNvbnRyb2xsZXIgPSAmc25fY29udHJvbGxlci0+cGNpX2NvbnRyb2xsZXI7CiAJY29udHJvbGxlci0+c2VnbWVudCA9IHNlZ21lbnQ7CiAKLQlpZiAoYnVzID09IE5VTEwpIHsKLSAJCWJ1cyA9IHBjaV9zY2FuX2J1cyhidXNudW0sICZwY2lfcm9vdF9vcHMsIGNvbnRyb2xsZXIpOwotIAkJaWYgKGJ1cyA9PSBOVUxMKQotIAkJCWdvdG8gZXJyb3JfcmV0dXJuOyAvKiBlcnJvciwgb3IgYnVzIGFscmVhZHkgc2Nhbm5lZCAqLwotIAkJYnVzLT5zeXNkYXRhID0gTlVMTDsKLQl9Ci0KLQlpZiAoYnVzLT5zeXNkYXRhKQotCQlnb3RvIGVycm9yX3JldHVybjsgLyogc3lzZGF0YSBhbHJlYWR5IGFsbG9jJ2QgKi8KLQogCS8qCi0JICogUGVyLXByb3ZpZGVyIGZpeHVwLiAgQ29waWVzIHRoZSBjb250ZW50cyBmcm9tIHByb20gdG8gbG9jYWwKLQkgKiBhcmVhIGFuZCBsaW5rcyBTTl9QQ0lCVVNfQlVTU09GVCgpLgorCSAqIFRlbXBvcmFyaWx5IHNhdmUgdGhlIHByb21fYnVzc29mdF9wdHIgZm9yIHVzZSBieSBzbl9idXNfZml4dXAoKS4KKwkgKiAocGxhdGZvcm1fZGF0YSB3aWxsIGJlIG92ZXJ3cml0dGVuIGxhdGVyIGluIHNuX2NvbW1vbl9idXNfZml4dXAoKSkKIAkgKi8KKwljb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhID0gcHJvbV9idXNzb2Z0X3B0cjsKIAotCWlmIChwcm9tX2J1c3NvZnRfcHRyLT5ic19hc2ljX3R5cGUgPj0gUENJSU9fQVNJQ19NQVhfVFlQRVMpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOyAvKiB1bnN1cHBvcnRlZCBhc2ljIHR5cGUgKi8KLQotCWlmIChwcm9tX2J1c3NvZnRfcHRyLT5ic19hc2ljX3R5cGUgPT0gUENJSU9fQVNJQ19UWVBFX1BQQikKLQkJZ290byBlcnJvcl9yZXR1cm47IC8qIG5vIGZ1cnRoZXIgZml4dXAgbmVjZXNzYXJ5ICovCi0KLQlwcm92aWRlciA9IHNuX3BjaV9wcm92aWRlcltwcm9tX2J1c3NvZnRfcHRyLT5ic19hc2ljX3R5cGVdOwotCWlmIChwcm92aWRlciA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsgLyogbm8gcHJvdmlkZXIgcmVnaXN0ZXJkIGZvciB0aGlzIGFzaWMgKi8KKwlidXMgPSBwY2lfc2Nhbl9idXMoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBjb250cm9sbGVyKTsKKyAJaWYgKGJ1cyA9PSBOVUxMKQorIAkJZ290byBlcnJvcl9yZXR1cm47IC8qIGVycm9yLCBvciBidXMgYWxyZWFkeSBzY2FubmVkICovCiAKIAlidXMtPnN5c2RhdGEgPSBjb250cm9sbGVyOwotCWlmIChwcm92aWRlci0+YnVzX2ZpeHVwKQotCQlwcm92aWRlcl9zb2Z0ID0gKCpwcm92aWRlci0+YnVzX2ZpeHVwKSAocHJvbV9idXNzb2Z0X3B0ciwgY29udHJvbGxlcik7Ci0JZWxzZQotCQlwcm92aWRlcl9zb2Z0ID0gTlVMTDsKIAotCWlmIChwcm92aWRlcl9zb2Z0ID09IE5VTEwpIHsKLQkJLyogZml4dXAgZmFpbGVkIG9yIG5vdCBhcHBsaWNhYmxlICovCi0JCWJ1cy0+c3lzZGF0YSA9IE5VTEw7Ci0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotCS8qCi0JICogU2V0dXAgcGNpX3dpbmRvd3MgZm9yIGxlZ2FjeSBJTyBhbmQgTUVNIHNwYWNlLgotCSAqIChUZW1wb3JhcnkgdW50aWwgQUNQSSBzdXBwb3J0IGlzIGluIHBsYWNlLikKLQkgKi8KLQljb250cm9sbGVyLT53aW5kb3cgPSBrY2FsbG9jKDIsIHNpemVvZihzdHJ1Y3QgcGNpX3dpbmRvdyksIEdGUF9LRVJORUwpOwotCWlmIChjb250cm9sbGVyLT53aW5kb3cgPT0gTlVMTCkKLQkJQlVHKCk7Ci0JY29udHJvbGxlci0+d2luZG93WzBdLm9mZnNldCA9IHByb21fYnVzc29mdF9wdHItPmJzX2xlZ2FjeV9pbzsKLQljb250cm9sbGVyLT53aW5kb3dbMF0ucmVzb3VyY2UubmFtZSA9ICJsZWdhY3lfaW8iOwotCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfSU87Ci0JY29udHJvbGxlci0+d2luZG93WzBdLnJlc291cmNlLnN0YXJ0ID0gcHJvbV9idXNzb2Z0X3B0ci0+YnNfbGVnYWN5X2lvOwotCWNvbnRyb2xsZXItPndpbmRvd1swXS5yZXNvdXJjZS5lbmQgPQotCSAgICBjb250cm9sbGVyLT53aW5kb3dbMF0ucmVzb3VyY2Uuc3RhcnQgKyAweGZmZmY7Ci0JY29udHJvbGxlci0+d2luZG93WzBdLnJlc291cmNlLnBhcmVudCA9ICZpb3BvcnRfcmVzb3VyY2U7Ci0JY29udHJvbGxlci0+d2luZG93WzFdLm9mZnNldCA9IHByb21fYnVzc29mdF9wdHItPmJzX2xlZ2FjeV9tZW07Ci0JY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLm5hbWUgPSAibGVnYWN5X21lbSI7Ci0JY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0JY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLnN0YXJ0ID0gcHJvbV9idXNzb2Z0X3B0ci0+YnNfbGVnYWN5X21lbTsKLQljb250cm9sbGVyLT53aW5kb3dbMV0ucmVzb3VyY2UuZW5kID0KLQkgICAgY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLnN0YXJ0ICsgKDEwMjQgKiAxMDI0KSAtIDE7Ci0JY29udHJvbGxlci0+d2luZG93WzFdLnJlc291cmNlLnBhcmVudCA9ICZpb21lbV9yZXNvdXJjZTsKLQljb250cm9sbGVyLT53aW5kb3dzID0gMjsKLQotCS8qCi0JICogR2VuZXJpYyBidXMgZml4dXAgZ29lcyBoZXJlLiAgRG9uJ3QgcmVmZXJlbmNlIHByb21fYnVzc29mdF9wdHIKLQkgKiBhZnRlciB0aGlzIHBvaW50LgotCSAqLwotCi0JUENJX0NPTlRST0xMRVIoYnVzKS0+cGxhdGZvcm1fZGF0YSA9IHByb3ZpZGVyX3NvZnQ7Ci0JbmFzaWQgPSBOQVNJRF9HRVQoU05fUENJQlVTX0JVU1NPRlQoYnVzKS0+YnNfYmFzZSk7Ci0JY25vZGUgPSBuYXNpZF90b19jbm9kZWlkKG5hc2lkKTsKLQlodWJkZXZfaW5mbyA9IChzdHJ1Y3QgaHViZGV2X2luZm8gKikoTk9ERVBEQShjbm9kZSktPnBkaW5mbyk7Ci0JU05fUENJQlVTX0JVU1NPRlQoYnVzKS0+YnNfeHdpZGdldF9pbmZvID0KLQkgICAgJihodWJkZXZfaW5mby0+aGRpX3h3aWRnZXRfaW5mb1tTTl9QQ0lCVVNfQlVTU09GVChidXMpLT5ic194aWRdKTsKLQotCS8qCi0JICogSWYgdGhlIG5vZGUgaW5mb3JtYXRpb24gd2Ugb2J0YWluZWQgZHVyaW5nIHRoZSBmaXh1cCBwaGFzZSBpcyBpbnZhbGlkCi0JICogdGhlbiBzZXQgY29udHJvbGxlci0+bm9kZSB0byAtMSAodW5kZXRlcm1pbmVkKQotCSAqLwotCWlmIChjb250cm9sbGVyLT5ub2RlID49IG51bV9vbmxpbmVfbm9kZXMoKSkgewotCQlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKmIgPSBTTl9QQ0lCVVNfQlVTU09GVChidXMpOwotCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkRldmljZSBBU0lDPSV1IFhJRD0ldSBQQlVTTlVNPSV1IgotCQkJCSAgICAiTF9JTz0lbHggTF9NRU09JWx4IEJBU0U9JWx4XG4iLAotCQkJYi0+YnNfYXNpY190eXBlLCBiLT5ic194aWQsIGItPmJzX3BlcnNpc3RfYnVzbnVtLAotCQkJYi0+YnNfbGVnYWN5X2lvLCBiLT5ic19sZWdhY3lfbWVtLCBiLT5ic19iYXNlKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib24gbm9kZSAlZCBidXQgb25seSAlZCBub2RlcyBvbmxpbmUuIgotCQkJIkFzc29jaWF0aW9uIHNldCB0byB1bmRldGVybWluZWQuXG4iLAotCQkJY29udHJvbGxlci0+bm9kZSwgbnVtX29ubGluZV9ub2RlcygpKTsKLQkJY29udHJvbGxlci0+bm9kZSA9IC0xOwotCX0KIAlyZXR1cm47CiAKIGVycm9yX3JldHVybjoKIAotCWtmcmVlKHNuX2NvbnRyb2xsZXIpOwotCXJldHVybjsKLX0KLQotdm9pZCBzbl9idXNfc3RvcmVfc3lzZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBzeXNkYXRhX2VsICplbGVtZW50OwotCi0JZWxlbWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNkYXRhX2VsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlbGVtZW50KSB7Ci0JCWRldl9kYmcoZGV2LCAiJXM6IG91dCBvZiBtZW1vcnkhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm47Ci0JfQotCWVsZW1lbnQtPnN5c2RhdGEgPSBTTl9QQ0lERVZfSU5GTyhkZXYpOwotCWxpc3RfYWRkKCZlbGVtZW50LT5lbnRyeSwgJnNuX3N5c2RhdGFfbGlzdCk7Ci19Ci0KLXZvaWQgc25fYnVzX2ZyZWVfc3lzZGF0YSh2b2lkKQotewotCXN0cnVjdCBzeXNkYXRhX2VsICplbGVtZW50OwotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICpzYWZlOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHNhZmUsICZzbl9zeXNkYXRhX2xpc3QpIHsKLQkJZWxlbWVudCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHN5c2RhdGFfZWwsIGVudHJ5KTsKLQkJbGlzdF9kZWwoJmVsZW1lbnQtPmVudHJ5KTsKLQkJbGlzdF9kZWwoJigoKHN0cnVjdCBwY2lkZXZfaW5mbyAqKQotCQkJICAgICAoZWxlbWVudC0+c3lzZGF0YSkpLT5wZGlfbGlzdCkpOwotCQlrZnJlZShlbGVtZW50LT5zeXNkYXRhKTsKLQkJa2ZyZWUoZWxlbWVudCk7Ci0JfQorCWtmcmVlKGNvbnRyb2xsZXIpOwogCXJldHVybjsKIH0KIAogLyoKLSAqIFVnbHkgaGFjayB0byBnZXQgUENJIHNldHVwIHVudGlsIHdlIGhhdmUgYSBwcm9wZXIgQUNQSSBuYW1lc3BhY2UuCisgKiBzbl9idXNfZml4dXAKKyAqLwordm9pZAorc25fYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0X3B0cjsKKwlleHRlcm4gdm9pZCBzbl9jb21tb25fYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICosCisJCQkJCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqKTsKKworCisJaWYgKCFidXMtPnBhcmVudCkgeyAgLyogSWYgcm9vdCBidXMgKi8KKwkJcHJvbV9idXNzb2Z0X3B0ciA9IFBDSV9DT05UUk9MTEVSKGJ1cyktPnBsYXRmb3JtX2RhdGE7CisJCWlmIChwcm9tX2J1c3NvZnRfcHRyID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJzbl9idXNfZml4dXA6IDB4JTA0eDoweCUwMnggVW5hYmxlIHRvICIKKwkJCSAgICAgICAib2J0YWluIHByb21fYnVzc29mdF9wdHJcbiIsCisJCQkgICAgICAgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlcik7CisJCQlyZXR1cm47CisJCX0KKwkJc25fY29tbW9uX2J1c19maXh1cChidXMsIHByb21fYnVzc29mdF9wdHIpOworCQlzbl9sZWdhY3lfcGNpX3dpbmRvd19maXh1cChQQ0lfQ09OVFJPTExFUihidXMpLAorCQkJCQkgICBwcm9tX2J1c3NvZnRfcHRyLT5ic19sZWdhY3lfaW8sCisJCQkJCSAgIHByb21fYnVzc29mdF9wdHItPmJzX2xlZ2FjeV9tZW0pOworICAgICAgICB9CisgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkocGNpX2RldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKyAgICAgICAgICAgICAgICBzbl9wY2lfZml4dXBfc2xvdChwY2lfZGV2KTsKKyAgICAgICAgfQorCit9CisKKy8qCisgKiBzbl9pb19pbml0IC0gUFJPTSBkb2VzIG5vdCBoYXZlIEFDUEkgc3VwcG9ydCB0byBkZWZpbmUgbm9kZXMgb3Igcm9vdCBidXNlcywKKyAqCQlzbyB3ZSBuZWVkIHRvIGRvIHRoaW5ncyB0aGUgaGFyZCB3YXksIGluY2x1ZGluZyBpbml0aWF0aW5nIHRoZQorICoJCWJ1cyBzY2FubmluZyBvdXJzZWx2ZXMuCiAgKi8KIAotI2RlZmluZSBQQ0lfQlVTRVNfVE9fU0NBTiAyNTYKLQotc3RhdGljIGludCBfX2luaXQgc25fcGNpX2luaXQodm9pZCkKK3ZvaWQgX19pbml0IHNuX2lvX2luaXQodm9pZCkKIHsKIAlpbnQgaSwgajsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CiAKLQlpZiAoIWlhNjRfcGxhdGZvcm1faXMoInNuMiIpIHx8IElTX1JVTk5JTkdfT05fRkFLRV9QUk9NKCkpCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBwcmltZSBzbl9wY2lfcHJvdmlkZXJbXS4gIEluZGl2aWRpYWwgcHJvdmlkZXIgaW5pdCByb3V0aW5lcyB3aWxsCi0JICogb3ZlcnJpZGUgdGhlaXIgcmVzcGVjdGl2ZSBkZWZhdWx0IGVudHJpZXMuCi0JICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgUENJSU9fQVNJQ19NQVhfVFlQRVM7IGkrKykKLQkJc25fcGNpX3Byb3ZpZGVyW2ldID0gJnNuX3BjaV9kZWZhdWx0X3Byb3ZpZGVyOwotCi0JcGNpYnJfaW5pdF9wcm92aWRlcigpOwotCXRpb2NhX2luaXRfcHJvdmlkZXIoKTsKLQl0aW9jZV9pbml0X3Byb3ZpZGVyKCk7Ci0KLQkvKgotCSAqIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGJvdW5jZSBsaW1pdCBjaGVja3MgaW4gdGhlIGJsayBsYXllcgotCSAqLwotCWlhNjRfbWF4X2lvbW11X21lcmdlX21hc2sgPSB+UEFHRV9NQVNLOwogCXNuX2ZpeHVwX2lvbm9kZXMoKTsKLQlzbl9pcnFfbGhfaW5pdCgpOwotCUlOSVRfTElTVF9IRUFEKCZzbl9zeXNkYXRhX2xpc3QpOwotCXNuX2luaXRfY3BlaV90aW1lcigpOwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyZWdpc3Rlcl9zbl9wcm9jZnMoKTsKLSNlbmRpZgogCiAJLyogYnVzc2VzIGFyZSBub3Qga25vd24geWV0IC4uLiAqLwogCWZvciAoaSA9IDA7IGkgPD0gbWF4X3NlZ21lbnRfbnVtYmVyOyBpKyspCiAJCWZvciAoaiA9IDA7IGogPD0gbWF4X3BjaWJ1c19udW1iZXI7IGorKykKIAkJCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKGksIGosIE5VTEwpOwotCi0JLyoKLQkgKiBHZW5lcmljIExpbnV4IFBDSSBMYXllciBoYXMgY3JlYXRlZCB0aGUgcGNpX2J1cyBhbmQgcGNpX2RldiAKLQkgKiBzdHJ1Y3R1cmVzIC0gdGltZSBmb3IgdXMgdG8gYWRkIG91ciBTTiBQTGF0Zm9ybSBzcGVjaWZpYyAKLQkgKiBpbmZvcm1hdGlvbi4KLQkgKi8KLQotCXdoaWxlICgocGNpX2RldiA9Ci0JCXBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXYpKSAhPSBOVUxMKQotCQlzbl9wY2lfZml4dXBfc2xvdChwY2lfZGV2KTsKLQotCXNuX2lvaWZfaW5pdGVkID0gMTsJLyogc24gSS9PIGluZnJhc3RydWN0dXJlIG5vdyBpbml0aWFsaXplZCAqLwotCi0JcmV0dXJuIDA7CiB9Ci0KLS8qCi0gKiBodWJkZXZfaW5pdF9ub2RlKCkgLSBDcmVhdGVzIHRoZSBIVUIgZGF0YSBzdHJ1Y3R1cmUgYW5kIGxpbmsgdGhlbSB0byBpdCdzIAotICoJb3duIE5PREUgc3BlY2lmaWMgZGF0YSBhcmVhLgotICovCi12b2lkIGh1YmRldl9pbml0X25vZGUobm9kZXBkYV90ICogbnBkYSwgY25vZGVpZF90IG5vZGUpCi17Ci0Jc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXZfaW5mbzsKLQlpbnQgc2l6ZTsKLQlwZ19kYXRhX3QgKnBnOwotCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHViZGV2X2luZm8pOwotCi0JaWYgKG5vZGUgPj0gbnVtX29ubGluZV9ub2RlcygpKQkvKiBIZWFkbGVzcy9tZW1sZXNzIElPIG5vZGVzICovCi0JCXBnID0gTk9ERV9EQVRBKDApOwotCWVsc2UKLQkJcGcgPSBOT0RFX0RBVEEobm9kZSk7Ci0KLQlodWJkZXZfaW5mbyA9IChzdHJ1Y3QgaHViZGV2X2luZm8gKilhbGxvY19ib290bWVtX25vZGUocGcsIHNpemUpOwotCi0JbnBkYS0+cGRpbmZvID0gKHZvaWQgKilodWJkZXZfaW5mbzsKLX0KLQotZ2VvaWRfdAotY25vZGVpZF9nZXRfZ2VvaWQoY25vZGVpZF90IGNub2RlKQotewotCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2OwotCi0JaHViZGV2ID0gKHN0cnVjdCBodWJkZXZfaW5mbyAqKShOT0RFUERBKGNub2RlKS0+cGRpbmZvKTsKLQlyZXR1cm4gaHViZGV2LT5oZGlfZ2VvaWQ7Ci19Ci0KLXZvaWQgc25fZ2VuZXJhdGVfcGF0aChzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cywgY2hhciAqYWRkcmVzcykKLXsKLQluYXNpZF90IG5hc2lkOwotCWNub2RlaWRfdCBjbm9kZTsKLQlnZW9pZF90IGdlb2lkOwotCW1vZHVsZWlkX3QgbW9kdWxlaWQ7Ci0JdTE2IGJyaWNrdHlwZTsKLQotCW5hc2lkID0gTkFTSURfR0VUKFNOX1BDSUJVU19CVVNTT0ZUKHBjaV9idXMpLT5ic19iYXNlKTsKLQljbm9kZSA9IG5hc2lkX3RvX2Nub2RlaWQobmFzaWQpOwotCWdlb2lkID0gY25vZGVpZF9nZXRfZ2VvaWQoY25vZGUpOwotCW1vZHVsZWlkID0gZ2VvX21vZHVsZShnZW9pZCk7Ci0KLQlzcHJpbnRmKGFkZHJlc3MsICJtb2R1bGVfJWMlYyVjJWMlLjJkIiwKLQkJJzAnK1JBQ0tfR0VUX0NMQVNTKE1PRFVMRV9HRVRfUkFDSyhtb2R1bGVpZCkpLAotCQknMCcrUkFDS19HRVRfR1JPVVAoTU9EVUxFX0dFVF9SQUNLKG1vZHVsZWlkKSksCi0JCScwJytSQUNLX0dFVF9OVU0oTU9EVUxFX0dFVF9SQUNLKG1vZHVsZWlkKSksCi0JCU1PRFVMRV9HRVRfQlRDSEFSKG1vZHVsZWlkKSwgTU9EVUxFX0dFVF9CUE9TKG1vZHVsZWlkKSk7Ci0KLQkvKiBUb2xsaG91c2UgcmVxdWlyZXMgc2xvdCBpZCB0byBiZSBkaXNwbGF5ZWQgKi8KLQlicmlja3R5cGUgPSBNT0RVTEVfR0VUX0JUWVBFKG1vZHVsZWlkKTsKLQlpZiAoKGJyaWNrdHlwZSA9PSBMMV9CUklDS1RZUEVfMTkxMDEwKSB8fAotCSAgICAoYnJpY2t0eXBlID09IEwxX0JSSUNLVFlQRV8xOTMyKSkKLQkJCXNwcmludGYoYWRkcmVzcywgIiVzXiVkIiwgYWRkcmVzcywgZ2VvX3Nsb3QoZ2VvaWQpKTsKLX0KLQotc3Vic3lzX2luaXRjYWxsKHNuX3BjaV9pbml0KTsKLUVYUE9SVF9TWU1CT0woc25fcGNpX2ZpeHVwX3Nsb3QpOwotRVhQT1JUX1NZTUJPTChzbl9wY2lfdW5maXh1cF9zbG90KTsKLUVYUE9SVF9TWU1CT0woc25fcGNpX2NvbnRyb2xsZXJfZml4dXApOwotRVhQT1JUX1NZTUJPTChzbl9idXNfc3RvcmVfc3lzZGF0YSk7Ci1FWFBPUlRfU1lNQk9MKHNuX2J1c19mcmVlX3N5c2RhdGEpOwotRVhQT1JUX1NZTUJPTChzbl9nZW5lcmF0ZV9wYXRoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9tdi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKaW5kZXggN2NlM2NkYS4uNGFhNGYzMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKQEAgLTMsMTAgKzMsMTEgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMsIDIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3ZnYS5oPgpAQCAtMTUsNiArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9zbi9wZGEuaD4KICNpbmNsdWRlIDxhc20vc24vc25fY3B1aWQuaD4KICNpbmNsdWRlIDxhc20vc24vc2h1Yl9tbXIuaD4KKyNpbmNsdWRlIDxhc20vc24vYWNwaS5oPgogCiAjZGVmaW5lIElTX0xFR0FDWV9WR0FfSU9QT1JUKHApIFwKIAkoKChwKSA+PSAweDNiMCAmJiAocCkgPD0gMHgzYmIpIHx8ICgocCkgPj0gMHgzYzAgJiYgKHApIDw9IDB4M2RmKSkKQEAgLTMxLDExICszMywxNCBAQAogewogCWlmICghSVNfUlVOTklOR19PTl9TSU1VTEFUT1IoKSkgewogCQlpZiAoSVNfTEVHQUNZX1ZHQV9JT1BPUlQocG9ydCkpCi0JCQlwb3J0ICs9IHZnYV9jb25zb2xlX2lvYmFzZTsKKwkJCXJldHVybiAoX19pYTY0X21rX2lvX2FkZHIocG9ydCkpOwogCQkvKiBPbiBzbjIsIGxlZ2FjeSBJL08gcG9ydHMgZG9uJ3QgcG9pbnQgYXQgYW55dGhpbmcgKi8KIAkJaWYgKHBvcnQgPCAoNjQgKiAxMDI0KSkKIAkJCXJldHVybiBOVUxMOwotCQlyZXR1cm4gKCh2b2lkICopKHBvcnQgfCBfX0lBNjRfVU5DQUNIRURfT0ZGU0VUKSk7CisJCWlmIChTTl9BQ1BJX0JBU0VfU1VQUE9SVCgpKQorCQkJcmV0dXJuIChfX2lhNjRfbWtfaW9fYWRkcihwb3J0KSk7CisJCWVsc2UKKwkJCXJldHVybiAoKHZvaWQgKikocG9ydCB8IF9fSUE2NF9VTkNBQ0hFRF9PRkZTRVQpKTsKIAl9IGVsc2UgewogCQkvKiBidXQgdGhlIHNpbXVsYXRvciB1c2VzIHRoZW0uLi4gKi8KIAkJdW5zaWduZWQgbG9uZyBhZGRyOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKaW5kZXggN2JiNmFkMS4uOGM1YmVlMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCkBAIC0xMTcsNyArMTE3LDEwIEBACiAJCQkJICAgICAgIG5hc2lkX3QgbmFzaWQsIGludCBzbGljZSkKIHsKIAlpbnQgdmVjdG9yOworCWludCBjcHVpZDsKKyNpZmRlZiBDT05GSUdfU01QCiAJaW50IGNwdXBoeXM7CisjZW5kaWYKIAlpbnQ2NF90IGJyaWRnZTsKIAlpbnQgbG9jYWxfd2lkZ2V0LCBzdGF0dXM7CiAJbmFzaWRfdCBsb2NhbF9uYXNpZDsKQEAgLTE0Niw3ICsxNDksNiBAQAogCXZlY3RvciA9IHNuX2lycV9pbmZvLT5pcnFfaXJxOwogCS8qIEZyZWUgdGhlIG9sZCBQUk9NIG5ld19pcnFfaW5mbyBzdHJ1Y3R1cmUgKi8KIAlzbl9pbnRyX2ZyZWUobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgbmV3X2lycV9pbmZvKTsKLQkvKiBVcGRhdGUga2VybmVscyBuZXdfaXJxX2luZm8gd2l0aCBuZXcgdGFyZ2V0IGluZm8gKi8KIAl1bnJlZ2lzdGVyX2ludHJfcGRhKG5ld19pcnFfaW5mbyk7CiAKIAkvKiBhbGxvY2F0ZSBhIG5ldyBQUk9NIG5ld19pcnFfaW5mbyBzdHJ1Y3QgKi8KQEAgLTE2MCw4ICsxNjIsMTAgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JY3B1cGh5cyA9IG5hc2lkX3NsaWNlX3RvX2NwdWlkKG5hc2lkLCBzbGljZSk7Ci0JbmV3X2lycV9pbmZvLT5pcnFfY3B1aWQgPSBjcHVwaHlzOworCS8qIFVwZGF0ZSBrZXJuZWxzIG5ld19pcnFfaW5mbyB3aXRoIG5ldyB0YXJnZXQgaW5mbyAqLworCWNwdWlkID0gbmFzaWRfc2xpY2VfdG9fY3B1aWQobmV3X2lycV9pbmZvLT5pcnFfbmFzaWQsCisJCQkJICAgICBuZXdfaXJxX2luZm8tPmlycV9zbGljZSk7CisJbmV3X2lycV9pbmZvLT5pcnFfY3B1aWQgPSBjcHVpZDsKIAlyZWdpc3Rlcl9pbnRyX3BkYShuZXdfaXJxX2luZm8pOwogCiAJcGNpX3Byb3ZpZGVyID0gc25fcGNpX3Byb3ZpZGVyW25ld19pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlXTsKQEAgLTE4MCw2ICsxODQsNyBAQAogCWNhbGxfcmN1KCZzbl9pcnFfaW5mby0+cmN1LCBzbl9pcnFfaW5mb19mcmVlKTsKIAogI2lmZGVmIENPTkZJR19TTVAKKwljcHVwaHlzID0gY3B1X3BoeXNpY2FsX2lkKGNwdWlkKTsKIAlzZXRfaXJxX2FmZmluaXR5X2luZm8oKHZlY3RvciAmIDB4ZmYpLCBjcHVwaHlzLCAwKTsKICNlbmRpZgogCkBAIC0yMDEsNyArMjA2LDcgQEAKIH0KIAogc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlycV90eXBlX3NuID0gewotCS50eXBlbmFtZQk9ICJTTiBodWIiLAorCS5uYW1lCQk9ICJTTiBodWIiLAogCS5zdGFydHVwCT0gc25fc3RhcnR1cF9pcnEsCiAJLnNodXRkb3duCT0gc25fc2h1dGRvd25faXJxLAogCS5lbmFibGUJCT0gc25fZW5hYmxlX2lycSwKQEAgLTI5OSw2ICszMDQsOSBAQAogCW5hc2lkX3QgbmFzaWQgPSBzbl9pcnFfaW5mby0+aXJxX25hc2lkOwogCWludCBzbGljZSA9IHNuX2lycV9pbmZvLT5pcnFfc2xpY2U7CiAJaW50IGNwdSA9IG5hc2lkX3NsaWNlX3RvX2NwdWlkKG5hc2lkLCBzbGljZSk7CisjaWZkZWYgQ09ORklHX1NNUAorCWludCBjcHVwaHlzOworI2VuZGlmCiAKIAlwY2lfZGV2X2dldChwY2lfZGV2KTsKIAlzbl9pcnFfaW5mby0+aXJxX2NwdWlkID0gY3B1OwpAQCAtMzExLDYgKzMxOSwxMCBAQAogCXNwaW5fdW5sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKIAogCXJlZ2lzdGVyX2ludHJfcGRhKHNuX2lycV9pbmZvKTsKKyNpZmRlZiBDT05GSUdfU01QCisJY3B1cGh5cyA9IGNwdV9waHlzaWNhbF9pZChjcHUpOworCXNldF9pcnFfYWZmaW5pdHlfaW5mbyhzbl9pcnFfaW5mby0+aXJxX2lycSwgY3B1cGh5cywgMCk7CisjZW5kaWYKIH0KIAogdm9pZCBzbl9pcnFfdW5maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jCmluZGV4IDZmZmQxZjguLmIzYTQzNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYwpAQCAtMTM2LDEwICsxMzYsNiBAQAogCSAqLwogCW1zZy5kYXRhID0gMHgxMDAgKyBpcnE7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0Jc2V0X2lycV9hZmZpbml0eV9pbmZvKGlycSwgc25faXJxX2luZm8tPmlycV9jcHVpZCwgMCk7Ci0jZW5kaWYKLQogCXdyaXRlX21zaV9tc2coaXJxLCAmbXNnKTsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc25fbXNpX2NoaXAsIGhhbmRsZV9lZGdlX2lycSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwppbmRleCA1ZjJkY2JhNy4uODU3MWU1MiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYwpAQCAtNjUsNyArNjUsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbGFzdF90aW1lX29mZnNldDsKIGV4dGVybiB2b2lkICgqaWE2NF9tYXJrX2lkbGUpIChpbnQpOwogZXh0ZXJuIHZvaWQgc25pZGxlKGludCk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nICgqaWE2NF9wcmludGtfY2xvY2spKHZvaWQpOwogCiB1bnNpZ25lZCBsb25nIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZDsKQEAgLTM4OSw2ICszODgsMTQgQEAKIAlpYTY0X3NuX3BsYXRfc2V0X2Vycm9yX2hhbmRsaW5nX2ZlYXR1cmVzKCk7CS8vIG9ic29sZXRlCiAJaWE2NF9zbl9zZXRfb3NfZmVhdHVyZShPU0ZfTUNBX1NMVl9UT19PU19JTklUX1NMVik7CiAJaWE2NF9zbl9zZXRfb3NfZmVhdHVyZShPU0ZfRkVBVF9MT0dfU0JFUyk7CisJLyoKKwkgKiBOb3RlOiBUaGUgY2FsbHMgdG8gbm90aWZ5IHRoZSBQUk9NIG9mIEFDUEkgYW5kIFBDSSBTZWdtZW50CisJICoJIHN1cHBvcnQgbXVzdCBiZSBkb25lIHByaW9yIHRvIGFjcGlfbG9hZF90YWJsZXMoKSwgYXMKKwkgKgkgYW4gQUNQSSBjYXBhYmxlIFBST00gd2lsbCByZWJ1aWxkIHRoZSBEU0RUIGFzIHJlc3VsdAorCSAqCSBvZiB0aGUgY2FsbC4KKwkgKi8KKwlpYTY0X3NuX3NldF9vc19mZWF0dXJlKE9TRl9QQ0lTRUdNRU5UX0VOQUJMRSk7CisJaWE2NF9zbl9zZXRfb3NfZmVhdHVyZShPU0ZfQUNQSV9FTkFCTEUpOwogCiAKICNpZiBkZWZpbmVkKENPTkZJR19WVCkgJiYgZGVmaW5lZChDT05GSUdfVkdBX0NPTlNPTEUpCkBAIC00MTQsNiArNDIxLDE2IEBACiAJaWYgKCEgdmdhX2NvbnNvbGVfbWVtYmFzZSkKIAkJc25fc2Nhbl9wY2RwKCk7CiAKKwkvKgorCSAqCVNldHVwIGxlZ2FjeSBJTyBzcGFjZS4KKwkgKgl2Z2FfY29uc29sZV9pb2Jhc2UgbWFwcyB0byBQQ0kgSU8gU3BhY2UgYWRkcmVzcyAwIG9uIHRoZQorCSAqIAlidXMgY29udGFpbmluZyB0aGUgVkdBIGNvbnNvbGUuCisJICovCisJaWYgKHZnYV9jb25zb2xlX2lvYmFzZSkgeworCQlpb19zcGFjZVswXS5tbWlvX2Jhc2UgPSB2Z2FfY29uc29sZV9pb2Jhc2U7CisJCWlvX3NwYWNlWzBdLnNwYXJzZSA9IDA7CisJfQorCiAJaWYgKHZnYV9jb25zb2xlX21lbWJhc2UpIHsKIAkJLyogdXNhYmxlIHZnYSAuLi4gbWFrZSB0dHkwIHRoZSBwcmVmZXJyZWQgZGVmYXVsdCBjb25zb2xlICovCiAJCWlmICghc3Ryc3RyKCpjbWRsaW5lX3AsICJjb25zb2xlPSIpKQpAQCAtNDUyLDE3ICs0NjksNiBAQAogCiAJaWE2NF9wcmludGtfY2xvY2sgPSBpYTY0X3NuMl9wcmludGtfY2xvY2s7CiAKLQkvKgotCSAqIE9sZCBQUk9NcyBkbyBub3QgcHJvdmlkZSBhbiBBQ1BJIEZBRFQuIERpc2FibGUgbGVnYWN5IGtleWJvYXJkCi0JICogc3VwcG9ydCBoZXJlIHNvIHdlIGRvbid0IGhhdmUgdG8gbGlzdGVuIHRvIGZhaWxlZCBrZXlib2FyZCBwcm9iZQotCSAqIG1lc3NhZ2VzLgotCSAqLwotCWlmIChpc19zaHViMSgpICYmIHZlcnNpb24gPD0gMHgwMjA5ICYmIGFjcGlfa2JkX2NvbnRyb2xsZXJfcHJlc2VudCkgewotCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxpbmcgbGVnYWN5IGtleWJvYXJkIHN1cHBvcnQgYXMgcHJvbSAiCi0JCSAgICAgICAiaXMgdG9vIG9sZCBhbmQgZG9lc24ndCBwcm92aWRlIEZBRFRcbiIpOwotCQlhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQgPSAwOwotCX0KLQogCXByaW50aygiU0dJIFNBTCB2ZXJzaW9uICV4LiUwMnhcbiIsIHZlcnNpb24gPj4gOCwgdmVyc2lvbiAmIDB4MDBGRik7CiAKIAkvKgpAQCAtNTc0LDcgKzU4MCw3IEBACiAJaW50IHNsaWNlOwogCWludCBjbm9kZTsKIAlpbnQgaTsKLQlzdGF0aWMgaW50IHdhcnNfaGF2ZV9iZWVuX2NoZWNrZWQ7CisJc3RhdGljIGludCB3YXJzX2hhdmVfYmVlbl9jaGVja2VkLCBzZXRfY3B1MF9udW1iZXI7CiAKIAljcHVpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpZiAoY3B1aWQgPT0gMCAmJiBJU19NRURVU0EoKSkgewpAQCAtNTk5LDggKzYwNSwxNiBAQAogCS8qCiAJICogRG9uJ3QgY2hlY2sgc3RhdHVzLiBUaGUgU0FMIGNhbGwgaXMgbm90IHN1cHBvcnRlZCBvbiBhbGwgUFJPTXMKIAkgKiBidXQgYSBmYWlsdXJlIGlzIGhhcm1sZXNzLgorCSAqIEFyY2hpdGVjaHR1YWxsbHksIGNwdV9pbml0IGlzIGFsd2F5cyBjYWxsZWQgdHdpY2Ugb24gY3B1IDAuIFdlCisJICogc2hvdWxkIHNldCBjcHVfbnVtYmVyIG9uIGNwdSAwIG9uY2UuCiAJICovCi0JKHZvaWQpIGlhNjRfc25fc2V0X2NwdV9udW1iZXIoY3B1aWQpOworCWlmIChjcHVpZCA9PSAwKSB7CisJCWlmICghc2V0X2NwdTBfbnVtYmVyKSB7CisJCQkodm9pZCkgaWE2NF9zbl9zZXRfY3B1X251bWJlcihjcHVpZCk7CisJCQlzZXRfY3B1MF9udW1iZXIgPSAxOworCQl9CisJfSBlbHNlCisJCSh2b2lkKSBpYTY0X3NuX3NldF9jcHVfbnVtYmVyKGNwdWlkKTsKIAogCS8qCiAJICogVGhlIGJvb3QgY3B1IG1ha2VzIHRoaXMgY2FsbCBhZ2FpbiBhZnRlciBwbGF0Zm9ybSBpbml0aWFsaXphdGlvbiBpcwpAQCAtNzYzLDUgKzc3NywxMyBAQAogCQlyZXR1cm4gMDsKIAlyZXR1cm4gdGVzdF9iaXQoaWQsIHNuX3Byb21fZmVhdHVyZXMpOwogfQorCit2b2lkCitzbl9rZXJuZWxfbGF1bmNoX2V2ZW50KHZvaWQpCit7CisJLyogaWdub3JlIHN0YXR1cyB1bnRpbCB3ZSB1bmRlcnN0YW5kIHBvc3NpYmxlIGZhaWx1cmUsIGlmIGFueSovCisJaWYgKGlhNjRfc25fa2VybmVsX2xhdW5jaF9ldmVudCgpKQorCQlwcmludGsoS0VSTl9FUlIgIktFWEVDIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBQUk9NLCBQbGVhc2UgdXBkYXRlIHRoZSBQUk9NLlxuIik7Cit9CiBFWFBPUlRfU1lNQk9MKHNuX3Byb21fZmVhdHVyZV9hdmFpbGFibGUpOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9od3BlcmYuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCmluZGV4IDQ2MmVhMTcuLjMzMzY3OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCkBAIC0xODksNyArMTg5LDcgQEAKIAlpbnQgZTsKIAogCWZvciAoc3ogPSBQQUdFX1NJWkU7IHN6IDwgMTYgKiBQQUdFX1NJWkU7IHN6ICs9IFBBR0VfU0laRSkgewotCQlpZiAoIShwID0gKGNoYXIgKilrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKSkpCisJCWlmICghKHAgPSBrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKSkpCiAJCQlicmVhazsKIAkJZSA9IGlhNjRfc25faW9pZl9nZXRfcGNpX3RvcG9sb2d5KF9fcGEocCksIHN6KTsKIAkJaWYgKGUgPT0gU0FMUkVUX09LKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCmluZGV4IGZlYWYxYTYuLjQ5MzM4MGIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKQEAgLTU1Miw3ICs1NTIsNyBAQAogCWJ1c191bnJlZ2lzdGVyKCZ0aW9jeF9idXNfdHlwZSk7CiB9CiAKLXN1YnN5c19pbml0Y2FsbCh0aW9jeF9pbml0KTsKK2ZzX2luaXRjYWxsKHRpb2N4X2luaXQpOwogbW9kdWxlX2V4aXQodGlvY3hfZXhpdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX2NoYW5uZWwuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX2NoYW5uZWwuYwppbmRleCAxZjM1NDA4Li5jMDhkYjljIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19jaGFubmVsLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfY2hhbm5lbC5jCkBAIC02MzIsNyArNjMyLDcgQEAKIAkJY2gtPm51bWJlciwgY2gtPnBhcnRpZCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+bG9jaywgKmlycV9mbGFncyk7Ci0JeHBjX2NyZWF0ZV9rdGhyZWFkcyhjaCwgMSk7CisJeHBjX2NyZWF0ZV9rdGhyZWFkcyhjaCwgMSwgMCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5sb2NrLCAqaXJxX2ZsYWdzKTsKIH0KIApAQCAtNzU0LDEyICs3NTQsMTIgQEAKIAogCS8qIG1ha2Ugc3VyZSBhbGwgYWN0aXZpdHkgaGFzIHNldHRsZWQgZG93biBmaXJzdCAqLwogCi0JaWYgKGF0b21pY19yZWFkKCZjaC0+cmVmZXJlbmNlcykgPiAwIHx8Ci0JCQkoKGNoLT5mbGFncyAmIFhQQ19DX0NPTk5FQ1RFRENBTExPVVRfTUFERSkgJiYKLQkJCSEoY2gtPmZsYWdzICYgWFBDX0NfRElTQ09OTkVDVElOR0NBTExPVVRfTUFERSkpKSB7CisJaWYgKGF0b21pY19yZWFkKCZjaC0+a3RocmVhZHNfYXNzaWduZWQpID4gMCB8fAorCQkJCWF0b21pY19yZWFkKCZjaC0+cmVmZXJlbmNlcykgPiAwKSB7CiAJCXJldHVybjsKIAl9Ci0JREJVR19PTihhdG9taWNfcmVhZCgmY2gtPmt0aHJlYWRzX2Fzc2lnbmVkKSAhPSAwKTsKKwlEQlVHX09OKChjaC0+ZmxhZ3MgJiBYUENfQ19DT05ORUNURURDQUxMT1VUX01BREUpICYmCisJCQkhKGNoLT5mbGFncyAmIFhQQ19DX0RJU0NPTk5FQ1RJTkdDQUxMT1VUX01BREUpKTsKIAogCWlmIChwYXJ0LT5hY3Rfc3RhdGUgPT0gWFBDX1BfREVBQ1RJVkFUSU5HKSB7CiAJCS8qIGNhbid0IHByb2NlZWQgdW50aWwgdGhlIG90aGVyIHNpZGUgZGlzZW5nYWdlcyBmcm9tIHVzICovCkBAIC0xNjUxLDYgKzE2NTEsMTEgQEAKIAkvKiB3YWtlIGFsbCBpZGxlIGt0aHJlYWRzIHNvIHRoZXkgY2FuIGV4aXQgKi8KIAlpZiAoYXRvbWljX3JlYWQoJmNoLT5rdGhyZWFkc19pZGxlKSA+IDApIHsKIAkJd2FrZV91cF9hbGwoJmNoLT5pZGxlX3dxKTsKKworCX0gZWxzZSBpZiAoKGNoLT5mbGFncyAmIFhQQ19DX0NPTk5FQ1RFRENBTExPVVRfTUFERSkgJiYKKwkJCSEoY2gtPmZsYWdzICYgWFBDX0NfRElTQ09OTkVDVElOR0NBTExPVVQpKSB7CisJCS8qIHN0YXJ0IGEga3RocmVhZCB0aGF0IHdpbGwgZG8gdGhlIHhwY0Rpc2Nvbm5lY3RpbmcgY2FsbG91dCAqLworCQl4cGNfY3JlYXRlX2t0aHJlYWRzKGNoLCAxLCAxKTsKIAl9CiAKIAkvKiB3YWtlIHRob3NlIHdhaXRpbmcgdG8gYWxsb2NhdGUgYW4gZW50cnkgZnJvbSB0aGUgbG9jYWwgbXNnIHF1ZXVlICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMKaW5kZXggZmE5NmRmYy4uN2EzODdkMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYwpAQCAtNjgxLDcgKzY4MSw3IEBACiAJZGV2X2RiZyh4cGNfY2hhbiwgImNyZWF0ZSAlZCBuZXcga3RocmVhZHMsIHBhcnRpZD0lZCwgY2hhbm5lbD0lZFxuIiwKIAkJbmVlZGVkLCBjaC0+cGFydGlkLCBjaC0+bnVtYmVyKTsKIAotCXhwY19jcmVhdGVfa3RocmVhZHMoY2gsIG5lZWRlZCk7CisJeHBjX2NyZWF0ZV9rdGhyZWFkcyhjaCwgbmVlZGVkLCAwKTsKIH0KIAogCkBAIC03NzUsMjYgKzc3NSwyOCBAQAogCQl4cGNfa3RocmVhZF93YWl0bXNncyhwYXJ0LCBjaCk7CiAJfQogCi0JaWYgKGF0b21pY19kZWNfcmV0dXJuKCZjaC0+a3RocmVhZHNfYXNzaWduZWQpID09IDApIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5sb2NrLCBpcnFfZmxhZ3MpOwotCQlpZiAoKGNoLT5mbGFncyAmIFhQQ19DX0NPTk5FQ1RFRENBTExPVVRfTUFERSkgJiYKLQkJCQkhKGNoLT5mbGFncyAmIFhQQ19DX0RJU0NPTk5FQ1RJTkdDQUxMT1VUKSkgewotCQkJY2gtPmZsYWdzIHw9IFhQQ19DX0RJU0NPTk5FQ1RJTkdDQUxMT1VUOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmxvY2ssIGlycV9mbGFncyk7CisJLyogbGV0IHJlZ2lzdGVyZXIga25vdyB0aGF0IGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGluZyAqLwogCi0JCQl4cGNfZGlzY29ubmVjdF9jYWxsb3V0KGNoLCB4cGNEaXNjb25uZWN0aW5nKTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5sb2NrLCBpcnFfZmxhZ3MpOwotCQkJY2gtPmZsYWdzIHw9IFhQQ19DX0RJU0NPTk5FQ1RJTkdDQUxMT1VUX01BREU7Ci0JCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmxvY2ssIGlycV9mbGFncyk7CisJaWYgKChjaC0+ZmxhZ3MgJiBYUENfQ19DT05ORUNURURDQUxMT1VUX01BREUpICYmCisJCQkhKGNoLT5mbGFncyAmIFhQQ19DX0RJU0NPTk5FQ1RJTkdDQUxMT1VUKSkgeworCQljaC0+ZmxhZ3MgfD0gWFBDX0NfRElTQ09OTkVDVElOR0NBTExPVVQ7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJCXhwY19kaXNjb25uZWN0X2NhbGxvdXQoY2gsIHhwY0Rpc2Nvbm5lY3RpbmcpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+bG9jaywgaXJxX2ZsYWdzKTsKKwkJY2gtPmZsYWdzIHw9IFhQQ19DX0RJU0NPTk5FQ1RJTkdDQUxMT1VUX01BREU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZjaC0+a3RocmVhZHNfYXNzaWduZWQpID09IDApIHsKIAkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZwYXJ0LT5uY2hhbm5lbHNfZW5nYWdlZCkgPT0gMCkgewogCQkJeHBjX21hcmtfcGFydGl0aW9uX2Rpc2VuZ2FnZWQocGFydCk7CiAJCQl4cGNfSVBJX3NlbmRfZGlzZW5nYWdlKHBhcnQpOwogCQl9CiAJfQogCi0KIAl4cGNfbXNncXVldWVfZGVyZWYoY2gpOwogCiAJZGV2X2RiZyh4cGNfY2hhbiwgImt0aHJlYWQgZXhpdGluZywgcGFydGlkPSVkLCBjaGFubmVsPSVkXG4iLApAQCAtODE4LDcgKzgyMCw4IEBACiAgKiBwYXJ0aXRpb24uCiAgKi8KIHZvaWQKLXhwY19jcmVhdGVfa3RocmVhZHMoc3RydWN0IHhwY19jaGFubmVsICpjaCwgaW50IG5lZWRlZCkKK3hwY19jcmVhdGVfa3RocmVhZHMoc3RydWN0IHhwY19jaGFubmVsICpjaCwgaW50IG5lZWRlZCwKKwkJCWludCBpZ25vcmVfZGlzY29ubmVjdGluZykKIHsKIAl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKIAlwaWRfdCBwaWQ7CkBAIC04MzMsMTYgKzgzNiwzOCBAQAogCQkgKiBrdGhyZWFkLiBUaGF0IGt0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIGRvaW5nIHRoZQogCQkgKiBjb3VudGVycGFydCB0byB0aGUgZm9sbG93aW5nIGJlZm9yZSBpdCBleGl0cy4KIAkJICovCisJCWlmIChpZ25vcmVfZGlzY29ubmVjdGluZykgeworCQkJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZjaC0+a3RocmVhZHNfYXNzaWduZWQpKSB7CisJCQkJLyoga3RocmVhZHMgYXNzaWduZWQgaGFkIGdvbmUgdG8gemVybyAqLworCQkJCUJVR19PTighKGNoLT5mbGFncyAmCisJCQkJCVhQQ19DX0RJU0NPTk5FQ1RJTkdDQUxMT1VUX01BREUpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQl9IGVsc2UgaWYgKGNoLT5mbGFncyAmIFhQQ19DX0RJU0NPTk5FQ1RJTkcpIHsKKwkJCWJyZWFrOworCisJCX0gZWxzZSBpZiAoYXRvbWljX2luY19yZXR1cm4oJmNoLT5rdGhyZWFkc19hc3NpZ25lZCkgPT0gMSkgeworCQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZwYXJ0LT5uY2hhbm5lbHNfZW5nYWdlZCkgPT0gMSkKKwkJCQl4cGNfbWFya19wYXJ0aXRpb25fZW5nYWdlZChwYXJ0KTsKKwkJfQogCQkodm9pZCkgeHBjX3BhcnRfcmVmKHBhcnQpOwogCQl4cGNfbXNncXVldWVfcmVmKGNoKTsKLQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZjaC0+a3RocmVhZHNfYXNzaWduZWQpID09IDEgJiYKLQkJICAgIGF0b21pY19pbmNfcmV0dXJuKCZwYXJ0LT5uY2hhbm5lbHNfZW5nYWdlZCkgPT0gMSkgewotCQkJeHBjX21hcmtfcGFydGl0aW9uX2VuZ2FnZWQocGFydCk7Ci0JCX0KIAogCQlwaWQgPSBrZXJuZWxfdGhyZWFkKHhwY19kYWVtb25pemVfa3RocmVhZCwgKHZvaWQgKikgYXJncywgMCk7CiAJCWlmIChwaWQgPCAwKSB7CiAJCQkvKiB0aGUgZm9yayBmYWlsZWQgKi8KKworCQkJLyoKKwkJCSAqIE5PVEU6IGlmIChpZ25vcmVfZGlzY29ubmVjdGluZyAmJgorCQkJICogIShjaC0+ZmxhZ3MgJiBYUENfQ19ESVNDT05ORUNUSU5HQ0FMTE9VVCkpIGlzIHRydWUsCisJCQkgKiB0aGVuIHdlJ2xsIGRlYWRsb2NrIGlmIGFsbCBvdGhlciBrdGhyZWFkcyBhc3NpZ25lZAorCQkJICogdG8gdGhpcyBjaGFubmVsIGFyZSBibG9ja2VkIGluIHRoZSBjaGFubmVsJ3MKKwkJCSAqIHJlZ2lzdGVyZXIsIGJlY2F1c2UgdGhlIG9ubHkgdGhpbmcgdGhhdCB3aWxsIHVuYmxvY2sKKwkJCSAqIHRoZW0gaXMgdGhlIHhwY0Rpc2Nvbm5lY3RpbmcgY2FsbG91dCB0aGF0IHRoaXMKKwkJCSAqIGZhaWxlZCBrZXJuZWxfdGhyZWFkIHdvdWxkIGhhdmUgbWFkZS4KKwkJCSAqLworCiAJCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmNoLT5rdGhyZWFkc19hc3NpZ25lZCkgPT0gMCAmJgogCQkJICAgIGF0b21pY19kZWNfcmV0dXJuKCZwYXJ0LT5uY2hhbm5lbHNfZW5nYWdlZCkgPT0gMCkgewogCQkJCXhwY19tYXJrX3BhcnRpdGlvbl9kaXNlbmdhZ2VkKHBhcnQpOwpAQCAtODU3LDkgKzg4Miw2IEBACiAJCQkJICogRmxhZyB0aGlzIGFzIGFuIGVycm9yIG9ubHkgaWYgd2UgaGF2ZSBhbgogCQkJCSAqIGluc3VmZmljaWVudCAjb2Yga3RocmVhZHMgZm9yIHRoZSBjaGFubmVsCiAJCQkJICogdG8gZnVuY3Rpb24uCi0JCQkJICoKLQkJCQkgKiBObyB4cGNfbXNncXVldWVfcmVmKCkgaXMgbmVlZGVkIGhlcmUgc2luY2UKLQkJCQkgKiB0aGUgY2hhbm5lbCBtZ3IgaXMgZG9pbmcgdGhpcy4KIAkJCQkgKi8KIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmxvY2ssIGlycV9mbGFncyk7CiAJCQkJWFBDX0RJU0NPTk5FQ1RfQ0hBTk5FTChjaCwgeHBjTGFja09mUmVzb3VyY2VzLApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCmluZGV4IDI3ZGQ3ZGYuLjY4NDZkYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0LCAyMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0xMDksNyArMTA5LDYgQEAKIHBjaWJyX2J1c19maXh1cChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKnByb21fYnVzc29mdCwgc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyKQogewogCWludCBuYXNpZCwgY25vZGUsIGo7Ci0JY25vZGVpZF90IG5lYXJfY25vZGU7CiAJc3RydWN0IGh1YmRldl9pbmZvICpodWJkZXZfaW5mbzsKIAlzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQ7CiAJc3RydWN0IHNuX2ZsdXNoX2RldmljZV9rZXJuZWwgKnNuX2ZsdXNoX2RldmljZV9rZXJuZWw7CkBAIC0xODYsMjAgKzE4NSw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChwcm9tX2J1c3NvZnQtPmJzX2FzaWNfdHlwZSA9PSBQQ0lJT19BU0lDX1RZUEVfVElPQ1ApIHsKLQkJLyogVElPIFBDSSBCcmlkZ2U6IGZpbmQgbmVhcmVzdCBub2RlIHdpdGggQ1BVcyAqLwotCQlpbnQgZSA9IHNuX2h3cGVyZl9nZXRfbmVhcmVzdF9ub2RlKGNub2RlLCBOVUxMLCAmbmVhcl9jbm9kZSk7Ci0KLQkJaWYgKGUgPCAwKSB7Ci0JCQluZWFyX2Nub2RlID0gKGNub2RlaWRfdCktMTsgLyogdXNlIGFueSBub2RlICovCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2licl9idXNfZml4dXA6IGZhaWxlZCB0byBmaW5kICIKLQkJCQkibmVhciBub2RlIHdpdGggQ1BVcyB0byBUSU8gbm9kZSAlZCwgZXJyPSVkXG4iLAotCQkJCWNub2RlLCBlKTsKLQkJfQotCQljb250cm9sbGVyLT5ub2RlID0gbmVhcl9jbm9kZTsKLQl9Ci0JZWxzZQotCQljb250cm9sbGVyLT5ub2RlID0gY25vZGU7CiAJcmV0dXJuIHNvZnQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2VfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2VfcHJvdmlkZXIuYwppbmRleCA0NmUxNmRjLi4zNWY4NTRmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3Rpb2NlX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jZV9wcm92aWRlci5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi90aW9jZV9wcm92aWRlci5oPgotI2luY2x1ZGUgPGFzbS9zbi9zbjIvc25faHdwZXJmLmg+CiAKIC8qCiAgKiAxLzI2LzIwMDYKQEAgLTk5MCw4ICs5ODksNiBAQAogc3RhdGljIHZvaWQgKgogdGlvY2VfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0LCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCiB7Ci0JaW50IG15X25hc2lkOwotCWNub2RlaWRfdCBteV9jbm9kZSwgbWVtX2Nub2RlOwogCXN0cnVjdCB0aW9jZV9jb21tb24gKnRpb2NlX2NvbW1vbjsKIAlzdHJ1Y3QgdGlvY2Vfa2VybmVsICp0aW9jZV9rZXJuOwogCXN0cnVjdCB0aW9jZSBfX2lvbWVtICp0aW9jZV9tbXI7CkBAIC0xMDM1LDIxICsxMDMyLDYgQEAKIAkJICAgICAgIHRpb2NlX2NvbW1vbi0+Y2VfcGNpYnVzLmJzX3BlcnNpc3Rfc2VnbWVudCwKIAkJICAgICAgIHRpb2NlX2NvbW1vbi0+Y2VfcGNpYnVzLmJzX3BlcnNpc3RfYnVzbnVtKTsKIAotCS8qCi0JICogaWRlbnRpZnkgY2xvc2VzdCBuYXNpZCBmb3IgbWVtb3J5IGFsbG9jYXRpb25zCi0JICovCi0KLQlteV9uYXNpZCA9IE5BU0lEX0dFVCh0aW9jZV9jb21tb24tPmNlX3BjaWJ1cy5ic19iYXNlKTsKLQlteV9jbm9kZSA9IG5hc2lkX3RvX2Nub2RlaWQobXlfbmFzaWQpOwotCi0JaWYgKHNuX2h3cGVyZl9nZXRfbmVhcmVzdF9ub2RlKG15X2Nub2RlLCAmbWVtX2Nub2RlLCBOVUxMKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGlvY2VfYnVzX2ZpeHVwOiBmYWlsZWQgdG8gZmluZCAiCi0JCSAgICAgICAiY2xvc2VzdCBub2RlIHdpdGggTUVNIHRvIFRJTyBub2RlICVkXG4iLCBteV9jbm9kZSk7Ci0JCW1lbV9jbm9kZSA9IChjbm9kZWlkX3QpLTE7IC8qIHVzZSBhbnkgbm9kZSAqLwotCX0KLQotCWNvbnRyb2xsZXItPm5vZGUgPSBtZW1fY25vZGU7Ci0KIAlyZXR1cm4gdGlvY2VfY29tbW9uOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvS2NvbmZpZyBiL2FyY2gvbTMyci9LY29uZmlnCmluZGV4IDQxZmQ0OTAuLmYzODNkYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9LY29uZmlnCisrKyBiL2FyY2gvbTMyci9LY29uZmlnCkBAIC0yMTQsNiArMjE0LDE0IEBACiAJYm9vbAogCWRlZmF1bHQgbgogCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2Jvb3QvY29tcHJlc3NlZC9tMzJyX3Npby5jIGIvYXJjaC9tMzJyL2Jvb3QvY29tcHJlc3NlZC9tMzJyX3Npby5jCmluZGV4IGJjZThhZjUuLmVlM2M4YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9ib290L2NvbXByZXNzZWQvbTMycl9zaW8uYworKysgYi9hcmNoL20zMnIvYm9vdC9jb21wcmVzc2VkL20zMnJfc2lvLmMKQEAgLTIsNiArMiw3IEBACiAgKiBhcmNoL20zMnIvYm9vdC9jb21wcmVzc2VkL20zMnJfc2lvLmMKICAqCiAgKiAyMDAzLTAyLTEyOglUYWtlbyBUYWthaGFzaGkKKyAqIDIwMDYtMTEtMzA6CU9QU1BVVCBzdXBwb3J0IGJ5IEthenVoaXJvIEluYW9rYQogICoKICAqLwogCkBAIC0xNiw3ICsxNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUX0FscGhhKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUKQorI2lmIGRlZmluZWQoQ09ORklHX1BMQVRfTTMyNzAwVVRfQWxwaGEpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfTTMyNzAwVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfT1BTUFVUKQogI2luY2x1ZGUgPGFzbS9tMzJyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKQEAgLTMxLDcgKzMyLDExIEBACiAjZGVmaW5lIEJPT1RfU0lPMFRYQgkodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoMHgwMmMwMDAwMCArIDB4MjAwMGMpCiAjZWxzZQogI3VuZGVmIFBMRF9CQVNFCisjaWYgZGVmaW5lZChDT05GSUdfUExBVF9PUFNQVVQpCisjZGVmaW5lIFBMRF9CQVNFCTB4MWNjMDAwMDAKKyNlbHNlCiAjZGVmaW5lIFBMRF9CQVNFCTB4YTRjMDAwMDAKKyNlbmRpZgogI2RlZmluZSBCT09UX1NJTzBTVFMJUExEX0VTSU8wU1RTCiAjZGVmaW5lIEJPT1RfU0lPMFRYQglQTERfRVNJTzBUWEIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9tMzJyL2tlcm5lbC9lbnRyeS5TCmluZGV4IGFjNmQ4NDAuLmEyYzQ3MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL20zMnIva2VybmVsL2VudHJ5LlMKQEAgLTIzLDM1ICsyMywzNSBAQAogICoJdXBkYXRlZCBpbiBmb3JrLmM6Y29weV90aHJlYWQsIHNpZ25hbC5jOmRvX3NpZ25hbCwKICAqCXB0cmFjZS5jIGFuZCBwdHJhY2UuaAogICoKLSAqIE0zMlJ4L00zMlIyCQkJCU0zMlIKLSAqICAgICAgIEAoc3ApICAgICAgLSByNAkJZGl0dG8KLSAqICAgICAgIEAoMHgwNCxzcCkgLSByNQkJZGl0dG8KLSAqICAgICAgIEAoMHgwOCxzcCkgLSByNgkJZGl0dG8KLSAqICAgICAgIEAoMHgwYyxzcCkgLSAqcHRfcmVncwkJZGl0dG8KLSAqICAgICAgIEAoMHgxMCxzcCkgLSByMAkJZGl0dG8KLSAqICAgICAgIEAoMHgxNCxzcCkgLSByMQkJZGl0dG8KLSAqICAgICAgIEAoMHgxOCxzcCkgLSByMgkJZGl0dG8KLSAqICAgICAgIEAoMHgxYyxzcCkgLSByMwkJZGl0dG8KLSAqICAgICAgIEAoMHgyMCxzcCkgLSByNwkJZGl0dG8KLSAqICAgICAgIEAoMHgyNCxzcCkgLSByOAkJZGl0dG8KLSAqICAgICAgIEAoMHgyOCxzcCkgLSByOQkJZGl0dG8KLSAqICAgICAgIEAoMHgyYyxzcCkgLSByMTAJCWRpdHRvCi0gKiAgICAgICBAKDB4MzAsc3ApIC0gcjExCQlkaXR0bwotICogICAgICAgQCgweDM0LHNwKSAtIHIxMgkJZGl0dG8KLSAqICAgICAgIEAoMHgzOCxzcCkgLSBzeXNjYWxsX25yCWRpdHRvCi0gKiAgICAgICBAKDB4M2Msc3ApIC0gYWNjMGgJCUAoMHgzYyxzcCkgLSBhY2NoCi0gKiAgICAgICBAKDB4NDAsc3ApIC0gYWNjMGwJCUAoMHg0MCxzcCkgLSBhY2NsCi0gKiAgICAgICBAKDB4NDQsc3ApIC0gYWNjMWgJCUAoMHg0NCxzcCkgLSBkdW1teV9hY2MxaAotICogICAgICAgQCgweDQ4LHNwKSAtIGFjYzFsCQlAKDB4NDgsc3ApIC0gZHVtbXlfYWNjMWwKLSAqICAgICAgIEAoMHg0YyxzcCkgLSBwc3cJCWRpdHRvCi0gKiAgICAgICBAKDB4NTAsc3ApIC0gYnBjCQlkaXR0bwotICogICAgICAgQCgweDU0LHNwKSAtIGJicHN3CQlkaXR0bwotICogICAgICAgQCgweDU4LHNwKSAtIGJicGMJCWRpdHRvCi0gKiAgICAgICBAKDB4NWMsc3ApIC0gc3B1IChjcjMpCQlkaXR0bwotICogICAgICAgQCgweDYwLHNwKSAtIGZwIChyMTMpCQlkaXR0bwotICogICAgICAgQCgweDY0LHNwKSAtIGxyIChyMTQpCQlkaXR0bwotICogICAgICAgQCgweDY4LHNwKSAtIHNwaSAoY3IyKQkJZGl0dG8KLSAqICAgICAgIEAoMHg2YyxzcCkgLSBvcmlnX3IwCQlkaXR0bworICogTTMyUi9NMzJSeC9NMzJSMgorICogICAgICAgQChzcCkgICAgICAtIHI0CisgKiAgICAgICBAKDB4MDQsc3ApIC0gcjUKKyAqICAgICAgIEAoMHgwOCxzcCkgLSByNgorICogICAgICAgQCgweDBjLHNwKSAtICpwdF9yZWdzCisgKiAgICAgICBAKDB4MTAsc3ApIC0gcjAKKyAqICAgICAgIEAoMHgxNCxzcCkgLSByMQorICogICAgICAgQCgweDE4LHNwKSAtIHIyCisgKiAgICAgICBAKDB4MWMsc3ApIC0gcjMKKyAqICAgICAgIEAoMHgyMCxzcCkgLSByNworICogICAgICAgQCgweDI0LHNwKSAtIHI4CisgKiAgICAgICBAKDB4Mjgsc3ApIC0gcjkKKyAqICAgICAgIEAoMHgyYyxzcCkgLSByMTAKKyAqICAgICAgIEAoMHgzMCxzcCkgLSByMTEKKyAqICAgICAgIEAoMHgzNCxzcCkgLSByMTIKKyAqICAgICAgIEAoMHgzOCxzcCkgLSBzeXNjYWxsX25yCisgKiAgICAgICBAKDB4M2Msc3ApIC0gYWNjMGgKKyAqICAgICAgIEAoMHg0MCxzcCkgLSBhY2MwbAorICogICAgICAgQCgweDQ0LHNwKSAtIGFjYzFoCQk7IElTQV9EU1BfTEVWRUwyIG9ubHkKKyAqICAgICAgIEAoMHg0OCxzcCkgLSBhY2MxbAkJOyBJU0FfRFNQX0xFVkVMMiBvbmx5CisgKiAgICAgICBAKDB4NGMsc3ApIC0gcHN3CisgKiAgICAgICBAKDB4NTAsc3ApIC0gYnBjCisgKiAgICAgICBAKDB4NTQsc3ApIC0gYmJwc3cKKyAqICAgICAgIEAoMHg1OCxzcCkgLSBiYnBjCisgKiAgICAgICBAKDB4NWMsc3ApIC0gc3B1IChjcjMpCisgKiAgICAgICBAKDB4NjAsc3ApIC0gZnAgKHIxMykKKyAqICAgICAgIEAoMHg2NCxzcCkgLSBsciAocjE0KQorICogICAgICAgQCgweDY4LHNwKSAtIHNwaSAoY3IyKQorICogICAgICAgQCgweDZjLHNwKSAtIG9yaWdfcjAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpAQCAtOTUsMTcgKzk1LDEwIEBACiAjZGVmaW5lIFIxMShyZWcpCQlAKDB4MzAscmVnKQogI2RlZmluZSBSMTIocmVnKQkJQCgweDM0LHJlZykKICNkZWZpbmUgU1lTQ0FMTF9OUihyZWcpCQlAKDB4MzgscmVnKQotI2lmIGRlZmluZWQoQ09ORklHX0lTQV9NMzJSMikgJiYgZGVmaW5lZChDT05GSUdfSVNBX0RTUF9MRVZFTDIpCiAjZGVmaW5lIEFDQzBIKHJlZykJCUAoMHgzQyxyZWcpCiAjZGVmaW5lIEFDQzBMKHJlZykJCUAoMHg0MCxyZWcpCiAjZGVmaW5lIEFDQzFIKHJlZykJCUAoMHg0NCxyZWcpCiAjZGVmaW5lIEFDQzFMKHJlZykJCUAoMHg0OCxyZWcpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19JU0FfTTMyUjIpIHx8IGRlZmluZWQoQ09ORklHX0lTQV9NMzJSKQotI2RlZmluZSBBQ0NIKHJlZykJCUAoMHgzQyxyZWcpCi0jZGVmaW5lIEFDQ0wocmVnKQkJQCgweDQwLHJlZykKLSNlbHNlCi0jZXJyb3IgdW5rbm93biBpc2EgY29uZmlndXJhdGlvbgotI2VuZGlmCiAjZGVmaW5lIFBTVyhyZWcpCQlAKDB4NEMscmVnKQogI2RlZmluZSBCUEMocmVnKQkJQCgweDUwLHJlZykKICNkZWZpbmUgQkJQU1cocmVnKQkJQCgweDU0LHJlZykKQEAgLTYwMyw4ICs1OTYsNiBAQAogCWJlcXoJcjEsIGluc3QKIG9wcmFuZDoKIAlsZAlyMiwgQChsb3coTURFVkFfb2Zmc2V0KSxyMikJOyBzZXQgYWRkcmVzcwotCXNybGkJcjIsICMxMgotCXNsbGkJcjIsICMxMgogCXNybGkJcjEsICMxCiAJYnJhCTFmCiBpbnN0OgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9pb19vcHNwdXQuYyBiL2FyY2gvbTMyci9rZXJuZWwvaW9fb3BzcHV0LmMKaW5kZXggZGE2YzVmNS4uM2NiYjFmNyAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9pb19vcHNwdXQuYworKysgYi9hcmNoL20zMnIva2VybmVsL2lvX29wc3B1dC5jCkBAIC0zMCwxNCArMzAsMzQgQEAKIGV4dGVybiB2b2lkIHBjY19pb3dyaXRlX3dvcmQoaW50LCB1bnNpZ25lZCBsb25nLCB2b2lkICosIHNpemVfdCwgc2l6ZV90LCBpbnQpOwogI2VuZGlmIC8qIENPTkZJR19QQ01DSUEgJiYgQ09ORklHX00zMlJfQ0ZDICovCiAKLSNkZWZpbmUgUE9SVDJBRERSKHBvcnQpICBfcG9ydDJhZGRyKHBvcnQpCi0jZGVmaW5lIFBPUlQyQUREUl9VU0IocG9ydCkgX3BvcnQyYWRkcl91c2IocG9ydCkKKyNkZWZpbmUgUE9SVDJBRERSKHBvcnQpCQlfcG9ydDJhZGRyKHBvcnQpCisjZGVmaW5lIFBPUlQyQUREUl9VU0IocG9ydCkJX3BvcnQyYWRkcl91c2IocG9ydCkKIAogc3RhdGljIGlubGluZSB2b2lkICpfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlyZXR1cm4gKHZvaWQgKikocG9ydCB8IE5PTkNBQ0hFX09GRlNFVCk7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JREUpICYmICFkZWZpbmVkKENPTkZJR19NMzJSX0NGQykKK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19wb3J0MmFkZHJfYXRhKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlzdGF0aWMgaW50CWR1bW15X3JlZzsKKworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMHgxZjA6CXJldHVybiAodm9pZCAqKSgweDBjMDAyMDAwIHwgTk9OQ0FDSEVfT0ZGU0VUKTsKKwljYXNlIDB4MWYxOglyZXR1cm4gKHZvaWQgKikoMHgwYzAxMjgwMCB8IE5PTkNBQ0hFX09GRlNFVCk7CisJY2FzZSAweDFmMjoJcmV0dXJuICh2b2lkICopKDB4MGMwMTIwMDIgfCBOT05DQUNIRV9PRkZTRVQpOworCWNhc2UgMHgxZjM6CXJldHVybiAodm9pZCAqKSgweDBjMDEyODAyIHwgTk9OQ0FDSEVfT0ZGU0VUKTsKKwljYXNlIDB4MWY0OglyZXR1cm4gKHZvaWQgKikoMHgwYzAxMjAwNCB8IE5PTkNBQ0hFX09GRlNFVCk7CisJY2FzZSAweDFmNToJcmV0dXJuICh2b2lkICopKDB4MGMwMTI4MDQgfCBOT05DQUNIRV9PRkZTRVQpOworCWNhc2UgMHgxZjY6CXJldHVybiAodm9pZCAqKSgweDBjMDEyMDA2IHwgTk9OQ0FDSEVfT0ZGU0VUKTsKKwljYXNlIDB4MWY3OglyZXR1cm4gKHZvaWQgKikoMHgwYzAxMjgwNiB8IE5PTkNBQ0hFX09GRlNFVCk7CisJY2FzZSAweDNmNjoJcmV0dXJuICh2b2lkICopKDB4MGMwMTIwMGUgfCBOT05DQUNIRV9PRkZTRVQpOworCWRlZmF1bHQ6IAlyZXR1cm4gKHZvaWQgKikmZHVtbXlfcmVnOworCX0KK30KKyNlbmRpZgorCiAvKgogICogT1BTUFVULUxBTiBpcyBsb2NhdGVkIGluIHRoZSBleHRlbmRlZCBidXMgc3BhY2UKICAqIGZyb20gMHgxMDAwMDAwMCB0byAweDEzZmZmZmZmIG9uIHBoeXNpY2FsIGFkZHJlc3MuCkBAIC05Nyw2ICsxMTcsMTIgQEAKIHsKIAlpZiAocG9ydCA+PSBMQU5fSU9TVEFSVCAmJiBwb3J0IDwgTEFOX0lPRU5EKQogCQlyZXR1cm4gX25lX2luYihQT1JUMkFERFJfTkUocG9ydCkpOworCisjaWYgZGVmaW5lZChDT05GSUdfSURFKSAmJiAhZGVmaW5lZChDT05GSUdfTTMyUl9DRkMpCisJZWxzZSBpZiAoKHBvcnQgPj0gMHgxZjAgJiYgcG9ydCA8PTB4MWY3KSB8fCBwb3J0ID09IDB4M2Y2KSB7CisJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilfX3BvcnQyYWRkcl9hdGEocG9ydCk7CisJfQorI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfUENNQ0lBKSAmJiBkZWZpbmVkKENPTkZJR19NMzJSX0NGQykKIAllbHNlIGlmIChwb3J0ID49IE0zMlJfUENDX0lPU1RBUlQwICYmIHBvcnQgPD0gTTMyUl9QQ0NfSU9FTkQwKSB7CiAJCXVuc2lnbmVkIGNoYXIgYjsKQEAgLTExMiw2ICsxMzgsMTEgQEAKIHsKIAlpZiAocG9ydCA+PSBMQU5fSU9TVEFSVCAmJiBwb3J0IDwgTEFOX0lPRU5EKQogCQlyZXR1cm4gX25lX2ludyhQT1JUMkFERFJfTkUocG9ydCkpOworI2lmIGRlZmluZWQoQ09ORklHX0lERSkgJiYgIWRlZmluZWQoQ09ORklHX00zMlJfQ0ZDKQorCWVsc2UgaWYgKChwb3J0ID49IDB4MWYwICYmIHBvcnQgPD0weDFmNykgfHwgcG9ydCA9PSAweDNmNikgeworCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKV9fcG9ydDJhZGRyX2F0YShwb3J0KTsKKwl9CisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19VU0IpCiAJZWxzZSBpZihwb3J0ID49IDB4MzQwICYmIHBvcnQgPCAweDNhMCkKIAkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQT1JUMkFERFJfVVNCKHBvcnQpOwpAQCAtMTY0LDYgKzE5NSwxMSBAQAogCWlmIChwb3J0ID49IExBTl9JT1NUQVJUICYmIHBvcnQgPCBMQU5fSU9FTkQpCiAJCV9uZV9vdXRiKGIsIFBPUlQyQUREUl9ORShwb3J0KSk7CiAJZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX0lERSkgJiYgIWRlZmluZWQoQ09ORklHX00zMlJfQ0ZDKQorCWlmICgocG9ydCA+PSAweDFmMCAmJiBwb3J0IDw9MHgxZjcpIHx8IHBvcnQgPT0gMHgzZjYpIHsKKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopX19wb3J0MmFkZHJfYXRhKHBvcnQpID0gYjsKKwl9IGVsc2UKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1BDTUNJQSkgJiYgZGVmaW5lZChDT05GSUdfTTMyUl9DRkMpCiAJaWYgKHBvcnQgPj0gTTMyUl9QQ0NfSU9TVEFSVDAgJiYgcG9ydCA8PSBNMzJSX1BDQ19JT0VORDApIHsKIAkJcGNjX2lvd3JpdGVfYnl0ZSgwLCBwb3J0LCAmYiwgc2l6ZW9mKGIpLCAxLCAwKTsKQEAgLTE3Nyw2ICsyMTMsMTEgQEAKIAlpZiAocG9ydCA+PSBMQU5fSU9TVEFSVCAmJiBwb3J0IDwgTEFOX0lPRU5EKQogCQlfbmVfb3V0dyh3LCBQT1JUMkFERFJfTkUocG9ydCkpOwogCWVsc2UKKyNpZiBkZWZpbmVkKENPTkZJR19JREUpICYmICFkZWZpbmVkKENPTkZJR19NMzJSX0NGQykKKwlpZiAoKHBvcnQgPj0gMHgxZjAgJiYgcG9ydCA8PTB4MWY3KSB8fCBwb3J0ID09IDB4M2Y2KSB7CisJCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilfX3BvcnQyYWRkcl9hdGEocG9ydCkgPSB3OworCX0gZWxzZQorI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCKQogCWlmKHBvcnQgPj0gMHgzNDAgJiYgcG9ydCA8IDB4M2EwKQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopUE9SVDJBRERSX1VTQihwb3J0KSA9IHc7CkBAIC0yMjIsNiArMjYzLDE0IEBACiB7CiAJaWYgKHBvcnQgPj0gTEFOX0lPU1RBUlQgJiYgcG9ydCA8IExBTl9JT0VORCkKIAkJX25lX2luc2IoUE9SVDJBRERSX05FKHBvcnQpLCBhZGRyLCBjb3VudCk7CisjaWYgZGVmaW5lZChDT05GSUdfSURFKSAmJiAhZGVmaW5lZChDT05GSUdfTTMyUl9DRkMpCisJZWxzZSBpZiAoKHBvcnQgPj0gMHgxZjAgJiYgcG9ydCA8PTB4MWY3KSB8fCBwb3J0ID09IDB4M2Y2KSB7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGFkZHI7CisJCXVuc2lnbmVkIGNoYXIgKnBvcnRwID0gX19wb3J0MmFkZHJfYXRhKHBvcnQpOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpidWYrKyA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnRwOworCX0KKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1BDTUNJQSkgJiYgZGVmaW5lZChDT05GSUdfTTMyUl9DRkMpCiAJZWxzZSBpZiAocG9ydCA+PSBNMzJSX1BDQ19JT1NUQVJUMCAmJiBwb3J0IDw9IE0zMlJfUENDX0lPRU5EMCkgewogCQlwY2NfaW9yZWFkX2J5dGUoMCwgcG9ydCwgKHZvaWQgKilhZGRyLCBzaXplb2YodW5zaWduZWQgY2hhciksCkBAIC0yNTQsNiArMzAzLDEyIEBACiAJCXBjY19pb3JlYWRfd29yZCg5LCBwb3J0LCAodm9pZCAqKWFkZHIsIHNpemVvZih1bnNpZ25lZCBzaG9ydCksCiAJCQkJY291bnQsIDEpOwogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfSURFKSAmJiAhZGVmaW5lZChDT05GSUdfTTMyUl9DRkMpCisJfSBlbHNlIGlmICgocG9ydCA+PSAweDFmMCAmJiBwb3J0IDw9MHgxZjcpIHx8IHBvcnQgPT0gMHgzZjYpIHsKKwkJcG9ydHAgPSBfX3BvcnQyYWRkcl9hdGEocG9ydCk7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKmJ1ZisrID0gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnRwOworI2VuZGlmCiAJfSBlbHNlIHsKIAkJcG9ydHAgPSBQT1JUMkFERFIocG9ydCk7CiAJCXdoaWxlIChjb3VudC0tKQpAQCAtMjgwLDYgKzMzNSwxMiBAQAogCQlwb3J0cCA9IFBPUlQyQUREUl9ORShwb3J0KTsKIAkJd2hpbGUgKGNvdW50LS0pCiAJCQlfbmVfb3V0YigqYnVmKyssIHBvcnRwKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JREUpICYmICFkZWZpbmVkKENPTkZJR19NMzJSX0NGQykKKwl9IGVsc2UgaWYgKChwb3J0ID49IDB4MWYwICYmIHBvcnQgPD0weDFmNykgfHwgcG9ydCA9PSAweDNmNikgeworCQlwb3J0cCA9IF9fcG9ydDJhZGRyX2F0YShwb3J0KTsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0cCA9ICpidWYrKzsKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1BDTUNJQSkgJiYgZGVmaW5lZChDT05GSUdfTTMyUl9DRkMpCiAJfSBlbHNlIGlmIChwb3J0ID49IE0zMlJfUENDX0lPU1RBUlQwICYmIHBvcnQgPD0gTTMyUl9QQ0NfSU9FTkQwKSB7CiAJCXBjY19pb3dyaXRlX2J5dGUoMCwgcG9ydCwgKHZvaWQgKilhZGRyLCBzaXplb2YodW5zaWduZWQgY2hhciksCkBAIC0zMDUsNiArMzY2LDEyIEBACiAJCXBvcnRwID0gUE9SVDJBRERSX05FKHBvcnQpOwogCQl3aGlsZSAoY291bnQtLSkKIAkJCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0cCA9ICpidWYrKzsKKyNpZiBkZWZpbmVkKENPTkZJR19JREUpICYmICFkZWZpbmVkKENPTkZJR19NMzJSX0NGQykKKwl9IGVsc2UgaWYgKChwb3J0ID49IDB4MWYwICYmIHBvcnQgPD0weDFmNykgfHwgcG9ydCA9PSAweDNmNikgeworCQlwb3J0cCA9IF9fcG9ydDJhZGRyX2F0YShwb3J0KTsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydHAgPSAqYnVmKys7CisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19QQ01DSUEpICYmIGRlZmluZWQoQ09ORklHX00zMlJfQ0ZDKQogCX0gZWxzZSBpZiAocG9ydCA+PSBNMzJSX1BDQ19JT1NUQVJUMCAmJiBwb3J0IDw9IE0zMlJfUENDX0lPRU5EMCkgewogCQlwY2NfaW93cml0ZV93b3JkKDksIHBvcnQsICh2b2lkICopYWRkciwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXAuYwppbmRleCAwZTc3NzhiLi45MzYyMDVmIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cC5jCkBAIC0xOTYsOSArMTk2LDcgQEAKIAlpZiAoTE9BREVSX1RZUEUgJiYgSU5JVFJEX1NUQVJUKSB7CiAJCWlmIChJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSA8PSAobWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVCkpIHsKIAkJCXJlc2VydmVfYm9vdG1lbShJTklUUkRfU1RBUlQsIElOSVRSRF9TSVpFKTsKLQkJCWluaXRyZF9zdGFydCA9IElOSVRSRF9TVEFSVCA/Ci0JCQkJSU5JVFJEX1NUQVJUICsgUEFHRV9PRkZTRVQgOiAwOwotCisJCQlpbml0cmRfc3RhcnQgPSBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVDsKIAkJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBJTklUUkRfU0laRTsKIAkJCXByaW50aygiaW5pdHJkOnN0YXJ0WyUwOGx4XSxzaXplWyUwOGx4XVxuIiwKIAkJCQlpbml0cmRfc3RhcnQsIElOSVRSRF9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb3BzcHV0LmMgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX29wc3B1dC5jCmluZGV4IDYxZDNiMDEuLjYyZDZiNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb3BzcHV0LmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9vcHNwdXQuYwpAQCAtMjE4LDEzICsyMTgsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBvcHNwdXRfbGFucGxkX2lycV90eXBlID0KIHsKLQkiT1BTUFVULVBMRC1MQU4tSVJRIiwKLQlzdGFydHVwX29wc3B1dF9sYW5wbGRfaXJxLAotCXNodXRkb3duX29wc3B1dF9sYW5wbGRfaXJxLAotCWVuYWJsZV9vcHNwdXRfbGFucGxkX2lycSwKLQlkaXNhYmxlX29wc3B1dF9sYW5wbGRfaXJxLAotCW1hc2tfYW5kX2Fja19vcHNwdXRfbGFucGxkLAotCWVuZF9vcHNwdXRfbGFucGxkX2lycQorCS50eXBlbmFtZSA9ICJPUFNQVVQtUExELUxBTi1JUlEiLAorCS5zdGFydHVwID0gc3RhcnR1cF9vcHNwdXRfbGFucGxkX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9vcHNwdXRfbGFucGxkX2lycSwKKwkuZW5hYmxlID0gZW5hYmxlX29wc3B1dF9sYW5wbGRfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV9vcHNwdXRfbGFucGxkX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX29wc3B1dF9sYW5wbGQsCisJLmVuZCA9IGVuZF9vcHNwdXRfbGFucGxkX2lycQogfTsKIAogLyoKQEAgLTM3NCw3ICszNzQsNiBAQAogCWRpc2FibGVfb3BzcHV0X3BsZF9pcnEoUExEX0lSUV9TSU8wX1NORCk7CiAjZW5kaWYgIC8qIENPTkZJR19TRVJJQUxfTTMyUl9QTERTSU8gKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX00zMlJfQ0ZDKQogCS8qIElOVCMxOiBDRkMgSVJFUSBvbiBQTEQgKi8KIAlpcnFfZGVzY1tQTERfSVJRX0NGSVJFUV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwogCWlycV9kZXNjW1BMRF9JUlFfQ0ZJUkVRXS5jaGlwID0gJm9wc3B1dF9wbGRfaXJxX3R5cGU7CkBAIC0zOTgsOCArMzk3LDYgQEAKIAlpcnFfZGVzY1tQTERfSVJRX0NGQ19FSkVDVF0uZGVwdGggPSAxOwkvKiBkaXNhYmxlIG5lc3RlZCBpcnEgKi8KIAlwbGRfaWN1X2RhdGFbaXJxMnBsZGlycShQTERfSVJRX0NGQ19FSkVDVCldLmljdWNyID0gUExEX0lDVUNSX0lFTnxQTERfSUNVQ1JfSVNNT0QwMjsJLyogJ0gnIGVkZ2Ugc2Vuc2UgKi8KIAlkaXNhYmxlX29wc3B1dF9wbGRfaXJxKFBMRF9JUlFfQ0ZDX0VKRUNUKTsKLSNlbmRpZiAvKiBDT05GSUdfTTMyUl9DRkMgKi8KLQogCiAJLyoKIAkgKiBJTlQwIyBpcyB1c2VkIGZvciBMQU4sIERJTwpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYjYwY2VhNC4uMDkyZWE4NiAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NpZ25hbC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbTMyci9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAxM2M3YmI2Li4zNThiOWNlIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC04MywxMyArODMsNyBAQAogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkqKC5pbml0Y2FsbDIuaW5pdCkKLQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkqKC5pbml0Y2FsbDUuaW5pdCkKLQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYyBiL2FyY2gvbTMyci9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYwppbmRleCAzZDVmMDYxLi41NTk2ZjNkIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKKysrIGIvYXJjaC9tMzJyL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCkBAIC0yNyw5ICsyNyw4IEBACiAvKgogICogQ29weSB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbAogICovCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayAoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJc3VtID0gY3N1bV9wYXJ0aWFsKHNyYywgbGVuLCBzdW0pOwogCW1lbWNweShkc3QsIHNyYywgbGVuKTsKQEAgLTQyLDEwICs0MSw5IEBACiAgKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgSWYgd2UgY2F0Y2ggYW4gZXhjZXB0aW9uCiAgKiB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JCQkgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCSAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCSAgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCWludCBtaXNzaW5nOwogCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvbW0vZGlzY29udGlnLmMgYi9hcmNoL20zMnIvbW0vZGlzY29udGlnLmMKaW5kZXggYWJiMzRjYy4uYzdlZmRiMCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvbTMyci9tbS9kaXNjb250aWcuYwpAQCAtMTA1LDkgKzEwNSw3IEBACiAJCWlmIChJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSA8PSBQRk5fUEhZUyhtYXhfbG93X3BmbikpIHsKIAkJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgSU5JVFJEX1NUQVJULAogCQkJCUlOSVRSRF9TSVpFKTsKLQkJCWluaXRyZF9zdGFydCA9IElOSVRSRF9TVEFSVCA/Ci0JCQkJSU5JVFJEX1NUQVJUICsgUEFHRV9PRkZTRVQgOiAwOwotCisJCQlpbml0cmRfc3RhcnQgPSBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVDsKIAkJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBJTklUUkRfU0laRTsKIAkJCXByaW50aygiaW5pdHJkOnN0YXJ0WyUwOGx4XSxzaXplWyUwOGx4XVxuIiwKIAkJCQlpbml0cmRfc3RhcnQsIElOSVRSRF9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9tbS9mYXVsdC5jIGIvYXJjaC9tMzJyL21tL2ZhdWx0LmMKaW5kZXggOGQ1ZjU1MS4uOWI5ZmViMCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9tMzJyL21tL2ZhdWx0LmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQlnb3RvIGdvb2RfYXJlYTsKIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKIAkJZ290byBiYWRfYXJlYTsKLSNpZiAwCisKIAlpZiAoZXJyb3JfY29kZSAmIEFDRV9VU0VSTU9ERSkgewogCQkvKgogCQkgKiBhY2Nlc3NpbmcgdGhlIHN0YWNrIGJlbG93ICJzcHUiIGlzIGFsd2F5cyBhIGJ1Zy4KQEAgLTE4NCw3ICsxODQsNyBAQAogCQlpZiAoYWRkcmVzcyArIDQgPCByZWdzLT5zcHUpCiAJCQlnb3RvIGJhZF9hcmVhOwogCX0KLSNlbmRpZgorCiAJaWYgKGV4cGFuZF9zdGFjayh2bWEsIGFkZHJlc3MpKQogCQlnb3RvIGJhZF9hcmVhOwogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggN2JjMTQ0Ni4uNzBhNTc3YyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTE3LDYgKzE3LDE0IEBACiBjb25maWcgUldTRU1fWENIR0FERF9BTEdPUklUSE0KIAlib29sCiAKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VMzIKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VNjQKKwlib29sCisJZGVmYXVsdCBuCisKIGNvbmZpZyBHRU5FUklDX0hXRUlHSFQKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY2hpcHJhbS5jIGIvYXJjaC9tNjhrL2FtaWdhL2NoaXByYW0uYwppbmRleCBkZTEzMDRjLi5mYTAxNWQ4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvY2hpcHJhbS5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jaGlwcmFtLmMKQEAgLTUyLDEwICs1Miw5IEBACiAjaWZkZWYgREVCVUcKICAgICBwcmludGsoImFtaWdhX2NoaXBfYWxsb2M6IGFsbG9jYXRlICVsZCBieXRlc1xuIiwgc2l6ZSk7CiAjZW5kaWYKLSAgICByZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKyAgICByZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKICAgICBpZiAoIXJlcykKIAlyZXR1cm4gTlVMTDsKLSAgICBtZW1zZXQocmVzLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAgICAgcmVzLT5uYW1lID0gbmFtZTsKIAogICAgIGlmIChhbGxvY2F0ZV9yZXNvdXJjZSgmY2hpcHJhbV9yZXMsIHJlcywgc2l6ZSwgMCwgVUlOVF9NQVgsIFBBR0VfU0laRSwgTlVMTCwgTlVMTCkgPCAwKSB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvaGFkZXMtcGNpLmMgYi9hcmNoL202OGsvYXRhcmkvaGFkZXMtcGNpLmMKaW5kZXggNmNhNTdiNi4uYmVlMmIxNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL2hhZGVzLXBjaS5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9oYWRlcy1wY2kuYwpAQCAtMzc1LDEwICszNzUsOSBAQAogCSAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgYnVzIGluZm8gc3RydWN0dXJlLgogCSAqLwogCi0JYnVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9idXNfaW5mbyksIEdGUF9LRVJORUwpOworCWJ1cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfYnVzX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1cykKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KGJ1cywgMCwgc2l6ZW9mKHN0cnVjdCBwY2lfYnVzX2luZm8pKTsKIAogCS8qCiAJICogQ2xhaW0gcmVzb3VyY2VzLiBUaGUgbTY4ayBoYXMgbm8gc2VwYXJhdGUgSS9PIHNwYWNlLCBib3RoCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvc3RkbWEuYyBiL2FyY2gvbTY4ay9hdGFyaS9zdGRtYS5jCmluZGV4IGQ2NGI1ODAuLmQwMWRlYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9zdGRtYS5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9zdGRtYS5jCkBAIC0xNzQsNyArMTc0LDcgQEAKIHZvaWQgX19pbml0IHN0ZG1hX2luaXQodm9pZCkKIHsKIAlzdGRtYV9pc3IgPSBOVUxMOwotCXJlcXVlc3RfaXJxKElSUV9NRlBfRkRDLCBzdGRtYV9pbnQsIElSUV9UWVBFX1NMT1csCisJcmVxdWVzdF9pcnEoSVJRX01GUF9GREMsIHN0ZG1hX2ludCwgSVJRX1RZUEVfU0xPVyB8IFNBX1NISVJRLAogCSAgICAgICAgICAgICJTVC1ETUE6IGZsb3BweS9BQ1NJL0lERS9GYWxjb24tU0NTSSIsIHN0ZG1hX2ludCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc3VuMy1oZWFkLlMgYi9hcmNoL202OGsva2VybmVsL3N1bjMtaGVhZC5TCmluZGV4IGJmZmQ2OWEuLjRiNWYwNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc3VuMy1oZWFkLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zdW4zLWhlYWQuUwpAQCAtNjcsMTYgKzY3LDYgQEAKIDE6CWxlYQlpbml0X3Rhc2ssJWN1cnB0cgkJCXwgZ2V0IGluaXRpYWwgdGhyZWFkLi4uCiAJbGVhCWluaXRfdGhyZWFkX3VuaW9uK1RIUkVBRF9TSVpFLCVzcAl8IC4uLmFuZCBpdHMgc3RhY2suCiAKLS8qIGNvcHkgYm9vdGluZm8gcmVjb3JkcyBmcm9tIHRoZSBsb2FkZXIgdG8gX2VuZCAqLwotCWxlYQlfZW5kLCAlYTEKLQlsZWEJQklfU1RBUlQsICVhMAotCS8qIG51bWJlciBvZiBsb25ncyB0byBjb3B5ICovCi0JbW92ZWwJJWEwQCwgJWQwCi0xOglhZGRsCSM0LCAlYTAKLQltb3ZlbCAgICVhMEAsICVhMUAKLQlhZGRsCSM0LCAlYTEKLQlkYmYJJWQwLCAxYgotCiAvKiBQb2ludCBNU1AgYXQgYW4gaW52YWxpZCBwYWdlIHRvIHRyYXAgaWYgaXQncyB1c2VkLiAtLW0gKi8KIAltb3ZsCSMoUEFHRVNJWkUpLCVkMAogCW1vdmMJJWQwLCVtc3AKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdGQubGRzIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKaW5kZXggNjlkMWQzZC4uZDI3OTQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMKQEAgLTU0LDEzICs1NCw3IEBACiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KQotCSooLmluaXRjYWxsMi5pbml0KQotCSooLmluaXRjYWxsMy5pbml0KQotCSooLmluaXRjYWxsNC5pbml0KQotCSooLmluaXRjYWxsNS5pbml0KQotCSooLmluaXRjYWxsNi5pbml0KQotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzCmluZGV4IDY1Y2MzOWMuLjhjN2VjY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdW4zLmxkcworKysgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3VuMy5sZHMKQEAgLTgsNyArOCw3IEBACiBqaWZmaWVzID0gamlmZmllc182NCArIDQ7CiBTRUNUSU9OUwogewotICAuID0gMHhFMDA0MDAwOworICAuID0gMHhFMDAyMDAwOwogICBfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KICAgLnRleHQgOiB7CiAJKiguaGVhZCkKQEAgLTQ4LDEzICs0OCw3IEBACiAJX19zZXR1cF9lbmQgPSAuOwogCV9faW5pdGNhbGxfc3RhcnQgPSAuOwogCS5pbml0Y2FsbC5pbml0IDogewotCQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkJKiguaW5pdGNhbGwyLmluaXQpCi0JCSooLmluaXRjYWxsMy5pbml0KQotCQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkJKiguaW5pdGNhbGw1LmluaXQpCi0JCSooLmluaXRjYWxsNi5pbml0KQotCQkqKC5pbml0Y2FsbDcuaW5pdCkKKwkJSU5JVENBTExTCiAJfQogCV9faW5pdGNhbGxfZW5kID0gLjsKIAlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMgYi9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKaW5kZXggY2IxM2M2ZS4uYWVkM2JlMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYwpAQCAtMzksOCArMzksNyBAQAogICogY29tcHV0ZXMgYSBwYXJ0aWFsIGNoZWNrc3VtLCBlLmcuIGZvciBUQ1AvVURQIGZyYWdtZW50cwogICovCiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsIChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKIAkgIC8qCkBAIC0xMzMsOSArMTMyLDkgQEAKICAqIGNvcHkgZnJvbSB1c2VyIHNwYWNlIHdoaWxlIGNoZWNrc3VtbWluZywgd2l0aCBleGNlcHRpb24gaGFuZGxpbmcuCiAgKi8KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJICAgIGludCBsZW4sIGludCBzdW0sIGludCAqY3N1bV9lcnIpCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICpjc3VtX2VycikKIHsKIAkvKgogCSAqIEdDQyBkb2Vzbid0IGxpa2UgbW9yZSB0aGFuIDEwIG9wZXJhbmRzIGZvciB0aGUgYXNtCkBAIC0zMjUsOCArMzI0LDggQEAKICAqIGNvcHkgZnJvbSBrZXJuZWwgc3BhY2Ugd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwogCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0pCitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyOwogCV9fYXNtX18oIm1vdmVsICUyLCU0XG5cdCIKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9mYXVsdC5jIGIvYXJjaC9tNjhrL21tL2ZhdWx0LmMKaW5kZXggOTExZjJjZS4uMmFkYmViMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9tNjhrL21tL2ZhdWx0LmMKQEAgLTk5LDcgKzk5LDcgQEAKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgb3IgaGF2ZSBubyB1c2VyCiAJICogY29udGV4dCwgd2UgbXVzdCBub3QgdGFrZSB0aGUgZmF1bHQuLgogCSAqLwotCWlmIChpbl9pbnRlcnJ1cHQoKSB8fCAhbW0pCisJaWYgKGluX2F0b21pYygpIHx8ICFtbSkKIAkJZ290byBub19jb250ZXh0OwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL2ttYXAuYyBiL2FyY2gvbTY4ay9tbS9rbWFwLmMKaW5kZXggYjU0ZWYxNy4uNDZiN2Q2MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2ttYXAuYworKysgYi9hcmNoL202OGsvbW0va21hcC5jCkBAIC01OSw3ICs1OSw3IEBACiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCXN0cnVjdCB2bV9zdHJ1Y3QgKipwLCAqdG1wLCAqYXJlYTsKIAotCWFyZWEgPSAoc3RydWN0IHZtX3N0cnVjdCAqKWttYWxsb2Moc2l6ZW9mKCphcmVhKSwgR0ZQX0tFUk5FTCk7CisJYXJlYSA9IGttYWxsb2Moc2l6ZW9mKCphcmVhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcmVhKQogCQlyZXR1cm4gTlVMTDsKIAlhZGRyID0gS01BUF9TVEFSVDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9tZW1vcnkuYyBiL2FyY2gvbTY4ay9tbS9tZW1vcnkuYwppbmRleCAwZjg4ODEyLi4xM2MwYjRhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbW0vbWVtb3J5LmMKKysrIGIvYXJjaC9tNjhrL21tL21lbW9yeS5jCkBAIC0yOTksNyArMjk5LDcgQEAKIAltYWNoX2wyX2ZsdXNoKDApOwogI2VuZGlmCiB9Ci1FWFBPUlRfU1lNQk9MKGNhY2hlX2NsZWFyKTsJLyogcHJvYmFibHkgY2FuIGJlIHVuZXhwb3J0ZWQgKi8KK0VYUE9SVF9TWU1CT0woY2FjaGVfY2xlYXIpOwogCiAKIC8qCkBAIC0zNTIsNyArMzUyLDcgQEAKIAltYWNoX2wyX2ZsdXNoKDEpOwogI2VuZGlmCiB9Ci1FWFBPUlRfU1lNQk9MKGNhY2hlX3B1c2gpOwkvKiBwcm9iYWJseSBjYW4gYmUgdW5leHBvcnRlZCAqLworRVhQT1JUX1NZTUJPTChjYWNoZV9wdXNoKTsKIAogI2lmbmRlZiBDT05GSUdfU0lOR0xFX01FTU9SWV9DSFVOSwogaW50IG1tX2VuZF9vZl9jaHVuayAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbGVuKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL3N1bjNtbXUuYyBiL2FyY2gvbTY4ay9tbS9zdW4zbW11LmMKaW5kZXggYWM2NjQwYS4uNmE2NTEzYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL3N1bjNtbXUuYworKysgYi9hcmNoL202OGsvbW0vc3VuM21tdS5jCkBAIC00OSw3ICs0OSw2IEBACiAJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10gPSB7IDAsIH07CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCi0KICNpZmRlZiBURVNUX1ZFUklGWV9BUkVBCiAJd3Bfd29ya3Nfb2sgPSAwOwogI2VuZGlmCkBAIC05NCw3ICs5MywxMSBAQAogCS8qIG1lbW9yeSBzaXppbmcgaXMgYSBoYWNrIHN0b2xlbiBmcm9tIG1vdG9yb2xhLmMuLiAgaG9wZSBpdCB3b3JrcyBmb3IgdXMgKi8KIAl6b25lc19zaXplW1pPTkVfRE1BXSA9ICgodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUOwogCi0JZnJlZV9hcmVhX2luaXQoem9uZXNfc2l6ZSk7CisJLyogSSByZWFsbHkgd2lzaCBJIGtuZXcgd2h5IHRoZSBmb2xsb3dpbmcgY2hhbmdlIG1hZGUgdGhpbmdzIGJldHRlci4uLiAgLS0gU2FtICovCisvKglmcmVlX2FyZWFfaW5pdCh6b25lc19zaXplKTsgKi8KKwlmcmVlX2FyZWFfaW5pdF9ub2RlKDAsIE5PREVfREFUQSgwKSwgem9uZXNfc2l6ZSwKKwkJCSAgICAoX19wYShQQUdFX09GRlNFVCkgPj4gUEFHRV9TSElGVCkgKyAxLCBOVUxMKTsKKwogCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L0tjb25maWcgYi9hcmNoL202OGtub21tdS9LY29uZmlnCmluZGV4IDZkOTIwZDQuLjI1OTkzYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L0tjb25maWcKKysrIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwpAQCAtMjUsNiArMjUsMTQgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VMzIKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VNjQKKwlib29sCisJZGVmYXVsdCBuCisKIGNvbmZpZyBHRU5FUklDX0ZJTkRfTkVYVF9CSVQKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0xNzMsNyArMTgxLDcgQEAKIAkgIE9uIG1hbnkgU29DIHN0eWxlIENQVXMgdGhlIG1hc3RlciBDUFUgY2xvY2sgaXMgYWxzbyB1c2VkIHRvIGRyaXZlIAogCSAgb24tY2hpcCBwZXJpcGhlcmFscy4gVGhlIGNsb2NrIHRoYXQgaXMgZGlzdHJpYnV0ZWQgdG8gdGhlc2UKIAkgIHBlcmlwaGVyYWxzIGlzIHNvbWV0aW1lcyBhIGZpeGVkIHJhdGlvIG9mIHRoZSBtYXN0ZXIgY2xvY2sKLQkgIGZyZXF1ZW5jeS4gSWYgc28gdGhlbiBzZXQgdGhpcyB0byB0aGUgZGl2aWRlciByYXRpb24gb2YgdGhlCisJICBmcmVxdWVuY3kuIElmIHNvIHRoZW4gc2V0IHRoaXMgdG8gdGhlIGRpdmlkZXIgcmF0aW8gb2YgdGhlCiAJICBtYXN0ZXIgY2xvY2sgdG8gdGhlIHBlcmlwaGVyYWwgY2xvY2suIElmIG5vdCBzdXJlIHRoZW4gc2VsZWN0IDEuCiAKIGNvbmZpZyBPTERNQVNLCkBAIC0xOTIsNyArMjAwLDcgQEAKIAkgIFN1cHBvcnQgZm9yIHRoZSBQYWxtIFBpbG90IDEwMDAvNTAwMCwgUGVyc29uYWwvUHJvIGFuZCBQYWxtSUlJLgogCiBjb25maWcgWENPUElMT1RfQlVHUwotCWJvb2wgIiAgKFgpQ29waWxvdCBzdXBwb3J0IgorCWJvb2wgIihYKUNvcGlsb3Qgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBJTE9UMwogCWhlbHAKIAkgIFN1cHBvcnQgdGhlIGJ1Z3Mgb2YgWGNvcGlsb3QuCkBAIC0yMTYsMjAgKzIyNCwyMCBAQAogCSAgU3VwcG9ydCBmb3IgdGhlIERyYWdlbkVuZ2luZSBJSSBib2FyZC4KIAogY29uZmlnIERJUkVDVF9JT19BQ0NFU1MKLQlib29sICIgIEFsbG93IHVzZXIgdG8gYWNjZXNzIElPIGRpcmVjdGx5IgorCWJvb2wgIkFsbG93IHVzZXIgdG8gYWNjZXNzIElPIGRpcmVjdGx5IgogCWRlcGVuZHMgb24gKFVDU0lNTSB8fCBVQ0RJTU0gfHwgRFJBR0VOMikKIAloZWxwCiAJICBEaXNhYmxlIHRoZSBDUFUgaW50ZXJuYWwgcmVnaXN0ZXJzIHByb3RlY3Rpb24gaW4gdXNlciBtb2RlLAogICAgICAgICAgIHRvIGFsbG93IGEgdXNlciBhcHBsaWNhdGlvbiB0byByZWFkL3dyaXRlIHRoZW0uCiAKIGNvbmZpZyBJTklUX0xDRAotCWJvb2wgIiAgSW5pdGlhbGl6ZSBMQ0QiCisJYm9vbCAiSW5pdGlhbGl6ZSBMQ0QiCiAJZGVwZW5kcyBvbiAoVUNTSU1NIHx8IFVDRElNTSB8fCBEUkFHRU4yKQogCWhlbHAKIAkgIEluaXRpYWxpemUgdGhlIExDRCBjb250cm9sbGVyIG9mIHRoZSA2OHgzMjggcHJvY2Vzc29yLgogCiBjb25maWcgTUVNT1JZX1JFU0VSVkUKLQlpbnQgIiAgTWVtb3J5IHJlc2VydmF0aW9uIChNaUIpIgorCWludCAiTWVtb3J5IHJlc2VydmF0aW9uIChNaUIpIgogCWRlcGVuZHMgb24gKFVDU0lNTSB8fCBVQ0RJTU0pCiAJaGVscAogCSAgUmVzZXJ2ZSBjZXJ0YWluIG1lbW9yeSByZWdpb25zIG9uIDY4eDMyOCBiYXNlZCBib2FyZHMuCkBAIC00MDksNyArNDE3LDcgQEAKIAkgIFN1cHBvcnQgZm9yIHRoZSBOZXRidXJuZXIgTU9ELTUyNzIgYm9hcmQuCiAKIGNvbmZpZyBST01GU19GUk9NX1JPTQotCWJvb2wgIiAgUk9NRlMgaW1hZ2Ugbm90IFJBTSByZXNpZGVudCIKKwlib29sICJST01GUyBpbWFnZSBub3QgUkFNIHJlc2lkZW50IgogCWRlcGVuZHMgb24gKE5FVHRlbCB8fCBTTkFQR0VBUikKIAloZWxwCiAJICBUaGUgUk9NZnMgZmlsZXN5c3RlbSB3aWxsIHN0YXkgcmVzaWRlbnQgaW4gdGhlIEZMQVNIL1JPTSwgbm90IGJlCkBAIC01NjUsNyArNTczLDcgQEAKIAlkZXBlbmRzIG9uIFJPTQogCWhlbHAKIAkgIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgYmFzZSBvZiB0aGUgUk9NLiBTaW5jZSBvbiBhbGwKLQkgIDY4MDAwIHR5cGUgdmFyaWVudHMgdGhlIHZlY3RvcnMgYXJlIGF0IHRoZSBiYXNlIG9mIHRoZSBib290IGRldmljZQorCSAgNjgwMDAgdHlwZSB2YXJpYW50cyB0aGUgdmVjdG9ycyBhcmUgYXQgdGhlIGJhc2Ugb2YgdGhlIGJvb3QgZGV2aWNlCiAJICBvbiBzeXN0ZW0gc3RhcnR1cC4KIAogY29uZmlnIFJPTVZFQ1NJWkUKQEAgLTU3NCw3ICs1ODIsNyBAQAogCWRlcGVuZHMgb24gUk9NCiAJaGVscAogCSAgRGVmaW5lIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3IgcmVnaW9uIGluIFJPTS4gRm9yIG1vc3QgNjgwMDAKLQkgIHZhcmllbnRzIHRoaXMgd291bGQgYmUgMHg0MDAgYnl0ZXMgaW4gc2l6ZS4gU2V0IHRvIDAgaWYgeW91IGRvCisJICB2YXJpYW50cyB0aGlzIHdvdWxkIGJlIDB4NDAwIGJ5dGVzIGluIHNpemUuIFNldCB0byAwIGlmIHlvdSBkbwogCSAgbm90IHdhbnQgYSB2ZWN0b3IgcmVnaW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgUk9NLgogCiBjb25maWcgUk9NU1RBUlQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9tNjhrX2tzeW1zLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvbTY4a19rc3ltcy5jCmluZGV4IDFlNjIxNTAuLjI1MzI3YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9tNjhrX2tzeW1zLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL202OGtfa3N5bXMuYwpAQCAtMzgsNyArMzgsNyBAQAogRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKIAogLyogTmV0d29ya2luZyBoZWxwZXIgcm91dGluZXMuICovCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5KTsKK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayk7CiAKIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGV5J3JlIG5vdCBjYWxsZWQKICAgIGV4cGxpY2l0bHkgKHRoZSBDIGNvbXBpbGVyIGdlbmVyYXRlcyB0aGVtKS4gIEZvcnR1bmF0ZWx5LApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYzE4YTgzMy4uOTQxOTU1ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yOTAsNyArMjkwLDcgQEAKIAl1bnNpZ25lZCBjaGFyCSp0cDsKIAlpbnQJCWk7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiXG5DVVJSRU5UIFBST0NFU1M6XG5cbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJcbiIgS0VSTl9FTUVSRyAiQ1VSUkVOVCBQUk9DRVNTOlxuIiBLRVJOX0VNRVJHICJcbiIpOwogCXByaW50ayhLRVJOX0VNRVJHICJDT01NPSVzIFBJRD0lZFxuIiwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAogCWlmIChjdXJyZW50LT5tbSkgewpAQCAtMzAxLDcgKzMwMSw4IEBACiAJCQkoaW50KSBjdXJyZW50LT5tbS0+ZW5kX2RhdGEsCiAJCQkoaW50KSBjdXJyZW50LT5tbS0+ZW5kX2RhdGEsCiAJCQkoaW50KSBjdXJyZW50LT5tbS0+YnJrKTsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIlVTRVItU1RBQ0s9JTA4eCAgS0VSTkVMLVNUQUNLPSUwOHhcblxuIiwKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIlVTRVItU1RBQ0s9JTA4eCBLRVJORUwtU1RBQ0s9JTA4eFxuIgorCQkJS0VSTl9FTUVSRyAiXG4iLAogCQkJKGludCkgY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrLAogCQkJKGludCkoKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50KSArIFRIUkVBRF9TSVpFKSk7CiAJfQpAQCAtMzEyLDM2ICszMTMsMzUgQEAKIAkJZnAtPmQwLCBmcC0+ZDEsIGZwLT5kMiwgZnAtPmQzKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiZDQ6ICUwOGx4ICAgIGQ1OiAlMDhseCAgICBhMDogJTA4bHggICAgYTE6ICUwOGx4XG4iLAogCQlmcC0+ZDQsIGZwLT5kNSwgZnAtPmEwLCBmcC0+YTEpOwotCXByaW50ayhLRVJOX0VNRVJHICJcblVTUDogJTA4eCAgIFRSQVBGUkFNRTogJTA4eFxuIiwgKHVuc2lnbmVkIGludCkgcmR1c3AoKSwKLQkJKHVuc2lnbmVkIGludCkgZnApOworCXByaW50ayhLRVJOX0VNRVJHICJcbiIgS0VSTl9FTUVSRyAiVVNQOiAlMDh4ICAgVFJBUEZSQU1FOiAlMDh4XG4iLAorCQkodW5zaWduZWQgaW50KSByZHVzcCgpLCAodW5zaWduZWQgaW50KSBmcCk7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiXG5DT0RFOiIpOworCXByaW50ayhLRVJOX0VNRVJHICJcbiIgS0VSTl9FTUVSRyAiQ09ERToiKTsKIAl0cCA9ICgodW5zaWduZWQgY2hhciAqKSBmcC0+cGMpIC0gMHgyMDsKIAlmb3IgKHNwID0gKHVuc2lnbmVkIGxvbmcgKikgdHAsIGkgPSAwOyAoaSA8IDB4NDApOyAgaSArPSA0KSB7CiAJCWlmICgoaSAlIDB4MTApID09IDApCi0JCQlwcmludGsoS0VSTl9FTUVSRyAiXG4lMDh4OiAiLCAoaW50KSAodHAgKyBpKSk7Ci0JCXByaW50ayhLRVJOX0VNRVJHICIlMDh4ICIsIChpbnQpICpzcCsrKTsKKwkJCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIiUwOHg6ICIsIChpbnQpICh0cCArIGkpKTsKKwkJcHJpbnRrKCIlMDh4ICIsIChpbnQpICpzcCsrKTsKIAl9Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIlxuIik7CisJcHJpbnRrKCJcbiIgS0VSTl9FTUVSRyAiXG4iKTsKIAotCXByaW50ayhLRVJOX0VNRVJHICJcbktFUk5FTCBTVEFDSzoiKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiS0VSTkVMIFNUQUNLOiIpOwogCXRwID0gKCh1bnNpZ25lZCBjaGFyICopIGZwKSAtIDB4NDA7CiAJZm9yIChzcCA9ICh1bnNpZ25lZCBsb25nICopIHRwLCBpID0gMDsgKGkgPCAweGMwKTsgaSArPSA0KSB7CiAJCWlmICgoaSAlIDB4MTApID09IDApCi0JCQlwcmludGsoS0VSTl9FTUVSRyAiXG4lMDh4OiAiLCAoaW50KSAodHAgKyBpKSk7Ci0JCXByaW50ayhLRVJOX0VNRVJHICIlMDh4ICIsIChpbnQpICpzcCsrKTsKKwkJCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIiUwOHg6ICIsIChpbnQpICh0cCArIGkpKTsKKwkJcHJpbnRrKCIlMDh4ICIsIChpbnQpICpzcCsrKTsKIAl9Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIlxuIik7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIlxuIik7CisJcHJpbnRrKCJcbiIgS0VSTl9FTUVSRyAiXG4iKTsKIAotCXByaW50ayhLRVJOX0VNRVJHICJcblVTRVIgU1RBQ0s6Iik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlVTRVIgU1RBQ0s6Iik7CiAJdHAgPSAodW5zaWduZWQgY2hhciAqKSAocmR1c3AoKSAtIDB4MTApOwogCWZvciAoc3AgPSAodW5zaWduZWQgbG9uZyAqKSB0cCwgaSA9IDA7IChpIDwgMHg4MCk7IGkgKz0gNCkgewogCQlpZiAoKGkgJSAweDEwKSA9PSAwKQotCQkJcHJpbnRrKEtFUk5fRU1FUkcgIlxuJTA4eDogIiwgKGludCkgKHRwICsgaSkpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiJTA4eCAiLCAoaW50KSAqc3ArKyk7CisJCQlwcmludGsoIlxuIiBLRVJOX0VNRVJHICIlMDh4OiAiLCAoaW50KSAodHAgKyBpKSk7CisJCXByaW50aygiJTA4eCAiLCAoaW50KSAqc3ArKyk7CiAJfQotCXByaW50ayhLRVJOX0VNRVJHICJcblxuIik7CisJcHJpbnRrKCJcbiIgS0VSTl9FTUVSRyAiXG4iKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKaW5kZXggYmRlOTgxMS4uOWNmMmU0ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKQEAgLTM2LDEwICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2VuZGlmCiAKIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3N0YXJ0OwogdW5zaWduZWQgbG9uZyBtZW1vcnlfZW5kOwpAQCAtNjIsNyArNTksNyBAQAogdm9pZCAoKm1hY2hfa2JkX2xlZHMpICh1bnNpZ25lZCBpbnQpOwogLyogbWFjaGluZSBkZXBlbmRlbnQgaXJxIGZ1bmN0aW9ucyAqLwogdm9pZCAoKm1hY2hfaW5pdF9JUlEpICh2b2lkKTsKLWlycXJldHVybl90ICgqKCptYWNoX2RlZmF1bHRfaGFuZGxlcilbXSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK2lycV9oYW5kbGVyX3QgbWFjaF9kZWZhdWx0X2hhbmRsZXI7CiBpbnQgKCptYWNoX2dldF9pcnFfbGlzdCkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwogdm9pZCAoKm1hY2hfcHJvY2Vzc19pbnQpIChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwogdm9pZCAoKm1hY2hfdHJhcF9pbml0KSAodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzX202OGsuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNfbTY4ay5jCmluZGV4IGMzNDk0YjguLjMyNjViMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNfbTY4ay5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNfbTY4ay5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIGFzbWxpbmthZ2UgaW50IHN5c19pcGMgKHVpbnQgY2FsbCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kLAogCQkJaW50IHRoaXJkLCB2b2lkICpwdHIsIGxvbmcgZmlmdGgpCiB7Ci0JaW50IHZlcnNpb247CisJaW50IHZlcnNpb24sIHJldDsKIAogCXZlcnNpb24gPSBjYWxsID4+IDE2OyAvKiBoYWNrIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiAJY2FsbCAmPSAweGZmZmY7CkBAIC0xOTAsNiArMTkwLDI3IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCWlmIChjYWxsIDw9IFNITUNUTCkKKwkJc3dpdGNoIChjYWxsKSB7CisJCWNhc2UgU0hNQVQ6CisJCQlzd2l0Y2ggKHZlcnNpb24pIHsKKwkJCWRlZmF1bHQ6IHsKKwkJCQl1bG9uZyByYWRkcjsKKwkJCQlyZXQgPSBkb19zaG1hdCAoZmlyc3QsIHB0ciwgc2Vjb25kLCAmcmFkZHIpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcmV0dXJuIHB1dF91c2VyIChyYWRkciwgKHVsb25nIF9fdXNlciAqKSB0aGlyZCk7CisJCQl9CisJCQl9CisJCWNhc2UgU0hNRFQ6CisJCQlyZXR1cm4gc3lzX3NobWR0IChwdHIpOworCQljYXNlIFNITUdFVDoKKwkJCXJldHVybiBzeXNfc2htZ2V0IChmaXJzdCwgc2Vjb25kLCB0aGlyZCk7CisJCWNhc2UgU0hNQ1RMOgorCQkJcmV0dXJuIHN5c19zaG1jdGwgKGZpcnN0LCBzZWNvbmQsIHB0cik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT1NZUzsKKwkJfQogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvdGltZS5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RpbWUuYwppbmRleCBjNTY2N2JkLi45MjI2MjY0IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC90aW1lLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUocmVncykpOwogI2VuZGlmCiAJaWYgKGN1cnJlbnQtPnBpZCkKLQkJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcsIHJlZ3MpOworCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7CiAKIAkvKgogCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgTGludXggY2xvY2ssIHRoZW4gdXBkYXRlCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jCmluZGV4IDE3NjQ5ZDIuLjkxMjliM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jCkBAIC0xMjcsMTEgKzEyNywxMiBAQAogCQlpZiAoc3RhY2sgKyAxID4gZW5kc3RhY2spCiAJCQlicmVhazsKIAkJaWYgKGkgJSA4ID09IDApCi0JCQlwcmludGsoS0VSTl9FTUVSRyAiXG4gICAgICAgIik7Ci0JCXByaW50ayhLRVJOX0VNRVJHICIgJTA4bHgiLCAqc3RhY2srKyk7CisJCQlwcmludGsoIlxuIiBLRVJOX0VNRVJHICIgICAgICAgIik7CisJCXByaW50aygiICUwOGx4IiwgKnN0YWNrKyspOwogCX0KKwlwcmludGsoIlxuIik7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiXG5DYWxsIFRyYWNlOiIpOworCXByaW50ayhLRVJOX0VNRVJHICJDYWxsIFRyYWNlOiIpOwogCWkgPSAwOwogCXdoaWxlIChzdGFjayArIDEgPD0gZW5kc3RhY2spIHsKIAkJYWRkciA9ICpzdGFjaysrOwpAQCAtMTQ2LDEyICsxNDcsMTIgQEAKIAkJaWYgKCgoYWRkciA+PSAodW5zaWduZWQgbG9uZykgJl9zdGFydCkgJiYKIAkJICAgICAoYWRkciA8PSAodW5zaWduZWQgbG9uZykgJl9ldGV4dCkpKSB7CiAJCQlpZiAoaSAlIDQgPT0gMCkKLQkJCQlwcmludGsoS0VSTl9FTUVSRyAiXG4gICAgICAgIik7Ci0JCQlwcmludGsoS0VSTl9FTUVSRyAiIFs8JTA4bHg+XSIsIGFkZHIpOworCQkJCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIiAgICAgICAiKTsKKwkJCXByaW50aygiIFs8JTA4bHg+XSIsIGFkZHIpOwogCQkJaSsrOwogCQl9CiAJfQotCXByaW50ayhLRVJOX0VNRVJHICJcbiIpOworCXByaW50aygiXG4iKTsKIH0KIAogdm9pZCBiYWRfc3VwZXJfdHJhcChzdHJ1Y3QgZnJhbWUgKmZwKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBjY2QyY2ViLi4yYjJhMTBkIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNjAsNiArNjAsNyBAQAogI2VuZGlmCiAKIAkudGV4dCA6IHsKKwkJX3RleHQgPSAuOwogCQlfc3RleHQgPSAuIDsKICAgICAgICAgCSooLnRleHQpCiAJCVNDSEVEX1RFWFQKQEAgLTE0MCwxMyArMTQxLDcgQEAKIAkJKiguaW5pdC5zZXR1cCkKIAkJX19zZXR1cF9lbmQgPSAuOwogCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJKiguaW5pdGNhbGwxLmluaXQpCi0JCSooLmluaXRjYWxsMi5pbml0KQotCQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkJKiguaW5pdGNhbGw0LmluaXQpCi0JCSooLmluaXRjYWxsNS5pbml0KQotCQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkJKiguaW5pdGNhbGw3LmluaXQpCisJCUlOSVRDQUxMUwogCQlfX2luaXRjYWxsX2VuZCA9IC47CiAJCV9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKIAkJKiguY29uX2luaXRjYWxsLmluaXQpCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9saWIvY2hlY2tzdW0uYyBiL2FyY2gvbTY4a25vbW11L2xpYi9jaGVja3N1bS5jCmluZGV4IDdiZWM2ZmQuLjI2OWQ4M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvbTY4a25vbW11L2xpYi9jaGVja3N1bS5jCkBAIC05Niw5ICs5Niw5IEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi11bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwgdW5zaWduZWQgaW50IGlobCkKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKIHsKLQlyZXR1cm4gfmRvX2NzdW0oaXBoLGlobCo0KTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShpcGgsaWhsKjQpOwogfQogCiAvKgpAQCAtMTEzLDE1ICsxMTMsMTUgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOwogCiAJLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCi0JcmVzdWx0ICs9IHN1bTsKLQlpZiAoc3VtID4gcmVzdWx0KQorCXJlc3VsdCArPSAoX19mb3JjZSB1MzIpc3VtOworCWlmICgoX19mb3JjZSB1MzIpc3VtID4gcmVzdWx0KQogCQlyZXN1bHQgKz0gMTsKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwogfQogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CkBAIC0xMzAsMjEgKzEzMCwyMSBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7Ci0JcmV0dXJuIH5kb19jc3VtKGJ1ZmYsbGVuKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShidWZmLGxlbik7CiB9CiAKIC8qCiAgKiBjb3B5IGZyb20gZnMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwogCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCSAgICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmNzdW1fZXJyKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJICAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqY3N1bV9lcnIpCiB7CiAJaWYgKGNzdW1fZXJyKSAqY3N1bV9lcnIgPSAwOwotCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwltZW1jcHkoZHN0LCAoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLCBsZW4pOwogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CiAKQEAgLTE1Miw4ICsxNTIsOCBAQAogICogY29weSBmcm9tIGRzIHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCiAgKi8KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvaGVhZC5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9oZWFkLlMKaW5kZXggZjJlZGI2NC4uYjlhYTBjYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9oZWFkLlMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9oZWFkLlMKQEAgLTY0LDYgKzY0LDI2IEBACiAJbmVnbAklZDAJCQkvKiBuZWdhdGUgYml0cyAqLwogLmVuZG0KIAorI2VsaWYgZGVmaW5lZChDT05GSUdfTTUyMHgpCisubWFjcm8gR0VUX01FTV9TSVpFCisJY2xybAklZDAKKwltb3ZlbAlNQ0ZfTUJBUitNQ0ZTSU1fU0RDUzAsICVkMiAvKiBHZXQgU0RSQU0gY2hpcCBzZWxlY3QgMCBjb25maWcgKi8KKwlhbmRsCSMweDFmLCAlZDIJCS8qIEdldCBvbmx5IHRoZSBjaGlwIHNlbGVjdCBzaXplICovCisJYmVxCTNmCQkJLyogQ2hlY2sgaWYgaXQgaXMgZW5hYmxlZCAqLworCWFkZHFsCSMxLCAlZDIJCQkvKiBGb3JtIGV4cG9uZW50ICovCisJbW92ZXFsCSMxLCAlZDAKKwlsc2xsCSVkMiwgJWQwCQkvKiAyIF4gZXhwb25lbnQgKi8KKzM6CisJbW92ZWwJTUNGX01CQVIrTUNGU0lNX1NEQ1MxLCAlZDIgLyogR2V0IFNEUkFNIGNoaXAgc2VsZWN0IDEgY29uZmlnICovCisJYW5kbAkjMHgxZiwgJWQyCQkvKiBHZXQgb25seSB0aGUgY2hpcCBzZWxlY3Qgc2l6ZSAqLworCWJlcQk0ZgkJCS8qIENoZWNrIGlmIGl0IGlzIGVuYWJsZWQgKi8KKwlhZGRxbAkjMSwgJWQyCQkJLyogRm9ybSBleHBvbmVudCAqLworCW1vdmVxbAkjMSwgJWQxCisJbHNsbAklZDIsICVkMQkJLyogMiBeIGV4cG9uZW50ICovCisJYWRkbAklZDEsICVkMAkJLyogVG90YWwgc2l6ZSBvZiBTRFJBTSBpbiBkMCAqLworNDoKKy5lbmRtCisKICNlbHNlCiAjZXJyb3IgIkVSUk9SOiBJIGRvbid0IGtub3cgaG93IHRvIHByb2JlIHlvdXIgYm9hcmRzIG1lbW9yeSBzaXplPyIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy9pbnRzLmMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2ludHMuYwppbmRleCBiNGI1NTA5Li5hNTcyMzllIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2ludHMuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L2ludHMuYwpAQCAtMzMsNyArMzMsNyBAQAogLyoKICAqCVRoaXMgdGFibGUgc3RvcmVzIHRoZSBhZGRyZXNzIGluZm8gZm9yIGVhY2ggdmVjdG9yIGhhbmRsZXIuCiAgKi8KLWlycV9oYW5kbGVyX3QgaXJxX2xpc3RbU1lTX0lSUVNdOworc3RydWN0IGlycV9lbnRyeSBpcnFfbGlzdFtTWVNfSVJRU107CiAKICNkZWZpbmUgTlVNX0lSUV9OT0RFUyAxNgogc3RhdGljIGlycV9ub2RlX3Qgbm9kZXNbTlVNX0lSUV9OT0RFU107CkBAIC00NCw3ICs0NCw3IEBACiB1bnNpZ25lZCBpbnQgbG9jYWxfYmhfY291bnRbTlJfQ1BVU107CiB1bnNpZ25lZCBpbnQgbG9jYWxfaXJxX2NvdW50W05SX0NQVVNdOwogCi1zdGF0aWMgaXJxcmV0dXJuX3QgZGVmYXVsdF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IGRlZmF1bHRfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHRyKQogewogI2lmIDEKIAlwcmludGsoS0VSTl9JTkZPICIlcyglZCk6IGRlZmF1bHQgaXJxIGhhbmRsZXIgdmVjPSVkIFsweCV4XVxuIiwKQEAgLTcwLDcgKzcwLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBTWVNfSVJRUzsgaSsrKSB7CiAJCWlmIChtYWNoX2RlZmF1bHRfaGFuZGxlcikKLQkJCWlycV9saXN0W2ldLmhhbmRsZXIgPSAoKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtpXTsKKwkJCWlycV9saXN0W2ldLmhhbmRsZXIgPSBtYWNoX2RlZmF1bHRfaGFuZGxlcjsKIAkJZWxzZQogCQkJaXJxX2xpc3RbaV0uaGFuZGxlciA9IGRlZmF1bHRfaXJxX2hhbmRsZXI7CiAJCWlycV9saXN0W2ldLmZsYWdzICAgPSBJUlFfRkxHX1NURDsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiBpbnQgcmVxdWVzdF9pcnEoCiAJdW5zaWduZWQgaW50IGlycSwKLQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKKwlpcnFfaGFuZGxlcl90IGhhbmRsZXIsCiAJdW5zaWduZWQgbG9uZyBmbGFncywKIAljb25zdCBjaGFyICpkZXZuYW1lLAogCXZvaWQgKmRldl9pZCkKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCX0KIAogCWlmIChtYWNoX2RlZmF1bHRfaGFuZGxlcikKLQkJaXJxX2xpc3RbaXJxXS5oYW5kbGVyID0gKCptYWNoX2RlZmF1bHRfaGFuZGxlcilbaXJxXTsKKwkJaXJxX2xpc3RbaXJxXS5oYW5kbGVyID0gbWFjaF9kZWZhdWx0X2hhbmRsZXI7CiAJZWxzZQogCQlpcnFfbGlzdFtpcnFdLmhhbmRsZXIgPSBkZWZhdWx0X2lycV9oYW5kbGVyOwogCWlycV9saXN0W2lycV0uZmxhZ3MgICA9IElSUV9GTEdfU1REOwpAQCAtMTY4LDggKzE2OCw3IEBACiBFWFBPUlRfU1lNQk9MKGZyZWVfaXJxKTsKIAogCi1pbnQgc3lzX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIAotICAgICAgICAgICAgICAgICAgICBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgCitpbnQgc3lzX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycV9oYW5kbGVyX3QgaGFuZGxlciwgCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKIHsKIAlpZiAoaXJxID4gSVJRNykgewpAQCAtMjExLDcgKzIxMCw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZW1vdmluZyBwcm9iYWJseSB3cm9uZyBJUlEgJWQgZnJvbSAlc1xuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBpcnFfbGlzdFtpcnFdLmRldm5hbWUpOwogCi0JaXJxX2xpc3RbaXJxXS5oYW5kbGVyID0gKCptYWNoX2RlZmF1bHRfaGFuZGxlcilbaXJxXTsKKwlpcnFfbGlzdFtpcnFdLmhhbmRsZXIgPSBtYWNoX2RlZmF1bHRfaGFuZGxlcjsKIAlpcnFfbGlzdFtpcnFdLmZsYWdzICAgPSAwOwogCWlycV9saXN0W2lycV0uZGV2X2lkICA9IE5VTEw7CiAJaXJxX2xpc3RbaXJxXS5kZXZuYW1lID0gTlVMTDsKQEAgLTI0MSw3ICsyNDAsNyBAQAogCWlmICh2ZWMgPj0gVkVDX0lOVDEgJiYgdmVjIDw9IFZFQ19JTlQ3KSB7CiAJCXZlYyAtPSBWRUNfU1BVUjsKIAkJa3N0YXRfY3B1KDApLmlycXNbdmVjXSsrOwotCQlpcnFfbGlzdFt2ZWNdLmhhbmRsZXIodmVjLCBpcnFfbGlzdFt2ZWNdLmRldl9pZCwgZnApOworCQlpcnFfbGlzdFt2ZWNdLmhhbmRsZXIodmVjLCBpcnFfbGlzdFt2ZWNdLmRldl9pZCk7CiAJfSBlbHNlIHsKIAkJaWYgKG1hY2hfcHJvY2Vzc19pbnQpCiAJCQltYWNoX3Byb2Nlc3NfaW50KHZlYywgZnApOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy90aW1lcnMuYyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzUzMDcvdGltZXJzLmMKaW5kZXggMjQ3ODFmMC4uZTU2NjhhZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNTMwNy90aW1lcnMuYworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS81MzA3L3RpbWVycy5jCkBAIC0zLDcgKzMsNyBAQAogLyoKICAqCXRpbWVycy5jIC0tIGdlbmVyaWMgQ29sZEZpcmUgaGFyZHdhcmUgdGltZXIgc3VwcG9ydC4KICAqCi0gKglDb3B5cmlnaHQgKEMpIDE5OTktMjAwMywgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqCUNvcHlyaWdodCAoQykgMTk5OS0yMDA2LCBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NCw2ICs0NCwxNCBAQAogZXh0ZXJuIHZvaWQgbWNmX3NldHRpbWVyaWNyKGludCB0aW1lciwgaW50IGxldmVsKTsKIGV4dGVybiBpbnQgbWNmX3RpbWVyaXJxcGVuZGluZyhpbnQgdGltZXIpOwogCisjaWYgZGVmaW5lZChDT05GSUdfTTUzMngpCisjZGVmaW5lCV9fcmF3X3JlYWR0cnIJX19yYXdfcmVhZGwKKyNkZWZpbmUJX19yYXdfd3JpdGV0cnIJX19yYXdfd3JpdGVsCisjZWxzZQorI2RlZmluZQlfX3Jhd19yZWFkdHJyCV9fcmF3X3JlYWR3CisjZGVmaW5lCV9fcmF3X3dyaXRldHJyCV9fcmF3X3dyaXRldworI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQgY29sZGZpcmVfdGljayh2b2lkKQpAQCAtNTcsNyArNjUsNyBAQAogdm9pZCBjb2xkZmlyZV90aW1lcl9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKQogewogCV9fcmF3X3dyaXRldyhNQ0ZUSU1FUl9UTVJfRElTQUJMRSwgVEEoTUNGVElNRVJfVE1SKSk7Ci0JX19yYXdfd3JpdGV3KCgoTUNGX0JVU0NMSyAvIDE2KSAvIEhaKSwgVEEoTUNGVElNRVJfVFJSKSk7CisJX19yYXdfd3JpdGV0cnIoKChNQ0ZfQlVTQ0xLIC8gMTYpIC8gSFopLCBUQShNQ0ZUSU1FUl9UUlIpKTsKIAlfX3Jhd193cml0ZXcoTUNGVElNRVJfVE1SX0VOT1JJIHwgTUNGVElNRVJfVE1SX0NMSzE2IHwKIAkJTUNGVElNRVJfVE1SX1JFU1RBUlQgfCBNQ0ZUSU1FUl9UTVJfRU5BQkxFLCBUQShNQ0ZUSU1FUl9UTVIpKTsKIApAQCAtNzYsNyArODQsNyBAQAogCXVuc2lnbmVkIGxvbmcgdHJyLCB0Y24sIG9mZnNldDsKIAogCXRjbiA9IF9fcmF3X3JlYWR3KFRBKE1DRlRJTUVSX1RDTikpOwotCXRyciA9IF9fcmF3X3JlYWR3KFRBKE1DRlRJTUVSX1RSUikpOworCXRyciA9IF9fcmF3X3JlYWR0cnIoVEEoTUNGVElNRVJfVFJSKSk7CiAJb2Zmc2V0ID0gKHRjbiAqICgxMDAwMDAwIC8gSFopKSAvIHRycjsKIAogCS8qIENoZWNrIGlmIHdlIGp1c3Qgd3JhcHBlZCB0aGUgY291bnRlcnMgYW5kIG1heWJlIG1pc3NlZCBhIHRpY2sgKi8KQEAgLTEyMCw3ICsxMjgsNyBAQAogCS8qIFNldCB1cCBUSU1FUiAyIGFzIGhpZ2ggc3BlZWQgcHJvZmlsZSBjbG9jayAqLwogCV9fcmF3X3dyaXRldyhNQ0ZUSU1FUl9UTVJfRElTQUJMRSwgUEEoTUNGVElNRVJfVE1SKSk7CiAKLQlfX3Jhd193cml0ZXcoKChNQ0ZfQ0xLIC8gMTYpIC8gUFJPRklMRUhaKSwgUEEoTUNGVElNRVJfVFJSKSk7CisJX19yYXdfd3JpdGV0cnIoKChNQ0ZfQ0xLIC8gMTYpIC8gUFJPRklMRUhaKSwgUEEoTUNGVElNRVJfVFJSKSk7CiAJX19yYXdfd3JpdGV3KE1DRlRJTUVSX1RNUl9FTk9SSSB8IE1DRlRJTUVSX1RNUl9DTEsxNiB8CiAJCU1DRlRJTUVSX1RNUl9SRVNUQVJUIHwgTUNGVElNRVJfVE1SX0VOQUJMRSwgUEEoTUNGVElNRVJfVE1SKSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2NvbmZpZy5jIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvY29uZmlnLmMKaW5kZXggYzU0ODJlMy4uMWIzNmY2MiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvY29uZmlnLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogewogfQogCi1pbnQgQlNQX2h3Y2xrKGludCBvcCwgc3RydWN0IGh3Y2xrX3RpbWUgKnQpCitpbnQgQlNQX2h3Y2xrKGludCBvcCwgc3RydWN0IHJ0Y190aW1lICp0KQogewogICBpZiAoIW9wKSB7CiAgICAgLyogcmVhZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvaGVhZC1yYW0uUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2hlYWQtcmFtLlMKaW5kZXggMmVhNTE0Ny4uMmVmMDYyNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvaGVhZC1yYW0uUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9oZWFkLXJhbS5TCkBAIC0yNSw2ICsyNSw3IEBACiAuZ2xvYmFsIF9wZXJpcGhfYmFzZQogCiAjZGVmaW5lCVJBTUVORCAgICAgICAgICAgICAgICAgICAgICAoQ09ORklHX1JBTUJBU0UgKyBDT05GSUdfUkFNU0laRSkKKyNkZWZpbmUJUk9NRU5EICAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfUk9NQkFTRSArIENPTkZJR19ST01TSVpFKQogCiAjZGVmaW5lIFJFR0IgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKICNkZWZpbmUgUEVQQVIgICAgICAgICAgICAgICAgICAgICAgIChfZHByYmFzZSArIFJFR0IgKyAweDAwMTYpCkBAIC0xNzUsNyArMTc2LDcgQEAKIAltb3ZlLmwJJWQwLCBCUjAKIAogY29uZmlndXJlX2NoaXBfc2VsZWN0XzE6Ci0JbW92ZS5sCSNfX3JvbV9lbmQsICVkMAorCW1vdmUubAkjUk9NRU5ELCAlZDAKIAlzdWJpLmwJI19fcm9tX3N0YXJ0LCAlZDAKIAlzdWJxLmwJIzB4MDEsICVkMAogCWVvcmkubAkjU0lNX09SX01BU0ssICVkMApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCAxNGFmNmNjLi5mZDJmZjA2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMTYsNiArMTYsNyBAQAogCWJvb2wgIjRHIFN5c3RlbXMgTVRYLTEgYm9hcmQiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKIAlzZWxlY3QgU09DX0FVMTUwMAogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KQEAgLTMyLDYgKzMzLDcgQEAKIAlzZWxlY3QgU09DX0FVMTAwMAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCkBAIC00MSw2ICs0Myw3IEBACiAJc2VsZWN0IFNPQ19BVTExMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQogCXNlbGVjdCBTV0FQX0lPX1NQQUNFCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgpAQCAtNTAsNiArNTMsNyBAQAogCXNlbGVjdCBTT0NfQVUxNTAwCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAKQEAgLTU5LDYgKzYzLDcgQEAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCkBAIC02Nyw2ICs3Miw3IEBACiAJc2VsZWN0IFNPQ19BVTEyMDAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIApAQCAtNzUsNiArODEsNyBAQAogCXNlbGVjdCBTT0NfQVUxMDAwCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAKQEAgLTkxLDYgKzk4LDcgQEAKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgpAQCAtMTAxLDYgKzEwOSw3IEBACiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIApAQCAtMTU2LDYgKzE2NSw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTCBpZiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KKwlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAKIGNvbmZpZyBNQUNIX0RFQ1NUQVRJT04KIAlib29sICJERUNzdGF0aW9ucyIKQEAgLTIxNiw2ICsyMjYsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwgaWYgRVhQRVJJTUVOVEFMCiAJc2VsZWN0IFNZU19TVVBQT1JUU18xMDBIWgorCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKIAloZWxwCiAJIFRoaXMgYSBmYW1pbHkgb2YgbWFjaGluZXMgYmFzZWQgb24gdGhlIE1JUFMgUjQwMzAgY2hpcHNldCB3aGljaCB3YXMKIAkgdXNlZCBieSBzZXZlcmFsIHZlbmRvcnMgdG8gYnVpbGQgUklTQy9vcyBhbmQgV2luZG93cyBOVCB3b3Jrc3RhdGlvbnMuCkBAIC0yMzMsNiArMjQ0LDcgQEAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKIAogY29uZmlnIE1JUFNfQVRMQVMKIAlib29sICJNSVBTIEF0bGFzIGJvYXJkIgpAQCAtMjU2LDYgKzI2OCw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IFNZU19TVVBQT1JUU19NVUxUSVRIUkVBRElORyBpZiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNSVBTIFRlY2hub2xvZ2llcyBBdGxhcyBldmFsdWF0aW9uCiAJICBib2FyZC4KQEAgLTI2Niw4ICsyNzksOCBAQAogCXNlbGVjdCBCT09UX0VMRjMyCiAJc2VsZWN0IEhBVkVfU1REX1BDX1NFUklBTF9QT1JUCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IEdFTkVSSUNfSVNBX0RNQQorCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgSTgyNTkKIAlzZWxlY3QgTUlQU19CT0FSRFNfR0VOCkBAIC00MTAsNiArNDIzLDcgQEAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCisJc2VsZWN0IEdFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUQogCWhlbHAKIAkgIFRoZSBPY2Vsb3QgaXMgYSBNSVBTLWJhc2VkIFNpbmdsZSBCb2FyZCBDb21wdXRlciAoU0JDKSBtYWRlIGJ5CiAJICBNb21lbnR1bSBDb21wdXRlciA8aHR0cDovL3d3dy5tb21lbmNvLmNvbS8+LgpAQCAtNDI1LDkgKzQzOSw4IEBACiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKIAlzZWxlY3QgU1lTX0hBU19DUFVfUk03MDAwCiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKLQlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEJST0tFTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgotCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAloZWxwCiAJICBUaGUgT2NlbG90IGlzIGEgTUlQUy1iYXNlZCBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgKFNCQykgbWFkZSBieQogCSAgTW9tZW50dW0gQ29tcHV0ZXIgPGh0dHA6Ly93d3cubW9tZW5jby5jb20vPi4KQEAgLTQ0OCw2ICs0NjEsMTEgQEAKIAlzZWxlY3QgUE5YODU1MAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCitjb25maWcgUE5YODU1MF9TVEI4MTAKKwlib29sICJTdXBwb3J0IGZvciBQaGlsaXBzIFBOWDg1NTAgYmFzZWQgU1RCODEwIGJvYXJkIgorCXNlbGVjdCBQTlg4NTUwCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisKIGNvbmZpZyBEREI1NDc3CiAJYm9vbCAiTkVDIEREQiBWcmMtNTQ3NyIKIAlzZWxlY3QgRERCNVhYWF9DT01NT04KQEAgLTQ3MSw2ICs0ODksNyBAQAogCXNlbGVjdCBTWVNfSEFTX0NQVV9WUjQxWFgKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKIAogY29uZmlnIFBNQ19ZT1NFTUlURQogCWJvb2wgIlBNQy1TaWVycmEgWW9zZW1pdGUgZXZhbCBib2FyZCIKQEAgLTUwNCw2ICs1MjMsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKKwlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAJaGVscAogCSAgUWVtdSBpcyBhIHNvZnR3YXJlIGVtdWxhdG9yIHdoaWNoIGFtb25nIG90aGVyIGFyY2hpdGVjdHVyZXMgYWxzbwogCSAgY2FuIHNpbXVsYXRlIGEgTUlQUzMyIDRLYyBzeXN0ZW0uICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgdGhlCkBAIC01MzUsNyArNTU1LDcgQEAKIAlzZWxlY3QgSFdfSEFTX0VJU0EKIAlzZWxlY3QgSVAyMl9DUFVfU0NBQ0hFCiAJc2VsZWN0IElSUV9DUFUKLQlzZWxlY3QgTk9fSVNBIGlmIElTQQorCXNlbGVjdCBHRU5FUklDX0lTQV9ETUFfU1VQUE9SVF9CUk9LRU4KIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBTWVNfSEFTX0NQVV9SNFgwMAogCXNlbGVjdCBTWVNfSEFTX0NQVV9SNTAwMApAQCAtNTYwLDYgKzU4MCw4IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX05VTUEKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAorCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKIAloZWxwCiAJICBUaGlzIGFyZSB0aGUgU0dJIE9yaWdpbiAyMDAsIE9yaWdpbiAyMDAwIGFuZCBPbnl4IDIgR3JhcGhpY3MKIAkgIHdvcmtzdGF0aW9ucy4gIFRvIGNvbXBpbGUgYSBMaW51eCBrZXJuZWwgdGhhdCBydW5zIG9uIHRoZXNlLCBzYXkgWQpAQCAtNjg4LDggKzcxMCw4IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19ISUdITUVNCiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAKLWNvbmZpZyBTTklfUk0yMDBfUENJCi0JYm9vbCAiU05JIFJNMjAwIFBDSSIKK2NvbmZpZyBTTklfUk0KKwlib29sICJTTkkgUk0yMDAvMzAwLzQwMCIKIAlzZWxlY3QgQVJDIGlmIENQVV9MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IEFSQzMyIGlmIENQVV9MSVRUTEVfRU5ESUFOCiAJc2VsZWN0IEFSQ0hfTUFZX0hBVkVfUENfRkRDCkBAIC03MTIsOCArNzM0LDggQEAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0hJR0hNRU0KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAloZWxwCi0JICBUaGUgU05JIFJNMjAwIFBDSSB3YXMgYSBNSVBTLWJhc2VkIHBsYXRmb3JtIG1hbnVmYWN0dXJlZCBieSBTaWVtZW5zCi0JICBOaXhkb3JmIEluZm9ybWF0aW9uc3N5c3RlbWUgKFNOSSksIHBhcmVudCBjb21wYW55IG9mIFB5cmFtaWQKKwkgIFRoZSBTTkkgUk0yMDAvMzAwLzQwMCBhcmUgTUlQUy1iYXNlZCBtYWNoaW5lcyBtYW51ZmFjdHVyZWQgYnkKKwkgIFNpZW1lbnMgTml4ZG9yZiBJbmZvcm1hdGlvbnNzeXN0ZW1lIChTTkkpLCBwYXJlbnQgY29tcGFueSBvZiBQeXJhbWlkCiAJICBUZWNobm9sb2d5IGFuZCBub3cgaW4gdHVybiBtZXJnZWQgd2l0aCBGdWppdHN1LiAgU2F5IFkgaGVyZSB0bwogCSAgc3VwcG9ydCB0aGlzIG1hY2hpbmUgdHlwZS4KIApAQCAtNzQxLDYgKzc2Myw3IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KIAlzZWxlY3QgVE9TSElCQV9CT0FSRFMKKwlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAJaGVscAogCSAgVGhpcyBUb3NoaWJhIGJvYXJkIGlzIGJhc2VkIG9uIHRoZSBUWDQ5MjcgcHJvY2Vzc29yLiBTYXkgWSBoZXJlIHRvCiAJICBzdXBwb3J0IHRoaXMgbWFjaGluZSB0eXBlCkBAIC03NjAsMTIgKzc4MywzMCBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgogCXNlbGVjdCBUT1NISUJBX0JPQVJEUworCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKIAloZWxwCiAJICBUaGlzIFRvc2hpYmEgYm9hcmQgaXMgYmFzZWQgb24gdGhlIFRYNDkzOCBwcm9jZXNzb3IuIFNheSBZIGhlcmUgdG8KIAkgIHN1cHBvcnQgdGhpcyBtYWNoaW5lIHR5cGUKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBLRVhFQworIAlib29sICJLZXhlYyBzeXN0ZW0gY2FsbCAoRVhQRVJJTUVOVEFMKSIKKyAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKyAJaGVscAorIAkgIGtleGVjIGlzIGEgc3lzdGVtIGNhbGwgdGhhdCBpbXBsZW1lbnRzIHRoZSBhYmlsaXR5IHRvIHNodXRkb3duIHlvdXIKKyAJICBjdXJyZW50IGtlcm5lbCwgYW5kIHRvIHN0YXJ0IGFub3RoZXIga2VybmVsLiAgSXQgaXMgbGlrZSBhIHJlYm9vdAorIAkgIGJ1dCBpdCBpcyBpbmRlcGVkZW50IG9mIHRoZSBzeXN0ZW0gZmlybXdhcmUuICAgQW5kIGxpa2UgYSByZWJvb3QKKyAJICB5b3UgY2FuIHN0YXJ0IGFueSBrZXJuZWwgd2l0aCBpdCwgbm90IGp1c3QgTGludXguCisKKyAJICBUaGUgbmFtZSBjb21lcyBmcm9tIHRoZSBzaW1pbGlhcml0eSB0byB0aGUgZXhlYyBzeXN0ZW0gY2FsbC4KKworIAkgIEl0IGlzIGFuIG9uZ29pbmcgcHJvY2VzcyB0byBiZSBjZXJ0YWluIHRoZSBoYXJkd2FyZSBpbiBhIG1hY2hpbmUKKyAJICBpcyBwcm9wZXJseSBzaHV0ZG93biwgc28gZG8gbm90IGJlIHN1cnByaXNlZCBpZiB0aGlzIGNvZGUgZG9lcyBub3QKKyAJICBpbml0aWFsbHkgd29yayBmb3IgeW91LiAgSXQgbWF5IGhlbHAgdG8gZW5hYmxlIGRldmljZSBob3RwbHVnZ2luZworIAkgIHN1cHBvcnQuICBBcyBvZiB0aGlzIHdyaXRpbmcgdGhlIGV4YWN0IGhhcmR3YXJlIGludGVyZmFjZSBpcworIAkgIHN0cm9uZ2x5IGluIGZsdXgsIHNvIG5vIGdvb2QgcmVjb21tZW5kYXRpb24gY2FuIGJlIG1hZGUuCisKIHNvdXJjZSAiYXJjaC9taXBzL2RkYjV4eHgvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2d0NjQxMjAvZXY2NDEyMC9LY29uZmlnIgogc291cmNlICJhcmNoL21pcHMvamF6ei9LY29uZmlnIgpAQCAtNzg5LDYgKzgzMCwxNCBAQAogY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCiAJYm9vbAogCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtODA5LDYgKzg1OCwxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEdFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUQorCWJvb2wKKwlkZWZhdWx0IG4KKwogIwogIyBTZWxlY3Qgc29tZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXV0b21hdGljYWxseSBiYXNlZCBvbiB1c2VyIHNlbGVjdGlvbnMuCiAjCkBAIC04NjQsOCArOTE3LDExIEBACiBjb25maWcgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQogCWJvb2wKIAorY29uZmlnIEdFTkVSSUNfSVNBX0RNQV9TVVBQT1JUX0JST0tFTgorCWJvb2wKKwogIwotIyBFbmRpYW5lc3Mgc2VsZWN0aW9uLiAgU3VmZmllbnRseSBvYnNjdXJlIHNvIG1hbnkgdXNlcnMgZG9uJ3Qga25vdyB3aGF0IHRvCisjIEVuZGlhbmVzcyBzZWxlY3Rpb24uICBTdWZmaWNpZW50bHkgb2JzY3VyZSBzbyBtYW55IHVzZXJzIGRvbid0IGtub3cgd2hhdCB0bwogIyBhbnN3ZXIsc28gd2UgdHJ5IGhhcmQgdG8gbGltaXQgdGhlIGF2YWlsYWJsZSBjaG9pY2VzLiAgQWxzbyB0aGUgdXNlIG9mIGEKICMgY2hvaWNlIHN0YXRlbWVudCBzaG91bGQgYmUgbW9yZSBvYnZpb3VzIHRvIHRoZSB1c2VyLgogIwpAQCAtODc0LDcgKzkzMCw3IEBACiAJaGVscAogCSAgU29tZSBNSVBTIG1hY2hpbmVzIGNhbiBiZSBjb25maWd1cmVkIGZvciBlaXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4KIAkgIGJ5dGUgb3JkZXIuIFRoZXNlIG1vZGVzIHJlcXVpcmUgZGlmZmVyZW50IGtlcm5lbHMgYW5kIGEgZGlmZmVyZW50Ci0JICBMaW51eCBkaXN0cmlidXRpb24uICBJbiBnZW5lcmFsIHRoZXJlIGlzIG9uZSBwcmVmZXJlZCBieXRlb3JkZXIgZm9yIGEKKwkgIExpbnV4IGRpc3RyaWJ1dGlvbi4gIEluIGdlbmVyYWwgdGhlcmUgaXMgb25lIHByZWZlcnJlZCBieXRlb3JkZXIgZm9yIGEKIAkgIHBhcnRpY3VsYXIgc3lzdGVtIGJ1dCBzb21lIHN5c3RlbXMgYXJlIGp1c3QgYXMgY29tbW9ubHkgdXNlZCBpbiB0aGUKIAkgIG9uZSBvciB0aGUgb3RoZXIgZW5kaWFuZXNzLgogCkBAIC05NjcsNiArMTAyMyw3IEBACiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKKwlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAKIGNvbmZpZyBTV0FQX0lPX1NQQUNFCiAJYm9vbApAQCAtMTAyNCwxNiArMTA4MSwxNiBAQAogCiBjb25maWcgQVJDX0NPTlNPTEUKIAlib29sICJBUkMgY29uc29sZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0dJX0lQMjIgfHwgU05JX1JNMjAwX1BDSQorCWRlcGVuZHMgb24gU0dJX0lQMjIgfHwgU05JX1JNCiAKIGNvbmZpZyBBUkNfTUVNT1JZCiAJYm9vbAotCWRlcGVuZHMgb24gTUFDSF9KQVpaIHx8IFNOSV9STTIwMF9QQ0kgfHwgU0dJX0lQMzIKKwlkZXBlbmRzIG9uIE1BQ0hfSkFaWiB8fCBTTklfUk0gfHwgU0dJX0lQMzIKIAlkZWZhdWx0IHkKIAogY29uZmlnIEFSQ19QUk9NTElCCiAJYm9vbAotCWRlcGVuZHMgb24gTUFDSF9KQVpaIHx8IFNOSV9STTIwMF9QQ0kgfHwgU0dJX0lQMjIgfHwgU0dJX0lQMzIKKwlkZXBlbmRzIG9uIE1BQ0hfSkFaWiB8fCBTTklfUk0gfHwgU0dJX0lQMjIgfHwgU0dJX0lQMzIKIAlkZWZhdWx0IHkKIAogY29uZmlnIEFSQzY0CkBAIC0xMjQ4LDYgKzEzMDUsNyBAQAogCXNlbGVjdCBDUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IENQVV9TVVBQT1JUU182NEJJVF9LRVJORUwKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTX0hJR0hNRU0KKwlzZWxlY3QgV0VBS19PUkRFUklORwogCiBjb25maWcgQ1BVX1NCMQogCWJvb2wgIlNCMSIKQEAgLTEyNTYsNiArMTMxNCw3IEBACiAJc2VsZWN0IENQVV9TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTAogCXNlbGVjdCBDUFVfU1VQUE9SVFNfSElHSE1FTQorCXNlbGVjdCBXRUFLX09SREVSSU5HCiAKIGVuZGNob2ljZQogCkBAIC0xMzE2LDYgKzEzNzUsOCBAQAogY29uZmlnIFNZU19IQVNfQ1BVX1NCMQogCWJvb2wKIAorY29uZmlnIFdFQUtfT1JERVJJTkcKKwlib29sCiBlbmRtZW51CiAKICMKQEAgLTE2MzMsOSArMTY5NCw2IEBACiAKIGNvbmZpZyBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKIAlib29sCi0KLWNvbmZpZyBBUkNIX1NQQVJTRU1FTV9FTkFCTEUKLQlib29sCiAJc2VsZWN0IFNQQVJTRU1FTV9TVEFUSUMKIAogY29uZmlnIE5VTUEKQEAgLTE2OTAsNiArMTc0OCw3IEBACiAJZGVwZW5kcyBvbiBTTVAKIAlkZWZhdWx0ICI2NCIgaWYgU0dJX0lQMjcKIAlkZWZhdWx0ICIyIgorCWRlZmF1bHQgIjgiIGlmIE1JUFNfTVRfU01UQwogCWhlbHAKIAkgIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHdoaWNoIHRoaXMKIAkgIGtlcm5lbCB3aWxsIHN1cHBvcnQuICBUaGUgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgMzIgZm9yIDMyLWJpdApAQCAtMTgzNywxMyArMTg5NiwxMSBAQAogY29uZmlnIElTQQogCWJvb2wKIAotY29uZmlnIE5PX0lTQQotCWJvb2wKLQogY29uZmlnIEVJU0EKIAlib29sICJFSVNBIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIV19IQVNfRUlTQQogCXNlbGVjdCBJU0EKKwlzZWxlY3QgR0VORVJJQ19JU0FfRE1BCiAJLS0taGVscC0tLQogCSAgVGhlIEV4dGVuZGVkIEluZHVzdHJ5IFN0YW5kYXJkIEFyY2hpdGVjdHVyZSAoRUlTQSkgYnVzIHdhcwogCSAgZGV2ZWxvcGVkIGFzIGFuIG9wZW4gYWx0ZXJuYXRpdmUgdG8gdGhlIElCTSBNaWNyb0NoYW5uZWwgYnVzLgpAQCAtMTkyNCw2ICsxOTgxLDExIEBACiAJZGVwZW5kcyBvbiBNSVBTMzJfQ09NUEFUCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBTWVNWSVBDX0NPTVBBVAorCWJvb2wKKwlkZXBlbmRzIG9uIENPTVBBVCAmJiBTWVNWSVBDCisJZGVmYXVsdCB5CisKIGNvbmZpZyBNSVBTMzJfTzMyCiAJYm9vbCAiS2VybmVsIHN1cHBvcnQgZm9yIG8zMiBiaW5hcmllcyIKIAlkZXBlbmRzIG9uIE1JUFMzMl9DT01QQVQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCA2NDFhYTMwLi5kMWIwMjZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC00NjMsNiArNDYzLDExIEBACiAjY2ZsYWdzLSQoQ09ORklHX1BOWDg1NTBfSkJTKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1wbng4NTUwCiBsb2FkLSQoQ09ORklHX1BOWDg1NTBfSkJTKQkrPSAweGZmZmZmZmZmODAwNjAwMDAKIAorIyBQaGlsaXBzIFBOWDg1NTAgU1RCODEwIGJvYXJkCisjCitsaWJzLSQoQ09ORklHX1BOWDg1NTBfU1RCODEwKQkrPSBhcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL3N0YjgxMC8KK2xvYWQtJChDT05GSUdfUE5YODU1MF9TVEI4MTApCSs9IDB4ZmZmZmZmZmY4MDA2MDAwMAorCiAjIE5FQyBFTU1BMlJIIGJvYXJkcwogIwogY29yZS0kKENPTkZJR19FTU1BMlJIKSAgICAgICAgICArPSBhcmNoL21pcHMvZW1tYTJyaC9jb21tb24vCkBAIC01NjksMTEgKzU3NCwxMSBAQAogbG9hZC0kKENPTkZJR19TSUJZVEVfQklHU1VSKQk6PSAweGZmZmZmZmZmODAxMDAwMDAKIAogIwotIyBTTkkgUk0yMDAgUENJCisjIFNOSSBSTQogIwotY29yZS0kKENPTkZJR19TTklfUk0yMDBfUENJKQkrPSBhcmNoL21pcHMvc25pLwotY2ZsYWdzLSQoQ09ORklHX1NOSV9STTIwMF9QQ0kpCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJtMjAwCi1sb2FkLSQoQ09ORklHX1NOSV9STTIwMF9QQ0kpCSs9IDB4ZmZmZmZmZmY4MDYwMDAwMAorY29yZS0kKENPTkZJR19TTklfUk0pCQkrPSBhcmNoL21pcHMvc25pLworY2ZsYWdzLSQoQ09ORklHX1NOSV9STSkJCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJtCitsb2FkLSQoQ09ORklHX1NOSV9STSkJCSs9IDB4ZmZmZmZmZmY4MDYwMDAwMAogCiAjCiAjIFRvc2hpYmEgSk1SLVRYMzkyNyBib2FyZApAQCAtNjk1LDcgKzcwMCw3IEBACiBhbGw6CXZtbGludXguYmluCiBlbmRpZgogCi1pZmRlZiBDT05GSUdfU05JX1JNMjAwX1BDSQoraWZkZWYgQ09ORklHX1NOSV9STQogYWxsOgl2bWxpbnV4LmVjb2ZmCiBlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9kYmRtYS5jIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vZGJkbWEuYwppbmRleCBjNGZhZThmLi42MjZkZTQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9kYmRtYS5jCisrKyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2RiZG1hLmMKQEAgLTg0OSw3ICs4NDksNyBAQAogRVhQT1JUX1NZTUJPTChhdTF4eHhfZGJkbWFfY2hhbl9mcmVlKTsKIAogc3RhdGljIGlycXJldHVybl90Ci1kYmRtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2RiZG1hX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJdTMyIGludHN0YXQ7CiAJdTMyIGNoYW5faW5kZXg7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9pcnEuYyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL2lycS5jCmluZGV4IDJhYmUxMzIuLjljZjdiNjcxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9pcnEuYworKysgYi9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9pcnEuYwpAQCAtNzAsNyArNzAsNiBAQAogZXh0ZXJuIHZvaWQgbWlwc190aW1lcl9pbnRlcnJ1cHQodm9pZCk7CiAKIHN0YXRpYyB2b2lkIHNldHVwX2xvY2FsX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgdHlwZSwgaW50IGludF9yZXEpOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGVuZF9pcnEodW5zaWduZWQgaW50IGlycV9ucik7CiBzdGF0aWMgaW5saW5lIHZvaWQgbWFza19hbmRfYWNrX2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2FuZF9hY2tfcmlzZV9lZGdlX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKTsKQEAgLTg0LDIwICs4Myw2IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlycV9sb2NrKTsKIAogCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JbG9jYWxfZW5hYmxlX2lycShpcnFfbnIpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIHNodXRkb3duX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCWxvY2FsX2Rpc2FibGVfaXJxKGlycV9ucik7Ci0JcmV0dXJuOwotfQotCi0KIGlubGluZSB2b2lkIGxvY2FsX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycV9ucikKIHsKIAlpZiAoaXJxX25yID4gQVUxMDAwX0xBU1RfSU5UQzBfSU5UKSB7CkBAIC0yNDksNDEgKzIzNCwzNyBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHJpc2VfZWRnZV9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiQXUxMDAwIFJpc2UgRWRnZSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9pcnEsCi0JLmVuYWJsZSA9IGxvY2FsX2VuYWJsZV9pcnEsCi0JLmRpc2FibGUgPSBsb2NhbF9kaXNhYmxlX2lycSwKIAkuYWNrID0gbWFza19hbmRfYWNrX3Jpc2VfZWRnZV9pcnEsCisJLm1hc2sgPSBsb2NhbF9kaXNhYmxlX2lycSwKKwkubWFza19hY2sgPSBtYXNrX2FuZF9hY2tfcmlzZV9lZGdlX2lycSwKKwkudW5tYXNrID0gbG9jYWxfZW5hYmxlX2lycSwKIAkuZW5kID0gZW5kX2lycSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZmFsbF9lZGdlX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJBdTEwMDAgRmFsbCBFZGdlIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2lycSwKLQkuZW5hYmxlID0gbG9jYWxfZW5hYmxlX2lycSwKLQkuZGlzYWJsZSA9IGxvY2FsX2Rpc2FibGVfaXJxLAogCS5hY2sgPSBtYXNrX2FuZF9hY2tfZmFsbF9lZGdlX2lycSwKKwkubWFzayA9IGxvY2FsX2Rpc2FibGVfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfYW5kX2Fja19mYWxsX2VkZ2VfaXJxLAorCS51bm1hc2sgPSBsb2NhbF9lbmFibGVfaXJxLAogCS5lbmQgPSBlbmRfaXJxLAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBlaXRoZXJfZWRnZV9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiQXUxMDAwIFJpc2Ugb3IgRmFsbCBFZGdlIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2lycSwKLQkuZW5hYmxlID0gbG9jYWxfZW5hYmxlX2lycSwKLQkuZGlzYWJsZSA9IGxvY2FsX2Rpc2FibGVfaXJxLAogCS5hY2sgPSBtYXNrX2FuZF9hY2tfZWl0aGVyX2VkZ2VfaXJxLAorCS5tYXNrID0gbG9jYWxfZGlzYWJsZV9pcnEsCisJLm1hc2tfYWNrID0gbWFza19hbmRfYWNrX2VpdGhlcl9lZGdlX2lycSwKKwkudW5tYXNrID0gbG9jYWxfZW5hYmxlX2lycSwKIAkuZW5kID0gZW5kX2lycSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbGV2ZWxfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkF1MTAwMCBMZXZlbCIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9pcnEsCi0JLmVuYWJsZSA9IGxvY2FsX2VuYWJsZV9pcnEsCi0JLmRpc2FibGUgPSBsb2NhbF9kaXNhYmxlX2lycSwKIAkuYWNrID0gbWFza19hbmRfYWNrX2xldmVsX2lycSwKKwkubWFzayA9IGxvY2FsX2Rpc2FibGVfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfYW5kX2Fja19sZXZlbF9pcnEsCisJLnVubWFzayA9IGxvY2FsX2VuYWJsZV9pcnEsCiAJLmVuZCA9IGVuZF9pcnEsCiB9OwogCkBAIC0zMjgsMzEgKzMwOSwzMSBAQAogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzJDTFIpOwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzFDTFIpOwogCQkJCWF1X3dyaXRlbCgxPDwoaXJxX25yLTMyKSwgSUMxX0NGRzBTRVQpOwotCQkJCWlycV9kZXNjW2lycV9ucl0uY2hpcCA9ICZyaXNlX2VkZ2VfaXJxX3R5cGU7CisJCQkJc2V0X2lycV9jaGlwKGlycV9uciwgJnJpc2VfZWRnZV9pcnFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOVENfSU5UX0ZBTExfRURHRTogLyogMDoxOjAgKi8KIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcyQ0xSKTsKIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcxU0VUKTsKIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcwQ0xSKTsKLQkJCQlpcnFfZGVzY1tpcnFfbnJdLmNoaXAgPSAmZmFsbF9lZGdlX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZmYWxsX2VkZ2VfaXJxX3R5cGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlRDX0lOVF9SSVNFX0FORF9GQUxMX0VER0U6IC8qIDA6MToxICovCiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMkNMUik7CiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMVNFVCk7CiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMFNFVCk7Ci0JCQkJaXJxX2Rlc2NbaXJxX25yXS5jaGlwID0gJmVpdGhlcl9lZGdlX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZlaXRoZXJfZWRnZV9pcnFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOVENfSU5UX0hJR0hfTEVWRUw6IC8qIDE6MDoxICovCiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMlNFVCk7CiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMUNMUik7CiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMFNFVCk7Ci0JCQkJaXJxX2Rlc2NbaXJxX25yXS5jaGlwID0gJmxldmVsX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZsZXZlbF9pcnFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOVENfSU5UX0xPV19MRVZFTDogLyogMToxOjAgKi8KIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcyU0VUKTsKIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcxU0VUKTsKIAkJCQlhdV93cml0ZWwoMTw8KGlycV9uci0zMiksIElDMV9DRkcwQ0xSKTsKLQkJCQlpcnFfZGVzY1tpcnFfbnJdLmNoaXAgPSAmbGV2ZWxfaXJxX3R5cGU7CisJCQkJc2V0X2lycV9jaGlwKGlycV9uciwgJmxldmVsX2lycV90eXBlKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSU5UQ19JTlRfRElTQUJMRUQ6IC8qIDA6MDowICovCiAJCQkJYXVfd3JpdGVsKDE8PChpcnFfbnItMzIpLCBJQzFfQ0ZHMENMUik7CkBAIC0zODAsMzEgKzM2MSwzMSBAQAogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcyQ0xSKTsKIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMUNMUik7CiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzBTRVQpOwotCQkJCWlycV9kZXNjW2lycV9ucl0uY2hpcCA9ICZyaXNlX2VkZ2VfaXJxX3R5cGU7CisJCQkJc2V0X2lycV9jaGlwKGlycV9uciwgJnJpc2VfZWRnZV9pcnFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOVENfSU5UX0ZBTExfRURHRTogLyogMDoxOjAgKi8KIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMkNMUik7CiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzFTRVQpOwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcwQ0xSKTsKLQkJCQlpcnFfZGVzY1tpcnFfbnJdLmNoaXAgPSAmZmFsbF9lZGdlX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZmYWxsX2VkZ2VfaXJxX3R5cGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJTlRDX0lOVF9SSVNFX0FORF9GQUxMX0VER0U6IC8qIDA6MToxICovCiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzJDTFIpOwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcxU0VUKTsKIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMFNFVCk7Ci0JCQkJaXJxX2Rlc2NbaXJxX25yXS5jaGlwID0gJmVpdGhlcl9lZGdlX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZlaXRoZXJfZWRnZV9pcnFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOVENfSU5UX0hJR0hfTEVWRUw6IC8qIDE6MDoxICovCiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzJTRVQpOwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcxQ0xSKTsKIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMFNFVCk7Ci0JCQkJaXJxX2Rlc2NbaXJxX25yXS5jaGlwID0gJmxldmVsX2lycV90eXBlOworCQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZsZXZlbF9pcnFfdHlwZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIElOVENfSU5UX0xPV19MRVZFTDogLyogMToxOjAgKi8KIAkJCQlhdV93cml0ZWwoMTw8aXJxX25yLCBJQzBfQ0ZHMlNFVCk7CiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzFTRVQpOwogCQkJCWF1X3dyaXRlbCgxPDxpcnFfbnIsIElDMF9DRkcwQ0xSKTsKLQkJCQlpcnFfZGVzY1tpcnFfbnJdLmNoaXAgPSAmbGV2ZWxfaXJxX3R5cGU7CisJCQkJc2V0X2lycV9jaGlwKGlycV9uciwgJmxldmVsX2lycV90eXBlKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgSU5UQ19JTlRfRElTQUJMRUQ6IC8qIDA6MDowICovCiAJCQkJYXVfd3JpdGVsKDE8PGlycV9uciwgSUMwX0NGRzBDTFIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vcHJvbS5jIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vcHJvbS5jCmluZGV4IGI0YjAxMGEuLjZmY2U2MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3Byb20uYworKysgYi9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9wcm9tLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIGV4dGVybiBjaGFyICoqcHJvbV9hcmd2LCAqKnByb21fZW52cDsKIAogCi1jaGFyICogcHJvbV9nZXRjbWRsaW5lKHZvaWQpCitjaGFyICogX19pbml0X29yX21vZHVsZSBwcm9tX2dldGNtZGxpbmUodm9pZCkKIHsKIAlyZXR1cm4gJihhcmNzX2NtZGxpbmVbMF0pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vc2V0dXAuYyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3NldHVwLmMKaW5kZXggMzc3YWUwZC4uOTE5MTcyZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vc2V0dXAuYwpAQCAtNDMsNyArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogCi1leHRlcm4gY2hhciAqIF9faW5pdCBwcm9tX2dldGNtZGxpbmUodm9pZCk7CitleHRlcm4gY2hhciAqIHByb21fZ2V0Y21kbGluZSh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKTsKIGV4dGVybiB2b2lkIGF1MTAwMF9yZXN0YXJ0KGNoYXIgKik7CiBleHRlcm4gdm9pZCBhdTEwMDBfaGFsdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3RpbWUuYyBiL2FyY2gvbWlwcy9hdTEwMDAvY29tbW9uL3RpbWUuYwppbmRleCA5NGYwOTE5Li5mYTFjNjJmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXUxMDAwL2NvbW1vbi90aW1lLmMKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9jb21tb24vdGltZS5jCkBAIC01Myw5ICs1Myw2IEBACiBpbnQJbm9fYXUxeHh4XzMya2h6OwogZXh0ZXJuIGludCBhbGxvd19hdTFrX3dhaXQ7IC8qIGRlZmF1bHQgb2ZmIGZvciBDUDAgQ291bnRlciAqLwogCi0vKiBDeWNsZSBjb3VudGVyIHZhbHVlIGF0IHRoZSBwcmV2aW91cyB0aW1lciBpbnRlcnJ1cHQuLiAqLwotc3RhdGljIHVuc2lnbmVkIGludCB0aW1lcmhpID0gMCwgdGltZXJsbyA9IDA7Ci0KICNpZmRlZiBDT05GSUdfUE0KICNpZiBIWiA8IDEwMCB8fCBIWiA+IDEwMDAKICNlcnJvciAidW5zdXBwb3J0ZWQgSFogdmFsdWUhIE11c3QgYmUgaW4gWzEwMCwxMDAwXSIKQEAgLTgyLDcgKzc5LDYgQEAKIHZvaWQgbWlwc190aW1lcl9pbnRlcnJ1cHQodm9pZCkKIHsKIAlpbnQgaXJxID0gNjM7Ci0JdW5zaWduZWQgbG9uZyBjb3VudDsKIAogCWlycV9lbnRlcigpOwogCWtzdGF0X3RoaXNfY3B1LmlycXNbaXJxXSsrOwpAQCAtOTEsMTAgKzg3LDYgQEAKIAkJZ290byBudWxsOwogCiAJZG8gewotCQljb3VudCA9IHJlYWRfYzBfY291bnQoKTsKLQkJdGltZXJoaSArPSAoY291bnQgPCB0aW1lcmxvKTsgICAvKiBXcmFwIGFyb3VuZCAqLwotCQl0aW1lcmxvID0gY291bnQ7Ci0KIAkJa3N0YXRfdGhpc19jcHUuaXJxc1tpcnFdKys7CiAJCWRvX3RpbWVyKDEpOwogI2lmbmRlZiBDT05GSUdfU01QCkBAIC0yMzEsNyArMjIzLDYgQEAKICAqLwogdW5zaWduZWQgbG9uZyBjYWxfcjRrb2ZmKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBjb3VudDsKIAl1bnNpZ25lZCBsb25nIGNwdV9zcGVlZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgY291bnRlcjsKQEAgLTI1OCw3ICsyNDksNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQVUxMDAwX1VTRTMySykKIAkJewotCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kLCBjb3VudDsKIAogCQkJc3RhcnQgPSBhdV9yZWFkbChTWVNfUlRDUkVBRCk7CiAJCQlzdGFydCArPSAyOwpAQCAtMjgyLDcgKzI3Myw2IEBACiAjZWxzZQogCQljcHVfc3BlZWQgPSAoYXVfcmVhZGwoU1lTX0NQVVBMTCkgJiAweDAwMDAwMDNmKSAqCiAJCQlBVTEwMDBfU1JDX0NMSzsKLQkJY291bnQgPSBjcHVfc3BlZWQgLyAyOwogI2VuZGlmCiAJfQogCWVsc2UgewpAQCAtMjkxLDk4ICsyODEsMTUgQEAKIAkJICogTk9URTogc29tZSBvbGQgc2lsaWNvbiBkb2Vzbid0IGFsbG93IHJlYWRpbmcgdGhlIFBMTC4KIAkJICovCiAJCWNwdV9zcGVlZCA9IChhdV9yZWFkbChTWVNfQ1BVUExMKSAmIDB4MDAwMDAwM2YpICogQVUxMDAwX1NSQ19DTEs7Ci0JCWNvdW50ID0gY3B1X3NwZWVkIC8gMjsKIAkJbm9fYXUxeHh4XzMya2h6ID0gMTsKIAl9Ci0JbWlwc19ocHRfZnJlcXVlbmN5ID0gY291bnQ7CisJbWlwc19ocHRfZnJlcXVlbmN5ID0gY3B1X3NwZWVkOwogCS8vIEVxdWF0aW9uOiBCYXVkcmF0ZSA9IENQVSAvIChTRCAqIDIgKiBDTEtESVYgKiAxNikKIAlzZXRfYXUxeDAwX3VhcnRfYmF1ZF9iYXNlKGNwdV9zcGVlZCAvICgyICogKChpbnQpKGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpJjB4MDMpICsgMikgKiAxNikpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVfbG9jaywgZmxhZ3MpOwogCXJldHVybiAoY3B1X3NwZWVkIC8gSFopOwogfQogCi0vKiBUaGlzIGlzIGZvciBtYWNoaW5lcyB3aGljaCBnZW5lcmF0ZSB0aGUgZXhhY3QgY2xvY2suICovCi0jZGVmaW5lIFVTRUNTX1BFUl9KSUZGWSAoMTAwMDAwMC9IWikKLSNkZWZpbmUgVVNFQ1NfUEVSX0pJRkZZX0ZSQUMgKDB4MTAwMDAwMDAwTEwqMTAwMDAwMC9IWiYweGZmZmZmZmZmKQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZGl2NjRfMzIodW5zaWduZWQgbG9uZyB2MSwgdW5zaWduZWQgbG9uZyB2MiwgdW5zaWduZWQgbG9uZyB2MykKLXsKLQl1bnNpZ25lZCBsb25nIHIwOwotCWRvX2RpdjY0XzMyKHIwLCB2MSwgdjIsIHYzKTsKLQlyZXR1cm4gcjA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRvX2Zhc3RfY3AwX2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLQl1MzIgY291bnQ7Ci0JdW5zaWduZWQgbG9uZyByZXMsIHRtcDsKLQl1bnNpZ25lZCBsb25nIHIwOwotCi0JLyogTGFzdCBqaWZmeSB3aGVuIGRvX2Zhc3RfZ2V0dGltZW9mZnNldCgpIHdhcyBjYWxsZWQuICovCi0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzPTA7Ci0JdW5zaWduZWQgbG9uZyBxdW90aWVudDsKLQotCS8qCi0JICogQ2FjaGVkICIxLyhjbG9ja3MgcGVyIHVzZWMpKjJeMzIiIHZhbHVlLgotCSAqIEl0IGhhcyB0byBiZSByZWNhbGN1bGF0ZWQgb25jZSBlYWNoIGppZmZ5LgotCSAqLwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGNhY2hlZF9xdW90aWVudD0wOwotCi0JdG1wID0gamlmZmllczsKLQotCXF1b3RpZW50ID0gY2FjaGVkX3F1b3RpZW50OwotCi0JaWYgKHRtcCAmJiBsYXN0X2ppZmZpZXMgIT0gdG1wKSB7Ci0JCWxhc3RfamlmZmllcyA9IHRtcDsKLQkJaWYgKGxhc3RfamlmZmllcyAhPSAwKSB7Ci0JCQlyMCA9IGRpdjY0XzMyKHRpbWVyaGksIHRpbWVybG8sIHRtcCk7Ci0JCQlxdW90aWVudCA9IGRpdjY0XzMyKFVTRUNTX1BFUl9KSUZGWSwgVVNFQ1NfUEVSX0pJRkZZX0ZSQUMsIHIwKTsKLQkJCWNhY2hlZF9xdW90aWVudCA9IHF1b3RpZW50OwotCQl9Ci0JfQotCi0JLyogR2V0IGxhc3QgdGltZXIgdGljayBpbiBhYnNvbHV0ZSBrZXJuZWwgdGltZSAqLwotCWNvdW50ID0gcmVhZF9jMF9jb3VudCgpOwotCi0JLyogLi4gcmVsYXRpdmUgdG8gcHJldmlvdXMgamlmZnkgKDMyIGJpdHMgaXMgZW5vdWdoKSAqLwotCWNvdW50IC09IHRpbWVybG87Ci0KLQlfX2FzbV9fKCJtdWx0dVx0JTEsJTJcblx0IgotCQkibWZoaVx0JTAiCi0JCTogIj1yIiAocmVzKQotCQk6ICJyIiAoY291bnQpLCAiciIgKHF1b3RpZW50KQotCQk6ICJoaSIsICJsbyIsIEdDQ19SRUdfQUNDVU0pOwotCi0JLyoKLQkgKiBEdWUgdG8gcG9zc2libGUgamlmZmllcyBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgdG8gY2hlY2sKLQkgKiB0aGUgcmVzdWx0IHNvIHRoYXQgd2UnbGwgZ2V0IGEgdGltZXIgdGhhdCBpcyBtb25vdG9uaWMuCi0JICovCi0JaWYgKHJlcyA+PSBVU0VDU19QRVJfSklGRlkpCi0JCXJlcyA9IFVTRUNTX1BFUl9KSUZGWS0xOwotCi0JcmV0dXJuIHJlczsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9fZmFzdF9wbV9nZXR0aW1lb2Zmc2V0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBwYzA7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLQlwYzAgPSBhdV9yZWFkbChTWVNfVE9ZUkVBRCk7Ci0JYXVfc3luYygpOwotCW9mZnNldCA9IHBjMCAtIGxhc3RfcGMwOwotCWlmIChvZmZzZXQgPiAyKk1BVENIMjBfSU5DKSB7Ci0JCXByaW50aygiaHVnZSBvZmZzZXQgJXgsIGxhc3RfcGMwICV4IGxhc3RfbWF0Y2gyMCAleCBwYzAgJXhcbiIsCi0JCQkJKHVuc2lnbmVkKW9mZnNldCwgKHVuc2lnbmVkKWxhc3RfcGMwLAotCQkJCSh1bnNpZ25lZClsYXN0X21hdGNoMjAsICh1bnNpZ25lZClwYzApOwotCX0KLQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZykoKG9mZnNldCAqIDMwNSkgLyAxMCk7Ci0JcmV0dXJuIG9mZnNldDsKLX0KLSNlbmRpZgotCiB2b2lkIF9faW5pdCBwbGF0X3RpbWVyX3NldHVwKHN0cnVjdCBpcnFhY3Rpb24gKmlycSkKIHsKIAl1bnNpZ25lZCBpbnQgZXN0X2ZyZXE7CkBAIC00MjAsNyArMzI3LDYgQEAKIAkJdW5zaWduZWQgaW50IGMwX3N0YXR1czsKIAogCQlwcmludGsoIldBUk5JTkc6IG5vIDMyS0h6IGNsb2NrIGZvdW5kLlxuIik7Ci0JCWRvX2dldHRpbWVvZmZzZXQgPSBkb19mYXN0X2NwMF9nZXR0aW1lb2Zmc2V0OwogCiAJCS8qIEVuc3VyZSB3ZSBnZXQgQ1BPX0NPVU5URVIgaW50ZXJydXB0cy4KIAkJKi8KQEAgLTQ0NSwxOSArMzUxLDExIEBACiAJCXdoaWxlIChhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfTTIwKTsKIAkJc3RhcnR1cF9tYXRjaDIwX2ludGVycnVwdChjb3VudGVyMF9pcnEpOwogCi0JCWRvX2dldHRpbWVvZmZzZXQgPSBkb19mYXN0X3BtX2dldHRpbWVvZmZzZXQ7Ci0KIAkJLyogV2UgY2FuIHVzZSB0aGUgcmVhbCAnd2FpdCcgaW5zdHJ1Y3Rpb24uCiAJCSovCiAJCWFsbG93X2F1MWtfd2FpdCA9IDE7CiAJfQogCi0jZWxzZQotCS8qIFdlIGhhdmUgdG8gZG8gdGhpcyBoZXJlIGluc3RlYWQgb2YgaW4gdGltZXJfaW5pdCBiZWNhdXNlCi0JICogdGhlIGdlbmVyaWMgY29kZSBpbiBhcmNoL21pcHMva2VybmVsL3RpbWUuYyB3aWxsIHdyaXRlCi0JICogb3ZlciBvdXIgZnVuY3Rpb24gcG9pbnRlci4KLQkgKi8KLQlkb19nZXR0aW1lb2Zmc2V0ID0gZG9fZmFzdF9jcDBfZ2V0dGltZW9mZnNldDsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL3BiMTIwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2F1MTAwMC9wYjEyMDAvYm9hcmRfc2V0dXAuYwppbmRleCA4Yjk1M2I5Li4wNDMzMDJiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYXUxMDAwL3BiMTIwMC9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hdTEwMDAvcGIxMjAwL2JvYXJkX3NldHVwLmMKQEAgLTU1LDcgKzU1LDcgQEAKICNlbmRpZgogCiBleHRlcm4gdm9pZCBfYm9hcmRfaW5pdF9pcnEodm9pZCk7Ci1leHRlcm4gdm9pZAkoKmJvYXJkX2luaXRfaXJxKSh2b2lkKTsKK2V4dGVybiB2b2lkICgqYm9hcmRfaW5pdF9pcnEpKHZvaWQpOwogCiB2b2lkIGJvYXJkX3Jlc2V0ICh2b2lkKQogewpAQCAtMTUxLDExICsxNTEsNyBAQAogI2VuZGlmCiAKIAkvKiBTZXR1cCBQYjEyMDAgRXh0ZXJuYWwgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KLQl7Ci0JCWV4dGVybiB2b2lkICgqYm9hcmRfaW5pdF9pcnEpKHZvaWQpOwotCQlleHRlcm4gdm9pZCBfYm9hcmRfaW5pdF9pcnEodm9pZCk7Ci0JCWJvYXJkX2luaXRfaXJxID0gX2JvYXJkX2luaXRfaXJxOwotCX0KKwlib2FyZF9pbml0X2lycSA9IF9ib2FyZF9pbml0X2lycTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29iYWx0L2lycS5jIGIvYXJjaC9taXBzL2NvYmFsdC9pcnEuYwppbmRleCA4MmU1NjlkLi40YzQ2ZjBlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29iYWx0L2lycS5jCisrKyBiL2FyY2gvbWlwcy9jb2JhbHQvaXJxLmMKQEAgLTQ1LDI1ICs0NSwyMiBAQAogewogCXVuc2lnbmVkIGludCBtYXNrLCBwZW5kaW5nLCBkZXZmbjsKIAotCW1hc2sgPSBHQUxJTEVPX0lOTChHVF9JTlRSTUFTS19PRlMpOwotCXBlbmRpbmcgPSBHQUxJTEVPX0lOTChHVF9JTlRSQ0FVU0VfT0ZTKSAmIG1hc2s7CisJbWFzayA9IEdUX1JFQUQoR1RfSU5UUk1BU0tfT0ZTKTsKKwlwZW5kaW5nID0gR1RfUkVBRChHVF9JTlRSQ0FVU0VfT0ZTKSAmIG1hc2s7CiAKLQlpZiAocGVuZGluZyAmIEdBTElMRU9fSU5UUl9UMEVYUCkgewotCi0JCUdBTElMRU9fT1VUTCh+R0FMSUxFT19JTlRSX1QwRVhQLCBHVF9JTlRSQ0FVU0VfT0ZTKTsKKwlpZiAocGVuZGluZyAmIEdUX0lOVFJfVDBFWFBfTVNLKSB7CisJCUdUX1dSSVRFKEdUX0lOVFJDQVVTRV9PRlMsIH5HVF9JTlRSX1QwRVhQX01TSyk7CiAJCWRvX0lSUShDT0JBTFRfR0FMSUxFT19JUlEpOwotCi0JfSBlbHNlIGlmIChwZW5kaW5nICYgR0FMSUxFT19JTlRSX1JFVFJZX0NUUikgewotCi0JCWRldmZuID0gR0FMSUxFT19JTkwoR1RfUENJMF9DRkdBRERSX09GUykgPj4gODsKLQkJR0FMSUxFT19PVVRMKH5HQUxJTEVPX0lOVFJfUkVUUllfQ1RSLCBHVF9JTlRSQ0FVU0VfT0ZTKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiR2FsaWxlbzogUENJIHJldHJ5IGNvdW50IGV4Y2VlZGVkICglMDJ4LiV1KVxuIiwKLQkJCVBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pKTsKLQorCX0gZWxzZSBpZiAocGVuZGluZyAmIEdUX0lOVFJfUkVUUllDVFIwX01TSykgeworCQlkZXZmbiA9IEdUX1JFQUQoR1RfUENJMF9DRkdBRERSX09GUykgPj4gODsKKwkJR1RfV1JJVEUoR1RfSU5UUkNBVVNFX09GUywgfkdUX0lOVFJfUkVUUllDVFIwX01TSyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJHYWxpbGVvOiBQQ0kgcmV0cnkgY291bnQgZXhjZWVkZWQgKCUwMnguJXUpXG4iLAorCQkgICAgICAgUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbikpOwogCX0gZWxzZSB7Ci0KLQkJR0FMSUxFT19PVVRMKG1hc2sgJiB+cGVuZGluZywgR1RfSU5UUk1BU0tfT0ZTKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiR2FsaWxlbzogbWFza2luZyB1bmV4cGVjdGVkIGludGVycnVwdCAlMDh4XG4iLCBwZW5kaW5nKTsKKwkJR1RfV1JJVEUoR1RfSU5UUk1BU0tfT0ZTLCBtYXNrICYgfnBlbmRpbmcpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiR2FsaWxlbzogbWFza2luZyB1bmV4cGVjdGVkIGludGVycnVwdCAlMDh4XG4iLCBwZW5kaW5nKTsKIAl9CiB9CiAKQEAgLTEwNCw3ICsxMDEsNyBAQAogCSAqIE1hc2sgYWxsIEdhbGlsZW8gaW50ZXJydXB0cy4gVGhlIEdhbGlsZW8KIAkgKiBoYW5kbGVyIGlzIHNldCBpbiBjb2JhbHRfdGltZXJfc2V0dXAoKQogCSAqLwotCUdBTElMRU9fT1VUTCgwLCBHVF9JTlRSTUFTS19PRlMpOworCUdUX1dSSVRFKEdUX0lOVFJNQVNLX09GUywgMCk7CiAKIAlpbml0X2k4MjU5X2lycXMoKTsJCQkJLyogIDAgLi4uIDE1ICovCiAJbWlwc19jcHVfaXJxX2luaXQoQ09CQUxUX0NQVV9JUlEpOwkJLyogMTYgLi4uIDIzICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29iYWx0L3NldHVwLmMgYi9hcmNoL21pcHMvY29iYWx0L3NldHVwLmMKaW5kZXggYmY5ZGM3Mi4uZThmMGYyMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvYmFsdC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9jb2JhbHQvc2V0dXAuYwpAQCAtNTEsMjMgKzUxLDIzIEBACiB2b2lkIF9faW5pdCBwbGF0X3RpbWVyX3NldHVwKHN0cnVjdCBpcnFhY3Rpb24gKmlycSkKIHsKIAkvKiBMb2FkIHRpbWVyIHZhbHVlIGZvciBIWiAoVENMSyBpcyA1ME1IeikgKi8KLQlHQUxJTEVPX09VVEwoNTAqMTAwMCoxMDAwIC8gSFosIEdUX1RDMF9PRlMpOworCUdUX1dSSVRFKEdUX1RDMF9PRlMsIDUwKjEwMDAqMTAwMCAvIEhaKTsKIAogCS8qIEVuYWJsZSB0aW1lciAqLwotCUdBTElMRU9fT1VUTChHQUxJTEVPX0VOVEMwIHwgR0FMSUxFT19TRUxUQzAsIEdUX1RDX0NPTlRST0xfT0ZTKTsKKwlHVF9XUklURShHVF9UQ19DT05UUk9MX09GUywgR1RfVENfQ09OVFJPTF9FTlRDMF9NU0sgfCBHVF9UQ19DT05UUk9MX1NFTFRDMF9NU0spOwogCiAJLyogUmVnaXN0ZXIgaW50ZXJydXB0ICovCiAJc2V0dXBfaXJxKENPQkFMVF9HQUxJTEVPX0lSUSwgaXJxKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KLQlHQUxJTEVPX09VVEwoR0FMSUxFT19JTlRSX1QwRVhQIHwgR0FMSUxFT19JTkwoR1RfSU5UUk1BU0tfT0ZTKSwgR1RfSU5UUk1BU0tfT0ZTKTsKKwlHVF9XUklURShHVF9JTlRSTUFTS19PRlMsIEdUX0lOVFJfVDBFWFBfTVNLIHwgR1RfUkVBRChHVF9JTlRSTUFTS19PRlMpKTsKIH0KIAogZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGd0NjQxMTFfcGNpX29wczsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfbWVtX3Jlc291cmNlID0gewotCS5zdGFydAk9IEdUNjQxMTFfTUVNX0JBU0UsCi0JLmVuZAk9IEdUNjQxMTFfTUVNX0VORCwKKwkuc3RhcnQJPSBHVF9ERUZfUENJMF9NRU0wX0JBU0UsCisJLmVuZAk9IEdUX0RFRl9QQ0kwX01FTTBfQkFTRSArIEdUX0RFRl9QQ0kwX01FTTBfU0laRSAtIDEsCiAJLm5hbWUJPSAiUENJIG1lbW9yeSIsCiAJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KIH07CkBAIC0xMTUsNyArMTE1LDcgQEAKIAkubWVtX3Jlc291cmNlCT0gJmNvYmFsdF9tZW1fcmVzb3VyY2UsCiAJLm1lbV9vZmZzZXQJPSAwLAogCS5pb19yZXNvdXJjZQk9ICZjb2JhbHRfaW9fcmVzb3VyY2UsCi0JLmlvX29mZnNldAk9IDAgLSBHVDY0MTExX0lPX0JBU0UKKwkuaW9fb2Zmc2V0CT0gMCAtIEdUX0RFRl9QQ0kwX0lPX0JBU0UsCiB9OwogCiB2b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKQpAQCAtMTI4LDcgKzEyOCw3IEBACiAJX21hY2hpbmVfaGFsdCA9IGNvYmFsdF9tYWNoaW5lX2hhbHQ7CiAJcG1fcG93ZXJfb2ZmID0gY29iYWx0X21hY2hpbmVfcG93ZXJfb2ZmOwogCi0gICAgICAgIHNldF9pb19wb3J0X2Jhc2UoQ0tTRUcxQUREUihHVDY0MTExX0lPX0JBU0UpKTsKKwlzZXRfaW9fcG9ydF9iYXNlKENLU0VHMUFERFIoR1RfREVGX1BDSTBfSU9fQkFTRSkpOwogCiAJLyogSS9PIHBvcnQgcmVzb3VyY2UgbXVzdCBpbmNsdWRlIFVBUlQgYW5kIExDRC9idXR0b25zICovCiAJaW9wb3J0X3Jlc291cmNlLmVuZCA9IDB4MGZmZmZmZmY7CkBAIC0xMzksNyArMTM5LDcgQEAKIAogICAgICAgICAvKiBSZWFkIHRoZSBjb2JhbHQgaWQgcmVnaXN0ZXIgb3V0IG9mIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCiAgICAgICAgIFBDSV9DRkdfU0VUKGRldmZuLCAoVklBX0NPQkFMVF9CUkRfSURfUkVHICYgfjB4MykpOwotICAgICAgICBjb2JhbHRfYm9hcmRfaWQgPSBHQUxJTEVPX0lOTChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKKyAgICAgICAgY29iYWx0X2JvYXJkX2lkID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKICAgICAgICAgY29iYWx0X2JvYXJkX2lkID4+PSAoKFZJQV9DT0JBTFRfQlJEX0lEX1JFRyAmIDMpICogOCk7CiAgICAgICAgIGNvYmFsdF9ib2FyZF9pZCA9IFZJQV9DT0JBTFRfQlJEX1JFR190b19JRChjb2JhbHRfYm9hcmRfaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9hdGxhc19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9hdGxhc19kZWZjb25maWcKaW5kZXggMzU5MzFiZS4uYWMxODkxNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvYXRsYXNfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2F0bGFzX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZwppbmRleCBiYTNiZjczLi45NTU0MjU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcKQEAgLTU3LDcgKzU3LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvY2FwY2VsbGFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvY2FwY2VsbGFfZGVmY29uZmlnCmluZGV4IGU1MzU4MTIuLjQ5NTkwZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2NhcGNlbGxhX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9jYXBjZWxsYV9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2NvYmFsdF9kZWZjb25maWcKaW5kZXggYWRmMWU4Yy4uMDYwN2ZjMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9jb2JhbHRfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTAwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kYjEwMDBfZGVmY29uZmlnCmluZGV4IDRmZDI5ZmYuLjFhNTdiMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjExMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMTAwX2RlZmNvbmZpZwppbmRleCAwMjViOTYwLi4wMDU1ZWM0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjExMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTEwMF9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTIwMF9kZWZjb25maWcKaW5kZXggODBjOWRkOS4uYzQxODIzYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjEyMDBfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTUwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kYjE1MDBfZGVmY29uZmlnCmluZGV4IDZjYWE5MGIuLjdkNmQ5MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTAwX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjE1NTBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTUwX2RlZmNvbmZpZwppbmRleCBjNmNhZTg2Li5jNjgxYzkxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjE1NTBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTU1MF9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGRiNTQ3N19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc3X2RlZmNvbmZpZwppbmRleCA3MmYyNDAwLi5kZDRiYjAwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc3X2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kZWNzdGF0aW9uX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RlY3N0YXRpb25fZGVmY29uZmlnCmluZGV4IGZlMTM4N2UuLjhhMzFjZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RlY3N0YXRpb25fZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RlY3N0YXRpb25fZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2U1NV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9lNTVfZGVmY29uZmlnCmluZGV4IDYxMzNjMjguLjZmYTRmOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2U1NV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZTU1X2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9lbW1hMnJoX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2VtbWEycmhfZGVmY29uZmlnCmluZGV4IGE0ODRiN2QuLjRjOWQwNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2VtbWEycmhfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2VtbWEycmhfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2V2NjQxMjBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKaW5kZXggMjFiZmNkZS4uZDViNDk3MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZXhjaXRlX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2V4Y2l0ZV9kZWZjb25maWcKaW5kZXggMWE1YjA2Yy4uNjk3MTQwYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZXhjaXRlX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9leGNpdGVfZGVmY29uZmlnCkBAIC02MCw3ICs2MCw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2lwMjJfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXAyMl9kZWZjb25maWcKaW5kZXggMjFkNTNlMC4uZjk4MTJkMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvaXAyMl9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXAyMl9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvaXAyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9pcDI3X2RlZmNvbmZpZwppbmRleCBlM2U5NGM3Li45NjA5MGYyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pcDI3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9pcDI3X2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9pcDMyX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCmluZGV4IGI0YWIyYmUuLjYxZTA2OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2lwMzJfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2phZ3Vhci1hdHhfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvamFndWFyLWF0eF9kZWZjb25maWcKaW5kZXggOWQ0ZDE3YS4uODg5NjY2NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvamFndWFyLWF0eF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvamFndWFyLWF0eF9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvamF6el9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qYXp6X2RlZmNvbmZpZwppbmRleCAzODIwODNlLi44MzU3NjRkOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvamF6el9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvamF6el9kZWZjb25maWcKQEAgLTU3LDcgKzU3LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwppbmRleCBkMDM3NDY2Li41MGZkOTU1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogQ09ORklHX1RPU0hJQkFfSk1SMzkyNz15CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbGFzYXQyMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbGFzYXQyMDBfZGVmY29uZmlnCmluZGV4IDFkYjgyNDkuLjA1ZjUzOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2xhc2F0MjAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9sYXNhdDIwMF9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnCmluZGV4IDEwMWU4MDMuLjk2ZTk0MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcKQEAgLTU3LDcgKzU3LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApAQCAtNjQ0LDcgKzY0NCw4NSBAQAogIwogIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCiAjCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorQ09ORklHX01URF9DRklfU1RBQT15CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHgwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTAKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAogCiAjCiAjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbWlwc3NpbV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9taXBzc2ltX2RlZmNvbmZpZwppbmRleCBhM2NiZDIzYi4uMDNlZmNmZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbWlwc3NpbV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWlwc3NpbV9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbXBjMzB4X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21wYzMweF9kZWZjb25maWcKaW5kZXggNjU3MGI0Ny4uZTQyMjFhYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvbXBjMzB4X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tcGMzMHhfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF8zX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF8zX2RlZmNvbmZpZwppbmRleCA0NDBkNjVmLi4zMmIxYWZkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfM19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90XzNfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9jX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9jX2RlZmNvbmZpZwppbmRleCBjMmM3YWU3Li5lYmU3NWMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfY19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2NfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZGVmY29uZmlnCmluZGV4IDY3ZWZlMjcuLjVhOTYwM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZ19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZ19kZWZjb25maWcKaW5kZXggYTEwZjM0ZC4uNDZhOTQyYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2dfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9nX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wYjExMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMTAwX2RlZmNvbmZpZwppbmRleCA5ZTY3MmY2Li43ZDNjNjg4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9wYjExMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTEwMF9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTUwMF9kZWZjb25maWcKaW5kZXggZDBjMGY0YS4uYTc3ODA1YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wYjE1MDBfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTU1MF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wYjE1NTBfZGVmY29uZmlnCmluZGV4IDNkYjc0MjcuLjgzMThkNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTU1MF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTUwX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLWpic19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLWpic19kZWZjb25maWcKaW5kZXggMjZiMGI5OC4uZmNiOGZlYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC1qYnNfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtamJzX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1yYzEKLSMgVGh1IEp1bCAgNiAxMDowNDoxOCAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMyCisjIFNhdCBPY3QgMTQgMjM6MDE6MTYgMjAwNgogIwogQ09ORklHX01JUFM9eQogCkBAIC0yNSw4ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAogIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19BVExBUyBpcyBub3Qgc2V0CkBAIC00MSwxMyArMzksMTMgQEAKICMgQ09ORklHX01PTUVOQ09fT0NFTE9UX0cgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19YWFMxNTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1BOWDg1NTBfVjJQQ0kgaXMgbm90IHNldAotIyBDT05GSUdfUE5YODU1MF9KQlMgaXMgbm90IHNldAorQ09ORklHX1BOWDg1NTBfSkJTPXkKICMgQ09ORklHX0REQjU0NzcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9WUjQxWFggaXMgbm90IHNldAogIyBDT05GSUdfUE1DX1lPU0VNSVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX1FFTVUgaXMgbm90IHNldAogIyBDT05GSUdfTUFSS0VJTlMgaXMgbm90IHNldAotQ09ORklHX1NHSV9JUDIyPXkKKyMgQ09ORklHX1NHSV9JUDIyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NHSV9JUDI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NHSV9JUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9CSUdTVVIgaXMgbm90IHNldApAQCAtNTksNyArNTcsNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CkBAIC02NywyNSArNjUsMjEgQEAKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKLUNPTkZJR19BUkM9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15Ci1DT05GSUdfQ1BVX0JJR19FTkRJQU49eQotIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAotQ09ORklHX1NZU19TVVBQT1JUU19CSUdfRU5ESUFOPXkKLUNPTkZJR19JUlFfQ1BVPXkKLUNPTkZJR19TV0FQX0lPX1NQQUNFPXkKLUNPTkZJR19BUkMzMj15Ci1DT05GSUdfQk9PVF9FTEYzMj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX1NZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOPXkKK0NPTkZJR19QTlg4NTUwPXkKK0NPTkZJR19TT0NfUE5YODU1MD15CiBDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVD01Ci0jIENPTkZJR19BUkNfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDX1BST01MSUI9eQogCiAjCiAjIENQVSBzZWxlY3Rpb24KICMKLSMgQ09ORklHX0NQVV9NSVBTMzJfUjEgaXMgbm90IHNldAorQ09ORklHX0NQVV9NSVBTMzJfUjE9eQogIyBDT05GSUdfQ1BVX01JUFMzMl9SMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfTUlQUzY0X1IxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9NSVBTNjRfUjIgaXMgbm90IHNldApAQCAtOTMsNyArODcsNyBAQAogIyBDT05GSUdfQ1BVX1RYMzlYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfVlI0MVhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9SNDMwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX1I0WDAwPXkKKyMgQ09ORklHX0NQVV9SNFgwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfVFg0OVhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9SNTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUjU0MzIgaXMgbm90IHNldApAQCAtMTA0LDEyICs5OCwxMSBAQAogIyBDT05GSUdfQ1BVX1JNNzAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUk05MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TQjEgaXMgbm90IHNldAotQ09ORklHX1NZU19IQVNfQ1BVX1I0WDAwPXkKLUNPTkZJR19TWVNfSEFTX0NQVV9SNTAwMD15CitDT05GSUdfU1lTX0hBU19DUFVfTUlQUzMyX1IxPXkKK0NPTkZJR19DUFVfTUlQUzMyPXkKK0NPTkZJR19DUFVfTUlQU1IxPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKLUNPTkZJR19TWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMPXkKIENPTkZJR19DUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKLUNPTkZJR19DUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMPXkKIAogIwogIyBLZXJuZWwgdHlwZQpAQCAtMTIwLDE3ICsxMTMsMTcgQEAKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAotQ09ORklHX0JPQVJEX1NDQUNIRT15Ci1DT05GSUdfSVAyMl9DUFVfU0NBQ0hFPXkKK0NPTkZJR19DUFVfSEFTX1BSRUZFVENIPXkKIENPTkZJR19NSVBTX01UX0RJU0FCTEVEPXkKLSMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX01UX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX01UX1NNVEMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19WUEVfTE9BREVSIGlzIG5vdCBzZXQKICMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19MTFNDPXkKIENPTkZJR19DUFVfSEFTX1NZTkM9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19DUFVfU1VQUE9SVFNfSElHSE1FTT15CiBDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiBDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQpAQCAtMTQ0LDEyICsxMzcsMTIgQEAKICMgQ09ORklHX0haXzQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMjggaXMgbm90IHNldAotIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQogIyBDT05GSUdfSFpfMjU2IGlzIG5vdCBzZXQKLUNPTkZJR19IWl8xMDAwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAyNCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTX1NVUFBPUlRTX0FSQklUX0haPXkKLUNPTkZJR19IWj0xMDAwCitDT05GSUdfSFo9MjUwCiBDT05GSUdfUFJFRU1QVF9OT05FPXkKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldApAQCAtMTcxLDE2ICsxNjQsMjAgQEAKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTE4OSwxMiArMTg2LDEyIEBACiBDT05GSUdfQlVHPXkKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldApAQCAtMjExLDYgKzIwOCw3IEBACiAjCiAjIEJsb2NrIGxheWVyCiAjCitDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKQEAgLTIzMSw4ICsyMjksMTAgQEAKICMKICMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBJU0EsIFRDKQogIwotQ09ORklHX0hXX0hBU19FSVNBPXkKLSMgQ09ORklHX0VJU0EgaXMgbm90IHNldAorQ09ORklHX0hXX0hBU19QQ0k9eQorQ09ORklHX1BDST15CisjIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NTVU9eQogCiAjCkBAIC0yNDMsNiArMjQzLDcgQEAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydAogIworIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCkBAIC0yNjUsNiArMjY2LDcgQEAKIENPTkZJR19VTklYPXkKIENPTkZJR19YRlJNPXkKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMjgzLDE2ICsyODUsMTggQEAKICMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCi1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRXT1JLX1NFQ01BUks9eQorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKICMKQEAgLTMxOCw3ICszMjIsNiBAQAogIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAogIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAKQEAgLTM3MSwxMyArMzc0LDIwIEBACiAjCiAjIEJsb2NrIGRldmljZXMKICMKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfTE9PUD15CiAjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CkBAIC0zODYsNiArMzk2LDcgQEAKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwogQ09ORklHX0lERT15CitDT05GSUdfSURFX01BWF9IV0lGUz00CiBDT05GSUdfQkxLX0RFVl9JREU9eQogCiAjCkBAIC00MDQsOCArNDE1LDM5IEBACiAjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKICMKIENPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorQ09ORklHX0lERVBDSV9TSEFSRV9JUlE9eQorQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQ9eQorQ09ORklHX0JMS19ERVZfR0VORVJJQz15CisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CisjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX1BDSV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0hQVDM2Nj15CisjIENPTkZJR19CTEtfREVWX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAogIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiAKQEAgLTQxNCw2ICs0NTYsNyBAQAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ORVRMSU5LPXkKIENPTkZJR19TQ1NJX1BST0NfRlM9eQogCiAjCkBAIC00MzQsMjIgKzQ3Nyw1NCBAQAogIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKIAogIwotIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjIFNDU0kgVHJhbnNwb3J0cwogIwogIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfRkNfQVRUUlM9eQogQ09ORklHX1NDU0lfSVNDU0lfQVRUUlM9bQogIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCiAjCiBDT05GSUdfSVNDU0lfVENQPW0KLSMgQ09ORklHX1NHSVdEOTNfU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogCiAjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQogIwogIyBDT05GSUdfTUQgaXMgbm90IHNldApAQCAtNDU4LDE0ICs1MzMsMTkgQEAKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKIAogIwogIyBJMk8gZGV2aWNlIHN1cHBvcnQKICMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydApAQCAtNDc3LDYgKzU1NywxMSBAQAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKIAogIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIwogIyBQSFkgZGV2aWNlIHN1cHBvcnQKICMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CkBAIC00ODYsMjAgKzU3MSw3MyBAQAogIwogQ09ORklHX05FVF9FVEhFUk5FVD15CiBDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSVNFRVEgaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CitDT05GSUdfODEzOVRPTz15CisjIENPTkZJR184MTM5VE9PX1BJTyBpcyBub3Qgc2V0CitDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVI9eQorQ09ORklHXzgxMzlUT09fODEyOT15CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19MQU5fU0FBOTczMCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKICMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKICMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKICMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwogIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKQEAgLTUxMCw4ICs2NDgsMTEgQEAKICMgV2FuIGludGVyZmFjZXMKICMKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKQEAgLTUzMSw2ICs2NzIsNyBAQAogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTU1Niw2ICs2OTgsNyBAQAogQ09ORklHX1NFUklPPXkKICMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJT19MSUJQUzI9eQogIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKQEAgLTU2Niw3ICs3MDksNyBAQAogQ09ORklHX1ZUPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKLUNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTU3Nyw3ICs3MjAsOCBAQAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRVJJQUxfSVAyMl9aSUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfSVAzMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTU5MSwxNiArNzM1LDE3IEBACiAjIFdhdGNoZG9nIENhcmRzCiAjCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CiAjIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0RTMTI4NiBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogCiAjCiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCkBAIC02MzEsMzUgKzc3NiwzNyBAQAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKICMKICMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCi0jIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9ORVdQT1JUX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZApAQCAtNjY5LDE1ICs4MTYsMTMxIEBACiAjCiAjIFVTQiBzdXBwb3J0CiAjCi0jIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKKyMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1VTQl9VSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKworIworIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAogCiAjCiAjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKICMKIAogIworIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9eQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUI9eQorQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT009eQorQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMD15CitDT05GSUdfVVNCX1NUT1JBR0VfRFBDTT15CitDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQ9eQorQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOT15CitDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1PXkKK0NPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVD15CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworCisjCisjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCiAjIFVTQiBHYWRnZXQgU3VwcG9ydAogIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CkBAIC03MDMsNiArOTY2LDcgQEAKICMKICMgSW5maW5pQmFuZCBzdXBwb3J0CiAjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIwogIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKQEAgLTczMywxMCArOTk3LDEyIEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTc2OSw4ICsxMDM1LDEwIEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiAjIENPTkZJR19QUk9DX0tDT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTgxMyw3ICsxMDgxLDYgQEAKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19ERUJVRzIgaXMgbm90IHNldAogIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTgyNCw3ICsxMDkxLDYgQEAKICMKICMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLUNPTkZJR19TR0lfUEFSVElUSU9OPXkKIAogIwogIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydApAQCAtODgwLDYgKzExNDYsNyBAQAogIwogQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKQEAgLTg5MywxMyArMTE2MCwxNyBAQAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX01VVEVYRVM9eQogIyBDT05GSUdfREVCVUdfUldTRU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0NST1NTQ09NUElMRT15CiBDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMSwzODQwMG44IGtnZGI9dHR5UzAgcm9vdD0vZGV2L25mcyBpcD1ib290cCIKQEAgLTkxOCw2ICsxMTg5LDkgQEAKICMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCiAjCiBDT05GSUdfQ1JZUFRPPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJPW0KK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fTUFOQUdFUj1tCiAjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKQEAgLTkyNyw2ICsxMjAxLDggQEAKICMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9bQogIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC1zdGI4MTBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC1zdGI4MTBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGEyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXN0YjgxMF9kZWZjb25maWcKQEAgLTAsMCArMSwxMjI5IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTkKKyMgVGh1IERlYyAgNyAxNjozNToxMiAyMDA2CisjCitDT05GSUdfTUlQUz15CisKKyMKKyMgTWFjaGluZSBzZWxlY3Rpb24KKyMKKyMgQ09ORklHX01JUFNfTVRYMSBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX0JPU1BPUlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfUEIxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfREIxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTUlSQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBU0xFUl9FWENJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAorIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19BVExBUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX01BTFRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfU0VBRCBpcyBub3Qgc2V0CisjIENPTkZJR19XUl9QUE1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PTUVOQ09fSkFHVUFSX0FUWCBpcyBub3Qgc2V0CisjIENPTkZJR19NT01FTkNPX09DRUxPVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT01FTkNPX09DRUxPVF8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PTUVOQ09fT0NFTE9UX0MgaXMgbm90IHNldAorIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfRyBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX1hYUzE1MDAgaXMgbm90IHNldAorIyBDT05GSUdfUE5YODU1MF9WMlBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QTlg4NTUwX0pCUyBpcyBub3Qgc2V0CitDT05GSUdfUE5YODU1MF9TVEI4MTA9eQorIyBDT05GSUdfRERCNTQ3NyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1ZSNDFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19QTUNfWU9TRU1JVEUgaXMgbm90IHNldAorIyBDT05GSUdfUUVNVSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRUlOUyBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSVAyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSVAyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSVAzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfQklHU1VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9TV0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfU0VOVE9TQSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfUkhPTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX0NBUk1FTCBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfUFRTV0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CitDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX1NZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOPXkKK0NPTkZJR19QTlg4NTUwPXkKK0NPTkZJR19TT0NfUE5YODU1MD15CitDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVD01CisKKyMKKyMgQ1BVIHNlbGVjdGlvbgorIworQ09ORklHX0NQVV9NSVBTMzJfUjE9eQorIyBDT05GSUdfQ1BVX01JUFMzMl9SMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfTUlQUzY0X1IxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9NSVBTNjRfUjIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1IzMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9UWDM5WFggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1ZSNDFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjQzMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I0WDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9UWDQ5WFggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I1MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SNTQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjYwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX05FVkFEQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjgwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1IxMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUk03MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9STTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NCMSBpcyBub3Qgc2V0CitDT05GSUdfU1lTX0hBU19DUFVfTUlQUzMyX1IxPXkKK0NPTkZJR19DUFVfTUlQUzMyPXkKK0NPTkZJR19DUFVfTUlQU1IxPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKK0NPTkZJR19DUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKKworIworIyBLZXJuZWwgdHlwZQorIworQ09ORklHXzMyQklUPXkKKyMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX0NQVV9IQVNfUFJFRkVUQ0g9eQorQ09ORklHX01JUFNfTVRfRElTQUJMRUQ9eQorIyBDT05GSUdfTUlQU19NVF9TTVAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfVlBFX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR182NEJJVF9QSFlTX0FERFIgaXMgbm90IHNldAorQ09ORklHX0NQVV9IQVNfTExTQz15CitDT05GSUdfQ1BVX0hBU19TWU5DPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfQ1BVX1NVUFBPUlRTX0hJR0hNRU09eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMjggaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8yNTYgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDI0IGlzIG5vdCBzZXQKK0NPTkZJR19TWVNfU1VQUE9SVFNfQVJCSVRfSFo9eQorQ09ORklHX0haPTI1MAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIElTQSwgVEMpCisjCitDT05GSUdfSFdfSEFTX1BDST15CitDT05GSUdfUENJPXkKKyMgQ09ORklHX1BDSV9NVUxUSVRIUkVBRF9QUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01NVT15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX1RSQURfU0lHTkFMUz15CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19JREVfTUFYX0hXSUZTPTQKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURJU0s9eQorIyBDT05GSUdfSURFRElTS19NVUxUSV9NT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERUNEPW0KKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVTQ1NJPXkKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfSURFUENJPXkKK0NPTkZJR19JREVQQ0lfU0hBUkVfSVJRPXkKK0NPTkZJR19CTEtfREVWX09GRkJPQVJEPXkKK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9QQ0lfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9IUFQzNjY9eQorIyBDT05GSUdfQkxLX0RFVl9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05TODc0MTUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVcgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NJSU1BR0UgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQT15CisjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTPW0KKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworQ09ORklHX0lTQ1NJX1RDUD1tCisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCisjCisjIENPTkZJR19BVEEgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CitDT05GSUdfTkFUU0VNST15CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9QTlg4WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBTUEkgc3VwcG9ydAorIworIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQorIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKK0NPTkZJR19VU0I9eQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCisjIENPTkZJR19VU0JfREVWSUNFRlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01VTFRJVEhSRUFEX1BST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQj15CitDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTT15CitDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwPXkKK0NPTkZJR19VU0JfU1RPUkFHRV9EUENNPXkKK0NPTkZJR19VU0JfU1RPUkFHRV9VU0JBVD15CitDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5PXkKK0NPTkZJR19VU0JfU1RPUkFHRV9TRERSNTU9eQorQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVRfTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPW0KKyMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRF9UQ1AgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPW0KK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CisjIENPTkZJR19ERUJVR19TTEFCX0xFQUsgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKK0NPTkZJR19IRUFERVJTX0NIRUNLPXkKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX0NST1NTQ09NUElMRT15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMSwzODQwMG44IGtnZGI9dHR5UzAgcm9vdD0vZGV2L25mcyBpcD1ib290cCIKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfUlVOVElNRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX1VOQ0FDSEVEIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorQ09ORklHX0NSWVBUT19BTEdBUEk9bQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9bQorQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9bQorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KK0NPTkZJR19DUllQVE9fQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19DUkMzMkM9bQorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0NSQ19DQ0lUVD1tCisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorQ09ORklHX0xJQkNSQzMyQz1tCitDT05GSUdfUExJU1Q9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC12MnBjaV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZwppbmRleCBlOTMyNjZiLi41YmMzMjQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1yYzEKLSMgVGh1IEp1bCAgNiAxMDowNDoxOCAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMyCisjIFNhdCBPY3QgMTQgMjM6MTI6MTUgMjAwNgogIwogQ09ORklHX01JUFM9eQogCkBAIC0yNSw4ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAogIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19BVExBUyBpcyBub3Qgc2V0CkBAIC00MCwxNCArMzgsMTQgQEAKICMgQ09ORklHX01PTUVOQ09fT0NFTE9UX0MgaXMgbm90IHNldAogIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfRyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1hYUzE1MDAgaXMgbm90IHNldAotIyBDT05GSUdfUE5YODU1MF9WMlBDSSBpcyBub3Qgc2V0CitDT05GSUdfUE5YODU1MF9WMlBDST15CiAjIENPTkZJR19QTlg4NTUwX0pCUyBpcyBub3Qgc2V0CiAjIENPTkZJR19EREI1NDc3IGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfVlI0MVhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNQ19ZT1NFTUlURSBpcyBub3Qgc2V0CiAjIENPTkZJR19RRU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX01BUktFSU5TIGlzIG5vdCBzZXQKLUNPTkZJR19TR0lfSVAyMj15CisjIENPTkZJR19TR0lfSVAyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TR0lfSVAyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TR0lfSVAzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQklHU1VSIGlzIG5vdCBzZXQKQEAgLTU5LDcgKzU3LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApAQCAtNjcsMjUgKzY1LDIxIEBACiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfQVJDPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQogQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQotQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKLSMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNfU1VQUE9SVFNfQklHX0VORElBTj15Ci1DT05GSUdfSVJRX0NQVT15Ci1DT05GSUdfU1dBUF9JT19TUEFDRT15Ci1DT05GSUdfQVJDMzI9eQotQ09ORklHX0JPT1RfRUxGMzI9eQorIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfTElUVExFX0VORElBTj15CitDT05GSUdfUE5YODU1MD15CitDT05GSUdfU09DX1BOWDg1NTA9eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQotIyBDT05GSUdfQVJDX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0FSQ19QUk9NTElCPXkKIAogIwogIyBDUFUgc2VsZWN0aW9uCiAjCi0jIENPTkZJR19DUFVfTUlQUzMyX1IxIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfTUlQUzMyX1IxPXkKICMgQ09ORklHX0NQVV9NSVBTMzJfUjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX01JUFM2NF9SMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfTUlQUzY0X1IyIGlzIG5vdCBzZXQKQEAgLTkzLDcgKzg3LDcgQEAKICMgQ09ORklHX0NQVV9UWDM5WFggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1ZSNDFYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUjQzMDAgaXMgbm90IHNldAotQ09ORklHX0NQVV9SNFgwMD15CisjIENPTkZJR19DUFVfUjRYMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1RYNDlYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUjUwMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1I1NDMyIGlzIG5vdCBzZXQKQEAgLTEwNCwxMiArOTgsMTEgQEAKICMgQ09ORklHX0NQVV9STTcwMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1JNOTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU0IxIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNfSEFTX0NQVV9SNFgwMD15Ci1DT05GSUdfU1lTX0hBU19DUFVfUjUwMDA9eQorQ09ORklHX1NZU19IQVNfQ1BVX01JUFMzMl9SMT15CitDT05GSUdfQ1BVX01JUFMzMj15CitDT05GSUdfQ1BVX01JUFNSMT15CiBDT05GSUdfU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15Ci1DT05GSUdfU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTD15CiBDT05GSUdfQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15Ci1DT05GSUdfQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTD15CiAKICMKICMgS2VybmVsIHR5cGUKQEAgLTEyMCwxNyArMTEzLDE3IEBACiAjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKLUNPTkZJR19CT0FSRF9TQ0FDSEU9eQotQ09ORklHX0lQMjJfQ1BVX1NDQUNIRT15CitDT05GSUdfQ1BVX0hBU19QUkVGRVRDSD15CiBDT05GSUdfTUlQU19NVF9ESVNBQkxFRD15Ci0jIENPTkZJR19NSVBTX01UX1NNVEMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19NVF9TTVAgaXMgbm90IHNldAorIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfVlBFX0xPQURFUiBpcyBub3Qgc2V0CiAjIENPTkZJR182NEJJVF9QSFlTX0FERFIgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfQ1BVX1NVUFBPUlRTX0hJR0hNRU09eQogQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKQEAgLTE0NCwxMiArMTM3LDEyIEBACiAjIENPTkZJR19IWl80OCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzI1MCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKICMgQ09ORklHX0haXzI1NiBpcyBub3Qgc2V0Ci1DT05GSUdfSFpfMTAwMD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMjQgaXMgbm90IHNldAogQ09ORklHX1NZU19TVVBQT1JUU19BUkJJVF9IWj15Ci1DT05GSUdfSFo9MTAwMAorQ09ORklHX0haPTI1MAogQ09ORklHX1BSRUVNUFRfTk9ORT15CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKQEAgLTE3MSwxNiArMTY0LDIwIEBACiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKQEAgLTE4OCwxMiArMTg1LDEyIEBACiBDT05GSUdfQlVHPXkKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NITUVNPXkKIENPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldApAQCAtMjEwLDYgKzIwNyw3IEBACiAjCiAjIEJsb2NrIGxheWVyCiAjCitDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKQEAgLTIzMCw4ICsyMjgsOSBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIElTQSwgVEMpCiAjCi1DT05GSUdfSFdfSEFTX0VJU0E9eQotIyBDT05GSUdfRUlTQSBpcyBub3Qgc2V0CitDT05GSUdfSFdfSEFTX1BDST15CitDT05GSUdfUENJPXkKKyMgQ09ORklHX1BDSV9NVUxUSVRIUkVBRF9QUk9CRSBpcyBub3Qgc2V0CiBDT05GSUdfTU1VPXkKIAogIwpAQCAtMjQyLDYgKzI0MSw3IEBACiAjCiAjIFBDSSBIb3RwbHVnIFN1cHBvcnQKICMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKIAogIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwpAQCAtMjY0LDYgKzI2NCw3IEBACiBDT05GSUdfVU5JWD15CiBDT05GSUdfWEZSTT15CiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTI4MiwxMiArMjgzLDE0IEBACiAjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD1tCitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQklDPXkKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCiAKICMKICMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KQEAgLTMwMCwxMiArMzAzLDE4IEBACiAjIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KKyMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfSVBWNl9TSVQ9bQogIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX05FVFdPUktfU0VDTUFSSz15CisjIENPTkZJR19JUFY2X1NVQlRSRUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiBDT05GSUdfTkVURklMVEVSPXkKICMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0CiAKQEAgLTMxOCw5ICszMjcsOSBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9bQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1NFQ01BUks9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUCBpcyBub3Qgc2V0CiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KQEAgLTMyOSwxMCArMzM4LDEwIEBACiAjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZIGlzIG5vdCBzZXQKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDIGlzIG5vdCBzZXQKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KIApAQCAtMzczLDcgKzM4Miw2IEBACiAjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19YMjUgaXMgbm90IHNldAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKIApAQCAtNDI2LDEzICs0MzQsMjAgQEAKICMKICMgQmxvY2sgZGV2aWNlcwogIworIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKICMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTgxOTIKK0NPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKQEAgLTQ0MSw2ICs0NTYsNyBAQAogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiBDT05GSUdfSURFPXkKK0NPTkZJR19JREVfTUFYX0hXSUZTPTQKIENPTkZJR19CTEtfREVWX0lERT15CiAKICMKQEAgLTQ1OSw5ICs0NzUsNDEgQEAKICMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwogIwogQ09ORklHX0lERV9HRU5FUklDPXkKK0NPTkZJR19CTEtfREVWX0lERVBDST15CitDT05GSUdfSURFUENJX1NIQVJFX0lSUT15CisjIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CisjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9QQ0lfQVVUTz15CisjIENPTkZJR19JREVETUFfT05MWURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BRUM2MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfQ01ENjRYPXkKKyMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAogIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUE9eQorIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX0FVVE89eQogIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiAKICMKQEAgLTQ2OSw2ICs1MTcsNyBAQAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ORVRMSU5LPXkKIENPTkZJR19TQ1NJX1BST0NfRlM9eQogCiAjCkBAIC00ODksMjIgKzUzOCw1OSBAQAogIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKIAogIwotIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjIFNDU0kgVHJhbnNwb3J0cwogIwogQ09ORklHX1NDU0lfU1BJX0FUVFJTPW0KIENPTkZJR19TQ1NJX0ZDX0FUVFJTPXkKIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTPW0KICMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycwogIwogQ09ORklHX0lTQ1NJX1RDUD1tCi0jIENPTkZJR19TR0lXRDkzX1NDU0kgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9BSUM3WFhYPW0KK0NPTkZJR19BSUM3WFhYX0NNRFNfUEVSX0RFVklDRT0zMgorQ09ORklHX0FJQzdYWFhfUkVTRVRfREVMQVlfTVM9MTUwMDAKKyMgQ09ORklHX0FJQzdYWFhfREVCVUdfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19BSUM3WFhYX0RFQlVHX01BU0s9MAorIyBDT05GSUdfQUlDN1hYWF9SRUdfUFJFVFRZX1BSSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKKyMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCisjCisjIENPTkZJR19BVEEgaXMgbm90IHNldAorCisjCiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCiAjCiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CkBAIC01MTMsMTQgKzU5OSwxOSBAQAogIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CiAjCiAjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0CiAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCiAjIEkyTyBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKIAogIwogIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CkBAIC01MzIsNiArNjIzLDExIEBACiBDT05GSUdfVFVOPW0KIAogIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIwogIyBQSFkgZGV2aWNlIHN1cHBvcnQKICMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CkBAIC01NDEsMjAgKzYzNyw3MyBAQAogIwogQ09ORklHX05FVF9FVEhFUk5FVD15CiBDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSVNFRVEgaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CitDT05GSUdfTkFUU0VNST15CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT089eQorIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT184MTI5IGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlfT0xEX1JYX1JFU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBTl9TQUE5NzMwIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMCBNYml0KQogIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQogIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAogCiAjCiAjIFRva2VuIFJpbmcgZGV2aWNlcwogIworIyBDT05GSUdfVFIgaXMgbm90IHNldAogCiAjCiAjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQpAQCAtNTY1LDYgKzcxNCw4IEBACiAjIFdhbiBpbnRlcmZhY2VzCiAjCiAjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CiBDT05GSUdfUFBQPW0KICMgQ09ORklHX1BQUF9NVUxUSUxJTksgaXMgbm90IHNldAogIyBDT05GSUdfUFBQX0ZJTFRFUiBpcyBub3Qgc2V0CkBAIC01NzUsNiArNzI2LDggQEAKIENPTkZJR19QUFBfTVBQRT1tCiAjIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19TTEhDPW0KKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKQEAgLTU5NCw2ICs3NDcsNyBAQAogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAogCiAjCiAjIFVzZXJsYW5kIGludGVyZmFjZXMKQEAgLTYxNiw2ICs3NzAsNyBAQAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NT1VTRT15CiBDT05GSUdfTU9VU0VfUFMyPXkKICMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CkBAIC02MzAsNiArNzg1LDcgQEAKIENPTkZJR19TRVJJTz15CiBDT05GSUdfU0VSSU9fSTgwNDI9eQogQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJT19MSUJQUzI9eQogIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKQEAgLTY0MCw3ICs3OTYsNyBAQAogQ09ORklHX1ZUPXkKICMgQ09ORklHX1ZUX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0hXX0NPTlNPTEU9eQotQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15CiAjIENPTkZJR19DT01QVVRPTkUgaXMgbm90IHNldAogIyBDT05GSUdfUk9DS0VUUE9SVCBpcyBub3Qgc2V0CkBAIC02NTAsNiArODA2LDcgQEAKICMgQ09ORklHX01PWEFfU01BUlRJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JU0kgaXMgbm90IHNldAogIyBDT05GSUdfU1lOQ0xJTktNUCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5DTElOS19HVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OX0hETEMgaXMgbm90IHNldAogIyBDT05GSUdfUklTQ09NOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TUEVDSUFMSVggaXMgbm90IHNldApAQCAtNjY1LDcgKzgyMiw4IEBACiAjCiAjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKICMKLSMgQ09ORklHX1NFUklBTF9JUDIyX1pJTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9JUDMxMDYgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtNjc5LDE2ICs4MzcsMTcgQEAKICMgV2F0Y2hkb2cgQ2FyZHMKICMKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKICMgQ09ORklHX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfRFMxMjg2IGlzIG5vdCBzZXQKICMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CiAKICMKICMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCiAjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKICMKQEAgLTcwOSwxNCArODY4LDMwIEBACiBDT05GSUdfSTJDX0FMR09CSVQ9bQogIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09fU0dJIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKIAogIwpAQCAtNzc2LDkgKzk1MSwxMyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldApAQCAtNzkwLDIzICs5NjksMjUgQEAKICMKICMgTWlzYyBkZXZpY2VzCiAjCisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19WNEwyPXkKIAogIwogIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCiAjCiAjIENPTkZJR19EVkIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CitDT05GSUdfRklSTVdBUkVfRURJRD15CiBDT05GSUdfRkI9eQorIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NGQl9GSUxMUkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfQ09QWUFSRUEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVCBpcyBub3Qgc2V0CkBAIC04MTQsMTQgKzk5NSwzMiBAQAogIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFUUk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU01JVkdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAKICMKICMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CiAjCiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfTkVXUE9SVF9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKICMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEUgaXMgbm90IHNldAogCkBAIC04MzksMTUgKzEwMzgsMTI5IEBACiAjCiAjIFVTQiBzdXBwb3J0CiAjCi0jIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfRUhDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVUhDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKIAogIwogIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCiAjCiAKICMKKyMgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworQ09ORklHX1VTQl9TVE9SQUdFPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RBVEFGQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD15CitDT05GSUdfVVNCX0hJRElOUFVUPXkKKyMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfSElEREVWPXkKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworCisjCisjIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorCisjCisjIFVTQiBEU0wgbW9kZW0gc3VwcG9ydAorIworCisjCiAjIFVTQiBHYWRnZXQgU3VwcG9ydAogIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CkBAIC04NzMsNiArMTE4Niw3IEBACiAjCiAjIEluZmluaUJhbmQgc3VwcG9ydAogIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CiAKICMKICMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCkBAIC05MDYsNiArMTIyMCw3IEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQpAQCAtOTE3LDYgKzEyMzIsNyBAQAogIyBDT05GSUdfWEZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtOTQ5LDggKzEyNjUsMTAgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKICMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1BST0NfU1lTQ1RMPXkKIENPTkZJR19TWVNGUz15CiBDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApAQCAtOTk0LDcgKzEzMTIsNiBAQAogQ09ORklHX1NNQl9GUz1tCiAjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAogIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldApAQCAtMTAwNSw3ICsxMzIyLDYgQEAKICMKICMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLUNPTkZJR19TR0lfUEFSVElUSU9OPXkKIAogIwogIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydApAQCAtMTA2MSwxMSArMTM3NywxMyBAQAogIwogQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JPU1NDT01QSUxFPXkKIENPTkZJR19DTURMSU5FPSIiCiAKQEAgLTEwNzksNiArMTM5Nyw5IEBACiAjIENyeXB0b2dyYXBoaWMgb3B0aW9ucwogIwogQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST1tCitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCitDT05GSUdfQ1JZUFRPX01BTkFHRVI9bQogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CkBAIC0xMDg4LDYgKzE0MDksOCBAQAogIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0VDQj1tCitDT05GSUdfQ1JZUFRPX0NCQz1tCiAjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9xZW11X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3FlbXVfZGVmY29uZmlnCmluZGV4IDliMGRhYjguLmFhNjFmMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3FlbXVfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3FlbXVfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3JiaG1hNDUwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9yYmhtYTQ1MDBfZGVmY29uZmlnCmluZGV4IGRkMDI5NjAuLmY5ZThmNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3JiaG1hNDUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcmJobWE0NTAwX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogQ09ORklHX1RPU0hJQkFfUkJUWDQ5Mzg9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvcm0yMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvcm0yMDBfZGVmY29uZmlnCmluZGV4IGQ4YTQ5OGQuLjQ5NmFhNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3JtMjAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9ybTIwMF9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLUNPTkZJR19TTklfUk0yMDBfUENJPXkKK0NPTkZJR19TTklfUk09eQogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9zYjEyNTAtc3dhcm1fZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvc2IxMjUwLXN3YXJtX2RlZmNvbmZpZwppbmRleCA4MDVhNGZlLi5lMzNjMTcyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9zYjEyNTAtc3dhcm1fZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3NiMTI1MC1zd2FybV9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvc2VhZF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9zZWFkX2RlZmNvbmZpZwppbmRleCA2ZmNiNjU2Li44M2ZiOTMyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9zZWFkX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9zZWFkX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy90YjAyMjZfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI2X2RlZmNvbmZpZwppbmRleCBkYzMxMmYxLi5lOWQ0ZWFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy90YjAyMjZfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDIyNl9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI5X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDIyOV9kZWZjb25maWcKaW5kZXggODU2MTVkOS4uYzE5NTk3ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI5X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy90YjAyMjlfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3RiMDI4N19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy90YjAyODdfZGVmY29uZmlnCmluZGV4IGFkNzI3MWIuLjk3ZDk0ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3RiMDI4N19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjg3X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1yYzEKLSMgVGh1IEp1bCAgNiAxMDowNDoyMSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMyCisjIFdlZCBPY3QgMTggMTI6NTc6MTEgMjAwNgogIwogQ09ORklHX01JUFM9eQogCkBAIC0yNSw4ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAogIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19BVExBUyBpcyBub3Qgc2V0CkBAIC01OSw3ICs1Nyw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKQEAgLTcyLDExICs3MCwxMSBAQAogIyBDT05GSUdfVklDVE9SX01QQzMwWCBpcyBub3Qgc2V0CiAjIENPTkZJR19aQU9fQ0FQQ0VMTEEgaXMgbm90IHNldAogQ09ORklHX1BDSV9WUjQxWFg9eQotIyBDT05GSUdfVlJDNDE3MyBpcyBub3Qgc2V0CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKQEAgLTEyMyw4ICsxMjEsOCBAQAogIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAogQ09ORklHX01JUFNfTVRfRElTQUJMRUQ9eQotIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfTVRfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1ZQRV9MT0FERVIgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfU1lOQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0xNjksMTUgKzE2NywxOSBAQAogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldApAQCAtMTg1LDEyICsxODcsMTIgQEAKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKIENPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0hNRU09eQogQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CkBAIC0yMDgsNiArMjEwLDcgQEAKICMKICMgQmxvY2sgbGF5ZXIKICMKK0NPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldApAQCAtMjMwLDE3ICsyMzMsMTYgQEAKICMKIENPTkZJR19IV19IQVNfUENJPXkKIENPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX01VTFRJVEhSRUFEX1BST0JFIGlzIG5vdCBzZXQKIENPTkZJR19NTVU9eQogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydAogIwotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCkBAIC0yNjMsNiArMjY1LDcgQEAKIENPTkZJR19VTklYPXkKIENPTkZJR19YRlJNPXkKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiBDT05GSUdfSVBfTVVMVElDQVNUPXkKQEAgLTI5MSwxMyArMjk0LDEwIEBACiBDT05GSUdfSU5FVF9UVU5ORUw9bQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKIENPTkZJR19JTkVUX0RJQUc9eQogQ09ORklHX0lORVRfVENQX0RJQUc9eQogQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEPXkKLQotIwotIyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sCi0jCiBDT05GSUdfVENQX0NPTkdfQklDPXkKIENPTkZJR19UQ1BfQ09OR19DVUJJQz1tCiBDT05GSUdfVENQX0NPTkdfV0VTVFdPT0Q9bQpAQCAtMzA4LDcgKzMwOCwxMyBAQAogIyBDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfVENQX0NPTkdfTFAgaXMgbm90IHNldAogIyBDT05GSUdfVENQX0NPTkdfVkVOTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ1BfQ09OR19DT01QT1VORCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9CSUM9eQorIyBDT05GSUdfREVGQVVMVF9DVUJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0hUQ1AgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9WRUdBUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1dFU1RXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfUkVOTyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iYmljIgogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldApAQCAtMzM4LDcgKzM0NCw2IEBACiAjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19YMjUgaXMgbm90IHNldAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKIApAQCAtMzU1LDYgKzM2MCw3IEBACiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfRklCX1JVTEVTPXkKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtMzY1LDcgKzM3MSw2IEBACiAjCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogCiAjCkBAIC00MDMsNiArNDA4LDcgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKK0NPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldApAQCAtNDEwLDY1ICs0MTYsMTQgQEAKICMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwotQ09ORklHX0lERT15Ci1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLSMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERVNDU0kgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLUNPTkZJR19JREVfR0VORVJJQz15Ci1DT05GSUdfQkxLX0RFVl9JREVQQ0k9eQotIyBDT05GSUdfSURFUENJX1NIQVJFX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15Ci0jIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAotIyBDT05GSUdfSURFRE1BX1BDSV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lUODIxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05TODc0MTUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9PTEQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVcgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9TSUlNQUdFPXkKLSMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAogQ09ORklHX1NDU0lfUFJPQ19GUz15CiAKICMKQEAgLTQ4OSwxMiArNDQ0LDEzIEBACiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogCiAjCi0jIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMgU0NTSSBUcmFuc3BvcnRzCiAjCiAjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCkBAIC01MDcsMjEgKzQ2MywyNCBAQAogIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CkBAIC01MjksNiArNDg4LDU5IEBACiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKIAogIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9OViBpcyBub3Qgc2V0CisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJTCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09MRFBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX1NJTDY4MD15CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorCisjCiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCiAjCiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CkBAIC02MzIsNiArNjQ0LDcgQEAKICMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKICMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCkBAIC02NzksNiArNjkyLDcgQEAKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VybGFuZCBpbnRlcmZhY2VzCkBAIC03NTgsNyArNzcyLDYgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC03ODQsMTIgKzc5NywxMiBAQAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKQEAgLTg5NywxMyArOTEwLDEzIEBACiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtOTMyLDYgKzk0NSw3IEBACiAjIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEltYWdpbmcgZGV2aWNlcwpAQCAtOTYzLDE2ICs5NzcsMTcgQEAKICMKICMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldApAQCAtMTA0MSw2ICsxMDU2LDcgQEAKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CkBAIC0xMDUyLDYgKzEwNjgsNyBAQAogIyBDT05GSUdfWEZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKIENPTkZJR19YRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz1tCkBAIC0xMDgyLDggKzEwOTksMTAgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKQEAgLTExMjMsNyArMTE0Miw2IEBACiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CkBAIC0xMTUwLDExICsxMTY4LDEzIEBACiAjCiBDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKIENPTkZJR19DUk9TU0NPTVBJTEU9eQogQ09ORklHX0NNRExJTkU9Im1lbT02NE0gY29uc29sZT10dHlWUjAsMTE1MjAwIGlwPWFueSByb290PS9kZXYvbmZzIgogCkBAIC0xMTcwLDEwICsxMTkwLDYgQEAKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvd29ya3BhZF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy93b3JrcGFkX2RlZmNvbmZpZwppbmRleCA4NjNmNmE3Li41NTM3MzRhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy93b3JrcGFkX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy93b3JrcGFkX2RlZmNvbmZpZwpAQCAtNTksNyArNTksNyBAQAogIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTklfUk0gaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy93cnBwbWNfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvd3JwcG1jX2RlZmNvbmZpZwppbmRleCBjMTAyNjdkLi5kM2RmYjcwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy93cnBwbWNfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3dycHBtY19kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MveW9zZW1pdGVfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MveW9zZW1pdGVfZGVmY29uZmlnCmluZGV4IDRkM2MxMzIuLmI5Zjc0ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3lvc2VtaXRlX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy95b3NlbWl0ZV9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKICMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STTIwMF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RkYjV4eHgvZGRiNTQ3Ny9pcnFfNTQ3Ny5jIGIvYXJjaC9taXBzL2RkYjV4eHgvZGRiNTQ3Ny9pcnFfNTQ3Ny5jCmluZGV4IGJhNTI3MDVhMi4uOTYyNDlhYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RkYjV4eHgvZGRiNTQ3Ny9pcnFfNTQ3Ny5jCisrKyBiL2FyY2gvbWlwcy9kZGI1eHh4L2RkYjU0NzcvaXJxXzU0NzcuYwpAQCAtNTMsMTQgKzUzLDYgQEAKIAlsbF92cmM1NDc3X2lycV9kaXNhYmxlKGlycSAtIHZyYzU0NzdfaXJxX2Jhc2UpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHZyYzU0NzdfaXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQl2cmM1NDc3X2lycV9lbmFibGUoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZQl2cmM1NDc3X2lycV9zaHV0ZG93bgl2cmM1NDc3X2lycV9kaXNhYmxlCi0KIHN0YXRpYyB2b2lkCiB2cmM1NDc3X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTkxLDExICs4MywxMCBAQAogCiBzdHJ1Y3QgaXJxX2NoaXAgdnJjNTQ3N19pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUgPSAidnJjNTQ3N19pcnEiLAotCS5zdGFydHVwID0gdnJjNTQ3N19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSB2cmM1NDc3X2lycV9zaHV0ZG93biwKLQkuZW5hYmxlID0gdnJjNTQ3N19pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gdnJjNTQ3N19pcnFfZGlzYWJsZSwKIAkuYWNrID0gdnJjNTQ3N19pcnFfYWNrLAorCS5tYXNrID0gdnJjNTQ3N19pcnFfZGlzYWJsZSwKKwkubWFza19hY2sgPSB2cmM1NDc3X2lycV9hY2ssCisJLnVubWFzayA9IHZyYzU0NzdfaXJxX2VuYWJsZSwKIAkuZW5kID0gdnJjNTQ3N19pcnFfZW5kCiB9OwogCkBAIC0xMDMsMTIgKzk0LDggQEAKIHsKIAl1MzIgaTsKIAotCWZvciAoaT0gaXJxX2Jhc2U7IGk8IGlycV9iYXNlKyBOVU1fNTQ3N19JUlE7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IE5VTEw7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZ2cmM1NDc3X2lycV9jb250cm9sbGVyOwotCX0KKwlmb3IgKGk9IGlycV9iYXNlOyBpPCBpcnFfYmFzZSsgTlVNXzU0NzdfSVJROyBpKyspCisJCXNldF9pcnFfY2hpcChpLCAmdnJjNTQ3N19pcnFfY29udHJvbGxlcik7CiAKIAl2cmM1NDc3X2lycV9iYXNlID0gaXJxX2Jhc2U7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZGVjL2VjYy1iZXJyLmMgYi9hcmNoL21pcHMvZGVjL2VjYy1iZXJyLmMKaW5kZXggM2UzNzRkMC4uNmQ1NWU4YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlYy9lY2MtYmVyci5jCisrKyBiL2FyY2gvbWlwcy9kZWMvZWNjLWJlcnIuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgpAQCAtMjYsNiArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIApAQCAtMjMxLDEzICsyMzEsMTAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWNfa24wMl9iZV9pbml0KHZvaWQpCiB7CiAJdm9sYXRpbGUgdTMyICpjc3IgPSAodm9pZCAqKUNLU0VHMUFERFIoS04wMl9TTE9UX0JBU0UgKyBLTjAyX0NTUik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWtuMHhfZXJyYWRkciA9ICh2b2lkICopQ0tTRUcxQUREUihLTjAyX1NMT1RfQkFTRSArIEtOMDJfRVJSQUREUik7CiAJa24weF9jaGtzeW4gPSAodm9pZCAqKUNLU0VHMUFERFIoS04wMl9TTE9UX0JBU0UgKyBLTjAyX0NIS1NZTik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgma24wMl9sb2NrLCBmbGFncyk7Ci0KIAkvKiBQcmVzZXQgd3JpdGUtb25seSBiaXRzIG9mIHRoZSBDb250cm9sIFJlZ2lzdGVyIGNhY2hlLiAqLwogCWNhY2hlZF9rbjAyX2NzciA9ICpjc3IgfCBLTjAyX0NTUl9MRURTOwogCkBAIC0yNDcsOCArMjQ0LDYgQEAKIAljYWNoZWRfa24wMl9jc3IgfD0gS04wMl9DU1JfQ09SUkVDVDsKIAkqY3NyID0gY2FjaGVkX2tuMDJfY3NyOwogCWlvYigpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma24wMl9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWNfa24wM19iZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMgYi9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMKaW5kZXggMzFkZDQ3ZC4uYjI1MWVmOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TCisrKyBiL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJCUxPTkdfTAlzMCwgVElfUkVHUygkMjgpCiAJCUxPTkdfUwlzcCwgVElfUkVHUygkMjgpCiAJCVBUUl9MQQlyYSwgcmV0X2Zyb21faXJxCi0JCWoJZG9fSVJRCisJCWoJZGVjX2lycV9kaXNwYXRjaAogCQkgbm9wCiAKICNpZmRlZiBDT05GSUdfMzJCSVQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvaW9hc2ljLWlycS5jIGIvYXJjaC9taXBzL2RlYy9pb2FzaWMtaXJxLmMKaW5kZXggNDFjZDJhOS4uNGM3Y2I0MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvaW9hc2ljLWlycS5jCisrKyBiL2FyY2gvbWlwcy9kZWMvaW9hc2ljLWlycS5jCkBAIC0xMyw3ICsxMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2RlYy9pb2FzaWMuaD4KQEAgLTIxLDggKzIwLDYgQEAKICNpbmNsdWRlIDxhc20vZGVjL2lvYXNpY19pbnRzLmg+CiAKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhpb2FzaWNfbG9jayk7Ci0KIHN0YXRpYyBpbnQgaW9hc2ljX2lycV9iYXNlOwogCiAKQEAgLTUyLDY1ICs0OSwzMCBAQAogCWlvYXNpY193cml0ZShJT19SRUdfU0lSLCBzaXIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2lvYXNpY19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXNpY19sb2NrLCBmbGFncyk7Ci0JdW5tYXNrX2lvYXNpY19pcnEoaXJxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FzaWNfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9pb2FzaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FzaWNfbG9jaywgZmxhZ3MpOwotCW1hc2tfaW9hc2ljX2lycShpcnEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXNpY19sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc3RhcnR1cF9pb2FzaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2lvYXNpY19pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBzaHV0ZG93bl9pb2FzaWNfaXJxIGRpc2FibGVfaW9hc2ljX2lycQotCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNrX2lvYXNpY19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzcGluX2xvY2soJmlvYXNpY19sb2NrKTsKIAltYXNrX2lvYXNpY19pcnEoaXJxKTsKLQlzcGluX3VubG9jaygmaW9hc2ljX2xvY2spOwogCWZhc3RfaW9iKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmRfaW9hc2ljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9pb2FzaWNfaXJxKGlycSk7CisJCXVubWFza19pb2FzaWNfaXJxKGlycSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW9hc2ljX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJJTy1BU0lDIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfaW9hc2ljX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9pb2FzaWNfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfaW9hc2ljX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfaW9hc2ljX2lycSwKIAkuYWNrID0gYWNrX2lvYXNpY19pcnEsCi0JLmVuZCA9IGVuZF9pb2FzaWNfaXJxLAorCS5tYXNrID0gbWFza19pb2FzaWNfaXJxLAorCS5tYXNrX2FjayA9IGFja19pb2FzaWNfaXJxLAorCS51bm1hc2sgPSB1bm1hc2tfaW9hc2ljX2lycSwKIH07CiAKIAotI2RlZmluZSBzdGFydHVwX2lvYXNpY19kbWFfaXJxIHN0YXJ0dXBfaW9hc2ljX2lycQorI2RlZmluZSB1bm1hc2tfaW9hc2ljX2RtYV9pcnEgdW5tYXNrX2lvYXNpY19pcnEKIAotI2RlZmluZSBzaHV0ZG93bl9pb2FzaWNfZG1hX2lycSBzaHV0ZG93bl9pb2FzaWNfaXJxCi0KLSNkZWZpbmUgZW5hYmxlX2lvYXNpY19kbWFfaXJxIGVuYWJsZV9pb2FzaWNfaXJxCi0KLSNkZWZpbmUgZGlzYWJsZV9pb2FzaWNfZG1hX2lycSBkaXNhYmxlX2lvYXNpY19pcnEKKyNkZWZpbmUgbWFza19pb2FzaWNfZG1hX2lycSBtYXNrX2lvYXNpY19pcnEKIAogI2RlZmluZSBhY2tfaW9hc2ljX2RtYV9pcnEgYWNrX2lvYXNpY19pcnEKIApAQCAtMTIzLDExICs4NSwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlvYXNpY19kbWFfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIklPLUFTSUMtRE1BIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfaW9hc2ljX2RtYV9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25faW9hc2ljX2RtYV9pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9pb2FzaWNfZG1hX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfaW9hc2ljX2RtYV9pcnEsCiAJLmFjayA9IGFja19pb2FzaWNfZG1hX2lycSwKKwkubWFzayA9IG1hc2tfaW9hc2ljX2RtYV9pcnEsCisJLm1hc2tfYWNrID0gYWNrX2lvYXNpY19kbWFfaXJxLAorCS51bm1hc2sgPSB1bm1hc2tfaW9hc2ljX2RtYV9pcnEsCiAJLmVuZCA9IGVuZF9pb2FzaWNfZG1hX2lycSwKIH07CiAKQEAgLTE0MCwxOCArMTAxLDExIEBACiAJaW9hc2ljX3dyaXRlKElPX1JFR19TSU1SLCAwKTsKIAlmYXN0X2lvYigpOwogCi0JZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyBJT19JTlJfRE1BOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmaW9hc2ljX2lycV90eXBlOwotCX0KLQlmb3IgKDsgaSA8IGJhc2UgKyBJT19JUlFfTElORVM7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZpb2FzaWNfZG1hX2lycV90eXBlOwotCX0KKwlmb3IgKGkgPSBiYXNlOyBpIDwgYmFzZSArIElPX0lOUl9ETUE7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZpb2FzaWNfaXJxX3R5cGUsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlmb3IgKDsgaSA8IGJhc2UgKyBJT19JUlFfTElORVM7IGkrKykKKwkJc2V0X2lycV9jaGlwKGksICZpb2FzaWNfZG1hX2lycV90eXBlKTsKIAogCWlvYXNpY19pcnFfYmFzZSA9IGJhc2U7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZGVjL2tuMDEtYmVyci5jIGIvYXJjaC9taXBzL2RlYy9rbjAxLWJlcnIuYwppbmRleCBmMTliNDYxLi5kM2I4MDAyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL2tuMDEtYmVyci5jCisrKyBiL2FyY2gvbWlwcy9kZWMva24wMS1iZXJyLmMKQEAgLTIwLDggKzIwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9pbnN0Lmg+CisjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZGVjL2tuMDItaXJxLmMgYi9hcmNoL21pcHMvZGVjL2tuMDItaXJxLmMKaW5kZXggMDRhMzY3YS4uOTE2ZTQ2YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlYy9rbjAyLWlycS5jCisrKyBiL2FyY2gvbWlwcy9kZWMva24wMi1pcnEuYwpAQCAtMTQsNyArMTQsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9kZWMva24wMi5oPgpAQCAtMjksNyArMjgsNiBAQAogICogVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSAtLSBpdCBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQuCiAgKi8KIHUzMiBjYWNoZWRfa24wMl9jc3I7Ci1ERUZJTkVfU1BJTkxPQ0soa24wMl9sb2NrKTsKIAogCiBzdGF0aWMgaW50IGtuMDJfaXJxX2Jhc2U7CkBAIC01Myw1NSArNTEsMTggQEAKIAkqY3NyID0gY2FjaGVkX2tuMDJfY3NyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2tuMDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZrbjAyX2xvY2ssIGZsYWdzKTsKLQl1bm1hc2tfa24wMl9pcnEoaXJxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrbjAyX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfa24wMl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmtuMDJfbG9jaywgZmxhZ3MpOwotCW1hc2tfa24wMl9pcnEoaXJxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrbjAyX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfa24wMl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfa24wMl9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBzaHV0ZG93bl9rbjAyX2lycSBkaXNhYmxlX2tuMDJfaXJxCi0KIHN0YXRpYyB2b2lkIGFja19rbjAyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXNwaW5fbG9jaygma24wMl9sb2NrKTsKIAltYXNrX2tuMDJfaXJxKGlycSk7Ci0Jc3Bpbl91bmxvY2soJmtuMDJfbG9jayk7CiAJaW9iKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGVuZF9rbjAyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9rbjAyX2lycShpcnEpOwotfQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGtuMDJfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIktOMDItQ1NSIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfa24wMl9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fa24wMl9pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9rbjAyX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfa24wMl9pcnEsCiAJLmFjayA9IGFja19rbjAyX2lycSwKLQkuZW5kID0gZW5kX2tuMDJfaXJxLAorCS5tYXNrID0gbWFza19rbjAyX2lycSwKKwkubWFza19hY2sgPSBhY2tfa24wMl9pcnEsCisJLnVubWFzayA9IHVubWFza19rbjAyX2lycSwKIH07CiAKIApAQCAtMTA5LDIyICs3MCwxNSBAQAogewogCXZvbGF0aWxlIHUzMiAqY3NyID0gKHZvbGF0aWxlIHUzMiAqKUNLU0VHMUFERFIoS04wMl9TTE9UX0JBU0UgKwogCQkJCQkJICAgICAgIEtOMDJfQ1NSKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCiAJLyogTWFzayBpbnRlcnJ1cHRzLiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZrbjAyX2xvY2ssIGZsYWdzKTsKIAljYWNoZWRfa24wMl9jc3IgJj0gfktOMDJfQ1NSX0lPSU5URU47CiAJKmNzciA9IGNhY2hlZF9rbjAyX2NzcjsKIAlpb2IoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrbjAyX2xvY2ssIGZsYWdzKTsKIAotCWZvciAoaSA9IGJhc2U7IGkgPCBiYXNlICsgS04wMl9JUlFfTElORVM7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZrbjAyX2lycV90eXBlOwotCX0KKwlmb3IgKGkgPSBiYXNlOyBpIDwgYmFzZSArIEtOMDJfSVJRX0xJTkVTOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAma24wMl9pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlrbjAyX2lycV9iYXNlID0gYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvc2V0dXAuYyBiL2FyY2gvbWlwcy9kZWMvc2V0dXAuYwppbmRleCA2Yjc0ODFlLi5kMzQwMzJhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2RlYy9zZXR1cC5jCkBAIC03NjEsMyArNzYxLDkgQEAKIAlpZiAoZGVjX2ludGVycnVwdFtERUNfSVJRX0hBTFRdID49IDApCiAJCXNldHVwX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfSEFMVF0sICZoYWx0aXJxKTsKIH0KKworYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgZGVjX2lycV9kaXNwYXRjaCh1bnNpZ25lZCBpbnQgaXJxKQoreworCWRvX0lSUShpcnEpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy90aW1lLmMgYi9hcmNoL21pcHMvZGVjL3RpbWUuYwppbmRleCA0Y2YwYzA2Li44YjdlMGMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL3RpbWUuYworKysgYi9hcmNoL21pcHMvZGVjL3RpbWUuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAJQ01PU19SRUFEKFJUQ19SRUdfQyk7CQkJLyogQWNrIHRoZSBSVEMgaW50ZXJydXB0LiAgKi8KIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBkZWNfaW9hc2ljX2hwdF9yZWFkKHZvaWQpCitzdGF0aWMgY3ljbGVfdCBkZWNfaW9hc2ljX2hwdF9yZWFkKHZvaWQpCiB7CiAJLyoKIAkgKiBUaGUgZnJlZS1ydW5uaW5nIGNvdW50ZXIgaXMgMzItYml0IHdoaWNoIGlzIGdvb2QgZm9yIGFib3V0CkBAIC0xNjAsMTEgKzE2MCw2IEBACiAJcmV0dXJuIGlvYXNpY19yZWFkKElPX1JFR19GQ1RSKTsKIH0KIAotc3RhdGljIHZvaWQgZGVjX2lvYXNpY19ocHRfaW5pdCh1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JaW9hc2ljX3dyaXRlKElPX1JFR19GQ1RSLCBpb2FzaWNfcmVhZChJT19SRUdfRkNUUikgLSBjb3VudCk7Ci19Ci0KIAogdm9pZCBfX2luaXQgZGVjX3RpbWVfaW5pdCh2b2lkKQogewpAQCAtMTc0LDExICsxNjksOSBAQAogCW1pcHNfdGltZXJfc3RhdGUgPSBkZWNfdGltZXJfc3RhdGU7CiAJbWlwc190aW1lcl9hY2sgPSBkZWNfdGltZXJfYWNrOwogCi0JaWYgKCFjcHVfaGFzX2NvdW50ZXIgJiYgSU9BU0lDKSB7CisJaWYgKCFjcHVfaGFzX2NvdW50ZXIgJiYgSU9BU0lDKQogCQkvKiBGb3IgcHJlLVI0ayBzeXN0ZW1zIHdlIHVzZSB0aGUgSS9PIEFTSUMncyBjb3VudGVyLiAgKi8KLQkJbWlwc19ocHRfcmVhZCA9IGRlY19pb2FzaWNfaHB0X3JlYWQ7Ci0JCW1pcHNfaHB0X2luaXQgPSBkZWNfaW9hc2ljX2hwdF9pbml0OwotCX0KKwkJY2xvY2tzb3VyY2VfbWlwcy5yZWFkID0gZGVjX2lvYXNpY19ocHRfcmVhZDsKIAogCS8qIFNldCB1cCB0aGUgcmF0ZSBvZiBwZXJpb2RpYyBEUzEyODcgaW50ZXJydXB0cy4gICovCiAJQ01PU19XUklURShSVENfUkVGX0NMQ0tfMzJLSFogfCAoMTYgLSBfX2ZmcyhIWikpLCBSVENfUkVHX0EpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9kZWZjb25maWcKaW5kZXggMjFkNTNlMC4uZjk4MTJkMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiAjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJQllURV9DUkhJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0lCWVRFX0NSSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTklfUk0yMDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9lbW1hMnJoL2NvbW1vbi9pcnFfZW1tYTJyaC5jIGIvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL2lycV9lbW1hMnJoLmMKaW5kZXggN2M5MzA4Ni4uOGQ4ODBmMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL2lycV9lbW1hMnJoLmMKKysrIGIvYXJjaC9taXBzL2VtbWEycmgvY29tbW9uL2lycV9lbW1hMnJoLmMKQEAgLTU2LDQ5ICs1NiwyMSBAQAogCWxsX2VtbWEycmhfaXJxX2Rpc2FibGUoaXJxIC0gZW1tYTJyaF9pcnFfYmFzZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZW1tYTJyaF9pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVtbWEycmhfaXJxX2VuYWJsZShpcnEpOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lCWVtbWEycmhfaXJxX3NodXRkb3duCWVtbWEycmhfaXJxX2Rpc2FibGUKLQotc3RhdGljIHZvaWQgZW1tYTJyaF9pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JLyogZGlzYWJsZSBpbnRlcnJ1cHQgLSBzb21lIGhhbmRsZXIgd2lsbCByZS1lbmFibGUgdGhlIGlycQotCSAqIGFuZCBpZiB0aGUgaW50ZXJydXB0IGlzIGxldmVsZWQsIHdlIHdpbGwgaGF2ZSBpbmZpbml0ZSBsb29wCi0JICovCi0JbGxfZW1tYTJyaF9pcnFfZGlzYWJsZShpcnEgLSBlbW1hMnJoX2lycV9iYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgZW1tYTJyaF9pcnFfZW5kKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJbGxfZW1tYTJyaF9pcnFfZW5hYmxlKGlycSAtIGVtbWEycmhfaXJxX2Jhc2UpOwotfQotCiBzdHJ1Y3QgaXJxX2NoaXAgZW1tYTJyaF9pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUgPSAiZW1tYTJyaF9pcnEiLAotCS5zdGFydHVwID0gZW1tYTJyaF9pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBlbW1hMnJoX2lycV9zaHV0ZG93biwKLQkuZW5hYmxlID0gZW1tYTJyaF9pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gZW1tYTJyaF9pcnFfZGlzYWJsZSwKLQkuYWNrID0gZW1tYTJyaF9pcnFfYWNrLAotCS5lbmQgPSBlbW1hMnJoX2lycV9lbmQsCi0JLnNldF9hZmZpbml0eSA9IE5VTEwJLyogbm8gYWZmaW5pdHkgc3R1ZmYgZm9yIFVQICovCisJLmFjayA9IGVtbWEycmhfaXJxX2Rpc2FibGUsCisJLm1hc2sgPSBlbW1hMnJoX2lycV9kaXNhYmxlLAorCS5tYXNrX2FjayA9IGVtbWEycmhfaXJxX2Rpc2FibGUsCisJLnVubWFzayA9IGVtbWEycmhfaXJxX2VuYWJsZSwKIH07CiAKIHZvaWQgZW1tYTJyaF9pcnFfaW5pdCh1MzIgaXJxX2Jhc2UpCiB7CiAJdTMyIGk7CiAKLQlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9iYXNlICsgTlVNX0VNTUEyUkhfSVJROyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmZW1tYTJyaF9pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfYmFzZSArIE5VTV9FTU1BMlJIX0lSUTsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmVtbWEycmhfaXJxX2NvbnRyb2xsZXIsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCWVtbWEycmhfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9lbW1hMnJoL21hcmtlaW5zL2lycV9tYXJrZWlucy5jIGIvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKaW5kZXggZjIzYWU5Zi4uMjExNmQ5YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKKysrIGIvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvaXJxX21hcmtlaW5zLmMKQEAgLTQ4LDQ2ICs0OCwyMSBAQAogCWxsX2VtbWEycmhfc3dfaXJxX2Rpc2FibGUoaXJxIC0gZW1tYTJyaF9zd19pcnFfYmFzZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZW1tYTJyaF9zd19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVtbWEycmhfc3dfaXJxX2VuYWJsZShpcnEpOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIGVtbWEycmhfc3dfaXJxX3NodXRkb3duIGVtbWEycmhfc3dfaXJxX2Rpc2FibGUKLQotc3RhdGljIHZvaWQgZW1tYTJyaF9zd19pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbGxfZW1tYTJyaF9zd19pcnFfZGlzYWJsZShpcnEgLSBlbW1hMnJoX3N3X2lycV9iYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgZW1tYTJyaF9zd19pcnFfZW5kKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJbGxfZW1tYTJyaF9zd19pcnFfZW5hYmxlKGlycSAtIGVtbWEycmhfc3dfaXJxX2Jhc2UpOwotfQotCiBzdHJ1Y3QgaXJxX2NoaXAgZW1tYTJyaF9zd19pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUgPSAiZW1tYTJyaF9zd19pcnEiLAotCS5zdGFydHVwID0gZW1tYTJyaF9zd19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBlbW1hMnJoX3N3X2lycV9zaHV0ZG93biwKLQkuZW5hYmxlID0gZW1tYTJyaF9zd19pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gZW1tYTJyaF9zd19pcnFfZGlzYWJsZSwKLQkuYWNrID0gZW1tYTJyaF9zd19pcnFfYWNrLAotCS5lbmQgPSBlbW1hMnJoX3N3X2lycV9lbmQsCi0JLnNldF9hZmZpbml0eSA9IE5VTEwsCisJLmFjayA9IGVtbWEycmhfc3dfaXJxX2Rpc2FibGUsCisJLm1hc2sgPSBlbW1hMnJoX3N3X2lycV9kaXNhYmxlLAorCS5tYXNrX2FjayA9IGVtbWEycmhfc3dfaXJxX2Rpc2FibGUsCisJLnVubWFzayA9IGVtbWEycmhfc3dfaXJxX2VuYWJsZSwKIH07CiAKIHZvaWQgZW1tYTJyaF9zd19pcnFfaW5pdCh1MzIgaXJxX2Jhc2UpCiB7CiAJdTMyIGk7CiAKLQlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9iYXNlICsgTlVNX0VNTUEyUkhfSVJRX1NXOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDI7Ci0JCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmZW1tYTJyaF9zd19pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfYmFzZSArIE5VTV9FTU1BMlJIX0lSUV9TVzsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmVtbWEycmhfc3dfaXJxX2NvbnRyb2xsZXIsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCWVtbWEycmhfc3dfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKIH0KQEAgLTEyNiwxNCArMTAxLDYgQEAKIAlsbF9lbW1hMnJoX2dwaW9faXJxX2Rpc2FibGUoaXJxIC0gZW1tYTJyaF9ncGlvX2lycV9iYXNlKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBlbW1hMnJoX2dwaW9faXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQllbW1hMnJoX2dwaW9faXJxX2VuYWJsZShpcnEpOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIGVtbWEycmhfZ3Bpb19pcnFfc2h1dGRvd24gZW1tYTJyaF9ncGlvX2lycV9kaXNhYmxlCi0KIHN0YXRpYyB2b2lkIGVtbWEycmhfZ3Bpb19pcnFfYWNrKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaXJxIC09IGVtbWEycmhfZ3Bpb19pcnFfYmFzZTsKQEAgLTE0OSwyNSArMTE2LDE5IEBACiAKIHN0cnVjdCBpcnFfY2hpcCBlbW1hMnJoX2dwaW9faXJxX2NvbnRyb2xsZXIgPSB7CiAJLnR5cGVuYW1lID0gImVtbWEycmhfZ3Bpb19pcnEiLAotCS5zdGFydHVwID0gZW1tYTJyaF9ncGlvX2lycV9zdGFydHVwLAotCS5zaHV0ZG93biA9IGVtbWEycmhfZ3Bpb19pcnFfc2h1dGRvd24sCi0JLmVuYWJsZSA9IGVtbWEycmhfZ3Bpb19pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gZW1tYTJyaF9ncGlvX2lycV9kaXNhYmxlLAogCS5hY2sgPSBlbW1hMnJoX2dwaW9faXJxX2FjaywKKwkubWFzayA9IGVtbWEycmhfZ3Bpb19pcnFfZGlzYWJsZSwKKwkubWFza19hY2sgPSBlbW1hMnJoX2dwaW9faXJxX2FjaywKKwkudW5tYXNrID0gZW1tYTJyaF9ncGlvX2lycV9lbmFibGUsCiAJLmVuZCA9IGVtbWEycmhfZ3Bpb19pcnFfZW5kLAotCS5zZXRfYWZmaW5pdHkgPSBOVUxMLAogfTsKIAogdm9pZCBlbW1hMnJoX2dwaW9faXJxX2luaXQodTMyIGlycV9iYXNlKQogewogCXUzMiBpOwogCi0JZm9yIChpID0gaXJxX2Jhc2U7IGkgPCBpcnFfYmFzZSArIE5VTV9FTU1BMlJIX0lSUV9HUElPOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDI7Ci0JCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmZW1tYTJyaF9ncGlvX2lycV9jb250cm9sbGVyOwotCX0KKwlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9iYXNlICsgTlVNX0VNTUEyUkhfSVJRX0dQSU87IGkrKykKKwkJc2V0X2lycV9jaGlwKGksICZlbW1hMnJoX2dwaW9faXJxX2NvbnRyb2xsZXIpOwogCiAJZW1tYTJyaF9ncGlvX2lycV9iYXNlID0gaXJxX2Jhc2U7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZW1tYTJyaC9tYXJrZWlucy9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2VtbWEycmgvbWFya2VpbnMvcGxhdGZvcm0uYwppbmRleCAxNWNjNjFkLi4xMTU2NzcwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZW1tYTJyaC9tYXJrZWlucy9wbGF0Zm9ybS5jCisrKyBiL2FyY2gvbWlwcy9lbW1hMnJoL21hcmtlaW5zL3BsYXRmb3JtLmMKQEAgLTQ0LDE4ICs0NCw0NSBAQAogI2RlZmluZSBJMkNfRU1NQTJSSCAiZW1tYTJyaC1paWMiIC8qIG11c3QgYmUgaW4gc3luYyB3aXRoIElJQyBkcml2ZXIgKi8KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpMmNfZW1tYV9yZXNvdXJjZXNfMFtdID0gewotCXsgTlVMTCwgRU1NQTJSSF9JUlFfUElJQzAsIEVNTUEyUkhfSVJRX1BJSUMwLCBJT1JFU09VUkNFX0lSUSB9LAotCXsgTlVMTCwgS1NFRzFBRERSKEVNTUEyUkhfUElJQzBfQkFTRSksIEtTRUcxQUREUihFTU1BMlJIX1BJSUMwX0JBU0UgKyAweDEwMDApLCAwIH0sCisJeworCQkubmFtZQk9IE5VTEwsCisJCS5zdGFydAk9IEVNTUEyUkhfSVJRX1BJSUMwLAorCQkuZW5kCT0gRU1NQTJSSF9JUlFfUElJQzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCisJfSwgeworCQkubmFtZQk9IE5VTEwsCisJCS5zdGFydAk9IEVNTUEyUkhfUElJQzBfQkFTRSwKKwkJLmVuZAk9IEVNTUEyUkhfUElJQzBfQkFTRSArIDB4MTAwMCwKKwkJLmZsYWdzCT0gMAorCX0sCiB9OwogCiBzdHJ1Y3QgcmVzb3VyY2UgaTJjX2VtbWFfcmVzb3VyY2VzXzFbXSA9IHsKLQl7IE5VTEwsIEVNTUEyUkhfSVJRX1BJSUMxLCBFTU1BMlJIX0lSUV9QSUlDMSwgSU9SRVNPVVJDRV9JUlEgfSwKLQl7IE5VTEwsIEtTRUcxQUREUihFTU1BMlJIX1BJSUMxX0JBU0UpLCBLU0VHMUFERFIoRU1NQTJSSF9QSUlDMV9CQVNFICsgMHgxMDAwKSwgMCB9LAorCXsKKwkJLm5hbWUJPSBOVUxMLAorCQkuc3RhcnQJPSBFTU1BMlJIX0lSUV9QSUlDMSwKKwkJLmVuZAk9IEVNTUEyUkhfSVJRX1BJSUMxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUQorCX0sIHsKKwkJLm5hbWUJPSBOVUxMLAorCQkuc3RhcnQJPSBFTU1BMlJIX1BJSUMxX0JBU0UsCisJCS5lbmQJPSBFTU1BMlJIX1BJSUMxX0JBU0UgKyAweDEwMDAsCisJCS5mbGFncwk9IDAKKwl9LAogfTsKIAogc3RydWN0IHJlc291cmNlIGkyY19lbW1hX3Jlc291cmNlc18yW10gPSB7Ci0JeyBOVUxMLCBFTU1BMlJIX0lSUV9QSUlDMiwgRU1NQTJSSF9JUlFfUElJQzIsIElPUkVTT1VSQ0VfSVJRIH0sCi0JeyBOVUxMLCBLU0VHMUFERFIoRU1NQTJSSF9QSUlDMl9CQVNFKSwgS1NFRzFBRERSKEVNTUEyUkhfUElJQzJfQkFTRSArIDB4MTAwMCksIDAgfSwKKwl7CisJCS5uYW1lCT0gTlVMTCwKKwkJLnN0YXJ0CT0gRU1NQTJSSF9JUlFfUElJQzIsCisJCS5lbmQJPSBFTU1BMlJIX0lSUV9QSUlDMiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEKKwl9LCB7CisJCS5uYW1lCT0gTlVMTCwKKwkJLnN0YXJ0CT0gRU1NQTJSSF9QSUlDMl9CQVNFLAorCQkuZW5kCT0gRU1NQTJSSF9QSUlDMl9CQVNFICsgMHgxMDAwLAorCQkuZmxhZ3MJPSAwCisJfSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjX2VtbWFfZGV2aWNlc1tdID0gewpAQCAtODMsMzIgKzExMCwyOSBAQAogI2RlZmluZSBFTU1BMlJIX1NFUklBTF9GTEFHUyBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QKIAogc3RhdGljIHN0cnVjdCAgcGxhdF9zZXJpYWw4MjUwX3BvcnQgcGxhdGZvcm1fc2VyaWFsX3BvcnRzW10gPSB7Ci0gICAgICAgWzBdID0gewotICAgICAgICAgLm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtKilLU0VHMUFERFIoRU1NQTJSSF9QRlVSMF9CQVNFICsgMyksCi0gICAgICAgICAuaXJxID0gRU1NQTJSSF9JUlFfUEZVUjAsCi0gICAgICAgICAudWFydGNsayA9IEVNTUEyUkhfU0VSSUFMX0NMT0NLLAotICAgICAgICAgLnJlZ3NoaWZ0ID0gNCwKLSAgICAgICAgIC5pb3R5cGUgPSBVUElPX01FTSwKLSAgICAgICAgIC5mbGFncyA9IEVNTUEyUkhfU0VSSUFMX0ZMQUdTLAotICAgICAgIH0sCi0gICAgICAgWzFdID0gewotICAgICAgICAgLm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtKilLU0VHMUFERFIoRU1NQTJSSF9QRlVSMV9CQVNFICsgMyksCi0gICAgICAgICAuaXJxID0gRU1NQTJSSF9JUlFfUEZVUjEsCi0gICAgICAgICAudWFydGNsayA9IEVNTUEyUkhfU0VSSUFMX0NMT0NLLAotICAgICAgICAgLnJlZ3NoaWZ0ID0gNCwKLSAgICAgICAgIC5pb3R5cGUgPSBVUElPX01FTSwKLSAgICAgICAgIC5mbGFncyA9IEVNTUEyUkhfU0VSSUFMX0ZMQUdTLAotICAgICAgIH0sCi0gICAgICAgWzJdID0gewotICAgICAgICAgLm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtKilLU0VHMUFERFIoRU1NQTJSSF9QRlVSMl9CQVNFICsgMyksCi0gICAgICAgICAuaXJxID0gRU1NQTJSSF9JUlFfUEZVUjIsCi0gICAgICAgICAudWFydGNsayA9IEVNTUEyUkhfU0VSSUFMX0NMT0NLLAotICAgICAgICAgLnJlZ3NoaWZ0ID0gNCwKLSAgICAgICAgIC5pb3R5cGUgPSBVUElPX01FTSwKLSAgICAgICAgIC5mbGFncyA9IEVNTUEyUkhfU0VSSUFMX0ZMQUdTLAotICAgICAgIH0sCi0gICAgICAgWzNdID0gewotCSAuZmxhZ3MgPSAwLAorCVswXSA9IHsKKwkJLm1lbWJhc2U9ICh2b2lkIF9faW9tZW0qKUtTRUcxQUREUihFTU1BMlJIX1BGVVIwX0JBU0UgKyAzKSwKKwkJLmlycSA9IEVNTUEyUkhfSVJRX1BGVVIwLAorCQkudWFydGNsayA9IEVNTUEyUkhfU0VSSUFMX0NMT0NLLAorCQkucmVnc2hpZnQgPSA0LAorCQkuaW90eXBlID0gVVBJT19NRU0sCisJCS5mbGFncyA9IEVNTUEyUkhfU0VSSUFMX0ZMQUdTLAorICAgICAgIH0sIFsxXSA9IHsKKwkJLm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtKilLU0VHMUFERFIoRU1NQTJSSF9QRlVSMV9CQVNFICsgMyksCisJCS5pcnEgPSBFTU1BMlJIX0lSUV9QRlVSMSwKKwkJLnVhcnRjbGsgPSBFTU1BMlJIX1NFUklBTF9DTE9DSywKKwkJLnJlZ3NoaWZ0ID0gNCwKKwkJLmlvdHlwZSA9IFVQSU9fTUVNLAorCQkuZmxhZ3MgPSBFTU1BMlJIX1NFUklBTF9GTEFHUywKKyAgICAgICB9LCBbMl0gPSB7CisJCS5tZW1iYXNlID0gKHZvaWQgX19pb21lbSopS1NFRzFBRERSKEVNTUEyUkhfUEZVUjJfQkFTRSArIDMpLAorCQkuaXJxID0gRU1NQTJSSF9JUlFfUEZVUjIsCisJCS51YXJ0Y2xrID0gRU1NQTJSSF9TRVJJQUxfQ0xPQ0ssCisJCS5yZWdzaGlmdCA9IDQsCisJCS5pb3R5cGUgPSBVUElPX01FTSwKKwkJLmZsYWdzID0gRU1NQTJSSF9TRVJJQUxfRkxBR1MsCisgICAgICAgfSwgWzNdID0geworCQkuZmxhZ3MgPSAwLAogICAgICAgIH0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZ3Q2NDEyMC9jb21tb24vdGltZS5jIGIvYXJjaC9taXBzL2d0NjQxMjAvY29tbW9uL3RpbWUuYwppbmRleCBjODNhZTZhLi5jNDdlZWI3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZ3Q2NDEyMC9jb21tb24vdGltZS5jCisrKyBiL2FyY2gvbWlwcy9ndDY0MTIwL2NvbW1vbi90aW1lLmMKQEAgLTY0LDE0ICs2NCwxNCBAQAogICogYXMgKmlycSAoPWlycTAgaW4gLi4va2VybmVsL3RpbWUuYykuICBXZSB3aWxsIGRvIG91ciBvd24gdGltZXIgaW50ZXJydXB0CiAgKiBoYW5kbGluZy4KICAqLwotdm9pZCBndDY0MTIwX3RpbWVfaW5pdCh2b2lkKQordm9pZCBfX2luaXQgcGxhdF90aW1lcl9zZXR1cChzdHJ1Y3QgaXJxYWN0aW9uICppcnEpCiB7CiAJc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdGltZXI7CiAKIAkvKiBEaXNhYmxlIHRpbWVyIGZpcnN0ICovCiAJR1RfV1JJVEUoR1RfVENfQ09OVFJPTF9PRlMsIDApOwogCS8qIExvYWQgdGltZXIgdmFsdWUgZm9yIDEwMCBIeiAqLwotCUdUX1dSSVRFKEdUX1RDM19PRlMsIFN5c19jbG9jayAvIDEwMCk7CisJR1RfV1JJVEUoR1RfVEMzX09GUywgU3lzX2Nsb2NrIC8gSFopOwogCiAJLyoKIAkgKiBDcmVhdGUgdGhlIElSUSBzdHJ1Y3R1cmUgZW50cnkgZm9yIHRoZSB0aW1lci4gIFNpbmNlIHdlJ3JlIHRvbyBlYXJseQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2d0NjQxMjAvZXY2NDEyMC9pcnEuYyBiL2FyY2gvbWlwcy9ndDY0MTIwL2V2NjQxMjAvaXJxLmMKaW5kZXggZWQ0ZDgyYi4uYjNlNTc5NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2d0NjQxMjAvZXY2NDEyMC9pcnEuYworKysgYi9hcmNoL21pcHMvZ3Q2NDEyMC9ldjY0MTIwL2lycS5jCkBAIC02NiwzOCArNjYsMjEgQEAKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9ldjY0MTIwX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKGlycV9uciA+PSA4KSB7CS8vIEFsbCBQQ0kgaW50ZXJydXB0cyBhcmUgb24gbGluZSA1IG9yIDIKIAkJY2xlYXJfYzBfc3RhdHVzKDkgPDwgMTApOwogCX0gZWxzZSB7CiAJCWNsZWFyX2MwX3N0YXR1cygxIDw8IChpcnFfbnIgKyA4KSk7CiAJfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2V2NjQxMjBfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlpZiAoaXJxX25yID49IDgpCS8vIEFsbCBQQ0kgaW50ZXJydXB0cyBhcmUgb24gbGluZSA1IG9yIDIKIAkJc2V0X2MwX3N0YXR1cyg5IDw8IDEwKTsKIAllbHNlCiAJCXNldF9jMF9zdGF0dXMoMSA8PCAoaXJxX25yICsgOCkpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2V2NjQxMjBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2V2NjQxMjBfaXJxKGlycSk7Ci0JcmV0dXJuIDA7CQkvKiBOZXZlciBhbnl0aGluZyBwZW5kaW5nICAqLwotfQotCi0jZGVmaW5lIHNodXRkb3duX2V2NjQxMjBfaXJxICAgICBkaXNhYmxlX2V2NjQxMjBfaXJxCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19ldjY0MTIwX2lycSBkaXNhYmxlX2V2NjQxMjBfaXJxCi0KIHN0YXRpYyB2b2lkIGVuZF9ldjY0MTIwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQpAQCAtMTA2LDEzICs4OSwxMSBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGV2NjQxMjBfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gIkVWNjQxMjAiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9ldjY0MTIwX2lycSwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9ldjY0MTIwX2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9ldjY0MTIwX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfZXY2NDEyMF9pcnEsCi0JLmFjawkJPSBtYXNrX2FuZF9hY2tfZXY2NDEyMF9pcnEsCisJLmFjawkJPSBkaXNhYmxlX2V2NjQxMjBfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfZXY2NDEyMF9pcnEsCisJLm1hc2tfYWNrCT0gZGlzYWJsZV9ldjY0MTIwX2lycSwKKwkudW5tYXNrCQk9IGVuYWJsZV9ldjY0MTIwX2lycSwKIAkuZW5kCQk9IGVuZF9ldjY0MTIwX2lycSwKLQkuc2V0X2FmZmluaXR5CT0gTlVMTAogfTsKIAogdm9pZCBndDY0MTIwX2lycV9zZXR1cCh2b2lkKQpAQCAtMTIyLDggKzEwMyw2IEBACiAJICovCiAJY2xlYXJfYzBfc3RhdHVzKFNUMF9JTSk7CiAKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCiAJLyoKIAkgKiBFbmFibGUgdGltZXIuICBPdGhlciBpbnRlcnJ1cHRzIHdpbGwgYmUgZW5hYmxlZCBhcyB0aGV5IGFyZQogCSAqIHJlZ2lzdGVyZWQuCkBAIC0xMzMsMTYgKzExMiw1IEBACiAKIHZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKIHsKLQlpbnQgaTsKLQotCS8qICBMZXQncyBpbml0aWFsaXplIG91ciBJUlEgZGVzY3JpcHRvcnMgICovCi0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSAwOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJm5vX2lycV9jaGlwOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDA7Ci0JCXNwaW5fbG9ja19pbml0KCZpcnFfZGVzY1tpXS5sb2NrKTsKLQl9Ci0KIAlndDY0MTIwX2lycV9zZXR1cCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2d0NjQxMjAvZXY2NDEyMC9zZXR1cC5jIGIvYXJjaC9taXBzL2d0NjQxMjAvZXY2NDEyMC9zZXR1cC5jCmluZGV4IDkxYzJkM2YuLjk5YzhkNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9ndDY0MTIwL2V2NjQxMjAvc2V0dXAuYworKysgYi9hcmNoL21pcHMvZ3Q2NDEyMC9ldjY0MTIwL3NldHVwLmMKQEAgLTY4LDcgKzY4LDYgQEAKICAqIEluaXRpYWxpemVzIGJhc2ljIHJvdXRpbmVzIGFuZCBzdHJ1Y3R1cmVzIHBvaW50ZXJzLCBtZW1vcnkgc2l6ZSAoYXMKICAqIGdpdmVuIGJ5IHRoZSBiaW9zIGFuZCBzYXZlcyB0aGUgY29tbWFuZCBsaW5lLgogICovCi1leHRlcm4gdm9pZCBndDY0MTIwX3RpbWVfaW5pdCh2b2lkKTsKIAogdm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKIHsKQEAgLTc2LDcgKzc1LDYgQEAKIAlfbWFjaGluZV9oYWx0ID0gZ2FsaWxlb19tYWNoaW5lX2hhbHQ7CiAJcG1fcG93ZXJfb2ZmID0gZ2FsaWxlb19tYWNoaW5lX3Bvd2VyX29mZjsKIAotCWJvYXJkX3RpbWVfaW5pdCA9IGd0NjQxMjBfdGltZV9pbml0OwogCXNldF9pb19wb3J0X2Jhc2UoS1NFRzEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZ3Q2NDEyMC9tb21lbmNvX29jZWxvdC9zZXR1cC5jIGIvYXJjaC9taXBzL2d0NjQxMjAvbW9tZW5jb19vY2Vsb3Qvc2V0dXAuYwppbmRleCAwZTViYmVlLi45NGY5NGViIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZ3Q2NDEyMC9tb21lbmNvX29jZWxvdC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9ndDY0MTIwL21vbWVuY29fb2NlbG90L3NldHVwLmMKQEAgLTcwLDcgKzcwLDYgQEAKIGV4dGVybiB2b2lkIG1vbWVuY29fb2NlbG90X2hhbHQodm9pZCk7CiBleHRlcm4gdm9pZCBtb21lbmNvX29jZWxvdF9wb3dlcl9vZmYodm9pZCk7CiAKLWV4dGVybiB2b2lkIGd0NjQxMjBfdGltZV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgbW9tZW5jb19vY2Vsb3RfaXJxX3NldHVwKHZvaWQpOwogCiBzdGF0aWMgY2hhciByZXNldF9yZWFzb247CkBAIC0xNTYsOCArMTU1LDYgQEAKIAl2b2lkICgqbDNmdW5jKSh1bnNpZ25lZCBsb25nKT1LU0VHMUFERFIoJnNldHVwX2wzY2FjaGUpOwogCXVuc2lnbmVkIGludCB0bXB3b3JkOwogCi0JYm9hcmRfdGltZV9pbml0ID0gZ3Q2NDEyMF90aW1lX2luaXQ7Ci0KIAlfbWFjaGluZV9yZXN0YXJ0ID0gbW9tZW5jb19vY2Vsb3RfcmVzdGFydDsKIAlfbWFjaGluZV9oYWx0ID0gbW9tZW5jb19vY2Vsb3RfaGFsdDsKIAlwbV9wb3dlcl9vZmYgPSBtb21lbmNvX29jZWxvdF9wb3dlcl9vZmY7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvamF6ei9pcnEuYyBiL2FyY2gvbWlwcy9qYXp6L2lycS5jCmluZGV4IGQ1YmQ2YjMuLmY4ZDQxN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qYXp6L2lycS5jCisrKyBiL2FyY2gvbWlwcy9qYXp6L2lycS5jCkBAIC0yOCwxNCArMjgsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnI0MDMwX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3I0MDMwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV9yNDAzMF9pcnEoaXJxKTsKLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi0jZGVmaW5lIHNodXRkb3duX3I0MDMwX2lycQlkaXNhYmxlX3I0MDMwX2lycQotCiB2b2lkIGRpc2FibGVfcjQwMzBfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSB+KDEgPDwgKGlycSAtIEpBWlpfUEFSQUxMRUxfSVJRKSk7CkBAIC00NywzNCArMzksMjAgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyNDAzMF9sb2NrLCBmbGFncyk7CiB9CiAKLSNkZWZpbmUgbWFza19hbmRfYWNrX3I0MDMwX2lycSBkaXNhYmxlX3I0MDMwX2lycQotCi1zdGF0aWMgdm9pZCBlbmRfcjQwMzBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9yNDAzMF9pcnEoaXJxKTsKLX0KLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCByNDAzMF9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiUjQwMzAiLAotCS5zdGFydHVwID0gc3RhcnR1cF9yNDAzMF9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fcjQwMzBfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfcjQwMzBfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9yNDAzMF9pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19yNDAzMF9pcnEsCi0JLmVuZCA9IGVuZF9yNDAzMF9pcnEsCisJLmFjayA9IGRpc2FibGVfcjQwMzBfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9yNDAzMF9pcnEsCisJLm1hc2tfYWNrID0gZGlzYWJsZV9yNDAzMF9pcnEsCisJLnVubWFzayA9IGVuYWJsZV9yNDAzMF9pcnEsCiB9OwogCiB2b2lkIF9faW5pdCBpbml0X3I0MDMwX2ludHModm9pZCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IEpBWlpfUEFSQUxMRUxfSVJROyBpIDw9IEpBWlpfVElNRVJfSVJROyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzICAgICA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uICAgICA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoICAgICAgPSAxOwotCQlpcnFfZGVzY1tpXS5jaGlwICAgID0gJnI0MDMwX2lycV90eXBlOwotCX0KKwlmb3IgKGkgPSBKQVpaX1BBUkFMTEVMX0lSUTsgaSA8PSBKQVpaX1RJTUVSX0lSUTsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnI0MDMwX2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCXI0MDMwX3dyaXRlX3JlZzE2KEpBWlpfSU9fSVJRX0VOQUJMRSwgMCk7CiAJcjQwMzBfcmVhZF9yZWcxNihKQVpaX0lPX0lSUV9TT1VSQ0UpOwkJLyogY2xlYXIgcGVuZGluZyBJUlFzICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMKaW5kZXggMzlhMDI0My4uM2RhNDljNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pcnEuYwpAQCAtOTAsMTcgKzkwLDYgQEAKIHN0YXRpYyB2b2lkIGptcjM5MjdfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IGlycV9ucik7CiBzdGF0aWMgdm9pZCBqbXIzOTI3X2lycV9lbmFibGUodW5zaWduZWQgaW50IGlycV9ucik7CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soam1yMzkyN19pcnFfbG9jayk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgam1yMzkyN19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWptcjM5MjdfaXJxX2VuYWJsZShpcnEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUJam1yMzkyN19pcnFfc2h1dGRvd24Jam1yMzkyN19pcnFfZGlzYWJsZQotCiBzdGF0aWMgdm9pZCBqbXIzOTI3X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKIAlpZiAoaXJxID09IEpNUjM5MjdfSVJRX0lSQ19UTVIwKQpAQCAtMTE4LDkgKzEwNyw3IEBACiBzdGF0aWMgdm9pZCBqbXIzOTI3X2lycV9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnFfbnIpCiB7CiAJc3RydWN0IHRiX2lycV9zcGFjZSogc3A7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZqbXIzOTI3X2lycV9sb2NrLCBmbGFncyk7CiAJZm9yIChzcCA9IHRiX2lycV9zcGFjZXM7IHNwOyBzcCA9IHNwLT5uZXh0KSB7CiAJCWlmIChzcC0+c3RhcnRfaXJxbm8gPD0gaXJxX25yICYmCiAJCSAgICBpcnFfbnIgPCBzcC0+c3RhcnRfaXJxbm8gKyBzcC0+bnJfaXJxcykgewpAQCAtMTMwLDE1ICsxMTcsMTIgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmptcjM5MjdfaXJxX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgam1yMzkyN19pcnFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnFfbnIpCiB7CiAJc3RydWN0IHRiX2lycV9zcGFjZSogc3A7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZqbXIzOTI3X2lycV9sb2NrLCBmbGFncyk7CiAJZm9yIChzcCA9IHRiX2lycV9zcGFjZXM7IHNwOyBzcCA9IHNwLT5uZXh0KSB7CiAJCWlmIChzcC0+c3RhcnRfaXJxbm8gPD0gaXJxX25yICYmCiAJCSAgICBpcnFfbnIgPCBzcC0+c3RhcnRfaXJxbm8gKyBzcC0+bnJfaXJxcykgewpAQCAtMTQ4LDcgKzEzMiw2IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZqbXIzOTI3X2lycV9sb2NrLCBmbGFncyk7CiB9CiAKIC8qCkBAIC0yODgsNiArMjcxLDggQEAKIAogc3RhdGljIHZvaWQgam1yMzkyN19zcHVyaW91cyh2b2lkKQogeworCXN0cnVjdCBwdF9yZWdzICogcmVncyA9IGdldF9pcnFfcmVncygpOworCiAjaWZkZWYgQ09ORklHX1RYX0JSQU5DSF9MSUtFTFlfQlVHX1dPUktBUk9VTkQKIAl0eF9icmFuY2hfbGlrZWx5X2J1Z19maXh1cCgpOwogI2VuZGlmCkBAIC0yOTcsNiArMjgyLDcgQEAKIAogYXNtbGlua2FnZSB2b2lkIHBsYXRfaXJxX2Rpc3BhdGNoKHZvaWQpCiB7CisJc3RydWN0IHB0X3JlZ3MgKiByZWdzID0gZ2V0X2lycV9yZWdzKCk7CiAJaW50IGlycTsKIAogI2lmZGVmIENPTkZJR19UWF9CUkFOQ0hfTElLRUxZX0JVR19XT1JLQVJPVU5ECkBAIC00NTQsMTEgKzQ0MCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGptcjM5MjdfaXJxX2NvbnRyb2xsZXIgPSB7CiAJLnR5cGVuYW1lID0gImptcjM5MjdfaXJxIiwKLQkuc3RhcnR1cCA9IGptcjM5MjdfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gam1yMzkyN19pcnFfc2h1dGRvd24sCi0JLmVuYWJsZSA9IGptcjM5MjdfaXJxX2VuYWJsZSwKLQkuZGlzYWJsZSA9IGptcjM5MjdfaXJxX2Rpc2FibGUsCiAJLmFjayA9IGptcjM5MjdfaXJxX2FjaywKKwkubWFzayA9IGptcjM5MjdfaXJxX2Rpc2FibGUsCisJLm1hc2tfYWNrID0gam1yMzkyN19pcnFfYWNrLAorCS51bm1hc2sgPSBqbXIzOTI3X2lycV9lbmFibGUsCiAJLmVuZCA9IGptcjM5MjdfaXJxX2VuZCwKIH07CiAKQEAgLTQ2NiwxMiArNDUxLDggQEAKIHsKIAl1MzIgaTsKIAotCWZvciAoaT0gaXJxX2Jhc2U7IGk8IGlycV9iYXNlICsgSk1SMzkyN19OUl9JUlFfSVJDICsgSk1SMzkyN19OUl9JUlFfSU9DOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmam1yMzkyN19pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpPSBpcnFfYmFzZTsgaTwgaXJxX2Jhc2UgKyBKTVIzOTI3X05SX0lSUV9JUkMgKyBKTVIzOTI3X05SX0lSUV9JT0M7IGkrKykKKwkJc2V0X2lycV9jaGlwKGksICZqbXIzOTI3X2lycV9jb250cm9sbGVyKTsKIAogCWptcjM5MjdfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL3NldHVwLmMKaW5kZXggMDI1NDM0MC4uMTM4ZjI1ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL3NldHVwLmMKQEAgLTE3MCwxMiArMTcwLDIwIEBACiAJd2hpbGUgKDEpOwogfQogCitzdGF0aWMgY3ljbGVfdCBqbXIzOTI3X2hwdF9yZWFkKHZvaWQpCit7CisJLyogV2UgYXNzdW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHh0aW1lX2xvY2sgaGVsZC4gKi8KKwlyZXR1cm4gamlmZmllcyAqIChKTVIzOTI3X1RJTUVSX0NMSyAvIEhaKSArIGptcjM5MjdfdG1ycHRyLT50cnI7Cit9CisKICNkZWZpbmUgVVNFX1JUQ19EUzE3NDIKICNpZmRlZiBVU0VfUlRDX0RTMTc0MgogZXh0ZXJuIHZvaWQgcnRjX2RzMTc0Ml9pbml0KHVuc2lnbmVkIGxvbmcgYmFzZSk7CiAjZW5kaWYKIHN0YXRpYyB2b2lkIF9faW5pdCBqbXIzOTI3X3RpbWVfaW5pdCh2b2lkKQogeworCWNsb2Nrc291cmNlX21pcHMucmVhZCA9IGptcjM5MjdfaHB0X3JlYWQ7CisJbWlwc19ocHRfZnJlcXVlbmN5ID0gSk1SMzkyN19USU1FUl9DTEs7CiAjaWZkZWYgVVNFX1JUQ19EUzE3NDIKIAlpZiAoam1yMzkyN19oYXZlX252cmFtKCkpIHsKIAkgICAgICAgIHJ0Y19kczE3NDJfaW5pdChKTVIzOTI3X0lPQ19OVlJBTUJfQUREUik7CkBAIC0xODMsMTIgKzE5MSw4IEBACiAjZW5kaWYKIH0KIAotdW5zaWduZWQgbG9uZyBqbXIzOTI3X2RvX2dldHRpbWVvZmZzZXQodm9pZCk7Ci0KIHZvaWQgX19pbml0IHBsYXRfdGltZXJfc2V0dXAoc3RydWN0IGlycWFjdGlvbiAqaXJxKQogewotCWRvX2dldHRpbWVvZmZzZXQgPSBqbXIzOTI3X2RvX2dldHRpbWVvZmZzZXQ7Ci0KIAlqbXIzOTI3X3RtcnB0ci0+Y3ByYSA9IEpNUjM5MjdfVElNRVJfQ0xLIC8gSFo7CiAJam1yMzkyN190bXJwdHItPml0bXIgPSBUWHg5MjdfVE1USVRNUl9USUlFIHwgVFh4OTI3X1RNVElUTVJfVFpDRTsKIAlqbXIzOTI3X3RtcnB0ci0+Y2NkciA9IEpNUjM5MjdfVElNRVJfQ0NEOwpAQCAtMjAwLDM0ICsyMDQsNiBAQAogCiAjZGVmaW5lIFVTRUNTX1BFUl9KSUZGWSAoMTAwMDAwMC9IWikKIAotdW5zaWduZWQgbG9uZyBqbXIzOTI3X2RvX2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotICAgICAgIHVuc2lnbmVkIGxvbmcgcmVzID0gMDsKLQotICAgICAgIC8qIE1VU1QgcmVhZCBUUlIgYmVmb3JlIFRJU1IuICovCi0gICAgICAgY291bnQgPSBqbXIzOTI3X3RtcnB0ci0+dHJyOwotCi0gICAgICAgaWYgKGptcjM5MjdfdG1ycHRyLT50aXNyICYgVFh4OTI3X1RNVElTUl9USUlTKSB7Ci0gICAgICAgICAgICAgICAvKiB0aW1lciBpbnRlcnJ1cHQgaXMgcGVuZGluZy4gIHVzZSBNYXggdmFsdWUuICovCi0gICAgICAgICAgICAgICByZXMgPSBVU0VDU19QRVJfSklGRlkgLSAxOwotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAvKiBjb252ZXJ0IHRvIHVzZWMgKi8KLSAgICAgICAgICAgICAgIC8qIHJlcyA9IGNvdW50IC8gKEpNUjM5MjdfVElNRVJfQ0xLIC8gMTAwMDAwMCk7ICovCi0gICAgICAgICAgICAgICByZXMgPSAoY291bnQgPDwgNykgLyAoKEpNUjM5MjdfVElNRVJfQ0xLIDw8IDcpIC8gMTAwMDAwMCk7Ci0KLSAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiBEdWUgdG8gcG9zc2libGUgamlmZmllcyBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgdG8gY2hlY2sKLSAgICAgICAgICAgICAgICAqIHRoZSByZXN1bHQgc28gdGhhdCB3ZSdsbCBnZXQgYSB0aW1lciB0aGF0IGlzIG1vbm90b25pYy4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgaWYgKHJlcyA+PSBVU0VDU19QRVJfSklGRlkpCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IFVTRUNTX1BFUl9KSUZGWS0xOwotICAgICAgIH0KLQotICAgICAgIHJldHVybiByZXM7Ci19Ci0KLQogLy8jdW5kZWYgRE9fV1JJVEVfVEhST1VHSAogI2RlZmluZSBET19XUklURV9USFJPVUdICiAjZGVmaW5lIERPX0VOQUJMRV9DQUNIRQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2Q5Y2VjOS4uYmJiYjhkNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogCiBvYmoteQkJKz0gY3B1LXByb2JlLm8gYnJhbmNoLm8gZW50cnkubyBnZW5leC5vIGlycS5vIHByb2Nlc3MubyBcCiAJCSAgIHB0cmFjZS5vIHJlc2V0Lm8gc2VtYXBob3JlLm8gc2V0dXAubyBzaWduYWwubyBzeXNjYWxsLm8gXAotCQkgICB0aW1lLm8gdHJhcHMubyB1bmFsaWduZWQubworCQkgICB0aW1lLm8gdG9wb2xvZ3kubyB0cmFwcy5vIHVuYWxpZ25lZC5vCiAKIGJpbmZtdF9pcml4LW9ianMJOj0gaXJpeGVsZi5vIGlyaXhpbnYubyBpcml4aW9jdGwubyBpcml4c2lnLm8JXAogCQkJICAgaXJpeDVzeXMubyBzeXNpcml4Lm8KQEAgLTQ1LDcgKzQ1LDYgQEAKIG9iai0kKENPTkZJR19NSVBTX1ZQRV9MT0FERVIpCSs9IHZwZS5vCiBvYmotJChDT05GSUdfTUlQU19WUEVfQVBTUF9BUEkpCSs9IHJ0bHgubwogCi1vYmotJChDT05GSUdfTk9fSVNBKQkJKz0gZG1hLW5vLWlzYS5vCiBvYmotJChDT05GSUdfSTgyNTkpCQkrPSBpODI1OS5vCiBvYmotJChDT05GSUdfSVJRX0NQVSkJCSs9IGlycV9jcHUubwogb2JqLSQoQ09ORklHX0lSUV9DUFVfUk03SykJKz0gaXJxLXJtNzAwMC5vCkBAIC02Nyw2ICs2Niw4IEBACiAKIG9iai0kKENPTkZJR19JODI1MykJCSs9IGk4MjUzLm8KIAorb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIHJlbG9jYXRlX2tlcm5lbC5vCisKIENGTEFHU19jcHUtYnVnczY0Lm8JPSAkKHNoZWxsIGlmICQoQ0MpICQoQ0ZMQUdTKSAtV2EsLW1kYWRkaSAtYyAtbyAvZGV2L251bGwgLXhjIC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAiLURIQVZFX0FTX1NFVF9EQURESSI7IGZpKQogCiBFWFRSQV9BRkxBR1MgOj0gJChDRkxBR1MpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2FwbS5jIGIvYXJjaC9taXBzL2tlcm5lbC9hcG0uYwppbmRleCA1MjhlNzMxLi5iYTE2ZDA3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2FwbS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvYXBtLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogewogCXN0cnVjdCBhcG1fdXNlciAqYXM7CiAKLQlhcyA9IChzdHJ1Y3QgYXBtX3VzZXIgKilremFsbG9jKHNpemVvZigqYXMpLCBHRlBfS0VSTkVMKTsKKwlhcyA9IGt6YWxsb2Moc2l6ZW9mKCphcyksIEdGUF9LRVJORUwpOwogCWlmIChhcykgewogCQkvKgogCQkgKiBYWFggLSB0aGlzIGlzIGEgdGlueSBiaXQgYnJva2VuLCB3aGVuIHdlIGNvbnNpZGVyIEJTRApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGU5Y2U1YjMuLmZmODhiMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUgb2Zmc2V0KHN0cmluZywgcHRyLCBtZW1iZXIpIFwKIAlfX2FzbV9fKCJcbkBAQCIgc3RyaW5nICIlMCIgOiA6ICJpIiAoX29mZnNldChwdHIsIG1lbWJlcikpKQogI2RlZmluZSBjb25zdGFudChzdHJpbmcsIG1lbWJlcikgXAotCV9fYXNtX18oIlxuQEBAIiBzdHJpbmcgIiV4MCIgOiA6ICJyaSIgKG1lbWJlcikpCisJX19hc21fXygiXG5AQEAiIHN0cmluZyAiJVgwIiA6IDogInJpIiAobWVtYmVyKSkKICNkZWZpbmUgc2l6ZShzdHJpbmcsIHNpemUpIFwKIAlfX2FzbV9fKCJcbkBAQCIgc3RyaW5nICIlMCIgOiA6ICJpIiAoc2l6ZW9mKHNpemUpKSkKICNkZWZpbmUgbGluZWZlZWQgdGV4dCgiIikKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm4zMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9iaW5mbXRfZWxmbjMyLmMKaW5kZXggNGE5ZjFlYy4uOWIzNDIzOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9iaW5mbXRfZWxmbjMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9iaW5mbXRfZWxmbjMyLmMKQEAgLTkwLDcgKzkwLDYgQEAKIAljaGFyCXByX3BzYXJnc1tFTEZfUFJBUkdTWl07CS8qIGluaXRpYWwgcGFydCBvZiBhcmcgbGlzdCAqLwogfTsKIAotI2RlZmluZSBlbGZfYWRkcl90CXUzMgogI2RlZmluZSBlbGZfY2FkZHJfdAl1MzIKICNkZWZpbmUgaW5pdF9lbGZfYmluZm10IGluaXRfZWxmbjMyX2JpbmZtdAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2JpbmZtdF9lbGZvMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm8zMi5jCmluZGV4IGUzMTgxMzcuLjk5M2Y3ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm8zMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvYmluZm10X2VsZm8zMi5jCkBAIC05Miw3ICs5Miw2IEBACiAJY2hhcglwcl9wc2FyZ3NbRUxGX1BSQVJHU1pdOwkvKiBpbml0aWFsIHBhcnQgb2YgYXJnIGxpc3QgKi8KIH07CiAKLSNkZWZpbmUgZWxmX2FkZHJfdAl1MzIKICNkZWZpbmUgZWxmX2NhZGRyX3QJdTMyCiAjZGVmaW5lIGluaXRfZWxmX2JpbmZtdCBpbml0X2VsZjMyX2JpbmZtdAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwppbmRleCA4NDg1YWYzLi40NDI4MzllIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKQEAgLTExMCw5ICsxMTAsOCBAQAogewogCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKIAotCXByaW50aygiQ2hlY2tpbmcgZm9yICd3YWl0JyBpbnN0cnVjdGlvbi4uLiAiKTsKIAlpZiAobm93YWl0KSB7Ci0JCXByaW50ayAoIiBkaXNhYmxlZC5cbiIpOworCQlwcmludGsoIldhaXQgaW5zdHJ1Y3Rpb24gZGlzYWJsZWQuXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTIwLDExICsxMTksOSBAQAogCWNhc2UgQ1BVX1IzMDgxOgogCWNhc2UgQ1BVX1IzMDgxRToKIAkJY3B1X3dhaXQgPSByMzA4MV93YWl0OwotCQlwcmludGsoIiBhdmFpbGFibGUuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfVFgzOTI3OgogCQljcHVfd2FpdCA9IHIzOXh4X3dhaXQ7Ci0JCXByaW50aygiIGF2YWlsYWJsZS5cbiIpOwogCQlicmVhazsKIAljYXNlIENQVV9SNDIwMDoKIC8qCWNhc2UgQ1BVX1I0MzAwOiAqLwpAQCAtMTQ2LDMzICsxNDMsMjMgQEAKIAljYXNlIENQVV83NEs6CiAgCWNhc2UgQ1BVX1BSNDQ1MDoKIAkJY3B1X3dhaXQgPSByNGtfd2FpdDsKLQkJcHJpbnRrKCIgYXZhaWxhYmxlLlxuIik7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX1RYNDlYWDoKIAkJY3B1X3dhaXQgPSByNGtfd2FpdF9pcnFvZmY7Ci0JCXByaW50aygiIGF2YWlsYWJsZS5cbiIpOwogCQlicmVhazsKIAljYXNlIENQVV9BVTEwMDA6CiAJY2FzZSBDUFVfQVUxMTAwOgogCWNhc2UgQ1BVX0FVMTUwMDoKIAljYXNlIENQVV9BVTE1NTA6CiAJY2FzZSBDUFVfQVUxMjAwOgotCQlpZiAoYWxsb3dfYXUxa193YWl0KSB7CisJCWlmIChhbGxvd19hdTFrX3dhaXQpCiAJCQljcHVfd2FpdCA9IGF1MWtfd2FpdDsKLQkJCXByaW50aygiIGF2YWlsYWJsZS5cbiIpOwotCQl9IGVsc2UKLQkJCXByaW50aygiIHVuYXZhaWxhYmxlLlxuIik7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX1JNOTAwMDoKLQkJaWYgKChjLT5wcm9jZXNzb3JfaWQgJiAweDAwZmYpID49IDB4NDApIHsKKwkJaWYgKChjLT5wcm9jZXNzb3JfaWQgJiAweDAwZmYpID49IDB4NDApCiAJCQljcHVfd2FpdCA9IHI0a193YWl0OwotCQkJcHJpbnRrKCIgYXZhaWxhYmxlLlxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoIiB1bmF2YWlsYWJsZS5cbiIpOwotCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiIHVuYXZhaWxhYmxlLlxuIik7CiAJCWJyZWFrOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZG1hLW5vLWlzYS5jIGIvYXJjaC9taXBzL2tlcm5lbC9kbWEtbm8taXNhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjhiMDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9kbWEtbm8taXNhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFJhbGYgQmFlY2hsZQotICoKLSAqIER1bW15IElTQSBETUEgZnVuY3Rpb25zIGZvciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBJU0EgYnV0IHNoYXJlIGRyaXZlcnMKLSAqIHdpdGggSVNBIHN1Y2ggYXMgbGVnYWN5IGZyZWUgUENJLgotICovCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi1ERUZJTkVfU1BJTkxPQ0soZG1hX3NwaW5fbG9jayk7Ci0KLWludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNvbnN0IGNoYXIgKiBkZXZpY2VfaWQpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXZvaWQgZnJlZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKQotewotfQotCi1FWFBPUlRfU1lNQk9MKGRtYV9zcGluX2xvY2spOwotRVhQT1JUX1NZTUJPTChyZXF1ZXN0X2RtYSk7Ci1FWFBPUlRfU1lNQk9MKGZyZWVfZG1hKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbWlwcy9rZXJuZWwvZW50cnkuUwppbmRleCA0MTdjMDhhLi5mMTBiNmExIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9lbnRyeS5TCkBAIC04Myw3ICs4MywxMCBAQAogRkVYUE9SVChyZXN0b3JlX2FsbCkJCQkjIHJlc3RvcmUgZnVsbCBmcmFtZQogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKIC8qIERldGVjdCBhbmQgZXhlY3V0ZSBkZWZlcnJlZCBJUEkgImludGVycnVwdHMiICovCisJTE9OR19MCXMwLCBUSV9SRUdTKCQyOCkKKwlMT05HX1MJc3AsIFRJX1JFR1MoJDI4KQogCWphbAlkZWZlcnJlZF9zbXRjX2lwaQorCUxPTkdfUwlzMCwgVElfUkVHUygkMjgpCiAvKiBSZS1hcm0gYW55IHRlbXBvcmFyaWx5IG1hc2tlZCBpbnRlcnJ1cHRzIG5vdCBleHBsaWNpdGx5ICJhY2tlZCIgKi8KIAltZmMwCXYwLCBDUDBfVENTVEFUVVMKIAlvcmkJdjEsIHYwLCBUQ1NUQVRVU19JWE1UCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKaW5kZXggNWJhY2ExNi4uYWFjZDRhMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKICNkZWZpbmUgUEFOSUNfUElDKG1zZykJCQkJCVwKIAkJLnNldCBwdXNoOwkJCQlcCkBAIC0zNzgsNiArMzc5LDY4IEBACiAJQlVJTERfSEFORExFUiBkc3AgZHNwIHN0aSBzaWxlbnQJCS8qICMyNiAqLwogCUJVSUxEX0hBTkRMRVIgcmVzZXJ2ZWQgcmVzZXJ2ZWQgc3RpIHZlcmJvc2UJLyogb3RoZXJzICovCiAKKwkuYWxpZ24JNQorCUxFQUYoaGFuZGxlX3JpX3JkaHdyX3ZpdnQpCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCVBBTklDX1BJQygiaGFuZGxlX3JpX3JkaHdyX3ZpdnQgY2FsbGVkIikKKyNlbHNlCisJLnNldAlwdXNoCisJLnNldAlub2F0CisJLnNldAlub3Jlb3JkZXIKKwkvKiBjaGVjayBpZiBUTEIgY29udGFpbnMgYSBlbnRyeSBmb3IgRVBDICovCisJTUZDMAlrMSwgQ1AwX0VOVFJZSEkKKwlhbmRpCWsxLCAweGZmCS8qIEFTSURfTUFTSyAqLworCU1GQzAJazAsIENQMF9FUEMKKwlQVFJfU1JMCWswLCBQQUdFX1NISUZUICsgMQorCVBUUl9TTEwJazAsIFBBR0VfU0hJRlQgKyAxCisJb3IJazEsIGswCisJTVRDMAlrMSwgQ1AwX0VOVFJZSEkKKwltdGMwX3RsYndfaGF6YXJkCisJdGxicAorCXRsYl9wcm9iZV9oYXphcmQKKwltZmMwCWsxLCBDUDBfSU5ERVgKKwkuc2V0CXBvcAorCWJsdHoJazEsIGhhbmRsZV9yaQkvKiBzbG93IHBhdGggKi8KKwkvKiBmYWxsIHRocnUgKi8KKyNlbmRpZgorCUVORChoYW5kbGVfcmlfcmRod3Jfdml2dCkKKworCUxFQUYoaGFuZGxlX3JpX3JkaHdyKQorCS5zZXQJcHVzaAorCS5zZXQJbm9hdAorCS5zZXQJbm9yZW9yZGVyCisJLyogMHg3YzAzZTgzYjogcmRod3IgdjEsJDI5ICovCisJTUZDMAlrMSwgQ1AwX0VQQworCWx1aQlrMCwgMHg3YzAzCisJbHcJazEsIChrMSkKKwlvcmkJazAsIDB4ZTgzYgorCS5zZXQJcmVvcmRlcgorCWJuZQlrMCwgazEsIGhhbmRsZV9yaQkvKiBpZiBub3Qgb3VycyAqLworCS8qIFRoZSBpbnNuIGlzIHJkaHdyLiAgTm8gbmVlZCB0byBjaGVjayBDQVVTRS5CRCBoZXJlLiAqLworCWdldF9zYXZlZF9zcAkvKiBrMSA6PSBjdXJyZW50X3RocmVhZF9pbmZvICovCisJLnNldAlub3Jlb3JkZXIKKwlNRkMwCWswLCBDUDBfRVBDCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IzMDAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfVFgzOVhYKQorCW9yaQlrMSwgX1RIUkVBRF9NQVNLCisJeG9yaQlrMSwgX1RIUkVBRF9NQVNLCisJTE9OR19MCXYxLCBUSV9UUF9WQUxVRShrMSkKKwlMT05HX0FERElVCWswLCA0CisJanIJazAKKwkgcmZlCisjZWxzZQorCUxPTkdfQURESVUJazAsIDQJCS8qIHN0YWxsIG9uICRrMCAqLworCU1UQzAJazAsIENQMF9FUEMKKwkvKiBJIGhvcGUgdGhyZWUgaW5zdHJ1Y3Rpb25zIGJldHdlZW4gTVRDMCBhbmQgRVJFVCBhcmUgZW5vdWdoLi4uICovCisJb3JpCWsxLCBfVEhSRUFEX01BU0sKKwl4b3JpCWsxLCBfVEhSRUFEX01BU0sKKwlMT05HX0wJdjEsIFRJX1RQX1ZBTFVFKGsxKQorCS5zZXQJbWlwczMKKwllcmV0CisJLnNldAltaXBzMAorI2VuZGlmCisJLnNldAlwb3AKKwlFTkQoaGFuZGxlX3JpX3JkaHdyKQorCiAjaWZkZWYgQ09ORklHXzY0QklUCiAvKiBBIHRlbXBvcmFyeSBvdmVyZmxvdyBoYW5kbGVyIHVzZWQgYnkgY2hlY2tfZGFkZGkoKS4gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9oZWFkLlMgYi9hcmNoL21pcHMva2VybmVsL2hlYWQuUwppbmRleCA4YzZkYjBmLi45YTc4MTFkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2hlYWQuUworKysgYi9hcmNoL21pcHMva2VybmVsL2hlYWQuUwpAQCAtMTM4LDcgKzEzOCw3IEBACiBFWFBPUlQoc3RleHQpCQkJCQkjIHVzZWQgZm9yIHByb2ZpbGluZwogRVhQT1JUKF9zdGV4dCkKIAotI2lmIGRlZmluZWQoQ09ORklHX1FFTVUpIHx8IGRlZmluZWQoQ09ORklHX01JUFNfU0lNKQorI2lmZGVmIENPTkZJR19NSVBTX1NJTQogCS8qCiAJICogR2l2ZSB1cyBhIGZpZ2h0aW5nIGNoYW5jZSBvZiBydW5uaW5nIGlmIGV4ZWN1dGlvbiBiZWluZ3MgYXQgdGhlCiAJICoga2VybmVsIGxvYWQgYWRkcmVzcy4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhpcyBwbGF0Zm9ybSBkb2VzCkBAIC0xODksNyArMTg5LDggQEAKIAogCU1UQzAJCXplcm8sIENQMF9DT05URVhUCSMgY2xlYXIgY29udGV4dCByZWdpc3RlcgogCVBUUl9MQQkJJDI4LCBpbml0X3RocmVhZF91bmlvbgotCVBUUl9BRERJVQlzcCwgJDI4LCBfVEhSRUFEX1NJWkUgLSAzMgorCVBUUl9MSQkJc3AsIF9USFJFQURfU0laRSAtIDMyCisJUFRSX0FERFUJc3AsICQyOAogCXNldF9zYXZlZF9zcAlzcCwgdDAsIHQxCiAJUFRSX1NVQlUJc3AsIDQgKiBTWlJFRwkJIyBpbml0IHN0YWNrIHBvaW50ZXIKIApAQCAtMjQ5LDYgKzI1MCw5IEBACiAJICovCiAJcGFnZQlzd2FwcGVyX3BnX2RpciwgX1BHRF9PUkRFUgogI2lmZGVmIENPTkZJR182NEJJVAorI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRVMpICYmICFkZWZpbmVkKENPTkZJR19CVUlMRF9FTEY2NCkKKwlwYWdlCW1vZHVsZV9wZ19kaXIsIF9QR0RfT1JERVIKKyNlbmRpZgogCXBhZ2UJaW52YWxpZF9wbWRfdGFibGUsIF9QTURfT1JERVIKICNlbmRpZgogCXBhZ2UJaW52YWxpZF9wdGVfdGFibGUsIF9QVEVfT1JERVIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYwppbmRleCA0OGUzNDE4Li5iNTlhNjc2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCkBAIC0xOSw5ICsxOSw2IEBACiAjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLXZvaWQgZW5hYmxlXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXZvaWQgZGlzYWJsZV84MjU5QV9pcnEodW5zaWduZWQgaW50IGlycSk7Ci0KIC8qCiAgKiBUaGlzIGlzIHRoZSAnbGVnYWN5JyA4MjU5QSBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIsCiAgKiBwcmVzZW50IGluIHRoZSBtYWpvcml0eSBvZiBQQy9BVCBib3hlcy4KQEAgLTMxLDM0ICsyOCwxNiBAQAogICogbW92ZXMgdG8gYXJjaCBpbmRlcGVuZGVudCBsYW5kCiAgKi8KIAorc3RhdGljIGludCBpODI1OUFfYXV0b19lb2k7CiBERUZJTkVfU1BJTkxPQ0soaTgyNTlBX2xvY2spOwotCi1zdGF0aWMgdm9pZCBlbmRfODI1OUFfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpICYmCi0JICAgIGlycV9kZXNjW2lycV0uYWN0aW9uKQotCQllbmFibGVfODI1OUFfaXJxKGlycSk7Ci19Ci0KLSNkZWZpbmUgc2h1dGRvd25fODI1OUFfaXJxCWRpc2FibGVfODI1OUFfaXJxCi0KKy8qIHNvbWUgcGxhdGZvcm1zIGNhbGwgdGhpcy4uLiAqLwogdm9pZCBtYXNrX2FuZF9hY2tfODI1OUEodW5zaWduZWQgaW50KTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV84MjU5QV9pcnEoaXJxKTsKLQotCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaTgyNTlBX2lycV90eXBlID0gewotCS50eXBlbmFtZSA9ICJYVC1QSUMiLAotCS5zdGFydHVwID0gc3RhcnR1cF84MjU5QV9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fODI1OUFfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfODI1OUFfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV84MjU5QV9pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja184MjU5QSwKLQkuZW5kID0gZW5kXzgyNTlBX2lycSwKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaTgyNTlBX2NoaXAgPSB7CisJLm5hbWUJCT0gIlhULVBJQyIsCisJLm1hc2sJCT0gZGlzYWJsZV84MjU5QV9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfODI1OUFfaXJxLAorCS5tYXNrX2Fjawk9IG1hc2tfYW5kX2Fja184MjU5QSwKIH07CiAKIC8qCkBAIC03MCw4ICs0OSw4IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2FjaGVkX2lycV9tYXNrID0gMHhmZmZmOwogCi0jZGVmaW5lIGNhY2hlZF8yMQkoY2FjaGVkX2lycV9tYXNrKQotI2RlZmluZSBjYWNoZWRfQTEJKGNhY2hlZF9pcnFfbWFzayA+PiA4KQorI2RlZmluZSBjYWNoZWRfbWFzdGVyX21hc2sJKGNhY2hlZF9pcnFfbWFzaykKKyNkZWZpbmUgY2FjaGVkX3NsYXZlX21hc2sJKGNhY2hlZF9pcnFfbWFzayA+PiA4KQogCiB2b2lkIGRpc2FibGVfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CkBAIC04MSw5ICs2MCw5IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CiAJY2FjaGVkX2lycV9tYXNrIHw9IG1hc2s7CiAJaWYgKGlycSAmIDgpCi0JCW91dGIoY2FjaGVkX0ExLDB4QTEpOworCQlvdXRiKGNhY2hlZF9zbGF2ZV9tYXNrLCBQSUNfU0xBVkVfSU1SKTsKIAllbHNlCi0JCW91dGIoY2FjaGVkXzIxLDB4MjEpOworCQlvdXRiKGNhY2hlZF9tYXN0ZXJfbWFzaywgUElDX01BU1RFUl9JTVIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTk1LDkgKzc0LDkgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKIAljYWNoZWRfaXJxX21hc2sgJj0gbWFzazsKIAlpZiAoaXJxICYgOCkKLQkJb3V0YihjYWNoZWRfQTEsMHhBMSk7CisJCW91dGIoY2FjaGVkX3NsYXZlX21hc2ssIFBJQ19TTEFWRV9JTVIpOwogCWVsc2UKLQkJb3V0YihjYWNoZWRfMjEsMHgyMSk7CisJCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCBQSUNfTUFTVEVSX0lNUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTA5LDkgKzg4LDkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOwogCWlmIChpcnEgPCA4KQotCQlyZXQgPSBpbmIoMHgyMCkgJiBtYXNrOworCQlyZXQgPSBpbmIoUElDX01BU1RFUl9DTUQpICYgbWFzazsKIAllbHNlCi0JCXJldCA9IGluYigweEEwKSAmIChtYXNrID4+IDgpOworCQlyZXQgPSBpbmIoUElDX1NMQVZFX0NNRCkgJiAobWFzayA+PiA4KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKQEAgLTEyMCw3ICs5OSw3IEBACiB2b2lkIG1ha2VfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JaXJxX2Rlc2NbaXJxXS5jaGlwID0gJmk4MjU5QV9pcnFfdHlwZTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmaTgyNTlBX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOwogCWVuYWJsZV9pcnEoaXJxKTsKIH0KIApAQCAtMTM2LDE0ICsxMTUsMTQgQEAKIAlpbnQgaXJxbWFzayA9IDEgPDwgaXJxOwogCiAJaWYgKGlycSA8IDgpIHsKLQkJb3V0YigweDBCLDB4MjApOwkJLyogSVNSIHJlZ2lzdGVyICovCi0JCXZhbHVlID0gaW5iKDB4MjApICYgaXJxbWFzazsKLQkJb3V0YigweDBBLDB4MjApOwkJLyogYmFjayB0byB0aGUgSVJSIHJlZ2lzdGVyICovCisJCW91dGIoMHgwQixQSUNfTUFTVEVSX0NNRCk7CS8qIElTUiByZWdpc3RlciAqLworCQl2YWx1ZSA9IGluYihQSUNfTUFTVEVSX0NNRCkgJiBpcnFtYXNrOworCQlvdXRiKDB4MEEsUElDX01BU1RFUl9DTUQpOwkvKiBiYWNrIHRvIHRoZSBJUlIgcmVnaXN0ZXIgKi8KIAkJcmV0dXJuIHZhbHVlOwogCX0KLQlvdXRiKDB4MEIsMHhBMCk7CQkvKiBJU1IgcmVnaXN0ZXIgKi8KLQl2YWx1ZSA9IGluYigweEEwKSAmIChpcnFtYXNrID4+IDgpOwotCW91dGIoMHgwQSwweEEwKTsJCS8qIGJhY2sgdG8gdGhlIElSUiByZWdpc3RlciAqLworCW91dGIoMHgwQixQSUNfU0xBVkVfQ01EKTsJLyogSVNSIHJlZ2lzdGVyICovCisJdmFsdWUgPSBpbmIoUElDX1NMQVZFX0NNRCkgJiAoaXJxbWFzayA+PiA4KTsKKwlvdXRiKDB4MEEsUElDX1NMQVZFX0NNRCk7CS8qIGJhY2sgdG8gdGhlIElSUiByZWdpc3RlciAqLwogCXJldHVybiB2YWx1ZTsKIH0KIApAQCAtMTYwLDE3ICsxMzksMTkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOwogCS8qCi0JICogTGlnaHR3ZWlnaHQgc3B1cmlvdXMgSVJRIGRldGVjdGlvbi4gV2UgZG8gbm90IHdhbnQgdG8gb3ZlcmRvCi0JICogc3B1cmlvdXMgSVJRIGhhbmRsaW5nIC0gaXQncyB1c3VhbGx5IGEgc2lnbiBvZiBoYXJkd2FyZSBwcm9ibGVtcywgc28KLQkgKiB3ZSBvbmx5IGRvIHRoZSBjaGVja3Mgd2UgY2FuIGRvIHdpdGhvdXQgc2xvd2luZyBkb3duIGdvb2QgaGFyZHdhcmUKLQkgKiBubmVjZXNzZXJpbHkuCisJICogTGlnaHR3ZWlnaHQgc3B1cmlvdXMgSVJRIGRldGVjdGlvbi4gV2UgZG8gbm90IHdhbnQKKwkgKiB0byBvdmVyZG8gc3B1cmlvdXMgSVJRIGhhbmRsaW5nIC0gaXQncyB1c3VhbGx5IGEgc2lnbgorCSAqIG9mIGhhcmR3YXJlIHByb2JsZW1zLCBzbyB3ZSBvbmx5IGRvIHRoZSBjaGVja3Mgd2UgY2FuCisJICogZG8gd2l0aG91dCBzbG93aW5nIGRvd24gZ29vZCBoYXJkd2FyZSB1bm5lY2Vzc2FyaWx5LgogCSAqCi0JICogTm90ZSB0aGF0IElSUTcgYW5kIElSUTE1ICh0aGUgdHdvIHNwdXJpb3VzIElSUXMgdXN1YWxseSByZXN1bHRpbmcKLQkgKiByb20gdGhlIDgyNTlBLTF8MiBQSUNzKSBvY2N1ciBldmVuIGlmIHRoZSBJUlEgaXMgbWFza2VkIGluIHRoZSA4MjU5QS4KLQkgKiBUaHVzIHdlIGNhbiBjaGVjayBzcHVyaW91cyA4MjU5QSBJUlFzIHdpdGhvdXQgZG9pbmcgdGhlIHF1aXRlIHNsb3cKLQkgKiBpODI1OUFfaXJxX3JlYWwoKSBjYWxsIGZvciBldmVyeSBJUlEuICBUaGlzIGRvZXMgbm90IGNvdmVyIDEwMCUgb2YKLQkgKiBzcHVyaW91cyBpbnRlcnJ1cHRzLCBidXQgc2hvdWxkIGJlIGVub3VnaCB0byB3YXJuIHRoZSB1c2VyIHRoYXQKLQkgKiB0aGVyZSBpcyBzb21ldGhpbmcgYmFkIGdvaW5nIG9uIC4uLgorCSAqIE5vdGUgdGhhdCBJUlE3IGFuZCBJUlExNSAodGhlIHR3byBzcHVyaW91cyBJUlFzCisJICogdXN1YWxseSByZXN1bHRpbmcgZnJvbSB0aGUgODI1OUEtMXwyIFBJQ3MpIG9jY3VyCisJICogZXZlbiBpZiB0aGUgSVJRIGlzIG1hc2tlZCBpbiB0aGUgODI1OUEuIFRodXMgd2UKKwkgKiBjYW4gY2hlY2sgc3B1cmlvdXMgODI1OUEgSVJRcyB3aXRob3V0IGRvaW5nIHRoZQorCSAqIHF1aXRlIHNsb3cgaTgyNTlBX2lycV9yZWFsKCkgY2FsbCBmb3IgZXZlcnkgSVJRLgorCSAqIFRoaXMgZG9lcyBub3QgY292ZXIgMTAwJSBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzLAorCSAqIGJ1dCBzaG91bGQgYmUgZW5vdWdoIHRvIHdhcm4gdGhlIHVzZXIgdGhhdCB0aGVyZQorCSAqIGlzIHNvbWV0aGluZyBiYWQgZ29pbmcgb24gLi4uCiAJICovCiAJaWYgKGNhY2hlZF9pcnFfbWFzayAmIGlycW1hc2spCiAJCWdvdG8gc3B1cmlvdXNfODI1OUFfaXJxOwpAQCAtMTc4LDE0ICsxNTksMTQgQEAKIAogaGFuZGxlX3JlYWxfaXJxOgogCWlmIChpcnEgJiA4KSB7Ci0JCWluYigweEExKTsJCS8qIERVTU1ZIC0gKGRvIHdlIG5lZWQgdGhpcz8pICovCi0JCW91dGIoY2FjaGVkX0ExLDB4QTEpOwotCQlvdXRiKDB4NjArKGlycSY3KSwweEEwKTsvKiAnU3BlY2lmaWMgRU9JJyB0byBzbGF2ZSAqLwotCQlvdXRiKDB4NjIsMHgyMCk7CS8qICdTcGVjaWZpYyBFT0knIHRvIG1hc3Rlci1JUlEyICovCisJCWluYihQSUNfU0xBVkVfSU1SKTsJLyogRFVNTVkgLSAoZG8gd2UgbmVlZCB0aGlzPykgKi8KKwkJb3V0YihjYWNoZWRfc2xhdmVfbWFzaywgUElDX1NMQVZFX0lNUik7CisJCW91dGIoMHg2MCsoaXJxJjcpLFBJQ19TTEFWRV9DTUQpOy8qICdTcGVjaWZpYyBFT0knIHRvIHNsYXZlICovCisJCW91dGIoMHg2MCtQSUNfQ0FTQ0FERV9JUixQSUNfTUFTVEVSX0NNRCk7IC8qICdTcGVjaWZpYyBFT0knIHRvIG1hc3Rlci1JUlEyICovCiAJfSBlbHNlIHsKLQkJaW5iKDB4MjEpOwkJLyogRFVNTVkgLSAoZG8gd2UgbmVlZCB0aGlzPykgKi8KLQkJb3V0YihjYWNoZWRfMjEsMHgyMSk7Ci0JCW91dGIoMHg2MCtpcnEsMHgyMCk7CS8qICdTcGVjaWZpYyBFT0knIHRvIG1hc3RlciAqLworCQlpbmIoUElDX01BU1RFUl9JTVIpOwkvKiBEVU1NWSAtIChkbyB3ZSBuZWVkIHRoaXM/KSAqLworCQlvdXRiKGNhY2hlZF9tYXN0ZXJfbWFzaywgUElDX01BU1RFUl9JTVIpOworCQlvdXRiKDB4NjAraXJxLFBJQ19NQVNURVJfQ01EKTsJLyogJ1NwZWNpZmljIEVPSSB0byBtYXN0ZXIgKi8KIAl9CiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogICAgICAgICBpZiAoaXJxX2h3bWFza1tpcnFdICYgU1QwX0lNKQpAQCAtMjA2LDcgKzE4Nyw3IEBACiAJCWdvdG8gaGFuZGxlX3JlYWxfaXJxOwogCiAJewotCQlzdGF0aWMgaW50IHNwdXJpb3VzX2lycV9tYXNrID0gMDsKKwkJc3RhdGljIGludCBzcHVyaW91c19pcnFfbWFzazsKIAkJLyoKIAkJICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgSVJRIGlzIHNwdXJpb3VzLAogCQkgKiBsZXRzIEFDSyBhbmQgcmVwb3J0IGl0LiBbb25jZSBwZXIgSVJRXQpAQCAtMjI3LDEzICsyMDgsMjUgQEAKIAogc3RhdGljIGludCBpODI1OUFfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCiB7Ci0JaW5pdF84MjU5QSgwKTsKKwlpbml0XzgyNTlBKGk4MjU5QV9hdXRvX2VvaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgyNTlBX3NodXRkb3duKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJLyogUHV0IHRoZSBpODI1OUEgaW50byBhIHF1aWVzY2VudCBzdGF0ZSB0aGF0CisJICogdGhlIGtlcm5lbCBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBnZXQgaXQKKwkgKiBvdXQgb2YuCisJICovCisJb3V0YigweGZmLCBQSUNfTUFTVEVSX0lNUik7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KKwlvdXRiKDB4ZmYsIFBJQ19TTEFWRV9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGk4MjU5X3N5c2Rldl9jbGFzcyA9IHsKIAlzZXRfa3NldF9uYW1lKCJpODI1OSIpLAogCS5yZXN1bWUgPSBpODI1OUFfcmVzdW1lLAorCS5zaHV0ZG93biA9IGk4MjU5QV9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfaTgyNTlBID0gewpAQCAtMjU1LDQxICsyNDgsNDEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaTgyNTlBX2F1dG9fZW9pID0gYXV0b19lb2k7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKIAotCW91dGIoMHhmZiwgMHgyMSk7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KLQlvdXRiKDB4ZmYsIDB4QTEpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0yICovCisJb3V0YigweGZmLCBQSUNfTUFTVEVSX0lNUik7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KKwlvdXRiKDB4ZmYsIFBJQ19TTEFWRV9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0yICovCiAKIAkvKgogCSAqIG91dGJfcCAtIHRoaXMgaGFzIHRvIHdvcmsgb24gYSB3aWRlIHJhbmdlIG9mIFBDIGhhcmR3YXJlLgogCSAqLwotCW91dGJfcCgweDExLCAweDIwKTsJLyogSUNXMTogc2VsZWN0IDgyNTlBLTEgaW5pdCAqLwotCW91dGJfcCgweDAwLCAweDIxKTsJLyogSUNXMjogODI1OUEtMSBJUjAtNyBtYXBwZWQgdG8gMHgwMC0weDA3ICovCi0Jb3V0Yl9wKDB4MDQsIDB4MjEpOwkvKiA4MjU5QS0xICh0aGUgbWFzdGVyKSBoYXMgYSBzbGF2ZSBvbiBJUjIgKi8KLQlpZiAoYXV0b19lb2kpCi0JCW91dGJfcCgweDAzLCAweDIxKTsJLyogbWFzdGVyIGRvZXMgQXV0byBFT0kgKi8KLQllbHNlCi0JCW91dGJfcCgweDAxLCAweDIxKTsJLyogbWFzdGVyIGV4cGVjdHMgbm9ybWFsIEVPSSAqLworCW91dGJfcCgweDExLCBQSUNfTUFTVEVSX0NNRCk7CS8qIElDVzE6IHNlbGVjdCA4MjU5QS0xIGluaXQgKi8KKwlvdXRiX3AoSTgyNTlBX0lSUV9CQVNFICsgMCwgUElDX01BU1RFUl9JTVIpOwkvKiBJQ1cyOiA4MjU5QS0xIElSMCBtYXBwZWQgdG8gSTgyNTlBX0lSUV9CQVNFICsgMHgwMCAqLworCW91dGJfcCgxVSA8PCBQSUNfQ0FTQ0FERV9JUiwgUElDX01BU1RFUl9JTVIpOwkvKiA4MjU5QS0xICh0aGUgbWFzdGVyKSBoYXMgYSBzbGF2ZSBvbiBJUjIgKi8KKwlpZiAoYXV0b19lb2kpCS8qIG1hc3RlciBkb2VzIEF1dG8gRU9JICovCisJCW91dGJfcChNQVNURVJfSUNXNF9ERUZBVUxUIHwgUElDX0lDVzRfQUVPSSwgUElDX01BU1RFUl9JTVIpOworCWVsc2UJCS8qIG1hc3RlciBleHBlY3RzIG5vcm1hbCBFT0kgKi8KKwkJb3V0Yl9wKE1BU1RFUl9JQ1c0X0RFRkFVTFQsIFBJQ19NQVNURVJfSU1SKTsKIAotCW91dGJfcCgweDExLCAweEEwKTsJLyogSUNXMTogc2VsZWN0IDgyNTlBLTIgaW5pdCAqLwotCW91dGJfcCgweDA4LCAweEExKTsJLyogSUNXMjogODI1OUEtMiBJUjAtNyBtYXBwZWQgdG8gMHgwOC0weDBmICovCi0Jb3V0Yl9wKDB4MDIsIDB4QTEpOwkvKiA4MjU5QS0yIGlzIGEgc2xhdmUgb24gbWFzdGVyJ3MgSVIyICovCi0Jb3V0Yl9wKDB4MDEsIDB4QTEpOwkvKiAoc2xhdmUncyBzdXBwb3J0IGZvciBBRU9JIGluIGZsYXQgbW9kZQotCQkJCSAgICBpcyB0byBiZSBpbnZlc3RpZ2F0ZWQpICovCi0KKwlvdXRiX3AoMHgxMSwgUElDX1NMQVZFX0NNRCk7CS8qIElDVzE6IHNlbGVjdCA4MjU5QS0yIGluaXQgKi8KKwlvdXRiX3AoSTgyNTlBX0lSUV9CQVNFICsgOCwgUElDX1NMQVZFX0lNUik7CS8qIElDVzI6IDgyNTlBLTIgSVIwIG1hcHBlZCB0byBJODI1OUFfSVJRX0JBU0UgKyAweDA4ICovCisJb3V0Yl9wKFBJQ19DQVNDQURFX0lSLCBQSUNfU0xBVkVfSU1SKTsJLyogODI1OUEtMiBpcyBhIHNsYXZlIG9uIG1hc3RlcidzIElSMiAqLworCW91dGJfcChTTEFWRV9JQ1c0X0RFRkFVTFQsIFBJQ19TTEFWRV9JTVIpOyAvKiAoc2xhdmUncyBzdXBwb3J0IGZvciBBRU9JIGluIGZsYXQgbW9kZSBpcyB0byBiZSBpbnZlc3RpZ2F0ZWQpICovCiAJaWYgKGF1dG9fZW9pKQogCQkvKgotCQkgKiBpbiBBRU9JIG1vZGUgd2UganVzdCBoYXZlIHRvIG1hc2sgdGhlIGludGVycnVwdAorCQkgKiBJbiBBRU9JIG1vZGUgd2UganVzdCBoYXZlIHRvIG1hc2sgdGhlIGludGVycnVwdAogCQkgKiB3aGVuIGFja2luZy4KIAkJICovCi0JCWk4MjU5QV9pcnFfdHlwZS5hY2sgPSBkaXNhYmxlXzgyNTlBX2lycTsKKwkJaTgyNTlBX2NoaXAubWFza19hY2sgPSBkaXNhYmxlXzgyNTlBX2lycTsKIAllbHNlCi0JCWk4MjU5QV9pcnFfdHlwZS5hY2sgPSBtYXNrX2FuZF9hY2tfODI1OUE7CisJCWk4MjU5QV9jaGlwLm1hc2tfYWNrID0gbWFza19hbmRfYWNrXzgyNTlBOwogCiAJdWRlbGF5KDEwMCk7CQkvKiB3YWl0IGZvciA4MjU5QSB0byBpbml0aWFsaXplICovCiAKLQlvdXRiKGNhY2hlZF8yMSwgMHgyMSk7CS8qIHJlc3RvcmUgbWFzdGVyIElSUSBtYXNrICovCi0Jb3V0YihjYWNoZWRfQTEsIDB4QTEpOwkvKiByZXN0b3JlIHNsYXZlIElSUSBtYXNrICovCisJb3V0YihjYWNoZWRfbWFzdGVyX21hc2ssIFBJQ19NQVNURVJfSU1SKTsgLyogcmVzdG9yZSBtYXN0ZXIgSVJRIG1hc2sgKi8KKwlvdXRiKGNhY2hlZF9zbGF2ZV9tYXNrLCBQSUNfU0xBVkVfSU1SKTsJICAvKiByZXN0b3JlIHNsYXZlIElSUSBtYXNrICovCiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOwogfQpAQCAtMzAyLDExICsyOTUsMTcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGljMV9pb19yZXNvdXJjZSA9IHsKLQkubmFtZSA9ICJwaWMxIiwgLnN0YXJ0ID0gMHgyMCwgLmVuZCA9IDB4MjEsIC5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWQorCS5uYW1lID0gInBpYzEiLAorCS5zdGFydCA9IFBJQ19NQVNURVJfQ01ELAorCS5lbmQgPSBQSUNfTUFTVEVSX0lNUiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0JVU1kKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGljMl9pb19yZXNvdXJjZSA9IHsKLQkubmFtZSA9ICJwaWMyIiwgLnN0YXJ0ID0gMHhhMCwgLmVuZCA9IDB4YTEsIC5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWQorCS5uYW1lID0gInBpYzIiLAorCS5zdGFydCA9IFBJQ19TTEFWRV9DTUQsCisJLmVuZCA9IFBJQ19TTEFWRV9JTVIsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZCiB9OwogCiAvKgpAQCAtMzIzLDEyICszMjIsOCBAQAogCiAJaW5pdF84MjU5QSgwKTsKIAotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gTlVMTDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmk4MjU5QV9pcnFfdHlwZTsKLQl9CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmaTgyNTlBX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOwogCi0Jc2V0dXBfaXJxKDIsICZpcnEyKTsKKwlzZXR1cF9pcnEoUElDX0NBU0NBREVfSVIsICZpcnEyKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJpeGVsZi5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4ZWxmLmMKaW5kZXggYWIxMmM4Zi4uMzdjYWQ1ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcml4ZWxmLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4ZWxmLmMKQEAgLTUyLDEwICs1Miw2IEBACiAJaXJpeF9jb3JlX2R1bXAsIFBBR0VfU0laRQogfTsKIAotI2lmbmRlZiBlbGZfYWRkcl90Ci0jZGVmaW5lIGVsZl9hZGRyX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KICNpZmRlZiBERUJVRwogLyogRGVidWdnaW5nIHJvdXRpbmVzLiAqLwogc3RhdGljIGNoYXIgKmdldF9lbGZfcF90eXBlKEVsZjMyX1dvcmQgcF90eXBlKQpAQCAtMTAxMyw3ICsxMDA5LDcgQEAKIAlpbnQgc3o7CiAKIAlzeiA9IHNpemVvZihzdHJ1Y3QgZWxmX25vdGUpOwotCXN6ICs9IHJvdW5kdXAoc3RybGVuKGVuLT5uYW1lKSwgNCk7CisJc3ogKz0gcm91bmR1cChzdHJsZW4oZW4tPm5hbWUpICsgMSwgNCk7CiAJc3ogKz0gcm91bmR1cChlbi0+ZGF0YXN6LCA0KTsKIAogCXJldHVybiBzejsKQEAgLTEwMzIsNyArMTAyOCw3IEBACiB7CiAJc3RydWN0IGVsZl9ub3RlIGVuOwogCi0JZW4ubl9uYW1lc3ogPSBzdHJsZW4obWVuLT5uYW1lKTsKKwllbi5uX25hbWVzeiA9IHN0cmxlbihtZW4tPm5hbWUpICsgMTsKIAllbi5uX2Rlc2NzeiA9IG1lbi0+ZGF0YXN6OwogCWVuLm5fdHlwZSA9IG1lbi0+dHlwZTsKIApAQCAtMTE0OSw3ICsxMTQ1LDcgQEAKIAlwc2luZm8ucHJfcGlkID0gcHJzdGF0dXMucHJfcGlkID0gY3VycmVudC0+cGlkOwogCXBzaW5mby5wcl9wcGlkID0gcHJzdGF0dXMucHJfcHBpZCA9IGN1cnJlbnQtPnBhcmVudC0+cGlkOwogCXBzaW5mby5wcl9wZ3JwID0gcHJzdGF0dXMucHJfcGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7Ci0JcHNpbmZvLnByX3NpZCA9IHByc3RhdHVzLnByX3NpZCA9IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbjsKKwlwc2luZm8ucHJfc2lkID0gcHJzdGF0dXMucHJfc2lkID0gcHJvY2Vzc19zZXNzaW9uKGN1cnJlbnQpOwogCWlmIChjdXJyZW50LT5waWQgPT0gY3VycmVudC0+dGdpZCkgewogCQkvKgogCQkgKiBUaGlzIGlzIHRoZSByZWNvcmQgZm9yIHRoZSBncm91cCBsZWFkZXIuICBBZGQgaW4gdGhlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lycS1tc2MwMS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXNjMDEuYwppbmRleCA2NTBhODBjLi5iY2FhZDY2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS1tc2MwMS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW1zYzAxLmMKQEAgLTQ1LDMxICs0NSw2IEBACiB9CiAKIC8qCi0gKiBFbmFibGVzIHRoZSBJUlEgb24gU09DLWl0Ci0gKi8KLXN0YXRpYyB2b2lkIGVuYWJsZV9tc2NfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5tYXNrX21zY19pcnEoaXJxKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIElSUSBvbiBTT0MtaXQKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX21zY19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bm1hc2tfbXNjX2lycShpcnEpOwotCXJldHVybiAwOwotfQotCi0vKgotICogRGlzYWJsZXMgdGhlIElSUSBvbiBTT0MtaXQKLSAqLwotc3RhdGljIHZvaWQgZGlzYWJsZV9tc2NfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbWFza19tc2NfaXJxKGlycSk7Ci19Ci0KLS8qCiAgKiBNYXNrcyBhbmQgQUNLcyBhbiBJUlEKICAqLwogc3RhdGljIHZvaWQgbGV2ZWxfbWFza19hbmRfYWNrX21zY19pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTEzNiwyNSArMTExLDIzIEBACiAJCSAgICAoaXJxPDxNU0MwMV9JQ19SQU1XX0FERFJfU0hGKSB8IChzZXQ8PE1TQzAxX0lDX1JBTVdfREFUQV9TSEYpKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9tc2NfaXJxCWRpc2FibGVfbXNjX2lycQotCiBzdHJ1Y3QgaXJxX2NoaXAgbXNjX2xldmVsaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIlNPQy1pdC1MZXZlbCIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX21zY19pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fbXNjX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX21zY19pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX21zY19pcnEsCiAJLmFjayA9IGxldmVsX21hc2tfYW5kX2Fja19tc2NfaXJxLAorCS5tYXNrID0gbWFza19tc2NfaXJxLAorCS5tYXNrX2FjayA9IGxldmVsX21hc2tfYW5kX2Fja19tc2NfaXJxLAorCS51bm1hc2sgPSB1bm1hc2tfbXNjX2lycSwKKwkuZW9pID0gdW5tYXNrX21zY19pcnEsCiAJLmVuZCA9IGVuZF9tc2NfaXJxLAogfTsKIAogc3RydWN0IGlycV9jaGlwIG1zY19lZGdlaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIlNPQy1pdC1FZGdlIiwKLQkuc3RhcnR1cCA9c3RhcnR1cF9tc2NfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX21zY19pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9tc2NfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9tc2NfaXJxLAogCS5hY2sgPSBlZGdlX21hc2tfYW5kX2Fja19tc2NfaXJxLAorCS5tYXNrID0gbWFza19tc2NfaXJxLAorCS5tYXNrX2FjayA9IGVkZ2VfbWFza19hbmRfYWNrX21zY19pcnEsCisJLnVubWFzayA9IHVubWFza19tc2NfaXJxLAorCS5lb2kgPSB1bm1hc2tfbXNjX2lycSwKIAkuZW5kID0gZW5kX21zY19pcnEsCiB9OwogCkBAIC0xNzUsMTQgKzE0OCwxNCBAQAogCiAJCXN3aXRjaCAoaW1wLT5pbV90eXBlKSB7CiAJCWNhc2UgTVNDMDFfSVJRX0VER0U6Ci0JCQlpcnFfZGVzY1tiYXNlK25dLmNoaXAgPSAmbXNjX2VkZ2VpcnFfdHlwZTsKKwkJCXNldF9pcnFfY2hpcChiYXNlK24sICZtc2NfZWRnZWlycV90eXBlKTsKIAkJCWlmIChjcHVfaGFzX3ZlaWMpCiAJCQkJTVNDSUNfV1JJVEUoTVNDMDFfSUNfU1VQK24qOCwgTVNDMDFfSUNfU1VQX0VER0VfQklUKTsKIAkJCWVsc2UKIAkJCQlNU0NJQ19XUklURShNU0MwMV9JQ19TVVArbio4LCBNU0MwMV9JQ19TVVBfRURHRV9CSVQgfCBpbXAtPmltX2x2bCk7CiAJCQlicmVhazsKIAkJY2FzZSBNU0MwMV9JUlFfTEVWRUw6Ci0JCQlpcnFfZGVzY1tiYXNlK25dLmNoaXAgPSAmbXNjX2xldmVsaXJxX3R5cGU7CisJCQlzZXRfaXJxX2NoaXAoYmFzZStuLCAmbXNjX2xldmVsaXJxX3R5cGUpOwogCQkJaWYgKGNwdV9oYXNfdmVpYykKIAkJCQlNU0NJQ19XUklURShNU0MwMV9JQ19TVVArbio4LCAwKTsKIAkJCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW12NjQzNHguYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW12NjQzNHguYwppbmRleCAzN2QxMDYyLi5lZmJkMjE5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS1tdjY0MzR4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXY2NDM0eC5jCkBAIC02Nyw0OCArNjcsNiBAQAogfQogCiAvKgotICogRW5hYmxlcyB0aGUgSVJRIG9uIE1hcnZlbGwgQ2hpcAotICovCi1zdGF0aWMgdm9pZCBlbmFibGVfbXY2NDM0MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bm1hc2tfbXY2NDM0MF9pcnEoaXJxKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIElSUSBvbiBNYXJ2ZWxsIENoaXAKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX212NjQzNDBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5tYXNrX212NjQzNDBfaXJxKGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEaXNhYmxlcyB0aGUgSVJRIG9uIE1hcnZlbGwgQ2hpcAotICovCi1zdGF0aWMgdm9pZCBkaXNhYmxlX212NjQzNDBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbWFza19tdjY0MzQwX2lycShpcnEpOwotfQotCi0vKgotICogTWFza3MgYW5kIEFDS3MgYW4gSVJRCi0gKi8KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19tdjY0MzQwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCW1hc2tfbXY2NDM0MF9pcnEoaXJxKTsKLX0KLQotLyoKLSAqIEVuZCBJUlEgcHJvY2Vzc2luZwotICovCi1zdGF0aWMgdm9pZCBlbmRfbXY2NDM0MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLQkJdW5tYXNrX212NjQzNDBfaXJxKGlycSk7Ci19Ci0KLS8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgaW50ZXJydXB0cyBjb21pbmcgZnJvbSB0aGUgTWFydmVsbCBjaGlwLgogICogSXQgY291bGQgYmUgYnVpbHQgaW4gZXRoZXJuZXQgcG9ydHMgZXRjLi4uCiAgKi8KQEAgLTEzMywyOSArOTEsMjEgQEAKIAkJZG9fSVJRKGxzMWJpdDMyKGlycV9zcmNfaGlnaCkgKyBpcnFfYmFzZSArIDMyKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9tdjY0MzQwX2lycQlkaXNhYmxlX212NjQzNDBfaXJxCi0KIHN0cnVjdCBpcnFfY2hpcCBtdjY0MzQwX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJNVi02NDM0MCIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX212NjQzNDBfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX212NjQzNDBfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfbXY2NDM0MF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX212NjQzNDBfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfbXY2NDM0MF9pcnEsCi0JLmVuZCA9IGVuZF9tdjY0MzQwX2lycSwKKwkuYWNrID0gbWFza19tdjY0MzQwX2lycSwKKwkubWFzayA9IG1hc2tfbXY2NDM0MF9pcnEsCisJLm1hc2tfYWNrID0gbWFza19tdjY0MzQwX2lycSwKKwkudW5tYXNrID0gdW5tYXNrX212NjQzNDBfaXJxLAogfTsKIAogdm9pZCBfX2luaXQgbXY2NDM0MF9pcnFfaW5pdCh1bnNpZ25lZCBpbnQgYmFzZSkKIHsKIAlpbnQgaTsKIAotCS8qIFJlc2V0IGlycSBoYW5kbGVycyBwb2ludGVycyB0byBOVUxMICovCi0JZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyA2NDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAyOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJm12NjQzNDBfaXJxX3R5cGU7Ci0JfQorCWZvciAoaSA9IGJhc2U7IGkgPCBiYXNlICsgNjQ7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZtdjY0MzQwX2lycV90eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlpcnFfYmFzZSA9IGJhc2U7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lycS1ybTcwMDAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLXJtNzAwMC5jCmluZGV4IDZiNTRjNzEuLjEyMzMyNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLXJtNzAwMC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLXJtNzAwMC5jCkBAIC0yOSw1NiArMjksMTIgQEAKIAljbGVhcl9jMF9pbnRjb250cm9sKDB4MTAwIDw8IChpcnEgLSBpcnFfYmFzZSkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcm03a19jcHVfaXJxX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdW5tYXNrX3JtN2tfaXJxKGlycSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBybTdrX2NwdV9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JbWFza19ybTdrX2lycShpcnEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBybTdrX2NwdV9pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXJtN2tfY3B1X2lycV9lbmFibGUoaXJxKTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lCXJtN2tfY3B1X2lycV9zaHV0ZG93bglybTdrX2NwdV9pcnFfZGlzYWJsZQotCi0vKgotICogV2hpbGUgd2UgYWNrIHRoZSBpbnRlcnJ1cHQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZAotICogdG8gZGVhbCB3aXRoIGNvbmN1cnJlbmN5IGlzc3Vlcy4gIFNhbWUgZm9yIHJtN2tfY3B1X2lycV9lbmQuCi0gKi8KLXN0YXRpYyB2b2lkIHJtN2tfY3B1X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQltYXNrX3JtN2tfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJtN2tfY3B1X2lycV9lbmQodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQotCQl1bm1hc2tfcm03a19pcnEoaXJxKTsKLX0KLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBybTdrX2lycV9jb250cm9sbGVyID0gewogCS50eXBlbmFtZSA9ICJSTTcwMDAiLAotCS5zdGFydHVwID0gcm03a19jcHVfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gcm03a19jcHVfaXJxX3NodXRkb3duLAotCS5lbmFibGUgPSBybTdrX2NwdV9pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gcm03a19jcHVfaXJxX2Rpc2FibGUsCi0JLmFjayA9IHJtN2tfY3B1X2lycV9hY2ssCi0JLmVuZCA9IHJtN2tfY3B1X2lycV9lbmQsCisJLmFjayA9IG1hc2tfcm03a19pcnEsCisJLm1hc2sgPSBtYXNrX3JtN2tfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfcm03a19pcnEsCisJLnVubWFzayA9IHVubWFza19ybTdrX2lycSwKIH07CiAKIHZvaWQgX19pbml0IHJtN2tfY3B1X2lycV9pbml0KGludCBiYXNlKQpAQCAtODcsMTIgKzQzLDkgQEAKIAogCWNsZWFyX2MwX2ludGNvbnRyb2woMHgwMDAwMGYwMCk7CQkvKiBNYXNrIGFsbCAqLwogCi0JZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyA0OyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmcm03a19pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyA0OyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmcm03a19pcnFfY29udHJvbGxlciwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJaXJxX2Jhc2UgPSBiYXNlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtcm05MDAwLmMgYi9hcmNoL21pcHMva2VybmVsL2lycS1ybTkwMDAuYwppbmRleCA2MmYwMTFiLi4wZTZmNGM1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS1ybTkwMDAuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS1ybTkwMDAuYwpAQCAtNDgsMTUgKzQ4LDYgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcm05a19jcHVfaXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlybTlrX2NwdV9pcnFfZW5hYmxlKGlycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZQlybTlrX2NwdV9pcnFfc2h1dGRvd24Jcm05a19jcHVfaXJxX2Rpc2FibGUKLQogLyoKICAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgaW50ZXJydXB0cyBhcmUgZ2xvYmFsIG9uIGFsbCBwcm9jZXNzb3JzLgogICovCkBAIC04OSw0MCArODAsMjIgQEAKIAlvbl9lYWNoX2NwdShsb2NhbF9ybTlrX3BlcmZjb3VudGVyX2lycV9zaHV0ZG93biwgKHZvaWQgKikgaXJxLCAwLCAxKTsKIH0KIAotCi0vKgotICogV2hpbGUgd2UgYWNrIHRoZSBpbnRlcnJ1cHQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZAotICogdG8gZGVhbCB3aXRoIGNvbmN1cnJlbmN5IGlzc3Vlcy4gIFNhbWUgZm9yIHJtOWtfY3B1X2lycV9lbmQuCi0gKi8KLXN0YXRpYyB2b2lkIHJtOWtfY3B1X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQltYXNrX3JtOWtfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJtOWtfY3B1X2lycV9lbmQodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQotCQl1bm1hc2tfcm05a19pcnEoaXJxKTsKLX0KLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBybTlrX2lycV9jb250cm9sbGVyID0gewogCS50eXBlbmFtZSA9ICJSTTkwMDAiLAotCS5zdGFydHVwID0gcm05a19jcHVfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gcm05a19jcHVfaXJxX3NodXRkb3duLAotCS5lbmFibGUgPSBybTlrX2NwdV9pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gcm05a19jcHVfaXJxX2Rpc2FibGUsCi0JLmFjayA9IHJtOWtfY3B1X2lycV9hY2ssCi0JLmVuZCA9IHJtOWtfY3B1X2lycV9lbmQsCisJLmFjayA9IG1hc2tfcm05a19pcnEsCisJLm1hc2sgPSBtYXNrX3JtOWtfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfcm05a19pcnEsCisJLnVubWFzayA9IHVubWFza19ybTlrX2lycSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcm05a19wZXJmY291bnRlcl9pcnEgPSB7CiAJLnR5cGVuYW1lID0gIlJNOTAwMCIsCiAJLnN0YXJ0dXAgPSBybTlrX3BlcmZjb3VudGVyX2lycV9zdGFydHVwLAogCS5zaHV0ZG93biA9IHJtOWtfcGVyZmNvdW50ZXJfaXJxX3NodXRkb3duLAotCS5lbmFibGUgPSBybTlrX2NwdV9pcnFfZW5hYmxlLAotCS5kaXNhYmxlID0gcm05a19jcHVfaXJxX2Rpc2FibGUsCi0JLmFjayA9IHJtOWtfY3B1X2lycV9hY2ssCi0JLmVuZCA9IHJtOWtfY3B1X2lycV9lbmQsCisJLmFjayA9IG1hc2tfcm05a19pcnEsCisJLm1hc2sgPSBtYXNrX3JtOWtfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfcm05a19pcnEsCisJLnVubWFzayA9IHVubWFza19ybTlrX2lycSwKIH07CiAKIHVuc2lnbmVkIGludCBybTkwMDBfcGVyZmNvdW50X2lycTsKQEAgLTEzNSwxNSArMTA4LDEzIEBACiAKIAljbGVhcl9jMF9pbnRjb250cm9sKDB4MDAwMGYwMDApOwkJLyogTWFzayBhbGwgKi8KIAotCWZvciAoaSA9IGJhc2U7IGkgPCBiYXNlICsgNDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gTlVMTDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnJtOWtfaXJxX2NvbnRyb2xsZXI7Ci0JfQorCWZvciAoaSA9IGJhc2U7IGkgPCBiYXNlICsgNDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnJtOWtfaXJxX2NvbnRyb2xsZXIsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCXJtOTAwMF9wZXJmY291bnRfaXJxID0gYmFzZSArIDE7Ci0JaXJxX2Rlc2Nbcm05MDAwX3BlcmZjb3VudF9pcnFdLmNoaXAgPSAmcm05a19wZXJmY291bnRlcl9pcnE7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHJtOTAwMF9wZXJmY291bnRfaXJxLCAmcm05a19wZXJmY291bnRlcl9pcnEsCisJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJaXJxX2Jhc2UgPSBiYXNlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKaW5kZXggZGQyNDQzNC4uMmZlNGM4NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS5jCkBAIC0yNiw2ICsyNiw0OCBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcnFfbWFwW05SX0lSUVMgLyBCSVRTX1BFUl9MT05HXTsKKworaW50IF9fZGV2aW5pdCBhbGxvY2F0ZV9pcnFubyh2b2lkKQoreworCWludCBpcnE7CisKK2FnYWluOgorCWlycSA9IGZpbmRfZmlyc3RfemVyb19iaXQoaXJxX21hcCwgTlJfSVJRUyk7CisKKwlpZiAoaXJxID49IE5SX0lSUVMpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoaXJxLCBpcnFfbWFwKSkKKwkJZ290byBhZ2FpbjsKKworCXJldHVybiBpcnE7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGFsbG9jYXRlX2lycW5vKTsKKworLyoKKyAqIEFsbG9jYXRlIHRoZSAxNiBsZWdhY3kgaW50ZXJydXB0cyBmb3IgaTgyNTkgZGV2aWNlcy4gIFRoaXMgaGFwcGVucyBlYXJseQorICogaW4gdGhlIGtlcm5lbCBpbml0aWFsaXphdGlvbiBzbyB0cmVhdGluZyBhbGxvY2F0aW9uIGZhaWx1cmUgYXMgQlVHKCkgaXMKKyAqIG9rLgorICovCit2b2lkIF9faW5pdCBhbGxvY19sZWdhY3lfaXJxbm8odm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gMTY7IGkrKykKKwkJQlVHX09OKHRlc3RfYW5kX3NldF9iaXQoaSwgaXJxX21hcCkpOworfQorCit2b2lkIF9fZGV2aW5pdCBmcmVlX2lycW5vKHVuc2lnbmVkIGludCBpcnEpCit7CisJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7CisJY2xlYXJfYml0KGlycSwgaXJxX21hcCk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9pcnFubyk7CisKIC8qCiAgKiAnd2hhdCBzaG91bGQgd2UgZG8gaWYgd2UgZ2V0IGEgaHcgaXJxIGV2ZW50IG9uIGFuIGlsbGVnYWwgdmVjdG9yJy4KICAqIGVhY2ggYXJjaGl0ZWN0dXJlIGhhcyB0byBhbnN3ZXIgdGhpcyB0aGVtc2VsdmVzLgpAQCAtNDYsMjUgKzg4LDYgQEAKIHVuc2lnbmVkIGxvbmcgaXJxX2h3bWFza1tOUl9JUlFTXTsKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAKLSN1bmRlZiBkb19JUlEKLQotLyoKLSAqIGRvX0lSUSBoYW5kbGVzIGFsbCBub3JtYWwgZGV2aWNlIElSUSdzICh0aGUgc3BlY2lhbAotICogU01QIGNyb3NzLUNQVSBpbnRlcnJ1cHRzIGhhdmUgdGhlaXIgb3duIHNwZWNpZmljCi0gKiBoYW5kbGVycykuCi0gKi8KLWFzbWxpbmthZ2UgdW5zaWduZWQgaW50IGRvX0lSUSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlycV9lbnRlcigpOwotCi0JX19ET19JUlFfU01UQ19IT09LKCk7Ci0JX19kb19JUlEoaXJxKTsKLQotCWlycV9leGl0KCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQogLyoKICAqIEdlbmVyaWMsIGNvbnRyb2xsZXItaW5kZXBlbmRlbnQgZnVuY3Rpb25zOgogICovCkBAIC05NCw3ICsxMTcsNyBAQAogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKICNlbmRpZgotCQlzZXFfcHJpbnRmKHAsICIgJTE0cyIsIGlycV9kZXNjW2ldLmNoaXAtPnR5cGVuYW1lKTsKKwkJc2VxX3ByaW50ZihwLCAiICUxNHMiLCBpcnFfZGVzY1tpXS5jaGlwLT5uYW1lKTsKIAkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CiAKIAkJZm9yIChhY3Rpb249YWN0aW9uLT5uZXh0OyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKQEAgLTEzMCwxOSArMTUzLDYgQEAKIAogdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzICA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uICA9IE5VTEw7Ci0JCWlycV9kZXNjW2ldLmRlcHRoICAgPSAxOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJm5vX2lycV9jaGlwOwotCQlzcGluX2xvY2tfaW5pdCgmaXJxX2Rlc2NbaV0ubG9jayk7Ci0jaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotCQlpcnFfaHdtYXNrW2ldID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0JfQotCiAJYXJjaF9pbml0X2lycSgpOwogCiAjaWZkZWYgQ09ORklHX0tHREIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxX2NwdS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnFfY3B1LmMKaW5kZXggOWJiMjFjNy4uZmNjODZiOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcnFfY3B1LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcnFfY3B1LmMKQEAgLTUwLDU4ICs1MCwxMyBAQAogCWlycV9kaXNhYmxlX2hhemFyZCgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWlwc19jcHVfaXJxX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdW5tYXNrX21pcHNfaXJxKGlycSk7Ci0JYmFja190b19iYWNrX2MwX2hhemFyZCgpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbWlwc19jcHVfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCW1hc2tfbWlwc19pcnEoaXJxKTsKLQliYWNrX3RvX2JhY2tfYzBfaGF6YXJkKCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1pcHNfY3B1X2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JbWlwc19jcHVfaXJxX2VuYWJsZShpcnEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUJbWlwc19jcHVfaXJxX3NodXRkb3duCQltaXBzX2NwdV9pcnFfZGlzYWJsZQotCi0vKgotICogV2hpbGUgd2UgYWNrIHRoZSBpbnRlcnJ1cHQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIHRodXMgd2UgZG9uJ3QgbmVlZAotICogdG8gZGVhbCB3aXRoIGNvbmN1cnJlbmN5IGlzc3Vlcy4gIFNhbWUgZm9yIG1pcHNfY3B1X2lycV9lbmQuCi0gKi8KLXN0YXRpYyB2b2lkIG1pcHNfY3B1X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQltYXNrX21pcHNfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNfY3B1X2lycV9lbmQodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQotCQl1bm1hc2tfbWlwc19pcnEoaXJxKTsKLX0KLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtaXBzX2NwdV9pcnFfY29udHJvbGxlciA9IHsKIAkudHlwZW5hbWUJPSAiTUlQUyIsCi0JLnN0YXJ0dXAJPSBtaXBzX2NwdV9pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24JPSBtaXBzX2NwdV9pcnFfc2h1dGRvd24sCi0JLmVuYWJsZQkJPSBtaXBzX2NwdV9pcnFfZW5hYmxlLAotCS5kaXNhYmxlCT0gbWlwc19jcHVfaXJxX2Rpc2FibGUsCi0JLmFjawkJPSBtaXBzX2NwdV9pcnFfYWNrLAotCS5lbmQJCT0gbWlwc19jcHVfaXJxX2VuZCwKKwkuYWNrCQk9IG1hc2tfbWlwc19pcnEsCisJLm1hc2sJCT0gbWFza19taXBzX2lycSwKKwkubWFza19hY2sJPSBtYXNrX21pcHNfaXJxLAorCS51bm1hc2sJCT0gdW5tYXNrX21pcHNfaXJxLAorCS5lb2kJCT0gdW5tYXNrX21pcHNfaXJxLAogfTsKIAogLyoKQEAgLTExMCw4ICs2NSw2IEBACiAKICNkZWZpbmUgdW5tYXNrX21pcHNfbXRfaXJxCXVubWFza19taXBzX2lycQogI2RlZmluZSBtYXNrX21pcHNfbXRfaXJxCW1hc2tfbWlwc19pcnEKLSNkZWZpbmUgbWlwc19tdF9jcHVfaXJxX2VuYWJsZQltaXBzX2NwdV9pcnFfZW5hYmxlCi0jZGVmaW5lIG1pcHNfbXRfY3B1X2lycV9kaXNhYmxlCW1pcHNfY3B1X2lycV9kaXNhYmxlCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWlwc19tdF9jcHVfaXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTExOSwxMyArNzIsMTEgQEAKIAogCWNsZWFyX2MwX2NhdXNlKDB4MTAwIDw8IChpcnEgLSBtaXBzX2NwdV9pcnFfYmFzZSkpOwogCWV2cGUodnBmbGFncyk7Ci0JbWlwc19tdF9jcHVfaXJxX2VuYWJsZShpcnEpOworCXVubWFza19taXBzX210X2lycShpcnEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUJbWlwc19tdF9jcHVfaXJxX3NodXRkb3duCW1pcHNfbXRfY3B1X2lycV9kaXNhYmxlCi0KIC8qCiAgKiBXaGlsZSB3ZSBhY2sgdGhlIGludGVycnVwdCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgdGh1cyB3ZSBkb24ndCBuZWVkCiAgKiB0byBkZWFsIHdpdGggY29uY3VycmVuY3kgaXNzdWVzLiAgU2FtZSBmb3IgbWlwc19jcHVfaXJxX2VuZC4KQEAgLTEzOCwxNiArODksMTQgQEAKIAltYXNrX21pcHNfbXRfaXJxKGlycSk7CiB9CiAKLSNkZWZpbmUgbWlwc19tdF9jcHVfaXJxX2VuZCBtaXBzX2NwdV9pcnFfZW5kCi0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbWlwc19tdF9jcHVfaXJxX2NvbnRyb2xsZXIgPSB7CiAJLnR5cGVuYW1lCT0gIk1JUFMiLAogCS5zdGFydHVwCT0gbWlwc19tdF9jcHVfaXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duCT0gbWlwc19tdF9jcHVfaXJxX3NodXRkb3duLAotCS5lbmFibGUJCT0gbWlwc19tdF9jcHVfaXJxX2VuYWJsZSwKLQkuZGlzYWJsZQk9IG1pcHNfbXRfY3B1X2lycV9kaXNhYmxlLAogCS5hY2sJCT0gbWlwc19tdF9jcHVfaXJxX2FjaywKLQkuZW5kCQk9IG1pcHNfbXRfY3B1X2lycV9lbmQsCisJLm1hc2sJCT0gbWFza19taXBzX210X2lycSwKKwkubWFza19hY2sJPSBtaXBzX210X2NwdV9pcnFfYWNrLAorCS51bm1hc2sJCT0gdW5tYXNrX21pcHNfbXRfaXJxLAorCS5lb2kJCT0gdW5tYXNrX21pcHNfbXRfaXJxLAogfTsKIAogdm9pZCBfX2luaXQgbWlwc19jcHVfaXJxX2luaXQoaW50IGlycV9iYXNlKQpAQCAtMTYzLDE5ICsxMTIsMTIgQEAKIAkgKiBsZWF2ZSB0aGVtIHVuaW5pdGlhbGl6ZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCiAJICovCiAJaWYgKGNwdV9oYXNfbWlwc210KQotCQlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9iYXNlICsgMjsgaSsrKSB7Ci0JCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSBOVUxMOwotCQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOwotCQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZtaXBzX210X2NwdV9pcnFfY29udHJvbGxlcjsKLQkJfQorCQlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9iYXNlICsgMjsgaSsrKQorCQkJc2V0X2lycV9jaGlwKGksICZtaXBzX210X2NwdV9pcnFfY29udHJvbGxlcik7CiAKLQlmb3IgKGkgPSBpcnFfYmFzZSArIDI7IGkgPCBpcnFfYmFzZSArIDg7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IE5VTEw7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZtaXBzX2NwdV9pcnFfY29udHJvbGxlcjsKLQl9CisJZm9yIChpID0gaXJxX2Jhc2UgKyAyOyBpIDwgaXJxX2Jhc2UgKyA4OyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmbWlwc19jcHVfaXJxX2NvbnRyb2xsZXIsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCW1pcHNfY3B1X2lycV9iYXNlID0gaXJxX2Jhc2U7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2tzcGQuYyBiL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jCmluZGV4IGYwNmExNDQuLjU5MjlmODgzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2tzcGQuYworKysgYi9hcmNoL21pcHMva2VybmVsL2tzcGQuYwpAQCAtMzAxLDcgKzMwMSw3IEBACiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIHNldDsKIAkJaSA9IGogKiBfX05GREJJVFM7Ci0JCWlmIChpID49IGZkdC0+bWF4X2Zkc2V0IHx8IGkgPj0gZmR0LT5tYXhfZmRzKQorCQlpZiAoaSA+PSBmZHQtPm1heF9mZHMpCiAJCQlicmVhazsKIAkJc2V0ID0gZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbaisrXTsKIAkJd2hpbGUgKHNldCkgewpAQCAtMzE5LDcgKzMxOSw3IEBACiBzdGF0aWMgaW50IGNoYW5uZWxfb3BlbiA9IDA7CiAKIC8qIHRoZSB3b3JrIGhhbmRsZXIgKi8KLXN0YXRpYyB2b2lkIHNwX3dvcmsodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHNwX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp1bnVzZWQpCiB7CiAJaWYgKCFjaGFubmVsX29wZW4pIHsKIAkJaWYoIHJ0bHhfb3BlbihSVExYX0NIQU5ORUxfU1lTSU8sIDEpICE9IDApIHsKQEAgLTM1NCw3ICszNTQsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJSU5JVF9XT1JLKCZ3b3JrLCBzcF93b3JrLCBOVUxMKTsKKwkJSU5JVF9XT1JLKCZ3b3JrLCBzcF93b3JrKTsKIAkJcXVldWVfd29yayh3b3JrcXVldWUsICZ3b3JrKTsKIAl9IGVsc2UKIAkJcXVldWVfd29yayh3b3JrcXVldWUsICZ3b3JrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbGludXgzMi5jIGIvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKaW5kZXggNTNmNDE3MS4uYjA2MWM5YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMKQEAgLTM4Miw1MzEgKzM4Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IG1zZ2J1ZjMyIHsgczMyIG10eXBlOyBjaGFyIG10ZXh0WzFdOyB9OwotCi1zdHJ1Y3QgaXBjX3Blcm0zMgotewotCWtleV90ICAgIAkgIGtleTsKLSAgICAgICAgX19jb21wYXRfdWlkX3QgIHVpZDsKLSAgICAgICAgX19jb21wYXRfZ2lkX3QgIGdpZDsKLSAgICAgICAgX19jb21wYXRfdWlkX3QgIGN1aWQ7Ci0gICAgICAgIF9fY29tcGF0X2dpZF90ICBjZ2lkOwotICAgICAgICBjb21wYXRfbW9kZV90CW1vZGU7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICBzZXE7Ci19OwotCi1zdHJ1Y3QgaXBjNjRfcGVybTMyIHsKLQlrZXlfdCBrZXk7Ci0JX19jb21wYXRfdWlkX3QgdWlkOwotCV9fY29tcGF0X2dpZF90IGdpZDsKLQlfX2NvbXBhdF91aWRfdCBjdWlkOwotCV9fY29tcGF0X2dpZF90IGNnaWQ7Ci0JY29tcGF0X21vZGVfdAltb2RlOwotCXVuc2lnbmVkIHNob3J0CXNlcTsKLQl1bnNpZ25lZCBzaG9ydCBfX3BhZDE7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkMTsKLQl1bnNpZ25lZCBpbnQgX191bnVzZWQyOwotfTsKLQotc3RydWN0IHNlbWlkX2RzMzIgewotICAgICAgICBzdHJ1Y3QgaXBjX3Blcm0zMiBzZW1fcGVybTsgICAgICAgICAgICAgICAvKiBwZXJtaXNzaW9ucyAuLiBzZWUgaXBjLmggKi8KLSAgICAgICAgY29tcGF0X3RpbWVfdCAgIHNlbV9vdGltZTsgICAgICAgICAgICAgIC8qIGxhc3Qgc2Vtb3AgdGltZSAqLwotICAgICAgICBjb21wYXRfdGltZV90ICAgc2VtX2N0aW1lOyAgICAgICAgICAgICAgLyogbGFzdCBjaGFuZ2UgdGltZSAqLwotICAgICAgICB1MzIgc2VtX2Jhc2U7ICAgICAgICAgICAgICAvKiBwdHIgdG8gZmlyc3Qgc2VtYXBob3JlIGluIGFycmF5ICovCi0gICAgICAgIHUzMiBzZW1fcGVuZGluZzsgICAgICAgICAgLyogcGVuZGluZyBvcGVyYXRpb25zIHRvIGJlIHByb2Nlc3NlZCAqLwotICAgICAgICB1MzIgc2VtX3BlbmRpbmdfbGFzdDsgICAgLyogbGFzdCBwZW5kaW5nIG9wZXJhdGlvbiAqLwotICAgICAgICB1MzIgdW5kbzsgICAgICAgICAgICAgICAgICAvKiB1bmRvIHJlcXVlc3RzIG9uIHRoaXMgYXJyYXkgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgIHNlbV9uc2VtczsgICAgICAgICAgICAgIC8qIG5vLiBvZiBzZW1hcGhvcmVzIGluIGFycmF5ICovCi19OwotCi1zdHJ1Y3Qgc2VtaWQ2NF9kczMyIHsKLQlzdHJ1Y3QgaXBjNjRfcGVybTMyCXNlbV9wZXJtOwotCWNvbXBhdF90aW1lX3QJc2VtX290aW1lOwotCWNvbXBhdF90aW1lX3QJc2VtX2N0aW1lOwotCXVuc2lnbmVkIGludAkJc2VtX25zZW1zOwotCXVuc2lnbmVkIGludAkJX191bnVzZWQxOwotCXVuc2lnbmVkIGludAkJX191bnVzZWQyOwotfTsKLQotc3RydWN0IG1zcWlkX2RzMzIKLXsKLSAgICAgICAgc3RydWN0IGlwY19wZXJtMzIgbXNnX3Blcm07Ci0gICAgICAgIHUzMiBtc2dfZmlyc3Q7Ci0gICAgICAgIHUzMiBtc2dfbGFzdDsKLSAgICAgICAgY29tcGF0X3RpbWVfdCAgIG1zZ19zdGltZTsKLSAgICAgICAgY29tcGF0X3RpbWVfdCAgIG1zZ19ydGltZTsKLSAgICAgICAgY29tcGF0X3RpbWVfdCAgIG1zZ19jdGltZTsKLSAgICAgICAgdTMyIHd3YWl0OwotICAgICAgICB1MzIgcndhaXQ7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IG1zZ19jYnl0ZXM7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IG1zZ19xbnVtOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBtc2dfcWJ5dGVzOwotICAgICAgICBjb21wYXRfaXBjX3BpZF90IG1zZ19sc3BpZDsKLSAgICAgICAgY29tcGF0X2lwY19waWRfdCBtc2dfbHJwaWQ7Ci19OwotCi1zdHJ1Y3QgbXNxaWQ2NF9kczMyIHsKLQlzdHJ1Y3QgaXBjNjRfcGVybTMyIG1zZ19wZXJtOwotCWNvbXBhdF90aW1lX3QgbXNnX3N0aW1lOwotCXVuc2lnbmVkIGludCBfX3VudXNlZDE7Ci0JY29tcGF0X3RpbWVfdCBtc2dfcnRpbWU7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkMjsKLQljb21wYXRfdGltZV90IG1zZ19jdGltZTsKLQl1bnNpZ25lZCBpbnQgX191bnVzZWQzOwotCXVuc2lnbmVkIGludCBtc2dfY2J5dGVzOwotCXVuc2lnbmVkIGludCBtc2dfcW51bTsKLQl1bnNpZ25lZCBpbnQgbXNnX3FieXRlczsKLQljb21wYXRfcGlkX3QgbXNnX2xzcGlkOwotCWNvbXBhdF9waWRfdCBtc2dfbHJwaWQ7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkNDsKLQl1bnNpZ25lZCBpbnQgX191bnVzZWQ1OwotfTsKLQotc3RydWN0IHNobWlkX2RzMzIgewotICAgICAgICBzdHJ1Y3QgaXBjX3Blcm0zMiAgICAgICBzaG1fcGVybTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2htX3NlZ3N6OwotICAgICAgICBjb21wYXRfdGltZV90CQlzaG1fYXRpbWU7Ci0gICAgICAgIGNvbXBhdF90aW1lX3QJCXNobV9kdGltZTsKLSAgICAgICAgY29tcGF0X3RpbWVfdAkJc2htX2N0aW1lOwotICAgICAgICBjb21wYXRfaXBjX3BpZF90ICAgIHNobV9jcGlkOwotICAgICAgICBjb21wYXRfaXBjX3BpZF90ICAgIHNobV9scGlkOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBzaG1fbmF0dGNoOwotfTsKLQotc3RydWN0IHNobWlkNjRfZHMzMiB7Ci0Jc3RydWN0IGlwYzY0X3Blcm0zMglzaG1fcGVybTsKLQljb21wYXRfc2l6ZV90CQlzaG1fc2Vnc3o7Ci0JY29tcGF0X3RpbWVfdAkJc2htX2F0aW1lOwotCWNvbXBhdF90aW1lX3QJCXNobV9kdGltZTsKLQljb21wYXRfdGltZV90IHNobV9jdGltZTsKLQljb21wYXRfcGlkX3Qgc2htX2NwaWQ7Ci0JY29tcGF0X3BpZF90IHNobV9scGlkOwotCXVuc2lnbmVkIGludCBzaG1fbmF0dGNoOwotCXVuc2lnbmVkIGludCBfX3VudXNlZDE7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkMjsKLX07Ci0KLXN0cnVjdCBpcGNfa2x1ZGdlMzIgewotCXUzMiBtc2dwOwotCXMzMiBtc2d0eXA7Ci19OwotCi1zdGF0aWMgaW50Ci1kb19zeXMzMl9zZW1jdGwoaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgdGhpcmQsIHZvaWQgX191c2VyICp1cHRyKQotewotCXVuaW9uIHNlbXVuIGZvdXJ0aDsKLQl1MzIgcGFkOwotCWludCBlcnIsIGVycjI7Ci0Jc3RydWN0IHNlbWlkNjRfZHMgczsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOwotCi0JaWYgKCF1cHRyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllcnIgPSAtRUZBVUxUOwotCWlmIChnZXRfdXNlciAocGFkLCAodTMyIF9fdXNlciAqKXVwdHIpKQotCQlyZXR1cm4gZXJyOwotCWlmICgodGhpcmQgJiB+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+dHZfbnNlYykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIHN5c19zZW10aW1lZG9wKHNlbWlkLCB0c2VtcywgbnNlbXMsIHQ2NCk7Ci19Ci0KIGFzbWxpbmthZ2UgbG9uZwogc3lzMzJfaXBjICh1MzIgY2FsbCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgdGhpcmQsIHUzMiBwdHIsIHUzMiBmaWZ0aCkKIHsKQEAgLTkxOCw0OCArMzkzLDQzIEBACiAJc3dpdGNoIChjYWxsKSB7CiAJY2FzZSBTRU1PUDoKIAkJLyogc3RydWN0IHNlbWJ1ZiBpcyB0aGUgc2FtZSBvbiAzMiBhbmQgNjRiaXQgOikpICovCi0JCWVyciA9IHN5c19zZW10aW1lZG9wIChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopQUEocHRyKSwgc2Vjb25kLAotCQkgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJCWVyciA9IHN5c19zZW10aW1lZG9wKGZpcnN0LCBjb21wYXRfcHRyKHB0ciksIHNlY29uZCwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgU0VNVElNRURPUDoKLQkJZXJyID0gc3lzMzJfc2VtdGltZWRvcCAoZmlyc3QsIChzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqKUFBKHB0ciksIHNlY29uZCwKLQkJICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqKUFBKGZpZnRoKSk7CisJCWVyciA9IGNvbXBhdF9zeXNfc2VtdGltZWRvcChmaXJzdCwgY29tcGF0X3B0cihwdHIpLCBzZWNvbmQsCisJCQkJCSAgICBjb21wYXRfcHRyKGZpZnRoKSk7CiAJCWJyZWFrOwogCWNhc2UgU0VNR0VUOgotCQllcnIgPSBzeXNfc2VtZ2V0IChmaXJzdCwgc2Vjb25kLCB0aGlyZCk7CisJCWVyciA9IHN5c19zZW1nZXQoZmlyc3QsIHNlY29uZCwgdGhpcmQpOwogCQlicmVhazsKIAljYXNlIFNFTUNUTDoKLQkJZXJyID0gZG9fc3lzMzJfc2VtY3RsIChmaXJzdCwgc2Vjb25kLCB0aGlyZCwKLQkJCQkgICAgICAgKHZvaWQgX191c2VyICopQUEocHRyKSk7CisJCWVyciA9IGNvbXBhdF9zeXNfc2VtY3RsKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBjb21wYXRfcHRyKHB0cikpOwogCQlicmVhazsKLQogCWNhc2UgTVNHU05EOgotCQllcnIgPSBkb19zeXMzMl9tc2dzbmQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkLAotCQkJCSAgICAgICAodm9pZCBfX3VzZXIgKilBQShwdHIpKTsKKwkJZXJyID0gY29tcGF0X3N5c19tc2dzbmQoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGNvbXBhdF9wdHIocHRyKSk7CiAJCWJyZWFrOwogCWNhc2UgTVNHUkNWOgotCQllcnIgPSBkb19zeXMzMl9tc2dyY3YgKGZpcnN0LCBzZWNvbmQsIGZpZnRoLCB0aGlyZCwKLQkJCQkgICAgICAgdmVyc2lvbiwgKHZvaWQgX191c2VyICopQUEocHRyKSk7CisJCWVyciA9IGNvbXBhdF9zeXNfbXNncmN2KGZpcnN0LCBzZWNvbmQsIGZpZnRoLCB0aGlyZCwKKwkJCQkJdmVyc2lvbiwgY29tcGF0X3B0cihwdHIpKTsKIAkJYnJlYWs7CiAJY2FzZSBNU0dHRVQ6Ci0JCWVyciA9IHN5c19tc2dnZXQgKChrZXlfdCkgZmlyc3QsIHNlY29uZCk7CisJCWVyciA9IHN5c19tc2dnZXQoKGtleV90KSBmaXJzdCwgc2Vjb25kKTsKIAkJYnJlYWs7CiAJY2FzZSBNU0dDVEw6Ci0JCWVyciA9IGRvX3N5czMyX21zZ2N0bCAoZmlyc3QsIHNlY29uZCwgKHZvaWQgX191c2VyICopQUEocHRyKSk7CisJCWVyciA9IGNvbXBhdF9zeXNfbXNnY3RsKGZpcnN0LCBzZWNvbmQsIGNvbXBhdF9wdHIocHRyKSk7CiAJCWJyZWFrOwotCiAJY2FzZSBTSE1BVDoKLQkJZXJyID0gZG9fc3lzMzJfc2htYXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkLAotCQkJCSAgICAgIHZlcnNpb24sICh2b2lkIF9fdXNlciAqKUFBKHB0cikpOworCQllcnIgPSBjb21wYXRfc3lzX3NobWF0KGZpcnN0LCBzZWNvbmQsIHRoaXJkLCB2ZXJzaW9uLAorCQkJCSAgICAgICBjb21wYXRfcHRyKHB0cikpOwogCQlicmVhazsKIAljYXNlIFNITURUOgotCQllcnIgPSBzeXNfc2htZHQgKChjaGFyIF9fdXNlciAqKUEocHRyKSk7CisJCWVyciA9IHN5c19zaG1kdChjb21wYXRfcHRyKHB0cikpOwogCQlicmVhazsKIAljYXNlIFNITUdFVDoKLQkJZXJyID0gc3lzX3NobWdldCAoZmlyc3QsICh1bnNpZ25lZClzZWNvbmQsIHRoaXJkKTsKKwkJZXJyID0gc3lzX3NobWdldChmaXJzdCwgKHVuc2lnbmVkKXNlY29uZCwgdGhpcmQpOwogCQlicmVhazsKIAljYXNlIFNITUNUTDoKLQkJZXJyID0gZG9fc3lzMzJfc2htY3RsIChmaXJzdCwgc2Vjb25kLCAodm9pZCBfX3VzZXIgKilBQShwdHIpKTsKKwkJZXJyID0gY29tcGF0X3N5c19zaG1jdGwoZmlyc3QsIHNlY29uZCwgY29tcGF0X3B0cihwdHIpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTk2OSwxOCArNDM5LDE2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5czMyX3NobWF0KGludCBzaG1pZCwgY2hhciBfX3VzZXIgKnNobWFkZHIsCi0JCQkgIGludCBzaG1mbGcsIGludDMyX3QgX191c2VyICphZGRyKQorI2lmZGVmIENPTkZJR19NSVBTMzJfTjMyCithc21saW5rYWdlIGxvbmcgc3lzbjMyX3NlbWN0bChpbnQgc2VtaWQsIGludCBzZW1udW0sIGludCBjbWQsIHVuaW9uIHNlbXVuIGFyZykKIHsKLQl1bnNpZ25lZCBsb25nIHJhZGRyOwotCWludCBlcnI7Ci0KLQllcnIgPSBkb19zaG1hdChzaG1pZCwgc2htYWRkciwgc2htZmxnLCAmcmFkZHIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gcHV0X3VzZXIocmFkZHIsIGFkZHIpOworCS8qIGNvbXBhdF9zeXNfc2VtY3RsIGV4cGVjdHMgYSBwb2ludGVyIHRvIHVuaW9uIHNlbXVuICovCisJdTMyIF9fdXNlciAqdXB0ciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZih1MzIpKTsKKwlpZiAocHV0X3VzZXIocHRyX3RvX2NvbXBhdChhcmcuX19wYWQpLCB1cHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGNvbXBhdF9zeXNfc2VtY3RsKHNlbWlkLCBzZW1udW0sIGNtZCwgdXB0cik7CiB9CisjZW5kaWYKIAogc3RydWN0IHN5c2N0bF9hcmdzMzIKIHsKQEAgLTEwNTUsNyArNTIzLDkgQEAKIGFzbWxpbmthZ2UgaW50IHN5czMyX3BlcnNvbmFsaXR5KHVuc2lnbmVkIGxvbmcgcGVyc29uYWxpdHkpCiB7CiAJaW50IHJldDsKLQlpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgPT0gUEVSX0xJTlVYMzIgJiYgcGVyc29uYWxpdHkgPT0gUEVSX0xJTlVYKQorCXBlcnNvbmFsaXR5ICY9IDB4ZmZmZmZmZmY7CisJaWYgKHBlcnNvbmFsaXR5KGN1cnJlbnQtPnBlcnNvbmFsaXR5KSA9PSBQRVJfTElOVVgzMiAmJgorCSAgICBwZXJzb25hbGl0eSA9PSBQRVJfTElOVVgpCiAJCXBlcnNvbmFsaXR5ID0gUEVSX0xJTlVYMzI7CiAJcmV0ID0gc3lzX3BlcnNvbmFsaXR5KHBlcnNvbmFsaXR5KTsKIAlpZiAocmV0ID09IFBFUl9MSU5VWDMyKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL21pcHMva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGFkNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIG1hY2hpbmVfa2V4ZWMuYyBmb3Iga2V4ZWMKKyAqIENyZWF0ZWQgYnkgPG5zY2hpY2hhbkBjb3JwLmZyZWUuZnI+IG9uIFRodSBPY3QgMTIgMTU6MTU6MDYgMjAwNgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBrZXhlY19zdGFydF9hZGRyZXNzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcga2V4ZWNfaW5kaXJlY3Rpb25fcGFnZTsKKworaW50CittYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqa2ltYWdlKQoreworCXJldHVybiAwOworfQorCit2b2lkCittYWNoaW5lX2tleGVjX2NsZWFudXAoc3RydWN0IGtpbWFnZSAqa2ltYWdlKQoreworfQorCit2b2lkCittYWNoaW5lX3NodXRkb3duKHZvaWQpCit7Cit9CisKK3ZvaWQKK21hY2hpbmVfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7Cit9CisKK3ZvaWQKK21hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJdW5zaWduZWQgbG9uZyByZWJvb3RfY29kZV9idWZmZXI7CisJdW5zaWduZWQgbG9uZyBlbnRyeTsKKwl1bnNpZ25lZCBsb25nICpwdHI7CisKKwlyZWJvb3RfY29kZV9idWZmZXIgPQorCSAgKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSk7CisKKwlrZXhlY19zdGFydF9hZGRyZXNzID0gaW1hZ2UtPnN0YXJ0OworCWtleGVjX2luZGlyZWN0aW9uX3BhZ2UgPSBwaHlzX3RvX3ZpcnQoaW1hZ2UtPmhlYWQgJiBQQUdFX01BU0spOworCisJbWVtY3B5KCh2b2lkKilyZWJvb3RfY29kZV9idWZmZXIsIHJlbG9jYXRlX25ld19rZXJuZWwsCisJICAgICAgIHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZSk7CisKKwkvKgorCSAqIFRoZSBnZW5lcmljIGtleGVjIGNvZGUgYnVpbGRzIGEgcGFnZSBsaXN0IHdpdGggcGh5c2ljYWwKKwkgKiBhZGRyZXNzZXMuIHRoZXkgYXJlIGRpcmVjdGx5IGFjY2Vzc2libGUgdGhyb3VnaCBLU0VHMCAob3IKKwkgKiBDS1NFRzAgb3IgWFBIWVMgaWYgb24gNjRiaXQgc3lzdGVtKSwgaGVuY2UgdGhlCisJICogcHlzX3RvX3ZpcnQoKSBjYWxsLgorCSAqLworCWZvciAocHRyID0gJmltYWdlLT5oZWFkOyAoZW50cnkgPSAqcHRyKSAmJiAhKGVudHJ5ICZJTkRfRE9ORSk7CisJICAgICBwdHIgPSAoZW50cnkgJiBJTkRfSU5ESVJFQ1RJT04pID8KKwkgICAgICAgcGh5c190b192aXJ0KGVudHJ5ICYgUEFHRV9NQVNLKSA6IHB0ciArIDEpIHsKKwkJaWYgKCpwdHIgJiBJTkRfU09VUkNFIHx8ICpwdHIgJiBJTkRfSU5ESVJFQ1RJT04gfHwKKwkJICAgICpwdHIgJiBJTkRfREVTVElOQVRJT04pCisJCQkqcHRyID0gcGh5c190b192aXJ0KCpwdHIpOworCX0KKworCS8qCisJICogd2UgZG8gbm90IHdhbnQgdG8gYmUgYm90aGVyZWQuCisJICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCWZsdXNoX2ljYWNoZV9yYW5nZShyZWJvb3RfY29kZV9idWZmZXIsCisJCQkgICByZWJvb3RfY29kZV9idWZmZXIgKyBLRVhFQ19DT05UUk9MX0NPREVfU0laRSk7CisKKwlwcmludGsoIldpbGwgY2FsbCBuZXcga2VybmVsIGF0ICUwOHhcbiIsIGltYWdlLT5zdGFydCk7CisJcHJpbnRrKCJCeWUgLi4uXG4iKTsKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKwkoKHZvaWQgKCopKHZvaWQpKXJlYm9vdF9jb2RlX2J1ZmZlcikoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL21pcHMva2VybmVsL21vZHVsZS5jCmluZGV4IGQ3YmYwMjEuLmNiMDgwMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4JLyogTU9EVUxFX1NUQVJUICovCiAKIHN0cnVjdCBtaXBzX2hpMTYgewogCXN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7CkBAIC00Myw5ICs0NCwyMyBAQAogCiB2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQogeworI2lmZGVmIE1PRFVMRV9TVEFSVAorCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlpZiAoIXNpemUpCisJCXJldHVybiBOVUxMOworCisJYXJlYSA9IF9fZ2V0X3ZtX2FyZWEoc2l6ZSwgVk1fQUxMT0MsIE1PRFVMRV9TVEFSVCwgTU9EVUxFX0VORCk7CisJaWYgKCFhcmVhKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBfX3ZtYWxsb2NfYXJlYShhcmVhLCBHRlBfS0VSTkVMLCBQQUdFX0tFUk5FTCk7CisjZWxzZQogCWlmIChzaXplID09IDApCiAJCXJldHVybiBOVUxMOwogCXJldHVybiB2bWFsbG9jKHNpemUpOworI2VuZGlmCiB9CiAKIC8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDlmMzA3ZWIuLmVjODIwOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNTgsMTAgKzM1OCw4IEBACiAJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKIAl1bnNpZ25lZCBsb25nIG9mczsKLQljaGFyICptb2RuYW1lOwotCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOICsgMV07CiAKLQlrYWxsc3ltc19sb29rdXAoKHVuc2lnbmVkIGxvbmcpc2NoZWR1bGUsICZzaXplLCAmb2ZzLCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJa2FsbHN5bXNfbG9va3VwX3NpemVfb2Zmc2V0KCh1bnNpZ25lZCBsb25nKXNjaGVkdWxlLCAmc2l6ZSwgJm9mcyk7CiAjZW5kaWYKIAlzY2hlZHVsZV9tZmkuZnVuYyA9IHNjaGVkdWxlOwogCXNjaGVkdWxlX21maS5mdW5jX3NpemUgPSBzaXplOwpAQCAtNDAzLDggKzQwMSw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlOwogCXN0cnVjdCBtaXBzX2ZyYW1lX2luZm8gaW5mbzsKLQljaGFyICptb2RuYW1lOwotCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOICsgMV07CiAJdW5zaWduZWQgbG9uZyBzaXplLCBvZnM7CiAJaW50IGxlYWY7CiAJZXh0ZXJuIHZvaWQgcmV0X2Zyb21faXJxKHZvaWQpOwpAQCAtNDMzLDcgKzQyOSw3IEBACiAJCX0KIAkJcmV0dXJuIDA7CiAJfQotCWlmICgha2FsbHN5bXNfbG9va3VwKHBjLCAmc2l6ZSwgJm9mcywgJm1vZG5hbWUsIG5hbWVidWYpKQorCWlmICgha2FsbHN5bXNfbG9va3VwX3NpemVfb2Zmc2V0KHBjLCAmc2l6ZSwgJm9mcykpCiAJCXJldHVybiAwOwogCS8qCiAJICogUmV0dXJuIHJhIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIGF0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yNGtfc3dpdGNoLlMgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwppbmRleCBkNWM4YjgyLi5jYzU2NmNmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUworKysgYi9hcmNoL21pcHMva2VybmVsL3I0a19zd2l0Y2guUwpAQCAtODUsNyArODUsMTIgQEAKIAltb3ZlCSQyOCwgYTIKIAljcHVfcmVzdG9yZV9ub25zY3JhdGNoIGExCiAKKyNpZiAoX1RIUkVBRF9TSVpFIC0gMzIpIDwgMHgxMDAwMAogCVBUUl9BRERJVQl0MCwgJDI4LCBfVEhSRUFEX1NJWkUgLSAzMgorI2Vsc2UKKwlQVFJfTEkJCXQwLCBfVEhSRUFEX1NJWkUgLSAzMgorCVBUUl9BRERVCXQwLCAkMjgKKyNlbmRpZgogCXNldF9zYXZlZF9zcAl0MCwgdDEsIHQyCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCS8qIFJlYWQtbW9kaWZ5LXdyaXRlcyBvZiBTdGF0dXMgbXVzdCBiZSBhdG9taWMgb24gYSBWUEUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMgYi9hcmNoL21pcHMva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZjBkMDBjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICogcmVsb2NhdGVfa2VybmVsLlMgZm9yIGtleGVjCisgKiBDcmVhdGVkIGJ5IDxuc2NoaWNoYW5AY29ycC5mcmVlLmZyPiBvbiBUaHUgT2N0IDEyIDE3OjQ5OjU3IDIwMDYKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KKyNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKworCS5nbG9ibCByZWxvY2F0ZV9uZXdfa2VybmVsCityZWxvY2F0ZV9uZXdfa2VybmVsOgorCisJUFRSX0wJczAsIGtleGVjX2luZGlyZWN0aW9uX3BhZ2UKKwlQVFJfTAlzMSwga2V4ZWNfc3RhcnRfYWRkcmVzcworCitwcm9jZXNzX2VudHJ5OgorCVBUUl9MCXMyLCAoczApCisJUFRSX0FERAlzMCwgczAsIFNaUkVHCisKKwkvKiBkZXN0aW5hdGlvbiBwYWdlICovCisJYW5kCXMzLCBzMiwgMHgxCisJYmVxCXMzLCB6ZXJvLCAxZgorCWFuZAlzNCwgczIsIH4weDEJLyogc3RvcmUgZGVzdGluYXRpb24gYWRkciBpbiBzNCAqLworCW1vdmUJYTAsIHM0CisJYglwcm9jZXNzX2VudHJ5CisKKzE6CisJLyogaW5kaXJlY3Rpb24gcGFnZSwgdXBkYXRlIHMwICAqLworCWFuZAlzMywgczIsIDB4MgorCWJlcQlzMywgemVybywgMWYKKwlhbmQJczAsIHMyLCB+MHgyCisJYglwcm9jZXNzX2VudHJ5CisKKzE6CisJLyogZG9uZSBwYWdlICovCisJYW5kCXMzLCBzMiwgMHg0CisJYmVxCXMzLCB6ZXJvLCAxZgorCWIJZG9uZQorMToKKwkvKiBzb3VyY2UgcGFnZSAqLworCWFuZAlzMywgczIsIDB4OAorCWJlcQlzMywgemVybywgcHJvY2Vzc19lbnRyeQorCWFuZAlzMiwgczIsIH4weDgKKwlsaQlzNiwgKDEgPDwgUEFHRV9TSElGVCkgLyBTWlJFRworCitjb3B5X3dvcmQ6CisJLyogY29weSBwYWdlIHdvcmQgYnkgd29yZCAqLworCVJFR19MCXM1LCAoczIpCisJUkVHX1MJczUsIChzNCkKKwlJTlRfQURECXM0LCBzNCwgU1pSRUcKKwlJTlRfQURECXMyLCBzMiwgU1pSRUcKKwlJTlRfU1VCCXM2LCBzNiwgMQorCWJlcQlzNiwgemVybywgcHJvY2Vzc19lbnRyeQorCWIJY29weV93b3JkCisJYglwcm9jZXNzX2VudHJ5CisKK2RvbmU6CisJLyoganVtcCB0byBrZXhlY19zdGFydF9hZGRyZXNzICovCisJaglzMQorCisJLmdsb2JsIGtleGVjX3N0YXJ0X2FkZHJlc3MKK2tleGVjX3N0YXJ0X2FkZHJlc3M6CisJLmxvbmcJMHgwCisKKwkuZ2xvYmwga2V4ZWNfaW5kaXJlY3Rpb25fcGFnZQora2V4ZWNfaW5kaXJlY3Rpb25fcGFnZToKKwkubG9uZwkweDAKKworcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQ6CisKKwkuZ2xvYmwgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplCityZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU6CisJLmxvbmcgcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQgLSByZWxvY2F0ZV9uZXdfa2VybmVsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Jlc2V0LmMgYi9hcmNoL21pcHMva2VybmVsL3Jlc2V0LmMKaW5kZXggNjIxMDM3ZC4uMDYwNTYzYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yZXNldC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcmVzZXQuYwpAQCAtMjMsNiArMjMsOCBAQAogdm9pZCAoKl9tYWNoaW5lX2hhbHQpKHZvaWQpOwogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CiAKK0VYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKKwogdm9pZCBtYWNoaW5lX3Jlc3RhcnQoY2hhciAqY29tbWFuZCkKIHsKIAlpZiAoX21hY2hpbmVfcmVzdGFydCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKaW5kZXggOGM4YzgzMi4uNWE5OWUzZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogCWludCBtaW5vcjsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKLQltaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJmNoYW5uZWxfd3FzW21pbm9yXS5ydF9xdWV1ZSwgd2FpdCk7CiAJcG9sbF93YWl0KGZpbGUsICZjaGFubmVsX3dxc1ttaW5vcl0ubHhfcXVldWUsIHdhaXQpOwpAQCAtNDM3LDcgKzQzNyw3IEBACiBzdGF0aWMgc3NpemVfdCBmaWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsCiAJCQkgbG9mZl90ICogcHBvcykKIHsKLQlpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAogCS8qIGRhdGEgYXZhaWxhYmxlPyAqLwogCWlmICghcnRseF9yZWFkX3BvbGwobWlub3IsIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPyAwIDogMSkpIHsKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCXN0cnVjdCBydGx4X2NoYW5uZWwgKnJ0OwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCi0JbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCW1pbm9yID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXJ0ID0gJnJ0bHgtPmNoYW5uZWxbbWlub3JdOwogCiAJLyogYW55IHNwYWNlIGxlZnQuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwppbmRleCA2MTM2MmU2Li43YzBiMzkzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCkBAIC02NTIsNyArNjUyLDEwIEBACiAJc3lzCXN5c192bXNwbGljZQkJNAogCXN5cwlzeXNfbW92ZV9wYWdlcwkJNgogCXN5cwlzeXNfc2V0X3JvYnVzdF9saXN0CTIKLQlzeXMJc3lzX2dldF9yb2J1c3RfbGlzdAkzCisJc3lzCXN5c19nZXRfcm9idXN0X2xpc3QJMwkvKiA0MzEwICovCisJc3lzCXN5c19rZXhlY19sb2FkCQk0CisJc3lzCXN5c19nZXRjcHUJCTMKKwlzeXMJc3lzX2Vwb2xsX3B3YWl0CQk2CiAJLmVuZG0KIAogCS8qIFdlIHByZS1jb21wdXRlIHRoZSBudW1iZXIgb2YgX2luc3RydWN0aW9uXyBieXRlcyBuZWVkZWQgdG8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC02NC5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKaW5kZXggNmM3YjVlZC4uZTU2OWI4NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKQEAgLTQ2OCwzICs0NjgsNiBAQAogCVBUUglzeXNfbW92ZV9wYWdlcwogCVBUUglzeXNfc2V0X3JvYnVzdF9saXN0CiAJUFRSCXN5c19nZXRfcm9idXN0X2xpc3QKKwlQVFIJc3lzX2tleGVjX2xvYWQJCQkvKiA1MjcwICovCisJUFRSCXN5c19nZXRjcHUKKwlQVFIJc3lzX2Vwb2xsX3B3YWl0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKaW5kZXggNmQ5ZjE4Ny4uMzQ1NjdkOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUwpAQCAtMTQ5LDggKzE0OSw4IEBACiAJUFRSCXN5c19taW5jb3JlCiAJUFRSCXN5c19tYWR2aXNlCiAJUFRSCXN5c19zaG1nZXQKLQlQVFIJc3lzMzJfc2htYXQKLQlQVFIJc3lzX3NobWN0bAkJCS8qIDYwMzAgKi8KKwlQVFIJc3lzX3NobWF0CisJUFRSCWNvbXBhdF9zeXNfc2htY3RsCQkJLyogNjAzMCAqLwogCVBUUglzeXNfZHVwCiAJUFRSCXN5c19kdXAyCiAJUFRSCXN5c19wYXVzZQpAQCAtMTg0LDEyICsxODQsMTIgQEAKIAlQVFIJc3lzMzJfbmV3dW5hbWUKIAlQVFIJc3lzX3NlbWdldAogCVBUUglzeXNfc2Vtb3AKLQlQVFIJc3lzX3NlbWN0bAorCVBUUglzeXNuMzJfc2VtY3RsCiAJUFRSCXN5c19zaG1kdAkJCS8qIDYwNjUgKi8KIAlQVFIJc3lzX21zZ2dldAotCVBUUglzeXNfbXNnc25kCi0JUFRSCXN5c19tc2dyY3YKLQlQVFIJc3lzX21zZ2N0bAorCVBUUgljb21wYXRfc3lzX21zZ3NuZAorCVBUUgljb21wYXRfc3lzX21zZ3JjdgorCVBUUgljb21wYXRfc3lzX21zZ2N0bAogCVBUUgljb21wYXRfc3lzX2ZjbnRsCQkvKiA2MDcwICovCiAJUFRSCXN5c19mbG9jawogCVBUUglzeXNfZnN5bmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCVBUUglzeXNfc3luYwogCVBUUglzeXNfYWNjdAogCVBUUglzeXMzMl9zZXR0aW1lb2ZkYXkKLQlQVFIJc3lzX21vdW50CQkJLyogNjE2MCAqLworCVBUUgljb21wYXRfc3lzX21vdW50CQkvKiA2MTYwICovCiAJUFRSCXN5c191bW91bnQKIAlQVFIJc3lzX3N3YXBvbgogCVBUUglzeXNfc3dhcG9mZgpAQCAtMzM1LDcgKzMzNSw3IEBACiAJUFRSCWNvbXBhdF9zeXNfZmNudGw2NAogCVBUUglzeXNfc2V0X3RpZF9hZGRyZXNzCiAJUFRSCXN5c19yZXN0YXJ0X3N5c2NhbGwKLQlQVFIJc3lzX3NlbXRpbWVkb3AJCQkvKiA2MjE1ICovCisJUFRSCWNvbXBhdF9zeXNfc2VtdGltZWRvcAkJCS8qIDYyMTUgKi8KIAlQVFIJc3lzX2ZhZHZpc2U2NF82NAogCVBUUgljb21wYXRfc3lzX3N0YXRmczY0CiAJUFRSCWNvbXBhdF9zeXNfZnN0YXRmczY0CkBAIC0zOTQsMyArMzk0LDYgQEAKIAlQVFIJc3lzX21vdmVfcGFnZXMKIAlQVFIJY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3QKIAlQVFIJY29tcGF0X3N5c19nZXRfcm9idXN0X2xpc3QKKwlQVFIJY29tcGF0X3N5c19rZXhlY19sb2FkCisJUFRSCXN5c19nZXRjcHUKKwlQVFIJc3lzX2Vwb2xsX3B3YWl0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKaW5kZXggMmU2ZDA2Ny4uZTkxMzc5YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJUFRSCXN5c19uaV9zeXNjYWxsCQkJLyogd2FzIHN5c19zdGF0ICovCiAJUFRSCXN5c19sc2VlawogCVBUUglzeXNfZ2V0cGlkCQkJLyogNDAyMCAqLwotCVBUUglzeXNfbW91bnQKKwlQVFIJY29tcGF0X3N5c19tb3VudAogCVBUUglzeXNfb2xkdW1vdW50CiAJUFRSCXN5c19zZXR1aWQKIAlQVFIJc3lzX2dldHVpZApAQCAtNTE2LDQgKzUxNiw3IEBACiAJUFRSCWNvbXBhdF9zeXNfbW92ZV9wYWdlcwogCVBUUgljb21wYXRfc3lzX3NldF9yb2J1c3RfbGlzdAogCVBUUgljb21wYXRfc3lzX2dldF9yb2J1c3RfbGlzdAkvKiA0MzEwICovCisJUFRSCWNvbXBhdF9zeXNfa2V4ZWNfbG9hZAorCVBUUglzeXNfZ2V0Y3B1CisJUFRSCXN5c19lcG9sbF9wd2FpdAogCS5zaXplCXN5c19jYWxsX3RhYmxlLC4tc3lzX2NhbGxfdGFibGUKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYwppbmRleCBmZGJiNTA4Li44OTQ0MGEwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCkBAIC0xNDUsMTMgKzE0NSwxMiBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBtZW1wYXJzZShwLCAmcCk7CiAKICNpZmRlZiBDT05GSUdfNjRCSVQKLQkvKiBIQUNLOiBHdWVzcyBpZiB0aGUgc2lnbiBleHRlbnNpb24gd2FzIGZvcmdvdHRlbiAqLwotCWlmIChzdGFydCA+IDB4MDAwMDAwMDA4MDAwMDAwMCAmJiBzdGFydCA8IDB4MDAwMDAwMDBmZmZmZmZmZikKLQkJc3RhcnQgfD0gMHhmZmZmZmZmZjAwMDAwMDAwVUw7CisJLyogR3Vlc3MgaWYgdGhlIHNpZ24gZXh0ZW5zaW9uIHdhcyBmb3Jnb3R0ZW4gYnkgYm9vdGxvYWRlciAqLworCWlmIChzdGFydCA8IFhLUEhZUykKKwkJc3RhcnQgPSAoaW50KXN0YXJ0OwogI2VuZGlmCiAJaW5pdHJkX3N0YXJ0ID0gc3RhcnQ7CiAJaW5pdHJkX2VuZCArPSBzdGFydDsKLQogCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oInJkX3N0YXJ0IiwgcmRfc3RhcnRfZWFybHkpOwpAQCAtMTU5LDQxICsxNTgsNjQgQEAKIHN0YXRpYyBpbnQgX19pbml0IHJkX3NpemVfZWFybHkoY2hhciAqcCkKIHsKIAlpbml0cmRfZW5kICs9IG1lbXBhcnNlKHAsICZwKTsKLQogCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oInJkX3NpemUiLCByZF9zaXplX2Vhcmx5KTsKIAorLyogaXQgcmV0dXJucyB0aGUgbmV4dCBmcmVlIHBmbiBhZnRlciBpbml0cmQgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBpbml0X2luaXRyZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdG1wLCBlbmQsIHNpemU7CisJdW5zaWduZWQgbG9uZyBlbmQ7CiAJdTMyICppbml0cmRfaGVhZGVyOwogCi0JUk9PVF9ERVYgPSBSb290X1JBTTA7Ci0KIAkvKgogCSAqIEJvYXJkIHNwZWNpZmljIGNvZGUgb3IgY29tbWFuZCBsaW5lIHBhcnNlciBzaG91bGQgaGF2ZQogCSAqIGFscmVhZHkgc2V0IHVwIGluaXRyZF9zdGFydCBhbmQgaW5pdHJkX2VuZC4gSW4gdGhlc2UgY2FzZXMKIAkgKiBwZXJmb20gc2FuaXR5IGNoZWNrcyBhbmQgdXNlIHRoZW0gaWYgYWxsIGxvb2tzIGdvb2QuCiAJICovCi0Jc2l6ZSA9IGluaXRyZF9lbmQgLSBpbml0cmRfc3RhcnQ7Ci0JaWYgKGluaXRyZF9lbmQgPT0gMCB8fCBzaXplID09IDApIHsKLQkJaW5pdHJkX3N0YXJ0ID0gMDsKLQkJaW5pdHJkX2VuZCA9IDA7Ci0JfSBlbHNlCi0JCXJldHVybiBpbml0cmRfZW5kOworCWlmIChpbml0cmRfc3RhcnQgJiYgaW5pdHJkX2VuZCA+IGluaXRyZF9zdGFydCkKKwkJZ290byBzYW5pdGl6ZTsKIAotCWVuZCA9ICh1bnNpZ25lZCBsb25nKSZfZW5kOwotCXRtcCA9IFBBR0VfQUxJR04oZW5kKSAtIHNpemVvZih1MzIpICogMjsKLQlpZiAodG1wIDwgZW5kKQotCQl0bXAgKz0gUEFHRV9TSVpFOworCS8qCisJICogU2VlIGlmIGluaXRyZCBoYXMgYmVlbiBhZGRlZCB0byB0aGUga2VybmVsIGltYWdlIGJ5CisJICogYXJjaC9taXBzL2Jvb3QvYWRkaW5pdHJkLmMuIEluIHRoYXQgY2FzZSBhIGhlYWRlciBpcworCSAqIHByZXBlbmRlZCB0byBpbml0cmQgYW5kIGlzIG1hZGUgdXAgYnkgOCBieXRlcy4gVGhlIGZpc3J0CisJICogd29yZCBpcyBhIG1hZ2ljIG51bWJlciBhbmQgdGhlIHNlY29uZCBvbmUgaXMgdGhlIHNpemUgb2YKKwkgKiBpbml0cmQuICBJbml0cmQgc3RhcnQgbXVzdCBiZSBwYWdlIGFsaWduZWQgaW4gYW55IGNhc2VzLgorCSAqLworCWluaXRyZF9oZWFkZXIgPSBfX3ZhKFBBR0VfQUxJR04oX19wYV9zeW1ib2woJl9lbmQpICsgOCkpIC0gODsKKwlpZiAoaW5pdHJkX2hlYWRlclswXSAhPSAweDQ5NEU1MjQ0KQorCQlnb3RvIGRpc2FibGU7CisJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpKGluaXRyZF9oZWFkZXIgKyAyKTsKKwlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0ICsgaW5pdHJkX2hlYWRlclsxXTsKIAotCWluaXRyZF9oZWFkZXIgPSAodTMyICopdG1wOwotCWlmIChpbml0cmRfaGVhZGVyWzBdID09IDB4NDk0RTUyNDQpIHsKLQkJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpJmluaXRyZF9oZWFkZXJbMl07Ci0JCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBpbml0cmRfaGVhZGVyWzFdOworc2FuaXRpemU6CisJaWYgKGluaXRyZF9zdGFydCAmIH5QQUdFX01BU0spIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbml0cmQgc3RhcnQgbXVzdCBiZSBwYWdlIGFsaWduZWRcbiIpOworCQlnb3RvIGRpc2FibGU7CiAJfQotCXJldHVybiBpbml0cmRfZW5kOworCWlmIChpbml0cmRfc3RhcnQgPCBQQUdFX09GRlNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgImluaXRyZCBzdGFydCA8IFBBR0VfT0ZGU0VUXG4iKTsKKwkJZ290byBkaXNhYmxlOworCX0KKworCS8qCisJICogU2FuaXRpemUgaW5pdHJkIGFkZHJlc3Nlcy4gRm9yIGV4YW1wbGUgZmlybXdhcmUKKwkgKiBjYW4ndCBndWVzcyBpZiB0aGV5IG5lZWQgdG8gcGFzcyB0aGVtIHRocm91Z2gKKwkgKiA2NC1iaXRzIHZhbHVlcyBpZiB0aGUga2VybmVsIGhhcyBiZWVuIGJ1aWx0IGluIHB1cmUKKwkgKiAzMi1iaXQuIFdlIG5lZWQgYWxzbyB0byBzd2l0Y2ggZnJvbSBLU0VHMCB0byBYS1BIWVMKKwkgKiBhZGRyZXNzZXMgbm93LCBzbyB0aGUgY29kZSBjYW4gbm93IHNhZmVseSB1c2UgX19wYSgpLgorCSAqLworCWVuZCA9IF9fcGEoaW5pdHJkX2VuZCk7CisJaW5pdHJkX2VuZCA9ICh1bnNpZ25lZCBsb25nKV9fdmEoZW5kKTsKKwlpbml0cmRfc3RhcnQgPSAodW5zaWduZWQgbG9uZylfX3ZhKF9fcGEoaW5pdHJkX3N0YXJ0KSk7CisKKwlST09UX0RFViA9IFJvb3RfUkFNMDsKKwlyZXR1cm4gUEZOX1VQKGVuZCk7CitkaXNhYmxlOgorCWluaXRyZF9zdGFydCA9IDA7CisJaW5pdHJkX2VuZCA9IDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBmaW5hbGl6ZV9pbml0cmQodm9pZCkKQEAgLTIwNCwxMiArMjI2LDEyIEBACiAJCXByaW50ayhLRVJOX0lORk8gIkluaXRyZCBub3QgZm91bmQgb3IgZW1wdHkiKTsKIAkJZ290byBkaXNhYmxlOwogCX0KLQlpZiAoQ1BIWVNBRERSKGluaXRyZF9lbmQpID4gUEZOX1BIWVMobWF4X2xvd19wZm4pKSB7CisJaWYgKF9fcGEoaW5pdHJkX2VuZCkgPiBQRk5fUEhZUyhtYXhfbG93X3BmbikpIHsKIAkJcHJpbnRrKCJJbml0cmQgZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIG1lbW9yeSIpOwogCQlnb3RvIGRpc2FibGU7CiAJfQogCi0JcmVzZXJ2ZV9ib290bWVtKENQSFlTQUREUihpbml0cmRfc3RhcnQpLCBzaXplKTsKKwlyZXNlcnZlX2Jvb3RtZW0oX19wYShpbml0cmRfc3RhcnQpLCBzaXplKTsKIAlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbCByYW1kaXNrIGF0OiAweCVseCAoJWx1IGJ5dGVzKVxuIiwKQEAgLTIyMyw3ICsyNDUsMTEgQEAKIAogI2Vsc2UgIC8qICFDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KIAotI2RlZmluZSBpbml0X2luaXRyZCgpCQkwCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgaW5pdF9pbml0cmQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSBmaW5hbGl6ZV9pbml0cmQoKQlkbyB7fSB3aGlsZSAoMCkKIAogI2VuZGlmCkBAIC0yNTUsOCArMjgxLDcgQEAKIAkgKiBub3Qgc2VsZWN0ZWQuIE9uY2UgdGhhdCBkb25lIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGxvdyBib3VuZAogCSAqIG9mIHVzYWJsZSBtZW1vcnkuCiAJICovCi0JcmVzZXJ2ZWRfZW5kID0gaW5pdF9pbml0cmQoKTsKLQlyZXNlcnZlZF9lbmQgPSBQRk5fVVAoQ1BIWVNBRERSKG1heChyZXNlcnZlZF9lbmQsICh1bnNpZ25lZCBsb25nKSZfZW5kKSkpOworCXJlc2VydmVkX2VuZCA9IG1heChpbml0X2luaXRyZCgpLCBQRk5fVVAoX19wYV9zeW1ib2woJl9lbmQpKSk7CiAKIAkvKgogCSAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUuCkBAIC00MjgsMTAgKzQ1MywxMCBAQAogCWlmIChVTkNBQ19CQVNFICE9IElPX0JBU0UpCiAJCXJldHVybjsKIAotCWNvZGVfcmVzb3VyY2Uuc3RhcnQgPSB2aXJ0X3RvX3BoeXMoJl90ZXh0KTsKLQljb2RlX3Jlc291cmNlLmVuZCA9IHZpcnRfdG9fcGh5cygmX2V0ZXh0KSAtIDE7Ci0JZGF0YV9yZXNvdXJjZS5zdGFydCA9IHZpcnRfdG9fcGh5cygmX2V0ZXh0KTsKLQlkYXRhX3Jlc291cmNlLmVuZCA9IHZpcnRfdG9fcGh5cygmX2VkYXRhKSAtIDE7CisJY29kZV9yZXNvdXJjZS5zdGFydCA9IF9fcGFfc3ltYm9sKCZfdGV4dCk7CisJY29kZV9yZXNvdXJjZS5lbmQgPSBfX3BhX3N5bWJvbCgmX2V0ZXh0KSAtIDE7CisJZGF0YV9yZXNvdXJjZS5zdGFydCA9IF9fcGFfc3ltYm9sKCZfZXRleHQpOworCWRhdGFfcmVzb3VyY2UuZW5kID0gX19wYV9zeW1ib2woJl9lZGF0YSkgLSAxOwogCiAJLyoKIAkgKiBSZXF1ZXN0IGFkZHJlc3Mgc3BhY2UgZm9yIGFsbCBzdGFuZGFyZCBSQU0uCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbF9uMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsX24zMi5jCmluZGV4IDQ3N2M1MzMuLmE2N2MxODUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsX24zMi5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsX24zMi5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtbXQuYwppbmRleCAzYjVmM2I2Li4xZWU2ODljIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKQEAgLTE0MCwxNSArMTQwLDkwIEBACiAJLm5hbWUJCT0gIklQSV9jYWxsIgogfTsKIAorc3RhdGljIHZvaWQgX19pbml0IHNtcF9jb3B5X3ZwZV9jb25maWcodm9pZCkKK3sKKwl3cml0ZV92cGVfYzBfc3RhdHVzKAorCQkocmVhZF9jMF9zdGF0dXMoKSAmIH4oU1QwX0lNIHwgU1QwX0lFIHwgU1QwX0tTVSkpIHwgU1QwX0NVMCk7CisKKwkvKiBzZXQgY29uZmlnIHRvIGJlIHRoZSBzYW1lIGFzIHZwZTAsIHBhcnRpY3VsYXJseSBrc2VnMCBjb2hlcmVuY3kgYWxnICovCisJd3JpdGVfdnBlX2MwX2NvbmZpZyggcmVhZF9jMF9jb25maWcoKSk7CisKKwkvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHNvZnR3YXJlIGludGVycnVwdHMgcGVuZGluZyAqLworCXdyaXRlX3ZwZV9jMF9jYXVzZSgwKTsKKworCS8qIFByb3BhZ2F0ZSBDb25maWc3ICovCisJd3JpdGVfdnBlX2MwX2NvbmZpZzcocmVhZF9jMF9jb25maWc3KCkpOworCisJd3JpdGVfdnBlX2MwX2NvdW50KHJlYWRfYzBfY291bnQoKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHNtcF92cGVfaW5pdCh1bnNpZ25lZCBpbnQgdGMsIHVuc2lnbmVkIGludCBtdnBjb25mMCwKKwl1bnNpZ25lZCBpbnQgbmNwdSkKK3sKKwlpZiAodGMgPiAoKG12cGNvbmYwICYgTVZQQ09ORjBfUFZQRSkgPj4gTVZQQ09ORjBfUFZQRV9TSElGVCkpCisJCXJldHVybiBuY3B1OworCisJLyogRGVhY3RpdmF0ZSBhbGwgYnV0IFZQRSAwICovCisJaWYgKHRjICE9IDApIHsKKwkJdW5zaWduZWQgbG9uZyB0bXAgPSByZWFkX3ZwZV9jMF92cGVjb25mMCgpOworCisJCXRtcCAmPSB+VlBFQ09ORjBfVlBBOworCisJCS8qIG1hc3RlciBWUEUgKi8KKwkJdG1wIHw9IFZQRUNPTkYwX01WUDsKKwkJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHRtcCk7CisKKwkJLyogUmVjb3JkIHRoaXMgYXMgYXZhaWxhYmxlIENQVSAqLworCQljcHVfc2V0KHRjLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CisJCV9fY3B1X251bWJlcl9tYXBbdGNdCT0gKytuY3B1OworCQlfX2NwdV9sb2dpY2FsX21hcFtuY3B1XQk9IHRjOworCX0KKworCS8qIERpc2FibGUgbXVsdGktdGhyZWFkaW5nIHdpdGggVEMncyAqLworCXdyaXRlX3ZwZV9jMF92cGVjb250cm9sKHJlYWRfdnBlX2MwX3ZwZWNvbnRyb2woKSAmIH5WUEVDT05UUk9MX1RFKTsKKworCWlmICh0YyAhPSAwKQorCQlzbXBfY29weV92cGVfY29uZmlnKCk7CisKKwlyZXR1cm4gbmNwdTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNtcF90Y19pbml0KHVuc2lnbmVkIGludCB0YywgdW5zaWduZWQgaW50IG12cGNvbmYwKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaWYgKCF0YykKKwkJcmV0dXJuOworCisJLyogYmluZCBhIFRDIHRvIGVhY2ggVlBFLCBNYXkgYXMgd2VsbCBwdXQgYWxsIGV4Y2VzcyBUQydzCisJICAgb24gdGhlIGxhc3QgVlBFICovCisJaWYgKHRjID49ICgoKG12cGNvbmYwICYgTVZQQ09ORjBfUFZQRSkgPj4gTVZQQ09ORjBfUFZQRV9TSElGVCkrMSkpCisJCXdyaXRlX3RjX2MwX3RjYmluZChyZWFkX3RjX2MwX3RjYmluZCgpIHwgKChtdnBjb25mMCAmIE1WUENPTkYwX1BWUEUpID4+IE1WUENPTkYwX1BWUEVfU0hJRlQpKTsKKwllbHNlIHsKKwkJd3JpdGVfdGNfYzBfdGNiaW5kKHJlYWRfdGNfYzBfdGNiaW5kKCkgfCB0Yyk7CisKKwkJLyogYW5kIHNldCBYVEMgKi8KKwkJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHJlYWRfdnBlX2MwX3ZwZWNvbmYwKCkgfCAodGMgPDwgVlBFQ09ORjBfWFRDX1NISUZUKSk7CisJfQorCisJdG1wID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOworCisJLyogbWFyayBub3QgYWxsb2NhdGVkIGFuZCBub3QgZHluYW1pY2FsbHkgYWxsb2NhdGFibGUgKi8KKwl0bXAgJj0gfihUQ1NUQVRVU19BIHwgVENTVEFUVVNfREEpOworCXRtcCB8PSBUQ1NUQVRVU19JWE1UOwkJLyogaW50ZXJydXB0IGV4ZW1wdCAqLworCXdyaXRlX3RjX2MwX3Rjc3RhdHVzKHRtcCk7CisKKwl3cml0ZV90Y19jMF90Y2hhbHQoVENIQUxUX0gpOworfQorCiAvKgogICogQ29tbW9uIHNldHVwIGJlZm9yZSBhbnkgc2Vjb25kYXJpZXMgYXJlIHN0YXJ0ZWQKICAqIE1ha2Ugc3VyZSBhbGwgQ1BVJ3MgYXJlIGluIGEgc2Vuc2libGUgc3RhdGUgYmVmb3JlIHdlIGJvb3QgYW55IG9mIHRoZQogICogc2Vjb25kYXJ5cwogICovCi12b2lkIHBsYXRfc21wX3NldHVwKHZvaWQpCit2b2lkIF9faW5pdCBwbGF0X3NtcF9zZXR1cCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBpLCBudW07CisJdW5zaWduZWQgaW50IG12cGNvbmYwLCBudGMsIHRjLCBuY3B1ID0gMDsKIAogI2lmZGVmIENPTkZJR19NSVBTX01UX0ZQQUZGCiAJLyogSWYgd2UgaGF2ZSBhbiBGUFUsIGVucm9sbCBvdXJzZWx2ZXMgaW4gdGhlIEZQVS1mdWxsIG1hc2sgKi8KQEAgLTE2Nyw3NSArMjQyLDE2IEBACiAJLyogUHV0IE1WUEUncyBpbnRvICdjb25maWd1cmF0aW9uIHN0YXRlJyAqLwogCXNldF9jMF9tdnBjb250cm9sKE1WUENPTlRST0xfVlBDKTsKIAotCXZhbCA9IHJlYWRfYzBfbXZwY29uZjAoKTsKKwltdnBjb25mMCA9IHJlYWRfYzBfbXZwY29uZjAoKTsKKwludGMgPSAobXZwY29uZjAgJiBNVlBDT05GMF9QVEMpID4+IE1WUENPTkYwX1BUQ19TSElGVDsKIAogCS8qIHdlJ2xsIGFsd2F5cyBoYXZlIG1vcmUgVEMncyB0aGFuIFZQRSdzLCBzbyBsb29wIHNldHRpbmcgZXZlcnl0aGluZwogCSAgIHRvIGEgc2Vuc2libGUgc3RhdGUgKi8KLQlmb3IgKGkgPSAwLCBudW0gPSAwOyBpIDw9ICgodmFsICYgTVZQQ09ORjBfUFRDKSA+PiBNVlBDT05GMF9QVENfU0hJRlQpOyBpKyspIHsKLQkJc2V0dGMoaSk7CisJZm9yICh0YyA9IDA7IHRjIDw9IG50YzsgdGMrKykgeworCQlzZXR0Yyh0Yyk7CiAKLQkJLyogVlBFJ3MgKi8KLQkJaWYgKGkgPD0gKCh2YWwgJiBNVlBDT05GMF9QVlBFKSA+PiBNVlBDT05GMF9QVlBFX1NISUZUKSkgewotCi0JCQkvKiBkZWFjdGl2YXRlIGFsbCBidXQgdnBlMCAqLwotCQkJaWYgKGkgIT0gMCkgewotCQkJCXVuc2lnbmVkIGxvbmcgdG1wID0gcmVhZF92cGVfYzBfdnBlY29uZjAoKTsKLQotCQkJCXRtcCAmPSB+VlBFQ09ORjBfVlBBOwotCi0JCQkJLyogbWFzdGVyIFZQRSAqLwotCQkJCXRtcCB8PSBWUEVDT05GMF9NVlA7Ci0JCQkJd3JpdGVfdnBlX2MwX3ZwZWNvbmYwKHRtcCk7Ci0KLQkJCQkvKiBSZWNvcmQgdGhpcyBhcyBhdmFpbGFibGUgQ1BVICovCi0JCQkJY3B1X3NldChpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0JCQkJX19jcHVfbnVtYmVyX21hcFtpXQk9ICsrbnVtOwotCQkJCV9fY3B1X2xvZ2ljYWxfbWFwW251bV0JPSBpOwotCQkJfQotCi0JCQkvKiBkaXNhYmxlIG11bHRpLXRocmVhZGluZyB3aXRoIFRDJ3MgKi8KLQkJCXdyaXRlX3ZwZV9jMF92cGVjb250cm9sKHJlYWRfdnBlX2MwX3ZwZWNvbnRyb2woKSAmIH5WUEVDT05UUk9MX1RFKTsKLQotCQkJaWYgKGkgIT0gMCkgewotCQkJCXdyaXRlX3ZwZV9jMF9zdGF0dXMoKHJlYWRfYzBfc3RhdHVzKCkgJiB+KFNUMF9JTSB8IFNUMF9JRSB8IFNUMF9LU1UpKSB8IFNUMF9DVTApOwotCi0JCQkJLyogc2V0IGNvbmZpZyB0byBiZSB0aGUgc2FtZSBhcyB2cGUwLCBwYXJ0aWN1bGFybHkga3NlZzAgY29oZXJlbmN5IGFsZyAqLwotCQkJCXdyaXRlX3ZwZV9jMF9jb25maWcoIHJlYWRfYzBfY29uZmlnKCkpOwotCi0JCQkJLyogbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzb2Z0d2FyZSBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KLQkJCQl3cml0ZV92cGVfYzBfY2F1c2UoMCk7Ci0KLQkJCQkvKiBQcm9wYWdhdGUgQ29uZmlnNyAqLwotCQkJCXdyaXRlX3ZwZV9jMF9jb25maWc3KHJlYWRfYzBfY29uZmlnNygpKTsKLQkJCX0KLQotCQl9Ci0KLQkJLyogVEMncyAqLwotCi0JCWlmIChpICE9IDApIHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCQkvKiBiaW5kIGEgVEMgdG8gZWFjaCBWUEUsIE1heSBhcyB3ZWxsIHB1dCBhbGwgZXhjZXNzIFRDJ3MKLQkJCSAgIG9uIHRoZSBsYXN0IFZQRSAqLwotCQkJaWYgKCBpID49ICgoKHZhbCAmIE1WUENPTkYwX1BWUEUpID4+IE1WUENPTkYwX1BWUEVfU0hJRlQpKzEpICkKLQkJCQl3cml0ZV90Y19jMF90Y2JpbmQocmVhZF90Y19jMF90Y2JpbmQoKSB8ICgodmFsICYgTVZQQ09ORjBfUFZQRSkgPj4gTVZQQ09ORjBfUFZQRV9TSElGVCkgKTsKLQkJCWVsc2UgewotCQkJCXdyaXRlX3RjX2MwX3RjYmluZCggcmVhZF90Y19jMF90Y2JpbmQoKSB8IGkpOwotCi0JCQkJLyogYW5kIHNldCBYVEMgKi8KLQkJCQl3cml0ZV92cGVfYzBfdnBlY29uZjAoIHJlYWRfdnBlX2MwX3ZwZWNvbmYwKCkgfCAoaSA8PCBWUEVDT05GMF9YVENfU0hJRlQpKTsKLQkJCX0KLQotCQkJdG1wID0gcmVhZF90Y19jMF90Y3N0YXR1cygpOwotCi0JCQkvKiBtYXJrIG5vdCBhbGxvY2F0ZWQgYW5kIG5vdCBkeW5hbWljYWxseSBhbGxvY2F0YWJsZSAqLwotCQkJdG1wICY9IH4oVENTVEFUVVNfQSB8IFRDU1RBVFVTX0RBKTsKLQkJCXRtcCB8PSBUQ1NUQVRVU19JWE1UOwkJLyogaW50ZXJydXB0IGV4ZW1wdCAqLwotCQkJd3JpdGVfdGNfYzBfdGNzdGF0dXModG1wKTsKLQotCQkJd3JpdGVfdGNfYzBfdGNoYWx0KFRDSEFMVF9IKTsKLQkJfQorCQlzbXBfdGNfaW5pdCh0YywgbXZwY29uZjApOworCQluY3B1ID0gc21wX3ZwZV9pbml0KHRjLCBtdnBjb25mMCwgbmNwdSk7CiAJfQogCiAJLyogUmVsZWFzZSBjb25maWcgc3RhdGUgKi8KQEAgLTI0Myw3ICsyNTksNyBAQAogCiAJLyogV2UnbGwgd2FpdCB1bnRpbCBzdGFydGluZyB0aGUgc2Vjb25kYXJpZXMgYmVmb3JlIHN0YXJ0aW5nIE1WUEUgKi8KIAotCXByaW50ayhLRVJOX0lORk8gIkRldGVjdGVkICVpIGF2YWlsYWJsZSBzZWNvbmRhcnkgQ1BVKHMpXG4iLCBudW0pOworCXByaW50ayhLRVJOX0lORk8gIkRldGVjdGVkICVpIGF2YWlsYWJsZSBzZWNvbmRhcnkgQ1BVKHMpXG4iLCBuY3B1KTsKIH0KIAogdm9pZCBfX2luaXQgcGxhdF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQpAQCAtMjYyLDcgKzI3OCw5IEBACiAKIAkvKiBuZWVkIHRvIG1hcmsgSVBJJ3MgYXMgSVJRX1BFUl9DUFUgKi8KIAlpcnFfZGVzY1tjcHVfaXBpX3Jlc2NoZWRfaXJxXS5zdGF0dXMgfD0gSVJRX1BFUl9DUFU7CisJc2V0X2lycV9oYW5kbGVyKGNwdV9pcGlfcmVzY2hlZF9pcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKIAlpcnFfZGVzY1tjcHVfaXBpX2NhbGxfaXJxXS5zdGF0dXMgfD0gSVJRX1BFUl9DUFU7CisJc2V0X2lycV9oYW5kbGVyKGNwdV9pcGlfY2FsbF9pcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC5jCmluZGV4IGRiODA5NTcuLmYyYTg3MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAKIAlzcGluX2xvY2soJnNtcF9jYWxsX2xvY2spOwogCWNhbGxfZGF0YSA9ICZkYXRhOwotCW1iKCk7CisJc21wX21iKCk7CiAKIAkvKiBTZW5kIGEgbWVzc2FnZSB0byBhbGwgb3RoZXIgQ1BVcyBhbmQgd2FpdCBmb3IgdGhlbSB0byByZXNwb25kICovCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKQpAQCAtMjA0LDcgKzIwNCw3IEBACiAJICogTm90aWZ5IGluaXRpYXRpbmcgQ1BVIHRoYXQgSSd2ZSBncmFiYmVkIHRoZSBkYXRhIGFuZCBhbQogCSAqIGFib3V0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uLgogCSAqLwotCW1iKCk7CisJc21wX21iKCk7CiAJYXRvbWljX2luYygmY2FsbF9kYXRhLT5zdGFydGVkKTsKIAogCS8qCkBAIC0yMTUsNyArMjE1LDcgQEAKIAlpcnFfZXhpdCgpOwogCiAJaWYgKHdhaXQpIHsKLQkJbWIoKTsKKwkJc21wX21iKCk7CiAJCWF0b21pY19pbmMoJmNhbGxfZGF0YS0+ZmluaXNoZWQpOwogCX0KIH0KQEAgLTQ2MywyOCArNDYzLDUgQEAKIAlzbXBfb25fZWFjaF90bGIoZmx1c2hfdGxiX29uZV9pcGksICh2b2lkICopIHZhZGRyKTsKIH0KIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKLQotc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQotewotCWludCBpLCByZXQ7Ci0KLSNpZmRlZiBDT05GSUdfTlVNQQotCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpCi0JCXJlZ2lzdGVyX29uZV9ub2RlKGkpOwotI2VuZGlmIC8qIENPTkZJR19OVU1BICovCi0KLQlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7Ci0JCXJldCA9IHJlZ2lzdGVyX2NwdSgmcGVyX2NwdShjcHVfZGV2aWNlcywgaSksIGkpOwotCQlpZiAocmV0KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidG9wb2xvZ3lfaW5pdDogcmVnaXN0ZXJfY3B1ICVkICIKLQkJCSAgICAgICAiZmFpbGVkICglZClcbiIsIGksIHJldCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKLQogRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcGFnZSk7CiBFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9vbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLWFzbS5TIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLWFzbS5TCmluZGV4IDFjYjk0NDEuLjkyMTIwN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy1hc20uUworKysgYi9hcmNoL21pcHMva2VybmVsL3NtdGMtYXNtLlMKQEAgLTEwMSw3ICsxMDEsOSBAQAogCWx3CXQwLFBUX1BBRFNMT1Q1KHNwKQogCS8qIEFyZ3VtZW50IGZyb20gc2VuZGVyIHBhc3NlZCBpbiBzdGFjayBwYWQgc2xvdCA0ICovCiAJbHcJYTAsUFRfUEFEU0xPVDQoc3ApCi0JUFRSX0xBCXJhLCBfcmV0X2Zyb21faXJxCisJTE9OR19MCXMwLCBUSV9SRUdTKCQyOCkKKwlMT05HX1MJc3AsIFRJX1JFR1MoJDI4KQorCVBUUl9MQQlyYSwgcmV0X2Zyb21faXJxCiAJanIJdDAKIAogLyoKQEAgLTExOSw3ICsxMjEsMTAgQEAKIAlzdWJ1CXQxLHNwLFBUX1NJWkUKIAlzdwlyYSxQVF9FUEModDEpCiAJc3cJYTAsUFRfUEFEU0xPVDQodDEpCisJTE9OR19MCXMwLCBUSV9SRUdTKCQyOCkKKwlMT05HX1MJc3AsIFRJX1JFR1MoJDI4KQogCWxhCXQyLGlwaV9kZWNvZGUKKwlMT05HX1MJczAsIFRJX1JFR1MoJDI4KQogCXN3CXQyLFBUX1BBRFNMT1Q1KHQxKQogCS8qIFNhdmUgcHJlLWRpc2FibGUgdmFsdWUgb2YgVENTdGF0dXMgKi8KIAlzdwl0MCxQVF9UQ1NUQVRVUyh0MSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKaW5kZXggY2MxZjc0Ny4uODAyZmViZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLmMKQEAgLTQ3Niw2ICs0NzYsNyBAQAogCQkJd3JpdGVfdnBlX2MwX2NvbXBhcmUoMCk7CiAJCQkvKiBQcm9wYWdhdGUgQ29uZmlnNyAqLwogCQkJd3JpdGVfdnBlX2MwX2NvbmZpZzcocmVhZF9jMF9jb25maWc3KCkpOworCQkJd3JpdGVfdnBlX2MwX2NvdW50KHJlYWRfYzBfY291bnQoKSk7CiAJCX0KIAkJLyogZW5hYmxlIG11bHRpLXRocmVhZGluZyB3aXRoaW4gVlBFICovCiAJCXdyaXRlX3ZwZV9jMF92cGVjb250cm9sKHJlYWRfdnBlX2MwX3ZwZWNvbnRyb2woKSB8IFZQRUNPTlRST0xfVEUpOwpAQCAtMTAwOCw2ICsxMDA5LDcgQEAKIAlzZXR1cF9pcnFfc210YyhjcHVfaXBpX2lycSwgJmlycV9pcGksICgweDEwMCA8PCBNSVBTX0NQVV9JUElfSVJRKSk7CiAKIAlpcnFfZGVzY1tjcHVfaXBpX2lycV0uc3RhdHVzIHw9IElSUV9QRVJfQ1BVOworCXNldF9pcnFfaGFuZGxlcihjcHVfaXBpX2lycSwgaGFuZGxlX3BlcmNwdV9pcnEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL21pcHMva2VybmVsL3N0YWNrdHJhY2UuYwppbmRleCA0YWFiZTUyLi5hNTg2YWJhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtNTcsNyArNTcsNyBAQAogCQlwYyA9IHVud2luZF9zdGFjayh0YXNrLCAmc3AsIHBjLCAmcmEpOwogCX0gd2hpbGUgKHBjKTsKICNlbHNlCi0Jc2F2ZV9yYXdfY29udGV4dF9zdGFjayhzcCk7CisJc2F2ZV9yYXdfY29udGV4dF9zdGFjayh0cmFjZSwgc3ApOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKaW5kZXggOTNjNzRmZS4uNmMyNDA2YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMKQEAgLTczMiw3ICs3MzIsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllcnJvciA9IHZmc19zdGF0ZnMoZmlsZS0+Zl9kZW50cnksICZrYnVmKTsKKwllcnJvciA9IHZmc19zdGF0ZnMoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgJmtidWYpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZjsKIApAQCAtMTA0MSw3ICsxMDQxLDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgb2xkX3BvczsKIAkJCWxvbmcgbWF4X3NpemUgPSBvZmZzZXQgKyBsZW47CiAKLQkJCWlmIChtYXhfc2l6ZSA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpIHsKKwkJCWlmIChtYXhfc2l6ZSA+IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSkgewogCQkJCW9sZF9wb3MgPSBzeXNfbHNlZWsgKGZkLCBtYXhfc2l6ZSAtIDEsIDApOwogCQkJCXN5c193cml0ZSAoZmQsICh2b2lkIF9fdXNlciAqKSAiIiwgMSk7CiAJCQkJc3lzX2xzZWVrIChmZCwgb2xkX3BvcywgMCk7CkBAIC0xNDA2LDcgKzE0MDYsNyBAQAogCQllcnJvciA9IC1FQkFERjsKIAkJZ290byBvdXQ7CiAJfQotCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeSwgJmtidWYpOworCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX3BhdGguZGVudHJ5LCAma2J1Zik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mOwogCkBAIC0xNTI2LDcgKzE1MjYsNyBAQAogCQkJdW5zaWduZWQgbG9uZyBvbGRfcG9zOwogCQkJbG9uZyBtYXhfc2l6ZSA9IG9mZjIgKyBsZW47CiAKLQkJCWlmIChtYXhfc2l6ZSA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpIHsKKwkJCWlmIChtYXhfc2l6ZSA+IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSkgewogCQkJCW9sZF9wb3MgPSBzeXNfbHNlZWsgKGZkLCBtYXhfc2l6ZSAtIDEsIDApOwogCQkJCXN5c193cml0ZSAoZmQsICh2b2lkIF9fdXNlciAqKSAiIiwgMSk7CiAJCQkJc3lzX2xzZWVrIChmZCwgb2xkX3BvcywgMCk7CkBAIC0xNjU4LDcgKzE2NTgsNyBAQAogCQllcnJvciA9IC1FQkFERjsKIAkJZ290byBvdXQ7CiAJfQotCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeSwgJmtidWYpOworCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX3BhdGguZGVudHJ5LCAma2J1Zik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCmluZGV4IGRlYmU4NmMuLjExYWFiNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jCkBAIC02NywxNSArNjcsOSBAQAogaW50ICgqcnRjX21pcHNfc2V0X21tc3MpKHVuc2lnbmVkIGxvbmcpOwogCiAKLS8qIHVzZWNzIHBlciBjb3VudGVyIGN5Y2xlLCBzaGlmdGVkIHRvIGxlZnQgYnkgMzIgYml0cyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzbGwzMl91c2Vjc19wZXJfY3ljbGU7Ci0KIC8qIGhvdyBtYW55IGNvdW50ZXIgY3ljbGVzIGluIGEgamlmZnkgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGN5Y2xlc19wZXJfamlmZnkgX19yZWFkX21vc3RseTsKIAotLyogQ3ljbGUgY291bnRlciB2YWx1ZSBhdCB0aGUgcHJldmlvdXMgdGltZXIgaW50ZXJydXB0Li4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdGltZXJoaSwgdGltZXJsbzsKLQogLyogZXhwaXJlbG8gaXMgdGhlIGNvdW50IHZhbHVlIGZvciBuZXh0IENQVSB0aW1lciBpbnRlcnJ1cHQgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXhwaXJlbG87CiAKQEAgLTg4LDE3ICs4MiwxMSBAQAogLyoKICAqIE51bGwgaGlnaCBwcmVjaXNpb24gdGltZXIgZnVuY3Rpb25zIGZvciBzeXN0ZW1zIGxhY2tpbmcgb25lLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG51bGxfaHB0X3JlYWQodm9pZCkKK3N0YXRpYyBjeWNsZV90IG51bGxfaHB0X3JlYWQodm9pZCkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbnVsbF9ocHRfaW5pdCh1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JLyogbm90aGluZyAqLwotfQotCi0KIC8qCiAgKiBUaW1lciBhY2sgZm9yIGFuIFI0ay1jb21wYXRpYmxlIHRpbWVyIG9mIGEga25vd24gZnJlcXVlbmN5LgogICovCkBAIC0xMjMsMTkxICsxMTEsMjAgQEAKIC8qCiAgKiBIaWdoIHByZWNpc2lvbiB0aW1lciBmdW5jdGlvbnMgZm9yIGEgUjRrLWNvbXBhdGlibGUgdGltZXIuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYzBfaHB0X3JlYWQodm9pZCkKK3N0YXRpYyBjeWNsZV90IGMwX2hwdF9yZWFkKHZvaWQpCiB7CiAJcmV0dXJuIHJlYWRfYzBfY291bnQoKTsKIH0KIAotLyogRm9yIHVzZSBzb2xlbHkgYXMgYSBoaWdoIHByZWNpc2lvbiB0aW1lci4gICovCi1zdGF0aWMgdm9pZCBjMF9ocHRfaW5pdCh1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0Jd3JpdGVfYzBfY291bnQocmVhZF9jMF9jb3VudCgpIC0gY291bnQpOwotfQotCiAvKiBGb3IgdXNlIGJvdGggYXMgYSBoaWdoIHByZWNpc2lvbiB0aW1lciBhbmQgYW4gaW50ZXJydXB0IHNvdXJjZS4gICovCi1zdGF0aWMgdm9pZCBjMF9ocHRfdGltZXJfaW5pdCh1bnNpZ25lZCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBfX2luaXQgYzBfaHB0X3RpbWVyX2luaXQodm9pZCkKIHsKLQljb3VudCA9IHJlYWRfYzBfY291bnQoKSAtIGNvdW50OwotCWV4cGlyZWxvID0gKGNvdW50IC8gY3ljbGVzX3Blcl9qaWZmeSArIDEpICogY3ljbGVzX3Blcl9qaWZmeTsKLQl3cml0ZV9jMF9jb3VudChleHBpcmVsbyAtIGN5Y2xlc19wZXJfamlmZnkpOworCWV4cGlyZWxvID0gcmVhZF9jMF9jb3VudCgpICsgY3ljbGVzX3Blcl9qaWZmeTsKIAl3cml0ZV9jMF9jb21wYXJlKGV4cGlyZWxvKTsKLQl3cml0ZV9jMF9jb3VudChjb3VudCk7CiB9CiAKIGludCAoKm1pcHNfdGltZXJfc3RhdGUpKHZvaWQpOwogdm9pZCAoKm1pcHNfdGltZXJfYWNrKSh2b2lkKTsKLXVuc2lnbmVkIGludCAoKm1pcHNfaHB0X3JlYWQpKHZvaWQpOwotdm9pZCAoKm1pcHNfaHB0X2luaXQpKHVuc2lnbmVkIGludCk7Ci0KLS8qCi0gKiBHZXR0aW1lb2Zmc2V0IHJvdXRpbmVzLiAgVGhlc2Ugcm91dGluZXMgcmV0dXJucyB0aGUgdGltZSBkdXJhdGlvbgotICogc2luY2UgbGFzdCB0aW1lciBpbnRlcnJ1cHQgaW4gdXNlY3MuCi0gKgotICogSWYgdGhlIGV4YWN0IENQVSBjb3VudGVyIGZyZXF1ZW5jeSBpcyBrbm93biwgdXNlIGZpeGVkX3JhdGVfZ2V0dGltZW9mZnNldC4KLSAqIE90aGVyd2lzZSB1c2UgY2FsaWJyYXRlX2dldHRpbWVvZmZzZXQoKQotICoKLSAqIElmIHRoZSBDUFUgZG9lcyBub3QgaGF2ZSB0aGUgY291bnRlciByZWdpc3RlciwgeW91IGNhbiBlaXRoZXIgc3VwcGx5Ci0gKiB5b3VyIG93biBnZXR0aW1lb2Zmc2V0KCkgcm91dGluZSwgb3IgdXNlIG51bGxfZ2V0dGltZW9mZnNldCgpLCB3aGljaAotICogZ2l2ZXMgdGhlIHNhbWUgcmVzb2x1dGlvbiBhcyBIWi4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBudWxsX2dldHRpbWVvZmZzZXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgZnVuY3Rpb24gcG9pbnRlciB0byBvbmUgb2YgdGhlIGdldHRpbWVvZmZzZXQgZnVuY3MuICAqLwotdW5zaWduZWQgbG9uZyAoKmRvX2dldHRpbWVvZmZzZXQpKHZvaWQpID0gbnVsbF9nZXR0aW1lb2Zmc2V0OwotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpeGVkX3JhdGVfZ2V0dGltZW9mZnNldCh2b2lkKQotewotCXUzMiBjb3VudDsKLQl1bnNpZ25lZCBsb25nIHJlczsKLQotCS8qIEdldCBsYXN0IHRpbWVyIHRpY2sgaW4gYWJzb2x1dGUga2VybmVsIHRpbWUgKi8KLQljb3VudCA9IG1pcHNfaHB0X3JlYWQoKTsKLQotCS8qIC4uIHJlbGF0aXZlIHRvIHByZXZpb3VzIGppZmZ5ICgzMiBiaXRzIGlzIGVub3VnaCkgKi8KLQljb3VudCAtPSB0aW1lcmxvOwotCi0JX19hc21fXygibXVsdHUJJTEsJTIiCi0JCTogIj1oIiAocmVzKQotCQk6ICJyIiAoY291bnQpLCAiciIgKHNsbDMyX3VzZWNzX3Blcl9jeWNsZSkKLQkJOiAibG8iLCBHQ0NfUkVHX0FDQ1VNKTsKLQotCS8qCi0JICogRHVlIHRvIHBvc3NpYmxlIGppZmZpZXMgaW5jb25zaXN0ZW5jaWVzLCB3ZSBuZWVkIHRvIGNoZWNrCi0JICogdGhlIHJlc3VsdCBzbyB0aGF0IHdlJ2xsIGdldCBhIHRpbWVyIHRoYXQgaXMgbW9ub3RvbmljLgotCSAqLwotCWlmIChyZXMgPj0gVVNFQ1NfUEVSX0pJRkZZKQotCQlyZXMgPSBVU0VDU19QRVJfSklGRlkgLSAxOwotCi0JcmV0dXJuIHJlczsKLX0KLQotCi0vKgotICogQ2FjaGVkICIxLyhjbG9ja3MgcGVyIHVzZWMpICogMl4zMiIgdmFsdWUuCi0gKiBJdCBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIG9uY2UgZWFjaCBqaWZmeS4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FjaGVkX3F1b3RpZW50OwotCi0vKiBMYXN0IGppZmZ5IHdoZW4gY2FsaWJyYXRlX2RpdlhYX2dldHRpbWVvZmZzZXQoKSB3YXMgY2FsbGVkLiAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOwotCi0vKgotICogVGhpcyBpcyBtb3ZlZCBmcm9tIGRlYy90aW1lLmM6ZG9faW9hc2ljX2dldHRpbWVvZmZzZXQoKSBieSBNYWNpZWouCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGlicmF0ZV9kaXYzMl9nZXR0aW1lb2Zmc2V0KHZvaWQpCi17Ci0JdTMyIGNvdW50OwotCXVuc2lnbmVkIGxvbmcgcmVzLCB0bXA7Ci0JdW5zaWduZWQgbG9uZyBxdW90aWVudDsKLQotCXRtcCA9IGppZmZpZXM7Ci0KLQlxdW90aWVudCA9IGNhY2hlZF9xdW90aWVudDsKLQotCWlmIChsYXN0X2ppZmZpZXMgIT0gdG1wKSB7Ci0JCWxhc3RfamlmZmllcyA9IHRtcDsKLQkJaWYgKGxhc3RfamlmZmllcyAhPSAwKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHIwOwotCQkJZG9fZGl2NjRfMzIocjAsIHRpbWVyaGksIHRpbWVybG8sIHRtcCk7Ci0JCQlkb19kaXY2NF8zMihxdW90aWVudCwgVVNFQ1NfUEVSX0pJRkZZLAotCQkJCSAgICBVU0VDU19QRVJfSklGRllfRlJBQywgcjApOwotCQkJY2FjaGVkX3F1b3RpZW50ID0gcXVvdGllbnQ7Ci0JCX0KLQl9Ci0KLQkvKiBHZXQgbGFzdCB0aW1lciB0aWNrIGluIGFic29sdXRlIGtlcm5lbCB0aW1lICovCi0JY291bnQgPSBtaXBzX2hwdF9yZWFkKCk7Ci0KLQkvKiAuLiByZWxhdGl2ZSB0byBwcmV2aW91cyBqaWZmeSAoMzIgYml0cyBpcyBlbm91Z2gpICovCi0JY291bnQgLT0gdGltZXJsbzsKLQotCV9fYXNtX18oIm11bHR1ICAlMSwlMiIKLQkJOiAiPWgiIChyZXMpCi0JCTogInIiIChjb3VudCksICJyIiAocXVvdGllbnQpCi0JCTogImxvIiwgR0NDX1JFR19BQ0NVTSk7Ci0KLQkvKgotCSAqIER1ZSB0byBwb3NzaWJsZSBqaWZmaWVzIGluY29uc2lzdGVuY2llcywgd2UgbmVlZCB0byBjaGVjawotCSAqIHRoZSByZXN1bHQgc28gdGhhdCB3ZSdsbCBnZXQgYSB0aW1lciB0aGF0IGlzIG1vbm90b25pYy4KLQkgKi8KLQlpZiAocmVzID49IFVTRUNTX1BFUl9KSUZGWSkKLQkJcmVzID0gVVNFQ1NfUEVSX0pJRkZZIC0gMTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGlicmF0ZV9kaXY2NF9nZXR0aW1lb2Zmc2V0KHZvaWQpCi17Ci0JdTMyIGNvdW50OwotCXVuc2lnbmVkIGxvbmcgcmVzLCB0bXA7Ci0JdW5zaWduZWQgbG9uZyBxdW90aWVudDsKLQotCXRtcCA9IGppZmZpZXM7Ci0KLQlxdW90aWVudCA9IGNhY2hlZF9xdW90aWVudDsKLQotCWlmIChsYXN0X2ppZmZpZXMgIT0gdG1wKSB7Ci0JCWxhc3RfamlmZmllcyA9IHRtcDsKLQkJaWYgKGxhc3RfamlmZmllcykgewotCQkJdW5zaWduZWQgbG9uZyByMDsKLQkJCV9fYXNtX18oIi5zZXQJcHVzaFxuXHQiCi0JCQkJIi5zZXQJbWlwczNcblx0IgotCQkJCSJsd3UJJTAsJTNcblx0IgotCQkJCSJkc2xsMzIJJTEsJTIsMFxuXHQiCi0JCQkJIm9yCSUxLCUxLCUwXG5cdCIKLQkJCQkiZGRpdnUJJDAsJTEsJTRcblx0IgotCQkJCSJtZmxvCSUxXG5cdCIKLQkJCQkiZHNsbDMyCSUwLCU1LDBcblx0IgotCQkJCSJvcgklMCwlMCwlNlxuXHQiCi0JCQkJImRkaXZ1CSQwLCUwLCUxXG5cdCIKLQkJCQkibWZsbwklMFxuXHQiCi0JCQkJIi5zZXQJcG9wIgotCQkJCTogIj0mciIgKHF1b3RpZW50KSwgIj0mciIgKHIwKQotCQkJCTogInIiICh0aW1lcmhpKSwgIm0iICh0aW1lcmxvKSwKLQkJCQkgICJyIiAodG1wKSwgInIiIChVU0VDU19QRVJfSklGRlkpLAotCQkJCSAgInIiIChVU0VDU19QRVJfSklGRllfRlJBQykKLQkJCQk6ICJoaSIsICJsbyIsIEdDQ19SRUdfQUNDVU0pOwotCQkJY2FjaGVkX3F1b3RpZW50ID0gcXVvdGllbnQ7Ci0JCX0KLQl9Ci0KLQkvKiBHZXQgbGFzdCB0aW1lciB0aWNrIGluIGFic29sdXRlIGtlcm5lbCB0aW1lICovCi0JY291bnQgPSBtaXBzX2hwdF9yZWFkKCk7Ci0KLQkvKiAuLiByZWxhdGl2ZSB0byBwcmV2aW91cyBqaWZmeSAoMzIgYml0cyBpcyBlbm91Z2gpICovCi0JY291bnQgLT0gdGltZXJsbzsKLQotCV9fYXNtX18oIm11bHR1CSUxLCUyIgotCQk6ICI9aCIgKHJlcykKLQkJOiAiciIgKGNvdW50KSwgInIiIChxdW90aWVudCkKLQkJOiAibG8iLCBHQ0NfUkVHX0FDQ1VNKTsKLQotCS8qCi0JICogRHVlIHRvIHBvc3NpYmxlIGppZmZpZXMgaW5jb25zaXN0ZW5jaWVzLCB3ZSBuZWVkIHRvIGNoZWNrCi0JICogdGhlIHJlc3VsdCBzbyB0aGF0IHdlJ2xsIGdldCBhIHRpbWVyIHRoYXQgaXMgbW9ub3RvbmljLgotCSAqLwotCWlmIChyZXMgPj0gVVNFQ1NfUEVSX0pJRkZZKQotCQlyZXMgPSBVU0VDU19QRVJfSklGRlkgLSAxOwotCi0JcmV0dXJuIHJlczsKLX0KLQogCiAvKiBsYXN0IHRpbWUgd2hlbiB4dGltZSBhbmQgcnRjIGFyZSBzeW5jJ2VkIHVwICovCiBzdGF0aWMgbG9uZyBsYXN0X3J0Y191cGRhdGU7CkBAIC0zMzQsMTggKzE1MSwxMCBAQAogICovCiBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXVuc2lnbmVkIGxvbmcgajsKLQl1bnNpZ25lZCBpbnQgY291bnQ7Ci0KIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKIAotCWNvdW50ID0gbWlwc19ocHRfcmVhZCgpOwogCW1pcHNfdGltZXJfYWNrKCk7CiAKLQkvKiBVcGRhdGUgdGltZXJoaS90aW1lcmxvIGZvciBpbnRyYS1qaWZmeSBjYWxpYnJhdGlvbi4gKi8KLQl0aW1lcmhpICs9IGNvdW50IDwgdGltZXJsbzsJCQkvKiBXcmFwIGFyb3VuZCAqLwotCXRpbWVybG8gPSBjb3VudDsKLQogCS8qCiAJICogY2FsbCB0aGUgZ2VuZXJpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxpbmcKIAkgKi8KQEAgLTM2OCw0NyArMTc3LDYgQEAKIAkJfQogCX0KIAotCS8qCi0JICogSWYgamlmZmllcyBoYXMgb3ZlcmZsb3duIGluIHRoaXMgdGltZXJfaW50ZXJydXB0LCB3ZSBtdXN0Ci0JICogdXBkYXRlIHRoZSB0aW1lcltoaV0vW2xvXSB0byBtYWtlIGZhc3QgZ2V0dGltZW9mZnNldCBmdW5jcwotCSAqIHF1b3RpZW50IGNhbGMgc3RpbGwgdmFsaWQuIC1hcmNhCi0JICoKLQkgKiBUaGUgZmlyc3QgdGltZXIgaW50ZXJydXB0IGNvbWVzIGxhdGUgYXMgaW50ZXJydXB0cyBhcmUKLQkgKiBlbmFibGVkIGxvbmcgYWZ0ZXIgdGltZXJzIGFyZSBpbml0aWFsaXplZC4gIFRoZXJlZm9yZSB0aGUKLQkgKiBoaWdoIHByZWNpc2lvbiB0aW1lciBpcyBmYXN0LCBsZWFkaW5nIHRvIHdyb25nIGdldHRpbWVvZmZzZXQoKQotCSAqIGNhbGN1bGF0aW9ucy4gIFdlIGRlYWwgd2l0aCBpdCBieSBzZXR0aW5nIGl0IGJhc2VkIG9uIHRoZQotCSAqIG51bWJlciBvZiBpdHMgdGlja3MgYmV0d2VlbiB0aGUgc2Vjb25kIGFuZCB0aGUgdGhpcmQgaW50ZXJydXB0LgotCSAqIFRoYXQgaXMgc3RpbGwgc29tZXdoYXQgaW1wcmVjaXNlLCBidXQgaXQncyBhIGdvb2QgZXN0aW1hdGUuCi0JICogLS1tYWNybwotCSAqLwotCWogPSBqaWZmaWVzOwotCWlmIChqIDwgNCkgewotCQlzdGF0aWMgdW5zaWduZWQgaW50IHByZXZfY291bnQ7Ci0JCXN0YXRpYyBpbnQgaHB0X2luaXRpYWxpemVkOwotCi0JCXN3aXRjaCAoaikgewotCQljYXNlIDA6Ci0JCQl0aW1lcmhpID0gdGltZXJsbyA9IDA7Ci0JCQltaXBzX2hwdF9pbml0KGNvdW50KTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlwcmV2X2NvdW50ID0gY291bnQ7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJaWYgKCFocHRfaW5pdGlhbGl6ZWQpIHsKLQkJCQl1bnNpZ25lZCBpbnQgYzMgPSAzICogKGNvdW50IC0gcHJldl9jb3VudCk7Ci0KLQkJCQl0aW1lcmhpID0gMDsKLQkJCQl0aW1lcmxvID0gYzM7Ci0JCQkJbWlwc19ocHRfaW5pdChjb3VudCAtIGMzKTsKLQkJCQlocHRfaW5pdGlhbGl6ZWQgPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQogCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CiAKIAkvKgpAQCAtNDc2LDEyICsyNDQsMTEgQEAKICAqIDEpIGJvYXJkX3RpbWVfaW5pdCgpIC0KICAqIAlhKSAob3B0aW9uYWwpIHNldCB1cCBSVEMgcm91dGluZXMsCiAgKiAgICAgIGIpIChvcHRpb25hbCkgY2FsaWJyYXRlIGFuZCBzZXQgdGhlIG1pcHNfaHB0X2ZyZXF1ZW5jeQotICoJICAgIChvbmx5IG5lZWRlZCBpZiB5b3UgaW50ZW5kZWQgdG8gdXNlIGZpeGVkX3JhdGVfZ2V0dGltZW9mZnNldAotICoJICAgICBvciB1c2UgY3B1IGNvdW50ZXIgYXMgdGltZXIgaW50ZXJydXB0IHNvdXJjZSkKKyAqCSAgICAob25seSBuZWVkZWQgaWYgeW91IGludGVuZGVkIHRvIHVzZSBjcHUgY291bnRlciBhcyB0aW1lciBpbnRlcnJ1cHQKKyAqCSAgICAgc291cmNlKQogICogMikgc2V0dXAgeHRpbWUgYmFzZWQgb24gcnRjX21pcHNfZ2V0X3RpbWUoKS4KLSAqIDMpIGNob29zZSBhIGFwcHJvcHJpYXRlIGdldHRpbWVvZmZzZXQgcm91dGluZS4KLSAqIDQpIGNhbGN1bGF0ZSBhIGNvdXBsZSBvZiBjYWNoZWQgdmFyaWFibGVzIGZvciBsYXRlciB1c2FnZQotICogNSkgcGxhdF90aW1lcl9zZXR1cCgpIC0KKyAqIDMpIGNhbGN1bGF0ZSBhIGNvdXBsZSBvZiBjYWNoZWQgdmFyaWFibGVzIGZvciBsYXRlciB1c2FnZQorICogNCkgcGxhdF90aW1lcl9zZXR1cCgpIC0KICAqCWEpIChvcHRpb25hbCkgb3Zlci13cml0ZSBhbnkgY2hvaWNlcyBtYWRlIGFib3ZlIGJ5IHRpbWVfaW5pdCgpLgogICoJYikgbWFjaGluZSBzcGVjaWZpYyBjb2RlIHNob3VsZCBzZXR1cCB0aGUgdGltZXIgaXJxYWN0aW9uLgogICoJYykgZW5hYmxlIHRoZSB0aW1lciBpbnRlcnJ1cHQKQEAgLTQ5OSw4ICsyNjYsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBjYWxpYnJhdGVfaHB0KHZvaWQpCiB7Ci0JdTY0IGZyZXF1ZW5jeTsKLQl1MzIgaHB0X3N0YXJ0LCBocHRfZW5kLCBocHRfY291bnQsIGh6OworCWN5Y2xlX3QgZnJlcXVlbmN5LCBocHRfc3RhcnQsIGhwdF9lbmQsIGhwdF9jb3VudCwgaHo7CiAKIAljb25zdCBpbnQgbG9vcHMgPSBIWiAvIDEwOwogCWludCBsb2dfMl9sb29wcyA9IDA7CkBAIC01MjYsMjAgKzI5Miw0OSBAQAogCSAqIGR1cmluZyB0aGUgY2FsY3VsYXRlZCBudW1iZXIgb2YgcGVyaW9kcyBiZXR3ZWVuIHRpbWVyCiAJICogaW50ZXJydXB0cy4KIAkgKi8KLQlocHRfc3RhcnQgPSBtaXBzX2hwdF9yZWFkKCk7CisJaHB0X3N0YXJ0ID0gY2xvY2tzb3VyY2VfbWlwcy5yZWFkKCk7CiAJZG8gewogCQl3aGlsZSAobWlwc190aW1lcl9zdGF0ZSgpKTsKIAkJd2hpbGUgKCFtaXBzX3RpbWVyX3N0YXRlKCkpOwogCX0gd2hpbGUgKC0taSk7Ci0JaHB0X2VuZCA9IG1pcHNfaHB0X3JlYWQoKTsKKwlocHRfZW5kID0gY2xvY2tzb3VyY2VfbWlwcy5yZWFkKCk7CiAKLQlocHRfY291bnQgPSBocHRfZW5kIC0gaHB0X3N0YXJ0OworCWhwdF9jb3VudCA9IChocHRfZW5kIC0gaHB0X3N0YXJ0KSAmIGNsb2Nrc291cmNlX21pcHMubWFzazsKIAloeiA9IEhaOwotCWZyZXF1ZW5jeSA9ICh1NjQpaHB0X2NvdW50ICogKHU2NCloejsKKwlmcmVxdWVuY3kgPSBocHRfY291bnQgKiBoejsKIAogCXJldHVybiBmcmVxdWVuY3kgPj4gbG9nXzJfbG9vcHM7CiB9CiAKK3N0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9taXBzID0geworCS5uYW1lCQk9ICJNSVBTIiwKKwkubWFzawkJPSAweGZmZmZmZmZmLAorCS5pc19jb250aW51b3VzCT0gMSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X21pcHNfY2xvY2tzb3VyY2Uodm9pZCkKK3sKKwl1NjQgdGVtcDsKKwl1MzIgc2hpZnQ7CisKKwlpZiAoIW1pcHNfaHB0X2ZyZXF1ZW5jeSB8fCBjbG9ja3NvdXJjZV9taXBzLnJlYWQgPT0gbnVsbF9ocHRfcmVhZCkKKwkJcmV0dXJuOworCisJLyogQ2FsY2xhdGUgYSBzb21ld2hhdCByZWFzb25hYmxlIHJhdGluZyB2YWx1ZSAqLworCWNsb2Nrc291cmNlX21pcHMucmF0aW5nID0gMjAwICsgbWlwc19ocHRfZnJlcXVlbmN5IC8gMTAwMDAwMDA7CisJLyogRmluZCBhIHNoaWZ0IHZhbHVlICovCisJZm9yIChzaGlmdCA9IDMyOyBzaGlmdCA+IDA7IHNoaWZ0LS0pIHsKKwkJdGVtcCA9ICh1NjQpIE5TRUNfUEVSX1NFQyA8PCBzaGlmdDsKKwkJZG9fZGl2KHRlbXAsIG1pcHNfaHB0X2ZyZXF1ZW5jeSk7CisJCWlmICgodGVtcCA+PiAzMikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwljbG9ja3NvdXJjZV9taXBzLnNoaWZ0ID0gc2hpZnQ7CisJY2xvY2tzb3VyY2VfbWlwcy5tdWx0ID0gKHUzMil0ZW1wOworCisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX21pcHMpOworfQorCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAlpZiAoYm9hcmRfdGltZV9pbml0KQpAQCAtNTU1LDU5ICszNTAsMzYgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgICAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7CiAKIAkvKiBDaG9vc2UgYXBwcm9wcmlhdGUgaGlnaCBwcmVjaXNpb24gdGltZXIgcm91dGluZXMuICAqLwotCWlmICghY3B1X2hhc19jb3VudGVyICYmICFtaXBzX2hwdF9yZWFkKSB7CisJaWYgKCFjcHVfaGFzX2NvdW50ZXIgJiYgIWNsb2Nrc291cmNlX21pcHMucmVhZCkKIAkJLyogTm8gaGlnaCBwcmVjaXNpb24gdGltZXIgLS0gc29ycnkuICAqLwotCQltaXBzX2hwdF9yZWFkID0gbnVsbF9ocHRfcmVhZDsKLQkJbWlwc19ocHRfaW5pdCA9IG51bGxfaHB0X2luaXQ7Ci0JfSBlbHNlIGlmICghbWlwc19ocHRfZnJlcXVlbmN5ICYmICFtaXBzX3RpbWVyX3N0YXRlKSB7CisJCWNsb2Nrc291cmNlX21pcHMucmVhZCA9IG51bGxfaHB0X3JlYWQ7CisJZWxzZSBpZiAoIW1pcHNfaHB0X2ZyZXF1ZW5jeSAmJiAhbWlwc190aW1lcl9zdGF0ZSkgewogCQkvKiBBIGhpZ2ggcHJlY2lzaW9uIHRpbWVyIG9mIHVua25vd24gZnJlcXVlbmN5LiAgKi8KLQkJaWYgKCFtaXBzX2hwdF9yZWFkKSB7CisJCWlmICghY2xvY2tzb3VyY2VfbWlwcy5yZWFkKQogCQkJLyogTm8gZXh0ZXJuYWwgaGlnaCBwcmVjaXNpb24gdGltZXIgLS0gdXNlIFI0ay4gICovCi0JCQltaXBzX2hwdF9yZWFkID0gYzBfaHB0X3JlYWQ7Ci0JCQltaXBzX2hwdF9pbml0ID0gYzBfaHB0X2luaXQ7Ci0JCX0KLQotCQlpZiAoY3B1X2hhc19taXBzMzJyMSB8fCBjcHVfaGFzX21pcHMzMnIyIHx8Ci0JCSAgICAoY3VycmVudF9jcHVfZGF0YS5pc2FfbGV2ZWwgPT0gTUlQU19DUFVfSVNBX0kpIHx8Ci0JCSAgICAoY3VycmVudF9jcHVfZGF0YS5pc2FfbGV2ZWwgPT0gTUlQU19DUFVfSVNBX0lJKSkKLQkJCS8qCi0JCQkgKiBXZSBuZWVkIHRvIGNhbGlicmF0ZSB0aGUgY291bnRlciBidXQgd2UgZG9uJ3QgaGF2ZQotCQkJICogNjQtYml0IGRpdmlzaW9uLgotCQkJICovCi0JCQlkb19nZXR0aW1lb2Zmc2V0ID0gY2FsaWJyYXRlX2RpdjMyX2dldHRpbWVvZmZzZXQ7Ci0JCWVsc2UKLQkJCS8qCi0JCQkgKiBXZSBuZWVkIHRvIGNhbGlicmF0ZSB0aGUgY291bnRlciBidXQgd2UgKmRvKiBoYXZlCi0JCQkgKiA2NC1iaXQgZGl2aXNpb24uCi0JCQkgKi8KLQkJCWRvX2dldHRpbWVvZmZzZXQgPSBjYWxpYnJhdGVfZGl2NjRfZ2V0dGltZW9mZnNldDsKKwkJCWNsb2Nrc291cmNlX21pcHMucmVhZCA9IGMwX2hwdF9yZWFkOwogCX0gZWxzZSB7CiAJCS8qIFdlIGtub3cgY291bnRlciBmcmVxdWVuY3kuICBPciB3ZSBjYW4gZ2V0IGl0LiAgKi8KLQkJaWYgKCFtaXBzX2hwdF9yZWFkKSB7CisJCWlmICghY2xvY2tzb3VyY2VfbWlwcy5yZWFkKSB7CiAJCQkvKiBObyBleHRlcm5hbCBoaWdoIHByZWNpc2lvbiB0aW1lciAtLSB1c2UgUjRrLiAgKi8KLQkJCW1pcHNfaHB0X3JlYWQgPSBjMF9ocHRfcmVhZDsKKwkJCWNsb2Nrc291cmNlX21pcHMucmVhZCA9IGMwX2hwdF9yZWFkOwogCi0JCQlpZiAobWlwc190aW1lcl9zdGF0ZSkKLQkJCQltaXBzX2hwdF9pbml0ID0gYzBfaHB0X2luaXQ7Ci0JCQllbHNlIHsKKwkJCWlmICghbWlwc190aW1lcl9zdGF0ZSkgewogCQkJCS8qIE5vIGV4dGVybmFsIHRpbWVyIGludGVycnVwdCAtLSB1c2UgUjRrLiAgKi8KLQkJCQltaXBzX2hwdF9pbml0ID0gYzBfaHB0X3RpbWVyX2luaXQ7CiAJCQkJbWlwc190aW1lcl9hY2sgPSBjMF90aW1lcl9hY2s7CisJCQkJLyogQ2FsY3VsYXRlIGNhY2hlIHBhcmFtZXRlcnMuICAqLworCQkJCWN5Y2xlc19wZXJfamlmZnkgPQorCQkJCQkobWlwc19ocHRfZnJlcXVlbmN5ICsgSFogLyAyKSAvIEhaOworCQkJCS8qCisJCQkJICogVGhpcyBzZXRzIHVwIHRoZSBoaWdoIHByZWNpc2lvbgorCQkJCSAqIHRpbWVyIGZvciB0aGUgZmlyc3QgaW50ZXJydXB0LgorCQkJCSAqLworCQkJCWMwX2hwdF90aW1lcl9pbml0KCk7CiAJCQl9CiAJCX0KIAkJaWYgKCFtaXBzX2hwdF9mcmVxdWVuY3kpCiAJCQltaXBzX2hwdF9mcmVxdWVuY3kgPSBjYWxpYnJhdGVfaHB0KCk7CiAKLQkJZG9fZ2V0dGltZW9mZnNldCA9IGZpeGVkX3JhdGVfZ2V0dGltZW9mZnNldDsKLQotCQkvKiBDYWxjdWxhdGUgY2FjaGUgcGFyYW1ldGVycy4gICovCi0JCWN5Y2xlc19wZXJfamlmZnkgPSAobWlwc19ocHRfZnJlcXVlbmN5ICsgSFogLyAyKSAvIEhaOwotCi0JCS8qIHNsbDMyX3VzZWNzX3Blcl9jeWNsZSA9IDEwXjYgKiAyXjMyIC8gbWlwc19jb3VudGVyX2ZyZXEgICovCi0JCWRvX2RpdjY0XzMyKHNsbDMyX3VzZWNzX3Blcl9jeWNsZSwKLQkJCSAgICAxMDAwMDAwLCBtaXBzX2hwdF9mcmVxdWVuY3kgLyAyLAotCQkJICAgIG1pcHNfaHB0X2ZyZXF1ZW5jeSk7Ci0KIAkJLyogUmVwb3J0IHRoZSBoaWdoIHByZWNpc2lvbiB0aW1lciByYXRlIGZvciBhIHJlZmVyZW5jZS4gICovCiAJCXByaW50aygiVXNpbmcgJXUuJTAzdSBNSHogaGlnaCBwcmVjaXNpb24gdGltZXIuXG4iLAogCQkgICAgICAgKChtaXBzX2hwdF9mcmVxdWVuY3kgKyA1MDApIC8gMTAwMCkgLyAxMDAwLApAQCAtNjE4LDkgKzM5MCw2IEBACiAJCS8qIE5vIHRpbWVyIGludGVycnVwdCBhY2sgKGUuZy4gaTgyNTQpLiAgKi8KIAkJbWlwc190aW1lcl9hY2sgPSBudWxsX3RpbWVyX2FjazsKIAotCS8qIFRoaXMgc2V0cyB1cCB0aGUgaGlnaCBwcmVjaXNpb24gdGltZXIgZm9yIHRoZSBmaXJzdCBpbnRlcnJ1cHQuICAqLwotCW1pcHNfaHB0X2luaXQobWlwc19ocHRfcmVhZCgpKTsKLQogCS8qCiAJICogQ2FsbCBib2FyZCBzcGVjaWZpYyB0aW1lciBpbnRlcnJ1cHQgc2V0dXAuCiAJICoKQEAgLTYzMyw2ICs0MDIsOCBAQAogCSAqIGlzIG5vdCBpbnZva2VkIGFjY2lkZW50YWxseS4KIAkgKi8KIAlwbGF0X3RpbWVyX3NldHVwKCZ0aW1lcl9pcnFhY3Rpb24pOworCisJaW5pdF9taXBzX2Nsb2Nrc291cmNlKCk7CiB9CiAKICNkZWZpbmUgRkVCUlVBUlkJCTIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdG9wb2xvZ3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjBlNDRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90b3BvbG9neS5jCkBAIC0wLDAgKzEsMjkgQEAKKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdSwgY3B1X2RldmljZXMpOworCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworI2lmZGVmIENPTkZJR19OVU1BCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKKwkJcmVnaXN0ZXJfb25lX25vZGUoaSk7CisjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKKwkJcmV0ID0gcmVnaXN0ZXJfY3B1KCZwZXJfY3B1KGNwdV9kZXZpY2VzLCBpKSwgaSk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0b3BvbG9neV9pbml0OiByZWdpc3Rlcl9jcHUgJWQgIgorCQkJICAgICAgICJmYWlsZWQgKCVkKVxuIiwgaSwgcmV0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHRvcG9sb2d5X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCmluZGV4IGNjZTgzMTMuLjJhOTMyY2FkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC01NCw2ICs1NCw4IEBACiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9zeXModm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV9icCh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX3JpKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfcmlfcmRod3Jfdml2dCh2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX3JpX3JkaHdyKHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfY3B1KHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBoYW5kbGVfb3Yodm9pZCk7CiBleHRlcm4gYXNtbGlua2FnZSB2b2lkIGhhbmRsZV90cih2b2lkKTsKQEAgLTM5NywxOSArMzk5LDYgQEAKIAlmb3JjZV9zaWcoU0lHQlVTLCBjdXJyZW50KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZ2V0X2luc25fb3Bjb2RlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgKm9wY29kZSkKLXsKLQl1bnNpZ25lZCBpbnQgX191c2VyICplcGM7Ci0KLQllcGMgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKSByZWdzLT5jcDBfZXBjICsKLQkgICAgICAoKHJlZ3MtPmNwMF9jYXVzZSAmIENBVVNFRl9CRCkgIT0gMCk7Ci0JaWYgKCFnZXRfdXNlcigqb3Bjb2RlLCBlcGMpKQotCQlyZXR1cm4gMDsKLQotCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKLQlyZXR1cm4gMTsKLX0KLQogLyoKICAqIGxsL3NjIGVtdWxhdGlvbgogICovCkBAIC01NDQsOCArNTMzLDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlOwogCi0JaWYgKHVubGlrZWx5KGdldF9pbnNuX29wY29kZShyZWdzLCAmb3Bjb2RlKSkpCi0JCXJldHVybiAtRUZBVUxUOworCWlmIChnZXRfdXNlcihvcGNvZGUsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGV4Y2VwdGlvbl9lcGMocmVncykpKQorCQlnb3RvIG91dF9zaWdzZWd2OwogCiAJaWYgKChvcGNvZGUgJiBPUENPREUpID09IExMKSB7CiAJCXNpbXVsYXRlX2xsKHJlZ3MsIG9wY29kZSk7CkBAIC01NTcsNiArNTQ2LDEwIEBACiAJfQogCiAJcmV0dXJuIC1FRkFVTFQ7CQkJLyogU3RyYW5nZSB0aGluZ3MgZ29pbmcgb24gLi4uICovCisKK291dF9zaWdzZWd2OgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gLUVGQVVMVDsKIH0KIAogLyoKQEAgLTU2OSw4ICs1NjIsOCBAQAogCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0YXNrX3RocmVhZF9pbmZvKGN1cnJlbnQpOwogCXVuc2lnbmVkIGludCBvcGNvZGU7CiAKLQlpZiAodW5saWtlbHkoZ2V0X2luc25fb3Bjb2RlKHJlZ3MsICZvcGNvZGUpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGdldF91c2VyKG9wY29kZSwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgZXhjZXB0aW9uX2VwYyhyZWdzKSkpCisJCWdvdG8gb3V0X3NpZ3NlZ3Y7CiAKIAlpZiAodW5saWtlbHkoY29tcHV0ZV9yZXR1cm5fZXBjKHJlZ3MpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC01ODksNiArNTgyLDEwIEBACiAKIAkvKiBOb3Qgb3Vycy4gICovCiAJcmV0dXJuIC1FRkFVTFQ7CisKK291dF9zaWdzZWd2OgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gLUVGQVVMVDsKIH0KIAogYXNtbGlua2FnZSB2b2lkIGRvX292KHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtNjcyLDEwICs2NjksOCBAQAogCXVuc2lnbmVkIGludCBvcGNvZGUsIGJjb2RlOwogCXNpZ2luZm9fdCBpbmZvOwogCi0JZGllX2lmX2tlcm5lbCgiQnJlYWsgaW5zdHJ1Y3Rpb24gaW4ga2VybmVsIGNvZGUiLCByZWdzKTsKLQotCWlmIChnZXRfaW5zbl9vcGNvZGUocmVncywgJm9wY29kZSkpCi0JCXJldHVybjsKKwlpZiAoZ2V0X3VzZXIob3Bjb2RlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBleGNlcHRpb25fZXBjKHJlZ3MpKSkKKwkJZ290byBvdXRfc2lnc2VndjsKIAogCS8qCiAJICogVGhlcmUgaXMgdGhlIGFuY2llbnQgYnVnIGluIHRoZSBNSVBTIGFzc2VtYmxlcnMgdGhhdCB0aGUgYnJlYWsKQEAgLTY5Niw2ICs2OTEsNyBAQAogCXN3aXRjaCAoYmNvZGUpIHsKIAljYXNlIEJSS19PVkVSRkxPVyA8PCAxMDoKIAljYXNlIEJSS19ESVZaRVJPIDw8IDEwOgorCQlkaWVfaWZfa2VybmVsKCJCcmVhayBpbnN0cnVjdGlvbiBpbiBrZXJuZWwgY29kZSIsIHJlZ3MpOwogCQlpZiAoYmNvZGUgPT0gKEJSS19ESVZaRVJPIDw8IDEwKSkKIAkJCWluZm8uc2lfY29kZSA9IEZQRV9JTlRESVY7CiAJCWVsc2UKQEAgLTcwNSw5ICs3MDEsMTYgQEAKIAkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopIHJlZ3MtPmNwMF9lcGM7CiAJCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIGN1cnJlbnQpOwogCQlicmVhazsKKwljYXNlIEJSS19CVUc6CisJCWRpZSgiS2VybmVsIGJ1ZyBkZXRlY3RlZCIsIHJlZ3MpOworCQlicmVhazsKIAlkZWZhdWx0OgorCQlkaWVfaWZfa2VybmVsKCJCcmVhayBpbnN0cnVjdGlvbiBpbiBrZXJuZWwgY29kZSIsIHJlZ3MpOwogCQlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7CiAJfQorCitvdXRfc2lnc2VndjoKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiB9CiAKIGFzbWxpbmthZ2Ugdm9pZCBkb190cihzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTcxNSwxMCArNzE4LDggQEAKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlLCB0Y29kZSA9IDA7CiAJc2lnaW5mb190IGluZm87CiAKLQlkaWVfaWZfa2VybmVsKCJUcmFwIGluc3RydWN0aW9uIGluIGtlcm5lbCBjb2RlIiwgcmVncyk7Ci0KLQlpZiAoZ2V0X2luc25fb3Bjb2RlKHJlZ3MsICZvcGNvZGUpKQotCQlyZXR1cm47CisJaWYgKGdldF91c2VyKG9wY29kZSwgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgZXhjZXB0aW9uX2VwYyhyZWdzKSkpCisJCWdvdG8gb3V0X3NpZ3NlZ3Y7CiAKIAkvKiBJbW1lZGlhdGUgdmVyc2lvbnMgZG9uJ3QgcHJvdmlkZSBhIGNvZGUuICAqLwogCWlmICghKG9wY29kZSAmIE9QQ09ERSkpCkBAIC03MzMsNiArNzM0LDcgQEAKIAlzd2l0Y2ggKHRjb2RlKSB7CiAJY2FzZSBCUktfT1ZFUkZMT1c6CiAJY2FzZSBCUktfRElWWkVSTzoKKwkJZGllX2lmX2tlcm5lbCgiVHJhcCBpbnN0cnVjdGlvbiBpbiBrZXJuZWwgY29kZSIsIHJlZ3MpOwogCQlpZiAodGNvZGUgPT0gQlJLX0RJVlpFUk8pCiAJCQlpbmZvLnNpX2NvZGUgPSBGUEVfSU5URElWOwogCQllbHNlCkBAIC03NDIsOSArNzQ0LDE2IEBACiAJCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKSByZWdzLT5jcDBfZXBjOwogCQlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCBjdXJyZW50KTsKIAkJYnJlYWs7CisJY2FzZSBCUktfQlVHOgorCQlkaWUoIktlcm5lbCBidWcgZGV0ZWN0ZWQiLCByZWdzKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJZGllX2lmX2tlcm5lbCgiVHJhcCBpbnN0cnVjdGlvbiBpbiBrZXJuZWwgY29kZSIsIHJlZ3MpOwogCQlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7CiAJfQorCitvdXRfc2lnc2VndjoKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiB9CiAKIGFzbWxpbmthZ2Ugdm9pZCBkb19yaShzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTExMTEsNyArMTEyMCw3IEBACiBzdGF0aWMgdm9pZCBtaXBzX3Nyc19pbml0KHZvaWQpCiB7CiAJc2hhZG93X3JlZ2lzdGVycy5zcl9zdXBwb3J0ZWQgPSAoKHJlYWRfYzBfc3JzY3RsKCkgPj4gMjYpICYgMHgwZikgKyAxOwotCXByaW50ayhLRVJOX0lORk8gIiVkIE1JUFNSMiByZWdpc3RlciBzZXRzIGF2YWlsYWJsZVxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlbGQgTUlQU1IyIHJlZ2lzdGVyIHNldHMgYXZhaWxhYmxlXG4iLAogCSAgICAgICBzaGFkb3dfcmVnaXN0ZXJzLnNyX3N1cHBvcnRlZCk7CiAJc2hhZG93X3JlZ2lzdGVycy5zcl9hbGxvY2F0ZWQgPSAxOwkvKiBTZXQgMCB1c2VkIGJ5IGtlcm5lbCAqLwogfQpAQCAtMTQyMyw2ICsxNDMyLDE1IEBACiAJbWVtY3B5KCh2b2lkICopKHVuY2FjaGVkX2ViYXNlICsgb2Zmc2V0KSwgYWRkciwgc2l6ZSk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSByZGh3cl9ub29wdDsKK3N0YXRpYyBpbnQgX19pbml0IHNldF9yZGh3cl9ub29wdChjaGFyICpzdHIpCit7CisJcmRod3Jfbm9vcHQgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJyZGh3cl9ub29wdCIsIHNldF9yZGh3cl9ub29wdCk7CisKIHZvaWQgX19pbml0IHRyYXBfaW5pdCh2b2lkKQogewogCWV4dGVybiBjaGFyIGV4Y2VwdF92ZWMzX2dlbmVyaWMsIGV4Y2VwdF92ZWMzX3I0MDAwOwpAQCAtMTUwMiw3ICsxNTIwLDkgQEAKIAogCXNldF9leGNlcHRfdmVjdG9yKDgsIGhhbmRsZV9zeXMpOwogCXNldF9leGNlcHRfdmVjdG9yKDksIGhhbmRsZV9icCk7Ci0Jc2V0X2V4Y2VwdF92ZWN0b3IoMTAsIGhhbmRsZV9yaSk7CisJc2V0X2V4Y2VwdF92ZWN0b3IoMTAsIHJkaHdyX25vb3B0ID8gaGFuZGxlX3JpIDoKKwkJCSAgKGNwdV9oYXNfdnRhZ19pY2FjaGUgPworCQkJICAgaGFuZGxlX3JpX3JkaHdyX3ZpdnQgOiBoYW5kbGVfcmlfcmRod3IpKTsKIAlzZXRfZXhjZXB0X3ZlY3RvcigxMSwgaGFuZGxlX2NwdSk7CiAJc2V0X2V4Y2VwdF92ZWN0b3IoMTIsIGhhbmRsZV9vdik7CiAJc2V0X2V4Y2VwdF92ZWN0b3IoMTMsIGhhbmRsZV90cik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21pcHMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggMGJiOWNkOC4uY2VjZmYyNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNTAsNiArNTAsMTYgQEAKICAgLyogd3JpdGVhYmxlICovCiAgIC5kYXRhIDogewkJCS8qIERhdGEgKi8KICAgICAuID0gLiArIERBVEFPRkZTRVQ7CQkvKiBmb3IgQ09ORklHX01BUFBFRF9LRVJORUwgKi8KKyAgICAvKgorICAgICAqIFRoaXMgQUxJR04gaXMgbmVlZGVkIGFzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgYSBnY2MgYnVnIHVwdG8gNC4xIHdoaWNoCisgICAgICogbGltaXRzIHRoZSBtYXhpbXVtIGFsaWdubWVudCB0byBhdCBtb3N0IDMya0IgYW5kIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZworICAgICAqIHdhcm5pbmc6CisgICAgICoKKyAgICAgKiAgQ0MgICAgICBhcmNoL21pcHMva2VybmVsL2luaXRfdGFzay5vCisgICAgICogYXJjaC9taXBzL2tlcm5lbC9pbml0X3Rhc2suYzozMDogd2FybmluZzogYWxpZ25tZW50IG9mIOKAmGluaXRfdGhyZWFkX3VuaW9u4oCZCisgICAgICogaXMgZ3JlYXRlciB0aGFuIG1heGltdW0gb2JqZWN0IGZpbGUgYWxpZ25tZW50LiAgVXNpbmcgMzI3NjgKKyAgICAgKi8KKyAgICAuID0gQUxJR04oX1BBR0VfU0laRSk7CiAgICAgKiguZGF0YS5pbml0X3Rhc2spCiAKICAgICAqKC5kYXRhKQpAQCAtOTEsMTMgKzEwMSw3IEBACiAKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KQotCSooLmluaXRjYWxsMi5pbml0KQotCSooLmluaXRjYWxsMy5pbml0KQotCSooLmluaXRjYWxsNC5pbml0KQotCSooLmluaXRjYWxsNS5pbml0KQotCSooLmluaXRjYWxsNi5pbml0KQotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKIApAQCAtMTA4LDYgKzExMiw3IEBACiAgICAgLyogLmV4aXQudGV4dCBpcyBkaXNjYXJkZWQgYXQgcnVudGltZSwgbm90IGxpbmsgdGltZSwgdG8gZGVhbCB3aXRoCiAgICAgIHJlZmVyZW5jZXMgZnJvbSAucm9kYXRhICovCiAgIC5leGl0LnRleHQgOiB7ICooLmV4aXQudGV4dCkgfQorICAuZXhpdC5kYXRhIDogeyAqKC5leGl0LmRhdGEpIH0KICAgLiA9IEFMSUdOKF9QQUdFX1NJWkUpOwogICBfX2luaXRyYW1mc19zdGFydCA9IC47CiAgIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LnJhbWZzKSB9CkBAIC0xMzUsNyArMTQwLDYgQEAKIAogICAvKiBTZWN0aW9ucyB0byBiZSBkaXNjYXJkZWQgKi8KICAgL0RJU0NBUkQvIDogewotICAgICAgICAqKC5leGl0LmRhdGEpCiAgICAgICAgICooLmV4aXRjYWxsLmV4aXQpCiAKIAkvKiBBQkkgY3JhcCBzdGFydHMgaGVyZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKaW5kZXggNTFkZGQyMS4uNjY2YmVmNDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC92cGUuYwpAQCAtMTE3OSw3ICsxMTc5LDcgQEAKIAlzaXplX3QgcmV0ID0gY291bnQ7CiAJc3RydWN0IHZwZSAqdjsKIAotCW1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwltaW5vciA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAoKHYgPSBnZXRfdnBlKG1pbm9yKSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9sYXNhdC9pbnRlcnJ1cHQuYyBiL2FyY2gvbWlwcy9sYXNhdC9pbnRlcnJ1cHQuYwppbmRleCBhMTQ0YTAwLi4yYWZmYTVmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGFzYXQvaW50ZXJydXB0LmMKKysrIGIvYXJjaC9taXBzL2xhc2F0L2ludGVycnVwdC5jCkBAIC0zNiw0NyArMzYsMjAgQEAKIAogdm9pZCBkaXNhYmxlX2xhc2F0X2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJKmxhc2F0X2ludF9tYXNrICY9IH4oMSA8PCBpcnFfbnIpIDw8IGxhc2F0X2ludF9tYXNrX3NoaWZ0OwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogdm9pZCBlbmFibGVfbGFzYXRfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkqbGFzYXRfaW50X21hc2sgfD0gKDEgPDwgaXJxX25yKSA8PCBsYXNhdF9pbnRfbWFza19zaGlmdDsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9sYXNhdF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfbGFzYXRfaXJxKGlycSk7Ci0KLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi0jZGVmaW5lIHNodXRkb3duX2xhc2F0X2lycQlkaXNhYmxlX2xhc2F0X2lycQotCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19sYXNhdF9pcnEgZGlzYWJsZV9sYXNhdF9pcnEKLQotc3RhdGljIHZvaWQgZW5kX2xhc2F0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQotCQllbmFibGVfbGFzYXRfaXJxKGlycSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbGFzYXRfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkxhc2F0IiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfbGFzYXRfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2xhc2F0X2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2xhc2F0X2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfbGFzYXRfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfbGFzYXRfaXJxLAotCS5lbmQgPSBlbmRfbGFzYXRfaXJxLAorCS5hY2sgPSBkaXNhYmxlX2xhc2F0X2lycSwKKwkubWFzayA9IGRpc2FibGVfbGFzYXRfaXJxLAorCS5tYXNrX2FjayA9IGRpc2FibGVfbGFzYXRfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfbGFzYXRfaXJxLAogfTsKIAogc3RhdGljIGlubGluZSBpbnQgbHMxYml0MzIodW5zaWduZWQgaW50IHgpCkBAIC0xNTIsMTAgKzEyNSw2IEBACiAJCXBhbmljKCJhcmNoX2luaXRfaXJxOiBtaXBzX21hY2h0eXBlIGluY29ycmVjdCIpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPD0gTEFTQVRJTlRfRU5EOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzCT0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24JPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aAk9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAJPSAmbGFzYXRfaXJxX3R5cGU7Ci0JfQorCWZvciAoaSA9IDA7IGkgPD0gTEFTQVRJTlRfRU5EOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmbGFzYXRfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xhc2F0L3N5c2N0bC5jIGIvYXJjaC9taXBzL2xhc2F0L3N5c2N0bC5jCmluZGV4IDZkZDdhZTEuLjEyODc4MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9zeXNjdGwuYworKysgYi9hcmNoL21pcHMvbGFzYXQvc3lzY3RsLmMKQEAgLTQwLDEyICs0MCwxMiBAQAogLyogU3RyYXRlZ3kgZnVuY3Rpb24gdG8gd3JpdGUgRUVQUk9NIGFmdGVyIGNoYW5naW5nIHN0cmluZyBlbnRyeSAqLwogaW50IHN5c2N0bF9sYXNhdHN0cmluZyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgKm5hbWUsIGludCBubGVuLAogCQl2b2lkICpvbGR2YWwsIHNpemVfdCAqb2xkbGVucCwKLQkJdm9pZCAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCB2b2lkICoqY29udGV4dCkKKwkJdm9pZCAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWludCByOwogCW11dGV4X2xvY2soJmxhc2F0X2luZm9fbXV0ZXgpOwogCXIgPSBzeXNjdGxfc3RyaW5nKHRhYmxlLCBuYW1lLAotCQkJICBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuLCBjb250ZXh0KTsKKwkJCSAgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJaWYgKHIgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmbGFzYXRfaW5mb19tdXRleCk7CiAJCXJldHVybiByOwpAQCAtMTE5LDExICsxMTksMTEgQEAKIC8qIFN5c2N0bCBmb3Igc2V0dGluZyB0aGUgSVAgYWRkcmVzc2VzICovCiBpbnQgc3lzY3RsX2xhc2F0X2ludHZlYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgKm5hbWUsIGludCBubGVuLAogCQkgICAgdm9pZCAqb2xkdmFsLCBzaXplX3QgKm9sZGxlbnAsCi0JCSAgICB2b2lkICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorCQkgICAgdm9pZCAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWludCByOwogCW11dGV4X2xvY2soJmxhc2F0X2luZm9fbXV0ZXgpOwotCXIgPSBzeXNjdGxfaW50dmVjKHRhYmxlLCBuYW1lLCBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuLCBjb250ZXh0KTsKKwlyID0gc3lzY3RsX2ludHZlYyh0YWJsZSwgbmFtZSwgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJaWYgKHIgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmbGFzYXRfaW5mb19tdXRleCk7CiAJCXJldHVybiByOwpAQCAtMTM5LDE0ICsxMzksMTQgQEAKIC8qIFNhbWUgZm9yIFJUQyAqLwogaW50IHN5c2N0bF9sYXNhdF9ydGMoY3RsX3RhYmxlICp0YWJsZSwgaW50ICpuYW1lLCBpbnQgbmxlbiwKIAkJICAgIHZvaWQgKm9sZHZhbCwgc2l6ZV90ICpvbGRsZW5wLAotCQkgICAgdm9pZCAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCB2b2lkICoqY29udGV4dCkKKwkJICAgIHZvaWQgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKIAlpbnQgcjsKIAltdXRleF9sb2NrKCZsYXNhdF9pbmZvX211dGV4KTsKIAlydGN0bXAgPSBkczE2MDNfcmVhZCgpOwogCWlmIChydGN0bXAgPCAwKQogCQlydGN0bXAgPSAwOwotCXIgPSBzeXNjdGxfaW50dmVjKHRhYmxlLCBuYW1lLCBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuLCBjb250ZXh0KTsKKwlyID0gc3lzY3RsX2ludHZlYyh0YWJsZSwgbmFtZSwgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJaWYgKHIgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmbGFzYXRfaW5mb19tdXRleCk7CiAJCXJldHVybiByOwpAQCAtMjUxLDEzICsyNTEsMTIgQEAKIAogc3RhdGljIGludCBzeXNjdGxfbGFzYXRfZWVwcm9tX3ZhbHVlKGN0bF90YWJsZSAqdGFibGUsIGludCAqbmFtZSwgaW50IG5sZW4sCiAJCQkJICAgICB2b2lkICpvbGR2YWwsIHNpemVfdCAqb2xkbGVucCwKLQkJCQkgICAgIHZvaWQgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwKLQkJCQkgICAgIHZvaWQgKipjb250ZXh0KQorCQkJCSAgICAgdm9pZCAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWludCByOwogCiAJbXV0ZXhfbG9jaygmbGFzYXRfaW5mb19tdXRleCk7Ci0JciA9IHN5c2N0bF9pbnR2ZWModGFibGUsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4sIGNvbnRleHQpOworCXIgPSBzeXNjdGxfaW50dmVjKHRhYmxlLCBuYW1lLCBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuKTsKIAlpZiAociA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZsYXNhdF9pbmZvX211dGV4KTsKIAkJcmV0dXJuIHI7CkBAIC0yODYsMTEgKzI4NSwxMSBAQAogCQltdXRleF91bmxvY2soJmxhc2F0X2luZm9fbXV0ZXgpOwogCQlyZXR1cm4gcjsKIAl9Ci0JaWYgKGZpbHAgJiYgZmlscC0+Zl9kZW50cnkpCisJaWYgKGZpbHAgJiYgZmlscC0+Zl9wYXRoLmRlbnRyeSkKIAl7Ci0JCWlmICghc3RyY21wKGZpbHAtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwgInByaWQiKSkKKwkJaWYgKCFzdHJjbXAoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUsICJwcmlkIikpCiAJCQlsYXNhdF9ib2FyZF9pbmZvLmxpX2VlcHJvbV9pbmZvLnByaWQgPSBsYXNhdF9ib2FyZF9pbmZvLmxpX3ByaWQ7Ci0JCWlmICghc3RyY21wKGZpbHAtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwgImRlYnVnYWNjZXNzIikpCisJCWlmICghc3RyY21wKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLCAiZGVidWdhY2Nlc3MiKSkKIAkJCWxhc2F0X2JvYXJkX2luZm8ubGlfZWVwcm9tX2luZm8uZGVidWdhY2Nlc3MgPSBsYXNhdF9ib2FyZF9pbmZvLmxpX2RlYnVnYWNjZXNzOwogCX0KIAlsYXNhdF93cml0ZV9lZXByb21faW5mbygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi0zMi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9saWItMzIvTWFrZWZpbGUKaW5kZXggYWQyODU3OC4uZGNkNGQyZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xpYi0zMi9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbGliLTMyL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgTUlQUy1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLi4KICMKIAotbGliLXkJKz0gY3N1bV9wYXJ0aWFsLm8gbWVtc2V0Lm8gd2F0Y2gubworbGliLXkJKz0gbWVtc2V0Lm8gd2F0Y2gubwogCiBvYmotJChDT05GSUdfQ1BVX01JUFMzMikJKz0gZHVtcF90bGIubwogb2JqLSQoQ09ORklHX0NQVV9NSVBTNjQpCSs9IGR1bXBfdGxiLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWItMzIvY3N1bV9wYXJ0aWFsLlMgYi9hcmNoL21pcHMvbGliLTMyL2NzdW1fcGFydGlhbC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTI1N2RiLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9saWItMzIvY3N1bV9wYXJ0aWFsLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5OCBSYWxmIEJhZWNobGUKLSAqLwotI2luY2x1ZGUgPGFzbS9hc20uaD4KLSNpbmNsdWRlIDxhc20vcmVnZGVmLmg+Ci0KLSNkZWZpbmUgQUREQyhzdW0scmVnKQkJCVwKLQlhZGR1CXN1bSwgcmVnOwkJXAotCXNsdHUJdjEsIHN1bSwgcmVnOwkJXAotCWFkZHUJc3VtLCB2MQotCi0jZGVmaW5lIENTVU1fQklHQ0hVTksoc3JjLCBvZmZzZXQsIHN1bSwgdDAsIHQxLCB0MiwgdDMpIFwKLQlsdwl0MCwgKG9mZnNldCArIDB4MDApKHNyYyk7IFwKLQlsdwl0MSwgKG9mZnNldCArIDB4MDQpKHNyYyk7IFwKLQlsdwl0MiwgKG9mZnNldCArIDB4MDgpKHNyYyk7IFwKLQlsdwl0MywgKG9mZnNldCArIDB4MGMpKHNyYyk7IFwKLQlBRERDKHN1bSwgdDApOyAgICAgICAgICAgICAgICAgICAgXAotCUFEREMoc3VtLCB0MSk7ICAgICAgICAgICAgICAgICAgICBcCi0JQUREQyhzdW0sIHQyKTsgICAgICAgICAgICAgICAgICAgIFwKLQlBRERDKHN1bSwgdDMpOyAgICAgICAgICAgICAgICAgICAgXAotCWx3CXQwLCAob2Zmc2V0ICsgMHgxMCkoc3JjKTsgXAotCWx3CXQxLCAob2Zmc2V0ICsgMHgxNCkoc3JjKTsgXAotCWx3CXQyLCAob2Zmc2V0ICsgMHgxOCkoc3JjKTsgXAotCWx3CXQzLCAob2Zmc2V0ICsgMHgxYykoc3JjKTsgXAotCUFEREMoc3VtLCB0MCk7ICAgICAgICAgICAgICAgICAgICBcCi0JQUREQyhzdW0sIHQxKTsgICAgICAgICAgICAgICAgICAgIFwKLQlBRERDKHN1bSwgdDIpOyAgICAgICAgICAgICAgICAgICAgXAotCUFEREMoc3VtLCB0Myk7ICAgICAgICAgICAgICAgICAgICBcCi0KLS8qCi0gKiBhMDogc291cmNlIGFkZHJlc3MKLSAqIGExOiBsZW5ndGggb2YgdGhlIGFyZWEgdG8gY2hlY2tzdW0KLSAqIGEyOiBwYXJ0aWFsIGNoZWNrc3VtCi0gKi8KLQotI2RlZmluZSBzcmMgYTAKLSNkZWZpbmUgZGVzdCBhMQotI2RlZmluZSBzdW0gdjAKLQotCS50ZXh0Ci0JLnNldAlub3Jlb3JkZXIKLQotLyogdW5rbm93biBzcmMgYWxpZ25tZW50IGFuZCA8IDggYnl0ZXMgdG8gZ28gICovCi1zbWFsbF9jc3VtY3B5OgotCW1vdmUJYTEsIHQyCi0KLQlhbmRpCXQwLCBhMSwgNAotCWJlcXoJdDAsIDFmCi0JIGFuZGkJdDAsIGExLCAyCi0KLQkvKiBTdGlsbCBhIGZ1bGwgd29yZCB0byBnbyAgKi8KLQl1bHcJdDEsIChzcmMpCi0JYWRkaXUJc3JjLCA0Ci0JQUREQyhzdW0sIHQxKQotCi0xOgltb3ZlCXQxLCB6ZXJvCi0JYmVxegl0MCwgMWYKLQkgYW5kaQl0MCwgYTEsIDEKLQotCS8qIFN0aWxsIGEgaGFsZndvcmQgdG8gZ28gICovCi0JdWxodQl0MSwgKHNyYykKLQlhZGRpdQlzcmMsIDIKLQotMToJYmVxegl0MCwgMWYKLQkgc2xsCXQxLCB0MSwgMTYKLQotCWxidQl0MiwgKHNyYykKLQkgbm9wCi0KLSNpZmRlZiBfX01JUFNFQl9fCi0Jc2xsCXQyLCB0MiwgOAotI2VuZGlmCi0Jb3IJdDEsIHQyCi0KLTE6CUFEREMoc3VtLCB0MSkKLQotCS8qIGZvbGQgY2hlY2tzdW0gKi8KLQlzbGwJdjEsIHN1bSwgMTYKLQlhZGR1CXN1bSwgdjEKLQlzbHR1CXYxLCBzdW0sIHYxCi0Jc3JsCXN1bSwgc3VtLCAxNgotCWFkZHUJc3VtLCB2MQotCi0JLyogb2RkIGJ1ZmZlciBhbGlnbm1lbnQ/ICovCi0JYmVxegl0NywgMWYKLQkgbm9wCi0Jc2xsCXYxLCBzdW0sIDgKLQlzcmwJc3VtLCBzdW0sIDgKLQlvcglzdW0sIHYxCi0JYW5kaQlzdW0sIDB4ZmZmZgotMToKLQkuc2V0CXJlb3JkZXIKLQkvKiBBZGQgdGhlIHBhc3NlZCBwYXJ0aWFsIGNzdW0uICAqLwotCUFEREMoc3VtLCBhMikKLQlqcglyYQotCS5zZXQJbm9yZW9yZGVyCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCS5hbGlnbgk1Ci1MRUFGKGNzdW1fcGFydGlhbCkKLQltb3ZlCXN1bSwgemVybwotCW1vdmUJdDcsIHplcm8KLQotCXNsdGl1CXQ4LCBhMSwgMHg4Ci0JYm5legl0OCwgc21hbGxfY3N1bWNweQkJLyogPCA4IGJ5dGVzIHRvIGNvcHkgKi8KLQkgbW92ZQl0MiwgYTEKLQotCWJlcXoJYTEsIG91dAotCSBhbmRpCXQ3LCBzcmMsIDB4MQkJCS8qIG9kZCBidWZmZXI/ICovCi0KLWh3b3JkX2FsaWduOgotCWJlcXoJdDcsIHdvcmRfYWxpZ24KLQkgYW5kaQl0OCwgc3JjLCAweDIKLQotCWxidQl0MCwgKHNyYykKLQlzdWJ1CWExLCBhMSwgMHgxCi0jaWZkZWYgX19NSVBTRUxfXwotCXNsbAl0MCwgdDAsIDgKLSNlbmRpZgotCUFEREMoc3VtLCB0MCkKLQlhZGR1CXNyYywgc3JjLCAweDEKLQlhbmRpCXQ4LCBzcmMsIDB4MgotCi13b3JkX2FsaWduOgotCWJlcXoJdDgsIGR3b3JkX2FsaWduCi0JIHNsdGl1CXQ4LCBhMSwgNTYKLQotCWxodQl0MCwgKHNyYykKLQlzdWJ1CWExLCBhMSwgMHgyCi0JQUREQyhzdW0sIHQwKQotCXNsdGl1CXQ4LCBhMSwgNTYKLQlhZGR1CXNyYywgc3JjLCAweDIKLQotZHdvcmRfYWxpZ246Ci0JYm5legl0OCwgZG9fZW5kX3dvcmRzCi0JIG1vdmUJdDgsIGExCi0KLQlhbmRpCXQ4LCBzcmMsIDB4NAotCWJlcXoJdDgsIHF3b3JkX2FsaWduCi0JIGFuZGkJdDgsIHNyYywgMHg4Ci0KLQlsdwl0MCwgMHgwMChzcmMpCi0Jc3VidQlhMSwgYTEsIDB4NAotCUFEREMoc3VtLCB0MCkKLQlhZGR1CXNyYywgc3JjLCAweDQKLQlhbmRpCXQ4LCBzcmMsIDB4OAotCi1xd29yZF9hbGlnbjoKLQliZXF6CXQ4LCBvd29yZF9hbGlnbgotCSBhbmRpCXQ4LCBzcmMsIDB4MTAKLQotCWx3CXQwLCAweDAwKHNyYykKLQlsdwl0MSwgMHgwNChzcmMpCi0Jc3VidQlhMSwgYTEsIDB4OAotCUFEREMoc3VtLCB0MCkKLQlBRERDKHN1bSwgdDEpCi0JYWRkdQlzcmMsIHNyYywgMHg4Ci0JYW5kaQl0OCwgc3JjLCAweDEwCi0KLW93b3JkX2FsaWduOgotCWJlcXoJdDgsIGJlZ2luX21vdmVtZW50Ci0JIHNybAl0OCwgYTEsIDB4NwotCi0JbHcJdDMsIDB4MDgoc3JjKQotCWx3CXQ0LCAweDBjKHNyYykKLQlsdwl0MCwgMHgwMChzcmMpCi0JbHcJdDEsIDB4MDQoc3JjKQotCUFEREMoc3VtLCB0MykKLQlBRERDKHN1bSwgdDQpCi0JQUREQyhzdW0sIHQwKQotCUFEREMoc3VtLCB0MSkKLQlzdWJ1CWExLCBhMSwgMHgxMAotCWFkZHUJc3JjLCBzcmMsIDB4MTAKLQlzcmwJdDgsIGExLCAweDcKLQotYmVnaW5fbW92ZW1lbnQ6Ci0JYmVxegl0OCwgMWYKLQkgYW5kaQl0MiwgYTEsIDB4NDAKLQotbW92ZV8xMjhieXRlczoKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgwMCwgc3VtLCB0MCwgdDEsIHQzLCB0NCkKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgyMCwgc3VtLCB0MCwgdDEsIHQzLCB0NCkKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHg0MCwgc3VtLCB0MCwgdDEsIHQzLCB0NCkKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHg2MCwgc3VtLCB0MCwgdDEsIHQzLCB0NCkKLQlzdWJ1CXQ4LCB0OCwgMHgwMQotCWJuZXoJdDgsIG1vdmVfMTI4Ynl0ZXMKLQkgYWRkdQlzcmMsIHNyYywgMHg4MAotCi0xOgotCWJlcXoJdDIsIDFmCi0JIGFuZGkJdDIsIGExLCAweDIwCi0KLW1vdmVfNjRieXRlczoKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgwMCwgc3VtLCB0MCwgdDEsIHQzLCB0NCkKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgyMCwgc3VtLCB0MCwgdDEsIHQzLCB0NCkKLQlhZGR1CXNyYywgc3JjLCAweDQwCi0KLTE6Ci0JYmVxegl0MiwgZG9fZW5kX3dvcmRzCi0JIGFuZGkJdDgsIGExLCAweDFjCi0KLW1vdmVfMzJieXRlczoKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgwMCwgc3VtLCB0MCwgdDEsIHQzLCB0NCkKLQlhbmRpCXQ4LCBhMSwgMHgxYwotCWFkZHUJc3JjLCBzcmMsIDB4MjAKLQotZG9fZW5kX3dvcmRzOgotCWJlcXoJdDgsIG1heWJlX2VuZF9jcnVmdAotCSBzcmwJdDgsIHQ4LCAweDIKLQotZW5kX3dvcmRzOgotCWx3CXQwLCAoc3JjKQotCXN1YnUJdDgsIHQ4LCAweDEKLQlBRERDKHN1bSwgdDApCi0JYm5legl0OCwgZW5kX3dvcmRzCi0JIGFkZHUJc3JjLCBzcmMsIDB4NAotCi1tYXliZV9lbmRfY3J1ZnQ6Ci0JYW5kaQl0MiwgYTEsIDB4MwotCi1zbWFsbF9tZW1jcHk6Ci0gaiBzbWFsbF9jc3VtY3B5OyBtb3ZlIGExLCB0MgotCWJlcXoJdDIsIG91dAotCSBtb3ZlCWExLCB0MgotCi1lbmRfYnl0ZXM6Ci0JbGIJdDAsIChzcmMpCi0Jc3VidQlhMSwgYTEsIDB4MQotCWJuZXoJYTIsIGVuZF9ieXRlcwotCSBhZGR1CXNyYywgc3JjLCAweDEKLQotb3V0OgotCWpyCXJhCi0JIG1vdmUJdjAsIHN1bQotCUVORChjc3VtX3BhcnRpYWwpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliLTY0L01ha2VmaWxlIGIvYXJjaC9taXBzL2xpYi02NC9NYWtlZmlsZQppbmRleCBhZDI4NTc4Li5kY2Q0ZDJlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliLTY0L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9saWItNjQvTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciBNSVBTLXNwZWNpZmljIGxpYnJhcnkgZmlsZXMuLgogIwogCi1saWIteQkrPSBjc3VtX3BhcnRpYWwubyBtZW1zZXQubyB3YXRjaC5vCitsaWIteQkrPSBtZW1zZXQubyB3YXRjaC5vCiAKIG9iai0kKENPTkZJR19DUFVfTUlQUzMyKQkrPSBkdW1wX3RsYi5vCiBvYmotJChDT05GSUdfQ1BVX01JUFM2NCkJKz0gZHVtcF90bGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi02NC9jc3VtX3BhcnRpYWwuUyBiL2FyY2gvbWlwcy9saWItNjQvY3N1bV9wYXJ0aWFsLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YWJhNjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2xpYi02NC9jc3VtX3BhcnRpYWwuUworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogUXVpY2snbidkaXJ0eSBJUCBjaGVja3N1bSAuLi4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgUmFsZiBCYWVjaGxlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICovCi0jaW5jbHVkZSA8YXNtL2FzbS5oPgotI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KLQotI2RlZmluZSBBRERDKHN1bSxyZWcpCQkJCQkJXAotCWFkZHUJc3VtLCByZWc7CQkJCQlcCi0Jc2x0dQl2MSwgc3VtLCByZWc7CQkJCQlcCi0JYWRkdQlzdW0sIHYxCi0KLSNkZWZpbmUgQ1NVTV9CSUdDSFVOSyhzcmMsIG9mZnNldCwgc3VtLCB0MCwgdDEsIHQyLCB0MykJCVwKLQlsdwl0MCwgKG9mZnNldCArIDB4MDApKHNyYyk7CQkJXAotCWx3CXQxLCAob2Zmc2V0ICsgMHgwNCkoc3JjKTsJCQlcCi0JbHcJdDIsIChvZmZzZXQgKyAweDA4KShzcmMpOyAJCQlcCi0JbHcJdDMsIChvZmZzZXQgKyAweDBjKShzcmMpOyAJCQlcCi0JQUREQyhzdW0sIHQwKTsJCQkJCQlcCi0JQUREQyhzdW0sIHQxKTsJCQkJCQlcCi0JQUREQyhzdW0sIHQyKTsJCQkJCQlcCi0JQUREQyhzdW0sIHQzKTsJCQkJCQlcCi0JbHcJdDAsIChvZmZzZXQgKyAweDEwKShzcmMpOwkJCVwKLQlsdwl0MSwgKG9mZnNldCArIDB4MTQpKHNyYyk7CQkJXAotCWx3CXQyLCAob2Zmc2V0ICsgMHgxOCkoc3JjKTsJCQlcCi0JbHcJdDMsIChvZmZzZXQgKyAweDFjKShzcmMpOwkJCVwKLQlBRERDKHN1bSwgdDApOwkJCQkJCVwKLQlBRERDKHN1bSwgdDEpOwkJCQkJCVwKLQlBRERDKHN1bSwgdDIpOwkJCQkJCVwKLQlBRERDKHN1bSwgdDMpOwkJCQkJCVwKLQotLyoKLSAqIGEwOiBzb3VyY2UgYWRkcmVzcwotICogYTE6IGxlbmd0aCBvZiB0aGUgYXJlYSB0byBjaGVja3N1bQotICogYTI6IHBhcnRpYWwgY2hlY2tzdW0KLSAqLwotCi0jZGVmaW5lIHNyYyBhMAotI2RlZmluZSBzdW0gdjAKLQotCS50ZXh0Ci0JLnNldAlub3Jlb3JkZXIKLQotLyogdW5rbm93biBzcmMgYWxpZ25tZW50IGFuZCA8IDggYnl0ZXMgdG8gZ28gICovCi1zbWFsbF9jc3VtY3B5OgotCW1vdmUJYTEsIHRhMgotCi0JYW5kaQl0YTAsIGExLCA0Ci0JYmVxegl0YTAsIDFmCi0JIGFuZGkJdGEwLCBhMSwgMgotCi0JLyogU3RpbGwgYSBmdWxsIHdvcmQgdG8gZ28gICovCi0JdWx3CXRhMSwgKHNyYykKLQlkYWRkaXUJc3JjLCA0Ci0JQUREQyhzdW0sIHRhMSkKLQotMToJbW92ZQl0YTEsIHplcm8KLQliZXF6CXRhMCwgMWYKLQkgYW5kaQl0YTAsIGExLCAxCi0KLQkvKiBTdGlsbCBhIGhhbGZ3b3JkIHRvIGdvICAqLwotCXVsaHUJdGExLCAoc3JjKQotCWRhZGRpdQlzcmMsIDIKLQotMToJYmVxegl0YTAsIDFmCi0JIHNsbAl0YTEsIHRhMSwgMTYKLQotCWxidQl0YTIsIChzcmMpCi0JIG5vcAotCi0jaWZkZWYgX19NSVBTRUJfXwotCXNsbAl0YTIsIHRhMiwgOAotI2VuZGlmCi0Jb3IJdGExLCB0YTIKLQotMToJQUREQyhzdW0sIHRhMSkKLQotCS8qIGZvbGQgY2hlY2tzdW0gKi8KLQlzbGwJdjEsIHN1bSwgMTYKLQlhZGR1CXN1bSwgdjEKLQlzbHR1CXYxLCBzdW0sIHYxCi0Jc3JsCXN1bSwgc3VtLCAxNgotCWFkZHUJc3VtLCB2MQotCi0JLyogb2RkIGJ1ZmZlciBhbGlnbm1lbnQ/ICovCi0JYmVxegl0MywgMWYKLQkgbm9wCi0Jc2xsCXYxLCBzdW0sIDgKLQlzcmwJc3VtLCBzdW0sIDgKLQlvcglzdW0sIHYxCi0JYW5kaQlzdW0sIDB4ZmZmZgotMToKLQkuc2V0CXJlb3JkZXIKLQkvKiBBZGQgdGhlIHBhc3NlZCBwYXJ0aWFsIGNzdW0uICAqLwotCUFEREMoc3VtLCBhMikKLQlqcglyYQotCS5zZXQJbm9yZW9yZGVyCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCS5hbGlnbgk1Ci1MRUFGKGNzdW1fcGFydGlhbCkKLQltb3ZlCXN1bSwgemVybwotCW1vdmUJdDMsIHplcm8KLQotCXNsdGl1CXQ4LCBhMSwgMHg4Ci0JYm5legl0OCwgc21hbGxfY3N1bWNweQkJLyogPCA4IGJ5dGVzIHRvIGNvcHkgKi8KLQkgbW92ZQl0YTIsIGExCi0KLQliZXF6CWExLCBvdXQKLQkgYW5kaQl0Mywgc3JjLCAweDEJCQkvKiBvZGQgYnVmZmVyPyAqLwotCi1od29yZF9hbGlnbjoKLQliZXF6CXQzLCB3b3JkX2FsaWduCi0JIGFuZGkJdDgsIHNyYywgMHgyCi0KLQlsYnUJdGEwLCAoc3JjKQotCWRzdWJ1CWExLCBhMSwgMHgxCi0jaWZkZWYgX19NSVBTRUxfXwotCXNsbAl0YTAsIHRhMCwgOAotI2VuZGlmCi0JQUREQyhzdW0sIHRhMCkKLQlkYWRkdQlzcmMsIHNyYywgMHgxCi0JYW5kaQl0OCwgc3JjLCAweDIKLQotd29yZF9hbGlnbjoKLQliZXF6CXQ4LCBkd29yZF9hbGlnbgotCSBzbHRpdQl0OCwgYTEsIDU2Ci0KLQlsaHUJdGEwLCAoc3JjKQotCWRzdWJ1CWExLCBhMSwgMHgyCi0JQUREQyhzdW0sIHRhMCkKLQlzbHRpdQl0OCwgYTEsIDU2Ci0JZGFkZHUJc3JjLCBzcmMsIDB4MgotCi1kd29yZF9hbGlnbjoKLQlibmV6CXQ4LCBkb19lbmRfd29yZHMKLQkgbW92ZQl0OCwgYTEKLQotCWFuZGkJdDgsIHNyYywgMHg0Ci0JYmVxegl0OCwgcXdvcmRfYWxpZ24KLQkgYW5kaQl0OCwgc3JjLCAweDgKLQotCWx3CXRhMCwgMHgwMChzcmMpCi0JZHN1YnUJYTEsIGExLCAweDQKLQlBRERDKHN1bSwgdGEwKQotCWRhZGR1CXNyYywgc3JjLCAweDQKLQlhbmRpCXQ4LCBzcmMsIDB4OAotCi1xd29yZF9hbGlnbjoKLQliZXF6CXQ4LCBvd29yZF9hbGlnbgotCSBhbmRpCXQ4LCBzcmMsIDB4MTAKLQotCWx3CXRhMCwgMHgwMChzcmMpCi0JbHcJdGExLCAweDA0KHNyYykKLQlkc3VidQlhMSwgYTEsIDB4OAotCUFEREMoc3VtLCB0YTApCi0JQUREQyhzdW0sIHRhMSkKLQlkYWRkdQlzcmMsIHNyYywgMHg4Ci0JYW5kaQl0OCwgc3JjLCAweDEwCi0KLW93b3JkX2FsaWduOgotCWJlcXoJdDgsIGJlZ2luX21vdmVtZW50Ci0JIGRzcmwJdDgsIGExLCAweDcKLQotCWx3CXRhMywgMHgwOChzcmMpCi0JbHcJdDAsIDB4MGMoc3JjKQotCWx3CXRhMCwgMHgwMChzcmMpCi0JbHcJdGExLCAweDA0KHNyYykKLQlBRERDKHN1bSwgdGEzKQotCUFEREMoc3VtLCB0MCkKLQlBRERDKHN1bSwgdGEwKQotCUFEREMoc3VtLCB0YTEpCi0JZHN1YnUJYTEsIGExLCAweDEwCi0JZGFkZHUJc3JjLCBzcmMsIDB4MTAKLQlkc3JsCXQ4LCBhMSwgMHg3Ci0KLWJlZ2luX21vdmVtZW50OgotCWJlcXoJdDgsIDFmCi0JIGFuZGkJdGEyLCBhMSwgMHg0MAotCi1tb3ZlXzEyOGJ5dGVzOgotCUNTVU1fQklHQ0hVTksoc3JjLCAweDAwLCBzdW0sIHRhMCwgdGExLCB0YTMsIHQwKQotCUNTVU1fQklHQ0hVTksoc3JjLCAweDIwLCBzdW0sIHRhMCwgdGExLCB0YTMsIHQwKQotCUNTVU1fQklHQ0hVTksoc3JjLCAweDQwLCBzdW0sIHRhMCwgdGExLCB0YTMsIHQwKQotCUNTVU1fQklHQ0hVTksoc3JjLCAweDYwLCBzdW0sIHRhMCwgdGExLCB0YTMsIHQwKQotCWRzdWJ1CXQ4LCB0OCwgMHgwMQotCWJuZXoJdDgsIG1vdmVfMTI4Ynl0ZXMKLQkgZGFkZHUJc3JjLCBzcmMsIDB4ODAKLQotMToKLQliZXF6CXRhMiwgMWYKLQkgYW5kaQl0YTIsIGExLCAweDIwCi0KLW1vdmVfNjRieXRlczoKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgwMCwgc3VtLCB0YTAsIHRhMSwgdGEzLCB0MCkKLQlDU1VNX0JJR0NIVU5LKHNyYywgMHgyMCwgc3VtLCB0YTAsIHRhMSwgdGEzLCB0MCkKLQlkYWRkdQlzcmMsIHNyYywgMHg0MAotCi0xOgotCWJlcXoJdGEyLCBkb19lbmRfd29yZHMKLQkgYW5kaQl0OCwgYTEsIDB4MWMKLQotbW92ZV8zMmJ5dGVzOgotCUNTVU1fQklHQ0hVTksoc3JjLCAweDAwLCBzdW0sIHRhMCwgdGExLCB0YTMsIHQwKQotCWFuZGkJdDgsIGExLCAweDFjCi0JZGFkZHUJc3JjLCBzcmMsIDB4MjAKLQotZG9fZW5kX3dvcmRzOgotCWJlcXoJdDgsIG1heWJlX2VuZF9jcnVmdAotCSBkc3JsCXQ4LCB0OCwgMHgyCi0KLWVuZF93b3JkczoKLQlsdwl0YTAsIChzcmMpCi0JZHN1YnUJdDgsIHQ4LCAweDEKLQlBRERDKHN1bSwgdGEwKQotCWJuZXoJdDgsIGVuZF93b3JkcwotCSBkYWRkdQlzcmMsIHNyYywgMHg0Ci0KLW1heWJlX2VuZF9jcnVmdDoKLQlhbmRpCXRhMiwgYTEsIDB4MwotCi1zbWFsbF9tZW1jcHk6Ci0gaiBzbWFsbF9jc3VtY3B5OyBtb3ZlIGExLCB0YTIJCS8qIFhYWCA/Pz8gKi8KLQliZXF6CXQyLCBvdXQKLQkgbW92ZQlhMSwgdGEyCi0KLWVuZF9ieXRlczoKLQlsYgl0YTAsIChzcmMpCi0JZHN1YnUJYTEsIGExLCAweDEKLQlibmV6CWEyLCBlbmRfYnl0ZXMKLQkgZGFkZHUJc3JjLCBzcmMsIDB4MQotCi1vdXQ6Ci0JanIJcmEKLQkgbW92ZQl2MCwgc3VtCi0JRU5EKGNzdW1fcGFydGlhbCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWItNjQvZHVtcF90bGIuYyBiL2FyY2gvbWlwcy9saWItNjQvZHVtcF90bGIuYwppbmRleCBiZTgyNjFiLi41OTRkZjFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliLTY0L2R1bXBfdGxiLmMKKysrIGIvYXJjaC9taXBzL2xpYi02NC9kdW1wX3RsYi5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAlwcmludGsoIkFkZHIgICAgICAgICAgICAgICAgID09ICUwOGx4XG4iLCBhZGRyKTsKIAlwcmludGsoInRhc2tzLT5tbS5wZ2QgICAgICAgID09ICUwOGx4XG4iLCAodW5zaWduZWQgbG9uZykgdC0+bW0tPnBnZCk7CiAKLQlwYWdlX2RpciA9IHBnZF9vZmZzZXQodC0+bW0sIDApOworCXBhZ2VfZGlyID0gcGdkX29mZnNldCh0LT5tbSwgMFVMKTsKIAlwcmludGsoInBhZ2VfZGlyID09ICUwMTZseFxuIiwgKHVuc2lnbmVkIGxvbmcpIHBhZ2VfZGlyKTsKIAogCXBnZCA9IHBnZF9vZmZzZXQodC0+bW0sIGFkZHIpOwpAQCAtMTg0LDEzICsxODQsMTMgQEAKIAlkdW1wX2xpc3RfcHJvY2VzcyhjdXJyZW50LCBhZGRyZXNzKTsKIH0KIAotdW5zaWduZWQgaW50IHZ0b3Aodm9pZCAqYWRkcmVzcykKK3Vuc2lnbmVkIGxvbmcgdnRvcCh2b2lkICphZGRyZXNzKQogewogCXBnZF90CSpwZ2Q7CiAJcHVkX3QJKnB1ZDsKIAlwbWRfdAkqcG1kOwogCXB0ZV90CSpwdGU7Ci0JdW5zaWduZWQgaW50IGFkZHIsIHBhZGRyOworCXVuc2lnbmVkIGxvbmcgYWRkciwgcGFkZHI7CiAKIAlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJlc3M7CiAJcGdkID0gcGdkX29mZnNldChjdXJyZW50LT5tbSwgYWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL01ha2VmaWxlIGIvYXJjaC9taXBzL2xpYi9NYWtlZmlsZQppbmRleCBiMjI1NTQzLi44ODhiNjFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9saWIvTWFrZWZpbGUKQEAgLTIsOCArMiw4IEBACiAjIE1ha2VmaWxlIGZvciBNSVBTLXNwZWNpZmljIGxpYnJhcnkgZmlsZXMuLgogIwogCi1saWIteQkrPSBjc3VtX3BhcnRpYWxfY29weS5vIG1lbWNweS5vIHByb21saWIubyBzdHJsZW5fdXNlci5vIHN0cm5jcHlfdXNlci5vIFwKLQkgICBzdHJubGVuX3VzZXIubyB1bmNhY2hlZC5vCitsaWIteQkrPSBjc3VtX3BhcnRpYWwubyBjc3VtX3BhcnRpYWxfY29weS5vIG1lbWNweS5vIHByb21saWIubyBcCisJICAgc3RybGVuX3VzZXIubyBzdHJuY3B5X3VzZXIubyBzdHJubGVuX3VzZXIubyB1bmNhY2hlZC5vCiAKIG9iai15CSs9IGlvbWFwLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWwuUyBiL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiMzU3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsLlMKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBRdWljayduJ2RpcnR5IElQIGNoZWNrc3VtIC4uLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKi8KKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorCisjaWZkZWYgQ09ORklHXzY0QklUCisvKgorICogQXMgd2UgYXJlIHNoYXJpbmcgY29kZSBiYXNlIHdpdGggdGhlIG1pcHMzMiB0cmVlICh3aGljaCB1c2UgdGhlIG8zMiBBQkkKKyAqIHJlZ2lzdGVyIGRlZmluaXRpb25zKS4gV2UgbmVlZCB0byByZWRlZmluZSB0aGUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZnJvbQorICogdGhlIG42NCBBQkkgcmVnaXN0ZXIgbmFtaW5nIHRvIHRoZSBvMzIgQUJJIHJlZ2lzdGVyIG5hbWluZy4KKyAqLworI3VuZGVmIHQwCisjdW5kZWYgdDEKKyN1bmRlZiB0MgorI3VuZGVmIHQzCisjZGVmaW5lIHQwCSQ4CisjZGVmaW5lIHQxCSQ5CisjZGVmaW5lIHQyCSQxMAorI2RlZmluZSB0MwkkMTEKKyNkZWZpbmUgdDQJJDEyCisjZGVmaW5lIHQ1CSQxMworI2RlZmluZSB0NgkkMTQKKyNkZWZpbmUgdDcJJDE1CisKKyNkZWZpbmUgVVNFX0RPVUJMRQorI2VuZGlmCisKKyNpZmRlZiBVU0VfRE9VQkxFCisKKyNkZWZpbmUgTE9BRCAgIGxkCisjZGVmaW5lIEFERCAgICBkYWRkdQorI2RlZmluZSBOQllURVMgOAorCisjZWxzZQorCisjZGVmaW5lIExPQUQgICBsdworI2RlZmluZSBBREQgICAgYWRkdQorI2RlZmluZSBOQllURVMgNAorCisjZW5kaWYgLyogVVNFX0RPVUJMRSAqLworCisjZGVmaW5lIFVOSVQodW5pdCkgICgodW5pdCkqTkJZVEVTKQorCisjZGVmaW5lIEFEREMoc3VtLHJlZykJCQkJCQlcCisJQURECXN1bSwgcmVnOwkJCQkJXAorCXNsdHUJdjEsIHN1bSwgcmVnOwkJCQkJXAorCUFERAlzdW0sIHYxCisKKyNkZWZpbmUgQ1NVTV9CSUdDSFVOSzEoc3JjLCBvZmZzZXQsIHN1bSwgX3QwLCBfdDEsIF90MiwgX3QzKQlcCisJTE9BRAlfdDAsIChvZmZzZXQgKyBVTklUKDApKShzcmMpOwkJCVwKKwlMT0FECV90MSwgKG9mZnNldCArIFVOSVQoMSkpKHNyYyk7CQkJXAorCUxPQUQJX3QyLCAob2Zmc2V0ICsgVU5JVCgyKSkoc3JjKTsgCQkJXAorCUxPQUQJX3QzLCAob2Zmc2V0ICsgVU5JVCgzKSkoc3JjKTsgCQkJXAorCUFEREMoc3VtLCBfdDApOwkJCQkJCVwKKwlBRERDKHN1bSwgX3QxKTsJCQkJCQlcCisJQUREQyhzdW0sIF90Mik7CQkJCQkJXAorCUFEREMoc3VtLCBfdDMpCisKKyNpZmRlZiBVU0VfRE9VQkxFCisjZGVmaW5lIENTVU1fQklHQ0hVTksoc3JjLCBvZmZzZXQsIHN1bSwgX3QwLCBfdDEsIF90MiwgX3QzKQlcCisJQ1NVTV9CSUdDSFVOSzEoc3JjLCBvZmZzZXQsIHN1bSwgX3QwLCBfdDEsIF90MiwgX3QzKQorI2Vsc2UKKyNkZWZpbmUgQ1NVTV9CSUdDSFVOSyhzcmMsIG9mZnNldCwgc3VtLCBfdDAsIF90MSwgX3QyLCBfdDMpCVwKKwlDU1VNX0JJR0NIVU5LMShzcmMsIG9mZnNldCwgc3VtLCBfdDAsIF90MSwgX3QyLCBfdDMpOwlcCisJQ1NVTV9CSUdDSFVOSzEoc3JjLCBvZmZzZXQgKyAweDEwLCBzdW0sIF90MCwgX3QxLCBfdDIsIF90MykKKyNlbmRpZgorCisvKgorICogYTA6IHNvdXJjZSBhZGRyZXNzCisgKiBhMTogbGVuZ3RoIG9mIHRoZSBhcmVhIHRvIGNoZWNrc3VtCisgKiBhMjogcGFydGlhbCBjaGVja3N1bQorICovCisKKyNkZWZpbmUgc3JjIGEwCisjZGVmaW5lIHN1bSB2MAorCisJLnRleHQKKwkuc2V0CW5vcmVvcmRlcgorCS5hbGlnbgk1CitMRUFGKGNzdW1fcGFydGlhbCkKKwltb3ZlCXN1bSwgemVybworCW1vdmUJdDcsIHplcm8KKworCXNsdGl1CXQ4LCBhMSwgMHg4CisJYm5legl0OCwgc21hbGxfY3N1bWNweQkJLyogPCA4IGJ5dGVzIHRvIGNvcHkgKi8KKwkgbW92ZQl0MiwgYTEKKworCWFuZGkJdDcsIHNyYywgMHgxCQkJLyogb2RkIGJ1ZmZlcj8gKi8KKworaHdvcmRfYWxpZ246CisJYmVxegl0Nywgd29yZF9hbGlnbgorCSBhbmRpCXQ4LCBzcmMsIDB4MgorCisJbGJ1CXQwLCAoc3JjKQorCUxPTkdfU1VCVQlhMSwgYTEsIDB4MQorI2lmZGVmIF9fTUlQU0VMX18KKwlzbGwJdDAsIHQwLCA4CisjZW5kaWYKKwlBRERDKHN1bSwgdDApCisJUFRSX0FERFUJc3JjLCBzcmMsIDB4MQorCWFuZGkJdDgsIHNyYywgMHgyCisKK3dvcmRfYWxpZ246CisJYmVxegl0OCwgZHdvcmRfYWxpZ24KKwkgc2x0aXUJdDgsIGExLCA1NgorCisJbGh1CXQwLCAoc3JjKQorCUxPTkdfU1VCVQlhMSwgYTEsIDB4MgorCUFEREMoc3VtLCB0MCkKKwlzbHRpdQl0OCwgYTEsIDU2CisJUFRSX0FERFUJc3JjLCBzcmMsIDB4MgorCitkd29yZF9hbGlnbjoKKwlibmV6CXQ4LCBkb19lbmRfd29yZHMKKwkgbW92ZQl0OCwgYTEKKworCWFuZGkJdDgsIHNyYywgMHg0CisJYmVxegl0OCwgcXdvcmRfYWxpZ24KKwkgYW5kaQl0OCwgc3JjLCAweDgKKworCWx3CXQwLCAweDAwKHNyYykKKwlMT05HX1NVQlUJYTEsIGExLCAweDQKKwlBRERDKHN1bSwgdDApCisJUFRSX0FERFUJc3JjLCBzcmMsIDB4NAorCWFuZGkJdDgsIHNyYywgMHg4CisKK3F3b3JkX2FsaWduOgorCWJlcXoJdDgsIG93b3JkX2FsaWduCisJIGFuZGkJdDgsIHNyYywgMHgxMAorCisjaWZkZWYgVVNFX0RPVUJMRQorCWxkCXQwLCAweDAwKHNyYykKKwlMT05HX1NVQlUJYTEsIGExLCAweDgKKwlBRERDKHN1bSwgdDApCisjZWxzZQorCWx3CXQwLCAweDAwKHNyYykKKwlsdwl0MSwgMHgwNChzcmMpCisJTE9OR19TVUJVCWExLCBhMSwgMHg4CisJQUREQyhzdW0sIHQwKQorCUFEREMoc3VtLCB0MSkKKyNlbmRpZgorCVBUUl9BRERVCXNyYywgc3JjLCAweDgKKwlhbmRpCXQ4LCBzcmMsIDB4MTAKKworb3dvcmRfYWxpZ246CisJYmVxegl0OCwgYmVnaW5fbW92ZW1lbnQKKwkgTE9OR19TUkwJdDgsIGExLCAweDcKKworI2lmZGVmIFVTRV9ET1VCTEUKKwlsZAl0MCwgMHgwMChzcmMpCisJbGQJdDEsIDB4MDgoc3JjKQorCUFEREMoc3VtLCB0MCkKKwlBRERDKHN1bSwgdDEpCisjZWxzZQorCUNTVU1fQklHQ0hVTksxKHNyYywgMHgwMCwgc3VtLCB0MCwgdDEsIHQzLCB0NCkKKyNlbmRpZgorCUxPTkdfU1VCVQlhMSwgYTEsIDB4MTAKKwlQVFJfQUREVQlzcmMsIHNyYywgMHgxMAorCUxPTkdfU1JMCXQ4LCBhMSwgMHg3CisKK2JlZ2luX21vdmVtZW50OgorCWJlcXoJdDgsIDFmCisJIGFuZGkJdDIsIGExLCAweDQwCisKK21vdmVfMTI4Ynl0ZXM6CisJQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MDAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCisJQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MjAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCisJQ1NVTV9CSUdDSFVOSyhzcmMsIDB4NDAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCisJQ1NVTV9CSUdDSFVOSyhzcmMsIDB4NjAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCisJTE9OR19TVUJVCXQ4LCB0OCwgMHgwMQorCWJuZXoJdDgsIG1vdmVfMTI4Ynl0ZXMKKwkgUFRSX0FERFUJc3JjLCBzcmMsIDB4ODAKKworMToKKwliZXF6CXQyLCAxZgorCSBhbmRpCXQyLCBhMSwgMHgyMAorCittb3ZlXzY0Ynl0ZXM6CisJQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MDAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCisJQ1NVTV9CSUdDSFVOSyhzcmMsIDB4MjAsIHN1bSwgdDAsIHQxLCB0MywgdDQpCisJUFRSX0FERFUJc3JjLCBzcmMsIDB4NDAKKworMToKKwliZXF6CXQyLCBkb19lbmRfd29yZHMKKwkgYW5kaQl0OCwgYTEsIDB4MWMKKworbW92ZV8zMmJ5dGVzOgorCUNTVU1fQklHQ0hVTksoc3JjLCAweDAwLCBzdW0sIHQwLCB0MSwgdDMsIHQ0KQorCWFuZGkJdDgsIGExLCAweDFjCisJUFRSX0FERFUJc3JjLCBzcmMsIDB4MjAKKworZG9fZW5kX3dvcmRzOgorCWJlcXoJdDgsIHNtYWxsX2NzdW1jcHkKKwkgYW5kaQl0MiwgYTEsIDB4MworCUxPTkdfU1JMCXQ4LCB0OCwgMHgyCisKK2VuZF93b3JkczoKKwlsdwl0MCwgKHNyYykKKwlMT05HX1NVQlUJdDgsIHQ4LCAweDEKKwlBRERDKHN1bSwgdDApCisJYm5legl0OCwgZW5kX3dvcmRzCisJIFBUUl9BRERVCXNyYywgc3JjLCAweDQKKworLyogdW5rbm93biBzcmMgYWxpZ25tZW50IGFuZCA8IDggYnl0ZXMgdG8gZ28gICovCitzbWFsbF9jc3VtY3B5OgorCW1vdmUJYTEsIHQyCisKKwlhbmRpCXQwLCBhMSwgNAorCWJlcXoJdDAsIDFmCisJIGFuZGkJdDAsIGExLCAyCisKKwkvKiBTdGlsbCBhIGZ1bGwgd29yZCB0byBnbyAgKi8KKwl1bHcJdDEsIChzcmMpCisJUFRSX0FERElVCXNyYywgNAorCUFEREMoc3VtLCB0MSkKKworMToJbW92ZQl0MSwgemVybworCWJlcXoJdDAsIDFmCisJIGFuZGkJdDAsIGExLCAxCisKKwkvKiBTdGlsbCBhIGhhbGZ3b3JkIHRvIGdvICAqLworCXVsaHUJdDEsIChzcmMpCisJUFRSX0FERElVCXNyYywgMgorCisxOgliZXF6CXQwLCAxZgorCSBzbGwJdDEsIHQxLCAxNgorCisJbGJ1CXQyLCAoc3JjKQorCSBub3AKKworI2lmZGVmIF9fTUlQU0VCX18KKwlzbGwJdDIsIHQyLCA4CisjZW5kaWYKKwlvcgl0MSwgdDIKKworMToJQUREQyhzdW0sIHQxKQorCisJLyogZm9sZCBjaGVja3N1bSAqLworI2lmZGVmIFVTRV9ET1VCTEUKKwlkc2xsMzIJdjEsIHN1bSwgMAorCWRhZGR1CXN1bSwgdjEKKwlzbHR1CXYxLCBzdW0sIHYxCisJZHNyYTMyCXN1bSwgc3VtLCAwCisJYWRkdQlzdW0sIHYxCisjZW5kaWYKKwlzbGwJdjEsIHN1bSwgMTYKKwlhZGR1CXN1bSwgdjEKKwlzbHR1CXYxLCBzdW0sIHYxCisJc3JsCXN1bSwgc3VtLCAxNgorCWFkZHUJc3VtLCB2MQorCisJLyogb2RkIGJ1ZmZlciBhbGlnbm1lbnQ/ICovCisJYmVxegl0NywgMWYKKwkgbm9wCisJc2xsCXYxLCBzdW0sIDgKKwlzcmwJc3VtLCBzdW0sIDgKKwlvcglzdW0sIHYxCisJYW5kaQlzdW0sIDB4ZmZmZgorMToKKwkuc2V0CXJlb3JkZXIKKwkvKiBBZGQgdGhlIHBhc3NlZCBwYXJ0aWFsIGNzdW0uICAqLworCUFEREMoc3VtLCBhMikKKwlqcglyYQorCS5zZXQJbm9yZW9yZGVyCisJRU5EKGNzdW1fcGFydGlhbCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYyBiL2FyY2gvbWlwcy9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYwppbmRleCA2ZTlmMzY2Li4wNjc3MTA0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKKysrIGIvYXJjaC9taXBzL2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCkBAIC03LDYgKzcsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IFJhbGYgQmFlY2hsZQogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgpAQCAtMTYsOCArMTcsOCBAQAogLyoKICAqIGNvcHkgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywKKwl2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJLyoKIAkgKiBJdCdzIDI6MzAgYW0gYW5kIEkgZG9uJ3QgZmVlbCBsaWtlIGRvaW5nIGl0IHJlYWwgLi4uCkBAIC0yOSwxMiArMzAsMTQgQEAKIAlyZXR1cm4gc3VtOwogfQogCitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOworCiAvKgogICogQ29weSBmcm9tIHVzZXJzcGFjZSBhbmQgY29tcHV0ZSBjaGVja3N1bS4gIElmIHdlIGNhdGNoIGFuIGV4Y2VwdGlvbgogICogdGhlbiB6ZXJvIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB2b2lkIF9fdXNlciAqc3JjLAorCXZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQogewogCWludCBtaXNzaW5nOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvYXRsYXMvYXRsYXNfaW50LmMgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvYXRsYXMvYXRsYXNfaW50LmMKaW5kZXggYmU2MjRiOC4uNDNkYmE2YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX2ludC5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9hdGxhcy9hdGxhc19pbnQuYwpAQCAtNjIsMTYgKzYyLDYgQEAKIAlpb2IoKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2F0bGFzX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV9hdGxhc19pcnEoaXJxKTsKLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi0jZGVmaW5lIHNodXRkb3duX2F0bGFzX2lycQlkaXNhYmxlX2F0bGFzX2lycQotCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19hdGxhc19pcnEgZGlzYWJsZV9hdGxhc19pcnEKLQogc3RhdGljIHZvaWQgZW5kX2F0bGFzX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQpAQCAtODAsMTEgKzcwLDExIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYXRsYXNfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIkF0bGFzIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfYXRsYXNfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2F0bGFzX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2F0bGFzX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfYXRsYXNfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfYXRsYXNfaXJxLAorCS5hY2sgPSBkaXNhYmxlX2F0bGFzX2lycSwKKwkubWFzayA9IGRpc2FibGVfYXRsYXNfaXJxLAorCS5tYXNrX2FjayA9IGRpc2FibGVfYXRsYXNfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfYXRsYXNfaXJxLAorCS5lb2kgPSBlbmFibGVfYXRsYXNfaXJxLAogCS5lbmQgPSBlbmRfYXRsYXNfaXJxLAogfTsKIApAQCAtMjE3LDEzICsyMDcsOCBAQAogCSAqLwogCWF0bGFzX2h3MF9pY3JlZ3MtPmludHJzdGVuID0gMHhmZmZmZmZmZjsKIAotCWZvciAoaSA9IEFUTEFTX0lOVF9CQVNFOyBpIDw9IEFUTEFTX0lOVF9FTkQ7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMJPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbgk9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoCT0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcAk9ICZhdGxhc19pcnFfdHlwZTsKLQkJc3Bpbl9sb2NrX2luaXQoJmlycV9kZXNjW2ldLmxvY2spOwotCX0KKwlmb3IgKGkgPSBBVExBU19JTlRfQkFTRTsgaSA8PSBBVExBU19JTlRfRU5EOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmYXRsYXNfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogfQogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBhdGxhc2lycSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL21lbW9yeS5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvbWVtb3J5LmMKaW5kZXggYmU4MGM1ZC4uZWVlZDk0NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvbWVtb3J5LmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvbWVtb3J5LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQlpZiAoYm9vdF9tZW1fbWFwLm1hcFtpXS50eXBlICE9IEJPT1RfTUVNX1JPTV9EQVRBKQogCQkJY29udGludWU7CiAKLQkJYWRkciA9IGJvb3RfbWVtX21hcC5tYXBbaV0uYWRkcjsKKwkJYWRkciA9IFBBR0VfQUxJR04oYm9vdF9tZW1fbWFwLm1hcFtpXS5hZGRyKTsKIAkJd2hpbGUgKGFkZHIgPCBib290X21lbV9tYXAubWFwW2ldLmFkZHIKIAkJCSAgICAgICsgYm9vdF9tZW1fbWFwLm1hcFtpXS5zaXplKSB7CiAJCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoX192YShhZGRyKSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9wY2kuYwppbmRleCA5MzM3ZjZjLi4zMTkyYTE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9wY2kuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9wY2kuYwpAQCAtOTAsNyArOTAsNyBAQAogdm9pZCBfX2luaXQgbWlwc19wY2liaW9zX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kLCBtYXAsIHN0YXJ0MSwgZW5kMSwgbWFwMSwgbWFwMiwgbWFwMywgbWFzazsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZCwgbWFwLCBzdGFydDEsIGVuZDEsIG1hcDEsIG1hcDIsIG1hcDMsIG1hc2s7CiAKIAlzd2l0Y2ggKG1pcHNfcmV2aXNpb25fY29yaWQpIHsKIAljYXNlIE1JUFNfUkVWSVNJT05fQ09SSURfUUVEX1JNNTI2MToKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYwppbmRleCA2ZjhhOWZlLi5lNDYwNGM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy90aW1lLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvdGltZS5jCkBAIC0xODcsNyArMTg3LDcgQEAKIH0KIAogLyoKLSAqIEVzdGltYXRlIENQVSBmcmVxdWVuY3kuICBTZXRzIG1pcHNfY291bnRlcl9mcmVxdWVuY3kgYXMgYSBzaWRlLWVmZmVjdAorICogRXN0aW1hdGUgQ1BVIGZyZXF1ZW5jeS4gIFNldHMgbWlwc19ocHRfZnJlcXVlbmN5IGFzIGEgc2lkZS1lZmZlY3QKICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgZXN0aW1hdGVfY3B1X2ZyZXF1ZW5jeSh2b2lkKQogewpAQCAtMjA4LDcgKzIwOCw4IEBACiAJCWNvdW50ID0gNjAwMDAwMDsKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX01JUFNfQVRMQVMpIHx8IGRlZmluZWQoQ09ORklHX01JUFNfTUFMVEEpCi0JdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN0YXJ0OwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCkBAIC0yMTcsMTMgKzIxOCwxMyBAQAogCXdoaWxlICghKENNT1NfUkVBRChSVENfUkVHX0EpICYgUlRDX1VJUCkpOwogCiAJLyogU3RhcnQgcjRrIGNvdW50ZXIuICovCi0Jd3JpdGVfYzBfY291bnQoMCk7CisJc3RhcnQgPSByZWFkX2MwX2NvdW50KCk7CiAKIAkvKiBSZWFkIGNvdW50ZXIgZXhhY3RseSBvbiBmYWxsaW5nIGVkZ2Ugb2YgdXBkYXRlIGZsYWcgKi8KIAl3aGlsZSAoQ01PU19SRUFEKFJUQ19SRUdfQSkgJiBSVENfVUlQKTsKIAl3aGlsZSAoIShDTU9TX1JFQUQoUlRDX1JFR19BKSAmIFJUQ19VSVApKTsKIAotCWNvdW50ID0gcmVhZF9jMF9jb3VudCgpOworCWNvdW50ID0gcmVhZF9jMF9jb3VudCgpIC0gc3RhcnQ7CiAKIAkvKiByZXN0b3JlIGludGVycnVwdHMgKi8KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CkBAIC0yODcsNiArMjg4LDcgQEAKIAkgICBUaGUgZWZmZWN0IGlzIHRoYXQgdGhlIGludCByZW1haW5zIGRpc2FibGVkIG9uIHRoZSBzZWNvbmQgY3B1LgogCSAgIE1hcmsgdGhlIGludGVycnVwdCB3aXRoIElSUV9QRVJfQ1BVIHRvIGF2b2lkIGFueSBjb25mdXNpb24gKi8KIAlpcnFfZGVzY1ttaXBzX2NwdV90aW1lcl9pcnFdLnN0YXR1cyB8PSBJUlFfUEVSX0NQVTsKKwlzZXRfaXJxX2hhbmRsZXIobWlwc19jcHVfdGltZXJfaXJxLCBoYW5kbGVfcGVyY3B1X2lycSk7CiAjZW5kaWYKIAogICAgICAgICAvKiB0byBnZW5lcmF0ZSB0aGUgZmlyc3QgdGltZXIgaW50ZXJydXB0ICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvTWFrZWZpbGUgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvTWFrZWZpbGUKaW5kZXggNzdlZTVjNi4uYjY2MmM3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9NYWtlZmlsZQpAQCAtMTksNSArMTksNSBAQAogIyB1bmRlciBMaW51eC4KICMKIAotb2JqLXkgOj0gbWFsdGFfaW50Lm8gbWFsdGFfc2V0dXAubworb2JqLXkgOj0gbWFsdGFfaW50Lm8gbWFsdGFfbXRkLm8gbWFsdGFfc2V0dXAubwogb2JqLSQoQ09ORklHX1NNUCkgKz0gbWFsdGFfc21wLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9pbnQuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9pbnQuYwppbmRleCA2MjQ0ZDBlLi45MGFkNWJmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfaW50LmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAjaW5jbHVkZSA8YXNtL2lycV9jcHUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbWFsdGEuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbWFsdGFpbnQuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvcGlpeDQuaD4KQEAgLTEzMSw3ICsxMzIsNyBAQAogCXVuc2lnbmVkIGludCBpbnRlZGdlLCBpbnRzdGVlciwgcGNpY21kLCBwY2liYWRhZGRyOwogICAgICAgICB1bnNpZ25lZCBpbnQgcGNpbXN0YXQsIGludGlzciwgaW50ZW4sIGludHBvbDsKIAl1bnNpZ25lZCBpbnQgaW50cmNhdXNlLGRhdGFsbyxkYXRhaGk7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKIAogICAgICAgICBwcmludGsoIkNvcmVISSBpbnRlcnJ1cHQsIHNob3VsZG4ndCBoYXBwZW4sIHNvIHdlIGRpZSBoZXJlISEhXG4iKTsKICAgICAgICAgcHJpbnRrKCJlcGMgICA6ICUwOGx4XG5TdGF0dXM6ICUwOGx4XG4iCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfc2V0dXAuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCmluZGV4IGFiNDYwZjguLjU2ZWE3NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCkBAIC0yMSwxMyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAKLSNpZmRlZiBDT05GSUdfTVRECi0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC01OCwzMCArNTEsNiBAQAogCXsgLm5hbWUgPSAiZG1hMiIsIC5zdGFydCA9IDB4YzAsIC5lbmQgPSAweGRmLCAuZmxhZ3MgPSBJT1JFU09VUkNFX0JVU1kgfSwKIH07CiAKLSNpZmRlZiBDT05GSUdfTVRECi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gbWFsdGFfbXRkX3BhcnRpdGlvbnNbXSA9IHsKLQl7Ci0JCS5uYW1lID0JCSJZQU1PTiIsCi0JCS5vZmZzZXQgPQkweDAsCi0JCS5zaXplID0JCTB4MTAwMDAwLAotCQkubWFza19mbGFncyA9CU1URF9XUklURUFCTEUKLQl9LAotCXsKLQkJLm5hbWUgPQkJIlVzZXIgRlMiLAotCQkub2Zmc2V0ID0gCTB4MTAwMDAwLAotCQkuc2l6ZSA9CQkweDJlMDAwMAotCX0sCi0JewotCQkubmFtZSA9CQkiQm9hcmQgQ29uZmlnIiwKLQkJLm9mZnNldCA9CTB4M2UwMDAwLAotCQkuc2l6ZSA9CQkweDAyMDAwMCwKLQkJLm1hc2tfZmxhZ3MgPQlNVERfV1JJVEVBQkxFCi0JfQotfTsKLQotI2RlZmluZSBudW1iZXJfcGFydGl0aW9ucwkoc2l6ZW9mKG1hbHRhX210ZF9wYXJ0aXRpb25zKS9zaXplb2Yoc3RydWN0IG10ZF9wYXJ0aXRpb24pKQotI2VuZGlmCi0KIGNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQogewogCXJldHVybiAiTUlQUyBNYWx0YSI7CkBAIC0xNTksNyArMTI4LDcgQEAKIAkJCQlCT05JVE9fUENJTUVNQkFTRUNGRyB8PQogCQkJCQkoQk9OSVRPX1BDSU1FTUJBU0VDRkdfTUVNQkFTRTBfQ0FDSEVEIHwKIAkJCQkJIEJPTklUT19QQ0lNRU1CQVNFQ0ZHX01FTUJBU0UxX0NBQ0hFRCk7Ci0JCQkJcHJpbnRrKCJEaXNhYmxlZCBCb25pdG8gSU9CQyBjb2hlcmVuY3lcbiIpOworCQkJCXByaW50aygiRW5hYmxlZCBCb25pdG8gSU9CQyBjb2hlcmVuY3lcbiIpOwogCQkJfQogCQl9CiAJCWVsc2UKQEAgLTIxMSwxNCArMTgwLDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTVRECi0JLyoKLQkgKiBTdXBwb3J0IGZvciBNVEQgb24gTWFsdGEuIFVzZSB0aGUgZ2VuZXJpYyBwaHlzbWFwIGRyaXZlcgotCSAqLwotCXBoeXNtYXBfY29uZmlndXJlKDB4MWUwMDAwMDAsIDB4NDAwMDAwLCA0LCBOVUxMKTsKLQlwaHlzbWFwX3NldF9wYXJ0aXRpb25zKG1hbHRhX210ZF9wYXJ0aXRpb25zLCBudW1iZXJfcGFydGl0aW9ucyk7Ci0jZW5kaWYKLQogCW1pcHNfcmVib290X3NldHVwKCk7CiAKIAlib2FyZF90aW1lX2luaXQgPSBtaXBzX3RpbWVfaW5pdDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9zaW0vc2ltX3RpbWUuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9zaW0vc2ltX3RpbWUuYwppbmRleCBjNTY2YjliLi4zMDcxMWQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvc2ltL3NpbV90aW1lLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL3NpbS9zaW1fdGltZS5jCkBAIC0zLDYgKzMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KIAogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KQEAgLTEwLDI0ICsxMywxNCBAQAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotI2luY2x1ZGUgPGFzbS9jcHUuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYzE0NjgxOC10aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21zYzAxX2ljLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9zaW1pbnQuaD4KLSNpbmNsdWRlIDxhc20vbWMxNDY4MTgtdGltZS5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogCiB1bnNpZ25lZCBsb25nIGNwdV9raHo7CkBAIC0xMDIsNyArOTUsNyBAQAogCiAKIC8qCi0gKiBFc3RpbWF0ZSBDUFUgZnJlcXVlbmN5LiAgU2V0cyBtaXBzX2NvdW50ZXJfZnJlcXVlbmN5IGFzIGEgc2lkZS1lZmZlY3QKKyAqIEVzdGltYXRlIENQVSBmcmVxdWVuY3kuICBTZXRzIG1pcHNfaHB0X2ZyZXF1ZW5jeSBhcyBhIHNpZGUtZWZmZWN0CiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGVzdGltYXRlX2NwdV9mcmVxdWVuY3kodm9pZCkKIHsKQEAgLTIwMyw3ICsxOTYsOCBAQAogCSAgIG9uIHNlcGVyYXRlIGNwdSdzIHRoZSBmaXJzdCBvbmUgdHJpZXMgdG8gaGFuZGxlIHRoZSBzZWNvbmQgaW50ZXJydXB0LgogCSAgIFRoZSBlZmZlY3QgaXMgdGhhdCB0aGUgaW50IHJlbWFpbnMgZGlzYWJsZWQgb24gdGhlIHNlY29uZCBjcHUuCiAJICAgTWFyayB0aGUgaW50ZXJydXB0IHdpdGggSVJRX1BFUl9DUFUgdG8gYXZvaWQgYW55IGNvbmZ1c2lvbiAqLwotCWlycV9kZXNjW21pcHNfY3B1X3RpbWVyX2lycV0uc3RhdHVzIHw9IElSUV9QRVJfQ1BVOworCWlycV9kZXNjW21pcHNfY3B1X3RpbWVyX2lycV0uZmxhZ3MgfD0gSVJRX1BFUl9DUFU7CisJc2V0X2lycV9oYW5kbGVyKG1pcHNfY3B1X3RpbWVyX2lycSwgaGFuZGxlX3BlcmNwdV9pcnEpOwogI2VuZGlmCiAKIAkvKiB0byBnZW5lcmF0ZSB0aGUgZmlyc3QgdGltZXIgaW50ZXJydXB0ICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1yNGsuYyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCmluZGV4IGNjODk1ZGEuLmRmMDRhMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCkBAIC0zMjMsNyArMzIzLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9yNGtfZmx1c2hfY2FjaGVfYWxsKHZvaWQgKiBhcmdzKQogewogCXI0a19ibGFzdF9kY2FjaGUoKTsKLQlyNGtfYmxhc3RfaWNhY2hlKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHI0a19mbHVzaF9jYWNoZV9hbGwodm9pZCkKQEAgLTM1OSwyMSArMzU4LDE5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfcjRrX2ZsdXNoX2NhY2hlX3JhbmdlKHZvaWQgKiBhcmdzKQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gYXJnczsKLQlpbnQgZXhlYzsKIAogCWlmICghKGNwdV9jb250ZXh0KHNtcF9wcm9jZXNzb3JfaWQoKSwgdm1hLT52bV9tbSkpKQogCQlyZXR1cm47CiAKLQlleGVjID0gdm1hLT52bV9mbGFncyAmIFZNX0VYRUM7Ci0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcyB8fCBleGVjKQotCQlyNGtfYmxhc3RfZGNhY2hlKCk7Ci0JaWYgKGV4ZWMpCi0JCXI0a19ibGFzdF9pY2FjaGUoKTsKKwlyNGtfYmxhc3RfZGNhY2hlKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHI0a19mbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKKwlpZiAoIWNwdV9oYXNfZGNfYWxpYXNlcykKKwkJcmV0dXJuOworCiAJcjRrX29uX2VhY2hfY3B1KGxvY2FsX3I0a19mbHVzaF9jYWNoZV9yYW5nZSwgdm1hLCAxLCAxKTsKIH0KIApAQCAtMzg0LDE4ICszODEsMjEgQEAKIAlpZiAoIWNwdV9jb250ZXh0KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW0pKQogCQlyZXR1cm47CiAKLQlyNGtfYmxhc3RfZGNhY2hlKCk7Ci0JcjRrX2JsYXN0X2ljYWNoZSgpOwotCiAJLyoKIAkgKiBLbHVkZ2UgYWxlcnQuICBGb3Igb2JzY3VyZSByZWFzb25zIFI0MDAwU0MgYW5kIFI0NDAwU0MgZ28gbnV0cyBpZiB3ZQogCSAqIG9ubHkgZmx1c2ggdGhlIHByaW1hcnkgY2FjaGVzIGJ1dCBSMTAwMDAgYW5kIFIxMjAwMCBiZWhhdmUgc2FuZSAuLi4KKwkgKiBSNDAwMFNDIGFuZCBSNDQwMFNDIGluZGV4ZWQgUy1jYWNoZSBvcHMgYWxzbyBpbnZhbGlkYXRlIHByaW1hcnkKKwkgKiBjYWNoZXMsIHNvIHdlIGNhbiBiYWlsIG91dCBlYXJseS4KIAkgKi8KIAlpZiAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9SNDAwMFNDIHx8CiAJICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfUjQwMDBNQyB8fAogCSAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1I0NDAwU0MgfHwKLQkgICAgY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlID09IENQVV9SNDQwME1DKQorCSAgICBjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUgPT0gQ1BVX1I0NDAwTUMpIHsKIAkJcjRrX2JsYXN0X3NjYWNoZSgpOworCQlyZXR1cm47CisJfQorCisJcjRrX2JsYXN0X2RjYWNoZSgpOwogfQogCiBzdGF0aWMgdm9pZCByNGtfZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1zYjEuYyBiL2FyY2gvbWlwcy9tbS9jLXNiMS5jCmluZGV4IDU1Mzc1NTguLjNhOGFmZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXNiMS5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXNiMS5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CkBAIC00OSw2ICs1MCwxNSBAQAogc3RhdGljIHVuc2lnbmVkIGludCBpY2FjaGVfcmFuZ2VfY3V0b2ZmOwogc3RhdGljIHVuc2lnbmVkIGludCBkY2FjaGVfcmFuZ2VfY3V0b2ZmOwogCitzdGF0aWMgaW5saW5lIHZvaWQgc2IxX29uX2VhY2hfY3B1KHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sCisJCQkJICAgaW50IHJldHJ5LCBpbnQgd2FpdCkKK3sKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlzbXBfY2FsbF9mdW5jdGlvbihmdW5jLCBpbmZvLCByZXRyeSwgd2FpdCk7CisJZnVuYyhpbmZvKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCiAvKgogICogVGhlIGRjYWNoZSBpcyBmdWxseSBjb2hlcmVudCB0byB0aGUgc3lzdGVtLCB3aXRoIG9uZQogICogYmlnIGNhdmVhdDogIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uICBJbiBvdGhlciB3b3JkcywKQEAgLTIyNiwxMyArMjM2LDMyIEBACiAJYXJncy52bWEgPSB2bWE7CiAJYXJncy5hZGRyID0gYWRkcjsKIAlhcmdzLnBmbiA9IHBmbjsKLQlvbl9lYWNoX2NwdShzYjFfZmx1c2hfY2FjaGVfcGFnZV9pcGksICh2b2lkICopICZhcmdzLCAxLCAxKTsKKwlzYjFfb25fZWFjaF9jcHUoc2IxX2ZsdXNoX2NhY2hlX3BhZ2VfaXBpLCAodm9pZCAqKSAmYXJncywgMSwgMSk7CiB9CiAjZWxzZQogdm9pZCBzYjFfZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBmbikKIAlfX2F0dHJpYnV0ZV9fKChhbGlhcygibG9jYWxfc2IxX2ZsdXNoX2NhY2hlX3BhZ2UiKSkpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgdm9pZCBzYjFfZmx1c2hfY2FjaGVfZGF0YV9wYWdlX2lwaSh2b2lkICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylpbmZvOworCisJX19zYjFfd3JpdGViYWNrX2ludl9kY2FjaGVfcmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgUEFHRV9TSVpFKTsKK30KKworc3RhdGljIHZvaWQgc2IxX2ZsdXNoX2NhY2hlX2RhdGFfcGFnZSh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaWYgKGluX2F0b21pYygpKQorCQlfX3NiMV93cml0ZWJhY2tfaW52X2RjYWNoZV9yYW5nZShhZGRyLCBhZGRyICsgUEFHRV9TSVpFKTsKKwllbHNlCisJCW9uX2VhY2hfY3B1KHNiMV9mbHVzaF9jYWNoZV9kYXRhX3BhZ2VfaXBpLCAodm9pZCAqKSBhZGRyLCAxLCAxKTsKK30KKyNlbHNlCit2b2lkIHNiMV9mbHVzaF9jYWNoZV9kYXRhX3BhZ2UodW5zaWduZWQgbG9uZykKKwlfX2F0dHJpYnV0ZV9fKChhbGlhcygibG9jYWxfc2IxX2ZsdXNoX2NhY2hlX2RhdGFfcGFnZSIpKSk7CisjZW5kaWYKIAogLyoKICAqIEludmFsaWRhdGUgYWxsIGNhY2hlcyBvbiB0aGlzIENQVQpAQCAtMjQ5LDcgKzI3OCw3IEBACiAKIHN0YXRpYyB2b2lkIHNiMV9fX2ZsdXNoX2NhY2hlX2FsbCh2b2lkKQogewotCW9uX2VhY2hfY3B1KHNiMV9fX2ZsdXNoX2NhY2hlX2FsbF9pcGksIDAsIDEsIDEpOworCXNiMV9vbl9lYWNoX2NwdShzYjFfX19mbHVzaF9jYWNoZV9hbGxfaXBpLCAwLCAxLCAxKTsKIH0KICNlbHNlCiB2b2lkIHNiMV9fX2ZsdXNoX2NhY2hlX2FsbCh2b2lkKQpAQCAtMjk5LDcgKzMyOCw3IEBACiAKIAlhcmdzLnN0YXJ0ID0gc3RhcnQ7CiAJYXJncy5lbmQgPSBlbmQ7Ci0Jb25fZWFjaF9jcHUoc2IxX2ZsdXNoX2ljYWNoZV9yYW5nZV9pcGksICZhcmdzLCAxLCAxKTsKKwlzYjFfb25fZWFjaF9jcHUoc2IxX2ZsdXNoX2ljYWNoZV9yYW5nZV9pcGksICZhcmdzLCAxLCAxKTsKIH0KICNlbHNlCiB2b2lkIHNiMV9mbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCkBAIC0zMjYsNyArMzU1LDcgQEAKIAogc3RhdGljIHZvaWQgc2IxX2ZsdXNoX2NhY2hlX3NpZ3RyYW1wKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlvbl9lYWNoX2NwdShzYjFfZmx1c2hfY2FjaGVfc2lndHJhbXBfaXBpLCAodm9pZCAqKSBhZGRyLCAxLCAxKTsKKwlzYjFfb25fZWFjaF9jcHUoc2IxX2ZsdXNoX2NhY2hlX3NpZ3RyYW1wX2lwaSwgKHZvaWQgKikgYWRkciwgMSwgMSk7CiB9CiAjZWxzZQogdm9pZCBzYjFfZmx1c2hfY2FjaGVfc2lndHJhbXAodW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtNDQ0LDcgKzQ3Myw2IEBACiB2b2lkIHNiMV9jYWNoZV9pbml0KHZvaWQpCiB7CiAJZXh0ZXJuIGNoYXIgZXhjZXB0X3ZlYzJfc2IxOwotCWV4dGVybiBjaGFyIGhhbmRsZV92ZWMyX3NiMTsKIAogCS8qIFNwZWNpYWwgY2FjaGUgZXJyb3IgaGFuZGxlciBmb3IgU0IxICovCiAJc2V0X3VuY2FjaGVkX2hhbmRsZXIgKDB4MTAwLCAmZXhjZXB0X3ZlYzJfc2IxLCAweDgwKTsKQEAgLTQ3Myw3ICs1MDEsNyBAQAogCiAJZmx1c2hfY2FjaGVfc2lndHJhbXAgPSBzYjFfZmx1c2hfY2FjaGVfc2lndHJhbXA7CiAJbG9jYWxfZmx1c2hfZGF0YV9jYWNoZV9wYWdlID0gKHZvaWQgKikgc2IxX25vcDsKLQlmbHVzaF9kYXRhX2NhY2hlX3BhZ2UgPSAodm9pZCAqKSBzYjFfbm9wOworCWZsdXNoX2RhdGFfY2FjaGVfcGFnZSA9IHNiMV9mbHVzaF9jYWNoZV9kYXRhX3BhZ2U7CiAKIAkvKiBGdWxsIGZsdXNoICovCiAJX19mbHVzaF9jYWNoZV9hbGwgPSBzYjFfX19mbHVzaF9jYWNoZV9hbGw7CkBAIC00OTcsNSArNTI1LDUgQEAKIAk6CiAJOiAibWVtb3J5Iik7CiAKLQlmbHVzaF9jYWNoZV9hbGwoKTsKKwlsb2NhbF9zYjFfX19mbHVzaF9jYWNoZV9hbGwoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jYWNoZS5jIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKaW5kZXggY2FmODA3ZC4uMWY5NTRhMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2NhY2hlLmMKKysrIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKQEAgLTMyLDYgKzMyLDcgQEAKIHZvaWQgKCpmbHVzaF9kYXRhX2NhY2hlX3BhZ2UpKHVuc2lnbmVkIGxvbmcgYWRkcik7CiB2b2lkICgqZmx1c2hfaWNhY2hlX2FsbCkodm9pZCk7CiAKK0VYUE9SVF9TWU1CT0xfR1BMKGxvY2FsX2ZsdXNoX2RhdGFfY2FjaGVfcGFnZSk7CiBFWFBPUlRfU1lNQk9MKGZsdXNoX2RhdGFfY2FjaGVfcGFnZSk7CiAKICNpZmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vZG1hLWNvaGVyZW50LmMgYi9hcmNoL21pcHMvbW0vZG1hLWNvaGVyZW50LmMKaW5kZXggN2ZhNWZkMS4uNTY5N2M2ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2RtYS1jb2hlcmVudC5jCisrKyBiL2FyY2gvbWlwcy9tbS9kbWEtY29oZXJlbnQuYwpAQCAtMTkwLDE0ICsxOTAsMTQgQEAKIAogRVhQT1JUX1NZTUJPTChkbWFfc3VwcG9ydGVkKTsKIAotaW50IGRtYV9pc19jb25zaXN0ZW50KGRtYV9hZGRyX3QgZG1hX2FkZHIpCitpbnQgZG1hX2lzX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXJldHVybiAxOwogfQogCiBFWFBPUlRfU1lNQk9MKGRtYV9pc19jb25zaXN0ZW50KTsKIAotdm9pZCBkbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCit2b2lkIGRtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vZG1hLWlwMjcuYyBiL2FyY2gvbWlwcy9tbS9kbWEtaXAyNy5jCmluZGV4IDhkYTE5ZmQuLmYwODgzNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9kbWEtaXAyNy5jCisrKyBiL2FyY2gvbWlwcy9tbS9kbWEtaXAyNy5jCkBAIC0xOTcsMTQgKzE5NywxNCBAQAogCiBFWFBPUlRfU1lNQk9MKGRtYV9zdXBwb3J0ZWQpOwogCi1pbnQgZG1hX2lzX2NvbnNpc3RlbnQoZG1hX2FkZHJfdCBkbWFfYWRkcikKK2ludCBkbWFfaXNfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7CiAJcmV0dXJuIDE7CiB9CiAKIEVYUE9SVF9TWU1CT0woZG1hX2lzX2NvbnNpc3RlbnQpOwogCi12b2lkIGRtYV9jYWNoZV9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKK3ZvaWQgZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCiAJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9kbWEtaXAzMi5jIGIvYXJjaC9taXBzL21tL2RtYS1pcDMyLmMKaW5kZXggZWM1NGVkMC4uYjQyYjZmNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2RtYS1pcDMyLmMKKysrIGIvYXJjaC9taXBzL21tL2RtYS1pcDMyLmMKQEAgLTM2MywxNCArMzYzLDE1IEBACiAKIEVYUE9SVF9TWU1CT0woZG1hX3N1cHBvcnRlZCk7CiAKLWludCBkbWFfaXNfY29uc2lzdGVudChkbWFfYWRkcl90IGRtYV9hZGRyKQoraW50IGRtYV9pc19jb25zaXN0ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKIAlyZXR1cm4gMTsKIH0KIAogRVhQT1JUX1NZTUJPTChkbWFfaXNfY29uc2lzdGVudCk7CiAKLXZvaWQgZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit2b2lkIGRtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAorCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlpZiAoZGlyZWN0aW9uID09IERNQV9OT05FKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vZG1hLW5vbmNvaGVyZW50LmMgYi9hcmNoL21pcHMvbW0vZG1hLW5vbmNvaGVyZW50LmMKaW5kZXggMmVlZmZlNS4uOGNlY2VmMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2RtYS1ub25jb2hlcmVudC5jCisrKyBiL2FyY2gvbWlwcy9tbS9kbWEtbm9uY29oZXJlbnQuYwpAQCAtMjk5LDE0ICsyOTksMTUgQEAKIAogRVhQT1JUX1NZTUJPTChkbWFfc3VwcG9ydGVkKTsKIAotaW50IGRtYV9pc19jb25zaXN0ZW50KGRtYV9hZGRyX3QgZG1hX2FkZHIpCitpbnQgZG1hX2lzX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXJldHVybiAxOwogfQogCiBFWFBPUlRfU1lNQk9MKGRtYV9pc19jb25zaXN0ZW50KTsKIAotdm9pZCBkbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3ZvaWQgZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCWlmIChkaXJlY3Rpb24gPT0gRE1BX05PTkUpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9mYXVsdC5jIGIvYXJjaC9taXBzL21tL2ZhdWx0LmMKaW5kZXggODQyM2Q4NS4uNmY5MGU3ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9taXBzL21tL2ZhdWx0LmMKQEAgLTYwLDYgKzYwLDEwIEBACiAJICovCiAJaWYgKHVubGlrZWx5KGFkZHJlc3MgPj0gVk1BTExPQ19TVEFSVCAmJiBhZGRyZXNzIDw9IFZNQUxMT0NfRU5EKSkKIAkJZ290byB2bWFsbG9jX2ZhdWx0OworI2lmZGVmIE1PRFVMRV9TVEFSVAorCWlmICh1bmxpa2VseShhZGRyZXNzID49IE1PRFVMRV9TVEFSVCAmJiBhZGRyZXNzIDwgTU9EVUxFX0VORCkpCisJCWdvdG8gdm1hbGxvY19mYXVsdDsKKyNlbmRpZgogCiAJLyoKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgb3IgaGF2ZSBubyB1c2VyCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vaGlnaG1lbS5jIGIvYXJjaC9taXBzL21tL2hpZ2htZW0uYwppbmRleCA5OWViZjNjLi42NzU1MDJhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vaGlnaG1lbS5jCisrKyBiL2FyY2gvbWlwcy9tbS9oaWdobWVtLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAl1bnNpZ25lZCBsb25nIHZhZGRyOwogCiAJLyogZXZlbiAhQ09ORklHX1BSRUVNUFQgbmVlZHMgdGhpcywgZm9yIGluX2F0b21pYyBpbiBkb19wYWdlX2ZhdWx0ICovCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpCiAJCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CiAKQEAgLTYyLDggKzYyLDcgQEAKIAllbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHggPSB0eXBlICsgS01fVFlQRV9OUipzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlpZiAodmFkZHIgPCBGSVhBRERSX1NUQVJUKSB7IC8vIEZJWE1FCi0JCWRlY19wcmVlbXB0X2NvdW50KCk7Ci0JCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOworCQlwYWdlZmF1bHRfZW5hYmxlKCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTc4LDggKzc3LDcgQEAKIAlsb2NhbF9mbHVzaF90bGJfb25lKHZhZGRyKTsKICNlbmRpZgogCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKLQlwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiB9CiAKICNpZm5kZWYgQ09ORklHX0xJTUlURURfRE1BCkBAIC05Miw3ICs5MCw3IEBACiAJZW51bSBmaXhlZF9hZGRyZXNzZXMgaWR4OwogCXVuc2lnbmVkIGxvbmcgdmFkZHI7CiAKLQlpbmNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAKIAlpZHggPSB0eXBlICsgS01fVFlQRV9OUipzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdmFkZHIgPSBfX2ZpeF90b192aXJ0KEZJWF9LTUFQX0JFR0lOICsgaWR4KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9pbml0LmMgYi9hcmNoL21pcHMvbW0vaW5pdC5jCmluZGV4IDg4YjcyYzkuLjMwMjQ1YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9pbml0LmMKKysrIGIvYXJjaC9taXBzL21tL2luaXQuYwpAQCAtMzAsMTEgKzMwLDM0IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorCisvKiBBdG9taWNpdHkgYW5kIGludGVycnVwdGFiaWxpdHkgKi8KKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisKKyNpbmNsdWRlIDxhc20vbWlwc210cmVncy5oPgorCisjZGVmaW5lIEVOVEVSX0NSSVRJQ0FMKGZsYWdzKSBcCisJeyBcCisJdW5zaWduZWQgaW50IG12cGZsYWdzOyBcCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpO1wKKwltdnBmbGFncyA9IGR2cGUoKQorI2RlZmluZSBFWElUX0NSSVRJQ0FMKGZsYWdzKSBcCisJZXZwZShtdnBmbGFncyk7IFwKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKKwl9CisjZWxzZQorCisjZGVmaW5lIEVOVEVSX0NSSVRJQ0FMKGZsYWdzKSBsb2NhbF9pcnFfc2F2ZShmbGFncykKKyNkZWZpbmUgRVhJVF9DUklUSUNBTChmbGFncykgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpCisKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7CiAKQEAgLTY3LDkgKzkwLDkgQEAKIAlpZiAoIWVtcHR5X3plcm9fcGFnZSkKIAkJcGFuaWMoIk9oIGJveSwgdGhhdCBlYXJseSBvdXQgb2YgbWVtb3J5PyIpOwogCi0JcGFnZSA9IHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpOworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHZvaWQgKillbXB0eV96ZXJvX3BhZ2UpOwogCXNwbGl0X3BhZ2UocGFnZSwgb3JkZXIpOwotCXdoaWxlIChwYWdlIDwgdmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSArIChQQUdFX1NJWkUgPDwgb3JkZXIpKSkgeworCXdoaWxlIChwYWdlIDwgdmlydF90b19wYWdlKCh2b2lkICopKGVtcHR5X3plcm9fcGFnZSArIChQQUdFX1NJWkUgPDwgb3JkZXIpKSkpIHsKIAkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOwogCQlwYWdlKys7CiAJfQpAQCAtODAsMTMgKzEwMywxNjcgQEAKIAlyZXR1cm4gMVVMIDw8IG9yZGVyOwogfQogCi0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLXB0ZV90ICprbWFwX3B0ZTsKLXBncHJvdF90IGttYXBfcHJvdDsKKy8qCisgKiBUaGVzZSBhcmUgYWxtb3N0IGxpa2Uga21hcF9hdG9taWMgLyBrdW5tYXBfYXRtaWMgZXhjZXB0IHRoZXkgdGFrZSBhbgorICogYWRkaXRpb25hbCBhZGRyZXNzIGFyZ3VtZW50IGFzIHRoZSBoaW50LgorICovCiAKICNkZWZpbmUga21hcF9nZXRfZml4bWFwX3B0ZSh2YWRkcikJCQkJCVwKIAlwdGVfb2Zmc2V0X2tlcm5lbChwbWRfb2Zmc2V0KHB1ZF9vZmZzZXQocGdkX29mZnNldF9rKHZhZGRyKSwgKHZhZGRyKSksICh2YWRkcikpLCAodmFkZHIpKQogCisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworc3RhdGljIHB0ZV90ICprbWFwX2NvaGVyZW50X3B0ZTsKK3N0YXRpYyB2b2lkIF9faW5pdCBrbWFwX2NvaGVyZW50X2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhZGRyOworCisJLyogY2FjaGUgdGhlIGZpcnN0IGNvaGVyZW50IGttYXAgcHRlICovCisJdmFkZHIgPSBfX2ZpeF90b192aXJ0KEZJWF9DTUFQX0JFR0lOKTsKKwlrbWFwX2NvaGVyZW50X3B0ZSA9IGttYXBfZ2V0X2ZpeG1hcF9wdGUodmFkZHIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWFwX2NvaGVyZW50X2luaXQodm9pZCkge30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgKmttYXBfY29oZXJlbnQoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwllbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHg7CisJdW5zaWduZWQgbG9uZyB2YWRkciwgZmxhZ3MsIGVudHJ5bG87CisJdW5zaWduZWQgbG9uZyBvbGRfY3R4OworCXB0ZV90IHB0ZTsKKwlpbnQgdGxiaWR4OworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKwlpZHggPSAoYWRkciA+PiBQQUdFX1NISUZUKSAmIChGSVhfTl9DT0xPVVJTIC0gMSk7CisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCWlkeCArPSBGSVhfTl9DT0xPVVJTICogc21wX3Byb2Nlc3Nvcl9pZCgpOworI2VuZGlmCisJdmFkZHIgPSBfX2ZpeF90b192aXJ0KEZJWF9DTUFQX0VORCAtIGlkeCk7CisJcHRlID0gbWtfcHRlKHBhZ2UsIFBBR0VfS0VSTkVMKTsKKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpICYmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjEpCisJZW50cnlsbyA9IHB0ZS5wdGVfaGlnaDsKKyNlbHNlCisJZW50cnlsbyA9IHB0ZV92YWwocHRlKSA+PiA2OworI2VuZGlmCisKKwlFTlRFUl9DUklUSUNBTChmbGFncyk7CisJb2xkX2N0eCA9IHJlYWRfYzBfZW50cnloaSgpOworCXdyaXRlX2MwX2VudHJ5aGkodmFkZHIgJiAoUEFHRV9NQVNLIDw8IDEpKTsKKwl3cml0ZV9jMF9lbnRyeWxvMChlbnRyeWxvKTsKKwl3cml0ZV9jMF9lbnRyeWxvMShlbnRyeWxvKTsKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJc2V0X3B0ZShrbWFwX2NvaGVyZW50X3B0ZSAtIChGSVhfQ01BUF9FTkQgLSBpZHgpLCBwdGUpOworCS8qIHByZWxvYWQgVExCIGluc3RlYWQgb2YgbG9jYWxfZmx1c2hfdGxiX29uZSgpICovCisJbXRjMF90bGJ3X2hhemFyZCgpOworCXRsYl9wcm9iZSgpOworCXRsYl9wcm9iZV9oYXphcmQoKTsKKwl0bGJpZHggPSByZWFkX2MwX2luZGV4KCk7CisJbXRjMF90bGJ3X2hhemFyZCgpOworCWlmICh0bGJpZHggPCAwKQorCQl0bGJfd3JpdGVfcmFuZG9tKCk7CisJZWxzZQorCQl0bGJfd3JpdGVfaW5kZXhlZCgpOworI2Vsc2UKKwl0bGJpZHggPSByZWFkX2MwX3dpcmVkKCk7CisJd3JpdGVfYzBfd2lyZWQodGxiaWR4ICsgMSk7CisJd3JpdGVfYzBfaW5kZXgodGxiaWR4KTsKKwltdGMwX3RsYndfaGF6YXJkKCk7CisJdGxiX3dyaXRlX2luZGV4ZWQoKTsKKyNlbmRpZgorCXRsYndfdXNlX2hhemFyZCgpOworCXdyaXRlX2MwX2VudHJ5aGkob2xkX2N0eCk7CisJRVhJVF9DUklUSUNBTChmbGFncyk7CisKKwlyZXR1cm4gKHZvaWQqKSB2YWRkcjsKK30KKworI2RlZmluZSBVTklRVUVfRU5UUllISShpZHgpIChDS1NFRzAgKyAoKGlkeCkgPDwgKFBBR0VfU0hJRlQgKyAxKSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdW5tYXBfY29oZXJlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisjaWZuZGVmIENPTkZJR19NSVBTX01UX1NNVEMKKwl1bnNpZ25lZCBpbnQgd2lyZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFncywgb2xkX2N0eDsKKworCUVOVEVSX0NSSVRJQ0FMKGZsYWdzKTsKKwlvbGRfY3R4ID0gcmVhZF9jMF9lbnRyeWhpKCk7CisJd2lyZWQgPSByZWFkX2MwX3dpcmVkKCkgLSAxOworCXdyaXRlX2MwX3dpcmVkKHdpcmVkKTsKKwl3cml0ZV9jMF9pbmRleCh3aXJlZCk7CisJd3JpdGVfYzBfZW50cnloaShVTklRVUVfRU5UUllISSh3aXJlZCkpOworCXdyaXRlX2MwX2VudHJ5bG8wKDApOworCXdyaXRlX2MwX2VudHJ5bG8xKDApOworCW10YzBfdGxid19oYXphcmQoKTsKKwl0bGJfd3JpdGVfaW5kZXhlZCgpOworCXRsYndfdXNlX2hhemFyZCgpOworCXdyaXRlX2MwX2VudHJ5aGkob2xkX2N0eCk7CisJRVhJVF9DUklUSUNBTChmbGFncyk7CisjZW5kaWYKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOworfQorCit2b2lkIGNvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAorCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXZvaWQgKnZmcm9tLCAqdnRvOworCisJdnRvID0ga21hcF9hdG9taWModG8sIEtNX1VTRVIxKTsKKwlpZiAoY3B1X2hhc19kY19hbGlhc2VzKSB7CisJCXZmcm9tID0ga21hcF9jb2hlcmVudChmcm9tLCB2YWRkcik7CisJCWNvcHlfcGFnZSh2dG8sIHZmcm9tKTsKKwkJa3VubWFwX2NvaGVyZW50KGZyb20pOworCX0gZWxzZSB7CisJCXZmcm9tID0ga21hcF9hdG9taWMoZnJvbSwgS01fVVNFUjApOworCQljb3B5X3BhZ2UodnRvLCB2ZnJvbSk7CisJCWt1bm1hcF9hdG9taWModmZyb20sIEtNX1VTRVIwKTsKKwl9CisJaWYgKCgodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpICYmICFjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMpIHx8CisJICAgIHBhZ2VzX2RvX2FsaWFzKCh1bnNpZ25lZCBsb25nKXZ0bywgdmFkZHIgJiBQQUdFX01BU0spKQorCQlmbHVzaF9kYXRhX2NhY2hlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdnRvKTsKKwlrdW5tYXBfYXRvbWljKHZ0bywgS01fVVNFUjEpOworCS8qIE1ha2Ugc3VyZSB0aGlzIHBhZ2UgaXMgY2xlYXJlZCBvbiBvdGhlciBDUFUncyB0b28gYmVmb3JlIHVzaW5nIGl0ICovCisJc21wX3dtYigpOworfQorCitFWFBPUlRfU1lNQk9MKGNvcHlfdXNlcl9oaWdocGFnZSk7CisKK3ZvaWQgY29weV90b191c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLAorCXVuc2lnbmVkIGxvbmcgbGVuKQoreworCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpIHsKKwkJdm9pZCAqdnRvID0ga21hcF9jb2hlcmVudChwYWdlLCB2YWRkcikgKyAodmFkZHIgJiB+UEFHRV9NQVNLKTsKKwkJbWVtY3B5KHZ0bywgc3JjLCBsZW4pOworCQlrdW5tYXBfY29oZXJlbnQocGFnZSk7CisJfSBlbHNlCisJCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSAmJiAhY3B1X2hhc19pY19maWxsc19mX2RjKQorCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgdmFkZHIsIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKK30KKworRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXJfcGFnZSk7CisKK3ZvaWQgY29weV9mcm9tX3VzZXJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsCisJdW5zaWduZWQgbG9uZyBsZW4pCit7CisJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykgeworCQl2b2lkICp2ZnJvbSA9CisJCQlrbWFwX2NvaGVyZW50KHBhZ2UsIHZhZGRyKSArICh2YWRkciAmIH5QQUdFX01BU0spOworCQltZW1jcHkoZHN0LCB2ZnJvbSwgbGVuKTsKKwkJa3VubWFwX2NvaGVyZW50KHBhZ2UpOworCX0gZWxzZQorCQltZW1jcHkoZHN0LCBzcmMsIGxlbik7Cit9CisKK0VYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXJfcGFnZSk7CisKKworI2lmZGVmIENPTkZJR19ISUdITUVNCitwdGVfdCAqa21hcF9wdGU7CitwZ3Byb3RfdCBrbWFwX3Byb3Q7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBrbWFwX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGttYXBfdnN0YXJ0OwpAQCAtOTcsMTEgKzI3NCwxMiBAQAogCiAJa21hcF9wcm90ID0gUEFHRV9LRVJORUw7CiB9CisjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KIAotI2lmZGVmIENPTkZJR18zMkJJVAogdm9pZCBfX2luaXQgZml4cmFuZ2VfaW5pdCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKIAlwZ2RfdCAqcGdkX2Jhc2UpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfSElHSE1FTSkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19NVF9TTVRDKQogCXBnZF90ICpwZ2Q7CiAJcHVkX3QgKnB1ZDsKIAlwbWRfdCAqcG1kOwpAQCAtMTIyLDcgKzMwMCw3IEBACiAJCQlmb3IgKDsgKGsgPCBQVFJTX1BFUl9QTUQpICYmICh2YWRkciAhPSBlbmQpOyBwbWQrKywgaysrKSB7CiAJCQkJaWYgKHBtZF9ub25lKCpwbWQpKSB7CiAJCQkJCXB0ZSA9IChwdGVfdCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOwotCQkJCQlzZXRfcG1kKHBtZCwgX19wbWQocHRlKSk7CisJCQkJCXNldF9wbWQocG1kLCBfX3BtZCgodW5zaWduZWQgbG9uZylwdGUpKTsKIAkJCQkJaWYgKHB0ZSAhPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIDApKQogCQkJCQkJQlVHKCk7CiAJCQkJfQpAQCAtMTMyLDkgKzMxMCw4IEBACiAJCX0KIAkJaiA9IDA7CiAJfQorI2VuZGlmCiB9Ci0jZW5kaWYgLyogQ09ORklHXzMyQklUICovCi0jZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KIAogI2lmbmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUwogZXh0ZXJuIHZvaWQgcGFnZXRhYmxlX2luaXQodm9pZCk7CkBAIC0xNjQsNyArMzQxLDcgQEAKIHZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10gPSB7IDAsIH07Ci0JdW5zaWduZWQgbG9uZyBtYXhfZG1hLCBoaWdoLCBsb3c7CisJdW5zaWduZWQgbG9uZyBtYXhfZG1hLCBsb3c7CiAjaWZuZGVmIENPTkZJR19GTEFUTUVNCiAJdW5zaWduZWQgbG9uZyB6aG9sZXNfc2l6ZVtNQVhfTlJfWk9ORVNdID0geyAwLCB9OwogCXVuc2lnbmVkIGxvbmcgaSwgaiwgcGZuOwpAQCAtMTc1LDEwICszNTIsMTAgQEAKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCWttYXBfaW5pdCgpOwogI2VuZGlmCisJa21hcF9jb2hlcmVudF9pbml0KCk7CiAKIAltYXhfZG1hID0gdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOwogCWxvdyA9IG1heF9sb3dfcGZuOwotCWhpZ2ggPSBoaWdoZW5kX3BmbjsKIAogI2lmZGVmIENPTkZJR19JU0EKIAlpZiAobG93IDwgbWF4X2RtYSkKQEAgLTE5MSwxMyArMzY4LDEzIEBACiAJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBsb3c7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVGhpcyBwcm9jZXNzb3IgZG9lc24ndCBzdXBwb3J0IGhpZ2htZW0uIik7Ci0JCWlmIChoaWdoIC0gbG93KQotCQkJcHJpbnRrKCIgJWxkayBoaWdobWVtIGlnbm9yZWQiLCBoaWdoIC0gbG93KTsKLQkJcHJpbnRrKCJcbiIpOwotCX0gZWxzZQotCQl6b25lc19zaXplW1pPTkVfSElHSE1FTV0gPSBoaWdoIC0gbG93OworCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IGhpZ2hlbmRfcGZuIC0gaGlnaHN0YXJ0X3BmbjsKKworCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMgJiYgem9uZXNfc2l6ZVtaT05FX0hJR0hNRU1dKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRoaXMgcHJvY2Vzc29yIGRvZXNuJ3Qgc3VwcG9ydCBoaWdobWVtLiIKKwkJICAgICAgICIgJWxkayBoaWdobWVtIGlnbm9yZWRcbiIsIHpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSk7CisJCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IDA7CisJfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRkxBVE1FTQpAQCAtMjkwLDE1ICs0NjcsMTggQEAKIH0KICNlbmRpZiAvKiAhQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMgKi8KIAotdm9pZCBmcmVlX2luaXRfcGFnZXMoY2hhciAqd2hhdCwgdW5zaWduZWQgbG9uZyBiZWdpbiwgdW5zaWduZWQgbG9uZyBlbmQpCitzdGF0aWMgdm9pZCBmcmVlX2luaXRfcGFnZXMoY2hhciAqd2hhdCwgdW5zaWduZWQgbG9uZyBiZWdpbiwgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgcGZuOwogCi0JZm9yIChhZGRyID0gYmVnaW47IGFkZHIgPCBlbmQ7IGFkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShhZGRyKSk7Ci0JCWluaXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2UoYWRkcikpOwotCQltZW1zZXQoKHZvaWQgKilhZGRyLCAweGNjLCBQQUdFX1NJWkUpOwotCQlmcmVlX3BhZ2UoYWRkcik7CisJZm9yIChwZm4gPSBQRk5fVVAoYmVnaW4pOyBwZm4gPCBQRk5fRE9XTihlbmQpOyBwZm4rKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisJCXZvaWQgKmFkZHIgPSBwaHlzX3RvX3ZpcnQoUEZOX1BIWVMocGZuKSk7CisKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCWluaXRfcGFnZV9jb3VudChwYWdlKTsKKwkJbWVtc2V0KGFkZHIsIFBPSVNPTl9GUkVFX0lOSVRNRU0sIFBBR0VfU0laRSk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOwogCQl0b3RhbHJhbV9wYWdlcysrOwogCX0KIAlwcmludGsoS0VSTl9JTkZPICJGcmVlaW5nICVzOiAlbGRrIGZyZWVkXG4iLCB3aGF0LCAoZW5kIC0gYmVnaW4pID4+IDEwKTsKQEAgLTMwNywxMiArNDg3LDkgQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIHZvaWQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewotI2lmZGVmIENPTkZJR182NEJJVAotCS8qIFN3aXRjaCBmcm9tIEtTRUcwIHRvIFhLUEhZUyBhZGRyZXNzZXMgKi8KLQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChDUEhZU0FERFIoc3RhcnQpKTsKLQllbmQgPSAodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQoQ1BIWVNBRERSKGVuZCkpOwotI2VuZGlmCi0JZnJlZV9pbml0X3BhZ2VzKCJpbml0cmQgbWVtb3J5Iiwgc3RhcnQsIGVuZCk7CisJZnJlZV9pbml0X3BhZ2VzKCJpbml0cmQgbWVtb3J5IiwKKwkJCXZpcnRfdG9fcGh5cygodm9pZCAqKXN0YXJ0KSwKKwkJCXZpcnRfdG9fcGh5cygodm9pZCAqKWVuZCkpOwogfQogI2VuZGlmCiAKQEAgLTMyMCwxNyArNDk3LDEzIEBACiAKIHZvaWQgZnJlZV9pbml0bWVtKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kLCBmcmVlZDsKKwl1bnNpZ25lZCBsb25nIGZyZWVkOwogCiAJZnJlZWQgPSBwcm9tX2ZyZWVfcHJvbV9tZW1vcnkoKTsKIAlpZiAoZnJlZWQpCiAJCXByaW50ayhLRVJOX0lORk8gIkZyZWVpbmcgZmlybXdhcmUgbWVtb3J5OiAlbGRrIGZyZWVkXG4iLGZyZWVkKTsKIAotCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfYmVnaW4pOwotCWVuZCA9ICh1bnNpZ25lZCBsb25nKSgmX19pbml0X2VuZCk7Ci0jaWZkZWYgQ09ORklHXzY0QklUCi0Jc3RhcnQgPSBQQUdFX09GRlNFVCB8IENQSFlTQUREUihzdGFydCk7Ci0JZW5kID0gUEFHRV9PRkZTRVQgfCBDUEhZU0FERFIoZW5kKTsKLSNlbmRpZgotCWZyZWVfaW5pdF9wYWdlcygidW51c2VkIGtlcm5lbCBtZW1vcnkiLCBzdGFydCwgZW5kKTsKKwlmcmVlX2luaXRfcGFnZXMoInVudXNlZCBrZXJuZWwgbWVtb3J5IiwKKwkJCV9fcGFfc3ltYm9sKCZfX2luaXRfYmVnaW4pLAorCQkJX19wYV9zeW1ib2woJl9faW5pdF9lbmQpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9pb3JlbWFwLmMgYi9hcmNoL21pcHMvbW0vaW9yZW1hcC5jCmluZGV4IDMxMDFkMWQuLmZjMmM5NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC9taXBzL21tL2lvcmVtYXAuYwpAQCAtNiw5OCArNiwxMyBAQAogICogKEMpIENvcHlyaWdodCAxOTk1IDE5OTYgTGludXMgVG9ydmFsZHMKICAqIChDKSBDb3B5cmlnaHQgMjAwMSwgMjAwMiBSYWxmIEJhZWNobGUKICAqLworI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVtYXBfYXJlYV9wdGUocHRlX3QgKiBwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKLQlwaHlzX3Qgc2l6ZSwgcGh5c190IHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlwaHlzX3QgZW5kOwotCXVuc2lnbmVkIGxvbmcgcGZuOwotCXBncHJvdF90IHBncHJvdCA9IF9fcGdwcm90KF9QQUdFX0dMT0JBTCB8IF9QQUdFX1BSRVNFTlQgfCBfX1JFQURBQkxFCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBfX1dSSVRFQUJMRSB8IGZsYWdzKTsKLQotCWFkZHJlc3MgJj0gflBNRF9NQVNLOwotCWVuZCA9IGFkZHJlc3MgKyBzaXplOwotCWlmIChlbmQgPiBQTURfU0laRSkKLQkJZW5kID0gUE1EX1NJWkU7Ci0JaWYgKGFkZHJlc3MgPj0gZW5kKQotCQlCVUcoKTsKLQlwZm4gPSBwaHlzX2FkZHIgPj4gUEFHRV9TSElGVDsKLQlkbyB7Ci0JCWlmICghcHRlX25vbmUoKnB0ZSkpIHsKLQkJCXByaW50aygicmVtYXBfYXJlYV9wdGU6IHBhZ2UgYWxyZWFkeSBleGlzdHNcbiIpOwotCQkJQlVHKCk7Ci0JCX0KLQkJc2V0X3B0ZShwdGUsIHBmbl9wdGUocGZuLCBwZ3Byb3QpKTsKLQkJYWRkcmVzcyArPSBQQUdFX1NJWkU7Ci0JCXBmbisrOwotCQlwdGUrKzsKLQl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJlbWFwX2FyZWFfcG1kKHBtZF90ICogcG1kLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCi0JcGh5c190IHNpemUsIHBoeXNfdCBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JcGh5c190IGVuZDsKLQotCWFkZHJlc3MgJj0gflBHRElSX01BU0s7Ci0JZW5kID0gYWRkcmVzcyArIHNpemU7Ci0JaWYgKGVuZCA+IFBHRElSX1NJWkUpCi0JCWVuZCA9IFBHRElSX1NJWkU7Ci0JcGh5c19hZGRyIC09IGFkZHJlc3M7Ci0JaWYgKGFkZHJlc3MgPj0gZW5kKQotCQlCVUcoKTsKLQlkbyB7Ci0JCXB0ZV90ICogcHRlID0gcHRlX2FsbG9jX2tlcm5lbChwbWQsIGFkZHJlc3MpOwotCQlpZiAoIXB0ZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlyZW1hcF9hcmVhX3B0ZShwdGUsIGFkZHJlc3MsIGVuZCAtIGFkZHJlc3MsIGFkZHJlc3MgKyBwaHlzX2FkZHIsIGZsYWdzKTsKLQkJYWRkcmVzcyA9IChhZGRyZXNzICsgUE1EX1NJWkUpICYgUE1EX01BU0s7Ci0JCXBtZCsrOwotCX0gd2hpbGUgKGFkZHJlc3MgJiYgKGFkZHJlc3MgPCBlbmQpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZW1hcF9hcmVhX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGh5c190IHBoeXNfYWRkciwKLQlwaHlzX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlpbnQgZXJyb3I7Ci0JcGdkX3QgKiBkaXI7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyZXNzICsgc2l6ZTsKLQotCXBoeXNfYWRkciAtPSBhZGRyZXNzOwotCWRpciA9IHBnZF9vZmZzZXQoJmluaXRfbW0sIGFkZHJlc3MpOwotCWZsdXNoX2NhY2hlX2FsbCgpOwotCWlmIChhZGRyZXNzID49IGVuZCkKLQkJQlVHKCk7Ci0JZG8gewotCQlwdWRfdCAqcHVkOwotCQlwbWRfdCAqcG1kOwotCi0JCWVycm9yID0gLUVOT01FTTsKLQkJcHVkID0gcHVkX2FsbG9jKCZpbml0X21tLCBkaXIsIGFkZHJlc3MpOwotCQlpZiAoIXB1ZCkKLQkJCWJyZWFrOwotCQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHB1ZCwgYWRkcmVzcyk7Ci0JCWlmICghcG1kKQotCQkJYnJlYWs7Ci0JCWlmIChyZW1hcF9hcmVhX3BtZChwbWQsIGFkZHJlc3MsIGVuZCAtIGFkZHJlc3MsCi0JCQkJCSBwaHlzX2FkZHIgKyBhZGRyZXNzLCBmbGFncykpCi0JCQlicmVhazsKLQkJZXJyb3IgPSAwOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQR0RJUl9TSVpFKSAmIFBHRElSX01BU0s7Ci0JCWRpcisrOwotCX0gd2hpbGUgKGFkZHJlc3MgJiYgKGFkZHJlc3MgPCBlbmQpKTsKLQlmbHVzaF90bGJfYWxsKCk7Ci0JcmV0dXJuIGVycm9yOwotfQorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIC8qCiAgKiBHZW5lcmljIG1hcHBpbmcgZnVuY3Rpb24gKG5vdCB2aXNpYmxlIG91dHNpZGUpOgpAQCAtMTIxLDYgKzM2LDcgQEAKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAlwaHlzX3QgbGFzdF9hZGRyOwogCXZvaWQgKiBhZGRyOworCXBncHJvdF90IHBncHJvdDsKIAogCXBoeXNfYWRkciA9IGZpeHVwX2JpZ3BoeXNfYWRkcihwaHlzX2FkZHIsIHNpemUpOwogCkBAIC0xNTIsNiArNjgsOSBAQAogCQkJCXJldHVybiBOVUxMOwogCX0KIAorCXBncHJvdCA9IF9fcGdwcm90KF9QQUdFX0dMT0JBTCB8IF9QQUdFX1BSRVNFTlQgfCBfX1JFQURBQkxFCisJCQkgIHwgX19XUklURUFCTEUgfCBmbGFncyk7CisKIAkvKgogCSAqIE1hcHBpbmdzIGhhdmUgdG8gYmUgcGFnZS1hbGlnbmVkCiAJICovCkBAIC0xNjYsNyArODUsOCBAQAogCWlmICghYXJlYSkKIAkJcmV0dXJuIE5VTEw7CiAJYWRkciA9IGFyZWEtPmFkZHI7Ci0JaWYgKHJlbWFwX2FyZWFfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGFkZHIsIHBoeXNfYWRkciwgc2l6ZSwgZmxhZ3MpKSB7CisJaWYgKGlvcmVtYXBfcGFnZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLCAodW5zaWduZWQgbG9uZylhZGRyICsgc2l6ZSwKKwkJCSAgICAgICBwaHlzX2FkZHIsIHBncHJvdCkpIHsKIAkJdnVubWFwKGFkZHIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xNzYsNyArOTYsNyBAQAogCiAjZGVmaW5lIElTX0tTRUcxKGFkZHIpICgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICYgfjB4MWZmZmZmZmZVTCkgPT0gQ0tTRUcxKQogCi12b2lkIF9faW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit2b2lkIF9faW91bm1hcChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJc3RydWN0IHZtX3N0cnVjdCAqcDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3BnLXI0ay5jIGIvYXJjaC9taXBzL21tL3BnLXI0ay5jCmluZGV4IGI3Yzc0OTIuLmQ0MWZjNTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9wZy1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vcGctcjRrLmMKQEAgLTI3MCw2ICsyNzAsMjAgQEAKIAllbWl0X2luc3RydWN0aW9uKG1pKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX2FkZGl1X2EyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gbWk7CisKKwlCVUdfT04ob2Zmc2V0ID4gMHg3ZmZmKTsKKworCW1pLmlfZm9ybWF0Lm9wY29kZSAgICAgPSBjcHVfaGFzXzY0Yml0X2dwX3JlZ3MgPyBkYWRkaXVfb3AgOiBhZGRpdV9vcDsKKwltaS5pX2Zvcm1hdC5ycyAgICAgICAgID0gNjsJCS8qICRhMiAqLworCW1pLmlfZm9ybWF0LnJ0ICAgICAgICAgPSA2OwkJLyogJGEyICovCisJbWkuaV9mb3JtYXQuc2ltbWVkaWF0ZSA9IG9mZnNldDsKKworCWVtaXRfaW5zdHJ1Y3Rpb24obWkpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYnVpbGRfYWRkaXVfYTEodW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CiAJdW5pb24gbWlwc19pbnN0cnVjdGlvbiBtaTsKQEAgLTMzMyw2ICszNDcsNyBAQAogdm9pZCBfX2luaXQgYnVpbGRfY2xlYXJfcGFnZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBsb29wX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgb2ZmOwogCiAJZXBjID0gKHVuc2lnbmVkIGludCAqKSAmY2xlYXJfcGFnZV9hcnJheTsKIAlpbnN0cnVjdGlvbl9wZW5kaW5nID0gMDsKQEAgLTM2OSw3ICszODQsMTIgQEAKIAkJfQogCX0KIAotCWJ1aWxkX2FkZGl1X2EyX2EwKFBBR0VfU0laRSAtIChjcHVfaGFzX3ByZWZldGNoID8gcHJlZl9vZmZzZXRfY2xlYXIgOiAwKSk7CisgICAgICAgIG9mZiA9IFBBR0VfU0laRSAtIChjcHVfaGFzX3ByZWZldGNoID8gcHJlZl9vZmZzZXRfY2xlYXIgOiAwKTsKKwlpZiAob2ZmID4gMHg3ZmZmKSB7CisJCWJ1aWxkX2FkZGl1X2EyX2EwKG9mZiA+PiAxKTsKKwkJYnVpbGRfYWRkaXVfYTIob2ZmID4+IDEpOworCX0gZWxzZQorCQlidWlsZF9hZGRpdV9hMl9hMChvZmYpOwogCiAJaWYgKFI0NjAwX1YyX0hJVF9DQUNIRU9QX1dBUiAmJiBjcHVfaXNfcjQ2MDBfdjJfeCgpKQogCQlidWlsZF9pbnNuX3dvcmQoMHgzYzAxYTAwMCk7CS8qIGx1aSAgICAgJGF0LCAweGEwMDAgICovCkBAIC00MjAsMTIgKzQ0MCwxOCBAQAogdm9pZCBfX2luaXQgYnVpbGRfY29weV9wYWdlKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGxvb3Bfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBvZmY7CiAKIAllcGMgPSAodW5zaWduZWQgaW50ICopICZjb3B5X3BhZ2VfYXJyYXk7CiAJc3RvcmVfb2Zmc2V0ID0gbG9hZF9vZmZzZXQgPSAwOwogCWluc3RydWN0aW9uX3BlbmRpbmcgPSAwOwogCi0JYnVpbGRfYWRkaXVfYTJfYTAoUEFHRV9TSVpFIC0gKGNwdV9oYXNfcHJlZmV0Y2ggPyBwcmVmX29mZnNldF9jb3B5IDogMCkpOworCW9mZiA9IFBBR0VfU0laRSAtIChjcHVfaGFzX3ByZWZldGNoID8gcHJlZl9vZmZzZXRfY29weSA6IDApOworCWlmIChvZmYgPiAweDdmZmYpIHsKKwkJYnVpbGRfYWRkaXVfYTJfYTAob2ZmID4+IDEpOworCQlidWlsZF9hZGRpdV9hMihvZmYgPj4gMSk7CisJfSBlbHNlCisJCWJ1aWxkX2FkZGl1X2EyX2EwKG9mZik7CiAKIAlpZiAoUjQ2MDBfVjJfSElUX0NBQ0hFT1BfV0FSICYmIGNwdV9pc19yNDYwMF92Ml94KCkpCiAJCWJ1aWxkX2luc25fd29yZCgweDNjMDFhMDAwKTsJLyogbHVpICAgICAkYXQsIDB4YTAwMCAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9wZ3RhYmxlLTMyLmMgYi9hcmNoL21pcHMvbW0vcGd0YWJsZS0zMi5jCmluZGV4IDRiZGFhMDUuLjRhNjFlNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9wZ3RhYmxlLTMyLmMKKysrIGIvYXJjaC9taXBzL21tL3BndGFibGUtMzIuYwpAQCAtMzEsOSArMzEsMTAgQEAKIAogdm9pZCBfX2luaXQgcGFnZXRhYmxlX2luaXQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfSElHSE1FTQogCXVuc2lnbmVkIGxvbmcgdmFkZHI7Ci0JcGdkX3QgKnBnZCwgKnBnZF9iYXNlOworCXBnZF90ICpwZ2RfYmFzZTsKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCXBnZF90ICpwZ2Q7CiAJcHVkX3QgKnB1ZDsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGU7CkBAIC00NCw3ICs0NSw2IEBACiAJcGdkX2luaXQoKHVuc2lnbmVkIGxvbmcpc3dhcHBlcl9wZ19kaXIKIAkJICsgc2l6ZW9mKHBnZF90KSAqIFVTRVJfUFRSU19QRVJfUEdEKTsKIAotI2lmZGVmIENPTkZJR19ISUdITUVNCiAJcGdkX2Jhc2UgPSBzd2FwcGVyX3BnX2RpcjsKIAogCS8qCkBAIC01Myw2ICs1Myw3IEBACiAJdmFkZHIgPSBfX2ZpeF90b192aXJ0KF9fZW5kX29mX2ZpeGVkX2FkZHJlc3NlcyAtIDEpICYgUE1EX01BU0s7CiAJZml4cmFuZ2VfaW5pdCh2YWRkciwgMCwgcGdkX2Jhc2UpOwogCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAkvKgogCSAqIFBlcm1hbmVudCBrbWFwczoKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9wZ3RhYmxlLTY0LmMgYi9hcmNoL21pcHMvbW0vcGd0YWJsZS02NC5jCmluZGV4IDQ0YjVlOTdmLi5jNDZlYjY1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vcGd0YWJsZS02NC5jCisrKyBiL2FyY2gvbWlwcy9tbS9wZ3RhYmxlLTY0LmMKQEAgLTgsNiArOCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAogdm9pZCBwZ2RfaW5pdCh1bnNpZ25lZCBsb25nIHBhZ2UpCkBAIC01Miw3ICs1MywyMCBAQAogCiB2b2lkIF9faW5pdCBwYWdldGFibGVfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisJcGdkX3QgKnBnZF9iYXNlOworCiAJLyogSW5pdGlhbGl6ZSB0aGUgZW50aXJlIHBnZC4gICovCiAJcGdkX2luaXQoKHVuc2lnbmVkIGxvbmcpc3dhcHBlcl9wZ19kaXIpOworI2lmZGVmIE1PRFVMRV9TVEFSVAorCXBnZF9pbml0KCh1bnNpZ25lZCBsb25nKW1vZHVsZV9wZ19kaXIpOworI2VuZGlmCiAJcG1kX2luaXQoKHVuc2lnbmVkIGxvbmcpaW52YWxpZF9wbWRfdGFibGUsICh1bnNpZ25lZCBsb25nKWludmFsaWRfcHRlX3RhYmxlKTsKKworCXBnZF9iYXNlID0gc3dhcHBlcl9wZ19kaXI7CisJLyoKKwkgKiBGaXhlZCBtYXBwaW5nczoKKwkgKi8KKwl2YWRkciA9IF9fZml4X3RvX3ZpcnQoX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzIC0gMSkgJiBQTURfTUFTSzsKKwlmaXhyYW5nZV9pbml0KHZhZGRyLCAwLCBwZ2RfYmFzZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vdGxiZXguYyBiL2FyY2gvbWlwcy9tbS90bGJleC5jCmluZGV4IDZmOGIyNWMuLjQ5MmM1MTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS90bGJleC5jCisrKyBiL2FyY2gvbWlwcy9tbS90bGJleC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlpbnNuX2FkZHUsIGluc25fYWRkaXUsIGluc25fYW5kLCBpbnNuX2FuZGksIGluc25fYmVxLAogCWluc25fYmVxbCwgaW5zbl9iZ2V6LCBpbnNuX2JnZXpsLCBpbnNuX2JsdHosIGluc25fYmx0emwsCiAJaW5zbl9ibmUsIGluc25fZGFkZHUsIGluc25fZGFkZGl1LCBpbnNuX2RtZmMwLCBpbnNuX2RtdGMwLAotCWluc25fZHNsbCwgaW5zbl9kc2xsMzIsIGluc25fZHNyYSwgaW5zbl9kc3JsLAorCWluc25fZHNsbCwgaW5zbl9kc2xsMzIsIGluc25fZHNyYSwgaW5zbl9kc3JsLCBpbnNuX2RzcmwzMiwKIAlpbnNuX2RzdWJ1LCBpbnNuX2VyZXQsIGluc25faiwgaW5zbl9qYWwsIGluc25fanIsIGluc25fbGQsCiAJaW5zbl9sbCwgaW5zbl9sbGQsIGluc25fbHVpLCBpbnNuX2x3LCBpbnNuX21mYzAsIGluc25fbXRjMCwKIAlpbnNuX29yaSwgaW5zbl9yZmUsIGluc25fc2MsIGluc25fc2NkLCBpbnNuX3NkLCBpbnNuX3NsbCwKQEAgLTE0NSw2ICsxNDUsNyBAQAogCXsgaW5zbl9kc2xsMzIsIE0oc3BlY19vcCwwLDAsMCwwLGRzbGwzMl9vcCksIFJUIHwgUkQgfCBSRSB9LAogCXsgaW5zbl9kc3JhLCBNKHNwZWNfb3AsMCwwLDAsMCxkc3JhX29wKSwgUlQgfCBSRCB8IFJFIH0sCiAJeyBpbnNuX2RzcmwsIE0oc3BlY19vcCwwLDAsMCwwLGRzcmxfb3ApLCBSVCB8IFJEIHwgUkUgfSwKKwl7IGluc25fZHNybDMyLCBNKHNwZWNfb3AsMCwwLDAsMCxkc3JsMzJfb3ApLCBSVCB8IFJEIHwgUkUgfSwKIAl7IGluc25fZHN1YnUsIE0oc3BlY19vcCwwLDAsMCwwLGRzdWJ1X29wKSwgUlMgfCBSVCB8IFJEIH0sCiAJeyBpbnNuX2VyZXQsIE0oY29wMF9vcCxjb3Bfb3AsMCwwLDAsZXJldF9vcCksIDAgfSwKIAl7IGluc25faiwgTShqX29wLDAsMCwwLDAsMCksIEpJTU0gfSwKQEAgLTM4NSw2ICszODYsNyBAQAogSV91MnUxdTMoX2RzbGwzMik7CiBJX3UydTF1MyhfZHNyYSk7CiBJX3UydTF1MyhfZHNybCk7CitJX3UydTF1MyhfZHNybDMyKTsKIElfdTN1MXUyKF9kc3VidSk7CiBJXzAoX2VyZXQpOwogSV91MShfaik7CkBAIC00MjEsNiArNDIzLDkgQEAKIAlsYWJlbF9pbnZhbGlkLAogCWxhYmVsX3NlY29uZF9wYXJ0LAogCWxhYmVsX2xlYXZlLAorI2lmZGVmIE1PRFVMRV9TVEFSVAorCWxhYmVsX21vZHVsZV9hbGxvYywKKyNlbmRpZgogCWxhYmVsX3ZtYWxsb2MsCiAJbGFiZWxfdm1hbGxvY19kb25lLAogCWxhYmVsX3RsYndfaGF6YXJkLApAQCAtNDUzLDYgKzQ1OCw5IEBACiAKIExfTEEoX3NlY29uZF9wYXJ0KQogTF9MQShfbGVhdmUpCisjaWZkZWYgTU9EVUxFX1NUQVJUCitMX0xBKF9tb2R1bGVfYWxsb2MpCisjZW5kaWYKIExfTEEoX3ZtYWxsb2MpCiBMX0xBKF92bWFsbG9jX2RvbmUpCiBMX0xBKF90bGJ3X2hhemFyZCkKQEAgLTY4NCw2ICs2OTIsMTMgQEAKIAlpX2JnZXpsKHAsIHJlZywgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQoraWxfYmdleih1MzIgKipwLCBzdHJ1Y3QgcmVsb2MgKipyLCB1bnNpZ25lZCBpbnQgcmVnLCBlbnVtIGxhYmVsX2lkIGwpCit7CisJcl9taXBzX3BjMTYociwgKnAsIGwpOworCWlfYmdleihwLCByZWcsIDApOworfQorCiAvKiBUaGUgb25seSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGFsbG93ZWQgaW4gVExCIGhhbmRsZXJzLiAqLwogI2RlZmluZSBLMAkJMjYKICNkZWZpbmUgSzEJCTI3CkBAIC05NjgsNyArOTgzLDExIEBACiAJICogVGhlIHZtYWxsb2MgaGFuZGxpbmcgaXMgbm90IGluIHRoZSBob3RwYXRoLgogCSAqLwogCWlfZG1mYzAocCwgdG1wLCBDMF9CQURWQUREUik7CisjaWZkZWYgTU9EVUxFX1NUQVJUCisJaWxfYmx0eihwLCByLCB0bXAsIGxhYmVsX21vZHVsZV9hbGxvYyk7CisjZWxzZQogCWlsX2JsdHoocCwgciwgdG1wLCBsYWJlbF92bWFsbG9jKTsKKyNlbmRpZgogCS8qIE5vIGlfbm9wIG5lZWRlZCBoZXJlLCBzaW5jZSB0aGUgbmV4dCBpbnNuIGRvZXNuJ3QgdG91Y2ggVE1QLiAqLwogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtOTk2LDcgKzEwMTUsMTIgQEAKICNlbmRpZgogCiAJbF92bWFsbG9jX2RvbmUobCwgKnApOwotCWlfZHNybChwLCB0bXAsIHRtcCwgUEdESVJfU0hJRlQtMyk7IC8qIGdldCBwZ2Qgb2Zmc2V0IGluIGJ5dGVzICovCisKKwlpZiAoUEdESVJfU0hJRlQgLSAzIDwgMzIpCQkvKiBnZXQgcGdkIG9mZnNldCBpbiBieXRlcyAqLworCQlpX2RzcmwocCwgdG1wLCB0bXAsIFBHRElSX1NISUZULTMpOworCWVsc2UKKwkJaV9kc3JsMzIocCwgdG1wLCB0bXAsIFBHRElSX1NISUZUIC0gMyAtIDMyKTsKKwogCWlfYW5kaShwLCB0bXAsIHRtcCwgKFBUUlNfUEVSX1BHRCAtIDEpPDwzKTsKIAlpX2RhZGR1KHAsIHB0ciwgcHRyLCB0bXApOyAvKiBhZGQgaW4gcGdkIG9mZnNldCAqLwogCWlfZG1mYzAocCwgdG1wLCBDMF9CQURWQUREUik7IC8qIGdldCBmYXVsdGluZyBhZGRyZXNzICovCkBAIC0xMDE2LDggKzEwNDAsNDYgQEAKIHsKIAlsb25nIHN3cGQgPSAobG9uZylzd2FwcGVyX3BnX2RpcjsKIAorI2lmZGVmIE1PRFVMRV9TVEFSVAorCWxvbmcgbW9kZCA9IChsb25nKW1vZHVsZV9wZ19kaXI7CisKKwlsX21vZHVsZV9hbGxvYyhsLCAqcCk7CisJLyoKKwkgKiBBc3N1bXB0aW9uOgorCSAqIFZNQUxMT0NfU1RBUlQgPj0gMHhjMDAwMDAwMDAwMDAwMDAwVUwKKwkgKiBNT0RVTEVfU1RBUlQgPj0gMHhlMDAwMDAwMDAwMDAwMDAwVUwKKwkgKi8KKwlpX1NMTChwLCBwdHIsIGJ2YWRkciwgMik7CisJaWxfYmdleihwLCByLCBwdHIsIGxhYmVsX3ZtYWxsb2MpOworCisJaWYgKGluX2NvbXBhdF9zcGFjZV9wKE1PRFVMRV9TVEFSVCkgJiYgIXJlbF9sbyhNT0RVTEVfU1RBUlQpKSB7CisJCWlfbHVpKHAsIHB0ciwgcmVsX2hpKE1PRFVMRV9TVEFSVCkpOyAvKiBkZWxheSBzbG90ICovCisJfSBlbHNlIHsKKwkJLyogdW5saWtlbHkgY29uZmlndXJhdGlvbiAqLworCQlpX25vcChwKTsgLyogZGVsYXkgc2xvdCAqLworCQlpX0xBKHAsIHB0ciwgTU9EVUxFX1NUQVJUKTsKKwl9CisJaV9kc3VidShwLCBidmFkZHIsIGJ2YWRkciwgcHRyKTsKKworCWlmIChpbl9jb21wYXRfc3BhY2VfcChtb2RkKSAmJiAhcmVsX2xvKG1vZGQpKSB7CisJCWlsX2IocCwgciwgbGFiZWxfdm1hbGxvY19kb25lKTsKKwkJaV9sdWkocCwgcHRyLCByZWxfaGkobW9kZCkpOworCX0gZWxzZSB7CisJCWlfTEFfbW9zdGx5KHAsIHB0ciwgbW9kZCk7CisJCWlsX2IocCwgciwgbGFiZWxfdm1hbGxvY19kb25lKTsKKwkJaV9kYWRkaXUocCwgcHRyLCBwdHIsIHJlbF9sbyhtb2RkKSk7CisJfQorCisJbF92bWFsbG9jKGwsICpwKTsKKwlpZiAoaW5fY29tcGF0X3NwYWNlX3AoTU9EVUxFX1NUQVJUKSAmJiAhcmVsX2xvKE1PRFVMRV9TVEFSVCkgJiYKKwkgICAgTU9EVUxFX1NUQVJUIDw8IDMyID09IFZNQUxMT0NfU1RBUlQpCisJCWlfZHNsbDMyKHAsIHB0ciwgcHRyLCAwKTsJLyogdHlwaWNhbCBjYXNlICovCisJZWxzZQorCQlpX0xBKHAsIHB0ciwgVk1BTExPQ19TVEFSVCk7CisjZWxzZQogCWxfdm1hbGxvYyhsLCAqcCk7CiAJaV9MQShwLCBwdHIsIFZNQUxMT0NfU1RBUlQpOworI2VuZGlmCiAJaV9kc3VidShwLCBidmFkZHIsIGJ2YWRkciwgcHRyKTsKIAogCWlmIChpbl9jb21wYXRfc3BhY2VfcChzd3BkKSAmJiAhcmVsX2xvKHN3cGQpKSB7CkBAIC0xMDczLDcgKzExMzUsNyBAQAogCiBzdGF0aWMgX19pbml0IHZvaWQgYnVpbGRfYWRqdXN0X2NvbnRleHQodTMyICoqcCwgdW5zaWduZWQgaW50IGN0eCkKIHsKLQl1bnNpZ25lZCBpbnQgc2hpZnQgPSA0IC0gKFBURV9UX0xPRzIgKyAxKTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSA0IC0gKFBURV9UX0xPRzIgKyAxKSArIFBBR0VfU0hJRlQgLSAxMjsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IChQVFJTX1BFUl9QVEUgLyAyIC0gMSkgPDwgKFBURV9UX0xPRzIgKyAxKTsKIAogCXN3aXRjaCAoY3VycmVudF9jcHVfZGF0YS5jcHV0eXBlKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvTWFrZWZpbGUgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvTWFrZWZpbGUKaW5kZXggOGJjZWE2NGQuLmQ1YTA5MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvTWFrZWZpbGUKQEAgLTUsNCArNSw0IEBACiAjIHJlbW92ZXMgYW55IG9sZCBkZXBlbmRlbmNpZXMuIERPTidUIHB1dCB5b3VyIG93biBkZXBlbmRlbmNpZXMgaGVyZQogIyB1bmxlc3MgaXQncyBzb21ldGhpbmcgc3BlY2lhbCAoaWUgbm90IGEgLmMgZmlsZSkuCiAjCi1vYmoteQkgKz0gaXJxLm8gcHJvbS5vIHJlc2V0Lm8gc2V0dXAubworb2JqLXkJICs9IGlycS5vIHBsYXRmb3JtLm8gcHJvbS5vIHJlc2V0Lm8gc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL29jZWxvdF8zX2ZwZ2EuaCBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9vY2Vsb3RfM19mcGdhLmgKaW5kZXggMjI3ZTQyOS4uNTcxMGE5MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL29jZWxvdF8zX2ZwZ2EuaAorKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvb2NlbG90XzNfZnBnYS5oCkBAIC01MSw3ICs1MSw5IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG9jZWxvdF9mcGdhX2Jhc2U7CiAKLSNkZWZpbmUgT0NFTE9UX0ZQR0FfV1JJVEUoeCwgeSkgd3JpdGViKHgsIG9jZWxvdF9mcGdhX2Jhc2UgKyBPQ0VMT1RfM19SRUdfIyN5KQotI2RlZmluZSBPQ0VMT1RfRlBHQV9SRUFEKHgpIHJlYWRiKG9jZWxvdF9mcGdhX2Jhc2UgKyBPQ0VMT1RfM19SRUdfIyN4KQorI2RlZmluZSBfX0ZQR0FfUkVHX1RPX0FERFIocmVnKQkJCQkJCVwKKwkoKHZvaWQgKikgb2NlbG90X2ZwZ2FfYmFzZSArIE9DRUxPVF8zX1JFR18jI3JlZykKKyNkZWZpbmUgT0NFTE9UX0ZQR0FfV1JJVEUoeCwgcmVnKSB3cml0ZWIoeCwgX19GUEdBX1JFR19UT19BRERSKHJlZykpCisjZGVmaW5lIE9DRUxPVF9GUEdBX1JFQUQocmVnKSByZWFkYihfX0ZQR0FfUkVHX1RPX0FERFIocmVnKSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmU1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcGxhdGZvcm0uYwpAQCAtMCwwICsxLDIzNSBAQAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlICJvY2Vsb3RfM19mcGdhLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSCkgfHwgZGVmaW5lZChDT05GSUdfTVY2NDNYWF9FVEhfTU9EVUxFKQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG12NjQzeHhfZXRoX3NoYXJlZF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lICAgPSAiZXRoZXJuZXQgc2hhcmVkIGJhc2UiLAorCQkuc3RhcnQgID0gMHhmMTAwMDAwMCArIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTLAorCQkuZW5kICAgID0gMHhmMTAwMDAwMCArIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTICsKKwkJICAgICAgICAgICAgICAgICAgICAgICBNVjY0M1hYX0VUSF9TSEFSRURfUkVHU19TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtdjY0M3h4X2V0aF9zaGFyZWRfZGV2aWNlID0geworCS5uYW1lCQk9IE1WNjQzWFhfRVRIX1NIQVJFRF9OQU1FLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdjY0M3h4X2V0aF9zaGFyZWRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBtdjY0M3h4X2V0aF9zaGFyZWRfcmVzb3VyY2VzLAorfTsKKworI2RlZmluZSBNVl9TUkFNX0JBU0UJCQkweGZlMDAwMDAwVUwKKyNkZWZpbmUgTVZfU1JBTV9TSVpFCQkJKDI1NiAqIDEwMjQpCisKKyNkZWZpbmUgTVZfU1JBTV9SWFJJTkdfU0laRQkJKE1WX1NSQU1fU0laRSAvIDQpCisjZGVmaW5lIE1WX1NSQU1fVFhSSU5HX1NJWkUJCShNVl9TUkFNX1NJWkUgLyA0KQorCisjZGVmaW5lIE1WX1NSQU1fQkFTRV9FVEgwCQlNVl9TUkFNX0JBU0UKKyNkZWZpbmUgTVZfU1JBTV9CQVNFX0VUSDEJCShNVl9TUkFNX0JBU0UgKyAoTVZfU1JBTV9TSVpFIC8gMikpCisKKyNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzAgNDgKKyNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzEgNDkKKyNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzIgNTAKKworI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8wCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXY2NHg2MF9ldGgwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiZXRoMCBpcnEiLAorCQkuc3RhcnQJPSBNVjY0eDYwX0lSUV9FVEhfMCwKKwkJLmVuZAk9IE1WNjR4NjBfSVJRX0VUSF8wLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIGNoYXIgZXRoMF9tYWNfYWRkcltFVEhfQUxFTl07CisKK3N0YXRpYyBzdHJ1Y3QgbXY2NDN4eF9ldGhfcGxhdGZvcm1fZGF0YSBldGgwX3BkID0geworCS5tYWNfYWRkcgk9IGV0aDBfbWFjX2FkZHIsCisKKwkudHhfc3JhbV9hZGRyCT0gTVZfU1JBTV9CQVNFX0VUSDAsCisJLnR4X3NyYW1fc2l6ZQk9IE1WX1NSQU1fVFhSSU5HX1NJWkUsCisJLnR4X3F1ZXVlX3NpemUJPSBNVl9TUkFNX1RYUklOR19TSVpFIC8gMTYsCisKKwkucnhfc3JhbV9hZGRyCT0gTVZfU1JBTV9CQVNFX0VUSDAgKyBNVl9TUkFNX1RYUklOR19TSVpFLAorCS5yeF9zcmFtX3NpemUJPSBNVl9TUkFNX1JYUklOR19TSVpFLAorCS5yeF9xdWV1ZV9zaXplCT0gTVZfU1JBTV9SWFJJTkdfU0laRSAvIDE2LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXRoMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gTVY2NDNYWF9FVEhfTkFNRSwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobXY2NHg2MF9ldGgwX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbXY2NHg2MF9ldGgwX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZldGgwX3BkLAorCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19NVjY0M1hYX0VUSF8wICovCisKKyNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEhfMQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG12NjR4NjBfZXRoMV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gImV0aDEgaXJxIiwKKwkJLnN0YXJ0CT0gTVY2NHg2MF9JUlFfRVRIXzEsCisJCS5lbmQJPSBNVjY0eDYwX0lSUV9FVEhfMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBjaGFyIGV0aDFfbWFjX2FkZHJbRVRIX0FMRU5dOworCitzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgZXRoMV9wZCA9IHsKKwkubWFjX2FkZHIJPSBldGgxX21hY19hZGRyLAorCisJLnR4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgxLAorCS50eF9zcmFtX3NpemUJPSBNVl9TUkFNX1RYUklOR19TSVpFLAorCS50eF9xdWV1ZV9zaXplCT0gTVZfU1JBTV9UWFJJTkdfU0laRSAvIDE2LAorCisJLnJ4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgxICsgTVZfU1JBTV9UWFJJTkdfU0laRSwKKwkucnhfc3JhbV9zaXplCT0gTVZfU1JBTV9SWFJJTkdfU0laRSwKKwkucnhfcXVldWVfc2l6ZQk9IE1WX1NSQU1fUlhSSU5HX1NJWkUgLyAxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aDFfZGV2aWNlID0geworCS5uYW1lCQk9IE1WNjQzWFhfRVRIX05BTUUsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG12NjR4NjBfZXRoMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG12NjR4NjBfZXRoMV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXRoMV9wZCwKKwl9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTVY2NDNYWF9FVEhfMSAqLworCisjaWZkZWYgQ09ORklHX01WNjQzWFhfRVRIXzIKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjY0eDYwX2V0aDJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJldGgyIGlycSIsCisJCS5zdGFydAk9IE1WNjR4NjBfSVJRX0VUSF8yLAorCQkuZW5kCT0gTVY2NHg2MF9JUlFfRVRIXzIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgY2hhciBldGgyX21hY19hZGRyW0VUSF9BTEVOXTsKKworc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGV0aDJfcGQgPSB7CisJLm1hY19hZGRyCT0gZXRoMl9tYWNfYWRkciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aDJfZGV2aWNlID0geworCS5uYW1lCQk9IE1WNjQzWFhfRVRIX05BTUUsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG12NjR4NjBfZXRoMl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG12NjR4NjBfZXRoMl9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXRoMl9wZCwKKwl9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTVY2NDNYWF9FVEhfMiAqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbXY2NDN4eF9ldGhfcGRfZGV2c1tdIF9faW5pdGRhdGEgPSB7CisJJm12NjQzeHhfZXRoX3NoYXJlZF9kZXZpY2UsCisjaWZkZWYgQ09ORklHX01WNjQzWFhfRVRIXzAKKwkmZXRoMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEhfMQorCSZldGgxX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8yCisJJmV0aDJfZGV2aWNlLAorI2VuZGlmCit9OworCitzdGF0aWMgdTggX19pbml0IGV4Y2hhbmdlX2JpdCh1OCB2YWwsIHU4IGNzKQoreworCS8qIHBsYWNlIHRoZSBkYXRhICovCisJT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzLCBFRVBST01fTU9ERSk7CisJdWRlbGF5KDEpOworCisJLyogdHVybiB0aGUgY2xvY2sgb24gKi8KKwlPQ0VMT1RfRlBHQV9XUklURSgodmFsIDw8IDIpIHwgY3MgfCAweDIsIEVFUFJPTV9NT0RFKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiB0dXJuIHRoZSBjbG9jayBvZmYgYW5kIHJlYWQtc3Ryb2JlICovCisJT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgxMCwgRUVQUk9NX01PREUpOworCisJLyogcmV0dXJuIHRoZSBkYXRhICovCisJcmV0dXJuIChPQ0VMT1RfRlBHQV9SRUFEKEVFUFJPTV9NT0RFKSA+PiAzKSAmIDB4MTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGdldF9tYWMoY2hhciBkZXN0WzZdKQoreworCXU4IHJlYWRfb3Bjb2RlWzEyXSA9IHsxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKwlpbnQgaSxqOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisJCWV4Y2hhbmdlX2JpdChyZWFkX29wY29kZVtpXSwgMSk7CisKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCWRlc3Rbal0gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlkZXN0W2pdIDw8PSAxOworCQkJZGVzdFtqXSB8PSBleGNoYW5nZV9iaXQoMCwgMSk7CisJCX0KKwl9CisKKwkvKiB0dXJuIG9mZiBDUyAqLworCWV4Y2hhbmdlX2JpdCgwLDApOworfQorCisvKgorICogQ29weSBhbmQgaW5jcmVtZW50IGV0aGVybmV0IE1BQyBhZGRyZXNzIGJ5IGEgc21hbGwgdmFsdWUuCisgKgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHN5c3RlbXMgd2hlcmUgdGhlIG9ubHkgb25lIE1BQyBhZGRyZXNzIGlzIHN0b3JlZCBpbgorICogbm9uLXZvbGF0aWxlIG1lbW9yeSBmb3IgbXVsdGlwbGUgcG9ydHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhfbWFjX2FkZCh1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywKKwl1bnNpZ25lZCBpbnQgYWRkKQoreworCWludCBpOworCisJQlVHX09OKGFkZCA+PSAyNTYpOworCisJZm9yIChpID0gRVRIX0FMRU47IGkgPj0gMDsgaS0tKSB7CisJCWRzdFtpXSA9IHNyY1tpXSArIGFkZDsKKwkJYWRkID0gZHN0W2ldIDwgc3JjW2ldOwkJLyogY29tcHV0ZSBjYXJyeSAqLworCX0KKworCVdBUk5fT04oYWRkKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbXY2NDN4eF9ldGhfYWRkX3Bkcyh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKKwlpbnQgcmV0OworCisJZ2V0X21hYyhtYWMpOworI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8wCisJZXRoX21hY19hZGQoZXRoMV9tYWNfYWRkciwgbWFjLCAwKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8xCisJZXRoX21hY19hZGQoZXRoMV9tYWNfYWRkciwgbWFjLCAxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8yCisJZXRoX21hY19hZGQoZXRoMl9tYWNfYWRkciwgbWFjLCAyKTsKKyNlbmRpZgorCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKG12NjQzeHhfZXRoX3BkX2RldnMsCisJCQlBUlJBWV9TSVpFKG12NjQzeHhfZXRoX3BkX2RldnMpKTsKKworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChtdjY0M3h4X2V0aF9hZGRfcGRzKTsKKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01WNjQzWFhfRVRIKSB8fCBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSF9NT0RVTEUpICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcHJvbS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3Byb20uYwppbmRleCAyOTZkOTQ1Li42Y2U5YjdmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90XzMvcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9wcm9tLmMKQEAgLTM0LDY0ICszNCwxMSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWFydmVsbF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3B1X2Nsb2NrOwogCi0jaWZkZWYgQ09ORklHX01WNjQzWFhfRVRICi1leHRlcm4gdW5zaWduZWQgY2hhciBwcm9tX21hY19hZGRyX2Jhc2VbNl07Ci0jZW5kaWYKLQogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCiB7CiAJcmV0dXJuICJNb21lbnR1bSBPY2Vsb3QtMyI7CiB9CiAKLSNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEgKLXZvaWQgYnVybl9jbG9ja3Modm9pZCkKLXsKLQlpbnQgaTsKLQotCS8qIHRoaXMgbG9vcCBzaG91bGQgYnVybiBhdCBsZWFzdCAxdXMgLS0gdGhpcyBzaG91bGQgYmUgcGxlbnR5ICovCi0JZm9yIChpID0gMDsgaSA8IDB4MTAwMDA7IGkrKykKLQkJOwotfQotCi11OCBleGNoYW5nZV9iaXQodTggdmFsLCB1OCBjcykKLXsKLQkvKiBwbGFjZSB0aGUgZGF0YSAqLwotCU9DRUxPVF9GUEdBX1dSSVRFKCh2YWwgPDwgMikgfCBjcywgRUVQUk9NX01PREUpOwotCWJ1cm5fY2xvY2tzKCk7Ci0KLQkvKiB0dXJuIHRoZSBjbG9jayBvbiAqLwotCU9DRUxPVF9GUEdBX1dSSVRFKCh2YWwgPDwgMikgfCBjcyB8IDB4MiwgRUVQUk9NX01PREUpOwotCWJ1cm5fY2xvY2tzKCk7Ci0KLQkvKiB0dXJuIHRoZSBjbG9jayBvZmYgYW5kIHJlYWQtc3Ryb2JlICovCi0JT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgxMCwgRUVQUk9NX01PREUpOwotCi0JLyogcmV0dXJuIHRoZSBkYXRhICovCi0JcmV0dXJuICgoT0NFTE9UX0ZQR0FfUkVBRChFRVBST01fTU9ERSkgPj4gMykgJiAweDEpOwotfQotCi12b2lkIGdldF9tYWMoY2hhciBkZXN0WzZdKQotewotCXU4IHJlYWRfb3Bjb2RlWzEyXSA9IHsxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQlpbnQgaSxqOwotCi0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0JCWV4Y2hhbmdlX2JpdChyZWFkX29wY29kZVtpXSwgMSk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7Ci0JCWRlc3Rbal0gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlkZXN0W2pdIDw8PSAxOwotCQkJZGVzdFtqXSB8PSBleGNoYW5nZV9iaXQoMCwgMSk7Ci0JCX0KLQl9Ci0KLQkvKiB0dXJuIG9mZiBDUyAqLwotCWV4Y2hhbmdlX2JpdCgwLDApOwotfQotI2VuZGlmCi0KLQogI2lmZGVmIENPTkZJR182NEJJVAogCiB1bnNpZ25lZCBsb25nIHNpZ25leHQodW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtMjI4LDExICsxNzUsNiBAQAogCW1pcHNfbWFjaGdyb3VwID0gTUFDSF9HUk9VUF9NT01FTkNPOwogCW1pcHNfbWFjaHR5cGUgPSBNQUNIX01PTUVOQ09fT0NFTE9UXzM7CiAKLSNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEgKLQkvKiBnZXQgdGhlIGJhc2UgTUFDIGFkZHJlc3MgZm9yIG9uLWJvYXJkIGV0aGVybmV0IHBvcnRzICovCi0JZ2V0X21hYyhwcm9tX21hY19hZGRyX2Jhc2UpOwotI2VuZGlmCi0KICNpZm5kZWYgQ09ORklHXzY0QklUCiAJZGVidWdfdmVjdG9ycy0+cHJpbnRmKCJCb290aW5nIExpbnV4IGtlcm5lbC4uLlxuIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfMy9zZXR1cC5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3NldHVwLmMKaW5kZXggN2Q3NGY4Yy4uZmYwODI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF8zL3NldHVwLmMKQEAgLTQsNyArNCw3IEBACiAgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KICAqIE1vbWVudHVtIENvbXB1dGVyIE9jZWxvdC0zIGJvYXJkIGRlcGVuZGVudCBib290IHJvdXRpbmVzCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAwMSwgMDUgIFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAwMSwgMDUgLSAwNiAgUmFsZiBCYWVjaGxlCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgUmlkZ2VSdW4sIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwMSBSZWQgSGF0LCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9tZW50dW0gQ29tcHV0ZXIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9NYWtlZmlsZQppbmRleCA5NDgwMmI0Li5kNjkxNjFhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgTW9tZW50dW0gQ29tcHV0ZXIncyBPY2Vsb3QtQyBhbmQgLUNTIGJvYXJkcy4KICMKIAotb2JqLXkJIAkJKz0gY3BjaS1pcnEubyBpcnEubyBwcm9tLm8gcmVzZXQubyBcCitvYmoteQkgCQkrPSBjcGNpLWlycS5vIGlycS5vIHBsYXRmb3JtLm8gcHJvbS5vIHJlc2V0Lm8gXAogCQkJICAgc2V0dXAubyB1YXJ0LWlycS5vCiAKIG9iai0kKENPTkZJR19LR0RCKQkrPSBkYmdfaW8ubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL2NwY2ktaXJxLmMgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvY3BjaS1pcnEuYwppbmRleCA0N2UzZmEzLi5iYjExZmVmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvY3BjaS1pcnEuYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvY3BjaS1pcnEuYwpAQCAtNjYsNDggKzY2LDYgQEAKIH0KIAogLyoKLSAqIEVuYWJsZXMgdGhlIElSUSBpbiB0aGUgRlBHQQotICovCi1zdGF0aWMgdm9pZCBlbmFibGVfY3BjaV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bm1hc2tfY3BjaV9pcnEoaXJxKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIElSUSBpbiB0aGUgRlBHQQotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfY3BjaV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bm1hc2tfY3BjaV9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERpc2FibGVzIHRoZSBJUlEgaW4gdGhlIEZQR0EKLSAqLwotc3RhdGljIHZvaWQgZGlzYWJsZV9jcGNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCW1hc2tfY3BjaV9pcnEoaXJxKTsKLX0KLQotLyoKLSAqIE1hc2tzIGFuZCBBQ0tzIGFuIElSUQotICovCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfY3BjaV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQltYXNrX2NwY2lfaXJxKGlycSk7Ci19Ci0KLS8qCi0gKiBFbmQgSVJRIHByb2Nlc3NpbmcKLSAqLwotc3RhdGljIHZvaWQgZW5kX2NwY2lfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCi0JCXVubWFza19jcGNpX2lycShpcnEpOwotfQotCi0vKgogICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIGludGVycnVwdHMgY29taW5nIGZyb20gdGhlIEZQR0EgY2hpcC4KICAqIEl0IGNvdWxkIGJlIGJ1aWx0IGluIGV0aGVybmV0IHBvcnRzIGV0Yy4uLgogICovCkBAIC0xMjUsMjcgKzgzLDE4IEBACiAJZG9fSVJRKGxzMWJpdDgoaXJxX3NyYykgKyBDUENJX0lSUV9CQVNFKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9jcGNpX2lycQlkaXNhYmxlX2NwY2lfaXJxCi0KIHN0cnVjdCBpcnFfY2hpcCBjcGNpX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJDUENJL0ZQR0EiLAotCS5zdGFydHVwID0gc3RhcnR1cF9jcGNpX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9jcGNpX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2NwY2lfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9jcGNpX2lycSwKLQkuYWNrID0gbWFza19hbmRfYWNrX2NwY2lfaXJxLAotCS5lbmQgPSBlbmRfY3BjaV9pcnEsCisJLmFjayA9IG1hc2tfY3BjaV9pcnEsCisJLm1hc2sgPSBtYXNrX2NwY2lfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfY3BjaV9pcnEsCisJLnVubWFzayA9IHVubWFza19jcGNpX2lycSwKIH07CiAKIHZvaWQgY3BjaV9pcnFfaW5pdCh2b2lkKQogewogCWludCBpOwogCi0JLyogUmVzZXQgaXJxIGhhbmRsZXJzIHBvaW50ZXJzIHRvIE5VTEwgKi8KLQlmb3IgKGkgPSBDUENJX0lSUV9CQVNFOyBpIDwgKENQQ0lfSVJRX0JBU0UgKyA4KTsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAyOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmNwY2lfaXJxX3R5cGU7Ci0JfQorCWZvciAoaSA9IENQQ0lfSVJRX0JBU0U7IGkgPCAoQ1BDSV9JUlFfQkFTRSArIDgpOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmY3BjaV9pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2Mvb2NlbG90X2NfZnBnYS5oIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL29jZWxvdF9jX2ZwZ2EuaAppbmRleCA3MjI4Y2QxLi5mMGY1NTgxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2Mvb2NlbG90X2NfZnBnYS5oCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9vY2Vsb3RfY19mcGdhLmgKQEAgLTUzLDcgKzUzLDkgQEAKICNkZWZpbmUgT0NFTE9UX0NfUkVHX0lOVFNFVAkJMHhlCiAjZGVmaW5lIE9DRUxPVF9DX1JFR19JTlRDTFIJCTB4ZgogCi0jZGVmaW5lIE9DRUxPVF9GUEdBX1dSSVRFKHgsIHkpIHdyaXRlYih4LCBPQ0VMT1RfQ19DUzBfQUREUiArIE9DRUxPVF9DX1JFR18jI3kpCi0jZGVmaW5lIE9DRUxPVF9GUEdBX1JFQUQoeCkgcmVhZGIoT0NFTE9UX0NfQ1MwX0FERFIgKyBPQ0VMT1RfQ19SRUdfIyN4KQorI2RlZmluZSBfX0ZQR0FfUkVHX1RPX0FERFIocmVnKQkJCQkJCVwKKwkoKHZvaWQgKikgT0NFTE9UX0NfQ1MwX0FERFIgKyBPQ0VMT1RfQ19SRUdfIyNyZWcpCisjZGVmaW5lIE9DRUxPVF9GUEdBX1dSSVRFKHgsIHJlZykgd3JpdGViKHgsIF9fRlBHQV9SRUdfVE9fQUREUihyZWcpKQorI2RlZmluZSBPQ0VMT1RfRlBHQV9SRUFEKHJlZykgcmVhZGIoX19GUEdBX1JFR19UT19BRERSKHJlZykpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQ5NWIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3BsYXRmb3JtLmMKQEAgLTAsMCArMSwyMDEgQEAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbXY2NDN4eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAib2NlbG90X2NfZnBnYS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfTVY2NDNYWF9FVEgpIHx8IGRlZmluZWQoQ09ORklHX01WNjQzWFhfRVRIX01PRFVMRSkKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjY0M3h4X2V0aF9zaGFyZWRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZSAgID0gImV0aGVybmV0IHNoYXJlZCBiYXNlIiwKKwkJLnN0YXJ0ICA9IDB4ZjEwMDAwMDAgKyBNVjY0M1hYX0VUSF9TSEFSRURfUkVHUywKKwkJLmVuZCAgICA9IDB4ZjEwMDAwMDAgKyBNVjY0M1hYX0VUSF9TSEFSRURfUkVHUyArCisJCSAgICAgICAgICAgICAgICAgICAgICAgTVY2NDNYWF9FVEhfU0hBUkVEX1JFR1NfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXY2NDN4eF9ldGhfc2hhcmVkX2RldmljZSA9IHsKKwkubmFtZQkJPSBNVjY0M1hYX0VUSF9TSEFSRURfTkFNRSwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobXY2NDN4eF9ldGhfc2hhcmVkX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gbXY2NDN4eF9ldGhfc2hhcmVkX3Jlc291cmNlcywKK307CisKKyNkZWZpbmUgTVZfU1JBTV9CQVNFCQkJMHhmZTAwMDAwMFVMCisjZGVmaW5lIE1WX1NSQU1fU0laRQkJCSgyNTYgKiAxMDI0KQorCisjZGVmaW5lIE1WX1NSQU1fUlhSSU5HX1NJWkUJCShNVl9TUkFNX1NJWkUgLyA0KQorI2RlZmluZSBNVl9TUkFNX1RYUklOR19TSVpFCQkoTVZfU1JBTV9TSVpFIC8gNCkKKworI2RlZmluZSBNVl9TUkFNX0JBU0VfRVRIMAkJTVZfU1JBTV9CQVNFCisjZGVmaW5lIE1WX1NSQU1fQkFTRV9FVEgxCQkoTVZfU1JBTV9CQVNFICsgKE1WX1NSQU1fU0laRSAvIDIpKQorCisjZGVmaW5lIE1WNjR4NjBfSVJRX0VUSF8wIDQ4CisjZGVmaW5lIE1WNjR4NjBfSVJRX0VUSF8xIDQ5CisKKyNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEhfMAorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG12NjR4NjBfZXRoMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gImV0aDAgaXJxIiwKKwkJLnN0YXJ0CT0gTVY2NHg2MF9JUlFfRVRIXzAsCisJCS5lbmQJPSBNVjY0eDYwX0lSUV9FVEhfMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBjaGFyIGV0aDBfbWFjX2FkZHJbRVRIX0FMRU5dOworCitzdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgZXRoMF9wZCA9IHsKKwkubWFjX2FkZHIJPSBldGgwX21hY19hZGRyLAorCisJLnR4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgwLAorCS50eF9zcmFtX3NpemUJPSBNVl9TUkFNX1RYUklOR19TSVpFLAorCS50eF9xdWV1ZV9zaXplCT0gTVZfU1JBTV9UWFJJTkdfU0laRSAvIDE2LAorCisJLnJ4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgwICsgTVZfU1JBTV9UWFJJTkdfU0laRSwKKwkucnhfc3JhbV9zaXplCT0gTVZfU1JBTV9SWFJJTkdfU0laRSwKKwkucnhfcXVldWVfc2l6ZQk9IE1WX1NSQU1fUlhSSU5HX1NJWkUgLyAxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aDBfZGV2aWNlID0geworCS5uYW1lCQk9IE1WNjQzWFhfRVRIX05BTUUsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG12NjR4NjBfZXRoMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG12NjR4NjBfZXRoMF9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXRoMF9wZCwKKwl9LAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTVY2NDNYWF9FVEhfMCAqLworCisjaWZkZWYgQ09ORklHX01WNjQzWFhfRVRIXzEKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjY0eDYwX2V0aDFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJldGgxIGlycSIsCisJCS5zdGFydAk9IE1WNjR4NjBfSVJRX0VUSF8xLAorCQkuZW5kCT0gTVY2NHg2MF9JUlFfRVRIXzEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgY2hhciBldGgxX21hY19hZGRyW0VUSF9BTEVOXTsKKworc3RhdGljIHN0cnVjdCBtdjY0M3h4X2V0aF9wbGF0Zm9ybV9kYXRhIGV0aDFfcGQgPSB7CisJLm1hY19hZGRyCT0gZXRoMV9tYWNfYWRkciwKKworCS50eF9zcmFtX2FkZHIJPSBNVl9TUkFNX0JBU0VfRVRIMSwKKwkudHhfc3JhbV9zaXplCT0gTVZfU1JBTV9UWFJJTkdfU0laRSwKKwkudHhfcXVldWVfc2l6ZQk9IE1WX1NSQU1fVFhSSU5HX1NJWkUgLyAxNiwKKworCS5yeF9zcmFtX2FkZHIJPSBNVl9TUkFNX0JBU0VfRVRIMSArIE1WX1NSQU1fVFhSSU5HX1NJWkUsCisJLnJ4X3NyYW1fc2l6ZQk9IE1WX1NSQU1fUlhSSU5HX1NJWkUsCisJLnJ4X3F1ZXVlX3NpemUJPSBNVl9TUkFNX1JYUklOR19TSVpFIC8gMTYsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldGgxX2RldmljZSA9IHsKKwkubmFtZQkJPSBNVjY0M1hYX0VUSF9OQU1FLAorCS5pZAkJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdjY0eDYwX2V0aDFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBtdjY0eDYwX2V0aDFfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmV0aDFfcGQsCisJfSwKK307CisjZW5kaWYgLyogQ09ORklHX01WNjQzWFhfRVRIXzEgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm12NjQzeHhfZXRoX3BkX2RldnNbXSBfX2luaXRkYXRhID0geworCSZtdjY0M3h4X2V0aF9zaGFyZWRfZGV2aWNlLAorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8wCisJJmV0aDBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01WNjQzWFhfRVRIXzEKKwkmZXRoMV9kZXZpY2UsCisjZW5kaWYKKwkvKiBUaGUgdGhpcmQgcG9ydCBpcyBub3Qgd2lyZWQgdXAgb24gdGhlIE9jZWxvdCBDICovCit9OworCitzdGF0aWMgdTggX19pbml0IGV4Y2hhbmdlX2JpdCh1OCB2YWwsIHU4IGNzKQoreworCS8qIHBsYWNlIHRoZSBkYXRhICovCisJT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzLCBFRVBST01fTU9ERSk7CisJdWRlbGF5KDEpOworCisJLyogdHVybiB0aGUgY2xvY2sgb24gKi8KKwlPQ0VMT1RfRlBHQV9XUklURSgodmFsIDw8IDIpIHwgY3MgfCAweDIsIEVFUFJPTV9NT0RFKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiB0dXJuIHRoZSBjbG9jayBvZmYgYW5kIHJlYWQtc3Ryb2JlICovCisJT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgxMCwgRUVQUk9NX01PREUpOworCisJLyogcmV0dXJuIHRoZSBkYXRhICovCisJcmV0dXJuIChPQ0VMT1RfRlBHQV9SRUFEKEVFUFJPTV9NT0RFKSA+PiAzKSAmIDB4MTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGdldF9tYWMoY2hhciBkZXN0WzZdKQoreworCXU4IHJlYWRfb3Bjb2RlWzEyXSA9IHsxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKwlpbnQgaSxqOworCisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisJCWV4Y2hhbmdlX2JpdChyZWFkX29wY29kZVtpXSwgMSk7CisKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCWRlc3Rbal0gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlkZXN0W2pdIDw8PSAxOworCQkJZGVzdFtqXSB8PSBleGNoYW5nZV9iaXQoMCwgMSk7CisJCX0KKwl9CisKKwkvKiB0dXJuIG9mZiBDUyAqLworCWV4Y2hhbmdlX2JpdCgwLDApOworfQorCisvKgorICogQ29weSBhbmQgaW5jcmVtZW50IGV0aGVybmV0IE1BQyBhZGRyZXNzIGJ5IGEgc21hbGwgdmFsdWUuCisgKgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHN5c3RlbXMgd2hlcmUgdGhlIG9ubHkgb25lIE1BQyBhZGRyZXNzIGlzIHN0b3JlZCBpbgorICogbm9uLXZvbGF0aWxlIG1lbW9yeSBmb3IgbXVsdGlwbGUgcG9ydHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhfbWFjX2FkZCh1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywKKwl1bnNpZ25lZCBpbnQgYWRkKQoreworCWludCBpOworCisJQlVHX09OKGFkZCA+PSAyNTYpOworCisJZm9yIChpID0gRVRIX0FMRU47IGkgPj0gMDsgaS0tKSB7CisJCWRzdFtpXSA9IHNyY1tpXSArIGFkZDsKKwkJYWRkID0gZHN0W2ldIDwgc3JjW2ldOwkJLyogY29tcHV0ZSBjYXJyeSAqLworCX0KKworCVdBUk5fT04oYWRkKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbXY2NDN4eF9ldGhfYWRkX3Bkcyh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKKwlpbnQgcmV0OworCisJZ2V0X21hYyhtYWMpOworI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8wCisJZXRoX21hY19hZGQoZXRoMV9tYWNfYWRkciwgbWFjLCAwKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSF8xCisJZXRoX21hY19hZGQoZXRoMV9tYWNfYWRkciwgbWFjLCAxKTsKKyNlbmRpZgorCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKG12NjQzeHhfZXRoX3BkX2RldnMsCisJCQlBUlJBWV9TSVpFKG12NjQzeHhfZXRoX3BkX2RldnMpKTsKKworCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChtdjY0M3h4X2V0aF9hZGRfcGRzKTsKKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01WNjQzWFhfRVRIKSB8fCBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSF9NT0RVTEUpICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcHJvbS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3Byb20uYwppbmRleCA0YzUwYTE0Li5kMGI3N2UxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy9wcm9tLmMKQEAgLTI5LDExICsyOSw3IEBACiBzdHJ1Y3QgY2FsbHZlY3RvcnMqIGRlYnVnX3ZlY3RvcnM7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1hcnZlbGxfYmFzZTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGNwdV9jbG9jazsKLQotI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSAotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcHJvbV9tYWNfYWRkcl9iYXNlWzZdOwotI2VuZGlmCitleHRlcm4gdW5zaWduZWQgaW50IGNwdV9jbG9jazsKIAogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCiB7CkBAIC00NCw1NSArNDAsNiBAQAogI2VuZGlmCiB9CiAKLSNpZmRlZiBDT05GSUdfTVY2NDNYWF9FVEgKLXN0YXRpYyB2b2lkIGJ1cm5fY2xvY2tzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQkvKiB0aGlzIGxvb3Agc2hvdWxkIGJ1cm4gYXQgbGVhc3QgMXVzIC0tIHRoaXMgc2hvdWxkIGJlIHBsZW50eSAqLwotCWZvciAoaSA9IDA7IGkgPCAweDEwMDAwOyBpKyspCi0JCTsKLX0KLQotc3RhdGljIHU4IGV4Y2hhbmdlX2JpdCh1OCB2YWwsIHU4IGNzKQotewotCS8qIHBsYWNlIHRoZSBkYXRhICovCi0JT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzLCBFRVBST01fTU9ERSk7Ci0JYnVybl9jbG9ja3MoKTsKLQotCS8qIHR1cm4gdGhlIGNsb2NrIG9uICovCi0JT0NFTE9UX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgyLCBFRVBST01fTU9ERSk7Ci0JYnVybl9jbG9ja3MoKTsKLQotCS8qIHR1cm4gdGhlIGNsb2NrIG9mZiBhbmQgcmVhZC1zdHJvYmUgKi8KLQlPQ0VMT1RfRlBHQV9XUklURSgodmFsIDw8IDIpIHwgY3MgfCAweDEwLCBFRVBST01fTU9ERSk7Ci0KLQkvKiByZXR1cm4gdGhlIGRhdGEgKi8KLQlyZXR1cm4gKChPQ0VMT1RfRlBHQV9SRUFEKEVFUFJPTV9NT0RFKSA+PiAzKSAmIDB4MSk7Ci19Ci0KLXZvaWQgZ2V0X21hYyhjaGFyIGRlc3RbNl0pCi17Ci0JdTggcmVhZF9vcGNvZGVbMTJdID0gezEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCWludCBpLGo7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKLQkJZXhjaGFuZ2VfYml0KHJlYWRfb3Bjb2RlW2ldLCAxKTsKLQotCWZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKLQkJZGVzdFtqXSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCWRlc3Rbal0gPDw9IDE7Ci0JCQlkZXN0W2pdIHw9IGV4Y2hhbmdlX2JpdCgwLCAxKTsKLQkJfQotCX0KLQotCS8qIHR1cm4gb2ZmIENTICovCi0JZXhjaGFuZ2VfYml0KDAsMCk7Ci19Ci0jZW5kaWYKLQotCiAjaWZkZWYgQ09ORklHXzY0QklUCiAKIHVuc2lnbmVkIGxvbmcgc2lnbmV4dCh1bnNpZ25lZCBsb25nIGFkZHIpCkBAIC0yMjYsMTEgKzE3Myw2IEBACiAJbWlwc19tYWNoZ3JvdXAgPSBNQUNIX0dST1VQX01PTUVOQ087CiAJbWlwc19tYWNodHlwZSA9IE1BQ0hfTU9NRU5DT19PQ0VMT1RfQzsKIAotI2lmZGVmIENPTkZJR19NVjY0M1hYX0VUSAotCS8qIGdldCB0aGUgYmFzZSBNQUMgYWRkcmVzcyBmb3Igb24tYm9hcmQgZXRoZXJuZXQgcG9ydHMgKi8KLQlnZXRfbWFjKHByb21fbWFjX2FkZHJfYmFzZSk7Ci0jZW5kaWYKLQogI2lmbmRlZiBDT05GSUdfNjRCSVQKIAlkZWJ1Z192ZWN0b3JzLT5wcmludGYoIkJvb3RpbmcgTGludXgga2VybmVsLi4uXG4iKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9jL3NldHVwLmMgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2Mvc2V0dXAuYwppbmRleCA5YzBjNDYyLi4wYjZiMjMzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2Mvc2V0dXAuYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2Mvc2V0dXAuYwpAQCAtNjksOCArNjksNyBAQAogI2luY2x1ZGUgIm9jZWxvdF9jX2ZwZ2EuaCIKIAogdW5zaWduZWQgbG9uZyBtYXJ2ZWxsX2Jhc2U7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBtdjY0MzQwX3NyYW1fYmFzZTsKLXVuc2lnbmVkIGxvbmcgY3B1X2Nsb2NrOwordW5zaWduZWQgaW50IGNwdV9jbG9jazsKIAogLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciByZWJvb3Rpbmcgb3IgaGFsdGluZyB0aGUgbWFjaGluZSovCiBleHRlcm4gdm9pZCBtb21lbmNvX29jZWxvdF9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpOwpAQCAtMTE5LDcgKzExOCw2IEBACiAJYWRkX3dpcmVkX2VudHJ5KEVOVFJZTE8oMHhmZTAwMDAwMCksIEVOVFJZTE8oMHhmZjAwMDAwMCksIDB4ZmZmZmZmZmZmZTAwMDAwMCwgUE1fMTZNKTsKIAogCW1hcnZlbGxfYmFzZSA9IDB4ZmZmZmZmZmZmNDAwMDAwMDsKLQltdjY0MzQwX3NyYW1fYmFzZSA9IDB4ZmZmZmZmZmZmZTAwMDAwMDsKICNlbHNlCiAJLyogbWFydmVsbCBhbmQgZXh0cmEgc3BhY2UgKi8KIAlhZGRfd2lyZWRfZW50cnkoRU5UUllMTygweGY0MDAwMDAwKSwgRU5UUllMTygweGY0MDEwMDAwKSwgMHhmNDAwMDAwMCwgUE1fNjRLKTsKQEAgLTEyOSw3ICsxMjcsNiBAQAogCWFkZF93aXJlZF9lbnRyeShFTlRSWUxPKDB4ZmUwMDAwMDApLCBFTlRSWUxPKDB4ZmYwMDAwMDApLCAweGZlMDAwMDAwLCBQTV8xNk0pOwogCiAJbWFydmVsbF9iYXNlID0gMHhmNDAwMDAwMDsKLQltdjY0MzQwX3NyYW1fYmFzZSA9IDB4ZmUwMDAwMDA7CiAjZW5kaWYKIH0KIApAQCAtMzQ2LDIyICszNDMsMjAgQEAKIAl9CiB9CiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0vKiBUaGlzIG5lZWRzIHRvIGJlIG9uZSBvZiB0aGUgZmlyc3QgaW5pdGNhbGxzLCBiZWNhdXNlIG5vIEkvTyBwb3J0IGFjY2VzcwotICAgY2FuIHdvcmsgYmVmb3JlIHRoaXMgKi8KKy8qCisgKiBUaGlzIG5lZWRzIHRvIGJlIG9uZSBvZiB0aGUgZmlyc3QgaW5pdGNhbGxzLCBiZWNhdXNlIG5vIEkvTyBwb3J0IGFjY2VzcworICogY2FuIHdvcmsgYmVmb3JlIHRoaXMKKyAqLwogc3RhdGljIGludCBpb19iYXNlX2lvcmVtYXAodm9pZCkKIHsKLQkvKiB3ZSdyZSBtYXBwaW5nIFBDSSBhY2Nlc3NlcyBmcm9tIDB4YzAwMDAwMDAgdG8gMHhmMDAwMDAwMCAqLwotCXZvaWQgKmlvX3JlbWFwX3JhbmdlID0gaW9yZW1hcCgweGMwMDAwMDAwLCAweDMwMDAwMDAwKTsKKwl2b2lkIF9faW9tZW0gKiBpb19yZW1hcF9yYW5nZSA9IGlvcmVtYXAoMHhjMDAwMDAwMFVMLCAweDEwMDAwKTsKIAotCWlmICghaW9fcmVtYXBfcmFuZ2UpIHsKKwlpZiAoIWlvX3JlbWFwX3JhbmdlKQogCQlwYW5pYygiQ291bGQgbm90IGlvcmVtYXAgSS9PIHBvcnQgcmFuZ2UiKTsKLQl9Ci0JcHJpbnRrKCJpb19yZW1hcF9yYW5nZSBzZXQgYXQgMHglMDh4XG4iLCAodWludDMyX3QpaW9fcmVtYXBfcmFuZ2UpOwotCXNldF9pb19wb3J0X2Jhc2UoaW9fcmVtYXBfcmFuZ2UgLSAweGMwMDAwMDAwKTsKKworCXNldF9pb19wb3J0X2Jhc2UoKHVuc2lnbmVkIGxvbmcpIGlvX3JlbWFwX3JhbmdlKTsKIAogCXJldHVybiAwOwogfQogCiBtb2R1bGVfaW5pdChpb19iYXNlX2lvcmVtYXApOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvdWFydC1pcnEuYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfYy91YXJ0LWlycS5jCmluZGV4IDUxMDI1N2QuLmE3YTgwYzBkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvdWFydC1pcnEuYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2MvdWFydC1pcnEuYwpAQCAtNjAsNDggKzYwLDYgQEAKIH0KIAogLyoKLSAqIEVuYWJsZXMgdGhlIElSUSBpbiB0aGUgRlBHQQotICovCi1zdGF0aWMgdm9pZCBlbmFibGVfdWFydF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bm1hc2tfdWFydF9pcnEoaXJxKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIElSUSBpbiB0aGUgRlBHQQotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfdWFydF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bm1hc2tfdWFydF9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERpc2FibGVzIHRoZSBJUlEgaW4gdGhlIEZQR0EKLSAqLwotc3RhdGljIHZvaWQgZGlzYWJsZV91YXJ0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCW1hc2tfdWFydF9pcnEoaXJxKTsKLX0KLQotLyoKLSAqIE1hc2tzIGFuZCBBQ0tzIGFuIElSUQotICovCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfdWFydF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQltYXNrX3VhcnRfaXJxKGlycSk7Ci19Ci0KLS8qCi0gKiBFbmQgSVJRIHByb2Nlc3NpbmcKLSAqLwotc3RhdGljIHZvaWQgZW5kX3VhcnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCi0JCXVubWFza191YXJ0X2lycShpcnEpOwotfQotCi0vKgogICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIGludGVycnVwdHMgY29taW5nIGZyb20gdGhlIEZQR0EgY2hpcC4KICAqLwogdm9pZCBsbF91YXJ0X2lycSh2b2lkKQpAQCAtMTE4LDI4ICs3NiwxNiBAQAogCWRvX0lSUShsczFiaXQ4KGlycV9zcmMpICsgNzQpOwogfQogCi0jZGVmaW5lIHNodXRkb3duX3VhcnRfaXJxCWRpc2FibGVfdWFydF9pcnEKLQogc3RydWN0IGlycV9jaGlwIHVhcnRfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gIlVBUlQvRlBHQSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX3VhcnRfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX3VhcnRfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfdWFydF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX3VhcnRfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfdWFydF9pcnEsCi0JLmVuZCA9IGVuZF91YXJ0X2lycSwKKwkuYWNrID0gbWFza191YXJ0X2lycSwKKwkubWFzayA9IG1hc2tfdWFydF9pcnEsCisJLm1hc2tfYWNrID0gbWFza191YXJ0X2lycSwKKwkudW5tYXNrID0gdW5tYXNrX3VhcnRfaXJxLAogfTsKIAogdm9pZCB1YXJ0X2lycV9pbml0KHZvaWQpCiB7Ci0JLyogUmVzZXQgaXJxIGhhbmRsZXJzIHBvaW50ZXJzIHRvIE5VTEwgKi8KLQlpcnFfZGVzY1s4MF0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCWlycV9kZXNjWzgwXS5hY3Rpb24gPSAwOwotCWlycV9kZXNjWzgwXS5kZXB0aCA9IDI7Ci0JaXJxX2Rlc2NbODBdLmNoaXAgPSAmdWFydF9pcnFfdHlwZTsKLQotCWlycV9kZXNjWzgxXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JaXJxX2Rlc2NbODFdLmFjdGlvbiA9IDA7Ci0JaXJxX2Rlc2NbODFdLmRlcHRoID0gMjsKLQlpcnFfZGVzY1s4MV0uY2hpcCA9ICZ1YXJ0X2lycV90eXBlOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcig4MCwgJnVhcnRfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcig4MSwgJnVhcnRfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2d0LWlycS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2d0LWlycS5jCmluZGV4IDdiNWNjNjYuLmU1NTc2YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9ndC1pcnEuYworKysgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvZ3QtaXJxLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqIGJlIGhhbmRsZWQgYW5kIGFjaydlZCBkaWZmZXJlbnRseSB0aGFuIG90aGVyIE1JUFMgaW50ZXJydXB0cy4KICAqLwogCi0jaWYgQ1VSUkVOVExZX1VOVVNFRAorI2lmIDAKIAogc3RydWN0IHRxX3N0cnVjdCBpcnFfaGFuZGxlcnNbTUFYX0NBVVNFX1JFR1NdW01BWF9DQVVTRV9SRUdfV0lEVEhdOwogdm9pZCBob29rX2lycV9oYW5kbGVyKGludCBpbnRfY2F1c2UsIGludCBiaXRfbnVtLCB2b2lkICppc3JfcHRyKTsKQEAgLTk1LDcgKzk1LDcgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJCQkJLyogIFVOVVNFRCAgKi8KKyNlbmRpZiAvKiAwICovCiAKIC8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgaW50ZXJydXB0cyBjb21pbmcgZnJvbSB0aGUgR2FsaWxlbyBjaGlwIHZpYSBQMF9JTlQjLgpAQCAtMTk2LDcgKzE5Niw3IEBACiAKIHZvaWQgZ3Q2NDI0MF9pcnFfaW5pdCh2b2lkKQogewotI2lmIENVUlJFTlRMWV9VTlVTRUQKKyNpZiAwCiAJaW50IGksIGo7CiAKIAkvKiBSZXNldCBpcnEgaGFuZGxlcnMgcG9pbnRlcnMgdG8gTlVMTCAqLwpAQCAtMjA4LDUgKzIwOCw1IEBACiAJCQlpcnFfaGFuZGxlcnNbaV1bal0uZGF0YSA9IE5VTEw7CiAJCX0KIAl9Ci0jZW5kaWYKKyNlbmRpZiAvKiAwICovCiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvb2NlbG90X3BsZC5oIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL29jZWxvdF9wbGQuaAppbmRleCBmY2I4Mjc1Li45NWUwNTM0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvb2NlbG90X3BsZC5oCisrKyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9vY2Vsb3RfcGxkLmgKQEAgLTIzLDggKzIzLDggQEAKICNkZWZpbmUgT0NFTE9UX1JFR19JTlRTRVQgKDEyKQogI2RlZmluZSBPQ0VMT1RfUkVHX0lOVENMUiAoMTMpCiAKLSNkZWZpbmUgT0NFTE9UX1BMRF9XUklURSh4LCB5KSB3cml0ZWIoeCwgT0NFTE9UX0NTMF9BRERSICsgT0NFTE9UX1JFR18jI3kpCi0jZGVmaW5lIE9DRUxPVF9QTERfUkVBRCh4KSByZWFkYihPQ0VMT1RfQ1MwX0FERFIgKyBPQ0VMT1RfUkVHXyMjeCkKLQorI2RlZmluZSBfX1BMRF9SRUdfVE9fQUREUihyZWcpICgodm9pZCAqKSBPQ0VMT1RfQ1MwX0FERFIgKyBPQ0VMT1RfUkVHXyMjcmVnKQorI2RlZmluZSBPQ0VMT1RfUExEX1dSSVRFKHgsIHJlZykgd3JpdGViKHgsIF9fUExEX1JFR19UT19BRERSKHJlZykpCisjZGVmaW5lIE9DRUxPVF9QTERfUkVBRChyZWcpIHJlYWRiKF9fUExEX1JFR19UT19BRERSKHJlZykpCiAKICNlbmRpZiAvKiBfX01PTUVOQ09fT0NFTE9UX1BMRF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9zZXR1cC5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL3NldHVwLmMKaW5kZXggNTZlYzQ3MC4uZDI4OGY3YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL3NldHVwLmMKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlIDxhc20vZ3Q2NDI0MC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vcGNpLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KQEAgLTE2MCw2ICsxNjEsMTAgQEAKIAlwcmludGsoIkRvbmVcbiIpOwogfQogCit2b2lkIF9faW5pdCBwbGF0X3RpbWVyX3NldHVwKHN0cnVjdCBpcnFhY3Rpb24gKmlycSkKK3sKK30KKwogdm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKIHsKIAl2b2lkICgqbDNmdW5jKSh1bnNpZ25lZCBsb25nKSA9ICh2b2lkICopIEtTRUcxQUREUihzZXR1cF9sM2NhY2hlKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCAwYTUwYWFkLi5iZjNiZTZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL01ha2VmaWxlCkBAIC0xMiw1ICsxMiw2IEBACiAKIG9wcm9maWxlLSQoQ09ORklHX0NQVV9NSVBTMzIpCQkrPSBvcF9tb2RlbF9taXBzeHgubwogb3Byb2ZpbGUtJChDT05GSUdfQ1BVX01JUFM2NCkJCSs9IG9wX21vZGVsX21pcHN4eC5vCitvcHJvZmlsZS0kKENPTkZJR19DUFVfUjEwMDAwKQkJKz0gb3BfbW9kZWxfbWlwc3h4Lm8KIG9wcm9maWxlLSQoQ09ORklHX0NQVV9TQjEpCQkrPSBvcF9tb2RlbF9taXBzeHgubwogb3Byb2ZpbGUtJChDT05GSUdfQ1BVX1JNOTAwMCkJCSs9IG9wX21vZGVsX3JtOTAwMC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggNjVlYjU1NC4uNGUwYTkwYjM5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL2NvbW1vbi5jCkBAIC04Myw2ICs4Myw5IEBACiAJY2FzZSBDUFVfNzRLOgogCWNhc2UgQ1BVX1NCMToKIAljYXNlIENQVV9TQjFBOgorCWNhc2UgQ1BVX1IxMDAwMDoKKwljYXNlIENQVV9SMTIwMDA6CisJY2FzZSBDUFVfUjE0MDAwOgogCQlsbW9kZWwgPSAmb3BfbW9kZWxfbWlwc3h4X29wczsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9pbXBsLmggYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfaW1wbC5oCmluZGV4IDM1NGU1NDQuLmZhNmI0YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9pbXBsLmgKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL29wX2ltcGwuaApAQCAtMTAsOCArMTAsNiBAQAogI2lmbmRlZiBPUF9JTVBMX0gKICNkZWZpbmUgT1BfSU1QTF9IIDEKIAotc3RydWN0IHB0X3JlZ3M7Ci0KIGV4dGVybiBpbnQgbnVsbF9wZXJmX2lycSh2b2lkKTsKIGV4dGVybiBpbnQgKCpwZXJmX2lycSkodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYyBiL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9taXBzeHguYwppbmRleCBkZDBhZWM5Li40NTVkNzZhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfbWlwc3h4LmMKKysrIGIvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX21pcHN4eC5jCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIE1fUEVSRkNUTF9TVVBFUlZJU09SCQkoMVVMICAgICAgPDwgIDIpCiAjZGVmaW5lIE1fUEVSRkNUTF9VU0VSCQkJKDFVTCAgICAgIDw8ICAzKQogI2RlZmluZSBNX1BFUkZDVExfSU5URVJSVVBUX0VOQUJMRQkoMVVMICAgICAgPDwgIDQpCi0jZGVmaW5lIE1fUEVSRkNUTF9FVkVOVChldmVudCkJCSgoZXZlbnQpICA8PCA1KQorI2RlZmluZSBNX1BFUkZDVExfRVZFTlQoZXZlbnQpCQkoKChldmVudCkgJiAweDNmKSAgPDwgNSkKICNkZWZpbmUgTV9QRVJGQ1RMX1ZQRUlEKHZwZSkJCSgodnBlKSAgICA8PCAxNikKICNkZWZpbmUgTV9QRVJGQ1RMX01UX0VOKGZpbHRlcikJCSgoZmlsdGVyKSA8PCAyMCkKICNkZWZpbmUgICAgTV9UQ19FTl9BTEwJCQlNX1BFUkZDVExfTVRfRU4oMCkKQEAgLTMxLDE2ICszMSwxOCBAQAogI2RlZmluZSBNX0NPVU5URVJfT1ZFUkZMT1cJCSgxVUwgICAgICA8PCAzMSkKIAogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNUAotI2RlZmluZSBXSEFUCShNX1RDX0VOX1ZQRSB8IE1fUEVSRkNUTF9WUEVJRChzbXBfcHJvY2Vzc29yX2lkKCkpKQorI2RlZmluZSBXSEFUCQkoTV9UQ19FTl9WUEUgfCBNX1BFUkZDVExfVlBFSUQoc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKyNkZWZpbmUgdnBlX2lkKCkJc21wX3Byb2Nlc3Nvcl9pZCgpCiAjZWxzZQotI2RlZmluZSBXSEFUCTAKKyNkZWZpbmUgV0hBVAkJMAorI2RlZmluZSB2cGVfaWQoKQlzbXBfcHJvY2Vzc29yX2lkKCkKICNlbmRpZgogCiAjZGVmaW5lIF9fZGVmaW5lX3BlcmZfYWNjZXNzb3JzKHIsIG4sIG5wKQkJCQlcCiAJCQkJCQkJCQlcCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByX2MwXyAjIyByICMjIG4odm9pZCkJCQlcCiB7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CQkJCVwKKwl1bnNpZ25lZCBpbnQgY3B1ID0gdnBlX2lkKCk7CQkJCQlcCiAJCQkJCQkJCQlcCiAJc3dpdGNoIChjcHUpIHsJCQkJCQkJXAogCWNhc2UgMDoJCQkJCQkJCVwKQEAgLTU1LDcgKzU3LDcgQEAKIAkJCQkJCQkJCVwKIHN0YXRpYyBpbmxpbmUgdm9pZCB3X2MwXyAjIyByICMjIG4odW5zaWduZWQgaW50IHZhbHVlKQkJCVwKIHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsJCQkJXAorCXVuc2lnbmVkIGludCBjcHUgPSB2cGVfaWQoKTsJCQkJCVwKIAkJCQkJCQkJCVwKIAlzd2l0Y2ggKGNwdSkgewkJCQkJCQlcCiAJY2FzZSAwOgkJCQkJCQkJXApAQCAtMjE2LDEzICsyMTgsMjMgQEAKIAogc3RhdGljIGlubGluZSBpbnQgbl9jb3VudGVycyh2b2lkKQogewotCWludCBjb3VudGVycyA9IF9fbl9jb3VudGVycygpOworCWludCBjb3VudGVyczsKIAotI2lmbmRlZiBDT05GSUdfU01QCi0JaWYgKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSA9PSBDUFVfMzRLKQotCQlyZXR1cm4gY291bnRlcnMgPj4gMTsKKwlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEuY3B1dHlwZSkgeworCWNhc2UgQ1BVX1IxMDAwMDoKKwkJY291bnRlcnMgPSAyOworCisJY2FzZSBDUFVfUjEyMDAwOgorCWNhc2UgQ1BVX1IxNDAwMDoKKwkJY291bnRlcnMgPSA0OworCisJZGVmYXVsdDoKKwkJY291bnRlcnMgPSBfX25fY291bnRlcnMoKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVAKKwljb3VudGVycyA+PiAxOwogI2VuZGlmCi0KIAlyZXR1cm4gY291bnRlcnM7CiB9CiAKQEAgLTI4Miw2ICsyOTQsMTggQEAKIAkJb3BfbW9kZWxfbWlwc3h4X29wcy5jcHVfdHlwZSA9ICJtaXBzLzVLIjsKIAkJYnJlYWs7CiAKKwljYXNlIENQVV9SMTAwMDA6CisJCWlmICgoY3VycmVudF9jcHVfZGF0YS5wcm9jZXNzb3JfaWQgJiAweGZmKSA9PSAweDIwKQorCQkJb3BfbW9kZWxfbWlwc3h4X29wcy5jcHVfdHlwZSA9ICJtaXBzL3IxMDAwMC12Mi54IjsKKwkJZWxzZQorCQkJb3BfbW9kZWxfbWlwc3h4X29wcy5jcHVfdHlwZSA9ICJtaXBzL3IxMDAwMCI7CisJCWJyZWFrOworCisJY2FzZSBDUFVfUjEyMDAwOgorCWNhc2UgQ1BVX1IxNDAwMDoKKwkJb3BfbW9kZWxfbWlwc3h4X29wcy5jcHVfdHlwZSA9ICJtaXBzL3IxMjAwMCI7CisJCWJyZWFrOworCiAJY2FzZSBDUFVfU0IxOgogCWNhc2UgQ1BVX1NCMUE6CiAJCW9wX21vZGVsX21pcHN4eF9vcHMuY3B1X3R5cGUgPSAibWlwcy9zYjEiOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX3JtOTAwMC5jIGIvYXJjaC9taXBzL29wcm9maWxlL29wX21vZGVsX3JtOTAwMC5jCmluZGV4IGI3MDYzZmUuLjdkYzliZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9vcHJvZmlsZS9vcF9tb2RlbF9ybTkwMDAuYworKysgYi9hcmNoL21pcHMvb3Byb2ZpbGUvb3BfbW9kZWxfcm05MDAwLmMKQEAgLTgwLDggKzgwLDcgQEAKIAl3cml0ZV9jMF9wZXJmY29udHJvbCgwKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHJtOTAwMF9wZXJmY291bnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkLAotCXN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IHJtOTAwMF9wZXJmY291bnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKQogewogCXVuc2lnbmVkIGludCBjb250cm9sID0gcmVhZF9jMF9wZXJmY29udHJvbCgpOwogCXVpbnQzMl90IGNvdW50ZXIxLCBjb3VudGVyMjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCmluZGV4IDNjZjBkZDQuLjgyYjIwYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQpAQCAtMjYsNyArMjYsNyBAQAogb2JqLSQoQ09ORklHX0xBU0FUKQkJKz0gcGNpLWxhc2F0Lm8KIG9iai0kKENPTkZJR19NSVBTX0FUTEFTKQkrPSBmaXh1cC1hdGxhcy5vCiBvYmotJChDT05GSUdfTUlQU19DT0JBTFQpCSs9IGZpeHVwLWNvYmFsdC5vCi1vYmotJChDT05GSUdfTUlQU19FVjY0MTIwKQkrPSBmaXh1cC1ldjY0MTIwLm8KK29iai0kKENPTkZJR19NSVBTX0VWNjQxMjApCSs9IHBjaS1ldjY0MTIwLm8KIG9iai0kKENPTkZJR19TT0NfQVUxNTAwKQkrPSBmaXh1cC1hdTEwMDAubyBvcHMtYXUxMDAwLm8KIG9iai0kKENPTkZJR19TT0NfQVUxNTUwKQkrPSBmaXh1cC1hdTEwMDAubyBvcHMtYXUxMDAwLm8KIG9iai0kKENPTkZJR19TT0NfUE5YODU1MCkJKz0gZml4dXAtcG54ODU1MC5vIG9wcy1wbng4NTUwLm8KQEAgLTQzLDcgKzQzLDcgQEAKIG9iai0kKENPTkZJR19TSUJZVEVfU0IxMjUwKQkrPSBmaXh1cC1zYjEyNTAubyBwY2ktc2IxMjUwLm8KIG9iai0kKENPTkZJR19TSUJZVEVfQkNNMTEyWCkJKz0gZml4dXAtc2IxMjUwLm8gcGNpLXNiMTI1MC5vCiBvYmotJChDT05GSUdfU0lCWVRFX0JDTTF4ODApCSs9IHBjaS1iY20xNDgwLm8gcGNpLWJjbTE0ODBodC5vCi1vYmotJChDT05GSUdfU05JX1JNMjAwX1BDSSkJKz0gZml4dXAtc25pLm8gb3BzLXNuaS5vCitvYmotJChDT05GSUdfU05JX1JNKQkJKz0gZml4dXAtc25pLm8gb3BzLXNuaS5vCiBvYmotJChDT05GSUdfVEFOQkFDX1RCMDIxOSkJKz0gZml4dXAtdGIwMjE5Lm8KIG9iai0kKENPTkZJR19UQU5CQUNfVEIwMjI2KQkrPSBmaXh1cC10YjAyMjYubwogb2JqLSQoQ09ORklHX1RBTkJBQ19UQjAyODcpCSs9IGZpeHVwLXRiMDI4Ny5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWNvYmFsdC5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1jb2JhbHQuYwppbmRleCA3NWEwMWU3Li43ZDVmNmJiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWNvYmFsdC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtY29iYWx0LmMKQEAgLTk0LDIyICs5NCwyMSBAQAogI2lmIDAKIAlpZiAoZ2FsaWxlb19pZCA+PSAweDEwKSB7CiAJCS8qIE5ldyBHYWxpbGVvLCBhc3N1bWVzIFBDSSBzdG9wIGxpbmUgdG8gVklBIGlzIGNvbm5lY3RlZC4gKi8KLQkJR0FMSUxFT19PVVRMKDB4NDAyMCwgR1RfUENJMF9UT1JfT0ZTKTsKKwkJR1RfV1JJVEUoR1RfUENJMF9UT1JfT0ZTLCAweDQwMjApOwogCX0gZWxzZSBpZiAoZ2FsaWxlb19pZCA9PSAweDEgfHwgZ2FsaWxlb19pZCA9PSAweDIpCiAjZW5kaWYKIAl7CiAJCXNpZ25lZCBpbnQgdGltZW87CiAJCS8qIFhYWCBXRSBNVVNUIERPIFRISVMgRUxTRSBHQUxJTEVPIExPQ0tTIFVQISAtRGF2ZU0gKi8KLQkJdGltZW8gPSBHQUxJTEVPX0lOTChHVF9QQ0kwX1RPUl9PRlMpOworCQl0aW1lbyA9IEdUX1JFQUQoR1RfUENJMF9UT1JfT0ZTKTsKIAkJLyogT2xkIEdhbGlsZW8sIGFzc3VtZXMgUENJIFNUT1AgbGluZSB0byBWSUEgaXMgZGlzY29ubmVjdGVkLiAqLwotCQlHQUxJTEVPX09VVEwoCisJCUdUX1dSSVRFKEdUX1BDSTBfVE9SX09GUywKIAkJCSgweGZmIDw8IDE2KSB8CQkvKiByZXRyeSBjb3VudCAqLwogCQkJKDB4ZmYgPDwgOCkgfAkJLyogdGltZW91dCAxICAgKi8KLQkJCTB4ZmYsCQkJLyogdGltZW91dCAwICAgKi8KLQkJCUdUX1BDSTBfVE9SX09GUyk7CisJCQkweGZmKTsJCQkvKiB0aW1lb3V0IDAgICAqLwogCiAJCS8qIGVuYWJsZSBQQ0kgcmV0cnkgZXhjZWVkZWQgaW50ZXJydXB0ICovCi0JCUdBTElMRU9fT1VUTChHQUxJTEVPX0lOVFJfUkVUUllfQ1RSIHwgR0FMSUxFT19JTkwoR1RfSU5UUk1BU0tfT0ZTKSwgR1RfSU5UUk1BU0tfT0ZTKTsKKwkJR1RfV1JJVEUoR1RfSU5UUk1BU0tfT0ZTLCBHVF9JTlRSX1JFVFJZQ1RSMF9NU0sgfCBHVF9SRUFEKEdUX0lOVFJNQVNLX09GUykpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1ldjY0MTIwLmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWV2NjQxMjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiYjkwZC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWV2NjQxMjAuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLWludCBwY2lfcmFuZ2VfY2sodW5zaWduZWQgY2hhciBidXMsIHVuc2lnbmVkIGNoYXIgZGV2KQotewotCWlmICgoKGJ1cyA9PSAwKSB8fCAoYnVzID09IDEpKSAmJiAoZGV2ID49IDYpICYmIChkZXYgPD0gOCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIC0xOwotfQotCi0vKgotICogQWZ0ZXIgZGV0ZWN0aW5nIGFsbCBhZ2VudHMgb3ZlciB0aGUgUENJICwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKLSAqIGluIG9yZGVyIHRvIGdpdmUgYW4gaW50ZXJydXB0IG51bWJlciBmb3IgZWFjaCBQQ0kgZGV2aWNlIHN0YXJ0aW5nCi0gKiBmcm9tIElSUSAyMC4gSXQgZG9lcyBhbHNvIGVuYWJsZXMgbWFzdGVyIGZvciBlYWNoIGRldmljZS4KLSAqLwotdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBpbnQgaXJxID0gMjA7Ci0Jc3RydWN0IHBjaV9idXMgKmN1cnJlbnRfYnVzID0gYnVzOwotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZGV2aWNlc19saW5rOwotCi0JbGlzdF9mb3JfZWFjaChkZXZpY2VzX2xpbmssICYoY3VycmVudF9idXMtPmRldmljZXMpKSB7Ci0JCWRldiA9IHBjaV9kZXZfYihkZXZpY2VzX2xpbmspOwotCQlpZiAoZGV2ICE9IE5VTEwpIHsKLQkJCWRldi0+aXJxID0gaXJxKys7Ci0KLQkJCS8qIEFzc2lnbiBhbiBpbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGUgZGV2aWNlICovCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGlycSk7Ci0JCQlwY2liaW9zX3NldF9tYXN0ZXIoZGV2KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtcG54ODU1MC5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1wbng4NTUwLmMKaW5kZXggNDI1NmIzYi4uNTA1NDZkYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9maXh1cC1wbng4NTUwLmMKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC1wbng4NTUwLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNkZWZpbmUJREJHKHguLi4pCiAjZW5kaWYKIAotZXh0ZXJuIGNoYXIgaXJxX3RhYl9qYnNbXVs1XTsKK2V4dGVybiBjaGFyIHBueDg1NTBfaXJxX3RhYltdWzVdOwogCiB2b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewpAQCAtNDcsNyArNDcsNyBAQAogCiBpbnQgX19pbml0IHBjaWJpb3NfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7Ci0JcmV0dXJuIGlycV90YWJfamJzW3Nsb3RdW3Bpbl07CisJcmV0dXJuIHBueDg1NTBfaXJxX3RhYltzbG90XVtwaW5dOwogfQogCiAvKiBEbyBwbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYXQgcGNpX2VuYWJsZV9kZXZpY2UoKSB0aW1lICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy1ndDY0MTExLmMgYi9hcmNoL21pcHMvcGNpL29wcy1ndDY0MTExLmMKaW5kZXggMTNkZTQ1OS4uZWNkMzk5MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtZ3Q2NDExMS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLWd0NjQxMTEuYwpAQCAtMzgsMTggKzM4LDE4IEBACiAJc3dpdGNoIChzaXplKSB7CiAJY2FzZSA0OgogCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgd2hlcmUpOwotCQkqdmFsID0gR0FMSUxFT19JTkwoR1RfUENJMF9DRkdEQVRBX09GUyk7CisJCSp2YWwgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogCiAJY2FzZSAyOgogCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgKHdoZXJlICYgfjB4MykpOwotCQkqdmFsID0gR0FMSUxFT19JTkwoR1RfUENJMF9DRkdEQVRBX09GUykKKwkJKnZhbCA9IEdUX1JFQUQoR1RfUENJMF9DRkdEQVRBX09GUykKIAkJICAgID4+ICgod2hlcmUgJiAzKSAqIDgpOwogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogCiAJY2FzZSAxOgogCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgKHdoZXJlICYgfjB4MykpOwotCQkqdmFsID0gR0FMSUxFT19JTkwoR1RfUENJMF9DRkdEQVRBX09GUykKKwkJKnZhbCA9IEdUX1JFQUQoR1RfUENJMF9DRkdEQVRBX09GUykKIAkJICAgID4+ICgod2hlcmUgJiAzKSAqIDgpOwogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogCX0KQEAgLTY4LDI1ICs2OCwyNSBAQAogCXN3aXRjaCAoc2l6ZSkgewogCWNhc2UgNDoKIAkJUENJX0NGR19TRVQoZGV2Zm4sIHdoZXJlKTsKLQkJR0FMSUxFT19PVVRMKHZhbCwgR1RfUENJMF9DRkdEQVRBX09GUyk7CisJCUdUX1dSSVRFKEdUX1BDSTBfQ0ZHREFUQV9PRlMsIHZhbCk7CiAKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIAogCWNhc2UgMjoKIAkJUENJX0NGR19TRVQoZGV2Zm4sICh3aGVyZSAmIH4weDMpKTsKLQkJdG1wID0gR0FMSUxFT19JTkwoR1RfUENJMF9DRkdEQVRBX09GUyk7CisJCXRtcCA9IEdUX1JFQUQoR1RfUENJMF9DRkdEQVRBX09GUyk7CiAJCXRtcCAmPSB+KDB4ZmZmZiA8PCAoKHdoZXJlICYgMHgzKSAqIDgpKTsKIAkJdG1wIHw9ICh2YWwgPDwgKCh3aGVyZSAmIDB4MykgKiA4KSk7Ci0JCUdBTElMRU9fT1VUTCh0bXAsIEdUX1BDSTBfQ0ZHREFUQV9PRlMpOworCQlHVF9XUklURShHVF9QQ0kwX0NGR0RBVEFfT0ZTLCB0bXApOwogCiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiAKIAljYXNlIDE6CiAJCVBDSV9DRkdfU0VUKGRldmZuLCAod2hlcmUgJiB+MHgzKSk7Ci0JCXRtcCA9IEdBTElMRU9fSU5MKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOworCQl0bXAgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwogCQl0bXAgJj0gfigweGZmIDw8ICgod2hlcmUgJiAweDMpICogOCkpOwogCQl0bXAgfD0gKHZhbCA8PCAoKHdoZXJlICYgMHgzKSAqIDgpKTsKLQkJR0FMSUxFT19PVVRMKHRtcCwgR1RfUENJMF9DRkdEQVRBX09GUyk7CisJCUdUX1dSSVRFKEdUX1BDSTBfQ0ZHREFUQV9PRlMsIHRtcCk7CiAKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1ldjY0MTIwLmMgYi9hcmNoL21pcHMvcGNpL3BjaS1ldjY0MTIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkODU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLWV2NjQxMjAuYwpAQCAtMCwwICsxLDIxIEBACisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpbnQgaXJxOworCisJaWYgKCFwaW4pCisJCXJldHVybiAwOworCisJaXJxID0gYWxsb2NhdGVfaXJxbm8oKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaXJxOworfQorCisvKiBEbyBwbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gYXQgcGNpX2VuYWJsZV9kZXZpY2UoKSB0aW1lICovCitpbnQgcGNpYmlvc19wbGF0X2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL2NvbW1vbi9pbnQuYyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvY29tbW9uL2ludC5jCmluZGV4IDcxMDYxMTYuLjJjMzZjMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvY29tbW9uL2ludC5jCisrKyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvY29tbW9uL2ludC5jCkBAIC0zOCw4ICszOCw2IEBACiAjaW5jbHVkZSA8aW50Lmg+CiAjaW5jbHVkZSA8dWFydC5oPgogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlycV9sb2NrKTsKLQogLyogZGVmYXVsdCBwcmlvIGZvciBpbnRlcnJ1cHRzICovCiAvKiBmaXJzdCBvbmUgaXMgYSBuby1ubyBzbyB0aGVyZWZvcmUgYWx3YXlzIHByaW8gMCAoZGlzYWJsZWQpICovCiBzdGF0aWMgY2hhciBnaWNfcHJpb1tQTlg4NTUwX0lOVF9HSUNfVE9USU5UXSA9IHsKQEAgLTE0OSwzOCArMTQ3LDYgQEAKIAl9CiB9CiAKLSNkZWZpbmUgcG54ODU1MF9kaXNhYmxlIHBueDg1NTBfYWNrCi1zdGF0aWMgdm9pZCBwbng4NTUwX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2xvY2ssIGZsYWdzKTsKLQltYXNrX2lycShpcnEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLSNkZWZpbmUgcG54ODU1MF9lbmFibGUgcG54ODU1MF91bm1hc2sKLXN0YXRpYyB2b2lkIHBueDg1NTBfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfbG9jaywgZmxhZ3MpOwotCXVubWFza19pcnEoaXJxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JcG54ODU1MF91bm1hc2soaXJxX25yKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2h1dGRvd25faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JcG54ODU1MF9hY2soaXJxX25yKTsKLQlyZXR1cm47Ci19Ci0KIGludCBwbng4NTUwX3NldF9naWNfcHJpb3JpdHkoaW50IGlycSwgaW50IHByaW9yaXR5KQogewogCWludCBnaWNfaXJxID0gaXJxLVBOWDg1NTBfSU5UX0dJQ19NSU47CkBAIC0xOTIsMjcgKzE1OCwxMiBAQAogCXJldHVybiBwcmV2X3ByaW9yaXR5OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFza19hbmRfYWNrX2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXBueDg1NTBfZGlzYWJsZShpcnEpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgZW5kX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKSB7Ci0JCXBueDg1NTBfZW5hYmxlKGlycSk7Ci0JfQotfQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGxldmVsX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9CSJQTlggTGV2ZWwgSVJRIiwKLQkuc3RhcnR1cCA9CXN0YXJ0dXBfaXJxLAotCS5zaHV0ZG93biA9CXNodXRkb3duX2lycSwKLQkuZW5hYmxlID0JcG54ODU1MF9lbmFibGUsCi0JLmRpc2FibGUgPQlwbng4NTUwX2Rpc2FibGUsCi0JLmFjayA9CQltYXNrX2FuZF9hY2tfbGV2ZWxfaXJxLAotCS5lbmQgPQkJZW5kX2lycSwKKwkuYWNrID0JCW1hc2tfaXJxLAorCS5tYXNrID0JCW1hc2tfaXJxLAorCS5tYXNrX2FjayA9CW1hc2tfaXJxLAorCS51bm1hc2sgPQl1bm1hc2tfaXJxLAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gZ2ljX2FjdGlvbiA9IHsKQEAgLTIzMyw4ICsxODQsOCBAQAogCWludCBjb25maWdQUjsKIAogCWZvciAoaSA9IDA7IGkgPCBQTlg4NTUwX0lOVF9DUDBfVE9USU5UOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZsZXZlbF9pcnFfdHlwZTsKLQkJcG54ODU1MF9hY2soaSk7CS8qIG1hc2sgdGhlIGlycSBqdXN0IGluIGNhc2UgICovCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmbGV2ZWxfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOworCQltYXNrX2lycShpKTsJLyogbWFzayB0aGUgaXJxIGp1c3QgaW4gY2FzZSAgKi8KIAl9CiAKIAkvKiBpbml0IG9mIEdJQy9JUEMgaW50ZXJydXB0cyAqLwpAQCAtMjcwLDcgKzIyMSw3IEBACiAJCS8qIG1hc2svcHJpb3JpdHkgaXMgc3RpbGwgMCBzbyB3ZSB3aWxsIG5vdCBnZXQgYW55CiAJCSAqIGludGVycnVwdHMgdW50aWwgaXQgaXMgdW5tYXNrZWQgKi8KIAotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmxldmVsX2lycV90eXBlOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmxldmVsX2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAl9CiAKIAkvKiBQcmlvcml0eSBsZXZlbCAwICovCkBAIC0yNzksMjAgKzIzMCwyMSBAQAogCS8qIFNldCBpbnQgdmVjdG9yIHRhYmxlIGFkZHJlc3MgKi8KIAlQTlg4NTUwX0dJQ19WRUNUT1JfMCA9IFBOWDg1NTBfR0lDX1ZFQ1RPUl8xID0gMDsKIAotCWlycV9kZXNjW01JUFNfQ1BVX0dJQ19JUlFdLmNoaXAgPSAmbGV2ZWxfaXJxX3R5cGU7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKE1JUFNfQ1BVX0dJQ19JUlEsICZsZXZlbF9pcnFfdHlwZSwKKwkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAJc2V0dXBfaXJxKE1JUFNfQ1BVX0dJQ19JUlEsICZnaWNfYWN0aW9uKTsKIAogCS8qIGluaXQgb2YgVGltZXIgaW50ZXJydXB0cyAqLwotCWZvciAoaSA9IFBOWDg1NTBfSU5UX1RJTUVSX01JTjsgaSA8PSBQTlg4NTUwX0lOVF9USU1FUl9NQVg7IGkrKykgewotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmxldmVsX2lycV90eXBlOwotCX0KKwlmb3IgKGkgPSBQTlg4NTUwX0lOVF9USU1FUl9NSU47IGkgPD0gUE5YODU1MF9JTlRfVElNRVJfTUFYOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmbGV2ZWxfaXJxX3R5cGUsIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJLyogU3RvcCBUaW1lciAxLTMgKi8KIAljb25maWdQUiA9IHJlYWRfYzBfY29uZmlnNygpOwogCWNvbmZpZ1BSIHw9IDB4MDAwMDAwMzg7CiAJd3JpdGVfYzBfY29uZmlnNyhjb25maWdQUik7CiAKLQlpcnFfZGVzY1tNSVBTX0NQVV9USU1FUl9JUlFdLmNoaXAgPSAmbGV2ZWxfaXJxX3R5cGU7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKE1JUFNfQ1BVX1RJTUVSX0lSUSwgJmxldmVsX2lycV90eXBlLAorCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAlzZXR1cF9pcnEoTUlQU19DUFVfVElNRVJfSVJRLCAmdGltZXJfYWN0aW9uKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9jb21tb24vcHJvbS5jIGIvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9jb21tb24vcHJvbS5jCmluZGV4IGY4OTUyYzEuLmViNmVjMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvY29tbW9uL3Byb20uYworKysgYi9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL2NvbW1vbi9wcm9tLmMKQEAgLTM1LDIzICszNSwxNSBAQAogCXJldHVybiAmKGFyY3NfY21kbGluZVswXSk7CiB9CiAKLXZvaWQgIHByb21faW5pdF9jbWRsaW5lKHZvaWQpCit2b2lkIF9faW5pdCBwcm9tX2luaXRfY21kbGluZSh2b2lkKQogewotCWNoYXIgKmNwOwotCWludCBhY3RyOworCWludCBpOwogCi0JYWN0ciA9IDE7IC8qIEFsd2F5cyBpZ25vcmUgYXJndlswXSAqLwotCi0JY3AgPSAmKGFyY3NfY21kbGluZVswXSk7Ci0Jd2hpbGUoYWN0ciA8IHByb21fYXJnYykgewotCSAgICAgICAgc3RyY3B5KGNwLCBwcm9tX2FyZ3ZbYWN0cl0pOwotCQljcCArPSBzdHJsZW4ocHJvbV9hcmd2W2FjdHJdKTsKLQkJKmNwKysgPSAnICc7Ci0JCWFjdHIrKzsKKwlhcmNzX2NtZGxpbmVbMF0gPSAnXDAnOworCWZvciAoaSA9IDA7IGkgPCBwcm9tX2FyZ2M7IGkrKykgeworCQlzdHJjYXQoYXJjc19jbWRsaW5lLCBwcm9tX2FyZ3ZbaV0pOworCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiICIpOwogCX0KLQlpZiAoY3AgIT0gJihhcmNzX2NtZGxpbmVbMF0pKSAvKiBnZXQgcmlkIG9mIHRyYWlsaW5nIHNwYWNlICovCi0JCS0tY3A7Ci0JKmNwID0gJ1wwJzsKIH0KIAogY2hhciAqcHJvbV9nZXRlbnYoY2hhciAqZW52bmFtZSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvY29tbW9uL3RpbWUuYyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvY29tbW9uL3RpbWUuYwppbmRleCAwYWY2NTViLi42NWM0NDBlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL2NvbW1vbi90aW1lLmMKKysrIGIvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9jb21tb24vdGltZS5jCkBAIC00MSw4ICs0MSw4IEBACiAgKiAxKSBib2FyZF90aW1lX2luaXQoKSAtCiAgKiAJYSkgKG9wdGlvbmFsKSBzZXQgdXAgUlRDIHJvdXRpbmVzLAogICogICAgICBiKSAob3B0aW9uYWwpIGNhbGlicmF0ZSBhbmQgc2V0IHRoZSBtaXBzX2hwdF9mcmVxdWVuY3kKLSAqCSAgICAob25seSBuZWVkZWQgaWYgeW91IGludGVuZGVkIHRvIHVzZSBmaXhlZF9yYXRlX2dldHRpbWVvZmZzZXQKLSAqCSAgICAgb3IgdXNlIGNwdSBjb3VudGVyIGFzIHRpbWVyIGludGVycnVwdCBzb3VyY2UpCisgKgkgICAgKG9ubHkgbmVlZGVkIGlmIHlvdSBpbnRlbmRlZCB0byB1c2UgY3B1IGNvdW50ZXIgYXMgdGltZXIgaW50ZXJydXB0CisgKgkgICAgIHNvdXJjZSkKICAqLwogCiB2b2lkIHBueDg1NTBfdGltZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL2picy9pcnFtYXAuYyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvamJzL2lycW1hcC5jCmluZGV4IGY3OGUwNDIuLjk4YzM0MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvamJzL2lycW1hcC5jCisrKyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvamJzL2lycW1hcC5jCkBAIC0yOCw5ICsyOCw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGludC5oPgogCi1jaGFyIGlycV90YWJfamJzW11bNV0gX19pbml0ZGF0YSA9IHsKLSBbOF0gPQl7IC0xLCBQTlg4NTUwX0lOVF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiwgMHhmZn0sCi0gWzldID0JeyAtMSwgUE5YODU1MF9JTlRfUENJX0lOVEEsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAotIFsxN10gPQl7IC0xLCBQTlg4NTUwX0lOVF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiwgMHhmZn0sCitjaGFyIHBueDg1NTBfaXJxX3RhYltdWzVdIF9faW5pdGRhdGEgPSB7CisJWzhdCT0geyAtMSwgUE5YODU1MF9JTlRfUENJX0lOVEEsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAorCVs5XQk9IHsgLTEsIFBOWDg1NTBfSU5UX1BDSV9JTlRBLCAweGZmLCAweGZmLCAweGZmfSwKKwlbMTddCT0geyAtMSwgUE5YODU1MF9JTlRfUENJX0lOVEEsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9zdGI4MTAvTWFrZWZpbGUgYi9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL3N0YjgxMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRiNTkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9zdGI4MTAvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisKKyMgTWFrZWZpbGUgZm9yIHRoZSBQaGlsaXBzIFNUQjgxMCBCb2FyZC4KKworbGliLXkgOj0gcHJvbV9pbml0Lm8gYm9hcmRfc2V0dXAubyBpcnFtYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9zdGI4MTAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvc3RiODEwL2JvYXJkX3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1ZDcxZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvc3RiODEwL2JvYXJkX3NldHVwLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBTVEI4MTAgc3BlY2lmaWMgYm9hcmQgc3RhcnR1cCByb3V0aW5lcy4KKyAqCisgKiAgQmFzZWQgb24gdGhlIGFyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvamJzL2JvYXJkX3NldHVwLmMKKyAqCisgKiAgQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqICBDb3B5cmlnaHQgMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2luY2x1ZGUgPGdsYi5oPgorCit2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY29uZmlnMCwgY29uZmlncHI7CisKKwljb25maWcwID0gcmVhZF9jMF9jb25maWcoKTsKKworCS8qIGNsZWFyIGFsbCB0aHJlZSBjYWNoZSBjb2hlcmVuY3kgZmllbGRzICovCisJY29uZmlnMCAmPSB+KDB4NyB8ICg3PDwyNSkgfCAoNzw8MjgpKTsKKwljb25maWcwIHw9IChDT05GX0NNX0RFRkFVTFQgfCAoQ09ORl9DTV9ERUZBVUxUPDwyNSkgfAorCQkJKENPTkZfQ01fREVGQVVMVDw8MjgpKTsKKwl3cml0ZV9jMF9jb25maWcoY29uZmlnMCk7CisKKwljb25maWdwciA9IHJlYWRfYzBfY29uZmlnNygpOworCWNvbmZpZ3ByIHw9ICgxPDwxOSk7IC8qIGVuYWJsZSB0bGIgKi8KKwl3cml0ZV9jMF9jb25maWc3KGNvbmZpZ3ByKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvc3RiODEwL2lycW1hcC5jIGIvYXJjaC9taXBzL3BoaWxpcHMvcG54ODU1MC9zdGI4MTAvaXJxbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlMTFlMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvc3RiODEwL2lycW1hcC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiAgUGhpbGlwcyBTVEI4MTAgYm9hcmQgaXJxbWFwLgorICoKKyAqICBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogIENvcHlyaWdodCAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8aW50Lmg+CisKK2NoYXIgcG54ODU1MF9pcnFfdGFiW11bNV0gX19pbml0ZGF0YSA9IHsKKwlbOF0JPSB7IC0xLCBQTlg4NTUwX0lOVF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiwgMHhmZn0sCisJWzldCT0geyAtMSwgUE5YODU1MF9JTlRfUENJX0lOVEEsIDB4ZmYsIDB4ZmYsIDB4ZmZ9LAorCVsxMF0JPSB7IC0xLCBQTlg4NTUwX0lOVF9QQ0lfSU5UQSwgMHhmZiwgMHhmZiwgMHhmZn0sCit9OworCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL3N0YjgxMC9wcm9tX2luaXQuYyBiL2FyY2gvbWlwcy9waGlsaXBzL3BueDg1NTAvc3RiODEwL3Byb21faW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWI0ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvcGhpbGlwcy9wbng4NTUwL3N0YjgxMC9wcm9tX2luaXQuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIFNUQjgxMCBzcGVjaWZpYyBwcm9tIHJvdXRpbmVzCisgKgorICogIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAgQ29weXJpZ2h0IDIwMDUgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworaW50IHByb21fYXJnYzsKK2NoYXIgKipwcm9tX2FyZ3YsICoqcHJvbV9lbnZwOworZXh0ZXJuIHZvaWQgIF9faW5pdCBwcm9tX2luaXRfY21kbGluZSh2b2lkKTsKK2V4dGVybiBjaGFyICpwcm9tX2dldGVudihjaGFyICplbnZuYW1lKTsKKworY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCit7CisJcmV0dXJuICJQaGlsaXBzIFBOWDg1NTAvU1RCODEwIjsKK30KKwordm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtZW1zaXplOworCisJcHJvbV9hcmdjID0gKGludCkgZndfYXJnMDsKKwlwcm9tX2FyZ3YgPSAoY2hhciAqKikgZndfYXJnMTsKKwlwcm9tX2VudnAgPSAoY2hhciAqKikgZndfYXJnMjsKKworCXByb21faW5pdF9jbWRsaW5lKCk7CisKKwltaXBzX21hY2hncm91cCA9IE1BQ0hfR1JPVVBfUEhJTElQUzsKKwltaXBzX21hY2h0eXBlID0gTUFDSF9QSElMSVBTX1NUQjgxMDsKKworCW1lbXNpemUgPSAweDA4MDAwMDAwOyAvKiBUcmltZWRpYSB1c2VzIG1lbW9yeSBhYm92ZSAqLworCWFkZF9tZW1vcnlfcmVnaW9uKDAsIG1lbXNpemUsIEJPT1RfTUVNX1JBTSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9pMmMteW9zZW1pdGUuYyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2kyYy15b3NlbWl0ZS5jCmluZGV4IDQxNmRhMjIuLjg1YjE0YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2kyYy15b3NlbWl0ZS5jCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2kyYy15b3NlbWl0ZS5jCkBAIC03NCw3ICs3NCw3IEBACiBpbnQgdGl0YW5faTJjX3hmZXIodW5zaWduZWQgaW50IHNsYXZlX2FkZHIsIHRpdGFuX2kyY19jb21tYW5kICogY21kLAogCQkgICBpbnQgc2l6ZSwgdW5zaWduZWQgaW50ICphZGRyKQogewotCWludCBsb29wID0gMCwgYnl0ZXMsIGk7CisJaW50IGxvb3AsIGJ5dGVzID0gMCwgaTsKIAl1bnNpZ25lZCBpbnQgKndyaXRlX2RhdGEsIGRhdGEsICpyZWFkX2RhdGE7CiAJdW5zaWduZWQgbG9uZyByZWdfdmFsLCB2YWw7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL3NtcC5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKaW5kZXggNjVmYTNhMi4uMzA1NDkxZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKKysrIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvc21wLmMKQEAgLTMsOSArMyw3IEBACiAKICNpbmNsdWRlIDxhc20vcG1vbi5oPgogI2luY2x1ZGUgPGFzbS90aXRhbl9kZXAuaD4KLQotZXh0ZXJuIHVuc2lnbmVkIGludCAoKm1pcHNfaHB0X3JlYWQpKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCptaXBzX2hwdF9pbml0KSh1bnNpZ25lZCBpbnQpOworI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKICNkZWZpbmUgTEFVTkNIU1RBQ0tfU0laRSAyNTYKIApAQCAtMTAxLDggKzk5LDYgQEAKICAqLwogdm9pZCBwcm9tX2luaXRfc2Vjb25kYXJ5KHZvaWQpCiB7Ci0JbWlwc19ocHRfaW5pdChtaXBzX2hwdF9yZWFkKCkpOwotCiAJc2V0X2MwX3N0YXR1cyhTVDBfQ08gfCBTVDBfSUUgfCBTVDBfSU0pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1laXNhLmMgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1laXNhLmMKaW5kZXggMGQxOGVkNC4uYTFhOWFmNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItZWlzYS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWVpc2EuYwpAQCAtOTUsMTYgKzk1LDExIEBACiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9laXNhMV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU4IG1hc2s7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KIAltYXNrID0gaW5iKEVJU0FfSU5UMV9NQVNLKTsKIAltYXNrICY9IH4oKHU4KSAoMSA8PCBpcnEpKTsKIAlvdXRiKG1hc2ssIEVJU0FfSU5UMV9NQVNLKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2Vpc2ExX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTMwLDggKzEyNSw2IEBACiAJb3V0YihtYXNrLCBFSVNBX0lOVDFfTUFTSyk7CiB9CiAKLSNkZWZpbmUgc2h1dGRvd25fZWlzYTFfaXJxCWRpc2FibGVfZWlzYTFfaXJxCi0KIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19laXNhMV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlkaXNhYmxlX2Vpc2ExX2lycShpcnEpOwpAQCAtMTQ4LDI1ICsxNDEsMjAgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXAyMl9laXNhMV9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUJPSAiSVAyMiBFSVNBIiwKIAkuc3RhcnR1cAk9IHN0YXJ0dXBfZWlzYTFfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX2Vpc2ExX2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9laXNhMV9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX2Vpc2ExX2lycSwKIAkuYWNrCQk9IG1hc2tfYW5kX2Fja19laXNhMV9pcnEsCisJLm1hc2sJCT0gZGlzYWJsZV9laXNhMV9pcnEsCisJLm1hc2tfYWNrCT0gbWFza19hbmRfYWNrX2Vpc2ExX2lycSwKKwkudW5tYXNrCQk9IGVuYWJsZV9laXNhMV9pcnEsCiAJLmVuZAkJPSBlbmRfZWlzYTFfaXJxLAogfTsKIAogc3RhdGljIHZvaWQgZW5hYmxlX2Vpc2EyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggbWFzazsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQogCW1hc2sgPSBpbmIoRUlTQV9JTlQyX01BU0spOwogCW1hc2sgJj0gfigodTgpICgxIDw8IChpcnEgLSA4KSkpOwogCW91dGIobWFzaywgRUlTQV9JTlQyX01BU0spOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfZWlzYTJfaXJxKHVuc2lnbmVkIGludCBpcnEpCkBAIC0xOTIsOCArMTgwLDYgQEAKIAlvdXRiKG1hc2ssIEVJU0FfSU5UMl9NQVNLKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9laXNhMl9pcnEJZGlzYWJsZV9laXNhMl9pcnEKLQogc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2Vpc2EyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWRpc2FibGVfZWlzYTJfaXJxKGlycSk7CkBAIC0yMTAsMTAgKzE5NiwxMCBAQAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcDIyX2Vpc2EyX2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJJUDIyIEVJU0EiLAogCS5zdGFydHVwCT0gc3RhcnR1cF9laXNhMl9pcnEsCi0JLnNodXRkb3duCT0gc2h1dGRvd25fZWlzYTJfaXJxLAotCS5lbmFibGUJCT0gZW5hYmxlX2Vpc2EyX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfZWlzYTJfaXJxLAogCS5hY2sJCT0gbWFza19hbmRfYWNrX2Vpc2EyX2lycSwKKwkubWFzawkJPSBkaXNhYmxlX2Vpc2EyX2lycSwKKwkubWFza19hY2sJPSBtYXNrX2FuZF9hY2tfZWlzYTJfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX2Vpc2EyX2lycSwKIAkuZW5kCQk9IGVuZF9laXNhMl9pcnEsCiB9OwogCkBAIC0yNzUsMTMgKzI2MSwxMCBAQAogCW91dGIoMCwgRUlTQV9ETUEyX1dSSVRFX1NJTkdMRSk7CiAKIAlmb3IgKGkgPSBTR0lOVF9FSVNBOyBpIDwgKFNHSU5UX0VJU0EgKyBFSVNBX01BWF9JUlEpOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7CiAJCWlmIChpIDwgKFNHSU5UX0VJU0EgKyA4KSkKLQkJCWlycV9kZXNjW2ldLmNoaXAgPSAmaXAyMl9laXNhMV9pcnFfdHlwZTsKKwkJCXNldF9pcnFfY2hpcChpLCAmaXAyMl9laXNhMV9pcnFfdHlwZSk7CiAJCWVsc2UKLQkJCWlycV9kZXNjW2ldLmNoaXAgPSAmaXAyMl9laXNhMl9pcnFfdHlwZTsKKwkJCXNldF9pcnFfY2hpcChpLCAmaXAyMl9laXNhMl9pcnFfdHlwZSk7CiAJfQogCiAJLyogQ2Fubm90IHVzZSByZXF1ZXN0X2lycSBiZWNhdXNlIG9mIGttYWxsb2Mgbm90IGJlaW5nIHJlYWR5IGF0IHN1Y2gKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLWludC5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKaW5kZXggYWY1MTg4OS4uYzQ0ZjhiZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItaW50LmMKQEAgLTQwLDE4NiArNDAsODYgQEAKIAogc3RhdGljIHZvaWQgZW5hYmxlX2xvY2FsMF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCS8qIGRvbid0IGFsbG93IG1hcHBhYmxlIGludGVycnVwdCB0byBiZSBlbmFibGVkIGZyb20gc2V0dXBfaXJxLAogCSAqIHdlIGhhdmUgb3VyIG93biB3YXkgdG8gZG8gc28gKi8KIAlpZiAoaXJxICE9IFNHSV9NQVBfMF9JUlEpCiAJCXNnaW50LT5pbWFzazAgfD0gKDEgPDwgKGlycSAtIFNHSU5UX0xPQ0FMMCkpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2xvY2FsMF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfbG9jYWwwX2lycShpcnEpOwotCXJldHVybiAwOwkJLyogTmV2ZXIgYW55dGhpbmcgcGVuZGluZyAgKi8KIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9sb2NhbDBfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzZ2ludC0+aW1hc2swICY9IH4oMSA8PCAoaXJxIC0gU0dJTlRfTE9DQUwwKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZGVmaW5lIHNodXRkb3duX2xvY2FsMF9pcnEJZGlzYWJsZV9sb2NhbDBfaXJxCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19sb2NhbDBfaXJxCWRpc2FibGVfbG9jYWwwX2lycQotCi1zdGF0aWMgdm9pZCBlbmRfbG9jYWwwX2lycSAodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLQkJZW5hYmxlX2xvY2FsMF9pcnEoaXJxKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcDIyX2xvY2FsMF9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUJPSAiSVAyMiBsb2NhbCAwIiwKLQkuc3RhcnR1cAk9IHN0YXJ0dXBfbG9jYWwwX2lycSwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9sb2NhbDBfaXJxLAotCS5lbmFibGUJCT0gZW5hYmxlX2xvY2FsMF9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX2xvY2FsMF9pcnEsCi0JLmFjawkJPSBtYXNrX2FuZF9hY2tfbG9jYWwwX2lycSwKLQkuZW5kCQk9IGVuZF9sb2NhbDBfaXJxLAorCS5hY2sJCT0gZGlzYWJsZV9sb2NhbDBfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfbG9jYWwwX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX2xvY2FsMF9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfbG9jYWwwX2lycSwKIH07CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9sb2NhbDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkvKiBkb24ndCBhbGxvdyBtYXBwYWJsZSBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZCBmcm9tIHNldHVwX2lycSwKIAkgKiB3ZSBoYXZlIG91ciBvd24gd2F5IHRvIGRvIHNvICovCiAJaWYgKGlycSAhPSBTR0lfTUFQXzFfSVJRKQogCQlzZ2ludC0+aW1hc2sxIHw9ICgxIDw8IChpcnEgLSBTR0lOVF9MT0NBTDEpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9sb2NhbDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2xvY2FsMV9pcnEoaXJxKTsKLQlyZXR1cm4gMDsJCS8qIE5ldmVyIGFueXRoaW5nIHBlbmRpbmcgICovCiB9CiAKIHZvaWQgZGlzYWJsZV9sb2NhbDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzZ2ludC0+aW1hc2sxICY9IH4oMSA8PCAoaXJxIC0gU0dJTlRfTE9DQUwxKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZGVmaW5lIHNodXRkb3duX2xvY2FsMV9pcnEJZGlzYWJsZV9sb2NhbDFfaXJxCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19sb2NhbDFfaXJxCWRpc2FibGVfbG9jYWwxX2lycQotCi1zdGF0aWMgdm9pZCBlbmRfbG9jYWwxX2lycSAodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLQkJZW5hYmxlX2xvY2FsMV9pcnEoaXJxKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcDIyX2xvY2FsMV9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUJPSAiSVAyMiBsb2NhbCAxIiwKLQkuc3RhcnR1cAk9IHN0YXJ0dXBfbG9jYWwxX2lycSwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9sb2NhbDFfaXJxLAotCS5lbmFibGUJCT0gZW5hYmxlX2xvY2FsMV9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX2xvY2FsMV9pcnEsCi0JLmFjawkJPSBtYXNrX2FuZF9hY2tfbG9jYWwxX2lycSwKLQkuZW5kCQk9IGVuZF9sb2NhbDFfaXJxLAorCS5hY2sJCT0gZGlzYWJsZV9sb2NhbDFfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfbG9jYWwxX2lycSwKKwkubWFza19hY2sJPSBkaXNhYmxlX2xvY2FsMV9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfbG9jYWwxX2lycSwKIH07CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9sb2NhbDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzZ2ludC0+aW1hc2swIHw9ICgxIDw8IChTR0lfTUFQXzBfSVJRIC0gU0dJTlRfTE9DQUwwKSk7CiAJc2dpbnQtPmNtZWltYXNrMCB8PSAoMSA8PCAoaXJxIC0gU0dJTlRfTE9DQUwyKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfbG9jYWwyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV9sb2NhbDJfaXJxKGlycSk7Ci0JcmV0dXJuIDA7CQkvKiBOZXZlciBhbnl0aGluZyBwZW5kaW5nICAqLwogfQogCiB2b2lkIGRpc2FibGVfbG9jYWwyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJc2dpbnQtPmNtZWltYXNrMCAmPSB+KDEgPDwgKGlycSAtIFNHSU5UX0xPQ0FMMikpOwogCWlmICghc2dpbnQtPmNtZWltYXNrMCkKIAkJc2dpbnQtPmltYXNrMCAmPSB+KDEgPDwgKFNHSV9NQVBfMF9JUlEgLSBTR0lOVF9MT0NBTDApKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNkZWZpbmUgc2h1dGRvd25fbG9jYWwyX2lycSBkaXNhYmxlX2xvY2FsMl9pcnEKLSNkZWZpbmUgbWFza19hbmRfYWNrX2xvY2FsMl9pcnEJZGlzYWJsZV9sb2NhbDJfaXJxCi0KLXN0YXRpYyB2b2lkIGVuZF9sb2NhbDJfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQotCQllbmFibGVfbG9jYWwyX2lycShpcnEpOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMjJfbG9jYWwyX2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJJUDIyIGxvY2FsIDIiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9sb2NhbDJfaXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX2xvY2FsMl9pcnEsCi0JLmVuYWJsZQkJPSBlbmFibGVfbG9jYWwyX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbG9jYWwyX2lycSwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19sb2NhbDJfaXJxLAotCS5lbmQJCT0gZW5kX2xvY2FsMl9pcnEsCisJLmFjawkJPSBkaXNhYmxlX2xvY2FsMl9pcnEsCisJLm1hc2sJCT0gZGlzYWJsZV9sb2NhbDJfaXJxLAorCS5tYXNrX2Fjawk9IGRpc2FibGVfbG9jYWwyX2lycSwKKwkudW5tYXNrCQk9IGVuYWJsZV9sb2NhbDJfaXJxLAogfTsKIAogc3RhdGljIHZvaWQgZW5hYmxlX2xvY2FsM19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXNnaW50LT5pbWFzazEgfD0gKDEgPDwgKFNHSV9NQVBfMV9JUlEgLSBTR0lOVF9MT0NBTDEpKTsKIAlzZ2ludC0+Y21laW1hc2sxIHw9ICgxIDw8IChpcnEgLSBTR0lOVF9MT0NBTDMpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9sb2NhbDNfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX2xvY2FsM19pcnEoaXJxKTsKLQlyZXR1cm4gMDsJCS8qIE5ldmVyIGFueXRoaW5nIHBlbmRpbmcgICovCiB9CiAKIHZvaWQgZGlzYWJsZV9sb2NhbDNfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzZ2ludC0+Y21laW1hc2sxICY9IH4oMSA8PCAoaXJxIC0gU0dJTlRfTE9DQUwzKSk7CiAJaWYgKCFzZ2ludC0+Y21laW1hc2sxKQogCQlzZ2ludC0+aW1hc2sxICY9IH4oMSA8PCAoU0dJX01BUF8xX0lSUSAtIFNHSU5UX0xPQ0FMMSkpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotI2RlZmluZSBzaHV0ZG93bl9sb2NhbDNfaXJxIGRpc2FibGVfbG9jYWwzX2lycQotI2RlZmluZSBtYXNrX2FuZF9hY2tfbG9jYWwzX2lycQlkaXNhYmxlX2xvY2FsM19pcnEKLQotc3RhdGljIHZvaWQgZW5kX2xvY2FsM19pcnEgKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9sb2NhbDNfaXJxKGlycSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXAyMl9sb2NhbDNfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gIklQMjIgbG9jYWwgMyIsCi0JLnN0YXJ0dXAJPSBzdGFydHVwX2xvY2FsM19pcnEsCi0JLnNodXRkb3duCT0gc2h1dGRvd25fbG9jYWwzX2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9sb2NhbDNfaXJxLAotCS5kaXNhYmxlCT0gZGlzYWJsZV9sb2NhbDNfaXJxLAotCS5hY2sJCT0gbWFza19hbmRfYWNrX2xvY2FsM19pcnEsCi0JLmVuZAkJPSBlbmRfbG9jYWwzX2lycSwKKwkuYWNrCQk9IGRpc2FibGVfbG9jYWwzX2lycSwKKwkubWFzawkJPSBkaXNhYmxlX2xvY2FsM19pcnEsCisJLm1hc2tfYWNrCT0gZGlzYWJsZV9sb2NhbDNfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX2xvY2FsM19pcnEsCiB9OwogCiBzdGF0aWMgdm9pZCBpbmR5X2xvY2FsMF9pcnFkaXNwYXRjaCh2b2lkKQpAQCAtNDMwLDEwICszMzAsNyBAQAogCQllbHNlCiAJCQloYW5kbGVyCQk9ICZpcDIyX2xvY2FsM19pcnFfdHlwZTsKIAotCQlpcnFfZGVzY1tpXS5zdGF0dXMJPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbgk9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoCT0gMTsKLQkJaXJxX2Rlc2NbaV0uY2hpcAk9IGhhbmRsZXI7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCBoYW5kbGVyLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAl9CiAKIAkvKiB2ZWN0b3IgaGFuZGxlci4gdGhpcyByZWdpc3RlciB0aGUgSVJRIGFzIG5vbi1zaGFyYWJsZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctaXJxLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEuYwppbmRleCBmMDFiYTFmLi4zMTlmODgwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEuYworKysgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1pcnEuYwpAQCAtMzMyLDU3ICszMzIsMTkgQEAKIAlpbnRyX2Rpc2Nvbm5lY3RfbGV2ZWwoY3B1LCBzd2xldmVsKTsKIH0KIAotc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2JyaWRnZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlX2JyaWRnZV9pcnEoaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZW5kX2JyaWRnZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSAmJgotCSAgICBpcnFfZGVzY1tpcnFdLmFjdGlvbikKLQkJZW5hYmxlX2JyaWRnZV9pcnEoaXJxKTsKLX0KLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBicmlkZ2VfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gImJyaWRnZSIsCiAJLnN0YXJ0dXAJPSBzdGFydHVwX2JyaWRnZV9pcnEsCiAJLnNodXRkb3duCT0gc2h1dGRvd25fYnJpZGdlX2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9icmlkZ2VfaXJxLAotCS5kaXNhYmxlCT0gZGlzYWJsZV9icmlkZ2VfaXJxLAotCS5hY2sJCT0gbWFza19hbmRfYWNrX2JyaWRnZV9pcnEsCi0JLmVuZAkJPSBlbmRfYnJpZGdlX2lycSwKKwkuYWNrCQk9IGRpc2FibGVfYnJpZGdlX2lycSwKKwkubWFzawkJPSBkaXNhYmxlX2JyaWRnZV9pcnEsCisJLm1hc2tfYWNrCT0gZGlzYWJsZV9icmlkZ2VfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX2JyaWRnZV9pcnEsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpcnFfbWFwW05SX0lSUVMgLyBCSVRTX1BFUl9MT05HXTsKLQotaW50IGFsbG9jYXRlX2lycW5vKHZvaWQpCi17Ci0JaW50IGlycTsKLQotYWdhaW46Ci0JaXJxID0gZmluZF9maXJzdF96ZXJvX2JpdChpcnFfbWFwLCBOUl9JUlFTKTsKLQotCWlmIChpcnEgPj0gTlJfSVJRUykKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlpZiAodGVzdF9hbmRfc2V0X2JpdChpcnEsIGlycV9tYXApKQotCQlnb3RvIGFnYWluOwotCi0JcmV0dXJuIGlycTsKLX0KLQotdm9pZCBmcmVlX2lycW5vKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JY2xlYXJfYml0KGlycSwgaXJxX21hcCk7Ci19Ci0KIHZvaWQgX19kZXZpbml0IHJlZ2lzdGVyX2JyaWRnZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpcnFfZGVzY1tpcnFdLnN0YXR1cwk9IElSUV9ESVNBQkxFRDsKLQlpcnFfZGVzY1tpcnFdLmFjdGlvbgk9IDA7Ci0JaXJxX2Rlc2NbaXJxXS5kZXB0aAk9IDE7Ci0JaXJxX2Rlc2NbaXJxXS5jaGlwCT0gJmJyaWRnZV9pcnFfdHlwZTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmYnJpZGdlX2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIH0KIAogaW50IF9fZGV2aW5pdCByZXF1ZXN0X2JyaWRnZV9pcnEoc3RydWN0IGJyaWRnZV9jb250cm9sbGVyICpiYykKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMgYi9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy10aW1lci5jCmluZGV4IDRlODcwZmMuLmMyMGU5ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LXRpbWVyLmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctdGltZXIuYwpAQCAtMTM0LDEzICsxMzQsNiBAQAogCWlycV9leGl0KCk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgaXAyN19kb19nZXR0aW1lb2Zmc2V0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBjdF9jdXIxOwotCWN0X2N1cjEgPSBSRU1PVEVfSFVCX0woY3B1dG9uYXNpZCgwKSwgUElfUlRfQ09VTlQpICsgQ1lDTEVTX1BFUl9KSUZGWTsKLQlyZXR1cm4gKGN0X2N1cjEgLSBjdF9jdXJbMF0pICogTlNFQ19QRVJfQ1lDTEUgLyAxMDAwOwotfQotCiAvKiBJbmNsdWRlcyBmb3IgaW9jM19pbml0KCkuICAqLwogI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9zbjAvYWRkcnMuaD4KQEAgLTE3OSwxNSArMTcyLDYgQEAKICAgICAgICAgcmV0dXJuIG1rdGltZSh5ZWFyLCBtb250aCwgZGF0ZSwgaG91ciwgbWluLCBzZWMpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfcnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX3J0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotfQotCiBzdGF0aWMgdm9pZCBlbmFibGVfcnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiB9CkBAIC0xOTYsMjIgKzE4MCwxMyBAQAogewogfQogCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfcnQodW5zaWduZWQgaW50IGlycSkKLXsKLX0KLQotc3RhdGljIHZvaWQgZW5kX3J0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotfQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHJ0X2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJTTiBIVUIgUlQgdGltZXIiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9ydF9pcnEsCi0JLnNodXRkb3duCT0gc2h1dGRvd25fcnRfaXJxLAotCS5lbmFibGUJCT0gZW5hYmxlX3J0X2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfcnRfaXJxLAotCS5hY2sJCT0gbWFza19hbmRfYWNrX3J0LAotCS5lbmQJCT0gZW5kX3J0X2lycSwKKwkuYWNrCQk9IGRpc2FibGVfcnRfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfcnRfaXJxLAorCS5tYXNrX2Fjawk9IGRpc2FibGVfcnRfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX3J0X2lycSwKKwkuZW9pCQk9IGVuYWJsZV9ydF9pcnEsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBydF9pcnFhY3Rpb24gPSB7CkBAIC0yMjEsOCArMTk2LDYgQEAKIAkubmFtZQkJPSAidGltZXIiCiB9OwogCi1leHRlcm4gaW50IGFsbG9jYXRlX2lycW5vKHZvaWQpOwotCiB2b2lkIF9faW5pdCBwbGF0X3RpbWVyX3NldHVwKHN0cnVjdCBpcnFhY3Rpb24gKmlycSkKIHsKIAlpbnQgaXJxbm8gID0gYWxsb2NhdGVfaXJxbm8oKTsKQEAgLTIzMCwxMCArMjAzLDcgQEAKIAlpZiAoaXJxbm8gPCAwKQogCQlwYW5pYygiQ2FuJ3QgYWxsb2NhdGUgaW50ZXJydXB0IG51bWJlciBmb3IgdGltZXIgaW50ZXJydXB0Iik7CiAKLQlpcnFfZGVzY1tpcnFub10uc3RhdHVzCT0gSVJRX0RJU0FCTEVEOwotCWlycV9kZXNjW2lycW5vXS5hY3Rpb24JPSBOVUxMOwotCWlycV9kZXNjW2lycW5vXS5kZXB0aAk9IDE7Ci0JaXJxX2Rlc2NbaXJxbm9dLmNoaXAJPSAmcnRfaXJxX3R5cGU7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycW5vLCAmcnRfaXJxX3R5cGUsIGhhbmRsZV9wZXJjcHVfaXJxKTsKIAogCS8qIG92ZXItd3JpdGUgdGhlIGhhbmRsZXIsIHdlIHVzZSBvdXIgb3duIHdheSAqLwogCWlycS0+aGFuZGxlciA9IG5vX2FjdGlvbjsKQEAgLTI0OCwxMiArMjE4LDE3IEBACiAJc2V0dXBfaXJxKGlycW5vLCAmcnRfaXJxYWN0aW9uKTsKIH0KIAorc3RhdGljIGN5Y2xlX3QgaXAyN19ocHRfcmVhZCh2b2lkKQoreworCXJldHVybiBSRU1PVEVfSFVCX0woY3B1dG9uYXNpZCgwKSwgUElfUlRfQ09VTlQpOworfQorCiB2b2lkIF9faW5pdCBpcDI3X3RpbWVfaW5pdCh2b2lkKQogeworCWNsb2Nrc291cmNlX21pcHMucmVhZCA9IGlwMjdfaHB0X3JlYWQ7CisJbWlwc19ocHRfZnJlcXVlbmN5ID0gQ1lDTEVTX1BFUl9TRUM7CiAJeHRpbWUudHZfc2VjID0gZ2V0X200OHQzNV90aW1lKCk7CiAJeHRpbWUudHZfbnNlYyA9IDA7Ci0KLQlkb19nZXR0aW1lb2Zmc2V0ID0gaXAyN19kb19nZXR0aW1lb2Zmc2V0OwogfQogCiB2b2lkIF9faW5pdCBjcHVfdGltZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1pcnEuYyBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLWlycS5jCmluZGV4IGM5YWNhZGQuLmFlMDYzODYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLWlycS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLWlycS5jCkBAIC0xMTMsMTIgKzExMyw2IEBACiAgKiBpcyBxdWl0ZSBkaWZmZXJlbnQgYW55d2F5LgogICovCiAKLS8qCi0gKiBJUlEgc3BpbmxvY2sgLSBSYWxmIHNheXMgbm90IHRvIGRpc2FibGUgQ1BVIGludGVycnVwdHMsCi0gKiBhbmQgSSB0aGluayBoZSBrbm93cyBiZXR0ZXIuCi0gKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXAzMl9pcnFfbG9jayk7Ci0KIC8qIFNvbWUgaW5pdGlhbCBpbnRlcnJ1cHRzIHRvIHNldCB1cCAqLwogZXh0ZXJuIGlycXJldHVybl90IGNyaW1lX21lbWVycl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBleHRlcm4gaXJxcmV0dXJuX3QgY3JpbWVfY3B1ZXJyX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKQEAgLTEzOCwxMiArMTMyLDYgQEAKIAlzZXRfYzBfc3RhdHVzKFNUQVRVU0ZfSVA3KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2NwdV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfY3B1X2lycShpcnEpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2NwdV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAljbGVhcl9jMF9zdGF0dXMoU1RBVFVTRl9JUDcpOwpAQCAtMTU1LDE2ICsxNDMsMTIgQEAKIAkJZW5hYmxlX2NwdV9pcnEgKGlycSk7CiB9CiAKLSNkZWZpbmUgc2h1dGRvd25fY3B1X2lycSBkaXNhYmxlX2NwdV9pcnEKLSNkZWZpbmUgbWFza19hbmRfYWNrX2NwdV9pcnEgZGlzYWJsZV9jcHVfaXJxCi0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXAzMl9jcHVfaW50ZXJydXB0ID0gewogCS50eXBlbmFtZSA9ICJJUDMyIENQVSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2NwdV9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fY3B1X2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2NwdV9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX2NwdV9pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19jcHVfaXJxLAorCS5hY2sgPSBkaXNhYmxlX2NwdV9pcnEsCisJLm1hc2sgPSBkaXNhYmxlX2NwdV9pcnEsCisJLm1hc2tfYWNrID0gZGlzYWJsZV9jcHVfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfY3B1X2lycSwKIAkuZW5kID0gZW5kX2NwdV9pcnEsCiB9OwogCkBAIC0xNzcsNDUgKzE2MSwyNyBAQAogCiBzdGF0aWMgdm9pZCBlbmFibGVfY3JpbWVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiAJY3JpbWVfbWFzayB8PSAxIDw8IChpcnEgLSAxKTsKIAljcmltZS0+aW1hc2sgPSBjcmltZV9tYXNrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2NyaW1lX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV9jcmltZV9pcnEoaXJxKTsKLQlyZXR1cm4gMDsgLyogVGhpcyBpcyBwcm9iYWJseSBub3QgcmlnaHQ7IHdlIGNvdWxkIGhhdmUgcGVuZGluZyBpcnFzICovCiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfY3JpbWVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiAJY3JpbWVfbWFzayAmPSB+KDEgPDwgKGlycSAtIDEpKTsKIAljcmltZS0+aW1hc2sgPSBjcmltZV9tYXNrOwogCWZsdXNoX2NyaW1lX2J1cygpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2NyaW1lX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAkvKiBFZGdlIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIG11c3QgYmUgY2xlYXJlZC4gKi8KIAlpZiAoKGlycSA+PSBDUklNRV9HQkUwX0lSUSAmJiBpcnEgPD0gQ1JJTUVfR0JFM19JUlEpCiAJICAgIHx8IChpcnEgPj0gQ1JJTUVfUkVfRU1QVFlfRV9JUlEgJiYgaXJxIDw9IENSSU1FX1JFX0lETEVfRV9JUlEpCiAJICAgIHx8IChpcnEgPj0gQ1JJTUVfU09GVDBfSVJRICYmIGlycSA8PSBDUklNRV9TT0ZUMl9JUlEpKSB7CiAJICAgICAgICB1aW50NjRfdCBjcmltZV9pbnQ7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiAJCWNyaW1lX2ludCA9IGNyaW1lLT5oYXJkX2ludDsKIAkJY3JpbWVfaW50ICY9IH4oMSA8PCAoaXJxIC0gMSkpOwogCQljcmltZS0+aGFyZF9pbnQgPSBjcmltZV9pbnQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKIAl9CiAJZGlzYWJsZV9jcmltZV9pcnEoaXJxKTsKIH0KQEAgLTIyNiwxNSArMTkyLDEyIEBACiAJCWVuYWJsZV9jcmltZV9pcnEoaXJxKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9jcmltZV9pcnEgZGlzYWJsZV9jcmltZV9pcnEKLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcDMyX2NyaW1lX2ludGVycnVwdCA9IHsKIAkudHlwZW5hbWUgPSAiSVAzMiBDUklNRSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2NyaW1lX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9jcmltZV9pcnEsCi0JLmVuYWJsZSA9IGVuYWJsZV9jcmltZV9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX2NyaW1lX2lycSwKIAkuYWNrID0gbWFza19hbmRfYWNrX2NyaW1lX2lycSwKKwkubWFzayA9IGRpc2FibGVfY3JpbWVfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfYW5kX2Fja19jcmltZV9pcnEsCisJLnVubWFzayA9IGVuYWJsZV9jcmltZV9pcnEsCiAJLmVuZCA9IGVuZF9jcmltZV9pcnEsCiB9OwogCkBAIC0yNDgsMzQgKzIxMSwyMCBAQAogCiBzdGF0aWMgdm9pZCBlbmFibGVfbWFjZXBjaV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKIAltYWNlcGNpX21hc2sgfD0gTUFDRVBDSV9DT05UUk9MX0lOVChpcnEgLSA5KTsKIAltYWNlLT5wY2kuY29udHJvbCA9IG1hY2VwY2lfbWFzazsKIAljcmltZV9tYXNrIHw9IDEgPDwgKGlycSAtIDEpOwogCWNyaW1lLT5pbWFzayA9IGNyaW1lX21hc2s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfbWFjZXBjaV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgCWVuYWJsZV9tYWNlcGNpX2lycSAoaXJxKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9tYWNlcGNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCWNyaW1lX21hc2sgJj0gfigxIDw8IChpcnEgLSAxKSk7CiAJY3JpbWUtPmltYXNrID0gY3JpbWVfbWFzazsKIAlmbHVzaF9jcmltZV9idXMoKTsKIAltYWNlcGNpX21hc2sgJj0gfk1BQ0VQQ0lfQ09OVFJPTF9JTlQoaXJxIC0gOSk7CiAJbWFjZS0+cGNpLmNvbnRyb2wgPSBtYWNlcGNpX21hc2s7CiAJZmx1c2hfbWFjZV9idXMoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuZF9tYWNlcGNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMjg0LDE2ICsyMzMsMTIgQEAKIAkJZW5hYmxlX21hY2VwY2lfaXJxKGlycSk7CiB9CiAKLSNkZWZpbmUgc2h1dGRvd25fbWFjZXBjaV9pcnEgZGlzYWJsZV9tYWNlcGNpX2lycQotI2RlZmluZSBtYXNrX2FuZF9hY2tfbWFjZXBjaV9pcnEgZGlzYWJsZV9tYWNlcGNpX2lycQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMzJfbWFjZXBjaV9pbnRlcnJ1cHQgPSB7CiAJLnR5cGVuYW1lID0gIklQMzIgTUFDRSBQQ0kiLAotCS5zdGFydHVwID0gc3RhcnR1cF9tYWNlcGNpX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9tYWNlcGNpX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX21hY2VwY2lfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9tYWNlcGNpX2lycSwKLQkuYWNrID0gbWFza19hbmRfYWNrX21hY2VwY2lfaXJxLAorCS5hY2sgPSBkaXNhYmxlX21hY2VwY2lfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9tYWNlcGNpX2lycSwKKwkubWFza19hY2sgPSBkaXNhYmxlX21hY2VwY2lfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfbWFjZXBjaV9pcnEsCiAJLmVuZCA9IGVuZF9tYWNlcGNpX2lycSwKIH07CiAKQEAgLTMzOSw3ICsyODQsNiBAQAogc3RhdGljIHZvaWQgZW5hYmxlX21hY2Vpc2FfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGludCBjcmltZV9pbnQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlEQkcgKCJtYWNlaXNhIGVuYWJsZTogJXVcbiIsIGlycSk7CiAKQEAgLTM1NSwyNiArMjk5LDE2IEBACiAJCWJyZWFrOwogCX0KIAlEQkcgKCJjcmltZV9pbnQgJTA4eCBlbmFibGVkXG4iLCBjcmltZV9pbnQpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiAJY3JpbWVfbWFzayB8PSBjcmltZV9pbnQ7CiAJY3JpbWUtPmltYXNrID0gY3JpbWVfbWFzazsKIAltYWNlaXNhX21hc2sgfD0gMSA8PCAoaXJxIC0gMzMpOwogCW1hY2UtPnBlcmlmLmN0cmwuaW1hc2sgPSBtYWNlaXNhX21hc2s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfbWFjZWlzYV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfbWFjZWlzYV9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9tYWNlaXNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGludCBjcmltZV9pbnQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCW1hY2Vpc2FfbWFzayAmPSB+KDEgPDwgKGlycSAtIDMzKSk7CiAgICAgICAgIGlmKCEobWFjZWlzYV9tYXNrICYgTUFDRUlTQV9BVURJT19JTlQpKQogCQljcmltZV9pbnQgfD0gTUFDRV9BVURJT19JTlQ7CkBAIC0zODcsMjMgKzMyMSwyMCBAQAogCWZsdXNoX2NyaW1lX2J1cygpOwogCW1hY2UtPnBlcmlmLmN0cmwuaW1hc2sgPSBtYWNlaXNhX21hc2s7CiAJZmx1c2hfbWFjZV9idXMoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19tYWNlaXNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgbWFjZV9pbnQsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWFjZV9pbnQ7CiAKIAlzd2l0Y2ggKGlycSkgewogCWNhc2UgTUFDRUlTQV9QQVJBTExFTF9JUlE6CiAJY2FzZSBNQUNFSVNBX1NFUklBTDFfVERNQVBSX0lSUToKIAljYXNlIE1BQ0VJU0FfU0VSSUFMMl9URE1BUFJfSVJROgogCQkvKiBlZGdlIHRyaWdnZXJlZCAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCQltYWNlX2ludCA9IG1hY2UtPnBlcmlmLmN0cmwuaXN0YXQ7CiAJCW1hY2VfaW50ICY9IH4oMSA8PCAoaXJxIC0gMzMpKTsKIAkJbWFjZS0+cGVyaWYuY3RybC5pc3RhdCA9IG1hY2VfaW50OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwogCX0KIAlkaXNhYmxlX21hY2Vpc2FfaXJxKGlycSk7CkBAIC00MTUsMTUgKzM0NiwxMiBAQAogCQllbmFibGVfbWFjZWlzYV9pcnEoaXJxKTsKIH0KIAotI2RlZmluZSBzaHV0ZG93bl9tYWNlaXNhX2lycSBkaXNhYmxlX21hY2Vpc2FfaXJxCi0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXAzMl9tYWNlaXNhX2ludGVycnVwdCA9IHsKIAkudHlwZW5hbWUgPSAiSVAzMiBNQUNFIElTQSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX21hY2Vpc2FfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX21hY2Vpc2FfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfbWFjZWlzYV9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX21hY2Vpc2FfaXJxLAogCS5hY2sgPSBtYXNrX2FuZF9hY2tfbWFjZWlzYV9pcnEsCisJLm1hc2sgPSBkaXNhYmxlX21hY2Vpc2FfaXJxLAorCS5tYXNrX2FjayA9IG1hc2tfYW5kX2Fja19tYWNlaXNhX2lycSwKKwkudW5tYXNrID0gZW5hYmxlX21hY2Vpc2FfaXJxLAogCS5lbmQgPSBlbmRfbWFjZWlzYV9pcnEsCiB9OwogCkBAIC00MzMsMjkgKzM2MSwxNSBAQAogCiBzdGF0aWMgdm9pZCBlbmFibGVfbWFjZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlwMzJfaXJxX2xvY2ssIGZsYWdzKTsKIAljcmltZV9tYXNrIHw9IDEgPDwgKGlycSAtIDEpOwogCWNyaW1lLT5pbWFzayA9IGNyaW1lX21hc2s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfbWFjZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfbWFjZV9pcnEoaXJxKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9tYWNlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXAzMl9pcnFfbG9jaywgZmxhZ3MpOwogCWNyaW1lX21hc2sgJj0gfigxIDw8IChpcnEgLSAxKSk7CiAJY3JpbWUtPmltYXNrID0gY3JpbWVfbWFzazsKIAlmbHVzaF9jcmltZV9idXMoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcDMyX2lycV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuZF9tYWNlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtNDY0LDE2ICszNzgsMTIgQEAKIAkJZW5hYmxlX21hY2VfaXJxKGlycSk7CiB9CiAKLSNkZWZpbmUgc2h1dGRvd25fbWFjZV9pcnEgZGlzYWJsZV9tYWNlX2lycQotI2RlZmluZSBtYXNrX2FuZF9hY2tfbWFjZV9pcnEgZGlzYWJsZV9tYWNlX2lycQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwMzJfbWFjZV9pbnRlcnJ1cHQgPSB7CiAJLnR5cGVuYW1lID0gIklQMzIgTUFDRSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX21hY2VfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX21hY2VfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfbWFjZV9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX21hY2VfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfbWFjZV9pcnEsCisJLmFjayA9IGRpc2FibGVfbWFjZV9pcnEsCisJLm1hc2sgPSBkaXNhYmxlX21hY2VfaXJxLAorCS5tYXNrX2FjayA9IGRpc2FibGVfbWFjZV9pcnEsCisJLnVubWFzayA9IGVuYWJsZV9tYWNlX2lycSwKIAkuZW5kID0gZW5kX21hY2VfaXJxLAogfTsKIApAQCAtNTg2LDEwICs0OTYsNyBAQAogCQllbHNlCiAJCQljb250cm9sbGVyID0gJmlwMzJfbWFjZWlzYV9pbnRlcnJ1cHQ7CiAKLQkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2lycV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaXJxXS5kZXB0aCA9IDA7Ci0JCWlycV9kZXNjW2lycV0uY2hpcCA9IGNvbnRyb2xsZXI7CisJCXNldF9pcnFfY2hpcChpcnEsIGNvbnRyb2xsZXIpOwogCX0KIAlzZXR1cF9pcnEoQ1JJTUVfTUVNRVJSX0lSUSwgJm1lbWVycl9pcnEpOwogCXNldHVwX2lycShDUklNRV9DUFVFUlJfSVJRLCAmY3B1ZXJyX2lycSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1yZXNldC5jIGIvYXJjaC9taXBzL3NnaS1pcDMyL2lwMzItcmVzZXQuYwppbmRleCBmZDA5MzJiLi5kYjgwODQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMzIvaXAzMi1yZXNldC5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAzMi9pcDMyLXJlc2V0LmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCWFkZF90aW1lcigmcG93ZXJfdGltZXIpOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgaXAzMl9ydGNfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgaXAzMl9ydGNfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJlZ19jOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKaW5kZXggOGIxZjQxNC4uMmU4ZjZiMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYwpAQCAtNDUsMTEgKzQ1LDkgQEAKICAqLwogCiAKLSNkZWZpbmUgc2h1dGRvd25fYmNtMTQ4MF9pcnEJZGlzYWJsZV9iY20xNDgwX2lycQogc3RhdGljIHZvaWQgZW5kX2JjbTE0ODBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgZW5hYmxlX2JjbTE0ODBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgZGlzYWJsZV9iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGFja19iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBiY20xNDgwX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzayk7CkBAIC04NSwxMSArODMsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiY20xNDgwX2lycV90eXBlID0gewogCS50eXBlbmFtZSA9ICJCQ00xNDgwLUlNUiIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2JjbTE0ODBfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2JjbTE0ODBfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfYmNtMTQ4MF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX2JjbTE0ODBfaXJxLAogCS5hY2sgPSBhY2tfYmNtMTQ4MF9pcnEsCisJLm1hc2sgPSBkaXNhYmxlX2JjbTE0ODBfaXJxLAorCS5tYXNrX2FjayA9IGFja19iY20xNDgwX2lycSwKKwkudW5tYXNrID0gZW5hYmxlX2JjbTE0ODBfaXJxLAogCS5lbmQgPSBlbmRfYmNtMTQ4MF9pcnEsCiAjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBiY20xNDgwX3NldF9hZmZpbml0eQpAQCAtMTg4LDE0ICsxODUsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWJjbTE0ODBfdW5tYXNrX2lycShiY20xNDgwX2lycV9vd25lcltpcnFdLCBpcnEpOwotCi0JcmV0dXJuIDA7CQkvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCi19Ci0KLQogc3RhdGljIHZvaWQgZGlzYWJsZV9iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWJjbTE0ODBfbWFza19pcnEoYmNtMTQ4MF9pcnFfb3duZXJbaXJxXSwgaXJxKTsKQEAgLTI3MCwxNiArMjU5LDkgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBOUl9JUlFTOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlmIChpIDwgQkNNMTQ4MF9OUl9JUlFTKSB7Ci0JCQlpcnFfZGVzY1tpXS5jaGlwID0gJmJjbTE0ODBfaXJxX3R5cGU7Ci0JCQliY20xNDgwX2lycV9vd25lcltpXSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpcnFfZGVzY1tpXS5jaGlwID0gJm5vX2lycV9jaGlwOwotCQl9CisJZm9yIChpID0gMDsgaSA8IEJDTTE0ODBfTlJfSVJRUzsgaSsrKSB7CisJCXNldF9pcnFfY2hpcChpLCAmYmNtMTQ4MF9pcnFfdHlwZSk7CisJCWJjbTE0ODBfaXJxX293bmVyW2ldID0gMDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC90aW1lLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvdGltZS5jCmluZGV4IGJmMTJhZjQuLjZmM2Y3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC90aW1lLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3RpbWUuYwpAQCAtNDcsNiArNDcsMTIgQEAKICNkZWZpbmUgSU1SX0lQM19WQUwJS19CQ00xNDgwX0lOVF9NQVBfSTEKICNkZWZpbmUgSU1SX0lQNF9WQUwJS19CQ00xNDgwX0lOVF9NQVBfSTIKIAorI2lmZGVmIENPTkZJR19TSU1VTEFUSU9OCisjZGVmaW5lIEJDTTE0ODBfSFBUX1ZBTFVFCTUwMDAwCisjZWxzZQorI2RlZmluZSBCQ00xNDgwX0hQVF9WQUxVRQkxMDAwMDAwCisjZW5kaWYKKwogZXh0ZXJuIGludCBiY20xNDgwX3N0ZWFsX2lycShpbnQgaXJxKTsKIAogdm9pZCBiY20xNDgwX3RpbWVfaW5pdCh2b2lkKQpAQCAtNTksMTEgKzY1LDYgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYgKCFjcHUpIHsKLQkJLyogVXNlIG91ciBvd24gZ2V0dGltZW9mZnNldCgpIHJvdXRpbmUgKi8KLQkJZG9fZ2V0dGltZW9mZnNldCA9IGJjbTE0ODBfZ2V0dGltZW9mZnNldDsKLQl9Ci0KIAliY20xNDgwX21hc2tfaXJxKGNwdSwgaXJxKTsKIAogCS8qIE1hcCB0aGUgdGltZXIgaW50ZXJydXB0IHRvIGlwWzRdIG9mIHRoaXMgY3B1ICovCkBAIC03NCwxMSArNzUsNyBAQAogCS8qIERpc2FibGUgdGhlIHRpbWVyIGFuZCBzZXQgdXAgdGhlIGNvdW50ICovCiAJX19yYXdfd3JpdGVxKDAsIElPQUREUihBX1NDRF9USU1FUl9SRUdJU1RFUihjcHUsIFJfU0NEX1RJTUVSX0NGRykpKTsKIAlfX3Jhd193cml0ZXEoCi0jaWZuZGVmIENPTkZJR19TSU1VTEFUSU9OCi0JCTEwMDAwMDAvSFoKLSNlbHNlCi0JCTUwMDAwL0haCi0jZW5kaWYKKwkJQkNNMTQ4MF9IUFRfVkFMVUUvSFoKIAkJLCBJT0FERFIoQV9TQ0RfVElNRVJfUkVHSVNURVIoY3B1LCBSX1NDRF9USU1FUl9JTklUKSkpOwogCiAJLyogU2V0IHRoZSB0aW1lciBydW5uaW5nICovCkBAIC05Nyw4ICs5NCw2IEBACiAJICovCiB9CiAKLSNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MC5oPgotCiB2b2lkIGJjbTE0ODBfdGltZXJfaW50ZXJydXB0KHZvaWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKQEAgLTEyMiwxNiArMTE3LDE2IEBACiAJfQogfQogCi0vKgotICogV2UgdXNlIG91ciBvd24gZG9fZ2V0dGltZW9mZnNldCgpIGluc3RlYWQgb2YgdGhlIGdlbmVyaWMgb25lLAotICogYmVjYXVzZSB0aGUgZ2VuZXJpYyBvbmUgZG9lcyBub3Qgd29yayBmb3IgU01QIGNhc2UuCi0gKiBJbiBhZGRpdGlvbiwgc2luY2Ugd2UgdXNlIGdlbmVyYWwgdGltZXIgMCBmb3Igc3lzdGVtIHRpbWUsCi0gKiB3ZSBjYW4gZ2V0IGFjY3VyYXRlIGludHJhLWppZmZ5IG9mZnNldCB3aXRob3V0IGNhbGlicmF0aW9uLgotICovCi11bnNpZ25lZCBsb25nIGJjbTE0ODBfZ2V0dGltZW9mZnNldCh2b2lkKQorc3RhdGljIGN5Y2xlX3QgYmNtMTQ4MF9ocHRfcmVhZCh2b2lkKQogeworCS8qIFdlIGFzc3VtZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB4dGltZV9sb2NrIGhlbGQuICovCiAJdW5zaWduZWQgbG9uZyBjb3VudCA9CiAJCV9fcmF3X3JlYWRxKElPQUREUihBX1NDRF9USU1FUl9SRUdJU1RFUigwLCBSX1NDRF9USU1FUl9DTlQpKSk7CisJcmV0dXJuIChqaWZmaWVzICsgMSkgKiAoQkNNMTQ4MF9IUFRfVkFMVUUgLyBIWikgLSBjb3VudDsKK30KIAotCXJldHVybiAxMDAwMDAwL0haIC0gY291bnQ7Cit2b2lkIF9faW5pdCBiY20xNDgwX2hwdF9zZXR1cCh2b2lkKQoreworCWNsb2Nrc291cmNlX21pcHMucmVhZCA9IGJjbTE0ODBfaHB0X3JlYWQ7CisJbWlwc19ocHRfZnJlcXVlbmN5ID0gQkNNMTQ4MF9IUFRfVkFMVUU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9iY20xMjUwX3RicHJvZi5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvYmNtMTI1MF90YnByb2YuYwppbmRleCA5OTJlMGQ4Li5kMWE5MDZlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9iY20xMjUwX3RicHJvZi5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2JjbTEyNTBfdGJwcm9mLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlzYnAudGJfYXJtZWQgPSAxOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2Jwcm9mX3RiX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBzYnByb2ZfdGJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJaW50IGk7CiAJREJHKHByaW50ayhERVZOQU1FICI6IHRiX2ludHJcbiIpKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHNicHJvZl9wY19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2Jwcm9mX3BjX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXByaW50ayhERVZOQU1FICI6IHVuZXhwZWN0ZWQgcGNfaW50ciIpOwogCXJldHVybiBJUlFfTk9ORTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2J1c193YXRjaGVyLmMgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9idXNfd2F0Y2hlci5jCmluZGV4IGJiOTA2NDkuLjQ1Mjc0YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2J1c193YXRjaGVyLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvYnVzX3dhdGNoZXIuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAgKiBub3RlczogcG9zc2libGUgcmUtZW50cnkgZHVlIHRvIG11bHRpcGxlIHNvdXJjZXMKICAqICAgICAgICBzaG91bGQgY2hlY2svaW5kaWNhdGUgc2F0dXJhdGlvbgogICovCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2lieXRlX2J3X2ludChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaWJ5dGVfYndfaW50KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGJ3X3N0YXRzX3N0cnVjdCAqc3RhdHMgPSBkYXRhOwogCXVuc2lnbmVkIGxvbmcgY250cjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKaW5kZXggZDVkMjY3Ny4uODJjZTc1MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKQEAgLTQ0LDExICs0NCw5IEBACiAgKi8KIAogCi0jZGVmaW5lIHNodXRkb3duX3NiMTI1MF9pcnEJZGlzYWJsZV9zYjEyNTBfaXJxCiBzdGF0aWMgdm9pZCBlbmRfc2IxMjUwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGVuYWJsZV9zYjEyNTBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgZGlzYWJsZV9zYjEyNTBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3NiMTI1MF9pcnEodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCBhY2tfc2IxMjUwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBzYjEyNTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKTsKQEAgLTcwLDExICs2OCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNiMTI1MF9pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiU0IxMjUwLUlNUiIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX3NiMTI1MF9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fc2IxMjUwX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX3NiMTI1MF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX3NiMTI1MF9pcnEsCiAJLmFjayA9IGFja19zYjEyNTBfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9zYjEyNTBfaXJxLAorCS5tYXNrX2FjayA9IGFja19zYjEyNTBfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfc2IxMjUwX2lycSwKIAkuZW5kID0gZW5kX3NiMTI1MF9pcnEsCiAjaWZkZWYgQ09ORklHX1NNUAogCS5zZXRfYWZmaW5pdHkgPSBzYjEyNTBfc2V0X2FmZmluaXR5CkBAIC0xNjMsMTQgKzE2MCw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3NiMTI1MF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzYjEyNTBfdW5tYXNrX2lycShzYjEyNTBfaXJxX293bmVyW2lycV0sIGlycSk7Ci0KLQlyZXR1cm4gMDsJCS8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3NiMTI1MF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzYjEyNTBfbWFza19pcnEoc2IxMjUwX2lycV9vd25lcltpcnFdLCBpcnEpOwpAQCAtMjM5LDE2ICsyMjgsOSBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMTsKLQkJaWYgKGkgPCBTQjEyNTBfTlJfSVJRUykgewotCQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZzYjEyNTBfaXJxX3R5cGU7Ci0JCQlzYjEyNTBfaXJxX293bmVyW2ldID0gMDsKLQkJfSBlbHNlIHsKLQkJCWlycV9kZXNjW2ldLmNoaXAgPSAmbm9faXJxX2NoaXA7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgU0IxMjUwX05SX0lSUVM7IGkrKykgeworCQlzZXRfaXJxX2NoaXAoaSwgJnNiMTI1MF9pcnFfdHlwZSk7CisJCXNiMTI1MF9pcnFfb3duZXJbaV0gPSAwOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvdGltZS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvdGltZS5jCmluZGV4IDBjY2YxNzkuLjJlZmZmZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3RpbWUuYworKysgYi9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC90aW1lLmMKQEAgLTQ3LDE1ICs0NywxMSBAQAogCiAjZGVmaW5lIFNCMTI1MF9IUFRfTlVNCQkzCiAjZGVmaW5lIFNCMTI1MF9IUFRfVkFMVUUJTV9TQ0RfVElNRVJfQ05UIC8qIG1heCB2YWx1ZSAqLwotI2RlZmluZSBTQjEyNTBfSFBUX1NISUZUCSgoc2l6ZW9mKHVuc2lnbmVkIGludCkqOCktVl9TQ0RfVElNRVJfV0lEVEgpCiAKIAogZXh0ZXJuIGludCBzYjEyNTBfc3RlYWxfaXJxKGludCBpcnEpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHNiMTI1MF9ocHRfcmVhZCh2b2lkKTsKLXN0YXRpYyB2b2lkIHNiMTI1MF9ocHRfaW5pdCh1bnNpZ25lZCBpbnQpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGhwdF9vZmZzZXQ7CitzdGF0aWMgY3ljbGVfdCBzYjEyNTBfaHB0X3JlYWQodm9pZCk7CiAKIHZvaWQgX19pbml0IHNiMTI1MF9ocHRfc2V0dXAodm9pZCkKIHsKQEAgLTY5LDEzICs2NSw5IEBACiAJCV9fcmF3X3dyaXRlcShNX1NDRF9USU1FUl9FTkFCTEUgfCBNX1NDRF9USU1FUl9NT0RFX0NPTlRJTlVPVVMsCiAJCQkgICAgIElPQUREUihBX1NDRF9USU1FUl9SRUdJU1RFUihTQjEyNTBfSFBUX05VTSwgUl9TQ0RfVElNRVJfQ0ZHKSkpOwogCi0JCS8qCi0JCSAqIHdlIG5lZWQgdG8gZmlsbCAzMiBiaXRzLCBzbyBqdXN0IHVzZSB0aGUgdXBwZXIgMjMgYml0cyBhbmQgcHJldGVuZAotCQkgKiB0aGUgdGltZXIgaXMgZ29pbmcgNTEyTWh6IGluc3RlYWQgb2YgMU1oegotCQkgKi8KLQkJbWlwc19ocHRfZnJlcXVlbmN5ID0gVl9TQ0RfVElNRVJfRlJFUSA8PCBTQjEyNTBfSFBUX1NISUZUOwotCQltaXBzX2hwdF9pbml0ID0gc2IxMjUwX2hwdF9pbml0OwotCQltaXBzX2hwdF9yZWFkID0gc2IxMjUwX2hwdF9yZWFkOworCQltaXBzX2hwdF9mcmVxdWVuY3kgPSBWX1NDRF9USU1FUl9GUkVROworCQljbG9ja3NvdXJjZV9taXBzLnJlYWQgPSBzYjEyNTBfaHB0X3JlYWQ7CisJCWNsb2Nrc291cmNlX21pcHMubWFzayA9IE1fU0NEX1RJTUVSX0lOSVQ7CiAJfQogfQogCkBAIC0xNDksMjUgKzE0MSwxMyBAQAogCiAvKgogICogVGhlIEhQVCBpcyBmcmVlIHJ1bm5pbmcgZnJvbSBTQjEyNTBfSFBUX1ZBTFVFIGRvd24gdG8gMCB0aGVuIHN0YXJ0cyBvdmVyCi0gKiBhZ2Fpbi4gVGhlcmUncyBubyBlYXN5IHdheSB0byBzZXQgdG8gYSBzcGVjaWZpYyB2YWx1ZSBzbyBzdG9yZSBpbml0IHZhbHVlCi0gKiBpbiBocHRfb2Zmc2V0IGFuZCBzdWJ0cmFjdCBlYWNoIHRpbWUuCi0gKgotICogTm90ZTogVGltZXIgaXNuJ3QgZnVsbCAzMmJpdHMgc28gc2hpZnQgaXQgaW50byB0aGUgdXBwZXIgcGFydCBtYWtpbmcKLSAqICAgICAgIGl0IGFwcGVhciB0byBydW4gYXQgYSBoaWdoZXIgZnJlcXVlbmN5LgorICogYWdhaW4uCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2IxMjUwX2hwdF9yZWFkKHZvaWQpCitzdGF0aWMgY3ljbGVfdCBzYjEyNTBfaHB0X3JlYWQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAKIAljb3VudCA9IEdfU0NEX1RJTUVSX0NOVChfX3Jhd19yZWFkcShJT0FERFIoQV9TQ0RfVElNRVJfUkVHSVNURVIoU0IxMjUwX0hQVF9OVU0sIFJfU0NEX1RJTUVSX0NOVCkpKSk7CiAKLQljb3VudCA9IChTQjEyNTBfSFBUX1ZBTFVFIC0gY291bnQpIDw8IFNCMTI1MF9IUFRfU0hJRlQ7Ci0KLQlyZXR1cm4gY291bnQgLSBocHRfb2Zmc2V0OwotfQotCi1zdGF0aWMgdm9pZCBzYjEyNTBfaHB0X2luaXQodW5zaWduZWQgaW50IGNvdW50KQotewotCWhwdF9vZmZzZXQgPSBjb3VudDsKLQlyZXR1cm47CisJcmV0dXJuIFNCMTI1MF9IUFRfVkFMVUUgLSBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vc2V0dXAuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc3dhcm0vc2V0dXAuYwppbmRleCBhYzM0MmY1Li5kZWZhMWYxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3N3YXJtL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zd2FybS9zZXR1cC5jCkBAIC00Myw3ICs0Myw3IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfU0IxMjUwKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMTEyWCkKICNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+CiAjZWxzZQotI2Vycm9yIGludmFsaWQgU2lCeXRlIGJvYXJkIGNvbmZpZ3VhdGlvbgorI2Vycm9yIGludmFsaWQgU2lCeXRlIGJvYXJkIGNvbmZpZ3VyYXRpb24KICNlbmRpZgogI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX2dlbmJ1cy5oPgogI2luY2x1ZGUgPGFzbS9zaWJ5dGUvYm9hcmQuaD4KQEAgLTUzLDcgKzUzLDcgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX1NJQllURV9TQjEyNTApIHx8IGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xMTJYKQogZXh0ZXJuIHZvaWQgc2IxMjUwX3NldHVwKHZvaWQpOwogI2Vsc2UKLSNlcnJvciBpbnZhbGlkIFNpQnl0ZSBib2FyZCBjb25maWd1YXRpb24KKyNlcnJvciBpbnZhbGlkIFNpQnl0ZSBib2FyZCBjb25maWd1cmF0aW9uCiAjZW5kaWYKIAogZXh0ZXJuIGludCB4aWNvcl9wcm9iZSh2b2lkKTsKQEAgLTkwLDcgKzkwLDcgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX1NJQllURV9TQjEyNTApIHx8IGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xMTJYKQogCXNiMTI1MF90aW1lX2luaXQoKTsKICNlbHNlCi0jZXJyb3IgaW52YWxpZCBTaUJ5dGUgYm9hcmQgY29uZmlndWF0aW9uCisjZXJyb3IgaW52YWxpZCBTaUJ5dGUgYm9hcmQgY29uZmlndXJhdGlvbgogI2VuZGlmCiB9CiAKQEAgLTExMSw3ICsxMTEsNyBAQAogI2VsaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX1NCMTI1MCkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTExMlgpCiAJc2IxMjUwX3NldHVwKCk7CiAjZWxzZQotI2Vycm9yIGludmFsaWQgU2lCeXRlIGJvYXJkIGNvbmZpZ3VhdGlvbgorI2Vycm9yIGludmFsaWQgU2lCeXRlIGJvYXJkIGNvbmZpZ3VyYXRpb24KICNlbmRpZgogCiAJcGFuaWNfdGltZW91dCA9IDU7ICAvKiBGb3IgZGVidWcuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NuaS9pcnEuYyBiL2FyY2gvbWlwcy9zbmkvaXJxLmMKaW5kZXggNDhmYjc0YS4uODUxMWJjYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NuaS9pcnEuYworKysgYi9hcmNoL21pcHMvc25pL2lycS5jCkBAIC0xMSw0NCArMTEsMjUgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NuaS5oPgogCi1ERUZJTkVfU1BJTkxPQ0socGNpYXNpY19sb2NrKTsKLQogc3RhdGljIHZvaWQgZW5hYmxlX3BjaWFzaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChpcnEgLSBQQ0lNVF9JUlFfSU5UMik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lhc2ljX2xvY2ssIGZsYWdzKTsKIAkqKHZvbGF0aWxlIHU4ICopIFBDSU1UX0lSUVNFTCB8PSBtYXNrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaWFzaWNfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfcGNpYXNpY19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfcGNpYXNpY19pcnEoaXJxKTsKLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi0jZGVmaW5lIHNodXRkb3duX3BjaWFzaWNfaXJxCWRpc2FibGVfcGNpYXNpY19pcnEKLQogdm9pZCBkaXNhYmxlX3BjaWFzaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSB+KDEgPDwgKGlycSAtIFBDSU1UX0lSUV9JTlQyKSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lhc2ljX2xvY2ssIGZsYWdzKTsKIAkqKHZvbGF0aWxlIHU4ICopIFBDSU1UX0lSUVNFTCAmPSBtYXNrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaWFzaWNfbG9jaywgZmxhZ3MpOwogfQogCi0jZGVmaW5lIG1hc2tfYW5kX2Fja19wY2lhc2ljX2lycSBkaXNhYmxlX3BjaWFzaWNfaXJxCi0KIHN0YXRpYyB2b2lkIGVuZF9wY2lhc2ljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQpAQCAtNTcsMTEgKzM4LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcGNpYXNpY19pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiQVNJQy1QQ0kiLAotCS5zdGFydHVwID0gc3RhcnR1cF9wY2lhc2ljX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9wY2lhc2ljX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX3BjaWFzaWNfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9wY2lhc2ljX2lycSwKLQkuYWNrID0gbWFza19hbmRfYWNrX3BjaWFzaWNfaXJxLAorCS5hY2sgPSBkaXNhYmxlX3BjaWFzaWNfaXJxLAorCS5tYXNrID0gZGlzYWJsZV9wY2lhc2ljX2lycSwKKwkubWFza19hY2sgPSBkaXNhYmxlX3BjaWFzaWNfaXJxLAorCS51bm1hc2sgPSBlbmFibGVfcGNpYXNpY19pcnEsCiAJLmVuZCA9IGVuZF9wY2lhc2ljX2lycSwKIH07CiAKQEAgLTE3OCwxMiArMTU4LDggQEAKIAogdm9pZCBfX2luaXQgaW5pdF9wY2lhc2ljKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lhc2ljX2xvY2ssIGZsYWdzKTsKIAkqICh2b2xhdGlsZSB1OCAqKSBQQ0lNVF9JUlFTRUwgPQogCQlJVF9FSVNBIHwgSVRfSU5UQSB8IElUX0lOVEIgfCBJVF9JTlRDIHwgSVRfSU5URDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lhc2ljX2xvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTE5OSwxMiArMTc1LDggQEAKIAlpbml0X3BjaWFzaWMoKTsKIAogCS8qIEFjdHVhbGx5IHdlJ3ZlIGdvdCBtb3JlIGludGVycnVwdHMgdG8gaGFuZGxlIC4uLiAgKi8KLQlmb3IgKGkgPSBQQ0lNVF9JUlFfSU5UMjsgaSA8PSBQQ0lNVF9JUlFfRVRIRVJORVQ7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgICAgID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gICAgID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggICAgICA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgICAgPSAmcGNpYXNpY19pcnFfdHlwZTsKLQl9CisJZm9yIChpID0gUENJTVRfSVJRX0lOVDI7IGkgPD0gUENJTVRfSVJRX0VUSEVSTkVUOyBpKyspCisJCXNldF9pcnFfY2hpcChpLCAmcGNpYXNpY19pcnFfdHlwZSk7CiAKIAljaGFuZ2VfYzBfc3RhdHVzKFNUMF9JTSwgSUVfSVJRMXxJRV9JUlEyfElFX0lSUTN8SUVfSVJRNCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHg0OTI3L2NvbW1vbi9zbXNjX2ZkYzM3bTgxeC5jIGIvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vc21zY19mZGMzN204MXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Y1MTdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vc21zY19mZGMzN204MXguYwpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIEludGVyZmFjZSBmb3Igc21zYyBmZGM0OG04MXggU3VwZXIgSU8gY2hpcAorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqIDIwMDEtMjAwMyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3R4NDkyNy9zbXNjX2ZkYzM3bTgxeC5oPgorCisjZGVmaW5lIERFQlVHCisKKy8qIENvbW1vbiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORklHX0lOREVYICAweDAwCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkZJR19EQVRBICAgMHgwMQorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU01TQ19GREMzN004MVhfSU5ERVggICAgICAgICAweDAzCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0ROVU0gICAgICAgICAgMHgwNworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9ESUQgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU01TQ19GREMzN004MVhfRFJFViAgICAgICAgICAweDIxCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1BDTlQgICAgICAgICAgMHgyMgorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9QTUdUICAgICAgICAgIDB4MjMKKyNkZWZpbmUgU01TQ19GREMzN004MVhfT1NDICAgICAgICAgICAweDI0CisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NPTkZQQTAgICAgICAgMHgyNgorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GUEExICAgICAgIDB4MjcKKyNkZWZpbmUgU01TQ19GREMzN004MVhfVEVTVDQgICAgICAgICAweDJCCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1RFU1Q1ICAgICAgICAgMHgyQworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9URVNUMSAgICAgICAgIDB4MkQKKyNkZWZpbmUgU01TQ19GREMzN004MVhfVEVTVDIgICAgICAgICAweDJFCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX1RFU1QzICAgICAgICAgMHgyRgorCisvKiBMb2dpY2FsIGRldmljZSBudW1iZXJzICovCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0ZERCAgICAgICAgICAgMHgwMAorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9TRVJJQUwxICAgICAgIDB4MDQKKyNkZWZpbmUgU01TQ19GREMzN004MVhfU0VSSUFMMiAgICAgICAweDA1CisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0tCRCAgICAgICAgICAgMHgwNworCisvKiBMb2dpY2FsIGRldmljZSBDb25maWcgUmVnaXN0ZXJzICovCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0FDVElWRSAgICAgICAgMHgzMAorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9CQVNFQUREUjAgICAgIDB4NjAKKyNkZWZpbmUgU01TQ19GREMzN004MVhfQkFTRUFERFIxICAgICAweDYxCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0lOVCAgICAgICAgICAgMHg3MAorI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9JTlQyICAgICAgICAgIDB4NzIKKyNkZWZpbmUgU01TQ19GREMzN004MVhfTU9ERSAgICAgICAgICAweEYwCisKKy8qIENoaXAgQ29uZmlnIFZhbHVlcyAqLworI2RlZmluZSBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfRU5URVIgIDB4NTUKKyNkZWZpbmUgU01TQ19GREMzN004MVhfQ09ORklHX0VYSVQgICAweGFhCisjZGVmaW5lIFNNU0NfRkRDMzdNODFYX0NISVBfSUQgICAgICAgMHg0ZAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnX3Ntc2NfZmRjMzdtODF4X2Jhc2UgPSAwOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc21zY19mZGMzN204MXhfcmQodW5zaWduZWQgY2hhciBpbmRleCkKK3sKKwlvdXRiKGluZGV4LCBnX3Ntc2NfZmRjMzdtODF4X2Jhc2UgKyBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfSU5ERVgpOworCisJcmV0dXJuIGluYihnX3Ntc2NfZmRjMzdtODF4X2Jhc2UgKyBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfREFUQSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbXNjX2RjMzdtODF4X3dyKHVuc2lnbmVkIGNoYXIgaW5kZXgsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKGluZGV4LCBnX3Ntc2NfZmRjMzdtODF4X2Jhc2UgKyBTTVNDX0ZEQzM3TTgxWF9DT05GSUdfSU5ERVgpOworCW91dGIoZGF0YSwgZ19zbXNjX2ZkYzM3bTgxeF9iYXNlICsgU01TQ19GREMzN004MVhfQ09ORklHX0RBVEEpOworfQorCit2b2lkIHNtc2NfZmRjMzdtODF4X2NvbmZpZ19iZWcodm9pZCkKK3sKKwlpZiAoZ19zbXNjX2ZkYzM3bTgxeF9iYXNlKSB7CisJCW91dGIoU01TQ19GREMzN004MVhfQ09ORklHX0VOVEVSLAorCQkgICAgIGdfc21zY19mZGMzN204MXhfYmFzZSArIFNNU0NfRkRDMzdNODFYX0NPTkZJR19JTkRFWCk7CisJfQorfQorCit2b2lkIHNtc2NfZmRjMzdtODF4X2NvbmZpZ19lbmQodm9pZCkKK3sKKwlpZiAoZ19zbXNjX2ZkYzM3bTgxeF9iYXNlKQorCQlvdXRiKFNNU0NfRkRDMzdNODFYX0NPTkZJR19FWElULAorCQkgICAgIGdfc21zY19mZGMzN204MXhfYmFzZSArIFNNU0NfRkRDMzdNODFYX0NPTkZJR19JTkRFWCk7Cit9CisKK3U4IHNtc2NfZmRjMzdtODF4X2NvbmZpZ19nZXQodTggcmVnKQoreworCXU4IHZhbCA9IDA7CisKKwlpZiAoZ19zbXNjX2ZkYzM3bTgxeF9iYXNlKQorCQl2YWwgPSBzbXNjX2ZkYzM3bTgxeF9yZChyZWcpOworCisJcmV0dXJuIHZhbDsKK30KKwordm9pZCBzbXNjX2ZkYzM3bTgxeF9jb25maWdfc2V0KHU4IHJlZywgdTggdmFsKQoreworCWlmIChnX3Ntc2NfZmRjMzdtODF4X2Jhc2UpCisJCXNtc2NfZGMzN204MXhfd3IocmVnLCB2YWwpOworfQorCit1bnNpZ25lZCBsb25nIF9faW5pdCBzbXNjX2ZkYzM3bTgxeF9pbml0KHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwljb25zdCBpbnQgZmllbGQgPSBzaXplb2YodW5zaWduZWQgbG9uZykgKiAyOworCXU4IGNoaXBfaWQ7CisKKwlpZiAoZ19zbXNjX2ZkYzM3bTgxeF9iYXNlKQorCQlwcmludGsoInNtc2NfZmRjMzdtODF4X2luaXQoKSBzdGVwcGluZyBvbiBvbGQgYmFzZT0weCUwKmx4XG4iLAorCQkgICAgICAgZmllbGQsIGdfc21zY19mZGMzN204MXhfYmFzZSk7CisKKwlnX3Ntc2NfZmRjMzdtODF4X2Jhc2UgPSBwb3J0OworCisJc21zY19mZGMzN204MXhfY29uZmlnX2JlZygpOworCisJY2hpcF9pZCA9IHNtc2NfZmRjMzdtODF4X3JkKFNNU0NfRkRDMzdNODFYX0RJRCk7CisJaWYgKGNoaXBfaWQgPT0gU01TQ19GREMzN004MVhfQ0hJUF9JRCkKKwkJc21zY19mZGMzN204MXhfY29uZmlnX2VuZCgpOworCWVsc2UgeworCQlwcmludGsoInNtc2NfZmRjMzdtODF4X2luaXQoKSB1bmtub3cgY2hpcCBpZCAweCUwMnhcbiIsCisJCSAgICAgICBjaGlwX2lkKTsKKwkJZ19zbXNjX2ZkYzM3bTgxeF9iYXNlID0gMDsKKwl9CisKKwlyZXR1cm4gZ19zbXNjX2ZkYzM3bTgxeF9iYXNlOworfQorCisjaWZkZWYgREVCVUcKK3ZvaWQgc21zY19mZGMzN204MXhfY29uZmlnX2R1bXBfb25lKGNoYXIgKmtleSwgdTggZGV2LCB1OCByZWcpCit7CisJcHJpbnRrKCIlczogZGV2PTB4JTAyeCByZWc9MHglMDJ4IHZhbD0weCUwMnhcbiIsIGtleSwgZGV2LCByZWcsCisJICAgICAgIHNtc2NfZmRjMzdtODF4X3JkKHJlZykpOworfQorCit2b2lkIHNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wKHZvaWQpCit7CisJdTggb3JpZzsKKwljaGFyICpmbmFtZSA9ICJzbXNjX2ZkYzM3bTgxeF9jb25maWdfZHVtcCgpIjsKKworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19iZWcoKTsKKworCW9yaWcgPSBzbXNjX2ZkYzM3bTgxeF9yZChTTVNDX0ZEQzM3TTgxWF9ETlVNKTsKKworCXByaW50aygiJXM6IGNvbW1vblxuIiwgZm5hbWUpOworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShmbmFtZSwgU01TQ19GREMzN004MVhfTk9ORSwKKwkJCQkgICAgICAgU01TQ19GREMzN004MVhfRE5VTSk7CisJc21zY19mZGMzN204MXhfY29uZmlnX2R1bXBfb25lKGZuYW1lLCBTTVNDX0ZEQzM3TTgxWF9OT05FLAorCQkJCSAgICAgICBTTVNDX0ZEQzM3TTgxWF9ESUQpOworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShmbmFtZSwgU01TQ19GREMzN004MVhfTk9ORSwKKwkJCQkgICAgICAgU01TQ19GREMzN004MVhfRFJFVik7CisJc21zY19mZGMzN204MXhfY29uZmlnX2R1bXBfb25lKGZuYW1lLCBTTVNDX0ZEQzM3TTgxWF9OT05FLAorCQkJCSAgICAgICBTTVNDX0ZEQzM3TTgxWF9QQ05UKTsKKwlzbXNjX2ZkYzM3bTgxeF9jb25maWdfZHVtcF9vbmUoZm5hbWUsIFNNU0NfRkRDMzdNODFYX05PTkUsCisJCQkJICAgICAgIFNNU0NfRkRDMzdNODFYX1BNR1QpOworCisJcHJpbnRrKCIlczoga2V5Ym9hcmRcbiIsIGZuYW1lKTsKKwlzbXNjX2RjMzdtODF4X3dyKFNNU0NfRkRDMzdNODFYX0ROVU0sIFNNU0NfRkRDMzdNODFYX0tCRCk7CisJc21zY19mZGMzN204MXhfY29uZmlnX2R1bXBfb25lKGZuYW1lLCBTTVNDX0ZEQzM3TTgxWF9LQkQsCisJCQkJICAgICAgIFNNU0NfRkRDMzdNODFYX0FDVElWRSk7CisJc21zY19mZGMzN204MXhfY29uZmlnX2R1bXBfb25lKGZuYW1lLCBTTVNDX0ZEQzM3TTgxWF9LQkQsCisJCQkJICAgICAgIFNNU0NfRkRDMzdNODFYX0lOVCk7CisJc21zY19mZGMzN204MXhfY29uZmlnX2R1bXBfb25lKGZuYW1lLCBTTVNDX0ZEQzM3TTgxWF9LQkQsCisJCQkJICAgICAgIFNNU0NfRkRDMzdNODFYX0lOVDIpOworCXNtc2NfZmRjMzdtODF4X2NvbmZpZ19kdW1wX29uZShmbmFtZSwgU01TQ19GREMzN004MVhfS0JELAorCQkJCSAgICAgICBTTVNDX0ZEQzM3TTgxWF9MRENSX0YwKTsKKworCXNtc2NfZGMzN204MXhfd3IoU01TQ19GREMzN004MVhfRE5VTSwgb3JpZyk7CisKKwlzbXNjX2ZkYzM3bTgxeF9jb25maWdfZW5kKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19pcnEuYyBiL2FyY2gvbWlwcy90eDQ5MjcvY29tbW9uL3R4NDkyN19pcnEuYwppbmRleCA4MjY2YTg4Li5lZDRhMTlhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHg0OTI3L2NvbW1vbi90eDQ5MjdfaXJxLmMKKysrIGIvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vdHg0OTI3X2lycS5jCkBAIC02NCwyMCArNjQsMTIgQEAKICNkZWZpbmUgVFg0OTI3X0lSUV9ORVNUNCAgICAgICAoIDEgPDwgIDkgKQogCiAjZGVmaW5lIFRYNDkyN19JUlFfQ1AwX0lOSVQgICAgICggMSA8PCAxMCApCi0jZGVmaW5lIFRYNDkyN19JUlFfQ1AwX1NUQVJUVVAgICggMSA8PCAxMSApCi0jZGVmaW5lIFRYNDkyN19JUlFfQ1AwX1NIVVRET1dOICggMSA8PCAxMiApCiAjZGVmaW5lIFRYNDkyN19JUlFfQ1AwX0VOQUJMRSAgICggMSA8PCAxMyApCiAjZGVmaW5lIFRYNDkyN19JUlFfQ1AwX0RJU0FCTEUgICggMSA8PCAxNCApCi0jZGVmaW5lIFRYNDkyN19JUlFfQ1AwX01BU0sgICAgICggMSA8PCAxNSApCi0jZGVmaW5lIFRYNDkyN19JUlFfQ1AwX0VORElSUSAgICggMSA8PCAxNiApCiAKICNkZWZpbmUgVFg0OTI3X0lSUV9QSUNfSU5JVCAgICAgKCAxIDw8IDIwICkKLSNkZWZpbmUgVFg0OTI3X0lSUV9QSUNfU1RBUlRVUCAgKCAxIDw8IDIxICkKLSNkZWZpbmUgVFg0OTI3X0lSUV9QSUNfU0hVVERPV04gKCAxIDw8IDIyICkKICNkZWZpbmUgVFg0OTI3X0lSUV9QSUNfRU5BQkxFICAgKCAxIDw8IDIzICkKICNkZWZpbmUgVFg0OTI3X0lSUV9QSUNfRElTQUJMRSAgKCAxIDw8IDI0ICkKLSNkZWZpbmUgVFg0OTI3X0lSUV9QSUNfTUFTSyAgICAgKCAxIDw8IDI1ICkKLSNkZWZpbmUgVFg0OTI3X0lSUV9QSUNfRU5ESVJRICAgKCAxIDw8IDI2ICkKIAogI2RlZmluZSBUWDQ5MjdfSVJRX0FMTCAgICAgICAgIDB4ZmZmZmZmZmYKICNlbmRpZgpAQCAtODcsMTkgKzc5LDExIEBACiAJCQkJCSAgfCBUWDQ5MjdfSVJRX0lORk8KIAkJCQkJICB8IFRYNDkyN19JUlFfV0FSTiB8IFRYNDkyN19JUlFfRVJPUgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfQ1AwX0lOSVQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX0NQMF9TVEFSVFVQCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFg0OTI3X0lSUV9DUDBfU0hVVERPV04KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX0NQMF9FTkFCTEUKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX0NQMF9ESVNBQkxFCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFg0OTI3X0lSUV9DUDBfTUFTSwogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfQ1AwX0VORElSUQogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfUElDX0lOSVQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX1BJQ19TVEFSVFVQCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFg0OTI3X0lSUV9QSUNfU0hVVERPV04KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX1BJQ19FTkFCTEUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX1BJQ19ESVNBQkxFCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFg0OTI3X0lSUV9QSUNfTUFTSwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfUElDX0VORElSUQogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfSU5JVAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRYNDkyN19JUlFfTkVTVDEKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUWDQ5MjdfSVJRX05FU1QyCkBAIC0xMjQsNDkgKzEwOCwzMiBAQAogICogRm9yd2FkIGRlZmluaXRpb25zIGZvciBhbGwgcGljJ3MKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHR4NDkyN19pcnFfY3AwX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX2NwMF9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHR4NDkyN19pcnFfY3AwX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHR4NDkyN19pcnFfY3AwX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX2NwMF9tYXNrX2FuZF9hY2sodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX2NwMF9lbmQodW5zaWduZWQgaW50IGlycSk7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHg0OTI3X2lycV9waWNfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkyN19pcnFfcGljX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkyN19pcnFfcGljX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkyN19pcnFfcGljX2VuZCh1bnNpZ25lZCBpbnQgaXJxKTsKIAogLyoKICAqIEtlcm5lbCBzdHJ1Y3RzIGZvciBhbGwgcGljJ3MKICAqLwogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHR4NDkyN19jcDBfbG9jayk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHR4NDkyN19waWNfbG9jayk7Ci0KICNkZWZpbmUgVFg0OTI3X0NQMF9OQU1FICJUWDQ5MjctQ1AwIgogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0eDQ5MjdfaXJxX2NwMF90eXBlID0gewogCS50eXBlbmFtZQk9IFRYNDkyN19DUDBfTkFNRSwKLQkuc3RhcnR1cAk9IHR4NDkyN19pcnFfY3AwX3N0YXJ0dXAsCi0JLnNodXRkb3duCT0gdHg0OTI3X2lycV9jcDBfc2h1dGRvd24sCi0JLmVuYWJsZQkJPSB0eDQ5MjdfaXJxX2NwMF9lbmFibGUsCi0JLmRpc2FibGUJPSB0eDQ5MjdfaXJxX2NwMF9kaXNhYmxlLAotCS5hY2sJCT0gdHg0OTI3X2lycV9jcDBfbWFza19hbmRfYWNrLAotCS5lbmQJCT0gdHg0OTI3X2lycV9jcDBfZW5kLAotCS5zZXRfYWZmaW5pdHkJPSBOVUxMCisJLmFjawkJPSB0eDQ5MjdfaXJxX2NwMF9kaXNhYmxlLAorCS5tYXNrCQk9IHR4NDkyN19pcnFfY3AwX2Rpc2FibGUsCisJLm1hc2tfYWNrCT0gdHg0OTI3X2lycV9jcDBfZGlzYWJsZSwKKwkudW5tYXNrCQk9IHR4NDkyN19pcnFfY3AwX2VuYWJsZSwKIH07CiAKICNkZWZpbmUgVFg0OTI3X1BJQ19OQU1FICJUWDQ5MjctUElDIgogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0eDQ5MjdfaXJxX3BpY190eXBlID0gewogCS50eXBlbmFtZQk9IFRYNDkyN19QSUNfTkFNRSwKLQkuc3RhcnR1cAk9IHR4NDkyN19pcnFfcGljX3N0YXJ0dXAsCi0JLnNodXRkb3duCT0gdHg0OTI3X2lycV9waWNfc2h1dGRvd24sCi0JLmVuYWJsZQkJPSB0eDQ5MjdfaXJxX3BpY19lbmFibGUsCi0JLmRpc2FibGUJPSB0eDQ5MjdfaXJxX3BpY19kaXNhYmxlLAotCS5hY2sJCT0gdHg0OTI3X2lycV9waWNfbWFza19hbmRfYWNrLAotCS5lbmQJCT0gdHg0OTI3X2lycV9waWNfZW5kLAotCS5zZXRfYWZmaW5pdHkJPSBOVUxMCisJLmFjawkJPSB0eDQ5MjdfaXJxX3BpY19kaXNhYmxlLAorCS5tYXNrCQk9IHR4NDkyN19pcnFfcGljX2Rpc2FibGUsCisJLm1hc2tfYWNrCT0gdHg0OTI3X2lycV9waWNfZGlzYWJsZSwKKwkudW5tYXNrCQk9IHR4NDkyN19pcnFfcGljX2VuYWJsZSwKIH07CiAKICNkZWZpbmUgVFg0OTI3X1BJQ19BQ1RJT04ocykgeyBub19hY3Rpb24sIDAsIENQVV9NQVNLX05PTkUsIHMsIE5VTEwsIE5VTEwgfQpAQCAtMjExLDggKzE3OCw2IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHR4NDkyN19pcnFfY3AwX2luaXQodm9pZCkKQEAgLTIyMiw4MiArMTg3LDIzIEBACiAJVFg0OTI3X0lSUV9EUFJJTlRLKFRYNDkyN19JUlFfQ1AwX0lOSVQsICJiZWc9JWQgZW5kPSVkXG4iLAogCQkJICAgVFg0OTI3X0lSUV9DUDBfQkVHLCBUWDQ5MjdfSVJRX0NQMF9FTkQpOwogCi0JZm9yIChpID0gVFg0OTI3X0lSUV9DUDBfQkVHOyBpIDw9IFRYNDkyN19JUlFfQ1AwX0VORDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnR4NDkyN19pcnFfY3AwX3R5cGU7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHR4NDkyN19pcnFfY3AwX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9DUDBfU1RBUlRVUCwgImlycT0lZCBcbiIsIGlycSk7Ci0KLQl0eDQ5MjdfaXJxX2NwMF9lbmFibGUoaXJxKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR4NDkyN19pcnFfY3AwX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JVFg0OTI3X0lSUV9EUFJJTlRLKFRYNDkyN19JUlFfQ1AwX1NIVVRET1dOLCAiaXJxPSVkIFxuIiwgaXJxKTsKLQotCXR4NDkyN19pcnFfY3AwX2Rpc2FibGUoaXJxKTsKLQotCXJldHVybjsKKwlmb3IgKGkgPSBUWDQ5MjdfSVJRX0NQMF9CRUc7IGkgPD0gVFg0OTI3X0lSUV9DUDBfRU5EOyBpKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmdHg0OTI3X2lycV9jcDBfdHlwZSwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogfQogCiBzdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX2NwMF9lbmFibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJVFg0OTI3X0lSUV9EUFJJTlRLKFRYNDkyN19JUlFfQ1AwX0VOQUJMRSwgImlycT0lZCBcbiIsIGlycSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHg0OTI3X2NwMF9sb2NrLCBmbGFncyk7Ci0KIAl0eDQ5MjdfaXJxX2NwMF9tb2RpZnkoQ0NQMF9TVEFUVVMsIDAsIHR4NDkyN19pcnFfY3AwX21hc2soaXJxKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eDQ5MjdfY3AwX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgdHg0OTI3X2lycV9jcDBfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9DUDBfRElTQUJMRSwgImlycT0lZCBcbiIsIGlycSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHg0OTI3X2NwMF9sb2NrLCBmbGFncyk7Ci0KIAl0eDQ5MjdfaXJxX2NwMF9tb2RpZnkoQ0NQMF9TVEFUVVMsIHR4NDkyN19pcnFfY3AwX21hc2soaXJxKSwgMCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eDQ5MjdfY3AwX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTI3X2lycV9jcDBfbWFza19hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JVFg0OTI3X0lSUV9EUFJJTlRLKFRYNDkyN19JUlFfQ1AwX01BU0ssICJpcnE9JWQgXG4iLCBpcnEpOwotCi0JdHg0OTI3X2lycV9jcDBfZGlzYWJsZShpcnEpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX2NwMF9lbmQodW5zaWduZWQgaW50IGlycSkKLXsKLQlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9DUDBfRU5ESVJRLCAiaXJxPSVkIFxuIiwgaXJxKTsKLQotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpIHsKLQkJdHg0OTI3X2lycV9jcDBfZW5hYmxlKGlycSk7Ci0JfQotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtNDE4LDEwNSArMzI0LDM5IEBACiAJdmFsICY9ICh+Y2xyX2JpdHMpOwogCXZhbCB8PSAoc2V0X2JpdHMpOwogCVRYNDkyN19XUihwaWNfcmVnLCB2YWwpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgdHg0OTI3X2lycV9waWNfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKIAlUWDQ5MjdfSVJRX0RQUklOVEsoVFg0OTI3X0lSUV9QSUNfSU5JVCwgImJlZz0lZCBlbmQ9JWRcbiIsCiAJCQkgICBUWDQ5MjdfSVJRX1BJQ19CRUcsIFRYNDkyN19JUlFfUElDX0VORCk7CiAKLQlmb3IgKGkgPSBUWDQ5MjdfSVJRX1BJQ19CRUc7IGkgPD0gVFg0OTI3X0lSUV9QSUNfRU5EOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDI7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmdHg0OTI3X2lycV9waWNfdHlwZTsKLQl9CisJZm9yIChpID0gVFg0OTI3X0lSUV9QSUNfQkVHOyBpIDw9IFRYNDkyN19JUlFfUElDX0VORDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnR4NDkyN19pcnFfcGljX3R5cGUsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCXNldHVwX2lycShUWDQ5MjdfSVJRX05FU1RfUElDX09OX0NQMCwgJnR4NDkyN19pcnFfcGljX2FjdGlvbik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHg0OTI3X3BpY19sb2NrLCBmbGFncyk7Ci0KIAlUWDQ5MjdfV1IoMHhmZjFmZjY0MCwgMHg2KTsJLyogaXJxIGxldmVsIG1hc2sgLS0gb25seSBhY2NlcHQgaGlnaHRlc3QgKi8KIAlUWDQ5MjdfV1IoMHhmZjFmZjYwMCwgVFg0OTI3X1JEKDB4ZmYxZmY2MDApIHwgMHgxKTsJLyogaXJxIGVuYWJsZSAqLwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHg0OTI3X3BpY19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHg0OTI3X2lycV9waWNfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX1BJQ19TVEFSVFVQLCAiaXJxPSVkXG4iLCBpcnEpOwotCi0JdHg0OTI3X2lycV9waWNfZW5hYmxlKGlycSk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX3BpY19zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQotewotCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX1BJQ19TSFVURE9XTiwgImlycT0lZFxuIiwgaXJxKTsKLQotCXR4NDkyN19pcnFfcGljX2Rpc2FibGUoaXJxKTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX1BJQ19FTkFCTEUsICJpcnE9JWRcbiIsIGlycSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHg0OTI3X3BpY19sb2NrLCBmbGFncyk7Ci0KIAl0eDQ5MjdfaXJxX3BpY19tb2RpZnkodHg0OTI3X2lycV9waWNfYWRkcihpcnEpLCAwLAogCQkJICAgICAgdHg0OTI3X2lycV9waWNfbWFzayhpcnEpKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4NDkyN19waWNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCB0eDQ5MjdfaXJxX3BpY19kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX1BJQ19ESVNBQkxFLCAiaXJxPSVkXG4iLCBpcnEpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR4NDkyN19waWNfbG9jaywgZmxhZ3MpOwotCiAJdHg0OTI3X2lycV9waWNfbW9kaWZ5KHR4NDkyN19pcnFfcGljX2FkZHIoaXJxKSwKIAkJCSAgICAgIHR4NDkyN19pcnFfcGljX21hc2soaXJxKSwgMCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eDQ5MjdfcGljX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTI3X2lycV9waWNfbWFza19hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JVFg0OTI3X0lSUV9EUFJJTlRLKFRYNDkyN19JUlFfUElDX01BU0ssICJpcnE9JWRcbiIsIGlycSk7Ci0KLQl0eDQ5MjdfaXJxX3BpY19kaXNhYmxlKGlycSk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHR4NDkyN19pcnFfcGljX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX1BJQ19FTkRJUlEsICJpcnE9JWRcbiIsIGlycSk7Ci0KLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKSB7Ci0JCXR4NDkyN19pcnFfcGljX2VuYWJsZShpcnEpOwotCX0KLQotCXJldHVybjsKIH0KIAogLyoKQEAgLTUzMyw4ICszNzMsNiBAQAogCXR4NDkyN19pcnFfcGljX2luaXQoKTsKIAogCVRYNDkyN19JUlFfRFBSSU5USyhUWDQ5MjdfSVJRX0lOSVQsICIrXG4iKTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIGludCB0eDQ5MjdfaXJxX25lc3RlZCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4NDkyNy9jb21tb24vdHg0OTI3X3NldHVwLmMgYi9hcmNoL21pcHMvdHg0OTI3L2NvbW1vbi90eDQ5Mjdfc2V0dXAuYwppbmRleCA0NjU4YjJhLi45NDFjNDQxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHg0OTI3L2NvbW1vbi90eDQ5Mjdfc2V0dXAuYworKysgYi9hcmNoL21pcHMvdHg0OTI3L2NvbW1vbi90eDQ5Mjdfc2V0dXAuYwpAQCAtMTEyLDggKzExMiw2IEBACiAJcmV0dXJuOwogfQogCi1pbmRlbnQ6IFN0YW5kYXJkIGlucHV0OjI1OiBFcnJvcjpVbmV4cGVjdGVkIGVuZCBvZiBmaWxlCi0KIHZvaWQKIGR1bXBfY3AwKGNoYXIgKmtleSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eDQ5MjcvdG9zaGliYV9yYnR4NDkyNy90b3NoaWJhX3JidHg0OTI3X2lycS5jIGIvYXJjaC9taXBzL3R4NDkyNy90b3NoaWJhX3JidHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjdfaXJxLmMKaW5kZXggMGMzYzNmNi4uYjU0YjUyOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3R4NDkyNy90b3NoaWJhX3JidHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjdfaXJxLmMKKysrIGIvYXJjaC9taXBzL3R4NDkyNy90b3NoaWJhX3JidHg0OTI3L3Rvc2hpYmFfcmJ0eDQ5MjdfaXJxLmMKQEAgLTE1MSwyMCArMTUxLDEzIEBACiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0VST1IgICAgICAgICAgKCAxIDw8ICAyICkKIAogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfSU5JVCAgICAgICggMSA8PCAxMCApCi0jZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TVEFSVFVQICAgKCAxIDw8IDExICkKLSNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX1NIVVRET1dOICAoIDEgPDwgMTIgKQogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5BQkxFICAgICggMSA8PCAxMyApCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19ESVNBQkxFICAgKCAxIDw8IDE0ICkKLSNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX01BU0sgICAgICAoIDEgPDwgMTUgKQotI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5ESVJRICAgICggMSA8PCAxNiApCiAKICNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0lOSVQgICAgICAoIDEgPDwgMjAgKQotI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfU1RBUlRVUCAgICggMSA8PCAyMSApCi0jZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9TSFVURE9XTiAgKCAxIDw8IDIyICkKICNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VOQUJMRSAgICAoIDEgPDwgMjMgKQogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfRElTQUJMRSAgICggMSA8PCAyNCApCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9NQVNLICAgICAgKCAxIDw8IDI1ICkKLSNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORElSUSAgICAoIDEgPDwgMjYgKQogCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfU0VUVVBfQUxMICAgICAgICAgMHhmZmZmZmZmZgogI2VuZGlmCkBAIC0xNzUsMTkgKzE2OCwxMiBAQAogICAgIChUT1NISUJBX1JCVFg0OTI3X0lSUV9OT05FIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSU5GTyB8CiAgICAgIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX1dBUk4gfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9FUk9SCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19JTklUCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TVEFSVFVQCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19TSFVURE9XTgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5BQkxFCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19ESVNBQkxFCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19NQVNLCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkRJUlEKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0lOSVQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NUQVJUVVAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX1NIVVRET1dOCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9FTkFCTEUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0RJU0FCTEUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX01BU0sKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORElSUQogICAgICk7CiAjZW5kaWYKIApAQCAtMjMxLDM1ICsyMTcsMjIgQEAKIGV4dGVybiB2b2lkIG1hc2tfYW5kX2Fja184MjU5QSh1bnNpZ25lZCBpbnQgaXJxKTsKICNlbmRpZgogCi1zdGF0aWMgdW5zaWduZWQgaW50IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19lbmQodW5zaWduZWQgaW50IGlycSk7CiAKICNpZmRlZiBDT05GSUdfVE9TSElCQV9GUENJQjAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2Ffc2h1dGRvd24odW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfbWFza19hbmRfYWNrKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2VuZCh1bnNpZ25lZCBpbnQgaXJxKTsKICNlbmRpZgogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRvc2hpYmFfcmJ0eDQ5MjdfaW9jX2xvY2spOwotCi0KICNkZWZpbmUgVE9TSElCQV9SQlRYNDkyN19JT0NfTkFNRSAiUkJUWDQ5MjctSU9DIgogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSBUT1NISUJBX1JCVFg0OTI3X0lPQ19OQU1FLAotCS5zdGFydHVwID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX3NodXRkb3duLAotCS5lbmFibGUgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZW5hYmxlLAotCS5kaXNhYmxlID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2Rpc2FibGUsCi0JLmFjayA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19tYXNrX2FuZF9hY2ssCi0JLmVuZCA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19lbmQsCi0JLnNldF9hZmZpbml0eSA9IE5VTEwKKwkuYWNrID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2Rpc2FibGUsCisJLm1hc2sgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZGlzYWJsZSwKKwkubWFza19hY2sgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZGlzYWJsZSwKKwkudW5tYXNrID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2VuYWJsZSwKIH07CiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSU9DX0lOVFJfRU5BQiAweGJjMDAyMDAwCiAjZGVmaW5lIFRPU0hJQkFfUkJUWDQ5MjdfSU9DX0lOVFJfU1RBVCAweGJjMDAyMDA2CkBAIC0yNjksMTMgKzI0MiwxMCBAQAogI2RlZmluZSBUT1NISUJBX1JCVFg0OTI3X0lTQV9OQU1FICJSQlRYNDkyNy1JU0EiCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV90eXBlID0gewogCS50eXBlbmFtZSA9IFRPU0hJQkFfUkJUWDQ5MjdfSVNBX05BTUUsCi0JLnN0YXJ0dXAgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2Ffc3RhcnR1cCwKLQkuc2h1dGRvd24gPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2Ffc2h1dGRvd24sCi0JLmVuYWJsZSA9IHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9lbmFibGUsCi0JLmRpc2FibGUgPSB0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfZGlzYWJsZSwKIAkuYWNrID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX21hc2tfYW5kX2FjaywKLQkuZW5kID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2VuZCwKLQkuc2V0X2FmZmluaXR5ID0gTlVMTAorCS5tYXNrID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2Rpc2FibGUsCisJLm1hc2tfYWNrID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX21hc2tfYW5kX2FjaywKKwkudW5tYXNrID0gdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2VuYWJsZSwKIH07CiAjZW5kaWYKIApAQCAtMzYzLDU4ICszMzMsMTYgQEAKIAkJCQkgICAgIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19FTkQpOwogCiAJZm9yIChpID0gVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0JFRzsKLQkgICAgIGkgPD0gVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VORDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAzOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY190eXBlOwotCX0KKwkgICAgIGkgPD0gVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VORDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY190eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlzZXR1cF9pcnEoVE9TSElCQV9SQlRYNDkyN19JUlFfTkVTVF9JT0NfT05fUElDLAogCQkgICZ0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfYWN0aW9uKTsKLQotCXJldHVybjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2Nfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX1NUQVJUVVAsCi0JCQkJICAgICAiaXJxPSVkXG4iLCBpcnEpOwotCi0JaWYgKGlycSA8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19CRUcKLQkgICAgfHwgaXJxID4gVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VORCkgewotCQlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0VST1IsCi0JCQkJCSAgICAgImJhZCBpcnE9JWRcbiIsIGlycSk7Ci0JCXBhbmljKCJcbiIpOwotCX0KLQotCXRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19lbmFibGUoaXJxKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfU0hVVERPV04sCi0JCQkJICAgICAiaXJxPSVkXG4iLCBpcnEpOwotCi0JaWYgKGlycSA8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19CRUcKLQkgICAgfHwgaXJxID4gVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VORCkgewotCQlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0VST1IsCi0JCQkJCSAgICAgImJhZCBpcnE9JWRcbiIsIGlycSk7Ci0JCXBhbmljKCJcbiIpOwotCX0KLQotCXRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19kaXNhYmxlKGlycSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9sYXRpbGUgdW5zaWduZWQgY2hhciB2OwogCiAJVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5BQkxFLApAQCAtNDI3LDIxICszNTUsMTQgQEAKIAkJcGFuaWMoIlxuIik7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRvc2hpYmFfcmJ0eDQ5MjdfaW9jX2xvY2ssIGZsYWdzKTsKLQogCXYgPSBUWDQ5MjdfUkQwOChUT1NISUJBX1JCVFg0OTI3X0lPQ19JTlRSX0VOQUIpOwogCXYgfD0gKDEgPDwgKGlycSAtIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19CRUcpKTsKIAlUT1NISUJBX1JCVFg0OTI3X1dSMDgoVE9TSElCQV9SQlRYNDkyN19JT0NfSU5UUl9FTkFCLCB2KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRvc2hpYmFfcmJ0eDQ5MjdfaW9jX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKIH0KIAogCiBzdGF0aWMgdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9sYXRpbGUgdW5zaWduZWQgY2hhciB2OwogCiAJVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRElTQUJMRSwKQEAgLTQ1NCw1MyArMzc1LDkgQEAKIAkJcGFuaWMoIlxuIik7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRvc2hpYmFfcmJ0eDQ5MjdfaW9jX2xvY2ssIGZsYWdzKTsKLQogCXYgPSBUWDQ5MjdfUkQwOChUT1NISUJBX1JCVFg0OTI3X0lPQ19JTlRSX0VOQUIpOwogCXYgJj0gfigxIDw8IChpcnEgLSBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfQkVHKSk7CiAJVE9TSElCQV9SQlRYNDkyN19XUjA4KFRPU0hJQkFfUkJUWDQ5MjdfSU9DX0lOVFJfRU5BQiwgdik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0b3NoaWJhX3JidHg0OTI3X2lvY19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX01BU0ssCi0JCQkJICAgICAiaXJxPSVkXG4iLCBpcnEpOwotCi0JaWYgKGlycSA8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lPQ19CRUcKLQkgICAgfHwgaXJxID4gVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VORCkgewotCQlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0VST1IsCi0JCQkJCSAgICAgImJhZCBpcnE9JWRcbiIsIGlycSk7Ci0JCXBhbmljKCJcbiIpOwotCX0KLQotCXRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lvY19kaXNhYmxlKGlycSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaW9jX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0VORElSUSwKLQkJCQkgICAgICJpcnE9JWRcbiIsIGlycSk7Ci0KLQlpZiAoaXJxIDwgVE9TSElCQV9SQlRYNDkyN19JUlFfSU9DX0JFRwotCSAgICB8fCBpcnEgPiBUT1NISUJBX1JCVFg0OTI3X0lSUV9JT0NfRU5EKSB7Ci0JCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfRVJPUiwKLQkJCQkJICAgICAiYmFkIGlycT0lZFxuIiwgaXJxKTsKLQkJcGFuaWMoIlxuIik7Ci0JfQotCi0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkgewotCQl0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfZW5hYmxlKGlycSk7Ci0JfQotCi0JcmV0dXJuOwogfQogCiAKQEAgLTUyMCwxMyArMzk3LDkgQEAKIAkJCQkgICAgIFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9FTkQpOwogCiAJZm9yIChpID0gVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0JFRzsKLQkgICAgIGkgPD0gVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPQotCQkgICAgKChpIDwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX01JRCkgPyAoNCkgOiAoNSkpOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV90eXBlOwotCX0KKwkgICAgIGkgPD0gVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV90eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlzZXR1cF9pcnEoVE9TSElCQV9SQlRYNDkyN19JUlFfTkVTVF9JU0FfT05fSU9DLAogCQkgICZ0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfbWFzdGVyKTsKQEAgLTUzNiw0OCArNDA5LDYgQEAKIAkvKiBtYWtlIHN1cmUgd2UgYXJlIGxvb2tpbmcgYXQgSVJSIChub3QgSVNSKSAqLwogCW91dGIoMHgwQSwgMHgyMCk7CiAJb3V0YigweDBBLCAweEEwKTsKLQotCXJldHVybjsKLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfVE9TSElCQV9GUENJQjAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9TVEFSVFVQLAotCQkJCSAgICAgImlycT0lZFxuIiwgaXJxKTsKLQotCWlmIChpcnEgPCBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfQkVHCi0JICAgIHx8IGlycSA+IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9FTkQpIHsKLQkJVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9FUk9SLAotCQkJCQkgICAgICJiYWQgaXJxPSVkXG4iLCBpcnEpOwotCQlwYW5pYygiXG4iKTsKLQl9Ci0KLQl0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfZW5hYmxlKGlycSk7Ci0KLQlyZXR1cm4gKDApOwotfQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19UT1NISUJBX0ZQQ0lCMAotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfU0hVVERPV04sCi0JCQkJICAgICAiaXJxPSVkXG4iLCBpcnEpOwotCi0JaWYgKGlycSA8IFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0lTQV9CRUcKLQkgICAgfHwgaXJxID4gVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORCkgewotCQlUT1NISUJBX1JCVFg0OTI3X0lSUV9EUFJJTlRLKFRPU0hJQkFfUkJUWDQ5MjdfSVJRX0VST1IsCi0JCQkJCSAgICAgImJhZCBpcnE9JWRcbiIsIGlycSk7Ci0JCXBhbmljKCJcbiIpOwotCX0KLQotCXRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2lzYV9kaXNhYmxlKGlycSk7Ci0KLQlyZXR1cm47CiB9CiAjZW5kaWYKIApAQCAtNTk2LDggKzQyNyw2IEBACiAJfQogCiAJZW5hYmxlXzgyNTlBX2lycShpcnEpOwotCi0JcmV0dXJuOwogfQogI2VuZGlmCiAKQEAgLTYxNiw4ICs0NDUsNiBAQAogCX0KIAogCWRpc2FibGVfODI1OUFfaXJxKGlycSk7Ci0KLQlyZXR1cm47CiB9CiAjZW5kaWYKIApAQCAtNjM2LDMwICs0NjMsNiBAQAogCX0KIAogCW1hc2tfYW5kX2Fja184MjU5QShpcnEpOwotCi0JcmV0dXJuOwotfQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19UT1NISUJBX0ZQQ0lCMAotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkyN19pcnFfaXNhX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQotewotCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0VORElSUSwKLQkJCQkgICAgICJpcnE9JWRcbiIsIGlycSk7Ci0KLQlpZiAoaXJxIDwgVE9TSElCQV9SQlRYNDkyN19JUlFfSVNBX0JFRwotCSAgICB8fCBpcnEgPiBUT1NISUJBX1JCVFg0OTI3X0lSUV9JU0FfRU5EKSB7Ci0JCVRPU0hJQkFfUkJUWDQ5MjdfSVJRX0RQUklOVEsoVE9TSElCQV9SQlRYNDkyN19JUlFfRVJPUiwKLQkJCQkJICAgICAiYmFkIGlycT0lZFxuIiwgaXJxKTsKLQkJcGFuaWMoIlxuIik7Ci0JfQotCi0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkgewotCQl0b3NoaWJhX3JidHg0OTI3X2lycV9pc2FfZW5hYmxlKGlycSk7Ci0JfQotCi0JcmV0dXJuOwogfQogI2VuZGlmCiAKQEAgLTY2OCw4ICs0NzEsNiBAQAogewogCWV4dGVybiB2b2lkIHR4NDkyN19pcnFfaW5pdCh2b2lkKTsKIAotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KIAl0eDQ5MjdfaXJxX2luaXQoKTsKIAl0b3NoaWJhX3JidHg0OTI3X2lycV9pb2NfaW5pdCgpOwogI2lmZGVmIENPTkZJR19UT1NISUJBX0ZQQ0lCMApAQCAtNjgxLDggKzQ4Miw2IEBACiAjZW5kaWYKIAogCXdiZmx1c2goKTsKLQotCXJldHVybjsKIH0KIAogdm9pZCB0b3NoaWJhX3JidHg0OTI3X2lycV9kdW1wKGNoYXIgKmtleSkKQEAgLTcxNSw3ICs1MTQsNiBAQAogCQl9CiAJfQogI2VuZGlmCi0JcmV0dXJuOwogfQogCiB2b2lkIHRvc2hpYmFfcmJ0eDQ5MjdfaXJxX2R1bXBfcGljcyhjaGFyICpzKQpAQCAtNzgwLDYgKzU3OCw0IEBACiAJCQkJICAgICBsZXZlbDVfcyk7CiAJVE9TSElCQV9SQlRYNDkyN19JUlFfRFBSSU5USyhUT1NISUJBX1JCVFg0OTI3X0lSUV9JTkZPLCAiWyVzXVxuIiwKIAkJCQkgICAgIHMpOwotCi0JcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4NDkzOC9jb21tb24vaXJxLmMgYi9hcmNoL21pcHMvdHg0OTM4L2NvbW1vbi9pcnEuYwppbmRleCA3N2ZlMjQ1Li5hMzQ3YjQyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHg0OTM4L2NvbW1vbi9pcnEuYworKysgYi9hcmNoL21pcHMvdHg0OTM4L2NvbW1vbi9pcnEuYwpAQCAtMzcsNDggKzM3LDMyIEBACiAvKiBGb3J3YWQgZGVmaW5pdGlvbnMgZm9yIGFsbCBwaWMncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHR4NDkzOF9pcnFfY3AwX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0eDQ5MzhfaXJxX2NwMF9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHR4NDkzOF9pcnFfY3AwX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHR4NDkzOF9pcnFfY3AwX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0eDQ5MzhfaXJxX2NwMF9tYXNrX2FuZF9hY2sodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCB0eDQ5MzhfaXJxX2NwMF9lbmQodW5zaWduZWQgaW50IGlycSk7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHg0OTM4X2lycV9waWNfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkzOF9pcnFfcGljX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTM4X2lycV9waWNfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdHg0OTM4X2lycV9waWNfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkzOF9pcnFfcGljX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHR4NDkzOF9pcnFfcGljX2VuZCh1bnNpZ25lZCBpbnQgaXJxKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBLZXJuZWwgc3RydWN0cyBmb3IgYWxsIHBpYydzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotREVGSU5FX1NQSU5MT0NLKHR4NDkzOF9jcDBfbG9jayk7Ci1ERUZJTkVfU1BJTkxPQ0sodHg0OTM4X3BpY19sb2NrKTsKIAogI2RlZmluZSBUWDQ5MzhfQ1AwX05BTUUgIlRYNDkzOC1DUDAiCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHR4NDkzOF9pcnFfY3AwX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gVFg0OTM4X0NQMF9OQU1FLAotCS5zdGFydHVwID0gdHg0OTM4X2lycV9jcDBfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSB0eDQ5MzhfaXJxX2NwMF9zaHV0ZG93biwKLQkuZW5hYmxlID0gdHg0OTM4X2lycV9jcDBfZW5hYmxlLAotCS5kaXNhYmxlID0gdHg0OTM4X2lycV9jcDBfZGlzYWJsZSwKLQkuYWNrID0gdHg0OTM4X2lycV9jcDBfbWFza19hbmRfYWNrLAotCS5lbmQgPSB0eDQ5MzhfaXJxX2NwMF9lbmQsCi0JLnNldF9hZmZpbml0eSA9IE5VTEwKKwkuYWNrID0gdHg0OTM4X2lycV9jcDBfZGlzYWJsZSwKKwkubWFzayA9IHR4NDkzOF9pcnFfY3AwX2Rpc2FibGUsCisJLm1hc2tfYWNrID0gdHg0OTM4X2lycV9jcDBfZGlzYWJsZSwKKwkudW5tYXNrID0gdHg0OTM4X2lycV9jcDBfZW5hYmxlLAogfTsKIAogI2RlZmluZSBUWDQ5MzhfUElDX05BTUUgIlRYNDkzOC1QSUMiCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHR4NDkzOF9pcnFfcGljX3R5cGUgPSB7CiAJLnR5cGVuYW1lID0gVFg0OTM4X1BJQ19OQU1FLAotCS5zdGFydHVwID0gdHg0OTM4X2lycV9waWNfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSB0eDQ5MzhfaXJxX3BpY19zaHV0ZG93biwKLQkuZW5hYmxlID0gdHg0OTM4X2lycV9waWNfZW5hYmxlLAotCS5kaXNhYmxlID0gdHg0OTM4X2lycV9waWNfZGlzYWJsZSwKLQkuYWNrID0gdHg0OTM4X2lycV9waWNfbWFza19hbmRfYWNrLAotCS5lbmQgPSB0eDQ5MzhfaXJxX3BpY19lbmQsCi0JLnNldF9hZmZpbml0eSA9IE5VTEwKKwkuYWNrID0gdHg0OTM4X2lycV9waWNfZGlzYWJsZSwKKwkubWFzayA9IHR4NDkzOF9pcnFfcGljX2Rpc2FibGUsCisJLm1hc2tfYWNrID0gdHg0OTM4X2lycV9waWNfZGlzYWJsZSwKKwkudW5tYXNrID0gdHg0OTM4X2lycV9waWNfZW5hYmxlLAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdHg0OTM4X2lycV9waWNfYWN0aW9uID0gewpAQCAtOTksNjQgKzgzLDIxIEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSBUWDQ5MzhfSVJRX0NQMF9CRUc7IGkgPD0gVFg0OTM4X0lSUV9DUDBfRU5EOyBpKyspIHsKLQkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOwotCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7Ci0JCWlycV9kZXNjW2ldLmNoaXAgPSAmdHg0OTM4X2lycV9jcDBfdHlwZTsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXR4NDkzOF9pcnFfY3AwX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQl0eDQ5MzhfaXJxX2NwMF9lbmFibGUoaXJxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotdHg0OTM4X2lycV9jcDBfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKLXsKLQl0eDQ5MzhfaXJxX2NwMF9kaXNhYmxlKGlycSk7CisJZm9yIChpID0gVFg0OTM4X0lSUV9DUDBfQkVHOyBpIDw9IFRYNDkzOF9JUlFfQ1AwX0VORDsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnR4NDkzOF9pcnFfY3AwX3R5cGUsCisJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIH0KIAogc3RhdGljIHZvaWQKIHR4NDkzOF9pcnFfY3AwX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHg0OTM4X2NwMF9sb2NrLCBmbGFncyk7Ci0KIAlzZXRfYzBfc3RhdHVzKHR4NDkzOF9pcnFfY3AwX21hc2soaXJxKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eDQ5MzhfY3AwX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQKIHR4NDkzOF9pcnFfY3AwX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR4NDkzOF9jcDBfbG9jaywgZmxhZ3MpOwotCiAJY2xlYXJfYzBfc3RhdHVzKHR4NDkzOF9pcnFfY3AwX21hc2soaXJxKSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eDQ5MzhfY3AwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLXR4NDkzOF9pcnFfY3AwX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQotewotCXR4NDkzOF9pcnFfY3AwX2Rpc2FibGUoaXJxKTsKLX0KLQotc3RhdGljIHZvaWQKLXR4NDkzOF9pcnFfY3AwX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpIHsKLQkJdHg0OTM4X2lycV9jcDBfZW5hYmxlKGlycSk7Ci0JfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI5MCw3OCArMjMxLDMwIEBACiBzdGF0aWMgdm9pZCBfX2luaXQKIHR4NDkzOF9pcnFfcGljX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCi0JZm9yIChpID0gVFg0OTM4X0lSUV9QSUNfQkVHOyBpIDw9IFRYNDkzOF9JUlFfUElDX0VORDsgaSsrKSB7Ci0JCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbaV0uZGVwdGggPSAyOwotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnR4NDkzOF9pcnFfcGljX3R5cGU7Ci0JfQorCWZvciAoaSA9IFRYNDkzOF9JUlFfUElDX0JFRzsgaSA8PSBUWDQ5MzhfSVJRX1BJQ19FTkQ7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZ0eDQ5MzhfaXJxX3BpY190eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAlzZXR1cF9pcnEoVFg0OTM4X0lSUV9ORVNUX1BJQ19PTl9DUDAsICZ0eDQ5MzhfaXJxX3BpY19hY3Rpb24pOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR4NDkzOF9waWNfbG9jaywgZmxhZ3MpOwotCiAJVFg0OTM4X1dSKDB4ZmYxZmY2NDAsIDB4Nik7CS8qIGlycSBsZXZlbCBtYXNrIC0tIG9ubHkgYWNjZXB0IGhpZ2h0ZXN0ICovCiAJVFg0OTM4X1dSKDB4ZmYxZmY2MDAsIFRYNDkzOF9SRCgweGZmMWZmNjAwKSB8IDB4MSk7CS8qIGlycSBlbmFibGUgKi8KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4NDkzOF9waWNfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci10eDQ5MzhfaXJxX3BpY19zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdHg0OTM4X2lycV9waWNfZW5hYmxlKGlycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLXR4NDkzOF9pcnFfcGljX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdHg0OTM4X2lycV9waWNfZGlzYWJsZShpcnEpOwogfQogCiBzdGF0aWMgdm9pZAogdHg0OTM4X2lycV9waWNfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0eDQ5MzhfcGljX2xvY2ssIGZsYWdzKTsKLQogCXR4NDkzOF9pcnFfcGljX21vZGlmeSh0eDQ5MzhfaXJxX3BpY19hZGRyKGlycSksIDAsCiAJCQkgICAgICB0eDQ5MzhfaXJxX3BpY19tYXNrKGlycSkpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHg0OTM4X3BpY19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkCiB0eDQ5MzhfaXJxX3BpY19kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0eDQ5MzhfcGljX2xvY2ssIGZsYWdzKTsKLQogCXR4NDkzOF9pcnFfcGljX21vZGlmeSh0eDQ5MzhfaXJxX3BpY19hZGRyKGlycSksCiAJCQkgICAgICB0eDQ5MzhfaXJxX3BpY19tYXNrKGlycSksIDApOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHg0OTM4X3BpY19sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10eDQ5MzhfaXJxX3BpY19tYXNrX2FuZF9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQl0eDQ5MzhfaXJxX3BpY19kaXNhYmxlKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10eDQ5MzhfaXJxX3BpY19lbmQodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKSB7Ci0JCXR4NDkzOF9pcnFfcGljX2VuYWJsZShpcnEpOwotCX0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdHg0OTM4L2NvbW1vbi9zZXR1cC5jIGIvYXJjaC9taXBzL3R4NDkzOC9jb21tb24vc2V0dXAuYwppbmRleCBmNDE1YTFmLi5kYzg3ZDkyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHg0OTM4L2NvbW1vbi9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy90eDQ5MzgvY29tbW9uL3NldHVwLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS90eDQ5MzgvcmJ0eDQ5MzguaD4KIAogZXh0ZXJuIHZvaWQgdG9zaGliYV9yYnR4NDkzOF9zZXR1cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eDQ5MzgvdG9zaGliYV9yYnR4NDkzOC9pcnEuYyBiL2FyY2gvbWlwcy90eDQ5MzgvdG9zaGliYV9yYnR4NDkzOC9pcnEuYwppbmRleCAxMDJlNDczLi5iNmYzNjNkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5MzgvaXJxLmMKKysrIGIvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L2lycS5jCkBAIC04NywyNSArODcsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8YXNtL3R4NDkzOC9yYnR4NDkzOC5oPgogCi1zdGF0aWMgdW5zaWduZWQgaW50IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpOwogc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX21hc2tfYW5kX2Fjayh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19lbmQodW5zaWduZWQgaW50IGlycSk7Ci0KLURFRklORV9TUElOTE9DSyh0b3NoaWJhX3JidHg0OTM4X2lvY19sb2NrKTsKIAogI2RlZmluZSBUT1NISUJBX1JCVFg0OTM4X0lPQ19OQU1FICJSQlRYNDkzOC1JT0MiCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY190eXBlID0gewogCS50eXBlbmFtZSA9IFRPU0hJQkFfUkJUWDQ5MzhfSU9DX05BTUUsCi0JLnN0YXJ0dXAgPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2Nfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2Nfc2h1dGRvd24sCi0JLmVuYWJsZSA9IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19lbmFibGUsCi0JLmRpc2FibGUgPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZGlzYWJsZSwKLQkuYWNrID0gdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX21hc2tfYW5kX2FjaywKLQkuZW5kID0gdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2VuZCwKLQkuc2V0X2FmZmluaXR5ID0gTlVMTAorCS5hY2sgPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZGlzYWJsZSwKKwkubWFzayA9IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19kaXNhYmxlLAorCS5tYXNrX2FjayA9IHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19kaXNhYmxlLAorCS51bm1hc2sgPSB0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZW5hYmxlLAogfTsKIAogI2RlZmluZSBUT1NISUJBX1JCVFg0OTM4X0lPQ19JTlRSX0VOQUIgMHhiN2YwMjAwMApAQCAtMTQyLDc3ICsxMzMsMzYgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IFRPU0hJQkFfUkJUWDQ5MzhfSVJRX0lPQ19CRUc7Ci0JICAgICBpIDw9IFRPU0hJQkFfUkJUWDQ5MzhfSVJRX0lPQ19FTkQ7IGkrKykgewotCQlpcnFfZGVzY1tpXS5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWlycV9kZXNjW2ldLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjW2ldLmRlcHRoID0gMzsKLQkJaXJxX2Rlc2NbaV0uY2hpcCA9ICZ0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfdHlwZTsKLQl9CisJICAgICBpIDw9IFRPU0hJQkFfUkJUWDQ5MzhfSVJRX0lPQ19FTkQ7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZ0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfdHlwZSwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJc2V0dXBfaXJxKFJCVFg0OTM4X0lSUV9JT0NJTlQsCiAJCSAgJnRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19hY3Rpb24pOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50Ci10b3NoaWJhX3JidHg0OTM4X2lycV9pb2Nfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19lbmFibGUoaXJxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2Rpc2FibGUoaXJxKTsKLX0KLQogc3RhdGljIHZvaWQKIHRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19lbmFibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgdjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0b3NoaWJhX3JidHg0OTM4X2lvY19sb2NrLCBmbGFncyk7Ci0KIAl2ID0gVFg0OTM4X1JEMDgoVE9TSElCQV9SQlRYNDkzOF9JT0NfSU5UUl9FTkFCKTsKIAl2IHw9ICgxIDw8IChpcnEgLSBUT1NISUJBX1JCVFg0OTM4X0lSUV9JT0NfQkVHKSk7CiAJVFg0OTM4X1dSMDgoVE9TSElCQV9SQlRYNDkzOF9JT0NfSU5UUl9FTkFCLCB2KTsKIAltbWlvd2IoKTsKIAlUWDQ5MzhfUkQwOChUT1NISUJBX1JCVFg0OTM4X0lPQ19JTlRSX0VOQUIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG9zaGliYV9yYnR4NDkzOF9pb2NfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZAogdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgdjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0b3NoaWJhX3JidHg0OTM4X2lvY19sb2NrLCBmbGFncyk7Ci0KIAl2ID0gVFg0OTM4X1JEMDgoVE9TSElCQV9SQlRYNDkzOF9JT0NfSU5UUl9FTkFCKTsKIAl2ICY9IH4oMSA8PCAoaXJxIC0gVE9TSElCQV9SQlRYNDkzOF9JUlFfSU9DX0JFRykpOwogCVRYNDkzOF9XUjA4KFRPU0hJQkFfUkJUWDQ5MzhfSU9DX0lOVFJfRU5BQiwgdik7CiAJbW1pb3diKCk7CiAJVFg0OTM4X1JEMDgoVE9TSElCQV9SQlRYNDkzOF9JT0NfSU5UUl9FTkFCKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRvc2hpYmFfcmJ0eDQ5MzhfaW9jX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLXRvc2hpYmFfcmJ0eDQ5MzhfaXJxX2lvY19tYXNrX2FuZF9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQl0b3NoaWJhX3JidHg0OTM4X2lycV9pb2NfZGlzYWJsZShpcnEpOwotfQotCi1zdGF0aWMgdm9pZAotdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTKSkpIHsKLQkJdG9zaGliYV9yYnR4NDkzOF9pcnFfaW9jX2VuYWJsZShpcnEpOwotCX0KIH0KIAogZXh0ZXJuIHZvaWQgX19pbml0IHR4eDlfc3BpX2lycWluaXQoaW50IGlyY19pcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3R4NDkzOC90b3NoaWJhX3JidHg0OTM4L3NwaV90eHg5LmMgYi9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5Mzgvc3BpX3R4eDkuYwppbmRleCBiOTI2ZTZhLi4wOGIyMGNkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5Mzgvc3BpX3R4eDkuYworKysgYi9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5Mzgvc3BpX3R4eDkuYwpAQCAtMzYsMTQgKzM2LDE4IEBACiAKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh0eHg5X3NwaV93YWl0KTsKIAotc3RhdGljIHZvaWQgdHh4OV9zcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyBpcnFyZXR1cm5fdCB0eHg5X3NwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCS8qIGRpc2FibGUgcnggaW50ciAqLwogCXR4NDkzOF9zcGlwdHItPmNyMCAmPSB+VFh4OV9TUENSMF9SQlNJRTsKIAl3YWtlX3VwKCZ0eHg5X3NwaV93YWl0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKIH0KKwogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gdHh4OV9zcGlfYWN0aW9uID0gewotCXR4eDlfc3BpX2ludGVycnVwdCwgMCwgMCwgInNwaSIsIE5VTEwsIE5VTEwsCisJLmhhbmRsZXIJPSB0eHg5X3NwaV9pbnRlcnJ1cHQsCisJLm5hbWUJCT0gInNwaSIsCiB9OwogCiB2b2lkIF9faW5pdCB0eHg5X3NwaV9pcnFpbml0KGludCBpcmNfaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9jb21tb24vaWN1LmMgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pY3UuYwppbmRleCBjMjE1YzBkLi5jMDc1MjYxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pY3UuYworKysgYi9hcmNoL21pcHMvdnI0MXh4L2NvbW1vbi9pY3UuYwpAQCAtNDE3LDE0ICs0MTcsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHZyNDF4eF9kaXNhYmxlX2JjdWludCk7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9zeXNpbnQxX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWljdTFfc2V0KE1TWVNJTlQxUkVHLCAxIDw8IFNZU0lOVDFfSVJRX1RPX1BJTihpcnEpKTsKLQotCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCi19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX3N5c2ludDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBkaXNhYmxlX3N5c2ludDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWN1MV9jbGVhcihNU1lTSU5UMVJFRywgMSA8PCBTWVNJTlQxX0lSUV9UT19QSU4oaXJxKSk7CiB9CkBAIC00MzQsMzMgKzQyNywxNSBAQAogCWljdTFfc2V0KE1TWVNJTlQxUkVHLCAxIDw8IFNZU0lOVDFfSVJRX1RPX1BJTihpcnEpKTsKIH0KIAotI2RlZmluZSBkaXNhYmxlX3N5c2ludDFfaXJxCXNodXRkb3duX3N5c2ludDFfaXJxCi0jZGVmaW5lIGFja19zeXNpbnQxX2lycQkJc2h1dGRvd25fc3lzaW50MV9pcnEKLQotc3RhdGljIHZvaWQgZW5kX3N5c2ludDFfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJaWN1MV9zZXQoTVNZU0lOVDFSRUcsIDEgPDwgU1lTSU5UMV9JUlFfVE9fUElOKGlycSkpOwotfQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN5c2ludDFfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gIlNZU0lOVDEiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9zeXNpbnQxX2lycSwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9zeXNpbnQxX2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9zeXNpbnQxX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfc3lzaW50MV9pcnEsCi0JLmFjawkJPSBhY2tfc3lzaW50MV9pcnEsCi0JLmVuZAkJPSBlbmRfc3lzaW50MV9pcnEsCisJLmFjawkJPSBkaXNhYmxlX3N5c2ludDFfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfc3lzaW50MV9pcnEsCisJLm1hc2tfYWNrCT0gZGlzYWJsZV9zeXNpbnQxX2lycSwKKwkudW5tYXNrCQk9IGVuYWJsZV9zeXNpbnQxX2lycSwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9zeXNpbnQyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWljdTJfc2V0KE1TWVNJTlQyUkVHLCAxIDw8IFNZU0lOVDJfSVJRX1RPX1BJTihpcnEpKTsKLQotCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCi19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX3N5c2ludDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBkaXNhYmxlX3N5c2ludDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJaWN1Ml9jbGVhcihNU1lTSU5UMlJFRywgMSA8PCBTWVNJTlQyX0lSUV9UT19QSU4oaXJxKSk7CiB9CkBAIC00NzAsMjMgKzQ0NSwxMiBAQAogCWljdTJfc2V0KE1TWVNJTlQyUkVHLCAxIDw8IFNZU0lOVDJfSVJRX1RPX1BJTihpcnEpKTsKIH0KIAotI2RlZmluZSBkaXNhYmxlX3N5c2ludDJfaXJxCXNodXRkb3duX3N5c2ludDJfaXJxCi0jZGVmaW5lIGFja19zeXNpbnQyX2lycQkJc2h1dGRvd25fc3lzaW50Ml9pcnEKLQotc3RhdGljIHZvaWQgZW5kX3N5c2ludDJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJaWN1Ml9zZXQoTVNZU0lOVDJSRUcsIDEgPDwgU1lTSU5UMl9JUlFfVE9fUElOKGlycSkpOwotfQotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN5c2ludDJfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gIlNZU0lOVDIiLAotCS5zdGFydHVwCT0gc3RhcnR1cF9zeXNpbnQyX2lycSwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9zeXNpbnQyX2lycSwKLQkuZW5hYmxlCQk9IGVuYWJsZV9zeXNpbnQyX2lycSwKLQkuZGlzYWJsZQk9IGRpc2FibGVfc3lzaW50Ml9pcnEsCi0JLmFjawkJPSBhY2tfc3lzaW50Ml9pcnEsCi0JLmVuZAkJPSBlbmRfc3lzaW50Ml9pcnEsCisJLmFjawkJPSBkaXNhYmxlX3N5c2ludDJfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfc3lzaW50Ml9pcnEsCisJLm1hc2tfYWNrCT0gZGlzYWJsZV9zeXNpbnQyX2lycSwKKwkudW5tYXNrCQk9IGVuYWJsZV9zeXNpbnQyX2lycSwKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNldF9zeXNpbnQxX2Fzc2lnbih1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBjaGFyIGFzc2lnbikKQEAgLTcyMywxMCArNjg3LDEyIEBACiAJaWN1Ml93cml0ZShNR0lVSU5USFJFRywgMHhmZmZmKTsKIAogCWZvciAoaSA9IFNZU0lOVDFfSVJRX0JBU0U7IGkgPD0gU1lTSU5UMV9JUlFfTEFTVDsgaSsrKQotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnN5c2ludDFfaXJxX3R5cGU7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmc3lzaW50MV9pcnFfdHlwZSwKKwkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwogCiAJZm9yIChpID0gU1lTSU5UMl9JUlFfQkFTRTsgaSA8PSBTWVNJTlQyX0lSUV9MQVNUOyBpKyspCi0JCWlycV9kZXNjW2ldLmNoaXAgPSAmc3lzaW50Ml9pcnFfdHlwZTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZzeXNpbnQyX2lycV90eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CiAKIAljYXNjYWRlX2lycShJTlQwX0lSUSwgaWN1X2dldF9pcnEpOwogCWNhc2NhZGVfaXJxKElOVDFfSVJRLCBpY3VfZ2V0X2lycSk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvdnI0MXh4L25lYy1jbWJ2cjQxMzMvaXJxLmMgYi9hcmNoL21pcHMvdnI0MXh4L25lYy1jbWJ2cjQxMzMvaXJxLmMKaW5kZXggMjQ4MzQ4Ny4uMTI4ZWQ4ZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3ZyNDF4eC9uZWMtY21idnI0MTMzL2lycS5jCisrKyBiL2FyY2gvbWlwcy92cjQxeHgvbmVjLWNtYnZyNDEzMy9pcnEuYwpAQCAtMzAsMTcgKzMwLDYgQEAKIAogZXh0ZXJuIGludCB2cjQxMzNfcm9ja2hvcHBlcjsKIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2k4MjU5X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV84MjU5QV9pcnEoaXJxIC0gSTgyNTlfSVJRX0JBU0UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9pODI1OV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlXzgyNTlBX2lycShpcnEgLSBJODI1OV9JUlFfQkFTRSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGVuYWJsZV9pODI1OV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAllbmFibGVfODI1OUFfaXJxKGlycSAtIEk4MjU5X0lSUV9CQVNFKTsKQEAgLTU2LDIwICs0NSwxMiBAQAogCW1hc2tfYW5kX2Fja184MjU5QShpcnEgLSBJODI1OV9JUlFfQkFTRSk7CiB9CiAKLXN0YXRpYyB2b2lkIGVuZF9pODI1OV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLQkJZW5hYmxlXzgyNTlBX2lycShpcnEgLSBJODI1OV9JUlFfQkFTRSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaTgyNTlfaXJxX3R5cGUgPSB7CiAJLnR5cGVuYW1lICAgICAgID0gIlhULVBJQyIsCi0JLnN0YXJ0dXAgICAgICAgID0gc3RhcnR1cF9pODI1OV9pcnEsCi0JLnNodXRkb3duICAgICAgID0gc2h1dGRvd25faTgyNTlfaXJxLAotCS5lbmFibGUgICAgICAgICA9IGVuYWJsZV9pODI1OV9pcnEsCi0JLmRpc2FibGUgICAgICAgID0gZGlzYWJsZV9pODI1OV9pcnEsCiAJLmFjayAgICAgICAgICAgID0gYWNrX2k4MjU5X2lycSwKLQkuZW5kICAgICAgICAgICAgPSBlbmRfaTgyNTlfaXJxLAorCS5tYXNrCQk9IGRpc2FibGVfaTgyNTlfaXJxLAorCS5tYXNrX2Fjawk9IGFja19pODI1OV9pcnEsCisJLnVubWFzawkJPSBlbmFibGVfaTgyNTlfaXJxLAogfTsKIAogc3RhdGljIGludCBpODI1OV9nZXRfaXJxX251bWJlcihpbnQgaXJxKQpAQCAtMTA0LDcgKzg1LDcgQEAKIAl9CiAKIAlmb3IgKGkgPSBJODI1OV9JUlFfQkFTRTsgaSA8PSBJODI1OV9JUlFfTEFTVDsgaSsrKQotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmk4MjU5X2lycV90eXBlOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmk4MjU5X2lycV90eXBlLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCXNldHVwX2lycShJODI1OV9TTEFWRV9JUlEsICZpODI1OV9zbGF2ZV9jYXNjYWRlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvS2NvbmZpZyBiL2FyY2gvcGFyaXNjL0tjb25maWcKaW5kZXggZDIxMDEyMy4uMGY5ZmY2MSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvS2NvbmZpZworKysgYi9hcmNoL3BhcmlzYy9LY29uZmlnCkBAIC0yNSw2ICsyNSwxNCBAQAogY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCiAJYm9vbAogCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaHB1eC9zeXNfaHB1eC5jIGIvYXJjaC9wYXJpc2MvaHB1eC9zeXNfaHB1eC5jCmluZGV4IDJlMmRjNGYuLjA0YzJmZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2hwdXgvc3lzX2hwdXguYworKysgYi9hcmNoL3BhcmlzYy9ocHV4L3N5c19ocHV4LmMKQEAgLTIzNyw3ICsyMzcsNyBAQAogCWZpbGUgPSBmZ2V0KGZkKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0OwotCWVycm9yID0gdmZzX3N0YXRmc19ocHV4KGZpbGUtPmZfZGVudHJ5LCAmdG1wKTsKKwllcnJvciA9IHZmc19zdGF0ZnNfaHB1eChmaWxlLT5mX3BhdGguZGVudHJ5LCAmdG1wKTsKIAlpZiAoIWVycm9yICYmIGNvcHlfdG9fdXNlcihidWYsICZ0bXAsIHNpemVvZih0bXApKSkKIAkJZXJyb3IgPSAtRUZBVUxUOwogCWZwdXQoZmlsZSk7CkBAIC00NzUsNyArNDc1LDcgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgImxlbiBvZiBhcmcxID0gJWRcbiIsIGxlbik7CiAJCWlmIChsZW4gPT0gMCkKIAkJCXJldHVybiAwOwotCQlmc25hbWUgPSAoY2hhciAqKSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWZzbmFtZSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCAhZnNuYW1lICkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgImZhaWxlZCB0byBrbWFsbG9jIGZzbmFtZVxuIik7CiAJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9iaW5mbXRfZWxmMzIuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9iaW5mbXRfZWxmMzIuYwppbmRleCAxZTY0ZTdiLi5lY2IxMGE0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2JpbmZtdF9lbGYzMi5jCkBAIC03NSw3ICs3NSw2IEBACiAJY2hhcglwcl9wc2FyZ3NbRUxGX1BSQVJHU1pdOwkvKiBpbml0aWFsIHBhcnQgb2YgYXJnIGxpc3QgKi8KIH07CiAKLSNkZWZpbmUgZWxmX2FkZHJfdAl1bnNpZ25lZCBpbnQKICNkZWZpbmUgaW5pdF9lbGZfYmluZm10IGluaXRfZWxmMzJfYmluZm10CiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNICAoIlBBUklTQzMyXDAiKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jCmluZGV4IDkyMGJkYmYuLmMxMGFiNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMKQEAgLTM0Myw3ICszNDMsNyBAQAogCXN0cnVjdCBwdF9yZWdzICpyID0gJnQtPnRocmVhZC5yZWdzOwogCXN0cnVjdCBwdF9yZWdzICpyMjsKIAotCXIyID0gKHN0cnVjdCBwdF9yZWdzICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHB0X3JlZ3MpLCBHRlBfS0VSTkVMKTsKKwlyMiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyMikKIAkJcmV0dXJuOwogCSpyMiA9ICpyOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBiMzY3N2ZjLi43Yjk0M2I0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTUzLDEzICsxNTMsNyBAQAogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkgCi0JKiguaW5pdGNhbGwyLmluaXQpIAotCSooLmluaXRjYWxsMy5pbml0KSAKLQkqKC5pbml0Y2FsbDQuaW5pdCkgCi0JKiguaW5pdGNhbGw1LmluaXQpIAotCSooLmluaXRjYWxsNi5pbml0KSAKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2xpYi9jaGVja3N1bS5jIGIvYXJjaC9wYXJpc2MvbGliL2NoZWNrc3VtLmMKaW5kZXggOGExZTA4MC4uNDYyNjk2ZCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9wYXJpc2MvbGliL2NoZWNrc3VtLmMKQEAgLTEwMSwxMSArMTAxLDE0IEBACiAvKgogICogY29tcHV0ZXMgYSBwYXJ0aWFsIGNoZWNrc3VtLCBlLmcuIGZvciBUQ1AvVURQIGZyYWdtZW50cwogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pCisvKgorICogd2h5IGJvdGhlciBmb2xkaW5nPworICovCitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IHJlc3VsdCA9IGRvX2NzdW0oYnVmZiwgbGVuKTsKIAlhZGRjKHJlc3VsdCwgc3VtKTsKLQlyZXR1cm4gZnJvbTMydG8xNihyZXN1bHQpOworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pZnJvbTMydG8xNihyZXN1bHQpOwogfQogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CkBAIC0xMTMsOCArMTE2LDggQEAKIC8qCiAgKiBjb3B5IHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCSAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJLyoKIAkgKiBJdCdzIDI6MzAgYW0gYW5kIEkgZG9uJ3QgZmVlbCBsaWtlIGRvaW5nIGl0IHJlYWwgLi4uCkBAIC0xMzEsOSArMTM0LDkgQEAKICAqIENvcHkgZnJvbSB1c2Vyc3BhY2UgYW5kIGNvbXB1dGUgY2hlY2tzdW0uICBJZiB3ZSBjYXRjaCBhbiBleGNlcHRpb24KICAqIHRoZW4gemVybyB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLgogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JCQkJCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCQkJdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLAorCQkJCQl2b2lkICpkc3QsIGludCBsZW4sCisJCQkJCV9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKIAlpbnQgbWlzc2luZzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbW0vZmF1bHQuYyBiL2FyY2gvcGFyaXNjL21tL2ZhdWx0LmMKaW5kZXggNjQ3ODVlNC4uNjQxZjljOSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvbW0vZmF1bHQuYworKysgYi9hcmNoL3BhcmlzYy9tbS9mYXVsdC5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpmaXg7CiAJdW5zaWduZWQgbG9uZyBhY2NfdHlwZTsKIAotCWlmIChpbl9pbnRlcnJ1cHQoKSB8fCAhbW0pCisJaWYgKGluX2F0b21pYygpIHx8ICFtbSkKIAkJZ290byBub19jb250ZXh0OwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbW0vaW9yZW1hcC5jIGIvYXJjaC9wYXJpc2MvbW0vaW9yZW1hcC5jCmluZGV4IDQ3YTFkMmEuLjQ0YjQyYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL21tL2lvcmVtYXAuYworKysgYi9hcmNoL3BhcmlzYy9tbS9pb3JlbWFwLmMKQEAgLTksMTEwICs5LDggQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLQotc3RhdGljIGlubGluZSB2b2lkIAotcmVtYXBfYXJlYV9wdGUocHRlX3QgKnB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXVuc2lnbmVkIGxvbmcgZW5kLCBwZm47Ci0JcGdwcm90X3QgcGdwcm90ID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfRElSVFkgfAotCQkJCSAgIF9QQUdFX0FDQ0VTU0VEIHwgZmxhZ3MpOwotCi0JYWRkcmVzcyAmPSB+UE1EX01BU0s7Ci0KLQllbmQgPSBhZGRyZXNzICsgc2l6ZTsKLQlpZiAoZW5kID4gUE1EX1NJWkUpCi0JCWVuZCA9IFBNRF9TSVpFOwotCi0JQlVHX09OKGFkZHJlc3MgPj0gZW5kKTsKLQotCXBmbiA9IHBoeXNfYWRkciA+PiBQQUdFX1NISUZUOwotCWRvIHsKLQkJQlVHX09OKCFwdGVfbm9uZSgqcHRlKSk7Ci0KLQkJc2V0X3B0ZShwdGUsIHBmbl9wdGUocGZuLCBwZ3Byb3QpKTsKLQotCQlhZGRyZXNzICs9IFBBR0VfU0laRTsKLQkJcGZuKys7Ci0JCXB0ZSsrOwotCX0gd2hpbGUgKGFkZHJlc3MgJiYgKGFkZHJlc3MgPCBlbmQpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgCi1yZW1hcF9hcmVhX3BtZChwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkgICAgICAgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyBlbmQ7Ci0KLQlhZGRyZXNzICY9IH5QR0RJUl9NQVNLOwotCi0JZW5kID0gYWRkcmVzcyArIHNpemU7Ci0JaWYgKGVuZCA+IFBHRElSX1NJWkUpCi0JCWVuZCA9IFBHRElSX1NJWkU7Ci0KLQlCVUdfT04oYWRkcmVzcyA+PSBlbmQpOwotCi0JcGh5c19hZGRyIC09IGFkZHJlc3M7Ci0JZG8gewotCQlwdGVfdCAqcHRlID0gcHRlX2FsbG9jX2tlcm5lbChwbWQsIGFkZHJlc3MpOwotCQlpZiAoIXB0ZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCXJlbWFwX2FyZWFfcHRlKHB0ZSwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywgCi0JCQkgICAgICAgYWRkcmVzcyArIHBoeXNfYWRkciwgZmxhZ3MpOwotCi0JCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBNRF9TSVpFKSAmIFBNRF9NQVNLOwotCQlwbWQrKzsKLQl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCAKLXJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKLQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlwZ2RfdCAqZGlyOwotCWludCBlcnJvciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyZXNzICsgc2l6ZTsKLQotCUJVR19PTihhZGRyZXNzID49IGVuZCk7Ci0KLQlwaHlzX2FkZHIgLT0gYWRkcmVzczsKLQlkaXIgPSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcyk7Ci0KLQlmbHVzaF9jYWNoZV9hbGwoKTsKLQotCWRvIHsKLQkJcHVkX3QgKnB1ZDsKLQkJcG1kX3QgKnBtZDsKLQotCQllcnJvciA9IC1FTk9NRU07Ci0JCXB1ZCA9IHB1ZF9hbGxvYygmaW5pdF9tbSwgZGlyLCBhZGRyZXNzKTsKLQkJaWYgKCFwdWQpCi0JCQlicmVhazsKLQotCQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHB1ZCwgYWRkcmVzcyk7Ci0JCWlmICghcG1kKQotCQkJYnJlYWs7Ci0KLQkJaWYgKHJlbWFwX2FyZWFfcG1kKHBtZCwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywKLQkJCQkgICBwaHlzX2FkZHIgKyBhZGRyZXNzLCBmbGFncykpCi0JCQlicmVhazsKLQotCQllcnJvciA9IDA7Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBHRElSX1NJWkUpICYgUEdESVJfTUFTSzsKLQkJZGlyKys7Ci0JfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOwotCi0JZmx1c2hfdGxiX2FsbCgpOwotCi0JcmV0dXJuIGVycm9yOwotfQogCiAvKgogICogR2VuZXJpYyBtYXBwaW5nIGZ1bmN0aW9uIChub3QgdmlzaWJsZSBvdXRzaWRlKToKQEAgLTEzMSw2ICsyOSw3IEBACiAJdm9pZCAqYWRkcjsKIAlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsYXN0X2FkZHI7CisJcGdwcm90X3QgcGdwcm90OwogCiAjaWZkZWYgQ09ORklHX0VJU0EKIAl1bnNpZ25lZCBsb25nIGVuZCA9IHBoeXNfYWRkciArIHNpemUgLSAxOwpAQCAtMTY0LDYgKzYzLDkgQEAKIAkJfQogCX0KIAorCXBncHJvdCA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IF9QQUdFX0RJUlRZIHwKKwkJCSAgX1BBR0VfQUNDRVNTRUQgfCBmbGFncyk7CisKIAkvKgogCSAqIE1hcHBpbmdzIGhhdmUgdG8gYmUgcGFnZS1hbGlnbmVkCiAJICovCkBAIC0xNzksNyArODEsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWFkZHIgPSBhcmVhLT5hZGRyOwotCWlmIChyZW1hcF9hcmVhX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBhZGRyLCBwaHlzX2FkZHIsIHNpemUsIGZsYWdzKSkgeworCWlmIChpb3JlbWFwX3BhZ2VfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYWRkciwgKHVuc2lnbmVkIGxvbmcpYWRkciArIHNpemUsCisJCQkgICAgICAgcGh5c19hZGRyLCBwZ3Byb3QpKSB7CiAJCXZmcmVlKGFkZHIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvLmdpdGlnbm9yZSBiL2FyY2gvcG93ZXJwYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTg2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitpbmNsdWRlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDhiNjkxMDQuLjg2OTlkYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC00MSw2ICs0MSwxNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IHkgaWYgNjRCSVQKKwogY29uZmlnIEdFTkVSSUNfSFdFSUdIVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTk5LDYgKzEwNywxMSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEdFTkVSSUNfQlVHCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQlVHCisKIGNvbmZpZyBERUZBVUxUX1VJTUFHRQogCWJvb2wKIAloZWxwCkBAIC0xMTIsNyArMTI1LDcgQEAKIAlkZWZhdWx0IDZ4eAogCiBjb25maWcgQ0xBU1NJQzMyCi0JYm9vbCAiNnh4Lzd4eC83NHh4IgorCWJvb2wgIjUyeHgvNnh4Lzd4eC83NHh4IgogCXNlbGVjdCBQUENfRlBVCiAJc2VsZWN0IDZ4eAogCWhlbHAKQEAgLTEyMSwxNiArMTM0LDE4IEBACiAJICB2ZXJzaW9ucyAoODIxLCA4MjMsIDg1MCwgODU1LCA4NjAsIDUyeHgsIDgyeHgsIDgzeHgpLCB0aGUgQU1DQwogCSAgZW1iZWRkZWQgdmVyc2lvbnMgKDQwMyBhbmQgNDA1KSBhbmQgdGhlIGhpZ2ggZW5kIDY0IGJpdCBQb3dlcgogCSAgcHJvY2Vzc29ycyAoUE9XRVIgMywgUE9XRVI0LCBhbmQgSUJNIFBQQzk3MCBhbHNvIGtub3duIGFzIEc1KS4KKworCSAgVGhpcyBvcHRpb24gaXMgdGhlIGNhdGNoLWFsbCBmb3IgNnh4IHR5cGVzLCBpbmNsdWRpbmcgc29tZSBvZiB0aGUKKwkgIGVtYmVkZGVkIHZlcnNpb25zLiAgVW5sZXNzIHRoZXJlIGlzIHNlZSBhbiBvcHRpb24gZm9yIHRoZSBzcGVjaWZpYworCSAgY2hpcCBmYW1pbHkgeW91IGFyZSB1c2luZywgeW91IHdhbnQgdGhpcyBvcHRpb24uCiAJICAKLQkgIFVubGVzcyB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBvbmUgb2YgdGhlIGVtYmVkZGVkIHByb2Nlc3NvcgotCSAgc3lzdGVtcywgNjQgYml0IElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgorCSAgWW91IGRvIG5vdCB3YW50IHRoaXMgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSA2NCBiaXQKKwkgIElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgorCSAgCisJICBJZiB1bnN1cmUsIHNlbGVjdCB0aGlzIG9wdGlvbgorCSAgCiAJICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBydW5zIGluIDMyLWJpdCBtb2RlIGV2ZW4gb24gNjQtYml0IGNoaXBzLgogCi1jb25maWcgUFBDXzUyeHgKLQlib29sICJGcmVlc2NhbGUgNTJ4eCIKLQlzZWxlY3QgNnh4Ci0Jc2VsZWN0IFBQQ19GUFUKLQkKIGNvbmZpZyBQUENfODJ4eAogCWJvb2wgIkZyZWVzY2FsZSA4Mnh4IgogCXNlbGVjdCA2eHgKQEAgLTE2MCw5ICsxNzUsMTEgQEAKIAogY29uZmlnIDQweAogCWJvb2wgIkFNQ0MgNDB4IgorCXNlbGVjdCBQUENfRENSX05BVElWRQogCiBjb25maWcgNDR4CiAJYm9vbCAiQU1DQyA0NHgiCisJc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCiAKIGNvbmZpZyA4eHgKIAlib29sICJGcmVlc2NhbGUgOHh4IgpAQCAtMjA4LDYgKzIyNSwyNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkgaWYgUFBDNjQKIAorY29uZmlnIFBQQ19EQ1JfTkFUSVZFCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgUFBDX0RDUl9NTUlPCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgUFBDX0RDUgorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ19EQ1JfTkFUSVZFIHx8IFBQQ19EQ1JfTU1JTworCWRlZmF1bHQgeQorCitjb25maWcgUFBDX09GX1BMQVRGT1JNX1BDSQorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQzY0ICMgbm90IHN1cHBvcnRlZCBvbiAzMiBiaXRzIHlldAorCWRlZmF1bHQgbgorCiBjb25maWcgQk9PS0UKIAlib29sCiAJZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAKQEAgLTIyNyw2ICsyNjIsNyBAQAogY29uZmlnIFBIWVNfNjRCSVQKIAlib29sICdMYXJnZSBwaHlzaWNhbCBhZGRyZXNzIHN1cHBvcnQnIGlmIEU1MDAKIAlkZXBlbmRzIG9uIDQ0eCB8fCBFNTAwCisJc2VsZWN0IFJFU09VUkNFU182NEJJVAogCWRlZmF1bHQgeSBpZiA0NHgKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciBsYXJnZXIgdGhhbiAzMi1iaXQgcGh5c2ljYWwKQEAgLTM2OSwxMSArNDA1LDEzIEBACiAJc2VsZWN0IFBQQ19SVEFTCiAJc2VsZWN0IFJUQVNfRVJST1JfTE9HR0lORwogCXNlbGVjdCBQUENfVURCR18xNjU1MAorCXNlbGVjdCBQUENfTkFUSVZFCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBQUENfSVNFUklFUwogCWJvb2wgIklCTSBMZWdhY3kgaVNlcmllcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0CisJc2VsZWN0IFBQQ19JTkRJUkVDVF9JTwogCiBjb25maWcgUFBDX0NIUlAKIAlib29sICJDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtIChDSFJQKSBiYXNlZCBtYWNoaW5lcyIKQEAgLTM4NCwxNCArNDIyLDM1IEBACiAJc2VsZWN0IFBQQ19SVEFTCiAJc2VsZWN0IFBQQ19NUEMxMDYKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKKwlzZWxlY3QgUFBDX05BVElWRQogCWRlZmF1bHQgeQogCitjb25maWcgUFBDX01QQzUyeHgKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBQUENfRUZJS0EKKwlib29sICJiUGxhbiBFZmlrYSA1azIuIE1QQzUyMDBCIGJhc2VkIGNvbXB1dGVyIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIKKwlzZWxlY3QgUFBDX1JUQVMKKwlzZWxlY3QgUlRBU19QUk9DCisJc2VsZWN0IFBQQ19NUEM1Mnh4CisJc2VsZWN0IFBQQ19OQVRJVkUKKwlkZWZhdWx0IHkKKworY29uZmlnIFBQQ19MSVRFNTIwMAorCWJvb2wgIkZyZWVzY2FsZSBMaXRlNTIwMCBFdmFsIEJvYXJkIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIKKwlzZWxlY3QgUFBDX01QQzUyeHgKKwlkZWZhdWx0IG4KKwogY29uZmlnIFBQQ19QTUFDCiAJYm9vbCAiQXBwbGUgUG93ZXJNYWMgYmFzZWQgbWFjaGluZXMiCiAJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STQogCXNlbGVjdCBNUElDCiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kgaWYgUFBDMzIKIAlzZWxlY3QgUFBDX01QQzEwNiBpZiBQUEMzMgorCXNlbGVjdCBQUENfTkFUSVZFCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBQUENfUE1BQzY0CkBAIC00MTEsNiArNDcwLDcgQEAKIAlzZWxlY3QgUFBDX0k4MjU5CiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKKwlzZWxlY3QgUFBDX05BVElWRQogCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX01BUExFCkBAIC00MjIsMTAgKzQ4MiwxMiBAQAogCXNlbGVjdCBHRU5FUklDX1RCU1lOQwogCXNlbGVjdCBQUENfVURCR18xNjU1MAogCXNlbGVjdCBQUENfOTcwX05BUAorCXNlbGVjdCBQUENfTkFUSVZFCisJc2VsZWN0IFBQQ19SVEFTCiAJZGVmYXVsdCBuCiAJaGVscAogICAgICAgICAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcGxlIDk3MEZYIEV2YWx1YXRpb24gQm9hcmQuCi0JICBGb3IgbW9yZSBpbmZvcm1hdGlvbnMsIHJlZmVyIHRvIDxodHRwOi8vd3d3Ljk3MGV2YWwuY29tPgorCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIDxodHRwOi8vd3d3Ljk3MGV2YWwuY29tPgogCiBjb25maWcgUFBDX1BBU0VNSQogCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKQEAgLTQzNCw2ICs0OTYsNyBAQAogCXNlbGVjdCBNUElDCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IEdFTkVSSUNfVEJTWU5DCisJc2VsZWN0IFBQQ19OQVRJVkUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFBBIFNlbWkncyBQV1JmaWNpZW50IGxpbmUKIAkgIG9mIFNvQyBwcm9jZXNzb3JzLCBpbmNsdWRpbmcgUEE2VC0xNjgyTQpAQCAtNDQ1LDYgKzUwOCwxMSBAQAogY29uZmlnIFBQQ19DRUxMX05BVElWRQogCWJvb2wKIAlzZWxlY3QgUFBDX0NFTEwKKwlzZWxlY3QgUFBDX0RDUl9NTUlPCisJc2VsZWN0IFBQQ19PRl9QTEFURk9STV9QQ0kKKwlzZWxlY3QgUFBDX0lORElSRUNUX0lPCisJc2VsZWN0IFBQQ19OQVRJVkUKKwlzZWxlY3QgTVBJQwogCWRlZmF1bHQgbgogCiBjb25maWcgUFBDX0lCTV9DRUxMX0JMQURFCkBAIC00NTYsNiArNTI0LDIyIEBACiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFVEQkdfUlRBU19DT05TT0xFCiAKK2NvbmZpZyBQUENfUFMzCisJYm9vbCAiU29ueSBQUzMiCisJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NAorCXNlbGVjdCBQUENfQ0VMTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFNvbnkgUFMzIGdhbWUgY29uc29sZQorCSAgYW5kIG90aGVyIHBsYXRmb3JtcyB1c2luZyB0aGUgUFMzIGh5cGVydmlzb3IuCisKK2NvbmZpZyBQUENfTkFUSVZFCisJYm9vbAorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0KKwloZWxwCisJICBTdXBwb3J0IGZvciBydW5uaW5nIG5hdGl2ZWx5IG9uIHRoZSBoYXJkd2FyZSwgaS5lLiB3aXRob3V0CisJICBhIGh5cGVydmlzb3IuIFRoaXMgb3B0aW9uIGlzIG5vdCB1c2VyLXNlbGVjdGFibGUgYnV0IHNob3VsZAorCSAgYmUgc2VsZWN0ZWQgYnkgYWxsIHBsYXRmb3JtcyB0aGF0IG5lZWQgaXQuCisKIGNvbmZpZyBVREJHX1JUQVNfQ09OU09MRQogCWJvb2wgIlJUQVMgYmFzZWQgZGVidWcgY29uc29sZSIKIAlkZXBlbmRzIG9uIFBQQ19SVEFTCkBAIC01MTcsNiArNjAxLDE1IEBACiAJYm9vbAogCWRlZmF1bHQgbgogCitjb25maWcgUFBDX0lORElSRUNUX0lPCisJYm9vbAorCXNlbGVjdCBHRU5FUklDX0lPTUFQCisJZGVmYXVsdCBuCisKK2NvbmZpZyBHRU5FUklDX0lPTUFQCisJYm9vbAorCWRlZmF1bHQgbgorCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCiBjb25maWcgQ1BVX0ZSRVFfUE1BQwpAQCAtNTk0LDEyICs2ODcsNiBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KIAotY29uZmlnIFBQQ19UT0RDCi0JZGVwZW5kcyBvbiBFTUJFRERFRDZ4eAotCWJvb2wgIkdlbmVyaWMgVGltZS1vZi1kYXkgQ2xvY2sgKFRPREMpIHN1cHBvcnQiCi0JLS0taGVscC0tLQotCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIG1hbnkgVE9EQy9SVEMgY2hpcHMuCi0KIGVuZG1lbnUKIAogc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwpAQCAtNjEwLDYgKzY5Nyw3IEBACiBzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKIHNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9LY29uZmlnCiBzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcKK3NvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCiAKIG1lbnUgIktlcm5lbCBvcHRpb25zIgogCkBAIC02MzIsNyArNzIwLDcgQEAKIAogY29uZmlnIE1BVEhfRU1VTEFUSU9OCiAJYm9vbCAiTWF0aCBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiA0eHggfHwgOHh4IHx8IEUyMDAgfHwgRTUwMAorCWRlcGVuZHMgb24gNHh4IHx8IDh4eCB8fCBFMjAwIHx8IFBQQ184M3h4IHx8IEU1MDAKIAktLS1oZWxwLS0tCiAJICBTb21lIFBvd2VyUEMgY2hpcHMgZGVzaWduZWQgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBkbyBub3QgaGF2ZQogCSAgYSBmbG9hdGluZy1wb2ludCB1bml0IGFuZCB0aGVyZWZvcmUgZG8gbm90IGltcGxlbWVudCB0aGUKQEAgLTc0MCw3ICs4MjgsNyBAQAogCiBjb25maWcgQVJDSF9TUEFSU0VNRU1fREVGQVVMVAogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFNNUCAmJiBQUENfUFNFUklFUworCWRlcGVuZHMgb24gKFNNUCAmJiBQUENfUFNFUklFUykgfHwgUFBDX0NFTEwKIAogY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCiAJZGVmX2Jvb2wgeQpAQCAtNzUxLDYgKzgzOSwxNSBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIE1FTU9SWV9IT1RQTFVHCiAKKyMgU29tZSBOVU1BIG5vZGVzIGhhdmUgbWVtb3J5IHJhbmdlcyB0aGF0IHNwYW4KKyMgb3RoZXIgbm9kZXMuICBFdmVuIHRob3VnaCBhIHBmbiBpcyB2YWxpZCBhbmQKKyMgYmV0d2VlbiBhIG5vZGUncyBzdGFydCBhbmQgZW5kIHBmbnMsIGl0IG1heSBub3QKKyMgcmVzaWRlIG9uIHRoYXQgbm9kZS4gIFNlZSBtZW1tYXBfaW5pdF96b25lKCkKKyMgZm9yIGRldGFpbHMuCitjb25maWcgTk9ERVNfU1BBTl9PVEhFUl9OT0RFUworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKKwogY29uZmlnIFBQQ182NEtfUEFHRVMKIAlib29sICI2NGsgcGFnZSBzaXplIgogCWRlcGVuZHMgb24gUFBDNjQKQEAgLTc4MSw3ICs4NzgsNiBAQAogCiBjb25maWcgQ01ETElORV9CT09MCiAJYm9vbCAiRGVmYXVsdCBib290bG9hZGVyIGtlcm5lbCBhcmd1bWVudHMiCi0JZGVwZW5kcyBvbiAhUFBDX0lTRVJJRVMKIAogY29uZmlnIENNRExJTkUKIAlzdHJpbmcgIkluaXRpYWwga2VybmVsIGNvbW1hbmQgc3RyaW5nIgpAQCAtODcxLDcgKzk2Nyw3IEBACiAKIGNvbmZpZyBQQ0kKIAlib29sICJQQ0kgc3VwcG9ydCIgaWYgNDB4IHx8IENQTTIgfHwgUFBDXzgzeHggfHwgUFBDXzg1eHggfHwgUFBDXzg2eHggXAotCQl8fCBQUENfTVBDNTJ4eCB8fCAoRU1CRURERUQgJiYgUFBDX0lTRVJJRVMpIHx8IE1QQzc0NDhIUEMyCisJCXx8IFBQQ19NUEM1Mnh4IHx8IChFTUJFRERFRCAmJiBQUENfSVNFUklFUykgfHwgTVBDNzQ0OEhQQzIgfHwgUFBDX1BTMwogCWRlZmF1bHQgeSBpZiAhNDB4ICYmICFDUE0yICYmICE4eHggJiYgIUFQVVMgJiYgIVBQQ184M3h4IFwKIAkJJiYgIVBQQ184NXh4ICYmICFQUENfODZ4eAogCWRlZmF1bHQgUENJX1BFUk1FRElBIGlmICE0eHggJiYgIUNQTTIgJiYgITh4eCAmJiBBUFVTCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCmluZGV4IDVhZDE0OWIuLmYwZTUxZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnCkBAIC03Nyw3ICs3Nyw3IEBACiAKIGNvbmZpZyBYTU9OCiAJYm9vbCAiSW5jbHVkZSB4bW9uIGtlcm5lbCBkZWJ1Z2dlciIKLQlkZXBlbmRzIG9uIERFQlVHR0VSICYmICFQUENfSVNFUklFUworCWRlcGVuZHMgb24gREVCVUdHRVIKIAloZWxwCiAJICBJbmNsdWRlIGluLWtlcm5lbCBob29rcyBmb3IgdGhlIHhtb24ga2VybmVsIG1vbml0b3IvZGVidWdnZXIuCiAJICBVbmxlc3MgeW91IGFyZSBpbnRlbmRpbmcgdG8gZGVidWcgdGhlIGtlcm5lbCwgc2F5IE4gaGVyZS4KQEAgLTk4LDYgKzk4LDE1IEBACiAJICB4bW9uIGlzIG5vcm1hbGx5IGRpc2FibGVkIHVubGVzcyBib290ZWQgd2l0aCAneG1vbj1vbicuCiAJICBVc2UgJ3htb249b2ZmJyB0byBkaXNhYmxlIHhtb24gaW5pdCBkdXJpbmcgcnVudGltZS4KIAorY29uZmlnIFhNT05fRElTQVNTRU1CTFkKKwlib29sICJJbmNsdWRlIGRpc2Fzc2VtYmx5IHN1cHBvcnQgaW4geG1vbiIKKwlkZXBlbmRzIG9uIFhNT04KKwlkZWZhdWx0IHkKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIGRpc2Fzc2VtYmxpbmcgaW4geG1vbi4gWW91IHByb2JhYmx5IHdhbnQKKwkgIHRvIHNheSBZIGhlcmUsIHVubGVzcyB5b3UncmUgYnVpbGRpbmcgZm9yIGEgbWVtb3J5LWNvbnN0cmFpbmVkCisJICBzeXN0ZW0uCisKIGNvbmZpZyBJUlFTVEFDS1MKIAlib29sICJVc2Ugc2VwYXJhdGUga2VybmVsIHN0YWNrcyB3aGVuIHByb2Nlc3NpbmcgaW50ZXJydXB0cyIKIAlkZXBlbmRzIG9uIFBQQzY0CkBAIC0xMTYsNyArMTI1LDcgQEAKIAogY29uZmlnIEJPT1RYX1RFWFQKIAlib29sICJTdXBwb3J0IGZvciBlYXJseSBib290IHRleHQgY29uc29sZSAoQm9vdFggb3IgT3BlbkZpcm13YXJlIG9ubHkpIgotCWRlcGVuZHMgUFBDX09GICYmICFQUENfSVNFUklFUworCWRlcGVuZHMgUFBDX09GCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBzZWUgcHJvZ3Jlc3MgbWVzc2FnZXMgZnJvbSB0aGUgYm9vdCBmaXJtd2FyZSBpbiB0ZXh0CiAJICBtb2RlLiBSZXF1aXJlcyBlaXRoZXIgQm9vdFggb3IgT3BlbiBGaXJtd2FyZS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUgYi9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlCmluZGV4IDQ1YzlhZDIuLjA3MzRiMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvLmdpdGlnbm9yZQpAQCAtMSwxOSArMSwzMiBAQAogYWRkbm90ZQorZW1wdHkuYworaGFjay1jb2ZmCiBpbmZibG9jay5jCiBpbmZibG9jay5oCiBpbmZjb2Rlcy5jCiBpbmZjb2Rlcy5oCiBpbmZmYXN0LmMKIGluZmZhc3QuaAoraW5mZml4ZWQuaAogaW5mbGF0ZS5jCitpbmZsYXRlLmgKIGluZnRyZWVzLmMKIGluZnRyZWVzLmgKIGluZnV0aWwuYwogaW5mdXRpbC5oCiBrZXJuZWwtdm1saW51eC5zdHJpcC5jCiBrZXJuZWwtdm1saW51eC5zdHJpcC5negorbWt0cmVlCiB1SW1hZ2UKIHpJbWFnZQorekltYWdlLmNocnAKK3pJbWFnZS5jb2ZmCit6SW1hZ2UuY29mZi5sZHMKK3pJbWFnZS5sZHMKK3pJbWFnZS5taWJvb3QKK3pJbWFnZS5wbWFjCit6SW1hZ2UucHNlcmllcworekltYWdlLnNhbmRwb2ludAogekltYWdlLnZtb2RlCiB6Y29uZi5oCiB6bGliLmgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggMzdkZGZjYS4uMzQzZGJjZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTQwLDcgKzQwLDggQEAKICQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliKSBtYWluLm8pOiAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmxpbnV4aGVhZGVyKSkgXAogCQkkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmhlYWRlcikpCiAKLXNyYy13bGliIDo9IHN0cmluZy5TIHN0ZGlvLmMgbWFpbi5jIGRpdjY0LlMgJCh6bGliKQorc3JjLXdsaWIgOj0gc3RyaW5nLlMgc3RkaW8uYyBtYWluLmMgZmxhdGRldnRyZWUuYyBmbGF0ZGV2dHJlZV9taXNjLmMgXAorCQluczE2NTUwLmMgc2VyaWFsLmMgc2ltcGxlX2FsbG9jLmMgZGl2NjQuUyB1dGlsLlMgJCh6bGliKQogc3JjLXBsYXQgOj0gb2YuYwogc3JjLWJvb3QgOj0gY3J0MC5TICQoc3JjLXdsaWIpICQoc3JjLXBsYXQpIGVtcHR5LmMKIApAQCAtNzQsNyArNzUsNyBAQAogCUBjcCAkPCAkQAogCiBjbGVhbi1maWxlcyA6PSAkKHpsaWIpICQoemxpYmhlYWRlcikgJCh6bGlibGludXhoZWFkZXIpIFwKLQkJJChvYmopL2VtcHR5LmMKKwkJZW1wdHkuYyB6SW1hZ2UgekltYWdlLmNvZmYubGRzIHpJbWFnZS5sZHMgekltYWdlLnNhbmRwb2ludAogCiBxdWlldF9jbWRfYm9vdGNjID0gQk9PVENDICAkQAogICAgICAgY21kX2Jvb3RjYyA9ICQoQ1JPU1MzMkNDKSAtV3AsLU1ELCQoZGVwZmlsZSkgJChCT09UQ0ZMQUdTKSAtYyAtbyAkQCAkPApAQCAtOTMsMTMgKzk0LDEzIEBACiAkKG9iaikvd3JhcHBlci5hOiAkKG9iai13bGliKQogCSQoY2FsbCBjbWQsYm9vdGFyKQogCi1ob3N0cHJvZ3MteQk6PSBhZGRub3RlIGFkZFJhbURpc2sgaGFjay1jb2ZmCitob3N0cHJvZ3MteQk6PSBhZGRub3RlIGFkZFJhbURpc2sgaGFjay1jb2ZmIG1rdHJlZQogCiBleHRyYS15CQk6PSAkKG9iaikvY3J0MC5vICQob2JqKS93cmFwcGVyLmEgJChvYmotcGxhdCkgJChvYmopL2VtcHR5Lm8gXAogCQkgICAkKG9iaikvekltYWdlLmxkcyAkKG9iaikvekltYWdlLmNvZmYubGRzCiAKIHdyYXBwZXIJCTo9JChzcmN0cmVlKS8kKHNyYykvd3JhcHBlcgotd3JhcHBlcmJpdHMJOj0gJChleHRyYS15KSAkKGFkZHByZWZpeCAkKG9iaikvLGFkZG5vdGUgaGFjay1jb2ZmKQord3JhcHBlcmJpdHMJOj0gJChleHRyYS15KSAkKGFkZHByZWZpeCAkKG9iaikvLGFkZG5vdGUgaGFjay1jb2ZmIG1rdHJlZSkKIAogIyMjIyMjIyMjIyMjIwogIyBCaXRzIGZvciBidWlsZGluZyB2YXJpb3VzIGZsYXZvdXJzIG9mIHpJbWFnZQpAQCAtMTE1LDcgKzExNiw3IEBACiBxdWlldF9jbWRfd3JhcAk9IFdSQVAgICAgJEAKICAgICAgIGNtZF93cmFwCT0kKENPTkZJR19TSEVMTCkgJCh3cmFwcGVyKSAtYyAtbyAkQCAtcCAkMiAkKENST1NTV1JBUCkgdm1saW51eAogcXVpZXRfY21kX3dyYXBfaW5pdHJkID0gV1JBUCAgICAkQAotICAgICAgY21kX3dyYXBfaW5pdHJkID0kKHdyYXBwZXIpIC1jIC1vICRAIC1wICQyICQoQ1JPU1NXUkFQKSBcCisgICAgICBjbWRfd3JhcF9pbml0cmQgPSQoQ09ORklHX1NIRUxMKSAkKHdyYXBwZXIpIC1jIC1vICRAIC1wICQyICQoQ1JPU1NXUkFQKSBcCiAJCQkJLWkgJChvYmopL3JhbWRpc2suaW1hZ2UuZ3ogdm1saW51eAogCiAkKG9iaikvekltYWdlLmNocnA6IHZtbGludXggJCh3cmFwcGVyYml0cykKQEAgLTE0OCwxMyArMTQ5LDE4IEBACiAkKG9iaikvekltYWdlLmluaXRyZC5taWJvb3Q6IHZtbGludXggJCh3cmFwcGVyYml0cykKIAkkKGNhbGwgY21kLHdyYXBfaW5pdHJkLG1pYm9vdCkKIAorJChvYmopL3pJbWFnZS5wczM6IHZtbGludXgKKwkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAorCiAkKG9iaikvdUltYWdlOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGNtZCx3cmFwLHVib290KQogCiBpbWFnZS0kKENPTkZJR19QUENfUFNFUklFUykJCSs9IHpJbWFnZS5wc2VyaWVzCiBpbWFnZS0kKENPTkZJR19QUENfTUFQTEUpCQkrPSB6SW1hZ2UucHNlcmllcwogaW1hZ2UtJChDT05GSUdfUFBDX0lCTV9DRUxMX0JMQURFKQkrPSB6SW1hZ2UucHNlcmllcworaW1hZ2UtJChDT05GSUdfUFBDX1BTMykJCQkrPSB6SW1hZ2UucHMzCiBpbWFnZS0kKENPTkZJR19QUENfQ0hSUCkJCSs9IHpJbWFnZS5jaHJwCitpbWFnZS0kKENPTkZJR19QUENfRUZJS0EpCQkrPSB6SW1hZ2UuY2hycAogaW1hZ2UtJChDT05GSUdfUFBDX1BNQUMpCQkrPSB6SW1hZ2UucG1hYwogaW1hZ2UtJChDT05GSUdfREVGQVVMVF9VSU1BR0UpCQkrPSB1SW1hZ2UKIApAQCAtMTc2LDMgKzE4Miw0IEBACiAKIGNsZWFuLWZpbGVzICs9ICQoYWRkcHJlZml4ICQob2JqdHJlZSkvLCAkKG9iai1ib290KSB2bWxpbnV4LnN0cmlwLmd6KQogY2xlYW4tZmlsZXMgKz0gJChhZGRwcmVmaXggJChvYmp0cmVlKS8sICQob2JqLWJvb3QpIHZtbGludXguYmluLmd6KQorY2xlYW4tZmlsZXMgKz0gJChpbWFnZS0pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhHLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmIwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhHLmR0cwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIERldmljZSBUcmVlIFNvdWNlIGZvciBCdWZmYWxvIEt1cm9ib3hIRworICoKKyAqIENob29zZSBDT05GSUdfTElOS1NUQVRJT04gdG8gYnVpbGQgYSBrZXJuZWwgZm9yIEt1cm9ib3hIRywgb3IgdXNlCisgKiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGxpbmtzdGF0aW9uX2RlZmNvbmZpZy4KKyAqCisgKiBCYXNlZCBvbiBzYW5kcG9pbnQuZHRzCisgKgorICogMjAwNiAoYykgRy4gTGlha2hvdmV0c2tpIDxnLmxpYWtob3ZldHNraUBnbXguZGU+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/ICovCisJYm5lCS51ZGVsYXlfbm90XzYwMQorMDA6CWxpCXIwLDg2CS8qIEluc3RydWN0aW9ucyAvIG1pY3Jvc2Vjb25kPyAqLworCW10Y3RyCXIwCisxMDoJYWRkaQlyMCxyMCwwIC8qIE5PUCAqLworCWJkbnoJMTBiCisJc3ViaWMuCXIzLHIzLDEKKwlibmUJMDBiCisJYmxyCisKKy51ZGVsYXlfbm90XzYwMToKKwltdWxsaQlyNCxyMywxMDAwCS8qIG5hbm9zZWNvbmRzICovCisJLyogIENoYW5nZSByNCB0byBiZSB0aGUgbnVtYmVyIG9mIHRpY2tzIHVzaW5nOgorCSAqCShuYW5vc2Vjb25kcyArICh0aW1lYmFzZV9wZXJpb2RfbnMgLSAxICkpIC8gdGltZWJhc2VfcGVyaW9kX25zCisJICogIHRpbWViYXNlX3BlcmlvZF9ucyBkZWZhdWx0cyB0byA2MCAoMTYuNk1IeikgKi8KKwltZmxyCXI1CisJYmwJMGYKKzA6CW1mbHIJcjYKKwltdGxyCXI1CisJbGlzCXI1LDBiQGhhCisJYWRkaQlyNSxyNSwwYkBsCisJc3ViZglyNSxyNSxyNgkvKiBJbiBjYXNlIHdlJ3JlIHJlbG9jYXRlZCAqLworCWFkZGlzCXI1LHI1LHRpbWViYXNlX3BlcmlvZF9uc0BoYQorCWx3eglyNSx0aW1lYmFzZV9wZXJpb2RfbnNAbChyNSkKKwlhZGQJcjQscjQscjUKKwlhZGRpCXI0LHI0LC0xCisJZGl2dwlyNCxyNCxyNQkvKiBCVVMgdGlja3MgKi8KKzE6CW1mdGJ1CXI1CisJbWZ0YglyNgorCW1mdGJ1CXI3CisJY21wdwkwLHI1LHI3CisJYm5lCTFiCQkvKiBHZXQgW3N5bmNlZF0gYmFzZSB0aW1lICovCisJYWRkYwlyOSxyNixyNAkvKiBDb21wdXRlIGVuZCB0aW1lICovCisJYWRkemUJcjgscjUKKzI6CW1mdGJ1CXI1CisJY21wdwkwLHI1LHI4CisJYmx0CTJiCisJYmd0CTNmCisJbWZ0YglyNgorCWNtcHcJMCxyNixyOQorCWJsdAkyYgorMzoJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgppbmRleCBlYWI3MzE4Li4wMjRlNGQ0IDEwMDc1NQotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKQEAgLTE3OSwxMSArMTc5LDE0IEBACiBmaQogCiBpZiBbIC1uICIkaW5pdHJkIiBdOyB0aGVuCi0gICAgYWRkc2VjICR0bXAgIiRpbml0cmQiIGluaXRyZAorICAgIGFkZHNlYyAkdG1wICIkaW5pdHJkIiAkaXNlY3Rpb24KIGZpCiAKIGlmIFsgLW4gIiRkdGIiIF07IHRoZW4KLSAgICBhZGRzZWMgJHRtcCAiJGR0YiIgZHRiCisgICAgYWRkc2VjICR0bXAgIiRkdGIiIC5rZXJuZWw6ZHRiCisgICAgaWYgWyAtbiAiJGR0cyIgXTsgdGhlbgorCXJtICRkdGIKKyAgICBmaQogZmkKIAogaWYgWyAiJHBsYXRmb3JtIiAhPSAibWlib290IiBdOyB0aGVuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UuY29mZi5sZHMuUyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcy5TCmluZGV4IDA1ZjMyMzguLmEzNjA5MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcy5TCkBAIC0yMSw2ICsyMSwxMCBAQAogICAgICooLmdvdDIpCiAgICAgX19nb3QyX2VuZCA9IC47CiAKKyAgICBfZHRiX3N0YXJ0ID0gLjsKKyAgICAqKC5rZXJuZWw6ZHRiKQorICAgIF9kdGJfZW5kID0gLjsKKwogICAgIF92bWxpbnV4X3N0YXJ0ID0gIC47CiAgICAgKigua2VybmVsOnZtbGludXguc3RyaXApCiAgICAgX3ZtbGludXhfZW5kID0gIC47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UubGRzLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UubGRzLlMKaW5kZXggNGI2YmIzZi4uNGJlM2M2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5sZHMuUwpAQCAtMjEsNiArMjEsMTEgQEAKICAgICBfX2dvdDJfZW5kID0gLjsKICAgfQogCisgIC4gPSBBTElHTig4KTsKKyAgX2R0Yl9zdGFydCA9IC47CisgIC5rZXJuZWw6ZHRiIDogeyAqKC5rZXJuZWw6ZHRiKSB9CisgIF9kdGJfZW5kID0gLjsKKwogICAuID0gQUxJR04oNDA5Nik7CiAgIF92bWxpbnV4X3N0YXJ0ID0gIC47CiAgIC5rZXJuZWw6dm1saW51eC5zdHJpcCA6IHsgKigua2VybmVsOnZtbGludXguc3RyaXApIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY2VsbF9kZWZjb25maWcKaW5kZXggODkyZDVkZC4uYTk4Yzk4MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY2VsbF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY2VsbF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgV2VkIE9jdCAgNCAxNTozMDo1MCAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmM2CisjIFdlZCBOb3YgMjIgMTU6MzM6MDQgMjAwNgogIwogQ09ORklHX1BQQzY0PXkKIENPTkZJR182NEJJVD15CkBAIC0zMiw2ICszMiwxMCBAQAogQ09ORklHX1BPV0VSMz15CiBDT05GSUdfUE9XRVI0PXkKIENPTkZJR19QUENfRlBVPXkKKyMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfRENSX01NSU89eQorQ09ORklHX1BQQ19EQ1I9eQorQ09ORklHX1BQQ19PRl9QTEFURk9STV9QQ0k9eQogQ09ORklHX0FMVElWRUM9eQogQ09ORklHX1BQQ19TVERfTU1VPXkKIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HPXkKQEAgLTY3LDcgKzcxLDcgQEAKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldApAQCAtMTMxLDYgKzEzNSw3IEBACiBDT05GSUdfUFBDX0NFTExfTkFUSVZFPXkKIENPTkZJR19QUENfSUJNX0NFTExfQkxBREU9eQogQ09ORklHX1VEQkdfUlRBU19DT05TT0xFPXkKK0NPTkZJR19QUENfUFMzPXkKICMgQ09ORklHX1UzX0RBUlQgaXMgbm90IHNldAogQ09ORklHX1BQQ19SVEFTPXkKICMgQ09ORklHX1JUQVNfRVJST1JfTE9HR0lORyBpcyBub3Qgc2V0CkBAIC0xMzksOSArMTQ0LDIzIEBACiBDT05GSUdfTU1JT19OVlJBTT15CiAjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSU5ESVJFQ1RfSU89eQorQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CitDT05GSUdfQ1BVX0ZSRVFfREVCVUc9eQorQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQorIyBDT05GSUdfQ1BVX0ZSRVFfU1RBVF9ERVRBSUxTIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFPXkKKyMgQ09ORklHX0NQVV9GUkVRX1BNQUM2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5UX0VBUkxZX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NUElDIGlzIG5vdCBzZXQKK0NPTkZJR19NUElDPXkKIAogIwogIyBDZWxsIEJyb2FkYmFuZCBFbmdpbmUgb3B0aW9ucwpAQCAtMTQ5LDYgKzE2OCwxNSBAQAogQ09ORklHX1NQVV9GUz1tCiBDT05GSUdfU1BVX0JBU0U9eQogQ09ORklHX0NCRV9SQVM9eQorQ09ORklHX0NCRV9USEVSTT1tCitDT05GSUdfQ0JFX0NQVUZSRVE9bQorCisjCisjIFBTMyBQbGF0Zm9ybSBPcHRpb25zCisjCitDT05GSUdfUFMzX0hUQUJfU0laRT0yMAorIyBDT05GSUdfUFMzX0RZTkFNSUNfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19QUzNfVVNFX0xQQVJfQUREUj15CiAKICMKICMgS2VybmVsIG9wdGlvbnMKQEAgLTE2NiwxMyArMTk0LDE0IEBACiBDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj05CiAjIENPTkZJR19JT01NVV9WTUVSR0UgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKLUNPTkZJR19LRVhFQz15CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKIENPTkZJR19JUlFfQUxMX0NQVVM9eQogQ09ORklHX05VTUE9eQogQ09ORklHX05PREVTX1NISUZUPTQKIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogIyBDT05GSUdfRkxBVE1FTV9NQU5VQUwgaXMgbm90IHNldApAQCAtMTg5LDYgKzIxOCw3IEBACiBDT05GSUdfTUlHUkFUSU9OPXkKIENPTkZJR19SRVNPVVJDRVNfNjRCSVQ9eQogQ09ORklHX0FSQ0hfTUVNT1JZX1BST0JFPXkKK0NPTkZJR19OT0RFU19TUEFOX09USEVSX05PREVTPXkKIENPTkZJR19QUENfNjRLX1BBR0VTPXkKIENPTkZJR19TQ0hFRF9TTVQ9eQogQ09ORklHX1BST0NfREVWSUNFVFJFRT15CkBAIC0yMDcsNyArMjM3LDYgQEAKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9ET01BSU5TPXkKIENPTkZJR19QQ0lFUE9SVEJVUz15Ci0jIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIAogIwpAQCAtMjU0LDYgKzI4Myw3IEBACiBDT05GSUdfSU5FVF9UVU5ORUw9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CkBAIC0yNzUsOSArMzA1LDEwIEBACiBDT05GSUdfSU5FVDZfVFVOTkVMPW0KIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKKyMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X1NJVCBpcyBub3Qgc2V0CiBDT05GSUdfSVBWNl9UVU5ORUw9bQotIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15CkBAIC00MDYsNiArNDM3LDEyIEBACiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCiAjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIwogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiBDT05GSUdfSURFPXkKQEAgLTczOCw3ICs3NzUsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTgwMiw2ICs4MzgsNyBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CkBAIC04MTAsMTQgKzg0Nyw5IEBACiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogCiAjCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19WNEwyPXkKIAogIwogIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCkBAIC05MjMsNiArOTU1LDcgQEAKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CkBAIC05MzAsNiArOTYzLDcgQEAKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTExMDEsNyArMTEzNSw4IEBACiAjCiAjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CiAjCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiAKICMKQEAgLTExMjksMTIgKzExNjQsMTQgQEAKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfRk9SQ0VEX0lOTElOSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR0dFUj15CiBDT05GSUdfWE1PTj15CiBDT05GSUdfWE1PTl9ERUZBVUxUPXkKK0NPTkZJR19YTU9OX0RJU0FTU0VNQkxZPXkKIENPTkZJR19JUlFTVEFDS1M9eQogIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldApAQCAtMTE1Miw3ICsxMTg5LDcgQEAKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQkxLQ0lQSEVSPW0KIENPTkZJR19DUllQVE9fSEFTSD15Ci0jIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19ITUFDPXkKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGlua3N0YXRpb25fZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGlua3N0YXRpb25fZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZmQyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9saW5rc3RhdGlvbl9kZWZjb25maWcKQEAgLTAsMCArMSwxNTgzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmM0CisjIFdlZCBOb3YgMTUgMjA6MzY6MzAgMjAwNgorIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19QUENfTUVSR0U9eQorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfSVJRX1BFUl9DUFU9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKKyMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVF9BUkNIPXkKKyMgQ09ORklHX0RFRkFVTFRfVUlNQUdFIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc3VwcG9ydAorIworQ09ORklHX0NMQVNTSUMzMj15CisjIENPTkZJR19QUENfNTJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODN4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODV4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODZ4eCBpcyBub3Qgc2V0CisjIENPTkZJR180MHggaXMgbm90IHNldAorIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR182eHg9eQorQ09ORklHX1BQQ19GUFU9eQorIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FMVElWRUMgaXMgbm90IHNldAorQ09ORklHX1BQQ19TVERfTU1VPXkKK0NPTkZJR19QUENfU1REX01NVV8zMj15CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049Ii1rdXJvYm94SEciCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0CisjCisjIENPTkZJR19QUENfTVVMVElQTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERUQ2eHg9eQorIyBDT05GSUdfQVBVUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAorIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBVSBpcyBub3Qgc2V0CisjIENPTkZJR19LQVRBTkEgaXMgbm90IHNldAorIyBDT05GSUdfV0lMTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQQ0k2OTAgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJQTUMyNTAgaXMgbm90IHNldAorIyBDT05GSUdfQ0hFU1ROVVQgaXMgbm90IHNldAorIyBDT05GSUdfU1BSVUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hEUFUgaXMgbm90IHNldAorIyBDT05GSUdfRVY2NDI2MCBpcyBub3Qgc2V0CisjIENPTkZJR19MT1BFQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVk1FNTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUlBNQzc1MCBpcyBub3Qgc2V0CisjIENPTkZJR19QUlBNQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQU5EUE9JTlQgaXMgbm90IHNldAorQ09ORklHX0xJTktTVEFUSU9OPXkKKyMgQ09ORklHX01QQzc0NDhIUEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRFNUT05FX1BQQzdEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBTDQgaXMgbm90IHNldAorIyBDT05GSUdfR0VNSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VTVDgyNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0JDODJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQlM4MjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQWDgyNjAgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODI2MCBpcyBub3Qgc2V0CisjIENPTkZJR19BRFM4MjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BRMkZBRFMgaXMgbm90IHNldAorIyBDT05GSUdfTElURTUyMDAgaXMgbm90IHNldAorIyBDT05GSUdfRVY2NDM2MCBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0dFTjU1MD15CitDT05GSUdfTVBDMTBYX0JSSURHRT15CitDT05GSUdfTVBDMTBYX09QRU5QSUM9eQorIyBDT05GSUdfTVBDMTBYX1NUT1JFX0dBVEhFUklORyBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5UX0VBUkxZX1NFUklBTCBpcyBub3Qgc2V0CitDT05GSUdfTVBJQz15CisKKyMKKyMgS2VybmVsIG9wdGlvbnMKKyMKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorQ09ORklHX0haXzEwMD15CisjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKKyMgQ09ORklHX01QSUNfV0VJUkQgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0k4MjU5IGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKK0NPTkZJR19GU0xfU09DPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9NVUxUSVRIUkVBRF9QUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEhvdHBsdWcgU3VwcG9ydAorIworIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAorQ09ORklHX0JPT1RfTE9BRD0weDAwODAwMDAwCisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorCisjCisjIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRBQkxFUz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1AgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVIgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWSBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUMgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTIGlzIG5vdCBzZXQKKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19JUF9ORl9DT05OVFJBQ0s9bQorIyBDT05GSUdfSVBfTkZfQ1RfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NUX1BST1RPX1NDVFAgaXMgbm90IHNldAorQ09ORklHX0lQX05GX0ZUUD1tCitDT05GSUdfSVBfTkZfSVJDPW0KKyMgQ09ORklHX0lQX05GX05FVEJJT1NfTlMgaXMgbm90IHNldAorQ09ORklHX0lQX05GX1RGVFA9bQorIyBDT05GSUdfSVBfTkZfQU1BTkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1BQVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfSDMyMyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9TSVAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPW0KKyMgQ09ORklHX0lQX05GX01BVENIX1RPUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfTUFUQ0hfRUNOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX1RUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9PV05FUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9NQVRDSF9IQVNITElNSVQgaXMgbm90IHNldAorQ09ORklHX0lQX05GX0ZJTFRFUj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCisjIENPTkZJR19JUF9ORl9UQVJHRVRfTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1RBUkdFVF9UQ1BNU1MgaXMgbm90IHNldAorQ09ORklHX0lQX05GX05BVD1tCitDT05GSUdfSVBfTkZfTkFUX05FRURFRD15CitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1NBTUU9bQorIyBDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUMgaXMgbm90IHNldAorQ09ORklHX0lQX05GX05BVF9JUkM9bQorQ09ORklHX0lQX05GX05BVF9GVFA9bQorQ09ORklHX0lQX05GX05BVF9URlRQPW0KK0NPTkZJR19JUF9ORl9NQU5HTEU9bQorQ09ORklHX0lQX05GX1RBUkdFVF9UT1M9bQorQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQorQ09ORklHX0lQX05GX1RBUkdFVF9UVEw9bQorQ09ORklHX0lQX05GX1JBVz1tCitDT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9BUlBGSUxURVI9bQorQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKworIworIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFODAyMTE9bQorQ09ORklHX0lFRUU4MDIxMV9ERUJVRz15CitDT05GSUdfSUVFRTgwMjExX0NSWVBUX1dFUD1tCitDT05GSUdfSUVFRTgwMjExX0NSWVBUX0NDTVA9bQorQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQPW0KK0NPTkZJR19JRUVFODAyMTFfU09GVE1BQz1tCitDT05GSUdfSUVFRTgwMjExX1NPRlRNQUNfREVCVUc9eQorQ09ORklHX1dJUkVMRVNTX0VYVD15CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPW0KKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NPTkNBVD15CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9KRURFQ1BST0JFPXkKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CisjIENPTkZJR19NVERfQ0ZJX0kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PQlNPTEVURV9DSElQUyBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weGZmYzAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4NDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTEKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9QTUM1NTEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0yCitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorQ09ORklHX0NIUl9ERVZfU0c9eQorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0VBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9OViBpcyBub3Qgc2V0CisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJTCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09MRFBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX1NJTDY4MD15CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19XSU5ERkFSTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorQ09ORklHX1RVTj1tCisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKK0NPTkZJR19SODE2OT15CisjIENPTkZJR19SODE2OV9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKK0NPTkZJR19ORVRfUkFESU89eQorIyBDT05GSUdfTkVUX1dJUkVMRVNTX1JUTkVUTElOSyBpcyBub3Qgc2V0CisKKyMKKyMgT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkKKyMKKyMgQ09ORklHX1NUUklQIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyA4MDIuMTFiIElTQS9QQ0kgY2FyZHMgc3VwcG9ydAorIworIyBDT05GSUdfSVBXMjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFcyMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FJUk8gaXMgbm90IHNldAorIyBDT05GSUdfSEVSTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKKworIworIyBQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9aRDEyMDEgaXMgbm90IHNldAorIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JDTTQzWFggaXMgbm90IHNldAorIyBDT05GSUdfWkQxMjExUlcgaXMgbm90IHNldAorQ09ORklHX05FVF9XSVJFTEVTUz15CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorQ09ORklHX05FVENPTlNPTEU9eQorQ09ORklHX05FVFBPTEw9eQorIyBDT05GSUdfTkVUUE9MTF9SWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMX1RSQVAgaXMgbm90IHNldAorQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVI9eQorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPW0KKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorQ09ORklHX0lOUFVUX1VJTlBVVD1tCisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0FHUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfTVBDPXkKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKK0NPTkZJR19TRU5TT1JTX0VFUFJPTT1tCisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX000MVQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9eQorIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCitDT05GSUdfVVNCX1NFUklBTD15CitDT05GSUdfVVNCX1NFUklBTF9DT05TT0xFPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0FJUkNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQUlSUFJJTUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9BUkszMTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQkVMS0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfV0hJVEVIRUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRElHSV9BQ0NFTEVQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1AyMTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VNUEVHIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU0VSSUFMX0ZURElfU0lPPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfRlVOU09GVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1ZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBBUSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0dBUk1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fUERBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX01PUzc3MjAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NT1M3ODQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTkFWTUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfUEwyMzAzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSFA0WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NBRkUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9TSUVSUkFXSVJFTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfWElSQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfUlM1QzM3Mj15CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cworIworCisjCisjIERNQSBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorQ09ORklHX1pJU09GUz15CitDT05GSUdfWklTT0ZTX0ZTPW0KK0NPTkZJR19VREZfRlM9bQorQ09ORklHX1VERl9OTFM9eQorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKK0NPTkZJR19OVEZTX0ZTPW0KKyMgQ09ORklHX05URlNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19SVyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ORlNfVjNfQUNMPXkKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPW0KK0NPTkZJR19ORlNEX1YzPXkKKyMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAorQ09ORklHX05GU0RfVENQPXkKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz1tCitDT05GSUdfTkZTX0FDTF9TVVBQT1JUPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9bQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPW0KKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfVVRGOD1tCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CitDT05GSUdfTElCQ1JDMzJDPW0KK0NPTkZJR19aTElCX0lORkxBVEU9bQorQ09ORklHX1pMSUJfREVGTEFURT1tCitDT05GSUdfUExJU1Q9eQorCisjCisjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CisjCitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19PUFJPRklMRT1tCisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JXU0VNUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkRJX1NXSVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01END1tCitDT05GSUdfQ1JZUFRPX01ENT15CitDT05GSUdfQ1JZUFRPX1NIQTE9bQorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KK0NPTkZJR19DUllQVE9fQ0JDPXkKK0NPTkZJR19DUllQVE9fREVTPXkKK0NPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQorQ09ORklHX0NSWVBUT19UV09GSVNIPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSF9DT01NT049bQorQ09ORklHX0NSWVBUT19TRVJQRU5UPW0KK0NPTkZJR19DUllQVE9fQUVTPW0KKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0FSQzQ9bQorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVGTEFURT1tCitDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KK0NPTkZJR19DUllQVE9fQ1JDMzJDPW0KKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGl0ZTUyMDBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbGl0ZTUyMDBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNzY1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9saXRlNTIwMF9kZWZjb25maWcKQEAgLTAsMCArMSw5MzEgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzYKKyMgTW9uIE5vdiAyNyAxMTowODoyMCAyMDA2CisjCisjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CitDT05GSUdfUFBDMzI9eQorQ09ORklHX1BQQ19NRVJHRT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfUFBDPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1BQQ19PRj15CisjIENPTkZJR19QUENfVURCR18xNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfQVVESVRfQVJDSD15CisjIENPTkZJR19ERUZBVUxUX1VJTUFHRSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKK0NPTkZJR19DTEFTU0lDMzI9eQorIyBDT05GSUdfUFBDXzUyeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzg1eHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzg2eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR184eHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CitDT05GSUdfNnh4PXkKK0NPTkZJR19QUENfRlBVPXkKKyMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19BTFRJVkVDIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfUFBDX1NURF9NTVVfMzI9eQorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFBsYXRmb3JtIHN1cHBvcnQKKyMKK0NPTkZJR19QUENfTVVMVElQTEFURk9STT15CisjIENPTkZJR19FTUJFRERFRDZ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DSFJQIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfTVBDNTJ4eD15CisjIENPTkZJR19QUENfRUZJS0EgaXMgbm90IHNldAorQ09ORklHX1BQQ19MSVRFNTIwMD15CisjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAorIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBVSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5UX0VBUkxZX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NUElDIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgb3B0aW9ucworIworIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfUE09eQorIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU09GVFdBUkVfU1VTUEVORCBpcyBub3Qgc2V0CitDT05GSUdfU0VDQ09NUD15CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKKyMgQ09ORklHX01QSUNfV0VJUkQgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0k4MjU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kgaXMgbm90IHNldAorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPW0KKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTMyNzY4CitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QUk9DX0ZTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworIyBDT05GSUdfQkxLX0RFVl9TRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworQ09ORklHX0FUQT15CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0CitDT05GSUdfUEFUQV9NUEM1Mnh4PXkKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19XSU5ERkFSTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKKyMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01WNjQzWFhfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX01QQzUyeHg9eQorQ09ORklHX1NFUklBTF9NUEM1Mnh4X0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9NUEM1Mnh4X0NPTlNPTEVfQkFVRD05NjAwCisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBTUEkgc3VwcG9ydAorIworIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworIyBDT05GSUdfTkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19QTElTVD15CisKKyMKKyMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19QUklOVEtfVElNRT15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JXU0VNUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKK0NPTkZJR19GT1JDRURfSU5MSU5JTkc9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JESV9TV0lUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzNHhfaXR4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzNHhfaXR4X2RlZmNvbmZpZwppbmRleCBjZDM1MzVlLi4wNTYxYjczIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4MzR4X2l0eF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODM0eF9pdHhfZGVmY29uZmlnCkBAIC0xMjQ4LDcgKzEyNDgsNyBAQAogIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01TRE9TX1BBUlRJVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKICMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwppbmRleCBiZTExZGY3Li4xYzAwOTY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCkBAIC0xMzg2LDggKzEzODYsOCBAQAogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15Ci1DT05GSUdfQVVUT0ZTX0ZTPXkKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPW0KICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGVkNjEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDgzOCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjNgorIyBUdWUgTm92IDIxIDE5OjM4OjUzIDIwMDYKKyMKK0NPTkZJR19QUEM2ND15CitDT05GSUdfNjRCSVQ9eQorQ09ORklHX1BQQ19NRVJHRT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfUFBDPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0NPTVBBVD15CitDT05GSUdfU1lTVklQQ19DT01QQVQ9eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1BQQ19PRj15CisjIENPTkZJR19QUENfVURCR18xNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfQVVESVRfQVJDSD15CisjIENPTkZJR19ERUZBVUxUX1VJTUFHRSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BPV0VSNF9PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19QT1dFUjM9eQorQ09ORklHX1BPV0VSND15CitDT05GSUdfUFBDX0ZQVT15CisjIENPTkZJR19QUENfRENSX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRENSX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfUFBDX09GX1BMQVRGT1JNX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfQUxUSVZFQz15CitDT05GSUdfUFBDX1NURF9NTVU9eQorQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkc9eQorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz0yCitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVTRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1NMQUI9eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19TVE9QX01BQ0hJTkU9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFBsYXRmb3JtIHN1cHBvcnQKKyMKK0NPTkZJR19QUENfTVVMVElQTEFURk9STT15CisjIENPTkZJR19FTUJFRERFRDZ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QU0VSSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JU0VSSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NQVBMRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfUEFTRU1JIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfQ0VMTD15CisjIENPTkZJR19QUENfQ0VMTF9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0lCTV9DRUxMX0JMQURFIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfUFMzPXkKKyMgQ09ORklHX1UzX0RBUlQgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAorIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTlRfRUFSTFlfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QSUMgaXMgbm90IHNldAorCisjCisjIENlbGwgQnJvYWRiYW5kIEVuZ2luZSBvcHRpb25zCisjCitDT05GSUdfU1BVX0ZTPXkKK0NPTkZJR19TUFVfQkFTRT15CisjIENPTkZJR19DQkVfUkFTIGlzIG5vdCBzZXQKKworIworIyBQUzMgUGxhdGZvcm0gT3B0aW9ucworIworQ09ORklHX1BTM19IVEFCX1NJWkU9MjAKK0NPTkZJR19QUzNfRFlOQU1JQ19ETUE9eQorQ09ORklHX1BTM19VU0VfTFBBUl9BRERSPXkKK0NPTkZJR19QUzNfVlVBUlQ9eQorCisjCisjIEtlcm5lbCBvcHRpb25zCisjCisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX0JLTCBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX0VMRj15CitDT05GSUdfQklORk1UX01JU0M9eQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9OQorIyBDT05GSUdfSU9NTVVfVk1FUkdFIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUV9BTExfQ1BVUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVU1BIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorIyBDT05GSUdfRkxBVE1FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX01BTlVBTD15CitDT05GSUdfU1BBUlNFTUVNPXkKK0NPTkZJR19IQVZFX01FTU9SWV9QUkVTRU5UPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9FWFRSRU1FPXkKK0NPTkZJR19NRU1PUllfSE9UUExVRz15CitDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfUkVTT1VSQ0VTXzY0QklUPXkKK0NPTkZJR19BUkNIX01FTU9SWV9QUk9CRT15CitDT05GSUdfUFBDXzY0S19QQUdFUz15CisjIENPTkZJR19TQ0hFRF9TTVQgaXMgbm90IHNldAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJyb290PS9kZXYvbmZzIHJ3IGlwPWRoY3AiCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSTgyNTkgaXMgbm90IHNldAorIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9ET01BSU5TIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMDAwMDAwMDAwCisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0RJQUcgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKworIworIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCisjIENPTkZJR19CTEtfREVWX1NEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIE1hY2ludG9zaCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCisjIENPTkZJR19ORVRfRVRIRVJORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0dFTl9SVEM9eQorIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU5HQ0hFQ0tfVElNRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBTUEkgc3VwcG9ydAorIworIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfUExJU1Q9eQorCisjCisjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DSz15CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JXU0VNUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVA9eQorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0xJU1Q9eQorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR0dFUiBpcyBub3Qgc2V0CitDT05GSUdfSVJRU1RBQ0tTPXkKKyMgQ09ORklHX0JPT1RYX1RFWFQgaXMgbm90IHNldAorQ09ORklHX1BQQ19FQVJMWV9ERUJVRz15CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfTFBBUiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfRzUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1JUQVNfUEFORUwgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1JUQVNfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfTUFQTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0lTRVJJRVMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzZXJpZXNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKaW5kZXggOTgyODY2My4uZDI4MzNjMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcKQEAgLTE4NCw2ICsxODQsNyBAQAogQ09ORklHX01JR1JBVElPTj15CiBDT05GSUdfUkVTT1VSQ0VTXzY0QklUPXkKIENPTkZJR19IQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRD15CitDT05GSUdfTk9ERVNfU1BBTl9PVEhFUl9OT0RFUz15CiAjIENPTkZJR19QUENfNjRLX1BBR0VTIGlzIG5vdCBzZXQKIENPTkZJR19TQ0hFRF9TTVQ9eQogQ09ORklHX1BST0NfREVWSUNFVFJFRT15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA4YjEzM2FmLi5kMmRlZDE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTE3LDExICsxNywxMSBAQAogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gc2V0dXBfNjQubyBiaW5mbXRfZWxmMzIubyBzeXNfcHBjMzIubyBcCiAJCQkJICAgc2lnbmFsXzY0Lm8gcHRyYWNlMzIubyBcCiAJCQkJICAgcGFjYS5vIGNwdV9zZXR1cF9wcGM5NzAubyBcCi0JCQkJICAgZmlybXdhcmUubyBzeXNmcy5vCisJCQkJICAgZmlybXdhcmUubyBzeXNmcy5vIG52cmFtXzY0Lm8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHZkc282NC8KIG9iai0kKENPTkZJR19BTFRJVkVDKQkJKz0gdmVjZW11Lm8gdmVjdG9yLm8KIG9iai0kKENPTkZJR19QUENfOTcwX05BUCkJKz0gaWRsZV9wb3dlcjQubwotb2JqLSQoQ09ORklHX1BQQ19PRikJCSs9IG9mX2RldmljZS5vIHByb21fcGFyc2Uubworb2JqLSQoQ09ORklHX1BQQ19PRikJCSs9IG9mX2RldmljZS5vIG9mX3BsYXRmb3JtLm8gcHJvbV9wYXJzZS5vCiBwcm9jZnMtJChDT05GSUdfUFBDNjQpCQk6PSBwcm9jX3BwYzY0Lm8KIG9iai0kKENPTkZJR19QUk9DX0ZTKQkJKz0gJChwcm9jZnMteSkKIHJ0YXNwY2ktJChDT05GSUdfUFBDNjQpCQk6PSBydGFzX3BjaS5vCkBAIC0zMiwxMyArMzIsMTEgQEAKIG9iai0kKENPTkZJR19JQk1WSU8pCQkrPSB2aW8ubwogb2JqLSQoQ09ORklHX0lCTUVCVVMpICAgICAgICAgICArPSBpYm1lYnVzLm8KIG9iai0kKENPTkZJR19HRU5FUklDX1RCU1lOQykJKz0gc21wLXRic3luYy5vCi1vYmo2NC0kKENPTkZJR19QUENfTVVMVElQTEFURk9STSkgKz0gbnZyYW1fNjQubwogb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApCSs9IGNyYXNoX2R1bXAubwogb2JqLSQoQ09ORklHXzZ4eCkJCSs9IGlkbGVfNnh4Lm8gbDJjcl82eHgubyBjcHVfc2V0dXBfNnh4Lm8KIG9iai0kKENPTkZJR19UQVUpCQkrPSB0YXVfNnh4Lm8KIG9iajMyLSQoQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQpICs9IHN3c3VzcF8zMi5vCiBvYmozMi0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlXzMyLm8KLW9iai0kKENPTkZJR19FNTAwKQkJKz0gcGVyZm1vbl9mc2xfYm9va2UubwogCiBpZmVxICgkKENPTkZJR19QUENfTUVSR0UpLHkpCiAKQEAgLTYwLDExICs1OCwxMSBAQAogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiBvYmotJChDT05GSUdfS1BST0JFUykJCSs9IGtwcm9iZXMubwogb2JqLSQoQ09ORklHX1BQQ19VREJHXzE2NTUwKQkrPSBsZWdhY3lfc2VyaWFsLm8gdWRiZ18xNjU1MC5vCisKIG1vZHVsZS0kKENPTkZJR19QUEM2NCkJCSs9IG1vZHVsZV82NC5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9ICQobW9kdWxlLXkpCiAKLXBjaTY0LSQoQ09ORklHX1BQQzY0KQkJKz0gcGNpXzY0Lm8gcGNpX2RuLm8gcGNpX2lvbW11Lm8gXAotCQkJCSAgIHBjaV9kaXJlY3RfaW9tbXUubyBpb21hcC5vCitwY2k2NC0kKENPTkZJR19QUEM2NCkJCSs9IHBjaV82NC5vIHBjaV9kbi5vCiBwY2kzMi0kKENPTkZJR19QUEMzMikJCTo9IHBjaV8zMi5vCiBvYmotJChDT05GSUdfUENJKQkJKz0gJChwY2k2NC15KSAkKHBjaTMyLXkpCiBrZXhlYy0kKENPTkZJR19QUEM2NCkJCTo9IG1hY2hpbmVfa2V4ZWNfNjQubwpAQCAtNzMsOCArNzEsMTMgQEAKIG9iai0kKENPTkZJR19BVURJVCkJCSs9IGF1ZGl0Lm8KIG9iajY0LSQoQ09ORklHX0FVRElUKQkJKz0gY29tcGF0X2F1ZGl0Lm8KIAoraWZuZXEgKCQoQ09ORklHX1BQQ19JTkRJUkVDVF9JTykseSkKK29iai15CQkJCSs9IGlvbWFwLm8KK2VuZGlmCisKIGlmZXEgKCQoQ09ORklHX1BQQ19JU0VSSUVTKSx5KQotJChvYmopL2hlYWRfNjQubzogJChvYmopL2xwYXJtYXAucworZXh0cmEteSArPSBscGFybWFwLnMKKyQob2JqKS9oZWFkXzY0Lm86CSQob2JqKS9scGFybWFwLnMKIEFGTEFHU19oZWFkXzY0Lm8gKz0gLUkkKG9iaikKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCBkMDZmMzc4Li5lOTY1MjE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xMTgsNyArMTE4LDggQEAKIAlERUZJTkUoUEFDQVNUQUJSUiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzdGFiX3JyKSk7CiAJREVGSU5FKFBBQ0FSMSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzYXZlZF9yMSkpOwogCURFRklORShQQUNBVE9DLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGtlcm5lbF90b2MpKTsKLQlERUZJTkUoUEFDQVBST0NFTkFCTEVELCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHByb2NfZW5hYmxlZCkpOworCURFRklORShQQUNBU09GVElSUUVOLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNvZnRfZW5hYmxlZCkpOworCURFRklORShQQUNBSEFSRElSUUVOLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGhhcmRfZW5hYmxlZCkpOwogCURFRklORShQQUNBU0xCQ0FDSEUsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc2xiX2NhY2hlKSk7CiAJREVGSU5FKFBBQ0FTTEJDQUNIRVBUUiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzbGJfY2FjaGVfcHRyKSk7CiAJREVGSU5FKFBBQ0FDT05URVhUSUQsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgY29udGV4dC5pZCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jCmluZGV4IDk5NWZjZWYuLjkzZjIxYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2J0ZXh0LmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJsaW51eCxib290eC1saW5lYnl0ZXMiLCBOVUxMKTsKIAlpZiAocHJvcCA9PSBOVUxMKQogCQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAibGluZWJ5dGVzIiwgTlVMTCk7Ci0JaWYgKHByb3ApCisJaWYgKHByb3AgJiYgKnByb3AgIT0gMHhmZmZmZmZmZnUpCiAJCXBpdGNoID0gKnByb3A7CiAJaWYgKHBpdGNoID09IDEpCiAJCXBpdGNoID0gMHgxMDAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcHBjOTcwLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wcGM5NzAuUwppbmRleCA2NTI1OTQ4Li5iZjExOGMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wcGM5NzAuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wcGM5NzAuUwpAQCAtODMsNiArODMsMjIgQEAKIAlybGRpbWkJcjAscjExLDUyLDgJCS8qIHNldCBOQVAgYW5kIERQTSAqLwogCWxpCXIxMSwwCiAJcmxkaW1pCXIwLHIxMSwzMiwzMQkJLyogY2xlYXIgRU5fQVRUTiAqLworCWIJbG9hZF9oaWRzCQkvKiBKdW1wIHRvIHNoYXJlZCBjb2RlICovCisKKworX0dMT0JBTChfX3NldHVwX2NwdV9wcGM5NzBNUCkKKwkvKiBEbyBub3RoaW5nIGlmIG5vdCBydW5uaW5nIGluIEhWIG1vZGUgKi8KKwltZm1zcglyMAorCXJsZGljbC4JcjAscjAsNCw2MworCWJlcWxyCisKKwltZnNwcglyMCxTUFJOX0hJRDAKKwlsaQlyMTEsMHgxNQkJLyogY2xlYXIgRE9aRSBhbmQgU0xFRVAgKi8KKwlybGRpbWkJcjAscjExLDUyLDYJCS8qIHNldCBERUVQTkFQLCBOQVAgYW5kIERQTSAqLworCWxpCXIxMSwwCisJcmxkaW1pCXIwLHIxMSwzMiwzMQkJLyogY2xlYXIgRU5fQVRUTiAqLworCitsb2FkX2hpZHM6CiAJbXRzcHIJU1BSTl9ISUQwLHIwCiAJbWZzcHIJcjAsU1BSTl9ISUQwCiAJbWZzcHIJcjAsU1BSTl9ISUQwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggNDdhNjEzYy4uYjc0MjAxMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8YXNtL29wcm9maWxlX2ltcGwuaD4KICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgkJLyogZm9yIFBUUlJFTE9DIG9uIEFSQ0g9cHBjICovCiAKIHN0cnVjdCBjcHVfc3BlYyogY3VyX2NwdV9zcGVjID0gTlVMTDsKIEVYUE9SVF9TWU1CT0woY3VyX2NwdV9zcGVjKTsKQEAgLTQxLDYgKzQyLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KICNpZmRlZiBDT05GSUdfUFBDNjQKIGV4dGVybiB2b2lkIF9fc2V0dXBfY3B1X3BwYzk3MCh1bnNpZ25lZCBsb25nIG9mZnNldCwgc3RydWN0IGNwdV9zcGVjKiBzcGVjKTsKK2V4dGVybiB2b2lkIF9fc2V0dXBfY3B1X3BwYzk3ME1QKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdHJ1Y3QgY3B1X3NwZWMqIHNwZWMpOwogZXh0ZXJuIHZvaWQgX19yZXN0b3JlX2NwdV9wcGM5NzAodm9pZCk7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKQEAgLTczLDcgKzc1LDcgQEAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfU1BFX0NPTVAJMAogI2VuZGlmCiAKLXN0cnVjdCBjcHVfc3BlYwljcHVfc3BlY3NbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY3B1X3NwZWMgY3B1X3NwZWNzW10gPSB7CiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJewkvKiBQb3dlcjMgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCkBAIC0yMjEsOCArMjIzLDIzIEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDgsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3ME1QLAogCQkuY3B1X3Jlc3RvcmUJCT0gX19yZXN0b3JlX2NwdV9wcGM5NzAsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC85NzBNUCIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicHBjOTcwIiwKKwl9LAorCXsJLyogUFBDOTcwR1ggKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDQ1MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQUEM5NzBHWCIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfUFBDOTcwLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QT1dFUjQgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkubnVtX3BtY3MJCT0gOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wcGM5NzAsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC85NzAiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAogCQkucGxhdGZvcm0JCT0gInBwYzk3MCIsCkBAIC0yNjAsMTUgKzI3Nyw1MCBAQAogCQkub3Byb2ZpbGVfbW1jcmFfc2lwcgk9IE1NQ1JBX1NJUFIsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI1KyIsCiAJfSwKKwl7CS8qIFBPV0VSNiBpbiBQNSsgbW9kZTsgMi4wNC1jb21wbGlhbnQgcHJvY2Vzc29yICovCisJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4MGYwMDAwMDEsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVI1KyIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfUE9XRVI1LAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QT1dFUjVfUExVUywKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkubnVtX3BtY3MJCT0gNiwKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNiIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5vcHJvZmlsZV9tbWNyYV9zaWh2CT0gUE9XRVI2X01NQ1JBX1NJSFYsCisJCS5vcHJvZmlsZV9tbWNyYV9zaXByCT0gUE9XRVI2X01NQ1JBX1NJUFIsCisJCS5vcHJvZmlsZV9tbWNyYV9jbGVhcgk9IFBPV0VSNl9NTUNSQV9USFJNIHwKKwkJCVBPV0VSNl9NTUNSQV9PVEhFUiwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcjUrIiwKKwl9LAogCXsJLyogUG93ZXI2ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDAzZTAwMDAsCi0JCS5jcHVfbmFtZQkJPSAiUE9XRVI2IiwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjYgKHJhdykiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSNiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI2IHwKKwkJCVBQQ19GRUFUVVJFX1BPV0VSNl9FWFQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDYsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjYiLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkub3Byb2ZpbGVfbW1jcmFfc2lodgk9IFBPV0VSNl9NTUNSQV9TSUhWLAorCQkub3Byb2ZpbGVfbW1jcmFfc2lwcgk9IFBPV0VSNl9NTUNSQV9TSVBSLAorCQkub3Byb2ZpbGVfbW1jcmFfY2xlYXIJPSBQT1dFUjZfTU1DUkFfVEhSTSB8CisJCQlQT1dFUjZfTU1DUkFfT1RIRVIsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI2eCIsCisJfSwKKwl7CS8qIDIuMDUtY29tcGxpYW50IHByb2Nlc3NvciwgaS5lLiBQb3dlcjYgImFyY2hpdGVjdGVkIiBtb2RlICovCisJCS5wdnJfbWFzawkJPSAweGZmZmZmZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4MGYwMDAwMDIsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVI2IChhcmNoaXRlY3RlZCkiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSNiwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI2LAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCi0JCS5udW1fcG1jcwkJPSA4LAorCQkubnVtX3BtY3MJCT0gNiwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNiIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCiAgCQkub3Byb2ZpbGVfbW1jcmFfc2lodgk9IFBPV0VSNl9NTUNSQV9TSUhWLApAQCAtMjg3LDYgKzMzOSw5IEBACiAJCQlQUENfRkVBVFVSRV9TTVQsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDQsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9jZWxsLWJlIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0NFTEwsCiAJCS5wbGF0Zm9ybQkJPSAicHBjLWNlbGwtYmUiLAogCX0sCiAJewkvKiBQQSBTZW1pIFBBNlQgKi8KQEAgLTc3OCwxMyArODMzLDI0IEBACiAJCS5wdnJfbWFzawkJPSAweDdmZmYwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDA4NDAwMDAsCiAJCS5jcHVfbmFtZQkJPSAiZTMwMGMyIiwKLQkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19FMzAwLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX0UzMDBDMiwKIAkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKIAkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCisJewkvKiBlMzAwYzMgb24gODN4eCAgKi8KKwkJLnB2cl9tYXNrCQk9IDB4N2ZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDg1MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJlMzAwYzMiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX0UzMDAsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuaWNhY2hlX2JzaXplCQk9IDMyLAorCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKKwkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAorCX0sCiAJewkvKiBkZWZhdWx0IG1hdGNoLCB3ZSBhc3N1bWUgc3BsaXQgSS9EIGNhY2hlICYgVEIgKG5vbi02MDEpLi4uICovCiAJCS5wdnJfbWFzawkJPSAweDAwMDAwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwMDAwMDAsCkBAIC0xMDcwLDggKzExMzYsNyBAQAogCQkucHZyX21hc2sJCT0gMHhmZjAwMGZmZiwKIAkJLnB2cl92YWx1ZQkJPSAweDUzMDAwODkwLAogCQkuY3B1X25hbWUJCT0gIjQ0MFNQZSBSZXYuIEEiLAotCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAotCQkJQ1BVX0ZUUl9VU0VfVEIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKQEAgLTExNTIsMyArMTIxNyw2NyBAQAogI2VuZGlmIC8qICFDTEFTU0lDX1BQQyAqLwogI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogfTsKKworc3RydWN0IGNwdV9zcGVjICppZGVudGlmeV9jcHUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBwdnIpCit7CisJc3RydWN0IGNwdV9zcGVjICpzID0gY3B1X3NwZWNzOworCXN0cnVjdCBjcHVfc3BlYyAqKmN1ciA9ICZjdXJfY3B1X3NwZWM7CisJaW50IGk7CisKKwlzID0gUFRSUkVMT0Mocyk7CisJY3VyID0gUFRSUkVMT0MoY3VyKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNwdV9zcGVjcyk7IGkrKyxzKyspCisJCWlmICgocHZyICYgcy0+cHZyX21hc2spID09IHMtPnB2cl92YWx1ZSkgeworCQkJKmN1ciA9IGNwdV9zcGVjcyArIGk7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJCQkvKiBwcGM2NCBleHBlY3RzIGlkZW50aWZ5X2NwdSB0byBhbHNvIGNhbGwgc2V0dXBfY3B1CisJCQkgKiBmb3IgdGhhdCBwcm9jZXNzb3IuIEkgd2lsbCBjb25zb2xpZGF0ZSB0aGF0IGF0IGEKKwkJCSAqIGxhdGVyIHRpbWUsIGZvciBub3csIGp1c3QgdXNlIG91ciBmcmllbmQgI2lmZGVmLgorCQkJICogd2UgYWxzbyBkb24ndCBuZWVkIHRvIFBUUlJFTE9DIHRoZSBmdW5jdGlvbiBwb2ludGVyCisJCQkgKiBvbiBwcGM2NCBhcyB3ZSBhcmUgcnVubmluZyBhdCAwIGluIHJlYWwgbW9kZS4KKwkJCSAqLworCQkJaWYgKHMtPmNwdV9zZXR1cCkgeworCQkJCXMtPmNwdV9zZXR1cChvZmZzZXQsIHMpOworCQkJfQorI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLworCQkJcmV0dXJuIHM7CisJCX0KKwlCVUcoKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBkb19mZWF0dXJlX2ZpeHVwcyh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICpmaXh1cF9zdGFydCwgdm9pZCAqZml4dXBfZW5kKQoreworCXN0cnVjdCBmaXh1cF9lbnRyeSB7CisJCXVuc2lnbmVkIGxvbmcJbWFzazsKKwkJdW5zaWduZWQgbG9uZwl2YWx1ZTsKKwkJbG9uZwkJc3RhcnRfb2ZmOworCQlsb25nCQllbmRfb2ZmOworCX0gKmZjdXIsICpmZW5kOworCisJZmN1ciA9IGZpeHVwX3N0YXJ0OworCWZlbmQgPSBmaXh1cF9lbmQ7CisKKwlmb3IgKDsgZmN1ciA8IGZlbmQ7IGZjdXIrKykgeworCQl1bnNpZ25lZCBpbnQgKnBzdGFydCwgKnBlbmQsICpwOworCisJCWlmICgodmFsdWUgJiBmY3VyLT5tYXNrKSA9PSBmY3VyLT52YWx1ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFRoZXNlIFBUUlJFTE9DcyB3aWxsIGRpc2FwcGVhciBvbmNlIHRoZSBuZXcgc2NoZW1lIGZvcgorCQkgKiBtb2R1bGVzIGFuZCB2ZHNvIGlzIGltcGxlbWVudGVkCisJCSAqLworCQlwc3RhcnQgPSAoKHVuc2lnbmVkIGludCAqKWZjdXIpICsgKGZjdXItPnN0YXJ0X29mZiAvIDQpOworCQlwZW5kID0gKCh1bnNpZ25lZCBpbnQgKilmY3VyKSArIChmY3VyLT5lbmRfb2ZmIC8gNCk7CisKKwkJZm9yIChwID0gcHN0YXJ0OyBwIDwgcGVuZDsgcCsrKSB7CisJCQkqcCA9IDB4NjAwMDAwMDB1OworCQkJYXNtIHZvbGF0aWxlICgiZGNic3QgMCwgJTAiIDogOiAiciIgKHApKTsKKwkJfQorCQlhc20gdm9sYXRpbGUgKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJCWZvciAocCA9IHBzdGFydDsgcCA8IHBlbmQ7IHArKykKKwkJCWFzbSB2b2xhdGlsZSAoImljYmkgMCwlMCIgOiA6ICJyIiAocCkpOworCQlhc20gdm9sYXRpbGUgKCJzeW5jOyBpc3luYyIgOiA6IDogIm1lbW9yeSIpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYwppbmRleCAxYWY0MWY3Li5kM2YyMDgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCkBAIC00Niw2MSArNDYsNiBAQAogc3RhdGljIGNwdW1hc2tfdCBjcHVzX2luX2NyYXNoID0gQ1BVX01BU0tfTk9ORTsKIGNwdW1hc2tfdCBjcHVzX2luX3NyID0gQ1BVX01BU0tfTk9ORTsKIAotc3RhdGljIHUzMiAqYXBwZW5kX2VsZl9ub3RlKHUzMiAqYnVmLCBjaGFyICpuYW1lLCB1bnNpZ25lZCB0eXBlLCB2b2lkICpkYXRhLAotCQkJCQkJCSAgICAgICBzaXplX3QgZGF0YV9sZW4pCi17Ci0Jc3RydWN0IGVsZl9ub3RlIG5vdGU7Ci0KLQlub3RlLm5fbmFtZXN6ID0gc3RybGVuKG5hbWUpICsgMTsKLQlub3RlLm5fZGVzY3N6ID0gZGF0YV9sZW47Ci0Jbm90ZS5uX3R5cGUgICA9IHR5cGU7Ci0JbWVtY3B5KGJ1ZiwgJm5vdGUsIHNpemVvZihub3RlKSk7Ci0JYnVmICs9IChzaXplb2Yobm90ZSkgKzMpLzQ7Ci0JbWVtY3B5KGJ1ZiwgbmFtZSwgbm90ZS5uX25hbWVzeik7Ci0JYnVmICs9IChub3RlLm5fbmFtZXN6ICsgMykvNDsKLQltZW1jcHkoYnVmLCBkYXRhLCBub3RlLm5fZGVzY3N6KTsKLQlidWYgKz0gKG5vdGUubl9kZXNjc3ogKyAzKS80OwotCi0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIHZvaWQgZmluYWxfbm90ZSh1MzIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZWxmX25vdGUgbm90ZTsKLQotCW5vdGUubl9uYW1lc3ogPSAwOwotCW5vdGUubl9kZXNjc3ogPSAwOwotCW5vdGUubl90eXBlICAgPSAwOwotCW1lbWNweShidWYsICZub3RlLCBzaXplb2Yobm90ZSkpOwotfQotCi1zdGF0aWMgdm9pZCBjcmFzaF9zYXZlX3RoaXNfY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQotewotCXN0cnVjdCBlbGZfcHJzdGF0dXMgcHJzdGF0dXM7Ci0JdTMyICpidWY7Ci0KLQlpZiAoKGNwdSA8IDApIHx8IChjcHUgPj0gTlJfQ1BVUykpCi0JCXJldHVybjsKLQotCS8qIFVzaW5nIEVMRiBub3RlcyBoZXJlIGlzIG9wcG9ydHVuaXN0aWMuCi0JICogSSBuZWVkIGEgd2VsbCBkZWZpbmVkIHN0cnVjdHVyZSBmb3JtYXQKLQkgKiBmb3IgdGhlIGRhdGEgSSBwYXNzLCBhbmQgSSBuZWVkIHRhZ3MKLQkgKiBvbiB0aGUgZGF0YSB0byBpbmRpY2F0ZSB3aGF0IGluZm9ybWF0aW9uIEkgaGF2ZQotCSAqIHNxdWlycmVsbGVkIGF3YXkuICBFTEYgbm90ZXMgaGFwcGVuIHRvIHByb3ZpZGUKLQkgKiBhbGwgb2YgdGhhdCB0aGF0IG5vIG5lZWQgdG8gaW52ZW50IHNvbWV0aGluZyBuZXcuCi0JICovCi0JYnVmID0gKHUzMiopcGVyX2NwdV9wdHIoY3Jhc2hfbm90ZXMsIGNwdSk7Ci0JaWYgKCFidWYpIAotCQlyZXR1cm47Ci0KLQltZW1zZXQoJnByc3RhdHVzLCAwLCBzaXplb2YocHJzdGF0dXMpKTsKLQlwcnN0YXR1cy5wcl9waWQgPSBjdXJyZW50LT5waWQ7Ci0JZWxmX2NvcmVfY29weV9yZWdzKCZwcnN0YXR1cy5wcl9yZWcsIHJlZ3MpOwotCWJ1ZiA9IGFwcGVuZF9lbGZfbm90ZShidWYsICJDT1JFIiwgTlRfUFJTVEFUVVMsICZwcnN0YXR1cywKLQkJCXNpemVvZihwcnN0YXR1cykpOwotCWZpbmFsX25vdGUoYnVmKTsKLX0KLQogI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyBhdG9taWNfdCBlbnRlcl9vbl9zb2Z0X3Jlc2V0ID0gQVRPTUlDX0lOSVQoMCk7CiAKQEAgLTExMSw5ICs1Niw5IEBACiAJaWYgKCFjcHVfb25saW5lKGNwdSkpCiAJCXJldHVybjsKIAotCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJaGFyZF9pcnFfZGlzYWJsZSgpOwogCWlmICghY3B1X2lzc2V0KGNwdSwgY3B1c19pbl9jcmFzaCkpCi0JCWNyYXNoX3NhdmVfdGhpc19jcHUocmVncywgY3B1KTsKKwkJY3Jhc2hfc2F2ZV9jcHUocmVncywgY3B1KTsKIAljcHVfc2V0KGNwdSwgY3B1c19pbl9jcmFzaCk7CiAKIAkvKgpAQCAtMjg5LDcgKzIzNCw3IEBACiAJICogYW4gU01QIHN5c3RlbS4KIAkgKiBUaGUga2VybmVsIGlzIGJyb2tlbiBzbyBkaXNhYmxlIGludGVycnVwdHMuCiAJICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwloYXJkX2lycV9kaXNhYmxlKCk7CiAKIAlmb3JfZWFjaF9pcnEoaXJxKSB7CiAJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwpAQCAtMzA2LDcgKzI1MSw3IEBACiAJICogc3VjaCB0aGF0IGFub3RoZXIgSVBJIHdpbGwgbm90IGJlIHNlbnQuCiAJICovCiAJY3Jhc2hpbmdfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWNyYXNoX3NhdmVfdGhpc19jcHUocmVncywgY3Jhc2hpbmdfY3B1KTsKKwljcmFzaF9zYXZlX2NwdShyZWdzLCBjcmFzaGluZ19jcHUpOwogCWNyYXNoX2tleGVjX3ByZXBhcmVfY3B1cyhjcmFzaGluZ19jcHUpOwogCWNwdV9zZXQoY3Jhc2hpbmdfY3B1LCBjcHVzX2luX2NyYXNoKTsKIAlpZiAocHBjX21kLmtleGVjX2NwdV9kb3duKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWFfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hXzY0LmMKaW5kZXggNmMxNjhmNi4uN2IwZTc1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWFfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYV82NC5jCkBAIC0xLDE1MSArMSwxOTQgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgSUJNIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnBvcmF0aW9uCiAgKgotICogSW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBkZXZpY2UgZG1hIEFQSSBmb3IgcHBjNjQuIEhhbmRsZXMKLSAqIHRoZSBwY2kgYW5kIHZpbyBidXNzZXMKKyAqIFByb3ZpZGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIERNQSBtYXBwaW5nIGNhbGxiYWNrcyBmb3IKKyAqIGRpcmVjdGx5IG1hcHBlZCBidXNzZXMgYW5kIGJ1c3NlcyB1c2luZyB0aGUgaW9tbXUgaW5mcmFzdHJ1Y3R1cmUKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLS8qIEluY2x1ZGUgdGhlIGJ1c3NlcyB3ZSBzdXBwb3J0ICovCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3Zpby5oPgotI2luY2x1ZGUgPGFzbS9pYm1lYnVzLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgogCi1zdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZ2V0X2RtYV9vcHMoc3RydWN0IGRldmljZSAqZGV2KQorLyoKKyAqIEdlbmVyaWMgaW9tbXUgaW1wbGVtZW50YXRpb24KKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGV2aWNlX3RvX21hc2soc3RydWN0IGRldmljZSAqZGV2KQogewotI2lmZGVmIENPTkZJR19QQ0kKLQlpZiAoZGV2LT5idXMgPT0gJnBjaV9idXNfdHlwZSkKLQkJcmV0dXJuICZwY2lfZG1hX29wczsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19JQk1WSU8KLQlpZiAoZGV2LT5idXMgPT0gJnZpb19idXNfdHlwZSkKLQkJcmV0dXJuICZ2aW9fZG1hX29wczsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19JQk1FQlVTCi0JaWYgKGRldi0+YnVzID09ICZpYm1lYnVzX2J1c190eXBlKQotCQlyZXR1cm4gJmlibWVidXNfZG1hX29wczsKLSNlbmRpZgotCXJldHVybiBOVUxMOworCWlmIChkZXYtPmRtYV9tYXNrICYmICpkZXYtPmRtYV9tYXNrKQorCQlyZXR1cm4gKmRldi0+ZG1hX21hc2s7CisJLyogQXNzdW1lIGRldmljZXMgd2l0aG91dCBtYXNrIGNhbiB0YWtlIDMyIGJpdCBhZGRyZXNzZXMgKi8KKwlyZXR1cm4gMHhmZmZmZmZmZnVsOwogfQogCi1pbnQgZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQorCisvKiBBbGxvY2F0ZXMgYSBjb250aWd1b3VzIHJlYWwgYnVmZmVyIGFuZCBjcmVhdGVzIG1hcHBpbmdzIG92ZXIgaXQuCisgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQgc2V0cyBkbWFfaGFuZGxlCisgKiB0byB0aGUgZG1hIGFkZHJlc3MgKG1hcHBpbmcpIG9mIHRoZSBmaXJzdCBwYWdlLgorICovCitzdGF0aWMgdm9pZCAqZG1hX2lvbW11X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKIHsKLQlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKLQotCUJVR19PTighZG1hX29wcyk7Ci0KLQlyZXR1cm4gZG1hX29wcy0+ZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spOworCXJldHVybiBpb21tdV9hbGxvY19jb2hlcmVudChkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzaXplLCBkbWFfaGFuZGxlLAorCQkJCSAgICBkZXZpY2VfdG9fbWFzayhkZXYpLCBmbGFnLAorCQkJCSAgICBkZXYtPmFyY2hkYXRhLm51bWFfbm9kZSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9zdXBwb3J0ZWQpOwogCi1pbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IGRtYV9tYXNrKQorc3RhdGljIHZvaWQgZG1hX2lvbW11X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKLSNpZmRlZiBDT05GSUdfUENJCi0JaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCi0JCXJldHVybiBwY2lfc2V0X2RtYV9tYXNrKHRvX3BjaV9kZXYoZGV2KSwgZG1hX21hc2spOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lCTVZJTwotCWlmIChkZXYtPmJ1cyA9PSAmdmlvX2J1c190eXBlKQotCQlyZXR1cm4gLUVJTzsKLSNlbmRpZiAvKiBDT05GSUdfSUJNVklPICovCi0jaWZkZWYgQ09ORklHX0lCTUVCVVMKLQlpZiAoZGV2LT5idXMgPT0gJmlibWVidXNfYnVzX3R5cGUpCi0JCXJldHVybiAtRUlPOwotI2VuZGlmCi0JQlVHKCk7Ci0JcmV0dXJuIDA7CisJaW9tbXVfZnJlZV9jb2hlcmVudChkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9zZXRfbWFzayk7CiAKLXZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQorLyogQ3JlYXRlcyBUQ0VzIGZvciBhIHVzZXIgcHJvdmlkZWQgYnVmZmVyLiAgVGhlIHVzZXIgYnVmZmVyIG11c3QgYmUKKyAqIGNvbnRpZ3VvdXMgcmVhbCBrZXJuZWwgc3RvcmFnZSAobm90IHZtYWxsb2MpLiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogcGFzc2VkIGhlcmUgaXMgdGhlIGtlcm5lbCAodmlydHVhbCkgYWRkcmVzcyBvZiB0aGUgYnVmZmVyLiAgVGhlIGJ1ZmZlcgorICogbmVlZCBub3QgYmUgcGFnZSBhbGlnbmVkLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCB3aWxsIHBvaW50IHRvIHRoZSBzYW1lCisgKiBieXRlIHdpdGhpbiB0aGUgcGFnZSBhcyB2YWRkci4KKyAqLworc3RhdGljIGRtYV9hZGRyX3QgZG1hX2lvbW11X21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwKKwkJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKLQotCUJVR19PTighZG1hX29wcyk7Ci0KLQlyZXR1cm4gZG1hX29wcy0+YWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBmbGFnKTsKKwlyZXR1cm4gaW9tbXVfbWFwX3NpbmdsZShkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCB2YWRkciwgc2l6ZSwKKwkJCSAgICAgICAgZGV2aWNlX3RvX21hc2soZGV2KSwgZGlyZWN0aW9uKTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2NvaGVyZW50KTsKIAotdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHVfYWRkciwKLQkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQorCitzdGF0aWMgdm9pZCBkbWFfaW9tbXVfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCSAgIHNpemVfdCBzaXplLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKLQotCUJVR19PTighZG1hX29wcyk7Ci0KLQlkbWFfb3BzLT5mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworCWlvbW11X3VubWFwX3NpbmdsZShkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBkbWFfaGFuZGxlLCBzaXplLCBkaXJlY3Rpb24pOwogfQotRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CiAKLWRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpjcHVfYWRkciwgc2l6ZV90IHNpemUsCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKKworc3RhdGljIGludCBkbWFfaW9tbXVfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCQkgICAgaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwotCi0JQlVHX09OKCFkbWFfb3BzKTsKLQotCXJldHVybiBkbWFfb3BzLT5tYXBfc2luZ2xlKGRldiwgY3B1X2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisJcmV0dXJuIGlvbW11X21hcF9zZyhkZXYtPmFyY2hkYXRhLmRtYV9kYXRhLCBzZ2xpc3QsIG5lbGVtcywKKwkJCSAgICBkZXZpY2VfdG9fbWFzayhkZXYpLCBkaXJlY3Rpb24pOwogfQotRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NpbmdsZSk7CiAKLXZvaWQgZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCitzdGF0aWMgdm9pZCBkbWFfaW9tbXVfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKKwkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwotCi0JQlVHX09OKCFkbWFfb3BzKTsKLQotCWRtYV9vcHMtPnVubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCWlvbW11X3VubWFwX3NnKGRldi0+YXJjaGRhdGEuZG1hX2RhdGEsIHNnbGlzdCwgbmVsZW1zLCBkaXJlY3Rpb24pOwogfQotRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfc2luZ2xlKTsKIAotZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCisvKiBXZSBzdXBwb3J0IERNQSB0by9mcm9tIGFueSBtZW1vcnkgcGFnZSB2aWEgdGhlIGlvbW11ICovCitzdGF0aWMgaW50IGRtYV9pb21tdV9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCiB7Ci0Jc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisJc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBkZXYtPmFyY2hkYXRhLmRtYV9kYXRhOwogCi0JQlVHX09OKCFkbWFfb3BzKTsKLQotCXJldHVybiBkbWFfb3BzLT5tYXBfc2luZ2xlKGRldiwgcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0LCBzaXplLAotCQkJZGlyZWN0aW9uKTsKKwlpZiAoIXRibCB8fCB0YmwtPml0X29mZnNldCA+IG1hc2spIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIldhcm5pbmc6IElPTU1VIG9mZnNldCB0b28gYmlnIGZvciBkZXZpY2UgbWFza1xuIik7CisJCWlmICh0YmwpCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIm1hc2s6IDB4JTA4bHgsIHRhYmxlIG9mZnNldDogMHglMDhseFxuIiwKKwkJCQltYXNrLCB0YmwtPml0X29mZnNldCk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gIm1hc2s6IDB4JTA4bHgsIHRhYmxlIHVuYXZhaWxhYmxlXG4iLAorCQkJCW1hc2spOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDE7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9tYXBfcGFnZSk7CiAKLXZvaWQgZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwKLQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQorc3RydWN0IGRtYV9tYXBwaW5nX29wcyBkbWFfaW9tbXVfb3BzID0geworCS5hbGxvY19jb2hlcmVudAk9IGRtYV9pb21tdV9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudAk9IGRtYV9pb21tdV9mcmVlX2NvaGVyZW50LAorCS5tYXBfc2luZ2xlCT0gZG1hX2lvbW11X21hcF9zaW5nbGUsCisJLnVubWFwX3NpbmdsZQk9IGRtYV9pb21tdV91bm1hcF9zaW5nbGUsCisJLm1hcF9zZwkJPSBkbWFfaW9tbXVfbWFwX3NnLAorCS51bm1hcF9zZwk9IGRtYV9pb21tdV91bm1hcF9zZywKKwkuZG1hX3N1cHBvcnRlZAk9IGRtYV9pb21tdV9kbWFfc3VwcG9ydGVkLAorfTsKK0VYUE9SVF9TWU1CT0woZG1hX2lvbW11X29wcyk7CisKKy8qCisgKiBHZW5lcmljIGRpcmVjdCBETUEgaW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGEgZ2xvYmFsIG9mZnNldCB0aGF0IGNhbiBiZSBhcHBsaWVkIGlmCisgKiB0aGUgYWRkcmVzcyBhdCB3aGljaCBtZW1vcnkgaXMgdmlzaWJsZSB0byBkZXZpY2VzIGlzIG5vdCAwLgorICovCit1bnNpZ25lZCBsb25nIGRtYV9kaXJlY3Rfb2Zmc2V0OworCitzdGF0aWMgdm9pZCAqZG1hX2RpcmVjdF9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQogewotCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKnJldDsKKwlpbnQgbm9kZSA9IGRldi0+YXJjaGRhdGEubnVtYV9ub2RlOwogCi0JQlVHX09OKCFkbWFfb3BzKTsKKwkvKiBUT0RPOiBNYXliZSB1c2UgdGhlIG51bWEgbm9kZSBoZXJlIHRvbyA/ICovCisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgZmxhZywgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAocGFnZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXQgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2FicyhyZXQpIHwgZG1hX2RpcmVjdF9vZmZzZXQ7CiAKLQlkbWFfb3BzLT51bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkcmVzcywgc2l6ZSwgZGlyZWN0aW9uKTsKKwlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChkbWFfdW5tYXBfcGFnZSk7CiAKLWludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCitzdGF0aWMgdm9pZCBkbWFfZGlyZWN0X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCiB7Ci0Jc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7Ci0KLQlCVUdfT04oIWRtYV9vcHMpOwotCi0JcmV0dXJuIGRtYV9vcHMtPm1hcF9zZyhkZXYsIHNnLCBuZW50cywgZGlyZWN0aW9uKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwogfQotRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NnKTsKIAotdm9pZCBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmh3ZW50cmllcywKLQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQorc3RhdGljIGRtYV9hZGRyX3QgZG1hX2RpcmVjdF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLAorCQkJCQlzaXplX3Qgc2l6ZSwKKwkJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOwotCi0JQlVHX09OKCFkbWFfb3BzKTsKLQotCWRtYV9vcHMtPnVubWFwX3NnKGRldiwgc2csIG5od2VudHJpZXMsIGRpcmVjdGlvbik7CisJcmV0dXJuIHZpcnRfdG9fYWJzKHB0cikgfCBkbWFfZGlyZWN0X29mZnNldDsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX3VubWFwX3NnKTsKKworc3RhdGljIHZvaWQgZG1hX2RpcmVjdF91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJCSAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworfQorCitzdGF0aWMgaW50IGRtYV9kaXJlY3RfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgeworCQlzZy0+ZG1hX2FkZHJlc3MgPSAocGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQpIHwKKwkJCWRtYV9kaXJlY3Rfb2Zmc2V0OworCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7CisJfQorCisJcmV0dXJuIG5lbnRzOworfQorCitzdGF0aWMgdm9pZCBkbWFfZGlyZWN0X3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKK30KKworc3RhdGljIGludCBkbWFfZGlyZWN0X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwkvKiBDb3VsZCBiZSBpbXByb3ZlZCB0byBjaGVjayBmb3IgbWVtb3J5IHRob3VnaCBpdCBiZXR0ZXIgYmUKKwkgKiBkb25lIHZpYSBzb21lIGdsb2JhbCBzbyBwbGF0Zm9ybXMgY2FuIHNldCB0aGUgbGltaXQgaW4gY2FzZQorCSAqIHRoZXkgaGF2ZSBsaW1pdGVkIERNQSB3aW5kb3dzCisJICovCisJcmV0dXJuIG1hc2sgPj0gRE1BXzMyQklUX01BU0s7Cit9CisKK3N0cnVjdCBkbWFfbWFwcGluZ19vcHMgZG1hX2RpcmVjdF9vcHMgPSB7CisJLmFsbG9jX2NvaGVyZW50CT0gZG1hX2RpcmVjdF9hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudAk9IGRtYV9kaXJlY3RfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NpbmdsZQk9IGRtYV9kaXJlY3RfbWFwX3NpbmdsZSwKKwkudW5tYXBfc2luZ2xlCT0gZG1hX2RpcmVjdF91bm1hcF9zaW5nbGUsCisJLm1hcF9zZwkJPSBkbWFfZGlyZWN0X21hcF9zZywKKwkudW5tYXBfc2cJPSBkbWFfZGlyZWN0X3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkCT0gZG1hX2RpcmVjdF9kbWFfc3VwcG9ydGVkLAorfTsKK0VYUE9SVF9TWU1CT0woZG1hX2RpcmVjdF9vcHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCmluZGV4IDc0OGU3NGYuLjFhM2Q0ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKQEAgLTg3LDE1ICs4NywxOSBAQAogCWFkZGkJcjkscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlsZAlyMTEsZXhjZXB0aW9uX21hcmtlckB0b2MocjIpCiAJc3RkCXIxMSwtMTYocjkpCQkvKiAicmVnc2hlcmUiIG1hcmtlciAqLworCWxpCXIxMCwxCisJc3RiCXIxMCxQQUNBU09GVElSUUVOKHIxMykKKwlzdGIJcjEwLFBBQ0FIQVJESVJRRU4ocjEzKQorCXN0ZAlyMTAsU09GVEUocjEpCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiBCRUdJTl9GV19GVFJfU0VDVElPTgogCS8qIEhhY2sgZm9yIGhhbmRsaW5nIGludGVycnVwdHMgd2hlbiBzb2Z0LWVuYWJsaW5nIG9uIGlTZXJpZXMgKi8KIAljbXBkaQljcjEscjAsMHg1NTU1CQkvKiBzeXNjYWxsIDB4NTU1NSAqLwogCWFuZGkuCXIxMCxyMTIsTVNSX1BSCQkvKiBmcm9tIGtlcm5lbCAqLwogCWNyYW5kCTQqY3IwK2VxLDQqY3IxK2VxLDQqY3IwK2VxCi0JYmVxCWhhcmR3YXJlX2ludGVycnVwdF9lbnRyeQotCWxieglyMTAsUEFDQVBST0NFTkFCTEVEKHIxMykKLQlzdGQJcjEwLFNPRlRFKHIxKQorCWJuZQkyZgorCWIJaGFyZHdhcmVfaW50ZXJydXB0X2VudHJ5CisyOgogRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUykKICNlbmRpZgogCW1mbXNyCXIxMQpAQCAtNDYwLDkgKzQ2NCw5IEBACiAjZW5kaWYKIAogcmVzdG9yZToKKwlsZAlyNSxTT0ZURShyMSkKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKIEJFR0lOX0ZXX0ZUUl9TRUNUSU9OCi0JbGQJcjUsU09GVEUocjEpCiAJY21wZGkJMCxyNSwwCiAJYmVxCTRmCiAJLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cyAoaVNlcmllcykgKi8KQEAgLTQ3MiwyMSArNDc2LDI1IEBACiAJYmVxKwk0ZgkJCS8qIHNraXAgZG9fSVJRIGlmIG5vIGludGVycnVwdHMgKi8KIAogCWxpCXIzLDAKLQlzdGIJcjMsUEFDQVBST0NFTkFCTEVEKHIxMykJLyogZW5zdXJlIHdlIGFyZSBzb2Z0LWRpc2FibGVkICovCisJc3RiCXIzLFBBQ0FTT0ZUSVJRRU4ocjEzKQkvKiBlbnN1cmUgd2UgYXJlIHNvZnQtZGlzYWJsZWQgKi8KIAlvcmkJcjEwLHIxMCxNU1JfRUUKIAltdG1zcmQJcjEwCQkJLyogaGFyZC1lbmFibGUgYWdhaW4gKi8KIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJLmRvX0lSUQogCWIJLnJldF9mcm9tX2V4Y2VwdF9saXRlCQkvKiBsb29wIGJhY2sgYW5kIGhhbmRsZSBtb3JlICovCi0KLTQ6CXN0YglyNSxQQUNBUFJPQ0VOQUJMRUQocjEzKQorNDoKIEVORF9GV19GVFJfU0VDVElPTl9JRlNFVChGV19GRUFUVVJFX0lTRVJJRVMpCiAjZW5kaWYKKwlzdGIJcjUsUEFDQVNPRlRJUlFFTihyMTMpCiAKIAlsZAlyMyxfTVNSKHIxKQogCWFuZGkuCXIwLHIzLE1TUl9SSQogCWJlcS0JdW5yZWNvdl9yZXN0b3JlCiAKKwkvKiBleHRyYWN0IEVFIGJpdCBhbmQgdXNlIGl0IHRvIHJlc3RvcmUgcGFjYS0+aGFyZF9lbmFibGVkICovCisJcmxkaWNsCXI0LHIzLDQ5LDYzCQkvKiByMCA9IChyMyA+PiAxNSkgJiAxICovCisJc3RiCXI0LFBBQ0FIQVJESVJRRU4ocjEzKQorCiAJYW5kaS4JcjAscjMsTVNSX1BSCiAKIAkvKgpAQCAtNTM4LDI1ICs1NDYsMTUgQEAKIAkvKiBDaGVjayB0aGF0IHByZWVtcHRfY291bnQoKSA9PSAwIGFuZCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkICovCiAJbHd6CXI4LFRJX1BSRUVNUFQocjkpCiAJY21wd2kJY3IxLHI4LDAKLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLUJFR0lOX0ZXX0ZUUl9TRUNUSU9OCiAJbGQJcjAsU09GVEUocjEpCiAJY21wZGkJcjAsMAotRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUykKLSNlbmRpZgotQkVHSU5fRldfRlRSX1NFQ1RJT04KLQlhbmRpLglyMCxyMyxNU1JfRUUKLUVORF9GV19GVFJfU0VDVElPTl9JRkNMUihGV19GRUFUVVJFX0lTRVJJRVMpCiAJY3JhbmRjCWVxLGNyMSo0K2VxLGVxCiAJYm5lCXJlc3RvcmUKIAkvKiBoZXJlIHdlIGFyZSBwcmVlbXB0aW5nIHRoZSBjdXJyZW50IHRhc2sgKi8KIDE6Ci0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi1CRUdJTl9GV19GVFJfU0VDVElPTgogCWxpCXIwLDEKLQlzdGIJcjAsUEFDQVBST0NFTkFCTEVEKHIxMykKLUVORF9GV19GVFJfU0VDVElPTl9JRlNFVChGV19GRUFUVVJFX0lTRVJJRVMpCi0jZW5kaWYKKwlzdGIJcjAsUEFDQVNPRlRJUlFFTihyMTMpCisJc3RiCXIwLFBBQ0FIQVJESVJRRU4ocjEzKQogCW9yaQlyMTAscjEwLE1TUl9FRQogCW10bXNyZAlyMTAsMQkJLyogcmVlbmFibGUgaW50ZXJydXB0cyAqLwogCWJsCS5wcmVlbXB0X3NjaGVkdWxlCkBAIC02MzksOCArNjM3LDcgQEAKIAkvKiBUaGVyZSBpcyBubyB3YXkgaXQgaXMgYWNjZXB0YWJsZSB0byBnZXQgaGVyZSB3aXRoIGludGVycnVwdHMgZW5hYmxlZCwKIAkgKiBjaGVjayBpdCB3aXRoIHRoZSBhc20gZXF1aXZhbGVudCBvZiBXQVJOX09OCiAJICovCi0JbWZtc3IJcjYKLQlhbmRpLglyMCxyNixNU1JfRUUKKwlsYnoJcjAsUEFDQVNPRlRJUlFFTihyMTMpCiAxOgl0ZG5laQlyMCwwCiAuc2VjdGlvbiBfX2J1Z190YWJsZSwiYSIKIAkubGxvbmcJMWIsX19MSU5FX18gKyAweDEwMDAwMDAsIDFmLCAyZgpAQCAtNjQ5LDcgKzY0NiwxMyBAQAogMToJLmFzY2l6CV9fRklMRV9fCiAyOgkuYXNjaXogImVudGVyX3J0YXMiCiAucHJldmlvdXMKLQkKKworCS8qIEhhcmQtZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbWZtc3IJcjYKKwlybGRpY2wJcjcscjYsNDgsMQorCXJvdGxkaQlyNyxyNywxNgorCW10bXNyZAlyNywxCisKIAkvKiBVbmZvcnR1bmF0ZWx5LCB0aGUgc3RhY2sgcG9pbnRlciBhbmQgdGhlIE1TUiBhcmUgYWxzbyBjbG9iYmVyZWQsCiAJICogc28gdGhleSBhcmUgc2F2ZWQgaW4gdGhlIFBBQ0Egd2hpY2ggYWxsb3dzIHVzIHRvIHJlc3RvcmUKIAkgKiBvdXIgb3JpZ2luYWwgc3RhdGUgYWZ0ZXIgUlRBUyByZXR1cm5zLgpAQCAtNzM1LDggKzczOCw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1JUQVMgKi8KIAotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQotCiBfR0xPQkFMKGVudGVyX3Byb20pCiAJbWZscglyMAogCXN0ZAlyMCwxNihyMSkKQEAgLTgyMSw1ICs4MjIsMyBAQAogCWxkCXIwLDE2KHIxKQogCW10bHIgICAgcjAKICAgICAgICAgYmxyCi0JCi0jZW5kaWYJLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TCmluZGV4IGQ4OGUxODIuLjk0MTdjZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TCkBAIC00MzcsNiArNDM3LDEzIEBACiAvKiBGbG9hdGluZy1wb2ludCB1bmF2YWlsYWJsZSAqLwogCS4gPSAweDgwMAogRlBVbmF2YWlsYWJsZToKK0JFR0lOX0ZUUl9TRUNUSU9OCisvKgorICogQ2VydGFpbiBGcmVlc2NhbGUgY29yZXMgZG9uJ3QgaGF2ZSBhIEZQVSBhbmQgdHJlYXQgZnAgaW5zdHJ1Y3Rpb25zCisgKiBhcyBhIEZQIFVuYXZhaWxhYmxlIGV4Y2VwdGlvbi4gIFJlZGlyZWN0IHRvIGlsbGVnYWwvZW11bGF0aW9uIGhhbmRsaW5nLgorICovCisJYiAJUHJvZ3JhbUNoZWNrCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9GUFVfVU5BVkFJTEFCTEUpCiAJRVhDRVBUSU9OX1BST0xPRwogCWJuZQlsb2FkX3VwX2ZwdQkJLyogaWYgZnJvbSB1c2VyLCBqdXN0IGxvYWQgaXQgdXAgKi8KIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IDY0NWM3ZjEuLjcxYjFmZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCkBAIC0zNSw5ICszNSw3IEBACiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAKLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKICNkZWZpbmUgRE9fU09GVF9ESVNBQkxFCi0jZW5kaWYKIAogLyoKICAqIFdlIGxheW91dCBwaHlzaWNhbCBtZW1vcnkgYXMgZm9sbG93czoKQEAgLTc0LDEzICs3MiwxMSBAQAogCS50ZXh0CiAJLmdsb2JsICBfc3RleHQKIF9zdGV4dDoKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIF9HTE9CQUwoX19zdGFydCkKIAkvKiBOT1AgdGhpcyBvdXQgdW5jb25kaXRpb25hbGx5ICovCiBCRUdJTl9GVFJfU0VDVElPTgogCWIJLl9fc3RhcnRfaW5pdGlhbGl6YXRpb25fbXVsdGlwbGF0Zm9ybQogRU5EX0ZUUl9TRUNUSU9OKDAsIDEpCi0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCiAKIAkvKiBDYXRjaCBicmFuY2ggdG8gMCBpbiByZWFsIG1vZGUgKi8KIAl0cmFwCkBAIC0zMDgsNyArMzA0LDkgQEAKIAlzdGQJcjksX0xJTksocjEpOwkJCQkJCSAgIFwKIAltZmN0cglyMTA7CQkJLyogc2F2ZSBDVFIgaW4gc3RhY2tmcmFtZQkqLyBcCiAJc3RkCXIxMCxfQ1RSKHIxKTsJCQkJCQkgICBcCisJbGJ6CXIxMCxQQUNBU09GVElSUUVOKHIxMyk7CQkJCSAgIFwKIAltZnNwcglyMTEsU1BSTl9YRVI7CQkvKiBzYXZlIFhFUiBpbiBzdGFja2ZyYW1lCSovIFwKKwlzdGQJcjEwLFNPRlRFKHIxKTsJCQkJCQkgICBcCiAJc3RkCXIxMSxfWEVSKHIxKTsJCQkJCQkgICBcCiAJbGkJcjksKG4pKzE7CQkJCQkJICAgXAogCXN0ZAlyOSxfVFJBUChyMSk7CQkvKiBzZXQgdHJhcCBudW1iZXIJCSovIFwKQEAgLTM0Myw2ICszNDEsMzQgQEAKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgbGFiZWwjI19jb21tb24pCiAKIAorI2RlZmluZSBNQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUyhuLCBsYWJlbCkJCQkJXAorCS4gPSBuOwkJCQkJCQkJXAorCS5nbG9ibCBsYWJlbCMjX3BTZXJpZXM7CQkJCQkJXAorbGFiZWwjI19wU2VyaWVzOgkJCQkJCQlcCisJSE1UX01FRElVTTsJCQkJCQkJXAorCW10c3ByCVNQUk5fU1BSRzEscjEzOwkJLyogc2F2ZSByMTMgKi8JCQlcCisJbWZzcHIJcjEzLFNQUk5fU1BSRzM7CQkvKiBnZXQgcGFjYSBhZGRyZXNzIGludG8gcjEzICovCVwKKwlzdGQJcjksUEFDQV9FWEdFTitFWF9SOShyMTMpOwkvKiBzYXZlIHI5LCByMTAgKi8JXAorCXN0ZAlyMTAsUEFDQV9FWEdFTitFWF9SMTAocjEzKTsJCQkJXAorCWxieglyMTAsUEFDQVNPRlRJUlFFTihyMTMpOwkJCQkJXAorCW1mY3IJcjk7CQkJCQkJCVwKKwljbXB3aQlyMTAsMDsJCQkJCQkJXAorCWJlcQltYXNrZWRfaW50ZXJydXB0OwkJCQkJXAorCW1mc3ByCXIxMCxTUFJOX1NQUkcxOwkJCQkJCVwKKwlzdGQJcjEwLFBBQ0FfRVhHRU4rRVhfUjEzKHIxMyk7CQkJCVwKKwlzdGQJcjExLFBBQ0FfRVhHRU4rRVhfUjExKHIxMyk7CQkJCVwKKwlzdGQJcjEyLFBBQ0FfRVhHRU4rRVhfUjEyKHIxMyk7CQkJCVwKKwljbHJyZGkJcjEyLHIxMywzMjsJCS8qIGdldCBoaWdoIHBhcnQgb2YgJmxhYmVsICovCVwKKwltZm1zcglyMTA7CQkJCQkJCVwKKwltZnNwcglyMTEsU1BSTl9TUlIwOwkJLyogc2F2ZSBTUlIwICovCQkJXAorCUxPQURfSEFORExFUihyMTIsbGFiZWwjI19jb21tb24pCQkJCVwKKwlvcmkJcjEwLHIxMCxNU1JfSVJ8TVNSX0RSfE1TUl9SSTsJCQkJXAorCW10c3ByCVNQUk5fU1JSMCxyMTI7CQkJCQkJXAorCW1mc3ByCXIxMixTUFJOX1NSUjE7CQkvKiBhbmQgU1JSMSAqLwkJCVwKKwltdHNwcglTUFJOX1NSUjEscjEwOwkJCQkJCVwKKwlyZmlkOwkJCQkJCQkJXAorCWIJLgkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLworCiAjZGVmaW5lIFNURF9FWENFUFRJT05fSVNFUklFUyhuLCBsYWJlbCwgYXJlYSkJCVwKIAkuZ2xvYmwgbGFiZWwjI19pU2VyaWVzOwkJCQlcCiBsYWJlbCMjX2lTZXJpZXM6CQkJCQlcCkBAIC0zNTgsNDAgKzM4NCwzMiBAQAogCUhNVF9NRURJVU07CQkJCQkJCVwKIAltdHNwcglTUFJOX1NQUkcxLHIxMzsJCS8qIHNhdmUgcjEzICovCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfSVNFUklFU18xKFBBQ0FfRVhHRU4pOwkJCQlcCi0JbGJ6CXIxMCxQQUNBUFJPQ0VOQUJMRUQocjEzKTsJCQkJXAorCWxieglyMTAsUEFDQVNPRlRJUlFFTihyMTMpOwkJCQkJXAogCWNtcHdpCTAscjEwLDA7CQkJCQkJXAogCWJlcS0JbGFiZWwjI19pU2VyaWVzX21hc2tlZDsJCQkJCVwKIAlFWENFUFRJT05fUFJPTE9HX0lTRVJJRVNfMjsJCQkJCVwKIAliCWxhYmVsIyNfY29tbW9uOwkJCQkJCVwKIAotI2lmZGVmIERPX1NPRlRfRElTQUJMRQorI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogI2RlZmluZSBESVNBQkxFX0lOVFMJCQkJXAotQkVHSU5fRldfRlRSX1NFQ1RJT047CQkJCVwKLQlsYnoJcjEwLFBBQ0FQUk9DRU5BQkxFRChyMTMpOwlcCiAJbGkJcjExLDA7CQkJCVwKLQlzdGQJcjEwLFNPRlRFKHIxKTsJCQlcCisJc3RiCXIxMSxQQUNBU09GVElSUUVOKHIxMyk7CQlcCitCRUdJTl9GV19GVFJfU0VDVElPTjsJCQkJXAorCXN0YglyMTEsUEFDQUhBUkRJUlFFTihyMTMpOwkJXAorRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGQ0xSKEZXX0ZFQVRVUkVfSVNFUklFUyk7CVwKK0JFR0lOX0ZXX0ZUUl9TRUNUSU9OOwkJCQlcCiAJbWZtc3IJcjEwOwkJCQlcCi0Jc3RiCXIxMSxQQUNBUFJPQ0VOQUJMRUQocjEzKTsJXAogCW9yaQlyMTAscjEwLE1TUl9FRTsJCQlcCiAJbXRtc3JkCXIxMCwxOwkJCQlcCiBFTkRfRldfRlRSX1NFQ1RJT05fSUZTRVQoRldfRkVBVFVSRV9JU0VSSUVTKQogCi0jZGVmaW5lIEVOQUJMRV9JTlRTCQkJCVwKLUJFR0lOX0ZXX0ZUUl9TRUNUSU9OOwkJCQlcCi0JbGJ6CXIxMCxQQUNBUFJPQ0VOQUJMRUQocjEzKTsJXAotCW1mbXNyCXIxMTsJCQkJXAotCXN0ZAlyMTAsU09GVEUocjEpOwkJCVwKLQlvcmkJcjExLHIxMSxNU1JfRUU7CQkJXAotRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUyk7CVwKLUJFR0lOX0ZXX0ZUUl9TRUNUSU9OOwkJCQlcCi0JbGQJcjEyLF9NU1IocjEpOwkJCVwKLQltZm1zcglyMTE7CQkJCVwKLQlybHdpbWkJcjExLHIxMiwwLE1TUl9FRTsJCVwKLUVORF9GV19GVFJfU0VDVElPTl9JRkNMUihGV19GRUFUVVJFX0lTRVJJRVMpOwlcCi0JbXRtc3JkCXIxMSwxCisjZWxzZQorI2RlZmluZSBESVNBQkxFX0lOVFMJCQkJXAorCWxpCXIxMSwwOwkJCQlcCisJc3RiCXIxMSxQQUNBU09GVElSUUVOKHIxMyk7CQlcCisJc3RiCXIxMSxQQUNBSEFSRElSUUVOKHIxMykKIAotI2Vsc2UJLyogaGFyZCBlbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIERJU0FCTEVfSU5UUworI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwogCiAjZGVmaW5lIEVOQUJMRV9JTlRTCQkJCVwKIAlsZAlyMTIsX01TUihyMSk7CQkJXApAQCAtMzk5LDggKzQxNyw2IEBACiAJcmx3aW1pCXIxMSxyMTIsMCxNU1JfRUU7CQlcCiAJbXRtc3JkCXIxMSwxCiAKLSNlbmRpZgotCiAjZGVmaW5lIFNURF9FWENFUFRJT05fQ09NTU9OKHRyYXAsIGxhYmVsLCBoZGxyKQkJXAogCS5hbGlnbgk3OwkJCQkJXAogCS5nbG9ibCBsYWJlbCMjX2NvbW1vbjsJCQkJXApAQCAtNDg3LDcgKzUwMyw3IEBACiAJcmx3aW1pCXIxMyxyMTIsMTYsMHgyMAogCW1mY3IJcjEyCiAJY21wd2kJcjEzLDB4MmMKLQliZXEJLmRvX3N0YWJfYm9sdGVkX3BTZXJpZXMKKwliZXEJZG9fc3RhYl9ib2x0ZWRfcFNlcmllcwogCW10Y3JmCTB4ODAscjEyCiAJbWZzcHIJcjEyLFNQUk5fU1BSRzIKIEVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NMQikKQEAgLTU0MSwxMSArNTU3LDExIEBACiAJbWZzcHIJcjEyLFNQUk5fU1JSMQkJLyogYW5kIFNSUjEgKi8KIAliCS5zbGJfbWlzc19yZWFsbW9kZQkvKiBSZWwuIGJyYW5jaCB3b3JrcyBpbiByZWFsIG1vZGUgKi8KIAotCVNURF9FWENFUFRJT05fUFNFUklFUygweDUwMCwgaGFyZHdhcmVfaW50ZXJydXB0KQorCU1BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTAwLCBoYXJkd2FyZV9pbnRlcnJ1cHQpCiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4NjAwLCBhbGlnbm1lbnQpCiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4NzAwLCBwcm9ncmFtX2NoZWNrKQogCVNURF9FWENFUFRJT05fUFNFUklFUygweDgwMCwgZnBfdW5hdmFpbGFibGUpCi0JU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4OTAwLCBkZWNyZW1lbnRlcikKKwlNQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUygweDkwMCwgZGVjcmVtZW50ZXIpCiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4YTAwLCB0cmFwXzBhKQogCVNURF9FWENFUFRJT05fUFNFUklFUygweGIwMCwgdHJhcF8wYikKIApAQCAtNTk3LDEwICs2MTMsMjcgQEAKIC8qKiogcFNlcmllcyBpbnRlcnJ1cHQgc3VwcG9ydCAqKiovCiAKIAkvKiBtb3ZlZCBmcm9tIDB4ZjAwICovCi0JU1REX0VYQ0VQVElPTl9QU0VSSUVTKC4sIHBlcmZvcm1hbmNlX21vbml0b3IpCisJTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVMoLiwgcGVyZm9ybWFuY2VfbW9uaXRvcikKKworLyoKKyAqIEFuIGludGVycnVwdCBjYW1lIGluIHdoaWxlIHNvZnQtZGlzYWJsZWQ7IGNsZWFyIEVFIGluIFNSUjEsCisgKiBjbGVhciBwYWNhLT5oYXJkX2VuYWJsZWQgYW5kIHJldHVybi4KKyAqLworbWFza2VkX2ludGVycnVwdDoKKwlzdGIJcjEwLFBBQ0FIQVJESVJRRU4ocjEzKQorCW10Y3JmCTB4ODAscjkKKwlsZAlyOSxQQUNBX0VYR0VOK0VYX1I5KHIxMykKKwltZnNwcglyMTAsU1BSTl9TUlIxCisJcmxkaWNsCXIxMCxyMTAsNDgsMQkJLyogY2xlYXIgTVNSX0VFICovCisJcm90bGRpCXIxMCxyMTAsMTYKKwltdHNwcglTUFJOX1NSUjEscjEwCisJbGQJcjEwLFBBQ0FfRVhHRU4rRVhfUjEwKHIxMykKKwltZnNwcglyMTMsU1BSTl9TUFJHMQorCXJmaWQKKwliCS4KIAogCS5hbGlnbgk3Ci1fR0xPQkFMKGRvX3N0YWJfYm9sdGVkX3BTZXJpZXMpCitkb19zdGFiX2JvbHRlZF9wU2VyaWVzOgogCW10Y3JmCTB4ODAscjEyCiAJbWZzcHIJcjEyLFNQUk5fU1BSRzIKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWFNMQiwgLmRvX3N0YWJfYm9sdGVkKQpAQCAtNzkyLDcgKzgyNSw3IEBACiAKIAljbXB3aQkwLHIyMywwCiAJYmVxCWlTZXJpZXNfc2Vjb25kYXJ5X3NtcF9sb29wCS8qIExvb3AgdW50aWwgdG9sZCB0byBnbyAqLwotCWJuZQkuX19zZWNvbmRhcnlfc3RhcnQJCS8qIExvb3AgdW50aWwgdG9sZCB0byBnbyAqLworCWJuZQlfX3NlY29uZGFyeV9zdGFydAkJLyogTG9vcCB1bnRpbCB0b2xkIHRvIGdvICovCiBpU2VyaWVzX3NlY29uZGFyeV9zbXBfbG9vcDoKIAkvKiBMZXQgdGhlIEh5cGVydmlzb3Iga25vdyB3ZSBhcmUgYWxpdmUgKi8KIAkvKiA4MDAyIGlzIGEgY2FsbCB0byBIdkNhbGxDZmc6OmdldExwcywgYSBoYXJtbGVzcyBIeXBlcnZpc29yIGZ1bmN0aW9uICovCkBAIC04MTMsNyArODQ2LDYgQEAKIAliCTFiCQkJLyogSWYgU01QIG5vdCBjb25maWd1cmVkLCBzZWNvbmRhcmllcwogCQkJCQkgKiBsb29wIGZvcmV2ZXIgKi8KIAotCS5nbG9ibCBkZWNyZW1lbnRlcl9pU2VyaWVzX21hc2tlZAogZGVjcmVtZW50ZXJfaVNlcmllc19tYXNrZWQ6CiAJLyogV2UgbWF5IG5vdCBoYXZlIGEgdmFsaWQgVE9DIHBvaW50ZXIgaW4gaGVyZS4gKi8KIAlsaQlyMTEsMQpAQCAtODI0LDcgKzg1Niw2IEBACiAJbXRzcHIJU1BSTl9ERUMscjEyCiAJLyogZmFsbCB0aHJvdWdoICovCiAKLQkuZ2xvYmwgaGFyZHdhcmVfaW50ZXJydXB0X2lTZXJpZXNfbWFza2VkCiBoYXJkd2FyZV9pbnRlcnJ1cHRfaVNlcmllc19tYXNrZWQ6CiAJbXRjcmYJMHg4MCxyOQkJLyogUmVzdG9yZSByZWdzICovCiAJbGQJcjEyLFBBQ0FMUFBBQ0FQVFIocjEzKQpAQCAtOTI2LDEwICs5NTcsMTggQEAKICAqIGFueSB0YXNrIG9yIHNlbnQgYW55IHRhc2sgYSBzaWduYWwsIHlvdSBzaG91bGQgdXNlCiAgKiByZXRfZnJvbV9leGNlcHQgb3IgcmV0X2Zyb21fZXhjZXB0X2xpdGUgaW5zdGVhZCBvZiB0aGlzLgogICovCitmYXN0X2V4Y19yZXR1cm5faXJxOgkJCS8qIHJlc3RvcmVzIGlycSBzdGF0ZSB0b28gKi8KKwlsZAlyMyxTT0ZURShyMSkKKwlsZAlyMTIsX01TUihyMSkKKwlzdGIJcjMsUEFDQVNPRlRJUlFFTihyMTMpCS8qIHJlc3RvcmUgcGFjYS0+c29mdF9lbmFibGVkICovCisJcmxkaWNsCXI0LHIxMiw0OSw2MwkJLyogZ2V0IE1TUl9FRSB0byBMU0IgKi8KKwlzdGIJcjQsUEFDQUhBUkRJUlFFTihyMTMpCS8qIHJlc3RvcmUgcGFjYS0+aGFyZF9lbmFibGVkICovCisJYgkxZgorCiAJLmdsb2JsCWZhc3RfZXhjZXB0aW9uX3JldHVybgogZmFzdF9leGNlcHRpb25fcmV0dXJuOgogCWxkCXIxMixfTVNSKHIxKQotCWxkCXIxMSxfTklQKHIxKQorMToJbGQJcjExLF9OSVAocjEpCiAJYW5kaS4JcjMscjEyLE1TUl9SSQkJLyogY2hlY2sgaWYgUkkgaXMgc2V0ICovCiAJYmVxLQl1bnJlY292X2ZlcgogCkBAIC05NTIsNyArOTkxLDggQEAKIAlSRVNUXzhHUFJTKDIsIHIxKQogCiAJbWZtc3IJcjEwCi0JY2xycmRpCXIxMCxyMTAsMgkJLyogY2xlYXIgUkkgKExFIGlzIDAgYWxyZWFkeSkgKi8KKwlybGRpY2wJcjEwLHIxMCw0OCwxCQkvKiBjbGVhciBFRSAqLworCXJsZGljcglyMTAscjEwLDE2LDYxCQkvKiBjbGVhciBSSSAoTEUgaXMgMCBhbHJlYWR5KSAqLwogCW10bXNyZAlyMTAsMQogCiAJbXRzcHIJU1BSTl9TUlIxLHIxMgpAQCAtMTA0Niw3ICsxMDg2LDcgQEAKIAlsaQlyNSwwCiAJc3RkCXI0LF9EQVIocjEpCiAJc3RkCXI1LF9EU0lTUihyMSkKLQliCS5oYW5kbGVfcGFnZV9mYXVsdAorCWIJaGFuZGxlX3BhZ2VfZmF1bHQKIAogdW5yZWNvdl91c2VyX3NsYjoKIAlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweDQyMDAsIFBBQ0FfRVhHRU4pCkBAIC0xMTc0LDEyICsxMjE0LDEzIEBACiAJLmdsb2JsIGZwX3VuYXZhaWxhYmxlX2NvbW1vbgogZnBfdW5hdmFpbGFibGVfY29tbW9uOgogCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4ODAwLCBQQUNBX0VYR0VOKQotCWJuZQkubG9hZF91cF9mcHUJCS8qIGlmIGZyb20gdXNlciwganVzdCBsb2FkIGl0IHVwICovCisJYm5lCTFmCQkJLyogaWYgZnJvbSB1c2VyLCBqdXN0IGxvYWQgaXQgdXAgKi8KIAlibAkuc2F2ZV9udmdwcnMKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJRU5BQkxFX0lOVFMKIAlibAkua2VybmVsX2ZwX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbgogCUJVR19PUENPREUKKzE6CWIJLmxvYWRfdXBfZnB1CiAKIAkuYWxpZ24JNwogCS5nbG9ibCBhbHRpdmVjX3VuYXZhaWxhYmxlX2NvbW1vbgpAQCAtMTI3OSwxMCArMTMyMCwxMCBAQAogCXN0ZAlyNCxfRFNJU1IocjEpCiAKIAlhbmRpcy4JcjAscjQsMHhhNDUwCQkvKiB3ZWlyZCBlcnJvcj8gKi8KLQlibmUtCS5oYW5kbGVfcGFnZV9mYXVsdAkvKiBpZiBub3QsIHRyeSB0byBpbnNlcnQgYSBIUFRFICovCisJYm5lLQloYW5kbGVfcGFnZV9mYXVsdAkvKiBpZiBub3QsIHRyeSB0byBpbnNlcnQgYSBIUFRFICovCiBCRUdJTl9GVFJfU0VDVElPTgogCWFuZGlzLglyMCxyNCwweDAwMjAJCS8qIElzIGl0IGEgc2VnbWVudCB0YWJsZSBmYXVsdD8gKi8KLQlibmUtCS5kb19zdGVfYWxsb2MJCS8qIElmIHNvIGhhbmRsZSBpdCAqLworCWJuZS0JZG9fc3RlX2FsbG9jCQkvKiBJZiBzbyBoYW5kbGUgaXQgKi8KIEVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NMQikKIAogCS8qCkBAIC0xMzI0LDcgKzEzNjUsMTcgQEAKIAkgKiBiZWNhdXNlIHJldF9mcm9tX2V4Y2VwdF9saXRlIHdpbGwgY2hlY2sgZm9yIGFuZCBoYW5kbGUgcGVuZGluZwogCSAqIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5LgogCSAqLwotCWJlcQkucmV0X2Zyb21fZXhjZXB0X2xpdGUKKwliZXEJMTNmCitFTkRfRldfRlRSX1NFQ1RJT05fSUZTRVQoRldfRkVBVFVSRV9JU0VSSUVTKQorI2VuZGlmCitCRUdJTl9GV19GVFJfU0VDVElPTgorCS8qCisJICogSGVyZSB3ZSBoYXZlIGludGVycnVwdHMgaGFyZC1kaXNhYmxlZCwgc28gaXQgaXMgc3VmZmljaWVudAorCSAqIHRvIHJlc3RvcmUgcGFjYS0+e3NvZnQsaGFyZH1fZW5hYmxlIGFuZCBnZXQgb3V0LgorCSAqLworCWJlcQlmYXN0X2V4Y19yZXR1cm5faXJxCS8qIFJldHVybiBmcm9tIGV4Y2VwdGlvbiBvbiBzdWNjZXNzICovCitFTkRfRldfRlRSX1NFQ1RJT05fSUZDTFIoRldfRkVBVFVSRV9JU0VSSUVTKQorCiAJLyogRm9yIGEgaGFzaCBmYWlsdXJlLCB3ZSBkb24ndCBib3RoZXIgcmUtZW5hYmxpbmcgaW50ZXJydXB0cyAqLwogCWJsZS0JMTJmCiAKQEAgLTEzMzYsMjQgKzEzODcsMTYgQEAKIAlsZAlyMyxTT0ZURShyMSkKIAlibAkubG9jYWxfaXJxX3Jlc3RvcmUKIAliCTExZgotRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUykKLSNlbmRpZgotQkVHSU5fRldfRlRSX1NFQ1RJT04KLQliZXEJZmFzdF9leGNlcHRpb25fcmV0dXJuICAgLyogUmV0dXJuIGZyb20gZXhjZXB0aW9uIG9uIHN1Y2Nlc3MgKi8KLQlibGUtCTEyZgkJCS8qIEZhaWx1cmUgcmV0dXJuIGZyb20gaGFzaF9wYWdlICovCi0KLQkvKiBmYWxsIHRocm91Z2ggKi8KLUVORF9GV19GVFJfU0VDVElPTl9JRkNMUihGV19GRUFUVVJFX0lTRVJJRVMpCiAKIC8qIEhlcmUgd2UgaGF2ZSBhIHBhZ2UgZmF1bHQgdGhhdCBoYXNoX3BhZ2UgY2FuJ3QgaGFuZGxlLiAqLwotX0dMT0JBTChoYW5kbGVfcGFnZV9mYXVsdCkKK2hhbmRsZV9wYWdlX2ZhdWx0OgogCUVOQUJMRV9JTlRTCiAxMToJbGQJcjQsX0RBUihyMSkKIAlsZAlyNSxfRFNJU1IocjEpCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWJsCS5kb19wYWdlX2ZhdWx0CiAJY21wZGkJcjMsMAotCWJlcSsJLnJldF9mcm9tX2V4Y2VwdF9saXRlCisJYmVxKwkxM2YKIAlibAkuc2F2ZV9udmdwcnMKIAltcglyNSxyMwogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKQEAgLTEzNjEsNiArMTQwNCw4IEBACiAJYmwJLmJhZF9wYWdlX2ZhdWx0CiAJYgkucmV0X2Zyb21fZXhjZXB0CiAKKzEzOgliCS5yZXRfZnJvbV9leGNlcHRfbGl0ZQorCiAvKiBXZSBoYXZlIGEgcGFnZSBmYXVsdCB0aGF0IGhhc2hfcGFnZSBjb3VsZCBoYW5kbGUgYnV0IEhWIHJlZnVzZWQKICAqIHRoZSBQVEUgaW5zZXJ0aW9uCiAgKi8KQEAgLTEzNzEsMTEgKzE0MTYsMTEgQEAKIAliCS5yZXRfZnJvbV9leGNlcHQKIAogCS8qIGhlcmUgd2UgaGF2ZSBhIHNlZ21lbnQgbWlzcyAqLwotX0dMT0JBTChkb19zdGVfYWxsb2MpCitkb19zdGVfYWxsb2M6CiAJYmwJLnN0ZV9hbGxvY2F0ZQkJLyogdHJ5IHRvIGluc2VydCBzdGFiIGVudHJ5ICovCiAJY21wZGkJcjMsMAotCWJlcSsJZmFzdF9leGNlcHRpb25fcmV0dXJuCi0JYgkuaGFuZGxlX3BhZ2VfZmF1bHQKKwlibmUtCWhhbmRsZV9wYWdlX2ZhdWx0CisJYglmYXN0X2V4Y2VwdGlvbl9yZXR1cm4KIAogLyoKICAqIHIxMyBwb2ludHMgdG8gdGhlIFBBQ0EsIHI5IGNvbnRhaW5zIHRoZSBzYXZlZCBDUiwKQEAgLTE1NTcsNyArMTYwMiw3IEBACiAJbGQJcjEsUEFDQUVNRVJHU1AocjEzKQogCXN1YmkJcjEscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAotCWIJLl9fc2Vjb25kYXJ5X3N0YXJ0CisJYglfX3NlY29uZGFyeV9zdGFydAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKQEAgLTE1ODAsMTEgKzE2MjUsNiBAQAogCWxpCXIwLDAKIAlzdGR1CXIwLC1TVEFDS19GUkFNRV9PVkVSSEVBRChyMSkKIAotCUxPQURfUkVHX0lNTUVESUFURShyMyxjcHVfc3BlY3MpCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI0LGN1cl9jcHVfc3BlYykKLQlsaQlyNSwwCi0JYmwJLmlkZW50aWZ5X2NwdQotCiAJTE9BRF9SRUdfSU1NRURJQVRFKHIyLF9fdG9jX3N0YXJ0KQogCWFkZGkJcjIscjIsMHg0MDAwCiAJYWRkaQlyMixyMiwweDQwMDAKQEAgLTE1OTcsNyArMTYzNyw2IEBACiAJYgkuc3RhcnRfaGVyZV9jb21tb24KICNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KIAotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQogCiBfU1RBVElDKF9fbW11X29mZikKIAltZm1zcglyMwpAQCAtMTYyMywxMyArMTY2MiwxMSBAQAogICoKICAqLwogX0dMT0JBTChfX3N0YXJ0X2luaXRpYWxpemF0aW9uX211bHRpcGxhdGZvcm0pCi0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCiAJLyoKIAkgKiBBcmUgd2UgYm9vdGVkIGZyb20gYSBQUk9NIE9mLXR5cGUgY2xpZW50LWludGVyZmFjZSA/CiAJICovCiAJY21wbGRpCWNyMCxyNSwwCiAJYm5lCS5fX2Jvb3RfZnJvbV9wcm9tCQkvKiB5ZXMgLT4gcHJvbSAqLwotI2VuZGlmCiAKIAkvKiBTYXZlIHBhcmFtZXRlcnMgKi8KIAltcglyMzEscjMKQEAgLTE2NDYsNiArMTY4Myw4IEBACiAJY21wd2kJcjAsMHgzYwkJLyogOTcwRlggKi8KIAliZXEJMWYKIAljbXB3aQlyMCwweDQ0CQkvKiA5NzBNUCAqLworCWJlcQkxZgorCWNtcHdpCXIwLDB4NDUJCS8qIDk3MEdYICovCiAJYm5lCTJmCiAxOglibAkuX19jcHVfcHJlaW5pdF9wcGM5NzAKIDI6CkBAIC0xNjU2LDcgKzE2OTUsNiBAQAogCWJsCS5fX21tdV9vZmYKIAliCS5fX2FmdGVyX3Byb21fc3RhcnQKIAotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQogX1NUQVRJQyhfX2Jvb3RfZnJvbV9wcm9tKQogCS8qIFNhdmUgcGFyYW1ldGVycyAqLwogCW1yCXIzMSxyMwpAQCAtMTY5Niw3ICsxNzM0LDYgQEAKIAlibAkucHJvbV9pbml0CiAJLyogV2UgbmV2ZXIgcmV0dXJuICovCiAJdHJhcAotI2VuZGlmCiAKIC8qCiAgKiBBdCB0aGlzIHBvaW50LCByMyBjb250YWlucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3ZSBhcmUgcnVubmluZyBhdCwKQEAgLTE3NTIsOCArMTc4OSw2IEBACiAJYmwJLmNvcHlfYW5kX2ZsdXNoCQkvKiBjb3B5IHRoZSByZXN0ICovCiAJYgkuc3RhcnRfaGVyZV9tdWx0aXBsYXRmb3JtCiAKLSNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KLQogLyoKICAqIENvcHkgcm91dGluZSB1c2VkIHRvIGNvcHkgdGhlIGtlcm5lbCB0byBzdGFydCBhdCBwaHlzaWNhbCBhZGRyZXNzIDAKICAqIGFuZCBmbHVzaCBhbmQgaW52YWxpZGF0ZSB0aGUgY2FjaGVzIGFzIG5lZWRlZC4KQEAgLTE4MzYsNyArMTg3MSw3IEBACiAJbGQJcjEsUEFDQUVNRVJHU1AocjEzKQogCXN1YmkJcjEscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAotCWIJLl9fc2Vjb25kYXJ5X3N0YXJ0CisJYglfX3NlY29uZGFyeV9zdGFydAogCiAjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiAKQEAgLTE4NTMsNyArMTg4OCw3IEBACiAgKiAgIHIxMyAgID0gcGFjYSB2aXJ0dWFsIGFkZHJlc3MKICAqICAgU1BSRzMgPSBwYWNhIHZpcnR1YWwgYWRkcmVzcwogICovCi1fR0xPQkFMKF9fc2Vjb25kYXJ5X3N0YXJ0KQorX19zZWNvbmRhcnlfc3RhcnQ6CiAJLyogU2V0IHRocmVhZCBwcmlvcml0eSB0byBNRURJVU0gKi8KIAlITVRfTUVESVVNCiAKQEAgLTE4NzcsMTEgKzE5MTIsMTYgQEAKIAkvKiBlbmFibGUgTU1VIGFuZCBqdW1wIHRvIHN0YXJ0X3NlY29uZGFyeSAqLwogCUxPQURfUkVHX0FERFIocjMsIC5zdGFydF9zZWNvbmRhcnlfcHJvbG9nKQogCUxPQURfUkVHX0lNTUVESUFURShyNCwgTVNSX0tFUk5FTCkKLSNpZmRlZiBET19TT0ZUX0RJU0FCTEUKKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKIEJFR0lOX0ZXX0ZUUl9TRUNUSU9OCiAJb3JpCXI0LHI0LE1TUl9FRQogRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKEZXX0ZFQVRVUkVfSVNFUklFUykKICNlbmRpZgorQkVHSU5fRldfRlRSX1NFQ1RJT04KKwlzdGIJcjcsUEFDQVNPRlRJUlFFTihyMTMpCisJc3RiCXI3LFBBQ0FIQVJESVJRRU4ocjEzKQorRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGQ0xSKEZXX0ZFQVRVUkVfSVNFUklFUykKKwogCW10c3ByCVNQUk5fU1JSMCxyMwogCW10c3ByCVNQUk5fU1JSMSxyNAogCXJmaWQKQEAgLTE5MTMsNyArMTk1Myw2IEBACiAJaXN5bmMKIAlibHIKIAotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQogLyoKICAqIFRoaXMgaXMgd2hlcmUgdGhlIG1haW4ga2VybmVsIGNvZGUgc3RhcnRzLgogICovCkBAIC0xOTY0LDEzICsyMDAzLDYgQEAKIAlhZGRpCXIyLHIyLDB4NDAwMAogCWFkZAlyMixyMixyMjYKIAotCUxPQURfUkVHX0lNTUVESUFURShyMywgY3B1X3NwZWNzKQotCWFkZAlyMyxyMyxyMjYKLQlMT0FEX1JFR19JTU1FRElBVEUocjQsY3VyX2NwdV9zcGVjKQotCWFkZAlyNCxyNCxyMjYKLQltcglyNSxyMjYKLQlibAkuaWRlbnRpZnlfY3B1Ci0KIAkvKiBEbyB2ZXJ5IGVhcmx5IGtlcm5lbCBpbml0aWFsaXphdGlvbnMsIGluY2x1ZGluZyBpbml0aWFsIGhhc2ggdGFibGUsCiAJICogc3RhYiBhbmQgc2xiIHNldHVwIGJlZm9yZSB3ZSB0dXJuIG9uIHJlbG9jYXRpb24uCSovCiAKQEAgLTE5ODQsNyArMjAxNiw2IEBACiAJbXRzcHIJU1BSTl9TUlIxLHI0CiAJcmZpZAogCWIJLgkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLwotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwogCQogCS8qIFRoaXMgaXMgd2hlcmUgYWxsIHBsYXRmb3JtcyBjb252ZXJnZSBleGVjdXRpb24gKi8KIF9TVEFUSUMoc3RhcnRfaGVyZV9jb21tb24pCkBAIC0yMDAwLDEzICsyMDMxLDYgQEAKIAlsaQlyMCwwCiAJc3RkdQlyMCwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQocjEpCiAKLQkvKiBBcHBseSB0aGUgQ1BVcy1zcGVjaWZpYyBmaXh1cHMgKG5vcCBvdXQgc2VjdGlvbnMgbm90IHJlbGV2YW50Ci0JICogdG8gdGhpcyBDUFUKLQkgKi8KLQlsaQlyMywwCi0JYmwJLmRvX2NwdV9mdHJfZml4dXBzCi0JYmwJLmRvX2Z3X2Z0cl9maXh1cHMKLQogCS8qIHB0ciB0byBjdXJyZW50ICovCiAJTE9BRF9SRUdfSU1NRURJQVRFKHI0LCBpbml0X3Rhc2spCiAJc3RkCXI0LFBBQ0FDVVJSRU5UKHIxMykKQEAgLTIwMTksMTUgKzIwNDMsMTggQEAKIAogCS8qIExvYWQgdXAgdGhlIGtlcm5lbCBjb250ZXh0ICovCiA1OgotI2lmZGVmIERPX1NPRlRfRElTQUJMRQotQkVHSU5fRldfRlRSX1NFQ1RJT04KIAlsaQlyNSwwCi0Jc3RiCXI1LFBBQ0FQUk9DRU5BQkxFRChyMTMpCS8qIFNvZnQgRGlzYWJsZWQgKi8KKwlzdGIJcjUsUEFDQVNPRlRJUlFFTihyMTMpCS8qIFNvZnQgRGlzYWJsZWQgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKK0JFR0lOX0ZXX0ZUUl9TRUNUSU9OCiAJbWZtc3IJcjUKIAlvcmkJcjUscjUsTVNSX0VFCQkvKiBIYXJkIEVuYWJsZWQgKi8KIAltdG1zcmQJcjUKIEVORF9GV19GVFJfU0VDVElPTl9JRlNFVChGV19GRUFUVVJFX0lTRVJJRVMpCiAjZW5kaWYKK0JFR0lOX0ZXX0ZUUl9TRUNUSU9OCisJc3RiCXI1LFBBQ0FIQVJESVJRRU4ocjEzKQorRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGQ0xSKEZXX0ZFQVRVUkVfSVNFUklFUykKIAogCWJsIC5zdGFydF9rZXJuZWwKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pYm1lYnVzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYwppbmRleCAzOWRiN2EzLi44MmJkMmYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgaWJtZWJ1c19kbWFfb3BzID0geworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgaWJtZWJ1c19kbWFfb3BzID0gewogCS5hbGxvY19jb2hlcmVudCA9IGlibWVidXNfYWxsb2NfY29oZXJlbnQsCiAJLmZyZWVfY29oZXJlbnQgID0gaWJtZWJ1c19mcmVlX2NvaGVyZW50LAogCS5tYXBfc2luZ2xlICAgICA9IGlibWVidXNfbWFwX3NpbmdsZSwKQEAgLTE3Niw2ICsxNzYsMTAgQEAKIAlkZXYtPm9mZGV2LmRldi5idXMgICAgID0gJmlibWVidXNfYnVzX3R5cGU7CiAJZGV2LT5vZmRldi5kZXYucmVsZWFzZSA9IGlibWVidXNfZGV2X3JlbGVhc2U7CiAKKwlkZXYtPm9mZGV2LmRldi5hcmNoZGF0YS5vZl9ub2RlID0gZGV2LT5vZmRldi5ub2RlOworCWRldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLmRtYV9vcHMgPSAmaWJtZWJ1c19kbWFfb3BzOworCWRldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLm51bWFfbm9kZSA9IG9mX25vZGVfdG9fbmlkKGRldi0+b2ZkZXYubm9kZSk7CisKIAkvKiBBbiBpYm1lYnVzZGV2IGlzIGJhc2VkIG9uIGEgb2ZfZGV2aWNlLiBXZSBoYXZlIHRvIGNoYW5nZSB0aGUKIAkgKiBidXMgdHlwZSB0byB1c2Ugb3VyIG93biBETUEgbWFwcGluZyBvcGVyYXRpb25zLiAKIAkgKi8gICAgICAgCkBAIC0yMTAsMTEgKzIxNCwxMCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWJtZWJ1c19kZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWJtZWJ1c19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBpYm1lYnVzX2RldikpOwogCiAJZGV2LT5vZmRldi5ub2RlID0gb2Zfbm9kZV9nZXQoZG4pOwogICAgICAgIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGUuYwppbmRleCA0MTgwYzM5Li44OTk0YWYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGUuYwpAQCAtMzksNiArMzksMTMgQEAKICNkZWZpbmUgY3B1X3Nob3VsZF9kaWUoKQkwCiAjZW5kaWYKIAorc3RhdGljIGludCBfX2luaXQgcG93ZXJzYXZlX29mZihjaGFyICphcmcpCit7CisJcHBjX21kLnBvd2VyX3NhdmUgPSBOVUxMOworCXJldHVybiAwOworfQorX19zZXR1cCgicG93ZXJzYXZlPW9mZiIsIHBvd2Vyc2F2ZV9vZmYpOworCiAvKgogICogVGhlIGJvZHkgb2YgdGhlIGlkbGUgdGFzay4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNC5TCmluZGV4IDMwZGU4MWQuLmJhMzE5NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI0LlMKQEAgLTMwLDYgKzMwLDEzIEBACiAJYmVxbHIKIAogCS8qIEdvIHRvIE5BUCBub3cgKi8KKwltZm1zcglyNworCXJsZGljbAlyMCxyNyw0OCwxCisJcm90bGRpCXIwLHIwLDE2CisJbXRtc3JkCXIwLDEJCQkvKiBoYXJkLWRpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXIwLDEKKwlzdGIJcjAsUEFDQVNPRlRJUlFFTihyMTMpCS8qIHdlJ2xsIGhhcmQtZW5hYmxlIHNob3J0bHkgKi8KKwlzdGIJcjAsUEFDQUhBUkRJUlFFTihyMTMpCiBCRUdJTl9GVFJfU0VDVElPTgogCURTU0FMTAogCXN5bmMKQEAgLTM4LDcgKzQ1LDYgQEAKIAlsZAlyOCxUSV9MT0NBTF9GTEFHUyhyOSkJLyogc2V0IG5hcHBpbmcgYml0ICovCiAJb3JpCXI4LHI4LF9UTEZfTkFQUElORwkvKiBzbyB3aGVuIHdlIHRha2UgYW4gZXhjZXB0aW9uICovCiAJc3RkCXI4LFRJX0xPQ0FMX0ZMQUdTKHI5KQkvKiBpdCB3aWxsIHJldHVybiB0byBvdXIgY2FsbGVyICovCi0JbWZtc3IJcjcKIAlvcmkJcjcscjcsTVNSX0VFCiAJb3JpcwlyNyxyNyxNU1JfUE9XQGgKIDE6CXN5bmMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW8uYwppbmRleCBlOTgxODA2Li4zNGFlMTE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCkBAIC0yNSwxMyArMjUsMTEgQEAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+CiAKLXZvaWQgX2luc2Iodm9sYXRpbGUgdTggX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBsb25nIGNvdW50KQordm9pZCBfaW5zYihjb25zdCB2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCiB7CiAJdTggKnRidWYgPSBidWY7CiAJdTggdG1wOwogCi0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOwotCiAJaWYgKHVubGlrZWx5KGNvdW50IDw9IDApKQogCQlyZXR1cm47CiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CkBAIC00OCw4ICs0Niw2IEBACiB7CiAJY29uc3QgdTggKnRidWYgPSBidWY7CiAKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KIAlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybjsKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKQEAgLTYwLDEzICs1NiwxMSBAQAogfQogRVhQT1JUX1NZTUJPTChfb3V0c2IpOwogCi12b2lkIF9pbnN3X25zKHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCit2b2lkIF9pbnN3X25zKGNvbnN0IHZvbGF0aWxlIHUxNiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCiB7CiAJdTE2ICp0YnVmID0gYnVmOwogCXUxNiB0bXA7CiAKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KIAlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybjsKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKQEAgLTgzLDggKzc3LDYgQEAKIHsKIAljb25zdCB1MTYgKnRidWYgPSBidWY7CiAKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KIAlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybjsKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKQEAgLTk1LDEzICs4NywxMSBAQAogfQogRVhQT1JUX1NZTUJPTChfb3V0c3dfbnMpOwogCi12b2lkIF9pbnNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCit2b2lkIF9pbnNsX25zKGNvbnN0IHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpCiB7CiAJdTMyICp0YnVmID0gYnVmOwogCXUzMiB0bXA7CiAKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KIAlpZiAodW5saWtlbHkoY291bnQgPD0gMCkpCiAJCXJldHVybjsKIAlhc20gdm9sYXRpbGUoInN5bmMiKTsKQEAgLTExOCw4ICsxMDgsNiBAQAogewogCWNvbnN0IHUzMiAqdGJ1ZiA9IGJ1ZjsKIAotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQogCWlmICh1bmxpa2VseShjb3VudCA8PSAwKSkKIAkJcmV0dXJuOwogCWFzbSB2b2xhdGlsZSgic3luYyIpOwpAQCAtMTI5LDMgKzExNyw5MCBAQAogCWFzbSB2b2xhdGlsZSgic3luYyIpOwogfQogRVhQT1JUX1NZTUJPTChfb3V0c2xfbnMpOworCisjZGVmaW5lIElPX0NIRUNLX0FMSUdOKHYsYSkgKCgoKHVuc2lnbmVkIGxvbmcpKHYpKSAmICgoYSkgLSAxKSkgPT0gMCkKKwordm9pZCBfbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgaW50IGMsIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl2b2lkICpwID0gKHZvaWQgX19mb3JjZSAqKWFkZHI7CisJdTMyIGxjID0gYzsKKwlsYyB8PSBsYyA8PCA4OworCWxjIHw9IGxjIDw8IDE2OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJd2hpbGUobiAmJiAhSU9fQ0hFQ0tfQUxJR04ocCwgNCkpIHsKKwkJKigodm9sYXRpbGUgdTggKilwKSA9IGM7CisJCXArKzsKKwkJbi0tOworCX0KKwl3aGlsZShuID49IDQpIHsKKwkJKigodm9sYXRpbGUgdTMyICopcCkgPSBsYzsKKwkJcCArPSA0OworCQluIC09IDQ7CisJfQorCXdoaWxlKG4pIHsKKwkJKigodm9sYXRpbGUgdTggKilwKSA9IGM7CisJCXArKzsKKwkJbi0tOworCX0KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKK30KK0VYUE9SVF9TWU1CT0woX21lbXNldF9pbyk7CisKK3ZvaWQgX21lbWNweV9mcm9taW8odm9pZCAqZGVzdCwgY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzcmMsCisJCSAgICB1bnNpZ25lZCBsb25nIG4pCit7CisJdm9pZCAqdnNyYyA9ICh2b2lkIF9fZm9yY2UgKikgc3JjOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJd2hpbGUobiAmJiAoIUlPX0NIRUNLX0FMSUdOKHZzcmMsIDQpIHx8ICFJT19DSEVDS19BTElHTihkZXN0LCA0KSkpIHsKKwkJKigodTggKilkZXN0KSA9ICooKHZvbGF0aWxlIHU4ICopdnNyYyk7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKKwkJdnNyYysrOworCQlkZXN0Kys7CisJCW4tLTsKKwl9CisJd2hpbGUobiA+IDQpIHsKKwkJKigodTMyICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1MzIgKil2c3JjKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOworCQl2c3JjICs9IDQ7CisJCWRlc3QgKz0gNDsKKwkJbiAtPSA0OworCX0KKwl3aGlsZShuKSB7CisJCSooKHU4ICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1OCAqKXZzcmMpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJCXZzcmMrKzsKKwkJZGVzdCsrOworCQluLS07CisJfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOworfQorRVhQT1JUX1NZTUJPTChfbWVtY3B5X2Zyb21pbyk7CisKK3ZvaWQgX21lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIG4pCit7CisJdm9pZCAqdmRlc3QgPSAodm9pZCBfX2ZvcmNlICopIGRlc3Q7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKKwl3aGlsZShuICYmICghSU9fQ0hFQ0tfQUxJR04odmRlc3QsIDQpIHx8ICFJT19DSEVDS19BTElHTihzcmMsIDQpKSkgeworCQkqKCh2b2xhdGlsZSB1OCAqKXZkZXN0KSA9ICooKHU4ICopc3JjKTsKKwkJc3JjKys7CisJCXZkZXN0Kys7CisJCW4tLTsKKwl9CisJd2hpbGUobiA+IDQpIHsKKwkJKigodm9sYXRpbGUgdTMyICopdmRlc3QpID0gKigodm9sYXRpbGUgdTMyICopc3JjKTsKKwkJc3JjICs9IDQ7CisJCXZkZXN0ICs9IDQ7CisJCW4tPTQ7CisJfQorCXdoaWxlKG4pIHsKKwkJKigodm9sYXRpbGUgdTggKil2ZGVzdCkgPSAqKCh1OCAqKXNyYyk7CisJCXNyYysrOworCQl2ZGVzdCsrOworCQluLS07CisJfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOworfQorRVhQT1JUX1NZTUJPTChfbWVtY3B5X3RvaW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jCmluZGV4IGExM2E5M2QuLmM2ODExMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tYXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbWFwLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiB2b2lkIF9faW9tZW0gKmlvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgbGVuKQogewotCXJldHVybiAodm9pZCBfX2lvbWVtICopIChwb3J0K3BjaV9pb19iYXNlKTsKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAocG9ydCArIF9JT19CQVNFKTsKIH0KIAogdm9pZCBpb3BvcnRfdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCmluZGV4IGY4OGEyYTYuLjk1ZWRhZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKQEAgLTQ3LDYgKzQ3LDE3IEBACiBzdGF0aWMgaW50IG5vdm1lcmdlID0gMTsKICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaW9tbXVfbnVtX3BhZ2VzKHVuc2lnbmVkIGxvbmcgdmFkZHIsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNsZW4pCit7CisJdW5zaWduZWQgbG9uZyBucGFnZXM7CisKKwlucGFnZXMgPSBJT01NVV9QQUdFX0FMSUdOKHZhZGRyICsgc2xlbikgLSAodmFkZHIgJiBJT01NVV9QQUdFX01BU0spOworCW5wYWdlcyA+Pj0gSU9NTVVfUEFHRV9TSElGVDsKKworCXJldHVybiBucGFnZXM7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX2lvbW11KGNoYXIgKnN0cikKIHsKIAlpZiAoIXN0cmNtcChzdHIsICJub3ZtZXJnZSIpKQpAQCAtMTc4LDEwICsxODksMTAgQEAKIAl9CiAKIAllbnRyeSArPSB0YmwtPml0X29mZnNldDsJLyogT2Zmc2V0IGludG8gcmVhbCBUQ0UgdGFibGUgKi8KLQlyZXQgPSBlbnRyeSA8PCBQQUdFX1NISUZUOwkvKiBTZXQgdGhlIHJldHVybiBkbWEgYWRkcmVzcyAqLworCXJldCA9IGVudHJ5IDw8IElPTU1VX1BBR0VfU0hJRlQ7CS8qIFNldCB0aGUgcmV0dXJuIGRtYSBhZGRyZXNzICovCiAKIAkvKiBQdXQgdGhlIFRDRXMgaW4gdGhlIEhXIHRhYmxlICovCi0JcHBjX21kLnRjZV9idWlsZCh0YmwsIGVudHJ5LCBucGFnZXMsICh1bnNpZ25lZCBsb25nKXBhZ2UgJiBQQUdFX01BU0ssCisJcHBjX21kLnRjZV9idWlsZCh0YmwsIGVudHJ5LCBucGFnZXMsICh1bnNpZ25lZCBsb25nKXBhZ2UgJiBJT01NVV9QQUdFX01BU0ssCiAJCQkgZGlyZWN0aW9uKTsKIAogCkBAIC0yMDMsNyArMjE0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGVudHJ5LCBmcmVlX2VudHJ5OwogCXVuc2lnbmVkIGxvbmcgaTsKIAotCWVudHJ5ID0gZG1hX2FkZHIgPj4gUEFHRV9TSElGVDsKKwllbnRyeSA9IGRtYV9hZGRyID4+IElPTU1VX1BBR0VfU0hJRlQ7CiAJZnJlZV9lbnRyeSA9IGVudHJ5IC0gdGJsLT5pdF9vZmZzZXQ7CiAKIAlpZiAoKChmcmVlX2VudHJ5ICsgbnBhZ2VzKSA+IHRibC0+aXRfc2l6ZSkgfHwKQEAgLTI0Nyw5ICsyNTgsOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJih0YmwtPml0X2xvY2spLCBmbGFncyk7CiB9CiAKLWludCBpb21tdV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsCi0JCXVuc2lnbmVkIGxvbmcgbWFzaywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoraW50IGlvbW11X21hcF9zZyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCisJCSBpbnQgbmVsZW1zLCB1bnNpZ25lZCBsb25nIG1hc2ssCisJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJZG1hX2FkZHJfdCBkbWFfbmV4dCA9IDAsIGRtYV9hZGRyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNzAsNyArMjgxLDcgQEAKIAkvKiBJbml0IGZpcnN0IHNlZ21lbnQgbGVuZ3RoIGZvciBiYWNrb3V0IGF0IGZhaWx1cmUgKi8KIAlvdXRzLT5kbWFfbGVuZ3RoID0gMDsKIAotCURCRygibWFwcGluZyAlZCBlbGVtZW50czpcbiIsIG5lbGVtcyk7CisJREJHKCJzZyBtYXBwaW5nICVkIGVsZW1lbnRzOlxuIiwgbmVsZW1zKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCYodGJsLT5pdF9sb2NrKSwgZmxhZ3MpOwogCkBAIC0yODUsOSArMjk2LDggQEAKIAkJfQogCQkvKiBBbGxvY2F0ZSBpb21tdSBlbnRyaWVzIGZvciB0aGF0IHNlZ21lbnQgKi8KIAkJdmFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3Mocy0+cGFnZSkgKyBzLT5vZmZzZXQ7Ci0JCW5wYWdlcyA9IFBBR0VfQUxJR04odmFkZHIgKyBzbGVuKSAtICh2YWRkciAmIFBBR0VfTUFTSyk7Ci0JCW5wYWdlcyA+Pj0gUEFHRV9TSElGVDsKLQkJZW50cnkgPSBpb21tdV9yYW5nZV9hbGxvYyh0YmwsIG5wYWdlcywgJmhhbmRsZSwgbWFzayA+PiBQQUdFX1NISUZULCAwKTsKKwkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHZhZGRyLCBzbGVuKTsKKwkJZW50cnkgPSBpb21tdV9yYW5nZV9hbGxvYyh0YmwsIG5wYWdlcywgJmhhbmRsZSwgbWFzayA+PiBJT01NVV9QQUdFX1NISUZULCAwKTsKIAogCQlEQkcoIiAgLSB2YWRkcjogJWx4LCBzaXplOiAlbHhcbiIsIHZhZGRyLCBzbGVuKTsKIApAQCAtMzAxLDE0ICszMTEsMTQgQEAKIAogCQkvKiBDb252ZXJ0IGVudHJ5IHRvIGEgZG1hX2FkZHJfdCAqLwogCQllbnRyeSArPSB0YmwtPml0X29mZnNldDsKLQkJZG1hX2FkZHIgPSBlbnRyeSA8PCBQQUdFX1NISUZUOwotCQlkbWFfYWRkciB8PSBzLT5vZmZzZXQ7CisJCWRtYV9hZGRyID0gZW50cnkgPDwgSU9NTVVfUEFHRV9TSElGVDsKKwkJZG1hX2FkZHIgfD0gKHMtPm9mZnNldCAmIH5JT01NVV9QQUdFX01BU0spOwogCi0JCURCRygiICAtICVseCBwYWdlcywgZW50cnk6ICVseCwgZG1hX2FkZHI6ICVseFxuIiwKKwkJREJHKCIgIC0gJWx1IHBhZ2VzLCBlbnRyeTogJWx4LCBkbWFfYWRkcjogJWx4XG4iLAogCQkJICAgIG5wYWdlcywgZW50cnksIGRtYV9hZGRyKTsKIAogCQkvKiBJbnNlcnQgaW50byBIVyB0YWJsZSAqLwotCQlwcGNfbWQudGNlX2J1aWxkKHRibCwgZW50cnksIG5wYWdlcywgdmFkZHIgJiBQQUdFX01BU0ssIGRpcmVjdGlvbik7CisJCXBwY19tZC50Y2VfYnVpbGQodGJsLCBlbnRyeSwgbnBhZ2VzLCB2YWRkciAmIElPTU1VX1BBR0VfTUFTSywgZGlyZWN0aW9uKTsKIAogCQkvKiBJZiB3ZSBhcmUgaW4gYW4gb3BlbiBzZWdtZW50LCB0cnkgbWVyZ2luZyAqLwogCQlpZiAoc2Vnc3RhcnQgIT0gcykgewpAQCAtMzIzLDcgKzMzMyw3IEBACiAJCQkJREJHKCIgICAgY2FuJ3QgbWVyZ2UsIG5ldyBzZWdtZW50LlxuIik7CiAJCQl9IGVsc2UgewogCQkJCW91dHMtPmRtYV9sZW5ndGggKz0gcy0+bGVuZ3RoOwotCQkJCURCRygiICAgIG1lcmdlZCwgbmV3IGxlbjogJWx4XG4iLCBvdXRzLT5kbWFfbGVuZ3RoKTsKKwkJCQlEQkcoIiAgICBtZXJnZWQsIG5ldyBsZW46ICV1eFxuIiwgb3V0cy0+ZG1hX2xlbmd0aCk7CiAJCQl9CiAJCX0KIApAQCAtMzY3LDkgKzM3Nyw4IEBACiAJCWlmIChzLT5kbWFfbGVuZ3RoICE9IDApIHsKIAkJCXVuc2lnbmVkIGxvbmcgdmFkZHIsIG5wYWdlczsKIAotCQkJdmFkZHIgPSBzLT5kbWFfYWRkcmVzcyAmIFBBR0VfTUFTSzsKLQkJCW5wYWdlcyA9IChQQUdFX0FMSUdOKHMtPmRtYV9hZGRyZXNzICsgcy0+ZG1hX2xlbmd0aCkgLSB2YWRkcikKLQkJCQk+PiBQQUdFX1NISUZUOworCQkJdmFkZHIgPSBzLT5kbWFfYWRkcmVzcyAmIElPTU1VX1BBR0VfTUFTSzsKKwkJCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCk7CiAJCQlfX2lvbW11X2ZyZWUodGJsLCB2YWRkciwgbnBhZ2VzKTsKIAkJCXMtPmRtYV9hZGRyZXNzID0gRE1BX0VSUk9SX0NPREU7CiAJCQlzLT5kbWFfbGVuZ3RoID0gMDsKQEAgLTM5OCw4ICs0MDcsNyBAQAogCiAJCWlmIChzZ2xpc3QtPmRtYV9sZW5ndGggPT0gMCkKIAkJCWJyZWFrOwotCQlucGFnZXMgPSAoUEFHRV9BTElHTihkbWFfaGFuZGxlICsgc2dsaXN0LT5kbWFfbGVuZ3RoKQotCQkJICAtIChkbWFfaGFuZGxlICYgUEFHRV9NQVNLKSkgPj4gUEFHRV9TSElGVDsKKwkJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGRtYV9oYW5kbGUsc2dsaXN0LT5kbWFfbGVuZ3RoKTsKIAkJX19pb21tdV9mcmVlKHRibCwgZG1hX2hhbmRsZSwgbnBhZ2VzKTsKIAkJc2dsaXN0Kys7CiAJfQpAQCAtNTMyLDEyICs1NDAsMTEgQEAKIAlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKIAogCXVhZGRyID0gKHVuc2lnbmVkIGxvbmcpdmFkZHI7Ci0JbnBhZ2VzID0gUEFHRV9BTElHTih1YWRkciArIHNpemUpIC0gKHVhZGRyICYgUEFHRV9NQVNLKTsKLQlucGFnZXMgPj49IFBBR0VfU0hJRlQ7CisJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHVhZGRyLCBzaXplKTsKIAogCWlmICh0YmwpIHsKIAkJZG1hX2hhbmRsZSA9IGlvbW11X2FsbG9jKHRibCwgdmFkZHIsIG5wYWdlcywgZGlyZWN0aW9uLAotCQkJCQkgbWFzayA+PiBQQUdFX1NISUZULCAwKTsKKwkJCQkJIG1hc2sgPj4gSU9NTVVfUEFHRV9TSElGVCwgMCk7CiAJCWlmIChkbWFfaGFuZGxlID09IERNQV9FUlJPUl9DT0RFKSB7CiAJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSAgewogCQkJCXByaW50ayhLRVJOX0lORk8gImlvbW11X2FsbG9jIGZhaWxlZCwgIgpAQCAtNTQ1LDcgKzU1Miw3IEBACiAJCQkJCQl0YmwsIHZhZGRyLCBucGFnZXMpOwogCQkJfQogCQl9IGVsc2UKLQkJCWRtYV9oYW5kbGUgfD0gKHVhZGRyICYgflBBR0VfTUFTSyk7CisJCQlkbWFfaGFuZGxlIHw9ICh1YWRkciAmIH5JT01NVV9QQUdFX01BU0spOwogCX0KIAogCXJldHVybiBkbWFfaGFuZGxlOwpAQCAtNTU0LDExICs1NjEsMTQgQEAKIHZvaWQgaW9tbXVfdW5tYXBfc2luZ2xlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCiAJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CisJdW5zaWduZWQgaW50IG5wYWdlczsKKwogCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOwogCi0JaWYgKHRibCkKLQkJaW9tbXVfZnJlZSh0YmwsIGRtYV9oYW5kbGUsIChQQUdFX0FMSUdOKGRtYV9oYW5kbGUgKyBzaXplKSAtCi0JCQkJCShkbWFfaGFuZGxlICYgUEFHRV9NQVNLKSkgPj4gUEFHRV9TSElGVCk7CisJaWYgKHRibCkgeworCQlucGFnZXMgPSBpb21tdV9udW1fcGFnZXMoZG1hX2hhbmRsZSwgc2l6ZSk7CisJCWlvbW11X2ZyZWUodGJsLCBkbWFfaGFuZGxlLCBucGFnZXMpOworCX0KIH0KIAogLyogQWxsb2NhdGVzIGEgY29udGlndW91cyByZWFsIGJ1ZmZlciBhbmQgY3JlYXRlcyBtYXBwaW5ncyBvdmVyIGl0LgpAQCAtNTcwLDExICs1ODAsMTEgQEAKIHsKIAl2b2lkICpyZXQgPSBOVUxMOwogCWRtYV9hZGRyX3QgbWFwcGluZzsKLQl1bnNpZ25lZCBpbnQgbnBhZ2VzLCBvcmRlcjsKKwl1bnNpZ25lZCBpbnQgb3JkZXI7CisJdW5zaWduZWQgaW50IG5pb19wYWdlcywgaW9fb3JkZXI7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQlucGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CiAJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CiAKICAJLyoKQEAgLTU5OCw4ICs2MDgsMTAgQEAKIAltZW1zZXQocmV0LCAwLCBzaXplKTsKIAogCS8qIFNldCB1cCB0Y2VzIHRvIGNvdmVyIHRoZSBhbGxvY2F0ZWQgcmFuZ2UgKi8KLQltYXBwaW5nID0gaW9tbXVfYWxsb2ModGJsLCByZXQsIG5wYWdlcywgRE1BX0JJRElSRUNUSU9OQUwsCi0JCQkgICAgICBtYXNrID4+IFBBR0VfU0hJRlQsIG9yZGVyKTsKKwluaW9fcGFnZXMgPSBzaXplID4+IElPTU1VX1BBR0VfU0hJRlQ7CisJaW9fb3JkZXIgPSBnZXRfaW9tbXVfb3JkZXIoc2l6ZSk7CisJbWFwcGluZyA9IGlvbW11X2FsbG9jKHRibCwgcmV0LCBuaW9fcGFnZXMsIERNQV9CSURJUkVDVElPTkFMLAorCQkJICAgICAgbWFzayA+PiBJT01NVV9QQUdFX1NISUZULCBpb19vcmRlcik7CiAJaWYgKG1hcHBpbmcgPT0gRE1BX0VSUk9SX0NPREUpIHsKIAkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylyZXQsIG9yZGVyKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC02MTEsMTIgKzYyMywxMyBAQAogdm9pZCBpb21tdV9mcmVlX2NvaGVyZW50KHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBzaXplX3Qgc2l6ZSwKIAkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQogewotCXVuc2lnbmVkIGludCBucGFnZXM7Ci0KIAlpZiAodGJsKSB7CisJCXVuc2lnbmVkIGludCBuaW9fcGFnZXM7CisKIAkJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0JCW5wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKLQkJaW9tbXVfZnJlZSh0YmwsIGRtYV9oYW5kbGUsIG5wYWdlcyk7CisJCW5pb19wYWdlcyA9IHNpemUgPj4gSU9NTVVfUEFHRV9TSElGVDsKKwkJaW9tbXVfZnJlZSh0YmwsIGRtYV9oYW5kbGUsIG5pb19wYWdlcyk7CisJCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCmluZGV4IDVlMzdiZjEuLjBiZDhjNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwpAQCAtNjQsOCArNjQsOSBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS91ZGJnLmg+Ci0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCisjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtL3BhY2EuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNlbmRpZgogCiBpbnQgX19pcnFfb2Zmc2V0X3ZhbHVlOwpAQCAtOTUsNiArOTYsNzQgQEAKIEVYUE9SVF9TWU1CT0woaXJxX2Rlc2MpOwogCiBpbnQgZGlzdHJpYnV0ZV9pcnFzID0gMTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9oYXJkX2VuYWJsZWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGVuYWJsZWQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGJ6ICUwLCUxKDEzKSIKKwk6ICI9ciIgKGVuYWJsZWQpIDogImkiIChvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGhhcmRfZW5hYmxlZCkpKTsKKworCXJldHVybiBlbmFibGVkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NvZnRfZW5hYmxlZCh1bnNpZ25lZCBsb25nIGVuYWJsZSkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RiICUwLCUxKDEzKSIKKwk6IDogInIiIChlbmFibGUpLCAiaSIgKG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc29mdF9lbmFibGVkKSkpOworfQorCit2b2lkIGxvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZW4pCit7CisJLyoKKwkgKiBnZXRfcGFjYSgpLT5zb2Z0X2VuYWJsZWQgPSBlbjsKKwkgKiBJcyBpdCBldmVyIHZhbGlkIHRvIHVzZSBsb2NhbF9pcnFfcmVzdG9yZSgwKSB3aGVuIHNvZnRfZW5hYmxlZCBpcyAxPworCSAqIFRoYXQgd2FzIGFsbG93ZWQgYmVmb3JlLCBhbmQgaW4gc3VjaCBhIGNhc2Ugd2UgZG8gbmVlZCB0byB0YWtlIGNhcmUKKwkgKiB0aGF0IGdjYyB3aWxsIHNldCBzb2Z0X2VuYWJsZWQgZGlyZWN0bHkgdmlhIHIxMywgbm90IGNob29zZSB0byB1c2UKKwkgKiBhbiBpbnRlcm1lZGlhdGUgcmVnaXN0ZXIsIGxlc3Qgd2UncmUgcHJlZW1wdGVkIHRvIGEgZGlmZmVyZW50IGNwdS4KKwkgKi8KKwlzZXRfc29mdF9lbmFibGVkKGVuKTsKKwlpZiAoIWVuKQorCQlyZXR1cm47CisKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkgeworCQkvKgorCQkgKiBEbyB3ZSBuZWVkIHRvIGRpc2FibGUgcHJlZW1wdGlvbiBoZXJlPyAgTm90IHJlYWxseTogaW4gdGhlCisJCSAqIHVubGlrZWx5IGV2ZW50IHRoYXQgd2UncmUgcHJlZW1wdGVkIHRvIGEgZGlmZmVyZW50IGNwdSBpbgorCQkgKiBiZXR3ZWVuIGdldHRpbmcgcjEzLCBsb2FkaW5nIGl0cyBscHBhY2FfcHRyLCBhbmQgbG9hZGluZworCQkgKiBpdHMgYW55X2ludCwgd2UgbWlnaHQgY2FsbCBpc2VyaWVzX2hhbmRsZV9pbnRlcnJ1cHRzIHdpdGhvdXQKKwkJICogYW4gaW50ZXJydXB0IHBlbmRpbmcgb24gdGhlIG5ldyBjcHUsIGJ1dCB0aGF0J3Mgbm8gZGlzYXN0ZXIsCisJCSAqIGlzIGl0PyAgQW5kIHRoZSBidXNpbmVzcyBvZiBwcmVlbXB0aW5nIHVzIG9mZiB0aGUgb2xkIGNwdQorCQkgKiB3b3VsZCBpdHNlbGYgaW52b2x2ZSBhIGxvY2FsX2lycV9yZXN0b3JlIHdoaWNoIGhhbmRsZXMgdGhlCisJCSAqIGludGVycnVwdCB0byB0aGF0IGNwdS4KKwkJICoKKwkJICogQnV0IHVzZSAibG9jYWxfcGFjYS0+bHBwYWNhX3B0ciIgaW5zdGVhZCBvZiAiZ2V0X2xwcGFjYSgpIgorCQkgKiB0byBhdm9pZCBhbnkgcHJlZW1wdGlvbiBjaGVja2luZyBhZGRlZCBpbnRvIGdldF9wYWNhKCkuCisJCSAqLworCQlpZiAobG9jYWxfcGFjYS0+bHBwYWNhX3B0ci0+aW50X2R3b3JkLmFueV9pbnQpCisJCQlpc2VyaWVzX2hhbmRsZV9pbnRlcnJ1cHRzKCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIGlmIChnZXRfcGFjYSgpLT5oYXJkX2VuYWJsZWQpIHJldHVybjsKKwkgKiBCdXQgYWdhaW4gd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhhdCBnY2MgZ2V0cyBoYXJkX2VuYWJsZWQgZGlyZWN0bHkKKwkgKiB2aWEgcjEzLCBub3QgY2hvb3NlIHRvIHVzZSBhbiBpbnRlcm1lZGlhdGUgcmVnaXN0ZXIsIGxlc3Qgd2UncmUKKwkgKiBwcmVlbXB0ZWQgdG8gYSBkaWZmZXJlbnQgY3B1IGluIGJldHdlZW4gdGhlIHR3byBpbnN0cnVjdGlvbnMuCisJICovCisJaWYgKGdldF9oYXJkX2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBOZWVkIHRvIGhhcmQtZW5hYmxlIGludGVycnVwdHMgaGVyZS4gIFNpbmNlIGN1cnJlbnRseSBkaXNhYmxlZCwKKwkgKiBubyBuZWVkIHRvIHRha2UgZnVydGhlciBhc20gcHJlY2F1dGlvbnMgYWdhaW5zdCBwcmVlbXB0aW9uOyBidXQKKwkgKiB1c2UgbG9jYWxfcGFjYSBpbnN0ZWFkIG9mIGdldF9wYWNhKCkgdG8gYXZvaWQgcHJlZW1wdGlvbiBjaGVja2luZy4KKwkgKi8KKwlsb2NhbF9wYWNhLT5oYXJkX2VuYWJsZWQgPSBlbjsKKwlpZiAoKGludCltZnNwcihTUFJOX0RFQykgPCAwKQorCQltdHNwcihTUFJOX0RFQywgMSk7CisJaGFyZF9pcnFfZW5hYmxlKCk7Cit9CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKIGludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQpAQCAtMjQ2LDcgKzMxNSw4IEBACiAJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKIAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmIChnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQpIHsKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSAmJgorCQkJZ2V0X2xwcGFjYSgpLT5pbnRfZHdvcmQuZmllbGRzLmRlY3JfaW50KSB7CiAJCWdldF9scHBhY2EoKS0+aW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDA7CiAJCS8qIFNpZ25hbCBhIGZha2UgZGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCiAJCXRpbWVyX2ludGVycnVwdChyZWdzKTsKQEAgLTYyNiwxMCArNjk2LDE0IEBACiAKIHZvaWQgaXJxX2Rpc3Bvc2VfbWFwcGluZyh1bnNpZ25lZCBpbnQgdmlycSkKIHsKLQlzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QgPSBpcnFfbWFwW3ZpcnFdLmhvc3Q7CisJc3RydWN0IGlycV9ob3N0ICpob3N0OwogCWlycV9od19udW1iZXJfdCBod2lycTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaWYgKHZpcnEgPT0gTk9fSVJRKQorCQlyZXR1cm47CisKKwlob3N0ID0gaXJxX21hcFt2aXJxXS5ob3N0OwogCVdBUk5fT04gKGhvc3QgPT0gTlVMTCk7CiAJaWYgKGhvc3QgPT0gTlVMTCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYwppbmRleCA3YjhkMTJiLi40NjU3NTYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYwpAQCAtODUsNyArODUsNyBAQAogdm9pZCBfX2twcm9iZXMgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJbXV0ZXhfbG9jaygma3Byb2JlX211dGV4KTsKLQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuKTsKKwlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAwKTsKIAltdXRleF91bmxvY2soJmtwcm9iZV9tdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKaW5kZXggODhmZDczZi4uNDEyYmVhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKQEAgLTEwMiw4MCArMTAyLDYgQEAKIAlibHIKIAogLyoKLSAqIGlkZW50aWZ5X2NwdSwKLSAqIGNhbGxlZCB3aXRoIHIzID0gZGF0YSBvZmZzZXQgYW5kIHI0ID0gQ1BVIG51bWJlcgotICogZG9lc24ndCBjaGFuZ2UgcjMKLSAqLwotX0dMT0JBTChpZGVudGlmeV9jcHUpCi0JYWRkaXMJcjgscjMsY3B1X3NwZWNzQGhhCi0JYWRkaQlyOCxyOCxjcHVfc3BlY3NAbAotCW1mcHZyCXI3Ci0xOgotCWx3eglyNSxDUFVfU1BFQ19QVlJfTUFTSyhyOCkKLQlhbmQJcjUscjUscjcKLQlsd3oJcjYsQ1BVX1NQRUNfUFZSX1ZBTFVFKHI4KQotCWNtcGx3CTAscjYscjUKLQliZXEJMWYKLQlhZGRpCXI4LHI4LENQVV9TUEVDX0VOVFJZX1NJWkUKLQliCTFiCi0xOgotCWFkZGlzCXI2LHIzLGN1cl9jcHVfc3BlY0BoYQotCWFkZGkJcjYscjYsY3VyX2NwdV9zcGVjQGwKLQlzdWIJcjgscjgscjMKLQlzdHcJcjgsMChyNikKLQlibHIKLQotLyoKLSAqIGRvX2NwdV9mdHJfZml4dXBzIC0gZ29lcyB0aHJvdWdoIHRoZSBsaXN0IG9mIENQVSBmZWF0dXJlIGZpeHVwcwotICogYW5kIHdyaXRlcyBub3AncyBvdmVyIHNlY3Rpb25zIG9mIGNvZGUgdGhhdCBkb24ndCBhcHBseSBmb3IgdGhpcyBjcHUuCi0gKiByMyA9IGRhdGEgb2Zmc2V0IChub3QgY2hhbmdlZCkKLSAqLwotX0dMT0JBTChkb19jcHVfZnRyX2ZpeHVwcykKLQkvKiBHZXQgQ1BVIDAgZmVhdHVyZXMgKi8KLQlhZGRpcwlyNixyMyxjdXJfY3B1X3NwZWNAaGEKLQlhZGRpCXI2LHI2LGN1cl9jcHVfc3BlY0BsCi0JbHd6CXI0LDAocjYpCi0JYWRkCXI0LHI0LHIzCi0JbHd6CXI0LENQVV9TUEVDX0ZFQVRVUkVTKHI0KQotCi0JLyogR2V0IHRoZSBmaXh1cCB0YWJsZSAqLwotCWFkZGlzCXI2LHIzLF9fc3RhcnRfX19mdHJfZml4dXBAaGEKLQlhZGRpCXI2LHI2LF9fc3RhcnRfX19mdHJfZml4dXBAbAotCWFkZGlzCXI3LHIzLF9fc3RvcF9fX2Z0cl9maXh1cEBoYQotCWFkZGkJcjcscjcsX19zdG9wX19fZnRyX2ZpeHVwQGwKLQotCS8qIERvIHRoZSBmaXh1cCAqLwotMToJY21wbHcJMCxyNixyNwotCWJnZWxyCi0JYWRkaQlyNixyNiwxNgotCWx3eglyOCwtMTYocjYpCS8qIG1hc2sgKi8KLQlhbmQJcjgscjgscjQKLQlsd3oJcjksLTEyKHI2KQkvKiB2YWx1ZSAqLwotCWNtcGx3CTAscjgscjkKLQliZXEJMWIKLQlsd3oJcjgsLTgocjYpCS8qIHNlY3Rpb24gYmVnaW4gKi8KLQlsd3oJcjksLTQocjYpCS8qIHNlY3Rpb24gZW5kICovCi0Jc3ViZi4JcjkscjgscjkKLQliZXEJMWIKLQkvKiB3cml0ZSBub3BzIG92ZXIgdGhlIHNlY3Rpb24gb2YgY29kZSAqLwotCS8qIHRvZG86IGlmIGxhcmdlIHNlY3Rpb24sIGFkZCBhIGJyYW5jaCBhdCB0aGUgc3RhcnQgb2YgaXQgKi8KLQlzcndpCXI5LHI5LDIKLQltdGN0cglyOQotCWFkZAlyOCxyOCxyMwotCWxpcwlyMCwweDYwMDAwMDAwQGgJLyogbm9wICovCi0zOglzdHcJcjAsMChyOCkKLQlhbmRpLglyMTAscjQsQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRUBsCi0JYmVxCTJmCi0JZGNic3QJMCxyOAkJLyogc3Vib3B0aW1hbCwgYnV0IHNpbXBsZXIgKi8KLQlzeW5jCi0JaWNiaQkwLHI4Ci0yOglhZGRpCXI4LHI4LDQKLQliZG56CTNiCi0Jc3luYwkJCS8qIGFkZGl0aW9uYWwgc3luYyBuZWVkZWQgb24gZzQgKi8KLQlpc3luYwotCWIJMWIKLQotLyoKICAqIGNhbGxfc2V0dXBfY3B1IC0gY2FsbCB0aGUgc2V0dXBfY3B1IGZ1bmN0aW9uIGZvciB0aGlzIGNwdQogICogcjMgPSBkYXRhIG9mZnNldCwgcjI0ID0gY3B1IG51bWJlcgogICoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKaW5kZXggYzcwZTIwNy4uMjFmZDJjNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKQEAgLTI0NiwxMzAgKzI0Niw2IEBACiAJaXN5bmMKIAlibHIKIAotLyoKLSAqIGlkZW50aWZ5X2NwdSBhbmQgY2FsbHMgc2V0dXBfY3B1Ci0gKiBJbjoJcjMgPSBiYXNlIG9mIHRoZSBjcHVfc3BlY3MgYXJyYXkKLSAqCXI0ID0gYWRkcmVzcyBvZiBjdXJfY3B1X3NwZWMKLSAqCXI1ID0gcmVsb2NhdGlvbiBvZmZzZXQKLSAqLwotX0dMT0JBTChpZGVudGlmeV9jcHUpCi0JbWZwdnIJcjcKLTE6Ci0JbHd6CXI4LENQVV9TUEVDX1BWUl9NQVNLKHIzKQotCWFuZAlyOCxyOCxyNwotCWx3eglyOSxDUFVfU1BFQ19QVlJfVkFMVUUocjMpCi0JY21wbHcJMCxyOSxyOAotCWJlcQkxZgotCWFkZGkJcjMscjMsQ1BVX1NQRUNfRU5UUllfU0laRQotCWIJMWIKLTE6Ci0Jc3ViCXIwLHIzLHI1Ci0Jc3RkCXIwLDAocjQpCi0JbGQJcjQsQ1BVX1NQRUNfU0VUVVAocjMpCi0JY21wZGkJMCxyNCwwCi0JYWRkCXI0LHI0LHI1Ci0JYmVxbHIKLQlsZAlyNCwwKHI0KQotCWFkZAlyNCxyNCxyNQotCW10Y3RyCXI0Ci0JLyogQ2FsbGluZyBjb252ZW50aW9uIGZvciBjcHUgc2V0dXAgaXMgcjM9b2Zmc2V0LCByND1jdXJfY3B1X3NwZWMgKi8KLQltcglyNCxyMwotCW1yCXIzLHI1Ci0JYmN0cgotCi0vKgotICogZG9fY3B1X2Z0cl9maXh1cHMgLSBnb2VzIHRocm91Z2ggdGhlIGxpc3Qgb2YgQ1BVIGZlYXR1cmUgZml4dXBzCi0gKiBhbmQgd3JpdGVzIG5vcCdzIG92ZXIgc2VjdGlvbnMgb2YgY29kZSB0aGF0IGRvbid0IGFwcGx5IGZvciB0aGlzIGNwdS4KLSAqIHIzID0gZGF0YSBvZmZzZXQgKG5vdCBjaGFuZ2VkKQotICovCi1fR0xPQkFMKGRvX2NwdV9mdHJfZml4dXBzKQotCS8qIEdldCBDUFUgMCBmZWF0dXJlcyAqLwotCUxPQURfUkVHX0lNTUVESUFURShyNixjdXJfY3B1X3NwZWMpCi0Jc3ViCXI2LHI2LHIzCi0JbGQJcjQsMChyNikKLQlzdWIJcjQscjQscjMKLQlsZAlyNCxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKLQkvKiBHZXQgdGhlIGZpeHVwIHRhYmxlICovCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI2LF9fc3RhcnRfX19mdHJfZml4dXApCi0Jc3ViCXI2LHI2LHIzCi0JTE9BRF9SRUdfSU1NRURJQVRFKHI3LF9fc3RvcF9fX2Z0cl9maXh1cCkKLQlzdWIJcjcscjcscjMKLQkvKiBEbyB0aGUgZml4dXAgKi8KLTE6CWNtcGxkCXI2LHI3Ci0JYmdlbHIKLQlhZGRpCXI2LHI2LDMyCi0JbGQJcjgsLTMyKHI2KQkvKiBtYXNrICovCi0JYW5kCXI4LHI4LHI0Ci0JbGQJcjksLTI0KHI2KQkvKiB2YWx1ZSAqLwotCWNtcGxkCXI4LHI5Ci0JYmVxCTFiCi0JbGQJcjgsLTE2KHI2KQkvKiBzZWN0aW9uIGJlZ2luICovCi0JbGQJcjksLTgocjYpCS8qIHNlY3Rpb24gZW5kICovCi0Jc3ViZi4JcjkscjgscjkKLQliZXEJMWIKLQkvKiB3cml0ZSBub3BzIG92ZXIgdGhlIHNlY3Rpb24gb2YgY29kZSAqLwotCS8qIHRvZG86IGlmIGxhcmdlIHNlY3Rpb24sIGFkZCBhIGJyYW5jaCBhdCB0aGUgc3RhcnQgb2YgaXQgKi8KLQlzcndpCXI5LHI5LDIKLQltdGN0cglyOQotCXN1YglyOCxyOCxyMwotCWxpcwlyMCwweDYwMDAwMDAwQGgJLyogbm9wICovCi0zOglzdHcJcjAsMChyOCkKLQlhbmRpLglyMTAscjQsQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRUBsCi0JYmVxCTJmCi0JZGNic3QJMCxyOAkJLyogc3Vib3B0aW1hbCwgYnV0IHNpbXBsZXIgKi8KLQlzeW5jCi0JaWNiaQkwLHI4Ci0yOglhZGRpCXI4LHI4LDQKLQliZG56CTNiCi0Jc3luYwkJCS8qIGFkZGl0aW9uYWwgc3luYyBuZWVkZWQgb24gZzQgKi8KLQlpc3luYwotCWIJMWIKLQotLyoKLSAqIGRvX2Z3X2Z0cl9maXh1cHMgLSBnb2VzIHRocm91Z2ggdGhlIGxpc3Qgb2YgZmlybXdhcmUgZmVhdHVyZSBmaXh1cHMKLSAqIGFuZCB3cml0ZXMgbm9wJ3Mgb3ZlciBzZWN0aW9ucyBvZiBjb2RlIHRoYXQgZG9uJ3QgYXBwbHkgZm9yIHRoaXMgZmlybXdhcmUuCi0gKiByMyA9IGRhdGEgb2Zmc2V0IChub3QgY2hhbmdlZCkKLSAqLwotX0dMT0JBTChkb19md19mdHJfZml4dXBzKQotCS8qIEdldCBmaXJtd2FyZSBmZWF0dXJlcyAqLwotCUxPQURfUkVHX0lNTUVESUFURShyNixwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzKQotCXN1YglyNixyNixyMwotCWxkCXI0LDAocjYpCi0JLyogR2V0IHRoZSBmaXh1cCB0YWJsZSAqLwotCUxPQURfUkVHX0lNTUVESUFURShyNixfX3N0YXJ0X19fZndfZnRyX2ZpeHVwKQotCXN1YglyNixyNixyMwotCUxPQURfUkVHX0lNTUVESUFURShyNyxfX3N0b3BfX19md19mdHJfZml4dXApCi0Jc3ViCXI3LHI3LHIzCi0JLyogRG8gdGhlIGZpeHVwICovCi0xOgljbXBsZAlyNixyNwotCWJnZWxyCi0JYWRkaQlyNixyNiwzMgotCWxkCXI4LC0zMihyNikJLyogbWFzayAqLwotCWFuZAlyOCxyOCxyNAotCWxkCXI5LC0yNChyNikJLyogdmFsdWUgKi8KLQljbXBsZAlyOCxyOQotCWJlcQkxYgotCWxkCXI4LC0xNihyNikJLyogc2VjdGlvbiBiZWdpbiAqLwotCWxkCXI5LC04KHI2KQkvKiBzZWN0aW9uIGVuZCAqLwotCXN1YmYuCXI5LHI4LHI5Ci0JYmVxCTFiCi0JLyogd3JpdGUgbm9wcyBvdmVyIHRoZSBzZWN0aW9uIG9mIGNvZGUgKi8KLQkvKiB0b2RvOiBpZiBsYXJnZSBzZWN0aW9uLCBhZGQgYSBicmFuY2ggYXQgdGhlIHN0YXJ0IG9mIGl0ICovCi0Jc3J3aQlyOSxyOSwyCi0JbXRjdHIJcjkKLQlzdWIJcjgscjgscjMKLQlsaXMJcjAsMHg2MDAwMDAwMEBoCS8qIG5vcCAqLwotMzoJc3R3CXIwLDAocjgpCi1CRUdJTl9GVFJfU0VDVElPTgotCWRjYnN0CTAscjgJCS8qIHN1Ym9wdGltYWwsIGJ1dCBzaW1wbGVyICovCi0Jc3luYwotCWljYmkJMCxyOAotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUpCi0JYWRkaQlyOCxyOCw0Ci0JYmRuegkzYgotCXN5bmMJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMKLQliCTFiCiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykgfHwgZGVmaW5lZChDT05GSUdfUFBDX01BUExFKQogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZV8zMi5jCmluZGV4IDkyZjRlNWYuLjgzMzlmZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfMzIuYwpAQCAtMjMsNiArMjMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisKKyNpbmNsdWRlICJzZXR1cC5oIgogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC0yNjksMzkgKzI3Miw0NCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCi0JCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKLQkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQorc3RhdGljIGNvbnN0IEVsZl9TaGRyICpmaW5kX3NlY3Rpb24oY29uc3QgRWxmX0VoZHIgKmhkciwKKwkJCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJY2hhciAqc2Vjc3RyaW5nczsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCW1lLT5hcmNoLmJ1Z190YWJsZSA9IE5VTEw7Ci0JbWUtPmFyY2gubnVtX2J1Z3MgPSAwOwotCi0JLyogRmluZCB0aGUgX19idWdfdGFibGUgc2VjdGlvbiwgaWYgcHJlc2VudCAqLwogCXNlY3N0cmluZ3MgPSAoY2hhciAqKWhkciArIHNlY2hkcnNbaGRyLT5lX3Noc3RybmR4XS5zaF9vZmZzZXQ7Ci0JZm9yIChpID0gMTsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKSB7Ci0JCWlmIChzdHJjbXAoc2Vjc3RyaW5ncytzZWNoZHJzW2ldLnNoX25hbWUsICJfX2J1Z190YWJsZSIpKQotCQkJY29udGludWU7Ci0JCW1lLT5hcmNoLmJ1Z190YWJsZSA9ICh2b2lkICopIHNlY2hkcnNbaV0uc2hfYWRkcjsKLQkJbWUtPmFyY2gubnVtX2J1Z3MgPSBzZWNoZHJzW2ldLnNoX3NpemUgLyBzaXplb2Yoc3RydWN0IGJ1Z19lbnRyeSk7Ci0JCWJyZWFrOwotCX0KKwlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspCisJCWlmIChzdHJjbXAoc2Vjc3RyaW5ncytzZWNoZHJzW2ldLnNoX25hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gJnNlY2hkcnNbaV07CisJcmV0dXJuIE5VTEw7Cit9CiAKLQkvKgotCSAqIFN0cmljdGx5IHNwZWFraW5nIHRoaXMgc2hvdWxkIGhhdmUgYSBzcGlubG9jayB0byBwcm90ZWN0IGFnYWluc3QKLQkgKiB0cmF2ZXJzYWxzLCBidXQgc2luY2Ugd2Ugb25seSB0cmF2ZXJzZSBvbiBCVUcoKXMsIGEgc3BpbmxvY2sKLQkgKiBjb3VsZCBwb3RlbnRpYWxseSBsZWFkIHRvIGRlYWRsb2NrIGFuZCB0aHVzIGJlIGNvdW50ZXItcHJvZHVjdGl2ZS4KLQkgKi8KLQlsaXN0X2FkZCgmbWUtPmFyY2guYnVnX2xpc3QsICZtb2R1bGVfYnVnX2xpc3QpOworaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAorCQkgICAgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCisJCSAgICBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwljb25zdCBFbGZfU2hkciAqc2VjdDsKKwlpbnQgZXJyOworCisJZXJyID0gbW9kdWxlX2J1Z19maW5hbGl6ZShoZHIsIHNlY2hkcnMsIG1lKTsKKwlpZiAoZXJyKQkJLyogbmV2ZXIgdHJ1ZSwgY3VycmVudGx5ICovCisJCXJldHVybiBlcnI7CisKKwkvKiBBcHBseSBmZWF0dXJlIGZpeHVwcyAqLworCXNlY3QgPSBmaW5kX3NlY3Rpb24oaGRyLCBzZWNoZHJzLCAiX19mdHJfZml4dXAiKTsKKwlpZiAoc2VjdCAhPSBOVUxMKQorCQlkb19mZWF0dXJlX2ZpeHVwcyhjdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcywKKwkJCQkgICh2b2lkICopc2VjdC0+c2hfYWRkciwKKwkJCQkgICh2b2lkICopc2VjdC0+c2hfYWRkciArIHNlY3QtPnNoX3NpemUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7Ci0JbGlzdF9kZWwoJm1vZC0+YXJjaC5idWdfbGlzdCk7CisJbW9kdWxlX2J1Z19jbGVhbnVwKG1vZCk7CiB9CiAKIHN0cnVjdCBidWdfZW50cnkgKm1vZHVsZV9maW5kX2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGVfNjQuYwppbmRleCBiYTM0MDAxLi43NWM3YzRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlXzY0LmMKQEAgLTIwLDggKzIwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGFzbS9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorCisjaW5jbHVkZSAic2V0dXAuaCIKIAogLyogRklYTUU6IFdlIGRvbid0IGRvIC5pbml0IHNlcGFyYXRlbHkuICBUbyBkbyB0aGlzLCB3ZSdkIG5lZWQgdG8gaGF2ZQogICAgYSBzZXBhcmF0ZSByMiB2YWx1ZSBpbiB0aGUgaW5pdCBhbmQgY29yZSBzZWN0aW9uLCBhbmQgc3R1YiBiZXR3ZWVuCkBAIC00MDAsNiArNDA0LDExIEBACiAJCQkJfCAodmFsdWUgJiAweDAzZmZmZmZjKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgUl9QUEM2NF9SRUw2NDoKKwkJCS8qIDY0IGJpdHMgcmVsYXRpdmUgKHVzZWQgYnkgZmVhdHVyZXMgZml4dXBzKSAqLworCQkJKmxvY2F0aW9uID0gdmFsdWUgLSAodW5zaWduZWQgbG9uZylsb2NhdGlvbjsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoIiVzOiBVbmtub3duIEFERCByZWxvY2F0aW9uOiAlbHVcbiIsCiAJCQkgICAgICAgbWUtPm5hbWUsCkBAIC00MTMsMzggKzQyMiw0OSBAQAogCiBMSVNUX0hFQUQobW9kdWxlX2J1Z19saXN0KTsKIAotaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAotCQljb25zdCBFbGZfU2hkciAqc2VjaGRycywgc3RydWN0IG1vZHVsZSAqbWUpCitzdGF0aWMgY29uc3QgRWxmX1NoZHIgKmZpbmRfc2VjdGlvbihjb25zdCBFbGZfRWhkciAqaGRyLAorCQkJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKKwkJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKIAljaGFyICpzZWNzdHJpbmdzOwogCXVuc2lnbmVkIGludCBpOwogCi0JbWUtPmFyY2guYnVnX3RhYmxlID0gTlVMTDsKLQltZS0+YXJjaC5udW1fYnVncyA9IDA7Ci0KLQkvKiBGaW5kIHRoZSBfX2J1Z190YWJsZSBzZWN0aW9uLCBpZiBwcmVzZW50ICovCiAJc2Vjc3RyaW5ncyA9IChjaGFyICopaGRyICsgc2VjaGRyc1toZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKLQlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKLQkJaWYgKHN0cmNtcChzZWNzdHJpbmdzK3NlY2hkcnNbaV0uc2hfbmFtZSwgIl9fYnVnX3RhYmxlIikpCi0JCQljb250aW51ZTsKLQkJbWUtPmFyY2guYnVnX3RhYmxlID0gKHZvaWQgKikgc2VjaGRyc1tpXS5zaF9hZGRyOwotCQltZS0+YXJjaC5udW1fYnVncyA9IHNlY2hkcnNbaV0uc2hfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KTsKLQkJYnJlYWs7Ci0JfQorCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykKKwkJaWYgKHN0cmNtcChzZWNzdHJpbmdzK3NlY2hkcnNbaV0uc2hfbmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiAmc2VjaGRyc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KIAotCS8qCi0JICogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBzaG91bGQgaGF2ZSBhIHNwaW5sb2NrIHRvIHByb3RlY3QgYWdhaW5zdAotCSAqIHRyYXZlcnNhbHMsIGJ1dCBzaW5jZSB3ZSBvbmx5IHRyYXZlcnNlIG9uIEJVRygpcywgYSBzcGlubG9jawotCSAqIGNvdWxkIHBvdGVudGlhbGx5IGxlYWQgdG8gZGVhZGxvY2sgYW5kIHRodXMgYmUgY291bnRlci1wcm9kdWN0aXZlLgotCSAqLwotCWxpc3RfYWRkKCZtZS0+YXJjaC5idWdfbGlzdCwgJm1vZHVsZV9idWdfbGlzdCk7CitpbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCisJCWNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLCBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKwljb25zdCBFbGZfU2hkciAqc2VjdDsKKwlpbnQgZXJyOworCisJZXJyID0gbW9kdWxlX2J1Z19maW5hbGl6ZShoZHIsIHNlY2hkcnMsIG1lKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogQXBwbHkgZmVhdHVyZSBmaXh1cHMgKi8KKwlzZWN0ID0gZmluZF9zZWN0aW9uKGhkciwgc2VjaGRycywgIl9fZnRyX2ZpeHVwIik7CisJaWYgKHNlY3QgIT0gTlVMTCkKKwkJZG9fZmVhdHVyZV9maXh1cHMoY3VyX2NwdV9zcGVjLT5jcHVfZmVhdHVyZXMsCisJCQkJICAodm9pZCAqKXNlY3QtPnNoX2FkZHIsCisJCQkJICAodm9pZCAqKXNlY3QtPnNoX2FkZHIgKyBzZWN0LT5zaF9zaXplKTsKKworCXNlY3QgPSBmaW5kX3NlY3Rpb24oaGRyLCBzZWNoZHJzLCAiX19md19mdHJfZml4dXAiKTsKKwlpZiAoc2VjdCAhPSBOVUxMKQorCQlkb19mZWF0dXJlX2ZpeHVwcyhwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzLAorCQkJCSAgKHZvaWQgKilzZWN0LT5zaF9hZGRyLAorCQkJCSAgKHZvaWQgKilzZWN0LT5zaF9hZGRyICsgc2VjdC0+c2hfc2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKLQlsaXN0X2RlbCgmbW9kLT5hcmNoLmJ1Z19saXN0KTsKKwltb2R1bGVfYnVnX2NsZWFudXAobW9kKTsKIH0KIAogc3RydWN0IGJ1Z19lbnRyeSAqbW9kdWxlX2ZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYwppbmRleCA2OTYwZjA5Li44NjljZWJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jCkBAIC01MDUsNyArNTA1LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJdG90YWxfc2l6ZSA9IHBwY19tZC5udnJhbV9zaXplKCk7CiAJCi0JaGVhZGVyID0gKGNoYXIgKikga21hbGxvYyhOVlJBTV9IRUFERVJfTEVOLCBHRlBfS0VSTkVMKTsKKwloZWFkZXIgPSBrbWFsbG9jKE5WUkFNX0hFQURFUl9MRU4sIEdGUF9LRVJORUwpOwogCWlmICghaGVhZGVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibnZyYW1fc2Nhbl9wYXJ0aXRpb25zOiBGYWlsZWQga21hbGxvY1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTc0LDcgKzU3NCw3IEBACiAJfQogICAJCiAgIAkvKiBpbml0aWFsaXplIG91ciBhbmNob3IgZm9yIHRoZSBudnJhbSBwYXJ0aXRpb24gbGlzdCAqLwotICAJbnZyYW1fcGFydCA9IChzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBudnJhbV9wYXJ0aXRpb24pLCBHRlBfS0VSTkVMKTsKKyAgCW52cmFtX3BhcnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uKSwgR0ZQX0tFUk5FTCk7CiAgIAlpZiAoIW52cmFtX3BhcnQpIHsKICAgCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX2luaXQ6IEZhaWxlZCBrbWFsbG9jXG4iKTsKICAgCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jCmluZGV4IDM5N2M4M2UuLmU5MjE1MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYwpAQCAtOSw2ICs5LDM0IEBACiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogCiAvKioKKyAqIG9mX21hdGNoX25vZGUgLSBUZWxsIGlmIGFuIGRldmljZV9ub2RlIGhhcyBhIG1hdGNoaW5nIG9mX21hdGNoIHN0cnVjdHVyZQorICogQGlkczogYXJyYXkgb2Ygb2YgZGV2aWNlIG1hdGNoIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCisgKiBAbm9kZTogdGhlIG9mIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqIExvdyBsZXZlbCB1dGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgZGV2aWNlIG1hdGNoaW5nLgorICovCitjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9ub2RlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkJCSBjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJd2hpbGUgKG1hdGNoZXMtPm5hbWVbMF0gfHwgbWF0Y2hlcy0+dHlwZVswXSB8fCBtYXRjaGVzLT5jb21wYXRpYmxlWzBdKSB7CisJCWludCBtYXRjaCA9IDE7CisJCWlmIChtYXRjaGVzLT5uYW1lWzBdKQorCQkJbWF0Y2ggJj0gbm9kZS0+bmFtZQorCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+bmFtZSwgbm9kZS0+bmFtZSk7CisJCWlmIChtYXRjaGVzLT50eXBlWzBdKQorCQkJbWF0Y2ggJj0gbm9kZS0+dHlwZQorCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+dHlwZSwgbm9kZS0+dHlwZSk7CisJCWlmIChtYXRjaGVzLT5jb21wYXRpYmxlWzBdKQorCQkJbWF0Y2ggJj0gZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwKKwkJCQkJCSAgICAgIG1hdGNoZXMtPmNvbXBhdGlibGUpOworCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gbWF0Y2hlczsKKwkJbWF0Y2hlcysrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCiAgKiBvZl9tYXRjaF9kZXZpY2UgLSBUZWxsIGlmIGFuIG9mX2RldmljZSBzdHJ1Y3R1cmUgaGFzIGEgbWF0Y2hpbmcKICAqIG9mX21hdGNoIHN0cnVjdHVyZQogICogQGlkczogYXJyYXkgb2Ygb2YgZGV2aWNlIG1hdGNoIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCkBAIC0yMiwzNCArNTAsNyBAQAogewogCWlmICghZGV2LT5ub2RlKQogCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAobWF0Y2hlcy0+bmFtZVswXSB8fCBtYXRjaGVzLT50eXBlWzBdIHx8IG1hdGNoZXMtPmNvbXBhdGlibGVbMF0pIHsKLQkJaW50IG1hdGNoID0gMTsKLQkJaWYgKG1hdGNoZXMtPm5hbWVbMF0pCi0JCQltYXRjaCAmPSBkZXYtPm5vZGUtPm5hbWUKLQkJCQkmJiAhc3RyY21wKG1hdGNoZXMtPm5hbWUsIGRldi0+bm9kZS0+bmFtZSk7Ci0JCWlmIChtYXRjaGVzLT50eXBlWzBdKQotCQkJbWF0Y2ggJj0gZGV2LT5ub2RlLT50eXBlCi0JCQkJJiYgIXN0cmNtcChtYXRjaGVzLT50eXBlLCBkZXYtPm5vZGUtPnR5cGUpOwotCQlpZiAobWF0Y2hlcy0+Y29tcGF0aWJsZVswXSkKLQkJCW1hdGNoICY9IGRldmljZV9pc19jb21wYXRpYmxlKGRldi0+bm9kZSwKLQkJCQltYXRjaGVzLT5jb21wYXRpYmxlKTsKLQkJaWYgKG1hdGNoKQotCQkJcmV0dXJuIG1hdGNoZXM7Ci0JCW1hdGNoZXMrKzsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7Ci0Jc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIG9mX2RydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkcnYpOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKiBtYXRjaGVzID0gb2ZfZHJ2LT5tYXRjaF90YWJsZTsKLQotCWlmICghbWF0Y2hlcykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gb2ZfbWF0Y2hfZGV2aWNlKG1hdGNoZXMsIG9mX2RldikgIT0gTlVMTDsKKwlyZXR1cm4gb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBkZXYtPm5vZGUpOwogfQogCiBzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXZfZ2V0KHN0cnVjdCBvZl9kZXZpY2UgKmRldikKQEAgLTcxLDk2ICs3Miw4IEBACiAJCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKIH0KIAotCi1zdGF0aWMgaW50IG9mX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IGVycm9yID0gLUVOT0RFVjsKLQlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnY7Ci0Jc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2OwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCi0JZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQotCWlmICghZHJ2LT5wcm9iZSkKLQkJcmV0dXJuIGVycm9yOwotCi0Jb2ZfZGV2X2dldChvZl9kZXYpOwotCi0JbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoZHJ2LT5tYXRjaF90YWJsZSwgb2ZfZGV2KTsKLQlpZiAobWF0Y2gpCi0JCWVycm9yID0gZHJ2LT5wcm9iZShvZl9kZXYsIG1hdGNoKTsKLQlpZiAoZXJyb3IpCi0JCW9mX2Rldl9wdXQob2ZfZGV2KTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBvZl9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7Ci0Jc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIGRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0KLQlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5yZW1vdmUpCi0JCWRydi0+cmVtb3ZlKG9mX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOwotCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWludCBlcnJvciA9IDA7Ci0KLQlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zdXNwZW5kKQotCQllcnJvciA9IGRydi0+c3VzcGVuZChvZl9kZXYsIHN0YXRlKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQotewotCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpbnQgZXJyb3IgPSAwOwotCi0JaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVzdW1lKQotCQllcnJvciA9IGRydi0+cmVzdW1lKG9mX2Rldik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgPSB7Ci0gICAgICAgLm5hbWUJPSAib2ZfcGxhdGZvcm0iLAotICAgICAgIC5tYXRjaAk9IG9mX3BsYXRmb3JtX2J1c19tYXRjaCwKLSAgICAgICAucHJvYmUJPSBvZl9kZXZpY2VfcHJvYmUsCi0gICAgICAgLnJlbW92ZQk9IG9mX2RldmljZV9yZW1vdmUsCi0gICAgICAgLnN1c3BlbmQJPSBvZl9kZXZpY2Vfc3VzcGVuZCwKLSAgICAgICAucmVzdW1lCT0gb2ZfZGV2aWNlX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9mX2J1c19kcml2ZXJfaW5pdCh2b2lkKQotewotCXJldHVybiBidXNfcmVnaXN0ZXIoJm9mX3BsYXRmb3JtX2J1c190eXBlKTsKLX0KLQotcG9zdGNvcmVfaW5pdGNhbGwob2ZfYnVzX2RyaXZlcl9pbml0KTsKLQotaW50IG9mX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYpCi17Ci0JLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLwotCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7Ci0JZHJ2LT5kcml2ZXIuYnVzID0gJm9mX3BsYXRmb3JtX2J1c190eXBlOwotCi0JLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCi0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwotfQotCi12b2lkIG9mX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydikKLXsKLQlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGRldl9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgZGV2X3Nob3dfZGV2c3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldjsKIApAQCAtMTk2LDkgKzEwOSw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKLQotCXJldHVybiAwOworCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKIH0KIAogdm9pZCBvZl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKQEAgLTIwOCw0MSArMTE5LDExIEBACiAJZGV2aWNlX3VucmVnaXN0ZXIoJm9mZGV2LT5kZXYpOwogfQogCi1zdHJ1Y3Qgb2ZfZGV2aWNlKiBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCSAgICBjb25zdCBjaGFyICpidXNfaWQsCi0JCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCi17Ci0Jc3RydWN0IG9mX2RldmljZSAqZGV2OwogCi0JZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2KQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwotCi0JZGV2LT5ub2RlID0gb2Zfbm9kZV9nZXQobnApOwotCWRldi0+ZG1hX21hc2sgPSAweGZmZmZmZmZmVUw7Ci0JZGV2LT5kZXYuZG1hX21hc2sgPSAmZGV2LT5kbWFfbWFzazsKLQlkZXYtPmRldi5wYXJlbnQgPSBwYXJlbnQ7Ci0JZGV2LT5kZXYuYnVzID0gJm9mX3BsYXRmb3JtX2J1c190eXBlOwotCWRldi0+ZGV2LnJlbGVhc2UgPSBvZl9yZWxlYXNlX2RldjsKLQotCXN0cmxjcHkoZGV2LT5kZXYuYnVzX2lkLCBidXNfaWQsIEJVU19JRF9TSVpFKTsKLQotCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoZGV2KSAhPSAwKSB7Ci0JCWtmcmVlKGRldik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiBkZXY7Ci19Ci0KK0VYUE9SVF9TWU1CT0wob2ZfbWF0Y2hfbm9kZSk7CiBFWFBPUlRfU1lNQk9MKG9mX21hdGNoX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKG9mX3BsYXRmb3JtX2J1c190eXBlKTsKLUVYUE9SVF9TWU1CT0wob2ZfcmVnaXN0ZXJfZHJpdmVyKTsKLUVYUE9SVF9TWU1CT0wob2ZfdW5yZWdpc3Rlcl9kcml2ZXIpOwogRVhQT1JUX1NZTUJPTChvZl9kZXZpY2VfcmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChvZl9kZXZpY2VfdW5yZWdpc3Rlcik7CiBFWFBPUlRfU1lNQk9MKG9mX2Rldl9nZXQpOwogRVhQT1JUX1NZTUJPTChvZl9kZXZfcHV0KTsKLUVYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZSk7CiBFWFBPUlRfU1lNQk9MKG9mX3JlbGVhc2VfZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDAyZWEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgorICoJCQkgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqICAgIGFuZAkJIEFybmQgQmVyZ21hbm4sIElCTSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vZGNyLmg+CisjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS90b3BvbG9neS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKworLyoKKyAqIFRoZSBsaXN0IG9mIE9GIElEcyBiZWxvdyBpcyB1c2VkIGZvciBtYXRjaGluZyBidXMgdHlwZXMgaW4gdGhlCisgKiBzeXN0ZW0gd2hvc2UgZGV2aWNlcyBhcmUgdG8gYmUgZXhwb3NlZCBhcyBvZl9wbGF0Zm9ybV9kZXZpY2VzLgorICoKKyAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgbGlzdCB2YWxpZCBmb3IgbW9zdCBwbGF0Zm9ybXMuIFRoaXMgZmlsZSBwcm92aWRlcworICogZnVuY3Rpb25zIHdobyBjYW4gdGFrZSBhbiBleHBsaWNpdCBsaXN0IGlmIG5lY2Vzc2FyeSB0aG91Z2gKKyAqCisgKiBUaGUgc2VhcmNoIGlzIGFsd2F5cyBwZXJmb3JtZWQgcmVjdXJzaXZlbHkgbG9va2luZyBmb3IgY2hpbGRyZW4gb2YKKyAqIHRoZSBwcm92aWRlZCBkZXZpY2Vfbm9kZSBhbmQgcmVjdXJzaXZlbHkgaWYgc3VjaCBhIGNoaWxkcmVuIG1hdGNoZXMKKyAqIGEgYnVzIHR5cGUgaW4gdGhlIGxpc3QKKyAqLworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBvZl9kZWZhdWx0X2J1c19pZHNbXSA9IHsKKwl7IC50eXBlID0gInNvYyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAorCXsgLnR5cGUgPSAic3BpZGVyIiwgfSwKKwl7IC50eXBlID0gImF4b24iLCB9LAorCXsgLnR5cGUgPSAicGxiNSIsIH0sCisJeyAudHlwZSA9ICJwbGI0IiwgfSwKKwl7IC50eXBlID0gIm9wYiIsIH0sCisJe30sCit9OworCitzdGF0aWMgYXRvbWljX3QgYnVzX25vX3JlZ19tYWdpYzsKKworLyoKKyAqCisgKiBPRiBwbGF0Zm9ybSBkZXZpY2UgdHlwZSBkZWZpbml0aW9uICYgYmFzZSBpbmZyYXN0cnVjdHVyZQorICoKKyAqLworCitzdGF0aWMgaW50IG9mX3BsYXRmb3JtX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOworCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBvZl9kcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICogbWF0Y2hlcyA9IG9mX2Rydi0+bWF0Y2hfdGFibGU7CisKKwlpZiAoIW1hdGNoZXMpCisJCXJldHVybiAwOworCisJcmV0dXJuIG9mX21hdGNoX2RldmljZShtYXRjaGVzLCBvZl9kZXYpICE9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydjsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXY7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisKKwlkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCW9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOworCisJaWYgKCFkcnYtPnByb2JlKQorCQlyZXR1cm4gZXJyb3I7CisKKwlvZl9kZXZfZ2V0KG9mX2Rldik7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShkcnYtPm1hdGNoX3RhYmxlLCBvZl9kZXYpOworCWlmIChtYXRjaCkKKwkJZXJyb3IgPSBkcnYtPnByb2JlKG9mX2RldiwgbWF0Y2gpOworCWlmIChlcnJvcikKKwkJb2ZfZGV2X3B1dChvZl9kZXYpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG9mX3BsYXRmb3JtX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPnJlbW92ZSkKKwkJZHJ2LT5yZW1vdmUob2ZfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIGRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaW50IGVycm9yID0gMDsKKworCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPnN1c3BlbmQpCisJCWVycm9yID0gZHJ2LT5zdXNwZW5kKG9mX2Rldiwgc3RhdGUpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOworCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5yZXN1bWUpCisJCWVycm9yID0gZHJ2LT5yZXN1bWUob2ZfZGV2KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0cnVjdCBidXNfdHlwZSBvZl9wbGF0Zm9ybV9idXNfdHlwZSA9IHsKKyAgICAgICAubmFtZQk9ICJvZl9wbGF0Zm9ybSIsCisgICAgICAgLm1hdGNoCT0gb2ZfcGxhdGZvcm1fYnVzX21hdGNoLAorICAgICAgIC5wcm9iZQk9IG9mX3BsYXRmb3JtX2RldmljZV9wcm9iZSwKKyAgICAgICAucmVtb3ZlCT0gb2ZfcGxhdGZvcm1fZGV2aWNlX3JlbW92ZSwKKyAgICAgICAuc3VzcGVuZAk9IG9mX3BsYXRmb3JtX2RldmljZV9zdXNwZW5kLAorICAgICAgIC5yZXN1bWUJPSBvZl9wbGF0Zm9ybV9kZXZpY2VfcmVzdW1lLAorfTsKK0VYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fYnVzX3R5cGUpOworCitzdGF0aWMgaW50IF9faW5pdCBvZl9idXNfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZvZl9wbGF0Zm9ybV9idXNfdHlwZSk7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKG9mX2J1c19kcml2ZXJfaW5pdCk7CisKK2ludCBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KQoreworCS8qIGluaXRpYWxpemUgY29tbW9uIGRyaXZlciBmaWVsZHMgKi8KKwlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOworCWRydi0+ZHJpdmVyLmJ1cyA9ICZvZl9wbGF0Zm9ybV9idXNfdHlwZTsKKworCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0wob2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKTsKKwordm9pZCBvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcihzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0wob2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIpOworCitzdGF0aWMgdm9pZCBvZl9wbGF0Zm9ybV9tYWtlX2J1c19pZChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gZGV2LT5ub2RlOworCWNoYXIgKm5hbWUgPSBkZXYtPmRldi5idXNfaWQ7CisJY29uc3QgdTMyICpyZWc7CisJdTY0IGFkZHI7CisJaW50IG1hZ2ljOworCisJLyoKKwkgKiBJZiBpdCdzIGEgRENSIGJhc2VkIGRldmljZSwgdXNlICdkJyBmb3IgbmF0aXZlIERDUnMKKwkgKiBhbmQgJ0QnIGZvciBNTUlPIERDUnMuCisJICovCisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKwlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgImRjci1yZWciLCBOVUxMKTsKKwlpZiAocmVnKSB7CisjaWZkZWYgQ09ORklHX1BQQ19EQ1JfTkFUSVZFCisJCXNucHJpbnRmKG5hbWUsIEJVU19JRF9TSVpFLCAiZCV4LiVzIiwKKwkJCSAqcmVnLCBub2RlLT5uYW1lKTsKKyNlbHNlIC8qIENPTkZJR19QUENfRENSX05BVElWRSAqLworCQlhZGRyID0gb2ZfdHJhbnNsYXRlX2Rjcl9hZGRyZXNzKG5vZGUsICpyZWcsIE5VTEwpOworCQlpZiAoYWRkciAhPSBPRl9CQURfQUREUikgeworCQkJc25wcmludGYobmFtZSwgQlVTX0lEX1NJWkUsCisJCQkJICJEJWxseC4lcyIsICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkciwKKwkJCQkgbm9kZS0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvKiAhQ09ORklHX1BQQ19EQ1JfTkFUSVZFICovCisJfQorI2VuZGlmIC8qIENPTkZJR19QUENfRENSICovCisKKwkvKgorCSAqIEZvciBNTUlPLCBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwkgKi8KKwlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCWlmIChyZWcpIHsKKwkJYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5vZGUsIHJlZyk7CisJCWlmIChhZGRyICE9IE9GX0JBRF9BRERSKSB7CisJCQlzbnByaW50ZihuYW1lLCBCVVNfSURfU0laRSwKKwkJCQkgIiVsbHguJXMiLCAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIsCisJCQkJIG5vZGUtPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBObyBCdXNJRCwgdXNlIHRoZSBub2RlIG5hbWUgYW5kIGFkZCBhIGdsb2JhbGx5IGluY3JlbWVudGVkCisJICogY291bnRlciAoYW5kIHByYXkuLi4pCisJICovCisJbWFnaWMgPSBhdG9taWNfYWRkX3JldHVybigxLCAmYnVzX25vX3JlZ19tYWdpYyk7CisJc25wcmludGYobmFtZSwgQlVTX0lEX1NJWkUsICIlcy4lZCIsIG5vZGUtPm5hbWUsIG1hZ2ljIC0gMSk7Cit9CisKK3N0cnVjdCBvZl9kZXZpY2UqIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1c19pZCwKKwkJCQkJICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisKKwlkZXYtPm5vZGUgPSBvZl9ub2RlX2dldChucCk7CisJZGV2LT5kbWFfbWFzayA9IDB4ZmZmZmZmZmZVTDsKKwlkZXYtPmRldi5kbWFfbWFzayA9ICZkZXYtPmRtYV9tYXNrOworCWRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwlkZXYtPmRldi5idXMgPSAmb2ZfcGxhdGZvcm1fYnVzX3R5cGU7CisJZGV2LT5kZXYucmVsZWFzZSA9IG9mX3JlbGVhc2VfZGV2OworCWRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUgPSBucDsKKwlkZXYtPmRldi5hcmNoZGF0YS5udW1hX25vZGUgPSBvZl9ub2RlX3RvX25pZChucCk7CisKKwkvKiBXZSBkbyBub3QgZmlsbCB0aGUgRE1BIG9wcyBmb3IgcGxhdGZvcm0gZGV2aWNlcyBieSBkZWZhdWx0LgorCSAqIFRoaXMgaXMgY3VycmVudGx5IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcGxhdGZvcm0gY29kZQorCSAqIHRvIGRvIHN1Y2gsIHBvc3NpYmx5IHVzaW5nIGEgZGV2aWNlIG5vdGlmaWVyCisJICovCisKKwlpZiAoYnVzX2lkKQorCQlzdHJsY3B5KGRldi0+ZGV2LmJ1c19pZCwgYnVzX2lkLCBCVVNfSURfU0laRSk7CisJZWxzZQorCQlvZl9wbGF0Zm9ybV9tYWtlX2J1c19pZChkZXYpOworCisJaWYgKG9mX2RldmljZV9yZWdpc3RlcihkZXYpICE9IDApIHsKKwkJa2ZyZWUoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRldjsKK30KK0VYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZSk7CisKKworCisvKioKKyAqIG9mX3BsYXRmb3JtX2J1c19jcmVhdGUgLSBDcmVhdGUgYW4gT0YgZGV2aWNlIGZvciBhIGJ1cyBub2RlIGFuZCBhbGwgaXRzCisgKiBjaGlsZHJlbi4gT3B0aW9uYWxseSByZWN1cnNpdmVseSBpbnN0YW5jaWF0ZSBtYXRjaGluZyBidXNzZXMuCisgKiBAYnVzOiBkZXZpY2Ugbm9kZSBvZiB0aGUgYnVzIHRvIGluc3RhbmNpYXRlCisgKiBAbWF0Y2hlczogbWF0Y2ggdGFibGUsIE5VTEwgdG8gdXNlIHRoZSBkZWZhdWx0LCBPRl9OT19ERUVQX1BST0JFIHRvCisgKiBkaXNhbGxvdyByZWN1cnNpdmUgY3JlYXRpb24gb2YgY2hpbGQgYnVzc2VzCisgKi8KK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1cywKKwkJCQkgIHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7CisJaW50IHJjID0gMDsKKworCWZvciAoY2hpbGQgPSBOVUxMOyAoY2hpbGQgPSBvZl9nZXRfbmV4dF9jaGlsZChidXMsIGNoaWxkKSk7ICkgeworCQlwcl9kZWJ1ZygiICAgY3JlYXRlIGNoaWxkOiAlc1xuIiwgY2hpbGQtPmZ1bGxfbmFtZSk7CisJCWRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoY2hpbGQsIE5VTEwsIHBhcmVudCk7CisJCWlmIChkZXYgPT0gTlVMTCkKKwkJCXJjID0gLUVOT01FTTsKKwkJZWxzZSBpZiAoIW9mX21hdGNoX25vZGUobWF0Y2hlcywgY2hpbGQpKQorCQkJY29udGludWU7CisJCWlmIChyYyA9PSAwKSB7CisJCQlwcl9kZWJ1ZygiICAgYW5kIHN1YiBidXNzZXNcbiIpOworCQkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKGNoaWxkLCBtYXRjaGVzLCAmZGV2LT5kZXYpOworCQl9IGlmIChyYykgeworCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIG9mX3BsYXRmb3JtX2J1c19wcm9iZSAtIFByb2JlIHRoZSBkZXZpY2UtdHJlZSBmb3IgcGxhdGZvcm0gYnVzc2VzCisgKiBAcm9vdDogcGFyZW50IG9mIHRoZSBmaXJzdCBsZXZlbCB0byBwcm9iZSBvciBOVUxMIGZvciB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICogQG1hdGNoZXM6IG1hdGNoIHRhYmxlLCBOVUxMIHRvIHVzZSB0aGUgZGVmYXVsdAorICogQHBhcmVudDogcGFyZW50IHRvIGhvb2sgZGV2aWNlcyBmcm9tLCBOVUxMIGZvciB0b3BsZXZlbAorICoKKyAqIE5vdGUgdGhhdCBjaGlsZHJlbiBvZiB0aGUgcHJvdmlkZWQgcm9vdCBhcmUgbm90IGluc3RhbmNpYXRlZCBhcyBkZXZpY2VzCisgKiB1bmxlc3MgdGhlIHNwZWNpZmllZCByb290IGl0c2VsZiBtYXRjaGVzIHRoZSBidXMgbGlzdCBhbmQgaXMgbm90IE5VTEwuCisgKi8KKworaW50IG9mX3BsYXRmb3JtX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QsCisJCQkgIHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOworCXN0cnVjdCBvZl9kZXZpY2UgKmRldjsKKwlpbnQgcmMgPSAwOworCisJaWYgKG1hdGNoZXMgPT0gTlVMTCkKKwkJbWF0Y2hlcyA9IG9mX2RlZmF1bHRfYnVzX2lkczsKKwlpZiAobWF0Y2hlcyA9PSBPRl9OT19ERUVQX1BST0JFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocm9vdCA9PSBOVUxMKQorCQlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwllbHNlCisJCW9mX25vZGVfZ2V0KHJvb3QpOworCisJcHJfZGVidWcoIm9mX3BsYXRmb3JtX2J1c19wcm9iZSgpXG4iKTsKKwlwcl9kZWJ1ZygiIHN0YXJ0aW5nIGF0OiAlc1xuIiwgcm9vdC0+ZnVsbF9uYW1lKTsKKworCS8qIERvIGEgc2VsZiBjaGVjayBvZiBidXMgdHlwZSwgaWYgdGhlcmUncyBhIG1hdGNoLCBjcmVhdGUKKwkgKiBjaGlsZHJlbgorCSAqLworCWlmIChvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIHJvb3QpKSB7CisJCXByX2RlYnVnKCIgcm9vdCBtYXRjaCwgY3JlYXRlIGFsbCBzdWIgZGV2aWNlc1xuIik7CisJCWRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUocm9vdCwgTlVMTCwgcGFyZW50KTsKKwkJaWYgKGRldiA9PSBOVUxMKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJcHJfZGVidWcoIiBjcmVhdGUgYWxsIHN1YiBidXNzZXNcbiIpOworCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUocm9vdCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKKwkJZ290byBiYWlsOworCX0KKwlmb3IgKGNoaWxkID0gTlVMTDsgKGNoaWxkID0gb2ZfZ2V0X25leHRfY2hpbGQocm9vdCwgY2hpbGQpKTsgKSB7CisJCWlmICghb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBjaGlsZCkpCisJCQljb250aW51ZTsKKworCQlwcl9kZWJ1ZygiICBtYXRjaDogJXNcbiIsIGNoaWxkLT5mdWxsX25hbWUpOworCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGNoaWxkLCBOVUxMLCBwYXJlbnQpOworCQlpZiAoZGV2ID09IE5VTEwpCisJCQlyYyA9IC1FTk9NRU07CisJCWVsc2UKKwkJCXJjID0gb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShjaGlsZCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKKwkJaWYgKHJjKSB7CisJCQlvZl9ub2RlX3B1dChjaGlsZCk7CisJCQlicmVhazsKKwkJfQorCX0KKyBiYWlsOgorCW9mX25vZGVfcHV0KHJvb3QpOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fYnVzX3Byb2JlKTsKKworc3RhdGljIGludCBvZl9kZXZfbm9kZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHRvX29mX2RldmljZShkZXYpLT5ub2RlID09IGRhdGE7Cit9CisKK3N0cnVjdCBvZl9kZXZpY2UgKm9mX2ZpbmRfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSBidXNfZmluZF9kZXZpY2UoJm9mX3BsYXRmb3JtX2J1c190eXBlLAorCQkJICAgICAgTlVMTCwgbnAsIG9mX2Rldl9ub2RlX21hdGNoKTsKKwlpZiAoZGV2KQorCQlyZXR1cm4gdG9fb2ZfZGV2aWNlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUpOworCitzdGF0aWMgaW50IG9mX2Rldl9waGFuZGxlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlwaGFuZGxlICpwaCA9IGRhdGE7CisJcmV0dXJuIHRvX29mX2RldmljZShkZXYpLT5ub2RlLT5saW51eF9waGFuZGxlID09ICpwaDsKK30KKworc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfcGhhbmRsZShwaGFuZGxlIHBoKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRldiA9IGJ1c19maW5kX2RldmljZSgmb2ZfcGxhdGZvcm1fYnVzX3R5cGUsCisJCQkgICAgICBOVUxMLCAmcGgsIG9mX2Rldl9waGFuZGxlX21hdGNoKTsKKwlpZiAoZGV2KQorCQlyZXR1cm4gdG9fb2ZfZGV2aWNlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfZGV2aWNlX2J5X3BoYW5kbGUpOworCisKKyNpZmRlZiBDT05GSUdfUFBDX09GX1BMQVRGT1JNX1BDSQorCisvKiBUaGUgcHJvYmluZyBvZiBQQ0kgY29udHJvbGxlcnMgZnJvbSBvZl9wbGF0Zm9ybSBpcyBjdXJyZW50bHkKKyAqIDY0IGJpdHMgb25seSwgbW9zdGx5IGR1ZSB0byBncmF0dWl0b3VzIGRpZmZlcmVuY2VzIGJldHdlZW4KKyAqIHRoZSAzMiBhbmQgNjQgYml0cyBQQ0kgY29kZSBvbiBQb3dlclBDIGFuZCB0aGUgMzIgYml0cyBvbmUKKyAqIGxhY2tpbmcgc29tZSBiaXRzIG5lZWRlZCBoZXJlLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9mX3BjaV9waGJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOworCisJLyogQ2hlY2sgaWYgd2UgY2FuIGRvIHRoYXQgLi4uICovCisJaWYgKHBwY19tZC5wY2lfc2V0dXBfcGhiID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyB1cCBQQ0kgYnVzICVzXG4iLCBkZXYtPm5vZGUtPmZ1bGxfbmFtZSk7CisKKwkvKiBBbGxvYyBhbmQgc2V0dXAgUEhCIGRhdGEgc3RydWN0dXJlICovCisJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldi0+bm9kZSk7CisJaWYgKCFwaGIpCisJCXJldHVybiAtRU5PREVWOworCisJLyogU2V0dXAgcGFyZW50IGluIHN5c2ZzICovCisJcGhiLT5wYXJlbnQgPSAmZGV2LT5kZXY7CisKKwkvKiBTZXR1cCB0aGUgUEhCIHVzaW5nIGFyY2ggcHJvdmlkZWQgY2FsbGJhY2sgKi8KKwlpZiAocHBjX21kLnBjaV9zZXR1cF9waGIocGhiKSkgeworCQlwY2liaW9zX2ZyZWVfY29udHJvbGxlcihwaGIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBQcm9jZXNzICJyYW5nZXMiIHByb3BlcnR5ICovCisJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIGRldi0+bm9kZSwgMCk7CisKKwkvKiBTZXR1cCBJTyBzcGFjZS4KKwkgKiBUaGlzIHdpbGwgbm90IHdvcmsgcHJvcGVybHkgZm9yIElTQSBJT3MsIHNvbWV0aGluZyBuZWVkcyB0byBiZSBkb25lCisJICogYWJvdXQgaXQgaWYgd2UgZXZlciBnZW5lcmFsaXplIHRoYXQgd2F5IG9mIHByb2JpbmcgUENJIGJyaWdkZXMKKwkgKi8KKwlwY2lfc2V0dXBfcGhiX2lvX2R5bmFtaWMocGhiLCAwKTsKKworCS8qIEluaXQgcGNpX2RuIGRhdGEgc3RydWN0dXJlcyAqLworCXBjaV9kZXZzX3BoYl9pbml0X2R5bmFtaWMocGhiKTsKKworCS8qIFJlZ2lzdGVyIGRldmljZXMgd2l0aCBFRUggKi8KKyNpZmRlZiBDT05GSUdfRUVICisJaWYgKGRldi0+bm9kZS0+Y2hpbGQpCisJCWVlaF9hZGRfZGV2aWNlX3RyZWVfZWFybHkoZGV2LT5ub2RlKTsKKyNlbmRpZiAvKiBDT05GSUdfRUVIICovCisKKwkvKiBTY2FuIHRoZSBidXMgKi8KKwlzY2FuX3BoYihwaGIpOworCisJLyogQ2xhaW0gcmVzb3VyY2VzLiBUaGlzIG1pZ2h0IG5lZWQgc29tZSByZXdvcmsgYXMgd2VsbCBkZXBlbmRpbmcKKwkgKiB3ZXRoZXIgd2UgYXJlIGRvaW5nIHByb2JlLW9ubHkgb3Igbm90LCBsaWtlIGFzc2lnbmluZyB1bmFzc2lnbmVkCisJICogcmVzb3VyY2VzIGV0Yy4uLgorCSAqLworCXBjaWJpb3NfY2xhaW1fb25lX2J1cyhwaGItPmJ1cyk7CisKKwkvKiBGaW5pc2ggRUVIIHNldHVwICovCisjaWZkZWYgQ09ORklHX0VFSAorCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShwaGItPmJ1cyk7CisjZW5kaWYKKworCS8qIEFkZCBwcm9iZWQgUENJIGRldmljZXMgdG8gdGhlIGRldmljZSBtb2RlbCAqLworCXBjaV9idXNfYWRkX2RldmljZXMocGhiLT5idXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX3BjaV9waGJfaWRzW10gPSB7CisJeyAudHlwZSA9ICJwY2kiLCB9LAorCXsgLnR5cGUgPSAicGNpeCIsIH0sCisJeyAudHlwZSA9ICJwY2llIiwgfSwKKwl7IC50eXBlID0gInBjaWV4IiwgfSwKKwl7IC50eXBlID0gImh0IiwgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgb2ZfcGNpX3BoYl9kcml2ZXIgPSB7CisgICAgICAgLm5hbWUgPSAib2YtcGNpIiwKKyAgICAgICAubWF0Y2hfdGFibGUgPSBvZl9wY2lfcGhiX2lkcywKKyAgICAgICAucHJvYmUgPSBvZl9wY2lfcGhiX3Byb2JlLAorICAgICAgIC5kcml2ZXIgPSB7CisJICAgICAgIC5tdWx0aXRocmVhZF9wcm9iZSA9IDEsCisgICAgICAgfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IG9mX3BjaV9waGJfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm9mX3BjaV9waGJfZHJpdmVyKTsKK30KKworZGV2aWNlX2luaXRjYWxsKG9mX3BjaV9waGJfaW5pdCk7CisKKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GX1BMQVRGT1JNX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKaW5kZXggOWI0OWY4Ni4uMjg0N2NkNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtOTksNyArMTAwLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAocmVzLT5lbmQgPT0gMHhmZmZmZmZmZikgewogCQkJREJHKCJQQ0k6JXMgUmVzb3VyY2UgJWQgWyUwMTZsbHgtJTAxNmxseF0gaXMgdW5hc3NpZ25lZFxuIiwKLQkJCSAgICBwY2lfbmFtZShkZXYpLCBpLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJCQkgICAgcGNpX25hbWUoZGV2KSwgaSwgKHU2NClyZXMtPnN0YXJ0LCAodTY0KXJlcy0+ZW5kKTsKIAkJCXJlcy0+ZW5kIC09IHJlcy0+c3RhcnQ7CiAJCQlyZXMtPnN0YXJ0ID0gMDsKIAkJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKQEAgLTExNSwxMSArMTE2LDkgQEAKIAkJaWYgKG9mZnNldCAhPSAwKSB7CiAJCQlyZXMtPnN0YXJ0ICs9IG9mZnNldDsKIAkJCXJlcy0+ZW5kICs9IG9mZnNldDsKLSNpZmRlZiBERUJVRwotCQkJcHJpbnRrKCJGaXh1cCByZXMgJWQgKCVseCkgb2YgZGV2ICVzOiAlbGx4IC0+ICVsbHhcbiIsCi0JCQkgICAgICAgaSwgcmVzLT5mbGFncywgcGNpX25hbWUoZGV2KSwKLQkJCSAgICAgICByZXMtPnN0YXJ0IC0gb2Zmc2V0LCByZXMtPnN0YXJ0KTsKLSNlbmRpZgorCQkJREJHKCJGaXh1cCByZXMgJWQgKCVseCkgb2YgZGV2ICVzOiAlbGx4IC0+ICVsbHhcbiIsCisJCQkgICAgaSwgcmVzLT5mbGFncywgcGNpX25hbWUoZGV2KSwKKwkJCSAgICAodTY0KXJlcy0+c3RhcnQgLSBvZmZzZXQsICh1NjQpcmVzLT5zdGFydCk7CiAJCX0KIAl9CiAKQEAgLTI1NSw3ICsyNTQsNyBAQAogCQkJfQogCiAJCQlEQkcoIlBDSTogYnJpZGdlIHJzcmMgJWxseC4uJWxseCAoJWx4KSwgcGFyZW50ICVwXG4iLAotCQkJCXJlcy0+c3RhcnQsIHJlcy0+ZW5kLCByZXMtPmZsYWdzLCBwcik7CisJCQkgICAgKHU2NClyZXMtPnN0YXJ0LCAodTY0KXJlcy0+ZW5kLCByZXMtPmZsYWdzLCBwcik7CiAJCQlpZiAocHIpIHsKIAkJCQlpZiAocmVxdWVzdF9yZXNvdXJjZShwciwgcmVzKSA9PSAwKQogCQkJCQljb250aW51ZTsKQEAgLTMwNiw3ICszMDUsNyBAQAogCWZvciAocCA9IHJlcy0+Y2hpbGQ7IHAgIT0gTlVMTDsgcCA9IHAtPnNpYmxpbmcpIHsKIAkJcC0+cGFyZW50ID0gcmVzOwogCQlEQkcoS0VSTl9JTkZPICJQQ0k6IHJlcGFyZW50ZWQgJXMgWyVsbHguLiVsbHhdIHVuZGVyICVzXG4iLAotCQkgICAgcC0+bmFtZSwgcC0+c3RhcnQsIHAtPmVuZCwgcmVzLT5uYW1lKTsKKwkJICAgIHAtPm5hbWUsICh1NjQpcC0+c3RhcnQsICh1NjQpcC0+ZW5kLCByZXMtPm5hbWUpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM2Miw3ICszNjEsNyBAQAogCX0KIAlpZiAocmVxdWVzdF9yZXNvdXJjZShwciwgcmVzKSkgewogCQlEQkcoS0VSTl9FUlIgIlBDSTogaHVoPyBjb3VsZG4ndCBtb3ZlIHRvICVsbHguLiVsbHhcbiIsCi0JCSAgICByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJCSAgICAodTY0KXJlcy0+c3RhcnQsICh1NjQpcmVzLT5lbmQpOwogCQlyZXR1cm4gLTE7CQkvKiAiY2FuJ3QgaGFwcGVuIiAqLwogCX0KIAl1cGRhdGVfYnJpZGdlX2Jhc2UoYnVzLCBpKTsKQEAgLTQ0MSwxNCArNDQwLDE0IEBACiAJCWVuZCA9IHJlcy0+ZW5kIC0gb2ZmOwogCQlpb19iYXNlX2xvID0gKHN0YXJ0ID4+IDgpICYgUENJX0lPX1JBTkdFX01BU0s7CiAJCWlvX2xpbWl0X2xvID0gKGVuZCA+PiA4KSAmIFBDSV9JT19SQU5HRV9NQVNLOwotCQlpZiAoZW5kID4gMHhmZmZmKSB7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfSU9fQkFTRV9VUFBFUjE2LAotCQkJCQkgICAgICBzdGFydCA+PiAxNik7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfSU9fTElNSVRfVVBQRVIxNiwKLQkJCQkJICAgICAgZW5kID4+IDE2KTsKKwkJaWYgKGVuZCA+IDB4ZmZmZikKIAkJCWlvX2Jhc2VfbG8gfD0gUENJX0lPX1JBTkdFX1RZUEVfMzI7Ci0JCX0gZWxzZQorCQllbHNlCiAJCQlpb19iYXNlX2xvIHw9IFBDSV9JT19SQU5HRV9UWVBFXzE2OworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfSU9fQkFTRV9VUFBFUjE2LAorCQkJCXN0YXJ0ID4+IDE2KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0lPX0xJTUlUX1VQUEVSMTYsCisJCQkJZW5kID4+IDE2KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lPX0JBU0UsIGlvX2Jhc2VfbG8pOwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU9fTElNSVQsIGlvX2xpbWl0X2xvKTsKIApAQCAtNDgwLDE0ICs0NzksMTQgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnByLCAqciA9ICZkZXYtPnJlc291cmNlW2lkeF07CiAKIAlEQkcoIlBDSTolczogUmVzb3VyY2UgJWQ6ICUwMTZsbHgtJTAxNmxseCAoZj0lbHgpXG4iLAotCSAgICBwY2lfbmFtZShkZXYpLCBpZHgsIHItPnN0YXJ0LCByLT5lbmQsIHItPmZsYWdzKTsKKwkgICAgcGNpX25hbWUoZGV2KSwgaWR4LCAodTY0KXItPnN0YXJ0LCAodTY0KXItPmVuZCwgci0+ZmxhZ3MpOwogCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7CiAJaWYgKCFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBhbGxvY2F0ZSByZXNvdXJjZSByZWdpb24gJWQiCiAJCSAgICAgICAiIG9mIGRldmljZSAlc1xuIiwgaWR4LCBwY2lfbmFtZShkZXYpKTsKIAkJaWYgKHByKQogCQkJREJHKCJQQ0k6ICBwYXJlbnQgaXMgJXA6ICUwMTZsbHgtJTAxNmxseCAoZj0lbHgpXG4iLAotCQkJICAgIHByLCBwci0+c3RhcnQsIHByLT5lbmQsIHByLT5mbGFncyk7CisJCQkgICAgcHIsICh1NjQpcHItPnN0YXJ0LCAodTY0KXByLT5lbmQsIHByLT5mbGFncyk7CiAJCS8qIFdlJ2xsIGFzc2lnbiBhIG5ldyBhZGRyZXNzIGxhdGVyICovCiAJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCXItPmVuZCAtPSByLT5zdGFydDsKQEAgLTY3MSw3ICs2NzAsNyBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKIAlzdHJ1Y3QgcHJvcGVydHkgKm1hcF9wcm9wOwogCi0JcGNpX3RvX09GX2J1c19tYXAgPSAodTgqKWttYWxsb2MocGNpX2J1c19jb3VudCwgR0ZQX0tFUk5FTCk7CisJcGNpX3RvX09GX2J1c19tYXAgPSBrbWFsbG9jKHBjaV9idXNfY291bnQsIEdGUF9LRVJORUwpOwogCWlmICghcGNpX3RvX09GX2J1c19tYXApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBhbGxvY2F0ZSBPRiBidXMgbWFwICFcbiIpOwogCQlyZXR1cm47CkBAIC03MzcsMjUgKzczNiw1MSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50Ci1zY2FuX09GX3BjaV9jaGlsZHNfaXRlcmF0b3Ioc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB2b2lkKiBkYXRhKQorc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqc2Nhbl9PRl9mb3JfcGNpX2RldihzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkZXZmbikKIHsKLQljb25zdCB1bnNpZ25lZCBpbnQgKnJlZzsKLQl1OCogZmRhdGEgPSAodTgqKWRhdGE7Ci0JCi0JcmVnID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKLQlpZiAocmVnICYmICgocmVnWzBdID4+IDgpICYgMHhmZikgPT0gZmRhdGFbMV0KLQkJJiYgKChyZWdbMF0gPj4gMTYpICYgMHhmZikgPT0gZmRhdGFbMF0pCi0JCXJldHVybiAxOwotCXJldHVybiAwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCWNvbnN0IHUzMiAqcmVnOworCXVuc2lnbmVkIGludCBwc2l6ZTsKKworCXdoaWxlICgobnAgPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIG5wKSkgIT0gTlVMTCkgeworCQlyZWcgPSBnZXRfcHJvcGVydHkobnAsICJyZWciLCAmcHNpemUpOworCQlpZiAocmVnID09IE5VTEwgfHwgcHNpemUgPCA0KQorCQkJY29udGludWU7CisJCWlmICgoKHJlZ1swXSA+PiA4KSAmIDB4ZmYpID09IGRldmZuKQorCQkJcmV0dXJuIG5wOworCX0KKwlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSoKLXNjYW5fT0ZfY2hpbGRzX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlLCB1OCBidXMsIHU4IGRldl9mbikKLXsKLQl1OCBmaWx0ZXJfZGF0YVsyXSA9IHtidXMsIGRldl9mbn07CiAKLQlyZXR1cm4gc2Nhbl9PRl9wY2lfY2hpbGRzKG5vZGUsIHNjYW5fT0ZfcGNpX2NoaWxkc19pdGVyYXRvciwgZmlsdGVyX2RhdGEpOworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqc2Nhbl9PRl9mb3JfcGNpX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCAqbnA7CisKKwkvKiBBcmUgd2UgYSByb290IGJ1cyA/ICovCisJaWYgKGJ1cy0+c2VsZiA9PSBOVUxMIHx8IGJ1cy0+cGFyZW50ID09IE5VTEwpIHsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cy0+bnVtYmVyKTsKKwkJaWYgKGhvc2UgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gb2Zfbm9kZV9nZXQoaG9zZS0+YXJjaF9kYXRhKTsKKwl9CisKKwkvKiBub3QgYSByb290IGJ1cywgd2UgbmVlZCB0byBnZXQgb3VyIHBhcmVudCAqLworCXBhcmVudCA9IHNjYW5fT0ZfZm9yX3BjaV9idXMoYnVzLT5wYXJlbnQpOworCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBub3cgaXRlcmF0ZSBmb3IgY2hpbGRyZW4gZm9yIGEgbWF0Y2ggKi8KKwlucCA9IHNjYW5fT0ZfZm9yX3BjaV9kZXYocGFyZW50LCBidXMtPnNlbGYtPmRldmZuKTsKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKHN0cmNtcChucC0+dHlwZSwgInBjaSIpICE9IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaTogd3JvbmcgdHlwZSBcIiVzXCIgZm9yIGJyaWRnZSAlc1xuIiwKKwkJICAgICAgIG5wLT50eXBlLCBucC0+ZnVsbF9uYW1lKTsKKworCXJldHVybiBucDsKIH0KIAogLyoKQEAgLTc2NCw0MyArNzg5LDI1IEBACiBzdHJ1Y3QgZGV2aWNlX25vZGUgKgogcGNpX2J1c2Rldl90b19PRl9ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMsIGludCBkZXZmbikKIHsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCWludCBidXNucjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgKm5wOwogCiAJaWYgKCFoYXZlX29mKQogCQlyZXR1cm4gTlVMTDsKLQkKLQkvKiBMb29rdXAgdGhlIGhvc2UgKi8KLQlidXNuciA9IGJ1cy0+bnVtYmVyOwotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzbnIpOwotCWlmICghaG9zZSkKLQkJcmV0dXJuIE5VTEw7CiAKLQkvKiBDaGVjayBpdCBoYXMgYW4gT0Ygbm9kZSBhc3NvY2lhdGVkICovCi0Jbm9kZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKikgaG9zZS0+YXJjaF9kYXRhOwotCWlmICghbm9kZSkKKwlEQkcoInBjaV9idXNkZXZfdG9fT0Zfbm9kZSglZCwweCV4KVxuIiwgYnVzLT5udW1iZXIsIGRldmZuKTsKKwlwYXJlbnQgPSBzY2FuX09GX2Zvcl9wY2lfYnVzKGJ1cyk7CisJaWYgKHBhcmVudCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKKwlEQkcoIiBwYXJlbnQgaXMgJXNcbiIsIHBhcmVudCA/IHBhcmVudC0+ZnVsbF9uYW1lIDogIjxOVUxMPiIpOworCW5wID0gc2Nhbl9PRl9mb3JfcGNpX2RldihwYXJlbnQsIGRldmZuKTsKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCURCRygiIHJlc3VsdCBpcyAlc1xuIiwgbnAgPyBucC0+ZnVsbF9uYW1lIDogIjxOVUxMPiIpOwogCi0JLyogRml4dXAgYnVzIG51bWJlciBhY2NvcmRpbmcgdG8gd2hhdCBPRiB0aGluayBpdCBpcy4gKi8KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLQkvKiBUaGUgRzUgbmVlZCBhIHNwZWNpYWwgY2FzZSBoZXJlLiBCYXNpY2FsbHksIHdlIGRvbid0IHJlbWFwIGFsbAotCSAqIGJ1c3NlcyBvbiBpdCBzbyB3ZSBkb24ndCBjcmVhdGUgdGhlIHBjaS1PRi1tYXAuIEhvd2V2ZXIsIHdlIGRvCi0JICogcmVtYXAgdGhlIEFHUCBidXMgYW5kIHNvIGhhdmUgdG8gZGVhbCB3aXRoIGl0LiBBIGZ1dHVyZSBiZXR0ZXIKLQkgKiBmaXggaGFzIHRvIGJlIGRvbmUgYnkgbWFraW5nIHRoZSByZW1hcHBpbmcgcGVyLWhvc3QgYW5kIGFsd2F5cwotCSAqIGZpbGxpbmcgdGhlIHBjaV90b19PRiBtYXAuIC0tQmVuSAorCS8qIFhYWCBtb3N0IGNhbGxlcnMgZG9uJ3QgcmVsZWFzZSB0aGUgcmV0dXJuZWQgbm9kZQorCSAqIG1vc3RseSBiZWNhdXNlIHBwYzY0IGRvZXNuJ3QgaW5jcmVhc2UgdGhlIHJlZmNvdW50LAorCSAqIHdlIG5lZWQgdG8gZml4IHRoYXQuCiAJICovCi0JaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpICYmIGJ1c25yID49IDB4ZjApCi0JCWJ1c25yIC09IDB4ZjA7Ci0JZWxzZQotI2VuZGlmCi0JaWYgKHBjaV90b19PRl9idXNfbWFwKQotCQlidXNuciA9IHBjaV90b19PRl9idXNfbWFwW2J1c25yXTsKLQlpZiAoYnVzbnIgPT0gMHhmZikKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JLyogTm93LCBsb29rdXAgY2hpbGRzIG9mIHRoZSBob3NlICovCi0JcmV0dXJuIHNjYW5fT0ZfY2hpbGRzX2Zvcl9kZXZpY2Uobm9kZS0+Y2hpbGQsIGJ1c25yLCBkZXZmbik7CisJcmV0dXJuIG5wOwogfQogRVhQT1JUX1NZTUJPTChwY2lfYnVzZGV2X3RvX09GX25vZGUpOwogCkBAIC05NjAsNyArOTY3LDcgQEAKIAkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwogCQkJcmVzLT5zdGFydCA9IHJhbmdlc1syXTsKIAkJCURCRygiUENJOiBJTyAweCVsbHggLT4gMHglbGx4XG4iLAotCQkJCSAgICByZXMtPnN0YXJ0LCByZXMtPnN0YXJ0ICsgc2l6ZSAtIDEpOworCQkJICAgICh1NjQpcmVzLT5zdGFydCwgKHU2NClyZXMtPnN0YXJ0ICsgc2l6ZSAtIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoJCS8qIG1lbW9yeSBzcGFjZSAqLwogCQkJbWVtbm8gPSAwOwpAQCAtOTgyLDcgKzk4OSw3IEBACiAJCQkJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9QUkVGRVRDSDsKIAkJCQlyZXMtPnN0YXJ0ID0gcmFuZ2VzW25hKzJdOwogCQkJCURCRygiUENJOiBNRU1bJWRdIDB4JWxseCAtPiAweCVsbHhcbiIsIG1lbW5vLAotCQkJCQkgICAgcmVzLT5zdGFydCwgcmVzLT5zdGFydCArIHNpemUgLSAxKTsKKwkJCQkgICAgKHU2NClyZXMtPnN0YXJ0LCAodTY0KXJlcy0+c3RhcnQgKyBzaXplIC0gMSk7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtMTI2OCw3ICsxMjc1LDEwIEBACiAJCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcykKIAkJCWhvc2UtPmZpcnN0X2J1c25vID0gbmV4dF9idXNubzsKIAkJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7Ci0JCWJ1cyA9IHBjaV9zY2FuX2J1cyhob3NlLT5maXJzdF9idXNubywgaG9zZS0+b3BzLCBob3NlKTsKKwkJYnVzID0gcGNpX3NjYW5fYnVzX3BhcmVudGVkKGhvc2UtPnBhcmVudCwgaG9zZS0+Zmlyc3RfYnVzbm8sCisJCQkJCSAgICBob3NlLT5vcHMsIGhvc2UpOworCQlpZiAoYnVzKQorCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwogCQlob3NlLT5sYXN0X2J1c25vID0gYnVzLT5zdWJvcmRpbmF0ZTsKIAkJaWYgKHBjaV9hc3NpZ25fYWxsX2J1c2VzIHx8IG5leHRfYnVzbm8gPD0gaG9zZS0+bGFzdF9idXNubykKIAkJCW5leHRfYnVzbm8gPSBob3NlLT5sYXN0X2J1c25vICsgcGNpYmlvc19hc3NpZ25fYnVzX29mZnNldDsKQEAgLTEyODIsMTAgKzEyOTIsNiBAQAogCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcyAmJiBoYXZlX29mKQogCQlwY2liaW9zX21ha2VfT0ZfYnVzX21hcCgpOwogCi0JLyogRG8gbWFjaGluZSBkZXBlbmRlbnQgUENJIGludGVycnVwdCByb3V0aW5nICovCi0JaWYgKHBwY19tZC5wY2lfc3dpenpsZSAmJiBwcGNfbWQucGNpX21hcF9pcnEpCi0JCXBjaV9maXh1cF9pcnFzKHBwY19tZC5wY2lfc3dpenpsZSwgcHBjX21kLnBjaV9tYXBfaXJxKTsKLQogCS8qIENhbGwgbWFjaGluZSBkZXBlbmRlbnQgZml4dXAgKi8KIAlpZiAocHBjX21kLnBjaWJpb3NfZml4dXApCiAJCXBwY19tZC5wY2liaW9zX2ZpeHVwKCk7CkBAIC0xMzA4LDI1ICsxMzE0LDYgQEAKIAogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKLXVuc2lnbmVkIGNoYXIgX19pbml0Ci1jb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyICpwaW5wKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGRldi0+c3lzZGF0YTsKLQotCWlmIChkZXYtPmJ1cy0+bnVtYmVyICE9IGhvc2UtPmZpcnN0X2J1c25vKSB7Ci0JCXU4IHBpbiA9ICpwaW5wOwotCQlkbyB7Ci0JCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKLQkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICovCi0JCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLQkJfSB3aGlsZSAoZGV2LT5idXMtPnNlbGYpOwotCQkqcGlucCA9IHBpbjsKLQotCQkvKiBUaGUgc2xvdCBpcyB0aGUgaWRzZWwgb2YgdGhlIGxhc3QgYnJpZGdlLiAqLwotCX0KLQlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZml4dXAoc3RydWN0IHBjaV9kZXYgKiBkZXYsIHN0cnVjdCByZXNvdXJjZSAqIHJlcywKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQogewpAQCAtMTMzOCw2ICsxMzI1LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopIGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGlvX29mZnNldDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCWludCBpOwogCiAJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gaXNhX2lvX2Jhc2U7CkBAIC0xMzkwLDggKzEzNzgsMTYgQEAKIAkJfQogCX0KIAorCS8qIFBsYXRmb3JtIHNwZWNpZmljIGJ1cyBmaXh1cHMgKi8KIAlpZiAocHBjX21kLnBjaWJpb3NfZml4dXBfYnVzKQogCQlwcGNfbWQucGNpYmlvc19maXh1cF9idXMoYnVzKTsKKworCS8qIFJlYWQgZGVmYXVsdCBJUlFzIGFuZCBmaXh1cCBpZiBuZWNlc3NhcnkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKKwkJaWYgKHBwY19tZC5wY2lfaXJxX2ZpeHVwKQorCQkJcHBjX21kLnBjaV9pcnFfZml4dXAoZGV2KTsKKwl9CiB9CiAKIGNoYXIgX19pbml0ICpwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKQEAgLTE1NTYsNyArMTU1Miw3IEBACiAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX19wY2lfbW1hcF9tYWtlX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb2Zmc2V0LAorCQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90ICpvZmZzZXQsCiAJCQkJCSAgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGRldi0+YnVzLT5udW1iZXIpOwpAQCAtMTU2OCwxMCArMTU2NCwxMiBAQAogCiAJLyogSWYgbWVtb3J5LCBhZGQgb24gdGhlIFBDSSBicmlkZ2UgYWRkcmVzcyBvZmZzZXQgKi8KIAlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9tZW0pIHsKKyNpZiAwIC8qIFNlZSBjb21tZW50IGluIHBjaV9yZXNvdXJjZV90b191c2VyKCkgZm9yIHdoeSB0aGlzIGlzIGRpc2FibGVkICovCiAJCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisjZW5kaWYKIAkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwogCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9IGhvc2UtPmlvX2Jhc2VfdmlydCAtIF9fX0lPX0JBU0U7CisJCWlvX29mZnNldCA9IGhvc2UtPmlvX2Jhc2VfdmlydCAtICh2b2lkIF9faW9tZW0gKilfSU9fQkFTRTsKIAkJKm9mZnNldCArPSBpb19vZmZzZXQ7CiAJCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOwogCX0KQEAgLTE2MzYsOSArMTYzNCw2IEBACiAJZWxzZQogCQlwcm90IHw9IF9QQUdFX0dVQVJERUQ7CiAKLQlwcmludGsoIlBDSSBtYXAgZm9yICVzOiVsbHgsIHByb3Q6ICVseFxuIiwgcGNpX25hbWUoZGV2KSwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZylycC0+c3RhcnQsIHByb3QpOwotCiAJcmV0dXJuIF9fcGdwcm90KHByb3QpOwogfQogCkBAIC0xNzA3LDcgKzE3MDIsNyBAQAogCQkJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAogCQkJaW50IHdyaXRlX2NvbWJpbmUpCiB7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJwOwogCWludCByZXQ7CiAKQEAgLTE4MjAsMjEgKzE4MTUsNDIgQEAKIAkJCSAgcmVzb3VyY2Vfc2l6ZV90ICpzdGFydCwgcmVzb3VyY2Vfc2l6ZV90ICplbmQpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGRldi0+YnVzLT5udW1iZXIpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gMDsKIAogCWlmIChob3NlID09IE5VTEwpCiAJCXJldHVybjsKIAogCWlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCW9mZnNldCA9IF9fX0lPX0JBU0UgLSBob3NlLT5pb19iYXNlX3ZpcnQgKyBob3NlLT5pb19iYXNlX3BoeXM7CisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwogCi0JKnN0YXJ0ID0gcnNyYy0+c3RhcnQgKyBvZmZzZXQ7Ci0JKmVuZCA9IHJzcmMtPmVuZCArIG9mZnNldDsKKwkvKiBXZSBwYXNzIGEgZnVsbHkgZml4ZWQgdXAgYWRkcmVzcyB0byB1c2VybGFuZCBmb3IgTU1JTyBpbnN0ZWFkIG9mCisJICogYSBCQVIgdmFsdWUgYmVjYXVzZSBYIGlzIGxhbWUgYW5kIGV4cGVjdHMgdG8gYmUgYWJsZSB0byB1c2UgdGhhdAorCSAqIHRvIHBhc3MgdG8gL2Rldi9tZW0gIQorCSAqCisJICogVGhhdCBtZWFucyB0aGF0IHdlJ2xsIGhhdmUgcG90ZW50aWFsbHkgNjQgYml0cyB2YWx1ZXMgd2hlcmUgc29tZQorCSAqIHVzZXJsYW5kIGFwcHMgb25seSBleHBlY3QgMzIgKGxpa2UgWCBpdHNlbGYgc2luY2UgaXQgdGhpbmtzIG9ubHkKKwkgKiBTcGFyYyBoYXMgNjQgYml0cyBNTUlPKSBidXQgaWYgd2UgZG9uJ3QgZG8gdGhhdCwgd2UgYnJlYWsgaXQgb24KKwkgKiAzMiBiaXRzIENIUlBzIDotKAorCSAqCisJICogSG9wZWZ1bGx5LCB0aGUgc3lzZnMgaW5zdGVyZmFjZSBpcyBpbW11bmUgdG8gdGhhdCBndW5rLiBPbmNlIFgKKwkgKiBoYXMgYmVlbiBmaXhlZCAoYW5kIHRoZSBmaXggc3ByZWFkIGVub3VnaCksIHdlIGNhbiByZS1lbmFibGUgdGhlCisJICogMiBsaW5lcyBiZWxvdyBhbmQgcGFzcyBkb3duIGEgQkFSIHZhbHVlIHRvIHVzZXJsYW5kLiBJbiB0aGF0IGNhc2UKKwkgKiB3ZSdsbCBhbHNvIGhhdmUgdG8gcmUtZW5hYmxlIHRoZSBtYXRjaGluZyBjb2RlIGluCisJICogX19wY2lfbW1hcF9tYWtlX29mZnNldCgpLgorCSAqCisJICogQmVuSC4KKwkgKi8KKyNpZiAwCisJZWxzZSBpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJb2Zmc2V0ID0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisjZW5kaWYKKworCSpzdGFydCA9IHJzcmMtPnN0YXJ0IC0gb2Zmc2V0OworCSplbmQgPSByc3JjLT5lbmQgLSBvZmZzZXQ7CiB9CiAKLXZvaWQgX19pbml0Ci1wY2lfaW5pdF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCi0JCSAgaW50IGZsYWdzLCBjaGFyICpuYW1lKQordm9pZCBfX2luaXQgcGNpX2luaXRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsIHJlc291cmNlX3NpemVfdCBzdGFydCwKKwkJCSAgICAgIHJlc291cmNlX3NpemVfdCBlbmQsIGludCBmbGFncywgY2hhciAqbmFtZSkKIHsKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiAJcmVzLT5lbmQgPSBlbmQ7CkBAIC0xODQ1LDM1ICsxODYxLDYgQEAKIAlyZXMtPmNoaWxkID0gTlVMTDsKIH0KIAotdm9pZCBfX2lvbWVtICpwY2lfaW9tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwgdW5zaWduZWQgbG9uZyBtYXgpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGJhcik7Ci0JdW5zaWduZWQgbG9uZyBsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgYmFyKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgYmFyKTsKLQotCWlmICghbGVuKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWF4ICYmIGxlbiA+IG1heCkKLQkJbGVuID0gbWF4OwotCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCXJldHVybiBpb3BvcnRfbWFwKHN0YXJ0LCBsZW4pOwotCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkvKiBOb3QgY2hlY2tpbmcgSU9SRVNPVVJDRV9DQUNIRUFCTEUgYmVjYXVzZSBQUEMgZG9lcwotCQkgKiBub3QgY3VycmVudGx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gaW9yZW1hcCBhbmQKLQkJICogaW9yZW1hcF9ub2NhY2hlLgotCQkgKi8KLQkJcmV0dXJuIGlvcmVtYXAoc3RhcnQsIGxlbik7Ci0JLyogV2hhdD8gKi8KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBwY2lfaW91bm1hcChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JLyogTm90aGluZyB0byBkbyAqLwotfQotRVhQT1JUX1NZTUJPTChwY2lfaW9tYXApOwotRVhQT1JUX1NZTUJPTChwY2lfaW91bm1hcCk7Ci0KIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gaG9zZV9oZWFkOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggNzhkM2MwZi4uYTZiNzY5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC00MiwxMSArNDIsOSBAQAogdW5zaWduZWQgbG9uZyBwY2lfcHJvYmVfb25seSA9IDE7CiBpbnQgcGNpX2Fzc2lnbl9hbGxfYnVzZXMgPSAwOwogCi0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCiBzdGF0aWMgdm9pZCBmaXh1cF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgc3RydWN0IHBjaV9kZXYgKmRldik7CiBzdGF0aWMgdm9pZCBkb19idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBzdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpOwotI2VuZGlmCiAKIC8qIHBjaV9pb19iYXNlIC0tIHRoZSBiYXNlIGFkZHJlc3MgZnJvbSB3aGljaCBpbyBiYXJzIGFyZSBvZmZzZXRzLgogICogVGhpcyBpcyB0aGUgbG93ZXN0IEkvTyBiYXNlIGFkZHJlc3MgKHNvIGJhciB2YWx1ZXMgYXJlIGFsd2F5cyBwb3NpdGl2ZSksCkBAIC02Myw3ICs2MSw3IEBACiAKIExJU1RfSEVBRChob3NlX2xpc3QpOwogCi1zdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBjaV9kbWFfb3BzOworc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqcGNpX2RtYV9vcHM7CiBFWFBPUlRfU1lNQk9MKHBjaV9kbWFfb3BzKTsKIAogaW50IGdsb2JhbF9waGJfbnVtYmVyOwkJLyogR2xvYmFsIHBoYiBjb3VudGVyICovCkBAIC0xOTksMTMgKzE5NywyMyBAQAogCXBjaV9zZXR1cF9wY2lfY29udHJvbGxlcihwaGIpOwogCXBoYi0+YXJjaF9kYXRhID0gZGV2OwogCXBoYi0+aXNfZHluYW1pYyA9IG1lbV9pbml0X2RvbmU7Ci0JaWYgKGRldikKLQkJUEhCX1NFVF9OT0RFKHBoYiwgb2Zfbm9kZV90b19uaWQoZGV2KSk7CisJaWYgKGRldikgeworCQlpbnQgbmlkID0gb2Zfbm9kZV90b19uaWQoZGV2KTsKKworCQlpZiAobmlkIDwgMCB8fCAhbm9kZV9vbmxpbmUobmlkKSkKKwkJCW5pZCA9IC0xOworCisJCVBIQl9TRVRfTk9ERShwaGIsIG5pZCk7CisJfQogCXJldHVybiBwaGI7CiB9CiAKIHZvaWQgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCiB7CisJc3Bpbl9sb2NrKCZob3NlX3NwaW5sb2NrKTsKKwlsaXN0X2RlbCgmcGhiLT5saXN0X25vZGUpOworCXNwaW5fdW5sb2NrKCZob3NlX3NwaW5sb2NrKTsKKwogCWlmIChwaGItPmlzX2R5bmFtaWMpCiAJCWtmcmVlKHBoYik7CiB9CkBAIC0yNDUsNyArMjUzLDYgQEAKIAkJcGNpYmlvc19jbGFpbV9vbmVfYnVzKGIpOwogfQogCi0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCiBzdGF0aWMgdTMyIGdldF9pbnRfcHJvcChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLCB1MzIgZGVmKQogewogCWNvbnN0IHUzMiAqcHJvcDsKQEAgLTMyMyw3ICszMzAsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJY29uc3QgY2hhciAqdHlwZTsKIAotCWRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfZGV2KSwgR0ZQX0tFUk5FTCk7CisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CiAJdHlwZSA9IGdldF9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiLCBOVUxMKTsKQEAgLTMzMiw3ICszMzksNiBAQAogCiAJREJHKCIgICAgY3JlYXRlIGRldmljZSwgZGV2Zm46ICV4LCB0eXBlOiAlc1xuIiwgZGV2Zm4sIHR5cGUpOwogCi0JbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBwY2lfZGV2KSk7CiAJZGV2LT5idXMgPSBidXM7CiAJZGV2LT5zeXNkYXRhID0gbm9kZTsKIAlkZXYtPmRldi5wYXJlbnQgPSBidXMtPmJyaWRnZTsKQEAgLTUwMCw3ICs1MDYsNiBAQAogCQlwY2lfc2Nhbl9jaGlsZF9idXMoYnVzKTsKIH0KIEVYUE9SVF9TWU1CT0wob2Zfc2Nhbl9wY2lfYnJpZGdlKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KIAogdm9pZCBfX2RldmluaXQgc2Nhbl9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewpAQCAtNTExLDcgKzUxNiw3IEBACiAKIAlEQkcoIlNjYW5uaW5nIFBIQiAlc1xuIiwgbm9kZSA/IG5vZGUtPmZ1bGxfbmFtZSA6ICI8Tk8gTkFNRT4iKTsKIAotCWJ1cyA9IHBjaV9jcmVhdGVfYnVzKE5VTEwsIGhvc2UtPmZpcnN0X2J1c25vLCBob3NlLT5vcHMsIG5vZGUpOworCWJ1cyA9IHBjaV9jcmVhdGVfYnVzKGhvc2UtPnBhcmVudCwgaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPm9wcywgbm9kZSk7CiAJaWYgKGJ1cyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBidXMgZm9yIFBDSSBkb21haW4gJTA0eFxuIiwKIAkJICAgICAgIGhvc2UtPmdsb2JhbF9udW1iZXIpOwpAQCAtNTM0LDcgKzUzOSw3IEBACiAJfQogCiAJbW9kZSA9IFBDSV9QUk9CRV9OT1JNQUw7Ci0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCisKIAlpZiAobm9kZSAmJiBwcGNfbWQucGNpX3Byb2JlX21vZGUpCiAJCW1vZGUgPSBwcGNfbWQucGNpX3Byb2JlX21vZGUoYnVzKTsKIAlEQkcoIiAgICBwcm9iZSBtb2RlOiAlZFxuIiwgbW9kZSk7CkBAIC01NDIsNyArNTQ3LDcgQEAKIAkJYnVzLT5zdWJvcmRpbmF0ZSA9IGhvc2UtPmxhc3RfYnVzbm87CiAJCW9mX3NjYW5fYnVzKG5vZGUsIGJ1cyk7CiAJfQotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLworCiAJaWYgKG1vZGUgPT0gUENJX1BST0JFX05PUk1BTCkKIAkJaG9zZS0+bGFzdF9idXNubyA9IGJ1cy0+c3Vib3JkaW5hdGUgPSBwY2lfc2Nhbl9jaGlsZF9idXMoYnVzKTsKIH0KQEAgLTU4NiwxMSArNTkxLDkgQEAKIAlpZiAocHBjNjRfaXNhYnJpZGdlX2RldiAhPSBOVUxMKQogCQlwcmludGsoS0VSTl9ERUJVRyAiSVNBIGJyaWRnZSBhdCAlc1xuIiwgcGNpX25hbWUocHBjNjRfaXNhYnJpZGdlX2RldikpOwogCi0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCiAJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQogCQkvKiBtYXAgaW4gUENJIEkvTyBzcGFjZSAqLwogCQlwaGJzX3JlbWFwX2lvKCk7Ci0jZW5kaWYKIAogCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIGRvbmVcbiIpOwogCkBAIC02NzksNyArNjgyLDcgQEAKICAqIFJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKl9fcGNpX21tYXBfbWFrZV9vZmZzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm9mZnNldCwKKwkJCQkJICAgICAgIHJlc291cmNlX3NpemVfdCAqb2Zmc2V0LAogCQkJCQkgICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7CkBAIC02OTEsNyArNjk0LDkgQEAKIAogCS8qIElmIG1lbW9yeSwgYWRkIG9uIHRoZSBQQ0kgYnJpZGdlIGFkZHJlc3Mgb2Zmc2V0ICovCiAJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfbWVtKSB7CisjaWYgMCAvKiBTZWUgY29tbWVudCBpbiBwY2lfcmVzb3VyY2VfdG9fdXNlcigpIGZvciB3aHkgdGhpcyBpcyBkaXNhYmxlZCAqLwogCQkqb2Zmc2V0ICs9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworI2VuZGlmCiAJCXJlc19iaXQgPSBJT1JFU09VUkNFX01FTTsKIAl9IGVsc2UgewogCQlpb19vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKQEAgLTc1OSw5ICs3NjQsNiBAQAogCWVsc2UKIAkJcHJvdCB8PSBfUEFHRV9HVUFSREVEOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIlBDSSBtYXAgZm9yICVzOiVseCwgcHJvdDogJWx4XG4iLCBwY2lfbmFtZShkZXYpLCBycC0+c3RhcnQsCi0JICAgICAgIHByb3QpOwotCiAJcmV0dXJuIF9fcGdwcm90KHByb3QpOwogfQogCkBAIC04MjksNyArODMxLDcgQEAKIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLCBpbnQgd3JpdGVfY29tYmluZSkKIHsKLQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwogCXN0cnVjdCByZXNvdXJjZSAqcnA7CiAJaW50IHJldDsKIApAQCAtODY3LDggKzg2OSw2IEBACiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKIH0KIAotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQotCiAjZGVmaW5lIElTQV9TUEFDRV9NQVNLIDB4MQogI2RlZmluZSBJU0FfU1BBQ0VfSU8gMHgxCiAKQEAgLTk2OSwxMSArOTY5LDcgQEAKIAkJcmVzID0gTlVMTDsKIAkJcGNpX3NwYWNlID0gcmFuZ2VzWzBdOwogCQlwY2lfYWRkciA9ICgodW5zaWduZWQgbG9uZylyYW5nZXNbMV0gPDwgMzIpIHwgcmFuZ2VzWzJdOwotCi0JCWNwdV9waHlzX2FkZHIgPSByYW5nZXNbM107Ci0JCWlmIChuYSA+PSAyKQotCQkJY3B1X3BoeXNfYWRkciA9IChjcHVfcGh5c19hZGRyIDw8IDMyKSB8IHJhbmdlc1s0XTsKLQorCQljcHVfcGh5c19hZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZGV2LCAmcmFuZ2VzWzNdKTsKIAkJc2l6ZSA9ICgodW5zaWduZWQgbG9uZylyYW5nZXNbbmErM10gPDwgMzIpIHwgcmFuZ2VzW25hKzRdOwogCQlyYW5nZXMgKz0gbnA7CiAJCWlmIChzaXplID09IDApCkBAIC0xMTM5LDcgKzExMzUsNyBAQAogCQogCWlmIChnZXRfYnVzX2lvX3JhbmdlKGJ1cywgJnN0YXJ0X3BoeXMsICZzdGFydF92aXJ0LCAmc2l6ZSkpCiAJCXJldHVybiAxOwotCWlmIChpb3VubWFwX2V4cGxpY2l0KCh2b2lkIF9faW9tZW0gKikgc3RhcnRfdmlydCwgc2l6ZSkpCisJaWYgKF9faW91bm1hcF9leHBsaWNpdCgodm9pZCBfX2lvbWVtICopIHN0YXJ0X3ZpcnQsIHNpemUpKQogCQlyZXR1cm4gMTsKIAogCXJldHVybiAwOwpAQCAtMTIwNywyMyArMTIwMyw1MiBAQAogfQogRVhQT1JUX1NZTUJPTChwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMpOwogCit2b2lkIF9fZGV2aW5pdCBwY2liaW9zX3NldHVwX25ld19kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X2FyY2hkYXRhICpzZCA9ICZkZXYtPmRldi5hcmNoZGF0YTsKKworCXNkLT5vZl9ub2RlID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CisKKwlEQkcoIlBDSSBkZXZpY2UgJXMgT0Ygbm9kZTogJXNcbiIsIHBjaV9uYW1lKGRldiksCisJICAgIHNkLT5vZl9ub2RlID8gc2QtPm9mX25vZGUtPmZ1bGxfbmFtZSA6ICI8bm9uZT4iKTsKKworCXNkLT5kbWFfb3BzID0gcGNpX2RtYV9vcHM7CisjaWZkZWYgQ09ORklHX05VTUEKKwlzZC0+bnVtYV9ub2RlID0gcGNpYnVzX3RvX25vZGUoZGV2LT5idXMpOworI2Vsc2UKKwlzZC0+bnVtYV9ub2RlID0gLTE7CisjZW5kaWYKKwlpZiAocHBjX21kLnBjaV9kbWFfZGV2X3NldHVwKQorCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wocGNpYmlvc19zZXR1cF9uZXdfZGV2aWNlKTsKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGRvX2J1c19zZXR1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKLQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwKGJ1cyk7CisJaWYgKHBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCkKKwkJcHBjX21kLnBjaV9kbWFfYnVzX3NldHVwKGJ1cyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpCi0JCXBwY19tZC5pb21tdV9kZXZfc2V0dXAoZGV2KTsKKwkJcGNpYmlvc19zZXR1cF9uZXdfZGV2aWNlKGRldik7CiAKLQlpZiAocHBjX21kLmlycV9idXNfc2V0dXApCi0JCXBwY19tZC5pcnFfYnVzX3NldHVwKGJ1cyk7CisJLyogUmVhZCBkZWZhdWx0IElSUXMgYW5kIGZpeHVwIGlmIG5lY2Vzc2FyeSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOworCQlpZiAocHBjX21kLnBjaV9pcnFfZml4dXApCisJCQlwcGNfbWQucGNpX2lycV9maXh1cChkZXYpOworCX0KIH0KIAogdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gYnVzLT5zZWxmOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMpOworCisJREJHKCJwY2liaW9zX2ZpeHVwX2J1cyglcylcbiIsIG5wID8gbnAtPmZ1bGxfbmFtZSA6ICI8Pz8/PiIpOwogCiAJaWYgKGRldiAmJiBwY2lfcHJvYmVfb25seSAmJgogCSAgICAoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkgewpAQCAtMTMwNywyMCArMTMzMiw0MSBAQAogCiB2b2lkIHBjaV9yZXNvdXJjZV90b191c2VyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsCiAJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywKLQkJCSAgdTY0ICpzdGFydCwgdTY0ICplbmQpCisJCQkgIHJlc291cmNlX3NpemVfdCAqc3RhcnQsIHJlc291cmNlX3NpemVfdCAqZW5kKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSAwOwogCiAJaWYgKGhvc2UgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJb2Zmc2V0ID0gcGNpX2lvX2Jhc2UgLSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgKwotCQkJaG9zZS0+aW9fYmFzZV9waHlzOworCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKIAotCSpzdGFydCA9IHJzcmMtPnN0YXJ0ICsgb2Zmc2V0OwotCSplbmQgPSByc3JjLT5lbmQgKyBvZmZzZXQ7CisJLyogV2UgcGFzcyBhIGZ1bGx5IGZpeGVkIHVwIGFkZHJlc3MgdG8gdXNlcmxhbmQgZm9yIE1NSU8gaW5zdGVhZCBvZgorCSAqIGEgQkFSIHZhbHVlIGJlY2F1c2UgWCBpcyBsYW1lIGFuZCBleHBlY3RzIHRvIGJlIGFibGUgdG8gdXNlIHRoYXQKKwkgKiB0byBwYXNzIHRvIC9kZXYvbWVtICEKKwkgKgorCSAqIFRoYXQgbWVhbnMgdGhhdCB3ZSdsbCBoYXZlIHBvdGVudGlhbGx5IDY0IGJpdHMgdmFsdWVzIHdoZXJlIHNvbWUKKwkgKiB1c2VybGFuZCBhcHBzIG9ubHkgZXhwZWN0IDMyIChsaWtlIFggaXRzZWxmIHNpbmNlIGl0IHRoaW5rcyBvbmx5CisJICogU3BhcmMgaGFzIDY0IGJpdHMgTU1JTykgYnV0IGlmIHdlIGRvbid0IGRvIHRoYXQsIHdlIGJyZWFrIGl0IG9uCisJICogMzIgYml0cyBDSFJQcyA6LSgKKwkgKgorCSAqIEhvcGVmdWxseSwgdGhlIHN5c2ZzIGluc3RlcmZhY2UgaXMgaW1tdW5lIHRvIHRoYXQgZ3Vuay4gT25jZSBYCisJICogaGFzIGJlZW4gZml4ZWQgKGFuZCB0aGUgZml4IHNwcmVhZCBlbm91Z2gpLCB3ZSBjYW4gcmUtZW5hYmxlIHRoZQorCSAqIDIgbGluZXMgYmVsb3cgYW5kIHBhc3MgZG93biBhIEJBUiB2YWx1ZSB0byB1c2VybGFuZC4gSW4gdGhhdCBjYXNlCisJICogd2UnbGwgYWxzbyBoYXZlIHRvIHJlLWVuYWJsZSB0aGUgbWF0Y2hpbmcgY29kZSBpbgorCSAqIF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoKS4KKwkgKgorCSAqIEJlbkguCisJICovCisjaWYgMAorCWVsc2UgaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworI2VuZGlmCisKKwkqc3RhcnQgPSByc3JjLT5zdGFydCAtIG9mZnNldDsKKwkqZW5kID0gcnNyYy0+ZW5kIC0gb2Zmc2V0OwogfQogCiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpCkBAIC0xMzM3LDggKzEzODMsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCi0KIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZGlyZWN0X2lvbW11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kaXJlY3RfaW9tbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjZTA4Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kaXJlY3RfaW9tbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciBETUEgZnJvbSBQQ0kgZGV2aWNlcyB0byBtYWluIG1lbW9yeSBvbgotICogbWFjaGluZXMgd2l0aG91dCBhbiBpb21tdSBvciB3aXRoIGRpcmVjdGx5IGFkZHJlc3NhYmxlCi0gKiBSQU0gKHR5cGljYWxseSBhIHBtYWMgd2l0aCAyR2Igb2YgUkFNIG9yIGxlc3MpCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzIEJlbmphbWluIEhlcnJlbnNjaG1pZHQgKGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZykKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotCi0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgotI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgotI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+Ci0KLXN0YXRpYyB2b2lkICpwY2lfZGlyZWN0X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQotewotCXZvaWQgKnJldDsKLQotCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFnLCBnZXRfb3JkZXIoc2l6ZSkpOwotCWlmIChyZXQgIT0gTlVMTCkgewotCQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2FicyhyZXQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBwY2lfZGlyZWN0X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQotewotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIGdldF9vcmRlcihzaXplKSk7Ci19Ci0KLXN0YXRpYyBkbWFfYWRkcl90IHBjaV9kaXJlY3RfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqcHRyLAotCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCXJldHVybiB2aXJ0X3RvX2FicyhwdHIpOwotfQotCi1zdGF0aWMgdm9pZCBwY2lfZGlyZWN0X3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLX0KLQotc3RhdGljIGludCBwY2lfZGlyZWN0X21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewotCQlzZy0+ZG1hX2FkZHJlc3MgPSBwYWdlX3RvX3BoeXMoc2ctPnBhZ2UpICsgc2ctPm9mZnNldDsKLQkJc2ctPmRtYV9sZW5ndGggPSBzZy0+bGVuZ3RoOwotCX0KLQotCXJldHVybiBuZW50czsKLX0KLQotc3RhdGljIHZvaWQgcGNpX2RpcmVjdF91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci19Ci0KLXN0YXRpYyBpbnQgcGNpX2RpcmVjdF9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCi17Ci0JcmV0dXJuIG1hc2sgPCAweDEwMDAwMDAwMHVsbDsKLX0KLQotc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcGNpX2RpcmVjdF9vcHMgPSB7Ci0JLmFsbG9jX2NvaGVyZW50ID0gcGNpX2RpcmVjdF9hbGxvY19jb2hlcmVudCwKLQkuZnJlZV9jb2hlcmVudCA9IHBjaV9kaXJlY3RfZnJlZV9jb2hlcmVudCwKLQkubWFwX3NpbmdsZSA9IHBjaV9kaXJlY3RfbWFwX3NpbmdsZSwKLQkudW5tYXBfc2luZ2xlID0gcGNpX2RpcmVjdF91bm1hcF9zaW5nbGUsCi0JLm1hcF9zZyA9IHBjaV9kaXJlY3RfbWFwX3NnLAotCS51bm1hcF9zZyA9IHBjaV9kaXJlY3RfdW5tYXBfc2csCi0JLmRtYV9zdXBwb3J0ZWQgPSBwY2lfZGlyZWN0X2RtYV9zdXBwb3J0ZWQsCi19OwotCi12b2lkIF9faW5pdCBwY2lfZGlyZWN0X2lvbW11X2luaXQodm9pZCkKLXsKLQlwY2lfZG1hX29wcyA9IHBjaV9kaXJlY3Rfb3BzOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2lvbW11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODhiMjUuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfaW9tbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAxIE1pa2UgQ29ycmlnYW4gJiBEYXZlIEVuZ2VicmV0c2VuLCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBSZXdyaXRlLCBjbGVhbnVwLCBuZXcgYWxsb2NhdGlvbiBzY2hlbWVzOgotICogQ29weXJpZ2h0IChDKSAyMDA0IE9sb2YgSm9oYW5zc29uLCBJQk0gQ29ycG9yYXRpb24KLSAqCi0gKiBEeW5hbWljIERNQSBtYXBwaW5nIHN1cHBvcnQsIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhcnRzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgotI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgotCi0vKgotICogV2UgY2FuIHVzZSAtPnN5c2RhdGEgZGlyZWN0bHkgYW5kIGF2b2lkIHRoZSBleHRyYSB3b3JrIGluCi0gKiBwY2lfZGV2aWNlX3RvX09GX25vZGUgc2luY2UgLT5zeXNkYXRhIHdpbGwgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCi0gKiBpbiB0aGUgaW9tbXUgaW5pdCBjb2RlIGZvciBhbGwgZGV2aWNlcy4KLSAqLwotI2RlZmluZSBQQ0lfR0VUX0ROKGRldikgKChzdHJ1Y3QgZGV2aWNlX25vZGUgKikoKGRldiktPnN5c2RhdGEpKQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpb21tdV90YWJsZSAqZGV2aWNlX3RvX3RhYmxlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCi0JaWYgKCFod2RldikgewotCQlwZGV2ID0gcHBjNjRfaXNhYnJpZGdlX2RldjsKLQkJaWYgKCFwZGV2KQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCXBkZXYgPSB0b19wY2lfZGV2KGh3ZGV2KTsKLQotCXJldHVybiBQQ0lfRE4oUENJX0dFVF9ETihwZGV2KSktPmlvbW11X3RhYmxlOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkZXZpY2VfdG9fbWFzayhzdHJ1Y3QgZGV2aWNlICpod2RldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQotCWlmICghaHdkZXYpIHsKLQkJcGRldiA9IHBwYzY0X2lzYWJyaWRnZV9kZXY7Ci0JCWlmICghcGRldikgLyogVGhpcyBpcyB0aGUgYmVzdCBndWVzcyB3ZSBjYW4gZG8gKi8KLQkJCXJldHVybiAweGZmZmZmZmZmdWw7Ci0JfSBlbHNlCi0JCXBkZXYgPSB0b19wY2lfZGV2KGh3ZGV2KTsKLQotCWlmIChwZGV2LT5kbWFfbWFzaykKLQkJcmV0dXJuIHBkZXYtPmRtYV9tYXNrOwotCi0JLyogQXNzdW1lIGRldmljZXMgd2l0aG91dCBtYXNrIGNhbiB0YWtlIDMyIGJpdCBhZGRyZXNzZXMgKi8KLQlyZXR1cm4gMHhmZmZmZmZmZnVsOwotfQotCi0KLS8qIEFsbG9jYXRlcyBhIGNvbnRpZ3VvdXMgcmVhbCBidWZmZXIgYW5kIGNyZWF0ZXMgbWFwcGluZ3Mgb3ZlciBpdC4KLSAqIFJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFuZCBzZXRzIGRtYV9oYW5kbGUKLSAqIHRvIHRoZSBkbWEgYWRkcmVzcyAobWFwcGluZykgb2YgdGhlIGZpcnN0IHBhZ2UuCi0gKi8KLXN0YXRpYyB2b2lkICpwY2lfaW9tbXVfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKLXsKLQlyZXR1cm4gaW9tbXVfYWxsb2NfY29oZXJlbnQoZGV2aWNlX3RvX3RhYmxlKGh3ZGV2KSwgc2l6ZSwgZG1hX2hhbmRsZSwKLQkJCWRldmljZV90b19tYXNrKGh3ZGV2KSwgZmxhZywKLQkJCXBjaWJ1c190b19ub2RlKHRvX3BjaV9kZXYoaHdkZXYpLT5idXMpKTsKLX0KLQotc3RhdGljIHZvaWQgcGNpX2lvbW11X2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JaW9tbXVfZnJlZV9jb2hlcmVudChkZXZpY2VfdG9fdGFibGUoaHdkZXYpLCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7Ci19Ci0KLS8qIENyZWF0ZXMgVENFcyBmb3IgYSB1c2VyIHByb3ZpZGVkIGJ1ZmZlci4gIFRoZSB1c2VyIGJ1ZmZlciBtdXN0IGJlIAotICogY29udGlndW91cyByZWFsIGtlcm5lbCBzdG9yYWdlIChub3Qgdm1hbGxvYykuICBUaGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyCi0gKiBwYXNzZWQgaGVyZSBpcyB0aGUga2VybmVsICh2aXJ0dWFsKSBhZGRyZXNzIG9mIHRoZSBidWZmZXIuICBUaGUgYnVmZmVyCi0gKiBuZWVkIG5vdCBiZSBwYWdlIGFsaWduZWQsIHRoZSBkbWFfYWRkcl90IHJldHVybmVkIHdpbGwgcG9pbnQgdG8gdGhlIHNhbWUKLSAqIGJ5dGUgd2l0aGluIHRoZSBwYWdlIGFzIHZhZGRyLgotICovCi1zdGF0aWMgZG1hX2FkZHJfdCBwY2lfaW9tbXVfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqdmFkZHIsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JcmV0dXJuIGlvbW11X21hcF9zaW5nbGUoZGV2aWNlX3RvX3RhYmxlKGh3ZGV2KSwgdmFkZHIsIHNpemUsCi0JCQkgICAgICAgIGRldmljZV90b19tYXNrKGh3ZGV2KSwgZGlyZWN0aW9uKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBwY2lfaW9tbXVfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JaW9tbXVfdW5tYXBfc2luZ2xlKGRldmljZV90b190YWJsZShod2RldiksIGRtYV9oYW5kbGUsIHNpemUsIGRpcmVjdGlvbik7Ci19Ci0KLQotc3RhdGljIGludCBwY2lfaW9tbXVfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAotCQlpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JcmV0dXJuIGlvbW11X21hcF9zZyhwZGV2LCBkZXZpY2VfdG9fdGFibGUocGRldiksIHNnbGlzdCwKLQkJCW5lbGVtcywgZGV2aWNlX3RvX21hc2socGRldiksIGRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaV9pb21tdV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCWlvbW11X3VubWFwX3NnKGRldmljZV90b190YWJsZShwZGV2KSwgc2dsaXN0LCBuZWxlbXMsIGRpcmVjdGlvbik7Ci19Ci0KLS8qIFdlIHN1cHBvcnQgRE1BIHRvL2Zyb20gYW55IG1lbW9yeSBwYWdlIHZpYSB0aGUgaW9tbXUgKi8KLXN0YXRpYyBpbnQgcGNpX2lvbW11X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKLXsKLQlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCA9IGRldmljZV90b190YWJsZShkZXYpOwotCi0JaWYgKCF0YmwgfHwgdGJsLT5pdF9vZmZzZXQgPiBtYXNrKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIldhcm5pbmc6IElPTU1VIHRhYmxlIG9mZnNldCB0b28gYmlnIGZvciBkZXZpY2UgbWFza1xuIik7Ci0JCWlmICh0YmwpCi0JCQlwcmludGsoS0VSTl9JTkZPICJtYXNrOiAweCUwOGx4LCB0YWJsZSBvZmZzZXQ6IDB4JTA4bHhcbiIsCi0JCQkJbWFzaywgdGJsLT5pdF9vZmZzZXQpOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9JTkZPICJtYXNrOiAweCUwOGx4LCB0YWJsZSB1bmF2YWlsYWJsZVxuIiwKLQkJCQltYXNrKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiAxOwotfQotCi1zdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBjaV9pb21tdV9vcHMgPSB7Ci0JLmFsbG9jX2NvaGVyZW50ID0gcGNpX2lvbW11X2FsbG9jX2NvaGVyZW50LAotCS5mcmVlX2NvaGVyZW50ID0gcGNpX2lvbW11X2ZyZWVfY29oZXJlbnQsCi0JLm1hcF9zaW5nbGUgPSBwY2lfaW9tbXVfbWFwX3NpbmdsZSwKLQkudW5tYXBfc2luZ2xlID0gcGNpX2lvbW11X3VubWFwX3NpbmdsZSwKLQkubWFwX3NnID0gcGNpX2lvbW11X21hcF9zZywKLQkudW5tYXBfc2cgPSBwY2lfaW9tbXVfdW5tYXBfc2csCi0JLmRtYV9zdXBwb3J0ZWQgPSBwY2lfaW9tbXVfZG1hX3N1cHBvcnRlZCwKLX07Ci0KLXZvaWQgcGNpX2lvbW11X2luaXQodm9pZCkKLXsKLQlwY2lfZG1hX29wcyA9IHBjaV9pb21tdV9vcHM7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZtb25fZnNsX2Jvb2tlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZtb25fZnNsX2Jvb2tlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGNmMmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmbW9uX2ZzbF9ib29rZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qIGFyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZm1vbl9mc2xfYm9va2UuYwotICogRnJlZXNjYWxlIEJvb2stRSBQZXJmb3JtYW5jZSBNb25pdG9yIGNvZGUKLSAqCi0gKiBBdXRob3I6IEFuZHkgRmxlbWluZwotICogQ29weXJpZ2h0IChjKSAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcmVnLmg+Ci0jaW5jbHVkZSA8YXNtL3htb24uaD4KLSNpbmNsdWRlIDxhc20vcG1jLmg+Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGdldF9wbWxjYShpbnQgY3RyKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG1sY2EoaW50IGN0ciwgdTMyIHBtbGNhKTsKLQotc3RhdGljIGlubGluZSB1MzIgZ2V0X3BtbGNhKGludCBjdHIpCi17Ci0JdTMyIHBtbGNhOwotCi0Jc3dpdGNoIChjdHIpIHsKLQkJY2FzZSAwOgotCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBhbmljKCJCYWQgY3RyIG51bWJlclxuIik7Ci0JfQotCi0JcmV0dXJuIHBtbGNhOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BtbGNhKGludCBjdHIsIHUzMiBwbWxjYSkKLXsKLQlzd2l0Y2ggKGN0cikgewotCQljYXNlIDA6Ci0JCQltdHBtcihQTVJOX1BNTENBMCwgcG1sY2EpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCW10cG1yKFBNUk5fUE1MQ0ExLCBwbWxjYSk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJbXRwbXIoUE1STl9QTUxDQTIsIHBtbGNhKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQltdHBtcihQTVJOX1BNTENBMywgcG1sY2EpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwYW5pYygiQmFkIGN0ciBudW1iZXJcbiIpOwotCX0KLX0KLQotdm9pZCBpbml0X3BtY19zdG9wKGludCBjdHIpCi17Ci0JdTMyIHBtbGNhID0gKFBNTENBX0ZDIHwgUE1MQ0FfRkNTIHwgUE1MQ0FfRkNVIHwKLQkJCVBNTENBX0ZDTTEgfCBQTUxDQV9GQ00wKTsKLQl1MzIgcG1sY2IgPSAwOwotCi0Jc3dpdGNoIChjdHIpIHsKLQkJY2FzZSAwOgotCQkJbXRwbXIoUE1STl9QTUxDQTAsIHBtbGNhKTsKLQkJCW10cG1yKFBNUk5fUE1MQ0IwLCBwbWxjYik7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJbXRwbXIoUE1STl9QTUxDQTEsIHBtbGNhKTsKLQkJCW10cG1yKFBNUk5fUE1MQ0IxLCBwbWxjYik7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJbXRwbXIoUE1STl9QTUxDQTIsIHBtbGNhKTsKLQkJCW10cG1yKFBNUk5fUE1MQ0IyLCBwbWxjYik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJbXRwbXIoUE1STl9QTUxDQTMsIHBtbGNhKTsKLQkJCW10cG1yKFBNUk5fUE1MQ0IzLCBwbWxjYik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXBhbmljKCJCYWQgY3RyIG51bWJlciFcbiIpOwotCX0KLX0KLQotdm9pZCBzZXRfcG1jX2V2ZW50KGludCBjdHIsIGludCBldmVudCkKLXsKLQl1MzIgcG1sY2E7Ci0KLQlwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JcG1sY2EgPSAocG1sY2EgJiB+UE1MQ0FfRVZFTlRfTUFTSykgfAotCQkoKGV2ZW50IDw8IFBNTENBX0VWRU5UX1NISUZUKSAmCi0JCSBQTUxDQV9FVkVOVF9NQVNLKTsKLQotCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKLX0KLQotdm9pZCBzZXRfcG1jX3VzZXJfa2VybmVsKGludCBjdHIsIGludCB1c2VyLCBpbnQga2VybmVsKQotewotCXUzMiBwbWxjYTsKLQotCXBtbGNhID0gZ2V0X3BtbGNhKGN0cik7Ci0KLQlpZih1c2VyKQotCQlwbWxjYSAmPSB+UE1MQ0FfRkNVOwotCWVsc2UKLQkJcG1sY2EgfD0gUE1MQ0FfRkNVOwotCi0JaWYoa2VybmVsKQotCQlwbWxjYSAmPSB+UE1MQ0FfRkNTOwotCWVsc2UKLQkJcG1sY2EgfD0gUE1MQ0FfRkNTOwotCi0Jc2V0X3BtbGNhKGN0ciwgcG1sY2EpOwotfQotCi12b2lkIHNldF9wbWNfbWFya2VkKGludCBjdHIsIGludCBtYXJrMCwgaW50IG1hcmsxKQotewotCXUzMiBwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JaWYobWFyazApCi0JCXBtbGNhICY9IH5QTUxDQV9GQ00wOwotCWVsc2UKLQkJcG1sY2EgfD0gUE1MQ0FfRkNNMDsKLQotCWlmKG1hcmsxKQotCQlwbWxjYSAmPSB+UE1MQ0FfRkNNMTsKLQllbHNlCi0JCXBtbGNhIHw9IFBNTENBX0ZDTTE7Ci0KLQlzZXRfcG1sY2EoY3RyLCBwbWxjYSk7Ci19Ci0KLXZvaWQgcG1jX3N0YXJ0X2N0cihpbnQgY3RyLCBpbnQgZW5hYmxlKQotewotCXUzMiBwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JcG1sY2EgJj0gflBNTENBX0ZDOwotCi0JaWYgKGVuYWJsZSkKLQkJcG1sY2EgfD0gUE1MQ0FfQ0U7Ci0JZWxzZQotCQlwbWxjYSAmPSB+UE1MQ0FfQ0U7Ci0KLQlzZXRfcG1sY2EoY3RyLCBwbWxjYSk7Ci19Ci0KLXZvaWQgcG1jX3N0YXJ0X2N0cnMoaW50IGVuYWJsZSkKLXsKLQl1MzIgcG1nYzAgPSBtZnBtcihQTVJOX1BNR0MwKTsKLQotCXBtZ2MwICY9IH5QTUdDMF9GQUM7Ci0JcG1nYzAgfD0gUE1HQzBfRkNFQ0U7Ci0KLQlpZiAoZW5hYmxlKQotCQlwbWdjMCB8PSBQTUdDMF9QTUlFOwotCWVsc2UKLQkJcG1nYzAgJj0gflBNR0MwX1BNSUU7Ci0KLQltdHBtcihQTVJOX1BNR0MwLCBwbWdjMCk7Ci19Ci0KLXZvaWQgcG1jX3N0b3BfY3Rycyh2b2lkKQotewotCXUzMiBwbWdjMCA9IG1mcG1yKFBNUk5fUE1HQzApOwotCi0JcG1nYzAgfD0gUE1HQzBfRkFDOwotCi0JcG1nYzAgJj0gfihQTUdDMF9QTUlFIHwgUE1HQzBfRkNFQ0UpOwotCi0JbXRwbXIoUE1STl9QTUdDMCwgcG1nYzApOwotfQotCi12b2lkIGR1bXBfcG1jcyh2b2lkKQotewotCXByaW50aygicG1nYzA6ICV4XG4iLCBtZnBtcihQTVJOX1BNR0MwKSk7Ci0JcHJpbnRrKCJwbWNcdFx0cG1sY2FcdFx0cG1sY2JcbiIpOwotCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMwKSwKLQkJCW1mcG1yKFBNUk5fUE1MQ0EwKSwgbWZwbXIoUE1STl9QTUxDQjApKTsKLQlwcmludGsoIiU4eFx0JTh4XHQlOHhcbiIsIG1mcG1yKFBNUk5fUE1DMSksCi0JCQltZnBtcihQTVJOX1BNTENBMSksIG1mcG1yKFBNUk5fUE1MQ0IxKSk7Ci0JcHJpbnRrKCIlOHhcdCU4eFx0JTh4XG4iLCBtZnBtcihQTVJOX1BNQzIpLAotCQkJbWZwbXIoUE1STl9QTUxDQTIpLCBtZnBtcihQTVJOX1BNTENCMikpOwotCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMzKSwKLQkJCW1mcG1yKFBNUk5fUE1MQ0EzKSwgbWZwbXIoUE1STl9QTUxDQjMpKTsKLX0KLQotRVhQT1JUX1NZTUJPTChpbml0X3BtY19zdG9wKTsKLUVYUE9SVF9TWU1CT0woc2V0X3BtY19ldmVudCk7Ci1FWFBPUlRfU1lNQk9MKHNldF9wbWNfdXNlcl9rZXJuZWwpOwotRVhQT1JUX1NZTUJPTChzZXRfcG1jX21hcmtlZCk7Ci1FWFBPUlRfU1lNQk9MKHBtY19zdGFydF9jdHIpOwotRVhQT1JUX1NZTUJPTChwbWNfc3RhcnRfY3Rycyk7Ci1FWFBPUlRfU1lNQk9MKHBtY19zdG9wX2N0cnMpOwotRVhQT1JUX1NZTUJPTChkdW1wX3BtY3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG1jLmMKaW5kZXggYTBhMmVmYS4uM2Q4ZjZmNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BtYy5jCkBAIC03MSw3ICs3MSw3IEBACiAJfQogCiAJcG1jX293bmVyX2NhbGxlciA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKLQlwZXJmX2lycSA9IG5ld19wZXJmX2lycSA/IDogZHVtbXlfcGVyZjsKKwlwZXJmX2lycSA9IG5ld19wZXJmX2lycSA/IG5ld19wZXJmX2lycSA6IGR1bW15X3BlcmY7CiAKICBvdXQ6CiAJc3Bpbl91bmxvY2soJnBtY19vd25lcl9sb2NrKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IDgwNzE5M2EuLjk1Nzc2YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtNDksNiArNDksMTAgQEAKICNpbmNsdWRlIDxhc20vY29tbXByb2MuaD4KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQzY0CitFWFBPUlRfU1lNQk9MKGxvY2FsX2lycV9yZXN0b3JlKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BQQzMyCiBleHRlcm4gdm9pZCB0cmFuc2Zlcl90b19oYW5kbGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKQEAgLTIwNCw3ICsyMDgsNyBAQAogZXh0ZXJuIGxvbmcgKmludGVyY2VwdF90YWJsZTsKIEVYUE9SVF9TWU1CT0woaW50ZXJjZXB0X3RhYmxlKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDX1NURF9NTVVfMzIgKi8KLSNpZiBkZWZpbmVkKENPTkZJR180MHgpIHx8IGRlZmluZWQoQ09ORklHX0JPT0tFKQorI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQogRVhQT1JUX1NZTUJPTChfX210ZGNyKTsKIEVYUE9SVF9TWU1CT0woX19tZmRjcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jX3BwYzY0LmMKaW5kZXggZjU5OGNiNS4uZGQ3MDAxYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jX3BwYzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jX3BwYzY0LmMKQEAgLTgzLDcgKzgzLDcgQEAKIHN0YXRpYyBsb2ZmX3QgcGFnZV9tYXBfc2Vlayggc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmYsIGludCB3aGVuY2UpCiB7CiAJbG9mZl90IG5ldzsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCiAJc3dpdGNoKHdoZW5jZSkgewogCWNhc2UgMDoKQEAgLTEwNiwxMyArMTA2LDEzIEBACiBzdGF0aWMgc3NpemVfdCBwYWdlX21hcF9yZWFkKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKIAkJCSAgICAgIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgZHAtPmRhdGEsIGRwLT5zaXplKTsKIH0KIAogc3RhdGljIGludCBwYWdlX21hcF9tbWFwKCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAKIAlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPiBkcC0+c2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDdiMmY2NDUuLmYzZDRkZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNDEsMTMgKzM0MSw2IEBACiAKIHN0YXRpYyBpbnQgaW5zdHJ1Y3Rpb25zX3RvX3ByaW50ID0gMTY7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLSNkZWZpbmUgQkFEX1BDKHBjKQkoKFJFR0lPTl9JRChwYykgIT0gS0VSTkVMX1JFR0lPTl9JRCkgJiYgXAotCQkgICAgICAgICAoUkVHSU9OX0lEKHBjKSAhPSBWTUFMTE9DX1JFR0lPTl9JRCkpCi0jZWxzZQotI2RlZmluZSBCQURfUEMocGMpCSgocGMpIDwgS0VSTkVMQkFTRSkKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBzaG93X2luc3RydWN0aW9ucyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaTsKQEAgLTM2Niw3ICszNTksOCBAQAogCQkgKiBiYWQgYWRkcmVzcyBiZWNhdXNlIHRoZSBwYyAqc2hvdWxkKiBvbmx5IGJlIGEKIAkJICoga2VybmVsIGFkZHJlc3MuCiAJCSAqLwotCQlpZiAoQkFEX1BDKHBjKSB8fCBfX2dldF91c2VyKGluc3RyLCAodW5zaWduZWQgaW50IF9fdXNlciAqKXBjKSkgeworCQlpZiAoIV9fa2VybmVsX3RleHRfYWRkcmVzcyhwYykgfHwKKwkJICAgICBfX2dldF91c2VyKGluc3RyLCAodW5zaWduZWQgaW50IF9fdXNlciAqKXBjKSkgewogCQkJcHJpbnRrKCJYWFhYWFhYWCAiKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChyZWdzLT5uaXAgPT0gcGMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IDg2NWI5NjQuLjFmYzczMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC01MzgsMzUgKzUzOCwzMSBAQAogCXtDUFVfRlRSX1JFQUxfTEUsIFBQQ19GRUFUVVJFX1RSVUVfTEUsIDUsIDAsIDB9LAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2NwdV9wYV9mZWF0dXJlcyh1bnNpZ25lZCBsb25nIG5vZGUpCitzdGF0aWMgdm9pZCBfX2luaXQgc2Nhbl9mZWF0dXJlcyh1bnNpZ25lZCBsb25nIG5vZGUsIHVuc2lnbmVkIGNoYXIgKmZ0cnMsCisJCQkJIHVuc2lnbmVkIGxvbmcgdGFibGVsZW4sCisJCQkJIHN0cnVjdCBpYm1fcGFfZmVhdHVyZSAqZnAsCisJCQkJIHVuc2lnbmVkIGxvbmcgZnRfc2l6ZSkKIHsKLQl1bnNpZ25lZCBjaGFyICpwYV9mdHJzOwotCXVuc2lnbmVkIGxvbmcgbGVuLCB0YWJsZWxlbiwgaSwgYml0OwotCi0JcGFfZnRycyA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxwYS1mZWF0dXJlcyIsICZ0YWJsZWxlbik7Ci0JaWYgKHBhX2Z0cnMgPT0gTlVMTCkKLQkJcmV0dXJuOworCXVuc2lnbmVkIGxvbmcgaSwgbGVuLCBiaXQ7CiAKIAkvKiBmaW5kIGRlc2NyaXB0b3Igd2l0aCB0eXBlID09IDAgKi8KIAlmb3IgKDs7KSB7CiAJCWlmICh0YWJsZWxlbiA8IDMpCiAJCQlyZXR1cm47Ci0JCWxlbiA9IDIgKyBwYV9mdHJzWzBdOworCQlsZW4gPSAyICsgZnRyc1swXTsKIAkJaWYgKHRhYmxlbGVuIDwgbGVuKQogCQkJcmV0dXJuOwkJLyogZGVzY3JpcHRvciAwIG5vdCBmb3VuZCAqLwotCQlpZiAocGFfZnRyc1sxXSA9PSAwKQorCQlpZiAoZnRyc1sxXSA9PSAwKQogCQkJYnJlYWs7CiAJCXRhYmxlbGVuIC09IGxlbjsKLQkJcGFfZnRycyArPSBsZW47CisJCWZ0cnMgKz0gbGVuOwogCX0KIAogCS8qIGxvb3Agb3ZlciBiaXRzIHdlIGtub3cgYWJvdXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpYm1fcGFfZmVhdHVyZXMpOyArK2kpIHsKLQkJc3RydWN0IGlibV9wYV9mZWF0dXJlICpmcCA9ICZpYm1fcGFfZmVhdHVyZXNbaV07Ci0KLQkJaWYgKGZwLT5wYWJ5dGUgPj0gcGFfZnRyc1swXSkKKwlmb3IgKGkgPSAwOyBpIDwgZnRfc2l6ZTsgKytpLCArK2ZwKSB7CisJCWlmIChmcC0+cGFieXRlID49IGZ0cnNbMF0pCiAJCQljb250aW51ZTsKLQkJYml0ID0gKHBhX2Z0cnNbMiArIGZwLT5wYWJ5dGVdID4+ICg3IC0gZnAtPnBhYml0KSkgJiAxOworCQliaXQgPSAoZnRyc1syICsgZnAtPnBhYnl0ZV0gPj4gKDcgLSBmcC0+cGFiaXQpKSAmIDE7CiAJCWlmIChiaXQgXiBmcC0+aW52ZXJ0KSB7CiAJCQljdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcyB8PSBmcC0+Y3B1X2ZlYXR1cmVzOwogCQkJY3VyX2NwdV9zcGVjLT5jcHVfdXNlcl9mZWF0dXJlcyB8PSBmcC0+Y3B1X3VzZXJfZnRyczsKQEAgLTU3NywxNiArNTczLDU5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfY3B1X3BhX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgbm9kZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwYV9mdHJzOworCXVuc2lnbmVkIGxvbmcgdGFibGVsZW47CisKKwlwYV9mdHJzID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLHBhLWZlYXR1cmVzIiwgJnRhYmxlbGVuKTsKKwlpZiAocGFfZnRycyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzY2FuX2ZlYXR1cmVzKG5vZGUsIHBhX2Z0cnMsIHRhYmxlbGVuLAorCQkgICAgICBpYm1fcGFfZmVhdHVyZXMsIEFSUkFZX1NJWkUoaWJtX3BhX2ZlYXR1cmVzKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmVhdHVyZV9wcm9wZXJ0eSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MzIgbWluX3ZhbHVlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZlYXR1cmU7CisJdW5zaWduZWQgbG9uZyBjcHVfdXNlcl9mdHI7Cit9IGZlYXR1cmVfcHJvcGVydGllc1tdIF9faW5pdGRhdGEgPSB7CisjaWZkZWYgQ09ORklHX0FMVElWRUMKKwl7ImFsdGl2ZWMiLCAwLCBDUFVfRlRSX0FMVElWRUMsIFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDfSwKKwl7ImlibSx2bXgiLCAxLCBDUFVfRlRSX0FMVElWRUMsIFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDfSwKKyNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLworI2lmZGVmIENPTkZJR19QUEM2NAorCXsiaWJtLGRmcCIsIDEsIDAsIFBQQ19GRUFUVVJFX0hBU19ERlB9LAorCXsiaWJtLHB1cnIiLCAxLCBDUFVfRlRSX1BVUlIsIDB9LAorCXsiaWJtLHNwdXJyIiwgMSwgQ1BVX0ZUUl9TUFVSUiwgMH0sCisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfY3B1X2ZlYXR1cmVfcHJvcGVydGllcyh1bnNpZ25lZCBsb25nIG5vZGUpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXN0cnVjdCBmZWF0dXJlX3Byb3BlcnR5ICpmcCA9IGZlYXR1cmVfcHJvcGVydGllczsKKwljb25zdCB1MzIgKnByb3A7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmZWF0dXJlX3Byb3BlcnRpZXMpOyArK2ksICsrZnApIHsKKwkJcHJvcCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgZnAtPm5hbWUsIE5VTEwpOworCQlpZiAocHJvcCAmJiAqcHJvcCA+PSBmcC0+bWluX3ZhbHVlKSB7CisJCQljdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcyB8PSBmcC0+Y3B1X2ZlYXR1cmU7CisJCQljdXJfY3B1X3NwZWMtPmNwdV91c2VyX2ZlYXR1cmVzIHw9IGZwLT5jcHVfdXNlcl9mdHI7CisJCX0KKwl9Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X2luaXRfZHRfc2Nhbl9jcHVzKHVuc2lnbmVkIGxvbmcgbm9kZSwKIAkJCQkJICBjb25zdCBjaGFyICp1bmFtZSwgaW50IGRlcHRoLAogCQkJCQkgIHZvaWQgKmRhdGEpCiB7CiAJc3RhdGljIGludCBsb2dpY2FsX2NwdWlkID0gMDsKIAljaGFyICp0eXBlID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiZGV2aWNlX3R5cGUiLCBOVUxMKTsKLSNpZmRlZiBDT05GSUdfQUxUSVZFQwotCXUzMiAqcHJvcDsKLSNlbmRpZgotCXUzMiAqaW50c2VydjsKKwljb25zdCB1MzIgKnByb3A7CisJY29uc3QgdTMyICppbnRzZXJ2OwogCWludCBpLCBudGhyZWFkczsKIAl1bnNpZ25lZCBsb25nIGxlbjsKIAlpbnQgZm91bmQgPSAwOwpAQCAtNjQzLDI0ICs2ODIsMjcgQEAKIAkJCWludHNlcnZbaV0pOwogCQlib290X2NwdWlkID0gbG9naWNhbF9jcHVpZDsKIAkJc2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChib290X2NwdWlkLCBpbnRzZXJ2W2ldKTsKKworCQkvKgorCQkgKiBQQVBSIGRlZmluZXMgImxvZ2ljYWwiIFBWUiB2YWx1ZXMgZm9yIGNwdXMgdGhhdAorCQkgKiBtZWV0IHZhcmlvdXMgbGV2ZWxzIG9mIHRoZSBhcmNoaXRlY3R1cmU6CisJCSAqIDB4MGYwMDAwMDEJQXJjaGl0ZWN0dXJlIHZlcnNpb24gMi4wNAorCQkgKiAweDBmMDAwMDAyCUFyY2hpdGVjdHVyZSB2ZXJzaW9uIDIuMDUKKwkJICogSWYgdGhlIGNwdS12ZXJzaW9uIHByb3BlcnR5IGluIHRoZSBjcHUgbm9kZSBjb250YWlucworCQkgKiBzdWNoIGEgdmFsdWUsIHdlIGNhbGwgaWRlbnRpZnlfY3B1IGFnYWluIHdpdGggdGhlCisJCSAqIGxvZ2ljYWwgUFZSIHZhbHVlIGluIG9yZGVyIHRvIHVzZSB0aGUgY3B1IGZlYXR1cmUKKwkJICogYml0cyBhcHByb3ByaWF0ZSBmb3IgdGhlIGFyY2hpdGVjdHVyZSBsZXZlbC4KKwkJICoKKwkJICogQSBQT1dFUjYgcGFydGl0aW9uIGluICJQT1dFUjYgYXJjaGl0ZWN0ZWQiIG1vZGUKKwkJICogdXNlcyB0aGUgMHgwZjAwMDAwMiBQVlIgdmFsdWU7IGluIFBPV0VSNSsgbW9kZQorCQkgKiBpdCB1c2VzIDB4MGYwMDAwMDEuCisJCSAqLworCQlwcm9wID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiY3B1LXZlcnNpb24iLCBOVUxMKTsKKwkJaWYgKHByb3AgJiYgKCpwcm9wICYgMHhmZjAwMDAwMCkgPT0gMHgwZjAwMDAwMCkKKwkJCWlkZW50aWZ5X2NwdSgwLCAqcHJvcCk7CiAJfQogCi0jaWZkZWYgQ09ORklHX0FMVElWRUMKLQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgVk1YIGFuZCBldmVudHVhbGx5IHVwZGF0ZSBDUFUgZmVhdHVyZXMgKi8KLQlwcm9wID0gKHUzMiAqKW9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSx2bXgiLCBOVUxMKTsKLQlpZiAocHJvcCAmJiAoKnByb3ApID4gMCkgewotCQljdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcyB8PSBDUFVfRlRSX0FMVElWRUM7Ci0JCWN1cl9jcHVfc3BlYy0+Y3B1X3VzZXJfZmVhdHVyZXMgfD0gUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUM7Ci0JfQotCi0JLyogU2FtZSBnb2VzIGZvciBBcHBsZSdzICJhbHRpdmVjIiBwcm9wZXJ0eSAqLwotCXByb3AgPSAodTMyICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiYWx0aXZlYyIsIE5VTEwpOwotCWlmIChwcm9wKSB7Ci0JCWN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzIHw9IENQVV9GVFJfQUxUSVZFQzsKLQkJY3VyX2NwdV9zcGVjLT5jcHVfdXNlcl9mZWF0dXJlcyB8PSBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQzsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KLQorCWNoZWNrX2NwdV9mZWF0dXJlX3Byb3BlcnRpZXMobm9kZSk7CiAJY2hlY2tfY3B1X3BhX2ZlYXR1cmVzKG5vZGUpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCkBAIC03NjIsNiArODA0LDU2IEBACiAJcmV0dXJuIG9mX3JlYWRfdWxvbmcocCwgcyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKKy8qCisgKiBJbnRlcnByZXQgdGhlIGlibSxkeW5hbWljLW1lbW9yeSBwcm9wZXJ0eSBpbiB0aGUKKyAqIC9pYm0sZHluYW1pYy1yZWNvbmZpZ3VyYXRpb24tbWVtb3J5IG5vZGUuCisgKiBUaGlzIGNvbnRhaW5zIGEgbGlzdCBvZiBtZW1vcnkgYmxvY2tzIGFsb25nIHdpdGggTlVNQSBhZmZpbml0eQorICogaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X2luaXRfZHRfc2Nhbl9kcmNvbmZfbWVtb3J5KHVuc2lnbmVkIGxvbmcgbm9kZSkKK3sKKwljZWxsX3QgKmRtLCAqbHM7CisJdW5zaWduZWQgbG9uZyBsLCBuOworCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZSwgbG1iX3NpemUsIGZsYWdzOworCisJbHMgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLGxtYi1zaXplIiwgJmwpOworCWlmIChscyA9PSBOVUxMIHx8IGwgPCBkdF9yb290X3NpemVfY2VsbHMgKiBzaXplb2YoY2VsbF90KSkKKwkJcmV0dXJuIDA7CisJbG1iX3NpemUgPSBkdF9tZW1fbmV4dF9jZWxsKGR0X3Jvb3Rfc2l6ZV9jZWxscywgJmxzKTsKKworCWRtID0gKGNlbGxfdCAqKW9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxkeW5hbWljLW1lbW9yeSIsICZsKTsKKwlpZiAoZG0gPT0gTlVMTCB8fCBsIDwgc2l6ZW9mKGNlbGxfdCkpCisJCXJldHVybiAwOworCisJbiA9ICpkbSsrOwkvKiBudW1iZXIgb2YgZW50cmllcyAqLworCWlmIChsIDwgKG4gKiAoZHRfcm9vdF9hZGRyX2NlbGxzICsgNCkgKyAxKSAqIHNpemVvZihjZWxsX3QpKQorCQlyZXR1cm4gMDsKKworCWZvciAoOyBuICE9IDA7IC0tbikgeworCQliYXNlID0gZHRfbWVtX25leHRfY2VsbChkdF9yb290X2FkZHJfY2VsbHMsICZkbSk7CisJCWZsYWdzID0gZG1bM107CisJCS8qIHNraXAgRFJDIGluZGV4LCBwYWQsIGFzc29jLiBsaXN0IGluZGV4LCBmbGFncyAqLworCQlkbSArPSA0OworCQkvKiBza2lwIHRoaXMgYmxvY2sgaWYgdGhlIHJlc2VydmVkIGJpdCBpcyBzZXQgaW4gZmxhZ3MgKDB4ODApCisJCSAgIG9yIGlmIHRoZSBibG9jayBpcyBub3QgYXNzaWduZWQgdG8gdGhpcyBwYXJ0aXRpb24gKDB4OCkgKi8KKwkJaWYgKChmbGFncyAmIDB4ODApIHx8ICEoZmxhZ3MgJiAweDgpKQorCQkJY29udGludWU7CisJCXNpemUgPSBsbWJfc2l6ZTsKKwkJaWYgKGlvbW11X2lzX29mZikgeworCQkJaWYgKGJhc2UgPj0gMHg4MDAwMDAwMHVsKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChiYXNlICsgc2l6ZSkgPiAweDgwMDAwMDAwdWwpCisJCQkJc2l6ZSA9IDB4ODAwMDAwMDB1bCAtIGJhc2U7CisJCX0KKwkJbG1iX2FkZChiYXNlLCBzaXplKTsKKwl9CisJbG1iX2R1bXBfYWxsKCk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBlYXJseV9pbml0X2R0X3NjYW5fZHJjb25mX21lbW9yeShub2RlKQkwCisjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCiAKIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X2luaXRfZHRfc2Nhbl9tZW1vcnkodW5zaWduZWQgbG9uZyBub2RlLAogCQkJCQkgICAgY29uc3QgY2hhciAqdW5hbWUsIGludCBkZXB0aCwgdm9pZCAqZGF0YSkKQEAgLTc3MCw2ICs4NjIsMTEgQEAKIAljZWxsX3QgKnJlZywgKmVuZHA7CiAJdW5zaWduZWQgbG9uZyBsOwogCisJLyogTG9vayBmb3IgdGhlIGlibSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkgbm9kZSAqLworCWlmIChkZXB0aCA9PSAxICYmCisJICAgIHN0cmNtcCh1bmFtZSwgImlibSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkiKSA9PSAwKQorCQlyZXR1cm4gZWFybHlfaW5pdF9kdF9zY2FuX2RyY29uZl9tZW1vcnkobm9kZSk7CisKIAkvKiBXZSBhcmUgc2Nhbm5pbmcgIm1lbW9yeSIgbm9kZXMgb25seSAqLwogCWlmICh0eXBlID09IE5VTEwpIHsKIAkJLyoKQEAgLTEwMTQsNyArMTExMSw3IEBACiAvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiAiY29tcGF0IiBzdHJpbmcgbWF0Y2hlcyBvbmUgb2YgdGhlIHN0cmluZ3MgaW4KICAqIHRoZSBkZXZpY2UncyAiY29tcGF0aWJsZSIgcHJvcGVydHkKICAqLwotaW50IGRldmljZV9pc19jb21wYXRpYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBjb25zdCBjaGFyICpjb21wYXQpCitpbnQgZGV2aWNlX2lzX2NvbXBhdGlibGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGNvbnN0IGNoYXIgKmNvbXBhdCkKIHsKIAljb25zdCBjaGFyKiBjcDsKIAlpbnQgY3BsZW4sIGw7CkBAIC0xNDkxLDcgKzE1ODgsOCBAQAogX19pbml0Y2FsbChwcm9tX3JlY29uZmlnX3NldHVwKTsKICNlbmRpZgogCi1zdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwKK3N0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgIGludCAqbGVucCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnBwOwpAQCAtMTUxMiw3ICsxNjEwLDggQEAKICAqIEZpbmQgYSBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4gbmFtZSBmb3IgYSBnaXZlbiBub2RlCiAgKiBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KICAqLwotY29uc3Qgdm9pZCAqZ2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCkKK2NvbnN0IHZvaWQgKmdldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIGludCAqbGVucCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCxuYW1lLGxlbnApOwogCXJldHVybiBwcCA/IHBwLT52YWx1ZSA6IE5VTEw7CkBAIC0xNjcyLDYgKzE3NzEsNyBAQAogCX0KIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0wob2ZfZ2V0X2NwdV9ub2RlKTsKIAogI2lmZGVmIERFQlVHCiBzdGF0aWMgc3RydWN0IGRlYnVnZnNfYmxvYl93cmFwcGVyIGZsYXRfZHRfYmxvYjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCmluZGV4IGI5MTc2MTYzLi41MjBlZjQyZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC0xNzMsOCArMTczLDggQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcHJvbV9pbml0cmRfc3RhcnQsIHByb21faW5pdHJkX2VuZDsKIAogI2lmZGVmIENPTkZJR19QUEM2NAotc3RhdGljIGludCBfX2luaXRkYXRhIGlvbW11X2ZvcmNlX29uOwotc3RhdGljIGludCBfX2luaXRkYXRhIHBwYzY0X2lvbW11X29mZjsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBwcm9tX2lvbW11X2ZvcmNlX29uOworc3RhdGljIGludCBfX2luaXRkYXRhIHByb21faW9tbXVfb2ZmOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBwcm9tX3RjZV9hbGxvY19zdGFydDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcHJvbV90Y2VfYWxsb2NfZW5kOwogI2VuZGlmCkBAIC01ODIsOSArNTgyLDkgQEAKIAkJd2hpbGUgKCpvcHQgJiYgKm9wdCA9PSAnICcpCiAJCQlvcHQrKzsKIAkJaWYgKCFzdHJuY21wKG9wdCwgUkVMT0MoIm9mZiIpLCAzKSkKLQkJCVJFTE9DKHBwYzY0X2lvbW11X29mZikgPSAxOworCQkJUkVMT0MocHJvbV9pb21tdV9vZmYpID0gMTsKIAkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCBSRUxPQygiZm9yY2UiKSwgNSkpCi0JCQlSRUxPQyhpb21tdV9mb3JjZV9vbikgPSAxOworCQkJUkVMT0MocHJvbV9pb21tdV9mb3JjZV9vbikgPSAxOwogCX0KICNlbmRpZgogfQpAQCAtNjI3LDYgKzYyNyw3IEBACiAvKiBPcHRpb24gdmVjdG9yIDM6IHByb2Nlc3NvciBvcHRpb25zIHN1cHBvcnRlZCAqLwogI2RlZmluZSBPVjNfRlAJCQkweDgwCS8qIGZsb2F0aW5nIHBvaW50ICovCiAjZGVmaW5lIE9WM19WTVgJCQkweDQwCS8qIFZNWC9BbHRpdmVjICovCisjZGVmaW5lIE9WM19ERlAJCQkweDIwCS8qIGRlY2ltYWwgRlAgKi8KIAogLyogT3B0aW9uIHZlY3RvciA1OiBQQVBSL09GIG9wdGlvbnMgc3VwcG9ydGVkICovCiAjZGVmaW5lIE9WNV9MUEFSCQkweDgwCS8qIGxvZ2ljYWwgcGFydGl0aW9uaW5nIHN1cHBvcnRlZCAqLwpAQCAtNjQyLDYgKzY0Myw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBpYm1fYXJjaGl0ZWN0dXJlX3ZlY1tdID0gewogCVcoMHhmZmZlMDAwMCksIFcoMHgwMDNhMDAwMCksCS8qIFBPV0VSNS9QT1dFUjUrICovCiAJVygweGZmZmYwMDAwKSwgVygweDAwM2UwMDAwKSwJLyogUE9XRVI2ICovCisJVygweGZmZmZmZmZmKSwgVygweDBmMDAwMDAyKSwJLyogYWxsIDIuMDUtY29tcGxpYW50ICovCiAJVygweGZmZmZmZmZlKSwgVygweDBmMDAwMDAxKSwJLyogYWxsIDIuMDQtY29tcGxpYW50IGFuZCBlYXJsaWVyICovCiAJNSAtIDEsCQkJCS8qIDUgb3B0aW9uIHZlY3RvcnMgKi8KIApAQCAtNjY4LDcgKzY3MCw3IEBACiAJLyogb3B0aW9uIHZlY3RvciAzOiBwcm9jZXNzb3Igb3B0aW9ucyBzdXBwb3J0ZWQgKi8KIAkzIC0gMiwJCQkJLyogbGVuZ3RoICovCiAJMCwJCQkJLyogZG9uJ3QgaWdub3JlLCBkb24ndCBoYWx0ICovCi0JT1YzX0ZQIHwgT1YzX1ZNWCwKKwlPVjNfRlAgfCBPVjNfVk1YIHwgT1YzX0RGUCwKIAogCS8qIG9wdGlvbiB2ZWN0b3IgNDogSUJNIFBBUFIgaW1wbGVtZW50YXRpb24gKi8KIAkyIC0gMiwJCQkJLyogbGVuZ3RoICovCkBAIC02NzcsNyArNjc5LDcgQEAKIAkvKiBvcHRpb24gdmVjdG9yIDU6IFBBUFIvT0Ygb3B0aW9ucyAqLwogCTMgLSAyLAkJCQkvKiBsZW5ndGggKi8KIAkwLAkJCQkvKiBkb24ndCBpZ25vcmUsIGRvbid0IGhhbHQgKi8KLQlPVjVfTFBBUiB8IE9WNV9TUExQQVIgfCBPVjVfTEFSR0VfUEFHRVMsCisJT1Y1X0xQQVIgfCBPVjVfU1BMUEFSIHwgT1Y1X0xBUkdFX1BBR0VTIHwgT1Y1X0RSQ09ORl9NRU1PUlksCiB9OwogCiAvKiBPbGQgbWV0aG9kIC0gRUxGIGhlYWRlciB3aXRoIFBUX05PVEUgc2VjdGlvbnMgKi8KQEAgLTExNjcsNyArMTE2OSw3IEBACiAJdTY0IGxvY2FsX2FsbG9jX3RvcCwgbG9jYWxfYWxsb2NfYm90dG9tOwogCXU2NCBpOwogCi0JaWYgKFJFTE9DKHBwYzY0X2lvbW11X29mZikpCisJaWYgKFJFTE9DKHByb21faW9tbXVfb2ZmKSkKIAkJcmV0dXJuOwogCiAJcHJvbV9kZWJ1Zygic3RhcnRpbmcgcHJvbV9pbml0aWFsaXplX3RjZV90YWJsZVxuIik7CkBAIC0yMjgzLDExICsyMjg1LDExIEBACiAJICogRmlsbCBpbiBzb21lIGluZm9zIGZvciB1c2UgYnkgdGhlIGtlcm5lbCBsYXRlciBvbgogCSAqLwogI2lmZGVmIENPTkZJR19QUEM2NAotCWlmIChSRUxPQyhwcGM2NF9pb21tdV9vZmYpKQorCWlmIChSRUxPQyhwcm9tX2lvbW11X29mZikpCiAJCXByb21fc2V0cHJvcChfcHJvbS0+Y2hvc2VuLCAiL2Nob3NlbiIsICJsaW51eCxpb21tdS1vZmYiLAogCQkJICAgICBOVUxMLCAwKTsKIAotCWlmIChSRUxPQyhpb21tdV9mb3JjZV9vbikpCisJaWYgKFJFTE9DKHByb21faW9tbXVfZm9yY2Vfb24pKQogCQlwcm9tX3NldHByb3AoX3Byb20tPmNob3NlbiwgIi9jaG9zZW4iLCAibGludXgsaW9tbXUtZm9yY2Utb24iLAogCQkJICAgICBOVUxMLCAwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwppbmRleCA2MDNkZmYzLi4wZGZiZTFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwpAQCAtMjUsNiArMjUsMTIgQEAKICNkZWZpbmUgT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykJKChuYSkgPiAwICYmIChuYSkgPD0gT0ZfTUFYX0FERFJfQ0VMTFMgJiYgXAogCQkJKG5zKSA+IDApCiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfYnVzICpvZl9tYXRjaF9idXMoc3RydWN0IGRldmljZV9ub2RlICpucCk7CitzdGF0aWMgaW50IF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKKwkJY29uc3QgdTMyICphZGRycCwgdTY0IHNpemUsIHVuc2lnbmVkIGludCBmbGFncywKKwkJc3RydWN0IHJlc291cmNlICpyKTsKKworCiAvKiBEZWJ1ZyB1dGlsaXR5ICovCiAjaWZkZWYgREVCVUcKIHN0YXRpYyB2b2lkIG9mX2R1bXBfYWRkcihjb25zdCBjaGFyICpzLCBjb25zdCB1MzIgKmFkZHIsIGludCBuYSkKQEAgLTEwMSw2ICsxMDcsNyBAQAogfQogCiAKKyNpZmRlZiBDT05GSUdfUENJCiAvKgogICogUENJIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9yCiAgKi8KQEAgLTE1MywxNSArMTYwLDE1NiBAQAogCXN3aXRjaCgodyA+PiAyNCkgJiAweDAzKSB7CiAJY2FzZSAweDAxOgogCQlmbGFncyB8PSBJT1JFU09VUkNFX0lPOworCQlicmVhazsKIAljYXNlIDB4MDI6IC8qIDMyIGJpdHMgKi8KIAljYXNlIDB4MDM6IC8qIDY0IGJpdHMgKi8KIAkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU07CisJCWJyZWFrOwogCX0KIAlpZiAodyAmIDB4NDAwMDAwMDApCiAJCWZsYWdzIHw9IElPUkVTT1VSQ0VfUFJFRkVUQ0g7CiAJcmV0dXJuIGZsYWdzOwogfQogCitjb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywgdTY0ICpzaXplLAorCQkJdW5zaWduZWQgaW50ICpmbGFncykKK3sKKwljb25zdCB1MzIgKnByb3A7CisJdW5zaWduZWQgaW50IHBzaXplOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OworCXN0cnVjdCBvZl9idXMgKmJ1czsKKwlpbnQgb25lc2l6ZSwgaSwgbmEsIG5zOworCisJLyogR2V0IHBhcmVudCAmIG1hdGNoIGJ1cyB0eXBlICovCisJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChkZXYpOworCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYnVzID0gb2ZfbWF0Y2hfYnVzKHBhcmVudCk7CisJaWYgKHN0cmNtcChidXMtPm5hbWUsICJwY2kiKSkgeworCQlvZl9ub2RlX3B1dChwYXJlbnQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVzLT5jb3VudF9jZWxscyhkZXYsICZuYSwgJm5zKTsKKwlvZl9ub2RlX3B1dChwYXJlbnQpOworCWlmICghT0ZfQ0hFQ0tfQ09VTlRTKG5hLCBucykpCisJCXJldHVybiBOVUxMOworCisJLyogR2V0ICJyZWciIG9yICJhc3NpZ25lZC1hZGRyZXNzZXMiIHByb3BlcnR5ICovCisJcHJvcCA9IGdldF9wcm9wZXJ0eShkZXYsIGJ1cy0+YWRkcmVzc2VzLCAmcHNpemUpOworCWlmIChwcm9wID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXBzaXplIC89IDQ7CisKKwlvbmVzaXplID0gbmEgKyBuczsKKwlmb3IgKGkgPSAwOyBwc2l6ZSA+PSBvbmVzaXplOyBwc2l6ZSAtPSBvbmVzaXplLCBwcm9wICs9IG9uZXNpemUsIGkrKykKKwkJaWYgKChwcm9wWzBdICYgMHhmZikgPT0gKChiYXJfbm8gKiA0KSArIFBDSV9CQVNFX0FERFJFU1NfMCkpIHsKKwkJCWlmIChzaXplKQorCQkJCSpzaXplID0gb2ZfcmVhZF9udW1iZXIocHJvcCArIG5hLCBucyk7CisJCQlpZiAoZmxhZ3MpCisJCQkJKmZsYWdzID0gYnVzLT5nZXRfZmxhZ3MocHJvcCk7CisJCQlyZXR1cm4gcHJvcDsKKwkJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvZl9nZXRfcGNpX2FkZHJlc3MpOworCitpbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCisJCQkgICAgICAgc3RydWN0IHJlc291cmNlICpyKQoreworCWNvbnN0IHUzMgkqYWRkcnA7CisJdTY0CQlzaXplOworCXVuc2lnbmVkIGludAlmbGFnczsKKworCWFkZHJwID0gb2ZfZ2V0X3BjaV9hZGRyZXNzKGRldiwgYmFyLCAmc2l6ZSwgJmZsYWdzKTsKKwlpZiAoYWRkcnAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIGFkZHJwLCBzaXplLCBmbGFncywgcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZSk7CisKK3N0YXRpYyB1OCBvZl9pcnFfcGNpX3N3aXp6bGUodTggc2xvdCwgdTggcGluKQoreworCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOworfQorCitpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBwbm9kZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcHBkZXY7CisJdTMyIGxzcGVjOworCXUzMiBsYWRkclszXTsKKwl1OCBwaW47CisJaW50IHJjOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIGRldmljZSBub2RlLCBpZiB5ZXMsIGZhbGxiYWNrIHRvIHN0YW5kYXJkIE9GCisJICogcGFyc2luZworCSAqLworCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworCWlmIChkbikKKwkJcmV0dXJuIG9mX2lycV9tYXBfb25lKGRuLCAwLCBvdXRfaXJxKTsKKworCS8qIE9rLCB3ZSBkb24ndCwgdGltZSB0byBoYXZlIGZ1bi4gTGV0J3Mgc3RhcnQgYnkgYnVpbGRpbmcgdXAgYW4KKwkgKiBpbnRlcnJ1cHQgc3BlYy4gIHdlIGFzc3VtZSAjaW50ZXJydXB0LWNlbGxzIGlzIDEsIHdoaWNoIGlzIHN0YW5kYXJkCisJICogZm9yIFBDSS4gSWYgeW91IGRvIGRpZmZlcmVudCwgdGhlbiBkb24ndCB1c2UgdGhhdCByb3V0aW5lLgorCSAqLworCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CisJLyogTm8gcGluLCBleGl0ICovCisJaWYgKHBpbiA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIE5vdyB3ZSB3YWxrIHVwIHRoZSBQQ0kgdHJlZSAqLworCWxzcGVjID0gcGluOworCWZvciAoOzspIHsKKwkJLyogR2V0IHRoZSBwY2lfZGV2IG9mIG91ciBwYXJlbnQgKi8KKwkJcHBkZXYgPSBwZGV2LT5idXMtPnNlbGY7CisKKwkJLyogT3VjaCwgaXQncyBhIGhvc3QgYnJpZGdlLi4uICovCisJCWlmIChwcGRldiA9PSBOVUxMKSB7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJCQlwcG5vZGUgPSBwY2lfYnVzX3RvX09GX25vZGUocGRldi0+YnVzKTsKKyNlbHNlCisJCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc3Q7CisJCQlob3N0ID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7CisJCQlwcG5vZGUgPSBob3N0ID8gaG9zdC0+YXJjaF9kYXRhIDogTlVMTDsKKyNlbmRpZgorCQkJLyogTm8gbm9kZSBmb3IgaG9zdCBicmlkZ2UgPyBnaXZlIHVwICovCisJCQlpZiAocHBub2RlID09IE5VTEwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZQorCQkJLyogV2UgZm91bmQgYSBQMlAgYnJpZGdlLCBjaGVjayBpZiBpdCBoYXMgYSBub2RlICovCisJCQlwcG5vZGUgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocHBkZXYpOworCisJCS8qIE9rLCB3ZSBoYXZlIGZvdW5kIGEgcGFyZW50IHdpdGggYSBkZXZpY2Utbm9kZSwgaGFuZCBvdmVyIHRvCisJCSAqIHRoZSBPRiBwYXJzaW5nIGNvZGUuCisJCSAqIFdlIGJ1aWxkIGEgdW5pdCBhZGRyZXNzIGZyb20gdGhlIGxpbnV4IGRldmljZSB0byBiZSB1c2VkIGZvcgorCQkgKiByZXNvbHV0aW9uLiBOb3RlIHRoYXQgd2UgdXNlIHRoZSBsaW51eCBidXMgbnVtYmVyIHdoaWNoIG1heQorCQkgKiBub3QgbWF0Y2ggeW91ciBmaXJtd2FyZSBidXMgbnVtYmVyaW5nLgorCQkgKiBGb3J0dW5hdGVseSwgaW4gbW9zdCBjYXNlcywgaW50ZXJydXB0LW1hcC1tYXNrIGRvZXNuJ3QgaW5jbHVkZQorCQkgKiB0aGUgYnVzIG51bWJlciBhcyBwYXJ0IG9mIHRoZSBtYXRjaGluZy4KKwkJICogWW91IHNob3VsZCBzdGlsbCBiZSBjYXJlZnVsIGFib3V0IHRoYXQgdGhvdWdoIGlmIHlvdSBpbnRlbmQKKwkJICogdG8gcmVseSBvbiB0aGlzIGZ1bmN0aW9uICh5b3Ugc2hpcCAgYSBmaXJtd2FyZSB0aGF0IGRvZXNuJ3QKKwkJICogY3JlYXRlIGRldmljZSBub2RlcyBmb3IgYWxsIFBDSSBkZXZpY2VzKS4KKwkJICovCisJCWlmIChwcG5vZGUpCisJCQlicmVhazsKKworCQkvKiBXZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSBoaXQgYSBQMlAgYnJpZGdlIHdpdGggbm8gbm9kZSwKKwkJICogbGV0J3MgZG8gc3RhbmRhcmQgc3dpenpsaW5nIGFuZCB0cnkgYWdhaW4KKwkJICovCisJCWxzcGVjID0gb2ZfaXJxX3BjaV9zd2l6emxlKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgbHNwZWMpOworCQlwZGV2ID0gcHBkZXY7CisJfQorCisJbGFkZHJbMF0gPSAocGRldi0+YnVzLT5udW1iZXIgPDwgMTYpCisJCXwgKHBkZXYtPmRldmZuIDw8IDgpOworCWxhZGRyWzFdICA9IGxhZGRyWzJdID0gMDsKKwlyZXR1cm4gb2ZfaXJxX21hcF9yYXcocHBub2RlLCAmbHNwZWMsIDEsIGxhZGRyLCBvdXRfaXJxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2lycV9tYXBfcGNpKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKIC8qCiAgKiBJU0EgYnVzIHNwZWNpZmljIHRyYW5zbGF0b3IKICAqLwpAQCAtMjIzLDYgKzM3MSw3IEBACiAgKi8KIAogc3RhdGljIHN0cnVjdCBvZl9idXMgb2ZfYnVzc2VzW10gPSB7CisjaWZkZWYgQ09ORklHX1BDSQogCS8qIFBDSSAqLwogCXsKIAkJLm5hbWUgPSAicGNpIiwKQEAgLTIzMyw2ICszODIsNyBAQAogCQkudHJhbnNsYXRlID0gb2ZfYnVzX3BjaV90cmFuc2xhdGUsCiAJCS5nZXRfZmxhZ3MgPSBvZl9idXNfcGNpX2dldF9mbGFncywKIAl9LAorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAkvKiBJU0EgKi8KIAl7CiAJCS5uYW1lID0gImlzYSIsCkBAIC00NDUsNDggKzU5NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2dldF9hZGRyZXNzKTsKIAotY29uc3QgdTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXJfbm8sIHU2NCAqc2l6ZSwKLQkJCXVuc2lnbmVkIGludCAqZmxhZ3MpCi17Ci0JY29uc3QgdTMyICpwcm9wOwotCXVuc2lnbmVkIGludCBwc2l6ZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudDsKLQlzdHJ1Y3Qgb2ZfYnVzICpidXM7Ci0JaW50IG9uZXNpemUsIGksIG5hLCBuczsKLQotCS8qIEdldCBwYXJlbnQgJiBtYXRjaCBidXMgdHlwZSAqLwotCXBhcmVudCA9IG9mX2dldF9wYXJlbnQoZGV2KTsKLQlpZiAocGFyZW50ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWJ1cyA9IG9mX21hdGNoX2J1cyhwYXJlbnQpOwotCWlmIChzdHJjbXAoYnVzLT5uYW1lLCAicGNpIikpIHsKLQkJb2Zfbm9kZV9wdXQocGFyZW50KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ1cy0+Y291bnRfY2VsbHMoZGV2LCAmbmEsICZucyk7Ci0Jb2Zfbm9kZV9wdXQocGFyZW50KTsKLQlpZiAoIU9GX0NIRUNLX0NPVU5UUyhuYSwgbnMpKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIEdldCAicmVnIiBvciAiYXNzaWduZWQtYWRkcmVzc2VzIiBwcm9wZXJ0eSAqLwotCXByb3AgPSBnZXRfcHJvcGVydHkoZGV2LCBidXMtPmFkZHJlc3NlcywgJnBzaXplKTsKLQlpZiAocHJvcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwc2l6ZSAvPSA0OwotCi0Jb25lc2l6ZSA9IG5hICsgbnM7Ci0JZm9yIChpID0gMDsgcHNpemUgPj0gb25lc2l6ZTsgcHNpemUgLT0gb25lc2l6ZSwgcHJvcCArPSBvbmVzaXplLCBpKyspCi0JCWlmICgocHJvcFswXSAmIDB4ZmYpID09ICgoYmFyX25vICogNCkgKyBQQ0lfQkFTRV9BRERSRVNTXzApKSB7Ci0JCQlpZiAoc2l6ZSkKLQkJCQkqc2l6ZSA9IG9mX3JlYWRfbnVtYmVyKHByb3AgKyBuYSwgbnMpOwotCQkJaWYgKGZsYWdzKQotCQkJCSpmbGFncyA9IGJ1cy0+Z2V0X2ZsYWdzKHByb3ApOwotCQkJcmV0dXJuIHByb3A7Ci0JCX0KLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZ2V0X3BjaV9hZGRyZXNzKTsKLQogc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqYWRkcnAsCiAJCQkJICAgIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJICAgIHN0cnVjdCByZXNvdXJjZSAqcikKQEAgLTUyOSwyMCArNjM3LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UpOwogCi1pbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCi0JCQkgICAgICAgc3RydWN0IHJlc291cmNlICpyKQotewotCWNvbnN0IHUzMgkqYWRkcnA7Ci0JdTY0CQlzaXplOwotCXVuc2lnbmVkIGludAlmbGFnczsKLQotCWFkZHJwID0gb2ZfZ2V0X3BjaV9hZGRyZXNzKGRldiwgYmFyLCAmc2l6ZSwgJmZsYWdzKTsKLQlpZiAoYWRkcnAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIGFkZHJwLCBzaXplLCBmbGFncywgcik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZSk7Ci0KIHZvaWQgb2ZfcGFyc2VfZG1hX3dpbmRvdyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCBjb25zdCB2b2lkICpkbWFfd2luZG93X3Byb3AsCiAJCXVuc2lnbmVkIGxvbmcgKmJ1c25vLCB1bnNpZ25lZCBsb25nICpwaHlzLCB1bnNpZ25lZCBsb25nICpzaXplKQogewpAQCAtODk4LDg3ICs5OTIsMyBAQAogCXJldHVybiByZXM7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9pcnFfbWFwX29uZSk7Ci0KLSNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgdTggb2ZfaXJxX3BjaV9zd2l6emxlKHU4IHNsb3QsIHU4IHBpbikKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQotaW50IG9mX2lycV9tYXBfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgb2ZfaXJxICpvdXRfaXJxKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sICpwcG5vZGU7Ci0Jc3RydWN0IHBjaV9kZXYgKnBwZGV2OwotCXUzMiBsc3BlYzsKLQl1MzIgbGFkZHJbM107Ci0JdTggcGluOwotCWludCByYzsKLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBkZXZpY2Ugbm9kZSwgaWYgeWVzLCBmYWxsYmFjayB0byBzdGFuZGFyZCBPRgotCSAqIHBhcnNpbmcKLQkgKi8KLQlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKLQlpZiAoZG4pCi0JCXJldHVybiBvZl9pcnFfbWFwX29uZShkbiwgMCwgb3V0X2lycSk7Ci0KLQkvKiBPaywgd2UgZG9uJ3QsIHRpbWUgdG8gaGF2ZSBmdW4uIExldCdzIHN0YXJ0IGJ5IGJ1aWxkaW5nIHVwIGFuCi0JICogaW50ZXJydXB0IHNwZWMuICB3ZSBhc3N1bWUgI2ludGVycnVwdC1jZWxscyBpcyAxLCB3aGljaCBpcyBzdGFuZGFyZAotCSAqIGZvciBQQ0kuIElmIHlvdSBkbyBkaWZmZXJlbnQsIHRoZW4gZG9uJ3QgdXNlIHRoYXQgcm91dGluZS4KLQkgKi8KLQlyYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIHJjOwotCS8qIE5vIHBpbiwgZXhpdCAqLwotCWlmIChwaW4gPT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBOb3cgd2Ugd2FsayB1cCB0aGUgUENJIHRyZWUgKi8KLQlsc3BlYyA9IHBpbjsKLQlmb3IgKDs7KSB7Ci0JCS8qIEdldCB0aGUgcGNpX2RldiBvZiBvdXIgcGFyZW50ICovCi0JCXBwZGV2ID0gcGRldi0+YnVzLT5zZWxmOwotCi0JCS8qIE91Y2gsIGl0J3MgYSBob3N0IGJyaWRnZS4uLiAqLwotCQlpZiAocHBkZXYgPT0gTlVMTCkgewotI2lmZGVmIENPTkZJR19QUEM2NAotCQkJcHBub2RlID0gcGNpX2J1c190b19PRl9ub2RlKHBkZXYtPmJ1cyk7Ci0jZWxzZQotCQkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3N0OwotCQkJaG9zdCA9IHBjaV9idXNfdG9faG9zdChwZGV2LT5idXMpOwotCQkJcHBub2RlID0gaG9zdCA/IGhvc3QtPmFyY2hfZGF0YSA6IE5VTEw7Ci0jZW5kaWYKLQkJCS8qIE5vIG5vZGUgZm9yIGhvc3QgYnJpZGdlID8gZ2l2ZSB1cCAqLwotCQkJaWYgKHBwbm9kZSA9PSBOVUxMKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9IGVsc2UKLQkJCS8qIFdlIGZvdW5kIGEgUDJQIGJyaWRnZSwgY2hlY2sgaWYgaXQgaGFzIGEgbm9kZSAqLwotCQkJcHBub2RlID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBwZGV2KTsKLQotCQkvKiBPaywgd2UgaGF2ZSBmb3VuZCBhIHBhcmVudCB3aXRoIGEgZGV2aWNlLW5vZGUsIGhhbmQgb3ZlciB0bwotCQkgKiB0aGUgT0YgcGFyc2luZyBjb2RlLgotCQkgKiBXZSBidWlsZCBhIHVuaXQgYWRkcmVzcyBmcm9tIHRoZSBsaW51eCBkZXZpY2UgdG8gYmUgdXNlZCBmb3IKLQkJICogcmVzb2x1dGlvbi4gTm90ZSB0aGF0IHdlIHVzZSB0aGUgbGludXggYnVzIG51bWJlciB3aGljaCBtYXkKLQkJICogbm90IG1hdGNoIHlvdXIgZmlybXdhcmUgYnVzIG51bWJlcmluZy4KLQkJICogRm9ydHVuYXRlbHksIGluIG1vc3QgY2FzZXMsIGludGVycnVwdC1tYXAtbWFzayBkb2Vzbid0IGluY2x1ZGUKLQkJICogdGhlIGJ1cyBudW1iZXIgYXMgcGFydCBvZiB0aGUgbWF0Y2hpbmcuCi0JCSAqIFlvdSBzaG91bGQgc3RpbGwgYmUgY2FyZWZ1bCBhYm91dCB0aGF0IHRob3VnaCBpZiB5b3UgaW50ZW5kCi0JCSAqIHRvIHJlbHkgb24gdGhpcyBmdW5jdGlvbiAoeW91IHNoaXAgIGEgZmlybXdhcmUgdGhhdCBkb2Vzbid0Ci0JCSAqIGNyZWF0ZSBkZXZpY2Ugbm9kZXMgZm9yIGFsbCBQQ0kgZGV2aWNlcykuCi0JCSAqLwotCQlpZiAocHBub2RlKQotCQkJYnJlYWs7Ci0KLQkJLyogV2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgd2UgaGl0IGEgUDJQIGJyaWRnZSB3aXRoIG5vIG5vZGUsCi0JCSAqIGxldCdzIGRvIHN0YW5kYXJkIHN3aXp6bGluZyBhbmQgdHJ5IGFnYWluCi0JCSAqLwotCQlsc3BlYyA9IG9mX2lycV9wY2lfc3dpenpsZShQQ0lfU0xPVChwZGV2LT5kZXZmbiksIGxzcGVjKTsKLQkJcGRldiA9IHBwZGV2OwotCX0KLQotCWxhZGRyWzBdID0gKHBkZXYtPmJ1cy0+bnVtYmVyIDw8IDE2KQotCQl8IChwZGV2LT5kZXZmbiA8PCA4KTsKLQlsYWRkclsxXSAgPSBsYWRkclsyXSA9IDA7Ci0JcmV0dXJuIG9mX2lycV9tYXBfcmF3KHBwbm9kZSwgJmxzcGVjLCAxLCBsYWRkciwgb3V0X2lycSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9pcnFfbWFwX3BjaSk7Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwppbmRleCA2ZWY4MGQ0Li43NmI1ZDdlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwpAQCAtMzAzLDYgKzMwMywxMiBAQAogfQogRVhQT1JUX1NZTUJPTChydGFzX3Rva2VuKTsKIAoraW50IHJ0YXNfc2VydmljZV9wcmVzZW50KGNvbnN0IGNoYXIgKnNlcnZpY2UpCit7CisJcmV0dXJuIHJ0YXNfdG9rZW4oc2VydmljZSkgIT0gUlRBU19VTktOT1dOX1NFUlZJQ0U7Cit9CitFWFBPUlRfU1lNQk9MKHJ0YXNfc2VydmljZV9wcmVzZW50KTsKKwogI2lmZGVmIENPTkZJR19SVEFTX0VSUk9SX0xPR0dJTkcKIC8qCiAgKiBSZXR1cm4gdGhlIGZpcm13YXJlLXNwZWNpZmllZCBzaXplIG9mIHRoZSBlcnJvciBsb2cgYnVmZmVyCkBAIC04MTAsMzEgKzgxNiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgdmVyc2lvbiBjYW4ndCB0YWtlIHRoZSBzcGlubG9jaywgYmVjYXVzZSBpdCBuZXZlciByZXR1cm5zICovCi0KLXN0cnVjdCBydGFzX2FyZ3MgcnRhc19zdG9wX3NlbGZfYXJncyA9IHsKLQkvKiBUaGUgdG9rZW4gaXMgaW5pdGlhbGl6ZWQgZm9yIHJlYWwgaW4gc2V0dXBfc3lzdGVtKCkgKi8KLQkudG9rZW4gPSBSVEFTX1VOS05PV05fU0VSVklDRSwKLQkubmFyZ3MgPSAwLAotCS5ucmV0ID0gMSwKLQkucmV0cyA9ICZydGFzX3N0b3Bfc2VsZl9hcmdzLmFyZ3NbMF0sCi19OwotCi12b2lkIHJ0YXNfc3RvcF9zZWxmKHZvaWQpCi17Ci0Jc3RydWN0IHJ0YXNfYXJncyAqcnRhc19hcmdzID0gJnJ0YXNfc3RvcF9zZWxmX2FyZ3M7Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0JQlVHX09OKHJ0YXNfYXJncy0+dG9rZW4gPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpOwotCi0JcHJpbnRrKCJjcHUgJXUgKGh3aWQgJXUpIFJlYWR5IHRvIGRpZS4uLlxuIiwKLQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JZW50ZXJfcnRhcyhfX3BhKHJ0YXNfYXJncykpOwotCi0JcGFuaWMoIkFsYXMsIEkgc3Vydml2ZWQuXG4iKTsKLX0KLQogLyoKICAqIENhbGwgZWFybHkgZHVyaW5nIGJvb3QsIGJlZm9yZSBtZW0gaW5pdCBvciBib290bWVtLCB0byByZXRyaWV2ZSB0aGUgUlRBUwogICogaW5mb3JtYXRpb25zIGZyb20gdGhlIGRldmljZS10cmVlIGFuZCBhbGxvY2F0ZSB0aGUgUk1PIGJ1ZmZlciBmb3IgdXNlcmxhbmQKQEAgLTg3OSw5ICs4NjAsNiBAQAogI2VuZGlmCiAJcnRhc19ybW9fYnVmID0gbG1iX2FsbG9jX2Jhc2UoUlRBU19STU9CVUZfTUFYLCBQQUdFX1NJWkUsIHJ0YXNfcmVnaW9uKTsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXJ0YXNfc3RvcF9zZWxmX2FyZ3MudG9rZW4gPSBydGFzX3Rva2VuKCJzdG9wLXNlbGYiKTsKLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KICNpZmRlZiBDT05GSUdfUlRBU19FUlJPUl9MT0dHSU5HCiAJcnRhc19sYXN0X2Vycm9yX3Rva2VuID0gcnRhc190b2tlbigicnRhcy1sYXN0LWVycm9yIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKaW5kZXggMTQ0MmI2My4uMGM0ZmNkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKQEAgLTcyLDYgKzcyLDEwIEBACiAjZGVmaW5lIFZBTElEQVRFX0JVRl9TSVpFIDQwOTYgICAgCiAjZGVmaW5lIFJUQVNfTVNHX01BWExFTiAgIDY0CiAKKy8qIFF1aXJrIC0gUlRBUyByZXF1aXJlcyA0ayBsaXN0IGxlbmd0aCBhbmQgYmxvY2sgc2l6ZSAqLworI2RlZmluZSBSVEFTX0JMS0xJU1RfTEVOR1RIIDQwOTYKKyNkZWZpbmUgUlRBU19CTEtfU0laRSA0MDk2CisKIHN0cnVjdCBmbGFzaF9ibG9jayB7CiAJY2hhciAqZGF0YTsKIAl1bnNpZ25lZCBsb25nIGxlbmd0aDsKQEAgLTgzLDcgKzg3LDcgQEAKICAqIGludG8gYSB2ZXJzaW9uL2xlbmd0aCBhbmQgdHJhbnNsYXRlIHRoZSBwb2ludGVycwogICogdG8gYWJzb2x1dGUuCiAgKi8KLSNkZWZpbmUgRkxBU0hfQkxPQ0tTX1BFUl9OT0RFICgoUEFHRV9TSVpFIC0gMTYpIC8gc2l6ZW9mKHN0cnVjdCBmbGFzaF9ibG9jaykpCisjZGVmaW5lIEZMQVNIX0JMT0NLU19QRVJfTk9ERSAoKFJUQVNfQkxLTElTVF9MRU5HVEggLSAxNikgLyBzaXplb2Yoc3RydWN0IGZsYXNoX2Jsb2NrKSkKIHN0cnVjdCBmbGFzaF9ibG9ja19saXN0IHsKIAl1bnNpZ25lZCBsb25nIG51bV9ibG9ja3M7CiAJc3RydWN0IGZsYXNoX2Jsb2NrX2xpc3QgKm5leHQ7CkBAIC05Niw2ICsxMDAsOSBAQAogCiBzdGF0aWMgc3RydWN0IGZsYXNoX2Jsb2NrX2xpc3RfaGVhZGVyIHJ0YXNfZmlybXdhcmVfZmxhc2hfbGlzdCA9IHswLCBOVUxMfTsKIAorLyogVXNlIHNsYWIgY2FjaGUgdG8gZ3VhcmFudGVlIDRrIGFsaWdubWVudCAqLworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmbGFzaF9ibG9ja19jYWNoZSA9IE5VTEw7CisKICNkZWZpbmUgRkxBU0hfQkxPQ0tfTElTVF9WRVJTSU9OICgxVUwpCiAKIC8qIExvY2FsIGNvcHkgb2YgdGhlIGZsYXNoIGJsb2NrIGxpc3QuCkBAIC0xNTMsNyArMTYwLDcgQEAKIAkJCQlyZXR1cm4gRkxBU0hfSU1HX05VTExfREFUQTsKIAkJCX0KIAkJCWJsb2NrX3NpemUgPSBmLT5ibG9ja3NbaV0ubGVuZ3RoOwotCQkJaWYgKGJsb2NrX3NpemUgPD0gMCB8fCBibG9ja19zaXplID4gUEFHRV9TSVpFKSB7CisJCQlpZiAoYmxvY2tfc2l6ZSA8PSAwIHx8IGJsb2NrX3NpemUgPiBSVEFTX0JMS19TSVpFKSB7CiAJCQkJcmV0dXJuIEZMQVNIX0lNR19CQURfTEVOOwogCQkJfQogCQkJaW1hZ2Vfc2l6ZSArPSBibG9ja19zaXplOwpAQCAtMTc3LDE2ICsxODQsMTYgQEAKIAogCXdoaWxlIChmKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBmLT5udW1fYmxvY2tzOyBpKyspCi0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKGYtPmJsb2Nrc1tpXS5kYXRhKSk7CisJCQlrbWVtX2NhY2hlX2ZyZWUoZmxhc2hfYmxvY2tfY2FjaGUsIGYtPmJsb2Nrc1tpXS5kYXRhKTsKIAkJbmV4dCA9IGYtPm5leHQ7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylmKTsKKwkJa21lbV9jYWNoZV9mcmVlKGZsYXNoX2Jsb2NrX2NhY2hlLCBmKTsKIAkJZiA9IG5leHQ7CiAJfQogfQogCiBzdGF0aWMgaW50IHJ0YXNfZmxhc2hfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBydGFzX3VwZGF0ZV9mbGFzaF90ICp1ZjsKIAkKIAl1ZiA9IChzdHJ1Y3QgcnRhc191cGRhdGVfZmxhc2hfdCAqKSBkcC0+ZGF0YTsKQEAgLTI0OCw3ICsyNTUsNyBAQAogc3RhdGljIHNzaXplX3QgcnRhc19mbGFzaF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IHJ0YXNfdXBkYXRlX2ZsYXNoX3QgKnVmOwogCWNoYXIgbXNnW1JUQVNfTVNHX01BWExFTl07CiAJaW50IG1zZ2xlbjsKQEAgLTI3OCw2ICsyODUsMTIgQEAKIAlyZXR1cm4gbXNnbGVuOwogfQogCisvKiBjb25zdHJ1Y3RvciBmb3IgZmxhc2hfYmxvY2tfY2FjaGUgKi8KK3ZvaWQgcnRhc19ibG9ja19jdG9yKHZvaWQgKnB0ciwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCW1lbXNldChwdHIsIDAsIFJUQVNfQkxLX1NJWkUpOworfQorCiAvKiBXZSBjb3VsZCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IGhlcmUuICBCdXQgdG8ga2VlcCB0aGlzIGZ1bmN0aW9uCiAgKiBzaW1wbGUgd2UgYWxsb2NhdGUgYSBwYWdlIHRvIHRoZSBibG9jayBsaXN0IG5vIG1hdHRlciBob3cgc21hbGwgdGhlCiAgKiBjb3VudCBpcy4gIElmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeSBpdCB3aWxsIGJlIGp1c3QgYXMgd2VsbApAQCAtMjg2LDcgKzI5OSw3IEBACiBzdGF0aWMgc3NpemVfdCBydGFzX2ZsYXNoX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgcnRhc191cGRhdGVfZmxhc2hfdCAqdWY7CiAJY2hhciAqcDsKIAlpbnQgbmV4dF9mcmVlOwpAQCAtMzAyLDcgKzMxNSw3IEBACiAJICogcHJvYyBmaWxlCiAJICovCiAJaWYgKHVmLT5mbGlzdCA9PSBOVUxMKSB7Ci0JCXVmLT5mbGlzdCA9IChzdHJ1Y3QgZmxhc2hfYmxvY2tfbGlzdCAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCXVmLT5mbGlzdCA9IGttZW1fY2FjaGVfYWxsb2MoZmxhc2hfYmxvY2tfY2FjaGUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVmLT5mbGlzdCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTMxMywyMSArMzI2LDIxIEBACiAJbmV4dF9mcmVlID0gZmwtPm51bV9ibG9ja3M7CiAJaWYgKG5leHRfZnJlZSA9PSBGTEFTSF9CTE9DS1NfUEVSX05PREUpIHsKIAkJLyogTmVlZCB0byBhbGxvY2F0ZSBhbm90aGVyIGJsb2NrX2xpc3QgKi8KLQkJZmwtPm5leHQgPSAoc3RydWN0IGZsYXNoX2Jsb2NrX2xpc3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWZsLT5uZXh0ID0ga21lbV9jYWNoZV9hbGxvYyhmbGFzaF9ibG9ja19jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZmwtPm5leHQpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJZmwgPSBmbC0+bmV4dDsKIAkJbmV4dF9mcmVlID0gMDsKIAl9CiAKLQlpZiAoY291bnQgPiBQQUdFX1NJWkUpCi0JCWNvdW50ID0gUEFHRV9TSVpFOwotCXAgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoY291bnQgPiBSVEFTX0JMS19TSVpFKQorCQljb3VudCA9IFJUQVNfQkxLX1NJWkU7CisJcCA9IGttZW1fY2FjaGVfYWxsb2MoZmxhc2hfYmxvY2tfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJCiAJaWYoY29weV9mcm9tX3VzZXIocCwgYnVmZmVyLCBjb3VudCkpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXApOworCQlrbWVtX2NhY2hlX2ZyZWUoZmxhc2hfYmxvY2tfY2FjaGUsIHApOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJZmwtPmJsb2Nrc1tuZXh0X2ZyZWVdLmRhdGEgPSBwOwpAQCAtMzc4LDcgKzM5MSw3IEBACiBzdGF0aWMgc3NpemVfdCBtYW5hZ2VfZmxhc2hfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBydGFzX21hbmFnZV9mbGFzaF90ICphcmdzX2J1ZjsKIAljaGFyIG1zZ1tSVEFTX01TR19NQVhMRU5dOwogCWludCBtc2dsZW47CkBAIC00MDgsNyArNDIxLDcgQEAKIHN0YXRpYyBzc2l6ZV90IG1hbmFnZV9mbGFzaF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IHJ0YXNfbWFuYWdlX2ZsYXNoX3QgKmFyZ3NfYnVmOwogCWNvbnN0IGNoYXIgcmVqZWN0X3N0cltdID0gIjAiOwogCWNvbnN0IGNoYXIgY29tbWl0X3N0cltdID0gIjEiOwpAQCAtNDc5LDcgKzQ5Miw3IEBACiBzdGF0aWMgc3NpemVfdCB2YWxpZGF0ZV9mbGFzaF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IHJ0YXNfdmFsaWRhdGVfZmxhc2hfdCAqYXJnc19idWY7CiAJY2hhciBtc2dbUlRBU19NU0dfTUFYTEVOXTsKIAlpbnQgbXNnbGVuOwpAQCAtNTA3LDcgKzUyMCw3IEBACiBzdGF0aWMgc3NpemVfdCB2YWxpZGF0ZV9mbGFzaF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBydGFzX3ZhbGlkYXRlX2ZsYXNoX3QgKmFyZ3NfYnVmOwogCWludCByYzsKIApAQCAtNTU2LDcgKzU2OSw3IEBACiAKIHN0YXRpYyBpbnQgdmFsaWRhdGVfZmxhc2hfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBydGFzX3ZhbGlkYXRlX2ZsYXNoX3QgKmFyZ3NfYnVmOwogCiAJYXJnc19idWYgPSAoc3RydWN0IHJ0YXNfdmFsaWRhdGVfZmxhc2hfdCAqKSBkcC0+ZGF0YTsKQEAgLTY2OCwxNCArNjgxLDEyIEBACiAJaW50ICpzdGF0dXM7CiAJaW50IHRva2VuOwogCi0JZHAtPmRhdGEgPSBrbWFsbG9jKGJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlkcC0+ZGF0YSA9IGt6YWxsb2MoYnVmX3NpemUsIEdGUF9LRVJORUwpOwogCWlmIChkcC0+ZGF0YSA9PSBOVUxMKSB7CiAJCXJlbW92ZV9mbGFzaF9wZGUoZHApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltZW1zZXQoZHAtPmRhdGEsIDAsIGJ1Zl9zaXplKTsKLQogCS8qCiAJICogVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3RhdHVzIGludCBpcyB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZQogCSAqIHN0cnVjdCAKQEAgLTc5MSw2ICs4MDIsMTYgQEAKIAkJZ290byBjbGVhbnVwOwogCiAJcnRhc19mbGFzaF90ZXJtX2hvb2sgPSBydGFzX2ZsYXNoX2Zpcm13YXJlOworCisJZmxhc2hfYmxvY2tfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicnRhc19mbGFzaF9jYWNoZSIsCisJCQkJUlRBU19CTEtfU0laRSwgUlRBU19CTEtfU0laRSwgMCwKKwkJCQlydGFzX2Jsb2NrX2N0b3IsIE5VTEwpOworCWlmICghZmxhc2hfYmxvY2tfY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGNyZWF0ZSBibG9jayBjYWNoZVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CiAJcmV0dXJuIDA7CiAKIGNsZWFudXA6CkBAIC04MDUsNiArODI2LDEwIEBACiB2b2lkIF9fZXhpdCBydGFzX2ZsYXNoX2NsZWFudXAodm9pZCkKIHsKIAlydGFzX2ZsYXNoX3Rlcm1faG9vayA9IE5VTEw7CisKKwlpZiAoZmxhc2hfYmxvY2tfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShmbGFzaF9ibG9ja19jYWNoZSk7CisKIAlyZW1vdmVfZmxhc2hfcGRlKGZpcm13YXJlX2ZsYXNoX3BkZSk7CiAJcmVtb3ZlX2ZsYXNoX3BkZShmaXJtd2FyZV91cGRhdGVfcGRlKTsKIAlyZW1vdmVfZmxhc2hfcGRlKHZhbGlkYXRlX3BkZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKaW5kZXggYjRhMGRlNy4uYWNlOWY0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAjaW5jbHVkZSA8YXNtL21waWMuaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgorI2luY2x1ZGUgPGFzbS9lZWguaD4KIAogLyogUlRBUyB0b2tlbnMgKi8KIHN0YXRpYyBpbnQgcmVhZF9wY2lfY29uZmlnOwpAQCAtMjMxLDMyICsyMzIsMTMgQEAKIAogdW5zaWduZWQgbG9uZyBfX2RldmluaXQgZ2V0X3BoYl9idWlkIChzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoYikKIHsKLQlpbnQgYWRkcl9jZWxsczsKLQljb25zdCB1bnNpZ25lZCBpbnQgKmJ1aWRfdmFsczsKLQl1bnNpZ25lZCBpbnQgbGVuOwotCXVuc2lnbmVkIGxvbmcgYnVpZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAotCWlmIChpYm1fcmVhZF9wY2lfY29uZmlnID09IC0xKSByZXR1cm4gMDsKLQotCS8qIFBIQidzIHdpbGwgYWx3YXlzIGJlIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUsCi0JICogb3Igc28gaXQgaXMgcHJvbWlzZWQgYnkgdGhlIGN1cnJlbnQgZmlybXdhcmUuICovCi0JaWYgKHBoYi0+cGFyZW50ID09IE5VTEwpCisJaWYgKGlibV9yZWFkX3BjaV9jb25maWcgPT0gLTEpCiAJCXJldHVybiAwOwotCWlmIChwaGItPnBhcmVudC0+cGFyZW50KQorCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHBoYiwgMCwgJnIpKQogCQlyZXR1cm4gMDsKLQotCWJ1aWRfdmFscyA9IGdldF9wcm9wZXJ0eShwaGIsICJyZWciLCAmbGVuKTsKLQlpZiAoYnVpZF92YWxzID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JYWRkcl9jZWxscyA9IHByb21fbl9hZGRyX2NlbGxzKHBoYik7Ci0JaWYgKGFkZHJfY2VsbHMgPT0gMSkgewotCQlidWlkID0gKHVuc2lnbmVkIGxvbmcpIGJ1aWRfdmFsc1swXTsKLQl9IGVsc2UgewotCQlidWlkID0gKCgodW5zaWduZWQgbG9uZylidWlkX3ZhbHNbMF0pIDw8IDMyVUwpIHwKLQkJCSgoKHVuc2lnbmVkIGxvbmcpYnVpZF92YWxzWzFdKSAmIDB4ZmZmZmZmZmYpOwotCX0KLQlyZXR1cm4gYnVpZDsKKwlyZXR1cm4gci5zdGFydDsKIH0KIAogc3RhdGljIGludCBwaGJfc2V0X2J1c19yYW5nZXMoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCkBAIC0yNzYsOCArMjU4LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBfX2RldmluaXQgc2V0dXBfcGhiKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYikKK2ludCBfX2RldmluaXQgcnRhc19zZXR1cF9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpkZXYgPSBwaGItPmFyY2hfZGF0YTsKKwogCWlmIChpc19weXRob24oZGV2KSkKIAkJcHl0aG9uX2NvdW50ZXJtZWFzdXJlcyhkZXYpOwogCkBAIC0zMDksNyArMjkzLDcgQEAKIAkJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5vZGUpOwogCQlpZiAoIXBoYikKIAkJCWNvbnRpbnVlOwotCQlzZXR1cF9waGIobm9kZSwgcGhiKTsKKwkJcnRhc19zZXR1cF9waGIocGhiKTsKIAkJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIG5vZGUsIDApOwogCQlwY2lfc2V0dXBfcGhiX2lvKHBoYiwgaW5kZXggPT0gMCk7CiAJCWluZGV4Kys7CkBAIC0zODEsNyArMzY1LDYgQEAKIAkJfQogCX0KIAotCWxpc3RfZGVsKCZwaGItPmxpc3Rfbm9kZSk7CiAJcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIocGhiKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDE5MWQwYWIuLjYxYzY1ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKQEAgLTYzLDEwICs2Myw2IEBACiAKIGludCBoYXZlX29mID0gMTsKIAotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQotZGV2X3QgYm9vdF9kZXY7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCi0KICNpZmRlZiBDT05GSUdfVkdBX0NPTlNPTEUKIHVuc2lnbmVkIGxvbmcgdmdhY29uX3JlbWFwX2Jhc2U7CiAjZW5kaWYKQEAgLTkxLDYgKzg3LDcgQEAKIHVuc2lnbmVkIGxvbmcgX19pbml0IGVhcmx5X2luaXQodW5zaWduZWQgbG9uZyBkdF9wdHIpCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWxvY19vZmZzZXQoKTsKKwlzdHJ1Y3QgY3B1X3NwZWMgKnNwZWM7CiAKIAkvKiBGaXJzdCB6ZXJvIHRoZSBCU1MgLS0gdXNlIG1lbXNldF9pbywgc29tZSBwbGF0Zm9ybXMgZG9uJ3QgaGF2ZQogCSAqIGNhY2hlcyBvbiB5ZXQgKi8KQEAgLTEwMCw4ICs5NywxMSBAQAogCSAqIElkZW50aWZ5IHRoZSBDUFUgdHlwZSBhbmQgZml4IHVwIGNvZGUgc2VjdGlvbnMKIAkgKiB0aGF0IGRlcGVuZCBvbiB3aGljaCBjcHUgd2UgaGF2ZS4KIAkgKi8KLQlpZGVudGlmeV9jcHUob2Zmc2V0LCAwKTsKLQlkb19jcHVfZnRyX2ZpeHVwcyhvZmZzZXQpOworCXNwZWMgPSBpZGVudGlmeV9jcHUob2Zmc2V0LCBtZnNwcihTUFJOX1BWUikpOworCisJZG9fZmVhdHVyZV9maXh1cHMoc3BlYy0+Y3B1X2ZlYXR1cmVzLAorCQkJICBQVFJSRUxPQygmX19zdGFydF9fX2Z0cl9maXh1cCksCisJCQkgIFBUUlJFTE9DKCZfX3N0b3BfX19mdHJfZml4dXApKTsKIAogCXJldHVybiBLRVJORUxCQVNFICsgb2Zmc2V0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IDRiMmUzMmUuLjM3MzNkZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20va2R1bXAuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtNzEsNyArNzIsNiBAQAogCiBpbnQgaGF2ZV9vZiA9IDE7CiBpbnQgYm9vdF9jcHVpZCA9IDA7Ci1kZXZfdCBib290X2RldjsKIHU2NCBwcGM2NF9wZnRfc2l6ZTsKIAogLyogUGljayBkZWZhdWx0cyBzaW5jZSB3ZSBtaWdodCB3YW50IHRvIHBhdGNoIGluc3RydWN0aW9ucwpAQCAtMTcwLDYgKzE3MCw5IEBACiAKIHZvaWQgX19pbml0IGVhcmx5X3NldHVwKHVuc2lnbmVkIGxvbmcgZHRfcHRyKQogeworCS8qIElkZW50aWZ5IENQVSB0eXBlICovCisJaWRlbnRpZnlfY3B1KDAsIG1mc3ByKFNQUk5fUFZSKSk7CisKIAkvKiBBc3N1bWUgd2UncmUgb24gY3B1IDAgZm9yIG5vdy4gRG9uJ3Qgd3JpdGUgdG8gdGhlIHBhY2EgeWV0ISAqLwogCXNldHVwX3BhY2EoMCk7CiAKQEAgLTIyMyw4ICsyMjYsOCBAQAogewogCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2EgPSBnZXRfcGFjYSgpOwogCi0JLyogTWFyayBlbmFibGVkIGluIFBBQ0EgKi8KLQlscGFjYS0+cHJvY19lbmFibGVkID0gMDsKKwkvKiBNYXJrIGludGVycnVwdHMgZW5hYmxlZCBpbiBQQUNBICovCisJbHBhY2EtPnNvZnRfZW5hYmxlZCA9IDA7CiAKIAkvKiBJbml0aWFsaXplIGhhc2ggdGFibGUgZm9yIHRoYXQgQ1BVICovCiAJaHRhYl9pbml0aWFsaXplX3NlY29uZGFyeSgpOwpAQCAtMzQ4LDYgKzM1MSwxNCBAQAogewogCURCRygiIC0+IHNldHVwX3N5c3RlbSgpXG4iKTsKIAorCS8qIEFwcGx5IHRoZSBDUFVzLXNwZWNpZmljIGFuZCBmaXJtd2FyZSBzcGVjaWZpYyBmaXh1cHMgdG8ga2VybmVsCisJICogdGV4dCAobm9wIG91dCBzZWN0aW9ucyBub3QgcmVsZXZhbnQgdG8gdGhpcyBDUFUgb3IgdGhpcyBmaXJtd2FyZSkKKwkgKi8KKwlkb19mZWF0dXJlX2ZpeHVwcyhjdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcywKKwkJCSAgJl9fc3RhcnRfX19mdHJfZml4dXAsICZfX3N0b3BfX19mdHJfZml4dXApOworCWRvX2ZlYXR1cmVfZml4dXBzKHBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMsCisJCQkgICZfX3N0YXJ0X19fZndfZnRyX2ZpeHVwLCAmX19zdG9wX19fZndfZnRyX2ZpeHVwKTsKKwogCS8qCiAJICogVW5mbGF0dGVuIHRoZSBkZXZpY2UtdHJlZSBwYXNzZWQgYnkgcHJvbV9pbml0IG9yIGtleGVjCiAJICovCkBAIC0zODEsNyArMzkyLDggQEAKIAkgKiBzZXR0aW5nIHVwIHRoZSBoYXNoIHRhYmxlIHBvaW50ZXJzLiBJdCBhbHNvIHNldHMgdXAgc29tZSBpbnRlcnJ1cHQtbWFwcGluZwogCSAqIHJlbGF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCBieSBmaW5pc2hfZGV2aWNlX3RyZWUoKQogCSAqLwotCXBwY19tZC5pbml0X2Vhcmx5KCk7CisJaWYgKHBwY19tZC5pbml0X2Vhcmx5KQorCQlwcGNfbWQuaW5pdF9lYXJseSgpOwogCiAgCS8qCiAJICogV2UgY2FuIGRpc2NvdmVyIHNlcmlhbCBwb3J0cyBub3cgc2luY2UgdGhlIGFib3ZlIGRpZCBzZXR1cCB0aGUKQEAgLTU4NywzICs1OTksMTAgQEAKIAl9CiB9CiAjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX1BQQ19JTkRJUkVDVF9JTworc3RydWN0IHBwY19wY2lfaW8gcHBjX3BjaV9pbzsKK0VYUE9SVF9TWU1CT0wocHBjX3BjaV9pbyk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19JTkRJUkVDVF9JTyAqLworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwppbmRleCAzMjAzNTNmLi5lNGViZTFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNlbmRpZgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLXRic3luYy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAtdGJzeW5jLmMKaW5kZXggZGU1OWM2Yy4uYmM4OTJlNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLXRic3luYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLXRic3luYy5jCkBAIC03OCw3ICs3OCw3IEBACiB7CiAJaW50IGksIHNjb3JlPTA7CiAJdTY0IHRiOwotCWxvbmcgbWFyazsKKwl1NjQgbWFyazsKIAogCXRic3luYy0+Y21kID0gY21kOwogCkBAIC0xMTYsOCArMTE2LDcgQEAKIAlwcmludGsoIlN5bmNocm9uaXppbmcgdGltZWJhc2VcbiIpOwogCiAJLyogaWYgdGhpcyBmYWlscyB0aGVuIHRoaXMga2VybmVsIHdvbid0IHdvcmsgYW55d2F5Li4uICovCi0JdGJzeW5jID0ga21hbGxvYyggc2l6ZW9mKCp0YnN5bmMpLCBHRlBfS0VSTkVMICk7Ci0JbWVtc2V0KCB0YnN5bmMsIDAsIHNpemVvZigqdGJzeW5jKSApOworCXRic3luYyA9IGt6YWxsb2MoIHNpemVvZigqdGJzeW5jKSwgR0ZQX0tFUk5FTCApOwogCW1iKCk7CiAJcnVubmluZyA9IDE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IDM1YzYzMDkuLjliMjhjMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtNjUsNiArNjUsNyBAQAogCiBFWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKIEVYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9zaWJsaW5nX21hcCk7CiAKIC8qIFNNUCBvcGVyYXRpb25zIGZvciB0aGlzIG1hY2hpbmUgKi8KIHN0cnVjdCBzbXBfb3BzX3QgKnNtcF9vcHM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYwppbmRleCBkMTVjMzNlLi4wM2EyYTJmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzX3BwYzMyLmMKQEAgLTUxLDYgKzUxLDcgQEAKICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKIC8qIHJlYWRkaXIgJiBnZXRkZW50cyAqLwogI2RlZmluZSBOQU1FX09GRlNFVChkZSkgKChpbnQpICgoZGUpLT5kX25hbWUgLSAoY2hhciBfX3VzZXIgKikgKGRlKSkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggZDQ1YTE2OC4uNDAwYWIyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtMTgxLDYgKzE4MSw4IEBACiBTWVNGU19QTUNTRVRVUChwbWM3LCBTUFJOX1BNQzcpOwogU1lTRlNfUE1DU0VUVVAocG1jOCwgU1BSTl9QTUM4KTsKIFNZU0ZTX1BNQ1NFVFVQKHB1cnIsIFNQUk5fUFVSUik7CitTWVNGU19QTUNTRVRVUChzcHVyciwgU1BSTl9TUFVSUik7CitTWVNGU19QTUNTRVRVUChkc2NyLCBTUFJOX0RTQ1IpOwogCiBzdGF0aWMgU1lTREVWX0FUVFIobW1jcjAsIDA2MDAsIHNob3dfbW1jcjAsIHN0b3JlX21tY3IwKTsKIHN0YXRpYyBTWVNERVZfQVRUUihtbWNyMSwgMDYwMCwgc2hvd19tbWNyMSwgc3RvcmVfbW1jcjEpOwpAQCAtMTk0LDE2ICsxOTYsMTcgQEAKIHN0YXRpYyBTWVNERVZfQVRUUihwbWM3LCAwNjAwLCBzaG93X3BtYzcsIHN0b3JlX3BtYzcpOwogc3RhdGljIFNZU0RFVl9BVFRSKHBtYzgsIDA2MDAsIHNob3dfcG1jOCwgc3RvcmVfcG1jOCk7CiBzdGF0aWMgU1lTREVWX0FUVFIocHVyciwgMDYwMCwgc2hvd19wdXJyLCBOVUxMKTsKK3N0YXRpYyBTWVNERVZfQVRUUihzcHVyciwgMDYwMCwgc2hvd19zcHVyciwgTlVMTCk7CitzdGF0aWMgU1lTREVWX0FUVFIoZHNjciwgMDYwMCwgc2hvd19kc2NyLCBzdG9yZV9kc2NyKTsKIAogc3RhdGljIHZvaWQgcmVnaXN0ZXJfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHUgKmMgPSAmcGVyX2NwdShjcHVfZGV2aWNlcywgY3B1KTsKIAlzdHJ1Y3Qgc3lzX2RldmljZSAqcyA9ICZjLT5zeXNkZXY7CiAKLSNpZm5kZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NNVCkpCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpICYmCisJCQljcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQogCQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfc210X3Nub296ZV9kZWxheSk7Ci0jZW5kaWYKIAogCS8qIFBNQyBzdHVmZiAqLwogCkBAIC0yMzIsNiArMjM1LDEyIEBACiAKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUFVSUikpCiAJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9wdXJyKTsKKworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TUFVSUikpCisJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9zcHVycik7CisKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfRFNDUikpCisJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9kc2NyKTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpAQCAtMjQwLDEyICsyNDksMTEgQEAKIAlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CiAJc3RydWN0IHN5c19kZXZpY2UgKnMgPSAmYy0+c3lzZGV2OwogCi0JQlVHX09OKGMtPm5vX2NvbnRyb2wpOworCUJVR19PTighYy0+aG90cGx1Z2dhYmxlKTsKIAotI2lmbmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykgJiYKKwkJCWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NNVCkpCiAJCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9zbXRfc25vb3plX2RlbGF5KTsKLSNlbmRpZgogCiAJLyogUE1DIHN0dWZmICovCiAKQEAgLTI3NCw2ICsyODIsMTIgQEAKIAogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QVVJSKSkKIAkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX3B1cnIpOworCisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NQVVJSKSkKKwkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX3NwdXJyKTsKKworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9EU0NSKSkKKwkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX2RzY3IpOwogfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCkBAIC0yOTksNiArMzEzLDcyIEBACiAJLm5vdGlmaWVyX2NhbGwJPSBzeXNmc19jcHVfbm90aWZ5LAogfTsKIAorc3RhdGljIERFRklORV9NVVRFWChjcHVfbXV0ZXgpOworCitpbnQgY3B1X2FkZF9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cikKK3sKKwlpbnQgY3B1OworCisJbXV0ZXhfbG9jaygmY3B1X211dGV4KTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3lzZGV2X2NyZWF0ZV9maWxlKGdldF9jcHVfc3lzZGV2KGNwdSksIGF0dHIpOworCX0KKworCW11dGV4X3VubG9jaygmY3B1X211dGV4KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9hZGRfc3lzZGV2X2F0dHIpOworCitpbnQgY3B1X2FkZF9zeXNkZXZfYXR0cl9ncm91cChzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRycykKK3sKKwlpbnQgY3B1OworCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXY7CisKKwltdXRleF9sb2NrKCZjcHVfbXV0ZXgpOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzeXNkZXYgPSBnZXRfY3B1X3N5c2RldihjcHUpOworCQlzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c2Rldi0+a29iaiwgYXR0cnMpOworCX0KKworCW11dGV4X3VubG9jaygmY3B1X211dGV4KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9hZGRfc3lzZGV2X2F0dHJfZ3JvdXApOworCisKK3ZvaWQgY3B1X3JlbW92ZV9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cikKK3sKKwlpbnQgY3B1OworCisJbXV0ZXhfbG9jaygmY3B1X211dGV4KTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3lzZGV2X3JlbW92ZV9maWxlKGdldF9jcHVfc3lzZGV2KGNwdSksIGF0dHIpOworCX0KKworCW11dGV4X3VubG9jaygmY3B1X211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9yZW1vdmVfc3lzZGV2X2F0dHIpOworCit2b2lkIGNwdV9yZW1vdmVfc3lzZGV2X2F0dHJfZ3JvdXAoc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cnMpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OworCisJbXV0ZXhfbG9jaygmY3B1X211dGV4KTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3lzZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzeXNkZXYtPmtvYmosIGF0dHJzKTsKKwl9CisKKwltdXRleF91bmxvY2soJmNwdV9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfcmVtb3ZlX3N5c2Rldl9hdHRyX2dyb3VwKTsKKworCiAvKiBOVU1BIHN0dWZmICovCiAKICNpZmRlZiBDT05GSUdfTlVNQQpAQCAtMzYwLDEwICs0NDAsMTAgQEAKIAkJICogQ1BVLiAgRm9yIGluc3RhbmNlLCB0aGUgYm9vdCBjcHUgbWlnaHQgbmV2ZXIgYmUgdmFsaWQKIAkJICogZm9yIGhvdHBsdWdnaW5nLgogCQkgKi8KLQkJaWYgKCFwcGNfbWQuY3B1X2RpZSkKLQkJCWMtPm5vX2NvbnRyb2wgPSAxOworCQlpZiAocHBjX21kLmNwdV9kaWUpCisJCQljLT5ob3RwbHVnZ2FibGUgPSAxOwogCi0JCWlmIChjcHVfb25saW5lKGNwdSkgfHwgKGMtPm5vX2NvbnRyb2wgPT0gMCkpIHsKKwkJaWYgKGNwdV9vbmxpbmUoY3B1KSB8fCBjLT5ob3RwbHVnZ2FibGUpIHsKIAkJCXJlZ2lzdGVyX2NwdShjLCBjcHUpOwogCiAJCQlzeXNkZXZfY3JlYXRlX2ZpbGUoJmMtPnN5c2RldiwgJmF0dHJfcGh5c2ljYWxfaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwppbmRleCA1YjU5YmMxLi5mNmYwYzZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwpAQCAtMjIwLDExICsyMjAsOCBAQAogICovCiBzdHJ1Y3QgY3B1X3B1cnJfZGF0YSB7CiAJaW50CWluaXRpYWxpemVkOwkJCS8qIHRocmVhZCBpcyBydW5uaW5nICovCi0JdTY0CXRiMDsJCQkvKiB0aW1lYmFzZSBhdCBvcmlnaW4gdGltZSAqLwotCXU2NAlwdXJyMDsJCQkvKiBQVVJSIGF0IG9yaWdpbiB0aW1lICovCiAJdTY0CXRiOwkJCS8qIGxhc3QgVEIgdmFsdWUgcmVhZCAqLwogCXU2NAlwdXJyOwkJCS8qIGxhc3QgUFVSUiB2YWx1ZSByZWFkICovCi0JdTY0CXN0b2xlbjsJCQkvKiBzdG9sZW4gdGltZSBzbyBmYXIgKi8KIAlzcGlubG9ja190IGxvY2s7CiB9OwogCkBAIC0yMzQsMTAgKzIzMSw4IEBACiB7CiAJc3RydWN0IGNwdV9wdXJyX2RhdGEgKnAgPSAmX19nZXRfY3B1X3ZhcihjcHVfcHVycl9kYXRhKTsKIAotCXAtPnRiMCA9IG1mdGIoKTsKLQlwLT5wdXJyMCA9IG1mc3ByKFNQUk5fUFVSUik7Ci0JcC0+dGIgPSBwLT50YjA7Ci0JcC0+cHVyciA9IDA7CisJcC0+dGIgPSBtZnRiKCk7CisJcC0+cHVyciA9IG1mc3ByKFNQUk5fUFVSUik7CiAJd21iKCk7CiAJcC0+aW5pdGlhbGl6ZWQgPSAxOwogfQpAQCAtMjU4LDM3ICsyNTMsMjQgQEAKIAogdm9pZCBjYWxjdWxhdGVfc3RlYWxfdGltZSh2b2lkKQogewotCXU2NCB0YiwgcHVyciwgdDA7CisJdTY0IHRiLCBwdXJyOwogCXM2NCBzdG9sZW47Ci0Jc3RydWN0IGNwdV9wdXJyX2RhdGEgKnAwLCAqcG1lLCAqcGhpbTsKLQlpbnQgY3B1OworCXN0cnVjdCBjcHVfcHVycl9kYXRhICpwbWU7CiAKIAlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BVUlIpKQogCQlyZXR1cm47Ci0JY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXBtZSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIGNwdSk7CisJcG1lID0gJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlpZiAoIXBtZS0+aW5pdGlhbGl6ZWQpCiAJCXJldHVybjsJCS8qIHRoaXMgY2FuIGhhcHBlbiBpbiBlYXJseSBib290ICovCi0JcDAgPSAmcGVyX2NwdShjcHVfcHVycl9kYXRhLCBjcHUgJiB+MSk7Ci0JcGhpbSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIGNwdSBeIDEpOwotCXNwaW5fbG9jaygmcDAtPmxvY2spOworCXNwaW5fbG9jaygmcG1lLT5sb2NrKTsKIAl0YiA9IG1mdGIoKTsKLQlwdXJyID0gbWZzcHIoU1BSTl9QVVJSKSAtIHBtZS0+cHVycjA7Ci0JaWYgKCFwaGltLT5pbml0aWFsaXplZCB8fCAhY3B1X29ubGluZShjcHUgXiAxKSkgewotCQlzdG9sZW4gPSAodGIgLSBwbWUtPnRiKSAtIChwdXJyIC0gcG1lLT5wdXJyKTsKLQl9IGVsc2UgewotCQl0MCA9IHBtZS0+dGIwOwotCQlpZiAocGhpbS0+dGIwIDwgdDApCi0JCQl0MCA9IHBoaW0tPnRiMDsKLQkJc3RvbGVuID0gcGhpbS0+dGIgLSB0MCAtIHBoaW0tPnB1cnIgLSBwdXJyIC0gcDAtPnN0b2xlbjsKLQl9Ci0JaWYgKHN0b2xlbiA+IDApIHsKKwlwdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKKwlzdG9sZW4gPSAodGIgLSBwbWUtPnRiKSAtIChwdXJyIC0gcG1lLT5wdXJyKTsKKwlpZiAoc3RvbGVuID4gMCkKIAkJYWNjb3VudF9zdGVhbF90aW1lKGN1cnJlbnQsIHN0b2xlbik7Ci0JCXAwLT5zdG9sZW4gKz0gc3RvbGVuOwotCX0KIAlwbWUtPnRiID0gdGI7CiAJcG1lLT5wdXJyID0gcHVycjsKLQlzcGluX3VubG9jaygmcDAtPmxvY2spOworCXNwaW5fdW5sb2NrKCZwbWUtPmxvY2spOwogfQogCiAvKgpAQCAtMjk3LDMwICsyNzksMTcgQEAKICAqLwogc3RhdGljIHZvaWQgc25hcHNob3RfcHVycih2b2lkKQogewotCWludCBjcHU7Ci0JdTY0IHB1cnI7Ci0Jc3RydWN0IGNwdV9wdXJyX2RhdGEgKnAwLCAqcG1lLCAqcGhpbTsKKwlzdHJ1Y3QgY3B1X3B1cnJfZGF0YSAqcG1lOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BVUlIpKQogCQlyZXR1cm47Ci0JY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXBtZSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIGNwdSk7Ci0JcDAgPSAmcGVyX2NwdShjcHVfcHVycl9kYXRhLCBjcHUgJiB+MSk7Ci0JcGhpbSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIGNwdSBeIDEpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwMC0+bG9jaywgZmxhZ3MpOwotCXBtZS0+dGIgPSBwbWUtPnRiMCA9IG1mdGIoKTsKLQlwdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKLQlpZiAoIXBoaW0tPmluaXRpYWxpemVkKSB7Ci0JCXBtZS0+cHVyciA9IDA7Ci0JCXBtZS0+cHVycjAgPSBwdXJyOwotCX0gZWxzZSB7Ci0JCS8qIHNldCBwLT5wdXJyIGFuZCBwLT5wdXJyMCBmb3Igbm8gY2hhbmdlIGluIHAwLT5zdG9sZW4gKi8KLQkJcG1lLT5wdXJyID0gcGhpbS0+dGIgLSBwaGltLT50YjAgLSBwaGltLT5wdXJyIC0gcDAtPnN0b2xlbjsKLQkJcG1lLT5wdXJyMCA9IHB1cnIgLSBwbWUtPnB1cnI7Ci0JfQorCXBtZSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBtZS0+bG9jaywgZmxhZ3MpOworCXBtZS0+dGIgPSBtZnRiKCk7CisJcG1lLT5wdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKIAlwbWUtPmluaXRpYWxpemVkID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwMC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtZS0+bG9jaywgZmxhZ3MpOwogfQogCiAjZW5kaWYgLyogQ09ORklHX1BQQ19TUExQQVIgKi8KQEAgLTY2Miw3ICs2MzEsOCBAQAogCWNhbGN1bGF0ZV9zdGVhbF90aW1lKCk7CiAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOwogI2VuZGlmCiAKIAl3aGlsZSAoKHRpY2tzID0gdGJfdGlja3Nfc2luY2UocGVyX2NwdShsYXN0X2ppZmZ5LCBjcHUpKSkKQEAgLTcwNSw3ICs2NzUsNyBAQAogCXNldF9kZWMobmV4dF9kZWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykgJiYgaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkKIAkJcHJvY2Vzc19odmxwZXZlbnRzKCk7CiAjZW5kaWYKIApAQCAtODA1LDcgKzc3NSw3IEBACiAJICogc2V0dGltZW9mZGF5IHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24uCiAJICovCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JaWYgKGZpcnN0X3NldHRpbWVvZmRheSkgeworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpICYmIGZpcnN0X3NldHRpbWVvZmRheSkgewogCQlpU2VyaWVzX3RiX3JlY2FsKCk7CiAJCWZpcnN0X3NldHRpbWVvZmRheSA9IDA7CiAJfQpAQCAtMTA0NSw0OCArMTAxNSw2IEBACiAJc2V0X2RlYyh0Yl90aWNrc19wZXJfamlmZnkpOwogfQogCi0jaWZkZWYgQ09ORklHX1JUQ19DTEFTUwotc3RhdGljIGludCBzZXRfcnRjX2NsYXNzX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiA9Ci0JCXJ0Y19jbGFzc19vcGVuKENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpOwotCi0JaWYgKGNsYXNzX2RldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWVyciA9IHJ0Y19zZXRfdGltZShjbGFzc19kZXYsIHRtKTsKLQotCXJ0Y19jbGFzc19jbG9zZShjbGFzc19kZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9ydGNfY2xhc3NfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCWludCBlcnI7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2ID0KLQkJcnRjX2NsYXNzX29wZW4oQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSk7Ci0KLQlpZiAoY2xhc3NfZGV2ID09IE5VTEwpCi0JCXJldHVybjsKLQotCWVyciA9IHJ0Y19yZWFkX3RpbWUoY2xhc3NfZGV2LCB0bSk7Ci0KLQlydGNfY2xhc3NfY2xvc2UoY2xhc3NfZGV2KTsKLQotCXJldHVybjsKLX0KLQotaW50IF9faW5pdCBydGNfY2xhc3NfaG9va3VwKHZvaWQpCi17Ci0JcHBjX21kLmdldF9ydGNfdGltZSA9IGdldF9ydGNfY2xhc3NfdGltZTsKLQlwcGNfbWQuc2V0X3J0Y190aW1lID0gc2V0X3J0Y19jbGFzc190aW1lOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1JUQ19DTEFTUyAqLwotCiAKICNkZWZpbmUgRkVCUlVBUlkJMgogI2RlZmluZQlTVEFSVE9GVElNRQkxOTcwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggZDlmMTBmMmYuLjUzNWY1MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KIAogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtNTMsMTAgKzU0LDYgQEAKICNlbmRpZgogI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogCi0jaWZkZWYgQ09ORklHX1BQQzY0CS8qIFhYWCAqLwotI2RlZmluZSBfSU9fQkFTRQlwY2lfaW9fYmFzZQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfREVCVUdHRVIKIGludCAoKl9fZGVidWdnZXIpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGludCAoKl9fZGVidWdnZXJfaXBpKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CkBAIC0yNDEsNyArMjM4LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfaW9fYWNjZXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIGRlZmluZWQoQ09ORklHX1BQQ19QTUFDKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKKyNpZmRlZiBDT05GSUdfUFBDMzIKIAl1bnNpZ25lZCBsb25nIG1zciA9IHJlZ3MtPm1zcjsKIAljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICplbnRyeTsKIAl1bnNpZ25lZCBpbnQgKm5pcCA9ICh1bnNpZ25lZCBpbnQgKilyZWdzLT5uaXA7CkBAIC0yNzQsNyArMjcxLDcgQEAKIAkJCXJldHVybiAxOwogCQl9CiAJfQotI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAmJiBDT05GSUdfUFBDMzIgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzMxLDU0ICs3MjgsOSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi0vKgotICogTG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIHRyYXAgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHVzZWQgZm9yIEJVRygpLAotICogQlVHX09OKCkgYW5kIFdBUk5fT04oKSBhbmQgc2VlIGlmIHdlIGhpdCBvbmUuICBBdCB0aGlzIHBvaW50IHdlIGtub3cKLSAqIHRoYXQgdGhlIGV4Y2VwdGlvbiB3YXMgY2F1c2VkIGJ5IGEgdHJhcCBpbnN0cnVjdGlvbiBvZiBzb21lIGtpbmQuCi0gKiBSZXR1cm5zIDEgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIChpLmUuIGl0IHdhcyBhIFdBUk5fT04pIG9yIDAKLSAqIG90aGVyd2lzZS4KLSAqLwotZXh0ZXJuIHN0cnVjdCBidWdfZW50cnkgX19zdGFydF9fX2J1Z190YWJsZVtdLCBfX3N0b3BfX19idWdfdGFibGVbXTsKLQotI2lmbmRlZiBDT05GSUdfTU9EVUxFUwotI2RlZmluZSBtb2R1bGVfZmluZF9idWcoeCkJTlVMTAotI2VuZGlmCi0KLXN0cnVjdCBidWdfZW50cnkgKmZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcikKK2ludCBpc192YWxpZF9idWdhZGRyKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlzdHJ1Y3QgYnVnX2VudHJ5ICpidWc7Ci0KLQlmb3IgKGJ1ZyA9IF9fc3RhcnRfX19idWdfdGFibGU7IGJ1ZyA8IF9fc3RvcF9fX2J1Z190YWJsZTsgKytidWcpCi0JCWlmIChidWdhZGRyID09IGJ1Zy0+YnVnX2FkZHIpCi0JCQlyZXR1cm4gYnVnOwotCXJldHVybiBtb2R1bGVfZmluZF9idWcoYnVnYWRkcik7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfYnVnX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IGJ1Z19lbnRyeSAqYnVnOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCWlmIChyZWdzLT5tc3IgJiBNU1JfUFIpCi0JCXJldHVybiAwOwkvKiBub3QgaW4ga2VybmVsICovCi0JYWRkciA9IHJlZ3MtPm5pcDsJLyogYWRkcmVzcyBvZiB0cmFwIGluc3RydWN0aW9uICovCi0JaWYgKGFkZHIgPCBQQUdFX09GRlNFVCkKLQkJcmV0dXJuIDA7Ci0JYnVnID0gZmluZF9idWcocmVncy0+bmlwKTsKLQlpZiAoYnVnID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChidWctPmxpbmUgJiBCVUdfV0FSTklOR19UUkFQKSB7Ci0JCS8qIHRoaXMgaXMgYSBXQVJOX09OIHJhdGhlciB0aGFuIEJVRy9CVUdfT04gKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJCYWRuZXNzIGluICVzIGF0ICVzOiVsZFxuIiwKLQkJICAgICAgIGJ1Zy0+ZnVuY3Rpb24sIGJ1Zy0+ZmlsZSwKLQkJICAgICAgIGJ1Zy0+bGluZSAmIH5CVUdfV0FSTklOR19UUkFQKTsKLQkJZHVtcF9zdGFjaygpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcHJpbnRrKEtFUk5fQ1JJVCAia2VybmVsIEJVRyBpbiAlcyBhdCAlczolbGQhXG4iLAotCSAgICAgICBidWctPmZ1bmN0aW9uLCBidWctPmZpbGUsIGJ1Zy0+bGluZSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gaXNfa2VybmVsX2FkZHIoYWRkcik7CiB9CiAKIHZvaWQgX19rcHJvYmVzIHByb2dyYW1fY2hlY2tfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtNzg2LDYgKzczOCw4IEBACiAJdW5zaWduZWQgaW50IHJlYXNvbiA9IGdldF9yZWFzb24ocmVncyk7CiAJZXh0ZXJuIGludCBkb19tYXRoZW11KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAorCS8qIFdlIGNhbiBub3cgZ2V0IGhlcmUgdmlhIGEgRlAgVW5hdmFpbGFibGUgZXhjZXB0aW9uIGlmIHRoZSBjb3JlCisJICogaGFzIG5vIEZQVSwgaW4gdGhhdCBjYXNlIG5vIHJlYXNvbiBmbGFncyB3aWxsIGJlIHNldCAqLwogI2lmZGVmIENPTkZJR19NQVRIX0VNVUxBVElPTgogCS8qIChyZWFzb24gJiBSRUFTT05fSUxMRUdBTCkgd291bGQgYmUgdGhlIG9idmlvdXMgdGhpbmcgaGVyZSwKIAkgKiBidXQgdGhlcmUgc2VlbXMgdG8gYmUgYSBoYXJkd2FyZSBidWcgb24gdGhlIDQwNUdQIChSZXZEKQpAQCAtODEyLDcgKzc2Niw5IEBACiAJCQlyZXR1cm47CiAJCWlmIChkZWJ1Z2dlcl9icHQocmVncykpCiAJCQlyZXR1cm47Ci0JCWlmIChjaGVja19idWdfdHJhcChyZWdzKSkgeworCisJCWlmICghKHJlZ3MtPm1zciAmIE1TUl9QUikgJiYgIC8qIG5vdCB1c2VyLW1vZGUgKi8KKwkJICAgIHJlcG9ydF9idWcocmVncy0+bmlwKSA9PSBCVUdfVFJBUF9UWVBFX1dBUk4pIHsKIAkJCXJlZ3MtPm5pcCArPSA0OwogCQkJcmV0dXJuOwogCQl9CkBAIC04NDMsNyArNzk5LDcgQEAKIAogdm9pZCBhbGlnbm1lbnRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWludCBmaXhlZCA9IDA7CisJaW50IHNpZywgY29kZSwgZml4ZWQgPSAwOwogCiAJLyogd2UgZG9uJ3QgaW1wbGVtZW50IGxvZ2dpbmcgb2YgYWxpZ25tZW50IGV4Y2VwdGlvbnMgKi8KIAlpZiAoIShjdXJyZW50LT50aHJlYWQuYWxpZ25fY3RsICYgUFJfVU5BTElHTl9TSUdCVVMpKQpAQCAtODU3LDE0ICs4MTMsMTYgQEAKIAogCS8qIE9wZXJhbmQgYWRkcmVzcyB3YXMgYmFkICovCiAJaWYgKGZpeGVkID09IC1FRkFVTFQpIHsKLQkJaWYgKHVzZXJfbW9kZShyZWdzKSkKLQkJCV9leGNlcHRpb24oU0lHU0VHViwgcmVncywgU0VHVl9BQ0NFUlIsIHJlZ3MtPmRhcik7Ci0JCWVsc2UKLQkJCS8qIFNlYXJjaCBleGNlcHRpb24gdGFibGUgKi8KLQkJCWJhZF9wYWdlX2ZhdWx0KHJlZ3MsIHJlZ3MtPmRhciwgU0lHU0VHVik7Ci0JCXJldHVybjsKKwkJc2lnID0gU0lHU0VHVjsKKwkJY29kZSA9IFNFR1ZfQUNDRVJSOworCX0gZWxzZSB7CisJCXNpZyA9IFNJR0JVUzsKKwkJY29kZSA9IEJVU19BRFJBTE47CiAJfQotCV9leGNlcHRpb24oU0lHQlVTLCByZWdzLCBCVVNfQURSQUxOLCByZWdzLT5kYXIpOworCWlmICh1c2VyX21vZGUocmVncykpCisJCV9leGNlcHRpb24oc2lnLCByZWdzLCBjb2RlLCByZWdzLT5kYXIpOworCWVsc2UKKwkJYmFkX3BhZ2VfZmF1bHQocmVncywgcmVncy0+ZGFyLCBzaWcpOwogfQogCiB2b2lkIFN0YWNrT3ZlcmZsb3coc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC05MDAsMTQgKzg1OCwxMyBAQAogCiB2b2lkIGFsdGl2ZWNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmICFkZWZpbmVkKENPTkZJR19BTFRJVkVDKQogCWlmICh1c2VyX21vZGUocmVncykpIHsKIAkJLyogQSB1c2VyIHByb2dyYW0gaGFzIGV4ZWN1dGVkIGFuIGFsdGl2ZWMgaW5zdHJ1Y3Rpb24sCiAJCSAgIGJ1dCB0aGlzIGtlcm5lbCBkb2Vzbid0IHN1cHBvcnQgYWx0aXZlYy4gKi8KIAkJX2V4Y2VwdGlvbihTSUdJTEwsIHJlZ3MsIElMTF9JTExPUEMsIHJlZ3MtPm5pcCk7CiAJCXJldHVybjsKIAl9Ci0jZW5kaWYKKwogCXByaW50ayhLRVJOX0VNRVJHICJVbnJlY292ZXJhYmxlIFZNWC9BbHRpdmVjIFVuYXZhaWxhYmxlIEV4Y2VwdGlvbiAiCiAJCQkiJWx4IGF0ICVseFxuIiwgcmVncy0+dHJhcCwgcmVncy0+bmlwKTsKIAlkaWUoIlVucmVjb3ZlcmFibGUgVk1YL0FsdGl2ZWMgVW5hdmFpbGFibGUgRXhjZXB0aW9uIiwgcmVncywgU0lHQUJSVCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCmluZGV4IDFhN2UxOWMuLmE0YjI4YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzby5jCkBAIC0zNiw2ICszNiw4IEBACiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KICNpbmNsdWRlIDxhc20vdmRzb19kYXRhcGFnZS5oPgogCisjaW5jbHVkZSAic2V0dXAuaCIKKwogI3VuZGVmIERFQlVHCiAKICNpZmRlZiBERUJVRwpAQCAtMjYyLDcgKzI2NCw3IEBACiAKIAogCS8qIEFsbG9jYXRlIGEgVk1BIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB1cCAqLwotCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJdm1hID0ga21lbV9jYWNoZV96YWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICh2bWEgPT0gTlVMTCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbF9tbWFwc2VtOwpAQCAtNTg2LDYgKzU4OCw0MyBAQAogCXJldHVybiAwOwogfQogCisKK3N0YXRpYyBfX2luaXQgaW50IHZkc29fZml4dXBfZmVhdHVyZXMoc3RydWN0IGxpYjMyX2VsZmluZm8gKnYzMiwKKwkJCQkgICAgICBzdHJ1Y3QgbGliNjRfZWxmaW5mbyAqdjY0KQoreworCXZvaWQgKnN0YXJ0MzI7CisJdW5zaWduZWQgbG9uZyBzaXplMzI7CisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwl2b2lkICpzdGFydDY0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTY0OworCisJc3RhcnQ2NCA9IGZpbmRfc2VjdGlvbjY0KHY2NC0+aGRyLCAiX19mdHJfZml4dXAiLCAmc2l6ZTY0KTsKKwlpZiAoc3RhcnQ2NCkKKwkJZG9fZmVhdHVyZV9maXh1cHMoY3VyX2NwdV9zcGVjLT5jcHVfZmVhdHVyZXMsCisJCQkJICBzdGFydDY0LCBzdGFydDY0ICsgc2l6ZTY0KTsKKworCXN0YXJ0NjQgPSBmaW5kX3NlY3Rpb242NCh2NjQtPmhkciwgIl9fZndfZnRyX2ZpeHVwIiwgJnNpemU2NCk7CisJaWYgKHN0YXJ0NjQpCisJCWRvX2ZlYXR1cmVfZml4dXBzKHBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMsCisJCQkJICBzdGFydDY0LCBzdGFydDY0ICsgc2l6ZTY0KTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KKworCXN0YXJ0MzIgPSBmaW5kX3NlY3Rpb24zMih2MzItPmhkciwgIl9fZnRyX2ZpeHVwIiwgJnNpemUzMik7CisJaWYgKHN0YXJ0MzIpCisJCWRvX2ZlYXR1cmVfZml4dXBzKGN1cl9jcHVfc3BlYy0+Y3B1X2ZlYXR1cmVzLAorCQkJCSAgc3RhcnQzMiwgc3RhcnQzMiArIHNpemUzMik7CisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwlzdGFydDMyID0gZmluZF9zZWN0aW9uMzIodjMyLT5oZHIsICJfX2Z3X2Z0cl9maXh1cCIsICZzaXplMzIpOworCWlmIChzdGFydDMyKQorCQlkb19mZWF0dXJlX2ZpeHVwcyhwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzLAorCQkJCSAgc3RhcnQzMiwgc3RhcnQzMiArIHNpemUzMik7CisjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIF9faW5pdCBpbnQgdmRzb19maXh1cF9hbHRfZnVuY3Moc3RydWN0IGxpYjMyX2VsZmluZm8gKnYzMiwKIAkJCQkgICAgICAgc3RydWN0IGxpYjY0X2VsZmluZm8gKnY2NCkKIHsKQEAgLTYzNCw2ICs2NzMsOSBAQAogCWlmICh2ZHNvX2ZpeHVwX2RhdGFwYWdlKCZ2MzIsICZ2NjQpKQogCQlyZXR1cm4gLTE7CiAKKwlpZiAodmRzb19maXh1cF9mZWF0dXJlcygmdjMyLCAmdjY0KSkKKwkJcmV0dXJuIC0xOworCiAJaWYgKHZkc29fZml4dXBfYWx0X2Z1bmNzKCZ2MzIsICZ2NjQpKQogCQlyZXR1cm4gLTE7CiAKQEAgLTcxNCw2ICs3NTYsNyBAQAogCSAqIFNldHVwIHRoZSBzeXNjYWxsIG1hcCBpbiB0aGUgdkRPUwogCSAqLwogCXZkc29fc2V0dXBfc3lzY2FsbF9tYXAoKTsKKwogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgdkRTTyBpbWFnZXMgaW4gbWVtb3J5LCB0aGF0IGlzIGRvIG5lY2Vzc2FyeQogCSAqIGZpeHVwcyBvZiB2RFNPIHN5bWJvbHMsIGxvY2F0ZSB0cmFtcG9saW5lcywgZXRjLi4uCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi92ZHNvMzIubGRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28zMi92ZHNvMzIubGRzLlMKaW5kZXggNjE4N2FmMi4uMjZlMTM4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvMzIvdmRzbzMyLmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzMyL3Zkc28zMi5sZHMuUwpAQCAtMzIsNiArMzIsMTggQEAKICAgUFJPVklERSAoX2V0ZXh0ID0gLik7CiAgIFBST1ZJREUgKGV0ZXh0ID0gLik7CiAKKyAgLiA9IEFMSUdOKDgpOworICBfX2Z0cl9maXh1cCA6IHsKKyAgICAqKF9fZnRyX2ZpeHVwKQorICB9CisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKyAgLiA9IEFMSUdOKDgpOworICBfX2Z3X2Z0cl9maXh1cCA6IHsKKyAgICAqKF9fZndfZnRyX2ZpeHVwKQorICB9CisjZW5kaWYKKwogICAvKiBPdGhlciBzdHVmZiBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dCBzZWdtZW50OiAqLwogICAucm9kYXRhCQk6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQogICAucm9kYXRhMQkJOiB7ICooLnJvZGF0YTEpIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L2dldHRpbWVvZmRheS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMKaW5kZXggNTZlNzZmZi4uNDBmZmQ5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMKQEAgLTIyOSw4ICsyMjksMTAgQEAKIAl4b3IJcjAscjgscjgJCS8qIGNyZWF0ZSBkZXBlbmRlbmN5ICovCiAJYWRkCXIzLHIzLHIwCiAKLQkvKiBHZXQgVEIgJiBvZmZzZXQgaXQgKi8KLQltZnRiCXI3CisJLyogR2V0IFRCICYgb2Zmc2V0IGl0LiBXZSB1c2UgdGhlIE1GVEIgbWFjcm8gd2hpY2ggd2lsbCBnZW5lcmF0ZQorCSAqIHdvcmthcm91bmQgY29kZSBmb3IgQ2VsbC4KKwkgKi8KKwlNRlRCKHI3KQogCWxkCXI5LENGR19UQl9PUklHX1NUQU1QKHIzKQogCXN1YmYJcjcscjkscjcKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvdmRzbzY0Lmxkcy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvdmRzbzY0Lmxkcy5TCmluZGV4IDRhMmI2ZGMuLjJkNzBmMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L3Zkc282NC5sZHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC92ZHNvNjQubGRzLlMKQEAgLTMxLDYgKzMxLDE2IEBACiAgIFBST1ZJREUgKF9ldGV4dCA9IC4pOwogICBQUk9WSURFIChldGV4dCA9IC4pOwogCisgIC4gPSBBTElHTig4KTsKKyAgX19mdHJfZml4dXAgOiB7CisgICAgKihfX2Z0cl9maXh1cCkKKyAgfQorCisgIC4gPSBBTElHTig4KTsKKyAgX19md19mdHJfZml4dXAgOiB7CisgICAgKihfX2Z3X2Z0cl9maXh1cCkKKyAgfQorCiAgIC8qIE90aGVyIHN0dWZmIGlzIGFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNlZ21lbnQ6ICovCiAgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQogICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCmluZGV4IGNiODdlNzEuLmE4MGY4ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwpAQCAtODEsMjAgKzgxLDIwIEBACiAJCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKIAotCQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsCi0JCQkJImlibSxteS1kbWEtd2luZG93IiwgTlVMTCk7CisJCWRtYV93aW5kb3cgPSBnZXRfcHJvcGVydHkoZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSwKKwkJCQkJICAiaWJtLG15LWRtYS13aW5kb3ciLCBOVUxMKTsKIAkJaWYgKCFkbWFfd2luZG93KQogCQkJcmV0dXJuIE5VTEw7CiAKIAkJdGJsID0ga21hbGxvYyhzaXplb2YoKnRibCksIEdGUF9LRVJORUwpOwogCi0JCW9mX3BhcnNlX2RtYV93aW5kb3coZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgZG1hX3dpbmRvdywKLQkJCQkmdGJsLT5pdF9pbmRleCwgJm9mZnNldCwgJnNpemUpOworCQlvZl9wYXJzZV9kbWFfd2luZG93KGRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUsIGRtYV93aW5kb3csCisJCQkJICAgICZ0YmwtPml0X2luZGV4LCAmb2Zmc2V0LCAmc2l6ZSk7CiAKIAkJLyogVENFIHRhYmxlIHNpemUgLSBtZWFzdXJlZCBpbiB0Y2UgZW50cmllcyAqLwotCQl0YmwtPml0X3NpemUgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJCXRibC0+aXRfc2l6ZSA9IHNpemUgPj4gSU9NTVVfUEFHRV9TSElGVDsKIAkJLyogb2Zmc2V0IGZvciBWSU8gc2hvdWxkIGFsd2F5cyBiZSAwICovCi0JCXRibC0+aXRfb2Zmc2V0ID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CisJCXRibC0+aXRfb2Zmc2V0ID0gb2Zmc2V0ID4+IElPTU1VX1BBR0VfU0hJRlQ7CiAJCXRibC0+aXRfYnVzbm8gPSAwOwogCQl0YmwtPml0X3R5cGUgPSBUQ0VfVkI7CiAKQEAgLTExNyw3ICsxMTcsOCBAQAogewogCXdoaWxlIChpZHMtPnR5cGVbMF0gIT0gJ1wwJykgewogCQlpZiAoKHN0cm5jbXAoZGV2LT50eXBlLCBpZHMtPnR5cGUsIHN0cmxlbihpZHMtPnR5cGUpKSA9PSAwKSAmJgotCQkgICAgZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgaWRzLT5jb21wYXQpKQorCQkgICAgZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSwKKwkJCQkJIGlkcy0+Y29tcGF0KSkKIAkJCXJldHVybiBpZHM7CiAJCWlkcysrOwogCX0KQEAgLTE5OCw5ICsxOTksOSBAQAogLyogdmlvX2RldiByZWZjb3VudCBoaXQgMCAqLwogc3RhdGljIHZvaWQgX19kZXZpbml0IHZpb19kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRldi0+cGxhdGZvcm1fZGF0YSkgewotCQkvKiBYWFggZnJlZSBUQ0UgdGFibGUgKi8KLQkJb2Zfbm9kZV9wdXQoZGV2LT5wbGF0Zm9ybV9kYXRhKTsKKwlpZiAoZGV2LT5hcmNoZGF0YS5vZl9ub2RlKSB7CisJCS8qIFhYWCBzaG91bGQgZnJlZSBUQ0UgdGFibGUgKi8KKwkJb2Zfbm9kZV9wdXQoZGV2LT5hcmNoZGF0YS5vZl9ub2RlKTsKIAl9CiAJa2ZyZWUodG9fdmlvX2RldihkZXYpKTsKIH0KQEAgLTIxMCw3ICsyMTEsNyBAQAogICogQG9mX25vZGU6CVRoZSBPRiBub2RlIGZvciB0aGlzIGRldmljZS4KICAqCiAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIHZpb19kZXYgc3RydWN0dXJlIGZyb20gdGhlIGRhdGEgaW4KLSAqIG9mX25vZGUgKGRldi5wbGF0Zm9ybV9kYXRhKSBhbmQgYWRkcyBpdCB0byB0aGUgbGlzdCBvZiB2aXJ0dWFsIGRldmljZXMuCisgKiBvZl9ub2RlIGFuZCBhZGRzIGl0IHRvIHRoZSBsaXN0IG9mIHZpcnR1YWwgZGV2aWNlcy4KICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIHZpb19kZXYgb3IgTlVMTCBpZiBub2RlIGhhcwogICogTlVMTCBkZXZpY2VfdHlwZSBvciBjb21wYXRpYmxlIGZpZWxkcy4KICAqLwpAQCAtMjQwLDggKzI0MSw2IEBACiAJaWYgKHZpb2RldiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXZpb2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBvZl9ub2RlX2dldChvZl9ub2RlKTsKLQogCXZpb2Rldi0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob2Zfbm9kZSwgMCk7CiAKIAlzbnByaW50Zih2aW9kZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXgiLCAqdW5pdF9hZGRyZXNzKTsKQEAgLTI1NCw3ICsyNTMsMTAgQEAKIAkJaWYgKHVuaXRfYWRkcmVzcyAhPSBOVUxMKQogCQkJdmlvZGV2LT51bml0X2FkZHJlc3MgPSAqdW5pdF9hZGRyZXNzOwogCX0KLQl2aW9kZXYtPmlvbW11X3RhYmxlID0gdmlvX2J1aWxkX2lvbW11X3RhYmxlKHZpb2Rldik7CisJdmlvZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG9mX25vZGUpOworCXZpb2Rldi0+ZGV2LmFyY2hkYXRhLmRtYV9vcHMgPSAmZG1hX2lvbW11X29wczsKKwl2aW9kZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9IHZpb19idWlsZF9pb21tdV90YWJsZSh2aW9kZXYpOworCXZpb2Rldi0+ZGV2LmFyY2hkYXRhLm51bWFfbm9kZSA9IG9mX25vZGVfdG9fbmlkKG9mX25vZGUpOwogCiAJLyogaW5pdCBnZW5lcmljICdzdHJ1Y3QgZGV2aWNlJyBmaWVsZHM6ICovCiAJdmlvZGV2LT5kZXYucGFyZW50ID0gJnZpb19idXNfZGV2aWNlLmRldjsKQEAgLTI4NSwxMCArMjg3LDExIEBACiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpIHsKIAkJaW9tbXVfdmlvX2luaXQoKTsKLQkJdmlvX2J1c19kZXZpY2UuaW9tbXVfdGFibGUgPSAmdmlvX2lvbW11X3RhYmxlOworCQl2aW9fYnVzX2RldmljZS5kZXYuYXJjaGRhdGEuZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOworCQl2aW9fYnVzX2RldmljZS5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPSAmdmlvX2lvbW11X3RhYmxlOwogCQlpU2VyaWVzX3Zpb19kZXYgPSAmdmlvX2J1c19kZXZpY2UuZGV2OwogCX0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwogCiAJZXJyID0gYnVzX3JlZ2lzdGVyKCZ2aW9fYnVzX3R5cGUpOwogCWlmIChlcnIpIHsKQEAgLTMzNiw3ICszMzksNyBAQAogc3RhdGljIHNzaXplX3QgZGV2c3BlY19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gZGV2LT5hcmNoZGF0YS5vZl9ub2RlOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG9mX25vZGUgPyBvZl9ub2RlLT5mdWxsX25hbWUgOiAibm9uZSIpOwogfQpAQCAtMzUzLDYyICszNTYsNiBAQAogfQogRVhQT1JUX1NZTUJPTCh2aW9fdW5yZWdpc3Rlcl9kZXZpY2UpOwogCi1zdGF0aWMgZG1hX2FkZHJfdCB2aW9fbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLAotCQkJICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCXJldHVybiBpb21tdV9tYXBfc2luZ2xlKHRvX3Zpb19kZXYoZGV2KS0+aW9tbXVfdGFibGUsIHZhZGRyLCBzaXplLAotCQkJfjB1bCwgZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIHZvaWQgdmlvX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKLQkJICAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlpb21tdV91bm1hcF9zaW5nbGUodG9fdmlvX2RldihkZXYpLT5pb21tdV90YWJsZSwgZG1hX2hhbmRsZSwgc2l6ZSwKLQkJCWRpcmVjdGlvbik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlvX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAotCQlpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JcmV0dXJuIGlvbW11X21hcF9zZyhkZXYsIHRvX3Zpb19kZXYoZGV2KS0+aW9tbXVfdGFibGUsIHNnbGlzdCwKLQkJCW5lbGVtcywgfjB1bCwgZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIHZvaWQgdmlvX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCi0JCWludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLQlpb21tdV91bm1hcF9zZyh0b192aW9fZGV2KGRldiktPmlvbW11X3RhYmxlLCBzZ2xpc3QsIG5lbGVtcywgZGlyZWN0aW9uKTsKLX0KLQotc3RhdGljIHZvaWQgKnZpb19hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQkJICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKLXsKLQlyZXR1cm4gaW9tbXVfYWxsb2NfY29oZXJlbnQodG9fdmlvX2RldihkZXYpLT5pb21tdV90YWJsZSwgc2l6ZSwKLQkJCWRtYV9oYW5kbGUsIH4wdWwsIGZsYWcsIC0xKTsKLX0KLQotc3RhdGljIHZvaWQgdmlvX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQotewotCWlvbW11X2ZyZWVfY29oZXJlbnQodG9fdmlvX2RldihkZXYpLT5pb21tdV90YWJsZSwgc2l6ZSwgdmFkZHIsCi0JCQlkbWFfaGFuZGxlKTsKLX0KLQotc3RhdGljIGludCB2aW9fZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQotewotCXJldHVybiAxOwotfQotCi1zdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHZpb19kbWFfb3BzID0gewotCS5hbGxvY19jb2hlcmVudCA9IHZpb19hbGxvY19jb2hlcmVudCwKLQkuZnJlZV9jb2hlcmVudCA9IHZpb19mcmVlX2NvaGVyZW50LAotCS5tYXBfc2luZ2xlID0gdmlvX21hcF9zaW5nbGUsCi0JLnVubWFwX3NpbmdsZSA9IHZpb191bm1hcF9zaW5nbGUsCi0JLm1hcF9zZyA9IHZpb19tYXBfc2csCi0JLnVubWFwX3NnID0gdmlvX3VubWFwX3NnLAotCS5kbWFfc3VwcG9ydGVkID0gdmlvX2RtYV9zdXBwb3J0ZWQsCi19OwotCiBzdGF0aWMgaW50IHZpb19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewogCWNvbnN0IHN0cnVjdCB2aW9fZGV2ICp2aW9fZGV2ID0gdG9fdmlvX2RldihkZXYpOwpAQCAtNDIyLDEzICszNjksMTQgQEAKIAkJCWNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQogewogCWNvbnN0IHN0cnVjdCB2aW9fZGV2ICp2aW9fZGV2ID0gdG9fdmlvX2RldihkZXYpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIAljb25zdCBjaGFyICpjcDsKIAlpbnQgbGVuZ3RoOwogCiAJaWYgKCFudW1fZW52cCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkbiA9IGRldi0+YXJjaGRhdGEub2Zfbm9kZTsKIAlpZiAoIWRuKQogCQlyZXR1cm4gLUVOT0RFVjsKIAljcCA9IGdldF9wcm9wZXJ0eShkbiwgImNvbXBhdGlibGUiLCAmbGVuZ3RoKTsKQEAgLTQ2NSw3ICs0MTMsNyBAQAogKi8KIGNvbnN0IHZvaWQgKnZpb19nZXRfYXR0cmlidXRlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LCBjaGFyICp3aGljaCwgaW50ICpsZW5ndGgpCiB7Ci0JcmV0dXJuIGdldF9wcm9wZXJ0eSh2ZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgd2hpY2gsIGxlbmd0aCk7CisJcmV0dXJuIGdldF9wcm9wZXJ0eSh2ZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSwgd2hpY2gsIGxlbmd0aCk7CiB9CiBFWFBPUlRfU1lNQk9MKHZpb19nZXRfYXR0cmlidXRlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGNiMGU4ZDQuLjA0YjhlNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTMzLDYgKzMzLDcgQEAKIAogCS8qIFRleHQgYW5kIGdvdHMgKi8KIAkudGV4dCA6IHsKKwkJX3RleHQgPSAuOwogCQkqKC50ZXh0IC50ZXh0LiopCiAJCVNDSEVEX1RFWFQKIAkJTE9DS19URVhUCkBAIC02MSwxMSArNjIsNyBAQAogCQlfX3N0b3BfX19leF90YWJsZSA9IC47CiAJfQogCi0JX19idWdfdGFibGUgOiB7Ci0JCV9fc3RhcnRfX19idWdfdGFibGUgPSAuOwotCQkqKF9fYnVnX3RhYmxlKQotCQlfX3N0b3BfX19idWdfdGFibGUgPSAuOwotCX0KKwlCVUdfVEFCTEUKIAogLyoKICAqIEluaXQgc2VjdGlvbnMgZGlzY2FyZGVkIGF0IHJ1bnRpbWUKQEAgLTEwOCwxMyArMTA1LDcgQEAKIAogCS5pbml0Y2FsbC5pbml0IDogewogCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkJKiguaW5pdGNhbGwxLmluaXQpCi0JCSooLmluaXRjYWxsMi5pbml0KQotCQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkJKiguaW5pdGNhbGw0LmluaXQpCi0JCSooLmluaXRjYWxsNS5pbml0KQotCQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkJKiguaW5pdGNhbGw3LmluaXQpCisJCUlOSVRDQUxMUwogCQlfX2luaXRjYWxsX2VuZCA9IC47CiAJCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9zc3RlcC5jIGIvYXJjaC9wb3dlcnBjL2xpYi9zc3RlcC5jCmluZGV4IDk1OTBiYTcuLjdlOGRlZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvc3N0ZXAuYworKysgYi9hcmNoL3Bvd2VycGMvbGliL3NzdGVwLmMKQEAgLTksNiArOSw3IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zc3RlcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTI1LDcgKzI2LDcgQEAKIC8qCiAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbiB3b3VsZCBicmFuY2guCiAgKi8KLXN0YXRpYyBpbnQgYnJhbmNoX3Rha2VuKHVuc2lnbmVkIGludCBpbnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBicmFuY2hfdGFrZW4odW5zaWduZWQgaW50IGluc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBpbnQgYm8gPSAoaW5zdHIgPj4gMjEpICYgMHgxZjsKIAl1bnNpZ25lZCBpbnQgYmk7CkBAIC01MSw3ICs1Miw3IEBACiAgKiBvciAtMSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgb25lIHRoYXQgc2hvdWxkIG5vdCBiZSBzdGVwcGVkLAogICogc3VjaCBhcyBhbiByZmlkLCBvciBhIG10bXNyZCB0aGF0IHdvdWxkIGNsZWFyIE1TUl9SSS4KICAqLwotaW50IGVtdWxhdGVfc3RlcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc3RyKQoraW50IF9fa3Byb2JlcyBlbXVsYXRlX3N0ZXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnN0cikKIHsKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlLCByZDsKIAl1bnNpZ25lZCBsb25nIGludCBpbW07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKaW5kZXggOTM0NDFlNy4uMzhhODE5NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKQEAgLTgsNyArOCw3IEBACiAKIG9iai15CQkJCTo9IGZhdWx0Lm8gbWVtLm8gbG1iLm8KIG9iai0kKENPTkZJR19QUEMzMikJCSs9IGluaXRfMzIubyBwZ3RhYmxlXzMyLm8gbW11X2NvbnRleHRfMzIubwotaGFzaC0kKENPTkZJR19QUENfTVVMVElQTEFURk9STSkgOj0gaGFzaF9uYXRpdmVfNjQubworaGFzaC0kKENPTkZJR19QUENfTkFUSVZFKQk6PSBoYXNoX25hdGl2ZV82NC5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBpbml0XzY0Lm8gcGd0YWJsZV82NC5vIG1tdV9jb250ZXh0XzY0Lm8gXAogCQkJCSAgIGhhc2hfdXRpbHNfNjQubyBoYXNoX2xvd182NC5vIHRsYl82NC5vIFwKIAkJCQkgICBzbGJfbG93Lm8gc2xiLm8gc3RhYi5vIG1tYXAubyBpbWFsbG9jLm8gXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwppbmRleCBlOGZhNTA2Li4wM2FlYjNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwpAQCAtNDI2LDE4ICs0MjYsMjEgQEAKIAogCS8qIGtlcm5lbCBoYXMgYWNjZXNzZWQgYSBiYWQgYXJlYSAqLwogCi0JcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyByZXF1ZXN0IGZvciAiKTsKIAlzd2l0Y2ggKHJlZ3MtPnRyYXApIHsKLQkJY2FzZSAweDMwMDoKLQkJY2FzZSAweDM4MDoKLQkJCXByaW50aygiZGF0YSBhdCBhZGRyZXNzIDB4JTA4bHhcbiIsIHJlZ3MtPmRhcik7Ci0JCQlicmVhazsKLQkJY2FzZSAweDQwMDoKLQkJY2FzZSAweDQ4MDoKLQkJCXByaW50aygiaW5zdHJ1Y3Rpb24gZmV0Y2hcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoInVua25vd24gZmF1bHRcbiIpOworCWNhc2UgMHgzMDA6CisJY2FzZSAweDM4MDoKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyByZXF1ZXN0IGZvciAiCisJCQkiZGF0YSBhdCBhZGRyZXNzIDB4JTA4bHhcbiIsIHJlZ3MtPmRhcik7CisJCWJyZWFrOworCWNhc2UgMHg0MDA6CisJY2FzZSAweDQ4MDoKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyByZXF1ZXN0IGZvciAiCisJCQkiaW5zdHJ1Y3Rpb24gZmV0Y2hcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QgZm9yICIKKwkJCSJ1bmtub3duIGZhdWx0XG4iKTsKKwkJYnJlYWs7CiAJfQogCXByaW50ayhLRVJOX0FMRVJUICJGYXVsdGluZyBpbnN0cnVjdGlvbiBhZGRyZXNzOiAweCUwOGx4XG4iLAogCQlyZWdzLT5uaXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYwppbmRleCBjOTBmMTI0Li42ZjEwMTZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJY2xlYXJfYml0KEhQVEVfTE9DS19CSVQsIHdvcmQpOwogfQogCi1sb25nIG5hdGl2ZV9ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsIHVuc2lnbmVkIGxvbmcgdmEsCitzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9pbnNlcnQodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwLCB1bnNpZ25lZCBsb25nIHZhLAogCQkJdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyByZmxhZ3MsCiAJCQl1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKaW5kZXggMTkxNTY2MS4uYzBkMmE2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkgKiBOb3QgaW4gdGhlIGRldmljZS10cmVlLCBsZXQncyBmYWxsYmFjayBvbiBrbm93biBzaXplCiAJICogbGlzdCBmb3IgMTZNIGNhcGFibGUgR1AgJiBHUgogCSAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl8xNk1fUEFHRSkgJiYgIW1hY2hpbmVfaXMoaXNlcmllcykpCisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSXzE2TV9QQUdFKSkKIAkJbWVtY3B5KG1tdV9wc2l6ZV9kZWZzLCBtbXVfcHNpemVfZGVmYXVsdHNfZ3AsCiAJCSAgICAgICBzaXplb2YobW11X3BzaXplX2RlZmF1bHRzX2dwKSk7CiAgZm91bmQ6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCmluZGV4IDU2MTVhY2MuLjg5YzgzNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCkBAIC0xNDYsNiArMTQ2LDExIEBACiAJcmV0dXJuIGh1Z2VwdGVfb2Zmc2V0KGhwZHAsIGFkZHIpOwogfQogCitpbnQgaHVnZV9wbWRfdW5zaGFyZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqYWRkciwgcHRlX3QgKnB0ZXApCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfaHVnZXB0ZV9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBodWdlcGRfdCAqaHBkcCkKIHsKIAlwdGVfdCAqaHVnZXB0ZSA9IGh1Z2VwZF9wYWdlKCpocGRwKTsKQEAgLTQ4MCw5ICs0ODUsNiBAQAogCiAJbW0tPmNvbnRleHQuaGlnaF9odGxiX2FyZWFzIHw9IG5ld2FyZWFzOwogCi0JLyogdXBkYXRlIHRoZSBwYWNhIGNvcHkgb2YgdGhlIGNvbnRleHQgc3RydWN0ICovCi0JZ2V0X3BhY2EoKS0+Y29udGV4dCA9IG1tLT5jb250ZXh0OwotCiAJLyogdGhlIGNvbnRleHQgY2hhbmdlIG11c3QgbWFrZSBpdCB0byBtZW1vcnkgYmVmb3JlIHRoZSBmbHVzaCwKIAkgKiBzbyB0aGF0IGZ1cnRoZXIgU0xCIG1pc3NlcyBkbyB0aGUgcmlnaHQgdGhpbmcuICovCiAJbWIoKTsKQEAgLTQ5NCwxMSArNDk2LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCitpbnQgcHJlcGFyZV9odWdlcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBwZ29mZl90IHBnb2ZmKQogewogCWludCBlcnIgPSAwOwogCi0JaWYgKCAoYWRkcitsZW4pIDwgYWRkciApCisJaWYgKHBnb2ZmICYgKH5IUEFHRV9NQVNLID4+IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuICYgfkhQQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhZGRyICYgfkhQQUdFX01BU0spCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGFkZHIgPCAweDEwMDAwMDAwMFVMKQpAQCAtMTA0MSw3ICsxMDQ3LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCB6ZXJvX2N0b3Iodm9pZCAqYWRkciwga21lbV9jYWNoZV90ICpjYWNoZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIHplcm9fY3Rvcih2b2lkICphZGRyLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJbWVtc2V0KGFkZHIsIDAsIGttZW1fY2FjaGVfc2l6ZShjYWNoZSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ltYWxsb2MuYyBiL2FyY2gvcG93ZXJwYy9tbS9pbWFsbG9jLmMKaW5kZXggYWRkOGMxYS4uYzgzMTgxNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ltYWxsb2MuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlzdHJ1Y3Qgdm1fc3RydWN0ICp2bTIgPSBOVUxMOwogCXN0cnVjdCB2bV9zdHJ1Y3QgKm5ld192bSA9IE5VTEw7CiAJCi0Jdm0xID0gKHN0cnVjdCB2bV9zdHJ1Y3QgKikga21hbGxvYyhzaXplb2YoKnZtMSksIEdGUF9LRVJORUwpOworCXZtMSA9IGttYWxsb2Moc2l6ZW9mKCp2bTEpLCBHRlBfS0VSTkVMKTsKIAlpZiAodm0xCT09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcygpIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiBOVUxMOwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJCSAqIHVwcGVybW9zdCByZW1haW5kZXIsIGFuZCB1c2UgZXhpc3RpbmcgcGFyZW50IG9uZSBmb3IgdGhlCiAJCSAqIGxvd2VyIHJlbWFpbmRlciBvZiBwYXJlbnQgcmFuZ2UKIAkJICovCi0JCXZtMiA9IChzdHJ1Y3Qgdm1fc3RydWN0ICopIGttYWxsb2Moc2l6ZW9mKCp2bTIpLCBHRlBfS0VSTkVMKTsKKwkJdm0yID0ga21hbGxvYyhzaXplb2YoKnZtMiksIEdGUF9LRVJORUwpOwogCQlpZiAodm0yID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJa2ZyZWUodm0xKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCQkJYnJlYWs7CiAJfQogCQotCWFyZWEgPSAoc3RydWN0IHZtX3N0cnVjdCAqKSBrbWFsbG9jKHNpemVvZigqYXJlYSksIEdGUF9LRVJORUwpOworCWFyZWEgPSBrbWFsbG9jKHNpemVvZigqYXJlYSksIEdGUF9LRVJORUwpOwogCWlmICghYXJlYSkKIAkJcmV0dXJuIE5VTEw7CiAJYXJlYS0+ZmxhZ3MgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKaW5kZXggM2ZmMzc0Ni4uZDEyYTg3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJLyogR0ZQX0FUT01JQyB0byBhdm9pZCBtaWdodF9zbGVlcCB3YXJuaW5ncyBkdXJpbmcgYm9vdCAqLwogCQlrY29yZV9tZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2NvcmVfbGlzdCksIEdGUF9BVE9NSUMpOwogCQlpZiAoIWtjb3JlX21lbSkKLQkJCXBhbmljKCJtZW1faW5pdDoga21hbGxvYyBmYWlsZWRcbiIpOworCQkJcGFuaWMoIiVzOiBrbWFsbG9jIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAogCQlrY2xpc3RfYWRkKGtjb3JlX21lbSwgX192YShiYXNlKSwgc2l6ZSk7CiAJfQpAQCAtMTQxLDcgKzE0MSw3IEBACiB9CiBtb2R1bGVfaW5pdChzZXR1cF9rY29yZSk7CiAKLXN0YXRpYyB2b2lkIHplcm9fY3Rvcih2b2lkICphZGRyLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgemVyb19jdG9yKHZvaWQgKmFkZHIsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAltZW1zZXQoYWRkciwgMCwga21lbV9jYWNoZV9zaXplKGNhY2hlKSk7CiB9CkBAIC0xNjYsOSArMTY2LDkgQEAKIC8qIEh1Z2VwYWdlcyBuZWVkIG9uZSBleHRyYSBjYWNoZSwgaW5pdGlhbGl6ZWQgaW4gaHVnZXRsYnBhZ2UuYy4gIFdlCiAgKiBjYW4ndCBwdXQgaW50byB0aGUgdGFibGVzIGFib3ZlLCBiZWNhdXNlIEhQQUdFX1NISUZUIGlzIG5vdCBjb21waWxlCiAgKiB0aW1lIGNvbnN0YW50LiAqLwota21lbV9jYWNoZV90ICpwZ3RhYmxlX2NhY2hlW0FSUkFZX1NJWkUocGd0YWJsZV9jYWNoZV9zaXplKSsxXTsKK3N0cnVjdCBrbWVtX2NhY2hlICpwZ3RhYmxlX2NhY2hlW0FSUkFZX1NJWkUocGd0YWJsZV9jYWNoZV9zaXplKSsxXTsKICNlbHNlCi1rbWVtX2NhY2hlX3QgKnBndGFibGVfY2FjaGVbQVJSQVlfU0laRShwZ3RhYmxlX2NhY2hlX3NpemUpXTsKK3N0cnVjdCBrbWVtX2NhY2hlICpwZ3RhYmxlX2NhY2hlW0FSUkFZX1NJWkUocGd0YWJsZV9jYWNoZV9zaXplKV07CiAjZW5kaWYKIAogdm9pZCBwZ3RhYmxlX2NhY2hlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCmluZGV4IDlkYTAxZGMuLjI2Mjc5MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwpAQCAtMjk1LDYgKzI5NSw2MyBAQAogCXJldHVybiBsbWJfZW5kX29mX0RSQU0oKSAtIHN0YXJ0OwogfQogCisvKgorICogRXh0cmFjdCBOVU1BIGluZm9ybWF0aW9uIGZyb20gdGhlIGlibSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkKKyAqIG5vZGUuICBUaGlzIGFzc3VtZXMgbl9tZW1fe2FkZHIsc2l6ZX1fY2VsbHMgaGF2ZSBiZWVuIHNldC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX2RyY29uZl9tZW1vcnkoc3RydWN0IGRldmljZV9ub2RlICptZW1vcnkpCit7CisJY29uc3QgdW5zaWduZWQgaW50ICpsbSwgKmRtLCAqYWE7CisJdW5zaWduZWQgaW50IGxzLCBsZCwgbGE7CisJdW5zaWduZWQgaW50IG4sIGFhbSwgYWFsZW47CisJdW5zaWduZWQgbG9uZyBsbWJfc2l6ZSwgc2l6ZTsKKwlpbnQgbmlkLCBkZWZhdWx0X25pZCA9IDA7CisJdW5zaWduZWQgaW50IHN0YXJ0LCBhaSwgZmxhZ3M7CisKKwlsbSA9IGdldF9wcm9wZXJ0eShtZW1vcnksICJpYm0sbG1iLXNpemUiLCAmbHMpOworCWRtID0gZ2V0X3Byb3BlcnR5KG1lbW9yeSwgImlibSxkeW5hbWljLW1lbW9yeSIsICZsZCk7CisJYWEgPSBnZXRfcHJvcGVydHkobWVtb3J5LCAiaWJtLGFzc29jaWF0aXZpdHktbG9va3VwLWFycmF5cyIsICZsYSk7CisJaWYgKCFsbSB8fCAhZG0gfHwgIWFhIHx8CisJICAgIGxzIDwgc2l6ZW9mKHVuc2lnbmVkIGludCkgfHwgbGQgPCBzaXplb2YodW5zaWduZWQgaW50KSB8fAorCSAgICBsYSA8IDIgKiBzaXplb2YodW5zaWduZWQgaW50KSkKKwkJcmV0dXJuOworCisJbG1iX3NpemUgPSByZWFkX25fY2VsbHMobl9tZW1fc2l6ZV9jZWxscywgJmxtKTsKKwluID0gKmRtKys7CQkvKiBudW1iZXIgb2YgTE1CcyAqLworCWFhbSA9ICphYSsrOwkJLyogbnVtYmVyIG9mIGFzc29jaWF0aXZpdHkgbGlzdHMgKi8KKwlhYWxlbiA9ICphYSsrOwkJLyogbGVuZ3RoIG9mIGVhY2ggYXNzb2NpYXRpdml0eSBsaXN0ICovCisJaWYgKGxkIDwgKG4gKiAobl9tZW1fYWRkcl9jZWxscyArIDQpICsgMSkgKiBzaXplb2YodW5zaWduZWQgaW50KSB8fAorCSAgICBsYSA8IChhYW0gKiBhYWxlbiArIDIpICogc2l6ZW9mKHVuc2lnbmVkIGludCkpCisJCXJldHVybjsKKworCWZvciAoOyBuICE9IDA7IC0tbikgeworCQlzdGFydCA9IHJlYWRfbl9jZWxscyhuX21lbV9hZGRyX2NlbGxzLCAmZG0pOworCQlhaSA9IGRtWzJdOworCQlmbGFncyA9IGRtWzNdOworCQlkbSArPSA0OworCQkvKiAweDgwID09IHJlc2VydmVkLCAweDggPSBhc3NpZ25lZCB0byB1cyAqLworCQlpZiAoKGZsYWdzICYgMHg4MCkgfHwgIShmbGFncyAmIDB4OCkpCisJCQljb250aW51ZTsKKwkJbmlkID0gZGVmYXVsdF9uaWQ7CisJCS8qIGZsYWdzICYgMHg0MCBtZWFucyBhc3NvY2lhdGl2aXR5IGluZGV4IGlzIGludmFsaWQgKi8KKwkJaWYgKG1pbl9jb21tb25fZGVwdGggPiAwICYmIG1pbl9jb21tb25fZGVwdGggPD0gYWFsZW4gJiYKKwkJICAgIChmbGFncyAmIDB4NDApID09IDAgJiYgYWkgPCBhYW0pIHsKKwkJCS8qIHRoaXMgaXMgbGlrZSBvZl9ub2RlX3RvX25pZF9zaW5nbGUgKi8KKwkJCW5pZCA9IGFhW2FpICogYWFsZW4gKyBtaW5fY29tbW9uX2RlcHRoIC0gMV07CisJCQlpZiAobmlkID09IDB4ZmZmZiB8fCBuaWQgPj0gTUFYX05VTU5PREVTKQorCQkJCW5pZCA9IGRlZmF1bHRfbmlkOworCQl9CisJCW5vZGVfc2V0X29ubGluZShuaWQpOworCisJCXNpemUgPSBudW1hX2VuZm9yY2VfbWVtb3J5X2xpbWl0KHN0YXJ0LCBsbWJfc2l6ZSk7CisJCWlmICghc2l6ZSkKKwkJCWNvbnRpbnVlOworCisJCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBzdGFydCA+PiBQQUdFX1NISUZULAorCQkJCSAoc3RhcnQgPj4gUEFHRV9TSElGVCkgKyAoc2l6ZSA+PiBQQUdFX1NISUZUKSk7CisJfQorfQorCiBzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9udW1hX3Byb3BlcnRpZXModm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdSA9IE5VTEw7CkBAIC0zODUsNiArNDQyLDE0IEBACiAJCQlnb3RvIG5ld19yYW5nZTsKIAl9CiAKKwkvKgorCSAqIE5vdyBkbyB0aGUgc2FtZSB0aGluZyBmb3IgZWFjaCBMTUIgbGlzdGVkIGluIHRoZSBpYm0sZHluYW1pYy1tZW1vcnkKKwkgKiBwcm9wZXJ0eSBpbiB0aGUgaWJtLGR5bmFtaWMtcmVjb25maWd1cmF0aW9uLW1lbW9yeSBub2RlLgorCSAqLworCW1lbW9yeSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvaWJtLGR5bmFtaWMtcmVjb25maWd1cmF0aW9uLW1lbW9yeSIpOworCWlmIChtZW1vcnkpCisJCXBhcnNlX2RyY29uZl9tZW1vcnkobWVtb3J5KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwppbmRleCA4ZmNhY2IwLi4xODkxZGJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKQEAgLTE0MSwzMSArMTQxLDIxIEBACiAJX19mcmVlX3BhZ2UocHRlcGFnZSk7CiB9CiAKLSNpZm5kZWYgQ09ORklHX1BIWVNfNjRCSVQKIHZvaWQgX19pb21lbSAqCiBpb3JlbWFwKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gX19pb3JlbWFwKGFkZHIsIHNpemUsIF9QQUdFX05PX0NBQ0hFKTsKIH0KLSNlbHNlIC8qIENPTkZJR19QSFlTXzY0QklUICovCi12b2lkIF9faW9tZW0gKgotaW9yZW1hcDY0KHVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIF9faW9yZW1hcChhZGRyLCBzaXplLCBfUEFHRV9OT19DQUNIRSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGlvcmVtYXA2NCk7Ci0KLXZvaWQgX19pb21lbSAqCi1pb3JlbWFwKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlwaHlzX2FkZHJfdCBhZGRyNjQgPSBmaXh1cF9iaWdwaHlzX2FkZHIoYWRkciwgc2l6ZSk7Ci0KLQlyZXR1cm4gaW9yZW1hcDY0KGFkZHI2NCwgc2l6ZSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BIWVNfNjRCSVQgKi8KIEVYUE9SVF9TWU1CT0woaW9yZW1hcCk7CiAKIHZvaWQgX19pb21lbSAqCitpb3JlbWFwX2ZsYWdzKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gX19pb3JlbWFwKGFkZHIsIHNpemUsIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woaW9yZW1hcF9mbGFncyk7CisKK3ZvaWQgX19pb21lbSAqCiBfX2lvcmVtYXAocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgdiwgaTsKQEAgLTI2NCwyMCArMjU0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaW91bm1hcCk7CiAKLXZvaWQgX19pb21lbSAqaW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKikgKHBvcnQgKyBfSU9fQkFTRSk7Ci19Ci0KLXZvaWQgaW9wb3J0X3VubWFwKHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQkvKiBOb3RoaW5nIHRvIGRvICovCi19Ci1FWFBPUlRfU1lNQk9MKGlvcG9ydF9tYXApOwotRVhQT1JUX1NZTUJPTChpb3BvcnRfdW5tYXApOwotCi1pbnQKLW1hcF9wYWdlKHVuc2lnbmVkIGxvbmcgdmEsIHBoeXNfYWRkcl90IHBhLCBpbnQgZmxhZ3MpCitpbnQgbWFwX3BhZ2UodW5zaWduZWQgbG9uZyB2YSwgcGh5c19hZGRyX3QgcGEsIGludCBmbGFncykKIHsKIAlwbWRfdCAqcGQ7CiAJcHRlX3QgKnBnOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKaW5kZXggYWM2NGY0YS4uMTZlNGVlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICogX19pb3JlbWFwX2NvbSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGEsCitzdGF0aWMgdm9pZCBfX2lvbWVtICogX19pb3JlbWFwX2NvbShwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHBhLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZWEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpAQCAtMTI5LDIyICsxMjksMTIgQEAKIAlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSAoZWEgKyAoYWRkciAmIH5QQUdFX01BU0spKTsKIH0KIAotCi12b2lkIF9faW9tZW0gKgotaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gX19pb3JlbWFwKGFkZHIsIHNpemUsIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci19Ci0KLXZvaWQgX19pb21lbSAqIF9faW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKK3ZvaWQgX19pb21lbSAqIF9faW9yZW1hcChwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIHBhLCBlYTsKIAl2b2lkIF9faW9tZW0gKnJldDsKIAotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKWFkZHI7Ci0KIAkvKgogCSAqIENob29zZSBhbiBhZGRyZXNzIHRvIG1hcCBpdCB0by4KIAkgKiBPbmNlIHRoZSBpbWFsbG9jIHN5c3RlbSBpcyBydW5uaW5nLCB3ZSB1c2UgaXQuCkBAIC0xNzgsOSArMTY4LDI4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorCit2b2lkIF9faW9tZW0gKiBpb3JlbWFwKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEOworCisJaWYgKHBwY19tZC5pb3JlbWFwKQorCQlyZXR1cm4gcHBjX21kLmlvcmVtYXAoYWRkciwgc2l6ZSwgZmxhZ3MpOworCXJldHVybiBfX2lvcmVtYXAoYWRkciwgc2l6ZSwgZmxhZ3MpOworfQorCit2b2lkIF9faW9tZW0gKiBpb3JlbWFwX2ZsYWdzKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpZiAocHBjX21kLmlvcmVtYXApCisJCXJldHVybiBwcGNfbWQuaW9yZW1hcChhZGRyLCBzaXplLCBmbGFncyk7CisJcmV0dXJuIF9faW9yZW1hcChhZGRyLCBzaXplLCBmbGFncyk7Cit9CisKKwogI2RlZmluZSBJU19QQUdFX0FMSUdORUQoX3ZhbCkgKChfdmFsKSA9PSAoKF92YWwpICYgUEFHRV9NQVNLKSkKIAotaW50IF9faW9yZW1hcF9leHBsaWNpdCh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIGVhLAoraW50IF9faW9yZW1hcF9leHBsaWNpdChwaHlzX2FkZHJfdCBwYSwgdW5zaWduZWQgbG9uZyBlYSwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwpAQCAtMjM1LDEzICsyNDQsMTAgQEAKICAqCiAgKiBYWFgJd2hhdCBhYm91dCBjYWxscyBiZWZvcmUgbWVtX2luaXRfZG9uZSAoaWUgcHl0aG9uX2NvdW50ZXJtZWFzdXJlcygpKQogICovCi12b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0b2tlbikKK3ZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqdG9rZW4pCiB7CiAJdm9pZCAqYWRkcjsKIAotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlyZXR1cm47Ci0KIAlpZiAoIW1lbV9pbml0X2RvbmUpCiAJCXJldHVybjsKIAkKQEAgLTI1MCw2ICsyNTYsMTQgQEAKIAlpbV9mcmVlKGFkZHIpOwogfQogCit2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0b2tlbikKK3sKKwlpZiAocHBjX21kLmlvdW5tYXApCisJCXBwY19tZC5pb3VubWFwKHRva2VuKTsKKwllbHNlCisJCV9faW91bm1hcCh0b2tlbik7Cit9CisKIHN0YXRpYyBpbnQgaW91bm1hcF9zdWJzZXRfcmVnaW9ucyh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwpAQCAtMjY4LDcgKzI4Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpb3VubWFwX2V4cGxpY2l0KHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2ludCBfX2lvdW5tYXBfZXhwbGljaXQodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtMzAzLDggKzMxNywxMCBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGlvcmVtYXApOworRVhQT1JUX1NZTUJPTChpb3JlbWFwX2ZsYWdzKTsKIEVYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKIEVYUE9SVF9TWU1CT0woaW91bm1hcCk7CitFWFBPUlRfU1lNQk9MKF9faW91bm1hcCk7CiAKIHZvaWQgX19pb21lbSAqIHJlc2VydmVfcGhiX2lvc3BhY2UodW5zaWduZWQgbG9uZyBzaXplKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3NsYi5jIGIvYXJjaC9wb3dlcnBjL21tL3NsYi5jCmluZGV4IGQzNzMzOTEuLjIyNGU5NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9zbGIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc2xiLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCiAjaWZkZWYgREVCVUcKQEAgLTE5Myw2ICsxOTQsNyBAQAogdm9pZCBzbGJfaW5pdGlhbGl6ZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbGluZWFyX2xscCwgdm1hbGxvY19sbHAsIGlvX2xscDsKKwl1bnNpZ25lZCBsb25nIGxmbGFncywgdmZsYWdzOwogCXN0YXRpYyBpbnQgc2xiX2VuY29kaW5nX2luaXRlZDsKIAlleHRlcm4gdW5zaWduZWQgaW50ICpzbGJfbWlzc19rZXJuZWxfbG9hZF9saW5lYXI7CiAJZXh0ZXJuIHVuc2lnbmVkIGludCAqc2xiX21pc3Nfa2VybmVsX2xvYWRfaW87CkBAIC0yMjUsMTEgKzIyNywxMiBAQAogI2VuZGlmCiAJfQogCisJZ2V0X3BhY2EoKS0+c3RhYl9yciA9IFNMQl9OVU1fQk9MVEVEOworCiAJLyogT24gaVNlcmllcyB0aGUgYm9sdGVkIGVudHJpZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IHVwIGJ5CiAJICogdGhlIGh5cGVydmlzb3IgZnJvbSB0aGUgbHBhck1hcCBkYXRhIGluIGhlYWQuUyAqLwotI2lmbmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLSB7Ci0JdW5zaWduZWQgbG9uZyBsZmxhZ3MsIHZmbGFnczsKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcmV0dXJuOwogCiAJbGZsYWdzID0gU0xCX1ZTSURfS0VSTkVMIHwgbGluZWFyX2xscDsKIAl2ZmxhZ3MgPSBTTEJfVlNJRF9LRVJORUwgfCB2bWFsbG9jX2xscDsKQEAgLTI0Nyw4ICsyNTAsNCBAQAogCSAqIGVsc2V3aGVyZSwgd2UnbGwgY2FsbCBfc3dpdGNoKCkgd2hpY2ggd2lsbCBib2x0IGluIHRoZSBuZXcKIAkgKiBvbmUuICovCiAJYXNtIHZvbGF0aWxlKCJpc3luYyI6OjoibWVtb3J5Iik7Ci0gfQotI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwotCi0JZ2V0X3BhY2EoKS0+c3RhYl9yciA9IFNMQl9OVU1fQk9MVEVEOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlCmluZGV4IDMxNDVkNjEuLjRjY2VmMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUKQEAgLTExLDYgKzExLDcgQEAKIAkJdGltZXJfaW50Lm8gKQogCiBvcHJvZmlsZS15IDo9ICQoRFJJVkVSX09CSlMpIGNvbW1vbi5vIGJhY2t0cmFjZS5vCitvcHJvZmlsZS0kKENPTkZJR19QUENfQ0VMTF9OQVRJVkUpICs9IG9wX21vZGVsX2NlbGwubwogb3Byb2ZpbGUtJChDT05GSUdfUFBDNjQpICs9IG9wX21vZGVsX3JzNjQubyBvcF9tb2RlbF9wb3dlcjQubwogb3Byb2ZpbGUtJChDT05GSUdfRlNMX0JPT0tFKSArPSBvcF9tb2RlbF9mc2xfYm9va2Uubwotb3Byb2ZpbGUtJChDT05GSUdfUFBDMzIpICs9IG9wX21vZGVsXzc0NTAubworb3Byb2ZpbGUtJChDT05GSUdfNnh4KSArPSBvcF9tb2RlbF83NDUwLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYwppbmRleCBmZDBiYmJlLi5iNmQ4MjM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCkBAIC0zNCw2ICszNCwxMSBAQAogCW1vZGVsLT5oYW5kbGVfaW50ZXJydXB0KHJlZ3MsIGN0cik7CiB9CiAKK3N0YXRpYyB2b2lkIG9wX3Bvd2VycGNfY3B1X3NldHVwKHZvaWQgKmR1bW15KQoreworCW1vZGVsLT5jcHVfc2V0dXAoY3RyKTsKK30KKwogc3RhdGljIGludCBvcF9wb3dlcnBjX3NldHVwKHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTQ3LDcgKzUyLDcgQEAKIAltb2RlbC0+cmVnX3NldHVwKGN0ciwgJnN5cywgbW9kZWwtPm51bV9jb3VudGVycyk7CiAKIAkvKiBDb25maWd1cmUgdGhlIHJlZ2lzdGVycyBvbiBhbGwgY3B1cy4gICovCi0Jb25fZWFjaF9jcHUobW9kZWwtPmNwdV9zZXR1cCwgTlVMTCwgMCwgMSk7CisJb25fZWFjaF9jcHUob3BfcG93ZXJwY19jcHVfc2V0dXAsIE5VTEwsIDAsIDEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NCw3ICs2OSwxMCBAQAogCiBzdGF0aWMgaW50IG9wX3Bvd2VycGNfc3RhcnQodm9pZCkKIHsKLQlvbl9lYWNoX2NwdShvcF9wb3dlcnBjX2NwdV9zdGFydCwgTlVMTCwgMCwgMSk7CisJaWYgKG1vZGVsLT5nbG9iYWxfc3RhcnQpCisJCW1vZGVsLT5nbG9iYWxfc3RhcnQoY3RyKTsKKwlpZiAobW9kZWwtPnN0YXJ0KQorCQlvbl9lYWNoX2NwdShvcF9wb3dlcnBjX2NwdV9zdGFydCwgTlVMTCwgMCwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc1LDcgKzgzLDEwIEBACiAKIHN0YXRpYyB2b2lkIG9wX3Bvd2VycGNfc3RvcCh2b2lkKQogewotCW9uX2VhY2hfY3B1KG9wX3Bvd2VycGNfY3B1X3N0b3AsIE5VTEwsIDAsIDEpOworCWlmIChtb2RlbC0+c3RvcCkKKwkJb25fZWFjaF9jcHUob3BfcG93ZXJwY19jcHVfc3RvcCwgTlVMTCwgMCwgMSk7CisgICAgICAgIGlmIChtb2RlbC0+Z2xvYmFsX3N0b3ApCisgICAgICAgICAgICAgICAgbW9kZWwtPmdsb2JhbF9zdG9wKCk7CiB9CiAKIHN0YXRpYyBpbnQgb3BfcG93ZXJwY19jcmVhdGVfZmlsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGRlbnRyeSAqcm9vdCkKQEAgLTEzNiwxMyArMTQ3LDE5IEBACiAKIAlzd2l0Y2ggKGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfdHlwZSkgewogI2lmZGVmIENPTkZJR19QUEM2NAorI2lmZGVmIENPTkZJR19QUENfQ0VMTF9OQVRJVkUKKwkJY2FzZSBQUENfT1BST0ZJTEVfQ0VMTDoKKwkJCW1vZGVsID0gJm9wX21vZGVsX2NlbGw7CisJCQlicmVhazsKKyNlbmRpZgogCQljYXNlIFBQQ19PUFJPRklMRV9SUzY0OgogCQkJbW9kZWwgPSAmb3BfbW9kZWxfcnM2NDsKIAkJCWJyZWFrOwogCQljYXNlIFBQQ19PUFJPRklMRV9QT1dFUjQ6CiAJCQltb2RlbCA9ICZvcF9tb2RlbF9wb3dlcjQ7CiAJCQlicmVhazsKLSNlbHNlCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfNnh4CiAJCWNhc2UgUFBDX09QUk9GSUxFX0c0OgogCQkJbW9kZWwgPSAmb3BfbW9kZWxfNzQ1MDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsXzc0NTAuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF83NDUwLmMKaW5kZXggZDhlZTNhZS4uZjQ4MWMwZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsXzc0NTAuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfNzQ1MC5jCkBAIC04MSw3ICs4MSw3IEBACiAKIC8qIENvbmZpZ3VyZXMgdGhlIGNvdW50ZXJzIG9uIHRoaXMgQ1BVIGJhc2VkIG9uIHRoZSBnbG9iYWwKICAqIHNldHRpbmdzICovCi1zdGF0aWMgdm9pZCBmc2w3NDUwX2NwdV9zZXR1cCh2b2lkICp1bnVzZWQpCitzdGF0aWMgdm9pZCBmc2w3NDUwX2NwdV9zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKIHsKIAkvKiBmcmVlemUgYWxsIGNvdW50ZXJzICovCiAJcG1jX3N0b3BfY3RycygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2NlbGwuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViMTVmMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMKQEAgLTAsMCArMSw3MjQgQEAKKy8qCisgKiBDZWxsIEJyb2FkYmFuZCBFbmdpbmUgT1Byb2ZpbGUgU3VwcG9ydAorICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDYKKyAqCisgKiBBdXRob3I6IERhdmlkIEVyYiAoZGplcmJAdXMuaWJtLmNvbSkKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiAgICAgICAgIENhcmwgTG92ZSA8Y2FybGxAdXMuaWJtLmNvbT4KKyAqICAgICAgICAgTWF5bmFyZCBKb2huc29uIDxtYXluYXJkakB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9jZWxsLXBtdS5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9vcHJvZmlsZV9pbXBsLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIi4uL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5oIgorCisjZGVmaW5lIFBQVV9DWUNMRVNfRVZFTlRfTlVNIDEJLyogIGV2ZW50IG51bWJlciBmb3IgQ1lDTEVTICovCisjZGVmaW5lIENCRV9DT1VOVF9BTExfQ1lDTEVTIDB4NDI4MDAwMDAJLyogUFBVIGN5Y2xlIGV2ZW50IHNwZWNpZmllciAqLworCisjZGVmaW5lIE5VTV9USFJFQURTIDIKKyNkZWZpbmUgVklSVF9DTlRSX1NXX1RJTUVfTlMgMTAwMDAwMDAwCS8vIDAuNSBzZWNvbmRzCisKK3N0cnVjdCBwbWNfY250cmxfZGF0YSB7CisJdW5zaWduZWQgbG9uZyB2Y250cjsKKwl1bnNpZ25lZCBsb25nIGV2bnRzOworCXVuc2lnbmVkIGxvbmcgbWFza3M7CisJdW5zaWduZWQgbG9uZyBlbmFibGVkOworfTsKKworLyoKKyAqIGlibSxjYmUtcGVyZnRvb2xzIHJ0YXMgcGFyYW1ldGVycworICovCisKK3N0cnVjdCBwbV9zaWduYWwgeworCXUxNiBjcHU7CQkvKiBQcm9jZXNzb3IgdG8gbW9kaWZ5ICovCisJdTE2IHN1Yl91bml0OwkJLyogaHcgc3VidW5pdCB0aGlzIGFwcGxpZXMgdG8gKGlmIGFwcGxpY2FibGUpICovCisJdTE2IHNpZ25hbF9ncm91cDsJLyogU2lnbmFsIEdyb3VwIHRvIEVuYWJsZS9EaXNhYmxlICovCisJdTggYnVzX3dvcmQ7CQkvKiBFbmFibGUvRGlzYWJsZSBvbiB0aGlzIFRyYWNlL1RyaWdnZXIvRXZlbnQKKwkJCQkgKiBCdXMgV29yZChzKSAoYml0bWFzaykKKwkJCQkgKi8KKwl1OCBiaXQ7CQkJLyogVHJpZ2dlci9FdmVudCBiaXQgKGlmIGFwcGxpY2FibGUpICovCit9OworCisvKgorICogcnRhcyBjYWxsIGFyZ3VtZW50cworICovCitlbnVtIHsKKwlTVUJGVU5DX1JFU0VUID0gMSwKKwlTVUJGVU5DX0FDVElWQVRFID0gMiwKKwlTVUJGVU5DX0RFQUNUSVZBVEUgPSAzLAorCisJUEFTU1RIUlVfSUdOT1JFID0gMCwKKwlQQVNTVEhSVV9FTkFCTEUgPSAxLAorCVBBU1NUSFJVX0RJU0FCTEUgPSAyLAorfTsKKworc3RydWN0IHBtX2NudHJsIHsKKwl1MTYgZW5hYmxlOworCXUxNiBzdG9wX2F0X21heDsKKwl1MTYgdHJhY2VfbW9kZTsKKwl1MTYgZnJlZXplOworCXUxNiBjb3VudF9tb2RlOworfTsKKworc3RhdGljIHN0cnVjdCB7CisJdTMyIGdyb3VwX2NvbnRyb2w7CisJdTMyIGRlYnVnX2J1c19jb250cm9sOworCXN0cnVjdCBwbV9jbnRybCBwbV9jbnRybDsKKwl1MzIgcG0wN19jbnRybFtOUl9QSFlTX0NUUlNdOworfSBwbV9yZWdzOworCisKKyNkZWZpbmUgR0VUX1NVQl9VTklUKHgpICgoeCAmIDB4MDAwMGYwMDApID4+IDEyKQorI2RlZmluZSBHRVRfQlVTX1dPUkQoeCkgKCh4ICYgMHgwMDAwMDBmMCkgPj4gNCkKKyNkZWZpbmUgR0VUX0JVU19UWVBFKHgpICgoeCAmIDB4MDAwMDAzMDApID4+IDgpCisjZGVmaW5lIEdFVF9QT0xBUklUWSh4KSAoKHggJiAweDAwMDAwMDAyKSA+PiAxKQorI2RlZmluZSBHRVRfQ09VTlRfQ1lDTEVTKHgpICh4ICYgMHgwMDAwMDAwMSkKKyNkZWZpbmUgR0VUX0lOUFVUX0NPTlRST0woeCkgKCh4ICYgMHgwMDAwMDAwNCkgPj4gMikKKworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZ1tOUl9QSFlTX0NUUlNdLCBwbWNfdmFsdWVzKTsKKworc3RhdGljIHN0cnVjdCBwbWNfY250cmxfZGF0YSBwbWNfY250cmxbTlVNX1RIUkVBRFNdW05SX1BIWVNfQ1RSU107CisKKy8qIEludGVycGV0YXRpb24gb2YgaGR3X3RocmVhZDoKKyAqIDAgLSBldmVuIHZpcnR1YWwgY3B1cyAwLCAyLCA0LC4uLgorICogMSAtIG9kZCB2aXJ0dWFsIGNwdXMgMSwgMywgNSwgLi4uCisgKi8KK3N0YXRpYyB1MzIgaGR3X3RocmVhZDsKKworc3RhdGljIHUzMiB2aXJ0X2NudHJfaW50ZXJfbWFzazsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl92aXJ0X2NudHI7CisKKy8qIHBtX3NpZ25hbCBuZWVkcyB0byBiZSBnbG9iYWwgc2luY2UgaXQgaXMgaW5pdGlhbGl6ZWQgaW4KKyAqIGNlbGxfcmVnX3NldHVwIGF0IHRoZSB0aW1lIHdoZW4gdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICogaXMgYXZhaWxhYmxlLgorICovCitzdGF0aWMgc3RydWN0IHBtX3NpZ25hbCBwbV9zaWduYWxbTlJfUEhZU19DVFJTXTsKK3N0YXRpYyBpbnQgcG1fcnRhc190b2tlbjsKKworc3RhdGljIHUzMiByZXNldF92YWx1ZVtOUl9QSFlTX0NUUlNdOworc3RhdGljIGludCBudW1fY291bnRlcnM7CitzdGF0aWMgaW50IG9wcm9maWxlX3J1bm5pbmc7CitzdGF0aWMgc3BpbmxvY2tfdCB2aXJ0X2NudHJfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworc3RhdGljIHUzMiBjdHJfZW5hYmxlZDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJhY2VfYnVzWzRdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5wdXRfYnVzWzJdOworCisvKgorICogRmlybXdhcmUgaW50ZXJmYWNlIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50CitydGFzX2libV9jYmVfcGVyZnRvb2xzKGludCBzdWJmdW5jLCBpbnQgcGFzc3RocnUsCisJCSAgICAgICB2b2lkICphZGRyZXNzLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwl1NjQgcGFkZHIgPSBfX3BhKGFkZHJlc3MpOworCisJcmV0dXJuIHJ0YXNfY2FsbChwbV9ydGFzX3Rva2VuLCA1LCAxLCBOVUxMLCBzdWJmdW5jLCBwYXNzdGhydSwKKwkJCSBwYWRkciA+PiAzMiwgcGFkZHIgJiAweGZmZmZmZmZmLCBsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBwbV9ydGFzX3Jlc2V0X3NpZ25hbHModTMyIG5vZGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcG1fc2lnbmFsIHBtX3NpZ25hbF9sb2NhbDsKKworCS8qICBUaGUgZGVidWcgYnVzIGlzIGJlaW5nIHNldCB0byB0aGUgcGFzc3RocnUgZGlzYWJsZSBzdGF0ZS4KKwkgKiAgSG93ZXZlciwgdGhlIEZXIHN0aWxsIGV4cGVjdHMgYXRsZWFzdCBvbmUgbGVnYWwgc2lnbmFsIHJvdXRpbmcKKwkgKiAgZW50cnkgb3IgaXQgd2lsbCByZXR1cm4gYW4gZXJyb3Igb24gdGhlIGFyZ3VtZW50cy4gIElmIHdlIGRvbid0CisJICogIHN1cHBseSBhIHZhbGlkIGVudHJ5LCB3ZSBtdXN0IGlnbm9yZSBhbGwgcmV0dXJuIHZhbHVlcy4gIElnbm9yaW5nCisJICogIGFsbCByZXR1cm4gdmFsdWVzIG1lYW5zIHdlIG1pZ2h0IG1pc3MgYW4gZXJyb3Igd2Ugc2hvdWxkIGJlCisJICogIGNvbmNlcm5lZCBhYm91dC4KKwkgKi8KKworCS8qICBmdyBleHBlY3RzIHBoeXNpY2FsIGNwdSAjLiAqLworCXBtX3NpZ25hbF9sb2NhbC5jcHUgPSBub2RlOworCXBtX3NpZ25hbF9sb2NhbC5zaWduYWxfZ3JvdXAgPSAyMTsKKwlwbV9zaWduYWxfbG9jYWwuYnVzX3dvcmQgPSAxOworCXBtX3NpZ25hbF9sb2NhbC5zdWJfdW5pdCA9IDA7CisJcG1fc2lnbmFsX2xvY2FsLmJpdCA9IDA7CisKKwlyZXQgPSBydGFzX2libV9jYmVfcGVyZnRvb2xzKFNVQkZVTkNfUkVTRVQsIFBBU1NUSFJVX0RJU0FCTEUsCisJCQkJICAgICAmcG1fc2lnbmFsX2xvY2FsLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBwbV9zaWduYWwpKTsKKworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBydGFzIHJldHVybmVkOiAlZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdGljIHZvaWQgcG1fcnRhc19hY3RpdmF0ZV9zaWduYWxzKHUzMiBub2RlLCB1MzIgY291bnQpCit7CisJaW50IHJldDsKKwlpbnQgajsKKwlzdHJ1Y3QgcG1fc2lnbmFsIHBtX3NpZ25hbF9sb2NhbFtOUl9QSFlTX0NUUlNdOworCisJZm9yIChqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKwkJLyogZncgZXhwZWN0cyBwaHlzaWNhbCBjcHUgIyAqLworCQlwbV9zaWduYWxfbG9jYWxbal0uY3B1ID0gbm9kZTsKKwkJcG1fc2lnbmFsX2xvY2FsW2pdLnNpZ25hbF9ncm91cCA9IHBtX3NpZ25hbFtqXS5zaWduYWxfZ3JvdXA7CisJCXBtX3NpZ25hbF9sb2NhbFtqXS5idXNfd29yZCA9IHBtX3NpZ25hbFtqXS5idXNfd29yZDsKKwkJcG1fc2lnbmFsX2xvY2FsW2pdLnN1Yl91bml0ID0gcG1fc2lnbmFsW2pdLnN1Yl91bml0OworCQlwbV9zaWduYWxfbG9jYWxbal0uYml0ID0gcG1fc2lnbmFsW2pdLmJpdDsKKwl9CisKKwlyZXQgPSBydGFzX2libV9jYmVfcGVyZnRvb2xzKFNVQkZVTkNfQUNUSVZBVEUsIFBBU1NUSFJVX0VOQUJMRSwKKwkJCQkgICAgIHBtX3NpZ25hbF9sb2NhbCwKKwkJCQkgICAgIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBwbV9zaWduYWwpKTsKKworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBydGFzIHJldHVybmVkOiAlZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworLyoKKyAqIFBNIFNpZ25hbCBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgc2V0X3BtX2V2ZW50KHUzMiBjdHIsIGludCBldmVudCwgdTMyIHVuaXRfbWFzaykKK3sKKwlzdHJ1Y3QgcG1fc2lnbmFsICpwOworCXUzMiBzaWduYWxfYml0OworCXUzMiBidXNfd29yZCwgYnVzX3R5cGUsIGNvdW50X2N5Y2xlcywgcG9sYXJpdHksIGlucHV0X2NvbnRyb2w7CisJaW50IGosIGk7CisKKwlpZiAoZXZlbnQgPT0gUFBVX0NZQ0xFU19FVkVOVF9OVU0pIHsKKwkJLyogU3BlY2lhbCBFdmVudDogQ291bnQgYWxsIGNwdSBjeWNsZXMgKi8KKwkJcG1fcmVncy5wbTA3X2NudHJsW2N0cl0gPSBDQkVfQ09VTlRfQUxMX0NZQ0xFUzsKKwkJcCA9ICYocG1fc2lnbmFsW2N0cl0pOworCQlwLT5zaWduYWxfZ3JvdXAgPSAyMTsKKwkJcC0+YnVzX3dvcmQgPSAxOworCQlwLT5zdWJfdW5pdCA9IDA7CisJCXAtPmJpdCA9IDA7CisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCXBtX3JlZ3MucG0wN19jbnRybFtjdHJdID0gMDsKKwl9CisKKwlidXNfd29yZCA9IEdFVF9CVVNfV09SRCh1bml0X21hc2spOworCWJ1c190eXBlID0gR0VUX0JVU19UWVBFKHVuaXRfbWFzayk7CisJY291bnRfY3ljbGVzID0gR0VUX0NPVU5UX0NZQ0xFUyh1bml0X21hc2spOworCXBvbGFyaXR5ID0gR0VUX1BPTEFSSVRZKHVuaXRfbWFzayk7CisJaW5wdXRfY29udHJvbCA9IEdFVF9JTlBVVF9DT05UUk9MKHVuaXRfbWFzayk7CisJc2lnbmFsX2JpdCA9IChldmVudCAlIDEwMCk7CisKKwlwID0gJihwbV9zaWduYWxbY3RyXSk7CisKKwlwLT5zaWduYWxfZ3JvdXAgPSBldmVudCAvIDEwMDsKKwlwLT5idXNfd29yZCA9IGJ1c193b3JkOworCXAtPnN1Yl91bml0ID0gdW5pdF9tYXNrICYgMHgwMDAwZjAwMDsKKworCXBtX3JlZ3MucG0wN19jbnRybFtjdHJdID0gMDsKKwlwbV9yZWdzLnBtMDdfY250cmxbY3RyXSB8PSBQTTA3X0NUUl9DT1VOVF9DWUNMRVMoY291bnRfY3ljbGVzKTsKKwlwbV9yZWdzLnBtMDdfY250cmxbY3RyXSB8PSBQTTA3X0NUUl9QT0xBUklUWShwb2xhcml0eSk7CisJcG1fcmVncy5wbTA3X2NudHJsW2N0cl0gfD0gUE0wN19DVFJfSU5QVVRfQ09OVFJPTChpbnB1dF9jb250cm9sKTsKKworCWlmIChpbnB1dF9jb250cm9sID09IDApIHsKKwkJaWYgKHNpZ25hbF9iaXQgPiAzMSkgeworCQkJc2lnbmFsX2JpdCAtPSAzMjsKKwkJCWlmIChidXNfd29yZCA9PSAweDMpCisJCQkJYnVzX3dvcmQgPSAweDI7CisJCQllbHNlIGlmIChidXNfd29yZCA9PSAweGMpCisJCQkJYnVzX3dvcmQgPSAweDg7CisJCX0KKworCQlpZiAoKGJ1c190eXBlID09IDApICYmIHAtPnNpZ25hbF9ncm91cCA+PSA2MCkKKwkJCWJ1c190eXBlID0gMjsKKwkJaWYgKChidXNfdHlwZSA9PSAxKSAmJiBwLT5zaWduYWxfZ3JvdXAgPj0gNTApCisJCQlidXNfdHlwZSA9IDA7CisKKwkJcG1fcmVncy5wbTA3X2NudHJsW2N0cl0gfD0gUE0wN19DVFJfSU5QVVRfTVVYKHNpZ25hbF9iaXQpOworCX0gZWxzZSB7CisJCXBtX3JlZ3MucG0wN19jbnRybFtjdHJdID0gMDsKKwkJcC0+Yml0ID0gc2lnbmFsX2JpdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmIChidXNfd29yZCAmICgxIDw8IGkpKSB7CisJCQlwbV9yZWdzLmRlYnVnX2J1c19jb250cm9sIHw9CisJCQkgICAgKGJ1c190eXBlIDw8ICgzMSAtICgyICogaSkgKyAxKSk7CisKKwkJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCQlpZiAoaW5wdXRfYnVzW2pdID09IDB4ZmYpIHsKKwkJCQkJaW5wdXRfYnVzW2pdID0gaTsKKwkJCQkJcG1fcmVncy5ncm91cF9jb250cm9sIHw9CisJCQkJCSAgICAoaSA8PCAoMzEgLSBpKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK291dDoKKwk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3BtX2NudHJsKGludCBjcHUsIHN0cnVjdCBwbV9jbnRybCAqcG1fY250cmwpCit7CisJLyogT3Byb2ZpbGUgd2lsbCB1c2UgMzIgYml0IGNvdW50ZXJzLCBzZXQgYml0cyA3OjEwIHRvIDAgKi8KKwl1MzIgdmFsID0gMDsKKwlpZiAocG1fY250cmwtPmVuYWJsZSA9PSAxKQorCQl2YWwgfD0gQ0JFX1BNX0VOQUJMRV9QRVJGX01PTjsKKworCWlmIChwbV9jbnRybC0+c3RvcF9hdF9tYXggPT0gMSkKKwkJdmFsIHw9IENCRV9QTV9TVE9QX0FUX01BWDsKKworCWlmIChwbV9jbnRybC0+dHJhY2VfbW9kZSA9PSAxKQorCQl2YWwgfD0gQ0JFX1BNX1RSQUNFX01PREVfU0VUKHBtX2NudHJsLT50cmFjZV9tb2RlKTsKKworCWlmIChwbV9jbnRybC0+ZnJlZXplID09IDEpCisJCXZhbCB8PSBDQkVfUE1fRlJFRVpFX0FMTF9DVFJTOworCisJLyogUm91dGluZSBzZXRfY291bnRfbW9kZSBtdXN0IGJlIGNhbGxlZCBwcmV2aW91c2x5IHRvIHNldAorCSAqIHRoZSBjb3VudCBtb2RlIGJhc2VkIG9uIHRoZSB1c2VyIHNlbGVjdGlvbiBvZiB1c2VyIGFuZCBrZXJuZWwuCisJICovCisJdmFsIHw9IENCRV9QTV9DT1VOVF9NT0RFX1NFVChwbV9jbnRybC0+Y291bnRfbW9kZSk7CisJY2JlX3dyaXRlX3BtKGNwdSwgcG1fY29udHJvbCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRfY291bnRfbW9kZSh1MzIga2VybmVsLCB1MzIgdXNlciwgc3RydWN0IHBtX2NudHJsICpwbV9jbnRybCkKK3sKKwkvKiBUaGUgdXNlciBtdXN0IHNwZWNpZnkgdXNlciBhbmQga2VybmVsIGlmIHRoZXkgd2FudCB0aGVtLiBJZgorCSAqICBuZWl0aGVyIGlzIHNwZWNpZmllZCwgT1Byb2ZpbGUgd2lsbCBjb3VudCBpbiBoeXBlcnZpc29yIG1vZGUKKwkgKi8KKwlpZiAoa2VybmVsKSB7CisJCWlmICh1c2VyKQorCQkJcG1fY250cmwtPmNvdW50X21vZGUgPSBDQkVfQ09VTlRfQUxMX01PREVTOworCQllbHNlCisJCQlwbV9jbnRybC0+Y291bnRfbW9kZSA9IENCRV9DT1VOVF9TVVBFUlZJU09SX01PREU7CisJfSBlbHNlIHsKKwkJaWYgKHVzZXIpCisJCQlwbV9jbnRybC0+Y291bnRfbW9kZSA9IENCRV9DT1VOVF9QUk9CTEVNX01PREU7CisJCWVsc2UKKwkJCXBtX2NudHJsLT5jb3VudF9tb2RlID0gQ0JFX0NPVU5UX0hZUEVSVklTT1JfTU9ERTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfY3RyKHUzMiBjcHUsIHUzMiBjdHIsIHUzMiAqIHBtMDdfY250cmwpCit7CisKKwlwbTA3X2NudHJsW2N0cl0gfD0gUE0wN19DVFJfRU5BQkxFKDEpOworCWNiZV93cml0ZV9wbTA3X2NvbnRyb2woY3B1LCBjdHIsIHBtMDdfY250cmxbY3RyXSk7Cit9CisKKy8qCisgKiBPcHJvZmlsZSBpcyBleHBlY3RlZCB0byBjb2xsZWN0IGRhdGEgb24gYWxsIENQVXMgc2ltdWx0YW5lb3VzbHkuCisgKiBIb3dldmVyLCB0aGVyZSBpcyBvbmUgc2V0IG9mIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHBlciBub2RlLiAgVGhlcmUgYXJlCisgKiB0d28gaGFyZHdhcmUgdGhyZWFkcyBvciB2aXJ0dWFsIENQVXMgb24gZWFjaCBub2RlLiAgSGVuY2UsIE9Qcm9maWxlIG11c3QKKyAqIG11bHRpcGxleCBpbiB0aW1lIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVyIGNvbGxlY3Rpb24gb24gdGhlIHR3byB2aXJ0dWFsCisgKiBDUFVzLiAgVGhlIG11bHRpcGxleGluZyBvZiB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgaXMgZG9uZSBieSB0aGlzCisgKiB2aXJ0dWFsIGNvdW50ZXIgcm91dGluZS4KKyAqCisgKiBUaGUgcG1jX3ZhbHVlcyB1c2VkIGJlbG93IGlzIGRlZmluZWQgYXMgJ3Blci1jcHUnIGJ1dCBpdHMgdXNlIGlzCisgKiBtb3JlIGFraW4gdG8gJ3Blci1ub2RlJy4gIFdlIG5lZWQgdG8gc3RvcmUgdHdvIHNldHMgb2YgY291bnRlcgorICogdmFsdWVzIHBlciBub2RlIC0tIG9uZSBmb3IgdGhlIHByZXZpb3VzIHJ1biBhbmQgb25lIGZvciB0aGUgbmV4dC4KKyAqIFRoZSBwZXItY3B1W05SX1BIWVNfQ1RSU10gZ2l2ZXMgdXMgdGhlIHN0b3JhZ2Ugd2UgbmVlZC4gIEVhY2ggb2RkL2V2ZW4KKyAqIHBhaXIgb2YgcGVyLWNwdSBhcnJheXMgaXMgdXNlZCBmb3Igc3RvcmluZyB0aGUgcHJldmlvdXMgYW5kIG5leHQKKyAqIHBtYyB2YWx1ZXMgZm9yIGEgZ2l2ZW4gbm9kZS4KKyAqIE5PVEU6IFdlIHVzZSB0aGUgcGVyLWNwdSB2YXJpYWJsZSB0byBpbXByb3ZlIGNhY2hlIHBlcmZvcm1hbmNlLgorICovCitzdGF0aWMgdm9pZCBjZWxsX3ZpcnR1YWxfY250cih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJLyogVGhpcyByb3V0aW5lIHdpbGwgYWx0ZXJuYXRlIGxvYWRpbmcgdGhlIHZpcnR1YWwgY291bnRlcnMgZm9yCisJICogdmlydHVhbCBDUFVzCisJICovCisJaW50IGksIHByZXZfaGR3X3RocmVhZCwgbmV4dF9oZHdfdGhyZWFkOworCXUzMiBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbnRlcnJ1cHRfaGFuZGVyIGFuZAorCSAqIHRoZSB2aXJ0IGNvdW50ZXIgYXJlIG5vdCBib3RoIHBsYXlpbmcgd2l0aAorCSAqIHRoZSBjb3VudGVycyBvbiB0aGUgc2FtZSBub2RlLgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpcnRfY250cl9sb2NrLCBmbGFncyk7CisKKwlwcmV2X2hkd190aHJlYWQgPSBoZHdfdGhyZWFkOworCisJLyogc3dpdGNoIHRoZSBjcHUgaGFuZGxpbmcgdGhlIGludGVycnVwdHMgKi8KKwloZHdfdGhyZWFkID0gMSBeIGhkd190aHJlYWQ7CisJbmV4dF9oZHdfdGhyZWFkID0gaGR3X3RocmVhZDsKKworCS8qIFRoZSBmb2xsb3dpbmcgaXMgZG9uZSBvbmx5IG9uY2UgcGVyIGVhY2ggbm9kZSwgYnV0CisJICogd2UgbmVlZCBjcHUgIywgbm90IG5vZGUgIywgdG8gcGFzcyB0byB0aGUgY2JlX3h4eCBmdW5jdGlvbnMuCisJICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNiZV9nZXRfaHdfdGhyZWFkX2lkKGNwdSkpCisJCQljb250aW51ZTsKKworCQkvKiBzdG9wIGNvdW50ZXJzLCBzYXZlIGNvdW50ZXIgdmFsdWVzLCByZXN0b3JlIGNvdW50cworCQkgKiBmb3IgcHJldmlvdXMgdGhyZWFkCisJCSAqLworCQljYmVfZGlzYWJsZV9wbShjcHUpOworCQljYmVfZGlzYWJsZV9wbV9pbnRlcnJ1cHRzKGNwdSk7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7IGkrKykgeworCQkJcGVyX2NwdShwbWNfdmFsdWVzLCBjcHUgKyBwcmV2X2hkd190aHJlYWQpW2ldCisJCQkgICAgPSBjYmVfcmVhZF9jdHIoY3B1LCBpKTsKKworCQkJaWYgKHBlcl9jcHUocG1jX3ZhbHVlcywgY3B1ICsgbmV4dF9oZHdfdGhyZWFkKVtpXQorCQkJICAgID09IDB4RkZGRkZGRkYpCisJCQkJLyogSWYgdGhlIGNudHIgdmFsdWUgaXMgMHhmZmZmZmZmZiwgd2UgbXVzdAorCQkJCSAqIHJlc2V0IHRoYXQgdG8gMHhmZmZmZmZmMCB3aGVuIHRoZSBjdXJyZW50CisJCQkJICogdGhyZWFkIGlzIHJlc3RhcnRlZC4gIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIG5ldworCQkJCSAqIGludGVycnVwdCBhbmQgbWFrZSBzdXJlIHRoYXQgd2UgbmV2ZXIgcmVzdG9yZQorCQkJCSAqIHRoZSBjb3VudGVycyB0byB0aGUgbWF4IHZhbHVlLiAgSWYgdGhlIGNvdW50ZXJzCisJCQkJICogd2VyZSByZXN0b3JlZCB0byB0aGUgbWF4IHZhbHVlLCB0aGV5IGRvIG5vdAorCQkJCSAqIGluY3JlbWVudCBhbmQgbm8gaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkLiAgSGVuY2UKKwkJCQkgKiBubyBtb3JlIHNhbXBsZXMgd2lsbCBiZSBjb2xsZWN0ZWQgb24gdGhhdCBjcHUuCisJCQkJICovCisJCQkJY2JlX3dyaXRlX2N0cihjcHUsIGksIDB4RkZGRkZGRjApOworCQkJZWxzZQorCQkJCWNiZV93cml0ZV9jdHIoY3B1LCBpLAorCQkJCQkgICAgICBwZXJfY3B1KHBtY192YWx1ZXMsCisJCQkJCQkgICAgICBjcHUgKworCQkJCQkJICAgICAgbmV4dF9oZHdfdGhyZWFkKVtpXSk7CisJCX0KKworCQkvKiBTd2l0Y2ggdG8gdGhlIG90aGVyIHRocmVhZC4gQ2hhbmdlIHRoZSBpbnRlcnJ1cHQKKwkJICogYW5kIGNvbnRyb2wgcmVncyB0byBiZSBzY2hlZHVsZWQgb24gdGhlIENQVQorCQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aHJlYWQgdG8gZXhlY3V0ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7IGkrKykgeworCQkJaWYgKHBtY19jbnRybFtuZXh0X2hkd190aHJlYWRdW2ldLmVuYWJsZWQpIHsKKwkJCQkvKiBUaGVyZSBhcmUgc29tZSBwZXIgdGhyZWFkIGV2ZW50cy4KKwkJCQkgKiBNdXN0IGRvIHRoZSBzZXQgZXZlbnQsIGVuYWJsZV9jbnRyCisJCQkJICogZm9yIGVhY2ggY3B1LgorCQkJCSAqLworCQkJCXNldF9wbV9ldmVudChpLAorCQkJCSAgICAgcG1jX2NudHJsW25leHRfaGR3X3RocmVhZF1baV0uZXZudHMsCisJCQkJICAgICBwbWNfY250cmxbbmV4dF9oZHdfdGhyZWFkXVtpXS5tYXNrcyk7CisJCQkJZW5hYmxlX2N0cihjcHUsIGksCisJCQkJCSAgIHBtX3JlZ3MucG0wN19jbnRybCk7CisJCQl9IGVsc2UgeworCQkJCWNiZV93cml0ZV9wbTA3X2NvbnRyb2woY3B1LCBpLCAwKTsKKwkJCX0KKwkJfQorCisJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBDUFUgdGhyZWFkIHRoYXQgaXMgc3RhcnRpbmcgKi8KKwkJY2JlX2VuYWJsZV9wbV9pbnRlcnJ1cHRzKGNwdSwgbmV4dF9oZHdfdGhyZWFkLAorCQkJCQkgdmlydF9jbnRyX2ludGVyX21hc2spOworCQljYmVfZW5hYmxlX3BtKGNwdSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlydF9jbnRyX2xvY2ssIGZsYWdzKTsKKworCW1vZF90aW1lcigmdGltZXJfdmlydF9jbnRyLCBqaWZmaWVzICsgSFogLyAxMCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3ZpcnRfY250cnModm9pZCkKK3sKKwlpbml0X3RpbWVyKCZ0aW1lcl92aXJ0X2NudHIpOworCXRpbWVyX3ZpcnRfY250ci5mdW5jdGlvbiA9IGNlbGxfdmlydHVhbF9jbnRyOworCXRpbWVyX3ZpcnRfY250ci5kYXRhID0gMFVMOworCXRpbWVyX3ZpcnRfY250ci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMTA7CisJYWRkX3RpbWVyKCZ0aW1lcl92aXJ0X2NudHIpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBhbGwgY3B1cyBjb21iaW5lZCAqLworc3RhdGljIHZvaWQKK2NlbGxfcmVnX3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyLAorCSAgICAgICBzdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyAqc3lzLCBpbnQgbnVtX2N0cnMpCit7CisJaW50IGksIGosIGNwdTsKKworCXBtX3J0YXNfdG9rZW4gPSBydGFzX3Rva2VuKCJpYm0sY2JlLXBlcmZ0b29scyIpOworCWlmIChwbV9ydGFzX3Rva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSVEFTX1VOS05PV05fU0VSVklDRVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCW51bV9jb3VudGVycyA9IG51bV9jdHJzOworCisJcG1fcmVncy5ncm91cF9jb250cm9sID0gMDsKKwlwbV9yZWdzLmRlYnVnX2J1c19jb250cm9sID0gMDsKKworCS8qIHNldHVwIHRoZSBwbV9jb250cm9sIHJlZ2lzdGVyICovCisJbWVtc2V0KCZwbV9yZWdzLnBtX2NudHJsLCAwLCBzaXplb2Yoc3RydWN0IHBtX2NudHJsKSk7CisJcG1fcmVncy5wbV9jbnRybC5zdG9wX2F0X21heCA9IDE7CisJcG1fcmVncy5wbV9jbnRybC50cmFjZV9tb2RlID0gMDsKKwlwbV9yZWdzLnBtX2NudHJsLmZyZWV6ZSA9IDE7CisKKwlzZXRfY291bnRfbW9kZShzeXMtPmVuYWJsZV9rZXJuZWwsIHN5cy0+ZW5hYmxlX3VzZXIsCisJCSAgICAgICAmcG1fcmVncy5wbV9jbnRybCk7CisKKwkvKiBTZXR1cCB0aGUgdGhyZWFkIDAgZXZlbnRzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9jdHJzOyArK2kpIHsKKworCQlwbWNfY250cmxbMF1baV0uZXZudHMgPSBjdHJbaV0uZXZlbnQ7CisJCXBtY19jbnRybFswXVtpXS5tYXNrcyA9IGN0cltpXS51bml0X21hc2s7CisJCXBtY19jbnRybFswXVtpXS5lbmFibGVkID0gY3RyW2ldLmVuYWJsZWQ7CisJCXBtY19jbnRybFswXVtpXS52Y250ciA9IGk7CisKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopCisJCQlwZXJfY3B1KHBtY192YWx1ZXMsIGopW2ldID0gMDsKKwl9CisKKwkvKiBTZXR1cCB0aGUgdGhyZWFkIDEgZXZlbnRzLCBtYXAgdGhlIHRocmVhZCAwIGV2ZW50IHRvIHRoZQorCSAqIGVxdWl2YWxlbnQgdGhyZWFkIDEgZXZlbnQuCisJICovCisJZm9yIChpID0gMDsgaSA8IG51bV9jdHJzOyArK2kpIHsKKwkJaWYgKChjdHJbaV0uZXZlbnQgPj0gMjEwMCkgJiYgKGN0cltpXS5ldmVudCA8PSAyMTExKSkKKwkJCXBtY19jbnRybFsxXVtpXS5ldm50cyA9IGN0cltpXS5ldmVudCArIDE5OworCQllbHNlIGlmIChjdHJbaV0uZXZlbnQgPT0gMjIwMykKKwkJCXBtY19jbnRybFsxXVtpXS5ldm50cyA9IGN0cltpXS5ldmVudDsKKwkJZWxzZSBpZiAoKGN0cltpXS5ldmVudCA+PSAyMjAwKSAmJiAoY3RyW2ldLmV2ZW50IDw9IDIyMTUpKQorCQkJcG1jX2NudHJsWzFdW2ldLmV2bnRzID0gY3RyW2ldLmV2ZW50ICsgMTY7CisJCWVsc2UKKwkJCXBtY19jbnRybFsxXVtpXS5ldm50cyA9IGN0cltpXS5ldmVudDsKKworCQlwbWNfY250cmxbMV1baV0ubWFza3MgPSBjdHJbaV0udW5pdF9tYXNrOworCQlwbWNfY250cmxbMV1baV0uZW5hYmxlZCA9IGN0cltpXS5lbmFibGVkOworCQlwbWNfY250cmxbMV1baV0udmNudHIgPSBpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXRyYWNlX2J1c1tpXSA9IDB4ZmY7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlpbnB1dF9idXNbaV0gPSAweGZmOworCisJLyogT3VyIGNvdW50ZXJzIGNvdW50IHVwLCBhbmQgImNvdW50IiByZWZlcnMgdG8KKwkgKiBob3cgbXVjaCBiZWZvcmUgdGhlIG5leHQgaW50ZXJydXB0LCBhbmQgd2UgaW50ZXJydXB0CisJICogb24gb3ZlcmZsb3cuICBTbyB3ZSBjYWxjdWxhdGUgdGhlIHN0YXJ0aW5nIHZhbHVlCisJICogd2hpY2ggd2lsbCBnaXZlIHVzICJjb3VudCIgdW50aWwgb3ZlcmZsb3cuCisJICogVGhlbiB3ZSBzZXQgdGhlIGV2ZW50cyBvbiB0aGUgZW5hYmxlZCBjb3VudGVycy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwkJLyogc3RhcnQgd2l0aCB2aXJ0dWFsIGNvdW50ZXIgc2V0IDAgKi8KKwkJaWYgKHBtY19jbnRybFswXVtpXS5lbmFibGVkKSB7CisJCQkvKiBVc2luZyAzMmJpdCBjb3VudGVycywgcmVzZXQgbWF4IC0gY291bnQgKi8KKwkJCXJlc2V0X3ZhbHVlW2ldID0gMHhGRkZGRkZGRiAtIGN0cltpXS5jb3VudDsKKwkJCXNldF9wbV9ldmVudChpLAorCQkJCSAgICAgcG1jX2NudHJsWzBdW2ldLmV2bnRzLAorCQkJCSAgICAgcG1jX2NudHJsWzBdW2ldLm1hc2tzKTsKKworCQkJLyogZ2xvYmFsLCB1c2VkIGJ5IGNlbGxfY3B1X3NldHVwICovCisJCQljdHJfZW5hYmxlZCB8PSAoMSA8PCBpKTsKKwkJfQorCX0KKworCS8qIGluaXRpYWxpemUgdGhlIHByZXZpb3VzIGNvdW50cyBmb3IgdGhlIHZpcnR1YWwgY250cnMgKi8KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCQlwZXJfY3B1KHBtY192YWx1ZXMsIGNwdSlbaV0gPSByZXNldF92YWx1ZVtpXTsKKwkJfQorb3V0OgorCTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBjcHUgKi8KK3N0YXRpYyB2b2lkIGNlbGxfY3B1X3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY250cikKK3sKKwl1MzIgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXUzMiBudW1fZW5hYmxlZCA9IDA7CisJaW50IGk7CisKKwkvKiBUaGVyZSBpcyBvbmUgcGVyZm9ybWFuY2UgbW9uaXRvciBwZXIgcHJvY2Vzc29yIGNoaXAgKGkuZS4gbm9kZSksCisJICogc28gd2Ugb25seSBuZWVkIHRvIHBlcmZvcm0gdGhpcyBmdW5jdGlvbiBvbmNlIHBlciBub2RlLgorCSAqLworCWlmIChjYmVfZ2V0X2h3X3RocmVhZF9pZChjcHUpKQorCQlnb3RvIG91dDsKKworCWlmIChwbV9ydGFzX3Rva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSVEFTX1VOS05PV05fU0VSVklDRVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFN0b3AgYWxsIGNvdW50ZXJzICovCisJY2JlX2Rpc2FibGVfcG0oY3B1KTsKKwljYmVfZGlzYWJsZV9wbV9pbnRlcnJ1cHRzKGNwdSk7CisKKwljYmVfd3JpdGVfcG0oY3B1LCBwbV9pbnRlcnZhbCwgMCk7CisJY2JlX3dyaXRlX3BtKGNwdSwgcG1fc3RhcnRfc3RvcCwgMCk7CisJY2JlX3dyaXRlX3BtKGNwdSwgZ3JvdXBfY29udHJvbCwgcG1fcmVncy5ncm91cF9jb250cm9sKTsKKwljYmVfd3JpdGVfcG0oY3B1LCBkZWJ1Z19idXNfY29udHJvbCwgcG1fcmVncy5kZWJ1Z19idXNfY29udHJvbCk7CisJd3JpdGVfcG1fY250cmwoY3B1LCAmcG1fcmVncy5wbV9jbnRybCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwkJaWYgKGN0cl9lbmFibGVkICYgKDEgPDwgaSkpIHsKKwkJCXBtX3NpZ25hbFtudW1fZW5hYmxlZF0uY3B1ID0gY2JlX2NwdV90b19ub2RlKGNwdSk7CisJCQludW1fZW5hYmxlZCsrOworCQl9CisJfQorCisJcG1fcnRhc19hY3RpdmF0ZV9zaWduYWxzKGNiZV9jcHVfdG9fbm9kZShjcHUpLCBudW1fZW5hYmxlZCk7CitvdXQ6CisJOworfQorCitzdGF0aWMgdm9pZCBjZWxsX2dsb2JhbF9zdGFydChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKK3sKKwl1MzIgY3B1OworCXUzMiBpbnRlcnJ1cHRfbWFzayA9IDA7CisJdTMyIGk7CisKKwkvKiBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgb25jZSBmb3IgdGhlIHN5c3RlbS4KKwkgKiBUaGVyZSBpcyBvbmUgcGVyZm9ybWFuY2UgbW9uaXRvciBwZXIgbm9kZSwgc28gd2UKKwkgKiBvbmx5IG5lZWQgdG8gcGVyZm9ybSB0aGlzIGZ1bmN0aW9uIG9uY2UgcGVyIG5vZGUuCisJICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNiZV9nZXRfaHdfdGhyZWFkX2lkKGNwdSkpCisJCQljb250aW51ZTsKKworCQlpbnRlcnJ1cHRfbWFzayA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCQlpZiAoY3RyX2VuYWJsZWQgJiAoMSA8PCBpKSkgeworCQkJCWNiZV93cml0ZV9jdHIoY3B1LCBpLCByZXNldF92YWx1ZVtpXSk7CisJCQkJZW5hYmxlX2N0cihjcHUsIGksIHBtX3JlZ3MucG0wN19jbnRybCk7CisJCQkJaW50ZXJydXB0X21hc2sgfD0KKwkJCQkgICAgQ0JFX1BNX0NUUl9PVkVSRkxPV19JTlRSKGkpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBEaXNhYmxlIGNvdW50ZXIgKi8KKwkJCQljYmVfd3JpdGVfcG0wN19jb250cm9sKGNwdSwgaSwgMCk7CisJCQl9CisJCX0KKworCQljYmVfY2xlYXJfcG1faW50ZXJydXB0cyhjcHUpOworCQljYmVfZW5hYmxlX3BtX2ludGVycnVwdHMoY3B1LCBoZHdfdGhyZWFkLCBpbnRlcnJ1cHRfbWFzayk7CisJCWNiZV9lbmFibGVfcG0oY3B1KTsKKwl9CisKKwl2aXJ0X2NudHJfaW50ZXJfbWFzayA9IGludGVycnVwdF9tYXNrOworCW9wcm9maWxlX3J1bm5pbmcgPSAxOworCXNtcF93bWIoKTsKKworCS8qIE5PVEU6IHN0YXJ0X3ZpcnRfY250cnMgd2lsbCByZXN1bHQgaW4gY2VsbF92aXJ0dWFsX2NudHIoKSBiZWluZworCSAqIGV4ZWN1dGVkIHdoaWNoIG1hbmlwdWxhdGVzIHRoZSBQTVUuICBXZSBzdGFydCB0aGUgInZpcnR1YWwgY291bnRlciIKKwkgKiBoZXJlIHNvIHRoYXQgd2UgZG8gbm90IG5lZWQgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBQTVUgaW4KKwkgKiB0aGUgYWJvdmUgZm9yLWxvb3AuCisJICovCisJc3RhcnRfdmlydF9jbnRycygpOworfQorCitzdGF0aWMgdm9pZCBjZWxsX2dsb2JhbF9zdG9wKHZvaWQpCit7CisJaW50IGNwdTsKKworCS8qIFRoaXMgcm91dGluZSB3aWxsIGJlIGNhbGxlZCBvbmNlIGZvciB0aGUgc3lzdGVtLgorCSAqIFRoZXJlIGlzIG9uZSBwZXJmb3JtYW5jZSBtb25pdG9yIHBlciBub2RlLCBzbyB3ZQorCSAqIG9ubHkgbmVlZCB0byBwZXJmb3JtIHRoaXMgZnVuY3Rpb24gb25jZSBwZXIgbm9kZS4KKwkgKi8KKwlkZWxfdGltZXJfc3luYygmdGltZXJfdmlydF9jbnRyKTsKKwlvcHJvZmlsZV9ydW5uaW5nID0gMDsKKwlzbXBfd21iKCk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY2JlX2dldF9od190aHJlYWRfaWQoY3B1KSkKKwkJCWNvbnRpbnVlOworCisJCWNiZV9zeW5jX2lycShjYmVfY3B1X3RvX25vZGUoY3B1KSk7CisJCS8qIFN0b3AgdGhlIGNvdW50ZXJzICovCisJCWNiZV9kaXNhYmxlX3BtKGNwdSk7CisKKwkJLyogRGVhY3RpdmF0ZSB0aGUgc2lnbmFscyAqLworCQlwbV9ydGFzX3Jlc2V0X3NpZ25hbHMoY2JlX2NwdV90b19ub2RlKGNwdSkpOworCisJCS8qIERlYWN0aXZhdGUgaW50ZXJydXB0cyAqLworCQljYmVfZGlzYWJsZV9wbV9pbnRlcnJ1cHRzKGNwdSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorY2VsbF9oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKK3sKKwl1MzIgY3B1OworCXU2NCBwYzsKKwlpbnQgaXNfa2VybmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXUzMiBpbnRlcnJ1cHRfbWFzazsKKwlpbnQgaTsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qIE5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgdGhlIHZpcnQgY291bnRlcgorCSAqIHJvdXRpbmUgYXJlIG5vdCBydW5uaW5nIGF0IHRoZSBzYW1lIHRpbWUuIFNlZSB0aGUKKwkgKiBjZWxsX3ZpcnR1YWxfY250cigpIHJvdXRpbmUgZm9yIGFkZGl0aW9uYWwgY29tbWVudHMuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpcnRfY250cl9sb2NrLCBmbGFncyk7CisKKwkvKiBOZWVkIHRvIGRpc2FibGUgYW5kIHJlZW5hYmxlIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycworCSAqIHRvIGdldCB0aGUgZGVzaXJlZCBiZWhhdmlvciBmcm9tIHRoZSBoYXJkd2FyZS4gIFRoaXMKKwkgKiBpcyBoYXJkd2FyZSBzcGVjaWZpYy4KKwkgKi8KKworCWNiZV9kaXNhYmxlX3BtKGNwdSk7CisKKwlpbnRlcnJ1cHRfbWFzayA9IGNiZV9jbGVhcl9wbV9pbnRlcnJ1cHRzKGNwdSk7CisKKwkvKiBJZiB0aGUgaW50ZXJydXB0IG1hc2sgaGFzIGJlZW4gY2xlYXJlZCwgdGhlbiB0aGUgdmlydCBjbnRyCisJICogaGFzIGNsZWFyZWQgdGhlIGludGVycnVwdC4gIFdoZW4gdGhlIHRocmVhZCB0aGF0IGdlbmVyYXRlZAorCSAqIHRoZSBpbnRlcnJ1cHQgaXMgcmVzdG9yZWQsIHRoZSBkYXRhIGNvdW50IHdpbGwgYmUgcmVzdG9yZWQgdG8KKwkgKiAweGZmZmZmZjAgdG8gY2F1c2UgdGhlIGludGVycnVwdCB0byBiZSByZWdlbmVyYXRlZC4KKwkgKi8KKworCWlmICgob3Byb2ZpbGVfcnVubmluZyA9PSAxKSAmJiAoaW50ZXJydXB0X21hc2sgIT0gMCkpIHsKKwkJcGMgPSByZWdzLT5uaXA7CisJCWlzX2tlcm5lbCA9IGlzX2tlcm5lbF9hZGRyKHBjKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwkJCWlmICgoaW50ZXJydXB0X21hc2sgJiBDQkVfUE1fQ1RSX09WRVJGTE9XX0lOVFIoaSkpCisJCQkgICAgJiYgY3RyW2ldLmVuYWJsZWQpIHsKKwkJCQlvcHJvZmlsZV9hZGRfcGMocGMsIGlzX2tlcm5lbCwgaSk7CisJCQkJY2JlX3dyaXRlX2N0cihjcHUsIGksIHJlc2V0X3ZhbHVlW2ldKTsKKwkJCX0KKwkJfQorCisJCS8qIFRoZSBjb3VudGVycyB3ZXJlIGZyb3plbiBieSB0aGUgaW50ZXJydXB0LgorCQkgKiBSZWVuYWJsZSB0aGUgaW50ZXJydXB0IGFuZCByZXN0YXJ0IHRoZSBjb3VudGVycy4KKwkJICogSWYgdGhlcmUgd2FzIGEgcmFjZSBiZXR3ZWVuIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhbmQKKwkJICogdGhlIHZpcnR1YWwgY291bnRlciByb3V0aW5lLiAgVGhlIHZpcnV0YWwgY291bnRlcgorCQkgKiByb3V0aW5lIG1heSBoYXZlIGNsZWFyZWQgdGhlIGludGVycnVwdHMuICBIZW5jZSBtdXN0CisJCSAqIHVzZSB0aGUgdmlydF9jbnRyX2ludGVyX21hc2sgdG8gcmUtZW5hYmxlIHRoZSBpbnRlcnJ1cHRzLgorCQkgKi8KKwkJY2JlX2VuYWJsZV9wbV9pbnRlcnJ1cHRzKGNwdSwgaGR3X3RocmVhZCwKKwkJCQkJIHZpcnRfY250cl9pbnRlcl9tYXNrKTsKKworCQkvKiBUaGUgd3JpdGVzIHRvIHRoZSB2YXJpb3VzIHBlcmZvcm1hbmNlIGNvdW50ZXJzIG9ubHkgd3JpdGVzCisJCSAqIHRvIGEgbGF0Y2guICBUaGUgbmV3IHZhbHVlcyAoaW50ZXJydXB0IHNldHRpbmcgYml0cywgcmVzZXQKKwkJICogY291bnRlciB2YWx1ZSBldGMuKSBhcmUgbm90IGNvcGllZCB0byB0aGUgYWN0dWFsIHJlZ2lzdGVycworCQkgKiB1bnRpbCB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBpcyBlbmFibGVkLiAgSW4gb3JkZXIgdG8gZ2V0CisJCSAqIHRoaXMgdG8gd29yayBhcyBkZXNpcmVkLCB0aGUgcGVybW9ybWFuY2UgbW9uaXRvciBuZWVkcyB0bworCQkgKiBiZSBkaXNhYmxlZCB3aGlsZSB3cml0dGluZyB0byB0aGUgbGF0Y2hlcy4gIFRoaXMgaXMgYQorCQkgKiBIVyBkZXNpZ24gaXNzdWUuCisJCSAqLworCQljYmVfZW5hYmxlX3BtKGNwdSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpcnRfY250cl9sb2NrLCBmbGFncyk7Cit9CisKK3N0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX2NlbGwgPSB7CisJLnJlZ19zZXR1cCA9IGNlbGxfcmVnX3NldHVwLAorCS5jcHVfc2V0dXAgPSBjZWxsX2NwdV9zZXR1cCwKKwkuZ2xvYmFsX3N0YXJ0ID0gY2VsbF9nbG9iYWxfc3RhcnQsCisJLmdsb2JhbF9zdG9wID0gY2VsbF9nbG9iYWxfc3RvcCwKKwkuaGFuZGxlX2ludGVycnVwdCA9IGNlbGxfaGFuZGxlX2ludGVycnVwdCwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfZnNsX2Jvb2tlLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfZnNsX2Jvb2tlLmMKaW5kZXggZTI5ZGVkZS4uMGIzYzMxZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2ZzbF9ib29rZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9mc2xfYm9va2UuYwpAQCAtMzIsNDIgKzMyLDE1MiBAQAogc3RhdGljIGludCBudW1fY291bnRlcnM7CiBzdGF0aWMgaW50IG9wcm9maWxlX3J1bm5pbmc7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGN0cl9yZWFkKHVuc2lnbmVkIGludCBpKQorc3RhdGljIHZvaWQgaW5pdF9wbWNfc3RvcChpbnQgY3RyKQogewotCXN3aXRjaChpKSB7CisJdTMyIHBtbGNhID0gKFBNTENBX0ZDIHwgUE1MQ0FfRkNTIHwgUE1MQ0FfRkNVIHwKKwkJCVBNTENBX0ZDTTEgfCBQTUxDQV9GQ00wKTsKKwl1MzIgcG1sY2IgPSAwOworCisJc3dpdGNoIChjdHIpIHsKIAkJY2FzZSAwOgotCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMCk7CisJCQltdHBtcihQTVJOX1BNTENBMCwgcG1sY2EpOworCQkJbXRwbXIoUE1STl9QTUxDQjAsIHBtbGNiKTsKKwkJCWJyZWFrOwogCQljYXNlIDE6Ci0JCQlyZXR1cm4gbWZwbXIoUE1STl9QTUMxKTsKKwkJCW10cG1yKFBNUk5fUE1MQ0ExLCBwbWxjYSk7CisJCQltdHBtcihQTVJOX1BNTENCMSwgcG1sY2IpOworCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCXJldHVybiBtZnBtcihQTVJOX1BNQzIpOworCQkJbXRwbXIoUE1STl9QTUxDQTIsIHBtbGNhKTsKKwkJCW10cG1yKFBNUk5fUE1MQ0IyLCBwbWxjYik7CisJCQlicmVhazsKIAkJY2FzZSAzOgotCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMyk7CisJCQltdHBtcihQTVJOX1BNTENBMywgcG1sY2EpOworCQkJbXRwbXIoUE1STl9QTUxDQjMsIHBtbGNiKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7CisJCQlwYW5pYygiQmFkIGN0ciBudW1iZXIhXG4iKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjdHJfd3JpdGUodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCB2YWwpCitzdGF0aWMgdm9pZCBzZXRfcG1jX2V2ZW50KGludCBjdHIsIGludCBldmVudCkKIHsKLQlzd2l0Y2goaSkgewotCQljYXNlIDA6Ci0JCQltdHBtcihQTVJOX1BNQzAsIHZhbCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJbXRwbXIoUE1STl9QTUMxLCB2YWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW10cG1yKFBNUk5fUE1DMiwgdmFsKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQltdHBtcihQTVJOX1BNQzMsIHZhbCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KKwl1MzIgcG1sY2E7CisKKwlwbWxjYSA9IGdldF9wbWxjYShjdHIpOworCisJcG1sY2EgPSAocG1sY2EgJiB+UE1MQ0FfRVZFTlRfTUFTSykgfAorCQkoKGV2ZW50IDw8IFBNTENBX0VWRU5UX1NISUZUKSAmCisJCSBQTUxDQV9FVkVOVF9NQVNLKTsKKworCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKIH0KIAorc3RhdGljIHZvaWQgc2V0X3BtY191c2VyX2tlcm5lbChpbnQgY3RyLCBpbnQgdXNlciwgaW50IGtlcm5lbCkKK3sKKwl1MzIgcG1sY2E7CisKKwlwbWxjYSA9IGdldF9wbWxjYShjdHIpOworCisJaWYodXNlcikKKwkJcG1sY2EgJj0gflBNTENBX0ZDVTsKKwllbHNlCisJCXBtbGNhIHw9IFBNTENBX0ZDVTsKKworCWlmKGtlcm5lbCkKKwkJcG1sY2EgJj0gflBNTENBX0ZDUzsKKwllbHNlCisJCXBtbGNhIHw9IFBNTENBX0ZDUzsKKworCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BtY19tYXJrZWQoaW50IGN0ciwgaW50IG1hcmswLCBpbnQgbWFyazEpCit7CisJdTMyIHBtbGNhID0gZ2V0X3BtbGNhKGN0cik7CisKKwlpZihtYXJrMCkKKwkJcG1sY2EgJj0gflBNTENBX0ZDTTA7CisJZWxzZQorCQlwbWxjYSB8PSBQTUxDQV9GQ00wOworCisJaWYobWFyazEpCisJCXBtbGNhICY9IH5QTUxDQV9GQ00xOworCWVsc2UKKwkJcG1sY2EgfD0gUE1MQ0FfRkNNMTsKKworCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKK30KKworc3RhdGljIHZvaWQgcG1jX3N0YXJ0X2N0cihpbnQgY3RyLCBpbnQgZW5hYmxlKQoreworCXUzMiBwbWxjYSA9IGdldF9wbWxjYShjdHIpOworCisJcG1sY2EgJj0gflBNTENBX0ZDOworCisJaWYgKGVuYWJsZSkKKwkJcG1sY2EgfD0gUE1MQ0FfQ0U7CisJZWxzZQorCQlwbWxjYSAmPSB+UE1MQ0FfQ0U7CisKKwlzZXRfcG1sY2EoY3RyLCBwbWxjYSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtY19zdGFydF9jdHJzKGludCBlbmFibGUpCit7CisJdTMyIHBtZ2MwID0gbWZwbXIoUE1STl9QTUdDMCk7CisKKwlwbWdjMCAmPSB+UE1HQzBfRkFDOworCXBtZ2MwIHw9IFBNR0MwX0ZDRUNFOworCisJaWYgKGVuYWJsZSkKKwkJcG1nYzAgfD0gUE1HQzBfUE1JRTsKKwllbHNlCisJCXBtZ2MwICY9IH5QTUdDMF9QTUlFOworCisJbXRwbXIoUE1STl9QTUdDMCwgcG1nYzApOworfQorCitzdGF0aWMgdm9pZCBwbWNfc3RvcF9jdHJzKHZvaWQpCit7CisJdTMyIHBtZ2MwID0gbWZwbXIoUE1STl9QTUdDMCk7CisKKwlwbWdjMCB8PSBQTUdDMF9GQUM7CisKKwlwbWdjMCAmPSB+KFBNR0MwX1BNSUUgfCBQTUdDMF9GQ0VDRSk7CisKKwltdHBtcihQTVJOX1BNR0MwLCBwbWdjMCk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcG1jcyh2b2lkKQoreworCXByaW50aygicG1nYzA6ICV4XG4iLCBtZnBtcihQTVJOX1BNR0MwKSk7CisJcHJpbnRrKCJwbWNcdFx0cG1sY2FcdFx0cG1sY2JcbiIpOworCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMwKSwKKwkJCW1mcG1yKFBNUk5fUE1MQ0EwKSwgbWZwbXIoUE1STl9QTUxDQjApKTsKKwlwcmludGsoIiU4eFx0JTh4XHQlOHhcbiIsIG1mcG1yKFBNUk5fUE1DMSksCisJCQltZnBtcihQTVJOX1BNTENBMSksIG1mcG1yKFBNUk5fUE1MQ0IxKSk7CisJcHJpbnRrKCIlOHhcdCU4eFx0JTh4XG4iLCBtZnBtcihQTVJOX1BNQzIpLAorCQkJbWZwbXIoUE1STl9QTUxDQTIpLCBtZnBtcihQTVJOX1BNTENCMikpOworCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMzKSwKKwkJCW1mcG1yKFBNUk5fUE1MQ0EzKSwgbWZwbXIoUE1STl9QTUxDQjMpKTsKK30KKworc3RhdGljIHZvaWQgZnNsX2Jvb2tlX2NwdV9zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKK3sKKwlpbnQgaTsKKworCS8qIGZyZWV6ZSBhbGwgY291bnRlcnMgKi8KKwlwbWNfc3RvcF9jdHJzKCk7CisKKwlmb3IgKGkgPSAwO2kgPCBudW1fY291bnRlcnM7aSsrKSB7CisJCWluaXRfcG1jX3N0b3AoaSk7CisKKwkJc2V0X3BtY19ldmVudChpLCBjdHJbaV0uZXZlbnQpOworCisJCXNldF9wbWNfdXNlcl9rZXJuZWwoaSwgY3RyW2ldLnVzZXIsIGN0cltpXS5rZXJuZWwpOworCX0KK30KIAogc3RhdGljIHZvaWQgZnNsX2Jvb2tlX3JlZ19zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0ciwKIAkJCSAgICAgc3RydWN0IG9wX3N5c3RlbV9jb25maWcgKnN5cywKQEAgLTc3LDIzICsxODcsMTQgQEAKIAogCW51bV9jb3VudGVycyA9IG51bV9jdHJzOwogCi0JLyogZnJlZXplIGFsbCBjb3VudGVycyAqLwotCXBtY19zdG9wX2N0cnMoKTsKLQogCS8qIE91ciBjb3VudGVycyBjb3VudCB1cCwgYW5kICJjb3VudCIgcmVmZXJzIHRvCiAJICogaG93IG11Y2ggYmVmb3JlIHRoZSBuZXh0IGludGVycnVwdCwgYW5kIHdlIGludGVycnVwdAogCSAqIG9uIG92ZXJmbG93LiAgU28gd2UgY2FsY3VsYXRlIHRoZSBzdGFydGluZyB2YWx1ZQogCSAqIHdoaWNoIHdpbGwgZ2l2ZSB1cyAiY291bnQiIHVudGlsIG92ZXJmbG93LgogCSAqIFRoZW4gd2Ugc2V0IHRoZSBldmVudHMgb24gdGhlIGVuYWJsZWQgY291bnRlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpCiAJCXJlc2V0X3ZhbHVlW2ldID0gMHg4MDAwMDAwMFVMIC0gY3RyW2ldLmNvdW50OwogCi0JCWluaXRfcG1jX3N0b3AoaSk7Ci0KLQkJc2V0X3BtY19ldmVudChpLCBjdHJbaV0uZXZlbnQpOwotCi0JCXNldF9wbWNfdXNlcl9rZXJuZWwoaSwgY3RyW2ldLnVzZXIsIGN0cltpXS5rZXJuZWwpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgZnNsX2Jvb2tlX3N0YXJ0KHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQpAQCAtMTA1LDggKzIwNiw4IEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CiAJCWlmIChjdHJbaV0uZW5hYmxlZCkgewogCQkJY3RyX3dyaXRlKGksIHJlc2V0X3ZhbHVlW2ldKTsKLQkJCS8qIFNldCBFYWNoIGVuYWJsZWQgY291bnRlcmQgdG8gb25seQotCQkJICogY291bnQgd2hlbiB0aGUgTWFyayBiaXQgaXMgbm90IHNldCAqLworCQkJLyogU2V0IGVhY2ggZW5hYmxlZCBjb3VudGVyIHRvIG9ubHkKKwkJCSAqIGNvdW50IHdoZW4gdGhlIE1hcmsgYml0IGlzICpub3QqIHNldCAqLwogCQkJc2V0X3BtY19tYXJrZWQoaSwgMSwgMCk7CiAJCQlwbWNfc3RhcnRfY3RyKGksIDEpOwogCQl9IGVsc2UgewpAQCAtMTc3LDYgKzI3OCw3IEBACiAKIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX2ZzbF9ib29rZSA9IHsKIAkucmVnX3NldHVwCQk9IGZzbF9ib29rZV9yZWdfc2V0dXAsCisJLmNwdV9zZXR1cAkJPSBmc2xfYm9va2VfY3B1X3NldHVwLAogCS5zdGFydAkJCT0gZnNsX2Jvb2tlX3N0YXJ0LAogCS5zdG9wCQkJPSBmc2xfYm9va2Vfc3RvcCwKIAkuaGFuZGxlX2ludGVycnVwdAk9IGZzbF9ib29rZV9oYW5kbGVfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCmluZGV4IDUwNmY2YjcuLjM1NjcwOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKQEAgLTc2LDEzICs3NiwxMyBAQAogewogCWlmIChfX2lzX3Byb2Nlc3NvcihQVl9QT1dFUjQpIHx8IF9faXNfcHJvY2Vzc29yKFBWX1BPV0VSNHApIHx8CiAJICAgIF9faXNfcHJvY2Vzc29yKFBWXzk3MCkgfHwgX19pc19wcm9jZXNzb3IoUFZfOTcwRlgpIHx8Ci0JICAgIF9faXNfcHJvY2Vzc29yKFBWXzk3ME1QKSkKKwkgICAgX19pc19wcm9jZXNzb3IoUFZfOTcwTVApIHx8IF9faXNfcHJvY2Vzc29yKFBWXzk3MEdYKSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcG93ZXI0X2NwdV9zZXR1cCh2b2lkICp1bnVzZWQpCitzdGF0aWMgdm9pZCBwb3dlcjRfY3B1X3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQogewogCXVuc2lnbmVkIGludCBtbWNyMCA9IG1tY3IwX3ZhbDsKIAl1bnNpZ25lZCBsb25nIG1tY3JhID0gbW1jcmFfdmFsOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3JzNjQuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9yczY0LmMKaW5kZXggMDQyZjhmNC4uMTljNWVlMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3JzNjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcnM2NC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkvKiBYWFggc2V0dXAgdXNlciBhbmQga2VybmVsIHByb2ZpbGluZyAqLwogfQogCi1zdGF0aWMgdm9pZCByczY0X2NwdV9zZXR1cCh2b2lkICp1bnVzZWQpCitzdGF0aWMgdm9pZCByczY0X2NwdV9zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKIHsKIAl1bnNpZ25lZCBpbnQgbW1jcjA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnCmluZGV4IGVkMzlkNmEuLjJmMmExM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZwpAQCAtMTc5LDcgKzE3OSw3IEBACiAjIE9BSyBkb2Vzbid0IGV4aXN0IGJ1dCB3YW50ZWQgdG8ga2VlcCB0aGlzIGFyb3VuZCBmb3IgYW55IGZ1dHVyZSA0MDNHQ1ggYm9hcmRzCiBjb25maWcgNDAzR0NYCiAJYm9vbAotCWRlcGVuZHMgT0FLCisJZGVwZW5kcyBvbiBPQUsKIAlkZWZhdWx0IHkKIAogY29uZmlnIDQwNUVQCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MTg0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIDUyeHggYmFzZWQgYm9hcmRzCisjCitpZmVxICgkKENPTkZJR19QUENfTUVSR0UpLHkpCitvYmoteQkJCQkrPSBtcGM1Mnh4X3BpYy5vIG1wYzUyeHhfY29tbW9uLm8KK2VuZGlmCisKK29iai0kKENPTkZJR19QUENfRUZJS0EpCQkrPSBlZmlrYS1zZXR1cC5vIGVmaWthLXBjaS5vCitvYmotJChDT05GSUdfUFBDX0xJVEU1MjAwKQkrPSBsaXRlNTIwMC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2EtcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2EtcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlMDViMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS1wY2kuYwpAQCAtMCwwICsxLDExOSBAQAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9ydGFzLmg+CisKKyNpbmNsdWRlICJlZmlrYS5oIgorCisjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqIEFjY2VzcyBmdW5jdGlvbnMgZm9yIFBDSSBjb25maWcgc3BhY2UgdXNpbmcgUlRBUyBjYWxscy4KKyAqLworc3RhdGljIGludCBydGFzX3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJCSAgICBpbnQgbGVuLCB1MzIgKiB2YWwpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IChvZmZzZXQgJiAweGZmKSB8ICgoZGV2Zm4gJiAweGZmKSA8PCA4KQorCSAgICB8ICgoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+Zmlyc3RfYnVzbm8pICYgMHhmZikgPDwgMTYpCisJICAgIHwgKGhvc2UtPmluZGV4IDw8IDI0KTsKKwlpbnQgcmV0ID0gLTE7CisJaW50IHJ2YWw7CisKKwlydmFsID0gcnRhc19jYWxsKHJ0YXNfdG9rZW4oInJlYWQtcGNpLWNvbmZpZyIpLCAyLCAyLCAmcmV0LCBhZGRyLCBsZW4pOworCSp2YWwgPSByZXQ7CisJcmV0dXJuIHJ2YWwgPyBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQgOiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgcnRhc193cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAob2Zmc2V0ICYgMHhmZikgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKKwkgICAgfCAoKChidXMtPm51bWJlciAtIGhvc2UtPmZpcnN0X2J1c25vKSAmIDB4ZmYpIDw8IDE2KQorCSAgICB8IChob3NlLT5pbmRleCA8PCAyNCk7CisJaW50IHJ2YWw7CisKKwlydmFsID0gcnRhc19jYWxsKHJ0YXNfdG9rZW4oIndyaXRlLXBjaS1jb25maWciKSwgMywgMSwgTlVMTCwKKwkJCSBhZGRyLCBsZW4sIHZhbCk7CisJcmV0dXJuIHJ2YWwgPyBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQgOiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBydGFzX3BjaV9vcHMgPSB7CisJcnRhc19yZWFkX2NvbmZpZywKKwlydGFzX3dyaXRlX2NvbmZpZworfTsKKwordm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCkKK3sKKwljb25zdCBpbnQgKmJ1c19yYW5nZTsKKwlpbnQgbGVuOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CisJc3RydWN0IGRldmljZV9ub2RlICpwY2ljdHJsOworCisJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJaWYgKHJvb3QgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIEVGSUtBX1BMQVRGT1JNX05BTUUKKwkJICAgICAgICI6IFVuYWJsZSB0byBmaW5kIHRoZSByb290IG5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChwY2ljdHJsID0gTlVMTDs7KSB7CisJCXBjaWN0cmwgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBwY2ljdHJsKTsKKwkJaWYgKChwY2ljdHJsID09IE5VTEwpIHx8IChzdHJjbXAocGNpY3RybC0+bmFtZSwgInBjaSIpID09IDApKQorCQkJYnJlYWs7CisJfQorCisJb2Zfbm9kZV9wdXQocm9vdCk7CisKKwlpZiAocGNpY3RybCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRUZJS0FfUExBVEZPUk1fTkFNRQorCQkgICAgICAgIjogVW5hYmxlIHRvIGZpbmQgdGhlIFBDSSBicmlkZ2Ugbm9kZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlidXNfcmFuZ2UgPSBnZXRfcHJvcGVydHkocGNpY3RybCwgImJ1cy1yYW5nZSIsICZsZW4pOworCWlmIChidXNfcmFuZ2UgPT0gTlVMTCB8fCBsZW4gPCAyICogc2l6ZW9mKGludCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBFRklLQV9QTEFURk9STV9OQU1FCisJCSAgICAgICAiOiBDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlc1xuIiwgcGNpY3RybC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChidXNfcmFuZ2VbMV0gPT0gYnVzX3JhbmdlWzBdKQorCQlwcmludGsoS0VSTl9JTkZPIEVGSUtBX1BMQVRGT1JNX05BTUUgIjogUENJIGJ1cyAlZCIsCisJCSAgICAgICBidXNfcmFuZ2VbMF0pOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyBFRklLQV9QTEFURk9STV9OQU1FICI6IFBDSSBidXNlcyAlZC4uJWQiLAorCQkgICAgICAgYnVzX3JhbmdlWzBdLCBidXNfcmFuZ2VbMV0pOworCXByaW50aygiIGNvbnRyb2xsZWQgYnkgJXNcbiIsIHBjaWN0cmwtPmZ1bGxfbmFtZSk7CisJcHJpbnRrKCJcbiIpOworCisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWlmICghaG9zZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIEVGSUtBX1BMQVRGT1JNX05BTUUKKwkJICAgICAgICI6IENhbid0IGFsbG9jYXRlIFBDSSBjb250cm9sbGVyIHN0cnVjdHVyZSBmb3IgJXNcbiIsCisJCSAgICAgICBwY2ljdHJsLT5mdWxsX25hbWUpOworCQlyZXR1cm47CisJfQorCisJaG9zZS0+YXJjaF9kYXRhID0gb2Zfbm9kZV9nZXQocGNpY3RybCk7CisJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2VbMF07CisJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZVsxXTsKKwlob3NlLT5vcHMgPSAmcnRhc19wY2lfb3BzOworCisJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBwY2ljdHJsLCAwKTsKK30KKworI2Vsc2UKK3ZvaWQgX19pbml0IGVmaWthX3BjaXNldHVwKHZvaWQpCit7fQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2Etc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS1zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGM5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2Etc2V0dXAuYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqCisgKiBFZmlrYSA1SzIgcGxhdGZvcm0gc2V0dXAKKyAqIFNvbWUgY29kZSByZWFsbHkgaW5zcGlyZWQgZnJvbSB0aGUgbGl0ZTUyMDBiIHBsYXRmb3JtLgorICogCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnBsYW4gR21iSAorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdXRzcmVsZWFzZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgorI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgorCisjaW5jbHVkZSAiZWZpa2EuaCIKKworc3RhdGljIHZvaWQgZWZpa2Ffc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CisJY29uc3QgY2hhciAqcmV2aXNpb24gPSBOVUxMOworCWNvbnN0IGNoYXIgKmNvZGVnZW5kZXNjcmlwdGlvbiA9IE5VTEw7CisJY29uc3QgY2hhciAqY29kZWdlbnZlbmRvciA9IE5VTEw7CisKKwlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwlpZiAocm9vdCkgeworCQlyZXZpc2lvbiA9IGdldF9wcm9wZXJ0eShyb290LCAicmV2aXNpb24iLCBOVUxMKTsKKwkJY29kZWdlbmRlc2NyaXB0aW9uID0KKwkJICAgIGdldF9wcm9wZXJ0eShyb290LCAiQ09ERUdFTixkZXNjcmlwdGlvbiIsIE5VTEwpOworCQljb2RlZ2VudmVuZG9yID0gZ2V0X3Byb3BlcnR5KHJvb3QsICJDT0RFR0VOLHZlbmRvciIsIE5VTEwpOworCisJCW9mX25vZGVfcHV0KHJvb3QpOworCX0KKworCWlmIChjb2RlZ2VuZGVzY3JpcHRpb24pCisJCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0OiAlc1xuIiwgY29kZWdlbmRlc2NyaXB0aW9uKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0OiBFZmlrYVxuIik7CisKKwlpZiAocmV2aXNpb24pCisJCXNlcV9wcmludGYobSwgInJldmlzaW9uXHQ6ICVzXG4iLCByZXZpc2lvbik7CisKKwlpZiAoY29kZWdlbnZlbmRvcikKKwkJc2VxX3ByaW50ZihtLCAidmVuZG9yXHRcdDogJXNcbiIsIGNvZGVnZW52ZW5kb3IpOworCisJb2Zfbm9kZV9wdXQocm9vdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlZmlrYV9zZXR1cF9hcmNoKHZvaWQpCit7CisJcnRhc19pbml0aWFsaXplKCk7CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKwlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOworCisJaWYgKGluaXRyZF9zdGFydCkKKwkJUk9PVF9ERVYgPSBSb290X1JBTTA7CisJZWxzZQorI2VuZGlmCisJCVJPT1RfREVWID0gUm9vdF9TREEyOwkvKiBzZGEyIChzZGExIGlzIGZvciB0aGUga2VybmVsKSAqLworCisJZWZpa2FfcGNpc2V0dXAoKTsKKworCWlmIChwcGNfbWQucHJvZ3Jlc3MpCisJCXBwY19tZC5wcm9ncmVzcygiTGludXgvUFBDICIgVVRTX1JFTEVBU0UgIiBydW5udW5nIG9uIEVmaWthIDstKVxuIiwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGVmaWthX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY25wID0gTlVMTDsKKwljb25zdCB1MzIgKmJhc2U7CisKKwkvKiBGaW5kIGV2ZXJ5IGNoaWxkIG9mIHRoZSBTT0Mgbm9kZSBhbmQgYWRkIGl0IHRvIG9mX3BsYXRmb3JtICovCisJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYnVpbHRpbiIpOworCWlmIChucCkgeworCQljaGFyIG5hbWVbQlVTX0lEX1NJWkVdOworCQl3aGlsZSAoKGNucCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBjbnApKSkgeworCQkJc3RyY3B5KG5hbWUsIGNucC0+bmFtZSk7CisKKwkJCWJhc2UgPSBnZXRfcHJvcGVydHkoY25wLCAicmVnIiwgTlVMTCk7CisJCQlpZiAoYmFzZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlzbnByaW50ZihuYW1lK3N0cmxlbihuYW1lKSwgQlVTX0lEX1NJWkUsICJAJXgiLCAqYmFzZSk7CisJCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGNucCwgbmFtZSwgTlVMTCk7CisKKwkJCXByaW50ayhLRVJOX0lORk8gRUZJS0FfUExBVEZPUk1fTkFNRSIgOiBBZGRlZCAlcyAodHlwZSAnJXMnIGF0ICclcycpIHRvIHRoZSBrbm93biBkZXZpY2VzXG4iLCBuYW1lLCBjbnAtPnR5cGUsIGNucC0+ZnVsbF9uYW1lKTsKKwkJfQorCX0KKworCWlmIChwcGNfbWQucHJvZ3Jlc3MpCisJCXBwY19tZC5wcm9ncmVzcygiICBIYXZlIGZ1biB3aXRoIHlvdXIgRWZpa2EhICAgICIsIDB4Nzc3Nyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVmaWthX3Byb2JlKHZvaWQpCit7CisJY2hhciAqbW9kZWwgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwKKwkJCQkJICAibW9kZWwiLCBOVUxMKTsKKworCWlmIChtb2RlbCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyY21wKG1vZGVsLCAiRUZJS0E1SzIiKSkKKwkJcmV0dXJuIDA7CisKKwlJU0FfRE1BX1RIUkVTSE9MRCA9IH4wTDsKKwlETUFfTU9ERV9SRUFEID0gMHg0NDsKKwlETUFfTU9ERV9XUklURSA9IDB4NDg7CisKKwlyZXR1cm4gMTsKK30KKworZGVmaW5lX21hY2hpbmUoZWZpa2EpCit7CisJLm5hbWUgPSBFRklLQV9QTEFURk9STV9OQU1FLAorCS5wcm9iZSA9IGVmaWthX3Byb2JlLAorCS5zZXR1cF9hcmNoID0gZWZpa2Ffc2V0dXBfYXJjaCwKKwkuaW5pdCA9IGVmaWthX2luaXQsCisJLnNob3dfY3B1aW5mbyA9IGVmaWthX3Nob3dfY3B1aW5mbywKKwkuaW5pdF9JUlEgPSBtcGM1Mnh4X2luaXRfaXJxLAorCS5nZXRfaXJxID0gbXBjNTJ4eF9nZXRfaXJxLAorCS5yZXN0YXJ0ID0gcnRhc19yZXN0YXJ0LAorCS5wb3dlcl9vZmYgPSBydGFzX3Bvd2VyX29mZiwKKwkuaGFsdCA9IHJ0YXNfaGFsdCwKKwkuc2V0X3J0Y190aW1lID0gcnRhc19zZXRfcnRjX3RpbWUsCisJLmdldF9ydGNfdGltZSA9IHJ0YXNfZ2V0X3J0Y190aW1lLAorCS5wcm9ncmVzcyA9IHJ0YXNfcHJvZ3Jlc3MsCisJLmdldF9ib290X3RpbWUgPSBydGFzX2dldF9ib290X3RpbWUsCisJLmNhbGlicmF0ZV9kZWNyID0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKKwkucGh5c19tZW1fYWNjZXNzX3Byb3QgPSBwY2lfcGh5c19tZW1fYWNjZXNzX3Byb3QsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA2MGZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2VmaWthLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIEVmaWthIDVLMiBwbGF0Zm9ybSBzZXR1cCAtIEhlYWRlciBmaWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJwbGFuIEdtYkgKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqLworCisjaWZuZGVmIF9fQVJDSF9QT1dFUlBDX0VGSUtBX18KKyNkZWZpbmUgX19BUkNIX1BPV0VSUENfRUZJS0FfXworCisjZGVmaW5lIEVGSUtBX1BMQVRGT1JNX05BTUUgIkVmaWthIgorCitleHRlcm4gdm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZmNzFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBGcmVlc2NhbGUgTGl0ZTUyMDAgYm9hcmQgc3VwcG9ydAorICoKKyAqIFdyaXR0ZW4gYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4gMjAwNi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgRnJlZXNjYWxlIFNlbWljb25kdXRvciwgSW5jLiAyMDA2LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2lwaWMuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCisgKgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorbGl0ZTUyeHhfc2V0dXBfY3B1KHZvaWQpCit7CisJc3RydWN0IG1wYzUyeHhfZ3BpbyBfX2lvbWVtICpncGlvOworCXUzMiBwb3J0X2NvbmZpZzsKKworCS8qIE1hcCB6b25lcyAqLworCWdwaW8gPSBtcGM1Mnh4X2ZpbmRfYW5kX21hcCgibXBjNTJ4eC1ncGlvIik7CisJaWYgKCFncGlvKSB7CisJCXByaW50ayhLRVJOX0VSUiBfX0ZJTEVfXyAiOiAiCisJCQkiRXJyb3Igd2hpbGUgbWFwcGluZyBHUElPIHJlZ2lzdGVyIGZvciBwb3J0IGNvbmZpZy4gIgorCQkJIkV4cGVjdCBzb21lIGFibm9ybWFsIGJlaGF2aW9yXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBTZXQgcG9ydCBjb25maWcgKi8KKwlwb3J0X2NvbmZpZyA9IGluX2JlMzIoJmdwaW8tPnBvcnRfY29uZmlnKTsKKworCXBvcnRfY29uZmlnICY9IH4weDAwODAwMDAwOwkvKiA0OE1oeiBpbnRlcm5hbCwgcGluIGlzIEdQSU8JKi8KKworCXBvcnRfY29uZmlnICY9IH4weDAwMDA3MDAwOwkvKiBVU0IgcG9ydCA6IERpZmZlcmVudGlhbCBtb2RlCSovCisJcG9ydF9jb25maWcgfD0gIDB4MDAwMDEwMDA7CS8qICAgICAgICAgICAgVVNCIDEgb25seQkqLworCisJcG9ydF9jb25maWcgJj0gfjB4MDMwMDAwMDA7CS8qIEFUQSBDUyBpcyBvbiBjc2JfNC81CQkqLworCXBvcnRfY29uZmlnIHw9ICAweDAxMDAwMDAwOworCisJcHJfZGVidWcoInBvcnRfY29uZmlnOiBvbGQ6JXggbmV3OiV4XG4iLAorCSAgICAgICAgIGluX2JlMzIoJmdwaW8tPnBvcnRfY29uZmlnKSwgcG9ydF9jb25maWcpOworCW91dF9iZTMyKCZncGlvLT5wb3J0X2NvbmZpZywgcG9ydF9jb25maWcpOworCisJLyogVW5tYXAgem9uZSAqLworZXJyb3I6CisJaW91bm1hcChncGlvKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGxpdGU1Mnh4X3NldHVwX2FyY2godm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJaWYgKHBwY19tZC5wcm9ncmVzcykKKwkJcHBjX21kLnByb2dyZXNzKCJsaXRlNTJ4eF9zZXR1cF9hcmNoKCkiLCAwKTsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOworCWlmIChucCkgeworCQl1bnNpZ25lZCBpbnQgKmZwID0KKwkJICAgIChpbnQgKilnZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwkJaWYgKGZwICE9IDApCisJCQlsb29wc19wZXJfamlmZnkgPSAqZnAgLyBIWjsKKwkJZWxzZQorCQkJbG9vcHNfcGVyX2ppZmZ5ID0gNTAwMDAwMDAgLyBIWjsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKworCS8qIENQVSAmIFBvcnQgbXV4IHNldHVwICovCisJbXBjNTJ4eF9zZXR1cF9jcHUoKTsJLyogR2VuZXJpYyAqLworCWxpdGU1Mnh4X3NldHVwX2NwdSgpOwkvKiBQbGF0b3JtIHNwZWNpZmljICovCisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKwlpZiAoaW5pdHJkX3N0YXJ0KQorCQlST09UX0RFViA9IFJvb3RfUkFNMDsKKwllbHNlCisjZW5kaWYKKyNpZmRlZiAgQ09ORklHX1JPT1RfTkZTCisJCVJPT1RfREVWID0gUm9vdF9ORlM7CisjZWxzZQorCQlST09UX0RFViA9IFJvb3RfSERBMTsKKyNlbmRpZgorCit9CisKK3ZvaWQgbGl0ZTUyeHhfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wID0gb2ZfZmluZF9hbGxfbm9kZXMoTlVMTCk7CisJY29uc3QgY2hhciAqbW9kZWwgPSBOVUxMOworCisJaWYgKG5wKQorCQltb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisKKwlzZXFfcHJpbnRmKG0sICJ2ZW5kb3JcdFx0OglGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvclxuIik7CisJc2VxX3ByaW50ZihtLCAibWFjaGluZVx0XHQ6CSVzXG4iLCBtb2RlbCA/IG1vZGVsIDogInVua25vd24iKTsKKworCW9mX25vZGVfcHV0KG5wKTsKK30KKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBsaXRlNTJ4eF9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbm9kZSA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKwljb25zdCBjaGFyICptb2RlbCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgIm1vZGVsIiwgTlVMTCk7CisKKwlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShub2RlLCAibGl0ZTUyeHgiKSkKKwkJcmV0dXJuIDA7CisJcHJfZGVidWcoIiVzIGJvYXJkIHcvIG1wYzUyeHggZm91bmRcbiIsIG1vZGVsID8gbW9kZWwgOiAidW5rbm93biIpOworCisJcmV0dXJuIDE7Cit9CisKK2RlZmluZV9tYWNoaW5lKGxpdGU1Mnh4KSB7CisJLm5hbWUgCQk9ICJsaXRlNTJ4eCIsCisJLnByb2JlIAkJPSBsaXRlNTJ4eF9wcm9iZSwKKwkuc2V0dXBfYXJjaCAJPSBsaXRlNTJ4eF9zZXR1cF9hcmNoLAorCS5pbml0X0lSUSAJPSBtcGM1Mnh4X2luaXRfaXJxLAorCS5nZXRfaXJxIAk9IG1wYzUyeHhfZ2V0X2lycSwKKwkuc2hvd19jcHVpbmZvCT0gbGl0ZTUyeHhfc2hvd19jcHVpbmZvLAorCS5jYWxpYnJhdGVfZGVjcgk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzMxZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKgorICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBGcmVlc2NhbGUgTVBDNTJ4eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CisKKwordm9pZCBfX2lvbWVtICoKK21wYzUyeHhfZmluZF9hbmRfbWFwKGNvbnN0IGNoYXIgKmNvbXBhdGlibGUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpvZm47CisJY29uc3QgdTMyICpyZWdhZGRyX3A7CisJdTY0IHJlZ2FkZHI2NCwgc2l6ZTY0OworCisJb2ZuID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgY29tcGF0aWJsZSk7CisJaWYgKCFvZm4pCisJCXJldHVybiBOVUxMOworCisJcmVnYWRkcl9wID0gb2ZfZ2V0X2FkZHJlc3Mob2ZuLCAwLCAmc2l6ZTY0LCBOVUxMKTsKKwlpZiAoIXJlZ2FkZHJfcCkgeworCQlvZl9ub2RlX3B1dChvZm4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZWdhZGRyNjQgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhvZm4sIHJlZ2FkZHJfcCk7CisKKwlvZl9ub2RlX3B1dChvZm4pOworCisJcmV0dXJuIGlvcmVtYXAoKHUzMilyZWdhZGRyNjQsICh1MzIpc2l6ZTY0KTsKK30KK0VYUE9SVF9TWU1CT0wobXBjNTJ4eF9maW5kX2FuZF9tYXApOworCisKKy8qKgorICogCW1wYzUyeHhfZmluZF9pcGJfZnJlcSAtIEZpbmQgdGhlIElQQiBidXMgZnJlcXVlbmN5IGZvciBhIGRldmljZQorICogCUBub2RlOglkZXZpY2Ugbm9kZQorICoKKyAqIAlSZXR1cm5zIElQQiBidXMgZnJlcXVlbmN5LCBvciAwIGlmIHRoZSBidXMgZnJlcXVlbmN5IGNhbm5vdCBiZSBmb3VuZC4KKyAqLwordW5zaWduZWQgaW50CittcGM1Mnh4X2ZpbmRfaXBiX2ZyZXEoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJY29uc3QgdW5zaWduZWQgaW50ICpwX2lwYl9mcmVxID0gTlVMTDsKKworCW9mX25vZGVfZ2V0KG5vZGUpOworCXdoaWxlIChub2RlKSB7CisJCXBfaXBiX2ZyZXEgPSBnZXRfcHJvcGVydHkobm9kZSwgImJ1cy1mcmVxdWVuY3kiLCBOVUxMKTsKKwkJaWYgKHBfaXBiX2ZyZXEpCisJCQlicmVhazsKKworCQlucCA9IG9mX2dldF9wYXJlbnQobm9kZSk7CisJCW9mX25vZGVfcHV0KG5vZGUpOworCQlub2RlID0gbnA7CisJfQorCWlmIChub2RlKQorCQlvZl9ub2RlX3B1dChub2RlKTsKKworCXJldHVybiBwX2lwYl9mcmVxID8gKnBfaXBiX2ZyZXEgOiAwOworfQorRVhQT1JUX1NZTUJPTChtcGM1Mnh4X2ZpbmRfaXBiX2ZyZXEpOworCisKK3ZvaWQgX19pbml0CittcGM1Mnh4X3NldHVwX2NwdSh2b2lkKQoreworCXN0cnVjdCBtcGM1Mnh4X2NkbSAgX19pb21lbSAqY2RtOworCXN0cnVjdCBtcGM1Mnh4X3hsYiAgX19pb21lbSAqeGxiOworCisJLyogTWFwIHpvbmVzICovCisJY2RtID0gbXBjNTJ4eF9maW5kX2FuZF9tYXAoIm1wYzUyeHgtY2RtIik7CisJeGxiID0gbXBjNTJ4eF9maW5kX2FuZF9tYXAoIm1wYzUyeHgteGxiIik7CisKKwlpZiAoIWNkbSB8fCAheGxiKSB7CisJCXByaW50ayhLRVJOX0VSUiBfX0ZJTEVfXyAiOiAiCisJCQkiRXJyb3Igd2hpbGUgbWFwcGluZyBDRE0vWExCIGR1cmluZyBtcGM1Mnh4X3NldHVwX2NwdS4gIgorCQkJIkV4cGVjdCBzb21lIGFibm9ybWFsIGJlaGF2aW9yXG4iKTsKKwkJZ290byB1bm1hcF9yZWdzOworCX0KKworCS8qIFVzZSBpbnRlcm5hbCA0OCBNaHogKi8KKwlvdXRfOCgmY2RtLT5leHRfNDhtaHpfZW4sIDB4MDApOworCW91dF84KCZjZG0tPmZkX2VuYWJsZSwgMHgwMSk7CisJaWYgKGluX2JlMzIoJmNkbS0+cnN0Y2ZnKSAmIDB4NDApCS8qIEFzc3VtZXMgMzNNaHogY2xvY2sgKi8KKwkJb3V0X2JlMTYoJmNkbS0+ZmRfY291bnRlcnMsIDB4MDAwMSk7CisJZWxzZQorCQlvdXRfYmUxNigmY2RtLT5mZF9jb3VudGVycywgMHg1NTU1KTsKKworCS8qIENvbmZpZ3VyZSB0aGUgWExCIEFyYml0ZXIgcHJpb3JpdGllcyAqLworCW91dF9iZTMyKCZ4bGItPm1hc3Rlcl9wcmlfZW5hYmxlLCAweGZmKTsKKwlvdXRfYmUzMigmeGxiLT5tYXN0ZXJfcHJpb3JpdHksIDB4MTExMTExMTEpOworCisJLyogRGlzYWJsZSBYTEIgcGlwZWxpbmluZyAqLworCS8qIChjZnIgZXJyYXRlIDI5Mi4gV2UgY291bGQgZG8gdGhpcyBvbmx5IGp1c3QgYmVmb3JlIEFUQSBQSU8KKwkgICAgdHJhbnNhY3Rpb24gYW5kIHJlLWVuYWJsZSBpdCBhZnRlcndhcmRzIC4uLikgKi8KKwlvdXRfYmUzMigmeGxiLT5jb25maWcsIGluX2JlMzIoJnhsYi0+Y29uZmlnKSB8IE1QQzUyeHhfWExCX0NGR19QTERJUyk7CisKKwkvKiBVbm1hcCB6b25lcyAqLwordW5tYXBfcmVnczoKKwlpZiAoY2RtKSBpb3VubWFwKGNkbSk7CisJaWYgKHhsYikgaW91bm1hcCh4bGIpOworfQorCitzdGF0aWMgaW50IF9faW5pdAorbXBjNTJ4eF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwkvKiBGaW5kIGV2ZXJ5IGNoaWxkIG9mIHRoZSBTT0Mgbm9kZSBhbmQgYWRkIGl0IHRvIG9mX3BsYXRmb3JtICovCisJcmV0dXJuIG9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworZGV2aWNlX2luaXRjYWxsKG1wYzUyeHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5MWE2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BpYy5jCkBAIC0wLDAgKzEsNDczIEBACisvKgorICoKKyAqIFByb2dyYW1tYWJsZSBJbnRlcnJ1cHQgQ29udHJvbGxlciBmdW5jdGlvbnMgZm9yIHRoZSBGcmVlc2NhbGUgTVBDNTJ4eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnBsYW4gR21iSAorICoKKyAqIEJhc2VkIG9uIHRoZSBjb2RlIGZyb20gdGhlIDIuNCBrZXJuZWwgYnkKKyAqIERhbGUgRmFybnN3b3J0aCA8ZGZhcm5zd29ydGhAbXZpc3RhLmNvbT4gYW5kIEtlbnQgQm9yZy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhdmlzdGEgU29mdHdhcmUsIEluYworICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CisjaW5jbHVkZSAibXBjNTJ4eF9waWMuaCIKKworLyoKKyAqCisqLworCitzdGF0aWMgc3RydWN0IG1wYzUyeHhfaW50ciBfX2lvbWVtICppbnRyOworc3RhdGljIHN0cnVjdCBtcGM1Mnh4X3NkbWEgX19pb21lbSAqc2RtYTsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2hvc3QgKm1wYzUyeHhfaXJxaG9zdCA9IE5VTEw7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1wYzUyeHhfbWFwX3NlbnNlc1s0XSA9IHsKKwlJUlFfVFlQRV9MRVZFTF9ISUdILAorCUlSUV9UWVBFX0VER0VfUklTSU5HLAorCUlSUV9UWVBFX0VER0VfRkFMTElORywKKwlJUlFfVFlQRV9MRVZFTF9MT1csCit9OworCisvKgorICoKKyovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb19iZV9zZXRiaXQodTMyIF9faW9tZW0gKmFkZHIsIGludCBiaXRubykKK3sKKwlvdXRfYmUzMihhZGRyLCBpbl9iZTMyKGFkZHIpIHwgKDEgPDwgYml0bm8pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvX2JlX2NscmJpdCh1MzIgX19pb21lbSAqYWRkciwgaW50IGJpdG5vKQoreworCW91dF9iZTMyKGFkZHIsIGluX2JlMzIoYWRkcikgJiB+KDEgPDwgYml0bm8pKTsKK30KKworLyoKKyAqIElSUVswLTNdIGludGVycnVwdCBpcnFfY2hpcAorKi8KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9leHRpcnFfbWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgaXJxOworCWludCBsMmlycTsKKworCWlycSA9IGlycV9tYXBbdmlycV0uaHdpcnE7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIGwyPSVkXG4iLCBfX2Z1bmNfXywgaXJxLCBsMmlycSk7CisKKwlpb19iZV9jbHJiaXQoJmludHItPmN0cmwsIDExIC0gbDJpcnEpOworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X2V4dGlycV91bm1hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IGlycTsKKwlpbnQgbDJpcnE7CisKKwlpcnEgPSBpcnFfbWFwW3ZpcnFdLmh3aXJxOworCWwyaXJxID0gKGlycSAmIE1QQzUyeHhfSVJRX0wyX01BU0spID4+IE1QQzUyeHhfSVJRX0wyX09GRlNFVDsKKworCXByX2RlYnVnKCIlczogaXJxPSV4LiBsMj0lZFxuIiwgX19mdW5jX18sIGlycSwgbDJpcnEpOworCisJaW9fYmVfc2V0Yml0KCZpbnRyLT5jdHJsLCAxMSAtIGwyaXJxKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9leHRpcnFfYWNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBpcnE7CisJaW50IGwyaXJxOworCisJaXJxID0gaXJxX21hcFt2aXJxXS5od2lycTsKKwlsMmlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMl9PRkZTRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IGlycT0leC4gbDI9JWRcbiIsIF9fZnVuY19fLCBpcnEsIGwyaXJxKTsKKworCWlvX2JlX3NldGJpdCgmaW50ci0+Y3RybCwgMjctbDJpcnEpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1wYzUyeHhfZXh0aXJxX2lycWNoaXAgPSB7CisJLnR5cGVuYW1lID0gIiBNUEM1Mnh4IElSUVswLTNdICIsCisJLm1hc2sgPSBtcGM1Mnh4X2V4dGlycV9tYXNrLAorCS51bm1hc2sgPSBtcGM1Mnh4X2V4dGlycV91bm1hc2ssCisJLmFjayA9IG1wYzUyeHhfZXh0aXJxX2FjaywKK307CisKKy8qCisgKiBNYWluIGludGVycnVwdCBpcnFfY2hpcAorKi8KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9tYWluX21hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IGlycTsKKwlpbnQgbDJpcnE7CisKKwlpcnEgPSBpcnFfbWFwW3ZpcnFdLmh3aXJxOworCWwyaXJxID0gKGlycSAmIE1QQzUyeHhfSVJRX0wyX01BU0spID4+IE1QQzUyeHhfSVJRX0wyX09GRlNFVDsKKworCXByX2RlYnVnKCIlczogaXJxPSV4LiBsMj0lZFxuIiwgX19mdW5jX18sIGlycSwgbDJpcnEpOworCisJaW9fYmVfc2V0Yml0KCZpbnRyLT5tYWluX21hc2ssIDE1IC0gbDJpcnEpOworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X21haW5fdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBpcnE7CisJaW50IGwyaXJxOworCisJaXJxID0gaXJxX21hcFt2aXJxXS5od2lycTsKKwlsMmlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMl9PRkZTRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IGlycT0leC4gbDI9JWRcbiIsIF9fZnVuY19fLCBpcnEsIGwyaXJxKTsKKworCWlvX2JlX2NscmJpdCgmaW50ci0+bWFpbl9tYXNrLCAxNSAtIGwyaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM1Mnh4X21haW5faXJxY2hpcCA9IHsKKwkudHlwZW5hbWUgPSAiTVBDNTJ4eCBNYWluIiwKKwkubWFzayA9IG1wYzUyeHhfbWFpbl9tYXNrLAorCS5tYXNrX2FjayA9IG1wYzUyeHhfbWFpbl9tYXNrLAorCS51bm1hc2sgPSBtcGM1Mnh4X21haW5fdW5tYXNrLAorfTsKKworLyoKKyAqIFBlcmlwaGVyYWxzIGludGVycnVwdCBpcnFfY2hpcAorKi8KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9wZXJpcGhfbWFzayh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgaXJxOworCWludCBsMmlycTsKKworCWlycSA9IGlycV9tYXBbdmlycV0uaHdpcnE7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIGwyPSVkXG4iLCBfX2Z1bmNfXywgaXJxLCBsMmlycSk7CisKKwlpb19iZV9zZXRiaXQoJmludHItPnBlcl9tYXNrLCAzMSAtIGwyaXJxKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9wZXJpcGhfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBpcnE7CisJaW50IGwyaXJxOworCisJaXJxID0gaXJxX21hcFt2aXJxXS5od2lycTsKKwlsMmlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMl9PRkZTRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IGlycT0leC4gbDI9JWRcbiIsIF9fZnVuY19fLCBpcnEsIGwyaXJxKTsKKworCWlvX2JlX2NscmJpdCgmaW50ci0+cGVyX21hc2ssIDMxIC0gbDJpcnEpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1wYzUyeHhfcGVyaXBoX2lycWNoaXAgPSB7CisJLnR5cGVuYW1lID0gIk1QQzUyeHggUGVyaXBoZXJhbHMiLAorCS5tYXNrID0gbXBjNTJ4eF9wZXJpcGhfbWFzaywKKwkubWFza19hY2sgPSBtcGM1Mnh4X3BlcmlwaF9tYXNrLAorCS51bm1hc2sgPSBtcGM1Mnh4X3BlcmlwaF91bm1hc2ssCit9OworCisvKgorICogU0RNQSBpbnRlcnJ1cHQgaXJxX2NoaXAKKyovCisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfc2RtYV9tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBpcnE7CisJaW50IGwyaXJxOworCisJaXJxID0gaXJxX21hcFt2aXJxXS5od2lycTsKKwlsMmlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMl9PRkZTRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IGlycT0leC4gbDI9JWRcbiIsIF9fZnVuY19fLCBpcnEsIGwyaXJxKTsKKworCWlvX2JlX3NldGJpdCgmc2RtYS0+SW50TWFzaywgbDJpcnEpOworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3NkbWFfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBpcnE7CisJaW50IGwyaXJxOworCisJaXJxID0gaXJxX21hcFt2aXJxXS5od2lycTsKKwlsMmlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMl9PRkZTRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IGlycT0leC4gbDI9JWRcbiIsIF9fZnVuY19fLCBpcnEsIGwyaXJxKTsKKworCWlvX2JlX2NscmJpdCgmc2RtYS0+SW50TWFzaywgbDJpcnEpOworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3NkbWFfYWNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBpcnE7CisJaW50IGwyaXJxOworCisJaXJxID0gaXJxX21hcFt2aXJxXS5od2lycTsKKwlsMmlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMl9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMl9PRkZTRVQ7CisKKwlwcl9kZWJ1ZygiJXM6IGlycT0leC4gbDI9JWRcbiIsIF9fZnVuY19fLCBpcnEsIGwyaXJxKTsKKworCW91dF9iZTMyKCZzZG1hLT5JbnRQZW5kLCAxIDw8IGwyaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtcGM1Mnh4X3NkbWFfaXJxY2hpcCA9IHsKKwkudHlwZW5hbWUgPSAiTVBDNTJ4eCBTRE1BIiwKKwkubWFzayA9IG1wYzUyeHhfc2RtYV9tYXNrLAorCS51bm1hc2sgPSBtcGM1Mnh4X3NkbWFfdW5tYXNrLAorCS5hY2sgPSBtcGM1Mnh4X3NkbWFfYWNrLAorfTsKKworLyoKKyAqIGlycV9ob3N0CisqLworCitzdGF0aWMgaW50IG1wYzUyeHhfaXJxaG9zdF9tYXRjaChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlwcl9kZWJ1ZygiJXM6IG5vZGU9JXBcbiIsIF9fZnVuY19fLCBub2RlKTsKKwlyZXR1cm4gbXBjNTJ4eF9pcnFob3N0LT5ob3N0X2RhdGEgPT0gbm9kZTsKK30KKworc3RhdGljIGludCBtcGM1Mnh4X2lycWhvc3RfeGxhdGUoc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmN0LAorCQkJCSB1MzIgKiBpbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkgaXJxX2h3X251bWJlcl90ICogb3V0X2h3aXJxLAorCQkJCSB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKK3sKKwlpbnQgaW50cnZlY3RfbDE7CisJaW50IGludHJ2ZWN0X2wyOworCWludCBpbnRydmVjdF90eXBlOworCWludCBpbnRydmVjdF9saW51eDsKKworCWlmIChpbnRzaXplICE9IDMpCisJCXJldHVybiAtMTsKKworCWludHJ2ZWN0X2wxID0gKGludClpbnRzcGVjWzBdOworCWludHJ2ZWN0X2wyID0gKGludClpbnRzcGVjWzFdOworCWludHJ2ZWN0X3R5cGUgPSAoaW50KWludHNwZWNbMl07CisKKwlpbnRydmVjdF9saW51eCA9CisJICAgIChpbnRydmVjdF9sMSA8PCBNUEM1Mnh4X0lSUV9MMV9PRkZTRVQpICYgTVBDNTJ4eF9JUlFfTDFfTUFTSzsKKwlpbnRydmVjdF9saW51eCB8PQorCSAgICAoaW50cnZlY3RfbDIgPDwgTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUKSAmIE1QQzUyeHhfSVJRX0wyX01BU0s7CisKKwlwcl9kZWJ1ZygicmV0dXJuICV4LCBsMT0lZCwgbDI9JWRcbiIsIGludHJ2ZWN0X2xpbnV4LCBpbnRydmVjdF9sMSwKKwkJIGludHJ2ZWN0X2wyKTsKKworCSpvdXRfaHdpcnEgPSBpbnRydmVjdF9saW51eDsKKwkqb3V0X2ZsYWdzID0gbXBjNTJ4eF9tYXBfc2Vuc2VzW2ludHJ2ZWN0X3R5cGVdOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY29ycmVjdCBJUlEgdHlwZSBvdXQKKyAqIG9mIHRoZSBNUEMgcmVncworICogT25seSBleHRlcm5hbHMgSVJRcyBuZWVkcyB0aGlzCisqLworc3RhdGljIGludCBtcGM1Mnh4X2lycXhfZ2V0dHlwZShpbnQgaXJxKQoreworCWludCB0eXBlOworCXUzMiBjdHJsX3JlZzsKKworCWN0cmxfcmVnID0gaW5fYmUzMigmaW50ci0+Y3RybCk7CisJdHlwZSA9IChjdHJsX3JlZyA+PiAoMjIgLSBpcnEgKiAyKSkgJiAweDM7CisKKwlyZXR1cm4gbXBjNTJ4eF9tYXBfc2Vuc2VzW3R5cGVdOworfQorCitzdGF0aWMgaW50IG1wYzUyeHhfaXJxaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgICAgICBpcnFfaHdfbnVtYmVyX3QgaXJxKQoreworCWludCBsMWlycTsKKwlpbnQgbDJpcnE7CisJc3RydWN0IGlycV9jaGlwICpnb29kX2lycWNoaXA7CisJdm9pZCAqZ29vZF9oYW5kbGU7CisJaW50IHR5cGU7CisKKwlsMWlycSA9IChpcnEgJiBNUEM1Mnh4X0lSUV9MMV9NQVNLKSA+PiBNUEM1Mnh4X0lSUV9MMV9PRkZTRVQ7CisJbDJpcnEgPSAoaXJxICYgTVBDNTJ4eF9JUlFfTDJfTUFTSykgPj4gTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUOworCisJLyoKKwkgKiBNb3N0IG9mIG91cnMgSVJRcyB3aWxsIGJlIGxldmVsIGxvdworCSAqIE9ubHkgZXh0ZXJuYWwgSVJRcyBvbiBzb21lIHBsYXRmb3JtIG1heSBiZSBvdGhlcnMKKwkgKi8KKwl0eXBlID0gSVJRX1RZUEVfTEVWRUxfTE9XOworCisJc3dpdGNoIChsMWlycSkgeworCWNhc2UgTVBDNTJ4eF9JUlFfTDFfQ1JJVDoKKwkJcHJfZGVidWcoIiVzOiBDcml0aWNhbC4gbDI9JXhcbiIsIF9fZnVuY19fLCBsMmlycSk7CisKKwkJQlVHX09OKGwyaXJxICE9IDApOworCisJCXR5cGUgPSBtcGM1Mnh4X2lycXhfZ2V0dHlwZShsMmlycSk7CisJCWdvb2RfaXJxY2hpcCA9ICZtcGM1Mnh4X2V4dGlycV9pcnFjaGlwOworCQlicmVhazsKKworCWNhc2UgTVBDNTJ4eF9JUlFfTDFfTUFJTjoKKwkJcHJfZGVidWcoIiVzOiBNYWluIElSUVsxLTNdIGwyPSV4XG4iLCBfX2Z1bmNfXywgbDJpcnEpOworCisJCWlmICgobDJpcnEgPj0gMSkgJiYgKGwyaXJxIDw9IDMpKSB7CisJCQl0eXBlID0gbXBjNTJ4eF9pcnF4X2dldHR5cGUobDJpcnEpOworCQkJZ29vZF9pcnFjaGlwID0gJm1wYzUyeHhfZXh0aXJxX2lycWNoaXA7CisJCX0gZWxzZSB7CisJCQlnb29kX2lycWNoaXAgPSAmbXBjNTJ4eF9tYWluX2lycWNoaXA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1QQzUyeHhfSVJRX0wxX1BFUlA6CisJCXByX2RlYnVnKCIlczogUGVyaXBoZXJhbHMuIGwyPSV4XG4iLCBfX2Z1bmNfXywgbDJpcnEpOworCQlnb29kX2lycWNoaXAgPSAmbXBjNTJ4eF9wZXJpcGhfaXJxY2hpcDsKKwkJYnJlYWs7CisKKwljYXNlIE1QQzUyeHhfSVJRX0wxX1NETUE6CisJCXByX2RlYnVnKCIlczogU0RNQS4gbDI9JXhcbiIsIF9fZnVuY19fLCBsMmlycSk7CisJCWdvb2RfaXJxY2hpcCA9ICZtcGM1Mnh4X3NkbWFfaXJxY2hpcDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiJXM6IEVycm9yLCB1bmtub3duIEwxIElSUSAoMHgleClcbiIsIF9fZnVuY19fLCBsMWlycSk7CisJCXByaW50ayhLRVJOX0VSUiAiVW5rbm93IElSUSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQlnb29kX2hhbmRsZSA9IGhhbmRsZV9lZGdlX2lycTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ29vZF9oYW5kbGUgPSBoYW5kbGVfbGV2ZWxfaXJxOworCX0KKworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCBnb29kX2lycWNoaXAsIGdvb2RfaGFuZGxlKTsKKworCXByX2RlYnVnKCIlczogdmlycT0leCwgaHc9JXguIHR5cGU9JXhcbiIsIF9fZnVuY19fLCB2aXJxLAorCQkgKGludClpcnEsIHR5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2hvc3Rfb3BzIG1wYzUyeHhfaXJxaG9zdF9vcHMgPSB7CisJLm1hdGNoID0gbXBjNTJ4eF9pcnFob3N0X21hdGNoLAorCS54bGF0ZSA9IG1wYzUyeHhfaXJxaG9zdF94bGF0ZSwKKwkubWFwID0gbXBjNTJ4eF9pcnFob3N0X21hcCwKK307CisKKy8qCisgKiBpbml0IChwdWJsaWMpCisqLworCit2b2lkIF9faW5pdCBtcGM1Mnh4X2luaXRfaXJxKHZvaWQpCit7CisJdTMyIGludHJfY3RybDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBpY25vZGU7CisKKwkvKiBSZW1hcCB0aGUgbmVjZXNzYXJ5IHpvbmVzICovCisJcGljbm9kZSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJtcGM1Mnh4LXBpYyIpOworCisJaW50ciA9IG1wYzUyeHhfZmluZF9hbmRfbWFwKCJtcGM1Mnh4LXBpYyIpOworCWlmICghaW50cikKKwkJcGFuaWMoX19GSUxFX18JIjogZmluZF9hbmRfbWFwIGZhaWxlZCBvbiAnbXBjNTJ4eC1waWMnLiAiCisJCQkJIkNoZWNrIG5vZGUgISIpOworCisJc2RtYSA9IG1wYzUyeHhfZmluZF9hbmRfbWFwKCJtcGM1Mnh4LWJlc3Rjb21tIik7CisJaWYgKCFzZG1hKQorCQlwYW5pYyhfX0ZJTEVfXwkiOiBmaW5kX2FuZF9tYXAgZmFpbGVkIG9uICdtcGM1Mnh4LWJlc3Rjb21tJy4gIgorCQkJCSJDaGVjayBub2RlICEiKTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdCBzb3VyY2VzLiAqLworCW91dF9iZTMyKCZzZG1hLT5JbnRQZW5kLCAweGZmZmZmZmZmKTsJLyogMSBtZWFucyBjbGVhciBwZW5kaW5nICovCisJb3V0X2JlMzIoJnNkbWEtPkludE1hc2ssIDB4ZmZmZmZmZmYpOwkvKiAxIG1lYW5zIGRpc2FibGVkICovCisJb3V0X2JlMzIoJmludHItPnBlcl9tYXNrLCAweDdmZmZmYzAwKTsJLyogMSBtZWFucyBkaXNhYmxlZCAqLworCW91dF9iZTMyKCZpbnRyLT5tYWluX21hc2ssIDB4MDAwMTBmZmYpOwkvKiAxIG1lYW5zIGRpc2FibGVkICovCisJaW50cl9jdHJsID0gaW5fYmUzMigmaW50ci0+Y3RybCk7CisJaW50cl9jdHJsICY9IDB4MDBmZjAwMDA7CS8qIEtlZXBzIElSUVswLTNdIGNvbmZpZyAqLworCWludHJfY3RybCB8PQkweDBmMDAwMDAwIHwJLyogY2xlYXIgSVJRIDAtMyAqLworCQkJMHgwMDAwMTAwMCB8CS8qIE1FRSBtYXN0ZXIgZXh0ZXJuYWwgZW5hYmxlICovCisJCQkweDAwMDAwMDAwIHwJLyogMCBtZWFucyBkaXNhYmxlIElSUSAwLTMgKi8KKwkJCTB4MDAwMDAwMDE7CS8qIENFYiByb3V0ZSBjcml0aWNhbCBub3JtYWxseSAqLworCW91dF9iZTMyKCZpbnRyLT5jdHJsLCBpbnRyX2N0cmwpOworCisJLyogWmVybyBhIGJ1bmNoIG9mIHRoZSBwcmlvcml0eSBzZXR0aW5ncy4gKi8KKwlvdXRfYmUzMigmaW50ci0+cGVyX3ByaTEsIDApOworCW91dF9iZTMyKCZpbnRyLT5wZXJfcHJpMiwgMCk7CisJb3V0X2JlMzIoJmludHItPnBlcl9wcmkzLCAwKTsKKwlvdXRfYmUzMigmaW50ci0+bWFpbl9wcmkxLCAwKTsKKwlvdXRfYmUzMigmaW50ci0+bWFpbl9wcmkyLCAwKTsKKworCS8qCisJICogQXMgbGFzdCBzdGVwLCBhZGQgYW4gaXJxIGhvc3QgdG8gdHJhbnNsYXRlIHRoZSByZWFsCisJICogaHcgaXJxIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBvZncgdG8gbGludXggdmlycQorCSAqLworCisJbXBjNTJ4eF9pcnFob3N0ID0gaXJxX2FsbG9jX2hvc3QoSVJRX0hPU1RfTUFQX0xJTkVBUiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEM1Mnh4X0lSUV9ISUdIVEVTVEhXSVJRLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtcGM1Mnh4X2lycWhvc3Rfb3BzLCAtMSk7CisKKwlpZiAoIW1wYzUyeHhfaXJxaG9zdCkKKwkJcGFuaWMoX19GSUxFX18gIjogQ2Fubm90IGFsbG9jYXRlIHRoZSBJUlEgaG9zdFxuIik7CisKKwltcGM1Mnh4X2lycWhvc3QtPmhvc3RfZGF0YSA9IHBpY25vZGU7CisJcHJpbnRrKEtFUk5fSU5GTyAiTVBDNTJ4eCBQSUMgaXMgdXAgYW5kIHJ1bm5pbmchXG4iKTsKK30KKworLyoKKyAqIGdldF9pcnEgKHB1YmxpYykKKyovCit1bnNpZ25lZCBpbnQgbXBjNTJ4eF9nZXRfaXJxKHZvaWQpCit7CisJdTMyIHN0YXR1czsKKwlpbnQgaXJxID0gTk9fSVJRX0lHTk9SRTsKKworCXN0YXR1cyA9IGluX2JlMzIoJmludHItPmVuY19zdGF0dXMpOworCWlmIChzdGF0dXMgJiAweDAwMDAwNDAwKSB7CS8qIGNyaXRpY2FsICovCisJCWlycSA9IChzdGF0dXMgPj4gOCkgJiAweDM7CisJCWlmIChpcnEgPT0gMikJLyogaGlnaCBwcmlvcml0eSBwZXJpcGhlcmFsICovCisJCQlnb3RvIHBlcmlwaGVyYWw7CisJCWlycSB8PQkoTVBDNTJ4eF9JUlFfTDFfQ1JJVCA8PCBNUEM1Mnh4X0lSUV9MMV9PRkZTRVQpICYKKwkJCU1QQzUyeHhfSVJRX0wxX01BU0s7CisJfSBlbHNlIGlmIChzdGF0dXMgJiAweDAwMjAwMDAwKSB7CS8qIG1haW4gKi8KKwkJaXJxID0gKHN0YXR1cyA+PiAxNikgJiAweDFmOworCQlpZiAoaXJxID09IDQpCS8qIGxvdyBwcmlvcml0eSBwZXJpcGhlcmFsICovCisJCQlnb3RvIHBlcmlwaGVyYWw7CisJCWlycSB8PQkoTVBDNTJ4eF9JUlFfTDFfTUFJTiA8PCBNUEM1Mnh4X0lSUV9MMV9PRkZTRVQpICYKKwkJCU1QQzUyeHhfSVJRX0wxX01BU0s7CisJfSBlbHNlIGlmIChzdGF0dXMgJiAweDIwMDAwMDAwKSB7CS8qIHBlcmlwaGVyYWwgKi8KKwkgICAgICBwZXJpcGhlcmFsOgorCQlpcnEgPSAoc3RhdHVzID4+IDI0KSAmIDB4MWY7CisJCWlmIChpcnEgPT0gMCkgewkvKiBiZXN0Y29tbSAqLworCQkJc3RhdHVzID0gaW5fYmUzMigmc2RtYS0+SW50UGVuZCk7CisJCQlpcnEgPSBmZnMoc3RhdHVzKSAtIDE7CisJCQlpcnEgfD0JKE1QQzUyeHhfSVJRX0wxX1NETUEgPDwgTVBDNTJ4eF9JUlFfTDFfT0ZGU0VUKSAmCisJCQkJTVBDNTJ4eF9JUlFfTDFfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCWlycSB8PQkoTVBDNTJ4eF9JUlFfTDFfUEVSUCA8PCBNUEM1Mnh4X0lSUV9MMV9PRkZTRVQpICYKKwkJCQlNUEM1Mnh4X0lSUV9MMV9NQVNLOworCQl9CisJfQorCisJcHJfZGVidWcoIiVzOiBpcnE9JXguIHZpcnE9JWRcbiIsIF9fZnVuY19fLCBpcnEsCisJCSBpcnFfbGluZWFyX3Jldm1hcChtcGM1Mnh4X2lycWhvc3QsIGlycSkpOworCisJcmV0dXJuIGlycV9saW5lYXJfcmV2bWFwKG1wYzUyeHhfaXJxaG9zdCwgaXJxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BpYy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyNmJjZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BpYy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSBmb3IgRnJlZXNjYWxlIE1QQzUyeHggSW50ZXJydXB0IGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpZm5kZWYgX19QT1dFUlBDX1NZU0RFVl9NUEM1Mnh4X1BJQ19IX18KKyNkZWZpbmUgX19QT1dFUlBDX1NZU0RFVl9NUEM1Mnh4X1BJQ19IX18KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisKKy8qIEhXIElSUSBtYXBwaW5nICovCisjZGVmaW5lIE1QQzUyeHhfSVJRX0wxX0NSSVQJKDApCisjZGVmaW5lIE1QQzUyeHhfSVJRX0wxX01BSU4JKDEpCisjZGVmaW5lIE1QQzUyeHhfSVJRX0wxX1BFUlAJKDIpCisjZGVmaW5lIE1QQzUyeHhfSVJRX0wxX1NETUEJKDMpCisKKyNkZWZpbmUgTVBDNTJ4eF9JUlFfTDFfT0ZGU0VUICAgKDYpCisjZGVmaW5lIE1QQzUyeHhfSVJRX0wxX01BU0sgICAgICgweDAwYzApCisKKyNkZWZpbmUgTVBDNTJ4eF9JUlFfTDJfT0ZGU0VUICAgKDApCisjZGVmaW5lIE1QQzUyeHhfSVJRX0wyX01BU0sgICAgICgweDAwM2YpCisKKyNkZWZpbmUgTVBDNTJ4eF9JUlFfSElHSFRFU1RIV0lSUSAoMHhkMCkKKworCisvKiBJbnRlcnJ1cHQgY29udHJvbGxlciBSZWdpc3RlciBzZXQgKi8KK3N0cnVjdCBtcGM1Mnh4X2ludHIgeworCXUzMiBwZXJfbWFzazsJCS8qIElOVFIgKyAweDAwICovCisJdTMyIHBlcl9wcmkxOwkJLyogSU5UUiArIDB4MDQgKi8KKwl1MzIgcGVyX3ByaTI7CQkvKiBJTlRSICsgMHgwOCAqLworCXUzMiBwZXJfcHJpMzsJCS8qIElOVFIgKyAweDBjICovCisJdTMyIGN0cmw7CQkvKiBJTlRSICsgMHgxMCAqLworCXUzMiBtYWluX21hc2s7CQkvKiBJTlRSICsgMHgxNCAqLworCXUzMiBtYWluX3ByaTE7CQkvKiBJTlRSICsgMHgxOCAqLworCXUzMiBtYWluX3ByaTI7CQkvKiBJTlRSICsgMHgxYyAqLworCXUzMiByZXNlcnZlZDE7CQkvKiBJTlRSICsgMHgyMCAqLworCXUzMiBlbmNfc3RhdHVzOwkJLyogSU5UUiArIDB4MjQgKi8KKwl1MzIgY3JpdF9zdGF0dXM7CS8qIElOVFIgKyAweDI4ICovCisJdTMyIG1haW5fc3RhdHVzOwkvKiBJTlRSICsgMHgyYyAqLworCXUzMiBwZXJfc3RhdHVzOwkJLyogSU5UUiArIDB4MzAgKi8KKwl1MzIgcmVzZXJ2ZWQyOwkJLyogSU5UUiArIDB4MzQgKi8KKwl1MzIgcGVyX2Vycm9yOwkJLyogSU5UUiArIDB4MzggKi8KK307CisKKyNlbmRpZiAvKiBfX1BPV0VSUENfU1lTREVWX01QQzUyeHhfUElDX0hfXyAqLworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4Mnh4X2Fkcy5jCmluZGV4IGJiOWFjYmIuLmVhODgwZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4Mnh4X2Fkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4Mnh4X2Fkcy5jCkBAIC01MTUsMTYgKzUxNSw2IEBACiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CiAKLXN0YXRpYyB2b2lkCi1fX2luaXQgbXBjODJ4eF9wY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOwotCX0KLX0KLQogdm9pZCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCWludCBsZW47CkBAIC01OTcsOSArNTg3LDYgQEAKIAkJYWRkX2JyaWRnZShucCk7CiAKIAlvZl9ub2RlX3B1dChucCk7Ci0JcHBjX21kLnBjaV9tYXBfaXJxID0gTlVMTDsKLQlwcGNfbWQucGNpYmlvc19maXh1cCA9IG1wYzgyeHhfcGNpYmlvc19maXh1cDsKLQlwcGNfbWQucGNpYmlvc19maXh1cF9idXMgPSBOVUxMOwogI2VuZGlmCiAKICNpZmRlZiAgQ09ORklHX1JPT1RfTkZTCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCmluZGV4IDA5NzVlOTQuLmVkY2Q1YjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCkBAIC0yMSw3ICsyMSw3IEBACiAJICBCZSBhd2FyZSB0aGF0IFBDSSBidXNlcyBjYW4gb25seSBmdW5jdGlvbiB3aGVuIFNZUyBib2FyZCBpcyBwbHVnZ2VkCiAJICBpbnRvIHRoZSBQSUIgKFBsYXRmb3JtIElPIEJvYXJkKSBib2FyZCBmcm9tIEZyZWVzY2FsZSB3aGljaCBwcm92aWRlCiAJICAzIFBDSSBzbG90cy4gIFRoZSBQSUJzIFBDSSBpbml0aWFsaXphdGlvbiBpcyB0aGUgYm9vdGxvYWRlcidzCi0JICByZXNwb25zaWJsaWx0eS4KKwkgIHJlc3BvbnNpYmlsaXR5LgogCiBjb25maWcgTVBDODM0eF9JVFgKIAlib29sICJGcmVlc2NhbGUgTVBDODM0eCBJVFgiCkBAIC0zMCw3ICszMCwxNCBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDIDgzNHggSVRYIGV2YWx1YXRpb24gYm9hcmQuCiAKIAkgIEJlIGF3YXJlIHRoYXQgUENJIGluaXRpYWxpemF0aW9uIGlzIHRoZSBib290bG9hZGVyJ3MKLQkgIHJlc3BvbnNpYmxpbHR5LgorCSAgcmVzcG9uc2liaWxpdHkuCisKK2NvbmZpZyBNUEM4MzYwRV9QQgorCWJvb2wgIkZyZWVzY2FsZSBNUEM4MzYwRSBQQiIKKwlzZWxlY3QgREVGQVVMVF9VSU1BR0UKKwlzZWxlY3QgUVVJQ0NfRU5HSU5FCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDODM2eCBFTURTIFByb2Nlc3NvciBCb2FyZC4KIAogZW5kY2hvaWNlCiAKQEAgLTQ2LDQgKzUzLDEwIEBACiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKIAlkZWZhdWx0IHkgaWYgTVBDODM0eF9TWVMgfHwgTVBDODM0eF9JVFgKIAorY29uZmlnIFBQQ19NUEM4MzZ4CisJYm9vbAorCXNlbGVjdCBQUENfVURCR18xNjU1MAorCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCisJZGVmYXVsdCB5IGlmIE1QQzgzNjBFX1BCCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQppbmRleCA5Mzg3YTExLi5mMWFhN2UyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCkBAIC01LDMgKzUsNSBAQAogb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vCiBvYmotJChDT05GSUdfTVBDODM0eF9TWVMpCSs9IG1wYzgzNHhfc3lzLm8KIG9iai0kKENPTkZJR19NUEM4MzR4X0lUWCkJKz0gbXBjODM0eF9pdHgubworb2JqLSQoQ09ORklHX01QQzgzNjBFX1BCKQkrPSBtcGM4MzYwZV9wYi5vCitvYmotJChDT05GSUdfTVBDODMyeF9NRFMpCSs9IG1wYzgzMnhfbWRzLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKaW5kZXggNTRkZWE5ZDQuLmY1OGM5NzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KIAorI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CkBAIC05Niw4ICs5Nyw2IEBACiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKIAkJYWRkX2JyaWRnZShucCk7Ci0KLQlwcGNfbWQucGNpX3N3aXp6bGUgPSBjb21tb25fc3dpenpsZTsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCkBAIC0xMzYsNiArMTM1LDI0IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIGludCBfX2luaXQgbXBjODMyeF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsCisJCQkJCSJ1Y2NfZ2V0aCIpKSAhPSBOVUxMOykgeworCQlpbnQgdWNjX251bTsKKwkJY2hhciBidXNfaWRbQlVTX0lEX1NJWkVdOworCisJCXVjY19udW0gPSAqKCh1aW50ICopIGdldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpKSAtIDE7CisJCXNucHJpbnRmKGJ1c19pZCwgQlVTX0lEX1NJWkUsICJ1Y2NfZ2V0aC4ldSIsIHVjY19udW0pOworCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCBidXNfaWQsIE5VTEwpOworCX0KKworCXJldHVybiAwOworfQorZGV2aWNlX2luaXRjYWxsKG1wYzgzMnhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKKwogdm9pZCBfX2luaXQgbXBjODMyeF9zeXNfaW5pdF9JUlEodm9pZCkKIHsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9pdHguYwppbmRleCA1NDQ2YmFiLi4zMTRjNDJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9pdHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9pdHguYwpAQCAtMTA4LDEwICsxMDgsNiBAQAogCXJldHVybiAxOwogfQogCi0jaWZkZWYgQ09ORklHX1JUQ19DTEFTUwotbGF0ZV9pbml0Y2FsbChydGNfY2xhc3NfaG9va3VwKTsKLSNlbmRpZgotCiBkZWZpbmVfbWFjaGluZShtcGM4MzR4X2l0eCkgewogCS5uYW1lCQkJPSAiTVBDODM0eCBJVFgiLAogCS5wcm9iZQkJCT0gbXBjODM0eF9pdHhfcHJvYmUsCkBAIC0xMjIsNyArMTE4LDQgQEAKIAkudGltZV9pbml0CQk9IG1wYzgzeHhfdGltZV9pbml0LAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAogCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAotI2lmZGVmIENPTkZJR19QQ0kKLQkucGNpYmlvc19maXh1cAkJPSBtcGM4M3h4X3BjaWJpb3NfZml4dXAsCi0jZW5kaWYKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCmluZGV4IDY3NzE5NjEuLjgwYjczNWE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYwpAQCAtMTM3LDcgKzEzNyw0IEBACiAJLnRpbWVfaW5pdAkJPSBtcGM4M3h4X3RpbWVfaW5pdCwKIAkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKLSNpZmRlZiBDT05GSUdfUENJCi0JLnBjaWJpb3NfZml4dXAJCT0gbXBjODN4eF9wY2liaW9zX2ZpeHVwLAotI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNjBlX3BiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2MGVfcGIuYwppbmRleCBjMDE5MTkwLi43YmZkNDdhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2MGVfcGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2MGVfcGIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAKKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgpAQCAtMTAxLDggKzEwMiw2IEBACiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKIAkJYWRkX2JyaWRnZShucCk7Ci0KLQlwcGNfbWQucGNpX3N3aXp6bGUgPSBjb21tb25fc3dpenpsZTsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCkBAIC0xNDEsNiArMTQwLDI0IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIGludCBfX2luaXQgbXBjODM2MF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsCisJCQkJCSJ1Y2NfZ2V0aCIpKSAhPSBOVUxMOykgeworCQlpbnQgdWNjX251bTsKKwkJY2hhciBidXNfaWRbQlVTX0lEX1NJWkVdOworCisJCXVjY19udW0gPSAqKCh1aW50ICopIGdldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpKSAtIDE7CisJCXNucHJpbnRmKGJ1c19pZCwgQlVTX0lEX1NJWkUsICJ1Y2NfZ2V0aC4ldSIsIHVjY19udW0pOworCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCBidXNfaWQsIE5VTEwpOworCX0KKworCXJldHVybiAwOworfQorZGV2aWNlX2luaXRjYWxsKG1wYzgzNjBfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKKwogdm9pZCBfX2luaXQgbXBjODM2MF9zeXNfaW5pdF9JUlEodm9pZCkKIHsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKaW5kZXggMmM4MmJjYS4uMDFjYWUxMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCkBAIC0xMSw3ICsxMSw2IEBACiAKIGV4dGVybiBpbnQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiBleHRlcm4gaW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKTsKLWV4dGVybiB2b2lkIG1wYzgzeHhfcGNpYmlvc19maXh1cCh2b2lkKTsKIGV4dGVybiB2b2lkIG1wYzgzeHhfcmVzdGFydChjaGFyICpjbWQpOwogZXh0ZXJuIGxvbmcgbXBjODN4eF90aW1lX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwppbmRleCA0NTU3YWM1Li45YzM2NTA1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCkBAIC00NSwxNSArNDUsNiBAQAogCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CiAKLXZvaWQgX19pbml0IG1wYzgzeHhfcGNpYmlvc19maXh1cCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCi0JLyogbWFwIGFsbCB0aGUgUENJIGlycXMgKi8KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikKLQkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKLX0KLQogaW50IF9faW5pdCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYwppbmRleCAyNmM1ZTgyMi4uM2U2MmZjYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jCkBAIC0yMSwxMSArMjEsMyBAQAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJYWJvcnQoKTsKIH0KLQotLyogRm9yIG5vdyB0aGlzIGlzIGEgcGFzcyB0aHJvdWdoICovCi1waHlzX2FkZHJfdCBmaXh1cF9iaWdwaHlzX2FkZHIocGh5c19hZGRyX3QgYWRkciwgcGh5c19hZGRyX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gYWRkcjsKLX07Ci0KLUVYUE9SVF9TWU1CT0woZml4dXBfYmlncGh5c19hZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKaW5kZXggZDNlNjY5ZC4uYmRhMmU1NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMKQEAgLTUzLDE1ICs1Myw2IEBACiAJZWxzZQogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQotCi12b2lkIF9faW5pdAotbXBjODV4eF9wY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikKLQkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKLX0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKICNpZmRlZiBDT05GSUdfQ1BNMgpAQCAtMjUzLDggKzI0NCw2IEBACiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKIAkJYWRkX2JyaWRnZShucCk7Ci0KLQlwcGNfbWQucGNpYmlvc19maXh1cCA9IG1wYzg1eHhfcGNpYmlvc19maXh1cDsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODV4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKaW5kZXggMWExYzIyNi4uZjRkZDVmMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYwpAQCAtMzk4LDE1ICszOTgsNiBAQAogfQogCiAKLXZvaWQgX19pbml0IG1wYzg2eHhfaHBjbl9wY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikKLQkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKLX0KLQotCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCiAgKi8KQEAgLTQ2MSw3ICs0NTIsNiBAQAogCS5zZXR1cF9hcmNoCQk9IG1wYzg2eHhfaHBjbl9zZXR1cF9hcmNoLAogCS5pbml0X0lSUQkJPSBtcGM4Nnh4X2hwY25faW5pdF9pcnEsCiAJLnNob3dfY3B1aW5mbwkJPSBtcGM4Nnh4X2hwY25fc2hvd19jcHVpbmZvLAotCS5wY2liaW9zX2ZpeHVwCQk9IG1wYzg2eHhfaHBjbl9wY2liaW9zX2ZpeHVwLAogCS5nZXRfaXJxCQk9IG1waWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBtcGM4Nnh4X3Jlc3RhcnQsCiAJLnRpbWVfaW5pdAkJPSBtcGM4Nnh4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCmluZGV4IGU1OGZhOTUuLjQ0ZDk1ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQpAQCAtNywxMiArNywxNCBAQAogZW5kaWYKIG9iai0kKENPTkZJR19QUENfQ0hSUCkJCSs9IGNocnAvCiBvYmotJChDT05GSUdfNHh4KQkJKz0gNHh4Lworb2JqLSQoQ09ORklHX1BQQ19NUEM1Mnh4KQkrPSA1Mnh4Lwogb2JqLSQoQ09ORklHX1BQQ184M3h4KQkJKz0gODN4eC8KIG9iai0kKENPTkZJR19QUENfODV4eCkJCSs9IDg1eHgvCiBvYmotJChDT05GSUdfUFBDXzg2eHgpCQkrPSA4Nnh4Lwogb2JqLSQoQ09ORklHX1BQQ19QU0VSSUVTKQkrPSBwc2VyaWVzLwogb2JqLSQoQ09ORklHX1BQQ19JU0VSSUVTKQkrPSBpc2VyaWVzLwogb2JqLSQoQ09ORklHX1BQQ19NQVBMRSkJCSs9IG1hcGxlLwotb2JqLSQoQ09ORklHX1BQQ19QQVNFTUkpCQkrPSBwYXNlbWkvCitvYmotJChDT05GSUdfUFBDX1BBU0VNSSkJKz0gcGFzZW1pLwogb2JqLSQoQ09ORklHX1BQQ19DRUxMKQkJKz0gY2VsbC8KK29iai0kKENPTkZJR19QUENfUFMzKQkJKz0gcHMzLwogb2JqLSQoQ09ORklHX0VNQkVEREVENnh4KQkrPSBlbWJlZGRlZDZ4eC8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcKaW5kZXggM2U0MzBiNC4uMDZhODViNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcKQEAgLTIwLDQgKzIwLDE4IEBACiAJYm9vbCAiUkFTIGZlYXR1cmVzIGZvciBiYXJlIG1ldGFsIENlbGwgQkUiCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBDQkVfVEhFUk0KKwl0cmlzdGF0ZSAiQ0JFIHRoZXJtYWwgc3VwcG9ydCIKKwlkZWZhdWx0IG0KKwlkZXBlbmRzIG9uIENCRV9SQVMKKworY29uZmlnIENCRV9DUFVGUkVRCisJdHJpc3RhdGUgIkNCRSBmcmVxdWVuY3kgc2NhbGluZyIKKwlkZXBlbmRzIG9uIENCRV9SQVMgJiYgQ1BVX0ZSRVEKKwlkZWZhdWx0IG0KKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIGNwdWZyZXEgZHJpdmVyIGZvciBDZWxsIEJFIHByb2Nlc3NvcnMuCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCSAgSWYgeW91IGRvbid0IGhhdmUgc3VjaCBwcm9jZXNzb3IsIHNheSBOCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9NYWtlZmlsZQppbmRleCBjODljZGQ2Li5mOTBlODMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL01ha2VmaWxlCkBAIC0xLDcgKzEsMTEgQEAKIG9iai0kKENPTkZJR19QUENfQ0VMTF9OQVRJVkUpCQkrPSBpbnRlcnJ1cHQubyBpb21tdS5vIHNldHVwLm8gXAotCQkJCQkgICBjYmVfcmVncy5vIHNwaWRlci1waWMubyBwZXJ2YXNpdmUubworCQkJCQkgICBjYmVfcmVncy5vIHNwaWRlci1waWMubyBcCisJCQkJCSAgIHBlcnZhc2l2ZS5vIHBtdS5vIGlvLXdvcmthcm91bmRzLm8KIG9iai0kKENPTkZJR19DQkVfUkFTKQkJCSs9IHJhcy5vCiAKK29iai0kKENPTkZJR19DQkVfVEhFUk0pCQkJKz0gY2JlX3RoZXJtYWwubworb2JqLSQoQ09ORklHX0NCRV9DUFVGUkVRKQkJKz0gY2JlX2NwdWZyZXEubworCiBpZmVxICgkKENPTkZJR19TTVApLHkpCiBvYmotJChDT05GSUdfUFBDX0NFTExfTkFUSVZFKQkJKz0gc21wLm8KIGVuZGlmCkBAIC0xMSw1ICsxNSw2IEBACiBzcHUtcHJpdjEtJChDT05GSUdfUFBDX0NFTExfTkFUSVZFKQkrPSBzcHVfcHJpdjFfbW1pby5vCiAKIG9iai0kKENPTkZJR19TUFVfQkFTRSkJCQkrPSBzcHVfY2FsbGJhY2tzLm8gc3B1X2Jhc2UubyBcCisJCQkJCSAgIHNwdV9jb3JlZHVtcC5vIFwKIAkJCQkJICAgJChzcHVmcy1tb2R1bGFyLW0pIFwKIAkJCQkJICAgJChzcHUtcHJpdjEteSkgc3B1ZnMvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODUwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXEuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIGNwdWZyZXEgZHJpdmVyIGZvciB0aGUgY2VsbCBwcm9jZXNzb3IKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJIIDIwMDUKKyAqCisgKiBBdXRob3I6IENocmlzdGlhbiBLcmFmZnQgPGtyYWZmdEBkZS5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKworI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorCisjaW5jbHVkZSAiY2JlX3JlZ3MuaCIKKworc3RhdGljIERFRklORV9NVVRFWChjYmVfc3dpdGNoX211dGV4KTsKKworCisvKiB0aGUgQ0JFIHN1cHBvcnRzIGFuIDggc3RlcCBmcmVxdWVuY3kgc2NhbGluZyAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBjYmVfZnJlcXNbXSA9IHsKKwl7MSwJMH0sCisJezIsCTB9LAorCXszLAkwfSwKKwl7NCwJMH0sCisJezUsCTB9LAorCXs2LAkwfSwKKwl7OCwJMH0sCisJezEwLAkwfSwKKwl7MCwJQ1BVRlJFUV9UQUJMRV9FTkR9LAorfTsKKworLyogdG8gd3JpdGUgdG8gTUlDIHJlZ2lzdGVyICovCitzdGF0aWMgdTY0IE1JQ19TbG93X0Zhc3RfVGltZXJfdGFibGVbXSA9IHsKKwlbMCAuLi4gN10gPSAweDAwN2ZjMDAwMDAwMDAwMDB1bGwsCit9OworCisvKiBtb3JlIHZhbHVlcyBmb3IgdGhlIE1JQyAqLworc3RhdGljIHU2NCBNSUNfU2xvd19OZXh0X1RpbWVyX3RhYmxlW10gPSB7CisJMHgwMDAwMjQwMDAwMDAwMDAwdWxsLAorCTB4MDAwMDI2ODAwMDAwMDAwMHVsbCwKKwkweDAwMDAyOUMwMDAwMDAwMDB1bGwsCisJMHgwMDAwMkQwMDAwMDAwMDAwdWxsLAorCTB4MDAwMDMwMDAwMDAwMDAwMHVsbCwKKwkweDAwMDAzMzQwMDAwMDAwMDB1bGwsCisJMHgwMDAwMzlDMDAwMDAwMDAwdWxsLAorCTB4MDAwMDNGQzAwMDAwMDAwMHVsbCwKK307CisKKy8qCisgKiBoYXJkd2FyZSBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGdldF9wbW9kZShpbnQgY3B1KQoreworCWludCByZXQ7CisJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVnczsKKworCXBtZF9yZWdzID0gY2JlX2dldF9jcHVfcG1kX3JlZ3MoY3B1KTsKKwlyZXQgPSBpbl9iZTY0KCZwbWRfcmVncy0+cG1zcikgJiAweDA3OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXRfcG1vZGUoaW50IGNwdSwgdW5zaWduZWQgaW50IHBtb2RlKQoreworCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CisJc3RydWN0IGNiZV9taWNfdG1fcmVncyBfX2lvbWVtICptaWNfdG1fcmVnczsKKwl1NjQgZmxhZ3M7CisJdTY0IHZhbHVlOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJbWljX3RtX3JlZ3MgPSBjYmVfZ2V0X2NwdV9taWNfdG1fcmVncyhjcHUpOworCXBtZF9yZWdzID0gY2JlX2dldF9jcHVfcG1kX3JlZ3MoY3B1KTsKKworCXByX2RlYnVnKCJwbSByZWdpc3RlciBpcyBtYXBwZWQgYXQgJXBcbiIsICZwbWRfcmVncy0+cG1jcik7CisJcHJfZGVidWcoIm1pYyByZWdpc3RlciBpcyBtYXBwZWQgYXQgJXBcbiIsICZtaWNfdG1fcmVncy0+c2xvd19mYXN0X3RpbWVyXzApOworCisJb3V0X2JlNjQoJm1pY190bV9yZWdzLT5zbG93X2Zhc3RfdGltZXJfMCwgTUlDX1Nsb3dfRmFzdF9UaW1lcl90YWJsZVtwbW9kZV0pOworCW91dF9iZTY0KCZtaWNfdG1fcmVncy0+c2xvd19mYXN0X3RpbWVyXzEsIE1JQ19TbG93X0Zhc3RfVGltZXJfdGFibGVbcG1vZGVdKTsKKworCW91dF9iZTY0KCZtaWNfdG1fcmVncy0+c2xvd19uZXh0X3RpbWVyXzAsIE1JQ19TbG93X05leHRfVGltZXJfdGFibGVbcG1vZGVdKTsKKwlvdXRfYmU2NCgmbWljX3RtX3JlZ3MtPnNsb3dfbmV4dF90aW1lcl8xLCBNSUNfU2xvd19OZXh0X1RpbWVyX3RhYmxlW3Btb2RlXSk7CisKKwl2YWx1ZSA9IGluX2JlNjQoJnBtZF9yZWdzLT5wbWNyKTsKKwkvKiBzZXQgYml0cyB0byB6ZXJvICovCisJdmFsdWUgJj0gMHhGRkZGRkZGRkZGRkZGRkY4dWxsOworCS8qIHNldCBiaXRzIHRvIG5leHQgcG1vZGUgKi8KKwl2YWx1ZSB8PSBwbW9kZTsKKworCW91dF9iZTY0KCZwbWRfcmVncy0+cG1jciwgdmFsdWUpOworCisJLyogd2FpdCB1bnRpbCBuZXcgcG1vZGUgYXBwZWFycyBpbiBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl2YWx1ZSA9IGluX2JlNjQoJnBtZF9yZWdzLT5wbXNyKSAmIDB4MDc7CisJd2hpbGUodmFsdWUgIT0gcG1vZGUpIHsKKwkJY3B1X3JlbGF4KCk7CisJCXZhbHVlID0gaW5fYmU2NCgmcG1kX3JlZ3MtPnBtc3IpICYgMHgwNzsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNwdWZyZXEgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBjYmVfY3B1ZnJlcV9jcHVfaW5pdCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdTMyICptYXhfZnJlcTsKKwlpbnQgaSwgY3VyX3Btb2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OworCisJY3B1ID0gb2ZfZ2V0X2NwdV9ub2RlKHBvbGljeS0+Y3B1LCBOVUxMKTsKKworCWlmKCFjcHUpCisJCXJldHVybiAtRU5PREVWOworCisJcHJfZGVidWcoImluaXQgY3B1ZnJlcSBvbiBDUFUgJWRcbiIsIHBvbGljeS0+Y3B1KTsKKworCW1heF9mcmVxID0gKHUzMiopIGdldF9wcm9wZXJ0eShjcHUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKworCWlmKCFtYXhfZnJlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvLyB3ZSBuZWVkIHRoZSBmcmVxIGluIGtIegorCSptYXhfZnJlcSAvPSAxMDAwOworCisJcHJfZGVidWcoIm1heCBjbG9jay1mcmVxdWVuY3kgaXMgYXQgJXUga0h6XG4iLCAqbWF4X2ZyZXEpOworCXByX2RlYnVnKCJpbml0aWFsaXppbmcgZnJlcXVlbmN5IHRhYmxlXG4iKTsKKworCS8vIGluaXRpYWxpemUgZnJlcXVlbmN5IHRhYmxlCisJZm9yIChpPTA7IGNiZV9mcmVxc1tpXS5mcmVxdWVuY3khPUNQVUZSRVFfVEFCTEVfRU5EOyBpKyspIHsKKwkJY2JlX2ZyZXFzW2ldLmZyZXF1ZW5jeSA9ICptYXhfZnJlcSAvIGNiZV9mcmVxc1tpXS5pbmRleDsKKwkJcHJfZGVidWcoIiVkOiAlZFxuIiwgaSwgY2JlX2ZyZXFzW2ldLmZyZXF1ZW5jeSk7CisJfQorCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwkvKiBpZiBERUJVRyBpcyBlbmFibGVkIHNldF9wbW9kZSgpIG1lYXN1cmVzIHRoZSBjb3JyZWN0IGxhdGVuY3kgb2YgYSB0cmFuc2l0aW9uICovCisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDI1MDAwOworCisJY3VyX3Btb2RlID0gZ2V0X3Btb2RlKHBvbGljeS0+Y3B1KTsKKwlwcl9kZWJ1ZygiY3VycmVudCBwbW9kZSBpcyBhdCAlZFxuIixjdXJfcG1vZGUpOworCisJcG9saWN5LT5jdXIgPSBjYmVfZnJlcXNbY3VyX3Btb2RlXS5mcmVxdWVuY3k7CisKKyNpZmRlZiBDT05GSUdfU01QCisJcG9saWN5LT5jcHVzID0gY3B1X3NpYmxpbmdfbWFwW3BvbGljeS0+Y3B1XTsKKyNlbmRpZgorCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIgKGNiZV9mcmVxcywgcG9saWN5LT5jcHUpOworCisJLyogdGhpcyBlbnN1cmVzIHRoYXQgcG9saWN5LT5jcHVpbmZvX21pbiBhbmQgcG9saWN5LT5jcHVpbmZvX21heCBhcmUgc2V0IGNvcnJlY3RseSAqLworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvIChwb2xpY3ksIGNiZV9mcmVxcyk7Cit9CisKK3N0YXRpYyBpbnQgY2JlX2NwdWZyZXFfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNiZV9jcHVmcmVxX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgY2JlX2ZyZXFzKTsKK30KKworCitzdGF0aWMgaW50IGNiZV9jcHVmcmVxX3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCQkJICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJaW50IGNiZV9wbW9kZV9uZXc7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LAorCQkJCSAgICAgICBjYmVfZnJlcXMsCisJCQkJICAgICAgIHRhcmdldF9mcmVxLAorCQkJCSAgICAgICByZWxhdGlvbiwKKwkJCQkgICAgICAgJmNiZV9wbW9kZV9uZXcpOworCisJZnJlcXMub2xkID0gcG9saWN5LT5jdXI7CisJZnJlcXMubmV3ID0gY2JlX2ZyZXFzW2NiZV9wbW9kZV9uZXddLmZyZXF1ZW5jeTsKKwlmcmVxcy5jcHUgPSBwb2xpY3ktPmNwdTsKKworCW11dGV4X2xvY2sgKCZjYmVfc3dpdGNoX211dGV4KTsKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJcHJfZGVidWcoInNldHRpbmcgZnJlcXVlbmN5IGZvciBjcHUgJWQgdG8gJWQga0h6LCAxLyVkIG9mIG1heCBmcmVxdWVuY3lcbiIsCisJCSBwb2xpY3ktPmNwdSwKKwkJIGNiZV9mcmVxc1tjYmVfcG1vZGVfbmV3XS5mcmVxdWVuY3ksCisJCSBjYmVfZnJlcXNbY2JlX3Btb2RlX25ld10uaW5kZXgpOworCisJcmMgPSBzZXRfcG1vZGUocG9saWN5LT5jcHUsIGNiZV9wbW9kZV9uZXcpOworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCW11dGV4X3VubG9jaygmY2JlX3N3aXRjaF9tdXRleCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgY2JlX2NwdWZyZXFfZHJpdmVyID0geworCS52ZXJpZnkJCT0gY2JlX2NwdWZyZXFfdmVyaWZ5LAorCS50YXJnZXQJCT0gY2JlX2NwdWZyZXFfdGFyZ2V0LAorCS5pbml0CQk9IGNiZV9jcHVmcmVxX2NwdV9pbml0LAorCS5leGl0CQk9IGNiZV9jcHVmcmVxX2NwdV9leGl0LAorCS5uYW1lCQk9ICJjYmUtY3B1ZnJlcSIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5mbGFncwkJPSBDUFVGUkVRX0NPTlNUX0xPT1BTLAorfTsKKworLyoKKyAqIG1vZHVsZSBpbml0IGFuZCBkZXN0b3kKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBjYmVfY3B1ZnJlcV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZjYmVfY3B1ZnJlcV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2JlX2NwdWZyZXFfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmNiZV9jcHVmcmVxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNiZV9jcHVmcmVxX2luaXQpOworbW9kdWxlX2V4aXQoY2JlX2NwdWZyZXFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkNocmlzdGlhbiBLcmFmZnQgPGtyYWZmdEBkZS5pYm0uY29tPiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuYwppbmRleCAyZjE5NGJhLi45YTBlZTYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMTYsOCArMTcsNiBAQAogCiAjaW5jbHVkZSAiY2JlX3JlZ3MuaCIKIAotI2RlZmluZSBNQVhfQ0JFCQkyCi0KIC8qCiAgKiBDdXJyZW50IGltcGxlbWVudGF0aW9uIHVzZXMgImNwdSIgbm9kZXMuIFdlIGJ1aWxkIG91ciBvd24gbWFwcGluZwogICogYXJyYXkgb2YgY3B1IG51bWJlcnMgdG8gY3B1IG5vZGVzIGxvY2FsbHkgZm9yIG5vdyB0byBhbGxvdyBpbnRlcnJ1cHQKQEAgLTMwLDYgKzI5LDggQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9ub2RlOwogCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CiAJc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICppaWNfcmVnczsKKwlzdHJ1Y3QgY2JlX21pY190bV9yZWdzIF9faW9tZW0gKm1pY190bV9yZWdzOworCXN0cnVjdCBjYmVfcG1kX3NoYWRvd19yZWdzIHBtZF9zaGFkb3dfcmVnczsKIH0gY2JlX3JlZ3NfbWFwc1tNQVhfQ0JFXTsKIHN0YXRpYyBpbnQgY2JlX3JlZ3NfbWFwX2NvdW50OwogCkBAIC00Miw2ICs0MywxOSBAQAogc3RhdGljIHN0cnVjdCBjYmVfcmVnc19tYXAgKmNiZV9maW5kX21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCWludCBpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdG1wX25wOworCisJaWYgKHN0cmNhc2VjbXAobnAtPnR5cGUsICJzcGUiKSA9PSAwKSB7CisJCWlmIChucC0+ZGF0YSA9PSBOVUxMKSB7CisJCQkvKiB3YWxrIHVwIHBhdGggdW50aWwgY3B1IG5vZGUgd2FzIGZvdW5kICovCisJCQl0bXBfbnAgPSBucC0+cGFyZW50OworCQkJd2hpbGUgKHRtcF9ucCAhPSBOVUxMICYmIHN0cmNhc2VjbXAodG1wX25wLT50eXBlLCAiY3B1IikgIT0gMCkKKwkJCQl0bXBfbnAgPSB0bXBfbnAtPnBhcmVudDsKKworCQkJbnAtPmRhdGEgPSBjYmVfZmluZF9tYXAodG1wX25wKTsKKwkJfQorCQlyZXR1cm4gbnAtPmRhdGE7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IGNiZV9yZWdzX21hcF9jb3VudDsgaSsrKQogCQlpZiAoY2JlX3JlZ3NfbWFwc1tpXS5jcHVfbm9kZSA9PSBucCkKQEAgLTU2LDYgKzcwLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIG1hcC0+cG1kX3JlZ3M7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfZ2V0X3BtZF9yZWdzKTsKIAogc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpjYmVfZ2V0X2NwdV9wbWRfcmVncyhpbnQgY3B1KQogewpAQCAtNjQsNyArNzksMjMgQEAKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIG1hcC0+cG1kX3JlZ3M7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfZ2V0X2NwdV9wbWRfcmVncyk7CiAKK3N0cnVjdCBjYmVfcG1kX3NoYWRvd19yZWdzICpjYmVfZ2V0X3BtZF9zaGFkb3dfcmVncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBjYmVfcmVnc19tYXAgKm1hcCA9IGNiZV9maW5kX21hcChucCk7CisJaWYgKG1hcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJm1hcC0+cG1kX3NoYWRvd19yZWdzOworfQorCitzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyAqY2JlX2dldF9jcHVfcG1kX3NoYWRvd19yZWdzKGludCBjcHUpCit7CisJc3RydWN0IGNiZV9yZWdzX21hcCAqbWFwID0gY2JlX3RocmVhZF9tYXBbY3B1XS5yZWdzOworCWlmIChtYXAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZtYXAtPnBtZF9zaGFkb3dfcmVnczsKK30KIAogc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICpjYmVfZ2V0X2lpY19yZWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CkBAIC03Myw2ICsxMDQsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gbWFwLT5paWNfcmVnczsKIH0KKwogc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICpjYmVfZ2V0X2NwdV9paWNfcmVncyhpbnQgY3B1KQogewogCXN0cnVjdCBjYmVfcmVnc19tYXAgKm1hcCA9IGNiZV90aHJlYWRfbWFwW2NwdV0ucmVnczsKQEAgLTgxLDYgKzExMywzNiBAQAogCXJldHVybiBtYXAtPmlpY19yZWdzOwogfQogCitzdHJ1Y3QgY2JlX21pY190bV9yZWdzIF9faW9tZW0gKmNiZV9nZXRfbWljX3RtX3JlZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgY2JlX3JlZ3NfbWFwICptYXAgPSBjYmVfZmluZF9tYXAobnApOworCWlmIChtYXAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG1hcC0+bWljX3RtX3JlZ3M7Cit9CisKK3N0cnVjdCBjYmVfbWljX3RtX3JlZ3MgX19pb21lbSAqY2JlX2dldF9jcHVfbWljX3RtX3JlZ3MoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY2JlX3JlZ3NfbWFwICptYXAgPSBjYmVfdGhyZWFkX21hcFtjcHVdLnJlZ3M7CisJaWYgKG1hcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbWFwLT5taWNfdG1fcmVnczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9nZXRfY3B1X21pY190bV9yZWdzKTsKKworLyogRklYTUUKKyAqIFRoaXMgaXMgbGl0dGxlIG1vcmUgdGhhbiBhIHN0dWIgYXQgdGhlIG1vbWVudC4gIEl0IHNob3VsZCBiZQorICogZmxlc2hlZCBvdXQgc28gdGhhdCBpdCB3b3JrcyBmb3IgYm90aCBTTVQgYW5kIG5vbi1TTVQsIG5vCisgKiBtYXR0ZXIgaWYgdGhlIHBhc3NlZCBjcHUgaXMgb2RkIG9yIGV2ZW4uCisgKiBGb3IgU01UIGVuYWJsZWQsIHJldHVybnMgMCBmb3IgZXZlbi1udW1iZXJlZCBjcHU7IG90aGVyd2lzZSAxLgorICogRm9yIFNNVCBkaXNhYmxlZCwgcmV0dXJucyAwIGZvciBhbGwgY3B1cy4KKyAqLwordTMyIGNiZV9nZXRfaHdfdGhyZWFkX2lkKGludCBjcHUpCit7CisJcmV0dXJuIChjcHUgJiAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9nZXRfaHdfdGhyZWFkX2lkKTsKKwogdm9pZCBfX2luaXQgY2JlX3JlZ3NfaW5pdCh2b2lkKQogewogCWludCBpOwpAQCAtMTE5LDYgKzE4MSwxMSBAQAogCQlwcm9wID0gZ2V0X3Byb3BlcnR5KGNwdSwgImlpYyIsIE5VTEwpOwogCQlpZiAocHJvcCAhPSBOVUxMKQogCQkJbWFwLT5paWNfcmVncyA9IGlvcmVtYXAocHJvcC0+YWRkcmVzcywgcHJvcC0+bGVuKTsKKworCQlwcm9wID0gKHN0cnVjdCBhZGRyZXNzX3Byb3AgKilnZXRfcHJvcGVydHkoY3B1LCAibWljLXRtIiwKKwkJCQkJCQkgICBOVUxMKTsKKwkJaWYgKHByb3AgIT0gTlVMTCkKKwkJCW1hcC0+bWljX3RtX3JlZ3MgPSBpb3JlbWFwKHByb3AtPmFkZHJlc3MsIHByb3AtPmxlbik7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5oCmluZGV4IGU3NmU0YTYuLjQ0MGE3ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5oCkBAIC00LDEyICs0LDE5IEBACiAgKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gaG9sZCB0aGUgdmFyaW91cyByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgQ0JFCiAgKiBvbi1jaGlwIHN5c3RlbSBkZXZpY2VzIChtZW1vcnkgY29udHJvbGxlciwgSU8gY29udHJvbGxlciwgZXRjLi4uKQogICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEsMjAwNgorICoKKyAqIEF1dGhvcnM6IE1heGltaW5vIEFndWlsYXIgKG1hZ3VpbGFyQHVzLmlibS5jb20pCisgKiAgICAgICAgICBEYXZpZCBKLiBFcmIgKGRqZXJiQHVzLmlibS5jb20pCisgKgogICogKGMpIDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiwgSUJNIENvcnAuCiAgKi8KIAogI2lmbmRlZiBDQkVfUkVHU19ICiAjZGVmaW5lIENCRV9SRUdTX0gKIAorI2luY2x1ZGUgPGFzbS9jZWxsLXBtdS5oPgorCiAvKgogICoKICAqIFNvbWUgSElEIHJlZ2lzdGVyIGRlZmluaXRpb25zCkBAIC0yMiw2ICsyOSw3IEBACiAjZGVmaW5lIEhJRDBfQ0JFX1RIRVJNX0lOVF9FTgkweDAwMDAwMDA0MDAwMDAwMDB1bAogI2RlZmluZSBISUQwX0NCRV9TWVNFUlJfSU5UX0VOCTB4MDAwMDAwMDIwMDAwMDAwMHVsCiAKKyNkZWZpbmUgTUFYX0NCRQkJMgogCiAvKgogICoKQEAgLTI5LDUxICszNywxMjQgQEAKICAqCiAgKi8KIAordW5pb24gc3BlX3JlZyB7CisJdTY0IHZhbDsKKwl1OCBzcGVbOF07Cit9OworCit1bmlvbiBwcGVfc3BlX3JlZyB7CisJdTY0IHZhbDsKKwlzdHJ1Y3QgeworCQl1MzIgcHBlOworCQl1MzIgc3BlOworCX07Cit9OworCisKIHN0cnVjdCBjYmVfcG1kX3JlZ3MgewotCXU4IHBhZF8weDAwMDBfMHgwODAwWzB4MDgwMCAtIDB4MDAwMF07CQkJLyogMHgwMDAwICovCisJLyogRGVidWcgQnVzIENvbnRyb2wgKi8KKwl1NjQJcGFkXzB4MDAwMDsJCQkJCS8qIDB4MDAwMCAqLworCisJdTY0CWdyb3VwX2NvbnRyb2w7CQkJCQkvKiAweDAwMDggKi8KKworCXU4CXBhZF8weDAwMTBfMHgwMGE4IFsweDAwYTggLSAweDAwMTBdOwkJLyogMHgwMDEwICovCisKKwl1NjQJZGVidWdfYnVzX2NvbnRyb2w7CQkJCS8qIDB4MDBhOCAqLworCisJdTgJcGFkXzB4MDBiMF8weDAxMDAgWzB4MDEwMCAtIDB4MDBiMF07CQkvKiAweDAwYjAgKi8KKworCXU2NAl0cmFjZV9hdXhfZGF0YTsJCQkJCS8qIDB4MDEwMCAqLworCXU2NAl0cmFjZV9idWZmZXJfMF82MzsJCQkJLyogMHgwMTA4ICovCisJdTY0CXRyYWNlX2J1ZmZlcl82NF8xMjc7CQkJCS8qIDB4MDExMCAqLworCXU2NAl0cmFjZV9hZGRyZXNzOwkJCQkJLyogMHgwMTE4ICovCisJdTY0CWV4dF90cl90aW1lcjsJCQkJCS8qIDB4MDEyMCAqLworCisJdTgJcGFkXzB4MDEyOF8weDA0MDAgWzB4MDQwMCAtIDB4MDEyOF07CQkvKiAweDAxMjggKi8KKworCS8qIFBlcmZvcm1hbmNlIE1vbml0b3IgKi8KKwl1NjQJcG1fc3RhdHVzOwkJCQkJLyogMHgwNDAwICovCisJdTY0CXBtX2NvbnRyb2w7CQkJCQkvKiAweDA0MDggKi8KKwl1NjQJcG1faW50ZXJ2YWw7CQkJCQkvKiAweDA0MTAgKi8KKwl1NjQJcG1fY3RyWzRdOwkJCQkJLyogMHgwNDE4ICovCisJdTY0CXBtX3N0YXJ0X3N0b3A7CQkJCQkvKiAweDA0MzggKi8KKwl1NjQJcG0wN19jb250cm9sWzhdOwkJCQkvKiAweDA0NDAgKi8KKworCXU4CXBhZF8weDA0ODBfMHgwODAwIFsweDA4MDAgLSAweDA0ODBdOwkJLyogMHgwNDgwICovCiAKIAkvKiBUaGVybWFsIFNlbnNvciBSZWdpc3RlcnMgKi8KLQl1NjQgIHRzX2N0c3IxOwkJCQkJCS8qIDB4MDgwMCAqLwotCXU2NCAgdHNfY3RzcjI7CQkJCQkJLyogMHgwODA4ICovCi0JdTY0ICB0c19tdHNyMTsJCQkJCQkvKiAweDA4MTAgKi8KLQl1NjQgIHRzX210c3IyOwkJCQkJCS8qIDB4MDgxOCAqLwotCXU2NCAgdHNfaXRyMTsJCQkJCQkvKiAweDA4MjAgKi8KLQl1NjQgIHRzX2l0cjI7CQkJCQkJLyogMHgwODI4ICovCi0JdTY0ICB0c19naXRyOwkJCQkJCS8qIDB4MDgzMCAqLwotCXU2NCAgdHNfaXNyOwkJCQkJCS8qIDB4MDgzOCAqLwotCXU2NCAgdHNfaW1yOwkJCQkJCS8qIDB4MDg0MCAqLwotCXU2NCAgdG1fY3IxOwkJCQkJCS8qIDB4MDg0OCAqLwotCXU2NCAgdG1fY3IyOwkJCQkJCS8qIDB4MDg1MCAqLwotCXU2NCAgdG1fc2ltcjsJCQkJCQkvKiAweDA4NTggKi8KLQl1NjQgIHRtX3RwcjsJCQkJCQkvKiAweDA4NjAgKi8KLQl1NjQgIHRtX3N0cjE7CQkJCQkJLyogMHgwODY4ICovCi0JdTY0ICB0bV9zdHIyOwkJCQkJCS8qIDB4MDg3MCAqLwotCXU2NCAgdG1fdHNyOwkJCQkJCS8qIDB4MDg3OCAqLworCXVuaW9uCXNwZV9yZWcJdHNfY3RzcjE7CQkJCS8qIDB4MDgwMCAqLworCXU2NAl0c19jdHNyMjsJCQkJCS8qIDB4MDgwOCAqLworCXVuaW9uCXNwZV9yZWcJdHNfbXRzcjE7CQkJCS8qIDB4MDgxMCAqLworCXU2NAl0c19tdHNyMjsJCQkJCS8qIDB4MDgxOCAqLworCXVuaW9uCXNwZV9yZWcJdHNfaXRyMTsJCQkJLyogMHgwODIwICovCisJdTY0CXRzX2l0cjI7CQkJCQkvKiAweDA4MjggKi8KKwl1NjQJdHNfZ2l0cjsJCQkJCS8qIDB4MDgzMCAqLworCXU2NAl0c19pc3I7CQkJCQkJLyogMHgwODM4ICovCisJdTY0CXRzX2ltcjsJCQkJCQkvKiAweDA4NDAgKi8KKwl1bmlvbglzcGVfcmVnCXRtX2NyMTsJCQkJCS8qIDB4MDg0OCAqLworCXU2NAl0bV9jcjI7CQkJCQkJLyogMHgwODUwICovCisJdTY0CXRtX3NpbXI7CQkJCQkvKiAweDA4NTggKi8KKwl1bmlvbglwcGVfc3BlX3JlZyB0bV90cHI7CQkJCS8qIDB4MDg2MCAqLworCXVuaW9uCXNwZV9yZWcJdG1fc3RyMTsJCQkJLyogMHgwODY4ICovCisJdTY0CXRtX3N0cjI7CQkJCQkvKiAweDA4NzAgKi8KKwl1bmlvbglwcGVfc3BlX3JlZyB0bV90c3I7CQkJCS8qIDB4MDg3OCAqLwogCiAJLyogUG93ZXIgTWFuYWdlbWVudCAqLwotCXU2NCAgcG1fY29udHJvbDsJCQkJCS8qIDB4MDg4MCAqLwotI2RlZmluZSBDQkVfUE1EX1BBVVNFX1pFUk9fQ09OVFJPTAkJMHgxMDAwMAotCXU2NCAgcG1fc3RhdHVzOwkJCQkJCS8qIDB4MDg4OCAqLworCXU2NAlwbWNyOwkJCQkJCS8qIDB4MDg4MCAqLworI2RlZmluZSBDQkVfUE1EX1BBVVNFX1pFUk9fQ09OVFJPTAkweDEwMDAwCisJdTY0CXBtc3I7CQkJCQkJLyogMHgwODg4ICovCiAKIAkvKiBUaW1lIEJhc2UgUmVnaXN0ZXIgKi8KLQl1NjQgIHRicjsJCQkJCQkvKiAweDA4OTAgKi8KKwl1NjQJdGJyOwkJCQkJCS8qIDB4MDg5MCAqLwogCi0JdTggICBwYWRfMHgwODk4XzB4MGMwMCBbMHgwYzAwIC0gMHgwODk4XTsJCS8qIDB4MDg5OCAqLworCXU4CXBhZF8weDA4OThfMHgwYzAwIFsweDBjMDAgLSAweDA4OThdOwkJLyogMHgwODk4ICovCiAKIAkvKiBGYXVsdCBJc29sYXRpb24gUmVnaXN0ZXJzICovCi0JdTY0ICBjaGVja3N0b3BfZmlyOwkJCQkJLyogMHgwYzAwICovCi0JdTY0ICByZWNvdmVyYWJsZV9maXI7Ci0JdTY0ICBzcGVjX2F0dF9tY2hrX2ZpcjsKLQl1NjQgIGZpcl9tb2RlX3JlZzsKLQl1NjQgIGZpcl9lbmFibGVfbWFzazsKKwl1NjQJY2hlY2tzdG9wX2ZpcjsJCQkJCS8qIDB4MGMwMCAqLworCXU2NAlyZWNvdmVyYWJsZV9maXI7CQkJCS8qIDB4MGMwOCAqLworCXU2NAlzcGVjX2F0dF9tY2hrX2ZpcjsJCQkJLyogMHgwYzEwICovCisJdTY0CWZpcl9tb2RlX3JlZzsJCQkJCS8qIDB4MGMxOCAqLworCXU2NAlmaXJfZW5hYmxlX21hc2s7CQkJCS8qIDB4MGMyMCAqLwogCi0JdTggICBwYWRfMHgwYzI4XzB4MTAwMCBbMHgxMDAwIC0gMHgwYzI4XTsJCS8qIDB4MGMyOCAqLworCXU4CXBhZF8weDBjMjhfMHgxMDAwIFsweDEwMDAgLSAweDBjMjhdOwkJLyogMHgwYzI4ICovCiB9OwogCiBleHRlcm4gc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpjYmVfZ2V0X3BtZF9yZWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogZXh0ZXJuIHN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqY2JlX2dldF9jcHVfcG1kX3JlZ3MoaW50IGNwdSk7CiAKIC8qCisgKiBQTVUgc2hhZG93IHJlZ2lzdGVycworICoKKyAqIE1hbnkgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyB1bml0IGFyZSB3cml0ZS1vbmx5LAorICogc28gd2UgbmVlZCB0byBzYXZlIGEgY29weSBvZiB3aGF0IHdlIHdyaXRlIHRvIHRob3NlIHJlZ2lzdGVycy4KKyAqCisgKiBUaGUgYWN0dWFsIGRhdGEgY291bnRlcnMgYXJlIHJlYWQvd3JpdGUuIEhvd2V2ZXIsIHdyaXRpbmcgdG8gdGhlIGNvdW50ZXJzCisgKiBvbmx5IHRha2VzIGVmZmVjdCBpZiB0aGUgUE1VIGlzIGVuYWJsZWQuIE90aGVyd2lzZSB0aGUgdmFsdWUgaXMgc3RvcmVkIGluCisgKiBhIGhhcmR3YXJlIGxhdGNoIHVudGlsIHRoZSBuZXh0IHRpbWUgdGhlIFBNVSBpcyBlbmFibGVkLiBTbyB3ZSBzYXZlIGEgY29weQorICogb2YgdGhlIGNvdW50ZXIgdmFsdWVzIGlmIHdlIG5lZWQgdG8gcmVhZCB0aGVtIGJhY2sgd2hpbGUgdGhlIFBNVSBpcworICogZGlzYWJsZWQuIFRoZSBjb3VudGVyX3ZhbHVlX2luX2xhdGNoIGZpZWxkIGlzIGEgYml0bWFwIGluZGljYXRpbmcgd2hpY2gKKyAqIGNvdW50ZXJzIGN1cnJlbnRseSBoYXZlIGEgdmFsdWUgd2FpdGluZyB0byBiZSB3cml0dGVuLgorICovCisKK3N0cnVjdCBjYmVfcG1kX3NoYWRvd19yZWdzIHsKKwl1MzIgZ3JvdXBfY29udHJvbDsKKwl1MzIgZGVidWdfYnVzX2NvbnRyb2w7CisJdTMyIHRyYWNlX2FkZHJlc3M7CisJdTMyIGV4dF90cl90aW1lcjsKKwl1MzIgcG1fc3RhdHVzOworCXUzMiBwbV9jb250cm9sOworCXUzMiBwbV9pbnRlcnZhbDsKKwl1MzIgcG1fc3RhcnRfc3RvcDsKKwl1MzIgcG0wN19jb250cm9sW05SX0NUUlNdOworCisJdTMyIHBtX2N0cltOUl9QSFlTX0NUUlNdOworCXUzMiBjb3VudGVyX3ZhbHVlX2luX2xhdGNoOworfTsKKworZXh0ZXJuIHN0cnVjdCBjYmVfcG1kX3NoYWRvd19yZWdzICpjYmVfZ2V0X3BtZF9zaGFkb3dfcmVncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyAqY2JlX2dldF9jcHVfcG1kX3NoYWRvd19yZWdzKGludCBjcHUpOworCisvKgogICoKICAqIElJQyB1bml0IHJlZ2lzdGVyIGRlZmluaXRpb25zCiAgKgpAQCAtMTAyLDE4ICsxODMsMjggQEAKIAogCS8qIElJQyBpbnRlcnJ1cHQgcmVnaXN0ZXJzICovCiAJc3RydWN0CWNiZV9paWNfdGhyZWFkX3JlZ3MgdGhyZWFkWzJdOwkJCS8qIDB4MDQwMCAqLwotCXU2NCAgICAgaWljX2lyOwkJCQkJCS8qIDB4MDQ0MCAqLwotCXU2NCAgICAgaWljX2lzOwkJCQkJCS8qIDB4MDQ0OCAqLworCisJdTY0CWlpY19pcjsJCQkJCQkvKiAweDA0NDAgKi8KKyNkZWZpbmUgQ0JFX0lJQ19JUl9QUklPKHgpICAgICAgKCgoeCkgJiAweGYpIDw8IDEyKQorI2RlZmluZSBDQkVfSUlDX0lSX0RFU1RfTk9ERSh4KSAoKCh4KSAmIDB4ZikgPDwgNCkKKyNkZWZpbmUgQ0JFX0lJQ19JUl9ERVNUX1VOSVQoeCkgKCh4KSAmIDB4ZikKKyNkZWZpbmUgQ0JFX0lJQ19JUl9JT0NfMCAgICAgICAgMHgwCisjZGVmaW5lIENCRV9JSUNfSVJfSU9DXzFTICAgICAgIDB4YgorI2RlZmluZSBDQkVfSUlDX0lSX1BUXzAgICAgICAgICAweGUKKyNkZWZpbmUgQ0JFX0lJQ19JUl9QVF8xICAgICAgICAgMHhmCisKKwl1NjQJaWljX2lzOwkJCQkJCS8qIDB4MDQ0OCAqLworI2RlZmluZSBDQkVfSUlDX0lTX1BNSQkJMHgyCiAKIAl1OAlwYWRfMHgwNDUwXzB4MDUwMFsweDA1MDAgLSAweDA0NTBdOwkJLyogMHgwNDUwICovCiAKIAkvKiBJT0MgRklSICovCiAJdTY0CWlvY19maXJfcmVzZXQ7CQkJCQkvKiAweDA1MDAgKi8KLQl1NjQJaW9jX2Zpcl9zZXQ7Ci0JdTY0CWlvY19jaGVja3N0b3BfZW5hYmxlOwotCXU2NAlpb2NfZmlyX2Vycm9yX21hc2s7Ci0JdTY0CWlvY19zeXNlcnJfZW5hYmxlOwotCXU2NAlpb2NfZmlyOworCXU2NAlpb2NfZmlyX3NldDsJCQkJCS8qIDB4MDUwOCAqLworCXU2NAlpb2NfY2hlY2tzdG9wX2VuYWJsZTsJCQkJLyogMHgwNTEwICovCisJdTY0CWlvY19maXJfZXJyb3JfbWFzazsJCQkJLyogMHgwNTE4ICovCisJdTY0CWlvY19zeXNlcnJfZW5hYmxlOwkJCQkvKiAweDA1MjAgKi8KKwl1NjQJaW9jX2ZpcjsJCQkJCS8qIDB4MDUyOCAqLwogCiAJdTgJcGFkXzB4MDUzMF8weDEwMDBbMHgxMDAwIC0gMHgwNTMwXTsJCS8qIDB4MDUzMCAqLwogfTsKQEAgLTEyMiw2ICsyMTMsNDggQEAKIGV4dGVybiBzdHJ1Y3QgY2JlX2lpY19yZWdzIF9faW9tZW0gKmNiZV9nZXRfY3B1X2lpY19yZWdzKGludCBjcHUpOwogCiAKK3N0cnVjdCBjYmVfbWljX3RtX3JlZ3MgeworCXU4CXBhZF8weDAwMDBfMHgwMDQwWzB4MDA0MCAtIDB4MDAwMF07CQkvKiAweDAwMDAgKi8KKworCXU2NAltaWNfY3RsX2NuZmcyOwkJCQkJLyogMHgwMDQwICovCisjZGVmaW5lIENCRV9NSUNfRU5BQkxFX0FVWF9UUkMJCTB4ODAwMDAwMDAwMDAwMDAwMExMCisjZGVmaW5lIENCRV9NSUNfRElTQUJMRV9QV1JfU0FWXzIJMHgwMjAwMDAwMDAwMDAwMDAwTEwKKyNkZWZpbmUgQ0JFX01JQ19ESVNBQkxFX0FVWF9UUkNfV1JBUAkweDAxMDAwMDAwMDAwMDAwMDBMTAorI2RlZmluZSBDQkVfTUlDX0VOQUJMRV9BVVhfVFJDX0lOVAkweDAwODAwMDAwMDAwMDAwMDBMTAorCisJdTY0CXBhZF8weDAwNDg7CQkJCQkvKiAweDAwNDggKi8KKworCXU2NAltaWNfYXV4X3RyY19iYXNlOwkJCQkvKiAweDAwNTAgKi8KKwl1NjQJbWljX2F1eF90cmNfbWF4X2FkZHI7CQkJCS8qIDB4MDA1OCAqLworCXU2NAltaWNfYXV4X3RyY19jdXJfYWRkcjsJCQkJLyogMHgwMDYwICovCisJdTY0CW1pY19hdXhfdHJjX2dyZl9hZGRyOwkJCQkvKiAweDAwNjggKi8KKwl1NjQJbWljX2F1eF90cmNfZ3JmX2RhdGE7CQkJCS8qIDB4MDA3MCAqLworCisJdTY0CXBhZF8weDAwNzg7CQkJCQkvKiAweDAwNzggKi8KKworCXU2NAltaWNfY3RsX2NuZmdfMDsJCQkJCS8qIDB4MDA4MCAqLworI2RlZmluZSBDQkVfTUlDX0RJU0FCTEVfUFdSX1NBVl8wCTB4ODAwMDAwMDAwMDAwMDAwMExMCisKKwl1NjQJcGFkXzB4MDA4ODsJCQkJCS8qIDB4MDA4OCAqLworCisJdTY0CXNsb3dfZmFzdF90aW1lcl8wOwkJCQkvKiAweDAwOTAgKi8KKwl1NjQJc2xvd19uZXh0X3RpbWVyXzA7CQkJCS8qIDB4MDA5OCAqLworCisJdTgJcGFkXzB4MDBhMF8weDAxYzBbMHgwMWMwIC0gMHgwYTBdOwkJLyogMHgwMGEwICovCisKKwl1NjQJbWljX2N0bF9jbmZnXzE7CQkJCQkvKiAweDAxYzAgKi8KKyNkZWZpbmUgQ0JFX01JQ19ESVNBQkxFX1BXUl9TQVZfMQkweDgwMDAwMDAwMDAwMDAwMDBMTAorCXU2NAlwYWRfMHgwMWM4OwkJCQkJLyogMHgwMWM4ICovCisKKwl1NjQJc2xvd19mYXN0X3RpbWVyXzE7CQkJCS8qIDB4MDFkMCAqLworCXU2NAlzbG93X25leHRfdGltZXJfMTsJCQkJLyogMHgwMWQ4ICovCisKKwl1OAlwYWRfMHgwMWUwXzB4MTAwMFsweDEwMDAgLSAweDAxZTBdOwkJLyogMHgwMWUwICovCit9OworCitleHRlcm4gc3RydWN0IGNiZV9taWNfdG1fcmVncyBfX2lvbWVtICpjYmVfZ2V0X21pY190bV9yZWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworZXh0ZXJuIHN0cnVjdCBjYmVfbWljX3RtX3JlZ3MgX19pb21lbSAqY2JlX2dldF9jcHVfbWljX3RtX3JlZ3MoaW50IGNwdSk7CisKIC8qIEluaXQgdGhpcyBtb2R1bGUgZWFybHkgKi8KIGV4dGVybiB2b2lkIGNiZV9yZWdzX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfdGhlcm1hbC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV90aGVybWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlMGQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfdGhlcm1hbC5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogdGhlcm1hbCBzdXBwb3J0IGZvciB0aGUgY2VsbCBwcm9jZXNzb3IKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJIIDIwMDUKKyAqCisgKiBBdXRob3I6IENocmlzdGlhbiBLcmFmZnQgPGtyYWZmdEBkZS5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworI2luY2x1ZGUgImNiZV9yZWdzLmgiCisjaW5jbHVkZSAic3B1X3ByaXYxX21taW8uaCIKKworc3RhdGljIHN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqZ2V0X3BtZF9yZWdzKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJc3RydWN0IHNwdSAqc3B1OworCisJc3B1ID0gY29udGFpbmVyX29mKHN5c2Rldiwgc3RydWN0IHNwdSwgc3lzZGV2KTsKKworCXJldHVybiBjYmVfZ2V0X3BtZF9yZWdzKHNwdV9kZXZub2RlKHNwdSkpOworfQorCisvKiByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBzcHUgaW4gYSBnaXZlbiByZWdpc3RlciAqLworc3RhdGljIHU4IHNwdV9yZWFkX3JlZ2lzdGVyX3ZhbHVlKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIHVuaW9uIHNwZV9yZWcgX19pb21lbSAqcmVnKQoreworCXVuc2lnbmVkIGludCAqaWQ7CisJdW5pb24gc3BlX3JlZyB2YWx1ZTsKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisKKwkvKiBnZXR0aW5nIHRoZSBpZCBmcm9tIHRoZSByZWcgYXR0cmlidXRlIHdpbGwgbm90IHdvcmsgb24gZnV0dXJlIGRldmljZS10cmVlIGxheW91dHMKKwkgKiBpbiBmdXR1cmUgd2Ugc2hvdWxkIHN0b3JlIHRoZSBpZCB0byB0aGUgc3B1IHN0cnVjdCBhbmQgdXNlIGl0IGhlcmUgKi8KKwlzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOworCWlkID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShzcHVfZGV2bm9kZShzcHUpLCAicmVnIiwgTlVMTCk7CisJdmFsdWUudmFsID0gaW5fYmU2NCgmcmVnLT52YWwpOworCisJcmV0dXJuIHZhbHVlLnNwZVsqaWRdOworfQorCitzdGF0aWMgc3NpemVfdCBzcHVfc2hvd190ZW1wKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgdmFsdWU7CisJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVnczsKKworCXBtZF9yZWdzID0gZ2V0X3BtZF9yZWdzKHN5c2Rldik7CisKKwl2YWx1ZSA9IHNwdV9yZWFkX3JlZ2lzdGVyX3ZhbHVlKHN5c2RldiwgJnBtZF9yZWdzLT50c19jdHNyMSk7CisJLyogY2xlYXIgYWxsIG90aGVyIGJpdHMgKi8KKwl2YWx1ZSAmPSAweDNGOworCS8qIHRlbXAgaXMgc3RvcmVkIGluIHN0ZXBzIG9mIDIgZGVncmVlcyAqLworCXZhbHVlICo9IDI7CisJLyogYmFzZSB0ZW1wIGlzIDY1IGRlZ3JlZXMgKi8KKwl2YWx1ZSArPSA2NTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoaW50KSB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBwZV9zaG93X3RlbXAoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY2hhciAqYnVmLCBpbnQgcG9zKQoreworCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CisJdTY0IHZhbHVlOworCisJcG1kX3JlZ3MgPSBjYmVfZ2V0X2NwdV9wbWRfcmVncyhzeXNkZXYtPmlkKTsKKwl2YWx1ZSA9IGluX2JlNjQoJnBtZF9yZWdzLT50c19jdHNyMik7CisKKwkvKiBhY2Nlc3MgdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSAqLworCXZhbHVlID4+PSBwb3M7CisJLyogY2xlYXIgYWxsIG90aGVyIGJpdHMgKi8KKwl2YWx1ZSAmPSAweDNGOworCS8qIHRlbXAgaXMgc3RvcmVkIGluIHN0ZXBzIG9mIDIgZGVncmVlcyAqLworCXZhbHVlICo9IDI7CisJLyogYmFzZSB0ZW1wIGlzIDY1IGRlZ3JlZXMgKi8KKwl2YWx1ZSArPSA2NTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoaW50KSB2YWx1ZSk7Cit9CisKKworLyogc2hvd3MgdGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBEVFMgb24gdGhlIFBQRSwKKyAqIGxvY2F0ZWQgbmVhciB0aGUgbGluZWFyIHRoZXJtYWwgc2Vuc29yICovCitzdGF0aWMgc3NpemVfdCBwcGVfc2hvd190ZW1wMChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHBwZV9zaG93X3RlbXAoc3lzZGV2LCBidWYsIDMyKTsKK30KKworLyogc2hvd3MgdGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBzZWNvbmQgRFRTIG9uIHRoZSBQUEUgKi8KK3N0YXRpYyBzc2l6ZV90IHBwZV9zaG93X3RlbXAxKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gcHBlX3Nob3dfdGVtcChzeXNkZXYsIGJ1ZiwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSBhdHRyX3NwdV90ZW1wZXJhdHVyZSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJ0ZW1wZXJhdHVyZSIsIC5tb2RlID0gMDQwMCB9LAorCS5zaG93ID0gc3B1X3Nob3dfdGVtcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzcHVfYXR0cmlidXRlc1tdID0geworCSZhdHRyX3NwdV90ZW1wZXJhdHVyZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBzcHVfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lCT0gInRoZXJtYWwiLAorCS5hdHRycwk9IHNwdV9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGF0dHJfcHBlX3RlbXBlcmF0dXJlMCA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJ0ZW1wZXJhdHVyZTAiLCAubW9kZSA9IDA0MDAgfSwKKwkuc2hvdyA9IHBwZV9zaG93X3RlbXAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGF0dHJfcHBlX3RlbXBlcmF0dXJlMSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJ0ZW1wZXJhdHVyZTEiLCAubW9kZSA9IDA0MDAgfSwKKwkuc2hvdyA9IHBwZV9zaG93X3RlbXAxLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBwZV9hdHRyaWJ1dGVzW10gPSB7CisJJmF0dHJfcHBlX3RlbXBlcmF0dXJlMC5hdHRyLAorCSZhdHRyX3BwZV90ZW1wZXJhdHVyZTEuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcHBlX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZQk9ICJ0aGVybWFsIiwKKwkuYXR0cnMJPSBwcGVfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBpbml0aWFsaXplIHRocm90dGxpbmcgd2l0aCBkZWZhdWx0IHZhbHVlcworICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9kZWZhdWx0X3ZhbHVlcyh2b2lkKQoreworCWludCBjcHU7CisJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVnczsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OworCXVuaW9uIHBwZV9zcGVfcmVnIHRwcjsKKwl1bmlvbiBzcGVfcmVnIHN0cjE7CisJdTY0IHN0cjI7CisJdW5pb24gc3BlX3JlZyBjcjE7CisJdTY0IGNyMjsKKworCS8qIFRQUiBkZWZhdWx0cyAqLworCS8qIHBwZQorCSAqCTFGIC0gbm8gZnVsbCBzdG9wCisJICoJMDggLSBkeW5hbWljIHRocm90dGxpbmcgc3RhcnRzIGlmIG92ZXIgODAgZGVncmVlcworCSAqCTAzIC0gZHluYW1pYyB0aHJvdHRsaW5nIGNlYXNlcyBpZiBiZWxvdyA3MCBkZWdyZWVzICovCisJdHByLnBwZSA9IDB4MUYwODAzOworCS8qIHNwZQorCSAqCTEwIC0gZnVsbCBzdG9wcGVkIHdoZW4gb3ZlciA5NiBkZWdyZWVzCisJICoJMDggLSBkeW5hbWljIHRocm90dGxpbmcgc3RhcnRzIGlmIG92ZXIgODAgZGVncmVlcworCSAqCTAzIC0gZHluYW1pYyB0aHJvdHRsaW5nIGNlYXNlcyBpZiBiZWxvdyA3MCBkZWdyZWVzCisJICovCisJdHByLnNwZSA9IDB4MTAwODAzOworCisJLyogU1RSIGRlZmF1bHRzICovCisJLyogc3RyMQorCSAqCTEwIC0gc3RvcCAxNiBvZiAzMiBjeWNsZXMKKwkgKi8KKwlzdHIxLnZhbCA9IDB4MTAxMDEwMTAxMDEwMTAxMHVsbDsKKwkvKiBzdHIyCisJICoJMTAgLSBzdG9wIDE2IG9mIDMyIGN5Y2xlcworCSAqLworCXN0cjIgPSAweDEwOworCisJLyogQ1IgZGVmYXVsdHMgKi8KKwkvKiBjcjEKKwkgKgk0IC0gbm9ybWFsIG9wZXJhdGlvbgorCSAqLworCWNyMS52YWwgPSAweDA0MDQwNDA0MDQwNDA0MDR1bGw7CisJLyogY3IyCisJICoJNCAtIG5vcm1hbCBvcGVyYXRpb24KKwkgKi8KKwljcjIgPSAweDA0OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1IChjcHUpIHsKKwkJcHJfZGVidWcoInByb2Nlc3NpbmcgY3B1ICVkXG4iLCBjcHUpOworCQlzeXNkZXYgPSBnZXRfY3B1X3N5c2RldihjcHUpOworCQlwbWRfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKHN5c2Rldi0+aWQpOworCisJCW91dF9iZTY0KCZwbWRfcmVncy0+dG1fc3RyMiwgc3RyMik7CisJCW91dF9iZTY0KCZwbWRfcmVncy0+dG1fc3RyMS52YWwsIHN0cjEudmFsKTsKKwkJb3V0X2JlNjQoJnBtZF9yZWdzLT50bV90cHIudmFsLCB0cHIudmFsKTsKKwkJb3V0X2JlNjQoJnBtZF9yZWdzLT50bV9jcjEudmFsLCBjcjEudmFsKTsKKwkJb3V0X2JlNjQoJnBtZF9yZWdzLT50bV9jcjIsIGNyMik7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHRoZXJtYWxfaW5pdCh2b2lkKQoreworCWluaXRfZGVmYXVsdF92YWx1ZXMoKTsKKworCXNwdV9hZGRfc3lzZGV2X2F0dHJfZ3JvdXAoJnNwdV9hdHRyaWJ1dGVfZ3JvdXApOworCWNwdV9hZGRfc3lzZGV2X2F0dHJfZ3JvdXAoJnBwZV9hdHRyaWJ1dGVfZ3JvdXApOworCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdCh0aGVybWFsX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdGhlcm1hbF9leGl0KHZvaWQpCit7CisJc3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cCgmc3B1X2F0dHJpYnV0ZV9ncm91cCk7CisJY3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cCgmcHBlX2F0dHJpYnV0ZV9ncm91cCk7Cit9Cittb2R1bGVfZXhpdCh0aGVybWFsX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDaHJpc3RpYW4gS3JhZmZ0IDxrcmFmZnRAZGUuaWJtLmNvbT4iKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IGE5MTRjMTIuLjY2NjZkMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKQEAgLTM5NiwzICszOTYsMTkgQEAKIAkvKiBFbmFibGUgb24gY3VycmVudCBDUFUgKi8KIAlpaWNfc2V0dXBfY3B1KCk7CiB9CisKK3ZvaWQgaWljX3NldF9pbnRlcnJ1cHRfcm91dGluZyhpbnQgY3B1LCBpbnQgdGhyZWFkLCBpbnQgcHJpb3JpdHkpCit7CisJc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICppaWNfcmVncyA9IGNiZV9nZXRfY3B1X2lpY19yZWdzKGNwdSk7CisJdTY0IGlpY19pciA9IDA7CisJaW50IG5vZGUgPSBjcHUgPj4gMTsKKworCS8qIFNldCB3aGljaCBub2RlIGFuZCB0aHJlYWQgd2lsbCBoYW5kbGUgdGhlIG5leHQgaW50ZXJydXB0ICovCisJaWljX2lyIHw9IENCRV9JSUNfSVJfUFJJTyhwcmlvcml0eSkgfAorCQkgIENCRV9JSUNfSVJfREVTVF9OT0RFKG5vZGUpOworCWlmICh0aHJlYWQgPT0gMCkKKwkJaWljX2lyIHw9IENCRV9JSUNfSVJfREVTVF9VTklUKENCRV9JSUNfSVJfUFRfMCk7CisJZWxzZQorCQlpaWNfaXIgfD0gQ0JFX0lJQ19JUl9ERVNUX1VOSVQoQ0JFX0lJQ19JUl9QVF8xKTsKKwlvdXRfYmU2NCgmaWljX3JlZ3MtPmlpY19pciwgaWljX2lyKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuaAppbmRleCA5YmExZDNjLi45NDJkYzM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5oCkBAIC04Myw1ICs4Myw3IEBACiAKIGV4dGVybiB2b2lkIHNwaWRlcl9pbml0X0lSUSh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgaWljX3NldF9pbnRlcnJ1cHRfcm91dGluZyhpbnQgY3B1LCBpbnQgdGhyZWFkLCBpbnQgcHJpb3JpdHkpOworCiAjZW5kaWYKICNlbmRpZiAvKiBBU01fQ0VMTF9QSUNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODBkNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCQkgICAgICAgSUJNLCBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKworCisjZGVmaW5lIFNQSURFUl9QQ0lfUkVHX0JBU0UJCTB4ZDAwMAorI2RlZmluZSBTUElERVJfUENJX1ZDSV9DTlRMX1NUQVQJMHgwMTEwCisjZGVmaW5lIFNQSURFUl9QQ0lfRFVNTVlfUkVBRAkJMHgwODEwCisjZGVmaW5lIFNQSURFUl9QQ0lfRFVNTVlfUkVBRF9CQVNFCTB4MDgxNAorCisvKiBVbmRlZmluZSB0aGF0IHRvIHJlLWVuYWJsZSBib2d1cyBwcmVmZXRjaAorICoKKyAqIFdpdGhvdXQgdGhhdCB3b3JrYXJvdW5kLCB0aGUgY2hpcCB3aWxsIGRvIGJvZ3VzIHByZWZldGNoIHBhc3QKKyAqIHBhZ2UgYm91bmRhcnkgZnJvbSBzeXN0ZW0gbWVtb3J5LiBUaGlzIHNldHRpbmcgd2lsbCBkaXNhYmxlIHRoYXQsCisgKiB0aG91Z2ggdGhlIGRvY3VtZW50YXRpb24gaXMgdW5jbGVhciBhcyB0byB0aGUgY29uc2VxdWVuY2VzIG9mIGRvaW5nCisgKiBzbywgZWl0aGVyIHB1cmVseSBwZXJmb3JtYW5jZXMsIG9yIHBvc3NpYmxlIG1pc2JlaGF2aW91ci4uLiBJdCdzIG5vdAorICogY2xlYXIgd2V0aGVyIHRoZSBjaGlwIGNhbiBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzIGF0IGFsbCB3aXRob3V0CisgKiBwcmVmZXRjaGluZyBlbmFibGVkLgorICoKKyAqIEZvciBub3csIHRoaW5ncyBhcHBlYXIgdG8gYmUgYmVoYXZpbmcgcHJvcGVybHkgd2l0aCB0aGF0IHByZWZldGNoaW5nCisgKiBkaXNhYmxlZCBhbmQgSURFLCBwb3NzaWJseSBiZWNhdXNlIElERSBpc24ndCBkb2luZyBhbnkgdW5hbGlnbmVkCisgKiBhY2Nlc3MuCisgKi8KKyNkZWZpbmUgU1BJREVSX0RJU0FCTEVfUFJFRkVUQ0gKKworI2RlZmluZSBNQVhfU1BJREVSUwkyCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpZGVyX3BjaV9idXMgeworCXZvaWQgX19pb21lbQkqcmVnczsKKwl1bnNpZ25lZCBsb25nCW1taW9fc3RhcnQ7CisJdW5zaWduZWQgbG9uZwltbWlvX2VuZDsKKwl1bnNpZ25lZCBsb25nCXBpb192c3RhcnQ7CisJdW5zaWduZWQgbG9uZwlwaW9fdmVuZDsKK30gc3BpZGVyX3BjaV9idXNzZXNbTUFYX1NQSURFUlNdOworc3RhdGljIGludCBzcGlkZXJfcGNpX2NvdW50OworCitzdGF0aWMgc3RydWN0IHNwaWRlcl9wY2lfYnVzICpzcGlkZXJfcGNpX2ZpbmQodW5zaWduZWQgbG9uZyB2YWRkciwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYWRkcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzcGlkZXJfcGNpX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IHNwaWRlcl9wY2lfYnVzICpidXMgPSAmc3BpZGVyX3BjaV9idXNzZXNbaV07CisJCWlmIChwYWRkciAmJiBwYWRkciA+PSBidXMtPm1taW9fc3RhcnQgJiYgcGFkZHIgPCBidXMtPm1taW9fZW5kKQorCQkJcmV0dXJuIGJ1czsKKwkJaWYgKHZhZGRyICYmIHZhZGRyID49IGJ1cy0+cGlvX3ZzdGFydCAmJiB2YWRkciA8IGJ1cy0+cGlvX3ZlbmQpCisJCQlyZXR1cm4gYnVzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc3BpZGVyX2lvX2ZsdXNoKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlzdHJ1Y3Qgc3BpZGVyX3BjaV9idXMgKmJ1czsKKwlpbnQgdG9rZW47CisKKwkvKiBHZXQgcGxhdGZvcm0gdG9rZW4gKHNldCBieSBpb3JlbWFwKSBmcm9tIGFkZHJlc3MgKi8KKwl0b2tlbiA9IFBDSV9HRVRfQUREUl9UT0tFTihhZGRyKTsKKworCS8qIEZhc3QgcGF0aCBpZiB3ZSBoYXZlIGEgbm9uLTAgdG9rZW4sIGl0IGluZGljYXRlcyB3aGljaCBidXMgd2UKKwkgKiBhcmUgb24uCisJICoKKwkgKiBJZiB0aGUgdG9rZW4gaXMgMCwgdGhhdCBtZWFucyBlaXRoZXIgdGhlIHRoZSBpb3JlbWFwIHdhcyBkb25lCisJICogYmVmb3JlIHdlIGluaXRpYWxpemVkIHRoaXMgbGF5ZXIsIG9yIGl0J3MgYSBQSU8gb3BlcmF0aW9uLiBXZQorCSAqIGZhbGxiYWNrIHRvIGEgbG93IHBhdGggaW4gdGhpcyBjYXNlLiBIb3BlZnVsbHksIGludGVybmFsIGRldmljZXMKKwkgKiB3aGljaCBhcmUgaW9yZW1hcCdlZCBlYXJseSBzaG91bGQgdXNlIGluX1hYL291dF9YWCBmdW5jdGlvbnMKKwkgKiBpbnN0ZWFkIG9mIHRoZSBQQ0kgb25lcyBhbmQgdGh1cyBub3Qgc3VmZmVyIGZyb20gdGhlIHNsb3dkb3duLgorCSAqCisJICogQWxzbyBub3RlIHRoYXQgY3VycmVudGx5LCB0aGUgd29ya2Fyb3VuZCB3aWxsIG5vdCB3b3JrIGZvciBhcmVhcworCSAqIHRoYXQgYXJlIG5vdCBtYXBwZWQgd2l0aCBQVEVzIChib2x0ZWQgaW4gdGhlIGhhc2ggdGFibGUpLiBUaGlzCisJICogaXMgdGhlIGNhc2UgZm9yIGlvcmVtYXBzIGRvbmUgdmVyeSBlYXJseSBhdCBib290IChiZWZvcmUKKwkgKiBtZW1faW5pdF9kb25lKSBhbmQgaW5jbHVkZXMgdGhlIG1hcHBpbmcgb2YgdGhlIElTQSBJTyBzcGFjZS4KKwkgKgorCSAqIEZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSBhZmZlY3RlZCBkZXZpY2VzIGlzIGV4cGVjdGVkIHRvIGRvIERNQQorCSAqIGFuZCB0aHVzIHRoZXJlIHNob3VsZCBiZSBubyBwcm9ibGVtIGluIHByYWN0aWNlLgorCSAqCisJICogSW4gb3JkZXIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZXMsIHdlIG9ubHkgZG8gdGhlIFBURSBzZWFyY2ggZm9yCisJICogYWRkcmVzc2VzIGZhbGxpbmcgaW4gdGhlIFBIQiBJTyBzcGFjZSBhcmVhLiBUaGF0IG1lYW5zIGl0IHdpbGwKKwkgKiBub3Qgd29yayBmb3IgaG90cGx1ZydlZCBQSEJzIGJ1dCB0aG9zZSBkb24ndCBleGlzdCB3aXRoIFNwaWRlci4KKwkgKi8KKwlpZiAodG9rZW4gJiYgdG9rZW4gPD0gc3BpZGVyX3BjaV9jb3VudCkKKwkJYnVzID0gJnNwaWRlcl9wY2lfYnVzc2VzW3Rva2VuIC0gMV07CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHBhZGRyOworCQlwdGVfdCAqcHRlcDsKKworCQkvKiBGaXh1cCBwaHlzaWNhbCBhZGRyZXNzICovCisJCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpUENJX0ZJWF9BRERSKGFkZHIpOworCisJCS8qIENoZWNrIGlmIGl0J3MgaW4gYWxsb3dlZCByYW5nZSBmb3IgIFBJTyAqLworCQlpZiAodmFkZHIgPCBQSEJTX0lPX0JBU0UgfHwgdmFkZHIgPj0gSU1BTExPQ19CQVNFKQorCQkJcmV0dXJuOworCisJCS8qIFRyeSB0byBmaW5kIGEgUFRFLiBJZiBub3QsIGNsZWFyIHRoZSBwYWRkciwgd2UnbGwgZG8KKwkJICogYSB2YWRkciBvbmx5IGxvb2t1cCAoUElPIG9ubHkpCisJCSAqLworCQlwdGVwID0gZmluZF9saW51eF9wdGUoaW5pdF9tbS5wZ2QsIHZhZGRyKTsKKwkJaWYgKHB0ZXAgPT0gTlVMTCkKKwkJCXBhZGRyID0gMDsKKwkJZWxzZQorCQkJcGFkZHIgPSBwdGVfcGZuKCpwdGVwKSA8PCBQQUdFX1NISUZUOworCisJCWJ1cyA9IHNwaWRlcl9wY2lfZmluZCh2YWRkciwgcGFkZHIpOworCQlpZiAoYnVzID09IE5VTEwpCisJCQlyZXR1cm47CisJfQorCisJLyogTm93IGRvIHRoZSB3b3JrYXJvdW5kCisJICovCisJKHZvaWQpaW5fYmUzMihidXMtPnJlZ3MgKyBTUElERVJfUENJX0RVTU1ZX1JFQUQpOworfQorCitzdGF0aWMgdTggc3BpZGVyX3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1OCB2YWwgPSBfX2RvX3JlYWRiKGFkZHIpOworCXNwaWRlcl9pb19mbHVzaChhZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdTE2IHNwaWRlcl9yZWFkdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTE2IHZhbCA9IF9fZG9fcmVhZHcoYWRkcik7CisJc3BpZGVyX2lvX2ZsdXNoKGFkZHIpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1MzIgc3BpZGVyX3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MzIgdmFsID0gX19kb19yZWFkbChhZGRyKTsKKwlzcGlkZXJfaW9fZmx1c2goYWRkcik7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHU2NCBzcGlkZXJfcmVhZHEoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXU2NCB2YWwgPSBfX2RvX3JlYWRxKGFkZHIpOworCXNwaWRlcl9pb19mbHVzaChhZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdTE2IHNwaWRlcl9yZWFkd19iZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTE2IHZhbCA9IF9fZG9fcmVhZHdfYmUoYWRkcik7CisJc3BpZGVyX2lvX2ZsdXNoKGFkZHIpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1MzIgc3BpZGVyX3JlYWRsX2JlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MzIgdmFsID0gX19kb19yZWFkbF9iZShhZGRyKTsKKwlzcGlkZXJfaW9fZmx1c2goYWRkcik7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHU2NCBzcGlkZXJfcmVhZHFfYmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXU2NCB2YWwgPSBfX2RvX3JlYWRxX2JlKGFkZHIpOworCXNwaWRlcl9pb19mbHVzaChhZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBzcGlkZXJfcmVhZHNiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLAorCQkJICB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCV9fZG9fcmVhZHNiKGFkZHIsIGJ1ZiwgY291bnQpOworCXNwaWRlcl9pb19mbHVzaChhZGRyKTsKK30KKworc3RhdGljIHZvaWQgc3BpZGVyX3JlYWRzdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwKKwkJCSAgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlfX2RvX3JlYWRzdyhhZGRyLCBidWYsIGNvdW50KTsKKwlzcGlkZXJfaW9fZmx1c2goYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHNwaWRlcl9yZWFkc2woY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsCisJCQkgIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJX19kb19yZWFkc2woYWRkciwgYnVmLCBjb3VudCk7CisJc3BpZGVyX2lvX2ZsdXNoKGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBzcGlkZXJfbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LCBjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKKwkJCQkgdW5zaWduZWQgbG9uZyBuKQoreworCV9fZG9fbWVtY3B5X2Zyb21pbyhkZXN0LCBzcmMsIG4pOworCXNwaWRlcl9pb19mbHVzaChzcmMpOworfQorCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBzcGlkZXJfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHNwaWRlcl9wY2lfYnVzICpidXM7CisJdm9pZCBfX2lvbWVtICpyZXMgPSBfX2lvcmVtYXAoYWRkciwgc2l6ZSwgZmxhZ3MpOworCWludCBidXNubzsKKworCXByX2RlYnVnKCJzcGlkZXJfaW9yZW1hcCgweCVseCwgMHglbHgsIDB4JWx4KSAtPiAweCVwXG4iLAorCQkgYWRkciwgc2l6ZSwgZmxhZ3MsIHJlcyk7CisKKwlidXMgPSBzcGlkZXJfcGNpX2ZpbmQoMCwgYWRkcik7CisJaWYgKGJ1cyAhPSBOVUxMKSB7CisJCWJ1c25vID0gYnVzIC0gc3BpZGVyX3BjaV9idXNzZXM7CisJCXByX2RlYnVnKCIgZm91bmQgYnVzICVkLCBzZXR0aW5nIHRva2VuXG4iLCBidXNubyk7CisJCVBDSV9TRVRfQUREUl9UT0tFTihyZXMsIGJ1c25vICsgMSk7CisJfQorCXByX2RlYnVnKCIgcmVzdWx0PTB4JXBcbiIsIHJlcyk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3BpZGVyX3BjaV9zZXR1cF9jaGlwKHN0cnVjdCBzcGlkZXJfcGNpX2J1cyAqYnVzKQoreworI2lmZGVmIFNQSURFUl9ESVNBQkxFX1BSRUZFVENICisJdTMyIHZhbCA9IGluX2JlMzIoYnVzLT5yZWdzICsgU1BJREVSX1BDSV9WQ0lfQ05UTF9TVEFUKTsKKwlwcl9kZWJ1ZygiIFBWQ0lfQ29udHJvbF9TdGF0dXMgd2FzIDB4JTA4eFxuIiwgdmFsKTsKKwlvdXRfYmUzMihidXMtPnJlZ3MgKyBTUElERVJfUENJX1ZDSV9DTlRMX1NUQVQsIHZhbCB8IDB4OCk7CisjZW5kaWYKKworCS8qIENvbmZpZ3VyZSB0aGUgZHVtbXkgYWRkcmVzcyBmb3IgdGhlIHdvcmthcm91bmQgKi8KKwlvdXRfYmUzMihidXMtPnJlZ3MgKyBTUElERVJfUENJX0RVTU1ZX1JFQURfQkFTRSwgMHg4MDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzcGlkZXJfcGNpX2FkZF9vbmUoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCit7CisJc3RydWN0IHNwaWRlcl9wY2lfYnVzICpidXMgPSAmc3BpZGVyX3BjaV9idXNzZXNbc3BpZGVyX3BjaV9jb3VudF07CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBoYi0+YXJjaF9kYXRhOworCXN0cnVjdCByZXNvdXJjZSByc3JjOworCXZvaWQgX19pb21lbSAqcmVnczsKKworCWlmIChzcGlkZXJfcGNpX2NvdW50ID49IE1BWF9TUElERVJTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVG9vIG1hbnkgc3BpZGVyIGJyaWRnZXMsIHdvcmthcm91bmRzIgorCQkgICAgICAgIiBkaXNhYmxlZCBmb3IgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCQlyZXR1cm47CisJfQorCisJLyogR2V0IHRoZSByZWdpc3RlcnMgZm9yIHRoZSBiZWFzdCAqLworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcnNyYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZ2V0IHJlZ2lzdGVycyBmb3Igc3BpZGVyICVzIgorCQkgICAgICAgIiB3b3JrYXJvdW5kcyBkaXNhYmxlZFxuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYXNrIG91dCBzb21lIHVzZWxlc3MgYml0cyBpbiB0aGVyZSB0byBnZXQgdG8gdGhlIGJhc2Ugb2YgdGhlCisJICogc3BpZGVyIGNoaXAKKwkgKi8KKwlyc3JjLnN0YXJ0ICY9IH4weGZmZmZmZmZmdWw7CisKKwkvKiBNYXAgdGhlbSAqLworCXJlZ3MgPSBpb3JlbWFwKHJzcmMuc3RhcnQgKyBTUElERVJfUENJX1JFR19CQVNFLCAweDEwMDApOworCWlmIChyZWdzID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIHJlZ2lzdGVycyBmb3Igc3BpZGVyICVzIgorCQkgICAgICAgIiB3b3JrYXJvdW5kcyBkaXNhYmxlZFxuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlzcGlkZXJfcGNpX2NvdW50Kys7CisKKwkvKiBXZSBhc3N1bWUgc3BpZGVycyBvbmx5IGhhdmUgb25lIE1NSU8gcmVzb3VyY2UgKi8KKwlidXMtPm1taW9fc3RhcnQgPSBwaGItPm1lbV9yZXNvdXJjZXNbMF0uc3RhcnQ7CisJYnVzLT5tbWlvX2VuZCA9IHBoYi0+bWVtX3Jlc291cmNlc1swXS5lbmQgKyAxOworCisJYnVzLT5waW9fdnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGhiLT5pb19iYXNlX3ZpcnQ7CisJYnVzLT5waW9fdmVuZCA9IGJ1cy0+cGlvX3ZzdGFydCArIHBoYi0+cGNpX2lvX3NpemU7CisKKwlidXMtPnJlZ3MgPSByZWdzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBTcGlkZXIgTU1JTyB3b3JrYXJvdW5kIGZvciAlc1xuIixucC0+ZnVsbF9uYW1lKTsKKworCXByX2RlYnVnKCIgbW1pbyAoUCkgPSAweCUwMTZseC4uMHglMDE2bHhcbiIsCisJCSBidXMtPm1taW9fc3RhcnQsIGJ1cy0+bW1pb19lbmQpOworCXByX2RlYnVnKCIgIHBpbyAoVikgPSAweCUwMTZseC4uMHglMDE2bHhcbiIsCisJCSBidXMtPnBpb192c3RhcnQsIGJ1cy0+cGlvX3ZlbmQpOworCXByX2RlYnVnKCIgcmVncyAoUCkgPSAweCUwMTZseCAoVikgPSAweCVwXG4iLAorCQkgcnNyYy5zdGFydCArIFNQSURFUl9QQ0lfUkVHX0JBU0UsIGJ1cy0+cmVncyk7CisKKwlzcGlkZXJfcGNpX3NldHVwX2NoaXAoYnVzKTsKK30KKworc3RhdGljIHN0cnVjdCBwcGNfcGNpX2lvIF9faW5pdGRhdGEgc3BpZGVyX3BjaV9pbyA9IHsKKwkucmVhZGIgPSBzcGlkZXJfcmVhZGIsCisJLnJlYWR3ID0gc3BpZGVyX3JlYWR3LAorCS5yZWFkbCA9IHNwaWRlcl9yZWFkbCwKKwkucmVhZHEgPSBzcGlkZXJfcmVhZHEsCisJLnJlYWR3X2JlID0gc3BpZGVyX3JlYWR3X2JlLAorCS5yZWFkbF9iZSA9IHNwaWRlcl9yZWFkbF9iZSwKKwkucmVhZHFfYmUgPSBzcGlkZXJfcmVhZHFfYmUsCisJLnJlYWRzYiA9IHNwaWRlcl9yZWFkc2IsCisJLnJlYWRzdyA9IHNwaWRlcl9yZWFkc3csCisJLnJlYWRzbCA9IHNwaWRlcl9yZWFkc2wsCisJLm1lbWNweV9mcm9taW8gPSBzcGlkZXJfbWVtY3B5X2Zyb21pbywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaWRlcl9wY2lfd29ya2Fyb3VuZF9pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CisKKwlpZiAoIW1hY2hpbmVfaXMoY2VsbCkpCisJCXJldHVybiAwOworCisJLyogRmluZCBzcGlkZXIgYnJpZGdlcy4gV2UgYXNzdW1lIHRoZXkgaGF2ZSBiZWVuIGFsbCBwcm9iZWQKKwkgKiBpbiBzZXR1cF9hcmNoKCkuIElmIHRoYXQgd2FzIHRvIGNoYW5nZSwgd2Ugd291bGQgbmVlZCB0bworCSAqIHVwZGF0ZSB0aGlzIGNvZGUgdG8gY29wZSB3aXRoIGR5bmFtaWNhbGx5IGFkZGVkIGJ1c3NlcworCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocGhiLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBoYi0+YXJjaF9kYXRhOworCQljb25zdCBjaGFyICptb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisKKwkJLyogSWYgbm8gbW9kZWwgcHJvcGVydHkgb3IgbmFtZSBpc24ndCBleGFjdGx5ICJwY2kiLCBza2lwICovCisJCWlmIChtb2RlbCA9PSBOVUxMIHx8IHN0cmNtcChucC0+bmFtZSwgInBjaSIpKQorCQkJY29udGludWU7CisJCS8qIElmIG1vZGVsIGlzIG5vdCAiU3BpZGVyIiwgc2tpcCAqLworCQlpZiAoc3RyY21wKG1vZGVsLCAiU3BpZGVyIikpCisJCQljb250aW51ZTsKKwkJc3BpZGVyX3BjaV9hZGRfb25lKHBoYik7CisJfQorCisJLyogTm8gU3BpZGVyIFBDSSBmb3VuZCwgZXhpdCAqLworCWlmIChzcGlkZXJfcGNpX2NvdW50ID09IDApCisJCXJldHVybiAwOworCisJLyogU2V0dXAgSU8gY2FsbGJhY2tzLiBXZSBvbmx5IHNldHVwIE1NSU8gcmVhZHMuIFBJTyByZWFkcyB3aWxsCisJICogZmFsbGJhY2sgdG8gTU1JTyByZWFkcyAodGhvdWdoIHdpdGhvdXQgYSB0b2tlbiwgdGh1cyBzbG93ZXIpCisJICovCisJcHBjX3BjaV9pbyA9IHNwaWRlcl9wY2lfaW87CisKKwkvKiBTZXR1cCBpb3JlbWFwIGNhbGxiYWNrICovCisJcHBjX21kLmlvcmVtYXAgPSBzcGlkZXJfaW9yZW1hcDsKKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChzcGlkZXJfcGNpX3dvcmthcm91bmRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCmluZGV4IGFjYTRjM2RiLi5iNDM0NjZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwpAQCAtMSw1MTQgKzEsNzQ3IEBACiAvKgogICogSU9NTVUgaW1wbGVtZW50YXRpb24gZm9yIENlbGwgQnJvYWRiYW5kIFByb2Nlc3NvciBBcmNoaXRlY3R1cmUKLSAqIFdlIGp1c3QgZXN0YWJsaXNoIGEgbGluZWFyIG1hcHBpbmcgYXQgYm9vdCBieSBzZXR0aW5nIGFsbCB0aGUKLSAqIElPUFQgY2FjaGUgZW50cmllcyBpbiB0aGUgQ1BVLgotICogVGhlIG1hcHBpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSBpZGVudGljYWwgdG8gcGNpX2RpcmVjdF9pb21tdSwgCi0gKiBleGNlcHQgZm9yIHRoZSBoYW5kbGluZyBvZiB0aGUgaGlnaCBvcmRlciBiaXQgdGhhdCBpcyByZXF1aXJlZAotICogYnkgdGhlIFNwaWRlciBicmlkZ2UuIFRoZXNlIHNob3VsZCBiZSBzcGxpdCBpbnRvIGEgc2VwYXJhdGUKLSAqIGZpbGUgYXQgdGhlIHBvaW50IHdoZXJlIHdlIGdldCBhIGRpZmZlcmVudCBicmlkZ2UgY2hpcC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsCi0gKgkJCSBBcm5kIEJlcmdtYW5uIDxhcm5kYkBkZS5pYm0uY29tPgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNgogICoKLSAqIEJhc2VkIG9uIGxpbmVhciBtYXBwaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgQmVuamFtaW4gSGVycmVuc2NobWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQorICogQXV0aG9yOiBKZXJlbXkgS2VyciA8amtAb3psYWJzLm9yZz4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAogI3VuZGVmIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAotI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KLSNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL2xtYi5oPgogCi0jaW5jbHVkZSAiaW9tbXUuaCIKKyNpbmNsdWRlICJjYmVfcmVncy5oIgorI2luY2x1ZGUgImludGVycnVwdC5oIgogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgCi1nZXRfaW9wdF9lbnRyeSh1bnNpZ25lZCBsb25nIHJlYWxfYWRkcmVzcywgdW5zaWduZWQgbG9uZyBpb2lkLAotCQkJIHVuc2lnbmVkIGxvbmcgcHJvdCkKLXsKLQlyZXR1cm4gKHByb3QgJiBJT1BUX1BST1RfTUFTSykKLQkgICAgIHwgKElPUFRfQ09IRVJFTlQpCi0JICAgICB8IChJT1BUX09SREVSX1ZDKQotCSAgICAgfCAocmVhbF9hZGRyZXNzICYgSU9QVF9SUE5fTUFTSykKLQkgICAgIHwgKGlvaWQgJiBJT1BUX0lPSURfTUFTSyk7Ci19CisvKiBEZWZpbmUgQ0VMTF9JT01NVV9SRUFMX1VOTUFQIHRvIGFjdHVhbGx5IHVubWFwIG5vbi11c2VkIHBhZ2VzCisgKiBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlbSBtYXBwZWQgdG8gc29tZSBkdW1teSBwYWdlLiBUaGlzIGNhbiBiZQorICogZW5hYmxlZCBvbmNlIHRoZSBhcHByb3ByaWF0ZSB3b3JrYXJvdW5kcyBmb3Igc3BpZGVyIGJ1Z3MgaGF2ZQorICogYmVlbiBlbmFibGVkCisgKi8KKyNkZWZpbmUgQ0VMTF9JT01NVV9SRUFMX1VOTUFQCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLX0gaW9zdGU7CisvKiBEZWZpbmUgQ0VMTF9JT01NVV9TVFJJQ1RfUFJPVEVDVElPTiB0byBlbmZvcmNlIHByb3RlY3Rpb24gb2YKKyAqIElPIFBURXMgYmFzZWQgb24gdGhlIHRyYW5zZmVyIGRpcmVjdGlvbi4gVGhhdCBjYW4gYmUgZW5hYmxlZAorICogb25jZSBzcGlkZXItbmV0IGhhcyBiZWVuIGZpeGVkIHRvIHBhc3MgdGhlIGNvcnJlY3QgZGlyZWN0aW9uCisgKiB0byB0aGUgRE1BIG1hcHBpbmcgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgQ0VMTF9JT01NVV9TVFJJQ1RfUFJPVEVDVElPTgogCi1zdGF0aWMgaW5saW5lIGlvc3RlCi1ta19pb3N0ZSh1bnNpZ25lZCBsb25nIHZhbCkKLXsKLQlpb3N0ZSBpb3N0ZSA9IHsgLnZhbCA9IHZhbCwgfTsKLQlyZXR1cm4gaW9zdGU7Ci19CiAKLXN0YXRpYyBpbmxpbmUgaW9zdGUKLWdldF9pb3N0X2VudHJ5KHVuc2lnbmVkIGxvbmcgaW9wdF9iYXNlLCB1bnNpZ25lZCBsb25nIGlvX2FkZHJlc3MsIHVuc2lnbmVkIHBhZ2Vfc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHBzOwotCXVuc2lnbmVkIGxvbmcgaW9zdGVwOwotCXVuc2lnbmVkIGxvbmcgbm5wdDsKLQl1bnNpZ25lZCBsb25nIHNoaWZ0OworI2RlZmluZSBOUl9JT01NVVMJCQkyCiAKLQlzd2l0Y2ggKHBhZ2Vfc2l6ZSkgewotCWNhc2UgMHgxMDAwMDAwOgotCQlwcyA9IElPU1RfUFNfMTZNOwotCQlubnB0ID0gMDsgIC8qIG9uZSBwYWdlIHBlciBzZWdtZW50ICovCi0JCXNoaWZ0ID0gNTsgLyogc2VnbWVudCBoYXMgMTYgaW9wdCBlbnRyaWVzICovCi0JCWJyZWFrOworLyogSU9DIG1tYXAgcmVnaXN0ZXJzICovCisjZGVmaW5lIElPQ19SZWdfU2l6ZQkJCTB4MjAwMAogCi0JY2FzZSAweDEwMDAwMDoKLQkJcHMgPSBJT1NUX1BTXzFNOwotCQlubnB0ID0gMDsgIC8qIG9uZSBwYWdlIHBlciBzZWdtZW50ICovCi0JCXNoaWZ0ID0gMTsgLyogc2VnbWVudCBoYXMgMjU2IGlvcHQgZW50cmllcyAqLwotCQlicmVhazsKKyNkZWZpbmUgSU9DX0lPUFRfQ2FjaGVJbnZkCQkweDkwOAorI2RlZmluZSBJT0NfSU9QVF9DYWNoZUludmRfTkVfTWFzawkweGZmZTAwMDAwMDAwMDAwMDB1bAorI2RlZmluZSBJT0NfSU9QVF9DYWNoZUludmRfSU9QVEVfTWFzawkweDAwMDAwM2ZmZmZmZmZmZjh1bAorI2RlZmluZSBJT0NfSU9QVF9DYWNoZUludmRfQnVzeQkJMHgwMDAwMDAwMDAwMDAwMDAxdWwKIAotCWNhc2UgMHgxMDAwMDoKLQkJcHMgPSBJT1NUX1BTXzY0SzsKLQkJbm5wdCA9IDB4MDc7IC8qIDggcGFnZXMgcGVyIGlvIHBhZ2UgdGFibGUgKi8KLQkJc2hpZnQgPSAwOyAgIC8qIGFsbCBlbnRyaWVzIGFyZSB1c2VkICovCi0JCWJyZWFrOworI2RlZmluZSBJT0NfSU9TVF9PcmlnaW4JCQkweDkxOAorI2RlZmluZSBJT0NfSU9TVF9PcmlnaW5fRQkJMHg4MDAwMDAwMDAwMDAwMDAwdWwKKyNkZWZpbmUgSU9DX0lPU1RfT3JpZ2luX0hXCQkweDAwMDAwMDAwMDAwMDA4MDB1bAorI2RlZmluZSBJT0NfSU9TVF9PcmlnaW5fSEwJCTB4MDAwMDAwMDAwMDAwMDQwMHVsCiAKLQljYXNlIDB4MTAwMDoKLQkJcHMgPSBJT1NUX1BTXzRLOwotCQlubnB0ID0gMHg3ZjsgLyogMTI4IHBhZ2VzIHBlciBpbyBwYWdlIHRhYmxlICovCi0JCXNoaWZ0ID0gMDsgICAvKiBhbGwgZW50cmllcyBhcmUgdXNlZCAqLwotCQlicmVhazsKKyNkZWZpbmUgSU9DX0lPX0V4Y3BTdGF0CQkJMHg5MjAKKyNkZWZpbmUgSU9DX0lPX0V4Y3BTdGF0X1YJCTB4ODAwMDAwMDAwMDAwMDAwMHVsCisjZGVmaW5lIElPQ19JT19FeGNwU3RhdF9TUEZfTWFzawkweDYwMDAwMDAwMDAwMDAwMDB1bAorI2RlZmluZSBJT0NfSU9fRXhjcFN0YXRfU1BGX1MJCTB4NjAwMDAwMDAwMDAwMDAwMHVsCisjZGVmaW5lIElPQ19JT19FeGNwU3RhdF9TUEZfUAkJMHg0MDAwMDAwMDAwMDAwMDAwdWwKKyNkZWZpbmUgSU9DX0lPX0V4Y3BTdGF0X0FERFJfTWFzawkweDAwMDAwMDA3ZmZmZmYwMDB1bAorI2RlZmluZSBJT0NfSU9fRXhjcFN0YXRfUldfTWFzawkJMHgwMDAwMDAwMDAwMDAwODAwdWwKKyNkZWZpbmUgSU9DX0lPX0V4Y3BTdGF0X0lPSURfTWFzawkweDAwMDAwMDAwMDAwMDA3ZmZ1bAogCi0JZGVmYXVsdDogLyogbm90IGEga25vd24gY29tcGlsZSB0aW1lIGNvbnN0YW50ICovCi0JCXsKLQkJCS8qIEJVSUxEX0JVR19PTigpIGlzIG5vdCB1c2FibGUgaGVyZSAqLwotCQkJZXh0ZXJuIHZvaWQgX19nZXRfaW9zdF9lbnRyeV9iYWRfcGFnZV9zaXplKHZvaWQpOwotCQkJX19nZXRfaW9zdF9lbnRyeV9iYWRfcGFnZV9zaXplKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorI2RlZmluZSBJT0NfSU9fRXhjcE1hc2sJCQkweDkyOAorI2RlZmluZSBJT0NfSU9fRXhjcE1hc2tfU0ZFCQkweDQwMDAwMDAwMDAwMDAwMDB1bAorI2RlZmluZSBJT0NfSU9fRXhjcE1hc2tfUEZFCQkweDIwMDAwMDAwMDAwMDAwMDB1bAogCi0JaW9zdGVwID0gaW9wdF9iYXNlICsKLQkJCSAvKiBuZWVkIDggYnl0ZXMgcGVyIGlvcHRlICovCi0JCQkoKChpb19hZGRyZXNzIC8gcGFnZV9zaXplICogOCkKLQkJCSAvKiBhbGlnbiBpbyBwYWdlIHRhYmxlcyBvbiA0ayBwYWdlIGJvdW5kYXJpZXMgKi8KLQkJCQkgPDwgc2hpZnQpIAotCQkJIC8qIG5ucHQrMSBwYWdlcyBnbyBpbnRvIGVhY2ggaW9wdCAqLwotCQkJCSAmIH4obm5wdCA8PCAxMikpOworI2RlZmluZSBJT0NfSU9DbWRfT2Zmc2V0CQkweDEwMDAKIAotCW5ucHQrKzsgLyogdGhpcyBzZWVtcyB0byB3b3JrLCBidXQgdGhlIGRvY3VtZW50YXRpb24gaXMgbm90IGNsZWFyCi0JCSAgIGFib3V0IHdldGhlciB3ZSBwdXQgbm5wdCBvciBubnB0LTEgaW50byB0aGUgaW9zdGUgYml0cy4KLQkJICAgSW4gdGhlb3J5LCB0aGlzIGNhbid0IHdvcmsgZm9yIDRrIHBhZ2VzLiAqLwotCXJldHVybiBta19pb3N0ZShJT1NUX1ZBTElEX01BU0sKLQkJCXwgKGlvc3RlcCAmIElPU1RfUFRfQkFTRV9NQVNLKQotCQkJfCAoKG5ucHQgPDwgNSkgJiBJT1NUX05OUFRfTUFTSykKLQkJCXwgKHBzICYgSU9TVF9QU19NQVNLKSk7Ci19CisjZGVmaW5lIElPQ19JT0NtZF9DZmcJCQkweGMwMAorI2RlZmluZSBJT0NfSU9DbWRfQ2ZnX1RFCQkweDAwMDA4MDAwMDAwMDAwMDB1bAogCi0vKiBjb21wdXRlIHRoZSBhZGRyZXNzIG9mIGFuIGlvIHB0ZSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1nZXRfaW9wdGVwKGlvc3RlIGlvc3RfZW50cnksIHVuc2lnbmVkIGxvbmcgaW9fYWRkcmVzcykKLXsKLQl1bnNpZ25lZCBsb25nIGlvcHRfYmFzZTsKLQl1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIHBhZ2VfbnVtYmVyOwotCXVuc2lnbmVkIGxvbmcgaW9wdF9vZmZzZXQ7CiAKLQlpb3B0X2Jhc2UgPSBpb3N0X2VudHJ5LnZhbCAmIElPU1RfUFRfQkFTRV9NQVNLOwotCXBhZ2Vfc2l6ZSA9IGlvc3RfZW50cnkudmFsICYgSU9TVF9QU19NQVNLOworLyogU2VnbWVudCB0YWJsZSBlbnRyaWVzICovCisjZGVmaW5lIElPU1RFX1YJCQkweDgwMDAwMDAwMDAwMDAwMDB1bCAvKiB2YWxpZCAqLworI2RlZmluZSBJT1NURV9ICQkJMHg0MDAwMDAwMDAwMDAwMDAwdWwgLyogY2FjaGUgaGludCAqLworI2RlZmluZSBJT1NURV9QVF9CYXNlX1JQTl9NYXNrICAweDNmZmZmZmZmZmZmZmYwMDB1bCAvKiBiYXNlIFJQTiBvZiBJT1BUICovCisjZGVmaW5lIElPU1RFX05QUFRfTWFzawkJMHgwMDAwMDAwMDAwMDAwZmUwdWwgLyogbm8uIHBhZ2VzIGluIElPUFQgKi8KKyNkZWZpbmUgSU9TVEVfUFNfTWFzawkJMHgwMDAwMDAwMDAwMDAwMDA3dWwgLyogcGFnZSBzaXplICovCisjZGVmaW5lIElPU1RFX1BTXzRLCQkweDAwMDAwMDAwMDAwMDAwMDF1bCAvKiAgIC0gNGtCICAqLworI2RlZmluZSBJT1NURV9QU182NEsJCTB4MDAwMDAwMDAwMDAwMDAwM3VsIC8qICAgLSA2NGtCICovCisjZGVmaW5lIElPU1RFX1BTXzFNCQkweDAwMDAwMDAwMDAwMDAwMDV1bCAvKiAgIC0gMU1CICAqLworI2RlZmluZSBJT1NURV9QU18xNk0JCTB4MDAwMDAwMDAwMDAwMDAwN3VsIC8qICAgLSAxNk1CICovCiAKLQkvKiBkZWNvZGUgcGFnZSBzaXplIHRvIGNvbXB1dGUgcGFnZSBudW1iZXIgKi8KLQlwYWdlX251bWJlciA9IChpb19hZGRyZXNzICYgMHgwZmZmZmZmZikgPj4gKDEwICsgMiAqIHBhZ2Vfc2l6ZSk7Ci0JLyogcGFnZSBudW1iZXIgaXMgYW4gb2Zmc2V0IGludG8gdGhlIGlvIHBhZ2UgdGFibGUgKi8KLQlpb3B0X29mZnNldCA9IChwYWdlX251bWJlciA8PCAzKSAmIDB4N2ZmZjh1bDsKLQlyZXR1cm4gaW9wdF9iYXNlICsgaW9wdF9vZmZzZXQ7Ci19CisvKiBQYWdlIHRhYmxlIGVudHJpZXMgKi8KKyNkZWZpbmUgSU9QVEVfUFBfVwkJMHg4MDAwMDAwMDAwMDAwMDAwdWwgLyogcHJvdGVjdGlvbjogd3JpdGUgKi8KKyNkZWZpbmUgSU9QVEVfUFBfUgkJMHg0MDAwMDAwMDAwMDAwMDAwdWwgLyogcHJvdGVjdGlvbjogcmVhZCAqLworI2RlZmluZSBJT1BURV9NCQkJMHgyMDAwMDAwMDAwMDAwMDAwdWwgLyogY29oZXJlbmN5IHJlcXVpcmVkICovCisjZGVmaW5lIElPUFRFX1NPX1IJCTB4MTAwMDAwMDAwMDAwMDAwMHVsIC8qIG9yZGVyaW5nOiB3cml0ZXMgKi8KKyNkZWZpbmUgSU9QVEVfU09fUlcgICAgICAgICAgICAgMHgxODAwMDAwMDAwMDAwMDAwdWwgLyogb3JkZXJpbmc6IHIgJiB3ICovCisjZGVmaW5lIElPUFRFX1JQTl9NYXNrCQkweDA3ZmZmZmZmZmZmZmYwMDB1bCAvKiBSUE4gKi8KKyNkZWZpbmUgSU9QVEVfSAkJCTB4MDAwMDAwMDAwMDAwMDgwMHVsIC8qIGNhY2hlIGhpbnQgKi8KKyNkZWZpbmUgSU9QVEVfSU9JRF9NYXNrCQkweDAwMDAwMDAwMDAwMDA3ZmZ1bCAvKiBpb2lkICovCiAKLS8qIGNvbXB1dGUgdGhlIHRhZyBmaWVsZCBvZiB0aGUgaW9wdCBjYWNoZSBlbnRyeSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1nZXRfaW9jX3RhZyhpb3N0ZSBpb3N0X2VudHJ5LCB1bnNpZ25lZCBsb25nIGlvX2FkZHJlc3MpCi17Ci0JdW5zaWduZWQgbG9uZyBpb3B0ZSA9IGdldF9pb3B0ZXAoaW9zdF9lbnRyeSwgaW9fYWRkcmVzcyk7CiAKLQlyZXR1cm4gSU9QVF9WQUxJRF9NQVNLCi0JICAgICB8ICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDAwZmY4dWwpID4+IDMpCi0JICAgICB8ICgoaW9wdGUgJiAweDAwMDAwMDNmZmZmZmMwMDAwdWwpID4+IDkpOwotfQorLyogSU9NTVUgc2l6aW5nICovCisjZGVmaW5lIElPX1NFR01FTlRfU0hJRlQJMjgKKyNkZWZpbmUgSU9fUEFHRU5PX0JJVFMJCShJT19TRUdNRU5UX1NISUZUIC0gSU9NTVVfUEFHRV9TSElGVCkKIAotLyogY29tcHV0ZSB0aGUgaGFzaGVkIDYgYml0IGluZGV4IGZvciB0aGUgNC13YXkgYXNzb2NpYXRpdmUgcHRlIGNhY2hlICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWdldF9pb2NfaGFzaChpb3N0ZSBpb3N0X2VudHJ5LCB1bnNpZ25lZCBsb25nIGlvX2FkZHJlc3MpCi17Ci0JdW5zaWduZWQgbG9uZyBpb3B0ZSA9IGdldF9pb3B0ZXAoaW9zdF9lbnRyeSwgaW9fYWRkcmVzcyk7CisvKiBUaGUgaGlnaCBiaXQgbmVlZHMgdG8gYmUgc2V0IG9uIGV2ZXJ5IERNQSBhZGRyZXNzICovCisjZGVmaW5lIFNQSURFUl9ETUFfT0ZGU0VUCTB4ODAwMDAwMDB1bAogCi0JcmV0dXJuICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDAwMWY4dWwpID4+IDMpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDIwMDAwdWwpID4+IDE3KQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAxMDAwMHVsKSA+PiAxNSkKLQkgICAgIF4gKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMDgwMDB1bCkgPj4gMTMpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDA0MDAwdWwpID4+IDExKQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAwMjAwMHVsKSA+PiA5KQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAwMTAwMHVsKSA+PiA3KTsKLX0KLQotLyogc2FtZSBhcyBhYm92ZSwgYnV0IHByZXRlbmQgdGhhdCB3ZSBoYXZlIGEgc2ltcGxlciAxLXdheSBhc3NvY2lhdGl2ZQotICAgcHRlIGNhY2hlIHdpdGggYW4gOCBiaXQgaW5kZXggKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotZ2V0X2lvY19oYXNoXzF3YXkoaW9zdGUgaW9zdF9lbnRyeSwgdW5zaWduZWQgbG9uZyBpb19hZGRyZXNzKQotewotCXVuc2lnbmVkIGxvbmcgaW9wdGUgPSBnZXRfaW9wdGVwKGlvc3RfZW50cnksIGlvX2FkZHJlc3MpOwotCi0JcmV0dXJuICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDAwMWY4dWwpID4+IDMpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDIwMDAwdWwpID4+IDE3KQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAxMDAwMHVsKSA+PiAxNSkKLQkgICAgIF4gKChpb3B0ZSAmIDB4MDAwMDAwMDAwMDAwMDgwMDB1bCkgPj4gMTMpCi0JICAgICBeICgoaW9wdGUgJiAweDAwMDAwMDAwMDAwMDA0MDAwdWwpID4+IDExKQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAwMjAwMHVsKSA+PiA5KQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAwMTAwMHVsKSA+PiA3KQotCSAgICAgXiAoKGlvcHRlICYgMHgwMDAwMDAwMDAwMDAwYzAwMHVsKSA+PiA4KTsKLX0KLQotc3RhdGljIGlubGluZSBpb3N0ZQotZ2V0X2lvc3RfY2FjaGUodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBsb25nIGluZGV4KQotewotCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqcCA9IChiYXNlICsgSU9DX1NUX0NBQ0hFX0RJUik7Ci0JcmV0dXJuIG1rX2lvc3RlKGluX2JlNjQoJnBbaW5kZXhdKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X2lvc3RfY2FjaGUodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBsb25nIGluZGV4LCBpb3N0ZSBzdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBfX2lvbWVtICpwID0gKGJhc2UgKyBJT0NfU1RfQ0FDSEVfRElSKTsKLQlwcl9kZWJ1ZygiaW9zdGUgJTAybHggd2FzICUwMTZseCwgc3RvcmUgJTAxNmx4IiwgaW5kZXgsCi0JCQlnZXRfaW9zdF9jYWNoZShiYXNlLCBpbmRleCkudmFsLCBzdGUudmFsKTsKLQlvdXRfYmU2NCgmcFtpbmRleF0sIHN0ZS52YWwpOwotCXByX2RlYnVnKCIgbm93ICUwMTZseFxuIiwgZ2V0X2lvc3RfY2FjaGUoYmFzZSwgaW5kZXgpLnZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotZ2V0X2lvcHRfY2FjaGUodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICp0YWcpCi17Ci0JdW5zaWduZWQgbG9uZyBfX2lvbWVtICp0YWdzID0gKHZvaWQgKikoYmFzZSArIElPQ19QVF9DQUNIRV9ESVIpOwotCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqcCA9ICh2b2lkICopKGJhc2UgKyBJT0NfUFRfQ0FDSEVfUkVHKTsJCi0KLQkqdGFnID0gdGFnc1tpbmRleF07Ci0Jcm1iKCk7Ci0JcmV0dXJuICpwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF9pb3B0X2NhY2hlKHZvaWQgX19pb21lbSAqYmFzZSwgdW5zaWduZWQgbG9uZyBpbmRleCwKLQkJIHVuc2lnbmVkIGxvbmcgdGFnLCB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnRhZ3MgPSBiYXNlICsgSU9DX1BUX0NBQ0hFX0RJUjsKLQl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnAgPSBiYXNlICsgSU9DX1BUX0NBQ0hFX1JFRzsKLQotCW91dF9iZTY0KHAsIHZhbCk7Ci0Jb3V0X2JlNjQoJnRhZ3NbaW5kZXhdLCB0YWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF9pb3N0X29yaWdpbih2b2lkIF9faW9tZW0gKmJhc2UpCi17Ci0JdW5zaWduZWQgbG9uZyBfX2lvbWVtICpwID0gYmFzZSArIElPQ19TVF9PUklHSU47Ci0JdW5zaWduZWQgbG9uZyBvcmlnaW4gPSBJT1NUT19FTkFCTEUgfCBJT1NUT19TVzsKLQotCXByX2RlYnVnKCJpb3N0X29yaWdpbiAlMDE2bHgsIG5vdyAlMDE2bHhcbiIsIGluX2JlNjQocCksIG9yaWdpbik7Ci0Jb3V0X2JlNjQocCwgb3JpZ2luKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfaW9jbWRfY29uZmlnKHZvaWQgX19pb21lbSAqYmFzZSkKLXsKLQl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnAgPSBiYXNlICsgMHhjMDA7Ci0JdW5zaWduZWQgbG9uZyBjb25mOwotCi0JY29uZiA9IGluX2JlNjQocCk7Ci0JcHJfZGVidWcoImlvc3RfY29uZiAlMDE2bHgsIG5vdyAlMDE2bHhcbiIsIGNvbmYsIGNvbmYgfCBJT0NNRF9DT05GX1RFKTsKLQlvdXRfYmU2NChwLCBjb25mIHwgSU9DTURfQ09ORl9URSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9tYXBwaW5nKHZvaWQgX19pb21lbSAqYmFzZSwgdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UpCi17Ci0Jc2V0X2lvY21kX2NvbmZpZyhiYXNlKTsKLQlzZXRfaW9zdF9vcmlnaW4obW1pb19iYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgaW9tbXVfZGV2X3NldHVwX251bGwoc3RydWN0IHBjaV9kZXYgKmQpIHsgfQotc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwX251bGwoc3RydWN0IHBjaV9idXMgKmIpIHsgfQotCi1zdHJ1Y3QgY2VsbF9pb21tdSB7Ci0JdW5zaWduZWQgbG9uZyBiYXNlOwotCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOwotCXZvaWQgX19pb21lbSAqbWFwcGVkX2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtICptYXBwZWRfbW1pb19iYXNlOworc3RydWN0IGlvbW11X3dpbmRvdyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBjYmVfaW9tbXUgKmlvbW11OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHB0ZV9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGlvaWQ7CisJc3RydWN0IGlvbW11X3RhYmxlIHRhYmxlOwogfTsKIAotc3RhdGljIHN0cnVjdCBjZWxsX2lvbW11IGNlbGxfaW9tbXVzW05SX0NQVVNdOworI2RlZmluZSBOQU1FU0laRSA4CitzdHJ1Y3QgY2JlX2lvbW11IHsKKwlpbnQgbmlkOworCWNoYXIgbmFtZVtOQU1FU0laRV07CisJdm9pZCBfX2lvbWVtICp4bGF0ZV9yZWdzOworCXZvaWQgX19pb21lbSAqY21kX3JlZ3M7CisJdW5zaWduZWQgbG9uZyAqc3RhYjsKKwl1bnNpZ25lZCBsb25nICpwdGFiOworCXZvaWQgKnBhZF9wYWdlOworCXN0cnVjdCBsaXN0X2hlYWQgd2luZG93czsKK307CiAKLS8qIGluaXRpYWxpemUgdGhlIGlvbW11IHRvIHN1cHBvcnQgYSBzaW1wbGUgbGluZWFyIG1hcHBpbmcKLSAqIGZvciBlYWNoIERNQSB3aW5kb3cgdXNlZCBieSBhbnkgZGV2aWNlLiBGb3Igbm93LCB3ZQotICogaGFwcGVuIHRvIGtub3cgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBETUEgd2luZG93IGluIHVzZSwKLSAqIHN0YXJ0aW5nIGF0IGlvcHRfcGh5c19vZmZzZXQuICovCi1zdGF0aWMgdm9pZCBjZWxsX2RvX21hcF9pb21tdShzdHJ1Y3QgY2VsbF9pb21tdSAqaW9tbXUsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgaW9pZCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbWFwX3N0YXJ0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSkKKy8qIFN0YXRpYyBhcnJheSBvZiBpb21tdXMsIG9uZSBwZXIgbm9kZQorICogICBlYWNoIGNvbnRhaW5zIGEgbGlzdCBvZiB3aW5kb3dzLCBrZXllZCBmcm9tIGRtYV93aW5kb3cgcHJvcGVydHkKKyAqICAgLSBvbiBidXMgc2V0dXAsIGxvb2sgZm9yIGEgbWF0Y2hpbmcgd2luZG93LCBvciBjcmVhdGUgb25lCisgKiAgIC0gb24gZGV2IHNldHVwLCBhc3NpZ24gaW9tbXVfdGFibGUgcHRyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2JlX2lvbW11IGlvbW11c1tOUl9JT01NVVNdOworc3RhdGljIGludCBjYmVfbnJfaW9tbXVzOworCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3RjZV9jYWNoZShzdHJ1Y3QgY2JlX2lvbW11ICppb21tdSwgdW5zaWduZWQgbG9uZyAqcHRlLAorCQlsb25nIG5fcHRlcykKIHsKLQl1bnNpZ25lZCBsb25nIGlvX2FkZHJlc3MsIHJlYWxfYWRkcmVzczsKLQl2b2lkIF9faW9tZW0gKmlvY19iYXNlLCAqaW9jX21taW9fYmFzZTsKLQlpb3N0ZSBpb3N0ZTsKLQl1bnNpZ25lZCBsb25nIGluZGV4OworCXVuc2lnbmVkIGxvbmcgKnJlZywgdmFsOworCWxvbmcgbjsKIAotCS8qIHdlIHByZXRlbmQgdGhlIGlvIHBhZ2UgdGFibGUgd2FzIGF0IGEgdmVyeSBoaWdoIGFkZHJlc3MgKi8KLQljb25zdCB1bnNpZ25lZCBsb25nIGZha2VfaW9wdCA9IDB4MTAwMDAwMDAwMDB1bDsKLQljb25zdCB1bnNpZ25lZCBsb25nIGlvX3BhZ2Vfc2l6ZSA9IDB4MTAwMDAwMDsgLyogdXNlIDE2TSBwYWdlcyAqLwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgaW9fc2VnbWVudF9zaXplID0gMHgxMDAwMDAwMDsgLyogMjU2TSAqLworCXJlZyA9IGlvbW11LT54bGF0ZV9yZWdzICsgSU9DX0lPUFRfQ2FjaGVJbnZkOwogCi0JaW9jX2Jhc2UgPSBpb21tdS0+bWFwcGVkX2Jhc2U7Ci0JaW9jX21taW9fYmFzZSA9IGlvbW11LT5tYXBwZWRfbW1pb19iYXNlOworCXdoaWxlIChuX3B0ZXMgPiAwKSB7CisJCS8qIHdlIGNhbiBpbnZhbGlkYXRlIHVwIHRvIDEgPDwgMTEgUFRFcyBhdCBvbmNlICovCisJCW4gPSBtaW4obl9wdGVzLCAxbCA8PCAxMSk7CisJCXZhbCA9ICgoKG4gLyotIDEqLykgPDwgNTMpICYgSU9DX0lPUFRfQ2FjaGVJbnZkX05FX01hc2spCisJCQl8IChfX3BhKHB0ZSkgJiBJT0NfSU9QVF9DYWNoZUludmRfSU9QVEVfTWFzaykKKwkJICAgICAgICB8IElPQ19JT1BUX0NhY2hlSW52ZF9CdXN5OwogCi0JZm9yIChyZWFsX2FkZHJlc3MgPSAwLCBpb19hZGRyZXNzID0gbWFwX3N0YXJ0OwotCSAgICAgaW9fYWRkcmVzcyA8PSBtYXBfc3RhcnQgKyBtYXBfc2l6ZTsKLQkgICAgIHJlYWxfYWRkcmVzcyArPSBpb19wYWdlX3NpemUsIGlvX2FkZHJlc3MgKz0gaW9fcGFnZV9zaXplKSB7Ci0JCWlvc3RlID0gZ2V0X2lvc3RfZW50cnkoZmFrZV9pb3B0LCBpb19hZGRyZXNzLCBpb19wYWdlX3NpemUpOwotCQlpZiAoKHJlYWxfYWRkcmVzcyAlIGlvX3NlZ21lbnRfc2l6ZSkgPT0gMCkgLyogc2VnbWVudCBzdGFydCAqLwotCQkJc2V0X2lvc3RfY2FjaGUoaW9jX21taW9fYmFzZSwKLQkJCQkgICAgICAgaW9fYWRkcmVzcyA+PiAyOCwgaW9zdGUpOwotCQlpbmRleCA9IGdldF9pb2NfaGFzaF8xd2F5KGlvc3RlLCBpb19hZGRyZXNzKTsKLQkJcHJfZGVidWcoImFkZHIgJTA4bHgsIGluZGV4ICUwMmx4LCBpb3N0ZSAlMDE2bHhcbiIsCi0JCQkJCSBpb19hZGRyZXNzLCBpbmRleCwgaW9zdGUudmFsKTsKLQkJc2V0X2lvcHRfY2FjaGUoaW9jX21taW9fYmFzZSwKLQkJCWdldF9pb2NfaGFzaF8xd2F5KGlvc3RlLCBpb19hZGRyZXNzKSwKLQkJCWdldF9pb2NfdGFnKGlvc3RlLCBpb19hZGRyZXNzKSwKLQkJCWdldF9pb3B0X2VudHJ5KHJlYWxfYWRkcmVzcywgaW9pZCwgSU9QVF9QUk9UX1JXKSk7CisJCW91dF9iZTY0KHJlZywgdmFsKTsKKwkJd2hpbGUgKGluX2JlNjQocmVnKSAmIElPQ19JT1BUX0NhY2hlSW52ZF9CdXN5KQorCQkJOworCisJCW5fcHRlcyAtPSBuOworCQlwdGUgKz0gbjsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGlvbW11X2Rldm5vZGVfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpkKQorc3RhdGljIHZvaWQgdGNlX2J1aWxkX2NlbGwoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGxvbmcgaW5kZXgsIGxvbmcgbnBhZ2VzLAorCQl1bnNpZ25lZCBsb25nIHVhZGRyLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyAqaW9fcHRlLCBiYXNlX3B0ZTsKKwlzdHJ1Y3QgaW9tbXVfd2luZG93ICp3aW5kb3cgPQorCQljb250YWluZXJfb2YodGJsLCBzdHJ1Y3QgaW9tbXVfd2luZG93LCB0YWJsZSk7CisKKwkvKiBpbXBsZW1lbnRpbmcgcHJvcGVyIHByb3RlY3Rpb24gY2F1c2VzIHByb2JsZW1zIHdpdGggdGhlIHNwaWRlcm5ldAorCSAqIGRyaXZlciAtIGNoZWNrIG1hcHBpbmcgZGlyZWN0aW9ucyBsYXRlciwgYnV0IGFsbG93IHJlYWQgJiB3cml0ZSBieQorCSAqIGRlZmF1bHQgZm9yIG5vdy4qLworI2lmZGVmIENFTExfSU9NTVVfU1RSSUNUX1BST1RFQ1RJT04KKwkvKiB0byBhdm9pZCByZWZlcmVuY2luZyBhIGdsb2JhbCwgd2UgdXNlIGEgdHJpY2sgaGVyZSB0byBzZXR1cCB0aGUKKwkgKiBwcm90ZWN0aW9uIGJpdC4gInByb3QiIGlzIHNldHVwIHRvIGJlIDMgZmllbGRzIG9mIDQgYml0cyBhcHByZW5kZWQKKwkgKiB0b2dldGhlciBmb3IgZWFjaCBvZiB0aGUgMyBzdXBwb3J0ZWQgZGlyZWN0aW9uIHZhbHVlcy4gSXQgaXMgdGhlbgorCSAqIHNoaWZ0ZWQgbGVmdCBzbyB0aGF0IHRoZSBmaWVsZHMgbWF0Y2hpbmcgdGhlIGRlc2lyZWQgZGlyZWN0aW9uCisJICogbGFuZHMgb24gdGhlIGFwcHJvcHJpYXRlIGJpdHMsIGFuZCBvdGhlciBiaXRzIGFyZSBtYXNrZWQgb3V0LgorCSAqLworCWNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvdCA9IDB4YzQ4OworCWJhc2VfcHRlID0KKwkJKChwcm90IDw8ICg1MiArIDQgKiBkaXJlY3Rpb24pKSAmIChJT1BURV9QUF9XIHwgSU9QVEVfUFBfUikpCisJCXwgSU9QVEVfTSB8IElPUFRFX1NPX1JXIHwgKHdpbmRvdy0+aW9pZCAmIElPUFRFX0lPSURfTWFzayk7CisjZWxzZQorCWJhc2VfcHRlID0gSU9QVEVfUFBfVyB8IElPUFRFX1BQX1IgfCBJT1BURV9NIHwgSU9QVEVfU09fUlcgfAorCQkod2luZG93LT5pb2lkICYgSU9QVEVfSU9JRF9NYXNrKTsKKyNlbmRpZgorCisJaW9fcHRlID0gKHVuc2lnbmVkIGxvbmcgKil0YmwtPml0X2Jhc2UgKyAoaW5kZXggLSB3aW5kb3ctPnB0ZV9vZmZzZXQpOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrLCB1YWRkciArPSBJT01NVV9QQUdFX1NJWkUpCisJCWlvX3B0ZVtpXSA9IGJhc2VfcHRlIHwgKF9fcGEodWFkZHIpICYgSU9QVEVfUlBOX01hc2spOworCisJbWIoKTsKKworCWludmFsaWRhdGVfdGNlX2NhY2hlKHdpbmRvdy0+aW9tbXUsIGlvX3B0ZSwgbnBhZ2VzKTsKKworCXByX2RlYnVnKCJ0Y2VfYnVpbGRfY2VsbChpbmRleD0lbHgsbj0lbHgsZGlyPSVkLGJhc2VfcHRlPSVseClcbiIsCisJCSBpbmRleCwgbnBhZ2VzLCBkaXJlY3Rpb24sIGJhc2VfcHRlKTsKK30KKworc3RhdGljIHZvaWQgdGNlX2ZyZWVfY2VsbChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgbG9uZyBucGFnZXMpCit7CisKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nICppb19wdGUsIHB0ZTsKKwlzdHJ1Y3QgaW9tbXVfd2luZG93ICp3aW5kb3cgPQorCQljb250YWluZXJfb2YodGJsLCBzdHJ1Y3QgaW9tbXVfd2luZG93LCB0YWJsZSk7CisKKwlwcl9kZWJ1ZygidGNlX2ZyZWVfY2VsbChpbmRleD0lbHgsbj0lbHgpXG4iLCBpbmRleCwgbnBhZ2VzKTsKKworI2lmZGVmIENFTExfSU9NTVVfUkVBTF9VTk1BUAorCXB0ZSA9IDA7CisjZWxzZQorCS8qIHNwaWRlciBicmlkZ2UgZG9lcyBQQ0kgcmVhZHMgYWZ0ZXIgZnJlZWluZyAtIGluc2VydCBhIG1hcHBpbmcKKwkgKiB0byBhIHNjcmF0Y2ggcGFnZSBpbnN0ZWFkIG9mIGFuIGludmFsaWQgZW50cnkgKi8KKwlwdGUgPSBJT1BURV9QUF9SIHwgSU9QVEVfTSB8IElPUFRFX1NPX1JXIHwgX19wYSh3aW5kb3ctPmlvbW11LT5wYWRfcGFnZSkKKwkJfCAod2luZG93LT5pb2lkICYgSU9QVEVfSU9JRF9NYXNrKTsKKyNlbmRpZgorCisJaW9fcHRlID0gKHVuc2lnbmVkIGxvbmcgKil0YmwtPml0X2Jhc2UgKyAoaW5kZXggLSB3aW5kb3ctPnB0ZV9vZmZzZXQpOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKQorCQlpb19wdGVbaV0gPSBwdGU7CisKKwltYigpOworCisJaW52YWxpZGF0ZV90Y2VfY2FjaGUod2luZG93LT5pb21tdSwgaW9fcHRlLCBucGFnZXMpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW9jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgc3RhdDsKKwlzdHJ1Y3QgY2JlX2lvbW11ICppb21tdSA9IGRhdGE7CisKKwlzdGF0ID0gaW5fYmU2NChpb21tdS0+eGxhdGVfcmVncyArIElPQ19JT19FeGNwU3RhdCk7CisKKwkvKiBNaWdodCB3YW50IHRvIHJhdGUgbGltaXQgaXQgKi8KKwlwcmludGsoS0VSTl9FUlIgImlvbW11OiBETUEgZXhjZXB0aW9uIDB4JTAxNmx4XG4iLCBzdGF0KTsKKwlwcmludGsoS0VSTl9FUlIgIiAgVj0lZCwgU1BGPVslYyVjXSwgUlc9JXMsIElPSUQ9MHglMDR4XG4iLAorCSAgICAgICAhIShzdGF0ICYgSU9DX0lPX0V4Y3BTdGF0X1YpLAorCSAgICAgICAoc3RhdCAmIElPQ19JT19FeGNwU3RhdF9TUEZfUykgPyAnUycgOiAnICcsCisJICAgICAgIChzdGF0ICYgSU9DX0lPX0V4Y3BTdGF0X1NQRl9QKSA/ICdQJyA6ICcgJywKKwkgICAgICAgKHN0YXQgJiBJT0NfSU9fRXhjcFN0YXRfUldfTWFzaykgPyAiUmVhZCIgOiAiV3JpdGUiLAorCSAgICAgICAodW5zaWduZWQgaW50KShzdGF0ICYgSU9DX0lPX0V4Y3BTdGF0X0lPSURfTWFzaykpOworCXByaW50ayhLRVJOX0VSUiAiICBwYWdlPTB4JTAxNmx4XG4iLAorCSAgICAgICBzdGF0ICYgSU9DX0lPX0V4Y3BTdGF0X0FERFJfTWFzayk7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwlzdGF0ICY9IH5JT0NfSU9fRXhjcFN0YXRfVjsKKwlvdXRfYmU2NChpb21tdS0+eGxhdGVfcmVncyArIElPQ19JT19FeGNwU3RhdCwgc3RhdCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgY2VsbF9pb21tdV9maW5kX2lvYyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nICpiYXNlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHJlc291cmNlIHI7CisKKwkqYmFzZSA9IDA7CisKKwkvKiBGaXJzdCBsb29rIGZvciBuZXcgc3R5bGUgL2JlIG5vZGVzICovCisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAiaW9jIikgeworCQlpZiAob2Zfbm9kZV90b19uaWQobnApICE9IG5pZCkKKwkJCWNvbnRpbnVlOworCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImlvbW11OiBjYW4ndCBnZXQgYWRkcmVzcyBmb3IgJXNcbiIsCisJCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQkqYmFzZSA9IHIuc3RhcnQ7CisJCW9mX25vZGVfcHV0KG5wKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT2ssIGxldCdzIHRyeSB0aGUgb2xkIHdheSAqLworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgImNwdSIpIHsKKwkJY29uc3QgdW5zaWduZWQgaW50ICpuaWRwOworCQljb25zdCB1bnNpZ25lZCBsb25nICp0bXA7CisKKwkJbmlkcCA9IGdldF9wcm9wZXJ0eShucCwgIm5vZGUtaWQiLCBOVUxMKTsKKwkJaWYgKG5pZHAgJiYgKm5pZHAgPT0gbmlkKSB7CisJCQl0bXAgPSBnZXRfcHJvcGVydHkobnAsICJpb2MtdHJhbnNsYXRpb24iLCBOVUxMKTsKKwkJCWlmICh0bXApIHsKKwkJCQkqYmFzZSA9ICp0bXA7CisJCQkJb2Zfbm9kZV9wdXQobnApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNlbGxfaW9tbXVfc2V0dXBfaGFyZHdhcmUoc3RydWN0IGNiZV9pb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcmV0LCBpOworCXVuc2lnbmVkIGxvbmcgcmVnLCBzZWdtZW50cywgcGFnZXNfcGVyX3NlZ21lbnQsIHB0YWJfc2l6ZSwgbl9wdGVfcGFnZXM7CisJdW5zaWduZWQgbG9uZyB4bGF0ZV9iYXNlOworCXVuc2lnbmVkIGludCB2aXJxOworCisJaWYgKGNlbGxfaW9tbXVfZmluZF9pb2MoaW9tbXUtPm5pZCwgJnhsYXRlX2Jhc2UpKQorCQlwYW5pYygiJXM6IG1pc3NpbmcgSU9DIHJlZ2lzdGVyIG1hcHBpbmdzIGZvciBub2RlICVkXG4iLAorCQkgICAgICBfX0ZVTkNUSU9OX18sIGlvbW11LT5uaWQpOworCisJaW9tbXUtPnhsYXRlX3JlZ3MgPSBpb3JlbWFwKHhsYXRlX2Jhc2UsIElPQ19SZWdfU2l6ZSk7CisJaW9tbXUtPmNtZF9yZWdzID0gaW9tbXUtPnhsYXRlX3JlZ3MgKyBJT0NfSU9DbWRfT2Zmc2V0OworCisJc2VnbWVudHMgPSBzaXplID4+IElPX1NFR01FTlRfU0hJRlQ7CisJcGFnZXNfcGVyX3NlZ21lbnQgPSAxdWxsIDw8IElPX1BBR0VOT19CSVRTOworCisJcHJfZGVidWcoIiVzOiBpb21tdVslZF06IHNlZ21lbnRzOiAlbHUsIHBhZ2VzIHBlciBzZWdtZW50OiAlbHVcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGlvbW11LT5uaWQsIHNlZ21lbnRzLCBwYWdlc19wZXJfc2VnbWVudCk7CisKKwkvKiBzZXQgdXAgdGhlIHNlZ21lbnQgdGFibGUgKi8KKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShpb21tdS0+bmlkLCBHRlBfS0VSTkVMLCAwKTsKKwlCVUdfT04oIXBhZ2UpOworCWlvbW11LT5zdGFiID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWNsZWFyX3BhZ2UoaW9tbXUtPnN0YWIpOworCisJLyogLi4uIGFuZCB0aGUgcGFnZSB0YWJsZXMuIFNpbmNlIHRoZXNlIGFyZSBjb250aWd1b3VzLCB3ZSBjYW4gdHJlYXQKKwkgKiB0aGUgcGFnZSB0YWJsZXMgYXMgb25lIGFycmF5IG9mIHB0ZXMsIGxpa2UgcFNlcmllcyBkb2VzLgorCSAqLworCXB0YWJfc2l6ZSA9IHNlZ21lbnRzICogcGFnZXNfcGVyX3NlZ21lbnQgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJcHJfZGVidWcoIiVzOiBpb21tdVslZF06IHB0YWJfc2l6ZTogJWx1LCBvcmRlcjogJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCWlvbW11LT5uaWQsIHB0YWJfc2l6ZSwgZ2V0X29yZGVyKHB0YWJfc2l6ZSkpOworCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKGlvbW11LT5uaWQsIEdGUF9LRVJORUwsIGdldF9vcmRlcihwdGFiX3NpemUpKTsKKwlCVUdfT04oIXBhZ2UpOworCisJaW9tbXUtPnB0YWIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJbWVtc2V0KGlvbW11LT5wdGFiLCAwLCBwdGFiX3NpemUpOworCisJLyogYWxsb2NhdGUgYSBib2d1cyBwYWdlIGZvciB0aGUgZW5kIG9mIGVhY2ggbWFwcGluZyAqLworCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKGlvbW11LT5uaWQsIEdGUF9LRVJORUwsIDApOworCUJVR19PTighcGFnZSk7CisJaW9tbXUtPnBhZF9wYWdlID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWNsZWFyX3BhZ2UoaW9tbXUtPnBhZF9wYWdlKTsKKworCS8qIG51bWJlciBvZiBwYWdlcyBuZWVkZWQgZm9yIGEgcGFnZSB0YWJsZSAqLworCW5fcHRlX3BhZ2VzID0gKHBhZ2VzX3Blcl9zZWdtZW50ICoKKwkJICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSkgPj4gSU9NTVVfUEFHRV9TSElGVDsKKworCXByX2RlYnVnKCIlczogaW9tbXVbJWRdOiBzdGFiIGF0ICVwLCBwdGFiIGF0ICVwLCBuX3B0ZV9wYWdlczogJWx1XG4iLAorCQkJX19GVU5DVElPTl9fLCBpb21tdS0+bmlkLCBpb21tdS0+c3RhYiwgaW9tbXUtPnB0YWIsCisJCQluX3B0ZV9wYWdlcyk7CisKKwkvKiBpbml0aWFsaXNlIHRoZSBTVEVzICovCisJcmVnID0gSU9TVEVfViB8ICgobl9wdGVfcGFnZXMgLSAxKSA8PCA1KTsKKworCWlmIChJT01NVV9QQUdFX1NJWkUgPT0gMHgxMDAwKQorCQlyZWcgfD0gSU9TVEVfUFNfNEs7CisJZWxzZSBpZiAoSU9NTVVfUEFHRV9TSVpFID09IDB4MTAwMDApCisJCXJlZyB8PSBJT1NURV9QU182NEs7CisJZWxzZSB7CisJCWV4dGVybiB2b2lkIF9fdW5rbm93bl9wYWdlX3NpemVfZXJyb3Iodm9pZCk7CisJCV9fdW5rbm93bl9wYWdlX3NpemVfZXJyb3IoKTsKKwl9CisKKwlwcl9kZWJ1ZygiU2V0dGluZyB1cCBJT01NVSBzdGFiOlxuIik7CisJZm9yIChpID0gMDsgaSAqICgxdWwgPDwgSU9fU0VHTUVOVF9TSElGVCkgPCBzaXplOyBpKyspIHsKKwkJaW9tbXUtPnN0YWJbaV0gPSByZWcgfAorCQkJKF9fcGEoaW9tbXUtPnB0YWIpICsgbl9wdGVfcGFnZXMgKiBJT01NVV9QQUdFX1NJWkUgKiBpKTsKKwkJcHJfZGVidWcoIlx0WyVkXSAweCUwMTZseFxuIiwgaSwgaW9tbXUtPnN0YWJbaV0pOworCX0KKworCS8qIGVuc3VyZSB0aGF0IHRoZSBTVEVzIGhhdmUgdXBkYXRlZCAqLworCW1iKCk7CisKKwkvKiBzZXR1cCBpbnRlcnJ1cHRzIGZvciB0aGUgaW9tbXUuICovCisJcmVnID0gaW5fYmU2NChpb21tdS0+eGxhdGVfcmVncyArIElPQ19JT19FeGNwU3RhdCk7CisJb3V0X2JlNjQoaW9tbXUtPnhsYXRlX3JlZ3MgKyBJT0NfSU9fRXhjcFN0YXQsCisJCQlyZWcgJiB+SU9DX0lPX0V4Y3BTdGF0X1YpOworCW91dF9iZTY0KGlvbW11LT54bGF0ZV9yZWdzICsgSU9DX0lPX0V4Y3BNYXNrLAorCQkJSU9DX0lPX0V4Y3BNYXNrX1BGRSB8IElPQ19JT19FeGNwTWFza19TRkUpOworCisJdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLAorCQkJSUlDX0lSUV9JT0VYX0FUSSB8IChpb21tdS0+bmlkIDw8IElJQ19JUlFfTk9ERV9TSElGVCkpOworCUJVR19PTih2aXJxID09IE5PX0lSUSk7CisKKwlyZXQgPSByZXF1ZXN0X2lycSh2aXJxLCBpb2NfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCQkJaW9tbXUtPm5hbWUsIGlvbW11KTsKKwlCVUdfT04ocmV0KTsKKworCS8qIHNldCB0aGUgSU9DIHNlZ21lbnQgdGFibGUgb3JpZ2luIHJlZ2lzdGVyIChhbmQgdHVybiBvbiB0aGUgaW9tbXUpICovCisJcmVnID0gSU9DX0lPU1RfT3JpZ2luX0UgfCBfX3BhKGlvbW11LT5zdGFiKSB8IElPQ19JT1NUX09yaWdpbl9IVzsKKwlvdXRfYmU2NChpb21tdS0+eGxhdGVfcmVncyArIElPQ19JT1NUX09yaWdpbiwgcmVnKTsKKwlpbl9iZTY0KGlvbW11LT54bGF0ZV9yZWdzICsgSU9DX0lPU1RfT3JpZ2luKTsKKworCS8qIHR1cm4gb24gSU8gdHJhbnNsYXRpb24gKi8KKwlyZWcgPSBpbl9iZTY0KGlvbW11LT5jbWRfcmVncyArIElPQ19JT0NtZF9DZmcpIHwgSU9DX0lPQ21kX0NmZ19URTsKKwlvdXRfYmU2NChpb21tdS0+Y21kX3JlZ3MgKyBJT0NfSU9DbWRfQ2ZnLCByZWcpOworfQorCisjaWYgMC8qIFVudXNlZCBmb3Igbm93ICovCitzdGF0aWMgc3RydWN0IGlvbW11X3dpbmRvdyAqZmluZF93aW5kb3coc3RydWN0IGNiZV9pb21tdSAqaW9tbXUsCisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGlvbW11X3dpbmRvdyAqd2luZG93OworCisJLyogdG9kbzogY2hlY2sgZm9yIG92ZXJsYXBwaW5nIChidXQgbm90IGVxdWFsKSB3aW5kb3dzKSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3aW5kb3csICYoaW9tbXUtPndpbmRvd3MpLCBsaXN0KSB7CisJCWlmICh3aW5kb3ctPm9mZnNldCA9PSBvZmZzZXQgJiYgd2luZG93LT5zaXplID09IHNpemUpCisJCQlyZXR1cm4gd2luZG93OworCX0KKworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfd2luZG93ICogX19pbml0CitjZWxsX2lvbW11X3NldHVwX3dpbmRvdyhzdHJ1Y3QgY2JlX2lvbW11ICppb21tdSwgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQl1bnNpZ25lZCBsb25nIHB0ZV9vZmZzZXQpCit7CisJc3RydWN0IGlvbW11X3dpbmRvdyAqd2luZG93OwogCWNvbnN0IHVuc2lnbmVkIGludCAqaW9pZDsKLQl1bnNpZ25lZCBsb25nIG1hcF9zdGFydCwgbWFwX3NpemUsIHRva2VuOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmRtYV93aW5kb3c7Ci0Jc3RydWN0IGNlbGxfaW9tbXUgKmlvbW11OwogCi0JaW9pZCA9IGdldF9wcm9wZXJ0eShkLCAiaW9pZCIsIE5VTEwpOwotCWlmICghaW9pZCkKLQkJcHJfZGVidWcoIk5vIGlvaWQgZW50cnkgZm91bmQgIVxuIik7CisJaW9pZCA9IGdldF9wcm9wZXJ0eShucCwgImlvaWQiLCBOVUxMKTsKKwlpZiAoaW9pZCA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJpb21tdTogbWlzc2luZyBpb2lkIGZvciAlcyB1c2luZyAwXG4iLAorCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CiAKLQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KGQsICJpYm0sZG1hLXdpbmRvdyIsIE5VTEwpOwotCWlmICghZG1hX3dpbmRvdykKLQkJcHJfZGVidWcoIk5vIGlibSxkbWEtd2luZG93IGVudHJ5IGZvdW5kICFcbiIpOworCXdpbmRvdyA9IGttYWxsb2Nfbm9kZShzaXplb2YoKndpbmRvdyksIEdGUF9LRVJORUwsIGlvbW11LT5uaWQpOworCUJVR19PTih3aW5kb3cgPT0gTlVMTCk7CiAKLQltYXBfc3RhcnQgPSBkbWFfd2luZG93WzFdOwotCW1hcF9zaXplID0gZG1hX3dpbmRvd1syXTsKLQl0b2tlbiA9IGRtYV93aW5kb3dbMF0gPj4gMzI7CisJd2luZG93LT5vZmZzZXQgPSBvZmZzZXQ7CisJd2luZG93LT5zaXplID0gc2l6ZTsKKwl3aW5kb3ctPmlvaWQgPSBpb2lkID8gKmlvaWQgOiAwOworCXdpbmRvdy0+aW9tbXUgPSBpb21tdTsKKwl3aW5kb3ctPnB0ZV9vZmZzZXQgPSBwdGVfb2Zmc2V0OwogCi0JaW9tbXUgPSAmY2VsbF9pb21tdXNbdG9rZW5dOworCXdpbmRvdy0+dGFibGUuaXRfYmxvY2tzaXplID0gMTY7CisJd2luZG93LT50YWJsZS5pdF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpaW9tbXUtPnB0YWI7CisJd2luZG93LT50YWJsZS5pdF9pbmRleCA9IGlvbW11LT5uaWQ7CisJd2luZG93LT50YWJsZS5pdF9vZmZzZXQgPSAob2Zmc2V0ID4+IElPTU1VX1BBR0VfU0hJRlQpICsKKwkJd2luZG93LT5wdGVfb2Zmc2V0OworCXdpbmRvdy0+dGFibGUuaXRfc2l6ZSA9IHNpemUgPj4gSU9NTVVfUEFHRV9TSElGVDsKIAotCWNlbGxfZG9fbWFwX2lvbW11KGlvbW11LCAqaW9pZCwgbWFwX3N0YXJ0LCBtYXBfc2l6ZSk7CisJaW9tbXVfaW5pdF90YWJsZSgmd2luZG93LT50YWJsZSwgaW9tbXUtPm5pZCk7CisKKwlwcl9kZWJ1ZygiXHRpb2lkICAgICAgJWRcbiIsIHdpbmRvdy0+aW9pZCk7CisJcHJfZGVidWcoIlx0YmxvY2tzaXplICVsZFxuIiwgd2luZG93LT50YWJsZS5pdF9ibG9ja3NpemUpOworCXByX2RlYnVnKCJcdGJhc2UgICAgICAweCUwMTZseFxuIiwgd2luZG93LT50YWJsZS5pdF9iYXNlKTsKKwlwcl9kZWJ1ZygiXHRvZmZzZXQgICAgMHglbHhcbiIsIHdpbmRvdy0+dGFibGUuaXRfb2Zmc2V0KTsKKwlwcl9kZWJ1ZygiXHRzaXplICAgICAgJWxkXG4iLCB3aW5kb3ctPnRhYmxlLml0X3NpemUpOworCisJbGlzdF9hZGQoJndpbmRvdy0+bGlzdCwgJmlvbW11LT53aW5kb3dzKTsKKworCWlmIChvZmZzZXQgIT0gMCkKKwkJcmV0dXJuIHdpbmRvdzsKKworCS8qIFdlIG5lZWQgdG8gbWFwIGFuZCByZXNlcnZlIHRoZSBmaXJzdCBJT01NVSBwYWdlIHNpbmNlIGl0J3MgdXNlZAorCSAqIGJ5IHRoZSBzcGlkZXIgd29ya2Fyb3VuZC4gSW4gdGhlb3J5LCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhhdCB3aGVuCisJICogcnVubmluZyBvbiBzcGlkZXIgYnV0IGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4KKwkgKgorCSAqIFRoaXMgY29kZSBhbHNvIGFzc3VtZXMgdGhhdCB3ZSBoYXZlIGEgd2luZG93IHRoYXQgc3RhcnRzIGF0IDAsCisJICogd2hpY2ggaXMgdGhlIGNhc2Ugb24gYWxsIHNwaWRlciBiYXNlZCBibGFkZXMuCisJICovCisJX19zZXRfYml0KDAsIHdpbmRvdy0+dGFibGUuaXRfbWFwKTsKKwl0Y2VfYnVpbGRfY2VsbCgmd2luZG93LT50YWJsZSwgd2luZG93LT50YWJsZS5pdF9vZmZzZXQsIDEsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylpb21tdS0+cGFkX3BhZ2UsIERNQV9UT19ERVZJQ0UpOworCXdpbmRvdy0+dGFibGUuaXRfaGludCA9IHdpbmRvdy0+dGFibGUuaXRfYmxvY2tzaXplOworCisJcmV0dXJuIHdpbmRvdzsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwKHN0cnVjdCBwY2lfYnVzICpiKQorc3RhdGljIHN0cnVjdCBjYmVfaW9tbXUgKmNlbGxfaW9tbXVfZm9yX25vZGUoaW50IG5pZCkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmQgPSAoc3RydWN0IGRldmljZV9ub2RlICopYi0+c3lzZGF0YTsKLQlpb21tdV9kZXZub2RlX3NldHVwKGQpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNiZV9ucl9pb21tdXM7IGkrKykKKwkJaWYgKGlvbW11c1tpXS5uaWQgPT0gbmlkKQorCQkJcmV0dXJuICZpb21tdXNbaV07CisJcmV0dXJuIE5VTEw7CiB9CiAKLQotc3RhdGljIGludCBjZWxsX21hcF9pb21tdV9oYXJkY29kZWQoaW50IG51bV9ub2RlcykKK3N0YXRpYyB2b2lkIGNlbGxfZG1hX2Rldl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGNlbGxfaW9tbXUgKmlvbW11ID0gTlVMTDsKKwlzdHJ1Y3QgaW9tbXVfd2luZG93ICp3aW5kb3c7CisJc3RydWN0IGNiZV9pb21tdSAqaW9tbXU7CisJc3RydWN0IGRldl9hcmNoZGF0YSAqYXJjaGRhdGEgPSAmZGV2LT5hcmNoZGF0YTsKIAotCXByX2RlYnVnKCIlcyglZCk6IFVzaW5nIGhhcmRjb2RlZCBkZWZhdWx0c1xuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJLyogSWYgd2UgcnVuIHdpdGhvdXQgaW9tbXUsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgKi8KKwlpZiAocGNpX2RtYV9vcHMgPT0gJmRtYV9kaXJlY3Rfb3BzKQorCQlyZXR1cm47CiAKLQkvKiBub2RlIDAgKi8KLQlpb21tdSA9ICZjZWxsX2lvbW11c1swXTsKLQlpb21tdS0+bWFwcGVkX2Jhc2UgPSBpb3JlbWFwKDB4MjAwMDA1MTEwMDB1bCwgMHgxMDAwKTsKLQlpb21tdS0+bWFwcGVkX21taW9fYmFzZSA9IGlvcmVtYXAoMHgyMDAwMDUxMDAwMHVsLCAweDEwMDApOworCS8qIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgZmlyc3Qgd2luZG93IGF2YWlsYWJsZSBpbiB0aGF0CisJICogbm9kZSdzIGlvbW11LiBXZSAtbWlnaHQtIGRvIHNvbWV0aGluZyBzbWFydGVyIGxhdGVyIHRob3VnaCBpdCBtYXkKKwkgKiBuZXZlciBiZSBuZWNlc3NhcnkKKwkgKi8KKwlpb21tdSA9IGNlbGxfaW9tbXVfZm9yX25vZGUoYXJjaGRhdGEtPm51bWFfbm9kZSk7CisJaWYgKGlvbW11ID09IE5VTEwgfHwgbGlzdF9lbXB0eSgmaW9tbXUtPndpbmRvd3MpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW9tbXU6IG1pc3NpbmcgaW9tbXUgZm9yICVzIChub2RlICVkKVxuIiwKKwkJICAgICAgIGFyY2hkYXRhLT5vZl9ub2RlID8gYXJjaGRhdGEtPm9mX25vZGUtPmZ1bGxfbmFtZSA6ICI/IiwKKwkJICAgICAgIGFyY2hkYXRhLT5udW1hX25vZGUpOworCQlyZXR1cm47CisJfQorCXdpbmRvdyA9IGxpc3RfZW50cnkoaW9tbXUtPndpbmRvd3MubmV4dCwgc3RydWN0IGlvbW11X3dpbmRvdywgbGlzdCk7CiAKLQllbmFibGVfbWFwcGluZyhpb21tdS0+bWFwcGVkX2Jhc2UsIGlvbW11LT5tYXBwZWRfbW1pb19iYXNlKTsKKwlhcmNoZGF0YS0+ZG1hX2RhdGEgPSAmd2luZG93LT50YWJsZTsKK30KIAotCWNlbGxfZG9fbWFwX2lvbW11KGlvbW11LCAweDA0OGEsCi0JCQkgIDB4MjAwMDAwMDB1bCwweDIwMDAwMDAwdWwpOworc3RhdGljIHZvaWQgY2VsbF9wY2lfZG1hX2Rldl9zZXR1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWNlbGxfZG1hX2Rldl9zZXR1cCgmZGV2LT5kZXYpOworfQogCi0JaWYgKG51bV9ub2RlcyA8IDIpCitzdGF0aWMgaW50IGNlbGxfb2ZfYnVzX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKKwkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKworCS8qIFdlIGFyZSBvbmx5IGludGVyZXRlZCBpbiBkZXZpY2UgYWRkaXRpb24gKi8KKwlpZiAoYWN0aW9uICE9IEJVU19OT1RJRllfQUREX0RFVklDRSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBub2RlIDEgKi8KLQlpb21tdSA9ICZjZWxsX2lvbW11c1sxXTsKLQlpb21tdS0+bWFwcGVkX2Jhc2UgPSBpb3JlbWFwKDB4MzAwMDA1MTEwMDB1bCwgMHgxMDAwKTsKLQlpb21tdS0+bWFwcGVkX21taW9fYmFzZSA9IGlvcmVtYXAoMHgzMDAwMDUxMDAwMHVsLCAweDEwMDApOworCS8qIFdlIHVzZSB0aGUgUENJIERNQSBvcHMgKi8KKwlkZXYtPmFyY2hkYXRhLmRtYV9vcHMgPSBwY2lfZG1hX29wczsKIAotCWVuYWJsZV9tYXBwaW5nKGlvbW11LT5tYXBwZWRfYmFzZSwgaW9tbXUtPm1hcHBlZF9tbWlvX2Jhc2UpOwotCi0JY2VsbF9kb19tYXBfaW9tbXUoaW9tbXUsIDB4MDQ4YSwKLQkJCSAgMHgyMDAwMDAwMCwweDIwMDAwMDAwdWwpOworCWNlbGxfZG1hX2Rldl9zZXR1cChkZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBjZWxsX21hcF9pb21tdSh2b2lkKQotewotCXVuc2lnbmVkIGludCBudW1fbm9kZXMgPSAwOwotCWNvbnN0IHVuc2lnbmVkIGludCAqbm9kZV9pZDsKLQljb25zdCB1bnNpZ25lZCBsb25nICpiYXNlLCAqbW1pb19iYXNlOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jc3RydWN0IGNlbGxfaW9tbXUgKmlvbW11ID0gTlVMTDsKLQotCS8qIGRldGVybWluZSBudW1iZXIgb2Ygbm9kZXMgKD1pb21tdXMpICovCi0JcHJfZGVidWcoIiVzKCVkKTogZGV0ZXJtaW5pbmcgbnVtYmVyIG9mIG5vZGVzLi4uIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0JZm9yKGRuID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOwotCSAgICBkbjsKLQkgICAgZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShkbiwgImNwdSIpKSB7Ci0JCW5vZGVfaWQgPSBnZXRfcHJvcGVydHkoZG4sICJub2RlLWlkIiwgTlVMTCk7Ci0KLQkJaWYgKG51bV9ub2RlcyA8ICpub2RlX2lkKQotCQkJbnVtX25vZGVzID0gKm5vZGVfaWQ7Ci0JCX0KLQotCW51bV9ub2RlcysrOwotCXByX2RlYnVnKCIlaSBmb3VuZC5cbiIsIG51bV9ub2Rlcyk7Ci0KLQkvKiBtYXAgdGhlIGlvbW11IHJlZ2lzdGVycyBmb3IgZWFjaCBub2RlICovCi0JcHJfZGVidWcoIiVzKCVkKTogTG9vcGluZyB0aHJvdWdoIG5vZGVzXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQlmb3IoZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7Ci0JICAgIGRuOwotCSAgICBkbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKGRuLCAiY3B1IikpIHsKLQotCQlub2RlX2lkID0gZ2V0X3Byb3BlcnR5KGRuLCAibm9kZS1pZCIsIE5VTEwpOwotCQliYXNlID0gZ2V0X3Byb3BlcnR5KGRuLCAiaW9jLWNhY2hlIiwgTlVMTCk7Ci0JCW1taW9fYmFzZSA9IGdldF9wcm9wZXJ0eShkbiwgImlvYy10cmFuc2xhdGlvbiIsIE5VTEwpOwotCi0JCWlmICghYmFzZSB8fCAhbW1pb19iYXNlIHx8ICFub2RlX2lkKQotCQkJcmV0dXJuIGNlbGxfbWFwX2lvbW11X2hhcmRjb2RlZChudW1fbm9kZXMpOwotCi0JCWlvbW11ID0gJmNlbGxfaW9tbXVzWypub2RlX2lkXTsKLQkJaW9tbXUtPmJhc2UgPSAqYmFzZTsKLQkJaW9tbXUtPm1taW9fYmFzZSA9ICptbWlvX2Jhc2U7Ci0KLQkJaW9tbXUtPm1hcHBlZF9iYXNlID0gaW9yZW1hcCgqYmFzZSwgMHgxMDAwKTsKLQkJaW9tbXUtPm1hcHBlZF9tbWlvX2Jhc2UgPSBpb3JlbWFwKCptbWlvX2Jhc2UsIDB4MTAwMCk7Ci0KLQkJZW5hYmxlX21hcHBpbmcoaW9tbXUtPm1hcHBlZF9iYXNlLAotCQkJICAgICAgIGlvbW11LT5tYXBwZWRfbW1pb19iYXNlKTsKLQotCQkvKiBldmVyeXRoaW5nIGVsc2Ugd2lsbCBiZSBkb25lIGluIGlvbW11X2J1c19zZXR1cCAqLwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCAqY2VsbF9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQotewotCXZvaWQgKnJldDsKLQotCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFnLCBnZXRfb3JkZXIoc2l6ZSkpOwotCWlmIChyZXQgIT0gTlVMTCkgewotCQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2FicyhyZXQpIHwgQ0VMTF9ETUFfVkFMSUQ7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNlbGxfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKLX0KLQotc3RhdGljIGRtYV9hZGRyX3QgY2VsbF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0JcmV0dXJuIHZpcnRfdG9fYWJzKHB0cikgfCBDRUxMX0RNQV9WQUxJRDsKLX0KLQotc3RhdGljIHZvaWQgY2VsbF91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci19Ci0KLXN0YXRpYyBpbnQgY2VsbF9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyssIHNnKyspIHsKLQkJc2ctPmRtYV9hZGRyZXNzID0gKHBhZ2VfdG9fcGh5cyhzZy0+cGFnZSkgKyBzZy0+b2Zmc2V0KQotCQkJCQl8IENFTExfRE1BX1ZBTElEOwotCQlzZy0+ZG1hX2xlbmd0aCA9IHNnLT5sZW5ndGg7Ci0JfQotCi0JcmV0dXJuIG5lbnRzOwotfQotCi1zdGF0aWMgdm9pZCBjZWxsX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLX0KLQotc3RhdGljIGludCBjZWxsX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKLXsKLQlyZXR1cm4gbWFzayA8IDB4MTAwMDAwMDAwdWxsOwotfQotCi1zdGF0aWMgc3RydWN0IGRtYV9tYXBwaW5nX29wcyBjZWxsX2lvbW11X29wcyA9IHsKLQkuYWxsb2NfY29oZXJlbnQgPSBjZWxsX2FsbG9jX2NvaGVyZW50LAotCS5mcmVlX2NvaGVyZW50ID0gY2VsbF9mcmVlX2NvaGVyZW50LAotCS5tYXBfc2luZ2xlID0gY2VsbF9tYXBfc2luZ2xlLAotCS51bm1hcF9zaW5nbGUgPSBjZWxsX3VubWFwX3NpbmdsZSwKLQkubWFwX3NnID0gY2VsbF9tYXBfc2csCi0JLnVubWFwX3NnID0gY2VsbF91bm1hcF9zZywKLQkuZG1hX3N1cHBvcnRlZCA9IGNlbGxfZG1hX3N1cHBvcnRlZCwKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY2VsbF9vZl9idXNfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjZWxsX29mX2J1c19ub3RpZnkKIH07CiAKLXZvaWQgY2VsbF9pbml0X2lvbW11KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBjZWxsX2lvbW11X2dldF93aW5kb3coc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisJCQkJCSB1bnNpZ25lZCBsb25nICpzaXplKQogewotCWludCBzZXR1cF9idXMgPSAwOworCWNvbnN0IHZvaWQgKmRtYV93aW5kb3c7CisJdW5zaWduZWQgbG9uZyBpbmRleDsKIAotCWlmIChvZl9maW5kX25vZGVfYnlfcGF0aCgiL21hbWJvIikpIHsKLQkJcHJfaW5mbygiTm90IHVzaW5nIGlvbW11IG9uIHN5c3RlbXNpbVxuIik7Ci0JfSBlbHNlIHsKLQotCQlpZiAoIShvZl9jaG9zZW4gJiYKLQkJICAgICAgZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGlvbW11LW9mZiIsIE5VTEwpKSkKLQkJCXNldHVwX2J1cyA9IGNlbGxfbWFwX2lvbW11KCk7Ci0KLQkJaWYgKHNldHVwX2J1cykgewotCQkJcHJfZGVidWcoIiVzOiBJT01NVSBtYXBwaW5nIGFjdGl2YXRlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfbnVsbDsKLQkJCXBwY19tZC5pb21tdV9idXNfc2V0dXAgPSBpb21tdV9idXNfc2V0dXA7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IElPTU1VIG1hcHBpbmcgYWN0aXZhdGVkLCAiCi0JCQkJICJubyBkZXZpY2UgYWN0aW9uIG5lY2Vzc2FyeVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCS8qIERpcmVjdCBJL08sIElPTU1VIG9mZiAqLwotCQkJcHBjX21kLmlvbW11X2Rldl9zZXR1cCA9IGlvbW11X2Rldl9zZXR1cF9udWxsOwotCQkJcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOwotCQl9CisJLyogVXNlIGlibSxkbWEtd2luZG93IGlmIGF2YWlsYWJsZSwgZWxzZSwgaGFyZCBjb2RlICEgKi8KKwlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKKwlpZiAoZG1hX3dpbmRvdyA9PSBOVUxMKSB7CisJCSpiYXNlID0gMDsKKwkJKnNpemUgPSAweDgwMDAwMDAwdTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcGNpX2RtYV9vcHMgPSBjZWxsX2lvbW11X29wczsKKwlvZl9wYXJzZV9kbWFfd2luZG93KG5wLCBkbWFfd2luZG93LCAmaW5kZXgsIGJhc2UsIHNpemUpOworCXJldHVybiAwOwogfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY2VsbF9pb21tdV9pbml0X29uZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgY2JlX2lvbW11ICppb21tdTsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIHNpemU7CisJaW50IG5pZCwgaTsKKworCS8qIEdldCBub2RlIElEICovCisJbmlkID0gb2Zfbm9kZV90b19uaWQobnApOworCWlmIChuaWQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW9tbXU6IGZhaWxlZCB0byBnZXQgbm9kZSBmb3IgJXNcbiIsCisJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlwcl9kZWJ1ZygiaW9tbXU6IHNldHRpbmcgdXAgaW9tbXUgZm9yIG5vZGUgJWQgKCVzKVxuIiwKKwkJIG5pZCwgbnAtPmZ1bGxfbmFtZSk7CisKKwkvKiBYWFggdG9kbzogSWYgd2UgY2FuIGhhdmUgbXVsdGlwbGUgd2luZG93cyBvbiB0aGUgc2FtZSBJT01NVSwgd2hpY2gKKwkgKiBpc24ndCB0aGUgY2FzZSB0b2RheSwgd2UgcHJvYmFibHkgd2FudCBoZXJlIHRvIGNoZWNrIHdldGhlciB0aGUKKwkgKiBpb21tdSBmb3IgdGhhdCBub2RlIGlzIGFscmVhZHkgc2V0dXAuCisJICogSG93ZXZlciwgdGhlcmUgbWlnaHQgYmUgaXNzdWUgd2l0aCBnZXR0aW5nIHRoZSBzaXplIHJpZ2h0IHNvIGxldCdzCisJICogaWdub3JlIHRoYXQgZm9yIG5vdy4gV2UgbWlnaHQgd2FudCB0byBjb21wbGV0ZWx5IGdldCByaWQgb2YgdGhlCisJICogbXVsdGlwbGUgd2luZG93IHN1cHBvcnQgc2luY2UgdGhlIGNlbGwgaW9tbXUgc3VwcG9ydHMgcGVyLXBhZ2UgaW9pZHMKKwkgKi8KKworCWlmIChjYmVfbnJfaW9tbXVzID49IE5SX0lPTU1VUykgeworCQlwcmludGsoS0VSTl9FUlIgImlvbW11OiB0b28gbWFueSBJT01NVXMgZGV0ZWN0ZWQgISAoJXMpXG4iLAorCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJbml0IGJhc2UgZmllbGRzICovCisJaSA9IGNiZV9ucl9pb21tdXMrKzsKKwlpb21tdSA9ICZpb21tdXNbaV07CisJaW9tbXUtPnN0YWIgPSAwOworCWlvbW11LT5uaWQgPSBuaWQ7CisJc25wcmludGYoaW9tbXUtPm5hbWUsIHNpemVvZihpb21tdS0+bmFtZSksICJpb21tdSVkIiwgaSk7CisJSU5JVF9MSVNUX0hFQUQoJmlvbW11LT53aW5kb3dzKTsKKworCS8qIE9idGFpbiBhIHdpbmRvdyBmb3IgaXQgKi8KKwljZWxsX2lvbW11X2dldF93aW5kb3cobnAsICZiYXNlLCAmc2l6ZSk7CisKKwlwcl9kZWJ1ZygiXHR0cmFuc2xhdGluZyB3aW5kb3cgMHglbHguLi4weCVseFxuIiwKKwkJIGJhc2UsIGJhc2UgKyBzaXplIC0gMSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSAqLworCWNlbGxfaW9tbXVfc2V0dXBfaGFyZHdhcmUoaW9tbXUsIHNpemUpOworCisJLyogU2V0dXAgdGhlIGlvbW11X3RhYmxlICovCisJY2VsbF9pb21tdV9zZXR1cF93aW5kb3coaW9tbXUsIG5wLCBiYXNlLCBzaXplLAorCQkJCW9mZnNldCA+PiBJT01NVV9QQUdFX1NISUZUKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNlbGxfZGlzYWJsZV9pb21tdXModm9pZCkKK3sKKwlpbnQgbm9kZTsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIHZhbDsKKwl2b2lkIF9faW9tZW0gKnhyZWdzLCAqY3JlZ3M7CisKKwkvKiBNYWtlIHN1cmUgSU9DIHRyYW5zbGF0aW9uIGlzIGRpc2FibGVkIG9uIGFsbCBub2RlcyAqLworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJaWYgKGNlbGxfaW9tbXVfZmluZF9pb2Mobm9kZSwgJmJhc2UpKQorCQkJY29udGludWU7CisJCXhyZWdzID0gaW9yZW1hcChiYXNlLCBJT0NfUmVnX1NpemUpOworCQlpZiAoeHJlZ3MgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQljcmVncyA9IHhyZWdzICsgSU9DX0lPQ21kX09mZnNldDsKKworCQlwcl9kZWJ1ZygiaW9tbXU6IGNsZWFuaW5nIHVwIGlvbW11IG9uIG5vZGUgJWRcbiIsIG5vZGUpOworCisJCW91dF9iZTY0KHhyZWdzICsgSU9DX0lPU1RfT3JpZ2luLCAwKTsKKwkJKHZvaWQpaW5fYmU2NCh4cmVncyArIElPQ19JT1NUX09yaWdpbik7CisJCXZhbCA9IGluX2JlNjQoY3JlZ3MgKyBJT0NfSU9DbWRfQ2ZnKTsKKwkJdmFsICY9IH5JT0NfSU9DbWRfQ2ZnX1RFOworCQlvdXRfYmU2NChjcmVncyArIElPQ19JT0NtZF9DZmcsIHZhbCk7CisJCSh2b2lkKWluX2JlNjQoY3JlZ3MgKyBJT0NfSU9DbWRfQ2ZnKTsKKworCQlpb3VubWFwKHhyZWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNlbGxfaW9tbXVfaW5pdF9kaXNhYmxlZCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IDAsIHNpemU7CisKKwkvKiBXaGVuIG5vIGlvbW11IGlzIHByZXNlbnQsIHdlIHVzZSBkaXJlY3QgRE1BIG9wcyAqLworCXBjaV9kbWFfb3BzID0gJmRtYV9kaXJlY3Rfb3BzOworCisJLyogRmlyc3QgbWFrZSBzdXJlIGFsbCBJT0MgdHJhbnNsYXRpb24gaXMgdHVybmVkIG9mZiAqLworCWNlbGxfZGlzYWJsZV9pb21tdXMoKTsKKworCS8qIElmIHdlIGhhdmUgbm8gQXhvbiwgd2Ugc2V0IHVwIHRoZSBzcGlkZXIgRE1BIG1hZ2ljIG9mZnNldCAqLworCWlmIChvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYXhvbiIpID09IE5VTEwpCisJCWRtYV9kaXJlY3Rfb2Zmc2V0ID0gU1BJREVSX0RNQV9PRkZTRVQ7CisKKwkvKiBOb3cgd2UgbmVlZCB0byBjaGVjayB0byBzZWUgd2hlcmUgdGhlIG1lbW9yeSBpcyBtYXBwZWQKKwkgKiBpbiBQQ0kgc3BhY2UuIFdlIGFzc3VtZSB0aGF0IGFsbCBidXNzZXMgdXNlIHRoZSBzYW1lIGRtYQorCSAqIHdpbmRvdyB3aGljaCBpcyBhbHdheXMgdGhlIGNhc2Ugc28gZmFyIG9uIENlbGwsIHRodXMgd2UKKwkgKiBwaWNrIHVwIHRoZSBmaXJzdCBwY2ktaW50ZXJuYWwgbm9kZSB3ZSBjYW4gZmluZCBhbmQgY2hlY2sKKwkgKiB0aGUgRE1BIHdpbmRvdyBmcm9tIHRoZXJlLgorCSAqLworCWZvcl9lYWNoX25vZGVfYnlfbmFtZShucCwgImF4b24iKSB7CisJCWlmIChucC0+cGFyZW50ID09IE5VTEwgfHwgbnAtPnBhcmVudC0+cGFyZW50ICE9IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKGNlbGxfaW9tbXVfZ2V0X3dpbmRvdyhucCwgJmJhc2UsICZzaXplKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChucCA9PSBOVUxMKSB7CisJCWZvcl9lYWNoX25vZGVfYnlfbmFtZShucCwgInBjaS1pbnRlcm5hbCIpIHsKKwkJCWlmIChucC0+cGFyZW50ID09IE5VTEwgfHwgbnAtPnBhcmVudC0+cGFyZW50ICE9IE5VTEwpCisJCQkJY29udGludWU7CisJCQlpZiAoY2VsbF9pb21tdV9nZXRfd2luZG93KG5wLCAmYmFzZSwgJnNpemUpID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJb2Zfbm9kZV9wdXQobnApOworCisJLyogSWYgd2UgZm91bmQgYSBETUEgd2luZG93LCB3ZSBjaGVjayBpZiBpdCdzIGJpZyBlbm91Z2ggdG8gZW5jbG9zZQorCSAqIGFsbCBvZiBwaHlzaWNhbCBtZW1vcnkuIElmIG5vdCwgd2UgZm9yY2UgZW5hYmxlIElPTU1VCisJICovCisJaWYgKG5wICYmIHNpemUgPCBsbWJfZW5kX29mX0RSQU0oKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpb21tdTogZm9yY2UtZW5hYmxlZCwgZG1hIHdpbmRvdyIKKwkJICAgICAgICIgKCVsZE1CKSBzbWFsbGVyIHRoYW4gdG90YWwgbWVtb3J5ICglbGRNQilcbiIsCisJCSAgICAgICBzaXplID4+IDIwLCBsbWJfZW5kX29mX0RSQU0oKSA+PiAyMCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRtYV9kaXJlY3Rfb2Zmc2V0ICs9IGJhc2U7CisKKwlwcmludGsoImlvbW11OiBkaXNhYmxlZCwgZGlyZWN0IERNQSBvZmZzZXQgaXMgMHglbHhcbiIsCisJICAgICAgIGRtYV9kaXJlY3Rfb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjZWxsX2lvbW11X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJaWYgKCFtYWNoaW5lX2lzKGNlbGwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIElmIElPTU1VIGlzIGRpc2FibGVkIG9yIHdlIGhhdmUgbGl0dGxlIGVub3VnaCBSQU0gdG8gbm90IG5lZWQKKwkgKiB0byBlbmFibGUgaXQsIHdlIHNldHVwIGEgZGlyZWN0IG1hcHBpbmcuCisJICoKKwkgKiBOb3RlOiBzaG91bGQgd2UgbWFrZSBzdXJlIHdlIGhhdmUgdGhlIElPTU1VIGFjdHVhbGx5IGRpc2FibGVkID8KKwkgKi8KKwlpZiAoaW9tbXVfaXNfb2ZmIHx8CisJICAgICghaW9tbXVfZm9yY2Vfb24gJiYgbG1iX2VuZF9vZl9EUkFNKCkgPD0gMHg4MDAwMDAwMHVsbCkpCisJCWlmIChjZWxsX2lvbW11X2luaXRfZGlzYWJsZWQoKSA9PSAwKQorCQkJZ290byBiYWlsOworCisJLyogU2V0dXAgdmFyaW91cyBwcGNfbWQuIGNhbGxiYWNrcyAqLworCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IGNlbGxfcGNpX2RtYV9kZXZfc2V0dXA7CisJcHBjX21kLnRjZV9idWlsZCA9IHRjZV9idWlsZF9jZWxsOworCXBwY19tZC50Y2VfZnJlZSA9IHRjZV9mcmVlX2NlbGw7CisKKwkvKiBDcmVhdGUgYW4gaW9tbXUgZm9yIGVhY2ggL2F4b24gbm9kZS4gICovCisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAiYXhvbiIpIHsKKwkJaWYgKG5wLT5wYXJlbnQgPT0gTlVMTCB8fCBucC0+cGFyZW50LT5wYXJlbnQgIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQljZWxsX2lvbW11X2luaXRfb25lKG5wLCAwKTsKKwl9CisKKwkvKiBDcmVhdGUgYW4gaW9tbXUgZm9yIGVhY2ggdG9wbGV2ZWwgL3BjaS1pbnRlcm5hbCBub2RlIGZvcgorCSAqIG9sZCBoYXJkd2FyZS9maXJtd2FyZQorCSAqLworCWZvcl9lYWNoX25vZGVfYnlfbmFtZShucCwgInBjaS1pbnRlcm5hbCIpIHsKKwkJaWYgKG5wLT5wYXJlbnQgPT0gTlVMTCB8fCBucC0+cGFyZW50LT5wYXJlbnQgIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQljZWxsX2lvbW11X2luaXRfb25lKG5wLCBTUElERVJfRE1BX09GRlNFVCk7CisJfQorCisJLyogU2V0dXAgZGVmYXVsdCBQQ0kgaW9tbXUgb3BzICovCisJcGNpX2RtYV9vcHMgPSAmZG1hX2lvbW11X29wczsKKworIGJhaWw6CisJLyogUmVnaXN0ZXIgY2FsbGJhY2tzIG9uIE9GIHBsYXRmb3JtIGRldmljZSBhZGRpdGlvbi9yZW1vdmFsCisJICogdG8gaGFuZGxlIGxpbmtpbmcgdGhlbSB0byB0aGUgcmlnaHQgRE1BIG9wZXJhdGlvbnMKKwkgKi8KKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJm9mX3BsYXRmb3JtX2J1c190eXBlLCAmY2VsbF9vZl9idXNfbm90aWZpZXIpOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGNlbGxfaW9tbXVfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MGQ3N2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jaWZuZGVmIENFTExfSU9NTVVfSAotI2RlZmluZSBDRUxMX0lPTU1VX0gKLQotLyogc29tZSBjb25zdGFudHMgKi8KLWVudW0gewotCS8qIHNlZ21lbnQgdGFibGUgZW50cmllcyAqLwotCUlPU1RfVkFMSURfTUFTSwkgID0gMHg4MDAwMDAwMDAwMDAwMDAwdWwsCi0JSU9TVF9UQUdfTUFTSyAgICAgPSAweDMwMDAwMDAwMDAwMDAwMDB1bCwKLQlJT1NUX1BUX0JBU0VfTUFTSyA9IDB4MDAwMDAzZmZmZmZmZjAwMHVsLAotCUlPU1RfTk5QVF9NQVNLCSAgPSAweDAwMDAwMDAwMDAwMDBmZTB1bCwKLQlJT1NUX1BTX01BU0sJICA9IDB4MDAwMDAwMDAwMDAwMDAwZnVsLAotCi0JSU9TVF9QU180SwkgID0gMHgxLAotCUlPU1RfUFNfNjRLCSAgPSAweDMsCi0JSU9TVF9QU18xTQkgID0gMHg1LAotCUlPU1RfUFNfMTZNCSAgPSAweDcsCi0KLQkvKiBpb3B0IHRhZyByZWdpc3RlciAqLwotCUlPUFRfVkFMSURfTUFTSyAgID0gMHgwMDAwMDAwMjAwMDAwMDAwdWwsCi0JSU9QVF9UQUdfTUFTSwkgID0gMHgwMDAwMDAwMWZmZmZmZmZmdWwsCi0KLQkvKiBpb3B0IGNhY2hlIHJlZ2lzdGVyICovCi0JSU9QVF9QUk9UX01BU0sJICA9IDB4YzAwMDAwMDAwMDAwMDAwMHVsLAotCUlPUFRfUFJPVF9OT05FCSAgPSAweDAwMDAwMDAwMDAwMDAwMDB1bCwKLQlJT1BUX1BST1RfUkVBRAkgID0gMHg0MDAwMDAwMDAwMDAwMDAwdWwsCi0JSU9QVF9QUk9UX1dSSVRFCSAgPSAweDgwMDAwMDAwMDAwMDAwMDB1bCwKLQlJT1BUX1BST1RfUlcJICA9IDB4YzAwMDAwMDAwMDAwMDAwMHVsLAotCUlPUFRfQ09IRVJFTlQJICA9IDB4MjAwMDAwMDAwMDAwMDAwMHVsLAotCQotCUlPUFRfT1JERVJfTUFTSwkgID0gMHgxODAwMDAwMDAwMDAwMDAwdWwsCi0JLyogb3JkZXIgYWNjZXNzIHRvIHNhbWUgSU9JRC9WQyBvbiBzYW1lIGFkZHJlc3MgKi8KLQlJT1BUX09SREVSX0FERFIJICA9IDB4MDgwMDAwMDAwMDAwMDAwMHVsLAotCS8qIHNpbWlsYXIsIGJ1dCBvbmx5IGFmdGVyIGEgd3JpdGUgYWNjZXNzICovCi0JSU9QVF9PUkRFUl9XUklURVMgPSAweDEwMDAwMDAwMDAwMDAwMDB1bCwKLQkvKiBPcmRlciBhbGwgYWNjZXNzZXMgdG8gc2FtZSBJT0lEL1ZDICovCi0JSU9QVF9PUkRFUl9WQwkgID0gMHgxODAwMDAwMDAwMDAwMDAwdWwsCi0JCi0JSU9QVF9SUE5fTUFTSwkgID0gMHgwMDAwMDNmZmZmZmZmMDAwdWwsCi0JSU9QVF9ISU5UX01BU0sJICA9IDB4MDAwMDAwMDAwMDAwMDgwMHVsLAotCUlPUFRfSU9JRF9NQVNLCSAgPSAweDAwMDAwMDAwMDAwMDA3ZmZ1bCwKLQotCUlPU1RPX0VOQUJMRQkgID0gMHg4MDAwMDAwMDAwMDAwMDAwdWwsCi0JSU9TVE9fT1JJR0lOCSAgPSAweDAwMDAwM2ZmZmZmZmYwMDB1bCwKLQlJT1NUT19IVwkgID0gMHgwMDAwMDAwMDAwMDAwODAwdWwsCi0JSU9TVE9fU1cJICA9IDB4MDAwMDAwMDAwMDAwMDQwMHVsLAotCi0JSU9DTURfQ09ORl9URQkgID0gMHgwMDAwODAwMDAwMDAwMDAwdWwsCi0KLQkvKiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLwotCUlPQ19QVF9DQUNIRV9ESVIgID0gMHgwMDAsCi0JSU9DX1NUX0NBQ0hFX0RJUiAgPSAweDgwMCwKLQlJT0NfUFRfQ0FDSEVfUkVHICA9IDB4OTEwLAotCUlPQ19TVF9PUklHSU4gICAgID0gMHg5MTgsCi0JSU9DX0NPTkYJICA9IDB4OTMwLAotCi0JLyogVGhlIGhpZ2ggYml0IG5lZWRzIHRvIGJlIHNldCBvbiBldmVyeSBETUEgYWRkcmVzcywKLQkgICBvbmx5IDJHQiBhcmUgYWRkcmVzc2FibGUgKi8KLQlDRUxMX0RNQV9WQUxJRAkgID0gMHg4MDAwMDAwMCwKLQlDRUxMX0RNQV9NQVNLCSAgPSAweDdmZmZmZmZmLAotfTsKLQotCi12b2lkIGNlbGxfaW5pdF9pb21tdSh2b2lkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmMKaW5kZXggOWYyZTRlZC4uOGMyMGYwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BlcnZhc2l2ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYwpAQCAtMzgsMzIgKzM4LDI1IEBACiAjaW5jbHVkZSAicGVydmFzaXZlLmgiCiAjaW5jbHVkZSAiY2JlX3JlZ3MuaCIKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhjYmVfcGVydmFzaXZlX2xvY2spOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgY2JlX2VuYWJsZV9wYXVzZV96ZXJvKHZvaWQpCitzdGF0aWMgdm9pZCBjYmVfcG93ZXJfc2F2ZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdGhyZWFkX3N3aXRjaF9jb250cm9sOwotCXVuc2lnbmVkIGxvbmcgdGVtcF9yZWdpc3RlcjsKLQlzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnByZWdzOworCXVuc2lnbmVkIGxvbmcgY3RybCwgdGhyZWFkX3N3aXRjaF9jb250cm9sOwogCi0Jc3Bpbl9sb2NrX2lycSgmY2JlX3BlcnZhc2l2ZV9sb2NrKTsKLQlwcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JaWYgKHByZWdzID09IE5VTEwpCi0JCWdvdG8gb3V0OworCS8qCisJICogV2UgbmVlZCB0byBoYXJkIGRpc2FibGUgaW50ZXJydXB0cywgYnV0IHdlIGFsc28gbmVlZCB0byBtYXJrIHRoZW0KKwkgKiBoYXJkIGRpc2FibGVkIGluIHRoZSBQQUNBIHNvIHRoYXQgdGhlIGxvY2FsX2lycV9lbmFibGUoKSBkb25lIGJ5CisJICogb3VyIGNhbGxlciB1cG9uIHJldHVybiBwcm9wZXJ0bHkgaGFyZCBlbmFibGVzLgorCSAqLworCWhhcmRfaXJxX2Rpc2FibGUoKTsKKwlnZXRfcGFjYSgpLT5oYXJkX2VuYWJsZWQgPSAwOwogCi0JcHJfZGVidWcoIlBvd2VyIE1hbmFnZW1lbnQ6IENQVSAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQotCSAvKiBFbmFibGUgUGF1c2UoMCkgY29udHJvbCBiaXQgKi8KLQl0ZW1wX3JlZ2lzdGVyID0gaW5fYmU2NCgmcHJlZ3MtPnBtX2NvbnRyb2wpOwotCi0Jb3V0X2JlNjQoJnByZWdzLT5wbV9jb250cm9sLAotCQkgdGVtcF9yZWdpc3RlciB8IENCRV9QTURfUEFVU0VfWkVST19DT05UUk9MKTsKKwljdHJsID0gbWZzcHIoU1BSTl9DVFJMRik7CiAKIAkvKiBFbmFibGUgREVDIGFuZCBFRSBpbnRlcnJ1cHQgcmVxdWVzdCAqLwogCXRocmVhZF9zd2l0Y2hfY29udHJvbCAgPSBtZnNwcihTUFJOX1RTQ19DRUxMKTsKIAl0aHJlYWRfc3dpdGNoX2NvbnRyb2wgfD0gVFNDX0NFTExfRUVfRU5BQkxFIHwgVFNDX0NFTExfRUVfQk9PU1Q7CiAKLQlzd2l0Y2ggKChtZnNwcihTUFJOX0NUUkxGKSAmIENUUkxfQ1QpKSB7CisJc3dpdGNoIChjdHJsICYgQ1RSTF9DVCkgewogCWNhc2UgQ1RSTF9DVDA6CiAJCXRocmVhZF9zd2l0Y2hfY29udHJvbCB8PSBUU0NfQ0VMTF9ERUNfRU5BQkxFXzA7CiAJCWJyZWFrOwpAQCAtNzUsNTggKzY4LDIxIEBACiAJCQlfX0ZVTkNUSU9OX18pOwogCQlicmVhazsKIAl9Ci0KIAltdHNwcihTUFJOX1RTQ19DRUxMLCB0aHJlYWRfc3dpdGNoX2NvbnRyb2wpOwogCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjYmVfcGVydmFzaXZlX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBjYmVfaWRsZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgY3RybDsKLQotCS8qIFdoeSBkbyB3ZSBkbyB0aGF0IG9uIGV2ZXJ5IGlkbGUgPyBDb3VsZG4ndCB0aGF0IGJlIGRvbmUgb25jZSBmb3IKLQkgKiBhbGwgb3IgZG8gd2UgbG9zZSB0aGUgc3RhdGUgc29tZSB3YXkgPyBBbHNvLCB0aGUgcG1fY29udHJvbAotCSAqIHJlZ2lzdGVyIHNldHRpbmcsIHRoYXQgY2FuJ3QgYmUgc2V0IG9uY2UgYXQgYm9vdCA/IFdlIHJlYWxseSB3YW50Ci0JICogdG8gbW92ZSB0aGF0IGF3YXkgaW4gb3JkZXIgdG8gaW1wbGVtZW50IGEgc2ltcGxlIHBvd2Vyc2F2ZQorCS8qCisJICogZ28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5LCBtZWRpdW0gcHJpb3JpdHkgd2lsbCBiZQorCSAqIHJlc3RvcmVkIGZvciB1cyBhZnRlciB3YWtlLXVwLgogCSAqLwotCWNiZV9lbmFibGVfcGF1c2VfemVybygpOworCUhNVF9sb3coKTsKIAotCXdoaWxlICgxKSB7Ci0JCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCQkJLyogZ28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5ICovCi0JCQkJSE1UX2xvdygpOwotCi0JCQkJLyoKLQkJCQkgKiBhdG9taWNhbGx5IGRpc2FibGUgdGhyZWFkIGV4ZWN1dGlvbgotCQkJCSAqIGFuZCBydW5sYXRjaC4KLQkJCQkgKiBFeHRlcm5hbCBhbmQgRGVjcmVtZW50ZXIgZXhjZXB0aW9ucwotCQkJCSAqIGFyZSBzdGlsbCBoYW5kbGVkIHdoZW4gdGhlIHRocmVhZAotCQkJCSAqIGlzIGRpc2FibGVkIGJ1dCBub3cgZW50ZXIgaW4KLQkJCQkgKiBjYmVfc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbigpCi0JCQkJICovCi0JCQkJY3RybCA9IG1mc3ByKFNQUk5fQ1RSTEYpOwotCQkJCWN0cmwgJj0gfihDVFJMX1JVTkxBVENIIHwgQ1RSTF9URSk7Ci0JCQkJbXRzcHIoU1BSTl9DVFJMVCwgY3RybCk7Ci0JCQl9Ci0JCQkvKiByZXN0b3JlIHRocmVhZCBwcmlvICovCi0JCQlITVRfbWVkaXVtKCk7Ci0JCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiB0dXJuIHJ1bmxhdGNoIG9uIGFnYWluIGJlZm9yZSBzY2hlZHVsaW5nIHRoZQotCQkgKiBwcm9jZXNzIHdlIGp1c3Qgd29rZSB1cAotCQkgKi8KLQkJcHBjNjRfcnVubGF0Y2hfb24oKTsKLQotCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7Ci0JCXNjaGVkdWxlKCk7Ci0JCXByZWVtcHRfZGlzYWJsZSgpOwotCX0KKwkvKgorCSAqIGF0b21pY2FsbHkgZGlzYWJsZSB0aHJlYWQgZXhlY3V0aW9uIGFuZCBydW5sYXRjaC4KKwkgKiBFeHRlcm5hbCBhbmQgRGVjcmVtZW50ZXIgZXhjZXB0aW9ucyBhcmUgc3RpbGwgaGFuZGxlZCB3aGVuIHRoZQorCSAqIHRocmVhZCBpcyBkaXNhYmxlZCBidXQgbm93IGVudGVyIGluIGNiZV9zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKCkKKwkgKi8KKwljdHJsICY9IH4oQ1RSTF9SVU5MQVRDSCB8IENUUkxfVEUpOworCW10c3ByKFNQUk5fQ1RSTFQsIGN0cmwpOwogfQogCiBzdGF0aWMgaW50IGNiZV9zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMTU4LDkgKzExNCwyMCBAQAogCiB2b2lkIF9faW5pdCBjYmVfcGVydmFzaXZlX2luaXQodm9pZCkKIHsKKwlpbnQgY3B1OwogCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUEFVU0VfWkVSTykpCiAJCXJldHVybjsKIAotCXBwY19tZC5pZGxlX2xvb3AgPSBjYmVfaWRsZTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKGNwdSk7CisJCWlmICghcmVncykKKwkJCWNvbnRpbnVlOworCisJCSAvKiBFbmFibGUgUGF1c2UoMCkgY29udHJvbCBiaXQgKi8KKwkJb3V0X2JlNjQoJnJlZ3MtPnBtY3IsIGluX2JlNjQoJnJlZ3MtPnBtY3IpIHwKKwkJCQkJICAgIENCRV9QTURfUEFVU0VfWkVST19DT05UUk9MKTsKKwl9CisKKwlwcGNfbWQucG93ZXJfc2F2ZSA9IGNiZV9wb3dlcl9zYXZlOwogCXBwY19tZC5zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uID0gY2JlX3N5c3RlbV9yZXNldF9leGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcG11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0YWUxNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wbXUuYwpAQCAtMCwwICsxLDQzMiBAQAorLyoKKyAqIENlbGwgQnJvYWRiYW5kIEVuZ2luZSBQZXJmb3JtYW5jZSBNb25pdG9yCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMSwyMDA2CisgKgorICogQXV0aG9yOgorICogICAgRGF2aWQgRXJiIChkamVyYkB1cy5pYm0uY29tKQorICogICAgS2V2aW4gQ29ycnkgKGtldmNvcnJ5QHVzLmlibS5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcG1jLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9zcHUuaD4KKworI2luY2x1ZGUgImNiZV9yZWdzLmgiCisjaW5jbHVkZSAiaW50ZXJydXB0LmgiCisKKy8qCisgKiBXaGVuIHdyaXRpbmcgdG8gd3JpdGUtb25seSBtbWlvIGFkZHJlc3Nlcywgc2F2ZSBhIHNoYWRvdyBjb3B5LiBBbGwgb2YgdGhlCisgKiByZWdpc3RlcnMgYXJlIDMyLWJpdCwgYnV0IHN0b3JlZCBpbiB0aGUgdXBwZXItaGFsZiBvZiBhIDY0LWJpdCBmaWVsZCBpbgorICogcG1kX3JlZ3MuCisgKi8KKworI2RlZmluZSBXUklURV9XT19NTUlPKHJlZywgeCkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJdTMyIF94ID0gKHgpOwkJCQkJXAorCQlzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnBtZF9yZWdzOwkJXAorCQlzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyAqc2hhZG93X3JlZ3M7CVwKKwkJcG1kX3JlZ3MgPSBjYmVfZ2V0X2NwdV9wbWRfcmVncyhjcHUpOwkJXAorCQlzaGFkb3dfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9zaGFkb3dfcmVncyhjcHUpOwlcCisJCW91dF9iZTY0KCYocG1kX3JlZ3MtPnJlZyksICgoKHU2NClfeCkgPDwgMzIpKTsJXAorCQlzaGFkb3dfcmVncy0+cmVnID0gX3g7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFQURfU0hBRE9XX1JFRyh2YWwsIHJlZykJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyAqc2hhZG93X3JlZ3M7CVwKKwkJc2hhZG93X3JlZ3MgPSBjYmVfZ2V0X2NwdV9wbWRfc2hhZG93X3JlZ3MoY3B1KTsJXAorCQkodmFsKSA9IHNoYWRvd19yZWdzLT5yZWc7CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUkVBRF9NTUlPX1VQUEVSMzIodmFsLCByZWcpCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVnczsJCVwKKwkJcG1kX3JlZ3MgPSBjYmVfZ2V0X2NwdV9wbWRfcmVncyhjcHUpOwkJXAorCQkodmFsKSA9ICh1MzIpKGluX2JlNjQoJnBtZF9yZWdzLT5yZWcpID4+IDMyKTsJXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiBQaHlzaWNhbCBjb3VudGVyIHJlZ2lzdGVycy4KKyAqIEVhY2ggcGh5c2ljYWwgY291bnRlciBjYW4gYWN0IGFzIG9uZSAzMi1iaXQgY291bnRlciBvciB0d28gMTYtYml0IGNvdW50ZXJzLgorICovCisKK3UzMiBjYmVfcmVhZF9waHlzX2N0cih1MzIgY3B1LCB1MzIgcGh5c19jdHIpCit7CisJdTMyIHZhbF9pbl9sYXRjaCwgdmFsID0gMDsKKworCWlmIChwaHlzX2N0ciA8IE5SX1BIWVNfQ1RSUykgeworCQlSRUFEX1NIQURPV19SRUcodmFsX2luX2xhdGNoLCBjb3VudGVyX3ZhbHVlX2luX2xhdGNoKTsKKworCQkvKiBSZWFkIHRoZSBsYXRjaCBvciB0aGUgYWN0dWFsIGNvdW50ZXIsIHdoaWNoZXZlciBpcyBuZXdlci4gKi8KKwkJaWYgKHZhbF9pbl9sYXRjaCAmICgxIDw8IHBoeXNfY3RyKSkgeworCQkJUkVBRF9TSEFET1dfUkVHKHZhbCwgcG1fY3RyW3BoeXNfY3RyXSk7CisJCX0gZWxzZSB7CisJCQlSRUFEX01NSU9fVVBQRVIzMih2YWwsIHBtX2N0cltwaHlzX2N0cl0pOworCQl9CisJfQorCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9yZWFkX3BoeXNfY3RyKTsKKwordm9pZCBjYmVfd3JpdGVfcGh5c19jdHIodTMyIGNwdSwgdTMyIHBoeXNfY3RyLCB1MzIgdmFsKQoreworCXN0cnVjdCBjYmVfcG1kX3NoYWRvd19yZWdzICpzaGFkb3dfcmVnczsKKwl1MzIgcG1fY3RybDsKKworCWlmIChwaHlzX2N0ciA8IE5SX1BIWVNfQ1RSUykgeworCQkvKiBXcml0aW5nIHRvIGEgY291bnRlciBvbmx5IHdyaXRlcyB0byBhIGhhcmR3YXJlIGxhdGNoLgorCQkgKiBUaGUgbmV3IHZhbHVlIGlzIG5vdCBwcm9wYWdhdGVkIHRvIHRoZSBhY3R1YWwgY291bnRlcgorCQkgKiB1bnRpbCB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBpcyBlbmFibGVkLgorCQkgKi8KKwkJV1JJVEVfV09fTU1JTyhwbV9jdHJbcGh5c19jdHJdLCB2YWwpOworCisJCXBtX2N0cmwgPSBjYmVfcmVhZF9wbShjcHUsIHBtX2NvbnRyb2wpOworCQlpZiAocG1fY3RybCAmIENCRV9QTV9FTkFCTEVfUEVSRl9NT04pIHsKKwkJCS8qIFRoZSBjb3VudGVycyBhcmUgYWxyZWFkeSBhY3RpdmUsIHNvIHdlIG5lZWQgdG8KKwkJCSAqIHJld3JpdGUgdGhlIHBtX2NvbnRyb2wgcmVnaXN0ZXIgdG8gInJlLWVuYWJsZSIKKwkJCSAqIHRoZSBQTVUuCisJCQkgKi8KKwkJCWNiZV93cml0ZV9wbShjcHUsIHBtX2NvbnRyb2wsIHBtX2N0cmwpOworCQl9IGVsc2UgeworCQkJc2hhZG93X3JlZ3MgPSBjYmVfZ2V0X2NwdV9wbWRfc2hhZG93X3JlZ3MoY3B1KTsKKwkJCXNoYWRvd19yZWdzLT5jb3VudGVyX3ZhbHVlX2luX2xhdGNoIHw9ICgxIDw8IHBoeXNfY3RyKTsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV93cml0ZV9waHlzX2N0cik7CisKKy8qCisgKiAiTG9naWNhbCIgY291bnRlciByZWdpc3RlcnMuCisgKiBUaGVzZSB3aWxsIHJlYWQvd3JpdGUgMTYtYml0cyBvciAzMi1iaXRzIGRlcGVuZGluZyBvbiB0aGUKKyAqIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY291bnRlci4gQ291bnRlcnMgNCAtIDcgYXJlIGFsd2F5cyAxNi1iaXQuCisgKi8KKwordTMyIGNiZV9yZWFkX2N0cih1MzIgY3B1LCB1MzIgY3RyKQoreworCXUzMiB2YWw7CisJdTMyIHBoeXNfY3RyID0gY3RyICYgKE5SX1BIWVNfQ1RSUyAtIDEpOworCisJdmFsID0gY2JlX3JlYWRfcGh5c19jdHIoY3B1LCBwaHlzX2N0cik7CisKKwlpZiAoY2JlX2dldF9jdHJfc2l6ZShjcHUsIHBoeXNfY3RyKSA9PSAxNikKKwkJdmFsID0gKGN0ciA8IE5SX1BIWVNfQ1RSUykgPyAodmFsID4+IDE2KSA6ICh2YWwgJiAweGZmZmYpOworCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9yZWFkX2N0cik7CisKK3ZvaWQgY2JlX3dyaXRlX2N0cih1MzIgY3B1LCB1MzIgY3RyLCB1MzIgdmFsKQoreworCXUzMiBwaHlzX2N0cjsKKwl1MzIgcGh5c192YWw7CisKKwlwaHlzX2N0ciA9IGN0ciAmIChOUl9QSFlTX0NUUlMgLSAxKTsKKworCWlmIChjYmVfZ2V0X2N0cl9zaXplKGNwdSwgcGh5c19jdHIpID09IDE2KSB7CisJCXBoeXNfdmFsID0gY2JlX3JlYWRfcGh5c19jdHIoY3B1LCBwaHlzX2N0cik7CisKKwkJaWYgKGN0ciA8IE5SX1BIWVNfQ1RSUykKKwkJCXZhbCA9ICh2YWwgPDwgMTYpIHwgKHBoeXNfdmFsICYgMHhmZmZmKTsKKwkJZWxzZQorCQkJdmFsID0gKHZhbCAmIDB4ZmZmZikgfCAocGh5c192YWwgJiAweGZmZmYwMDAwKTsKKwl9CisKKwljYmVfd3JpdGVfcGh5c19jdHIoY3B1LCBwaHlzX2N0ciwgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV93cml0ZV9jdHIpOworCisvKgorICogQ291bnRlci1jb250cm9sIHJlZ2lzdGVycy4KKyAqIEVhY2ggImxvZ2ljYWwiIGNvdW50ZXIgaGFzIGEgY29ycmVzcG9uZGluZyBjb250cm9sIHJlZ2lzdGVyLgorICovCisKK3UzMiBjYmVfcmVhZF9wbTA3X2NvbnRyb2wodTMyIGNwdSwgdTMyIGN0cikKK3sKKwl1MzIgcG0wN19jb250cm9sID0gMDsKKworCWlmIChjdHIgPCBOUl9DVFJTKQorCQlSRUFEX1NIQURPV19SRUcocG0wN19jb250cm9sLCBwbTA3X2NvbnRyb2xbY3RyXSk7CisKKwlyZXR1cm4gcG0wN19jb250cm9sOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX3JlYWRfcG0wN19jb250cm9sKTsKKwordm9pZCBjYmVfd3JpdGVfcG0wN19jb250cm9sKHUzMiBjcHUsIHUzMiBjdHIsIHUzMiB2YWwpCit7CisJaWYgKGN0ciA8IE5SX0NUUlMpCisJCVdSSVRFX1dPX01NSU8ocG0wN19jb250cm9sW2N0cl0sIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfd3JpdGVfcG0wN19jb250cm9sKTsKKworLyoKKyAqIE90aGVyIFBNVSBjb250cm9sIHJlZ2lzdGVycy4gTW9zdCBvZiB0aGVzZSBhcmUgd3JpdGUtb25seS4KKyAqLworCit1MzIgY2JlX3JlYWRfcG0odTMyIGNwdSwgZW51bSBwbV9yZWdfbmFtZSByZWcpCit7CisJdTMyIHZhbCA9IDA7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgZ3JvdXBfY29udHJvbDoKKwkJUkVBRF9TSEFET1dfUkVHKHZhbCwgZ3JvdXBfY29udHJvbCk7CisJCWJyZWFrOworCisJY2FzZSBkZWJ1Z19idXNfY29udHJvbDoKKwkJUkVBRF9TSEFET1dfUkVHKHZhbCwgZGVidWdfYnVzX2NvbnRyb2wpOworCQlicmVhazsKKworCWNhc2UgdHJhY2VfYWRkcmVzczoKKwkJUkVBRF9NTUlPX1VQUEVSMzIodmFsLCB0cmFjZV9hZGRyZXNzKTsKKwkJYnJlYWs7CisKKwljYXNlIGV4dF90cl90aW1lcjoKKwkJUkVBRF9TSEFET1dfUkVHKHZhbCwgZXh0X3RyX3RpbWVyKTsKKwkJYnJlYWs7CisKKwljYXNlIHBtX3N0YXR1czoKKwkJUkVBRF9NTUlPX1VQUEVSMzIodmFsLCBwbV9zdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgcG1fY29udHJvbDoKKwkJUkVBRF9TSEFET1dfUkVHKHZhbCwgcG1fY29udHJvbCk7CisJCWJyZWFrOworCisJY2FzZSBwbV9pbnRlcnZhbDoKKwkJUkVBRF9TSEFET1dfUkVHKHZhbCwgcG1faW50ZXJ2YWwpOworCQlicmVhazsKKworCWNhc2UgcG1fc3RhcnRfc3RvcDoKKwkJUkVBRF9TSEFET1dfUkVHKHZhbCwgcG1fc3RhcnRfc3RvcCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfcmVhZF9wbSk7CisKK3ZvaWQgY2JlX3dyaXRlX3BtKHUzMiBjcHUsIGVudW0gcG1fcmVnX25hbWUgcmVnLCB1MzIgdmFsKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBncm91cF9jb250cm9sOgorCQlXUklURV9XT19NTUlPKGdyb3VwX2NvbnRyb2wsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBkZWJ1Z19idXNfY29udHJvbDoKKwkJV1JJVEVfV09fTU1JTyhkZWJ1Z19idXNfY29udHJvbCwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIHRyYWNlX2FkZHJlc3M6CisJCVdSSVRFX1dPX01NSU8odHJhY2VfYWRkcmVzcywgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIGV4dF90cl90aW1lcjoKKwkJV1JJVEVfV09fTU1JTyhleHRfdHJfdGltZXIsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBwbV9zdGF0dXM6CisJCVdSSVRFX1dPX01NSU8ocG1fc3RhdHVzLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgcG1fY29udHJvbDoKKwkJV1JJVEVfV09fTU1JTyhwbV9jb250cm9sLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgcG1faW50ZXJ2YWw6CisJCVdSSVRFX1dPX01NSU8ocG1faW50ZXJ2YWwsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBwbV9zdGFydF9zdG9wOgorCQlXUklURV9XT19NTUlPKHBtX3N0YXJ0X3N0b3AsIHZhbCk7CisJCWJyZWFrOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV93cml0ZV9wbSk7CisKKy8qCisgKiBHZXQvc2V0IHRoZSBzaXplIG9mIGEgcGh5c2ljYWwgY291bnRlciB0byBlaXRoZXIgMTYgb3IgMzIgYml0cy4KKyAqLworCit1MzIgY2JlX2dldF9jdHJfc2l6ZSh1MzIgY3B1LCB1MzIgcGh5c19jdHIpCit7CisJdTMyIHBtX2N0cmwsIHNpemUgPSAwOworCisJaWYgKHBoeXNfY3RyIDwgTlJfUEhZU19DVFJTKSB7CisJCXBtX2N0cmwgPSBjYmVfcmVhZF9wbShjcHUsIHBtX2NvbnRyb2wpOworCQlzaXplID0gKHBtX2N0cmwgJiBDQkVfUE1fMTZCSVRfQ1RSKHBoeXNfY3RyKSkgPyAxNiA6IDMyOworCX0KKworCXJldHVybiBzaXplOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX2dldF9jdHJfc2l6ZSk7CisKK3ZvaWQgY2JlX3NldF9jdHJfc2l6ZSh1MzIgY3B1LCB1MzIgcGh5c19jdHIsIHUzMiBjdHJfc2l6ZSkKK3sKKwl1MzIgcG1fY3RybDsKKworCWlmIChwaHlzX2N0ciA8IE5SX1BIWVNfQ1RSUykgeworCQlwbV9jdHJsID0gY2JlX3JlYWRfcG0oY3B1LCBwbV9jb250cm9sKTsKKwkJc3dpdGNoIChjdHJfc2l6ZSkgeworCQljYXNlIDE2OgorCQkJcG1fY3RybCB8PSBDQkVfUE1fMTZCSVRfQ1RSKHBoeXNfY3RyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMzI6CisJCQlwbV9jdHJsICY9IH5DQkVfUE1fMTZCSVRfQ1RSKHBoeXNfY3RyKTsKKwkJCWJyZWFrOworCQl9CisJCWNiZV93cml0ZV9wbShjcHUsIHBtX2NvbnRyb2wsIHBtX2N0cmwpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9zZXRfY3RyX3NpemUpOworCisvKgorICogRW5hYmxlL2Rpc2FibGUgdGhlIGVudGlyZSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIHVuaXQuCisgKiBXaGVuIHdlIGVuYWJsZSB0aGUgUE1VLCBhbGwgcGVuZGluZyB3cml0ZXMgdG8gY291bnRlcnMgZ2V0IGNvbW1pdHRlZC4KKyAqLworCit2b2lkIGNiZV9lbmFibGVfcG0odTMyIGNwdSkKK3sKKwlzdHJ1Y3QgY2JlX3BtZF9zaGFkb3dfcmVncyAqc2hhZG93X3JlZ3M7CisJdTMyIHBtX2N0cmw7CisKKwlzaGFkb3dfcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9zaGFkb3dfcmVncyhjcHUpOworCXNoYWRvd19yZWdzLT5jb3VudGVyX3ZhbHVlX2luX2xhdGNoID0gMDsKKworCXBtX2N0cmwgPSBjYmVfcmVhZF9wbShjcHUsIHBtX2NvbnRyb2wpIHwgQ0JFX1BNX0VOQUJMRV9QRVJGX01PTjsKKwljYmVfd3JpdGVfcG0oY3B1LCBwbV9jb250cm9sLCBwbV9jdHJsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9lbmFibGVfcG0pOworCit2b2lkIGNiZV9kaXNhYmxlX3BtKHUzMiBjcHUpCit7CisJdTMyIHBtX2N0cmw7CisJcG1fY3RybCA9IGNiZV9yZWFkX3BtKGNwdSwgcG1fY29udHJvbCkgJiB+Q0JFX1BNX0VOQUJMRV9QRVJGX01PTjsKKwljYmVfd3JpdGVfcG0oY3B1LCBwbV9jb250cm9sLCBwbV9jdHJsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9kaXNhYmxlX3BtKTsKKworLyoKKyAqIFJlYWRpbmcgZnJvbSB0aGUgdHJhY2VfYnVmZmVyLgorICogVGhlIHRyYWNlIGJ1ZmZlciBpcyB0d28gNjQtYml0IHJlZ2lzdGVycy4gUmVhZGluZyBmcm9tCisgKiB0aGUgc2Vjb25kIGhhbGYgYXV0b21hdGljYWxseSBpbmNyZW1lbnRzIHRoZSB0cmFjZV9hZGRyZXNzLgorICovCisKK3ZvaWQgY2JlX3JlYWRfdHJhY2VfYnVmZmVyKHUzMiBjcHUsIHU2NCAqYnVmKQoreworCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3MgPSBjYmVfZ2V0X2NwdV9wbWRfcmVncyhjcHUpOworCisJKmJ1ZisrID0gaW5fYmU2NCgmcG1kX3JlZ3MtPnRyYWNlX2J1ZmZlcl8wXzYzKTsKKwkqYnVmKysgPSBpbl9iZTY0KCZwbWRfcmVncy0+dHJhY2VfYnVmZmVyXzY0XzEyNyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfcmVhZF90cmFjZV9idWZmZXIpOworCisvKgorICogRW5hYmxpbmcvZGlzYWJsaW5nIGludGVycnVwdHMgZm9yIHRoZSBlbnRpcmUgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyB1bml0LgorICovCisKK3UzMiBjYmVfcXVlcnlfcG1faW50ZXJydXB0cyh1MzIgY3B1KQoreworCXJldHVybiBjYmVfcmVhZF9wbShjcHUsIHBtX3N0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfcXVlcnlfcG1faW50ZXJydXB0cyk7CisKK3UzMiBjYmVfY2xlYXJfcG1faW50ZXJydXB0cyh1MzIgY3B1KQoreworCS8qIFJlYWRpbmcgcG1fc3RhdHVzIGNsZWFycyB0aGUgaW50ZXJydXB0IGJpdHMuICovCisJcmV0dXJuIGNiZV9xdWVyeV9wbV9pbnRlcnJ1cHRzKGNwdSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjYmVfY2xlYXJfcG1faW50ZXJydXB0cyk7CisKK3ZvaWQgY2JlX2VuYWJsZV9wbV9pbnRlcnJ1cHRzKHUzMiBjcHUsIHUzMiB0aHJlYWQsIHUzMiBtYXNrKQoreworCS8qIFNldCB3aGljaCBub2RlIGFuZCB0aHJlYWQgd2lsbCBoYW5kbGUgdGhlIG5leHQgaW50ZXJydXB0LiAqLworCWlpY19zZXRfaW50ZXJydXB0X3JvdXRpbmcoY3B1LCB0aHJlYWQsIDApOworCisJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgYml0cyBpbiB0aGUgcG1fc3RhdHVzIHJlZ2lzdGVyLiAqLworCWlmIChtYXNrKQorCQljYmVfd3JpdGVfcG0oY3B1LCBwbV9zdGF0dXMsIG1hc2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX2VuYWJsZV9wbV9pbnRlcnJ1cHRzKTsKKwordm9pZCBjYmVfZGlzYWJsZV9wbV9pbnRlcnJ1cHRzKHUzMiBjcHUpCit7CisJY2JlX2NsZWFyX3BtX2ludGVycnVwdHMoY3B1KTsKKwljYmVfd3JpdGVfcG0oY3B1LCBwbV9zdGF0dXMsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX2Rpc2FibGVfcG1faW50ZXJydXB0cyk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjYmVfcG1faXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlwZXJmX2lycShnZXRfaXJxX3JlZ3MoKSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjYmVfaW5pdF9wbV9pcnEodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxOworCWludCByYywgbm9kZTsKKworCWlmICghbWFjaGluZV9pcyhjZWxsKSkKKwkJcmV0dXJuIDA7CisKKwlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKKwkJaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIElJQ19JUlFfSU9FWF9QTUkgfAorCQkJCQkgICAgICAgKG5vZGUgPDwgSUlDX0lSUV9OT0RFX1NISUZUKSk7CisJCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCQlwcmludGsoIkVSUk9SOiBVbmFibGUgdG8gYWxsb2NhdGUgaXJxIGZvciBub2RlICVkXG4iLAorCQkJICAgICAgIG5vZGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyYyA9IHJlcXVlc3RfaXJxKGlycSwgY2JlX3BtX2lycSwKKwkJCQkgSVJRRl9ESVNBQkxFRCwgImNiZS1wbXUtMCIsIE5VTEwpOworCQlpZiAocmMpIHsKKwkJCXByaW50aygiRVJST1I6IFJlcXVlc3QgZm9yIGlycSBvbiBub2RlICVkIGZhaWxlZFxuIiwKKwkJCSAgICAgICBub2RlKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChjYmVfaW5pdF9wbV9pcnEpOworCit2b2lkIGNiZV9zeW5jX2lycShpbnQgbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhOVUxMLAorCQkJICAgICAgIElJQ19JUlFfSU9FWF9QTUkKKwkJCSAgICAgICB8IChub2RlIDw8IElJQ19JUlFfTk9ERV9TSElGVCkpOworCisJaWYgKGlycSA9PSBOT19JUlEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVJST1IsIHVuYWJsZSB0byBnZXQgZXhpc3RpbmcgaXJxICVkICIgXAorCQkiZm9yIG5vZGUgJWRcbiIsIGlycSwgbm9kZSk7CisJCXJldHVybjsKKwl9CisKKwlzeW5jaHJvbml6ZV9pcnEoaXJxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9zeW5jX2lycSk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKaW5kZXggMjJjMjI4YS4uMzY5ODljMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMKQEAgLTUwLDkgKzUwLDEwIEBACiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KICNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAKICNpbmNsdWRlICJpbnRlcnJ1cHQuaCIKLSNpbmNsdWRlICJpb21tdS5oIgogI2luY2x1ZGUgImNiZV9yZWdzLmgiCiAjaW5jbHVkZSAicGVydmFzaXZlLmgiCiAjaW5jbHVkZSAicmFzLmgiCkBAIC04MCwyNCArODEsNzIgQEAKIAlwcmludGsoIioqKiAlMDR4IDogJXNcbiIsIGhleCwgcyA/IHMgOiAiIik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjZWxsX3BjaWJpb3NfZml4dXAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGNlbGxfcHVibGlzaF9kZXZpY2VzKHZvaWQpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJaWYgKCFtYWNoaW5lX2lzKGNlbGwpKQorCQlyZXR1cm4gMDsKIAotCWZvcl9lYWNoX3BjaV9kZXYoZGV2KQotCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOworCS8qIFB1Ymxpc2ggT0YgcGxhdGZvcm0gZGV2aWNlcyBmb3Igc291dGhicmlkZ2UgSU9zICovCisJb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIE5VTEwsIE5VTEwpOworCisJcmV0dXJuIDA7CiB9CitkZXZpY2VfaW5pdGNhbGwoY2VsbF9wdWJsaXNoX2RldmljZXMpOworCitzdGF0aWMgdm9pZCBjZWxsX21waWNfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IG1waWMgKm1waWMgPSBkZXNjLT5oYW5kbGVyX2RhdGE7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwl2aXJxID0gbXBpY19nZXRfb25lX2lycShtcGljKTsKKwlpZiAodmlycSAhPSBOT19JUlEpCisJCWdlbmVyaWNfaGFuZGxlX2lycSh2aXJxKTsKKwlkZXNjLT5jaGlwLT5lb2koaXJxKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG1waWNfaW5pdF9JUlEodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCXN0cnVjdCBtcGljICptcGljOworCXVuc2lnbmVkIGludCB2aXJxOworCisJZm9yIChkbiA9IE5VTEw7CisJICAgICAoZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShkbiwgImludGVycnVwdC1jb250cm9sbGVyIikpOykgeworCQlpZiAoIWRldmljZV9pc19jb21wYXRpYmxlKGRuLCAiQ0JFQSxwbGF0Zm9ybS1vcGVuLXBpYyIpKQorCQkJY29udGludWU7CisKKwkJLyogVGhlIE1QSUMgZHJpdmVyIHdpbGwgZ2V0IGV2ZXJ5dGhpbmcgaXQgbmVlZHMgZnJvbSB0aGUKKwkJICogZGV2aWNlLXRyZWUsIGp1c3QgcGFzcyAwIHRvIGFsbCBhcmd1bWVudHMKKwkJICovCisJCW1waWMgPSBtcGljX2FsbG9jKGRuLCAwLCAwLCAwLCAwLCAiIE1QSUMgICAgICIpOworCQlpZiAobXBpYyA9PSBOVUxMKQorCQkJY29udGludWU7CisJCW1waWNfaW5pdChtcGljKTsKKworCQl2aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDApOworCQlpZiAodmlycSA9PSBOT19JUlEpCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9JTkZPICIlcyA6IGhvb2tpbmcgdXAgdG8gSVJRICVkXG4iLAorCQkgICAgICAgZG4tPmZ1bGxfbmFtZSwgdmlycSk7CisJCXNldF9pcnFfZGF0YSh2aXJxLCBtcGljKTsKKwkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIodmlycSwgY2VsbF9tcGljX2Nhc2NhZGUpOworCX0KK30KKwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY2VsbF9pbml0X2lycSh2b2lkKQogewogCWlpY19pbml0X0lSUSgpOwogCXNwaWRlcl9pbml0X0lSUSgpOworCW1waWNfaW5pdF9JUlEoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGNlbGxfc2V0dXBfYXJjaCh2b2lkKQogewogI2lmZGVmIENPTkZJR19TUFVfQkFTRQotCXNwdV9wcml2MV9vcHMgICAgICAgICA9ICZzcHVfcHJpdjFfbW1pb19vcHM7CisJc3B1X3ByaXYxX29wcyA9ICZzcHVfcHJpdjFfbW1pb19vcHM7CisJc3B1X21hbmFnZW1lbnRfb3BzID0gJnNwdV9tYW5hZ2VtZW50X29mX29wczsKICNlbmRpZgogCiAJY2JlX3JlZ3NfaW5pdCgpOwpAQCAtMTA5LDcgKzE1OCw2IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCXNtcF9pbml0X2NlbGwoKTsKICNlbmRpZgotCiAJLyogaW5pdCB0byBzb21lIH5zYW5lIHZhbHVlIHVudGlsIGNhbGlicmF0ZV9kZWxheSgpIHJ1bnMgKi8KIAlsb29wc19wZXJfamlmZnkgPSA1MDAwMDAwMDsKIApAQCAtMTI5LDE5ICsxNzcsNiBAQAogCW1taW9fbnZyYW1faW5pdCgpOwogfQogCi0vKgotICogRWFybHkgaW5pdGlhbGl6YXRpb24uICBSZWxvY2F0aW9uIGlzIG9uIGJ1dCBkbyBub3QgcmVmZXJlbmNlIHVuYm9sdGVkIHBhZ2VzCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBjZWxsX2luaXRfZWFybHkodm9pZCkKLXsKLQlEQkcoIiAtPiBjZWxsX2luaXRfZWFybHkoKVxuIik7Ci0KLQljZWxsX2luaXRfaW9tbXUoKTsKLQotCURCRygiIDwtIGNlbGxfaW5pdF9lYXJseSgpXG4iKTsKLX0KLQotCiBzdGF0aWMgaW50IF9faW5pdCBjZWxsX3Byb2JlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwpAQCAtMTY4LDcgKzIwMyw2IEBACiAJLm5hbWUJCQk9ICJDZWxsIiwKIAkucHJvYmUJCQk9IGNlbGxfcHJvYmUsCiAJLnNldHVwX2FyY2gJCT0gY2VsbF9zZXR1cF9hcmNoLAotCS5pbml0X2Vhcmx5CQk9IGNlbGxfaW5pdF9lYXJseSwKIAkuc2hvd19jcHVpbmZvCQk9IGNlbGxfc2hvd19jcHVpbmZvLAogCS5yZXN0YXJ0CQk9IHJ0YXNfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IHJ0YXNfcG93ZXJfb2ZmLApAQCAtMTgwLDcgKzIxNCw3IEBACiAJLmNoZWNrX2xlZ2FjeV9pb3BvcnQJPSBjZWxsX2NoZWNrX2xlZ2FjeV9pb3BvcnQsCiAJLnByb2dyZXNzCQk9IGNlbGxfcHJvZ3Jlc3MsCiAJLmluaXRfSVJRICAgICAgIAk9IGNlbGxfaW5pdF9pcnEsCi0JLnBjaWJpb3NfZml4dXAJCT0gY2VsbF9wY2liaW9zX2ZpeHVwLAorCS5wY2lfc2V0dXBfcGhiCQk9IHJ0YXNfc2V0dXBfcGhiLAogI2lmZGVmIENPTkZJR19LRVhFQwogCS5tYWNoaW5lX2tleGVjCQk9IGRlZmF1bHRfbWFjaGluZV9rZXhlYywKIAkubWFjaGluZV9rZXhlY19wcmVwYXJlCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjX3ByZXBhcmUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCmluZGV4IGNjZmQwYzQuLmJkN2JmZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCkBAIC0yNSwyMiArMjUsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X3ByaXYxLmg+Ci0jaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3htb24uaD4KIAotI2luY2x1ZGUgImludGVycnVwdC5oIgotCitjb25zdCBzdHJ1Y3Qgc3B1X21hbmFnZW1lbnRfb3BzICpzcHVfbWFuYWdlbWVudF9vcHM7CiBjb25zdCBzdHJ1Y3Qgc3B1X3ByaXYxX29wcyAqc3B1X3ByaXYxX29wczsKIAogRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3ByaXYxX29wcyk7CkBAIC04OSw3ICs4NCwzMCBAQAogCQlwcmludGsoIiVzOiBpbnZhbGlkIGFjY2VzcyBkdXJpbmcgc3dpdGNoIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMTsKIAl9Ci0JaWYgKCFtbSB8fCAoUkVHSU9OX0lEKGVhKSAhPSBVU0VSX1JFR0lPTl9JRCkpIHsKKwllc2lkID0gKGVhICYgRVNJRF9NQVNLKSB8IFNMQl9FU0lEX1Y7CisKKwlzd2l0Y2goUkVHSU9OX0lEKGVhKSkgeworCWNhc2UgVVNFUl9SRUdJT05fSUQ6CisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorCQlpZiAoaW5faHVnZXBhZ2VfYXJlYShtbS0+Y29udGV4dCwgZWEpKQorCQkJbGxwID0gbW11X3BzaXplX2RlZnNbbW11X2h1Z2VfcHNpemVdLnNsbHA7CisJCWVsc2UKKyNlbmRpZgorCQkJbGxwID0gbW11X3BzaXplX2RlZnNbbW11X3ZpcnR1YWxfcHNpemVdLnNsbHA7CisJCXZzaWQgPSAoZ2V0X3ZzaWQobW0tPmNvbnRleHQuaWQsIGVhKSA8PCBTTEJfVlNJRF9TSElGVCkgfAorCQkJCVNMQl9WU0lEX1VTRVIgfCBsbHA7CisJCWJyZWFrOworCWNhc2UgVk1BTExPQ19SRUdJT05fSUQ6CisJCWxscCA9IG1tdV9wc2l6ZV9kZWZzW21tdV92aXJ0dWFsX3BzaXplXS5zbGxwOworCQl2c2lkID0gKGdldF9rZXJuZWxfdnNpZChlYSkgPDwgU0xCX1ZTSURfU0hJRlQpIHwKKwkJCVNMQl9WU0lEX0tFUk5FTCB8IGxscDsKKwkJYnJlYWs7CisJY2FzZSBLRVJORUxfUkVHSU9OX0lEOgorCQlsbHAgPSBtbXVfcHNpemVfZGVmc1ttbXVfbGluZWFyX3BzaXplXS5zbGxwOworCQl2c2lkID0gKGdldF9rZXJuZWxfdnNpZChlYSkgPDwgU0xCX1ZTSURfU0hJRlQpIHwKKwkJCVNMQl9WU0lEX0tFUk5FTCB8IGxscDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJLyogRnV0dXJlOiBzdXBwb3J0IGtlcm5lbCBzZWdtZW50cyBzbyB0aGF0IGRyaXZlcnMKIAkJICogY2FuIHVzZSBTUFVzLgogCQkgKi8KQEAgLTk3LDE2ICsxMTUsNiBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQllc2lkID0gKGVhICYgRVNJRF9NQVNLKSB8IFNMQl9FU0lEX1Y7Ci0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQotCWlmIChpbl9odWdlcGFnZV9hcmVhKG1tLT5jb250ZXh0LCBlYSkpCi0JCWxscCA9IG1tdV9wc2l6ZV9kZWZzW21tdV9odWdlX3BzaXplXS5zbGxwOwotCWVsc2UKLSNlbmRpZgotCQlsbHAgPSBtbXVfcHNpemVfZGVmc1ttbXVfdmlydHVhbF9wc2l6ZV0uc2xscDsKLQl2c2lkID0gKGdldF92c2lkKG1tLT5jb250ZXh0LmlkLCBlYSkgPDwgU0xCX1ZTSURfU0hJRlQpIHwKLQkJCVNMQl9WU0lEX1VTRVIgfCBsbHA7Ci0KIAlvdXRfYmU2NCgmcHJpdjItPnNsYl9pbmRleF9XLCBzcHUtPnNsYl9yZXBsYWNlKTsKIAlvdXRfYmU2NCgmcHJpdjItPnNsYl92c2lkX1JXLCB2c2lkKTsKIAlvdXRfYmU2NCgmcHJpdjItPnNsYl9lc2lkX1JXLCBlc2lkKTsKQEAgLTMyMCw2ICszMjgsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzcHVfbGlzdFtNQVhfTlVNTk9ERVNdOworc3RhdGljIExJU1RfSEVBRChzcHVfZnVsbF9saXN0KTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc3B1X211dGV4KTsKIAogc3RhdGljIHZvaWQgc3B1X2luaXRfY2hhbm5lbHMoc3RydWN0IHNwdSAqc3B1KQpAQCAtMzY0LDggKzM3Myw3IEBACiAJaWYgKCFsaXN0X2VtcHR5KCZzcHVfbGlzdFtub2RlXSkpIHsKIAkJc3B1ID0gbGlzdF9lbnRyeShzcHVfbGlzdFtub2RlXS5uZXh0LCBzdHJ1Y3Qgc3B1LCBsaXN0KTsKIAkJbGlzdF9kZWxfaW5pdCgmc3B1LT5saXN0KTsKLQkJcHJfZGVidWcoIkdvdCBTUFUgJXggJWQgJWRcbiIsCi0JCQkgc3B1LT5pc3JjLCBzcHUtPm51bWJlciwgc3B1LT5ub2RlKTsKKwkJcHJfZGVidWcoIkdvdCBTUFUgJWQgJWRcbiIsIHNwdS0+bnVtYmVyLCBzcHUtPm5vZGUpOwogCQlzcHVfaW5pdF9jaGFubmVscyhzcHUpOwogCX0KIAltdXRleF91bmxvY2soJnNwdV9tdXRleCk7CkBAIC00OTMsMjU1ICs1MDEsNjUgQEAKIAlpZiAoIWVycm9yKSB7CiAJCXNwdV9yZXN0YXJ0X2RtYShzcHUpOwogCX0gZWxzZSB7Ci0JCV9fc3B1X3RyYXBfaW52YWxpZF9kbWEoc3B1KTsKKwkJc3B1LT5kbWFfY2FsbGJhY2soc3B1LCBTUEVfRVZFTlRfU1BFX0RBVEFfU1RPUkFHRSk7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGZpbmRfc3B1X25vZGVfaWQoc3RydWN0IGRldmljZV9ub2RlICpzcGUpCi17Ci0JY29uc3QgdW5zaWduZWQgaW50ICppZDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKLQljcHUgPSBzcGUtPnBhcmVudC0+cGFyZW50OwotCWlkID0gZ2V0X3Byb3BlcnR5KGNwdSwgIm5vZGUtaWQiLCBOVUxMKTsKLQlyZXR1cm4gaWQgPyAqaWQgOiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjZWxsX3NwdXByb3BfcHJlc2VudChzdHJ1Y3Qgc3B1ICpzcHUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3BlLAotCQljb25zdCBjaGFyICpwcm9wKQotewotCXN0YXRpYyBERUZJTkVfTVVURVgoYWRkX3NwdW1lbV9tdXRleCk7Ci0KLQljb25zdCBzdHJ1Y3QgYWRkcmVzc19wcm9wIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCQl1bnNpZ25lZCBpbnQgbGVuOwotCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKnA7Ci0JaW50IHByb3BsZW47Ci0KLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgbnJfcGFnZXM7Ci0Jc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdGE7Ci0Jc3RydWN0IHpvbmUgKnpvbmU7Ci0JaW50IHJldDsKLQotCXAgPSBnZXRfcHJvcGVydHkoc3BlLCBwcm9wLCAmcHJvcGxlbik7Ci0JV0FSTl9PTihwcm9wbGVuICE9IHNpemVvZiAoKnApKTsKLQotCXN0YXJ0X3BmbiA9IHAtPmFkZHJlc3MgPj4gUEFHRV9TSElGVDsKLQlucl9wYWdlcyA9ICgodW5zaWduZWQgbG9uZylwLT5sZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCi0JcGdkYXRhID0gTk9ERV9EQVRBKHNwdS0+bmlkKTsKLQl6b25lID0gcGdkYXRhLT5ub2RlX3pvbmVzOwotCi0JLyogWFhYIHJldGhpbmsgbG9ja2luZyBoZXJlICovCi0JbXV0ZXhfbG9jaygmYWRkX3NwdW1lbV9tdXRleCk7Ci0JcmV0ID0gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7Ci0JbXV0ZXhfdW5sb2NrKCZhZGRfc3B1bWVtX211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgbWFwX3NwZV9wcm9wKHN0cnVjdCBzcHUgKnNwdSwKLQkJc3RydWN0IGRldmljZV9ub2RlICpuLCBjb25zdCBjaGFyICpuYW1lKQotewotCWNvbnN0IHN0cnVjdCBhZGRyZXNzX3Byb3AgewotCQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JCXVuc2lnbmVkIGludCBsZW47Ci0JfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqcHJvcDsKLQotCWNvbnN0IHZvaWQgKnA7Ci0JaW50IHByb3BsZW47Ci0Jdm9pZCBfX2lvbWVtICpyZXQgPSBOVUxMOwotCWludCBlcnIgPSAwOwotCi0JcCA9IGdldF9wcm9wZXJ0eShuLCBuYW1lLCAmcHJvcGxlbik7Ci0JaWYgKHByb3BsZW4gIT0gc2l6ZW9mIChzdHJ1Y3QgYWRkcmVzc19wcm9wKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwcm9wID0gcDsKLQotCWVyciA9IGNlbGxfc3B1cHJvcF9wcmVzZW50KHNwdSwgbiwgbmFtZSk7Ci0JaWYgKGVyciAmJiAoZXJyICE9IC1FRVhJU1QpKQotCQlnb3RvIG91dDsKLQotCXJldCA9IGlvcmVtYXAocHJvcC0+YWRkcmVzcywgcHJvcC0+bGVuKTsKLQotIG91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzcHVfdW5tYXAoc3RydWN0IHNwdSAqc3B1KQotewotCWlvdW5tYXAoc3B1LT5wcml2Mik7Ci0JaW91bm1hcChzcHUtPnByaXYxKTsKLQlpb3VubWFwKHNwdS0+cHJvYmxlbSk7Ci0JaW91bm1hcCgoX19mb3JjZSB1OCBfX2lvbWVtICopc3B1LT5sb2NhbF9zdG9yZSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gc2hhbGwgYmUgYWJzdHJhY3RlZCBmb3IgSFYgcGxhdGZvcm1zICovCi1zdGF0aWMgaW50IF9faW5pdCBzcHVfbWFwX2ludGVycnVwdHNfb2xkKHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQl1bnNpZ25lZCBpbnQgaXNyYzsKLQljb25zdCB1MzIgKnRtcDsKLQotCS8qIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZSB1bml0IGZyb20gdGhlIGRldmljZS10cmVlICovCi0JdG1wID0gZ2V0X3Byb3BlcnR5KG5wLCAiaXNyYyIsIE5VTEwpOwotCWlmICghdG1wKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpc3JjID0gdG1wWzBdOwotCi0JLyogQWRkIHRoZSBub2RlIG51bWJlciAqLwotCWlzcmMgfD0gc3B1LT5ub2RlIDw8IElJQ19JUlFfTk9ERV9TSElGVDsKLQlzcHUtPmlzcmMgPSBpc3JjOwotCi0JLyogTm93IG1hcCBpbnRlcnJ1cHRzIG9mIGFsbCAzIGNsYXNzZXMgKi8KLQlzcHUtPmlycXNbMF0gPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgSUlDX0lSUV9DTEFTU18wIHwgaXNyYyk7Ci0Jc3B1LT5pcnFzWzFdID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIElJQ19JUlFfQ0xBU1NfMSB8IGlzcmMpOwotCXNwdS0+aXJxc1syXSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBJSUNfSVJRX0NMQVNTXzIgfCBpc3JjKTsKLQotCS8qIFJpZ2h0IG5vdywgd2Ugb25seSBmYWlsIGlmIGNsYXNzIDIgZmFpbGVkICovCi0JcmV0dXJuIHNwdS0+aXJxc1syXSA9PSBOT19JUlEgPyAtRUlOVkFMIDogMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc3B1X21hcF9kZXZpY2Vfb2xkKHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQotewotCWNvbnN0IGNoYXIgKnByb3A7Ci0JaW50IHJldDsKLQotCXJldCA9IC1FTk9ERVY7Ci0Jc3B1LT5uYW1lID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJuYW1lIiwgTlVMTCk7Ci0JaWYgKCFzcHUtPm5hbWUpCi0JCWdvdG8gb3V0OwotCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShub2RlLCAibG9jYWwtc3RvcmUiLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCWdvdG8gb3V0OwotCXNwdS0+bG9jYWxfc3RvcmVfcGh5cyA9ICoodW5zaWduZWQgbG9uZyAqKXByb3A7Ci0KLQkvKiB3ZSB1c2UgbG9jYWwgc3RvcmUgYXMgcmFtLCBub3QgaW8gbWVtb3J5ICovCi0Jc3B1LT5sb2NhbF9zdG9yZSA9ICh2b2lkIF9fZm9yY2UgKikKLQkJbWFwX3NwZV9wcm9wKHNwdSwgbm9kZSwgImxvY2FsLXN0b3JlIik7Ci0JaWYgKCFzcHUtPmxvY2FsX3N0b3JlKQotCQlnb3RvIG91dDsKLQotCXByb3AgPSBnZXRfcHJvcGVydHkobm9kZSwgInByb2JsZW0iLCBOVUxMKTsKLQlpZiAoIXByb3ApCi0JCWdvdG8gb3V0X3VubWFwOwotCXNwdS0+cHJvYmxlbV9waHlzID0gKih1bnNpZ25lZCBsb25nICopcHJvcDsKLQotCXNwdS0+cHJvYmxlbT0gbWFwX3NwZV9wcm9wKHNwdSwgbm9kZSwgInByb2JsZW0iKTsKLQlpZiAoIXNwdS0+cHJvYmxlbSkKLQkJZ290byBvdXRfdW5tYXA7Ci0KLQlzcHUtPnByaXYxPSBtYXBfc3BlX3Byb3Aoc3B1LCBub2RlLCAicHJpdjEiKTsKLQkvKiBwcml2MSBpcyBub3QgYXZhaWxhYmxlIG9uIGEgaHlwZXJ2aXNvciAqLwotCi0Jc3B1LT5wcml2Mj0gbWFwX3NwZV9wcm9wKHNwdSwgbm9kZSwgInByaXYyIik7Ci0JaWYgKCFzcHUtPnByaXYyKQotCQlnb3RvIG91dF91bm1hcDsKLQlyZXQgPSAwOwotCWdvdG8gb3V0OwotCi1vdXRfdW5tYXA6Ci0Jc3B1X3VubWFwKHNwdSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc3B1X21hcF9pbnRlcnJ1cHRzKHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCWZvciAoaT0wOyBpIDwgMzsgaSsrKSB7Ci0JCXJldCA9IG9mX2lycV9tYXBfb25lKG5wLCBpLCAmb2lycSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlzcHUtPmlycXNbaV0gPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLAotCQkJCQlvaXJxLnNwZWNpZmllciwgb2lycS5zaXplKTsKLQkJaWYgKHNwdS0+aXJxc1tpXSA9PSBOT19JUlEpCi0JCQlnb3RvIGVycjsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlwcl9kZWJ1ZygiZmFpbGVkIHRvIG1hcCBpcnEgJXggZm9yIHNwdSAlc1xuIiwgKm9pcnEuc3BlY2lmaWVyLCBzcHUtPm5hbWUpOwotCWZvciAoOyBpID49IDA7IGktLSkgewotCQlpZiAoc3B1LT5pcnFzW2ldICE9IE5PX0lSUSkKLQkJCWlycV9kaXNwb3NlX21hcHBpbmcoc3B1LT5pcnFzW2ldKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzcHVfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IG5yLAotCQl2b2lkIF9faW9tZW0qKiB2aXJ0LCB1bnNpZ25lZCBsb25nICpwaHlzKQotewotCXN0cnVjdCByZXNvdXJjZSByZXNvdXJjZSA9IHsgfTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcmVzb3VyY2UpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHBoeXMpCi0JCSpwaHlzID0gcmVzb3VyY2Uuc3RhcnQ7Ci0JKnZpcnQgPSBpb3JlbWFwKHJlc291cmNlLnN0YXJ0LCByZXNvdXJjZS5lbmQgLSByZXNvdXJjZS5zdGFydCk7Ci0JaWYgKCEqdmlydCkKLQkJcmV0ID0gLUVJTlZBTDsKLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNwdV9tYXBfZGV2aWNlKHN0cnVjdCBzcHUgKnNwdSwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQotewotCWludCByZXQgPSAtRU5PREVWOwotCXNwdS0+bmFtZSA9IGdldF9wcm9wZXJ0eShub2RlLCAibmFtZSIsIE5VTEwpOwotCWlmICghc3B1LT5uYW1lKQotCQlnb3RvIG91dDsKLQotCXJldCA9IHNwdV9tYXBfcmVzb3VyY2Uobm9kZSwgMCwgKHZvaWQgX19pb21lbSoqKSZzcHUtPmxvY2FsX3N0b3JlLAotCQkJCQkmc3B1LT5sb2NhbF9zdG9yZV9waHlzKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQlyZXQgPSBzcHVfbWFwX3Jlc291cmNlKG5vZGUsIDEsICh2b2lkIF9faW9tZW0qKikmc3B1LT5wcm9ibGVtLAotCQkJCQkmc3B1LT5wcm9ibGVtX3BoeXMpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VubWFwOwotCXJldCA9IHNwdV9tYXBfcmVzb3VyY2Uobm9kZSwgMiwgKHZvaWQgX19pb21lbSoqKSZzcHUtPnByaXYyLAotCQkJCQlOVUxMKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF91bm1hcDsKLQotCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSkKLQkJcmV0ID0gc3B1X21hcF9yZXNvdXJjZShub2RlLCAzLCAodm9pZCBfX2lvbWVtKiopJnNwdS0+cHJpdjEsCi0JCQkJCU5VTEwpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VubWFwOwotCXJldHVybiAwOwotCi1vdXRfdW5tYXA6Ci0Jc3B1X3VubWFwKHNwdSk7Ci1vdXQ6Ci0JcHJfZGVidWcoImZhaWxlZCB0byBtYXAgc3BlICVzOiAlZFxuIiwgc3B1LT5uYW1lLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0cnVjdCBzeXNkZXZfY2xhc3Mgc3B1X3N5c2Rldl9jbGFzcyA9IHsKIAlzZXRfa3NldF9uYW1lKCJzcHUiKQogfTsKIAotc3RhdGljIHNzaXplX3Qgc3B1X3Nob3dfaXNyYyhzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjaGFyICpidWYpCitpbnQgc3B1X2FkZF9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cikKIHsKLQlzdHJ1Y3Qgc3B1ICpzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzcHUtPmlzcmMpOworCXN0cnVjdCBzcHUgKnNwdTsKKwltdXRleF9sb2NrKCZzcHVfbXV0ZXgpOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzcHUsICZzcHVfZnVsbF9saXN0LCBmdWxsX2xpc3QpCisJCXN5c2Rldl9jcmVhdGVfZmlsZSgmc3B1LT5zeXNkZXYsIGF0dHIpOworCisJbXV0ZXhfdW5sb2NrKCZzcHVfbXV0ZXgpOworCXJldHVybiAwOwogfQotc3RhdGljIFNZU0RFVl9BVFRSKGlzcmMsIDA0MDAsIHNwdV9zaG93X2lzcmMsIE5VTEwpOworRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2FkZF9zeXNkZXZfYXR0cik7CiAKLWV4dGVybiBpbnQgYXR0YWNoX3N5c2Rldl90b19ub2RlKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGludCBuaWQpOworaW50IHNwdV9hZGRfc3lzZGV2X2F0dHJfZ3JvdXAoc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cnMpCit7CisJc3RydWN0IHNwdSAqc3B1OworCW11dGV4X2xvY2soJnNwdV9tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwdSwgJnNwdV9mdWxsX2xpc3QsIGZ1bGxfbGlzdCkKKwkJc3lzZnNfY3JlYXRlX2dyb3VwKCZzcHUtPnN5c2Rldi5rb2JqLCBhdHRycyk7CisKKwltdXRleF91bmxvY2soJnNwdV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfYWRkX3N5c2Rldl9hdHRyX2dyb3VwKTsKKworCit2b2lkIHNwdV9yZW1vdmVfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpCit7CisJc3RydWN0IHNwdSAqc3B1OworCW11dGV4X2xvY2soJnNwdV9tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwdSwgJnNwdV9mdWxsX2xpc3QsIGZ1bGxfbGlzdCkKKwkJc3lzZGV2X3JlbW92ZV9maWxlKCZzcHUtPnN5c2RldiwgYXR0cik7CisKKwltdXRleF91bmxvY2soJnNwdV9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfcmVtb3ZlX3N5c2Rldl9hdHRyKTsKKwordm9pZCBzcHVfcmVtb3ZlX3N5c2Rldl9hdHRyX2dyb3VwKHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJzKQoreworCXN0cnVjdCBzcHUgKnNwdTsKKwltdXRleF9sb2NrKCZzcHVfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzcHUsICZzcHVfZnVsbF9saXN0LCBmdWxsX2xpc3QpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3B1LT5zeXNkZXYua29iaiwgYXR0cnMpOworCisJbXV0ZXhfdW5sb2NrKCZzcHVfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cCk7CiAKIHN0YXRpYyBpbnQgc3B1X2NyZWF0ZV9zeXNkZXYoc3RydWN0IHNwdSAqc3B1KQogewpAQCAtNzU2LDIxICs1NzQsMTggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoc3B1LT5pc3JjICE9IDApCi0JCXN5c2Rldl9jcmVhdGVfZmlsZSgmc3B1LT5zeXNkZXYsICZhdHRyX2lzcmMpOwotCXN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZSgmc3B1LT5zeXNkZXYsIHNwdS0+bmlkKTsKKwlzeXNmc19hZGRfZGV2aWNlX3RvX25vZGUoJnNwdS0+c3lzZGV2LCBzcHUtPm5vZGUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNwdV9kZXN0cm95X3N5c2RldihzdHJ1Y3Qgc3B1ICpzcHUpCiB7Ci0Jc3lzZGV2X3JlbW92ZV9maWxlKCZzcHUtPnN5c2RldiwgJmF0dHJfaXNyYyk7Ci0Jc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUoJnNwdS0+c3lzZGV2LCBzcHUtPm5pZCk7CisJc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUoJnNwdS0+c3lzZGV2LCBzcHUtPm5vZGUpOwogCXN5c2Rldl91bnJlZ2lzdGVyKCZzcHUtPnN5c2Rldik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGNyZWF0ZV9zcHUoc3RydWN0IGRldmljZV9ub2RlICpzcGUpCitzdGF0aWMgaW50IF9faW5pdCBjcmVhdGVfc3B1KHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNwdSAqc3B1OwogCWludCByZXQ7CkBAIC03ODEsNTAgKzU5NiwzNyBAQAogCWlmICghc3B1KQogCQlnb3RvIG91dDsKIAotCXJldCA9IHNwdV9tYXBfZGV2aWNlKHNwdSwgc3BlKTsKLQkvKiB0cnkgb2xkIG1ldGhvZCAqLwotCWlmIChyZXQpCi0JCXJldCA9IHNwdV9tYXBfZGV2aWNlX29sZChzcHUsIHNwZSk7CisJc3Bpbl9sb2NrX2luaXQoJnNwdS0+cmVnaXN0ZXJfbG9jayk7CisJbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKKwlzcHUtPm51bWJlciA9IG51bWJlcisrOworCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKKworCXJldCA9IHNwdV9jcmVhdGVfc3B1KHNwdSwgZGF0YSk7CisKIAlpZiAocmV0KQogCQlnb3RvIG91dF9mcmVlOwogCi0Jc3B1LT5ub2RlID0gZmluZF9zcHVfbm9kZV9pZChzcGUpOwotCXNwdS0+bmlkID0gb2Zfbm9kZV90b19uaWQoc3BlKTsKLQlpZiAoc3B1LT5uaWQgPT0gLTEpCi0JCXNwdS0+bmlkID0gMDsKLQlyZXQgPSBzcHVfbWFwX2ludGVycnVwdHMoc3B1LCBzcGUpOwotCWlmIChyZXQpCi0JCXJldCA9IHNwdV9tYXBfaW50ZXJydXB0c19vbGQoc3B1LCBzcGUpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VubWFwOwotCXNwaW5fbG9ja19pbml0KCZzcHUtPnJlZ2lzdGVyX2xvY2spOwotCXNwdV9tZmNfc2RyX3NldChzcHUsIG1mc3ByKFNQUk5fU0RSMSkpOworCXNwdV9tZmNfc2RyX3NldHVwKHNwdSk7CiAJc3B1X21mY19zcjFfc2V0KHNwdSwgMHgzMyk7Ci0JbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKLQotCXNwdS0+bnVtYmVyID0gbnVtYmVyKys7CiAJcmV0ID0gc3B1X3JlcXVlc3RfaXJxcyhzcHUpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfZGVzdHJveTsKIAogCXJldCA9IHNwdV9jcmVhdGVfc3lzZGV2KHNwdSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZnJlZV9pcnFzOwogCisJbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKIAlsaXN0X2FkZCgmc3B1LT5saXN0LCAmc3B1X2xpc3Rbc3B1LT5ub2RlXSk7CisJbGlzdF9hZGQoJnNwdS0+ZnVsbF9saXN0LCAmc3B1X2Z1bGxfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZzcHVfbXV0ZXgpOwogCi0JcHJfZGVidWcoS0VSTl9ERUJVRyAiVXNpbmcgU1BFICVzICUwMnggJXAgJXAgJXAgJXAgJWRcbiIsCi0JCXNwdS0+bmFtZSwgc3B1LT5pc3JjLCBzcHUtPmxvY2FsX3N0b3JlLAotCQlzcHUtPnByb2JsZW0sIHNwdS0+cHJpdjEsIHNwdS0+cHJpdjIsIHNwdS0+bnVtYmVyKTsKIAlnb3RvIG91dDsKIAogb3V0X2ZyZWVfaXJxczoKIAlzcHVfZnJlZV9pcnFzKHNwdSk7Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKLW91dF91bm1hcDoKLQlzcHVfdW5tYXAoc3B1KTsKK291dF9kZXN0cm95OgorCXNwdV9kZXN0cm95X3NwdShzcHUpOwogb3V0X2ZyZWU6CiAJa2ZyZWUoc3B1KTsKIG91dDoKQEAgLTgzNCwxMCArNjM2LDExIEBACiBzdGF0aWMgdm9pZCBkZXN0cm95X3NwdShzdHJ1Y3Qgc3B1ICpzcHUpCiB7CiAJbGlzdF9kZWxfaW5pdCgmc3B1LT5saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZzcHUtPmZ1bGxfbGlzdCk7CiAKIAlzcHVfZGVzdHJveV9zeXNkZXYoc3B1KTsKIAlzcHVfZnJlZV9pcnFzKHNwdSk7Ci0Jc3B1X3VubWFwKHNwdSk7CisJc3B1X2Rlc3Ryb3lfc3B1KHNwdSk7CiAJa2ZyZWUoc3B1KTsKIH0KIApAQCAtODU4LDkgKzY2MSwxMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwdV9iYXNlKHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCWludCBpLCByZXQ7CiAKKwlpZiAoIXNwdV9tYW5hZ2VtZW50X29wcykKKwkJcmV0dXJuIDA7CisKIAkvKiBjcmVhdGUgc3lzZGV2IGNsYXNzIGZvciBzcHVzICovCiAJcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZzcHVfc3lzZGV2X2NsYXNzKTsKIAlpZiAocmV0KQpAQCAtODY5LDE3ICs2NzQsMTcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspCiAJCUlOSVRfTElTVF9IRUFEKCZzcHVfbGlzdFtpXSk7CiAKLQlyZXQgPSAtRU5PREVWOwotCWZvciAobm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJzcGUiKTsKLQkJCW5vZGU7IG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShub2RlLCAic3BlIikpIHsKLQkJcmV0ID0gY3JlYXRlX3NwdShub2RlKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIGluaXRpYWxpemluZyAlc1xuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUpOwotCQkJY2xlYW51cF9zcHVfYmFzZSgpOwotCQkJYnJlYWs7Ci0JCX0KKwlyZXQgPSBzcHVfZW51bWVyYXRlX3NwdXMoY3JlYXRlX3NwdSk7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBpbml0aWFsaXppbmcgc3B1c1xuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisJCWNsZWFudXBfc3B1X2Jhc2UoKTsKKwkJcmV0dXJuIHJldDsKIAl9CisKKwl4bW9uX3JlZ2lzdGVyX3NwdXMoJnNwdV9mdWxsX2xpc3QpOworCiAJcmV0dXJuIHJldDsKIH0KIG1vZHVsZV9pbml0KGluaXRfc3B1X2Jhc2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jb3JlZHVtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jb3JlZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTViNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NvcmVkdW1wLmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIFNQVSBjb3JlIGR1bXAgY29kZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBJQk0gQ29ycC4KKyAqCisgKiBBdXRob3I6IER3YXluZSBHcmFudCBNY0Nvbm5lbGwgPGRlY2ltYWxAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+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+c3RhdGVfc2VtYSk7CisJLyogY3R4IGlzIGFib3V0IHRvIGJlIGZyZWVkLCBjYW4ndCBhY3F1aXJlIGFueSBtb3JlICovCisJaWYgKCFjdHgtPm93bmVyKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9TQVZFRCkgeworCQlyZXQgPSBzcHVfYWN0aXZhdGUoY3R4LCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCQljdHgtPnN0YXRlID0gU1BVX1NUQVRFX1JVTk5BQkxFOworCX0gZWxzZSB7CisJCS8qIFdlIG5lZWQgdG8gZXhjbHVkZSB1c2Vyc3BhY2UgYWNjZXNzIHRvIHRoZSBjb250ZXh0LiAqLworCQlzcHVfdW5tYXBfbWFwcGluZ3MoY3R4KTsKKwl9CisKK291dDoKKwlpZiAocmV0KQorCQl1cF93cml0ZSgmY3R4LT5zdGF0ZV9zZW1hKTsKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgc3B1X2FjcXVpcmVfcnVubmFibGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CiAJaW50IHJldCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29yZWR1bXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb3JlZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWUxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29yZWR1bXAuYwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIFNQVSBjb3JlIGR1bXAgY29kZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBJQk0gQ29ycC4KKyAqCisgKiBBdXRob3I6IER3YXluZSBHcmFudCBNY0Nvbm5lbGwgPGRlY2ltYWxAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJzcHVmcy5oIgorCitzdHJ1Y3Qgc3B1ZnNfY3R4X2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgZGZkOworCWludCBtZW1zaXplOyAvKiBpbiBieXRlcyAqLworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OworfTsKKworc3RhdGljIExJU1RfSEVBRChjdHhfaW5mb19saXN0KTsKKworc3RhdGljIHNzaXplX3QgZG9fY29yZWR1bXBfcmVhZChpbnQgbnVtLCBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCQlzaXplX3Qgc2l6ZSwgbG9mZl90ICpvZmYpCit7CisJdTY0IGRhdGE7CisJaW50IHJldDsKKworCWlmIChzcHVmc19jb3JlZHVtcF9yZWFkW251bV0ucmVhZCkKKwkJcmV0dXJuIHNwdWZzX2NvcmVkdW1wX3JlYWRbbnVtXS5yZWFkKGN0eCwgYnVmZmVyLCBzaXplLCBvZmYpOworCisJZGF0YSA9IHNwdWZzX2NvcmVkdW1wX3JlYWRbbnVtXS5nZXQoY3R4KTsKKwlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmZmVyLCAmZGF0YSwgOCk7CisJcmV0dXJuIHJldCA/IC1FRkFVTFQgOiA4OworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBvbmx5IHRoaW5ncyB5b3Ugc2hvdWxkIGRvIG9uIGEgY29yZS1maWxlOiB1c2Ugb25seSB0aGVzZQorICogZnVuY3Rpb25zIHRvIHdyaXRlIG91dCBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvLgorICovCitzdGF0aWMgaW50IHNwdWZzX2R1bXBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHZvaWQgKmFkZHIsIGludCBucikKK3sKKwlyZXR1cm4gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSwgYWRkciwgbnIsICZmaWxlLT5mX3BvcykgPT0gbnI7Cit9CisKK3N0YXRpYyBpbnQgc3B1ZnNfZHVtcF9zZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2ZmKQoreworCWlmIChmaWxlLT5mX29wLT5sbHNlZWspIHsKKwkJaWYgKGZpbGUtPmZfb3AtPmxsc2VlayhmaWxlLCBvZmYsIDApICE9IG9mZikKKwkJCXJldHVybiAwOworCX0gZWxzZQorCQlmaWxlLT5mX3BvcyA9IG9mZjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc3B1ZnNfZmlsbF9tZW1zaXplKHN0cnVjdCBzcHVmc19jdHhfaW5mbyAqY3R4X2luZm8pCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisJdW5zaWduZWQgbG9uZyBsb25nIGxzbHI7CisKKwljdHggPSBjdHhfaW5mby0+Y3R4OworCWxzbHIgPSBjdHgtPmNzYS5wcml2Mi5zcHVfbHNscl9SVzsKKwljdHhfaW5mby0+bWVtc2l6ZSA9IGxzbHIgKyAxOworfQorCitzdGF0aWMgaW50IHNwdWZzX2N0eF9ub3RlX3NpemUoc3RydWN0IHNwdWZzX2N0eF9pbmZvICpjdHhfaW5mbykKK3sKKwlpbnQgZGZkLCBtZW1zaXplLCBpLCBzeiwgdG90YWwgPSAwOworCWNoYXIgKm5hbWU7CisJY2hhciBmdWxsbmFtZVs4MF07CisKKwlkZmQgPSBjdHhfaW5mby0+ZGZkOworCW1lbXNpemUgPSBjdHhfaW5mby0+bWVtc2l6ZTsKKworCWZvciAoaSA9IDA7IHNwdWZzX2NvcmVkdW1wX3JlYWRbaV0ubmFtZTsgaSsrKSB7CisJCW5hbWUgPSBzcHVmc19jb3JlZHVtcF9yZWFkW2ldLm5hbWU7CisJCXN6ID0gc3B1ZnNfY29yZWR1bXBfcmVhZFtpXS5zaXplOworCisJCXNwcmludGYoZnVsbG5hbWUsICJTUFUvJWQvJXMiLCBkZmQsIG5hbWUpOworCisJCXRvdGFsICs9IHNpemVvZihzdHJ1Y3QgZWxmX25vdGUpOworCQl0b3RhbCArPSByb3VuZHVwKHN0cmxlbihmdWxsbmFtZSkgKyAxLCA0KTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgIm1lbSIpKQorCQkJdG90YWwgKz0gcm91bmR1cChtZW1zaXplLCA0KTsKKwkJZWxzZQorCQkJdG90YWwgKz0gcm91bmR1cChzeiwgNCk7CisJfQorCisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgaW50IHNwdWZzX2FkZF9vbmVfY29udGV4dChzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRmZCkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3Qgc3B1ZnNfY3R4X2luZm8gKmN0eF9pbmZvOworCWludCBzaXplOworCisJY3R4ID0gU1BVRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmlfY3R4OworCWlmIChjdHgtPmZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQorCQlyZXR1cm4gMDsKKworCWN0eF9pbmZvID0ga3phbGxvYyhzaXplb2YoKmN0eF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFjdHhfaW5mbykpCisJCXJldHVybiAtRU5PTUVNOworCisJY3R4X2luZm8tPmRmZCA9IGRmZDsKKwljdHhfaW5mby0+Y3R4ID0gY3R4OworCisJc3B1ZnNfZmlsbF9tZW1zaXplKGN0eF9pbmZvKTsKKworCXNpemUgPSBzcHVmc19jdHhfbm90ZV9zaXplKGN0eF9pbmZvKTsKKwlsaXN0X2FkZCgmY3R4X2luZm8tPmxpc3QsICZjdHhfaW5mb19saXN0KTsKKwlyZXR1cm4gc2l6ZTsKK30KKworLyoKKyAqIFRoZSBhZGRpdGlvbmFsIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBub3RlcyBmb3IgQ2VsbCBhcmUgdmFyaW91cworICogY29udGV4dCBmaWxlcyBpbiB0aGUgc3B1IGNvbnRleHQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyBvdmVyIGFsbCBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHNlZXMKKyAqIGlmIHRoZXkgYXJlIGEgZGlyZWN0b3J5IGluIHNwdWZzLiAgSW4gdGhhdCBjYXNlIHdlIHVzZSBzcHVmcworICogaW50ZXJuYWwgZnVuY3Rpb25hbGl0eSB0byBkdW1wIHRoZW0gd2l0aG91dCBuZWVkaW5nIHRvIGFjdHVhbGx5CisgKiBvcGVuIHRoZSBmaWxlcy4KKyAqLworc3RhdGljIGludCBzcHVmc19hcmNoX25vdGVzX3NpemUodm9pZCkKK3sKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJaW50IHNpemUgPSAwLCBmZDsKKworCWZvciAoZmQgPSAwOyBmZCA8IGZkdC0+bWF4X2ZkczsgZmQrKykgeworCQlpZiAoRkRfSVNTRVQoZmQsIGZkdC0+b3Blbl9mZHMpKSB7CisJCQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZjaGVjayhmZCk7CisKKwkJCWlmIChmaWxlICYmIGZpbGUtPmZfb3AgPT0gJnNwdWZzX2NvbnRleHRfZm9wcykgeworCQkJCWludCBydmFsID0gc3B1ZnNfYWRkX29uZV9jb250ZXh0KGZpbGUsIGZkKTsKKwkJCQlpZiAocnZhbCA8IDApCisJCQkJCWJyZWFrOworCQkJCXNpemUgKz0gcnZhbDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCBzcHVmc19hcmNoX3dyaXRlX25vdGUoc3RydWN0IHNwdWZzX2N0eF9pbmZvICpjdHhfaW5mbywgaW50IGksCisJCQkJc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisJbG9mZl90IHBvcyA9IDA7CisJaW50IHN6LCBkZmQsIHJjLCB0b3RhbCA9IDA7CisJY29uc3QgaW50IGJ1ZnN6ID0gNDA5NjsKKwljaGFyICpuYW1lOworCWNoYXIgZnVsbG5hbWVbODBdLCAqYnVmOworCXN0cnVjdCBlbGZfbm90ZSBlbjsKKworCWJ1ZiA9IGttYWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwlkZmQgPSBjdHhfaW5mby0+ZGZkOworCW5hbWUgPSBzcHVmc19jb3JlZHVtcF9yZWFkW2ldLm5hbWU7CisKKwlpZiAoIXN0cmNtcChuYW1lLCAibWVtIikpCisJCXN6ID0gY3R4X2luZm8tPm1lbXNpemU7CisJZWxzZQorCQlzeiA9IHNwdWZzX2NvcmVkdW1wX3JlYWRbaV0uc2l6ZTsKKworCWN0eCA9IGN0eF9pbmZvLT5jdHg7CisJaWYgKCFjdHgpIHsKKwkJcmV0dXJuOworCX0KKworCXNwcmludGYoZnVsbG5hbWUsICJTUFUvJWQvJXMiLCBkZmQsIG5hbWUpOworCWVuLm5fbmFtZXN6ID0gc3RybGVuKGZ1bGxuYW1lKSArIDE7CisJZW4ubl9kZXNjc3ogPSBzejsKKwllbi5uX3R5cGUgPSBOVF9TUFU7CisKKwlpZiAoIXNwdWZzX2R1bXBfd3JpdGUoZmlsZSwgJmVuLCBzaXplb2YoZW4pKSkKKwkJcmV0dXJuOworCWlmICghc3B1ZnNfZHVtcF93cml0ZShmaWxlLCBmdWxsbmFtZSwgZW4ubl9uYW1lc3opKQorCQlyZXR1cm47CisJaWYgKCFzcHVmc19kdW1wX3NlZWsoZmlsZSwgcm91bmR1cCgodW5zaWduZWQgbG9uZylmaWxlLT5mX3BvcywgNCkpKQorCQlyZXR1cm47CisKKwlkbyB7CisJCXJjID0gZG9fY29yZWR1bXBfcmVhZChpLCBjdHgsIGJ1ZiwgYnVmc3osICZwb3MpOworCQlpZiAocmMgPiAwKSB7CisJCQlpZiAoIXNwdWZzX2R1bXBfd3JpdGUoZmlsZSwgYnVmLCByYykpCisJCQkJcmV0dXJuOworCQkJdG90YWwgKz0gcmM7CisJCX0KKwl9IHdoaWxlIChyYyA9PSBidWZzeiAmJiB0b3RhbCA8IHN6KTsKKworCXNwdWZzX2R1bXBfc2VlayhmaWxlLCByb3VuZHVwKCh1bnNpZ25lZCBsb25nKWZpbGUtPmZfcG9zCisJCQkJCQktIHRvdGFsICsgc3osIDQpKTsKK30KKworc3RhdGljIHZvaWQgc3B1ZnNfYXJjaF93cml0ZV9ub3RlcyhzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgajsKKwlzdHJ1Y3Qgc3B1ZnNfY3R4X2luZm8gKmN0eF9pbmZvLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdHhfaW5mbywgbmV4dCwgJmN0eF9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4X2luZm8tPmN0eCk7CisJCWZvciAoaiA9IDA7IGogPCBzcHVmc19jb3JlZHVtcF9udW1fbm90ZXM7IGorKykKKwkJCXNwdWZzX2FyY2hfd3JpdGVfbm90ZShjdHhfaW5mbywgaiwgZmlsZSk7CisJCXNwdV9yZWxlYXNlKGN0eF9pbmZvLT5jdHgpOworCQlsaXN0X2RlbCgmY3R4X2luZm8tPmxpc3QpOworCQlrZnJlZShjdHhfaW5mbyk7CisJfQorfQorCitzdHJ1Y3Qgc3B1X2NvcmVkdW1wX2NhbGxzIHNwdWZzX2NvcmVkdW1wX2NhbGxzID0geworCS5hcmNoX25vdGVzX3NpemUgPSBzcHVmc19hcmNoX25vdGVzX3NpemUsCisJLmFyY2hfd3JpdGVfbm90ZXMgPSBzcHVmc19hcmNoX3dyaXRlX25vdGVzLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCmluZGV4IGUwZDczMDAuLjM0N2VmZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwpAQCAtMzIsMTMgKzMyLDEzIEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KKyNpbmNsdWRlIDxhc20vc3B1X2luZm8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAic3B1ZnMuaCIKIAogI2RlZmluZSBTUFVGU19NTUFQXzRLIChQQUdFX1NJWkUgPT0gMHgxMDAwKQogCi0KIHN0YXRpYyBpbnQKIHNwdWZzX21lbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewpAQCAtNTEsMTggKzUxLDIzIEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90CitfX3NwdWZzX21lbV9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IHNpemUsIGxvZmZfdCAqcG9zKQoreworCWNoYXIgKmxvY2FsX3N0b3JlID0gY3R4LT5vcHMtPmdldF9scyhjdHgpOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIHNpemUsIHBvcywgbG9jYWxfc3RvcmUsCisJCQkJCUxTX1NJWkUpOworfQorCitzdGF0aWMgc3NpemVfdAogc3B1ZnNfbWVtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCiAJCQkJc2l6ZV90IHNpemUsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKmxvY2FsX3N0b3JlOwogCWludCByZXQ7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlzcHVfYWNxdWlyZShjdHgpOwotCi0JbG9jYWxfc3RvcmUgPSBjdHgtPm9wcy0+Z2V0X2xzKGN0eCk7Ci0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmZmVyLCBzaXplLCBwb3MsIGxvY2FsX3N0b3JlLCBMU19TSVpFKTsKLQorCXJldCA9IF9fc3B1ZnNfbWVtX3JlYWQoY3R4LCBidWZmZXIsIHNpemUsIHBvcyk7CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA0LDExICsxMDksMTEgQEAKIAogCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9TQVZFRCkgewogCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpCi0JCQkJCSYgfihfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpKTsKKwkJCQkJCQkmIH5fUEFHRV9OT19DQUNIRSk7CiAJCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoY3R4LT5jc2EubHNjc2EtPmxzICsgb2Zmc2V0KTsKIAl9IGVsc2UgewogCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpCi0JCQkJCXwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKKwkJCQkJCQl8IF9QQUdFX05PX0NBQ0hFKTsKIAkJcGFnZSA9IHBmbl90b19wYWdlKChjdHgtPnNwdS0+bG9jYWxfc3RvcmVfcGh5cyArIG9mZnNldCkKIAkJCQkgICA+PiBQQUdFX1NISUZUKTsKIAl9CkBAIC0xMzEsNyArMTM2LDcgQEAKIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBGSVhNRTogKi8KKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKIAkJCQkgICAgIHwgX1BBR0VfTk9fQ0FDSEUpOwogCkBAIC0yMDAsNyArMjA1LDcgQEAKIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdChwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KQogCQkJCSAgICAgfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOwogCkBAIC0yNDYsNiArMjUxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfY250bF9mb3BzID0gewogCS5vcGVuID0gc3B1ZnNfY250bF9vcGVuLAorCS5yZWxlYXNlID0gc2ltcGxlX2F0dHJfY2xvc2UsCiAJLnJlYWQgPSBzaW1wbGVfYXR0cl9yZWFkLAogCS53cml0ZSA9IHNpbXBsZV9hdHRyX3dyaXRlLAogCS5tbWFwID0gc3B1ZnNfY250bF9tbWFwLApAQCAtMjYwLDE4ICsyNjYsMjMgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKK19fc3B1ZnNfcmVnc19yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IHNpemUsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgc2l6ZSwgcG9zLAorCQkJCSAgICAgIGxzY3NhLT5ncHJzLCBzaXplb2YgbHNjc2EtPmdwcnMpOworfQorCitzdGF0aWMgc3NpemVfdAogc3B1ZnNfcmVnc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQlzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNwdV9sc2NzYSAqbHNjc2EgPSBjdHgtPmNzYS5sc2NzYTsKIAlpbnQgcmV0OworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKLQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgc2l6ZSwgcG9zLAotCQkJCSAgICAgIGxzY3NhLT5ncHJzLCBzaXplb2YgbHNjc2EtPmdwcnMpOwotCisJcmV0ID0gX19zcHVmc19yZWdzX3JlYWQoY3R4LCBidWZmZXIsIHNpemUsIHBvcyk7CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzA2LDE4ICszMTcsMjMgQEAKIH07CiAKIHN0YXRpYyBzc2l6ZV90CitfX3NwdWZzX2ZwY3JfcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQlzaXplX3Qgc2l6ZSwgbG9mZl90ICogcG9zKQoreworCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgc2l6ZSwgcG9zLAorCQkJCSAgICAgICZsc2NzYS0+ZnBjciwgc2l6ZW9mKGxzY3NhLT5mcGNyKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CiBzcHVmc19mcGNyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogYnVmZmVyLAogCQlzaXplX3Qgc2l6ZSwgbG9mZl90ICogcG9zKQogewotCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CiAJaW50IHJldDsKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIHNpemUsIHBvcywKLQkJCQkgICAgICAmbHNjc2EtPmZwY3IsIHNpemVvZihsc2NzYS0+ZnBjcikpOwotCisJcmV0ID0gX19zcHVmc19mcGNyX3JlYWQoY3R4LCBidWZmZXIsIHNpemUsIHBvcyk7CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzg0LDcgKzQwMCw3IEBACiAJdWRhdGEgPSAodm9pZCBfX3VzZXIgKilidWY7CiAKIAlzcHVfYWNxdWlyZShjdHgpOwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8PSBsZW47IGNvdW50ICs9IDQsIHVkYXRhKyspIHsKKwlmb3IgKGNvdW50ID0gMDsgKGNvdW50ICsgNCkgPD0gbGVuOyBjb3VudCArPSA0LCB1ZGF0YSsrKSB7CiAJCWludCByZXQ7CiAJCXJldCA9IGN0eC0+b3BzLT5tYm94X3JlYWQoY3R4LCAmbWJveF9kYXRhKTsKIAkJaWYgKHJldCA9PSAwKQpAQCAtNzE3LDIzICs3MzMsNDEgQEAKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNwdWZzX3NpZ25hbDFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfc2lnbmFsMV9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCBjaGFyIF9fdXNlciAqYnVmLAogCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IDA7CiAJdTMyIGRhdGE7CiAKIAlpZiAobGVuIDwgNCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcHVfYWNxdWlyZShjdHgpOwotCWRhdGEgPSBjdHgtPm9wcy0+c2lnbmFsMV9yZWFkKGN0eCk7Ci0Jc3B1X3JlbGVhc2UoY3R4KTsKKwlpZiAoY3R4LT5jc2Euc3B1X2NobmxjbnRfUldbM10pIHsKKwkJZGF0YSA9IGN0eC0+Y3NhLnNwdV9jaG5sZGF0YV9SV1szXTsKKwkJcmV0ID0gNDsKKwl9CisKKwlpZiAoIXJldCkKKwkJZ290byBvdXQ7CiAKIAlpZiAoY29weV90b191c2VyKGJ1ZiwgJmRhdGEsIDQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiA0Oworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX3NpZ25hbDFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCWludCByZXQ7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXJldCA9IF9fc3B1ZnNfc2lnbmFsMV9yZWFkKGN0eCwgYnVmLCBsZW4sIHBvcyk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNwdWZzX3NpZ25hbDFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCkBAIC03ODEsNyArODE1LDcgQEAKIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdChwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KQogCQkJCSAgICAgfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOwogCkBAIC04MDYsMjUgKzg0MCw0MSBAQAogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3B1ZnNfc2lnbmFsMl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorc3RhdGljIHNzaXplX3QgX19zcHVmc19zaWduYWwyX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIGNoYXIgX191c2VyICpidWYsCiAJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKKwlpbnQgcmV0ID0gMDsKIAl1MzIgZGF0YTsKIAotCWN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQogCWlmIChsZW4gPCA0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwdV9hY3F1aXJlKGN0eCk7Ci0JZGF0YSA9IGN0eC0+b3BzLT5zaWduYWwyX3JlYWQoY3R4KTsKLQlzcHVfcmVsZWFzZShjdHgpOworCWlmIChjdHgtPmNzYS5zcHVfY2hubGNudF9SV1s0XSkgeworCQlkYXRhID0gIGN0eC0+Y3NhLnNwdV9jaG5sZGF0YV9SV1s0XTsKKwkJcmV0ID0gNDsKKwl9CisKKwlpZiAoIXJldCkKKwkJZ290byBvdXQ7CiAKIAlpZiAoY29weV90b191c2VyKGJ1ZiwgJmRhdGEsIDQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiA0Oworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX3NpZ25hbDJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXJldCA9IF9fc3B1ZnNfc2lnbmFsMl9yZWFkKGN0eCwgYnVmLCBsZW4sIHBvcyk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNwdWZzX3NpZ25hbDJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCkBAIC04NzMsOCArOTIzLDcgQEAKIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBGSVhNRTogKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdChwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KQogCQkJCSAgICAgfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOwogCkBAIC05MDEsMTMgKzk1MCwxOSBAQAogCXNwdV9yZWxlYXNlKGN0eCk7CiB9CiAKK3N0YXRpYyB1NjQgX19zcHVmc19zaWduYWwxX3R5cGVfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXJldHVybiBjdHgtPm9wcy0+c2lnbmFsMV90eXBlX2dldChjdHgpOworfQorCiBzdGF0aWMgdTY0IHNwdWZzX3NpZ25hbDFfdHlwZV9nZXQodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CiAJdTY0IHJldDsKIAogCXNwdV9hY3F1aXJlKGN0eCk7Ci0JcmV0ID0gY3R4LT5vcHMtPnNpZ25hbDFfdHlwZV9nZXQoY3R4KTsKKwlyZXQgPSBfX3NwdWZzX3NpZ25hbDFfdHlwZV9nZXQoZGF0YSk7CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAogCXJldHVybiByZXQ7CkBAIC05MjQsMTMgKzk3OSwxOSBAQAogCXNwdV9yZWxlYXNlKGN0eCk7CiB9CiAKK3N0YXRpYyB1NjQgX19zcHVmc19zaWduYWwyX3R5cGVfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXJldHVybiBjdHgtPm9wcy0+c2lnbmFsMl90eXBlX2dldChjdHgpOworfQorCiBzdGF0aWMgdTY0IHNwdWZzX3NpZ25hbDJfdHlwZV9nZXQodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CiAJdTY0IHJldDsKIAogCXNwdV9hY3F1aXJlKGN0eCk7Ci0JcmV0ID0gY3R4LT5vcHMtPnNpZ25hbDJfdHlwZV9nZXQoY3R4KTsKKwlyZXQgPSBfX3NwdWZzX3NpZ25hbDJfdHlwZV9nZXQoZGF0YSk7CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAogCXJldHVybiByZXQ7CkBAIC05NTcsNyArMTAxOCw3IEBACiAJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKIAkJCQkgICAgIHwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKIApAQCAtOTk5LDcgKzEwNjAsNyBAQAogCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpCiAJCQkJICAgICB8IF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7CiAKQEAgLTEwNDAsNyArMTEwMSw3IEBACiAJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKIAkJCQkgICAgIHwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKIApAQCAtMTI2NCw2ICsxMzI1LDcgQEAKIAkJZ290byBvdXQ7CiAKIAljdHgtPnRhZ3dhaXQgfD0gMSA8PCBjbWQudGFnOworCXJldCA9IHNpemU7CiAKIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtMTM1OSw3ICsxNDIxLDggQEAKIAlzcHVfcmVsZWFzZShjdHgpOwogCXJldHVybiByZXQ7CiB9Ci1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19ucGNfb3BzLCBzcHVmc19ucGNfZ2V0LCBzcHVmc19ucGNfc2V0LCAiJWxseFxuIikKK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX25wY19vcHMsIHNwdWZzX25wY19nZXQsIHNwdWZzX25wY19zZXQsCisJCQkiMHglbGx4XG4iKQogCiBzdGF0aWMgdm9pZCBzcHVmc19kZWNyX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQogewpAQCAtMTM3MCwxOCArMTQzMywyNCBAQAogCXNwdV9yZWxlYXNlKGN0eCk7CiB9CiAKLXN0YXRpYyB1NjQgc3B1ZnNfZGVjcl9nZXQodm9pZCAqZGF0YSkKK3N0YXRpYyB1NjQgX19zcHVmc19kZWNyX2dldCh2b2lkICpkYXRhKQogewogCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKIAlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOworCXJldHVybiBsc2NzYS0+ZGVjci5zbG90WzBdOworfQorCitzdGF0aWMgdTY0IHNwdWZzX2RlY3JfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwogCXU2NCByZXQ7CiAJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKLQlyZXQgPSBsc2NzYS0+ZGVjci5zbG90WzBdOworCXJldCA9IF9fc3B1ZnNfZGVjcl9nZXQoZGF0YSk7CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAlyZXR1cm4gcmV0OwogfQogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3B1ZnNfZGVjcl9vcHMsIHNwdWZzX2RlY3JfZ2V0LCBzcHVmc19kZWNyX3NldCwKLQkJCSIlbGx4XG4iKQorCQkJIjB4JWxseFxuIikKIAogc3RhdGljIHZvaWQgc3B1ZnNfZGVjcl9zdGF0dXNfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCiB7CkBAIC0xMzkyLDQwICsxNDYxLDI0IEBACiAJc3B1X3JlbGVhc2UoY3R4KTsKIH0KIAotc3RhdGljIHU2NCBzcHVmc19kZWNyX3N0YXR1c19nZXQodm9pZCAqZGF0YSkKK3N0YXRpYyB1NjQgX19zcHVmc19kZWNyX3N0YXR1c19nZXQodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CiAJc3RydWN0IHNwdV9sc2NzYSAqbHNjc2EgPSBjdHgtPmNzYS5sc2NzYTsKKwlyZXR1cm4gbHNjc2EtPmRlY3Jfc3RhdHVzLnNsb3RbMF07Cit9CisKK3N0YXRpYyB1NjQgc3B1ZnNfZGVjcl9zdGF0dXNfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwogCXU2NCByZXQ7CiAJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKLQlyZXQgPSBsc2NzYS0+ZGVjcl9zdGF0dXMuc2xvdFswXTsKKwlyZXQgPSBfX3NwdWZzX2RlY3Jfc3RhdHVzX2dldChkYXRhKTsKIAlzcHVfcmVsZWFzZShjdHgpOwogCXJldHVybiByZXQ7CiB9CiBERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19kZWNyX3N0YXR1c19vcHMsIHNwdWZzX2RlY3Jfc3RhdHVzX2dldCwKLQkJCXNwdWZzX2RlY3Jfc3RhdHVzX3NldCwgIiVsbHhcbiIpCi0KLXN0YXRpYyB2b2lkIHNwdWZzX3NwdV90YWdfbWFza19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKLXsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7Ci0Jc3RydWN0IHNwdV9sc2NzYSAqbHNjc2EgPSBjdHgtPmNzYS5sc2NzYTsKLQlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOwotCWxzY3NhLT50YWdfbWFzay5zbG90WzBdID0gKHUzMikgdmFsOwotCXNwdV9yZWxlYXNlKGN0eCk7Ci19Ci0KLXN0YXRpYyB1NjQgc3B1ZnNfc3B1X3RhZ19tYXNrX2dldCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKLQlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYSA9IGN0eC0+Y3NhLmxzY3NhOwotCXU2NCByZXQ7Ci0Jc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKLQlyZXQgPSBsc2NzYS0+dGFnX21hc2suc2xvdFswXTsKLQlzcHVfcmVsZWFzZShjdHgpOwotCXJldHVybiByZXQ7Ci19Ci1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19zcHVfdGFnX21hc2tfb3BzLCBzcHVmc19zcHVfdGFnX21hc2tfZ2V0LAotCQkJc3B1ZnNfc3B1X3RhZ19tYXNrX3NldCwgIiVsbHhcbiIpCisJCQlzcHVmc19kZWNyX3N0YXR1c19zZXQsICIweCVsbHhcbiIpCiAKIHN0YXRpYyB2b2lkIHNwdWZzX2V2ZW50X21hc2tfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCiB7CkBAIC0xNDM2LDE4ICsxNDg5LDQ4IEBACiAJc3B1X3JlbGVhc2UoY3R4KTsKIH0KIAotc3RhdGljIHU2NCBzcHVmc19ldmVudF9tYXNrX2dldCh2b2lkICpkYXRhKQorc3RhdGljIHU2NCBfX3NwdWZzX2V2ZW50X21hc2tfZ2V0KHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwogCXN0cnVjdCBzcHVfbHNjc2EgKmxzY3NhID0gY3R4LT5jc2EubHNjc2E7CisJcmV0dXJuIGxzY3NhLT5ldmVudF9tYXNrLnNsb3RbMF07Cit9CisKK3N0YXRpYyB1NjQgc3B1ZnNfZXZlbnRfbWFza19nZXQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CiAJdTY0IHJldDsKIAlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOwotCXJldCA9IGxzY3NhLT5ldmVudF9tYXNrLnNsb3RbMF07CisJcmV0ID0gX19zcHVmc19ldmVudF9tYXNrX2dldChkYXRhKTsKIAlzcHVfcmVsZWFzZShjdHgpOwogCXJldHVybiByZXQ7CiB9CiBERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19ldmVudF9tYXNrX29wcywgc3B1ZnNfZXZlbnRfbWFza19nZXQsCi0JCQlzcHVmc19ldmVudF9tYXNrX3NldCwgIiVsbHhcbiIpCisJCQlzcHVmc19ldmVudF9tYXNrX3NldCwgIjB4JWxseFxuIikKKworc3RhdGljIHU2NCBfX3NwdWZzX2V2ZW50X3N0YXR1c19nZXQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CisJc3RydWN0IHNwdV9zdGF0ZSAqc3RhdGUgPSAmY3R4LT5jc2E7CisJdTY0IHN0YXQ7CisJc3RhdCA9IHN0YXRlLT5zcHVfY2hubGNudF9SV1swXTsKKwlpZiAoc3RhdCkKKwkJcmV0dXJuIHN0YXRlLT5zcHVfY2hubGRhdGFfUldbMF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgc3B1ZnNfZXZlbnRfc3RhdHVzX2dldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKKwl1NjQgcmV0ID0gMDsKKworCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7CisJcmV0ID0gX19zcHVmc19ldmVudF9zdGF0dXNfZ2V0KGRhdGEpOworCXNwdV9yZWxlYXNlKGN0eCk7CisJcmV0dXJuIHJldDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX2V2ZW50X3N0YXR1c19vcHMsIHNwdWZzX2V2ZW50X3N0YXR1c19nZXQsCisJCQlOVUxMLCAiMHglbGx4XG4iKQogCiBzdGF0aWMgdm9pZCBzcHVmc19zcnIwX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQogewpAQCAtMTQ2OSw3ICsxNTUyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3B1ZnNfc3JyMF9vcHMsIHNwdWZzX3NycjBfZ2V0LCBzcHVmc19zcnIwX3NldCwKLQkJCSIlbGx4XG4iKQorCQkJIjB4JWxseFxuIikKIAogc3RhdGljIHU2NCBzcHVmc19pZF9nZXQodm9pZCAqZGF0YSkKIHsKQEAgLTE0ODcsMTIgKzE1NzAsMTggQEAKIH0KIERFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX2lkX29wcywgc3B1ZnNfaWRfZ2V0LCBOVUxMLCAiMHglbGx4XG4iKQogCi1zdGF0aWMgdTY0IHNwdWZzX29iamVjdF9pZF9nZXQodm9pZCAqZGF0YSkKK3N0YXRpYyB1NjQgX19zcHVmc19vYmplY3RfaWRfZ2V0KHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOwogCXJldHVybiBjdHgtPm9iamVjdF9pZDsKIH0KIAorc3RhdGljIHU2NCBzcHVmc19vYmplY3RfaWRfZ2V0KHZvaWQgKmRhdGEpCit7CisJLyogRklYTUU6IFNob3VsZCB0aGVyZSByZWFsbHkgYmUgbm8gbG9ja2luZyBoZXJlPyAqLworCXJldHVybiBfX3NwdWZzX29iamVjdF9pZF9nZXQoZGF0YSk7Cit9CisKIHN0YXRpYyB2b2lkIHNwdWZzX29iamVjdF9pZF9zZXQodm9pZCAqZGF0YSwgdTY0IGlkKQogewogCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZGF0YTsKQEAgLTE1MDIsNiArMTU5MSwyNTAgQEAKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKHNwdWZzX29iamVjdF9pZF9vcHMsIHNwdWZzX29iamVjdF9pZF9nZXQsCiAJCXNwdWZzX29iamVjdF9pZF9zZXQsICIweCVsbHhcbiIpOwogCitzdGF0aWMgdTY0IF9fc3B1ZnNfbHNscl9nZXQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGRhdGE7CisJcmV0dXJuIGN0eC0+Y3NhLnByaXYyLnNwdV9sc2xyX1JXOworfQorCitzdGF0aWMgdTY0IHNwdWZzX2xzbHJfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXU2NCByZXQ7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXJldCA9IF9fc3B1ZnNfbHNscl9nZXQoZGF0YSk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiByZXQ7Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19sc2xyX29wcywgc3B1ZnNfbHNscl9nZXQsIE5VTEwsICIweCVsbHhcbiIpCisKK3N0YXRpYyBpbnQgc3B1ZnNfaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppID0gU1BVRlNfSShpbm9kZSk7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBpLT5pX2N0eDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjdHg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfbWJveF9pbmZvX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwl1MzIgbWJveF9zdGF0OworCXUzMiBkYXRhOworCisJbWJveF9zdGF0ID0gY3R4LT5jc2EucHJvYi5tYl9zdGF0X1I7CisJaWYgKG1ib3hfc3RhdCAmIDB4MDAwMGZmKSB7CisJCWRhdGEgPSBjdHgtPmNzYS5wcm9iLnB1X21iX1I7CisJfQorCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbGVuLCBwb3MsICZkYXRhLCBzaXplb2YgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX21ib3hfaW5mb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCWludCByZXQ7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXNwaW5fbG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJcmV0ID0gX19zcHVmc19tYm94X2luZm9fcmVhZChjdHgsIGJ1ZiwgbGVuLCBwb3MpOworCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfbWJveF9pbmZvX2ZvcHMgPSB7CisJLm9wZW4gPSBzcHVmc19pbmZvX29wZW4sCisJLnJlYWQgPSBzcHVmc19tYm94X2luZm9fcmVhZCwKKwkubGxzZWVrICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBfX3NwdWZzX2lib3hfaW5mb19yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LAorCQkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXUzMiBpYm94X3N0YXQ7CisJdTMyIGRhdGE7CisKKwlpYm94X3N0YXQgPSBjdHgtPmNzYS5wcm9iLm1iX3N0YXRfUjsKKwlpZiAoaWJveF9zdGF0ICYgMHhmZjAwMDApIHsKKwkJZGF0YSA9IGN0eC0+Y3NhLnByaXYyLnB1aW50X21iX1I7CisJfQorCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbGVuLCBwb3MsICZkYXRhLCBzaXplb2YgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdWZzX2lib3hfaW5mb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXNwaW5fbG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJcmV0ID0gX19zcHVmc19pYm94X2luZm9fcmVhZChjdHgsIGJ1ZiwgbGVuLCBwb3MpOworCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfaWJveF9pbmZvX2ZvcHMgPSB7CisJLm9wZW4gPSBzcHVmc19pbmZvX29wZW4sCisJLnJlYWQgPSBzcHVmc19pYm94X2luZm9fcmVhZCwKKwkubGxzZWVrICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBfX3NwdWZzX3dib3hfaW5mb19yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LAorCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJaW50IGksIGNudDsKKwl1MzIgZGF0YVs0XTsKKwl1MzIgd2JveF9zdGF0OworCisJd2JveF9zdGF0ID0gY3R4LT5jc2EucHJvYi5tYl9zdGF0X1I7CisJY250ID0gNCAtICgod2JveF9zdGF0ICYgMHgwMGZmMDApID4+IDgpOworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlkYXRhW2ldID0gY3R4LT5jc2Euc3B1X21haWxib3hfZGF0YVtpXTsKKwl9CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIHBvcywgJmRhdGEsCisJCQkJY250ICogc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgc3NpemVfdCBzcHVmc193Ym94X2luZm9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJc3B1X2FjcXVpcmVfc2F2ZWQoY3R4KTsKKwlzcGluX2xvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCXJldCA9IF9fc3B1ZnNfd2JveF9pbmZvX3JlYWQoY3R4LCBidWYsIGxlbiwgcG9zKTsKKwlzcGluX3VubG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX3dib3hfaW5mb19mb3BzID0geworCS5vcGVuID0gc3B1ZnNfaW5mb19vcGVuLAorCS5yZWFkID0gc3B1ZnNfd2JveF9pbmZvX3JlYWQsCisJLmxsc2VlayAgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorfTsKKworc3RhdGljIHNzaXplX3QgX19zcHVmc19kbWFfaW5mb19yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LAorCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNwdV9kbWFfaW5mbyBpbmZvOworCXN0cnVjdCBtZmNfY3Ffc3IgKnFwLCAqc3B1cXA7CisJaW50IGk7CisKKwlpbmZvLmRtYV9pbmZvX3R5cGUgPSBjdHgtPmNzYS5wcml2Mi5zcHVfdGFnX3N0YXR1c19xdWVyeV9SVzsKKwlpbmZvLmRtYV9pbmZvX21hc2sgPSBjdHgtPmNzYS5sc2NzYS0+dGFnX21hc2suc2xvdFswXTsKKwlpbmZvLmRtYV9pbmZvX3N0YXR1cyA9IGN0eC0+Y3NhLnNwdV9jaG5sZGF0YV9SV1syNF07CisJaW5mby5kbWFfaW5mb19zdGFsbF9hbmRfbm90aWZ5ID0gY3R4LT5jc2Euc3B1X2NobmxkYXRhX1JXWzI1XTsKKwlpbmZvLmRtYV9pbmZvX2F0b21pY19jb21tYW5kX3N0YXR1cyA9IGN0eC0+Y3NhLnNwdV9jaG5sZGF0YV9SV1syN107CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJcXAgPSAmaW5mby5kbWFfaW5mb19jb21tYW5kX2RhdGFbaV07CisJCXNwdXFwID0gJmN0eC0+Y3NhLnByaXYyLnNwdXFbaV07CisKKwkJcXAtPm1mY19jcV9kYXRhMF9SVyA9IHNwdXFwLT5tZmNfY3FfZGF0YTBfUlc7CisJCXFwLT5tZmNfY3FfZGF0YTFfUlcgPSBzcHVxcC0+bWZjX2NxX2RhdGExX1JXOworCQlxcC0+bWZjX2NxX2RhdGEyX1JXID0gc3B1cXAtPm1mY19jcV9kYXRhMl9SVzsKKwkJcXAtPm1mY19jcV9kYXRhM19SVyA9IHNwdXFwLT5tZmNfY3FfZGF0YTNfUlc7CisJfQorCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbGVuLCBwb3MsICZpbmZvLAorCQkJCXNpemVvZiBpbmZvKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3B1ZnNfZG1hX2luZm9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcHVfYWNxdWlyZV9zYXZlZChjdHgpOworCXNwaW5fbG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CisJcmV0ID0gX19zcHVmc19kbWFfaW5mb19yZWFkKGN0eCwgYnVmLCBsZW4sIHBvcyk7CisJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOworCXNwdV9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19kbWFfaW5mb19mb3BzID0geworCS5vcGVuID0gc3B1ZnNfaW5mb19vcGVuLAorCS5yZWFkID0gc3B1ZnNfZG1hX2luZm9fcmVhZCwKK307CisKK3N0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfcHJveHlkbWFfaW5mb19yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LAorCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNwdV9wcm94eWRtYV9pbmZvIGluZm87CisJc3RydWN0IG1mY19jcV9zciAqcXAsICpwdXFwOworCWludCByZXQgPSBzaXplb2YgaW5mbzsKKwlpbnQgaTsKKworCWlmIChsZW4gPCByZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5mby5wcm94eWRtYV9pbmZvX3R5cGUgPSBjdHgtPmNzYS5wcm9iLmRtYV9xdWVyeXR5cGVfUlc7CisJaW5mby5wcm94eWRtYV9pbmZvX21hc2sgPSBjdHgtPmNzYS5wcm9iLmRtYV9xdWVyeW1hc2tfUlc7CisJaW5mby5wcm94eWRtYV9pbmZvX3N0YXR1cyA9IGN0eC0+Y3NhLnByb2IuZG1hX3RhZ3N0YXR1c19SOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcXAgPSAmaW5mby5wcm94eWRtYV9pbmZvX2NvbW1hbmRfZGF0YVtpXTsKKwkJcHVxcCA9ICZjdHgtPmNzYS5wcml2Mi5wdXFbaV07CisKKwkJcXAtPm1mY19jcV9kYXRhMF9SVyA9IHB1cXAtPm1mY19jcV9kYXRhMF9SVzsKKwkJcXAtPm1mY19jcV9kYXRhMV9SVyA9IHB1cXAtPm1mY19jcV9kYXRhMV9SVzsKKwkJcXAtPm1mY19jcV9kYXRhMl9SVyA9IHB1cXAtPm1mY19jcV9kYXRhMl9SVzsKKwkJcXAtPm1mY19jcV9kYXRhM19SVyA9IHB1cXAtPm1mY19jcV9kYXRhM19SVzsKKwl9CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIHBvcywgJmluZm8sCisJCQkJc2l6ZW9mIGluZm8pOworfQorCitzdGF0aWMgc3NpemVfdCBzcHVmc19wcm94eWRtYV9pbmZvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCXNwdV9hY3F1aXJlX3NhdmVkKGN0eCk7CisJc3Bpbl9sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlyZXQgPSBfX3NwdWZzX3Byb3h5ZG1hX2luZm9fcmVhZChjdHgsIGJ1ZiwgbGVuLCBwb3MpOworCXNwaW5fdW5sb2NrKCZjdHgtPmNzYS5yZWdpc3Rlcl9sb2NrKTsKKwlzcHVfcmVsZWFzZShjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfcHJveHlkbWFfaW5mb19mb3BzID0geworCS5vcGVuID0gc3B1ZnNfaW5mb19vcGVuLAorCS5yZWFkID0gc3B1ZnNfcHJveHlkbWFfaW5mb19yZWFkLAorfTsKKwogc3RydWN0IHRyZWVfZGVzY3Igc3B1ZnNfZGlyX2NvbnRlbnRzW10gPSB7CiAJeyAibWVtIiwgICZzcHVmc19tZW1fZm9wcywgIDA2NjYsIH0sCiAJeyAicmVncyIsICZzcHVmc19yZWdzX2ZvcHMsICAwNjY2LCB9LApAQCAtMTUxNSwxOCArMTg0OCw3MCBAQAogCXsgInNpZ25hbDIiLCAmc3B1ZnNfc2lnbmFsMl9mb3BzLCAwNjY2LCB9LAogCXsgInNpZ25hbDFfdHlwZSIsICZzcHVmc19zaWduYWwxX3R5cGUsIDA2NjYsIH0sCiAJeyAic2lnbmFsMl90eXBlIiwgJnNwdWZzX3NpZ25hbDJfdHlwZSwgMDY2NiwgfSwKKwl7ICJjbnRsIiwgJnNwdWZzX2NudGxfZm9wcywgIDA2NjYsIH0sCisJeyAiZnBjciIsICZzcHVmc19mcGNyX2ZvcHMsIDA2NjYsIH0sCisJeyAibHNsciIsICZzcHVmc19sc2xyX29wcywgMDQ0NCwgfSwKKwl7ICJtZmMiLCAmc3B1ZnNfbWZjX2ZvcHMsIDA2NjYsIH0sCisJeyAibXNzIiwgJnNwdWZzX21zc19mb3BzLCAwNjY2LCB9LAorCXsgIm5wYyIsICZzcHVmc19ucGNfb3BzLCAwNjY2LCB9LAorCXsgInNycjAiLCAmc3B1ZnNfc3JyMF9vcHMsIDA2NjYsIH0sCisJeyAiZGVjciIsICZzcHVmc19kZWNyX29wcywgMDY2NiwgfSwKKwl7ICJkZWNyX3N0YXR1cyIsICZzcHVmc19kZWNyX3N0YXR1c19vcHMsIDA2NjYsIH0sCisJeyAiZXZlbnRfbWFzayIsICZzcHVmc19ldmVudF9tYXNrX29wcywgMDY2NiwgfSwKKwl7ICJldmVudF9zdGF0dXMiLCAmc3B1ZnNfZXZlbnRfc3RhdHVzX29wcywgMDQ0NCwgfSwKKwl7ICJwc21hcCIsICZzcHVmc19wc21hcF9mb3BzLCAwNjY2LCB9LAorCXsgInBoeXMtaWQiLCAmc3B1ZnNfaWRfb3BzLCAwNjY2LCB9LAorCXsgIm9iamVjdC1pZCIsICZzcHVmc19vYmplY3RfaWRfb3BzLCAwNjY2LCB9LAorCXsgIm1ib3hfaW5mbyIsICZzcHVmc19tYm94X2luZm9fZm9wcywgMDQ0NCwgfSwKKwl7ICJpYm94X2luZm8iLCAmc3B1ZnNfaWJveF9pbmZvX2ZvcHMsIDA0NDQsIH0sCisJeyAid2JveF9pbmZvIiwgJnNwdWZzX3dib3hfaW5mb19mb3BzLCAwNDQ0LCB9LAorCXsgImRtYV9pbmZvIiwgJnNwdWZzX2RtYV9pbmZvX2ZvcHMsIDA0NDQsIH0sCisJeyAicHJveHlkbWFfaW5mbyIsICZzcHVmc19wcm94eWRtYV9pbmZvX2ZvcHMsIDA0NDQsIH0sCisJe30sCit9OworCitzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfbm9zY2hlZF9jb250ZW50c1tdID0geworCXsgIm1lbSIsICAmc3B1ZnNfbWVtX2ZvcHMsICAwNjY2LCB9LAorCXsgIm1ib3giLCAmc3B1ZnNfbWJveF9mb3BzLCAwNDQ0LCB9LAorCXsgImlib3giLCAmc3B1ZnNfaWJveF9mb3BzLCAwNDQ0LCB9LAorCXsgIndib3giLCAmc3B1ZnNfd2JveF9mb3BzLCAwMjIyLCB9LAorCXsgIm1ib3hfc3RhdCIsICZzcHVmc19tYm94X3N0YXRfZm9wcywgMDQ0NCwgfSwKKwl7ICJpYm94X3N0YXQiLCAmc3B1ZnNfaWJveF9zdGF0X2ZvcHMsIDA0NDQsIH0sCisJeyAid2JveF9zdGF0IiwgJnNwdWZzX3dib3hfc3RhdF9mb3BzLCAwNDQ0LCB9LAorCXsgInNpZ25hbDEiLCAmc3B1ZnNfc2lnbmFsMV9mb3BzLCAwNjY2LCB9LAorCXsgInNpZ25hbDIiLCAmc3B1ZnNfc2lnbmFsMl9mb3BzLCAwNjY2LCB9LAorCXsgInNpZ25hbDFfdHlwZSIsICZzcHVmc19zaWduYWwxX3R5cGUsIDA2NjYsIH0sCisJeyAic2lnbmFsMl90eXBlIiwgJnNwdWZzX3NpZ25hbDJfdHlwZSwgMDY2NiwgfSwKIAl7ICJtc3MiLCAmc3B1ZnNfbXNzX2ZvcHMsIDA2NjYsIH0sCiAJeyAibWZjIiwgJnNwdWZzX21mY19mb3BzLCAwNjY2LCB9LAogCXsgImNudGwiLCAmc3B1ZnNfY250bF9mb3BzLCAgMDY2NiwgfSwKIAl7ICJucGMiLCAmc3B1ZnNfbnBjX29wcywgMDY2NiwgfSwKLQl7ICJmcGNyIiwgJnNwdWZzX2ZwY3JfZm9wcywgMDY2NiwgfSwKLQl7ICJkZWNyIiwgJnNwdWZzX2RlY3Jfb3BzLCAwNjY2LCB9LAotCXsgImRlY3Jfc3RhdHVzIiwgJnNwdWZzX2RlY3Jfc3RhdHVzX29wcywgMDY2NiwgfSwKLQl7ICJzcHVfdGFnX21hc2siLCAmc3B1ZnNfc3B1X3RhZ19tYXNrX29wcywgMDY2NiwgfSwKLQl7ICJldmVudF9tYXNrIiwgJnNwdWZzX2V2ZW50X21hc2tfb3BzLCAwNjY2LCB9LAotCXsgInNycjAiLCAmc3B1ZnNfc3JyMF9vcHMsIDA2NjYsIH0sCiAJeyAicHNtYXAiLCAmc3B1ZnNfcHNtYXBfZm9wcywgMDY2NiwgfSwKIAl7ICJwaHlzLWlkIiwgJnNwdWZzX2lkX29wcywgMDY2NiwgfSwKIAl7ICJvYmplY3QtaWQiLCAmc3B1ZnNfb2JqZWN0X2lkX29wcywgMDY2NiwgfSwKIAl7fSwKIH07CisKK3N0cnVjdCBzcHVmc19jb3JlZHVtcF9yZWFkZXIgc3B1ZnNfY29yZWR1bXBfcmVhZFtdID0geworCXsgInJlZ3MiLCBfX3NwdWZzX3JlZ3NfcmVhZCwgTlVMTCwgMTI4ICogMTYgfSwKKwl7ICJmcGNyIiwgX19zcHVmc19mcGNyX3JlYWQsIE5VTEwsIDE2IH0sCisJeyAibHNsciIsIE5VTEwsIF9fc3B1ZnNfbHNscl9nZXQsIDExIH0sCisJeyAiZGVjciIsIE5VTEwsIF9fc3B1ZnNfZGVjcl9nZXQsIDExIH0sCisJeyAiZGVjcl9zdGF0dXMiLCBOVUxMLCBfX3NwdWZzX2RlY3Jfc3RhdHVzX2dldCwgMTEgfSwKKwl7ICJtZW0iLCBfX3NwdWZzX21lbV9yZWFkLCBOVUxMLCAyNTYgKiAxMDI0LCB9LAorCXsgInNpZ25hbDEiLCBfX3NwdWZzX3NpZ25hbDFfcmVhZCwgTlVMTCwgNCB9LAorCXsgInNpZ25hbDFfdHlwZSIsIE5VTEwsIF9fc3B1ZnNfc2lnbmFsMV90eXBlX2dldCwgMiB9LAorCXsgInNpZ25hbDIiLCBfX3NwdWZzX3NpZ25hbDJfcmVhZCwgTlVMTCwgNCB9LAorCXsgInNpZ25hbDJfdHlwZSIsIE5VTEwsIF9fc3B1ZnNfc2lnbmFsMl90eXBlX2dldCwgMiB9LAorCXsgImV2ZW50X21hc2siLCBOVUxMLCBfX3NwdWZzX2V2ZW50X21hc2tfZ2V0LCA4IH0sCisJeyAiZXZlbnRfc3RhdHVzIiwgTlVMTCwgX19zcHVmc19ldmVudF9zdGF0dXNfZ2V0LCA4IH0sCisJeyAibWJveF9pbmZvIiwgX19zcHVmc19tYm94X2luZm9fcmVhZCwgTlVMTCwgNCB9LAorCXsgImlib3hfaW5mbyIsIF9fc3B1ZnNfaWJveF9pbmZvX3JlYWQsIE5VTEwsIDQgfSwKKwl7ICJ3Ym94X2luZm8iLCBfX3NwdWZzX3dib3hfaW5mb19yZWFkLCBOVUxMLCAxNiB9LAorCXsgImRtYV9pbmZvIiwgX19zcHVmc19kbWFfaW5mb19yZWFkLCBOVUxMLCA2OSAqIDggfSwKKwl7ICJwcm94eWRtYV9pbmZvIiwgX19zcHVmc19wcm94eWRtYV9pbmZvX3JlYWQsIE5VTEwsIDM1ICogOCB9LAorCXsgIm9iamVjdC1pZCIsIE5VTEwsIF9fc3B1ZnNfb2JqZWN0X2lkX2dldCwgMTkgfSwKKwl7IH0sCit9OworaW50IHNwdWZzX2NvcmVkdW1wX251bV9ub3RlcyA9IEFSUkFZX1NJWkUoc3B1ZnNfY29yZWR1bXBfcmVhZCkgLSAxOworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMKaW5kZXggZWZjNDUyZS4uYWU0MmUwMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYwpAQCAtMTM1LDIxICsxMzUsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdTMyIHNwdV9od19zaWduYWwxX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCi17Ci0JcmV0dXJuIGluX2JlMzIoJmN0eC0+c3B1LT5wcm9ibGVtLT5zaWduYWxfbm90aWZ5MSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNwdV9od19zaWduYWwxX3dyaXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgZGF0YSkKIHsKIAlvdXRfYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNpZ25hbF9ub3RpZnkxLCBkYXRhKTsKIH0KIAotc3RhdGljIHUzMiBzcHVfaHdfc2lnbmFsMl9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQotewotCXJldHVybiBpbl9iZTMyKCZjdHgtPnNwdS0+cHJvYmxlbS0+c2lnbmFsX25vdGlmeTEpOwotfQotCiBzdGF0aWMgdm9pZCBzcHVfaHdfc2lnbmFsMl93cml0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyIGRhdGEpCiB7CiAJb3V0X2JlMzIoJmN0eC0+c3B1LT5wcm9ibGVtLT5zaWduYWxfbm90aWZ5MiwgZGF0YSk7CkBAIC0yMTcsMjEgKzIwNyw0MiBAQAogCXJldHVybiBjdHgtPnNwdS0+bG9jYWxfc3RvcmU7CiB9CiAKLXN0YXRpYyB2b2lkIHNwdV9od19ydW5jbnRsX3dyaXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgdmFsKQorc3RhdGljIHUzMiBzcHVfaHdfcnVuY250bF9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWVpZWlvKCk7Ci0Jb3V0X2JlMzIoJmN0eC0+c3B1LT5wcm9ibGVtLT5zcHVfcnVuY250bF9SVywgdmFsKTsKKwlyZXR1cm4gaW5fYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9ydW5jbnRsX1JXKTsKIH0KIAotc3RhdGljIHZvaWQgc3B1X2h3X3J1bmNudGxfc3RvcChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3N0YXRpYyB2b2lkIHNwdV9od19ydW5jbnRsX3dyaXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgdmFsKQogewogCXNwaW5fbG9ja19pcnEoJmN0eC0+c3B1LT5yZWdpc3Rlcl9sb2NrKTsKLQlvdXRfYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9ydW5jbnRsX1JXLCBTUFVfUlVOQ05UTF9TVE9QKTsKLQl3aGlsZSAoaW5fYmUzMigmY3R4LT5zcHUtPnByb2JsZW0tPnNwdV9zdGF0dXNfUikgJiBTUFVfU1RBVFVTX1JVTk5JTkcpCi0JCWNwdV9yZWxheCgpOworCWlmICh2YWwgJiBTUFVfUlVOQ05UTF9JU09MQVRFKQorCQlvdXRfYmU2NCgmY3R4LT5zcHUtPnByaXYyLT5zcHVfcHJpdmNudGxfUlcsIDRMTCk7CisJb3V0X2JlMzIoJmN0eC0+c3B1LT5wcm9ibGVtLT5zcHVfcnVuY250bF9SVywgdmFsKTsKIAlzcGluX3VubG9ja19pcnEoJmN0eC0+c3B1LT5yZWdpc3Rlcl9sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgc3B1X2h3X21hc3Rlcl9zdGFydChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjdHgtPnNwdTsKKwl1NjQgc3IxOworCisJc3Bpbl9sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwlzcjEgPSBzcHVfbWZjX3NyMV9nZXQoc3B1KSB8IE1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0s7CisJc3B1X21mY19zcjFfc2V0KHNwdSwgc3IxKTsKKwlzcGluX3VubG9ja19pcnEoJnNwdS0+cmVnaXN0ZXJfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNwdV9od19tYXN0ZXJfc3RvcChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjdHgtPnNwdTsKKwl1NjQgc3IxOworCisJc3Bpbl9sb2NrX2lycSgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwlzcjEgPSBzcHVfbWZjX3NyMV9nZXQoc3B1KSAmIH5NRkNfU1RBVEUxX01BU1RFUl9SVU5fQ09OVFJPTF9NQVNLOworCXNwdV9tZmNfc3IxX3NldChzcHUsIHNyMSk7CisJc3Bpbl91bmxvY2tfaXJxKCZzcHUtPnJlZ2lzdGVyX2xvY2spOworfQorCiBzdGF0aWMgaW50IHNwdV9od19zZXRfbWZjX3F1ZXJ5KHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyIG1hc2ssIHUzMiBtb2RlKQogewogCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gY3R4LT5zcHUtPnByb2JsZW07CkBAIC0yOTEsOSArMzAyLDcgQEAKIAkubWJveF9zdGF0X3BvbGwgPSBzcHVfaHdfbWJveF9zdGF0X3BvbGwsCiAJLmlib3hfcmVhZCA9IHNwdV9od19pYm94X3JlYWQsCiAJLndib3hfd3JpdGUgPSBzcHVfaHdfd2JveF93cml0ZSwKLQkuc2lnbmFsMV9yZWFkID0gc3B1X2h3X3NpZ25hbDFfcmVhZCwKIAkuc2lnbmFsMV93cml0ZSA9IHNwdV9od19zaWduYWwxX3dyaXRlLAotCS5zaWduYWwyX3JlYWQgPSBzcHVfaHdfc2lnbmFsMl9yZWFkLAogCS5zaWduYWwyX3dyaXRlID0gc3B1X2h3X3NpZ25hbDJfd3JpdGUsCiAJLnNpZ25hbDFfdHlwZV9zZXQgPSBzcHVfaHdfc2lnbmFsMV90eXBlX3NldCwKIAkuc2lnbmFsMV90eXBlX2dldCA9IHNwdV9od19zaWduYWwxX3R5cGVfZ2V0LApAQCAtMzAzLDggKzMxMiwxMCBAQAogCS5ucGNfd3JpdGUgPSBzcHVfaHdfbnBjX3dyaXRlLAogCS5zdGF0dXNfcmVhZCA9IHNwdV9od19zdGF0dXNfcmVhZCwKIAkuZ2V0X2xzID0gc3B1X2h3X2dldF9scywKKwkucnVuY250bF9yZWFkID0gc3B1X2h3X3J1bmNudGxfcmVhZCwKIAkucnVuY250bF93cml0ZSA9IHNwdV9od19ydW5jbnRsX3dyaXRlLAotCS5ydW5jbnRsX3N0b3AgPSBzcHVfaHdfcnVuY250bF9zdG9wLAorCS5tYXN0ZXJfc3RhcnQgPSBzcHVfaHdfbWFzdGVyX3N0YXJ0LAorCS5tYXN0ZXJfc3RvcCA9IHNwdV9od19tYXN0ZXJfc3RvcCwKIAkuc2V0X21mY19xdWVyeSA9IHNwdV9od19zZXRfbWZjX3F1ZXJ5LAogCS5yZWFkX21mY190YWdzdGF0dXMgPSBzcHVfaHdfcmVhZF9tZmNfdGFnc3RhdHVzLAogCS5nZXRfbWZjX2ZyZWVfZWxlbWVudHMgPSBzcHVfaHdfZ2V0X21mY19mcmVlX2VsZW1lbnRzLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwppbmRleCA0MjdkMDBhLi43MzhiOTI0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwpAQCAtMzMsMjEgKzMzLDIyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJzcHVmcy5oIgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpzcHVmc19pbm9kZV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc3B1ZnNfaW5vZGVfY2FjaGU7CitjaGFyICppc29sYXRlZF9sb2FkZXI7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKgogc3B1ZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyAqZWk7CiAKLQllaSA9IGttZW1fY2FjaGVfYWxsb2Moc3B1ZnNfaW5vZGVfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwllaSA9IGttZW1fY2FjaGVfYWxsb2Moc3B1ZnNfaW5vZGVfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCkBAIC02NCw3ICs2NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zcHVmc19pbml0X29uY2Uodm9pZCAqcCwga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3B1ZnNfaW5pdF9vbmNlKHZvaWQgKnAsIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICplaSA9IHA7CiAKQEAgLTIwNCw3ICsyMDUsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRpcjsKIAlpbnQgcmV0OwogCi0JZGlyID0gZmlsZS0+Zl9kZW50cnk7CisJZGlyID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlwYXJlbnQgPSBkaXItPmRfcGFyZW50LT5kX2lub2RlOwogCWN0eCA9IFNQVUZTX0koZGlyLT5kX2lub2RlKS0+aV9jdHg7CiAKQEAgLTIzMSw2ICsyMzIsNyBAQAogCS5yZWFkZGlyCT0gZGNhY2hlX3JlYWRkaXIsCiAJLmZzeW5jCQk9IHNpbXBsZV9zeW5jX2ZpbGUsCiB9OworRVhQT1JUX1NZTUJPTF9HUEwoc3B1ZnNfY29udGV4dF9mb3BzKTsKIAogc3RhdGljIGludAogc3B1ZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdW5zaWduZWQgaW50IGZsYWdzLApAQCAtMjU1LDEwICsyNTcsMTQgQEAKIAkJZ290byBvdXRfaXB1dDsKIAogCWN0eC0+ZmxhZ3MgPSBmbGFnczsKLQogCWlub2RlLT5pX29wID0gJnNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7Ci0JcmV0ID0gc3B1ZnNfZmlsbF9kaXIoZGVudHJ5LCBzcHVmc19kaXJfY29udGVudHMsIG1vZGUsIGN0eCk7CisJaWYgKGZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQorCQlyZXQgPSBzcHVmc19maWxsX2RpcihkZW50cnksIHNwdWZzX2Rpcl9ub3NjaGVkX2NvbnRlbnRzLAorCQkJCQkgbW9kZSwgY3R4KTsKKwllbHNlCisJCXJldCA9IHNwdWZzX2ZpbGxfZGlyKGRlbnRyeSwgc3B1ZnNfZGlyX2NvbnRlbnRzLCBtb2RlLCBjdHgpOworCiAJaWYgKHJldCkKIAkJZ290byBvdXRfZnJlZV9jdHg7CiAKQEAgLTMwNyw2ICszMTMsMjAgQEAKIHsKIAlpbnQgcmV0OwogCisJcmV0ID0gLUVQRVJNOworCWlmICgoZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpICYmCisJICAgICFjYXBhYmxlKENBUF9TWVNfTklDRSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKChmbGFncyAmIChTUFVfQ1JFQVRFX05PU0NIRUQgfCBTUFVfQ1JFQVRFX0lTT0xBVEUpKQorCSAgICA9PSBTUFVfQ1JFQVRFX0lTT0xBVEUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldCA9IC1FTk9ERVY7CisJaWYgKChmbGFncyAmIFNQVV9DUkVBVEVfSVNPTEFURSkgJiYgIWlzb2xhdGVkX2xvYWRlcikKKwkJZ290byBvdXRfdW5sb2NrOworCiAJcmV0ID0gc3B1ZnNfbWtkaXIoaW5vZGUsIGRlbnRyeSwgZmxhZ3MsIG1vZGUgJiBTX0lSV1hVR08pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTM0Myw3ICszNjMsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRpcjsKIAlpbnQgcmV0OwogCi0JZGlyID0gZmlsZS0+Zl9kZW50cnk7CisJZGlyID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlwYXJlbnQgPSBkaXItPmRfcGFyZW50LT5kX2lub2RlOwogCiAJcmV0ID0gc3B1ZnNfcm1nYW5nKHBhcmVudCwgZGlyKTsKQEAgLTU0MCw2ICs1NjAsMzAgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQKK3NwdWZzX2luaXRfaXNvbGF0ZWRfbG9hZGVyKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwljb25zdCBjaGFyICpsb2FkZXI7CisJaW50IHNpemU7CisKKwlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvc3B1LWlzb2xhdGlvbiIpOworCWlmICghZG4pCisJCXJldHVybjsKKworCWxvYWRlciA9IGdldF9wcm9wZXJ0eShkbiwgImxvYWRlciIsICZzaXplKTsKKwlpZiAoIWxvYWRlcikKKwkJcmV0dXJuOworCisJLyoga21hbGxvYyBzaG91bGQgYWxpZ24gb24gYSAxNiBieXRlIGJvdW5kYXJ5Li4qICovCisJaXNvbGF0ZWRfbG9hZGVyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlzb2xhdGVkX2xvYWRlcikKKwkJcmV0dXJuOworCisJbWVtY3B5KGlzb2xhdGVkX2xvYWRlciwgbG9hZGVyLCBzaXplKTsKKwlwcmludGsoS0VSTl9JTkZPICJzcHVmczogU1BVIGlzb2xhdGlvbiBtb2RlIGVuYWJsZWRcbiIpOworfQorCiBzdGF0aWMgaW50CiBzcHVmc19jcmVhdGVfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQogewpAQCAtNjA4LDYgKzY1Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBzcHVmc19pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKKwogCXJldCA9IC1FTk9NRU07CiAJc3B1ZnNfaW5vZGVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic3B1ZnNfaW5vZGVfY2FjaGUiLAogCQkJc2l6ZW9mKHN0cnVjdCBzcHVmc19pbm9kZV9pbmZvKSwgMCwKQEAgLTYyNSw2ICs2NzAsMTIgQEAKIAlyZXQgPSByZWdpc3Rlcl9zcHVfc3lzY2FsbHMoJnNwdWZzX2NhbGxzKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9mczsKKwlyZXQgPSByZWdpc3Rlcl9hcmNoX2NvcmVkdW1wX2NhbGxzKCZzcHVmc19jb3JlZHVtcF9jYWxscyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnM7CisKKwlzcHVmc19pbml0X2lzb2xhdGVkX2xvYWRlcigpOworCiAJcmV0dXJuIDA7CiBvdXRfZnM6CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzcHVmc190eXBlKTsKQEAgLTYzOCw2ICs2ODksNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHNwdWZzX2V4aXQodm9pZCkKIHsKIAlzcHVfc2NoZWRfZXhpdCgpOworCXVucmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscygmc3B1ZnNfY29yZWR1bXBfY2FsbHMpOwogCXVucmVnaXN0ZXJfc3B1X3N5c2NhbGxzKCZzcHVmc19jYWxscyk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzcHVmc190eXBlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc3B1ZnNfaW5vZGVfY2FjaGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCmluZGV4IDYzZGY4Y2YuLjFhY2MyZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKQEAgLTEsNyArMSwxMSBAQAorI2RlZmluZSBERUJVRworCiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgorI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKICNpbmNsdWRlICJzcHVmcy5oIgpAQCAtMjQsNiArMjgsNyBAQAogCX0gZWxzZSB7CiAJCXN3aXRjaCAodHlwZSkgewogCQljYXNlIFNQRV9FVkVOVF9ETUFfQUxJR05NRU5UOgorCQljYXNlIFNQRV9FVkVOVF9TUEVfREFUQV9TVE9SQUdFOgogCQljYXNlIFNQRV9FVkVOVF9JTlZBTElEX0RNQToKIAkJCWZvcmNlX3NpZyhTSUdCVVMsIC8qIGluZm8sICovIGN1cnJlbnQpOwogCQkJYnJlYWs7CkBAIC00OCwxNSArNTMsMTIyIEBACiAJcmV0dXJuICghKCpzdGF0ICYgMHgxKSB8fCBwdGVfZmF1bHQgfHwgc3B1LT5jbGFzc18wX3BlbmRpbmcpID8gMSA6IDA7CiB9CiAKK3N0YXRpYyBpbnQgc3B1X3NldHVwX2lzb2xhdGVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCWludCByZXQ7CisJdTY0IF9faW9tZW0gKm1mY19jbnRsOworCXU2NCBzcjE7CisJdTMyIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJY29uc3QgdTMyIHN0YXR1c19sb2FkaW5nID0gU1BVX1NUQVRVU19SVU5OSU5HCisJCXwgU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSB8IFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFUVVM7CisKKwlpZiAoIWlzb2xhdGVkX2xvYWRlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzcHVfYWNxdWlyZV9leGNsdXNpdmUoY3R4KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW1mY19jbnRsID0gJmN0eC0+c3B1LT5wcml2Mi0+bWZjX2NvbnRyb2xfUlc7CisKKwkvKiBwdXJnZSB0aGUgTUZDIERNQSBxdWV1ZSB0byBlbnN1cmUgbm8gc3B1cmlvdXMgYWNjZXNzZXMgYmVmb3JlIHdlCisJICogZW50ZXIga2VybmVsIG1vZGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCW91dF9iZTY0KG1mY19jbnRsLCBNRkNfQ05UTF9QVVJHRV9ETUFfUkVRVUVTVCk7CisJd2hpbGUgKChpbl9iZTY0KG1mY19jbnRsKSAmIE1GQ19DTlRMX1BVUkdFX0RNQV9TVEFUVVNfTUFTSykKKwkJCSE9IE1GQ19DTlRMX1BVUkdFX0RNQV9DT01QTEVURSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCBmbHVzaGluZyBNRkMgRE1BIHF1ZXVlXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwkvKiBwdXQgdGhlIFNQRSBpbiBrZXJuZWwgbW9kZSB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIGxvYWRlciAqLworCXNyMSA9IHNwdV9tZmNfc3IxX2dldChjdHgtPnNwdSk7CisJc3IxICY9IH5NRkNfU1RBVEUxX1BST0JMRU1fU1RBVEVfTUFTSzsKKwlzcHVfbWZjX3NyMV9zZXQoY3R4LT5zcHUsIHNyMSk7CisKKwkvKiBzdGFydCB0aGUgbG9hZGVyICovCisJY3R4LT5vcHMtPnNpZ25hbDFfd3JpdGUoY3R4LCAodW5zaWduZWQgbG9uZylpc29sYXRlZF9sb2FkZXIgPj4gMzIpOworCWN0eC0+b3BzLT5zaWduYWwyX3dyaXRlKGN0eCwKKwkJCSh1bnNpZ25lZCBsb25nKWlzb2xhdGVkX2xvYWRlciAmIDB4ZmZmZmZmZmYpOworCisJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LAorCQkJU1BVX1JVTkNOVExfUlVOTkFCTEUgfCBTUFVfUlVOQ05UTF9JU09MQVRFKTsKKworCXJldCA9IDA7CisJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwl3aGlsZSAoKChzdGF0dXMgPSBjdHgtPm9wcy0+c3RhdHVzX3JlYWQoY3R4KSkgJiBzdGF0dXNfbG9hZGluZykgPT0KKwkJCQlzdGF0dXNfbG9hZGluZykgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBsb2FkZXJcbiIsCisJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXRfZHJvcF9wcml2OworCQl9CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCWlmICghKHN0YXR1cyAmIFNQVV9TVEFUVVNfUlVOTklORykpIHsKKwkJLyogSWYgaXNvbGF0ZWQgTE9BRCBoYXMgZmFpbGVkOiBydW4gU1BVLCB3ZSB3aWxsIGdldCBhIHN0b3AtYW5kCisJCSAqIHNpZ25hbCBsYXRlci4gKi8KKwkJcHJfZGVidWcoIiVzOiBpc29sYXRlZCBMT0FEIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LCBTUFVfUlVOQ05UTF9SVU5OQUJMRSk7CisJCXJldCA9IC1FQUNDRVM7CisKKwl9IGVsc2UgaWYgKCEoc3RhdHVzICYgU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSkpIHsKKwkJLyogVGhpcyBpc24ndCBhbGxvd2VkIGJ5IHRoZSBDQkVBLCBidXQgY2hlY2sgYW55d2F5ICovCisJCXByX2RlYnVnKCIlczogU1BVIGZlbGwgb3V0IG9mIGlzb2xhdGVkIG1vZGU/XG4iLCBfX0ZVTkNUSU9OX18pOworCQljdHgtPm9wcy0+cnVuY250bF93cml0ZShjdHgsIFNQVV9SVU5DTlRMX1NUT1ApOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworb3V0X2Ryb3BfcHJpdjoKKwkvKiBGaW5pc2hlZCBhY2Nlc3NpbmcgdGhlIGxvYWRlci4gRHJvcCBrZXJuZWwgbW9kZSAqLworCXNyMSB8PSBNRkNfU1RBVEUxX1BST0JMRU1fU1RBVEVfTUFTSzsKKwlzcHVfbWZjX3NyMV9zZXQoY3R4LT5zcHUsIHNyMSk7CisKK291dF91bmxvY2s6CisJc3B1X3JlbGVhc2VfZXhjbHVzaXZlKGN0eCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc3B1X3J1bl9pbml0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBucGMpCiB7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHJ1bmNudGwgPSBTUFVfUlVOQ05UTF9SVU5OQUJMRTsKIAotCWlmICgocmV0ID0gc3B1X2FjcXVpcmVfcnVubmFibGUoY3R4KSkgIT0gMCkKKwlyZXQgPSBzcHVfYWNxdWlyZV9ydW5uYWJsZShjdHgpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JY3R4LT5vcHMtPm5wY193cml0ZShjdHgsICpucGMpOwotCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgU1BVX1JVTkNOVExfUlVOTkFCTEUpOwotCXJldHVybiAwOworCisJaWYgKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX0lTT0xBVEUpIHsKKwkJaWYgKCEoY3R4LT5vcHMtPnN0YXR1c19yZWFkKGN0eCkgJiBTUFVfU1RBVFVTX0lTT0xBVEVEX1NUQVRFKSkgeworCQkJLyogTmVlZCB0byByZWxlYXNlIGN0eCwgYmVjYXVzZSBzcHVfc2V0dXBfaXNvbGF0ZWQgd2lsbAorCQkJICogYWNxdWlyZSBpdCBleGNsdXNpdmVseS4KKwkJCSAqLworCQkJc3B1X3JlbGVhc2UoY3R4KTsKKwkJCXJldCA9IHNwdV9zZXR1cF9pc29sYXRlZChjdHgpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gc3B1X2FjcXVpcmVfcnVubmFibGUoY3R4KTsKKwkJfQorCisJCS8qIGlmIHVzZXJzcGFjZSBoYXMgc2V0IHRoZSBydW5jbnRybCByZWdpc3RlciAoZWcsIHRvIGlzc3VlIGFuCisJCSAqIGlzb2xhdGVkIGV4aXQpLCB3ZSBuZWVkIHRvIHJlLXNldCBpdCBoZXJlICovCisJCXJ1bmNudGwgPSBjdHgtPm9wcy0+cnVuY250bF9yZWFkKGN0eCkgJgorCQkJKFNQVV9SVU5DTlRMX1JVTk5BQkxFIHwgU1BVX1JVTkNOVExfSVNPTEFURSk7CisJCWlmIChydW5jbnRsID09IDApCisJCQlydW5jbnRsID0gU1BVX1JVTkNOVExfUlVOTkFCTEU7CisJfSBlbHNlCisJCWN0eC0+b3BzLT5ucGNfd3JpdGUoY3R4LCAqbnBjKTsKKworCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgcnVuY250bCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc3B1X3J1bl9maW5pKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBucGMsCkBAIC03MCwxMyArMTgyLDcgQEAKIAogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCWlmICh1bmxpa2VseShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkgewotCQlpZiAoKCpzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkKLQkJICAgICYmICgqc3RhdHVzID4+IFNQVV9TVE9QX1NUQVRVU19TSElGVCkgPT0gMHgzZmZmKSB7Ci0JCQlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7Ci0JCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCX0KLQl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMDQsNiArMzEwLDcgQEAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjdHgtPnJ1bl9zZW1hKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAorCWN0eC0+b3BzLT5tYXN0ZXJfc3RhcnQoY3R4KTsKIAljdHgtPmV2ZW50X3JldHVybiA9IDA7CiAJcmV0ID0gc3B1X3J1bl9pbml0KGN0eCwgbnBjKTsKIAlpZiAocmV0KQpAQCAtMjIzLDcgKzMzMCw3IEBACiAJCWlmICh1bmxpa2VseShjdHgtPnN0YXRlICE9IFNQVV9TVEFURV9SVU5OQUJMRSkpIHsKIAkJCXJldCA9IHNwdV9yZWFjcXVpcmVfcnVubmFibGUoY3R4LCBucGMsICZzdGF0dXMpOwogCQkJaWYgKHJldCkKLQkJCQlnb3RvIG91dDsKKwkJCQlnb3RvIG91dDI7CiAJCQljb250aW51ZTsKIAkJfQogCQlyZXQgPSBzcHVfcHJvY2Vzc19ldmVudHMoY3R4KTsKQEAgLTIzMSwxMiArMzM4LDI0IEBACiAJfSB3aGlsZSAoIXJldCAmJiAhKHN0YXR1cyAmIChTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCB8CiAJCQkJICAgICAgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQpKSk7CiAKLQljdHgtPm9wcy0+cnVuY250bF9zdG9wKGN0eCk7CisJY3R4LT5vcHMtPm1hc3Rlcl9zdG9wKGN0eCk7CiAJcmV0ID0gc3B1X3J1bl9maW5pKGN0eCwgbnBjLCAmc3RhdHVzKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gc3RhdHVzOwogCXNwdV95aWVsZChjdHgpOwogCitvdXQyOgorCWlmICgocmV0ID09IDApIHx8CisJICAgICgocmV0ID09IC1FUkVTVEFSVFNZUykgJiYKKwkgICAgICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQpIHx8CisJICAgICAgKChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkgJiYKKwkgICAgICAgKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQgIT0gMHgyMTA0KSkpKSkKKwkJcmV0ID0gc3RhdHVzOworCisJaWYgKChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkKKwkgICAgJiYgKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpID09IDB4M2ZmZikgeworCQlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwl9CisKIG91dDoKIAkqZXZlbnQgPSBjdHgtPmV2ZW50X3JldHVybjsKIAl1cCgmY3R4LT5ydW5fc2VtYSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCmluZGV4IGEwZjU1Y2EuLjcwZmIxMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KKyNpbmNsdWRlIDxhc20vc3B1X2luZm8uaD4KIAogLyogVGhlIG1hZ2ljIG51bWJlciBmb3Igb3VyIGZpbGUgc3lzdGVtICovCiBlbnVtIHsKQEAgLTExNCwxMyArMTE1LDE5IEBACiAJdm9pZCAoKm5wY193cml0ZSkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyIGRhdGEpOwogCSB1MzIoKnN0YXR1c19yZWFkKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKIAljaGFyKigqZ2V0X2xzKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKKwkgdTMyICgqcnVuY250bF9yZWFkKSAoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKIAl2b2lkICgqcnVuY250bF93cml0ZSkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCwgdTMyIGRhdGEpOwotCXZvaWQgKCpydW5jbnRsX3N0b3ApIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgpOworCXZvaWQgKCptYXN0ZXJfc3RhcnQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgpOworCXZvaWQgKCptYXN0ZXJfc3RvcCkgKHN0cnVjdCBzcHVfY29udGV4dCAqIGN0eCk7CiAJaW50ICgqc2V0X21mY19xdWVyeSkoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4LCB1MzIgbWFzaywgdTMyIG1vZGUpOwogCXUzMiAoKnJlYWRfbWZjX3RhZ3N0YXR1cykoc3RydWN0IHNwdV9jb250ZXh0ICogY3R4KTsKIAl1MzIgKCpnZXRfbWZjX2ZyZWVfZWxlbWVudHMpKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKLQlpbnQgKCpzZW5kX21mY19jb21tYW5kKShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKLQkJCQkJc3RydWN0IG1mY19kbWFfY29tbWFuZCAqY21kKTsKKwlpbnQgKCpzZW5kX21mY19jb21tYW5kKShzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsCisJCQkJc3RydWN0IG1mY19kbWFfY29tbWFuZCAqIGNtZCk7CisJdm9pZCAoKmRtYV9pbmZvX3JlYWQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsCisJCQkgICAgICAgc3RydWN0IHNwdV9kbWFfaW5mbyAqIGluZm8pOworCXZvaWQgKCpwcm94eWRtYV9pbmZvX3JlYWQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsCisJCQkJICAgIHN0cnVjdCBzcHVfcHJveHlkbWFfaW5mbyAqIGluZm8pOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBzcHVfY29udGV4dF9vcHMgc3B1X2h3X29wczsKQEAgLTEzNSw2ICsxNDIsNyBAQAogCWNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IHNwdWZzX2lub2RlX2luZm8sIHZmc19pbm9kZSkKIAogZXh0ZXJuIHN0cnVjdCB0cmVlX2Rlc2NyIHNwdWZzX2Rpcl9jb250ZW50c1tdOworZXh0ZXJuIHN0cnVjdCB0cmVlX2Rlc2NyIHNwdWZzX2Rpcl9ub3NjaGVkX2NvbnRlbnRzW107CiAKIC8qIHN5c3RlbSBjYWxsIGltcGxlbWVudGF0aW9uICovCiBsb25nIHNwdWZzX3J1bl9zcHUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0xNjIsNiArMTcwLDEyIEBACiB2b2lkIHNwdV9yZWxlYXNlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKIGludCBzcHVfYWNxdWlyZV9ydW5uYWJsZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CiB2b2lkIHNwdV9hY3F1aXJlX3NhdmVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK2ludCBzcHVfYWNxdWlyZV9leGNsdXNpdmUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3B1X3JlbGVhc2VfZXhjbHVzaXZlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXVwX3dyaXRlKCZjdHgtPnN0YXRlX3NlbWEpOworfQogCiBpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1NjQgZmxhZ3MpOwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CkBAIC0xNjksNiArMTgzLDggQEAKIGludCBfX2luaXQgc3B1X3NjaGVkX2luaXQodm9pZCk7CiB2b2lkIF9fZXhpdCBzcHVfc2NoZWRfZXhpdCh2b2lkKTsKIAorZXh0ZXJuIGNoYXIgKmlzb2xhdGVkX2xvYWRlcjsKKwogLyoKICAqIHNwdWZzX3dhaXQKICAqIAlTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCkBAIC0yMDcsNCArMjIzLDE1IEBACiB2b2lkIHNwdWZzX21mY19jYWxsYmFjayhzdHJ1Y3Qgc3B1ICpzcHUpOwogdm9pZCBzcHVmc19kbWFfY2FsbGJhY2soc3RydWN0IHNwdSAqc3B1LCBpbnQgdHlwZSk7CiAKK2V4dGVybiBzdHJ1Y3Qgc3B1X2NvcmVkdW1wX2NhbGxzIHNwdWZzX2NvcmVkdW1wX2NhbGxzOworc3RydWN0IHNwdWZzX2NvcmVkdW1wX3JlYWRlciB7CisJY2hhciAqbmFtZTsKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQljaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpOworCXU2NCAoKmdldCkodm9pZCAqZGF0YSk7CisJc2l6ZV90IHNpemU7Cit9OworZXh0ZXJuIHN0cnVjdCBzcHVmc19jb3JlZHVtcF9yZWFkZXIgc3B1ZnNfY29yZWR1bXBfcmVhZFtdOworZXh0ZXJuIGludCBzcHVmc19jb3JlZHVtcF9udW1fbm90ZXM7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCmluZGV4IDBmNzgyY2EuLmMwODk4MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAqICAgICBzYXZlZCBhdCB0aGlzIHRpbWUuCiAJICovCiAJaXNvbGF0ZV9zdGF0ZSA9IFNQVV9TVEFUVVNfSVNPTEFURURfU1RBVEUgfAotCSAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVVRVUyB8IFNQVV9TVEFUVVNfSVNPTEFURURfRVhJVF9TVEFVVFVTOworCSAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVFVTIHwgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVRVUzsKIAlyZXR1cm4gKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJiBpc29sYXRlX3N0YXRlKSA/IDEgOiAwOwogfQogCkBAIC0xMDQ2LDEyICsxMDQ2LDEyIEBACiAJICovCiAJaWYgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJiBTUFVfU1RBVFVTX1JVTk5JTkcpIHsKIAkJaWYgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgotCQkgICAgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVVUVVMpIHsKKwkJICAgIFNQVV9TVEFUVVNfSVNPTEFURURfRVhJVF9TVEFUVVMpIHsKIAkJCVBPTExfV0hJTEVfVFJVRShpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpICYKIAkJCQkJU1BVX1NUQVRVU19SVU5OSU5HKTsKIAkJfQogCQlpZiAoKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgotCQkgICAgIFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFVVFVTKQorCQkgICAgIFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFUVVMpCiAJCSAgICB8fCAoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmCiAJCQlTUFVfU1RBVFVTX0lTT0xBVEVEX1NUQVRFKSkgewogCQkJb3V0X2JlMzIoJnByb2ItPnNwdV9ydW5jbnRsX1JXLCBTUFVfUlVOQ05UTF9TVE9QKTsKQEAgLTEwODUsNyArMTA4NSw3IEBACiAJICovCiAJaWYgKCEoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmIFNQVV9TVEFUVVNfUlVOTklORykpIHsKIAkJaWYgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgotCQkgICAgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVVUVVMpIHsKKwkJICAgIFNQVV9TVEFUVVNfSVNPTEFURURfRVhJVF9TVEFUVVMpIHsKIAkJCXNwdV9tZmNfc3IxX3NldChzcHUsCiAJCQkJCU1GQ19TVEFURTFfTUFTVEVSX1JVTl9DT05UUk9MX01BU0spOwogCQkJZWllaW8oKTsKQEAgLTEwOTUsNyArMTA5NSw3IEBACiAJCQkJCVNQVV9TVEFUVVNfUlVOTklORyk7CiAJCX0KIAkJaWYgKChpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpICYKLQkJICAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVVRVUykKKwkJICAgICBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVFVTKQogCQkgICAgfHwgKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJgogCQkJU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSkpIHsKIAkJCXNwdV9tZmNfc3IxX3NldChzcHUsCkBAIC0xOTE2LDYgKzE5MTYsNTEgQEAKIAl3YWl0X3NwdV9zdG9wcGVkKHByZXYsIHNwdSk7CS8qIFN0ZXAgNTcuICovCiB9CiAKK3N0YXRpYyB2b2lkIGZvcmNlX3NwdV9pc29sYXRlX2V4aXQoc3RydWN0IHNwdSAqc3B1KQoreworCXN0cnVjdCBzcHVfcHJvYmxlbSBfX2lvbWVtICpwcm9iID0gc3B1LT5wcm9ibGVtOworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOworCisJLyogU3RvcCBTUEUgZXhlY3V0aW9uIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLiAqLworCW91dF9iZTMyKCZwcm9iLT5zcHVfcnVuY250bF9SVywgU1BVX1JVTkNOVExfU1RPUCk7CisJaW9iYXJyaWVyX3J3KCk7CisJUE9MTF9XSElMRV9UUlVFKGluX2JlMzIoJnByb2ItPnNwdV9zdGF0dXNfUikgJiBTUFVfU1RBVFVTX1JVTk5JTkcpOworCisJLyogUmVzdGFydCBTUEUgbWFzdGVyIHJ1bmNudGwuICovCisJc3B1X21mY19zcjFfc2V0KHNwdSwgTUZDX1NUQVRFMV9NQVNURVJfUlVOX0NPTlRST0xfTUFTSyk7CisJaW9iYXJyaWVyX3coKTsKKworCS8qIEluaXRpYXRlIGlzb2xhdGUgZXhpdCByZXF1ZXN0IGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLiAqLworCW91dF9iZTY0KCZwcml2Mi0+c3B1X3ByaXZjbnRsX1JXLCA0TEwpOworCWlvYmFycmllcl93KCk7CisJb3V0X2JlMzIoJnByb2ItPnNwdV9ydW5jbnRsX1JXLCAyKTsKKwlpb2JhcnJpZXJfcncoKTsKKwlQT0xMX1dISUxFX0ZBTFNFKChpbl9iZTMyKCZwcm9iLT5zcHVfc3RhdHVzX1IpCisJCQkJJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkpOworCisJLyogUmVzZXQgbG9hZCByZXF1ZXN0IHRvIG5vcm1hbC4gKi8KKwlvdXRfYmU2NCgmcHJpdjItPnNwdV9wcml2Y250bF9SVywgU1BVX1BSSVZDTlRfTE9BRF9SRVFVRVNUX05PUk1BTCk7CisJaW9iYXJyaWVyX3coKTsKK30KKworLyoqCisgKiBzdG9wX3NwdV9pc29sYXRlCisgKglDaGVjayBTUFUgcnVuLWNvbnRyb2wgc3RhdGUgYW5kIGZvcmNlIGlzb2xhdGVkCisgKglleGl0IGZ1bmN0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIHZvaWQgc3RvcF9zcHVfaXNvbGF0ZShzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJc3RydWN0IHNwdV9wcm9ibGVtIF9faW9tZW0gKnByb2IgPSBzcHUtPnByb2JsZW07CisKKwlpZiAoaW5fYmUzMigmcHJvYi0+c3B1X3N0YXR1c19SKSAmIFNQVV9TVEFUVVNfSVNPTEFURURfU1RBVEUpIHsKKwkJLyogVGhlIFNQVSBpcyBpbiBpc29sYXRlZCBzdGF0ZTsgdGhlIG9ubHkgd2F5CisJCSAqIHRvIGdldCBpdCBvdXQgaXMgdG8gcGVyZm9ybSBhbiBpc29sYXRlZAorCQkgKiBleGl0IChjbGVhbikgb3BlcmF0aW9uLgorCQkgKi8KKwkJZm9yY2Vfc3B1X2lzb2xhdGVfZXhpdChzcHUpOworCX0KK30KKwogc3RhdGljIHZvaWQgaGFydmVzdChzdHJ1Y3Qgc3B1X3N0YXRlICpwcmV2LCBzdHJ1Y3Qgc3B1ICpzcHUpCiB7CiAJLyoKQEAgLTE5MjgsNiArMTk3Myw3IEBACiAJaW5oaWJpdF91c2VyX2FjY2VzcyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMy4gICovCiAJdGVybWluYXRlX3NwdV9hcHAocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDQuICAqLwogCXNldF9zd2l0Y2hfcGVuZGluZyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgNS4gICovCisJc3RvcF9zcHVfaXNvbGF0ZShzcHUpOwkJCS8qIE5FVy4gICAgICovCiAJcmVtb3ZlX290aGVyX3NwdV9hY2Nlc3MocHJldiwgc3B1KTsJLyogU3RlcCA2LiAgKi8KIAlzdXNwZW5kX21mYyhwcmV2LCBzcHUpOwkgICAgICAgICAgICAgICAgLyogU3RlcCA3LiAgKi8KIAl3YWl0X3N1c3BlbmRfbWZjX2NvbXBsZXRlKHByZXYsIHNwdSk7CS8qIFN0ZXAgOC4gICovCkBAIC0yMDk2LDExICsyMTQyLDExIEBACiAJYWNxdWlyZV9zcHVfbG9jayhzcHUpOwkgICAgICAgIC8qIFN0ZXAgMS4gICAgICovCiAJcmMgPSBfX2RvX3NwdV9zYXZlKHByZXYsIHNwdSk7CS8qIFN0ZXBzIDItNTMuICovCiAJcmVsZWFzZV9zcHVfbG9jayhzcHUpOwotCWlmIChyYykgeworCWlmIChyYyAhPSAwICYmIHJjICE9IDIgJiYgcmMgIT0gNikgewogCQlwYW5pYygiJXMgZmFpbGVkIG9uIFNQVVslZF0sIHJjPSVkLlxuIiwKIAkJICAgICAgX19mdW5jX18sIHNwdS0+bnVtYmVyLCByYyk7CiAJfQotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwdV9zYXZlKTsKIApAQCAtMjE2NSw5ICsyMjExLDYgQEAKIAkgICAgTUZDX1NUQVRFMV9QUk9CTEVNX1NUQVRFX01BU0sgfAogCSAgICBNRkNfU1RBVEUxX1JFTE9DQVRFX01BU0sgfCBNRkNfU1RBVEUxX0JVU19UTEJJRV9NQVNLOwogCi0JLyogU2V0IHN0b3JhZ2UgZGVzY3JpcHRpb24uICAqLwotCWNzYS0+cHJpdjEubWZjX3Nkcl9SVyA9IG1mc3ByKFNQUk5fU0RSMSk7Ci0KIAkvKiBFbmFibGUgT1Mtc3BlY2lmaWMgc2V0IG9mIGludGVycnVwdHMuICovCiAJY3NhLT5wcml2MS5pbnRfbWFza19jbGFzczBfUlcgPSBDTEFTUzBfRU5BQkxFX0RNQV9BTElHTk1FTlRfSU5UUiB8CiAJICAgIENMQVNTMF9FTkFCTEVfSU5WQUxJRF9ETUFfQ09NTUFORF9JTlRSIHwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zeXNjYWxscy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMKaW5kZXggYTZkMWFlNC4uOGUzN2JkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N5c2NhbGxzLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlpZiAoZmlscC0+Zl9vcCAhPSAmc3B1ZnNfY29udGV4dF9mb3BzKQogCQlnb3RvIG91dDsKIAotCWkgPSBTUFVGU19JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpID0gU1BVRlNfSShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlyZXQgPSBzcHVmc19ydW5fc3B1KGZpbHAsIGktPmlfY3R4LCAmbnBjLCAmc3RhdHVzKTsKIAogCWlmIChwdXRfdXNlcihucGMsIHVucGMpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL2NocnAuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9jaHJwLmgKaW5kZXggOTk2YzI4Ny4uNjNmMGFlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL2NocnAuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvY2hycC5oCkBAIC05LDQgKzksMyBAQAogCiBleHRlcm4gdm9pZCBjaHJwX2ZpbmRfYnJpZGdlcyh2b2lkKTsKIGV4dGVybiB2b2lkIGNocnBfZXZlbnRfc2Nhbih1bnNpZ25lZCBsb25nKTsKLWV4dGVybiB2b2lkIGNocnBfcGNpYmlvc19maXh1cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYwppbmRleCAwZjQzNDA1Li5kZGI0YTExIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCkBAIC0xNTYsMTUgKzE1Niw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXZvaWQgX19pbml0Ci1jaHJwX3BjaWJpb3NfZml4dXAodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQotCWZvcl9lYWNoX3BjaV9kZXYoZGV2KQotCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOwotfQotCiAjZGVmaW5lIFBSR19DTF9SRVNFVF9WQUxJRCAweDAwMDEwMDAwCiAKIHN0YXRpYyB2b2lkIF9faW5pdApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwppbmRleCBjYWUzZDEzLi5lMWY1MWQ0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwpAQCAtNDc3LDggKzQ3NywxMCBAQAogCQkgICAgICAgIiBhZGRyZXNzLCBwb2xsaW5nXG4iKTsKIAogCWk4MjU5X2luaXQocGljLCBjaHJwX2ludF9hY2spOwotCWlmIChwcGNfbWQuZ2V0X2lycSA9PSBOVUxMKQorCWlmIChwcGNfbWQuZ2V0X2lycSA9PSBOVUxMKSB7CiAJCXBwY19tZC5nZXRfaXJxID0gaTgyNTlfaXJxOworCQlpcnFfc2V0X2RlZmF1bHRfaG9zdChpODI1OV9nZXRfaG9zdCgpKTsKKwl9CiAJaWYgKGNocnBfbXBpYyAhPSBOVUxMKSB7CiAJCWNhc2NhZGVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAocGljLCAwKTsKIAkJaWYgKGNhc2NhZGVfaXJxID09IE5PX0lSUSkKQEAgLTU4Niw3ICs1ODgsNiBAQAogCUlTQV9ETUFfVEhSRVNIT0xEID0gfjBMOwogCURNQV9NT0RFX1JFQUQgPSAweDQ0OwogCURNQV9NT0RFX1dSSVRFID0gMHg0ODsKLQlpc2FfaW9fYmFzZSA9IENIUlBfSVNBX0lPX0JBU0U7CQkvKiBkZWZhdWx0IHZhbHVlICovCiAKIAlyZXR1cm4gMTsKIH0KQEAgLTU5OCw3ICs1OTksNiBAQAogCS5pbml0CQkJPSBjaHJwX2luaXQyLAogCS5zaG93X2NwdWluZm8JCT0gY2hycF9zaG93X2NwdWluZm8sCiAJLmluaXRfSVJRCQk9IGNocnBfaW5pdF9JUlEsCi0JLnBjaWJpb3NfZml4dXAJCT0gY2hycF9wY2liaW9zX2ZpeHVwLAogCS5yZXN0YXJ0CQk9IHJ0YXNfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IHJ0YXNfcG93ZXJfb2ZmLAogCS5oYWx0CQkJPSBydGFzX2hhbHQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKaW5kZXggMjM0YTg2MS4uYjNjMmNlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwpAQCAtMzUsNyArMzUsNyBAQAogCSAgU2VsZWN0IEhEUFUgaWYgY29uZmlndXJpbmcgYSBTa3kgQ29tcHV0ZXJzIENvbXB1dGUgQmxhZGUuCiAKIGNvbmZpZyBIRFBVX0ZFQVRVUkVTCi0JZGVwZW5kcyBIRFBVCisJZGVwZW5kcyBvbiBIRFBVCiAJdHJpc3RhdGUgIkhEUFUtRmVhdHVyZXMiCiAJaGVscAogCSAgU2VsZWN0IHRvIGVuYWJsZSBIRFBVIGVuaGFuY2VkIGZlYXR1cmVzLgpAQCAtNzQsNiArNzQsMTggQEAKIAkgIFNlbGVjdCBTQU5EUE9JTlQgaWYgY29uZmlndXJpbmcgZm9yIGEgTW90b3JvbGEgU2FuZHBvaW50IFgzCiAJICAoYW55IGZsYXZvcikuCiAKK2NvbmZpZyBMSU5LU1RBVElPTgorCWJvb2wgIkxpbmtzdGF0aW9uIC8gS3Vyb2JveChIRykgZnJvbSBCdWZmYWxvIgorCXNlbGVjdCBNUElDCisJc2VsZWN0IEZTTF9TT0MKKwlzZWxlY3QgUFBDX1VEQkdfMTY1NTAgaWYgU0VSSUFMXzgyNTAKKwloZWxwCisJICBTZWxlY3QgTElOS1NUQVRJT04gaWYgY29uZmlndXJpbmcgZm9yIG9uZSBvZiBQUEMtIChNUEM4MjQxKQorCSAgYmFzZWQgTkFTIHN5c3RlbXMgZnJvbSBCdWZmYWxvIFRlY2hub2xvZ3kuIFNvIGZhciBvbmx5CisJICBLdXJvYm94SEcgaGFzIGJlZW4gdGVzdGVkLiBJbiB0aGUgZnV0dXJlIGNsYXNzaWNhbCBLdXJvYm94LAorCSAgTGlua3N0YXRpb24tSSBIRC1ITEFOIGFuZCBIRC1IR0xBTiB2ZXJzaW9ucywgYW5kIFBQQy1iYXNlZAorCSAgVGVyYXN0YXRpb24gc3lzdGVtcyBzaG91bGQgYmUgc3VwcG9ydGVkIHRvby4KKwogY29uZmlnIE1QQzc0NDhIUEMyCiAJYm9vbCAiRnJlZXNjYWxlIE1QQzc0NDhIUEMyKFRhaWdhKSIKIAlzZWxlY3QgVFNJMTA4X0JSSURHRQpAQCAtMTQ2LDE1ICsxNTgsNiBAQAogCSAgU2VsZWN0IFBRMkZBRFMgaWYgeW91IHdpc2ggdG8gY29uZmlndXJlIGZvciBhIEZyZWVzY2FsZQogCSAgUFEyRkFEUyBib2FyZCAoLVZSIG9yIC1aVSkuCiAKLWNvbmZpZyBMSVRFNTIwMAotCWJvb2wgIkZyZWVzY2FsZSBMSVRFNTIwMCAvIChJY2VDdWJlKSIKLQlzZWxlY3QgUFBDX01QQzUyeHgKLQloZWxwCi0JICBTdXBwb3J0IGZvciB0aGUgTElURTUyMDAgZGV2IGJvYXJkIGZvciB0aGUgTVBDNTIwMCBmcm9tIEZyZWVzY2FsZS4KLQkgIFRoaXMgaXMgZm9yIHRoZSBMSVRFNTIwMCB2ZXJzaW9uIDIuMCBib2FyZC4gRG9uJ3Qga25vdyBpZiBpdCBjaGFuZ2VzCi0JICBtdWNoIGJ1dCBpdCdzIG9ubHkgYmVlbiB0ZXN0ZWQgb24gdGhpcyBib2FyZCB2ZXJzaW9uLiBJIHRoaW5rIHRoaXMKLQkgIGJvYXJkIGlzIGFsc28ga25vd24gYXMgSWNlQ3ViZS4KLQogY29uZmlnIEVWNjQzNjAKIAlib29sICJNYXJ2ZWxsLUVWNjQzNjBCUCIKIAloZWxwCkBAIC0xNzIsOSArMTc1LDYgQEAKIAlkZXBlbmRzIG9uIDh4eCAmJiAoVFFNODIzTCB8fCBUUU04NTBMIHx8IEZQUzg1MEwgfHwgVFFNODU1TCB8fCBUUU04NjBMKQogCWRlZmF1bHQgeQogCi1jb25maWcgUFBDX01QQzUyeHgKLQlib29sCi0KIGNvbmZpZyA4MjYwCiAJYm9vbCAiQ1BNMiBTdXBwb3J0IiBpZiBXSUxMT1cKIAlkZXBlbmRzIG9uIDZ4eApAQCAtMjA4LDcgKzIwOCw3IEBACiAJZGVwZW5kcyBvbiBTQU5EUE9JTlQgfHwgU1BSVUNFIHx8IFBQTFVTIHx8IFwKIAkJUFJQTUM3NTAgfHwgUFJQTUM4MDAgfHwgTE9QRUMgfHwgXAogCQkoRVY2NDI2MCAmJiAhU0VSSUFMX01QU0MpIHx8IENIRVNUTlVUIHx8IFJBRFNUT05FX1BQQzdEIHx8IFwKLQkJODN4eAorCQk4M3h4IHx8IExJTktTVEFUSU9OCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBGT1JDRQpAQCAtMjgyLDEzICsyODIsMTMgQEAKIAogY29uZmlnIE1QQzEwWF9CUklER0UKIAlib29sCi0JZGVwZW5kcyBvbiBQT1dFUlBNQzI1MCB8fCBMT1BFQyB8fCBTQU5EUE9JTlQKKwlkZXBlbmRzIG9uIFBPV0VSUE1DMjUwIHx8IExPUEVDIHx8IFNBTkRQT0lOVCB8fCBMSU5LU1RBVElPTgogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBNUEMxMFhfT1BFTlBJQwogCWJvb2wKLQlkZXBlbmRzIG9uIFBPV0VSUE1DMjUwIHx8IExPUEVDIHx8IFNBTkRQT0lOVAorCWRlcGVuZHMgb24gUE9XRVJQTUMyNTAgfHwgTE9QRUMgfHwgU0FORFBPSU5UIHx8IExJTktTVEFUSU9OCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBNUEMxMFhfU1RPUkVfR0FUSEVSSU5HCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9NYWtlZmlsZQppbmRleCBmYTQ5OWZlLi5kM2QxMWEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvTWFrZWZpbGUKQEAgLTIsMyArMiw0IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgNnh4Lzd4eC83eHh4eCBsaW51eCBrZXJuZWwuCiAjCiBvYmotJChDT05GSUdfTVBDNzQ0OEhQQzIpCSs9IG1wYzc0NDhfaHBjMi5vCitvYmotJChDT05GSUdfTElOS1NUQVRJT04pCSs9IGxpbmtzdGF0aW9uLm8gbHNfdWFydC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1OTlkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIEJvYXJkIHNldHVwIHJvdXRpbmVzIGZvciB0aGUgQnVmZmFsbyBMaW5rc3RhdGlvbiAvIEt1cm9ib3ggUGxhdGZvcm0uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEcuIExpYWtob3ZldHNraSAoZy5saWFraG92ZXRza2lAZ214LmRlKQorICoKKyAqIEJhc2VkIG9uIHNhbmRwb2ludC5jIGJ5IE1hcmsgQS4gR3JlZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YKKyAqIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisjaW5jbHVkZSA8YXNtL21wYzEweC5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBsaW5rc3RhdGlvbl9waHlzbWFwX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgPSAibXRkX2Zpcm1pbWciLAorCQkub2Zmc2V0ID0gMHgwMDAwMDAsCisJCS5zaXplICAgPSAweDMwMDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJtdGRfYm9vdGNvZGUiLAorCQkub2Zmc2V0ID0gMHgzMDAwMDAsCisJCS5zaXplICAgPSAweDA3MDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJtdGRfc3RhdHVzIiwKKwkJLm9mZnNldCA9IDB4MzcwMDAwLAorCQkuc2l6ZSAgID0gMHgwMTAwMDAsCisJfSwKKwl7CisJCS5uYW1lICAgPSAibXRkX2NvbmYiLAorCQkub2Zmc2V0ID0gMHgzODAwMDAsCisJCS5zaXplICAgPSAweDA4MDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJtdGRfYWxsZmxhc2giLAorCQkub2Zmc2V0ID0gMHgwMDAwMDAsCisJCS5zaXplICAgPSAweDQwMDAwMCwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJtdGRfZGF0YSIsCisJCS5vZmZzZXQgPSAweDMxMDAwMCwKKwkJLnNpemUgICA9IDB4MGYwMDAwLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQoreworCWludCBsZW47CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCWludCAqYnVzX3JhbmdlOworCisJcHJpbnRrKCJBZGRpbmcgUENJIGhvc3QgYnJpZGdlICVzXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CisKKwlidXNfcmFuZ2UgPSAoaW50ICopIGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgorCQkJCSIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKKworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlpZiAoaG9zZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CisJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CisJaG9zZS0+YXJjaF9kYXRhID0gZGV2OworCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCAweGZlYzAwMDAwLCAweGZlZTAwMDAwKTsKKworCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KKwkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KKwlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGxpbmtzdGF0aW9uX3NldHVwX2FyY2godm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworI2lmZGVmIENPTkZJR19NVERfUEhZU01BUAorCXBoeXNtYXBfc2V0X3BhcnRpdGlvbnMobGlua3N0YXRpb25fcGh5c21hcF9wYXJ0aXRpb25zLAorCQkJICAgICAgIEFSUkFZX1NJWkUobGlua3N0YXRpb25fcGh5c21hcF9wYXJ0aXRpb25zKSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmIChpbml0cmRfc3RhcnQpCisJCVJPT1RfREVWID0gUm9vdF9SQU0wOworCWVsc2UKKyNlbmRpZgorI2lmZGVmCUNPTkZJR19ST09UX05GUworCQlST09UX0RFViA9IFJvb3RfTkZTOworI2Vsc2UKKwkJUk9PVF9ERVYgPSBSb290X0hEQTE7CisjZW5kaWYKKworCS8qIExvb2t1cCBQQ0kgaG9zdCBicmlkZ2VzICovCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQorCQlhZGRfYnJpZGdlKG5wKTsKKworCXByaW50ayhLRVJOX0lORk8gIkJVRkZBTE8gTmV0d29yayBBdHRhY2hlZCBTdG9yYWdlIFNlcmllc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiKEMpIDIwMDItMjAwNSBCVUZGQUxPIElOQy5cbiIpOworfQorCisvKgorICogSW50ZXJydXB0IHNldHVwIGFuZCBzZXJ2aWNlLiAgSW50ZXJycnVwdHMgb24gdGhlIGxpbmtzdGF0aW9uIGNvbWUKKyAqIGZyb20gdGhlIGZvdXIgUENJIHNsb3RzIHBsdXMgb25ib2FyZCA4MjQxIGRldmljZXM6IEkyQywgRFVBUlQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBsaW5rc3RhdGlvbl9pbml0X0lSUSh2b2lkKQoreworCXN0cnVjdCBtcGljICptcGljOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG5wOworCXZvaWQgKnByb3A7CisJaW50IHNpemU7CisJcGh5c19hZGRyX3QgcGFkZHI7CisKKwlkbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKKwlpZiAoZG5wID09IE5VTEwpCisJCXJldHVybjsKKworCXByb3AgPSAoc3RydWN0IGRldmljZV9ub2RlICopZ2V0X3Byb3BlcnR5KGRucCwgInJlZyIsICZzaXplKTsKKwlwYWRkciA9IChwaHlzX2FkZHJfdClvZl90cmFuc2xhdGVfYWRkcmVzcyhkbnAsIHByb3ApOworCisJbXBpYyA9IG1waWNfYWxsb2MoZG5wLCBwYWRkciwgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCwgNCwgMzIsICIgRVBJQyAgICAgIik7CisJQlVHX09OKG1waWMgPT0gTlVMTCk7CisKKwkvKiBQQ0kgSVJRcyAqLworCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCBwYWRkciArIDB4MTAyMDApOworCisJLyogSTJDICovCisJbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHBhZGRyICsgMHgxMTAwMCk7CisKKwkvKiB0dHlTMCwgdHR5UzEgKi8KKwltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgcGFkZHIgKyAweDExMTAwKTsKKworCW1waWNfaW5pdChtcGljKTsKK30KKworZXh0ZXJuIHZvaWQgYXZyX3VhcnRfY29uZmlndXJlKHZvaWQpOworZXh0ZXJuIHZvaWQgYXZyX3VhcnRfc2VuZChjb25zdCBjaGFyKTsKKworc3RhdGljIHZvaWQgbGlua3N0YXRpb25fcmVzdGFydChjaGFyICpjbWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCS8qIFJlc2V0IHN5c3RlbSB2aWEgQVZSICovCisJYXZyX3VhcnRfY29uZmlndXJlKCk7CisJLyogU2VuZCByZWJvb3QgY29tbWFuZCAqLworCWF2cl91YXJ0X3NlbmQoJ0MnKTsKKworCWZvcig7OykgIC8qIFNwaW4gdW50aWwgcmVzZXQgaGFwcGVucyAqLworCQlhdnJfdWFydF9zZW5kKCdHJyk7CS8qICJraWNrIiAqLworfQorCitzdGF0aWMgdm9pZCBsaW5rc3RhdGlvbl9wb3dlcl9vZmYodm9pZCkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogUG93ZXIgZG93biBzeXN0ZW0gdmlhIEFWUiAqLworCWF2cl91YXJ0X2NvbmZpZ3VyZSgpOworCS8qIHNlbmQgc2h1dGRvd24gY29tbWFuZCAqLworCWF2cl91YXJ0X3NlbmQoJ0UnKTsKKworCWZvcig7OykgIC8qIFNwaW4gdW50aWwgcG93ZXItb2ZmIGhhcHBlbnMgKi8KKwkJYXZyX3VhcnRfc2VuZCgnRycpOwkvKiAia2ljayIgKi8KKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkIGxpbmtzdGF0aW9uX2hhbHQodm9pZCkKK3sKKwlsaW5rc3RhdGlvbl9wb3dlcl9vZmYoKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkIGxpbmtzdGF0aW9uX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc2VxX3ByaW50ZihtLCAidmVuZG9yXHRcdDogQnVmZmFsbyBUZWNobm9sb2d5XG4iKTsKKwlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogTGlua3N0YXRpb24gSS9LdXJvYm94KEhHKVxuIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxpbmtzdGF0aW9uX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByb290OworCisJcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJsaW5rc3RhdGlvbiIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworZGVmaW5lX21hY2hpbmUobGlua3N0YXRpb24peworCS5uYW1lIAkJCT0gIkJ1ZmZhbG8gTGlua3N0YXRpb24iLAorCS5wcm9iZSAJCQk9IGxpbmtzdGF0aW9uX3Byb2JlLAorCS5zZXR1cF9hcmNoIAkJPSBsaW5rc3RhdGlvbl9zZXR1cF9hcmNoLAorCS5pbml0X0lSUSAJCT0gbGlua3N0YXRpb25faW5pdF9JUlEsCisJLnNob3dfY3B1aW5mbyAJCT0gbGlua3N0YXRpb25fc2hvd19jcHVpbmZvLAorCS5nZXRfaXJxIAkJPSBtcGljX2dldF9pcnEsCisJLnJlc3RhcnQgCQk9IGxpbmtzdGF0aW9uX3Jlc3RhcnQsCisJLnBvd2VyX29mZiAJCT0gbGlua3N0YXRpb25fcG93ZXJfb2ZmLAorCS5oYWx0CSAJCT0gbGlua3N0YXRpb25faGFsdCwKKwkuY2FsaWJyYXRlX2RlY3IgCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xzX3VhcnQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbHNfdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODM3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xzX3VhcnQuYwpAQCAtMCwwICsxLDEzMSBAQAorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21wYzEweC5oPgorI2luY2x1ZGUgPGFzbS9wcGNfc3lzLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdGVybWJpdHMuaD4KKworc3RhdGljIHZvaWQgX19pb21lbSAqYXZyX2FkZHI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBhdnJfY2xvY2s7CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2Rfd29yazsKKworc3RhdGljIHZvaWQgd2Rfc3RvcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKK3sKKwljb25zdCBjaGFyIHN0cmluZ1tdID0gIkFBQUFGRkZGSkpKSj4+Pj5WVlZWPj4+PlpaWlpWVlZWS0tLSyI7CisJaW50IGkgPSAwLCByZXNjdWUgPSA4OworCWludCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKworCXdoaWxlIChyZXNjdWUtLSkgeworCQlpbnQgajsKKwkJY2hhciBsc3IgPSBpbl84KGF2cl9hZGRyICsgVUFSVF9MU1IpOworCisJCWlmIChsc3IgJiAoVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX1RFTVQpKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgMTYgJiYgaSA8IGxlbjsgaisrLCBpKyspCisJCQkJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX1RYLCBzdHJpbmdbaV0pOworCQkJaWYgKGkgPT0gbGVuKSB7CisJCQkJLyogUmVhZCAiT0siIGJhY2s6IDRtcyBmb3IgdGhlIGxhc3QgIktLS0siCisJCQkJICAgcGx1cyBhIGNvdXBsZSBieXRlcyBiYWNrICovCisJCQkJbXNsZWVwKDcpOworCQkJCXByaW50aygibGlua3N0YXRpb246IGRpc2FybWluZyB0aGUgQVZSIHdhdGNoZG9nOiAiKTsKKwkJCQl3aGlsZSAoaW5fOChhdnJfYWRkciArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKQorCQkJCQlwcmludGsoIiVjIiwgaW5fOChhdnJfYWRkciArIFVBUlRfUlgpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQltc2xlZXAoMTcpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKyNkZWZpbmUgQVZSX1FVT1QoY2xvY2spICgoY2xvY2spICsgOCAqIDk2MDApIC8gKDE2ICogOTYwMCkKKwordm9pZCBhdnJfdWFydF9jb25maWd1cmUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGN2YWwgPSBVQVJUX0xDUl9XTEVOODsKKwl1bnNpZ25lZCBpbnQgcXVvdCA9IEFWUl9RVU9UKGF2cl9jbG9jayk7CisKKwlpZiAoIWF2cl9hZGRyIHx8ICFhdnJfY2xvY2spCisJCXJldHVybjsKKworCW91dF84KGF2cl9hZGRyICsgVUFSVF9MQ1IsIGN2YWwpOwkJCS8qIGluaXRpYWxpc2UgVUFSVCAqLworCW91dF84KGF2cl9hZGRyICsgVUFSVF9NQ1IsIDApOworCW91dF84KGF2cl9hZGRyICsgVUFSVF9JRVIsIDApOworCisJY3ZhbCB8PSBVQVJUX0xDUl9TVE9QIHwgVUFSVF9MQ1JfUEFSSVRZIHwgVUFSVF9MQ1JfRVBBUjsKKworCW91dF84KGF2cl9hZGRyICsgVUFSVF9MQ1IsIGN2YWwpOwkJCS8qIFNldCBjaGFyYWN0ZXIgZm9ybWF0ICovCisKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfTENSLCBjdmFsIHwgVUFSVF9MQ1JfRExBQik7CS8qIHNldCBETEFCICovCisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX0RMTCwgcXVvdCAmIDB4ZmYpOwkJLyogTFMgb2YgZGl2aXNvciAqLworCW91dF84KGF2cl9hZGRyICsgVUFSVF9ETE0sIHF1b3QgPj4gOCk7CQkJLyogTVMgb2YgZGl2aXNvciAqLworCW91dF84KGF2cl9hZGRyICsgVUFSVF9MQ1IsIGN2YWwpOwkJCS8qIHJlc2V0IERMQUIgKi8KKwlvdXRfOChhdnJfYWRkciArIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyk7CS8qIGVuYWJsZSBGSUZPICovCit9CisKK3ZvaWQgYXZyX3VhcnRfc2VuZChjb25zdCBjaGFyIGMpCit7CisJaWYgKCFhdnJfYWRkciB8fCAhYXZyX2Nsb2NrKQorCQlyZXR1cm47CisKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfVFgsIGMpOworCW91dF84KGF2cl9hZGRyICsgVUFSVF9UWCwgYyk7CisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX1RYLCBjKTsKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfVFgsIGMpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbHNfdWFydF9pbml0KHZvaWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworI2lmbmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfRkNSLCBVQVJUX0ZDUl9FTkFCTEVfRklGTyk7CS8qIGVuYWJsZSBGSUZPICovCisJb3V0XzgoYXZyX2FkZHIgKyBVQVJUX0ZDUiwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfAorCSAgICAgIFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKTsJLyogY2xlYXIgRklGT3MgKi8KKwlvdXRfOChhdnJfYWRkciArIFVBUlRfRkNSLCAwKTsKKwlvdXRfOChhdnJfYWRkciArIFVBUlRfSUVSLCAwKTsKKworCS8qIENsZWFyIHVwIGludGVycnVwdHMgKi8KKwkodm9pZCkgaW5fOChhdnJfYWRkciArIFVBUlRfTFNSKTsKKwkodm9pZCkgaW5fOChhdnJfYWRkciArIFVBUlRfUlgpOworCSh2b2lkKSBpbl84KGF2cl9hZGRyICsgVUFSVF9JSVIpOworCSh2b2lkKSBpbl84KGF2cl9hZGRyICsgVUFSVF9NU1IpOworI2VuZGlmCisJYXZyX3VhcnRfY29uZmlndXJlKCk7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxzX3VhcnRzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmF2cjsKKwlwaHlzX2FkZHJfdCBwaHlzX2FkZHI7CisJaW50IGxlbjsKKworCWF2ciA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvc29jMTB4L3NlcmlhbEA4MDAwNDUwMCIpOworCWlmICghYXZyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF2cl9jbG9jayA9ICoodTMyKilnZXRfcHJvcGVydHkoYXZyLCAiY2xvY2stZnJlcXVlbmN5IiwgJmxlbik7CisJcGh5c19hZGRyID0gKCh1MzIqKWdldF9wcm9wZXJ0eShhdnIsICJyZWciLCAmbGVuKSlbMF07CisKKwlpZiAoIWF2cl9jbG9jayB8fCAhcGh5c19hZGRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF2cl9hZGRyID0gaW9yZW1hcChwaHlzX2FkZHIsIDMyKTsKKwlpZiAoIWF2cl9hZGRyKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxzX3VhcnRfaW5pdCgpOworCisJSU5JVF9XT1JLKCZ3ZF93b3JrLCB3ZF9zdG9wKTsKKwlzY2hlZHVsZV93b3JrKCZ3ZF93b3JrKTsKKworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKGxzX3VhcnRzX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKaW5kZXggYmRiNDc1Yy4uM2ZjYzg1ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCkBAIC02MCw3ICs2MCw3IEBACiAKIGV4dGVybiBpbnQgdHNpMTA4X3NldHVwX3BjaShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiBleHRlcm4gdm9pZCBfbm1hc2tfYW5kX29yX21zcih1bnNpZ25lZCBsb25nIG5tYXNrLCB1bnNpZ25lZCBsb25nIG9yX3ZhbCk7Ci1leHRlcm4gdm9pZCB0c2kxMDhfcGNpX2ludF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgdHNpMTA4X3BjaV9pbnRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIHZvaWQgdHNpMTA4X2lycV9jYXNjYWRlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CiAKIGludCBtcGM3NDQ4X2hwYzJfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQpAQCAtNzEsNjUgKzcxLDYgQEAKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotLyoKLSAqIGZpbmQgcGNpIHNsb3QgYnkgZGV2Zm4gaW4gaW50ZXJydXB0IG1hcCBvZiBPRiB0cmVlCi0gKi8KLXU4IGZpbmRfc2xvdF9ieV9kZXZmbih1bnNpZ25lZCBpbnQgKmludGVycnVwdF9tYXAsIHVuc2lnbmVkIGludCBkZXZmbikKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspewotCQl0bXAgPSBpbnRlcnJ1cHRfbWFwW2kqNCo3XTsKLQkJaWYgKCh0bXAgPj4gMTEpID09IChkZXZmbiA+PiAzKSkKLQkJCXJldHVybiBpOwotCX0KLQlyZXR1cm4gaTsKLX0KLQotLyoKLSAqIFNjYW5zIHRoZSBpbnRlcnJ1cHQgbWFwIGZvciBwY2kgZGV2aWNlCi0gKi8KLXZvaWQgbXBjNzQ0OF9ocGMyX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0JY29uc3QgdW5zaWduZWQgaW50ICppbnRlcnJ1cHQ7Ci0JaW50IGJ1c25yOwotCWludCBsZW47Ci0JdTggc2xvdDsKLQl1OCBwaW47Ci0KLQkvKiBMb29rdXAgdGhlIGhvc2UgKi8KLQlidXNuciA9IGRldi0+YnVzLT5udW1iZXI7Ci0JaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXNucik7Ci0JaWYgKCFob3NlKQotCQlwcmludGsoS0VSTl9FUlIgIk5vIHBjaSBob3NlIGZvdW5kXG4iKTsKLQotCS8qIENoZWNrIGl0IGhhcyBhbiBPRiBub2RlIGFzc29jaWF0ZWQgKi8KLQlub2RlID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKSBob3NlLT5hcmNoX2RhdGE7Ci0JaWYgKCFub2RlKQotCQlwcmludGsoS0VSTl9FUlIgIk5vIHBjaSBub2RlIGZvdW5kXG4iKTsKLQotCWludGVycnVwdCA9IGdldF9wcm9wZXJ0eShub2RlLCAiaW50ZXJydXB0LW1hcCIsICZsZW4pOwotCXNsb3QgPSBmaW5kX3Nsb3RfYnlfZGV2Zm4oaW50ZXJydXB0LCBkZXYtPmRldmZuKTsKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKLQlpZiAocGluID09IDAgfHwgcGluID4gNCkKLQkJcGluID0gMTsKLQlwaW4tLTsKLQlkZXYtPmlycSAgPSBpbnRlcnJ1cHRbc2xvdCo0KjcgKyBwaW4qNyArIDVdOwotCURCRygiVFNJX1BDSTogZGV2LT5pcnEgPSAweCV4XG4iLCBkZXYtPmlycSk7Ci19Ci0vKiB0ZW1wb3JhcnkgcGNpIGlycSBtYXAgZml4dXAqLwotCi12b2lkIF9faW5pdCBtcGM3NDQ4X2hwYzJfcGNpYmlvc19maXh1cCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7Ci0JCW1wYzc0NDhfaHBjMl9maXh1cF9pcnEoZGV2KTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjNzQ0OF9ocGMyX3NldHVwX2FyY2godm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKQEAgLTE5Miw5ICsxMzMsMTIgQEAKIHsKIAlzdHJ1Y3QgbXBpYyAqbXBpYzsKIAlwaHlzX2FkZHJfdCBtcGljX3BhZGRyID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnRzaV9waWM7CisjaWZkZWYgQ09ORklHX1BDSQogCXVuc2lnbmVkIGludCBjYXNjYWRlX3BjaV9pcnE7CiAJc3RydWN0IGRldmljZV9ub2RlICp0c2lfcGNpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdHNpX3BpYzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNhc2NhZGVfbm9kZSA9IE5VTEw7CisjZW5kaWYKIAogCXRzaV9waWMgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKIAlpZiAodHNpX3BpYykgewpAQCAtMjA4LDMxICsxNTIsNDEgQEAKIAkJcmV0dXJuOwogCX0KIAotCURCRygiJXM6IHRzaTEwOHBpYyBwaHlzX2FkZHIgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sCisJREJHKCIlczogdHNpMTA4IHBpYyBwaHlzX2FkZHIgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sCiAJICAgICh1MzIpIG1waWNfcGFkZHIpOwogCiAJbXBpYyA9IG1waWNfYWxsb2ModHNpX3BpYywgbXBpY19wYWRkciwKIAkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfQklHX0VORElBTiB8IE1QSUNfV0FOVFNfUkVTRVQgfAogCQkJTVBJQ19TUFZfRU9JIHwgTVBJQ19OT19QVEhST1VfRElTIHwgTVBJQ19SRUdTRVRfVFNJMTA4LAotCQkJMCwgLyogbnVtX3NvdXJjZXMgdXNlZCAqLwotCQkJMCwgLyogbnVtX3NvdXJjZXMgdXNlZCAqLworCQkJMjQsCisJCQlOUl9JUlFTLTQsIC8qIG51bV9zb3VyY2VzIHVzZWQgKi8KIAkJCSJUc2kxMDhfUElDIik7CiAKLQlCVUdfT04obXBpYyA9PSBOVUxMKTsgLyogWFhYWCAqLworCUJVR19PTihtcGljID09IE5VTEwpOworCisJbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIG1waWNfcGFkZHIgKyAweDEwMCk7CisKIAltcGljX2luaXQobXBpYyk7CiAKKyNpZmRlZiBDT05GSUdfUENJCiAJdHNpX3BjaSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJwY2kiKTsKLQlpZiAodHNpX3BjaSA9PSAwKSB7CisJaWYgKHRzaV9wY2kgPT0gTlVMTCkgewogCQlwcmludGsoIiVzOiBObyB0c2kxMDggcGNpIG5vZGUgZm91bmQgIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KKwljYXNjYWRlX25vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAicGljLXJvdXRlciIpOworCWlmIChjYXNjYWRlX25vZGUgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBObyB0c2kxMDggcGNpIGNhc2NhZGUgbm9kZSBmb3VuZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQogCiAJY2FzY2FkZV9wY2lfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAodHNpX3BjaSwgMCk7CisJREJHKCIlczogdHNpMTA4IGNhc2NhZGVfcGNpX2lycSA9IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgKHUzMikgY2FzY2FkZV9wY2lfaXJxKTsKKwl0c2kxMDhfcGNpX2ludF9pbml0KGNhc2NhZGVfbm9kZSk7CiAJc2V0X2lycV9kYXRhKGNhc2NhZGVfcGNpX2lycSwgbXBpYyk7CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoY2FzY2FkZV9wY2lfaXJxLCB0c2kxMDhfaXJxX2Nhc2NhZGUpOwotCi0JdHNpMTA4X3BjaV9pbnRfaW5pdCgpOwotCisjZW5kaWYKIAkvKiBDb25maWd1cmUgTVBJQyBvdXRwdXRzIHRvIENQVTAgKi8KIAl0c2kxMDhfd3JpdGVfcmVnKFRTSTEwOF9NUElDX09GRlNFVCArIDB4MzBjLCAwKTsKIAlvZl9ub2RlX3B1dCh0c2lfcGljKTsKQEAgLTI5MCw3ICsyNDQsNiBAQAogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7Ci0KIH0KIAogZGVmaW5lX21hY2hpbmUobXBjNzQ0OF9ocGMyKXsKQEAgLTMwMCw3ICsyNTMsNiBAQAogCS5pbml0X0lSUSAJCT0gbXBjNzQ0OF9ocGMyX2luaXRfSVJRLAogCS5zaG93X2NwdWluZm8gCQk9IG1wYzc0NDhfaHBjMl9zaG93X2NwdWluZm8sCiAJLmdldF9pcnEgCQk9IG1waWNfZ2V0X2lycSwKLQkucGNpYmlvc19maXh1cCAJCT0gbXBjNzQ0OF9ocGMyX3BjaWJpb3NfZml4dXAsCiAJLnJlc3RhcnQgCQk9IG1wYzc0NDhfaHBjMl9yZXN0YXJ0LAogCS5jYWxpYnJhdGVfZGVjciAJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAogCS5tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbj0gbXBjNzQ0OF9tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9NYWtlZmlsZQppbmRleCBkZWU0ZWI0Li4xM2FjMzAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlCkBAIC0xLDUgKzEsNyBAQAogRVhUUkFfQ0ZMQUdTCSs9IC1tbm8tbWluaW1hbC10b2MKIAorZXh0cmEteSArPSBkdC5vCisKIG9iai15ICs9IGh2bG9nLm8gaHZscGNvbmZpZy5vIGxwYXJkYXRhLm8gc2V0dXAubyBkdF9tb2QubyBtZi5vIGxwZXZlbnRzLm8gXAogCWh2Y2FsbC5vIHByb2MubyBodGFiLm8gaW9tbXUubyBtaXNjLm8gaXJxLm8KIG9iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vIHZwZGluZm8ubwpAQCAtNyw1ICs5LDkgQEAKIG9iai0kKENPTkZJR19WSU9QQVRIKSArPSB2aW9wYXRoLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBrc3ltcy5vCiAKK3F1aWV0X2NtZF9kdF9zdHJpbmdzID0gRFRfU1RSICAkQAorICAgICAgY21kX2R0X3N0cmluZ3MgPSAkKE9CSkNPUFkpIC0tcmVuYW1lLXNlY3Rpb24gLnJvZGF0YS5zdHIxLjg9LmR0X3N0cmluZ3MgXAorCQkJCSQ8ICRACisKICQob2JqKS9kdF9tb2QubzoJJChvYmopL2R0Lm8KLQlAJChPQkpDT1BZKSAtLXJlbmFtZS1zZWN0aW9uIC5yb2RhdGEuc3RyMS44PS5kdF9zdHJpbmdzICQob2JqKS9kdC5vICQob2JqKS9kdF9tb2QubworCSQoY2FsbCBpZl9jaGFuZ2VkLGR0X3N0cmluZ3MpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvZHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9kdC5jCmluZGV4IGUzMDVkZWUuLjllOGEzMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9kdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9kdC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAiY2FsbF9wY2kuaCIKICNpbmNsdWRlICJwY2kuaCIKICNpbmNsdWRlICJpdF9leHBfdnBkX3BhbmVsLmgiCisjaW5jbHVkZSAibmFjYS5oIgogCiAjaWZkZWYgREVCVUcKICNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQpAQCAtMjA1LDEzICsyMDYsMTEgQEAKIAlkdF9wcm9wKGR0LCBuYW1lLCAmZGF0YSwgc2l6ZW9mKHUzMikpOwogfQogCi0jaWZkZWYgbm90eWV0CiBzdGF0aWMgdm9pZCBfX2luaXQgZHRfcHJvcF91NjQoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCXU2NCBkYXRhKQogewogCWR0X3Byb3AoZHQsIG5hbWUsICZkYXRhLCBzaXplb2YodTY0KSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfdTY0X2xpc3Qoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsCiAJCWNvbnN0IGNoYXIgKm5hbWUsIHU2NCAqZGF0YSwgaW50IG4pCkBAIC0zMDYsNiArMzA1LDE3IEBACiAJZHRfcHJvcF91MzIoZHQsICJpYm0scGFydGl0aW9uLW5vIiwgSHZMcENvbmZpZ19nZXRMcEluZGV4KCkpOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgZHRfaW5pdHJkKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0KQoreworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmIChuYWNhLnhSYW1EaXNrKSB7CisJCWR0X3Byb3BfdTY0KGR0LCAibGludXgsaW5pdHJkLXN0YXJ0IiwgKHU2NCluYWNhLnhSYW1EaXNrKTsKKwkJZHRfcHJvcF91NjQoZHQsICJsaW51eCxpbml0cmQtZW5kIiwKKwkJCSh1NjQpbmFjYS54UmFtRGlzayArIG5hY2EueFJhbURpc2tTaXplICogSFdfUEFHRV9TSVpFKTsKKwl9CisjZW5kaWYKK30KKwogc3RhdGljIHZvaWQgX19pbml0IGR0X2RvX3ZkZXZpY2Uoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsCiAJCWNvbnN0IGNoYXIgKm5hbWUsIHUzMiByZWcsIGludCB1bml0LAogCQljb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpjb21wYXQsIGludCBlbmQpCkBAIC02NDEsNiArNjUxLDcgQEAKIAkvKiAvY2hvc2VuICovCiAJZHRfc3RhcnRfbm9kZShpc2VyaWVzX2R0LCAiY2hvc2VuIik7CiAJZHRfcHJvcF9zdHIoaXNlcmllc19kdCwgImJvb3RhcmdzIiwgY21kX2xpbmUpOworCWR0X2luaXRyZChpc2VyaWVzX2R0KTsKIAlkdF9lbmRfbm9kZShpc2VyaWVzX2R0KTsKIAogCWR0X2NwdXMoaXNlcmllc19kdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCmluZGV4IGY0Y2JiY2YuLmQ3YTc1NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS90Y2UuaD4KQEAgLTQzLDkgKzQ0LDYgQEAKIAl1NjQgcmM7CiAJdTY0IHRjZSwgcnBuOwogCi0JaW5kZXggPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQlucGFnZXMgPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQogCXdoaWxlIChucGFnZXMtLSkgewogCQlycG4gPSB2aXJ0X3RvX2Ficyh1YWRkcikgPj4gVENFX1NISUZUOwogCQl0Y2UgPSAocnBuICYgVENFX1JQTl9NQVNLKSA8PCBUQ0VfUlBOX1NISUZUOwpAQCAtNzUsOSArNzMsNiBAQAogewogCXU2NCByYzsKIAotCW5wYWdlcyA8PD0gVENFX1BBR0VfRkFDVE9SOwotCWluZGV4IDw8PSBUQ0VfUEFHRV9GQUNUT1I7Ci0KIAl3aGlsZSAobnBhZ2VzLS0pIHsKIAkJcmMgPSBIdkNhbGxYbV9zZXRUY2UoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KWluZGV4LCAwKTsKIAkJaWYgKHJjKQpAQCAtMTIwLDEyICsxMTUsMTAgQEAKIHsKIAlzdHJ1Y3QgaW9tbXVfdGFibGVfY2IgKnBhcm1zOwogCi0JcGFybXMgPSBrbWFsbG9jKHNpemVvZigqcGFybXMpLCBHRlBfS0VSTkVMKTsKKwlwYXJtcyA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJtcyksIEdGUF9LRVJORUwpOwogCWlmIChwYXJtcyA9PSBOVUxMKQogCQlwYW5pYygiUENJX0RNQTogVENFIFRhYmxlIEFsbG9jYXRpb24gZmFpbGVkLiIpOwogCi0JbWVtc2V0KHBhcm1zLCAwLCBzaXplb2YoKnBhcm1zKSk7Ci0KIAlwYXJtcy0+aXRjX2J1c25vID0gYnVzbm87CiAJcGFybXMtPml0Y19zbG90bm8gPSBzbG90bm87CiAJcGFybXMtPml0Y192aXJ0YnVzID0gdmlydGJ1czsKQEAgLTEzNiwxMCArMTI5LDkgQEAKIAkJcGFuaWMoIlBDSV9ETUE6IHBhcm1zLT5zaXplIGlzIHplcm8sIHBhcm1zIGlzIDB4JXAiLCBwYXJtcyk7CiAKIAkvKiBpdGNfc2l6ZSBpcyBpbiBwYWdlcyB3b3J0aCBvZiB0YWJsZSwgaXRfc2l6ZSBpcyBpbiAjIG9mIGVudHJpZXMgKi8KLQl0YmwtPml0X3NpemUgPSAoKHBhcm1zLT5pdGNfc2l6ZSAqIFRDRV9QQUdFX1NJWkUpIC8KLQkJCVRDRV9FTlRSWV9TSVpFKSA+PiBUQ0VfUEFHRV9GQUNUT1I7CisJdGJsLT5pdF9zaXplID0gKHBhcm1zLT5pdGNfc2l6ZSAqIFRDRV9QQUdFX1NJWkUpIC8gVENFX0VOVFJZX1NJWkU7CiAJdGJsLT5pdF9idXNubyA9IHBhcm1zLT5pdGNfYnVzbm87Ci0JdGJsLT5pdF9vZmZzZXQgPSBwYXJtcy0+aXRjX29mZnNldCA+PiBUQ0VfUEFHRV9GQUNUT1I7CisJdGJsLT5pdF9vZmZzZXQgPSBwYXJtcy0+aXRjX29mZnNldDsKIAl0YmwtPml0X2luZGV4ID0gcGFybXMtPml0Y19pbmRleDsKIAl0YmwtPml0X2Jsb2Nrc2l6ZSA9IDE7CiAJdGJsLT5pdF90eXBlID0gdmlydGJ1cyA/IFRDRV9WQiA6IFRDRV9QQ0k7CkBAIC0xNzUsNyArMTY3LDcgQEAKIH0KIAogCi12b2lkIGlvbW11X2Rldm5vZGVfaW5pdF9pU2VyaWVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCit2b2lkIGlvbW11X2Rldm5vZGVfaW5pdF9pU2VyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCXN0cnVjdCBwY2lfZG4gKnBkbiA9IFBDSV9ETihkbik7CkBAIC0xOTMsMTkgKzE4NSwxNCBAQAogCQlwZG4tPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwsIC0xKTsKIAllbHNlCiAJCWtmcmVlKHRibCk7CisJcGRldi0+ZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0gcGRuLT5pb21tdV90YWJsZTsKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfaVNlcmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KLXN0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cF9pU2VyaWVzKHN0cnVjdCBwY2lfYnVzICpidXMpIHsgfQotCiB2b2lkIGlvbW11X2luaXRfZWFybHlfaVNlcmllcyh2b2lkKQogewogCXBwY19tZC50Y2VfYnVpbGQgPSB0Y2VfYnVpbGRfaVNlcmllczsKIAlwcGNfbWQudGNlX2ZyZWUgID0gdGNlX2ZyZWVfaVNlcmllczsKIAotCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfaVNlcmllczsKLQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwID0gaW9tbXVfYnVzX3NldHVwX2lTZXJpZXM7Ci0KLQlwY2lfaW9tbXVfaW5pdCgpOworCXBjaV9kbWFfb3BzID0gJmRtYV9pb21tdV9vcHM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMva3N5bXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9rc3ltcy5jCmluZGV4IGEyMjAwODQuLjI0MzA4NDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9rc3ltcy5jCkBAIC0xOSw5ICsxOSwzIEBACiBFWFBPUlRfU1lNQk9MKEh2Q2FsbDUpOwogRVhQT1JUX1NZTUJPTChIdkNhbGw2KTsKIEVYUE9SVF9TWU1CT0woSHZDYWxsNyk7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi1FWFBPUlRfU1lNQk9MKGxvY2FsX2dldF9mbGFncyk7Ci1FWFBPUlRfU1lNQk9MKGxvY2FsX2lycV9kaXNhYmxlKTsKLUVYUE9SVF9TWU1CT0wobG9jYWxfaXJxX3Jlc3RvcmUpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWYuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCmluZGV4IGI1NzM3ZDYuLmNmZjE1YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCkBAIC0xMTc4LDcgKzExNzgsNyBAQAogCQkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzc2l6ZV90IHJjOwogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAJY2hhciAqcGFnZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWlzYy5TCmluZGV4IDc2NDFmYzcuLjJjNmZmMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9taXNjLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21pc2MuUwpAQCAtMTksMzkgKzE5LDggQEAKIAogCS50ZXh0CiAKLS8qIHVuc2lnbmVkIGxvbmcgbG9jYWxfc2F2ZV9mbGFncyh2b2lkKSAqLwotX0dMT0JBTChsb2NhbF9nZXRfZmxhZ3MpCi0JbGJ6CXIzLFBBQ0FQUk9DRU5BQkxFRChyMTMpCi0JYmxyCi0KLS8qIHVuc2lnbmVkIGxvbmcgbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkgKi8KLV9HTE9CQUwobG9jYWxfaXJxX2Rpc2FibGUpCi0JbGJ6CXIzLFBBQ0FQUk9DRU5BQkxFRChyMTMpCi0JbGkJcjQsMAotCXN0YglyNCxQQUNBUFJPQ0VOQUJMRUQocjEzKQotCWJscgkJCS8qIERvbmUgKi8KLQotLyogdm9pZCBsb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKSAqLwotX0dMT0JBTChsb2NhbF9pcnFfcmVzdG9yZSkKLQlsYnoJcjUsUEFDQVBST0NFTkFCTEVEKHIxMykKLQkgLyogQ2hlY2sgaWYgdGhpbmdzIGFyZSBzZXR1cCB0aGUgd2F5IHdlIHdhbnQgX2FscmVhZHlfLiAqLwotCWNtcHcJMCxyMyxyNQotCWJlcWxyCi0JLyogYXJlIHdlIGVuYWJsaW5nIGludGVycnVwdHM/ICovCi0JY21wZGkJMCxyMywwCi0Jc3RiCXIzLFBBQ0FQUk9DRU5BQkxFRChyMTMpCi0JYmVxbHIKLQkvKiBDaGVjayBwZW5kaW5nIGludGVycnVwdHMgKi8KLQkvKiAgIEEgZGVjcmVtZW50ZXIsIElQSSBvciBQTUMgaW50ZXJydXB0IG1heSBoYXZlIG9jY3VycmVkCi0JICogICB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBoeXBlcnZpc29yICh3aGljaCBlbmFibGVzKSAqLwotCWxkCXI0LFBBQ0FMUFBBQ0FQVFIocjEzKQotCWxkCXI0LExQUEFDQUFOWUlOVChyNCkKLQljbXBkaQlyNCwwCi0JYmVxbHIKLQotCS8qCi0JICogSGFuZGxlIHBlbmRpbmcgaW50ZXJydXB0cyBpbiBpbnRlcnJ1cHQgY29udGV4dAotCSAqLworLyogSGFuZGxlIHBlbmRpbmcgaW50ZXJydXB0cyBpbiBpbnRlcnJ1cHQgY29udGV4dCAqLworX0dMT0JBTChpc2VyaWVzX2hhbmRsZV9pbnRlcnJ1cHRzKQogCWxpCXIwLDB4NTU1NQogCXNjCiAJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKaW5kZXggNGFhMTY1ZS4uNGEwNmQ5YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYwpAQCAtMTU2LDUzICsxNTYsNiBAQAogfQogCiAvKgotICogaVNlcmllc19wY2liaW9zX2luaXQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIGFsbCBwb3NzaWJsZSBzeXN0ZW0gUENJIGhvc3QgYnJpZGdlcyB0aGF0IGNvbm5lY3QKLSAqICAgUENJIGJ1c2VzLiAgVGhlIHN5c3RlbSBoeXBlcnZpc29yIGlzIHF1ZXJpZWQgYXMgdG8gdGhlIGd1ZXN0IHBhcnRpdGlvbgotICogICBvd25lcnNoaXAgc3RhdHVzLiAgQSBwY2lfY29udHJvbGxlciBpcyBidWlsdCBmb3IgYW55IGJ1cyB3aGljaCBpcyBwYXJ0aWFsbHkKLSAqICAgb3duZWQgb3IgZnVsbHkgb3duZWQgYnkgdGhpcyBndWVzdCBwYXJ0aXRpb24uCi0gKi8KLXZvaWQgaVNlcmllc19wY2liaW9zX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IE5VTEw7Ci0KLQlpZiAocm9vdCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgImlTZXJpZXNfcGNpYmlvc19pbml0OiBjYW4ndCBmaW5kIHJvb3QgIgotCQkJCSJvZiBkZXZpY2UgdHJlZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0Jd2hpbGUgKChub2RlID0gb2ZfZ2V0X25leHRfY2hpbGQocm9vdCwgbm9kZSkpICE9IE5VTEwpIHsKLQkJSHZCdXNOdW1iZXIgYnVzOwotCQljb25zdCB1MzIgKmJ1c3A7Ci0KLQkJaWYgKChub2RlLT50eXBlID09IE5VTEwpIHx8IChzdHJjbXAobm9kZS0+dHlwZSwgInBjaSIpICE9IDApKQotCQkJY29udGludWU7Ci0KLQkJYnVzcCA9IGdldF9wcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwgTlVMTCk7Ci0JCWlmIChidXNwID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJYnVzID0gKmJ1c3A7Ci0JCXByaW50aygiYnVzICVkIGFwcGVhcnMgdG8gZXhpc3RcbiIsIGJ1cyk7Ci0JCXBoYiA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihub2RlKTsKLQkJaWYgKHBoYiA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJcGhiLT5wY2lfbWVtX29mZnNldCA9IHBoYi0+bG9jYWxfbnVtYmVyID0gYnVzOwotCQlwaGItPmZpcnN0X2J1c25vID0gYnVzOwotCQlwaGItPmxhc3RfYnVzbm8gPSBidXM7Ci0JCXBoYi0+b3BzID0gJmlTZXJpZXNfcGNpX29wczsKLQl9Ci0KLQlvZl9ub2RlX3B1dChyb290KTsKLQotCXBjaV9kZXZzX3BoYl9pbml0KCk7Ci19Ci0KLS8qCiAgKiBpU2VyaWVzX3BjaV9maW5hbF9maXh1cCh2b2lkKQogICovCiB2b2lkIF9faW5pdCBpU2VyaWVzX3BjaV9maW5hbF9maXh1cCh2b2lkKQpAQCAtMjUzLDcgKzIwNiw3IEBACiAJCQlQQ0lfRE4obm9kZSktPnBjaWRldiA9IHBkZXY7CiAJCQlhbGxvY2F0ZV9kZXZpY2VfYmFycyhwZGV2KTsKIAkJCWlTZXJpZXNfRGV2aWNlX0luZm9ybWF0aW9uKHBkZXYsIERldmljZUNvdW50KTsKLQkJCWlvbW11X2Rldm5vZGVfaW5pdF9pU2VyaWVzKG5vZGUpOworCQkJaW9tbXVfZGV2bm9kZV9pbml0X2lTZXJpZXMocGRldiwgbm9kZSk7CiAJCX0gZWxzZQogCQkJcHJpbnRrKCJQQ0k6IERldmljZSBUcmVlIG5vdCBmb3VuZCBmb3IgMHglMDE2bFhcbiIsCiAJCQkJCSh1bnNpZ25lZCBsb25nKXBkZXYpOwpAQCAtNDM4LDExICszOTEsNyBAQAogLyoKICAqIFJlYWQgTU0gSS9PIEluc3RydWN0aW9ucyBmb3IgdGhlIGlTZXJpZXMKICAqIE9uIE1NIEkvTyBlcnJvciwgYWxsIG9uZXMgYXJlIHJldHVybmVkIGFuZCBpU2VyaWVzX3BjaV9Jb0Vycm9yIGlzIGNhbAotICogZWxzZSwgZGF0YSBpcyByZXR1cm5lZCBpbiBiaWcgRW5kaWFuIGZvcm1hdC4KLSAqCi0gKiBpU2VyaWVzX1JlYWRfQnl0ZSA9IFJlYWQgQnl0ZSAgKCA4IGJpdCkKLSAqIGlTZXJpZXNfUmVhZF9Xb3JkID0gUmVhZCBXb3JkICAoMTYgYml0KQotICogaVNlcmllc19SZWFkX0xvbmcgPSBSZWFkIExvbmcgICgzMiBiaXQpCisgKiBlbHNlLCBkYXRhIGlzIHJldHVybmVkIGluIEJpZyBFbmRpYW4gZm9ybWF0LgogICovCiBzdGF0aWMgdTggaVNlcmllc19SZWFkX0J5dGUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpJb0FkZHJlc3MpCiB7CkBAIC00NjIsMTQgKzQxMSwxNSBAQAogCQkJbnVtX3ByaW50ZWQgPSAwOwogCQl9CiAJCWlmIChudW1fcHJpbnRlZCsrIDwgMTApCi0JCQlwcmludGsoS0VSTl9FUlIgImlTZXJpZXNfUmVhZF9CeXRlOiBpbnZhbGlkIGFjY2VzcyBhdCBJTyBhZGRyZXNzICVwXG4iLCBJb0FkZHJlc3MpOworCQkJcHJpbnRrKEtFUk5fRVJSICJpU2VyaWVzX1JlYWRfQnl0ZTogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwKKwkJCSAgICAgICBJb0FkZHJlc3MpOwogCQlyZXR1cm4gMHhmZjsKIAl9CiAJZG8gewogCQlIdkNhbGwzUmV0MTYoSHZDYWxsUGNpQmFyTG9hZDgsICZyZXQsIGRzYSwgQmFyT2Zmc2V0LCAwKTsKIAl9IHdoaWxlIChDaGVja1JldHVybkNvZGUoIlJEQiIsIERldk5vZGUsICZyZXRyeSwgcmV0LnJjKSAhPSAwKTsKIAotCXJldHVybiAodTgpcmV0LnZhbHVlOworCXJldHVybiByZXQudmFsdWU7CiB9CiAKIHN0YXRpYyB1MTYgaVNlcmllc19SZWFkX1dvcmQoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpJb0FkZHJlc3MpCkBAIC00OTAsNyArNDQwLDggQEAKIAkJCW51bV9wcmludGVkID0gMDsKIAkJfQogCQlpZiAobnVtX3ByaW50ZWQrKyA8IDEwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJpU2VyaWVzX1JlYWRfV29yZDogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwgSW9BZGRyZXNzKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiaVNlcmllc19SZWFkX1dvcmQ6IGludmFsaWQgYWNjZXNzIGF0IElPIGFkZHJlc3MgJXBcbiIsCisJCQkgICAgICAgSW9BZGRyZXNzKTsKIAkJcmV0dXJuIDB4ZmZmZjsKIAl9CiAJZG8gewpAQCAtNDk4LDcgKzQ0OSw3IEBACiAJCQkJQmFyT2Zmc2V0LCAwKTsKIAl9IHdoaWxlIChDaGVja1JldHVybkNvZGUoIlJEVyIsIERldk5vZGUsICZyZXRyeSwgcmV0LnJjKSAhPSAwKTsKIAotCXJldHVybiBzd2FiMTYoKHUxNilyZXQudmFsdWUpOworCXJldHVybiByZXQudmFsdWU7CiB9CiAKIHN0YXRpYyB1MzIgaVNlcmllc19SZWFkX0xvbmcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpJb0FkZHJlc3MpCkBAIC01MTksNyArNDcwLDggQEAKIAkJCW51bV9wcmludGVkID0gMDsKIAkJfQogCQlpZiAobnVtX3ByaW50ZWQrKyA8IDEwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJpU2VyaWVzX1JlYWRfTG9uZzogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwgSW9BZGRyZXNzKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiaVNlcmllc19SZWFkX0xvbmc6IGludmFsaWQgYWNjZXNzIGF0IElPIGFkZHJlc3MgJXBcbiIsCisJCQkgICAgICAgSW9BZGRyZXNzKTsKIAkJcmV0dXJuIDB4ZmZmZmZmZmY7CiAJfQogCWRvIHsKQEAgLTUyNywxNSArNDc5LDEyIEBACiAJCQkJQmFyT2Zmc2V0LCAwKTsKIAl9IHdoaWxlIChDaGVja1JldHVybkNvZGUoIlJETCIsIERldk5vZGUsICZyZXRyeSwgcmV0LnJjKSAhPSAwKTsKIAotCXJldHVybiBzd2FiMzIoKHUzMilyZXQudmFsdWUpOworCXJldHVybiByZXQudmFsdWU7CiB9CiAKIC8qCiAgKiBXcml0ZSBNTSBJL08gSW5zdHJ1Y3Rpb25zIGZvciB0aGUgaVNlcmllcwogICoKLSAqIGlTZXJpZXNfV3JpdGVfQnl0ZSA9IFdyaXRlIEJ5dGUgKDggYml0KQotICogaVNlcmllc19Xcml0ZV9Xb3JkID0gV3JpdGUgV29yZCgxNiBiaXQpCi0gKiBpU2VyaWVzX1dyaXRlX0xvbmcgPSBXcml0ZSBMb25nKDMyIGJpdCkKICAqLwogc3RhdGljIHZvaWQgaVNlcmllc19Xcml0ZV9CeXRlKHU4IGRhdGEsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqSW9BZGRyZXNzKQogewpAQCAtNTgxLDExICs1MzAsMTIgQEAKIAkJCW51bV9wcmludGVkID0gMDsKIAkJfQogCQlpZiAobnVtX3ByaW50ZWQrKyA8IDEwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJpU2VyaWVzX1dyaXRlX1dvcmQ6IGludmFsaWQgYWNjZXNzIGF0IElPIGFkZHJlc3MgJXBcbiIsIElvQWRkcmVzcyk7CisJCQlwcmludGsoS0VSTl9FUlIgImlTZXJpZXNfV3JpdGVfV29yZDogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwKKwkJCSAgICAgICBJb0FkZHJlc3MpOwogCQlyZXR1cm47CiAJfQogCWRvIHsKLQkJcmMgPSBIdkNhbGw0KEh2Q2FsbFBjaUJhclN0b3JlMTYsIGRzYSwgQmFyT2Zmc2V0LCBzd2FiMTYoZGF0YSksIDApOworCQlyYyA9IEh2Q2FsbDQoSHZDYWxsUGNpQmFyU3RvcmUxNiwgZHNhLCBCYXJPZmZzZXQsIGRhdGEsIDApOwogCX0gd2hpbGUgKENoZWNrUmV0dXJuQ29kZSgiV1dXIiwgRGV2Tm9kZSwgJnJldHJ5LCByYykgIT0gMCk7CiB9CiAKQEAgLTYwNywyMzEgKzU1NywyMjEgQEAKIAkJCW51bV9wcmludGVkID0gMDsKIAkJfQogCQlpZiAobnVtX3ByaW50ZWQrKyA8IDEwKQotCQkJcHJpbnRrKEtFUk5fRVJSICJpU2VyaWVzX1dyaXRlX0xvbmc6IGludmFsaWQgYWNjZXNzIGF0IElPIGFkZHJlc3MgJXBcbiIsIElvQWRkcmVzcyk7CisJCQlwcmludGsoS0VSTl9FUlIgImlTZXJpZXNfV3JpdGVfTG9uZzogaW52YWxpZCBhY2Nlc3MgYXQgSU8gYWRkcmVzcyAlcFxuIiwKKwkJCSAgICAgICBJb0FkZHJlc3MpOwogCQlyZXR1cm47CiAJfQogCWRvIHsKLQkJcmMgPSBIdkNhbGw0KEh2Q2FsbFBjaUJhclN0b3JlMzIsIGRzYSwgQmFyT2Zmc2V0LCBzd2FiMzIoZGF0YSksIDApOworCQlyYyA9IEh2Q2FsbDQoSHZDYWxsUGNpQmFyU3RvcmUzMiwgZHNhLCBCYXJPZmZzZXQsIGRhdGEsIDApOwogCX0gd2hpbGUgKENoZWNrUmV0dXJuQ29kZSgiV1dMIiwgRGV2Tm9kZSwgJnJldHJ5LCByYykgIT0gMCk7CiB9CiAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIF9fcmF3X3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB1OCBpc2VyaWVzX3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9fZm9yY2UgKilhZGRyOworCXJldHVybiBpU2VyaWVzX1JlYWRfQnl0ZShhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0woX19yYXdfcmVhZGIpOwogCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgX19yYXdfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIHUxNiBpc2VyaWVzX3JlYWR3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2ZvcmNlICopYWRkcjsKKwlyZXR1cm4gbGUxNl90b19jcHUoaVNlcmllc19SZWFkX1dvcmQoYWRkcikpOwogfQotRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkdyk7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgX19yYXdfcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIHUzMiBpc2VyaWVzX3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgX19mb3JjZSAqKWFkZHI7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGlTZXJpZXNfUmVhZF9Mb25nKGFkZHIpKTsKIH0KLUVYUE9SVF9TWU1CT0woX19yYXdfcmVhZGwpOwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBfX3Jhd19yZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgdTE2IGlzZXJpZXNfcmVhZHdfYmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKLQotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19mb3JjZSAqKWFkZHI7CisJcmV0dXJuIGlTZXJpZXNfUmVhZF9Xb3JkKGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkcSk7CiAKLWV4dGVybiB2b2lkIF9fcmF3X3dyaXRlYih1bnNpZ25lZCBjaGFyIHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB1MzIgaXNlcmllc19yZWFkbF9iZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOwotCi0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9fZm9yY2UgKilhZGRyID0gdjsKKwlyZXR1cm4gaVNlcmllc19SZWFkX0xvbmcoYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlYik7CiAKLWV4dGVybiB2b2lkIF9fcmF3X3dyaXRldyh1bnNpZ25lZCBzaG9ydCB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgdm9pZCBpc2VyaWVzX3dyaXRlYih1OCBkYXRhLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOwotCi0JKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2ZvcmNlICopYWRkciA9IHY7CisJaVNlcmllc19Xcml0ZV9CeXRlKGRhdGEsIGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChfX3Jhd193cml0ZXcpOwogCi1leHRlcm4gdm9pZCBfX3Jhd193cml0ZWwodW5zaWduZWQgaW50IHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB2b2lkIGlzZXJpZXNfd3JpdGV3KHUxNiBkYXRhLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOwotCi0JKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgX19mb3JjZSAqKWFkZHIgPSB2OworCWlTZXJpZXNfV3JpdGVfV29yZChjcHVfdG9fbGUxNihkYXRhKSwgYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlbCk7CiAKLWV4dGVybiB2b2lkIF9fcmF3X3dyaXRlcSh1bnNpZ25lZCBsb25nIHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB2b2lkIGlzZXJpZXNfd3JpdGVsKHUzMiBkYXRhLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOwotCi0JKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9fZm9yY2UgKilhZGRyID0gdjsKKwlpU2VyaWVzX1dyaXRlX0xvbmcoY3B1X3RvX2xlMzIoZGF0YSksIGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChfX3Jhd193cml0ZXEpOwogCi1pbnQgaW5fOChjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgdm9pZCBpc2VyaWVzX3dyaXRld19iZSh1MTYgZGF0YSwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlyZXR1cm4gaVNlcmllc19SZWFkX0J5dGUoYWRkcik7Ci0JcmV0dXJuIF9faW5fOChhZGRyKTsKKwlpU2VyaWVzX1dyaXRlX1dvcmQoZGF0YSwgYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKGluXzgpOwogCi12b2lkIG91dF84KHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkciwgaW50IHZhbCkKK3N0YXRpYyB2b2lkIGlzZXJpZXNfd3JpdGVsX2JlKHUzMiBkYXRhLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCi0JCWlTZXJpZXNfV3JpdGVfQnl0ZSh2YWwsIGFkZHIpOwotCWVsc2UKLQkJX19vdXRfOChhZGRyLCB2YWwpOworCWlTZXJpZXNfV3JpdGVfTG9uZyhkYXRhLCBhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0wob3V0XzgpOwogCi1pbnQgaW5fbGUxNihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2lvbWVtICphZGRyKQorc3RhdGljIHZvaWQgaXNlcmllc19yZWFkc2IoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsCisJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlyZXR1cm4gaVNlcmllc19SZWFkX1dvcmQoYWRkcik7Ci0JcmV0dXJuIF9faW5fbGUxNihhZGRyKTsKKwl1OCAqZHN0ID0gYnVmOworCXdoaWxlKGNvdW50LS0gPiAwKQorCQkqKGRzdCsrKSA9IGlTZXJpZXNfUmVhZF9CeXRlKGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChpbl9sZTE2KTsKIAotaW50IGluX2JlMTYoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkcikKK3N0YXRpYyB2b2lkIGlzZXJpZXNfcmVhZHN3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQlyZXR1cm4gX19pbl9iZTE2KGFkZHIpOworCXUxNiAqZHN0ID0gYnVmOworCXdoaWxlKGNvdW50LS0gPiAwKQorCQkqKGRzdCsrKSA9IGlTZXJpZXNfUmVhZF9Xb3JkKGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChpbl9iZTE2KTsKIAotdm9pZCBvdXRfbGUxNih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2lvbWVtICphZGRyLCBpbnQgdmFsKQorc3RhdGljIHZvaWQgaXNlcmllc19yZWFkc2woY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsCisJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlpU2VyaWVzX1dyaXRlX1dvcmQodmFsLCBhZGRyKTsKLQllbHNlCi0JCV9fb3V0X2xlMTYoYWRkciwgdmFsKTsKKwl1MzIgKmRzdCA9IGJ1ZjsKKwl3aGlsZShjb3VudC0tID4gMCkKKwkJKihkc3QrKykgPSBpU2VyaWVzX1JlYWRfTG9uZyhhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0wob3V0X2xlMTYpOwogCi12b2lkIG91dF9iZTE2KHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIsIGludCB2YWwpCitzdGF0aWMgdm9pZCBpc2VyaWVzX3dyaXRlc2Iodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQlfX291dF9iZTE2KGFkZHIsIHZhbCk7CisJY29uc3QgdTggKnNyYyA9IGJ1ZjsKKwl3aGlsZShjb3VudC0tID4gMCkKKwkJaVNlcmllc19Xcml0ZV9CeXRlKCooc3JjKyspLCBhZGRyKTsKIH0KLUVYUE9SVF9TWU1CT0wob3V0X2JlMTYpOwogCi11bnNpZ25lZCBpbl9sZTMyKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgdm9pZCBpc2VyaWVzX3dyaXRlc3codm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKLQkJcmV0dXJuIGlTZXJpZXNfUmVhZF9Mb25nKGFkZHIpOwotCXJldHVybiBfX2luX2xlMzIoYWRkcik7CisJY29uc3QgdTE2ICpzcmMgPSBidWY7CisJd2hpbGUoY291bnQtLSA+IDApCisJCWlTZXJpZXNfV3JpdGVfV29yZCgqKHNyYysrKSwgYWRkcik7CiB9Ci1FWFBPUlRfU1lNQk9MKGluX2xlMzIpOwogCi11bnNpZ25lZCBpbl9iZTMyKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIpCitzdGF0aWMgdm9pZCBpc2VyaWVzX3dyaXRlc2wodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQlyZXR1cm4gX19pbl9iZTMyKGFkZHIpOworCWNvbnN0IHUzMiAqc3JjID0gYnVmOworCXdoaWxlKGNvdW50LS0gPiAwKQorCQlpU2VyaWVzX1dyaXRlX0xvbmcoKihzcmMrKyksIGFkZHIpOwogfQotRVhQT1JUX1NZTUJPTChpbl9iZTMyKTsKIAotdm9pZCBvdXRfbGUzMih2b2xhdGlsZSB1bnNpZ25lZCBfX2lvbWVtICphZGRyLCBpbnQgdmFsKQorc3RhdGljIHZvaWQgaXNlcmllc19tZW1zZXRfaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCBpbnQgYywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbikKIHsKLQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKLQkJaVNlcmllc19Xcml0ZV9Mb25nKHZhbCwgYWRkcik7Ci0JZWxzZQotCQlfX291dF9sZTMyKGFkZHIsIHZhbCk7Ci19Ci1FWFBPUlRfU1lNQk9MKG91dF9sZTMyKTsKKwl2b2xhdGlsZSBjaGFyIF9faW9tZW0gKmQgPSBhZGRyOwogCi12b2lkIG91dF9iZTMyKHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIsIGludCB2YWwpCisJd2hpbGUgKG4tLSA+IDApCisJCWlTZXJpZXNfV3JpdGVfQnl0ZShjLCBkKyspOworfQorCitzdGF0aWMgdm9pZCBpc2VyaWVzX21lbWNweV9mcm9taW8odm9pZCAqZGVzdCwgY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzcmMsCisJCQkJICB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOworCWNoYXIgKmQgPSBkZXN0OworCWNvbnN0IHZvbGF0aWxlIGNoYXIgX19pb21lbSAqcyA9IHNyYzsKIAotCV9fb3V0X2JlMzIoYWRkciwgdmFsKTsKKwl3aGlsZSAobi0tID4gMCkKKwkJKmQrKyA9IGlTZXJpZXNfUmVhZF9CeXRlKHMrKyk7CiB9Ci1FWFBPUlRfU1lNQk9MKG91dF9iZTMyKTsKIAotdW5zaWduZWQgbG9uZyBpbl9sZTY0KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkcikKK3N0YXRpYyB2b2lkIGlzZXJpZXNfbWVtY3B5X3RvaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkZXN0LCBjb25zdCB2b2lkICpzcmMsCisJCQkJdW5zaWduZWQgbG9uZyBuKQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKKwljb25zdCBjaGFyICpzID0gc3JjOworCXZvbGF0aWxlIGNoYXIgX19pb21lbSAqZCA9IGRlc3Q7CiAKLQlyZXR1cm4gX19pbl9sZTY0KGFkZHIpOworCXdoaWxlIChuLS0gPiAwKQorCQlpU2VyaWVzX1dyaXRlX0J5dGUoKnMrKywgZCsrKTsKIH0KLUVYUE9SVF9TWU1CT0woaW5fbGU2NCk7CiAKLXVuc2lnbmVkIGxvbmcgaW5fYmU2NChjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmFkZHIpCisvKiBXZSBvbmx5IHNldCBNTUlPIG9wcy4gVGhlIGRlZmF1bHQgUElPIG9wcyB3aWxsIGJlIGRlZmF1bHQKKyAqIHRvIHRoZSBNTUlPIG9wcyArIHBjaV9pb19iYXNlIHdoaWNoIGlzIDAgb24gaVNlcmllcyBhcworICogZXhwZWN0ZWQgc28gYm90aCBzaG91bGQgd29yay4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgaW1wbGVtZW50IHRoZSByZWFkcS93cml0ZXEgdmVyc2lvbnMgYXMKKyAqIEkgZG9uJ3Qga25vdyBvZiBhbiBIViBjYWxsIGZvciBkb2luZyBzby4gVGh1cywgdGhlIGRlZmF1bHQKKyAqIG9wZXJhdGlvbiB3aWxsIGJlIHVzZWQgaW5zdGVhZCwgd2hpY2ggd2lsbCBmYXVsdCBhIHRoZSB2YWx1ZQorICogcmV0dXJuIGJ5IGlTZXJpZXMgZm9yIE1NSU8gYWRkcmVzc2VzIGFsd2F5cyBoaXRzIGEgbm9uIG1hcHBlZAorICogYXJlYS4gVGhpcyBpcyBhcyBnb29kIGFzIHRoZSBCVUcoKSB3ZSB1c2VkIHRvIGhhdmUgdGhlcmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHBjX3BjaV9pbyBfX2luaXRkYXRhIGlzZXJpZXNfcGNpX2lvID0geworCS5yZWFkYiA9IGlzZXJpZXNfcmVhZGIsCisJLnJlYWR3ID0gaXNlcmllc19yZWFkdywKKwkucmVhZGwgPSBpc2VyaWVzX3JlYWRsLAorCS5yZWFkd19iZSA9IGlzZXJpZXNfcmVhZHdfYmUsCisJLnJlYWRsX2JlID0gaXNlcmllc19yZWFkbF9iZSwKKwkud3JpdGViID0gaXNlcmllc193cml0ZWIsCisJLndyaXRldyA9IGlzZXJpZXNfd3JpdGV3LAorCS53cml0ZWwgPSBpc2VyaWVzX3dyaXRlbCwKKwkud3JpdGV3X2JlID0gaXNlcmllc193cml0ZXdfYmUsCisJLndyaXRlbF9iZSA9IGlzZXJpZXNfd3JpdGVsX2JlLAorCS5yZWFkc2IgPSBpc2VyaWVzX3JlYWRzYiwKKwkucmVhZHN3ID0gaXNlcmllc19yZWFkc3csCisJLnJlYWRzbCA9IGlzZXJpZXNfcmVhZHNsLAorCS53cml0ZXNiID0gaXNlcmllc193cml0ZXNiLAorCS53cml0ZXN3ID0gaXNlcmllc193cml0ZXN3LAorCS53cml0ZXNsID0gaXNlcmllc193cml0ZXNsLAorCS5tZW1zZXRfaW8gPSBpc2VyaWVzX21lbXNldF9pbywKKwkubWVtY3B5X2Zyb21pbyA9IGlzZXJpZXNfbWVtY3B5X2Zyb21pbywKKwkubWVtY3B5X3RvaW8gPSBpc2VyaWVzX21lbWNweV90b2lvLAorfTsKKworLyoKKyAqIGlTZXJpZXNfcGNpYmlvc19pbml0CisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBhbGwgcG9zc2libGUgc3lzdGVtIFBDSSBob3N0IGJyaWRnZXMgdGhhdCBjb25uZWN0CisgKiAgIFBDSSBidXNlcy4gIFRoZSBzeXN0ZW0gaHlwZXJ2aXNvciBpcyBxdWVyaWVkIGFzIHRvIHRoZSBndWVzdCBwYXJ0aXRpb24KKyAqICAgb3duZXJzaGlwIHN0YXR1cy4gIEEgcGNpX2NvbnRyb2xsZXIgaXMgYnVpbHQgZm9yIGFueSBidXMgd2hpY2ggaXMgcGFydGlhbGx5CisgKiAgIG93bmVkIG9yIGZ1bGx5IG93bmVkIGJ5IHRoaXMgZ3Vlc3QgcGFydGl0aW9uLgorICovCit2b2lkIF9faW5pdCBpU2VyaWVzX3BjaWJpb3NfaW5pdCh2b2lkKQogewotCUJVR19PTihmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IE5VTEw7CiAKLQlyZXR1cm4gX19pbl9iZTY0KGFkZHIpOworCS8qIEluc3RhbGwgSU8gaG9va3MgKi8KKwlwcGNfcGNpX2lvID0gaXNlcmllc19wY2lfaW87CisKKwlpZiAocm9vdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImlTZXJpZXNfcGNpYmlvc19pbml0OiBjYW4ndCBmaW5kIHJvb3QgIgorCQkJCSJvZiBkZXZpY2UgdHJlZVxuIik7CisJCXJldHVybjsKKwl9CisJd2hpbGUgKChub2RlID0gb2ZfZ2V0X25leHRfY2hpbGQocm9vdCwgbm9kZSkpICE9IE5VTEwpIHsKKwkJSHZCdXNOdW1iZXIgYnVzOworCQljb25zdCB1MzIgKmJ1c3A7CisKKwkJaWYgKChub2RlLT50eXBlID09IE5VTEwpIHx8IChzdHJjbXAobm9kZS0+dHlwZSwgInBjaSIpICE9IDApKQorCQkJY29udGludWU7CisKKwkJYnVzcCA9IGdldF9wcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwgTlVMTCk7CisJCWlmIChidXNwID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJYnVzID0gKmJ1c3A7CisJCXByaW50aygiYnVzICVkIGFwcGVhcnMgdG8gZXhpc3RcbiIsIGJ1cyk7CisJCXBoYiA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihub2RlKTsKKwkJaWYgKHBoYiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJcGhiLT5wY2lfbWVtX29mZnNldCA9IHBoYi0+bG9jYWxfbnVtYmVyID0gYnVzOworCQlwaGItPmZpcnN0X2J1c25vID0gYnVzOworCQlwaGItPmxhc3RfYnVzbm8gPSBidXM7CisJCXBoYi0+b3BzID0gJmlTZXJpZXNfcGNpX29wczsKKwl9CisKKwlvZl9ub2RlX3B1dChyb290KTsKKworCXBjaV9kZXZzX3BoYl9pbml0KCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGluX2JlNjQpOwogCi12b2lkIG91dF9sZTY0KHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkciwgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0JQlVHX09OKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpOwotCi0JX19vdXRfbGU2NChhZGRyLCB2YWwpOwotfQotRVhQT1JUX1NZTUJPTChvdXRfbGU2NCk7Ci0KLXZvaWQgb3V0X2JlNjQodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLQlCVUdfT04oZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSk7Ci0KLQlfX291dF9iZTY0KGFkZHIsIHZhbCk7Ci19Ci1FWFBPUlRfU1lNQk9MKG91dF9iZTY0KTsKLQotdm9pZCBtZW1zZXRfaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCBpbnQgYywgdW5zaWduZWQgbG9uZyBuKQotewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKSB7Ci0JCXZvbGF0aWxlIGNoYXIgX19pb21lbSAqZCA9IGFkZHI7Ci0KLQkJd2hpbGUgKG4tLSA+IDApIHsKLQkJCWlTZXJpZXNfV3JpdGVfQnl0ZShjLCBkKyspOwotCQl9Ci0JfSBlbHNlCi0JCWVlaF9tZW1zZXRfaW8oYWRkciwgYywgbik7Ci19Ci1FWFBPUlRfU1lNQk9MKG1lbXNldF9pbyk7Ci0KLXZvaWQgbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LCBjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbikKLXsKLQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkgewotCQljaGFyICpkID0gZGVzdDsKLQkJY29uc3Qgdm9sYXRpbGUgY2hhciBfX2lvbWVtICpzID0gc3JjOwotCi0JCXdoaWxlIChuLS0gPiAwKSB7Ci0JCQkqZCsrID0gaVNlcmllc19SZWFkX0J5dGUocysrKTsKLQkJfQotCX0gZWxzZQotCQllZWhfbWVtY3B5X2Zyb21pbyhkZXN0LCBzcmMsIG4pOwotfQotRVhQT1JUX1NZTUJPTChtZW1jcHlfZnJvbWlvKTsKLQotdm9pZCBtZW1jcHlfdG9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBuKQotewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKSB7Ci0JCWNvbnN0IGNoYXIgKnMgPSBzcmM7Ci0JCXZvbGF0aWxlIGNoYXIgX19pb21lbSAqZCA9IGRlc3Q7Ci0KLQkJd2hpbGUgKG4tLSA+IDApIHsKLQkJCWlTZXJpZXNfV3JpdGVfQnl0ZSgqcysrLCBkKyspOwotCQl9Ci0JfSBlbHNlCi0JCWVlaF9tZW1jcHlfdG9pbyhkZXN0LCBzcmMsIG4pOwotfQotRVhQT1JUX1NZTUJPTChtZW1jcHlfdG9pbyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCmluZGV4IGEwZmY3YmEuLmJkZjJhZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CkBAIC04MCw4ICs3OSw2IEBACiBzdGF0aWMgdm9pZCBpU2VyaWVzX3BjaV9maW5hbF9maXh1cCh2b2lkKSB7IH0KICNlbmRpZgogCi1leHRlcm4gaW50IHJkX3NpemU7CQkvKiBEZWZpbmVkIGluIGRyaXZlcnMvYmxvY2svcmQuYyAqLwotCiBleHRlcm4gdW5zaWduZWQgbG9uZyBpU2VyaWVzX3JlY2FsX3RiOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90aXRhbjsKIApAQCAtMjk1LDI0ICsyOTIsNiBAQAogewogCURCRygiIC0+IGlTZXJpZXNfaW5pdF9lYXJseSgpXG4iKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKQotCS8qCi0JICogSWYgdGhlIGluaXQgUkFNIGRpc2sgaGFzIGJlZW4gY29uZmlndXJlZCBhbmQgdGhlcmUgaXMKLQkgKiBhIG5vbi16ZXJvIHN0YXJ0aW5nIGFkZHJlc3MgZm9yIGl0LCBzZXQgaXQgdXAKLQkgKi8KLQlpZiAobmFjYS54UmFtRGlzaykgewotCQlpbml0cmRfc3RhcnQgPSAodW5zaWduZWQgbG9uZylfX3ZhKG5hY2EueFJhbURpc2spOwotCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0ICsgbmFjYS54UmFtRGlza1NpemUgKiBIV19QQUdFX1NJWkU7Ci0JCWluaXRyZF9iZWxvd19zdGFydF9vayA9IDE7CS8vIHJhbWRpc2sgaW4ga2VybmVsIHNwYWNlCi0JCVJPT1RfREVWID0gUm9vdF9SQU0wOwotCQlpZiAoKChyZF9zaXplICogMTAyNCkgLyBIV19QQUdFX1NJWkUpIDwgbmFjYS54UmFtRGlza1NpemUpCi0JCQlyZF9zaXplID0gKG5hY2EueFJhbURpc2tTaXplICogSFdfUEFHRV9TSVpFKSAvIDEwMjQ7Ci0JfSBlbHNlCi0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU5JVFJEICovCi0JewotCSAgICAvKiBST09UX0RFViA9IE1LREVWKFZJT0RBU0RfTUFKT1IsIDEpOyAqLwotCX0KLQogCWlTZXJpZXNfcmVjYWxfdGIgPSBnZXRfdGIoKTsKIAlpU2VyaWVzX3JlY2FsX3RpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOwogCkBAIC0zMzEsMTcgKzMxMCw2IEBACiAKIAltZl9pbml0KCk7CiAKLQkvKiBJZiB3ZSB3ZXJlIHBhc3NlZCBhbiBpbml0cmQsIHNldCB0aGUgUk9PVF9ERVYgcHJvcGVybHkgaWYgdGhlIHZhbHVlcwotCSAqIGxvb2sgc2Vuc2libGUuIElmIG5vdCwgY2xlYXIgaW5pdHJkIHJlZmVyZW5jZS4KLQkgKi8KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQlpZiAoaW5pdHJkX3N0YXJ0ID49IEtFUk5FTEJBU0UgJiYgaW5pdHJkX2VuZCA+PSBLRVJORUxCQVNFICYmCi0JICAgIGluaXRyZF9lbmQgPiBpbml0cmRfc3RhcnQpCi0JCVJPT1RfREVWID0gUm9vdF9SQU0wOwotCWVsc2UKLQkJaW5pdHJkX3N0YXJ0ID0gaW5pdHJkX2VuZCA9IDA7Ci0jZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU5JVFJEICovCi0KIAlEQkcoIiA8LSBpU2VyaWVzX2luaXRfZWFybHkoKVxuIik7CiB9CiAKQEAgLTY0OSw2ICs2MTcsMTYgQEAKIHZvaWQgX19pbml0IGlTZXJpZXNfaW5pdF9JUlEodm9pZCkgeyB9CiAjZW5kaWYKIAorc3RhdGljIHZvaWQgX19pb21lbSAqaXNlcmllc19pb3JlbWFwKHBoeXNfYWRkcl90IGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuICh2b2lkIF9faW9tZW0gKilhZGRyZXNzOworfQorCitzdGF0aWMgdm9pZCBpc2VyaWVzX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0b2tlbikKK3sKK30KKwogLyoKICAqIGlTZXJpZXMgaGFzIG5vIGxlZ2FjeSBJTywgYW55dGhpbmcgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGhhcyB0bwogICogZmFpbCBvciBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuCkBAIC02NjUsNiArNjQzLDggQEAKIAkJcmV0dXJuIDA7CiAKIAlocHRlX2luaXRfaVNlcmllcygpOworCS8qIGlTZXJpZXMgZG9lcyBub3Qgc3VwcG9ydCAxNk0gcGFnZXMgKi8KKwljdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcyAmPSB+Q1BVX0ZUUl8xNk1fUEFHRTsKIAogCXJldHVybiAxOwogfQpAQCAtNjg3LDYgKzY2Nyw4IEBACiAJLnByb2dyZXNzCT0gaVNlcmllc19wcm9ncmVzcywKIAkucHJvYmUJCT0gaXNlcmllc19wcm9iZSwKIAkuY2hlY2tfbGVnYWN5X2lvcG9ydAk9IGlzZXJpZXNfY2hlY2tfbGVnYWN5X2lvcG9ydCwKKwkuaW9yZW1hcAk9IGlzZXJpZXNfaW9yZW1hcCwKKwkuaW91bm1hcAk9IGlzZXJpZXNfaW91bm1hcCwKIAkvKiBYWFggSW1wbGVtZW50IGVuYWJsZV9wbWNzIGZvciBpU2VyaWVzICovCiB9OwogCkBAIC02OTQsNiArNjc2LDExIEBACiB7CiAJdW5zaWduZWQgbG9uZyBwaHlzX21lbV9zaXplOwogCisJLyogSWRlbnRpZnkgQ1BVIHR5cGUuIFRoaXMgaXMgZG9uZSBhZ2FpbiBieSB0aGUgY29tbW9uIGNvZGUgbGF0ZXIKKwkgKiBvbiBidXQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGlzIGZpbmUuCisJICovCisJaWRlbnRpZnlfY3B1KDAsIG1mc3ByKFNQUk5fUFZSKSk7CisKIAlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzIHw9IEZXX0ZFQVRVUkVfSVNFUklFUzsKIAlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzIHw9IEZXX0ZFQVRVUkVfTFBBUjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMKaW5kZXggMDRlMDdlNS4uODRlN2VlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jCkBAIC0xMTksMTAgKzExOSw5IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCWNvbnN0IGNoYXIgKnN5c2lkOwogCi0JYnVmID0ga21hbGxvYyhIV19QQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWJ1ZiA9IGt6YWxsb2MoSFdfUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIDA7Ci0JbWVtc2V0KGJ1ZiwgMCwgSFdfUEFHRV9TSVpFKTsKIAogCWhhbmRsZSA9IGRtYV9tYXBfc2luZ2xlKGlTZXJpZXNfdmlvX2RldiwgYnVmLCBIV19QQUdFX1NJWkUsCiAJCQkJRE1BX0ZST01fREVWSUNFKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvbWFwbGUuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvbWFwbGUuaAppbmRleCAwNjU3YzU3Li5jNjkxMWRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL21hcGxlLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9tYXBsZS5oCkBAIC04LDUgKzgsNSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWFwbGVfZ2V0X2Jvb3RfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIG1hcGxlX2NhbGlicmF0ZV9kZWNyKHZvaWQpOwogZXh0ZXJuIHZvaWQgbWFwbGVfcGNpX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBtYXBsZV9wY2liaW9zX2ZpeHVwKHZvaWQpOworZXh0ZXJuIHZvaWQgbWFwbGVfcGNpX2lycV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgbWFwbGVfcGNpX2dldF9sZWdhY3lfaWRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY2hhbm5lbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYwppbmRleCA2M2I0ZDFiLi4zZjZhNjlmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKQEAgLTUwMiwzOCArNTAyLDI5IEBACiB9CiAKIAotdm9pZCBfX2luaXQgbWFwbGVfcGNpYmlvc19maXh1cCh2b2lkKQordm9pZCBfX2RldmluaXQgbWFwbGVfcGNpX2lycV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCURCRygiIC0+IG1hcGxlX3BjaV9pcnFfZml4dXBcbiIpOwogCi0JREJHKCIgLT4gbWFwbGVfcGNpYmlvc19maXh1cFxuIik7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCQkvKiBGaXh1cCBJUlEgZm9yIFBDSWUgaG9zdCAqLwotCQlpZiAodTRfcGNpZSAhPSBOVUxMICYmIGRldi0+YnVzLT5udW1iZXIgPT0gMCAmJgotCQkgICAgcGNpX2J1c190b19ob3N0KGRldi0+YnVzKSA9PSB1NF9wY2llKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiRml4dXAgVTQgUENJZSBJUlFcbiIpOwotCQkJZGV2LT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgMSk7Ci0JCQlpZiAoZGV2LT5pcnEgIT0gTk9fSVJRKQotCQkJCXNldF9pcnFfdHlwZShkZXYtPmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogSGlkZSBBTUQ4MTExIElERSBpbnRlcnJ1cHQgd2hlbiBpbiBsZWdhY3kgbW9kZSBzbwotCQkgKiB0aGUgZHJpdmVyIGNhbGxzIHBjaV9nZXRfbGVnYWN5X2lkZV9pcnEoKQotCQkgKi8KLQkJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQU1EICYmCi0JCSAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF84MTExX0lERSAmJgotCQkgICAgKGRldi0+Y2xhc3MgJiA1KSAhPSA1KSB7Ci0JCQlkZXYtPmlycSA9IE5PX0lSUTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogRm9yIGFsbCBvdGhlcnMsIG1hcCB0aGUgaW50ZXJydXB0IGZyb20gdGhlIGRldmljZS10cmVlICovCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7CisJLyogRml4dXAgSVJRIGZvciBQQ0llIGhvc3QgKi8KKwlpZiAodTRfcGNpZSAhPSBOVUxMICYmIGRldi0+YnVzLT5udW1iZXIgPT0gMCAmJgorCSAgICBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpID09IHU0X3BjaWUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkZpeHVwIFU0IFBDSWUgSVJRXG4iKTsKKwkJZGV2LT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgMSk7CisJCWlmIChkZXYtPmlycSAhPSBOT19JUlEpCisJCQlzZXRfaXJxX3R5cGUoZGV2LT5pcnEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJfQogCi0JREJHKCIgPC0gbWFwbGVfcGNpYmlvc19maXh1cFxuIik7CisJLyogSGlkZSBBTUQ4MTExIElERSBpbnRlcnJ1cHQgd2hlbiBpbiBsZWdhY3kgbW9kZSBzbworCSAqIHRoZSBkcml2ZXIgY2FsbHMgcGNpX2dldF9sZWdhY3lfaWRlX2lycSgpCisJICovCisJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQU1EICYmCisJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQU1EXzgxMTFfSURFICYmCisJICAgIChkZXYtPmNsYXNzICYgNSkgIT0gNSkgeworCQlkZXYtPmlycSA9IE5PX0lSUTsKKwl9CisKKwlEQkcoIiA8LSBtYXBsZV9wY2lfaXJxX2ZpeHVwXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1hcGxlX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKQEAgLTU3MSw3ICs1NjIsNyBAQAogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBucCkpICE9IE5VTEw7KSB7CiAJCWlmIChucC0+bmFtZSA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCWlmIChzdHJjbXAobnAtPm5hbWUsICJwY2kiKSA9PSAwKSB7CisJCWlmICghc3RyY21wKG5wLT5uYW1lLCAicGNpIikgfHwgIXN0cmNtcChucC0+bmFtZSwgInBjaWUiKSkgewogCQkJaWYgKGFkZF9icmlkZ2UobnApID09IDApCiAJCQkJb2Zfbm9kZV9nZXQobnApOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKaW5kZXggZmU2YjliZi4uZjEyZDVjNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYwpAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbG1iLmg+CiAjaW5jbHVkZSA8YXNtL21waWMuaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAKICNpbmNsdWRlICJtYXBsZS5oIgpAQCAtMTY2LDYgKzE2NywxNiBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKK3N0YXRpYyB2b2lkIF9faW5pdCBtYXBsZV91c2VfcnRhc19yZWJvb3RfYW5kX2hhbHRfaWZfcHJlc2VudCh2b2lkKQoreworCWlmIChydGFzX3NlcnZpY2VfcHJlc2VudCgic3lzdGVtLXJlYm9vdCIpICYmCisJICAgIHJ0YXNfc2VydmljZV9wcmVzZW50KCJwb3dlci1vZmYiKSkgeworCQlwcGNfbWQucmVzdGFydCA9IHJ0YXNfcmVzdGFydDsKKwkJcHBjX21kLnBvd2VyX29mZiA9IHJ0YXNfcG93ZXJfb2ZmOworCQlwcGNfbWQuaGFsdCA9IHJ0YXNfaGFsdDsKKwl9Cit9CisKIHZvaWQgX19pbml0IG1hcGxlX3NldHVwX2FyY2godm9pZCkKIHsKIAkvKiBpbml0IHRvIHNvbWUgfnNhbmUgdmFsdWUgdW50aWwgY2FsaWJyYXRlX2RlbGF5KCkgcnVucyAqLwpAQCAtMTgxLDYgKzE5Miw3IEBACiAjaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKIAljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKICNlbmRpZgorCW1hcGxlX3VzZV9ydGFzX3JlYm9vdF9hbmRfaGFsdF9pZl9wcmVzZW50KCk7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgbmF0aXZlL05BUCBpZGxlIGxvb3BcbiIpOwogfQpAQCAtMzEyLDcgKzMyNCw3IEBACiAJLnNldHVwX2FyY2gJCT0gbWFwbGVfc2V0dXBfYXJjaCwKIAkuaW5pdF9lYXJseQkJPSBtYXBsZV9pbml0X2Vhcmx5LAogCS5pbml0X0lSUQkJPSBtYXBsZV9pbml0X0lSUSwKLQkucGNpYmlvc19maXh1cAkJPSBtYXBsZV9wY2liaW9zX2ZpeHVwLAorCS5wY2lfaXJxX2ZpeHVwCQk9IG1hcGxlX3BjaV9pcnFfZml4dXAsCiAJLnBjaV9nZXRfbGVnYWN5X2lkZV9pcnEJPSBtYXBsZV9wY2lfZ2V0X2xlZ2FjeV9pZGVfaXJxLAogCS5yZXN0YXJ0CQk9IG1hcGxlX3Jlc3RhcnQsCiAJLnBvd2VyX29mZgkJPSBtYXBsZV9wb3dlcl9vZmYsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wYXNlbWkuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3Bhc2VtaS5oCmluZGV4IGZkNzFkNzIuLjUxYzJhMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3Bhc2VtaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3Bhc2VtaS5oCkBAIC0zLDYgKzMsNSBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwYXNfZ2V0X2Jvb3RfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIHBhc19wY2lfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHBhc19wY2liaW9zX2ZpeHVwKHZvaWQpOwogCiAjZW5kaWYgLyogX1BBU0VNSV9QQVNFTUlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wY2kuYwppbmRleCAzOTAyMGMxLi5mYWE2MThlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wY2kuYwpAQCAtMTQ4LDE0ICsxNDgsNiBAQAogfQogCiAKLXZvaWQgX19pbml0IHBhc19wY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikKLQkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IHBhc19maXh1cF9waGJfcmVzb3VyY2VzKHZvaWQpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKaW5kZXggMTA2ODk2Yy4uODlkNmUyOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTcxLDYgKzcyLDkgQEAKIAkvKiBTZXR1cCBTTVAgY2FsbGJhY2sgKi8KIAlzbXBfb3BzID0gJnBhc19zbXBfb3BzOwogI2VuZGlmCisJLyogbm8gaW9tbXUgeWV0ICovCisJcGNpX2RtYV9vcHMgPSAmZG1hX2RpcmVjdF9vcHM7CisKIAkvKiBMb29rdXAgUENJIGhvc3RzICovCiAJcGFzX3BjaV9pbml0KCk7CiAKQEAgLTgxLDE3ICs4NSw2IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGRlZmF1bHQgaWRsZSBsb29wXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfZGV2X3NldHVwX251bGwoc3RydWN0IHBjaV9kZXYgKmRldikgeyB9Ci1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IH0KLQotc3RhdGljIHZvaWQgX19pbml0IHBhc19pbml0X2Vhcmx5KHZvaWQpCi17Ci0JLyogTm8gaW9tbXUgY29kZSB5ZXQgKi8KLQlwcGNfbWQuaW9tbXVfZGV2X3NldHVwID0gaW9tbXVfZGV2X3NldHVwX251bGw7Ci0JcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOwotCXBjaV9kaXJlY3RfaW9tbXVfaW5pdCgpOwotfQotCiAvKiBObyBsZWdhY3kgSU8gb24gb3VyIHBhcnRzICovCiBzdGF0aWMgaW50IHBhc19jaGVja19sZWdhY3lfaW9wb3J0KHVuc2lnbmVkIGludCBiYXNlcG9ydCkKIHsKQEAgLTE3MywxMCArMTY2LDggQEAKIAkubmFtZQkJCT0gIlBBIFNlbWkgUEE2VC0xNjgyTSIsCiAJLnByb2JlCQkJPSBwYXNfcHJvYmUsCiAJLnNldHVwX2FyY2gJCT0gcGFzX3NldHVwX2FyY2gsCi0JLmluaXRfZWFybHkJCT0gcGFzX2luaXRfZWFybHksCiAJLmluaXRfSVJRCQk9IHBhc19pbml0X0lSUSwKIAkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCi0JLnBjaWJpb3NfZml4dXAJCT0gcGFzX3BjaWJpb3NfZml4dXAsCiAJLnJlc3RhcnQJCT0gcGFzX3Jlc3RhcnQsCiAJLnBvd2VyX29mZgkJPSBwYXNfcG93ZXJfb2ZmLAogCS5oYWx0CQkJPSBwYXNfaGFsdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2JhY2tsaWdodC5jCmluZGV4IGFmYTU5M2EuLmMzYTg5NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9iYWNrbGlnaHQuYwpAQCAtMTgsMTEgKzE4LDExIEBACiAKICNkZWZpbmUgT0xEX0JBQ0tMSUdIVF9NQVggMTUKIAotc3RhdGljIHZvaWQgcG1hY19iYWNrbGlnaHRfa2V5X3dvcmtlcih2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIHBtYWNfYmFja2xpZ2h0X3NldF9sZWdhY3lfd29ya2VyKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgcG1hY19iYWNrbGlnaHRfa2V5X3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgcG1hY19iYWNrbGlnaHRfc2V0X2xlZ2FjeV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAotc3RhdGljIERFQ0xBUkVfV09SSyhwbWFjX2JhY2tsaWdodF9rZXlfd29yaywgcG1hY19iYWNrbGlnaHRfa2V5X3dvcmtlciwgTlVMTCk7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKHBtYWNfYmFja2xpZ2h0X3NldF9sZWdhY3lfd29yaywgcG1hY19iYWNrbGlnaHRfc2V0X2xlZ2FjeV93b3JrZXIsIE5VTEwpOworc3RhdGljIERFQ0xBUkVfV09SSyhwbWFjX2JhY2tsaWdodF9rZXlfd29yaywgcG1hY19iYWNrbGlnaHRfa2V5X3dvcmtlcik7CitzdGF0aWMgREVDTEFSRV9XT1JLKHBtYWNfYmFja2xpZ2h0X3NldF9sZWdhY3lfd29yaywgcG1hY19iYWNrbGlnaHRfc2V0X2xlZ2FjeV93b3JrZXIpOwogCiAvKiBBbHRob3VnaCB0aGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgaW4gaW50ZXJydXB0IGNvbnRleHQsIGl0IG1ha2VzIG5vIHNlbnNlIHRvCiAgKiBwcm90ZWN0IHRoZW0uIE5vIHVzZXIgaXMgYWJsZSB0byBwcm9kdWNlIGVub3VnaCBrZXkgZXZlbnRzIHBlciBzZWNvbmQgYW5kCkBAIC05NCw3ICs5NCw3IEBACiAJcmV0dXJuIGxldmVsOwogfQogCi1zdGF0aWMgdm9pZCBwbWFjX2JhY2tsaWdodF9rZXlfd29ya2VyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwbWFjX2JhY2tsaWdodF9rZXlfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpZiAoYXRvbWljX3JlYWQoJmtlcm5lbF9iYWNrbGlnaHRfZGlzYWJsZWQpKQogCQlyZXR1cm47CkBAIC0xNjYsNyArMTY2LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyB2b2lkIHBtYWNfYmFja2xpZ2h0X3NldF9sZWdhY3lfd29ya2VyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwbWFjX2JhY2tsaWdodF9zZXRfbGVnYWN5X3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJaWYgKGF0b21pY19yZWFkKCZrZXJuZWxfYmFja2xpZ2h0X2Rpc2FibGVkKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYwppbmRleCBlNDk2MjFiLi5jMjlhNmEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2ZlYXR1cmUuYwpAQCAtNDg2LDEwICs0ODYsNiBAQAogCiBzdGF0aWMgdTMyIHNhdmVfZmNyWzZdOwogc3RhdGljIHUzMiBzYXZlX21iY3I7Ci1zdGF0aWMgdTMyIHNhdmVfZ3Bpb19sZXZlbHNbMl07Ci1zdGF0aWMgdTggc2F2ZV9ncGlvX2V4dGludFtLRVlMQVJHT19HUElPX0VYVElOVF9DTlRdOwotc3RhdGljIHU4IHNhdmVfZ3Bpb19ub3JtYWxbS0VZTEFSR09fR1BJT19DTlRdOwotc3RhdGljIHUzMiBzYXZlX3VuaW5fY2xvY2tfY3RsOwogc3RhdGljIHN0cnVjdCBkYmRtYV9yZWdzIHNhdmVfZGJkbWFbMTNdOwogc3RhdGljIHN0cnVjdCBkYmRtYV9yZWdzIHNhdmVfYWx0X2RiZG1hWzEzXTsKIApAQCAtMTU0OCw2ICsxNTQ0LDEwIEBACiAKIAogI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHUzMiBzYXZlX2dwaW9fbGV2ZWxzWzJdOworc3RhdGljIHU4IHNhdmVfZ3Bpb19leHRpbnRbS0VZTEFSR09fR1BJT19FWFRJTlRfQ05UXTsKK3N0YXRpYyB1OCBzYXZlX2dwaW9fbm9ybWFsW0tFWUxBUkdPX0dQSU9fQ05UXTsKK3N0YXRpYyB1MzIgc2F2ZV91bmluX2Nsb2NrX2N0bDsKIAogc3RhdGljIHZvaWQga2V5bGFyZ29fc2h1dGRvd24oc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvLCBpbnQgc2xlZXBfbW9kZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IDk5MjNhZGMuLmY0MjQ3NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtNDgsNyArNDgsNiBAQAogc3RhdGljIGludCBoYXNfc2Vjb25kX29oYXJlOwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi1leHRlcm4gdTggcGNpX2NhY2hlX2xpbmVfc2l6ZTsKIGV4dGVybiBpbnQgcGNpYmlvc19hc3NpZ25fYnVzX29mZnNldDsKIAogc3RydWN0IGRldmljZV9ub2RlICprMl9za2lwbGlzdFsyXTsKQEAgLTk4NSwzMCArOTg0LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19pbml0IHBtYWNfcGNpYmlvc19maXh1cCh2b2lkKQordm9pZCBfX2RldmluaXQgcG1hY19wY2lfaXJxX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYqIGRldiA9IE5VTEw7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KGRldikgewotCQkvKiBSZWFkIGludGVycnVwdCBmcm9tIHRoZSBkZXZpY2UtdHJlZSAqLwotCQlwY2lfcmVhZF9pcnFfbGluZShkZXYpOwotCiAjaWZkZWYgQ09ORklHX1BQQzMyCi0JCS8qIEZpeHVwIGludGVycnVwdCBmb3IgdGhlIG1vZGVtL2V0aGVybmV0IGNvbWJvIGNvbnRyb2xsZXIuCi0JCSAqIG9uIG1hY2hpbmVzIHdpdGggYSBzZWNvbmQgb2hhcmUgY2hpcC4KLQkJICogVGhlIG51bWJlciBpbiB0aGUgZGV2aWNlIHRyZWUgKDI3KSBpcyBib2d1cyAoY29ycmVjdCBmb3IKLQkJICogdGhlIGV0aGVybmV0LW9ubHkgYm9hcmQgYnV0IG5vdCB0aGUgY29tYm8gZXRoZXJuZXQvbW9kZW0KLQkJICogYm9hcmQpLiBUaGUgcmVhbCBpbnRlcnJ1cHQgaXMgMjggb24gdGhlIHNlY29uZCBjb250cm9sbGVyCi0JCSAqIC0+IDI4KzMyID0gNjAuCi0JCSAqLwotCQlpZiAoaGFzX3NlY29uZF9vaGFyZSAmJgotCQkgICAgZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUMgJiYKLQkJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMpIHsKLQkJCWRldi0+aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIDYwKTsKLQkJCXNldF9pcnFfdHlwZShkZXYtPmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQkJfQotI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLworCS8qIEZpeHVwIGludGVycnVwdCBmb3IgdGhlIG1vZGVtL2V0aGVybmV0IGNvbWJvIGNvbnRyb2xsZXIuCisJICogb24gbWFjaGluZXMgd2l0aCBhIHNlY29uZCBvaGFyZSBjaGlwLgorCSAqIFRoZSBudW1iZXIgaW4gdGhlIGRldmljZSB0cmVlICgyNykgaXMgYm9ndXMgKGNvcnJlY3QgZm9yCisJICogdGhlIGV0aGVybmV0LW9ubHkgYm9hcmQgYnV0IG5vdCB0aGUgY29tYm8gZXRoZXJuZXQvbW9kZW0KKwkgKiBib2FyZCkuIFRoZSByZWFsIGludGVycnVwdCBpcyAyOCBvbiB0aGUgc2Vjb25kIGNvbnRyb2xsZXIKKwkgKiAtPiAyOCszMiA9IDYwLgorCSAqLworCWlmIChoYXNfc2Vjb25kX29oYXJlICYmCisJICAgIGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfREVDICYmCisJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMpIHsKKwkJZGV2LT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgNjApOworCQlzZXRfaXJxX3R5cGUoZGV2LT5pcnEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJfQorI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogfQogCiAjaWZkZWYgQ09ORklHX1BQQzY0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BtYWMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcG1hYy5oCmluZGV4IDk0ZTdiMjQuLjZlMDkwYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcG1hYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcG1hYy5oCkBAIC0yMCw3ICsyMCw3IEBACiBleHRlcm4gaW50IHBtYWNfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqKTsKIGV4dGVybiB2b2lkIHBtYWNfcmVhZF9ydGNfdGltZSh2b2lkKTsKIGV4dGVybiB2b2lkIHBtYWNfY2FsaWJyYXRlX2RlY3Iodm9pZCk7Ci1leHRlcm4gdm9pZCBwbWFjX3BjaWJpb3NfZml4dXAodm9pZCk7CitleHRlcm4gdm9pZCBwbWFjX3BjaV9pcnFfZml4dXAoc3RydWN0IHBjaV9kZXYgKik7CiBleHRlcm4gdm9pZCBwbWFjX3BjaV9pbml0KHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcG1hY19pZGVfZ2V0X2Jhc2UoaW50IGluZGV4KTsKIGV4dGVybiB2b2lkIHBtYWNfaWRlX2luaXRfaHdpZl9wb3J0cyhod19yZWdzX3QgKmh3LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCmluZGV4IDgyNGE2MTguLmQ5NDllOWRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCkBAIC03MCw2ICs3MCw3IEBACiAjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9zbXUuaD4KQEAgLTM2MSw3ICszNjIsNyBAQAogdm9pZCAqYm9vdF9ob3N0OwogaW50IGJvb3RfdGFyZ2V0OwogaW50IGJvb3RfcGFydDsKLWV4dGVybiBkZXZfdCBib290X2RldjsKK3N0YXRpYyBkZXZfdCBib290X2RldjsKIAogI2lmZGVmIENPTkZJR19TQ1NJCiB2b2lkIF9faW5pdCBub3RlX3Njc2lfaG9zdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHZvaWQgKmhvc3QpCkBAIC02NzYsOCArNjc3LDYgQEAKIAogI2lmZGVmIENPTkZJR19QUEMzMgogCS8qIGlzYV9pb19iYXNlIGdldHMgc2V0IGluIHBtYWNfcGNpX2luaXQgKi8KLQlpc2FfbWVtX2Jhc2UgPSBQTUFDX0lTQV9NRU1fQkFTRTsKLQlwY2lfZHJhbV9vZmZzZXQgPSBQTUFDX1BDSV9EUkFNX09GRlNFVDsKIAlJU0FfRE1BX1RIUkVTSE9MRCA9IH4wTDsKIAlETUFfTU9ERV9SRUFEID0gMTsKIAlETUFfTU9ERV9XUklURSA9IDI7CkBAIC03MjcsNyArNzI2LDcgQEAKIAkuc2hvd19jcHVpbmZvCQk9IHBtYWNfc2hvd19jcHVpbmZvLAogCS5pbml0X0lSUQkJPSBwbWFjX3BpY19pbml0LAogCS5nZXRfaXJxCQk9IE5VTEwsCS8qIGNoYW5nZWQgbGF0ZXIgKi8KLQkucGNpYmlvc19maXh1cAkJPSBwbWFjX3BjaWJpb3NfZml4dXAsCisJLnBjaV9pcnFfZml4dXAJCT0gcG1hY19wY2lfaXJxX2ZpeHVwLAogCS5yZXN0YXJ0CQk9IHBtYWNfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IHBtYWNfcG93ZXJfb2ZmLAogCS5oYWx0CQkJPSBwbWFjX2hhbHQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NsZWVwLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NsZWVwLlMKaW5kZXggMTE3NGNhMS4uYWRlZTI4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbGVlcC5TCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2xlZXAuUwpAQCAtNDUsNyArNDUsOCBAQAogCS5zZWN0aW9uIC50ZXh0CiAJLmFsaWduCTUKIAotI2lmIGRlZmluZWQoQ09ORklHX1BNKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfRlJFUV9QTUFDKQorI2lmIGRlZmluZWQoQ09ORklHX1BNKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfRlJFUV9QTUFDKSB8fCBcCisgICAgKGRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikpCiAKIC8qIFRoaXMgZ2V0cyBjYWxsZWQgYnkgdmlhLXBtdS5jIGxhdGUgZHVyaW5nIHRoZSBzbGVlcCBwcm9jZXNzLgogICogVGhlIFBNVSB3YXMgYWxyZWFkeSBzZW5kIHRoZSBzbGVlcCBjb21tYW5kIGFuZCB3aWxsIHNodXQgdXMgZG93bgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1MmVjNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKQEAgLTAsMCArMSw1NCBAQAorbWVudSAiUFMzIFBsYXRmb3JtIE9wdGlvbnMiCisJZGVwZW5kcyBvbiBQUENfUFMzCisKK2NvbmZpZyBQUzNfSFRBQl9TSVpFCisJZGVwZW5kcyBvbiBQUENfUFMzCisJaW50ICJQUzMgUGxhdGZvcm0gcGFnZXRhYmxlIHNpemUiCisJcmFuZ2UgMTggMjAKKwlkZWZhdWx0IDIwCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgb25seSBmb3IgZXhwZXJ0cyB3aG8gbWF5IGhhdmUgdGhlIGRlc2lyZSB0byBmaW5lCisJICB0dW5lIHRoZSBwYWdldGFibGUgc2l6ZSBvbiB0aGVpciBzeXN0ZW0uICBUaGUgdmFsdWUgaGVyZSBpcworCSAgZXhwcmVzc2VkIGFzIHRoZSBsb2cyIG9mIHRoZSBwYWdlIHRhYmxlIHNpemUuICBWYWxpZCB2YWx1ZXMgYXJlCisJICAxOCwgMTksIGFuZCAyMCwgY29ycmVzcG9uZGluZyB0byAyNTZLQiwgNTEyS0IgYW5kIDFNQiByZXNwZWN0aXZlbHkuCisKKwkgIElmIHVuc3VyZSwgY2hvb3NlIHRoZSBkZWZhdWx0ICgyMCkgd2l0aCB0aGUgY29uZmlkZW5jZSB0aGF0IHlvdXIKKwkgIHN5c3RlbSB3aWxsIGhhdmUgb3B0aW1hbCBydW50aW1lIHBlcmZvcm1hbmNlLgorCitjb25maWcgUFMzX0RZTkFNSUNfRE1BCisJZGVwZW5kcyBvbiBQUENfUFMzICYmIEVYUEVSSU1FTlRBTAorCWJvb2wgIlBTMyBQbGF0Zm9ybSBkeW5hbWljIERNQSBwYWdlIHRhYmxlIG1hbmFnZW1lbnQiCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBlbmFibGUga2VybmVsIHN1cHBvcnQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlCisJICBwZXIgZGV2aWNlIGR5bmFtaWMgRE1BIHBhZ2UgdGFibGUgbWFuYWdlbWVudCBwcm92aWRlZCBieSB0aGUgQ2VsbAorCSAgcHJvY2Vzc29yJ3MgSU8gQ29udHJvbGxlci4gIFRoaXMgc3VwcG9ydCBpbmN1cnMgc29tZSBydW50aW1lCisJICBvdmVyaGVhZCBhbmQgYWxzbyBzbGlnaHRseSBpbmNyZWFzZXMga2VybmVsIG1lbW9yeSB1c2FnZS4gIFRoZQorCSAgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwuCisKKwkgIFRoaXMgc3VwcG9ydCBpcyBtYWlubHkgZm9yIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudC4gIElmIHVuc3VyZSwKKwkgIHNheSBOLgorCitjb25maWcgUFMzX1VTRV9MUEFSX0FERFIKKwlkZXBlbmRzIG9uIFBQQ19QUzMgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiUFMzIHVzZSBscGFyIGFkZHJlc3Mgc3BhY2UiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgc29sZWx5IGZvciBleHBlcmltZW50YXRpb24gYnkgZXhwZXJ0cy4gIERpc2FibGVzCisJICB0cmFuc2xhdGlvbiBvZiBscGFyIGFkZHJlc3Nlcy4gIFNQRSBzdXBwb3J0IGN1cnJlbnRseSB3b24ndCB3b3JrCisJICB3aXRob3V0IHRoaXMgc2V0IHRvIHkuCisKKwkgIElmIHlvdSBoYXZlIGFueSBkb3VidCwgY2hvb3NlIHRoZSBkZWZhdWx0IHkuCisKK2NvbmZpZyBQUzNfVlVBUlQKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwlib29sICJQUzMgVmlydHVhbCBVQVJUIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUFMzIFZpcnR1YWwgVUFSVC4KKworCSAgVGhpcyBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciBzZXZlcmFsIHN5c3RlbSBzZXJ2aWNlcworCSAgaW5jbHVkaW5nIHRoZSBTeXN0ZW0gTWFuYWdlciBhbmQgQVYgU2V0dGluZ3MuICBJbgorCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1N2NmYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorb2JqLXkgKz0gc2V0dXAubyBtbS5vIHNtcC5vIHRpbWUubyBodmNhbGwubyBodGFiLm8gcmVwb3NpdG9yeS5vCitvYmoteSArPSBpbnRlcnJ1cHQubyBleHBvcnRzLm8gb3MtYXJlYS5vCisKK29iai0kKENPTkZJR19TUFVfQkFTRSkgKz0gc3B1Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2V4cG9ydHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2V4cG9ydHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2U4ZmZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZXhwb3J0cy5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiAgUFMzIGh2Y2FsbCBleHBvcnRzIGZvciBtb2R1bGVzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIExWMV9DQUxMKG5hbWUsIGluLCBvdXQsIG51bSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZXh0ZXJuIHM2NCBfbHYxXyMjbmFtZShMVjFfIyNpbiMjX0lOXyMjb3V0IyNfT1VUX0FSR19ERUNMKTsgXAorICBFWFBPUlRfU1lNQk9MKF9sdjFfIyNuYW1lKTsKKworI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlMTc2OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYwpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqICBQUzMgcGFnZXRhYmxlIG1hbmFnZW1lbnQgcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9sbWIuaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9wczMuaD4KKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2lmIGRlZmluZWQoREVCVUcpCisjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIGhwdGVfdCAqaHRhYjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGh0YWJfYWRkcjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpib2x0dGFiOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmludXNldGFiOworCitzdGF0aWMgc3BpbmxvY2tfdCBwczNfYm9sdHRhYl9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCisjZGVmaW5lIGRlYnVnX2R1bXBfaHB0ZShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZykgXAorCV9kZWJ1Z19kdW1wX2hwdGUoX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kZWJ1Z19kdW1wX2hwdGUodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyB2YSwKKwl1bnNpZ25lZCBsb25nIGdyb3VwLCB1bnNpZ25lZCBsb25nIGJpdG1hcCwgaHB0ZV90IGxocHRlLCBpbnQgcHNpemUsCisJdW5zaWduZWQgbG9uZyBzbG90LCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3sKKwlEQkcoIiVzOiVkOiBwYSAgICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBwYSk7CisJREJHKCIlczolZDogbHBhciAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwKKwkJcHMzX21tX3BoeXNfdG9fbHBhcihwYSkpOworCURCRygiJXM6JWQ6IHZhICAgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIHZhKTsKKwlEQkcoIiVzOiVkOiBncm91cCAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBncm91cCk7CisJREJHKCIlczolZDogYml0bWFwID0gJWx4aFxuIiwgZnVuYywgbGluZSwgYml0bWFwKTsKKwlEQkcoIiVzOiVkOiBocHRlLnYgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBsaHB0ZS52KTsKKwlEQkcoIiVzOiVkOiBocHRlLnIgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBsaHB0ZS5yKTsKKwlEQkcoIiVzOiVkOiBwc2l6ZSAgPSAleGhcbiIsIGZ1bmMsIGxpbmUsIHBzaXplKTsKKwlEQkcoIiVzOiVkOiBzbG90ICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBzbG90KTsKK30KKworc3RhdGljIGxvbmcgcHMzX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwgdW5zaWduZWQgbG9uZyB2YSwKKwl1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHJmbGFncywgdW5zaWduZWQgbG9uZyB2ZmxhZ3MsIGludCBwc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNsb3Q7CisJaHB0ZV90IGxocHRlOworCWludCBzZWNvbmRhcnkgPSAwOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgYml0bWFwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBwX3B0ZWcsIHNfcHRlZywgYl9pbmRleCwgYl9tYXNrLCBjYiwgY2k7CisKKwl2ZmxhZ3MgJj0gfkhQVEVfVl9TRUNPTkRBUlk7IC8qIHRoaXMgYml0IGlzIGlnbm9yZWQgKi8KKworCWxocHRlLnYgPSBocHRlX2VuY29kZV92KHZhLCBwc2l6ZSkgfCB2ZmxhZ3MgfCBIUFRFX1ZfVkFMSUQ7CisJbGhwdGUuciA9IGhwdGVfZW5jb2RlX3IocHMzX21tX3BoeXNfdG9fbHBhcihwYSksIHBzaXplKSB8IHJmbGFnczsKKworCXBfcHRlZyA9IGhwdGVfZ3JvdXAgLyBIUFRFU19QRVJfR1JPVVA7CisJc19wdGVnID0gfnBfcHRlZyAmIGh0YWJfaGFzaF9tYXNrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBzM19ib2x0dGFiX2xvY2ssIGZsYWdzKTsKKworCUJVR19PTihib2x0dGFiW3BfcHRlZ10gPT0gMHhmZiAmJiBib2x0dGFiW3NfcHRlZ10gPT0gMHhmZik7CisKKwliaXRtYXAgPSAoaW51c2V0YWJbcF9wdGVnXSA8PCA4KSB8IGludXNldGFiW3NfcHRlZ107CisKKwlpZiAoYml0bWFwID09IDB4ZmZmZikgeworCQkvKgorCQkgKiBQVEVHIGlzIGZ1bGwuIFNlYXJjaCBmb3IgdmljdGltLgorCQkgKi8KKwkJYml0bWFwICY9IH4oKGJvbHR0YWJbcF9wdGVnXSA8PCA4KSB8IGJvbHR0YWJbc19wdGVnXSk7CisJCWRvIHsKKwkJCWNpID0gbWZ0YigpICYgMTU7CisJCQljYiA9IDB4ODAwMFVMID4+IGNpOworCQl9IHdoaWxlICgoY2IgJiBiaXRtYXApID09IDApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHNlYXJjaCBmcmVlIHNsb3QgaW4gaGFyZHdhcmUgb3JkZXIKKwkJICoJW3ByaW1hcnldCTAsIDIsIDQsIDYsIDEsIDMsIDUsIDcKKwkJICoJW3NlY29uZGFyeV0JMCwgMiwgNCwgNiwgMSwgMywgNSwgNworCQkgKi8KKwkJZm9yIChjaSA9IDA7IGNpIDwgSFBURVNfUEVSX0dST1VQOyBjaSArPSAyKSB7CisJCQljYiA9IDB4ODAwMFVMID4+IGNpOworCQkJaWYgKChjYiAmIGJpdG1hcCkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJCWZvciAoY2kgPSAxOyBjaSA8IEhQVEVTX1BFUl9HUk9VUDsgY2kgKz0gMikgeworCQkJY2IgPSAweDgwMDBVTCA+PiBjaTsKKwkJCWlmICgoY2IgJiBiaXRtYXApID09IDApCisJCQkJZ290byBmb3VuZDsKKwkJfQorCQlmb3IgKGNpID0gSFBURVNfUEVSX0dST1VQOyBjaSA8IEhQVEVTX1BFUl9HUk9VUCoyOyBjaSArPSAyKSB7CisJCQljYiA9IDB4ODAwMFVMID4+IGNpOworCQkJaWYgKChjYiAmIGJpdG1hcCkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJCWZvciAoY2kgPSBIUFRFU19QRVJfR1JPVVArMTsgY2kgPCBIUFRFU19QRVJfR1JPVVAqMjsgY2kgKz0gMikgeworCQkJY2IgPSAweDgwMDBVTCA+PiBjaTsKKwkJCWlmICgoY2IgJiBiaXRtYXApID09IDApCisJCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworZm91bmQ6CisJaWYgKGNpIDwgSFBURVNfUEVSX0dST1VQKSB7CisJCXNsb3QgPSBwX3B0ZWcgKiBIUFRFU19QRVJfR1JPVVAgKyBjaTsKKwl9IGVsc2UgeworCQlzbG90ID0gc19wdGVnICogSFBURVNfUEVSX0dST1VQICsgKGNpICYgNyk7CisJCS8qIGxocHRlLmR3MC5kdzAuaCA9IDE7ICovCisJCXZmbGFncyB8PSBIUFRFX1ZfU0VDT05EQVJZOworCQlsaHB0ZS52IHw9IEhQVEVfVl9TRUNPTkRBUlk7CisJfQorCisJcmVzdWx0ID0gbHYxX3dyaXRlX2h0YWJfZW50cnkoMCwgc2xvdCwgbGhwdGUudiwgbGhwdGUucik7CisKKwlpZiAocmVzdWx0KSB7CisJCWRlYnVnX2R1bXBfaHB0ZShwYSwgdmEsIGhwdGVfZ3JvdXAsIGJpdG1hcCwgbGhwdGUsIHBzaXplLCBzbG90KTsKKwkJQlVHKCk7CisJfQorCisJLyoKKwkgKiBJZiB1c2VkIHNsb3QgaXMgbm90IGluIHByaW1hcnkgSFBURSBncm91cCwKKwkgKiB0aGUgc2xvdCBzaG91bGQgYmUgaW4gc2Vjb25kYXJ5IEhQVEUgZ3JvdXAuCisJICovCisKKwlpZiAoKGhwdGVfZ3JvdXAgXiBzbG90KSAmIH4oSFBURVNfUEVSX0dST1VQIC0gMSkpIHsKKwkJc2Vjb25kYXJ5ID0gMTsKKwkJYl9pbmRleCA9IHNfcHRlZzsKKwl9IGVsc2UgeworCQlzZWNvbmRhcnkgPSAwOworCQliX2luZGV4ID0gcF9wdGVnOworCX0KKworCWJfbWFzayA9IChsaHB0ZS52ICYgSFBURV9WX0JPTFRFRCkgPyAxIDw8IDcgOiAwIDw8IDc7CisJYm9sdHRhYltiX2luZGV4XSB8PSBiX21hc2sgPj4gKHNsb3QgJiA3KTsKKwliX21hc2sgPSAxIDw8IDc7CisJaW51c2V0YWJbYl9pbmRleF0gfD0gYl9tYXNrID4+IChzbG90ICYgNyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHMzX2JvbHR0YWJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChzbG90ICYgNykgfCAoc2Vjb25kYXJ5IDw8IDMpOworfQorCitzdGF0aWMgbG9uZyBwczNfaHB0ZV9yZW1vdmUodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwKQoreworCXBhbmljKCJwczNfaHB0ZV9yZW1vdmUoKSBub3QgaW1wbGVtZW50ZWQiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgcHMzX2hwdGVfdXBkYXRlcHAodW5zaWduZWQgbG9uZyBzbG90LCB1bnNpZ25lZCBsb25nIG5ld3BwLAorCXVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSwgaW50IGxvY2FsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBwdGVnLCBiaXQ7CisJdW5zaWduZWQgbG9uZyBocHRlX3YsIHdhbnRfdjsKKworCXdhbnRfdiA9IGhwdGVfZW5jb2RlX3YodmEsIHBzaXplKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwczNfYm9sdHRhYl9sb2NrLCBmbGFncyk7CisKKwlocHRlX3YgPSBodGFiW3Nsb3RdLnY7CisJaWYgKCFIUFRFX1ZfQ09NUEFSRShocHRlX3YsIHdhbnRfdikgfHwgIShocHRlX3YgJiBIUFRFX1ZfVkFMSUQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzM19ib2x0dGFiX2xvY2ssIGZsYWdzKTsKKworCQkvKiBwczNfaHB0ZV9pbnNlcnQoKSB3aWxsIGJlIHVzZWQgdG8gdXBkYXRlIFBURSAqLworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0ID0gbHYxX3dyaXRlX2h0YWJfZW50cnkoMCwgc2xvdCwgMCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCURCRygiJXM6IHZhPSVseCBzbG90PSVseCBwc2l6ZT0lZCByZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCB2YSwgc2xvdCwgcHNpemUsIHJlc3VsdCwgcmVzdWx0KTsKKwkJQlVHKCk7CisJfQorCisJcHRlZyA9IHNsb3QgLyBIUFRFU19QRVJfR1JPVVA7CisJYml0ID0gc2xvdCAlIEhQVEVTX1BFUl9HUk9VUDsKKwlpbnVzZXRhYltwdGVnXSAmPSB+KDB4ODAgPj4gYml0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzM19ib2x0dGFiX2xvY2ssIGZsYWdzKTsKKworCS8qIHBzM19ocHRlX2luc2VydCgpIHdpbGwgYmUgdXNlZCB0byB1cGRhdGUgUFRFICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBwczNfaHB0ZV91cGRhdGVib2x0ZWRwcCh1bnNpZ25lZCBsb25nIG5ld3BwLCB1bnNpZ25lZCBsb25nIGVhLAorCWludCBwc2l6ZSkKK3sKKwlwYW5pYygicHMzX2hwdGVfdXBkYXRlYm9sdGVkcHAoKSBub3QgaW1wbGVtZW50ZWQiKTsKK30KKworc3RhdGljIHZvaWQgcHMzX2hwdGVfaW52YWxpZGF0ZSh1bnNpZ25lZCBsb25nIHNsb3QsIHVuc2lnbmVkIGxvbmcgdmEsCisJaW50IHBzaXplLCBpbnQgbG9jYWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHB0ZWcsIGJpdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwczNfYm9sdHRhYl9sb2NrLCBmbGFncyk7CisJcmVzdWx0ID0gbHYxX3dyaXRlX2h0YWJfZW50cnkoMCwgc2xvdCwgMCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCURCRygiJXM6IHZhPSVseCBzbG90PSVseCBwc2l6ZT0lZCByZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCB2YSwgc2xvdCwgcHNpemUsIHJlc3VsdCwgcmVzdWx0KTsKKwkJQlVHKCk7CisJfQorCisJcHRlZyA9IHNsb3QgLyBIUFRFU19QRVJfR1JPVVA7CisJYml0ID0gc2xvdCAlIEhQVEVTX1BFUl9HUk9VUDsKKwlpbnVzZXRhYltwdGVnXSAmPSB+KDB4ODAgPj4gYml0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwczNfYm9sdHRhYl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19ocHRlX2NsZWFyKHZvaWQpCit7CisJbHYxX3VubWFwX2h0YWIoaHRhYl9hZGRyKTsKK30KKwordm9pZCBfX2luaXQgcHMzX2hwdGVfaW5pdCh1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZSkKK3sKKwlsb25nIGJpdG1hcF9zaXplOworCisJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcGNfbWQuaHB0ZV9pbnZhbGlkYXRlID0gcHMzX2hwdGVfaW52YWxpZGF0ZTsKKwlwcGNfbWQuaHB0ZV91cGRhdGVwcCA9IHBzM19ocHRlX3VwZGF0ZXBwOworCXBwY19tZC5ocHRlX3VwZGF0ZWJvbHRlZHBwID0gcHMzX2hwdGVfdXBkYXRlYm9sdGVkcHA7CisJcHBjX21kLmhwdGVfaW5zZXJ0ID0gcHMzX2hwdGVfaW5zZXJ0OworCXBwY19tZC5ocHRlX3JlbW92ZSA9IHBzM19ocHRlX3JlbW92ZTsKKwlwcGNfbWQuaHB0ZV9jbGVhcl9hbGwgPSBwczNfaHB0ZV9jbGVhcjsKKworCXBwYzY0X3BmdF9zaXplID0gX19pbG9nMihodGFiX3NpemUpOworCisJYml0bWFwX3NpemUgPSBodGFiX3NpemUgLyBzaXplb2YoaHB0ZV90KSAvIDg7CisKKwlib2x0dGFiID0gX192YShsbWJfYWxsb2MoYml0bWFwX3NpemUsIDEpKTsKKwlpbnVzZXRhYiA9IF9fdmEobG1iX2FsbG9jKGJpdG1hcF9zaXplLCAxKSk7CisKKwltZW1zZXQoYm9sdHRhYiwgMCwgYml0bWFwX3NpemUpOworCW1lbXNldChpbnVzZXRhYiwgMCwgYml0bWFwX3NpemUpOworCisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Cit9CisKK3ZvaWQgX19pbml0IHBzM19tYXBfaHRhYih2b2lkKQoreworCWxvbmcgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgaHRhYl9zaXplID0gKDFVTCA8PCBwcGM2NF9wZnRfc2l6ZSk7CisKKwlyZXN1bHQgPSBsdjFfbWFwX2h0YWIoMCwgJmh0YWJfYWRkcik7CisKKwlodGFiID0gKGhwdGVfdCAqKV9faW9yZW1hcChodGFiX2FkZHIsIGh0YWJfc2l6ZSwgUEFHRV9SRUFET05MWV9YKTsKKworCURCRygiJXM6JWQ6IGxwYXIgJTAxNmx4aCwgdmlydCAlMDE2bHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWh0YWJfYWRkciwgKHVuc2lnbmVkIGxvbmcpaHRhYik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odmNhbGwuUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h2Y2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmU2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odmNhbGwuUwpAQCAtMCwwICsxLDgwNCBAQAorLyoKKyAqICBQUzMgaHZjYWxsIGludGVyZmFjZS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICogIENvcHlyaWdodCAyMDAzLCAyMDA0IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorCisjZGVmaW5lIGx2MWNhbGwgLmxvbmcgMHg0NDAwMDAyMjsgZXh0c3cgcjMsIHIzCisKKyNkZWZpbmUgTFYxX05fSU5fMF9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzBfSU5fMF9PVVQgTFYxX05fSU5fMF9PVVQKKyNkZWZpbmUgTFYxXzFfSU5fMF9PVVQgTFYxX05fSU5fMF9PVVQKKyNkZWZpbmUgTFYxXzJfSU5fMF9PVVQgTFYxX05fSU5fMF9PVVQKKyNkZWZpbmUgTFYxXzNfSU5fMF9PVVQgTFYxX05fSU5fMF9PVVQKKyNkZWZpbmUgTFYxXzRfSU5fMF9PVVQgTFYxX05fSU5fMF9PVVQKKyNkZWZpbmUgTFYxXzVfSU5fMF9PVVQgTFYxX05fSU5fMF9PVVQKKyNkZWZpbmUgTFYxXzZfSU5fMF9PVVQgTFYxX05fSU5fMF9PVVQKKyNkZWZpbmUgTFYxXzdfSU5fMF9PVVQgTFYxX05fSU5fMF9PVVQKKworI2RlZmluZSBMVjFfMF9JTl8xX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkdSAgICByMywgLTgocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDg7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8wX0lOXzJfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHIzLCAtOChyMSk7CQkJXAorCXN0ZHUJcjQsIC0xNihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMTY7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8wX0lOXzNfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHIzLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgLTE2KHIxKTsJCQlcCisJc3RkdQlyNSwgLTI0KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAyNDsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzBfSU5fN19PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjMsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgLTMyKHIxKTsJCQlcCisJc3RkCXI3LCAtNDAocjEpOwkJCVwKKwlzdGQJcjgsIC00OChyMSk7CQkJXAorCXN0ZHUJcjksIC01NihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgNTY7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMjQocjEpOwkJCVwKKwlzdGQJcjYsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMzIocjEpOwkJCVwKKwlzdGQJcjcsIDAocjExKTsJCQlcCisJbGQJcjExLCAtNDAocjEpOwkJCVwKKwlzdGQJcjgsIDAocjExKTsJCQlcCisJbGQJcjExLCAtNDgocjEpOwkJCVwKKwlzdGQJcjksIDAocjExKTsJCQlcCisJbGQJcjExLCAtNTYocjEpOwkJCVwKKwlzdGQJcjEwLCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMV9JTl8xX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkdSAgICByNCwgLTgocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDg7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8xX0lOXzJfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI0LCAtOChyMSk7CQkJXAorCXN0ZHUJcjUsIC0xNihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMTY7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8xX0lOXzNfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI0LCAtOChyMSk7CQkJXAorCXN0ZAlyNSwgLTE2KHIxKTsJCQlcCisJc3RkdQlyNiwgLTI0KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAyNDsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzFfSU5fNF9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjQsIC04KHIxKTsJCQlcCisJc3RkCXI1LCAtMTYocjEpOwkJCVwKKwlzdGQJcjYsIC0yNChyMSk7CQkJXAorCXN0ZHUJcjcsIC0zMihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMzI7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMjQocjEpOwkJCVwKKwlzdGQJcjYsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMzIocjEpOwkJCVwKKwlzdGQJcjcsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8xX0lOXzVfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI0LCAtOChyMSk7CQkJXAorCXN0ZAlyNSwgLTE2KHIxKTsJCQlcCisJc3RkCXI2LCAtMjQocjEpOwkJCVwKKwlzdGQJcjcsIC0zMihyMSk7CQkJXAorCXN0ZHUJcjgsIC00MChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgNDA7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMjQocjEpOwkJCVwKKwlzdGQJcjYsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMzIocjEpOwkJCVwKKwlzdGQJcjcsIDAocjExKTsJCQlcCisJbGQJcjExLCAtNDAocjEpOwkJCVwKKwlzdGQJcjgsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8xX0lOXzZfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI0LCAtOChyMSk7CQkJXAorCXN0ZAlyNSwgLTE2KHIxKTsJCQlcCisJc3RkCXI2LCAtMjQocjEpOwkJCVwKKwlzdGQJcjcsIC0zMihyMSk7CQkJXAorCXN0ZAlyOCwgLTQwKHIxKTsJCQlcCisJc3RkdQlyOSwgLTQ4KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCA0ODsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0zMihyMSk7CQkJXAorCXN0ZAlyNywgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC00MChyMSk7CQkJXAorCXN0ZAlyOCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC00OChyMSk7CQkJXAorCXN0ZAlyOSwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzFfSU5fN19PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjQsIC04KHIxKTsJCQlcCisJc3RkCXI1LCAtMTYocjEpOwkJCVwKKwlzdGQJcjYsIC0yNChyMSk7CQkJXAorCXN0ZAlyNywgLTMyKHIxKTsJCQlcCisJc3RkCXI4LCAtNDAocjEpOwkJCVwKKwlzdGQJcjksIC00OChyMSk7CQkJXAorCXN0ZHUJcjEwLCAtNTYocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDU2OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTMyKHIxKTsJCQlcCisJc3RkCXI3LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTQwKHIxKTsJCQlcCisJc3RkCXI4LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTQ4KHIxKTsJCQlcCisJc3RkCXI5LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTU2KHIxKTsJCQlcCisJc3RkCXIxMCwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzJfSU5fMV9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZHUJcjUsIC04KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCA4OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMl9JTl8yX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByNSwgLTgocjEpOwkJCVwKKwlzdGR1CXI2LCAtMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDE2OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMl9JTl8zX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByNSwgLTgocjEpOwkJCVwKKwlzdGQJcjYsIC0xNihyMSk7CQkJXAorCXN0ZHUJcjcsIC0yNChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMjQ7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMjQocjEpOwkJCVwKKwlzdGQJcjYsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8yX0lOXzRfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI1LCAtOChyMSk7CQkJXAorCXN0ZAlyNiwgLTE2KHIxKTsJCQlcCisJc3RkCXI3LCAtMjQocjEpOwkJCVwKKwlzdGR1CXI4LCAtMzIocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDMyOwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTMyKHIxKTsJCQlcCisJc3RkCXI3LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfMl9JTl81X09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByNSwgLTgocjEpOwkJCVwKKwlzdGQJcjYsIC0xNihyMSk7CQkJXAorCXN0ZAlyNywgLTI0KHIxKTsJCQlcCisJc3RkCXI4LCAtMzIocjEpOwkJCVwKKwlzdGR1CXI5LCAtNDAocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDQwOwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTI0KHIxKTsJCQlcCisJc3RkCXI2LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTMyKHIxKTsJCQlcCisJc3RkCXI3LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTQwKHIxKTsJCQlcCisJc3RkCXI4LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfM19JTl8xX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkdQlyNiwgLTgocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDg7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8zX0lOXzJfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI2LCAtOChyMSk7CQkJXAorCXN0ZHUJcjcsIC0xNihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMTY7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV8zX0lOXzNfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGQgICAgIHI2LCAtOChyMSk7CQkJXAorCXN0ZAlyNywgLTE2KHIxKTsJCQlcCisJc3RkdQlyOCwgLTI0KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAyNDsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzRfSU5fMV9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZHUgICAgcjcsIC04KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCA4OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfNF9JTl8yX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByNywgLTgocjEpOwkJCVwKKwlzdGR1CXI4LCAtMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlsaSAgICAgIHIxMSwgQVBJX05VTUJFUjsJCVwKKwlsdjFjYWxsOwkJCQlcCisJCQkJCQlcCisJYWRkaQlyMSwgcjEsIDE2OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgLTE2KHIxKTsJCQlcCisJc3RkCXI1LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfNF9JTl8zX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByNywgLTgocjEpOwkJCVwKKwlzdGQJcjgsIC0xNihyMSk7CQkJXAorCXN0ZHUJcjksIC0yNChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMjQ7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMjQocjEpOwkJCVwKKwlzdGQJcjYsIDAocjExKTsJCQlcCisJCQkJCQlcCisJbGQJcjAsIDE2KHIxKTsJCQlcCisJbXRscglyMDsJCQkJXAorCWJscgorCisjZGVmaW5lIExWMV81X0lOXzFfT1VUKEFQSV9OQU1FLCBBUElfTlVNQkVSKQlcCitfR0xPQkFMKF8jI0FQSV9OQU1FKQkJCQlcCisJCQkJCQlcCisJbWZscglyMDsJCQkJXAorCXN0ZAlyMCwgMTYocjEpOwkJCVwKKwkJCQkJCVwKKwlzdGR1ICAgIHI4LCAtOChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgODsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzVfSU5fMl9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjgsIC04KHIxKTsJCQlcCisJc3RkdQlyOSwgLTE2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAxNjsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzVfSU5fM19PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjgsIC04KHIxKTsJCQlcCisJc3RkCXI5LCAtMTYocjEpOwkJCVwKKwlzdGR1CXIxMCwgLTI0KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAyNDsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0yNChyMSk7CQkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzZfSU5fMV9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZHUgICAgcjksIC04KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCA4OwkJCVwKKwlsZAlyMTEsIC04KHIxKTsJCQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworI2RlZmluZSBMVjFfNl9JTl8yX09VVChBUElfTkFNRSwgQVBJX05VTUJFUikJXAorX0dMT0JBTChfIyNBUElfTkFNRSkJCQkJXAorCQkJCQkJXAorCW1mbHIJcjA7CQkJCVwKKwlzdGQJcjAsIDE2KHIxKTsJCQlcCisJCQkJCQlcCisJc3RkICAgICByOSwgLTgocjEpOwkJCVwKKwlzdGR1ICAgIHIxMCwgLTE2KHIxKTsJCQlcCisJCQkJCQlcCisJbGkgICAgICByMTEsIEFQSV9OVU1CRVI7CQlcCisJbHYxY2FsbDsJCQkJXAorCQkJCQkJXAorCWFkZGkJcjEsIHIxLCAxNjsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIC0xNihyMSk7CQkJXAorCXN0ZAlyNSwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzZfSU5fM19PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZCAgICAgcjksIC04KHIxKTsJCQlcCisJc3RkdSAgICByMTAsIC0xNihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgMTY7CQkJXAorCWxkCXIxMSwgLTgocjEpOwkJCVwKKwlzdGQJcjQsIDAocjExKTsJCQlcCisJbGQJcjExLCAtMTYocjEpOwkJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCA0OCs4KjgocjEpOwkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzdfSU5fMV9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZHUgICAgcjEwLCAtOChyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlhZGRpCXIxLCByMSwgODsJCQlcCisJbGQJcjExLCAtOChyMSk7CQkJXAorCXN0ZAlyNCwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzdfSU5fNl9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCXN0ZAlyMTAsIDQ4KzgqNyhyMSk7CQlcCisJCQkJCQlcCisJbGkJcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlsZAlyMTEsIDQ4KzgqNyhyMSk7CQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCWxkCXIxMSwgNDgrOCo4KHIxKTsJCVwKKwlzdGQJcjUsIDAocjExKTsJCQlcCisJbGQJcjExLCA0OCs4KjkocjEpOwkJXAorCXN0ZAlyNiwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIDQ4KzgqMTAocjEpOwkJXAorCXN0ZAlyNywgMChyMTEpOwkJCVwKKwlsZAlyMTEsIDQ4KzgqMTEocjEpOwkJXAorCXN0ZAlyOCwgMChyMTEpOwkJCVwKKwlsZAlyMTEsIDQ4KzgqMTIocjEpOwkJXAorCXN0ZAlyOSwgMChyMTEpOwkJCVwKKwkJCQkJCVwKKwlsZAlyMCwgMTYocjEpOwkJCVwKKwltdGxyCXIwOwkJCQlcCisJYmxyCisKKyNkZWZpbmUgTFYxXzhfSU5fMV9PVVQoQVBJX05BTUUsIEFQSV9OVU1CRVIpCVwKK19HTE9CQUwoXyMjQVBJX05BTUUpCQkJCVwKKwkJCQkJCVwKKwltZmxyCXIwOwkJCQlcCisJc3RkCXIwLCAxNihyMSk7CQkJXAorCQkJCQkJXAorCWxpICAgICAgcjExLCBBUElfTlVNQkVSOwkJXAorCWx2MWNhbGw7CQkJCVwKKwkJCQkJCVwKKwlsZAlyMTEsIDQ4KzgqOChyMSk7CQlcCisJc3RkCXI0LCAwKHIxMSk7CQkJXAorCQkJCQkJXAorCWxkCXIwLCAxNihyMSk7CQkJXAorCW10bHIJcjA7CQkJCVwKKwlibHIKKworCS50ZXh0CisKKy8qIHRoZSBsdjEgdW5kZXJzY29yZWQgY2FsbCBkZWZpbml0aW9ucyBleHBhbmQgaGVyZSAqLworCisjZGVmaW5lIExWMV9DQUxMKG5hbWUsIGluLCBvdXQsIG51bSkgTFYxXyMjaW4jI19JTl8jI291dCMjX09VVChsdjFfIyNuYW1lLCBudW0pCisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2YzFlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogIFBTMyBpbnRlcnJ1cHQgcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgREJHKGZtdC4uLikgdWRiZ19wcmludGYoZm10KQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNlbmRpZgorCisvKioKKyAqIHBzM19hbGxvY19pb19pcnEgLSBBc3NpZ24gYSB2aXJxIHRvIGEgc3lzdGVtIGJ1cyBkZXZpY2UuCisgKiBpbnRlcnJ1cHRfaWQ6IFRoZSBkZXZpY2UgaW50ZXJydXB0IGlkIHJlYWQgZnJvbSB0aGUgc3lzdGVtIHJlcG9zaXRvcnkuCisgKiBAdmlycTogVGhlIGFzc2lnbmVkIExpbnV4IHZpcnEuCisgKgorICogQW4gaW8gaXJxIHJlcHJlc2VudHMgYSBub24tdmlydHVhbGl6ZWQgZGV2aWNlIGludGVycnVwdC4gIGludGVycnVwdF9pZAorICogY29yZXNwb25kcyB0byB0aGUgaW50ZXJydXB0IG51bWJlciBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisgKi8KKworaW50IHBzM19hbGxvY19pb19pcnEodW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50ICp2aXJxKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBvdXRsZXQ7CisKKwlyZXN1bHQgPSBsdjFfY29uc3RydWN0X2lvX2lycV9vdXRsZXQoaW50ZXJydXB0X2lkLCAmb3V0bGV0KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29uc3RydWN0X2lvX2lycV9vdXRsZXQgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkqdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBvdXRsZXQpOworCisJcHJfZGVidWcoIiVzOiVkOiBpbnRlcnJ1cHRfaWQgJXUgPT4gb3V0bGV0ICVsdSwgdmlycSAldVxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBpbnRlcnJ1cHRfaWQsIG91dGxldCwgKnZpcnEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwczNfZnJlZV9pb19pcnEodW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KHZpcnFfdG9faHcodmlycSkpOworCisJaWYgKCFyZXN1bHQpCisJCXByX2RlYnVnKCIlczolZDogbHYxX2Rlc3RydWN0X2lvX2lycV9vdXRsZXQgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKworCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM19hbGxvY19ldmVudF9pcnEgLSBBbGxvY2F0ZSBhIHZpcnEgZm9yIHVzZSB3aXRoIGEgc3lzdGVtIGV2ZW50LgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIFRoZSB2aXJxIGNhbiBiZSB1c2VkIHdpdGggbHYxX2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCgpIHRvCisgKiBhcnJhbmdlIHRvIHJlY2VpdmUgZXZlbnRzLCBvciB3aXRoIHBzM19zZW5kX2V2ZW50X2xvY2FsbHkoKSB0byBzaWduYWwKKyAqIGV2ZW50cy4KKyAqLworCitpbnQgcHMzX2FsbG9jX2V2ZW50X2lycSh1bnNpZ25lZCBpbnQgKnZpcnEpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIG91dGxldDsKKworCXJlc3VsdCA9IGx2MV9jb25zdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0KCZvdXRsZXQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25zdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0IGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCSp2aXJxID0gTk9fSVJROworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCSp2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIG91dGxldCk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IG91dGxldCAlbHUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgb3V0bGV0LAorCQkqdmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBzM19mcmVlX2V2ZW50X2lycSh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgcmVzdWx0OworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQodmlycV90b19odyh2aXJxKSk7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKworCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfc2VuZF9ldmVudF9sb2NhbGx5KHVuc2lnbmVkIGludCB2aXJxKQoreworCXJldHVybiBsdjFfc2VuZF9ldmVudF9sb2NhbGx5KHZpcnFfdG9faHcodmlycSkpOworfQorCisvKioKKyAqIHBzM19jb25uZWN0X2V2ZW50X2lycSAtIEFzc2lnbiBhIHZpcnEgdG8gYSBzeXN0ZW0gYnVzIGRldmljZS4KKyAqIEBkaWQ6IFRoZSBIViBkZXZpY2UgaWRlbnRpZmllciByZWFkIGZyb20gdGhlIHN5c3RlbSByZXBvc2l0b3J5LgorICogQGludGVycnVwdF9pZDogVGhlIGRldmljZSBpbnRlcnJ1cHQgaWQgcmVhZCBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeS4KKyAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KKyAqCisgKiBBbiBldmVudCBpcnEgcmVwcmVzZW50cyBhIHZpcnR1YWwgZGV2aWNlIGludGVycnVwdC4gIFRoZSBpbnRlcnJ1cHRfaWQKKyAqIGNvcmVzcG9uZHMgdG8gdGhlIHNvZnR3YXJlIGludGVycnVwdCBudW1iZXIuCisgKi8KKworaW50IHBzM19jb25uZWN0X2V2ZW50X2lycShjb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCAqZGlkLAorCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsIHVuc2lnbmVkIGludCAqdmlycSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gcHMzX2FsbG9jX2V2ZW50X2lycSh2aXJxKTsKKworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlyZXN1bHQgPSBsdjFfY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0KGRpZC0+YnVzX2lkLAorCQlkaWQtPmRldl9pZCwgdmlycV90b19odygqdmlycSksIGludGVycnVwdF9pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCIKKwkJCSIgZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcHMzX2ZyZWVfZXZlbnRfaXJxKCp2aXJxKTsKKwkJKnZpcnEgPSBOT19JUlE7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJfZGVidWcoIiVzOiVkOiBpbnRlcnJ1cHRfaWQgJXUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJaW50ZXJydXB0X2lkLCAqdmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBzM19kaXNjb25uZWN0X2V2ZW50X2lycShjb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCAqZGlkLAorCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsIHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCByZXN1bHQ7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBpbnRlcnJ1cHRfaWQgJXUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJaW50ZXJydXB0X2lkLCB2aXJxKTsKKworCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQoZGlkLT5idXNfaWQsCisJCWRpZC0+ZGV2X2lkLCB2aXJxX3RvX2h3KHZpcnEpLCBpbnRlcnJ1cHRfaWQpOworCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZGlzY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0IgorCQkJIiBmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlwczNfcmVzdWx0KHJlc3VsdCkpOworCisJcHMzX2ZyZWVfZXZlbnRfaXJxKHZpcnEpOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM19hbGxvY192dWFydF9pcnEgLSBDb25maWd1cmUgdGhlIHN5c3RlbSB2aXJ0dWFsIHVhcnQgdmlycS4KKyAqIEB2aXJ0X2FkZHJfYm1wOiBUaGUgY2FsbGVyIHN1cHBsaWVkIHZpcnR1YWwgdWFydCBpbnRlcnJ1cHQgYml0bWFwLgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIFRoZSBzeXN0ZW0gc3VwcG9ydHMgb25seSBhIHNpbmdsZSB2aXJ0dWFsIHVhcnQsIHNvIG11bHRpcGxlIGNhbGxzIHdpdGhvdXQKKyAqIGZyZWVpbmcgdGhlIGludGVycnVwdCB3aWxsIHJldHVybiBhIHdyb25nIHN0YXRlIGVycm9yLgorICovCisKK2ludCBwczNfYWxsb2NfdnVhcnRfaXJxKHZvaWQqIHZpcnRfYWRkcl9ibXAsIHVuc2lnbmVkIGludCAqdmlycSkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgb3V0bGV0OworCXVuc2lnbmVkIGxvbmcgbHBhcl9hZGRyOworCisJQlVHX09OKCFpc19rZXJuZWxfYWRkcigodW5zaWduZWQgbG9uZyl2aXJ0X2FkZHJfYm1wKSk7CisKKwlscGFyX2FkZHIgPSBwczNfbW1fcGh5c190b19scGFyKF9fcGEodmlydF9hZGRyX2JtcCkpOworCisJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxKGxwYXJfYWRkciwgJm91dGxldCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2NvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJKnZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgb3V0bGV0KTsKKworCXByX2RlYnVnKCIlczolZDogb3V0bGV0ICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlvdXRsZXQsICp2aXJxKTsKKworCXJldHVybiAwOworfQorCitpbnQgcHMzX2ZyZWVfdnVhcnRfaXJxKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBsdjFfZGVjb25maWd1cmVfdmlydHVhbF91YXJ0X2lycSgpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25maWd1cmVfdmlydHVhbF91YXJ0X2lycSBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM19hbGxvY19zcGVfaXJxIC0gQ29uZmlndXJlIGFuIHNwZSB2aXJxLgorICogQHNwZV9pZDogVGhlIHNwZV9pZCByZXR1cm5lZCBmcm9tIGx2MV9jb25zdHJ1Y3RfbG9naWNhbF9zcGUoKS4KKyAqIEBjbGFzczogVGhlIHNwZSBpbnRlcnJ1cHQgY2xhc3MgezAsMSwyfS4KKyAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KKyAqCisgKi8KKworaW50IHBzM19hbGxvY19zcGVfaXJxKHVuc2lnbmVkIGxvbmcgc3BlX2lkLCB1bnNpZ25lZCBpbnQgY2xhc3MsCisJdW5zaWduZWQgaW50ICp2aXJxKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBvdXRsZXQ7CisKKwlCVUdfT04oY2xhc3MgPiAyKTsKKworCXJlc3VsdCA9IGx2MV9nZXRfc3BlX2lycV9vdXRsZXQoc3BlX2lkLCBjbGFzcywgJm91dGxldCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2dldF9zcGVfaXJxX291dGxldCBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCSp2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIG91dGxldCk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IHNwZV9pZCAlbHUsIGNsYXNzICV1LCBvdXRsZXQgJWx1LCB2aXJxICV1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIHNwZV9pZCwgY2xhc3MsIG91dGxldCwgKnZpcnEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwczNfZnJlZV9zcGVfaXJxKHVuc2lnbmVkIGludCB2aXJxKQoreworCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUFMzX0lOVkFMSURfT1VUTEVUICgoaXJxX2h3X251bWJlcl90KS0xKQorI2RlZmluZSBQUzNfUExVR19NQVggNjMKKworLyoqCisgKiBzdHJ1Y3QgYm1wIC0gYSBwZXIgY3B1IGlycSBzdGF0dXMgYW5kIG1hc2sgYml0bWFwIHN0cnVjdHVyZQorICogQHN0YXR1czogMjU2IGJpdCBzdGF0dXMgYml0bWFwIGluZGV4ZWQgYnkgcGx1ZworICogQHVudXNlZF8xOgorICogQG1hc2s6IDI1NiBiaXQgbWFzayBiaXRtYXAgaW5kZXhlZCBieSBwbHVnCisgKiBAdW51c2VkXzI6CisgKiBAbG9jazoKKyAqIEBpcGlfZGVidWdfYnJrX21hc2s6CisgKgorICogVGhlIEhWIG1hbnRhaW5zIHBlciBTTVQgdGhyZWFkIG1hcHBpbmdzIG9mIEhWIG91dGxldCB0byBIViBwbHVnIG9uCisgKiBiZWhhbGYgb2YgdGhlIGd1ZXN0LiAgVGhlc2UgbWFwcGluZ3MgYXJlIGltcGxlbWVudGVkIGFzIDI1NiBiaXQgZ3Vlc3QKKyAqIHN1cHBsaWVkIGJpdG1hcHMgaW5kZXhlZCBieSBwbHVnIG51bWJlci4gIFRoZSBhZGRyZXNzIG9mIHRoZSBiaXRtYXBzIGFyZQorICogcmVnaXN0ZXJlZCB3aXRoIHRoZSBIViB0aHJvdWdoIGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCgpLgorICoKKyAqIFRoZSBIViBzdXBwb3J0cyAyNTYgcGx1Z3MgcGVyIHRocmVhZCwgYXNzaWduZWQgYXMgezAuLjI1NX0sIGZvciBhIHRvdGFsCisgKiBvZiA1MTIgcGx1Z3Mgc3VwcG9ydGVkIG9uIGEgcHJvY2Vzc29yLiAgVG8gc2ltcGxpZnkgdGhlIGxvZ2ljIHRoaXMKKyAqIGltcGxlbWVudGF0aW9uIGVxdWF0ZXMgSFYgcGx1ZyB2YWx1ZSB0byBsaW51eCB2aXJxIHZhbHVlLCBjb25zdHJhaW5zIGVhY2gKKyAqIGludGVycnVwdCB0byBoYXZlIGEgc3lzdGVtIHdpZGUgdW5pcXVlIHBsdWcgbnVtYmVyLCBhbmQgbGltaXRzIHRoZSByYW5nZQorICogb2YgdGhlIHBsdWcgdmFsdWVzIHRvIG1hcCBpbnRvIHRoZSBmaXJzdCBkd29yZCBvZiB0aGUgYml0bWFwcy4gIFRoaXMKKyAqIGdpdmVzIGEgdXNhYmxlIHJhbmdlIG9mIHBsdWcgdmFsdWVzIG9mICB7TlVNX0lTQV9JTlRFUlJVUFRTLi42M30uICBOb3RlCisgKiB0aGF0IHRoZXJlIGlzIG5vIGNvbnN0cmFpbnQgb24gaG93IG1hbnkgaW4gdGhpcyBzZXQgYW4gaW5kaXZpZHVhbCB0aHJlYWQKKyAqIGNhbiBhcXVpcmUuCisgKi8KKworc3RydWN0IGJtcCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJCXVuc2lnbmVkIGxvbmcgdW51c2VkXzFbM107CisJCXVuc2lnbmVkIGxvbmcgbWFzazsKKwkJdW5zaWduZWQgbG9uZyB1bnVzZWRfMlszXTsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBpcGlfZGVidWdfYnJrX21hc2s7Cit9OworCisvKioKKyAqIHN0cnVjdCBwcml2YXRlIC0gYSBwZXIgY3B1IGRhdGEgc3RydWN0dXJlCisgKiBAbm9kZTogSFYgbm9kZSBpZAorICogQGNwdTogSFYgdGhyZWFkIGlkCisgKiBAYm1wOiBhbiBIViBibXAgc3RydWN0dXJlCisgKi8KKworc3RydWN0IHByaXZhdGUgeworCXVuc2lnbmVkIGxvbmcgbm9kZTsKKwl1bnNpZ25lZCBpbnQgY3B1OworCXN0cnVjdCBibXAgYm1wOworfTsKKworI2lmIGRlZmluZWQoREVCVUcpCitzdGF0aWMgdm9pZCBfZHVtcF82NF9ibXAoY29uc3QgY2hhciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nICpwLCB1bnNpZ25lZCBjcHUsCisJY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCit7CisJcHJfZGVidWcoIiVzOiVkOiAlcyAldSB7JTA0bHhfJTA0bHhfJTA0bHhfJTA0bHh9XG4iLAorCQlmdW5jLCBsaW5lLCBoZWFkZXIsIGNwdSwKKwkJKnAgPj4gNDgsICgqcCA+PiAzMikgJiAweGZmZmYsICgqcCA+PiAxNikgJiAweGZmZmYsCisJCSpwICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wXzI1Nl9ibXAoY29uc3QgY2hhciAqaGVhZGVyLAorCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnAsIHVuc2lnbmVkIGNwdSwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCit7CisJcHJfZGVidWcoIiVzOiVkOiAlcyAldSB7JTAxNmx4OiUwMTZseDolMDE2bHg6JTAxNmx4fVxuIiwKKwkJZnVuYywgbGluZSwgaGVhZGVyLCBjcHUsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10pOworfQorCisjZGVmaW5lIGR1bXBfYm1wKF94KSBfZHVtcF9ibXAoX3gsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kdW1wX2JtcChzdHJ1Y3QgcHJpdmF0ZSogcGQsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7CisJX2R1bXBfNjRfYm1wKCJzdGF0IiwgJnBkLT5ibXAuc3RhdHVzLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKKwlfZHVtcF82NF9ibXAoIm1hc2siLCAmcGQtPmJtcC5tYXNrLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKK30KKworI2RlZmluZSBkdW1wX21hc2soX3gpIF9kdW1wX21hc2soX3gsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBfZHVtcF9tYXNrKHN0cnVjdCBwcml2YXRlKiBwZCwKKwljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT5jcHUsIGZ1bmMsIGxpbmUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGR1bXBfYm1wKHN0cnVjdCBwcml2YXRlKiBwZCkge307CisjZW5kaWYgLyogZGVmaW5lZChERUJVRykgKi8KKworc3RhdGljIHZvaWQgY2hpcF9tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGNwdSAldSwgdmlycSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBwZC0+Y3B1LCB2aXJxKTsKKworCUJVR19PTih2aXJxIDwgTlVNX0lTQV9JTlRFUlJVUFRTKTsKKwlCVUdfT04odmlycSA+IFBTM19QTFVHX01BWCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7CisJcGQtPmJtcC5tYXNrICY9IH4oMHg4MDAwMDAwMDAwMDAwMDAwVUwgPj4gdmlycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7CisKKwlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+bm9kZSwgcGQtPmNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoaXBfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGNwdSAldSwgdmlycSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBwZC0+Y3B1LCB2aXJxKTsKKworCUJVR19PTih2aXJxIDwgTlVNX0lTQV9JTlRFUlJVUFRTKTsKKwlCVUdfT04odmlycSA+IFBTM19QTFVHX01BWCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7CisJcGQtPmJtcC5tYXNrIHw9ICgweDgwMDAwMDAwMDAwMDAwMDBVTCA+PiB2aXJxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKKworCWx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKHBkLT5ub2RlLCBwZC0+Y3B1KTsKK30KKworc3RhdGljIHZvaWQgY2hpcF9lb2kodW5zaWduZWQgaW50IHZpcnEpCit7CisJbHYxX2VuZF9vZl9pbnRlcnJ1cHQodmlycSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXJxX2NoaXAgPSB7CisJLnR5cGVuYW1lID0gInBzMyIsCisJLm1hc2sgPSBjaGlwX21hc2ssCisJLnVubWFzayA9IGNoaXBfdW5tYXNrLAorCS5lb2kgPSBjaGlwX2VvaSwKK307CisKK3N0YXRpYyB2b2lkIGhvc3RfdW5tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgcmVzdWx0OworCisJcHJfZGVidWcoIiVzOiVkOiB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHZpcnEpOworCisJbHYxX2Rpc2Nvbm5lY3RfaXJxX3BsdWcodmlycSk7CisKKwlyZXN1bHQgPSBzZXRfaXJxX2NoaXBfZGF0YSh2aXJxLCBOVUxMKTsKKwlCVUdfT04ocmVzdWx0KTsKK30KKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwcml2YXRlLCBwcml2YXRlKTsKKworc3RhdGljIGludCBob3N0X21hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxLAorCWlycV9od19udW1iZXJfdCBod2lycSkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGludCBjcHU7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXByX2RlYnVnKCIlczolZDogaHdpcnEgJWx1ID0+IHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaHdpcnEsCisJCXZpcnEpOworCisJLyogYmluZCB0aGlzIHZpcnEgdG8gYSBjcHUgKi8KKworCXByZWVtcHRfZGlzYWJsZSgpOworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlyZXN1bHQgPSBsdjFfY29ubmVjdF9pcnFfcGx1Zyh2aXJxLCBod2lycSk7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfaW5mbygiJXM6JWQ6IGx2MV9jb25uZWN0X2lycV9wbHVnIGZhaWxlZDoiCisJCQkiICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmVzdWx0ID0gc2V0X2lycV9jaGlwX2RhdGEodmlycSwgJnBlcl9jcHUocHJpdmF0ZSwgY3B1KSk7CisJQlVHX09OKHJlc3VsdCk7CisKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmlycV9jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGlycV9ob3N0X29wcyBob3N0X29wcyA9IHsKKwkubWFwID0gaG9zdF9tYXAsCisJLnVubWFwID0gaG9zdF91bm1hcCwKK307CisKK3ZvaWQgX19pbml0IHBzM19yZWdpc3Rlcl9pcGlfZGVidWdfYnJrKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCB2aXJxKQoreworCXN0cnVjdCBwcml2YXRlICpwZCA9ICZwZXJfY3B1KHByaXZhdGUsIGNwdSk7CisKKwlwZC0+Ym1wLmlwaV9kZWJ1Z19icmtfbWFzayA9IDB4ODAwMDAwMDAwMDAwMDAwMFVMID4+IHZpcnE7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGNwdSAldSwgdmlycSAldSwgbWFzayAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWNwdSwgdmlycSwgcGQtPmJtcC5pcGlfZGVidWdfYnJrX21hc2spOworfQorCitzdGF0aWMgaW50IGJtcF9nZXRfYW5kX2NsZWFyX3N0YXR1c19iaXQoc3RydWN0IGJtcCAqbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBiaXQ7CisJdW5zaWduZWQgbG9uZyB4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm0tPmxvY2ssIGZsYWdzKTsKKworCS8qIGNoZWNrIGZvciBpcGkgYnJlYWsgZmlyc3QgdG8gc3RvcCB0aGlzIGNwdSBBU0FQICovCisKKwlpZiAobS0+c3RhdHVzICYgbS0+aXBpX2RlYnVnX2Jya19tYXNrKSB7CisJCW0tPnN0YXR1cyAmPSB+bS0+aXBpX2RlYnVnX2Jya19tYXNrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBfX2lsb2cyKG0tPmlwaV9kZWJ1Z19icmtfbWFzayk7CisJfQorCisJeCA9IChtLT5zdGF0dXMgJiBtLT5tYXNrKTsKKworCWZvciAoYml0ID0gTlVNX0lTQV9JTlRFUlJVUFRTLCB4IDw8PSBiaXQ7IHg7IGJpdCsrLCB4IDw8PSAxKQorCQlpZiAoeCAmIDB4ODAwMDAwMDAwMDAwMDAwMFVMKSB7CisJCQltLT5zdGF0dXMgJj0gfigweDgwMDAwMDAwMDAwMDAwMDBVTCA+PiBiaXQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIGJpdDsKKwkJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIiVzOiVkOiBub3QgZm91bmRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIC0xOworfQorCit1bnNpZ25lZCBpbnQgcHMzX2dldF9pcnEodm9pZCkKK3sKKwlpbnQgcGx1ZzsKKworCXN0cnVjdCBwcml2YXRlICpwZCA9ICZfX2dldF9jcHVfdmFyKHByaXZhdGUpOworCisJcGx1ZyA9IGJtcF9nZXRfYW5kX2NsZWFyX3N0YXR1c19iaXQoJnBkLT5ibXApOworCisJaWYgKHBsdWcgPCAxKSB7CisJCXByX2RlYnVnKCIlczolZDogbm8gcGx1ZyBmb3VuZDogY3B1ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlwZC0+Y3B1KTsKKwkJZHVtcF9ibXAoJnBlcl9jcHUocHJpdmF0ZSwgMCkpOworCQlkdW1wX2JtcCgmcGVyX2NwdShwcml2YXRlLCAxKSk7CisJCXJldHVybiBOT19JUlE7CisJfQorCisjaWYgZGVmaW5lZChERUJVRykKKwlpZiAocGx1ZyA8IE5VTV9JU0FfSU5URVJSVVBUUyB8fCBwbHVnID4gUFMzX1BMVUdfTUFYKSB7CisJCWR1bXBfYm1wKCZwZXJfY3B1KHByaXZhdGUsIDApKTsKKwkJZHVtcF9ibXAoJnBlcl9jcHUocHJpdmF0ZSwgMSkpOworCQlCVUcoKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcGx1ZzsKK30KKwordm9pZCBfX2luaXQgcHMzX2luaXRfSVJRKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIG5vZGU7CisJdW5zaWduZWQgY3B1OworCXN0cnVjdCBpcnFfaG9zdCAqaG9zdDsKKworCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJm5vZGUpOworCisJaG9zdCA9IGlycV9hbGxvY19ob3N0KElSUV9IT1NUX01BUF9OT01BUCwgMCwgJmhvc3Rfb3BzLAorCQlQUzNfSU5WQUxJRF9PVVRMRVQpOworCWlycV9zZXRfZGVmYXVsdF9ob3N0KGhvc3QpOworCWlycV9zZXRfdmlycV9jb3VudChQUzNfUExVR19NQVggKyAxKTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3RydWN0IHByaXZhdGUgKnBkID0gJnBlcl9jcHUocHJpdmF0ZSwgY3B1KTsKKworCQlwZC0+bm9kZSA9IG5vZGU7CisJCXBkLT5jcHUgPSBjcHU7CisJCXNwaW5fbG9ja19pbml0KCZwZC0+Ym1wLmxvY2spOworCisJCXJlc3VsdCA9IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChub2RlLCBjcHUsCisJCQlwczNfbW1fcGh5c190b19scGFyKF9fcGEoJnBkLT5ibXAuc3RhdHVzKSkpOworCisJCWlmIChyZXN1bHQpCisJCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCBmYWlsZWQ6IgorCQkJCSIgJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQlwczNfcmVzdWx0KHJlc3VsdCkpOworCX0KKworCXBwY19tZC5nZXRfaXJxID0gcHMzX2dldF9pcnE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWMwZDAxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwpAQCAtMCwwICsxLDgzMSBAQAorLyoKKyAqICBQUzMgYWRkcmVzcyBzcGFjZSBtYW5hZ2VtZW50LgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9ob3RwbHVnLmg+CisKKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbG1iLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vcHMzLmg+CisjaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKyNpZiBkZWZpbmVkKERFQlVHKQorI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2VuZGlmCisKK2VudW0geworI2lmIGRlZmluZWQoQ09ORklHX1BTM19VU0VfTFBBUl9BRERSKQorCVVTRV9MUEFSX0FERFIgPSAxLAorI2Vsc2UKKwlVU0VfTFBBUl9BRERSID0gMCwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1BTM19EWU5BTUlDX0RNQSkKKwlVU0VfRFlOQU1JQ19ETUEgPSAxLAorI2Vsc2UKKwlVU0VfRFlOQU1JQ19ETUEgPSAwLAorI2VuZGlmCit9OworCitlbnVtIHsKKwlQQUdFX1NISUZUXzRLID0gMTJVLAorCVBBR0VfU0hJRlRfNjRLID0gMTZVLAorCVBBR0VfU0hJRlRfMTZNID0gMjRVLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFrZV9wYWdlX3NpemVzKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQoreworCXJldHVybiAoYSA8PCA1NikgfCAoYiA8PCA0OCk7Cit9CisKK2VudW0geworCUFMTE9DQVRFX01FTU9SWV9UUllfQUxUX1VOSVQgPSAwWDA0LAorCUFMTE9DQVRFX01FTU9SWV9BRERSX1pFUk8gPSAwWDA4LAorfTsKKworLyogdmFsaWQgaHRhYiBzaXplcyBhcmUgezE4LDE5LDIwfSA9IDI1NkssIDUxMkssIDFNICovCisKK2VudW0geworCUhUQUJfU0laRV9NQVggPSAyMFUsIC8qIEhWIGxpbWl0IG9mIDFNQiAqLworCUhUQUJfU0laRV9NSU4gPSAxOFUsIC8qIENQVSBsaW1pdCBvZiAyNTZLQiAqLworfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyAqIHN0cnVjdCBtZW1fcmVnaW9uIC0gbWVtb3J5IHJlZ2lvbiBzdHJ1Y3R1cmUKKyAqIEBiYXNlOiBiYXNlIGFkZHJlc3MKKyAqIEBzaXplOiBzaXplIGluIGJ5dGVzCisgKiBAb2Zmc2V0OiBkaWZmZXJlbmNlIGJldHdlZW4gYmFzZSBhbmQgcm0uc2l6ZQorICovCisKK3N0cnVjdCBtZW1fcmVnaW9uIHsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgbWFwIC0gYWRkcmVzcyBzcGFjZSBzdGF0ZSB2YXJpYWJsZXMgaG9sZGVyCisgKiBAdG90YWw6IHRvdGFsIG1lbW9yeSBhdmFpbGFibGUgYXMgcmVwb3J0ZWQgYnkgSFYKKyAqIEB2YXNfaWQgLSBIViB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgaWQKKyAqIEBodGFiX3NpemU6IGh0YWIgc2l6ZSBpbiBieXRlcworICoKKyAqIFRoZSBIViB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKHZhcykgYWxsb3dzIGZvciBob3RwbHVnIG1lbW9yeSByZWdpb25zLgorICogTWVtb3J5IHJlZ2lvbnMgY2FuIGJlIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBpbiB0aGUgdmFzIGF0IHJ1bnRpbWUuCisgKiBAcm06IHJlYWwgbW9kZSAoYm9vdG1lbSkgcmVnaW9uCisgKiBAcjE6IGhvdHBsdWcgbWVtb3J5IHJlZ2lvbihzKQorICoKKyAqIHBzMyBhZGRyZXNzZXMKKyAqIHZpcnRfYWRkcjogYSBjcHUgJ3RyYW5zbGF0ZWQnIGVmZmVjdGl2ZSBhZGRyZXNzCisgKiBwaHlzX2FkZHI6IGFuIGFkZHJlc3MgaW4gd2hhdCBMaW51eCB0aGlua3MgaXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKKyAqIGxwYXJfYWRkcjogYW4gYWRkcmVzcyBpbiB0aGUgSFYgdmlydHVhbCBhZGRyZXNzIHNwYWNlCisgKiBidXNfYWRkcjogYW4gaW8gY29udHJvbGxlciAndHJhbnNsYXRlZCcgYWRkcmVzcyBvbiBhIGRldmljZSBidXMKKyAqLworCitzdHJ1Y3QgbWFwIHsKKwl1bnNpZ25lZCBsb25nIHRvdGFsOworCXVuc2lnbmVkIGxvbmcgdmFzX2lkOworCXVuc2lnbmVkIGxvbmcgaHRhYl9zaXplOworCXN0cnVjdCBtZW1fcmVnaW9uIHJtOworCXN0cnVjdCBtZW1fcmVnaW9uIHIxOworfTsKKworI2RlZmluZSBkZWJ1Z19kdW1wX21hcCh4KSBfZGVidWdfZHVtcF9tYXAoeCwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2RlYnVnX2R1bXBfbWFwKGNvbnN0IHN0cnVjdCBtYXAqIG0sIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCURCRygiJXM6JWQ6IG1hcC50b3RhbCAgICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT50b3RhbCk7CisJREJHKCIlczolZDogbWFwLnJtLnNpemUgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnJtLnNpemUpOworCURCRygiJXM6JWQ6IG1hcC52YXNfaWQgICAgPSAlbHVcbiIsIGZ1bmMsIGxpbmUsIG0tPnZhc19pZCk7CisJREJHKCIlczolZDogbWFwLmh0YWJfc2l6ZSA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPmh0YWJfc2l6ZSk7CisJREJHKCIlczolZDogbWFwLnIxLmJhc2UgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnIxLmJhc2UpOworCURCRygiJXM6JWQ6IG1hcC5yMS5vZmZzZXQgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT5yMS5vZmZzZXQpOworCURCRygiJXM6JWQ6IG1hcC5yMS5zaXplICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT5yMS5zaXplKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXAgbWFwOworCisvKioKKyAqIHBzM19tbV9waHlzX3RvX2xwYXIgLSB0cmFuc2xhdGUgYSBsaW51eCBwaHlzaWNhbCBhZGRyZXNzIHRvIGxwYXIgYWRkcmVzcworICogQHBoeXNfYWRkcjogbGludXggcGh5c2ljYWwgYWRkcmVzcworICovCisKK3Vuc2lnbmVkIGxvbmcgcHMzX21tX3BoeXNfdG9fbHBhcih1bnNpZ25lZCBsb25nIHBoeXNfYWRkcikKK3sKKwlCVUdfT04oaXNfa2VybmVsX2FkZHIocGh5c19hZGRyKSk7CisJaWYgKFVTRV9MUEFSX0FERFIpCisJCXJldHVybiBwaHlzX2FkZHI7CisJZWxzZQorCQlyZXR1cm4gKHBoeXNfYWRkciA8IG1hcC5ybS5zaXplIHx8IHBoeXNfYWRkciA+PSBtYXAudG90YWwpCisJCQk/IHBoeXNfYWRkciA6IHBoeXNfYWRkciArIG1hcC5yMS5vZmZzZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0wocHMzX21tX3BoeXNfdG9fbHBhcik7CisKKy8qKgorICogcHMzX21tX3Zhc19jcmVhdGUgLSBjcmVhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZQorICovCisKK3ZvaWQgX19pbml0IHBzM19tbV92YXNfY3JlYXRlKHVuc2lnbmVkIGxvbmcqIGh0YWJfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBhY2Nlc3NfcmlnaHQ7CisJdW5zaWduZWQgbG9uZyBtYXhfcGFnZV9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZXN1bHQgPSBsdjFfcXVlcnlfbG9naWNhbF9wYXJ0aXRpb25fYWRkcmVzc19yZWdpb25faW5mbygwLAorCQkmc3RhcnRfYWRkcmVzcywgJnNpemUsICZhY2Nlc3NfcmlnaHQsICZtYXhfcGFnZV9zaXplLAorCQkmZmxhZ3MpOworCisJaWYgKHJlc3VsdCkgeworCQlEQkcoIiVzOiVkOiBsdjFfcXVlcnlfbG9naWNhbF9wYXJ0aXRpb25fYWRkcmVzc19yZWdpb25faW5mbyAiCisJCQkiZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChtYXhfcGFnZV9zaXplIDwgUEFHRV9TSElGVF8xNk0pIHsKKwkJREJHKCIlczolZDogYmFkIG1heF9wYWdlX3NpemUgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJbWF4X3BhZ2Vfc2l6ZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlCVUlMRF9CVUdfT04oQ09ORklHX1BTM19IVEFCX1NJWkUgPiBIVEFCX1NJWkVfTUFYKTsKKwlCVUlMRF9CVUdfT04oQ09ORklHX1BTM19IVEFCX1NJWkUgPCBIVEFCX1NJWkVfTUlOKTsKKworCXJlc3VsdCA9IGx2MV9jb25zdHJ1Y3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlKENPTkZJR19QUzNfSFRBQl9TSVpFLAorCQkJMiwgbWFrZV9wYWdlX3NpemVzKFBBR0VfU0hJRlRfMTZNLCBQQUdFX1NISUZUXzY0SyksCisJCQkmbWFwLnZhc19pZCwgJm1hcC5odGFiX3NpemUpOworCisJaWYgKHJlc3VsdCkgeworCQlEQkcoIiVzOiVkOiBsdjFfY29uc3RydWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZSBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmVzdWx0ID0gbHYxX3NlbGVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UobWFwLnZhc19pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCURCRygiJXM6JWQ6IGx2MV9zZWxlY3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkqaHRhYl9zaXplID0gbWFwLmh0YWJfc2l6ZTsKKworCWRlYnVnX2R1bXBfbWFwKCZtYXApOworCisJcmV0dXJuOworCitmYWlsOgorCXBhbmljKCJwczNfbW1fdmFzX2NyZWF0ZSBmYWlsZWQiKTsKK30KKworLyoqCisgKiBwczNfbW1fdmFzX2Rlc3Ryb3kgLQorICovCisKK3ZvaWQgcHMzX21tX3Zhc19kZXN0cm95KHZvaWQpCit7CisJaWYgKG1hcC52YXNfaWQpIHsKKwkJbHYxX3NlbGVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UoMCk7CisJCWx2MV9kZXN0cnVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UobWFwLnZhc19pZCk7CisJCW1hcC52YXNfaWQgPSAwOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIG1lbW9yeSBob3RwbHVnIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyAqIHBzM19tbV9yZWdpb25fY3JlYXRlIC0gY3JlYXRlIGEgbWVtb3J5IHJlZ2lvbiBpbiB0aGUgdmFzCisgKiBAcjogcG9pbnRlciB0byBhIHN0cnVjdCBtZW1fcmVnaW9uIHRvIGFjY2VwdCBpbml0aWFsaXplZCB2YWx1ZXMKKyAqIEBzaXplOiByZXF1ZXN0ZWQgcmVnaW9uIHNpemUKKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgdGhlIHJlZ2lvbiB3aXRoIHRoZSB2YXMgbGFyZ2UgcGFnZSBzaXplLgorICogQHNpemUgaXMgcm91bmRlZCBkb3duIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHZhcyBsYXJnZSBwYWdlIHNpemUuCisgKi8KKworaW50IHBzM19tbV9yZWdpb25fY3JlYXRlKHN0cnVjdCBtZW1fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIG11aWQ7CisKKwlyLT5zaXplID0gX0FMSUdOX0RPV04oc2l6ZSwgMSA8PCBQQUdFX1NISUZUXzE2TSk7CisKKwlEQkcoIiVzOiVkIHJlcXVlc3RlZCAgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBzaXplKTsKKwlEQkcoIiVzOiVkIGFjdHVhbCAgICAgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByLT5zaXplKTsKKwlEQkcoIiVzOiVkIGRpZmZlcmVuY2UgJWx4aCAoJWx1TUIpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCSh1bnNpZ25lZCBsb25nKShzaXplIC0gci0+c2l6ZSksCisJCShzaXplIC0gci0+c2l6ZSkgLyAxMDI0IC8gMTAyNCk7CisKKwlpZiAoci0+c2l6ZSA9PSAwKSB7CisJCURCRygiJXM6JWQ6IHNpemUgPT0gMFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmVzdWx0ID0gLTE7CisJCWdvdG8gemVyb19yZWdpb247CisJfQorCisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX21lbW9yeShyLT5zaXplLCBQQUdFX1NISUZUXzE2TSwgMCwKKwkJQUxMT0NBVEVfTUVNT1JZX1RSWV9BTFRfVU5JVCwgJnItPmJhc2UsICZtdWlkKTsKKworCWlmIChyZXN1bHQgfHwgci0+YmFzZSA8IG1hcC5ybS5zaXplKSB7CisJCURCRygiJXM6JWQ6IGx2MV9hbGxvY2F0ZV9tZW1vcnkgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJZ290byB6ZXJvX3JlZ2lvbjsKKwl9CisKKwlyLT5vZmZzZXQgPSByLT5iYXNlIC0gbWFwLnJtLnNpemU7CisJcmV0dXJuIHJlc3VsdDsKKworemVyb19yZWdpb246CisJci0+c2l6ZSA9IHItPmJhc2UgPSByLT5vZmZzZXQgPSAwOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX21tX3JlZ2lvbl9kZXN0cm95IC0gZGVzdHJveSBhIG1lbW9yeSByZWdpb24KKyAqIEByOiBwb2ludGVyIHRvIHN0cnVjdCBtZW1fcmVnaW9uCisgKi8KKwordm9pZCBwczNfbW1fcmVnaW9uX2Rlc3Ryb3koc3RydWN0IG1lbV9yZWdpb24gKnIpCit7CisJaWYgKHItPmJhc2UpIHsKKwkJbHYxX3JlbGVhc2VfbWVtb3J5KHItPmJhc2UpOworCQlyLT5zaXplID0gci0+YmFzZSA9IHItPm9mZnNldCA9IDA7CisJCW1hcC50b3RhbCA9IG1hcC5ybS5zaXplOworCX0KK30KKworLyoqCisgKiBwczNfbW1fYWRkX21lbW9yeSAtIGhvdCBhZGQgbWVtb3J5CisgKi8KKworc3RhdGljIGludCBfX2luaXQgcHMzX21tX2FkZF9tZW1vcnkodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQorCQlyZXR1cm4gMDsKKworCUJVR19PTighbWVtX2luaXRfZG9uZSk7CisKKwlzdGFydF9hZGRyID0gVVNFX0xQQVJfQUREUiA/IG1hcC5yMS5iYXNlIDogbWFwLnJtLnNpemU7CisJc3RhcnRfcGZuID0gc3RhcnRfYWRkciA+PiBQQUdFX1NISUZUOworCW5yX3BhZ2VzID0gKG1hcC5yMS5zaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKworCURCRygiJXM6JWQ6IHN0YXJ0X2FkZHIgJWx4aCwgc3RhcnRfcGZuICVseGgsIG5yX3BhZ2VzICVseGhcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgc3RhcnRfYWRkciwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisKKwlyZXN1bHQgPSBhZGRfbWVtb3J5KDAsIHN0YXJ0X2FkZHIsIG1hcC5yMS5zaXplKTsKKworCWlmIChyZXN1bHQpIHsKKwkJREJHKCIlczolZDogYWRkX21lbW9yeSBmYWlsZWQ6ICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmVzdWx0ID0gb25saW5lX3BhZ2VzKHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCisJaWYgKHJlc3VsdCkKKwkJREJHKCIlczolZDogb25saW5lX3BhZ2VzIGZhaWxlZDogKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2NvcmVfaW5pdGNhbGwocHMzX21tX2FkZF9tZW1vcnkpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogZG1hIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorICogZG1hX2xwYXJfdG9fYnVzIC0gVHJhbnNsYXRlIGFuIGxwYXIgYWRkcmVzcyB0byBpb2MgbWFwcGVkIGJ1cyBhZGRyZXNzLgorICogQHI6IHBvaW50ZXIgdG8gZG1hIHJlZ2lvbiBzdHJ1Y3R1cmUKKyAqIEBscGFyX2FkZHI6IEhWIGxwYXIgYWRkcmVzcworICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9scGFyX3RvX2J1cyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyBscGFyX2FkZHIpCit7CisJQlVHX09OKGxwYXJfYWRkciA+PSBtYXAucjEuYmFzZSArIG1hcC5yMS5zaXplKTsKKwlyZXR1cm4gci0+YnVzX2FkZHIgKyAobHBhcl9hZGRyIDw9IG1hcC5ybS5zaXplID8gbHBhcl9hZGRyCisJCTogbHBhcl9hZGRyIC0gbWFwLnIxLm9mZnNldCk7Cit9CisKKyNkZWZpbmUgZG1hX2R1bXBfcmVnaW9uKF9hKSBfZG1hX2R1bXBfcmVnaW9uKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfZG1hX2R1bXBfcmVnaW9uKGNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgY29uc3QgY2hhciogZnVuYywKKwlpbnQgbGluZSkKK3sKKwlEQkcoIiVzOiVkOiBkZXYgICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLCByLT5kaWQuYnVzX2lkLAorCQlyLT5kaWQuZGV2X2lkKTsKKwlEQkcoIiVzOiVkOiBwYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCByLT5wYWdlX3NpemUpOworCURCRygiJXM6JWQ6IGJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+YnVzX2FkZHIpOworCURCRygiJXM6JWQ6IGxlbiAgICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bGVuKTsKK30KKworLyoqCisgKiBkbWFfY2h1bmsgLSBBIGNodW5rIG9mIGRtYSBwYWdlcyBtYXBwZWQgYnkgdGhlIGlvIGNvbnRyb2xsZXIuCisgKiBAcmVnaW9uIC0gVGhlIGRtYSByZWdpb24gdGhhdCBvd25zIHRoaXMgY2h1bmsuCisgKiBAbHBhcl9hZGRyOiBTdGFydGluZyBscGFyIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgorICogQGJ1c19hZGRyOiBTdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgorICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIG1hcC4KKyAqIEBsaW5rOiBBIHN0cnVjdCBsaXN0X2hlYWQgdXNlZCB3aXRoIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi5jaHVua19saXN0LCB0aGUKKyAqIGxpc3Qgb2YgYWxsIGNodW5ja3Mgb3duZWQgYnkgdGhlIHJlZ2lvbi4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSB2ZXJ5IHNpbXBsZSBkbWEgcGFnZSBtYW5hZ2VyCisgKiBiYXNlZCBvbiB0aGUgZG1hX2NodW5rIHN0cnVjdHVyZS4gIFRoaXMgc2NoZW1lIGFzc3VtZXMKKyAqIHRoYXQgYWxsIGRyaXZlcnMgdXNlIHZlcnkgd2VsbCBiZWhhdmVkIGRtYSBvcHMuCisgKi8KKworc3RydWN0IGRtYV9jaHVuayB7CisJc3RydWN0IHBzM19kbWFfcmVnaW9uICpyZWdpb247CisJdW5zaWduZWQgbG9uZyBscGFyX2FkZHI7CisJdW5zaWduZWQgbG9uZyBidXNfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJdW5zaWduZWQgaW50IHVzYWdlX2NvdW50OworfTsKKworI2RlZmluZSBkbWFfZHVtcF9jaHVuayhfYSkgX2RtYV9kdW1wX2NodW5rKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfZG1hX2R1bXBfY2h1bmsgKGNvbnN0IHN0cnVjdCBkbWFfY2h1bmsqIGMsIGNvbnN0IGNoYXIqIGZ1bmMsCisJaW50IGxpbmUpCit7CisJREJHKCIlczolZDogci5kZXYgICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLAorCQljLT5yZWdpb24tPmRpZC5idXNfaWQsIGMtPnJlZ2lvbi0+ZGlkLmRldl9pZCk7CisJREJHKCIlczolZDogci5idXNfYWRkciAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+YnVzX2FkZHIpOworCURCRygiJXM6JWQ6IHIucGFnZV9zaXplICAldVxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5wYWdlX3NpemUpOworCURCRygiJXM6JWQ6IHIubGVuICAgICAgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5yZWdpb24tPmxlbik7CisJREJHKCIlczolZDogYy5scGFyX2FkZHIgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPmxwYXJfYWRkcik7CisJREJHKCIlczolZDogYy5idXNfYWRkciAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPmJ1c19hZGRyKTsKKwlEQkcoIiVzOiVkOiBjLmxlbiAgICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+bGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfY2h1bmsgKiBkbWFfZmluZF9jaHVuayhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGRtYV9jaHVuayAqYzsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiwgMSA8PCByLT5wYWdlX3NpemUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CisJCS8qIGludGVyc2VjdGlvbiAqLworCQlpZiAoYWxpZ25lZF9idXMgPj0gYy0+YnVzX2FkZHIKKwkJCSYmIGFsaWduZWRfYnVzIDwgYy0+YnVzX2FkZHIgKyBjLT5sZW4KKwkJCSYmIGFsaWduZWRfYnVzICsgYWxpZ25lZF9sZW4gPD0gYy0+YnVzX2FkZHIgKyBjLT5sZW4pIHsKKwkJCXJldHVybiBjOworCQl9CisJCS8qIGJlbG93ICovCisJCWlmIChhbGlnbmVkX2J1cyArIGFsaWduZWRfbGVuIDw9IGMtPmJ1c19hZGRyKSB7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBhYm92ZSAqLworCQlpZiAoYWxpZ25lZF9idXMgPj0gYy0+YnVzX2FkZHIgKyBjLT5sZW4pIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogd2UgZG9uJ3QgaGFuZGxlIHRoZSBtdWx0aS1jaHVuayBjYXNlIGZvciBub3cgKi8KKworCQlkbWFfZHVtcF9jaHVuayhjKTsKKwkJQlVHKCk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGRtYV9mcmVlX2NodW5rKHN0cnVjdCBkbWFfY2h1bmsgKmMpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoYy0+YnVzX2FkZHIpIHsKKwkJcmVzdWx0ID0gbHYxX3VubWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwKKwkJCWMtPnJlZ2lvbi0+ZGlkLmRldl9pZCwgYy0+YnVzX2FkZHIsIGMtPmxlbik7CisJCUJVR19PTihyZXN1bHQpOworCX0KKworCWtmcmVlKGMpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZG1hX21hcF9wYWdlcyAtIE1hcHMgZG1hIHBhZ2VzIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYnVzIGFkZHJlc3Mgc3BhY2UuCisgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KKyAqIEBwaHlzX2FkZHI6IFN0YXJ0aW5nIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgorICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIG1hcC4KKyAqIGNfb3V0OiBBIHBvaW50ZXIgdG8gcmVjZWl2ZSBhbiBhbGxvY2F0ZWQgc3RydWN0IGRtYV9jaHVuayBmb3IgdGhpcyBhcmVhLgorICoKKyAqIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCBkbWEgbWFwcGluZyByb3V0aW5lLCBhbmQgaXMgdGhlIG9uZSB0aGF0IHdpbGwKKyAqIG1ha2UgdGhlIEhWIGNhbGwgdG8gYWRkIHRoZSBwYWdlcyBpbnRvIHRoZSBpbyBjb250cm9sbGVyIGFkZHJlc3Mgc3BhY2UuCisgKi8KKworc3RhdGljIGludCBkbWFfbWFwX3BhZ2VzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBkbWFfY2h1bmsgKipjX291dCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisKKwljID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRtYV9jaHVuayksIEdGUF9BVE9NSUMpOworCisJaWYgKCFjKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisKKwljLT5yZWdpb24gPSByOworCWMtPmxwYXJfYWRkciA9IHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKTsKKwljLT5idXNfYWRkciA9IGRtYV9scGFyX3RvX2J1cyhyLCBjLT5scGFyX2FkZHIpOworCWMtPmxlbiA9IGxlbjsKKworCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24oYy0+cmVnaW9uLT5kaWQuYnVzX2lkLAorCQljLT5yZWdpb24tPmRpZC5kZXZfaWQsIGMtPmxwYXJfYWRkciwgYy0+YnVzX2FkZHIsIGMtPmxlbiwKKwkJMHhmODAwMDAwMDAwMDAwMDAwVUwpOworCisJaWYgKHJlc3VsdCkgeworCQlEQkcoIiVzOiVkOiBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCWdvdG8gZmFpbF9tYXA7CisJfQorCisJbGlzdF9hZGQoJmMtPmxpbmssICZyLT5jaHVua19saXN0LmhlYWQpOworCisJKmNfb3V0ID0gYzsKKwlyZXR1cm4gMDsKKworZmFpbF9tYXA6CisJa2ZyZWUoYyk7CitmYWlsX2FsbG9jOgorCSpjX291dCA9IE5VTEw7CisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBkbWFfcmVnaW9uX2NyZWF0ZSAtIENyZWF0ZSBhIGRldmljZSBkbWEgcmVnaW9uLgorICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCisgKgorICogVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIGRtYSByZWdpb24gY3JlYXRlIHJvdXRpbmUsIGFuZCBpcyB0aGUgb25lIHRoYXQKKyAqIHdpbGwgbWFrZSB0aGUgSFYgY2FsbCB0byBjcmVhdGUgdGhlIHJlZ2lvbi4KKyAqLworCitzdGF0aWMgaW50IGRtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiogcikKK3sKKwlpbnQgcmVzdWx0OworCisJci0+bGVuID0gX0FMSUdOX1VQKG1hcC50b3RhbCwgMSA8PCByLT5wYWdlX3NpemUpOworCUlOSVRfTElTVF9IRUFEKCZyLT5jaHVua19saXN0LmhlYWQpOworCXNwaW5fbG9ja19pbml0KCZyLT5jaHVua19saXN0LmxvY2spOworCisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJCXItPmxlbiwgci0+cGFnZV9zaXplLCByLT5yZWdpb25fdHlwZSwgJnItPmJ1c19hZGRyKTsKKworCWRtYV9kdW1wX3JlZ2lvbihyKTsKKworCWlmIChyZXN1bHQpIHsKKwkJREJHKCIlczolZDogbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXItPmxlbiA9IHItPmJ1c19hZGRyID0gMDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGRtYV9yZWdpb25fZnJlZSAtIEZyZWUgYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgorICoKKyAqIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCBkbWEgcmVnaW9uIGZyZWUgcm91dGluZSwgYW5kIGlzIHRoZSBvbmUgdGhhdAorICogd2lsbCBtYWtlIHRoZSBIViBjYWxsIHRvIGZyZWUgdGhlIHJlZ2lvbi4KKyAqLworCitzdGF0aWMgaW50IGRtYV9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24qIHIpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjOworCXN0cnVjdCBkbWFfY2h1bmsgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfZnJlZV9jaHVuayhjKTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAorCQlyLT5idXNfYWRkcik7CisKKwlpZiAocmVzdWx0KQorCQlEQkcoIiVzOiVkOiBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbiBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCisJci0+bGVuID0gci0+YnVzX2FkZHIgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBkbWFfbWFwX2FyZWEgLSBNYXAgYW4gYXJlYSBvZiBtZW1vcnkgaW50byBhIGRldmljZSBkbWEgcmVnaW9uLgorICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCisgKiBAdmlydF9hZGRyOiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgorICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIG1hcC4KKyAqIEBidXNfYWRkcjogQSBwb2ludGVyIHRvIHJldHVybiB0aGUgc3RhcnRpbmcgaW9jIGJ1cyBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvCisgKiBtYXAuCisgKgorICogVGhpcyBpcyB0aGUgY29tbW9uIGRtYSBtYXBwaW5nIHJvdXRpbmUuCisgKi8KKworc3RhdGljIGludCBkbWFfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBpc19rZXJuZWxfYWRkcih2aXJ0X2FkZHIpID8gX19wYSh2aXJ0X2FkZHIpCisJCTogdmlydF9hZGRyOworCisJKmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CisKKwlpZiAoIVVTRV9EWU5BTUlDX0RNQSkgeworCQl1bnNpZ25lZCBsb25nIGxwYXJfYWRkciA9IHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKTsKKwkJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCURCRygiJXM6JWQgdmlydF9hZGRyICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXZpcnRfYWRkcik7CisJCURCRygiJXM6JWQgcGh5c19hZGRyICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXBoeXNfYWRkcik7CisJCURCRygiJXM6JWQgbHBhcl9hZGRyICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCWxwYXJfYWRkcik7CisJCURCRygiJXM6JWQgbGVuICAgICAgICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbGVuKTsKKwkJREJHKCIlczolZCBidXNfYWRkciAgJWx4aCAoJWx4aClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKmJ1c19hZGRyLCBsZW4pOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwljID0gZG1hX2ZpbmRfY2h1bmsociwgKmJ1c19hZGRyLCBsZW4pOworCisJaWYgKGMpIHsKKwkJYy0+dXNhZ2VfY291bnQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXJlc3VsdCA9IGRtYV9tYXBfcGFnZXMociwgX0FMSUdOX0RPV04ocGh5c19hZGRyLCAxIDw8IHItPnBhZ2Vfc2l6ZSksCisJCV9BTElHTl9VUChsZW4sIDEgPDwgci0+cGFnZV9zaXplKSwgJmMpOworCisJaWYgKHJlc3VsdCkgeworCQkqYnVzX2FkZHIgPSAwOworCQlEQkcoIiVzOiVkOiBkbWFfbWFwX3BhZ2VzIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwljLT51c2FnZV9jb3VudCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGRtYV91bm1hcF9hcmVhIC0gVW5tYXAgYW4gYXJlYSBvZiBtZW1vcnkgZnJvbSBhIGRldmljZSBkbWEgcmVnaW9uLgorICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCisgKiBAYnVzX2FkZHI6IFRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCisgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCisgKgorICogVGhpcyBpcyB0aGUgY29tbW9uIGRtYSB1bm1hcCByb3V0aW5lLgorICovCisKK2ludCBkbWFfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCisJdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCWMgPSBkbWFfZmluZF9jaHVuayhyLCBidXNfYWRkciwgbGVuKTsKKworCWlmICghYykgeworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsCisJCQkxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogYnVzX2FkZHIgJWx4aFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2FkZHIpOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGxlbiAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBsZW4pOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGFsaWduZWRfYnVzICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGFsaWduZWRfYnVzKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBhbGlnbmVkX2xlbiAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBhbGlnbmVkX2xlbik7CisJCUJVRygpOworCX0KKworCWMtPnVzYWdlX2NvdW50LS07CisKKwlpZiAoIWMtPnVzYWdlX2NvdW50KSB7CisJCWxpc3RfZGVsKCZjLT5saW5rKTsKKwkJZG1hX2ZyZWVfY2h1bmsoYyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyIC0gU2V0dXAgYSBsaW5lYXIgZG1hIG1hcGluZyBmb3IgYSBkZXZpY2UuCisgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhbiBIViBkbWEgcmVnaW9uIGZvciB0aGUgZGV2aWNlIGFuZCBtYXBzIGFsbCBhdmFpbGFibGUKKyAqIHJhbSBpbnRvIHRoZSBpbyBjb250cm9sbGVyIGJ1cyBhZGRyZXNzIHNwYWNlLgorICovCisKK3N0YXRpYyBpbnQgZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJLyogZm9yY2UgMTZNIGRtYSBwYWdlcyBmb3IgbGluZWFyIG1hcHBpbmcgKi8KKworCWlmIChyLT5wYWdlX3NpemUgIT0gUFMzX0RNQV8xNk0pIHsKKwkJcHJfaW5mbygiJXM6JWQ6IGZvcmNpbmcgMTZNIHBhZ2VzIGZvciBsaW5lYXIgbWFwXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJci0+cGFnZV9zaXplID0gUFMzX0RNQV8xNk07CisJfQorCisJcmVzdWx0ID0gZG1hX3JlZ2lvbl9jcmVhdGUocik7CisJQlVHX09OKHJlc3VsdCk7CisKKwlyZXN1bHQgPSBkbWFfbWFwX2FyZWEociwgbWFwLnJtLmJhc2UsIG1hcC5ybS5zaXplLCAmdG1wKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCWlmIChVU0VfTFBBUl9BRERSKQorCQlyZXN1bHQgPSBkbWFfbWFwX2FyZWEociwgbWFwLnIxLmJhc2UsIG1hcC5yMS5zaXplLAorCQkJJnRtcCk7CisJZWxzZQorCQlyZXN1bHQgPSBkbWFfbWFwX2FyZWEociwgbWFwLnJtLnNpemUsIG1hcC5yMS5zaXplLAorCQkJJnRtcCk7CisKKwlCVUdfT04ocmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZG1hX3JlZ2lvbl9mcmVlX2xpbmVhciAtIEZyZWUgYSBsaW5lYXIgZG1hIG1hcHBpbmcgZm9yIGEgZGV2aWNlLgorICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgdW5tYXAgYWxsIG1hcHBlZCBhcmVhcyBhbmQgZnJlZSB0aGUgSFYgZG1hIHJlZ2lvbi4KKyAqLworCitzdGF0aWMgaW50IGRtYV9yZWdpb25fZnJlZV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBkbWFfdW5tYXBfYXJlYShyLCBkbWFfbHBhcl90b19idXMociwgMCksIG1hcC5ybS5zaXplKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IGRtYV91bm1hcF9hcmVhKHIsIGRtYV9scGFyX3RvX2J1cyhyLCBtYXAucjEuYmFzZSksCisJCW1hcC5yMS5zaXplKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IGRtYV9yZWdpb25fZnJlZShyKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZG1hX21hcF9hcmVhX2xpbmVhciAtIE1hcCBhbiBhcmVhIG9mIG1lbW9yeSBpbnRvIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KKyAqIEB2aXJ0X2FkZHI6IFN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCisgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgorICogQGJ1c19hZGRyOiBBIHBvaW50ZXIgdG8gcmV0dXJuIHRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8KKyAqIG1hcC4KKyAqCisgKiBUaGlzIHJvdXRpbmUganVzdCByZXR1cm5zIHRoZSBjb3Jlc3BvbmRpbmcgYnVzIGFkZHJlc3MuICBBY3R1YWwgbWFwcGluZworICogb2NjdXJzIGluIGRtYV9yZWdpb25fY3JlYXRlX2xpbmVhcigpLgorICovCisKK3N0YXRpYyBpbnQgZG1hX21hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IGlzX2tlcm5lbF9hZGRyKHZpcnRfYWRkcikgPyBfX3BhKHZpcnRfYWRkcikKKwkJOiB2aXJ0X2FkZHI7CisJKmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZG1hX3VubWFwX2FyZWFfbGluZWFyIC0gVW5tYXAgYW4gYXJlYSBvZiBtZW1vcnkgZnJvbSBhIGRldmljZSBkbWEgcmVnaW9uLgorICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCisgKiBAYnVzX2FkZHI6IFRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCisgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCisgKgorICogVGhpcyByb3V0aW5lIGRvZXMgbm90aGluZy4gIFVubWFwcGluZyBvY2N1cnMgaW4gZG1hX3JlZ2lvbl9mcmVlX2xpbmVhcigpLgorICovCisKK3N0YXRpYyBpbnQgZG1hX3VubWFwX2FyZWFfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHBzM19kbWFfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCit7CisJcmV0dXJuIChVU0VfRFlOQU1JQ19ETUEpCisJCT8gZG1hX3JlZ2lvbl9jcmVhdGUocikKKwkJOiBkbWFfcmVnaW9uX2NyZWF0ZV9saW5lYXIocik7Cit9CisKK2ludCBwczNfZG1hX3JlZ2lvbl9mcmVlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3sKKwlyZXR1cm4gKFVTRV9EWU5BTUlDX0RNQSkKKwkJPyBkbWFfcmVnaW9uX2ZyZWUocikKKwkJOiBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyKHIpOworfQorCitpbnQgcHMzX2RtYV9tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIpCit7CisJcmV0dXJuIChVU0VfRFlOQU1JQ19ETUEpCisJCT8gZG1hX21hcF9hcmVhKHIsIHZpcnRfYWRkciwgbGVuLCBidXNfYWRkcikKKwkJOiBkbWFfbWFwX2FyZWFfbGluZWFyKHIsIHZpcnRfYWRkciwgbGVuLCBidXNfYWRkcik7Cit9CisKK2ludCBwczNfZG1hX3VubWFwKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlyZXR1cm4gKFVTRV9EWU5BTUlDX0RNQSkgPyBkbWFfdW5tYXBfYXJlYShyLCBidXNfYWRkciwgbGVuKQorCQk6IGRtYV91bm1hcF9hcmVhX2xpbmVhcihyLCBidXNfYWRkciwgbGVuKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIHN5c3RlbSBzdGFydHVwIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyAqIHBzM19tbV9pbml0IC0gaW5pdGlhbGl6ZSB0aGUgYWRkcmVzcyBzcGFjZSBzdGF0ZSB2YXJpYWJsZXMKKyAqLworCit2b2lkIF9faW5pdCBwczNfbW1faW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwlEQkcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfbW1faW5mbygmbWFwLnJtLmJhc2UsICZtYXAucm0uc2l6ZSwKKwkJJm1hcC50b3RhbCk7CisKKwlpZiAocmVzdWx0KQorCQlwYW5pYygicHMzX3JlcG9zaXRvcnlfcmVhZF9tbV9pbmZvKCkgZmFpbGVkIik7CisKKwltYXAucm0ub2Zmc2V0ID0gbWFwLnJtLmJhc2U7CisJbWFwLnZhc19pZCA9IG1hcC5odGFiX3NpemUgPSAwOworCisJLyogdGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIG1hcC5ybS5iYXNlIGlzIHplcm8gKi8KKworCUJVR19PTihtYXAucm0uYmFzZSk7CisJQlVHX09OKCFtYXAucm0uc2l6ZSk7CisKKwlsbWJfYWRkKG1hcC5ybS5iYXNlLCBtYXAucm0uc2l6ZSk7CisJbG1iX2FuYWx5emUoKTsKKworCS8qIGFycmFuZ2UgdG8gZG8gdGhpcyBpbiBwczNfbW1fYWRkX21lbW9yeSAqLworCXBzM19tbV9yZWdpb25fY3JlYXRlKCZtYXAucjEsIG1hcC50b3RhbCAtIG1hcC5ybS5zaXplKTsKKworCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworfQorCisvKioKKyAqIHBzM19tbV9zaHV0ZG93biAtIGZpbmFsIGNsZWFudXAgb2YgYWRkcmVzcyBzcGFjZQorICovCisKK3ZvaWQgcHMzX21tX3NodXRkb3duKHZvaWQpCit7CisJcHMzX21tX3JlZ2lvbl9kZXN0cm95KCZtYXAucjEpOworCW1hcC50b3RhbCA9IG1hcC5ybS5zaXplOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzU4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiAgUFMzICdPdGhlciBPUycgYXJlYSBkYXRhLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vbG1iLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworZW51bSB7CisJT1NfQVJFQV9TRUdNRU5UX1NJWkUgPSAwWDIwMCwKK307CisKK2VudW0geworCUhFQURFUl9MRFJfRk9STUFUX1JBVyA9IDAsCisJSEVBREVSX0xEUl9GT1JNQVRfR1pJUCA9IDEsCit9OworCisvKioKKyAqIHN0cnVjdCBvc19hcmVhX2hlYWRlciAtIG9zIGFyZWEgaGVhZGVyIHNlZ21lbnQuCisgKiBAbWFnaWNfbnVtOiBBbHdheXMgJ2NlbGxfZXh0X29zX2FyZWEnLgorICogQGhkcl92ZXJzaW9uOiBIZWFkZXIgZm9ybWF0IHZlcnNpb24gbnVtYmVyLgorICogQG9zX2FyZWFfb2Zmc2V0OiBTdGFydGluZyBzZWdtZW50IG51bWJlciBvZiBvcyBpbWFnZSBhcmVhLgorICogQGxkcl9hcmVhX29mZnNldDogU3RhcnRpbmcgc2VnbWVudCBudW1iZXIgb2YgYm9vdGxvYWRlciBpbWFnZSBhcmVhLgorICogQGxkcl9mb3JtYXQ6IEhFQURFUl9MRFJfRk9STUFUIGZsYWcuCisgKiBAbGRyX3NpemU6IFNpemUgb2YgYm9vdGxvYWRlciBpbWFnZSBpbiBieXRlcy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGRvY3MgcmVmZXIgdG8gYXJlYSBvZmZzZXRzLiAgVGhlc2UgYXJlIG9mZnNldHMgaW4gdW5pdHMgb2YKKyAqIHNlZ21lbnRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBvcyBhcmVhICh0b3Agb2YgdGhlIGhlYWRlcikuICBUaGVzZSBhcmUKKyAqIGJldHRlciB0aG91Z2h0IG9mIGFzIHNlZ21lbnQgbnVtYmVycy4gIFRoZSBvcyBhcmVhIG9mIHRoZSBvcyBhcmVhIGlzCisgKiByZXNlcnZlZCBmb3IgdGhlIG9zIGltYWdlLgorICovCisKK3N0cnVjdCBvc19hcmVhX2hlYWRlciB7CisJczggbWFnaWNfbnVtWzE2XTsKKwl1MzIgaGRyX3ZlcnNpb247CisJdTMyIG9zX2FyZWFfb2Zmc2V0OworCXUzMiBsZHJfYXJlYV9vZmZzZXQ7CisJdTMyIF9yZXNlcnZlZF8xOworCXUzMiBsZHJfZm9ybWF0OworCXUzMiBsZHJfc2l6ZTsKKwl1MzIgX3Jlc2VydmVkXzJbNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworZW51bSB7CisJUEFSQU1fQk9PVF9GTEFHX0dBTUVfT1MgPSAwLAorCVBBUkFNX0JPT1RfRkxBR19PVEhFUl9PUyA9IDEsCit9OworCitlbnVtIHsKKwlQQVJBTV9BVl9NVUxUSV9PVVRfTlRTQyA9IDAsCisJUEFSQU1fQVZfTVVMVElfT1VUX1BBTF9SR0IgPSAxLAorCVBBUkFNX0FWX01VTFRJX09VVF9QQUxfWUNCQ1IgPSAyLAorCVBBUkFNX0FWX01VTFRJX09VVF9TRUNBTSA9IDMsCit9OworCitlbnVtIHsKKwlQQVJBTV9DVFJMX0JVVFRPTl9PX0lTX1lFUyA9IDAsCisJUEFSQU1fQ1RSTF9CVVRUT05fWF9JU19ZRVMgPSAxLAorfTsKKworLyoqCisgKiBzdHJ1Y3Qgb3NfYXJlYV9wYXJhbXMgLSBvcyBhcmVhIHBhcmFtcyBzZWdtZW50LgorICogQGJvb3RfZmxhZzogVXNlciBwcmVmZXJlbmNlIG9mIG9wZXJhdGluZyBzeXN0ZW0sIFBBUkFNX0JPT1RfRkxBRyBmbGFnLgorICogQG51bV9wYXJhbXM6IE51bWJlciBvZiBwYXJhbXMgaW4gdGhpcyAocGFyYW1zKSBzZWdtZW50LgorICogQHJ0Y19kaWZmOiBEaWZmZXJlbmNlIGluIHNlY29uZHMgYmV0d2VlbiAxOTcwIGFuZCB0aGUgcHMzIHJ0YyB2YWx1ZS4KKyAqIEBhdl9tdWx0aV9vdXQ6IFVzZXIgcHJlZmVyZW5jZSBvZiBBViBvdXRwdXQsIFBBUkFNX0FWX01VTFRJX09VVCBmbGFnLgorICogQGN0cmxfYnV0dG9uOiBVc2VyIHByZWZlcmVuY2Ugb2YgY29udHJvbGxlciBidXR0b24gY29uZmlnLCBQQVJBTV9DVFJMX0JVVFRPTgorICoJZmxhZy4KKyAqIEBzdGF0aWNfaXBfYWRkcjogVXNlciBwcmVmZXJlbmNlIG9mIHN0YXRpYyBJUCBhZGRyZXNzLgorICogQG5ldHdvcmtfbWFzazogVXNlciBwcmVmZXJlbmNlIG9mIHN0YXRpYyBuZXR3b3JrIG1hc2suCisgKiBAZGVmYXVsdF9nYXRld2F5OiBVc2VyIHByZWZlcmVuY2Ugb2Ygc3RhdGljIGRlZmF1bHQgZ2F0ZXdheS4KKyAqIEBkbnNfcHJpbWFyeTogVXNlciBwcmVmZXJlbmNlIG9mIHN0YXRpYyBwcmltYXJ5IGRucyBzZXJ2ZXIuCisgKiBAZG5zX3NlY29uZGFyeTogVXNlciBwcmVmZXJlbmNlIG9mIHN0YXRpYyBzZWNvbmRhcnkgZG5zIHNlcnZlci4KKyAqCisgKiBVc2VyIHByZWZlcmVuY2Ugb2YgemVybyBmb3Igc3RhdGljX2lwX2FkZHIgbWVhbnMgdXNlIGRoY3AuCisgKi8KKworc3RydWN0IG9zX2FyZWFfcGFyYW1zIHsKKwl1MzIgYm9vdF9mbGFnOworCXUzMiBfcmVzZXJ2ZWRfMVszXTsKKwl1MzIgbnVtX3BhcmFtczsKKwl1MzIgX3Jlc2VydmVkXzJbM107CisJLyogcGFyYW0gMCAqLworCXM2NCBydGNfZGlmZjsKKwl1OCBhdl9tdWx0aV9vdXQ7CisJdTggY3RybF9idXR0b247CisJdTggX3Jlc2VydmVkXzNbNl07CisJLyogcGFyYW0gMSAqLworCXU4IHN0YXRpY19pcF9hZGRyWzRdOworCXU4IG5ldHdvcmtfbWFza1s0XTsKKwl1OCBkZWZhdWx0X2dhdGV3YXlbNF07CisJdTggX3Jlc2VydmVkXzRbNF07CisJLyogcGFyYW0gMiAqLworCXU4IGRuc19wcmltYXJ5WzRdOworCXU4IGRuc19zZWNvbmRhcnlbNF07CisJdTggX3Jlc2VydmVkXzVbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3Qgc2F2ZWRfcGFyYW1zIC0gU3RhdGljIHdvcmtpbmcgY29waWVzIG9mIGRhdGEgZnJvbSB0aGUgJ090aGVyIE9TJyBhcmVhLgorICoKKyAqIEZvciB0aGUgY29udmluaWVuY2Ugb2YgdGhlIGd1ZXN0LCB0aGUgSFYgbWFrZXMgYSBjb3B5IG9mIHRoZSAnT3RoZXIgT1MnIGFyZWEKKyAqIGluIGZsYXNoIHRvIGEgaGlnaCBhZGRyZXNzIGluIHRoZSBib290IG1lbW9yeSByZWdpb24gYW5kIHRoZW4gcHV0cyB0aGF0IFJBTQorICogYWRkcmVzcyBhbmQgdGhlIGJ5dGUgY291bnQgaW50byB0aGUgcmVwb3NpdG9yeSBmb3IgcmV0cmV2YWwgYnkgdGhlIGd1ZXN0LgorICogV2UgY29weSB0aGUgZGF0YSB3ZSB3YW50IGludG8gYSBzdGF0aWMgdmFyaWFibGUgYW5kIGFsbG93IHRoZSBtZW1vcnkgc2V0dXAKKyAqIGJ5IHRoZSBIViB0byBiZSBjbGFpbWVkIGJ5IHRoZSBsbWIgbWFuYWdlci4KKyAqLworCitzdHJ1Y3Qgc2F2ZWRfcGFyYW1zIHsKKwkvKiBwYXJhbSAwICovCisJczY0IHJ0Y19kaWZmOworCXVuc2lnbmVkIGludCBhdl9tdWx0aV9vdXQ7CisJdW5zaWduZWQgaW50IGN0cmxfYnV0dG9uOworCS8qIHBhcmFtIDEgKi8KKwl1OCBzdGF0aWNfaXBfYWRkcls0XTsKKwl1OCBuZXR3b3JrX21hc2tbNF07CisJdTggZGVmYXVsdF9nYXRld2F5WzRdOworCS8qIHBhcmFtIDIgKi8KKwl1OCBkbnNfcHJpbWFyeVs0XTsKKwl1OCBkbnNfc2Vjb25kYXJ5WzRdOworfSBzdGF0aWMgc2F2ZWRfcGFyYW1zOworCisjZGVmaW5lIGR1bXBfaGVhZGVyKF9hKSBfZHVtcF9oZWFkZXIoX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kdW1wX2hlYWRlcihjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgX19pb21lbSAqaCwgY29uc3QgY2hhciogZnVuYywKKwlpbnQgbGluZSkKK3sKKwlwcl9kZWJ1ZygiJXM6JWQ6IGgubWFnaWNfbnVtOiAgICAgICAgICclcydcbiIsIGZ1bmMsIGxpbmUsCisJCWgtPm1hZ2ljX251bSk7CisJcHJfZGVidWcoIiVzOiVkOiBoLmhkcl92ZXJzaW9uOiAgICAgICAldVxuIiwgZnVuYywgbGluZSwKKwkJaC0+aGRyX3ZlcnNpb24pOworCXByX2RlYnVnKCIlczolZDogaC5vc19hcmVhX29mZnNldDogICAldVxuIiwgZnVuYywgbGluZSwKKwkJaC0+b3NfYXJlYV9vZmZzZXQpOworCXByX2RlYnVnKCIlczolZDogaC5sZHJfYXJlYV9vZmZzZXQ6ICV1XG4iLCBmdW5jLCBsaW5lLAorCQloLT5sZHJfYXJlYV9vZmZzZXQpOworCXByX2RlYnVnKCIlczolZDogaC5sZHJfZm9ybWF0OiAgICAgICAgJXVcbiIsIGZ1bmMsIGxpbmUsCisJCWgtPmxkcl9mb3JtYXQpOworCXByX2RlYnVnKCIlczolZDogaC5sZHJfc2l6ZTogICAgICAgICAgJXhoXG4iLCBmdW5jLCBsaW5lLAorCQloLT5sZHJfc2l6ZSk7Cit9CisKKyNkZWZpbmUgZHVtcF9wYXJhbXMoX2EpIF9kdW1wX3BhcmFtcyhfYSwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX2R1bXBfcGFyYW1zKGNvbnN0IHN0cnVjdCBvc19hcmVhX3BhcmFtcyBfX2lvbWVtICpwLCBjb25zdCBjaGFyKiBmdW5jLAorCWludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogcC5ib290X2ZsYWc6ICAgICAgICV1XG4iLCBmdW5jLCBsaW5lLCBwLT5ib290X2ZsYWcpOworCXByX2RlYnVnKCIlczolZDogcC5udW1fcGFyYW1zOiAgICAgICV1XG4iLCBmdW5jLCBsaW5lLCBwLT5udW1fcGFyYW1zKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHAucnRjX2RpZmYgICAgICAgICAlbGRcbiIsIGZ1bmMsIGxpbmUsIHAtPnJ0Y19kaWZmKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHAuYXZfbXVsdGlfb3V0ICAgICAldVxuIiwgZnVuYywgbGluZSwgcC0+YXZfbXVsdGlfb3V0KTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHAuY3RybF9idXR0b246ICAgICAldVxuIiwgZnVuYywgbGluZSwgcC0+Y3RybF9idXR0b24pOworCXByX2RlYnVnKCIlczolZDogcC5zdGF0aWNfaXBfYWRkcjogICV1LiV1LiV1LiV1XG4iLCBmdW5jLCBsaW5lLAorCQlwLT5zdGF0aWNfaXBfYWRkclswXSwgcC0+c3RhdGljX2lwX2FkZHJbMV0sCisJCXAtPnN0YXRpY19pcF9hZGRyWzJdLCBwLT5zdGF0aWNfaXBfYWRkclszXSk7CisJcHJfZGVidWcoIiVzOiVkOiBwLm5ldHdvcmtfbWFzazogICAgJXUuJXUuJXUuJXVcbiIsIGZ1bmMsIGxpbmUsCisJCXAtPm5ldHdvcmtfbWFza1swXSwgcC0+bmV0d29ya19tYXNrWzFdLAorCQlwLT5uZXR3b3JrX21hc2tbMl0sIHAtPm5ldHdvcmtfbWFza1szXSk7CisJcHJfZGVidWcoIiVzOiVkOiBwLmRlZmF1bHRfZ2F0ZXdheTogJXUuJXUuJXUuJXVcbiIsIGZ1bmMsIGxpbmUsCisJCXAtPmRlZmF1bHRfZ2F0ZXdheVswXSwgcC0+ZGVmYXVsdF9nYXRld2F5WzFdLAorCQlwLT5kZWZhdWx0X2dhdGV3YXlbMl0sIHAtPmRlZmF1bHRfZ2F0ZXdheVszXSk7CisJcHJfZGVidWcoIiVzOiVkOiBwLmRuc19wcmltYXJ5OiAgICAgJXUuJXUuJXUuJXVcbiIsIGZ1bmMsIGxpbmUsCisJCXAtPmRuc19wcmltYXJ5WzBdLCBwLT5kbnNfcHJpbWFyeVsxXSwKKwkJcC0+ZG5zX3ByaW1hcnlbMl0sIHAtPmRuc19wcmltYXJ5WzNdKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHAuZG5zX3NlY29uZGFyeTogICAldS4ldS4ldS4ldVxuIiwgZnVuYywgbGluZSwKKwkJcC0+ZG5zX3NlY29uZGFyeVswXSwgcC0+ZG5zX3NlY29uZGFyeVsxXSwKKwkJcC0+ZG5zX3NlY29uZGFyeVsyXSwgcC0+ZG5zX3NlY29uZGFyeVszXSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHZlcmlmeV9oZWFkZXIoY29uc3Qgc3RydWN0IG9zX2FyZWFfaGVhZGVyICpoZWFkZXIpCit7CisJaWYgKG1lbWNtcChoZWFkZXItPm1hZ2ljX251bSwgImNlbGxfZXh0X29zX2FyZWEiLCAxNikpIHsKKwkJcHJfZGVidWcoIiVzOiVkIG1hZ2ljX251bSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaGVhZGVyLT5oZHJfdmVyc2lvbiA8IDEpIHsKKwkJcHJfZGVidWcoIiVzOiVkIGhkcl92ZXJzaW9uIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZWFkZXItPm9zX2FyZWFfb2Zmc2V0ID4gaGVhZGVyLT5sZHJfYXJlYV9vZmZzZXQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIG9mZnNldHMgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgcHMzX29zX2FyZWFfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisJdTY0IGxwYXJfYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3Qgb3NfYXJlYV9wYXJhbXMgKnBhcmFtczsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfaW5mbygmbHBhcl9hZGRyLCAmc2l6ZSk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X2luZm8gZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwloZWFkZXIgPSAoc3RydWN0IG9zX2FyZWFfaGVhZGVyICopX192YShscGFyX2FkZHIpOworCXBhcmFtcyA9IChzdHJ1Y3Qgb3NfYXJlYV9wYXJhbXMgKilfX3ZhKGxwYXJfYWRkciArIE9TX0FSRUFfU0VHTUVOVF9TSVpFKTsKKworCXJlc3VsdCA9IHZlcmlmeV9oZWFkZXIoaGVhZGVyKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHZlcmlmeV9oZWFkZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlkdW1wX2hlYWRlcihoZWFkZXIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkdW1wX2hlYWRlcihoZWFkZXIpOworCWR1bXBfcGFyYW1zKHBhcmFtcyk7CisKKwlzYXZlZF9wYXJhbXMucnRjX2RpZmYgPSBwYXJhbXMtPnJ0Y19kaWZmOworCXNhdmVkX3BhcmFtcy5hdl9tdWx0aV9vdXQgPSBwYXJhbXMtPmF2X211bHRpX291dDsKKwlzYXZlZF9wYXJhbXMuY3RybF9idXR0b24gPSBwYXJhbXMtPmN0cmxfYnV0dG9uOworCW1lbWNweShzYXZlZF9wYXJhbXMuc3RhdGljX2lwX2FkZHIsIHBhcmFtcy0+c3RhdGljX2lwX2FkZHIsIDQpOworCW1lbWNweShzYXZlZF9wYXJhbXMubmV0d29ya19tYXNrLCBwYXJhbXMtPm5ldHdvcmtfbWFzaywgNCk7CisJbWVtY3B5KHNhdmVkX3BhcmFtcy5kZWZhdWx0X2dhdGV3YXksIHBhcmFtcy0+ZGVmYXVsdF9nYXRld2F5LCA0KTsKKwltZW1jcHkoc2F2ZWRfcGFyYW1zLmRuc19zZWNvbmRhcnksIHBhcmFtcy0+ZG5zX3NlY29uZGFyeSwgNCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM19vc19hcmVhX3J0Y19kaWZmIC0gUmV0dXJucyB0aGUgcHMzIHJ0YyBkaWZmIHZhbHVlLgorICoKKyAqIFRoZSBwczMgcnRjIG1haW50YWlucyBhIHZhbHVlIHRoYXQgYXBwcm94aW1hdGVzIHNlY29uZHMgc2luY2UKKyAqIDIwMDAtMDEtMDEgMDA6MDA6MDAgVVRDLiAgUmV0dXJucyB0aGUgZXhhY3QgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSAxOTcwIHRvCisgKiAyMDAwIHdoZW4gc2F2ZWRfcGFyYW1zLnJ0Y19kaWZmIGhhcyBub3QgYmVlbiBwcm9wZXJseSBzZXQgdXAuCisgKi8KKwordTY0IHBzM19vc19hcmVhX3J0Y19kaWZmKHZvaWQpCit7CisJcmV0dXJuIHNhdmVkX3BhcmFtcy5ydGNfZGlmZiA/IHNhdmVkX3BhcmFtcy5ydGNfZGlmZiA6IDk0NjY4NDgwMFVMOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiMTExYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICBQUzMgcGxhdGZvcm0gZGVjbGFyYXRpb25zLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmICFkZWZpbmVkKF9QUzNfUExBVEZPUk1fSCkKKyNkZWZpbmUgX1BTM19QTEFURk9STV9ICisKKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworLyogaHRhYiAqLworCit2b2lkIF9faW5pdCBwczNfaHB0ZV9pbml0KHVuc2lnbmVkIGxvbmcgaHRhYl9zaXplKTsKK3ZvaWQgX19pbml0IHBzM19tYXBfaHRhYih2b2lkKTsKKworLyogbW0gKi8KKwordm9pZCBfX2luaXQgcHMzX21tX2luaXQodm9pZCk7Cit2b2lkIF9faW5pdCBwczNfbW1fdmFzX2NyZWF0ZSh1bnNpZ25lZCBsb25nKiBodGFiX3NpemUpOwordm9pZCBwczNfbW1fdmFzX2Rlc3Ryb3kodm9pZCk7Cit2b2lkIHBzM19tbV9zaHV0ZG93bih2b2lkKTsKKworLyogaXJxICovCisKK3ZvaWQgcHMzX2luaXRfSVJRKHZvaWQpOwordm9pZCBfX2luaXQgcHMzX3JlZ2lzdGVyX2lwaV9kZWJ1Z19icmsodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHZpcnEpOworCisvKiBzbXAgKi8KKwordm9pZCBzbXBfaW5pdF9wczModm9pZCk7Cit2b2lkIHBzM19zbXBfY2xlYW51cF9jcHUoaW50IGNwdSk7CisKKy8qIHRpbWUgKi8KKwordm9pZCBfX2luaXQgcHMzX2NhbGlicmF0ZV9kZWNyKHZvaWQpOwordW5zaWduZWQgbG9uZyBfX2luaXQgcHMzX2dldF9ib290X3RpbWUodm9pZCk7Cit2b2lkIHBzM19nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKTsKK2ludCBwczNfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSk7CisKKy8qIG9zIGFyZWEgKi8KKworaW50IF9faW5pdCBwczNfb3NfYXJlYV9pbml0KHZvaWQpOwordTY0IHBzM19vc19hcmVhX3J0Y19kaWZmKHZvaWQpOworCisvKiBzcHUgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NQVV9CQVNFKQordm9pZCBwczNfc3B1X3NldF9wbGF0Zm9ybSAodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHBzM19zcHVfc2V0X3BsYXRmb3JtICh2b2lkKSB7fQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2EwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKQEAgLTAsMCArMSw4NDAgQEAKKy8qCisgKiAgUFMzIHJlcG9zaXRvcnkgcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8YXNtL3BzMy5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisKK2VudW0gcHMzX3ZlbmRvcl9pZCB7CisJUFMzX1ZFTkRPUl9JRF9OT05FID0gMCwKKwlQUzNfVkVORE9SX0lEX1NPTlkgPSAweDgwMDAwMDAwMDAwMDAwMDBVTCwKK307CisKK2VudW0gcHMzX2xwYXJfaWQgeworCVBTM19MUEFSX0lEX0NVUlJFTlQgPSAwLAorCVBTM19MUEFSX0lEX1BNRSA9IDEsCit9OworCisjZGVmaW5lIGR1bXBfZmllbGQoX2EsIF9iKSBfZHVtcF9maWVsZChfYSwgX2IsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kdW1wX2ZpZWxkKGNvbnN0IGNoYXIgKmhkciwgdTY0IG4sIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworI2lmIGRlZmluZWQoREVCVUcpCisJY2hhciBzWzE2XTsKKwljb25zdCBjaGFyICpjb25zdCBpbiA9IChjb25zdCBjaGFyICopJm47CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlzW2ldID0gKGluW2ldIDw9IDEyNiAmJiBpbltpXSA+PSAzMikgPyBpbltpXSA6ICcuJzsKKwlzW2ldID0gMDsKKworCXByX2RlYnVnKCIlczolZDogJXMlMDE2bHggOiAlc1xuIiwgZnVuYywgbGluZSwgaGRyLCBuLCBzKTsKKyNlbmRpZgorfQorCisjZGVmaW5lIGR1bXBfbm9kZV9uYW1lKF9hLCBfYiwgX2MsIF9kLCBfZSkgXAorCV9kdW1wX25vZGVfbmFtZShfYSwgX2IsIF9jLCBfZCwgX2UsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kdW1wX25vZGVfbmFtZSAodW5zaWduZWQgaW50IGxwYXJfaWQsIHU2NCBuMSwgdTY0IG4yLCB1NjQgbjMsCisJdTY0IG40LCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3sKKwlwcl9kZWJ1ZygiJXM6JWQ6IGxwYXI6ICV1XG4iLCBmdW5jLCBsaW5lLCBscGFyX2lkKTsKKwlfZHVtcF9maWVsZCgibjE6ICIsIG4xLCBmdW5jLCBsaW5lKTsKKwlfZHVtcF9maWVsZCgibjI6ICIsIG4yLCBmdW5jLCBsaW5lKTsKKwlfZHVtcF9maWVsZCgibjM6ICIsIG4zLCBmdW5jLCBsaW5lKTsKKwlfZHVtcF9maWVsZCgibjQ6ICIsIG40LCBmdW5jLCBsaW5lKTsKK30KKworI2RlZmluZSBkdW1wX25vZGUoX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2cpIFwKKwlfZHVtcF9ub2RlKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfZHVtcF9ub2RlKHVuc2lnbmVkIGludCBscGFyX2lkLCB1NjQgbjEsIHU2NCBuMiwgdTY0IG4zLCB1NjQgbjQsCisJdTY0IHYxLCB1NjQgdjIsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogbHBhcjogJXVcbiIsIGZ1bmMsIGxpbmUsIGxwYXJfaWQpOworCV9kdW1wX2ZpZWxkKCJuMTogIiwgbjEsIGZ1bmMsIGxpbmUpOworCV9kdW1wX2ZpZWxkKCJuMjogIiwgbjIsIGZ1bmMsIGxpbmUpOworCV9kdW1wX2ZpZWxkKCJuMzogIiwgbjMsIGZ1bmMsIGxpbmUpOworCV9kdW1wX2ZpZWxkKCJuNDogIiwgbjQsIGZ1bmMsIGxpbmUpOworCXByX2RlYnVnKCIlczolZDogdjE6ICUwMTZseFxuIiwgZnVuYywgbGluZSwgdjEpOworCXByX2RlYnVnKCIlczolZDogdjI6ICUwMTZseFxuIiwgZnVuYywgbGluZSwgdjIpOworfQorCisvKioKKyAqIG1ha2VfZmlyc3RfZmllbGQgLSBNYWtlIHRoZSBmaXJzdCBmaWVsZCBvZiBhIHJlcG9zaXRvcnkgbm9kZSBuYW1lLgorICogQHRleHQ6IFRleHQgcG9ydGlvbiBvZiB0aGUgZmllbGQuCisgKiBAaW5kZXg6IE51bWVyaWMgaW5kZXggcG9ydGlvbiBvZiB0aGUgZmllbGQuICBVc2UgemVybyBmb3IgJ2Rvbid0IGNhcmUnLgorICoKKyAqIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2ZW5kb3IgaWQgdG8gemVybyAobm9uLXZlbmRvciBzcGVjaWZpYykuCisgKiBSZXR1cm5zIGZpZWxkIHZhbHVlLgorICovCisKK3N0YXRpYyB1NjQgbWFrZV9maXJzdF9maWVsZChjb25zdCBjaGFyICp0ZXh0LCB1NjQgaW5kZXgpCit7CisJdTY0IG47CisKKwlzdHJuY3B5KChjaGFyICopJm4sIHRleHQsIDgpOworCXJldHVybiBQUzNfVkVORE9SX0lEX05PTkUgKyAobiA+PiAzMikgKyBpbmRleDsKK30KKworLyoqCisgKiBtYWtlX2ZpZWxkIC0gTWFrZSBzdWJzZXF1ZW50IGZpZWxkcyBvZiBhIHJlcG9zaXRvcnkgbm9kZSBuYW1lLgorICogQHRleHQ6IFRleHQgcG9ydGlvbiBvZiB0aGUgZmllbGQuICBVc2UgIiIgZm9yICdkb24ndCBjYXJlJy4KKyAqIEBpbmRleDogTnVtZXJpYyBpbmRleCBwb3J0aW9uIG9mIHRoZSBmaWVsZC4gIFVzZSB6ZXJvIGZvciAnZG9uJ3QgY2FyZScuCisgKgorICogUmV0dXJucyBmaWVsZCB2YWx1ZS4KKyAqLworCitzdGF0aWMgdTY0IG1ha2VfZmllbGQoY29uc3QgY2hhciAqdGV4dCwgdTY0IGluZGV4KQoreworCXU2NCBuOworCisJc3RybmNweSgoY2hhciAqKSZuLCB0ZXh0LCA4KTsKKwlyZXR1cm4gbiArIGluZGV4OworfQorCisvKioKKyAqIHJlYWRfbm9kZSAtIFJlYWQgYSByZXBvc2l0b3J5IG5vZGUgZnJvbSByYXcgZmllbGRzLgorICogQG4xOiBGaXJzdCBmaWVsZCBvZiBub2RlIG5hbWUuCisgKiBAbjI6IFNlY29uZCBmaWVsZCBvZiBub2RlIG5hbWUuICBVc2UgemVybyBmb3IgJ2Rvbid0IGNhcmUnLgorICogQG4zOiBUaGlyZCBmaWVsZCBvZiBub2RlIG5hbWUuICBVc2UgemVybyBmb3IgJ2Rvbid0IGNhcmUnLgorICogQG40OiBGb3VydGggZmllbGQgb2Ygbm9kZSBuYW1lLiAgVXNlIHplcm8gZm9yICdkb24ndCBjYXJlJy4KKyAqIEB2MTogRmlyc3QgcmVwb3NpdG9yeSB2YWx1ZSAoaGlnaCB3b3JkKS4KKyAqIEB2MjogU2Vjb25kIHJlcG9zaXRvcnkgdmFsdWUgKGxvdyB3b3JkKS4gIE9wdGlvbmFsIHBhcmFtZXRlciwgdXNlIHplcm8KKyAqICAgICAgZm9yICdkb24ndCBjYXJlJy4KKyAqLworCitzdGF0aWMgaW50IHJlYWRfbm9kZSh1bnNpZ25lZCBpbnQgbHBhcl9pZCwgdTY0IG4xLCB1NjQgbjIsIHU2NCBuMywgdTY0IG40LAorCXU2NCAqX3YxLCB1NjQgKl92MikKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKwl1NjQgdjI7CisKKwlpZiAobHBhcl9pZCA9PSBQUzNfTFBBUl9JRF9DVVJSRU5UKSB7CisJCXU2NCBpZDsKKwkJbHYxX2dldF9sb2dpY2FsX3BhcnRpdGlvbl9pZCgmaWQpOworCQlscGFyX2lkID0gaWQ7CisJfQorCisJcmVzdWx0ID0gbHYxX2dldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUobHBhcl9pZCwgbjEsIG4yLCBuMywgbjQsICZ2MSwKKwkJJnYyKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZ2V0X3JlcG9zaXRvcnlfbm9kZV92YWx1ZSBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlkdW1wX25vZGVfbmFtZShscGFyX2lkLCBuMSwgbjIsIG4zLCBuNCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJZHVtcF9ub2RlKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40LCB2MSwgdjIpOworCisJaWYgKF92MSkKKwkJKl92MSA9IHYxOworCWlmIChfdjIpCisJCSpfdjIgPSB2MjsKKworCWlmICh2MSAmJiAhX3YxKQorCQlwcl9kZWJ1ZygiJXM6JWQ6IHdhcm5pbmc6IGRpc2NhcmRpbmcgbm9uLXplcm8gdjE6ICUwMTZseFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgdjEpOworCWlmICh2MiAmJiAhX3YyKQorCQlwcl9kZWJ1ZygiJXM6JWQ6IHdhcm5pbmc6IGRpc2NhcmRpbmcgbm9uLXplcm8gdjI6ICUwMTZseFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgdjIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3N0cih1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCBjb25zdCBjaGFyICpidXNfc3RyLAorCXU2NCAqdmFsdWUpCit7CisJcmV0dXJuIHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCisJCW1ha2VfZmllbGQoYnVzX3N0ciwgMCksCisJCTAsIDAsCisJCXZhbHVlLCAwKTsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIHVuc2lnbmVkIGludCAqYnVzX2lkKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCXU2NCB2MjsgLyogdW51c2VkICovCisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJpZCIsIDApLAorCQkwLCAwLAorCQkmdjEsICZ2Mik7CisJKmJ1c19pZCA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJZW51bSBwczNfYnVzX3R5cGUgKmJ1c190eXBlKQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKKwkJbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKKwkJbWFrZV9maWVsZCgidHlwZSIsIDApLAorCQkwLCAwLAorCQkmdjEsIDApOworCSpidXNfdHlwZSA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50ICpudW1fZGV2KQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKKwkJbWFrZV9maXJzdF9maWVsZCgiYnVzIiwgYnVzX2luZGV4KSwKKwkJbWFrZV9maWVsZCgibnVtX2RldiIsIDApLAorCQkwLCAwLAorCQkmdjEsIDApOworCSpudW1fZGV2ID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3N0cih1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIGNvbnN0IGNoYXIgKmRldl9zdHIsIHU2NCAqdmFsdWUpCit7CisJcmV0dXJuIHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCisJCW1ha2VfZmllbGQoImRldiIsIGRldl9pbmRleCksCisJCW1ha2VfZmllbGQoZGV2X3N0ciwgMCksCisJCTAsCisJCXZhbHVlLCAwKTsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIHVuc2lnbmVkIGludCBkZXZfaW5kZXgsCisJdW5zaWduZWQgaW50ICpkZXZfaWQpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdjE7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJkZXYiLCBkZXZfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJpZCIsIDApLAorCQkwLAorCQkmdjEsIDApOworCSpkZXZfaWQgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIGVudW0gcHMzX2Rldl90eXBlICpkZXZfdHlwZSkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCisJCW1ha2VfZmllbGQoImRldiIsIGRldl9pbmRleCksCisJCW1ha2VfZmllbGQoInR5cGUiLCAwKSwKKwkJMCwKKwkJJnYxLCAwKTsKKwkqZGV2X3R5cGUgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cih1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHVuc2lnbmVkIGludCBpbnRyX2luZGV4LAorCXVuc2lnbmVkIGludCAqaW50cl90eXBlLCB1bnNpZ25lZCBpbnQqIGludGVycnVwdF9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKwl1NjQgdjI7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJkZXYiLCBkZXZfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJpbnRyIiwgaW50cl9pbmRleCksCisJCTAsCisJCSZ2MSwgJnYyKTsKKwkqaW50cl90eXBlID0gdjE7CisJKmludGVycnVwdF9pZCA9IHYyOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWdfdHlwZSh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHVuc2lnbmVkIGludCByZWdfaW5kZXgsIHVuc2lnbmVkIGludCAqcmVnX3R5cGUpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdjE7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJidXMiLCBidXNfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJkZXYiLCBkZXZfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJyZWciLCByZWdfaW5kZXgpLAorCQltYWtlX2ZpZWxkKCJ0eXBlIiwgMCksCisJCSZ2MSwgMCk7CisJKnJlZ190eXBlID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ19hZGRyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdW5zaWduZWQgaW50IHJlZ19pbmRleCwgdTY0ICpidXNfYWRkciwgdTY0ICpsZW4pCit7CisJcmV0dXJuIHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJ1cyIsIGJ1c19pbmRleCksCisJCW1ha2VfZmllbGQoImRldiIsIGRldl9pbmRleCksCisJCW1ha2VfZmllbGQoInJlZyIsIHJlZ19pbmRleCksCisJCW1ha2VfZmllbGQoImRhdGEiLCAwKSwKKwkJYnVzX2FkZHIsIGxlbik7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgcmVnX2luZGV4LCB1bnNpZ25lZCBpbnQgKnJlZ190eXBlLAorCXU2NCAqYnVzX2FkZHIsIHU2NCAqbGVuKQoreworCWludCByZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWdfdHlwZShidXNfaW5kZXgsIGRldl9pbmRleCwKKwkJcmVnX2luZGV4LCByZWdfdHlwZSk7CisJcmV0dXJuIHJlc3VsdCA/IHJlc3VsdAorCQk6IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ19hZGRyKGJ1c19pbmRleCwgZGV2X2luZGV4LAorCQlyZWdfaW5kZXgsIGJ1c19hZGRyLCBsZW4pOworfQorCisjaWYgZGVmaW5lZChERUJVRykKK2ludCBwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4KQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCByZXNfaW5kZXg7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKKworCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7CisJCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludHJfdHlwZTsKKwkJdW5zaWduZWQgaW50IGludGVycnVwdF9pZDsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKGJ1c19pbmRleCwgZGV2X2luZGV4LAorCQkJcmVzX2luZGV4LCAmaW50cl90eXBlLCAmaW50ZXJydXB0X2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlpZiAocmVzdWx0ICE9ICBMVjFfTk9fRU5UUlkpCisJCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIiCisJCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSBpbnRyX3R5cGUgJXUsIGludGVycnVwdF9pZCAldVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIGludHJfdHlwZSwKKwkJCWludGVycnVwdF9pZCk7CisJfQorCisJZm9yIChyZXNfaW5kZXggPSAwOyByZXNfaW5kZXggPCAxMDsgcmVzX2luZGV4KyspIHsKKwkJZW51bSBwczNfcmVnaW9uX3R5cGUgcmVnX3R5cGU7CisJCXU2NCBidXNfYWRkcjsKKwkJdTY0IGxlbjsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcoYnVzX2luZGV4LCBkZXZfaW5kZXgsCisJCQlyZXNfaW5kZXgsICZyZWdfdHlwZSwgJmJ1c19hZGRyLCAmbGVuKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlpZiAocmVzdWx0ICE9ICBMVjFfTk9fRU5UUlkpCisJCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyIKKwkJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCQlidXNfaW5kZXgsIGRldl9pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIHJlZ190eXBlICV1LCBidXNfYWRkciAlbHhoLCBsZW4gJWx4aFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIHJlZ190eXBlLAorCQkJYnVzX2FkZHIsIGxlbik7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR1bXBfZGV2aWNlX2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IG51bV9kZXYpCit7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGRldl9pbmRleDsKKworCXByX2RlYnVnKCIgLT4gJXM6JWQ6IGJ1c18ldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCisJZm9yIChkZXZfaW5kZXggPSAwOyBkZXZfaW5kZXggPCBudW1fZGV2OyBkZXZfaW5kZXgrKykgeworCQllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZTsKKwkJdW5zaWduZWQgaW50IGRldl9pZDsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKGJ1c19pbmRleCwgZGV2X2luZGV4LAorCQkJJmRldl90eXBlKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSIKKwkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZChidXNfaW5kZXgsIGRldl9pbmRleCwKKwkJCSZkZXZfaWQpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCIKKwkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOworCQkJY29udGludWU7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IGRldl90eXBlICV1LCBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCBkZXZfdHlwZSwgZGV2X2lkKTsKKworCQlwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8oYnVzX2luZGV4LCBkZXZfaW5kZXgpOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X2R1bXBfYnVzX2luZm8odm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgYnVzX2luZGV4OworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCWZvciAoYnVzX2luZGV4ID0gMDsgYnVzX2luZGV4IDwgMTA7IGJ1c19pbmRleCsrKSB7CisJCWVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlOworCQl1bnNpZ25lZCBpbnQgYnVzX2lkOworCQl1bnNpZ25lZCBpbnQgbnVtX2RldjsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKGJ1c19pbmRleCwgJmJ1c190eXBlKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfdHlwZSgldSkgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQoYnVzX2luZGV4LCAmYnVzX2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQoJXUpIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChidXNfaW5kZXggIT0gYnVzX2lkKQorCQkJcHJfZGVidWcoIiVzOiVkIGJ1c19pbmRleCAhPSBidXNfaWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KGJ1c19pbmRleCwgJm51bV9kZXYpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2KCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCQkJY29udGludWU7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgYnVzXyV1OiBidXNfdHlwZSAldSwgYnVzX2lkICV1LCBudW1fZGV2ICV1XG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgsIGJ1c190eXBlLCBidXNfaWQsCisJCQludW1fZGV2KTsKKworCQlkdW1wX2RldmljZV9pbmZvKGJ1c19pbmRleCwgbnVtX2Rldik7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCisKK3N0YXRpYyBpbnQgZmluZF9kZXZpY2UodW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IG51bV9kZXYsCisJdW5zaWduZWQgaW50IHN0YXJ0X2Rldl9pbmRleCwgZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGUsCisJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBkZXZfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZpbmQgZGV2X3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2X3R5cGUpOworCisJZGV2LT5kZXZfaW5kZXggPSBVSU5UX01BWDsKKworCWZvciAoZGV2X2luZGV4ID0gc3RhcnRfZGV2X2luZGV4OyBkZXZfaW5kZXggPCBudW1fZGV2OyBkZXZfaW5kZXgrKykgeworCQllbnVtIHBzM19kZXZfdHlwZSB4OworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUoYnVzX2luZGV4LCBkZXZfaW5kZXgsCisJCQkmeCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X3R5cGUgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJaWYgKHggPT0gZGV2X3R5cGUpCisJCQlicmVhazsKKwl9CisKKwlCVUdfT04oZGV2X2luZGV4ID09IG51bV9kZXYpOworCisJcHJfZGVidWcoIiVzOiVkOiBmb3VuZCBkZXZfdHlwZSAldSBhdCBkZXZfaW5kZXggJXVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2X3R5cGUsIGRldl9pbmRleCk7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZChidXNfaW5kZXgsIGRldl9pbmRleCwKKwkJJmRldi0+ZGlkLmRldl9pZCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9pZCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWRldi0+ZGV2X2luZGV4ID0gZGV2X2luZGV4OworCisJcHJfZGVidWcoIiVzOiVkIGZvdW5kOiBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5kaWQuZGV2X2lkKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZSAoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsCisJZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGUsCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqc3RhcnRfZGV2LAorCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgYnVzX2luZGV4OworCXVuc2lnbmVkIGludCBudW1fZGV2OworCisJcHJfZGVidWcoIiVzOiVkOiBmaW5kIGJ1c190eXBlICV1LCBkZXZfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlidXNfdHlwZSwgZGV2X3R5cGUpOworCisJZGV2LT5idXNfaW5kZXggPSBVSU5UX01BWDsKKworCWZvciAoYnVzX2luZGV4ID0gc3RhcnRfZGV2ID8gc3RhcnRfZGV2LT5idXNfaW5kZXggOiAwOyBidXNfaW5kZXggPCAxMDsKKwkJYnVzX2luZGV4KyspIHsKKwkJZW51bSBwczNfYnVzX3R5cGUgeDsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKGJ1c19pbmRleCwgJngpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAoeCA9PSBidXNfdHlwZSkKKwkJCWJyZWFrOworCX0KKworCUJVR19PTihidXNfaW5kZXggPT0gMTApOworCisJcHJfZGVidWcoIiVzOiVkOiBmb3VuZCBidXNfdHlwZSAldSBhdCBidXNfaW5kZXggJXVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX3R5cGUsIGJ1c19pbmRleCk7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KGJ1c19pbmRleCwgJm51bV9kZXYpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfbnVtX2RldiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJlc3VsdCA9IGZpbmRfZGV2aWNlKGJ1c19pbmRleCwgbnVtX2Rldiwgc3RhcnRfZGV2CisJCT8gc3RhcnRfZGV2LT5kZXZfaW5kZXggKyAxIDogMCwgZGV2X3R5cGUsIGRldik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBnZXRfZGlkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChidXNfaW5kZXgsICZkZXYtPmRpZC5idXNfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlkZXYtPmJ1c19pbmRleCA9IGJ1c19pbmRleDsKKworCXByX2RlYnVnKCIlczolZCBmb3VuZDogYnVzX2lkICV1LCBkZXZfaWQgJXVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldiwKKwllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGUsIHVuc2lnbmVkIGludCAqaW50ZXJydXB0X2lkKQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCByZXNfaW5kZXg7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZpbmQgaW50cl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGludHJfdHlwZSk7CisKKwkqaW50ZXJydXB0X2lkID0gVUlOVF9NQVg7CisKKwlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgeworCQllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSB0OworCQl1bnNpZ25lZCBpbnQgaWQ7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihkZXYtPmJ1c19pbmRleCwKKwkJCWRldi0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmaWQpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9pbnRyIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCWlmICh0ID09IGludHJfdHlwZSkgeworCQkJKmludGVycnVwdF9pZCA9IGlkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlCVUdfT04ocmVzX2luZGV4ID09IDEwKTsKKworCXByX2RlYnVnKCIlczolZDogZm91bmQgaW50cl90eXBlICV1IGF0IHJlc19pbmRleCAldVxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBpbnRyX3R5cGUsIHJlc19pbmRleCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWdpb24oY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2LAorCWVudW0gcHMzX3JlZ2lvbl90eXBlIHJlZ190eXBlLCB1NjQgKmJ1c19hZGRyLCB1NjQgKmxlbikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVzX2luZGV4OworCisJcHJfZGVidWcoIiVzOiVkOiBmaW5kIHJlZ190eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlZ190eXBlKTsKKworCSpidXNfYWRkciA9ICpsZW4gPSAwOworCisJZm9yIChyZXNfaW5kZXggPSAwOyByZXNfaW5kZXggPCAxMDsgcmVzX2luZGV4KyspIHsKKwkJZW51bSBwczNfcmVnaW9uX3R5cGUgdDsKKwkJdTY0IGE7CisJCXU2NCBsOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyhkZXYtPmJ1c19pbmRleCwKKwkJCWRldi0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmYSwgJmwpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9yZWcgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJaWYgKHQgPT0gcmVnX3R5cGUpIHsKKwkJCSpidXNfYWRkciA9IGE7CisJCQkqbGVuID0gbDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJQlVHX09OKHJlc19pbmRleCA9PSAxMCk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kIHJlZ190eXBlICV1IGF0IHJlc19pbmRleCAldVxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCByZWdfdHlwZSwgcmVzX2luZGV4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3JtX3NpemUodW5zaWduZWQgaW50IHBwZV9pZCwgdTY0ICpybV9zaXplKQoreworCXJldHVybiByZWFkX25vZGUoUFMzX0xQQVJfSURfQ1VSUkVOVCwKKwkJbWFrZV9maXJzdF9maWVsZCgiYmkiLCAwKSwKKwkJbWFrZV9maWVsZCgicHUiLCAwKSwKKwkJcHBlX2lkLAorCQltYWtlX2ZpZWxkKCJybV9zaXplIiwgMCksCisJCXJtX3NpemUsIDApOworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9yZWdpb25fdG90YWwodTY0ICpyZWdpb25fdG90YWwpCit7CisJcmV0dXJuIHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJyZ250b3RhbCIsIDApLAorCQkwLCAwLAorCQlyZWdpb25fdG90YWwsIDApOworfQorCisvKioKKyAqIHBzM19yZXBvc2l0b3J5X3JlYWRfbW1faW5mbyAtIFJlYWQgbW0gaW5mbyBmb3Igc2luZ2xlIHB1IHN5c3RlbS4KKyAqIEBybV9iYXNlOiBSZWFsIG1vZGUgbWVtb3J5IGJhc2UgYWRkcmVzcy4KKyAqIEBybV9zaXplOiBSZWFsIG1vZGUgbWVtb3J5IHNpemUuCisgKiBAcmVnaW9uX3RvdGFsOiBNYXhpbXVtIG1lbW9yeSByZWdpb24gc2l6ZS4KKyAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9tbV9pbmZvKHU2NCAqcm1fYmFzZSwgdTY0ICpybV9zaXplLCB1NjQgKnJlZ2lvbl90b3RhbCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCBwcGVfaWQ7CisKKwlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwcGVfaWQpOworCSpybV9iYXNlID0gMDsKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3JtX3NpemUocHBlX2lkLCBybV9zaXplKTsKKwlyZXR1cm4gcmVzdWx0ID8gcmVzdWx0CisJCTogcHMzX3JlcG9zaXRvcnlfcmVhZF9yZWdpb25fdG90YWwocmVnaW9uX3RvdGFsKTsKK30KKworLyoqCisgKiBwczNfcmVwb3NpdG9yeV9yZWFkX251bV9zcHVfcmVzZXJ2ZWQgLSBOdW1iZXIgb2YgcGh5c2ljYWwgc3B1cyByZXNlcnZlZC4KKyAqIEBudW1fc3B1OiBOdW1iZXIgb2YgcGh5c2ljYWwgc3B1cy4KKyAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fc3B1X3Jlc2VydmVkKHVuc2lnbmVkIGludCAqbnVtX3NwdV9yZXNlcnZlZCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJzcHVuIiwgMCksCisJCTAsIDAsCisJCSZ2MSwgMCk7CisJKm51bV9zcHVfcmVzZXJ2ZWQgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM19yZXBvc2l0b3J5X3JlYWRfbnVtX3NwdV9yZXNvdXJjZV9pZCAtIE51bWJlciBvZiBzcHUgcmVzb3VyY2UgcmVzZXJ2YXRpb25zLgorICogQG51bV9yZXNvdXJjZV9pZDogTnVtYmVyIG9mIHNwdSByZXNvdXJjZSBpZHMuCisgKi8KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfbnVtX3NwdV9yZXNvdXJjZV9pZCh1bnNpZ25lZCBpbnQgKm51bV9yZXNvdXJjZV9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJzcHVyc3ZuIiwgMCksCisJCTAsIDAsCisJCSZ2MSwgMCk7CisJKm51bV9yZXNvdXJjZV9pZCA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3JlcG9zaXRvcnlfcmVhZF9zcHVfcmVzb3VyY2VfaWQgLSBzcHUgcmVzb3VyY2UgcmVzZXJ2YXRpb24gaWQgdmFsdWUuCisgKiBAcmVzX2luZGV4OiBSZXNvdXJjZSByZXNlcnZhdGlvbiBpbmRleC4KKyAqIEByZXNvdXJjZV90eXBlOiBSZXNvdXJjZSByZXNlcnZhdGlvbiB0eXBlLgorICogQHJlc291cmNlX2lkOiBSZXNvdXJjZSByZXNlcnZhdGlvbiBpZC4KKyAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zcHVfcmVzb3VyY2VfaWQodW5zaWduZWQgaW50IHJlc19pbmRleCwKKwllbnVtIHBzM19zcHVfcmVzb3VyY2VfdHlwZSogcmVzb3VyY2VfdHlwZSwgdW5zaWduZWQgaW50ICpyZXNvdXJjZV9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKwl1NjQgdjI7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfQ1VSUkVOVCwKKwkJbWFrZV9maXJzdF9maWVsZCgiYmkiLCAwKSwKKwkJbWFrZV9maWVsZCgic3B1cnN2IiwgMCksCisJCXJlc19pbmRleCwKKwkJMCwKKwkJJnYxLCAmdjIpOworCSpyZXNvdXJjZV90eXBlID0gdjE7CisJKnJlc291cmNlX2lkID0gdjI7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYm9vdF9kYXRfYWRkcmVzcyh1NjQgKmFkZHJlc3MpCit7CisJcmV0dXJuIHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJib290X2RhdCIsIDApLAorCQltYWtlX2ZpZWxkKCJhZGRyZXNzIiwgMCksCisJCTAsCisJCWFkZHJlc3MsIDApOworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9zaXplKHVuc2lnbmVkIGludCAqc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJib290X2RhdCIsIDApLAorCQltYWtlX2ZpZWxkKCJzaXplIiwgMCksCisJCTAsCisJCSZ2MSwgMCk7CisJKnNpemUgPSB2MTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAgKiBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X2luZm8gLSBHZXQgYWRkcmVzcyBhbmQgc2l6ZSBvZiBjZWxsX2V4dF9vc19hcmVhLgorICAqIGFkZHJlc3M6IGxwYXIgYWRkcmVzcyBvZiBjZWxsX2V4dF9vc19hcmVhCisgICogQHNpemU6IHNpemUgb2YgY2VsbF9leHRfb3NfYXJlYQorICAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9pbmZvKHU2NCAqbHBhcl9hZGRyLCB1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJaW50IHJlc3VsdDsKKworCSpzaXplID0gMDsKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X2FkZHJlc3MobHBhcl9hZGRyKTsKKwlyZXR1cm4gcmVzdWx0ID8gcmVzdWx0CisJCTogcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9zaXplKHNpemUpOworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fYmUodW5zaWduZWQgaW50ICpudW1fYmUpCit7CisJaW50IHJlc3VsdDsKKwl1NjQgdjE7CisKKwlyZXN1bHQgPSByZWFkX25vZGUoUFMzX0xQQVJfSURfUE1FLAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiZW4iLCAwKSwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJJnYxLCAwKTsKKwkqbnVtX2JlID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYmVfbm9kZV9pZCh1bnNpZ25lZCBpbnQgYmVfaW5kZXgsIHU2NCAqbm9kZV9pZCkKK3sKKwlyZXR1cm4gcmVhZF9ub2RlKFBTM19MUEFSX0lEX1BNRSwKKwkJbWFrZV9maXJzdF9maWVsZCgiYmUiLCBiZV9pbmRleCksCisJCTAsCisJCTAsCisJCTAsCisJCW5vZGVfaWQsIDApOworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF90Yl9mcmVxKHU2NCBub2RlX2lkLCB1NjQgKnRiX2ZyZXEpCit7CisJcmV0dXJuIHJlYWRfbm9kZShQUzNfTFBBUl9JRF9QTUUsCisJCW1ha2VfZmlyc3RfZmllbGQoImJlIiwgMCksCisJCW5vZGVfaWQsCisJCW1ha2VfZmllbGQoImNsb2NrIiwgMCksCisJCTAsCisJCXRiX2ZyZXEsIDApOworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9iZV90Yl9mcmVxKHVuc2lnbmVkIGludCBiZV9pbmRleCwgdTY0ICp0Yl9mcmVxKQoreworCWludCByZXN1bHQ7CisJdTY0IG5vZGVfaWQ7CisKKwkqdGJfZnJlcSA9IDA7CisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9iZV9ub2RlX2lkKDAsICZub2RlX2lkKTsKKwlyZXR1cm4gcmVzdWx0ID8gcmVzdWx0CisJCTogcHMzX3JlcG9zaXRvcnlfcmVhZF90Yl9mcmVxKG5vZGVfaWQsIHRiX2ZyZXEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiNWNhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiAgUFMzIHBsYXRmb3JtIHNldHVwIHJvdXRpbmVzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorCisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2lmIGRlZmluZWQoREVCVUcpCisjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgcHMzX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc2VxX3ByaW50ZihtLCAibWFjaGluZVx0XHQ6ICVzXG4iLCBwcGNfbWQubmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19wb3dlcl9zYXZlKHZvaWQpCit7CisJLyoKKwkgKiBsdjFfcGF1c2UoKSBwdXRzIHRoZSBQUEUgdGhyZWFkIGludG8gaW5hY3RpdmUgc3RhdGUgdW50aWwgYW4KKwkgKiBpcnEgb24gYW4gdW5tYXNrZWQgcGx1ZyBleGlzdHMuIE1TUltFRV0gaGFzIG5vIGVmZmVjdC4KKwkgKiBmbGFnczogMCA9IHdha2Ugb24gREVDIGludGVycnVwdCwgMSA9IGlnbm9yZSBERUMgaW50ZXJydXB0LgorCSAqLworCisJbHYxX3BhdXNlKDApOworfQorCitzdGF0aWMgdm9pZCBwczNfcGFuaWMoY2hhciAqc3RyKQoreworCURCRygiJXM6JWQgJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgc3RyKTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlzbXBfc2VuZF9zdG9wKCk7CisjZW5kaWYKKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCIgICBTeXN0ZW0gZG9lcyBub3QgcmVib290IGF1dG9tYXRpY2FsbHkuXG4iKTsKKwlwcmludGsoIiAgIFBsZWFzZSBwcmVzcyBQT1dFUiBidXR0b24uXG4iKTsKKwlwcmludGsoIlxuIik7CisKKwlmb3IgKDs7KSA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwczNfc2V0dXBfYXJjaCh2b2lkKQoreworCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHMzX3NwdV9zZXRfcGxhdGZvcm0oKTsKKwlwczNfbWFwX2h0YWIoKTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlzbXBfaW5pdF9wczMoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKKwljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKKyNlbmRpZgorCisJcHBjX21kLnBvd2VyX3NhdmUgPSBwczNfcG93ZXJfc2F2ZTsKKworCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcHMzX3Byb2dyZXNzKGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0IGhleCkKK3sKKwlwcmludGsoIioqKiAlMDR4IDogJXNcbiIsIGhleCwgcyA/IHMgOiAiIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaHRhYl9zaXplOworCXVuc2lnbmVkIGxvbmcgZHRfcm9vdDsKKworCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJZHRfcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKwlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShkdF9yb290LCAiUFMzIikpCisJCXJldHVybiAwOworCisJcG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcyB8PSBGV19GRUFUVVJFX1BTM19QT1NTSUJMRTsKKworCXBzM19vc19hcmVhX2luaXQoKTsKKwlwczNfbW1faW5pdCgpOworCXBzM19tbV92YXNfY3JlYXRlKCZodGFiX3NpemUpOworCXBzM19ocHRlX2luaXQoaHRhYl9zaXplKTsKKworCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAxOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfS0VYRUMpCitzdGF0aWMgdm9pZCBwczNfa2V4ZWNfY3B1X2Rvd24oaW50IGNyYXNoX3NodXRkb3duLCBpbnQgc2Vjb25kYXJ5KQoreworCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJaWYgKHNlY29uZGFyeSkgeworCQlpbnQgY3B1OworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJCWlmIChjcHUpCisJCQkJcHMzX3NtcF9jbGVhbnVwX2NwdShjcHUpOworCX0gZWxzZQorCQlwczNfc21wX2NsZWFudXBfY3B1KDApOworCisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Cit9CisKK3N0YXRpYyB2b2lkIHBzM19tYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCXVuc2lnbmVkIGxvbmcgcHBlX2lkOworCisJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwcGVfaWQpOworCWx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwcGVfaWQsIDAsIDApOworCXBzM19tbV9zaHV0ZG93bigpOworCXBzM19tbV92YXNfZGVzdHJveSgpOworCisJZGVmYXVsdF9tYWNoaW5lX2tleGVjKGltYWdlKTsKKworCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworfQorI2VuZGlmCisKK2RlZmluZV9tYWNoaW5lKHBzMykgeworCS5uYW1lCQkJCT0gIlBTMyIsCisJLnByb2JlCQkJCT0gcHMzX3Byb2JlLAorCS5zZXR1cF9hcmNoCQkJPSBwczNfc2V0dXBfYXJjaCwKKwkuc2hvd19jcHVpbmZvCQkJPSBwczNfc2hvd19jcHVpbmZvLAorCS5pbml0X0lSUQkJCT0gcHMzX2luaXRfSVJRLAorCS5wYW5pYwkJCQk9IHBzM19wYW5pYywKKwkuZ2V0X2Jvb3RfdGltZQkJCT0gcHMzX2dldF9ib290X3RpbWUsCisJLnNldF9ydGNfdGltZQkJCT0gcHMzX3NldF9ydGNfdGltZSwKKwkuZ2V0X3J0Y190aW1lCQkJPSBwczNfZ2V0X3J0Y190aW1lLAorCS5jYWxpYnJhdGVfZGVjcgkJCT0gcHMzX2NhbGlicmF0ZV9kZWNyLAorCS5wcm9ncmVzcwkJCT0gcHMzX3Byb2dyZXNzLAorI2lmIGRlZmluZWQoQ09ORklHX0tFWEVDKQorCS5rZXhlY19jcHVfZG93bgkJCT0gcHMzX2tleGVjX2NwdV9kb3duLAorCS5tYWNoaW5lX2tleGVjCQkJPSBwczNfbWFjaGluZV9rZXhlYywKKwkubWFjaGluZV9rZXhlY19wcmVwYXJlCQk9IGRlZmF1bHRfbWFjaGluZV9rZXhlY19wcmVwYXJlLAorCS5tYWNoaW5lX2NyYXNoX3NodXRkb3duCQk9IGRlZmF1bHRfbWFjaGluZV9jcmFzaF9zaHV0ZG93biwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkMjA4MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogIFBTMyBTTVAgcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2lmIGRlZmluZWQoREVCVUcpCisjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pIGRve2lmKDApcHJpbnRrKGZtdCk7fXdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIGlycXJldHVybl90IGlwaV9mdW5jdGlvbl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKm1zZykKK3sKKwlzbXBfbWVzc2FnZV9yZWN2KChpbnQpKGxvbmcpbXNnKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICAqIHZpcnFzIC0gYSBwZXIgY3B1IGFycmF5IG9mIHZpcnFzIGZvciBpcGkgdXNlCisgICovCisKKyNkZWZpbmUgTVNHX0NPVU5UIDQKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHZpcnFzW01TR19DT1VOVF0pOworCitzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbTVNHX0NPVU5UXSA9IHsKKwkiaXBpIGNhbGwiLAorCSJpcGkgcmVzY2hlZHVsZSIsCisJImlwaSBtaWdyYXRlIiwKKwkiaXBpIGRlYnVnIGJyayIKK307CisKK3N0YXRpYyB2b2lkIGRvX21lc3NhZ2VfcGFzcyhpbnQgdGFyZ2V0LCBpbnQgbXNnKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlpZiAobXNnID49IE1TR19DT1VOVCkgeworCQlEQkcoIiVzOiVkOiBiYWQgbXNnOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtc2cpOworCQlyZXR1cm47CisJfQorCisJdmlycSA9IHBlcl9jcHUodmlycXMsIHRhcmdldClbbXNnXTsKKwlyZXN1bHQgPSBwczNfc2VuZF9ldmVudF9sb2NhbGx5KHZpcnEpOworCisJaWYgKHJlc3VsdCkKKwkJREJHKCIlczolZDogcHMzX3NlbmRfZXZlbnRfbG9jYWxseSglZCwgJWQpIGZhaWxlZCIKKwkJCSIgKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCB0YXJnZXQsIG1zZywgcmVzdWx0KTsKK30KKworc3RhdGljIHZvaWQgcHMzX3NtcF9tZXNzYWdlX3Bhc3MoaW50IHRhcmdldCwgaW50IG1zZykKK3sKKwlpbnQgY3B1OworCisJaWYgKHRhcmdldCA8IE5SX0NQVVMpCisJCWRvX21lc3NhZ2VfcGFzcyh0YXJnZXQsIG1zZyk7CisJZWxzZSBpZiAodGFyZ2V0ID09IE1TR19BTExfQlVUX1NFTEYpIHsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCQlpZiAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJCQlkb19tZXNzYWdlX3Bhc3MoY3B1LCBtc2cpOworCX0gZWxzZSB7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQkJZG9fbWVzc2FnZV9wYXNzKGNwdSwgbXNnKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHMzX3NtcF9wcm9iZSh2b2lkKQoreworCXJldHVybiAyOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcHMzX3NtcF9zZXR1cF9jcHUoaW50IGNwdSkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHZpcnFzLCBjcHUpOworCWludCBpOworCisJREJHKCIgLT4gJXM6JWQ6ICglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY3B1KTsKKworCS8qCisJICogQ2hlY2sgYXNzdW1wdGlvbnMgb24gdmlycXNbXSBpbmRleGluZy4gSWYgdGhpcworCSAqIGNoZWNrIGZhaWxzLCB0aGVuIGEgZGlmZmVyZW50IG1hcHBpbmcgb2YgUFBDX01TR18KKwkgKiB0byBpbmRleCBuZWVkcyB0byBiZSBzZXR1cC4KKwkgKi8KKworCUJVSUxEX0JVR19PTihQUENfTVNHX0NBTExfRlVOQ1RJT04gICE9IDApOworCUJVSUxEX0JVR19PTihQUENfTVNHX1JFU0NIRURVTEUgICAgICE9IDEpOworCUJVSUxEX0JVR19PTihQUENfTVNHX0RFQlVHR0VSX0JSRUFLICE9IDMpOworCisJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7CisJCXJlc3VsdCA9IHBzM19hbGxvY19ldmVudF9pcnEoJnZpcnFzW2ldKTsKKworCQlpZiAocmVzdWx0KQorCQkJY29udGludWU7CisKKwkJREJHKCIlczolZDogKCVkLCAlZCkgPT4gdmlycSAldVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgY3B1LCBpLCB2aXJxc1tpXSk7CisKKworCQlyZXF1ZXN0X2lycSh2aXJxc1tpXSwgaXBpX2Z1bmN0aW9uX2hhbmRsZXIsIElSUUZfRElTQUJMRUQsCisJCQluYW1lc1tpXSwgKHZvaWQqKShsb25nKWkpOworCX0KKworCXBzM19yZWdpc3Rlcl9pcGlfZGVidWdfYnJrKGNwdSwgdmlycXNbUFBDX01TR19ERUJVR0dFUl9CUkVBS10pOworCisJREJHKCIgPC0gJXM6JWQ6ICglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY3B1KTsKK30KKwordm9pZCBwczNfc21wX2NsZWFudXBfY3B1KGludCBjcHUpCit7CisJdW5zaWduZWQgaW50ICp2aXJxcyA9IHBlcl9jcHUodmlycXMsIGNwdSk7CisJaW50IGk7CisKKwlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOworCWZvciAoaSA9IDA7IGkgPCBNU0dfQ09VTlQ7IGkrKykgeworCQlwczNfZnJlZV9ldmVudF9pcnEodmlycXNbaV0pOworCQlmcmVlX2lycSh2aXJxc1tpXSwgKHZvaWQqKShsb25nKWkpOworCQl2aXJxc1tpXSA9IE5PX0lSUTsKKwl9CisJREJHKCIgPC0gJXM6JWQ6ICglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY3B1KTsKK30KKworc3RhdGljIHN0cnVjdCBzbXBfb3BzX3QgcHMzX3NtcF9vcHMgPSB7CisJLnByb2JlCQk9IHBzM19zbXBfcHJvYmUsCisJLm1lc3NhZ2VfcGFzcwk9IHBzM19zbXBfbWVzc2FnZV9wYXNzLAorCS5raWNrX2NwdQk9IHNtcF9nZW5lcmljX2tpY2tfY3B1LAorCS5zZXR1cF9jcHUJPSBwczNfc21wX3NldHVwX2NwdSwKK307CisKK3ZvaWQgc21wX2luaXRfcHMzKHZvaWQpCit7CisJREJHKCIgLT4gJXNcbiIsIF9fZnVuY19fKTsKKwlzbXBfb3BzID0gJnBzM19zbXBfb3BzOworCURCRygiIDwtICVzXG4iLCBfX2Z1bmNfXyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDUzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwpAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqICBQUzMgUGxhdGZvcm0gc3B1IHJvdXRpbmVzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgorI2luY2x1ZGUgPGFzbS9wczMuaD4KKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorCisvKiBzcHVfbWFuYWdlbWVudF9vcHMgKi8KKworLyoqCisgKiBlbnVtIHNwZV90eXBlIC0gVHlwZSBvZiBzcGUgdG8gY3JlYXRlLgorICogQHNwZV90eXBlX2xvZ2ljYWw6IFN0YW5kYXJkIGxvZ2ljYWwgc3BlLgorICoKKyAqIEZvciB1c2Ugd2l0aCBsdjFfY29uc3RydWN0X2xvZ2ljYWxfc3BlKCkuICBUaGUgY3VycmVudCBIViBkb2VzIG5vdCBzdXBwb3J0CisgKiBhbnkgdHlwZXMgb3RoZXIgdGhhbiB0aG9zZSBsaXN0ZWQuCisgKi8KKworZW51bSBzcGVfdHlwZSB7CisJU1BFX1RZUEVfTE9HSUNBTCA9IDAsCit9OworCisvKioKKyAqIHN0cnVjdCBzcGVfc2hhZG93IC0gbG9naWNhbCBzcGUgc2hhZG93IHJlZ2lzdGVyIGFyZWEuCisgKgorICogUmVhZC1vbmx5IHNoYWRvdyBvZiBzcGUgcmVnaXN0ZXJzLgorICovCisKK3N0cnVjdCBzcGVfc2hhZG93IHsKKwl1OCBwYWRkaW5nXzAwMDBbMHgwMTQwXTsKKwl1NjQgaW50X3N0YXR1c19jbGFzczBfUlc7ICAgICAgIC8qIDB4MDE0MCAqLworCXU2NCBpbnRfc3RhdHVzX2NsYXNzMV9SVzsgICAgICAgLyogMHgwMTQ4ICovCisJdTY0IGludF9zdGF0dXNfY2xhc3MyX1JXOyAgICAgICAvKiAweDAxNTAgKi8KKwl1OCBwYWRkaW5nXzAxNThbMHgwNjEwLTB4MDE1OF07CisJdTY0IG1mY19kc2lzcl9SVzsgICAgICAgICAgICAgICAvKiAweDA2MTAgKi8KKwl1OCBwYWRkaW5nXzA2MThbMHgwNjIwLTB4MDYxOF07CisJdTY0IG1mY19kYXJfUlc7ICAgICAgICAgICAgICAgICAvKiAweDA2MjAgKi8KKwl1OCBwYWRkaW5nXzA2MjhbMHgwODAwLTB4MDYyOF07CisJdTY0IG1mY19kc2lwcl9SOyAgICAgICAgICAgICAgICAvKiAweDA4MDAgKi8KKwl1OCBwYWRkaW5nXzA4MDhbMHgwODEwLTB4MDgwOF07CisJdTY0IG1mY19sc2Nycl9SOyAgICAgICAgICAgICAgICAvKiAweDA4MTAgKi8KKwl1OCBwYWRkaW5nXzA4MThbMHgwYzAwLTB4MDgxOF07CisJdTY0IG1mY19jZXJfUjsgICAgICAgICAgICAgICAgICAvKiAweDBjMDAgKi8KKwl1OCBwYWRkaW5nXzBjMDhbMHgwZjAwLTB4MGMwOF07CisJdTY0IHNwZV9leGVjdXRpb25fc3RhdHVzOyAgICAgICAvKiAweDBmMDAgKi8KKwl1OCBwYWRkaW5nXzBmMDhbMHgxMDAwLTB4MGYwOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKioKKyAqIGVudW0gc3BlX2V4X3N0YXRlIC0gTG9naWNhbCBzcGUgZXhlY3V0aW9uIHN0YXRlLgorICogQHNwZV9leF9zdGF0ZV91bmV4ZWN1dGFibGU6IFVuaW5pdGlhbGl6ZWQuCisgKiBAc3BlX2V4X3N0YXRlX2V4ZWN1dGFibGU6IEVuYWJsZWQsIG5vdCByZWFkeS4KKyAqIEBzcGVfZXhfc3RhdGVfZXhlY3V0ZWQ6IFJlYWR5IGZvciB1c2UuCisgKgorICogVGhlIGV4ZWN1dGlvbiBzdGF0ZSAoc3RhdHVzKSBvZiB0aGUgbG9naWNhbCBzcGUgYXMgcmVwb3J0ZWQgaW4KKyAqIHN0cnVjdCBzcGVfc2hhZG93OnNwZV9leGVjdXRpb25fc3RhdHVzLgorICovCisKK2VudW0gc3BlX2V4X3N0YXRlIHsKKwlTUEVfRVhfU1RBVEVfVU5FWEVDVVRBQkxFID0gMCwKKwlTUEVfRVhfU1RBVEVfRVhFQ1VUQUJMRSA9IDIsCisJU1BFX0VYX1NUQVRFX0VYRUNVVEVEID0gMywKK307CisKKy8qKgorICogc3RydWN0IHByaXYxX2NhY2hlIC0gQ2FjaGVkIHZhbHVlcyBvZiBwcml2MSByZWdpc3RlcnMuCisgKiBAbWFza3NbXTogQXJyYXkgb2YgY2FjaGVkIHNwZSBpbnRlcnJ1cHQgbWFza3MsIGluZGV4ZWQgYnkgY2xhc3MuCisgKiBAc3IxOiBDYWNoZWQgbWZjX3NyMSByZWdpc3Rlci4KKyAqIEB0Y2xhc3NfaWQ6IENhY2hlZCBtZmNfdGNsYXNzX2lkIHJlZ2lzdGVyLgorICovCisKK3N0cnVjdCBwcml2MV9jYWNoZSB7CisJdTY0IG1hc2tzWzNdOworCXU2NCBzcjE7CisJdTY0IHRjbGFzc19pZDsKK307CisKKy8qKgorICogc3RydWN0IHNwdV9wZGF0YSAtIFBsYXRmb3JtIHN0YXRlIHZhcmlhYmxlcy4KKyAqIEBzcGVfaWQ6IEhWIHNwZSBpZCByZXR1cm5lZCBieSBsdjFfY29uc3RydWN0X2xvZ2ljYWxfc3BlKCkuCisgKiBAcmVzb3VyY2VfaWQ6IEhWIHNwZSByZXNvdXJjZSBpZCByZXR1cm5lZCBieQorICogCXBzM19yZXBvc2l0b3J5X3JlYWRfc3BlX3Jlc291cmNlX2lkKCkuCisgKiBAcHJpdjJfYWRkcjogbHBhciBhZGRyZXNzIG9mIHNwZSBwcml2MiBhcmVhIHJldHVybmVkIGJ5CisgKiAJbHYxX2NvbnN0cnVjdF9sb2dpY2FsX3NwZSgpLgorICogQHNoYWRvd19hZGRyOiBscGFyIGFkZHJlc3Mgb2Ygc3BlIHJlZ2lzdGVyIHNoYWRvdyBhcmVhIHJldHVybmVkIGJ5CisgKiAJbHYxX2NvbnN0cnVjdF9sb2dpY2FsX3NwZSgpLgorICogQHNoYWRvdzogVmlydHVhbCAoaW9yZW1hcCkgYWRkcmVzcyBvZiBzcGUgcmVnaXN0ZXIgc2hhZG93IGFyZWEuCisgKiBAY2FjaGU6IENhY2hlZCB2YWx1ZXMgb2YgcHJpdjEgcmVnaXN0ZXJzLgorICovCisKK3N0cnVjdCBzcHVfcGRhdGEgeworCXU2NCBzcGVfaWQ7CisJdTY0IHJlc291cmNlX2lkOworCXU2NCBwcml2Ml9hZGRyOworCXU2NCBzaGFkb3dfYWRkcjsKKwlzdHJ1Y3Qgc3BlX3NoYWRvdyBfX2lvbWVtICpzaGFkb3c7CisJc3RydWN0IHByaXYxX2NhY2hlIGNhY2hlOworfTsKKworc3RhdGljIHN0cnVjdCBzcHVfcGRhdGEgKnNwdV9wZGF0YShzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIHNwdS0+cGRhdGE7Cit9CisKKyNkZWZpbmUgZHVtcF9hcmVhcyhfYSwgX2IsIF9jLCBfZCwgX2UpIFwKKwlfZHVtcF9hcmVhcyhfYSwgX2IsIF9jLCBfZCwgX2UsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kdW1wX2FyZWFzKHVuc2lnbmVkIGludCBzcGVfaWQsIHVuc2lnbmVkIGxvbmcgcHJpdjIsCisJdW5zaWduZWQgbG9uZyBwcm9ibGVtLCB1bnNpZ25lZCBsb25nIGxzLCB1bnNpZ25lZCBsb25nIHNoYWRvdywKKwljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3sKKwlwcl9kZWJ1ZygiJXM6JWQ6IHNwZV9pZDogICV4aCAoJXUpXG4iLCBmdW5jLCBsaW5lLCBzcGVfaWQsIHNwZV9pZCk7CisJcHJfZGVidWcoIiVzOiVkOiBwcml2MjogICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBwcml2Mik7CisJcHJfZGVidWcoIiVzOiVkOiBwcm9ibGVtOiAlbHhoXG4iLCBmdW5jLCBsaW5lLCBwcm9ibGVtKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGxzOiAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGxzKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHNoYWRvdzogICVseGhcbiIsIGZ1bmMsIGxpbmUsIHNoYWRvdyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF92YXNfaWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlkOworCisJbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmaWQpOworCWx2MV9nZXRfdmlydHVhbF9hZGRyZXNzX3NwYWNlX2lkX29mX3BwZShpZCwgJmlkKTsKKworCXJldHVybiBpZDsKK30KKworc3RhdGljIGludCBfX2luaXQgY29uc3RydWN0X3NwdShzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHVudXNlZDsKKworCXJlc3VsdCA9IGx2MV9jb25zdHJ1Y3RfbG9naWNhbF9zcGUoUEFHRV9TSElGVCwgUEFHRV9TSElGVCwgUEFHRV9TSElGVCwKKwkJUEFHRV9TSElGVCwgUEFHRV9TSElGVCwgZ2V0X3Zhc19pZCgpLCBTUEVfVFlQRV9MT0dJQ0FMLAorCQkmc3B1X3BkYXRhKHNwdSktPnByaXYyX2FkZHIsICZzcHUtPnByb2JsZW1fcGh5cywKKwkJJnNwdS0+bG9jYWxfc3RvcmVfcGh5cywgJnVudXNlZCwKKwkJJnNwdV9wZGF0YShzcHUpLT5zaGFkb3dfYWRkciwKKwkJJnNwdV9wZGF0YShzcHUpLT5zcGVfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25zdHJ1Y3RfbG9naWNhbF9zcGUgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZGRfc3B1X3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm47CisJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKKwlzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0YTsKKwlzdHJ1Y3Qgem9uZSAqem9uZTsKKworCUJVR19PTighbWVtX2luaXRfZG9uZSk7CisKKwlzdGFydF9wZm4gPSBzdGFydF9hZGRyID4+IFBBR0VfU0hJRlQ7CisJbnJfcGFnZXMgPSAoc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisKKwlwZ2RhdGEgPSBOT0RFX0RBVEEoMCk7CisJem9uZSA9IHBnZGF0YS0+bm9kZV96b25lczsKKworCXJlc3VsdCA9IF9fYWRkX3BhZ2VzKHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOworCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkOiBfX2FkZF9wYWdlcyBmYWlsZWQ6ICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzcHVfdW5tYXAoc3RydWN0IHNwdSAqc3B1KQoreworCWlvdW5tYXAoc3B1LT5wcml2Mik7CisJaW91bm1hcChzcHUtPnByb2JsZW0pOworCWlvdW5tYXAoKF9fZm9yY2UgdTggX19pb21lbSAqKXNwdS0+bG9jYWxfc3RvcmUpOworCWlvdW5tYXAoc3B1X3BkYXRhKHNwdSktPnNoYWRvdyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2FyZWFzKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3QgdGFibGUge2NoYXIqIG5hbWU7IHVuc2lnbmVkIGxvbmcgYWRkcjsgdW5zaWduZWQgbG9uZyBzaXplO307CisJaW50IHJlc3VsdDsKKworCS8qIHNldHVwIHBhZ2VzICovCisKKwlyZXN1bHQgPSBhZGRfc3B1X3BhZ2VzKHNwdS0+bG9jYWxfc3RvcmVfcGh5cywgTFNfU0laRSk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX2FkZDsKKworCXJlc3VsdCA9IGFkZF9zcHVfcGFnZXMoc3B1LT5wcm9ibGVtX3BoeXMsIHNpemVvZihzdHJ1Y3Qgc3B1X3Byb2JsZW0pKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfYWRkOworCisJLyogaW9yZW1hcCAqLworCisJc3B1X3BkYXRhKHNwdSktPnNoYWRvdyA9IF9faW9yZW1hcCgKKwkJc3B1X3BkYXRhKHNwdSktPnNoYWRvd19hZGRyLCBzaXplb2Yoc3RydWN0IHNwZV9zaGFkb3cpLAorCQlQQUdFX1JFQURPTkxZIHwgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKKwlpZiAoIXNwdV9wZGF0YShzcHUpLT5zaGFkb3cpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIHNoYWRvdyBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9pb3JlbWFwOworCX0KKworCXNwdS0+bG9jYWxfc3RvcmUgPSBpb3JlbWFwKHNwdS0+bG9jYWxfc3RvcmVfcGh5cywgTFNfU0laRSk7CisJaWYgKCFzcHUtPmxvY2FsX3N0b3JlKSB7CisJCXByX2RlYnVnKCIlczolZDogaW9yZW1hcCBsb2NhbF9zdG9yZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfaW9yZW1hcDsKKwl9CisKKwlzcHUtPnByb2JsZW0gPSBpb3JlbWFwKHNwdS0+cHJvYmxlbV9waHlzLAorCQlzaXplb2Yoc3RydWN0IHNwdV9wcm9ibGVtKSk7CisJaWYgKCFzcHUtPnByb2JsZW0pIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIHByb2JsZW0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfaW9yZW1hcDsKKwl9CisKKwlzcHUtPnByaXYyID0gaW9yZW1hcChzcHVfcGRhdGEoc3B1KS0+cHJpdjJfYWRkciwKKwkJc2l6ZW9mKHN0cnVjdCBzcHVfcHJpdjIpKTsKKwlpZiAoIXNwdS0+cHJpdjIpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIHByaXYyIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2lvcmVtYXA7CisJfQorCisJZHVtcF9hcmVhcyhzcHVfcGRhdGEoc3B1KS0+c3BlX2lkLCBzcHVfcGRhdGEoc3B1KS0+cHJpdjJfYWRkciwKKwkJc3B1LT5wcm9ibGVtX3BoeXMsIHNwdS0+bG9jYWxfc3RvcmVfcGh5cywKKwkJc3B1X3BkYXRhKHNwdSktPnNoYWRvd19hZGRyKTsKKwlkdW1wX2FyZWFzKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsICh1bnNpZ25lZCBsb25nKXNwdS0+cHJpdjIsCisJCSh1bnNpZ25lZCBsb25nKXNwdS0+cHJvYmxlbSwgKHVuc2lnbmVkIGxvbmcpc3B1LT5sb2NhbF9zdG9yZSwKKwkJKHVuc2lnbmVkIGxvbmcpc3B1X3BkYXRhKHNwdSktPnNoYWRvdyk7CisKKwlyZXR1cm4gMDsKKworZmFpbF9pb3JlbWFwOgorCXNwdV91bm1hcChzcHUpOworZmFpbF9hZGQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfaW50ZXJydXB0cyhzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHBzM19hbGxvY19zcGVfaXJxKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsIDAsCisJCSZzcHUtPmlycXNbMF0pOworCisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX2FsbG9jXzA7CisKKwlyZXN1bHQgPSBwczNfYWxsb2Nfc3BlX2lycShzcHVfcGRhdGEoc3B1KS0+c3BlX2lkLCAxLAorCQkmc3B1LT5pcnFzWzFdKTsKKworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9hbGxvY18xOworCisJcmVzdWx0ID0gcHMzX2FsbG9jX3NwZV9pcnEoc3B1X3BkYXRhKHNwdSktPnNwZV9pZCwgMiwKKwkJJnNwdS0+aXJxc1syXSk7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfYWxsb2NfMjsKKworCXJldHVybiByZXN1bHQ7CisKK2ZhaWxfYWxsb2NfMjoKKwlwczNfZnJlZV9zcGVfaXJxKHNwdS0+aXJxc1sxXSk7CitmYWlsX2FsbG9jXzE6CisJcHMzX2ZyZWVfc3BlX2lycShzcHUtPmlycXNbMF0pOworZmFpbF9hbGxvY18wOgorCXNwdS0+aXJxc1swXSA9IHNwdS0+aXJxc1sxXSA9IHNwdS0+aXJxc1syXSA9IE5PX0lSUTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBlbmFibGVfc3B1KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gbHYxX2VuYWJsZV9sb2dpY2FsX3NwZShzcHVfcGRhdGEoc3B1KS0+c3BlX2lkLAorCQlzcHVfcGRhdGEoc3B1KS0+cmVzb3VyY2VfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9lbmFibGVfbG9naWNhbF9zcGUgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJZ290byBmYWlsX2VuYWJsZTsKKwl9CisKKwlyZXN1bHQgPSBzZXR1cF9hcmVhcyhzcHUpOworCisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX2FyZWFzOworCisJcmVzdWx0ID0gc2V0dXBfaW50ZXJydXB0cyhzcHUpOworCisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX2ludGVycnVwdHM7CisKKwlyZXR1cm4gMDsKKworZmFpbF9pbnRlcnJ1cHRzOgorCXNwdV91bm1hcChzcHUpOworZmFpbF9hcmVhczoKKwlsdjFfZGlzYWJsZV9sb2dpY2FsX3NwZShzcHVfcGRhdGEoc3B1KS0+c3BlX2lkLCAwKTsKK2ZhaWxfZW5hYmxlOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX2Rlc3Ryb3lfc3B1KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlpbnQgcmVzdWx0OworCisJcHJfZGVidWcoIiVzOiVkIHNwdV8lZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBzcHUtPm51bWJlcik7CisKKwlyZXN1bHQgPSBsdjFfZGlzYWJsZV9sb2dpY2FsX3NwZShzcHVfcGRhdGEoc3B1KS0+c3BlX2lkLCAwKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXBzM19mcmVlX3NwZV9pcnEoc3B1LT5pcnFzWzJdKTsKKwlwczNfZnJlZV9zcGVfaXJxKHNwdS0+aXJxc1sxXSk7CisJcHMzX2ZyZWVfc3BlX2lycShzcHUtPmlycXNbMF0pOworCisJc3B1LT5pcnFzWzBdID0gc3B1LT5pcnFzWzFdID0gc3B1LT5pcnFzWzJdID0gTk9fSVJROworCisJc3B1X3VubWFwKHNwdSk7CisKKwlyZXN1bHQgPSBsdjFfZGVzdHJ1Y3RfbG9naWNhbF9zcGUoc3B1X3BkYXRhKHNwdSktPnNwZV9pZCk7CisJQlVHX09OKHJlc3VsdCk7CisKKwlrZnJlZShzcHUtPnBkYXRhKTsKKwlzcHUtPnBkYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfY3JlYXRlX3NwdShzdHJ1Y3Qgc3B1ICpzcHUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJlc3VsdDsKKworCXByX2RlYnVnKCIlczolZCBzcHVfJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgc3B1LT5udW1iZXIpOworCisJc3B1LT5wZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzcHVfcGRhdGEpLAorCQlHRlBfS0VSTkVMKTsKKworCWlmICghc3B1LT5wZGF0YSkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfbWFsbG9jOworCX0KKworCXNwdV9wZGF0YShzcHUpLT5yZXNvdXJjZV9pZCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisKKwkvKiBJbml0IGNhY2hlZCByZWcgdmFsdWVzIHRvIEhWIGRlZmF1bHRzLiAqLworCisJc3B1X3BkYXRhKHNwdSktPmNhY2hlLnNyMSA9IDB4MzM7CisKKwlyZXN1bHQgPSBjb25zdHJ1Y3Rfc3B1KHNwdSk7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfY29uc3RydWN0OworCisJLyogRm9yIG5vdywganVzdCBnbyBhaGVhZCBhbmQgZW5hYmxlIGl0LiAqLworCisJcmVzdWx0ID0gZW5hYmxlX3NwdShzcHUpOworCisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX2VuYWJsZTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgc3B1IGlzIGluIFNQRV9FWF9TVEFURV9FWEVDVVRFRC4gKi8KKworCS8qIG5lZWQgc29tZXRoaW5nIGJldHRlciBoZXJlISEhICovCisJd2hpbGUgKGluX2JlNjQoJnNwdV9wZGF0YShzcHUpLT5zaGFkb3ctPnNwZV9leGVjdXRpb25fc3RhdHVzKQorCQkhPSBTUEVfRVhfU1RBVEVfRVhFQ1VURUQpCisJCSh2b2lkKTA7CisKKwlyZXR1cm4gcmVzdWx0OworCitmYWlsX2VuYWJsZToKK2ZhaWxfY29uc3RydWN0OgorCXBzM19kZXN0cm95X3NwdShzcHUpOworZmFpbF9tYWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX2VudW1lcmF0ZV9zcHVzKGludCAoKmZuKSh2b2lkICpkYXRhKSkKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGludCBudW1fcmVzb3VyY2VfaWQ7CisJdW5zaWduZWQgaW50IGk7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX251bV9zcHVfcmVzb3VyY2VfaWQoJm51bV9yZXNvdXJjZV9pZCk7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IG51bV9yZXNvdXJjZV9pZCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQludW1fcmVzb3VyY2VfaWQpOworCisJLyoKKwkgKiBGb3Igbm93LCBqdXN0IGNyZWF0ZSBsb2dpY2FsIHNwdXMgZXF1YWwgdG8gdGhlIG51bWJlcgorCSAqIG9mIHBoeXNpY2FsIHNwdXMgcmVzZXJ2ZWQgZm9yIHRoZSBwYXJ0aXRpb24uCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jlc291cmNlX2lkOyBpKyspIHsKKwkJZW51bSBwczNfc3B1X3Jlc291cmNlX3R5cGUgcmVzb3VyY2VfdHlwZTsKKwkJdW5zaWduZWQgaW50IHJlc291cmNlX2lkOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3B1X3Jlc291cmNlX2lkKGksCisJCQkmcmVzb3VyY2VfdHlwZSwgJnJlc291cmNlX2lkKTsKKworCQlpZiAocmVzdWx0KQorCQkJYnJlYWs7CisKKwkJaWYgKHJlc291cmNlX3R5cGUgPT0gUFMzX1NQVV9SRVNPVVJDRV9UWVBFX0VYQ0xVU0lWRSkgeworCQkJcmVzdWx0ID0gZm4oKHZvaWQqKSh1bnNpZ25lZCBsb25nKXJlc291cmNlX2lkKTsKKworCQkJaWYgKHJlc3VsdCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXN1bHQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkOiBFcnJvciBpbml0aWFsaXppbmcgc3B1c1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBzdHJ1Y3Qgc3B1X21hbmFnZW1lbnRfb3BzIHNwdV9tYW5hZ2VtZW50X3BzM19vcHMgPSB7CisJLmVudW1lcmF0ZV9zcHVzID0gcHMzX2VudW1lcmF0ZV9zcHVzLAorCS5jcmVhdGVfc3B1ID0gcHMzX2NyZWF0ZV9zcHUsCisJLmRlc3Ryb3lfc3B1ID0gcHMzX2Rlc3Ryb3lfc3B1LAorfTsKKworLyogc3B1X3ByaXYxX29wcyAqLworCitzdGF0aWMgdm9pZCBpbnRfbWFza19hbmQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKQoreworCXU2NCBvbGRfbWFzazsKKworCS8qIGFyZSB0aGVzZSBzZXJpYWxpemVkIGJ5IGNhbGxlcj8/PyAqLworCW9sZF9tYXNrID0gc3B1X2ludF9tYXNrX2dldChzcHUsIGNsYXNzKTsKKwlzcHVfaW50X21hc2tfc2V0KHNwdSwgY2xhc3MsIG9sZF9tYXNrICYgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGludF9tYXNrX29yKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzaykKK3sKKwl1NjQgb2xkX21hc2s7CisKKwlvbGRfbWFzayA9IHNwdV9pbnRfbWFza19nZXQoc3B1LCBjbGFzcyk7CisJc3B1X2ludF9tYXNrX3NldChzcHUsIGNsYXNzLCBvbGRfbWFzayB8IG1hc2spOworfQorCitzdGF0aWMgdm9pZCBpbnRfbWFza19zZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKQoreworCXNwdV9wZGF0YShzcHUpLT5jYWNoZS5tYXNrc1tjbGFzc10gPSBtYXNrOworCWx2MV9zZXRfc3BlX2ludGVycnVwdF9tYXNrKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsIGNsYXNzLAorCQlzcHVfcGRhdGEoc3B1KS0+Y2FjaGUubWFza3NbY2xhc3NdKTsKK30KKworc3RhdGljIHU2NCBpbnRfbWFza19nZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpCit7CisJcmV0dXJuIHNwdV9wZGF0YShzcHUpLT5jYWNoZS5tYXNrc1tjbGFzc107Cit9CisKK3N0YXRpYyB2b2lkIGludF9zdGF0X2NsZWFyKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgc3RhdCkKK3sKKwkvKiBOb3RlIHRoYXQgTUZDX0RTSVNSIHdpbGwgYmUgY2xlYXJlZCB3aGVuIGNsYXNzMVtNRl0gaXMgc2V0LiAqLworCisJbHYxX2NsZWFyX3NwZV9pbnRlcnJ1cHRfc3RhdHVzKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsIGNsYXNzLAorCQlzdGF0LCAwKTsKK30KKworc3RhdGljIHU2NCBpbnRfc3RhdF9nZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpCit7CisJdTY0IHN0YXQ7CisKKwlsdjFfZ2V0X3NwZV9pbnRlcnJ1cHRfc3RhdHVzKHNwdV9wZGF0YShzcHUpLT5zcGVfaWQsIGNsYXNzLCAmc3RhdCk7CisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9hZmZpbml0eV9zZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY3B1KQoreworCS8qIE5vIHN1cHBvcnQuICovCit9CisKK3N0YXRpYyB1NjQgbWZjX2Rhcl9nZXQoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiBpbl9iZTY0KCZzcHVfcGRhdGEoc3B1KS0+c2hhZG93LT5tZmNfZGFyX1JXKTsKK30KKworc3RhdGljIHZvaWQgbWZjX2RzaXNyX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBkc2lzcikKK3sKKwkvKiBOb3RoaW5nIHRvIGRvLCBjbGVhcmVkIGluIGludF9zdGF0X2NsZWFyKCkuICovCit9CisKK3N0YXRpYyB1NjQgbWZjX2RzaXNyX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIGluX2JlNjQoJnNwdV9wZGF0YShzcHUpLT5zaGFkb3ctPm1mY19kc2lzcl9SVyk7Cit9CisKK3N0YXRpYyB2b2lkIG1mY19zZHJfc2V0dXAoc3RydWN0IHNwdSAqc3B1KQoreworCS8qIE5vdGhpbmcgdG8gZG8uICovCit9CisKK3N0YXRpYyB2b2lkIG1mY19zcjFfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNyMSkKK3sKKwkvKiBDaGVjayBiaXRzIGFsbG93ZWQgYnkgSFYuICovCisKKwlzdGF0aWMgY29uc3QgdTY0IGFsbG93ZWQgPSB+KE1GQ19TVEFURTFfTE9DQUxfU1RPUkFHRV9ERUNPREVfTUFTSworCQl8IE1GQ19TVEFURTFfUFJPQkxFTV9TVEFURV9NQVNLKTsKKworCUJVR19PTigoc3IxICYgYWxsb3dlZCkgIT0gKHNwdV9wZGF0YShzcHUpLT5jYWNoZS5zcjEgJiBhbGxvd2VkKSk7CisKKwlzcHVfcGRhdGEoc3B1KS0+Y2FjaGUuc3IxID0gc3IxOworCWx2MV9zZXRfc3BlX3ByaXZpbGVnZV9zdGF0ZV9hcmVhXzFfcmVnaXN0ZXIoCisJCXNwdV9wZGF0YShzcHUpLT5zcGVfaWQsCisJCW9mZnNldG9mKHN0cnVjdCBzcHVfcHJpdjEsIG1mY19zcjFfUlcpLAorCQlzcHVfcGRhdGEoc3B1KS0+Y2FjaGUuc3IxKTsKK30KKworc3RhdGljIHU2NCBtZmNfc3IxX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIHNwdV9wZGF0YShzcHUpLT5jYWNoZS5zcjE7Cit9CisKK3N0YXRpYyB2b2lkIG1mY190Y2xhc3NfaWRfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IHRjbGFzc19pZCkKK3sKKwlzcHVfcGRhdGEoc3B1KS0+Y2FjaGUudGNsYXNzX2lkID0gdGNsYXNzX2lkOworCWx2MV9zZXRfc3BlX3ByaXZpbGVnZV9zdGF0ZV9hcmVhXzFfcmVnaXN0ZXIoCisJCXNwdV9wZGF0YShzcHUpLT5zcGVfaWQsCisJCW9mZnNldG9mKHN0cnVjdCBzcHVfcHJpdjEsIG1mY190Y2xhc3NfaWRfUlcpLAorCQlzcHVfcGRhdGEoc3B1KS0+Y2FjaGUudGNsYXNzX2lkKTsKK30KKworc3RhdGljIHU2NCBtZmNfdGNsYXNzX2lkX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIHNwdV9wZGF0YShzcHUpLT5jYWNoZS50Y2xhc3NfaWQ7Cit9CisKK3N0YXRpYyB2b2lkIHRsYl9pbnZhbGlkYXRlKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvLiAqLworfQorCitzdGF0aWMgdm9pZCByZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IGlkKQoreworCS8qIE5vIHN1cHBvcnQuICovCit9CisKK3N0YXRpYyB1NjQgcmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIDA7IC8qIE5vIHN1cHBvcnQuICovCit9CisKK3N0YXRpYyB2b2lkIHJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBlbmFibGUpCit7CisJLyogTm8gc3VwcG9ydC4gKi8KK30KKworc3RhdGljIHU2NCByZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9nZXQoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiAwOyAvKiBObyBzdXBwb3J0LiAqLworfQorCitjb25zdCBzdHJ1Y3Qgc3B1X3ByaXYxX29wcyBzcHVfcHJpdjFfcHMzX29wcyA9IHsKKwkuaW50X21hc2tfYW5kID0gaW50X21hc2tfYW5kLAorCS5pbnRfbWFza19vciA9IGludF9tYXNrX29yLAorCS5pbnRfbWFza19zZXQgPSBpbnRfbWFza19zZXQsCisJLmludF9tYXNrX2dldCA9IGludF9tYXNrX2dldCwKKwkuaW50X3N0YXRfY2xlYXIgPSBpbnRfc3RhdF9jbGVhciwKKwkuaW50X3N0YXRfZ2V0ID0gaW50X3N0YXRfZ2V0LAorCS5jcHVfYWZmaW5pdHlfc2V0ID0gY3B1X2FmZmluaXR5X3NldCwKKwkubWZjX2Rhcl9nZXQgPSBtZmNfZGFyX2dldCwKKwkubWZjX2RzaXNyX3NldCA9IG1mY19kc2lzcl9zZXQsCisJLm1mY19kc2lzcl9nZXQgPSBtZmNfZHNpc3JfZ2V0LAorCS5tZmNfc2RyX3NldHVwID0gbWZjX3Nkcl9zZXR1cCwKKwkubWZjX3NyMV9zZXQgPSBtZmNfc3IxX3NldCwKKwkubWZjX3NyMV9nZXQgPSBtZmNfc3IxX2dldCwKKwkubWZjX3RjbGFzc19pZF9zZXQgPSBtZmNfdGNsYXNzX2lkX3NldCwKKwkubWZjX3RjbGFzc19pZF9nZXQgPSBtZmNfdGNsYXNzX2lkX2dldCwKKwkudGxiX2ludmFsaWRhdGUgPSB0bGJfaW52YWxpZGF0ZSwKKwkucmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX3NldCA9IHJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQsCisJLnJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9nZXQgPSByZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0LAorCS5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQgPSByZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQsCisJLnJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX2dldCA9IHJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX2dldCwKK307CisKK3ZvaWQgcHMzX3NwdV9zZXRfcGxhdGZvcm0odm9pZCkKK3sKKwlzcHVfcHJpdjFfb3BzID0gJnNwdV9wcml2MV9wczNfb3BzOworCXNwdV9tYW5hZ2VtZW50X29wcyA9ICZzcHVfbWFuYWdlbWVudF9wczNfb3BzOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvdGltZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWU4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiAgUFMzIHRpbWUgYW5kIHJ0YyByb3V0aW5lcy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS9ydGMuaD4KKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9wczMuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKyNkZWZpbmUgZHVtcF90bShfYSkgX2R1bXBfdG0oX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9kdW1wX3RtKGNvbnN0IHN0cnVjdCBydGNfdGltZSAqdG0sIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZCB0bV9zZWMgICVkXG4iLCBmdW5jLCBsaW5lLCB0bS0+dG1fc2VjKTsKKwlwcl9kZWJ1ZygiJXM6JWQgdG1fbWluICAlZFxuIiwgZnVuYywgbGluZSwgdG0tPnRtX21pbik7CisJcHJfZGVidWcoIiVzOiVkIHRtX2hvdXIgJWRcbiIsIGZ1bmMsIGxpbmUsIHRtLT50bV9ob3VyKTsKKwlwcl9kZWJ1ZygiJXM6JWQgdG1fbWRheSAlZFxuIiwgZnVuYywgbGluZSwgdG0tPnRtX21kYXkpOworCXByX2RlYnVnKCIlczolZCB0bV9tb24gICVkXG4iLCBmdW5jLCBsaW5lLCB0bS0+dG1fbW9uKTsKKwlwcl9kZWJ1ZygiJXM6JWQgdG1feWVhciAlZFxuIiwgZnVuYywgbGluZSwgdG0tPnRtX3llYXIpOworCXByX2RlYnVnKCIlczolZCB0bV93ZGF5ICVkXG4iLCBmdW5jLCBsaW5lLCB0bS0+dG1fd2RheSk7Cit9CisKKyNkZWZpbmUgZHVtcF90aW1lKF9hKSBfZHVtcF90aW1lKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfdGltZShpbnQgdGltZSwgY29uc3QgY2hhciogZnVuYywKKwlpbnQgbGluZSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwl0b190bSh0aW1lLCAmdG0pOworCisJcHJfZGVidWcoIiVzOiVkIHRpbWUgICAgJWRcbiIsIGZ1bmMsIGxpbmUsIHRpbWUpOworCV9kdW1wX3RtKCZ0bSwgZnVuYywgbGluZSk7Cit9CisKKy8qKgorICogcnRjX3NoaWZ0IC0gRGlmZmVyZW5jZSBpbiBzZWNvbmRzIGJldHdlZW4gMTk3MCBhbmQgdGhlIHBzMyBydGMgdmFsdWUuCisgKi8KKworc3RhdGljIHM2NCBydGNfc2hpZnQ7CisKK3ZvaWQgX19pbml0IHBzM19jYWxpYnJhdGVfZGVjcih2b2lkKQoreworCWludCByZXN1bHQ7CisJdTY0IHRtcDsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYmVfdGJfZnJlcSgwLCAmdG1wKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXBwY190Yl9mcmVxID0gdG1wOworCXBwY19wcm9jX2ZyZXEgPSBwcGNfdGJfZnJlcSAqIDQwOworCisJcnRjX3NoaWZ0ID0gcHMzX29zX2FyZWFfcnRjX2RpZmYoKTsKK30KKworc3RhdGljIHU2NCByZWFkX3J0Yyh2b2lkKQoreworCWludCByZXN1bHQ7CisJdTY0IHJ0Y192YWw7CisJdTY0IHRiX3ZhbDsKKworCXJlc3VsdCA9IGx2MV9nZXRfcnRjKCZydGNfdmFsLCAmdGJfdmFsKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJldHVybiBydGNfdmFsOworfQorCitpbnQgcHMzX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXU2NCBub3cgPSBta3RpbWUodG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uICsgMSwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJ0Y19zaGlmdCA9IG5vdyAtIHJlYWRfcnRjKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcHMzX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXRvX3RtKHJlYWRfcnRjKCkgKyBydGNfc2hpZnQsIHRtKTsKKwl0bS0+dG1feWVhciAtPSAxOTAwOworCXRtLT50bV9tb24gLT0gMTsKK30KKwordW5zaWduZWQgbG9uZyBfX2luaXQgcHMzX2dldF9ib290X3RpbWUodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9ydGMoKSArIHJ0Y19zaGlmdDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQppbmRleCA5OTcyNDNhLi42OTU5MGZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw4IEBACiBvYmotJChDT05GSUdfU0NBTkxPRykJKz0gc2NhbmxvZy5vCiBvYmotJChDT05GSUdfRUVIKQkrPSBlZWgubyBlZWhfY2FjaGUubyBlZWhfZHJpdmVyLm8gZWVoX2V2ZW50Lm8KIAorb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBob3RwbHVnLWNwdS5vCisKIG9iai0kKENPTkZJR19IVkNfQ09OU09MRSkJKz0gaHZjb25zb2xlLm8KIG9iai0kKENPTkZJR19IVkNTKQkJKz0gaHZjc2VydmVyLm8KIG9iai0kKENPTkZJR19IQ0FMTF9TVEFUUykJKz0gaHZDYWxsX2luc3QubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCmluZGV4IDNjMmQ2M2UuLmRhNmU1MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKQEAgLTMzNyw2ICszMzcsNyBAQAogCQkJcHJpbnRrIChLRVJOX0VSUiAiRUVIOiBEZXZpY2UgZHJpdmVyIGlnbm9yZWQgJWQgYmFkIHJlYWRzLCBwYW5pY2luZ1xuIiwKIAkJCSAgICAgICAgcGRuLT5lZWhfY2hlY2tfY291bnQpOwogCQkJZHVtcF9zdGFjaygpOworCQkJbXNsZWVwKDUwMDApOwogCQkJCiAJCQkvKiByZS1yZWFkIHRoZSBzbG90IHJlc2V0IHN0YXRlICovCiAJCQlpZiAocmVhZF9zbG90X3Jlc2V0X3N0YXRlKHBkbiwgcmV0cykgIT0gMCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwppbmRleCBiNmI0NjJkLi5mMmJhZTA0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAkJCXJldHVybiBwaWFyOwogCQl9CiAJfQotCXBpYXIgPSAoc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9pb19hZGRyX3JhbmdlKSwgR0ZQX0FUT01JQyk7CisJcGlhciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfaW9fYWRkcl9yYW5nZSksIEdGUF9BVE9NSUMpOwogCWlmICghcGlhcikKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCmluZGV4IGMyYmM5OTAuLmNiZDZiMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwpAQCAtMTcwLDE0ICsxNzAsMTkgQEAKIHN0YXRpYyB2b2lkIGVlaF9yZXBvcnRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKnVzZXJkYXRhKQogewogCXN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXIgPSBkZXYtPmRyaXZlcjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CiAKIAlkZXYtPmVycm9yX3N0YXRlID0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsOwogCiAJaWYgKCFkcml2ZXIpCiAJCXJldHVybjsKLQlpZiAoIWRyaXZlci0+ZXJyX2hhbmRsZXIpCi0JCXJldHVybjsKLQlpZiAoIWRyaXZlci0+ZXJyX2hhbmRsZXItPnJlc3VtZSkKKworCWlmICgoUENJX0ROKGRuKS0+ZWVoX21vZGUpICYgRUVIX01PREVfSVJRX0RJU0FCTEVEKSB7CisJCVBDSV9ETihkbiktPmVlaF9tb2RlICY9IH5FRUhfTU9ERV9JUlFfRElTQUJMRUQ7CisJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCX0KKwlpZiAoIWRyaXZlci0+ZXJyX2hhbmRsZXIgfHwKKwkgICAgIWRyaXZlci0+ZXJyX2hhbmRsZXItPnJlc3VtZSkKIAkJcmV0dXJuOwogCiAJZHJpdmVyLT5lcnJfaGFuZGxlci0+cmVzdW1lKGRldik7CkBAIC00MDcsNiArNDEyLDggQEAKIAogCQlpZiAocmMpCiAJCQlyZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOworCQllbHNlCisJCQlyZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7CiAJfQogCiAJLyogSWYgYW55IGRldmljZSBoYXMgYSBoYXJkIGZhaWx1cmUsIHRoZW4gc2h1dCBvZmYgZXZlcnl0aGluZy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYwppbmRleCAxMzcwNzc0Li40OTAzN2VkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2V2ZW50LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jCkBAIC0zNyw4ICszNyw4IEBACiAvKiBFRUggZXZlbnQgd29ya3F1ZXVlIHNldHVwLiAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyhlZWhfZXZlbnRsaXN0X2xvY2spOwogTElTVF9IRUFEKGVlaF9ldmVudGxpc3QpOwotc3RhdGljIHZvaWQgZWVoX3RocmVhZF9sYXVuY2hlcih2b2lkICopOwotREVDTEFSRV9XT1JLKGVlaF9ldmVudF93cSwgZWVoX3RocmVhZF9sYXVuY2hlciwgTlVMTCk7CitzdGF0aWMgdm9pZCBlZWhfdGhyZWFkX2xhdW5jaGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK0RFQ0xBUkVfV09SSyhlZWhfZXZlbnRfd3EsIGVlaF90aHJlYWRfbGF1bmNoZXIpOwogCiAvKiBTZXJpYWxpemUgcmVzZXQgc2VxdWVuY2VzIGZvciBhIGdpdmVuIHBjaSBkZXZpY2UgKi8KIERFRklORV9NVVRFWChlZWhfZXZlbnRfbXV0ZXgpOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgKiBlZWhfdGhyZWFkX2xhdW5jaGVyCiAgKiBAZHVtbXkgLSB1bnVzZWQKICAqLwotc3RhdGljIHZvaWQgZWVoX3RocmVhZF9sYXVuY2hlcih2b2lkICpkdW1teSkKK3N0YXRpYyB2b2lkIGVlaF90aHJlYWRfbGF1bmNoZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKIHsKIAlpZiAoa2VybmVsX3RocmVhZChlZWhfZXZlbnRfaGFuZGxlciwgTlVMTCwgQ0xPTkVfS0VSTkVMKSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHN0YXJ0IEVFSCBkYWVtb25cbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDYwYjljCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBwc2VyaWVzIENQVSBIb3RwbHVnIGluZnJhc3RydWN0dXJlLgorICoKKyAqIFNwbGl0IG91dCBmcm9tIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisgKiAgYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMsIGFuZCBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKKyAqCisgKiBQZXRlciBCZXJnbmVyLCBJQk0JTWFyY2ggMjAwMS4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBJQk0uCisgKiBEYXZlIEVuZ2VicmV0c2VuLCBQZXRlciBCZXJnbmVyLCBhbmQKKyAqIE1pa2UgQ29ycmlnYW4ge2VuZ2VicmV0fGJlcmduZXJ8bWlrZWN9QHVzLmlibS5jb20KKyAqIFBsdXMgdmFyaW91cyBjaGFuZ2VzIGZyb20gb3RoZXIgSUJNIHRlYW1zLi4uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgRWxsZXJtYW4sIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3Zkc29fZGF0YXBhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcFNlcmllc19yZWNvbmZpZy5oPgorI2luY2x1ZGUgInhpY3MuaCIKKworLyogVGhpcyB2ZXJzaW9uIGNhbid0IHRha2UgdGhlIHNwaW5sb2NrLCBiZWNhdXNlIGl0IG5ldmVyIHJldHVybnMgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRhc19hcmdzIHJ0YXNfc3RvcF9zZWxmX2FyZ3MgPSB7CisJLnRva2VuID0gUlRBU19VTktOT1dOX1NFUlZJQ0UsCisJLm5hcmdzID0gMCwKKwkubnJldCA9IDEsCisJLnJldHMgPSAmcnRhc19zdG9wX3NlbGZfYXJncy5hcmdzWzBdLAorfTsKKworc3RhdGljIHZvaWQgcnRhc19zdG9wX3NlbGYodm9pZCkKK3sKKwlzdHJ1Y3QgcnRhc19hcmdzICphcmdzID0gJnJ0YXNfc3RvcF9zZWxmX2FyZ3M7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJQlVHX09OKGFyZ3MtPnRva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKTsKKworCXByaW50aygiY3B1ICV1IChod2lkICV1KSBSZWFkeSB0byBkaWUuLi5cbiIsCisJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkpOworCWVudGVyX3J0YXMoX19wYShhcmdzKSk7CisKKwlwYW5pYygiQWxhcywgSSBzdXJ2aXZlZC5cbiIpOworfQorCitzdGF0aWMgdm9pZCBwc2VyaWVzX21hY2hfY3B1X2RpZSh2b2lkKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJaWRsZV90YXNrX2V4aXQoKTsKKwl4aWNzX3RlYXJkb3duX2NwdSgwKTsKKwlydGFzX3N0b3Bfc2VsZigpOworCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZS4uLiAqLworCUJVRygpOworCWZvcig7Oyk7Cit9CisKK3N0YXRpYyBpbnQgcWNzc190b2s7CS8qIHF1ZXJ5LWNwdS1zdG9wcGVkLXN0YXRlIHRva2VuICovCisKKy8qIEdldCBzdGF0ZSBvZiBwaHlzaWNhbCBDUFUuCisgKiBSZXR1cm4gY29kZXM6CisgKgkwCS0gVGhlIHByb2Nlc3NvciBpcyBpbiB0aGUgUlRBUyBzdG9wcGVkIHN0YXRlCisgKgkxCS0gc3RvcC1zZWxmIGlzIGluIHByb2dyZXNzCisgKgkyCS0gVGhlIHByb2Nlc3NvciBpcyBub3QgaW4gdGhlIFJUQVMgc3RvcHBlZCBzdGF0ZQorICoJLTEJLSBIYXJkd2FyZSBFcnJvcgorICoJLTIJLSBIYXJkd2FyZSBCdXN5LCBUcnkgYWdhaW4gbGF0ZXIuCisgKi8KK3N0YXRpYyBpbnQgcXVlcnlfY3B1X3N0b3BwZWQodW5zaWduZWQgaW50IHBjcHUpCit7CisJaW50IGNwdV9zdGF0dXMsIHN0YXR1czsKKworCXN0YXR1cyA9IHJ0YXNfY2FsbChxY3NzX3RvaywgMSwgMiwgJmNwdV9zdGF0dXMsIHBjcHUpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJSVEFTIHF1ZXJ5LWNwdS1zdG9wcGVkLXN0YXRlIGZhaWxlZDogJWlcbiIsIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIGNwdV9zdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgcHNlcmllc19jcHVfZGlzYWJsZSh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CisJdmRzb19kYXRhLT5wcm9jZXNzb3JDb3VudC0tOworCisJLypmaXggYm9vdF9jcHVpZCBoZXJlKi8KKwlpZiAoY3B1ID09IGJvb3RfY3B1aWQpCisJCWJvb3RfY3B1aWQgPSBhbnlfb25saW5lX2NwdShjcHVfb25saW5lX21hcCk7CisKKwkvKiBGSVhNRTogYWJzdHJhY3QgdGhpcyB0byBub3QgYmUgcGxhdGZvcm0gc3BlY2lmaWMgbGF0ZXIgb24gKi8KKwl4aWNzX21pZ3JhdGVfaXJxc19hd2F5KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBzZXJpZXNfY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWludCB0cmllczsKKwlpbnQgY3B1X3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgcGNwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKworCWZvciAodHJpZXMgPSAwOyB0cmllcyA8IDI1OyB0cmllcysrKSB7CisJCWNwdV9zdGF0dXMgPSBxdWVyeV9jcHVfc3RvcHBlZChwY3B1KTsKKwkJaWYgKGNwdV9zdGF0dXMgPT0gMCB8fCBjcHVfc3RhdHVzID09IC0xKQorCQkJYnJlYWs7CisJCW1zbGVlcCgyMDApOworCX0KKwlpZiAoY3B1X3N0YXR1cyAhPSAwKSB7CisJCXByaW50aygiUXVlcnlpbmcgREVBRD8gY3B1ICVpICglaSkgc2hvd3MgJWlcbiIsCisJCSAgICAgICBjcHUsIHBjcHUsIGNwdV9zdGF0dXMpOworCX0KKworCS8qIElzb2xhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGFyZSBkZWZpbmF0bHkgZG9uZSBieQorCSAqIGRyc2xvdF9jaHJwX2NwdS4gIElmIHRoZXkgd2VyZSBub3QgdGhleSB3b3VsZCBiZQorCSAqIGRvbmUgaGVyZS4gIENoYW5nZSBpc29sYXRlIHN0YXRlIHRvIElzb2xhdGUgYW5kCisJICogY2hhbmdlIGFsbG9jYXRpb24tc3RhdGUgdG8gVW51c2FibGUuCisJICovCisJcGFjYVtjcHVdLmNwdV9zdGFydCA9IDA7Cit9CisKKy8qCisgKiBVcGRhdGUgY3B1X3ByZXNlbnRfbWFwIGFuZCBwYWNhKHMpIGZvciBhIG5ldyBjcHUgbm9kZS4gIFRoZSB3cmlua2xlCisgKiBoZXJlIGlzIHRoYXQgYSBjcHUgZGV2aWNlIG5vZGUgbWF5IHJlcHJlc2VudCB1cCB0byB0d28gbG9naWNhbCBjcHVzCisgKiBpbiB0aGUgU01UIGNhc2UuICBXZSBtdXN0IGhvbm9yIHRoZSBhc3N1bXB0aW9uIGluIG90aGVyIGNvZGUgdGhhdAorICogdGhlIGxvZ2ljYWwgaWRzIGZvciBzaWJsaW5nIFNNVCB0aHJlYWRzIHggYW5kIHkgYXJlIGFkamFjZW50LCBzdWNoCisgKiB0aGF0IHheMSA9PSB5IGFuZCB5XjEgPT0geC4KKyAqLworc3RhdGljIGludCBwc2VyaWVzX2FkZF9wcm9jZXNzb3Ioc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCWNwdW1hc2tfdCBjYW5kaWRhdGVfbWFwLCB0bXAgPSBDUFVfTUFTS19OT05FOworCWludCBlcnIgPSAtRU5PU1BDLCBsZW4sIG50aHJlYWRzLCBpOworCWNvbnN0IHUzMiAqaW50c2VydjsKKworCWludHNlcnYgPSBnZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOworCWlmICghaW50c2VydikKKwkJcmV0dXJuIDA7CisKKwludGhyZWFkcyA9IGxlbiAvIHNpemVvZih1MzIpOworCWZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKQorCQljcHVfc2V0KGksIHRtcCk7CisKKwlsb2NrX2NwdV9ob3RwbHVnKCk7CisKKwlCVUdfT04oIWNwdXNfc3Vic2V0KGNwdV9wcmVzZW50X21hcCwgY3B1X3Bvc3NpYmxlX21hcCkpOworCisJLyogR2V0IGEgYml0bWFwIG9mIHVub2NjdXBpZWQgc2xvdHMuICovCisJY3B1c194b3IoY2FuZGlkYXRlX21hcCwgY3B1X3Bvc3NpYmxlX21hcCwgY3B1X3ByZXNlbnRfbWFwKTsKKwlpZiAoY3B1c19lbXB0eShjYW5kaWRhdGVfbWFwKSkgeworCQkvKiBJZiB3ZSBnZXQgaGVyZSwgaXQgbW9zdCBsaWtlbHkgbWVhbnMgdGhhdCBOUl9DUFVTIGlzCisJCSAqIGxlc3MgdGhhbiB0aGUgcGFydGl0aW9uJ3MgbWF4IHByb2Nlc3NvcnMgc2V0dGluZy4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGFkZCBjcHUgJXM7IHRoaXMgc3lzdGVtIGNvbmZpZ3VyYXRpb24iCisJCSAgICAgICAiIHN1cHBvcnRzICVkIGxvZ2ljYWwgY3B1cy5cbiIsIG5wLT5mdWxsX25hbWUsCisJCSAgICAgICBjcHVzX3dlaWdodChjcHVfcG9zc2libGVfbWFwKSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl3aGlsZSAoIWNwdXNfZW1wdHkodG1wKSkKKwkJaWYgKGNwdXNfc3Vic2V0KHRtcCwgY2FuZGlkYXRlX21hcCkpCisJCQkvKiBGb3VuZCBhIHJhbmdlIHdoZXJlIHdlIGNhbiBpbnNlcnQgdGhlIG5ldyBjcHUocykgKi8KKwkJCWJyZWFrOworCQllbHNlCisJCQljcHVzX3NoaWZ0X2xlZnQodG1wLCB0bXAsIG50aHJlYWRzKTsKKworCWlmIChjcHVzX2VtcHR5KHRtcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZmluZCBzcGFjZSBpbiBjcHVfcHJlc2VudF9tYXAgZm9yIgorCQkgICAgICAgIiBwcm9jZXNzb3IgJXMgd2l0aCAlZCB0aHJlYWQocylcbiIsIG5wLT5uYW1lLAorCQkgICAgICAgbnRocmVhZHMpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCB0bXApIHsKKwkJQlVHX09OKGNwdV9pc3NldChjcHUsIGNwdV9wcmVzZW50X21hcCkpOworCQljcHVfc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwkJc2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUsICppbnRzZXJ2KyspOworCX0KKwllcnIgPSAwOworb3V0X3VubG9jazoKKwl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVXBkYXRlIHRoZSBwcmVzZW50IG1hcCBmb3IgYSBjcHUgbm9kZSB3aGljaCBpcyBnb2luZyBhd2F5LCBhbmQgc2V0CisgKiB0aGUgaGFyZCBpZCBpbiB0aGUgcGFjYShzKSB0byAtMSB0byBiZSBjb25zaXN0ZW50IHdpdGggYm9vdCB0aW1lCisgKiBjb252ZW50aW9uIGZvciBub24tcHJlc2VudCBjcHVzLgorICovCitzdGF0aWMgdm9pZCBwc2VyaWVzX3JlbW92ZV9wcm9jZXNzb3Ioc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCWludCBsZW4sIG50aHJlYWRzLCBpOworCWNvbnN0IHUzMiAqaW50c2VydjsKKworCWludHNlcnYgPSBnZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOworCWlmICghaW50c2VydikKKwkJcmV0dXJuOworCisJbnRocmVhZHMgPSBsZW4gLyBzaXplb2YodTMyKTsKKworCWxvY2tfY3B1X2hvdHBsdWcoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKKwkJCWlmIChnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSkgIT0gaW50c2VydltpXSkKKwkJCQljb250aW51ZTsKKwkJCUJVR19PTihjcHVfb25saW5lKGNwdSkpOworCQkJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwkJCXNldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1LCAtMSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY3B1ID09IE5SX0NQVVMpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgZmluZCBjcHUgdG8gcmVtb3ZlICIKKwkJCSAgICAgICAid2l0aCBwaHlzaWNhbCBpZCAweCV4XG4iLCBpbnRzZXJ2W2ldKTsKKwl9CisJdW5sb2NrX2NwdV9ob3RwbHVnKCk7Cit9CisKK3N0YXRpYyBpbnQgcHNlcmllc19zbXBfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqbm9kZSkKK3sKKwlpbnQgZXJyID0gTk9USUZZX09LOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFBTRVJJRVNfUkVDT05GSUdfQUREOgorCQlpZiAocHNlcmllc19hZGRfcHJvY2Vzc29yKG5vZGUpKQorCQkJZXJyID0gTk9USUZZX0JBRDsKKwkJYnJlYWs7CisJY2FzZSBQU0VSSUVTX1JFQ09ORklHX1JFTU9WRToKKwkJcHNlcmllc19yZW1vdmVfcHJvY2Vzc29yKG5vZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSBOT1RJRllfRE9ORTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHNlcmllc19zbXBfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBwc2VyaWVzX3NtcF9ub3RpZmllciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBzZXJpZXNfY3B1X2hvdHBsdWdfaW5pdCh2b2lkKQoreworCXJ0YXNfc3RvcF9zZWxmX2FyZ3MudG9rZW4gPSBydGFzX3Rva2VuKCJzdG9wLXNlbGYiKTsKKwlxY3NzX3RvayA9IHJ0YXNfdG9rZW4oInF1ZXJ5LWNwdS1zdG9wcGVkLXN0YXRlIik7CisKKwlpZiAocnRhc19zdG9wX3NlbGZfYXJncy50b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSB8fAorCQkJcWNzc190b2sgPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIEhvdHBsdWcgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZSAiCisJCQkJIi0gZGlzYWJsaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXBwY19tZC5jcHVfZGllID0gcHNlcmllc19tYWNoX2NwdV9kaWU7CisJc21wX29wcy0+Y3B1X2Rpc2FibGUgPSBwc2VyaWVzX2NwdV9kaXNhYmxlOworCXNtcF9vcHMtPmNwdV9kaWUgPSBwc2VyaWVzX2NwdV9kaWU7CisKKwkvKiBQcm9jZXNzb3JzIGNhbiBiZSBhZGRlZC9yZW1vdmVkIG9ubHkgb24gTFBBUiAqLworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQorCQlwU2VyaWVzX3JlY29uZmlnX25vdGlmaWVyX3JlZ2lzdGVyKCZwc2VyaWVzX3NtcF9uYik7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwocHNlcmllc19jcHVfaG90cGx1Z19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGxfaW5zdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Q2FsbF9pbnN0LmMKaW5kZXggNDQ2ZTE3ZC4uODAxODFjNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Q2FsbF9pbnN0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Q2FsbF9pbnN0LmMKQEAgLTg1LDcgKzg1LDcgQEAKIAogCXJjID0gc2VxX29wZW4oZmlsZSwgJmhjYWxsX2luc3Rfc2VxX29wcyk7CiAJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNlcS0+cHJpdmF0ZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CisJc2VxLT5wcml2YXRlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwppbmRleCBkMjRiYTU0Li4zYzk1MzkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwpAQCAtNTcsOSArNTcsNiBAQAogCXU2NCAqdGNlcDsKIAl1NjQgcnBuOwogCi0JaW5kZXggPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQlucGFnZXMgPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQogCXByb3RvX3RjZSA9IFRDRV9QQ0lfUkVBRDsgLy8gUmVhZCBhbGxvd2VkCiAKIAlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCkBAIC04Miw5ICs3OSw2IEBACiB7CiAJdTY0ICp0Y2VwOwogCi0JbnBhZ2VzIDw8PSBUQ0VfUEFHRV9GQUNUT1I7Ci0JaW5kZXggPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQogCXRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKIAogCXdoaWxlIChucGFnZXMtLSkKQEAgLTk1LDcgKzg5LDYgQEAKIHsKIAl1NjQgKnRjZXA7CiAKLQlpbmRleCA8PD0gVENFX1BBR0VfRkFDVE9SOwogCXRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKIAogCXJldHVybiAqdGNlcDsKQEAgLTEwOSw5ICsxMDIsNiBAQAogCXU2NCBwcm90b190Y2UsIHRjZTsKIAl1NjQgcnBuOwogCi0JdGNlbnVtIDw8PSBUQ0VfUEFHRV9GQUNUT1I7Ci0JbnBhZ2VzIDw8PSBUQ0VfUEFHRV9GQUNUT1I7Ci0KIAlycG4gPSAodmlydF90b19hYnModWFkZHIpKSA+PiBUQ0VfU0hJRlQ7CiAJcHJvdG9fdGNlID0gVENFX1BDSV9SRUFEOwogCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKQEAgLTE0Niw3ICsxMzYsNyBAQAogCXU2NCBycG47CiAJbG9uZyBsLCBsaW1pdDsKIAotCWlmIChUQ0VfUEFHRV9GQUNUT1IgPT0gMCAmJiBucGFnZXMgPT0gMSkKKwlpZiAobnBhZ2VzID09IDEpCiAJCXJldHVybiB0Y2VfYnVpbGRfcFNlcmllc0xQKHRibCwgdGNlbnVtLCBucGFnZXMsIHVhZGRyLAogCQkJCQkgICBkaXJlY3Rpb24pOwogCkBAIC0xNjQsOSArMTU0LDYgQEAKIAkJX19nZXRfY3B1X3Zhcih0Y2VfcGFnZSkgPSB0Y2VwOwogCX0KIAotCXRjZW51bSA8PD0gVENFX1BBR0VfRkFDVE9SOwotCW5wYWdlcyA8PD0gVENFX1BBR0VfRkFDVE9SOwotCiAJcnBuID0gKHZpcnRfdG9fYWJzKHVhZGRyKSkgPj4gVENFX1NISUZUOwogCXByb3RvX3RjZSA9IFRDRV9QQ0lfUkVBRDsKIAlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCkBAIC0yMDcsOSArMTk0LDYgQEAKIHsKIAl1NjQgcmM7CiAKLQl0Y2VudW0gPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQlucGFnZXMgPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKLQogCXdoaWxlIChucGFnZXMtLSkgewogCQlyYyA9IHBscGFyX3RjZV9wdXQoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KXRjZW51bSA8PCAxMiwgMCk7CiAKQEAgLTIyOSw5ICsyMTMsNiBAQAogewogCXU2NCByYzsKIAotCXRjZW51bSA8PD0gVENFX1BBR0VfRkFDVE9SOwotCW5wYWdlcyA8PD0gVENFX1BBR0VfRkFDVE9SOwotCiAJcmMgPSBwbHBhcl90Y2Vfc3R1ZmYoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KXRjZW51bSA8PCAxMiwgMCwgbnBhZ2VzKTsKIAogCWlmIChyYyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKQEAgLTI0OCw3ICsyMjksNiBAQAogCXU2NCByYzsKIAl1bnNpZ25lZCBsb25nIHRjZV9yZXQ7CiAKLQl0Y2VudW0gPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKIAlyYyA9IHBscGFyX3RjZV9nZXQoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KXRjZW51bSA8PCAxMiwgJnRjZV9yZXQpOwogCiAJaWYgKHJjICYmIHByaW50a19yYXRlbGltaXQoKSkgewpAQCAtMjg5LDcgKzI2OSw3IEBACiAJdGJsLT5pdF9idXNubyA9IHBoYi0+YnVzLT5udW1iZXI7CiAKIAkvKiBVbml0cyBvZiB0Y2UgZW50cmllcyAqLwotCXRibC0+aXRfb2Zmc2V0ID0gcGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyID4+IFBBR0VfU0hJRlQ7CisJdGJsLT5pdF9vZmZzZXQgPSBwaGItPmRtYV93aW5kb3dfYmFzZV9jdXIgPj4gSU9NTVVfUEFHRV9TSElGVDsKIAogCS8qIFRlc3QgaWYgd2UgYXJlIGdvaW5nIG92ZXIgMkdCIG9mIERNQSBzcGFjZSAqLwogCWlmIChwaGItPmRtYV93aW5kb3dfYmFzZV9jdXIgKyBwaGItPmRtYV93aW5kb3dfc2l6ZSA+IDB4ODAwMDAwMDB1bCkgewpAQCAtMzAwLDcgKzI4MCw3IEBACiAJcGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyICs9IHBoYi0+ZG1hX3dpbmRvd19zaXplOwogCiAJLyogU2V0IHRoZSB0Y2UgdGFibGUgc2l6ZSAtIG1lYXN1cmVkIGluIGVudHJpZXMgKi8KLQl0YmwtPml0X3NpemUgPSBwaGItPmRtYV93aW5kb3dfc2l6ZSA+PiBQQUdFX1NISUZUOworCXRibC0+aXRfc2l6ZSA9IHBoYi0+ZG1hX3dpbmRvd19zaXplID4+IElPTU1VX1BBR0VfU0hJRlQ7CiAKIAl0YmwtPml0X2luZGV4ID0gMDsKIAl0YmwtPml0X2Jsb2Nrc2l6ZSA9IDE2OwpAQCAtMzI1LDExICszMDUsMTEgQEAKIAl0YmwtPml0X2Jhc2UgICA9IDA7CiAJdGJsLT5pdF9ibG9ja3NpemUgID0gMTY7CiAJdGJsLT5pdF90eXBlID0gVENFX1BDSTsKLQl0YmwtPml0X29mZnNldCA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwotCXRibC0+aXRfc2l6ZSA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwl0YmwtPml0X29mZnNldCA9IG9mZnNldCA+PiBJT01NVV9QQUdFX1NISUZUOworCXRibC0+aXRfc2l6ZSA9IHNpemUgPj4gSU9NTVVfUEFHRV9TSElGVDsKIH0KIAotc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwX3BTZXJpZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIHBjaV9kbWFfYnVzX3NldHVwX3BTZXJpZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwpAQCAtMzM4LDEwICszMTgsOSBAQAogCXN0cnVjdCBwY2lfZG4gKnBjaTsKIAlpbnQgY2hpbGRyZW47CiAKLQlEQkcoImlvbW11X2J1c19zZXR1cF9wU2VyaWVzLCBidXMgJXAsIGJ1cy0+c2VsZiAlcFxuIiwgYnVzLCBidXMtPnNlbGYpOwotCiAJZG4gPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKLQlwY2kgPSBQQ0lfRE4oZG4pOworCisJREJHKCJwY2lfZG1hX2J1c19zZXR1cF9wU2VyaWVzOiBzZXR0aW5nIHVwIGJ1cyAlc1xuIiwgZG4tPmZ1bGxfbmFtZSk7CiAKIAlpZiAoYnVzLT5zZWxmKSB7CiAJCS8qIFRoaXMgaXMgbm90IGEgcm9vdCBidXMsIGFueSBzZXR1cCB3aWxsIGJlIGRvbmUgZm9yIHRoZQpAQCAtMzQ5LDYgKzMyOCw3IEBACiAJCSAqLwogCQlyZXR1cm47CiAJfQorCXBjaSA9IFBDSV9ETihkbik7CiAKIAkvKiBDaGVjayBpZiB0aGUgSVNBIGJ1cyBvbiB0aGUgc3lzdGVtIGlzIHVuZGVyCiAJICogdGhpcyBQSEIuCkBAIC00MTAsMTcgKzM5MCwxNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cF9wU2VyaWVzTFAoc3RydWN0IHBjaV9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIHBjaV9kbWFfYnVzX3NldHVwX3BTZXJpZXNMUChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sICpwZG47CiAJc3RydWN0IHBjaV9kbiAqcHBjaTsKIAljb25zdCB2b2lkICpkbWFfd2luZG93ID0gTlVMTDsKIAotCURCRygiaW9tbXVfYnVzX3NldHVwX3BTZXJpZXNMUCwgYnVzICVwLCBidXMtPnNlbGYgJXBcbiIsIGJ1cywgYnVzLT5zZWxmKTsKLQogCWRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7CiAKKwlEQkcoInBjaV9kbWFfYnVzX3NldHVwX3BTZXJpZXNMUDogc2V0dGluZyB1cCBidXMgJXNcbiIsIGRuLT5mdWxsX25hbWUpOworCiAJLyogRmluZCBuZWFyZXN0IGlibSxkbWEtd2luZG93LCB3YWxraW5nIHVwIHRoZSBkZXZpY2UgdHJlZSAqLwogCWZvciAocGRuID0gZG47IHBkbiAhPSBOVUxMOyBwZG4gPSBwZG4tPnBhcmVudCkgewogCQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KHBkbiwgImlibSxkbWEtd2luZG93IiwgTlVMTCk7CkBAIC00MjksMTEgKzQwOSwxNSBAQAogCX0KIAogCWlmIChkbWFfd2luZG93ID09IE5VTEwpIHsKLQkJREJHKCJpb21tdV9idXNfc2V0dXBfcFNlcmllc0xQOiBidXMgJXMgc2VlbXMgdG8gaGF2ZSBubyBpYm0sZG1hLXdpbmRvdyBwcm9wZXJ0eVxuIiwgZG4tPmZ1bGxfbmFtZSk7CisJCURCRygiICBubyBpYm0sZG1hLXdpbmRvdyBwcm9wZXJ0eSAhXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCXBwY2kgPSBQQ0lfRE4ocGRuKTsKKworCURCRygiICBwYXJlbnQgaXMgJXMsIGlvbW11X3RhYmxlOiAweCVwXG4iLAorCSAgICBwZG4tPmZ1bGxfbmFtZSwgcHBjaS0+aW9tbXVfdGFibGUpOworCiAJaWYgKCFwcGNpLT5pb21tdV90YWJsZSkgewogCQkvKiBCdXNzdWJubyBoYXNuJ3QgYmVlbiBjb3BpZWQgeWV0LgogCQkgKiBEbyBpdCBub3cgYmVjYXVzZSBpb21tdV90YWJsZV9zZXRwYXJtc19scGFyIG5lZWRzIGl0LgpAQCAtNDQ3LDYgKzQzMSw3IEBACiAJCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocHBjaS0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdyk7CiAKIAkJcHBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCwgcHBjaS0+cGhiLT5ub2RlKTsKKwkJREJHKCIgIGNyZWF0ZWQgdGFibGU6ICVwXG4iLCBwcGNpLT5pb21tdV90YWJsZSk7CiAJfQogCiAJaWYgKHBkbiAhPSBkbikKQEAgLTQ1NCwyNyArNDM5LDI3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgaW9tbXVfZGV2X3NldHVwX3BTZXJpZXMoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIHBjaV9kbWFfZGV2X3NldHVwX3BTZXJpZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLCAqbXlkbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCi0JREJHKCJpb21tdV9kZXZfc2V0dXBfcFNlcmllcywgZGV2ICVwICglcylcbiIsIGRldiwgcGNpX25hbWUoZGV2KSk7CisJREJHKCJwY2lfZG1hX2Rldl9zZXR1cF9wU2VyaWVzOiAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CiAKLQlteWRuID0gZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKKwlkbiA9IGRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGU7CiAKIAkvKiBJZiB3ZSdyZSB0aGUgZGlyZWN0IGNoaWxkIG9mIGEgcm9vdCBidXMsIHRoZW4gd2UgbmVlZCB0byBhbGxvY2F0ZQogCSAqIGFuIGlvbW11IHRhYmxlIG91cnNlbHZlcy4gVGhlIGJ1cyBzZXR1cCBjb2RlIHNob3VsZCBoYXZlIHNldHVwCiAJICogdGhlIHdpbmRvdyBzaXplcyBhbHJlYWR5LgogCSAqLwogCWlmICghZGV2LT5idXMtPnNlbGYpIHsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIgPSBQQ0lfRE4oZG4pLT5waGI7CisKIAkJREJHKCIgLS0+IGZpcnN0IGNoaWxkLCBubyBicmlkZ2UuIEFsbG9jYXRpbmcgaW9tbXUgdGFibGUuXG4iKTsKIAkJdGJsID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMLAotCQkJCSAgIFBDSV9ETihkbiktPnBoYi0+bm9kZSk7Ci0JCWlvbW11X3RhYmxlX3NldHBhcm1zKFBDSV9ETihkbiktPnBoYiwgZG4sIHRibCk7Ci0JCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwsCi0JCQkJCQlQQ0lfRE4oZG4pLT5waGItPm5vZGUpOwotCisJCQkJICAgcGhiLT5ub2RlKTsKKwkJaW9tbXVfdGFibGVfc2V0cGFybXMocGhiLCBkbiwgdGJsKTsKKwkJZGV2LT5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPSBpb21tdV9pbml0X3RhYmxlKHRibCwgcGhiLT5ub2RlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDg1LDExICs0NzAsMTEgQEAKIAl3aGlsZSAoZG4gJiYgUENJX0ROKGRuKSAmJiBQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9PSBOVUxMKQogCQlkbiA9IGRuLT5wYXJlbnQ7CiAKLQlpZiAoZG4gJiYgUENJX0ROKGRuKSkgewotCQlQQ0lfRE4obXlkbiktPmlvbW11X3RhYmxlID0gUENJX0ROKGRuKS0+aW9tbXVfdGFibGU7Ci0JfSBlbHNlIHsKLQkJREJHKCJpb21tdV9kZXZfc2V0dXBfcFNlcmllcywgZGV2ICVwICglcykgaGFzIG5vIGlvbW11IHRhYmxlXG4iLCBkZXYsIHBjaV9uYW1lKGRldikpOwotCX0KKwlpZiAoZG4gJiYgUENJX0ROKGRuKSkKKwkJZGV2LT5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPSBQQ0lfRE4oZG4pLT5pb21tdV90YWJsZTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvbW11OiBEZXZpY2UgJXMgaGFzIG5vIGlvbW11IHRhYmxlXG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CiB9CiAKIHN0YXRpYyBpbnQgaW9tbXVfcmVjb25maWdfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKm5vZGUpCkBAIC01MTUsMTQgKzUwMCwxNCBAQAogCS5ub3RpZmllcl9jYWxsID0gaW9tbXVfcmVjb25maWdfbm90aWZpZXIsCiB9OwogCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfcFNlcmllc0xQKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdm9pZCBwY2lfZG1hX2Rldl9zZXR1cF9wU2VyaWVzTFAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBkbiwgKmRuOwogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCWNvbnN0IHZvaWQgKmRtYV93aW5kb3cgPSBOVUxMOwogCXN0cnVjdCBwY2lfZG4gKnBjaTsKIAotCURCRygiaW9tbXVfZGV2X3NldHVwX3BTZXJpZXNMUCwgZGV2ICVwICglcylcbiIsIGRldiwgcGNpX25hbWUoZGV2KSk7CisJREJHKCJwY2lfZG1hX2Rldl9zZXR1cF9wU2VyaWVzTFA6ICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKIAogCS8qIGRldiBzZXR1cCBmb3IgTFBBUiBpcyBhIGxpdHRsZSB0cmlja3ksIHNpbmNlIHRoZSBkZXZpY2UgdHJlZSBtaWdodAogCSAqIGNvbnRhaW4gdGhlIGRtYS13aW5kb3cgcHJvcGVydGllcyBwZXItZGV2aWNlIGFuZCBub3QgbmVjY2VzYXJpbHkKQEAgLTUzMSw2ICs1MTYsNyBAQAogCSAqIGFscmVhZHkgYWxsb2NhdGVkLgogCSAqLwogCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CisJREJHKCIgIG5vZGUgaXMgJXNcbiIsIGRuLT5mdWxsX25hbWUpOwogCiAJZm9yIChwZG4gPSBkbjsgcGRuICYmIFBDSV9ETihwZG4pICYmICFQQ0lfRE4ocGRuKS0+aW9tbXVfdGFibGU7CiAJICAgICBwZG4gPSBwZG4tPnBhcmVudCkgewpAQCAtNTM5LDE2ICs1MjUsMTcgQEAKIAkJCWJyZWFrOwogCX0KIAorCURCRygiICBwYXJlbnQgaXMgJXNcbiIsIHBkbi0+ZnVsbF9uYW1lKTsKKwogCS8qIENoZWNrIGZvciBwYXJlbnQgPT0gTlVMTCBzbyB3ZSBkb24ndCB0cnkgdG8gc2V0dXAgdGhlIGVtcHR5IEVBRFMKIAkgKiBzbG90cyBvbiBQT1dFUjQgbWFjaGluZXMuCiAJICovCiAJaWYgKGRtYV93aW5kb3cgPT0gTlVMTCB8fCBwZG4tPnBhcmVudCA9PSBOVUxMKSB7Ci0JCURCRygiTm8gZG1hIHdpbmRvdyBmb3IgZGV2aWNlLCBsaW5raW5nIHRvIHBhcmVudFxuIik7Ci0JCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gUENJX0ROKHBkbiktPmlvbW11X3RhYmxlOworCQlEQkcoIiAgbm8gZG1hIHdpbmRvdyBmb3IgZGV2aWNlLCBsaW5raW5nIHRvIHBhcmVudFxuIik7CisJCWRldi0+ZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0gUENJX0ROKHBkbiktPmlvbW11X3RhYmxlOwogCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJREJHKCJGb3VuZCBETUEgd2luZG93LCBhbGxvY2F0aW5nIHRhYmxlXG4iKTsKIAl9CisJREJHKCIgIGZvdW5kIERNQSB3aW5kb3csIHRhYmxlOiAlcFxuIiwgcGNpLT5pb21tdV90YWJsZSk7CiAKIAlwY2kgPSBQQ0lfRE4ocGRuKTsKIAlpZiAoIXBjaS0+aW9tbXVfdGFibGUpIHsKQEAgLTU2MSwyNCArNTQ4LDIwIEBACiAJCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocGNpLT5waGIsIHBkbiwgdGJsLCBkbWFfd2luZG93KTsKIAogCQlwY2ktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwsIHBjaS0+cGhiLT5ub2RlKTsKKwkJREJHKCIgIGNyZWF0ZWQgdGFibGU6ICVwXG4iLCBwY2ktPmlvbW11X3RhYmxlKTsKIAl9CiAKLQlpZiAocGRuICE9IGRuKQotCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9IHBjaS0+aW9tbXVfdGFibGU7CisJZGV2LT5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPSBwY2ktPmlvbW11X3RhYmxlOwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2J1cyAqYikgeyB9Ci1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2RldiAqZCkgeyB9Ci0KIC8qIFRoZXNlIGFyZSBjYWxsZWQgdmVyeSBlYXJseS4gKi8KIHZvaWQgaW9tbXVfaW5pdF9lYXJseV9wU2VyaWVzKHZvaWQpCiB7CiAJaWYgKG9mX2Nob3NlbiAmJiBnZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsaW9tbXUtb2ZmIiwgTlVMTCkpIHsKIAkJLyogRGlyZWN0IEkvTywgSU9NTVUgb2ZmICovCi0JCXBwY19tZC5pb21tdV9kZXZfc2V0dXAgPSBpb21tdV9kZXZfc2V0dXBfbnVsbDsKLQkJcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOwotCQlwY2lfZGlyZWN0X2lvbW11X2luaXQoKTsKLQorCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBOVUxMOworCQlwcGNfbWQucGNpX2RtYV9idXNfc2V0dXAgPSBOVUxMOworCQlwY2lfZG1hX29wcyA9ICZkbWFfZGlyZWN0X29wczsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTkxLDE5ICs1NzQsMTkgQEAKIAkJCXBwY19tZC50Y2VfZnJlZQkgPSB0Y2VfZnJlZV9wU2VyaWVzTFA7CiAJCX0KIAkJcHBjX21kLnRjZV9nZXQgICA9IHRjZV9nZXRfcFNlcmllc0xQOwotCQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwID0gaW9tbXVfYnVzX3NldHVwX3BTZXJpZXNMUDsKLQkJcHBjX21kLmlvbW11X2Rldl9zZXR1cCA9IGlvbW11X2Rldl9zZXR1cF9wU2VyaWVzTFA7CisJCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCA9IHBjaV9kbWFfYnVzX3NldHVwX3BTZXJpZXNMUDsKKwkJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwID0gcGNpX2RtYV9kZXZfc2V0dXBfcFNlcmllc0xQOwogCX0gZWxzZSB7CiAJCXBwY19tZC50Y2VfYnVpbGQgPSB0Y2VfYnVpbGRfcFNlcmllczsKIAkJcHBjX21kLnRjZV9mcmVlICA9IHRjZV9mcmVlX3BTZXJpZXM7CiAJCXBwY19tZC50Y2VfZ2V0ICAgPSB0Y2VfZ2V0X3BzZXJpZXM7Ci0JCXBwY19tZC5pb21tdV9idXNfc2V0dXAgPSBpb21tdV9idXNfc2V0dXBfcFNlcmllczsKLQkJcHBjX21kLmlvbW11X2Rldl9zZXR1cCA9IGlvbW11X2Rldl9zZXR1cF9wU2VyaWVzOworCQlwcGNfbWQucGNpX2RtYV9idXNfc2V0dXAgPSBwY2lfZG1hX2J1c19zZXR1cF9wU2VyaWVzOworCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBwY2lfZG1hX2Rldl9zZXR1cF9wU2VyaWVzOwogCX0KIAogCiAJcFNlcmllc19yZWNvbmZpZ19ub3RpZmllcl9yZWdpc3RlcigmaW9tbXVfcmVjb25maWdfbmIpOwogCi0JcGNpX2lvbW11X2luaXQoKTsKKwlwY2lfZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwppbmRleCAxODIwYTBiLi43MjE0MzZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogCX0KIH0KIAotbG9uZyBwU2VyaWVzX2xwYXJfaHB0ZV9pbnNlcnQodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwLAorc3RhdGljIGxvbmcgcFNlcmllc19scGFyX2hwdGVfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgaHB0ZV9ncm91cCwKICAJCQkgICAgICB1bnNpZ25lZCBsb25nIHZhLCB1bnNpZ25lZCBsb25nIHBhLAogIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmZsYWdzLCB1bnNpZ25lZCBsb25nIHZmbGFncywKICAJCQkgICAgICBpbnQgcHNpemUpCkBAIC01MDYsNyArNTA2LDcgQEAKICAqIFRha2UgYSBzcGlubG9jayBhcm91bmQgZmx1c2hlcyB0byBhdm9pZCBib3VuY2luZyB0aGUgaHlwZXJ2aXNvciB0bGJpZQogICogbG9jay4KICAqLwotdm9pZCBwU2VyaWVzX2xwYXJfZmx1c2hfaGFzaF9yYW5nZSh1bnNpZ25lZCBsb25nIG51bWJlciwgaW50IGxvY2FsKQorc3RhdGljIHZvaWQgcFNlcmllc19scGFyX2ZsdXNoX2hhc2hfcmFuZ2UodW5zaWduZWQgbG9uZyBudW1iZXIsIGludCBsb2NhbCkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYwppbmRleCA0MTBhNmJjLi43MTVkYjVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgogCi1zdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgczdhX3dvcmthcm91bmQgPSAtMTsKLQogI2lmIDAKIHZvaWQgcGNpYmlvc19uYW1lX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewpAQCAtNTcsMzkgKzU1LDYgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2liaW9zX25hbWVfZGV2aWNlKTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgY2hlY2tfczdhKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpyb290OwotCWNvbnN0IGNoYXIgKm1vZGVsOwotCi0JczdhX3dvcmthcm91bmQgPSAwOwotCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwotCWlmIChyb290KSB7Ci0JCW1vZGVsID0gZ2V0X3Byb3BlcnR5KHJvb3QsICJtb2RlbCIsIE5VTEwpOwotCQlpZiAobW9kZWwgJiYgIXN0cmNtcChtb2RlbCwgIklCTSw3MDEzLVM3QSIpKQotCQkJczdhX3dvcmthcm91bmQgPSAxOwotCQlvZl9ub2RlX3B1dChyb290KTsKLQl9Ci19Ci0KLXZvaWQgX19kZXZpbml0IHBTZXJpZXNfaXJxX2J1c19zZXR1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0KLQlpZiAoczdhX3dvcmthcm91bmQgPCAwKQotCQljaGVja19zN2EoKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKLQkJcGNpX3JlYWRfaXJxX2xpbmUoZGV2KTsKLQkJaWYgKHM3YV93b3JrYXJvdW5kKSB7Ci0JCQlpZiAoZGV2LT5pcnEgPiAxNikgewotCQkJCWRldi0+aXJxIC09IDM7Ci0JCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLAotCQkJCQlkZXYtPmlycSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBwU2VyaWVzX3JlcXVlc3RfcmVnaW9ucyh2b2lkKQogewogCWlmICghaXNhX2lvX2Jhc2UpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKaW5kZXggNmJmYWNjMi4uYWM1NmI4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwpAQCAtOTMsOCArOTMsOCBAQAogCQlpZiAobGlzdF9lbXB0eSgmZGV2LT5nbG9iYWxfbGlzdCkpIHsKIAkJCWludCBpOwogCi0JCQkvKiBOZWVkIHRvIHNldHVwIElPTU1VIHRhYmxlcyAqLwotCQkJcHBjX21kLmlvbW11X2Rldl9zZXR1cChkZXYpOworCQkJLyogRmlsbCBkZXZpY2UgYXJjaGRhdGEgYW5kIHNldHVwIGlvbW11IHRhYmxlICovCisJCQlwY2liaW9zX3NldHVwX25ld19kZXZpY2UoZGV2KTsKIAogCQkJaWYoZml4X2J1cykKIAkJCQlwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoZGV2LCBidXMpOwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRuKTsKIAlpZiAoIXBoYikKIAkJcmV0dXJuIE5VTEw7Ci0Jc2V0dXBfcGhiKGRuLCBwaGIpOworCXJ0YXNfc2V0dXBfcGhiKHBoYik7CiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIGRuLCAwKTsKIAogCXBjaV9zZXR1cF9waGJfaW9fZHluYW1pYyhwaGIsIHByaW1hcnkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCAxNzczMTAzLi40YWQzM2U0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtMjY4LDExICsyNjgsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKm5ld19wcm9wZXJ0eShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBpbnQgbGVuZ3RoLAogCQkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdmFsdWUsIHN0cnVjdCBwcm9wZXJ0eSAqbGFzdCkKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKm5ldyA9IGttYWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgcHJvcGVydHkgKm5ldyA9IGt6YWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghbmV3KQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQobmV3LCAwLCBzaXplb2YoKm5ldykpOwogCiAJaWYgKCEobmV3LT5uYW1lID0ga21hbGxvYyhzdHJsZW4obmFtZSkgKyAxLCBHRlBfS0VSTkVMKSkpCiAJCWdvdG8gY2xlYW51cDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zY2FubG9nLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jCmluZGV4IDc3YTViYjEuLjQ1MzY4YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zY2FubG9nLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NjYW5sb2cuYwpAQCAtNDcsNyArNDcsNyBAQAogc3RhdGljIHNzaXplX3Qgc2NhbmxvZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotICAgICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworICAgICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcDsKIAl1bnNpZ25lZCBpbnQgKmRhdGE7CiAJaW50IHN0YXR1czsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKaW5kZXggODlhODExOS4uMDQyZWNhZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKQEAgLTM0NywxNyArMzQ3LDYgQEAKIH0KIGFyY2hfaW5pdGNhbGwocFNlcmllc19pbml0X3BhbmVsKTsKIAotc3RhdGljIHZvaWQgcFNlcmllc19tYWNoX2NwdV9kaWUodm9pZCkKLXsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWlkbGVfdGFza19leGl0KCk7Ci0JeGljc190ZWFyZG93bl9jcHUoMCk7Ci0JcnRhc19zdG9wX3NlbGYoKTsKLQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4gKi8KLQlCVUcoKTsKLQlmb3IoOzspOwotfQotCiBzdGF0aWMgaW50IHBzZXJpZXNfc2V0X2RhYnIodW5zaWduZWQgbG9uZyBkYWJyKQogewogCXJldHVybiBwbHBhcl9oY2FsbF9ub3JldHMoSF9TRVRfREFCUiwgZGFicik7CkBAIC00MzMsMTkgKzQyMiwxNCBAQAogCWlmIChvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJpYm0saHlwZXJ0YXMtZnVuY3Rpb25zIiwgTlVMTCkgIT0gTlVMTCkKICAJCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgfD0gRldfRkVBVFVSRV9MUEFSOwogCi0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCi0JCWhwdGVfaW5pdF9scGFyKCk7Ci0JZWxzZQotCQlocHRlX2luaXRfbmF0aXZlKCk7Ci0KICAJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBTZXJpZXNfcHJvYmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0gCWNoYXIgKmR0eXBlID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChvZl9nZXRfZmxhdF9kdF9yb290KCksCi0gCQkJCQkgICJkZXZpY2VfdHlwZSIsIE5VTEwpOworIAljaGFyICpkdHlwZSA9IG9mX2dldF9mbGF0X2R0X3Byb3Aocm9vdCwgImRldmljZV90eXBlIiwgTlVMTCk7CisKICAJaWYgKGR0eXBlID09IE5VTEwpCiAgCQlyZXR1cm4gMDsKICAJaWYgKHN0cmNtcChkdHlwZSwgImNocnAiKSkKQEAgLTQ2Myw2ICs0NDcsMTEgQEAKIAkvKiBOb3cgdHJ5IHRvIGZpZ3VyZSBvdXQgaWYgd2UgYXJlIHJ1bm5pbmcgb24gTFBBUiAqLwogCW9mX3NjYW5fZmxhdF9kdChwU2VyaWVzX3Byb2JlX2h5cGVydGFzLCBOVUxMKTsKIAorCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQorCQlocHRlX2luaXRfbHBhcigpOworCWVsc2UKKwkJaHB0ZV9pbml0X25hdGl2ZSgpOworCiAJREJHKCJNYWNoaW5lIGlzJXMgTFBBUiAhXG4iLAogCSAgICAocG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcyAmIEZXX0ZFQVRVUkVfTFBBUikgPyAiIiA6ICIgbm90Iik7CiAKQEAgLTU1MywxMiArNTQyLDEwIEBACiAJLmxvZ19lcnJvcgkJPSBwU2VyaWVzX2xvZ19lcnJvciwKIAkucGNpYmlvc19maXh1cAkJPSBwU2VyaWVzX2ZpbmFsX2ZpeHVwLAogCS5wY2lfcHJvYmVfbW9kZQkJPSBwU2VyaWVzX3BjaV9wcm9iZV9tb2RlLAotCS5pcnFfYnVzX3NldHVwCQk9IHBTZXJpZXNfaXJxX2J1c19zZXR1cCwKIAkucmVzdGFydAkJPSBydGFzX3Jlc3RhcnQsCiAJLnBvd2VyX29mZgkJPSBydGFzX3Bvd2VyX29mZiwKIAkuaGFsdAkJCT0gcnRhc19oYWx0LAogCS5wYW5pYwkJCT0gcnRhc19vc190ZXJtLAotCS5jcHVfZGllCQk9IHBTZXJpZXNfbWFjaF9jcHVfZGllLAogCS5nZXRfYm9vdF90aW1lCQk9IHJ0YXNfZ2V0X2Jvb3RfdGltZSwKIAkuZ2V0X3J0Y190aW1lCQk9IHJ0YXNfZ2V0X3J0Y190aW1lLAogCS5zZXRfcnRjX3RpbWUJCT0gcnRhc19zZXRfcnRjX3RpbWUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKaW5kZXggYzY2MjRiOC4uNDQwODUxOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYwpAQCAtNjQsMTk3ICs2NCw2IEBACiAKIGV4dGVybiB2b2lkIGdlbmVyaWNfc2Vjb25kYXJ5X3NtcF9pbml0KHVuc2lnbmVkIGxvbmcpOwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0KLS8qIEdldCBzdGF0ZSBvZiBwaHlzaWNhbCBDUFUuCi0gKiBSZXR1cm4gY29kZXM6Ci0gKgkwCS0gVGhlIHByb2Nlc3NvciBpcyBpbiB0aGUgUlRBUyBzdG9wcGVkIHN0YXRlCi0gKgkxCS0gc3RvcC1zZWxmIGlzIGluIHByb2dyZXNzCi0gKgkyCS0gVGhlIHByb2Nlc3NvciBpcyBub3QgaW4gdGhlIFJUQVMgc3RvcHBlZCBzdGF0ZQotICoJLTEJLSBIYXJkd2FyZSBFcnJvcgotICoJLTIJLSBIYXJkd2FyZSBCdXN5LCBUcnkgYWdhaW4gbGF0ZXIuCi0gKi8KLXN0YXRpYyBpbnQgcXVlcnlfY3B1X3N0b3BwZWQodW5zaWduZWQgaW50IHBjcHUpCi17Ci0JaW50IGNwdV9zdGF0dXM7Ci0JaW50IHN0YXR1cywgcWNzc190b2s7Ci0KLQlxY3NzX3RvayA9IHJ0YXNfdG9rZW4oInF1ZXJ5LWNwdS1zdG9wcGVkLXN0YXRlIik7Ci0JaWYgKHFjc3NfdG9rID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKQotCQlyZXR1cm4gLTE7Ci0Jc3RhdHVzID0gcnRhc19jYWxsKHFjc3NfdG9rLCAxLCAyLCAmY3B1X3N0YXR1cywgcGNwdSk7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIlJUQVMgcXVlcnktY3B1LXN0b3BwZWQtc3RhdGUgZmFpbGVkOiAlaVxuIiwgc3RhdHVzKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlyZXR1cm4gY3B1X3N0YXR1czsKLX0KLQotc3RhdGljIGludCBwU2VyaWVzX2NwdV9kaXNhYmxlKHZvaWQpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWNwdV9jbGVhcihjcHUsIGNwdV9vbmxpbmVfbWFwKTsKLQl2ZHNvX2RhdGEtPnByb2Nlc3NvckNvdW50LS07Ci0KLQkvKmZpeCBib290X2NwdWlkIGhlcmUqLwotCWlmIChjcHUgPT0gYm9vdF9jcHVpZCkKLQkJYm9vdF9jcHVpZCA9IGFueV9vbmxpbmVfY3B1KGNwdV9vbmxpbmVfbWFwKTsKLQotCS8qIEZJWE1FOiBhYnN0cmFjdCB0aGlzIHRvIG5vdCBiZSBwbGF0Zm9ybSBzcGVjaWZpYyBsYXRlciBvbiAqLwotCXhpY3NfbWlncmF0ZV9pcnFzX2F3YXkoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcFNlcmllc19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCi17Ci0JaW50IHRyaWVzOwotCWludCBjcHVfc3RhdHVzOwotCXVuc2lnbmVkIGludCBwY3B1ID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOwotCi0JZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMjU7IHRyaWVzKyspIHsKLQkJY3B1X3N0YXR1cyA9IHF1ZXJ5X2NwdV9zdG9wcGVkKHBjcHUpOwotCQlpZiAoY3B1X3N0YXR1cyA9PSAwIHx8IGNwdV9zdGF0dXMgPT0gLTEpCi0JCQlicmVhazsKLQkJbXNsZWVwKDIwMCk7Ci0JfQotCWlmIChjcHVfc3RhdHVzICE9IDApIHsKLQkJcHJpbnRrKCJRdWVyeWluZyBERUFEPyBjcHUgJWkgKCVpKSBzaG93cyAlaVxuIiwKLQkJICAgICAgIGNwdSwgcGNwdSwgY3B1X3N0YXR1cyk7Ci0JfQotCi0JLyogSXNvbGF0aW9uIGFuZCBkZWFsbG9jYXRpb24gYXJlIGRlZmluYXRseSBkb25lIGJ5Ci0JICogZHJzbG90X2NocnBfY3B1LiAgSWYgdGhleSB3ZXJlIG5vdCB0aGV5IHdvdWxkIGJlCi0JICogZG9uZSBoZXJlLiAgQ2hhbmdlIGlzb2xhdGUgc3RhdGUgdG8gSXNvbGF0ZSBhbmQKLQkgKiBjaGFuZ2UgYWxsb2NhdGlvbi1zdGF0ZSB0byBVbnVzYWJsZS4KLQkgKi8KLQlwYWNhW2NwdV0uY3B1X3N0YXJ0ID0gMDsKLX0KLQotLyoKLSAqIFVwZGF0ZSBjcHVfcHJlc2VudF9tYXAgYW5kIHBhY2EocykgZm9yIGEgbmV3IGNwdSBub2RlLiAgVGhlIHdyaW5rbGUKLSAqIGhlcmUgaXMgdGhhdCBhIGNwdSBkZXZpY2Ugbm9kZSBtYXkgcmVwcmVzZW50IHVwIHRvIHR3byBsb2dpY2FsIGNwdXMKLSAqIGluIHRoZSBTTVQgY2FzZS4gIFdlIG11c3QgaG9ub3IgdGhlIGFzc3VtcHRpb24gaW4gb3RoZXIgY29kZSB0aGF0Ci0gKiB0aGUgbG9naWNhbCBpZHMgZm9yIHNpYmxpbmcgU01UIHRocmVhZHMgeCBhbmQgeSBhcmUgYWRqYWNlbnQsIHN1Y2gKLSAqIHRoYXQgeF4xID09IHkgYW5kIHleMSA9PSB4LgotICovCi1zdGF0aWMgaW50IHBTZXJpZXNfYWRkX3Byb2Nlc3NvcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0JY3B1bWFza190IGNhbmRpZGF0ZV9tYXAsIHRtcCA9IENQVV9NQVNLX05PTkU7Ci0JaW50IGVyciA9IC1FTk9TUEMsIGxlbiwgbnRocmVhZHMsIGk7Ci0JY29uc3QgdTMyICppbnRzZXJ2OwotCi0JaW50c2VydiA9IGdldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwgJmxlbik7Ci0JaWYgKCFpbnRzZXJ2KQotCQlyZXR1cm4gMDsKLQotCW50aHJlYWRzID0gbGVuIC8gc2l6ZW9mKHUzMik7Ci0JZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspCi0JCWNwdV9zZXQoaSwgdG1wKTsKLQotCWxvY2tfY3B1X2hvdHBsdWcoKTsKLQotCUJVR19PTighY3B1c19zdWJzZXQoY3B1X3ByZXNlbnRfbWFwLCBjcHVfcG9zc2libGVfbWFwKSk7Ci0KLQkvKiBHZXQgYSBiaXRtYXAgb2YgdW5vY2N1cGllZCBzbG90cy4gKi8KLQljcHVzX3hvcihjYW5kaWRhdGVfbWFwLCBjcHVfcG9zc2libGVfbWFwLCBjcHVfcHJlc2VudF9tYXApOwotCWlmIChjcHVzX2VtcHR5KGNhbmRpZGF0ZV9tYXApKSB7Ci0JCS8qIElmIHdlIGdldCBoZXJlLCBpdCBtb3N0IGxpa2VseSBtZWFucyB0aGF0IE5SX0NQVVMgaXMKLQkJICogbGVzcyB0aGFuIHRoZSBwYXJ0aXRpb24ncyBtYXggcHJvY2Vzc29ycyBzZXR0aW5nLgotCQkgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgYWRkIGNwdSAlczsgdGhpcyBzeXN0ZW0gY29uZmlndXJhdGlvbiIKLQkJICAgICAgICIgc3VwcG9ydHMgJWQgbG9naWNhbCBjcHVzLlxuIiwgbnAtPmZ1bGxfbmFtZSwKLQkJICAgICAgIGNwdXNfd2VpZ2h0KGNwdV9wb3NzaWJsZV9tYXApKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXdoaWxlICghY3B1c19lbXB0eSh0bXApKQotCQlpZiAoY3B1c19zdWJzZXQodG1wLCBjYW5kaWRhdGVfbWFwKSkKLQkJCS8qIEZvdW5kIGEgcmFuZ2Ugd2hlcmUgd2UgY2FuIGluc2VydCB0aGUgbmV3IGNwdShzKSAqLwotCQkJYnJlYWs7Ci0JCWVsc2UKLQkJCWNwdXNfc2hpZnRfbGVmdCh0bXAsIHRtcCwgbnRocmVhZHMpOwotCi0JaWYgKGNwdXNfZW1wdHkodG1wKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBmaW5kIHNwYWNlIGluIGNwdV9wcmVzZW50X21hcCBmb3IiCi0JCSAgICAgICAiIHByb2Nlc3NvciAlcyB3aXRoICVkIHRocmVhZChzKVxuIiwgbnAtPm5hbWUsCi0JCSAgICAgICBudGhyZWFkcyk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIHRtcCkgewotCQlCVUdfT04oY3B1X2lzc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKSk7Ci0JCWNwdV9zZXQoY3B1LCBjcHVfcHJlc2VudF9tYXApOwotCQlzZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSwgKmludHNlcnYrKyk7Ci0JfQotCWVyciA9IDA7Ci1vdXRfdW5sb2NrOgotCXVubG9ja19jcHVfaG90cGx1ZygpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBVcGRhdGUgdGhlIHByZXNlbnQgbWFwIGZvciBhIGNwdSBub2RlIHdoaWNoIGlzIGdvaW5nIGF3YXksIGFuZCBzZXQKLSAqIHRoZSBoYXJkIGlkIGluIHRoZSBwYWNhKHMpIHRvIC0xIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBib290IHRpbWUKLSAqIGNvbnZlbnRpb24gZm9yIG5vbi1wcmVzZW50IGNwdXMuCi0gKi8KLXN0YXRpYyB2b2lkIHBTZXJpZXNfcmVtb3ZlX3Byb2Nlc3NvcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0JaW50IGxlbiwgbnRocmVhZHMsIGk7Ci0JY29uc3QgdTMyICppbnRzZXJ2OwotCi0JaW50c2VydiA9IGdldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwgJmxlbik7Ci0JaWYgKCFpbnRzZXJ2KQotCQlyZXR1cm47Ci0KLQludGhyZWFkcyA9IGxlbiAvIHNpemVvZih1MzIpOwotCi0JbG9ja19jcHVfaG90cGx1ZygpOwotCWZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7Ci0JCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgewotCQkJaWYgKGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KSAhPSBpbnRzZXJ2W2ldKQotCQkJCWNvbnRpbnVlOwotCQkJQlVHX09OKGNwdV9vbmxpbmUoY3B1KSk7Ci0JCQljcHVfY2xlYXIoY3B1LCBjcHVfcHJlc2VudF9tYXApOwotCQkJc2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUsIC0xKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjcHUgPT0gTlJfQ1BVUykKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkIG5vdCBmaW5kIGNwdSB0byByZW1vdmUgIgotCQkJICAgICAgICJ3aXRoIHBoeXNpY2FsIGlkIDB4JXhcbiIsIGludHNlcnZbaV0pOwotCX0KLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKLX0KLQotc3RhdGljIGludCBwU2VyaWVzX3NtcF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqbm9kZSkKLXsKLQlpbnQgZXJyID0gTk9USUZZX09LOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIFBTRVJJRVNfUkVDT05GSUdfQUREOgotCQlpZiAocFNlcmllc19hZGRfcHJvY2Vzc29yKG5vZGUpKQotCQkJZXJyID0gTk9USUZZX0JBRDsKLQkJYnJlYWs7Ci0JY2FzZSBQU0VSSUVTX1JFQ09ORklHX1JFTU9WRToKLQkJcFNlcmllc19yZW1vdmVfcHJvY2Vzc29yKG5vZGUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnIgPSBOT1RJRllfRE9ORTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcFNlcmllc19zbXBfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBwU2VyaWVzX3NtcF9ub3RpZmllciwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KLQogLyoqCiAgKiBzbXBfc3RhcnR1cF9jcHUoKSAtIHN0YXJ0IHRoZSBnaXZlbiBjcHUKICAqCkBAIC00MjIsMTUgKzIzMSw2IEBACiAKIAlEQkcoIiAtPiBzbXBfaW5pdF9wU2VyaWVzKClcbiIpOwogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0Jc21wX29wcy0+Y3B1X2Rpc2FibGUgPSBwU2VyaWVzX2NwdV9kaXNhYmxlOwotCXNtcF9vcHMtPmNwdV9kaWUgPSBwU2VyaWVzX2NwdV9kaWU7Ci0KLQkvKiBQcm9jZXNzb3JzIGNhbiBiZSBhZGRlZC9yZW1vdmVkIG9ubHkgb24gTFBBUiAqLwotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQotCQlwU2VyaWVzX3JlY29uZmlnX25vdGlmaWVyX3JlZ2lzdGVyKCZwU2VyaWVzX3NtcF9uYik7Ci0jZW5kaWYKLQogCS8qIE1hcmsgdGhyZWFkcyB3aGljaCBhcmUgc3RpbGwgc3Bpbm5pbmcgaW4gaG9sZCBsb29wcy4gKi8KIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkgewogCQlmb3JfZWFjaF9wcmVzZW50X2NwdShpKSB7IApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKaW5kZXggZDA3MWFiZS4uYjViMmIxMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCkBAIC02NTYsMTMgKzY1NiwzOCBAQAogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGNhc2NhZGUsIHBzZXJpZXNfODI1OV9jYXNjYWRlKTsKIH0KIAorc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1aWRfdG9fb2Zfbm9kZShpbnQgY3B1KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTMyIGhjcHVpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgImNwdSIpIHsKKwkJaW50IGksIGxlbjsKKwkJY29uc3QgdTMyICppbnRzZXJ2OworCisJCWludHNlcnYgPSBnZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOworCisJCWlmICghaW50c2VydikKKwkJCWludHNlcnYgPSBnZXRfcHJvcGVydHkobnAsICJyZWciLCAmbGVuKTsKKworCQlpID0gbGVuIC8gc2l6ZW9mKHUzMik7CisKKwkJd2hpbGUgKGktLSkKKwkJCWlmIChpbnRzZXJ2W2ldID09IGhjcHVpZCkKKwkJCQlyZXR1cm4gbnA7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIHZvaWQgX19pbml0IHhpY3NfaW5pdF9JUlEodm9pZCkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCXUzMiBpbGVuLCBpbmR4ID0gMDsKLQljb25zdCB1MzIgKmlyZWc7CisJY29uc3QgdTMyICppcmVnLCAqaXNpemU7CiAJaW50IGZvdW5kID0gMDsKKwl1MzIgaGNwdWlkOwogCiAJcHBjNjRfYm9vdF9tc2coMHgyMCwgIlhJQ1MgSW5pdCIpOwogCkBAIC02ODMsMjYgKzcwOCwzMSBAQAogCXhpY3NfaW5pdF9ob3N0KCk7CiAKIAkvKiBGaW5kIHRoZSBzZXJ2ZXIgbnVtYmVycyBmb3IgdGhlIGJvb3QgY3B1LiAqLwotCWZvciAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7Ci0JICAgICBucDsKLQkgICAgIG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJjcHUiKSkgewotCQlpcmVnID0gZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJmlsZW4pOwotCQlpZiAoaXJlZyAmJiBpcmVnWzBdID09IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoYm9vdF9jcHVpZCkpIHsKLQkJCWlyZWcgPSBnZXRfcHJvcGVydHkobnAsCi0JCQkJCSJpYm0scHBjLWludGVycnVwdC1nc2VydmVyI3MiLCAmaWxlbik7Ci0JCQlpID0gaWxlbiAvIHNpemVvZihpbnQpOwotCQkJaWYgKGlyZWcgJiYgaSA+IDApIHsKLQkJCQlkZWZhdWx0X3NlcnZlciA9IGlyZWdbMF07Ci0JCQkJLyogdGFrZSBsYXN0IGVsZW1lbnQgKi8KLQkJCQlkZWZhdWx0X2Rpc3RyaWJfc2VydmVyID0gaXJlZ1tpLTFdOwotCQkJfQotCQkJaXJlZyA9IGdldF9wcm9wZXJ0eShucCwKKwlucCA9IGNwdWlkX3RvX29mX25vZGUoYm9vdF9jcHVpZCk7CisJQlVHX09OKCFucCk7CisJaXJlZyA9IGdldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LWdzZXJ2ZXIjcyIsICZpbGVuKTsKKwlpZiAoIWlyZWcpCisJCWdvdG8gc2tpcF9nc2VydmVyX2NoZWNrOworCWkgPSBpbGVuIC8gc2l6ZW9mKGludCk7CisJaGNwdWlkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChib290X2NwdWlkKTsKKworCS8qIEdsb2JhbCBpbnRlcnJ1cHQgZGlzdHJpYnV0aW9uIHNlcnZlciBpcyBzcGVjaWZpZWQgaW4gdGhlIGxhc3QKKwkgKiBlbnRyeSBvZiAiaWJtLHBwYy1pbnRlcnJ1cHQtZ3NlcnZlciNzIiBwcm9wZXJ0eS4gR2V0IHRoZSBsYXN0CisJICogZW50cnkgZm9tIHRoaXMgcHJvcGVydHkgZm9yIGN1cnJlbnQgYm9vdCBjcHUgaWQgYW5kIHVzZSBpdCBhcworCSAqIGRlZmF1bHQgZGlzdHJpYnV0aW9uIHNlcnZlcgorCSAqLworCWZvciAoaiA9IDA7IGogPCBpOyBqICs9IDIpIHsKKwkJaWYgKGlyZWdbal0gPT0gaGNwdWlkKSB7CisJCQlkZWZhdWx0X3NlcnZlciA9IGhjcHVpZDsKKwkJCWRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXIgPSBpcmVnW2orMV07CisKKwkJCWlzaXplID0gZ2V0X3Byb3BlcnR5KG5wLAogCQkJCQkiaWJtLGludGVycnVwdC1zZXJ2ZXIjLXNpemUiLCBOVUxMKTsKLQkJCWlmIChpcmVnKQotCQkJCWludGVycnVwdF9zZXJ2ZXJfc2l6ZSA9ICppcmVnOwotCQkJYnJlYWs7CisJCQlpZiAoaXNpemUpCisJCQkJaW50ZXJydXB0X3NlcnZlcl9zaXplID0gKmlzaXplOwogCQl9CiAJfQorc2tpcF9nc2VydmVyX2NoZWNrOgogCW9mX25vZGVfcHV0KG5wKTsKIAogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggOTFmMDUyZC4uMDRkNDkxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC01LDE0ICs1LDE0IEBACiBvYmotJChDT05GSUdfTVBJQykJCSs9IG1waWMubwogb2JqLSQoQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kpCSs9IGluZGlyZWN0X3BjaS5vCiBvYmotJChDT05GSUdfUFBDX01QQzEwNikJKz0gZ3JhY2tsZS5vCi1vYmotJChDT05GSUdfQk9PS0UpCQkrPSBkY3Iubwotb2JqLSQoQ09ORklHXzQweCkJCSs9IGRjci5vCitvYmotJChDT05GSUdfUFBDX0RDUikJCSs9IGRjci5vCitvYmotJChDT05GSUdfUFBDX0RDUl9OQVRJVkUpCSs9IGRjci1sb3cubwogb2JqLSQoQ09ORklHX1UzX0RBUlQpCQkrPSBkYXJ0X2lvbW11Lm8KIG9iai0kKENPTkZJR19NTUlPX05WUkFNKQkrPSBtbWlvX252cmFtLm8KIG9iai0kKENPTkZJR19GU0xfU09DKQkJKz0gZnNsX3NvYy5vCi1vYmotJChDT05GSUdfUFBDX1RPREMpCQkrPSB0b2RjLm8KIG9iai0kKENPTkZJR19UU0kxMDhfQlJJREdFKQkrPSB0c2kxMDhfcGNpLm8gdHNpMTA4X2Rldi5vCiBvYmotJChDT05GSUdfUVVJQ0NfRU5HSU5FKQkrPSBxZV9saWIvCitvYmotJChDT05GSUdfTVREKQkJKz0gcm9tLm8KIAogaWZlcSAoJChDT05GSUdfUFBDX01FUkdFKSx5KQogb2JqLSQoQ09ORklHX1BQQ19JODI1OSkJCSs9IGk4MjU5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydC5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0LmgKaW5kZXggMWM4ODE3Yy4uZmYyMDJlZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0LmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0LmgKQEAgLTcyLDcgKzcyLDYgQEAKIAogI2RlZmluZSBEQVJUX1BBR0VfU0hJRlQJCTEyCiAjZGVmaW5lIERBUlRfUEFHRV9TSVpFCQkoMSA8PCBEQVJUX1BBR0VfU0hJRlQpCi0jZGVmaW5lIERBUlRfUEFHRV9GQUNUT1IJKFBBR0VfU0hJRlQgLSBEQVJUX1BBR0VfU0hJRlQpCiAKIAogI2VuZGlmIC8qIF9QT1dFUlBDX1NZU0RFVl9EQVJUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKaW5kZXggMDNiNDQ3Ny4uMTQ4ODUzNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKQEAgLTQ4LDkgKzQ4LDYgQEAKIAogI2luY2x1ZGUgImRhcnQuaCIKIAotZXh0ZXJuIGludCBpb21tdV9pc19vZmY7Ci1leHRlcm4gaW50IGlvbW11X2ZvcmNlX29uOwotCiAvKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIERBUlQgdGFibGUgKi8KIHVuc2lnbmVkIGxvbmcgZGFydF90YWJsZWJhc2U7IC8qIGV4cG9ydGVkIHRvIGh0YWJfaW5pdGlhbGl6ZSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZGFydF90YWJsZXNpemU7CkBAIC0xNTYsOSArMTUzLDYgQEAKIAogCURCRygiZGFydDogYnVpbGQgYXQ6ICVseCwgJWx4LCBhZGRyOiAleFxuIiwgaW5kZXgsIG5wYWdlcywgdWFkZHIpOwogCi0JaW5kZXggPDw9IERBUlRfUEFHRV9GQUNUT1I7Ci0JbnBhZ2VzIDw8PSBEQVJUX1BBR0VfRkFDVE9SOwotCiAJZHAgPSAoKHVuc2lnbmVkIGludCopdGJsLT5pdF9iYXNlKSArIGluZGV4OwogCiAJLyogT24gVTMsIGFsbCBtZW1vcnkgaXMgY29udGlnb3VzLCBzbyB3ZSBjYW4gbW92ZSB0aGlzCkBAIC0xOTksOSArMTkzLDYgQEAKIAogCURCRygiZGFydDogZnJlZSBhdDogJWx4LCAlbHhcbiIsIGluZGV4LCBucGFnZXMpOwogCi0JaW5kZXggPDw9IERBUlRfUEFHRV9GQUNUT1I7Ci0JbnBhZ2VzIDw8PSBEQVJUX1BBR0VfRkFDVE9SOwotCiAJZHAgID0gKCh1bnNpZ25lZCBpbnQgKil0YmwtPml0X2Jhc2UpICsgaW5kZXg7CiAKIAl3aGlsZSAobnBhZ2VzLS0pCkBAIC0yODEsNyArMjcyLDcgQEAKIAlpb21tdV90YWJsZV9kYXJ0Lml0X2J1c25vID0gMDsKIAlpb21tdV90YWJsZV9kYXJ0Lml0X29mZnNldCA9IDA7CiAJLyogaXRfc2l6ZSBpcyBpbiBudW1iZXIgb2YgZW50cmllcyAqLwotCWlvbW11X3RhYmxlX2RhcnQuaXRfc2l6ZSA9IChkYXJ0X3RhYmxlc2l6ZSAvIHNpemVvZih1MzIpKSA+PiBEQVJUX1BBR0VfRkFDVE9SOworCWlvbW11X3RhYmxlX2RhcnQuaXRfc2l6ZSA9IGRhcnRfdGFibGVzaXplIC8gc2l6ZW9mKHUzMik7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBjb21tb24gSU9NTVUgY29kZSAqLwogCWlvbW11X3RhYmxlX2RhcnQuaXRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKWRhcnRfdmJhc2U7CkBAIC0yOTUsMjQgKzI4NiwxNSBAQAogCXNldF9iaXQoaW9tbXVfdGFibGVfZGFydC5pdF9zaXplIC0gMSwgaW9tbXVfdGFibGVfZGFydC5pdF9tYXApOwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgcGNpX2RtYV9kZXZfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0KIAkvKiBXZSBvbmx5IGhhdmUgb25lIGlvbW11IHRhYmxlIG9uIHRoZSBtYWMgZm9yIG5vdywgd2hpY2ggbWFrZXMKIAkgKiB0aGluZ3Mgc2ltcGxlLiBTZXR1cCBhbGwgUENJIGRldmljZXMgdG8gcG9pbnQgdG8gdGhpcyB0YWJsZQotCSAqCi0JICogV2UgbXVzdCB1c2UgcGNpX2RldmljZV90b19PRl9ub2RlKCkgdG8gbWFrZSBzdXJlIHRoYXQKLQkgKiB3ZSBnZXQgdGhlIHJlYWwgImZpbmFsIiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgaW4gdGhlCi0JICogcGNpX2RldiBzeXNkYXRhIGFuZCBub3QgdGhlIHRlbXBvcmFyeSBQSEIgb25lCiAJICovCi0JZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKLQotCWlmIChkbikKLQkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSAmaW9tbXVfdGFibGVfZGFydDsKKwlkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YSA9ICZpb21tdV90YWJsZV9kYXJ0OwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9idXNfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgcGNpX2RtYV9idXNfc2V0dXBfZGFydChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAKQEAgLTMyNyw5ICszMDksNiBAQAogCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9ICZpb21tdV90YWJsZV9kYXJ0OwogfQogCi1zdGF0aWMgdm9pZCBpb21tdV9kZXZfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KLXN0YXRpYyB2b2lkIGlvbW11X2J1c19zZXR1cF9udWxsKHN0cnVjdCBwY2lfYnVzICpidXMpIHsgfQotCiB2b2lkIGlvbW11X2luaXRfZWFybHlfZGFydCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CkBAIC0zNTAsMjIgKzMyOSwyMSBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUgREFSVCBIVyAqLwogCWlmIChkYXJ0X2luaXQoZG4pID09IDApIHsKLQkJcHBjX21kLmlvbW11X2Rldl9zZXR1cCA9IGlvbW11X2Rldl9zZXR1cF9kYXJ0OwotCQlwcGNfbWQuaW9tbXVfYnVzX3NldHVwID0gaW9tbXVfYnVzX3NldHVwX2RhcnQ7CisJCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IHBjaV9kbWFfZGV2X3NldHVwX2RhcnQ7CisJCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCA9IHBjaV9kbWFfYnVzX3NldHVwX2RhcnQ7CiAKIAkJLyogU2V0dXAgcGNpX2RtYSBvcHMgKi8KLQkJcGNpX2lvbW11X2luaXQoKTsKLQorCQlwY2lfZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOwogCQlyZXR1cm47CiAJfQogCiAgYmFpbDoKIAkvKiBJZiBpbml0IGZhaWxlZCwgdXNlIGRpcmVjdCBpb21tdSBhbmQgbnVsbCBzZXR1cCBmdW5jdGlvbnMgKi8KLQlwcGNfbWQuaW9tbXVfZGV2X3NldHVwID0gaW9tbXVfZGV2X3NldHVwX251bGw7Ci0JcHBjX21kLmlvbW11X2J1c19zZXR1cCA9IGlvbW11X2J1c19zZXR1cF9udWxsOworCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IE5VTEw7CisJcHBjX21kLnBjaV9kbWFfYnVzX3NldHVwID0gTlVMTDsKIAogCS8qIFNldHVwIHBjaV9kbWEgb3BzICovCi0JcGNpX2RpcmVjdF9pb21tdV9pbml0KCk7CisJcGNpX2RtYV9vcHMgPSAmZG1hX2RpcmVjdF9vcHM7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuUyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLWxvdy5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3Bvd2VycGMvc3lzZGV2L2Rjci5TCnJlbmFtZSB0byBhcmNoL3Bvd2VycGMvc3lzZGV2L2Rjci1sb3cuUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmZWVhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAuCisgKiAgICAgICAgICAgICAgICAgICAgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2Rjci5oPgorCit1bnNpZ25lZCBpbnQgZGNyX3Jlc291cmNlX3N0YXJ0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgZHM7CisJY29uc3QgdTMyICpkciA9IGdldF9wcm9wZXJ0eShucCwgImRjci1yZWciLCAmZHMpOworCisJaWYgKGRyID09IE5VTEwgfHwgZHMgJiAxIHx8IGluZGV4ID49IChkcyAvIDgpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBkcltpbmRleCAqIDJdOworfQorCit1bnNpZ25lZCBpbnQgZGNyX3Jlc291cmNlX2xlbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGRzOworCWNvbnN0IHUzMiAqZHIgPSBnZXRfcHJvcGVydHkobnAsICJkY3ItcmVnIiwgJmRzKTsKKworCWlmIChkciA9PSBOVUxMIHx8IGRzICYgMSB8fCBpbmRleCA+PSAoZHMgLyA4KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZHJbaW5kZXggKiAyICsgMV07Cit9CisKKyNpZm5kZWYgQ09ORklHX1BQQ19EQ1JfTkFUSVZFCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBmaW5kX2Rjcl9wYXJlbnQoc3RydWN0IGRldmljZV9ub2RlICogbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhciwgKnRtcDsKKwljb25zdCB1MzIgKnA7CisKKwlmb3IgKHBhciA9IG9mX25vZGVfZ2V0KG5vZGUpOyBwYXI7KSB7CisJCWlmIChnZXRfcHJvcGVydHkocGFyLCAiZGNyLWNvbnRyb2xsZXIiLCBOVUxMKSkKKwkJCWJyZWFrOworCQlwID0gZ2V0X3Byb3BlcnR5KHBhciwgImRjci1wYXJlbnQiLCBOVUxMKTsKKwkJdG1wID0gcGFyOworCQlpZiAocCA9PSBOVUxMKQorCQkJcGFyID0gb2ZfZ2V0X3BhcmVudChwYXIpOworCQllbHNlCisJCQlwYXIgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcCk7CisJCW9mX25vZGVfcHV0KHRtcCk7CisJfQorCXJldHVybiBwYXI7Cit9CisKK3U2NCBvZl90cmFuc2xhdGVfZGNyX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsCisJCQkgICAgIHVuc2lnbmVkIGludCBkY3JfbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpvdXRfc3RyaWRlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJY29uc3QgdTMyICpwOworCXVuc2lnbmVkIGludCBzdHJpZGU7CisJdTY0IHJldDsKKworCWRwID0gZmluZF9kY3JfcGFyZW50KGRldik7CisJaWYgKGRwID09IE5VTEwpCisJCXJldHVybiBPRl9CQURfQUREUjsKKworCS8qIFN0cmlkZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZCB5ZXQsIGRlZmF1bHQgdG8gMHgxMCBmb3IgQXhvbiAqLworCXAgPSBnZXRfcHJvcGVydHkoZHAsICJkY3ItbW1pby1zdHJpZGUiLCBOVUxMKTsKKwlzdHJpZGUgPSAocCA9PSBOVUxMKSA/IDB4MTAgOiAqcDsKKworCS8qIFhYWCBGSVhNRTogV2hpY2ggcHJvcGVydHkgbmFtZSBpcyB0byB1c2Ugb2YgdGhlIDIgZm9sbG93aW5nID8gKi8KKwlwID0gZ2V0X3Byb3BlcnR5KGRwLCAiZGNyLW1taW8tcmFuZ2UiLCBOVUxMKTsKKwlpZiAocCA9PSBOVUxMKQorCQlwID0gZ2V0X3Byb3BlcnR5KGRwLCAiZGNyLW1taW8tc3BhY2UiLCBOVUxMKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gT0ZfQkFEX0FERFI7CisKKwkvKiBNYXliZSBjb3VsZCBkbyBzb21lIGJldHRlciByYW5nZSBjaGVja2luZyBoZXJlICovCisJcmV0ID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZHAsIHApOworCWlmIChyZXQgIT0gT0ZfQkFEX0FERFIpCisJCXJldCArPSAodTY0KShzdHJpZGUpICogKHU2NClkY3JfbjsKKwlpZiAob3V0X3N0cmlkZSkKKwkJKm91dF9zdHJpZGUgPSBzdHJpZGU7CisJcmV0dXJuIHJldDsKK30KKworZGNyX2hvc3RfdCBkY3JfbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGNyX24sCisJCSAgIHVuc2lnbmVkIGludCBkY3JfYykKK3sKKwlkY3JfaG9zdF90IHJldCA9IHsgLnRva2VuID0gTlVMTCwgLnN0cmlkZSA9IDAgfTsKKwl1NjQgYWRkcjsKKworCXByX2RlYnVnKCJkY3JfbWFwKCVzLCAweCV4LCAweCV4KVxuIiwKKwkJIGRldi0+ZnVsbF9uYW1lLCBkY3JfbiwgZGNyX2MpOworCisJYWRkciA9IG9mX3RyYW5zbGF0ZV9kY3JfYWRkcmVzcyhkZXYsIGRjcl9uLCAmcmV0LnN0cmlkZSk7CisJcHJfZGVidWcoInRyYW5zbGF0ZXMgdG8gYWRkcjogMHglbHgsIHN0cmlkZTogMHgleFxuIiwKKwkJIGFkZHIsIHJldC5zdHJpZGUpOworCWlmIChhZGRyID09IE9GX0JBRF9BRERSKQorCQlyZXR1cm4gcmV0OworCXByX2RlYnVnKCJtYXBwaW5nIDB4JXggYnl0ZXNcbiIsIGRjcl9jICogcmV0LnN0cmlkZSk7CisJcmV0LnRva2VuID0gaW9yZW1hcChhZGRyLCBkY3JfYyAqIHJldC5zdHJpZGUpOworCWlmIChyZXQudG9rZW4gPT0gTlVMTCkKKwkJcmV0dXJuIHJldDsKKwlwcl9kZWJ1ZygibWFwcGVkIGF0IDB4JXAgLT4gYmFzZSBpcyAweCVwXG4iLAorCQkgcmV0LnRva2VuLCByZXQudG9rZW4gLSBkY3JfbiAqIHJldC5zdHJpZGUpOworCXJldC50b2tlbiAtPSBkY3JfbiAqIHJldC5zdHJpZGU7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBkY3JfdW5tYXAoZGNyX2hvc3RfdCBob3N0LCB1bnNpZ25lZCBpbnQgZGNyX24sIHVuc2lnbmVkIGludCBkY3JfYykKK3sKKwlkY3JfaG9zdF90IGggPSBob3N0OworCisJaWYgKGgudG9rZW4gPT0gTlVMTCkKKwkJcmV0dXJuOworCWgudG9rZW4gLT0gZGNyX24gKiBoLnN0cmlkZTsKKwlpb3VubWFwKGgudG9rZW4pOworCWgudG9rZW4gPSBOVUxMOworfQorCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BQQ19EQ1JfTkFUSVZFKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCBkYmU5MmFlLi5hZDMxZTU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvZnNfZW5ldF9wZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3VhcnRfcGQuaD4KQEAgLTE0Niw3ICsxNDcsNyBAQAogCQl9CiAKIAkJZm9yIChrID0gMDsgayA8IDMyOyBrKyspCi0JCQltZGlvX2RhdGEuaXJxW2tdID0gLTE7CisJCQltZGlvX2RhdGEuaXJxW2tdID0gUEhZX1BPTEw7CiAKIAkJd2hpbGUgKChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBjaGlsZCkpICE9IE5VTEwpIHsKIAkJCWludCBpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChjaGlsZCwgMCk7CkBAIC0xNzcsNiArMTc4LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpnZmFyX3J4X2ludHIgPSAicngiOwogc3RhdGljIGNvbnN0IGNoYXIgKmdmYXJfZXJyX2ludHIgPSAiZXJyb3IiOwogCisKIHN0YXRpYyBpbnQgX19pbml0IGdmYXJfb2ZfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CkBAIC0yMDQsOCArMjA2LDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyOwogCi0JCXJbMV0uc3RhcnQgPSByWzFdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJclsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKIAogCQltb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CiAKQEAgLTIxNCwxMiArMjE1LDEwIEBACiAJCQlyWzFdLm5hbWUgPSBnZmFyX3R4X2ludHI7CiAKIAkJCXJbMl0ubmFtZSA9IGdmYXJfcnhfaW50cjsKLQkJCXJbMl0uc3RhcnQgPSByWzJdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAxKTsKLQkJCXJbMl0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKKwkJCW9mX2lycV90b19yZXNvdXJjZShucCwgMSwgJnJbMl0pOwogCiAJCQlyWzNdLm5hbWUgPSBnZmFyX2Vycl9pbnRyOwotCQkJclszXS5zdGFydCA9IHJbM10uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDIpOwotCQkJclszXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQkJb2ZfaXJxX3RvX3Jlc291cmNlKG5wLCAyLCAmclszXSk7CiAKIAkJCW5fcmVzICs9IDI7CiAJCX0KQEAgLTMyMyw4ICszMjIsNyBAQAogCQlpZiAocmV0KQogCQkJZ290byBlcnI7CiAKLQkJclsxXS5zdGFydCA9IHJbMV0uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCQlyWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJCW9mX2lycV90b19yZXNvdXJjZShucCwgMCwgJnJbMV0pOwogCiAJCWkyY19kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJmc2wtaTJjIiwgaSwgciwgMik7CiAJCWlmIChJU19FUlIoaTJjX2RldikpIHsKQEAgLTQ1OSw4ICs0NTcsNyBAQAogCQlpZiAocmV0KQogCQkJZ290byBlcnI7CiAKLQkJclsxXS5zdGFydCA9IHJbMV0uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCQlyWzFdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJCW9mX2lycV90b19yZXNvdXJjZShucCwgMCwgJnJbMV0pOwogCiAJCXVzYl9kZXZfbXBoID0KIAkJICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImZzbC1laGNpIiwgaSwgciwgMik7CkBAIC01MDcsOCArNTA0LDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gdW5yZWdfbXBoOwogCi0JCXJbMV0uc3RhcnQgPSByWzFdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJclsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKIAogCQl1c2JfZGV2X2RyID0KIAkJICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImZzbC1laGNpIiwgaSwgciwgMik7CkBAIC01OTEsOCArNTg3LDcgQEAKIAkJclsyXS5uYW1lID0gZmNjX3JlZ3NfYzsKIAkJZnNfZW5ldF9kYXRhLmZjY19yZWdzX2MgPSByWzJdLnN0YXJ0OwogCi0JCXJbM10uc3RhcnQgPSByWzNdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJclszXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzNdKTsKIAogCQlmc19lbmV0X2RldiA9CiAJCSAgICBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJmc2wtY3BtLWZjYyIsIGksICZyWzBdLCA0KTsKQEAgLTc1NCw4ICs3NDksNyBAQAogCQkJZ290byBlcnI7CiAJCXJbMV0ubmFtZSA9IHNjY19wcmFtOwogCi0JCXJbMl0uc3RhcnQgPSByWzJdLmVuZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJclsyXS5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzJdKTsKIAogCQljcG1fdWFydF9kZXYgPQogCQkgICAgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiZnNsLWNwbS1zY2M6dWFydCIsIGksICZyWzBdLCAzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaTgyNTkuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaTgyNTkuYwppbmRleCAwNDUwMjY1Li5hZDg3YWRjOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pODI1OS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvaTgyNTkuYwpAQCAtMjI0LDYgKzIyNCwxMSBAQAogCS54bGF0ZSA9IGk4MjU5X2hvc3RfeGxhdGUsCiB9OwogCitzdHJ1Y3QgaXJxX2hvc3QgKmk4MjU5X2dldF9ob3N0KHZvaWQpCit7CisJcmV0dXJuIGk4MjU5X2hvc3Q7Cit9CisKIC8qKgogICogaTgyNTlfaW5pdCAtIEluaXRpYWxpemUgdGhlIGxlZ2FjeSBjb250cm9sbGVyCiAgKiBAbm9kZTogZGV2aWNlIG5vZGUgb2YgdGhlIGxlZ2FjeSBQSUMgKGNhbiBiZSBOVUxMLCBidXQgdGhlbiwgaXQgd2lsbCBtYXRjaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYwppbmRleCBiYzRkNGE3Li43NDZmNzhjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2lwaWMuYwpAQCAtNDczLDkgKzQ3Myw5IEBACiAJZGVzYy0+c3RhdHVzIHw9IGZsb3dfdHlwZSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CiAJaWYgKGZsb3dfdHlwZSAmIElSUV9UWVBFX0xFVkVMX0xPVykgIHsKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9MRVZFTDsKLQkJc2V0X2lycV9oYW5kbGVyKHZpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCQlkZXNjLT5oYW5kbGVfaXJxID0gaGFuZGxlX2xldmVsX2lycTsKIAl9IGVsc2UgewotCQlzZXRfaXJxX2hhbmRsZXIodmlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJZGVzYy0+aGFuZGxlX2lycSA9IGhhbmRsZV9lZGdlX2lycTsKIAl9CiAKIAkvKiBvbmx5IEVYVCBJUlEgc2Vuc2VzIGFyZSBwcm9ncmFtbWFibGUgb24gaXBpYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwppbmRleCBiYTQ4MzNmLi40MTE0ODBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwpAQCAtMTQ3LDMzICsxNDcsNTEgQEAKICAqLwogCiAKLXN0YXRpYyBpbmxpbmUgdTMyIF9tcGljX3JlYWQodW5zaWduZWQgaW50IGJlLCB2b2xhdGlsZSB1MzIgX19pb21lbSAqYmFzZSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnKQorc3RhdGljIGlubGluZSB1MzIgX21waWNfcmVhZChlbnVtIG1waWNfcmVnX3R5cGUgdHlwZSwKKwkJCSAgICAgc3RydWN0IG1waWNfcmVnX2JhbmsgKnJiLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnKQogewotCWlmIChiZSkKLQkJcmV0dXJuIGluX2JlMzIoYmFzZSArIChyZWcgPj4gMikpOwotCWVsc2UKLQkJcmV0dXJuIGluX2xlMzIoYmFzZSArIChyZWcgPj4gMikpOworCXN3aXRjaCh0eXBlKSB7CisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKwljYXNlIG1waWNfYWNjZXNzX2RjcjoKKwkJcmV0dXJuIGRjcl9yZWFkKHJiLT5kaG9zdCwKKwkJCQlyYi0+ZGJhc2UgKyByZWcgKyByYi0+ZG9mZik7CisjZW5kaWYKKwljYXNlIG1waWNfYWNjZXNzX21taW9fYmU6CisJCXJldHVybiBpbl9iZTMyKHJiLT5iYXNlICsgKHJlZyA+PiAyKSk7CisJY2FzZSBtcGljX2FjY2Vzc19tbWlvX2xlOgorCWRlZmF1bHQ6CisJCXJldHVybiBpbl9sZTMyKHJiLT5iYXNlICsgKHJlZyA+PiAyKSk7CisJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX21waWNfd3JpdGUodW5zaWduZWQgaW50IGJlLCB2b2xhdGlsZSB1MzIgX19pb21lbSAqYmFzZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCByZWcsIHUzMiB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfbXBpY193cml0ZShlbnVtIG1waWNfcmVnX3R5cGUgdHlwZSwKKwkJCSAgICAgICBzdHJ1Y3QgbXBpY19yZWdfYmFuayAqcmIsCisgCQkJICAgICAgIHVuc2lnbmVkIGludCByZWcsIHUzMiB2YWx1ZSkKIHsKLQlpZiAoYmUpCi0JCW91dF9iZTMyKGJhc2UgKyAocmVnID4+IDIpLCB2YWx1ZSk7Ci0JZWxzZQotCQlvdXRfbGUzMihiYXNlICsgKHJlZyA+PiAyKSwgdmFsdWUpOworCXN3aXRjaCh0eXBlKSB7CisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKwljYXNlIG1waWNfYWNjZXNzX2RjcjoKKwkJcmV0dXJuIGRjcl93cml0ZShyYi0+ZGhvc3QsCisJCQkJIHJiLT5kYmFzZSArIHJlZyArIHJiLT5kb2ZmLCB2YWx1ZSk7CisjZW5kaWYKKwljYXNlIG1waWNfYWNjZXNzX21taW9fYmU6CisJCXJldHVybiBvdXRfYmUzMihyYi0+YmFzZSArIChyZWcgPj4gMiksIHZhbHVlKTsKKwljYXNlIG1waWNfYWNjZXNzX21taW9fbGU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIG91dF9sZTMyKHJiLT5iYXNlICsgKHJlZyA+PiAyKSwgdmFsdWUpOworCX0KIH0KIAogc3RhdGljIGlubGluZSB1MzIgX21waWNfaXBpX3JlYWQoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCBpcGkpCiB7Ci0JdW5zaWduZWQgaW50IGJlID0gKG1waWMtPmZsYWdzICYgTVBJQ19CSUdfRU5ESUFOKSAhPSAwOworCWVudW0gbXBpY19yZWdfdHlwZSB0eXBlID0gbXBpYy0+cmVnX3R5cGU7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IE1QSUNfSU5GTyhHUkVHX0lQSV9WRUNUT1JfUFJJXzApICsKIAkJCSAgICAgIChpcGkgKiBNUElDX0lORk8oR1JFR19JUElfU1RSSURFKSk7CiAKLQlpZiAobXBpYy0+ZmxhZ3MgJiBNUElDX0JST0tFTl9JUEkpCi0JCWJlID0gIWJlOwotCXJldHVybiBfbXBpY19yZWFkKGJlLCBtcGljLT5ncmVncywgb2Zmc2V0KTsKKwlpZiAoKG1waWMtPmZsYWdzICYgTVBJQ19CUk9LRU5fSVBJKSAmJiB0eXBlID09IG1waWNfYWNjZXNzX21taW9fbGUpCisJCXR5cGUgPSBtcGljX2FjY2Vzc19tbWlvX2JlOworCXJldHVybiBfbXBpY19yZWFkKHR5cGUsICZtcGljLT5ncmVncywgb2Zmc2V0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9tcGljX2lwaV93cml0ZShzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IGlwaSwgdTMyIHZhbHVlKQpAQCAtMTgxLDcgKzE5OSw3IEBACiAJdW5zaWduZWQgaW50IG9mZnNldCA9IE1QSUNfSU5GTyhHUkVHX0lQSV9WRUNUT1JfUFJJXzApICsKIAkJCSAgICAgIChpcGkgKiBNUElDX0lORk8oR1JFR19JUElfU1RSSURFKSk7CiAKLQlfbXBpY193cml0ZShtcGljLT5mbGFncyAmIE1QSUNfQklHX0VORElBTiwgbXBpYy0+Z3JlZ3MsIG9mZnNldCwgdmFsdWUpOworCV9tcGljX3dyaXRlKG1waWMtPnJlZ190eXBlLCAmbXBpYy0+Z3JlZ3MsIG9mZnNldCwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBfbXBpY19jcHVfcmVhZChzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IHJlZykKQEAgLTE5MCw4ICsyMDgsNyBAQAogCiAJaWYgKG1waWMtPmZsYWdzICYgTVBJQ19QUklNQVJZKQogCQljcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQlyZXR1cm4gX21waWNfcmVhZChtcGljLT5mbGFncyAmIE1QSUNfQklHX0VORElBTiwKLQkJCSAgbXBpYy0+Y3B1cmVnc1tjcHVdLCByZWcpOworCXJldHVybiBfbXBpY19yZWFkKG1waWMtPnJlZ190eXBlLCAmbXBpYy0+Y3B1cmVnc1tjcHVdLCByZWcpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX21waWNfY3B1X3dyaXRlKHN0cnVjdCBtcGljICptcGljLCB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgdmFsdWUpCkBAIC0yMDEsNyArMjE4LDcgQEAKIAlpZiAobXBpYy0+ZmxhZ3MgJiBNUElDX1BSSU1BUlkpCiAJCWNwdSA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JX21waWNfd3JpdGUobXBpYy0+ZmxhZ3MgJiBNUElDX0JJR19FTkRJQU4sIG1waWMtPmNwdXJlZ3NbY3B1XSwgcmVnLCB2YWx1ZSk7CisJX21waWNfd3JpdGUobXBpYy0+cmVnX3R5cGUsICZtcGljLT5jcHVyZWdzW2NwdV0sIHJlZywgdmFsdWUpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBfbXBpY19pcnFfcmVhZChzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IHNyY19ubywgdW5zaWduZWQgaW50IHJlZykKQEAgLTIwOSw3ICsyMjYsNyBAQAogCXVuc2lnbmVkIGludAlpc3UgPSBzcmNfbm8gPj4gbXBpYy0+aXN1X3NoaWZ0OwogCXVuc2lnbmVkIGludAlpZHggPSBzcmNfbm8gJiBtcGljLT5pc3VfbWFzazsKIAotCXJldHVybiBfbXBpY19yZWFkKG1waWMtPmZsYWdzICYgTVBJQ19CSUdfRU5ESUFOLCBtcGljLT5pc3VzW2lzdV0sCisJcmV0dXJuIF9tcGljX3JlYWQobXBpYy0+cmVnX3R5cGUsICZtcGljLT5pc3VzW2lzdV0sCiAJCQkgIHJlZyArIChpZHggKiBNUElDX0lORk8oSVJRX1NUUklERSkpKTsKIH0KIApAQCAtMjE5LDEyICsyMzYsMTIgQEAKIAl1bnNpZ25lZCBpbnQJaXN1ID0gc3JjX25vID4+IG1waWMtPmlzdV9zaGlmdDsKIAl1bnNpZ25lZCBpbnQJaWR4ID0gc3JjX25vICYgbXBpYy0+aXN1X21hc2s7CiAKLQlfbXBpY193cml0ZShtcGljLT5mbGFncyAmIE1QSUNfQklHX0VORElBTiwgbXBpYy0+aXN1c1tpc3VdLAorCV9tcGljX3dyaXRlKG1waWMtPnJlZ190eXBlLCAmbXBpYy0+aXN1c1tpc3VdLAogCQkgICAgcmVnICsgKGlkeCAqIE1QSUNfSU5GTyhJUlFfU1RSSURFKSksIHZhbHVlKTsKIH0KIAotI2RlZmluZSBtcGljX3JlYWQoYixyKQkJX21waWNfcmVhZChtcGljLT5mbGFncyAmIE1QSUNfQklHX0VORElBTiwoYiksKHIpKQotI2RlZmluZSBtcGljX3dyaXRlKGIscix2KQlfbXBpY193cml0ZShtcGljLT5mbGFncyAmIE1QSUNfQklHX0VORElBTiwoYiksKHIpLCh2KSkKKyNkZWZpbmUgbXBpY19yZWFkKGIscikJCV9tcGljX3JlYWQobXBpYy0+cmVnX3R5cGUsJihiKSwocikpCisjZGVmaW5lIG1waWNfd3JpdGUoYixyLHYpCV9tcGljX3dyaXRlKG1waWMtPnJlZ190eXBlLCYoYiksKHIpLCh2KSkKICNkZWZpbmUgbXBpY19pcGlfcmVhZChpKQlfbXBpY19pcGlfcmVhZChtcGljLChpKSkKICNkZWZpbmUgbXBpY19pcGlfd3JpdGUoaSx2KQlfbXBpY19pcGlfd3JpdGUobXBpYywoaSksKHYpKQogI2RlZmluZSBtcGljX2NwdV9yZWFkKGkpCV9tcGljX2NwdV9yZWFkKG1waWMsKGkpKQpAQCAtMjM4LDYgKzI1NSwzOCBAQAogICovCiAKIAorc3RhdGljIHZvaWQgX21waWNfbWFwX21taW8oc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCQkJICAgc3RydWN0IG1waWNfcmVnX2JhbmsgKnJiLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgdW5zaWduZWQgaW50IHNpemUpCit7CisJcmItPmJhc2UgPSBpb3JlbWFwKHBoeXNfYWRkciArIG9mZnNldCwgc2l6ZSk7CisJQlVHX09OKHJiLT5iYXNlID09IE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKK3N0YXRpYyB2b2lkIF9tcGljX21hcF9kY3Ioc3RydWN0IG1waWMgKm1waWMsIHN0cnVjdCBtcGljX3JlZ19iYW5rICpyYiwKKwkJCSAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJcmItPmRiYXNlID0gbXBpYy0+ZGNyX2Jhc2U7CisJcmItPmRvZmYgPSBvZmZzZXQ7CisJcmItPmRob3N0ID0gZGNyX21hcChtcGljLT5vZl9ub2RlLCByYi0+ZGJhc2UgKyByYi0+ZG9mZiwgc2l6ZSk7CisJQlVHX09OKCFEQ1JfTUFQX09LKHJiLT5kaG9zdCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXBpY19tYXAoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCQkJICAgIHN0cnVjdCBtcGljX3JlZ19iYW5rICpyYiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpZiAobXBpYy0+ZmxhZ3MgJiBNUElDX1VTRVNfRENSKQorCQlfbXBpY19tYXBfZGNyKG1waWMsIHJiLCBvZmZzZXQsIHNpemUpOworCWVsc2UKKwkJX21waWNfbWFwX21taW8obXBpYywgcGh5c19hZGRyLCByYiwgb2Zmc2V0LCBzaXplKTsKK30KKyNlbHNlIC8qIENPTkZJR19QUENfRENSICovCisjZGVmaW5lIG1waWNfbWFwKG0scCxiLG8scykJX21waWNfbWFwX21taW8obSxwLGIsbyxzKQorI2VuZGlmIC8qICFDT05GSUdfUFBDX0RDUiAqLworCisKIAogLyogQ2hlY2sgaWYgd2UgaGF2ZSBvbmUgb2YgdGhvc2UgbmljZSBicm9rZW4gTVBJQ3Mgd2l0aCBhIGZsaXBwZWQgZW5kaWFuIG9uCiAgKiByZWFkcyBmcm9tIElQSSByZWdpc3RlcnMKQEAgLTg0NSw3ICs4OTQsNyBAQAogICovCiAKIHN0cnVjdCBtcGljICogX19pbml0IG1waWNfYWxsb2Moc3RydWN0IGRldmljZV9ub2RlICpub2RlLAotCQkJCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCQkJCXBoeXNfYWRkcl90IHBoeXNfYWRkciwKIAkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJdW5zaWduZWQgaW50IGlzdV9zaXplLAogCQkJCXVuc2lnbmVkIGludCBpcnFfY291bnQsCkBAIC04NTUsNiArOTA0LDcgQEAKIAl1MzIJCXJlZzsKIAljb25zdCBjaGFyCSp2ZXJzOwogCWludAkJaTsKKwl1NjQJCXBhZGRyID0gcGh5c19hZGRyOwogCiAJbXBpYyA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCBtcGljKSk7CiAJaWYgKG1waWMgPT0gTlVMTCkKQEAgLTg4Myw2ICs5MzMsNyBAQAogCWlmIChmbGFncyAmIE1QSUNfUFJJTUFSWSkKIAkJbXBpYy0+aGNfaHRfaXJxLnNldF9hZmZpbml0eSA9IG1waWNfc2V0X2FmZmluaXR5OwogI2VuZGlmIC8qIENPTkZJR19NUElDX0JST0tFTl9VMyAqLworCiAjaWZkZWYgQ09ORklHX1NNUAogCW1waWMtPmhjX2lwaSA9IG1waWNfaXBpX2NoaXA7CiAJbXBpYy0+aGNfaXBpLnR5cGVuYW1lID0gbmFtZTsKQEAgLTg5MywxNSArOTQ0LDUyIEBACiAJbXBpYy0+aXJxX2NvdW50ID0gaXJxX2NvdW50OwogCW1waWMtPm51bV9zb3VyY2VzID0gMDsgLyogc28gZmFyICovCiAKKwkvKiBDaGVjayBmb3IgImJpZy1lbmRpYW4iIGluIGRldmljZS10cmVlICovCisJaWYgKG5vZGUgJiYgZ2V0X3Byb3BlcnR5KG5vZGUsICJiaWctZW5kaWFuIiwgTlVMTCkgIT0gTlVMTCkKKwkJbXBpYy0+ZmxhZ3MgfD0gTVBJQ19CSUdfRU5ESUFOOworCisKICNpZmRlZiBDT05GSUdfTVBJQ19XRUlSRAogCW1waWMtPmh3X3NldCA9IG1waWNfaW5mb3NbTVBJQ19HRVRfUkVHU0VUKGZsYWdzKV07CiAjZW5kaWYKIAorCS8qIGRlZmF1bHQgcmVnaXN0ZXIgdHlwZSAqLworCW1waWMtPnJlZ190eXBlID0gKGZsYWdzICYgTVBJQ19CSUdfRU5ESUFOKSA/CisJCW1waWNfYWNjZXNzX21taW9fYmUgOiBtcGljX2FjY2Vzc19tbWlvX2xlOworCisJLyogSWYgbm8gcGh5c2ljYWwgYWRkcmVzcyBpcyBwYXNzZWQgaW4sIGEgZGV2aWNlLW5vZGUgaXMgbWFuZGF0b3J5ICovCisJQlVHX09OKHBhZGRyID09IDAgJiYgbm9kZSA9PSBOVUxMKTsKKworCS8qIElmIG5vIHBoeXNpY2FsIGFkZHJlc3MgcGFzc2VkIGluLCBjaGVjayBpZiBpdCdzIGRjciBiYXNlZCAqLworCWlmIChwYWRkciA9PSAwICYmIGdldF9wcm9wZXJ0eShub2RlLCAiZGNyLXJlZyIsIE5VTEwpICE9IE5VTEwpCisJCW1waWMtPmZsYWdzIHw9IE1QSUNfVVNFU19EQ1I7CisKKyNpZmRlZiBDT05GSUdfUFBDX0RDUgorCWlmIChtcGljLT5mbGFncyAmIE1QSUNfVVNFU19EQ1IpIHsKKwkJY29uc3QgdTMyICpkYmFzZXA7CisJCWRiYXNlcCA9IGdldF9wcm9wZXJ0eShub2RlLCAiZGNyLXJlZyIsIE5VTEwpOworCQlCVUdfT04oZGJhc2VwID09IE5VTEwpOworCQltcGljLT5kY3JfYmFzZSA9ICpkYmFzZXA7CisJCW1waWMtPnJlZ190eXBlID0gbXBpY19hY2Nlc3NfZGNyOworCX0KKyNlbHNlCisJQlVHX09OIChtcGljLT5mbGFncyAmIE1QSUNfVVNFU19EQ1IpOworI2VuZGlmIC8qIENPTkZJR19QUENfRENSICovCisKKwkvKiBJZiB0aGUgTVBJQyBpcyBub3QgRENSIGJhc2VkLCBhbmQgbm8gcGh5c2ljYWwgYWRkcmVzcyB3YXMgcGFzc2VkCisJICogaW4sIHRyeSB0byBvYnRhaW4gb25lCisJICovCisJaWYgKHBhZGRyID09IDAgJiYgIShtcGljLT5mbGFncyAmIE1QSUNfVVNFU19EQ1IpKSB7CisJCWNvbnN0IHUzMiAqcmVnOworCQlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCQlCVUdfT04ocmVnID09IE5VTEwpOworCQlwYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5vZGUsIHJlZyk7CisJCUJVR19PTihwYWRkciA9PSBPRl9CQURfQUREUik7CisJfQorCiAJLyogTWFwIHRoZSBnbG9iYWwgcmVnaXN0ZXJzICovCi0JbXBpYy0+Z3JlZ3MgPSBpb3JlbWFwKHBoeXNfYWRkciArIE1QSUNfSU5GTyhHUkVHX0JBU0UpLCAweDEwMDApOwotCW1waWMtPnRtcmVncyA9IG1waWMtPmdyZWdzICsKLQkJICAgICAgICgoTVBJQ19JTkZPKFRJTUVSX0JBU0UpIC0gTVBJQ19JTkZPKEdSRUdfQkFTRSkpID4+IDIpOwotCUJVR19PTihtcGljLT5ncmVncyA9PSBOVUxMKTsKKwltcGljX21hcChtcGljLCBwYWRkciwgJm1waWMtPmdyZWdzLCBNUElDX0lORk8oR1JFR19CQVNFKSwgMHgxMDAwKTsKKwltcGljX21hcChtcGljLCBwYWRkciwgJm1waWMtPnRtcmVncywgTVBJQ19JTkZPKFRJTUVSX0JBU0UpLCAweDEwMDApOwogCiAJLyogUmVzZXQgKi8KIAlpZiAoZmxhZ3MgJiBNUElDX1dBTlRTX1JFU0VUKSB7CkBAIC05MjYsMTcgKzEwMTQsMTYgQEAKIAogCS8qIE1hcCB0aGUgcGVyLUNQVSByZWdpc3RlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbXBpYy0+bnVtX2NwdXM7IGkrKykgewotCQltcGljLT5jcHVyZWdzW2ldID0gaW9yZW1hcChwaHlzX2FkZHIgKyBNUElDX0lORk8oQ1BVX0JBU0UpICsKLQkJCQkJICAgaSAqIE1QSUNfSU5GTyhDUFVfU1RSSURFKSwgMHgxMDAwKTsKLQkJQlVHX09OKG1waWMtPmNwdXJlZ3NbaV0gPT0gTlVMTCk7CisJCW1waWNfbWFwKG1waWMsIHBhZGRyLCAmbXBpYy0+Y3B1cmVnc1tpXSwKKwkJCSBNUElDX0lORk8oQ1BVX0JBU0UpICsgaSAqIE1QSUNfSU5GTyhDUFVfU1RSSURFKSwKKwkJCSAweDEwMDApOwogCX0KIAogCS8qIEluaXRpYWxpemUgbWFpbiBJU1UgaWYgbm9uZSBwcm92aWRlZCAqLwogCWlmIChtcGljLT5pc3Vfc2l6ZSA9PSAwKSB7CiAJCW1waWMtPmlzdV9zaXplID0gbXBpYy0+bnVtX3NvdXJjZXM7Ci0JCW1waWMtPmlzdXNbMF0gPSBpb3JlbWFwKHBoeXNfYWRkciArIE1QSUNfSU5GTyhJUlFfQkFTRSksCi0JCQkJCU1QSUNfSU5GTyhJUlFfU1RSSURFKSAqIG1waWMtPmlzdV9zaXplKTsKLQkJQlVHX09OKG1waWMtPmlzdXNbMF0gPT0gTlVMTCk7CisJCW1waWNfbWFwKG1waWMsIHBhZGRyLCAmbXBpYy0+aXN1c1swXSwKKwkJCSBNUElDX0lORk8oSVJRX0JBU0UpLCBNUElDX0lORk8oSVJRX1NUUklERSkgKiBtcGljLT5pc3Vfc2l6ZSk7CiAJfQogCW1waWMtPmlzdV9zaGlmdCA9IDEgKyBfX2lsb2cyKG1waWMtPmlzdV9zaXplIC0gMSk7CiAJbXBpYy0+aXN1X21hc2sgPSAoMSA8PCBtcGljLT5pc3Vfc2hpZnQpIC0gMTsKQEAgLTk1NiwxMCArMTA0MywxMSBAQAogCQl2ZXJzID0gIjx1bmtub3duPiI7CiAJCWJyZWFrOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJtcGljOiBTZXR0aW5nIHVwIE1QSUMgXCIlc1wiIHZlcnNpb24gJXMgYXQgJWx4LCBtYXggJWQgQ1BVc1xuIiwKLQkgICAgICAgbmFtZSwgdmVycywgcGh5c19hZGRyLCBtcGljLT5udW1fY3B1cyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibXBpYzogSVNVIHNpemU6ICVkLCBzaGlmdDogJWQsIG1hc2s6ICV4XG4iLCBtcGljLT5pc3Vfc2l6ZSwKLQkgICAgICAgbXBpYy0+aXN1X3NoaWZ0LCBtcGljLT5pc3VfbWFzayk7CisJcHJpbnRrKEtFUk5fSU5GTyAibXBpYzogU2V0dGluZyB1cCBNUElDIFwiJXNcIiB2ZXJzaW9uICVzIGF0ICVsbHgsIgorCSAgICAgICAiIG1heCAlZCBDUFVzXG4iLAorCSAgICAgICBuYW1lLCB2ZXJzLCAodW5zaWduZWQgbG9uZyBsb25nKXBhZGRyLCBtcGljLT5udW1fY3B1cyk7CisJcHJpbnRrKEtFUk5fSU5GTyAibXBpYzogSVNVIHNpemU6ICVkLCBzaGlmdDogJWQsIG1hc2s6ICV4XG4iLAorCSAgICAgICBtcGljLT5pc3Vfc2l6ZSwgbXBpYy0+aXN1X3NoaWZ0LCBtcGljLT5pc3VfbWFzayk7CiAKIAltcGljLT5uZXh0ID0gbXBpY3M7CiAJbXBpY3MgPSBtcGljOwpAQCAtOTczLDE0ICsxMDYxLDE0IEBACiB9CiAKIHZvaWQgX19pbml0IG1waWNfYXNzaWduX2lzdShzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IGlzdV9udW0sCi0JCQkgICAgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCisJCQkgICAgcGh5c19hZGRyX3QgcGFkZHIpCiB7CiAJdW5zaWduZWQgaW50IGlzdV9maXJzdCA9IGlzdV9udW0gKiBtcGljLT5pc3Vfc2l6ZTsKIAogCUJVR19PTihpc3VfbnVtID49IE1QSUNfTUFYX0lTVSk7CiAKLQltcGljLT5pc3VzW2lzdV9udW1dID0gaW9yZW1hcChwaHlzX2FkZHIsCi0JCQkJICAgICAgTVBJQ19JTkZPKElSUV9TVFJJREUpICogbXBpYy0+aXN1X3NpemUpOworCW1waWNfbWFwKG1waWMsIHBhZGRyLCAmbXBpYy0+aXN1c1tpc3VfbnVtXSwgMCwKKwkJIE1QSUNfSU5GTyhJUlFfU1RSSURFKSAqIG1waWMtPmlzdV9zaXplKTsKIAlpZiAoKGlzdV9maXJzdCArIG1waWMtPmlzdV9zaXplKSA+IG1waWMtPm51bV9zb3VyY2VzKQogCQltcGljLT5udW1fc291cmNlcyA9IGlzdV9maXJzdCArIG1waWMtPmlzdV9zaXplOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMKaW5kZXggMmJhZTYzMi4uZTNkNzFlMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZS5jCkBAIC0xMjIsOCArMTIyLDcgQEAKIAkJCQltY25fc2hpZnQgPSBRRV9DUl9NQ05fTk9STUFMX1NISUZUOwogCQl9CiAKLQkJb3V0X2JlMzIoJnFlX2ltbXItPmNwLmNlY2RyLAotCQkJIGltbXJiYXJfdmlydF90b19waHlzKCh2b2lkICopY21kX2lucHV0KSk7CisJCW91dF9iZTMyKCZxZV9pbW1yLT5jcC5jZWNkciwgY21kX2lucHV0KTsKIAkJb3V0X2JlMzIoJnFlX2ltbXItPmNwLmNlY3IsCiAJCQkgKGNtZCB8IFFFX0NSX0ZMRyB8ICgodTMyKSBkZXZpY2UgPDwgZGV2X3NoaWZ0KSB8ICh1MzIpCiAJCQkgIG1jbl9wcm90b2NvbCA8PCBtY25fc2hpZnQpKTsKQEAgLTE3NSw4ICsxNzQsNyBAQAogCXUzMiBkaXZpc29yLCB0ZW1wdmFsOwogCWludCBkaXYxNiA9IDA7CiAKLQlicCA9ICZxZV9pbW1yLT5icmcuYnJnYzE7Ci0JYnAgKz0gYnJnOworCWJwID0gJnFlX2ltbXItPmJyZy5icmdjW2JyZ107CiAKIAlkaXZpc29yID0gKGdldF9icmdfY2xrKCkgLyByYXRlKTsKIAlpZiAoZGl2aXNvciA+IFFFX0JSR0NfRElWSVNPUl9NQVggKyAxKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWVfaWMuYwppbmRleCA2OTk1ZjUxLi43NGU0OGQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2ljLmMKQEAgLTIyMywyMyArMjIzLDE1IEBACiAJcWVfaWNfd3JpdGUocWVfaWMtPnJlZ3MsIHFlX2ljX2luZm9bc3JjXS5tYXNrX3JlZywKIAkJICAgIHRlbXAgJiB+cWVfaWNfaW5mb1tzcmNdLm1hc2spOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWVfaWNfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBxZV9pY19tYXNrX2lycV9hbmRfYWNrKHVuc2lnbmVkIGludCB2aXJxKQotewotCXN0cnVjdCBxZV9pYyAqcWVfaWMgPSBxZV9pY19mcm9tX2lycSh2aXJxKTsKLQl1bnNpZ25lZCBpbnQgc3JjID0gdmlycV90b19odyh2aXJxKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiB0ZW1wOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnFlX2ljX2xvY2ssIGZsYWdzKTsKLQotCXRlbXAgPSBxZV9pY19yZWFkKHFlX2ljLT5yZWdzLCBxZV9pY19pbmZvW3NyY10ubWFza19yZWcpOwotCXFlX2ljX3dyaXRlKHFlX2ljLT5yZWdzLCBxZV9pY19pbmZvW3NyY10ubWFza19yZWcsCi0JCSAgICB0ZW1wICYgfnFlX2ljX2luZm9bc3JjXS5tYXNrKTsKLQotCS8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gZm9yIGFjayBoZXJlLCBhY2sgaXMgaGFuZGxlZCBpbiBJU1IgKi8KKwkvKiBGbHVzaCB0aGUgYWJvdmUgd3JpdGUgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHM7IG90aGVyd2lzZSwKKwkgKiBzcHVyaW91cyBpbnRlcnJ1cHRzIHdpbGwgc29tZXRpbWVzIGhhcHBlbi4gIFRvIGJlIDEwMCUgc3VyZQorCSAqIHRoYXQgdGhlIHdyaXRlIGhhcyByZWFjaGVkIHRoZSBkZXZpY2UgYmVmb3JlIGludGVycnVwdHMgYXJlCisJICogZW5hYmxlZCwgdGhlIG1hc2sgcmVnaXN0ZXIgd291bGQgaGF2ZSB0byBiZSByZWFkIGJhY2s7IGhvd2V2ZXIsCisJICogdGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLCBvbmx5IHRvIGF2b2lkIHdhc3RpbmcKKwkgKiB0aW1lIG9uIGEgbGFyZ2UgbnVtYmVyIG9mIHNwdXJpb3VzIGludGVycnVwdHMuICBJbiB0ZXN0aW5nLAorCSAqIGEgc3luYyByZWR1Y2VkIHRoZSBvYnNlcnZlZCBzcHVyaW91cyBpbnRlcnJ1cHRzIHRvIHplcm8uCisJICovCisJbWIoKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFlX2ljX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTI0OCw3ICsyNDAsNyBAQAogCS50eXBlbmFtZSA9ICIgUUVJQyAgIiwKIAkudW5tYXNrID0gcWVfaWNfdW5tYXNrX2lycSwKIAkubWFzayA9IHFlX2ljX21hc2tfaXJxLAotCS5tYXNrX2FjayA9IHFlX2ljX21hc2tfaXJxX2FuZF9hY2ssCisJLm1hc2tfYWNrID0gcWVfaWNfbWFza19pcnEsCiB9OwogCiBzdGF0aWMgaW50IHFlX2ljX2hvc3RfbWF0Y2goc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCkBAIC0zMzEsMzQgKzMyMywyMiBAQAogCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChxZV9pYy0+aXJxaG9zdCwgaXJxKTsKIH0KIAotLyogRklYTUU6IFdlIG1hc2sgYWxsIHRoZSBRRSBMb3cgaW50ZXJydXB0cyB3aGlsZSBoYW5kbGluZy4gIFdlIHNob3VsZAotICogbGV0IG90aGVyIGludGVycnVwdCBjb21lIGluLCBidXQgQkFEIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZCAqLwogdm9pZCBmYXN0Y2FsbCBxZV9pY19jYXNjYWRlX2xvdyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJc3RydWN0IHFlX2ljICpxZV9pYyA9IGRlc2MtPmhhbmRsZXJfZGF0YTsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY1tpcnFdLmNoaXA7Ci0KIAl1bnNpZ25lZCBpbnQgY2FzY2FkZV9pcnEgPSBxZV9pY19nZXRfbG93X2lycShxZV9pYyk7CiAKLQljaGlwLT5tYXNrX2FjayhpcnEpOwogCWlmIChjYXNjYWRlX2lycSAhPSBOT19JUlEpCiAJCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7Ci0JY2hpcC0+dW5tYXNrKGlycSk7CiB9CiAKLS8qIEZJWE1FOiBXZSBtYXNrIGFsbCB0aGUgUUUgSGlnaCBpbnRlcnJ1cHRzIHdoaWxlIGhhbmRsaW5nLiAgV2Ugc2hvdWxkCi0gKiBsZXQgb3RoZXIgaW50ZXJydXB0IGNvbWUgaW4sIGJ1dCBCQUQgaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkICovCiB2b2lkIGZhc3RjYWxsIHFlX2ljX2Nhc2NhZGVfaGlnaCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJc3RydWN0IHFlX2ljICpxZV9pYyA9IGRlc2MtPmhhbmRsZXJfZGF0YTsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY1tpcnFdLmNoaXA7Ci0KIAl1bnNpZ25lZCBpbnQgY2FzY2FkZV9pcnEgPSBxZV9pY19nZXRfaGlnaF9pcnEocWVfaWMpOwogCi0JY2hpcC0+bWFza19hY2soaXJxKTsKIAlpZiAoY2FzY2FkZV9pcnEgIT0gTk9fSVJRKQogCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOwotCWNoaXAtPnVubWFzayhpcnEpOwogfQogCiB2b2lkIF9faW5pdCBxZV9pY19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdW5zaWduZWQgaW50IGZsYWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwppbmRleCA5MTZjOWU1Li5hYzEyYTQ0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwpAQCAtMjA3LDYgKzIwNyw3IEBACiAJCWNhc2UgUUVfQ0xLMTg6CXNvdXJjZSA9IDg7IGJyZWFrOwogCQljYXNlIFFFX0NMSzc6CXNvdXJjZSA9IDk7IGJyZWFrOwogCQljYXNlIFFFX0NMSzg6CXNvdXJjZSA9IDEwOyBicmVhazsKKwkJY2FzZSBRRV9DTEsxNjoJc291cmNlID0gMTE7IGJyZWFrOwogCQlkZWZhdWx0Oglzb3VyY2UgPSAtMTsgYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0yMjIsNiArMjIzLDcgQEAKIAkJY2FzZSBRRV9DTEsyMjoJc291cmNlID0gODsgYnJlYWs7CiAJCWNhc2UgUUVfQ0xLNzoJc291cmNlID0gOTsgYnJlYWs7CiAJCWNhc2UgUUVfQ0xLODoJc291cmNlID0gMTA7IGJyZWFrOworCQljYXNlIFFFX0NMSzE2Oglzb3VyY2UgPSAxMTsgYnJlYWs7CiAJCWRlZmF1bHQ6IAlzb3VyY2UgPSAtMTsgYnJlYWs7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYwppbmRleCBjMmJlNzM0Li5lNjU3NTU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKQEAgLTE2Myw3ICsxNjMsNyBAQAogCiAJLyogY2hlY2sgaWYgdGhlIFVDQyBwb3J0IG51bWJlciBpcyBpbiByYW5nZS4gKi8KIAlpZiAoKHVmX2luZm8tPnVjY19udW0gPCAwKSB8fCAodWZfaW5mby0+dWNjX251bSA+IFVDQ19NQVhfTlVNIC0gMSkpIHsKLQkJdWNjZl9lcnIoInVjY19mYXN0X2luaXQ6IElsbGFnYWwgVUNDIG51bWJlciEiKTsKKwkJdWNjZl9lcnIoInVjY19mYXN0X2luaXQ6IElsbGVnYWwgVUNDIG51bWJlciEiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMTYsMTQgKzIxNiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl1Y2NmID0gKHN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICopCi0JCSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCXVjY2YgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghdWNjZikgewogCQl1Y2NmX2VycgogCQkgICAgKCJ1Y2NfZmFzdF9pbml0OiBObyBtZW1vcnkgZm9yIFVDQyBzbG93IGRhdGEgc3RydWN0dXJlISIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHVjY2YsIDAsIHNpemVvZihzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSkpOwogCiAJLyogRmlsbCBmYXN0IFVDQyBzdHJ1Y3R1cmUgKi8KIAl1Y2NmLT51Zl9pbmZvID0gdWZfaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19zbG93LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2Nfc2xvdy5jCmluZGV4IDFmYjg4ZWYuLjQ3YjU2MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19zbG93LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX3Nsb3cuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAKIAkvKiBjaGVjayBpZiB0aGUgVUNDIHBvcnQgbnVtYmVyIGlzIGluIHJhbmdlLiAqLwogCWlmICgodXNfaW5mby0+dWNjX251bSA8IDApIHx8ICh1c19pbmZvLT51Y2NfbnVtID4gVUNDX01BWF9OVU0gLSAxKSkgewotCQl1Y2NzX2VycigidWNjX3Nsb3dfaW5pdDogSWxsYWdhbCBVQ0MgbnVtYmVyISIpOworCQl1Y2NzX2VycigidWNjX3Nsb3dfaW5pdDogSWxsZWdhbCBVQ0MgbnVtYmVyISIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE2OCwxNCArMTY4LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXVjY3MgPSAoc3RydWN0IHVjY19zbG93X3ByaXZhdGUgKikKLQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19zbG93X3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwl1Y2NzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVjY19zbG93X3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVjY3MpIHsKIAkJdWNjc19lcnIKIAkJICAgICgidWNjX3Nsb3dfaW5pdDogTm8gbWVtb3J5IGZvciBVQ0Mgc2xvdyBkYXRhIHN0cnVjdHVyZSEiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldCh1Y2NzLCAwLCBzaXplb2Yoc3RydWN0IHVjY19zbG93X3ByaXZhdGUpKTsKIAogCS8qIEZpbGwgc2xvdyBVQ0Mgc3RydWN0dXJlICovCiAJdWNjcy0+dXNfaW5mbyA9IHVzX2luZm87CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3JvbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODU1YTNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9yb20uYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogUk9NIGRldmljZSByZWdpc3RyYXRpb24KKyAqCisgKiAoQykgMjAwNiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+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+UlRDX0ZSRVFfU0VMRUNULCBzYXZlX2ZyZXFfc2VsZWN0KTsKLQotCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCmluZGV4IDExZGUwOTAuLjk3ZjM3ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCkBAIC00OCw3ICs0OCw3IEBACiAJdHNpID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInRzaS1icmlkZ2UiKTsKIAlpZiAodHNpKSB7CiAJCXVuc2lnbmVkIGludCBzaXplOwotCQl2b2lkICpwcm9wID0gZ2V0X3Byb3BlcnR5KHRzaSwgInJlZyIsICZzaXplKTsKKwkJY29uc3Qgdm9pZCAqcHJvcCA9IGdldF9wcm9wZXJ0eSh0c2ksICJyZWciLCAmc2l6ZSk7CiAJCXRzaTEwOF9jc3JfYmFzZSA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHRzaSwgcHJvcCk7CiAJCW9mX25vZGVfcHV0KHRzaSk7CiAJfTsKQEAgLTc5LDcgKzc5LDcgQEAKIAkJaHdfaW5mbyB0c2lfZXRoX2RhdGE7CiAJCXVuc2lnbmVkIGludCAqaWQ7CiAJCXVuc2lnbmVkIGludCAqcGh5X2lkOwotCQl2b2lkICptYWNfYWRkcjsKKwkJY29uc3Qgdm9pZCAqbWFjX2FkZHI7CiAJCXBoYW5kbGUgKnBoOwogCiAJCW1lbXNldChyLCAwLCBzaXplb2YocikpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9wY2kuYwppbmRleCAzMjJmODZlLi5hZTI0OWM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9wY2kuYwpAQCAtMyw2ICszLDggQEAKICAqCiAgKiAyMDA0LTIwMDUgKGMpIFR1bmRyYSBTZW1pY29uZHVjdG9yIENvcnAuCiAgKiBBdXRob3I6IEFsZXggQm91bmluZSAoYWxleGFuZHJlYkB0dW5kcmEuY29tKQorICogQXV0aG9yOiBSb3kgWmFuZyAodGllLWZlaS56YW5nQGZyZWVzY2FsZS5jb20pCisgKiAJICAgQWRkIHBjaSBpbnRlcnJ1cHQgcm91dGVyIGhvc3QKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKQEAgLTQ4LDYgKzUwLDggQEAKIAogdTMyIHRzaTEwOF9wY2lfY2ZnX2Jhc2U7CiB1MzIgdHNpMTA4X2Nzcl92aXJfYmFzZTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBjaV9pcnFfbm9kZTsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2hvc3QgKnBjaV9pcnFfaG9zdDsKIAogZXh0ZXJuIHUzMiBnZXRfdmlyX2NzcmJhc2Uodm9pZCk7CiBleHRlcm4gdTMyIHRzaTEwOF9yZWFkX3JlZyh1MzIgcmVnX29mZnNldCk7CkBAIC0zNzgsNiArMzgyLDM4IEBACiAJLnVubWFzayA9IHRzaTEwOF9wY2lfaXJxX2VuYWJsZSwKIH07CiAKK3N0YXRpYyBpbnQgcGNpX2lycV9ob3N0X3hsYXRlKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpjdCwKKwkJCSAgICB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQkJICAgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF9mbGFncykKK3sKKwkqb3V0X2h3aXJxID0gaW50c3BlY1swXTsKKwkqb3V0X2ZsYWdzID0gSVJRX1RZUEVfTEVWRUxfSElHSDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lfaXJxX2hvc3RfbWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEsCisJCQkgIGlycV9od19udW1iZXJfdCBodykKK3sJdW5zaWduZWQgaW50IGlycTsKKwlEQkcoIiVzKCVkLCAweCVseClcbiIsIF9fRlVOQ1RJT05fXywgdmlycSwgaHcpOworCWlmICgodmlycSA+PSAxKSAmJiAodmlycSA8PSA0KSl7CisJCWlycSA9IHZpcnEgKyBJUlFfUENJX0lOVEFEX0JBU0UgLSAxOworCQlnZXRfaXJxX2Rlc2MoaXJxKS0+c3RhdHVzIHw9IElSUV9MRVZFTDsKKwkJc2V0X2lycV9jaGlwKGlycSwgJnRzaTEwOF9wY2lfaXJxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2lycV9ob3N0X21hdGNoKHN0cnVjdCBpcnFfaG9zdCAqaCwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXJldHVybiBwY2lfaXJxX25vZGUgPT0gbm9kZTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfaG9zdF9vcHMgcGNpX2lycV9ob3N0X29wcyA9IHsKKwkubWF0Y2ggPSBwY2lfaXJxX2hvc3RfbWF0Y2gsCisJLm1hcCA9IHBjaV9pcnFfaG9zdF9tYXAsCisJLnhsYXRlID0gcGNpX2lycV9ob3N0X3hsYXRlLAorfTsKKwogLyoKICAqIEV4cG9ydGVkIGZ1bmN0aW9ucwogICovCkBAIC0zOTEsMTUgKzQyNywxNSBAQAogICogdG8gdGhlIE1QSUMuCiAgKi8KIAotdm9pZCBfX2luaXQgdHNpMTA4X3BjaV9pbnRfaW5pdCh2b2lkKQordm9pZCBfX2luaXQgdHNpMTA4X3BjaV9pbnRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7Ci0JdV9pbnQgaTsKLQogCURCRygiVHNpMTA4X3BjaV9pbnRfaW5pdDogaW5pdGlhbGl6aW5nIFBDSSBpbnRlcnJ1cHRzXG4iKTsKIAotCWZvciAoaSA9IDA7IGkgPCBOVU1fUENJX0lSUVM7IGkrKykgewotCQlpcnFfZGVzY1tpICsgSVJRX1BDSV9JTlRBRF9CQVNFXS5jaGlwID0gJnRzaTEwOF9wY2lfaXJxOwotCQlpcnFfZGVzY1tpICsgSVJRX1BDSV9JTlRBRF9CQVNFXS5zdGF0dXMgfD0gSVJRX0xFVkVMOworCXBjaV9pcnFfbm9kZSA9IG9mX25vZGVfZ2V0KG5vZGUpOworCXBjaV9pcnFfaG9zdCA9IGlycV9hbGxvY19ob3N0KElSUV9IT1NUX01BUF9MRUdBQ1ksIDAsICZwY2lfaXJxX2hvc3Rfb3BzLCAwKTsKKwlpZiAocGNpX2lycV9ob3N0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwY2lfaXJxX2hvc3Q6IGZhaWxlZCB0byBhbGxvY2F0ZSBpcnEgaG9zdCAhXG4iKTsKKwkJcmV0dXJuOwogCX0KIAogCWluaXRfcGNpX3NvdXJjZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMveG1vbi9NYWtlZmlsZQppbmRleCAxMDlkODc0Li41MWQ5NzU4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMveG1vbi9NYWtlZmlsZQpAQCAtMyw1ICszLDEwIEBACiBpZmRlZiBDT05GSUdfUFBDNjQKIEVYVFJBX0NGTEFHUyArPSAtbW5vLW1pbmltYWwtdG9jCiBlbmRpZgotb2JqLXkJCQkrPSB4bW9uLm8gcHBjLWRpcy5vIHBwYy1vcGMubyBzZXRqbXAubyBzdGFydC5vIFwKLQkJCSAgIG5vbnN0ZGlvLm8KKworb2JqLXkJCQkrPSB4bW9uLm8gc2V0am1wLm8gc3RhcnQubyBub25zdGRpby5vCisKK2lmZGVmIENPTkZJR19YTU9OX0RJU0FTU0VNQkxZCitvYmoteQkJCSs9IHBwYy1kaXMubyBwcGMtb3BjLm8KK29iai0kKENPTkZJR19TUFVfQkFTRSkJKz0gc3B1LWRpcy5vIHNwdS1vcGMubworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL2Rpcy1hc20uaCBiL2FyY2gvcG93ZXJwYy94bW9uL2Rpcy1hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTM1MzNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3htb24vZGlzLWFzbS5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX1BPV0VSUENfWE1PTl9ESVNfQVNNX0gKKyNkZWZpbmUgX1BPV0VSUENfWE1PTl9ESVNfQVNNX0gKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworZXh0ZXJuIHZvaWQgcHJpbnRfYWRkcmVzcyAodW5zaWduZWQgbG9uZyBtZW1hZGRyKTsKKworI2lmZGVmIENPTkZJR19YTU9OX0RJU0FTU0VNQkxZCitleHRlcm4gaW50IHByaW50X2luc25fcG93ZXJwYyh1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGxvbmcgbWVtYWRkcik7CitleHRlcm4gaW50IHByaW50X2luc25fc3B1KHVuc2lnbmVkIGxvbmcgaW5zbiwgdW5zaWduZWQgbG9uZyBtZW1hZGRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBwcmludF9pbnNuX3Bvd2VycGModW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nIG1lbWFkZHIpCit7CisJcHJpbnRmKCIlLjh4IiwgaW5zbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByaW50X2luc25fc3B1KHVuc2lnbmVkIGxvbmcgaW5zbiwgdW5zaWduZWQgbG9uZyBtZW1hZGRyKQoreworCXByaW50ZigiJS44eCIsIGluc24pOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfUE9XRVJQQ19YTU9OX0RJU19BU01fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vcHBjLWRpcy5jIGIvYXJjaC9wb3dlcnBjL3htb24vcHBjLWRpcy5jCmluZGV4IGFjMGE5ZDIuLjg5MDk4ZjMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi9wcGMtZGlzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24vcHBjLWRpcy5jCkBAIC0xLDUgKzEsNiBAQAogLyogcHBjLWRpcy5jIC0tIERpc2Fzc2VtYmxlIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKIAogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgpAQCAtMTYsMjcgKzE3LDM2IEBACiAKIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KK1NvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCiAKKyNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlICJub25zdGRpby5oIgogI2luY2x1ZGUgImFuc2lkZWNsLmgiCiAjaW5jbHVkZSAicHBjLmgiCi0KLWV4dGVybiB2b2lkIHByaW50X2FkZHJlc3MgKHVuc2lnbmVkIGxvbmcgbWVtYWRkcik7CisjaW5jbHVkZSAiZGlzLWFzbS5oIgogCiAvKiBQcmludCBhIFBvd2VyUEMgb3IgUE9XRVIgaW5zdHJ1Y3Rpb24uICAqLwogCiBpbnQKLXByaW50X2luc25fcG93ZXJwYyAodW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nIG1lbWFkZHIsIGludCBkaWFsZWN0KQorcHJpbnRfaW5zbl9wb3dlcnBjICh1bnNpZ25lZCBsb25nIGluc24sIHVuc2lnbmVkIGxvbmcgbWVtYWRkcikKIHsKICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGU7CiAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSAqb3Bjb2RlX2VuZDsKICAgdW5zaWduZWQgbG9uZyBvcDsKKyAgaW50IGRpYWxlY3Q7CiAKLSAgaWYgKGRpYWxlY3QgPT0gMCkKLSAgICBkaWFsZWN0ID0gUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NMQVNTSUMgfCBQUENfT1BDT0RFX0NPTU1PTgorICBkaWFsZWN0ID0gUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NMQVNTSUMgfCBQUENfT1BDT0RFX0NPTU1PTgogCSAgICAgIHwgUFBDX09QQ09ERV82NCB8IFBQQ19PUENPREVfUE9XRVI0IHwgUFBDX09QQ09ERV9BTFRJVkVDOwogCisgIGlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUlNfUE9XRVI1KSkKKyAgICBkaWFsZWN0IHw9IFBQQ19PUENPREVfUE9XRVI1OworCisgIGlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUlNfQ0VMTCkpCisgICAgZGlhbGVjdCB8PSBQUENfT1BDT0RFX0NFTEwgfCBQUENfT1BDT0RFX0FMVElWRUM7CisKKyAgaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSU19QT1dFUjYpKQorICAgIGRpYWxlY3QgfD0gUFBDX09QQ09ERV9QT1dFUjUgfCBQUENfT1BDT0RFX1BPV0VSNiB8IFBQQ19PUENPREVfQUxUSVZFQzsKKwogICAvKiBHZXQgdGhlIG1ham9yIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwogICBvcCA9IFBQQ19PUCAoaW5zbik7CiAKQEAgLTEyMSw3ICsxMzEsOCBAQAogCSAgICB9CiAKIAkgIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBmbGFncy4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfR1BSKSAhPSAwKQorCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0dQUikgIT0gMAorCSAgICAgIHx8ICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9HUFJfMCkgIT0gMCAmJiB2YWx1ZSAhPSAwKSkKIAkgICAgcHJpbnRmKCJyJWxkIiwgdmFsdWUpOwogCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRlBSKSAhPSAwKQogCSAgICBwcmludGYoImYlbGQiLCB2YWx1ZSk7CkBAIC0xMzcsNyArMTQ4LDcgQEAKIAkgIGVsc2UKIAkgICAgewogCSAgICAgIGlmIChvcGVyYW5kLT5iaXRzID09IDMpCi0JCXByaW50ZigiY3IlZCIsIHZhbHVlKTsKKwkJcHJpbnRmKCJjciVsZCIsIHZhbHVlKTsKIAkgICAgICBlbHNlCiAJCXsKIAkJICBzdGF0aWMgY29uc3QgY2hhciAqY2JuYW1lc1s0XSA9IHsgImx0IiwgImd0IiwgImVxIiwgInNvIiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vcHBjLW9wYy5jIGIvYXJjaC9wb3dlcnBjL3htb24vcHBjLW9wYy5jCmluZGV4IDVlZThmYzMuLjVkODQxZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3BwYy1vcGMuYworKysgYi9hcmNoL3Bvd2VycGMveG1vbi9wcGMtb3BjLmMKQEAgLTEsNiArMSw2IEBACiAvKiBwcGMtb3BjLmMgLS0gUG93ZXJQQyBvcGNvZGUgbGlzdAotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCisgICAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAogCiAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCkBAIC0xNyw4ICsxNyw4IEBACiAKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICAgMDIxMTAtMTMwMSwgVVNBLiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgIm5vbnN0ZGlvLmgiCkBAIC04Niw2ICs4Niw4IEBACiBzdGF0aWMgbG9uZyBleHRyYWN0X3NoNiAodW5zaWduZWQgbG9uZywgaW50LCBpbnQgKik7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfc3ByICh1bnNpZ25lZCBsb25nLCBsb25nLCBpbnQsIGNvbnN0IGNoYXIgKiopOwogc3RhdGljIGxvbmcgZXh0cmFjdF9zcHIgKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3NwcmcgKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGludCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgbG9uZyBleHRyYWN0X3NwcmcgKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3RiciAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKIHN0YXRpYyBsb25nIGV4dHJhY3RfdGJyICh1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9ldjIgKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGludCwgY29uc3QgY2hhciAqKik7CkBAIC0xOTYsOCArMTk4LDExIEBACiAjZGVmaW5lIEJPRSBCTyArIDEKICAgeyA1LCAyMSwgaW5zZXJ0X2JvZSwgZXh0cmFjdF9ib2UsIDAgfSwKIAorI2RlZmluZSBCSCBCT0UgKyAxCisgIHsgMiwgMTEsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCisKICAgLyogVGhlIEJUIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJUIEJPRSArIDEKKyNkZWZpbmUgQlQgQkggKyAxCiAgIHsgNSwgMjEsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0NSIH0sCiAKICAgLyogVGhlIGNvbmRpdGlvbiByZWdpc3RlciBudW1iZXIgcG9ydGlvbiBvZiB0aGUgQkkgZmllbGQgaW4gYSBCIGZvcm0KQEAgLTMwMSwxMCArMzA2LDE0IEBACiAjZGVmaW5lIEwgRlhNNCArIDEKICAgeyAxLCAyMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKIAotICAvKiBUaGUgTEVWIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExFViBMICsgMQorICAvKiBUaGUgTEVWIGZpZWxkIGluIGEgUE9XRVIgU1ZDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTVkNfTEVWIEwgKyAxCiAgIHsgNywgNSwgTlVMTCwgTlVMTCwgMCB9LAogCisgIC8qIFRoZSBMRVYgZmllbGQgaW4gYW4gU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIExFViBTVkNfTEVWICsgMQorICB7IDcsIDUsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCisKICAgLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBsb3dlciB0d28gYml0cyBhcmUKICAgICAgZm9yY2VkIHRvIHplcm8uICAqLwogI2RlZmluZSBMSSBMRVYgKyAxCkBAIC0zNDYsNyArMzU1LDcgQEAKIAogICAvKiBUaGUgTU8gZmllbGQgaW4gYW4gbWJhciBpbnN0cnVjdGlvbi4gICovCiAjZGVmaW5lIE1PIE1CNiArIDEKLSAgeyA1LCAyMSwgTlVMTCwgTlVMTCwgMCB9LAorICB7IDUsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAogCiAgIC8qIFRoZSBOQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgdmFsdWUgMzIgaXMgc3RvcmVkIGFzCiAgICAgIDAuICAqLwpAQCAtMzY0LDMwICszNzMsMzggQEAKICNkZWZpbmUgUkFfTUFTSyAoMHgxZiA8PCAxNikKICAgeyA1LCAxNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfR1BSIH0sCiAKKyAgLyogQXMgYWJvdmUsIGJ1dCAwIGluIHRoZSBSQSBmaWVsZCBtZWFucyB6ZXJvLCBub3QgcjAuICAqLworI2RlZmluZSBSQTAgUkEgKyAxCisgIHsgNSwgMTYsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUl8wIH0sCisKICAgLyogVGhlIFJBIGZpZWxkIGluIHRoZSBEUSBmb3JtIGxxIGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbAogICAgICB2YWx1ZSByZXN0cmljdGlvbnMuICAqLwotI2RlZmluZSBSQVEgUkEgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9yYXEsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUiB9LAorI2RlZmluZSBSQVEgUkEwICsgMQorICB7IDUsIDE2LCBpbnNlcnRfcmFxLCBOVUxMLCBQUENfT1BFUkFORF9HUFJfMCB9LAogCiAgIC8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCiAgICAgIGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBIGZpZWxkIG1heSBub3QgYmUgemVybyBhbmQgbWF5IG5vdAogICAgICBlcXVhbCB0aGUgUlQgZmllbGQuICAqLwogI2RlZmluZSBSQUwgUkFRICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFsLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfSwKKyAgeyA1LCAxNiwgaW5zZXJ0X3JhbCwgTlVMTCwgUFBDX09QRVJBTkRfR1BSXzAgfSwKIAogICAvKiBUaGUgUkEgZmllbGQgaW4gYW4gbG13IGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbCB2YWx1ZQogICAgICByZXN0cmljdGlvbnMuICAqLwogI2RlZmluZSBSQU0gUkFMICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFtLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfSwKKyAgeyA1LCAxNiwgaW5zZXJ0X3JhbSwgTlVMTCwgUFBDX09QRVJBTkRfR1BSXzAgfSwKIAogICAvKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwogICAgICBzdG9yZSBvciBhbiB1cGRhdGluZyBmbG9hdGluZyBwb2ludCBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQQogICAgICBmaWVsZCBtYXkgbm90IGJlIHplcm8uICAqLwogI2RlZmluZSBSQVMgUkFNICsgMQotICB7IDUsIDE2LCBpbnNlcnRfcmFzLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfSwKKyAgeyA1LCAxNiwgaW5zZXJ0X3JhcywgTlVMTCwgUFBDX09QRVJBTkRfR1BSXzAgfSwKKworICAvKiBUaGUgUkEgZmllbGQgb2YgdGhlIHRsYndlIGluc3RydWN0aW9uLCB3aGljaCBpcyBvcHRpb25hbC4gICovCisjZGVmaW5lIFJBT1BUIFJBUyArIDEKKyAgeyA1LCAxNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfR1BSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKIAogICAvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCwgWE8sIE0sIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUkIgUkFTICsgMQorI2RlZmluZSBSQiBSQU9QVCArIDEKICNkZWZpbmUgUkJfTUFTSyAoMHgxZiA8PCAxMSkKICAgeyA1LCAxMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfR1BSIH0sCiAKQEAgLTQwOCwxNSArNDI1LDIwIEBACiAgIC8qIFRoZSBSUyBmaWVsZCBvZiB0aGUgRFMgZm9ybSBzdHEgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsCiAgICAgIHZhbHVlIHJlc3RyaWN0aW9ucy4gICovCiAjZGVmaW5lIFJTUSBSUyArIDEKLSAgeyA1LCAyMSwgaW5zZXJ0X3JzcSwgTlVMTCwgUFBDX09QRVJBTkRfR1BSIH0sCisgIHsgNSwgMjEsIGluc2VydF9yc3EsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUl8wIH0sCiAKICAgLyogVGhlIFJUIGZpZWxkIG9mIHRoZSBEUSBmb3JtIGxxIGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbAogICAgICB2YWx1ZSByZXN0cmljdGlvbnMuICAqLwogI2RlZmluZSBSVFEgUlNRICsgMQotICB7IDUsIDIxLCBpbnNlcnRfcnRxLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfSwKKyAgeyA1LCAyMSwgaW5zZXJ0X3J0cSwgTlVMTCwgUFBDX09QRVJBTkRfR1BSXzAgfSwKKworICAvKiBUaGUgUlMgZmllbGQgb2YgdGhlIHRsYndlIGluc3RydWN0aW9uLCB3aGljaCBpcyBvcHRpb25hbC4gICovCisjZGVmaW5lIFJTTyBSVFEgKyAxCisjZGVmaW5lIFJUTyBSU08KKyAgeyA1LCAyMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfR1BSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKIAogICAvKiBUaGUgU0ggZmllbGQgaW4gYW4gWCBvciBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSCBSVFEgKyAxCisjZGVmaW5lIFNIIFJTTyArIDEKICNkZWZpbmUgU0hfTUFTSyAoMHgxZiA8PCAxMSkKICAgeyA1LCAxMSwgTlVMTCwgTlVMTCwgMCB9LAogCkBAIC00MjUsOCArNDQ3LDEyIEBACiAjZGVmaW5lIFNINl9NQVNLICgoMHgxZiA8PCAxMSkgfCAoMSA8PCAxKSkKICAgeyA2LCAxLCBpbnNlcnRfc2g2LCBleHRyYWN0X3NoNiwgMCB9LAogCisgIC8qIFRoZSBTSCBmaWVsZCBvZiB0aGUgdGxid2UgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIG9wdGlvbmFsLiAgKi8KKyNkZWZpbmUgU0hPIFNINiArIDEKKyAgeyA1LCAxMSxOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCiAgIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNJIFNINiArIDEKKyNkZWZpbmUgU0kgU0hPICsgMQogICB7IDE2LCAwLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9TSUdORUQgfSwKIAogICAvKiBUaGUgU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB3ZSBhY2NlcHQgYSB3aWRlIHJhbmdlCkBAIC00NDgsOCArNDc0LDcgQEAKIAogICAvKiBUaGUgU1BSRyByZWdpc3RlciBudW1iZXIgaW4gYW4gWEZYIGZvcm0gbVtmdF1zcHJnIGluc3RydWN0aW9uLiAgKi8KICNkZWZpbmUgU1BSRyBTUFJCQVQgKyAxCi0jZGVmaW5lIFNQUkdfTUFTSyAoMHgzIDw8IDE2KQotICB7IDIsIDE2LCBOVUxMLCBOVUxMLCAwIH0sCisgIHsgNSwgMTYsIGluc2VydF9zcHJnLCBleHRyYWN0X3NwcmcsIDAgfSwKIAogICAvKiBUaGUgU1IgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KICNkZWZpbmUgU1IgU1BSRyArIDEKQEAgLTUzNiwxMCArNTYxLDQ1IEBACiAjZGVmaW5lIFdTX01BU0sgKDB4NyA8PCAxMSkKICAgeyAzLCAxMSwgTlVMTCwgTlVMTCwgMCB9LAogCi0gIC8qIFRoZSBMIGZpZWxkIGluIGFuIG10bXNyZCBpbnN0cnVjdGlvbiAqLworICAvKiBUaGUgTCBmaWVsZCBpbiBhbiBtdG1zcmQgb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KICNkZWZpbmUgTVRNU1JEX0wgV1MgKyAxCisjZGVmaW5lIEFfTCBNVE1TUkRfTAogICB7IDEsIDE2LCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAogCisgIC8qIFRoZSBEQ00gZmllbGQgaW4gYSBaIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBEQ00gTVRNU1JEX0wgKyAxCisgIHsgNiwgMTYsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBMaWtld2lzZSwgdGhlIERHTSBmaWVsZCBpbiBhIFogZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIERHTSBEQ00gKyAxCisgIHsgNiwgMTYsIE5VTEwsIE5VTEwsIDAgfSwKKworI2RlZmluZSBURSBER00gKyAxCisgIHsgNSwgMTEsIE5VTEwsIE5VTEwsIDAgfSwKKworI2RlZmluZSBSTUMgVEUgKyAxCisgIHsgMiwgMjEsIE5VTEwsIE5VTEwsIDAgfSwKKworI2RlZmluZSBSIFJNQyArIDEKKyAgeyAxLCAxNSwgTlVMTCwgTlVMTCwgMCB9LAorCisjZGVmaW5lIFNQIFIgKyAxCisgIHsgMiwgMTEsIE5VTEwsIE5VTEwsIDAgfSwKKworI2RlZmluZSBTIFNQICsgMQorICB7IDEsIDExLCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogU0ggZmllbGQgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIDE2LiAgKi8KKyNkZWZpbmUgU0gxNiBTICsgMQorICB7IDYsIDEwLCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogVGhlIEwgZmllbGQgaW4gYW4gWCBmb3JtIHdpdGggdGhlIFJUIGZpZWxkIGZpeGVkIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgWFJUX0wgU0gxNiArIDEKKyAgeyAyLCAyMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKworICAvKiBUaGUgRUggZmllbGQgaW4gbGFyeCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEVIIFhSVF9MICsgMQorICB7IDEsIDAsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCiB9OwogCiAvKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KQEAgLTU1MCw3ICs2MTAsNiBAQAogICAgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlCiAgICBzYW1lLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X2JhdCAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBsb25nIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQsCkBAIC01NzYsNyArNjM1LDYgQEAKICAgIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZQogICAgc2FtZS4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9iYmEgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgbG9uZyB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VELApAQCAtNTk5LDcgKzY1Nyw2IEBACiAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCiAgICBmb3JjZWQgdG8gemVyby4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9iZCAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgIGxvbmcgdmFsdWUsCkBAIC02MDksNyArNjY2LDYgQEAKICAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwogfQogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyBsb25nCiBleHRyYWN0X2JkICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCkBAIC02MzEsNyArNjg3LDYgQEAKICAgIGluIEJPIGZpZWxkLCB0aGUgImEiIGJpdCBpcyAwMDAxMCBmb3IgYnJhbmNoIG9uIENSKEJJKSBhbmQgMDEwMDAKICAgIGZvciBicmFuY2ggb24gQ1RSLiAgV2Ugb25seSBoYW5kbGUgdGhlIHRha2VuL25vdC10YWtlbiBoaW50IGhlcmUuICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfYmRtICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGxvbmcgdmFsdWUsCkBAIC02NzcsNyArNzMyLDYgQEAKICAgIFRoaXMgaXMgbGlrZSBCRE0sIGFib3ZlLCBleGNlcHQgdGhhdCB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlCiAgICB0YWtlbi4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9iZHAgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgbG9uZyB2YWx1ZSwKQEAgLTgzMSw3ICs4ODUsNiBAQAogLyogVGhlIERRIGZpZWxkIGluIGEgRFEgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSBELCBidXQgdGhlCiAgICBsb3dlciBmb3VyIGJpdHMgYXJlIGZvcmNlZCB0byB6ZXJvLiAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfZHEgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICBsb25nIHZhbHVlLApAQCAtODQzLDcgKzg5Niw2IEBACiAgIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmYwKTsKIH0KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgbG9uZwogZXh0cmFjdF9kcSAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELApAQCAtOTE4LDcgKzk3MCw2IEBACiAvKiBUaGUgRFMgZmllbGQgaW4gYSBEUyBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIEQsIGJ1dCB0aGUKICAgIGxvd2VyIHR3byBiaXRzIGFyZSBmb3JjZWQgdG8gemVyby4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9kcyAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgIGxvbmcgdmFsdWUsCkBAIC05MzAsNyArOTgxLDYgQEAKICAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwogfQogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyBsb25nCiBleHRyYWN0X2RzICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCkBAIC05NDEsNyArOTkxLDYgQEAKIAogLyogVGhlIERFIGZpZWxkIGluIGEgREUgZm9ybSBpbnN0cnVjdGlvbi4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9kZSAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgIGxvbmcgdmFsdWUsCkBAIC05NTMsNyArMTAwMiw2IEBACiAgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSA8PCA0KSAmIDB4ZmZmMCk7CiB9CiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIGxvbmcKIGV4dHJhY3RfZGUgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTk2NCw3ICsxMDEyLDYgQEAKIAogLyogVGhlIERFUyBmaWVsZCBpbiBhIERFUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X2RlcyAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBsb25nIHZhbHVlLApAQCAtOTc4LDcgKzEwMjUsNiBAQAogICByZXR1cm4gaW5zbiB8ICgodmFsdWUgPDwgMikgJiAweGZmZjApOwogfQogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyBsb25nCiBleHRyYWN0X2RlcyAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTk5NSwxNyArMTA0MSwzMyBAQAogCSAgICBpbnQgZGlhbGVjdCwKIAkgICAgY29uc3QgY2hhciAqKmVycm1zZykKIHsKKyAgLyogSWYgd2UncmUgaGFuZGxpbmcgdGhlIG1mb2NyZiBhbmQgbXRvY3JmIGluc25zIGVuc3VyZSB0aGF0IGV4YWN0bHkKKyAgICAgb25lIGJpdCBvZiB0aGUgbWFzayBmaWVsZCBpcyBzZXQuICAqLworICBpZiAoKGluc24gJiAoMSA8PCAyMCkpICE9IDApCisgICAgeworICAgICAgaWYgKHZhbHVlID09IDAgfHwgKHZhbHVlICYgLXZhbHVlKSAhPSB2YWx1ZSkKKwl7CisJICAqZXJybXNnID0gXygiaW52YWxpZCBtYXNrIGZpZWxkIik7CisJICB2YWx1ZSA9IDA7CisJfQorICAgIH0KKwogICAvKiBJZiB0aGUgb3B0aW9uYWwgZmllbGQgb24gbWZjciBpcyBtaXNzaW5nIHRoYXQgbWVhbnMgd2Ugd2FudCB0byB1c2UKICAgICAgdGhlIG9sZCBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbiB0aGF0IG1vdmVzIHRoZSB3aG9sZSBjci4gIEluIHRoYXQKICAgICAgY2FzZSB3ZSdsbCBoYXZlIFZBTFVFIHplcm8uICBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSB3YXkgdG8KICAgICAgZGlzdGluZ3Vpc2ggdGhpcyBmcm9tIHRoZSBjYXNlIHdoZXJlIHNvbWVvbmUgd3JpdGVzIG1mY3IgJXIzLDAuICAqLwotICBpZiAodmFsdWUgPT0gMCkKKyAgZWxzZSBpZiAodmFsdWUgPT0gMCkKICAgICA7CiAKICAgLyogSWYgb25seSBvbmUgYml0IG9mIHRoZSBGWE0gZmllbGQgaXMgc2V0LCB3ZSBjYW4gdXNlIHRoZSBuZXcgZm9ybQogICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIGZhc3Rlci4gIFVubGlrZSB0aGUgUG93ZXI0IGJyYW5jaCBoaW50Ci0gICAgIGVuY29kaW5nLCB0aGlzIGlzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlLiAgKi8KLSAgZWxzZSBpZiAoKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BPV0VSNCkgIT0gMCAmJiAodmFsdWUgJiAtdmFsdWUpID09IHZhbHVlKQorICAgICBlbmNvZGluZywgdGhpcyBpcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZS4gIERvIG5vdCBnZW5lcmF0ZSB0aGUKKyAgICAgbmV3IGZvcm0gdW5sZXNzIC1tcG93ZXI0IGhhcyBiZWVuIGdpdmVuLCBvciAtbWFueSBhbmQgdGhlIHR3bworICAgICBvcGVyYW5kIGZvcm0gb2YgbWZjciB3YXMgdXNlZC4gICovCisgIGVsc2UgaWYgKCh2YWx1ZSAmIC12YWx1ZSkgPT0gdmFsdWUKKwkgICAmJiAoKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BPV0VSNCkgIT0gMAorCSAgICAgICB8fCAoKGRpYWxlY3QgJiBQUENfT1BDT0RFX0FOWSkgIT0gMAorCQkgICAmJiAoaW5zbiAmICgweDNmZiA8PCAxKSkgPT0gMTkgPDwgMSkpKQogICAgIGluc24gfD0gMSA8PCAyMDsKIAogICAvKiBBbnkgb3RoZXIgdmFsdWUgb24gbWZjciBpcyBhbiBlcnJvci4gICovCkBAIC0xMDIwLDcgKzEwODIsNyBAQAogCiBzdGF0aWMgbG9uZwogZXh0cmFjdF9meG0gKHVuc2lnbmVkIGxvbmcgaW5zbiwKLQkgICAgIGludCBkaWFsZWN0LAorCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKIAkgICAgIGludCAqaW52YWxpZCkKIHsKICAgbG9uZyBtYXNrID0gKGluc24gPj4gMTIpICYgMHhmZjsKQEAgLTEwMjgsMTQgKzEwOTAsOSBAQAogICAvKiBJcyB0aGlzIGEgUG93ZXI0IGluc24/ICAqLwogICBpZiAoKGluc24gJiAoMSA8PCAyMCkpICE9IDApCiAgICAgewotICAgICAgaWYgKChkaWFsZWN0ICYgUFBDX09QQ09ERV9QT1dFUjQpID09IDApCisgICAgICAvKiBFeGFjdGx5IG9uZSBiaXQgb2YgTUFTSyBzaG91bGQgYmUgc2V0LiAgKi8KKyAgICAgIGlmIChtYXNrID09IDAgfHwgKG1hc2sgJiAtbWFzaykgIT0gbWFzaykKIAkqaW52YWxpZCA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgLyogRXhhY3RseSBvbmUgYml0IG9mIE1BU0sgc2hvdWxkIGJlIHNldC4gICovCi0JICBpZiAobWFzayA9PSAwIHx8IChtYXNrICYgLW1hc2spICE9IG1hc2spCi0JICAgICppbnZhbGlkID0gMTsKLQl9CiAgICAgfQogCiAgIC8qIENoZWNrIHRoYXQgbm9uLXBvd2VyNCBmb3JtIG9mIG1mY3IgaGFzIGEgemVybyBNQVNLLiAgKi8KQEAgLTEwNTEsNyArMTEwOCw2IEBACiAvKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQogICAgZm9yY2VkIHRvIHplcm8uICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfbGkgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICBsb25nIHZhbHVlLApAQCAtMTA2Myw3ICsxMTE5LDYgQEAKICAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweDNmZmZmZmMpOwogfQogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyBsb25nCiBleHRyYWN0X2xpICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCkBAIC0xMTYzLDcgKzEyMTgsNiBAQAogLyogVGhlIE1CIG9yIE1FIGZpZWxkIGluIGFuIE1EIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggYml0CiAgICBpcyB3cmFwcGVkIHRvIHRoZSBsb3cgZW5kLiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X21iNiAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBsb25nIHZhbHVlLApAQCAtMTE3Myw3ICsxMjI3LDYgQEAKICAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgNikgfCAodmFsdWUgJiAweDIwKTsKIH0KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgbG9uZwogZXh0cmFjdF9tYjYgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCkBAIC0xMTk4LDcgKzEyNTEsNiBAQAogICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxMSk7CiB9CiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIGxvbmcKIGV4dHJhY3RfbmIgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTEyMTcsNyArMTI2OSw2IEBACiAgICBpbnZhbGlkLCBzaW5jZSB3ZSBuZXZlciB3YW50IHRvIHJlY29nbml6ZSBhbiBpbnN0cnVjdGlvbiB3aGljaCB1c2VzCiAgICBhIGZpZWxkIG9mIHRoaXMgdHlwZS4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9uc2kgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgbG9uZyB2YWx1ZSwKQEAgLTEyNjksNyArMTMyMCw2IEBACiAvKiBUaGUgUkEgZmllbGQgaW4gdGhlIERRIGZvcm0gbHEgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsCiAgICB2YWx1ZSByZXN0cmljdGlvbnMuICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfcmFxICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGxvbmcgdmFsdWUsCkBAIC0xMzA0LDcgKzEzNTQsNiBAQAogICAgZnVuY3Rpb24ganVzdCBjb3BpZXMgdGhlIEJUIGZpZWxkIGludG8gdGhlIEJBIGZpZWxkLCBhbmQgdGhlCiAgICBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlIHNhbWUuICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfcmJzICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGxvbmcgdmFsdWUgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTEzMjcsNyArMTM3Niw2IEBACiAvKiBUaGUgUlQgZmllbGQgb2YgdGhlIERRIGZvcm0gbHEgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsCiAgICB2YWx1ZSByZXN0cmljdGlvbnMuICAqLwogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBpbnNlcnRfcnRxICh1bnNpZ25lZCBsb25nIGluc24sCiAJICAgIGxvbmcgdmFsdWUsCkBAIC0xMzQyLDcgKzEzOTAsNiBAQAogLyogVGhlIFJTIGZpZWxkIG9mIHRoZSBEUyBmb3JtIHN0cSBpbnN0cnVjdGlvbiwgd2hpY2ggaGFzIHNwZWNpYWwKICAgIHZhbHVlIHJlc3RyaWN0aW9ucy4gICovCiAKLS8qQVJHU1VTRUQqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGluc2VydF9yc3EgKHVuc2lnbmVkIGxvbmcgaW5zbiwKIAkgICAgbG9uZyB2YWx1ZSBBVFRSSUJVVEVfVU5VU0VELApAQCAtMTM1Niw3ICsxNDAzLDYgQEAKIAogLyogVGhlIFNIIGZpZWxkIGluIGFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHNwbGl0LiAgKi8KIAotLypBUkdTVVNFRCovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogaW5zZXJ0X3NoNiAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICBsb25nIHZhbHVlLApAQCAtMTM2Niw3ICsxNDEyLDYgQEAKICAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTEpIHwgKCh2YWx1ZSAmIDB4MjApID4+IDQpOwogfQogCi0vKkFSR1NVU0VEKi8KIHN0YXRpYyBsb25nCiBleHRyYWN0X3NoNiAodW5zaWduZWQgbG9uZyBpbnNuLAogCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKQEAgLTEzOTUsNiArMTQ0MCw0NyBAQAogICByZXR1cm4gKChpbnNuID4+IDE2KSAmIDB4MWYpIHwgKChpbnNuID4+IDYpICYgMHgzZTApOwogfQogCisvKiBTb21lIGRpYWxlY3RzIGhhdmUgOCBTUFJHIHJlZ2lzdGVycyBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCA0LiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9zcHJnICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgICBsb25nIHZhbHVlLAorCSAgICAgaW50IGRpYWxlY3QsCisJICAgICBjb25zdCBjaGFyICoqZXJybXNnKQoreworICAvKiBUaGlzIGNoZWNrIHVzZXMgUFBDX09QQ09ERV80MDMgYmVjYXVzZSBQUEM0MDUgaXMgbGF0ZXIgZGVmaW5lZAorICAgICBhcyBhIHN5bm9ueW0uICBJZiBldmVyIGEgNDA1IHNwZWNpZmljIGRpYWxlY3QgaXMgYWRkZWQgdGhpcworICAgICBjaGVjayBzaG91bGQgdXNlIHRoYXQgaW5zdGVhZC4gICovCisgIGlmICh2YWx1ZSA+IDcKKyAgICAgIHx8ICh2YWx1ZSA+IDMKKwkgICYmIChkaWFsZWN0ICYgKFBQQ19PUENPREVfQk9PS0UgfCBQUENfT1BDT0RFXzQwMykpID09IDApKQorICAgICplcnJtc2cgPSBfKCJpbnZhbGlkIHNwcmcgbnVtYmVyIik7CisKKyAgLyogSWYgdGhpcyBpcyBtZnNwcmc0Li43IHRoZW4gdXNlIHNwciAyNjAuLjI2MyB3aGljaCBjYW4gYmUgcmVhZCBpbgorICAgICB1c2VyIG1vZGUuICBBbnl0aGluZyBlbHNlIG11c3QgdXNlIHNwciAyNzIuLjI3OS4gICovCisgIGlmICh2YWx1ZSA8PSAzIHx8IChpbnNuICYgMHgxMDApICE9IDApCisgICAgdmFsdWUgfD0gMHgxMDsKKworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDE3KSA8PCAxNik7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X3NwcmcgKHVuc2lnbmVkIGxvbmcgaW5zbiwKKwkgICAgICBpbnQgZGlhbGVjdCwKKwkgICAgICBpbnQgKmludmFsaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgdmFsID0gKGluc24gPj4gMTYpICYgMHgxZjsKKworICAvKiBtZnNwcmcgY2FuIHVzZSAyNjAuLjI2MyBhbmQgMjcyLi4yNzkuICBtdHNwcmcgb25seSB1c2VzIHNwciAyNzIuLjI3OQorICAgICBJZiBub3QgQk9PS0Ugb3IgNDA1LCB0aGVuIGJvdGggdXNlIG9ubHkgMjcyLi4yNzUuICAqLworICBpZiAodmFsIDw9IDMKKyAgICAgIHx8ICh2YWwgPCAweDEwICYmIChpbnNuICYgMHgxMDApICE9IDApCisgICAgICB8fCAodmFsIC0gMHgxMCA+IDMKKwkgICYmIChkaWFsZWN0ICYgKFBQQ19PUENPREVfQk9PS0UgfCBQUENfT1BDT0RFXzQwMykpID09IDApKQorICAgICppbnZhbGlkID0gMTsKKyAgcmV0dXJuIHZhbCAmIDc7Cit9CisKIC8qIFRoZSBUQlIgZmllbGQgaW4gYW4gWEZYIGluc3RydWN0aW9uLiAgVGhpcyBpcyBqdXN0IGxpa2UgU1BSLCBidXQgaXQKICAgIGlzIG9wdGlvbmFsLiAgV2hlbiBUQlIgaXMgb21pdHRlZCwgaXQgbXVzdCBiZSBpbnNlcnRlZCBhcyAyNjggKHRoZQogICAgbWFnaWMgbnVtYmVyIG9mIHRoZSBUQiByZWdpc3RlcikuICBUaGVzZSBmdW5jdGlvbnMgdHJlYXQgMApAQCAtMTQ2MCw2ICsxNTQ2LDkgQEAKIC8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkEgYW5kIEZSQyBmaWVsZHMgZml4ZWQuICAqLwogI2RlZmluZSBBRlJBRlJDX01BU0sgKEFfTUFTSyB8IEZSQV9NQVNLIHwgRlJDX01BU0spCiAKKy8qIEFuIEFGUkFGUkNfTUFTSywgYnV0IHdpdGggTCBiaXQgY2xlYXIuICAqLworI2RlZmluZSBBRlJBTEZSQ19NQVNLIChBRlJBRlJDX01BU0sgJiB+KCh1bnNpZ25lZCBsb25nKSAxIDw8IDE2KSkKKwogLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBCKG9wLCBhYSwgbGspIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGFhKSkgJiAxKSA8PCAxKSB8ICgobGspICYgMSkpCiAjZGVmaW5lIEJfTUFTSyBCICgweDNmLCAxLCAxKQpAQCAtMTQ5NCwxMSArMTU4MywxMSBAQAogCiAvKiBBbiBDb250ZXh0IGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBDVFgob3AsIHhvcCkgICAoT1AgKG9wKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHg3KSkKLSNkZWZpbmUgQ1RYX01BU0sgICAgICAgQ1RYKDB4M2YsIDB4NykKKyNkZWZpbmUgQ1RYX01BU0sgQ1RYKDB4M2YsIDB4NykKIAogLyogQW4gVXNlciBDb250ZXh0IGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBVQ1RYKG9wLCB4b3ApICAoT1AgKG9wKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZikpCi0jZGVmaW5lIFVDVFhfTUFTSyAgICAgIFVDVFgoMHgzZiwgMHgxZikKKyNkZWZpbmUgVUNUWF9NQVNLIFVDVFgoMHgzZiwgMHgxZikKIAogLyogVGhlIG1haW4gb3Bjb2RlIG1hc2sgd2l0aCB0aGUgUkEgZmllbGQgY2xlYXIuICAqLwogI2RlZmluZSBEUkFfTUFTSyAoT1BfTUFTSyB8IFJBX01BU0spCkBAIC0xNTcwLDEyICsxNjU5LDIxIEBACiAvKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBYKG9wLCB4b3ApIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpKQogCisvKiBBIFogZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFoob3AsIHhvcCkgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmZikgPDwgMSkpCisKIC8qIEFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBSQyBiaXQgc3BlY2lmaWVkLiAgKi8KICNkZWZpbmUgWFJDKG9wLCB4b3AsIHJjKSAoWCAoKG9wKSwgKHhvcCkpIHwgKChyYykgJiAxKSkKIAorLyogQSBaIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgUkMgYml0IHNwZWNpZmllZC4gICovCisjZGVmaW5lIFpSQyhvcCwgeG9wLCByYykgKFogKChvcCksICh4b3ApKSB8ICgocmMpICYgMSkpCisKIC8qIFRoZSBtYXNrIGZvciBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwogI2RlZmluZSBYX01BU0sgWFJDICgweDNmLCAweDNmZiwgMSkKIAorLyogVGhlIG1hc2sgZm9yIGEgWiBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgWl9NQVNLIFpSQyAoMHgzZiwgMHgxZmYsIDEpCisKIC8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSQSBmaWVsZCBmaXhlZC4gICovCiAjZGVmaW5lIFhSQV9NQVNLIChYX01BU0sgfCBSQV9NQVNLKQogCkBAIC0xNTg1LDYgKzE2ODMsOSBAQAogLyogQW4gWF9NQVNLIHdpdGggdGhlIFJUIGZpZWxkIGZpeGVkLiAgKi8KICNkZWZpbmUgWFJUX01BU0sgKFhfTUFTSyB8IFJUX01BU0spCiAKKy8qIEFuIFhSVF9NQVNLIG1hc2sgd2l0aCB0aGUgTCBiaXRzIGNsZWFyLiAgKi8KKyNkZWZpbmUgWExSVF9NQVNLIChYUlRfTUFTSyAmIH4oKHVuc2lnbmVkIGxvbmcpIDB4MyA8PCAyMSkpCisKIC8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSQSBhbmQgUkIgZmllbGRzIGZpeGVkLiAgKi8KICNkZWZpbmUgWFJBUkJfTUFTSyAoWF9NQVNLIHwgUkFfTUFTSyB8IFJCX01BU0spCiAKQEAgLTE1OTcsOCArMTY5OCw4IEBACiAvKiBBbiBYUlRSQV9NQVNLLCBidXQgd2l0aCBMIGJpdCBjbGVhci4gICovCiAjZGVmaW5lIFhSVExSQV9NQVNLIChYUlRSQV9NQVNLICYgfigodW5zaWduZWQgbG9uZykgMSA8PCAyMSkpCiAKLS8qIEFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWENNUEwob3AsIHhvcCwgbCkgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShsKSkgJiAxKSA8PCAyMSkpCisvKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTCBiaXQgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgWE9QTChvcCwgeG9wLCBsKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKIAogLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAgKi8KICNkZWZpbmUgWENNUF9NQVNLIChYX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIyKSkKQEAgLTE2MjEsNiArMTcyMiw5IEBACiAvKiBBbiBYIGZvcm0gc3luYyBpbnN0cnVjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcgZmlsbGVkIGluIGV4Y2VwdCB0aGUgTFMgZmllbGQuICAqLwogI2RlZmluZSBYU1lOQ19NQVNLICgweGZmOWZmZmZmKQogCisvKiBBbiBYX01BU0ssIGJ1dCB3aXRoIHRoZSBFSCBiaXQgY2xlYXIuICAqLworI2RlZmluZSBYRUhfTUFTSyAoWF9NQVNLICYgfigodW5zaWduZWQgbG9uZyApMSkpCisKIC8qIEFuIFggZm9ybSBBbHRpVmVjIGRzcyBpbnN0cnVjdGlvbi4gICovCiAjZGVmaW5lIFhEU1Mob3AsIHhvcCwgYSkgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShhKSkgJiAxKSA8PCAyNSkpCiAjZGVmaW5lIFhEU1NfTUFTSyBYRFNTKDB4M2YsIDB4M2ZmLCAxKQpAQCAtMTY2Myw2ICsxNzY3LDkgQEAKICNkZWZpbmUgWExZQkJfTUFTSyAoWExZTEtfTUFTSyB8IEJCX01BU0spCiAjZGVmaW5lIFhMQk9DQkJCX01BU0sgKFhMT0NCX01BU0sgfCBCQl9NQVNLKQogCisvKiBBIG1hc2sgZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMgdXNpbmcgdGhlIEJIIGZpZWxkLiAgKi8KKyNkZWZpbmUgWExCSF9NQVNLIChYTF9NQVNLIHwgKDB4MWMgPDwgMTEpKQorCiAvKiBBbiBYTF9NQVNLIHdpdGggdGhlIEJPIGFuZCBCQiBmaWVsZHMgZml4ZWQuICAqLwogI2RlZmluZSBYTEJPQkJfTUFTSyAoWExfTUFTSyB8IEJPX01BU0sgfCBCQl9NQVNLKQogCkBAIC0xNjgyLDExICsxNzg5LDEyIEBACiAjZGVmaW5lIFhTX01BU0sgWFMgKDB4M2YsIDB4MWZmLCAxKQogCiAvKiBBIG1hc2sgZm9yIHRoZSBGWE0gdmVyc2lvbiBvZiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhGWEZYTV9NQVNLIChYX01BU0sgfCAoMSA8PCAxMSkpCisjZGVmaW5lIFhGWEZYTV9NQVNLIChYX01BU0sgfCAoMSA8PCAxMSkgfCAoMSA8PCAyMCkpCiAKIC8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIEZYTSBmaWVsZCBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYRlhNKG9wLCB4b3AsIGZ4bSkgXAotICAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGZ4bSkpICYgMHhmZikgPDwgMTIpKQorI2RlZmluZSBYRlhNKG9wLCB4b3AsIGZ4bSwgcDQpIFwKKyAgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShmeG0pKSAmIDB4ZmYpIDw8IDEyKSBcCisgICB8ICgodW5zaWduZWQgbG9uZykocDQpIDw8IDIwKSkKIAogLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbi4gICovCiAjZGVmaW5lIFhTUFIob3AsIHhvcCwgc3ByKSBcCkBAIC0xNjk5LDcgKzE4MDcsNyBAQAogCiAvKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluIGV4Y2VwdCBmb3IgdGhlCiAgICBTUFJHIGZpZWxkLiAgKi8KLSNkZWZpbmUgWFNQUkdfTUFTSyAoWFNQUl9NQVNLICZ+IFNQUkdfTUFTSykKKyNkZWZpbmUgWFNQUkdfTUFTSyAoWFNQUl9NQVNLICYgfigweDE3IDw8IDE2KSkKIAogLyogQW4gWCBmb3JtIGluc3RydWN0aW9uIHdpdGggZXZlcnl0aGluZyBmaWxsZWQgaW4gZXhjZXB0IHRoZSBFIGZpZWxkLiAgKi8KICNkZWZpbmUgWEVfTUFTSyAoMHhmZmZmN2ZmZikKQEAgLTE3NjksNiArMTg3Nyw5IEBACiAjZGVmaW5lIFBQQ0NPTQlQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ09NTU9OCiAjZGVmaW5lIE5PUE9XRVI0IFBQQ19PUENPREVfTk9QT1dFUjQgfCBQUENDT00KICNkZWZpbmUgUE9XRVI0CVBQQ19PUENPREVfUE9XRVI0CisjZGVmaW5lIFBPV0VSNQlQUENfT1BDT0RFX1BPV0VSNQorI2RlZmluZSBQT1dFUjYJUFBDX09QQ09ERV9QT1dFUjYKKyNkZWZpbmUgQ0VMTAlQUENfT1BDT0RFX0NFTEwKICNkZWZpbmUgUFBDMzIgICBQUENfT1BDT0RFXzMyIHwgUFBDX09QQ09ERV9QUEMKICNkZWZpbmUgUFBDNjQgICBQUENfT1BDT0RFXzY0IHwgUFBDX09QQ09ERV9QUEMKICNkZWZpbmUgUFBDNDAzCVBQQ19PUENPREVfNDAzCkBAIC0xNzc2LDcgKzE4ODcsNyBAQAogI2RlZmluZSBQUEM0NDAJUFBDX09QQ09ERV80NDAKICNkZWZpbmUgUFBDNzUwCVBQQwogI2RlZmluZSBQUEM4NjAJUFBDCi0jZGVmaW5lIFBQQ1ZFQwlQUENfT1BDT0RFX0FMVElWRUMgfCBQUENfT1BDT0RFX1BQQworI2RlZmluZSBQUENWRUMJUFBDX09QQ09ERV9BTFRJVkVDCiAjZGVmaW5lCVBPV0VSICAgUFBDX09QQ09ERV9QT1dFUgogI2RlZmluZQlQT1dFUjIJUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUE9XRVIyCiAjZGVmaW5lIFBQQ1BXUjIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjIKQEAgLTE3OTAsNiArMTkwMSw3IEBACiAjZGVmaW5lIEJPT0tFCVBQQ19PUENPREVfQk9PS0UKICNkZWZpbmUgQk9PS0U2NAlQUENfT1BDT0RFX0JPT0tFNjQKICNkZWZpbmUgQ0xBU1NJQwlQUENfT1BDT0RFX0NMQVNTSUMKKyNkZWZpbmUgUFBDRTMwMCBQUENfT1BDT0RFX0UzMDAKICNkZWZpbmUgUFBDU1BFCVBQQ19PUENPREVfU1BFCiAjZGVmaW5lIFBQQ0lTRUwJUFBDX09QQ09ERV9JU0VMCiAjZGVmaW5lIFBQQ0VGUwlQUENfT1BDT0RFX0VGUwpAQCAtMTk1Miw2ICsyMDY0LDQxIEBACiB7ICJubWFjbGh3c28uIiwJWE8oNCw0OTQsMSwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKIHsgIm1mdnNjciIsICBWWCg0LCAxNTQwKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCB9IH0sCiB7ICJtdHZzY3IiLCAgVlgoNCwgMTYwNCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkIgfSB9LAorCisgIC8qIERvdWJsZS1wcmVjaXNpb24gb3Bjb2Rlcy4gICovCisgIC8qIFNvbWUgb2YgdGhlc2UgY29uZmxpY3Qgd2l0aCBBbHRpVmVjLCBzbyBtb3ZlIHRoZW0gYmVmb3JlLCBzaW5jZQorICAgICBQUENWRUMgaW5jbHVkZXMgdGhlIFBQQ19PUENPREVfUFBDIHNldC4gICovCit7ICJlZnNjZmQiLCAgIFZYKDQsIDcxOSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGFicyIsICAgVlgoNCwgNzQwKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEgfSB9LAoreyAiZWZkbmFicyIsICBWWCg0LCA3NDEpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQSB9IH0sCit7ICJlZmRuZWciLCAgIFZYKDQsIDc0MiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJBIH0gfSwKK3sgImVmZGFkZCIsICAgVlgoNCwgNzM2KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImVmZHN1YiIsICAgVlgoNCwgNzM3KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImVmZG11bCIsICAgVlgoNCwgNzQ0KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImVmZGRpdiIsICAgVlgoNCwgNzQ1KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImVmZGNtcGd0IiwgVlgoNCwgNzQ4KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZWZkY21wbHQiLCBWWCg0LCA3NDkpLCBWWF9NQVNLLAlQUENFRlMsCQl7IENSRkQsIFJBLCBSQiB9IH0sCit7ICJlZmRjbXBlcSIsIFZYKDQsIDc1MCksIFZYX01BU0ssCVBQQ0VGUywJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImVmZHRzdGd0IiwgVlgoNCwgNzY0KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZWZkdHN0bHQiLCBWWCg0LCA3NjUpLCBWWF9NQVNLLAlQUENFRlMsCQl7IENSRkQsIFJBLCBSQiB9IH0sCit7ICJlZmR0c3RlcSIsIFZYKDQsIDc2NiksIFZYX01BU0ssCVBQQ0VGUywJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImVmZGNmc2kiLCAgVlgoNCwgNzUzKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY2ZzaWQiLCBWWCg0LCA3MzkpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjZnVpIiwgIFZYKDQsIDc1MiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGNmdWlkIiwgVlgoNCwgNzM4KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY2ZzZiIsICBWWCg0LCA3NTUpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjZnVmIiwgIFZYKDQsIDc1NCksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGN0c2kiLCAgVlgoNCwgNzU3KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3RzaWR6IixWWCg0LCA3NDcpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjdHNpeiIsIFZYKDQsIDc2MiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGN0dWkiLCAgVlgoNCwgNzU2KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3R1aWR6IixWWCg0LCA3NDYpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjdHVpeiIsIFZYKDQsIDc2MCksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGN0c2YiLCAgVlgoNCwgNzU5KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3R1ZiIsICBWWCg0LCA3NTgpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjZnMiLCAgIFZYKDQsIDc1MSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKKyAgLyogRW5kIG9mIGRvdWJsZS1wcmVjaXNpb24gb3Bjb2Rlcy4gICovCisKIHsgInZhZGRjdXciLCBWWCg0LCAgMzg0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKIHsgInZhZGRmcCIsICBWWCg0LCAgIDEwKSwgVlhfTUFTSywgCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCiB7ICJ2YWRkc2JzIiwgVlgoNCwgIDc2OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCkBAIC0yMzg5LDE2ICsyNTM2LDE2IEBACiAKIHsgImxpIiwJICAgICBPUCgxNCksCURSQV9NQVNLLAlQUENDT00sCQl7IFJULCBTSSB9IH0sCiB7ICJsaWwiLCAgICAgT1AoMTQpLAlEUkFfTUFTSywJUFdSQ09NLAkJeyBSVCwgU0kgfSB9LAoteyAiYWRkaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgImNhbCIsICAgICBPUCgxNCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLXsgInN1YmkiLCAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAoteyAibGEiLAkgICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoreyAiYWRkaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEwLCBTSSB9IH0sCit7ICJjYWwiLCAgICAgT1AoMTQpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQTAgfSB9LAoreyAic3ViaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEwLCBOU0kgfSB9LAoreyAibGEiLAkgICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKIAogeyAibGlzIiwgICAgIE9QKDE1KSwJRFJBX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFNJU0lHTk9QVCB9IH0sCiB7ICJsaXUiLCAgICAgT1AoMTUpLAlEUkFfTUFTSywJUFdSQ09NLAkJeyBSVCwgU0lTSUdOT1BUIH0gfSwKLXsgImFkZGlzIiwgICBPUCgxNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsUkEsU0lTSUdOT1BUIH0gfSwKLXsgImNhdSIsICAgICBPUCgxNSksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsUkEsU0lTSUdOT1BUIH0gfSwKLXsgInN1YmlzIiwgICBPUCgxNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAoreyAiYWRkaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCxSQTAsU0lTSUdOT1BUIH0gfSwKK3sgImNhdSIsICAgICBPUCgxNSksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsUkEwLFNJU0lHTk9QVCB9IH0sCit7ICJzdWJpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQTAsIE5TSSB9IH0sCiAKIHsgImJkbnotIiwgICBCQk8oMTYsQk9ETlosMCwwKSwgICAgICBCQk9BVEJJX01BU0ssIFBQQ0NPTSwJeyBCRE0gfSB9LAogeyAiYmRueisiLCAgIEJCTygxNixCT0ROWiwwLDApLCAgICAgIEJCT0FUQklfTUFTSywgUFBDQ09NLAl7IEJEUCB9IH0sCkBAIC0yNjY1LDkgKzI4MTIsOSBAQAogeyAiYmNsYSsiLCAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJUFBDQ09NLAkJeyBCT0UsIEJJLCBCRFBBIH0gfSwKIHsgImJjbGEiLCAgICBCKDE2LDEsMSksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCREEgfSB9LAogCi17ICJzYyIsICAgICAgU0MoMTcsMSwwKSwgMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKLXsgInN2YyIsICAgICBTQygxNywwLDApLCBTQ19NQVNLLAlQT1dFUiwJCXsgTEVWLCBGTDEsIEZMMiB9IH0sCi17ICJzdmNsIiwgICAgU0MoMTcsMCwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IExFViwgRkwxLCBGTDIgfSB9LAoreyAic2MiLCAgICAgIFNDKDE3LDEsMCksIFNDX01BU0ssCVBQQywJCXsgTEVWIH0gfSwKK3sgInN2YyIsICAgICBTQygxNywwLDApLCBTQ19NQVNLLAlQT1dFUiwJCXsgU1ZDX0xFViwgRkwxLCBGTDIgfSB9LAoreyAic3ZjbCIsICAgIFNDKDE3LDAsMSksIFNDX01BU0ssCVBPV0VSLAkJeyBTVkNfTEVWLCBGTDEsIEZMMiB9IH0sCiB7ICJzdmNhIiwgICAgU0MoMTcsMSwwKSwgU0NfTUFTSywJUFdSQ09NLAkJeyBTViB9IH0sCiB7ICJzdmNsYSIsICAgU0MoMTcsMSwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IFNWIH0gfSwKIApAQCAtMjg5MCwxMiArMzAzNywxMiBAQAogeyAiYmR6ZmxybCIsIFhMTygxOSxCT0RaRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCiB7ICJiZHpmbHJsLSIsWExPKDE5LEJPRFpGLDE2LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsCXsgQkkgfSB9LAogeyAiYmR6ZmxybCsiLFhMTygxOSxCT0RaRlAsMTYsMSksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwgeyBCSSB9IH0sCi17ICJiY2xyIiwgICAgWExMSygxOSwxNiwwKSwgWExZQkJfTUFTSywJUFBDQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNscmwiLCAgIFhMTEsoMTksMTYsMSksIFhMWUJCX01BU0ssCVBQQ0NPTSwJCXsgQk8sIEJJIH0gfSwKIHsgImJjbHIrIiwgICBYTFlMSygxOSwxNiwxLDApLCBYTFlCQl9NQVNLLCBQUENDT00sCXsgQk9FLCBCSSB9IH0sCiB7ICJiY2xybCsiLCAgWExZTEsoMTksMTYsMSwxKSwgWExZQkJfTUFTSywgUFBDQ09NLAl7IEJPRSwgQkkgfSB9LAogeyAiYmNsci0iLCAgIFhMWUxLKDE5LDE2LDAsMCksIFhMWUJCX01BU0ssIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKIHsgImJjbHJsLSIsICBYTFlMSygxOSwxNiwwLDEpLCBYTFlCQl9NQVNLLCBQUENDT00sCXsgQk9FLCBCSSB9IH0sCit7ICJiY2xyIiwgICAgWExMSygxOSwxNiwwKSwgWExCSF9NQVNLLAlQUENDT00sCQl7IEJPLCBCSSwgQkggfSB9LAoreyAiYmNscmwiLCAgIFhMTEsoMTksMTYsMSksIFhMQkhfTUFTSywJUFBDQ09NLAkJeyBCTywgQkksIEJIIH0gfSwKIHsgImJjciIsICAgICBYTExLKDE5LDE2LDApLCBYTEJCX01BU0ssCVBXUkNPTSwJCXsgQk8sIEJJIH0gfSwKIHsgImJjcmwiLCAgICBYTExLKDE5LDE2LDEpLCBYTEJCX01BU0ssCVBXUkNPTSwJCXsgQk8sIEJJIH0gfSwKIHsgImJjbHJlIiwgICBYTExLKDE5LDE3LDApLCBYTEJCX01BU0ssCUJPT0tFNjQsCXsgQk8sIEJJIH0gfSwKQEAgLTI5MjQsMTQgKzMwNzEsMjMgQEAKIAogeyAiY3JhbmQiLCAgIFhMKDE5LDI1NyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCiAKK3sgImhyZmlkIiwgICBYTCgxOSwyNzQpLCAweGZmZmZmZmZmLAlQT1dFUjUgfCBDRUxMLAl7IDAgfSB9LAorCiB7ICJjcnNldCIsICAgWEwoMTksMjg5KSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkFULCBCQkEgfSB9LAogeyAiY3JlcXYiLCAgIFhMKDE5LDI4OSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCiAKK3sgImRvemUiLCAgICBYTCgxOSw0MDIpLCAweGZmZmZmZmZmLAlQT1dFUjYsCQl7IDAgfSB9LAorCiB7ICJjcm9yYyIsICAgWEwoMTksNDE3KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKIAoreyAibmFwIiwgICAgIFhMKDE5LDQzNCksIDB4ZmZmZmZmZmYsCVBPV0VSNiwJCXsgMCB9IH0sCisKIHsgImNybW92ZSIsICBYTCgxOSw0NDkpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQSwgQkJBIH0gfSwKIHsgImNyb3IiLCAgICBYTCgxOSw0NDkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAogCit7ICJzbGVlcCIsICAgWEwoMTksNDY2KSwgMHhmZmZmZmZmZiwJUE9XRVI2LAkJeyAwIH0gfSwKK3sgInJ2d2lua2xlIiwgWEwoMTksNDk4KSwgMHhmZmZmZmZmZiwJUE9XRVI2LAkJeyAwIH0gfSwKKwogeyAiYmN0ciIsICAgIFhMTygxOSxCT1UsNTI4LDApLCBYTEJPQklCQl9NQVNLLCBDT00sCXsgMCB9IH0sCiB7ICJiY3RybCIsICAgWExPKDE5LEJPVSw1MjgsMSksIFhMQk9CSUJCX01BU0ssIENPTSwJeyAwIH0gfSwKIHsgImJsdGN0ciIsICBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LApAQCAtMzA3NCwxMiArMzIzMCwxMiBAQAogeyAiYmZjdHJsLSIsIFhMTygxOSxCT0ZNNCw1MjgsMSksIFhMQk9CQl9NQVNLLCBQT1dFUjQsIHsgQkkgfSB9LAogeyAiYmZjdHJsKyIsIFhMTygxOSxCT0ZQLDUyOCwxKSwgWExCT0JCX01BU0ssIE5PUE9XRVI0LCB7IEJJIH0gfSwKIHsgImJmY3RybCsiLCBYTE8oMTksQk9GUDQsNTI4LDEpLCBYTEJPQkJfTUFTSywgUE9XRVI0LCB7IEJJIH0gfSwKLXsgImJjY3RyIiwgICBYTExLKDE5LDUyOCwwKSwgICAgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk8sIEJJIH0gfSwKIHsgImJjY3RyLSIsICBYTFlMSygxOSw1MjgsMCwwKSwgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk9FLCBCSSB9IH0sCiB7ICJiY2N0cisiLCAgWExZTEsoMTksNTI4LDEsMCksICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjdHJsIiwgIFhMTEsoMTksNTI4LDEpLCAgICAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCTywgQkkgfSB9LAogeyAiYmNjdHJsLSIsIFhMWUxLKDE5LDUyOCwwLDEpLCAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKIHsgImJjY3RybCsiLCBYTFlMSygxOSw1MjgsMSwxKSwgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk9FLCBCSSB9IH0sCit7ICJiY2N0ciIsICAgWExMSygxOSw1MjgsMCksICAgICBYTEJIX01BU0ssICAgUFBDQ09NLAl7IEJPLCBCSSwgQkggfSB9LAoreyAiYmNjdHJsIiwgIFhMTEsoMTksNTI4LDEpLCAgICAgWExCSF9NQVNLLCAgIFBQQ0NPTSwJeyBCTywgQkksIEJIIH0gfSwKIHsgImJjYyIsICAgICBYTExLKDE5LDUyOCwwKSwgICAgIFhMQkJfTUFTSywgICBQV1JDT00sCXsgQk8sIEJJIH0gfSwKIHsgImJjY2wiLCAgICBYTExLKDE5LDUyOCwxKSwgICAgIFhMQkJfTUFTSywgICBQV1JDT00sCXsgQk8sIEJJIH0gfSwKIHsgImJjY3RyZSIsICBYTExLKDE5LDUyOSwwKSwgICAgIFhMWUJCX01BU0ssICBCT09LRTY0LAl7IEJPLCBCSSB9IH0sCkBAIC0zMTU4LDggKzMzMTQsOCBAQAogeyAicmxkY3IiLCAgIE1EUygzMCw5LDApLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1FNiB9IH0sCiB7ICJybGRjci4iLCAgTURTKDMwLDksMSksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUU2IH0gfSwKIAoteyAiY21wdyIsICAgIFhDTVBMKDMxLDAsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wZCIsICAgIFhDTVBMKDMxLDAsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCit7ICJjbXB3IiwgICAgWE9QTCgzMSwwLDApLCBYQ01QTF9NQVNLLCBQUENDT00sCQl7IE9CRiwgUkEsIFJCIH0gfSwKK3sgImNtcGQiLCAgICBYT1BMKDMxLDAsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCiB7ICJjbXAiLCAgICAgWCgzMSwwKSwJWENNUF9NQVNLLAlQUEMsCQl7IEJGLCBMLCBSQSwgUkIgfSB9LAogeyAiY21wIiwgICAgIFgoMzEsMCksCVhDTVBMX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBSQiB9IH0sCiAKQEAgLTMyMjgsMTcgKzMzODQsMTggQEAKIHsgImlzZWxlcSIsICBYKDMxLDc5KSwgICAgICBYX01BU0ssCVBQQ0lTRUwsCXsgUlQsIFJBLCBSQiB9IH0sCiB7ICJpc2VsIiwgICAgWElTRUwoMzEsMTUpLCAgWElTRUxfTUFTSywJUFBDSVNFTCwJeyBSVCwgUkEsIFJCLCBDUkIgfSB9LAogCi17ICJtZmNyIiwgICAgWCgzMSwxOSksCVhSQVJCX01BU0ssCU5PUE9XRVI0LAl7IFJUIH0gfSwKK3sgIm1mb2NyZiIsICBYRlhNKDMxLDE5LDAsMSksIFhGWEZYTV9NQVNLLCBDT00sCQl7IFJULCBGWE0gfSB9LAoreyAibWZjciIsICAgIFgoMzEsMTkpLAlYUkFSQl9NQVNLLAlOT1BPV0VSNCB8IENPTSwJeyBSVCB9IH0sCiB7ICJtZmNyIiwgICAgWCgzMSwxOSksCVhGWEZYTV9NQVNLLAlQT1dFUjQsCQl7IFJULCBGWE00IH0gfSwKIAoteyAibHdhcngiLCAgIFgoMzEsMjApLAlYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibHdhcngiLCAgIFgoMzEsMjApLAlYRUhfTUFTSywJUFBDLAkJeyBSVCwgUkEwLCBSQiwgRUggfSB9LAogCi17ICJsZHgiLCAgICAgWCgzMSwyMSksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxkeCIsICAgICBYKDMxLDIxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQTAsIFJCIH0gfSwKIAoteyAiaWNidCIsICAgIFgoMzEsMjIpLAlYX01BU0ssCQlCT09LRSwJCXsgQ1QsIFJBLCBSQiB9IH0sCit7ICJpY2J0IiwgICAgWCgzMSwyMiksCVhfTUFTSywJCUJPT0tFfFBQQ0UzMDAsCXsgQ1QsIFJBLCBSQiB9IH0sCiB7ICJpY2J0IiwgICAgWCgzMSwyNjIpLAlYUlRfTUFTSywJUFBDNDAzLAkJeyBSQSwgUkIgfSB9LAogCi17ICJsd3p4IiwgICAgWCgzMSwyMyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsd3p4IiwgICAgWCgzMSwyMyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAogeyAibHgiLCAgICAgIFgoMzEsMjMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAogCiB7ICJzbHciLCAgICAgWFJDKDMxLDI0LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCkBAIC0zMjYyLDEwICszNDE5LDEwIEBACiAKIHsgImljYnRlIiwgICBYKDMxLDMwKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBDVCwgUkEsIFJCIH0gfSwKIAoteyAibHd6eGUiLCAgIFgoMzEsMzEpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAibHd6eGUiLCAgIFgoMzEsMzEpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQTAsIFJCIH0gfSwKIAoteyAiY21wbHciLCAgIFhDTVBMKDMxLDMyLDApLCBYQ01QTF9NQVNLLCBQUENDT00sCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wbGQiLCAgIFhDTVBMKDMxLDMyLDEpLCBYQ01QTF9NQVNLLCBQUEM2NCwJCXsgT0JGLCBSQSwgUkIgfSB9LAoreyAiY21wbHciLCAgIFhPUEwoMzEsMzIsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJeyBPQkYsIFJBLCBSQiB9IH0sCit7ICJjbXBsZCIsICAgWE9QTCgzMSwzMiwxKSwgWENNUExfTUFTSywgUFBDNjQsCQl7IE9CRiwgUkEsIFJCIH0gfSwKIHsgImNtcGwiLCAgICBYKDMxLDMyKSwJWENNUF9NQVNLLAkgUFBDLAkJeyBCRiwgTCwgUkEsIFJCIH0gfSwKIHsgImNtcGwiLCAgICBYKDMxLDMyKSwJWENNUExfTUFTSywJIFBXUkNPTSwJeyBCRiwgUkEsIFJCIH0gfSwKIApAQCAtMzMyNCwxNSArMzQ4MSwxNiBAQAogCiB7ICJtZm1zciIsICAgWCgzMSw4MyksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlQgfSB9LAogCi17ICJsZGFyeCIsICAgWCgzMSw4NCksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxkYXJ4IiwgICBYKDMxLDg0KSwJWEVIX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEwLCBSQiwgRUggfSB9LAogCi17ICJkY2JmIiwgICAgWCgzMSw4NiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCit7ICJkY2JmbCIsICAgWE9QTCgzMSw4NiwxKSwgWFJUX01BU0ssCVBPV0VSNSwJCXsgUkEsIFJCIH0gfSwKK3sgImRjYmYiLCAgICBYKDMxLDg2KSwJWExSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiwgWFJUX0wgfSB9LAogCi17ICJsYnp4IiwgICAgWCgzMSw4NyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsYnp4IiwgICAgWCgzMSw4NyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAogCiB7ICJkY2JmZSIsICAgWCgzMSw5NCksCVhSVF9NQVNLLAlCT09LRTY0LAl7IFJBLCBSQiB9IH0sCiAKLXsgImxienhlIiwgICBYKDMxLDk1KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxienhlIiwgICBYKDMxLDk1KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCiAKIHsgIm5lZyIsICAgICBYTygzMSwxMDQsMCwwKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCiB7ICJuZWcuIiwgICAgWE8oMzEsMTA0LDAsMSksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LApAQCAtMzM1MCwxMiArMzUwOCwxNCBAQAogCiB7ICJsYnp1eCIsICAgWCgzMSwxMTkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKIAoreyAicG9wY250YiIsIFgoMzEsMTIyKSwgWFJCX01BU0ssCVBPV0VSNSwJCXsgUkEsIFJTIH0gfSwKKwogeyAibm90IiwgICAgIFhSQygzMSwxMjQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCiB7ICJub3IiLCAgICAgWFJDKDMxLDEyNCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAogeyAibm90LiIsICAgIFhSQygzMSwxMjQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCiB7ICJub3IuIiwgICAgWFJDKDMxLDEyNCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAogCi17ICJsd2FyeGUiLCAgWCgzMSwxMjYpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAibHdhcnhlIiwgIFgoMzEsMTI2KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCiAKIHsgImxienV4ZSIsICBYKDMxLDEyNyksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBTCwgUkIgfSB9LAogCkBAIC0zMzgzLDIxICszNTQzLDIyIEBACiAKIHsgImRjYnRzdGxzZSIsWCgzMSwxNDIpLFhfTUFTSywJCVBQQ0NITEs2NCwJeyBDVCwgUkEsIFJCIH19LAogCi17ICJtdGNyIiwgICAgWEZYTSgzMSwxNDQsMHhmZiksIFhSQVJCX01BU0ssIENPTSwJeyBSUyB9fSwKK3sgIm10b2NyZiIsICBYRlhNKDMxLDE0NCwwLDEpLCBYRlhGWE1fTUFTSywgQ09NLAl7IEZYTSwgUlMgfSB9LAoreyAibXRjciIsICAgIFhGWE0oMzEsMTQ0LDB4ZmYsMCksIFhSQVJCX01BU0ssIENPTSwJeyBSUyB9fSwKIHsgIm10Y3JmIiwgICBYKDMxLDE0NCksCVhGWEZYTV9NQVNLLAlDT00sCQl7IEZYTSwgUlMgfSB9LAogCiB7ICJtdG1zciIsICAgWCgzMSwxNDYpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJTIH0gfSwKIAoteyAic3RkeCIsICAgIFgoMzEsMTQ5KSwgWF9NQVNLLAkJUFBDNjQsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3RkeCIsICAgIFgoMzEsMTQ5KSwgWF9NQVNLLAkJUFBDNjQsCQl7IFJTLCBSQTAsIFJCIH0gfSwKIAoteyAic3R3Y3guIiwgIFhSQygzMSwxNTAsMSksIFhfTUFTSywJUFBDLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0d2N4LiIsICBYUkMoMzEsMTUwLDEpLCBYX01BU0ssCVBQQywJCXsgUlMsIFJBMCwgUkIgfSB9LAogCi17ICJzdHd4IiwgICAgWCgzMSwxNTEpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3R3eCIsICAgIFgoMzEsMTUxKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCiB7ICJzdHgiLCAgICAgWCgzMSwxNTEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAogCi17ICJzdHdjeGUuIiwgWFJDKDMxLDE1OCwxKSwgWF9NQVNLLAlCT09LRTY0LAl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3R3Y3hlLiIsIFhSQygzMSwxNTgsMSksIFhfTUFTSywJQk9PS0U2NCwJeyBSUywgUkEwLCBSQiB9IH0sCiAKLXsgInN0d3hlIiwgICBYKDMxLDE1OSksIFhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdHd4ZSIsICAgWCgzMSwxNTkpLCBYX01BU0ssCQlCT09LRTY0LAl7IFJTLCBSQTAsIFJCIH0gfSwKIAogeyAic2xxIiwgICAgIFhSQygzMSwxNTIsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJzbHEuIiwgICAgWFJDKDMxLDE1MiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKQEAgLTM0MDUsNiArMzU2Niw4IEBACiB7ICJzbGUiLCAgICAgWFJDKDMxLDE1MywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgInNsZS4iLCAgICBYUkMoMzEsMTUzLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogCit7ICJwcnR5dyIsICAgWCgzMSwxNTQpLAlYUkJfTUFTSywJUE9XRVI2LAkJeyBSQSwgUlMgfSB9LAorCiB7ICJ3cnRlZWkiLCAgWCgzMSwxNjMpLAlYRV9NQVNLLAlQUEM0MDMgfCBCT09LRSwJeyBFIH0gfSwKIAogeyAiZGNidGxzIiwgIFgoMzEsMTY2KSwJWF9NQVNLLAkJUFBDQ0hMSywJeyBDVCwgUkEsIFJCIH19LApAQCAtMzQxNSwxMSArMzU3OCwxMyBAQAogeyAic3RkdXgiLCAgIFgoMzEsMTgxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJTLCBSQVMsIFJCIH0gfSwKIAogeyAic3R3dXgiLCAgIFgoMzEsMTgzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCi17ICJzdHV4IiwgICAgWCgzMSwxODMpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3R1eCIsICAgIFgoMzEsMTgzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCiAKIHsgInNsaXEiLCAgICBYUkMoMzEsMTg0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAogeyAic2xpcS4iLCAgIFhSQygzMSwxODQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCiAKK3sgInBydHlkIiwgICBYKDMxLDE4NiksCVhSQl9NQVNLLAlQT1dFUjYsCQl7IFJBLCBSUyB9IH0sCisKIHsgInN0d3V4ZSIsICBYKDMxLDE5MSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBUywgUkIgfSB9LAogCiB7ICJzdWJmemUiLCAgWE8oMzEsMjAwLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LApAQCAtMzQ0Miw5ICszNjA3LDkgQEAKIAogeyAibXRzciIsICAgIFgoMzEsMjEwKSwJWFJCX01BU0t8KDE8PDIwKSwgQ09NMzIsCXsgU1IsIFJTIH0gfSwKIAoteyAic3RkY3guIiwgIFhSQygzMSwyMTQsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3RkY3guIiwgIFhSQygzMSwyMTQsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJTLCBSQTAsIFJCIH0gfSwKIAoteyAic3RieCIsICAgIFgoMzEsMjE1KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0YngiLCAgICBYKDMxLDIxNSksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJzbGxxIiwgICAgWFJDKDMxLDIxNiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgInNsbHEuIiwgICBYUkMoMzEsMjE2LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LApAQCAtMzQ1Miw3ICszNjE3LDcgQEAKIHsgInNsZXEiLCAgICBYUkMoMzEsMjE3LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogeyAic2xlcS4iLCAgIFhSQygzMSwyMTcsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiAKLXsgInN0YnhlIiwgICBYKDMxLDIyMyksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdGJ4ZSIsICAgWCgzMSwyMjMpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJTLCBSQTAsIFJCIH0gfSwKIAogeyAiaWNibGMiLCAgIFgoMzEsMjMwKSwJWF9NQVNLLAkJUFBDQ0hMSywJeyBDVCwgUkEsIFJCIH19LAogCkBAIC0zNDkyLDcgKzM2NTcsNyBAQAogeyAibXRzcmluIiwgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBQQzMyLAkJeyBSUywgUkIgfSB9LAogeyAibXRzcmkiLCAgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBPV0VSMzIsCXsgUlMsIFJCIH0gfSwKIAoteyAiZGNidHN0IiwgIFgoMzEsMjQ2KSwJWFJUX01BU0ssCVBQQywJCXsgQ1QsIFJBLCBSQiB9IH0sCit7ICJkY2J0c3QiLCAgWCgzMSwyNDYpLAlYX01BU0ssCVBQQywJCQl7IENULCBSQSwgUkIgfSB9LAogCiB7ICJzdGJ1eCIsICAgWCgzMSwyNDcpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKIApAQCAtMzUxOSwyNiArMzY4NCwyNiBAQAogeyAiYWRkby4iLCAgIFhPKDMxLDI2NiwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAogeyAiY2F4by4iLCAgIFhPKDMxLDI2NiwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAogCi17ICJ0bGJpZWwiLCAgWCgzMSwyNzQpLCBYUlRSQV9NQVNLLAlQT1dFUjQsCQl7IFJCIH0gfSwKK3sgInRsYmllbCIsICBYKDMxLDI3NCksIFhSVExSQV9NQVNLLAlQT1dFUjQsCQl7IFJCLCBMIH0gfSwKIAogeyAibWZhcGlkaSIsIFgoMzEsMjc1KSwgWF9NQVNLLAkJQk9PS0UsCQl7IFJULCBSQSB9IH0sCiAKIHsgImxzY2J4IiwgICBYUkMoMzEsMjc3LDApLCBYX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAogeyAibHNjYnguIiwgIFhSQygzMSwyNzcsMSksIFhfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCiAKLXsgImRjYnQiLCAgICBYKDMxLDI3OCksCVhSVF9NQVNLLAlQUEMsCQl7IENULCBSQSwgUkIgfSB9LAoreyAiZGNidCIsICAgIFgoMzEsMjc4KSwJWF9NQVNLLAkJUFBDLAkJeyBDVCwgUkEsIFJCIH0gfSwKIAoteyAibGh6eCIsICAgIFgoMzEsMjc5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxoengiLCAgICBYKDMxLDI3OSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAogCiB7ICJlcXYiLCAgICAgWFJDKDMxLDI4NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAogeyAiZXF2LiIsICAgIFhSQygzMSwyODQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKIAogeyAiZGNidGUiLCAgIFgoMzEsMjg2KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBDVCwgUkEsIFJCIH0gfSwKIAoteyAibGh6eGUiLCAgIFgoMzEsMjg3KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxoenhlIiwgICBYKDMxLDI4NyksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAogCiB7ICJ0bGJpZSIsICAgWCgzMSwzMDYpLAlYUlRMUkFfTUFTSywJUFBDLAkJeyBSQiwgTCB9IH0sCi17ICJ0bGJpIiwgICAgWCgzMSwzMDYpLAlYUlRfTUFTSywJUE9XRVIsCQl7IFJBLCBSQiB9IH0sCit7ICJ0bGJpIiwgICAgWCgzMSwzMDYpLAlYUlRfTUFTSywJUE9XRVIsCQl7IFJBMCwgUkIgfSB9LAogCiB7ICJlY2l3eCIsICAgWCgzMSwzMTApLCBYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAogCkBAIC0zNjA3LDYgKzM3NzIsNyBAQAogeyAibWZzZHIxIiwgICAgIFhTUFIoMzEsMzM5LDI1KSwgICBYU1BSX01BU0ssIENPTSwJeyBSVCB9IH0sCiB7ICJtZnNycjAiLCAgICAgWFNQUigzMSwzMzksMjYpLCAgIFhTUFJfTUFTSywgQ09NLAl7IFJUIH0gfSwKIHsgIm1mc3JyMSIsICAgICBYU1BSKDMxLDMzOSwyNyksICAgWFNQUl9NQVNLLCBDT00sCXsgUlQgfSB9LAoreyAibWZjZmFyIiwgICAgIFhTUFIoMzEsMzM5LDI4KSwgICBYU1BSX01BU0ssIFBPV0VSNiwJeyBSVCB9IH0sCiB7ICJtZnBpZCIsICAgICAgWFNQUigzMSwzMzksNDgpLCAgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAogeyAibWZwaWQiLCAgICAgIFhTUFIoMzEsMzM5LDk0NSksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCiB7ICJtZmNzcnIwIiwgICAgWFNQUigzMSwzMzksNTgpLCAgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LApAQCAtMzYzNCwyMSArMzgwMCwyMSBAQAogeyAibWZiYXIiLCAgICAgIFhTUFIoMzEsMzM5LDE1OSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCiB7ICJtZnZyc2F2ZSIsICAgWFNQUigzMSwzMzksMjU2KSwgIFhTUFJfTUFTSywgUFBDVkVDLAl7IFJUIH0gfSwKIHsgIm1mdXNwcmcwIiwgICBYU1BSKDMxLDMzOSwyNTYpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCi17ICJtZnNwcmc0IiwgICAgWFNQUigzMSwzMzksMjYwKSwgIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJUIH0gfSwKLXsgIm1mc3ByZzUiLCAgICBYU1BSKDMxLDMzOSwyNjEpLCAgWFNQUl9NQVNLLCBQUEM0MDUsCXsgUlQgfSB9LAoteyAibWZzcHJnNiIsICAgIFhTUFIoMzEsMzM5LDI2MiksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSVCB9IH0sCi17ICJtZnNwcmc3IiwgICAgWFNQUigzMSwzMzksMjYzKSwgIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJUIH0gfSwKIHsgIm1mdGIiLCAgICAgICBYKDMxLDM3MSksCSAgIFhfTUFTSywgICAgQ0xBU1NJQywJeyBSVCwgVEJSIH0gfSwKIHsgIm1mdGIiLCAgICAgICBYU1BSKDMxLDMzOSwyNjgpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCiB7ICJtZnRibCIsICAgICAgWFNQUigzMSwzNzEsMjY4KSwgIFhTUFJfTUFTSywgQ0xBU1NJQywJeyBSVCB9IH0sCiB7ICJtZnRibCIsICAgICAgWFNQUigzMSwzMzksMjY4KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAogeyAibWZ0YnUiLCAgICAgIFhTUFIoMzEsMzcxLDI2OSksICBYU1BSX01BU0ssIENMQVNTSUMsCXsgUlQgfSB9LAogeyAibWZ0YnUiLCAgICAgIFhTUFIoMzEsMzM5LDI2OSksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKLXsgIm1mc3ByZyIsICAgICBYU1BSKDMxLDMzOSwyNzIpLCAgWFNQUkdfTUFTSywgUFBDLAl7IFJULCBTUFJHIH0gfSwKK3sgIm1mc3ByZyIsICAgICBYU1BSKDMxLDMzOSwyNTYpLCAgWFNQUkdfTUFTSywgUFBDLAl7IFJULCBTUFJHIH0gfSwKIHsgIm1mc3ByZzAiLCAgICBYU1BSKDMxLDMzOSwyNzIpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlQgfSB9LAogeyAibWZzcHJnMSIsICAgIFhTUFIoMzEsMzM5LDI3MyksICBYU1BSX01BU0ssIFBQQywJeyBSVCB9IH0sCiB7ICJtZnNwcmcyIiwgICAgWFNQUigzMSwzMzksMjc0KSwgIFhTUFJfTUFTSywgUFBDLAl7IFJUIH0gfSwKIHsgIm1mc3ByZzMiLCAgICBYU1BSKDMxLDMzOSwyNzUpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlQgfSB9LAoreyAibWZzcHJnNCIsICAgIFhTUFIoMzEsMzM5LDI2MCksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLAl7IFJUIH0gfSwKK3sgIm1mc3ByZzUiLCAgICBYU1BSKDMxLDMzOSwyNjEpLCAgWFNQUl9NQVNLLCBQUEM0MDUgfCBCT09LRSwJeyBSVCB9IH0sCit7ICJtZnNwcmc2IiwgICAgWFNQUigzMSwzMzksMjYyKSwgIFhTUFJfTUFTSywgUFBDNDA1IHwgQk9PS0UsCXsgUlQgfSB9LAoreyAibWZzcHJnNyIsICAgIFhTUFIoMzEsMzM5LDI2MyksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLAl7IFJUIH0gfSwKIHsgIm1mYXNyIiwgICAgICBYU1BSKDMxLDMzOSwyODApLCAgWFNQUl9NQVNLLCBQUEM2NCwJeyBSVCB9IH0sCiB7ICJtZmVhciIsICAgICAgWFNQUigzMSwzMzksMjgyKSwgIFhTUFJfTUFTSywgUFBDLAl7IFJUIH0gfSwKIHsgIm1mcGlyIiwgICAgICBYU1BSKDMxLDMzOSwyODYpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCkBAIC0zNjk5LDYgKzM4NjUsMTAgQEAKIHsgIm1mc3BlZnNjciIsICBYU1BSKDMxLDMzOSw1MTIpLCAgWFNQUl9NQVNLLCBQUENTUEUsCXsgUlQgfSB9LAogeyAibWZiYmVhciIsICAgIFhTUFIoMzEsMzM5LDUxMyksICBYU1BSX01BU0ssIFBQQ0JSTEssICB7IFJUIH0gfSwKIHsgIm1mYmJ0YXIiLCAgICBYU1BSKDMxLDMzOSw1MTQpLCAgWFNQUl9NQVNLLCBQUENCUkxLLCAgeyBSVCB9IH0sCit7ICJtZml2b3IzMiIsICAgWFNQUigzMSwzMzksNTI4KSwgIFhTUFJfTUFTSywgUFBDU1BFLAl7IFJUIH0gfSwKK3sgIm1maXZvcjMzIiwgICBYU1BSKDMxLDMzOSw1MjkpLCAgWFNQUl9NQVNLLCBQUENTUEUsCXsgUlQgfSB9LAoreyAibWZpdm9yMzQiLCAgIFhTUFIoMzEsMzM5LDUzMCksICBYU1BSX01BU0ssIFBQQ1NQRSwJeyBSVCB9IH0sCit7ICJtZml2b3IzNSIsICAgWFNQUigzMSwzMzksNTMxKSwgIFhTUFJfTUFTSywgUFBDUE1SLAl7IFJUIH0gfSwKIHsgIm1maWJhdHUiLCAgICBYU1BSKDMxLDMzOSw1MjgpLCAgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCiB7ICJtZmliYXRsIiwgICAgWFNQUigzMSwzMzksNTI5KSwgIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAogeyAibWZkYmF0dSIsICAgIFhTUFIoMzEsMzM5LDUzNiksICBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKQEAgLTM3MDgsMTAgKzM4NzgsMTEgQEAKIHsgIm1maWNfZGF0IiwgICBYU1BSKDMxLDMzOSw1NjIpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAogeyAibWZkY19jc3QiLCAgIFhTUFIoMzEsMzM5LDU2OCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCiB7ICJtZmRjX2FkciIsICAgWFNQUigzMSwzMzksNTY5KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGNfZGF0IiwgICBYU1BSKDMxLDMzOSw1NzApLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAogeyAibWZtY3NycjAiLCAgIFhTUFIoMzEsMzM5LDU3MCksICBYU1BSX01BU0ssIFBQQ1JGTUNJLCB7IFJUIH0gfSwKK3sgIm1mZGNfZGF0IiwgICBYU1BSKDMxLDMzOSw1NzApLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAogeyAibWZtY3NycjEiLCAgIFhTUFIoMzEsMzM5LDU3MSksICBYU1BSX01BU0ssIFBQQ1JGTUNJLCB7IFJUIH0gfSwKIHsgIm1mbWNzciIsICAgICBYU1BSKDMxLDMzOSw1NzIpLCAgWFNQUl9NQVNLLCBQUENSRk1DSSwgeyBSVCB9IH0sCit7ICJtZm1jYXIiLCAgICAgWFNQUigzMSwzMzksNTczKSwgIFhTUFJfTUFTSywgUFBDUkZNQ0ksIHsgUlQgfSB9LAogeyAibWZkcGRyIiwgICAgIFhTUFIoMzEsMzM5LDYzMCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCiB7ICJtZmRwaXIiLCAgICAgWFNQUigzMSwzMzksNjMxKSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKIHsgIm1maW1tciIsICAgICBYU1BSKDMxLDMzOSw2MzgpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LApAQCAtMzc3NSwxNCArMzk0NiwxNCBAQAogeyAibWZwYnUyIiwgICAgIFhTUFIoMzEsMzM5LDEwMjMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCiB7ICJtZnNwciIsICAgICAgWCgzMSwzMzkpLAkgICBYX01BU0ssICAgIENPTSwJeyBSVCwgU1BSIH0gfSwKIAoteyAibHdheCIsICAgIFgoMzEsMzQxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibHdheCIsICAgIFgoMzEsMzQxKSwJWF9NQVNLLAkJUFBDNjQsCQl7IFJULCBSQTAsIFJCIH0gfSwKIAogeyAiZHN0IiwgICAgIFhEU1MoMzEsMzQyLDApLCBYRFNTX01BU0ssCVBQQ1ZFQywJCXsgUkEsIFJCLCBTVFJNIH0gfSwKIHsgImRzdHQiLCAgICBYRFNTKDMxLDM0MiwxKSwgWERTU19NQVNLLAlQUENWRUMsCQl7IFJBLCBSQiwgU1RSTSB9IH0sCiAKLXsgImxoYXgiLCAgICBYKDMxLDM0MyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsaGF4IiwgICAgWCgzMSwzNDMpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQTAsIFJCIH0gfSwKIAoteyAibGhheGUiLCAgIFgoMzEsMzUxKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxoYXhlIiwgICBYKDMxLDM1MSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAogCiB7ICJkc3RzdCIsICAgWERTUygzMSwzNzQsMCksIFhEU1NfTUFTSywJUFBDVkVDLAkJeyBSQSwgUkIsIFNUUk0gfSB9LAogeyAiZHN0c3R0IiwgIFhEU1MoMzEsMzc0LDEpLCBYRFNTX01BU0ssCVBQQ1ZFQywJCXsgUkEsIFJCLCBTVFJNIH0gfSwKQEAgLTM4MjEsMTQgKzM5OTIsMjAgQEAKIAogeyAic2xibXRlIiwgIFgoMzEsNDAyKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBSUywgUkIgfSB9LAogCi17ICJzdGh4IiwgICAgWCgzMSw0MDcpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3RoeCIsICAgIFgoMzEsNDA3KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgImNtcGIiLCAgICBYKDMxLDUwOCksCVhfTUFTSywJCVBPV0VSNiwJCXsgUkEsIFJTLCBSQiB9IH0sCiAKIHsgImxmcXgiLCAgICBYKDMxLDc5MSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJULCBSQSwgUkIgfSB9LAogCit7ICJsZmRweCIsICAgWCgzMSw3OTEpLAlYX01BU0ssCQlQT1dFUjYsCQl7IEZSVCwgUkEsIFJCIH0gfSwKKwogeyAibGZxdXgiLCAgIFgoMzEsODIzKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlQsIFJBLCBSQiB9IH0sCiAKIHsgInN0ZnF4IiwgICBYKDMxLDkxOSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJTLCBSQSwgUkIgfSB9LAogCit7ICJzdGZkcHgiLCAgWCgzMSw5MTkpLAlYX01BU0ssCQlQT1dFUjYsCQl7IEZSUywgUkEsIFJCIH0gfSwKKwogeyAic3RmcXV4IiwgIFgoMzEsOTUxKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlMsIFJBLCBSQiB9IH0sCiAKIHsgIm9yYyIsICAgICBYUkMoMzEsNDEyLDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCkBAIC0zODM3LDcgKzQwMTQsNyBAQAogeyAic3JhZGkiLCAgIFhTKDMxLDQxMywwKSwgWFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKIHsgInNyYWRpLiIsICBYUygzMSw0MTMsMSksIFhTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCiAKLXsgInN0aHhlIiwgICBYKDMxLDQxNSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdGh4ZSIsICAgWCgzMSw0MTUpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJTLCBSQTAsIFJCIH0gfSwKIAogeyAic2xiaWUiLCAgIFgoMzEsNDM0KSwJWFJUUkFfTUFTSywJUFBDNjQsCQl7IFJCIH0gfSwKIApAQCAtMzkxOCw2ICs0MDk1LDcgQEAKIHsgIm10c2RyMSIsICAgIFhTUFIoMzEsNDY3LDI1KSwgICBYU1BSX01BU0ssIENPTSwJeyBSUyB9IH0sCiB7ICJtdHNycjAiLCAgICBYU1BSKDMxLDQ2NywyNiksICAgWFNQUl9NQVNLLCBDT00sCXsgUlMgfSB9LAogeyAibXRzcnIxIiwgICAgWFNQUigzMSw0NjcsMjcpLCAgIFhTUFJfTUFTSywgQ09NLAl7IFJTIH0gfSwKK3sgIm10Y2ZhciIsICAgIFhTUFIoMzEsNDY3LDI4KSwgICBYU1BSX01BU0ssIFBPV0VSNiwJeyBSUyB9IH0sCiB7ICJtdHBpZCIsICAgICBYU1BSKDMxLDQ2Nyw0OCksICAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAogeyAibXRwaWQiLCAgICAgWFNQUigzMSw0NjcsOTQ1KSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKIHsgIm10ZGVjYXIiLCAgIFhTUFIoMzEsNDY3LDU0KSwgICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCkBAIC0zOTQ2LDcgKzQxMjQsNyBAQAogeyAibXRiYXIiLCAgICAgWFNQUigzMSw0NjcsMTU5KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJTIH0gfSwKIHsgIm10dnJzYXZlIiwgIFhTUFIoMzEsNDY3LDI1NiksICBYU1BSX01BU0ssIFBQQ1ZFQywJeyBSUyB9IH0sCiB7ICJtdHVzcHJnMCIsICBYU1BSKDMxLDQ2NywyNTYpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoteyAibXRzcHJnIiwgICAgWFNQUigzMSw0NjcsMjcyKSwgIFhTUFJHX01BU0ssUFBDLAl7IFNQUkcsIFJTIH0gfSwKK3sgIm10c3ByZyIsICAgIFhTUFIoMzEsNDY3LDI1NiksICBYU1BSR19NQVNLLFBQQywJeyBTUFJHLCBSUyB9IH0sCiB7ICJtdHNwcmcwIiwgICBYU1BSKDMxLDQ2NywyNzIpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlMgfSB9LAogeyAibXRzcHJnMSIsICAgWFNQUigzMSw0NjcsMjczKSwgIFhTUFJfTUFTSywgUFBDLAl7IFJTIH0gfSwKIHsgIm10c3ByZzIiLCAgIFhTUFIoMzEsNDY3LDI3NCksICBYU1BSX01BU0ssIFBQQywJeyBSUyB9IH0sCkBAIC00MDA1LDYgKzQxODMsMTAgQEAKIHsgIm10c3BlZnNjciIsICBYU1BSKDMxLDQ2Nyw1MTIpLCAgWFNQUl9NQVNLLCBQUENTUEUsICAgeyBSUyB9IH0sCiB7ICJtdGJiZWFyIiwgICBYU1BSKDMxLDQ2Nyw1MTMpLCAgWFNQUl9NQVNLLCBQUENCUkxLLCAgIHsgUlMgfSB9LAogeyAibXRiYnRhciIsICAgWFNQUigzMSw0NjcsNTE0KSwgIFhTUFJfTUFTSywgUFBDQlJMSywgIHsgUlMgfSB9LAoreyAibXRpdm9yMzIiLCAgWFNQUigzMSw0NjcsNTI4KSwgIFhTUFJfTUFTSywgUFBDU1BFLAl7IFJTIH0gfSwKK3sgIm10aXZvcjMzIiwgIFhTUFIoMzEsNDY3LDUyOSksICBYU1BSX01BU0ssIFBQQ1NQRSwJeyBSUyB9IH0sCit7ICJtdGl2b3IzNCIsICBYU1BSKDMxLDQ2Nyw1MzApLCAgWFNQUl9NQVNLLCBQUENTUEUsCXsgUlMgfSB9LAoreyAibXRpdm9yMzUiLCAgWFNQUigzMSw0NjcsNTMxKSwgIFhTUFJfTUFTSywgUFBDUE1SLAl7IFJTIH0gfSwKIHsgIm10aWJhdHUiLCAgIFhTUFIoMzEsNDY3LDUyOCksICBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKIHsgIm10aWJhdGwiLCAgIFhTUFIoMzEsNDY3LDUyOSksICBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKIHsgIm10ZGJhdHUiLCAgIFhTUFIoMzEsNDY3LDUzNiksICBYU1BSQkFUX01BU0ssIFBQQywJeyBTUFJCQVQsIFJTIH0gfSwKQEAgLTQxMDEsMTMgKzQyODMsMTUgQEAKIAogeyAiY2xjcyIsICAgIFgoMzEsNTMxKSwgWFJCX01BU0ssCU02MDEsCQl7IFJULCBSQSB9IH0sCiAKLXsgImxzd3giLCAgICBYKDMxLDUzMyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJsZGJyeCIsICAgWCgzMSw1MzIpLAlYX01BU0ssCQlDRUxMLAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKK3sgImxzd3giLCAgICBYKDMxLDUzMyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAogeyAibHN4IiwgICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKIAoteyAibHdicngiLCAgIFgoMzEsNTM0KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImx3YnJ4IiwgICBYKDMxLDUzNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAogeyAibGJyeCIsICAgIFgoMzEsNTM0KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKIAoteyAibGZzeCIsICAgIFgoMzEsNTM1KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBLCBSQiB9IH0sCit7ICJsZnN4IiwgICAgWCgzMSw1MzUpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEwLCBSQiB9IH0sCiAKIHsgInNydyIsICAgICBYUkMoMzEsNTM2LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJzciIsICAgICAgWFJDKDMxLDUzNiwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LApAQCAtNDEyMywxMSArNDMwNywxMiBAQAogeyAibWFza2lyIiwgIFhSQygzMSw1NDEsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJtYXNraXIuIiwgWFJDKDMxLDU0MSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIAoteyAibHdicnhlIiwgIFgoMzEsNTQyKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImx3YnJ4ZSIsICBYKDMxLDU0MiksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAogCi17ICJsZnN4ZSIsICAgWCgzMSw1NDMpLAlYX01BU0ssCQlCT09LRTY0LAl7IEZSVCwgUkEsIFJCIH0gfSwKK3sgImxmc3hlIiwgICBYKDMxLDU0MyksCVhfTUFTSywJCUJPT0tFNjQsCXsgRlJULCBSQTAsIFJCIH0gfSwKIAogeyAiYmJlbHIiLCAgIFgoMzEsNTUwKSwJWF9NQVNLLAkJUFBDQlJMSywJeyAwIH19LAorCiB7ICJ0bGJzeW5jIiwgWCgzMSw1NjYpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAogCiB7ICJsZnN1eCIsICAgWCgzMSw1NjcpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkFTLCBSQiB9IH0sCkBAIC00MTM2LDggKzQzMjEsOCBAQAogCiB7ICJtZnNyIiwgICAgWCgzMSw1OTUpLAlYUkJfTUFTS3woMTw8MjApLCBDT00zMiwJeyBSVCwgU1IgfSB9LAogCi17ICJsc3dpIiwgICAgWCgzMSw1OTcpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQSwgTkIgfSB9LAoteyAibHNpIiwgICAgIFgoMzEsNTk3KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIE5CIH0gfSwKK3sgImxzd2kiLCAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBMCwgTkIgfSB9LAoreyAibHNpIiwgICAgIFgoMzEsNTk3KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEwLCBOQiB9IH0sCiAKIHsgImx3c3luYyIsICBYU1lOQygzMSw1OTgsMSksIDB4ZmZmZmZmZmYsIFBQQywJCXsgMCB9IH0sCiB7ICJwdGVzeW5jIiwgWFNZTkMoMzEsNTk4LDIpLCAweGZmZmZmZmZmLCBQUEM2NCwJeyAwIH0gfSwKQEAgLTQxNDUsOSArNDMzMCwxMSBAQAogeyAic3luYyIsICAgIFgoMzEsNTk4KSwgWFNZTkNfTUFTSywJUFBDQ09NLAkJeyBMUyB9IH0sCiB7ICJkY3MiLCAgICAgWCgzMSw1OTgpLCAweGZmZmZmZmZmLAlQV1JDT00sCQl7IDAgfSB9LAogCi17ICJsZmR4IiwgICAgWCgzMSw1OTkpLCBYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEsIFJCIH0gfSwKK3sgImxmZHgiLCAgICBYKDMxLDU5OSksIFhfTUFTSywJCUNPTSwJCXsgRlJULCBSQTAsIFJCIH0gfSwKIAoteyAibGZkeGUiLCAgIFgoMzEsNjA3KSwgWF9NQVNLLAkJQk9PS0U2NCwJeyBGUlQsIFJBLCBSQiB9IH0sCit7ICJsZmR4ZSIsICAgWCgzMSw2MDcpLCBYX01BU0ssCQlCT09LRTY0LAl7IEZSVCwgUkEwLCBSQiB9IH0sCisKK3sgIm1mZmdwciIsICBYUkMoMzEsNjA3LDApLCBYUkFfTUFTSywJUE9XRVI2LAkJeyBGUlQsIFJCIH0gfSwKIAogeyAibWZzcmkiLCAgIFgoMzEsNjI3KSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKIApAQCAtNDE1OSwxMyArNDM0NiwxNSBAQAogCiB7ICJtZnNyaW4iLCAgWCgzMSw2NTkpLCBYUkFfTUFTSywJUFBDMzIsCQl7IFJULCBSQiB9IH0sCiAKLXsgInN0c3d4IiwgICBYKDMxLDY2MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi17ICJzdHN4IiwgICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAic3RkYnJ4IiwgIFgoMzEsNjYwKSwgWF9NQVNLLAkJQ0VMTCwJCXsgUlMsIFJBMCwgUkIgfSB9LAogCi17ICJzdHdicngiLCAgWCgzMSw2NjIpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoteyAic3RicngiLCAgIFgoMzEsNjYyKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0c3d4IiwgICBYKDMxLDY2MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAoreyAic3RzeCIsICAgIFgoMzEsNjYxKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCiAKLXsgInN0ZnN4IiwgICBYKDMxLDY2MyksIFhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQSwgUkIgfSB9LAoreyAic3R3YnJ4IiwgIFgoMzEsNjYyKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCit7ICJzdGJyeCIsICAgWCgzMSw2NjIpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKKworeyAic3Rmc3giLCAgIFgoMzEsNjYzKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJzcnEiLCAgICAgWFJDKDMxLDY2NCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgInNycS4iLCAgICBYUkMoMzEsNjY0LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LApAQCAtNDE3Myw5ICs0MzYyLDkgQEAKIHsgInNyZSIsICAgICBYUkMoMzEsNjY1LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogeyAic3JlLiIsICAgIFhSQygzMSw2NjUsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiAKLXsgInN0d2JyeGUiLCBYKDMxLDY3MCksIFhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdHdicnhlIiwgWCgzMSw2NzApLCBYX01BU0ssCQlCT09LRTY0LAl7IFJTLCBSQTAsIFJCIH0gfSwKIAoteyAic3Rmc3hlIiwgIFgoMzEsNjcxKSwgWF9NQVNLLAkJQk9PS0U2NCwJeyBGUlMsIFJBLCBSQiB9IH0sCit7ICJzdGZzeGUiLCAgWCgzMSw2NzEpLCBYX01BU0ssCQlCT09LRTY0LAl7IEZSUywgUkEwLCBSQiB9IH0sCiAKIHsgInN0ZnN1eCIsICBYKDMxLDY5NSksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQVMsIFJCIH0gfSwKIApAQCAtNDE4NCwxMCArNDM3MywxMCBAQAogCiB7ICJzdGZzdXhlIiwgWCgzMSw3MDMpLAlYX01BU0ssCQlCT09LRTY0LAl7IEZSUywgUkFTLCBSQiB9IH0sCiAKLXsgInN0c3dpIiwgICBYKDMxLDcyNSksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBOQiB9IH0sCi17ICJzdHNpIiwgICAgWCgzMSw3MjUpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgTkIgfSB9LAoreyAic3Rzd2kiLCAgIFgoMzEsNzI1KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEwLCBOQiB9IH0sCit7ICJzdHNpIiwgICAgWCgzMSw3MjUpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQTAsIE5CIH0gfSwKIAoteyAic3RmZHgiLCAgIFgoMzEsNzI3KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBLCBSQiB9IH0sCit7ICJzdGZkeCIsICAgWCgzMSw3MjcpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkEwLCBSQiB9IH0sCiAKIHsgInNybHEiLCAgICBYUkMoMzEsNzI4LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAogeyAic3JscS4iLCAgIFhSQygzMSw3MjgsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCkBAIC00MTk1LDcgKzQzODQsOSBAQAogeyAic3JlcSIsICAgIFhSQygzMSw3MjksMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJzcmVxLiIsICAgWFJDKDMxLDcyOSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKIAoteyAic3RmZHhlIiwgIFgoMzEsNzM1KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBGUlMsIFJBLCBSQiB9IH0sCit7ICJzdGZkeGUiLCAgWCgzMSw3MzUpLAlYX01BU0ssCQlCT09LRTY0LAl7IEZSUywgUkEwLCBSQiB9IH0sCisKK3sgIm1mdGdwciIsICBYUkMoMzEsNzM1LDApLCBYUkFfTUFTSywJUE9XRVI2LAkJeyBSVCwgRlJCIH0gfSwKIAogeyAiZGNiYSIsICAgIFgoMzEsNzU4KSwJWFJUX01BU0ssCVBQQzQwNSB8IEJPT0tFLAl7IFJBLCBSQiB9IH0sCiAKQEAgLTQyMTEsNyArNDQwMiw5IEBACiB7ICJ0bGJpdmF4IiwgWCgzMSw3ODYpLAlYUlRfTUFTSywJQk9PS0UsCQl7IFJBLCBSQiB9IH0sCiB7ICJ0bGJpdmF4ZSIsWCgzMSw3ODcpLAlYUlRfTUFTSywJQk9PS0U2NCwJeyBSQSwgUkIgfSB9LAogCi17ICJsaGJyeCIsICAgWCgzMSw3OTApLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibHd6Y2l4IiwgIFgoMzEsNzg5KSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKK3sgImxoYnJ4IiwgICBYKDMxLDc5MCksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAogCiB7ICJzcmF3IiwgICAgWFJDKDMxLDc5MiwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAogeyAic3JhIiwgICAgIFhSQygzMSw3OTIsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKQEAgLTQyMjEsMTMgKzQ0MTQsMTUgQEAKIHsgInNyYWQiLCAgICBYUkMoMzEsNzk0LDApLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKIHsgInNyYWQuIiwgICBYUkMoMzEsNzk0LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKIAoteyAibGhicnhlIiwgIFgoMzEsNzk4KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxoYnJ4ZSIsICBYKDMxLDc5OCksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAogCi17ICJsZHhlIiwgICAgWCgzMSw3OTkpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoteyAibGR1eGUiLCAgIFgoMzEsODMxKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxkeGUiLCAgICBYKDMxLDc5OSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAoreyAibGR1eGUiLCAgIFgoMzEsODMxKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCiAKIHsgInJhYyIsICAgICBYKDMxLDgxOCksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCiAKK3sgImxoemNpeCIsICBYKDMxLDgyMSksCVhfTUFTSywJCVBPV0VSNiwJCXsgUlQsIFJBMCwgUkIgfSB9LAorCiB7ICJkc3MiLCAgICAgWERTUygzMSw4MjIsMCksIFhEU1NfTUFTSywJUFBDVkVDLAkJeyBTVFJNIH0gfSwKIHsgImRzc2FsbCIsICBYRFNTKDMxLDgyMiwxKSwgWERTU19NQVNLLAlQUENWRUMsCQl7IDAgfSB9LAogCkBAIC00MjM4LDE5ICs0NDMzLDI1IEBACiAKIHsgInNsYm1mZXYiLCBYKDMxLDg1MSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgUlQsIFJCIH0gfSwKIAoreyAibGJ6Y2l4IiwgIFgoMzEsODUzKSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKIHsgIm1iYXIiLCAgICBYKDMxLDg1NCksCVhfTUFTSywJCUJPT0tFLAkJeyBNTyB9IH0sCiB7ICJlaWVpbyIsICAgWCgzMSw4NTQpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAogCi17ICJ0bGJzeCIsICAgWFJDKDMxLDkxNCwwKSwgWF9NQVNLLAlCT09LRSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsYnN4IiwgICBYUkMoMzEsOTE0LDApLCBYX01BU0ssIAlQUEM0MDMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAidGxic3guIiwgIFhSQygzMSw5MTQsMSksIFhfTUFTSywJQk9PS0UsCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGJzeC4iLCAgWFJDKDMxLDkxNCwxKSwgWF9NQVNLLCAJUFBDNDAzLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxmaXdheCIsICBYKDMxLDg1NSksCVhfTUFTSywJCVBPV0VSNiwJCXsgRlJULCBSQTAsIFJCIH0gfSwKKworeyAibGRjaXgiLCAgIFgoMzEsODg1KSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKK3sgInRsYnN4IiwgICBYUkMoMzEsOTE0LDApLCBYX01BU0ssIAlQUEM0MDN8Qk9PS0UsCXsgUlRPLCBSQSwgUkIgfSB9LAoreyAidGxic3guIiwgIFhSQygzMSw5MTQsMSksIFhfTUFTSywgCVBQQzQwM3xCT09LRSwJeyBSVE8sIFJBLCBSQiB9IH0sCiB7ICJ0bGJzeGUiLCAgWFJDKDMxLDkxNSwwKSwgWF9NQVNLLAlCT09LRTY0LAl7IFJBLCBSQiB9IH0sCiB7ICJ0bGJzeGUuIiwgWFJDKDMxLDkxNSwxKSwgWF9NQVNLLAlCT09LRTY0LAl7IFJBLCBSQiB9IH0sCiAKIHsgInNsYm1mZWUiLCBYKDMxLDkxNSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgUlQsIFJCIH0gfSwKIAoteyAic3RoYnJ4IiwgIFgoMzEsOTE4KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0d2NpeCIsICBYKDMxLDkxNyksCVhfTUFTSywJCVBPV0VSNiwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzdGhicngiLCAgWCgzMSw5MTgpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKIAogeyAic3JhcSIsICAgIFhSQygzMSw5MjAsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCiB7ICJzcmFxLiIsICAgWFJDKDMxLDkyMCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKQEAgLTQyNjMsMTQgKzQ0NjQsMTUgQEAKIHsgImV4dHNoLiIsICBYUkMoMzEsOTIyLDEpLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAogeyAiZXh0cy4iLCAgIFhSQygzMSw5MjIsMSksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCiAKLXsgInN0aGJyeGUiLCBYKDMxLDkyNiksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJzdGhicnhlIiwgWCgzMSw5MjYpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJTLCBSQTAsIFJCIH0gfSwKIAoteyAic3RkeGUiLCAgIFgoMzEsOTI3KSwgWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkEsIFJCIH0gfSwKK3sgInN0ZHhlIiwgICBYKDMxLDkyNyksIFhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAogCiB7ICJ0bGJyZWhpIiwgWFRMQigzMSw5NDYsMCksIFhUTEJfTUFTSywJUFBDNDAzLAkJeyBSVCwgUkEgfSB9LAogeyAidGxicmVsbyIsIFhUTEIoMzEsOTQ2LDEpLCBYVExCX01BU0ssCVBQQzQwMywJCXsgUlQsIFJBIH0gfSwKLXsgInRsYnJlIiwgICBYKDMxLDk0NiksCVhfTUFTSywJCUJPT0tFLAkJeyAwIH0gfSwKLXsgInRsYnJlIiwgICBYKDMxLDk0NiksCVhfTUFTSywJCVBQQzQwMywJCXsgUlMsIFJBLCBTSCB9IH0sCit7ICJ0bGJyZSIsICAgWCgzMSw5NDYpLAlYX01BU0ssCQlQUEM0MDN8Qk9PS0UsCXsgUlNPLCBSQU9QVCwgU0hPIH0gfSwKKworeyAic3RoY2l4IiwgIFgoMzEsOTQ5KSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSUywgUkEwLCBSQiB9IH0sCiAKIHsgInNyYWlxIiwgICBYUkMoMzEsOTUyLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAogeyAic3JhaXEuIiwgIFhSQygzMSw5NTIsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCkBAIC00Mjg0LDEzICs0NDg2LDE0IEBACiAKIHsgInRsYndlaGkiLCBYVExCKDMxLDk3OCwwKSwgWFRMQl9NQVNLLAlQUEM0MDMsCQl7IFJULCBSQSB9IH0sCiB7ICJ0bGJ3ZWxvIiwgWFRMQigzMSw5NzgsMSksIFhUTEJfTUFTSywJUFBDNDAzLAkJeyBSVCwgUkEgfSB9LAoteyAidGxid2UiLCAgIFgoMzEsOTc4KSwJWF9NQVNLLAkJQk9PS0UsCQl7IDAgfSB9LAoteyAidGxid2UiLCAgIFgoMzEsOTc4KSwJWF9NQVNLLAkJUFBDNDAzLAkJeyBSUywgUkEsIFNIIH0gfSwKK3sgInRsYndlIiwgICBYKDMxLDk3OCksCVhfTUFTSywJCVBQQzQwM3xCT09LRSwJeyBSU08sIFJBT1BULCBTSE8gfSB9LAogeyAidGxibGQiLCAgIFgoMzEsOTc4KSwJWFJUUkFfTUFTSywJUFBDLAkJeyBSQiB9IH0sCiAKK3sgInN0YmNpeCIsICBYKDMxLDk4MSksCVhfTUFTSywJCVBPV0VSNiwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCiB7ICJpY2JpIiwgICAgWCgzMSw5ODIpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAogCi17ICJzdGZpd3giLCAgWCgzMSw5ODMpLAlYX01BU0ssCQlQUEMsCQl7IEZSUywgUkEsIFJCIH0gfSwKK3sgInN0Zml3eCIsICBYKDMxLDk4MyksCVhfTUFTSywJCVBQQywJCXsgRlJTLCBSQTAsIFJCIH0gfSwKIAogeyAiZXh0c3ciLCAgIFhSQygzMSw5ODYsMCksIFhSQl9NQVNLLAlQUEM2NCB8IEJPT0tFNjQseyBSQSwgUlMgfSB9LAogeyAiZXh0c3cuIiwgIFhSQygzMSw5ODYsMSksIFhSQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTIH0gfSwKQEAgLTQyOTgsMTAgKzQ1MDEsMTMgQEAKIHsgImljcmVhZCIsICBYKDMxLDk5OCksCVhSVF9NQVNLLAlQUEM0MDN8UFBDNDQwLAl7IFJBLCBSQiB9IH0sCiAKIHsgImljYmllIiwgICBYKDMxLDk5MCksCVhSVF9NQVNLLAlCT09LRTY0LAl7IFJBLCBSQiB9IH0sCi17ICJzdGZpd3hlIiwgWCgzMSw5OTEpLAlYX01BU0ssCQlCT09LRTY0LAl7IEZSUywgUkEsIFJCIH0gfSwKK3sgInN0Zml3eGUiLCBYKDMxLDk5MSksCVhfTUFTSywJCUJPT0tFNjQsCXsgRlJTLCBSQTAsIFJCIH0gfSwKIAogeyAidGxibGkiLCAgIFgoMzEsMTAxMCksIFhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAogCit7ICJzdGRjaXgiLCAgWCgzMSwxMDEzKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFJTLCBSQTAsIFJCIH0gfSwKKworeyAiZGNiemwiLCAgIFhPUEwoMzEsMTAxNCwxKSwgWFJUX01BU0ssUE9XRVI0LCAgICAgICAgICAgIHsgUkEsIFJCIH0gfSwKIHsgImRjYnoiLCAgICBYKDMxLDEwMTQpLCBYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAogeyAiZGNseiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCiAKQEAgLTQzMjAsODYgKzQ1MjYsMTA0IEBACiB7ICJzdHZ4IiwgICAgWCgzMSwgMjMxKSwgWF9NQVNLLAlQUENWRUMsCQl7IFZTLCBSQSwgUkIgfSB9LAogeyAic3R2eGwiLCAgIFgoMzEsIDQ4NyksIFhfTUFTSywJUFBDVkVDLAkJeyBWUywgUkEsIFJCIH0gfSwKIAoteyAibHd6IiwgICAgIE9QKDMyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAoteyAibCIsCSAgICAgT1AoMzIpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCisvKiBOZXcgbG9hZC9zdG9yZSBsZWZ0L3JpZ2h0IGluZGV4IHZlY3RvciBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaW4gdGhlIENlbGwgb25seS4gICovCit7ICJsdmx4IiwgICAgWCgzMSwgNTE5KSwgWF9NQVNLLAlDRUxMLAkJeyBWRCwgUkEwLCBSQiB9IH0sCit7ICJsdmx4bCIsICAgWCgzMSwgNzc1KSwgWF9NQVNLLAlDRUxMLAkJeyBWRCwgUkEwLCBSQiB9IH0sCit7ICJsdnJ4IiwgICAgWCgzMSwgNTUxKSwgWF9NQVNLLAlDRUxMLAkJeyBWRCwgUkEwLCBSQiB9IH0sCit7ICJsdnJ4bCIsICAgWCgzMSwgODA3KSwgWF9NQVNLLAlDRUxMLAkJeyBWRCwgUkEwLCBSQiB9IH0sCit7ICJzdHZseCIsICAgWCgzMSwgNjQ3KSwgWF9NQVNLLAlDRUxMLAkJeyBWUywgUkEwLCBSQiB9IH0sCit7ICJzdHZseGwiLCAgWCgzMSwgOTAzKSwgWF9NQVNLLAlDRUxMLAkJeyBWUywgUkEwLCBSQiB9IH0sCit7ICJzdHZyeCIsICAgWCgzMSwgNjc5KSwgWF9NQVNLLAlDRUxMLAkJeyBWUywgUkEwLCBSQiB9IH0sCit7ICJzdHZyeGwiLCAgWCgzMSwgOTM1KSwgWF9NQVNLLAlDRUxMLAkJeyBWUywgUkEwLCBSQiB9IH0sCisKK3sgImx3eiIsICAgICBPUCgzMiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCit7ICJsIiwJICAgICBPUCgzMiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCiAKIHsgImx3enUiLCAgICBPUCgzMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi17ICJsdSIsICAgICAgT1AoMzMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCit7ICJsdSIsICAgICAgT1AoMzMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQTAgfSB9LAogCi17ICJsYnoiLCAgICAgT1AoMzQpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQSB9IH0sCit7ICJsYnoiLCAgICAgT1AoMzQpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQTAgfSB9LAogCiB7ICJsYnp1IiwgICAgT1AoMzUpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQUwgfSB9LAogCi17ICJzdHciLCAgICAgT1AoMzYpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQSB9IH0sCi17ICJzdCIsICAgICAgT1AoMzYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQSB9IH0sCit7ICJzdHciLCAgICAgT1AoMzYpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQTAgfSB9LAoreyAic3QiLCAgICAgIE9QKDM2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEwIH0gfSwKIAogeyAic3R3dSIsICAgIE9QKDM3KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKLXsgInN0dSIsICAgICBPUCgzNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKK3sgInN0dSIsICAgICBPUCgzNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBMCB9IH0sCiAKLXsgInN0YiIsICAgICBPUCgzOCksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKK3sgInN0YiIsICAgICBPUCgzOCksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBMCB9IH0sCiAKIHsgInN0YnUiLCAgICBPUCgzOSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCiAKLXsgImxoeiIsICAgICBPUCg0MCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKK3sgImxoeiIsICAgICBPUCg0MCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCiAKIHsgImxoenUiLCAgICBPUCg0MSksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCiAKLXsgImxoYSIsICAgICBPUCg0MiksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKK3sgImxoYSIsICAgICBPUCg0MiksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCiAKIHsgImxoYXUiLCAgICBPUCg0MyksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCiAKLXsgInN0aCIsICAgICBPUCg0NCksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKK3sgInN0aCIsICAgICBPUCg0NCksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBMCB9IH0sCiAKIHsgInN0aHUiLCAgICBPUCg0NSksCU9QX01BU0ssCUNPTSwJCXsgUlMsIEQsIFJBUyB9IH0sCiAKIHsgImxtdyIsICAgICBPUCg0NiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBTSB9IH0sCi17ICJsbSIsICAgICAgT1AoNDYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQSB9IH0sCit7ICJsbSIsICAgICAgT1AoNDYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBELCBSQTAgfSB9LAogCi17ICJzdG13IiwgICAgT1AoNDcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQSB9IH0sCi17ICJzdG0iLCAgICAgT1AoNDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQSB9IH0sCit7ICJzdG13IiwgICAgT1AoNDcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQTAgfSB9LAoreyAic3RtIiwgICAgIE9QKDQ3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEwIH0gfSwKIAoteyAibGZzIiwgICAgIE9QKDQ4KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBIH0gfSwKK3sgImxmcyIsICAgICBPUCg0OCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQTAgfSB9LAogCiB7ICJsZnN1IiwgICAgT1AoNDkpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkFTIH0gfSwKIAoteyAibGZkIiwgICAgIE9QKDUwKSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBIH0gfSwKK3sgImxmZCIsICAgICBPUCg1MCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQTAgfSB9LAogCiB7ICJsZmR1IiwgICAgT1AoNTEpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkFTIH0gfSwKIAoteyAic3RmcyIsICAgIE9QKDUyKSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBIH0gfSwKK3sgInN0ZnMiLCAgICBPUCg1MiksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQTAgfSB9LAogCiB7ICJzdGZzdSIsICAgT1AoNTMpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkFTIH0gfSwKIAoteyAic3RmZCIsICAgIE9QKDU0KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBIH0gfSwKK3sgInN0ZmQiLCAgICBPUCg1NCksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQTAgfSB9LAogCiB7ICJzdGZkdSIsICAgT1AoNTUpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkFTIH0gfSwKIAogeyAibHEiLCAgICAgIE9QKDU2KSwJT1BfTUFTSywJUE9XRVI0LAkJeyBSVFEsIERRLCBSQVEgfSB9LAogCi17ICJsZnEiLCAgICAgT1AoNTYpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRCwgUkEgfSB9LAoreyAibGZxIiwgICAgIE9QKDU2KSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEQsIFJBMCB9IH0sCiAKLXsgImxmcXUiLCAgICBPUCg1NyksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQSB9IH0sCit7ICJsZnF1IiwgICAgT1AoNTcpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRCwgUkEwIH0gfSwKIAoteyAibGJ6ZSIsICAgIERFTyg1OCwwKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBIH0gfSwKK3sgImxmZHAiLCAgICBPUCg1NyksCU9QX01BU0ssCVBPV0VSNiwJCXsgRlJULCBELCBSQTAgfSB9LAorCit7ICJsYnplIiwgICAgREVPKDU4LDApLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkEwIH0gfSwKIHsgImxienVlIiwgICBERU8oNTgsMSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQUwgfSB9LAoteyAibGh6ZSIsICAgIERFTyg1OCwyKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBIH0gfSwKK3sgImxoemUiLCAgICBERU8oNTgsMiksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQTAgfSB9LAogeyAibGh6dWUiLCAgIERFTyg1OCwzKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBTCB9IH0sCi17ICJsaGFlIiwgICAgREVPKDU4LDQpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkEgfSB9LAoreyAibGhhZSIsICAgIERFTyg1OCw0KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBMCB9IH0sCiB7ICJsaGF1ZSIsICAgREVPKDU4LDUpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkFMIH0gfSwKLXsgImx3emUiLCAgICBERU8oNTgsNiksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQSB9IH0sCit7ICJsd3plIiwgICAgREVPKDU4LDYpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkEwIH0gfSwKIHsgImx3enVlIiwgICBERU8oNTgsNyksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQUwgfSB9LAoteyAic3RiZSIsICAgIERFTyg1OCw4KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBIH0gfSwKK3sgInN0YmUiLCAgICBERU8oNTgsOCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFLCBSQTAgfSB9LAogeyAic3RidWUiLCAgIERFTyg1OCw5KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBUyB9IH0sCi17ICJzdGhlIiwgICAgREVPKDU4LDEwKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBIH0gfSwKK3sgInN0aGUiLCAgICBERU8oNTgsMTApLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERSwgUkEwIH0gfSwKIHsgInN0aHVlIiwgICBERU8oNTgsMTEpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERSwgUkFTIH0gfSwKLXsgInN0d2UiLCAgICBERU8oNTgsMTQpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERSwgUkEgfSB9LAoreyAic3R3ZSIsICAgIERFTyg1OCwxNCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFLCBSQTAgfSB9LAogeyAic3R3dWUiLCAgIERFTyg1OCwxNSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFLCBSQVMgfSB9LAogCi17ICJsZCIsICAgICAgRFNPKDU4LDApLAlEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQSB9IH0sCit7ICJsZCIsICAgICAgRFNPKDU4LDApLAlEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQTAgfSB9LAogCiB7ICJsZHUiLCAgICAgRFNPKDU4LDEpLCBEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQUwgfSB9LAogCi17ICJsd2EiLCAgICAgRFNPKDU4LDIpLCBEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQSB9IH0sCit7ICJsd2EiLCAgICAgRFNPKDU4LDIpLCBEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQTAgfSB9LAorCit7ICJkYWRkIiwgICAgWFJDKDU5LDIsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRhZGQuIiwgICBYUkMoNTksMiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJkcXVhIiwgICAgWlJDKDU5LDMsMCksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAoreyAiZHF1YS4iLCAgIFpSQyg1OSwzLDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiwgUk1DIH0gfSwKIAogeyAiZmRpdnMiLCAgIEEoNTksMTgsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKIHsgImZkaXZzLiIsICBBKDU5LDE4LDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCkBAIC00NDEzLDEyICs0NjM3LDE1IEBACiB7ICJmc3FydHMiLCAgQSg1OSwyMiwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKIHsgImZzcXJ0cy4iLCBBKDU5LDIyLDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAogCi17ICJmcmVzIiwgICAgQSg1OSwyNCwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZyZXMuIiwgICBBKDU5LDI0LDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJlcyIsICAgIEEoNTksMjQsMCksIEFGUkFMRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIsIEFfTCB9IH0sCit7ICJmcmVzLiIsICAgQSg1OSwyNCwxKSwgQUZSQUxGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKIAogeyAiZm11bHMiLCAgIEEoNTksMjUsMCksIEFGUkJfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKIHsgImZtdWxzLiIsICBBKDU5LDI1LDEpLCBBRlJCX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQyB9IH0sCiAKK3sgImZyc3FydGVzIiwgQSg1OSwyNiwwKSwgQUZSQUxGUkNfTUFTSyxQT1dFUjUsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAoreyAiZnJzcXJ0ZXMuIixBKDU5LDI2LDEpLCBBRlJBTEZSQ19NQVNLLFBPV0VSNSwJCXsgRlJULCBGUkIsIEFfTCB9IH0sCisKIHsgImZtc3VicyIsICBBKDU5LDI4LDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKIHsgImZtc3Vicy4iLCBBKDU5LDI4LDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKIApAQCAtNDQzMSwzMSArNDY1OCwxMDMgQEAKIHsgImZubWFkZHMiLCBBKDU5LDMxLDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKIHsgImZubWFkZHMuIixBKDU5LDMxLDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKIAoreyAiZG11bCIsICAgIFhSQyg1OSwzNCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZG11bC4iLCAgIFhSQyg1OSwzNCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJkcnJuZCIsICAgWlJDKDU5LDM1LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiwgUk1DIH0gfSwKK3sgImRycm5kLiIsICBaUkMoNTksMzUsMSksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAorCit7ICJkc2NsaSIsICAgWlJDKDU5LDY2LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAoreyAiZHNjbGkuIiwgIFpSQyg1OSw2NiwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKKworeyAiZHF1YWkiLCAgIFpSQyg1OSw2NywwKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFRFLCAgRlJULCBGUkIsIFJNQyB9IH0sCit7ICJkcXVhaS4iLCAgWlJDKDU5LDY3LDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgVEUsICBGUlQsIEZSQiwgUk1DIH0gfSwKKworeyAiZHNjcmkiLCAgIFpSQyg1OSw5OCwwKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKK3sgImRzY3JpLiIsICBaUkMoNTksOTgsMSksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgU0gxNiB9IH0sCisKK3sgImRyaW50eCIsICBaUkMoNTksOTksMCksIFpfTUFTSywJUE9XRVI2LAkJeyBSLCBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRyaW50eC4iLCBaUkMoNTksOTksMSksIFpfTUFTSywJUE9XRVI2LAkJeyBSLCBGUlQsIEZSQiwgUk1DIH0gfSwKKworeyAiZGNtcG8iLCAgIFgoNTksMTMwKSwJICAgWF9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBGUkIgfSB9LAorCit7ICJkdHN0ZXgiLCAgWCg1OSwxNjIpLAkgICBYX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIEZSQiB9IH0sCit7ICJkdHN0ZGMiLCAgWig1OSwxOTQpLAkgICBaX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIERDTSB9IH0sCit7ICJkdHN0ZGciLCAgWig1OSwyMjYpLAkgICBaX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIERHTSB9IH0sCisKK3sgImRyaW50biIsICBaUkMoNTksMjI3LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgUiwgRlJULCBGUkIsIFJNQyB9IH0sCit7ICJkcmludG4uIiwgWlJDKDU5LDIyNywxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAorCit7ICJkY3RkcCIsICAgWFJDKDU5LDI1OCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRjdGRwLiIsICBYUkMoNTksMjU4LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkY3RmaXgiLCAgWFJDKDU5LDI5MCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRjdGZpeC4iLCBYUkMoNTksMjkwLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkZGVkcGQiLCAgWFJDKDU5LDMyMiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFNQLCBGUlQsIEZSQiB9IH0sIAoreyAiZGRlZHBkLiIsIFhSQyg1OSwzMjIsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBTUCwgRlJULCBGUkIgfSB9LCAKKworeyAiZHhleCIsICAgIFhSQyg1OSwzNTQsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkeGV4LiIsICAgWFJDKDU5LDM1NCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZHN1YiIsICAgIFhSQyg1OSw1MTQsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRzdWIuIiwgICBYUkMoNTksNTE0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImRkaXYiLCAgICBYUkMoNTksNTQ2LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkZGl2LiIsICAgWFJDKDU5LDU0NiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJkY21wdSIsICAgWCg1OSw2NDIpLAkgICAgWF9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBGUkIgfSB9LAorCit7ICJkdHN0c2YiLCAgWCg1OSw2NzQpLAkgICBYX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIEZSQiB9IH0sCisKK3sgImRyc3AiLCAgICBYUkMoNTksNzcwLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZHJzcC4iLCAgIFhSQyg1OSw3NzAsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRjZmZpeCIsICBYUkMoNTksODAyLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZGNmZml4LiIsIFhSQyg1OSw4MDIsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRlbmJjZCIsICBYUkMoNTksODM0LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgUywgRlJULCBGUkIgfSB9LAoreyAiZGVuYmNkLiIsIFhSQyg1OSw4MzQsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBTLCBGUlQsIEZSQiB9IH0sCisKK3sgImRpZXgiLCAgICBYUkMoNTksODY2LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkaWV4LiIsICAgWFJDKDU5LDg2NiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCiB7ICJzdGZxIiwgICAgT1AoNjApLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAogCiB7ICJzdGZxdSIsICAgT1AoNjEpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSUywgRCwgUkEgfSB9LAogCi17ICJsZGUiLCAgICAgREVPKDYyLDApLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERVMsIFJBIH0gfSwKLXsgImxkdWUiLCAgICBERU8oNjIsMSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFUywgUkEgfSB9LAoteyAibGZzZSIsICAgIERFTyg2Miw0KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlQsIERFUywgUkEgfSB9LAoreyAic3RmZHAiLCAgIE9QKDYxKSwJT1BfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEQsIFJBMCB9IH0sCisKK3sgImxkZSIsICAgICBERU8oNjIsMCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFUywgUkEwIH0gfSwKK3sgImxkdWUiLCAgICBERU8oNjIsMSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFUywgUkEwIH0gfSwKK3sgImxmc2UiLCAgICBERU8oNjIsNCksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJULCBERVMsIFJBMCB9IH0sCiB7ICJsZnN1ZSIsICAgREVPKDYyLDUpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSVCwgREVTLCBSQVMgfSB9LAoteyAibGZkZSIsICAgIERFTyg2Miw2KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlQsIERFUywgUkEgfSB9LAoreyAibGZkZSIsICAgIERFTyg2Miw2KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlQsIERFUywgUkEwIH0gfSwKIHsgImxmZHVlIiwgICBERU8oNjIsNyksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJULCBERVMsIFJBUyB9IH0sCi17ICJzdGRlIiwgICAgREVPKDYyLDgpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERVMsIFJBIH0gfSwKK3sgInN0ZGUiLCAgICBERU8oNjIsOCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFUywgUkEwIH0gfSwKIHsgInN0ZHVlIiwgICBERU8oNjIsOSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFUywgUkFTIH0gfSwKLXsgInN0ZnNlIiwgICBERU8oNjIsMTIpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSUywgREVTLCBSQSB9IH0sCit7ICJzdGZzZSIsICAgREVPKDYyLDEyKSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlMsIERFUywgUkEwIH0gfSwKIHsgInN0ZnN1ZSIsICBERU8oNjIsMTMpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSUywgREVTLCBSQVMgfSB9LAoteyAic3RmZGUiLCAgIERFTyg2MiwxNCksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJTLCBERVMsIFJBIH0gfSwKK3sgInN0ZmRlIiwgICBERU8oNjIsMTQpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSUywgREVTLCBSQTAgfSB9LAogeyAic3RmZHVlIiwgIERFTyg2MiwxNSksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJTLCBERVMsIFJBUyB9IH0sCiAKLXsgInN0ZCIsICAgICBEU08oNjIsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSUywgRFMsIFJBIH0gfSwKK3sgInN0ZCIsICAgICBEU08oNjIsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSUywgRFMsIFJBMCB9IH0sCiAKIHsgInN0ZHUiLCAgICBEU08oNjIsMSksCURTX01BU0ssCVBQQzY0LAkJeyBSUywgRFMsIFJBUyB9IH0sCiAKLXsgInN0cSIsICAgICBEU08oNjIsMiksCURTX01BU0ssCVBPV0VSNCwJCXsgUlNRLCBEUywgUkEgfSB9LAoreyAic3RxIiwgICAgIERTTyg2MiwyKSwJRFNfTUFTSywJUE9XRVI0LAkJeyBSU1EsIERTLCBSQTAgfSB9LAogCiB7ICJmY21wdSIsICAgWCg2MywwKSwJWF9NQVNLfCgzPDwyMSksCUNPTSwJCXsgQkYsIEZSQSwgRlJCIH0gfSwKIAoreyAiZGFkZHEiLCAgIFhSQyg2MywyLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkYWRkcS4iLCAgWFJDKDYzLDIsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZHF1YXEiLCAgIFpSQyg2MywzLDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiwgUk1DIH0gfSwKK3sgImRxdWFxLiIsICBaUkMoNjMsMywxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIsIFJNQyB9IH0sCisKK3sgImZjcHNnbiIsICBYUkMoNjMsOCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZmNwc2duLiIsIFhSQyg2Myw4LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKIHsgImZyc3AiLCAgICBYUkMoNjMsMTIsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKIHsgImZyc3AuIiwgICBYUkMoNjMsMTIsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKIApAQCAtNDQ5MCwxMyArNDc4OSwxNiBAQAogeyAiZnNlbCIsICAgIEEoNjMsMjMsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAogeyAiZnNlbC4iLCAgIEEoNjMsMjMsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAogCit7ICJmcmUiLCAgICAgQSg2MywyNCwwKSwgQUZSQUxGUkNfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKK3sgImZyZS4iLCAgICBBKDYzLDI0LDEpLCBBRlJBTEZSQ19NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAorCiB7ICJmbXVsIiwgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAogeyAiZm0iLCAgICAgIEEoNjMsMjUsMCksIEFGUkJfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKIHsgImZtdWwuIiwgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCiB7ICJmbS4iLCAgICAgQSg2MywyNSwxKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAogCi17ICJmcnNxcnRlIiwgQSg2MywyNiwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZyc3FydGUuIixBKDYzLDI2LDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJzcXJ0ZSIsIEEoNjMsMjYsMCksIEFGUkFMRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIsIEFfTCB9IH0sCit7ICJmcnNxcnRlLiIsQSg2MywyNiwxKSwgQUZSQUxGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKIAogeyAiZm1zdWIiLCAgIEEoNjMsMjgsMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAogeyAiZm1zIiwgICAgIEEoNjMsMjgsMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LApAQCAtNDUyMCw2ICs0ODIyLDEyIEBACiAKIHsgImZjbXBvIiwgICBYKDYzLDMyKSwJWF9NQVNLfCgzPDwyMSksCUNPTSwJCXsgQkYsIEZSQSwgRlJCIH0gfSwKIAoreyAiZG11bHEiLCAgIFhSQyg2MywzNCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZG11bHEuIiwgIFhSQyg2MywzNCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJkcnJuZHEiLCAgWlJDKDYzLDM1LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiwgUk1DIH0gfSwKK3sgImRycm5kcS4iLCBaUkMoNjMsMzUsMSksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAorCiB7ICJtdGZzYjEiLCAgWFJDKDYzLDM4LDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKIHsgIm10ZnNiMS4iLCBYUkMoNjMsMzgsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAogCkBAIC00NTI4LDM2ICs0ODM2LDEwMCBAQAogCiB7ICJtY3JmcyIsICAgWCg2Myw2NCksCVhSQl9NQVNLfCgzPDwyMSl8KDM8PDE2KSwgQ09NLAl7IEJGLCBCRkEgfSB9LAogCit7ICJkc2NsaXEiLCAgWlJDKDYzLDY2LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAoreyAiZHNjbGlxLiIsIFpSQyg2Myw2NiwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKKworeyAiZHF1YWlxIiwgIFpSQyg2Myw2NywwKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFRFLCAgRlJULCBGUkIsIFJNQyB9IH0sCit7ICJkcXVhaXEuIiwgWlJDKDYzLDY3LDEpLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiwgUk1DIH0gfSwKKwogeyAibXRmc2IwIiwgIFhSQyg2Myw3MCwwKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCiB7ICJtdGZzYjAuIiwgWFJDKDYzLDcwLDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKIAogeyAiZm1yIiwgICAgIFhSQyg2Myw3MiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAogeyAiZm1yLiIsICAgIFhSQyg2Myw3MiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAogCit7ICJkc2NyaXEiLCAgWlJDKDYzLDk4LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAoreyAiZHNjcmlxLiIsIFpSQyg2Myw5OCwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKKworeyAiZHJpbnR4cSIsIFpSQyg2Myw5OSwwKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAoreyAiZHJpbnR4cS4iLFpSQyg2Myw5OSwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAorCit7ICJkY21wb3EiLCAgWCg2MywxMzApLAkgICBYX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIEZSQiB9IH0sCisKIHsgIm10ZnNmaSIsICBYUkMoNjMsMTM0LDApLCBYUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRiwgVSB9IH0sCiB7ICJtdGZzZmkuIiwgWFJDKDYzLDEzNCwxKSwgWFJBX01BU0t8KDM8PDIxKXwoMTw8MTEpLCBDT00sIHsgQkYsIFUgfSB9LAogCiB7ICJmbmFicyIsICAgWFJDKDYzLDEzNiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAogeyAiZm5hYnMuIiwgIFhSQyg2MywxMzYsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKIAoreyAiZHRzdGV4cSIsIFgoNjMsMTYyKSwJICAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKK3sgImR0c3RkY3EiLCBaKDYzLDE5NCksCSAgICBaX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIERDTSB9IH0sCit7ICJkdHN0ZGdxIiwgWig2MywyMjYpLAkgICAgWl9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBER00gfSB9LAorCit7ICJkcmludG5xIiwgWlJDKDYzLDIyNywwKSwgWl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAoreyAiZHJpbnRucS4iLFpSQyg2MywyMjcsMSksIFpfTUFTSywJUE9XRVI2LAkJeyBSLCBGUlQsIEZSQiwgUk1DIH0gfSwKKworeyAiZGN0cXBxIiwgIFhSQyg2MywyNTgsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkY3RxcHEuIiwgWFJDKDYzLDI1OCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKwogeyAiZmFicyIsICAgIFhSQyg2MywyNjQsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKIHsgImZhYnMuIiwgICBYUkMoNjMsMjY0LDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCiAKK3sgImRjdGZpeHEiLCBYUkMoNjMsMjkwLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZGN0Zml4cS4iLFhSQyg2MywyOTAsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRkZWRwZHEiLCBYUkMoNjMsMzIyLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgU1AsIEZSVCwgRlJCIH0gfSwKK3sgImRkZWRwZHEuIixYUkMoNjMsMzIyLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgU1AsIEZSVCwgRlJCIH0gfSwKKworeyAiZHhleHEiLCAgIFhSQyg2MywzNTQsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkeGV4cS4iLCAgWFJDKDYzLDM1NCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZnJpbiIsICAgIFhSQyg2MywzOTIsMCksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZyaW4uIiwgICBYUkMoNjMsMzkyLDEpLCBYUkFfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcml6IiwgICAgWFJDKDYzLDQyNCwwKSwgWFJBX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJpei4iLCAgIFhSQyg2Myw0MjQsMSksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZyaXAiLCAgICBYUkMoNjMsNDU2LDApLCBYUkFfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcmlwLiIsICAgWFJDKDYzLDQ1NiwxKSwgWFJBX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJpbSIsICAgIFhSQyg2Myw0ODgsMCksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZyaW0uIiwgICBYUkMoNjMsNDg4LDEpLCBYUkFfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRzdWJxIiwgICBYUkMoNjMsNTE0LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkc3VicS4iLCAgWFJDKDYzLDUxNCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJkZGl2cSIsICAgWFJDKDYzLDU0NiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZGRpdnEuIiwgIFhSQyg2Myw1NDYsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKwogeyAibWZmcyIsICAgIFhSQyg2Myw1ODMsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgRlJUIH0gfSwKIHsgIm1mZnMuIiwgICBYUkMoNjMsNTgzLDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEZSVCB9IH0sCiAKK3sgImRjbXB1cSIsICBYKDYzLDY0MiksCSAgICBYX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIEZSQiB9IH0sCisKK3sgImR0c3RzZnEiLCBYKDYzLDY3NCksCSAgICBYX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIEZSQiB9IH0sCisKIHsgIm10ZnNmIiwgICBYRkwoNjMsNzExLDApLCBYRkxfTUFTSywJQ09NLAkJeyBGTE0sIEZSQiB9IH0sCiB7ICJtdGZzZi4iLCAgWEZMKDYzLDcxMSwxKSwgWEZMX01BU0ssCUNPTSwJCXsgRkxNLCBGUkIgfSB9LAogCit7ICJkcmRwcSIsICAgWFJDKDYzLDc3MCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRyZHBxLiIsICBYUkMoNjMsNzcwLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkY2ZmaXhxIiwgWFJDKDYzLDgwMiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRjZmZpeHEuIixYUkMoNjMsODAyLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCiB7ICJmY3RpZCIsICAgWFJDKDYzLDgxNCwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCiB7ICJmY3RpZC4iLCAgWFJDKDYzLDgxNCwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCiAKIHsgImZjdGlkeiIsICBYUkMoNjMsODE1LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKIHsgImZjdGlkei4iLCBYUkMoNjMsODE1LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKIAoreyAiZGVuYmNkcSIsIFhSQyg2Myw4MzQsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBTLCBGUlQsIEZSQiB9IH0sCit7ICJkZW5iY2RxLiIsWFJDKDYzLDgzNCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFMsIEZSVCwgRlJCIH0gfSwKKwogeyAiZmNmaWQiLCAgIFhSQyg2Myw4NDYsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAogeyAiZmNmaWQuIiwgIFhSQyg2Myw4NDYsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAogCit7ICJkaWV4cSIsICAgWFJDKDYzLDg2NiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZGlleHEuIiwgIFhSQyg2Myw4NjYsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKwogfTsKIAogY29uc3QgaW50IHBvd2VycGNfbnVtX29wY29kZXMgPQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vcHBjLmggYi9hcmNoL3Bvd2VycGMveG1vbi9wcGMuaAppbmRleCAzNDIyMzdlLi4xMTBkZjk2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi9wcGMuaAorKysgYi9hcmNoL3Bvd2VycGMveG1vbi9wcGMuaApAQCAtMSw1ICsxLDUgQEAKIC8qIHBwYy5oIC0tIEhlYWRlciBmaWxlIGZvciBQb3dlclBDIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMKKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CiAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKIApAQCAtMTcsNyArMTcsNyBAQAogCiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLwogCiAjaWZuZGVmIFBQQ19ICiAjZGVmaW5lIFBQQ19ICkBAIC0xMzQsNiArMTM0LDE4IEBACiAvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IG1hY2hpbmUgY2hlY2sgQVBVLiAgKi8KICNkZWZpbmUgUFBDX09QQ09ERV9SRk1DSQkgIDB4ODAwMDAwCiAKKy8qIE9wY29kZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBQb3dlcjUgYXJjaGl0ZWN0dXJlLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUjUJIDB4MTAwMDAwMAorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IFBvd2VyUEMgZTMwMCBmYW1pbHkuICAqLworI2RlZmluZSBQUENfT1BDT0RFX0UzMDAgICAgICAgICAgMHgyMDAwMDAwCisKKy8qIE9wY29kZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBQb3dlcjYgYXJjaGl0ZWN0dXJlLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUjYJIDB4NDAwMDAwMAorCisvKiBPcGNvZGUgaXMgb25seSBzdXBwb3J0ZWQgYnkgUG93ZXJQQyBDZWxsIGZhbWlseS4gICovCisjZGVmaW5lIFBQQ19PUENPREVfQ0VMTAkJIDB4ODAwMDAwMAorCiAvKiBBIG1hY3JvIHRvIGV4dHJhY3QgdGhlIG1ham9yIG9wY29kZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KICNkZWZpbmUgUFBDX09QKGkpICgoKGkpID4+IDI2KSAmIDB4M2YpCiAMCkBAIC0yMzMsMjUgKzI0NSwyOCBAQAogICAgcmVnaXN0ZXIgbmFtZXMgd2l0aCBhIGxlYWRpbmcgJ3InLiAgKi8KICNkZWZpbmUgUFBDX09QRVJBTkRfR1BSICgwNDApCiAKKy8qIExpa2UgUFBDX09QRVJBTkRfR1BSLCBidXQgZG9uJ3QgcHJpbnQgYSBsZWFkaW5nICdyJyBmb3IgcjAuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9HUFJfMCAoMDEwMCkKKwogLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyCiAgICBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ2YnLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfRlBSICgwMTAwKQorI2RlZmluZSBQUENfT1BFUkFORF9GUFIgKDAyMDApCiAKIC8qIFRoaXMgb3BlcmFuZCBpcyBhIHJlbGF0aXZlIGJyYW5jaCBkaXNwbGFjZW1lbnQuICBUaGUgZGlzYXNzZW1ibGVyCiAgICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfUkVMQVRJVkUgKDAyMDApCisjZGVmaW5lIFBQQ19PUEVSQU5EX1JFTEFUSVZFICgwNDAwKQogCiAvKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIGFkZHJlc3MuICBUaGUgZGlzYXNzZW1ibGVyCiAgICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfQUJTT0xVVEUgKDA0MDApCisjZGVmaW5lIFBQQ19PUEVSQU5EX0FCU09MVVRFICgwMTAwMCkKIAogLyogVGhpcyBvcGVyYW5kIGlzIG9wdGlvbmFsLCBhbmQgaXMgemVybyBpZiBvbWl0dGVkLiAgVGhpcyBpcyB1c2VkIGZvcgotICAgdGhlIG9wdGlvbmFsIEJGIGFuZCBMIGZpZWxkcyBpbiB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuICBUaGUKKyAgIGV4YW1wbGUsIGluIHRoZSBvcHRpb25hbCBCRiBmaWVsZCBpbiB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuICBUaGUKICAgIGFzc2VtYmxlciBtdXN0IGNvdW50IHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVtYWluaW5nIG9uIHRoZSBsaW5lLAogICAgYW5kIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVtYWluaW5nIGZvciB0aGUgb3Bjb2RlLCBhbmQgZGVjaWRlCiAgICB3aGV0aGVyIHRoaXMgb3BlcmFuZCBpcyBwcmVzZW50IG9yIG5vdC4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkCiAgICBwcmludCB0aGlzIG9wZXJhbmQgb3V0IG9ubHkgaWYgaXQgaXMgbm90IHplcm8uICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9PUFRJT05BTCAoMDEwMDApCisjZGVmaW5lIFBQQ19PUEVSQU5EX09QVElPTkFMICgwMjAwMCkKIAogLyogVGhpcyBmbGFnIGlzIG9ubHkgdXNlZCB3aXRoIFBQQ19PUEVSQU5EX09QVElPTkFMLiAgSWYgdGhpcyBvcGVyYW5kCiAgICBpcyBvbWl0dGVkLCB0aGVuIGZvciB0aGUgbmV4dCBvcGVyYW5kIHVzZSB0aGlzIG9wZXJhbmQgdmFsdWUgcGx1cwpAQCAtMjU5LDI0ICsyNzQsMjQgQEAKICAgIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIFBvd2VyIHJvdGF0ZSBpbnN0cnVjdGlvbnMgY2FuIHRha2UKICAgIGVpdGhlciA0IG9yIDUgb3BlcmFuZHMuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBwcmludCB0aGlzIG9wZXJhbmQKICAgIG91dCByZWdhcmRsZXNzIG9mIHRoZSBQUENfT1BFUkFORF9PUFRJT05BTCBmaWVsZC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX05FWFQgKDAyMDAwKQorI2RlZmluZSBQUENfT1BFUkFORF9ORVhUICgwNDAwMCkKIAogLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIG5lZ2F0aXZlIG51bWJlciBmb3IgdGhlCiAgICBwdXJwb3NlcyBvZiBvdmVyZmxvdyBjaGVja2luZyAoaS5lLiwgdGhlIG5vcm1hbCBtb3N0IG5lZ2F0aXZlCiAgICBudW1iZXIgaXMgZGlzYWxsb3dlZCBhbmQgb25lIG1vcmUgdGhhbiB0aGUgbm9ybWFsIG1vc3QgcG9zaXRpdmUKICAgIG51bWJlciBpcyBhbGxvd2VkKS4gIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgc2V0IGZvciBhIHNpZ25lZAogICAgb3BlcmFuZC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX05FR0FUSVZFICgwNDAwMCkKKyNkZWZpbmUgUFBDX09QRVJBTkRfTkVHQVRJVkUgKDAxMDAwMCkKIAogLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgdmVjdG9yIHVuaXQgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyCiAgICBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ3YnLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfVlIgKDAxMDAwMCkKKyNkZWZpbmUgUFBDX09QRVJBTkRfVlIgKDAyMDAwMCkKIAogLyogVGhpcyBvcGVyYW5kIGlzIGZvciB0aGUgRFMgZmllbGQgaW4gYSBEUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfRFMgKDAyMDAwMCkKKyNkZWZpbmUgUFBDX09QRVJBTkRfRFMgKDA0MDAwMCkKIAogLyogVGhpcyBvcGVyYW5kIGlzIGZvciB0aGUgRFEgZmllbGQgaW4gYSBEUSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfRFEgKDA0MDAwMCkKKyNkZWZpbmUgUFBDX09QRVJBTkRfRFEgKDAxMDAwMDApCiAMCiAvKiBUaGUgUE9XRVIgYW5kIFBvd2VyUEMgYXNzZW1ibGVycyB1c2UgYSBmZXcgbWFjcm9zLiAgV2Uga2VlcCB0aGVtCiAgICB3aXRoIHRoZSBvcGVyYW5kcyB0YWJsZSBmb3Igc2ltcGxpY2l0eS4gIFRoZSBtYWNybyB0YWJsZSBpcyBhbgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vc3B1LWRpcy5jIGIvYXJjaC9wb3dlcnBjL3htb24vc3B1LWRpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTI5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMveG1vbi9zcHUtZGlzLmMKQEAgLTAsMCArMSwyNDggQEAKKy8qIERpc2Fzc2VtYmxlIFNQVSBpbnN0cnVjdGlvbnMKKworICAgQ29weXJpZ2h0IDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAibm9uc3RkaW8uaCIKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgInNwdS5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKworLyogVGhpcyBmaWxlIHByb3ZpZGVzIGEgZGlzYXNzZW1ibGVyIGZ1bmN0aW9uIHdoaWNoIHVzZXMKKyAgIHRoZSBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGRlZmluZWQgaW4gZGlzLWFzbS5oLiAgICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc3B1X29wY29kZSBzcHVfb3Bjb2Rlc1tdOworZXh0ZXJuIGNvbnN0IGludCBzcHVfbnVtX29wY29kZXM7CisKKyNkZWZpbmUgU1BVX0RJU0FTTV9UQkxfU0laRSAoMSA8PCAxMSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3B1X29wY29kZSAqc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlW1NQVV9ESVNBU01fVEJMX1NJWkVdOworCitzdGF0aWMgdm9pZAoraW5pdF9zcHVfZGlzYXNzZW1ibGUgKHZvaWQpCit7CisgIGludCBpOworCisgIC8qIElmIHR3byBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUgc2FtZSBvcGNvZGUgdGhlbiB3ZSBwcmVmZXIgdGhlIGZpcnN0CisgICAqIG9uZS4gIEluIG1vc3QgY2FzZXMgaXQgaXMganVzdCBhbiBhbHRlcm5hdGUgbW5lbW9uaWMuICovCisgIGZvciAoaSA9IDA7IGkgPCBzcHVfbnVtX29wY29kZXM7IGkrKykKKyAgICB7CisgICAgICBpbnQgbyA9IHNwdV9vcGNvZGVzW2ldLm9wY29kZTsKKyAgICAgIGlmIChvID49IFNQVV9ESVNBU01fVEJMX1NJWkUpCisJY29udGludWU7IC8qIGFib3J0ICgpOyAqLworICAgICAgaWYgKHNwdV9kaXNhc3NlbWJsZV90YWJsZVtvXSA9PSAwKQorCXNwdV9kaXNhc3NlbWJsZV90YWJsZVtvXSA9ICZzcHVfb3Bjb2Rlc1tpXTsKKyAgICB9Cit9CisKKy8qIERldGVybWluZSB0aGUgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgMTAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3B1X29wY29kZSAqCitnZXRfaW5kZXhfZm9yX29wY29kZSAodW5zaWduZWQgaW50IGluc24pCit7CisgIGNvbnN0IHN0cnVjdCBzcHVfb3Bjb2RlICppbmRleDsKKyAgdW5zaWduZWQgaW50IG9wY29kZSA9IGluc24gPj4gKDMyLTExKTsKKworICAvKiBJbml0IHRoZSB0YWJsZS4gIFRoaXMgYXNzdW1lcyB0aGF0IGVsZW1lbnQgMC9vcGNvZGUgMCAoY3VycmVudGx5CisgICAqIE5PUCkgaXMgYWx3YXlzIHVzZWQgKi8KKyAgaWYgKHNwdV9kaXNhc3NlbWJsZV90YWJsZVswXSA9PSAwKQorICAgIGluaXRfc3B1X2Rpc2Fzc2VtYmxlICgpOworCisgIGlmICgoaW5kZXggPSBzcHVfZGlzYXNzZW1ibGVfdGFibGVbb3Bjb2RlICYgMHg3ODBdKSAhPSAwCisgICAgICAmJiBpbmRleC0+aW5zbl90eXBlID09IFJSUikKKyAgICByZXR1cm4gaW5kZXg7CisKKyAgaWYgKChpbmRleCA9IHNwdV9kaXNhc3NlbWJsZV90YWJsZVtvcGNvZGUgJiAweDdmMF0pICE9IDAKKyAgICAgICYmIChpbmRleC0+aW5zbl90eXBlID09IFJJMTggfHwgaW5kZXgtPmluc25fdHlwZSA9PSBMQlQpKQorICAgIHJldHVybiBpbmRleDsKKworICBpZiAoKGluZGV4ID0gc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlW29wY29kZSAmIDB4N2Y4XSkgIT0gMAorICAgICAgJiYgaW5kZXgtPmluc25fdHlwZSA9PSBSSTEwKQorICAgIHJldHVybiBpbmRleDsKKworICBpZiAoKGluZGV4ID0gc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlW29wY29kZSAmIDB4N2ZjXSkgIT0gMAorICAgICAgJiYgKGluZGV4LT5pbnNuX3R5cGUgPT0gUkkxNikpCisgICAgcmV0dXJuIGluZGV4OworCisgIGlmICgoaW5kZXggPSBzcHVfZGlzYXNzZW1ibGVfdGFibGVbb3Bjb2RlICYgMHg3ZmVdKSAhPSAwCisgICAgICAmJiAoaW5kZXgtPmluc25fdHlwZSA9PSBSSTgpKQorICAgIHJldHVybiBpbmRleDsKKworICBpZiAoKGluZGV4ID0gc3B1X2Rpc2Fzc2VtYmxlX3RhYmxlW29wY29kZSAmIDB4N2ZmXSkgIT0gMCkKKyAgICByZXR1cm4gaW5kZXg7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFByaW50IGEgU3B1IGluc3RydWN0aW9uLiAgKi8KKworaW50CitwcmludF9pbnNuX3NwdSAodW5zaWduZWQgbG9uZyBpbnNuLCB1bnNpZ25lZCBsb25nIG1lbWFkZHIpCit7CisgIGludCB2YWx1ZTsKKyAgaW50IGhleF92YWx1ZTsKKyAgY29uc3Qgc3RydWN0IHNwdV9vcGNvZGUgKmluZGV4OworICBlbnVtIHNwdV9pbnNucyB0YWc7CisKKyAgaW5kZXggPSBnZXRfaW5kZXhfZm9yX29wY29kZSAoaW5zbik7CisKKyAgaWYgKGluZGV4ID09IDApCisgICAgeworICAgICAgcHJpbnRmKCIubG9uZyAweCV4IiwgaW5zbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgcGFyZW4gPSAwOworICAgICAgdGFnID0gKGVudW0gc3B1X2luc25zKShpbmRleCAtIHNwdV9vcGNvZGVzKTsKKyAgICAgIHByaW50ZigiJXMiLCBpbmRleC0+bW5lbW9uaWMpOworICAgICAgaWYgKHRhZyA9PSBNX0JJIHx8IHRhZyA9PSBNX0JJU0wgfHwgdGFnID09IE1fSVJFVCB8fCB0YWcgPT0gTV9CSVNMRUQKKwkgIHx8IHRhZyA9PSBNX0JJSE5aIHx8IHRhZyA9PSBNX0JJSFogfHwgdGFnID09IE1fQklOWiB8fCB0YWcgPT0gTV9CSVoKKyAgICAgICAgICB8fCB0YWcgPT0gTV9TWU5DIHx8IHRhZyA9PSBNX0hCUikKKwl7CisJICBpbnQgZmIgPSAoaW5zbiA+PiAoMzItMTgpKSAmIDB4N2Y7CisJICBpZiAoZmIgJiAweDQwKQorCSAgICBwcmludGYodGFnID09IE1fU1lOQyA/ICJjIiA6ICJwIik7CisJICBpZiAoZmIgJiAweDIwKQorCSAgICBwcmludGYoImQiKTsKKwkgIGlmIChmYiAmIDB4MTApCisJICAgIHByaW50ZigiZSIpOworCX0KKyAgICAgIGlmIChpbmRleC0+YXJnWzBdICE9IDApCisJcHJpbnRmKCJcdCIpOworICAgICAgaGV4X3ZhbHVlID0gMDsKKyAgICAgIGZvciAoaSA9IDE7ICBpIDw9IGluZGV4LT5hcmdbMF07IGkrKykKKwl7CisJICBpbnQgYXJnID0gaW5kZXgtPmFyZ1tpXTsKKwkgIGlmIChhcmcgIT0gQV9QICYmICFwYXJlbiAmJiBpID4gMSkKKwkgICAgcHJpbnRmKCIsIik7CisKKwkgIHN3aXRjaCAoYXJnKQorCSAgICB7CisJICAgIGNhc2UgQV9UOgorCSAgICAgIHByaW50ZigiJCVkIiwKKwkJCQkgICAgIERFQ09ERV9JTlNOX1JUIChpbnNuKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9BOgorCSAgICAgIHByaW50ZigiJCVkIiwKKwkJCQkgICAgIERFQ09ERV9JTlNOX1JBIChpbnNuKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9COgorCSAgICAgIHByaW50ZigiJCVkIiwKKwkJCQkgICAgIERFQ09ERV9JTlNOX1JCIChpbnNuKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9DOgorCSAgICAgIHByaW50ZigiJCVkIiwKKwkJCQkgICAgIERFQ09ERV9JTlNOX1JDIChpbnNuKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TOgorCSAgICAgIHByaW50ZigiJHNwJWQiLAorCQkJCSAgICAgREVDT0RFX0lOU05fUkEgKGluc24pKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX0g6CisJICAgICAgcHJpbnRmKCIkY2glZCIsCisJCQkJICAgICBERUNPREVfSU5TTl9SQSAoaW5zbikpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfUDoKKwkgICAgICBwYXJlbisrOworCSAgICAgIHByaW50ZigiKCIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfVTdBOgorCSAgICAgIHByaW50ZigiJWQiLAorCQkJCSAgICAgMTczIC0gREVDT0RFX0lOU05fVTggKGluc24pKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1U3QjoKKwkgICAgICBwcmludGYoIiVkIiwKKwkJCQkgICAgIDE1NSAtIERFQ09ERV9JTlNOX1U4IChpbnNuKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TMzoKKwkgICAgY2FzZSBBX1M2OgorCSAgICBjYXNlIEFfUzc6CisJICAgIGNhc2UgQV9TN046CisJICAgIGNhc2UgQV9VMzoKKwkgICAgY2FzZSBBX1U1OgorCSAgICBjYXNlIEFfVTY6CisJICAgIGNhc2UgQV9VNzoKKwkgICAgICBoZXhfdmFsdWUgPSBERUNPREVfSU5TTl9JNyAoaW5zbik7CisJICAgICAgcHJpbnRmKCIlZCIsIGhleF92YWx1ZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TMTE6CisJICAgICAgcHJpbnRfYWRkcmVzcyhtZW1hZGRyICsgREVDT0RFX0lOU05fSTlhIChpbnNuKSAqIDQpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfUzExSToKKwkgICAgICBwcmludF9hZGRyZXNzKG1lbWFkZHIgKyBERUNPREVfSU5TTl9JOWIgKGluc24pICogNCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TMTA6CisJICAgIGNhc2UgQV9TMTBCOgorCSAgICAgIGhleF92YWx1ZSA9IERFQ09ERV9JTlNOX0kxMCAoaW5zbik7CisJICAgICAgcHJpbnRmKCIlZCIsIGhleF92YWx1ZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TMTQ6CisJICAgICAgaGV4X3ZhbHVlID0gREVDT0RFX0lOU05fSTEwIChpbnNuKSAqIDE2OworCSAgICAgIHByaW50ZigiJWQiLCBoZXhfdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfUzE2OgorCSAgICAgIGhleF92YWx1ZSA9IERFQ09ERV9JTlNOX0kxNiAoaW5zbik7CisJICAgICAgcHJpbnRmKCIlZCIsIGhleF92YWx1ZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9YMTY6CisJICAgICAgaGV4X3ZhbHVlID0gREVDT0RFX0lOU05fVTE2IChpbnNuKTsKKwkgICAgICBwcmludGYoIiV1IiwgaGV4X3ZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBX1IxODoKKwkgICAgICB2YWx1ZSA9IERFQ09ERV9JTlNOX0kxNiAoaW5zbikgKiA0OworCSAgICAgIGlmICh2YWx1ZSA9PSAwKQorCQlwcmludGYoIiVkIiwgdmFsdWUpOworCSAgICAgIGVsc2UKKwkJeworCQkgIGhleF92YWx1ZSA9IG1lbWFkZHIgKyB2YWx1ZTsKKwkJICBwcmludF9hZGRyZXNzKGhleF92YWx1ZSAmIDB4M2ZmZmYpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9TMTg6CisJICAgICAgdmFsdWUgPSBERUNPREVfSU5TTl9VMTYgKGluc24pICogNDsKKwkgICAgICBpZiAodmFsdWUgPT0gMCkKKwkJcHJpbnRmKCIlZCIsIHZhbHVlKTsKKwkgICAgICBlbHNlCisJCXByaW50X2FkZHJlc3ModmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFfVTE4OgorCSAgICAgIHZhbHVlID0gREVDT0RFX0lOU05fVTE4IChpbnNuKTsKKwkgICAgICBpZiAodmFsdWUgPT0gMCB8fCAxKQorCQl7CisJCSAgaGV4X3ZhbHVlID0gdmFsdWU7CisJCSAgcHJpbnRmKCIldSIsIHZhbHVlKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJcHJpbnRfYWRkcmVzcyh2YWx1ZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQV9VMTQ6CisJICAgICAgaGV4X3ZhbHVlID0gREVDT0RFX0lOU05fVTE0IChpbnNuKTsKKwkgICAgICBwcmludGYoIiV1IiwgaGV4X3ZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgaWYgKGFyZyAhPSBBX1AgJiYgcGFyZW4pCisJICAgIHsKKwkgICAgICBwcmludGYoIikiKTsKKwkgICAgICBwYXJlbi0tOworCSAgICB9CisJfQorICAgICAgaWYgKGhleF92YWx1ZSA+IDE2KQorCXByaW50ZigiXHQjICV4IiwgaGV4X3ZhbHVlKTsKKyAgICB9CisgIHJldHVybiA0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vc3B1LWluc25zLmggYi9hcmNoL3Bvd2VycGMveG1vbi9zcHUtaW5zbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRjNDUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3htb24vc3B1LWluc25zLmgKQEAgLTAsMCArMSw0MTAgQEAKKy8qIFNQVSBFTEYgc3VwcG9ydCBmb3IgQkZELgorCisgICBDb3B5cmlnaHQgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKy8qIFNQVSBPcGNvZGUgVGFibGUKKworLT0tPS09IEZPUk1BVCA9LT0tPS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgKy0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsgIAkJICAgICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCitSUlIgICAgfCBvcCB8ICBSQyAgIHwgIFJCICAgfCAgUkEgICB8ICBSVCAgIHwJCVJJNyAgICB8IG9wICAgICAgICAgfCAgSTcgICB8ICBSQSAgIHwgIFJUICAgfAorICAgICAgICstLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCQkgICAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAgMCAgMyAgICAgICAxICAgICAgIDEgICAgICAgMiAgICAgICAzCQkgICAgICAgIDAgICAgICAgICAgMSAgICAgICAxICAgICAgIDIgICAgICAgMyAKKyAgICAgICAgICAgICAgICAgICAwICAgICAgIDcgICAgICAgNCAgICAgICAxCQkgICAgICAgICAgICAgICAgICAgMCAgICAgICA3ICAgICAgIDQgICAgICAgMSAKKworICAgICAgICstLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCQkgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKK1JJOCAgICB8IG9wICAgICAgICB8ICAgSTggICB8ICBSQSAgIHwgIFJUICAgfAkJUkkxMCAgIHwgb3AgICAgICB8ICAgSTEwICAgIHwgIFJBICAgfCAgUlQgICB8CisgICAgICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsJCSAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICAwICAgICAgICAgOSAgICAgICAgMSAgICAgICAyICAgICAgIDMJCSAgICAgICAgMCAgICAgICA3ICAgICAgICAgIDEgICAgICAgMiAgICAgICAzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgICAgICA0ICAgICAgIDEJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgICAgICAgNCAgICAgICAxIAorCisgICAgICAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsJCSAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworUkkxNiAgIHwgb3AgICAgICAgfCAgICAgICBJMTYgICAgICAgfCAgUlQgICB8CQlSSTE4ICAgfCBvcCAgICAgfCAgICAgICBJMTggICAgICAgICB8ICBSVCAgIHwKKyAgICAgICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKwkJICAgICAgICstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCisgICAgICAgIDAgICAgICAgIDggICAgICAgICAgICAgICAgIDIgICAgICAgMwkJICAgICAgICAwICAgICAgNiAgICAgICAgICAgICAgICAgICAyICAgICAgIDMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgMQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgIDEgCisKKyAgICAgICArLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwkJICAgICAgICstLS0tLS0tKy0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCitSUiAgICAgfCBvcCAgICAgICAgIHwgIFJCICAgfCAgUkEgICB8ICBSVCAgIHwJCUxCVCAgICB8IG9wICAgIHxST3wgICAgICAgSTE2ICAgICAgIHwgIFJPICAgfAorICAgICAgICstLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCQkgICAgICAgKy0tLS0tLS0rLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAgMCAgICAgICAgICAxICAgICAgIDEgICAgICAgMiAgICAgICAzCQkgICAgICAgIDAgICAgIDYgIDggICAgICAgICAgICAgICAgIDIgICAgICAgMyAKKyAgICAgICAgICAgICAgICAgICAwICAgICAgIDcgICAgICAgNCAgICAgICAxCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgMSAKKworCQkJCQkJCSAgICAgICArLS0tLS0tLS0tLS0tKy0tLS0rLS0rLS0tLS0tLSstLS0tLS0tKworCQkJCQkJCUxCVEkgICB8IG9wICAgICAgICAgfCAvLyB8Uk98ICBSQSAgIHwgIFJPICAgfAorCQkJCQkJCSAgICAgICArLS0tLS0tLS0tLS0tKy0tLS0rLS0rLS0tLS0tLSstLS0tLS0tKworCQkJCQkJCSAgICAgICAgMCAgICAgICAgICAxICAgIDEgIDEgICAgICAgMiAgICAgICAzCisJCQkJCQkJICAgICAgICAgICAgICAgICAgIDAgICAgNSAgNyAgICAgICA0ICAgICAgIDEKKworLT0tPS09IE9QQ09ERSA9LT0tPS0KKworT1BDT0RFIGZpZWxkIHNwZWNpZmllcyB0aGUgbW9zdCBzaWduaWZpY2FudCAxMWJpdCBvZiB0aGUgaW5zdHJ1Y3Rpb24uIFNvbWUgZm9ybWF0cyBkb24ndCBoYXZlIDExYml0cyBmb3Igb3Bjb2RlIGZpZWxkLCBhbmQgaW4gdGhpcworY2FzZSwgYml0IGZpZWxkIG90aGVyIHRoYW4gb3AgYXJlIGRlZmluZWQgYXMgMHMuIEZvciBleGFtcGxlLCBvcGNvZGUgb2YgZm1hIGluc3RydWN0aW9uIHdoaWNoIGlzIFJSUiBmb3JtYXQgaXMgZGVmaW5lZCBhcyAweDcwMCwKK3NpbmNlIDB4NzAwIC0+IDExJ2IxMTEwMDAwMDAwMCwgdGhpcyBtZWFucyBvcGNvZGUgaXMgNCdiMTExMCwgYW5kIG90aGVyIDdiaXRzIGFyZSBkZWZpbmVkIGFzIDcnYjAwMDAwMDAuCisKKy09LT0tPSBBU01fRk9STUFUID0tPS09LQorCitSUlIgY2F0ZWdvcnkJCQkJCQlSSTcgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJQVNNX1JSUgkJbW5lbW9uaWMgUkMsIFJBLCBSQiwgUlQJCSAgICAgICAgQVNNX1JJNCAgICAgICAgIG1uZW1vbmljIFJULCBSQSwgSTQKKwkJCQkJCQkgICAgICAgIEFTTV9SSTcgICAgICAgICBtbmVtb25pYyBSVCwgUkEsIEk3CisKK1JJOCBjYXRlZ29yeQkJCQkJCVJJMTAgY2F0ZWdvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJQVNNX1JVSTgJbW5lbW9uaWMgUlQsIFJBLCBVSTgJCSAgICAgICAgQVNNX0FJMTAgICAgICAgIG1uZW1vbmljIFJBLCBJMTAgICAgCisJCQkJCQkJICAgICAgICBBU01fUkkxMCAgICAgICAgbW5lbW9uaWMgUlQsIFJBLCBSMTAKKwkJCQkJCQkgICAgICAgIEFTTV9SSTEwSURYICAgICBtbmVtb25pYyBSVCwgSTEwKFJBKQorCitSSTE2IGNhdGVnb3J5CQkJCQkJUkkxOCBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCUFTTV9JMTZXCW1uZW1vbmljIEkxNlcJCQkgICAgICAgIEFTTV9SSTE4ICAgICAgICBtbmVtb25pYyBSVCwgSTE4CisJQVNNX1JJMTYJbW5lbW9uaWMgUlQsIEkxNgorCUFTTV9SSTE2VwltbmVtb25pYyBSVCwgSTE2VworCitSUiBjYXRlZ29yeQkJCQkJCUxCVCBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCUFTTV9NRlNQUgltbmVtb25pYyBSVCwgU0EJCQkgICAgICAgIEFTTV9MQlQgICAgICAgICBtbmVtb25pYyBicmluc3QsIGJydGFyZyAKKwlBU01fTVRTUFIJbW5lbW9uaWMgU0EsIFJUCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJQVNNX05PT1AJbW5lbW9uaWMJCQlMQlRJIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlBU01fUkEJCW1uZW1vbmljIFJBCQkJICAgICAgICBBU01fTEJUSSAgICAgICAgbW5lbW9uaWMgYnJpbnN0LCBSQSAgICAgCisJQVNNX1JBQgkJbW5lbW9uaWMgUkEsIFJCCisJQVNNX1JEQ0gJbW5lbW9uaWMgUlQsIENBCisJQVNNX1JSCQltbmVtb25pYyBSVCwgUkEsIFJCCisJQVNNX1JUCQltbmVtb25pYyBSVAorCUFTTV9SVEEJCW1uZW1vbmljIFJULCBSQQorCUFTTV9XUkNICW1uZW1vbmljIENBLCBSVAorCitOb3RlIHRoYXQgUlJSIGluc3RydWN0aW9ucyBoYXZlIHRoZSBuYW1lcyBmb3IgUkMgYW5kIFJUIHJldmVyc2VkIGZyb20KK3doYXQncyBpbiB0aGUgSVNBLCBpbiBvcmRlciB0byBwdXQgUlQgaW4gdGhlIHNhbWUgcG9zaXRpb24gaXQgYXBwZWFycworZm9yIG90aGVyIGZvcm1hdHMuCisKKy09LT0tPSBERVBFTkRFTkNZID0tPS09LQorCitERVBFTkRFTkNZIGZpbGVkIGNvbnNpc3RzIG9mIDUgZGlnaXRzLiBUaGlzIHJlcHJlc2VudHMgd2hpY2ggcmVnaXN0ZXIgaXMgdXNlZCBhcyBzb3VyY2UgYW5kIHdoaWNoIHJlZ2lzdGVyIGlzIHVzZWQgYXMgdGFyZ2V0LgorVGhlIGZpcnN0KG1vc3Qgc2lnbmlmaWNhbnQpIGRpZ2l0IGlzIGFsd2F5cyAwLiBUaGVuIGl0IGlzIGZvbGxvd2QgYnkgUkMsIFJCLCBSQSBhbmQgUlQgZGlnaXRzLgorSWYgdGhlIGRpZ2l0IGlzIDAsIHRoaXMgbWVhbnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgaXMgbm90IHVzZWQgaW4gdGhlIGluc3RydWN0aW9uLgorSWYgdGhlIGRpZ2l0IGlzIDEsIHRoaXMgbWVhbnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgaXMgdXNlZCBhcyBhIHNvdXJjZSBpbiB0aGUgaW5zdHJ1Y3Rpb24uCitJZiB0aGUgZGlnaXQgaXMgMiwgdGhpcyBtZWFucyB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBpcyB1c2VkIGFzIGEgdGFyZ2V0IGluIHRoZSBpbnN0cnVjdGlvbi4KK0lmIHRoZSBkaWdpdCBpcyAzLCB0aGlzIG1lYW5zIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIHRhcmdldCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCitGb3IgZXhhbXBsZSwgZm1zIGluc3RydWN0aW9uIGhhcyAwMDExMyBhcyB0aGUgREVQRU5ERU5DWSBmaWVsZC4gVGhpcyBtZWFucyBSQyBpcyBub3QgdXNlZCBpbiB0aGlzIG9wZXJhdGlvbiwgUkIgYW5kIFJBIGFyZQordXNlZCBhcyBzb3VyY2VzIGFuZCBSVCBpcyB0aGUgdGFyZ2V0LgorCistPS09LT0gUElQRSA9LT0tPS0KKworVGhpcyBmaWVsZCBzaG93cyB3aGljaCBleGVjdXRpb24gcGlwZSBpcyB1c2VkIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKworcGlwZTAgZXhlY3V0aW9uIHBpcGVsaW5lczoKKwlGUDYJU1AgZmxvYXRpbmcgcGlwZWxpbmUKKwlGUDcJaW50ZWdlciBvcGVyYXRpb25zIGV4ZWN1dGVkIGluIFNQIGZsb2F0aW5nIHBpcGVsaW5lCisJRlBECURQIGZsb2F0aW5nIHBpcGVsaW5lCisJRlgyCUZYVSBwaXBlbGluZQorCUZYMwlSb3RhdGUvU2hpZnQgcGlwZWxpbmUKKwlGWEIJQnl0ZSBwaXBlbGluZQorCU5PUAlObyBwaXBlbGluZQorCitwaXBlMSBleGVjdXRpb24gcGlwZWxpbmVzOgorCUJSCUJyYW5jaCBwaXBlbGluZQorCUxOT1AJTm8gcGlwZWxpbmUKKwlMUwlMb2FkL1N0b3JlIHBpcGVsaW5lCisJU0hVRglTaHVmZmxlIHBpcGVsaW5lCisJU1BSCVNQUi9DSCBwaXBlbGluZQorCisqLworCisjZGVmaW5lIF9BMCgpIHswfQorI2RlZmluZSBfQTEoYSkgezEsYX0KKyNkZWZpbmUgX0EyKGEsYikgezIsYSxifQorI2RlZmluZSBfQTMoYSxiLGMpIHszLGEsYixjfQorI2RlZmluZSBfQTQoYSxiLGMsZCkgezQsYSxiLGMsZH0KKworLyogICAgVEFHCQlGT1JNQVQJT1BDT0RFCU1ORU1PTklDCUFTTV9GT1JNQVQJREVQRU5ERU5DWQlQSVBFCUNPTU1FTlQJCQkJKi8KKy8qCQkJCQkJCQkJMFtSQ11bUkJdW1JBXVtSVF0JCQkJCSovCisvKgkJCQkJCQkJCTE6c3JjLCAyOnRhcmdldAkJCQkJCSovCisKK0FQVU9QKE1fQlIsCQlSSTE2LAkweDE5MCwJImJyIiwJCV9BMShBX1IxOCksCTAwMDAwLAlCUikJLyogQlJlbCAgICAgICAgICBJUDwtSVArSTE2ICovCitBUFVPUChNX0JSU0wsCQlSSTE2LAkweDE5OCwJImJyc2wiLAkJX0EyKEFfVCxBX1IxOCksCTAwMDAyLAlCUikJLyogQlJlbFNldExpbmsgICBSVCxJUDwtSVAsSVArSTE2ICovCitBUFVPUChNX0JSQSwJCVJJMTYsCTB4MTgwLAkiYnJhIiwJCV9BMShBX1MxOCksCTAwMDAwLAlCUikJLyogQlJBYnMgICAgICAgICBJUDwtSTE2ICovCitBUFVPUChNX0JSQVNMLAkJUkkxNiwJMHgxODgsCSJicmFzbCIsCV9BMihBX1QsQV9TMTgpLAkwMDAwMiwJQlIpCS8qIEJSQWJzU2V0TGluayAgUlQsSVA8LUlQLEkxNiAqLworQVBVT1AoTV9GU01CSSwJCVJJMTYsCTB4MTk0LAkiZnNtYmkiLAlfQTIoQV9ULEFfWDE2KSwJMDAwMDIsCVNIVUYpCS8qIEZvcm1TZWxNYXNrJUkgUlQ8LWZzbShJMTYpICovCitBUFVPUChNX0xRQSwJCVJJMTYsCTB4MTg0LAkibHFhIiwJCV9BMihBX1QsQV9TMTgpLAkwMDAwMiwJTFMpCS8qIExvYWRRQWJzICAgICAgUlQ8LU1bSTE2XSAqLworQVBVT1AoTV9MUVIsCQlSSTE2LAkweDE5QywJImxxciIsCQlfQTIoQV9ULEFfUjE4KSwJMDAwMDIsCUxTKQkvKiBMb2FkUVJlbCAgICAgIFJUPC1NW0lQK0kxNl0gKi8KK0FQVU9QKE1fU1RPUCwJCVJSLAkweDAwMCwJInN0b3AiLAkJX0EwKCksCQkwMDAwMCwJQlIpCS8qIFNUT1AgICAgICAgICAgc3RvcCAqLworQVBVT1AoTV9TVE9QMiwJCVJSLAkweDAwMCwJInN0b3AiLAkJX0ExKEFfVTE0KSwJMDAwMDAsCUJSKQkvKiBTVE9QICAgICAgICAgIHN0b3AgKi8KK0FQVU9QKE1fU1RPUEQsCQlSUiwJMHgxNDAsCSJzdG9wZCIsCV9BMyhBX1QsQV9BLEFfQiksICAgICAgICAgMDAxMTEsCUJSKQkvKiBTVE9QRCAgICAgICAgIHN0b3AgKHdpdGggcmVnaXN0ZXIgZGVwZW5kZW5jaWVzKSAqLworQVBVT1AoTV9MTk9QLAkJUlIsCTB4MDAxLAkibG5vcCIsCQlfQTAoKSwJCTAwMDAwLAlMTk9QKQkvKiBMTk9QICAgICAgICAgIG5vX29wZXJhdGlvbiAqLworQVBVT1AoTV9TWU5DLAkJUlIsCTB4MDAyLAkic3luYyIsCQlfQTAoKSwJCTAwMDAwLAlCUikJLyogU1lOQyAgICAgICAgICBmbHVzaF9waXBlICovCitBUFVPUChNX0RTWU5DLAkJUlIsCTB4MDAzLAkiZHN5bmMiLAlfQTAoKSwJCTAwMDAwLAlCUikJLyogRFNZTkMgICAgICAgICBmbHVzaF9zdG9yZV9xdWV1ZSAqLworQVBVT1AoTV9NRlNQUiwJCVJSLAkweDAwYywJIm1mc3ByIiwJX0EyKEFfVCxBX1MpLAkwMDAwMiwJU1BSKQkvKiBNRlNQUiAgICAgICAgIFJUPC1TQSAqLworQVBVT1AoTV9SRENILAkJUlIsCTB4MDBkLAkicmRjaCIsCQlfQTIoQV9ULEFfSCksCTAwMDAyLAlTUFIpCS8qIFJlYURDSGFubmVsICAgUlQ8LUNBOmRhdGEgKi8KK0FQVU9QKE1fUkNIQ05ULAkJUlIsCTB4MDBmLAkicmNoY250IiwJX0EyKEFfVCxBX0gpLAkwMDAwMiwJU1BSKQkvKiBSZWFEQ0hhbkNvdU5UIFJUPC1DQTpjb3VudCAqLworQVBVT1AoTV9IQlJBLAkJTEJULAkweDA4MCwJImhicmEiLAkJX0EyKEFfUzExLEFfUzE4KSwJMDAwMDAsCUxTKQkvKiBIQlJBICAgICAgICAgIEJUQltCOV08LU1bSTE2XSAqLworQVBVT1AoTV9IQlJSLAkJTEJULAkweDA5MCwJImhicnIiLAkJX0EyKEFfUzExLEFfUjE4KSwJMDAwMDAsCUxTKQkvKiBIQlJSICAgICAgICAgIEJUQltCOV08LU1bSVArSTE2XSAqLworQVBVT1AoTV9CUlosCQlSSTE2LAkweDEwMCwJImJyeiIsCQlfQTIoQV9ULEFfUjE4KSwJMDAwMDEsCUJSKQkvKiBCUlogICAgICAgICAgIElQPC1JUCtJMTZfaWYoUlQpICovCitBUFVPUChNX0JSTlosCQlSSTE2LAkweDEwOCwJImJybnoiLAkJX0EyKEFfVCxBX1IxOCksCTAwMDAxLAlCUikJLyogQlJOWiAgICAgICAgICBJUDwtSVArSTE2X2lmKFJUKSAqLworQVBVT1AoTV9CUkhaLAkJUkkxNiwJMHgxMTAsCSJicmh6IiwJCV9BMihBX1QsQV9SMTgpLAkwMDAwMSwJQlIpCS8qIEJSSFogICAgICAgICAgSVA8LUlQK0kxNl9pZihSVCkgKi8KK0FQVU9QKE1fQlJITlosCQlSSTE2LAkweDExOCwJImJyaG56IiwJX0EyKEFfVCxBX1IxOCksCTAwMDAxLAlCUikJLyogQlJITlogICAgICAgICBJUDwtSVArSTE2X2lmKFJUKSAqLworQVBVT1AoTV9TVFFBLAkJUkkxNiwJMHgxMDQsCSJzdHFhIiwJCV9BMihBX1QsQV9TMTgpLAkwMDAwMSwJTFMpCS8qIFNUb3JlUUFicyAgICAgTVtJMTZdPC1SVCAqLworQVBVT1AoTV9TVFFSLAkJUkkxNiwJMHgxMUMsCSJzdHFyIiwJCV9BMihBX1QsQV9SMTgpLAkwMDAwMSwJTFMpCS8qIFNUb3JlUVJlbCAgICAgTVtJUCtJMTZdPC1SVCAqLworQVBVT1AoTV9NVFNQUiwJCVJSLAkweDEwYywJIm10c3ByIiwJX0EyKEFfUyxBX1QpLAkwMDAwMSwJU1BSKQkvKiBNVFNQUiAgICAgICAgIFNBPC1SVCAqLworQVBVT1AoTV9XUkNILAkJUlIsCTB4MTBkLAkid3JjaCIsCQlfQTIoQV9ILEFfVCksCTAwMDAxLAlTUFIpCS8qIENoYW5XUml0ZSAgICAgQ0E8LVJUICovCitBUFVPUChNX0xRRCwJCVJJMTAsCTB4MWEwLAkibHFkIiwJCV9BNChBX1QsQV9TMTQsQV9QLEFfQSksCTAwMDEyLAlMUykJLyogTG9hZFFEaXNwICAgICBSVDwtTVtSYStJMTBdICovCitBUFVPUChNX0JJLAkJUlIsCTB4MWE4LAkiYmkiLAkJX0ExKEFfQSksCQkwMDAxMCwJQlIpCS8qIEJJICAgICAgICAgICAgSVA8LVJBICovCitBUFVPUChNX0JJU0wsCQlSUiwJMHgxYTksCSJiaXNsIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCUJSKQkvKiBCSVNMICAgICAgICAgIFJULElQPC1JUCxSQSAqLworQVBVT1AoTV9JUkVULCAgCQlSUiwJMHgxYWEsCSJpcmV0IiwJICAgICAgICBfQTEoQV9BKSwgCTAwMDEwLAlCUikJLyogSVJFVCAgICAgICAgICBJUDwtU1JSMCAqLworQVBVT1AoTV9JUkVUMiwgCQlSUiwJMHgxYWEsCSJpcmV0IiwJICAgICAgICBfQTAoKSwJIAkwMDAxMCwJQlIpCS8qIElSRVQgICAgICAgICAgSVA8LVNSUjAgKi8KK0FQVU9QKE1fQklTTEVELAkJUlIsCTB4MWFiLAkiYmlzbGVkIiwJX0EyKEFfVCxBX0EpLAkwMDAxMiwJQlIpCS8qIEJJU0xFRCAgICAgICAgUlQsSVA8LUlQLFJBX2lmKGV4dCkgKi8KK0FQVU9QKE1fSEJSLAkJTEJUSSwJMHgxYWMsCSJoYnIiLAkJX0EyKEFfUzExSSxBX0EpLAkwMDAxMCwJTFMpCS8qIEhCUiAgICAgICAgICAgQlRCW0I5XTwtTVtSYV0gKi8KK0FQVU9QKE1fRlJFU1QsCQlSUiwJMHgxYjgsCSJmcmVzdCIsCV9BMihBX1QsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIEZSRVNUICAgICAgICAgUlQ8LXJlY2lwKFJBKSAqLworQVBVT1AoTV9GUlNRRVNULAlSUiwJMHgxYjksCSJmcnNxZXN0IiwJX0EyKEFfVCxBX0EpLAkwMDAxMiwJU0hVRikJLyogRlJTUUVTVCAgICAgICBSVDwtcnNxcnQoUkEpICovCitBUFVPUChNX0ZTTSwJCVJSLAkweDFiNCwJImZzbSIsCQlfQTIoQV9ULEFfQSksCTAwMDEyLAlTSFVGKQkvKiBGb3JtU2VsTWFzayUgIFJUPC1leHBhbmQoUmEpICovCitBUFVPUChNX0ZTTUgsCQlSUiwJMHgxYjUsCSJmc21oIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIEZvcm1TZWxNYXNrJSAgUlQ8LWV4cGFuZChSYSkgKi8KK0FQVU9QKE1fRlNNQiwJCVJSLAkweDFiNiwJImZzbWIiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJU0hVRikJLyogRm9ybVNlbE1hc2slICBSVDwtZXhwYW5kKFJhKSAqLworQVBVT1AoTV9HQiwJCVJSLAkweDFiMCwJImdiIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIEdhdGhlckJpdHMlICAgUlQ8LWdhdGhlcihSQSkgKi8KK0FQVU9QKE1fR0JILAkJUlIsCTB4MWIxLAkiZ2JoIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIEdhdGhlckJpdHMlICAgUlQ8LWdhdGhlcihSQSkgKi8KK0FQVU9QKE1fR0JCLAkJUlIsCTB4MWIyLAkiZ2JiIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIEdhdGhlckJpdHMlICAgUlQ8LWdhdGhlcihSQSkgKi8KK0FQVU9QKE1fQ0JELAkJUkk3LAkweDFmNCwJImNiZCIsCQlfQTQoQV9ULEFfVTcsQV9QLEFfQSksCTAwMDEyLAlTSFVGKQkvKiBnZW5DdGwlJWluc0QgIFJUPC1zdGEoUmErSTQsc2l6KSAqLworQVBVT1AoTV9DSEQsCQlSSTcsCTB4MWY1LAkiY2hkIiwJCV9BNChBX1QsQV9VNyxBX1AsQV9BKSwJMDAwMTIsCVNIVUYpCS8qIGdlbkN0bCUlaW5zRCAgUlQ8LXN0YShSYStJNCxzaXopICovCitBUFVPUChNX0NXRCwJCVJJNywJMHgxZjYsCSJjd2QiLAkJX0E0KEFfVCxBX1U3LEFfUCxBX0EpLAkwMDAxMiwJU0hVRikJLyogZ2VuQ3RsJSVpbnNEICBSVDwtc3RhKFJhK0k0LHNpeikgKi8KK0FQVU9QKE1fQ0RELAkJUkk3LAkweDFmNywJImNkZCIsCQlfQTQoQV9ULEFfVTcsQV9QLEFfQSksCTAwMDEyLAlTSFVGKQkvKiBnZW5DdGwlJWluc0QgIFJUPC1zdGEoUmErSTQsc2l6KSAqLworQVBVT1AoTV9ST1RRQklJLAlSSTcsCTB4MWY4LAkicm90cWJpaSIsCV9BMyhBX1QsQV9BLEFfVTMpLAkwMDAxMiwJU0hVRikJLyogUk9UUUJJSSAgICAgICBSVDwtUkE8PDxJNyAqLworQVBVT1AoTV9ST1RRQllJLAlSSTcsCTB4MWZjLAkicm90cWJ5aSIsCV9BMyhBX1QsQV9BLEFfUzdOKSwJMDAwMTIsCVNIVUYpCS8qIFJPVFFCWUkgICAgICAgUlQ8LVJBPDw8KEk3KjgpICovCitBUFVPUChNX1JPVFFNQklJLAlSSTcsCTB4MWY5LAkicm90cW1iaWkiLAlfQTMoQV9ULEFfQSxBX1MzKSwJMDAwMTIsCVNIVUYpCS8qIFJPVFFNQklJICAgICAgUlQ8LVJBPDxJNyAqLworQVBVT1AoTV9ST1RRTUJZSSwJUkk3LAkweDFmZCwJInJvdHFtYnlpIiwJX0EzKEFfVCxBX0EsQV9TNiksCTAwMDEyLAlTSFVGKQkvKiBST1RRTUJZSSAgICAgIFJUPC1SQTw8STcgKi8KK0FQVU9QKE1fU0hMUUJJSSwJUkk3LAkweDFmYiwJInNobHFiaWkiLAlfQTMoQV9ULEFfQSxBX1UzKSwJMDAwMTIsCVNIVUYpCS8qIFNITFFCSUkgICAgICAgUlQ8LVJBPDxJNyAqLworQVBVT1AoTV9TSExRQllJLAlSSTcsCTB4MWZmLAkic2hscWJ5aSIsCV9BMyhBX1QsQV9BLEFfVTUpLAkwMDAxMiwJU0hVRikJLyogU0hMUUJZSSAgICAgICBSVDwtUkE8PEk3ICovCitBUFVPUChNX1NUUUQsCQlSSTEwLAkweDEyMCwJInN0cWQiLAkJX0E0KEFfVCxBX1MxNCxBX1AsQV9BKSwJMDAwMTEsCUxTKQkvKiBTVG9yZVFEaXNwICAgIE1bUmErSTEwXTwtUlQgKi8KK0FQVU9QKE1fQklITlosCQlSUiwJMHgxMmIsCSJiaWhueiIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhOWiAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QKE1fQklIWiwJCVJSLAkweDEyYSwJImJpaHoiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJSFogICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1AoTV9CSU5aLAkJUlIsCTB4MTI5LAkiYmlueiIsCQlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklOWiAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUChNX0JJWiwJCVJSLAkweDEyOCwJImJpeiIsCQlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklaICAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUChNX0NCWCwJCVJSLAkweDFkNCwJImNieCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCVNIVUYpCS8qIGdlbkN0bCUlaW5zWCAgUlQ8LXN0YShSYStSYixzaXopICovCitBUFVPUChNX0NIWCwJCVJSLAkweDFkNSwJImNoeCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCVNIVUYpCS8qIGdlbkN0bCUlaW5zWCAgUlQ8LXN0YShSYStSYixzaXopICovCitBUFVPUChNX0NXWCwJCVJSLAkweDFkNiwJImN3eCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCVNIVUYpCS8qIGdlbkN0bCUlaW5zWCAgUlQ8LXN0YShSYStSYixzaXopICovCitBUFVPUChNX0NEWCwJCVJSLAkweDFkNywJImNkeCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCVNIVUYpCS8qIGdlbkN0bCUlaW5zWCAgUlQ8LXN0YShSYStSYixzaXopICovCitBUFVPUChNX0xRWCwJCVJSLAkweDFjNCwJImxxeCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUxTKQkvKiBMb2FkUWluZGVYICAgIFJUPC1NW1JhK1JiXSAqLworQVBVT1AoTV9ST1RRQkksCQlSUiwJMHgxZDgsCSJyb3RxYmkiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCVNIVUYpCS8qIFJPVFFCSSAgICAgICAgUlQ8LVJBPDw8UmIgKi8KK0FQVU9QKE1fUk9UUU1CSSwJUlIsCTB4MWQ5LAkicm90cW1iaSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJU0hVRikJLyogUk9UUU1CSSAgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1NITFFCSSwJCVJSLAkweDFkYiwJInNobHFiaSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJU0hVRikJLyogU0hMUUJJICAgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1JPVFFCWSwJCVJSLAkweDFkYywJInJvdHFieSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJCVNIVUYpCS8qIFJPVFFCWSAgICAgICAgUlQ8LVJBPDw8KFJiKjgpICovCitBUFVPUChNX1JPVFFNQlksCVJSLAkweDFkZCwJInJvdHFtYnkiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCQlTSFVGKQkvKiBST1RRTUJZICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fU0hMUUJZLAkJUlIsCTB4MWRmLAkic2hscWJ5IiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlTSFVGKQkvKiBTSExRQlkgICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fUk9UUUJZQkksCVJSLAkweDFjYywJInJvdHFieWJpIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAkJU0hVRikJLyogUk9UUUJZQkkgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1JPVFFNQllCSSwJUlIsCTB4MWNkLAkicm90cW1ieWJpIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAkJU0hVRikJLyogUk9UUU1CWUJJICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1NITFFCWUJJLAlSUiwJMHgxY2YsCSJzaGxxYnliaSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJU0hVRikJLyogU0hMUUJZQkkgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1NUUVgsCQlSUiwJMHgxNDQsCSJzdHF4IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMSwJTFMpCS8qIFNUb3JlUWluZGVYICAgTVtSYStSYl08LVJUICovCitBUFVPUChNX1NIVUZCLAkJUlJSLAkweDU4MCwJInNodWZiIiwJX0E0KEFfQyxBX0EsQV9CLEFfVCksCTAyMTExLAlTSFVGKQkvKiBTSFVGZmxlQnl0ZXMgIFJDPC1mKFJBLFJCLFJUKSAqLworQVBVT1AoTV9JTCwJCVJJMTYsCTB4MjA0LAkiaWwiLAkJX0EyKEFfVCxBX1MxNiksCTAwMDAyLAlGWDIpCS8qIEltbUxvYWQgICAgICAgUlQ8LXN4dChJMTYpICovCitBUFVPUChNX0lMSCwJCVJJMTYsCTB4MjBjLAkiaWxoIiwJCV9BMihBX1QsQV9YMTYpLAkwMDAwMiwJRlgyKQkvKiBJbW1Mb2FkSCAgICAgIFJUPC1JMTYgKi8KK0FQVU9QKE1fSUxIVSwJCVJJMTYsCTB4MjA4LAkiaWxodSIsCQlfQTIoQV9ULEFfWDE2KSwJMDAwMDIsCUZYMikJLyogSW1tTG9hZEhVcHBlciBSVDwtSTE2PDwxNiAqLworQVBVT1AoTV9JTEEsCQlSSTE4LAkweDIxMCwJImlsYSIsCQlfQTIoQV9ULEFfVTE4KSwJMDAwMDIsCUZYMikJLyogSW1tTG9hZEFkZHIgICBSVDwtenh0KEkxOCkgKi8KK0FQVU9QKE1fTk9QLAkJUlIsCTB4MjAxLAkibm9wIiwJCV9BMShBX1QpLAkJMDAwMDAsCU5PUCkJLyogWE5PUCAgICAgICAgICBub19vcGVyYXRpb24gKi8KK0FQVU9QKE1fTk9QMiwJCVJSLAkweDIwMSwJIm5vcCIsCQlfQTAoKSwJCTAwMDAwLAlOT1ApCS8qIFhOT1AgICAgICAgICAgbm9fb3BlcmF0aW9uICovCitBUFVPUChNX0lPSEwsCQlSSTE2LAkweDMwNCwJImlvaGwiLAkJX0EyKEFfVCxBX1gxNiksCTAwMDAzLAlGWDIpCS8qIEFkZEltbWVYdCAgICAgUlQ8LVJUK3N4dChJMTYpICovCitBUFVPUChNX0FOREJJLAkJUkkxMCwJMHgwYjAsCSJhbmRiaSIsCV9BMyhBX1QsQV9BLEFfUzEwQiksCTAwMDEyLAlGWDIpCS8qIEFORCVJICAgICAgICAgUlQ8LVJBJkkxMCAqLworQVBVT1AoTV9BTkRISSwJCVJJMTAsCTB4MGE4LAkiYW5kaGkiLAlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIEFORCVJICAgICAgICAgUlQ8LVJBJkkxMCAqLworQVBVT1AoTV9BTkRJLAkJUkkxMCwJMHgwYTAsCSJhbmRpIiwJCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTIsCUZYMikJLyogQU5EJUkgICAgICAgICBSVDwtUkEmSTEwICovCitBUFVPUChNX09SQkksCQlSSTEwLAkweDAzMCwJIm9yYmkiLAkJX0EzKEFfVCxBX0EsQV9TMTBCKSwJMDAwMTIsCUZYMikJLyogT1IlSSAgICAgICAgICBSVDwtUkF8STEwICovCitBUFVPUChNX09SSEksCQlSSTEwLAkweDAyOCwJIm9yaGkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBPUiVJICAgICAgICAgIFJUPC1SQXxJMTAgKi8KK0FQVU9QKE1fT1JJLAkJUkkxMCwJMHgwMjAsCSJvcmkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBPUiVJICAgICAgICAgIFJUPC1SQXxJMTAgKi8KK0FQVU9QKE1fT1JYLAkJUlIsCTB4MWYwLAkib3J4IiwJCV9BMihBX1QsQV9BKSwJCTAwMDEyLAlCUikJLyogT1JYICAgICAgICAgICBSVDwtUkEudzB8UkEudzF8UkEudzJ8UkEudzMgKi8KK0FQVU9QKE1fWE9SQkksCQlSSTEwLAkweDIzMCwJInhvcmJpIiwJX0EzKEFfVCxBX0EsQV9TMTBCKSwJMDAwMTIsCUZYMikJLyogWE9SJUkgICAgICAgICBSVDwtUkFeSTEwICovCitBUFVPUChNX1hPUkhJLAkJUkkxMCwJMHgyMjgsCSJ4b3JoaSIsCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTIsCUZYMikJLyogWE9SJUkgICAgICAgICBSVDwtUkFeSTEwICovCitBUFVPUChNX1hPUkksCQlSSTEwLAkweDIyMCwJInhvcmkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBYT1IlSSAgICAgICAgIFJUPC1SQV5JMTAgKi8KK0FQVU9QKE1fQUhJLAkJUkkxMCwJMHgwZTgsCSJhaGkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBBZGQlSW1tZWQgICAgIFJUPC1SQStJMTAgKi8KK0FQVU9QKE1fQUksCQlSSTEwLAkweDBlMCwJImFpIiwJCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTIsCUZYMikJLyogQWRkJUltbWVkICAgICBSVDwtUkErSTEwICovCitBUFVPUChNX1NGSEksCQlSSTEwLAkweDA2OCwJInNmaGkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBTdWJGcm9tJUltbSAgIFJUPC1JMTAtUkEgKi8KK0FQVU9QKE1fU0ZJLAkJUkkxMCwJMHgwNjAsCSJzZmkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBTdWJGcm9tJUltbSAgIFJUPC1JMTAtUkEgKi8KK0FQVU9QKE1fQ0dUQkksCQlSSTEwLAkweDI3MCwJImNndGJpIiwJX0EzKEFfVCxBX0EsQV9TMTBCKSwJMDAwMTIsCUZYMikJLyogQ0dUJUkgICAgICAgICBSVDwtKFJBPkkxMCkgKi8KK0FQVU9QKE1fQ0dUSEksCQlSSTEwLAkweDI2OCwJImNndGhpIiwJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBDR1QlSSAgICAgICAgIFJUPC0oUkE+STEwKSAqLworQVBVT1AoTV9DR1RJLAkJUkkxMCwJMHgyNjAsCSJjZ3RpIiwJCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTIsCUZYMikJLyogQ0dUJUkgICAgICAgICBSVDwtKFJBPkkxMCkgKi8KK0FQVU9QKE1fQ0xHVEJJLAkJUkkxMCwJMHgyZjAsCSJjbGd0YmkiLAlfQTMoQV9ULEFfQSxBX1MxMEIpLAkwMDAxMiwJRlgyKQkvKiBDTEdUJUkgICAgICAgIFJUPC0oUkE+STEwKSAqLworQVBVT1AoTV9DTEdUSEksCQlSSTEwLAkweDJlOCwJImNsZ3RoaSIsCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTIsCUZYMikJLyogQ0xHVCVJICAgICAgICBSVDwtKFJBPkkxMCkgKi8KK0FQVU9QKE1fQ0xHVEksCQlSSTEwLAkweDJlMCwJImNsZ3RpIiwJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBDTEdUJUkgICAgICAgIFJUPC0oUkE+STEwKSAqLworQVBVT1AoTV9DRVFCSSwJCVJJMTAsCTB4M2YwLAkiY2VxYmkiLAlfQTMoQV9ULEFfQSxBX1MxMEIpLAkwMDAxMiwJRlgyKQkvKiBDRVElSSAgICAgICAgIFJUPC0oUkE9STEwKSAqLworQVBVT1AoTV9DRVFISSwJCVJJMTAsCTB4M2U4LAkiY2VxaGkiLAlfQTMoQV9ULEFfQSxBX1MxMCksCTAwMDEyLAlGWDIpCS8qIENFUSVJICAgICAgICAgUlQ8LShSQT1JMTApICovCitBUFVPUChNX0NFUUksCQlSSTEwLAkweDNlMCwJImNlcWkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlgyKQkvKiBDRVElSSAgICAgICAgIFJUPC0oUkE9STEwKSAqLworQVBVT1AoTV9IR1RJLAkJUkkxMCwJMHgyNzgsCSJoZ3RpIiwJCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTAsCUZYMikJLyogSGFsdEdUSSAgICAgICBoYWx0X2lmKFJBPkkxMCkgKi8KK0FQVU9QKE1fSEdUSTIsCQlSSTEwLAkweDI3OCwJImhndGkiLAkJX0EyKEFfQSxBX1MxMCksCTAwMDEwLAlGWDIpCS8qIEhhbHRHVEkgICAgICAgaGFsdF9pZihSQT5JMTApICovCitBUFVPUChNX0hMR1RJLAkJUkkxMCwJMHgyZjgsCSJobGd0aSIsCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTAsCUZYMikJLyogSGFsdExHVEkgICAgICBoYWx0X2lmKFJBPkkxMCkgKi8KK0FQVU9QKE1fSExHVEkyLAkJUkkxMCwJMHgyZjgsCSJobGd0aSIsCV9BMihBX0EsQV9TMTApLAkwMDAxMCwJRlgyKQkvKiBIYWx0TEdUSSAgICAgIGhhbHRfaWYoUkE+STEwKSAqLworQVBVT1AoTV9IRVFJLAkJUkkxMCwJMHgzZjgsCSJoZXFpIiwJCV9BMyhBX1QsQV9BLEFfUzEwKSwJMDAwMTAsCUZYMikJLyogSGFsdEVRSW1tICAgICBoYWx0X2lmKFJBPUkxMCkgKi8KK0FQVU9QKE1fSEVRSTIsCQlSSTEwLAkweDNmOCwJImhlcWkiLAkJX0EyKEFfQSxBX1MxMCksCTAwMDEwLAlGWDIpCS8qIEhhbHRFUUltbSAgICAgaGFsdF9pZihSQT1JMTApICovCitBUFVPUChNX01QWUksCQlSSTEwLAkweDNhMCwJIm1weWkiLAkJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlA3KQkvKiBNUFlJICAgICAgICAgIFJUPC1SQSpJMTAgKi8KK0FQVU9QKE1fTVBZVUksCQlSSTEwLAkweDNhOCwJIm1weXVpIiwJX0EzKEFfVCxBX0EsQV9TMTApLAkwMDAxMiwJRlA3KQkvKiBNUFlVSSAgICAgICAgIFJUPC1SQSpJMTAgKi8KK0FQVU9QKE1fQ0ZMVFMsCQlSSTgsCTB4M2IwLAkiY2ZsdHMiLAlfQTMoQV9ULEFfQSxBX1U3QSksCTAwMDEyLAlGUDcpCS8qIENGTFRTICAgICAgICAgUlQ8LWludChSQSxJOCkgKi8KK0FQVU9QKE1fQ0ZMVFUsCQlSSTgsCTB4M2IyLAkiY2ZsdHUiLAlfQTMoQV9ULEFfQSxBX1U3QSksCTAwMDEyLAlGUDcpCS8qIENGTFRVICAgICAgICAgUlQ8LWludChSQSxJOCkgKi8KK0FQVU9QKE1fQ1NGTFQsCQlSSTgsCTB4M2I0LAkiY3NmbHQiLAlfQTMoQV9ULEFfQSxBX1U3QiksCTAwMDEyLAlGUDcpCS8qIENTRkxUICAgICAgICAgUlQ8LWZsdChSQSxJOCkgKi8KK0FQVU9QKE1fQ1VGTFQsCQlSSTgsCTB4M2I2LAkiY3VmbHQiLAlfQTMoQV9ULEFfQSxBX1U3QiksCTAwMDEyLAlGUDcpCS8qIENVRkxUICAgICAgICAgUlQ8LWZsdChSQSxJOCkgKi8KK0FQVU9QKE1fRkVTRCwJCVJSLAkweDNiOCwJImZlc2QiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJRlBEKQkvKiBGRVNEICAgICAgICAgIFJUPC1kb3VibGUoUkEpICovCitBUFVPUChNX0ZSRFMsCQlSUiwJMHgzYjksCSJmcmRzIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCUZQRCkJLyogRlJEUyAgICAgICAgICBSVDwtc2luZ2xlKFJBKSAqLworQVBVT1AoTV9GU0NSUkQsCQlSUiwJMHgzOTgsCSJmc2NycmQiLAlfQTEoQV9UKSwJCTAwMDAyLAlGUEQpCS8qIEZTQ1JSRCAgICAgICAgUlQ8LUZQX3N0YXR1cyAqLworQVBVT1AoTV9GU0NSV1IsCQlSUiwJMHgzYmEsCSJmc2Nyd3IiLAlfQTIoQV9ULEFfQSksCTAwMDEwLAlGUDcpCS8qIEZTQ1JXUiAgICAgICAgRlBfc3RhdHVzPC1SQSAqLworQVBVT1AoTV9GU0NSV1IyLAlSUiwJMHgzYmEsCSJmc2Nyd3IiLAlfQTEoQV9BKSwJCTAwMDEwLAlGUDcpCS8qIEZTQ1JXUiAgICAgICAgRlBfc3RhdHVzPC1SQSAqLworQVBVT1AoTV9DTFosCQlSUiwJMHgyYTUsCSJjbHoiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMiwJRlgyKQkvKiBDTFogICAgICAgICAgIFJUPC1jbHooUkEpICovCitBUFVPUChNX0NOVEIsCQlSUiwJMHgyYjQsCSJjbnRiIiwJCV9BMihBX1QsQV9BKSwJMDAwMTIsCUZYQikJLyogQ05UICAgICAgICAgICBSVDwtcG9wKFJBKSAqLworQVBVT1AoTV9YU0JILAkJUlIsCTB4MmI2LAkieHNiaCIsCQlfQTIoQV9ULEFfQSksCTAwMDEyLAlGWDIpCS8qIGVYdFNpZ25CdG9IICAgUlQ8LXNpZ25fZXh0KFJBKSAqLworQVBVT1AoTV9YU0hXLAkJUlIsCTB4MmFlLAkieHNodyIsCQlfQTIoQV9ULEFfQSksCTAwMDEyLAlGWDIpCS8qIGVYdFNpZ25IdG9XICAgUlQ8LXNpZ25fZXh0KFJBKSAqLworQVBVT1AoTV9YU1dELAkJUlIsCTB4MmE2LAkieHN3ZCIsCQlfQTIoQV9ULEFfQSksCTAwMDEyLAlGWDIpCS8qIGVYdFNpZ25XdG9EICAgUlQ8LXNpZ25fZXh0KFJBKSAqLworQVBVT1AoTV9ST1RJLAkJUkk3LAkweDA3OCwJInJvdGkiLAkJX0EzKEFfVCxBX0EsQV9TN04pLAkwMDAxMiwJRlgzKQkvKiBST1QlSSAgICAgICAgIFJUPC1SQTw8PEk3ICovCitBUFVPUChNX1JPVE1JLAkJUkk3LAkweDA3OSwJInJvdG1pIiwJX0EzKEFfVCxBX0EsQV9TNyksCTAwMDEyLAlGWDMpCS8qIFJPVCVNSSAgICAgICAgUlQ8LVJBPDxJNyAqLworQVBVT1AoTV9ST1RNQUksCQlSSTcsCTB4MDdhLAkicm90bWFpIiwJX0EzKEFfVCxBX0EsQV9TNyksCTAwMDEyLAlGWDMpCS8qIFJPVE1BJUkgICAgICAgUlQ8LVJBPDxJNyAqLworQVBVT1AoTV9TSExJLAkJUkk3LAkweDA3YiwJInNobGkiLAkJX0EzKEFfVCxBX0EsQV9VNiksCTAwMDEyLAlGWDMpCS8qIFNITCVJICAgICAgICAgUlQ8LVJBPDxJNyAqLworQVBVT1AoTV9ST1RISSwJCVJJNywJMHgwN2MsCSJyb3RoaSIsCV9BMyhBX1QsQV9BLEFfUzdOKSwJMDAwMTIsCUZYMykJLyogUk9UJUkgICAgICAgICBSVDwtUkE8PDxJNyAqLworQVBVT1AoTV9ST1RITUksCQlSSTcsCTB4MDdkLAkicm90aG1pIiwJX0EzKEFfVCxBX0EsQV9TNiksCTAwMDEyLAlGWDMpCS8qIFJPVCVNSSAgICAgICAgUlQ8LVJBPDxJNyAqLworQVBVT1AoTV9ST1RNQUhJLAlSSTcsCTB4MDdlLAkicm90bWFoaSIsCV9BMyhBX1QsQV9BLEFfUzYpLAkwMDAxMiwJRlgzKQkvKiBST1RNQSVJICAgICAgIFJUPC1SQTw8STcgKi8KK0FQVU9QKE1fU0hMSEksCQlSSTcsCTB4MDdmLAkic2hsaGkiLAlfQTMoQV9ULEFfQSxBX1U1KSwJMDAwMTIsCUZYMykJLyogU0hMJUkgICAgICAgICBSVDwtUkE8PEk3ICovCitBUFVPUChNX0EsCQlSUiwJMHgwYzAsCSJhIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBBZGQlICAgICAgICAgIFJUPC1SQStSQiAqLworQVBVT1AoTV9BSCwJCVJSLAkweDBjOCwJImFoIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBBZGQlICAgICAgICAgIFJUPC1SQStSQiAqLworQVBVT1AoTV9TRiwJCVJSLAkweDA0MCwJInNmIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBTdWJGcm9tJSAgICAgIFJUPC1SQi1SQSAqLworQVBVT1AoTV9TRkgsCQlSUiwJMHgwNDgsCSJzZmgiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIFN1YkZyb20lICAgICAgUlQ8LVJCLVJBICovCitBUFVPUChNX0NHVCwJCVJSLAkweDI0MCwJImNndCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQ0dUJSAgICAgICAgICBSVDwtKFJBPlJCKSAqLworQVBVT1AoTV9DR1RCLAkJUlIsCTB4MjUwLAkiY2d0YiIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQ0dUJSAgICAgICAgICBSVDwtKFJBPlJCKSAqLworQVBVT1AoTV9DR1RILAkJUlIsCTB4MjQ4LAkiY2d0aCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQ0dUJSAgICAgICAgICBSVDwtKFJBPlJCKSAqLworQVBVT1AoTV9DTEdULAkJUlIsCTB4MmMwLAkiY2xndCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQ0xHVCUgICAgICAgICBSVDwtKFJBPlJCKSAqLworQVBVT1AoTV9DTEdUQiwJCVJSLAkweDJkMCwJImNsZ3RiIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIENMR1QlICAgICAgICAgUlQ8LShSQT5SQikgKi8KK0FQVU9QKE1fQ0xHVEgsCQlSUiwJMHgyYzgsCSJjbGd0aCIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBDTEdUJSAgICAgICAgIFJUPC0oUkE+UkIpICovCitBUFVPUChNX0NFUSwJCVJSLAkweDNjMCwJImNlcSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQ0VRJSAgICAgICAgICBSVDwtKFJBPVJCKSAqLworQVBVT1AoTV9DRVFCLAkJUlIsCTB4M2QwLAkiY2VxYiIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQ0VRJSAgICAgICAgICBSVDwtKFJBPVJCKSAqLworQVBVT1AoTV9DRVFILAkJUlIsCTB4M2M4LAkiY2VxaCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQ0VRJSAgICAgICAgICBSVDwtKFJBPVJCKSAqLworQVBVT1AoTV9IR1QsCQlSUiwJMHgyNTgsCSJoZ3QiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEwLAlGWDIpCS8qIEhhbHRHVCAgICAgICAgaGFsdF9pZihSQT5SQikgKi8KK0FQVU9QKE1fSEdUMiwJCVJSLAkweDI1OCwJImhndCIsCQlfQTIoQV9BLEFfQiksCTAwMTEwLAlGWDIpCS8qIEhhbHRHVCAgICAgICAgaGFsdF9pZihSQT5SQikgKi8KK0FQVU9QKE1fSExHVCwJCVJSLAkweDJkOCwJImhsZ3QiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEwLAlGWDIpCS8qIEhhbHRMR1QgICAgICAgaGFsdF9pZihSQT5SQikgKi8KK0FQVU9QKE1fSExHVDIsCQlSUiwJMHgyZDgsCSJobGd0IiwJCV9BMihBX0EsQV9CKSwJMDAxMTAsCUZYMikJLyogSGFsdExHVCAgICAgICBoYWx0X2lmKFJBPlJCKSAqLworQVBVT1AoTV9IRVEsCQlSUiwJMHgzZDgsCSJoZXEiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEwLAlGWDIpCS8qIEhhbHRFUSAgICAgICAgaGFsdF9pZihSQT1SQikgKi8KK0FQVU9QKE1fSEVRMiwJCVJSLAkweDNkOCwJImhlcSIsCQlfQTIoQV9BLEFfQiksCTAwMTEwLAlGWDIpCS8qIEhhbHRFUSAgICAgICAgaGFsdF9pZihSQT1SQikgKi8KK0FQVU9QKE1fRkNFUSwJCVJSLAkweDNjMiwJImZjZXEiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIEZDRVEgICAgICAgICAgUlQ8LShSQT1SQikgKi8KK0FQVU9QKE1fRkNNRVEsCQlSUiwJMHgzY2EsCSJmY21lcSIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBGQ01FUSAgICAgICAgIFJUPC0ofFJBfD18UkJ8KSAqLworQVBVT1AoTV9GQ0dULAkJUlIsCTB4MmMyLAkiZmNndCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogRkNHVCAgICAgICAgICBSVDwtKFJBPFJCKSAqLworQVBVT1AoTV9GQ01HVCwJCVJSLAkweDJjYSwJImZjbWd0IiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIEZDTUdUICAgICAgICAgUlQ8LSh8UkF8PHxSQnwpICovCitBUFVPUChNX0FORCwJCVJSLAkweDBjMSwJImFuZCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogQU5EICAgICAgICAgICBSVDwtUkEmUkIgKi8KK0FQVU9QKE1fTkFORCwJCVJSLAkweDBjOSwJIm5hbmQiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIE5BTkQgICAgICAgICAgUlQ8LSEoUkEmUkIpICovCitBUFVPUChNX09SLAkJUlIsCTB4MDQxLAkib3IiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIE9SICAgICAgICAgICAgUlQ8LVJBfFJCICovCitBUFVPUChNX05PUiwJCVJSLAkweDA0OSwJIm5vciIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMikJLyogTk9SICAgICAgICAgICBSVDwtIShSQSZSQikgKi8KK0FQVU9QKE1fWE9SLAkJUlIsCTB4MjQxLAkieG9yIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBYT1IgICAgICAgICAgIFJUPC1SQV5SQiAqLworQVBVT1AoTV9FUVYsCQlSUiwJMHgyNDksCSJlcXYiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDIpCS8qIEVRdWlWYWxlbnQgICAgUlQ8LSEoUkFeUkIpICovCitBUFVPUChNX0FOREMsCQlSUiwJMHgyYzEsCSJhbmRjIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBBTkRDb21wbGVtZW50IFJUPC1SQSYhUkIgKi8KK0FQVU9QKE1fT1JDLAkJUlIsCTB4MmM5LAkib3JjIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgyKQkvKiBPUkNvbXBsZW1lbnQgIFJUPC1SQXwhUkIgKi8KK0FQVU9QKE1fQUJTREIsCQlSUiwJMHgwNTMsCSJhYnNkYiIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlhCKQkvKiBBQlNvbHV0ZURpZmYgIFJUPC18UkEtUkJ8ICovCitBUFVPUChNX0FWR0IsCQlSUiwJMHgwZDMsCSJhdmdiIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlhCKQkvKiBBVkclICAgICAgICAgIFJUPC0oUkErUkIrMSkvMiAqLworQVBVT1AoTV9TVU1CLAkJUlIsCTB4MjUzLAkic3VtYiIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYQikJLyogU1VNJSAgICAgICAgICBSVDwtZihSQSxSQikgKi8KK0FQVU9QKE1fREZBLAkJUlIsCTB4MmNjLAkiZGZhIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlBEKQkvKiBERkFkZCAgICAgICAgIFJUPC1SQStSQiAqLworQVBVT1AoTV9ERk0sCQlSUiwJMHgyY2UsCSJkZm0iLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGUEQpCS8qIERGTXVsICAgICAgICAgUlQ8LVJBKlJCICovCitBUFVPUChNX0RGUywJCVJSLAkweDJjZCwJImRmcyIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQRCkJLyogREZTdWIgICAgICAgICBSVDwtUkEtUkIgKi8KK0FQVU9QKE1fRkEsCQlSUiwJMHgyYzQsCSJmYSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNikJLyogRkFkZCAgICAgICAgICBSVDwtUkErUkIgKi8KK0FQVU9QKE1fRk0sCQlSUiwJMHgyYzYsCSJmbSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNikJLyogRk11bCAgICAgICAgICBSVDwtUkEqUkIgKi8KK0FQVU9QKE1fRlMsCQlSUiwJMHgyYzUsCSJmcyIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNikJLyogRlN1YiAgICAgICAgICBSVDwtUkEtUkIgKi8KK0FQVU9QKE1fTVBZLAkJUlIsCTB4M2M0LAkibXB5IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlA3KQkvKiBNUFkgICAgICAgICAgIFJUPC1SQSpSQiAqLworQVBVT1AoTV9NUFlILAkJUlIsCTB4M2M1LAkibXB5aCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNykJLyogTVBZSCAgICAgICAgICBSVDwtKFJBaCpSQik8PDE2ICovCitBUFVPUChNX01QWUhILAkJUlIsCTB4M2M2LAkibXB5aGgiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNykJLyogTVBZSEggICAgICAgICBSVDwtUkFoKlJCaCAqLworQVBVT1AoTV9NUFlISFUsCQlSUiwJMHgzY2UsCSJtcHloaHUiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNykJLyogTVBZSEhVICAgICAgICBSVDwtUkFoKlJCaCAqLworQVBVT1AoTV9NUFlTLAkJUlIsCTB4M2M3LAkibXB5cyIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZQNykJLyogTVBZUyAgICAgICAgICBSVDwtKFJBKlJCKT4+MTYgKi8KK0FQVU9QKE1fTVBZVSwJCVJSLAkweDNjYywJIm1weXUiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGUDcpCS8qIE1QWVUgICAgICAgICAgUlQ8LVJBKlJCICovCitBUFVPUChNX0ZJLAkJUlIsCTB4M2Q0LAkiZmkiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGUDcpCS8qIEZJbnRlcnBvbGF0ZSAgUlQ8LWYoUkEsUkIpICovCitBUFVPUChNX1JPVCwJCVJSLAkweDA1OCwJInJvdCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMykJLyogUk9UJSAgICAgICAgICBSVDwtUkE8PDxSQiAqLworQVBVT1AoTV9ST1RNLAkJUlIsCTB4MDU5LAkicm90bSIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMykJLyogUk9UJU0gICAgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1JPVE1BLAkJUlIsCTB4MDVhLAkicm90bWEiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMykJLyogUk9UTUElICAgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1NITCwJCVJSLAkweDA1YiwJInNobCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMykJLyogU0hMJSAgICAgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1JPVEgsCQlSUiwJMHgwNWMsCSJyb3RoIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgzKQkvKiBST1QlICAgICAgICAgIFJUPC1SQTw8PFJCICovCitBUFVPUChNX1JPVEhNLAkJUlIsCTB4MDVkLAkicm90aG0iLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTIsCUZYMykJLyogUk9UJU0gICAgICAgICBSVDwtUkE8PFJiICovCitBUFVPUChNX1JPVE1BSCwJCVJSLAkweDA1ZSwJInJvdG1haCIsCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJRlgzKQkvKiBST1RNQSUgICAgICAgIFJUPC1SQTw8UmIgKi8KK0FQVU9QKE1fU0hMSCwJCVJSLAkweDA1ZiwJInNobGgiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAlGWDMpCS8qIFNITCUgICAgICAgICAgUlQ8LVJBPDxSYiAqLworQVBVT1AoTV9NUFlISEEsCQlSUiwJMHgzNDYsCSJtcHloaGEiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTMsCUZQNykJLyogTVBZSEhBICAgICAgICBSVDwtUkFoKlJCaCtSVCAqLworQVBVT1AoTV9NUFlISEFVLAlSUiwJMHgzNGUsCSJtcHloaGF1IiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEzLAlGUDcpCS8qIE1QWUhIQVUgICAgICAgUlQ8LVJBaCpSQmgrUlQgKi8KK0FQVU9QKE1fREZNQSwJCVJSLAkweDM1YywJImRmbWEiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEzLAlGUEQpCS8qIERGTUFkZCAgICAgICAgUlQ8LVJUK1JBKlJCICovCitBUFVPUChNX0RGTVMsCQlSUiwJMHgzNWQsCSJkZm1zIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMywJRlBEKQkvKiBERk1TdWIgICAgICAgIFJUPC1SQSpSQi1SVCAqLworQVBVT1AoTV9ERk5NUywJCVJSLAkweDM1ZSwJImRmbm1zIiwJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEzLAlGUEQpCS8qIERGTk1TdWIgICAgICAgUlQ8LVJULVJBKlJCICovCitBUFVPUChNX0RGTk1BLAkJUlIsCTB4MzVmLAkiZGZubWEiLAlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTMsCUZQRCkJLyogREZOTUFkZCAgICAgICBSVDwtKC1SVCktUkEqUkIgKi8KK0FQVU9QKE1fRk1BLAkJUlJSLAkweDcwMCwJImZtYSIsCQlfQTQoQV9DLEFfQSxBX0IsQV9UKSwJMDIxMTEsCUZQNikJLyogRk1BZGQgICAgICAgICBSQzwtUlQrUkEqUkIgKi8KK0FQVU9QKE1fRk1TLAkJUlJSLAkweDc4MCwJImZtcyIsCQlfQTQoQV9DLEFfQSxBX0IsQV9UKSwJMDIxMTEsCUZQNikJLyogRk1TdWIgICAgICAgICBSQzwtUkEqUkItUlQgKi8KK0FQVU9QKE1fRk5NUywJCVJSUiwJMHg2ODAsCSJmbm1zIiwJCV9BNChBX0MsQV9BLEFfQixBX1QpLAkwMjExMSwJRlA2KQkvKiBGTk1TdWIgICAgICAgIFJDPC1SVC1SQSpSQiAqLworQVBVT1AoTV9NUFlBLAkJUlJSLAkweDYwMCwJIm1weWEiLAkJX0E0KEFfQyxBX0EsQV9CLEFfVCksCTAyMTExLAlGUDcpCS8qIE1QWUEgICAgICAgICAgUkM8LVJBKlJCK1JUICovCitBUFVPUChNX1NFTEIsCQlSUlIsCTB4NDAwLAkic2VsYiIsCQlfQTQoQV9DLEFfQSxBX0IsQV9UKSwJMDIxMTEsCUZYMikJLyogU0VMZWN0Qml0cyAgICBSQzwtUkEmUlR8UkImIVJUICovCisvKiBmb3Igc3lzdGVtIGZ1bmN0aW9uIGNhbGwsIHRoaXMgdXNlcyBvcC1jb2RlIG9mIG10c3ByICovCitBUFVPUChNX1NZU0NBTEwsCVJJNywgICAgMHgxMGMsCSJzeXNjYWxsIiwgICAgICBfQTMoQV9ULEFfQSxBX1M3TiksCTAwMDAyLAlTUFIpICAgICAgICAvKiBTeXN0ZW0gQ2FsbCAqLworLyoKK3BzZXVkbyBpbnN0cnVjdGlvbjoKK3N5c3RlbSBjYWxsCit2YWx1ZSBvZiBJOQlvcGVyYXRpb24KKzAJaGFsdAorMQkJcnRbMF0gPSBvcGVuKE1FTVtyYVswXV0sCXJhWzFdKQorMgkJcnRbMF0gPSBjbG9zZShyYVswXSkKKzMJCXJ0WzBdID0gcmVhZChyYVswXSwJTUVNW3JhWzFdXSwJcmFbMl0pCis0CQlydFswXSA9IHdyaXRlKHJhWzBdLAlNRU1bcmFbMV1dLAlyYVsyXSkKKzUJCXByaW50ZihNRU1bcmFbMF1dLAlyYVsxXSwJcmFbMl0sCXJhWzNdKQorNDIJCXJ0WzBdID0gY2xvY2soKQorNTIJCXJ0WzBdID0gbHNlZWsocmEwLAlyYTEsCXJhMikKKworKi8KKworCisvKiBuZXcgbXVsdGlwcmVjaXNpb24gYWRkL3N1YiAqLworQVBVT1AoTV9BRERYLAkJUlIsCTB4MzQwLAkiYWRkeCIsCQlfQTMoQV9ULEFfQSxBX0IpLAkJMDAxMTMsCQlGWDIpCS8qIEFkZF9lWHRlbmRlZCAgUlQ8LVJBK1JCK1JUICovCitBUFVPUChNX0NHLAkJUlIsCTB4MGMyLAkiY2ciLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEyLAkJRlgyKQkvKiBDYXJyeUdlbmVyYXRlIFJUPC1jb3V0KFJBK1JCKSAqLworQVBVT1AoTV9DR1gsCQlSUiwJMHgzNDIsCSJjZ3giLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEzLAkJRlgyKQkvKiBDYXJyeUdlbl9lWHRkIFJUPC1jb3V0KFJBK1JCK1JUKSAqLworQVBVT1AoTV9TRlgsCQlSUiwJMHgzNDEsCSJzZngiLAkJX0EzKEFfVCxBX0EsQV9CKSwJCTAwMTEzLAkJRlgyKQkvKiBBZGRfZVh0ZW5kZWQgIFJUPC1SQStSQitSVCAqLworQVBVT1AoTV9CRywJCVJSLAkweDA0MiwJImJnIiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMiwJCUZYMikJLyogQ2FycnlHZW5lcmF0ZSBSVDwtY291dChSQStSQikgKi8KK0FQVU9QKE1fQkdYLAkJUlIsCTB4MzQzLAkiYmd4IiwJCV9BMyhBX1QsQV9BLEFfQiksCQkwMDExMywJCUZYMikJLyogQ2FycnlHZW5fZVh0ZCBSVDwtY291dChSQStSQitSVCkgKi8KKworLyoKKworVGhlIGZvbGxvd2luZyBvcHMgYXJlIGEgc3Vic2V0IG9mIGFib3ZlIGV4Y2VwdCB3aXRoIGZlYXR1cmUgYml0cyBzZXQuCitGZWF0dXJlIGJpdHMgYXJlIGJpdHMgMTEtMTcgb2YgdGhlIGluc3RydWN0aW9uOgorCisgIDExIC0gQyAmIFAgZmVhdHVyZSBiaXQKKyAgMTIgLSBkaXNhYmxlIGludGVycnVwdHMKKyAgMTMgLSBlbmFibGUgaW50ZXJydXB0cworCisqLworQVBVT1BGQihNX0JJRCwJCVJSLAkweDFhOCwJMHgyMCwJImJpZCIsCQlfQTEoQV9BKSwJCTAwMDEwLAlCUikJLyogQkkgICAgICAgICAgICBJUDwtUkEgKi8KK0FQVU9QRkIoTV9CSUUsCQlSUiwJMHgxYTgsCTB4MTAsCSJiaWUiLAkJX0ExKEFfQSksCQkwMDAxMCwJQlIpCS8qIEJJICAgICAgICAgICAgSVA8LVJBICovCitBUFVPUEZCKE1fQklTTEQsCVJSLAkweDFhOSwJMHgyMCwJImJpc2xkIiwJX0EyKEFfVCxBX0EpLAkwMDAxMiwJQlIpCS8qIEJJU0wgICAgICAgICAgUlQsSVA8LUlQLFJBICovCitBUFVPUEZCKE1fQklTTEUsCVJSLAkweDFhOSwJMHgxMCwJImJpc2xlIiwJX0EyKEFfVCxBX0EpLAkwMDAxMiwJQlIpCS8qIEJJU0wgICAgICAgICAgUlQsSVA8LUlQLFJBICovCitBUFVPUEZCKE1fSVJFVEQsICAJUlIsCTB4MWFhLAkweDIwLAkiaXJldGQiLAlfQTEoQV9BKSwgCTAwMDEwLAlCUikJLyogSVJFVCAgICAgICAgICBJUDwtU1JSMCAqLworQVBVT1BGQihNX0lSRVREMiwgIAlSUiwJMHgxYWEsCTB4MjAsCSJpcmV0ZCIsCV9BMCgpLAkgCTAwMDEwLAlCUikJLyogSVJFVCAgICAgICAgICBJUDwtU1JSMCAqLworQVBVT1BGQihNX0lSRVRFLCAgCVJSLAkweDFhYSwJMHgxMCwJImlyZXRlIiwJX0ExKEFfQSksIAkwMDAxMCwJQlIpCS8qIElSRVQgICAgICAgICAgSVA8LVNSUjAgKi8KK0FQVU9QRkIoTV9JUkVURTIsICAJUlIsCTB4MWFhLAkweDEwLAkiaXJldGUiLAlfQTAoKSwJIAkwMDAxMCwJQlIpCS8qIElSRVQgICAgICAgICAgSVA8LVNSUjAgKi8KK0FQVU9QRkIoTV9CSVNMRURELAlSUiwJMHgxYWIsCTB4MjAsCSJiaXNsZWRkIiwJX0EyKEFfVCxBX0EpLAkwMDAxMiwJQlIpCS8qIEJJU0xFRCAgICAgICAgUlQsSVA8LUlQLFJBX2lmKGV4dCkgKi8KK0FQVU9QRkIoTV9CSVNMRURFLAlSUiwJMHgxYWIsCTB4MTAsCSJiaXNsZWRlIiwJX0EyKEFfVCxBX0EpLAkwMDAxMiwJQlIpCS8qIEJJU0xFRCAgICAgICAgUlQsSVA8LUlQLFJBX2lmKGV4dCkgKi8KK0FQVU9QRkIoTV9CSUhOWkQsCVJSLAkweDEyYiwJMHgyMCwJImJpaG56ZCIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhOWiAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSUhOWkUsCVJSLAkweDEyYiwJMHgxMCwJImJpaG56ZSIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhOWiAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSUhaRCwJUlIsCTB4MTJhLAkweDIwLAkiYmloemQiLAlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklIWiAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklIWkUsCVJSLAkweDEyYSwJMHgxMCwJImJpaHplIiwJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJSFogICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJTlpELAlSUiwJMHgxMjksCTB4MjAsCSJiaW56ZCIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSU5aICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSU5aRSwJUlIsCTB4MTI5LAkweDEwLAkiYmluemUiLAlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklOWiAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklaRCwJCVJSLAkweDEyOCwJMHgyMCwJImJpemQiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJWiAgICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJWkUsCQlSUiwJMHgxMjgsCTB4MTAsCSJiaXplIiwJCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSVogICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9TWU5DQywJUlIsCTB4MDAyLAkweDQwLAkic3luY2MiLAlfQTAoKSwJCTAwMDAwLAlCUikJLyogU1lOQ0MgICAgICAgICAgZmx1c2hfcGlwZSAqLworQVBVT1BGQihNX0hCUlAsCQlMQlRJLAkweDFhYywJMHg0MCwJImhicnAiLAkJX0EwKCksCSAgICAgICAgMDAwMTAsCUxTKQkvKiBIQlIgICAgICAgICAgIEJUQltCOV08LU1bUmFdICovCisKKy8qIFN5bm9ueW1zIHJlcXVpcmVkIGJ5IHRoZSBBUyBtYW51YWwuICovCitBUFVPUChNX0xSLAkJUkkxMCwJMHgwMjAsCSJsciIsCQlfQTIoQV9ULEFfQSksCTAwMDEyLAlGWDIpCS8qIE9SJUkgICAgICAgICAgUlQ8LVJBfEkxMCAqLworQVBVT1AoTV9CSUhULAkJUlIsCTB4MTJiLAkiYmlodCIsIAlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklITlogICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUChNX0JJSEYsCQlSUiwJMHgxMmEsCSJiaWhmIiwJCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhaICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QKE1fQklULAkJUlIsCTB4MTI5LAkiYml0IiwJCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSU5aICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QKE1fQklGLAkJUlIsCTB4MTI4LAkiYmlmIiwJCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSVogICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSUhURCwJUlIsCTB4MTJiLAkweDIwLAkiYmlodGQiLAlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklITkYgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklIVEUsCVJSLAkweDEyYiwJMHgxMCwJImJpaHRlIiwJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJSE5GICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJSEZELAlSUiwJMHgxMmEsCTB4MjAsCSJiaWhmZCIsCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSUhaICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSUhGRSwJUlIsCTB4MTJhLAkweDEwLAkiYmloZmUiLAlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklIWiAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklURCwgCVJSLAkweDEyOSwJMHgyMCwJImJpdGQiLCAJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJTkYgICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworQVBVT1BGQihNX0JJVEUsIAlSUiwJMHgxMjksCTB4MTAsCSJiaXRlIiwgCV9BMihBX1QsQV9BKSwJMDAwMTEsCUJSKQkvKiBCSU5GICAgICAgICAgIElQPC1SQV9pZihSVCkgKi8KK0FQVU9QRkIoTV9CSUZELAkJUlIsCTB4MTI4LAkweDIwLAkiYmlmZCIsCQlfQTIoQV9ULEFfQSksCTAwMDExLAlCUikJLyogQklaICAgICAgICAgICBJUDwtUkFfaWYoUlQpICovCitBUFVPUEZCKE1fQklGRSwJCVJSLAkweDEyOCwJMHgxMCwJImJpZmUiLAkJX0EyKEFfVCxBX0EpLAkwMDAxMSwJQlIpCS8qIEJJWiAgICAgICAgICAgSVA8LVJBX2lmKFJUKSAqLworCisjdW5kZWYgX0EwCisjdW5kZWYgX0ExCisjdW5kZWYgX0EyCisjdW5kZWYgX0EzCisjdW5kZWYgX0E0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9zcHUtb3BjLmMgYi9hcmNoL3Bvd2VycGMveG1vbi9zcHUtb3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmZmRlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3NwdS1vcGMuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBTUFUgb3Bjb2RlIGxpc3QKKworICAgQ29weXJpZ2h0IDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisjaW5jbHVkZSAic3B1LmgiCisKKy8qIFRoaXMgZmlsZSBob2xkcyB0aGUgU3B1IG9wY29kZSB0YWJsZSAqLworDAorCisvKgorICAgRXhhbXBsZSBjb250ZW50cyBvZiBzcHUtaW5zbi5oCisgICAgICBpZF90YWcJbW9kZQltb2RlCXR5cGUJb3Bjb2RlCW1uZW1vbmljCWFzbXR5cGUJICAgIGRlcGVuZGVuY3kJCUZQVQlML1M/CWJyYW5jaD8JaW5zdHJ1Y3Rpb24gICAKKyAgICAgICAgICAgICAgICBRVUFECVdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLFJDLFJCLFJBLFJUKSAgICBsYXRlbmN5ICAJCQkgICAgICAgICAgICAgIAkJCisgICBBUFVPUChNX0xRRCwJMSwJMCwJUkk5LAkweDFmOCwJImxxZCIsCQlBU01fUkk5SURYLAkwMDAxMiwJCUZYVSwJMSwJMCkJTG9hZCBRdWFkd29yZCBkLWZvcm0gCisgKi8KKworY29uc3Qgc3RydWN0IHNwdV9vcGNvZGUgc3B1X29wY29kZXNbXSA9IHsKKyNkZWZpbmUgQVBVT1AoVEFHLE1BQ0ZPUk1BVCxPUENPREUsTU5FTU9OSUMsQVNNRk9STUFULERFUCxQSVBFKSBcCisJeyBNQUNGT1JNQVQsIE9QQ09ERSwgTU5FTU9OSUMsIEFTTUZPUk1BVCB9LAorI2RlZmluZSBBUFVPUEZCKFRBRyxNQUNGT1JNQVQsT1BDT0RFLEZCLE1ORU1PTklDLEFTTUZPUk1BVCxERVAsUElQRSkgXAorCXsgTUFDRk9STUFULCBPUENPREUsIE1ORU1PTklDLCBBU01GT1JNQVQgfSwKKyNpbmNsdWRlICJzcHUtaW5zbnMuaCIKKyN1bmRlZiBBUFVPUAorI3VuZGVmIEFQVU9QRkIKK307CisKK2NvbnN0IGludCBzcHVfbnVtX29wY29kZXMgPQorICBzaXplb2YgKHNwdV9vcGNvZGVzKSAvIHNpemVvZiAoc3B1X29wY29kZXNbMF0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24vc3B1LmggYi9hcmNoL3Bvd2VycGMveG1vbi9zcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzYxZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3htb24vc3B1LmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qIFNQVSBFTEYgc3VwcG9ydCBmb3IgQkZELgorCisgICBDb3B5cmlnaHQgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKworLyogVGhlc2UgdHdvIGVudW1zIGFyZSBmcm9tIHJlbF9hcHUvY29tbW9uL3NwdV9hc21fZm9ybWF0LmggKi8KKy8qIGRlZmluaXRpb24gb2YgaW5zdHJ1Y3Rpb24gZm9ybWF0ICovCit0eXBlZGVmIGVudW0geworICBSUlIsCisgIFJJMTgsCisgIFJJMTYsCisgIFJJMTAsCisgIFJJOCwKKyAgUkk3LAorICBSUiwKKyAgTEJULAorICBMQlRJLAorICBJREFUQSwKKyAgVU5LTk9XTl9JRk9STUFUCit9IHNwdV9pZm9ybWF0OworCisvKiBUaGVzZSB2YWx1ZXMgZGVzY3JpYmUgYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gYXJndW1lbnRzLiAgVGhleSBpbmRpY2F0ZQorICogaG93IHRvIGVuY29kZSwgcmFuZ2UgY2hlY2tpbmcgYW5kIHdoaWNoIHJlbG9jYXRpb24gdG8gdXNlLiAqLwordHlwZWRlZiBlbnVtIHsKKyAgQV9ULCAgLyogcmVnaXN0ZXIgYXQgcG9zIDAgKi8KKyAgQV9BLCAgLyogcmVnaXN0ZXIgYXQgcG9zIDcgKi8KKyAgQV9CLCAgLyogcmVnaXN0ZXIgYXQgcG9zIDE0ICovCisgIEFfQywgIC8qIHJlZ2lzdGVyIGF0IHBvcyAyMSAqLworICBBX1MsICAvKiBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXIgYXQgcG9zIDcgKi8KKyAgQV9ILCAgLyogY2hhbm5lbCByZWdpc3RlciBhdCBwb3MgNyAqLworICBBX1AsICAvKiBwYXJlbnRoZXNpcywgdGhpcyBoYXMgdG8gc2VwYXJhdGUgcmVncyBmcm9tIGltbWVkaWF0ZXMgKi8KKyAgQV9TMywKKyAgQV9TNiwKKyAgQV9TN04sCisgIEFfUzcsCisgIEFfVTdBLAorICBBX1U3QiwKKyAgQV9TMTBCLAorICBBX1MxMCwKKyAgQV9TMTEsCisgIEFfUzExSSwKKyAgQV9TMTQsCisgIEFfUzE2LAorICBBX1MxOCwKKyAgQV9SMTgsCisgIEFfVTMsCisgIEFfVTUsCisgIEFfVTYsCisgIEFfVTcsCisgIEFfVTE0LAorICBBX1gxNiwKKyAgQV9VMTgsCisgIEFfTUFYCit9IHNwdV9hZm9ybWF0OworCitlbnVtIHNwdV9pbnNucyB7CisjZGVmaW5lIEFQVU9QKFRBRyxNQUNGT1JNQVQsT1BDT0RFLE1ORU1PTklDLEFTTUZPUk1BVCxERVAsUElQRSkgXAorCVRBRywKKyNkZWZpbmUgQVBVT1BGQihUQUcsTUFDRk9STUFULE9QQ09ERSxGQixNTkVNT05JQyxBU01GT1JNQVQsREVQLFBJUEUpIFwKKwlUQUcsCisjaW5jbHVkZSAic3B1LWluc25zLmgiCisjdW5kZWYgQVBVT1AKKyN1bmRlZiBBUFVPUEZCCisgICAgICAgIE1fU1BVX01BWAorfTsKKworc3RydWN0IHNwdV9vcGNvZGUKK3sKKyAgIHNwdV9pZm9ybWF0IGluc25fdHlwZTsKKyAgIHVuc2lnbmVkIGludCBvcGNvZGU7CisgICBjaGFyICptbmVtb25pYzsKKyAgIGludCBhcmdbNV07Cit9OworCisjZGVmaW5lIFNJR05FRF9FWFRSQUNUKGluc24sc2l6ZSxwb3MpICgoKGludCkoKGluc24pIDw8ICgzMi1zaXplLXBvcykpKSA+PiAoMzItc2l6ZSkpCisjZGVmaW5lIFVOU0lHTkVEX0VYVFJBQ1QoaW5zbixzaXplLHBvcykgKCgoaW5zbikgPj4gcG9zKSAmICgoMSA8PCBzaXplKS0xKSkKKworI2RlZmluZSBERUNPREVfSU5TTl9SVChpbnNuKSAoaW5zbiAmIDB4N2YpCisjZGVmaW5lIERFQ09ERV9JTlNOX1JBKGluc24pICgoaW5zbiA+PiA3KSAmIDB4N2YpCisjZGVmaW5lIERFQ09ERV9JTlNOX1JCKGluc24pICgoaW5zbiA+PiAxNCkgJiAweDdmKQorI2RlZmluZSBERUNPREVfSU5TTl9SQyhpbnNuKSAoKGluc24gPj4gMjEpICYgMHg3ZikKKworI2RlZmluZSBERUNPREVfSU5TTl9JMTAoaW5zbikgU0lHTkVEX0VYVFJBQ1QoaW5zbiwxMCwxNCkKKyNkZWZpbmUgREVDT0RFX0lOU05fVTEwKGluc24pIFVOU0lHTkVEX0VYVFJBQ1QoaW5zbiwxMCwxNCkKKworLyogRm9yIGJyYW5jaGluZywgaW1tZWRpYXRlIGxvYWRzLCBoYnIgYW5kICBscWEvc3RxYS4gKi8KKyNkZWZpbmUgREVDT0RFX0lOU05fSTE2KGluc24pIFNJR05FRF9FWFRSQUNUKGluc24sMTYsNykKKyNkZWZpbmUgREVDT0RFX0lOU05fVTE2KGluc24pIFVOU0lHTkVEX0VYVFJBQ1QoaW5zbiwxNiw3KQorCisvKiBmb3Igc3RvcCAqLworI2RlZmluZSBERUNPREVfSU5TTl9VMTQoaW5zbikgVU5TSUdORURfRVhUUkFDVChpbnNuLDE0LDApCisKKy8qIEZvciBpbGEgKi8KKyNkZWZpbmUgREVDT0RFX0lOU05fSTE4KGluc24pIFNJR05FRF9FWFRSQUNUKGluc24sMTgsNykKKyNkZWZpbmUgREVDT0RFX0lOU05fVTE4KGluc24pIFVOU0lHTkVEX0VYVFJBQ1QoaW5zbiwxOCw3KQorCisvKiBGb3Igcm90YXRlIGFuZCBzaGlmdCBhbmQgZ2VuZXJhdGUgY29udHJvbCBtYXNrICovCisjZGVmaW5lIERFQ09ERV9JTlNOX0k3KGluc24pIFNJR05FRF9FWFRSQUNUKGluc24sNywxNCkKKyNkZWZpbmUgREVDT0RFX0lOU05fVTcoaW5zbikgVU5TSUdORURfRVhUUkFDVChpbnNuLDcsMTQpCisKKy8qIEZvciBmbG9hdCA8LT4gaW50IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgREVDT0RFX0lOU05fSTgoaW5zbikgIFNJR05FRF9FWFRSQUNUKGluc24sOCwxNCkKKyNkZWZpbmUgREVDT0RFX0lOU05fVTgoaW5zbikgVU5TSUdORURfRVhUUkFDVChpbnNuLDgsMTQpCisKKy8qIEZvciBoYnIgICovCisjZGVmaW5lIERFQ09ERV9JTlNOX0k5YShpbnNuKSAoKFNJR05FRF9FWFRSQUNUKGluc24sMiwyMykgPDwgNykgfCBVTlNJR05FRF9FWFRSQUNUKGluc24sNywwKSkKKyNkZWZpbmUgREVDT0RFX0lOU05fSTliKGluc24pICgoU0lHTkVEX0VYVFJBQ1QoaW5zbiwyLDE0KSA8PCA3KSB8IFVOU0lHTkVEX0VYVFJBQ1QoaW5zbiw3LDApKQorI2RlZmluZSBERUNPREVfSU5TTl9VOWEoaW5zbikgKChVTlNJR05FRF9FWFRSQUNUKGluc24sMiwyMykgPDwgNykgfCBVTlNJR05FRF9FWFRSQUNUKGluc24sNywwKSkKKyNkZWZpbmUgREVDT0RFX0lOU05fVTliKGluc24pICgoVU5TSUdORURfRVhUUkFDVChpbnNuLDIsMTQpIDw8IDcpIHwgVU5TSUdORURfRVhUUkFDVChpbnNuLDcsMCkpCisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwppbmRleCBmNTZmZmVmLi43NzU0MGEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CkBAIC0zNSwxNSArMzYsMTkgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgogI2luY2x1ZGUgPGFzbS9zc3RlcC5oPgotI2luY2x1ZGUgPGFzbS9idWcuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgogI2luY2x1ZGUgPGFzbS9wYWNhLmg+CisjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaXRfbHBfcmVnX3NhdmUuaD4KICNlbmRpZgogCiAjaW5jbHVkZSAibm9uc3RkaW8uaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCiAKICNkZWZpbmUgc2NhbmhleAl4bW9uX3NjYW5oZXgKICNkZWZpbmUgc2tpcGJsCXhtb25fc2tpcGJsCkBAIC0xMDcsNyArMTEyLDYgQEAKIHN0YXRpYyB2b2lkIGR1bXAodm9pZCk7CiBzdGF0aWMgdm9pZCBwcmR1bXAodW5zaWduZWQgbG9uZywgbG9uZyk7CiBzdGF0aWMgaW50IHBwY19pbnN0X2R1bXAodW5zaWduZWQgbG9uZywgbG9uZywgaW50KTsKLXZvaWQgcHJpbnRfYWRkcmVzcyh1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyB2b2lkIGJhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqKTsKIHN0YXRpYyB2b2lkIGV4Y3ByaW50KHN0cnVjdCBwdF9yZWdzICopOwogc3RhdGljIHZvaWQgcHJyZWdzKHN0cnVjdCBwdF9yZWdzICopOwpAQCAtMTQ3LDkgKzE1MSw5IEBACiAJCQkgICAgICBjb25zdCBjaGFyICphZnRlcik7CiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0dmVjbmFtZSh1bnNpZ25lZCBsb25nIHZlYyk7CiAKLWludCB4bW9uX25vX2F1dG9fYmFja3RyYWNlOworc3RhdGljIGludCBkb19zcHVfY21kKHZvaWQpOwogCi1leHRlcm4gaW50IHByaW50X2luc25fcG93ZXJwYyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpOworaW50IHhtb25fbm9fYXV0b19iYWNrdHJhY2U7CiAKIGV4dGVybiB2b2lkIHhtb25fZW50ZXIodm9pZCk7CiBleHRlcm4gdm9pZCB4bW9uX2xlYXZlKHZvaWQpOwpAQCAtMjA5LDggKzIxMywxNSBAQAogICBtaQlzaG93IGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeSBhbGxvY2F0aW9uXG5cCiAgIHAgCWNhbGwgYSBwcm9jZWR1cmVcblwKICAgcglwcmludCByZWdpc3RlcnNcblwKLSAgcwlzaW5nbGUgc3RlcFxuXAotICBTCXByaW50IHNwZWNpYWwgcmVnaXN0ZXJzXG5cCisgIHMJc2luZ2xlIHN0ZXBcbiIKKyNpZmRlZiBDT05GSUdfU1BVX0JBU0UKKyIgIHNzCXN0b3AgZXhlY3V0aW9uIG9uIGFsbCBzcHVzXG5cCisgIHNyCXJlc3RvcmUgZXhlY3V0aW9uIG9uIHN0b3BwZWQgc3B1c1xuXAorICBzZiAgIwlkdW1wIHNwdSBmaWVsZHMgZm9yIHNwdSAjIChpbiBoZXgpXG5cCisgIHNkICAjCWR1bXAgc3B1IGxvY2FsIHN0b3JlIGZvciBzcHUgIyAoaW4gaGV4KVwKKyAgc2RpICMJZGlzYXNzZW1ibGUgc3B1IGxvY2FsIHN0b3JlIGZvciBzcHUgIyAoaW4gaGV4KVxuIgorI2VuZGlmCisiICBTCXByaW50IHNwZWNpYWwgcmVnaXN0ZXJzXG5cCiAgIHQJcHJpbnQgYmFja3RyYWNlXG5cCiAgIHgJZXhpdCBtb25pdG9yIGFuZCByZWNvdmVyXG5cCiAgIFgJZXhpdCBtb25pdG9yIGFuZCBkb250IHJlY292ZXJcbiIKQEAgLTUxOCw2ICs1MjksNyBAQAogCQl4bW9uX3NhdmVfcmVncygmcmVncyk7CiAJCWV4Y3AgPSAmcmVnczsKIAl9CisKIAlyZXR1cm4geG1vbl9jb3JlKGV4Y3AsIDApOwogfQogRVhQT1JUX1NZTUJPTCh4bW9uKTsKQEAgLTgwOSw2ICs4MjEsOCBAQAogCQkJY2FjaGVmbHVzaCgpOwogCQkJYnJlYWs7CiAJCWNhc2UgJ3MnOgorCQkJaWYgKGRvX3NwdV9jbWQoKSA9PSAwKQorCQkJCWJyZWFrOwogCQkJaWYgKGRvX3N0ZXAoZXhjcCkpCiAJCQkJcmV0dXJuIGNtZDsKIAkJCWJyZWFrOwpAQCAtMTMzMiw3ICsxMzQ2LDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfYnVnX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IGJ1Z19lbnRyeSAqYnVnOworCWNvbnN0IHN0cnVjdCBidWdfZW50cnkgKmJ1ZzsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKIAlpZiAocmVncy0+bXNyICYgTVNSX1BSKQpAQCAtMTM0MywxMSArMTM1NywxMSBAQAogCWJ1ZyA9IGZpbmRfYnVnKHJlZ3MtPm5pcCk7CiAJaWYgKGJ1ZyA9PSBOVUxMKQogCQlyZXR1cm47Ci0JaWYgKGJ1Zy0+bGluZSAmIEJVR19XQVJOSU5HX1RSQVApCisJaWYgKGlzX3dhcm5pbmdfYnVnKGJ1ZykpCiAJCXJldHVybjsKIAotCXByaW50Zigia2VybmVsIEJVRyBpbiAlcyBhdCAlczolZCFcbiIsCi0JICAgICAgIGJ1Zy0+ZnVuY3Rpb24sIGJ1Zy0+ZmlsZSwgKHVuc2lnbmVkIGludClidWctPmxpbmUpOworCXByaW50Zigia2VybmVsIEJVRyBhdCAlczoldSFcbiIsCisJICAgICAgIGJ1Zy0+ZmlsZSwgYnVnLT5saW5lKTsKIH0KIAogdm9pZCBleGNwcmludChzdHJ1Y3QgcHRfcmVncyAqZnApCkBAIC0xNTU1LDExICsxNTY5LDYgQEAKIHsKIAlpbnQgY21kOwogCXVuc2lnbmVkIGxvbmcgdmFsOwotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCXN0cnVjdCBwYWNhX3N0cnVjdCAqcHRyUGFjYSA9IE5VTEw7Ci0Jc3RydWN0IGxwcGFjYSAqcHRyTHBQYWNhID0gTlVMTDsKLQlzdHJ1Y3QgSXRMcFJlZ1NhdmUgKnB0ckxwUmVnU2F2ZSA9IE5VTEw7Ci0jZW5kaWYKIAogCWNtZCA9IHNraXBibCgpOwogCWlmIChjbWQgPT0gJ1xuJykgewpAQCAtMTU3NiwyNiArMTU4NSwzMiBAQAogCQlwcmludGYoInNwICAgPSAiUkVHIiAgc3ByZzM9ICJSRUciXG4iLCBzcCwgbWZzcHIoU1BSTl9TUFJHMykpOwogCQlwcmludGYoInRvYyAgPSAiUkVHIiAgZGFyICA9ICJSRUciXG4iLCB0b2MsIG1mc3ByKFNQUk5fREFSKSk7CiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCi0JCS8vIER1bXAgb3V0IHJlbGV2YW50IFBhY2EgZGF0YSBhcmVhcy4KLQkJcHJpbnRmKCJQYWNhOiBcbiIpOwotCQlwdHJQYWNhID0gZ2V0X3BhY2EoKTsKLSAgICAKLQkJcHJpbnRmKCIgIExvY2FsIFByb2Nlc3NvciBDb250cm9sIEFyZWEgKExwUGFjYSk6IFxuIik7Ci0JCXB0ckxwUGFjYSA9IHB0clBhY2EtPmxwcGFjYV9wdHI7Ci0JCXByaW50ZigiICAgIFNhdmVkIFNycjA9JS4xNmx4ICBTYXZlZCBTcnIxPSUuMTZseCBcbiIsCi0JCSAgICAgICBwdHJMcFBhY2EtPnNhdmVkX3NycjAsIHB0ckxwUGFjYS0+c2F2ZWRfc3JyMSk7Ci0JCXByaW50ZigiICAgIFNhdmVkIEdwcjM9JS4xNmx4ICBTYXZlZCBHcHI0PSUuMTZseCBcbiIsCi0JCSAgICAgICBwdHJMcFBhY2EtPnNhdmVkX2dwcjMsIHB0ckxwUGFjYS0+c2F2ZWRfZ3ByNCk7Ci0JCXByaW50ZigiICAgIFNhdmVkIEdwcjU9JS4xNmx4IFxuIiwgcHRyTHBQYWNhLT5zYXZlZF9ncHI1KTsKLSAgICAKLQkJcHJpbnRmKCIgIExvY2FsIFByb2Nlc3NvciBSZWdpc3RlciBTYXZlIEFyZWEgKExwUmVnU2F2ZSk6IFxuIik7Ci0JCXB0ckxwUmVnU2F2ZSA9IHB0clBhY2EtPnJlZ19zYXZlX3B0cjsKLQkJcHJpbnRmKCIgICAgU2F2ZWQgU3ByZzA9JS4xNmx4ICBTYXZlZCBTcHJnMT0lLjE2bHggXG4iLAotCQkgICAgICAgcHRyTHBSZWdTYXZlLT54U1BSRzAsIHB0ckxwUmVnU2F2ZS0+eFNQUkcwKTsKLQkJcHJpbnRmKCIgICAgU2F2ZWQgU3ByZzI9JS4xNmx4ICBTYXZlZCBTcHJnMz0lLjE2bHggXG4iLAotCQkgICAgICAgcHRyTHBSZWdTYXZlLT54U1BSRzIsIHB0ckxwUmVnU2F2ZS0+eFNQUkczKTsKLQkJcHJpbnRmKCIgICAgU2F2ZWQgTXNyICA9JS4xNmx4ICBTYXZlZCBOaWEgID0lLjE2bHggXG4iLAotCQkgICAgICAgcHRyTHBSZWdTYXZlLT54TVNSLCBwdHJMcFJlZ1NhdmUtPnhOSUEpOworCQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkgeworCQkJc3RydWN0IHBhY2Ffc3RydWN0ICpwdHJQYWNhOworCQkJc3RydWN0IGxwcGFjYSAqcHRyTHBQYWNhOworCQkJc3RydWN0IEl0THBSZWdTYXZlICpwdHJMcFJlZ1NhdmU7CisKKwkJCS8qIER1bXAgb3V0IHJlbGV2YW50IFBhY2EgZGF0YSBhcmVhcy4gKi8KKwkJCXByaW50ZigiUGFjYTogXG4iKTsKKwkJCXB0clBhY2EgPSBnZXRfcGFjYSgpOworCisJCQlwcmludGYoIiAgTG9jYWwgUHJvY2Vzc29yIENvbnRyb2wgQXJlYSAoTHBQYWNhKTogXG4iKTsKKwkJCXB0ckxwUGFjYSA9IHB0clBhY2EtPmxwcGFjYV9wdHI7CisJCQlwcmludGYoIiAgICBTYXZlZCBTcnIwPSUuMTZseCAgU2F2ZWQgU3JyMT0lLjE2bHggXG4iLAorCQkJICAgICAgIHB0ckxwUGFjYS0+c2F2ZWRfc3JyMCwgcHRyTHBQYWNhLT5zYXZlZF9zcnIxKTsKKwkJCXByaW50ZigiICAgIFNhdmVkIEdwcjM9JS4xNmx4ICBTYXZlZCBHcHI0PSUuMTZseCBcbiIsCisJCQkgICAgICAgcHRyTHBQYWNhLT5zYXZlZF9ncHIzLCBwdHJMcFBhY2EtPnNhdmVkX2dwcjQpOworCQkJcHJpbnRmKCIgICAgU2F2ZWQgR3ByNT0lLjE2bHggXG4iLCBwdHJMcFBhY2EtPnNhdmVkX2dwcjUpOworCisJCQlwcmludGYoIiAgTG9jYWwgUHJvY2Vzc29yIFJlZ2lzdGVyIFNhdmUgQXJlYSAoTHBSZWdTYXZlKTogXG4iKTsKKwkJCXB0ckxwUmVnU2F2ZSA9IHB0clBhY2EtPnJlZ19zYXZlX3B0cjsKKwkJCXByaW50ZigiICAgIFNhdmVkIFNwcmcwPSUuMTZseCAgU2F2ZWQgU3ByZzE9JS4xNmx4IFxuIiwKKwkJCSAgICAgICBwdHJMcFJlZ1NhdmUtPnhTUFJHMCwgcHRyTHBSZWdTYXZlLT54U1BSRzApOworCQkJcHJpbnRmKCIgICAgU2F2ZWQgU3ByZzI9JS4xNmx4ICBTYXZlZCBTcHJnMz0lLjE2bHggXG4iLAorCQkJICAgICAgIHB0ckxwUmVnU2F2ZS0+eFNQUkcyLCBwdHJMcFJlZ1NhdmUtPnhTUFJHMyk7CisJCQlwcmludGYoIiAgICBTYXZlZCBNc3IgID0lLjE2bHggIFNhdmVkIE5pYSAgPSUuMTZseCBcbiIsCisJCQkgICAgICAgcHRyTHBSZWdTYXZlLT54TVNSLCBwdHJMcFJlZ1NhdmUtPnhOSUEpOworCQl9CiAjZW5kaWYKIAogCQlyZXR1cm47CkBAIC0yMDUzLDggKzIwNjgsMTEgQEAKIAl9CiB9CiAKK3R5cGVkZWYgaW50ICgqaW5zdHJ1Y3Rpb25fZHVtcF9mdW5jKSh1bnNpZ25lZCBsb25nIGluc3QsIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKIGludAotcHBjX2luc3RfZHVtcCh1bnNpZ25lZCBsb25nIGFkciwgbG9uZyBjb3VudCwgaW50IHByYWRkcikKK2dlbmVyaWNfaW5zdF9kdW1wKHVuc2lnbmVkIGxvbmcgYWRyLCBsb25nIGNvdW50LCBpbnQgcHJhZGRyLAorCQkJaW5zdHJ1Y3Rpb25fZHVtcF9mdW5jIGR1bXBfZnVuYykKIHsKIAlpbnQgbnIsIGRvdHRlZDsKIAl1bnNpZ25lZCBsb25nIGZpcnN0X2FkcjsKQEAgLTIwODQsMTIgKzIxMDIsMTggQEAKIAkJaWYgKHByYWRkcikKIAkJCXByaW50ZihSRUciICAlLjh4IiwgYWRyLCBpbnN0KTsKIAkJcHJpbnRmKCJcdCIpOwotCQlwcmludF9pbnNuX3Bvd2VycGMoaW5zdCwgYWRyLCAwKTsJLyogYWx3YXlzIHJldHVybnMgNCAqLworCQlkdW1wX2Z1bmMoaW5zdCwgYWRyKTsKIAkJcHJpbnRmKCJcbiIpOwogCX0KIAlyZXR1cm4gYWRyIC0gZmlyc3RfYWRyOwogfQogCitpbnQKK3BwY19pbnN0X2R1bXAodW5zaWduZWQgbG9uZyBhZHIsIGxvbmcgY291bnQsIGludCBwcmFkZHIpCit7CisJcmV0dXJuIGdlbmVyaWNfaW5zdF9kdW1wKGFkciwgY291bnQsIHByYWRkciwgcHJpbnRfaW5zbl9wb3dlcnBjKTsKK30KKwogdm9pZAogcHJpbnRfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CkBAIC0yNTU3LDYgKzI1ODEsMTAgQEAKIAogdm9pZCB4bW9uX2luaXQoaW50IGVuYWJsZSkKIHsKKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcmV0dXJuOworI2VuZGlmCiAJaWYgKGVuYWJsZSkgewogCQlfX2RlYnVnZ2VyID0geG1vbjsKIAkJX19kZWJ1Z2dlcl9pcGkgPSB4bW9uX2lwaTsKQEAgLTI1OTQsNiArMjYyMiwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF94bW9uX3N5c3JxKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCisJCXJldHVybiAwOworI2VuZGlmCiAJcmVnaXN0ZXJfc3lzcnFfa2V5KCd4JywgJnN5c3JxX3htb25fb3ApOwogCXJldHVybiAwOwogfQpAQCAtMjYzMCwzICsyNjYyLDI2MyBAQAogCWlmICh4bW9uX2Vhcmx5KQogCQlkZWJ1Z2dlcihOVUxMKTsKIH0KKworI2lmZGVmIENPTkZJR19TUFVfQkFTRQorCitzdHJ1Y3Qgc3B1X2luZm8geworCXN0cnVjdCBzcHUgKnNwdTsKKwl1NjQgc2F2ZWRfbWZjX3NyMV9SVzsKKwl1MzIgc2F2ZWRfc3B1X3J1bmNudGxfUlc7CisJdW5zaWduZWQgbG9uZyBkdW1wX2FkZHI7CisJdTggc3RvcHBlZF9vazsKK307CisKKyNkZWZpbmUgWE1PTl9OVU1fU1BVUwkxNgkvKiBFbm91Z2ggZm9yIGN1cnJlbnQgaGFyZHdhcmUgKi8KKworc3RhdGljIHN0cnVjdCBzcHVfaW5mbyBzcHVfaW5mb1tYTU9OX05VTV9TUFVTXTsKKwordm9pZCB4bW9uX3JlZ2lzdGVyX3NwdXMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwdSwgbGlzdCwgZnVsbF9saXN0KSB7CisJCWlmIChzcHUtPm51bWJlciA+PSBYTU9OX05VTV9TUFVTKSB7CisJCQlXQVJOX09OKDEpOworCQkJY29udGludWU7CisJCX0KKworCQlzcHVfaW5mb1tzcHUtPm51bWJlcl0uc3B1ID0gc3B1OworCQlzcHVfaW5mb1tzcHUtPm51bWJlcl0uc3RvcHBlZF9vayA9IDA7CisJCXNwdV9pbmZvW3NwdS0+bnVtYmVyXS5kdW1wX2FkZHIgPSAodW5zaWduZWQgbG9uZykKKwkJCQlzcHVfaW5mb1tzcHUtPm51bWJlcl0uc3B1LT5sb2NhbF9zdG9yZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0b3Bfc3B1cyh2b2lkKQoreworCXN0cnVjdCBzcHUgKnNwdTsKKwlpbnQgaTsKKwl1NjQgdG1wOworCisJZm9yIChpID0gMDsgaSA8IFhNT05fTlVNX1NQVVM7IGkrKykgeworCQlpZiAoIXNwdV9pbmZvW2ldLnNwdSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzZXRqbXAoYnVzX2Vycm9yX2ptcCkgPT0gMCkgeworCQkJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDE7CisJCQlzeW5jKCk7CisKKwkJCXNwdSA9IHNwdV9pbmZvW2ldLnNwdTsKKworCQkJc3B1X2luZm9baV0uc2F2ZWRfc3B1X3J1bmNudGxfUlcgPQorCQkJCWluX2JlMzIoJnNwdS0+cHJvYmxlbS0+c3B1X3J1bmNudGxfUlcpOworCisJCQl0bXAgPSBzcHVfbWZjX3NyMV9nZXQoc3B1KTsKKwkJCXNwdV9pbmZvW2ldLnNhdmVkX21mY19zcjFfUlcgPSB0bXA7CisKKwkJCXRtcCAmPSB+TUZDX1NUQVRFMV9NQVNURVJfUlVOX0NPTlRST0xfTUFTSzsKKwkJCXNwdV9tZmNfc3IxX3NldChzcHUsIHRtcCk7CisKKwkJCXN5bmMoKTsKKwkJCV9fZGVsYXkoMjAwKTsKKworCQkJc3B1X2luZm9baV0uc3RvcHBlZF9vayA9IDE7CisKKwkJCXByaW50ZigiU3RvcHBlZCBzcHUgJS4yZCAod2FzICVzKVxuIiwgaSwKKwkJCQkJc3B1X2luZm9baV0uc2F2ZWRfc3B1X3J1bmNudGxfUlcgPworCQkJCQkicnVubmluZyIgOiAic3RvcHBlZCIpOworCQl9IGVsc2UgeworCQkJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDA7CisJCQlwcmludGYoIioqKiBFcnJvciBzdG9wcGluZyBzcHUgJS4yZFxuIiwgaSk7CisJCX0KKwkJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCByZXN0YXJ0X3NwdXModm9pZCkKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWE1PTl9OVU1fU1BVUzsgaSsrKSB7CisJCWlmICghc3B1X2luZm9baV0uc3B1KQorCQkJY29udGludWU7CisKKwkJaWYgKCFzcHVfaW5mb1tpXS5zdG9wcGVkX29rKSB7CisJCQlwcmludGYoIioqKiBFcnJvciwgc3B1ICVkIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IHN0b3BwZWQiCisJCQkJCSIsIG5vdCByZXN0YXJ0aW5nXG4iLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNldGptcChidXNfZXJyb3Jfam1wKSA9PSAwKSB7CisJCQljYXRjaF9tZW1vcnlfZXJyb3JzID0gMTsKKwkJCXN5bmMoKTsKKworCQkJc3B1ID0gc3B1X2luZm9baV0uc3B1OworCQkJc3B1X21mY19zcjFfc2V0KHNwdSwgc3B1X2luZm9baV0uc2F2ZWRfbWZjX3NyMV9SVyk7CisJCQlvdXRfYmUzMigmc3B1LT5wcm9ibGVtLT5zcHVfcnVuY250bF9SVywKKwkJCQkJc3B1X2luZm9baV0uc2F2ZWRfc3B1X3J1bmNudGxfUlcpOworCisJCQlzeW5jKCk7CisJCQlfX2RlbGF5KDIwMCk7CisKKwkJCXByaW50ZigiUmVzdGFydGVkIHNwdSAlLjJkXG4iLCBpKTsKKwkJfSBlbHNlIHsKKwkJCWNhdGNoX21lbW9yeV9lcnJvcnMgPSAwOworCQkJcHJpbnRmKCIqKiogRXJyb3IgcmVzdGFydGluZyBzcHUgJS4yZFxuIiwgaSk7CisJCX0KKwkJY2F0Y2hfbWVtb3J5X2Vycm9ycyA9IDA7CisJfQorfQorCisjZGVmaW5lIERVTVBfV0lEVEgJMjMKKyNkZWZpbmUgRFVNUF9WQUxVRShmb3JtYXQsIGZpZWxkLCB2YWx1ZSkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoc2V0am1wKGJ1c19lcnJvcl9qbXApID09IDApIHsJCQkJXAorCQljYXRjaF9tZW1vcnlfZXJyb3JzID0gMTsJCQkJXAorCQlzeW5jKCk7CQkJCQkJCVwKKwkJcHJpbnRmKCIgICUtKnMgPSAiZm9ybWF0IlxuIiwgRFVNUF9XSURUSCwJCVwKKwkJCQkjZmllbGQsIHZhbHVlKTsJCQkJXAorCQlzeW5jKCk7CQkJCQkJCVwKKwkJX19kZWxheSgyMDApOwkJCQkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCWNhdGNoX21lbW9yeV9lcnJvcnMgPSAwOwkJCQlcCisJCXByaW50ZigiICAlLSpzID0gKioqIEVycm9yIHJlYWRpbmcgZmllbGQuXG4iLAkJXAorCQkJCQlEVU1QX1dJRFRILCAjZmllbGQpOwkJXAorCX0JCQkJCQkJCVwKKwljYXRjaF9tZW1vcnlfZXJyb3JzID0gMDsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFVNUF9GSUVMRChvYmosIGZvcm1hdCwgZmllbGQpCVwKKwlEVU1QX1ZBTFVFKGZvcm1hdCwgZmllbGQsIG9iai0+ZmllbGQpCisKK3N0YXRpYyB2b2lkIGR1bXBfc3B1X2ZpZWxkcyhzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcHJpbnRmKCJEdW1waW5nIHNwdSBmaWVsZHMgYXQgYWRkcmVzcyAlcDpcbiIsIHNwdSk7CisKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JXgiLCBudW1iZXIpOworCURVTVBfRklFTEQoc3B1LCAiJXMiLCBuYW1lKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JWx4IiwgbG9jYWxfc3RvcmVfcGh5cyk7CisJRFVNUF9GSUVMRChzcHUsICIweCVwIiwgbG9jYWxfc3RvcmUpOworCURVTVBfRklFTEQoc3B1LCAiMHglbHgiLCBsc19zaXplKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JXgiLCBub2RlKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JWx4IiwgZmxhZ3MpOworCURVTVBfRklFTEQoc3B1LCAiMHglbHgiLCBkYXIpOworCURVTVBfRklFTEQoc3B1LCAiMHglbHgiLCBkc2lzcik7CisJRFVNUF9GSUVMRChzcHUsICIlZCIsIGNsYXNzXzBfcGVuZGluZyk7CisJRFVNUF9GSUVMRChzcHUsICIweCVseCIsIGlycXNbMF0pOworCURVTVBfRklFTEQoc3B1LCAiMHglbHgiLCBpcnFzWzFdKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JWx4IiwgaXJxc1syXSk7CisJRFVNUF9GSUVMRChzcHUsICIweCV4Iiwgc2xiX3JlcGxhY2UpOworCURVTVBfRklFTEQoc3B1LCAiJWQiLCBwaWQpOworCURVTVBfRklFTEQoc3B1LCAiJWQiLCBwcmlvKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JXAiLCBtbSk7CisJRFVNUF9GSUVMRChzcHUsICIweCVwIiwgY3R4KTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JXAiLCBycSk7CisJRFVNUF9GSUVMRChzcHUsICIweCVwIiwgdGltZXN0YW1wKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JWx4IiwgcHJvYmxlbV9waHlzKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JXAiLCBwcm9ibGVtKTsKKwlEVU1QX1ZBTFVFKCIweCV4IiwgcHJvYmxlbS0+c3B1X3J1bmNudGxfUlcsCisJCQlpbl9iZTMyKCZzcHUtPnByb2JsZW0tPnNwdV9ydW5jbnRsX1JXKSk7CisJRFVNUF9WQUxVRSgiMHgleCIsIHByb2JsZW0tPnNwdV9zdGF0dXNfUiwKKwkJCWluX2JlMzIoJnNwdS0+cHJvYmxlbS0+c3B1X3N0YXR1c19SKSk7CisJRFVNUF9WQUxVRSgiMHgleCIsIHByb2JsZW0tPnNwdV9ucGNfUlcsCisJCQlpbl9iZTMyKCZzcHUtPnByb2JsZW0tPnNwdV9ucGNfUlcpKTsKKwlEVU1QX0ZJRUxEKHNwdSwgIjB4JXAiLCBwcml2Mik7CisJRFVNUF9GSUVMRChzcHUsICIweCVwIiwgcGRhdGEpOworfQorCitpbnQKK3NwdV9pbnN0X2R1bXAodW5zaWduZWQgbG9uZyBhZHIsIGxvbmcgY291bnQsIGludCBwcmFkZHIpCit7CisJcmV0dXJuIGdlbmVyaWNfaW5zdF9kdW1wKGFkciwgY291bnQsIHByYWRkciwgcHJpbnRfaW5zbl9zcHUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3NwdV9scyh1bnNpZ25lZCBsb25nIG51bSwgaW50IHN1YmNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgYWRkciwgbHNfYWRkcjsKKworCWlmIChzZXRqbXAoYnVzX2Vycm9yX2ptcCkgPT0gMCkgeworCQljYXRjaF9tZW1vcnlfZXJyb3JzID0gMTsKKwkJc3luYygpOworCQlsc19hZGRyID0gKHVuc2lnbmVkIGxvbmcpc3B1X2luZm9bbnVtXS5zcHUtPmxvY2FsX3N0b3JlOworCQlzeW5jKCk7CisJCV9fZGVsYXkoMjAwKTsKKwl9IGVsc2UgeworCQljYXRjaF9tZW1vcnlfZXJyb3JzID0gMDsKKwkJcHJpbnRmKCIqKiogRXJyb3I6IGFjY2Vzc2luZyBzcHUgaW5mbyBmb3Igc3B1ICVkXG4iLCBudW0pOworCQlyZXR1cm47CisJfQorCWNhdGNoX21lbW9yeV9lcnJvcnMgPSAwOworCisJaWYgKHNjYW5oZXgoJm9mZnNldCkpCisJCWFkZHIgPSBsc19hZGRyICsgb2Zmc2V0OworCWVsc2UKKwkJYWRkciA9IHNwdV9pbmZvW251bV0uZHVtcF9hZGRyOworCisJaWYgKGFkZHIgPj0gbHNfYWRkciArIExTX1NJWkUpIHsKKwkJcHJpbnRmKCIqKiogRXJyb3I6IGFkZHJlc3Mgb3V0c2lkZSBvZiBsb2NhbCBzdG9yZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKHN1YmNtZCkgeworCWNhc2UgJ2knOgorCQlhZGRyICs9IHNwdV9pbnN0X2R1bXAoYWRkciwgMTYsIDEpOworCQlsYXN0X2NtZCA9ICJzZGlcbiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByZHVtcChhZGRyLCA2NCk7CisJCWFkZHIgKz0gNjQ7CisJCWxhc3RfY21kID0gInNkXG4iOworCQlicmVhazsKKwl9CisKKwlzcHVfaW5mb1tudW1dLmR1bXBfYWRkciA9IGFkZHI7Cit9CisKK3N0YXRpYyBpbnQgZG9fc3B1X2NtZCh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIG51bSA9IDA7CisJaW50IGNtZCwgc3ViY21kID0gMDsKKworCWNtZCA9IGluY2hhcigpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSAncyc6CisJCXN0b3Bfc3B1cygpOworCQlicmVhazsKKwljYXNlICdyJzoKKwkJcmVzdGFydF9zcHVzKCk7CisJCWJyZWFrOworCWNhc2UgJ2QnOgorCQlzdWJjbWQgPSBpbmNoYXIoKTsKKwkJaWYgKGlzeGRpZ2l0KHN1YmNtZCkgfHwgc3ViY21kID09ICdcbicpCisJCQl0ZXJtY2ggPSBzdWJjbWQ7CisJY2FzZSAnZic6CisJCXNjYW5oZXgoJm51bSk7CisJCWlmIChudW0gPj0gWE1PTl9OVU1fU1BVUyB8fCAhc3B1X2luZm9bbnVtXS5zcHUpIHsKKwkJCXByaW50ZigiKioqIEVycm9yOiBpbnZhbGlkIHNwdSBudW1iZXJcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlICdmJzoKKwkJCWR1bXBfc3B1X2ZpZWxkcyhzcHVfaW5mb1tudW1dLnNwdSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWR1bXBfc3B1X2xzKG51bSwgc3ViY21kKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UgLyogISBDT05GSUdfU1BVX0JBU0UgKi8KK3N0YXRpYyBpbnQgZG9fc3B1X2NtZCh2b2lkKQoreworCXJldHVybiAtMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvLmdpdGlnbm9yZSBiL2FyY2gvcHBjLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhODY5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAoraW5jbHVkZQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvODI2MF9pby9mY2NfZW5ldC5jIGIvYXJjaC9wcGMvODI2MF9pby9mY2NfZW5ldC5jCmluZGV4IDJlMTk0M2UuLjA2Yjg0YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzgyNjBfaW8vZmNjX2VuZXQuYworKysgYi9hcmNoL3BwYy84MjYwX2lvL2ZjY19lbmV0LmMKQEAgLTM4NSw2ICszODUsNyBAQAogCXBoeV9pbmZvX3QJKnBoeTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcGh5X3JlbGluazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcGh5X2Rpc3BsYXlfY29uZmlnOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKIAl1aW50CXNlcXVlbmNlX2RvbmU7CiAKQEAgLTEzOTEsMTAgKzEzOTIsMTEgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgdm9pZCBtaWlfZGlzcGxheV9zdGF0dXModm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIG1paV9kaXNwbGF5X3N0YXR1cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jdm9sYXRpbGUgc3RydWN0IGZjY19lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgZmNjX2VuZXRfcHJpdmF0ZSAqZmVwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY2NfZW5ldF9wcml2YXRlLCBwaHlfcmVsaW5rKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmVwLT5kZXY7CiAJdWludCBzID0gZmVwLT5waHlfc3RhdHVzOwogCiAJaWYgKCFmZXAtPmxpbmsgJiYgIWZlcC0+b2xkX2xpbmspIHsKQEAgLTE0MjgsMTAgKzE0MzAsMTIgQEAKIAlwcmludGsoIi5cbiIpOwogfQogCi1zdGF0aWMgdm9pZCBtaWlfZGlzcGxheV9jb25maWcodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIG1paV9kaXNwbGF5X2NvbmZpZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jdm9sYXRpbGUgc3RydWN0IGZjY19lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgZmNjX2VuZXRfcHJpdmF0ZSAqZmVwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY2NfZW5ldF9wcml2YXRlLAorCQkJICAgICBwaHlfZGlzcGxheV9jb25maWcpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmZXAtPmRldjsKIAl1aW50IHMgPSBmZXAtPnBoeV9zdGF0dXM7CiAKIAlwcmludGsoIiVzOiBjb25maWc6IGF1dG8tbmVnb3RpYXRpb24gIiwgZGV2LT5uYW1lKTsKQEAgLTE3NTgsOCArMTc2Miw5IEBACiAJCWNlcC0+cGh5X2lkX2RvbmUgPSAwOwogCQljZXAtPnBoeV9hZGRyID0gZmlwLT5mY19waHlhZGRyOwogCQltaWlfcXVldWUoZGV2LCBta19taWlfcmVhZChNSUlfUEhZU0lEMSksIG1paV9kaXNjb3Zlcl9waHkpOwotCQlJTklUX1dPUksoJmNlcC0+cGh5X3JlbGluaywgbWlpX2Rpc3BsYXlfc3RhdHVzLCBkZXYpOwotCQlJTklUX1dPUksoJmNlcC0+cGh5X2Rpc3BsYXlfY29uZmlnLCBtaWlfZGlzcGxheV9jb25maWcsIGRldik7CisJCUlOSVRfV09SSygmY2VwLT5waHlfcmVsaW5rLCBtaWlfZGlzcGxheV9zdGF0dXMpOworCQlJTklUX1dPUksoJmNlcC0+cGh5X2Rpc3BsYXlfY29uZmlnLCBtaWlfZGlzcGxheV9jb25maWcpOworCQljZXAtPmRldiA9IGRldjsKICNlbmRpZgkvKiBDT05GSUdfVVNFX01ESU8gKi8KIAogCQlmaXArKzsKQEAgLTE4ODcsMTAgKzE4OTIsMTAgQEAKIAkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyBmcm9tIHJlZ3VsYXIgbWVtb3J5LgogCSAqIEluaXRpYWxpemUgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMuCiAJICovCi0JY2VwLT5yeF9iZF9iYXNlID0gKGNiZF90ICopa21hbGxvYyhzaXplb2YoY2JkX3QpICogUlhfUklOR19TSVpFLAorCWNlcC0+cnhfYmRfYmFzZSA9IGttYWxsb2Moc2l6ZW9mKGNiZF90KSAqIFJYX1JJTkdfU0laRSwKIAkJCUdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAllcC0+ZmVuX2dlbmZjYy5mY2NfcmJhc2UgPSBfX3BhKGNlcC0+cnhfYmRfYmFzZSk7Ci0JY2VwLT50eF9iZF9iYXNlID0gKGNiZF90ICopa21hbGxvYyhzaXplb2YoY2JkX3QpICogVFhfUklOR19TSVpFLAorCWNlcC0+dHhfYmRfYmFzZSA9IGttYWxsb2Moc2l6ZW9mKGNiZF90KSAqIFRYX1JJTkdfU0laRSwKIAkJCUdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAllcC0+ZmVuX2dlbmZjYy5mY2NfdGJhc2UgPSBfX3BhKGNlcC0+dHhfYmRfYmFzZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzh4eF9pby9jczQyMThfdGRtLmMgYi9hcmNoL3BwYy84eHhfaW8vY3M0MjE4X3RkbS5jCmluZGV4IDk1OWQzMWMuLmI3YmI1ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzh4eF9pby9jczQyMThfdGRtLmMKKysrIGIvYXJjaC9wcGMvOHh4X2lvL2NzNDIxOF90ZG0uYwpAQCAtMjE2NSw3ICsyMTY1LDcgQEAKIAlpbnQgcmMgPSAwOwogCiAJaWYgKHNxLmJ1c3kpCi0JCXJjID0gc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9kZW50cnkpOworCQlyYyA9IHNxX2ZzeW5jKGZpbGUsIGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCXNvdW5kLnNvZnQgPSBzb3VuZC5kc3A7CiAJc291bmQuaGFyZCA9IHNvdW5kLmRzcDsKIAlzb3VuZF9zaWxlbmNlKCk7CkBAIC0yMjE4LDI1ICsyMjE4LDI1IEBACiAJCXJldHVybiAwOwogCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgogCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlyZXR1cm4gc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9kZW50cnkpOworCQlyZXR1cm4gc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAKIAkJLyogKytUZVNjaGU6IGJlZm9yZSBjaGFuZ2luZyBhbnkgb2YgdGhlc2UgaXQncwogCQkgKiBwcm9iYWJseSB3aXNlIHRvIHdhaXQgdW50aWwgc291bmQgcGxheWluZyBoYXMKIAkJICogc2V0dGxlZCBkb3duLiAqLwogCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKLQkJc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9kZW50cnkpOworCQlzcV9mc3luYyhmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAkJSU9DVExfSU4oYXJnLCBkYXRhKTsKIAkJcmV0dXJuIElPQ1RMX09VVChhcmcsIHNvdW5kX3NldF9zcGVlZChkYXRhKSk7CiAJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKLQkJc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9kZW50cnkpOworCQlzcV9mc3luYyhmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAkJSU9DVExfSU4oYXJnLCBkYXRhKTsKIAkJcmV0dXJuIElPQ1RMX09VVChhcmcsIHNvdW5kX3NldF9zdGVyZW8oZGF0YSkpOwogCWNhc2UgU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTOgotCQlzcV9mc3luYyhmaWxlLCBmaWxlLT5mX2RlbnRyeSk7CisJCXNxX2ZzeW5jKGZpbGUsIGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCQlJT0NUTF9JTihhcmcsIGRhdGEpOwogCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgc291bmRfc2V0X3N0ZXJlbyhkYXRhLTEpKzEpOwogCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6Ci0JCXNxX2ZzeW5jKGZpbGUsIGZpbGUtPmZfZGVudHJ5KTsKKwkJc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CiAJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBzb3VuZF9zZXRfZm9ybWF0KGRhdGEpKTsKIAljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKQEAgLTI2MDEsNyArMjYwMSw3IEBACiAJLyogSW5pdGlhbGl6ZSBiZWVwIHN0dWZmICovCiAJb3JpZ19ta3NvdW5kID0ga2RfbWtzb3VuZDsKIAlrZF9ta3NvdW5kID0gY3NfbWtzb3VuZDsKLQliZWVwX2J1ZiA9IChzaG9ydCAqKSBrbWFsbG9jKEJFRVBfQlVGTEVOICogNCwgR0ZQX0tFUk5FTCk7CisJYmVlcF9idWYgPSBrbWFsbG9jKEJFRVBfQlVGTEVOICogNCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJlZXBfYnVmID09IE5VTEwpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImRtYXNvdW5kOiBubyBtZW1vcnkgZm9yICIKIAkJICAgICAgICJiZWVwIGJ1ZmZlclxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy84eHhfaW8vZmVjLmMgYi9hcmNoL3BwYy84eHhfaW8vZmVjLmMKaW5kZXggMmY5ZmE5ZS4uZTZjMjhmYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvOHh4X2lvL2ZlYy5jCisrKyBiL2FyY2gvcHBjLzh4eF9pby9mZWMuYwpAQCAtMTczLDYgKzE3Myw3IEBACiAJdWludAlwaHlfc3BlZWQ7CiAJcGh5X2luZm9fdAkqcGh5OwogCXN0cnVjdCB3b3JrX3N0cnVjdCBwaHlfdGFzazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCiAJdWludAlzZXF1ZW5jZV9kb25lOwogCkBAIC0xMjYzLDEwICsxMjY0LDExIEBACiAJcHJpbnRrKCIuXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgbWlpX2Rpc3BsYXlfY29uZmlnKHZvaWQgKnByaXYpCitzdGF0aWMgdm9pZCBtaWlfZGlzcGxheV9jb25maWcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwcml2OwotCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSwgcGh5X3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmZXAtPmRldjsKIAl2b2xhdGlsZSB1aW50ICpzID0gJihmZXAtPnBoeV9zdGF0dXMpOwogCiAJcHJpbnRrKCIlczogY29uZmlnOiBhdXRvLW5lZ290aWF0aW9uICIsIGRldi0+bmFtZSk7CkBAIC0xMjk1LDEwICsxMjk3LDExIEBACiAJZmVwLT5zZXF1ZW5jZV9kb25lID0gMTsKIH0KIAotc3RhdGljIHZvaWQgbWlpX3JlbGluayh2b2lkICpwcml2KQorc3RhdGljIHZvaWQgbWlpX3JlbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXByaXY7Ci0Jc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmZWNfZW5ldF9wcml2YXRlLCBwaHlfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZlcC0+ZGV2OwogCWludCBkdXBsZXg7CiAKIAlmZXAtPmxpbmsgPSAoZmVwLT5waHlfc3RhdHVzICYgUEhZX1NUQVRfTElOSykgPyAxIDogMDsKQEAgLTEzMjUsNyArMTMyOCw4IEBACiB7CiAJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKIAotCUlOSVRfV09SSygmZmVwLT5waHlfdGFzaywgbWlpX3JlbGluaywgKHZvaWQgKilkZXYpOworCWZlcC0+ZGV2ID0gZGV2OworCUlOSVRfV09SSygmZmVwLT5waHlfdGFzaywgbWlpX3JlbGluayk7CiAJc2NoZWR1bGVfd29yaygmZmVwLT5waHlfdGFzayk7CiB9CiAKQEAgLTEzMzMsNyArMTMzNyw4IEBACiB7CiAJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKIAotCUlOSVRfV09SSygmZmVwLT5waHlfdGFzaywgbWlpX2Rpc3BsYXlfY29uZmlnLCAodm9pZCAqKWRldik7CisJZmVwLT5kZXYgPSBkZXY7CisJSU5JVF9XT1JLKCZmZXAtPnBoeV90YXNrLCBtaWlfZGlzcGxheV9jb25maWcpOwogCXNjaGVkdWxlX3dvcmsoJmZlcC0+cGh5X3Rhc2spOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9LY29uZmlnIGIvYXJjaC9wcGMvS2NvbmZpZwppbmRleCAwNzc3MTFlLi44ZWI4MmVmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9LY29uZmlnCisrKyBiL2FyY2gvcHBjL0tjb25maWcKQEAgLTE5LDYgKzE5LDE0IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgR0VORVJJQ19IV0VJR0hUCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtNTIsNiArNjAsMTEgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX0JVRworCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJVRworCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogbWVudSAiUHJvY2Vzc29yIgpAQCAtNzcsOSArOTAsMTEgQEAKIAogY29uZmlnIDQweAogCWJvb2wgIjQweCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKIAogY29uZmlnIDQ0eAogCWJvb2wgIjQ0eCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKIAogY29uZmlnIDh4eAogCWJvb2wgIjh4eCIKQEAgLTk1LDYgKzExMCwxNSBAQAogY29uZmlnIFBQQ19GUFUKIAlib29sCiAKK2NvbmZpZyBQUENfRENSX05BVElWRQorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIFBQQ19EQ1IKKwlib29sCisJZGVwZW5kcyBvbiBQUENfRENSX05BVElWRQorCWRlZmF1bHQgeQorCiBjb25maWcgQk9PS0UKIAlib29sCiAJZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAKQEAgLTYwMCw3ICs2MjQsNyBAQAogCSAgU2VsZWN0IEhEUFUgaWYgY29uZmlndXJpbmcgYSBTa3kgQ29tcHV0ZXJzIENvbXB1dGUgQmxhZGUuCiAKIGNvbmZpZyBIRFBVX0ZFQVRVUkVTCi0JZGVwZW5kcyBIRFBVCisJZGVwZW5kcyBvbiBIRFBVCiAJdHJpc3RhdGUgIkhEUFUtRmVhdHVyZXMiCiAJaGVscAogCSAgU2VsZWN0IHRvIGVuYWJsZSBIRFBVIGVuaGFuY2VkIGZlYXR1cmVzLgpAQCAtNzExLDcgKzczNSw3IEBACiAKIGNvbmZpZyBMSVRFNTIwMEIKIAlib29sICJGcmVlc2NhbGUgTElURTUyMDBCIgotCWRlcGVuZHMgTElURTUyMDAKKwlkZXBlbmRzIG9uIExJVEU1MjAwCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIExJVEU1MjAwQiBkZXYgYm9hcmQgZm9yIHRoZSBNUEM1MjAwIGZyb20gRnJlZXNjYWxlLgogCSAgVGhpcyBpcyB0aGUgbmV3IGJvYXJkIHdpdGggMiBQQ0kgc2xvdHMuCkBAIC03MjQsNyArNzQ4LDcgQEAKIAkgIEJlIGF3YXJlIHRoYXQgUENJIGJ1c2VzIGNhbiBvbmx5IGZ1bmN0aW9uIHdoZW4gU1lTIGJvYXJkIGlzIHBsdWdnZWQKIAkgIGludG8gdGhlIFBJQiAoUGxhdGZvcm0gSU8gQm9hcmQpIGJvYXJkIGZyb20gRnJlZXNjYWxlIHdoaWNoIHByb3ZpZGUKIAkgIDMgUENJIHNsb3RzLiAgVGhlIFBJQnMgUENJIGluaXRpYWxpemF0aW9uIGlzIHRoZSBib290bG9hZGVyJ3MKLQkgIHJlc3BvbnNpYmxpbHR5LgorCSAgcmVzcG9uc2liaWxpdHkuCiAKIGNvbmZpZyBFVjY0MzYwCiAJYm9vbCAiTWFydmVsbC1FVjY0MzYwQlAiCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L2ltYWdlcy8uZ2l0aWdub3JlIGIvYXJjaC9wcGMvYm9vdC9pbWFnZXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWMyZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvYm9vdC9pbWFnZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDYgQEAKK3NJbWFnZQordm1hcHVzCit2bWxpbnV4KgorbWlib290KgorekltYWdlKgordUltYWdlCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L2xpYi8uZ2l0aWdub3JlIGIvYXJjaC9wcGMvYm9vdC9saWIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjI5YTYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvYm9vdC9saWIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKK2luZmZhc3QuYworaW5mbGF0ZS5jCitpbmZ0cmVlcy5jCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9yZWxvY2F0ZS5TIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvcmVsb2NhdGUuUwppbmRleCAwYzAyMTU1Li4xYmJiY2QyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9ib290L3NpbXBsZS9yZWxvY2F0ZS5TCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL3JlbG9jYXRlLlMKQEAgLTE1NCw4ICsxNTQsOCBAQAogCiBzdGFydF9sZHI6CiAvKiBDbGVhciBhbGwgb2YgQlNTIGFuZCBzZXQgdXAgc3RhY2sgZm9yIEMgY2FsbHMgKi8KLQlsaXMJcjMsZWRhdGFAaAotCW9yaQlyMyxyMyxlZGF0YUBsCisJbGlzCXIzLF9fYnNzX3N0YXJ0QGgKKwlvcmkJcjMscjMsX19ic3Nfc3RhcnRAbAogCWxpcwlyNCxlbmRAaAogCW9yaQlyNCxyNCxlbmRAbAogCXN1YmkJcjMscjMsNApAQCAtMTYzLDcgKzE2Myw3IEBACiAJbGkJcjAsMAogNTA6CXN0d3UJcjAsNChyMykKIAljbXB3CWNyMCxyMyxyNAotCWJuZQk1MGIKKwlibHQJNTBiCiA5MDoJbXIJcjkscjEJCS8qIFNhdmUgb2xkIHN0YWNrIHBvaW50ZXIgKGluIGNhc2UgaXQgbWF0dGVycykgKi8KIAlsaXMJcjEsLnN0YWNrQGgKIAlvcmkJcjEscjEsLnN0YWNrQGwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3QvdXRpbHMvLmdpdGlnbm9yZSBiL2FyY2gvcHBjL2Jvb3QvdXRpbHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmRmYjNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvYm9vdC91dGlscy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorbWtwcmVwCitta2J1Z2Jvb3QKK21rdHJlZQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL21pc2MuUyBiL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKaW5kZXggNWY2Njg0MC4uZDMxOWY5YiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL21pc2MuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCkBAIC0xMTAsODAgKzExMCw2IEBACiAJYmxyCiAKIC8qCi0gKiBpZGVudGlmeV9jcHUsCi0gKiBjYWxsZWQgd2l0aCByMyA9IGRhdGEgb2Zmc2V0IGFuZCByNCA9IENQVSBudW1iZXIKLSAqIGRvZXNuJ3QgY2hhbmdlIHIzCi0gKi8KLV9HTE9CQUwoaWRlbnRpZnlfY3B1KQotCWFkZGlzCXI4LHIzLGNwdV9zcGVjc0BoYQotCWFkZGkJcjgscjgsY3B1X3NwZWNzQGwKLQltZnB2cglyNwotMToKLQlsd3oJcjUsQ1BVX1NQRUNfUFZSX01BU0socjgpCi0JYW5kCXI1LHI1LHI3Ci0JbHd6CXI2LENQVV9TUEVDX1BWUl9WQUxVRShyOCkKLQljbXBsdwkwLHI2LHI1Ci0JYmVxCTFmCi0JYWRkaQlyOCxyOCxDUFVfU1BFQ19FTlRSWV9TSVpFCi0JYgkxYgotMToKLQlhZGRpcwlyNixyMyxjdXJfY3B1X3NwZWNAaGEKLQlhZGRpCXI2LHI2LGN1cl9jcHVfc3BlY0BsCi0Jc3ViCXI4LHI4LHIzCi0Jc3R3CXI4LDAocjYpCi0JYmxyCi0KLS8qCi0gKiBkb19jcHVfZnRyX2ZpeHVwcyAtIGdvZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiBDUFUgZmVhdHVyZSBmaXh1cHMKLSAqIGFuZCB3cml0ZXMgbm9wJ3Mgb3ZlciBzZWN0aW9ucyBvZiBjb2RlIHRoYXQgZG9uJ3QgYXBwbHkgZm9yIHRoaXMgY3B1LgotICogcjMgPSBkYXRhIG9mZnNldCAobm90IGNoYW5nZWQpCi0gKi8KLV9HTE9CQUwoZG9fY3B1X2Z0cl9maXh1cHMpCi0JLyogR2V0IENQVSAwIGZlYXR1cmVzICovCi0JYWRkaXMJcjYscjMsY3VyX2NwdV9zcGVjQGhhCi0JYWRkaQlyNixyNixjdXJfY3B1X3NwZWNAbAotCWx3eglyNCwwKHI2KQotCWFkZAlyNCxyNCxyMwotCWx3eglyNCxDUFVfU1BFQ19GRUFUVVJFUyhyNCkKLQotCS8qIEdldCB0aGUgZml4dXAgdGFibGUgKi8KLQlhZGRpcwlyNixyMyxfX3N0YXJ0X19fZnRyX2ZpeHVwQGhhCi0JYWRkaQlyNixyNixfX3N0YXJ0X19fZnRyX2ZpeHVwQGwKLQlhZGRpcwlyNyxyMyxfX3N0b3BfX19mdHJfZml4dXBAaGEKLQlhZGRpCXI3LHI3LF9fc3RvcF9fX2Z0cl9maXh1cEBsCi0KLQkvKiBEbyB0aGUgZml4dXAgKi8KLTE6CWNtcGx3CTAscjYscjcKLQliZ2VscgotCWFkZGkJcjYscjYsMTYKLQlsd3oJcjgsLTE2KHI2KQkvKiBtYXNrICovCi0JYW5kCXI4LHI4LHI0Ci0JbHd6CXI5LC0xMihyNikJLyogdmFsdWUgKi8KLQljbXBsdwkwLHI4LHI5Ci0JYmVxCTFiCi0JbHd6CXI4LC04KHI2KQkvKiBzZWN0aW9uIGJlZ2luICovCi0JbHd6CXI5LC00KHI2KQkvKiBzZWN0aW9uIGVuZCAqLwotCXN1YmYuCXI5LHI4LHI5Ci0JYmVxCTFiCi0JLyogd3JpdGUgbm9wcyBvdmVyIHRoZSBzZWN0aW9uIG9mIGNvZGUgKi8KLQkvKiB0b2RvOiBpZiBsYXJnZSBzZWN0aW9uLCBhZGQgYSBicmFuY2ggYXQgdGhlIHN0YXJ0IG9mIGl0ICovCi0Jc3J3aQlyOSxyOSwyCi0JbXRjdHIJcjkKLQlhZGQJcjgscjgscjMKLQlsaXMJcjAsMHg2MDAwMDAwMEBoCS8qIG5vcCAqLwotMzoJc3R3CXIwLDAocjgpCi0JYW5kaS4JcjEwLHI0LENQVV9GVFJfU1BMSVRfSURfQ0FDSEVAbAotCWJlcQkyZgotCWRjYnN0CTAscjgJCS8qIHN1Ym9wdGltYWwsIGJ1dCBzaW1wbGVyICovCi0Jc3luYwotCWljYmkJMCxyOAotMjoJYWRkaQlyOCxyOCw0Ci0JYmRuegkzYgotCXN5bmMJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMKLQliCTFiCi0KLS8qCiAgKiBjYWxsX3NldHVwX2NwdSAtIGNhbGwgdGhlIHNldHVwX2NwdSBmdW5jdGlvbiBmb3IgdGhpcyBjcHUKICAqIHIzID0gZGF0YSBvZmZzZXQsIHIyNCA9IGNwdSBudW1iZXIKICAqCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3BwYy9rZXJuZWwvcGNpLmMKaW5kZXggNjM4MDhlMC4uNWU3MjNjNCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9wY2kuYwpAQCAtODc5LDcgKzg3OSw3IEBACiAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX19wY2lfbW1hcF9tYWtlX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqb2Zmc2V0LAorCQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90ICpvZmZzZXQsCiAJCQkJCSAgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGRldi0+YnVzLT5udW1iZXIpOwpAQCAtODkxLDcgKzg5MSw5IEBACiAKIAkvKiBJZiBtZW1vcnksIGFkZCBvbiB0aGUgUENJIGJyaWRnZSBhZGRyZXNzIG9mZnNldCAqLwogCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX21lbSkgeworI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gcGNpX3Jlc291cmNlX3RvX3VzZXIoKSBmb3Igd2h5IHRoaXMgaXMgZGlzYWJsZWQgKi8KIAkJKm9mZnNldCArPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKyNlbmRpZgogCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07CiAJfSBlbHNlIHsKIAkJaW9fb2Zmc2V0ID0gaG9zZS0+aW9fYmFzZV92aXJ0IC0gX19fSU9fQkFTRTsKQEAgLTEwMzAsNyArMTAzMiw3IEBACiAJCQllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsCiAJCQlpbnQgd3JpdGVfY29tYmluZSkKIHsKLQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwogCXN0cnVjdCByZXNvdXJjZSAqcnA7CiAJaW50IHJldDsKIApAQCAtMTEzMiwyMSArMTEzNCw0MiBAQAogCQkJICByZXNvdXJjZV9zaXplX3QgKnN0YXJ0LCByZXNvdXJjZV9zaXplX3QgKmVuZCkKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoZGV2LT5idXMtPm51bWJlcik7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSAwOwogCiAJaWYgKGhvc2UgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJb2Zmc2V0ID0gX19fSU9fQkFTRSAtIGhvc2UtPmlvX2Jhc2VfdmlydCArIGhvc2UtPmlvX2Jhc2VfcGh5czsKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CiAKLQkqc3RhcnQgPSByc3JjLT5zdGFydCArIG9mZnNldDsKLQkqZW5kID0gcnNyYy0+ZW5kICsgb2Zmc2V0OworCS8qIFdlIHBhc3MgYSBmdWxseSBmaXhlZCB1cCBhZGRyZXNzIHRvIHVzZXJsYW5kIGZvciBNTUlPIGluc3RlYWQgb2YKKwkgKiBhIEJBUiB2YWx1ZSBiZWNhdXNlIFggaXMgbGFtZSBhbmQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHVzZSB0aGF0CisJICogdG8gcGFzcyB0byAvZGV2L21lbSAhCisJICoKKwkgKiBUaGF0IG1lYW5zIHRoYXQgd2UnbGwgaGF2ZSBwb3RlbnRpYWxseSA2NCBiaXRzIHZhbHVlcyB3aGVyZSBzb21lCisJICogdXNlcmxhbmQgYXBwcyBvbmx5IGV4cGVjdCAzMiAobGlrZSBYIGl0c2VsZiBzaW5jZSBpdCB0aGlua3Mgb25seQorCSAqIFNwYXJjIGhhcyA2NCBiaXRzIE1NSU8pIGJ1dCBpZiB3ZSBkb24ndCBkbyB0aGF0LCB3ZSBicmVhayBpdCBvbgorCSAqIDMyIGJpdHMgQ0hSUHMgOi0oCisJICoKKwkgKiBIb3BlZnVsbHksIHRoZSBzeXNmcyBpbnN0ZXJmYWNlIGlzIGltbXVuZSB0byB0aGF0IGd1bmsuIE9uY2UgWAorCSAqIGhhcyBiZWVuIGZpeGVkIChhbmQgdGhlIGZpeCBzcHJlYWQgZW5vdWdoKSwgd2UgY2FuIHJlLWVuYWJsZSB0aGUKKwkgKiAyIGxpbmVzIGJlbG93IGFuZCBwYXNzIGRvd24gYSBCQVIgdmFsdWUgdG8gdXNlcmxhbmQuIEluIHRoYXQgY2FzZQorCSAqIHdlJ2xsIGFsc28gaGF2ZSB0byByZS1lbmFibGUgdGhlIG1hdGNoaW5nIGNvZGUgaW4KKwkgKiBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KCkuCisJICoKKwkgKiBCZW5ILgorCSAqLworI2lmIDAKKwllbHNlIGlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKyNlbmRpZgorCisJKnN0YXJ0ID0gcnNyYy0+c3RhcnQgLSBvZmZzZXQ7CisJKmVuZCA9IHJzcmMtPmVuZCAtIG9mZnNldDsKIH0KIAotdm9pZCBfX2luaXQKLXBjaV9pbml0X3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKLQkJICBpbnQgZmxhZ3MsIGNoYXIgKm5hbWUpCit2b2lkIF9faW5pdCBwY2lfaW5pdF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAorCQkJICAgICAgcmVzb3VyY2Vfc2l6ZV90IGVuZCwgaW50IGZsYWdzLCBjaGFyICpuYW1lKQogewogCXJlcy0+c3RhcnQgPSBzdGFydDsKIAlyZXMtPmVuZCA9IGVuZDsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKaW5kZXggNzVmZTEzOC4uM2M1MDZhZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vbnZyYW0uaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgogI2luY2x1ZGUgPGFzbS9vY3AuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiAjZGVmaW5lIFVTRVNfUFBDX1NZUyAoZGVmaW5lZChDT05GSUdfODV4eCkgfHwgZGVmaW5lZChDT05GSUdfODN4eCkgfHwgXAogCQkgICAgICBkZWZpbmVkKENPTkZJR19NUEMxMFhfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR184MjYwKSB8fCBcCkBAIC01Myw4ICs1NCw2IEBACiAKIGV4dGVybiB2b2lkIHBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwKIAkJdW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNyk7Ci1leHRlcm4gdm9pZCBpZGVudGlmeV9jcHUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgY3B1KTsKLWV4dGVybiB2b2lkIGRvX2NwdV9mdHJfZml4dXBzKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKIGV4dGVybiB2b2lkIHJlbG9jX2dvdDIodW5zaWduZWQgbG9uZyBvZmZzZXQpOwogCiBleHRlcm4gdm9pZCBwcGM2eHhfaWRsZSh2b2lkKTsKQEAgLTMwMSw2ICszMDAsNyBAQAogewogIAl1bnNpZ25lZCBsb25nIHBoeXM7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWxvY19vZmZzZXQoKTsKKwlzdHJ1Y3QgY3B1X3NwZWMgKnNwZWM7CiAKICAJLyogRGVmYXVsdCAqLwogIAlwaHlzID0gb2Zmc2V0ICsgS0VSTkVMQkFTRTsKQEAgLTMxMyw4ICszMTMsMTAgQEAKIAkgKiBJZGVudGlmeSB0aGUgQ1BVIHR5cGUgYW5kIGZpeCB1cCBjb2RlIHNlY3Rpb25zCiAJICogdGhhdCBkZXBlbmQgb24gd2hpY2ggY3B1IHdlIGhhdmUuCiAJICovCi0JaWRlbnRpZnlfY3B1KG9mZnNldCwgMCk7Ci0JZG9fY3B1X2Z0cl9maXh1cHMob2Zmc2V0KTsKKwlzcGVjID0gaWRlbnRpZnlfY3B1KG9mZnNldCwgbWZzcHIoU1BSTl9QVlIpKTsKKwlkb19mZWF0dXJlX2ZpeHVwcyhzcGVjLT5jcHVfZmVhdHVyZXMsCisJCQkgIFBUUlJFTE9DKCZfX3N0YXJ0X19fZnRyX2ZpeHVwKSwKKwkJCSAgUFRSUkVMT0MoJl9fc3RvcF9fX2Z0cl9maXh1cCkpOwogCiAJcmV0dXJuIHBoeXM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wcGMva2VybmVsL3RpbWUuYwppbmRleCBkNGIyY2Y3Li4xOGVlODUxIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMKQEAgLTYyLDYgKzYyLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KIAogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKQEAgLTEyOSw2ICsxMzAsNyBAQAogICovCiB2b2lkIHRpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCiB7CisJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzOwogCWludCBuZXh0X2RlYzsKIAl1bnNpZ25lZCBsb25nIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl1bnNpZ25lZCBqaWZmeV9zdGFtcCA9IGxhc3RfamlmZnlfc3RhbXAoY3B1KTsKQEAgLTEzNyw2ICsxMzksNyBAQAogCWlmIChhdG9taWNfcmVhZCgmcHBjX25fbG9zdF9pbnRlcnJ1cHRzKSAhPSAwKQogCQlkb19JUlEocmVncyk7CiAKKwlvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKIAlpcnFfZW50ZXIoKTsKIAogCXdoaWxlICgobmV4dF9kZWMgPSB0Yl90aWNrc19wZXJfamlmZnkgLSB0Yl9kZWx0YSgmamlmZnlfc3RhbXApKSA8PSAwKSB7CkBAIC0xODgsNiArMTkxLDcgQEAKIAkJcHBjX21kLmhlYXJ0YmVhdCgpOwogCiAJaXJxX2V4aXQoKTsKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwppbmRleCBhYWZjOGU4Li44MTBmN2FhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzE2LDcgKzMxNyw3IEBACiAJaWYgKHJlYXNvbiAmIE1DU1JfQlVTX1JCRVJSKQogCQlwcmludGsoIkJ1cyAtIFJlYWQgRGF0YSBCdXMgRXJyb3JcbiIpOwogCWlmIChyZWFzb24gJiBNQ1NSX0JVU19XQkVSUikKLQkJcHJpbnRrKCJCdXMgLSBSZWFkIERhdGEgQnVzIEVycm9yXG4iKTsKKwkJcHJpbnRrKCJCdXMgLSBXcml0ZSBEYXRhIEJ1cyBFcnJvclxuIik7CiAJaWYgKHJlYXNvbiAmIE1DU1JfQlVTX0lQRVJSKQogCQlwcmludGsoIkJ1cyAtIEluc3RydWN0aW9uIFBhcml0eSBFcnJvclxuIik7CiAJaWYgKHJlYXNvbiAmIE1DU1JfQlVTX1JQRVJSKQpAQCAtNTU5LDY0ICs1NjAsOSBAQAogCX0KIH0KIAotLyoKLSAqIExvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZiB0cmFwIGluc3RydWN0aW9ucyB0aGF0IGFyZSB1c2VkIGZvciBCVUcoKSwKLSAqIEJVR19PTigpIGFuZCBXQVJOX09OKCkgYW5kIHNlZSBpZiB3ZSBoaXQgb25lLiAgQXQgdGhpcyBwb2ludCB3ZSBrbm93Ci0gKiB0aGF0IHRoZSBleGNlcHRpb24gd2FzIGNhdXNlZCBieSBhIHRyYXAgaW5zdHJ1Y3Rpb24gb2Ygc29tZSBraW5kLgotICogUmV0dXJucyAxIGlmIHdlIHNob3VsZCBjb250aW51ZSAoaS5lLiBpdCB3YXMgYSBXQVJOX09OKSBvciAwCi0gKiBvdGhlcndpc2UuCi0gKi8KLWV4dGVybiBzdHJ1Y3QgYnVnX2VudHJ5IF9fc3RhcnRfX19idWdfdGFibGVbXSwgX19zdG9wX19fYnVnX3RhYmxlW107Ci0KLSNpZm5kZWYgQ09ORklHX01PRFVMRVMKLSNkZWZpbmUgbW9kdWxlX2ZpbmRfYnVnKHgpCU5VTEwKLSNlbmRpZgotCi1zdHJ1Y3QgYnVnX2VudHJ5ICpmaW5kX2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpCitpbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0Jc3RydWN0IGJ1Z19lbnRyeSAqYnVnOwotCi0JZm9yIChidWcgPSBfX3N0YXJ0X19fYnVnX3RhYmxlOyBidWcgPCBfX3N0b3BfX19idWdfdGFibGU7ICsrYnVnKQotCQlpZiAoYnVnYWRkciA9PSBidWctPmJ1Z19hZGRyKQotCQkJcmV0dXJuIGJ1ZzsKLQlyZXR1cm4gbW9kdWxlX2ZpbmRfYnVnKGJ1Z2FkZHIpOwotfQotCi1pbnQgY2hlY2tfYnVnX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IGJ1Z19lbnRyeSAqYnVnOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCWlmIChyZWdzLT5tc3IgJiBNU1JfUFIpCi0JCXJldHVybiAwOwkvKiBub3QgaW4ga2VybmVsICovCi0JYWRkciA9IHJlZ3MtPm5pcDsJLyogYWRkcmVzcyBvZiB0cmFwIGluc3RydWN0aW9uICovCi0JaWYgKGFkZHIgPCBQQUdFX09GRlNFVCkKLQkJcmV0dXJuIDA7Ci0JYnVnID0gZmluZF9idWcocmVncy0+bmlwKTsKLQlpZiAoYnVnID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChidWctPmxpbmUgJiBCVUdfV0FSTklOR19UUkFQKSB7Ci0JCS8qIHRoaXMgaXMgYSBXQVJOX09OIHJhdGhlciB0aGFuIEJVRy9CVUdfT04gKi8KLSNpZmRlZiBDT05GSUdfWE1PTgotCQl4bW9uX3ByaW50ZihLRVJOX0VSUiAiQmFkbmVzcyBpbiAlcyBhdCAlczolbGRcbiIsCi0JCSAgICAgICBidWctPmZ1bmN0aW9uLCBidWctPmZpbGUsCi0JCSAgICAgICBidWctPmxpbmUgJiB+QlVHX1dBUk5JTkdfVFJBUCk7Ci0jZW5kaWYgLyogQ09ORklHX1hNT04gKi8JCQotCQlwcmludGsoS0VSTl9FUlIgIkJhZG5lc3MgaW4gJXMgYXQgJXM6JWxkXG4iLAotCQkgICAgICAgYnVnLT5mdW5jdGlvbiwgYnVnLT5maWxlLAotCQkgICAgICAgYnVnLT5saW5lICYgfkJVR19XQVJOSU5HX1RSQVApOwotCQlkdW1wX3N0YWNrKCk7Ci0JCXJldHVybiAxOwotCX0KLSNpZmRlZiBDT05GSUdfWE1PTgotCXhtb25fcHJpbnRmKEtFUk5fQ1JJVCAia2VybmVsIEJVRyBpbiAlcyBhdCAlczolbGQhXG4iLAotCSAgICAgICBidWctPmZ1bmN0aW9uLCBidWctPmZpbGUsIGJ1Zy0+bGluZSk7Ci0JeG1vbihyZWdzKTsKLSNlbmRpZiAvKiBDT05GSUdfWE1PTiAqLwotCXByaW50ayhLRVJOX0NSSVQgImtlcm5lbCBCVUcgaW4gJXMgYXQgJXM6JWxkIVxuIiwKLQkgICAgICAgYnVnLT5mdW5jdGlvbiwgYnVnLT5maWxlLCBidWctPmxpbmUpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGFkZHIgPj0gUEFHRV9PRkZTRVQ7CiB9CiAKIHZvaWQgcHJvZ3JhbV9jaGVja19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC02NzEsNyArNjE3LDkgQEAKIAkJLyogdHJhcCBleGNlcHRpb24gKi8KIAkJaWYgKGRlYnVnZ2VyX2JwdChyZWdzKSkKIAkJCXJldHVybjsKLQkJaWYgKGNoZWNrX2J1Z190cmFwKHJlZ3MpKSB7CisKKwkJaWYgKCEocmVncy0+bXNyICYgTVNSX1BSKSAmJiAgLyogbm90IHVzZXItbW9kZSAqLworCQkgICAgcmVwb3J0X2J1ZyhyZWdzLT5uaXApID09IEJVR19UUkFQX1RZUEVfV0FSTikgewogCQkJcmVncy0+bmlwICs9IDQ7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTcwOCw3ICs2NTYsNyBAQAogCiB2b2lkIGFsaWdubWVudF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaW50IGZpeGVkOworCWludCBzaWcsIGNvZGUsIGZpeGVkID0gMDsKIAogCWZpeGVkID0gZml4X2FsaWdubWVudChyZWdzKTsKIAlpZiAoZml4ZWQgPT0gMSkgewpAQCAtNzE3LDE0ICs2NjUsMTYgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAoZml4ZWQgPT0gLUVGQVVMVCkgewotCQkvKiBmaXhlZCA9PSAtRUZBVUxUIG1lYW5zIHRoZSBvcGVyYW5kIGFkZHJlc3Mgd2FzIGJhZCAqLwotCQlpZiAodXNlcl9tb2RlKHJlZ3MpKQotCQkJX2V4Y2VwdGlvbihTSUdTRUdWLCByZWdzLCBTRUdWX0FDQ0VSUiwgcmVncy0+ZGFyKTsKLQkJZWxzZQotCQkJYmFkX3BhZ2VfZmF1bHQocmVncywgcmVncy0+ZGFyLCBTSUdTRUdWKTsKLQkJcmV0dXJuOworCQlzaWcgPSBTSUdTRUdWOworCQljb2RlID0gU0VHVl9BQ0NFUlI7CisJfSBlbHNlIHsKKwkJc2lnID0gU0lHQlVTOworCQljb2RlID0gQlVTX0FEUkFMTjsKIAl9Ci0JX2V4Y2VwdGlvbihTSUdCVVMsIHJlZ3MsIEJVU19BRFJBTE4sIHJlZ3MtPmRhcik7CisJaWYgKHVzZXJfbW9kZShyZWdzKSkKKwkJX2V4Y2VwdGlvbihzaWcsIHJlZ3MsIGNvZGUsIHJlZ3MtPmRhcik7CisJZWxzZQorCQliYWRfcGFnZV9mYXVsdChyZWdzLCByZWdzLT5kYXIsIHNpZyk7CiB9CiAKIHZvaWQgU3RhY2tPdmVyZmxvdyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9wcGMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggMDk1ZmQzMy4uNjE5MjEyNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9wcGMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTMxLDYgKzMxLDcgQEAKICAgLnBsdCA6IHsgKigucGx0KSB9CiAgIC50ZXh0ICAgICAgOgogICB7CisgICAgX3RleHQgPSAuOwogICAgICooLnRleHQpCiAgICAgU0NIRURfVEVYVAogICAgIExPQ0tfVEVYVApAQCAtMTE1LDEzICsxMTYsNyBAQAogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkKLQkqKC5pbml0Y2FsbDIuaW5pdCkKLQkqKC5pbml0Y2FsbDMuaW5pdCkKLQkqKC5pbml0Y2FsbDQuaW5pdCkKLQkqKC5pbml0Y2FsbDUuaW5pdCkKLQkqKC5pbml0Y2FsbDYuaW5pdCkKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZwppbmRleCAyOTNiZDQ4Li42OTgwZGU0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnCkBAIC0xODksNyArMTg5LDcgQEAKICMgT0FLIGRvZXNuJ3QgZXhpc3QgYnV0IHdhbnRlZCB0byBrZWVwIHRoaXMgYXJvdW5kIGZvciBhbnkgZnV0dXJlIDQwM0dDWCBib2FyZHMKIGNvbmZpZyA0MDNHQ1gKIAlib29sCi0JZGVwZW5kcyBPQUsKKwlkZXBlbmRzIG9uIE9BSwogCWRlZmF1bHQgeQogCiBjb25maWcgNDA1RVAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvYnViaW5nYS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9idWJpbmdhLmMKaW5kZXggNDAwOWY0OS4uNzU4NTdiMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9idWJpbmdhLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9idWJpbmdhLmMKQEAgLTExNiw2ICsxMTYsNyBAQAogdm9pZCBfX2luaXQKIGJpb3NfZml4dXAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBzdHJ1Y3QgcGNpbDBfcmVncyAqcGNpcCkKIHsKKyNpZmRlZiBDT05GSUdfUENJCiAKIAl1bnNpZ25lZCBpbnQgYmFyX3Jlc3BvbnNlLCBiYXI7CiAJLyoKQEAgLTIxMiw2ICsyMTMsNyBAQAogCXByaW50aygiIHB0bTJsYVx0MHgleFxuIiwgaW5fbGUzMigmKHBjaXAtPnB0bTJsYSkpKTsKIAogI2VuZGlmCisjZW5kaWYKIH0KIAogdm9pZCBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvY3BjaTQwNS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmMKaW5kZXggMzY3NDMwOS4uODQ3NGIwNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmMKQEAgLTEyNiw2ICsxMjYsNyBAQAogdm9pZCBfX2luaXQKIGJpb3NfZml4dXAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBzdHJ1Y3QgcGNpbDBfcmVncyAqcGNpcCkKIHsKKyNpZmRlZiBDT05GSUdfUENJCiAJdW5zaWduZWQgaW50IGJhcl9yZXNwb25zZSwgYmFyOwogCiAJLyogRGlzYWJsZSByZWdpb24gZmlyc3QgKi8KQEAgLTE2Nyw2ICsxNjgsNyBAQAogCQkJCQlQQ0lfRlVOQyhob3NlLT5maXJzdF9idXNubyksIGJhciwKIAkJCQkJJmJhcl9yZXNwb25zZSk7CiAJfQorI2VuZGlmCiB9CiAKIHZvaWQgX19pbml0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2VwNDA1LmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2VwNDA1LmMKaW5kZXggYWU1YzgyMC4uZTVhZGY5YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvZXA0MDUuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2VwNDA1LmMKQEAgLTY4LDYgKzY4LDcgQEAKIHZvaWQgX19pbml0CiBiaW9zX2ZpeHVwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgc3RydWN0IHBjaWwwX3JlZ3MgKnBjaXApCiB7CisjaWZkZWYgQ09ORklHX1BDSQogCXVuc2lnbmVkIGludCBiYXJfcmVzcG9uc2UsIGJhcjsKIAkvKgogCSAqIEV4cGVjdGVkIFBDSSBtYXBwaW5nOgpAQCAtMTMwLDYgKzEzMSw3IEBACiAJCSAgICBQQ0lfRlVOQyhob3NlLT5maXJzdF9idXNubyksIGJhciwgYmFyX3Jlc3BvbnNlKTsKIAl9CiAJLyogZW5kIHdvcmsgYXJyb3VuZCAqLworI2VuZGlmCiB9CiAKIHZvaWQgX19pbml0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYwppbmRleCAzMzk3ZjBkLi5iODRmOGRmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKQEAgLTEyMSw4ICsxMjEsOCBAQAogCiAJbWRhdGEtPmlycVswXSA9IE1QQzgzeHhfSVJRX0VYVDE7CiAJbWRhdGEtPmlycVsxXSA9IE1QQzgzeHhfSVJRX0VYVDI7Ci0JbWRhdGEtPmlycVsyXSA9IC0xOwotCW1kYXRhLT5pcnFbMzFdID0gLTE7CisJbWRhdGEtPmlycVsyXSA9IFBIWV9QT0xMOworCW1kYXRhLT5pcnFbMzFdID0gUEhZX1BPTEw7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzgzeHhfVFNFQzEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDBfYWRzLmMKaW5kZXggNGY4MzlkYS4uMDBhM2JhNSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQwX2Fkcy5jCkBAIC05Miw5ICs5Miw5IEBACiAKIAltZGF0YS0+aXJxWzBdID0gTVBDODV4eF9JUlFfRVhUNTsKIAltZGF0YS0+aXJxWzFdID0gTVBDODV4eF9JUlFfRVhUNTsKLQltZGF0YS0+aXJxWzJdID0gLTE7CisJbWRhdGEtPmlycVsyXSA9IFBIWV9QT0xMOwogCW1kYXRhLT5pcnFbM10gPSBNUEM4NXh4X0lSUV9FWFQ1OwotCW1kYXRhLT5pcnFbMzFdID0gLTE7CisJbWRhdGEtPmlycVszMV0gPSBQSFlfUE9MTDsKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTYwX2Fkcy5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU2MF9hZHMuYwppbmRleCAxNGVjZWM3Li4zYTA2MDQ2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTYwX2Fkcy5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NjBfYWRzLmMKQEAgLTE1Niw5ICsxNTYsOSBAQAogCiAJbWRhdGEtPmlycVswXSA9IE1QQzg1eHhfSVJRX0VYVDU7CiAJbWRhdGEtPmlycVsxXSA9IE1QQzg1eHhfSVJRX0VYVDU7Ci0JbWRhdGEtPmlycVsyXSA9IC0xOworCW1kYXRhLT5pcnFbMl0gPSBQSFlfUE9MTDsKIAltZGF0YS0+aXJxWzNdID0gTVBDODV4eF9JUlFfRVhUNTsKLQltZGF0YS0+aXJxWzMxXSA9IC0xOworCW1kYXRhLT5pcnFbMzFdID0gUEhZX1BPTEw7CiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHNfY29tbW9uLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYwppbmRleCA1Y2UwZjY5Li4yZDU5ZWI3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYwpAQCAtNDUxLDkgKzQ1MSw5IEBACiAKIAltZGF0YS0+aXJxWzBdID0gTVBDODV4eF9JUlFfRVhUNTsKIAltZGF0YS0+aXJxWzFdID0gTVBDODV4eF9JUlFfRVhUNTsKLQltZGF0YS0+aXJxWzJdID0gLTE7Ci0JbWRhdGEtPmlycVszXSA9IC0xOwotCW1kYXRhLT5pcnFbMzFdID0gLTE7CisJbWRhdGEtPmlycVsyXSA9IFBIWV9QT0xMOworCW1kYXRhLT5pcnFbM10gPSBQSFlfUE9MTDsKKwltZGF0YS0+aXJxWzMxXSA9IFBIWV9QT0xMOwogCiAJLyogc2V0dXAgdGhlIGJvYXJkIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmV0IGNvbnRyb2xsZXJzICovCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwppbmRleCA3NjRkNTgwLi4xZDEwYWI5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAogCW1kYXRhLT5pcnFbMjVdID0gTVBDODV4eF9JUlFfRVhUNjsKIAltZGF0YS0+aXJxWzI2XSA9IE1QQzg1eHhfSVJRX0VYVDc7Ci0JbWRhdGEtPmlycVszMV0gPSAtMTsKKwltZGF0YS0+aXJxWzMxXSA9IFBIWV9QT0xMOwogCiAJLyogc2V0dXAgdGhlIGJvYXJkIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmV0IGNvbnRyb2xsZXJzICovCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYwppbmRleCA0YmIxOGFiLi5iMWY1YjczIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zdHhfZ3AzLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAogCW1kYXRhLT5pcnFbMl0gPSBNUEM4NXh4X0lSUV9FWFQ1OwogCW1kYXRhLT5pcnFbNF0gPSBNUEM4NXh4X0lSUV9FWFQ1OwotCW1kYXRhLT5pcnFbMzFdID0gLTE7CisJbWRhdGEtPmlycVszMV0gPSBQSFlfUE9MTDsKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKaW5kZXggZGQ0NWYyZS4uNGVlMmJkMSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYwpAQCAtMTM3LDkgKzEzNyw5IEBACiAKIAltZGF0YS0+aXJxWzBdID0gTVBDODV4eF9JUlFfRVhUODsKIAltZGF0YS0+aXJxWzFdID0gTVBDODV4eF9JUlFfRVhUODsKLQltZGF0YS0+aXJxWzJdID0gLTE7CisJbWRhdGEtPmlycVsyXSA9IFBIWV9QT0xMOwogCW1kYXRhLT5pcnFbM10gPSBNUEM4NXh4X0lSUV9FWFQ4OwotCW1kYXRhLT5pcnFbMzFdID0gLTE7CisJbWRhdGEtPmlycVszMV0gPSBQSFlfUE9MTDsKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODI3MmFkc19zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzgyNzJhZHNfc2V0dXAuYwppbmRleCBkN2IzYTZhLi4wYmMwNjc2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODI3MmFkc19zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4MjcyYWRzX3NldHVwLmMKQEAgLTE5Niw3ICsxOTYsNyBAQAogCWJkX3QqIGJpID0gKHZvaWQqKV9fcmVzOwogCWludCBmc19ubyA9IGZzaWRfZmNjMStwZGV2LT5pZC0xOwogCi0JaWYoZnNfbm8gPiBBUlJBWV9TSVpFKG1wYzgyeHhfZW5ldF9wZGF0YSkpIHsKKwlpZihmc19ubyA+PSBBUlJBWV9TSVpFKG1wYzgyeHhfZW5ldF9wZGF0YSkpIHsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjIyLDcgKzIyMiw3IEBACiAJaW50IGlkID0gZnNfdWFydF9pZF9zY2MyZnNpZChpZHgpOwogCiAJLyogbm8gbmVlZCB0byBhbHRlciBhbnl0aGluZyBpZiBjb25zb2xlICovCi0JaWYgKChpZCA8PSBudW0pICYmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKSB7CisJaWYgKChpZCA8IG51bSkgJiYgKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkpIHsKIAkJcGluZm8gPSAmbXBjODI3Ml91YXJ0X3BkYXRhW2lkXTsKIAkJcGluZm8tPnVhcnRfY2xrID0gYmQtPmJpX2ludGZyZXE7CiAJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGluZm87CkBAIC0yNjYsMTAgKzI2NiwxMCBAQAogCQkJCQkgICAgICBpbnQgaWR4KQogewogCW04Mnh4X21paV9iYl9wZGF0YS5pcnFbMF0gPSBQSFlfSU5URVJSVVBUOwotCW04Mnh4X21paV9iYl9wZGF0YS5pcnFbMV0gPSAtMTsKLQltODJ4eF9taWlfYmJfcGRhdGEuaXJxWzJdID0gLTE7CisJbTgyeHhfbWlpX2JiX3BkYXRhLmlycVsxXSA9IFBIWV9QT0xMOworCW04Mnh4X21paV9iYl9wZGF0YS5pcnFbMl0gPSBQSFlfUE9MTDsKIAltODJ4eF9taWlfYmJfcGRhdGEuaXJxWzNdID0gUEhZX0lOVEVSUlVQVDsKLQltODJ4eF9taWlfYmJfcGRhdGEuaXJxWzMxXSA9IC0xOworCW04Mnh4X21paV9iYl9wZGF0YS5pcnFbMzFdID0gUEhZX1BPTEw7CiAKIAogCW04Mnh4X21paV9iYl9wZGF0YS5tZGlvX2RhdC5vZmZzZXQgPQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg2NmFkc19zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg2NmFkc19zZXR1cC5jCmluZGV4IDVmMTMwZGMuLjhhMGMwN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4NjZhZHNfc2V0dXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODY2YWRzX3NldHVwLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCS8qIEdldCBwb2ludGVyIHRvIENvbW11bmljYXRpb24gUHJvY2Vzc29yICovCiAJY3AgPSBjcG1wOwogCi0JaWYoZnNfbm8gPiBBUlJBWV9TSVpFKG1wYzh4eF9lbmV0X3BkYXRhKSkgeworCWlmKGZzX25vID49IEFSUkFZX1NJWkUobXBjOHh4X2VuZXRfcGRhdGEpKSB7CiAJCXByaW50ayhLRVJOX0VSUiJObyBuZXR3b3JrLXN1aXRhYmxlICMlZCBkZXZpY2Ugb24gYnVzIiwgZnNfbm8pOwogCQlyZXR1cm47CiAJfQpAQCAtMzA1LDcgKzMwNSw3IEBACiAJaW50IGlkID0gZnNfdWFydF9pZF9zbWMyZnNpZChpZHgpOwogCiAJLyogbm8gbmVlZCB0byBhbHRlciBhbnl0aGluZyBpZiBjb25zb2xlICovCi0JaWYgKChpZCA8PSBudW0pICYmICghcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKSB7CisJaWYgKChpZCA8IG51bSkgJiYgKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkpIHsKIAkJcGluZm8gPSAmbXBjODY2X3VhcnRfcGRhdGFbaWRdOwogCQlwaW5mby0+dWFydF9jbGsgPSBiZC0+YmlfaW50ZnJlcTsKIAkJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwaW5mbzsKQEAgLTM2MSw3ICszNjEsNyBAQAogCiAJZm1waS0+bWlpX3NwZWVkID0gKCgoKGJkLT5iaV9pbnRmcmVxICsgNDk5OTk5OSkgLyAyNTAwMDAwKSAvIDIpICYgMHgzRikgPDwgMTsKIAkvKiBObyBQSFkgaW50ZXJydXB0IGxpbmUgaGVyZSAqLwotCWZtcGktPmlycVsweGZdID0gLTE7CisJZm1waS0+aXJxWzB4Zl0gPSBQSFlfUE9MTDsKIAogLyogU2luY2UgZWl0aGVyIG9mIHRoZSB1YXJ0cyBjb3VsZCBiZSB1c2VkIGFzIGNvbnNvbGUsIHRoZXkgbmVlZCB0byByZWFkeSAqLwogI2lmZGVmIENPTkZJR19TRVJJQUxfQ1BNX1NNQzEKQEAgLTM4MCw3ICszODAsNyBAQAogCiAJZm1waS0+bWlpX3NwZWVkID0gKCgoKGJkLT5iaV9pbnRmcmVxICsgNDk5OTk5OSkgLyAyNTAwMDAwKSAvIDIpICYgMHgzRikgPDwgMTsKIAkvKiBObyBQSFkgaW50ZXJydXB0IGxpbmUgaGVyZSAqLwotCWZtcGktPmlycVsweGZdID0gLTE7CisJZm1waS0+aXJxWzB4Zl0gPSBQSFlfUE9MTDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg4NWFkc19zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg4NWFkc19zZXR1cC5jCmluZGV4IDAyMjkzMTQuLmY4MTYxZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4ODVhZHNfc2V0dXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvbXBjODg1YWRzX3NldHVwLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCWNoYXIgKmU7CiAJaW50IGk7CiAKLQlpZihmc19ubyA+IEFSUkFZX1NJWkUobXBjOHh4X2VuZXRfcGRhdGEpKSB7CisJaWYoZnNfbm8gPj0gQVJSQVlfU0laRShtcGM4eHhfZW5ldF9wZGF0YSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIk5vIG5ldHdvcmstc3VpdGFibGUgIyVkIGRldmljZSBvbiBidXMiLCBmc19ubyk7CiAJCXJldHVybjsKIAl9CkBAIC0zNzEsNyArMzcxLDcgQEAKIAlpbnQgaWQgPSBmc191YXJ0X2lkX3NtYzJmc2lkKGlkeCk7CiAKIAkvKiBubyBuZWVkIHRvIGFsdGVyIGFueXRoaW5nIGlmIGNvbnNvbGUgKi8KLQlpZiAoKGlkIDw9IG51bSkgJiYgKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkpIHsKKwlpZiAoKGlkIDwgbnVtKSAmJiAoIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSkgewogCQlwaW5mbyA9ICZtcGM4ODVfdWFydF9wZGF0YVtpZF07CiAJCXBpbmZvLT51YXJ0X2NsayA9IGJkLT5iaV9pbnRmcmVxOwogCQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBpbmZvOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL21wYzh4eF9kZXZpY2VzLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXBjOHh4X2RldmljZXMuYwppbmRleCBjZjVhYjQ3Li4zMWZiNTY1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXBjOHh4X2RldmljZXMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXBjOHh4X2RldmljZXMuYwpAQCAtNzgsNyArNzgsNyBAQAogCQkJewogCQkJCS5uYW1lIAk9ICJwcmFtIiwKIAkJCQkuc3RhcnQgCT0gMHgzYzAwLAotCQkJCS5lbmQgCT0gMHgzYzgwLAorCQkJCS5lbmQgCT0gMHgzYzdmLAogCQkJCS5mbGFncyAJPSBJT1JFU09VUkNFX01FTSwKIAkJCX0sCiAJCQl7CkBAIC0xMDMsNyArMTAzLDcgQEAKIAkJCXsKIAkJCQkubmFtZSAJPSAicHJhbSIsCiAJCQkJLnN0YXJ0IAk9IDB4M2QwMCwKLQkJCQkuZW5kIAk9IDB4M2Q4MCwKKwkJCQkuZW5kIAk9IDB4M2Q3ZiwKIAkJCQkuZmxhZ3MgCT0gSU9SRVNPVVJDRV9NRU0sCiAJCQl9LAogCkBAIC0xMjksNyArMTI5LDcgQEAKIAkJCXsKIAkJCQkubmFtZSAJPSAicHJhbSIsCiAJCQkJLnN0YXJ0IAk9IDB4M2UwMCwKLQkJCQkuZW5kIAk9IDB4M2U4MCwKKwkJCQkuZW5kIAk9IDB4M2U3ZiwKIAkJCQkuZmxhZ3MgCT0gSU9SRVNPVVJDRV9NRU0sCiAJCQl9LAogCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkJCXsKIAkJCQkubmFtZSAJPSAicHJhbSIsCiAJCQkJLnN0YXJ0IAk9IDB4M2YwMCwKLQkJCQkuZW5kIAk9IDB4M2Y4MCwKKwkJCQkuZW5kIAk9IDB4M2Y3ZiwKIAkJCQkuZmxhZ3MgCT0gSU9SRVNPVVJDRV9NRU0sCiAJCQl9LAogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDYwODE5M2MuLjEyMjcyMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC0yMiw2ICsyMiwxNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogY29uZmlnIEdFTkVSSUNfSFdFSUdIVAogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTMzLDkgKzQxLDYgQEAKIGNvbmZpZyBHRU5FUklDX1RJTUUKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBHRU5FUklDX0JVU1RfU1BJTkxPQ0sKLQlib29sCi0KIG1haW5tZW51ICJMaW51eCBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAogY29uZmlnIFMzOTAKQEAgLTE4MSw3ICsxODYsNyBAQAogCiBjb25maWcgU01BTExfU1RBQ0sKIAlib29sICJVc2UgNGtiLzhrYiBmb3Iga2VybmVsIHN0YWNrIGluc3RlYWQgb2YgOGtiLzE2a2IiCi0JZGVwZW5kcyBvbiBQQUNLX1NUQUNLCisJZGVwZW5kcyBvbiBQQUNLX1NUQUNLICYmICFMT0NLREVQCiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgLW1rZXJuZWwtYmFja2NoYWluCiAJICBvcHRpb24gdGhlIGtlcm5lbCB3aWxsIHVzZSBhIHNtYWxsZXIga2VybmVsIHN0YWNrIHNpemUuIEZvciAzMSBiaXQKQEAgLTI0MSw2ICsyNDYsOSBAQAogCiBzb3VyY2UgIm1tL0tjb25maWciCiAKK2NvbmZpZyBIT0xFU19JTl9aT05FCisJZGVmX2Jvb2wgeQorCiBjb21tZW50ICJJL08gc3Vic3lzdGVtIGNvbmZpZ3VyYXRpb24iCiAKIGNvbmZpZyBNQUNIQ0hLX1dBUk5JTkcKQEAgLTI2NCwxNCArMjcyLDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAotY29uZmlnIFFESU9fUEVSRl9TVEFUUwotCWJvb2wgIlBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgaW4gL3Byb2MiCi0JZGVwZW5kcyBvbiBRRElPCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBnZXQgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBpbiAvcHJvYy9xZGlvX3BlcmYKLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIFFESU9fREVCVUcKIAlib29sICJFeHRlbmRlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iCiAJZGVwZW5kcyBvbiBRRElPCkBAIC00MDcsNyArNDA3LDcgQEAKIAogY29uZmlnIEFQUExEQVRBX01FTQogCXRyaXN0YXRlICJNb25pdG9yIG1lbW9yeSBtYW5hZ2VtZW50IHN0YXRpc3RpY3MiCi0JZGVwZW5kcyBvbiBBUFBMREFUQV9CQVNFCisJZGVwZW5kcyBvbiBBUFBMREFUQV9CQVNFICYmIFZNX0VWRU5UX0NPVU5URVJTCiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBtZW1vcnkgbWFuYWdlbWVudCByZWxhdGVkIGRhdGEgdG8gdGhlIExpbnV4IC0gVk0gTW9uaXRvcgogCSAgU3RyZWFtLCBsaWtlIHBhZ2luZy9zd2FwcGluZyByYXRlLCBtZW1vcnkgdXRpbGlzYXRpb24sIGV0Yy4KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9NYWtlZmlsZSBiL2FyY2gvczM5MC9NYWtlZmlsZQppbmRleCA1ZGViOWY3Li42NTk4ZTUyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL01ha2VmaWxlCkBAIC0zNSw2ICszNSw5IEBACiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfWjk5MCkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9ejk5MCkKIGNmbGFncy0kKENPTkZJR19NQVJDSF9aOV8xMDkpICs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXo5LTEwOSkKIAorI0tCVUlMRF9JTUFHRSBpcyBuZWNlc3NhcnkgZm9yIG1ha2UgcnBtCitLQlVJTERfSU1BR0UJOj1hcmNoL3MzOTAvYm9vdC9pbWFnZQorCiAjCiAjIFByZXZlbnQgdGFpbC1jYWxsIG9wdGltaXphdGlvbnMsIHRvIGdldCBjbGVhcmVyIGJhY2t0cmFjZXM6CiAjCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYwppbmRleCA0NWM5ZmE3Li5iOGMyMzcyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCisrKyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKQEAgLTkyLDggKzkyLDggQEAKICAqIFdvcmsgcXVldWUKICAqLwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphcHBsZGF0YV93cTsKLXN0YXRpYyB2b2lkIGFwcGxkYXRhX3dvcmtfZm4odm9pZCAqZGF0YSk7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKGFwcGxkYXRhX3dvcmssIGFwcGxkYXRhX3dvcmtfZm4sIE5VTEwpOworc3RhdGljIHZvaWQgYXBwbGRhdGFfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIERFQ0xBUkVfV09SSyhhcHBsZGF0YV93b3JrLCBhcHBsZGF0YV93b3JrX2ZuKTsKIAogCiAvKgpAQCAtMTI1LDcgKzEyNSw3IEBACiAgKgogICogY2FsbCBkYXRhIGdhdGhlcmluZyBmdW5jdGlvbiBmb3IgZWFjaCAoYWN0aXZlKSBtb2R1bGUKICAqLwotc3RhdGljIHZvaWQgYXBwbGRhdGFfd29ya19mbih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgYXBwbGRhdGFfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGg7CiAJc3RydWN0IGFwcGxkYXRhX29wcyAqb3BzOwpAQCAtMzEwLDYgKzMxMCw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBsZW4gPiBzaXplb2YoYnVmKSA/IHNpemVvZihidWYpIDogbGVuKSkgewogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJaW50ZXJ2YWwgPSAwOwogCXNzY2FuZihidWYsICIlaSIsICZpbnRlcnZhbCk7CiAJaWYgKGludGVydmFsIDw9IDApIHsKIAkJUF9FUlJPUigiVGltZXIgQ1BVIGludGVydmFsIGhhcyB0byBiZSA+IDAhXG4iKTsKQEAgLTU2MCw3ICs1NjEsNiBAQAogCXNwaW5fdW5sb2NrKCZhcHBsZGF0YV90aW1lcl9sb2NrKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIGludCBfX2NwdWluaXQKIGFwcGxkYXRhX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCkBAIC01ODEsNyArNTgxLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYXBwbGRhdGFfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBhcHBsZGF0YV9jcHVfbm90aWZ5LAogfTsKLSNlbmRpZgogCiAvKgogICogYXBwbGRhdGFfaW5pdCgpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwppbmRleCBhMzI1NzM5Li5hNmVjOTE5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgV2VkIE9jdCAgNCAxOTo0NTo0NiAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMyCisjIFdlZCBPY3QgMTggMTc6MTE6MTAgMjAwNgogIwogQ09ORklHX01NVT15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKQEAgLTExOSw3ICsxMTksNiBAQAogQ09ORklHX0NIRUNLX1NUQUNLPXkKIENPTkZJR19TVEFDS19HVUFSRD0yNTYKICMgQ09ORklHX1dBUk5fU1RBQ0sgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTEzNSw3ICsxMzQsNiBAQAogIwogQ09ORklHX01BQ0hDSEtfV0FSTklORz15CiBDT05GSUdfUURJTz15Ci0jIENPTkZJR19RRElPX1BFUkZfU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfUURJT19ERUJVRyBpcyBub3Qgc2V0CiAKICMKQEAgLTIxMSw2ICsyMDksNyBAQAogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQogQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPXkKICMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfSVBWNl9TSVQ9eQogIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CkBAIC01MjgsNiArNTI3LDcgQEAKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CkBAIC02NDYsMTAgKzY0Niw2IEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCi0jIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgotIwotCi0jCiAjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CiAjCiAKQEAgLTY2OSw3ICs2NjUsNiBAQAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNwotIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19QUkVFTVBUPXkKQEAgLTY5MCw2ICs2ODUsNyBAQAogIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKK0NPTkZJR19IRUFERVJTX0NIRUNLPXkKICMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCmluZGV4IGNkNzAyYWUuLmI2NzE2YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCisrKyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAogc3RhdGljIGludCBoeXBmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWNoYXIgKmRhdGEgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOworCWNoYXIgKmRhdGEgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAJc3RydWN0IGh5cGZzX3NiX2luZm8gKmZzX2luZm87CiAKIAlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKQEAgLTE3NCw3ICsxNzQsNyBAQAogCXN0cnVjdCBoeXBmc19zYl9pbmZvICpmc19pbmZvOwogCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKIAotCXNiID0gaW9jYi0+a2lfZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2I7CisJc2IgPSBpb2NiLT5raV9maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiOwogCWZzX2luZm8gPSBzYi0+c19mc19pbmZvOwogCS8qCiAJICogQ3VycmVudGx5IHdlIG9ubHkgYWxsb3cgb25lIHVwZGF0ZSBwZXIgc2Vjb25kIGZvciB0d28gcmVhc29uczoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IGFhOTc4OTcuLmE4MTg4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogRVhUUkFfQUZMQUdTCTo9IC10cmFkaXRpb25hbAogCi1vYmoteQk6PSAgYml0bWFwLm8gdHJhcHMubyB0aW1lLm8gcHJvY2Vzcy5vIFwKK29iai15CTo9ICBiaXRtYXAubyB0cmFwcy5vIHRpbWUubyBwcm9jZXNzLm8gcmVzZXQubyBcCiAgICAgICAgICAgICBzZXR1cC5vIHN5c19zMzkwLm8gcHRyYWNlLm8gc2lnbmFsLm8gY3BjbWQubyBlYmNkaWMubyBcCiAJICAgIHNlbWFwaG9yZS5vIHMzOTBfZXh0Lm8gZGVidWcubyBwcm9maWxlLm8gaXJxLm8gaXBsLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9iaW5mbXRfZWxmMzIuYyBiL2FyY2gvczM5MC9rZXJuZWwvYmluZm10X2VsZjMyLmMKaW5kZXggOTU2NWEyZC4uNWM0NjA1NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9iaW5mbXRfZWxmMzIuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2JpbmZtdF9lbGYzMi5jCkBAIC0xNzYsNyArMTc2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KIAotI2RlZmluZSBlbGZfYWRkcl90CXUzMgogLyoKICNkZWZpbmUgaW5pdF9lbGZfYmluZm10IGluaXRfZWxmMzJfYmluZm10CiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKaW5kZXggZTE1ZTE0OC4uNWIzM2Y4MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCkBAIC0yOTUsNiArMjk1LDcgQEAKICAqCiAgKiBUaGlzIGlzIHJlYWxseSBob3JyaWJseSB1Z2x5LgogICovCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9pcGModTMyIGNhbGwsIGludCBmaXJzdCwgaW50IHNlY29uZCwgaW50IHRoaXJkLCB1MzIgcHRyKQogewogCWlmIChjYWxsID4+IDE2KQkJLyogaGFjayBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwpAQCAtMzM4LDYgKzMzOSw3IEBACiAKIAlyZXR1cm4gLUVOT1NZUzsKIH0KKyNlbmRpZgogCiBhc21saW5rYWdlIGxvbmcgc3lzMzJfdHJ1bmNhdGU2NChjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIHVuc2lnbmVkIGxvbmcgaGlnaCwgdW5zaWduZWQgbG9uZyBsb3cpCiB7CkBAIC03NTUsNyArNzU3LDkgQEAKIAkJCSAgICBwdXRfdXNlcihvbGRsZW4sICh1MzIgX191c2VyICopY29tcGF0X3B0cih0bXAub2xkbGVucCkpKQogCQkJCWVycm9yID0gLUVGQVVMVDsKIAkJfQotCQljb3B5X3RvX3VzZXIoYXJncy0+X191bnVzZWQsIHRtcC5fX3VudXNlZCwgc2l6ZW9mKHRtcC5fX3VudXNlZCkpOworCQlpZiAoY29weV90b191c2VyKGFyZ3MtPl9fdW51c2VkLCB0bXAuX191bnVzZWQsCisJCQkJIHNpemVvZih0bXAuX191bnVzZWQpKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKIAl9CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwppbmRleCBkNDliODc2Li44NjE4ODhhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwpAQCAtMTY5LDEyICsxNjksMTIgQEAKIAkJY29tcGF0X29sZF9zaWdzZXRfdCBtYXNrOwogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWN0LCBzaXplb2YoKmFjdCkpIHx8CiAJCSAgICBfX2dldF91c2VyKHNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX2dldF91c2VyKHNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikpCisJCSAgICBfX2dldF91c2VyKHNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikgfHwKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncykgfHwKKwkJICAgIF9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzaykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJbmV3X2thLnNhLnNhX2hhbmRsZXIgPSAoX19zaWdoYW5kbGVyX3QpIHNhX2hhbmRsZXI7CiAJCW5ld19rYS5zYS5zYV9yZXN0b3JlciA9ICh2b2lkICgqKSh2b2lkKSkgc2FfcmVzdG9yZXI7Ci0JCV9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncyk7Ci0JCV9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzayk7CiAJCXNpZ2luaXRzZXQoJm5ld19rYS5zYS5zYV9tYXNrLCBtYXNrKTsKICAgICAgICAgfQogCkBAIC0xODUsMTAgKzE4NSwxMCBAQAogCQlzYV9yZXN0b3JlciA9ICh1bnNpZ25lZCBsb25nKSBvbGRfa2Euc2Euc2FfcmVzdG9yZXI7CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgb2FjdCwgc2l6ZW9mKCpvYWN0KSkgfHwKIAkJICAgIF9fcHV0X3VzZXIoc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX3B1dF91c2VyKHNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkgICAgX19wdXRfdXNlcihzYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfZmxhZ3MsICZvYWN0LT5zYV9mbGFncykgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX21hc2suc2lnWzBdLCAmb2FjdC0+c2FfbWFzaykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfZmxhZ3MsICZvYWN0LT5zYV9mbGFncyk7Ci0JCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX21hc2suc2lnWzBdLCAmb2FjdC0+c2FfbWFzayk7CiAgICAgICAgIH0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKaW5kZXggY2IwZWZhZS4uNzFlNTRlZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwpAQCAtMTY2NCw0ICsxNjY0LDQgQEAKIAlsbGd0cgklcjIsJXIyCQkJIyB1bnNpZ25lZCAqCiAJbGxndHIJJXIzLCVyMwkJCSMgdW5zaWduZWQgKgogCWxsZ3RyCSVyNCwlcjQJCQkjIHN0cnVjdCBnZXRjcHVfY2FjaGUgKgotCWpnCXN5c190ZWUKKwlqZwlzeXNfZ2V0Y3B1CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NwY21kLmMgYi9hcmNoL3MzOTAva2VybmVsL2NwY21kLmMKaW5kZXggMWVhZTc0ZS4uYTU5NzJmMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jcGNtZC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY3BjbWQuYwpAQCAtMjEsMTQgKzIxLDE1IEBACiBzdGF0aWMgY2hhciBjcGNtZF9idWZbMjQxXTsKIAogLyoKLSAqIHRoZSBjYWxsZXIgb2YgX19jcGNtZCBoYXMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlc3BvbnNlIGJ1ZmZlciBpcyBiZWxvdyAyIEdCCisgKiBfX2NwY21kIGhhcyBzb21lIHJlc3RyaWN0aW9ucyBvdmVyIGNwY21kCisgKiAgLSB0aGUgcmVzcG9uc2UgYnVmZmVyIG11c3QgcmVzaWRlIGJlbG93IDJHQiAoaWYgYW55KQorICogIC0gX19jcGNtZCBpcyB1bmxvY2tlZCBhbmQgdGhlcmVmb3JlIG5vdCBTTVAtc2FmZQogICovCiBpbnQgIF9fY3BjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4sIGludCAqcmVzcG9uc2VfY29kZSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBjbWRsZW47CisJdW5zaWduZWQgY21kbGVuOwogCWludCByZXR1cm5fY29kZSwgcmV0dXJuX2xlbjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjcGNtZF9sb2NrLCBmbGFncyk7CiAJY21kbGVuID0gc3RybGVuKGNtZCk7CiAJQlVHX09OKGNtZGxlbiA+IDI0MCk7CiAJbWVtY3B5KGNwY21kX2J1ZiwgY21kLCBjbWRsZW4pOwpAQCAtNzQsNyArNzUsNiBAQAogCQkJOiAiK2QiIChyZWczKSA6ICJkIiAocmVnMikgOiAiY2MiKTsKIAkJcmV0dXJuX2NvZGUgPSAoaW50KSByZWczOwogICAgICAgICB9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3BjbWRfbG9jaywgZmxhZ3MpOwogCWlmIChyZXNwb25zZV9jb2RlICE9IE5VTEwpCiAJCSpyZXNwb25zZV9jb2RlID0gcmV0dXJuX2NvZGU7CiAJcmV0dXJuIHJldHVybl9sZW47CkBAIC04MiwxNSArODIsMTggQEAKIAogRVhQT1JUX1NZTUJPTChfX2NwY21kKTsKIAotI2lmZGVmIENPTkZJR182NEJJVAogaW50IGNwY21kKGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqcmVzcG9uc2UsIGludCBybGVuLCBpbnQgKnJlc3BvbnNlX2NvZGUpCiB7CiAJY2hhciAqbG93YnVmOwogCWludCBsZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICgocmxlbiA9PSAwKSB8fCAocmVzcG9uc2UgPT0gTlVMTCkKLQkgICAgfHwgISgodW5zaWduZWQgbG9uZylyZXNwb25zZSA+PiAzMSkpCisJICAgIHx8ICEoKHVuc2lnbmVkIGxvbmcpcmVzcG9uc2UgPj4gMzEpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjcGNtZF9sb2NrLCBmbGFncyk7CiAJCWxlbiA9IF9fY3BjbWQoY21kLCByZXNwb25zZSwgcmxlbiwgcmVzcG9uc2VfY29kZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwY21kX2xvY2ssIGZsYWdzKTsKKwl9CiAJZWxzZSB7CiAJCWxvd2J1ZiA9IGttYWxsb2MocmxlbiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwogCQlpZiAoIWxvd2J1ZikgewpAQCAtOTgsNyArMTAxLDkgQEAKIAkJCQkiY3BjbWQ6IGNvdWxkIG5vdCBhbGxvY2F0ZSByZXNwb25zZSBidWZmZXJcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNwY21kX2xvY2ssIGZsYWdzKTsKIAkJbGVuID0gX19jcGNtZChjbWQsIGxvd2J1ZiwgcmxlbiwgcmVzcG9uc2VfY29kZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwY21kX2xvY2ssIGZsYWdzKTsKIAkJbWVtY3B5KHJlc3BvbnNlLCBsb3didWYsIHJsZW4pOwogCQlrZnJlZShsb3didWYpOwogCX0KQEAgLTEwNiw0ICsxMTEsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGNwY21kKTsKLSNlbmRpZgkJLyogQ09ORklHXzY0QklUICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2RlYnVnLmMgYi9hcmNoL3MzOTAva2VybmVsL2RlYnVnLmMKaW5kZXggNDNmM2QwYy4uYmI1N2JjMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZGVidWcuYwpAQCAtMTkxLDEzICsxOTEsMTMgQEAKIAlkZWJ1Z19lbnRyeV90KioqIGFyZWFzOwogCWludCBpLGo7CiAKLQlhcmVhcyA9IChkZWJ1Z19lbnRyeV90ICoqKikga21hbGxvYyhucl9hcmVhcyAqCisJYXJlYXMgPSBrbWFsbG9jKG5yX2FyZWFzICoKIAkJCQkJc2l6ZW9mKGRlYnVnX2VudHJ5X3QqKiksCiAJCQkJCUdGUF9LRVJORUwpOwogCWlmICghYXJlYXMpCiAJCWdvdG8gZmFpbF9tYWxsb2NfYXJlYXM7CiAJZm9yIChpID0gMDsgaSA8IG5yX2FyZWFzOyBpKyspIHsKLQkJYXJlYXNbaV0gPSAoZGVidWdfZW50cnlfdCoqKSBrbWFsbG9jKHBhZ2VzX3Blcl9hcmVhICoKKwkJYXJlYXNbaV0gPSBrbWFsbG9jKHBhZ2VzX3Blcl9hcmVhICoKIAkJCQlzaXplb2YoZGVidWdfZW50cnlfdCopLEdGUF9LRVJORUwpOwogCQlpZiAoIWFyZWFzW2ldKSB7CiAJCQlnb3RvIGZhaWxfbWFsbG9jX2FyZWFzMjsKQEAgLTI0Miw3ICsyNDIsNyBAQAogCiAJLyogYWxsb2MgZXZlcnl0aGluZyAqLwogCi0JcmMgPSAoZGVidWdfaW5mb190Kikga21hbGxvYyhzaXplb2YoZGVidWdfaW5mb190KSwgR0ZQX0tFUk5FTCk7CisJcmMgPSBrbWFsbG9jKHNpemVvZihkZWJ1Z19pbmZvX3QpLCBHRlBfS0VSTkVMKTsKIAlpZighcmMpCiAJCWdvdG8gZmFpbF9tYWxsb2NfcmM7CiAJcmMtPmFjdGl2ZV9lbnRyaWVzID0ga2NhbGxvYyhucl9hcmVhcywgc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOwpAQCAtNjAzLDEzICs2MDMsMTMgQEAKIAlkZWJ1Z19pbmZvX3QgKmRlYnVnX2luZm8sICpkZWJ1Z19pbmZvX3NuYXBzaG90OwogCiAJZG93bigmZGVidWdfbG9jayk7Ci0JZGVidWdfaW5mbyA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CisJZGVidWdfaW5mbyA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZTsKIAkvKiBmaW5kIGRlYnVnIHZpZXcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgREVCVUdfTUFYX1ZJRVdTOyBpKyspIHsKIAkJaWYgKCFkZWJ1Z19pbmZvLT52aWV3c1tpXSkKIAkJCWNvbnRpbnVlOwogCQllbHNlIGlmIChkZWJ1Z19pbmZvLT5kZWJ1Z2ZzX2VudHJpZXNbaV0gPT0KLQkJCSBmaWxlLT5mX2RlbnRyeSkgeworCQkJIGZpbGUtPmZfcGF0aC5kZW50cnkpIHsKIAkJCWdvdG8gZm91bmQ7CS8qIGZvdW5kIHZpZXcgISAqLwogCQl9CiAJfQpAQCAtNjM0LDcgKzYzNCw3IEBACiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCXBfaW5mbyA9IChmaWxlX3ByaXZhdGVfaW5mb190ICopIGttYWxsb2Moc2l6ZW9mKGZpbGVfcHJpdmF0ZV9pbmZvX3QpLAorCXBfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKGZpbGVfcHJpdmF0ZV9pbmZvX3QpLAogCQkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYoIXBfaW5mbyl7CiAJCWlmKGRlYnVnX2luZm9fc25hcHNob3QpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCmluZGV4IDBjZjU5YmIuLjhmOGM4MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCkBAIC00MTgsMjQgKzQxOCw2IEBACiAuZ290cjoKIAlsCSVyMTAsLnRibAkJIyBFQkNESUMgdG8gQVNDSUkgdGFibGUKIAl0cgkwKDI0MCwlcjgpLDAoJXIxMCkKLQlzdGlkcAlfX0xDX0NQVUlECQkjIEFyZSB3ZSBydW5uaW5nIG9uIFZNIG1heWJlCi0JY2xpCV9fTENfQ1BVSUQsMHhmZgotCWJuegkudGVzdAotCS5sb25nCTB4ODMzMDAwNjAJCSMgZGlhZyAzLDAseCcwMDYwJyAtIHN0b3JhZ2Ugc2l6ZQotCWIJLmRvbmUKLS50ZXN0OgotCW12YwkweDY4KDgpLC5wZ21udwkJIyBzZXQgdXAgcGdtIGNoZWNrIGhhbmRsZXIKLQlsCSVyMiwuZm91cm1lZwotCWxyCSVyMywlcjIKLQliY3RyCSVyMywlcjAJCQkjIDRNLTEKLS5sb29wOglpc2tlCSVyMCwlcjMKLQlhcgklcjMsJXIyCi0ucGdteDoKLQlzcgklcjMsJXIyCi0JbGEJJXIzLDEoJXIzKQotLmRvbmU6Ci0JbAklcjEsLm1lbXNpemUKLQlzdAklcjMsQVJDSF9PRkZTRVQoJXIxKQogCXNscgklcjAsJXIwCiAJc3QJJXIwLElOSVRSRF9TSVpFK0FSQ0hfT0ZGU0VULVBBUk1BUkVBKCVyMTEpCiAJc3QJJXIwLElOSVRSRF9TVEFSVCtBUkNIX09GRlNFVC1QQVJNQVJFQSglcjExKQpAQCAtNDQzLDkgKzQyNSw2IEBACiAudGJsOgkubG9uZwlfZWJjYXNjCQkJIyB0cmFuc2xhdGUgdGFibGUKIC5jbWQ6CS5sb25nCUNPTU1BTkRfTElORQkJIyBhZGRyZXNzIG9mIGNvbW1hbmQgbGluZSBidWZmZXIKIC5wYXJtOgkubG9uZwlQQVJNQVJFQQotLm1lbXNpemU6IC5sb25nIG1lbW9yeV9zaXplCi0uZm91cm1lZzogLmxvbmcgMHgwMDQwMDAwMCAgICAgIAkjIDRNCi0ucGdtbnc6CS5sb25nCTB4MDAwODAwMDAsLnBnbXgKIC5sb3djYXNlOgogCS5ieXRlIDB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNwogCS5ieXRlIDB4MDgsMHgwOSwweDBhLDB4MGIsMHgwYywweDBkLDB4MGUsMHgwZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDMxLlMKaW5kZXggMGEyYzkyOS4uNDM4OGIzMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQzMS5TCkBAIC0xMzEsMTAgKzEzMSwxMSBAQAogCS5sb25nCWluaXRfdGhyZWFkX3VuaW9uCiAuTHBtYXNrOgogCS5ieXRlCTAKLS5hbGlnbiA4CisJLmFsaWduCTgKIC5McGNleHQ6LmxvbmcJMHgwMDA4MDAwMCwweDgwMDAwMDAwCiAuTGNyOgogCS5sb25nCTB4MDAJCQkjIHBsYWNlIGhvbGRlciBmb3IgY3IwCisJLmFsaWduCTgKIC5Md2FpdHNjbHA6CiAJLmxvbmcgMHgwMTBhMDAwMCwweDgwMDAwMDAwICsgLkxzY2xwaAogLkxyY3A6CkBAIC0xNTYsNyArMTU3LDcgQEAKIAlzbHIJJXI0LCVyNAkJCSMgc2V0IHN0YXJ0IG9mIGNodW5rIHRvIHplcm8KIAlzbHIJJXI1LCVyNQkJCSMgc2V0IGVuZCBvZiBjaHVuayB0byB6ZXJvCiAJc2xyCSVyNiwlcjYJCQkjIHNldCBhY2Nlc3MgY29kZSB0byB6ZXJvCi0JbGEJJXIxMCwgTUVNT1JZX0NIVU5LUwkjIG51bWJlciBvZiBjaHVua3MKKwlsYQklcjEwLE1FTU9SWV9DSFVOS1MJIyBudW1iZXIgb2YgY2h1bmtzCiAuTGxvb3A6CiAJdHByb3QJMCglcjUpLDAJCSMgdGVzdCBwcm90ZWN0aW9uIG9mIGZpcnN0IGJ5dGUKIAlpcG0JJXI3CkBAIC0xNzYsOCArMTc3LDYgQEAKIAlzdAklcjAsNCglcjMpCQkjIHN0b3JlIHNpemUgb2YgY2h1bmsKIAlzdAklcjYsOCglcjMpCQkjIHN0b3JlIHR5cGUgb2YgY2h1bmsKIAlsYQklcjMsMTIoJXIzKQotCWwJJXI0LC5MbWVtc2l6ZS0uTFBHMSglcjEzKQkgIyBhZGRyZXNzIG9mIHZhcmlhYmxlIG1lbW9yeV9zaXplCi0Jc3QJJXI1LDAoJXI0KQkJIyBzdG9yZSBsYXN0IGVuZCB0byBtZW1vcnkgc2l6ZQogCWFoaQklcjEwLC0xCQkJIyB1cGRhdGUgY2h1bmsgbnVtYmVyCiAuTGNoa2xvb3A6CiAJbHIJJXI2LCVyNwkJCSMgc2V0IGFjY2VzcyBjb2RlIHRvIGxhc3QgY2MKQEAgLTI5Miw3ICsyOTEsNiBAQAogLkxwY212cGc6LmxvbmcJMHgwMDA4MDAwMCwweDgwMDAwMDAwICsgLkxjaGttdnBnCiAuTHBjaWR0ZToubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDAgKyAuTGNoa2lkdGUKIC5McGNkaWFnOWM6LmxvbmcgMHgwMDA4MDAwMCwweDgwMDAwMDAwICsgLkxjaGtkaWFnOWMKLS5MbWVtc2l6ZToubG9uZyBtZW1vcnlfc2l6ZQogLkxtY2h1bms6LmxvbmcJbWVtb3J5X2NodW5rCiAuTG1mbGFnczoubG9uZwltYWNoaW5lX2ZsYWdzCiAuTGJzc19iZ246ICAubG9uZyBfX2Jzc19zdGFydApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKaW5kZXggNDJmNTRkNC4uYzUyNjI3OWUxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKQEAgLTcwLDcgKzcwLDIwIEBACiAJc2dyCSVyNSwlcjUgCQkjIHNldCBzcmMsbGVuZ3RoIGFuZCBwYWQgdG8gemVybwogCW12Y2xlCSVyMiwlcjQsMAkJIyBjbGVhciBtZW0KIAlqbwkuLTQJCQkjIGJyYW5jaCBiYWNrLCBpZiBub3QgZmluaXNoCisJCQkJCSMgc2V0IHByb2dyYW0gY2hlY2sgbmV3IHBzdyBtYXNrCisJbXZjCV9fTENfUEdNX05FV19QU1coOCksLkxwY21zay0uTFBHMSglcjEzKQorCWxhcmwJJXIxLC5Mc2xvd21lbWRldGVjdAkjIHNldCBwcm9ncmFtIGNoZWNrIGFkZHJlc3MKKwlzdGcJJXIxLF9fTENfUEdNX05FV19QU1crOAorCWxnaGkJJXIxLDB4YworCWRpYWcJJXIwLCVyMSwweDI2MAkJIyBnZXQgbWVtb3J5IHNpemUgb2YgdmlydHVhbCBtYWNoaW5lCisJY2dyCSVyMCwlcjEJCQkjIGRpZmZlcmVudD8gLT4gb2xkIGRldGVjdGlvbiByb3V0aW5lCisJam5lCS5Mc2xvd21lbWRldGVjdAorCWFnaGkJJXIxLDEJCQkjIHNpemUgaXMgb25lIG1vcmUgdGhhbiBlbmQKKwlsYXJsCSVyMixtZW1vcnlfY2h1bmsKKwlzdGcJJXIxLDgoJXIyKQkJIyBzdG9yZSBzaXplIG9mIGNodW5rCisJagkuTGRvbmVtZW0KIAorLkxzbG93bWVtZGV0ZWN0OgogCWwJJXIyLC5McmNwLS5MUEcxKCVyMTMpCSMgUmVhZCBTQ1AgZm9yY2VkIGNvbW1hbmQgd29yZAogLkxzZXJ2aWNlY2FsbDoKIAlzdG9zbQkuTHBtYXNrLS5MUEcxKCVyMTMpLDB4MDEJIyBhdXRob3JpemUgZXh0IGludGVycnVwdHMKQEAgLTEzOSw4ICsxNTIsNiBAQAogCS5pbnQJMHgxMDAwMDAKIAogLkxmY2h1bms6Ci0JCQkJCSMgc2V0IHByb2dyYW0gY2hlY2sgbmV3IHBzdyBtYXNrCi0JbXZjCV9fTENfUEdNX05FV19QU1coOCksLkxwY21zay0uTFBHMSglcjEzKQogCiAjCiAjIGZpbmQgbWVtb3J5IGNodW5rcy4KQEAgLTE3NSw4ICsxODYsNiBAQAogCXN0ZwklcjAsOCglcjMpCQkjIHN0b3JlIHNpemUgb2YgY2h1bmsKIAlzdAklcjYsMjAoJXIzKQkJIyBzdG9yZSB0eXBlIG9mIGNodW5rCiAJbGEJJXIzLDI0KCVyMykKLQlsYXJsCSVyOCxtZW1vcnlfc2l6ZQotCXN0ZwklcjUsMCglcjgpCQkjIHN0b3JlIG1lbW9yeSBzaXplCiAJYWhpCSVyMTAsLTEJCQkjIHVwZGF0ZSBjaHVuayBudW1iZXIKIC5MY2hrbG9vcDoKIAlscgklcjYsJXI3CQkJIyBzZXQgYWNjZXNzIGNvZGUgdG8gbGFzdCBjYwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYyBiL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKaW5kZXggMWY1ZTc4Mi4uYTM2YmVhMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2lwbC5jCkBAIC0xMywxMiArMTMsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9jcGNtZC5oPgogI2luY2x1ZGUgPGFzbS9jaW8uaD4KKyNpbmNsdWRlIDxhc20vZWJjZGljLmg+CisjaW5jbHVkZSA8YXNtL3Jlc2V0Lmg+CiAKICNkZWZpbmUgSVBMX1BBUk1fQkxPQ0tfVkVSU0lPTiAwCisjZGVmaW5lIExPQURQQVJNX0xFTiA4CisKK2V4dGVybiBjaGFyIHMzOTBfcmVhZGluZm9fc2NjYltdOworI2RlZmluZSBTQ0NCX1ZBTElEICgqKChfX3UxNiopJnMzOTBfcmVhZGluZm9fc2NjYls2XSkgPT0gMHgwMDEwKQorI2RlZmluZSBTQ0NCX0xPQURQQVJNICgmczM5MF9yZWFkaW5mb19zY2NiWzI0XSkKKyNkZWZpbmUgU0NDQl9GTEFHIChzMzkwX3JlYWRpbmZvX3NjY2JbOTFdKQogCiBlbnVtIGlwbF90eXBlIHsKIAlJUExfVFlQRV9OT05FCSA9IDEsCkBAIC0yODksOSArMjk4LDI1IEBACiAKIC8qIENDVyBpcGwgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KIAorc3RhdGljIHNzaXplX3QgaXBsX2Njd19sb2FkcGFybV9zaG93KHN0cnVjdCBzdWJzeXN0ZW0gKnN1YnN5cywgY2hhciAqcGFnZSkKK3sKKwljaGFyIGxvYWRwYXJtW0xPQURQQVJNX0xFTiArIDFdID0ge307CisKKwlpZiAoIVNDQ0JfVkFMSUQpCisJCXJldHVybiBzcHJpbnRmKHBhZ2UsICIjdW5rbm93biNcbiIpOworCW1lbWNweShsb2FkcGFybSwgU0NDQl9MT0FEUEFSTSwgTE9BRFBBUk1fTEVOKTsKKwlFQkNBU0MobG9hZHBhcm0sIExPQURQQVJNX0xFTik7CisJc3Ryc3RyaXAobG9hZHBhcm0pOworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlc1xuIiwgbG9hZHBhcm0pOworfQorCitzdGF0aWMgc3RydWN0IHN1YnN5c19hdHRyaWJ1dGUgc3lzX2lwbF9jY3dfbG9hZHBhcm1fYXR0ciA9CisJX19BVFRSKGxvYWRwYXJtLCAwNDQ0LCBpcGxfY2N3X2xvYWRwYXJtX3Nob3csIE5VTEwpOworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXBsX2Njd19hdHRyc1tdID0gewogCSZzeXNfaXBsX3R5cGVfYXR0ci5hdHRyLAogCSZzeXNfaXBsX2RldmljZV9hdHRyLmF0dHIsCisJJnN5c19pcGxfY2N3X2xvYWRwYXJtX2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMzQ4LDggKzM3Myw1NyBAQAogREVGSU5FX0lQTF9BVFRSX1JXKHJlaXBsX2NjdywgZGV2aWNlLCAiMC4wLiUwNGxseFxuIiwgIjAuMC4lbGx4XG4iLAogCXJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmRldm5vKTsKIAorc3RhdGljIHZvaWQgcmVpcGxfZ2V0X2FzY2lpX2xvYWRwYXJtKGNoYXIgKmxvYWRwYXJtKQoreworCW1lbWNweShsb2FkcGFybSwgJnJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmxvYWRfcGFyYW0sCisJICAgICAgIExPQURQQVJNX0xFTik7CisJRUJDQVNDKGxvYWRwYXJtLCBMT0FEUEFSTV9MRU4pOworCWxvYWRwYXJtW0xPQURQQVJNX0xFTl0gPSAwOworCXN0cnN0cmlwKGxvYWRwYXJtKTsKK30KKworc3RhdGljIHNzaXplX3QgcmVpcGxfY2N3X2xvYWRwYXJtX3Nob3coc3RydWN0IHN1YnN5c3RlbSAqc3Vic3lzLCBjaGFyICpwYWdlKQoreworCWNoYXIgYnVmW0xPQURQQVJNX0xFTiArIDFdOworCisJcmVpcGxfZ2V0X2FzY2lpX2xvYWRwYXJtKGJ1Zik7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCByZWlwbF9jY3dfbG9hZHBhcm1fc3RvcmUoc3RydWN0IHN1YnN5c3RlbSAqc3Vic3lzLAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IGksIGxwX2xlbjsKKworCS8qIGlnbm9yZSB0cmFpbGluZyBuZXdsaW5lICovCisJbHBfbGVuID0gbGVuOworCWlmICgobGVuID4gMCkgJiYgKGJ1ZltsZW4gLSAxXSA9PSAnXG4nKSkKKwkJbHBfbGVuLS07CisJLyogbG9hZHBhcm0gY2FuIGhhdmUgbWF4IDggY2hhcmFjdGVycyBhbmQgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGJsYW5rICovCisJaWYgKChscF9sZW4gPiBMT0FEUEFSTV9MRU4pIHx8ICgobHBfbGVuID4gMCkgJiYgKGJ1ZlswXSA9PSAnICcpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogbG9hZHBhcm0gY2FuIG9ubHkgY29udGFpbiAiYS16LEEtWiwwLTksU1AsLiIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbHBfbGVuOyBpKyspIHsKKwkJaWYgKGlzYWxwaGEoYnVmW2ldKSB8fCBpc2RpZ2l0KGJ1ZltpXSkgfHwgKGJ1ZltpXSA9PSAnICcpIHx8CisJCSAgICAoYnVmW2ldID09ICcuJykpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIGluaXRpYWxpemUgbG9hZHBhcm0gd2l0aCBibGFua3MgKi8KKwltZW1zZXQoJnJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmxvYWRfcGFyYW0sICcgJywgTE9BRFBBUk1fTEVOKTsKKwkvKiBjb3B5IGFuZCBjb252ZXJ0IHRvIGViY2RpYyAqLworCW1lbWNweSgmcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cubG9hZF9wYXJhbSwgYnVmLCBscF9sZW4pOworCUFTQ0VCQyhyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5sb2FkX3BhcmFtLCBMT0FEUEFSTV9MRU4pOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3Vic3lzX2F0dHJpYnV0ZSBzeXNfcmVpcGxfY2N3X2xvYWRwYXJtX2F0dHIgPQorCV9fQVRUUihsb2FkcGFybSwgMDY0NCwgcmVpcGxfY2N3X2xvYWRwYXJtX3Nob3csCisJICAgICAgIHJlaXBsX2Njd19sb2FkcGFybV9zdG9yZSk7CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpyZWlwbF9jY3dfYXR0cnNbXSA9IHsKIAkmc3lzX3JlaXBsX2Njd19kZXZpY2VfYXR0ci5hdHRyLAorCSZzeXNfcmVpcGxfY2N3X2xvYWRwYXJtX2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtNTAyLDIzICs1NzYsNiBAQAogCiBzdGF0aWMgZGVjbF9zdWJzeXMoZHVtcCwgTlVMTCwgTlVMTCk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBkdW1wX3NtcF9zdG9wX2FsbCh2b2lkKQotewotCWludCBjcHU7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCi0JCQljb250aW51ZTsKLQkJd2hpbGUgKHNpZ25hbF9wcm9jZXNzb3IoY3B1LCBzaWdwX3N0b3ApID09IHNpZ3BfYnVzeSkKLQkJCXVkZWxheSgxMCk7Ci0JfQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0jZWxzZQotI2RlZmluZSBkdW1wX3NtcF9zdG9wX2FsbCgpIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAvKgogICogU2h1dGRvd24gYWN0aW9ucyBzZWN0aW9uCiAgKi8KQEAgLTU3MSwxMSArNjI4LDE0IEBACiB7CiAJc3RydWN0IGNjd19kZXZfaWQgZGV2aWQ7CiAJc3RhdGljIGNoYXIgYnVmWzEwMF07CisJY2hhciBsb2FkcGFybVtMT0FEUEFSTV9MRU4gKyAxXTsKIAogCXN3aXRjaCAocmVpcGxfdHlwZSkgewogCWNhc2UgSVBMX1RZUEVfQ0NXOgorCQlyZWlwbF9nZXRfYXNjaWlfbG9hZHBhcm0obG9hZHBhcm0pOwogCQlwcmludGsoS0VSTl9FTUVSRyAicmVib290IG9uIGNjdyBkZXZpY2U6IDAuMC4lMDR4XG4iLAogCQkJcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm8pOworCQlwcmludGsoS0VSTl9FTUVSRyAibG9hZHBhcm0gPSAnJXMnXG4iLCBsb2FkcGFybSk7CiAJCWJyZWFrOwogCWNhc2UgSVBMX1RZUEVfRkNQOgogCQlwcmludGsoS0VSTl9FTUVSRyAicmVib290IG9uIGZjcCBkZXZpY2U6XG4iKTsKQEAgLTU4OCwxMiArNjQ4LDE5IEBACiAJc3dpdGNoIChyZWlwbF9tZXRob2QpIHsKIAljYXNlIElQTF9NRVRIT0RfQ0NXX0NJTzoKIAkJZGV2aWQuZGV2bm8gPSByZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubzsKKwkJaWYgKGlwbF9nZXRfdHlwZSgpID09IElQTF9UWVBFX0NDVyAmJiBkZXZpZC5kZXZubyA9PSBpcGxfZGV2bm8pCisJCQlkaWFnMzA4KERJQUczMDhfSVBMLCBOVUxMKTsKIAkJZGV2aWQuc3NpZCAgPSAwOwogCQlyZWlwbF9jY3dfZGV2KCZkZXZpZCk7CiAJCWJyZWFrOwogCWNhc2UgSVBMX01FVEhPRF9DQ1dfVk06Ci0JCXNwcmludGYoYnVmLCAiSVBMICVYIiwgcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm8pOwotCQljcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOworCQlpZiAoc3RybGVuKGxvYWRwYXJtKSA9PSAwKQorCQkJc3ByaW50ZihidWYsICJJUEwgJVgiLAorCQkJCXJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmRldm5vKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYsICJJUEwgJVggTE9BRFBBUk0gJyVzJyIsCisJCQkJcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm8sIGxvYWRwYXJtKTsKKwkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIElQTF9NRVRIT0RfQ0NXX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9TRVQsIHJlaXBsX2Jsb2NrX2Njdyk7CkBAIC02MDcsMTYgKzY3NCwxNyBAQAogCQlkaWFnMzA4KERJQUczMDhfSVBMLCBOVUxMKTsKIAkJYnJlYWs7CiAJY2FzZSBJUExfTUVUSE9EX0ZDUF9ST19WTToKLQkJY3BjbWQoIklQTCIsIE5VTEwsIDAsIE5VTEwpOworCQlfX2NwY21kKCJJUEwiLCBOVUxMLCAwLCBOVUxMKTsKIAkJYnJlYWs7CiAJY2FzZSBJUExfTUVUSE9EX05PTkU6CiAJZGVmYXVsdDoKIAkJaWYgKE1BQ0hJTkVfSVNfVk0pCi0JCQljcGNtZCgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CisJCQlfX2NwY21kKCJJUEwiLCBOVUxMLCAwLCBOVUxMKTsKIAkJZGlhZzMwOChESUFHMzA4X0lQTCwgTlVMTCk7CiAJCWJyZWFrOwogCX0KLQlwYW5pYygicmVpcGwgZmFpbGVkIVxuIik7CisJcHJpbnRrKEtFUk5fRU1FUkcgInJlYm9vdCBmYWlsZWQhXG4iKTsKKwlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOwogfQogCiBzdGF0aWMgdm9pZCBkb19kdW1wKHZvaWQpCkBAIC02MzksMTcgKzcwNywxNyBAQAogCiAJc3dpdGNoIChkdW1wX21ldGhvZCkgewogCWNhc2UgSVBMX01FVEhPRF9DQ1dfQ0lPOgotCQlkdW1wX3NtcF9zdG9wX2FsbCgpOworCQlzbXBfc2VuZF9zdG9wKCk7CiAJCWRldmlkLmRldm5vID0gZHVtcF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubzsKIAkJZGV2aWQuc3NpZCAgPSAwOwogCQlyZWlwbF9jY3dfZGV2KCZkZXZpZCk7CiAJCWJyZWFrOwogCWNhc2UgSVBMX01FVEhPRF9DQ1dfVk06Ci0JCWR1bXBfc21wX3N0b3BfYWxsKCk7CisJCXNtcF9zZW5kX3N0b3AoKTsKIAkJc3ByaW50ZihidWYsICJTVE9SRSBTVEFUVVMiKTsKLQkJY3BjbWQoYnVmLCBOVUxMLCAwLCBOVUxMKTsKKwkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlzcHJpbnRmKGJ1ZiwgIklQTCAlWCIsIGR1bXBfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm8pOwotCQljcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOworCQlfX2NwY21kKGJ1ZiwgTlVMTCwgMCwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgSVBMX01FVEhPRF9DQ1dfRElBRzoKIAkJZGlhZzMwOChESUFHMzA4X1NFVCwgZHVtcF9ibG9ja19jY3cpOwpAQCAtNzQ2LDYgKzgxNCwxNyBAQAogCXJlaXBsX2Jsb2NrX2Njdy0+aGRyLnZlcnNpb24gPSBJUExfUEFSTV9CTE9DS19WRVJTSU9OOwogCXJlaXBsX2Jsb2NrX2Njdy0+aGRyLmJsazBfbGVuID0gc2l6ZW9mKHJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3KTsKIAlyZWlwbF9ibG9ja19jY3ctPmhkci5wYnQgPSBESUFHMzA4X0lQTF9UWVBFX0NDVzsKKwkvKiBjaGVjayBpZiByZWFkIHNjcCBpbmZvIHdvcmtlZCBhbmQgc2V0IGxvYWRwYXJtICovCisJaWYgKFNDQ0JfVkFMSUQpCisJCW1lbWNweShyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5sb2FkX3BhcmFtLAorCQkgICAgICAgU0NDQl9MT0FEUEFSTSwgTE9BRFBBUk1fTEVOKTsKKwllbHNlCisJCS8qIHJlYWQgc2NwIGluZm8gZmFpbGVkOiBzZXQgZW1wdHkgbG9hZHBhcm0gKEVCQ0RJQyBibGFua3MpICovCisJCW1lbXNldChyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5sb2FkX3BhcmFtLCAweDQwLAorCQkgICAgICAgTE9BRFBBUk1fTEVOKTsKKwkvKiBGSVhNRTogY2hlY2sgZm9yIGRpYWczMDhfc2V0X3dvcmtzIHdoZW4gZW5hYmxpbmcgZGlhZyBjY3cgcmVpcGwgKi8KKwlpZiAoIU1BQ0hJTkVfSVNfVk0pCisJCXN5c19yZWlwbF9jY3dfbG9hZHBhcm1fYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWlmIChpcGxfZ2V0X3R5cGUoKSA9PSBJUExfVFlQRV9DQ1cpCiAJCXJlaXBsX2Jsb2NrX2Njdy0+aXBsX2luZm8uY2N3LmRldm5vID0gaXBsX2Rldm5vOwogCXJlaXBsX2NhcGFiaWxpdGllcyB8PSBJUExfVFlQRV9DQ1c7CkBAIC04MjcsMTMgKzkwNiwxMSBAQAogCXJldHVybiAwOwogfQogCi1leHRlcm4gY2hhciBzMzkwX3JlYWRpbmZvX3NjY2JbXTsKLQogc3RhdGljIGludCBfX2luaXQgZHVtcF9mY3BfaW5pdCh2b2lkKQogewogCWludCByYzsKIAotCWlmKCEoczM5MF9yZWFkaW5mb19zY2NiWzkxXSAmIDB4MikpCisJaWYoIShTQ0NCX0ZMQUcgJiAweDIpIHx8ICFTQ0NCX1ZBTElEKQogCQlyZXR1cm4gMDsgLyogTERJUEwgRFVNUCBpcyBub3QgaW5zdGFsbGVkICovCiAJaWYgKCFkaWFnMzA4X3NldF93b3JrcykKIAkJcmV0dXJuIDA7CkBAIC05MzEsMyArMTAwOCw1MyBAQAogfQogCiBfX2luaXRjYWxsKHMzOTBfaXBsX2luaXQpOworCitzdGF0aWMgTElTVF9IRUFEKHJjYWxsKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocmNhbGxfbXV0ZXgpOworCit2b2lkIHJlZ2lzdGVyX3Jlc2V0X2NhbGwoc3RydWN0IHJlc2V0X2NhbGwgKnJlc2V0KQoreworCW11dGV4X2xvY2soJnJjYWxsX211dGV4KTsKKwlsaXN0X2FkZCgmcmVzZXQtPmxpc3QsICZyY2FsbCk7CisJbXV0ZXhfdW5sb2NrKCZyY2FsbF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9yZXNldF9jYWxsKTsKKwordm9pZCB1bnJlZ2lzdGVyX3Jlc2V0X2NhbGwoc3RydWN0IHJlc2V0X2NhbGwgKnJlc2V0KQoreworCW11dGV4X2xvY2soJnJjYWxsX211dGV4KTsKKwlsaXN0X2RlbCgmcmVzZXQtPmxpc3QpOworCW11dGV4X3VubG9jaygmcmNhbGxfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9yZXNldF9jYWxsKTsKKworc3RhdGljIHZvaWQgZG9fcmVzZXRfY2FsbHModm9pZCkKK3sKKwlzdHJ1Y3QgcmVzZXRfY2FsbCAqcmVzZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlc2V0LCAmcmNhbGwsIGxpc3QpCisJCXJlc2V0LT5mbigpOworfQorCitleHRlcm4gdm9pZCByZXNldF9tY2NrX2hhbmRsZXIodm9pZCk7CisKK3ZvaWQgczM5MF9yZXNldF9zeXN0ZW0odm9pZCkKK3sKKwlzdHJ1Y3QgX2xvd2NvcmUgKmxjOworCisJLyogU3RhY2sgZm9yIGludGVycnVwdC9tYWNoaW5lIGNoZWNrIGhhbmRsZXIgKi8KKwlsYyA9IChzdHJ1Y3QgX2xvd2NvcmUgKikodW5zaWduZWQgbG9uZykgc3RvcmVfcHJlZml4KCk7CisJbGMtPnBhbmljX3N0YWNrID0gUzM5MF9sb3djb3JlLnBhbmljX3N0YWNrOworCisJLyogRGlzYWJsZSBwcmVmaXhpbmcgKi8KKwlzZXRfcHJlZml4KDApOworCisJLyogRGlzYWJsZSBsb3djb3JlIHByb3RlY3Rpb24gKi8KKwlfX2N0bF9jbGVhcl9iaXQoMCwyOCk7CisKKwkvKiBTZXQgbmV3IG1hY2hpbmUgY2hlY2sgaGFuZGxlciAqLworCVMzOTBfbG93Y29yZS5tY2NrX25ld19wc3cubWFzayA9IFBTV19LRVJORUxfQklUUyAmIH5QU1dfTUFTS19NQ0hFQ0s7CisJUzM5MF9sb3djb3JlLm1jY2tfbmV3X3Bzdy5hZGRyID0KKwkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgJnJlc2V0X21jY2tfaGFuZGxlcjsKKwlkb19yZXNldF9jYWxscygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwppbmRleCA2NzkxNGZlLi41NzYzNjhjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24pOworCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOwogCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCA2MGIxZWE5Li5mNmQ5YmNjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMSwxNSArMSwxMCBAQAogLyoKICAqIGFyY2gvczM5MC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCiAgKgotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA1LDIwMDYKICAqCi0gKiBBdXRob3Iocyk6IFJvbGYgQWRlbHNiZXJnZXIgPGFkZWxzYmVyZ2VyQGRlLmlibS5jb20+Ci0gKgotICovCi0KLS8qCi0gKiBzMzkwX21hY2hpbmVfa2V4ZWMuYyAtIGhhbmRsZSB0aGUgdHJhbnNpdGlvbiBvZiBMaW51eCBib290aW5nIGFub3RoZXIga2VybmVsCi0gKiBvbiB0aGUgUzM5MCBhcmNoaXRlY3R1cmUuCisgKiBBdXRob3Iocyk6IFJvbGYgQWRlbHNiZXJnZXIsCisgKgkgICAgICBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbT4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0yMiw4NiArMTcsNDkgQEAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL3Jlc2V0Lmg+CiAKLXN0YXRpYyB2b2lkIGtleGVjX2hhbHRfYWxsX2NwdXModm9pZCAqKTsKLQotdHlwZWRlZiB2b2lkICgqcmVsb2NhdGVfa2VybmVsX3QpIChraW1hZ2VfZW50cnlfdCAqLCB1bnNpZ25lZCBsb25nKTsKK3R5cGVkZWYgdm9pZCAoKnJlbG9jYXRlX2tlcm5lbF90KShraW1hZ2VfZW50cnlfdCAqLCB1bnNpZ25lZCBsb25nKTsKIAogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfa2VybmVsW107CiBleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHJlbG9jYXRlX2tlcm5lbF9sZW47CiAKLWludAotbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoraW50IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKIHsKLQl1bnNpZ25lZCBsb25nIHJlYm9vdF9jb2RlX2J1ZmZlcjsKKwl2b2lkICpyZWJvb3RfY29kZV9idWZmZXI7CiAKIAkvKiBXZSBkb24ndCBzdXBwb3J0IGFueXRoaW5nIGJ1dCB0aGUgZGVmYXVsdCBpbWFnZSB0eXBlIGZvciBub3cuICovCiAJaWYgKGltYWdlLT50eXBlICE9IEtFWEVDX1RZUEVfREVGQVVMVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSBhc3NlbWJsZXIgY29kZSBzaG91bGQgYmUgY29waWVkIHRvLiovCi0JcmVib290X2NvZGVfYnVmZmVyID0gcGFnZV90b19wZm4oaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKTw8UEFHRV9TSElGVDsKKwlyZWJvb3RfY29kZV9idWZmZXIgPSAodm9pZCAqKSBwYWdlX3RvX3BoeXMoaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKTsKIAogCS8qIFRoZW4gY29weSBpdCAqLwotCW1lbWNweSgodm9pZCAqKSByZWJvb3RfY29kZV9idWZmZXIsIHJlbG9jYXRlX2tlcm5lbCwKLQkgICAgICAgcmVsb2NhdGVfa2VybmVsX2xlbik7CisJbWVtY3B5KHJlYm9vdF9jb2RlX2J1ZmZlciwgcmVsb2NhdGVfa2VybmVsLCByZWxvY2F0ZV9rZXJuZWxfbGVuKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAotbWFjaGluZV9rZXhlY19jbGVhbnVwKHN0cnVjdCBraW1hZ2UgKmltYWdlKQordm9pZCBtYWNoaW5lX2tleGVjX2NsZWFudXAoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCiB7CiB9CiAKLXZvaWQKLW1hY2hpbmVfc2h1dGRvd24odm9pZCkKK3ZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gImtleGVjOiBtYWNoaW5lX3NodXRkb3duIGNhbGxlZFxuIik7CiB9CiAKLU5PUkVUX1RZUEUgdm9pZAotbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3ZvaWQgbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKIHsKLQljbGVhcl9hbGxfc3ViY2hhbm5lbHMoKTsKLQljaW9fcmVzZXRfY2hhbm5lbF9wYXRocygpOwotCi0JLyogRGlzYWJsZSBsb3djb3JlIHByb3RlY3Rpb24gKi8KLQljdGxfY2xlYXJfYml0KDAsMjgpOwotCi0Jb25fZWFjaF9jcHUoa2V4ZWNfaGFsdF9hbGxfY3B1cywgaW1hZ2UsIDAsIDApOwotCWZvciAoOzspOwotfQotCi1leHRlcm4gdm9pZCBwZmF1bHRfZmluaSh2b2lkKTsKLQotc3RhdGljIHZvaWQKLWtleGVjX2hhbHRfYWxsX2NwdXModm9pZCAqa2VybmVsX2ltYWdlKQotewotCXN0YXRpYyBhdG9taWNfdCBjcHVpZCA9IEFUT01JQ19JTklUKC0xKTsKLQlpbnQgY3B1OwotCXN0cnVjdCBraW1hZ2UgKmltYWdlOwogCXJlbG9jYXRlX2tlcm5lbF90IGRhdGFfbW92ZXI7CiAKLSNpZmRlZiBDT05GSUdfUEZBVUxUCi0JaWYgKE1BQ0hJTkVfSVNfVk0pCi0JCXBmYXVsdF9maW5pKCk7Ci0jZW5kaWYKKwlzbXBfc2VuZF9zdG9wKCk7CisJcGZhdWx0X2ZpbmkoKTsKKwlzMzkwX3Jlc2V0X3N5c3RlbSgpOwogCi0JaWYgKGF0b21pY19jbXB4Y2hnKCZjcHVpZCwgLTEsIHNtcF9wcm9jZXNzb3JfaWQoKSkgIT0gLTEpCi0JCXNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3ApOwotCi0JLyogV2FpdCBmb3IgYWxsIG90aGVyIGNwdXMgdG8gZW50ZXIgc3RvcHBlZCBzdGF0ZSAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQotCQkJY29udGludWU7Ci0JCXdoaWxlICghc21wX2NwdV9ub3RfcnVubmluZyhjcHUpKQotCQkJY3B1X3JlbGF4KCk7Ci0JfQotCi0JaW1hZ2UgPSAoc3RydWN0IGtpbWFnZSAqKSBrZXJuZWxfaW1hZ2U7Ci0JZGF0YV9tb3ZlciA9IChyZWxvY2F0ZV9rZXJuZWxfdCkKLQkJKHBhZ2VfdG9fcGZuKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSkgPDwgUEFHRV9TSElGVCk7CisJZGF0YV9tb3ZlciA9IChyZWxvY2F0ZV9rZXJuZWxfdCkgcGFnZV90b19waHlzKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSk7CiAKIAkvKiBDYWxsIHRoZSBtb3Zpbmcgcm91dGluZSAqLwotCSgqZGF0YV9tb3ZlcikgKCZpbWFnZS0+aGVhZCwgaW1hZ2UtPnN0YXJ0KTsKKwkoKmRhdGFfbW92ZXIpKCZpbWFnZS0+aGVhZCwgaW1hZ2UtPnN0YXJ0KTsKKwlmb3IgKDs7KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUwppbmRleCAwMzQwNDc3Li5mOTQzNGQ0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbC5TCkBAIC0xMSwxOSArMTEsMTAgQEAKIAkJLmdsb2JsCWRvX3JlaXBsX2FzbQogZG9fcmVpcGxfYXNtOgliYXNyCSVyMTMsMAogLkxwZzA6CQlscHN3CS5MbmV3cHN3LS5McGcwKCVyMTMpCi0KLQkJIyBzd2l0Y2ggb2ZmIGxvd2NvcmUgcHJvdGVjdGlvbgotCi0uTHBnMToJCXN0Y3RsCSVjMCwlYzAsLkxjdGxzYXZlMS0uTHBnMCglcjEzKQotCQlzdGN0bAklYzAsJWMwLC5MY3Rsc2F2ZTItLkxwZzAoJXIxMykKLQkJbmkJLkxjdGxzYXZlMS0uTHBnMCglcjEzKSwweGVmCi0JCWxjdGwJJWMwLCVjMCwuTGN0bHNhdmUxLS5McGcwKCVyMTMpCi0KLQkJIyBkbyBzdG9yZSBzdGF0dXMgb2YgYWxsIHJlZ2lzdGVycworLkxwZzE6CQkjIGRvIHN0b3JlIHN0YXR1cyBvZiBhbGwgcmVnaXN0ZXJzCiAKIAkJc3RtCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQQogCQlzdGN0bAklYzAsJWMxNSxfX0xDX0NSRUdTX1NBVkVfQVJFQQotCQltdmMJX19MQ19DUkVHU19TQVZFX0FSRUEoNCksLkxjdGxzYXZlMi0uTHBnMCglcjEzKQogCQlzdGFtCSVhMCwlYTE1LF9fTENfQVJFR1NfU0FWRV9BUkVBCiAJCXN0cHgJX19MQ19QUkVGSVhfU0FWRV9BUkVBCiAJCXN0Y2tjCS5MY2xrY21wLS5McGcwKCVyMTMpCkBAIC01Niw4ICs0Nyw3IEBACiAuTDAwMjoJCXRtCS5MaXBsaXJiKzgtLkxwZzAoJXIxMyksMHhmMwogCQlqegkuTDAwMwogCQliYXMJJXIxNCwuTGRpc2FiLS5McGcwKCVyMTMpCi0uTDAwMzoJCXNweAkuTG51bGwtLkxwZzAoJXIxMykKLQkJc3QJJXIxLF9fTENfU1VCQ0hBTk5FTF9JRAorLkwwMDM6CQlzdAklcjEsX19MQ19TVUJDSEFOTkVMX0lECiAJCWxwc3cJMAogCQlzaWdwCTAsMCwwKDYpCiAuTGRpc2FiOglzdAklcjE0LC5MZGlzcHN3KzQtLkxwZzAoJXIxMykKQEAgLTY1LDkgKzU1LDYgQEAKIAkJLmFsaWduCTgKIC5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKIC5MYWxsOgkJLmxvbmcJMHhmZjAwMDAwMAotLkxudWxsOgkJLmxvbmcJMHgwMDAwMDAwMAotLkxjdGxzYXZlMToJLmxvbmcJMHgwMDAwMDAwMAotLkxjdGxzYXZlMjoJLmxvbmcJMHgwMDAwMDAwMAogCQkuYWxpZ24JOAogLkxuZXdwc3c6CS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMCsuTHBnMQogLkxwY25ldzoJLmxvbmcJMHgwMDA4MDAwMCwweDgwMDAwMDAwKy5MZWNzCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCmluZGV4IGRlNzQzNTAuLmYxOGVmMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCkBAIC0xMCwxMCArMTAsMTAgQEAKICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgogCQkuZ2xvYmwJZG9fcmVpcGxfYXNtCiBkb19yZWlwbF9hc206CWJhc3IJJXIxMywwCisuTHBnMDoJCWxwc3dlCS5MbmV3cHN3LS5McGcwKCVyMTMpCisuTHBnMToJCSMgZG8gc3RvcmUgc3RhdHVzIG9mIGFsbCByZWdpc3RlcnMKIAotCQkjIGRvIHN0b3JlIHN0YXR1cyBvZiBhbGwgcmVnaXN0ZXJzCi0KLS5McGcwOgkJc3RnCSVyMSwuTHJlZ3NhdmUtLkxwZzAoJXIxMykKKwkJc3RnCSVyMSwuTHJlZ3NhdmUtLkxwZzAoJXIxMykKIAkJbGdoaQklcjEsMHgxMDAwCiAJCXN0bWcJJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBLTB4MTAwMCglcjEpCiAJCWxnCSVyMCwuTHJlZ3NhdmUtLkxwZzAoJXIxMykKQEAgLTI3LDExICsyNyw3IEBACiAJCXN0cHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLTB4MTAwMCglcjEpCiAJCXN0ZwklcjEzLCBfX0xDX1BTV19TQVZFX0FSRUEtMHgxMDAwKzgoJXIxKQogCi0JCWxwc3dlCS5MbmV3cHN3LS5McGcwKCVyMTMpCi0uTHBnMToJCWxjdGxnCSVjNiwlYzYsLkxhbGwtLkxwZzAoJXIxMykKLQkJc3RjdGcJJWMwLCVjMCwuTHJlZ3NhdmUtLkxwZzAoJXIxMykKLQkJbmkJLkxyZWdzYXZlKzQtLkxwZzAoJXIxMyksMHhlZgotCQlsY3RsZwklYzAsJWMwLC5McmVnc2F2ZS0uTHBnMCglcjEzKQorCQlsY3RsZwklYzYsJWM2LC5MYWxsLS5McGcwKCVyMTMpCiAJCWxncgklcjEsJXIyCiAJCW12YwlfX0xDX1BHTV9ORVdfUFNXKDE2KSwuTHBjbmV3LS5McGcwKCVyMTMpCiAJCXN0c2NoCS5Mc2NoaWItLkxwZzAoJXIxMykKQEAgLTU2LDggKzUyLDcgQEAKIC5MMDAyOgkJdG0JLkxpcGxpcmIrOC0uTHBnMCglcjEzKSwweGYzCiAJCWp6CS5MMDAzCiAJCWJhcwklcjE0LC5MZGlzYWItLkxwZzAoJXIxMykKLS5MMDAzOgkJc3B4CS5MbnVsbC0uTHBnMCglcjEzKQotCQlzdAklcjEsX19MQ19TVUJDSEFOTkVMX0lECisuTDAwMzoJCXN0CSVyMSxfX0xDX1NVQkNIQU5ORUxfSUQKIAkJbGhpCSVyMSwwCQkgIyBtb2RlIDAgPSBlc2EKIAkJc2xyCSVyMCwlcjAgCSAjIHNldCBjcHVpZCB0byB6ZXJvCiAJCXNpZ3AJJXIxLCVyMCwweDEyCSAjIHN3aXRjaCB0byBlc2EgbW9kZQpAQCAtNzAsNyArNjUsNiBAQAogLkxjbGtjbXA6CS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMAogLkxhbGw6CQkucXVhZAkweDAwMDAwMDAwZmYwMDAwMDAKIC5McmVnc2F2ZToJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwCi0uTG51bGw6CQkubG9uZwkweDAwMDAwMDAwMDAwMDAwMDAKIAkJLmFsaWduCTE2CiAvKgogICogVGhlc2UgYWRkcmVzc2VzIGhhdmUgdG8gYmUgMzEgYml0IG90aGVyd2lzZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKaW5kZXggZjk4OTlmZi4uM2I0NTZiOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCkBAIC0yNiw4ICsyNiw3IEBACiAJcmVsb2NhdGVfa2VybmVsOgogCQliYXNyCSVyMTMsMAkJIyBiYXNlIGFkZHJlc3MKIAkuYmFzZToKLQkJc3Ruc20Jc3lzX21zay0uYmFzZSglcjEzKSwweGY4CSMgZGlzYWJsZSBEQVQgYW5kIElSUSAoZXh0ZXJuYWwpCi0JCXNweAl6ZXJvNjQtLmJhc2UoJXIxMykJIyBhYnNvbHV0ZSBhZGRyZXNzaW5nIG1vZGUKKwkJc3Ruc20Jc3lzX21zay0uYmFzZSglcjEzKSwweGZiCSMgZGlzYWJsZSBEQVQKIAkJc3RjdGwJJWMwLCVjMTUsY3RscmVncy0uYmFzZSglcjEzKQogCQlzdG0JJXIwLCVyMTUsZ3BycmVncy0uYmFzZSglcjEzKQogCQlsYQklcjEsbG9hZF9wc3ctLmJhc2UoJXIxMykKQEAgLTk3LDggKzk2LDYgQEAKIAkJbHBzdwkwCQkjIGhvcGVmdWxseSBzdGFydCBuZXcga2VybmVsLi4uCiAKIAkJLmFsaWduCTgKLQl6ZXJvNjQ6Ci0JCS5xdWFkCTAKIAlsb2FkX3BzdzoKIAkJLmxvbmcJMHgwMDA4MDAwMCwweDgwMDAwMDAwCiAJc3lzX21zazoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsNjQuUwppbmRleCA0ZmI0NDMwLi4xZjllYTIwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbDY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWw2NC5TCkBAIC0yNyw4ICsyNyw3IEBACiAJcmVsb2NhdGVfa2VybmVsOgogCQliYXNyCSVyMTMsMAkJIyBiYXNlIGFkZHJlc3MKIAkuYmFzZToKLQkJc3Ruc20Jc3lzX21zay0uYmFzZSglcjEzKSwweGY4CSMgZGlzYWJsZSBEQVQgYW5kIElSUXMKLQkJc3B4CXplcm82NC0uYmFzZSglcjEzKQkjIGFic29sdXRlIGFkZHJlc3NpbmcgbW9kZQorCQlzdG5zbQlzeXNfbXNrLS5iYXNlKCVyMTMpLDB4ZmIJIyBkaXNhYmxlIERBVAogCQlzdGN0ZwklYzAsJWMxNSxjdGxyZWdzLS5iYXNlKCVyMTMpCiAJCXN0bWcJJXIwLCVyMTUsZ3BycmVncy0uYmFzZSglcjEzKQogCQlsZ2hpCSVyMCwzCkBAIC0xMDAsOCArOTksNiBAQAogCQlscHN3CTAJCSMgaG9wZWZ1bGx5IHN0YXJ0IG5ldyBrZXJuZWwuLi4KIAogCQkuYWxpZ24JOAotCXplcm82NDoKLQkJLnF1YWQJMAogCWxvYWRfcHN3OgogCQkubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDAKIAlzeXNfbXNrOgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9yZXNldC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZXNldC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODY4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL3Jlc2V0LlMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqICBhcmNoL3MzOTAva2VybmVsL3Jlc2V0LlMKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIElCTSBDb3JwLiAyMDA2CisgKiAgICBBdXRob3Iocyk6IEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKworI2lmZGVmIENPTkZJR182NEJJVAorCisJLmdsb2JsCXJlc2V0X21jY2tfaGFuZGxlcgorcmVzZXRfbWNja19oYW5kbGVyOgorCWJhc3IJJXIxMywwCiswOglsZwklcjE1LF9fTENfUEFOSUNfU1RBQ0sJIyBsb2FkIHBhbmljIHN0YWNrCisJYWdoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRAorCWxnCSVyMSxzMzkwX3Jlc2V0X21jY2tfaGFuZGxlci0wYiglcjEzKQorCWx0Z3IJJXIxLCVyMQorCWp6CTFmCisJYmFzcgklcjE0LCVyMQorMToJbGEJJXIxLDQwOTUKKwlsbWcJJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBLTQwOTUoJXIxKQorCWxwc3dlCV9fTENfTUNLX09MRF9QU1cKKworCS5nbG9ibAlzMzkwX3Jlc2V0X21jY2tfaGFuZGxlcgorczM5MF9yZXNldF9tY2NrX2hhbmRsZXI6CisJLnF1YWQJMAorCisjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KKworCS5nbG9ibAlyZXNldF9tY2NrX2hhbmRsZXIKK3Jlc2V0X21jY2tfaGFuZGxlcjoKKwliYXNyCSVyMTMsMAorMDoJbAklcjE1LF9fTENfUEFOSUNfU1RBQ0sJIyBsb2FkIHBhbmljIHN0YWNrCisJYWhpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECisJbAklcjEsczM5MF9yZXNldF9tY2NrX2hhbmRsZXItMGIoJXIxMykKKwlsdHIJJXIxLCVyMQorCWp6CTFmCisJYmFzcgklcjE0LCVyMQorMToJbG0JJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBCisJbHBzdwlfX0xDX01DS19PTERfUFNXCisKKwkuZ2xvYmwJczM5MF9yZXNldF9tY2NrX2hhbmRsZXIKK3MzOTBfcmVzZXRfbWNja19oYW5kbGVyOgorCS5sb25nCTAKKworI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2V4dC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zMzkwX2V4dC5jCmluZGV4IDRmYWY5NmYuLmJjNWJlYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvczM5MF9leHQuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3MzOTBfZXh0LmMKQEAgLTM3LDcgKzM3LDcgQEAKICAgICAgICAgZXh0X2ludF9pbmZvX3QgKnA7CiAgICAgICAgIGludCBpbmRleDsKIAotCXAgPSAoZXh0X2ludF9pbmZvX3QgKikga21hbGxvYyhzaXplb2YoZXh0X2ludF9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKKwlwID0ga21hbGxvYyhzaXplb2YoZXh0X2ludF9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKICAgICAgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgcC0+Y29kZSA9IGNvZGU7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKaW5kZXggNDlmMmI2OC4uNDllZjIwNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtNjIsMTMgKzYyLDkgQEAKIHVuc2lnbmVkIGludCBjb25zb2xlX21vZGUgPSAwOwogdW5zaWduZWQgaW50IGNvbnNvbGVfZGV2bm8gPSAtMTsKIHVuc2lnbmVkIGludCBjb25zb2xlX2lycSA9IC0xOwotdW5zaWduZWQgbG9uZyBtZW1vcnlfc2l6ZSA9IDA7CiB1bnNpZ25lZCBsb25nIG1hY2hpbmVfZmxhZ3MgPSAwOwotc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIGFkZHIsIHNpemUsIHR5cGU7Ci19IG1lbW9yeV9jaHVua1tNRU1PUllfQ0hVTktTXSA9IHsgeyAwIH0gfTsKLSNkZWZpbmUgQ0hVTktfUkVBRF9XUklURSAwCi0jZGVmaW5lIENIVU5LX1JFQURfT05MWSAxCisKK3N0cnVjdCBtZW1fY2h1bmsgX19pbml0ZGF0YSBtZW1vcnlfY2h1bmtbTUVNT1JZX0NIVU5LU107CiB2b2xhdGlsZSBpbnQgX19jcHVfbG9naWNhbF9tYXBbTlJfQ1BVU107IC8qIGxvZ2ljYWwgY3B1IHRvIGNwdSBhZGRyZXNzICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIG1lbW9yeV9lbmQ7CiAKQEAgLTIyOCwxMSArMjI0LDExIEBACiAJY2hhciAqcHRyOwogCiAgICAgICAgIGlmIChNQUNISU5FX0lTX1ZNKSB7Ci0JCV9fY3BjbWQoIlFVRVJZIENPTlNPTEUiLCBxdWVyeV9idWZmZXIsIDEwMjQsIE5VTEwpOworCQljcGNtZCgiUVVFUlkgQ09OU09MRSIsIHF1ZXJ5X2J1ZmZlciwgMTAyNCwgTlVMTCk7CiAJCWNvbnNvbGVfZGV2bm8gPSBzaW1wbGVfc3RydG91bChxdWVyeV9idWZmZXIgKyA1LCBOVUxMLCAxNik7CiAJCXB0ciA9IHN0cnN0cihxdWVyeV9idWZmZXIsICJTVUJDSEFOTkVMID0iKTsKIAkJY29uc29sZV9pcnEgPSBzaW1wbGVfc3RydG91bChwdHIgKyAxMywgTlVMTCwgMTYpOwotCQlfX2NwY21kKCJRVUVSWSBURVJNIiwgcXVlcnlfYnVmZmVyLCAxMDI0LCBOVUxMKTsKKwkJY3BjbWQoIlFVRVJZIFRFUk0iLCBxdWVyeV9idWZmZXIsIDEwMjQsIE5VTEwpOwogCQlwdHIgPSBzdHJzdHIocXVlcnlfYnVmZmVyLCAiQ09OTU9ERSIpOwogCQkvKgogCQkgKiBTZXQgdGhlIGNvbm1vZGUgdG8gMzIxNSBzbyB0aGF0IHRoZSBkZXZpY2UgcmVjb2duaXRpb24gCkBAIC0yNDEsNyArMjM3LDcgQEAKIAkJICogMzIxNSBhbmQgdGhlIDMyNzAgZHJpdmVyIHdpbGwgdHJ5IHRvIGFjY2VzcyB0aGUgY29uc29sZQogCQkgKiBkZXZpY2UgKDMyMTUgYXMgY29uc29sZSBhbmQgMzI3MCBhcyBub3JtYWwgdHR5KS4KIAkJICovCi0JCV9fY3BjbWQoIlRFUk0gQ09OTU9ERSAzMjE1IiwgTlVMTCwgMCwgTlVMTCk7CisJCWNwY21kKCJURVJNIENPTk1PREUgMzIxNSIsIE5VTEwsIDAsIE5VTEwpOwogCQlpZiAocHRyID09IE5VTEwpIHsKICNpZiBkZWZpbmVkKENPTkZJR19TQ0xQX0NPTlNPTEUpCiAJCQlTRVRfQ09OU09MRV9TQ0xQOwpAQCAtMjk4LDE0ICsyOTQsMTQgQEAKIHN0YXRpYyB2b2lkIGRvX21hY2hpbmVfaGFsdF9ub25zbXAodm9pZCkKIHsKICAgICAgICAgaWYgKE1BQ0hJTkVfSVNfVk0gJiYgc3RybGVuKHZtaGFsdF9jbWQpID4gMCkKLSAgICAgICAgICAgICAgICBjcGNtZCh2bWhhbHRfY21kLCBOVUxMLCAwLCBOVUxMKTsKKwkJX19jcGNtZCh2bWhhbHRfY21kLCBOVUxMLCAwLCBOVUxMKTsKICAgICAgICAgc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgZG9fbWFjaGluZV9wb3dlcl9vZmZfbm9uc21wKHZvaWQpCiB7CiAgICAgICAgIGlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bXBvZmZfY21kKSA+IDApCi0gICAgICAgICAgICAgICAgY3BjbWQodm1wb2ZmX2NtZCwgTlVMTCwgMCwgTlVMTCk7CisJCV9fY3BjbWQodm1wb2ZmX2NtZCwgTlVMTCwgMCwgTlVMTCk7CiAgICAgICAgIHNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7CiB9CiAKQEAgLTQzNCw3ICs0MzAsNyBAQAogCQlsYy0+ZXh0ZW5kZWRfc2F2ZV9hcmVhX2FkZHIgPSAoX191MzIpCiAJCQlfX2FsbG9jX2Jvb3RtZW0oUEFHRV9TSVpFLCBQQUdFX1NJWkUsIDApOwogCQkvKiBlbmFibGUgZXh0ZW5kZWQgc2F2ZSBhcmVhICovCi0JCWN0bF9zZXRfYml0KDE0LCAyOSk7CisJCV9fY3RsX3NldF9iaXQoMTQsIDI5KTsKIAl9CiAjZW5kaWYKIAlzZXRfcHJlZml4KCh1MzIpKHVuc2lnbmVkIGxvbmcpIGxjKTsKQEAgLTQ3Myw2ICs0NjksMzcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9tZW1vcnlfZW5kKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByZWFsX3NpemUsIG1lbW9yeV9zaXplOworCXVuc2lnbmVkIGxvbmcgbWF4X21lbSwgbWF4X3BoeXM7CisJaW50IGk7CisKKwltZW1vcnlfc2l6ZSA9IHJlYWxfc2l6ZSA9IDA7CisJbWF4X3BoeXMgPSBWTUFMTE9DX0VORCAtIFZNQUxMT0NfTUlOX1NJWkU7CisJbWVtb3J5X2VuZCAmPSBQQUdFX01BU0s7CisKKwltYXhfbWVtID0gbWVtb3J5X2VuZCA/IG1pbihtYXhfcGh5cywgbWVtb3J5X2VuZCkgOiBtYXhfcGh5czsKKworCWZvciAoaSA9IDA7IGkgPCBNRU1PUllfQ0hVTktTOyBpKyspIHsKKwkJc3RydWN0IG1lbV9jaHVuayAqY2h1bmsgPSAmbWVtb3J5X2NodW5rW2ldOworCisJCXJlYWxfc2l6ZSA9IG1heChyZWFsX3NpemUsIGNodW5rLT5hZGRyICsgY2h1bmstPnNpemUpOworCQlpZiAoY2h1bmstPmFkZHIgPj0gbWF4X21lbSkgeworCQkJbWVtc2V0KGNodW5rLCAwLCBzaXplb2YoKmNodW5rKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2h1bmstPmFkZHIgKyBjaHVuay0+c2l6ZSA+IG1heF9tZW0pCisJCQljaHVuay0+c2l6ZSA9IG1heF9tZW0gLSBjaHVuay0+YWRkcjsKKwkJbWVtb3J5X3NpemUgPSBtYXgobWVtb3J5X3NpemUsIGNodW5rLT5hZGRyICsgY2h1bmstPnNpemUpOworCX0KKwlpZiAoIW1lbW9yeV9lbmQpCisJCW1lbW9yeV9lbmQgPSBtZW1vcnlfc2l6ZTsKKwlpZiAocmVhbF9zaXplID4gbWVtb3J5X2VuZCkKKwkJcHJpbnRrKCJNb3JlIG1lbW9yeSBkZXRlY3RlZCB0aGFuIHN1cHBvcnRlZC4gVW51c2VkOiAlbHVrXG4iLAorCQkgICAgICAgKHJlYWxfc2l6ZSAtIG1lbW9yeV9lbmQpID4+IDEwKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0CiBzZXR1cF9tZW1vcnkodm9pZCkKIHsKQEAgLTYxNiw4ICs2NDMsNiBAQAogCWluaXRfbW0uZW5kX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJl9lZGF0YTsKIAlpbml0X21tLmJyayA9ICh1bnNpZ25lZCBsb25nKSAmX2VuZDsKIAotCW1lbW9yeV9lbmQgPSBtZW1vcnlfc2l6ZTsKLQogCWlmIChNQUNISU5FX0hBU19NVkNPUykKIAkJbWVtY3B5KCZ1YWNjZXNzLCAmdWFjY2Vzc19tdmNvcywgc2l6ZW9mKHVhY2Nlc3MpKTsKIAllbHNlCkBAIC02MjUsMjAgKzY1MCw3IEBACiAKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCi0jaWZuZGVmIENPTkZJR182NEJJVAotCW1lbW9yeV9lbmQgJj0gfjB4NDAwMDAwVUw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbmVlZCBzb21lIGZyZWUgdmlydHVhbCBzcGFjZSB0byBiZSBhYmxlIHRvIGRvIHZtYWxsb2MuCi0gICAgICAgICAqIE9uIGEgbWFjaGluZSB3aXRoIDJHQiBtZW1vcnkgd2UgbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhdAotICAgICAgICAgKiBsZWFzdCAxMjggTUIgZnJlZSBzcGFjZSBmb3Igdm1hbGxvYy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChtZW1vcnlfZW5kID4gMTkyMCoxMDI0KjEwMjQpCi0gICAgICAgICAgICAgICAgbWVtb3J5X2VuZCA9IDE5MjAqMTAyNCoxMDI0OwotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0JbWVtb3J5X2VuZCAmPSB+MHgyMDAwMDBVTDsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQorCXNldHVwX21lbW9yeV9lbmQoKTsKIAlzZXR1cF9tZW1vcnkoKTsKIAlzZXR1cF9yZXNvdXJjZXMoKTsKIAlzZXR1cF9sb3djb3JlKCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwppbmRleCA0MzkyYTc3Li40YzhhNzk1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKQEAgLTgwLDEwICs4MCwxMCBAQAogCQlvbGRfc2lnc2V0X3QgbWFzazsKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFjdCwgc2l6ZW9mKCphY3QpKSB8fAogCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfaGFuZGxlciwgJmFjdC0+c2FfaGFuZGxlcikgfHwKLQkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikpCisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpIHx8CisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpIHx8CisJCSAgICBfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCV9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncyk7Ci0JCV9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzayk7CiAJCXNpZ2luaXRzZXQoJm5ld19rYS5zYS5zYV9tYXNrLCBtYXNrKTsKIAl9CiAKQEAgLTkyLDEwICs5MiwxMCBAQAogCWlmICghcmV0ICYmIG9hY3QpIHsKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvYWN0LCBzaXplb2YoKm9hY3QpKSB8fAogCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSkKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKTsKLQkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKaW5kZXggNjI4MjIyNC4uMTkwOTBmNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC0yMzAsMTggKzIzMCwzNyBAQAogICAgICAgICB9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb193YWl0X2Zvcl9zdG9wKHZvaWQpCit7CisJaW50IGNwdTsKKworCS8qIFdhaXQgZm9yIGFsbCBvdGhlciBjcHVzIHRvIGVudGVyIHN0b3BwZWQgc3RhdGUgKi8KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJCWNvbnRpbnVlOworCQl3aGlsZSghc21wX2NwdV9ub3RfcnVubmluZyhjcHUpKQorCQkJY3B1X3JlbGF4KCk7CisJfQorfQorCiAvKgogICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdzdG9wJyBzaWdwIHRvIGFsbCBvdGhlciBDUFVzIGluIHRoZSBzeXN0ZW0uCiAgKiBpdCBnb2VzIHN0cmFpZ2h0IHRocm91Z2guCiAgKi8KIHZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQogeworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMvbWFjaGluZSBjaGVja3MgKi8KKwlfX2xvYWRfcHN3X21hc2soUFNXX0tFUk5FTF9CSVRTICYgflBTV19NQVNLX01DSEVDSyk7CisKICAgICAgICAgLyogd3JpdGUgbWFnaWMgbnVtYmVyIHRvIHplcm8gcGFnZSAoYWJzb2x1dGUgMCkgKi8KIAlsb3djb3JlX3B0cltzbXBfcHJvY2Vzc29yX2lkKCldLT5wYW5pY19tYWdpYyA9IF9fUEFOSUNfTUFHSUM7CiAKIAkvKiBzdG9wIG90aGVyIHByb2Nlc3NvcnMuICovCiAJZG9fc2VuZF9zdG9wKCk7CiAKKwkvKiB3YWl0IHVudGlsIG90aGVyIHByb2Nlc3NvcnMgYXJlIHN0b3BwZWQgKi8KKwlkb193YWl0X2Zvcl9zdG9wKCk7CisKIAkvKiBzdG9yZSBzdGF0dXMgb2Ygb3RoZXIgcHJvY2Vzc29ycy4gKi8KIAlkb19zdG9yZV9zdGF0dXMoKTsKIH0KQEAgLTI1MCw4OCArMjY5LDI4IEBACiAgKiBSZWJvb3QsIGhhbHQgYW5kIHBvd2VyX29mZiByb3V0aW5lcyBmb3IgU01QLgogICovCiAKLXN0YXRpYyB2b2lkIGRvX21hY2hpbmVfcmVzdGFydCh2b2lkICogX191bnVzZWQpCi17Ci0JaW50IGNwdTsKLQlzdGF0aWMgYXRvbWljX3QgY3B1aWQgPSBBVE9NSUNfSU5JVCgtMSk7Ci0KLQlpZiAoYXRvbWljX2NtcHhjaGcoJmNwdWlkLCAtMSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSAhPSAtMSkKLQkJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcCk7Ci0KLQkvKiBXYWl0IGZvciBhbGwgb3RoZXIgY3B1cyB0byBlbnRlciBzdG9wcGVkIHN0YXRlICovCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCi0JCQljb250aW51ZTsKLQkJd2hpbGUoIXNtcF9jcHVfbm90X3J1bm5pbmcoY3B1KSkKLQkJCWNwdV9yZWxheCgpOwotCX0KLQotCS8qIFN0b3JlIHN0YXR1cyBvZiBvdGhlciBjcHVzLiAqLwotCWRvX3N0b3JlX3N0YXR1cygpOwotCi0JLyoKLQkgKiBGaW5hbGx5IGNhbGwgcmVpcGwuIEJlY2F1c2Ugd2Ugd2FpdGVkIGZvciBhbGwgb3RoZXIKLQkgKiBjcHVzIHRvIGVudGVyIHRoaXMgZnVuY3Rpb24gd2Uga25vdyB0aGF0IHRoZXkgZG8KLQkgKiBub3QgaG9sZCBhbnkgczM5MGlycS1sb2NrcyAodGhlIGNwdXMgaGF2ZSBiZWVuCi0JICogaW50ZXJydXB0ZWQgYnkgYW4gZXh0ZXJuYWwgaW50ZXJydXB0IGFuZCBzMzkwaXJxCi0JICogbG9ja3MgYXJlIGFsd2F5cyBoZWxkIGRpc2FibGVkKS4KLQkgKi8KLQlkb19yZWlwbCgpOwotfQotCiB2b2lkIG1hY2hpbmVfcmVzdGFydF9zbXAoY2hhciAqIF9fdW51c2VkKSAKIHsKLSAgICAgICAgb25fZWFjaF9jcHUoZG9fbWFjaGluZV9yZXN0YXJ0LCBOVUxMLCAwLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fd2FpdF9mb3Jfc3RvcCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgY3JbMTZdOwotCi0JX19jdGxfc3RvcmUoY3IsIDAsIDE1KTsKLQljclswXSAmPSB+MHhmZmZmOwotCWNyWzZdID0gMDsKLQlfX2N0bF9sb2FkKGNyLCAwLCAxNSk7Ci0JZm9yICg7OykKLQkJZW5hYmxlZF93YWl0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX21hY2hpbmVfaGFsdCh2b2lkICogX191bnVzZWQpCi17Ci0Jc3RhdGljIGF0b21pY190IGNwdWlkID0gQVRPTUlDX0lOSVQoLTEpOwotCi0JaWYgKGF0b21pY19jbXB4Y2hnKCZjcHVpZCwgLTEsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPT0gLTEpIHsKLQkJc21wX3NlbmRfc3RvcCgpOwotCQlpZiAoTUFDSElORV9JU19WTSAmJiBzdHJsZW4odm1oYWx0X2NtZCkgPiAwKQotCQkJY3BjbWQodm1oYWx0X2NtZCwgTlVMTCwgMCwgTlVMTCk7Ci0JCXNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLAotCQkJCSBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7Ci0JfQotCWRvX3dhaXRfZm9yX3N0b3AoKTsKKwlzbXBfc2VuZF9zdG9wKCk7CisJZG9fcmVpcGwoKTsKIH0KIAogdm9pZCBtYWNoaW5lX2hhbHRfc21wKHZvaWQpCiB7Ci0gICAgICAgIG9uX2VhY2hfY3B1KGRvX21hY2hpbmVfaGFsdCwgTlVMTCwgMCwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQgKiBfX3VudXNlZCkKLXsKLQlzdGF0aWMgYXRvbWljX3QgY3B1aWQgPSBBVE9NSUNfSU5JVCgtMSk7Ci0KLQlpZiAoYXRvbWljX2NtcHhjaGcoJmNwdWlkLCAtMSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9PSAtMSkgewotCQlzbXBfc2VuZF9zdG9wKCk7Ci0JCWlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bXBvZmZfY21kKSA+IDApCi0JCQljcGNtZCh2bXBvZmZfY21kLCBOVUxMLCAwLCBOVUxMKTsKLQkJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksCi0JCQkJIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKLQl9Ci0JZG9fd2FpdF9mb3Jfc3RvcCgpOworCXNtcF9zZW5kX3N0b3AoKTsKKwlpZiAoTUFDSElORV9JU19WTSAmJiBzdHJsZW4odm1oYWx0X2NtZCkgPiAwKQorCQlfX2NwY21kKHZtaGFsdF9jbWQsIE5VTEwsIDAsIE5VTEwpOworCXNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7CisJZm9yICg7Oyk7CiB9CiAKIHZvaWQgbWFjaGluZV9wb3dlcl9vZmZfc21wKHZvaWQpCiB7Ci0gICAgICAgIG9uX2VhY2hfY3B1KGRvX21hY2hpbmVfcG93ZXJfb2ZmLCBOVUxMLCAwLCAwKTsKKwlzbXBfc2VuZF9zdG9wKCk7CisJaWYgKE1BQ0hJTkVfSVNfVk0gJiYgc3RybGVuKHZtcG9mZl9jbWQpID4gMCkKKwkJX19jcGNtZCh2bXBvZmZfY21kLCBOVUxMLCAwLCBOVUxMKTsKKwlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOworCWZvciAoOzspOwogfQogCiAvKgpAQCAtNTAxLDggKzQ2MCw2IEBACiAgKi8KIGV4dGVybiB2b2lkIGluaXRfY3B1X3RpbWVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdF9jcHVfdnRpbWVyKHZvaWQpOwotZXh0ZXJuIGludCBwZmF1bHRfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHBmYXVsdF9maW5pKHZvaWQpOwogCiBpbnQgX19kZXZpbml0IHN0YXJ0X3NlY29uZGFyeSh2b2lkICpjcHV2b2lkKQogewpAQCAtNTE0LDExICs0NzEsOSBAQAogI2lmZGVmIENPTkZJR19WSVJUX1RJTUVSCiAgICAgICAgIGluaXRfY3B1X3Z0aW1lcigpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BGQVVMVAogCS8qIEVuYWJsZSBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIG9uIHRoaXMgY3B1LiAqLwotCWlmIChNQUNISU5FX0lTX1ZNKQotCQlwZmF1bHRfaW5pdCgpOwotI2VuZGlmCisJcGZhdWx0X2luaXQoKTsKKwogCS8qIE1hcmsgdGhpcyBjcHUgYXMgb25saW5lICovCiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKIAkvKiBTd2l0Y2ggb24gaW50ZXJydXB0cyAqLwpAQCAtNzA4LDExICs2NjMsOCBAQAogCX0KIAljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CiAKLSNpZmRlZiBDT05GSUdfUEZBVUxUCiAJLyogRGlzYWJsZSBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIG9uIHRoaXMgY3B1LiAqLwotCWlmIChNQUNISU5FX0lTX1ZNKQotCQlwZmF1bHRfZmluaSgpOwotI2VuZGlmCisJcGZhdWx0X2ZpbmkoKTsKIAogCW1lbXNldCgmY3JfcGFybXMub3J2YWxzLCAwLCBzaXplb2YoY3JfcGFybXMub3J2YWxzKSk7CiAJbWVtc2V0KCZjcl9wYXJtcy5hbmR2YWxzLCAweGZmLCBzaXplb2YoY3JfcGFybXMuYW5kdmFscykpOwpAQCAtODYwLDQgKzgxMiwzIEBACiBFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uKTsKIEVYUE9SVF9TWU1CT0woc21wX2dldF9jcHUpOwogRVhQT1JUX1NZTUJPTChzbXBfcHV0X2NwdSk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCBlNTliYWVjLi5hNGNlYWUzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCkBAIC0zMjAsMyArMzIwLDQgQEAKIFNZU0NBTEwoc3lzX3Ztc3BsaWNlLHN5c192bXNwbGljZSxjb21wYXRfc3lzX3Ztc3BsaWNlX3dyYXBwZXIpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIDMxMCBzeXNfbW92ZV9wYWdlcyAqLwogU1lTQ0FMTChzeXNfZ2V0Y3B1LHN5c19nZXRjcHUsc3lzX2dldGNwdV93cmFwcGVyKQorU1lTQ0FMTChzeXNfZXBvbGxfcHdhaXQsc3lzX2Vwb2xsX3B3YWl0LHN5c19uaV9zeXNjYWxsKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCmluZGV4IDY2Mzc1YTUuLjNjYmIwZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKQEAgLTU4LDEyICs1OCw2IEBACiAKIGV4dGVybiBwZ21fY2hlY2tfaGFuZGxlcl90IGRvX3Byb3RlY3Rpb25fZXhjZXB0aW9uOwogZXh0ZXJuIHBnbV9jaGVja19oYW5kbGVyX3QgZG9fZGF0X2V4Y2VwdGlvbjsKLSNpZmRlZiBDT05GSUdfUEZBVUxUCi1leHRlcm4gaW50IHBmYXVsdF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcGZhdWx0X2Zpbmkodm9pZCk7Ci1leHRlcm4gdm9pZCBwZmF1bHRfaW50ZXJydXB0KF9fdTE2IGVycm9yX2NvZGUpOwotc3RhdGljIGV4dF9pbnRfaW5mb190IGV4dF9pbnRfcGZhdWx0OwotI2VuZGlmCiBleHRlcm4gcGdtX2NoZWNrX2hhbmRsZXJfdCBkb19tb25pdG9yX2NhbGw7CiAKICNkZWZpbmUgc3RhY2tfcG9pbnRlciAoeyB2b2lkICoqc3A7IGFzbSgibGEgJTAsMCgxNSkiIDogIj0mZCIgKHNwKSk7IHNwOyB9KQpAQCAtMTM1LDcgKzEyOSw3IEBACiAJfQogfQogCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICogc3RhY2spCit2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjaykKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fcjE1IGFzbSAoIjE1Iik7CiAJdW5zaWduZWQgbG9uZyBzcDsKQEAgLTE1Nyw2ICsxNTEsOSBAQAogCQlfX3Nob3dfdHJhY2Uoc3AsIFMzOTBfbG93Y29yZS50aHJlYWRfaW5mbywKIAkJCSAgICAgUzM5MF9sb3djb3JlLnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUpOwogCXByaW50aygiXG4iKTsKKwlpZiAoIXRhc2spCisJCXRhc2sgPSBjdXJyZW50OworCWRlYnVnX3Nob3dfaGVsZF9sb2Nrcyh0YXNrKTsKIH0KIAogdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3ApCkBAIC00NjIsNyArNDU5LDggQEAKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7Ci0JCWdldF91c2VyKCooKF9fdTE2ICopIG9wY29kZSksIChfX3UxNiBfX3VzZXIgKikgbG9jYXRpb24pOworCQlpZiAoZ2V0X3VzZXIoKigoX191MTYgKikgb3Bjb2RlKSwgKF9fdTE2IF9fdXNlciAqKSBsb2NhdGlvbikpCisJCQlyZXR1cm47CiAJCWlmICgqKChfX3UxNiAqKSBvcGNvZGUpID09IFMzOTBfQlJFQUtQT0lOVF9VMTYpIHsKIAkJCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKQogCQkJCWZvcmNlX3NpZyhTSUdUUkFQLCBjdXJyZW50KTsKQEAgLTQ3MCwyMCArNDY4LDI1IEBACiAJCQkJc2lnbmFsID0gU0lHSUxMOwogI2lmZGVmIENPTkZJR19NQVRIRU1VCiAJCX0gZWxzZSBpZiAob3Bjb2RlWzBdID09IDB4YjMpIHsKLQkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKKwkJCWlmIChnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSkpCisJCQkJcmV0dXJuOwogCQkJc2lnbmFsID0gbWF0aF9lbXVfYjMob3Bjb2RlLCByZWdzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wY29kZVswXSA9PSAweGVkKSB7Ci0JCQlnZXRfdXNlcigqKChfX3UzMiAqKSAob3Bjb2RlKzIpKSwKLQkJCQkgKF9fdTMyIF9fdXNlciAqKShsb2NhdGlvbisxKSk7CisJCQlpZiAoZ2V0X3VzZXIoKigoX191MzIgKikgKG9wY29kZSsyKSksCisJCQkJICAgICAoX191MzIgX191c2VyICopKGxvY2F0aW9uKzEpKSkKKwkJCQlyZXR1cm47CiAJCQlzaWduYWwgPSBtYXRoX2VtdV9lZChvcGNvZGUsIHJlZ3MpOwogCQl9IGVsc2UgaWYgKCooKF9fdTE2ICopIG9wY29kZSkgPT0gMHhiMjk5KSB7Ci0JCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQlpZiAoZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpKQorCQkJCXJldHVybjsKIAkJCXNpZ25hbCA9IG1hdGhfZW11X3Nybm0ob3Bjb2RlLCByZWdzKTsKIAkJfSBlbHNlIGlmICgqKChfX3UxNiAqKSBvcGNvZGUpID09IDB4YjI5YykgewotCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOworCQkJaWYgKGdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKSkKKwkJCQlyZXR1cm47CiAJCQlzaWduYWwgPSBtYXRoX2VtdV9zdGZwYyhvcGNvZGUsIHJlZ3MpOwogCQl9IGVsc2UgaWYgKCooKF9fdTE2ICopIG9wY29kZSkgPT0gMHhiMjlkKSB7Ci0JCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7CisJCQlpZiAoZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpKQorCQkJCXJldHVybjsKIAkJCXNpZ25hbCA9IG1hdGhfZW11X2xmcGMob3Bjb2RlLCByZWdzKTsKICNlbmRpZgogCQl9IGVsc2UKQEAgLTczMywyMiArNzM2LDUgQEAKICAgICAgICAgcGdtX2NoZWNrX3RhYmxlWzB4MUNdID0gJnNwYWNlX3N3aXRjaF9leGNlcHRpb247CiAgICAgICAgIHBnbV9jaGVja190YWJsZVsweDFEXSA9ICZoZnBfc3FydF9leGNlcHRpb247CiAJcGdtX2NoZWNrX3RhYmxlWzB4NDBdID0gJmRvX21vbml0b3JfY2FsbDsKLQotCWlmIChNQUNISU5FX0lTX1ZNKSB7Ci0jaWZkZWYgQ09ORklHX1BGQVVMVAotCQkvKgotCQkgKiBUcnkgdG8gZ2V0IHBmYXVsdCBwc2V1ZG8gcGFnZSBmYXVsdHMgZ29pbmcuCi0JCSAqLwotCQlpZiAocmVnaXN0ZXJfZWFybHlfZXh0ZXJuYWxfaW50ZXJydXB0KDB4MjYwMywgcGZhdWx0X2ludGVycnVwdCwKLQkJCQkJCSAgICAgICZleHRfaW50X3BmYXVsdCkgIT0gMCkKLQkJCXBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDI2MDMiKTsKLQotCQlpZiAocGZhdWx0X2luaXQoKSA9PSAwKSAKLQkJCXJldHVybjsKLQkJCi0JCS8qIFRvdWdoIGx1Y2ssIG5vIHBmYXVsdC4gKi8KLQkJdW5yZWdpc3Rlcl9lYXJseV9leHRlcm5hbF9pbnRlcnJ1cHQoMHgyNjAzLCBwZmF1bHRfaW50ZXJydXB0LAotCQkJCQkJICAgICZleHRfaW50X3BmYXVsdCk7Ci0jZW5kaWYKLQl9CisJcGZhdWx0X2lycV9pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYWY5ZTY5YTAuLmZlMGYyZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTgzLDEzICs4Myw3IEBACiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KSAKLQkqKC5pbml0Y2FsbDIuaW5pdCkgCi0JKiguaW5pdGNhbGwzLmluaXQpIAotCSooLmluaXRjYWxsNC5pbml0KSAKLQkqKC5pbml0Y2FsbDUuaW5pdCkgCi0JKiguaW5pdGNhbGw2LmluaXQpIAotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZSBiL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKaW5kZXggYjBjZmE2Yy4uYjVmOTRjZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvbGliL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBFWFRSQV9BRkxBR1MgOj0gLXRyYWRpdGlvbmFsCiAKLWxpYi15ICs9IGRlbGF5Lm8gc3RyaW5nLm8gdWFjY2Vzc19zdGQubworbGliLXkgKz0gZGVsYXkubyBzdHJpbmcubyB1YWNjZXNzX3N0ZC5vIHVhY2Nlc3NfcHQubwogbGliLSQoQ09ORklHXzMyQklUKSArPSBkaXY2NC5vCiBsaWItJChDT05GSUdfNjRCSVQpICs9IHVhY2Nlc3NfbXZjb3MubwogbGliLSQoQ09ORklHX1NNUCkgKz0gc3BpbmxvY2subwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX212Y29zLmMgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwppbmRleCAxMjFiMjkzLi5mOWEyM2Q1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYworKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfbXZjb3MuYwpAQCAtMjcsNiArMjcsOSBAQAogI2RlZmluZSBTTFIJInNsZ3IiCiAjZW5kaWYKIAorZXh0ZXJuIHNpemVfdCBjb3B5X2Zyb21fdXNlcl9zdGQoc2l6ZV90LCBjb25zdCB2b2lkIF9fdXNlciAqLCB2b2lkICopOworZXh0ZXJuIHNpemVfdCBjb3B5X3RvX3VzZXJfc3RkKHNpemVfdCwgdm9pZCBfX3VzZXIgKiwgY29uc3Qgdm9pZCAqKTsKKwogc2l6ZV90IGNvcHlfZnJvbV91c2VyX212Y29zKHNpemVfdCBzaXplLCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMCBhc20oIjAiKSA9IDB4ODFVTDsKQEAgLTY2LDYgKzY5LDEzIEBACiAJcmV0dXJuIHNpemU7CiB9CiAKK3NpemVfdCBjb3B5X2Zyb21fdXNlcl9tdmNvc19jaGVjayhzaXplX3Qgc2l6ZSwgY29uc3Qgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCAqeCkKK3sKKwlpZiAoc2l6ZSA8PSAyNTYpCisJCXJldHVybiBjb3B5X2Zyb21fdXNlcl9zdGQoc2l6ZSwgcHRyLCB4KTsKKwlyZXR1cm4gY29weV9mcm9tX3VzZXJfbXZjb3Moc2l6ZSwgcHRyLCB4KTsKK30KKwogc2l6ZV90IGNvcHlfdG9fdXNlcl9tdmNvcyhzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnB0ciwgY29uc3Qgdm9pZCAqeCkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtKCIwIikgPSAweDgxMDAwMFVMOwpAQCAtOTUsNiArMTA1LDEzIEBACiAJcmV0dXJuIHNpemU7CiB9CiAKK3NpemVfdCBjb3B5X3RvX3VzZXJfbXZjb3NfY2hlY2soc2l6ZV90IHNpemUsIHZvaWQgX191c2VyICpwdHIsIGNvbnN0IHZvaWQgKngpCit7CisJaWYgKHNpemUgPD0gMjU2KQorCQlyZXR1cm4gY29weV90b191c2VyX3N0ZChzaXplLCBwdHIsIHgpOworCXJldHVybiBjb3B5X3RvX3VzZXJfbXZjb3Moc2l6ZSwgcHRyLCB4KTsKK30KKwogc2l6ZV90IGNvcHlfaW5fdXNlcl9tdmNvcyhzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtKCIwIikgPSAweDgxMDA4MVVMOwpAQCAtMTQ1LDE4ICsxNjIsMTYgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotZXh0ZXJuIHNpemVfdCBjb3B5X2Zyb21fdXNlcl9zdGRfc21hbGwoc2l6ZV90LCBjb25zdCB2b2lkIF9fdXNlciAqLCB2b2lkICopOwotZXh0ZXJuIHNpemVfdCBjb3B5X3RvX3VzZXJfc3RkX3NtYWxsKHNpemVfdCwgdm9pZCBfX3VzZXIgKiwgY29uc3Qgdm9pZCAqKTsKIGV4dGVybiBzaXplX3Qgc3Rybmxlbl91c2VyX3N0ZChzaXplX3QsIGNvbnN0IGNoYXIgX191c2VyICopOwogZXh0ZXJuIHNpemVfdCBzdHJuY3B5X2Zyb21fdXNlcl9zdGQoc2l6ZV90LCBjb25zdCBjaGFyIF9fdXNlciAqLCBjaGFyICopOwogZXh0ZXJuIGludCBmdXRleF9hdG9taWNfb3AoaW50LCBpbnQgX191c2VyICosIGludCwgaW50ICopOwogZXh0ZXJuIGludCBmdXRleF9hdG9taWNfY21weGNoZyhpbnQgX191c2VyICosIGludCwgaW50KTsKIAogc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3NfbXZjb3MgPSB7Ci0JLmNvcHlfZnJvbV91c2VyID0gY29weV9mcm9tX3VzZXJfbXZjb3MsCi0JLmNvcHlfZnJvbV91c2VyX3NtYWxsID0gY29weV9mcm9tX3VzZXJfc3RkX3NtYWxsLAotCS5jb3B5X3RvX3VzZXIgPSBjb3B5X3RvX3VzZXJfbXZjb3MsCi0JLmNvcHlfdG9fdXNlcl9zbWFsbCA9IGNvcHlfdG9fdXNlcl9zdGRfc21hbGwsCisJLmNvcHlfZnJvbV91c2VyID0gY29weV9mcm9tX3VzZXJfbXZjb3NfY2hlY2ssCisJLmNvcHlfZnJvbV91c2VyX3NtYWxsID0gY29weV9mcm9tX3VzZXJfc3RkLAorCS5jb3B5X3RvX3VzZXIgPSBjb3B5X3RvX3VzZXJfbXZjb3NfY2hlY2ssCisJLmNvcHlfdG9fdXNlcl9zbWFsbCA9IGNvcHlfdG9fdXNlcl9zdGQsCiAJLmNvcHlfaW5fdXNlciA9IGNvcHlfaW5fdXNlcl9tdmNvcywKIAkuY2xlYXJfdXNlciA9IGNsZWFyX3VzZXJfbXZjb3MsCiAJLnN0cm5sZW5fdXNlciA9IHN0cm5sZW5fdXNlcl9zdGQsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzc19wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzI0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYwpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqICBhcmNoL3MzOTAvbGliL3VhY2Nlc3NfcHQuYworICoKKyAqICBVc2VyIGFjY2VzcyBmdW5jdGlvbnMgYmFzZWQgb24gcGFnZSB0YWJsZSB3YWxrcy4KKyAqCisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDYKKyAqICAgIEF1dGhvcihzKTogR2VyYWxkIFNjaGFlZmVyIChnZXJhbGQuc2NoYWVmZXJAZGUuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2Z1dGV4Lmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IF9faGFuZGxlX2ZhdWx0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJIGludCB3cml0ZV9hY2Nlc3MpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJaW50IHJldCA9IC1FRkFVTFQ7CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOworCWlmICh1bmxpa2VseSghdm1hKSkKKwkJZ290byBvdXQ7CisJaWYgKHVubGlrZWx5KHZtYS0+dm1fc3RhcnQgPiBhZGRyZXNzKSkgeworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXdyaXRlX2FjY2VzcykgeworCQkvKiBwYWdlIG5vdCBwcmVzZW50LCBjaGVjayB2bSBmbGFncyAqLworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEUpKSkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQlnb3RvIG91dDsKKwl9CisKK3N1cnZpdmU6CisJc3dpdGNoIChoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgd3JpdGVfYWNjZXNzKSkgeworCWNhc2UgVk1fRkFVTFRfTUlOT1I6CisJCWN1cnJlbnQtPm1pbl9mbHQrKzsKKwkJYnJlYWs7CisJY2FzZSBWTV9GQVVMVF9NQUpPUjoKKwkJY3VycmVudC0+bWFqX2ZsdCsrOworCQlicmVhazsKKwljYXNlIFZNX0ZBVUxUX1NJR0JVUzoKKwkJZ290byBvdXRfc2lnYnVzOworCWNhc2UgVk1fRkFVTFRfT09NOgorCQlnb3RvIG91dF9vZl9tZW1vcnk7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCXJldCA9IDA7CitvdXQ6CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gcmV0OworCitvdXRfb2ZfbWVtb3J5OgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJaWYgKGlzX2luaXQoY3VycmVudCkpIHsKKwkJeWllbGQoKTsKKwkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCQlnb3RvIHN1cnZpdmU7CisJfQorCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgY3VycmVudC0+Y29tbSk7CisJcmV0dXJuIHJldDsKKworb3V0X3NpZ2J1czoKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCWN1cnJlbnQtPnRocmVhZC5wcm90X2FkZHIgPSBhZGRyZXNzOworCWN1cnJlbnQtPnRocmVhZC50cmFwX25vID0gMHgxMTsKKwlmb3JjZV9zaWcoU0lHQlVTLCBjdXJyZW50KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBfX3VzZXJfY29weV9wdCh1bnNpZ25lZCBsb25nIHVhZGRyLCB2b2lkICprcHRyLAorCQkJCSAgICBzaXplX3QgbiwgaW50IHdyaXRlX3VzZXIpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgcGZuLCBkb25lLCBzaXplOworCXBnZF90ICpwZ2Q7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXZvaWQgKmZyb20sICp0bzsKKworCWRvbmUgPSAwOworcmV0cnk6CisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlkbyB7CisJCXBnZCA9IHBnZF9vZmZzZXQobW0sIHVhZGRyKTsKKwkJaWYgKHBnZF9ub25lKCpwZ2QpIHx8IHVubGlrZWx5KHBnZF9iYWQoKnBnZCkpKQorCQkJZ290byBmYXVsdDsKKworCQlwbWQgPSBwbWRfb2Zmc2V0KHBnZCwgdWFkZHIpOworCQlpZiAocG1kX25vbmUoKnBtZCkgfHwgdW5saWtlbHkocG1kX2JhZCgqcG1kKSkpCisJCQlnb3RvIGZhdWx0OworCisJCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwKHBtZCwgdWFkZHIpOworCQlpZiAoIXB0ZSB8fCAhcHRlX3ByZXNlbnQoKnB0ZSkgfHwKKwkJICAgICh3cml0ZV91c2VyICYmICFwdGVfd3JpdGUoKnB0ZSkpKQorCQkJZ290byBmYXVsdDsKKworCQlwZm4gPSBwdGVfcGZuKCpwdGUpOworCQlpZiAoIXBmbl92YWxpZChwZm4pKQorCQkJZ290byBvdXQ7CisKKwkJb2Zmc2V0ID0gdWFkZHIgJiAoUEFHRV9TSVpFIC0gMSk7CisJCXNpemUgPSBtaW4obiAtIGRvbmUsIFBBR0VfU0laRSAtIG9mZnNldCk7CisJCWlmICh3cml0ZV91c2VyKSB7CisJCQl0byA9ICh2b2lkICopKChwZm4gPDwgUEFHRV9TSElGVCkgKyBvZmZzZXQpOworCQkJZnJvbSA9IGtwdHIgKyBkb25lOworCQl9IGVsc2UgeworCQkJZnJvbSA9ICh2b2lkICopKChwZm4gPDwgUEFHRV9TSElGVCkgKyBvZmZzZXQpOworCQkJdG8gPSBrcHRyICsgZG9uZTsKKwkJfQorCQltZW1jcHkodG8sIGZyb20sIHNpemUpOworCQlkb25lICs9IHNpemU7CisJCXVhZGRyICs9IHNpemU7CisJfSB3aGlsZSAoZG9uZSA8IG4pOworb3V0OgorCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlyZXR1cm4gbiAtIGRvbmU7CitmYXVsdDoKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJaWYgKF9faGFuZGxlX2ZhdWx0KG1tLCB1YWRkciwgd3JpdGVfdXNlcikpCisJCXJldHVybiBuIC0gZG9uZTsKKwlnb3RvIHJldHJ5OworfQorCitzaXplX3QgY29weV9mcm9tX3VzZXJfcHQoc2l6ZV90IG4sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB2b2lkICp0bykKK3sKKwlzaXplX3QgcmM7CisKKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgeworCQltZW1jcHkodG8sICh2b2lkIF9fa2VybmVsIF9fZm9yY2UgKikgZnJvbSwgbik7CisJCXJldHVybiAwOworCX0KKwlyYyA9IF9fdXNlcl9jb3B5X3B0KCh1bnNpZ25lZCBsb25nKSBmcm9tLCB0bywgbiwgMCk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJbWVtc2V0KHRvICsgbiAtIHJjLCAwLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzaXplX3QgY29weV90b191c2VyX3B0KHNpemVfdCBuLCB2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20pCit7CisJaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpIHsKKwkJbWVtY3B5KCh2b2lkIF9fa2VybmVsIF9fZm9yY2UgKikgdG8sIGZyb20sIG4pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIF9fdXNlcl9jb3B5X3B0KCh1bnNpZ25lZCBsb25nKSB0bywgKHZvaWQgKikgZnJvbSwgbiwgMSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3Nfc3RkLmMgYi9hcmNoL3MzOTAvbGliL3VhY2Nlc3Nfc3RkLmMKaW5kZXggZjQ0ZjAwNy4uYmJhY2E2NiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi91YWNjZXNzX3N0ZC5jCisrKyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzc19zdGQuYwpAQCAtMTEsNyArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9mdXRleC5oPgogCiAjaWZuZGVmIF9fczM5MHhfXwpAQCAtMjgsNiArMjgsOSBAQAogI2RlZmluZSBTTFIJInNsZ3IiCiAjZW5kaWYKIAorZXh0ZXJuIHNpemVfdCBjb3B5X2Zyb21fdXNlcl9wdChzaXplX3QgbiwgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHZvaWQgKnRvKTsKK2V4dGVybiBzaXplX3QgY29weV90b191c2VyX3B0KHNpemVfdCBuLCB2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20pOworCiBzaXplX3QgY29weV9mcm9tX3VzZXJfc3RkKHNpemVfdCBzaXplLCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQogewogCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKQEAgLTY5LDM0ICs3MiwxMSBAQAogCXJldHVybiBzaXplOwogfQogCi1zaXplX3QgY29weV9mcm9tX3VzZXJfc3RkX3NtYWxsKHNpemVfdCBzaXplLCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQorc2l6ZV90IGNvcHlfZnJvbV91c2VyX3N0ZF9jaGVjayhzaXplX3Qgc2l6ZSwgY29uc3Qgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCAqeCkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7Ci0KLQl0bXAxID0gMFVMOwotCWFzbSB2b2xhdGlsZSgKLQkJIjA6IG12Y3AgIDAoJTAsJTIpLDAoJTEpLCUzXG4iCi0JCSIgICJTTFIiICAlMCwlMFxuIgotCQkiICAgaiAgICAgNWZcbiIKLQkJIjE6IGxhICAgICU0LDI1NSglMSlcbiIgLyogJTQgPSBwdHIgKyAyNTUgKi8KLQkJIiAgIkxISSIgICUzLC00MDk2XG4iCi0JCSIgICBuciAgICAlNCwlM1xuIgkvKiAlNCA9IChwdHIgKyAyNTUpICYgLTQwOTYgKi8KLQkJIiAgIlNMUiIgICU0LCUxXG4iCi0JCSIgICJDTFIiICAlMCwlNFxuIgkvKiBjb3B5IGNyb3NzZXMgbmV4dCBwYWdlIGJvdW5kYXJ5PyAqLwotCQkiICAgam5oICAgNWZcbiIKLQkJIjI6IG12Y3AgIDAoJTQsJTIpLDAoJTEpLCUzXG4iCi0JCSIgICJTTFIiICAlMCwlNFxuIgotCQkiICAiQUxSIiAgJTIsJTRcbiIKLQkJIjM6IkxISSIgICU0LC0xXG4iCi0JCSIgICJBTFIiICAlNCwlMFxuIgkvKiBjb3B5IHJlbWFpbmluZyBzaXplLCBzdWJ0cmFjdCAxICovCi0JCSIgICBicmFzICAlMyw0ZlxuIgotCQkiICAgeGMgICAgMCgxLCUyKSwwKCUyKVxuIgotCQkiNDogZXggICAgJTQsMCglMylcbiIKLQkJIjU6XG4iCi0JCUVYX1RBQkxFKDBiLDFiKSBFWF9UQUJMRSgyYiwzYikKLQkJOiAiK2EiIChzaXplKSwgIithIiAocHRyKSwgIithIiAoeCksICIrYSIgKHRtcDEpLCAiPWEiICh0bXAyKQotCQk6IDogImNjIiwgIm1lbW9yeSIpOwotCXJldHVybiBzaXplOworCWlmIChzaXplIDw9IDEwMjQpCisJCXJldHVybiBjb3B5X2Zyb21fdXNlcl9zdGQoc2l6ZSwgcHRyLCB4KTsKKwlyZXR1cm4gY29weV9mcm9tX3VzZXJfcHQoc2l6ZSwgcHRyLCB4KTsKIH0KIAogc2l6ZV90IGNvcHlfdG9fdXNlcl9zdGQoc2l6ZV90IHNpemUsIHZvaWQgX191c2VyICpwdHIsIGNvbnN0IHZvaWQgKngpCkBAIC0xMzAsMjggKzExMCwxMSBAQAogCXJldHVybiBzaXplOwogfQogCi1zaXplX3QgY29weV90b191c2VyX3N0ZF9zbWFsbChzaXplX3Qgc2l6ZSwgdm9pZCBfX3VzZXIgKnB0ciwgY29uc3Qgdm9pZCAqeCkKK3NpemVfdCBjb3B5X3RvX3VzZXJfc3RkX2NoZWNrKHNpemVfdCBzaXplLCB2b2lkIF9fdXNlciAqcHRyLCBjb25zdCB2b2lkICp4KQogewotCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKLQotCXRtcDEgPSAwVUw7Ci0JYXNtIHZvbGF0aWxlKAotCQkiMDogbXZjcyAgMCglMCwlMSksMCglMiksJTNcbiIKLQkJIiAgIlNMUiIgICUwLCUwXG4iCi0JCSIgICBqICAgICAzZlxuIgotCQkiMTogbGEgICAgJTQsMjU1KCUxKVxuIiAvKiBwdHIgKyAyNTUgKi8KLQkJIiAgIkxISSIgICUzLC00MDk2XG4iCi0JCSIgICBuciAgICAlNCwlM1xuIgkvKiAocHRyICsgMjU1KSAmIC00MDk2VUwgKi8KLQkJIiAgIlNMUiIgICU0LCUxXG4iCi0JCSIgICJDTFIiICAlMCwlNFxuIgkvKiBjb3B5IGNyb3NzZXMgbmV4dCBwYWdlIGJvdW5kYXJ5PyAqLwotCQkiICAgam5oICAgM2ZcbiIKLQkJIjI6IG12Y3MgIDAoJTQsJTEpLDAoJTIpLCUzXG4iCi0JCSIgICJTTFIiICAlMCwlNFxuIgotCQkiMzpcbiIKLQkJRVhfVEFCTEUoMGIsMWIpIEVYX1RBQkxFKDJiLDNiKQotCQk6ICIrYSIgKHNpemUpLCAiK2EiIChwdHIpLCAiK2EiICh4KSwgIithIiAodG1wMSksICI9YSIgKHRtcDIpCi0JCTogOiAiY2MiLCAibWVtb3J5Iik7Ci0JcmV0dXJuIHNpemU7CisJaWYgKHNpemUgPD0gMTAyNCkKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcl9zdGQoc2l6ZSwgcHRyLCB4KTsKKwlyZXR1cm4gY29weV90b191c2VyX3B0KHNpemUsIHB0ciwgeCk7CiB9CiAKIHNpemVfdCBjb3B5X2luX3VzZXJfc3RkKHNpemVfdCBzaXplLCB2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tKQpAQCAtMjk1LDcgKzI1OCw3IEBACiB7CiAJaW50IG9sZHZhbCA9IDAsIG5ld3ZhbCwgcmV0OwogCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCiAJc3dpdGNoIChvcCkgewogCWNhc2UgRlVURVhfT1BfU0VUOgpAQCAtMzIxLDcgKzI4NCw3IEBACiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1NZUzsKIAl9Ci0JZGVjX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiAJKm9sZCA9IG9sZHZhbDsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzQzLDEwICszMDYsMTAgQEAKIH0KIAogc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3Nfc3RkID0gewotCS5jb3B5X2Zyb21fdXNlciA9IGNvcHlfZnJvbV91c2VyX3N0ZCwKLQkuY29weV9mcm9tX3VzZXJfc21hbGwgPSBjb3B5X2Zyb21fdXNlcl9zdGRfc21hbGwsCi0JLmNvcHlfdG9fdXNlciA9IGNvcHlfdG9fdXNlcl9zdGQsCi0JLmNvcHlfdG9fdXNlcl9zbWFsbCA9IGNvcHlfdG9fdXNlcl9zdGRfc21hbGwsCisJLmNvcHlfZnJvbV91c2VyID0gY29weV9mcm9tX3VzZXJfc3RkX2NoZWNrLAorCS5jb3B5X2Zyb21fdXNlcl9zbWFsbCA9IGNvcHlfZnJvbV91c2VyX3N0ZCwKKwkuY29weV90b191c2VyID0gY29weV90b191c2VyX3N0ZF9jaGVjaywKKwkuY29weV90b191c2VyX3NtYWxsID0gY29weV90b191c2VyX3N0ZCwKIAkuY29weV9pbl91c2VyID0gY29weV9pbl91c2VyX3N0ZCwKIAkuY2xlYXJfdXNlciA9IGNsZWFyX3VzZXJfc3RkLAogCS5zdHJubGVuX3VzZXIgPSBzdHJubGVuX3VzZXJfc3RkLApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL01ha2VmaWxlIGIvYXJjaC9zMzkwL21tL01ha2VmaWxlCmluZGV4IGFhOWE0MmIuLjhlMDlkYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvbW0vTWFrZWZpbGUKQEAgLTIsNiArMiw2IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXggczM5MC1zcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbWVtb3J5IG1hbmFnZXIuCiAjCiAKLW9iai15CSA6PSBpbml0Lm8gZmF1bHQubyBpb3JlbWFwLm8gZXh0bWVtLm8gbW1hcC5vCitvYmoteQkgOj0gaW5pdC5vIGZhdWx0Lm8gaW9yZW1hcC5vIGV4dG1lbS5vIG1tYXAubyB2bWVtLm8KIG9iai0kKENPTkZJR19DTU0pICs9IGNtbS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9leHRtZW0uYyBiL2FyY2gvczM5MC9tbS9leHRtZW0uYwppbmRleCAyMjYyNzVkLi43NzViZjE5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vZXh0bWVtLmMKKysrIGIvYXJjaC9zMzkwL21tL2V4dG1lbS5jCkBAIC0xNCwxMiArMTQsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vZXh0bWVtLmg+CiAjaW5jbHVkZSA8YXNtL2NwY21kLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogI2RlZmluZSBEQ1NTX0RFQlVHCS8qIERlYnVnIG1lc3NhZ2VzIG9uL29mZiAqLwogCkBAIC03NywxNSArNzksMTEgQEAKIAlpbnQgc2VnY250OwogfTsKIAotc3RhdGljIERFRklORV9TUElOTE9DSyhkY3NzX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChkY3NzX2xvY2spOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZGNzc19saXN0ID0gTElTVF9IRUFEX0lOSVQoZGNzc19saXN0KTsKIHN0YXRpYyBjaGFyICpzZWd0eXBlX3N0cmluZ1tdID0geyAiU1ciLCAiRVciLCAiU1IiLCAiRVIiLCAiU04iLCAiRU4iLCAiU0MiLAogCQkJCQkiRVcvRU4tTUlYRUQiIH07CiAKLWV4dGVybiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZSwgdHlwZTsKLX0gbWVtb3J5X2NodW5rW01FTU9SWV9DSFVOS1NdOwotCiAvKgogICogQ3JlYXRlIHRoZSA4IGJ5dGVzLCBlYmNkaWMgVk0gc2VnbWVudCBuYW1lIGZyb20KICAqIGFuIGFzY2lpIG5hbWUuCkBAIC0xMTcsNyArMTE1LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsOwogCXN0cnVjdCBkY3NzX3NlZ21lbnQgKnRtcCwgKnJldHZhbCA9IE5VTEw7CiAKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRjc3NfbG9jayk7CisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRjc3NfbG9jaykpOwogCWRjc3NfbWtuYW1lIChuYW1lLCBkY3NzX25hbWUpOwogCWxpc3RfZm9yX2VhY2ggKGwsICZkY3NzX2xpc3QpIHsKIAkJdG1wID0gbGlzdF9lbnRyeSAobCwgc3RydWN0IGRjc3Nfc2VnbWVudCwgbGlzdCk7CkBAIC0yNDEsNjUgKzIzOSw2IEBACiB9CiAKIC8qCi0gKiBjaGVjayBpZiB0aGUgZ2l2ZW4gc2VnbWVudCBjb2xsaWRlcyB3aXRoIGd1ZXN0IHN0b3JhZ2UuCi0gKiByZXR1cm5zIDEgaWYgdGhpcyBpcyB0aGUgY2FzZSwgMCBpZiBubyBjb2xsaXNpb24gd2FzIGZvdW5kCi0gKi8KLXN0YXRpYyBpbnQKLXNlZ21lbnRfb3ZlcmxhcHNfc3RvcmFnZShzdHJ1Y3QgZGNzc19zZWdtZW50ICpzZWcpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGk9MDsgaSA8IE1FTU9SWV9DSFVOS1MgJiYgbWVtb3J5X2NodW5rW2ldLnNpemUgPiAwOyBpKyspIHsKLQkJaWYgKG1lbW9yeV9jaHVua1tpXS50eXBlICE9IDApCi0JCQljb250aW51ZTsKLQkJaWYgKChtZW1vcnlfY2h1bmtbaV0uYWRkciA+PiAyMCkgPiAoc2VnLT5lbmQgPj4gMjApKQotCQkJY29udGludWU7Ci0JCWlmICgoKG1lbW9yeV9jaHVua1tpXS5hZGRyICsgbWVtb3J5X2NodW5rW2ldLnNpemUgLSAxKSA+PiAyMCkKLQkJCQk8IChzZWctPnN0YXJ0X2FkZHIgPj4gMjApKQotCQkJY29udGludWU7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGNoZWNrIGlmIHNlZ21lbnQgY29sbGlkZXMgd2l0aCBvdGhlciBzZWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGVkCi0gKiByZXR1cm5zIDEgaWYgdGhpcyBpcyB0aGUgY2FzZSwgMCBpZiBubyBjb2xsaXNpb24gd2FzIGZvdW5kCi0gKi8KLXN0YXRpYyBpbnQKLXNlZ21lbnRfb3ZlcmxhcHNfb3RoZXJzIChzdHJ1Y3QgZGNzc19zZWdtZW50ICpzZWcpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKLQlzdHJ1Y3QgZGNzc19zZWdtZW50ICp0bXA7Ci0KLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRjc3NfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChsLCAmZGNzc19saXN0KSB7Ci0JCXRtcCA9IGxpc3RfZW50cnkobCwgc3RydWN0IGRjc3Nfc2VnbWVudCwgbGlzdCk7Ci0JCWlmICgodG1wLT5zdGFydF9hZGRyID4+IDIwKSA+IChzZWctPmVuZCA+PiAyMCkpCi0JCQljb250aW51ZTsKLQkJaWYgKCh0bXAtPmVuZCA+PiAyMCkgPCAoc2VnLT5zdGFydF9hZGRyID4+IDIwKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2VnID09IHRtcCkKLQkJCWNvbnRpbnVlOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBjaGVjayBpZiBzZWdtZW50IGV4Y2VlZHMgdGhlIGtlcm5lbCBtYXBwaW5nIHJhbmdlIChkZXRlY3RlZCBvciBzZXQgdmlhIG1lbT0pCi0gKiByZXR1cm5zIDEgaWYgdGhpcyBpcyB0aGUgY2FzZSwgMCBpZiBzZWdtZW50IGZpdHMgaW50byB0aGUgcmFuZ2UKLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXNlZ21lbnRfZXhjZWVkc19yYW5nZSAoc3RydWN0IGRjc3Nfc2VnbWVudCAqc2VnKQotewotCWludCBzZWdfbGFzdF9wZm4gPSAoc2VnLT5lbmQpID4+IFBBR0VfU0hJRlQ7Ci0JaWYgKHNlZ19sYXN0X3BmbiA+IG1heF9wZm4pCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi0vKgogICogZ2V0IGluZm8gYWJvdXQgYSBzZWdtZW50CiAgKiBwb3NzaWJsZSByZXR1cm4gdmFsdWVzOgogICogLUVOT1NZUyAgOiB3ZSBhcmUgbm90IHJ1bm5pbmcgb24gVk0KQEAgLTM0NCwyNCArMjgzLDI2IEBACiAJcmMgPSBxdWVyeV9zZWdtZW50X3R5cGUgKHNlZyk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKLQlpZiAoc2VnbWVudF9leGNlZWRzX3JhbmdlKHNlZykpIHsKLQkJUFJJTlRfV0FSTiAoInNlZ21lbnRfbG9hZDogbm90IGxvYWRpbmcgc2VnbWVudCAlcyAtIGV4Y2VlZHMiCi0JCQkJIiBrZXJuZWwgbWFwcGluZyByYW5nZVxuIixuYW1lKTsKLQkJcmMgPSAtRVJBTkdFOworCisJcmMgPSBhZGRfc2hhcmVkX21lbW9yeShzZWctPnN0YXJ0X2FkZHIsIHNlZy0+ZW5kIC0gc2VnLT5zdGFydF9hZGRyICsgMSk7CisKKwlzd2l0Y2ggKHJjKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIC1FTk9TUEM6CisJCVBSSU5UX1dBUk4oInNlZ21lbnRfbG9hZDogbm90IGxvYWRpbmcgc2VnbWVudCAlcyAtIG92ZXJsYXBzICIKKwkJCSAgICJzdG9yYWdlL3NlZ21lbnRcbiIsIG5hbWUpOworCQlnb3RvIG91dF9mcmVlOworCWNhc2UgLUVSQU5HRToKKwkJUFJJTlRfV0FSTigic2VnbWVudF9sb2FkOiBub3QgbG9hZGluZyBzZWdtZW50ICVzIC0gZXhjZWVkcyAiCisJCQkgICAia2VybmVsIG1hcHBpbmcgcmFuZ2VcbiIsIG5hbWUpOworCQlnb3RvIG91dF9mcmVlOworCWRlZmF1bHQ6CisJCVBSSU5UX1dBUk4oInNlZ21lbnRfbG9hZDogbm90IGxvYWRpbmcgc2VnbWVudCAlcyAocmM6ICVkKVxuIiwKKwkJCSAgIG5hbWUsIHJjKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9Ci0JaWYgKHNlZ21lbnRfb3ZlcmxhcHNfc3RvcmFnZShzZWcpKSB7Ci0JCVBSSU5UX1dBUk4gKCJzZWdtZW50X2xvYWQ6IG5vdCBsb2FkaW5nIHNlZ21lbnQgJXMgLSBvdmVybGFwcyIKLQkJCQkiIHN0b3JhZ2VcbiIsbmFtZSk7Ci0JCXJjID0gLUVOT1NQQzsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0JaWYgKHNlZ21lbnRfb3ZlcmxhcHNfb3RoZXJzKHNlZykpIHsKLQkJUFJJTlRfV0FSTiAoInNlZ21lbnRfbG9hZDogbm90IGxvYWRpbmcgc2VnbWVudCAlcyAtIG92ZXJsYXBzIgotCQkJCSIgb3RoZXIgc2VnbWVudHNcbiIsbmFtZSk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIG91dF9mcmVlOwotCX0KKwogCWlmIChkb19ub25zaGFyZWQpCiAJCWRjc3NfY29tbWFuZCA9IERDU1NfTE9BRE5TUjsKIAllbHNlCkBAIC0zNzUsNyArMzE2LDcgQEAKIAkJcmMgPSBkY3NzX2RpYWdfdHJhbnNsYXRlX3JjIChzZWctPmVuZCk7CiAJCWRjc3NfZGlhZyhEQ1NTX1BVUkdFU0VHLCBzZWctPmRjc3NfbmFtZSwKIAkJCQkmc2VnLT5zdGFydF9hZGRyLCAmc2VnLT5lbmQpOwotCQlnb3RvIG91dF9mcmVlOworCQlnb3RvIG91dF9zaGFyZWQ7CiAJfQogCXNlZy0+ZG9fbm9uc2hhcmVkID0gZG9fbm9uc2hhcmVkOwogCWF0b21pY19zZXQoJnNlZy0+cmVmX2NvdW50LCAxKTsKQEAgLTM5NCw2ICszMzUsOCBAQAogCQkJCSh2b2lkKilzZWctPnN0YXJ0X2FkZHIsICh2b2lkKilzZWctPmVuZCwKIAkJCQlzZWd0eXBlX3N0cmluZ1tzZWctPnZtX3NlZ3R5cGVdKTsKIAlnb3RvIG91dDsKKyBvdXRfc2hhcmVkOgorCXJlbW92ZV9zaGFyZWRfbWVtb3J5KHNlZy0+c3RhcnRfYWRkciwgc2VnLT5lbmQgLSBzZWctPnN0YXJ0X2FkZHIgKyAxKTsKICBvdXRfZnJlZToKIAlrZnJlZShzZWcpOwogIG91dDoKQEAgLTQyOSw3ICszNzIsNyBAQAogCWlmICghTUFDSElORV9JU19WTSkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKLQlzcGluX2xvY2sgKCZkY3NzX2xvY2spOworCW11dGV4X2xvY2soJmRjc3NfbG9jayk7CiAJc2VnID0gc2VnbWVudF9ieV9uYW1lIChuYW1lKTsKIAlpZiAoc2VnID09IE5VTEwpCiAJCXJjID0gX19zZWdtZW50X2xvYWQgKG5hbWUsIGRvX25vbnNoYXJlZCwgYWRkciwgZW5kKTsKQEAgLTQ0NCw3ICszODcsNyBAQAogCQkJcmMgICAgPSAtRVBFUk07CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2sgKCZkY3NzX2xvY2spOworCW11dGV4X3VubG9jaygmZGNzc19sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQ2Nyw3ICs0MTAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZHVtbXk7CiAJaW50IGRjc3NfY29tbWFuZCwgcmMsIGRpYWdfY2M7CiAKLQlzcGluX2xvY2sgKCZkY3NzX2xvY2spOworCW11dGV4X2xvY2soJmRjc3NfbG9jayk7CiAJc2VnID0gc2VnbWVudF9ieV9uYW1lIChuYW1lKTsKIAlpZiAoc2VnID09IE5VTEwpIHsKIAkJcmMgPSAtRUlOVkFMOwpAQCAtNTA4LDcgKzQ1MSw3IEBACiAJCSAgJmR1bW15LCAmZHVtbXkpOwogCWtmcmVlKHNlZyk7CiAgb3V0X3VubG9jazoKLQlzcGluX3VubG9jaygmZGNzc19sb2NrKTsKKwltdXRleF91bmxvY2soJmRjc3NfbG9jayk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC01MjYsMjEgKzQ2OSwyMSBAQAogCWlmICghTUFDSElORV9JU19WTSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrKCZkY3NzX2xvY2spOworCW11dGV4X2xvY2soJmRjc3NfbG9jayk7CiAJc2VnID0gc2VnbWVudF9ieV9uYW1lIChuYW1lKTsKIAlpZiAoc2VnID09IE5VTEwpIHsKIAkJUFJJTlRfRVJSICgiY291bGQgbm90IGZpbmQgc2VnbWVudCAlcyBpbiBzZWdtZW50X3VubG9hZCwgIgogCQkJCSJwbGVhc2UgcmVwb3J0IHRvIGxpbnV4MzkwQGRlLmlibS5jb21cbiIsbmFtZSk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9Ci0JaWYgKGF0b21pY19kZWNfcmV0dXJuKCZzZWctPnJlZl9jb3VudCkgPT0gMCkgewotCQlsaXN0X2RlbCgmc2VnLT5saXN0KTsKLQkJZGNzc19kaWFnKERDU1NfUFVSR0VTRUcsIHNlZy0+ZGNzc19uYW1lLAotCQkJICAmZHVtbXksICZkdW1teSk7Ci0JCWtmcmVlKHNlZyk7Ci0JfQorCWlmIChhdG9taWNfZGVjX3JldHVybigmc2VnLT5yZWZfY291bnQpICE9IDApCisJCWdvdG8gb3V0X3VubG9jazsKKwlyZW1vdmVfc2hhcmVkX21lbW9yeShzZWctPnN0YXJ0X2FkZHIsIHNlZy0+ZW5kIC0gc2VnLT5zdGFydF9hZGRyICsgMSk7CisJbGlzdF9kZWwoJnNlZy0+bGlzdCk7CisJZGNzc19kaWFnKERDU1NfUFVSR0VTRUcsIHNlZy0+ZGNzc19uYW1lLCAmZHVtbXksICZkdW1teSk7CisJa2ZyZWUoc2VnKTsKIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJmRjc3NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkY3NzX2xvY2spOwogfQogCiAvKgpAQCAtNTU5LDEyICs1MDIsMTMgQEAKIAlpZiAoIU1BQ0hJTkVfSVNfVk0pCiAJCXJldHVybjsKIAotCXNwaW5fbG9jaygmZGNzc19sb2NrKTsKKwltdXRleF9sb2NrKCZkY3NzX2xvY2spOwogCXNlZyA9IHNlZ21lbnRfYnlfbmFtZSAobmFtZSk7CiAKIAlpZiAoc2VnID09IE5VTEwpIHsKLQkJUFJJTlRfRVJSICgiY291bGQgbm90IGZpbmQgc2VnbWVudCAlcyBpbiBzZWdtZW50X3NhdmUsIHBsZWFzZSByZXBvcnQgdG8gbGludXgzOTBAZGUuaWJtLmNvbVxuIixuYW1lKTsKLQkJcmV0dXJuOworCQlQUklOVF9FUlIoImNvdWxkIG5vdCBmaW5kIHNlZ21lbnQgJXMgaW4gc2VnbWVudF9zYXZlLCBwbGVhc2UgIgorCQkJICAicmVwb3J0IHRvIGxpbnV4MzkwQGRlLmlibS5jb21cbiIsIG5hbWUpOworCQlnb3RvIG91dDsKIAl9CiAKIAlzdGFydHBmbiA9IHNlZy0+c3RhcnRfYWRkciA+PiBQQUdFX1NISUZUOwpAQCAtNTkxLDcgKzUzNSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIG91dDoKLQlzcGluX3VubG9jaygmZGNzc19sb2NrKTsKKwltdXRleF91bmxvY2soJmRjc3NfbG9jayk7CiB9CiAKIEVYUE9SVF9TWU1CT0woc2VnbWVudF9sb2FkKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9mYXVsdC5jIGIvYXJjaC9zMzkwL21tL2ZhdWx0LmMKaW5kZXggMWMzMjNiYi4uY2Q4NWUzNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zMzkwL21tL2ZhdWx0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9zMzkwX2V4dC5oPgogCiAjaWZuZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBfX0ZBSUxfQUREUl9NQVNLIDB4N2ZmZmYwMDAKQEAgLTM5NCw2ICszOTUsNyBAQAogLyoKICAqICdwZmF1bHQnIHBzZXVkbyBwYWdlIGZhdWx0cyByb3V0aW5lcy4KICAqLworc3RhdGljIGV4dF9pbnRfaW5mb190IGV4dF9pbnRfcGZhdWx0Owogc3RhdGljIGludCBwZmF1bHRfZGlzYWJsZSA9IDA7CiAKIHN0YXRpYyBpbnQgX19pbml0IG5vcGZhdWx0KGNoYXIgKnN0cikKQEAgLTQyMiw3ICs0MjQsNyBAQAogCQkgIF9fUEZfUkVTX0ZJRUxEIH07CiAgICAgICAgIGludCByYzsKIAotCWlmIChwZmF1bHRfZGlzYWJsZSkKKwlpZiAoIU1BQ0hJTkVfSVNfVk0gfHwgcGZhdWx0X2Rpc2FibGUpCiAJCXJldHVybiAtMTsKIAlhc20gdm9sYXRpbGUoCiAJCSIJZGlhZwklMSwlMCwweDI1OFxuIgpAQCAtNDQwLDcgKzQ0Miw3IEBACiAJcGZhdWx0X3JlZmJrX3QgcmVmYmsgPQogCXsgMHgyNTgsIDEsIDUsIDIsIDBVTEwsIDBVTEwsIDBVTEwsIDBVTEwgfTsKIAotCWlmIChwZmF1bHRfZGlzYWJsZSkKKwlpZiAoIU1BQ0hJTkVfSVNfVk0gfHwgcGZhdWx0X2Rpc2FibGUpCiAJCXJldHVybjsKIAlfX2N0bF9jbGVhcl9iaXQoMCw5KTsKIAlhc20gdm9sYXRpbGUoCkBAIC01MDAsNSArNTAyLDI1IEBACiAJCQlzZXRfdHNrX25lZWRfcmVzY2hlZCh0c2spOwogCX0KIH0KLSNlbmRpZgogCit2b2lkIF9faW5pdCBwZmF1bHRfaXJxX2luaXQodm9pZCkKK3sKKwlpZiAoIU1BQ0hJTkVfSVNfVk0pCisJCXJldHVybjsKKworCS8qCisJICogVHJ5IHRvIGdldCBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIGdvaW5nLgorCSAqLworCWlmIChyZWdpc3Rlcl9lYXJseV9leHRlcm5hbF9pbnRlcnJ1cHQoMHgyNjAzLCBwZmF1bHRfaW50ZXJydXB0LAorCQkJCQkgICAgICAmZXh0X2ludF9wZmF1bHQpICE9IDApCisJCXBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDI2MDMiKTsKKworCWlmIChwZmF1bHRfaW5pdCgpID09IDApCisJCXJldHVybjsKKworCS8qIFRvdWdoIGx1Y2ssIG5vIHBmYXVsdC4gKi8KKwlwZmF1bHRfZGlzYWJsZSA9IDE7CisJdW5yZWdpc3Rlcl9lYXJseV9leHRlcm5hbF9pbnRlcnJ1cHQoMHgyNjAzLCBwZmF1bHRfaW50ZXJydXB0LAorCQkJCQkgICAgJmV4dF9pbnRfcGZhdWx0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2luaXQuYyBiL2FyY2gvczM5MC9tbS9pbml0LmMKaW5kZXggZDk5ODkxNy4uNGJiMjFiZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2luaXQuYworKysgYi9hcmNoL3MzOTAvbW0vaW5pdC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC02OSw2ICs3MCw4IEBACiAgICAgICAgIHByaW50aygiRnJlZSBzd2FwOiAgICAgICAlNmxka0JcbiIsIG5yX3N3YXBfcGFnZXM8PChQQUdFX1NISUZULTEwKSk7CiAgICAgICAgIGkgPSBtYXhfbWFwbnI7CiAgICAgICAgIHdoaWxlIChpLS0gPiAwKSB7CisJCWlmICghcGZuX3ZhbGlkKGkpKQorCQkJY29udGludWU7CiAJCXBhZ2UgPSBwZm5fdG9fcGFnZShpKTsKICAgICAgICAgICAgICAgICB0b3RhbCsrOwogCQlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpKQpAQCAtODQsNjUgKzg3LDUyIEBACiAgICAgICAgIHByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsY2FjaGVkKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3JvX3JlZ2lvbih2b2lkKQoreworCXBnZF90ICpwZ2Q7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXB0ZV90IG5ld19wdGU7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBlbmQ7CisKKwlhZGRyZXNzID0gKCh1bnNpZ25lZCBsb25nKSZfX3N0YXJ0X3JvZGF0YSkgJiBQQUdFX01BU0s7CisJZW5kID0gUEZOX0FMSUdOKCh1bnNpZ25lZCBsb25nKSZfX2VuZF9yb2RhdGEpOworCisJZm9yICg7IGFkZHJlc3MgPCBlbmQ7IGFkZHJlc3MgKz0gUEFHRV9TSVpFKSB7CisJCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKKwkJcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHJlc3MpOworCQlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHJlc3MpOworCQluZXdfcHRlID0gbWtfcHRlX3BoeXMoYWRkcmVzcywgX19wZ3Byb3QoX1BBR0VfUk8pKTsKKwkJc2V0X3B0ZShwdGUsIG5ld19wdGUpOworCX0KK30KKworZXh0ZXJuIHZvaWQgdm1lbV9tYXBfaW5pdCh2b2lkKTsKKwogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMKICAqLwotCi0jaWZuZGVmIENPTkZJR182NEJJVAogdm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKIHsKLSAgICAgICAgcGdkX3QgKiBwZ19kaXI7Ci0gICAgICAgIHB0ZV90ICogcGdfdGFibGU7Ci0gICAgICAgIHB0ZV90ICAgcHRlOwotCWludCAgICAgaTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyB0bXA7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcGZuID0gMDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBwZ2Rpcl9rID0gKF9fcGEoc3dhcHBlcl9wZ19kaXIpICYgUEFHRV9NQVNLKSB8IF9LRVJOU0VHX1RBQkxFOwotICAgICAgICBzdGF0aWMgY29uc3QgaW50IHNzbV9tYXNrID0gMHgwNDAwMDAwMEw7Ci0JdW5zaWduZWQgbG9uZyByb19zdGFydF9wZm4sIHJvX2VuZF9wZm47CisJcGdkX3QgKnBnX2RpcjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHBnZGlyX2s7CisJc3RhdGljIGNvbnN0IGludCBzc21fbWFzayA9IDB4MDQwMDAwMDBMOwogCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwogCi0Jcm9fc3RhcnRfcGZuID0gUEZOX0RPV04oKHVuc2lnbmVkIGxvbmcpJl9fc3RhcnRfcm9kYXRhKTsKLQlyb19lbmRfcGZuID0gUEZOX1VQKCh1bnNpZ25lZCBsb25nKSZfX2VuZF9yb2RhdGEpOwotCi0JbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7Ci0JbWF4X3pvbmVfcGZuc1taT05FX0RNQV0gPSBtYXhfbG93X3BmbjsKLQltYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA9IG1heF9sb3dfcGZuOwotCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwotCi0JLyogdW5tYXAgd2hvbGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCisJcGdfZGlyID0gc3dhcHBlcl9wZ19kaXI7CiAJCi0gICAgICAgIHBnX2RpciA9IHN3YXBwZXJfcGdfZGlyOwotCisjaWZkZWYgQ09ORklHXzY0QklUCisJcGdkaXJfayA9IChfX3BhKHN3YXBwZXJfcGdfZGlyKSAmIFBBR0VfTUFTSykgfCBfS0VSTl9SRUdJT05fVEFCTEU7CiAJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BHRDsgaSsrKQotCQlwbWRfY2xlYXIoKHBtZF90ICopIHBnX2RpcisrKTsKLQkJCi0JLyoKLQkgKiBtYXAgd2hvbGUgcGh5c2ljYWwgbWVtb3J5IHRvIHZpcnR1YWwgbWVtb3J5IChpZGVudGl0eSBtYXBwaW5nKSAKLQkgKi8KLQotICAgICAgICBwZ19kaXIgPSBzd2FwcGVyX3BnX2RpcjsKLQotICAgICAgICB3aGlsZSAocGZuIDwgbWF4X2xvd19wZm4pIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIHBnX3RhYmxlIGlzIHBoeXNpY2FsIGF0IHRoaXMgcG9pbnQKLSAgICAgICAgICAgICAgICAgKi8KLQkJcGdfdGFibGUgPSAocHRlX3QgKikgYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOwotCi0JCXBtZF9wb3B1bGF0ZV9rZXJuZWwoJmluaXRfbW0sIChwbWRfdCAqKSBwZ19kaXIsIHBnX3RhYmxlKTsKLSAgICAgICAgICAgICAgICBwZ19kaXIrKzsKLQotICAgICAgICAgICAgICAgIGZvciAodG1wID0gMCA7IHRtcCA8IFBUUlNfUEVSX1BURSA7IHRtcCsrLHBnX3RhYmxlKyspIHsKLQkJCWlmIChwZm4gPj0gcm9fc3RhcnRfcGZuICYmIHBmbiA8IHJvX2VuZF9wZm4pCi0JCQkJcHRlID0gcGZuX3B0ZShwZm4sIF9fcGdwcm90KF9QQUdFX1JPKSk7Ci0JCQllbHNlCi0JCQkJcHRlID0gcGZuX3B0ZShwZm4sIFBBR0VfS0VSTkVMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZm4gPj0gbWF4X2xvd19wZm4pCi0JCQkJcHRlX3ZhbChwdGUpID0gX1BBR0VfVFlQRV9FTVBUWTsKLQkJCXNldF9wdGUocGdfdGFibGUsIHB0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZm4rKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJcGdkX2NsZWFyKHBnX2RpciArIGkpOworI2Vsc2UKKwlwZ2Rpcl9rID0gKF9fcGEoc3dhcHBlcl9wZ19kaXIpICYgUEFHRV9NQVNLKSB8IF9LRVJOU0VHX1RBQkxFOworCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QR0Q7IGkrKykKKwkJcG1kX2NsZWFyKChwbWRfdCAqKShwZ19kaXIgKyBpKSk7CisjZW5kaWYKKwl2bWVtX21hcF9pbml0KCk7CisJc2V0dXBfcm9fcmVnaW9uKCk7CiAKIAlTMzkwX2xvd2NvcmUua2VybmVsX2FzY2UgPSBwZ2Rpcl9rOwogCkBAIC0xNTIsODIgKzE0MiwxMSBAQAogCV9fY3RsX2xvYWQocGdkaXJfaywgMTMsIDEzKTsKIAlfX3Jhd19sb2NhbF9pcnFfc3NtKHNzbV9tYXNrKTsKIAotICAgICAgICBsb2NhbF9mbHVzaF90bGIoKTsKLX0KLQotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0KLXZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCi17Ci0gICAgICAgIHBnZF90ICogcGdfZGlyOwotCXBtZF90ICogcG1fZGlyOwotICAgICAgICBwdGVfdCAqIHB0X2RpcjsKLSAgICAgICAgcHRlX3QgICBwdGU7Ci0JaW50ICAgICBpLGosazsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBwZm4gPSAwOwotICAgICAgICB1bnNpZ25lZCBsb25nIHBnZGlyX2sgPSAoX19wYShzd2FwcGVyX3BnX2RpcikgJiBQQUdFX01BU0spIHwKLSAgICAgICAgICBfS0VSTl9SRUdJT05fVEFCTEU7Ci0Jc3RhdGljIGNvbnN0IGludCBzc21fbWFzayA9IDB4MDQwMDAwMDBMOwotCXVuc2lnbmVkIGxvbmcgcm9fc3RhcnRfcGZuLCByb19lbmRfcGZuOwotCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwotCi0Jcm9fc3RhcnRfcGZuID0gUEZOX0RPV04oKHVuc2lnbmVkIGxvbmcpJl9fc3RhcnRfcm9kYXRhKTsKLQlyb19lbmRfcGZuID0gUEZOX1VQKCh1bnNpZ25lZCBsb25nKSZfX2VuZF9yb2RhdGEpOwotCiAJbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7CiAJbWF4X3pvbmVfcGZuc1taT05FX0RNQV0gPSBQRk5fRE9XTihNQVhfRE1BX0FERFJFU1MpOwogCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm47CiAJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7Ci0KLQkvKgotCSAqIG1hcCB3aG9sZSBwaHlzaWNhbCBtZW1vcnkgdG8gdmlydHVhbCBtZW1vcnkgKGlkZW50aXR5IG1hcHBpbmcpIAotCSAqLwotCi0gICAgICAgIHBnX2RpciA9IHN3YXBwZXJfcGdfZGlyOwotCQotICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IFBUUlNfUEVSX1BHRCA7IGkrKyxwZ19kaXIrKykgewotCQotICAgICAgICAgICAgICAgIGlmIChwZm4gPj0gbWF4X2xvd19wZm4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBnZF9jbGVhcihwZ19kaXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgCi0JCXBtX2RpciA9IChwbWRfdCAqKSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSAqIDQpOwotICAgICAgICAgICAgICAgIHBnZF9wb3B1bGF0ZSgmaW5pdF9tbSwgcGdfZGlyLCBwbV9kaXIpOwotCi0gICAgICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBQVFJTX1BFUl9QTUQgOyBqKysscG1fZGlyKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZm4gPj0gbWF4X2xvd19wZm4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1kX2NsZWFyKHBtX2Rpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQkJCXB0X2RpciA9IChwdGVfdCAqKSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbWRfcG9wdWxhdGVfa2VybmVsKCZpbml0X21tLCBwbV9kaXIsIHB0X2Rpcik7Ci0JCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwIDsgayA8IFBUUlNfUEVSX1BURSA7IGsrKyxwdF9kaXIrKykgewotCQkJCWlmIChwZm4gPj0gcm9fc3RhcnRfcGZuICYmIHBmbiA8IHJvX2VuZF9wZm4pCi0JCQkJCXB0ZSA9IHBmbl9wdGUocGZuLCBfX3BncHJvdChfUEFHRV9STykpOwotCQkJCWVsc2UKLQkJCQkJcHRlID0gcGZuX3B0ZShwZm4sIFBBR0VfS0VSTkVMKTsKLQkJCQlpZiAocGZuID49IG1heF9sb3dfcGZuKQotCQkJCQlwdGVfdmFsKHB0ZSkgPSBfUEFHRV9UWVBFX0VNUFRZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHRlKHB0X2RpciwgcHRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQlTMzkwX2xvd2NvcmUua2VybmVsX2FzY2UgPSBwZ2Rpcl9rOwotCi0gICAgICAgIC8qIGVuYWJsZSB2aXJ0dWFsIG1hcHBpbmcgaW4ga2VybmVsIG1vZGUgKi8KLQlfX2N0bF9sb2FkKHBnZGlyX2ssIDEsIDEpOwotCV9fY3RsX2xvYWQocGdkaXJfaywgNywgNyk7Ci0JX19jdGxfbG9hZChwZ2Rpcl9rLCAxMywgMTMpOwotCV9fcmF3X2xvY2FsX2lycV9zc20oc3NtX21hc2spOwotCi0gICAgICAgIGxvY2FsX2ZsdXNoX3RsYigpOwogfQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiB2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQogewpAQCAtMjU3LDYgKzE3Niw4IEBACiAJcHJpbnRrKCJXcml0ZSBwcm90ZWN0ZWQga2VybmVsIHJlYWQtb25seSBkYXRhOiAlI2x4IC0gJSNseFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcpJl9fc3RhcnRfcm9kYXRhLAogCSAgICAgICBQRk5fQUxJR04oKHVuc2lnbmVkIGxvbmcpJl9fZW5kX3JvZGF0YSkgLSAxKTsKKwlwcmludGsoIlZpcnR1YWwgbWVtbWFwIHNpemU6ICVsZGtcbiIsCisJICAgICAgIChtYXhfcGZuICogc2l6ZW9mKHN0cnVjdCBwYWdlKSkgPj4gMTApOwogfQogCiB2b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQpAQCAtMjY3LDYgKzE4OCw3IEBACiAgICAgICAgIGZvciAoOyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpKCZfX2luaXRfZW5kKTsgYWRkciArPSBQQUdFX1NJWkUpIHsKIAkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKIAkJaW5pdF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShhZGRyKSk7CisJCW1lbXNldCgodm9pZCAqKWFkZHIsIFBPSVNPTl9GUkVFX0lOSVRNRU0sIFBBR0VfU0laRSk7CiAJCWZyZWVfcGFnZShhZGRyKTsKIAkJdG90YWxyYW1fcGFnZXMrKzsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2lvcmVtYXAuYyBiL2FyY2gvczM5MC9tbS9pb3JlbWFwLmMKaW5kZXggMGY2ZTllYy4uM2QyMTAwYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2lvcmVtYXAuYworKysgYi9hcmNoL3MzOTAvbW0vaW9yZW1hcC5jCkBAIC0xNSw4NyArMTUsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1hcF9hcmVhX3B0ZShwdGVfdCAqIHB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotICAgICAgICB1bnNpZ25lZCBsb25nIGVuZDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBwZm47Ci0KLSAgICAgICAgYWRkcmVzcyAmPSB+UE1EX01BU0s7Ci0gICAgICAgIGVuZCA9IGFkZHJlc3MgKyBzaXplOwotICAgICAgICBpZiAoZW5kID4gUE1EX1NJWkUpCi0gICAgICAgICAgICAgICAgZW5kID0gUE1EX1NJWkU7Ci0JaWYgKGFkZHJlc3MgPj0gZW5kKQotCQlCVUcoKTsKLSAgICAgICAgcGZuID0gcGh5c19hZGRyID4+IFBBR0VfU0hJRlQ7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoIXB0ZV9ub25lKCpwdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoInJlbWFwX2FyZWFfcHRlOiBwYWdlIGFscmVhZHkgZXhpc3RzXG4iKTsKLQkJCUJVRygpOwotCQl9Ci0gICAgICAgICAgICAgICAgc2V0X3B0ZShwdGUsIHBmbl9wdGUocGZuLCBfX3BncHJvdChmbGFncykpKTsKLSAgICAgICAgICAgICAgICBhZGRyZXNzICs9IFBBR0VfU0laRTsKLSAgICAgICAgICAgICAgICBwZm4rKzsKLSAgICAgICAgICAgICAgICBwdGUrKzsKLSAgICAgICAgfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCByZW1hcF9hcmVhX3BtZChwbWRfdCAqIHBtZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXVuc2lnbmVkIGxvbmcgZW5kOwotCi0JYWRkcmVzcyAmPSB+UEdESVJfTUFTSzsKLQllbmQgPSBhZGRyZXNzICsgc2l6ZTsKLQlpZiAoZW5kID4gUEdESVJfU0laRSkKLQkJZW5kID0gUEdESVJfU0laRTsKLQlwaHlzX2FkZHIgLT0gYWRkcmVzczsKLQlpZiAoYWRkcmVzcyA+PSBlbmQpCi0JCUJVRygpOwotCWRvIHsKLQkJcHRlX3QgKiBwdGUgPSBwdGVfYWxsb2Nfa2VybmVsKHBtZCwgYWRkcmVzcyk7Ci0JCWlmICghcHRlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXJlbWFwX2FyZWFfcHRlKHB0ZSwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywgYWRkcmVzcyArIHBoeXNfYWRkciwgZmxhZ3MpOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKLQkJcG1kKys7Ci0JfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKLQkJCQkgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWludCBlcnJvcjsKLQlwZ2RfdCAqIGRpcjsKLQl1bnNpZ25lZCBsb25nIGVuZCA9IGFkZHJlc3MgKyBzaXplOwotCi0JcGh5c19hZGRyIC09IGFkZHJlc3M7Ci0JZGlyID0gcGdkX29mZnNldCgmaW5pdF9tbSwgYWRkcmVzcyk7Ci0JZmx1c2hfY2FjaGVfYWxsKCk7Ci0JaWYgKGFkZHJlc3MgPj0gZW5kKQotCQlCVUcoKTsKLQlkbyB7Ci0JCXBtZF90ICpwbWQ7Ci0JCXBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgZGlyLCBhZGRyZXNzKTsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlpZiAoIXBtZCkKLQkJCWJyZWFrOwotCQlpZiAocmVtYXBfYXJlYV9wbWQocG1kLCBhZGRyZXNzLCBlbmQgLSBhZGRyZXNzLAotCQkJCQkgcGh5c19hZGRyICsgYWRkcmVzcywgZmxhZ3MpKQotCQkJYnJlYWs7Ci0JCWVycm9yID0gMDsKLQkJYWRkcmVzcyA9IChhZGRyZXNzICsgUEdESVJfU0laRSkgJiBQR0RJUl9NQVNLOwotCQlkaXIrKzsKLQl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7Ci0JZmx1c2hfdGxiX2FsbCgpOwotCXJldHVybiAwOwotfQogCiAvKgogICogR2VuZXJpYyBtYXBwaW5nIGZ1bmN0aW9uIChub3QgdmlzaWJsZSBvdXRzaWRlKToKQEAgLTEyMiw3ICs0Myw4IEBACiAJaWYgKCFhcmVhKQogCQlyZXR1cm4gTlVMTDsKIAlhZGRyID0gYXJlYS0+YWRkcjsKLQlpZiAocmVtYXBfYXJlYV9wYWdlcygodW5zaWduZWQgbG9uZykgYWRkciwgcGh5c19hZGRyLCBzaXplLCBmbGFncykpIHsKKwlpZiAoaW9yZW1hcF9wYWdlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFkZHIsICh1bnNpZ25lZCBsb25nKWFkZHIgKyBzaXplLAorCQkJICAgICAgIHBoeXNfYWRkciwgX19wZ3Byb3QoZmxhZ3MpKSkgewogCQl2ZnJlZShhZGRyKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL3ZtZW0uYyBiL2FyY2gvczM5MC9tbS92bWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyOTQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9tbS92bWVtLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiAgYXJjaC9zMzkwL21tL3ZtZW0uYworICoKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNgorICogICAgQXV0aG9yKHMpOiBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKwordW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZDsKK0VYUE9SVF9TWU1CT0wodm1hbGxvY19lbmQpOworCitzdGF0aWMgc3RydWN0IHBhZ2UgKnZtZW1fbWFwOworc3RhdGljIERFRklORV9NVVRFWCh2bWVtX211dGV4KTsKKworc3RydWN0IG1lbW9yeV9zZWdtZW50IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKG1lbV9zZWdzKTsKKwordm9pZCBtZW1tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHNpemUsIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgem9uZSwKKwkJIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuKQoreworCXN0cnVjdCBwYWdlICpzdGFydCwgKmVuZDsKKwlzdHJ1Y3QgcGFnZSAqbWFwX3N0YXJ0LCAqbWFwX2VuZDsKKwlpbnQgaTsKKworCXN0YXJ0ID0gcGZuX3RvX3BhZ2Uoc3RhcnRfcGZuKTsKKwllbmQgPSBzdGFydCArIHNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUyAmJiBtZW1vcnlfY2h1bmtbaV0uc2l6ZSA+IDA7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGNzdGFydCwgY2VuZDsKKworCQljc3RhcnQgPSBQRk5fRE9XTihtZW1vcnlfY2h1bmtbaV0uYWRkcik7CisJCWNlbmQgPSBjc3RhcnQgKyBQRk5fRE9XTihtZW1vcnlfY2h1bmtbaV0uc2l6ZSk7CisKKwkJbWFwX3N0YXJ0ID0gbWVtX21hcCArIGNzdGFydDsKKwkJbWFwX2VuZCA9IG1lbV9tYXAgKyBjZW5kOworCisJCWlmIChtYXBfc3RhcnQgPCBzdGFydCkKKwkJCW1hcF9zdGFydCA9IHN0YXJ0OworCQlpZiAobWFwX2VuZCA+IGVuZCkKKwkJCW1hcF9lbmQgPSBlbmQ7CisKKwkJbWFwX3N0YXJ0IC09ICgodW5zaWduZWQgbG9uZykgbWFwX3N0YXJ0ICYgKFBBR0VfU0laRSAtIDEpKQorCQkJLyBzaXplb2Yoc3RydWN0IHBhZ2UpOworCQltYXBfZW5kICs9ICgoUEZOX0FMSUdOKCh1bnNpZ25lZCBsb25nKSBtYXBfZW5kKQorCQkJICAgICAtICh1bnNpZ25lZCBsb25nKSBtYXBfZW5kKQorCQkJICAgIC8gc2l6ZW9mKHN0cnVjdCBwYWdlKSk7CisKKwkJaWYgKG1hcF9zdGFydCA8IG1hcF9lbmQpCisJCQltZW1tYXBfaW5pdF96b25lKCh1bnNpZ25lZCBsb25nKShtYXBfZW5kIC0gbWFwX3N0YXJ0KSwKKwkJCQkJIG5pZCwgem9uZSwgcGFnZV90b19wZm4obWFwX3N0YXJ0KSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnZtZW1fYWxsb2NfcGFnZXModW5zaWduZWQgaW50IG9yZGVyKQoreworCWlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKQorCQlyZXR1cm4gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwlyZXR1cm4gYWxsb2NfYm9vdG1lbV9wYWdlcygoMSA8PCBvcmRlcikgKiBQQUdFX1NJWkUpOworfQorCitzdGF0aWMgaW5saW5lIHBtZF90ICp2bWVtX3BtZF9hbGxvYyh2b2lkKQoreworCXBtZF90ICpwbWQ7CisJaW50IGk7CisKKwlwbWQgPSB2bWVtX2FsbG9jX3BhZ2VzKFBNRF9BTExPQ19PUkRFUik7CisJaWYgKCFwbWQpCisJCXJldHVybiBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QTUQ7IGkrKykKKwkJcG1kX2NsZWFyKHBtZCArIGkpOworCXJldHVybiBwbWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgKnZtZW1fcHRlX2FsbG9jKHZvaWQpCit7CisJcHRlX3QgKnB0ZTsKKwlwdGVfdCBlbXB0eV9wdGU7CisJaW50IGk7CisKKwlwdGUgPSB2bWVtX2FsbG9jX3BhZ2VzKFBURV9BTExPQ19PUkRFUik7CisJaWYgKCFwdGUpCisJCXJldHVybiBOVUxMOworCXB0ZV92YWwoZW1wdHlfcHRlKSA9IF9QQUdFX1RZUEVfRU1QVFk7CisJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BURTsgaSsrKQorCQlzZXRfcHRlKHB0ZSArIGksIGVtcHR5X3B0ZSk7CisJcmV0dXJuIHB0ZTsKK30KKworLyoKKyAqIEFkZCBhIHBoeXNpY2FsIG1lbW9yeSByYW5nZSB0byB0aGUgMToxIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBpbnQgdm1lbV9hZGRfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwlwZ2RfdCAqcGdfZGlyOworCXBtZF90ICpwbV9kaXI7CisJcHRlX3QgKnB0X2RpcjsKKwlwdGVfdCAgcHRlOworCWludCByZXQgPSAtRU5PTUVNOworCisJZm9yIChhZGRyZXNzID0gc3RhcnQ7IGFkZHJlc3MgPCBzdGFydCArIHNpemU7IGFkZHJlc3MgKz0gUEFHRV9TSVpFKSB7CisJCXBnX2RpciA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKKwkJaWYgKHBnZF9ub25lKCpwZ19kaXIpKSB7CisJCQlwbV9kaXIgPSB2bWVtX3BtZF9hbGxvYygpOworCQkJaWYgKCFwbV9kaXIpCisJCQkJZ290byBvdXQ7CisJCQlwZ2RfcG9wdWxhdGUoJmluaXRfbW0sIHBnX2RpciwgcG1fZGlyKTsKKwkJfQorCisJCXBtX2RpciA9IHBtZF9vZmZzZXQocGdfZGlyLCBhZGRyZXNzKTsKKwkJaWYgKHBtZF9ub25lKCpwbV9kaXIpKSB7CisJCQlwdF9kaXIgPSB2bWVtX3B0ZV9hbGxvYygpOworCQkJaWYgKCFwdF9kaXIpCisJCQkJZ290byBvdXQ7CisJCQlwbWRfcG9wdWxhdGVfa2VybmVsKCZpbml0X21tLCBwbV9kaXIsIHB0X2Rpcik7CisJCX0KKworCQlwdF9kaXIgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbV9kaXIsIGFkZHJlc3MpOworCQlwdGUgPSBwZm5fcHRlKGFkZHJlc3MgPj4gUEFHRV9TSElGVCwgUEFHRV9LRVJORUwpOworCQlzZXRfcHRlKHB0X2RpciwgcHRlKTsKKwl9CisJcmV0ID0gMDsKK291dDoKKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBzdGFydCArIHNpemUpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBwaHlzaWNhbCBtZW1vcnkgcmFuZ2UgZnJvbSB0aGUgMToxIG1hcHBpbmcuCisgKiBDdXJyZW50bHkgb25seSBpbnZhbGlkYXRlcyBwYWdlIHRhYmxlIGVudHJpZXMuCisgKi8KK3N0YXRpYyB2b2lkIHZtZW1fcmVtb3ZlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJcGdkX3QgKnBnX2RpcjsKKwlwbWRfdCAqcG1fZGlyOworCXB0ZV90ICpwdF9kaXI7CisJcHRlX3QgIHB0ZTsKKworCXB0ZV92YWwocHRlKSA9IF9QQUdFX1RZUEVfRU1QVFk7CisJZm9yIChhZGRyZXNzID0gc3RhcnQ7IGFkZHJlc3MgPCBzdGFydCArIHNpemU7IGFkZHJlc3MgKz0gUEFHRV9TSVpFKSB7CisJCXBnX2RpciA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKKwkJaWYgKHBnZF9ub25lKCpwZ19kaXIpKQorCQkJY29udGludWU7CisJCXBtX2RpciA9IHBtZF9vZmZzZXQocGdfZGlyLCBhZGRyZXNzKTsKKwkJaWYgKHBtZF9ub25lKCpwbV9kaXIpKQorCQkJY29udGludWU7CisJCXB0X2RpciA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtX2RpciwgYWRkcmVzcyk7CisJCXNldF9wdGUocHRfZGlyLCBwdGUpOworCX0KKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBzdGFydCArIHNpemUpOworfQorCisvKgorICogQWRkIGEgYmFja2VkIG1lbV9tYXAgYXJyYXkgdG8gdGhlIHZpcnR1YWwgbWVtX21hcCBhcnJheS4KKyAqLworc3RhdGljIGludCB2bWVtX2FkZF9tZW1fbWFwKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0YXJ0X2FkZHIsIGVuZF9hZGRyOworCXN0cnVjdCBwYWdlICptYXBfc3RhcnQsICptYXBfZW5kOworCXBnZF90ICpwZ19kaXI7CisJcG1kX3QgKnBtX2RpcjsKKwlwdGVfdCAqcHRfZGlyOworCXB0ZV90ICBwdGU7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwltYXBfc3RhcnQgPSB2bWVtX21hcCArIFBGTl9ET1dOKHN0YXJ0KTsKKwltYXBfZW5kCT0gdm1lbV9tYXAgKyBQRk5fRE9XTihzdGFydCArIHNpemUpOworCisJc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBtYXBfc3RhcnQgJiBQQUdFX01BU0s7CisJZW5kX2FkZHIgPSBQRk5fQUxJR04oKHVuc2lnbmVkIGxvbmcpIG1hcF9lbmQpOworCisJZm9yIChhZGRyZXNzID0gc3RhcnRfYWRkcjsgYWRkcmVzcyA8IGVuZF9hZGRyOyBhZGRyZXNzICs9IFBBR0VfU0laRSkgeworCQlwZ19kaXIgPSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcyk7CisJCWlmIChwZ2Rfbm9uZSgqcGdfZGlyKSkgeworCQkJcG1fZGlyID0gdm1lbV9wbWRfYWxsb2MoKTsKKwkJCWlmICghcG1fZGlyKQorCQkJCWdvdG8gb3V0OworCQkJcGdkX3BvcHVsYXRlKCZpbml0X21tLCBwZ19kaXIsIHBtX2Rpcik7CisJCX0KKworCQlwbV9kaXIgPSBwbWRfb2Zmc2V0KHBnX2RpciwgYWRkcmVzcyk7CisJCWlmIChwbWRfbm9uZSgqcG1fZGlyKSkgeworCQkJcHRfZGlyID0gdm1lbV9wdGVfYWxsb2MoKTsKKwkJCWlmICghcHRfZGlyKQorCQkJCWdvdG8gb3V0OworCQkJcG1kX3BvcHVsYXRlX2tlcm5lbCgmaW5pdF9tbSwgcG1fZGlyLCBwdF9kaXIpOworCQl9CisKKwkJcHRfZGlyID0gcHRlX29mZnNldF9rZXJuZWwocG1fZGlyLCBhZGRyZXNzKTsKKwkJaWYgKHB0ZV9ub25lKCpwdF9kaXIpKSB7CisJCQl1bnNpZ25lZCBsb25nIG5ld19wYWdlOworCisJCQluZXdfcGFnZSA9X19wYSh2bWVtX2FsbG9jX3BhZ2VzKDApKTsKKwkJCWlmICghbmV3X3BhZ2UpCisJCQkJZ290byBvdXQ7CisJCQlwdGUgPSBwZm5fcHRlKG5ld19wYWdlID4+IFBBR0VfU0hJRlQsIFBBR0VfS0VSTkVMKTsKKwkJCXNldF9wdGUocHRfZGlyLCBwdGUpOworCQl9CisJfQorCXJldCA9IDA7CitvdXQ6CisJZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydF9hZGRyLCBlbmRfYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2bWVtX2FkZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCByZXQ7CisKKwlyZXQgPSB2bWVtX2FkZF9yYW5nZShzdGFydCwgc2l6ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gdm1lbV9hZGRfbWVtX21hcChzdGFydCwgc2l6ZSk7Cit9CisKKy8qCisgKiBBZGQgbWVtb3J5IHNlZ21lbnQgdG8gdGhlIHNlZ21lbnQgbGlzdCBpZiBpdCBkb2Vzbid0IG92ZXJsYXAgd2l0aAorICogYW4gYWxyZWFkeSBwcmVzZW50IHNlZ21lbnQuCisgKi8KK3N0YXRpYyBpbnQgaW5zZXJ0X21lbW9yeV9zZWdtZW50KHN0cnVjdCBtZW1vcnlfc2VnbWVudCAqc2VnKQoreworCXN0cnVjdCBtZW1vcnlfc2VnbWVudCAqdG1wOworCisJaWYgKFBGTl9ET1dOKHNlZy0+c3RhcnQgKyBzZWctPnNpemUpID4gbWF4X3BmbiB8fAorCSAgICBzZWctPnN0YXJ0ICsgc2VnLT5zaXplIDwgc2VnLT5zdGFydCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJm1lbV9zZWdzLCBsaXN0KSB7CisJCWlmIChzZWctPnN0YXJ0ID49IHRtcC0+c3RhcnQgKyB0bXAtPnNpemUpCisJCQljb250aW51ZTsKKwkJaWYgKHNlZy0+c3RhcnQgKyBzZWctPnNpemUgPD0gdG1wLT5zdGFydCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJbGlzdF9hZGQoJnNlZy0+bGlzdCwgJm1lbV9zZWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbW92ZSBtZW1vcnkgc2VnbWVudCBmcm9tIHRoZSBzZWdtZW50IGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9tZW1vcnlfc2VnbWVudChzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKnNlZykKK3sKKwlsaXN0X2RlbCgmc2VnLT5saXN0KTsKK30KKworc3RhdGljIHZvaWQgX19yZW1vdmVfc2hhcmVkX21lbW9yeShzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKnNlZykKK3sKKwlyZW1vdmVfbWVtb3J5X3NlZ21lbnQoc2VnKTsKKwl2bWVtX3JlbW92ZV9yYW5nZShzZWctPnN0YXJ0LCBzZWctPnNpemUpOworfQorCitpbnQgcmVtb3ZlX3NoYXJlZF9tZW1vcnkodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBtZW1vcnlfc2VnbWVudCAqc2VnOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ2bWVtX211dGV4KTsKKworCXJldCA9IC1FTk9FTlQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWcsICZtZW1fc2VncywgbGlzdCkgeworCQlpZiAoc2VnLT5zdGFydCA9PSBzdGFydCAmJiBzZWctPnNpemUgPT0gc2l6ZSkKKwkJCWJyZWFrOworCX0KKworCWlmIChzZWctPnN0YXJ0ICE9IHN0YXJ0IHx8IHNlZy0+c2l6ZSAhPSBzaXplKQorCQlnb3RvIG91dDsKKworCXJldCA9IDA7CisJX19yZW1vdmVfc2hhcmVkX21lbW9yeShzZWcpOworCWtmcmVlKHNlZyk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ2bWVtX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRkX3NoYXJlZF9tZW1vcnkodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBtZW1vcnlfc2VnbWVudCAqc2VnOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgcGZuLCBudW1fcGZuLCBlbmRfcGZuOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ2bWVtX211dGV4KTsKKwlyZXQgPSAtRU5PTUVNOworCXNlZyA9IGt6YWxsb2Moc2l6ZW9mKCpzZWcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlZykKKwkJZ290byBvdXQ7CisJc2VnLT5zdGFydCA9IHN0YXJ0OworCXNlZy0+c2l6ZSA9IHNpemU7CisKKwlyZXQgPSBpbnNlcnRfbWVtb3J5X3NlZ21lbnQoc2VnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gdm1lbV9hZGRfbWVtKHN0YXJ0LCBzaXplKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9yZW1vdmU7CisKKwlwZm4gPSBQRk5fRE9XTihzdGFydCk7CisJbnVtX3BmbiA9IFBGTl9ET1dOKHNpemUpOworCWVuZF9wZm4gPSBwZm4gKyBudW1fcGZuOworCisJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisJbWVtc2V0KHBhZ2UsIDAsIG51bV9wZm4gKiBzaXplb2Yoc3RydWN0IHBhZ2UpKTsKKworCWZvciAoOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgeworCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwkJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOworCQlyZXNldF9wYWdlX21hcGNvdW50KHBhZ2UpOworCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCUlOSVRfTElTVF9IRUFEKCZwYWdlLT5scnUpOworCX0KKwlnb3RvIG91dDsKKworb3V0X3JlbW92ZToKKwlfX3JlbW92ZV9zaGFyZWRfbWVtb3J5KHNlZyk7CitvdXRfZnJlZToKKwlrZnJlZShzZWcpOworb3V0OgorCW11dGV4X3VubG9jaygmdm1lbV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG1hcCB3aG9sZSBwaHlzaWNhbCBtZW1vcnkgdG8gdmlydHVhbCBtZW1vcnkgKGlkZW50aXR5IG1hcHBpbmcpCisgKi8KK3ZvaWQgX19pbml0IHZtZW1fbWFwX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1hcF9zaXplOworCWludCBpOworCisJbWFwX3NpemUgPSBBTElHTihtYXhfbG93X3BmbiwgTUFYX09SREVSX05SX1BBR0VTKSAqIHNpemVvZihzdHJ1Y3QgcGFnZSk7CisJdm1hbGxvY19lbmQgPSBQRk5fQUxJR04oVk1BTExPQ19FTkRfSU5JVCkgLSBQRk5fQUxJR04obWFwX3NpemUpOworCXZtZW1fbWFwID0gKHN0cnVjdCBwYWdlICopIHZtYWxsb2NfZW5kOworCU5PREVfREFUQSgwKS0+bm9kZV9tZW1fbWFwID0gdm1lbV9tYXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUyAmJiBtZW1vcnlfY2h1bmtbaV0uc2l6ZSA+IDA7IGkrKykKKwkJdm1lbV9hZGRfbWVtKG1lbW9yeV9jaHVua1tpXS5hZGRyLCBtZW1vcnlfY2h1bmtbaV0uc2l6ZSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IG1lbW9yeSBjaHVuayBhcnJheSB0byBhIG1lbW9yeSBzZWdtZW50IGxpc3Qgc28gdGhlcmUgaXMgYSBzaW5nbGUKKyAqIGxpc3QgdGhhdCBjb250YWlucyBib3RoIHIvdyBtZW1vcnkgYW5kIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHZtZW1fY29udmVydF9tZW1vcnlfY2h1bmsodm9pZCkKK3sKKwlzdHJ1Y3QgbWVtb3J5X3NlZ21lbnQgKnNlZzsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnZtZW1fbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBNRU1PUllfQ0hVTktTICYmIG1lbW9yeV9jaHVua1tpXS5zaXplID4gMDsgaSsrKSB7CisJCWlmICghbWVtb3J5X2NodW5rW2ldLnNpemUpCisJCQljb250aW51ZTsKKwkJc2VnID0ga3phbGxvYyhzaXplb2YoKnNlZyksIEdGUF9LRVJORUwpOworCQlpZiAoIXNlZykKKwkJCXBhbmljKCJPdXQgb2YgbWVtb3J5Li4uXG4iKTsKKwkJc2VnLT5zdGFydCA9IG1lbW9yeV9jaHVua1tpXS5hZGRyOworCQlzZWctPnNpemUgPSBtZW1vcnlfY2h1bmtbaV0uc2l6ZTsKKwkJaW5zZXJ0X21lbW9yeV9zZWdtZW50KHNlZyk7CisJfQorCW11dGV4X3VubG9jaygmdm1lbV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGwodm1lbV9jb252ZXJ0X21lbW9yeV9jaHVuayk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggNmE0NjFkNC4uM2FhM2I4OCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtNTEsNiArNTEsMjIgQEAKIGNvbmZpZyBBUkNIX01BWV9IQVZFX1BDX0ZEQwogCWJvb2wKIAorY29uZmlnIFNUQUNLVFJBQ0VfU1VQUE9SVAorCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIExPQ0tERVBfU1VQUE9SVAorCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogc291cmNlICJpbml0L0tjb25maWciCiAKIG1lbnUgIlN5c3RlbSB0eXBlIgpAQCAtMjE3LDcgKzIzMywyMSBAQAogCWJvb2wgIlNITUlOIgogCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3MDYKIAloZWxwCi0JICBTZWxlY3QgU0hNSU4gaWYgY29uZmlndXJlaW5nIGZvciB0aGUgU0hNSU4gYm9hcmQKKwkgIFNlbGVjdCBTSE1JTiBpZiBjb25maWd1cmluZyBmb3IgdGhlIFNITUlOIGJvYXJkLgorCitjb25maWcgU0hfNzIwNl9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTcyMDYiCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzIwNgorCWhlbHAKKwkgIFNlbGVjdCA3MjA2IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3MjA2CisJICBldmFsdWF0aW9uIGJvYXJkLgorCitjb25maWcgU0hfNzYxOV9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTc2MTkiCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzYxOQorCWhlbHAKKwkgIFNlbGVjdCA3NjE5IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NjE5CisJICBldmFsdWF0aW9uIGJvYXJkLgogCiBjb25maWcgU0hfVU5LTk9XTgogCWJvb2wgIkJhcmVDUFUiCkBAIC0yODAsMTIgKzMxMCwyMCBAQAogCiBtZW51ICJQcm9jZXNzb3IgZmVhdHVyZXMiCiAKLWNvbmZpZyBDUFVfTElUVExFX0VORElBTgotCWJvb2wgIkxpdHRsZSBFbmRpYW4iCitjaG9pY2UKKwlwcm9tcHQgIkVuZGlhbmVzcyBzZWxlY3Rpb24iIAorCWRlZmF1bHQgQ1BVX0xJVFRMRV9FTkRJQU4KIAloZWxwCiAJICBTb21lIFN1cGVySCBtYWNoaW5lcyBjYW4gYmUgY29uZmlndXJlZCBmb3IgZWl0aGVyIGxpdHRsZSBvciBiaWcKLQkgIGVuZGlhbiBieXRlIG9yZGVyLiBUaGVzZSBtb2RlcyByZXF1aXJlIGRpZmZlcmVudCBrZXJuZWxzLiBTYXkgWSBpZgotCSAgeW91ciBtYWNoaW5lIGlzIGxpdHRsZSBlbmRpYW4sIE4gaWYgaXQncyBhIGJpZyBlbmRpYW4gbWFjaGluZS4KKwkgIGVuZGlhbiBieXRlIG9yZGVyLiBUaGVzZSBtb2RlcyByZXF1aXJlIGRpZmZlcmVudCBrZXJuZWxzLgorCitjb25maWcgQ1BVX0xJVFRMRV9FTkRJQU4KKwlib29sICJMaXR0bGUgRW5kaWFuIgorCitjb25maWcgQ1BVX0JJR19FTkRJQU4KKwlib29sICJCaWcgRW5kaWFuIgorCitlbmRjaG9pY2UKIAogY29uZmlnIFNIX0ZQVQogCWJvb2wgIkZQVSBzdXBwb3J0IgpAQCAtMzQ1LDYgKzM4Myw5IEBACiBjb25maWcgQ1BVX0hBU19JTlRDMl9JUlEKIAlib29sCiAKK2NvbmZpZyBDUFVfSEFTX0lQUl9JUlEKKwlib29sCisKIGNvbmZpZyBDUFVfSEFTX1NSX1JCCiAJYm9vbCAiQ1BVIGhhcyBTUi5SQiIKIAlkZXBlbmRzIG9uIENQVV9TSDMgfHwgQ1BVX1NINApAQCAtMzU3LDYgKzM5OCw5IEBACiAJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zaC9yZWdpc3Rlci1iYW5rcy50eHQ+IGZvciBmdXJ0aGVyCiAJICBpbmZvcm1hdGlvbiBvbiBTUi5SQiBhbmQgcmVnaXN0ZXIgYmFua2luZyBpbiB0aGUga2VybmVsIGluIGdlbmVyYWwuCiAKK2NvbmZpZyBDUFVfSEFTX1BURUEKKwlib29sCisKIGVuZG1lbnUKIAogbWVudSAiVGltZXIgc3VwcG9ydCIKQEAgLTM2NCwxMCArNDA4LDI1IEBACiAKIGNvbmZpZyBTSF9UTVUKIAlib29sICJUTVUgdGltZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIENQVV9TSDMgfHwgQ1BVX1NINAogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBUTVUgYXMgdGhlIHN5c3RlbSB0aW1lci4KIAorY29uZmlnIFNIX0NNVAorCWJvb2wgIkNNVCB0aW1lciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ1BVX1NIMgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBDTVQgYXMgdGhlIHN5c3RlbSB0aW1lci4KKworY29uZmlnIFNIX01UVTIKKwlib29sICJNVFUyIHRpbWVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBDUFVfU0gyQQorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBNVFUyIGFzIHRoZSBzeXN0ZW0gdGltZXIuCisKIGVuZG1lbnUKIAogc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWciCkBAIC0zNzYsMTkgKzQzNSw1MiBAQAogCiBzb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnIgogCitjb25maWcgU0hfVElNRVJfSVJRCisJaW50CisJZGVmYXVsdCAiMjgiIGlmIENQVV9TVUJUWVBFX1NINzc4MAorCWRlZmF1bHQgIjg2IiBpZiBDUFVfU1VCVFlQRV9TSDc2MTkKKwlkZWZhdWx0ICIxNDAiIGlmIENQVV9TVUJUWVBFX1NINzIwNgorCWRlZmF1bHQgIjE2IgorCitjb25maWcgTk9fSURMRV9IWgorCWJvb2wgIkR5bmFtaWMgdGljayB0aW1lciIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBjb250aW51b3VzIHRpbWVyIHRpY2tzCisJICBhbmQgaGF2ZSB0aGVtIHByb2dyYW1tZWQgdG8gb2NjdXIgYXMgcmVxdWlyZWQuIFRoaXMgb3B0aW9uIHNhdmVzCisJICBwb3dlciBhcyB0aGUgc3lzdGVtIGNhbiByZW1haW4gaW4gaWRsZSBzdGF0ZSBmb3IgbG9uZ2VyLgorCisJICBCeSBkZWZhdWx0IGR5bmFtaWMgdGljayBpcyBkaXNhYmxlZCBkdXJpbmcgdGhlIGJvb3QsIGFuZCBjYW4gYmUKKwkgIG1hbnVhbGx5IGVuYWJsZWQgd2l0aDoKKworCSAgICBlY2hvIDEgPiAvc3lzL2RldmljZXMvc3lzdGVtL3RpbWVyL3RpbWVyMC9keW5fdGljaworCisJICBBbHRlcm5hdGl2ZWx5LCBpZiB5b3Ugd2FudCBkeW5hbWljIHRpY2sgYXV0b21hdGljYWxseSBlbmFibGVkCisJICBkdXJpbmcgYm9vdCwgcGFzcyAiZHludGljaz1lbmFibGUiIHZpYSB0aGUga2VybmVsIGNvbW1hbmQgc3RyaW5nLgorCisJICBQbGVhc2Ugbm90ZSB0aGF0IGR5bmFtaWMgdGljayBtYXkgYWZmZWN0IHRoZSBhY2N1cmFjeSBvZgorCSAgdGltZWtlZXBpbmcgb24gc29tZSBwbGF0Zm9ybXMgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKwogY29uZmlnIFNIX1BDTEtfRlJFUQogCWludCAiUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KSIKKwlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MzE4MCB8fCBDUFVfU1VCVFlQRV9TSDczNDMKKwlkZWZhdWx0ICIzMTI1MDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAiMzMzMzMzMzMiIGlmIENQVV9TVUJUWVBFX1NINzMwMCB8fCBDUFVfU1VCVFlQRV9TSDc3NzAgfHwgXAorCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3NzYwIHx8IENQVV9TVUJUWVBFX1NINzcwNSB8fCBcCisJCQkgICAgICBDUFVfU1VCVFlQRV9TSDcyMDYKIAlkZWZhdWx0ICI1MDAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzUwIHx8IENQVV9TVUJUWVBFX1NINzc4MAogCWRlZmF1bHQgIjYwMDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3NTEKLQlkZWZhdWx0ICIzMzMzMzMzMyIgaWYgQ1BVX1NVQlRZUEVfU0g3MzAwIHx8IENQVV9TVUJUWVBFX1NINzc3MCB8fCBcCi0JCQkgICAgICBDUFVfU1VCVFlQRV9TSDc3NjAgfHwgQ1BVX1NVQlRZUEVfU0g3NzA1Ci0JZGVmYXVsdCAiMjcwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzMxODAgfHwgQ1BVX1NVQlRZUEVfU0g3MzQzCiAJZGVmYXVsdCAiNjYwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINF8yMDIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBlcmlwaGVyYWwgY2xvY2sgZnJlcXVlbmN5LgogCSAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGRldGVybWluaW5nIHRoZSByZWZlcmVuY2UgY2xvY2sgdmFsdWUgb24KIAkgIHBsYXRmb3JtcyBsYWNraW5nIGFuIFJUQy4KIAorY29uZmlnIFNIX0NMS19NRAorCWludCAiQ1BVIE1vZGUgUGluIFNldHRpbmciCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc2MTkgfHwgQ1BVX1NVQlRZUEVfU0g3MjA2CisJaGVscAorCSAgTUQyIC0gTUQwIHBpbiBzZXR0aW5nLgorCiBtZW51ICJDUFUgRnJlcXVlbmN5IHNjYWxpbmciCiAKIHNvdXJjZSAiZHJpdmVycy9jcHVmcmVxL0tjb25maWciCkBAIC00MjEsNiArNTEzLDggQEAKIAkgIGJlaGF2aW9yIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IG5vcm1hbGx5IHRoZSBmbGFzaCBmcmVxdWVuY3kgaXMKIAkgIGEgaHlwZXJib2xpYyBmdW5jdGlvbiBvZiB0aGUgNS1taW51dGUgbG9hZCBhdmVyYWdlLgogCitzb3VyY2UgImFyY2gvc2gvZHJpdmVycy9LY29uZmlnIgorCiBlbmRtZW51CiAKIGNvbmZpZyBJU0FfRE1BX0FQSQpAQCAtNDg2LDE4ICs1ODAsNiBAQAogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLnByZWVtcHQiCiAKLWNvbmZpZyBDUFVfSEFTX1NSX1JCCi0JYm9vbCAiQ1BVIGhhcyBTUi5SQiIKLQlkZXBlbmRzIG9uIENQVV9TSDMgfHwgQ1BVX1NINAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgd2lsbCBlbmFibGUgdGhlIHVzZSBvZiBTUi5SQiByZWdpc3RlciBiYW5rIHVzYWdlLiBQcm9jZXNzb3JzCi0JICB0aGF0IGFyZSBsYWNraW5nIHRoaXMgYml0IG11c3QgaGF2ZSBhbm90aGVyIG1ldGhvZCBpbiBwbGFjZSBmb3IKLQkgIGFjY29tcGxpc2hpbmcgd2hhdCBpcyB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBiYW5rZWQgcmVnaXN0ZXJzLgotCi0JICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zaC9yZWdpc3Rlci1iYW5rcy50eHQ+IGZvciBmdXJ0aGVyCi0JICBpbmZvcm1hdGlvbiBvbiBTUi5SQiBhbmQgcmVnaXN0ZXIgYmFua2luZyBpbiB0aGUga2VybmVsIGluIGdlbmVyYWwuCi0KIGNvbmZpZyBOT0RFU19TSElGVAogCWludAogCWRlZmF1bHQgIjEiCmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcuZGVidWcgYi9hcmNoL3NoL0tjb25maWcuZGVidWcKaW5kZXggNDg0NzllMC4uODc5MDJlMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZwpAQCAtMSw1ICsxLDkgQEAKIG1lbnUgIktlcm5lbCBoYWNraW5nIgogCitjb25maWcgVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVAorCWJvb2wKKwlkZWZhdWx0IHkKKwogc291cmNlICJsaWIvS2NvbmZpZy5kZWJ1ZyIKIAogY29uZmlnIFNIX1NUQU5EQVJEX0JJT1MKQEAgLTE3LDcgKzIxLDE5IEBACiAKIGNvbmZpZyBFQVJMWV9TQ0lGX0NPTlNPTEUKIAlib29sICJVc2UgZWFybHkgU0NJRiBjb25zb2xlIgotCWRlcGVuZHMgb24gQ1BVX1NINCB8fCBDUFVfU0gyQSAmJiAhU0hfU1RBTkRBUkRfQklPUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBhbiBlYXJseSBjb25zb2xlIHVzaW5nIGEgZml4ZWQgU0NJRiBwb3J0LiBUaGlzIGNhbgorCSAgYmUgdXNlZCBieSBwbGF0Zm9ybXMgdGhhdCBhcmUgZWl0aGVyIG5vdCBydW5uaW5nIHRoZSBTSAorCSAgc3RhbmRhcmQgQklPUywgb3IgZG8gbm90IHdpc2ggdG8gdXNlIHRoZSBCSU9TIGNhbGxiYWNrcyBmb3IgdGhlCisJICBzZXJpYWwgSS9PLgorCitjb25maWcgRUFSTFlfU0NJRl9DT05TT0xFX1BPUlQKKwloZXggIlNDSUYgcG9ydCBmb3IgZWFybHkgY29uc29sZSIKKwlkZXBlbmRzIG9uIEVBUkxZX1NDSUZfQ09OU09MRQorCWRlZmF1bHQgIjB4ZmZlMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc4MAorCWRlZmF1bHQgIjB4ZmZmZTk4MDAiIGlmIENQVV9TVUJUWVBFX1NINzIwNgorCWRlZmF1bHQgIjB4Zjg0MjAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzYxOQorCWRlZmF1bHQgIjB4ZmZlODAwMDAiIGlmIENQVV9TSDQKIAogY29uZmlnIEVBUkxZX1BSSU5USwogCWJvb2wgIkVhcmx5IHByaW50ayBzdXBwb3J0IgpAQCAtMzAsNiArNDYsMTEgQEAKIAkgIHdoZW4gdGhlIGtlcm5lbCBtYXkgY3Jhc2ggb3IgaGFuZyBiZWZvcmUgdGhlIHNlcmlhbCBjb25zb2xlIGlzCiAJICBpbml0aWFsaXNlZC4gSWYgdW5zdXJlLCBzYXkgTi4KIAorCSAgT24gZGV2aWNlcyB0aGF0IGFyZSBydW5uaW5nIFNILUlQTCBhbmQgd2FudCB0byBrZWVwIHRoZSBwb3J0CisJICBpbml0aWFsaXphdGlvbiBjb25zaXN0ZW50IHdoaWxlIG5vdCB1c2luZyB0aGUgQklPUyBjYWxsYmFja3MsCisJICBzZWxlY3QgYm90aCB0aGUgRUFSTFlfU0NJRl9DT05TT0xFIGFuZCBTSF9TVEFOREFSRF9CSU9TLCB1c2luZworCSAgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRvZ2dsZSBiYWNrIGFuZCBmb3J0aC4KKwogY29uZmlnIERFQlVHX1NUQUNLT1ZFUkZMT1cKIAlib29sICJDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3dzIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCmRpZmYgLS1naXQgYS9hcmNoL3NoL01ha2VmaWxlIGIvYXJjaC9zaC9NYWtlZmlsZQppbmRleCAyNmQ2MmZmLi5jMWRiZWYyIDEwMDY0NAotLS0gYS9hcmNoL3NoL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvTWFrZWZpbGUKQEAgLTEzLDEwICsxMyw2IEBACiAjIGZvciAiYXJjaGNsZWFuIiBhbmQgImFyY2hkZXAiIGZvciBjbGVhbmluZyB1cCBhbmQgbWFraW5nIGRlcGVuZGVuY2llcyBmb3IKICMgdGhpcyBhcmNoaXRlY3R1cmUKICMKLQotY2ZsYWdzLXkJCQkJOj0gLW1iCi1jZmxhZ3MtJChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCTo9IC1tbAotCiBpc2EteQkJCQkJOj0gYW55CiBpc2EtJChDT05GSUdfU0hfRFNQKQkJCTo9IHNoCiBpc2EtJChDT05GSUdfQ1BVX1NIMikJCQk6PSBzaDIKQEAgLTM4LDEzICszNCwxNiBAQAogZW5kaWYKIGVuZGlmCiAKLWNmbGFncy15CSs9ICQoY2FsbCBhcy1vcHRpb24sLVdhJChjb21tYSktaXNhPSQoaXNhLXkpLCkKLQotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDIpCQkrPSAtbTIKLWNmbGFncy0kKENPTkZJR19DUFVfU0gzKQkJKz0gLW0zCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NINCkJCSs9IC1tNCBcCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NIMikJCTo9IC1tMgorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAtbTMKK2NmbGFncy0kKENPTkZJR19DUFVfU0g0KQkJOj0gLW00IFwKIAkkKGNhbGwgY2Mtb3B0aW9uLC1tbm8taW1wbGljaXQtZnAsLW00LW5vZnB1KQotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDRBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTRhLW5vZnB1LCkKK2NmbGFncy0kKENPTkZJR19DUFVfU0g0QSkJCTo9IC1tNGEgJChjYWxsIGNjLW9wdGlvbiwtbTRhLW5vZnB1LCkKKworY2ZsYWdzLSQoQ09ORklHX0NQVV9CSUdfRU5ESUFOKQkJKz0gLW1iCitjZmxhZ3MtJChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCSs9IC1tbAorCitjZmxhZ3MteQkrPSAkKGNhbGwgYXMtb3B0aW9uLC1XYSQoY29tbWEpLWlzYT0kKGlzYS15KSwpIC1mZnJlZXN0YW5kaW5nCiAKIGNmbGFncy0kKENPTkZJR19TSF9EU1ApCQkJKz0gLVdhLC1kc3AKIGNmbGFncy0kKENPTkZJR19TSF9LR0RCKQkJKz0gLWcKQEAgLTU5LDcgKzU4LDkgQEAKICMgbmV2ZXIgYmUgdXNlZCBieSBhbnlvbmUuIFVzZSBhIGJvYXJkLXNwZWNpZmljIGRlZmNvbmZpZyB0aGF0IGhhcyBhCiAjIHJlYXNvbmFibGUgY2hhbmNlIG9mIGJlaW5nIGN1cnJlbnQgaW5zdGVhZC4KICMKLUtCVUlMRF9ERUZDT05GSUcgOj0gcnRzNzc1MXIyZF9kZWZjb25maWcKK0tCVUlMRF9ERUZDT05GSUcgOj0gcjc3ODBycF9kZWZjb25maWcKKworS0JVSUxEX0lNQUdFCTo9IGFyY2gvc2gvYm9vdC96SW1hZ2UKIAogIwogIyBDaG9vc2luZyBpbmNvbXBhdGlibGUgbWFjaGluZXMgZHVyaW5ncyBjb25maWd1cmF0aW9uIHdpbGwgcmVzdWx0IGluCkBAIC0xMDksNiArMTEwLDggQEAKIG1hY2hkaXItJChDT05GSUdfU0hfTEFORElTSykJCQk6PSBsYW5kaXNrCiBtYWNoZGlyLSQoQ09ORklHX1NIX1RJVEFOKQkJCTo9IHRpdGFuCiBtYWNoZGlyLSQoQ09ORklHX1NIX1NITUlOKQkJCTo9IHNobWluCittYWNoZGlyLSQoQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MjA2CittYWNoZGlyLSQoQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83NjE5CiBtYWNoZGlyLSQoQ09ORklHX1NIX1VOS05PV04pCQkJOj0gdW5rbm93bgogCiBpbmNkaXIteQkJCTo9ICQobm90ZGlyICQobWFjaGRpci15KSkKQEAgLTEyNCw2ICsxMjcsNyBAQAogY29yZS0kKENPTkZJR19WT1lBR0VSR1gpCSs9IGFyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC8KIAogY3B1aW5jZGlyLSQoQ09ORklHX0NQVV9TSDIpCTo9IGNwdS1zaDIKK2NwdWluY2Rpci0kKENPTkZJR19DUFVfU0gyQSkJOj0gY3B1LXNoMmEKIGNwdWluY2Rpci0kKENPTkZJR19DUFVfU0gzKQk6PSBjcHUtc2gzCiBjcHVpbmNkaXItJChDT05GSUdfQ1BVX1NINCkJOj0gY3B1LXNoNAogCkBAIC0xNzUsNyArMTc5LDcgQEAKIAogYWxsOiB6SW1hZ2UKIAotekltYWdlOiB2bWxpbnV4Cit6SW1hZ2UgdUltYWdlIHVJbWFnZS5zcmVjIHZtbGludXguc3JlYzogdm1saW51eAogCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAogCiBjb21wcmVzc2VkOiB6SW1hZ2UKQEAgLTE4Niw1ICsxOTAsOCBAQAogQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmgKIAogZGVmaW5lIGFyY2hoZWxwCi0JQGVjaG8gJyAgekltYWdlIAkgICAgICAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gvc2gvYm9vdC96SW1hZ2UpJworCUBlY2hvICcqIHpJbWFnZSAJICAgICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlJworCUBlY2hvICcgIHZtbGludXguc3JlYwkgICAgICAgICAgIC0gQ3JlYXRlIGFuIEVMRiBTLXJlY29yZCcKKwlAZWNobyAnICB1SW1hZ2UgIAkgICAgICAgICAgIC0gQ3JlYXRlIGEgYm9vdGFibGUgaW1hZ2UgZm9yIFUtQm9vdCcKKwlAZWNobyAnICB1SW1hZ2Uuc3JlYyAgCSAgICAgICAgICAgLSBDcmVhdGUgYW4gUy1yZWNvcmQgZm9yIFUtQm9vdCcKIGVuZGVmCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDZ4eF9hcG0uYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNnh4X2FwbS5jCmluZGV4IDIxOTE3OTEuLmQxNDZjZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNnh4X2FwbS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNnh4X2FwbS5jCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2FwbS5oPgogI2luY2x1ZGUgPGFzbS9hZGMuaD4KLSNpbmNsdWRlIDxhc20vaHA2eHgvaHA2eHguaD4KKyNpbmNsdWRlIDxhc20vaHA2eHguaD4KIAogI2RlZmluZSBTSDc3MDlfUEdEUgkJCTB4YTQwMDAxMmMKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvcG0uYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3BtLmMKaW5kZXggODNkMzI3Mi4uZDE5NDc3MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvcG0uYworKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9wbS5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KICNpbmNsdWRlIDxhc20vcG0uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKaW5kZXggMmQzYTViNC4uYjVhOTY2NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9zZXR1cC5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KIAogI2RlZmluZQlTQ1BDUgkweGE0MDAwMTE2CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9pcnEuYwppbmRleCA4ZjJlMWM2Li4zZWJhNmQwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svaXJxLmMKQEAgLTE2LDggKzE2LDggQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vbGFuZGlzay9pb2RhdGFfbGFuZGlzay5oPgogCiBzdGF0aWMgdm9pZCBlbmFibGVfbGFuZGlza19pcnEodW5zaWduZWQgaW50IGlycSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lvLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lvLmMKaW5kZXggNTFmM2Y2NS4uYmI5YWEwZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pby5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaW8uYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oczc3NTFydm9pcC9oczc3NTFydm9pcC5oPgorI2luY2x1ZGUgPGFzbS9oczc3NTFydm9pcC5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAogZXh0ZXJuIHZvaWQgKmFyZWE2X2lvOF9iYXNlOwkvKiBBcmVhIDYgOGJpdCBJL08gQmFzZSBhZGRyZXNzICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pcnEuYwppbmRleCBjNjE3YjE4Li45NDNmOTNhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaXJxLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmg+CisjaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwLmg+CiAKIHN0YXRpYyBpbnQgbWFza19wb3NbXSA9IHs4LCA5LCAxMCwgMTEsIDEyLCAxMywgMCwgMSwgMiwgMywgNCwgNSwgNiwgN307CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYwppbmRleCAwNDE0YzE1Li5mN2QwZTMwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jCkBAIC0xMCwyMiArMTAsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGFzbS9oczc3NTFydm9pcC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oczc3NTFydm9pcC9oczc3NTFydm9pcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL3J0Yy5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBoczc3NTAxcnZvaXBfaXByX21hcFtdID0geworI2lmIGRlZmluZWQoQ09ORklHX0hTNzc1MVJWT0lQX0NPREVDKQorCXsgRE1URTBfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEUxX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCisjZW5kaWYKK307CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBoczc3NTFydm9pcF9pbml0X2lycSh2b2lkKQogewotI2lmIGRlZmluZWQoQ09ORklHX0hTNzc1MVJWT0lQX0NPREVDKQotCW1ha2VfaXByX2lycShETVRFMF9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUxX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZKTsKLSNlbmRpZgorCW1ha2VfaXByX2lycShoczc3NTAxcnZvaXBfaXByX21hcCwgQVJSQVlfU0laRShoczc3NTAxcnZvaXBfaXByX21hcCkpOwogCiAJaW5pdF9oczc3NTFydm9pcF9JUlEoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9NYWtlZmlsZQppbmRleCBmMTc3NmQwLi41NzRiMDMxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL01ha2VmaWxlCkBAIC0zLDQgKzMsNiBAQAogIwogCiBvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi1vYmotJChDT05GSUdfSEVBUlRCRUFUKQkrPSBsZWQubworCitvYmotJChDT05GSUdfSEVBUlRCRUFUKQkJKz0gbGVkLm8KK29iai0kKENPTkZJR19QVVNIX1NXSVRDSCkJKz0gcHN3Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9pby5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKaW5kZXggZGI5MmQ2ZS4uMzExY2NjYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9yNzc4MHJwL3I3NzgwcnAuaD4KKyNpbmNsdWRlIDxhc20vcjc3ODBycC5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lycS5jCmluZGV4IGI1NDQ3NzIuLmNjMzgxZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvaXJxLmMKQEAgLTEwLDcgKzEwLDkgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9yNzc4MHJwLmg+CiAKICNpZmRlZiBDT05GSUdfU0hfUjc3ODBNUAogc3RhdGljIGludCBtYXNrX3Bvc1tdID0gezEyLCAxMSwgOSwgMTQsIDE1LCA4LCAxMywgNiwgNSwgNCwgMywgMiwgMCwgMCwgMSwgMH07CkBAIC0zMiw3ICszNCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcjc3ODBycF9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9ICJyNzc4MHJwIiwKKwkubmFtZQkJPSAiUjc3ODBSUCIsCiAJLm1hc2sJCT0gZGlzYWJsZV9yNzc4MHJwX2lycSwKIAkudW5tYXNrCQk9IGVuYWJsZV9yNzc4MHJwX2lycSwKIAkubWFza19hY2sJPSBkaXNhYmxlX3I3NzgwcnBfaXJxLApAQCAtNDcsOCArNDksOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKIAkJZGlzYWJsZV9pcnFfbm9zeW5jKGkpOwotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnI3NzgwcnBfaXJxX2NoaXAsCi0JCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaSwgJnI3NzgwcnBfaXJxX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwogCQllbmFibGVfcjc3ODBycF9pcnEoaSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3Bzdy5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3Bzdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDRkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvcHN3LmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvcHN3LmMKKyAqCisgKiBwdXNoIHN3aXRjaCBzdXBwb3J0IGZvciBSREJSUC0xL1JEQlJFVlJQLTEgZGVidWcgYm9hcmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvcjc3ODBycC5oPgorI2luY2x1ZGUgPGFzbS9wdXNoLXN3aXRjaC5oPgorCitzdGF0aWMgaXJxcmV0dXJuX3QgcHN3X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gYXJnOworCXN0cnVjdCBwdXNoX3N3aXRjaCAqcHN3ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHB1c2hfc3dpdGNoX3BsYXRmb3JtX2luZm8gKnBzd19pbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdW5zaWduZWQgaW50IGwsIG1hc2s7CisJaW50IHJldCA9IDA7CisKKwlsID0gY3RybF9pbncoUEFfREJTVyk7CisKKwkvKiBOb3RoaW5nIHRvIGRvIGlmIHRoZXJlJ3Mgbm8gc3RhdGUgY2hhbmdlICovCisJaWYgKHBzdy0+c3RhdGUpIHsKKwkJcmV0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJbWFzayA9IGwgJiAweDcwOworCS8qIEZpZ3VyZSBvdXQgd2hvIHJhaXNlZCBpdCAqLworCWlmIChtYXNrICYgKDEgPDwgcHN3X2luZm8tPmJpdCkpIHsKKwkJcHN3LT5zdGF0ZSA9ICEhKG1hc2sgJiAoMSA8PCBwc3dfaW5mby0+Yml0KSk7CisJCWlmIChwc3ctPnN0YXRlKQkvKiBkZWJvdW5jZSAqLworCQkJbW9kX3RpbWVyKCZwc3ctPmRlYm91bmNlLCBqaWZmaWVzICsgNTApOworCisJCXJldCA9IDE7CisJfQorCitvdXQ6CisJLyogQ2xlYXIgdGhlIHN3aXRjaCBJUlFzICovCisJbCB8PSAoMHg3IDw8IDEyKTsKKwljdHJsX291dHcobCwgUEFfREJTVyk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChyZXQpOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBzd19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IElSUV9QU1csCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHB1c2hfc3dpdGNoX3BsYXRmb3JtX2luZm8gczJfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZQkJPSAiczIiLAorCS5iaXQJCT0gNiwKKwkuaXJxX2ZsYWdzCT0gSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKKwkJCSAgSVJRRl9TSEFSRUQsCisJLmlycV9oYW5kbGVyCT0gcHN3X2lycV9oYW5kbGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczJfc3dpdGNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAicHVzaC1zd2l0Y2giLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwc3dfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBwc3dfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzMl9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHB1c2hfc3dpdGNoX3BsYXRmb3JtX2luZm8gczNfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZQkJPSAiczMiLAorCS5iaXQJCT0gNSwKKwkuaXJxX2ZsYWdzCT0gSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKKwkJCSAgSVJRRl9TSEFSRUQsCisJLmlycV9oYW5kbGVyCT0gcHN3X2lycV9oYW5kbGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNfc3dpdGNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAicHVzaC1zd2l0Y2giLAorCS5pZAkJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwc3dfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBwc3dfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzM19wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHB1c2hfc3dpdGNoX3BsYXRmb3JtX2luZm8gczRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZQkJPSAiczQiLAorCS5iaXQJCT0gNCwKKwkuaXJxX2ZsYWdzCT0gSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKKwkJCSAgSVJRRl9TSEFSRUQsCisJLmlycV9oYW5kbGVyCT0gcHN3X2lycV9oYW5kbGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczRfc3dpdGNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAicHVzaC1zd2l0Y2giLAorCS5pZAkJPSAyLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwc3dfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBwc3dfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzNF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcHN3X2RldmljZXNbXSA9IHsKKwkmczJfc3dpdGNoX2RldmljZSwgJnMzX3N3aXRjaF9kZXZpY2UsICZzNF9zd2l0Y2hfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHN3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMocHN3X2RldmljZXMsIEFSUkFZX1NJWkUocHN3X2RldmljZXMpKTsKK30KK21vZHVsZV9pbml0KHBzd19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKaW5kZXggYjk0MWFhMC4uOWY4OWM4ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vcjc3ODBycC9yNzc4MHJwLmg+CisjaW5jbHVkZSA8YXNtL3I3NzgwcnAuaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtNDQsOCArNDQsMzcgQEAKIAkucmVzb3VyY2UJPSBtNjY1OTZfdXNiX2hvc3RfcmVzb3VyY2VzLAogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjZl9pZGVfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweDFmMCwKKwkJLmVuZAk9IDB4MWYwICsgOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMHgxZjAgKyAweDIwNiwKKwkJLmVuZAk9IDB4MWYwICsgOCArIDB4MjA2ICsgOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKKwl9LAorCVsyXSA9IHsKKyNpZmRlZiBDT05GSUdfU0hfUjc3ODBNUAorCQkuc3RhcnQJPSAxLAorI2Vsc2UKKwkJLnN0YXJ0CT0gNCwKKyNlbmRpZgorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2ZfaWRlX2RldmljZSAgPSB7CisJLm5hbWUJCT0gInBhdGFfcGxhdGZvcm0iLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY2ZfaWRlX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY2ZfaWRlX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpyNzc4MHJwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZtNjY1OTZfdXNiX2hvc3RfZGV2aWNlLAorCSZjZl9pZGVfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcjc3ODBycF9kZXZpY2VzX3NldHVwKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCmluZGV4IDEzNWFhMGIuLmYyNTA3YTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCkBAIC0xMSw4ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC9ydHM3NzUxcjJkLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pcnEuYwppbmRleCBjOTE1ZTdhLi5jYjBlYjIwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jCkBAIC04LDEyICs4LDEwIEBACiAgKiBNb2RpZmllZCBmb3IgUlRTNzc1MVIyRCBieQogICogQXRvbSBDcmVhdGUgRW5naW5lZXJpbmcgQ28uLCBMdGQuIDIwMDIuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX1JUUzc3NTFSMkRfUkVWMTEpCiBzdGF0aWMgaW50IG1hc2tfcG9zW10gPSB7MTEsIDksIDgsIDEyLCAxMCwgNiwgNSwgNCwgNywgMTQsIDEzLCAwLCAwLCAwLCAwfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYwppbmRleCBhN2NlNjZjLi41MDlmNTQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvbGVkLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2xlZC5jCkBAIC04LDEzICs4LDkgQEAKICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgUmVuZXNhcyBUZWNobm9sb2d5IFNhbGVzIFJUUzc3NTFSMkQgc3BlY2lmaWMgTEVEIGNvZGUuCiAgKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkL3J0czc3NTFyMmQuaD4KLQotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC5oPgogCiAvKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWdlci9TdW4gcGF0dGVybiAqLwogdm9pZCBoZWFydGJlYXRfcnRzNzc1MXIyZCh2b2lkKQpAQCAtNDYsMTAgKzQyLDMgQEAKIAllbHNlCiAJCWJpdC0tOwogfQotI2VuZGlmIC8qIENPTkZJR19IRUFSVEJFQVQgKi8KLQotdm9pZCBydHM3NzUxcjJkX2xlZCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKLXsKLQljdHJsX291dHcodmFsdWUsIFBBX09VVFBPUlQpOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCmluZGV4IDIwNTk3YTYuLjVjMDQyZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCkBAIC0xMiw5ICsxMiw5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcnRzNzc1MXIyZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS92b3lhZ2VyZ3guaD4KIAogZXh0ZXJuIHZvaWQgaGVhcnRiZWF0X3J0czc3NTFyMmQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYwppbmRleCBlNTdlN2FmLi4xODA4MTBiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKQEAgLTEzLDYgKzEzLDUxIEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzcxMHZvaXBnd19pcHJfbWFwW10gPSB7CisJeyBUSU1FUjJfSVJRLCBUSU1FUjJfSVBSX0FERFIsIFRJTUVSMl9JUFJfUE9TLCBUSU1FUjJfUFJJT1JJVFkgfSwKKwl7IFdEVF9JUlEsIFdEVF9JUFJfQUREUiwgV0RUX0lQUl9QT1MsIFdEVF9QUklPUklUWSB9LAorCisJLyogU0NJRjAgKi8KKwl7IFNDSUYwX0VSSV9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLCBTQ0lGMF9QUklPUklUWSB9LAorCXsgU0NJRjBfUlhJX0lSUSwgU0NJRjBfSVBSX0FERFIsIFNDSUYwX0lQUl9QT1MsIFNDSUYwX1BSSU9SSVRZIH0sCisJeyBTQ0lGMF9CUklfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywgU0NJRjBfUFJJT1JJVFkgfSwKKwl7IFNDSUYwX1RYSV9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLCBTQ0lGMF9QUklPUklUWSB9LAorCisJLyogRE1BQy0xICovCisJeyBETVRFMF9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCXsgRE1URTFfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEUyX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCisJeyBETVRFM19JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCisJLyogRE1BQy0yICovCisJeyBETVRFNF9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSB9LAorCXsgRE1URTRfSVJRLCBETUEyX0lQUl9BRERSLCBETUEyX0lQUl9QT1MsIERNQTJfUFJJT1JJVFkgfSwKKworCS8qIElQU0VDICovCisJeyBJUFNFQ19JUlEsIElQU0VDX0lQUl9BRERSLCBJUFNFQ19JUFJfUE9TLCBJUFNFQ19QUklPUklUWSB9LAorCisJLyogRURNQUMgKi8KKwl7IEVETUFDMF9JUlEsIEVETUFDMF9JUFJfQUREUiwgRURNQUMwX0lQUl9QT1MsIEVETUFDMF9QUklPUklUWSB9LAorCXsgRURNQUMxX0lSUSwgRURNQUMxX0lQUl9BRERSLCBFRE1BQzFfSVBSX1BPUywgRURNQUMxX1BSSU9SSVRZIH0sCisJeyBFRE1BQzJfSVJRLCBFRE1BQzJfSVBSX0FERFIsIEVETUFDMl9JUFJfUE9TLCBFRE1BQzJfUFJJT1JJVFkgfSwKKworCS8qIFNJT0YwICovCisJeyBTSU9GMF9FUklfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKKwl7IFNJT0YwX1RYSV9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSB9LAorCXsgU0lPRjBfUlhJX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZIH0sCisJeyBTSU9GMF9DQ0lfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKKworCS8qIFNJT0YxICovCisJeyBTSU9GMV9FUklfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywgU0lPRjFfUFJJT1JJVFkgfSwKKwl7IFNJT0YxX1RYSV9JUlEsIFNJT0YxX0lQUl9BRERSLCBTSU9GMV9JUFJfUE9TLCBTSU9GMV9QUklPUklUWSB9LAorCXsgU0lPRjFfUlhJX0lSUSwgU0lPRjFfSVBSX0FERFIsIFNJT0YxX0lQUl9QT1MsIFNJT0YxX1BSSU9SSVRZIH0sCisJeyBTSU9GMV9DQ0lfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywgU0lPRjFfUFJJT1JJVFkgfSwKKworCS8qIFNMSUMgSVJRJ3MgKi8KKwl7IElSUTFfSVJRLCBJUlExX0lQUl9BRERSLCBJUlExX0lQUl9QT1MsIElSUTFfUFJJT1JJVFkgfSwKKwl7IElSUTJfSVJRLCBJUlEyX0lQUl9BRERSLCBJUlEyX0lQUl9QT1MsIElSUTJfUFJJT1JJVFkgfSwKK307CisKIC8qCiAgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCiAgKi8KQEAgLTM3LDY1ICs4Miw3IEBACiAJICovCiAJY3RybF9vdXR3KDB4MmFhLCBJTlRDX0lDUjEpOwogCi0JLyogTm93IG1ha2UgSVBSIGludGVycnVwdHMgKi8KLQltYWtlX2lwcl9pcnEoVElNRVIyX0lSUSwgVElNRVIyX0lQUl9BRERSLAotCQkJVElNRVIyX0lQUl9QT1MsIFRJTUVSMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFdEVF9JUlEsIFdEVF9JUFJfQUREUiwgV0RUX0lQUl9QT1MsIFdEVF9QUklPUklUWSk7Ci0KLQkvKiBTQ0lGMCAqLwotCW1ha2VfaXByX2lycShTQ0lGMF9FUklfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywKLQkJCVNDSUYwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJRjBfUlhJX0lSUSwgU0NJRjBfSVBSX0FERFIsIFNDSUYwX0lQUl9QT1MsCi0JCQlTQ0lGMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSUYwX0JSSV9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLAotCQkJU0NJRjBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lGMF9UWElfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywKLQkJCVNDSUYwX1BSSU9SSVRZKTsKLQotCS8qIERNQUMtMSAqLwotCW1ha2VfaXByX2lycShETVRFMF9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUxX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTJfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFM19JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7Ci0KLQkvKiBETUFDLTIgKi8KLQltYWtlX2lwcl9pcnEoRE1URTRfSVJRLCBETUEyX0lQUl9BRERSLCBETUEyX0lQUl9QT1MsIERNQTJfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFNF9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSk7Ci0KLQkvKiBJUFNFQyAqLwotCW1ha2VfaXByX2lycShJUFNFQ19JUlEsIElQU0VDX0lQUl9BRERSLCBJUFNFQ19JUFJfUE9TLCBJUFNFQ19QUklPUklUWSk7Ci0KLQkvKiBFRE1BQyAqLwotCW1ha2VfaXByX2lycShFRE1BQzBfSVJRLCBFRE1BQzBfSVBSX0FERFIsIEVETUFDMF9JUFJfUE9TLAotCQkJRURNQUMwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRURNQUMxX0lSUSwgRURNQUMxX0lQUl9BRERSLCBFRE1BQzFfSVBSX1BPUywKLQkJCUVETUFDMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKEVETUFDMl9JUlEsIEVETUFDMl9JUFJfQUREUiwgRURNQUMyX0lQUl9QT1MsCi0JCQlFRE1BQzJfUFJJT1JJVFkpOwotCi0JLyogU0lPRjAgKi8KLQltYWtlX2lwcl9pcnEoU0lPRjBfRVJJX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsCi0JCQlTSU9GMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNJT0YwX1RYSV9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLAotCQkJU0lPRjBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTSU9GMF9SWElfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywKLQkJCVNJT0YwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0lPRjBfQ0NJX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsCi0JCQlTSU9GMF9QUklPUklUWSk7Ci0KLQkvKiBTSU9GMSAqLwotCW1ha2VfaXByX2lycShTSU9GMV9FUklfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywKLQkJCVNJT0YxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0lPRjFfVFhJX0lSUSwgU0lPRjFfSVBSX0FERFIsIFNJT0YxX0lQUl9QT1MsCi0JCQlTSU9GMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNJT0YxX1JYSV9JUlEsIFNJT0YxX0lQUl9BRERSLCBTSU9GMV9JUFJfUE9TLAotCQkJU0lPRjFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTSU9GMV9DQ0lfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywKLQkJCVNJT0YxX1BSSU9SSVRZKTsKLQotCS8qIFNMSUMgSVJRJ3MgKi8KLQltYWtlX2lwcl9pcnEoSVJRMV9JUlEsIElSUTFfSVBSX0FERFIsIElSUTFfSVBSX1BPUywgSVJRMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSUTJfSVJRLCBJUlEyX0lQUl9BRERSLCBJUlEyX0lQUl9QT1MsIElSUTJfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShzaDc3MTB2b2lwZ3dfaXByX21hcCwgQVJSQVlfU0laRShzaDc3MTB2b2lwZ3dfaXByX21hcCkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5NTBmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIDcyMDYgU29sdXRpb25FbmdpbmUgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAorIworCitvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCitvYmotJChDT05GSUdfSEVBUlRCRUFUKSArPSBsZWQubworCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L2lvLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NzI3MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvaW8uYwpAQCAtMCwwICsxLDEyMyBAQAorLyogJElkOiBpby5jLHYgMS41IDIwMDQvMDIvMjIgMjM6MDg6NDMga2tvamltYSBFeHAgJAorICoKKyAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvaW8uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBZb3NoaW5vcmkgU2F0bworICoKKyAqIEkvTyByb3V0aW5lIGZvciBIaXRhY2hpIDcyMDYgU29sdXRpb25FbmdpbmUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZTcyMDYuaD4KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodm9pZCkKK3sKKwljdHJsX2ludygweDIwMDAwMDAwKTsgIC8qIFAyIFJPTSBBcmVhICovCit9CisKKy8qIE1TNzc1MCByZXF1aXJlcyBzcGVjaWFsIHZlcnNpb25zIG9mIGluKiwgb3V0KiByb3V0aW5lcywgc2luY2UKKyAgIFBDLWxpa2UgaW8gcG9ydHMgYXJlIGxvY2F0ZWQgYXQgdXBwZXIgaGFsZiBieXRlIG9mIDE2LWJpdCB3b3JkIHdoaWNoCisgICBjYW4gYmUgYWNjZXNzZWQgb25seSB3aXRoIDE2LWJpdCB3aWRlLiAgKi8KKworc3RhdGljIGlubGluZSB2b2xhdGlsZSBfX3UxNiAqCitwb3J0MmFkcih1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwlpZiAocG9ydCA+PSAweDIwMDApCisJCXJldHVybiAodm9sYXRpbGUgX191MTYgKikgKFBBX01SU0hQQyArIChwb3J0IC0gMHgyMDAwKSk7CisJZWxzZSBpZiAocG9ydCA+PSAweDMwMCB8fCBwb3J0IDwgMHgzMTApCisJCXJldHVybiAodm9sYXRpbGUgX191MTYgKikgKFBBX1NNU0MgKyAocG9ydCAtIDB4MzAwKSk7Cit9CisKK3Vuc2lnbmVkIGNoYXIgc2U3MjA2X2luYih1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJcmV0dXJuICgqcG9ydDJhZHIocG9ydCkpJjB4ZmY7IAorfQorCit1bnNpZ25lZCBjaGFyIHNlNzIwNl9pbmJfcCh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJdW5zaWduZWQgbG9uZyB2OworCisJdiA9ICgqcG9ydDJhZHIocG9ydCkpJjB4ZmY7IAorCWRlbGF5KCk7CisJcmV0dXJuIHY7Cit9CisKK3Vuc2lnbmVkIHNob3J0IHNlNzIwNl9pbncodW5zaWduZWQgbG9uZyBwb3J0KQoreworCXJldHVybiAqcG9ydDJhZHIocG9ydCk7OworfQorCit1bnNpZ25lZCBpbnQgc2U3MjA2X2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJbWF5YmViYWRpbyhwb3J0KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzZTcyMDZfb3V0Yih1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJKihwb3J0MmFkcihwb3J0KSkgPSB2YWx1ZTsKK30KKwordm9pZCBzZTcyMDZfb3V0Yl9wKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwkqKHBvcnQyYWRyKHBvcnQpKSA9IHZhbHVlOworCWRlbGF5KCk7Cit9CisKK3ZvaWQgc2U3MjA2X291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwkqcG9ydDJhZHIocG9ydCkgPSB2YWx1ZTsKK30KKwordm9pZCBzZTcyMDZfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwltYXliZWJhZGlvKHBvcnQpOworfQorCit2b2lkIHNlNzIwNl9pbnNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl2b2xhdGlsZSBfX3UxNiAqcCA9IHBvcnQyYWRyKHBvcnQpOworCV9fdTggKmFwID0gYWRkcjsKKworCXdoaWxlIChjb3VudC0tKQorCQkqYXArKyA9ICpwOworfQorCit2b2lkIHNlNzIwNl9pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl2b2xhdGlsZSBfX3UxNiAqcCA9IHBvcnQyYWRyKHBvcnQpOworCV9fdTE2ICphcCA9IGFkZHI7CisJd2hpbGUgKGNvdW50LS0pCisJCSphcCsrID0gKnA7Cit9CisKK3ZvaWQgc2U3MjA2X2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCW1heWJlYmFkaW8ocG9ydCk7Cit9CisKK3ZvaWQgc2U3MjA2X291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl2b2xhdGlsZSBfX3UxNiAqcCA9IHBvcnQyYWRyKHBvcnQpOworCWNvbnN0IF9fdTggKmFwID0gYWRkcjsKKworCXdoaWxlIChjb3VudC0tKQorCQkqcCA9ICphcCsrOworfQorCit2b2lkIHNlNzIwNl9vdXRzdyh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJdm9sYXRpbGUgX191MTYgKnAgPSBwb3J0MmFkcihwb3J0KTsKKwljb25zdCBfX3UxNiAqYXAgPSBhZGRyOworCXdoaWxlIChjb3VudC0tKQorCQkqcCA9ICphcCsrOworfQorCit2b2lkIHNlNzIwNl9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJbWF5YmViYWRpbyhwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZGE4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L2lycS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogbGludXgvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9pcnEuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwyMDA2IFlvc2hpbm9yaSBTYXRvCisgKgorICogSGl0YWNoaSBTb2x1dGlvbkVuZ2luZSBTdXBwb3J0LgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9zZTcyMDYuaD4KKworI2RlZmluZSBJTlRTVFMwIDB4MzE4MDAwMDAKKyNkZWZpbmUgSU5UU1RTMSAweDMxODAwMDAyCisjZGVmaW5lIElOVE1TSzAgMHgzMTgwMDAwNAorI2RlZmluZSBJTlRNU0sxIDB4MzE4MDAwMDYKKyNkZWZpbmUgSU5UU0VMICAweDMxODAwMDA4CisKKyNkZWZpbmUgSVJRMF9JUlEgNjQKKyNkZWZpbmUgSVJRMV9JUlEgNjUKKyNkZWZpbmUgSVJRM19JUlEgNjcKKworI2RlZmluZSBJTlRDX0lQUjAxIDB4ZmZmZTA4MTgKKyNkZWZpbmUgSU5UQ19JQ1IxICAweGZmZmUwODAyCisKK3N0YXRpYyB2b2lkIGRpc2FibGVfc2U3MjA2X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrID0gMHhmZmZmIF4gKDB4MGYgPDwgNCAqICgzIC0gKElSUTBfSVJRIC0gaXJxKSkpOworCXVuc2lnbmVkIHNob3J0IG1zazAsbXNrMTsKKworCS8qIFNldCB0aGUgcHJpb3JpdHkgaW4gSVBSIHRvIDAgKi8KKwl2YWwgPSBjdHJsX2ludyhJTlRDX0lQUjAxKTsKKwl2YWwgJj0gbWFzazsKKwljdHJsX291dHcodmFsLCBJTlRDX0lQUjAxKTsKKwkvKiBGUEdBIG1hc2sgc2V0ICovCisJbXNrMCA9IGN0cmxfaW53KElOVE1TSzApOworCW1zazEgPSBjdHJsX2ludyhJTlRNU0sxKTsKKworCXN3aXRjaCAoaXJxKSB7CisJY2FzZSBJUlEwX0lSUToKKwkJbXNrMCB8PSAweDAwMTA7CisJCWJyZWFrOworCWNhc2UgSVJRMV9JUlE6CisJCW1zazAgfD0gMHgwMDBmOworCQlicmVhazsKKwljYXNlIElSUTNfSVJROgorCQltc2swIHw9IDB4MGYwMDsKKwkJbXNrMSB8PSAweDAwZmY7CisJCWJyZWFrOworCX0KKwljdHJsX291dHcobXNrMCwgSU5UTVNLMCk7CisJY3RybF9vdXR3KG1zazEsIElOVE1TSzEpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfc2U3MjA2X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZSA9ICgweDAwMDEgPDwgNCAqICgzIC0gKElSUTBfSVJRIC0gaXJxKSkpOworCXVuc2lnbmVkIHNob3J0IG1zazAsbXNrMTsKKworCS8qIFNldCBwcmlvcml0eSBpbiBJUFIgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSAqLworCXZhbCA9IGN0cmxfaW53KElOVENfSVBSMDEpOworCXZhbCB8PSB2YWx1ZTsKKwljdHJsX291dHcodmFsLCBJTlRDX0lQUjAxKTsKKworCS8qIEZQR0EgbWFzayByZXNldCAqLworCW1zazAgPSBjdHJsX2ludyhJTlRNU0swKTsKKwltc2sxID0gY3RybF9pbncoSU5UTVNLMSk7CisKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgSVJRMF9JUlE6CisJCW1zazAgJj0gfjB4MDAxMDsKKwkJYnJlYWs7CisJY2FzZSBJUlExX0lSUToKKwkJbXNrMCAmPSB+MHgwMDBmOworCQlicmVhazsKKwljYXNlIElSUTNfSVJROgorCQltc2swICY9IH4weDBmMDA7CisJCW1zazEgJj0gfjB4MDBmZjsKKwkJYnJlYWs7CisJfQorCWN0cmxfb3V0dyhtc2swLCBJTlRNU0swKTsKKwljdHJsX291dHcobXNrMSwgSU5UTVNLMSk7Cit9CisKK3N0YXRpYyB2b2lkIGVvaV9zZTcyMDZfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgc2hvcnQgc3RzMCxzdHMxOworCisJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCisJCWVuYWJsZV9zZTcyMDZfaXJxKGlycSk7CisJLyogRlBHQSBpc3IgY2xlYXIgKi8KKwlzdHMwID0gY3RybF9pbncoSU5UU1RTMCk7CisJc3RzMSA9IGN0cmxfaW53KElOVFNUUzEpOworCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIElSUTBfSVJROgorCQlzdHMwICY9IH4weDAwMTA7CisJCWJyZWFrOworCWNhc2UgSVJRMV9JUlE6CisJCXN0czAgJj0gfjB4MDAwZjsKKwkJYnJlYWs7CisJY2FzZSBJUlEzX0lSUToKKwkJc3RzMCAmPSB+MHgwZjAwOworCQlzdHMxICY9IH4weDAwZmY7CisJCWJyZWFrOworCX0KKwljdHJsX291dHcoc3RzMCwgSU5UU1RTMCk7CisJY3RybF9vdXR3KHN0czEsIElOVFNUUzEpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNlNzIwNl9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJTRTcyMDYtRlBHQSIsCisJLm1hc2sJCT0gZGlzYWJsZV9zZTcyMDZfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX3NlNzIwNl9pcnEsCisJLm1hc2tfYWNrCT0gZGlzYWJsZV9zZTcyMDZfaXJxLAorCS5lb2kJCT0gZW9pX3NlNzIwNl9pcnEsCit9OworCitzdGF0aWMgdm9pZCBtYWtlX3NlNzIwNl9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZzZTcyMDZfaXJxX2NoaXAsCisJCQkJICAgICAgaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7CisJZGlzYWJsZV9zZTcyMDZfaXJxKGlycSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCisgKi8KK3ZvaWQgX19pbml0IGluaXRfc2U3MjA2X0lSUSh2b2lkKQoreworCW1ha2Vfc2U3MjA2X2lycShJUlEwX0lSUSk7IC8qIFNNQzkxQzExMSAqLworCW1ha2Vfc2U3MjA2X2lycShJUlExX0lSUSk7IC8qIEFUQSAqLworCW1ha2Vfc2U3MjA2X2lycShJUlEzX0lSUSk7IC8qIFNMT1QgLyBQQ00gKi8KKwljdHJsX291dHcoaW53KElOVENfSUNSMSkgfCAweDAwMGIgLElOVENfSUNSMSApIDsgLyogSUNSMSAqLworCisJLyogRlBHQSBTeXN0ZW0gcmVnaXN0ZXIgc2V0dXAqLworCWN0cmxfb3V0dygweDAwMDAsSU5UU1RTMCk7IC8qIENsZWFyIElOVFNUUzAgKi8KKwljdHJsX291dHcoMHgwMDAwLElOVFNUUzEpOyAvKiBDbGVhciBJTlRTVFMxICovCisJLyogSVJRMD1MQU4sIElSUTE9QVRBLCBJUlEzPVNMVCxQQ00gKi8KKwljdHJsX291dHcoMHgwMDAxLElOVFNFTCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L2xlZC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9sZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjc5NDYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9sZWQuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogbGludXgvYXJjaC9zaC9rZXJuZWwvbGVkX3NlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSA8c3R1YXJ0Lm1lbmVmeUBzdC5jb20+CisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBTb2x1dGlvbiBFbmdpbmUgc3BlY2lmaWMgTEVEIGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9zZTcyMDYuaD4KKworI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKy8qIEN5Y2xlIHRoZSBMRUQncyBpbiB0aGUgY2xhc2ljIEtuaWdodHJpZGVyL1N1biBwYXR0ZXJuICovCit2b2lkIGhlYXJ0YmVhdF9zZSh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCogcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopUEFfTEVEOworCXN0YXRpYyB1bnNpZ25lZCBiaXQgPSAwLCB1cCA9IDE7CisKKwljbnQgKz0gMTsKKwlpZiAoY250IDwgcGVyaW9kKSB7CisJCXJldHVybjsKKwl9CisKKwljbnQgPSAwOworCisJLyogR28gdGhyb3VnaCB0aGUgcG9pbnRzIChyb3VnaGx5ISk6CisJICogZigwKT0xMCwgZigxKT0xNiwgZigyKT0yMCwgZig1KT0zNSxmKGluZiktPjExMAorCSAqLworCXBlcmlvZCA9IDExMCAtICggKDMwMDw8RlNISUZUKS8KKwkJCSAoKGF2ZW5ydW5bMF0vNSkgKyAoMzw8RlNISUZUKSkgKTsKKworCWlmICh1cCkgeworCQlpZiAoYml0ID09IDcpIHsKKwkJCWJpdC0tOworCQkJdXA9MDsKKwkJfSBlbHNlIHsKKwkJCWJpdCArKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChiaXQgPT0gMCkgeworCQkJYml0Kys7CisJCQl1cD0xOworCQl9IGVsc2UgeworCQkJYml0LS07CisJCX0KKwl9CisJKnAgPSAxPDwoYml0KzgpOworCit9CisjZW5kaWYgLyogQ09ORklHX0hFQVJUQkVBVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDJlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqCisgKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFlvc2hpbm9yaSBTYXRvCisgKgorICogSGl0YWNoaSA3MjA2IFNvbHV0aW9uRW5naW5lIFN1cHBvcnQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3NlNzIwNi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CQk9IDB4MzAwLAorCQkuZW5kCQk9IDB4MzAwICsgMHgwMjAgLSAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAkJPSA2NCwKKwkJLmVuZAkJPSA2NCwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MXgiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc21jOTF4X3Jlc291cmNlcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNlNzIwNl9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc21jOTF4X2RldmljZSk7Cit9CisKK19faW5pdGNhbGwoc2U3MjA2X2RldmljZXNfc2V0dXApOworCit2b2lkIGhlYXJ0YmVhdF9zZSh2b2lkKTsKKworLyoKKyAqIFRoZSBNYWNoaW5lIFZlY3RvcgorICovCisKK3N0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQkJPSAiU29sdXRpb25FbmdpbmUiLAorCS5tdl9ucl9pcnFzCQk9IDI1NiwKKwkubXZfaW5iCQkJPSBzZTcyMDZfaW5iLAorCS5tdl9pbncJCQk9IHNlNzIwNl9pbncsCisJLm12X2lubAkJCT0gc2U3MjA2X2lubCwKKwkubXZfb3V0YgkJPSBzZTcyMDZfb3V0YiwKKwkubXZfb3V0dwkJPSBzZTcyMDZfb3V0dywKKwkubXZfb3V0bAkJPSBzZTcyMDZfb3V0bCwKKworCS5tdl9pbmJfcAkJPSBzZTcyMDZfaW5iX3AsCisJLm12X2lud19wCQk9IHNlNzIwNl9pbncsCisJLm12X2lubF9wCQk9IHNlNzIwNl9pbmwsCisJLm12X291dGJfcAkJPSBzZTcyMDZfb3V0Yl9wLAorCS5tdl9vdXR3X3AJCT0gc2U3MjA2X291dHcsCisJLm12X291dGxfcAkJPSBzZTcyMDZfb3V0bCwKKworCS5tdl9pbnNiCQk9IHNlNzIwNl9pbnNiLAorCS5tdl9pbnN3CQk9IHNlNzIwNl9pbnN3LAorCS5tdl9pbnNsCQk9IHNlNzIwNl9pbnNsLAorCS5tdl9vdXRzYgkJPSBzZTcyMDZfb3V0c2IsCisJLm12X291dHN3CQk9IHNlNzIwNl9vdXRzdywKKwkubXZfb3V0c2wJCT0gc2U3MjA2X291dHNsLAorCisJLm12X2luaXRfaXJxCQk9IGluaXRfc2U3MjA2X0lSUSwKKyNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCisJLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfc2UsCisjZW5kaWYKK307CitBTElBU19NVihzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL2lycS5jCmluZGV4IGFkMTAzNGYuLjEyNzlkNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9pcnEuYwpAQCAtMTMsNiArMTMsMTcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2U3MzAwLmg+CiAKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3MzAwX2lwcl9tYXBbXSA9IHsKKwkvKiBQQ19JUlFbMC0zXSAtPiBJUlEwICgzMikgKi8KKwl7IElSUTBfSVJRLCBJUlEwX0lQUl9BRERSLCBJUlEwX0lQUl9QT1MsIDB4MGYgLSBJUlEwX0lSUSB9LAorCS8qIEFfSVJRWzAtM10gLT4gSVJRMSAoMzMpICovCisJeyBJUlExX0lSUSwgSVJRMV9JUFJfQUREUiwgSVJRMV9JUFJfUE9TLCAweDBmIC0gSVJRMV9JUlEgfSwKKwl7IFNJT0YwX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZIH0sCisJeyBETVRFMl9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSB9LAorCXsgRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkgfSwKKwl7IFZJT19JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSB9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwpAQCAtMjMsMTQgKzM0LDcgQEAKIAljdHJsX291dHcoMHhhMDAwLCBJTlRDX0lDUjEpOwkgICAgICAgIC8qIElSUSBtb2RlOyBJUlEwLDEgZW5hYmxlLiAgICAqLwogCWN0cmxfb3V0dygweDAwMDAsIFBPUlRfUEZDUik7CSAgICAgICAgLyogdXNlIEYgZm9yIElSUVszOjBdIGFuZCBTSVUuICovCiAKLQkvKiBQQ19JUlFbMC0zXSAtPiBJUlEwICgzMikgKi8KLQltYWtlX2lwcl9pcnEoSVJRMF9JUlEsIElSUTBfSVBSX0FERFIsIElSUTBfSVBSX1BPUywgMHgwZiAtIElSUTBfSVJRKTsKLQkvKiBBX0lSUVswLTNdIC0+IElSUTEgKDMzKSAqLwotCW1ha2VfaXByX2lycShJUlExX0lSUSwgSVJRMV9JUFJfQUREUiwgSVJRMV9JUFJfUE9TLCAweDBmIC0gSVJRMV9JUlEpOwotCW1ha2VfaXByX2lycShTSU9GMF9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUyX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShWSU9fSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShzZTczMDBfaXByX21hcCwgQVJSQVlfU0laRShzZTczMDBfaXByX21hcCkpOwogCiAJY3RybF9vdXR3KDB4MjAwMCwgUEFfTVJTSFBDICsgMHgwYyk7CS8qIG1yc2hwYyBpcnEgZW5hYmxlICovCiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2lycS5jCmluZGV4IDJjNjJiOGUuLmU3MjAwYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2lycS5jCkBAIC04NywxMyArODcsMzggQEAKIAlyZXR1cm4gaXJxOwogfQogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzMxODBfc2lvZjBfaXByX21hcFtdID0geworCXsgU0lPRjBfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKK307CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzMxODBfdnB1X2lwcl9tYXBbXSA9IHsKKwl7IFZQVV9JUlEsIFZQVV9JUFJfQUREUiwgVlBVX0lQUl9QT1MsIDggfSwKK307CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzMxODBfb3RoZXJfaXByX21hcFtdID0geworCXsgRE1URTJfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkgfSwKKwl7IERNVEUzX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZIH0sCisJeyBETVRFNF9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSB9LAorCXsgSUlDMF9BTElfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsIElJQzBfUFJJT1JJVFkgfSwKKwl7IElJQzBfVEFDS0lfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsIElJQzBfUFJJT1JJVFkgfSwKKwl7IElJQzBfV0FJVElfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsIElJQzBfUFJJT1JJVFkgfSwKKwl7IElJQzBfRFRFSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSB9LAorCXsgU0lPRjBfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkgfSwKKwl7IFNJVV9JUlEsIFNJVV9JUFJfQUREUiwgU0lVX0lQUl9QT1MsIFNJVV9QUklPUklUWSB9LAorCisJLyogVklPIGludGVycnVwdCAqLworCXsgQ0VVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZIH0sCisJeyBCRVVfSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkgfSwKKwl7IFZFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSB9LAorCisJeyBMQ0RDX0lSUSwgTENEQ19JUFJfQUREUiwgTENEQ19JUFJfUE9TLCBMQ0RDX1BSSU9SSVRZIH0sCit9OworCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCiB2b2lkIF9faW5pdAogaW5pdF83MzE4MHNlX0lSUSh2b2lkKQogewotCW1ha2VfaXByX2lycShTSU9GMF9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKHNlNzMxODBfc2lvZjBfaXByX21hcCwgQVJSQVlfU0laRShzZTczMTgwX3Npb2YwX2lwcl9tYXApKTsKIAogCWN0cmxfb3V0dygweDIwMDAsIDB4YjAzZmZmZWMpOwkvKiBtcnNocGMgaXJxIGVuYWJsZSAqLwogCWN0cmxfb3V0dygweDIwMDAsIDB4YjA3ZmZmZWMpOwkvKiBtcnNocGMgaXJxIGVuYWJsZSAqLwpAQCAtMTAxLDI3ICsxMjYsMTEgQEAKIAljdHJsX291dHcoMiA8PCAoKDcgLSA1KSAqIDIpLCBJTlRDX0lDUjEpOwkvKiBsb3ctbGV2ZWwgaXJxICovCiAJbWFrZV9pbnRyZXFfaXJxKDEwKTsKIAotCW1ha2VfaXByX2lycShWUFVfSVJRLCBWUFVfSVBSX0FERFIsIFZQVV9JUFJfUE9TLCA4KTsKKwltYWtlX2lwcl9pcnEoc2U3MzE4MF92cHVfaXByX21hcCwgQVJSQVlfU0laRShzZTczMTgwX3ZwdV9pcHJfbWFwKSk7CiAKIAljdHJsX291dGIoMHgwZiwgSU5UQ19JTUNSNSk7CS8qIGVuYWJsZSBTQ0lGIElSUSAqLwogCi0JbWFrZV9pcHJfaXJxKERNVEUyX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFNF9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElJQzBfQUxJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSUlDMF9UQUNLSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywKLQkJICAgICBJSUMwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSUlDMF9XQUlUSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywKLQkJICAgICBJSUMwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSUlDMF9EVEVJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0lPRjBfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTSVVfSVJRLCBTSVVfSVBSX0FERFIsIFNJVV9JUFJfUE9TLCBTSVVfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShzZTczMTgwX290aGVyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3MzE4MF9vdGhlcl9pcHJfbWFwKSk7CiAKLQkvKiBWSU8gaW50ZXJydXB0ICovCi0JbWFrZV9pcHJfaXJxKENFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKEJFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFZFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSk7Ci0KLQltYWtlX2lwcl9pcnEoTENEQ19JUlEsIExDRENfSVBSX0FERFIsIExDRENfSVBSX1BPUywgTENEQ19QUklPUklUWSk7CiAJY3RybF9vdXR3KDB4MjAwMCwgUEFfTVJTSFBDICsgMHgwYyk7CS8qIG1yc2hwYyBpcnEgZW5hYmxlICovCiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9pcnEuYwppbmRleCAyODhiNjJmLi4zNjAxNTNlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvaXJxLmMKQEAgLTEwMiw2ICsxMDIsNTEgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTUgPSB7IG5vX2FjdGlvbiwgMCwgQ1BVX01BU0tfTk9ORSwgIklSUTUtY2FzY2FkZSIsCiAJCQkJTlVMTCwgTlVMTH07CiAKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3MzQzX2lycTVfaXByX21hcFtdID0geworCXsgSVJRNV9JUlEsIElSUTVfSVBSX0FERFIrMiwgSVJRNV9JUFJfUE9TLCBJUlE1X1BSSU9SSVRZIH0sCit9Oworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTczNDNfc2lvZjBfdnB1X2lwcl9tYXBbXSA9IHsKKwl7IFNJT0YwX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZIH0sCisJeyBWUFVfSVJRLCBWUFVfSVBSX0FERFIsIFZQVV9JUFJfUE9TLCA4IH0sCit9Oworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTczNDNfb3RoZXJfaXByX21hcFtdID0geworCXsgRE1URTBfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkgfSwKKwl7IERNVEUxX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZIH0sCisJeyBETVRFMl9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSB9LAorCXsgRE1URTNfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkgfSwKKwl7IERNVEU0X0lSUSwgRE1BMl9JUFJfQUREUiwgRE1BMl9JUFJfUE9TLCBETUEyX1BSSU9SSVRZIH0sCisJeyBETVRFNV9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSB9LAorCisJLyogSTJDIGJsb2NrICovCisJeyBJSUMwX0FMSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSB9LAorCXsgSUlDMF9UQUNLSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSB9LAorCXsgSUlDMF9XQUlUSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywgSUlDMF9QUklPUklUWSB9LAorCXsgSUlDMF9EVEVJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZIH0sCisKKwl7IElJQzFfQUxJX0lSUSwgSUlDMV9JUFJfQUREUiwgSUlDMV9JUFJfUE9TLCBJSUMxX1BSSU9SSVRZIH0sCisJeyBJSUMxX1RBQ0tJX0lSUSwgSUlDMV9JUFJfQUREUiwgSUlDMV9JUFJfUE9TLCBJSUMxX1BSSU9SSVRZIH0sCisJeyBJSUMxX1dBSVRJX0lSUSwgSUlDMV9JUFJfQUREUiwgSUlDMV9JUFJfUE9TLCBJSUMxX1BSSU9SSVRZIH0sCisJeyBJSUMxX0RURUlfSVJRLCBJSUMxX0lQUl9BRERSLCBJSUMxX0lQUl9QT1MsIElJQzFfUFJJT1JJVFkgfSwKKworCS8qIFNJT0YgKi8KKwl7IFNJT0YwX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZIH0sCisKKwkvKiBTSVUgKi8KKwl7IFNJVV9JUlEsIFNJVV9JUFJfQUREUiwgU0lVX0lQUl9QT1MsIFNJVV9QUklPUklUWSB9LAorCisJLyogVklPIGludGVycnVwdCAqLworCXsgQ0VVX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZIH0sCisJeyBCRVVfSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkgfSwKKwl7IFZFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSB9LAorCisJLypNRkkgaW50ZXJydXB0Ki8KKworCXsgTUZJX0lSUSwgTUZJX0lQUl9BRERSLCBNRklfSVBSX1BPUywgTUZJX1BSSU9SSVRZIH0sCisKKwkvKiBMQ0QgY29udHJvbGxlciAqLworCXsgTENEQ19JUlEsIExDRENfSVBSX0FERFIsIExDRENfSVBSX1BPUywgTENEQ19QUklPUklUWSB9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwpAQCAtMTM4LDU0ICsxODMsMTcgQEAKIAkvKiBTZXR1cCBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0cyB0byBiZSBhY3RpdmUgbG93ICovCiAJY3RybF9vdXR3KDB4YWFhYSwgSU5UQ19JQ1IxKTsKIAotCW1ha2VfaXByX2lycShJUlE1X0lSUSwgSVJRNV9JUFJfQUREUisyLCBJUlE1X0lQUl9QT1MsIElSUTVfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShzZTczNDNfaXJxNV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNlNzM0M19pcnE1X2lwcl9tYXApKTsKKwogCXNldHVwX2lycShJUlE1X0lSUSwgJmlycTUpOwogCS8qIFNldCBwb3J0IGNvbnRyb2wgdG8gdXNlIElSUTUgKi8KIAkqKHUxNiAqKTB4QTQwNTAxMDggJj0gfjB4YzsKIAotCW1ha2VfaXByX2lycShTSU9GMF9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFZQVV9JUlEsIFZQVV9JUFJfQUREUiwgVlBVX0lQUl9QT1MsIDgpOworCW1ha2VfaXByX2lycShzZTczNDNfc2lvZjBfdnB1X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3MzQzX3Npb2YwX3ZwdV9pcHJfbWFwKSk7CiAKIAljdHJsX291dGIoMHgwZiwgSU5UQ19JTUNSNSk7CS8qIGVuYWJsZSBTQ0lGIElSUSAqLwogCi0JbWFrZV9pcHJfaXJxKERNVEUwX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTFfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFMl9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUzX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoRE1URTRfSVJRLCBETUEyX0lQUl9BRERSLCBETUEyX0lQUl9QT1MsIERNQTJfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFNV9JUlEsIERNQTJfSVBSX0FERFIsIERNQTJfSVBSX1BPUywgRE1BMl9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKHNlNzM0M19vdGhlcl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNlNzM0M19vdGhlcl9pcHJfbWFwKSk7CiAKLQkvKiBJMkMgYmxvY2sgKi8KLQltYWtlX2lwcl9pcnEoSUlDMF9BTElfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsIElJQzBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMwX1RBQ0tJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLAotCQkgICAgIElJQzBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMwX1dBSVRJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLAotCQkgICAgIElJQzBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJSUMwX0RURUlfSVJRLCBJSUMwX0lQUl9BRERSLCBJSUMwX0lQUl9QT1MsIElJQzBfUFJJT1JJVFkpOwotCi0JbWFrZV9pcHJfaXJxKElJQzFfQUxJX0lSUSwgSUlDMV9JUFJfQUREUiwgSUlDMV9JUFJfUE9TLCBJSUMxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSUlDMV9UQUNLSV9JUlEsIElJQzFfSVBSX0FERFIsIElJQzFfSVBSX1BPUywKLQkJICAgICBJSUMxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSUlDMV9XQUlUSV9JUlEsIElJQzFfSVBSX0FERFIsIElJQzFfSVBSX1BPUywKLQkJICAgICBJSUMxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSUlDMV9EVEVJX0lSUSwgSUlDMV9JUFJfQUREUiwgSUlDMV9JUFJfUE9TLCBJSUMxX1BSSU9SSVRZKTsKLQotCS8qIFNJT0YgKi8KLQltYWtlX2lwcl9pcnEoU0lPRjBfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywgU0lPRjBfUFJJT1JJVFkpOwotCi0JLyogU0lVICovCi0JbWFrZV9pcHJfaXJxKFNJVV9JUlEsIFNJVV9JUFJfQUREUiwgU0lVX0lQUl9QT1MsIFNJVV9QUklPUklUWSk7Ci0KLQkvKiBWSU8gaW50ZXJydXB0ICovCi0JbWFrZV9pcHJfaXJxKENFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKEJFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFZFVV9JUlEsIFZJT19JUFJfQUREUiwgVklPX0lQUl9QT1MsIFZJT19QUklPUklUWSk7Ci0KLQkvKk1GSSBpbnRlcnJ1cHQqLwotCi0JbWFrZV9pcHJfaXJxKE1GSV9JUlEsIE1GSV9JUFJfQUREUiwgTUZJX0lQUl9QT1MsIE1GSV9QUklPUklUWSk7Ci0KLQkvKiBMQ0QgY29udHJvbGxlciAqLwotCW1ha2VfaXByX2lycShMQ0RDX0lSUSwgTENEQ19JUFJfQUREUiwgTENEQ19JUFJfUE9TLCBMQ0RDX1BSSU9SSVRZKTsKIAljdHJsX291dHcoMHgyMDAwLCBQQV9NUlNIUEMgKyAweDBjKTsJLyogbXJzaHBjIGlycSBlbmFibGUgKi8KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTc3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIDc2MTkgU29sdXRpb25FbmdpbmUgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAorIworCitvYmoteQkgOj0gc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzYxOS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzYxOS9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDJjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L3NldHVwLmMKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGFyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBZb3NoaW5vcmkgU2F0bworICoKKyAqIEhpdGFjaGkgU0g3NjE5IFNvbHV0aW9uRW5naW5lIFN1cHBvcnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorCisvKgorICogVGhlIE1hY2hpbmUgVmVjdG9yCisgKi8KKworc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0geworCS5tdl9uYW1lCQk9ICJTb2x1dGlvbkVuZ2luZSIsCisJLm12X25yX2lycXMJCT0gMTA4LAorfTsKK0FMSUFTX01WKHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKaW5kZXggY2ZmNjcwMC4uZmNkN2NkNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCkBAIC0xMyw2ICsxMyw0OCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZS5oPgogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzcweF9pcHJfbWFwW10gPSB7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQorCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLworCXsgMHhmLTB4MiwgQkNSX0lMQ1JBLCAyLCAweDIgfSwKKwl7IDB4Zi0weGEsIEJDUl9JTENSQSwgMSwgMHhhIH0sCisJeyAweGYtMHg1LCBCQ1JfSUxDUkIsIDAsIDB4NSB9LAorCXsgMHhmLTB4OCwgQkNSX0lMQ1JDLCAxLCAweDggfSwKKwl7IDB4Zi0weGMsIEJDUl9JTENSQywgMCwgMHhjIH0sCisJeyAweGYtMHhlLCBCQ1JfSUxDUkQsIDMsIDB4ZSB9LAorCXsgMHhmLTB4MywgQkNSX0lMQ1JELCAxLCAweDMgfSwgLyogTEFOICovCisJeyAweGYtMHhkLCBCQ1JfSUxDUkUsIDIsIDB4ZCB9LAorCXsgMHhmLTB4OSwgQkNSX0lMQ1JFLCAxLCAweDkgfSwKKwl7IDB4Zi0weDEsIEJDUl9JTENSRSwgMCwgMHgxIH0sCisJeyAweGYtMHhmLCBCQ1JfSUxDUkYsIDMsIDB4ZiB9LAorCXsgMHhmLTB4YiwgQkNSX0lMQ1JGLCAxLCAweGIgfSwKKwl7IDB4Zi0weDcsIEJDUl9JTENSRywgMywgMHg3IH0sCisJeyAweGYtMHg2LCBCQ1JfSUxDUkcsIDIsIDB4NiB9LAorCXsgMHhmLTB4NCwgQkNSX0lMQ1JHLCAxLCAweDQgfSwKKyNlbHNlCisJeyAxNCwgQkNSX0lMQ1JBLCAyLCAweDBmLTE0IH0sCisJeyAxMiwgQkNSX0lMQ1JBLCAxLCAweDBmLTEyIH0sCisJeyAgOCwgQkNSX0lMQ1JCLCAxLCAweDBmLSA4IH0sCisJeyAgNiwgQkNSX0lMQ1JDLCAzLCAweDBmLSA2IH0sCisJeyAgNSwgQkNSX0lMQ1JDLCAyLCAweDBmLSA1IH0sCisJeyAgNCwgQkNSX0lMQ1JDLCAxLCAweDBmLSA0IH0sCisJeyAgMywgQkNSX0lMQ1JDLCAwLCAweDBmLSAzIH0sCisJeyAgMSwgQkNSX0lMQ1JELCAzLCAweDBmLSAxIH0sCisKKwl7IDEwLCBCQ1JfSUxDUkQsIDEsIDB4MGYtMTAgfSwgLyogTEFOICovCisKKwl7ICAwLCBCQ1JfSUxDUkUsIDMsIDB4MGYtIDAgfSwgLyogUENJUlEzICovCisJeyAxMSwgQkNSX0lMQ1JFLCAyLCAweDBmLTExIH0sIC8qIFBDSVJRMiAqLworCXsgIDksIEJDUl9JTENSRSwgMSwgMHgwZi0gOSB9LCAvKiBQQ0lSUTEgKi8KKwl7ICA3LCBCQ1JfSUxDUkUsIDAsIDB4MGYtIDcgfSwgLyogUENJUlEwICovCisKKwkvKiAjMiwgIzEzIGFyZSBhbGxvY2F0ZWQgZm9yIFNMT1QgSVJRICMxIGFuZCAjMiAoZm9yIG5vdykgKi8KKwkvKiBOT1RFOiAjMiBhbmQgIzEzIGFyZSBub3QgdXNlZCBvbiBQQyAqLworCXsgMTMsIEJDUl9JTENSRywgMSwgMHgwZi0xMyB9LCAvKiBTTE9USVJRMiAqLworCXsgIDIsIEJDUl9JTENSRywgMCwgMHgwZi0gMiB9LCAvKiBTTE9USVJRMSAqLworI2VuZGlmCit9OworCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCkBAIC0zOCw0MiArODAsNiBAQAogCWN0cmxfb3V0dygwLCBCQ1JfSUxDUkUpOwogCWN0cmxfb3V0dygwLCBCQ1JfSUxDUkYpOwogCWN0cmxfb3V0dygwLCBCQ1JfSUxDUkcpOwotCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLwotCW1ha2VfaXByX2lycSgweGYtMHgyLCBCQ1JfSUxDUkEsIDIsIDB4Mik7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weGEsIEJDUl9JTENSQSwgMSwgMHhhKTsKLQltYWtlX2lwcl9pcnEoMHhmLTB4NSwgQkNSX0lMQ1JCLCAwLCAweDUpOwotCW1ha2VfaXByX2lycSgweGYtMHg4LCBCQ1JfSUxDUkMsIDEsIDB4OCk7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weGMsIEJDUl9JTENSQywgMCwgMHhjKTsKLQltYWtlX2lwcl9pcnEoMHhmLTB4ZSwgQkNSX0lMQ1JELCAzLCAweGUpOwotCW1ha2VfaXByX2lycSgweGYtMHgzLCBCQ1JfSUxDUkQsIDEsIDB4Myk7IC8qIExBTiAqLwotCW1ha2VfaXByX2lycSgweGYtMHhkLCBCQ1JfSUxDUkUsIDIsIDB4ZCk7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weDksIEJDUl9JTENSRSwgMSwgMHg5KTsKLQltYWtlX2lwcl9pcnEoMHhmLTB4MSwgQkNSX0lMQ1JFLCAwLCAweDEpOwotCW1ha2VfaXByX2lycSgweGYtMHhmLCBCQ1JfSUxDUkYsIDMsIDB4Zik7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weGIsIEJDUl9JTENSRiwgMSwgMHhiKTsKLQltYWtlX2lwcl9pcnEoMHhmLTB4NywgQkNSX0lMQ1JHLCAzLCAweDcpOwotCW1ha2VfaXByX2lycSgweGYtMHg2LCBCQ1JfSUxDUkcsIDIsIDB4Nik7Ci0JbWFrZV9pcHJfaXJxKDB4Zi0weDQsIEJDUl9JTENSRywgMSwgMHg0KTsKLSNlbHNlCi0gICAgICAgIG1ha2VfaXByX2lycSgxNCwgQkNSX0lMQ1JBLCAyLCAweDBmLTE0KTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKDEyLCBCQ1JfSUxDUkEsIDEsIDB4MGYtMTIpOwotICAgICAgICBtYWtlX2lwcl9pcnEoIDgsIEJDUl9JTENSQiwgMSwgMHgwZi0gOCk7Ci0gICAgICAgIG1ha2VfaXByX2lycSggNiwgQkNSX0lMQ1JDLCAzLCAweDBmLSA2KTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKCA1LCBCQ1JfSUxDUkMsIDIsIDB4MGYtIDUpOwotICAgICAgICBtYWtlX2lwcl9pcnEoIDQsIEJDUl9JTENSQywgMSwgMHgwZi0gNCk7Ci0gICAgICAgIG1ha2VfaXByX2lycSggMywgQkNSX0lMQ1JDLCAwLCAweDBmLSAzKTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKCAxLCBCQ1JfSUxDUkQsIDMsIDB4MGYtIDEpOwotCi0gICAgICAgIG1ha2VfaXByX2lycSgxMCwgQkNSX0lMQ1JELCAxLCAweDBmLTEwKTsgLyogTEFOICovCi0KLSAgICAgICAgbWFrZV9pcHJfaXJxKCAwLCBCQ1JfSUxDUkUsIDMsIDB4MGYtIDApOyAvKiBQQ0lSUTMgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKDExLCBCQ1JfSUxDUkUsIDIsIDB4MGYtMTEpOyAvKiBQQ0lSUTIgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKCA5LCBCQ1JfSUxDUkUsIDEsIDB4MGYtIDkpOyAvKiBQQ0lSUTEgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKCA3LCBCQ1JfSUxDUkUsIDAsIDB4MGYtIDcpOyAvKiBQQ0lSUTAgKi8KLQotICAgICAgICAvKiAjMiwgIzEzIGFyZSBhbGxvY2F0ZWQgZm9yIFNMT1QgSVJRICMxIGFuZCAjMiAoZm9yIG5vdykgKi8KLSAgICAgICAgLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKDEzLCBCQ1JfSUxDUkcsIDEsIDB4MGYtMTMpOyAvKiBTTE9USVJRMiAqLwotICAgICAgICBtYWtlX2lwcl9pcnEoIDIsIEJDUl9JTENSRywgMCwgMHgwZi0gMik7IC8qIFNMT1RJUlExICovCiAjZW5kaWYKKwltYWtlX2lwcl9pcnEoc2U3NzB4X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3NzB4X2lwcl9tYXApKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jCmluZGV4IGM2MDdiMGEuLmU0YzYzYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYwpAQCAtMTQsNTMgKzE0LDUwIEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZTc3NTEuaD4KIAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTc3NTFfaXByX21hcFtdID0geworICAvKiBMZWF2ZSBvbGQgU29sdXRpb24gRW5naW5lIGNvZGUgaW4gZm9yIHJlZmVyZW5jZS4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCisJLyoKKwkgKiBTdXBlciBJL08gKEp1c3QgbWltaWMgUEMpOgorCSAqICAxOiBrZXlib2FyZAorCSAqICAzOiBzZXJpYWwgMAorCSAqICA0OiBzZXJpYWwgMQorCSAqICA1OiBwcmludGVyCisJICogIDY6IGZsb3BweQorCSAqICA4OiBydGMKKwkgKiAxMjogbW91c2UKKwkgKiAxNDogaWRlMAorCSAqLworCXsgMTQsIEJDUl9JTENSQSwgMiwgMHgwZi0xNCB9LAorCXsgMTIsIEJDUl9JTENSQSwgMSwgMHgwZi0xMiB9LAorCXsgIDgsIEJDUl9JTENSQiwgMSwgMHgwZi0gOCB9LAorCXsgIDYsIEJDUl9JTENSQywgMywgMHgwZi0gNiB9LAorCXsgIDUsIEJDUl9JTENSQywgMiwgMHgwZi0gNSB9LAorCXsgIDQsIEJDUl9JTENSQywgMSwgMHgwZi0gNCB9LAorCXsgIDMsIEJDUl9JTENSQywgMCwgMHgwZi0gMyB9LAorCXsgIDEsIEJDUl9JTENSRCwgMywgMHgwZi0gMSB9LAorCisJeyAxMCwgQkNSX0lMQ1JELCAxLCAweDBmLTEwIH0sIC8qIExBTiAqLworCisJeyAgMCwgQkNSX0lMQ1JFLCAzLCAweDBmLSAwIH0sIC8qIFBDSVJRMyAqLworCXsgMTEsIEJDUl9JTENSRSwgMiwgMHgwZi0xMSB9LCAvKiBQQ0lSUTIgKi8KKwl7ICA5LCBCQ1JfSUxDUkUsIDEsIDB4MGYtIDkgfSwgLyogUENJUlExICovCisJeyAgNywgQkNSX0lMQ1JFLCAwLCAweDBmLSA3IH0sIC8qIFBDSVJRMCAqLworCisJLyogIzIsICMxMyBhcmUgYWxsb2NhdGVkIGZvciBTTE9UIElSUSAjMSBhbmQgIzIgKGZvciBub3cpICovCisJLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KKwl7IDEzLCBCQ1JfSUxDUkcsIDEsIDB4MGYtMTMgfSwgLyogU0xPVElSUTIgKi8KKwl7ICAyLCBCQ1JfSUxDUkcsIDAsIDB4MGYtIDIgfSwgLyogU0xPVElSUTEgKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQorCXsgMTMsIEJDUl9JTENSRCwgMywgMiB9LAorCS8qIEFkZCBhZGRpdGlvbmFsIGVudHJpZXMgaGVyZSBhcyBkcml2ZXJzIGFyZSBhZGRlZCBhbmQgdGVzdGVkLiAqLworI2VuZGlmCit9OworCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCiB2b2lkIF9faW5pdCBpbml0Xzc3NTFzZV9JUlEodm9pZCkKIHsKLQotICAvKiBMZWF2ZSBvbGQgU29sdXRpb24gRW5naW5lIGNvZGUgaW4gZm9yIHJlZmVyZW5jZS4gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN1cGVyIEkvTyAoSnVzdCBtaW1pYyBQQyk6Ci0gICAgICAgICAqICAxOiBrZXlib2FyZAotICAgICAgICAgKiAgMzogc2VyaWFsIDAKLSAgICAgICAgICogIDQ6IHNlcmlhbCAxCi0gICAgICAgICAqICA1OiBwcmludGVyCi0gICAgICAgICAqICA2OiBmbG9wcHkKLSAgICAgICAgICogIDg6IHJ0YwotICAgICAgICAgKiAxMjogbW91c2UKLSAgICAgICAgICogMTQ6IGlkZTAKLSAgICAgICAgICovCi0gICAgICAgIG1ha2VfaXByX2lycSgxNCwgQkNSX0lMQ1JBLCAyLCAweDBmLTE0KTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKDEyLCBCQ1JfSUxDUkEsIDEsIDB4MGYtMTIpOwotICAgICAgICBtYWtlX2lwcl9pcnEoIDgsIEJDUl9JTENSQiwgMSwgMHgwZi0gOCk7Ci0gICAgICAgIG1ha2VfaXByX2lycSggNiwgQkNSX0lMQ1JDLCAzLCAweDBmLSA2KTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKCA1LCBCQ1JfSUxDUkMsIDIsIDB4MGYtIDUpOwotICAgICAgICBtYWtlX2lwcl9pcnEoIDQsIEJDUl9JTENSQywgMSwgMHgwZi0gNCk7Ci0gICAgICAgIG1ha2VfaXByX2lycSggMywgQkNSX0lMQ1JDLCAwLCAweDBmLSAzKTsKLSAgICAgICAgbWFrZV9pcHJfaXJxKCAxLCBCQ1JfSUxDUkQsIDMsIDB4MGYtIDEpOwotCi0gICAgICAgIG1ha2VfaXByX2lycSgxMCwgQkNSX0lMQ1JELCAxLCAweDBmLTEwKTsgLyogTEFOICovCi0KLSAgICAgICAgbWFrZV9pcHJfaXJxKCAwLCBCQ1JfSUxDUkUsIDMsIDB4MGYtIDApOyAvKiBQQ0lSUTMgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKDExLCBCQ1JfSUxDUkUsIDIsIDB4MGYtMTEpOyAvKiBQQ0lSUTIgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKCA5LCBCQ1JfSUxDUkUsIDEsIDB4MGYtIDkpOyAvKiBQQ0lSUTEgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKCA3LCBCQ1JfSUxDUkUsIDAsIDB4MGYtIDcpOyAvKiBQQ0lSUTAgKi8KLQotICAgICAgICAvKiAjMiwgIzEzIGFyZSBhbGxvY2F0ZWQgZm9yIFNMT1QgSVJRICMxIGFuZCAjMiAoZm9yIG5vdykgKi8KLSAgICAgICAgLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KLSAgICAgICAgbWFrZV9pcHJfaXJxKDEzLCBCQ1JfSUxDUkcsIDEsIDB4MGYtMTMpOyAvKiBTTE9USVJRMiAqLwotICAgICAgICBtYWtlX2lwcl9pcnEoIDIsIEJDUl9JTENSRywgMCwgMHgwZi0gMik7IC8qIFNMT1RJUlExICovCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQotCi0gICAgICAgIG1ha2VfaXByX2lycSgxMywgQkNSX0lMQ1JELCAzLCAyKTsKLQotICAgICAgICAvKiBBZGQgYWRkaXRpb25hbCBjYWxscyB0byBtYWtlX2lwcl9pcnEoKSBhcyBkcml2ZXJzIGFyZSBhZGRlZAotICAgICAgICAgKiBhbmQgdGVzdGVkLgotICAgICAgICAgKi8KLSNlbmRpZgotCisJbWFrZV9pcHJfaXJxKHNlNzc1MV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNlNzc1MV9pcHJfbWFwKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKaW5kZXggMTM3ZTJiYS4uNWFkMWUxOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYwpAQCAtMTQsMTQgKzE0LDE3IEBACiAjaW5jbHVkZSA8YXNtL3NoMDMvc2gwMy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDAzX2lwcl9tYXBbXSA9IHsKKwl7IElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkgfSwKKwl7IElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkgfSwKKwl7IElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkgfSwKKwl7IElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkgfSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NoMDNfSVJRKHZvaWQpCiB7CiAJY3RybF9vdXR3KGN0cmxfaW53KElOVENfSUNSKSB8IElOVENfSUNSX0lSTE0sIElOVENfSUNSKTsKLQotCW1ha2VfaXByX2lycShJUkwwX0lSUSwgSVJMMF9JUFJfQUREUiwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMMV9JUlEsIElSTDFfSVBSX0FERFIsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwzX0lSUSwgSVJMM19JUFJfQUREUiwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoc2gwM19pcHJfbWFwLCBBUlJBWV9TSVpFKHNoMDNfaXByX21hcCkpOwogfQogCiBleHRlcm4gdm9pZCAqY2ZfaW9fYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCmluZGV4IDJmMGMxOTcuLmEzMWExZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYwpAQCAtNyw3ICs3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9zaG1pbi9zaG1pbi5oPgorI2luY2x1ZGUgPGFzbS9zaG1pbi5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCmluZGV4IDU0MGQwYmYuLjY1MGZiMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYwpAQCAtNjgsNiArNjgsMTMgQEAKICAqIElSTDMgPSBjcnlwdG8KICAqLwogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNuYXBnZWFyX2lwcl9tYXBbXSA9IHsKKwltYWtlX2lwcl9pcnEoSVJMMF9JUlEsIElSTDBfSVBSX0FERFIsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShJUkwyX0lSUSwgSVJMMl9JUFJfQUREUiwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoSVJMM19JUlEsIElSTDNfSVBSX0FERFIsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSk7Cit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zbmFwZ2Vhcl9JUlEodm9pZCkKIHsKIAkvKiBlbmFibGUgaW5kaXZpZHVhbCBpbnRlcnJ1cHQgbW9kZSBmb3IgZXh0ZXJuYWxzICovCkBAIC03NSwxMCArODIsNyBAQAogCiAJcHJpbnRrKCJTZXR1cCBTbmFwR2VhciBJUlEvSVBSIC4uLlxuIik7CiAKLQltYWtlX2lwcl9pcnEoSVJMMF9JUlEsIElSTDBfSVBSX0FERFIsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwyX0lSUSwgSVJMMl9JUFJfQUREUiwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMM19JUlEsIElSTDNfSVBSX0FERFIsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKHNuYXBnZWFyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc25hcGdlYXJfaXByX21hcCkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMKaW5kZXggNTJiNjZkOC4uNmJjZDkzOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCkBAIC0xLDIzICsxLDMxIEBACiAvKgotICoJU2V0dXAgZm9yIFRpdGFuCisgKiBhcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jIC0gU2V0dXAgZm9yIFRpdGFuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgSmFtaWUgTGVuZWhhbgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS90aXRhbi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1leHRlcm4gdm9pZCBfX2luaXQgcGNpYmlvc19pbml0X3BsYXRmb3JtKHZvaWQpOworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSB0aXRhbl9pcHJfbWFwW10gPSB7CisJLyogSVJRLCBJUFIgaWR4LCBzaGlmdCwgcHJpbyAqLworCXsgVElUQU5fSVJRX1dBTiwgICAzLCAxMiwgOCB9LAkvKiBldGgwIChXQU4pICovCisJeyBUSVRBTl9JUlFfTEFOLCAgIDMsICA4LCA4IH0sCS8qIGV0aDEgKExBTikgKi8KKwl7IFRJVEFOX0lSUV9NUENJQSwgMywgIDQsIDggfSwJLyogbVBDSSBBICh0b3ApICovCisJeyBUSVRBTl9JUlFfVVNCLCAgIDMsICAwLCA4IH0sCS8qIG1QQ0kgQiAoYm90dG9tKSwgVVNCICovCit9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF90aXRhbl9pcnEodm9pZCkKIHsKIAkvKiBlbmFibGUgaW5kaXZpZHVhbCBpbnRlcnJ1cHQgbW9kZSBmb3IgZXh0ZXJuYWxzICovCi0JY3RybF9vdXR3KGN0cmxfaW53KElOVENfSUNSKSB8IElOVENfSUNSX0lSTE0sIElOVENfSUNSKTsKLQotCW1ha2VfaXByX2lycSggVElUQU5fSVJRX1dBTiwgICBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkpOyAvKiBQQ0lSUTAgKi8KLQltYWtlX2lwcl9pcnEoIFRJVEFOX0lSUV9MQU4sICAgSVJMMV9JUFJfQUREUiwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZKTsgLyogUENJUlExICovCi0JbWFrZV9pcHJfaXJxKCBUSVRBTl9JUlFfTVBDSUEsIElSTDJfSVBSX0FERFIsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSk7IC8qIFBDSVJRMiAqLwotCW1ha2VfaXByX2lycSggVElUQU5fSVJRX1VTQiwgICBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkpOyAvKiBQQ0lSUTMgKi8KKwlpcHJfaXJxX2VuYWJsZV9pcmxtKCk7CisJLyogcmVnaXN0ZXIgaXByIGlycXMgKi8KKwltYWtlX2lwcl9pcnEodGl0YW5faXByX21hcCwgQVJSQVlfU0laRSh0aXRhbl9pcHJfbWFwKSk7CiB9CiAKIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl90aXRhbiBfX2luaXRtdiA9IHsKQEAgLTQzLDYgKzUxLDUgQEAKIAkubXZfaW9wb3J0X21hcCA9IHRpdGFuX2lvcG9ydF9tYXAsCiAKIAkubXZfaW5pdF9pcnEgPQlpbml0X3RpdGFuX2lycSwKLQkubXZfaW5pdF9wY2kgPQlwY2liaW9zX2luaXRfcGxhdGZvcm0sCiB9OwogQUxJQVNfTVYodGl0YW4pCmRpZmYgLS1naXQgYS9hcmNoL3NoL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3NoL2Jvb3QvTWFrZWZpbGUKaW5kZXggNjA3OTdiMy4uMTFkYzI3MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2Jvb3QvTWFrZWZpbGUKQEAgLTgsMTMgKzgsNDkgQEAKICMgQ29weXJpZ2h0IChDKSAxOTk5IFN0dWFydCBNZW5lZnkKICMKIAotdGFyZ2V0cyA6PSB6SW1hZ2UKK01LSU1BR0UgOj0gJChzcmN0cmVlKS9zY3JpcHRzL21rdWJvb3Quc2gKKworIworIyBBc3NpZ24gc2FmZSBkdW1teSB2YWx1ZXMgaWYgdGhlc2UgdmFyaWFibGVzIGFyZSBub3QgZGVmaW5lZCwKKyMgaW4gb3JkZXIgdG8gc3VwcHJlc3MgZXJyb3IgbWVzc2FnZS4KKyMKK0NPTkZJR19QQUdFX09GRlNFVAk/PSAweDgwMDAwMDAwCitDT05GSUdfTUVNT1JZX1NUQVJUCT89IDB4MGMwMDAwMDAKK0NPTkZJR19CT09UX0xJTktfT0ZGU0VUCT89IDB4MDA4MDAwMDAKK0NPTkZJR19aRVJPX1BBR0VfT0ZGU0VUCT89IDB4MDAwMDEwMDAKKworZXhwb3J0IENPTkZJR19QQUdFX09GRlNFVCBDT05GSUdfTUVNT1JZX1NUQVJUIENPTkZJR19CT09UX0xJTktfT0ZGU0VUIFwKKyAgICAgICBDT05GSUdfWkVST19QQUdFX09GRlNFVAorCit0YXJnZXRzIDo9IHpJbWFnZSB2bWxpbnV4LnNyZWMgdUltYWdlIHVJbWFnZS5zcmVjCiBzdWJkaXItIDo9IGNvbXByZXNzZWQKIAogJChvYmopL3pJbWFnZTogJChvYmopL2NvbXByZXNzZWQvdm1saW51eCBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCi0JQGVjaG8gJ0tlcm5lbDogJEAgaXMgcmVhZHknCisJQGVjaG8gJyAgS2VybmVsOiAkQCBpcyByZWFkeScKIAogJChvYmopL2NvbXByZXNzZWQvdm1saW51eDogRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKG9iaikvY29tcHJlc3NlZCAkQAogCitLRVJORUxfTE9BRAk6PSAkKHNoZWxsIHByaW50ZiAiMHglOHgiICQkWyQoQ09ORklHX1BBR0VfT0ZGU0VUKSAgKyBcCisJCQkJCSAgICAgJChDT05GSUdfTUVNT1JZX1NUQVJUKSArIFwKKwkJCQkJICAgICAkKENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUKSsweDEwMDBdKQorCitxdWlldF9jbWRfdWltYWdlID0gVUlNQUdFICAkQAorICAgICAgY21kX3VpbWFnZSA9ICQoQ09ORklHX1NIRUxMKSAkKE1LSU1BR0UpIC1BIHNoIC1PIGxpbnV4IC1UIGtlcm5lbCBcCisJCSAgIC1DIGd6aXAgLWEgJChLRVJORUxfTE9BRCkgLWUgJChLRVJORUxfTE9BRCkgXAorCQkgICAtbiAnTGludXgtJChLRVJORUxSRUxFQVNFKScgLWQgJDwgJEAKKworJChvYmopL3VJbWFnZTogJChvYmopL3pJbWFnZSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHVpbWFnZSkKKwlAZWNobyAnICBJbWFnZSAkQCBpcyByZWFkeScKKworT0JKQ09QWUZMQUdTX3ZtbGludXguc3JlYyA6PSAtSSBiaW5hcnkgLU8gc3JlYworJChvYmopL3ZtbGludXguc3JlYzogJChvYmopL2NvbXByZXNzZWQvdm1saW51eAorCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCisKK09CSkNPUFlGTEFHU191SW1hZ2Uuc3JlYyA6PSAtSSBiaW5hcnkgLU8gc3JlYworJChvYmopL3VJbWFnZS5zcmVjOiAkKG9iaikvdUltYWdlCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKworY2xlYW4tZmlsZXMJKz0gdUltYWdlIHVJbWFnZS5zcmVjIHZtbGludXguc3JlYwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCBlNWY0NDM3Li5kOTUxMjQxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMTUsMTMgKzE1LDcgQEAKIAogIwogIyBJTUFHRV9PRkZTRVQgaXMgdGhlIGxvYWQgb2Zmc2V0IG9mIHRoZSBjb21wcmVzc2lvbiBsb2FkZXIKLSMgQXNzaWduIGR1bW15IHZhbHVlcyBpZiB0aGVzZSAyIHZhcmlhYmxlcyBhcmUgbm90IGRlZmluZWQsCi0jIGluIG9yZGVyIHRvIHN1cHByZXNzIGVycm9yIG1lc3NhZ2UuCiAjCi1DT05GSUdfUEFHRV9PRkZTRVQJPz0gMHg4MDAwMDAwMAotQ09ORklHX01FTU9SWV9TVEFSVCAgICAgPz0gMHgwYzAwMDAwMAotQ09ORklHX0JPT1RfTElOS19PRkZTRVQgPz0gMHgwMDgwMDAwMAotCiBJTUFHRV9PRkZTRVQJOj0gJChzaGVsbCBwcmludGYgIjB4JTA4eCIgJCRbJChDT05GSUdfUEFHRV9PRkZTRVQpICArIFwKIAkJCQkJICAgICAgJChDT05GSUdfTUVNT1JZX1NUQVJUKSArIFwKIAkJCQkJICAgICAgJChDT05GSUdfQk9PVF9MSU5LX09GRlNFVCldKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IDRjMjZhMTkuLmE4Mzk5YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL2hlYWQuUworKysgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTgsNiArOCw3IEBACiAudGV4dAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIAkuZ2xvYmFsCXN0YXJ0dXAKIHN0YXJ0dXA6CkBAIC05Nyw3ICs5OCw3IEBACiBkZWNvbXByZXNzX2tlcm5lbF9hZGRyOgogCS5sb25nCWRlY29tcHJlc3Nfa2VybmVsCiBrZXJuZWxfc3RhcnRfYWRkcjoKLQkubG9uZwlfdGV4dCsweDEwMDAKKwkubG9uZwlfdGV4dCtQQUdFX1NJWkUKIAogCS5hbGlnbgk5CiBmYWtlX2hlYWRlcnNfYXNfYnpJbWFnZToKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCBmMmZlZDVjLi5kZjY1ZTMwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKKysrIGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0xMiw2ICsxMiw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MKICNpbmNsdWRlIDxhc20vc2hfYmlvcy5oPgogI2VuZGlmCkBAIC0yMjgsNyArMjMwLDcgQEAKIHZvaWQgZGVjb21wcmVzc19rZXJuZWwodm9pZCkKIHsKIAlvdXRwdXRfZGF0YSA9IDA7Ci0Jb3V0cHV0X3B0ciA9ICh1bnNpZ25lZCBsb25nKSZfdGV4dCsweDIwMDAxMDAwOworCW91dHB1dF9wdHIgPSBQMlNFR0FERFIoKHVuc2lnbmVkIGxvbmcpJl90ZXh0K1BBR0VfU0laRSk7CiAJZnJlZV9tZW1fcHRyID0gKHVuc2lnbmVkIGxvbmcpJl9lbmQ7CiAJZnJlZV9tZW1fZW5kX3B0ciA9IGZyZWVfbWVtX3B0ciArIEhFQVBfU0laRTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jIGIvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jCmluZGV4IGJmMWIyOGYuLmY3ZWE3MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9pcnEuYworKysgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvaXJxLmMKQEAgLTE3LDI5ICsxNywxOCBAQAogCiAgICAgQ29weXJpZ2h0IDIwMDMgKGMpIExpbmVvIHVTb2x1dGlvbnMsSW5jLgogKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSN1bmRlZiBERUJVRwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS92b3lhZ2VyZ3guaD4KKyNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC5oPgogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3ZveWFnZXJneF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAl1bnNpZ25lZCBsb25nIG1hc2sgPSAxIDw8IChpcnEgLSBWT1lBR0VSX0lSUV9CQVNFKTsKIAotICAgIAlwcl9kZWJ1ZygiZGlzYWJsZV92b3lhZ2VyZ3hfaXJxKCVkKTogbWFzaz0leFxuIiwgaXJxLCBtYXNrKTsKKyAgICAJcHJfZGVidWcoImRpc2FibGVfdm95YWdlcmd4X2lycSglZCk6IG1hc2s9JWx4XG4iLCBpcnEsIG1hc2spOwogICAgICAgICB2YWwgPSBpbmwoVk9ZQUdFUl9JTlRfTUFTSyk7CiAgICAgICAgIHZhbCAmPSB+bWFzazsKICAgICAgICAgb3V0bCh2YWwsIFZPWUFHRVJfSU5UX01BU0spOwpAQCAtNTAsNyArMzksNyBAQAogICAgICAgICB1bnNpZ25lZCBsb25nIHZhbDsKICAgICAgICAgdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAoaXJxIC0gVk9ZQUdFUl9JUlFfQkFTRSk7CiAKLSAgICAgICAgcHJfZGVidWcoImRpc2FibGVfdm95YWdlcmd4X2lycSglZCk6IG1hc2s9JXhcbiIsIGlycSwgbWFzayk7CisgICAgICAgIHByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSVseFxuIiwgaXJxLCBtYXNrKTsKICAgICAgICAgdmFsID0gaW5sKFZPWUFHRVJfSU5UX01BU0spOwogICAgICAgICB2YWwgfD0gbWFzazsKICAgICAgICAgb3V0bCh2YWwsIFZPWUFHRVJfSU5UX01BU0spOwpAQCAtMTM3LDcgKzEyNiw3IEBACiAJCX0gZWxzZSB7CiAJCQlwcmludGsoIlVuZXhwZWN0ZWQgSVJRIGlycSA9ICVkIHN0YXR1cyA9IDB4JTA4bHhcbiIsIGlycSwgdmFsKTsKIAkJfQotCQlwcl9kZWJ1Zygidm95YWdlcmd4X2lycV9kZW11eCAlZCBcbiIsIGkpOworCQlwcl9kZWJ1Zygidm95YWdlcmd4X2lycV9kZW11eCAlbGRcbiIsIGkpOwogI2Vsc2UKIAkJZm9yIChiaXQgPSAxLCBpID0gMCA7IGkgPCBWT1lBR0VSX0lSUV9OVU0gOyBiaXQgPDw9IDEsIGkrKykKIAkJCWlmICh2YWwgJiBiaXQpCkBAIC0xODUsNCArMTc0LDMgQEAKIAogCXNldHVwX2lycShJUlFfVk9ZQUdFUiwgJmlycTApOwogfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvbGFuZGlza19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvbGFuZGlza19kZWZjb25maWcKaW5kZXggMjM4YzBmMS4uZTdmOGRkYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2xhbmRpc2tfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9sYW5kaXNrX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOAotIyBUdWUgT2N0ICAzIDExOjE0OjEzIDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOQorIyBUaHUgRGVjICA3IDE3OjEzOjA0IDIwMDYKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQpAQCAtMTAsNiArMTAsOSBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTMzLDYgKzM2LDcgQEAKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKQEAgLTExNCw2ICsxMTgsOCBAQAogQ09ORklHX1NIX0xBTkRJU0s9eQogIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAogIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzIwNl9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzYxOV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAogIyBDT05GSUdfU0hfVU5LTk9XTiBpcyBub3Qgc2V0CiAKICMKQEAgLTEyNSw2ICsxMzEsMTIgQEAKICMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0CisKKyMKKyMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNiBpcyBub3Qgc2V0CiAKICMKICMgU0gtMyBQcm9jZXNzb3IgU3VwcG9ydApAQCAtMTYwLDYgKzE3Miw3IEBACiAjCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0CiAKICMKICMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0CkBAIC0xNzUsNiArMTg4LDkgQEAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDQwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTE5NiwxNiArMjEyLDIxIEBACiAjIFByb2Nlc3NvciBmZWF0dXJlcwogIwogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19TSF9GUFU9eQogIyBDT05GSUdfU0hfRFNQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUT1JFX1FVRVVFUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiBDT05GSUdfQ1BVX0hBU19TUl9SQj15CitDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIwogIyBUaW1lciBzdXBwb3J0CiAjCiBDT05GSUdfU0hfVE1VPXkKK0NPTkZJR19TSF9USU1FUl9JUlE9MTYKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAogQ09ORklHX1NIX1BDTEtfRlJFUT0zMzMzMzMzMwogCiAjCkBAIC0yMTYsOSArMjM3LDcgQEAKICMKICMgRE1BIHN1cHBvcnQKICMKLUNPTkZJR19TSF9ETUE9eQotQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFM9NAotIyBDT05GSUdfTlJfRE1BX0NIQU5ORUxTX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRE1BIGlzIG5vdCBzZXQKIAogIwogIyBDb21wYW5pb24gQ2hpcHMKQEAgLTIyNyw2ICsyNDYsMTEgQEAKIENPTkZJR19IRUFSVEJFQVQ9eQogCiAjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19QVVNIX1NXSVRDSCBpcyBub3Qgc2V0CisKKyMKICMgS2VybmVsIGZlYXR1cmVzCiAjCiAjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldApAQCAtMzQwLDExICszNjQsMTMgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKIAogIwogIyBJUDogVmlydHVhbCBTZXJ2ZXIgQ29uZmlndXJhdGlvbgpAQCAtMzYxLDI0ICszODcsMTIgQEAKICMgQ29yZSBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfTkVURklMVEVSX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfTkZfQ09OTlRSQUNLX0VOQUJMRUQgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSX1hUQUJMRVMgaXMgbm90IHNldAogCiAjCiAjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgogIwotQ09ORklHX0lQX05GX0NPTk5UUkFDSz1tCi1DT05GSUdfSVBfTkZfQ1RfQUNDVD15Ci1DT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUks9eQotIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9DVF9QUk9UT19TQ1RQIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9GVFA9bQotQ09ORklHX0lQX05GX0lSQz1tCi0jIENPTkZJR19JUF9ORl9ORVRCSU9TX05TIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9URlRQPW0KLUNPTkZJR19JUF9ORl9BTUFOREE9bQotIyBDT05GSUdfSVBfTkZfUFBUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9IMzIzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1NJUCBpcyBub3Qgc2V0CiBDT05GSUdfSVBfTkZfUVVFVUU9bQogCiAjCkBAIC00NzcsNiArNDkxLDEyIEBACiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCiAjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIwogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiBDT05GSUdfSURFPXkKQEAgLTUxOSw2ICs1MzksNyBAQAogIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9KTUlDUk9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lUODIxWCBpcyBub3Qgc2V0CkBAIC01NDIsNiArNTYzLDcgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX1BST0NfRlM9eQogCkBAIC01NjEsNiArNTgzLDcgQEAKIENPTkZJR19TQ1NJX01VTFRJX0xVTj15CiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIFRyYW5zcG9ydHMKQEAgLTYwMiwxMiArNjI1LDEyIEBACiAjIENPTkZJR19TQ1NJX05DUjUzQzQwNkEgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9QQVMxNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1BTSTI0MEkgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfRkFTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1lNNTNDNDE2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKQEAgLTYxNSw2ICs2MzgsNyBAQAogIyBDT05GSUdfU0NTSV9UMTI4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CiAKICMKICMgUENNQ0lBIFNDU0kgYWRhcHRlciBzdXBwb3J0CkBAIC03NTcsNiArNzgxLDcgQEAKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKQEAgLTg3MSwxMCArODk2LDYgQEAKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKIAogIwpAQCAtODg5LDcgKzkxMCw2IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgc3VwcG9ydApAQCAtOTA1LDYgKzkyNSw3IEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKQEAgLTkxNywxMCArOTM4LDYgQEAKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogQ09ORklHX1ZJREVPX0RFVj1tCkBAIC0xMDM3LDYgKzEwNTQsNyBAQAogQ09ORklHX1VTQl9ERVZJQ0VGUz15CiAjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CiAKICMKQEAgLTExMDYsNyArMTEyNCw2IEBACiAjIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEltYWdpbmcgZGV2aWNlcwpAQCAtMTEyMSw2ICsxMTM4LDcgQEAKICMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAogQ09ORklHX1VTQl9QRUdBU1VTPW0KIENPTkZJR19VU0JfUlRMODE1MD1tCisjIENPTkZJR19VU0JfVVNCTkVUX01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfTU9OPXkKIApAQCAtMTE1Niw2ICsxMTc0LDcgQEAKICMgQ09ORklHX1VTQl9TRVJJQUxfS0xTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX0tPQklMX1NDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX01DVF9VMjMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTU9TNzcyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX01PUzc4NDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NFUklBTF9OQVZNQU4gaXMgbm90IHNldAogQ09ORklHX1VTQl9TRVJJQUxfUEwyMzAzPW0KQEAgLTExNjcsNiArMTE4Niw3IEBACiAjIENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX09QVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX09NTklORVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycwpAQCAtMTE4OCw2ICsxMjA4LDcgQEAKIENPTkZJR19VU0JfU0lTVVNCVkdBPW0KIENPTkZJR19VU0JfU0lTVVNCVkdBX0NPTj15CiAjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTI1NCw2ICsxMjc1LDcgQEAKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CkBAIC0xMjY0LDYgKzEyODYsNyBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfUk9NRlNfRlM9eQpAQCAtMTQxNCw2ICsxNDM3LDcgQEAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CkBAIC0xNDIyLDYgKzE0NDYsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfUFJJTlRLIGlzIG5vdCBzZXQKQEAgLTE0NDUsNiArMTQ3MCw0IEBACiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKLUNPTkZJR19URVhUU0VBUkNIPXkKLUNPTkZJR19URVhUU0VBUkNIX0tNUD1tCiBDT05GSUdfUExJU1Q9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3I3NzgwcnBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3I3NzgwcnBfZGVmY29uZmlnCmluZGV4IDI0NzAzNjQuLjJiNzViNDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9yNzc4MHJwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBycF9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgVHVlIE9jdCAgMyAxMTozMjo0NyAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTkKKyMgV2VkIERlYyAgNiAxMTo1OTozOCAyMDA2CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTEwLDYgKzEwLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0zNiw2ICszOSw3IEBACiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKQEAgLTExNyw2ICsxMjEsOCBAQAogIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKIAogIwpAQCAtMTI5LDYgKzEzNSwxMiBAQAogIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0CiAjCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKworIworIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKIAogIwogIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CkBAIC0xNjQsNiArMTc2LDcgQEAKICMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0CiAKICMKICMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0CkBAIC0xNzgsMTAgKzE5MSwxNiBAQAogQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwODAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDgwMDAwMDAKLUNPTkZJR18zMkJJVD15CisjIENPTkZJR18zMkJJVCBpcyBub3Qgc2V0CiBDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CiBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTIwMywxMiArMjIyLDE0IEBACiAjIFByb2Nlc3NvciBmZWF0dXJlcwogIwogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19TSF9GUFU9eQogIyBDT05GSUdfU0hfRFNQIGlzIG5vdCBzZXQKIENPTkZJR19TSF9TVE9SRV9RVUVVRVM9eQogQ09ORklHX0NQVV9IQVNfSU5URVZUPXkKIENPTkZJR19DUFVfSEFTX0lOVEMyX0lSUT15CiBDT05GSUdfQ1BVX0hBU19TUl9SQj15CitDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIwogIyBUaW1lciBzdXBwb3J0CkBAIC0yMTksNiArMjQwLDggQEAKICMgUjc3ODBSUCBvcHRpb25zCiAjCiBDT05GSUdfU0hfUjc3ODBNUD15CitDT05GSUdfU0hfVElNRVJfSVJRPTI4CitDT05GSUdfTk9fSURMRV9IWj15CiBDT05GSUdfU0hfUENMS19GUkVRPTMyMDAwMDAwCiAKICMKQEAgLTIyOSw5ICsyNTIsNyBAQAogIwogIyBETUEgc3VwcG9ydAogIwotQ09ORklHX1NIX0RNQT15Ci1DT05GSUdfTlJfT05DSElQX0RNQV9DSEFOTkVMUz02Ci0jIENPTkZJR19OUl9ETUFfQ0hBTk5FTFNfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9ETUEgaXMgbm90IHNldAogCiAjCiAjIENvbXBhbmlvbiBDaGlwcwpAQCAtMjM5LDEzICsyNjAsMTggQEAKICMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKIAogIworIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX1BVU0hfU1dJVENIPXkKKworIwogIyBLZXJuZWwgZmVhdHVyZXMKICMKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFpfMjUwPXkKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAotIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX0tFWEVDPXkKICMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldApAQCAtMjU5LDcgKzI4NSw3IEBACiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiAjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9Im1lbT0xMjhNIGNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvaGRhMSIKK0NPTkZJR19DTURMSU5FPSJtZW09MTI4TSBjb25zb2xlPXR0eVNDMCwxMTUyMDAgcm9vdD0vZGV2L3NkYTEiCiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTI3OSwxMCArMzA1LDcgQEAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydAogIwotQ09ORklHX0hPVFBMVUdfUENJPXkKLSMgQ09ORklHX0hPVFBMVUdfUENJX0ZBS0UgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVR19QQ0lfQ1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHX1BDSV9TSFBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKIAogIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwpAQCAtMzM2LDExICszNTksMTMgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKQEAgLTQ0MSw3NiArNDY2LDI4IEBACiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCiAjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIwogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCi1DT05GSUdfSURFPW0KLUNPTkZJR19JREVfTUFYX0hXSUZTPTQKLUNPTkZJR19CTEtfREVWX0lERT1tCi0KLSMKLSMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCi0jCi1DT05GSUdfQkxLX0RFVl9JREVfU0FUQT15Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPW0KLUNPTkZJR19JREVESVNLX01VTFRJX01PREU9eQotIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFU0NTST1tCi0jIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0Ci0KLSMKLSMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwotIwotQ09ORklHX0lERV9HRU5FUklDPW0KLUNPTkZJR19CTEtfREVWX0lERVBDST15Ci1DT05GSUdfSURFUENJX1NIQVJFX0lSUT15Ci0jIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0dFTkVSSUM9bQotIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQotIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19JREVETUFfUENJX0FVVE89eQotIyBDT05GSUdfSURFRE1BX09OTFlESVNLIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0FFQzYyWFg9bQotIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVz1tCi0jIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1NJSU1BR0U9bQotIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lERURNQT15Ci0jIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKLUNPTkZJR19JREVETUFfQVVUTz15Ci0jIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTST1tCitDT05GSUdfU0NTST15CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAogQ09ORklHX1NDU0lfUFJPQ19GUz15CiAKICMKICMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKICMKLUNPTkZJR19CTEtfREVWX1NEPW0KK0NPTkZJR19CTEtfREVWX1NEPXkKICMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAogIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldApAQCAtNTYxLDYgKzUzOCw3IEBACiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CkBAIC01NzAsNyArNTQ4LDU3IEBACiAjCiAjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwogIwotIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfU0FUQV9BSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTVYgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9OViBpcyBub3Qgc2V0CisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9TSUw9eQorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJVEVTU0UgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NZUFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9FRkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUMzdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gyTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0lUODIxWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTUFSVkVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDMjAyN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSUw2ODAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX1BMQVRGT1JNPXkKIAogIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQpAQCAtNjg3LDYgKzcxNSw3IEBACiAjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKICMgQ09ORklHX1MySU8gaXMgbm90IHNldAogIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CiAKICMKICMgVG9rZW4gUmluZyBkZXZpY2VzCkBAIC04MjksMTAgKzg1OCw2IEBACiAjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKICMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIApAQCAtODQwLDcgKzg2NSw2IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKIAogIwogIyBJMkMgc3VwcG9ydApAQCAtODU2LDYgKzg4MCw3IEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKQEAgLTg2OCwxNCArODkzLDkgQEAKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19WNEwyPXkKIAogIwogIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCkBAIC05NTksNyArOTc5LDI5IEBACiAjCiAjIFJlYWwgVGltZSBDbG9jawogIwotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorCisjCisjIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9TSD15CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgRE1BIEVuZ2luZSBzdXBwb3J0CkBAIC05ODQsNiArMTAyNiw3IEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQpAQCAtOTkxLDYgKzEwMzQsNyBAQAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX01JTklYX0ZTPXkKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTEwMDAsNyArMTA0NCw3IEBACiBDT05GSUdfRE5PVElGWT15CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFX0ZTPW0KIAogIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCkBAIC0xMDI3LDExICsxMDcxLDEyIEBACiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogQ09ORklHX0hVR0VUTEJGUz15CiBDT05GSUdfSFVHRVRMQl9QQUdFPXkKIENPTkZJR19SQU1GUz15Ci0jIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQ09ORklHRlNfRlM9bQogCiAjCiAjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKQEAgLTExMzIsMzcgKzExNzcsNDMgQEAKICMKICMgUHJvZmlsaW5nIHN1cHBvcnQKICMKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19PUFJPRklMRT1tCiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19QUklOVEtfVElNRT15CiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQotIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorQ09ORklHX01BR0lDX1NZU1JRPXkKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX1NQSU5MT0NLPXkKKyMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15CiBDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKICMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKICMgQ09ORklHX0tHREIgaXMgbm90IHNldApAQCAtMTE3OCw5ICsxMjI5LDkgQEAKICMKIENPTkZJR19DUllQVE89eQogQ09ORklHX0NSWVBUT19BTEdBUEk9eQotQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9bQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQogQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj1tCitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19ITUFDPXkKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldApAQCAtMTE5MSw3ICsxMjQyLDcgQEAKICMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fRUNCPW0KLUNPTkZJR19DUllQVE9fQ0JDPW0KK0NPTkZJR19DUllQVE9fQ0JDPXkKIENPTkZJR19DUllQVE9fREVTPXkKICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTcyMDZfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWI5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwpAQCAtMCwwICsxLDg5MCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5CisjIFdlZCBEZWMgIDYgMTQ6NDA6MTUgMjAwNgorIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19VSUQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlMgaXMgbm90IHNldAorQ09ORklHX1RJTllfU0hNRU09eQorQ09ORklHX0JBU0VfU01BTEw9MQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX05PT1A9eQorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKKworIworIyBTeXN0ZW0gdHlwZQorIworIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAorIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAorIyBDT05GSUdfU0hfRUMzMTA0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NBVFVSTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9EUkVBTUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAorIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAorQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKKyMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzZWxlY3Rpb24KKyMKK0NPTkZJR19DUFVfU0gyPXkKK0NPTkZJR19DUFVfU0gyQT15CisKKyMKKyMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0CisKKyMKKyMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKKyMKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDY9eQorCisjCisjIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0CisKKyMKKyMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorCisjCisjIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAorCisjCisjIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0CisKKyMKKyMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1BBR0VfT0ZGU0VUPTB4MDAwMDAwMDAKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDQwMDAwMDAKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCisjIENPTkZJR19DUFVfTElUVExFX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0JJR19FTkRJQU49eQorIyBDT05GSUdfU0hfRlBVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0ZQVV9FTVUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRFNQIGlzIG5vdCBzZXQKKworIworIyBUaW1lciBzdXBwb3J0CisjCitDT05GSUdfU0hfQ01UPXkKKyMgQ09ORklHX1NIX01UVTIgaXMgbm90IHNldAorQ09ORklHX1NIX1RJTUVSX0lSUT0xNDAKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAorQ09ORklHX1NIX1BDTEtfRlJFUT0zMzMzMzMzMworQ09ORklHX1NIX0NMS19NRD02CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisjIENPTkZJR19IRDY0NDZYX1NFUklFUyBpcyBub3Qgc2V0CisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgZmVhdHVyZXMKKyMKK0NPTkZJR19IWl8xMDA9eQorIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCitDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCisjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9GTEFUPXkKK0NPTkZJR19CSU5GTVRfWkZMQVQ9eQorIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFkgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgyMDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAxMDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTQKKyMgQ09ORklHX01URF9TT0xVVElPTkVOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19TVE5JQyBpcyBub3Qgc2V0CitDT05GSUdfU01DOTFYPXkKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfU0hfU0NJPXkKK0NPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1VOSVg5OF9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBTUEkgc3VwcG9ydAorIworIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCisjIERNQSBFbmdpbmUgc3VwcG9ydAorIworIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIENsaWVudHMKKyMKKworIworIyBETUEgRGV2aWNlcworIworCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfRlM9eQorIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKKyMgQ09ORklHX1NZU0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCisjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc2MTlfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYWM3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwpAQCAtMCwwICsxLDc0NCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5CisjIFdlZCBEZWMgIDYgMTY6MzU6MzYgMjAwNgorIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfVUlEMTYgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVVEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKK0NPTkZJR19USU5ZX1NITUVNPXkKK0NPTkZJR19CQVNFX1NNQUxMPTEKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9OT09QPXkKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCisKKyMKKyMgU3lzdGVtIHR5cGUKKyMKKyMgQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAorIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15CisjIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc2VsZWN0aW9uCisjCitDT05GSUdfQ1BVX1NIMj15CisKKyMKKyMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTk9eQorCisjCisjIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAorCisjCisjIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0CisKKyMKKyMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorCisjCisjIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAorCisjCisjIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0CisKKyMKKyMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1BBR0VfT0ZGU0VUPTB4MDAwMDAwMDAKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDQwMDAwMDAKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9XUklURVRIUk9VR0g9eQorIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKKyMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CisKKyMKKyMgVGltZXIgc3VwcG9ydAorIworQ09ORklHX1NIX0NNVD15CitDT05GSUdfU0hfVElNRVJfSVJRPTg2CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9QQ0xLX0ZSRVE9MzEyNTAwMDAKK0NPTkZJR19TSF9DTEtfTUQ9NQorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorCisjCisjIERNQSBzdXBwb3J0CisjCisjIENPTkZJR19TSF9ETUEgaXMgbm90IHNldAorCisjCisjIENvbXBhbmlvbiBDaGlwcworIworIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorCisjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19QVVNIX1NXSVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGZlYXR1cmVzCisjCitDT05GSUdfSFpfMTAwPXkKKyMgQ09ORklHX0haXzI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0xMDAKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorCisjCisjIEJ1cyBvcHRpb25zCisjCisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRkxBVD15CitDT05GSUdfQklORk1UX1pGTEFUPXkKKyMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX1JFREJPT1RfUEFSVFM9eQorQ09ORklHX01URF9SRURCT09UX0RJUkVDVE9SWV9CTE9DSz0tMQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFkgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHhhMDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAxMDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKKyMgQ09ORklHX01URF9TT0xVVElPTkVOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TSF9TQ0k9eQorQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFM9MworQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorQ09ORklHX1JPTUZTX0ZTPXkKKyMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CisjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOV0lORF9JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKaW5kZXggNWU4MTc1NC4uNDEwNDljZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4Ci0jIFR1ZSBPY3QgIDMgMTI6NTk6MTQgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LXJjMworIyBNb24gT2N0IDMwIDE4OjA0OjQ5IDIwMDYKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQpAQCAtMTAsNiArMTAsNyBAQAogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisjIENPTkZJR19HRU5FUklDX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwpAQCAtMjMsNyArMjQsNyBAQAogIyBHZW5lcmFsIHNldHVwCiAjCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKQEAgLTIzNiw4ICsyMzcsOCBAQAogQ09ORklHX0haPTI1MAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAogIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKIAogIwpAQCAtMjQ3LDcgKzI0OCw3IEBACiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwOWUwMDAwCiAjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MxLDM4NDAwTjgxIHJvb3Q9L2Rldi9uZnMgaXA9Ojo6OjpldGgxOmF1dG9jb25mIgorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MxLDM4NDAwTjgxIHJvb3Q9L2Rldi9uZnMgaXA9Ojo6OjpldGgxOmF1dG9jb25mIHJ3IgogCiAjCiAjIEJ1cyBvcHRpb25zCkBAIC0zMzQsNiArMzM1LDcgQEAKIENPTkZJR19JTkVUX1RVTk5FTD15CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQogQ09ORklHX0lORVRfRElBRz1tCiBDT05GSUdfSU5FVF9UQ1BfRElBRz1tCiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CkBAIC0zNTUsOSArMzU3LDEwIEBACiBDT05GSUdfSU5FVDZfVFVOTkVMPXkKIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD15CiAjIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAorQ09ORklHX0lQVjZfU0lUPW0KIENPTkZJR19JUFY2X1RVTk5FTD15Ci0jIENPTkZJR19JUFY2X1NVQlRSRUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiBDT05GSUdfTkVURklMVEVSPXkKQEAgLTcxNCw2ICs3MTcsMTIgQEAKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQogCiAjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIwogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiAjIENPTkZJR19JREUgaXMgbm90IHNldApAQCAtNzc4LDkgKzc4Nyw5IEBACiAjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldApAQCAtMTA5NSw3ICsxMTA0LDYgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC0xMTI0LDE0ICsxMTMyLDkgQEAKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19WNEwyPXkKIAogIwogIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCkBAIC0xMTc3LDkgKzExODAsOSBAQAogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKICMKIENPTkZJR19VU0JfRUhDSV9IQ0Q9eQotIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfRUhDSV9TUExJVF9JU089eQorQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUPXkKK0NPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRD15CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD15CiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKQEAgLTEyMzUsNyArMTIzOCw2IEBACiAjIENPTkZJR19VU0JfQVRJX1JFTU9URTIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEltYWdpbmcgZGV2aWNlcwpAQCAtMTI0NiwxMSArMTI0OCwyMCBAQAogIwogIyBVU0IgTmV0d29yayBBZGFwdGVycwogIwotIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfQ0FUQz1tCitDT05GSUdfVVNCX0tBV0VUSD1tCitDT05GSUdfVVNCX1BFR0FTVVM9bQorQ09ORklHX1VTQl9SVEw4MTUwPW0KK0NPTkZJR19VU0JfVVNCTkVUPW0KK0NPTkZJR19VU0JfTkVUX0FYODgxN1g9bQorQ09ORklHX1VTQl9ORVRfQ0RDRVRIRVI9bQorIyBDT05GSUdfVVNCX05FVF9HTDYyMEEgaXMgbm90IHNldAorQ09ORklHX1VTQl9ORVRfTkVUMTA4MD1tCitDT05GSUdfVVNCX05FVF9QTFVTQj1tCisjIENPTkZJR19VU0JfTkVUX01DUzc4MzAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9STkRJU19IT1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ORVRfQ0RDX1NVQlNFVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX05FVF9aQVVSVVM9bQogQ09ORklHX1VTQl9NT049eQogCiAjCkBAIC0xMjg1LDYgKzEyOTYsNyBAQAogIyBDT05GSUdfVVNCX1NFUklBTF9LTFNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TRVJJQUxfTUNUX1UyMzIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NT1M3NzIwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TRVJJQUxfTU9TNzg0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX05BVk1BTiBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX1NFUklBTF9QTDIzMDM9bQpAQCAtMTMxNiw2ICsxMzI4LDcgQEAKICMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NJU1VTQlZHQSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTM1Nyw3ICsxMzcwLDI2IEBACiAjCiAjIFJlYWwgVGltZSBDbG9jawogIwotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPW0KK0NPTkZJR19SVENfQ0xBU1M9bQorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9bQorQ09ORklHX1JUQ19JTlRGX1BST0M9bQorQ09ORklHX1JUQ19JTlRGX0RFVj1tCisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorCisjCisjIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9TSD1tCisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgRE1BIEVuZ2luZSBzdXBwb3J0CkBAIC0xMzgwLDggKzE0MTIsMTIgQEAKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKICMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0VYVDRERVZfRlM9bQorIyBDT05GSUdfRVhUNERFVl9GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfSkJEMj1tCisjIENPTkZJR19KQkQyX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19SRUlTRVJGU19GUz1tCiAjIENPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19QUk9DX0lORk8gaXMgbm90IHNldApAQCAtMTM5Myw5ICsxNDI5LDEwIEBACiAjIENPTkZJR19YRlNfU0VDVVJJVFkgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfRlM9eQogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CkBAIC0xNDgwLDcgKzE1MTcsMTIgQEAKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCiAjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CitDT05GSUdfQ0lGUz1tCisjIENPTkZJR19DSUZTX1NUQVRTIGlzIG5vdCBzZXQKK0NPTkZJR19DSUZTX1dFQUtfUFdfSEFTSD15CisjIENPTkZJR19DSUZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CkBAIC0xNTgzLDkgKzE2MjUsMTAgQEAKICMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAogIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19GT1JDRURfSU5MSU5JTkcgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAotQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRT15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldApAQCAtMTYwNSw3ICsxNjQ4LDcgQEAKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKIENPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKIENPTkZJR19DUllQVE9fSEFTSD15Ci1DT05GSUdfQ1JZUFRPX01BTkFHRVI9bQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fSE1BQz15CiBDT05GSUdfQ1JZUFRPX05VTEw9bQogQ09ORklHX0NSWVBUT19NRDQ9bQpAQCAtMTYxNSw3ICsxNjU4LDcgQEAKIENPTkZJR19DUllQVE9fU0hBNTEyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQotQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19FQ0I9eQogQ09ORklHX0NSWVBUT19DQkM9eQogQ09ORklHX0NSWVBUT19ERVM9eQogQ09ORklHX0NSWVBUT19CTE9XRklTSD1tCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NGM3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2RyaXZlcnMvS2NvbmZpZwpAQCAtMCwwICsxLDkgQEAKK21lbnUgIkFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzIgorCitjb25maWcgUFVTSF9TV0lUQ0gKKwl0cmlzdGF0ZSAiUHVzaCBzd2l0Y2ggc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHB1c2ggc3dpdGNoIGZyYW1ld29yaywgYSBzaW1wbGUKKwkgIGZyYW1ld29yayB0aGF0IGFsbG93cyBmb3Igc3lzZnMgZHJpdmVuIHN3aXRjaCBzdGF0dXMgcmVwb3J0aW5nLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvTWFrZWZpbGUgYi9hcmNoL3NoL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggMzM4YzM3Mi4uYmYxOGRiZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvZHJpdmVycy9NYWtlZmlsZQpAQCAtNSw0ICs1LDQgQEAKIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kvCiBvYmotJChDT05GSUdfU0hfRE1BKQkJKz0gZG1hLwogb2JqLSQoQ09ORklHX1NVUEVSSFlXQVkpCSs9IHN1cGVyaHl3YXkvCi0KK29iai0kKENPTkZJR19QVVNIX1NXSVRDSCkJKz0gcHVzaC1zd2l0Y2gubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9NYWtlZmlsZSBiL2FyY2gvc2gvZHJpdmVycy9kbWEvTWFrZWZpbGUKaW5kZXggMDY1ZDRjOS4uZGIxMjk1ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL01ha2VmaWxlCkBAIC0yLDggKzIsOCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIFN1cGVySCBETUEgc3BlY2lmaWMga2VybmVsIGludGVyZmFjZSByb3V0aW5lcyB1bmRlciBMaW51eC4KICMKIAotb2JqLXkJCQkJKz0gZG1hLWFwaS5vIGRtYS1pc2Eubworb2JqLXkJCQkJKz0gZG1hLWFwaS5vCitvYmotJChDT05GSUdfSVNBX0RNQV9BUEkpCSs9IGRtYS1pc2Eubwogb2JqLSQoQ09ORklHX1NZU0ZTKQkJKz0gZG1hLXN5c2ZzLm8KIG9iai0kKENPTkZJR19TSF9ETUEpCQkrPSBkbWEtc2gubwogb2JqLSQoQ09ORklHX1NIX0RSRUFNQ0FTVCkJKz0gZG1hLXB2cjIubyBkbWEtZzIubwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1hcGkuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWFwaS5jCmluZGV4IDQ3YzNlODMuLmUwNjIwNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWFwaS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWFwaS5jCkBAIC0xMSw2MSArMTEsMjcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKIERFRklORV9TUElOTE9DSyhkbWFfc3Bpbl9sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQocmVnaXN0ZXJlZF9kbWFjX2xpc3QpOwogCi0vKgotICogQSBicmllZiBub3RlIGFib3V0IHRoZSByZWFzb25zIGZvciB0aGlzIEFQSSBhcyBpdCBzdGFuZHMuCi0gKgotICogRm9yIHN0YXJ0ZXJzLCB0aGUgb2xkIElTQSBETUEgQVBJIGRpZG4ndCB3b3JrIGZvciB1cyBmb3IgYSBudW1iZXIgb2YKLSAqIHJlYXNvbnMsIGZvciBvbmUsIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNoYW5uZWxzIG9uIHRoZSBTSCBETUFDIGFyZQotICogZHVhbC1hZGRyZXNzIG1vZGUgb25seSwgYW5kIGJvdGggdGhlIG5ldyBhbmQgdGhlIG9sZCBETUEgQVBJcyBhcmUgYWZ0ZXIgdGhlCi0gKiBjb25jZXB0IG9mIG1hbmFnaW5nIGEgRE1BIGJ1ZmZlciwgd2hpY2ggZG9lc24ndCBvdmVybHkgZml0IHRoaXMgbW9kZWwgdmVyeQotICogd2VsbC4gSW4gYWRkaXRpb24gdG8gd2hpY2gsIHRoZSBuZXcgQVBJIGlzIGxhcmdlbHkgZ2VhcmVkIGF0IElPTU1VcyBhbmQKLSAqIEdBUlRzLCBhbmQgZG9lc24ndCBldmVuIHN1cHBvcnQgdGhlIGNoYW5uZWwgbm90aW9uIHZlcnkgd2VsbC4KLSAqCi0gKiBUaGUgb3RoZXIgdGhpbmcgdGhhdCdzIGEgbWFyZ2luYWwgaXNzdWUsIGlzIHRoZSBzaGVlciBudW1iZXIgb2YgcmFuZG9tIERNQQotICogZW5naW5lcyB0aGF0IGFyZSBwcmVzZW50IChpZSwgaW4gYm9hcmRzIGxpa2UgdGhlIERyZWFtY2FzdCksIHNvbWUgb2Ygd2hpY2gKLSAqIGNhc2NhZGUgb2ZmIG9mIHRoZSBTSCBETUFDLCBhbmQgb3RoZXJzIGRvIG5vdC4gQXMgc3VjaCwgdGhlcmUgd2FzIGEgcmVhbAotICogbmVlZCBmb3IgYSBzY2FsYWJsZSBzdWJzeXN0ZW0gdGhhdCBjb3VsZCBkZWFsIHdpdGggYm90aCBzaW5nbGUgYW5kCi0gKiBkdWFsLWFkZHJlc3MgbW9kZSB1c2FnZSwgaW4gYWRkaXRpb24gdG8gaW50ZXJvcGVyYXRpbmcgd2l0aCBjYXNjYWRlZCBETUFDcy4KLSAqCi0gKiBUaGVyZSByZWFsbHkgaXNuJ3QgYW55IHJlYXNvbiB3aHkgdGhpcyBuZWVkcyB0byBiZSBTSCBzcGVjaWZpYywgdGhvdWdoIEknbQotICogbm90IGF3YXJlIG9mIHRvbyBtYW55IG90aGVyIHByb2Nlc3NvcnMgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBzb21lIE1JUFMpCi0gKiB0aGF0IGhhdmUgdGhlIHNhbWUgY29uY2VwdCBvZiBhIGR1YWwgYWRkcmVzcyBtb2RlLCBvciBhbnkgcmVhbCBkZXNpcmUgdG8KLSAqIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBETUFDIGV2ZW4gaWYgc3VjaCBhIHN1YnN5c3RlbSB3ZXJlIGV4cG9zZWQKLSAqIGVsc2V3aGVyZS4KLSAqCi0gKiBUaGUgaWRlYSBmb3IgdGhpcyB3YXMgZGVyaXZlZCBmcm9tIHRoZSBBUk0gcG9ydCwgd2hpY2ggYWN0ZWQgYXMgYW4gZXhjZWxsZW50Ci0gKiByZWZlcmVuY2Ugd2hlbiB0cnlpbmcgdG8gYWRkcmVzcyB0aGVzZSBpc3N1ZXMuCi0gKgotICogSXQgc2hvdWxkIGFsc28gYmUgbm90ZWQgdGhhdCB0aGUgZGVjaXNpb24gdG8gYWRkIFlldCBBbm90aGVyIERNQSBBUEkodG0pIHRvCi0gKiB0aGUga2VybmVsIHdhc24ndCBtYWRlIGVhc2lseSwgYW5kIHdhcyBvbmx5IGRlY2lkZWQgdXBvbiBhZnRlciBjb25mZXJyaW5nCi0gKiB3aXRoIGplamIgd2l0aCByZWdhcmRzIHRvIHRoZSBzdGF0ZSBvZiB0aGUgb2xkIGFuZCBuZXcgQVBJcyBhcyB0aGV5IGFwcGxpZWQKLSAqIHRvIHRoZXNlIGNpcmN1bXN0YW5jZXMuIFBoaWxpcCBCbHVuZGVsbCB3YXMgYWxzbyBhIGdyZWF0IGhlbHAgaW4gZmlndXJpbmcKLSAqIG91dCBzb21lIHNpbmdsZS1hZGRyZXNzIG1vZGUgRE1BIHNlbWFudGljcyB0aGF0IHdlcmUgb3RoZXJ3aXNlIHJhdGhlcgotICogY29uZnVzaW5nLgotICovCi0KIHN0cnVjdCBkbWFfaW5mbyAqZ2V0X2RtYV9pbmZvKHVuc2lnbmVkIGludCBjaGFuKQogewogCXN0cnVjdCBkbWFfaW5mbyAqaW5mbzsKLQl1bnNpZ25lZCBpbnQgdG90YWwgPSAwOwogCiAJLyoKIAkgKiBMb29rIGZvciBlYWNoIERNQUMncyByYW5nZSB0byBkZXRlcm1pbmUgd2hvIHRoZSBvd25lciBvZgogCSAqIHRoZSBjaGFubmVsIGlzLgogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJnJlZ2lzdGVyZWRfZG1hY19saXN0LCBsaXN0KSB7Ci0JCXRvdGFsICs9IGluZm8tPm5yX2NoYW5uZWxzOwotCQlpZiAoY2hhbiA+IHRvdGFsKQorCQlpZiAoKGNoYW4gPCAgaW5mby0+Zmlyc3RfY2hhbm5lbF9ucikgfHwKKwkJICAgIChjaGFuID49IGluZm8tPmZpcnN0X2NoYW5uZWxfbnIgKyBpbmZvLT5ucl9jaGFubmVscykpCiAJCQljb250aW51ZTsKIAogCQlyZXR1cm4gaW5mbzsKQEAgLTczLDYgKzM5LDIyIEBACiAKIAlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woZ2V0X2RtYV9pbmZvKTsKKworc3RydWN0IGRtYV9pbmZvICpnZXRfZG1hX2luZm9fYnlfbmFtZShjb25zdCBjaGFyICpkbWFjX25hbWUpCit7CisJc3RydWN0IGRtYV9pbmZvICppbmZvOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAmcmVnaXN0ZXJlZF9kbWFjX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGRtYWNfbmFtZSAmJiAoc3RyY21wKGRtYWNfbmFtZSwgaW5mby0+bmFtZSkgIT0gMCkpCisJCQljb250aW51ZTsKKwkJZWxzZQorCQkJcmV0dXJuIGluZm87CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGdldF9kbWFfaW5mb19ieV9uYW1lKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbnJfY2hhbm5lbHModm9pZCkKIHsKQEAgLTkxLDYzICs3MywxNjEgQEAKIHN0cnVjdCBkbWFfY2hhbm5lbCAqZ2V0X2RtYV9jaGFubmVsKHVuc2lnbmVkIGludCBjaGFuKQogewogCXN0cnVjdCBkbWFfaW5mbyAqaW5mbyA9IGdldF9kbWFfaW5mbyhjaGFuKTsKKwlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWw7CisJaW50IGk7CiAKLQlpZiAoIWluZm8pCisJaWYgKHVubGlrZWx5KCFpbmZvKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQlyZXR1cm4gaW5mby0+Y2hhbm5lbHMgKyBjaGFuOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5ucl9jaGFubmVsczsgaSsrKSB7CisJCWNoYW5uZWwgPSAmaW5mby0+Y2hhbm5lbHNbaV07CisJCWlmIChjaGFubmVsLT5jaGFuID09IGNoYW4pCisJCQlyZXR1cm4gY2hhbm5lbDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKIH0KK0VYUE9SVF9TWU1CT0woZ2V0X2RtYV9jaGFubmVsKTsKIAogaW50IGdldF9kbWFfcmVzaWR1ZSh1bnNpZ25lZCBpbnQgY2hhbikKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmluZm8gPSBnZXRfZG1hX2luZm8oY2hhbik7Ci0Jc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0gJmluZm8tPmNoYW5uZWxzW2NoYW5dOworCXN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9kbWFfY2hhbm5lbChjaGFuKTsKIAogCWlmIChpbmZvLT5vcHMtPmdldF9yZXNpZHVlKQogCQlyZXR1cm4gaW5mby0+b3BzLT5nZXRfcmVzaWR1ZShjaGFubmVsKTsKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChnZXRfZG1hX3Jlc2lkdWUpOwogCi1pbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGNoYW4sIGNvbnN0IGNoYXIgKmRldl9pZCkKK3N0YXRpYyBpbnQgc2VhcmNoX2NhcChjb25zdCBjaGFyICoqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSkKIHsKLQlzdHJ1Y3QgZG1hX2luZm8gKmluZm8gPSBnZXRfZG1hX2luZm8oY2hhbik7Ci0Jc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0gJmluZm8tPmNoYW5uZWxzW2NoYW5dOworCWNvbnN0IGNoYXIgKipwOwogCi0JZG93bigmY2hhbm5lbC0+c2VtKTsKLQotCWlmICghaW5mby0+b3BzIHx8IGNoYW4gPj0gTUFYX0RNQV9DSEFOTkVMUykgewotCQl1cCgmY2hhbm5lbC0+c2VtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYXRvbWljX3NldCgmY2hhbm5lbC0+YnVzeSwgMSk7Ci0KLQlzdHJsY3B5KGNoYW5uZWwtPmRldl9pZCwgZGV2X2lkLCBzaXplb2YoY2hhbm5lbC0+ZGV2X2lkKSk7Ci0KLQl1cCgmY2hhbm5lbC0+c2VtKTsKLQotCWlmIChpbmZvLT5vcHMtPnJlcXVlc3QpCi0JCXJldHVybiBpbmZvLT5vcHMtPnJlcXVlc3QoY2hhbm5lbCk7CisJZm9yIChwID0gaGF5c3RhY2s7ICpwOyBwKyspCisJCWlmIChzdHJjbXAoKnAsIG5lZWRsZSkgPT0gMCkKKwkJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogcmVxdWVzdF9kbWFfYnljYXAgLSBBbGxvY2F0ZSBhIERNQSBjaGFubmVsIGJhc2VkIG9uIGl0cyBjYXBhYmlsaXRpZXMKKyAqIEBkbWFjOiBMaXN0IG9mIERNQSBjb250cm9sbGVycyB0byBzZWFyY2gKKyAqIEBjYXBzOiBMaXN0IG9mIGNhcGFiaWxpdGVzCisgKgorICogU2VhcmNoIGFsbCBjaGFubmVscyBvZiBhbGwgRE1BIGNvbnRyb2xsZXJzIHRvIGZpbmQgYSBjaGFubmVsIHdoaWNoCisgKiBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzLiBUaGUgcmVzdWx0IGlzIHRoZSBjaGFubmVsCisgKiBudW1iZXIgaWYgYSBtYXRjaCBpcyBmb3VuZCwgb3IgJS1FTk9ERVYgaWYgbm8gbWF0Y2ggaXMgZm91bmQuCisgKgorICogTm90ZSB0aGF0IG5vdCBhbGwgRE1BIGNvbnRyb2xsZXJzIGV4cG9ydCBjYXBhYmlsaXRpZXMsIGluIHdoaWNoCisgKiBjYXNlIHRoZXkgY2FuIG5ldmVyIGJlIGFsbG9jYXRlZCB1c2luZyB0aGlzIEFQSSwgYW5kIHNvCisgKiByZXF1ZXN0X2RtYSgpIG11c3QgYmUgdXNlZCBzcGVjaWZ5aW5nIHRoZSBjaGFubmVsIG51bWJlci4KKyAqLworaW50IHJlcXVlc3RfZG1hX2J5Y2FwKGNvbnN0IGNoYXIgKipkbWFjLCBjb25zdCBjaGFyICoqY2FwcywgY29uc3QgY2hhciAqZGV2X2lkKQoreworCXVuc2lnbmVkIGludCBmb3VuZCA9IDA7CisJc3RydWN0IGRtYV9pbmZvICppbmZvOworCWNvbnN0IGNoYXIgKipwOworCWludCBpOworCisJQlVHX09OKCFkbWFjIHx8ICFjYXBzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJnJlZ2lzdGVyZWRfZG1hY19saXN0LCBsaXN0KQorCQlpZiAoc3RyY21wKCpkbWFjLCBpbmZvLT5uYW1lKSA9PSAwKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnJfY2hhbm5lbHM7IGkrKykgeworCQlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWwgPSAmaW5mby0+Y2hhbm5lbHNbaV07CisKKwkJaWYgKHVubGlrZWx5KCFjaGFubmVsLT5jYXBzKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAocCA9IGNhcHM7ICpwOyBwKyspIHsKKwkJCWlmICghc2VhcmNoX2NhcChjaGFubmVsLT5jYXBzLCAqcCkpCisJCQkJYnJlYWs7CisJCQlpZiAocmVxdWVzdF9kbWEoY2hhbm5lbC0+Y2hhbiwgZGV2X2lkKSA9PSAwKQorCQkJCXJldHVybiBjaGFubmVsLT5jaGFuOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKHJlcXVlc3RfZG1hX2J5Y2FwKTsKKworaW50IGRtYWNfc2VhcmNoX2ZyZWVfY2hhbm5lbChjb25zdCBjaGFyICpkZXZfaWQpCit7CisJc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0geyAwIH07CisJc3RydWN0IGRtYV9pbmZvICppbmZvID0gZ2V0X2RtYV9pbmZvKDApOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGluZm8tPm5yX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbm5lbCA9ICZpbmZvLT5jaGFubmVsc1tpXTsKKwkJaWYgKHVubGlrZWx5KCFjaGFubmVsKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWlmIChhdG9taWNfcmVhZCgmY2hhbm5lbC0+YnVzeSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpbmZvLT5vcHMtPnJlcXVlc3QpIHsKKwkJaW50IHJlc3VsdCA9IGluZm8tPm9wcy0+cmVxdWVzdChjaGFubmVsKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJYXRvbWljX3NldCgmY2hhbm5lbC0+YnVzeSwgMSk7CisJCXJldHVybiBjaGFubmVsLT5jaGFuOworCX0KKworCXJldHVybiAtRU5PU1lTOworfQorCitpbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGNoYW4sIGNvbnN0IGNoYXIgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWwgPSB7IDAgfTsKKwlzdHJ1Y3QgZG1hX2luZm8gKmluZm8gPSBnZXRfZG1hX2luZm8oY2hhbik7CisJaW50IHJlc3VsdDsKKworCWNoYW5uZWwgPSBnZXRfZG1hX2NoYW5uZWwoY2hhbik7CisJaWYgKGF0b21pY194Y2hnKCZjaGFubmVsLT5idXN5LCAxKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN0cmxjcHkoY2hhbm5lbC0+ZGV2X2lkLCBkZXZfaWQsIHNpemVvZihjaGFubmVsLT5kZXZfaWQpKTsKKworCWlmIChpbmZvLT5vcHMtPnJlcXVlc3QpIHsKKwkJcmVzdWx0ID0gaW5mby0+b3BzLT5yZXF1ZXN0KGNoYW5uZWwpOworCQlpZiAocmVzdWx0KQorCQkJYXRvbWljX3NldCgmY2hhbm5lbC0+YnVzeSwgMCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocmVxdWVzdF9kbWEpOworCiB2b2lkIGZyZWVfZG1hKHVuc2lnbmVkIGludCBjaGFuKQogewogCXN0cnVjdCBkbWFfaW5mbyAqaW5mbyA9IGdldF9kbWFfaW5mbyhjaGFuKTsKLQlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWwgPSAmaW5mby0+Y2hhbm5lbHNbY2hhbl07CisJc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0gZ2V0X2RtYV9jaGFubmVsKGNoYW4pOwogCiAJaWYgKGluZm8tPm9wcy0+ZnJlZSkKIAkJaW5mby0+b3BzLT5mcmVlKGNoYW5uZWwpOwogCiAJYXRvbWljX3NldCgmY2hhbm5lbC0+YnVzeSwgMCk7CiB9CitFWFBPUlRfU1lNQk9MKGZyZWVfZG1hKTsKIAogdm9pZCBkbWFfd2FpdF9mb3JfY29tcGxldGlvbih1bnNpZ25lZCBpbnQgY2hhbikKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmluZm8gPSBnZXRfZG1hX2luZm8oY2hhbik7Ci0Jc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0gJmluZm8tPmNoYW5uZWxzW2NoYW5dOworCXN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9kbWFfY2hhbm5lbChjaGFuKTsKIAogCWlmIChjaGFubmVsLT5mbGFncyAmIERNQV9URUlfQ0FQQUJMRSkgewogCQl3YWl0X2V2ZW50KGNoYW5uZWwtPndhaXRfcXVldWUsCkBAIC0xNTgsMjEgKzIzOCw1MiBAQAogCXdoaWxlIChpbmZvLT5vcHMtPmdldF9yZXNpZHVlKGNoYW5uZWwpKQogCQljcHVfcmVsYXgoKTsKIH0KK0VYUE9SVF9TWU1CT0woZG1hX3dhaXRfZm9yX2NvbXBsZXRpb24pOworCitpbnQgcmVnaXN0ZXJfY2hhbl9jYXBzKGNvbnN0IGNoYXIgKmRtYWMsIHN0cnVjdCBkbWFfY2hhbl9jYXBzICpjYXBzKQoreworCXN0cnVjdCBkbWFfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBpbnQgZm91bmQgPSAwOworCWludCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbmZvLCAmcmVnaXN0ZXJlZF9kbWFjX2xpc3QsIGxpc3QpCisJCWlmIChzdHJjbXAoZG1hYywgaW5mby0+bmFtZSkgPT0gMCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKworCWlmICh1bmxpa2VseSghZm91bmQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5ucl9jaGFubmVsczsgaSsrLCBjYXBzKyspIHsKKwkJc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsOworCisJCWlmICgoaW5mby0+Zmlyc3RfY2hhbm5lbF9uciArIGkpICE9IGNhcHMtPmNoX251bSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNoYW5uZWwgPSAmaW5mby0+Y2hhbm5lbHNbaV07CisJCWNoYW5uZWwtPmNhcHMgPSBjYXBzLT5jYXBsaXN0OworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9jaGFuX2NhcHMpOwogCiB2b2lkIGRtYV9jb25maWd1cmVfY2hhbm5lbCh1bnNpZ25lZCBpbnQgY2hhbiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmluZm8gPSBnZXRfZG1hX2luZm8oY2hhbik7Ci0Jc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0gJmluZm8tPmNoYW5uZWxzW2NoYW5dOworCXN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9kbWFfY2hhbm5lbChjaGFuKTsKIAogCWlmIChpbmZvLT5vcHMtPmNvbmZpZ3VyZSkKIAkJaW5mby0+b3BzLT5jb25maWd1cmUoY2hhbm5lbCwgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTChkbWFfY29uZmlndXJlX2NoYW5uZWwpOwogCiBpbnQgZG1hX3hmZXIodW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGxvbmcgZnJvbSwKIAkgICAgIHVuc2lnbmVkIGxvbmcgdG8sIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmluZm8gPSBnZXRfZG1hX2luZm8oY2hhbik7Ci0Jc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0gJmluZm8tPmNoYW5uZWxzW2NoYW5dOworCXN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9kbWFfY2hhbm5lbChjaGFuKTsKIAogCWNoYW5uZWwtPnNhcgk9IGZyb207CiAJY2hhbm5lbC0+ZGFyCT0gdG87CkBAIC0xODEsOCArMjkyLDIwIEBACiAKIAlyZXR1cm4gaW5mby0+b3BzLT54ZmVyKGNoYW5uZWwpOwogfQorRVhQT1JUX1NZTUJPTChkbWFfeGZlcik7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUworaW50IGRtYV9leHRlbmQodW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGxvbmcgb3AsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBkbWFfaW5mbyAqaW5mbyA9IGdldF9kbWFfaW5mbyhjaGFuKTsKKwlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWwgPSBnZXRfZG1hX2NoYW5uZWwoY2hhbik7CisKKwlpZiAoaW5mby0+b3BzLT5leHRlbmQpCisJCXJldHVybiBpbmZvLT5vcHMtPmV4dGVuZChjaGFubmVsLCBvcCwgcGFyYW0pOworCisJcmV0dXJuIC1FTk9TWVM7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9leHRlbmQpOworCiBzdGF0aWMgaW50IGRtYV9yZWFkX3Byb2MoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKIAkJCSBpbnQgbGVuLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKQEAgLTIxNCw4ICszMzcsNiBAQAogCiAJcmV0dXJuIHAgLSBidWY7CiB9Ci0jZW5kaWYKLQogCiBpbnQgcmVnaXN0ZXJfZG1hYyhzdHJ1Y3QgZG1hX2luZm8gKmluZm8pCiB7CkBAIC0yMjQsOCArMzQ1LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmaW5mby0+bGlzdCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJETUE6IFJlZ2lzdGVyaW5nICVzIGhhbmRsZXIgKCVkIGNoYW5uZWwlcykuXG4iLAotCSAgICAgICBpbmZvLT5uYW1lLCBpbmZvLT5ucl9jaGFubmVscywKLQkgICAgICAgaW5mby0+bnJfY2hhbm5lbHMgPiAxID8gInMiIDogIiIpOworCSAgICAgICBpbmZvLT5uYW1lLCBpbmZvLT5ucl9jaGFubmVscywgaW5mby0+bnJfY2hhbm5lbHMgPiAxID8gInMiIDogIiIpOwogCiAJQlVHX09OKChpbmZvLT5mbGFncyAmIERNQUNfQ0hBTk5FTFNfQ09ORklHVVJFRCkgJiYgIWluZm8tPmNoYW5uZWxzKTsKIApAQCAtMjQyLDI4ICszNjIsMjYgQEAKIAogCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBkbWFfY2hhbm5lbCkgKiBpbmZvLT5ucl9jaGFubmVsczsKIAotCQlpbmZvLT5jaGFubmVscyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWluZm8tPmNoYW5uZWxzID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpbmZvLT5jaGFubmVscykKIAkJCXJldHVybiAtRU5PTUVNOwotCi0JCW1lbXNldChpbmZvLT5jaGFubmVscywgMCwgc2l6ZSk7CiAJfQogCiAJdG90YWxfY2hhbm5lbHMgPSBnZXRfbnJfY2hhbm5lbHMoKTsKIAlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnJfY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4gPSBpbmZvLT5jaGFubmVscyArIGk7CisJCXN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbiA9ICZpbmZvLT5jaGFubmVsc1tpXTsKIAotCQljaGFuLT5jaGFuID0gaTsKLQkJY2hhbi0+dmNoYW4gPSBpICsgdG90YWxfY2hhbm5lbHM7CisJCWF0b21pY19zZXQoJmNoYW4tPmJ1c3ksIDApOworCisJCWNoYW4tPmNoYW4gID0gaW5mby0+Zmlyc3RfY2hhbm5lbF9uciArIGk7CisJCWNoYW4tPnZjaGFuID0gaW5mby0+Zmlyc3RfY2hhbm5lbF9uciArIGkgKyB0b3RhbF9jaGFubmVsczsKIAogCQltZW1jcHkoY2hhbi0+ZGV2X2lkLCAiVW51c2VkIiwgNyk7CiAKIAkJaWYgKGluZm8tPmZsYWdzICYgRE1BQ19DSEFOTkVMU19URUlfQ0FQQUJMRSkKIAkJCWNoYW4tPmZsYWdzIHw9IERNQV9URUlfQ0FQQUJMRTsKIAotCQlpbml0X01VVEVYKCZjaGFuLT5zZW0pOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGFuLT53YWl0X3F1ZXVlKTsKLQogCQlkbWFfY3JlYXRlX3N5c2ZzX2ZpbGVzKGNoYW4sIGluZm8pOwogCX0KIApAQCAtMjcxLDYgKzM4OSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfZG1hYyk7CiAKIHZvaWQgdW5yZWdpc3Rlcl9kbWFjKHN0cnVjdCBkbWFfaW5mbyAqaW5mbykKIHsKQEAgLTI4NSwzMSArNDA0LDE2IEBACiAJbGlzdF9kZWwoJmluZm8tPmxpc3QpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPnBkZXYpOwogfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2RtYWMpOwogCiBzdGF0aWMgaW50IF9faW5pdCBkbWFfYXBpX2luaXQodm9pZCkKIHsKLQlwcmludGsoIkRNQTogUmVnaXN0ZXJpbmcgRE1BIEFQSS5cbiIpOwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKKwlwcmludGsoS0VSTl9OT1RJQ0UgIkRNQTogUmVnaXN0ZXJpbmcgRE1BIEFQSS5cbiIpOwogCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRtYSIsIDAsIDAsIGRtYV9yZWFkX3Byb2MsIDApOwotI2VuZGlmCi0KIAlyZXR1cm4gMDsKIH0KLQogc3Vic3lzX2luaXRjYWxsKGRtYV9hcGlfaW5pdCk7CiAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRNQSBBUEkgZm9yIFN1cGVySCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1FWFBPUlRfU1lNQk9MKHJlcXVlc3RfZG1hKTsKLUVYUE9SVF9TWU1CT0woZnJlZV9kbWEpOwotRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9kbWFjKTsKLUVYUE9SVF9TWU1CT0woZ2V0X2RtYV9yZXNpZHVlKTsKLUVYUE9SVF9TWU1CT0woZ2V0X2RtYV9pbmZvKTsKLUVYUE9SVF9TWU1CT0woZ2V0X2RtYV9jaGFubmVsKTsKLUVYUE9SVF9TWU1CT0woZG1hX3hmZXIpOwotRVhQT1JUX1NZTUJPTChkbWFfd2FpdF9mb3JfY29tcGxldGlvbik7Ci1FWFBPUlRfU1lNQk9MKGRtYV9jb25maWd1cmVfY2hhbm5lbCk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jCmluZGV4IGQ4ZWNlMjAuLmY2MzcyMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guYwpAQCAtMTksMjMgKzE5LDM0IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAiZG1hLXNoLmgiCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9kbXRlX2lycSh1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQl1bnNpZ25lZCBpbnQgaXJxID0gMDsKIAorCisjaWZkZWYgQ09ORklHX0NQVV9TSDQKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgZG1hZV9pcHJfbWFwW10gPSB7CisJeyBETUFFX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCit9OworI2VuZGlmCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGRtdGVfaXByX21hcFtdID0gewogCS8qCiAJICogTm9ybWFsbHkgd2UgY291bGQganVzdCBkbyBETVRFMF9JUlEgKyBjaGFuIG91dHJpZ2h0LCB0aG91Z2ggaW4gdGhlCiAJICogY2FzZSBvZiB0aGUgNzc1MVIsIHRoZSBETVRFIElSUXMgZm9yIGNoYW5uZWxzID4gNCBzdGFydCByaWdodCBhYm92ZQogCSAqIHRoZSBTQ0lGCiAJICovCi0JaWYgKGNoYW4gPCA0KSB7Ci0JCWlycSA9IERNVEUwX0lSUSArIGNoYW47Ci0JfSBlbHNlIHsKLSNpZmRlZiBETVRFNF9JUlEKLQkJaXJxID0gRE1URTRfSVJRICsgY2hhbiAtIDQ7Ci0jZW5kaWYKLQl9CisJeyBETVRFMF9JUlEgKyAwLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEUwX0lSUSArIDEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCXsgRE1URTBfSVJRICsgMiwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCisJeyBETVRFMF9JUlEgKyAzLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEU0X0lSUSArIDAsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorCXsgRE1URTRfSVJRICsgMSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCisJeyBETVRFNF9JUlEgKyAyLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKKwl7IERNVEU0X0lSUSArIDMsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAorfTsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2RtdGVfaXJxKHVuc2lnbmVkIGludCBjaGFuKQoreworCXVuc2lnbmVkIGludCBpcnEgPSAwOworCWlmIChjaGFuIDwgQVJSQVlfU0laRShkbXRlX2lwcl9tYXApKQorCQlpcnEgPSBkbXRlX2lwcl9tYXBbY2hhbl0uaXJxOwogCXJldHVybiBpcnE7CiB9CiAKQEAgLTgzLDIwICs5NCwxMyBAQAogCWlmICh1bmxpa2VseSghY2hhbi0+ZmxhZ3MgJiBETUFfVEVJX0NBUEFCTEUpKQogCQlyZXR1cm4gMDsKIAotCWNoYW4tPm5hbWUgPSBremFsbG9jKDMyLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoY2hhbi0+bmFtZSA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jc25wcmludGYoY2hhbi0+bmFtZSwgMzIsICJETUFDIFRyYW5zZmVyIEVuZCAoQ2hhbm5lbCAlZCkiLAotCQkgY2hhbi0+Y2hhbik7Ci0KIAlyZXR1cm4gcmVxdWVzdF9pcnEoZ2V0X2RtdGVfaXJxKGNoYW4tPmNoYW4pLCBkbWFfdGVpLAotCQkJICAgSVJRRl9ESVNBQkxFRCwgY2hhbi0+bmFtZSwgY2hhbik7CisJCQkgICBJUlFGX0RJU0FCTEVELCBjaGFuLT5kZXZfaWQsIGNoYW4pOwogfQogCiBzdGF0aWMgdm9pZCBzaF9kbWFjX2ZyZWVfZG1hKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbikKIHsKIAlmcmVlX2lycShnZXRfZG10ZV9pcnEoY2hhbi0+Y2hhbiksIGNoYW4pOwotCWtmcmVlKGNoYW4tPm5hbWUpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjU4LDE3ICsyNjIsMTYgQEAKIAlpbnQgaTsKIAogI2lmZGVmIENPTkZJR19DUFVfU0g0Ci0JbWFrZV9pcHJfaXJxKERNQUVfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShkbWFlX2lwcl9tYXAsIEFSUkFZX1NJWkUoZG1hZV9pcHJfbWFwKSk7CiAJaSA9IHJlcXVlc3RfaXJxKERNQUVfSVJRLCBkbWFfZXJyLCBJUlFGX0RJU0FCTEVELCAiRE1BQyBBZGRyZXNzIEVycm9yIiwgMCk7CiAJaWYgKHVubGlrZWx5KGkgPCAwKSkKIAkJcmV0dXJuIGk7CiAjZW5kaWYKIAotCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5ucl9jaGFubmVsczsgaSsrKSB7Ci0JCWludCBpcnEgPSBnZXRfZG10ZV9pcnEoaSk7Ci0KLQkJbWFrZV9pcHJfaXJxKGlycSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZKTsKLQl9CisJaSA9IGluZm8tPm5yX2NoYW5uZWxzOworCWlmIChpID4gQVJSQVlfU0laRShkbXRlX2lwcl9tYXApKQorCQlpID0gQVJSQVlfU0laRShkbXRlX2lwcl9tYXApOworCW1ha2VfaXByX2lycShkbXRlX2lwcl9tYXAsIGkpOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIERNQU9SLCBhbmQgY2xlYW4gdXAgYW55IGVycm9yIGZsYWdzIHRoYXQgbWF5IGhhdmUKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXN5c2ZzLmMgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zeXNmcy5jCmluZGV4IDI5YjhlZjkuLmVlYmNkNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXN5c2ZzLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBzeXNmcyBpbnRlcmZhY2UgZm9yIFNIIERNQSBBUEkKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgIFBhdWwgTXVuZHQKKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDYgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtMjEsNyArMjEsNiBAQAogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgZG1hX3N5c2NsYXNzID0gewogCXNldF9rc2V0X25hbWUoImRtYSIpLAogfTsKLQogRVhQT1JUX1NZTUJPTChkbWFfc3lzY2xhc3MpOwogCiBzdGF0aWMgc3NpemVfdCBkbWFfc2hvd19kZXZpY2VzKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKQEAgLTMxLDcgKzMwLDEwIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0RNQV9DSEFOTkVMUzsgaSsrKSB7CiAJCXN0cnVjdCBkbWFfaW5mbyAqaW5mbyA9IGdldF9kbWFfaW5mbyhpKTsKLQkJc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsID0gJmluZm8tPmNoYW5uZWxzW2ldOworCQlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWwgPSBnZXRfZG1hX2NoYW5uZWwoaSk7CisKKwkJaWYgKHVubGlrZWx5KCFpbmZvKSB8fCAhY2hhbm5lbCkKKwkJCWNvbnRpbnVlOwogCiAJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiUyZDogJTE0cyAgICAlc1xuIiwKIAkJCSAgICAgICBjaGFubmVsLT5jaGFuLCBpbmZvLT5uYW1lLApAQCAtMTI1LDExICsxMjcsMTYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jc3lzZGV2X2NyZWF0ZV9maWxlKGRldiwgJmF0dHJfZGV2X2lkKTsKLQlzeXNkZXZfY3JlYXRlX2ZpbGUoZGV2LCAmYXR0cl9jb3VudCk7Ci0Jc3lzZGV2X2NyZWF0ZV9maWxlKGRldiwgJmF0dHJfbW9kZSk7Ci0Jc3lzZGV2X2NyZWF0ZV9maWxlKGRldiwgJmF0dHJfZmxhZ3MpOwotCXN5c2Rldl9jcmVhdGVfZmlsZShkZXYsICZhdHRyX2NvbmZpZyk7CisJcmV0IHw9IHN5c2Rldl9jcmVhdGVfZmlsZShkZXYsICZhdHRyX2Rldl9pZCk7CisJcmV0IHw9IHN5c2Rldl9jcmVhdGVfZmlsZShkZXYsICZhdHRyX2NvdW50KTsKKwlyZXQgfD0gc3lzZGV2X2NyZWF0ZV9maWxlKGRldiwgJmF0dHJfbW9kZSk7CisJcmV0IHw9IHN5c2Rldl9jcmVhdGVfZmlsZShkZXYsICZhdHRyX2ZsYWdzKTsKKwlyZXQgfD0gc3lzZGV2X2NyZWF0ZV9maWxlKGRldiwgJmF0dHJfY29uZmlnKTsKKworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIkZhaWxlZCBjcmVhdGluZyBhdHRyc1xuIik7CisJCXJldHVybiByZXQ7CisJfQogCiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZG1hJWQiLCBjaGFuLT5jaGFuKTsKIAlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJmluZm8tPnBkZXYtPmRldi5rb2JqLCAmZGV2LT5rb2JqLCBuYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXI3NzgwcnAuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXI3NzgwcnAuYwppbmRleCA2ZTNiYTljNi4uZWVlYTE1NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcjc3ODBycC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXI3NzgwcnAuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9yNzc4MHJwL3I3NzgwcnAuaD4KKyNpbmNsdWRlIDxhc20vcjc3ODBycC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgInBjaS1zaDQuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcnRzNzc1MXIyZC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcnRzNzc1MXIyZC5jCmluZGV4IGI2ODgyNGMuLjRhNTE4ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXJ0czc3NTFyMmQuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1ydHM3NzUxcjJkLmMKQEAgLTEwLDI4ICsxMCwyNCBAQAogICoKICAqIFBDSSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIFJlbmVzYXMgU0g3NzUxUiBSVFM3NzUxUjJEIGJvYXJkCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KICNpbmNsdWRlICJwY2ktc2g0LmgiCiAKK3N0YXRpYyB1OCBydHM3NzUxcjJkX2lycV90YWJbXSBfX2luaXRkYXRhID0geworCUlSUV9QQ0lTTE9UMSwKKwlJUlFfUENJU0xPVDIsCisJSVJRX1BDTUNJQSwKKwlJUlFfUENJRVRILAorfTsKKwogaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKLSAgICAgICAgc3dpdGNoIChzbG90KSB7Ci0JY2FzZSAwOiByZXR1cm4gSVJRX1BDSVNMT1QxOwkvKiBQQ0kgRXh0ZW5kIHNsb3QgIzEgKi8KLQljYXNlIDE6IHJldHVybiBJUlFfUENJU0xPVDI7CS8qIFBDSSBFeHRlbmQgc2xvdCAjMiAqLwotCWNhc2UgMjogcmV0dXJuIElSUV9QQ01DSUE7CS8qIFBDSSBDYXJkYnVzIEJyaWRnZSAqLwotCWNhc2UgMzogcmV0dXJuIElSUV9QQ0lFVEg7CS8qIFJlYWx0ZWsgRXRoZXJuZXQgY29udHJvbGxlciAqLwotCWRlZmF1bHQ6Ci0JCXByaW50aygiUENJOiBCYWQgSVJRIG1hcHBpbmcgcmVxdWVzdCBmb3Igc2xvdCAlZFxuIiwgc2xvdCk7Ci0JCXJldHVybiAtMTsKLQl9CisJcmV0dXJuIHJ0czc3NTFyMmRfaXJxX3RhYltzbG90XTsKIH0KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3NTFfaW9fcmVzb3VyY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy10aXRhbi5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtdGl0YW4uYwppbmRleCBjZDU2ZDUzLi5hYzhlZTIzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy10aXRhbi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXRpdGFuLmMKQEAgLTE1LDI1ICsxNSwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3RpdGFuLmg+CiAjaW5jbHVkZSAicGNpLXNoNC5oIgogCitzdGF0aWMgY2hhciB0aXRhbl9pcnFfdGFiW10gX19pbml0ZGF0YSA9IHsKKwlUSVRBTl9JUlFfV0FOLAorCVRJVEFOX0lSUV9MQU4sCisJVElUQU5fSVJRX01QQ0lBLAorCVRJVEFOX0lSUV9NUENJQiwKKwlUSVRBTl9JUlFfVVNCLAorfTsKKwogaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKLQlpbnQgaXJxID0gLTE7Ci0KLQlzd2l0Y2ggKHNsb3QpIHsKLQljYXNlIDA6IGlycSA9IFRJVEFOX0lSUV9XQU47ICAgYnJlYWs7CS8qIGV0aDAgKFdBTikgKi8KLQljYXNlIDE6IGlycSA9IFRJVEFOX0lSUV9MQU47ICAgYnJlYWs7CS8qIGV0aDEgKExBTikgKi8KLQljYXNlIDI6IGlycSA9IFRJVEFOX0lSUV9NUENJQTsgYnJlYWs7CS8qIG1QQ0kgQSAqLwotCWNhc2UgMzogaXJxID0gVElUQU5fSVJRX01QQ0lCOyBicmVhazsJLyogbVBDSSBCICovCi0JY2FzZSA0OiBpcnEgPSBUSVRBTl9JUlFfVVNCOyAgIGJyZWFrOwkvKiBVU0IgKi8KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IEJhZCBJUlEgbWFwcGluZyAiCi0JCQkJICJyZXF1ZXN0IGZvciBzbG90ICVkXG4iLCBzbG90KTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpbnQgaXJxID0gdGl0YW5faXJxX3RhYltzbG90XTsKIAogCXByaW50aygiUENJOiBNYXBwaW5nIFRJVEFOIElSUSBmb3Igc2xvdCAlZCwgcGluICVjIHRvIGlycSAlZFxuIiwKIAkJc2xvdCwgcGluIC0gMSArICdBJywgaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc4MC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMKaW5kZXggZDZlNjM1Mi4uNjAyYjY0NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMKQEAgLTIyLDYgKzIyLDIwIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlICJwY2ktc2g0LmgiCiAKKyNkZWZpbmUgSU5UQ19CQVNFCTB4ZmZkMDAwMDAKKyNkZWZpbmUgSU5UQ19JQ1IwCShJTlRDX0JBU0UrMHgwKQorI2RlZmluZSBJTlRDX0lDUjEJKElOVENfQkFTRSsweDFjKQorI2RlZmluZSBJTlRDX0lOVFBSSQkoSU5UQ19CQVNFKzB4MTApCisjZGVmaW5lIElOVENfSU5UUkVRCShJTlRDX0JBU0UrMHgyNCkKKyNkZWZpbmUgSU5UQ19JTlRNU0swCShJTlRDX0JBU0UrMHg0NCkKKyNkZWZpbmUgSU5UQ19JTlRNU0sxCShJTlRDX0JBU0UrMHg0OCkKKyNkZWZpbmUgSU5UQ19JTlRNU0syCShJTlRDX0JBU0UrMHg0MDA4MCkKKyNkZWZpbmUgSU5UQ19JTlRNU0tDTFIwCShJTlRDX0JBU0UrMHg2NCkKKyNkZWZpbmUgSU5UQ19JTlRNU0tDTFIxCShJTlRDX0JBU0UrMHg2OCkKKyNkZWZpbmUgSU5UQ19JTlRNU0tDTFIyCShJTlRDX0JBU0UrMHg0MDA4NCkKKyNkZWZpbmUgSU5UQ19JTlQyTVNLUgkoSU5UQ19CQVNFKzB4NDAwMzgpCisjZGVmaW5lIElOVENfSU5UMk1TS0NSCShJTlRDX0JBU0UrMHg0MDAzYykKKwogLyoKICAqIEluaXRpYWxpemF0aW9uLiBUcnkgYWxsIGtub3duIFBDSSBhY2Nlc3MgbWV0aG9kcy4gTm90ZSB0aGF0IHdlIHN1cHBvcnQKICAqIHVzaW5nIGJvdGggUENJIEJJT1MgYW5kIGRpcmVjdCBhY2Nlc3M6IGluIHN1Y2ggY2FzZXMsIHdlIHVzZSBJL08gcG9ydHMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wdXNoLXN3aXRjaC5jIGIvYXJjaC9zaC9kcml2ZXJzL3B1c2gtc3dpdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkMjBjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wdXNoLXN3aXRjaC5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogR2VuZXJpYyBwdXNoLXN3aXRjaCBmcmFtZXdvcmsKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vcHVzaC1zd2l0Y2guaD4KKworI2RlZmluZSBEUlZfTkFNRSAicHVzaC1zd2l0Y2giCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEuMSIKKworc3RhdGljIHNzaXplX3Qgc3dpdGNoX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IHB1c2hfc3dpdGNoX3BsYXRmb3JtX2luZm8gKnBzd19pbmZvID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBwc3dfaW5mby0+bmFtZSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc3dpdGNoLCBTX0lSVUdPLCBzd2l0Y2hfc2hvdywgTlVMTCk7CisKK3N0YXRpYyB2b2lkIHN3aXRjaF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHB1c2hfc3dpdGNoICpwc3cgPSAoc3RydWN0IHB1c2hfc3dpdGNoICopZGF0YTsKKworCXNjaGVkdWxlX3dvcmsoJnBzdy0+d29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHN3aXRjaF93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBwdXNoX3N3aXRjaCAqcHN3ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwdXNoX3N3aXRjaCwgd29yayk7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHBzdy0+cGRldjsKKworCXBzdy0+c3RhdGUgPSAwOworCisJa29iamVjdF91ZXZlbnQoJnBkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7Cit9CisKK3N0YXRpYyBpbnQgc3dpdGNoX2Rydl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwdXNoX3N3aXRjaF9wbGF0Zm9ybV9pbmZvICpwc3dfaW5mbzsKKwlzdHJ1Y3QgcHVzaF9zd2l0Y2ggKnBzdzsKKwlpbnQgcmV0LCBpcnE7CisKKwlwc3cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHVzaF9zd2l0Y2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXBzdykpCisJCXJldHVybiAtRU5PTUVNOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAodW5saWtlbHkoaXJxIDwgMCkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJcHN3X2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlCVUdfT04oIXBzd19pbmZvKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcHN3X2luZm8tPmlycV9oYW5kbGVyLAorCQkJICBJUlFGX0RJU0FCTEVEIHwgcHN3X2luZm8tPmlycV9mbGFncywKKwkJCSAgcHN3X2luZm8tPm5hbWUgPyBwc3dfaW5mby0+bmFtZSA6IERSVl9OQU1FLCBwZGV2KTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCWdvdG8gZXJyOworCisJaWYgKHBzd19pbmZvLT5uYW1lKSB7CisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfc3dpdGNoKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBjcmVhdGluZyBkZXZpY2UgYXR0cnNcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2lycTsKKwkJfQorCX0KKworCUlOSVRfV09SSygmcHN3LT53b3JrLCBzd2l0Y2hfd29ya19oYW5kbGVyKTsKKwlpbml0X3RpbWVyKCZwc3ctPmRlYm91bmNlKTsKKworCXBzdy0+ZGVib3VuY2UuZnVuY3Rpb24gPSBzd2l0Y2hfdGltZXI7CisJcHN3LT5kZWJvdW5jZS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHN3OworCisJLyogV29ya3F1ZXVlIEFQSSBicmFpbi1kYW1hZ2UgKi8KKwlwc3ctPnBkZXYgPSBwZGV2OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHN3KTsKKworCXJldHVybiAwOworCitlcnJfaXJxOgorCWZyZWVfaXJxKGlycSwgcGRldik7CitlcnI6CisJa2ZyZWUocHN3KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN3aXRjaF9kcnZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB1c2hfc3dpdGNoICpwc3cgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcHVzaF9zd2l0Y2hfcGxhdGZvcm1faW5mbyAqcHN3X2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKworCWlmIChwc3dfaW5mby0+bmFtZSkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9zd2l0Y2gpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlkZWxfdGltZXJfc3luYygmcHN3LT5kZWJvdW5jZSk7CisJZnJlZV9pcnEoaXJxLCBwZGV2KTsKKworCWtmcmVlKHBzdyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3dpdGNoX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc3dpdGNoX2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IHN3aXRjaF9kcnZfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IERSVl9OQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzd2l0Y2hfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX05PVElDRSBEUlZfTkFNRSAiOiB2ZXJzaW9uICVzIGxvYWRlZFxuIiwgRFJWX1ZFUlNJT04pOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnN3aXRjaF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3dpdGNoX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3dpdGNoX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzd2l0Y2hfaW5pdCk7Cittb2R1bGVfZXhpdChzd2l0Y2hfZXhpdCk7CisKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEx2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQppbmRleCA1ZGE4OGE0Li45OWM3ZTUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogZXh0cmEteQk6PSBoZWFkLm8gaW5pdF90YXNrLm8gdm1saW51eC5sZHMKIAotb2JqLXkJOj0gcHJvY2Vzcy5vIHNpZ25hbC5vIGVudHJ5Lm8gdHJhcHMubyBpcnEubyBcCitvYmoteQk6PSBwcm9jZXNzLm8gc2lnbmFsLm8gdHJhcHMubyBpcnEubyBcCiAJcHRyYWNlLm8gc2V0dXAubyB0aW1lLm8gc3lzX3NoLm8gc2VtYXBob3JlLm8gXAogCWlvLm8gaW9fZ2VuZXJpYy5vIHNoX2tzeW1zLm8gc3lzY2FsbHMubwogCkBAIC0yMSwzICsyMSw0IEBACiBvYmotJChDT05GSUdfS0VYRUMpCQkrPSBtYWNoaW5lX2tleGVjLm8gcmVsb2NhdGVfa2VybmVsLm8KIG9iai0kKENPTkZJR19BUE0pCQkrPSBhcG0ubwogb2JqLSQoQ09ORklHX1BNKQkJKz0gcG0ubworb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpCSs9IHN0YWNrdHJhY2UubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlCmluZGV4IGZiNWRhYzAuLmQwNTVhM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvTWFrZWZpbGUKQEAgLTIsMTEgKzIsMTMgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eC9TdXBlckggQ1BVLXNwZWNpZmMgYmFja2VuZHMuCiAjCiAKLW9iai15CSs9IGlycS8gaW5pdC5vIGNsb2NrLm8KLQotb2JqLSQoQ09ORklHX0NQVV9TSDIpCQkrPSBzaDIvCi1vYmotJChDT05GSUdfQ1BVX1NIMykJCSs9IHNoMy8KLW9iai0kKENPTkZJR19DUFVfU0g0KQkJKz0gc2g0Lworb2JqLSQoQ09ORklHX0NQVV9TSDIpCQk9IHNoMi8KK29iai0kKENPTkZJR19DUFVfU0gyQSkJCT0gc2gyYS8KK29iai0kKENPTkZJR19DUFVfU0gzKQkJPSBzaDMvCitvYmotJChDT05GSUdfQ1BVX1NINCkJCT0gc2g0Lworb2JqLSQoQ09ORklHX0NQVV9TSDRBKQkJKz0gc2g0YS8KIAogb2JqLSQoQ09ORklHX1VCQ19XQUtFVVApCSs9IHViYy5vCiBvYmotJChDT05GSUdfU0hfQURDKQkJKz0gYWRjLm8KKworb2JqLXkJKz0gaXJxLyBpbml0Lm8gY2xvY2subwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2suYwppbmRleCA1MWVjNjRjLi5hYmI1ODZiMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLmMKQEAgLTUsOSArNSwxMSBAQAogICoKICAqIFRoaXMgY2xvY2sgZnJhbWV3b3JrIGlzIGRlcml2ZWQgZnJvbSB0aGUgT01BUCB2ZXJzaW9uIGJ5OgogICoKLSAqCUNvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICoJQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogICoJV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KICAqCisgKiAgTW9kaWZpZWQgZm9yIG9tYXAgc2hhcmVkIGNsb2NrIGZyYW1ld29yayBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgorICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMjAsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS90aW1lci5oPgogCkBAIC0xOTUsMTcgKzE5OCwzNyBAQAogCQlwcm9wYWdhdGVfcmF0ZShjbGspOwogfQogCi1zdHJ1Y3QgY2xrICpjbGtfZ2V0KGNvbnN0IGNoYXIgKmlkKQorLyoKKyAqIFJldHVybnMgYSBjbG9jay4gTm90ZSB0aGF0IHdlIGZpcnN0IHRyeSB0byB1c2UgZGV2aWNlIGlkIG9uIHRoZSBidXMKKyAqIGFuZCBjbG9jayBuYW1lLiBJZiB0aGlzIGZhaWxzLCB3ZSB0cnkgdG8gdXNlIGNsb2NrIG5hbWUgb25seS4KKyAqLworc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQogewogCXN0cnVjdCBjbGsgKnAsICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOworCWludCBpZG5vOworCisJaWYgKGRldiA9PSBOVUxMIHx8IGRldi0+YnVzICE9ICZwbGF0Zm9ybV9idXNfdHlwZSkKKwkJaWRubyA9IC0xOworCWVsc2UKKwkJaWRubyA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpLT5pZDsKIAogCW11dGV4X2xvY2soJmNsb2NrX2xpc3Rfc2VtKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja19saXN0LCBub2RlKSB7CisJCWlmIChwLT5pZCA9PSBpZG5vICYmCisJCSAgICBzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7CisJCQljbGsgPSBwOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2NrX2xpc3QsIG5vZGUpIHsKIAkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKIAkJCWNsayA9IHA7CiAJCQlicmVhazsKIAkJfQogCX0KKworZm91bmQ6CiAJbXV0ZXhfdW5sb2NrKCZjbG9ja19saXN0X3NlbSk7CiAKIAlyZXR1cm4gY2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKaW5kZXggYmZiOTBlYi4uNDgxMjE3NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCkBAIC02OCwxMiArNjgsMTQgQEAKIAogCQl3YXlzaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzOwogCisjaWZkZWYgQ0NSX0NBQ0hFX09SQQogCQkvKgogCQkgKiBJZiB0aGUgT0MgaXMgYWxyZWFkeSBpbiBSQU0gbW9kZSwgd2Ugb25seSBoYXZlCiAJCSAqIGhhbGYgb2YgdGhlIGVudHJpZXMgdG8gZmx1c2guLgogCQkgKi8KIAkJaWYgKGNjciAmIENDUl9DQUNIRV9PUkEpCiAJCQl3YXlzaXplID4+PSAxOworI2VuZGlmCiAKIAkJd2F5c2l6ZSA8PD0gY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvTWFrZWZpbGUKaW5kZXggMWMwMzRjMi4uMDA0OWQyMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL01ha2VmaWxlCkBAIC0xLDggKzEsOSBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4L1N1cGVySCBDUFUtc3BlY2lmYyBJUlEgaGFuZGxlcnMuCiAjCi1vYmoteQkrPSBpcHIubyBpbWFzay5vCitvYmoteQkrPSBpbWFzay5vCiAKK29iai0kKENPTkZJR19DUFVfSEFTX0lQUl9JUlEpCQkrPSBpcHIubwogb2JqLSQoQ09ORklHX0NQVV9IQVNfUElOVF9JUlEpCQkrPSBwaW50Lm8KIG9iai0kKENPTkZJR19DUFVfSEFTX01BU0tSRUdfSVJRKQkrPSBtYXNrcmVnLm8KIG9iai0kKENPTkZJR19DUFVfSEFTX0lOVEMyX0lSUSkJCSs9IGludGMyLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW1hc2suYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW1hc2suYwppbmRleCBhMzNhZTNlLi4zMDFiNTA1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ltYXNrLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbWFzay5jCkBAIC01Myw3ICs1MywxMCBAQAogewogCXVuc2lnbmVkIGxvbmcgX19kdW1teTsKIAotCWFzbSB2b2xhdGlsZSgibGRjCSUyLCByNl9iYW5rXG5cdCIKKwlhc20gdm9sYXRpbGUoCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfU1JfUkIKKwkJICAgICAibGRjCSUyLCByNl9iYW5rXG5cdCIKKyNlbmRpZgogCQkgICAgICJzdGMJc3IsICUwXG5cdCIKIAkJICAgICAiYW5kCSMweGYwLCAlMFxuXHQiCiAJCSAgICAgInNobHIyCSUwXG5cdCIKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYwppbmRleCBkNGIyYmI3Li43NGRlZmU3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jCkBAIC0xMSwyNyArMTEsMzMgQEAKICAqIEhpdGFjaGkgNzc1MSwgdGhlIFNUTSBTVDQwIFNUQjEsIFNINzc2MCwgYW5kIFNINzc4MC4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkKKyNkZWZpbmUgSU5UQzJfQkFTRQkweGZlMDgwMDAwCisjZGVmaW5lIElOVEMyX0lOVE1TSwkoSU5UQzJfQkFTRSArIDB4NDApCisjZGVmaW5lIElOVEMyX0lOVE1TS0NMUgkoSU5UQzJfQkFTRSArIDB4NjApCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCisjZGVmaW5lIElOVEMyX0JBU0UJMHhmZmQ0MDAwMAorI2RlZmluZSBJTlRDMl9JTlRNU0sJKElOVEMyX0JBU0UgKyAweDM4KQorI2RlZmluZSBJTlRDMl9JTlRNU0tDTFIJKElOVEMyX0JBU0UgKyAweDNjKQorI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfaW50YzJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGludGMyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwKLQkJICBJTlRDMl9CQVNFICsgSU5UQzJfSU5UTVNLX09GRlNFVCArIHAtPm1za19vZmZzZXQpOworCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwgSU5UQzJfSU5UTVNLICsgcC0+bXNrX29mZnNldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LAotCQkgIElOVEMyX0JBU0UgKyBJTlRDMl9JTlRNU0tDTFJfT0ZGU0VUICsgcC0+bXNrX29mZnNldCk7CisJY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0tDTFIgKyBwLT5tc2tfb2Zmc2V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpbnRjMl9pcnFfY2hpcCA9IHsKLQkudHlwZW5hbWUJPSAiaW50YzIiLAorCS5uYW1lCQk9ICJJTlRDMiIsCiAJLm1hc2sJCT0gZGlzYWJsZV9pbnRjMl9pcnEsCiAJLnVubWFzawkJPSBlbmFibGVfaW50YzJfaXJxLAogCS5tYXNrX2Fjawk9IGRpc2FibGVfaW50YzJfaXJxLApAQCAtNDUsMTUwICs1MSwzNCBAQAogICogICAgUElPMSB3aGljaCBpcyBJTlRQUkkwMFsxOSwxNl0gYW5kIElOVE1TSzAwWzEzXQogICogd291bGQgYmU6ICAgICAgICAgICAgICAgXiAgICAgXiAgICAgICAgICAgICBeICBeCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgIHwgIHwKLSAqICAgIG1ha2VfaW50YzJfaXJxKDg0LCAgIDAsICAgMTYsICAgICAgICAgICAgMCwgMTMpOworICogICAgIHsgODQsCQkgICAwLCAgIDE2LCAgICAgICAgICAgIDAsIDEzIH0sCisgKgorICogaW4gdGhlIGludGMyX2RhdGEgdGFibGUuCiAgKi8KLXZvaWQgbWFrZV9pbnRjMl9pcnEoc3RydWN0IGludGMyX2RhdGEgKnApCi17Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgaXByOwotCi0JZGlzYWJsZV9pcnFfbm9zeW5jKHAtPmlycSk7Ci0KLQkvKiBTZXQgdGhlIHByaW9yaXR5IGxldmVsICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JaXByID0gY3RybF9pbmwoSU5UQzJfQkFTRSArIElOVEMyX0lOVFBSSV9PRkZTRVQgKyBwLT5pcHJfb2Zmc2V0KTsKLQlpcHIgJj0gfigweGYgPDwgcC0+aXByX3NoaWZ0KTsKLQlpcHIgfD0gcC0+cHJpb3JpdHkgPDwgcC0+aXByX3NoaWZ0OwotCWN0cmxfb3V0bChpcHIsIElOVEMyX0JBU0UgKyBJTlRDMl9JTlRQUklfT0ZGU0VUICsgcC0+aXByX29mZnNldCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIocC0+aXJxLCAmaW50YzJfaXJxX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOwotCXNldF9pcnFfY2hpcF9kYXRhKHAtPmlycSwgcCk7Ci0KLQllbmFibGVfaW50YzJfaXJxKHAtPmlycSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50YzJfZGF0YSBpbnRjMl9pcnFfdGFibGVbXSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TVDQwKQotCXs2NCwgIDAsICAwLCAwLCAgMCwgMTN9LAkvKiBQQ0kgc2VyciAqLwotCXs2NSwgIDAsICA0LCAwLCAgMSwgMTN9LAkvKiBQQ0kgZXJyICovCi0JezY2LCAgMCwgIDQsIDAsICAyLCAxM30sCS8qIFBDSSBhZCAqLwotCXs2NywgIDAsICA0LCAwLCAgMywgMTN9LAkvKiBQQ0kgcHdkIGRvd24gKi8KLQl7NzIsICAwLCAgOCwgMCwgIDUsIDEzfSwJLyogRE1BQyBJTlQwICovCi0JezczLCAgMCwgIDgsIDAsICA2LCAxM30sCS8qIERNQUMgSU5UMSAqLwotCXs3NCwgIDAsICA4LCAwLCAgNywgMTN9LAkvKiBETUFDIElOVDIgKi8KLQl7NzUsICAwLCAgOCwgMCwgIDgsIDEzfSwJLyogRE1BQyBJTlQzICovCi0Jezc2LCAgMCwgIDgsIDAsICA5LCAxM30sCS8qIERNQUMgSU5UNCAqLwotCXs3OCwgIDAsICA4LCAwLCAxMSwgMTN9LAkvKiBETUFDIEVSUiAqLwotCXs4MCwgIDAsIDEyLCAwLCAxMiwgMTN9LAkvKiBQSU8wICovCi0Jezg0LCAgMCwgMTYsIDAsIDEzLCAxM30sCS8qIFBJTzEgKi8KLQl7ODgsICAwLCAyMCwgMCwgMTQsIDEzfSwJLyogUElPMiAqLwotCXsxMTIsIDQsICAwLCA0LCAgMCwgMTN9LAkvKiBNYWlsYm94ICovCi0gI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxCi0JezExNiwgNCwgIDQsIDQsICA0LCAxM30sCS8qIFNTQzAgKi8KLQl7MTIwLCA0LCAgOCwgNCwgIDgsIDEzfSwJLyogSVIgQmxhc3RlciAqLwotCXsxMjQsIDQsIDEyLCA0LCAxMiwgMTN9LAkvKiBVU0IgaG9zdCAqLwotCXsxMjgsIDQsIDE2LCA0LCAxNiwgMTN9LAkvKiBWaWRlbyBwcm9jZXNzb3IgQkxJVFRFUiAqLwotCXsxMzIsIDQsIDIwLCA0LCAyMCwgMTN9LAkvKiBVQVJUMCAqLwotCXsxMzQsIDQsIDIwLCA0LCAyMiwgMTN9LAkvKiBVQVJUMiAqLwotCXsxMzYsIDQsIDI0LCA0LCAyNCwgMTN9LAkvKiBJT19QSU8wICovCi0JezE0MCwgNCwgMjgsIDQsIDI4LCAxM30sCS8qIEVNUEkgKi8KLQl7MTQ0LCA4LCAgMCwgOCwgIDAsIDEzfSwJLyogTUFGRSAqLwotCXsxNDgsIDgsICA0LCA4LCAgNCwgMTN9LAkvKiBQV00gKi8KLQl7MTUyLCA4LCAgOCwgOCwgIDgsIDEzfSwJLyogU1NDMSAqLwotCXsxNTYsIDgsIDEyLCA4LCAxMiwgMTN9LAkvKiBJT19QSU8xICovCi0JezE2MCwgOCwgMTYsIDgsIDE2LCAxM30sCS8qIFVTQiB0YXJnZXQgKi8KLQl7MTY0LCA4LCAyMCwgOCwgMjAsIDEzfSwJLyogVUFSVDEgKi8KLQl7MTY4LCA4LCAyNCwgOCwgMjQsIDEzfSwJLyogVGVsZXRleHQgKi8KLQl7MTcyLCA4LCAyOCwgOCwgMjgsIDEzfSwJLyogVmlkZW9TeW5jIFZURyAqLwotCXsxNzMsIDgsIDI4LCA4LCAyOSwgMTN9LAkvKiBWaWRlb1N5bmMgRFZQMCAqLwotCXsxNzQsIDgsIDI4LCA4LCAzMCwgMTN9LAkvKiBWaWRlb1N5bmMgRFZQMSAqLwotI2VuZGlmCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCi0vKgotICogU0g3NzYwIElOVEMyLVN0eWxlIGludGVycnVwdHMsIHZlY3RvcnMgSVJRNDgtMTExIElOVEVWVCAweDgwMC0weEZFMAotICovCi0JLyogSU5UUFJJTzAgfCBJTlRNU0swICovCi0JezQ4LCAgMCwgMjgsIDAsIDMxLCAgM30sCS8qIElSUSA0ICovCi0JezQ5LCAgMCwgMjQsIDAsIDMwLCAgM30sCS8qIElSUSAzICovCi0JezUwLCAgMCwgMjAsIDAsIDI5LCAgM30sCS8qIElSUSAyICovCi0JezUxLCAgMCwgMTYsIDAsIDI4LCAgM30sCS8qIElSUSAxICovCi0JLyogNTItNTUgKElOVEVWVCAweDg4MC0weDhFMCkgdW51c2VkL3Jlc2VydmVkICovCi0JLyogSU5UUFJJTzQgfCBJTlRNU0swICovCi0JezU2LCAgNCwgMjgsIDAsIDI1LCAgM30sCS8qIEhDQU4yX0NIQU4wICovCi0JezU3LCAgNCwgMjQsIDAsIDI0LCAgM30sCS8qIEhDQU4yX0NIQU4xICovCi0JezU4LCAgNCwgMjAsIDAsIDIzLCAgM30sCS8qIEkyU19DSEFOMCAgICovCi0JezU5LCAgNCwgMTYsIDAsIDIyLCAgM30sCS8qIEkyU19DSEFOMSAgICovCi0JezYwLCAgNCwgMTIsIDAsIDIxLCAgM30sCS8qIEFDOTdfQ0hBTjAgICovCi0JezYxLCAgNCwgIDgsIDAsIDIwLCAgM30sCS8qIEFDOTdfQ0hBTjEgICovCi0JezYyLCAgNCwgIDQsIDAsIDE5LCAgM30sCS8qIEkyQ19DSEFOMCAgICovCi0JezYzLCAgNCwgIDAsIDAsIDE4LCAgM30sCS8qIEkyQ19DSEFOMSAgICovCi0JLyogSU5UUFJJTzggfCBJTlRNU0swICovCi0JezUyLCAgOCwgMTYsIDAsIDExLCAgM30sCS8qIFNDSUYwX0VSSV9JUlEgKi8KLQl7NTMsICA4LCAxNiwgMCwgMTAsICAzfSwJLyogU0NJRjBfUlhJX0lSUSAqLwotCXs1NCwgIDgsIDE2LCAwLCAgOSwgIDN9LAkvKiBTQ0lGMF9CUklfSVJRICovCi0JezU1LCAgOCwgMTYsIDAsICA4LCAgM30sCS8qIFNDSUYwX1RYSV9JUlEgKi8KLQl7NjQsICA4LCAyOCwgMCwgMTcsICAzfSwJLyogVVNCSElfSVJRICovCi0JezY1LCAgOCwgMjQsIDAsIDE2LCAgM30sCS8qIExDREMgICAgICAqLwotCS8qIDY2LCA2NyB1bnVzZWQgKi8KLQl7NjgsICA4LCAyMCwgMCwgMTQsIDEzfSwJLyogRE1BQlJHSTBfSVJRICovCi0JezY5LCAgOCwgMjAsIDAsIDEzLCAxM30sCS8qIERNQUJSR0kxX0lSUSAqLwotCXs3MCwgIDgsIDIwLCAwLCAxMiwgMTN9LAkvKiBETUFCUkdJMl9JUlEgKi8KLQkvKiA3MSB1bnVzZWQgKi8KLQl7NzIsICA4LCAxMiwgMCwgIDcsICAzfSwJLyogU0NJRjFfRVJJX0lSUSAqLwotCXs3MywgIDgsIDEyLCAwLCAgNiwgIDN9LAkvKiBTQ0lGMV9SWElfSVJRICovCi0Jezc0LCAgOCwgMTIsIDAsICA1LCAgM30sCS8qIFNDSUYxX0JSSV9JUlEgKi8KLQl7NzUsICA4LCAxMiwgMCwgIDQsICAzfSwJLyogU0NJRjFfVFhJX0lSUSAqLwotCXs3NiwgIDgsICA4LCAwLCAgMywgIDN9LAkvKiBTQ0lGMl9FUklfSVJRICovCi0Jezc3LCAgOCwgIDgsIDAsICAyLCAgM30sCS8qIFNDSUYyX1JYSV9JUlEgKi8KLQl7NzgsICA4LCAgOCwgMCwgIDEsICAzfSwJLyogU0NJRjJfQlJJX0lSUSAqLwotCXs3OSwgIDgsICA4LCAwLCAgMCwgIDN9LAkvKiBTQ0lGMl9UWElfSVJRICovCi0JLyogICAgICAgICAgfCBJTlRNU0s0ICovCi0JezgwLCAgOCwgIDQsIDQsIDIzLCAgM30sCS8qIFNJTV9FUkkgKi8KLQl7ODEsICA4LCAgNCwgNCwgMjIsICAzfSwJLyogU0lNX1JYSSAqLwotCXs4MiwgIDgsICA0LCA0LCAyMSwgIDN9LAkvKiBTSU1fVFhJICovCi0JezgzLCAgOCwgIDQsIDQsIDIwLCAgM30sCS8qIFNJTV9URUkgKi8KLQl7ODQsICA4LCAgMCwgNCwgMTksICAzfSwJLyogSFNQSUkgKi8KLQkvKiBJTlRQUklPQyB8IElOVE1TSzQgKi8KLQkvKiA4NS04NyB1bnVzZWQvcmVzZXJ2ZWQgKi8KLQl7ODgsIDEyLCAyMCwgNCwgMTgsICAzfSwJLyogTU1DSTAgKi8KLQl7ODksIDEyLCAyMCwgNCwgMTcsICAzfSwJLyogTU1DSTEgKi8KLQl7OTAsIDEyLCAyMCwgNCwgMTYsICAzfSwJLyogTU1DSTIgKi8KLQl7OTEsIDEyLCAyMCwgNCwgMTUsICAzfSwJLyogTU1DSTMgKi8KLQl7OTIsIDEyLCAxMiwgNCwgIDYsICAzfSwJLyogTUZJICh1bnN1cmUsIGJ1Zz8gaW4gbXkgNzc2MCBtYW51YWwqLwotCS8qIDkzLTEwNyByZXNlcnZlZC91bmRvY3VtZW50ZWQgKi8KLQl7MTA4LDEyLCAgNCwgNCwgIDEsICAzfSwJLyogQURDICAqLwotCXsxMDksMTIsICAwLCA0LCAgMCwgIDN9LAkvKiBDTVRJICovCi0JLyogMTEwLTExMSByZXNlcnZlZC91bnVzZWQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKLQl7IFRJTUVSX0lSUSwgMCwgMjQsIDAsIElOVENfVE1VMF9NU0ssIDJ9LAotCXsgMjEsIDEsIDAsIDAsIElOVENfUlRDX01TSywgVElNRVJfUFJJT1JJVFkgfSwKLQl7IDIyLCAxLCAxLCAwLCBJTlRDX1JUQ19NU0ssIFRJTUVSX1BSSU9SSVRZIH0sCi0JeyAyMywgMSwgMiwgMCwgSU5UQ19SVENfTVNLLCBUSU1FUl9QUklPUklUWSB9LAotCXsgU0NJRjBfRVJJX0lSUSwgOCwgMjQsIDAsIElOVENfU0NJRjBfTVNLLCBTQ0lGMF9QUklPUklUWSB9LAotCXsgU0NJRjBfUlhJX0lSUSwgOCwgMjQsIDAsIElOVENfU0NJRjBfTVNLLCBTQ0lGMF9QUklPUklUWSB9LAotCXsgU0NJRjBfQlJJX0lSUSwgOCwgMjQsIDAsIElOVENfU0NJRjBfTVNLLCBTQ0lGMF9QUklPUklUWSB9LAotCXsgU0NJRjBfVFhJX0lSUSwgOCwgMjQsIDAsIElOVENfU0NJRjBfTVNLLCBTQ0lGMF9QUklPUklUWSB9LAotCi0JeyBTQ0lGMV9FUklfSVJRLCA4LCAxNiwgMCwgSU5UQ19TQ0lGMV9NU0ssIFNDSUYxX1BSSU9SSVRZIH0sCi0JeyBTQ0lGMV9SWElfSVJRLCA4LCAxNiwgMCwgSU5UQ19TQ0lGMV9NU0ssIFNDSUYxX1BSSU9SSVRZIH0sCi0JeyBTQ0lGMV9CUklfSVJRLCA4LCAxNiwgMCwgSU5UQ19TQ0lGMV9NU0ssIFNDSUYxX1BSSU9SSVRZIH0sCi0JeyBTQ0lGMV9UWElfSVJRLCA4LCAxNiwgMCwgSU5UQ19TQ0lGMV9NU0ssIFNDSUYxX1BSSU9SSVRZIH0sCi0KLQl7IFBDSUMwX0lSUSwgMHgxMCwgIDgsIDAsIElOVENfUENJQzBfTVNLLCBQQ0lDMF9QUklPUklUWSB9LAotCXsgUENJQzFfSVJRLCAweDEwLCAgMCwgMCwgSU5UQ19QQ0lDMV9NU0ssIFBDSUMxX1BSSU9SSVRZIH0sCi0JeyBQQ0lDMl9JUlEsIDB4MTQsIDI0LCAwLCBJTlRDX1BDSUMyX01TSywgUENJQzJfUFJJT1JJVFkgfSwKLQl7IFBDSUMzX0lSUSwgMHgxNCwgMTYsIDAsIElOVENfUENJQzNfTVNLLCBQQ0lDM19QUklPUklUWSB9LAotCXsgUENJQzRfSVJRLCAweDE0LCAgOCwgMCwgSU5UQ19QQ0lDNF9NU0ssIFBDSUM0X1BSSU9SSVRZIH0sCi0jZW5kaWYKLX07Ci0KLXZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCit2b2lkIG1ha2VfaW50YzJfaXJxKHN0cnVjdCBpbnRjMl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpOyBpKyspCi0JCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSArIGkpOworCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBpcHIsIGZsYWdzOworCQlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IHRhYmxlICsgaTsKKworCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKKworCQkvKiBTZXQgdGhlIHByaW9yaXR5IGxldmVsICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCQlpcHIgPSBjdHJsX2lubChJTlRDMl9CQVNFICsgcC0+aXByX29mZnNldCk7CisJCWlwciAmPSB+KDB4ZiA8PCBwLT5pcHJfc2hpZnQpOworCQlpcHIgfD0gcC0+cHJpb3JpdHkgPDwgcC0+aXByX3NoaWZ0OworCQljdHJsX291dGwoaXByLCBJTlRDMl9CQVNFICsgcC0+aXByX29mZnNldCk7CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHAtPmlycSwgJmludGMyX2lycV9jaGlwLAorCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKKwkJc2V0X2lycV9jaGlwX2RhdGEocC0+aXJxLCBwKTsKKworCQllbmFibGVfaW50YzJfaXJxKHAtPmlycSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKaW5kZXggODk0NGFiZC4uMzVlYjU3NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCkBAIC0xOSwxNSArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLQotc3RydWN0IGlwcl9kYXRhIHsKLQl1bnNpZ25lZCBpbnQgYWRkcjsJLyogQWRkcmVzcyBvZiBJbnRlcnJ1cHQgUHJpb3JpdHkgUmVnaXN0ZXIgKi8KLQlpbnQgc2hpZnQ7CQkvKiBTaGlmdHMgb2YgdGhlIDE2LWJpdCBkYXRhICovCi0JaW50IHByaW9yaXR5OwkJLyogVGhlIHByaW9yaXR5ICovCi19OworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewpAQCAtNDQsMTA3ICszNywzMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGlwcl9pcnFfY2hpcCA9IHsKLQkubmFtZQkJPSAiaXByIiwKKwkubmFtZQkJPSAiSVBSIiwKIAkubWFzawkJPSBkaXNhYmxlX2lwcl9pcnEsCiAJLnVubWFzawkJPSBlbmFibGVfaXByX2lycSwKIAkubWFza19hY2sJPSBkaXNhYmxlX2lwcl9pcnEsCiB9OwogCi12b2lkIG1ha2VfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgYWRkciwgaW50IHBvcywgaW50IHByaW9yaXR5KQordm9pZCBtYWtlX2lwcl9pcnEoc3RydWN0IGlwcl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpCiB7Ci0Jc3RydWN0IGlwcl9kYXRhIGlwcl9kYXRhOworCWludCBpOwogCi0JZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0KLQlpcHJfZGF0YS5hZGRyID0gYWRkcjsKLQlpcHJfZGF0YS5zaGlmdCA9IHBvcyo0OyAvKiBQT1NpdGlvbiAoMC0zKSB4IDQgbWVhbnMgc2hpZnQgKi8KLQlpcHJfZGF0YS5wcmlvcml0eSA9IHByaW9yaXR5OwotCi0Jc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmlwcl9pcnFfY2hpcCwgaGFuZGxlX2xldmVsX2lycSk7Ci0Jc2V0X2lycV9jaGlwX2RhdGEoaXJxLCAmaXByX2RhdGEpOwotCi0JZW5hYmxlX2lwcl9pcnEoaXJxKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBpcnEgPSB0YWJsZVtpXS5pcnE7CisJCXRhYmxlW2ldLmFkZHIgPSBtYXBfaXByaWR4X3RvX2FkZHIodGFibGVbaV0uaXByX2lkeCk7CisJCS8qIGNvdWxkIHRoZSBJUFIgaW5kZXggYmUgbWFwcGVkLCBpZiBub3Qgd2UgaWdub3JlIHRoaXMgKi8KKwkJaWYgKHRhYmxlW2ldLmFkZHIgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaXByX2lycV9jaGlwLAorCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOworCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsICZ0YWJsZVtpXSk7CisJCWVuYWJsZV9pcHJfaXJxKGlycSk7CisJfQogfQotCi0vKiBYWFg6IFRoaXMgbmVlZHMgdG8gZGllIGEgaG9ycmlibGUgZGVhdGguLiAqLwotdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKLXsKLSNpZm5kZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MAotCW1ha2VfaXByX2lycShUSU1FUl9JUlEsIFRJTUVSX0lQUl9BRERSLCBUSU1FUl9JUFJfUE9TLCBUSU1FUl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFRJTUVSMV9JUlEsIFRJTUVSMV9JUFJfQUREUiwgVElNRVIxX0lQUl9QT1MsIFRJTUVSMV9QUklPUklUWSk7Ci0jaWZkZWYgUlRDX0lSUQotCW1ha2VfaXByX2lycShSVENfSVJRLCBSVENfSVBSX0FERFIsIFJUQ19JUFJfUE9TLCBSVENfUFJJT1JJVFkpOwotI2VuZGlmCi0KLSNpZmRlZiBTQ0lfRVJJX0lSUQotCW1ha2VfaXByX2lycShTQ0lfRVJJX0lSUSwgU0NJX0lQUl9BRERSLCBTQ0lfSVBSX1BPUywgU0NJX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJX1JYSV9JUlEsIFNDSV9JUFJfQUREUiwgU0NJX0lQUl9QT1MsIFNDSV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSV9UWElfSVJRLCBTQ0lfSVBSX0FERFIsIFNDSV9JUFJfUE9TLCBTQ0lfUFJJT1JJVFkpOwotI2VuZGlmCi0KLSNpZmRlZiBTQ0lGMV9FUklfSVJRCi0JbWFrZV9pcHJfaXJxKFNDSUYxX0VSSV9JUlEsIFNDSUYxX0lQUl9BRERSLCBTQ0lGMV9JUFJfUE9TLCBTQ0lGMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSUYxX1JYSV9JUlEsIFNDSUYxX0lQUl9BRERSLCBTQ0lGMV9JUFJfUE9TLCBTQ0lGMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSUYxX0JSSV9JUlEsIFNDSUYxX0lQUl9BRERSLCBTQ0lGMV9JUFJfUE9TLCBTQ0lGMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSUYxX1RYSV9JUlEsIFNDSUYxX0lQUl9BRERSLCBTQ0lGMV9JUFJfUE9TLCBTQ0lGMV9QUklPUklUWSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkKLQltYWtlX2lwcl9pcnEoU0NJRjBfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywgU0NJRjBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShETVRFMl9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKERNVEUzX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoVklPX0lSUSwgVklPX0lQUl9BRERSLCBWSU9fSVBSX1BPUywgVklPX1BSSU9SSVRZKTsKLSNlbmRpZgotCi0jaWZkZWYgU0NJRl9FUklfSVJRCi0JbWFrZV9pcHJfaXJxKFNDSUZfRVJJX0lSUSwgU0NJRl9JUFJfQUREUiwgU0NJRl9JUFJfUE9TLCBTQ0lGX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoU0NJRl9SWElfSVJRLCBTQ0lGX0lQUl9BRERSLCBTQ0lGX0lQUl9QT1MsIFNDSUZfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShTQ0lGX0JSSV9JUlEsIFNDSUZfSVBSX0FERFIsIFNDSUZfSVBSX1BPUywgU0NJRl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFNDSUZfVFhJX0lSUSwgU0NJRl9JUFJfQUREUiwgU0NJRl9JUFJfUE9TLCBTQ0lGX1BSSU9SSVRZKTsKLSNlbmRpZgotCi0jaWZkZWYgSVJEQV9FUklfSVJRCi0JbWFrZV9pcHJfaXJxKElSREFfRVJJX0lSUSwgSVJEQV9JUFJfQUREUiwgSVJEQV9JUFJfUE9TLCBJUkRBX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJEQV9SWElfSVJRLCBJUkRBX0lQUl9BRERSLCBJUkRBX0lQUl9QT1MsIElSREFfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkRBX0JSSV9JUlEsIElSREFfSVBSX0FERFIsIElSREFfSVBSX1BPUywgSVJEQV9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSREFfVFhJX0lSUSwgSVJEQV9JUFJfQUREUiwgSVJEQV9JUFJfUE9TLCBJUkRBX1BSSU9SSVRZKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIEludGVycnVwdCBDb250cm9sbGVyIChJTlRDKQotCSAqIHJlZ2lzdGVycyB0byB0aGVpciBwb3dlciBvbiB2YWx1ZXMKLQkgKi8KLQotCS8qCi0JICogRW5hYmxlIGV4dGVybmFsIGlycSAoSU5UQyBJUlEgbW9kZSkuCi0JICogWW91IHNob3VsZCBzZXQgY29ycmVzcG9uZGluZyBiaXRzIG9mIFBGQyB0byAiMDAiCi0JICogdG8gZW5hYmxlIHRoZXNlIGludGVycnVwdHMuCi0JICovCi0JbWFrZV9pcHJfaXJxKElSUTBfSVJRLCBJUlEwX0lQUl9BRERSLCBJUlEwX0lQUl9QT1MsIElSUTBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUlExX0lSUSwgSVJRMV9JUFJfQUREUiwgSVJRMV9JUFJfUE9TLCBJUlExX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJRMl9JUlEsIElSUTJfSVBSX0FERFIsIElSUTJfSVBSX1BPUywgSVJRMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSUTNfSVJRLCBJUlEzX0lQUl9BRERSLCBJUlEzX0lQUl9QT1MsIElSUTNfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUlE0X0lSUSwgSVJRNF9JUFJfQUREUiwgSVJRNF9JUFJfUE9TLCBJUlE0X1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJRNV9JUlEsIElSUTVfSVBSX0FERFIsIElSUTVfSVBSX1BPUywgSVJRNV9QUklPUklUWSk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0NQVV9IQVNfUElOVF9JUlEKLQlpbml0X0lSUV9waW50KCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19DUFVfSEFTX0lOVEMyX0lSUQotCWluaXRfSVJRX2ludGMyKCk7Ci0jZW5kaWYKLQkvKiBQZXJmb3JtIHRoZSBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uICovCi0JaWYgKHNoX212Lm12X2luaXRfaXJxICE9IE5VTEwpCi0JCXNoX212Lm12X2luaXRfaXJxKCk7Ci0KLQlpcnFfY3R4X2luaXQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLX0KK0VYUE9SVF9TWU1CT0wobWFrZV9pcHJfaXJxKTsKIAogI2lmICFkZWZpbmVkKENPTkZJR19DUFVfSEFTX1BJTlRfSVJRKQogaW50IGlwcl9pcnFfZGVtdXgoaW50IGlycSkKQEAgLTE1Miw1ICs2OCwzIEBACiAJcmV0dXJuIGlycTsKIH0KICNlbmRpZgotCi1FWFBPUlRfU1lNQk9MKG1ha2VfaXByX2lycSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL3BpbnQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvcGludC5jCmluZGV4IDE3ZjQ3YjMuLmY2MDAwNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvcGludC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvcGludC5jCkBAIC04NCwxMiArODQsMTYgQEAKIAlkaXNhYmxlX3BpbnRfaXJxKGlycSk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgcGludF9pcHJfbWFwW10gPSB7CisJeyBQSU5UMF9JUlEsIFBJTlQwX0lQUl9BRERSLCBQSU5UMF9JUFJfUE9TLCBQSU5UMF9QUklPUklUWSB9LAorCXsgUElOVDhfSVJRLCBQSU5UOF9JUFJfQUREUiwgUElOVDhfSVBSX1BPUywgUElOVDhfUFJJT1JJVFkgfSwKK307CisKIHZvaWQgX19pbml0IGluaXRfSVJRX3BpbnQodm9pZCkKIHsKIAlpbnQgaTsKIAotCW1ha2VfaXByX2lycShQSU5UMF9JUlEsIFBJTlQwX0lQUl9BRERSLCBQSU5UMF9JUFJfUE9TLCBQSU5UMF9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKFBJTlQ4X0lSUSwgUElOVDhfSVBSX0FERFIsIFBJTlQ4X0lQUl9QT1MsIFBJTlQ4X1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEocGludF9pcHJfbWFwLCBBUlJBWV9TSVpFKHBpbnRfaXByX21hcCkpOwogCiAJZW5hYmxlX2lycShQSU5UMF9JUlEpOwogCWVuYWJsZV9pcnEoUElOVDhfSVJRKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL01ha2VmaWxlCmluZGV4IDM4OTM1M2YuLmYwZjA1OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9NYWtlZmlsZQpAQCAtMiw1ICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eC9TdXBlckggU0gtMiBiYWNrZW5kcy4KICMKIAotb2JqLXkJOj0gcHJvYmUubworb2JqLXkJOj0gZXgubyBwcm9iZS5vIGVudHJ5Lm8KIAorb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkgKz0gc2V0dXAtc2g3NjE5Lm8gY2xvY2stc2g3NjE5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvY2xvY2stc2g3NjE5LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2Nsb2NrLXNoNzYxOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDQwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2Nsb2NrLXNoNzYxOS5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2Nsb2NrLXNoNzYxOS5jCisgKgorICogU0g3NjE5IHN1cHBvcnQgZm9yIHRoZSBjbG9jayBmcmFtZXdvcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBZb3NoaW5vcmkgU2F0bworICoKKyAqIEJhc2VkIG9uIGNsb2NrLXNoNC5jCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2ZyZXEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworY29uc3Qgc3RhdGljIGludCBwbGwxcmF0ZVtdPXsxLDJ9OworY29uc3Qgc3RhdGljIGludCBwZmNfZGl2aXNvcnNbXT17MSwyLDAsNH07CisKKyNpZiAoQ09ORklHX1NIX0NMS19NRCA9PSAxKSB8fCAoQ09ORklHX1NIX0NMS19NRCA9PSAyKQorI2RlZmluZSBQTEwyICg0KQorI2VsaWYgKENPTkZJR19TSF9DTEtfTUQgPT0gNSkgfHwgKENPTkZJR19TSF9DTEtfTUQgPT0gNikKKyNkZWZpbmUgUExMMiAoMikKKyNlbHNlCisjZXJyb3IgIklsbGlnYWwgQ2xvY2sgTW9kZSEiCisjZW5kaWYKKworc3RhdGljIHZvaWQgbWFzdGVyX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwljbGstPnJhdGUgKj0gUExMMiAqIHBsbDFyYXRlWyhjdHJsX2ludyhGUkVRQ1IpID4+IDgpICYgN107Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc2MTlfbWFzdGVyX2Nsa19vcHMgPSB7CisJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAorfTsKKworc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoY3RybF9pbncoRlJFUUNSKSAmIDB4MDAwNyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzYxOV9tb2R1bGVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGxsMXJhdGVbKGN0cmxfaW53KEZSRVFDUikgPj4gOCkgJiA3XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzYxOV9idXNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NjE5X2NwdV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMgKnNoNzYxOV9jbGtfb3BzW10gPSB7CisJJnNoNzYxOV9tYXN0ZXJfY2xrX29wcywKKwkmc2g3NjE5X21vZHVsZV9jbGtfb3BzLAorCSZzaDc2MTlfYnVzX2Nsa19vcHMsCisJJnNoNzYxOV9jcHVfY2xrX29wcywKK307CisKK3ZvaWQgX19pbml0IGFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqb3BzLCBpbnQgaWR4KQoreworCWlmIChpZHggPCBBUlJBWV9TSVpFKHNoNzYxOV9jbGtfb3BzKSkKKwkJKm9wcyA9IHNoNzYxOV9jbGtfb3BzW2lkeF07Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTFmYTVlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUworICoKKyAqIFRoZSBTSC0yIGV4Y2VwdGlvbiBlbnRyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwyMDA2IFlvc2hpbm9yaSBTYXRvCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIEFYRSxJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vY3B1L21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisJCisvKiBPZmZzZXRzIHRvIHRoZSBzdGFjayAqLworT0ZGX1IwICA9ICAwCQkvKiBSZXR1cm4gdmFsdWUuIE5ldyBBQkkgYWxzbyBhcmc0ICovCitPRkZfUjEgID0gIDQgICAgIAkvKiBOZXcgQUJJOiBhcmc1ICovCitPRkZfUjIgID0gIDggICAgIAkvKiBOZXcgQUJJOiBhcmc2ICovCitPRkZfUjMgID0gIDEyICAgICAJLyogTmV3IEFCSTogc3lzY2FsbF9uciAqLworT0ZGX1I0ICA9ICAxNiAgICAgCS8qIE5ldyBBQkk6IGFyZzAgKi8KK09GRl9SNSAgPSAgMjAgICAgIAkvKiBOZXcgQUJJOiBhcmcxICovCitPRkZfUjYgID0gIDI0ICAgICAJLyogTmV3IEFCSTogYXJnMiAqLworT0ZGX1I3ICA9ICAyOCAgICAgCS8qIE5ldyBBQkk6IGFyZzMgKi8KK09GRl9TUAk9ICAoMTUqNCkKK09GRl9QQyAgPSAgKDE2KjQpCitPRkZfU1IJPSAgKDE2KjQrMio0KQorT0ZGX1RSQQk9ICAoMTYqNCs2KjQpCisKKyNpbmNsdWRlIDxhc20vZW50cnktbWFjcm9zLlM+CisKK0VOVFJZKGV4Y2VwdGlvbl9oYW5kbGVyKQorCSEgYWxyZWFkeSBzYXZlZCByMC9yMQorCW1vdi5sCXIyLEAtc3AKKwltb3YubAlyMyxALXNwCisJbW92CXIwLHIxCisJY2xpCisJbW92LmwJJGNwdV9tb2RlLHIyCisJbW92LmwJQHIyLHIwCisJbW92LmwJQCg1KjQscjE1KSxyMwkhIHByZXZpb3VzIFNSCisJc2hsbDIJcjMJCSEgc2V0ICJTIiBmbGFnCisJcm90bAlyMAkJISBUIDwtICJTIiBmbGFnCisJcm90bAlyMAkJISAiUyIgZmxhZyBpcyBMU0IKKwlyb3RjcglyMwkJISBUIC0+IHIzOmIzMAorCXNobHIJcjMKKwlzaGxyCXIwCisJYnQvcwkxZgorCSBtb3YubAlyMyxAKDUqNCxyMTUpCSEgY29weSBjcHUgbW9kZSB0byBTUgorCSEgc3dpdGNoIHRvIGtlcm5lbCBtb2RlCisJbW92CSMxLHIwCisJcm90cglyMAorCXJvdHIJcjAKKwltb3YubAlyMCxAcjIJCSEgZW50ZXIga2VybmVsIG1vZGUKKwltb3YubAkkY3VycmVudF90aHJlYWRfaW5mbyxyMgorCW1vdi5sCUByMixyMgorCW1vdgkjMHgyMCxyMAorCXNobGw4CXIwCisJYWRkCXIyLHIwCisJbW92CXIxNSxyMgkJISByMiA9IHVzZXIgc3RhY2sgdG9wCisJbW92CXIwLHIxNQkJISBzd2l0Y2gga2VybmVsIHN0YWNrCisJYWRkCSMtNCxyMTUJCSEgZHVtbXkKKwltb3YubAlyMSxALXIxNQkhIFRSQQorCXN0cy5sCW1hY2wsIEAtcjE1CisJc3RzLmwJbWFjaCwgQC1yMTUKKwlzdGMubAlnYnIsIEAtcjE1CisJbW92LmwJQCg0KjQscjIpLHIwCisJbW92LmwJQCg1KjQscjIpLHIxCisJbW92LmwJcjEsQC1yMTUJISBvcmlnaW5hbCBTUgorCXN0cy5sCXByLEAtcjE1CisJbW92LmwJcjAsQC1yMTUJISBvcmlnaW5hbCBQQworCW1vdglyMixyMworCWFkZAkjKDQrMikqNCxyMwkhIHJld2luZCByMCAtIHIzICsgZXhjZXB0aW9uIGZyYW1lCisJbW92LmwJcjMsQC1yMTUJISBvcmlnaW5hbCBTUAorCW1vdi5sCXIxNCxALXIxNQorCW1vdi5sCXIxMyxALXIxNQorCW1vdi5sCXIxMixALXIxNQorCW1vdi5sCXIxMSxALXIxNQorCW1vdi5sCXIxMCxALXIxNQorCW1vdi5sCXI5LEAtcjE1CisJbW92LmwJcjgsQC1yMTUKKwltb3YubAlyNyxALXIxNQorCW1vdi5sCXI2LEAtcjE1CisJbW92LmwJcjUsQC1yMTUKKwltb3YubAlyNCxALXIxNQorCW1vdglyMixyOAkJISBjb3B5IHVzZXIgLT4ga2VybmVsIHN0YWNrCisJbW92LmwJQHI4KyxyMworCW1vdi5sCXIzLEAtcjE1CisJbW92LmwJQHI4KyxyMgorCW1vdi5sCXIyLEAtcjE1CisJbW92LmwJQHI4KyxyMQorCW1vdi5sCXIxLEAtcjE1CisJbW92LmwJQHI4KyxyMAorCWJyYQkyZgorCSBtb3YubAlyMCxALXIxNQorMToKKwkhIGluIGtlcm5lbCBleGNlcHRpb24KKwltb3YJIygyMi00LTQtMSkqNCs0LHIwCisJbW92CXIxNSxyMgorCXN1YglyMCxyMTUKKwltb3YubAlAcjIrLHIwCQkhIG9sZCBSMworCW1vdi5sCXIwLEAtcjE1CQorCW1vdi5sCUByMisscjAJCSEgb2xkIFIyCisJbW92LmwJcjAsQC1yMTUJCisJbW92LmwJQHIyKyxyMAkJISBvbGQgUjEKKwltb3YubAlyMCxALXIxNQkKKwltb3YubAlAcjIrLHIwCQkhIG9sZCBSMAorCW1vdi5sCXIwLEAtcjE1CQorCW1vdi5sCUByMisscjMJCSEgb2xkIFBDCisJbW92LmwJQHIyKyxyMAkJISBvbGQgU1IKKwlhZGQJIy00LHIyCQkhIGV4Y2VwdGlvbiBmcmFtZSBzdHViIChzcikKKwltb3YubAlyMSxALXIyCQkhIFRSQQorCXN0cy5sCW1hY2wsIEAtcjIKKwlzdHMubAltYWNoLCBALXIyCisJc3RjLmwJZ2JyLCBALXIyCisJbW92LmwJcjAsQC1yMgkJISBzYXZlIG9sZCBTUgorCXN0cy5sCXByLEAtcjIKKwltb3YubAlyMyxALXIyCQkhIHNhdmUgb2xkIFBDCisJbW92CXIyLHIwCisJYWRkCSM4KjQscjAKKwltb3YubAlyMCxALXIyCQkhIHNhdmUgb2xkIFNQCisJbW92LmwJcjE0LEAtcjIKKwltb3YubAlyMTMsQC1yMgorCW1vdi5sCXIxMixALXIyCisJbW92LmwJcjExLEAtcjIKKwltb3YubAlyMTAsQC1yMgorCW1vdi5sCXI5LEAtcjIKKwltb3YubAlyOCxALXIyCisJbW92LmwJcjcsQC1yMgorCW1vdi5sCXI2LEAtcjIKKwltb3YubAlyNSxALXIyCisJbW92LmwJcjQsQC1yMgorCW1vdi5sCUAoT0ZGX1IwLHIxNSkscjAKKwltb3YubAlAKE9GRl9SMSxyMTUpLHIxCisJbW92LmwJQChPRkZfUjIscjE1KSxyMgorCW1vdi5sCUAoT0ZGX1IzLHIxNSkscjMKKzI6CisJbW92CSNPRkZfVFJBLHI4CisJYWRkCXIxNSxyOAorCW1vdi5sCUByOCxyOQkKKwltb3YJIzY0LHI4CisJY21wL2hzCXI4LHI5CisJYnQJaW50ZXJydXB0X2VudHJ5CSEgdmVjID49IDY0IGlzIGludGVycnVwdAorCW1vdgkjMzIscjgKKwljbXAvaHMJcjgscjkKKwlidAl0cmFwX2VudHJ5CSEgNjQgPiB2ZWMgPj0gMzIgIGlzIHRyYXAKKwltb3YubAk0ZixyOAorCW1vdglyOSxyNAorCXNobGwyCXI5CisJYWRkCXI5LHI4CisJbW92LmwJQHI4LHI4CisJbW92CSMwLHI5CisJY21wL2VxCXI5LHI4CisJYmYJM2YKKwltb3YubAk4ZixyOAkJISB1bmhhbmRsZWQgZXhjZXB0aW9uCiszOgorCW1vdi5sCTVmLHIxMAorCWptcAlAcjgKKwkgbGRzCXIxMCxwcgorCitpbnRlcnJ1cHRfZW50cnk6CisJbW92CXI5LHI0CisJbW92LmwJNmYscjkKKwltb3YubAk3ZixyOAorCWptcAlAcjgKKwkgbGRzCXI5LHByCisKKwkuYWxpZ24JMgorNDoJLmxvbmcJZXhjZXB0aW9uX2hhbmRsaW5nX3RhYmxlCis1OgkubG9uZwlyZXRfZnJvbV9leGNlcHRpb24KKzY6CS5sb25nCXJldF9mcm9tX2lycQorNzoJLmxvbmcJZG9fSVJRCis4OgkubG9uZwlkb19leGNlcHRpb25fZXJyb3IKKwkKK3RyYXBfZW50cnk6CisJLyogdmVyYm9zZSBCVUcgdHJhcGEgZW50cnkgY2hlY2sgKi8KKwltb3YJIzB4M2UscjgKKwljbXAvZ2UJcjgscjkKKwliZi9zCTFmCisJIGFkZAkjLTB4MTAscjkKKwlhZGQJIzB4MTAscjkKKzE6CQorCXNobGwyCXI5CQkJISBUUkEKKwltb3YJI09GRl9UUkEscjgKKwlhZGQJcjE1LHI4CisJbW92LmwJcjksQHI4CisJbW92CXI5LHI4CisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJbW92LmwJMmYsIHI5CisJanNyCUByOQorCSBub3AKKyNlbmRpZgorCXN0aQorCWJyYQlzeXN0ZW1fY2FsbAorCSBub3AKKwkKKwkuYWxpZ24JMgorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworMjoJLmxvbmcJdHJhY2VfaGFyZGlycXNfb24KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKKwkvKiBVbndpbmQgdGhlIHN0YWNrIGFuZCBqbXAgdG8gdGhlIGRlYnVnIGVudHJ5ICovCitkZWJ1Z19rZXJuZWxfZnc6CisJbW92CXIxNSxyMAorCWFkZAkjKDIyLTQpKjQtNCxyMAorCWxkYy5sCUByMCssZ2JyCisJbGRzLmwJQHIwKyxtYWNoCisJbGRzLmwJQHIwKyxtYWNsCisJbW92CXIxNSxyMAorCW1vdi5sCUAoT0ZGX1NQLHIwKSxyMQorCW1vdgkjT0ZGX1NSLHIyCisJbW92LmwJQChyMCxyMikscjMKKwltb3YubAlyMyxALXIxCisJbW92CSNPRkZfU1AscjIKKwltb3YubAlAKHIwLHIyKSxyMworCW1vdi5sCXIzLEAtcjEKKwltb3YJcjE1LHIwCisJYWRkCSMoMjItNCkqNC04LHIwCisJbW92LmwJMWYscjIKKwltb3YubAlAcjIscjIKKwlzdGMJc3IscjMKKwltb3YubAlyMixAcjAKKwltb3YubAlyMyxAcjAKKwltb3YubAlyMSxAKDgscjApCQorCW1vdi5sCUByMTUrLCByMAorCW1vdi5sCUByMTUrLCByMQorCW1vdi5sCUByMTUrLCByMgorCW1vdi5sCUByMTUrLCByMworCW1vdi5sCUByMTUrLCByNAorCW1vdi5sCUByMTUrLCByNQorCW1vdi5sCUByMTUrLCByNgorCW1vdi5sCUByMTUrLCByNworCW1vdi5sCUByMTUrLCByOAorCW1vdi5sCUByMTUrLCByOQorCW1vdi5sCUByMTUrLCByMTAKKwltb3YubAlAcjE1KywgcjExCisJbW92LmwJQHIxNSssIHIxMgorCW1vdi5sCUByMTUrLCByMTMKKwltb3YubAlAcjE1KywgcjE0CisJYWRkCSM4LHIxNQorCWxkcy5sCUByMTUrLCBwcgorCXJ0ZQorCSBtb3YubAlAcjE1KyxyMTUKKwkuYWxpZ24JMgorMToJLmxvbmcJZ2RiX3Zicl92ZWN0b3IKKyNlbmRpZiAvKiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyAqLworCitFTlRSWShhZGRyZXNzX2Vycm9yX2hhbmRsZXIpCisJbW92CXIxNSxyNAkJCQkhIHJlZ3MKKwlhZGQJIzQscjQKKwltb3YJI09GRl9QQyxyMAorCW1vdi5sCUAocjAscjE1KSxyNgkJCSEgcGMKKwltb3YubAkxZixyMAorCWptcAlAcjAKKwkgbW92CSMwLHI1CQkJCSEgd3JpdGVhY2Nlc3MgaXMgdW5rbm93bgorCS5hbGlnbgkyCisKKzE6CS5sb25nCWRvX2FkZHJlc3NfZXJyb3IKKworcmVzdG9yZV9hbGw6CisJY2xpCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJbW92LmwJMWYsIHIwCisJanNyCUByMAorCSBub3AKKyNlbmRpZgorCW1vdglyMTUscjAKKwltb3YubAkkY3B1X21vZGUscjIKKwltb3YJI09GRl9TUixyMworCW1vdi5sCUAocjAscjMpLHIxCisJbW92LmwJcjEsQHIyCisJc2hsbDIJcjEJCQkJISBjbGVhciBNRCBiaXQKKwlzaGxyMglyMQorCW1vdi5sCUAoT0ZGX1NQLHIwKSxyMgorCWFkZAkjLTgscjIKKwltb3YubAlyMixAKE9GRl9TUCxyMCkJCQkhIHBvaW50IGV4Y2VwdGlvbiBmcmFtZSB0b3AKKwltb3YubAlyMSxAKDQscjIpCQkJISBzZXQgc3IKKwltb3YJI09GRl9QQyxyMworCW1vdi5sCUAocjAscjMpLHIxCisJbW92LmwJcjEsQHIyCQkJCSEgc2V0IHBjCisJYWRkCSM0KjE2KzQscjAKKwlsZHMubAlAcjArLHByCisJYWRkCSM0LHIwCQkJCSEgc2tpcCBzcgorCWxkYy5sCUByMCssZ2JyCisJbGRzLmwJQHIwKyxtYWNoCisJbGRzLmwJQHIwKyxtYWNsCisJZ2V0X2N1cnJlbnRfdGhyZWFkX2luZm8gcjAsIHIxCisJbW92LmwJJGN1cnJlbnRfdGhyZWFkX2luZm8scjEKKwltb3YubAlyMCxAcjEKKwltb3YubAlAcjE1KyxyMAorCW1vdi5sCUByMTUrLHIxCisJbW92LmwJQHIxNSsscjIKKwltb3YubAlAcjE1KyxyMworCW1vdi5sCUByMTUrLHI0CisJbW92LmwJQHIxNSsscjUKKwltb3YubAlAcjE1KyxyNgorCW1vdi5sCUByMTUrLHI3CisJbW92LmwJQHIxNSsscjgKKwltb3YubAlAcjE1KyxyOQorCW1vdi5sCUByMTUrLHIxMAorCW1vdi5sCUByMTUrLHIxMQorCW1vdi5sCUByMTUrLHIxMgorCW1vdi5sCUByMTUrLHIxMworCW1vdi5sCUByMTUrLHIxNAorCW1vdi5sCUByMTUscjE1CisJcnRlCisJIG5vcAorCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisxOiAgICAgLmxvbmcgICB0cmFjZV9oYXJkaXJxc19vZmYKKyNlbmRpZgorJGN1cnJlbnRfdGhyZWFkX2luZm86CisJLmxvbmcJX19jdXJyZW50X3RocmVhZF9pbmZvCiskY3B1X21vZGU6CQorCS5sb25nCV9fY3B1X21vZGUKKwkJCishIGNvbW1vbiBleGNlcHRpb24gaGFuZGxlcgorI2luY2x1ZGUgIi4uLy4uL2VudHJ5LWNvbW1vbi5TIgorCQorCS5kYXRhCishIGNwdSBvcGVyYXRpb24gbW9kZSAKKyEgYml0MzAgPSBNRCAoY29tcGF0aWJsZSBTSDMvNCkKK19fY3B1X21vZGU6CisJLmxvbmcJMHg0MDAwMDAwMAorCQkKKwkuc2VjdGlvbgkuYnNzCitfX2N1cnJlbnRfdGhyZWFkX2luZm86CisJLmxvbmcJMAorCitFTlRSWShleGNlcHRpb25faGFuZGxpbmdfdGFibGUpCisJLnNwYWNlCTQqMzIKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZXguUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZXguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI4NWFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9leC5TCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2V4LlMKKyAqCisgKiBUaGUgU0gtMiBleGNlcHRpb24gdmVjdG9yIHRhYmxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFlvc2hpbm9yaSBTYXRvCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworIQorISBjb252ZXJ0IEV4Y2VwdGlvbiBWZWN0b3IgdG8gRXhjZXB0aW9uIE51bWJlcgorIQorZXhjZXB0aW9uX2VudHJ5OgkKK25vCT0JMAorCS5yZXB0CTI1NgorCW1vdi5sCXIwLEAtc3AKKwltb3YJI25vLHIwCisJYnJhCWV4Y2VwdGlvbl90cmFtcG9saW5lCisJYW5kCSMweGZmLHIwCitubwk9CW5vICsgMQorCS5lbmRyCitleGNlcHRpb25fdHJhbXBvbGluZToKKwltb3YubAlyMSxALXNwCisJbW92LmwJJGV4Y2VwdGlvbl9oYW5kbGVyLHIxCisJam1wCUByMQorCisJLmFsaWduCTIKKyRleGNlcHRpb25fZW50cnk6CisJLmxvbmcJZXhjZXB0aW9uX2VudHJ5CiskZXhjZXB0aW9uX2hhbmRsZXI6CisJLmxvbmcJZXhjZXB0aW9uX2hhbmRsZXIKKyEKKyEgRXhjZXB0aW9uIFZlY3RvciBCYXNlCishCisJLmFsaWduCTIKK0VOVFJZKHZicl9iYXNlKQordmVjdG9yCT0JMAorCS5yZXB0CTI1NgorCS5sb25nCWV4Y2VwdGlvbl9lbnRyeSArIHZlY3RvciAqIDgKK3ZlY3Rvcgk9CXZlY3RvciArIDEKKwkuZW5kcgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jCmluZGV4IGYxN2EyYTAuLmJhNTI3ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMKQEAgLTE3LDE3ICsxNywyMyBAQAogCiBpbnQgX19pbml0IGRldGVjdF9jcHVfYW5kX2NhY2hlX3N5c3RlbSh2b2lkKQogewotCS8qCi0JICogRm9yIG5vdywgYXNzdW1lIFNINzYwNCAuLiBmaXggdGhpcyBsYXRlci4KLQkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCiAJY3B1X2RhdGEtPnR5cGUJCQk9IENQVV9TSDc2MDQ7CiAJY3B1X2RhdGEtPmRjYWNoZS53YXlzCQk9IDQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS53YXlfc2hpZnQJPSA2OworCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTApOwogCWNwdV9kYXRhLT5kY2FjaGUuc2V0cwkJPSA2NDsKIAljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0CT0gNDsKIAljcHVfZGF0YS0+ZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKIAljcHVfZGF0YS0+ZGNhY2hlLmZsYWdzCQk9IDA7Ci0KKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkKKwljcHVfZGF0YS0+dHlwZQkJCT0gQ1BVX1NINzYxOTsKKwljcHVfZGF0YS0+ZGNhY2hlLndheXMJCT0gNDsKKwljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyCT0gKDE8PDEyKTsKKwljcHVfZGF0YS0+ZGNhY2hlLnNldHMJCT0gMjU2OworCWNwdV9kYXRhLT5kY2FjaGUuZW50cnlfc2hpZnQJPSA0OworCWNwdV9kYXRhLT5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOworCWNwdV9kYXRhLT5kY2FjaGUuZmxhZ3MJCT0gMDsKKyNlbmRpZgogCS8qCiAJICogU0gtMiBkb2Vzbid0IGhhdmUgc2VwYXJhdGUgY2FjaGVzCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI4M2U2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogU0g3NjE5IFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgWW9zaGlub3JpIFNhdG8KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2NpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSAweGY4NDAwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0gIHsgODgsIDg5LCA5MSwgOTB9LAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGY4NDEwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0gIHsgOTIsIDkzLCA5NSwgOTR9LAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGY4NDIwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0gIHsgOTYsIDk3LCA5OSwgOTh9LAorCX0sIHsKKwkJLmZsYWdzID0gMCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1zY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBzY2lfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzYxOV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc2NpX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoNzYxOV9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzYxOV9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNoNzYxOV9kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKHNoNzYxOV9kZXZpY2VzX3NldHVwKTsKKworI2RlZmluZSBJTlRDX0lQUkMgICAgICAweGY4MDgwMDAwVUwKKyNkZWZpbmUgSU5UQ19JUFJEICAgICAgMHhmODA4MDAwMlVMCisKKyNkZWZpbmUgQ01JMF9JUlEgICAgICAgODYKKworI2RlZmluZSBTQ0lGMF9FUklfSVJRICA4OAorI2RlZmluZSBTQ0lGMF9SWElfSVJRICA4OQorI2RlZmluZSBTQ0lGMF9CUklfSVJRICA5MAorI2RlZmluZSBTQ0lGMF9UWElfSVJRICA5MQorCisjZGVmaW5lIFNDSUYxX0VSSV9JUlEgIDkyCisjZGVmaW5lIFNDSUYxX1JYSV9JUlEgIDkzCisjZGVmaW5lIFNDSUYxX0JSSV9JUlEgIDk0CisjZGVmaW5lIFNDSUYxX1RYSV9JUlEgIDk1CisKKyNkZWZpbmUgU0NJRjJfQlJJX0lSUSAgOTYKKyNkZWZpbmUgU0NJRjJfRVJJX0lSUSAgOTcKKyNkZWZpbmUgU0NJRjJfUlhJX0lSUSAgOTgKKyNkZWZpbmUgU0NJRjJfVFhJX0lSUSAgOTkKKworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc2MTlfaXByX21hcFtdID0geworCXsgQ01JMF9JUlEsICAgICAgSU5UQ19JUFJDLCAxLCAyIH0sCisJeyBTQ0lGMF9FUklfSVJRLCBJTlRDX0lQUkQsIDMsIDMgfSwKKwl7IFNDSUYwX1JYSV9JUlEsIElOVENfSVBSRCwgMywgMyB9LAorCXsgU0NJRjBfQlJJX0lSUSwgSU5UQ19JUFJELCAzLCAzIH0sCisJeyBTQ0lGMF9UWElfSVJRLCBJTlRDX0lQUkQsIDMsIDMgfSwKKwl7IFNDSUYxX0VSSV9JUlEsIElOVENfSVBSRCwgMiwgMyB9LAorCXsgU0NJRjFfUlhJX0lSUSwgSU5UQ19JUFJELCAyLCAzIH0sCisJeyBTQ0lGMV9CUklfSVJRLCBJTlRDX0lQUkQsIDIsIDMgfSwKKwl7IFNDSUYxX1RYSV9JUlEsIElOVENfSVBSRCwgMiwgMyB9LAorCXsgU0NJRjJfRVJJX0lSUSwgSU5UQ19JUFJELCAxLCAzIH0sCisJeyBTQ0lGMl9SWElfSVJRLCBJTlRDX0lQUkQsIDEsIDMgfSwKKwl7IFNDSUYyX0JSSV9JUlEsIElOVENfSVBSRCwgMSwgMyB9LAorCXsgU0NJRjJfVFhJX0lSUSwgSU5UQ19JUFJELCAxLCAzIH0sCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKK3sKKwltYWtlX2lwcl9pcnEoc2g3NjE5X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NjE5X2lwcl9tYXApKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwOTcyYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eC9TdXBlckggU0gtMkEgYmFja2VuZHMuCisjCisKK29iai15CTo9IGNvbW1vbi5vIHByb2JlLm8KKworY29tbW9uLXkJKz0gJChhZGRwcmVmaXggLi4vc2gyLywgZXgubykKK2NvbW1vbi15CSs9ICQoYWRkcHJlZml4IC4uL3NoMi8sIGVudHJ5Lm8pCisKK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYpICs9IHNldHVwLXNoNzIwNi5vIGNsb2NrLXNoNzIwNi5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9jbG9jay1zaDcyMDYuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL2Nsb2NrLXNoNzIwNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YWQzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9jbG9jay1zaDcyMDYuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvY2xvY2stc2g3MjA2LmMKKyAqCisgKiBTSDcyMDYgc3VwcG9ydCBmb3IgdGhlIGNsb2NrIGZyYW1ld29yaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFlvc2hpbm9yaSBTYXRvCisgKgorICogQmFzZWQgb24gY2xvY2stc2g0LmMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitjb25zdCBzdGF0aWMgaW50IHBsbDFyYXRlW109ezEsMiwzLDQsNiw4fTsKK2NvbnN0IHN0YXRpYyBpbnQgcGZjX2Rpdmlzb3JzW109ezEsMiwzLDQsNiw4LDEyfTsKKyNkZWZpbmUgaWZjX2Rpdmlzb3JzIHBmY19kaXZpc29ycworCisjaWYgKENPTkZJR19TSF9DTEtfTUQgPT0gMikKKyNkZWZpbmUgUExMMiAoNCkKKyNlbGlmIChDT05GSUdfU0hfQ0xLX01EID09IDYpCisjZGVmaW5lIFBMTDIgKDIpCisjZWxpZiAoQ09ORklHX1NIX0NMS19NRCA9PSA3KQorI2RlZmluZSBQTEwyICgxKQorI2Vsc2UKKyNlcnJvciAiSWxsaWdhbCBDbG9jayBNb2RlISIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSAqPSBQTEwyICogcGxsMXJhdGVbKGN0cmxfaW53KEZSRVFDUikgPj4gOCkgJiAweDAwMDddOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MjA2X21hc3Rlcl9jbGtfb3BzID0geworCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKGN0cmxfaW53KEZSRVFDUikgJiAweDAwMDcpOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDcyMDZfbW9kdWxlX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBsbDFyYXRlWyhjdHJsX2ludyhGUkVRQ1IpID4+IDgpICYgMHgwMDA3XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzIwNl9idXNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoY3RybF9pbncoRlJFUUNSKSAmIDB4MDAwNyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzIwNl9jcHVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDcyMDZfY2xrX29wc1tdID0geworCSZzaDcyMDZfbWFzdGVyX2Nsa19vcHMsCisJJnNoNzIwNl9tb2R1bGVfY2xrX29wcywKKwkmc2g3MjA2X2J1c19jbGtfb3BzLAorCSZzaDcyMDZfY3B1X2Nsa19vcHMsCit9OworCit2b2lkIF9faW5pdCBhcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKm9wcywgaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDcyMDZfY2xrX29wcykpCisJCSpvcHMgPSBzaDcyMDZfY2xrX29wc1tpZHhdOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvcHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2M2YzA1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3Byb2JlLmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL2NwdS9zaDJhL3Byb2JlLmMKKyAqCisgKiBDUFUgU3VidHlwZSBQcm9iaW5nIGZvciBTSC0yQS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCitpbnQgX19pbml0IGRldGVjdF9jcHVfYW5kX2NhY2hlX3N5c3RlbSh2b2lkKQoreworCS8qIEp1c3QgU0g3MjA2IGZvciBub3cgLi4gKi8KKwljcHVfZGF0YS0+dHlwZQkJCT0gQ1BVX1NINzIwNjsKKworCWNwdV9kYXRhLT5kY2FjaGUud2F5cwkJPSA0OworCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMSk7CisJY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IDEyODsKKwljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0CT0gNDsKKwljcHVfZGF0YS0+ZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwljcHVfZGF0YS0+ZGNhY2hlLmZsYWdzCQk9IDA7CisKKwkvKgorCSAqIFRoZSBpY2FjaGUgaXMgdGhlIHNhbWUgYXMgdGhlIGRjYWNoZSBhcyBmYXIgYXMgdGhpcyBzZXR1cCBpcworCSAqIGNvbmNlcm5lZC4gVGhlIG9ubHkgcmVhbCBkaWZmZXJlbmNlIGluIGhhcmR3YXJlIGlzIHRoYXQgdGhlIGljYWNoZQorCSAqIGxhY2tzIHRoZSBVIGJpdCB0aGF0IHRoZSBkY2FjaGUgaGFzLCBub25lIG9mIHRoaXMgaGFzIGFueSBiZWFyaW5nCisJICogb24gdGhlIGNhY2hlIGluZm8uCisJICovCisJY3B1X2RhdGEtPmljYWNoZQkJPSBjcHVfZGF0YS0+ZGNhY2hlOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwNi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2MGZjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwNi5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogU0g3MjA2IFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgWW9zaGlub3JpIFNhdG8KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2NpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSAweGZmZmU4MDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0gIHsgMjQxLCAyNDIsIDI0MywgMjQwfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmZlODgwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9ICB7IDI0NywgMjQ0LCAyNDUsIDI0Nn0sCisJfSwgeworCQkubWFwYmFzZQk9IDB4ZmZmZTkwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSAgeyAyNDksIDI1MCwgMjUxLCAyNDh9LAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGZmZmU5ODAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0gIHsgMjUzLCAyNTQsIDI1NSwgMjUyfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDcyMDZfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNjaV9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDcyMDZfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDcyMDZfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDcyMDZfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDcyMDZfZGV2aWNlc19zZXR1cCk7CisKKyNkZWZpbmUgSU5UQ19JUFIwOCAgICAgMHhmZmZlMGMwNFVMCisjZGVmaW5lIElOVENfSVBSMDkgICAgIDB4ZmZmZTBjMDZVTAorI2RlZmluZSBJTlRDX0lQUjE0ICAgICAweGZmZmUwYzEwVUwKKworI2RlZmluZSBDTUkwX0lSUSAgICAgICAxNDAKKworI2RlZmluZSBNVFUxX1RHSTFBICAgICAxNjQKKworI2RlZmluZSBTQ0lGMF9CUklfSVJRICAyNDAKKyNkZWZpbmUgU0NJRjBfRVJJX0lSUSAgMjQxCisjZGVmaW5lIFNDSUYwX1JYSV9JUlEgIDI0MgorI2RlZmluZSBTQ0lGMF9UWElfSVJRICAyNDMKKworI2RlZmluZSBTQ0lGMV9CUklfSVJRICAyNDQKKyNkZWZpbmUgU0NJRjFfRVJJX0lSUSAgMjQ1CisjZGVmaW5lIFNDSUYxX1JYSV9JUlEgIDI0NgorI2RlZmluZSBTQ0lGMV9UWElfSVJRICAyNDcKKworI2RlZmluZSBTQ0lGMl9CUklfSVJRICAyNDgKKyNkZWZpbmUgU0NJRjJfRVJJX0lSUSAgMjQ5CisjZGVmaW5lIFNDSUYyX1JYSV9JUlEgIDI1MAorI2RlZmluZSBTQ0lGMl9UWElfSVJRICAyNTEKKworI2RlZmluZSBTQ0lGM19CUklfSVJRICAyNTIKKyNkZWZpbmUgU0NJRjNfRVJJX0lSUSAgMjUzCisjZGVmaW5lIFNDSUYzX1JYSV9JUlEgIDI1NAorI2RlZmluZSBTQ0lGM19UWElfSVJRICAyNTUKKworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDcyMDZfaXByX21hcFtdID0geworCXsgQ01JMF9JUlEsICAgICAgSU5UQ19JUFIwOCwgMywgMiB9LAorCXsgTVRVMl9UR0kxQSwgICAgSU5UQ19JUFIwOSwgMSwgMiB9LAorCXsgU0NJRjBfRVJJX0lSUSwgSU5UQ19JUFIxNCwgMywgMyB9LAorCXsgU0NJRjBfUlhJX0lSUSwgSU5UQ19JUFIxNCwgMywgMyB9LAorCXsgU0NJRjBfQlJJX0lSUSwgSU5UQ19JUFIxNCwgMywgMyB9LAorCXsgU0NJRjBfVFhJX0lSUSwgSU5UQ19JUFIxNCwgMywgMyB9LAorCXsgU0NJRjFfRVJJX0lSUSwgSU5UQ19JUFIxNCwgMiwgMyB9LAorCXsgU0NJRjFfUlhJX0lSUSwgSU5UQ19JUFIxNCwgMiwgMyB9LAorCXsgU0NJRjFfQlJJX0lSUSwgSU5UQ19JUFIxNCwgMiwgMyB9LAorCXsgU0NJRjFfVFhJX0lSUSwgSU5UQ19JUFIxNCwgMiwgMyB9LAorCXsgU0NJRjJfRVJJX0lSUSwgSU5UQ19JUFIxNCwgMSwgMyB9LAorCXsgU0NJRjJfUlhJX0lSUSwgSU5UQ19JUFIxNCwgMSwgMyB9LAorCXsgU0NJRjJfQlJJX0lSUSwgSU5UQ19JUFIxNCwgMSwgMyB9LAorCXsgU0NJRjJfVFhJX0lSUSwgSU5UQ19JUFIxNCwgMSwgMyB9LAorCXsgU0NJRjNfRVJJX0lSUSwgSU5UQ19JUFIxNCwgMCwgMyB9LAorCXsgU0NJRjNfUlhJX0lSUSwgSU5UQ19JUFIxNCwgMCwgMyB9LAorCXsgU0NJRjNfQlJJX0lSUSwgSU5UQ19JUFIxNCwgMCwgMyB9LAorCXsgU0NJRjNfVFhJX0lSUSwgSU5UQ19JUFIxNCwgMCwgMyB9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCit7CisJbWFrZV9pcHJfaXJxKHNoNzIwNl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzIwNl9pcHJfbWFwKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9NYWtlZmlsZQppbmRleCA1OGQzODE1Li44MzkwNWU0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgTGludXgvU3VwZXJIIFNILTMgYmFja2VuZHMuCiAjCiAKLW9iai15CTo9IGV4Lm8gcHJvYmUubworb2JqLXkJOj0gZXgubyBwcm9iZS5vIGVudHJ5Lm8KIAogIyBDUFUgc3VidHlwZSBzZXR1cAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkJKz0gc2V0dXAtc2g3NzA1Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA5LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwOS5jCmluZGV4IDEwNDYxYTcuLmI3OTFhMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA5LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDkuYwpAQCAtMjQsNyArMjQsNyBAQAogCiBzdGF0aWMgdm9pZCBzZXRfYnVzX3BhcmVudChzdHJ1Y3QgY2xrICpjbGspCiB7Ci0Jc3RydWN0IGNsayAqYnVzX2NsayA9IGNsa19nZXQoImJ1c19jbGsiKTsKKwlzdHJ1Y3QgY2xrICpidXNfY2xrID0gY2xrX2dldChOVUxMLCAiYnVzX2NsayIpOwogCWNsay0+cGFyZW50ID0gYnVzX2NsazsKIAljbGtfcHV0KGJ1c19jbGspOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMGRjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKQEAgLTAsMCArMSw2OTMgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9lbnRyeS5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiAgTmlpYmUgWXV0YWthCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvc3lzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9jcHUvbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyEgTk9URToKKyEgR05VIGFzIChhcyBvZiAyLjkuMSkgY2hhbmdlcyBiZi9zIGludG8gYnQvcyBhbmQgYnJhLCB3aGVuIHRoZSBhZGRyZXNzCishIHRvIGJlIGp1bXBlZCBpcyB0b28gZmFyLCBidXQgaXQgY2F1c2VzIGlsbGVnYWwgc2xvdCBleGNlcHRpb24uCisKKy8qCQorICogZW50cnkuUyBjb250YWlucyB0aGUgc3lzdGVtLWNhbGwgYW5kIGZhdWx0IGxvdy1sZXZlbCBoYW5kbGluZyByb3V0aW5lcy4KKyAqIFRoaXMgYWxzbyBjb250YWlucyB0aGUgdGltZXItaW50ZXJydXB0IGhhbmRsZXIsIGFzIHdlbGwgYXMgYWxsIGludGVycnVwdHMKKyAqIGFuZCBmYXVsdHMgdGhhdCBjYW4gcmVzdWx0IGluIGEgdGFzay1zd2l0Y2guCisgKgorICogTk9URTogVGhpcyBjb2RlIGhhbmRsZXMgc2lnbmFsLXJlY29nbml0aW9uLCB3aGljaCBoYXBwZW5zIGV2ZXJ5IHRpbWUKKyAqIGFmdGVyIGEgdGltZXItaW50ZXJydXB0IGFuZCBhZnRlciBlYWNoIHN5c3RlbSBjYWxsLgorICoKKyAqIE5PVEU6IFRoaXMgY29kZSB1c2VzIGEgY29udmVudGlvbiB0aGF0IGluc3RydWN0aW9ucyBpbiB0aGUgZGVsYXkgc2xvdAorICogb2YgYSB0cmFuc2Zlci1jb250cm9sIGluc3RydWN0aW9uIGFyZSBpbmRlbnRlZCBieSBhbiBleHRyYSBzcGFjZSwgdGh1czoKKyAqCisgKiAgICBqbXAJQGswCSAgICAhIGNvbnRyb2wtdHJhbnNmZXIgaW5zdHJ1Y3Rpb24KKyAqICAgICBsZGMJazEsIHNzciAgICAgISBkZWxheSBzbG90CisgKgorICogU3RhY2sgbGF5b3V0IGluICdyZXRfZnJvbV9zeXNjYWxsJzoKKyAqIAlwdHJhY2UgbmVlZHMgdG8gaGF2ZSBhbGwgcmVncyBvbiB0aGUgc3RhY2suCisgKglpZiB0aGUgb3JkZXIgaGVyZSBpcyBjaGFuZ2VkLCBpdCBuZWVkcyB0byBiZQorICoJdXBkYXRlZCBpbiBwdHJhY2UuYyBhbmQgcHRyYWNlLmgKKyAqCisgKglyMAorICogICAgICAuLi4KKyAqCXIxNSA9IHN0YWNrIHBvaW50ZXIKKyAqCXNwYworICoJcHIKKyAqCXNzcgorICoJZ2JyCisgKgltYWNoCisgKgltYWNsCisgKglzeXNjYWxsICMKKyAqCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19LR0RCX05NSSkKK05NSV9WRUMgPSAweDFjMAkJCSEgTXVzdCBjYXRjaCBlYXJseSBmb3IgZGVib3VuY2UKKyNlbmRpZgorCisvKiBPZmZzZXRzIHRvIHRoZSBzdGFjayAqLworT0ZGX1IwICA9ICAwCQkvKiBSZXR1cm4gdmFsdWUuIE5ldyBBQkkgYWxzbyBhcmc0ICovCitPRkZfUjEgID0gIDQgICAgIAkvKiBOZXcgQUJJOiBhcmc1ICovCitPRkZfUjIgID0gIDggICAgIAkvKiBOZXcgQUJJOiBhcmc2ICovCitPRkZfUjMgID0gIDEyICAgICAJLyogTmV3IEFCSTogc3lzY2FsbF9uciAqLworT0ZGX1I0ICA9ICAxNiAgICAgCS8qIE5ldyBBQkk6IGFyZzAgKi8KK09GRl9SNSAgPSAgMjAgICAgIAkvKiBOZXcgQUJJOiBhcmcxICovCitPRkZfUjYgID0gIDI0ICAgICAJLyogTmV3IEFCSTogYXJnMiAqLworT0ZGX1I3ICA9ICAyOCAgICAgCS8qIE5ldyBBQkk6IGFyZzMgKi8KK09GRl9TUAk9ICAoMTUqNCkKK09GRl9QQyAgPSAgKDE2KjQpCitPRkZfU1IJPSAgKDE2KjQrOCkKK09GRl9UUkEJPSAgKDE2KjQrNio0KQorCisKKyNkZWZpbmUgazAJcjAKKyNkZWZpbmUgazEJcjEKKyNkZWZpbmUgazIJcjIKKyNkZWZpbmUgazMJcjMKKyNkZWZpbmUgazQJcjQKKworI2RlZmluZSBnX2ltYXNrCQlyNgkvKiByNl9iYW5rMSAqLworI2RlZmluZSBrX2dfaW1hc2sJcjZfYmFuawkvKiByNl9iYW5rMSAqLworI2RlZmluZSBjdXJyZW50CQlyNwkvKiByN19iYW5rMSAqLworCisjaW5jbHVkZSA8YXNtL2VudHJ5LW1hY3Jvcy5TPgorCQorLyoKKyAqIEtlcm5lbCBtb2RlIHJlZ2lzdGVyIHVzYWdlOgorICoJazAJc2NyYXRjaAorICoJazEJc2NyYXRjaAorICoJazIJc2NyYXRjaCAoRXhjZXB0aW9uIGNvZGUpCisgKglrMwlzY3JhdGNoIChSZXR1cm4gYWRkcmVzcykKKyAqCWs0CXNjcmF0Y2gKKyAqCWs1CXJlc2VydmVkCisgKglrNglHbG9iYWwgSW50ZXJydXB0IE1hc2sgKDAtLTE1IDw8IDQpCisgKglrNwlDVVJSRU5UX1RIUkVBRF9JTkZPIChwb2ludGVyIHRvIGN1cnJlbnQgdGhyZWFkIGluZm8pCisgKi8KKworIQorISBUTEIgTWlzcyAvIEluaXRpYWwgUGFnZSB3cml0ZSBleGNlcHRpb24gaGFuZGxpbmcKKyEJCQlfYW5kXworISBUTEIgaGl0cywgYnV0IHRoZSBhY2Nlc3MgdmlvbGF0ZSB0aGUgcHJvdGVjdGlvbi4KKyEgSXQgY2FuIGJlIHZhbGlkIGFjY2Vzcywgc3VjaCBhcyBzdGFjayBncm93IGFuZC9vciBDLU8tVy4KKyEKKyEKKyEgRmluZCB0aGUgcG1kL3B0ZSBlbnRyeSBhbmQgbG9hZHRsYgorISBJZiBpdCdzIG5vdCBmb3VuZCwgY2F1c2UgYWRkcmVzcyBlcnJvciAoU0VHVikKKyEKKyEgQWx0aG91Z2ggdGhpcyBjb3VsZCBiZSB3cml0dGVuIGluIGFzc2VtYmx5IGxhbmd1YWdlIChhbmQgaXQnZCBiZSBmYXN0ZXIpLAorISB0aGlzIGZpcnN0IHZlcnNpb24gZGVwZW5kcyAqbXVjaCogb24gQyBpbXBsZW1lbnRhdGlvbi4KKyEKKworI2lmIGRlZmluZWQoQ09ORklHX01NVSkKKwkuYWxpZ24JMgorRU5UUlkodGxiX21pc3NfbG9hZCkKKwlicmEJY2FsbF9kcGYKKwkgbW92CSMwLCByNQorCisJLmFsaWduCTIKK0VOVFJZKHRsYl9taXNzX3N0b3JlKQorCWJyYQljYWxsX2RwZgorCSBtb3YJIzEsIHI1CisKKwkuYWxpZ24JMgorRU5UUlkoaW5pdGlhbF9wYWdlX3dyaXRlKQorCWJyYQljYWxsX2RwZgorCSBtb3YJIzEsIHI1CisKKwkuYWxpZ24JMgorRU5UUlkodGxiX3Byb3RlY3Rpb25fdmlvbGF0aW9uX2xvYWQpCisJYnJhCWNhbGxfZHBmCisJIG1vdgkjMCwgcjUKKworCS5hbGlnbgkyCitFTlRSWSh0bGJfcHJvdGVjdGlvbl92aW9sYXRpb25fc3RvcmUpCisJYnJhCWNhbGxfZHBmCisJIG1vdgkjMSwgcjUKKworY2FsbF9kcGY6CisJbW92LmwJMWYsIHIwCisgCW1vdi5sCUByMCwgcjYJCSEgYWRkcmVzcworCW1vdi5sCTNmLCByMAorCisJam1wCUByMAorIAkgbW92CXIxNSwgcjQJCSEgcmVncworCisJLmFsaWduIDIKKzE6CS5sb25nCU1NVV9URUEKKzM6CS5sb25nCWRvX3BhZ2VfZmF1bHQKKworCS5hbGlnbgkyCitFTlRSWShhZGRyZXNzX2Vycm9yX2xvYWQpCisJYnJhCWNhbGxfZGFlCisJIG1vdgkjMCxyNQkJISB3cml0ZWFjY2VzcyA9IDAKKworCS5hbGlnbgkyCitFTlRSWShhZGRyZXNzX2Vycm9yX3N0b3JlKQorCWJyYQljYWxsX2RhZQorCSBtb3YJIzEscjUJCSEgd3JpdGVhY2Nlc3MgPSAxCisKKwkuYWxpZ24JMgorY2FsbF9kYWU6CisJbW92LmwJMWYsIHIwCisJbW92LmwJQHIwLCByNgkJISBhZGRyZXNzCisJbW92LmwJMmYsIHIwCisJam1wCUByMAorCSBtb3YJcjE1LCByNAkJISByZWdzCisKKwkuYWxpZ24gMgorMToJLmxvbmcJTU1VX1RFQQorMjoJLmxvbmcgICBkb19hZGRyZXNzX2Vycm9yCisjZW5kaWYgLyogQ09ORklHX01NVSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKKwkvKiBVbndpbmQgdGhlIHN0YWNrIGFuZCBqbXAgdG8gdGhlIGRlYnVnIGVudHJ5ICovCitkZWJ1Z19rZXJuZWxfZnc6CisJbW92LmwJQHIxNSssIHIwCisJbW92LmwJQHIxNSssIHIxCisJbW92LmwJQHIxNSssIHIyCisJbW92LmwJQHIxNSssIHIzCisJbW92LmwJQHIxNSssIHI0CisJbW92LmwJQHIxNSssIHI1CisJbW92LmwJQHIxNSssIHI2CisJbW92LmwJQHIxNSssIHI3CisJc3RjCXNyLCByOAorCW1vdi5sCTFmLCByOQkJCSEgQkwgPTEsIFJCPTEsIElNQVNLPTB4MEYKKwlvcglyOSwgcjgKKwlsZGMJcjgsIHNyCQkJISBoZXJlLCBjaGFuZ2UgdGhlIHJlZ2lzdGVyIGJhbmsKKwltb3YubAlAcjE1KywgcjgKKwltb3YubAlAcjE1KywgcjkKKwltb3YubAlAcjE1KywgcjEwCisJbW92LmwJQHIxNSssIHIxMQorCW1vdi5sCUByMTUrLCByMTIKKwltb3YubAlAcjE1KywgcjEzCisJbW92LmwJQHIxNSssIHIxNAorCW1vdi5sCUByMTUrLCBrMAorCWxkYy5sCUByMTUrLCBzcGMKKwlsZHMubAlAcjE1KywgcHIKKwltb3YubAlAcjE1KywgazEKKwlsZGMubAlAcjE1KywgZ2JyCisJbGRzLmwJQHIxNSssIG1hY2gKKwlsZHMubAlAcjE1KywgbWFjbAorCW1vdglrMCwgcjE1CisJIQorCW1vdi5sCTJmLCBrMAorCW1vdi5sCUBrMCwgazAKKwlqbXAJQGswCisJIGxkYwlrMSwgc3NyCisJLmFsaWduCTIKKzE6CS5sb25nCTB4MzAwMDAwZjAKKzI6CS5sb25nCWdkYl92YnJfdmVjdG9yCisjZW5kaWYgLyogQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgKi8KKworcmVzdG9yZV9hbGw6CisJbW92LmwJQHIxNSssIHIwCisJbW92LmwJQHIxNSssIHIxCisJbW92LmwJQHIxNSssIHIyCisJbW92LmwJQHIxNSssIHIzCisJbW92LmwJQHIxNSssIHI0CisJbW92LmwJQHIxNSssIHI1CisJbW92LmwJQHIxNSssIHI2CisJbW92LmwJQHIxNSssIHI3CisJIQorCXN0YwlzciwgcjgKKwltb3YubAk3ZiwgcjkKKwlvcglyOSwgcjgJCQkhIEJMID0xLCBSQj0xCisJbGRjCXI4LCBzcgkJCSEgaGVyZSwgY2hhbmdlIHRoZSByZWdpc3RlciBiYW5rCisJIQorCW1vdi5sCUByMTUrLCByOAorCW1vdi5sCUByMTUrLCByOQorCW1vdi5sCUByMTUrLCByMTAKKwltb3YubAlAcjE1KywgcjExCisJbW92LmwJQHIxNSssIHIxMgorCW1vdi5sCUByMTUrLCByMTMKKwltb3YubAlAcjE1KywgcjE0CisJbW92LmwJQHIxNSssIGs0CQkhIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKKwlsZGMubAlAcjE1Kywgc3BjCisJbGRzLmwJQHIxNSssIHByCisJbW92LmwJQHIxNSssIGszCQkhIG9yaWdpbmFsIFNSCisJbGRjLmwJQHIxNSssIGdicgorCWxkcy5sCUByMTUrLCBtYWNoCisJbGRzLmwJQHIxNSssIG1hY2wKKwlhZGQJIzQsIHIxNQkJCSEgU2tpcCBzeXNjYWxsIG51bWJlcgorCSEKKyNpZmRlZiBDT05GSUdfU0hfRFNQCisJbW92LmwJQHIxNSssIGswCQkhIERTUCBtb2RlIG1hcmtlcgorCW1vdi5sCTVmLCBrMQorCWNtcC9lcQlrMCwgazEJCQkhIERvIHdlIGhhdmUgYSBEU1Agc3RhY2sgZnJhbWU/CisJYmYJc2tpcF9yZXN0b3JlCisKKwlzdGMJc3IsIGswCQkJISBFbmFibGUgQ1BVIERTUCBtb2RlCisJb3IJazEsIGswCQkJISAod2l0aGluIGtlcm5lbCBpdCBtYXkgYmUgZGlzYWJsZWQpCisJbGRjCWswLCBzcgorCW1vdglyMiwgazAJCQkhIEJhY2t1cCByMgorCisJISBSZXN0b3JlIERTUCByZWdpc3RlcnMgZnJvbSBzdGFjaworCW1vdglyMTUsIHIyCisJbW92cy5sCUByMissIGExCisJbW92cy5sCUByMissIGEwZworCW1vdnMubAlAcjIrLCBhMWcKKwltb3ZzLmwJQHIyKywgbTAKKwltb3ZzLmwJQHIyKywgbTEKKwltb3YJcjIsIHIxNQorCisJbGRzLmwJQHIxNSssIGEwCisJbGRzLmwJQHIxNSssIHgwCisJbGRzLmwJQHIxNSssIHgxCisJbGRzLmwJQHIxNSssIHkwCisJbGRzLmwJQHIxNSssIHkxCisJbGRzLmwJQHIxNSssIGRzcgorCWxkYy5sCUByMTUrLCBycworCWxkYy5sCUByMTUrLCByZQorCWxkYy5sCUByMTUrLCBtb2QKKworCW1vdglrMCwgcjIJCQkhIFJlc3RvcmUgcjIKK3NraXBfcmVzdG9yZToKKyNlbmRpZgorCSEKKwkhIENhbGN1bGF0ZSBuZXcgU1IgdmFsdWUKKwltb3YJazMsIGsyCQkJISBvcmlnaW5hbCBTUiB2YWx1ZQorCW1vdgkjMHhmMCwgazEKKwlleHR1LmIJazEsIGsxCisJbm90CWsxLCBrMQorCWFuZAlrMSwgazIJCQkhIE1hc2sgb3JpZ25hbCBTUiB2YWx1ZQorCSEKKwltb3YJazMsIGswCQkJISBDYWxjdWxhdGUgSU1BU0stYml0cworCXNobHIyCWswCisJYW5kCSMweDNjLCBrMAorCWNtcC9lcQkjMHgzYywgazAKKwlidC9zCTZmCisJIHNobGwyCWswCisJbW92CWdfaW1hc2ssIGswCisJIQorNjoJb3IJazAsIGsyCQkJISBTZXQgdGhlIElNQVNLLWJpdHMKKwlsZGMJazIsIHNzcgorCSEKKyNpZiBkZWZpbmVkKENPTkZJR19LR0RCX05NSSkKKwkhIENsZWFyIGluX25taQorCW1vdi5sCTZmLCBrMAorCW1vdgkjMCwgazEKKwltb3YuYglrMSwgQGswCisjZW5kaWYKKwltb3YubAlAcjE1KywgazIJCSEgcmVzdG9yZSBFWFBFVlQKKwltb3YJazQsIHIxNQorCXJ0ZQorCSBub3AKKworCS5hbGlnbgkyCis1OgkubG9uZwkweDAwMDAxMDAwCSEgRFNQCis3OgkubG9uZwkweDMwMDAwMDAwCisKKyEgY29tbW9uIGV4Y2VwdGlvbiBoYW5kbGVyCisjaW5jbHVkZSAiLi4vLi4vZW50cnktY29tbW9uLlMiCisJCishIEV4Y2VwdGlvbiBWZWN0b3IgQmFzZQorIQorIQlTaG91bGQgYmUgYWxpZ25lZCBwYWdlIGJvdW5kYXJ5LgorIQorCS5iYWxpZ24gCTQwOTYsMCw0MDk2CitFTlRSWSh2YnJfYmFzZSkKKwkubG9uZwkwCishCisJLmJhbGlnbiAJMjU2LDAsMjU2CitnZW5lcmFsX2V4Y2VwdGlvbjoKKwltb3YubAkxZiwgazIKKwltb3YubAkyZiwgazMKKwlicmEJaGFuZGxlX2V4Y2VwdGlvbgorCSBtb3YubAlAazIsIGsyCisJLmFsaWduCTIKKzE6CS5sb25nCUVYUEVWVAorMjoJLmxvbmcJcmV0X2Zyb21fZXhjZXB0aW9uCishCishCisKKy8qIFRoaXMgY29kZSBtYWtlcyBzb21lIGFzc3VtcHRpb25zIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCisgKiBNYWtlIHN1cmUgdGhleSBhcmUgc3RpbCB0cnVlLiAqLworI2lmIFBUUlNfUEVSX1BHRCAhPSBQVFJTX1BFUl9QVEUKKyNlcnJvciBQR0QgYW5kIFBURSBzaXplcyBkb24ndCBtYXRjaAorI2VuZGlmCisKKy8qIGdhcyBkb2Vzbid0IGZsYWcgaW1wb3NzaWJsZSB2YWx1ZXMgZm9yIG1vdiAjaW1tZWRpYXRlIGFzIGFuIGVycm9yICovCisjaWYgKF9QQUdFX1BSRVNFTlQgPj4gMikgPiAweDdmCisjZXJyb3IgY2Fubm90IGxvYWQgUEFHRV9QUkVTRU5UIGFzIGFuIGltbWVkaWF0ZQorI2VuZGlmCisjaWYgX1BBR0VfRElSVFkgPiAweDdmCisjZXJyb3IgY2Fubm90IGxvYWQgUEFHRV9ESVJUWSBhcyBhbiBpbW1lZGlhdGUKKyNlbmRpZgorI2lmIChfUEFHRV9QUkVTRU5UIDw8IDIpICE9IF9QQUdFX0FDQ0VTU0VECisjZXJyb3IgY2Fubm90IGRlcml2ZSBQQUdFX0FDQ0VTU0VEIGZyb20gUEFHRV9QUkVTRU5UCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCisjZGVmaW5lIGxkbW11cHRlaChyKQltb3YubAk4ZiwgcgorI2Vsc2UKKyNkZWZpbmUgbGRtbXVwdGVoKHIpCW1vdgkjTU1VX1BURUgsIHIKKyNlbmRpZgorCisJLmJhbGlnbiAJMTAyNCwwLDEwMjQKK3RsYl9taXNzOgorI2lmZGVmIENPVU5UX0VYQ0VQVElPTlMKKwkhIEluY3JlbWVudCB0aGUgY291bnRzCisJbW92LmwJOWYsIGsxCisJbW92LmwJQGsxLCBrMgorCWFkZAkjMSwgazIKKwltb3YubAlrMiwgQGsxCisjZW5kaWYKKworCSEgazAgc2NyYXRjaAorCSEgazEgcGdkIGFuZCBwdGUgcG9pbnRlcnMKKwkhIGsyIGZhdWx0aW5nIGFkZHJlc3MKKwkhIGszIHBnZCBhbmQgcHRlIGluZGV4IG1hc2tzCisJISBrNCBzaGlmdAorCisJISBMb2FkIHVwIHRoZSBwZ2QgZW50cnkgKGsxKQorCisJbGRtbXVwdGVoKGswKQkJCSEgIDkgTFMgKGxhdGVuY3k9MikJTU1VX1BURUgKKworCW1vdi53CTRmLCBrMwkJCSEgIDggTFMgKGxhdGVuY3k9MikJKFBUUlNfUEVSX1BHRC0xKSA8PCAyCisJbW92CSMtKFBHRElSX1NISUZULTIpLCBrNAkhICA2IEVYCisKKwltb3YubAlAKE1NVV9URUEtTU1VX1BURUgsazApLCBrMgkhIDE4IExTIChsYXRlbmN5PTIpCisKKwltb3YubAlAKE1NVV9UVEItTU1VX1BURUgsazApLCBrMQkhIDE4IExTIChsYXRlbmN5PTIpCisKKwltb3YJazIsIGswCQkJISAgIDUgTVQgKGxhdGVuY3k9MCkKKwlzaGxkCWs0LCBrMAkJCSEgIDk5IEVYCisKKwlhbmQJazMsIGswCQkJISAgNzggRVgKKworCW1vdi5sCUAoazAsIGsxKSwgazEJCSEgIDIxIExTIChsYXRlbmN5PTIpCisJbW92CSMtKFBBR0VfU0hJRlQtMiksIGs0CSEgICA2IEVYCisKKwkhIExvYWQgdXAgdGhlIHB0ZSBlbnRyeSAoazIpCisKKwltb3YJazIsIGswCQkJISAgIDUgTVQgKGxhdGVuY3k9MCkKKwlzaGxkCWs0LCBrMAkJCSEgIDk5IEVYCisKKwl0c3QJazEsIGsxCQkJISAgODYgTVQKKworCWJ0CTIwZgkJCSEgMTEwIEJSCisKKwlhbmQJazMsIGswCQkJISAgNzggRVgKKwltb3Yudwk1ZiwgazQJCQkhICAgOCBMUyAobGF0ZW5jeT0yKQlfUEFHRV9QUkVTRU5UCisKKwltb3YubAlAKGswLCBrMSksIGsyCQkhICAyMSBMUyAobGF0ZW5jeT0yKQorCWFkZAlrMCwgazEJCQkhICA0OSBFWAorCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfUFRFQQorCSEgVGVzdCB0aGUgZW50cnkgZm9yIHByZXNlbnQgYW5kIF9QQUdFX0FDQ0VTU0VECisKKwltb3YJIy0yOCwgazMJCSEgICA2IEVYCisJbW92CWsyLCBrMAkJCSEgICA1IE1UIChsYXRlbmN5PTApCisKKwl0c3QJazQsIGsyCQkJISAgNjggTVQKKwlzaGxkCWszLCBrMAkJCSEgIDk5IEVYCisKKwlidAkyMGYJCQkhIDExMCBCUgorCisJISBTZXQgUFRFQSByZWdpc3RlcgorCSEgTU1VX1BURUEgPSAoKHB0ZXZhbCA+PiAyOCkgJiAweGUpIHwgKHB0ZXZhbCAmIDB4MSkKKwkhCisJISBrMD1wdGU+PjI4LCBrMT1wdGUqLCBrMj1wdGUsIGszPTx1bnVzZWQ+LCBrND1fUEFHRV9QUkVTRU5UCisKKwlhbmQJIzB4ZSwgazAJCSEgIDc5IEVYCisKKwltb3YJazAsIGszCQkJISAgIDUgTVQgKGxhdGVuY3k9MCkKKwltb3YJazIsIGswCQkJISAgIDUgTVQgKGxhdGVuY3k9MCkKKworCWFuZAkjMSwgazAJCQkhICA3OSBFWAorCisJb3IJazAsIGszCQkJISAgODIgRVgKKworCWxkbW11cHRlaChrMCkJCQkhICAgOSBMUyAobGF0ZW5jeT0yKQorCXNobGwyCWs0CQkJISAxMDEgRVgJCV9QQUdFX0FDQ0VTU0VECisKKwl0c3QJazQsIGsyCQkJISAgNjggTVQKKworCW1vdi5sCWszLCBAKE1NVV9QVEVBLU1NVV9QVEVILGswKQkhIDI3IExTCisKKwltb3YubAk3ZiwgazMJCQkhICAgOSBMUyAobGF0ZW5jeT0yKQlfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLCisKKwkhIGswPU1NVV9QVEVILCBrMT1wdGUqLCBrMj1wdGUsIGszPV9QQUdFX0ZMQUdTX0hBUkRXQVJFLCBrND1fUEFHRV9BQ0NFU1NFRAorI2Vsc2UKKworCSEgVGVzdCB0aGUgZW50cnkgZm9yIHByZXNlbnQgYW5kIF9QQUdFX0FDQ0VTU0VECisKKwltb3YubAk3ZiwgazMJCQkhICAgOSBMUyAobGF0ZW5jeT0yKQlfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLCisJdHN0CWs0LCBrMgkJCSEgIDY4IE1UCisKKwlzaGxsMglrNAkJCSEgMTAxIEVYCQlfUEFHRV9BQ0NFU1NFRAorCWxkbW11cHRlaChrMCkJCQkhICAgOSBMUyAobGF0ZW5jeT0yKQorCisJYnQJMjBmCQkJISAxMTAgQlIKKwl0c3QJazQsIGsyCQkJISAgNjggTVQKKworCSEgazA9TU1VX1BURUgsIGsxPXB0ZSosIGsyPXB0ZSwgazM9X1BBR0VfRkxBR1NfSEFSRFdBUkUsIGs0PV9QQUdFX0FDQ0VTU0VECisKKyNlbmRpZgorCisJISBTZXQgdXAgdGhlIGVudHJ5CisKKwlhbmQJazIsIGszCQkJISAgNzggRVgKKwlidC9zCTEwZgkJCSEgMTA4IEJSCisKKwkgbW92LmwJazMsIEAoTU1VX1BURUwtTU1VX1BURUgsazApCSEgMjcgTFMKKworCWxkdGxiCQkJCSEgMTI4IENPCisKKwkhIEF0IGxlYXN0IG9uZSBpbnN0cnVjdGlvbiBiZXR3ZWVuIGxkdGxiIGFuZCBydGUKKwlub3AJCQkJISAxMTkgTk9QCisKKwlydGUJCQkJISAxMjYgQ08KKworCSBub3AJCQkJISAxMTkgTk9QCisKKworMTA6CW9yCWs0LCBrMgkJCSEgIDgyIEVYCisKKwlsZHRsYgkJCQkhIDEyOCBDTworCisJISBBdCBsZWFzdCBvbmUgaW5zdHJ1Y3Rpb24gYmV0d2VlbiBsZHRsYiBhbmQgcnRlCisJbW92LmwJazIsIEBrMQkJCSEgIDI3IExTCisKKwlydGUJCQkJISAxMjYgQ08KKworCSEgTm90ZSB3ZSBjYW5ub3QgZXhlY3V0ZSBtb3YgaGVyZSwgYmVjYXVzZSBpdCBpcyBleGVjdXRlZCBhZnRlcgorCSEgcmVzdG9yaW5nIFNTUiwgc28gd291bGQgYmUgZXhlY3V0ZWQgaW4gdXNlciBzcGFjZS4KKwkgbm9wCQkJCSEgMTE5IE5PUAorCisKKwkuYWxpZ24gNQorCSEgT25jZSBjYWNoZSBsaW5lIGlmIHBvc3NpYmxlLi4uCisxOgkubG9uZwlzd2FwcGVyX3BnX2RpcgorNDoJLnNob3J0CShQVFJTX1BFUl9QR0QtMSkgPDwgMgorNToJLnNob3J0CV9QQUdFX1BSRVNFTlQKKzc6CS5sb25nCV9QQUdFX0ZMQUdTX0hBUkRXQVJFX01BU0sKKzg6CS5sb25nCU1NVV9QVEVICisjaWZkZWYgQ09VTlRfRVhDRVBUSU9OUworOToJLmxvbmcJZXhjZXB0aW9uX2NvdW50X21pc3MKKyNlbmRpZgorCisJISBFaXRoZXIgcGdkIG9yIHB0ZSBub3QgcHJlc2VudAorMjA6CW1vdi5sCTFmLCBrMgorCW1vdi5sCTRmLCBrMworCWJyYQloYW5kbGVfZXhjZXB0aW9uCisJIG1vdi5sCUBrMiwgazIKKyEKKwkuYmFsaWduIAk1MTIsMCw1MTIKK2ludGVycnVwdDoKKwltb3YubAkyZiwgazIKKwltb3YubAkzZiwgazMKKyNpZiBkZWZpbmVkKENPTkZJR19LR0RCX05NSSkKKwkhIERlYm91bmNlIChmaWx0ZXIgbmVzdGVkIE5NSSkKKwltb3YubAlAazIsIGswCisJbW92LmwJNWYsIGsxCisJY21wL2VxCWsxLCBrMAorCWJmCTBmCisJbW92LmwJNmYsIGsxCisJdGFzLmIJQGsxCisJYnQJMGYKKwlydGUKKwkgbm9wCisJLmFsaWduCTIKKzU6CS5sb25nCU5NSV9WRUMKKzY6CS5sb25nCWluX25taQorMDoKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19LR0RCX05NSSkgKi8KKwlicmEJaGFuZGxlX2V4Y2VwdGlvbgorCSBtb3YJIy0xLCBrMgkJISBpbnRlcnJ1cHQgZXhjZXB0aW9uIG1hcmtlcgorCisJLmFsaWduCTIKKzE6CS5sb25nCUVYUEVWVAorMjoJLmxvbmcJSU5URVZUCiszOgkubG9uZwlyZXRfZnJvbV9pcnEKKzQ6CS5sb25nCXJldF9mcm9tX2V4Y2VwdGlvbgorCishCishCisJLmFsaWduCTIKK0VOVFJZKGhhbmRsZV9leGNlcHRpb24pCisJISBVc2luZyBrMCwgazEgZm9yIHNjcmF0Y2ggcmVnaXN0ZXJzIChyMF9iYW5rMSwgcjFfYmFuayksCisJISBzYXZlIGFsbCByZWdpc3RlcnMgb250byBzdGFjay4KKwkhCisJc3RjCXNzciwgazAJCSEgSXMgaXQgZnJvbSBrZXJuZWwgc3BhY2U/CisJc2hsbAlrMAkJISBDaGVjayBNRCBiaXQgKGJpdDMwKSBieSBzaGlmdGluZyBpdCBpbnRvLi4uCisJc2hsbAlrMAkJISAgICAgICAuLi50aGUgVCBiaXQKKwlidC9zCTFmCQkhIEl0J3MgYSBrZXJuZWwgdG8ga2VybmVsIHRyYW5zaXRpb24uCisJIG1vdglyMTUsIGswCQkhIHNhdmUgb3JpZ2luYWwgc3RhY2sgdG8gazAKKwkvKiBVc2VyIHNwYWNlIHRvIGtlcm5lbCAqLworCW1vdgkjKFRIUkVBRF9TSVpFID4+IDEwKSwgazEKKwlzaGxsOAlrMQkJISBrMSA6PSBUSFJFQURfU0laRQorCXNobGwyCWsxCisJYWRkCWN1cnJlbnQsIGsxCisJbW92CWsxLCByMTUJCSEgY2hhbmdlIHRvIGtlcm5lbCBzdGFjaworCSEKKzE6CW1vdi5sCTJmLCBrMQorCSEKKyNpZmRlZiBDT05GSUdfU0hfRFNQCisJbW92LmwJcjIsIEAtcjE1CQkhIFNhdmUgcjIsIHdlIG5lZWQgYW5vdGhlciByZWcKKwlzdGMJc3IsIGs0CisJbW92LmwJMWYsIHIyCisJdHN0CXIyLCBrNAkJCSEgQ2hlY2sgaWYgaW4gRFNQIG1vZGUKKwltb3YubAlAcjE1KywgcjIJCSEgUmVzdG9yZSByMiBub3cKKwlidC9zCXNraXBfc2F2ZQorCSBtb3YJIzAsIGs0CQkJISBTZXQgbWFya2VyIGZvciBubyBzdGFjayBmcmFtZQorCisJbW92CXIyLCBrNAkJCSEgQmFja3VwIHIyIChpbiBrNCkgZm9yIGxhdGVyCisKKwkhIFNhdmUgRFNQIHJlZ2lzdGVycyBvbiBzdGFjaworCXN0Yy5sCW1vZCwgQC1yMTUKKwlzdGMubAlyZSwgQC1yMTUKKwlzdGMubAlycywgQC1yMTUKKwlzdHMubAlkc3IsIEAtcjE1CisJc3RzLmwJeTEsIEAtcjE1CisJc3RzLmwJeTAsIEAtcjE1CisJc3RzLmwJeDEsIEAtcjE1CisJc3RzLmwJeDAsIEAtcjE1CisJc3RzLmwJYTAsIEAtcjE1CisKKwkhIEdBUyBpcyBicm9rZW4sIGRvZXMgbm90IGdlbmVyYXRlIGNvcnJlY3QgIm1vdnMubCBEcyxALUFzIiBpbnN0ci4KKworCSEgRklYTUU6IE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgc3RpbGwgdGhlIGNhc2Ugd2l0aCBuZXdlciB0b29sY2hhaW5zLAorCSEgYXMgd2UncmUgbm90IGF0IGFsbCBpbnRlcmVzdGVkIGluIHN1cHBvcnRpbmcgYW5jaWVudCB0b29sY2hhaW5zIGF0CisJISB0aGlzIHBvaW50LiAtLSBQRk0uCisKKwltb3YJcjE1LCByMgorCS53b3JkCTB4ZjY1MwkJCSEgbW92cy5sCWExLCBALXIyCisJLndvcmQJMHhmNmYzCQkJISBtb3ZzLmwJYTBnLCBALXIyCisJLndvcmQJMHhmNmQzCQkJISBtb3ZzLmwJYTFnLCBALXIyCisJLndvcmQJMHhmNmMzCQkJISBtb3ZzLmwJbTAsIEAtcjIKKwkud29yZAkweGY2ZTMJCQkhIG1vdnMubAltMSwgQC1yMgorCW1vdglyMiwgcjE1CisKKwltb3YJazQsIHIyCQkJISBSZXN0b3JlIHIyCisJbW92LmwJMWYsIGs0CQkJISBGb3JjZSBEU1Agc3RhY2sgZnJhbWUKK3NraXBfc2F2ZToKKwltb3YubAlrNCwgQC1yMTUJCSEgUHVzaCBEU1AgbW9kZSBtYXJrZXIgb250byBzdGFjaworI2VuZGlmCisJISBTYXZlIHRoZSB1c2VyIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suCisJbW92LmwJazIsIEAtcjE1CSEgRVhQRVZUCisKKwltb3YJIy0xLCBrNAorCW1vdi5sCWs0LCBALXIxNQkhIHNldCBUUkEgKGRlZmF1bHQ6IC0xKQorCSEKKwlzdHMubAltYWNsLCBALXIxNQorCXN0cy5sCW1hY2gsIEAtcjE1CisJc3RjLmwJZ2JyLCBALXIxNQorCXN0Yy5sCXNzciwgQC1yMTUKKwlzdHMubAlwciwgQC1yMTUKKwlzdGMubAlzcGMsIEAtcjE1CisJIQorCWxkcwlrMywgcHIJCSEgU2V0IHRoZSByZXR1cm4gYWRkcmVzcyB0byBwcgorCSEKKwltb3YubAlrMCwgQC1yMTUJISBzYXZlIG9yaWduYWwgc3RhY2sKKwltb3YubAlyMTQsIEAtcjE1CisJbW92LmwJcjEzLCBALXIxNQorCW1vdi5sCXIxMiwgQC1yMTUKKwltb3YubAlyMTEsIEAtcjE1CisJbW92LmwJcjEwLCBALXIxNQorCW1vdi5sCXI5LCBALXIxNQorCW1vdi5sCXI4LCBALXIxNQorCSEKKwlzdGMJc3IsIHI4CQkhIEJhY2sgdG8gbm9ybWFsIHJlZ2lzdGVyIGJhbmssIGFuZAorCW9yCWsxLCByOAkJISBCbG9jayBhbGwgaW50ZXJydXB0cworCW1vdi5sCTNmLCBrMQorCWFuZAlrMSwgcjgJCSEgLi4uCisJbGRjCXI4LCBzcgkJISAuLi5jaGFuZ2VkIGhlcmUuCisJIQorCW1vdi5sCXI3LCBALXIxNQorCW1vdi5sCXI2LCBALXIxNQorCW1vdi5sCXI1LCBALXIxNQorCW1vdi5sCXI0LCBALXIxNQorCW1vdi5sCXIzLCBALXIxNQorCW1vdi5sCXIyLCBALXIxNQorCW1vdi5sCXIxLCBALXIxNQorCW1vdi5sCXIwLCBALXIxNQorCisJLyoKKwkgKiBUaGlzIGdldHMgYSBiaXQgdHJpY2t5Li4gaW4gdGhlIElOVEVWVCBjYXNlIHdlIGRvbid0IHdhbnQgdG8gdXNlCisJICogdGhlIFZCUiBvZmZzZXQgYXMgYSBkZXN0aW5hdGlvbiBpbiB0aGUganVtcCBjYWxsIHRhYmxlLCBzaW5jZSBhbGwKKwkgKiBvZiB0aGUgZGVzdGluYXRpb25zIGFyZSB0aGUgc2FtZS4gSW4gdGhpcyBjYXNlLCAoaW50ZXJydXB0KSBzZXRzCisJICogYSBtYXJrZXIgaW4gcjIgKG5vdyByMl9iYW5rIHNpbmNlIFNSLlJCIGNoYW5nZWQpLCB3aGljaCB3ZSBjaGVjaworCSAqIHRvIGRldGVybWluZSB0aGUgZXhjZXB0aW9uIHR5cGUuIEZvciBhbGwgb3RoZXIgZXhjZXB0aW9ucywgd2UKKwkgKiBmb3JjaWJseSByZWFkIEVYUEVWVCBmcm9tIG1lbW9yeSBhbmQgZml4IHVwIHRoZSBqdW1wIGFkZHJlc3MsIGluCisJICogdGhlIGludGVycnVwdCBleGNlcHRpb24gY2FzZSB3ZSBqdW1wIHRvIGRvX0lSUSgpIGFuZCBkZWZlciB0aGUKKwkgKiBJTlRFVlQgcmVhZCB1bnRpbCB0aGVyZS4gQXMgYSBib251cywgd2UgY2FuIGFsc28gY2xlYW4gdXAgdGhlIFNSLlJCCisJICogY2hlY2tzIHRoYXQgZG9fSVJRKCkgd2FzIGRvaW5nLi4KKwkgKi8KKwlzdGMJcjJfYmFuaywgcjgKKwljbXAvcHoJcjgKKwliZglpbnRlcnJ1cHRfZXhjZXB0aW9uCisJc2hscjIJcjgKKwlzaGxyCXI4CisKKyNpZmRlZiBDT1VOVF9FWENFUFRJT05TCisJbW92LmwJNWYsIHI5CisJYWRkCXI4LCByOQorCW1vdi5sCUByOSwgcjEwCisJYWRkCSMxLCByMTAKKwltb3YubAlyMTAsIEByOQorI2VuZGlmCisKKwltb3YubAk0ZiwgcjkKKwlhZGQJcjgsIHI5CisJbW92LmwJQHI5LCByOQorCWptcAlAcjkKKwkgbm9wCisJcnRzCisJIG5vcAorCisJLmFsaWduCTIKKzE6CS5sb25nCTB4MDAwMDEwMDAJISBEU1A9MQorMjoJLmxvbmcJMHgwMDAwODBmMAkhIEZEPTEsIElNQVNLPTE1CiszOgkubG9uZwkweGNmZmZmZmZmCSEgUkI9MCwgQkw9MAorNDoJLmxvbmcJZXhjZXB0aW9uX2hhbmRsaW5nX3RhYmxlCisjaWZkZWYgQ09VTlRfRVhDRVBUSU9OUworNToJLmxvbmcJZXhjZXB0aW9uX2NvdW50X3RhYmxlCisjZW5kaWYKKworaW50ZXJydXB0X2V4Y2VwdGlvbjoKKwltb3YubAkxZiwgcjkKKwlqbXAJQHI5CisJIG5vcAorCXJ0cworCSBub3AKKworCS5hbGlnbiAyCisxOgkubG9uZwlkb19JUlEKKworCS5hbGlnbgkyCitFTlRSWShleGNlcHRpb25fbm9uZSkKKwlydHMKKwkgbm9wCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2V4LlMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2V4LlMKaW5kZXggNmJlNDZmMC4uYmEzMDgyZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9leC5TCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZXguUwpAQCAtNCw3ICs0LDcgQEAKICAqICBUaGUgU0gtMyBleGNlcHRpb24gdmVjdG9yIHRhYmxlLgogCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyICBOaWliZSBZdXRha2EKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTQ5LDMgKzQ5LDEwIEBACiAjZW5kaWYKIEVOVFJZKHVzZXJfYnJlYWtfcG9pbnRfdHJhcCkKIAkubG9uZwlicmVha19wb2ludF90cmFwCS8qIDFFMCAqLworCisJLyoKKwkgKiBQYWQgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGFibGUgb3V0LCBleGNlcHRpb25zIHJlc2lkaW5nIGluIGZhcgorCSAqIGF3YXkgb2Zmc2V0cyBjYW4gYmUgbWFudWFsbHkgaW5zZXJ0ZWQgaW4gdG8gdGhlaXIgYXBwcm9wcmlhdGUKKwkgKiBsb2NhdGlvbiB2aWEgc2V0X2V4Y2VwdGlvbl90YWJsZV97ZXZ0LHZlY30oKS4KKwkgKi8KKwkuYmFsaWduIDQwOTYsMCw0MDk2CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQppbmRleCA4ZGJmMzg5Li4xOWNhNjhjNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCkBAIC0yLDcgKzIsOCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4L1N1cGVySCBTSC00IGJhY2tlbmRzLgogIwogCi1vYmoteQk6PSBleC5vIHByb2JlLm8KK29iai15CTo9IGV4Lm8gcHJvYmUubyBjb21tb24ubworY29tbW9uLXkJKz0gJChhZGRwcmVmaXggLi4vc2gzLywgZW50cnkubykKIAogb2JqLSQoQ09ORklHX1NIX0ZQVSkgICAgICAgICAgICAgICAgICAgICs9IGZwdS5vCiBvYmotJChDT05GSUdfU0hfU1RPUkVfUVVFVUVTKQkJKz0gc3EubwpAQCAtMTEsMTcgKzEyLDEyIEBACiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkJKz0gc2V0dXAtc2g3NzUwLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCSs9IHNldHVwLXNoNzc2MC5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwKQkrPSBzZXR1cC1zaDc3NzAubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkJKz0gc2V0dXAtc2g3NzgwLm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKQkrPSBzZXR1cC1zaDczMTgwLm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCSs9IHNldHVwLXNoNzM0My5vCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMikJKz0gc2V0dXAtc2g0LTIwMi5vCiAKICMgUHJpbWFyeSBvbi1jaGlwIGNsb2NrcyAoY29tbW9uKQoraWZuZGVmIENPTkZJR19DUFVfU0g0QQogY2xvY2stJChDT05GSUdfQ1BVX1NINCkJCQk6PSBjbG9jay1zaDQubwotY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkJOj0gY2xvY2stc2g3MzE4MC5vCi1jbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzApCTo9IGNsb2NrLXNoNzc3MC5vCi1jbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCTo9IGNsb2NrLXNoNzc4MC5vCitlbmRpZgogCiAjIEFkZGl0aW9uYWwgY2xvY2tzIGJ5IHN1YnR5cGUKIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIpCSs9IGNsb2NrLXNoNC0yMDIubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNC0yMDIuYwppbmRleCBiZmRmNWZlLi5mYTIwMTlhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNC0yMDIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNC0yMDIuYwpAQCAtOTcsNyArOTcsNyBAQAogCiBzdGF0aWMgaW50IHNob2NfY2xrX3ZlcmlmeV9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQogewotCXN0cnVjdCBjbGsgKmJjbGsgPSBjbGtfZ2V0KCJidXNfY2xrIik7CisJc3RydWN0IGNsayAqYmNsayA9IGNsa19nZXQoTlVMTCwgImJ1c19jbGsiKTsKIAl1bnNpZ25lZCBsb25nIGJjbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShiY2xrKTsKIAogCWNsa19wdXQoYmNsayk7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2g0MjAyX2Nsa19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGNsayAqY2xrID0gY2xrX2dldCgibWFzdGVyX2NsayIpOworCXN0cnVjdCBjbGsgKmNsayA9IGNsa19nZXQoTlVMTCwgIm1hc3Rlcl9jbGsiKTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNoNDIwMl9vbmNoaXBfY2xvY2tzKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNzc4MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDc3ODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhZDM2Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNzc4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNzc4MC5jCi0gKgotICogU0g3NzgwIHN1cHBvcnQgZm9yIHRoZSBjbG9jayBmcmFtZXdvcmsKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8YXNtL2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL2ZyZXEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotc3RhdGljIGludCBpZmNfZGl2aXNvcnNbXSA9IHsgMiwgNCB9Owotc3RhdGljIGludCBiZmNfZGl2aXNvcnNbXSA9IHsgMSwgMSwgMSwgOCwgMTIsIDE2LCAyNCwgMSB9Owotc3RhdGljIGludCBwZmNfZGl2aXNvcnNbXSA9IHsgMSwgMjQsIDI0LCAxIH07Ci1zdGF0aWMgaW50IGNmY19kaXZpc29yc1tdID0geyAxLCAxLCA0LCAxLCA2LCAxLCAxLCAxIH07Ci0KLXN0YXRpYyB2b2lkIG1hc3Rlcl9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JY2xrLT5yYXRlICo9IHBmY19kaXZpc29yc1tjdHJsX2lubChGUlFDUikgJiAweDAwMDNdOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzgwX21hc3Rlcl9jbGtfb3BzID0gewotCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKLX07Ci0KLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgaWR4ID0gKGN0cmxfaW5sKEZSUUNSKSAmIDB4MDAwMyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4MF9tb2R1bGVfY2xrX29wcyA9IHsKLQkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAotfTsKLQotc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQotewotCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiAxNikgJiAweDAwMDcpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gYmZjX2Rpdmlzb3JzW2lkeF07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3ODBfYnVzX2Nsa19vcHMgPSB7Ci0JLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKLX07Ci0KLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gMjQpICYgMHgwMDAxKTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzgwX2NwdV9jbGtfb3BzID0gewotCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgKnNoNzc4MF9jbGtfb3BzW10gPSB7Ci0JJnNoNzc4MF9tYXN0ZXJfY2xrX29wcywKLQkmc2g3NzgwX21vZHVsZV9jbGtfb3BzLAotCSZzaDc3ODBfYnVzX2Nsa19vcHMsCi0JJnNoNzc4MF9jcHVfY2xrX29wcywKLX07Ci0KLXZvaWQgX19pbml0IGFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqb3BzLCBpbnQgaWR4KQotewotCWlmIChpZHggPCBBUlJBWV9TSVpFKHNoNzc4MF9jbGtfb3BzKSkKLQkJKm9wcyA9IHNoNzc4MF9jbGtfb3BzW2lkeF07Ci19Ci0KLXN0YXRpYyB2b2lkIHNoeXdheV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gMjApICYgMHgwMDA3KTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGNmY19kaXZpc29yc1tpZHhdOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzgwX3NoeXdheV9jbGtfb3BzID0gewotCS5yZWNhbGMJCT0gc2h5d2F5X2Nsa19yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzaDc3ODBfc2h5d2F5X2NsayA9IHsKLQkubmFtZQkJPSAic2h5d2F5X2NsayIsCi0JLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKLQkub3BzCQk9ICZzaDc3ODBfc2h5d2F5X2Nsa19vcHMsCi19OwotCi0vKgotICogQWRkaXRpb25hbCBTSDc3ODAtc3BlY2lmaWMgb24tY2hpcCBjbG9ja3MgdGhhdCBhcmVuJ3QgYWxyZWFkeSBwYXJ0IG9mIHRoZQotICogY2xvY2sgZnJhbWV3b3JrCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY2xrICpzaDc3ODBfb25jaGlwX2Nsb2Nrc1tdID0gewotCSZzaDc3ODBfc2h5d2F5X2NsaywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNoNzc4MF9jbGtfaW5pdCh2b2lkKQotewotCXN0cnVjdCBjbGsgKmNsayA9IGNsa19nZXQoIm1hc3Rlcl9jbGsiKTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNoNzc4MF9vbmNoaXBfY2xvY2tzKTsgaSsrKSB7Ci0JCXN0cnVjdCBjbGsgKmNsa3AgPSBzaDc3ODBfb25jaGlwX2Nsb2Nrc1tpXTsKLQotCQljbGtwLT5wYXJlbnQgPSBjbGs7Ci0JCWNsa19yZWdpc3RlcihjbGtwKTsKLQkJY2xrX2VuYWJsZShjbGtwKTsKLQl9Ci0KLQkvKgotCSAqIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHJlc3Qgb2YgdGhlIGNsb2NrcyByZWdpc3RlcmVkLCB3ZSBuZWVkIHRvCi0JICogZm9yY2UgdGhlIHBhcmVudCBjbG9jayB0byBwcm9wYWdhdGUgc28gdGhhdCB0aGVzZSBjbG9ja3Mgd2lsbAotCSAqIGF1dG9tYXRpY2FsbHkgZmlndXJlIG91dCB0aGVpciByYXRlLiBXZSBjaGVhdCBieSBoYW5kaW5nIHRoZQotCSAqIHBhcmVudCBjbG9jayBpdHMgY3VycmVudCByYXRlIGFuZCBmb3JjaW5nIGNoaWxkIHByb3BhZ2F0aW9uLgotCSAqLwotCWNsa19zZXRfcmF0ZShjbGssIGNsa19nZXRfcmF0ZShjbGspKTsKLQotCWNsa19wdXQoY2xrKTsKLQotCXJldHVybiAwOwotfQotCi1hcmNoX2luaXRjYWxsKHNoNzc4MF9jbGtfaW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvZXguUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvZXguUwppbmRleCAzZjRjZDA0Li5hYzhhYjU3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2V4LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9leC5TCkBAIC00LDcgKzQsNyBAQAogICogIFRoZSBTSC00IGV4Y2VwdGlvbiB2ZWN0b3IgdGFibGUuCiAKICAqICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgIE5paWJlIFl1dGFrYQotICogIENvcHlyaWdodCAoQykgMjAwMyAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtNTMsMyArNTMsMTAgQEAKICNlbmRpZgogRU5UUlkodXNlcl9icmVha19wb2ludF90cmFwKQogCS5sb25nCWJyZWFrX3BvaW50X3RyYXAJLyogMUUwICovCisKKwkvKgorCSAqIFBhZCB0aGUgcmVtYWluZGVyIG9mIHRoZSB0YWJsZSBvdXQsIGV4Y2VwdGlvbnMgcmVzaWRpbmcgaW4gZmFyCisJICogYXdheSBvZmZzZXRzIGNhbiBiZSBtYW51YWxseSBpbnNlcnRlZCBpbiB0byB0aGVpciBhcHByb3ByaWF0ZQorCSAqIGxvY2F0aW9uIHZpYSBzZXRfZXhjZXB0aW9uX3RhYmxlX3tldnQsdmVjfSgpLgorCSAqLworCS5iYWxpZ24JNDA5NiwwLDQwOTYKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvZnB1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2ZwdS5jCmluZGV4IGY0ODZjMDcuLjc2MjQ2NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvZnB1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9mcHUuYwpAQCAtMjgyLDExICsyODIsOCBAQAogCQkJZ3JhYl9mcHUocmVncyk7CiAJCQlyZXN0b3JlX2ZwdSh0c2spOwogCQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKLQkJfSBlbHNlIHsKLQkJCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQkJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCQl9IGVsc2UKIAkJCWZvcmNlX3NpZyhTSUdGUEUsIHRzayk7Ci0JCX0KIAogCQlyZWdzLT5wYyA9IG5leHRwYzsKIAkJcmV0dXJuIDE7CkBAIC0yOTYsMjkgKzI5MywyOSBAQAogfQogCiBhc21saW5rYWdlIHZvaWQKLWRvX2ZwdV9lcnJvcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAotCSAgICAgc3RydWN0IHB0X3JlZ3MgcmVncykKK2RvX2ZwdV9lcnJvcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nIHI2LAorCSAgICAgdW5zaWduZWQgbG9uZyByNywgc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKLQlpZiAoaWVlZV9mcGVfaGFuZGxlciAoJnJlZ3MpKQorCWlmIChpZWVlX2ZwZV9oYW5kbGVyKHJlZ3MpKQogCQlyZXR1cm47CiAKLQlyZWdzLnBjICs9IDI7Ci0Jc2F2ZV9mcHUodHNrLCAmcmVncyk7Ci0JdHNrLT50aHJlYWQudHJhcF9ubyA9IDExOwotCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCXJlZ3MtPnBjICs9IDI7CisJc2F2ZV9mcHUodHNrLCByZWdzKTsKIAlmb3JjZV9zaWcoU0lHRlBFLCB0c2spOwogfQogCiBhc21saW5rYWdlIHZvaWQKIGRvX2ZwdV9zdGF0ZV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGxvbmcgcjYsCi0JCSAgICAgdW5zaWduZWQgbG9uZyByNywgc3RydWN0IHB0X3JlZ3MgcmVncykKKwkJICAgICB1bnNpZ25lZCBsb25nIHI3LCBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAotCWdyYWJfZnB1KCZyZWdzKTsKLQlpZiAoIXVzZXJfbW9kZSgmcmVncykpIHsKKwlncmFiX2ZwdShyZWdzKTsKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgewogCQlwcmludGsoS0VSTl9FUlIgIkJVRzogRlBVIGlzIHVzZWQgaW4ga2VybmVsIG1vZGUuXG4iKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYwppbmRleCBjMjk0ZGUxLi45MDMxYTIyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCkBAIC03OSwxNiArNzksMTYgQEAKIAljYXNlIDB4MjA1OgogCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3NTA7CiAJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX1AyX0ZMVVNIX0JVRyB8IENQVV9IQVNfRlBVIHwKLQkJCQkgICBDUFVfSEFTX1BFUkZfQ09VTlRFUiB8IENQVV9IQVNfUFRFQTsKKwkJCQkgICBDUFVfSEFTX1BFUkZfQ09VTlRFUjsKIAkJYnJlYWs7CiAJY2FzZSAweDIwNjoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzUwUzsKIAkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19GUFUgfAotCQkJCSAgIENQVV9IQVNfUEVSRl9DT1VOVEVSIHwgQ1BVX0hBU19QVEVBOworCQkJCSAgIENQVV9IQVNfUEVSRl9DT1VOVEVSOwogCQlicmVhazsKIAljYXNlIDB4MTEwMDoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzUxOwotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX1BURUE7CisJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKIAkJYnJlYWs7CiAJY2FzZSAweDIwMDA6CiAJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzMxODA7CkBAIC0xMTksMzAgKzExOSwzOCBAQAogCQlicmVhazsKIAljYXNlIDB4MzAwMDoKIAljYXNlIDB4MzAwMzoKKwljYXNlIDB4MzAwOToKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3MzQzOwogCQljcHVfZGF0YS0+aWNhY2hlLndheXMgPSA0OwogCQljcHVfZGF0YS0+ZGNhY2hlLndheXMgPSA0OwogCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOwogCQlicmVhazsKKwljYXNlIDB4MzAwODoKKwkJaWYgKHByciA9PSAweGEwKSB7CisJCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3MjI7CisJCQljcHVfZGF0YS0+aWNhY2hlLndheXMgPSA0OworCQkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gNDsKKwkJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSAweDgwMDA6CiAJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NUNDBSQTsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVIHwgQ1BVX0hBU19QVEVBOworCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFU7CiAJCWJyZWFrOwogCWNhc2UgMHg4MTAwOgogCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TVDQwR1gxOwotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX1BURUE7CisJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKIAkJYnJlYWs7CiAJY2FzZSAweDcwMDoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g0XzUwMTsKIAkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gMjsKIAkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMjsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfUFRFQTsKIAkJYnJlYWs7CiAJY2FzZSAweDYwMDoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g0XzIwMjsKIAkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gMjsKIAkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMjsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVIHwgQ1BVX0hBU19QVEVBOworCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFU7CiAJCWJyZWFrOwogCWNhc2UgMHg1MDAgLi4uIDB4NTAxOgogCQlzd2l0Y2ggKHBycikgewpAQCAtMTYwLDcgKzE2OCw3IEBACiAJCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDI7CiAJCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDI7CiAKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVIHwgQ1BVX0hBU19QVEVBOworCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFU7CiAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE3Myw2ICsxODEsMTAgQEAKIAljcHVfZGF0YS0+ZGNhY2hlLndheXMgPSAxOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19QVEVBCisJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfUFRFQTsKKyNlbmRpZgorCiAJLyoKIAkgKiBPbiBhbnl0aGluZyB0aGF0J3Mgbm90IGEgZGlyZWN0LW1hcHBlZCBjYWNoZSwgbG9vayB0byB0aGUgQ1ZSCiAJICogZm9yIEkvRC1jYWNoZSBzcGVjaWZpY3MuCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYwppbmRleCA1MDgxMmQ1Li5jYmFjMjc2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKQEAgLTIsNiArMiw3IEBACiAgKiBTSDc3NTAvU0g3NzUxIFNldHVwCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwNiAgSmFtaWUgTGVuZWhhbgogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xMCw4ICsxMSwzOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9zY2kuaD4KIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBydGNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGZmYzgwMDAwLAorCQkuZW5kCT0gMHhmZmM4MDAwMCArIDB4NTggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPLAorCX0sCisJWzFdID0geworCQkvKiBQZXJpb2QgSVJRICovCisJCS5zdGFydAk9IDIxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLyogQ2FycnkgSVJRICovCisJCS5zdGFydAk9IDIyLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9IHsKKwkJLyogQWxhcm0gSVJRICovCisJCS5zdGFydAk9IDIwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtcnRjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHJ0Y19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHJ0Y19yZXNvdXJjZXMsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKIAl7CiAJCS5tYXBiYXNlCT0gMHhmZmUwMDAwMCwKQEAgLTM3LDYgKzY5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3NTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnJ0Y19kZXZpY2UsCiAJJnNjaV9kZXZpY2UsCiB9OwogCkBAIC00NiwzICs3OSw3MSBAQAogCQkJCSAgICBBUlJBWV9TSVpFKHNoNzc1MF9kZXZpY2VzKSk7CiB9CiBfX2luaXRjYWxsKHNoNzc1MF9kZXZpY2VzX3NldHVwKTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NTBfaXByX21hcFtdID0geworCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW9yaXR5ICovCisJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCBUVU5JKi8KKwl7IDE3LCAwLCAxMiwgMiB9LCAvKiBUTVUxIFRVTkkgKi8KKwl7IDE4LCAwLCAgNCwgMiB9LCAvKiBUTVUyIFRVTkkgKi8KKwl7IDE5LCAwLCAgNCwgMiB9LCAvKiBUTVUyIFRJUENJICovCisJeyAyNywgMSwgMTIsIDIgfSwgLyogV0RUIElUSSAqLworCXsgMjAsIDAsICAwLCAyIH0sIC8qIFJUQyBBVEkgKGFsYXJtKSAqLworCXsgMjEsIDAsICAwLCAyIH0sIC8qIFJUQyBQUkkgKHBlcmlvZCkgKi8KKwl7IDIyLCAwLCAgMCwgMiB9LCAvKiBSVEMgQ1VJIChjYXJyeSkgKi8KKwl7IDIzLCAxLCAgNCwgMyB9LCAvKiBTQ0kgRVJJICovCisJeyAyNCwgMSwgIDQsIDMgfSwgLyogU0NJIFJYSSAqLworCXsgMjUsIDEsICA0LCAzIH0sIC8qIFNDSSBUWEkgKi8KKwl7IDQwLCAyLCAgNCwgMyB9LCAvKiBTQ0lGIEVSSSAqLworCXsgNDEsIDIsICA0LCAzIH0sIC8qIFNDSUYgUlhJICovCisJeyA0MiwgMiwgIDQsIDMgfSwgLyogU0NJRiBCUkkgKi8KKwl7IDQzLCAyLCAgNCwgMyB9LCAvKiBTQ0lGIFRYSSAqLworCXsgMzQsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTAgKi8KKwl7IDM1LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEUxICovCisJeyAzNiwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFMiAqLworCXsgMzcsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTMgKi8KKwl7IDI4LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNQUUgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzUxX2lwcl9tYXBbXSA9IHsKKwl7IDQ0LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU0ICovCisJeyA0NSwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFNSAqLworCXsgNDYsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTYgKi8KKwl7IDQ3LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU3ICovCisJLyogVGhlIGZvbGxvd2luZyB1c2UgSU5UQ19JTlBSSTAwIGZvciBtYXNraW5nLCB3aGljaCBpcyBhIDMyLWJpdAorCSAgIHJlZ2lzdGVyLCBub3QgYSAxNi1iaXQgcmVnaXN0ZXIgbGlrZSB0aGUgSVBSeCByZWdpc3RlcnMsIHNvIGl0CisJICAgd291bGQgbmVlZCBzcGVjaWFsIHN1cHBvcnQgKi8KKwkvKnsgNzIsIElOVFBSSTAwLCAgOCwgPyB9LCovIC8qIFRNVTMgVFVOSSAqLworCS8qeyA3NiwgSU5UUFJJMDAsIDEyLCA/IH0sKi8gLyogVE1VNCBUVU5JICovCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCTB4ZmZkMDAwMDRVTCwJLyogMDogSVBSQSAqLworCTB4ZmZkMDAwMDhVTCwJLyogMTogSVBSQiAqLworCTB4ZmZkMDAwMGNVTCwJLyogMjogSVBSQyAqLworCTB4ZmZkMDAwMTBVTCwJLyogMzogSVBSRCAqLworfTsKKworLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwordW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQoreworCWlmIChpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpCisJCXJldHVybiAwOworCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOworfQorCisjZGVmaW5lIElOVENfSUNSCTB4ZmZkMDAwMDBVTAorI2RlZmluZSBJTlRDX0lDUl9JUkxNICAgKDE8PDcpCisKKy8qIGVuYWJsZSBpbmRpdmlkdWFsIGludGVycnVwdCBtb2RlIGZvciBleHRlcm5hbCBpbnRlcnVwdHMgKi8KK3ZvaWQgaXByX2lycV9lbmFibGVfaXJsbSh2b2lkKQoreworCWN0cmxfb3V0dyhjdHJsX2ludyhJTlRDX0lDUikgfCBJTlRDX0lDUl9JUkxNLCBJTlRDX0lDUik7Cit9CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2lwcigpCit7CisJbWFrZV9pcHJfaXJxKHNoNzc1MF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc1MF9pcHJfbWFwKSk7CisjaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MQorCW1ha2VfaXByX2lycShzaDc3NTFfaXByX21hcCwgQVJSQVlfU0laRShzaDc3NTFfaXByX21hcCkpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwppbmRleCA5N2YxYzlhLi4wN2U1Mzc3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKQEAgLTUxLDMgKzUxLDY2IEBACiAJCQkJICAgIEFSUkFZX1NJWkUoc2g3NzYwX2RldmljZXMpKTsKIH0KIF9faW5pdGNhbGwoc2g3NzYwX2RldmljZXNfc2V0dXApOworCisvKgorICogU0g3NzYwIElOVEMyLVN0eWxlIGludGVycnVwdHMsIHZlY3RvcnMgSVJRNDgtMTExIElOVEVWVCAweDgwMC0weEZFMAorICovCitzdGF0aWMgc3RydWN0IGludGMyX2RhdGEgaW50YzJfaXJxX3RhYmxlW10gPSB7CisJLyogSU5UUFJJTzAgfCBJTlRNU0swICovCisJezQ4LCAgMCwgMjgsIDAsIDMxLCAgM30sCS8qIElSUSA0ICovCisJezQ5LCAgMCwgMjQsIDAsIDMwLCAgM30sCS8qIElSUSAzICovCisJezUwLCAgMCwgMjAsIDAsIDI5LCAgM30sCS8qIElSUSAyICovCisJezUxLCAgMCwgMTYsIDAsIDI4LCAgM30sCS8qIElSUSAxICovCisJLyogNTItNTUgKElOVEVWVCAweDg4MC0weDhFMCkgdW51c2VkL3Jlc2VydmVkICovCisJLyogSU5UUFJJTzQgfCBJTlRNU0swICovCisJezU2LCAgNCwgMjgsIDAsIDI1LCAgM30sCS8qIEhDQU4yX0NIQU4wICovCisJezU3LCAgNCwgMjQsIDAsIDI0LCAgM30sCS8qIEhDQU4yX0NIQU4xICovCisJezU4LCAgNCwgMjAsIDAsIDIzLCAgM30sCS8qIEkyU19DSEFOMCAgICovCisJezU5LCAgNCwgMTYsIDAsIDIyLCAgM30sCS8qIEkyU19DSEFOMSAgICovCisJezYwLCAgNCwgMTIsIDAsIDIxLCAgM30sCS8qIEFDOTdfQ0hBTjAgICovCisJezYxLCAgNCwgIDgsIDAsIDIwLCAgM30sCS8qIEFDOTdfQ0hBTjEgICovCisJezYyLCAgNCwgIDQsIDAsIDE5LCAgM30sCS8qIEkyQ19DSEFOMCAgICovCisJezYzLCAgNCwgIDAsIDAsIDE4LCAgM30sCS8qIEkyQ19DSEFOMSAgICovCisJLyogSU5UUFJJTzggfCBJTlRNU0swICovCisJezUyLCAgOCwgMTYsIDAsIDExLCAgM30sCS8qIFNDSUYwX0VSSV9JUlEgKi8KKwl7NTMsICA4LCAxNiwgMCwgMTAsICAzfSwJLyogU0NJRjBfUlhJX0lSUSAqLworCXs1NCwgIDgsIDE2LCAwLCAgOSwgIDN9LAkvKiBTQ0lGMF9CUklfSVJRICovCisJezU1LCAgOCwgMTYsIDAsICA4LCAgM30sCS8qIFNDSUYwX1RYSV9JUlEgKi8KKwl7NjQsICA4LCAyOCwgMCwgMTcsICAzfSwJLyogVVNCSElfSVJRICovCisJezY1LCAgOCwgMjQsIDAsIDE2LCAgM30sCS8qIExDREMgICAgICAqLworCS8qIDY2LCA2NyB1bnVzZWQgKi8KKwl7NjgsICA4LCAyMCwgMCwgMTQsIDEzfSwJLyogRE1BQlJHSTBfSVJRICovCisJezY5LCAgOCwgMjAsIDAsIDEzLCAxM30sCS8qIERNQUJSR0kxX0lSUSAqLworCXs3MCwgIDgsIDIwLCAwLCAxMiwgMTN9LAkvKiBETUFCUkdJMl9JUlEgKi8KKwkvKiA3MSB1bnVzZWQgKi8KKwl7NzIsICA4LCAxMiwgMCwgIDcsICAzfSwJLyogU0NJRjFfRVJJX0lSUSAqLworCXs3MywgIDgsIDEyLCAwLCAgNiwgIDN9LAkvKiBTQ0lGMV9SWElfSVJRICovCisJezc0LCAgOCwgMTIsIDAsICA1LCAgM30sCS8qIFNDSUYxX0JSSV9JUlEgKi8KKwl7NzUsICA4LCAxMiwgMCwgIDQsICAzfSwJLyogU0NJRjFfVFhJX0lSUSAqLworCXs3NiwgIDgsICA4LCAwLCAgMywgIDN9LAkvKiBTQ0lGMl9FUklfSVJRICovCisJezc3LCAgOCwgIDgsIDAsICAyLCAgM30sCS8qIFNDSUYyX1JYSV9JUlEgKi8KKwl7NzgsICA4LCAgOCwgMCwgIDEsICAzfSwJLyogU0NJRjJfQlJJX0lSUSAqLworCXs3OSwgIDgsICA4LCAwLCAgMCwgIDN9LAkvKiBTQ0lGMl9UWElfSVJRICovCisJLyogICAgICAgICAgfCBJTlRNU0s0ICovCisJezgwLCAgOCwgIDQsIDQsIDIzLCAgM30sCS8qIFNJTV9FUkkgKi8KKwl7ODEsICA4LCAgNCwgNCwgMjIsICAzfSwJLyogU0lNX1JYSSAqLworCXs4MiwgIDgsICA0LCA0LCAyMSwgIDN9LAkvKiBTSU1fVFhJICovCisJezgzLCAgOCwgIDQsIDQsIDIwLCAgM30sCS8qIFNJTV9URUkgKi8KKwl7ODQsICA4LCAgMCwgNCwgMTksICAzfSwJLyogSFNQSUkgKi8KKwkvKiBJTlRQUklPQyB8IElOVE1TSzQgKi8KKwkvKiA4NS04NyB1bnVzZWQvcmVzZXJ2ZWQgKi8KKwl7ODgsIDEyLCAyMCwgNCwgMTgsICAzfSwJLyogTU1DSTAgKi8KKwl7ODksIDEyLCAyMCwgNCwgMTcsICAzfSwJLyogTU1DSTEgKi8KKwl7OTAsIDEyLCAyMCwgNCwgMTYsICAzfSwJLyogTU1DSTIgKi8KKwl7OTEsIDEyLCAyMCwgNCwgMTUsICAzfSwJLyogTU1DSTMgKi8KKwl7OTIsIDEyLCAxMiwgNCwgIDYsICAzfSwJLyogTUZJICh1bnN1cmUsIGJ1Zz8gaW4gbXkgNzc2MCBtYW51YWwqLworCS8qIDkzLTEwNyByZXNlcnZlZC91bmRvY3VtZW50ZWQgKi8KKwl7MTA4LDEyLCAgNCwgNCwgIDEsICAzfSwJLyogQURDICAqLworCXsxMDksMTIsICAwLCA0LCAgMCwgIDN9LAkvKiBDTVRJICovCisJLyogMTEwLTExMSByZXNlcnZlZC91bnVzZWQgKi8KK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCit7CisJbWFrZV9pbnRjMl9pcnEoaW50YzJfaXJxX3RhYmxlLCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNDkzZjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3ODAuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBTSDc3ODAgU2V0dXAKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL3NjaS5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IDB4ZmZlODAwMDAsCi0JCS5lbmQJPSAweGZmZTgwMDAwICsgMHg1OCAtIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCi0JfSwKLQlbMV0gPSB7Ci0JCS8qIFBlcmlvZCBJUlEgKi8KLQkJLnN0YXJ0CT0gMjEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkvKiBDYXJyeSBJUlEgKi8KLQkJLnN0YXJ0CT0gMjIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzNdID0gewotCQkvKiBBbGFybSBJUlEgKi8KLQkJLnN0YXJ0CT0gMjMsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzaC1ydGMiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0gewotCXsKLQkJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS50eXBlCQk9IFBPUlRfU0NJRiwKLQkJLmlycXMJCT0geyA0MCwgNDEsIDQzLCA0MiB9LAotCX0sIHsKLQkJLm1hcGJhc2UJPSAweGZmZTEwMDAwLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS50eXBlCQk9IFBPUlRfU0NJRiwKLQkJLmlycXMJCT0geyA3NiwgNzcsIDc5LCA3OCB9LAotCX0sIHsKLQkJLmZsYWdzID0gMCwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzaC1zY2kiLAotCS5pZAkJPSAtMSwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSBzY2lfcGxhdGZvcm1fZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc4MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmcnRjX2RldmljZSwKLQkmc2NpX2RldmljZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNoNzc4MF9kZXZpY2VzX3NldHVwKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzc4MF9kZXZpY2VzLAotCQkJCSAgICBBUlJBWV9TSVpFKHNoNzc4MF9kZXZpY2VzKSk7Ci19Ci1fX2luaXRjYWxsKHNoNzc4MF9kZXZpY2VzX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc3EuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc3EuYwppbmRleCA3YmNjNzNmLi5kN2ZmZjc1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NxLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zcS5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jcHUvc3EuaD4KQEAgLTM4LDcgKzM4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzcV9tYXBwaW5nICpzcV9tYXBwaW5nX2xpc3Q7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNxX21hcHBpbmdfbG9jayk7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpzcV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc3FfY2FjaGU7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqc3FfYml0bWFwOwogCiAjZGVmaW5lIHN0b3JlX3F1ZXVlX2JhcnJpZXIoKQkJCVwKQEAgLTY3LDYgKzY3LDcgQEAKIAkvKiBXYWl0IGZvciBjb21wbGV0aW9uICovCiAJc3RvcmVfcXVldWVfYmFycmllcigpOwogfQorRVhQT1JUX1NZTUJPTChzcV9mbHVzaF9yYW5nZSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzcV9tYXBwaW5nX2xpc3RfYWRkKHN0cnVjdCBzcV9tYXBwaW5nICptYXApCiB7CkBAIC0xMTAsOCArMTExLDkgQEAKIAogCXZtYS0+cGh5c19hZGRyID0gbWFwLT5hZGRyOwogCi0JaWYgKHJlbWFwX2FyZWFfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdm1hLT5hZGRyLCB2bWEtPnBoeXNfYWRkciwKLQkJCSAgICAgbWFwLT5zaXplLCBmbGFncykpIHsKKwlpZiAoaW9yZW1hcF9wYWdlX3JhbmdlKCh1bnNpZ25lZCBsb25nKXZtYS0+YWRkciwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyl2bWEtPmFkZHIgKyBtYXAtPnNpemUsCisJCQkgICAgICAgdm1hLT5waHlzX2FkZHIsIF9fcGdwcm90KGZsYWdzKSkpIHsKIAkJdnVubWFwKHZtYS0+YWRkcik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTE2Niw3ICsxNjgsNyBAQAogCW1hcC0+c2l6ZSA9IHNpemU7CiAJbWFwLT5uYW1lID0gbmFtZTsKIAotCXBhZ2UgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihzcV9iaXRtYXAsIDB4MDQwMDAwMDAsCisJcGFnZSA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKHNxX2JpdG1hcCwgMHgwNDAwMDAwMCA+PiBQQUdFX1NISUZULAogCQkJCSAgICAgICBnZXRfb3JkZXIobWFwLT5zaXplKSk7CiAJaWYgKHVubGlrZWx5KHBhZ2UgPCAwKSkgewogCQlyZXQgPSAtRU5PU1BDOwpAQCAtMTc1LDcgKzE3Nyw3IEBACiAKIAltYXAtPnNxX2FkZHIgPSBQNFNFR19TVE9SRV9RVUUgKyAocGFnZSA8PCBQQUdFX1NISUZUKTsKIAotCXJldCA9IF9fc3FfcmVtYXAobWFwLCBmbGFncyk7CisJcmV0ID0gX19zcV9yZW1hcChtYXAsIHBncHJvdF92YWwoUEFHRV9LRVJORUxfTk9DQUNIRSkgfCBmbGFncyk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CiAKQEAgLTE5Myw2ICsxOTUsNyBAQAogCWttZW1fY2FjaGVfZnJlZShzcV9jYWNoZSwgbWFwKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChzcV9yZW1hcCk7CiAKIC8qKgogICogc3FfdW5tYXAgLSBVbm1hcCBhIFN0b3JlIFF1ZXVlIGFsbG9jYXRpb24KQEAgLTIzNCw2ICsyMzcsNyBAQAogCiAJa21lbV9jYWNoZV9mcmVlKHNxX2NhY2hlLCBtYXApOwogfQorRVhQT1JUX1NZTUJPTChzcV91bm1hcCk7CiAKIC8qCiAgKiBOZWVkbGVzc2x5IGNvbXBsZXggc3lzZnMgaW50ZXJmYWNlLiBVbmZvcnR1bmF0ZWx5IGl0IGRvZXNuJ3Qgc2VlbSBsaWtlCkBAIC00MDIsNyArNDA2LDMgQEAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+LCBNLiBSLiBCcm93biA8bXJicm93bkAweGQ2Lm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU2ltcGxlIEFQSSBmb3IgU0gtNCBpbnRlZ3JhdGVkIFN0b3JlIFF1ZXVlcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1FWFBPUlRfU1lNQk9MKHNxX3JlbWFwKTsKLUVYUE9SVF9TWU1CT0woc3FfdW5tYXApOwotRVhQT1JUX1NZTUJPTChzcV9mbHVzaF9yYW5nZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjQ5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZQpAQCAtMCwwICsxLDE5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXgvU3VwZXJIIFNILTQgYmFja2VuZHMuCisjCisKKyMgQ1BVIHN1YnR5cGUgc2V0dXAKK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzApCSs9IHNldHVwLXNoNzc3MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKQkrPSBzZXR1cC1zaDc3ODAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCSs9IHNldHVwLXNoNzMxODAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykJKz0gc2V0dXAtc2g3MzQzLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCSs9IHNldHVwLXNoNzcyMi5vCisKKyMgUHJpbWFyeSBvbi1jaGlwIGNsb2NrcyAoY29tbW9uKQorY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkJOj0gY2xvY2stc2g3MzE4MC5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzApCTo9IGNsb2NrLXNoNzc3MC5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCTo9IGNsb2NrLXNoNzc4MC5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCTo9IGNsb2NrLXNoNzM0My5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCTo9IGNsb2NrLXNoNzM0My5vCisKK29iai15CSs9ICQoY2xvY2steSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g3MzE4MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzE4MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNzMxODAuYwpyZW5hbWUgdG8gYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzE4MC5jCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDczNDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM0My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MDdhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDczNDMuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDczNDMuYworICoKKyAqIFNINzM0My9TSDc3MjIgc3VwcG9ydCBmb3IgdGhlIGNsb2NrIGZyYW1ld29yaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9mcmVxLmg+CisKKy8qCisgKiBTSDczNDMvU0g3NzIyIHVzZXMgYSBjb21tb24gc2V0IG9mIG11bHRpcGxpZXJzIGFuZCBkaXZpc29ycywgc28gdGhpcworICogaXMgcXVpdGUgc2ltcGxlLi4KKyAqLworc3RhdGljIGludCBtdWx0aXBsaWVyc1tdID0geyAxLCAyLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH07CitzdGF0aWMgaW50IGRpdmlzb3JzW10gPSB7IDEsIDMsIDIsIDUsIDMsIDQsIDUsIDYsIDgsIDEwLCAxMiwgMTYsIDIwIH07CisKKyNkZWZpbmUgcGxsX2NhbGMoKSAoKChjdHJsX2lubChGUlFDUikgPj4gMjQpICYgMHgxZikgKyAxKQorCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cGFyZW50ID0gY2xrX2dldChOVUxMLCAiY3B1X2NsayIpOworfQorCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9IChjdHJsX2lubChGUlFDUikgJiAweDAwMGYpOworCWNsay0+cmF0ZSAqPSBjbGstPnBhcmVudC0+cmF0ZSAqIG11bHRpcGxpZXJzW2lkeF0gLyBkaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MzQzX21hc3Rlcl9jbGtfb3BzID0geworCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKKwkucmVjYWxjCQk9IG1hc3Rlcl9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwljbGstPnBhcmVudCA9IE5VTEw7CisJY2xrLT5yYXRlID0gQ09ORklHX1NIX1BDTEtfRlJFUTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzM0M19tb2R1bGVfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBtb2R1bGVfY2xrX2luaXQsCit9OworCitzdGF0aWMgdm9pZCBidXNfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cGFyZW50ID0gY2xrX2dldChOVUxMLCAiY3B1X2NsayIpOworfQorCitzdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9IChjdHJsX2lubChGUlFDUikgPj4gOCkgJiAweDAwMGY7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgKiBtdWx0aXBsaWVyc1tpZHhdIC8gZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzM0M19idXNfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBidXNfY2xrX2luaXQsCisJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGNwdV9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJY2xrLT5wYXJlbnQgPSBjbGtfZ2V0KE5VTEwsICJtb2R1bGVfY2xrIik7CisJY2xrLT5mbGFncyB8PSBDTEtfUkFURV9QUk9QQUdBVEVTOworCWNsa19zZXRfcmF0ZShjbGssIGNsa19nZXRfcmF0ZShjbGspKTsKK30KKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoY3RybF9pbmwoRlJRQ1IpID4+IDIwKSAmIDB4MDAwZjsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAqIHBsbF9jYWxjKCkgKgorCQltdWx0aXBsaWVyc1tpZHhdIC8gZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzM0M19jcHVfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBjcHVfY2xrX2luaXQsCisJLnJlY2FsYwkJPSBjcHVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyAqc2g3MzQzX2Nsa19vcHNbXSA9IHsKKwkmc2g3MzQzX21hc3Rlcl9jbGtfb3BzLAorCSZzaDczNDNfbW9kdWxlX2Nsa19vcHMsCisJJnNoNzM0M19idXNfY2xrX29wcywKKwkmc2g3MzQzX2NwdV9jbGtfb3BzLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCBpZHgpCit7CisJaWYgKGlkeCA8IEFSUkFZX1NJWkUoc2g3MzQzX2Nsa19vcHMpKQorCQkqb3BzID0gc2g3MzQzX2Nsa19vcHNbaWR4XTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g3NzcwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3NzAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDc3NzAuYwpyZW5hbWUgdG8gYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzcwLmMKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2YTIxNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4MC5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDc3ODAuYworICoKKyAqIFNINzc4MCBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9mcmVxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgaWZjX2Rpdmlzb3JzW10gPSB7IDIsIDQgfTsKK3N0YXRpYyBpbnQgYmZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDEsIDgsIDEyLCAxNiwgMjQsIDEgfTsKK3N0YXRpYyBpbnQgcGZjX2Rpdmlzb3JzW10gPSB7IDEsIDI0LCAyNCwgMSB9Oworc3RhdGljIGludCBjZmNfZGl2aXNvcnNbXSA9IHsgMSwgMSwgNCwgMSwgNiwgMSwgMSwgMSB9OworCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSAqPSBwZmNfZGl2aXNvcnNbY3RybF9pbmwoRlJRQ1IpICYgMHgwMDAzXTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4MF9tYXN0ZXJfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCit9OworCitzdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9IChjdHJsX2lubChGUlFDUikgJiAweDAwMDMpOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3ODBfbW9kdWxlX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gMTYpICYgMHgwMDA3KTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzgwX2J1c19jbGtfb3BzID0geworCS5yZWNhbGMJCT0gYnVzX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IDI0KSAmIDB4MDAwMSk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4MF9jcHVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDc3ODBfY2xrX29wc1tdID0geworCSZzaDc3ODBfbWFzdGVyX2Nsa19vcHMsCisJJnNoNzc4MF9tb2R1bGVfY2xrX29wcywKKwkmc2g3NzgwX2J1c19jbGtfb3BzLAorCSZzaDc3ODBfY3B1X2Nsa19vcHMsCit9OworCit2b2lkIF9faW5pdCBhcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKm9wcywgaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDc3ODBfY2xrX29wcykpCisJCSpvcHMgPSBzaDc3ODBfY2xrX29wc1tpZHhdOworfQorCitzdGF0aWMgdm9pZCBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IDIwKSAmIDB4MDAwNyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBjZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4MF9zaHl3YXlfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IHNoeXdheV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2g3NzgwX3NoeXdheV9jbGsgPSB7CisJLm5hbWUJCT0gInNoeXdheV9jbGsiLAorCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQsCisJLm9wcwkJPSAmc2g3NzgwX3NoeXdheV9jbGtfb3BzLAorfTsKKworLyoKKyAqIEFkZGl0aW9uYWwgU0g3NzgwLXNwZWNpZmljIG9uLWNoaXAgY2xvY2tzIHRoYXQgYXJlbid0IGFscmVhZHkgcGFydCBvZiB0aGUKKyAqIGNsb2NrIGZyYW1ld29yaworICovCitzdGF0aWMgc3RydWN0IGNsayAqc2g3NzgwX29uY2hpcF9jbG9ja3NbXSA9IHsKKwkmc2g3NzgwX3NoeXdheV9jbGssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDc3ODBfY2xrX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KE5VTEwsICJtYXN0ZXJfY2xrIik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaDc3ODBfb25jaGlwX2Nsb2Nrcyk7IGkrKykgeworCQlzdHJ1Y3QgY2xrICpjbGtwID0gc2g3NzgwX29uY2hpcF9jbG9ja3NbaV07CisKKwkJY2xrcC0+cGFyZW50ID0gY2xrOworCQljbGtfcmVnaXN0ZXIoY2xrcCk7CisJCWNsa19lbmFibGUoY2xrcCk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBjbG9ja3MgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0bworCSAqIGZvcmNlIHRoZSBwYXJlbnQgY2xvY2sgdG8gcHJvcGFnYXRlIHNvIHRoYXQgdGhlc2UgY2xvY2tzIHdpbGwKKwkgKiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgdGhlaXIgcmF0ZS4gV2UgY2hlYXQgYnkgaGFuZGluZyB0aGUKKwkgKiBwYXJlbnQgY2xvY2sgaXRzIGN1cnJlbnQgcmF0ZSBhbmQgZm9yY2luZyBjaGlsZCBwcm9wYWdhdGlvbi4KKwkgKi8KKwljbGtfc2V0X3JhdGUoY2xrLCBjbGtfZ2V0X3JhdGUoY2xrKSk7CisKKwljbGtfcHV0KGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChzaDc3ODBfY2xrX2luaXQpOworCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzMxODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzMxODAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDczMTgwLmMKcmVuYW1lIHRvIGFyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzMxODAuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDczNDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzM0My5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzM0My5jCnJlbmFtZSB0byBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNDMuYwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTQzZmJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIFNINzcyMiBTZXR1cAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2NpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0geyA4MCwgODEsIDgzLCA4MiB9LAorCX0sIHsKKwkJLmZsYWdzID0gMCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1zY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBzY2lfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzcyMl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc2NpX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoNzcyMl9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzcyMl9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNoNzcyMl9kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKHNoNzcyMl9kZXZpY2VzX3NldHVwKTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MjJfaXByX21hcFtdID0geworCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW8gKi8KKwl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwICovCisJeyAxNywgMCwgIDgsIDIgfSwgLyogVE1VMSAqLworCXsgODAsIDYsIDEyLCAzIH0sIC8qIFNDSUYgRVJJICovCisJeyA4MSwgNiwgMTIsIDMgfSwgLyogU0NJRiBSWEkgKi8KKwl7IDgyLCA2LCAxMiwgMyB9LCAvKiBTQ0lGIEJSSSAqLworCXsgODMsIDYsIDEyLCAzIH0sIC8qIFNDSUYgVFhJICovCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCTB4YTQwODAwMDAsIC8qICAwOiBJUFJBICovCisJMHhhNDA4MDAwNCwgLyogIDE6IElQUkIgKi8KKwkweGE0MDgwMDA4LCAvKiAgMjogSVBSQyAqLworCTB4YTQwODAwMGMsIC8qICAzOiBJUFJEICovCisJMHhhNDA4MDAxMCwgLyogIDQ6IElQUkUgKi8KKwkweGE0MDgwMDE0LCAvKiAgNTogSVBSRiAqLworCTB4YTQwODAwMTgsIC8qICA2OiBJUFJHICovCisJMHhhNDA4MDAxYywgLyogIDc6IElQUkggKi8KKwkweGE0MDgwMDIwLCAvKiAgODogSVBSSSAqLworCTB4YTQwODAwMjQsIC8qICA5OiBJUFJKICovCisJMHhhNDA4MDAyOCwgLyogMTA6IElQUksgKi8KKwkweGE0MDgwMDJjLCAvKiAxMTogSVBSTCAqLworfTsKKwordW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQoreworCWlmICh1bmxpa2VseShpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKK30KKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCit7CisJbWFrZV9pcHJfaXJxKHNoNzcyMl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzcyMl9pcHJfbWFwKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc3MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzcwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzcwLmMKcmVuYW1lIHRvIGFyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc3MC5jCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWFhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYwpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIFNINzc4MCBTZXR1cAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2NpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRjX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHhmZmU4MDAwMCwKKwkJLmVuZAk9IDB4ZmZlODAwMDAgKyAweDU4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKKwl9LAorCVsxXSA9IHsKKwkJLyogUGVyaW9kIElSUSAqLworCQkuc3RhcnQJPSAyMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS8qIENhcnJ5IElSUSAqLworCQkuc3RhcnQJPSAyMiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbM10gPSB7CisJCS8qIEFsYXJtIElSUSAqLworCQkuc3RhcnQJPSAyMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0Y19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLXJ0YyIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShydGNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBydGNfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDQwLCA0MSwgNDMsIDQyIH0sCisJfSwgeworCQkubWFwYmFzZQk9IDB4ZmZlMTAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDc2LCA3NywgNzksIDc4IH0sCisJfSwgeworCQkuZmxhZ3MgPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLXNjaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNjaV9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzgwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZydGNfZGV2aWNlLAorCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g3NzgwX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzgwX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUoc2g3NzgwX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2g3NzgwX2RldmljZXNfc2V0dXApOworCitzdGF0aWMgc3RydWN0IGludGMyX2RhdGEgaW50YzJfaXJxX3RhYmxlW10gPSB7CisJeyAyOCwgMCwgMjQsIDAsIDAsIDIgfSwJCS8qIFRNVTAgKi8KKworCXsgMjEsIDEsICAwLCAwLCAyLCAyIH0sCisJeyAyMiwgMSwgIDEsIDAsIDIsIDIgfSwKKwl7IDIzLCAxLCAgMiwgMCwgMiwgMiB9LAorCisJeyA0MCwgOCwgMjQsIDAsIDMsIDMgfSwJCS8qIFNDSUYwIEVSSSAqLworCXsgNDEsIDgsIDI0LCAwLCAzLCAzIH0sCQkvKiBTQ0lGMCBSWEkgKi8KKwl7IDQyLCA4LCAyNCwgMCwgMywgMyB9LAkJLyogU0NJRjAgQlJJICovCisJeyA0MywgOCwgMjQsIDAsIDMsIDMgfSwJCS8qIFNDSUYwIFRYSSAqLworCisJeyA3NiwgOCwgMTYsIDAsIDQsIDMgfSwJCS8qIFNDSUYxIEVSSSAqLworCXsgNzcsIDgsIDE2LCAwLCA0LCAzIH0sCQkvKiBTQ0lGMSBSWEkgKi8KKwl7IDc4LCA4LCAxNiwgMCwgNCwgMyB9LAkJLyogU0NJRjEgQlJJICovCisJeyA3OSwgOCwgMTYsIDAsIDQsIDMgfSwJCS8qIFNDSUYxIFRYSSAqLworCisJeyA2NCwgMHgxMCwgIDgsIDAsIDE0LCAyIH0sCS8qIFBDSUMwICovCisJeyA2NSwgMHgxMCwgIDAsIDAsIDE1LCAyIH0sCS8qIFBDSUMxICovCisJeyA2NiwgMHgxNCwgMjQsIDAsIDE2LCAyIH0sCS8qIFBDSUMyICovCisJeyA2NywgMHgxNCwgMTYsIDAsIDE3LCAyIH0sCS8qIFBDSUMzICovCisJeyA2OCwgMHgxNCwgIDgsIDAsIDE4LCAyIH0sCS8qIFBDSUM0ICovCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQoreworCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2Vhcmx5X3ByaW50ay5jIGIvYXJjaC9zaC9rZXJuZWwvZWFybHlfcHJpbnRrLmMKaW5kZXggYTAwMDIyNy4uNTYwYjkxYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvZWFybHlfcHJpbnRrLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvZWFybHlfcHJpbnRrLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpZmRlZiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUwogI2luY2x1ZGUgPGFzbS9zaF9iaW9zLmg+CkBAIC02MiwxNyArNjIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgiCiAKLSNpZmRlZiBDT05GSUdfQ1BVX1NINAotI2RlZmluZSBTQ0lGX1JFRwkweGZmZTgwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYwKQotI2RlZmluZSBTQ0lGX1JFRwkweGZmZmU5ODAwCi0jZWxzZQotI2Vycm9yICJVbmRlZmluZWQgU0NJRiBmb3IgdGhpcyBzdWJ0eXBlIgotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgdWFydF9wb3J0IHNjaWZfcG9ydCA9IHsKLQkubWFwYmFzZQk9IFNDSUZfUkVHLAotCS5tZW1iYXNlCT0gKGNoYXIgX19pb21lbSAqKVNDSUZfUkVHLAorCS5tYXBiYXNlCT0gQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRV9QT1JULAorCS5tZW1iYXNlCT0gKGNoYXIgX19pb21lbSAqKUNPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEVfUE9SVCwKIH07CiAKIHN0YXRpYyB2b2lkIHNjaWZfc2VyY29uX3B1dGMoaW50IGMpCkBAIC0xMTMsMjMgKzEwNSwyOSBAQAogCS5pbmRleAkJPSAtMSwKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KSAmJiAhZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKKy8qCisgKiBTaW1wbGUgU0NJRiBpbml0LCBwcmltYXJpbHkgYWltZWQgYXQgU0g3NzUwIGFuZCBvdGhlciBzaW1pbGFyIFNILTQKKyAqIGRldmljZXMgdGhhdCBhcmVuJ3QgdXNpbmcgc2gtaXBsK2cuCisgKi8KIHN0YXRpYyB2b2lkIHNjaWZfc2VyY29uX2luaXQoaW50IGJhdWQpCiB7Ci0JY3RybF9vdXR3KDAsIFNDSUZfUkVHICsgOCk7Ci0JY3RybF9vdXR3KDAsIFNDSUZfUkVHKTsKKwljdHJsX291dHcoMCwgc2NpZl9wb3J0Lm1hcGJhc2UgKyA4KTsKKwljdHJsX291dHcoMCwgc2NpZl9wb3J0Lm1hcGJhc2UpOwogCiAJLyogU2V0IGJhdWQgcmF0ZSAqLwogCWN0cmxfb3V0YigoQ09ORklHX1NIX1BDTEtfRlJFUSArIDE2ICogYmF1ZCkgLwotCQkgICgzMiAqIGJhdWQpIC0gMSwgU0NJRl9SRUcgKyA0KTsKKwkJICAoMzIgKiBiYXVkKSAtIDEsIHNjaWZfcG9ydC5tYXBiYXNlICsgNCk7CiAKLQljdHJsX291dHcoMTIsIFNDSUZfUkVHICsgMjQpOwotCWN0cmxfb3V0dyg4LCBTQ0lGX1JFRyArIDI0KTsKLQljdHJsX291dHcoMCwgU0NJRl9SRUcgKyAzMik7Ci0JY3RybF9vdXR3KDB4NjAsIFNDSUZfUkVHICsgMTYpOwotCWN0cmxfb3V0dygwLCBTQ0lGX1JFRyArIDM2KTsKLQljdHJsX291dHcoMHgzMCwgU0NJRl9SRUcgKyA4KTsKKwljdHJsX291dHcoMTIsIHNjaWZfcG9ydC5tYXBiYXNlICsgMjQpOworCWN0cmxfb3V0dyg4LCBzY2lmX3BvcnQubWFwYmFzZSArIDI0KTsKKwljdHJsX291dHcoMCwgc2NpZl9wb3J0Lm1hcGJhc2UgKyAzMik7CisJY3RybF9vdXR3KDB4NjAsIHNjaWZfcG9ydC5tYXBiYXNlICsgMTYpOworCWN0cmxfb3V0dygwLCBzY2lmX3BvcnQubWFwYmFzZSArIDM2KTsKKwljdHJsX291dHcoMHgzMCwgc2NpZl9wb3J0Lm1hcGJhc2UgKyA4KTsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19DUFVfU0g0ICYmICFDT05GSUdfU0hfU1RBTkRBUkRfQklPUyAqLworI2VuZGlmIC8qIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgKi8KIAogLyoKICAqIFNldHVwIGEgZGVmYXVsdCBjb25zb2xlLCBpZiBtb3JlIHRoYW4gb25lIGlzIGNvbXBpbGVkIGluLCByZWx5IG9uIHRoZQpAQCAtMTQ2LDE2ICsxNDQsMTYgQEAKIAk7CiAKIHN0YXRpYyBpbnQgX19pbml0ZGF0YSBrZWVwX2Vhcmx5Oworc3RhdGljIGludCBlYXJseV9jb25zb2xlX2luaXRpYWxpemVkOwogCi1pbnQgX19pbml0IHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICpvcHQpCitpbnQgX19pbml0IHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICpidWYpCiB7Ci0JY2hhciAqc3BhY2U7Ci0JY2hhciBidWZbMjU2XTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CiAKLQlzdHJsY3B5KGJ1Ziwgb3B0LCBzaXplb2YoYnVmKSk7Ci0Jc3BhY2UgPSBzdHJjaHIoYnVmLCAnICcpOwotCWlmIChzcGFjZSkKLQkJKnNwYWNlID0gMDsKKwlpZiAoZWFybHlfY29uc29sZV9pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisJZWFybHlfY29uc29sZV9pbml0aWFsaXplZCA9IDE7CiAKIAlpZiAoc3Ryc3RyKGJ1ZiwgImtlZXAiKSkKIAkJa2VlcF9lYXJseSA9IDE7CkBAIC0xNjgsNyArMTY2LDcgQEAKIAlpZiAoIXN0cm5jbXAoYnVmLCAic2VyaWFsIiwgNikpIHsKIAkJZWFybHlfY29uc29sZSA9ICZzY2lmX2NvbnNvbGU7CiAKLSNpZmRlZiBDT05GSUdfQ1BVX1NINAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpICYmICFkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKQogCQlzY2lmX3NlcmNvbl9pbml0KDExNTIwMCk7CiAjZW5kaWYKIAl9CkBAIC0xNzcsMTIgKzE3NSwxNCBAQAogCWlmIChsaWtlbHkoZWFybHlfY29uc29sZSkpCiAJCXJlZ2lzdGVyX2NvbnNvbGUoZWFybHlfY29uc29sZSk7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KLV9fc2V0dXAoImVhcmx5cHJpbnRrPSIsIHNldHVwX2Vhcmx5X3ByaW50ayk7CitlYXJseV9wYXJhbSgiZWFybHlwcmludGsiLCBzZXR1cF9lYXJseV9wcmludGspOwogCiB2b2lkIF9faW5pdCBkaXNhYmxlX2Vhcmx5X3ByaW50ayh2b2lkKQogeworCWlmICghZWFybHlfY29uc29sZV9pbml0aWFsaXplZCB8fCAhZWFybHlfY29uc29sZSkKKwkJcmV0dXJuOwogCWlmICgha2VlcF9lYXJseSkgewogCQlwcmludGsoImRpc2FibGluZyBlYXJseSBjb25zb2xlXG4iKTsKIAkJdW5yZWdpc3Rlcl9jb25zb2xlKGVhcmx5X2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL3NoL2tlcm5lbC9lbnRyeS1jb21tb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzI3OWFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMKQEAgLTAsMCArMSw0NDQgQEAKKy8qICRJZDogZW50cnkuUyx2IDEuMzcgMjAwNC8wNi8xMSAxMzowMjo0NiBkb3l1IEV4cCAkCisgKgorICogIGxpbnV4L2FyY2gvc2gvZW50cnkuUworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgIE5paWJlIFl1dGFrYQorICogIENvcHlyaWdodCAoQykgMjAwMyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCishIE5PVEU6CishIEdOVSBhcyAoYXMgb2YgMi45LjEpIGNoYW5nZXMgYmYvcyBpbnRvIGJ0L3MgYW5kIGJyYSwgd2hlbiB0aGUgYWRkcmVzcworISB0byBiZSBqdW1wZWQgaXMgdG9vIGZhciwgYnV0IGl0IGNhdXNlcyBpbGxlZ2FsIHNsb3QgZXhjZXB0aW9uLgorCisvKgkKKyAqIGVudHJ5LlMgY29udGFpbnMgdGhlIHN5c3RlbS1jYWxsIGFuZCBmYXVsdCBsb3ctbGV2ZWwgaGFuZGxpbmcgcm91dGluZXMuCisgKiBUaGlzIGFsc28gY29udGFpbnMgdGhlIHRpbWVyLWludGVycnVwdCBoYW5kbGVyLCBhcyB3ZWxsIGFzIGFsbCBpbnRlcnJ1cHRzCisgKiBhbmQgZmF1bHRzIHRoYXQgY2FuIHJlc3VsdCBpbiBhIHRhc2stc3dpdGNoLgorICoKKyAqIE5PVEU6IFRoaXMgY29kZSBoYW5kbGVzIHNpZ25hbC1yZWNvZ25pdGlvbiwgd2hpY2ggaGFwcGVucyBldmVyeSB0aW1lCisgKiBhZnRlciBhIHRpbWVyLWludGVycnVwdCBhbmQgYWZ0ZXIgZWFjaCBzeXN0ZW0gY2FsbC4KKyAqCisgKiBOT1RFOiBUaGlzIGNvZGUgdXNlcyBhIGNvbnZlbnRpb24gdGhhdCBpbnN0cnVjdGlvbnMgaW4gdGhlIGRlbGF5IHNsb3QKKyAqIG9mIGEgdHJhbnNmZXItY29udHJvbCBpbnN0cnVjdGlvbiBhcmUgaW5kZW50ZWQgYnkgYW4gZXh0cmEgc3BhY2UsIHRodXM6CisgKgorICogICAgam1wCUBrMAkgICAgISBjb250cm9sLXRyYW5zZmVyIGluc3RydWN0aW9uCisgKiAgICAgbGRjCWsxLCBzc3IgICAgICEgZGVsYXkgc2xvdAorICoKKyAqIFN0YWNrIGxheW91dCBpbiAncmV0X2Zyb21fc3lzY2FsbCc6CisgKiAJcHRyYWNlIG5lZWRzIHRvIGhhdmUgYWxsIHJlZ3Mgb24gdGhlIHN0YWNrLgorICoJaWYgdGhlIG9yZGVyIGhlcmUgaXMgY2hhbmdlZCwgaXQgbmVlZHMgdG8gYmUKKyAqCXVwZGF0ZWQgaW4gcHRyYWNlLmMgYW5kIHB0cmFjZS5oCisgKgorICoJcjAKKyAqICAgICAgLi4uCisgKglyMTUgPSBzdGFjayBwb2ludGVyCisgKglzcGMKKyAqCXByCisgKglzc3IKKyAqCWdicgorICoJbWFjaAorICoJbWFjbAorICoJc3lzY2FsbCAjCisgKgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQorIyAgZGVmaW5lIHByZWVtcHRfc3RvcCgpCWNsaQorI2Vsc2UKKyMgIGRlZmluZSBwcmVlbXB0X3N0b3AoKQorIyAgZGVmaW5lIHJlc3VtZV9rZXJuZWwJCV9fcmVzdG9yZV9hbGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykgfHwgZGVmaW5lZChDT05GSUdfU0hfS0dEQikKKyEgSGFuZGxlIGtlcm5lbCBkZWJ1ZyBpZiBlaXRoZXIga2dkYiAoU1cpIG9yIGdkYi1zdHViIChGVykgaXMgcHJlc2VudC4KKyEgSWYgYm90aCBhcmUgY29uZmlndXJlZCwgaGFuZGxlIHRoZSBkZWJ1ZyB0cmFwcyAoYnJlYWtwb2ludHMpIGluIFNXLAorISBidXQgc3RpbGwgYWxsb3cgQklPUyB0cmFwcyB0byBGVy4KKworCS5hbGlnbgkyCitkZWJ1Z19rZXJuZWw6CisjaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykgJiYgZGVmaW5lZChDT05GSUdfU0hfS0dEQikKKwkvKiBGb3JjZSBCSU9TIGNhbGwgdG8gRlcgKGRlYnVnX3RyYXAgcHV0IFRSQSBpbiByOCkgKi8KKwltb3YJcjgscjAKKwlzaGxyMglyMAorCWNtcC9lcQkjMHgzZixyMAorCWJ0CWRlYnVnX2tlcm5lbF9mdworI2VuZGlmIC8qIENPTkZJR19TSF9TVEFOREFSRF9CSU9TICYmIENPTkZJR19TSF9LR0RCICovCisKK2RlYnVnX2VudGVyOgkJCisjaWYgZGVmaW5lZChDT05GSUdfU0hfS0dEQikKKwkvKiBKdW1wIHRvIGtnZGIsIHBhc3Mgc3RhY2tlZCByZWdzIGFzIGFyZyAqLworZGVidWdfa2VybmVsX3N3OgorCW1vdi5sCTNmLCByMAorCWptcAlAcjAKKwkgbW92CXIxNSwgcjQKKwkuYWxpZ24JMgorMzoJLmxvbmcJa2dkYl9oYW5kbGVfZXhjZXB0aW9uCisjZW5kaWYgLyogQ09ORklHX1NIX0tHREIgKi8KKyNpZmRlZiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUworCWJyYQlkZWJ1Z19rZXJuZWxfZncKKwkgbm9wCisjZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyB8fCBDT05GSUdfU0hfS0dEQiAqLworCisJLmFsaWduCTIKK2RlYnVnX3RyYXA6CQorI2lmIGRlZmluZWQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpIHx8IGRlZmluZWQoQ09ORklHX1NIX0tHREIpCisJbW92CXI4LCByMAorCXNobHIyCXIwCisJY21wL2VxCSMweDNmLCByMAkJISBzaF9iaW9zKCkgdHJhcAorCWJmCTFmCisjaWZkZWYgQ09ORklHX1NIX0tHREIKKwljbXAvZXEJIzB4ZmYsIHIwCQkhIFhYWDogS0dEQiB0cmFwLCBmaXggZm9yIFNILTIuCisJYmYJMWYKKyNlbmRpZgorCW1vdgkjT0ZGX1NSLCByMAorCW1vdi5sCUAocjAscjE1KSwgcjAJCSEgZ2V0IHN0YXR1cyByZWdpc3RlcgorCXNobGwJcjAKKwlzaGxsCXIwCQkJISBrZXJuZWwgc3BhY2U/CisJYnQvcwlkZWJ1Z19rZXJuZWwKKzE6CisjZW5kaWYKKwkgbW92LmwJQHIxNSwgcjAJCSEgUmVzdG9yZSBSMCB2YWx1ZQorCW1vdi5sCTFmLCByOAorCWptcAlAcjgKKwkgbm9wCisKKwkuYWxpZ24JMgorRU5UUlkoZXhjZXB0aW9uX2Vycm9yKQorCSEKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwltb3YubAkzZiwgcjAKKwlqc3IJQHIwCisJIG5vcAorI2VuZGlmCisJc3RpCisJbW92LmwJMmYsIHIwCisJam1wCUByMAorCSBub3AKKworIQorCS5hbGlnbgkyCisxOgkubG9uZwlicmVha19wb2ludF90cmFwX3NvZnR3YXJlCisyOgkubG9uZwlkb19leGNlcHRpb25fZXJyb3IKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKzM6CS5sb25nCXRyYWNlX2hhcmRpcnFzX29uCisjZW5kaWYKKworCS5hbGlnbgkyCityZXRfZnJvbV9leGNlcHRpb246CisJcHJlZW1wdF9zdG9wKCkKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwltb3YubAk0ZiwgcjAKKwlqc3IJQHIwCisJIG5vcAorI2VuZGlmCitFTlRSWShyZXRfZnJvbV9pcnEpCisJIQorCW1vdgkjT0ZGX1NSLCByMAorCW1vdi5sCUAocjAscjE1KSwgcjAJISBnZXQgc3RhdHVzIHJlZ2lzdGVyCisJc2hsbAlyMAorCXNobGwJcjAJCSEga2VybmVsIHNwYWNlPworCWdldF9jdXJyZW50X3RocmVhZF9pbmZvIHI4LCByMAorCWJ0CXJlc3VtZV9rZXJuZWwJISBZZXMsIGl0J3MgZnJvbSBrZXJuZWwsIGdvIGJhY2sgc29vbgorCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlicmEJcmVzdW1lX3VzZXJzcGFjZQorCSBub3AKK0VOVFJZKHJlc3VtZV9rZXJuZWwpCisJbW92LmwJQChUSV9QUkVfQ09VTlQscjgpLCByMAkhIGN1cnJlbnRfdGhyZWFkX2luZm8tPnByZWVtcHRfY291bnQKKwl0c3QJcjAsIHIwCisJYmYJbm9yZXNjaGVkCituZWVkX3Jlc2NoZWQ6CisJbW92LmwJQChUSV9GTEFHUyxyOCksIHIwCSEgY3VycmVudF90aHJlYWRfaW5mby0+ZmxhZ3MKKwl0c3QJI19USUZfTkVFRF9SRVNDSEVELCByMAkhIG5lZWRfcmVzY2hlZCBzZXQ/CisJYnQJbm9yZXNjaGVkCisKKwltb3YJI09GRl9TUiwgcjAKKwltb3YubAlAKHIwLHIxNSksIHIwCQkhIGdldCBzdGF0dXMgcmVnaXN0ZXIKKwlhbmQJIzB4ZjAsIHIwCQkhIGludGVycnVwdHMgb2ZmIChleGNlcHRpb24gcGF0aCk/CisJY21wL2VxCSMweGYwLCByMAorCWJ0CW5vcmVzY2hlZAorCisJbW92LmwJMWYsIHIwCisJbW92LmwJcjAsIEAoVElfUFJFX0NPVU5ULHI4KQorCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJbW92LmwJM2YsIHIwCisJanNyCUByMAorCSBub3AKKyNlbmRpZgorCXN0aQorCW1vdi5sCTJmLCByMAorCWpzcglAcjAKKwkgbm9wCisJbW92CSMwLCByMAorCW1vdi5sCXIwLCBAKFRJX1BSRV9DT1VOVCxyOCkKKwljbGkKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwltb3YubAk0ZiwgcjAKKwlqc3IJQHIwCisJIG5vcAorI2VuZGlmCisKKwlicmEJbmVlZF9yZXNjaGVkCisJIG5vcAorCitub3Jlc2NoZWQ6CisJYnJhCV9fcmVzdG9yZV9hbGwKKwkgbm9wCisKKwkuYWxpZ24gMgorMToJLmxvbmcJUFJFRU1QVF9BQ1RJVkUKKzI6CS5sb25nCXNjaGVkdWxlCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiszOgkubG9uZwl0cmFjZV9oYXJkaXJxc19vbgorNDoJLmxvbmcJdHJhY2VfaGFyZGlycXNfb2ZmCisjZW5kaWYKKyNlbmRpZgorCitFTlRSWShyZXN1bWVfdXNlcnNwYWNlKQorCSEgcjg6IGN1cnJlbnRfdGhyZWFkX2luZm8KKwljbGkKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwltb3YubAk1ZiwgcjAKKwlqc3IJQHIwCisJIG5vcAorI2VuZGlmCisJbW92LmwJQChUSV9GTEFHUyxyOCksIHIwCQkhIGN1cnJlbnRfdGhyZWFkX2luZm8tPmZsYWdzCisJdHN0CSNfVElGX1dPUktfTUFTSywgcjAKKwlidC9zCV9fcmVzdG9yZV9hbGwKKwkgdHN0CSNfVElGX05FRURfUkVTQ0hFRCwgcjAKKworCS5hbGlnbgkyCit3b3JrX3BlbmRpbmc6CisJISByMDogY3VycmVudF90aHJlYWRfaW5mby0+ZmxhZ3MKKwkhIHI4OiBjdXJyZW50X3RocmVhZF9pbmZvCisJISB0OiAgcmVzdWx0IG9mICJ0c3QJI19USUZfTkVFRF9SRVNDSEVELCByMCIKKwliZi9zCXdvcmtfcmVzY2hlZAorCSB0c3QJIyhfVElGX1NJR1BFTkRJTkcgfCBfVElGX1JFU1RPUkVfU0lHTUFTSyksIHIwCit3b3JrX25vdGlmeXNpZzoKKwlidC9zCV9fcmVzdG9yZV9hbGwKKwkgbW92CXIxNSwgcjQKKwltb3YJcjEyLCByNQkJISBzZXQgYXJnMShzYXZlX3IwKQorCW1vdglyMCwgcjYKKwltb3YubAkyZiwgcjEKKwltb3YubAkzZiwgcjAKKwlqbXAJQHIxCisJIGxkcwlyMCwgcHIKK3dvcmtfcmVzY2hlZDoKKyNpZm5kZWYgQ09ORklHX1BSRUVNUFQKKwkhIGdVU0EgaGFuZGxpbmcKKwltb3YubAlAKE9GRl9TUCxyMTUpLCByMAkhIGdldCB1c2VyIHNwYWNlIHN0YWNrIHBvaW50ZXIKKwltb3YJcjAsIHIxCisJc2hsbAlyMAorCWJmL3MJMWYKKwkgc2hsbAlyMAorCWJmL3MJMWYKKwkgbW92CSNPRkZfUEMsIHIwCisJISAJCQkJICBTUCA+PSAweGMwMDAwMDAwIDogZ1VTQSBtYXJrCisJbW92LmwJQChyMCxyMTUpLCByMgkJISBnZXQgdXNlciBzcGFjZSBQQyAocHJvZ3JhbSBjb3VudGVyKQorCW1vdi5sCUAoT0ZGX1IwLHIxNSksIHIzCSEgZW5kIHBvaW50CisJY21wL2hzCXIzLCByMgkJCSEgcjIgPj0gcjM/IAorCWJ0CTFmCisJYWRkCXIzLCByMQkJCSEgcmV3aW5kIHBvaW50ICMyCisJbW92LmwJcjEsIEAocjAscjE1KQkJISByZXNldCBQQyB0byByZXdpbmQgcG9pbnQgIzIKKwkhCisxOgorI2VuZGlmCisJbW92LmwJMWYsIHIxCisJanNyCUByMQkJCQkhIHNjaGVkdWxlCisJIG5vcAorCWNsaQorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCW1vdi5sCTVmLCByMAorCWpzcglAcjAKKwkgbm9wCisjZW5kaWYKKwkhCisJbW92LmwJQChUSV9GTEFHUyxyOCksIHIwCQkhIGN1cnJlbnRfdGhyZWFkX2luZm8tPmZsYWdzCisJdHN0CSNfVElGX1dPUktfTUFTSywgcjAKKwlidAlfX3Jlc3RvcmVfYWxsCisJYnJhCXdvcmtfcGVuZGluZworCSB0c3QJI19USUZfTkVFRF9SRVNDSEVELCByMAorCisJLmFsaWduCTIKKzE6CS5sb25nCXNjaGVkdWxlCisyOgkubG9uZwlkb19ub3RpZnlfcmVzdW1lCiszOgkubG9uZwlyZXN0b3JlX2FsbAorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworNDoJLmxvbmcJdHJhY2VfaGFyZGlycXNfb24KKzU6CS5sb25nCXRyYWNlX2hhcmRpcnFzX29mZgorI2VuZGlmCisKKwkuYWxpZ24JMgorc3lzY2FsbF9leGl0X3dvcms6CisJISByMDogY3VycmVudF90aHJlYWRfaW5mby0+ZmxhZ3MKKwkhIHI4OiBjdXJyZW50X3RocmVhZF9pbmZvCisJdHN0CSNfVElGX1NZU0NBTExfVFJBQ0UsIHIwCisJYnQvcwl3b3JrX3BlbmRpbmcKKwkgdHN0CSNfVElGX05FRURfUkVTQ0hFRCwgcjAKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwltb3YubAk1ZiwgcjAKKwlqc3IJQHIwCisJIG5vcAorI2VuZGlmCisJc3RpCisJISBYWFggc2V0dXAgYXJndW1lbnRzLi4uCisJbW92LmwJNGYsIHIwCQkJISBkb19zeXNjYWxsX3RyYWNlCisJanNyCUByMAorCSBub3AKKwlicmEJcmVzdW1lX3VzZXJzcGFjZQorCSBub3AKKworCS5hbGlnbgkyCitzeXNjYWxsX3RyYWNlX2VudHJ5OgorCSEgICAgICAgICAgICAgICAgICAgICAJWWVzIGl0IGlzIHRyYWNlZC4KKwkhIFhYWCBzZXR1cCBhcmd1bWVudHMuLi4KKwltb3YubAk0ZiwgcjExCQkhIENhbGwgZG9fc3lzY2FsbF90cmFjZSB3aGljaCBub3RpZmllcworCWpzcglAcjExCSAgICAJISBzdXBlcmlvciAod2lsbCBjaG9tcCBSWzAtN10pCisJIG5vcAorCSEJCQlSZWxvYWQgUjAtUjQgZnJvbSBrZXJuZWwgc3RhY2ssIHdoZXJlIHRoZQorCSEgICAJICAgIAkgICAgCXBhcmVudCBtYXkgaGF2ZSBtb2RpZmllZCB0aGVtIHVzaW5nCisJISAgIAkgICAgCSAgICAJcHRyYWNlKFBPS0VVU1IpLiAgKE5vdGUgdGhhdCBSMC1SMiBhcmUKKwkhICAgCSAgICAJICAgIAl1c2VkIGJ5IHRoZSBzeXN0ZW0gY2FsbCBoYW5kbGVyIGRpcmVjdGx5CisJISAgIAkgICAgCSAgICAJZnJvbSB0aGUga2VybmVsIHN0YWNrIGFueXdheSwgc28gZG9uJ3QgbmVlZAorCSEgICAJICAgIAkgICAgCXRvIGJlIHJlbG9hZGVkIGhlcmUuKSAgVGhpcyBhbGxvd3MgdGhlIHBhcmVudAorCSEgICAJICAgIAkgICAgCXRvIHJld3JpdGUgc3lzdGVtIGNhbGxzIGFuZCBhcmdzIG9uIHRoZSBmbHkuCisJbW92LmwJQChPRkZfUjQscjE1KSwgcjQgICAhIGFyZzAKKwltb3YubAlAKE9GRl9SNSxyMTUpLCByNQorCW1vdi5sCUAoT0ZGX1I2LHIxNSksIHI2CisJbW92LmwJQChPRkZfUjcscjE1KSwgcjcgICAhIGFyZzMKKwltb3YubAlAKE9GRl9SMyxyMTUpLCByMyAgICEgc3lzY2FsbF9ucgorCSEKKwltb3YubAkyZiwgcjEwCQkJISBOdW1iZXIgb2Ygc3lzY2FsbHMKKwljbXAvaHMJcjEwLCByMworCWJmCXN5c2NhbGxfY2FsbAorCW1vdgkjLUVOT1NZUywgcjAKKwlicmEJc3lzY2FsbF9leGl0CisJIG1vdi5sCXIwLCBAKE9GRl9SMCxyMTUpCSEgUmV0dXJuIHZhbHVlCisKK19fcmVzdG9yZV9hbGw6CisJbW92LmwJMWYsIHIwCisJam1wCUByMAorCSBub3AKKworCS5hbGlnbgkyCisxOgkubG9uZwlyZXN0b3JlX2FsbAorCisJLmFsaWduCTIKK25vdF9zeXNjYWxsX3RyYToJCisJYnJhCWRlYnVnX3RyYXAKKwkgbm9wCisKKwkuYWxpZ24JMgorc3lzY2FsbF9iYWRzeXM6CQkJISBCYWQgc3lzY2FsbCBudW1iZXIKKwltb3YJIy1FTk9TWVMsIHIwCisJYnJhCXJlc3VtZV91c2Vyc3BhY2UKKwkgbW92LmwJcjAsIEAoT0ZGX1IwLHIxNSkJISBSZXR1cm4gdmFsdWUKKwkKKworLyoKKyAqIFN5c2NhbGwgaW50ZXJmYWNlOgorICoKKyAqCVN5c2NhbGwgIzogUjMKKyAqCUFyZ3VtZW50cyAjMCB0byAjMzogUjQtLVI3CisgKglBcmd1bWVudHMgIzQgdG8gIzY6IFIwLCBSMSwgUjIKKyAqCVRSQTogKG51bWJlciBvZiBhcmd1bWVudHMgKyAweDEwKSB4IDQKKyAqCisgKiBUaGlzIGNvZGUgYWxzbyBoYW5kbGVzIGRlbGVnYXRpbmcgb3RoZXIgdHJhcHMgdG8gdGhlIEJJT1MvZ2RiIHN0dWIKKyAqIGFjY29yZGluZyB0bzoKKyAqCisgKiBUcmFwIG51bWJlcgorICogKFRSQT4+MikgCSAgICBQdXJwb3NlCisgKiAtLS0tLS0tLSAJICAgIC0tLS0tLS0KKyAqIDB4MC0weGYgIAkgICAgb2xkIHN5c2NhbGwgQUJJCisgKiAweDEwLTB4MWYgIAkgICAgbmV3IHN5c2NhbGwgQUJJCisgKiAweDIwLTB4ZmYgIAkgICAgZGVsZWdhdGVkIHRocm91Z2ggZGVidWdfdHJhcCB0byBCSU9TL2dkYiBzdHViLgorICoKKyAqIE5vdGU6IFdoZW4gd2UncmUgZmlyc3QgY2FsbGVkLCB0aGUgVFJBIHZhbHVlIG11c3QgYmUgc2hpZnRlZAorICogcmlnaHQgMiBiaXRzIGluIG9yZGVyIHRvIGdldCB0aGUgdmFsdWUgdGhhdCB3YXMgdXNlZCBhcyB0aGUgInRyYXBhIgorICogYXJndW1lbnQuCisgKi8KKworCS5hbGlnbgkyCisJLmdsb2JsCXJldF9mcm9tX2ZvcmsKK3JldF9mcm9tX2Zvcms6CisJbW92LmwJMWYsIHI4CisJanNyCUByOAorCSBtb3YJcjAsIHI0CisJYnJhCXN5c2NhbGxfZXhpdAorCSBub3AKKwkuYWxpZ24JMgorMToJLmxvbmcJc2NoZWR1bGVfdGFpbAorCSEKK0VOVFJZKHN5c3RlbV9jYWxsKQorI2lmICFkZWZpbmVkKENPTkZJR19DUFVfU0gyKQorCW1vdi5sCTFmLCByOQorCW1vdi5sCUByOSwgcjgJCSEgUmVhZCBmcm9tIFRSQSAoVHJhcCBBZGRyZXNzKSBSZWdpc3RlcgorI2VuZGlmCisJIQorCSEgSXMgdGhlIHRyYXAgYXJndW1lbnQgPj0gMHgyMD8gKFRSQSB3aWxsIGJlID49IDB4ODApCisJbW92CSMweDdmLCByOQorCWNtcC9oaQlyOSwgcjgKKwlidC9zCW5vdF9zeXNjYWxsX3RyYQorCSBtb3YJI09GRl9UUkEsIHI5CisJYWRkCXIxNSwgcjkKKwltb3YubAlyOCwgQHI5CQkJISBzZXQgVFJBIHZhbHVlIHRvIHRyYQorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCW1vdi5sCTVmLCByMTAKKwlqc3IJQHIxMAorCSBub3AKKyNlbmRpZgorCXN0aQorCisJIQorCWdldF9jdXJyZW50X3RocmVhZF9pbmZvIHI4LCByMTAKKwltb3YubAlAKFRJX0ZMQUdTLHI4KSwgcjgKKwltb3YJI19USUZfU1lTQ0FMTF9UUkFDRSwgcjEwCisJdHN0CXIxMCwgcjgKKwliZglzeXNjYWxsX3RyYWNlX2VudHJ5CisJIQorCW1vdi5sCTJmLCByOAkJCSEgTnVtYmVyIG9mIHN5c2NhbGxzCisJY21wL2hzCXI4LCByMworCWJ0CXN5c2NhbGxfYmFkc3lzCisJIQorc3lzY2FsbF9jYWxsOgorCXNobGwyCXIzCQkhIHg0CisJbW92LmwJM2YsIHI4CQkhIExvYWQgdGhlIGFkZHJlc3Mgb2Ygc3lzX2NhbGxfdGFibGUKKwlhZGQJcjgsIHIzCisJbW92LmwJQHIzLCByOAorCWpzcglAcjgJICAgIAkhIGp1bXAgdG8gc3BlY2lmaWMgc3lzY2FsbCBoYW5kbGVyCisJIG5vcAorCW1vdi5sCUAoT0ZGX1IwLHIxNSksIHIxMgkJISBzYXZlIHIwCisJbW92LmwJcjAsIEAoT0ZGX1IwLHIxNSkJCSEgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlCisJIQorc3lzY2FsbF9leGl0OgorCWNsaQorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCW1vdi5sCTZmLCByMAorCWpzcglAcjAKKwkgbm9wCisjZW5kaWYKKwkhCisJZ2V0X2N1cnJlbnRfdGhyZWFkX2luZm8gcjgsIHIwCisJbW92LmwJQChUSV9GTEFHUyxyOCksIHIwCQkhIGN1cnJlbnRfdGhyZWFkX2luZm8tPmZsYWdzCisJdHN0CSNfVElGX0FMTFdPUktfTUFTSywgcjAKKwliZglzeXNjYWxsX2V4aXRfd29yaworCWJyYQlfX3Jlc3RvcmVfYWxsCisJIG5vcAorCS5hbGlnbgkyCisjaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TSDIpCisxOgkubG9uZwlUUkEKKyNlbmRpZgorMjoJLmxvbmcJTlJfc3lzY2FsbHMKKzM6CS5sb25nCXN5c19jYWxsX3RhYmxlCis0OgkubG9uZwlkb19zeXNjYWxsX3RyYWNlCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCis1OgkubG9uZwl0cmFjZV9oYXJkaXJxc19vbgorNjoJLmxvbmcJdHJhY2VfaGFyZGlycXNfb2ZmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2VudHJ5LlMgYi9hcmNoL3NoL2tlcm5lbC9lbnRyeS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFhZWZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gva2VybmVsL2VudHJ5LlMKKysrIC9kZXYvbnVsbApAQCAtMSw4NDMgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL3NoL2VudHJ5LlMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyICBOaWliZSBZdXRha2EKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2ICBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvc3lzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLQotISBOT1RFOgotISBHTlUgYXMgKGFzIG9mIDIuOS4xKSBjaGFuZ2VzIGJmL3MgaW50byBidC9zIGFuZCBicmEsIHdoZW4gdGhlIGFkZHJlc3MKLSEgdG8gYmUganVtcGVkIGlzIHRvbyBmYXIsIGJ1dCBpdCBjYXVzZXMgaWxsZWdhbCBzbG90IGV4Y2VwdGlvbi4KLQotLyoJCi0gKiBlbnRyeS5TIGNvbnRhaW5zIHRoZSBzeXN0ZW0tY2FsbCBhbmQgZmF1bHQgbG93LWxldmVsIGhhbmRsaW5nIHJvdXRpbmVzLgotICogVGhpcyBhbHNvIGNvbnRhaW5zIHRoZSB0aW1lci1pbnRlcnJ1cHQgaGFuZGxlciwgYXMgd2VsbCBhcyBhbGwgaW50ZXJydXB0cwotICogYW5kIGZhdWx0cyB0aGF0IGNhbiByZXN1bHQgaW4gYSB0YXNrLXN3aXRjaC4KLSAqCi0gKiBOT1RFOiBUaGlzIGNvZGUgaGFuZGxlcyBzaWduYWwtcmVjb2duaXRpb24sIHdoaWNoIGhhcHBlbnMgZXZlcnkgdGltZQotICogYWZ0ZXIgYSB0aW1lci1pbnRlcnJ1cHQgYW5kIGFmdGVyIGVhY2ggc3lzdGVtIGNhbGwuCi0gKgotICogTk9URTogVGhpcyBjb2RlIHVzZXMgYSBjb252ZW50aW9uIHRoYXQgaW5zdHJ1Y3Rpb25zIGluIHRoZSBkZWxheSBzbG90Ci0gKiBvZiBhIHRyYW5zZmVyLWNvbnRyb2wgaW5zdHJ1Y3Rpb24gYXJlIGluZGVudGVkIGJ5IGFuIGV4dHJhIHNwYWNlLCB0aHVzOgotICoKLSAqICAgIGptcAlAazAJICAgICEgY29udHJvbC10cmFuc2ZlciBpbnN0cnVjdGlvbgotICogICAgIGxkYwlrMSwgc3NyICAgICAhIGRlbGF5IHNsb3QKLSAqCi0gKiBTdGFjayBsYXlvdXQgaW4gJ3JldF9mcm9tX3N5c2NhbGwnOgotICogCXB0cmFjZSBuZWVkcyB0byBoYXZlIGFsbCByZWdzIG9uIHRoZSBzdGFjay4KLSAqCWlmIHRoZSBvcmRlciBoZXJlIGlzIGNoYW5nZWQsIGl0IG5lZWRzIHRvIGJlCi0gKgl1cGRhdGVkIGluIHB0cmFjZS5jIGFuZCBwdHJhY2UuaAotICoKLSAqCXIwCi0gKiAgICAgIC4uLgotICoJcjE1ID0gc3RhY2sgcG9pbnRlcgotICoJc3BjCi0gKglwcgotICoJc3NyCi0gKglnYnIKLSAqCW1hY2gKLSAqCW1hY2wKLSAqCXN5c2NhbGwgIwotICoKLSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0tHREJfTk1JKQotTk1JX1ZFQyA9IDB4MWMwCQkJISBNdXN0IGNhdGNoIGVhcmx5IGZvciBkZWJvdW5jZQotI2VuZGlmCi0KLS8qIE9mZnNldHMgdG8gdGhlIHN0YWNrICovCi1PRkZfUjAgID0gIDAJCS8qIFJldHVybiB2YWx1ZS4gTmV3IEFCSSBhbHNvIGFyZzQgKi8KLU9GRl9SMSAgPSAgNCAgICAgCS8qIE5ldyBBQkk6IGFyZzUgKi8KLU9GRl9SMiAgPSAgOCAgICAgCS8qIE5ldyBBQkk6IGFyZzYgKi8KLU9GRl9SMyAgPSAgMTIgICAgIAkvKiBOZXcgQUJJOiBzeXNjYWxsX25yICovCi1PRkZfUjQgID0gIDE2ICAgICAJLyogTmV3IEFCSTogYXJnMCAqLwotT0ZGX1I1ICA9ICAyMCAgICAgCS8qIE5ldyBBQkk6IGFyZzEgKi8KLU9GRl9SNiAgPSAgMjQgICAgIAkvKiBOZXcgQUJJOiBhcmcyICovCi1PRkZfUjcgID0gIDI4ICAgICAJLyogTmV3IEFCSTogYXJnMyAqLwotT0ZGX1NQCT0gICgxNSo0KQotT0ZGX1BDICA9ICAoMTYqNCkKLU9GRl9TUgk9ICAoMTYqNCs4KQotT0ZGX1RSQQk9ICAoMTYqNCs2KjQpCi0KLQotI2RlZmluZSBrMAlyMAotI2RlZmluZSBrMQlyMQotI2RlZmluZSBrMglyMgotI2RlZmluZSBrMwlyMwotI2RlZmluZSBrNAlyNAotCi0jZGVmaW5lIGdfaW1hc2sJCXI2CS8qIHI2X2JhbmsxICovCi0jZGVmaW5lIGtfZ19pbWFzawlyNl9iYW5rCS8qIHI2X2JhbmsxICovCi0jZGVmaW5lIGN1cnJlbnQJCXI3CS8qIHI3X2JhbmsxICovCi0KLS8qCi0gKiBLZXJuZWwgbW9kZSByZWdpc3RlciB1c2FnZToKLSAqCWswCXNjcmF0Y2gKLSAqCWsxCXNjcmF0Y2gKLSAqCWsyCXNjcmF0Y2ggKEV4Y2VwdGlvbiBjb2RlKQotICoJazMJc2NyYXRjaCAoUmV0dXJuIGFkZHJlc3MpCi0gKglrNAlzY3JhdGNoCi0gKglrNQlyZXNlcnZlZAotICoJazYJR2xvYmFsIEludGVycnVwdCBNYXNrICgwLS0xNSA8PCA0KQotICoJazcJQ1VSUkVOVF9USFJFQURfSU5GTyAocG9pbnRlciB0byBjdXJyZW50IHRocmVhZCBpbmZvKQotICovCi0KLSEKLSEgVExCIE1pc3MgLyBJbml0aWFsIFBhZ2Ugd3JpdGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0hCQkJX2FuZF8KLSEgVExCIGhpdHMsIGJ1dCB0aGUgYWNjZXNzIHZpb2xhdGUgdGhlIHByb3RlY3Rpb24uCi0hIEl0IGNhbiBiZSB2YWxpZCBhY2Nlc3MsIHN1Y2ggYXMgc3RhY2sgZ3JvdyBhbmQvb3IgQy1PLVcuCi0hCi0hCi0hIEZpbmQgdGhlIHBtZC9wdGUgZW50cnkgYW5kIGxvYWR0bGIKLSEgSWYgaXQncyBub3QgZm91bmQsIGNhdXNlIGFkZHJlc3MgZXJyb3IgKFNFR1YpCi0hCi0hIEFsdGhvdWdoIHRoaXMgY291bGQgYmUgd3JpdHRlbiBpbiBhc3NlbWJseSBsYW5ndWFnZSAoYW5kIGl0J2QgYmUgZmFzdGVyKSwKLSEgdGhpcyBmaXJzdCB2ZXJzaW9uIGRlcGVuZHMgKm11Y2gqIG9uIEMgaW1wbGVtZW50YXRpb24uCi0hCi0KLSNkZWZpbmUgQ0xJKCkJCQkJXAotCXN0YwlzciwgcjA7CQkJXAotCW9yCSMweGYwLCByMDsJCVwKLQlsZGMJcjAsIHNyCi0KLSNkZWZpbmUgU1RJKCkJCQkJXAotCW1vdi5sCV9fSU5WX0lNQVNLLCByMTE7CVwKLQlzdGMJc3IsIHIxMDsJCVwKLQlhbmQJcjExLCByMTA7CQlcCi0Jc3RjCWtfZ19pbWFzaywgcjExOwkJXAotCW9yCXIxMSwgcjEwOwkJXAotCWxkYwlyMTAsIHNyCi0KLSNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotIyAgZGVmaW5lIHByZWVtcHRfc3RvcCgpCUNMSSgpCi0jZWxzZQotIyAgZGVmaW5lIHByZWVtcHRfc3RvcCgpCi0jICBkZWZpbmUgcmVzdW1lX2tlcm5lbAkJcmVzdG9yZV9hbGwKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfTU1VKQotCS5hbGlnbgkyCi1FTlRSWSh0bGJfbWlzc19sb2FkKQotCWJyYQljYWxsX2RwZgotCSBtb3YJIzAsIHI1Ci0KLQkuYWxpZ24JMgotRU5UUlkodGxiX21pc3Nfc3RvcmUpCi0JYnJhCWNhbGxfZHBmCi0JIG1vdgkjMSwgcjUKLQotCS5hbGlnbgkyCi1FTlRSWShpbml0aWFsX3BhZ2Vfd3JpdGUpCi0JYnJhCWNhbGxfZHBmCi0JIG1vdgkjMSwgcjUKLQotCS5hbGlnbgkyCi1FTlRSWSh0bGJfcHJvdGVjdGlvbl92aW9sYXRpb25fbG9hZCkKLQlicmEJY2FsbF9kcGYKLQkgbW92CSMwLCByNQotCi0JLmFsaWduCTIKLUVOVFJZKHRsYl9wcm90ZWN0aW9uX3Zpb2xhdGlvbl9zdG9yZSkKLQlicmEJY2FsbF9kcGYKLQkgbW92CSMxLCByNQotCi1jYWxsX2RwZjoKLQltb3YubAkxZiwgcjAKLQltb3YJcjUsIHI4Ci0JbW92LmwJQHIwLCByNgotCW1vdglyNiwgcjkKLQltb3YubAkyZiwgcjAKLQlzdHMJcHIsIHIxMAotCWpzcglAcjAKLQkgbW92CXIxNSwgcjQKLQkhCi0JdHN0CXIwLCByMAotCWJmL3MJMGYKLQkgbGRzCXIxMCwgcHIKLQlydHMKLQkgbm9wCi0wOglTVEkoKQotCW1vdi5sCTNmLCByMAotCW1vdglyOSwgcjYKLQltb3YJcjgsIHI1Ci0Jam1wCUByMAotCSBtb3YJcjE1LCByNAotCi0JLmFsaWduIDIKLTE6CS5sb25nCU1NVV9URUEKLTI6CS5sb25nCV9fZG9fcGFnZV9mYXVsdAotMzoJLmxvbmcJZG9fcGFnZV9mYXVsdAotCi0JLmFsaWduCTIKLUVOVFJZKGFkZHJlc3NfZXJyb3JfbG9hZCkKLQlicmEJY2FsbF9kYWUKLQkgbW92CSMwLHI1CQkhIHdyaXRlYWNjZXNzID0gMAotCi0JLmFsaWduCTIKLUVOVFJZKGFkZHJlc3NfZXJyb3Jfc3RvcmUpCi0JYnJhCWNhbGxfZGFlCi0JIG1vdgkjMSxyNQkJISB3cml0ZWFjY2VzcyA9IDEKLQotCS5hbGlnbgkyCi1jYWxsX2RhZToKLQltb3YubAkxZiwgcjAKLQltb3YubAlAcjAsIHI2CQkhIGFkZHJlc3MKLQltb3YubAkyZiwgcjAKLQlqbXAJQHIwCi0JIG1vdglyMTUsIHI0CQkhIHJlZ3MKLQotCS5hbGlnbiAyCi0xOgkubG9uZwlNTVVfVEVBCi0yOgkubG9uZyAgIGRvX2FkZHJlc3NfZXJyb3IKLSNlbmRpZiAvKiBDT05GSUdfTU1VICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKSB8fCBkZWZpbmVkKENPTkZJR19TSF9LR0RCKQotISBIYW5kbGUga2VybmVsIGRlYnVnIGlmIGVpdGhlciBrZ2RiIChTVykgb3IgZ2RiLXN0dWIgKEZXKSBpcyBwcmVzZW50LgotISBJZiBib3RoIGFyZSBjb25maWd1cmVkLCBoYW5kbGUgdGhlIGRlYnVnIHRyYXBzIChicmVha3BvaW50cykgaW4gU1csCi0hIGJ1dCBzdGlsbCBhbGxvdyBCSU9TIHRyYXBzIHRvIEZXLgotCi0JLmFsaWduCTIKLWRlYnVnX2tlcm5lbDoKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKSAmJiBkZWZpbmVkKENPTkZJR19TSF9LR0RCKQotCS8qIEZvcmNlIEJJT1MgY2FsbCB0byBGVyAoZGVidWdfdHJhcCBwdXQgVFJBIGluIHI4KSAqLwotCW1vdglyOCxyMAotCXNobHIyCXIwCi0JY21wL2VxCSMweDNmLHIwCi0JYnQJZGVidWdfa2VybmVsX2Z3Ci0jZW5kaWYgLyogQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgJiYgQ09ORklHX1NIX0tHREIgKi8KLQotZGVidWdfZW50ZXI6CQkKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9LR0RCKQotCS8qIEp1bXAgdG8ga2dkYiwgcGFzcyBzdGFja2VkIHJlZ3MgYXMgYXJnICovCi1kZWJ1Z19rZXJuZWxfc3c6Ci0JbW92LmwJM2YsIHIwCi0Jam1wCUByMAotCSBtb3YJcjE1LCByNAotCS5hbGlnbgkyCi0zOgkubG9uZwlrZ2RiX2hhbmRsZV9leGNlcHRpb24KLSNlbmRpZiAvKiBDT05GSUdfU0hfS0dEQiAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKLQkvKiBVbndpbmQgdGhlIHN0YWNrIGFuZCBqbXAgdG8gdGhlIGRlYnVnIGVudHJ5ICovCi1kZWJ1Z19rZXJuZWxfZnc6Ci0JbW92LmwJQHIxNSssIHIwCi0JbW92LmwJQHIxNSssIHIxCi0JbW92LmwJQHIxNSssIHIyCi0JbW92LmwJQHIxNSssIHIzCi0JbW92LmwJQHIxNSssIHI0Ci0JbW92LmwJQHIxNSssIHI1Ci0JbW92LmwJQHIxNSssIHI2Ci0JbW92LmwJQHIxNSssIHI3Ci0Jc3RjCXNyLCByOAotCW1vdi5sCTFmLCByOQkJCSEgQkwgPTEsIFJCPTEsIElNQVNLPTB4MEYKLQlvcglyOSwgcjgKLQlsZGMJcjgsIHNyCQkJISBoZXJlLCBjaGFuZ2UgdGhlIHJlZ2lzdGVyIGJhbmsKLQltb3YubAlAcjE1KywgcjgKLQltb3YubAlAcjE1KywgcjkKLQltb3YubAlAcjE1KywgcjEwCi0JbW92LmwJQHIxNSssIHIxMQotCW1vdi5sCUByMTUrLCByMTIKLQltb3YubAlAcjE1KywgcjEzCi0JbW92LmwJQHIxNSssIHIxNAotCW1vdi5sCUByMTUrLCBrMAotCWxkYy5sCUByMTUrLCBzcGMKLQlsZHMubAlAcjE1KywgcHIKLQltb3YubAlAcjE1KywgazEKLQlsZGMubAlAcjE1KywgZ2JyCi0JbGRzLmwJQHIxNSssIG1hY2gKLQlsZHMubAlAcjE1KywgbWFjbAotCW1vdglrMCwgcjE1Ci0JIQotCW1vdi5sCTJmLCBrMAotCW1vdi5sCUBrMCwgazAKLQlqbXAJQGswCi0JIGxkYwlrMSwgc3NyCi0JLmFsaWduCTIKLTE6CS5sb25nCTB4MzAwMDAwZjAKLTI6CS5sb25nCWdkYl92YnJfdmVjdG9yCi0jZW5kaWYgLyogQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgKi8KLQotI2VuZGlmIC8qIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIHx8IENPTkZJR19TSF9LR0RCICovCi0KLQotCS5hbGlnbgkyCi1kZWJ1Z190cmFwOgkKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKSB8fCBkZWZpbmVkKENPTkZJR19TSF9LR0RCKQotCW1vdgkjT0ZGX1NSLCByMAotCW1vdi5sCUAocjAscjE1KSwgcjAJCSEgZ2V0IHN0YXR1cyByZWdpc3RlcgotCXNobGwJcjAKLQlzaGxsCXIwCQkJISBrZXJuZWwgc3BhY2U/Ci0JYnQvcwlkZWJ1Z19rZXJuZWwKLSNlbmRpZgotCSBtb3YubAlAcjE1LCByMAkJISBSZXN0b3JlIFIwIHZhbHVlCi0JbW92LmwJMWYsIHI4Ci0Jam1wCUByOAotCSBub3AKLQotCS5hbGlnbgkyCi1FTlRSWShleGNlcHRpb25fZXJyb3IpCi0JIQotCVNUSSgpCi0JbW92LmwJMmYsIHIwCi0Jam1wCUByMAotCSBub3AKLQotIQotCS5hbGlnbgkyCi0xOgkubG9uZwlicmVha19wb2ludF90cmFwX3NvZnR3YXJlCi0yOgkubG9uZwlkb19leGNlcHRpb25fZXJyb3IKLQotCS5hbGlnbgkyCi1yZXRfZnJvbV9leGNlcHRpb246Ci0JcHJlZW1wdF9zdG9wKCkKLUVOVFJZKHJldF9mcm9tX2lycSkKLQkhCi0JbW92CSNPRkZfU1IsIHIwCi0JbW92LmwJQChyMCxyMTUpLCByMAkhIGdldCBzdGF0dXMgcmVnaXN0ZXIKLQlzaGxsCXIwCi0Jc2hsbAlyMAkJISBrZXJuZWwgc3BhY2U/Ci0JYnQvcwlyZXN1bWVfa2VybmVsCSEgWWVzLCBpdCdzIGZyb20ga2VybmVsLCBnbyBiYWNrIHNvb24KLQkgR0VUX1RIUkVBRF9JTkZPKHI4KQotCi0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQlicmEJcmVzdW1lX3VzZXJzcGFjZQotCSBub3AKLUVOVFJZKHJlc3VtZV9rZXJuZWwpCi0JbW92LmwJQChUSV9QUkVfQ09VTlQscjgpLCByMAkhIGN1cnJlbnRfdGhyZWFkX2luZm8tPnByZWVtcHRfY291bnQKLQl0c3QJcjAsIHIwCi0JYmYJbm9yZXNjaGVkCi1uZWVkX3Jlc2NoZWQ6Ci0JbW92LmwJQChUSV9GTEFHUyxyOCksIHIwCSEgY3VycmVudF90aHJlYWRfaW5mby0+ZmxhZ3MKLQl0c3QJI19USUZfTkVFRF9SRVNDSEVELCByMAkhIG5lZWRfcmVzY2hlZCBzZXQ/Ci0JYnQJbm9yZXNjaGVkCi0KLQltb3YJI09GRl9TUiwgcjAKLQltb3YubAlAKHIwLHIxNSksIHIwCQkhIGdldCBzdGF0dXMgcmVnaXN0ZXIKLQlhbmQJIzB4ZjAsIHIwCQkhIGludGVycnVwdHMgb2ZmIChleGNlcHRpb24gcGF0aCk/Ci0JY21wL2VxCSMweGYwLCByMAotCWJ0CW5vcmVzY2hlZAotCi0JbW92LmwJMWYsIHIwCi0JbW92LmwJcjAsIEAoVElfUFJFX0NPVU5ULHI4KQotCi0JU1RJKCkKLQltb3YubAkyZiwgcjAKLQlqc3IJQHIwCi0JIG5vcAotCW1vdgkjMCwgcjAKLQltb3YubAlyMCwgQChUSV9QUkVfQ09VTlQscjgpCi0JQ0xJKCkKLQotCWJyYQluZWVkX3Jlc2NoZWQKLQkgbm9wCi1ub3Jlc2NoZWQ6Ci0JYnJhCXJlc3RvcmVfYWxsCi0JIG5vcAotCi0JLmFsaWduIDIKLTE6CS5sb25nCVBSRUVNUFRfQUNUSVZFCi0yOgkubG9uZwlzY2hlZHVsZQotI2VuZGlmCi0KLUVOVFJZKHJlc3VtZV91c2Vyc3BhY2UpCi0JISByODogY3VycmVudF90aHJlYWRfaW5mbwotCUNMSSgpCi0JbW92LmwJQChUSV9GTEFHUyxyOCksIHIwCQkhIGN1cnJlbnRfdGhyZWFkX2luZm8tPmZsYWdzCi0JdHN0CSNfVElGX1dPUktfTUFTSywgcjAKLQlidC9zCXJlc3RvcmVfYWxsCi0JIHRzdAkjX1RJRl9ORUVEX1JFU0NIRUQsIHIwCi0KLQkuYWxpZ24JMgotd29ya19wZW5kaW5nOgotCSEgcjA6IGN1cnJlbnRfdGhyZWFkX2luZm8tPmZsYWdzCi0JISByODogY3VycmVudF90aHJlYWRfaW5mbwotCSEgdDogIHJlc3VsdCBvZiAidHN0CSNfVElGX05FRURfUkVTQ0hFRCwgcjAiCi0JYmYvcwl3b3JrX3Jlc2NoZWQKLQkgdHN0CSMoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9SRVNUT1JFX1NJR01BU0spLCByMAotd29ya19ub3RpZnlzaWc6Ci0JYnQvcwlyZXN0b3JlX2FsbAotCSBtb3YJcjE1LCByNAotCW1vdglyMTIsIHI1CQkhIHNldCBhcmcxKHNhdmVfcjApCi0JbW92CXIwLCByNgotCW1vdi5sCTJmLCByMQotCW1vdmEJcmVzdG9yZV9hbGwsIHIwCi0Jam1wCUByMQotCSBsZHMJcjAsIHByCi13b3JrX3Jlc2NoZWQ6Ci0jaWZuZGVmIENPTkZJR19QUkVFTVBUCi0JISBnVVNBIGhhbmRsaW5nCi0JbW92LmwJQChPRkZfU1AscjE1KSwgcjAJISBnZXQgdXNlciBzcGFjZSBzdGFjayBwb2ludGVyCi0JbW92CXIwLCByMQotCXNobGwJcjAKLQliZi9zCTFmCi0JIHNobGwJcjAKLQliZi9zCTFmCi0JIG1vdgkjT0ZGX1BDLCByMAotCSEgCQkJCSAgU1AgPj0gMHhjMDAwMDAwMCA6IGdVU0EgbWFyawotCW1vdi5sCUAocjAscjE1KSwgcjIJCSEgZ2V0IHVzZXIgc3BhY2UgUEMgKHByb2dyYW0gY291bnRlcikKLQltb3YubAlAKE9GRl9SMCxyMTUpLCByMwkhIGVuZCBwb2ludAotCWNtcC9ocwlyMywgcjIJCQkhIHIyID49IHIzPyAKLQlidAkxZgotCWFkZAlyMywgcjEJCQkhIHJld2luZCBwb2ludCAjMgotCW1vdi5sCXIxLCBAKHIwLHIxNSkJCSEgcmVzZXQgUEMgdG8gcmV3aW5kIHBvaW50ICMyCi0JIQotMToKLSNlbmRpZgotCW1vdi5sCTFmLCByMQotCWpzcglAcjEJCQkJISBzY2hlZHVsZQotCSBub3AKLQlDTEkoKQotCSEKLQltb3YubAlAKFRJX0ZMQUdTLHI4KSwgcjAJCSEgY3VycmVudF90aHJlYWRfaW5mby0+ZmxhZ3MKLQl0c3QJI19USUZfV09SS19NQVNLLCByMAotCWJ0CXJlc3RvcmVfYWxsCi0JYnJhCXdvcmtfcGVuZGluZwotCSB0c3QJI19USUZfTkVFRF9SRVNDSEVELCByMAotCi0JLmFsaWduCTIKLTE6CS5sb25nCXNjaGVkdWxlCi0yOgkubG9uZwlkb19ub3RpZnlfcmVzdW1lCi0KLQkuYWxpZ24JMgotc3lzY2FsbF9leGl0X3dvcms6Ci0JISByMDogY3VycmVudF90aHJlYWRfaW5mby0+ZmxhZ3MKLQkhIHI4OiBjdXJyZW50X3RocmVhZF9pbmZvCi0JdHN0CSNfVElGX1NZU0NBTExfVFJBQ0UsIHIwCi0JYnQvcwl3b3JrX3BlbmRpbmcKLQkgdHN0CSNfVElGX05FRURfUkVTQ0hFRCwgcjAKLQlTVEkoKQotCSEgWFhYIHNldHVwIGFyZ3VtZW50cy4uLgotCW1vdi5sCTRmLCByMAkJCSEgZG9fc3lzY2FsbF90cmFjZQotCWpzcglAcjAKLQkgbm9wCi0JYnJhCXJlc3VtZV91c2Vyc3BhY2UKLQkgbm9wCi0KLQkuYWxpZ24JMgotc3lzY2FsbF90cmFjZV9lbnRyeToKLQkhICAgICAgICAgICAgICAgICAgICAgCVllcyBpdCBpcyB0cmFjZWQuCi0JISBYWFggc2V0dXAgYXJndW1lbnRzLi4uCi0JbW92LmwJNGYsIHIxMQkJISBDYWxsIGRvX3N5c2NhbGxfdHJhY2Ugd2hpY2ggbm90aWZpZXMKLQlqc3IJQHIxMQkgICAgCSEgc3VwZXJpb3IgKHdpbGwgY2hvbXAgUlswLTddKQotCSBub3AKLQkhCQkJUmVsb2FkIFIwLVI0IGZyb20ga2VybmVsIHN0YWNrLCB3aGVyZSB0aGUKLQkhICAgCSAgICAJICAgIAlwYXJlbnQgbWF5IGhhdmUgbW9kaWZpZWQgdGhlbSB1c2luZwotCSEgICAJICAgIAkgICAgCXB0cmFjZShQT0tFVVNSKS4gIChOb3RlIHRoYXQgUjAtUjIgYXJlCi0JISAgIAkgICAgCSAgICAJdXNlZCBieSB0aGUgc3lzdGVtIGNhbGwgaGFuZGxlciBkaXJlY3RseQotCSEgICAJICAgIAkgICAgCWZyb20gdGhlIGtlcm5lbCBzdGFjayBhbnl3YXksIHNvIGRvbid0IG5lZWQKLQkhICAgCSAgICAJICAgIAl0byBiZSByZWxvYWRlZCBoZXJlLikgIFRoaXMgYWxsb3dzIHRoZSBwYXJlbnQKLQkhICAgCSAgICAJICAgIAl0byByZXdyaXRlIHN5c3RlbSBjYWxscyBhbmQgYXJncyBvbiB0aGUgZmx5LgotCW1vdi5sCUAoT0ZGX1I0LHIxNSksIHI0ICAgISBhcmcwCi0JbW92LmwJQChPRkZfUjUscjE1KSwgcjUKLQltb3YubAlAKE9GRl9SNixyMTUpLCByNgotCW1vdi5sCUAoT0ZGX1I3LHIxNSksIHI3ICAgISBhcmczCi0JbW92LmwJQChPRkZfUjMscjE1KSwgcjMgICAhIHN5c2NhbGxfbnIKLQkhICAgCSAgICAJICAgIEFycmFuZ2UgZm9yIGRvX3N5c2NhbGxfdHJhY2UgdG8gYmUgY2FsbGVkCi0JISAgIAkgICAgCSAgICBhZ2FpbiBhcyB0aGUgc3lzdGVtIGNhbGwgcmV0dXJucy4KLQltb3YubAkyZiwgcjEwCQkJISBOdW1iZXIgb2Ygc3lzY2FsbHMKLQljbXAvaHMJcjEwLCByMwotCWJmCXN5c2NhbGxfY2FsbAotCW1vdgkjLUVOT1NZUywgcjAKLQlicmEJc3lzY2FsbF9leGl0Ci0JIG1vdi5sCXIwLCBAKE9GRl9SMCxyMTUpCSEgUmV0dXJuIHZhbHVlCi0KLS8qCi0gKiBTeXNjYWxsIGludGVyZmFjZToKLSAqCi0gKglTeXNjYWxsICM6IFIzCi0gKglBcmd1bWVudHMgIzAgdG8gIzM6IFI0LS1SNwotICoJQXJndW1lbnRzICM0IHRvICM2OiBSMCwgUjEsIFIyCi0gKglUUkE6IChudW1iZXIgb2YgYXJndW1lbnRzICsgMHgxMCkgeCA0Ci0gKgotICogVGhpcyBjb2RlIGFsc28gaGFuZGxlcyBkZWxlZ2F0aW5nIG90aGVyIHRyYXBzIHRvIHRoZSBCSU9TL2dkYiBzdHViCi0gKiBhY2NvcmRpbmcgdG86Ci0gKgotICogVHJhcCBudW1iZXIKLSAqIChUUkE+PjIpIAkgICAgUHVycG9zZQotICogLS0tLS0tLS0gCSAgICAtLS0tLS0tCi0gKiAweDAtMHhmICAJICAgIG9sZCBzeXNjYWxsIEFCSQotICogMHgxMC0weDFmICAJICAgIG5ldyBzeXNjYWxsIEFCSQotICogMHgyMC0weGZmICAJICAgIGRlbGVnYXRlZCB0aHJvdWdoIGRlYnVnX3RyYXAgdG8gQklPUy9nZGIgc3R1Yi4KLSAqCi0gKiBOb3RlOiBXaGVuIHdlJ3JlIGZpcnN0IGNhbGxlZCwgdGhlIFRSQSB2YWx1ZSBtdXN0IGJlIHNoaWZ0ZWQKLSAqIHJpZ2h0IDIgYml0cyBpbiBvcmRlciB0byBnZXQgdGhlIHZhbHVlIHRoYXQgd2FzIHVzZWQgYXMgdGhlICJ0cmFwYSIKLSAqIGFyZ3VtZW50LgotICovCi0KLQkuYWxpZ24JMgotCS5nbG9ibAlyZXRfZnJvbV9mb3JrCi1yZXRfZnJvbV9mb3JrOgotCW1vdi5sCTFmLCByOAotCWpzcglAcjgKLQkgbW92CXIwLCByNAotCWJyYQlzeXNjYWxsX2V4aXQKLQkgbm9wCi0JLmFsaWduCTIKLTE6CS5sb25nCXNjaGVkdWxlX3RhaWwKLQkhCi1FTlRSWShzeXN0ZW1fY2FsbCkKLQltb3YubAkxZiwgcjkKLQltb3YubAlAcjksIHI4CQkhIFJlYWQgZnJvbSBUUkEgKFRyYXAgQWRkcmVzcykgUmVnaXN0ZXIKLQkhCi0JISBJcyB0aGUgdHJhcCBhcmd1bWVudCA+PSAweDIwPyAoVFJBIHdpbGwgYmUgPj0gMHg4MCkKLQltb3YJIzB4N2YsIHI5Ci0JY21wL2hpCXI5LCByOAotCWJ0L3MJMGYKLQkgbW92CSNPRkZfVFJBLCByOQotCWFkZAlyMTUsIHI5Ci0JIQotCW1vdi5sCXI4LCBAcjkJCQkhIHNldCBUUkEgdmFsdWUgdG8gdHJhCi0JU1RJKCkKLQkhICAgCSAgICAJICAgIENhbGwgdGhlIHN5c3RlbSBjYWxsIGhhbmRsZXIgdGhyb3VnaCB0aGUgdGFibGUuCi0JISAgIAkgICAgCSAgICBGaXJzdCBjaGVjayBmb3IgYmFkIHN5c2NhbGwgbnVtYmVyCi0JbW92CXIzLCByOQotCW1vdi5sCTJmLCByOAkJCSEgTnVtYmVyIG9mIHN5c2NhbGxzCi0JY21wL2hzCXI4LCByOQotCWJmL3MJZ29vZF9zeXN0ZW1fY2FsbAotCSBHRVRfVEhSRUFEX0lORk8ocjgpCi1zeXNjYWxsX2JhZHN5czoJCQkhIEJhZCBzeXNjYWxsIG51bWJlcgotCW1vdgkjLUVOT1NZUywgcjAKLQlicmEJcmVzdW1lX3VzZXJzcGFjZQotCSBtb3YubAlyMCwgQChPRkZfUjAscjE1KQkhIFJldHVybiB2YWx1ZQotCSEKLTA6Ci0JYnJhCWRlYnVnX3RyYXAKLQkgbm9wCi0JIQotZ29vZF9zeXN0ZW1fY2FsbDoJCSEgR29vZCBzeXNjYWxsIG51bWJlcgotCW1vdi5sCUAoVElfRkxBR1MscjgpLCByOAotCW1vdgkjX1RJRl9TWVNDQUxMX1RSQUNFLCByMTAKLQl0c3QJcjEwLCByOAotCWJmCXN5c2NhbGxfdHJhY2VfZW50cnkKLQkhCi1zeXNjYWxsX2NhbGw6Ci0Jc2hsbDIJcjkJCSEgeDQKLQltb3YubAkzZiwgcjgJCSEgTG9hZCB0aGUgYWRkcmVzcyBvZiBzeXNfY2FsbF90YWJsZQotCWFkZAlyOCwgcjkKLQltb3YubAlAcjksIHI4Ci0JanNyCUByOAkgICAgCSEganVtcCB0byBzcGVjaWZpYyBzeXNjYWxsIGhhbmRsZXIKLQkgbm9wCi0JbW92LmwJQChPRkZfUjAscjE1KSwgcjEyCQkhIHNhdmUgcjAKLQltb3YubAlyMCwgQChPRkZfUjAscjE1KQkJISBzYXZlIHRoZSByZXR1cm4gdmFsdWUKLQkhCi1zeXNjYWxsX2V4aXQ6Ci0JQ0xJKCkKLQkhCi0JR0VUX1RIUkVBRF9JTkZPKHI4KQotCW1vdi5sCUAoVElfRkxBR1MscjgpLCByMAkJISBjdXJyZW50X3RocmVhZF9pbmZvLT5mbGFncwotCXRzdAkjX1RJRl9BTExXT1JLX01BU0ssIHIwCi0JYmYJc3lzY2FsbF9leGl0X3dvcmsKLXJlc3RvcmVfYWxsOgotCW1vdi5sCUByMTUrLCByMAotCW1vdi5sCUByMTUrLCByMQotCW1vdi5sCUByMTUrLCByMgotCW1vdi5sCUByMTUrLCByMwotCW1vdi5sCUByMTUrLCByNAotCW1vdi5sCUByMTUrLCByNQotCW1vdi5sCUByMTUrLCByNgotCW1vdi5sCUByMTUrLCByNwotCSEKLQlzdGMJc3IsIHI4Ci0JbW92LmwJN2YsIHI5Ci0Jb3IJcjksIHI4CQkJISBCTCA9MSwgUkI9MQotCWxkYwlyOCwgc3IJCQkhIGhlcmUsIGNoYW5nZSB0aGUgcmVnaXN0ZXIgYmFuawotCSEKLQltb3YubAlAcjE1KywgcjgKLQltb3YubAlAcjE1KywgcjkKLQltb3YubAlAcjE1KywgcjEwCi0JbW92LmwJQHIxNSssIHIxMQotCW1vdi5sCUByMTUrLCByMTIKLQltb3YubAlAcjE1KywgcjEzCi0JbW92LmwJQHIxNSssIHIxNAotCW1vdi5sCUByMTUrLCBrNAkJISBvcmlnaW5hbCBzdGFjayBwb2ludGVyCi0JbGRjLmwJQHIxNSssIHNwYwotCWxkcy5sCUByMTUrLCBwcgotCW1vdi5sCUByMTUrLCBrMwkJISBvcmlnaW5hbCBTUgotCWxkYy5sCUByMTUrLCBnYnIKLQlsZHMubAlAcjE1KywgbWFjaAotCWxkcy5sCUByMTUrLCBtYWNsCi0JYWRkCSM0LCByMTUJCQkhIFNraXAgc3lzY2FsbCBudW1iZXIKLQkhCi0jaWZkZWYgQ09ORklHX1NIX0RTUAotCW1vdi5sCUByMTUrLCBrMAkJISBEU1AgbW9kZSBtYXJrZXIKLQltb3YubAk1ZiwgazEKLQljbXAvZXEJazAsIGsxCQkJISBEbyB3ZSBoYXZlIGEgRFNQIHN0YWNrIGZyYW1lPwotCWJmCXNraXBfcmVzdG9yZQotCi0Jc3RjCXNyLCBrMAkJCSEgRW5hYmxlIENQVSBEU1AgbW9kZQotCW9yCWsxLCBrMAkJCSEgKHdpdGhpbiBrZXJuZWwgaXQgbWF5IGJlIGRpc2FibGVkKQotCWxkYwlrMCwgc3IKLQltb3YJcjIsIGswCQkJISBCYWNrdXAgcjIKLQotCSEgUmVzdG9yZSBEU1AgcmVnaXN0ZXJzIGZyb20gc3RhY2sKLQltb3YJcjE1LCByMgotCW1vdnMubAlAcjIrLCBhMQotCW1vdnMubAlAcjIrLCBhMGcKLQltb3ZzLmwJQHIyKywgYTFnCi0JbW92cy5sCUByMissIG0wCi0JbW92cy5sCUByMissIG0xCi0JbW92CXIyLCByMTUKLQotCWxkcy5sCUByMTUrLCBhMAotCWxkcy5sCUByMTUrLCB4MAotCWxkcy5sCUByMTUrLCB4MQotCWxkcy5sCUByMTUrLCB5MAotCWxkcy5sCUByMTUrLCB5MQotCWxkcy5sCUByMTUrLCBkc3IKLQlsZGMubAlAcjE1KywgcnMKLQlsZGMubAlAcjE1KywgcmUKLQlsZGMubAlAcjE1KywgbW9kCi0KLQltb3YJazAsIHIyCQkJISBSZXN0b3JlIHIyCi1za2lwX3Jlc3RvcmU6Ci0jZW5kaWYKLQkhCi0JISBDYWxjdWxhdGUgbmV3IFNSIHZhbHVlCi0JbW92CWszLCBrMgkJCSEgb3JpZ2luYWwgU1IgdmFsdWUKLQltb3YubAk5ZiwgazEKLQlhbmQJazEsIGsyCQkJISBNYXNrIG9yaWduYWwgU1IgdmFsdWUKLQkhCi0JbW92CWszLCBrMAkJCSEgQ2FsY3VsYXRlIElNQVNLLWJpdHMKLQlzaGxyMglrMAotCWFuZAkjMHgzYywgazAKLQljbXAvZXEJIzB4M2MsIGswCi0JYnQvcwk2ZgotCSBzaGxsMglrMAotCW1vdglnX2ltYXNrLCBrMAotCSEKLTY6CW9yCWswLCBrMgkJCSEgU2V0IHRoZSBJTUFTSy1iaXRzCi0JbGRjCWsyLCBzc3IKLQkhCi0jaWYgZGVmaW5lZChDT05GSUdfS0dEQl9OTUkpCi0JISBDbGVhciBpbl9ubWkKLQltb3YubAk2ZiwgazAKLQltb3YJIzAsIGsxCi0JbW92LmIJazEsIEBrMAotI2VuZGlmCi0JbW92LmwJQHIxNSssIGsyCQkhIHJlc3RvcmUgRVhQRVZUCi0JbW92CWs0LCByMTUKLQlydGUKLQkgbm9wCi0KLQkuYWxpZ24JMgotMToJLmxvbmcJVFJBCi0yOgkubG9uZwlOUl9zeXNjYWxscwotMzoJLmxvbmcJc3lzX2NhbGxfdGFibGUKLTQ6CS5sb25nCWRvX3N5c2NhbGxfdHJhY2UKLTU6CS5sb25nCTB4MDAwMDEwMDAJISBEU1AKLTc6CS5sb25nCTB4MzAwMDAwMDAKLTk6Ci1fX0lOVl9JTUFTSzoKLQkubG9uZwkweGZmZmZmZjBmCSEgfihJTUFTSykKLQotISBFeGNlcHRpb24gVmVjdG9yIEJhc2UKLSEKLSEJU2hvdWxkIGJlIGFsaWduZWQgcGFnZSBib3VuZGFyeS4KLSEKLQkuYmFsaWduIAk0MDk2LDAsNDA5NgotRU5UUlkodmJyX2Jhc2UpCi0JLmxvbmcJMAotIQotCS5iYWxpZ24gCTI1NiwwLDI1NgotZ2VuZXJhbF9leGNlcHRpb246Ci0JbW92LmwJMWYsIGsyCi0JbW92LmwJMmYsIGszCi0JYnJhCWhhbmRsZV9leGNlcHRpb24KLQkgbW92LmwJQGsyLCBrMgotCS5hbGlnbgkyCi0xOgkubG9uZwlFWFBFVlQKLTI6CS5sb25nCXJldF9mcm9tX2V4Y2VwdGlvbgotIQotIQotCS5iYWxpZ24gCTEwMjQsMCwxMDI0Ci10bGJfbWlzczoKLQltb3YubAkxZiwgazIKLQltb3YubAk0ZiwgazMKLQlicmEJaGFuZGxlX2V4Y2VwdGlvbgotCSBtb3YubAlAazIsIGsyCi0hCi0JLmJhbGlnbiAJNTEyLDAsNTEyCi1pbnRlcnJ1cHQ6Ci0JbW92LmwJMmYsIGsyCi0JbW92LmwJM2YsIGszCi0jaWYgZGVmaW5lZChDT05GSUdfS0dEQl9OTUkpCi0JISBEZWJvdW5jZSAoZmlsdGVyIG5lc3RlZCBOTUkpCi0JbW92LmwJQGsyLCBrMAotCW1vdi5sCTVmLCBrMQotCWNtcC9lcQlrMSwgazAKLQliZgkwZgotCW1vdi5sCTZmLCBrMQotCXRhcy5iCUBrMQotCWJ0CTBmCi0JcnRlCi0JIG5vcAotCS5hbGlnbgkyCi01OgkubG9uZwlOTUlfVkVDCi02OgkubG9uZwlpbl9ubWkKLTA6Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfS0dEQl9OTUkpICovCi0JYnJhCWhhbmRsZV9leGNlcHRpb24KLQkgbW92CSMtMSwgazIJCSEgaW50ZXJydXB0IGV4Y2VwdGlvbiBtYXJrZXIKLQotCS5hbGlnbgkyCi0xOgkubG9uZwlFWFBFVlQKLTI6CS5sb25nCUlOVEVWVAotMzoJLmxvbmcJcmV0X2Zyb21faXJxCi00OgkubG9uZwlyZXRfZnJvbV9leGNlcHRpb24KLQotIQotIQotCS5hbGlnbgkyCi1FTlRSWShoYW5kbGVfZXhjZXB0aW9uKQotCSEgVXNpbmcgazAsIGsxIGZvciBzY3JhdGNoIHJlZ2lzdGVycyAocjBfYmFuazEsIHIxX2JhbmspLAotCSEgc2F2ZSBhbGwgcmVnaXN0ZXJzIG9udG8gc3RhY2suCi0JIQotCXN0Ywlzc3IsIGswCQkhIElzIGl0IGZyb20ga2VybmVsIHNwYWNlPwotCXNobGwJazAJCSEgQ2hlY2sgTUQgYml0IChiaXQzMCkgYnkgc2hpZnRpbmcgaXQgaW50by4uLgotCXNobGwJazAJCSEgICAgICAgLi4udGhlIFQgYml0Ci0JYnQvcwkxZgkJISBJdCdzIGEga2VybmVsIHRvIGtlcm5lbCB0cmFuc2l0aW9uLgotCSBtb3YJcjE1LCBrMAkJISBzYXZlIG9yaWdpbmFsIHN0YWNrIHRvIGswCi0JLyogVXNlciBzcGFjZSB0byBrZXJuZWwgKi8KLQltb3YJIyhUSFJFQURfU0laRSA+PiA4KSwgazEKLQlzaGxsOAlrMQkJISBrMSA6PSBUSFJFQURfU0laRQotCWFkZAljdXJyZW50LCBrMQotCW1vdglrMSwgcjE1CQkhIGNoYW5nZSB0byBrZXJuZWwgc3RhY2sKLQkhCi0xOgltb3YubAkyZiwgazEKLQkhCi0jaWZkZWYgQ09ORklHX1NIX0RTUAotCW1vdi5sCXIyLCBALXIxNQkJISBTYXZlIHIyLCB3ZSBuZWVkIGFub3RoZXIgcmVnCi0Jc3RjCXNyLCBrNAotCW1vdi5sCTFmLCByMgotCXRzdAlyMiwgazQJCQkhIENoZWNrIGlmIGluIERTUCBtb2RlCi0JbW92LmwJQHIxNSssIHIyCQkhIFJlc3RvcmUgcjIgbm93Ci0JYnQvcwlza2lwX3NhdmUKLQkgbW92CSMwLCBrNAkJCSEgU2V0IG1hcmtlciBmb3Igbm8gc3RhY2sgZnJhbWUKLQotCW1vdglyMiwgazQJCQkhIEJhY2t1cCByMiAoaW4gazQpIGZvciBsYXRlcgotCi0JISBTYXZlIERTUCByZWdpc3RlcnMgb24gc3RhY2sKLQlzdGMubAltb2QsIEAtcjE1Ci0Jc3RjLmwJcmUsIEAtcjE1Ci0Jc3RjLmwJcnMsIEAtcjE1Ci0Jc3RzLmwJZHNyLCBALXIxNQotCXN0cy5sCXkxLCBALXIxNQotCXN0cy5sCXkwLCBALXIxNQotCXN0cy5sCXgxLCBALXIxNQotCXN0cy5sCXgwLCBALXIxNQotCXN0cy5sCWEwLCBALXIxNQotCi0JISBHQVMgaXMgYnJva2VuLCBkb2VzIG5vdCBnZW5lcmF0ZSBjb3JyZWN0ICJtb3ZzLmwgRHMsQC1BcyIgaW5zdHIuCi0KLQkhIEZJWE1FOiBNYWtlIHN1cmUgdGhhdCB0aGlzIGlzIHN0aWxsIHRoZSBjYXNlIHdpdGggbmV3ZXIgdG9vbGNoYWlucywKLQkhIGFzIHdlJ3JlIG5vdCBhdCBhbGwgaW50ZXJlc3RlZCBpbiBzdXBwb3J0aW5nIGFuY2llbnQgdG9vbGNoYWlucyBhdAotCSEgdGhpcyBwb2ludC4gLS0gUEZNLgotCi0JbW92CXIxNSwgcjIKLQkud29yZAkweGY2NTMJCQkhIG1vdnMubAlhMSwgQC1yMgotCS53b3JkCTB4ZjZmMwkJCSEgbW92cy5sCWEwZywgQC1yMgotCS53b3JkCTB4ZjZkMwkJCSEgbW92cy5sCWExZywgQC1yMgotCS53b3JkCTB4ZjZjMwkJCSEgbW92cy5sCW0wLCBALXIyCi0JLndvcmQJMHhmNmUzCQkJISBtb3ZzLmwJbTEsIEAtcjIKLQltb3YJcjIsIHIxNQotCi0JbW92CWs0LCByMgkJCSEgUmVzdG9yZSByMgotCW1vdi5sCTFmLCBrNAkJCSEgRm9yY2UgRFNQIHN0YWNrIGZyYW1lCi1za2lwX3NhdmU6Ci0JbW92LmwJazQsIEAtcjE1CQkhIFB1c2ggRFNQIG1vZGUgbWFya2VyIG9udG8gc3RhY2sKLSNlbmRpZgotCSEgU2F2ZSB0aGUgdXNlciByZWdpc3RlcnMgb24gdGhlIHN0YWNrLgotCW1vdi5sCWsyLCBALXIxNQkhIEVYUEVWVAotCi0gCW1vdgkjLTEsIGs0Ci0JbW92LmwJazQsIEAtcjE1CSEgc2V0IFRSQSAoZGVmYXVsdDogLTEpCi0JIQotCXN0cy5sCW1hY2wsIEAtcjE1Ci0Jc3RzLmwJbWFjaCwgQC1yMTUKLQlzdGMubAlnYnIsIEAtcjE1Ci0Jc3RjLmwJc3NyLCBALXIxNQotCXN0cy5sCXByLCBALXIxNQotCXN0Yy5sCXNwYywgQC1yMTUKLQkhCi0JbGRzCWszLCBwcgkJISBTZXQgdGhlIHJldHVybiBhZGRyZXNzIHRvIHByCi0JIQotCW1vdi5sCWswLCBALXIxNQkhIHNhdmUgb3JpZ25hbCBzdGFjawotCW1vdi5sCXIxNCwgQC1yMTUKLQltb3YubAlyMTMsIEAtcjE1Ci0JbW92LmwJcjEyLCBALXIxNQotCW1vdi5sCXIxMSwgQC1yMTUKLQltb3YubAlyMTAsIEAtcjE1Ci0JbW92LmwJcjksIEAtcjE1Ci0JbW92LmwJcjgsIEAtcjE1Ci0JIQotCXN0YwlzciwgcjgJCSEgQmFjayB0byBub3JtYWwgcmVnaXN0ZXIgYmFuaywgYW5kCi0Jb3IJazEsIHI4CQkhIEJsb2NrIGFsbCBpbnRlcnJ1cHRzCi0JbW92LmwJM2YsIGsxCi0JYW5kCWsxLCByOAkJISAuLi4KLQlsZGMJcjgsIHNyCQkhIC4uLmNoYW5nZWQgaGVyZS4KLQkhCi0JbW92LmwJcjcsIEAtcjE1Ci0JbW92LmwJcjYsIEAtcjE1Ci0JbW92LmwJcjUsIEAtcjE1Ci0JbW92LmwJcjQsIEAtcjE1Ci0JbW92LmwJcjMsIEAtcjE1Ci0JbW92LmwJcjIsIEAtcjE1Ci0JbW92LmwJcjEsIEAtcjE1Ci0JbW92LmwJcjAsIEAtcjE1Ci0KLQkvKgotCSAqIFRoaXMgZ2V0cyBhIGJpdCB0cmlja3kuLiBpbiB0aGUgSU5URVZUIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byB1c2UKLQkgKiB0aGUgVkJSIG9mZnNldCBhcyBhIGRlc3RpbmF0aW9uIGluIHRoZSBqdW1wIGNhbGwgdGFibGUsIHNpbmNlIGFsbAotCSAqIG9mIHRoZSBkZXN0aW5hdGlvbnMgYXJlIHRoZSBzYW1lLiBJbiB0aGlzIGNhc2UsIChpbnRlcnJ1cHQpIHNldHMKLQkgKiBhIG1hcmtlciBpbiByMiAobm93IHIyX2Jhbmsgc2luY2UgU1IuUkIgY2hhbmdlZCksIHdoaWNoIHdlIGNoZWNrCi0JICogdG8gZGV0ZXJtaW5lIHRoZSBleGNlcHRpb24gdHlwZS4gRm9yIGFsbCBvdGhlciBleGNlcHRpb25zLCB3ZQotCSAqIGZvcmNpYmx5IHJlYWQgRVhQRVZUIGZyb20gbWVtb3J5IGFuZCBmaXggdXAgdGhlIGp1bXAgYWRkcmVzcywgaW4KLQkgKiB0aGUgaW50ZXJydXB0IGV4Y2VwdGlvbiBjYXNlIHdlIGp1bXAgdG8gZG9fSVJRKCkgYW5kIGRlZmVyIHRoZQotCSAqIElOVEVWVCByZWFkIHVudGlsIHRoZXJlLiBBcyBhIGJvbnVzLCB3ZSBjYW4gYWxzbyBjbGVhbiB1cCB0aGUgU1IuUkIKLQkgKiBjaGVja3MgdGhhdCBkb19JUlEoKSB3YXMgZG9pbmcuLgotCSAqLwotCXN0YwlyMl9iYW5rLCByOAotCWNtcC9weglyOAotCWJmCWludGVycnVwdF9leGNlcHRpb24KLQlzaGxyMglyOAotCXNobHIJcjgKLQltb3YubAk0ZiwgcjkKLQlhZGQJcjgsIHI5Ci0JbW92LmwJQHI5LCByOQotCWptcAlAcjkKLQkgbm9wCi0JcnRzCi0JIG5vcAotCi0JLmFsaWduCTIKLTE6CS5sb25nCTB4MDAwMDEwMDAJISBEU1A9MQotMjoJLmxvbmcJMHgwMDAwODBmMAkhIEZEPTEsIElNQVNLPTE1Ci0zOgkubG9uZwkweGNmZmZmZmZmCSEgUkI9MCwgQkw9MAotNDoJLmxvbmcJZXhjZXB0aW9uX2hhbmRsaW5nX3RhYmxlCi0KLWludGVycnVwdF9leGNlcHRpb246Ci0JbW92LmwJMWYsIHI5Ci0Jam1wCUByOQotCSBub3AKLQlydHMKLQkgbm9wCi0KLQkuYWxpZ24gMgotMToJLmxvbmcJZG9fSVJRCi0KLQkuYWxpZ24JMgotRU5UUlkoZXhjZXB0aW9uX25vbmUpCi0JcnRzCi0JIG5vcApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9zaC9rZXJuZWwvaGVhZC5TCmluZGV4IGY1ZjUzZDEuLjcxYTNhZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3NoL2tlcm5lbC9oZWFkLlMKQEAgLTMzLDcgKzMzLDggQEAKIAkubG9uZwkweDAwMzYwMDAwCS8qIElOSVRSRF9TVEFSVCAqLwogCS5sb25nCTB4MDAwYTAwMDAJLyogSU5JVFJEX1NJWkUgKi8KIAkubG9uZwkwCi0JLmJhbGlnbiA0MDk2LDAsNDA5NgorMToKKwkuc2tpcAlQQUdFX1NJWkUgLSBlbXB0eV96ZXJvX3BhZ2UgLSAxYgogCiAJLnRleHQJCiAvKgpAQCAtNTMsOCArNTQsMTAgQEAKIAlsZGMJcjAsIHNyCiAJIQkJCUluaXRpYWxpemUgZ2xvYmFsIGludGVycnVwdCBtYXNrCiAJbW92CSMwLCByMAorI2lmZGVmIENPTkZJR19DUFVfSEFTX1NSX1JCCiAJbGRjCXIwLCByNl9iYW5rCi0KKyNlbmRpZgorCQogCS8qCiAJICogUHJlZmV0Y2ggaWYgcG9zc2libGUgdG8gcmVkdWNlIGNhY2hlIG1pc3MgcGVuYWx0eS4KIAkgKgpAQCAtNjgsMTEgKzcxLDE0IEBACiAJIQogCW1vdi5sCTJmLCByMAogCW1vdglyMCwgcjE1CQkhIFNldCBpbml0aWFsIHIxNSAoc3RhY2sgcG9pbnRlcikKLQltb3YJIyhUSFJFQURfU0laRSA+PiA4KSwgcjEKKwltb3YJIyhUSFJFQURfU0laRSA+PiAxMCksIHIxCiAJc2hsbDgJcjEJCSEgcjEgPSBUSFJFQURfU0laRQorCXNobGwyCXIxCiAJc3ViCXIxLCByMAkJIQorI2lmZGVmIENPTkZJR19DUFVfSEFTX1NSX1JCCiAJbGRjCXIwLCByN19iYW5rCSEgLi4uIGFuZCBpbml0aWFsIHRocmVhZF9pbmZvCi0KKyNlbmRpZgorCQogCSEJCQlDbGVhciBCU1MgYXJlYQogCW1vdi5sCTNmLCByMQogCWFkZAkjNCwgcjEKQEAgLTk1LDcgKzEwMSwxMSBAQAogCSBub3AKIAogCS5iYWxpZ24gNAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDIpCisxOgkubG9uZwkweDAwMDAwMEYwCQkhIElNQVNLPTB4RgorI2Vsc2UKIDE6CS5sb25nCTB4NDAwMDgwRjAJCSEgTUQ9MSwgUkI9MCwgQkw9MCwgRkQ9MSwgSU1BU0s9MHhGCisjZW5kaWYKIDI6CS5sb25nCWluaXRfdGhyZWFkX3VuaW9uK1RIUkVBRF9TSVpFCiAzOgkubG9uZwlfX2Jzc19zdGFydAogNDoJLmxvbmcJX2VuZApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCBhY2YyNjAyLi42N2JlMmI2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KQEAgLTU0LDcgKzU0LDcgQEAKIAkJZm9yX2VhY2hfb25saW5lX2NwdShqKQogCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoaikuaXJxc1tpXSk7CiAJCXNlcV9wcmludGYocCwgIiAlMTRzIiwgaXJxX2Rlc2NbaV0uY2hpcC0+bmFtZSk7Ci0JCXNlcV9wcmludGYocCwgIi0lcyIsIGhhbmRsZV9pcnFfbmFtZShpcnFfZGVzY1tpXS5oYW5kbGVfaXJxKSk7CisJCXNlcV9wcmludGYocCwgIi0lLThzIiwgaXJxX2Rlc2NbaV0ubmFtZSk7CiAJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOwogCiAJCWZvciAoYWN0aW9uPWFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCkBAIC03OCwxNSArNzgsMTYgQEAKIAl1MzIJCQlzdGFja1tUSFJFQURfU0laRS9zaXplb2YodTMyKV07CiB9OwogCi1zdGF0aWMgdW5pb24gaXJxX2N0eCAqaGFyZGlycV9jdHhbTlJfQ1BVU107Ci1zdGF0aWMgdW5pb24gaXJxX2N0eCAqc29mdGlycV9jdHhbTlJfQ1BVU107CitzdGF0aWMgdW5pb24gaXJxX2N0eCAqaGFyZGlycV9jdHhbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKK3N0YXRpYyB1bmlvbiBpcnFfY3R4ICpzb2Z0aXJxX2N0eFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5OwogI2VuZGlmCiAKIGFzbWxpbmthZ2UgaW50IGRvX0lSUSh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogCQkgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAotCQkgICAgICBzdHJ1Y3QgcHRfcmVncyByZWdzKQorCQkgICAgICBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKCZyZWdzKTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CisJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwogCWludCBpcnE7CiAjaWZkZWYgQ09ORklHXzRLU1RBQ0tTCiAJdW5pb24gaXJxX2N0eCAqY3VyY3R4LCAqaXJxY3R4OwpAQCAtMTExLDcgKzExMiw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19DUFVfSEFTX0lOVEVWVAotCWlycSA9IChjdHJsX2lubChJTlRFVlQpID4+IDUpIC0gMTY7CisJaXJxID0gZXZ0MmlycShjdHJsX2lubChJTlRFVlQpKTsKICNlbHNlCiAJaXJxID0gcjQ7CiAjZW5kaWYKQEAgLTEzNSwxNyArMTM2LDI0IEBACiAJCWlycWN0eC0+dGluZm8udGFzayA9IGN1cmN0eC0+dGluZm8udGFzazsKIAkJaXJxY3R4LT50aW5mby5wcmV2aW91c19zcCA9IGN1cnJlbnRfc3RhY2tfcG9pbnRlcjsKIAorCQkvKgorCQkgKiBDb3B5IHRoZSBzb2Z0aXJxIGJpdHMgaW4gcHJlZW1wdF9jb3VudCBzbyB0aGF0IHRoZQorCQkgKiBzb2Z0aXJxIGNoZWNrcyB3b3JrIGluIHRoZSBoYXJkaXJxIGNvbnRleHQuCisJCSAqLworCQlpcnFjdHgtPnRpbmZvLnByZWVtcHRfY291bnQgPQorCQkJKGlycWN0eC0+dGluZm8ucHJlZW1wdF9jb3VudCAmIH5TT0ZUSVJRX01BU0spIHwKKwkJCShjdXJjdHgtPnRpbmZvLnByZWVtcHRfY291bnQgJiBTT0ZUSVJRX01BU0spOworCiAJCV9fYXNtX18gX192b2xhdGlsZV9fICgKIAkJCSJtb3YJJTAsIHI0CQlcbiIKLQkJCSJtb3YJcjE1LCByOQkJXG4iCisJCQkibW92CXIxNSwgcjgJCVxuIgogCQkJImpzcglAJTEJCVxuIgogCQkJLyogc3dpdGggdG8gdGhlIGlycSBzdGFjayAqLwogCQkJIiBtb3YJJTIsIHIxNQkJXG4iCiAJCQkvKiByZXN0b3JlIHRoZSBzdGFjayAocmluZyB6ZXJvKSAqLwotCQkJIm1vdglyOSwgcjE1CQlcbiIKKwkJCSJtb3YJcjgsIHIxNQkJXG4iCiAJCQk6IC8qIG5vIG91dHB1dHMgKi8KIAkJCTogInIiIChpcnEpLCAiciIgKGdlbmVyaWNfaGFuZGxlX2lycSksICJyIiAoaXNwKQotCQkJLyogWFhYOiBBIHNvbWV3aGF0IGV4Y2Vzc2l2ZSBjbG9iYmVyIGxpc3Q/IC1QRk0gKi8KIAkJCTogIm1lbW9yeSIsICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsCiAJCQkgICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJ0IiwgInByIgogCQkpOwpAQCAtMTkzLDcgKzIwMSw3IEBACiAJaXJxY3R4LT50aW5mby50YXNrCQk9IE5VTEw7CiAJaXJxY3R4LT50aW5mby5leGVjX2RvbWFpbgk9IE5VTEw7CiAJaXJxY3R4LT50aW5mby5jcHUJCT0gY3B1OwotCWlycWN0eC0+dGluZm8ucHJlZW1wdF9jb3VudAk9IFNPRlRJUlFfT0ZGU0VUOworCWlycWN0eC0+dGluZm8ucHJlZW1wdF9jb3VudAk9IDA7CiAJaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0CT0gTUFLRV9NTV9TRUcoMCk7CiAKIAlzb2Z0aXJxX2N0eFtjcHVdID0gaXJxY3R4OwpAQCAtMjM5LDEzICsyNDcsMzggQEAKIAkJCSJtb3YJcjksIHIxNQkJXG4iCiAJCQk6IC8qIG5vIG91dHB1dHMgKi8KIAkJCTogInIiIChfX2RvX3NvZnRpcnEpLCAiciIgKGlzcCkKLQkJCS8qIFhYWDogQSBzb21ld2hhdCBleGNlc3NpdmUgY2xvYmJlciBsaXN0PyAtUEZNICovCiAJCQk6ICJtZW1vcnkiLCAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLAogCQkJICAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiLCAicjE1IiwgInQiLCAicHIiCiAJCSk7CisKKwkJLyoKKwkJICogU2hvdWxkbnQgaGFwcGVuLCB3ZSByZXR1cm5lZCBhYm92ZSBpZiBpbl9pbnRlcnJ1cHQoKToKKwkJICovCisJCVdBUk5fT05fT05DRShzb2Z0aXJxX2NvdW50KCkpOwogCX0KIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woZG9fc29mdGlycSk7CiAjZW5kaWYKKwordm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19QSU5UX0lSUQorCWluaXRfSVJRX3BpbnQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfSU5UQzJfSVJRCisJaW5pdF9JUlFfaW50YzIoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfSVBSX0lSUQorCWluaXRfSVJRX2lwcigpOworI2VuZGlmCisKKwkvKiBQZXJmb3JtIHRoZSBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uICovCisJaWYgKHNoX212Lm12X2luaXRfaXJxKQorCQlzaF9tdi5tdl9pbml0X2lycSgpOworCisJaXJxX2N0eF9pbml0KHNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOTE1MTZkYy4uNDg2YzA2ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiB7CiAJcHJpbnRrKCJcbiIpOwogCXByaW50aygiUGlkIDogJWQsIENvbW06ICUyMHNcbiIsIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSk7Ci0JcHJpbnRfc3ltYm9sKCJQQyBpcyBhdCAlc1xuIiwgcmVncy0+cGMpOworCXByaW50X3N5bWJvbCgiUEMgaXMgYXQgJXNcbiIsIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykpOwogCXByaW50aygiUEMgIDogJTA4bHggU1AgIDogJTA4bHggU1IgIDogJTA4bHggIiwKIAkgICAgICAgcmVncy0+cGMsIHJlZ3MtPnJlZ3NbMTVdLCByZWdzLT5zcik7CiAjaWZkZWYgQ09ORklHX01NVQpAQCAtMTMwLDE1ICsxMzAsNyBAQAogCXByaW50aygiTUFDSDogJTA4bHggTUFDTDogJTA4bHggR0JSIDogJTA4bHggUFIgIDogJTA4bHhcbiIsCiAJICAgICAgIHJlZ3MtPm1hY2gsIHJlZ3MtPm1hY2wsIHJlZ3MtPmdiciwgcmVncy0+cHIpOwogCi0JLyoKLQkgKiBJZiB3ZSdyZSBpbiBrZXJuZWwgbW9kZSwgZHVtcCB0aGUgc3RhY2sgdG9vLi4KLQkgKi8KLQlpZiAoIXVzZXJfbW9kZShyZWdzKSkgewotCQlleHRlcm4gdm9pZCBzaG93X3Rhc2sodW5zaWduZWQgbG9uZyAqc3ApOwotCQl1bnNpZ25lZCBsb25nIHNwID0gcmVncy0+cmVnc1sxNV07Ci0KLQkJc2hvd190YXNrKCh1bnNpZ25lZCBsb25nICopc3ApOwotCX0KKwlzaG93X3RyYWNlKE5VTEwsICh1bnNpZ25lZCBsb25nICopcmVncy0+cmVnc1sxNV0sIHJlZ3MpOwogfQogCiAvKgpAQCAtMzkzLDEwICszODUsMTEgQEAKIAogYXNtbGlua2FnZSBpbnQgc3lzX2ZvcmsodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKIAkJCXVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCi0JCQlzdHJ1Y3QgcHRfcmVncyByZWdzKQorCQkJc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKICNpZmRlZiBDT05GSUdfTU1VCi0JcmV0dXJuIGRvX2ZvcmsoU0lHQ0hMRCwgcmVncy5yZWdzWzE1XSwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworCXJldHVybiBkb19mb3JrKFNJR0NITEQsIHJlZ3MtPnJlZ3NbMTVdLCByZWdzLCAwLCBOVUxMLCBOVUxMKTsKICNlbHNlCiAJLyogZm9yayBhbG1vc3Qgd29ya3MsIGVub3VnaCB0byB0cmljayB5b3UgaW50byBsb29raW5nIGVsc2V3aGVyZSA6LSggKi8KIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTQwNiwxMSArMzk5LDEyIEBACiBhc21saW5rYWdlIGludCBzeXNfY2xvbmUodW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyBuZXdzcCwKIAkJCSB1bnNpZ25lZCBsb25nIHBhcmVudF90aWRwdHIsCiAJCQkgdW5zaWduZWQgbG9uZyBjaGlsZF90aWRwdHIsCi0JCQkgc3RydWN0IHB0X3JlZ3MgcmVncykKKwkJCSBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCWlmICghbmV3c3ApCi0JCW5ld3NwID0gcmVncy5yZWdzWzE1XTsKLQlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsICZyZWdzLCAwLAorCQluZXdzcCA9IHJlZ3MtPnJlZ3NbMTVdOworCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLCBuZXdzcCwgcmVncywgMCwKIAkJCShpbnQgX191c2VyICopcGFyZW50X3RpZHB0ciwgKGludCBfX3VzZXIgKiljaGlsZF90aWRwdHIpOwogfQogCkBAIC00MjYsOSArNDIwLDEwIEBACiAgKi8KIGFzbWxpbmthZ2UgaW50IHN5c192Zm9yayh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogCQkJIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCi0JCQkgc3RydWN0IHB0X3JlZ3MgcmVncykKKwkJCSBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7Ci0JcmV0dXJuIGRvX2ZvcmsoQ0xPTkVfVkZPUksgfCBDTE9ORV9WTSB8IFNJR0NITEQsIHJlZ3MucmVnc1sxNV0sICZyZWdzLAorCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKKwlyZXR1cm4gZG9fZm9yayhDTE9ORV9WRk9SSyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgcmVncy0+cmVnc1sxNV0sIHJlZ3MsCiAJCSAgICAgICAwLCBOVUxMLCBOVUxMKTsKIH0KIApAQCAtNDM3LDggKzQzMiw5IEBACiAgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19leGVjdmUoY2hhciAqdWZpbGVuYW1lLCBjaGFyICoqdWFyZ3YsCiAJCQkgIGNoYXIgKip1ZW52cCwgdW5zaWduZWQgbG9uZyByNywKLQkJCSAgc3RydWN0IHB0X3JlZ3MgcmVncykKKwkJCSAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlpbnQgZXJyb3I7CiAJY2hhciAqZmlsZW5hbWU7CiAKQEAgLTQ1MCw3ICs0NDYsNyBAQAogCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLAogCQkJICAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKil1YXJndiwKIAkJCSAgKGNoYXIgX191c2VyICogX191c2VyICopdWVudnAsCi0JCQkgICZyZWdzKTsKKwkJCSAgcmVncyk7CiAJaWYgKGVycm9yID09IDApIHsKIAkJdGFza19sb2NrKGN1cnJlbnQpOwogCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKQEAgLTQ3NCwxNSArNDcwLDE0IEBACiAJICovCiAJcGMgPSB0aHJlYWRfc2F2ZWRfcGMocCk7CiAJaWYgKGluX3NjaGVkX2Z1bmN0aW9ucyhwYykpIHsKLQkJc2NoZWR1bGVfZnJhbWUgPSAoKHVuc2lnbmVkIGxvbmcgKikobG9uZylwLT50aHJlYWQuc3ApWzFdOwotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBsb25nICopc2NoZWR1bGVfZnJhbWUpWzFdOworCQlzY2hlZHVsZV9mcmFtZSA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZC5zcDsKKwkJcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXNjaGVkdWxlX2ZyYW1lKVsyMV07CiAJfQorCiAJcmV0dXJuIHBjOwogfQogCi1hc21saW5rYWdlIHZvaWQgYnJlYWtfcG9pbnRfdHJhcCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAotCQkJCSB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAotCQkJCSBzdHJ1Y3QgcHRfcmVncyByZWdzKQorYXNtbGlua2FnZSB2b2lkIGJyZWFrX3BvaW50X3RyYXAodm9pZCkKIHsKIAkvKiBDbGVhciB0cmFjaW5nLiAgKi8KICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0QSkKQEAgLTUwMCw4ICs0OTUsMjAgQEAKIAogYXNtbGlua2FnZSB2b2lkIGJyZWFrX3BvaW50X3RyYXBfc29mdHdhcmUodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKIAkJCQkJICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAotCQkJCQkgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCisJCQkJCSAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogewotCXJlZ3MucGMgLT0gMjsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CisKKwkvKiBSZXdpbmQgKi8KKwlyZWdzLT5wYyAtPSAyOworCisjaWZkZWYgQ09ORklHX0JVRworCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSkpIHsKKwkJdTE2IGluc24gPSAqKHUxNiAqKWluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CisJCWlmIChpbnNuID09IFRSQVBBX0JVR19PUENPREUpCisJCQloYW5kbGVfQlVHKHJlZ3MpOworCX0KKyNlbmRpZgorCiAJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMgYi9hcmNoL3NoL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwppbmRleCA4MjIxYjM3Li5jNjZjYjMyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUworKysgYi9hcmNoL3NoL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpAQCAtNywxMSArNyw5IEBACiAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKICAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLQotI2RlZmluZSBQQUdFX1NJWkUgICAgICA0MDk2IC8qIG11c3QgYmUgc2FtZSB2YWx1ZSBhcyBpbiA8YXNtL3BhZ2UuaD4gKi8KLQorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiAJCS5nbG9ibCByZWxvY2F0ZV9uZXdfa2VybmVsCiByZWxvY2F0ZV9uZXdfa2VybmVsOgpAQCAtMjAsOCArMTgsOCBAQAogCS8qIHI2ID0gc3RhcnRfYWRkcmVzcyAgICAgICovCiAJLyogcjcgPSB2YnJfcmVnICAgICAgICAgICAgKi8KIAotCW1vdi5sCTEwZixyOAkgIC8qIDQwOTYgKi8KLQltb3YubAkxMWYscjkgICAgLyogMHhhMDAwMDAwMCAqLworCW1vdi5sCTEwZixyOAkgIC8qIFBBR0VfU0laRSAqLworCW1vdi5sCTExZixyOSAgICAvKiBQMlNFRyAqLwogCiAJLyogIHN0YWNrIHNldHRpbmcgKi8KIAlhZGQJcjgscjUKQEAgLTMyLDcgKzMwLDcgQEAKIDA6CiAJbW92LmwJQHI0KyxyMAkgIC8qIGNtZCA9ICppbmQrKyAqLwogCi0xOgkvKiBhZGRyID0gKGNtZCB8IDB4YTAwMDAwMDApICYgMHhmZmZmZmZmMCAqLworMToJLyogYWRkciA9IChjbWQgfCBQMlNFRykgJiAweGZmZmZmZmYwICovCiAJbW92CXIwLHIyCiAJb3IJcjkscjIKIAltb3YJIy0xNixyMQpAQCAtOTIsNyArOTAsNyBAQAogMTA6CiAJLmxvbmcJUEFHRV9TSVpFCiAxMToKLQkubG9uZwkweGEwMDAwMDAwCisJLmxvbmcJUDJTRUcKIAogcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQ6CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NldHVwLmMgYi9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCmluZGV4IDM2ZDg2ZjkuLjIyNWY5ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwpAQCAtODQsOCArODQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFyc2VfY21kbGluZSAoY2hhciAqKiBjbWRsaW5lX3AsIGNoYXIgbXZfbmFtZVtNVl9OQU1FX1NJWkVdLAogCQkJCSAgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yKiogbXZwLAotCQkJCSAgdW5zaWduZWQgbG9uZyAqbXZfaW9fYmFzZSwKLQkJCQkgIGludCAqbXZfbW1pb19lbmFibGUpCisJCQkJICB1bnNpZ25lZCBsb25nICptdl9pb19iYXNlKQogewogCWNoYXIgYyA9ICcgJywgKnRvID0gY29tbWFuZF9saW5lLCAqZnJvbSA9IENPTU1BTkRfTElORTsKIAlpbnQgbGVuID0gMDsKQEAgLTExMiwyMyArMTExLDYgQEAKIAkJCX0KIAkJfQogCi0jaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USwotCQlpZiAoYyA9PSAnICcgJiYgIW1lbWNtcChmcm9tLCAiZWFybHlwcmludGs9IiwgMTIpKSB7Ci0JCQljaGFyICplcF9lbmQ7Ci0KLQkJCWlmICh0byAhPSBjb21tYW5kX2xpbmUpCi0JCQkJdG8tLTsKLQotCQkJZnJvbSArPSAxMjsKLQkJCWVwX2VuZCA9IHN0cmNocihmcm9tLCAnICcpOwotCi0JCQlzZXR1cF9lYXJseV9wcmludGsoZnJvbSk7Ci0JCQlwcmludGsoImVhcmx5IGNvbnNvbGUgZW5hYmxlZFxuIik7Ci0KLQkJCWZyb20gPSBlcF9lbmQ7Ci0JCX0KLSNlbmRpZgotCiAJCWlmIChjID09ICcgJyAmJiAhbWVtY21wKGZyb20sICJzaF9tdj0iLCA2KSkgewogCQkJY2hhciogbXZfZW5kOwogCQkJY2hhciogbXZfY29tbWE7CkBAIC0xNDUsNyArMTI3LDYgQEAKIAkJCQlpbnQgaW50c1szXTsKIAkJCQlnZXRfb3B0aW9ucyhtdl9jb21tYSsxLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKIAkJCQkqbXZfaW9fYmFzZSA9IGludHNbMV07Ci0JCQkJKm12X21taW9fZW5hYmxlID0gaW50c1syXTsKIAkJCQltdl9sZW4gPSBtdl9jb21tYSAtIGZyb207CiAJCQl9IGVsc2UgewogCQkJCW12X2xlbiA9IG12X2VuZCAtIGZyb207CkBAIC0xNTgsNiArMTM5LDcgQEAKIAogCQkJKm12cCA9IGdldF9tdl9ieW5hbWUobXZfbmFtZSk7CiAJCX0KKwogCQljID0gKihmcm9tKyspOwogCQlpZiAoIWMpCiAJCQlicmVhazsKQEAgLTE3Nyw5ICsxNTksOCBAQAogCXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciAqbXYgPSBOVUxMOwogCWNoYXIgbXZfbmFtZVtNVl9OQU1FX1NJWkVdID0gIiI7CiAJdW5zaWduZWQgbG9uZyBtdl9pb19iYXNlID0gMDsKLQlpbnQgbXZfbW1pb19lbmFibGUgPSAwOwogCi0JcGFyc2VfY21kbGluZShjbWRsaW5lX3AsIG12X25hbWUsICZtdiwgJm12X2lvX2Jhc2UsICZtdl9tbWlvX2VuYWJsZSk7CisJcGFyc2VfY21kbGluZShjbWRsaW5lX3AsIG12X25hbWUsICZtdiwgJm12X2lvX2Jhc2UpOwogCiAjaWZkZWYgQ09ORklHX1NIX1VOS05PV04KIAlpZiAobXYgPT0gTlVMTCkgewpAQCAtMjU4LDYgKzIzOSw3IEBACiAKIAlzaF9tdl9zZXR1cChjbWRsaW5lX3ApOwogCisKIAkvKgogCSAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKIAkgKi8KQEAgLTMwNSw2ICsyODcsNyBAQAogCQkJCSAgUEZOX1BIWVMocGFnZXMpKTsKIAl9CiAKKwogCS8qCiAJICogUmVzZXJ2ZSB0aGUga2VybmVsIHRleHQgYW5kCiAJICogUmVzZXJ2ZSB0aGUgYm9vdG1lbSBiaXRtYXAuIFdlIGRvIHRoaXMgaW4gdHdvIHN0ZXBzIChmaXJzdCBzdGVwCkBAIC0zMjUsMTUgKzMwOCwxOCBAQAogCVJPT1RfREVWID0gTUtERVYoUkFNRElTS19NQUpPUiwgMCk7CiAJaWYgKCZfX3JkX3N0YXJ0ICE9ICZfX3JkX2VuZCkgewogCQlMT0FERVJfVFlQRSA9IDE7Ci0JCUlOSVRSRF9TVEFSVCA9IFBIWVNBRERSKCh1bnNpZ25lZCBsb25nKSZfX3JkX3N0YXJ0KSAtIF9fTUVNT1JZX1NUQVJUOwotCQlJTklUUkRfU0laRSA9ICh1bnNpZ25lZCBsb25nKSZfX3JkX2VuZCAtICh1bnNpZ25lZCBsb25nKSZfX3JkX3N0YXJ0OworCQlJTklUUkRfU1RBUlQgPSBQSFlTQUREUigodW5zaWduZWQgbG9uZykmX19yZF9zdGFydCkgLQorCQkJCQlfX01FTU9SWV9TVEFSVDsKKwkJSU5JVFJEX1NJWkUgPSAodW5zaWduZWQgbG9uZykmX19yZF9lbmQgLQorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpJl9fcmRfc3RhcnQ7CiAJfQogCiAJaWYgKExPQURFUl9UWVBFICYmIElOSVRSRF9TVEFSVCkgewogCQlpZiAoSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUgPD0gKG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpKSB7Ci0JCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIElOSVRSRF9TVEFSVCtfX01FTU9SWV9TVEFSVCwgSU5JVFJEX1NJWkUpOwotCQkJaW5pdHJkX3N0YXJ0ID0KLQkJCQlJTklUUkRfU1RBUlQgPyBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVCArIF9fTUVNT1JZX1NUQVJUIDogMDsKKwkJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgSU5JVFJEX1NUQVJUICsKKwkJCQkJCV9fTUVNT1JZX1NUQVJULCBJTklUUkRfU0laRSk7CisJCQlpbml0cmRfc3RhcnQgPSBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVCArCisJCQkJCV9fTUVNT1JZX1NUQVJUOwogCQkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIElOSVRSRF9TSVpFOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKCJpbml0cmQgZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIG1lbW9yeSAiCkBAIC0zOTIsNiArMzc4LDcgQEAKIHN1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNwdV9uYW1lW10gPSB7CisJW0NQVV9TSDcyMDZdCT0gIlNINzIwNiIsCVtDUFVfU0g3NjE5XQk9ICJTSDc2MTkiLAogCVtDUFVfU0g3NjA0XQk9ICJTSDc2MDQiLAlbQ1BVX1NINzMwMF0JPSAiU0g3MzAwIiwKIAlbQ1BVX1NINzcwNV0JPSAiU0g3NzA1IiwJW0NQVV9TSDc3MDZdCT0gIlNINzcwNiIsCiAJW0NQVV9TSDc3MDddCT0gIlNINzcwNyIsCVtDUFVfU0g3NzA4XQk9ICJTSDc3MDgiLApAQCAtNDA0LDYgKzM5MSw3IEBACiAJW0NQVV9TSDRfMjAyXQk9ICJTSDQtMjAyIiwJW0NQVV9TSDRfNTAxXQk9ICJTSDQtNTAxIiwKIAlbQ1BVX1NINzc3MF0JPSAiU0g3NzcwIiwJW0NQVV9TSDc3ODBdCT0gIlNINzc4MCIsCiAJW0NQVV9TSDc3ODFdCT0gIlNINzc4MSIsCVtDUFVfU0g3MzQzXQk9ICJTSDczNDMiLAorCVtDUFVfU0g3Nzg1XQk9ICJTSDc3ODUiLAlbQ1BVX1NINzcyMl0JPSAiU0g3NzIyIiwKIAlbQ1BVX1NIX05PTkVdCT0gIlVua25vd24iCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYwppbmRleCA5ZGFhZDcwLi5lNjEwNjIzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogCiBleHRlcm4gaW50IGR1bXBfZnB1KHN0cnVjdCBwdF9yZWdzICosIGVsZl9mcHJlZ3NldF90ICopOwogZXh0ZXJuIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBub19pcnFfdHlwZTsKQEAgLTcxLDE1ICs3MCwyNiBAQAogREVDTEFSRV9FWFBPUlQoX19hc2hyZGkzKTsKIERFQ0xBUkVfRVhQT1JUKF9fYXNobGRpMyk7CiBERUNMQVJFX0VYUE9SVChfX2xzaHJkaTMpOwotREVDTEFSRV9FWFBPUlQoX19tb3ZzdHIpOwogREVDTEFSRV9FWFBPUlQoX19tb3ZzdHJTSTE2KTsKLQotRVhQT1JUX1NZTUJPTChzdHJjcHkpOworI2lmIF9fR05VQ19fID09IDQKK0RFQ0xBUkVfRVhQT1JUKF9fbW92bWVtKTsKKyNlbHNlCitERUNMQVJFX0VYUE9SVChfX21vdnN0cik7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19DUFVfU0g0CisjaWYgX19HTlVDX18gPT0gNAorREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1faTRfZXZlbik7CitERUNMQVJFX0VYUE9SVChfX21vdm1lbV9pNF9vZGQpOworREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1TSTEyX2k0KTsKK0RFQ0xBUkVfRVhQT1JUKF9fc2RpdnNpM19pNGkpOworREVDTEFSRV9FWFBPUlQoX191ZGl2X3Fybm5kXzE2KTsKK0RFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpM19pNGkpOworI2Vsc2UgLyogR0NDIDMueCAqLwogREVDTEFSRV9FWFBPUlQoX19tb3ZzdHJfaTRfZXZlbik7CiBERUNMQVJFX0VYUE9SVChfX21vdnN0cl9pNF9vZGQpOwogREVDTEFSRV9FWFBPUlQoX19tb3ZzdHJTSTEyX2k0KTsKKyNlbmRpZiAvKiBfX0dOVUNfXyA9PSA0ICovCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpIHx8IGRlZmluZWQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQpAQCAtMTAyLDEwICsxMTIsNiBAQAogRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9pcnEpOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUE0KLUVYUE9SVF9TWU1CT0wocG1fc3VzcGVuZCk7Ci0jZW5kaWYKLQogRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwogI2lmZGVmIENPTkZJR19JUFY2CiBFWFBPUlRfU1lNQk9MKGNzdW1faXB2Nl9tYWdpYyk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCmluZGV4IDUyMTNmNWIuLjM3OWM4OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTM3LDcgKzM4LDcgQEAKIGFzbWxpbmthZ2UgaW50CiBzeXNfc2lnc3VzcGVuZChvbGRfc2lnc2V0X3QgbWFzaywKIAkgICAgICAgdW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKLQkgICAgICAgc3RydWN0IHB0X3JlZ3MgcmVncykKKwkgICAgICAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogewogCW1hc2sgJj0gX0JMT0NLQUJMRTsKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKQEAgLTUyLDcgKzUzLDcgQEAKIAlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCi1hc21saW5rYWdlIGludCAKK2FzbWxpbmthZ2UgaW50CiBzeXNfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqYWN0LAogCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKIHsKQEAgLTg3LDkgKzg4LDExIEBACiBhc21saW5rYWdlIGludAogc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLAogCQl1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAotCQlzdHJ1Y3QgcHRfcmVncyByZWdzKQorCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7Ci0JcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy5yZWdzWzE1XSk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOworCisJcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+cmVnc1sxNV0pOwogfQogCiAKQEAgLTk4LDcgKzEwMSwxMSBAQAogICovCiAKICNkZWZpbmUgTU9WVyhuKQkgKDB4OTMwMHwoKG4pLTIpKQkvKiBNb3ZlIG1lbSB3b3JkIGF0IFBDK24gdG8gUjMgKi8KLSNkZWZpbmUgVFJBUDE2CSAweGMzMTAJCQkvKiBTeXNjYWxsIHcvbm8gYXJncyAoTlIgaW4gUjMpICovCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMikKKyNkZWZpbmUgVFJBUF9OT0FSRyAweGMzMjAJCS8qIFN5c2NhbGwgdy9ubyBhcmdzIChOUiBpbiBSMykgKi8KKyNlbHNlCisjZGVmaW5lIFRSQVBfTk9BUkcgMHhjMzEwCQkvKiBTeXNjYWxsIHcvbm8gYXJncyAoTlIgaW4gUjMpICovCisjZW5kaWYKICNkZWZpbmUgT1JfUjBfUjAgMHgyMDBiCQkJLyogb3IgcjAscjAgKGluc2VydCB0byBhdm9pZCBoYXJkd2FyZSBidWcpICovCiAKIHN0cnVjdCBzaWdmcmFtZQpAQCAtMTk0LDkgKzIwMSwxMCBAQAogCiBhc21saW5rYWdlIGludCBzeXNfc2lncmV0dXJuKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCi0JCQkgICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCisJCQkgICAgIHN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKLQlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopcmVncy5yZWdzWzE1XTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqKXJlZ3MtPnJlZ3NbMTVdOwogCXNpZ3NldF90IHNldDsKIAlpbnQgcjA7CiAKQEAgLTIxNiw3ICsyMjQsNyBAQAogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQoJnJlZ3MsICZmcmFtZS0+c2MsICZyMCkpCisJaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnNjLCAmcjApKQogCQlnb3RvIGJhZGZyYW1lOwogCXJldHVybiByMDsKIApAQCAtMjI3LDkgKzIzNSwxMCBAQAogCiBhc21saW5rYWdlIGludCBzeXNfcnRfc2lncmV0dXJuKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAJCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKLQkJCQlzdHJ1Y3QgcHRfcmVncyByZWdzKQorCQkJCXN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKLQlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopcmVncy5yZWdzWzE1XTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKXJlZ3MtPnJlZ3NbMTVdOwogCXNpZ3NldF90IHNldDsKIAlzdGFja190IHN0OwogCWludCByMDsKQEAgLTI0NiwxNCArMjU1LDE0IEBACiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCi0JaWYgKHJlc3RvcmVfc2lnY29udGV4dCgmcmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJnIwKSkKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZyMCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAlpZiAoX19jb3B5X2Zyb21fdXNlcigmc3QsICZmcmFtZS0+dWMudWNfc3RhY2ssIHNpemVvZihzdCkpKQogCQlnb3RvIGJhZGZyYW1lOwogCS8qIEl0IGlzIG1vcmUgZGlmZmljdWx0IHRvIGF2b2lkIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0aGFuIHRvCiAJICAgY2FsbCBpdCBhbmQgaWdub3JlIGVycm9ycy4gICovCi0JZG9fc2lnYWx0c3RhY2soJnN0LCBOVUxMLCByZWdzLnJlZ3NbMTVdKTsKKwlkb19zaWdhbHRzdGFjaygmc3QsIE5VTEwsIHJlZ3MtPnJlZ3NbMTVdKTsKIAogCXJldHVybiByMDsKIApAQCAtMzUwLDcgKzM1OSw3IEBACiAJfSBlbHNlIHsKIAkJLyogR2VuZXJhdGUgcmV0dXJuIGNvZGUgKHN5c3RlbSBjYWxsIHRvIHNpZ3JldHVybikgKi8KIAkJZXJyIHw9IF9fcHV0X3VzZXIoTU9WVyg3KSwgJmZyYW1lLT5yZXRjb2RlWzBdKTsKLQkJZXJyIHw9IF9fcHV0X3VzZXIoVFJBUDE2LCAmZnJhbWUtPnJldGNvZGVbMV0pOworCQllcnIgfD0gX19wdXRfdXNlcihUUkFQX05PQVJHLCAmZnJhbWUtPnJldGNvZGVbMV0pOwogCQllcnIgfD0gX19wdXRfdXNlcihPUl9SMF9SMCwgJmZyYW1lLT5yZXRjb2RlWzJdKTsKIAkJZXJyIHw9IF9fcHV0X3VzZXIoT1JfUjBfUjAsICZmcmFtZS0+cmV0Y29kZVszXSk7CiAJCWVyciB8PSBfX3B1dF91c2VyKE9SX1IwX1IwLCAmZnJhbWUtPnJldGNvZGVbNF0pOwpAQCAtNDMwLDcgKzQzOSw3IEBACiAJfSBlbHNlIHsKIAkJLyogR2VuZXJhdGUgcmV0dXJuIGNvZGUgKHN5c3RlbSBjYWxsIHRvIHJ0X3NpZ3JldHVybikgKi8KIAkJZXJyIHw9IF9fcHV0X3VzZXIoTU9WVyg3KSwgJmZyYW1lLT5yZXRjb2RlWzBdKTsKLQkJZXJyIHw9IF9fcHV0X3VzZXIoVFJBUDE2LCAmZnJhbWUtPnJldGNvZGVbMV0pOworCQllcnIgfD0gX19wdXRfdXNlcihUUkFQX05PQVJHLCAmZnJhbWUtPnJldGNvZGVbMV0pOwogCQllcnIgfD0gX19wdXRfdXNlcihPUl9SMF9SMCwgJmZyYW1lLT5yZXRjb2RlWzJdKTsKIAkJZXJyIHw9IF9fcHV0X3VzZXIoT1JfUjBfUjAsICZmcmFtZS0+cmV0Y29kZVszXSk7CiAJCWVyciB8PSBfX3B1dF91c2VyKE9SX1IwX1IwLCAmZnJhbWUtPnJldGNvZGVbNF0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9zaC9rZXJuZWwvc3RhY2t0cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNTI2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3N0YWNrdHJhY2UuYworICoKKyAqIFN0YWNrIHRyYWNlIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKKy8qCisgKiBTYXZlIHN0YWNrLWJhY2t0cmFjZSBhZGRyZXNzZXMgaW50byBhIHN0YWNrX3RyYWNlIGJ1ZmZlci4KKyAqLwordm9pZCBzYXZlX3N0YWNrX3RyYWNlKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwl1bnNpZ25lZCBsb25nICpzcDsKKworCWlmICghdGFzaykKKwkJdGFzayA9IGN1cnJlbnQ7CisJaWYgKHRhc2sgPT0gY3VycmVudCkKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKWN1cnJlbnRfc3RhY2tfcG9pbnRlcjsKKwllbHNlCisJCXNwID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7CisKKwl3aGlsZSAoIWtzdGFja19lbmQoc3ApKSB7CisJCXVuc2lnbmVkIGxvbmcgYWRkciA9ICpzcCsrOworCisJCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKKwkJCWlmICh0cmFjZS0+c2tpcCA+IDApCisJCQkJdHJhY2UtPnNraXAtLTsKKwkJCWVsc2UKKwkJCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7CisJCQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzKQorCQkJCWJyZWFrOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3lzX3NoLmMgYi9hcmNoL3NoL2tlcm5lbC9zeXNfc2guYwppbmRleCA4ZmRlOTUwLi5lMThmMTgzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNfc2guYworKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNfc2guYwpAQCAtMzMsMTQgKzMzLDE1IEBACiAgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19waXBlKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKLQlzdHJ1Y3QgcHRfcmVncyByZWdzKQorCXN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CiAJaW50IGZkWzJdOwogCWludCBlcnJvcjsKIAogCWVycm9yID0gZG9fcGlwZShmZCk7CiAJaWYgKCFlcnJvcikgewotCQlyZWdzLnJlZ3NbMV0gPSBmZFsxXTsKKwkJcmVncy0+cmVnc1sxXSA9IGZkWzFdOwogCQlyZXR1cm4gZmRbMF07CiAJfQogCXJldHVybiBlcnJvcjsKQEAgLTUwLDYgKzUxLDcgQEAKIAogRVhQT1JUX1NZTUJPTChzaG1fYWxpZ25fbWFzayk7CiAKKyNpZmRlZiBDT05GSUdfTU1VCiAvKgogICogVG8gYXZvaWQgY2FjaGUgYWxpYXNlcywgd2UgbWFwIHRoZSBzaGFyZWQgcGFnZSB3aXRoIHNhbWUgY29sb3IuCiAgKi8KQEAgLTEzNSw2ICsxMzcsNyBAQAogCQkJYWRkciA9IENPTE9VUl9BTElHTihhZGRyLCBwZ29mZik7CiAJfQogfQorI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAogc3RhdGljIGlubGluZSBsb25nCiBkb19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsIApAQCAtMzExLDYgKzMxNCwxMiBAQAogI2VuZGlmCiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0gyKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU0gyQSkKKyNkZWZpbmUgU1lTQ0FMTF9BUkczCSJ0cmFwYSAjMHgyMyIKKyNlbHNlCisjZGVmaW5lIFNZU0NBTExfQVJHMwkidHJhcGEgIzB4MTMiCisjZW5kaWYKKwogLyoKICAqIERvIGEgc3lzdGVtIGNhbGwgZnJvbSBrZXJuZWwgaW5zdGVhZCBvZiBjYWxsaW5nIHN5c19leGVjdmUgc28gd2UKICAqIGVuZCB1cCB3aXRoIHByb3BlciBwdF9yZWdzLgpAQCAtMzIxLDcgKzMzMCw3IEBACiAJcmVnaXN0ZXIgbG9uZyBfX3NjNCBfX2FzbV9fICgicjQiKSA9IChsb25nKSBmaWxlbmFtZTsKIAlyZWdpc3RlciBsb25nIF9fc2M1IF9fYXNtX18gKCJyNSIpID0gKGxvbmcpIGFyZ3Y7CiAJcmVnaXN0ZXIgbG9uZyBfX3NjNiBfX2FzbV9fICgicjYiKSA9IChsb25nKSBlbnZwOwotCV9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcGEJIzB4MTMiIDogIj16IiAoX19zYzApCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKFNZU0NBTExfQVJHMyA6ICI9eiIgKF9fc2MwKQkKIAkJCTogIjAiIChfX3NjMCksICJyIiAoX19zYzQpLCAiciIgKF9fc2M1KSwgInIiIChfX3NjNikKIAkJCTogIm1lbW9yeSIpOwogCXJldHVybiBfX3NjMDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCmluZGV4IDc2ODMzNGUuLmNhODE5NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtMzUxLDMgKzM1MSw2IEBACiAJLmxvbmcgc3lzX3N5bmNfZmlsZV9yYW5nZQogCS5sb25nIHN5c190ZWUJCQkvKiAzMTUgKi8KIAkubG9uZyBzeXNfdm1zcGxpY2UKKwkubG9uZyBzeXNfbW92ZV9wYWdlcworCS5sb25nIHN5c19nZXRjcHUKKwkubG9uZyBzeXNfZXBvbGxfcHdhaXQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWUuYyBiL2FyY2gvc2gva2VybmVsL3RpbWUuYwppbmRleCA1N2U3MDhkLi5jMjA2Yzk1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZS5jCkBAIC0xMyw2ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3J0Yy5oPgogI2luY2x1ZGUgPGFzbS90aW1lci5oPgpAQCAtNTAsMTUgKzUyLDIwIEBACiAjaWZuZGVmIENPTkZJR19HRU5FUklDX1RJTUUKIHZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgc2VxOwogCXVuc2lnbmVkIGxvbmcgdXNlYywgc2VjOwogCiAJZG8gewotCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJLyoKKwkJICogVHVybiBvZmYgSVJRcyB3aGVuIGdyYWJiaW5nIHh0aW1lX2xvY2ssIHNvIHRoYXQKKwkJICogdGhlIHN5c190aW1lciBnZXRfb2Zmc2V0IGNvZGUgZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBpdC4KKwkJICovCisJCXNlcSA9IHJlYWRfc2VxYmVnaW5faXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCQl1c2VjID0gZ2V0X3RpbWVyX29mZnNldCgpOwogCQlzZWMgPSB4dGltZS50dl9zZWM7Ci0JCXVzZWMgKz0geHRpbWUudHZfbnNlYyAvIDEwMDA7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7CisJCXVzZWMgKz0geHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeV9pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBzZXEsIGZsYWdzKSk7CiAKIAl3aGlsZSAodXNlYyA+PSAxMDAwMDAwKSB7CiAJCXVzZWMgLT0gMTAwMDAwMDsKQEAgLTg1LDcgKzkyLDcgQEAKIAkgKiB3YWxsIHRpbWUuICBEaXNjb3ZlciB3aGF0IGNvcnJlY3Rpb24gZ2V0dGltZW9mZGF5KCkgd291bGQgaGF2ZQogCSAqIG1hZGUsIGFuZCB0aGVuIHVuZG8gaXQhCiAJICovCi0JbnNlYyAtPSAxMDAwICogZ2V0X3RpbWVyX29mZnNldCgpOworCW5zZWMgLT0gZ2V0X3RpbWVyX29mZnNldCgpICogTlNFQ19QRVJfVVNFQzsKIAogCXd0bV9zZWMgID0gd2FsbF90b19tb25vdG9uaWMudHZfc2VjICsgKHh0aW1lLnR2X3NlYyAtIHNlYyk7CiAJd3RtX25zZWMgPSB3YWxsX3RvX21vbm90b25pYy50dl9uc2VjICsgKHh0aW1lLnR2X25zZWMgLSBuc2VjKTsKQEAgLTE2OSw2ICsxNzYsMTA4IEBACiAJLnJlc3VtZQkgPSB0aW1lcl9yZXN1bWUsCiB9OwogCisjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKK3N0YXRpYyBpbnQgdGltZXJfZHluX3RpY2tfZW5hYmxlKHZvaWQpCit7CisJc3RydWN0IGR5bl90aWNrX3RpbWVyICpkeW5fdGljayA9IHN5c190aW1lci0+ZHluX3RpY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlmIChkeW5fdGljaykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHluX3RpY2stPmxvY2ssIGZsYWdzKTsKKwkJcmV0ID0gMDsKKwkJaWYgKCEoZHluX3RpY2stPnN0YXRlICYgRFlOX1RJQ0tfRU5BQkxFRCkpIHsKKwkJCXJldCA9IGR5bl90aWNrLT5lbmFibGUoKTsKKworCQkJaWYgKHJldCA9PSAwKQorCQkJCWR5bl90aWNrLT5zdGF0ZSB8PSBEWU5fVElDS19FTkFCTEVEOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR5bl90aWNrLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0aW1lcl9keW5fdGlja19kaXNhYmxlKHZvaWQpCit7CisJc3RydWN0IGR5bl90aWNrX3RpbWVyICpkeW5fdGljayA9IHN5c190aW1lci0+ZHluX3RpY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWlmIChkeW5fdGljaykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHluX3RpY2stPmxvY2ssIGZsYWdzKTsKKwkJcmV0ID0gMDsKKwkJaWYgKGR5bl90aWNrLT5zdGF0ZSAmIERZTl9USUNLX0VOQUJMRUQpIHsKKwkJCXJldCA9IGR5bl90aWNrLT5kaXNhYmxlKCk7CisKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlkeW5fdGljay0+c3RhdGUgJj0gfkRZTl9USUNLX0VOQUJMRUQ7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHluX3RpY2stPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVwcm9ncmFtIHRoZSBzeXN0ZW0gdGltZXIgZm9yIGF0IGxlYXN0IHRoZSBjYWxjdWxhdGVkIHRpbWUgaW50ZXJ2YWwuCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgaWRsZSB0aHJlYWQgd2l0aCBJUlFzIGRpc2FibGVkLAorICogaW1tZWRpYXRlbHkgYmVmb3JlIHNsZWVwaW5nLgorICovCit2b2lkIHRpbWVyX2R5bl9yZXByb2dyYW0odm9pZCkKK3sKKwlzdHJ1Y3QgZHluX3RpY2tfdGltZXIgKmR5bl90aWNrID0gc3lzX3RpbWVyLT5keW5fdGljazsKKwl1bnNpZ25lZCBsb25nIG5leHQsIHNlcSwgZmxhZ3M7CisKKwlpZiAoIWR5bl90aWNrKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHluX3RpY2stPmxvY2ssIGZsYWdzKTsKKwlpZiAoZHluX3RpY2stPnN0YXRlICYgRFlOX1RJQ0tfRU5BQkxFRCkgeworCQluZXh0ID0gbmV4dF90aW1lcl9pbnRlcnJ1cHQoKTsKKwkJZG8geworCQkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7CisJCQlkeW5fdGljay0+cmVwcm9ncmFtKG5leHQgLSBqaWZmaWVzKTsKKwkJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR5bl90aWNrLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRpbWVyX3Nob3dfZHluX3RpY2soc3RydWN0IHN5c19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLAorCQkgICAgICAgKHN5c190aW1lci0+ZHluX3RpY2stPnN0YXRlICYgRFlOX1RJQ0tfRU5BQkxFRCkgPj4gMSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRpbWVyX3NldF9keW5fdGljayhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkJICBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgaW50IGVuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMik7CisKKwlpZiAoZW5hYmxlKQorCQl0aW1lcl9keW5fdGlja19lbmFibGUoKTsKKwllbHNlCisJCXRpbWVyX2R5bl90aWNrX2Rpc2FibGUoKTsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBTWVNERVZfQVRUUihkeW5fdGljaywgMDY0NCwgdGltZXJfc2hvd19keW5fdGljaywgdGltZXJfc2V0X2R5bl90aWNrKTsKKworLyoKKyAqIGR5bnRpY2s9ZW5hYmxlfGRpc2FibGUKKyAqLworc3RhdGljIGNoYXIgZHludGlja19zdHJbNF0gX19pbml0ZGF0YSA9ICIiOworCitzdGF0aWMgaW50IF9faW5pdCBkeW50aWNrX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoc3RyKQorCQlzdHJsY3B5KGR5bnRpY2tfc3RyLCBzdHIsIHNpemVvZihkeW50aWNrX3N0cikpOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJkeW50aWNrPSIsIGR5bnRpY2tfc2V0dXApOworI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IHRpbWVyX2luaXRfc3lzZnModm9pZCkKIHsKIAlpbnQgcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZ0aW1lcl9zeXNjbGFzcyk7CkBAIC0xNzYsNyArMjg1LDIyIEBACiAJCXJldHVybiByZXQ7CiAKIAlzeXNfdGltZXItPmRldi5jbHMgPSAmdGltZXJfc3lzY2xhc3M7Ci0JcmV0dXJuIHN5c2Rldl9yZWdpc3Rlcigmc3lzX3RpbWVyLT5kZXYpOworCXJldCA9IHN5c2Rldl9yZWdpc3Rlcigmc3lzX3RpbWVyLT5kZXYpOworCisjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKwlpZiAocmV0ID09IDAgJiYgc3lzX3RpbWVyLT5keW5fdGljaykgeworCQlyZXQgPSBzeXNkZXZfY3JlYXRlX2ZpbGUoJnN5c190aW1lci0+ZGV2LCAmYXR0cl9keW5fdGljayk7CisKKwkJLyoKKwkJICogVHVybiBvbiBkeW5hbWljIHRpY2sgYWZ0ZXIgY2FsaWJyYXRlIGRlbGF5CisJCSAqIGZvciBjb3JyZWN0IGJvZ29taXBzCisJCSAqLworCQlpZiAocmV0ID09IDAgJiYgZHludGlja19zdHJbMF0gPT0gJ2UnKQorCQkJcmV0ID0gdGltZXJfZHluX3RpY2tfZW5hYmxlKCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcmV0OwogfQogZGV2aWNlX2luaXRjYWxsKHRpbWVyX2luaXRfc3lzZnMpOwogCkBAIC0yMDAsNiArMzI0LDExIEBACiAJc3lzX3RpbWVyID0gZ2V0X3N5c190aW1lcigpOwogCXByaW50ayhLRVJOX0lORk8gIlVzaW5nICVzIGZvciBzeXN0ZW0gdGltZXJcbiIsIHN5c190aW1lci0+bmFtZSk7CiAKKyNpZmRlZiBDT05GSUdfTk9fSURMRV9IWgorCWlmIChzeXNfdGltZXItPmR5bl90aWNrKQorCQlzcGluX2xvY2tfaW5pdCgmc3lzX3RpbWVyLT5keW5fdGljay0+bG9jayk7CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1NIX0tHREIpCiAJLyoKIAkgKiBTZXQgdXAga2dkYiBhcyByZXF1ZXN0ZWQuIFdlIGRvIGl0IGhlcmUgYmVjYXVzZSB0aGUgc2VyaWFsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvTWFrZWZpbGUKaW5kZXggMTUxYTZhMy4uYmNmMjQ0ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy9NYWtlZmlsZQpAQCAtNSw0ICs1LDYgQEAKIG9iai15CTo9IHRpbWVyLm8KIAogb2JqLSQoQ09ORklHX1NIX1RNVSkJCSs9IHRpbWVyLXRtdS5vCitvYmotJChDT05GSUdfU0hfTVRVMikJCSs9IHRpbWVyLW10dTIubworb2JqLSQoQ09ORklHX1NIX0NNVCkJCSs9IHRpbWVyLWNtdC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci1jbXQuYyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci1jbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTc0YjkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLWNtdC5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLWNtdC5jIC0gQ01UIFRpbWVyIFN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBZb3NoaW5vcmkgU2F0bworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCisjZGVmaW5lIENNVF9DTVNUUgkweGY4NGEwMDcwCisjZGVmaW5lIENNVF9DTUNTUl8wCTB4Zjg0YTAwNzIKKyNkZWZpbmUgQ01UX0NNQ05UXzAJMHhmODRhMDA3NAorI2RlZmluZSBDTVRfQ01DT1JfMAkweGY4NGEwMDc2CisjZGVmaW5lIENNVF9DTUNTUl8xCTB4Zjg0YTAwNzgKKyNkZWZpbmUgQ01UX0NNQ05UXzEJMHhmODRhMDA3YQorI2RlZmluZSBDTVRfQ01DT1JfMQkweGY4NGEwMDdjCisKKyNkZWZpbmUgU1RCQ1IzCQkweGY4MGEwMDAwCisjZGVmaW5lIGNtdF9jbG9ja19lbmFibGUoKSBkbyB7CWN0cmxfb3V0YihjdHJsX2luYihTVEJDUjMpICYgfjB4MTAsIFNUQkNSMyk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQ01UX0NNQ1NSX0lOSVQJMHgwMDQwCisjZGVmaW5lIENNVF9DTUNTUl9DQUxJQgkweDAwMDAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNikKKyNkZWZpbmUgQ01UX0NNU1RSCTB4ZmZmZWMwMDAKKyNkZWZpbmUgQ01UX0NNQ1NSXzAJMHhmZmZlYzAwMgorI2RlZmluZSBDTVRfQ01DTlRfMAkweGZmZmVjMDA0CisjZGVmaW5lIENNVF9DTUNPUl8wCTB4ZmZmZWMwMDYKKworI2RlZmluZSBTVEJDUjQJCTB4ZmZmZTA0MGMKKyNkZWZpbmUgY210X2Nsb2NrX2VuYWJsZSgpIGRvIHsJY3RybF9vdXRiKGN0cmxfaW5iKFNUQkNSNCkgJiB+MHgwNCwgU1RCQ1I0KTsgfSB3aGlsZSgwKQorI2RlZmluZSBDTVRfQ01DU1JfSU5JVAkweDAwNDAKKyNkZWZpbmUgQ01UX0NNQ1NSX0NBTElCCTB4MDAwMAorI2Vsc2UKKyNlcnJvciAiVW5rbm93biBDUFUgU1VCVFlQRSIKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbXRfdGltZXJfZ2V0X29mZnNldCh2b2lkKQoreworCWludCBjb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgY291bnRfcCA9IDB4ZmZmZjsgICAgLyogZm9yIHRoZSBmaXJzdCBjYWxsIGFmdGVyIGJvb3QgKi8KKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBqaWZmaWVzX3AgPSAwOworCisJLyoKKwkgKiBjYWNoZSB2b2xhdGlsZSBqaWZmaWVzIHRlbXBvcmFyaWx5OyB3ZSBoYXZlIElSUXMgdHVybmVkIG9mZi4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfdDsKKworCS8qIHRpbWVyIGNvdW50IG1heSB1bmRlcmZsb3cgcmlnaHQgaGVyZSAqLworCWNvdW50ID0gIGN0cmxfaW53KENNVF9DTUNPUl8wKTsKKwljb3VudCAtPSBjdHJsX2ludyhDTVRfQ01DTlRfMCk7CisKKwlqaWZmaWVzX3QgPSBqaWZmaWVzOworCisJLyoKKwkgKiBhdm9pZGluZyB0aW1lciBpbmNvbnNpc3RlbmNpZXMgKHRoZXkgYXJlIHJhcmUsIGJ1dCB0aGV5IGhhcHBlbikuLi4KKwkgKiB0aGVyZSBpcyBvbmUga2luZCBvZiBwcm9ibGVtIHRoYXQgbXVzdCBiZSBhdm9pZGVkIGhlcmU6CisJICogIDEuIHRoZSB0aW1lciBjb3VudGVyIHVuZGVyZmxvd3MKKwkgKi8KKworCWlmIChqaWZmaWVzX3QgPT0gamlmZmllc19wKSB7CisJCWlmIChjb3VudCA+IGNvdW50X3ApIHsKKwkJCS8qIHRoZSBudXRjYXNlICovCisJCQlpZiAoY3RybF9pbncoQ01UX0NNQ1NSXzApICYgMHg4MCkgeyAvKiBDaGVjayBDTUYgYml0ICovCisJCQkJY291bnQgLT0gTEFUQ0g7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiJXMgKCk6IGhhcmR3YXJlIHRpbWVyIHByb2JsZW0/XG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJfQorCQl9CisJfSBlbHNlCisJCWppZmZpZXNfcCA9IGppZmZpZXNfdDsKKworCWNvdW50X3AgPSBjb3VudDsKKworCWNvdW50ID0gKChMQVRDSC0xKSAtIGNvdW50KSAqIFRJQ0tfU0laRTsKKwljb3VudCA9IChjb3VudCArIExBVENILzIpIC8gTEFUQ0g7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjbXRfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXR1czsKKworCS8qIENsZWFyIENNRiBiaXQgKi8KKwl0aW1lcl9zdGF0dXMgPSBjdHJsX2ludyhDTVRfQ01DU1JfMCk7CisJdGltZXJfc3RhdHVzICY9IH4weDgwOworCWN0cmxfb3V0dyh0aW1lcl9zdGF0dXMsIENNVF9DTUNTUl8wKTsKKworCS8qCisJICogSGVyZSB3ZSBhcmUgaW4gdGhlIHRpbWVyIGlycSBoYW5kbGVyLiBXZSBqdXN0IGhhdmUgaXJxcyBsb2NhbGx5CisJICogZGlzYWJsZWQgYnV0IHdlIGRvbid0IGtub3cgaWYgdGhlIHRpbWVyX2JoIGlzIHJ1bm5pbmcgb24gdGhlIG90aGVyCisJICogQ1BVLiBXZSBuZWVkIHRvIGF2b2lkIHRvIFNNUCByYWNlIHdpdGggaXQuIE5PVEU6IHdlIGRvbicgdCBuZWVkCisJICogdGhlIGlycSB2ZXJzaW9uIG9mIHdyaXRlX2xvY2sgYmVjYXVzZSBhcyBqdXN0IHNhaWQgd2UgaGF2ZSBpcnEKKwkgKiBsb2NhbGx5IGRpc2FibGVkLiAtYXJjYQorCSAqLworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCWhhbmRsZV90aW1lcl90aWNrKCk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY210X2lycSA9IHsKKwkubmFtZQkJPSAidGltZXIiLAorCS5oYW5kbGVyCT0gY210X3RpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCisJLm1hc2sJCT0gQ1BVX01BU0tfTk9ORSwKK307CisKK3N0YXRpYyB2b2lkIGNtdF9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJdTggZGl2aXNvciA9IENNVF9DTUNTUl9JTklUICYgMHgzOworCWN0cmxfaW53KENNVF9DTUNTUl8wKTsKKwljdHJsX291dHcoQ01UX0NNQ1NSX0lOSVQsIENNVF9DTUNTUl8wKTsKKwljbGstPnBhcmVudCA9IGNsa19nZXQoTlVMTCwgIm1vZHVsZV9jbGsiKTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvICg4IDw8IChkaXZpc29yIDw8IDEpKTsKK30KKworc3RhdGljIHZvaWQgY210X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCXU4IGRpdmlzb3IgPSBjdHJsX2ludyhDTVRfQ01DU1JfMCkgJiAweDM7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyAoOCA8PCAoZGl2aXNvciA8PCAxKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBjbXRfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBjbXRfY2xrX2luaXQsCisJLnJlY2FsYwkJPSBjbXRfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNtdDBfY2xrID0geworCS5uYW1lCQk9ICJjbXQwX2NsayIsCisJLm9wcwkJPSAmY210X2Nsa19vcHMsCit9OworCitzdGF0aWMgaW50IGNtdF90aW1lcl9zdGFydCh2b2lkKQoreworCWN0cmxfb3V0dyhjdHJsX2ludyhDTVRfQ01TVFIpIHwgMHgwMSwgQ01UX0NNU1RSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbXRfdGltZXJfc3RvcCh2b2lkKQoreworCWN0cmxfb3V0dyhjdHJsX2ludyhDTVRfQ01TVFIpICYgfjB4MDEsIENNVF9DTVNUUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY210X3RpbWVyX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGludGVydmFsOworCisJY210X2Nsb2NrX2VuYWJsZSgpOworCisJc2V0dXBfaXJxKENPTkZJR19TSF9USU1FUl9JUlEsICZjbXRfaXJxKTsKKworCWNtdDBfY2xrLnBhcmVudCA9IGNsa19nZXQoTlVMTCwgIm1vZHVsZV9jbGsiKTsKKworCWNtdF90aW1lcl9zdG9wKCk7CisKKwlpbnRlcnZhbCA9IGNtdDBfY2xrLnBhcmVudC0+cmF0ZSAvIDggLyBIWjsKKwlwcmludGsoS0VSTl9JTkZPICJJbnRlcnZhbCA9ICVsZFxuIiwgaW50ZXJ2YWwpOworCisJY3RybF9vdXR3KGludGVydmFsLCBDTVRfQ01DT1JfMCk7CisKKwljbGtfcmVnaXN0ZXIoJmNtdDBfY2xrKTsKKwljbGtfZW5hYmxlKCZjbXQwX2Nsayk7CisKKwljbXRfdGltZXJfc3RhcnQoKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc3lzX3RpbWVyX29wcyBjbXRfdGltZXJfb3BzID0geworCS5pbml0CQk9IGNtdF90aW1lcl9pbml0LAorCS5zdGFydAkJPSBjbXRfdGltZXJfc3RhcnQsCisJLnN0b3AJCT0gY210X3RpbWVyX3N0b3AsCisjaWZuZGVmIENPTkZJR19HRU5FUklDX1RJTUUKKwkuZ2V0X29mZnNldAk9IGNtdF90aW1lcl9nZXRfb2Zmc2V0LAorI2VuZGlmCit9OworCitzdHJ1Y3Qgc3lzX3RpbWVyIGNtdF90aW1lciA9IHsKKwkubmFtZQk9ICJjbXQiLAorCS5vcHMJPSAmY210X3RpbWVyX29wcywKK307CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItbXR1Mi5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLW10dTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmZjZDFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLW10dTIuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci1tdHUyLmMgLSBNVFUyIFRpbWVyIFN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBQYXVsIE11bmR0CisgKgorICogQmFzZWQgb2ZmIG9mIGFyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisKKy8qCisgKiBXZSB1c2UgY2hhbm5lbCAxIGZvciBvdXIgbG93bHkgc3lzdGVtIHRpbWVyLiBDaGFubmVsIDIgd291bGQgYmUgdGhlIG90aGVyCisgKiBsaWtlbHkgY2FuZGlkYXRlLCBidXQgd2UgbGVhdmUgaXQgYWxvbmUgYXMgaXQgaGFzIGhpZ2hlciBkaXZpc29ycyB0aGF0CisgKiB3b3VsZCBiZSBvZiBtb3JlIHVzZSB0byBvdGhlciBtb3JlIGludGVyZXN0aW5nIGFwcGxpY2F0aW9ucy4KKyAqCisgKiBUT0RPOiBQcmVzZW50bHkgd2Ugb25seSBpbXBsZW1lbnQgYSAxNi1iaXQgc2luZ2xlLWNoYW5uZWwgc3lzdGVtIHRpbWVyLgorICogSG93ZXZlciwgd2UgY2FuIGltcGxlbWVudCBjaGFubmVsIGNhc2NhZGUgaWYgd2UgZ28gdGhlIG92ZXJmbG93IHJvdXRlIGFuZAorICogZ2V0IGF3YXkgd2l0aCB1c2luZyAyIE1UVTIgY2hhbm5lbHMgYXMgYSAzMi1iaXQgdGltZXIuCisgKi8KKyNkZWZpbmUgTVRVMl9UU1RSCTB4ZmZmZTQyODAKKyNkZWZpbmUgTVRVMl9UQ1JfMQkweGZmZmU0MzgwCisjZGVmaW5lIE1UVTJfVE1EUl8xCTB4ZmZmZTQzODEKKyNkZWZpbmUgTVRVMl9USU9SXzEJMHhmZmZlNDM4MgorI2RlZmluZSBNVFUyX1RJRVJfMQkweGZmZmU0Mzg0CisjZGVmaW5lIE1UVTJfVFNSXzEJMHhmZmZlNDM4NQorI2RlZmluZSBNVFUyX1RDTlRfMQkweGZmZmU0Mzg2CS8qIDE2LWJpdCBjb3VudGVyICovCisjZGVmaW5lIE1UVTJfVEdSQV8xCTB4ZmZmZTQzOGEKKworI2RlZmluZSBTVEJDUjMJCTB4ZmZmZTA0MDgKKworI2RlZmluZSBNVFUyX1RTVFJfQ1NUMQkoMSA8PCAxKQkvKiBDb3VudGVyIFN0YXJ0IDEgKi8KKworI2RlZmluZSBNVFUyX1RTUl9UR0ZBCSgxIDw8IDApCS8qIEdSQSBjb21wYXJlIG1hdGNoICovCisKKyNkZWZpbmUgTVRVMl9USUVSX1RHSUVBCSgxIDw8IDApCS8qIEdSQSBjb21wYXJlIG1hdGNoICBpbnRlcnJ1cHQgZW5hYmxlICovCisKKyNkZWZpbmUgTVRVMl9UQ1JfSU5JVAkweDIyCisKKyNkZWZpbmUgTVRVMl9UQ1JfQ0FMSUIgIDB4MDAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbXR1Ml90aW1lcl9nZXRfb2Zmc2V0KHZvaWQpCit7CisJaW50IGNvdW50OworCXN0YXRpYyBpbnQgY291bnRfcCA9IDB4N2ZmZjsJLyogZm9yIHRoZSBmaXJzdCBjYWxsIGFmdGVyIGJvb3QgKi8KKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBqaWZmaWVzX3AgPSAwOworCisJLyoKKwkgKiBjYWNoZSB2b2xhdGlsZSBqaWZmaWVzIHRlbXBvcmFyaWx5OyB3ZSBoYXZlIElSUXMgdHVybmVkIG9mZi4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfdDsKKworCS8qIHRpbWVyIGNvdW50IG1heSB1bmRlcmZsb3cgcmlnaHQgaGVyZSAqLworCWNvdW50ID0gY3RybF9pbncoTVRVMl9UQ05UXzEpOwkvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisKKwlqaWZmaWVzX3QgPSBqaWZmaWVzOworCisJLyoKKwkgKiBhdm9pZGluZyB0aW1lciBpbmNvbnNpc3RlbmNpZXMgKHRoZXkgYXJlIHJhcmUsIGJ1dCB0aGV5IGhhcHBlbikuLi4KKwkgKiB0aGVyZSBpcyBvbmUga2luZCBvZiBwcm9ibGVtIHRoYXQgbXVzdCBiZSBhdm9pZGVkIGhlcmU6CisJICogIDEuIHRoZSB0aW1lciBjb3VudGVyIHVuZGVyZmxvd3MKKwkgKi8KKworCWlmIChqaWZmaWVzX3QgPT0gamlmZmllc19wKSB7CisJCWlmIChjb3VudCA+IGNvdW50X3ApIHsKKwkJCWlmIChjdHJsX2luYihNVFUyX1RTUl8xKSAmIE1UVTJfVFNSX1RHRkEpIHsKKwkJCQljb3VudCAtPSBMQVRDSDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKCIlcyAoKTogaGFyZHdhcmUgdGltZXIgcHJvYmxlbT9cbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJamlmZmllc19wID0gamlmZmllc190OworCisJY291bnRfcCA9IGNvdW50OworCisJY291bnQgPSAoKExBVENILTEpIC0gY291bnQpICogVElDS19TSVpFOworCWNvdW50ID0gKGNvdW50ICsgTEFUQ0gvMikgLyBMQVRDSDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGlycXJldHVybl90IG10dTJfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXR1czsKKworCS8qIENsZWFyIFRHRkEgYml0ICovCisJdGltZXJfc3RhdHVzID0gY3RybF9pbmIoTVRVMl9UU1JfMSk7CisJdGltZXJfc3RhdHVzICY9IH5NVFUyX1RTUl9UR0ZBOworCWN0cmxfb3V0Yih0aW1lcl9zdGF0dXMsIE1UVTJfVFNSXzEpOworCisJLyogRG8gdGltZXIgdGljayAqLworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCWhhbmRsZV90aW1lcl90aWNrKCk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbXR1Ml9pcnEgPSB7CisJLm5hbWUJCT0gInRpbWVyIiwKKwkuaGFuZGxlcgk9IG10dTJfdGltZXJfaW50ZXJydXB0LAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiwKKwkubWFzawkJPSBDUFVfTUFTS19OT05FLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkaXZpc29yc1tdID0geyAxLCA0LCAxNiwgNjQsIDEsIDEsIDI1NiB9OworCitzdGF0aWMgdm9pZCBtdHUyX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1OCBpZHggPSBNVFUyX1RDUl9JTklUICYgMHg3OworCisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkaXZpc29yc1tpZHhdOworCS8qIFN0YXJ0IFRDTlQgY291bnRpbmcgKi8KKwljdHJsX291dGIoY3RybF9pbmIoTVRVMl9UU1RSKSB8IE1UVTJfVFNUUl9DU1QxLCBNVFUyX1RTVFIpOworCit9CisKK3N0YXRpYyB2b2lkIG10dTJfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJdTggaWR4ID0gY3RybF9pbmIoTVRVMl9UQ1JfMSkgJiAweDc7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgbXR1Ml9jbGtfb3BzID0geworCS5pbml0CQk9IG10dTJfY2xrX2luaXQsCisJLnJlY2FsYwkJPSBtdHUyX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtdHUyX2NsazEgPSB7CisJLm5hbWUJCT0gIm10dTJfY2xrMSIsCisJLm9wcwkJPSAmbXR1Ml9jbGtfb3BzLAorfTsKKworc3RhdGljIGludCBtdHUyX3RpbWVyX3N0YXJ0KHZvaWQpCit7CisJY3RybF9vdXRiKGN0cmxfaW5iKE1UVTJfVFNUUikgfCBNVFUyX1RTVFJfQ1NUMSwgTVRVMl9UU1RSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdHUyX3RpbWVyX3N0b3Aodm9pZCkKK3sKKwljdHJsX291dGIoY3RybF9pbmIoTVRVMl9UU1RSKSAmIH5NVFUyX1RTVFJfQ1NUMSwgTVRVMl9UU1RSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdHUyX3RpbWVyX2luaXQodm9pZCkKK3sKKwl1OCB0bXA7CisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKKworCXNldHVwX2lycShDT05GSUdfU0hfVElNRVJfSVJRLCAmbXR1Ml9pcnEpOworCisJbXR1Ml9jbGsxLnBhcmVudCA9IGNsa19nZXQoTlVMTCwgIm1vZHVsZV9jbGsiKTsKKworCWN0cmxfb3V0YihjdHJsX2luYihTVEJDUjMpICYgKH4weDIwKSwgU1RCQ1IzKTsKKworCS8qIE5vcm1hbCBvcGVyYXRpb24gKi8KKwljdHJsX291dGIoMCwgTVRVMl9UTURSXzEpOworCWN0cmxfb3V0YihNVFUyX1RDUl9JTklULCBNVFUyX1RDUl8xKTsKKwljdHJsX291dGIoMHgwMSwgTVRVMl9USU9SXzEpOworCisJLyogRW5hYmxlIHVuZGVyZmxvdyBpbnRlcnJ1cHQgKi8KKwljdHJsX291dGIoY3RybF9pbmIoTVRVMl9USUVSXzEpIHwgTVRVMl9USUVSX1RHSUVBLCBNVFUyX1RJRVJfMSk7CisKKwlpbnRlcnZhbCA9IENPTkZJR19TSF9QQ0xLX0ZSRVEgLyAxNiAvIEhaOworCXByaW50ayhLRVJOX0lORk8gIkludGVydmFsID0gJWxkXG4iLCBpbnRlcnZhbCk7CisKKwljdHJsX291dHcoaW50ZXJ2YWwsIE1UVTJfVEdSQV8xKTsKKwljdHJsX291dHcoMCwgTVRVMl9UQ05UXzEpOworCisJY2xrX3JlZ2lzdGVyKCZtdHUyX2NsazEpOworCWNsa19lbmFibGUoJm10dTJfY2xrMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHN5c190aW1lcl9vcHMgbXR1Ml90aW1lcl9vcHMgPSB7CisJLmluaXQJCT0gbXR1Ml90aW1lcl9pbml0LAorCS5zdGFydAkJPSBtdHUyX3RpbWVyX3N0YXJ0LAorCS5zdG9wCQk9IG10dTJfdGltZXJfc3RvcCwKKyNpZm5kZWYgQ09ORklHX0dFTkVSSUNfVElNRQorCS5nZXRfb2Zmc2V0CT0gbXR1Ml90aW1lcl9nZXRfb2Zmc2V0LAorI2VuZGlmCit9OworCitzdHJ1Y3Qgc3lzX3RpbWVyIG10dTJfdGltZXIgPSB7CisJLm5hbWUJPSAibXR1MiIsCisJLm9wcwk9ICZtdHUyX3RpbWVyX29wcywKK307CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKaW5kZXggMjQ5MjcwMS4uZTA2MGU3MSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KICNpbmNsdWRlIDxhc20vdGltZXIuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CkBAIC0zMSwxMyArMzAsOSBAQAogCiAjZGVmaW5lIFRNVTBfVENSX0NBTElCCTB4MDAwMAogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRtdTBfbG9jayk7Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRtdV90aW1lcl9nZXRfb2Zmc2V0KHZvaWQpCiB7CiAJaW50IGNvdW50OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlzdGF0aWMgaW50IGNvdW50X3AgPSAweDdmZmZmZmZmOyAgICAvKiBmb3IgdGhlIGZpcnN0IGNhbGwgYWZ0ZXIgYm9vdCAqLwogCXN0YXRpYyB1bnNpZ25lZCBsb25nIGppZmZpZXNfcCA9IDA7CiAKQEAgLTQ2LDcgKzQxLDYgQEAKIAkgKi8KIAl1bnNpZ25lZCBsb25nIGppZmZpZXNfdDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0bXUwX2xvY2ssIGZsYWdzKTsKIAkvKiB0aW1lciBjb3VudCBtYXkgdW5kZXJmbG93IHJpZ2h0IGhlcmUgKi8KIAljb3VudCA9IGN0cmxfaW5sKFRNVTBfVENOVCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KIApAQCAtNzIsNyArNjYsNiBAQAogCQlqaWZmaWVzX3AgPSBqaWZmaWVzX3Q7CiAKIAljb3VudF9wID0gY291bnQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG11MF9sb2NrLCBmbGFncyk7CiAKIAljb3VudCA9ICgoTEFUQ0gtMSkgLSBjb3VudCkgKiBUSUNLX1NJWkU7CiAJY291bnQgPSAoY291bnQgKyBMQVRDSC8yKSAvIExBVENIOwpAQCAtMTA2LDcgKzk5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHRtdV9pcnEgPSB7CiAJLm5hbWUJCT0gInRpbWVyIiwKIAkuaGFuZGxlcgk9IHRtdV90aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQsCisJLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSLAogCS5tYXNrCQk9IENQVV9NQVNLX05PTkUsCiB9OwogCkBAIC0xNDksOSArMTQyLDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGludGVydmFsOwogCi0Jc2V0dXBfaXJxKFRJTUVSX0lSUSwgJnRtdV9pcnEpOworCXNldHVwX2lycShDT05GSUdfU0hfVElNRVJfSVJRLCAmdG11X2lycSk7CiAKLQl0bXUwX2Nsay5wYXJlbnQgPSBjbGtfZ2V0KCJtb2R1bGVfY2xrIik7CisJdG11MF9jbGsucGFyZW50ID0gY2xrX2dldChOVUxMLCAibW9kdWxlX2NsayIpOwogCiAJLyogU3RhcnQgVE1VMCAqLwogCXRtdV90aW1lcl9zdG9wKCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXIuYyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci5jCmluZGV4IGRjMWY2MzEuLmE2YmNjOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci5jCkBAIC0xNyw2ICsxNywxMiBAQAogI2lmZGVmIENPTkZJR19TSF9UTVUKIAkmdG11X3RpbWVyLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1NIX01UVTIKKwkmbXR1Ml90aW1lciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TSF9DTVQKKwkmY210X3RpbWVyLAorI2VuZGlmCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCmluZGV4IGMyYzU5N2UuLmVjMTEwMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwpAQCAtMSw0MyArMSwzMiBAQAotLyogJElkOiB0cmFwcy5jLHYgMS4xNyAyMDA0LzA1LzAyIDAxOjQ2OjMwIHN1Z2lva2EgRXhwICQKLSAqCi0gKiAgbGludXgvYXJjaC9zaC90cmFwcy5jCisvKgorICogJ3RyYXBzLmMnIGhhbmRsZXMgaGFyZHdhcmUgdHJhcHMgYW5kIGZhdWx0cyBhZnRlciB3ZSBoYXZlIHNhdmVkIHNvbWUKKyAqIHN0YXRlIGluICdlbnRyeS5TJy4KICAqCiAgKiAgU3VwZXJIIHZlcnNpb246IENvcHlyaWdodCAoQykgMTk5OSBOaWliZSBZdXRha2EKICAqICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDAwIFBoaWxpcHAgUnVtcGYKICAqICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEhvd2VsbHMKLSAqICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIFBhdWwgTXVuZHQKKyAqICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNiBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQotLyoKLSAqICdUcmFwcy5jJyBoYW5kbGVzIGhhcmR3YXJlIHRyYXBzIGFuZCBmYXVsdHMgYWZ0ZXIgd2UgaGF2ZSBzYXZlZCBzb21lCi0gKiBzdGF0ZSBpbiAnZW50cnkuUycuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgotCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKICNpZmRlZiBDT05GSUdfU0hfS0dEQgogI2luY2x1ZGUgPGFzbS9rZ2RiLmg+Ci0jZGVmaW5lIENIS19SRU1PVEVfREVCVUcocmVncykgICAgICAgICAgICAgICAgIAlcCi17ICAgICAgIAkJCQkJXAorI2RlZmluZSBDSEtfUkVNT1RFX0RFQlVHKHJlZ3MpCQkJXAorewkJCQkJCVwKIAlpZiAoa2dkYl9kZWJ1Z19ob29rICYmICF1c2VyX21vZGUocmVncykpXAogCQkoKmtnZGJfZGVidWdfaG9vaykocmVncyk7ICAgICAgIFwKIH0KQEAgLTQ2LDIwICszNSw0NCBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQ1BVX1NIMgotI2RlZmluZSBUUkFQX1JFU0VSVkVEX0lOU1QJNAotI2RlZmluZSBUUkFQX0lMTEVHQUxfU0xPVF9JTlNUCTYKKyMgZGVmaW5lIFRSQVBfUkVTRVJWRURfSU5TVAk0CisjIGRlZmluZSBUUkFQX0lMTEVHQUxfU0xPVF9JTlNUCTYKKyMgZGVmaW5lIFRSQVBfQUREUkVTU19FUlJPUgk5CisjIGlmZGVmIENPTkZJR19DUFVfU0gyQQorIyAgZGVmaW5lIFRSQVBfRElWWkVST19FUlJPUgkxNworIyAgZGVmaW5lIFRSQVBfRElWT1ZGX0VSUk9SCTE4CisjIGVuZGlmCiAjZWxzZQogI2RlZmluZSBUUkFQX1JFU0VSVkVEX0lOU1QJMTIKICNkZWZpbmUgVFJBUF9JTExFR0FMX1NMT1RfSU5TVAkxMwogI2VuZGlmCiAKLS8qCi0gKiBUaGVzZSBjb25zdGFudHMgYXJlIGZvciBzZWFyY2hpbmcgZm9yIHBvc3NpYmxlIG1vZHVsZSB0ZXh0Ci0gKiBzZWdtZW50cy4gIFZNQUxMT0NfT0ZGU0VUIGNvbWVzIGZyb20gbW0vdm1hbGxvYy5jOyBNT0RVTEVfUkFOR0UgaXMKLSAqIGEgZ3Vlc3Mgb2YgaG93IG11Y2ggc3BhY2UgaXMgbGlrZWx5IHRvIGJlIHZtYWxsb2NlZC4KLSAqLwotI2RlZmluZSBWTUFMTE9DX09GRlNFVCAoOCoxMDI0KjEwMjQpCi0jZGVmaW5lIE1PRFVMRV9SQU5HRSAoOCoxMDI0KjEwMjQpCitzdGF0aWMgdm9pZCBkdW1wX21lbShjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgYm90dG9tLCB1bnNpZ25lZCBsb25nIHRvcCkKK3sKKwl1bnNpZ25lZCBsb25nIHA7CisJaW50IGk7CisKKwlwcmludGsoIiVzKDB4JTA4bHggdG8gMHglMDhseClcbiIsIHN0ciwgYm90dG9tLCB0b3ApOworCisJZm9yIChwID0gYm90dG9tICYgfjMxOyBwIDwgdG9wOyApIHsKKwkJcHJpbnRrKCIlMDRseDogIiwgcCAmIDB4ZmZmZik7CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgcCArPSA0KSB7CisJCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCQlpZiAocCA8IGJvdHRvbSB8fCBwID49IHRvcCkKKwkJCQlwcmludGsoIiAgICAgICAgICIpOworCQkJZWxzZSB7CisJCQkJaWYgKF9fZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKXApKSB7CisJCQkJCXByaW50aygiXG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlwcmludGsoIiUwOHggIiwgdmFsKTsKKwkJCX0KKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorfQogCiBERUZJTkVfU1BJTkxPQ0soZGllX2xvY2spOwogCkBAIC02OSwyMSArODIsMzMgQEAKIAogCWNvbnNvbGVfdmVyYm9zZSgpOwogCXNwaW5fbG9ja19pcnEoJmRpZV9sb2NrKTsKKwlidXN0X3NwaW5sb2NrcygxKTsKKwogCXByaW50aygiJXM6ICUwNGx4IFsjJWRdXG4iLCBzdHIsIGVyciAmIDB4ZmZmZiwgKytkaWVfY291bnRlcik7CisKIAlDSEtfUkVNT1RFX0RFQlVHKHJlZ3MpOworCXByaW50X21vZHVsZXMoKTsKIAlzaG93X3JlZ3MocmVncyk7CisKKwlwcmludGsoIlByb2Nlc3M6ICVzIChwaWQ6ICVkLCBzdGFjayBsaW1pdCA9ICVwKVxuIiwKKwkgICAgICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCB0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCkgKyAxKTsKKworCWlmICghdXNlcl9tb2RlKHJlZ3MpIHx8IGluX2ludGVycnVwdCgpKQorCQlkdW1wX21lbSgiU3RhY2s6ICIsIHJlZ3MtPnJlZ3NbMTVdLCBUSFJFQURfU0laRSArCisJCQkgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGN1cnJlbnQpKTsKKworCWJ1c3Rfc3BpbmxvY2tzKDApOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCWRvX2V4aXQoU0lHU0VHVik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnIpCitzdGF0aWMgaW5saW5lIHZvaWQgZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCSBsb25nIGVycikKIHsKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJZGllKHN0ciwgcmVncywgZXJyKTsKIH0KIAotc3RhdGljIGludCBoYW5kbGVfdW5hbGlnbmVkX25vdGlmeV9jb3VudCA9IDEwOwotCiAvKgogICogdHJ5IGFuZCBmaXggdXAga2VybmVsc3BhY2UgYWRkcmVzcyBlcnJvcnMKICAqIC0gdXNlcnNwYWNlIGVycm9ycyBqdXN0IGNhdXNlIEVGQVVMVCB0byBiZSByZXR1cm5lZCwgcmVzdWx0aW5nIGluIFNFR1YKQEAgLTkzLDggKzExOCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZGllX2lmX25vX2ZpeHVwKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnIpCiB7Ci0JaWYgKCF1c2VyX21vZGUocmVncykpCi0JeworCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOwogCQlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPnBjKTsKIAkJaWYgKGZpeHVwKSB7CkBAIC0xMDYsNiArMTMwLDQwIEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfQlVHCisjaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19idWdfdmVyYm9zZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYnVnX2ZyYW1lIGY7CisJbG9uZyBsZW47CisKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmZiwgKGNvbnN0IHZvaWQgX191c2VyICopcmVncy0+cGMsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgYnVnX2ZyYW1lKSkpCisJCXJldHVybjsKKworCWxlbiA9IF9fc3Rybmxlbl91c2VyKGYuZmlsZSwgUEFUSF9NQVgpIC0gMTsKKwlpZiAodW5saWtlbHkobGVuIDwgMCB8fCBsZW4gPj0gUEFUSF9NQVgpKQorCQlmLmZpbGUgPSAiPGJhZCBmaWxlbmFtZT4iOworCWxlbiA9IF9fc3Rybmxlbl91c2VyKGYuZnVuYywgUEFUSF9NQVgpIC0gMTsKKwlpZiAodW5saWtlbHkobGVuIDwgMCB8fCBsZW4gPj0gUEFUSF9NQVgpKQorCQlmLmZ1bmMgPSAiPGJhZCBmdW5jdGlvbj4iOworCisJcHJpbnRrKEtFUk5fQUxFUlQgImtlcm5lbCBCVUcgaW4gJXMoKSBhdCAlczolZCFcbiIsCisJICAgICAgIGYuZnVuYywgZi5maWxlLCBmLmxpbmUpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19idWdfdmVyYm9zZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSAqLworI2VuZGlmIC8qIENPTkZJR19CVUcgKi8KKwordm9pZCBoYW5kbGVfQlVHKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRvX2J1Z192ZXJib3NlKHJlZ3MpOworCWRpZSgiS2VybmVsIEJVRyIsIHJlZ3MsIFRSQVBBX0JVR19PUENPREUgJiAweGZmKTsKK30KKwogLyoKICAqIGhhbmRsZSBhbiBpbnN0cnVjdGlvbiB0aGF0IGRvZXMgYW4gdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgYnkgZW11bGF0aW5nIHRoZQogICogZGVzaXJlZCBiZWhhdmlvdXIKQEAgLTE3OSw3ICsyMzcsNyBAQAogCQlpZiAoY29weV90b191c2VyKGRzdCxzcmMsNCkpCiAJCQlnb3RvIGZldGNoX2ZhdWx0OwogCQlyZXQgPSAwOwotIAkJYnJlYWs7CisJCWJyZWFrOwogCiAJY2FzZSAyOiAvKiBtb3YuW2J3bF0gdG8gbWVtb3J5LCBwb3NzaWJseSB3aXRoIHByZS1kZWNyZW1lbnQgKi8KIAkJaWYgKGluc3RydWN0aW9uICYgNCkKQEAgLTIwMyw3ICsyNjEsNyBAQAogCQlpZiAoY29weV9mcm9tX3VzZXIoZHN0LHNyYyw0KSkKIAkJCWdvdG8gZmV0Y2hfZmF1bHQ7CiAJCXJldCA9IDA7Ci0gCQlicmVhazsKKwkJYnJlYWs7CiAKIAljYXNlIDY6CS8qIG1vdi5bYndsXSBmcm9tIG1lbW9yeSwgcG9zc2libHkgd2l0aCBwb3N0LWluY3JlbWVudCAqLwogCQlzcmMgPSAodW5zaWduZWQgY2hhciopICpybTsKQEAgLTIxMSw3ICsyNjksNyBAQAogCQkJKnJtICs9IGNvdW50OwogCQlkc3QgPSAodW5zaWduZWQgY2hhciopIHJuOwogCQkqKHVuc2lnbmVkIGxvbmcqKWRzdCA9IDA7Ci0JCQorCiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KIAkJaWYgKGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBjb3VudCkpCiAJCQlnb3RvIGZldGNoX2ZhdWx0OwpAQCAtMjIyLDcgKzI4MCw3IEBACiAJCX0KICNlbHNlCiAJCWRzdCArPSA0LWNvdW50OwotCQkKKwogCQlpZiAoY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIGNvdW50KSkKIAkJCWdvdG8gZmV0Y2hfZmF1bHQ7CiAKQEAgLTMwMSw3ICszNTksOCBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJLyoga2VybmVsICovCi0JCWRpZSgiZGVsYXktc2xvdC1pbnNuIGZhdWx0aW5nIGluIGhhbmRsZV91bmFsaWduZWRfZGVsYXlzbG90IiwgcmVncywgMCk7CisJCWRpZSgiZGVsYXktc2xvdC1pbnNuIGZhdWx0aW5nIGluIGhhbmRsZV91bmFsaWduZWRfZGVsYXlzbG90IiwKKwkJICAgIHJlZ3MsIDApOwogCX0KIAogCXJldHVybiBoYW5kbGVfdW5hbGlnbmVkX2lucyhpbnN0cnVjdGlvbixyZWdzKTsKQEAgLTMyMyw2ICszODIsMTMgQEAKICNkZWZpbmUgU0hfUENfOEJJVF9PRkZTRVQoaW5zdHIpICgoKChzaWduZWQgY2hhcikoaW5zdHIpKSoyKSArIDQpCiAjZGVmaW5lIFNIX1BDXzEyQklUX09GRlNFVChpbnN0cikgKCgoKHNpZ25lZCBzaG9ydCkoaW5zdHI8PDQpKT4+MykgKyA0KQogCisvKgorICogWFhYOiBTSC0yQSBuZWVkcyB0aGlzIHRvbywgYnV0IGl0IG5lZWRzIGFuIG92ZXJoYXVsIHRoYW5rcyB0byBtaXhlZCAzMi1iaXQKKyAqIG9wY29kZXMuLgorICovCisjaWZuZGVmIENPTkZJR19DUFVfU0gyQQorc3RhdGljIGludCBoYW5kbGVfdW5hbGlnbmVkX25vdGlmeV9jb3VudCA9IDEwOworCiBzdGF0aWMgaW50IGhhbmRsZV91bmFsaWduZWRfYWNjZXNzKHUxNiBpbnN0cnVjdGlvbiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdV9pbnQgcm07CkBAIC0zMzUsNyArNDAxLDggQEAKIAlpZiAodXNlcl9tb2RlKHJlZ3MpICYmIGhhbmRsZV91bmFsaWduZWRfbm90aWZ5X2NvdW50PjApIHsKIAkJaGFuZGxlX3VuYWxpZ25lZF9ub3RpZnlfY291bnQtLTsKIAotCQlwcmludGsoIkZpeGluZyB1cCB1bmFsaWduZWQgdXNlcnNwYWNlIGFjY2VzcyBpbiBcIiVzXCIgcGlkPSVkIHBjPTB4JXAgaW5zPTB4JTA0aHhcbiIsCisJCXByaW50ayhLRVJOX05PVElDRSAiRml4aW5nIHVwIHVuYWxpZ25lZCB1c2Vyc3BhY2UgYWNjZXNzICIKKwkJICAgICAgICJpbiBcIiVzXCIgcGlkPSVkIHBjPTB4JXAgaW5zPTB4JTA0aHhcbiIsCiAJCSAgICAgICBjdXJyZW50LT5jb21tLGN1cnJlbnQtPnBpZCwodTE2KilyZWdzLT5wYyxpbnN0cnVjdGlvbik7CiAJfQogCkBAIC00NTksMzIgKzUyNiw1OCBAQAogCQlyZWdzLT5wYyArPSAyOwogCXJldHVybiByZXQ7CiB9CisjZW5kaWYgLyogQ09ORklHX0NQVV9TSDJBICovCisKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19TUl9SQgorI2RlZmluZSBsb29rdXBfZXhjZXB0aW9uX3ZlY3Rvcih4KQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzdGMgcjJfYmFuaywgJTBcblx0IiA6ICI9ciIgKCh4KSkpCisjZWxzZQorI2RlZmluZSBsb29rdXBfZXhjZXB0aW9uX3ZlY3Rvcih4KQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3YgcjQsICUwXG5cdCIgOiAiPXIiICgoeCkpKQorI2VuZGlmCiAKIC8qCi0gKiBIYW5kbGUgdmFyaW91cyBhZGRyZXNzIGVycm9yIGV4Y2VwdGlvbnMKKyAqIEhhbmRsZSB2YXJpb3VzIGFkZHJlc3MgZXJyb3IgZXhjZXB0aW9uczoKKyAqICAtIGluc3RydWN0aW9uIGFkZHJlc3MgZXJyb3I6CisgKiAgICAgICBtaXNhbGlnbmVkIFBDCisgKiAgICAgICBQQyA+PSAweDgwMDAwMDAwIGluIHVzZXIgbW9kZQorICogIC0gZGF0YSBhZGRyZXNzIGVycm9yIChyZWFkIGFuZCB3cml0ZSkKKyAqICAgICAgIG1pc2FsaWduZWQgZGF0YSBhY2Nlc3MKKyAqICAgICAgIGFjY2VzcyB0byA+PSAweDgwMDAwMDAwIGlzIHVzZXIgbW9kZQorICogVW5mb3J0dW50YWx5IHdlIGNhbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5zdHJ1Y3Rpb24gYWRkcmVzcyBlcnJvcgorICogYW5kIGRhdGEgYWRkcmVzcyBlcnJvcnMgY2F1c2VkIGJ5IHJlYWQgYWNjZXNlcy4KICAqLwotYXNtbGlua2FnZSB2b2lkIGRvX2FkZHJlc3NfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIAorYXNtbGlua2FnZSB2b2lkIGRvX2FkZHJlc3NfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkJIHVuc2lnbmVkIGxvbmcgd3JpdGVhY2Nlc3MsCiAJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQl1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisJdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlID0gMDsKIAltbV9zZWdtZW50X3Qgb2xkZnM7CisJc2lnaW5mb190IGluZm87CisjaWZuZGVmIENPTkZJR19DUFVfU0gyQQogCXUxNiBpbnN0cnVjdGlvbjsKIAlpbnQgdG1wOworI2VuZGlmCiAKLQlhc20gdm9sYXRpbGUoInN0YyAgICAgICByMl9iYW5rLCUwIjogIj1yIiAoZXJyb3JfY29kZSkpOworCS8qIEludGVudGlvbmFsIGlmZGVmICovCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfU1JfUkIKKwlsb29rdXBfZXhjZXB0aW9uX3ZlY3RvcihlcnJvcl9jb2RlKTsKKyNlbmRpZgogCiAJb2xkZnMgPSBnZXRfZnMoKTsKIAogCWlmICh1c2VyX21vZGUocmVncykpIHsKKwkJaW50IHNpX2NvZGUgPSBCVVNfQURSRVJSOworCiAJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotCQljdXJyZW50LT50aHJlYWQudHJhcF9ubyA9ICh3cml0ZWFjY2VzcykgPyA4IDogNzsKIAogCQkvKiBiYWQgUEMgaXMgbm90IHNvbWV0aGluZyB3ZSBjYW4gZml4ICovCi0JCWlmIChyZWdzLT5wYyAmIDEpCisJCWlmIChyZWdzLT5wYyAmIDEpIHsKKwkJCXNpX2NvZGUgPSBCVVNfQURSQUxOOwogCQkJZ290byB1c3BhY2Vfc2VndjsKKwkJfQogCisjaWZuZGVmIENPTkZJR19DUFVfU0gyQQogCQlzZXRfZnMoVVNFUl9EUyk7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zdHJ1Y3Rpb24sICh1MTYgKikocmVncy0+cGMpLCAyKSkgewogCQkJLyogQXJnaC4gRmF1bHQgb24gdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KQEAgLTQ5OSwxNCArNTkyLDIzIEBACiAKIAkJaWYgKHRtcD09MCkKIAkJCXJldHVybjsgLyogc29ydGVkICovCisjZW5kaWYKIAotCXVzcGFjZV9zZWd2OgotCQlwcmludGsoS0VSTl9OT1RJQ0UgIktpbGxpbmcgcHJvY2VzcyBcIiVzXCIgZHVlIHRvIHVuYWxpZ25lZCBhY2Nlc3NcbiIsIGN1cnJlbnQtPmNvbW0pOwotCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7Cit1c3BhY2Vfc2VndjoKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJTZW5kaW5nIFNJR0JVUyB0byBcIiVzXCIgZHVlIHRvIHVuYWxpZ25lZCAiCisJCSAgICAgICAiYWNjZXNzIChQQyAlbHggUFIgJWx4KVxuIiwgY3VycmVudC0+Y29tbSwgcmVncy0+cGMsCisJCSAgICAgICByZWdzLT5wcik7CisKKwkJaW5mby5zaV9zaWdubyA9IFNJR0JVUzsKKwkJaW5mby5zaV9lcnJubyA9IDA7CisJCWluZm8uc2lfY29kZSA9IHNpX2NvZGU7CisJCWluZm8uc2lfYWRkciA9ICh2b2lkICopIGFkZHJlc3M7CisJCWZvcmNlX3NpZ19pbmZvKFNJR0JVUywgJmluZm8sIGN1cnJlbnQpOwogCX0gZWxzZSB7CiAJCWlmIChyZWdzLT5wYyAmIDEpCiAJCQlkaWUoInVuYWxpZ25lZCBwcm9ncmFtIGNvdW50ZXIiLCByZWdzLCBlcnJvcl9jb2RlKTsKIAorI2lmbmRlZiBDT05GSUdfQ1BVX1NIMkEKIAkJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zdHJ1Y3Rpb24sICh1MTYgKikocmVncy0+cGMpLCAyKSkgewogCQkJLyogQXJnaC4gRmF1bHQgb24gdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KQEAgLTUxOCw2ICs2MjAsMTIgQEAKIAogCQloYW5kbGVfdW5hbGlnbmVkX2FjY2VzcyhpbnN0cnVjdGlvbiwgcmVncyk7CiAJCXNldF9mcyhvbGRmcyk7CisjZWxzZQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIktpbGxpbmcgcHJvY2VzcyBcIiVzXCIgZHVlIHRvIHVuYWxpZ25lZCAiCisJCSAgICAgICAiYWNjZXNzXG4iLCBjdXJyZW50LT5jb21tKTsKKworCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisjZW5kaWYKIAl9CiB9CiAKQEAgLTUyOSw3ICs2MzcsNyBAQAogewogCXVuc2lnbmVkIHNob3J0IGluc3Q7CiAKLQkvKiAKKwkvKgogCSAqIFNhZmUgZ3VhcmQgaWYgRFNQIG1vZGUgaXMgYWxyZWFkeSBlbmFibGVkIG9yIHdlJ3JlIGxhY2tpbmcKIAkgKiB0aGUgRFNQIGFsdG9nZXRoZXIuCiAJICovCkBAIC01NTAsMjQgKzY1OCw0OSBAQAogI2RlZmluZSBpc19kc3BfaW5zdChyZWdzKQkoMCkKICNlbmRpZiAvKiBDT05GSUdfU0hfRFNQICovCiAKLWV4dGVybiBpbnQgZG9fZnB1X2luc3QodW5zaWduZWQgc2hvcnQsIHN0cnVjdCBwdF9yZWdzKik7CisjaWZkZWYgQ09ORklHX0NQVV9TSDJBCithc21saW5rYWdlIHZvaWQgZG9fZGl2aWRlX2Vycm9yKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisJCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOworCXNpZ2luZm9fdCBpbmZvOworCisJc3dpdGNoIChyNCkgeworCWNhc2UgVFJBUF9ESVZaRVJPX0VSUk9SOgorCQlpbmZvLnNpX2NvZGUgPSBGUEVfSU5URElWOworCQlicmVhazsKKwljYXNlIFRSQVBfRElWT1ZGX0VSUk9SOgorCQlpbmZvLnNpX2NvZGUgPSBGUEVfSU5UT1ZGOworCQlicmVhazsKKwl9CisKKwlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCBjdXJyZW50KTsKK30KKyNlbmRpZgorCisvKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2ZwdS5jICovCitleHRlcm4gaW50IGRvX2ZwdV9pbnN0KHVuc2lnbmVkIHNob3J0LCBzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZG9fZnB1X3N0YXRlX3Jlc3RvcmUodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywgc3RydWN0IHB0X3JlZ3MgX19yZWdzKTsKIAogYXNtbGlua2FnZSB2b2lkIGRvX3Jlc2VydmVkX2luc3QodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKIAkJCQl1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAotCQkJCXN0cnVjdCBwdF9yZWdzIHJlZ3MpCisJCQkJc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAl1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCiAjaWZkZWYgQ09ORklHX1NIX0ZQVV9FTVUKLQl1bnNpZ25lZCBzaG9ydCBpbnN0OworCXVuc2lnbmVkIHNob3J0IGluc3QgPSAwOwogCWludCBlcnI7CiAKLQlnZXRfdXNlcihpbnN0LCAodW5zaWduZWQgc2hvcnQqKXJlZ3MucGMpOworCWdldF91c2VyKGluc3QsICh1bnNpZ25lZCBzaG9ydCopcmVncy0+cGMpOwogCi0JZXJyID0gZG9fZnB1X2luc3QoaW5zdCwgJnJlZ3MpOworCWVyciA9IGRvX2ZwdV9pbnN0KGluc3QsIHJlZ3MpOwogCWlmICghZXJyKSB7Ci0JCXJlZ3MucGMgKz0gMjsKKwkJcmVncy0+cGMgKz0gMjsKIAkJcmV0dXJuOwogCX0KIAkvKiBub3QgYSBGUFUgaW5zdC4gKi8KQEAgLTU3NSwyMCArNzA4LDE5IEBACiAKICNpZmRlZiBDT05GSUdfU0hfRFNQCiAJLyogQ2hlY2sgaWYgaXQncyBhIERTUCBpbnN0cnVjdGlvbiAqLwotIAlpZiAoaXNfZHNwX2luc3QoJnJlZ3MpKSB7CisJaWYgKGlzX2RzcF9pbnN0KHJlZ3MpKSB7CiAJCS8qIEVuYWJsZSBEU1AgbW9kZSwgYW5kIHJlc3RhcnQgaW5zdHJ1Y3Rpb24uICovCi0JCXJlZ3Muc3IgfD0gU1JfRFNQOworCQlyZWdzLT5zciB8PSBTUl9EU1A7CiAJCXJldHVybjsKIAl9CiAjZW5kaWYKIAotCWFzbSB2b2xhdGlsZSgic3RjCXIyX2JhbmssICUwIjogIj1yIiAoZXJyb3JfY29kZSkpOworCWxvb2t1cF9leGNlcHRpb25fdmVjdG9yKGVycm9yX2NvZGUpOworCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwotCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSBUUkFQX1JFU0VSVkVEX0lOU1Q7Ci0JQ0hLX1JFTU9URV9ERUJVRygmcmVncyk7CisJQ0hLX1JFTU9URV9ERUJVRyhyZWdzKTsKIAlmb3JjZV9zaWcoU0lHSUxMLCB0c2spOwotCWRpZV9pZl9ub19maXh1cCgicmVzZXJ2ZWQgaW5zdHJ1Y3Rpb24iLCAmcmVncywgZXJyb3JfY29kZSk7CisJZGllX2lmX25vX2ZpeHVwKCJyZXNlcnZlZCBpbnN0cnVjdGlvbiIsIHJlZ3MsIGVycm9yX2NvZGUpOwogfQogCiAjaWZkZWYgQ09ORklHX1NIX0ZQVV9FTVUKQEAgLTYzNiwzOSArNzY4LDQxIEBACiAKIGFzbWxpbmthZ2Ugdm9pZCBkb19pbGxlZ2FsX3Nsb3RfaW5zdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogCQkJCXVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCi0JCQkJc3RydWN0IHB0X3JlZ3MgcmVncykKKwkJCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAjaWZkZWYgQ09ORklHX1NIX0ZQVV9FTVUKLQl1bnNpZ25lZCBzaG9ydCBpbnN0OworCXVuc2lnbmVkIHNob3J0IGluc3QgPSAwOwogCi0JZ2V0X3VzZXIoaW5zdCwgKHVuc2lnbmVkIHNob3J0ICopcmVncy5wYyArIDEpOwotCWlmICghZG9fZnB1X2luc3QoaW5zdCwgJnJlZ3MpKSB7Ci0JCWdldF91c2VyKGluc3QsICh1bnNpZ25lZCBzaG9ydCAqKXJlZ3MucGMpOwotCQlpZiAoIWVtdWxhdGVfYnJhbmNoKGluc3QsICZyZWdzKSkKKwlnZXRfdXNlcihpbnN0LCAodW5zaWduZWQgc2hvcnQgKilyZWdzLT5wYyArIDEpOworCWlmICghZG9fZnB1X2luc3QoaW5zdCwgcmVncykpIHsKKwkJZ2V0X3VzZXIoaW5zdCwgKHVuc2lnbmVkIHNob3J0ICopcmVncy0+cGMpOworCQlpZiAoIWVtdWxhdGVfYnJhbmNoKGluc3QsIHJlZ3MpKQogCQkJcmV0dXJuOwogCQkvKiBmYXVsdCBpbiBicmFuY2guKi8KIAl9CiAJLyogbm90IGEgRlBVIGluc3QuICovCiAjZW5kaWYKIAotCWFzbSB2b2xhdGlsZSgic3RjCXIyX2JhbmssICUwIjogIj1yIiAoZXJyb3JfY29kZSkpOworCWxvb2t1cF9leGNlcHRpb25fdmVjdG9yKGVycm9yX2NvZGUpOworCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwotCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSBUUkFQX1JFU0VSVkVEX0lOU1Q7Ci0JQ0hLX1JFTU9URV9ERUJVRygmcmVncyk7CisJQ0hLX1JFTU9URV9ERUJVRyhyZWdzKTsKIAlmb3JjZV9zaWcoU0lHSUxMLCB0c2spOwotCWRpZV9pZl9ub19maXh1cCgiaWxsZWdhbCBzbG90IGluc3RydWN0aW9uIiwgJnJlZ3MsIGVycm9yX2NvZGUpOworCWRpZV9pZl9ub19maXh1cCgiaWxsZWdhbCBzbG90IGluc3RydWN0aW9uIiwgcmVncywgZXJyb3JfY29kZSk7CiB9CiAKIGFzbWxpbmthZ2Ugdm9pZCBkb19leGNlcHRpb25fZXJyb3IodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAotCQkJCSAgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCisJCQkJICAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlsb25nIGV4OwotCWFzbSB2b2xhdGlsZSgic3RjCXIyX2JhbmssICUwIiA6ICI9ciIgKGV4KSk7Ci0JZGllX2lmX2tlcm5lbCgiZXhjZXB0aW9uIiwgJnJlZ3MsIGV4KTsKKworCWxvb2t1cF9leGNlcHRpb25fdmVjdG9yKGV4KTsKKwlkaWVfaWZfa2VybmVsKCJleGNlcHRpb24iLCByZWdzLCBleCk7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKQpAQCAtNzA5LDE0ICs4NDMsMjQgQEAKIAkJICAgICA6ICJtZW1vcnkiKTsKIH0KIAotdm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit2b2lkICpzZXRfZXhjZXB0aW9uX3RhYmxlX3ZlYyh1bnNpZ25lZCBpbnQgdmVjLCB2b2lkICpoYW5kbGVyKQogewogCWV4dGVybiB2b2lkICpleGNlcHRpb25faGFuZGxpbmdfdGFibGVbXTsKKwl2b2lkICpvbGRfaGFuZGxlcjsKIAotCWV4Y2VwdGlvbl9oYW5kbGluZ190YWJsZVtUUkFQX1JFU0VSVkVEX0lOU1RdCi0JCT0gKHZvaWQgKilkb19yZXNlcnZlZF9pbnN0OwotCWV4Y2VwdGlvbl9oYW5kbGluZ190YWJsZVtUUkFQX0lMTEVHQUxfU0xPVF9JTlNUXQotCQk9ICh2b2lkICopZG9faWxsZWdhbF9zbG90X2luc3Q7CisJb2xkX2hhbmRsZXIgPSBleGNlcHRpb25faGFuZGxpbmdfdGFibGVbdmVjXTsKKwlleGNlcHRpb25faGFuZGxpbmdfdGFibGVbdmVjXSA9IGhhbmRsZXI7CisJcmV0dXJuIG9sZF9oYW5kbGVyOworfQorCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGFkZHJlc3NfZXJyb3JfaGFuZGxlcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKTsKKwordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit7CisJc2V0X2V4Y2VwdGlvbl90YWJsZV92ZWMoVFJBUF9SRVNFUlZFRF9JTlNULCBkb19yZXNlcnZlZF9pbnN0KTsKKwlzZXRfZXhjZXB0aW9uX3RhYmxlX3ZlYyhUUkFQX0lMTEVHQUxfU0xPVF9JTlNULCBkb19pbGxlZ2FsX3Nsb3RfaW5zdCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KSAmJiAhZGVmaW5lZChDT05GSUdfU0hfRlBVKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU0hfRlBVX0VNVSkKQEAgLTcyNSwyMSArODY5LDU1IEBACiAJICogcmVzZXJ2ZWQuIFRoZXknbGwgYmUgaGFuZGxlZCBpbiB0aGUgbWF0aC1lbXUgY2FzZSwgb3IgZmF1bHRlZCBvbgogCSAqIG90aGVyd2lzZS4KIAkgKi8KLQkvKiBlbnRyeSA2NCBjb3JyZXNwb25kcyB0byBFWFBFVlQ9MHg4MDAgKi8KLQlleGNlcHRpb25faGFuZGxpbmdfdGFibGVbNjRdID0gKHZvaWQgKilkb19yZXNlcnZlZF9pbnN0OwotCWV4Y2VwdGlvbl9oYW5kbGluZ190YWJsZVs2NV0gPSAodm9pZCAqKWRvX2lsbGVnYWxfc2xvdF9pbnN0OworCXNldF9leGNlcHRpb25fdGFibGVfZXZ0KDB4ODAwLCBkb19yZXNlcnZlZF9pbnN0KTsKKwlzZXRfZXhjZXB0aW9uX3RhYmxlX2V2dCgweDgyMCwgZG9faWxsZWdhbF9zbG90X2luc3QpOworI2VsaWYgZGVmaW5lZChDT05GSUdfU0hfRlBVKQorCXNldF9leGNlcHRpb25fdGFibGVfZXZ0KDB4ODAwLCBkb19mcHVfc3RhdGVfcmVzdG9yZSk7CisJc2V0X2V4Y2VwdGlvbl90YWJsZV9ldnQoMHg4MjAsIGRvX2ZwdV9zdGF0ZV9yZXN0b3JlKTsKICNlbmRpZgotCQkKKworI2lmZGVmIENPTkZJR19DUFVfU0gyCisJc2V0X2V4Y2VwdGlvbl90YWJsZV92ZWMoVFJBUF9BRERSRVNTX0VSUk9SLCBhZGRyZXNzX2Vycm9yX2hhbmRsZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVV9TSDJBCisJc2V0X2V4Y2VwdGlvbl90YWJsZV92ZWMoVFJBUF9ESVZaRVJPX0VSUk9SLCBkb19kaXZpZGVfZXJyb3IpOworCXNldF9leGNlcHRpb25fdGFibGVfdmVjKFRSQVBfRElWT1ZGX0VSUk9SLCBkb19kaXZpZGVfZXJyb3IpOworI2VuZGlmCisKIAkvKiBTZXR1cCBWQlIgZm9yIGJvb3QgY3B1ICovCiAJcGVyX2NwdV90cmFwX2luaXQoKTsKIH0KIAordm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpzcCwKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKHJlZ3MgJiYgdXNlcl9tb2RlKHJlZ3MpKQorCQlyZXR1cm47CisKKwlwcmludGsoIlxuQ2FsbCB0cmFjZTogIik7CisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwl3aGlsZSAoIWtzdGFja19lbmQoc3ApKSB7CisJCWFkZHIgPSAqc3ArKzsKKwkJaWYgKGtlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpCisJCQlwcmludF9pcF9zeW0oYWRkcik7CisJfQorCisJcHJpbnRrKCJcbiIpOworCisJaWYgKCF0c2spCisJCXRzayA9IGN1cnJlbnQ7CisKKwlkZWJ1Z19zaG93X2hlbGRfbG9ja3ModHNrKTsKK30KKwogdm9pZCBzaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpzcCkKIHsKLQl1bnNpZ25lZCBsb25nICpzdGFjaywgYWRkcjsKLQl1bnNpZ25lZCBsb25nIG1vZHVsZV9zdGFydCA9IFZNQUxMT0NfU1RBUlQ7Ci0JdW5zaWduZWQgbG9uZyBtb2R1bGVfZW5kID0gVk1BTExPQ19FTkQ7Ci0JaW50IGkgPSAxOworCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAKIAlpZiAoIXRzaykKIAkJdHNrID0gY3VycmVudDsKQEAgLTc0OCwzOCArOTI2LDEwIEBACiAJZWxzZQogCQlzcCA9ICh1bnNpZ25lZCBsb25nICopdHNrLT50aHJlYWQuc3A7CiAKLQlzdGFjayA9IHNwOwotCi0JcHJpbnRrKCJcbkNhbGwgdHJhY2U6ICIpOwotI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCXByaW50aygiXG4iKTsKLSNlbmRpZgotCi0Jd2hpbGUgKCFrc3RhY2tfZW5kKHN0YWNrKSkgewotCQlhZGRyID0gKnN0YWNrKys7Ci0JCWlmICgoKGFkZHIgPj0gKHVuc2lnbmVkIGxvbmcpX3RleHQpICYmCi0JCSAgICAgKGFkZHIgPD0gKHVuc2lnbmVkIGxvbmcpX2V0ZXh0KSkgfHwKLQkJICAgICgoYWRkciA+PSBtb2R1bGVfc3RhcnQpICYmIChhZGRyIDw9IG1vZHVsZV9lbmQpKSkgewotCQkJLyoKLQkJCSAqIEZvciA4MC1jb2x1bW5zIGRpc3BsYXksIDYgZW50cnkgaXMgbWF4aW11bS4KLQkJCSAqIE5PVEU6ICdbPDhjMDBhYmNkPl0gJyBjb25zdW1lcyAxMyBjb2x1bW5zIC4KLQkJCSAqLwotI2lmbmRlZiBDT05GSUdfS0FMTFNZTVMKLQkJCWlmIChpICYmICgoaSAlIDYpID09IDApKQotCQkJCXByaW50aygiXG4gICAgICAgIik7Ci0jZW5kaWYKLQkJCXByaW50aygiWzwlMDhseD5dICIsIGFkZHIpOwotCQkJcHJpbnRfc3ltYm9sKCIlc1xuIiwgYWRkcik7Ci0JCQlpKys7Ci0JCX0KLQl9Ci0KLQlwcmludGsoIlxuIik7Ci19Ci0KLXZvaWQgc2hvd190YXNrKHVuc2lnbmVkIGxvbmcgKnNwKQotewotCXNob3dfc3RhY2soTlVMTCwgc3ApOworCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcpc3A7CisJZHVtcF9tZW0oIlN0YWNrOiAiLCBzdGFjaywgVEhSRUFEX1NJWkUgKworCQkgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRzaykpOworCXNob3dfdHJhY2UodHNrLCBzcCwgTlVMTCk7CiB9CiAKIHZvaWQgZHVtcF9zdGFjayh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNWViOTMwOS4uZjM0YmRjYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC01MSw3ICs1MSw3IEBACiAJfQogCiAgIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuZGF0YS5wYWdlX2FsaWduZWQgOiB7ICooLmRhdGEuaWR0KSB9CisgIC5kYXRhLnBhZ2VfYWxpZ25lZCA6IHsgKiguZGF0YS5wYWdlX2FsaWduZWQpIH0KIAogICAuID0gQUxJR04oMzIpOwogICBfX3Blcl9jcHVfc3RhcnQgPSAuOwpAQCAtNzYsMTMgKzc2LDcgQEAKICAgX19zZXR1cF9lbmQgPSAuOwogICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKICAgLmluaXRjYWxsLmluaXQgOiB7Ci0JKiguaW5pdGNhbGwxLmluaXQpIAotCSooLmluaXRjYWxsMi5pbml0KSAKLQkqKC5pbml0Y2FsbDMuaW5pdCkgCi0JKiguaW5pdGNhbGw0LmluaXQpIAotCSooLmluaXRjYWxsNS5pbml0KSAKLQkqKC5pbml0Y2FsbDYuaW5pdCkgCi0JKiguaW5pdGNhbGw3LmluaXQpCisJSU5JVENBTExTCiAgIH0KICAgX19pbml0Y2FsbF9lbmQgPSAuOwogICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC5jIGIvYXJjaC9zaC9rZXJuZWwvdnN5c2NhbGwvdnN5c2NhbGwuYwppbmRleCAwNzVkNmNjLi5kZWI0Njk0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAkJZ290byB1cF9mYWlsOwogCX0KIAotCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJdm1hID0ga21lbV9jYWNoZV96YWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghdm1hKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gdXBfZmFpbDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vS2NvbmZpZyBiL2FyY2gvc2gvbW0vS2NvbmZpZwppbmRleCA5ZGQ2MDY0Li4yOWY0ZWUzIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL0tjb25maWcKKysrIGIvYXJjaC9zaC9tbS9LY29uZmlnCkBAIC00LDggKzQsMTIgQEAKICMgUHJvY2Vzc29yIGZhbWlsaWVzCiAjCiBjb25maWcgQ1BVX1NIMgorCXNlbGVjdCBTSF9XUklURVRIUk9VR0ggaWYgIUNQVV9TSDJBCiAJYm9vbAotCXNlbGVjdCBTSF9XUklURVRIUk9VR0gKKworY29uZmlnIENQVV9TSDJBCisJYm9vbAorCXNlbGVjdCBDUFVfU0gyCiAKIGNvbmZpZyBDUFVfU0gzCiAJYm9vbApAQCAtMTYsNiArMjAsNyBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19JTlRFVlQKIAlzZWxlY3QgQ1BVX0hBU19TUl9SQgorCXNlbGVjdCBDUFVfSEFTX1BURUEgaWYgIUNQVV9TVUJUWVBFX1NUNDAKIAogY29uZmlnIENQVV9TSDRBCiAJYm9vbApAQCAtMzAsNiArMzUsOSBAQAogCXNlbGVjdCBDUFVfU0g0CiAJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCiAKK2NvbmZpZyBDUFVfU0hYMgorCWJvb2wKKwogIwogIyBQcm9jZXNzb3Igc3VidHlwZXMKICMKQEAgLTQwLDYgKzQ4LDE2IEBACiAJYm9vbCAiU3VwcG9ydCBTSDc2MDQgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyCiAKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDc2MTkKKwlib29sICJTdXBwb3J0IFNINzYxOSBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDIKKworY29tbWVudCAiU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQiCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDcyMDYKKwlib29sICJTdXBwb3J0IFNINzIwNiBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDJBCisKIGNvbW1lbnQgIlNILTMgUHJvY2Vzc29yIFN1cHBvcnQiCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMDAKQEAgLTg5LDYgKzEwNyw3IEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJYm9vbCAiU3VwcG9ydCBTSDc3NTAgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0CisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCWhlbHAKIAkgIFNlbGVjdCBTSDc3NTAgaWYgeW91IGhhdmUgYSAyMDAgTWh6IFNILTQgSEQ2NDE3NzUwIENQVS4KIApAQCAtMTA0LDE1ICsxMjMsMTggQEAKIAlib29sICJTdXBwb3J0IFNINzc1MFIgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0CiAJc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MAorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzc1MFMKIAlib29sICJTdXBwb3J0IFNINzc1MFMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0CiAJc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MAorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzc1MQogCWJvb2wgIlN1cHBvcnQgU0g3NzUxIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINAorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAloZWxwCiAJICBTZWxlY3QgU0g3NzUxIGlmIHlvdSBoYXZlIGEgMTY2IE1oeiBTSC00IEhENjQxNzc1MSBDUFUsCiAJICBvciBpZiB5b3UgaGF2ZSBhIEhENjQxNzc1MVIgQ1BVLgpAQCAtMTIxLDYgKzE0Myw3IEBACiAJYm9vbCAiU3VwcG9ydCBTSDc3NTFSIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINAogCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTEKKwlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NjAKIAlib29sICJTdXBwb3J0IFNINzc2MCBwcm9jZXNzb3IiCkBAIC0xNTcsNiArMTgwLDEyIEBACiAJc2VsZWN0IENQVV9TSDRBCiAJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCiAKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDc3ODUKKwlib29sICJTdXBwb3J0IFNINzc4NSBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDRBCisJc2VsZWN0IENQVV9TSFgyCisJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCisKIGNvbW1lbnQgIlNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydCIKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzMxODAKQEAgLTE2Nyw2ICsxOTYsMTIgQEAKIAlib29sICJTdXBwb3J0IFNINzM0MyBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDRBTF9EU1AKIAorY29uZmlnIENQVV9TVUJUWVBFX1NINzcyMgorCWJvb2wgIlN1cHBvcnQgU0g3NzIyIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NINEFMX0RTUAorCXNlbGVjdCBDUFVfU0hYMgorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKKwogZW5kbWVudQogCiBtZW51ICJNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zIgpAQCAtMjE2LDEzICsyNTEsMjIgQEAKIAogY29uZmlnIDMyQklUCiAJYm9vbCAiU3VwcG9ydCAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB0aHJvdWdoIFBNQiIKLQlkZXBlbmRzIG9uIENQVV9TSDRBICYmIE1NVQorCWRlcGVuZHMgb24gQ1BVX1NINEEgJiYgTU1VICYmICghWDJUTEIgfHwgQlJPS0VOKQogCWRlZmF1bHQgeQogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCBwaHlzaWNhbCBhZGRyZXNzaW5nIHdpbGwgYmUgZXh0ZW5kZWQgdG8KIAkgIDMyLWJpdHMgdGhyb3VnaCB0aGUgU0gtNEEgUE1CLiBJZiB0aGlzIGlzIG5vdCBzZXQsIGxlZ2FjeQogCSAgMjktYml0IHBoeXNpY2FsIGFkZHJlc3Npbmcgd2lsbCBiZSB1c2VkLgogCitjb25maWcgWDJUTEIKKwlib29sICJFbmFibGUgZXh0ZW5kZWQgVExCIG1vZGUiCisJZGVwZW5kcyBvbiBDUFVfU0hYMiAmJiBNTVUgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHRoZSBleHRlbmRlZCBtb2RlIG9mIHRoZSBTSC1YMgorCSAgVExCLiBGb3IgbGVnYWN5IFNILVggYmVoYXZpb3VyIGFuZCBpbnRlcm9wZXJhYmlsaXR5LCBzYXkgTi4gRm9yCisJICBhbGwgb2YgdGhlIGZ1biBuZXcgZmVhdHVyZXMgYW5kIGEgd2lsbGluZ2xlc3MgdG8gc3VibWl0IGJ1ZyByZXBvcnRzLAorCSAgc2F5IFkuCisKIGNvbmZpZyBWU1lTQ0FMTAogCWJvb2wgIlN1cHBvcnQgdnN5c2NhbGwgcGFnZSIKIAlkZXBlbmRzIG9uIE1NVQpAQCAtMjM3LDE2ICsyODEsNTIgQEAKIAkgICh0aGUgZGVmYXVsdCB2YWx1ZSkgc2F5IFkuCiAKIGNob2ljZQorCXByb21wdCAiS2VybmVsIHBhZ2Ugc2l6ZSIKKwlkZWZhdWx0IFBBR0VfU0laRV80S0IKKworY29uZmlnIFBBR0VfU0laRV80S0IKKwlib29sICI0a0IiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZGVmYXVsdCBwYWdlIHNpemUgdXNlZCBieSBhbGwgU3VwZXJIIENQVXMuCisKK2NvbmZpZyBQQUdFX1NJWkVfOEtCCisJYm9vbCAiOGtCIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFgyVExCCisJaGVscAorCSAgVGhpcyBlbmFibGVzIDhrQiBwYWdlcyBhcyBzdXBwb3J0ZWQgYnkgU0gtWDIgYW5kIGxhdGVyIE1NVXMuCisKK2NvbmZpZyBQQUdFX1NJWkVfNjRLQgorCWJvb2wgIjY0a0IiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQ1BVX1NINAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciA2NGtCIHBhZ2VzLCBwb3NzaWJsZSBvbiBhbGwgU0gtNAorCSAgQ1BVcyBhbmQgbGF0ZXIuIEhpZ2hseSBleHBlcmltZW50YWwsIG5vdCByZWNvbW1lbmRlZC4KKworZW5kY2hvaWNlCisKK2Nob2ljZQogCXByb21wdCAiSHVnZVRMQiBwYWdlIHNpemUiCiAJZGVwZW5kcyBvbiBIVUdFVExCX1BBR0UgJiYgQ1BVX1NINCAmJiBNTVUKIAlkZWZhdWx0IEhVR0VUTEJfUEFHRV9TSVpFXzY0SwogCiBjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNjRLCi0JYm9vbCAiNjRLIgorCWJvb2wgIjY0a0IiCisKK2NvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8yNTZLCisJYm9vbCAiMjU2a0IiCisJZGVwZW5kcyBvbiBYMlRMQgogCiBjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfMU1CCiAJYm9vbCAiMU1CIgogCitjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfNE1CCisJYm9vbCAiNE1CIgorCWRlcGVuZHMgb24gWDJUTEIKKworY29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzY0TUIKKwlib29sICI2NE1CIgorCWRlcGVuZHMgb24gWDJUTEIKKwogZW5kY2hvaWNlCiAKIHNvdXJjZSAibW0vS2NvbmZpZyIKQEAgLTI3NCw3ICszNTQsNiBAQAogCiBjb25maWcgU0hfV1JJVEVUSFJPVUdICiAJYm9vbCAiVXNlIHdyaXRlLXRocm91Z2ggY2FjaGluZyIKLQlkZWZhdWx0IHkgaWYgQ1BVX1NIMgogCWhlbHAKIAkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgY2FjaGVzIGluIHdyaXRlLXRocm91Z2gKIAkgIG1vZGUsIGFzIG9wcG9zZWQgdG8gdGhlIGRlZmF1bHQgd3JpdGUtYmFjayBjb25maWd1cmF0aW9uLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS1zaDIuYyBiL2FyY2gvc2gvbW0vY2FjaGUtc2gyLmMKaW5kZXggMjY4OWNiMi4uNjYxNDAzMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1zaDIuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLXNoMi5jCkBAIC01LDYgKzUsNyBAQAogICoKICAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgogICovCisKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIApAQCAtMTQsMzcgKzE1LDQzIEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotLyoKLSAqIENhbGN1bGF0ZSB0aGUgT0MgYWRkcmVzcyBhbmQgc2V0IHRoZSB3YXkgYml0IG9uIHRoZSBTSC0yLgotICoKLSAqIFdlIG11c3QgaGF2ZSBhbHJlYWR5IGp1bXBfdG9fUDIoKSdlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMKLSAqIGZ1bmN0aW9uLCBzaW5jZSB3ZSByZWx5IG9uIENDUiBtYW5pcHVsYXRpb24gdG8gZG8gdGhlCi0gKiBSaWdodCBUaGluZyh0bSkuCi0gKi8KLXVuc2lnbmVkIGxvbmcgX19nZXRfb2NfYWRkcih1bnNpZ25lZCBsb25nIHNldCwgdW5zaWduZWQgbG9uZyB3YXkpCit2b2lkIF9fZmx1c2hfd2JhY2tfcmVnaW9uKHZvaWQgKnN0YXJ0LCBpbnQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGNjcjsKKwl1bnNpZ25lZCBsb25nIHY7CisJdW5zaWduZWQgbG9uZyBiZWdpbiwgZW5kOwogCi0JLyoKLQkgKiBPbiBTSC0yIHRoZSB3YXkgYml0IGlzbid0IHRyYWNrZWQgaW4gdGhlIGFkZHJlc3MgZmllbGQKLQkgKiBpZiB3ZSdyZSBkb2luZyBhZGRyZXNzIGFycmF5IGFjY2VzcyAuLiBpbnN0ZWFkLCB3ZSBuZWVkCi0JICogdG8gbWFudWFsbHkgc3dpdGNoIG91dCB0aGUgd2F5IGluIHRoZSBDQ1IuCi0JICovCi0JY2NyID0gY3RybF9pbmwoQ0NSKTsKLQljY3IgJj0gfjB4MDBjMDsKLQljY3IgfD0gd2F5IDw8IGNwdV9kYXRhLT5kY2FjaGUud2F5X3NoaWZ0OworCWJlZ2luID0gKHVuc2lnbmVkIGxvbmcpc3RhcnQgJiB+KEwxX0NBQ0hFX0JZVEVTLTEpOworCWVuZCA9ICgodW5zaWduZWQgbG9uZylzdGFydCArIHNpemUgKyBMMV9DQUNIRV9CWVRFUy0xKQorCQkmIH4oTDFfQ0FDSEVfQllURVMtMSk7CisJZm9yICh2ID0gYmVnaW47IHYgPCBlbmQ7IHYrPUwxX0NBQ0hFX0JZVEVTKSB7CisJCS8qIEZJWE1FIGNhY2hlIHB1cmdlICovCisJCWN0cmxfb3V0bCgodiAmIDB4MWZmZmZjMDApLCAodiAmIDB4MDAwMDBmZjApIHwgMHgwMDAwMDAwOCk7CisJfQorfQogCi0JLyoKLQkgKiBEZXNwaXRlIHRoZSBudW1iZXIgb2Ygc2V0cyBiZWluZyBoYWx2ZWQsIHdlIGVuZCB1cCBsb3NpbmcKLQkgKiB0aGUgZmlyc3QgMiB3YXlzIHRvIE9DUkFNIGluc3RlYWQgb2YgdGhlIGxhc3QgMiAoaWYgd2UncmUKLQkgKiA0LXdheSkuIEFzIGEgcmVzdWx0LCBmb3JjaWJseSBzZXR0aW5nIHRoZSBXMSBiaXQgaGFuZGlseQotCSAqIGJ1bXBzIHVzIHVwIDIgd2F5cy4KLQkgKi8KLQlpZiAoY2NyICYgQ0NSX0NBQ0hFX09SQSkKLQkJY2NyIHw9IDEgPDwgKGNwdV9kYXRhLT5kY2FjaGUud2F5X3NoaWZ0ICsgMSk7Cit2b2lkIF9fZmx1c2hfcHVyZ2VfcmVnaW9uKHZvaWQgKnN0YXJ0LCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHY7CisJdW5zaWduZWQgbG9uZyBiZWdpbiwgZW5kOwogCi0JY3RybF9vdXRsKGNjciwgQ0NSKTsKKwliZWdpbiA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0ICYgfihMMV9DQUNIRV9CWVRFUy0xKTsKKwllbmQgPSAoKHVuc2lnbmVkIGxvbmcpc3RhcnQgKyBzaXplICsgTDFfQ0FDSEVfQllURVMtMSkKKwkJJiB+KEwxX0NBQ0hFX0JZVEVTLTEpOworCWZvciAodiA9IGJlZ2luOyB2IDwgZW5kOyB2Kz1MMV9DQUNIRV9CWVRFUykgeworCQljdHJsX291dGwoKHYgJiAweDFmZmZmYzAwKSwgKHYgJiAweDAwMDAwZmYwKSB8IDB4MDAwMDAwMDgpOworCX0KK30KIAotCXJldHVybiBDQUNIRV9PQ19BRERSRVNTX0FSUkFZIHwgKHNldCA8PCBjcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0KTsKK3ZvaWQgX19mbHVzaF9pbnZhbGlkYXRlX3JlZ2lvbih2b2lkICpzdGFydCwgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyB2OworCXVuc2lnbmVkIGxvbmcgYmVnaW4sIGVuZDsKKworCWJlZ2luID0gKHVuc2lnbmVkIGxvbmcpc3RhcnQgJiB+KEwxX0NBQ0hFX0JZVEVTLTEpOworCWVuZCA9ICgodW5zaWduZWQgbG9uZylzdGFydCArIHNpemUgKyBMMV9DQUNIRV9CWVRFUy0xKQorCQkmIH4oTDFfQ0FDSEVfQllURVMtMSk7CisJZm9yICh2ID0gYmVnaW47IHYgPCBlbmQ7IHYrPUwxX0NBQ0hFX0JZVEVTKSB7CisJCWN0cmxfb3V0bCgodiAmIDB4MWZmZmZjMDApLCAodiAmIDB4MDAwMDBmZjApIHwgMHgwMDAwMDAwOCk7CisJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2NhY2hlLXNoNC5jIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYwppbmRleCBlNDhjYzIyLi5jNjk1NTE1IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NhY2hlLXNoNC5jCisrKyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g0LmMKQEAgLTExLDEyICsxMSw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIApAQCAtODMsOSArNzksOSBAQAogICovCiAKIC8qIFdvcnN0IGNhc2UgYXNzdW1lZCB0byBiZSA2NGsgY2FjaGUsIGRpcmVjdC1tYXBwZWQgaS5lLiA0IHN5bm9ueW0gYml0cy4gKi8KLSNkZWZpbmUgTUFYX1AzX1NFTUFQSE9SRVMgMTYKKyNkZWZpbmUgTUFYX1AzX01VVEVYRVMgMTYKIAotc3RydWN0IHNlbWFwaG9yZSBwM21hcF9zZW1bTUFYX1AzX1NFTUFQSE9SRVNdOworc3RydWN0IG11dGV4IHAzbWFwX211dGV4W01BWF9QM19NVVRFWEVTXTsKIAogdm9pZCBfX2luaXQgcDNfY2FjaGVfaW5pdCh2b2lkKQogewpAQCAtMTExLDExICsxMDcsMTEgQEAKIAogCWVtaXRfY2FjaGVfcGFyYW1zKCk7CiAKLQlpZiAocmVtYXBfYXJlYV9wYWdlcyhQM1NFRywgMCwgUEFHRV9TSVpFICogNCwgX1BBR0VfQ0FDSEFCTEUpKQorCWlmIChpb3JlbWFwX3BhZ2VfcmFuZ2UoUDNTRUcsIFAzU0VHICsgKFBBR0VfU0laRSAqIDQpLCAwLCBQQUdFX0tFUk5FTCkpCiAJCXBhbmljKCIlcyBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlczsgaSsrKQotCQlzZW1hX2luaXQoJnAzbWFwX3NlbVtpXSwgMSk7CisJCW11dGV4X2luaXQoJnAzbWFwX211dGV4W2ldKTsKIH0KIAogLyoKQEAgLTIyOSw3ICsyMjUsNyBAQAogCSAqLwogCWlmICgoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19QMl9GTFVTSF9CVUcpIHx8CiAJICAgIChzdGFydCA8IENBQ0hFX09DX0FERFJFU1NfQVJSQVkpKQotCSAgICAJZXhlY19vZmZzZXQgPSAweDIwMDAwMDAwOworCQlleGVjX29mZnNldCA9IDB4MjAwMDAwMDA7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJX19mbHVzaF9jYWNoZV80MDk2KHN0YXJ0IHwgU0hfQ0FDSEVfQVNTT0MsCkBAIC0yNTAsNyArMjQ2LDcgQEAKIAogCQkvKiBMb29wIGFsbCB0aGUgRC1jYWNoZSAqLwogCQluID0gY3B1X2RhdGEtPmRjYWNoZS5uX2FsaWFzZXM7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKQorCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBhZGRyICs9IDQwOTYpCiAJCQlmbHVzaF9jYWNoZV80MDk2KGFkZHIsIHBoeXMpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jbGVhcl9wYWdlLlMgYi9hcmNoL3NoL21tL2NsZWFyX3BhZ2UuUwppbmRleCA3Yjk2NDI1Li44YTcwNjEzIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NsZWFyX3BhZ2UuUworKysgYi9hcmNoL3NoL21tL2NsZWFyX3BhZ2UuUwpAQCAtMSwxMiArMSwxMiBAQAotLyogJElkOiBjbGVhcl9wYWdlLlMsdiAxLjEzIDIwMDMvMDgvMjUgMTc6MDM6MTAgbGV0aGFsIEV4cCAkCi0gKgorLyoKICAqIF9fY2xlYXJfdXNlcl9wYWdlLCBfX2NsZWFyX3VzZXIsIGNsZWFyX3BhZ2UgaW1wbGVtZW50YXRpb24gb2YgU3VwZXJICiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxICBLYXogS29qaW1hCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgIE5paWJlIFl1dGFrYQotICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIC8qCiAgKiBjbGVhcl9wYWdlX3Nsb3cKQEAgLTE4LDExICsxOCwxMSBAQAogLyoKICAqIHIwIC0tLSBzY3JhdGNoCiAgKiByNCAtLS0gdG8KLSAqIHI1IC0tLSB0byArIDQwOTYKKyAqIHI1IC0tLSB0byArIFBBR0VfU0laRQogICovCiBFTlRSWShjbGVhcl9wYWdlX3Nsb3cpCiAJbW92CXI0LHI1Ci0JbW92LncJLkxsaW1pdCxyMAorCW1vdi5sCS5MbGltaXQscjAKIAlhZGQJcjAscjUKIAltb3YJIzAscjAKIAkhCkBAIC01MCw3ICs1MCw3IEBACiAJIQogCXJ0cwogCSBub3AKLS5MbGltaXQ6CS53b3JkCSg0MDk2LTI4KQorLkxsaW1pdDoJLmxvbmcJKFBBR0VfU0laRS0yOCkKIAogRU5UUlkoX19jbGVhcl91c2VyKQogCSEKQEAgLTE2NCwxMCArMTY0LDEwIEBACiAgKiByMCAtLS0gc2NyYXRjaCAKICAqIHI0IC0tLSB0bwogICogcjUgLS0tIG9yaWdfdG8KLSAqIHI2IC0tLSB0byArIDQwOTYKKyAqIHI2IC0tLSB0byArIFBBR0VfU0laRQogICovCiBFTlRSWShfX2NsZWFyX3VzZXJfcGFnZSkKLQltb3YudwkuTDQwOTYscjAKKwltb3YubAkuTHBzeixyMAogCW1vdglyNCxyNgogCWFkZAlyMCxyNgogCW1vdgkjMCxyMApAQCAtMTkxLDcgKzE5MSw3IEBACiAJIQogCXJ0cwogCSBub3AKLS5MNDA5NjoJLndvcmQJNDA5NgorLkxwc3o6CS5sb25nCVBBR0VfU0laRQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jb3B5X3BhZ2UuUyBiL2FyY2gvc2gvbW0vY29weV9wYWdlLlMKaW5kZXggMWFkZGZmZS4uMzk3Yzk0YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jb3B5X3BhZ2UuUworKysgYi9hcmNoL3NoL21tL2NvcHlfcGFnZS5TCkBAIC0xLDEyICsxLDEyIEBACi0vKiAkSWQ6IGNvcHlfcGFnZS5TLHYgMS44IDIwMDMvMDgvMjUgMTc6MDM6MTAgbGV0aGFsIEV4cCAkCi0gKgorLyoKICAqIGNvcHlfcGFnZSwgX19jb3B5X3VzZXJfcGFnZSwgX19jb3B5X3VzZXIgaW1wbGVtZW50YXRpb24gb2YgU3VwZXJICiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxICBOaWliZSBZdXRha2EgJiBLYXogS29qaW1hCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIFRvc2hpbm9idSBTdWdpb2thCi0gKgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CiAgKi8KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogLyoKICAqIGNvcHlfcGFnZV9zbG93CkBAIC0xOCw3ICsxOCw3IEBACiAKIC8qCiAgKiByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcgLS0tIHNjcmF0Y2ggCi0gKiByOCAtLS0gZnJvbSArIDQwOTYKKyAqIHI4IC0tLSBmcm9tICsgUEFHRV9TSVpFCiAgKiByOSAtLS0gbm90IHVzZWQKICAqIHIxMCAtLS0gdG8KICAqIHIxMSAtLS0gZnJvbQpAQCAtMzAsNyArMzAsNyBAQAogCW1vdglyNCxyMTAKIAltb3YJcjUscjExCiAJbW92CXI1LHI4Ci0JbW92LncJLkw0MDk2LHIwCisJbW92LmwJLkxwc3oscjAKIAlhZGQJcjAscjgKIAkhCiAxOgltb3YubAlAcjExKyxyMApAQCAtODAsNyArODAsNyBAQAogCiAvKgogICogcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3IC0tLSBzY3JhdGNoIAotICogcjggLS0tIGZyb20gKyA0MDk2CisgKiByOCAtLS0gZnJvbSArIFBBR0VfU0laRQogICogcjkgLS0tIG9yaWdfdG8KICAqIHIxMCAtLS0gdG8KICAqIHIxMSAtLS0gZnJvbQpAQCAtOTQsNyArOTQsNyBAQAogCW1vdglyNSxyMTEKIAltb3YJcjYscjkKIAltb3YJcjUscjgKLQltb3YudwkuTDQwOTYscjAKKwltb3YubAkuTHBzeixyMAogCWFkZAlyMCxyOAogCSEKIDE6CW9jYmkJQHI5CkBAIC0xMjksNyArMTI5LDcgQEAKIAlydHMKIAkgbm9wCiAjZW5kaWYKLS5MNDA5NjoJLndvcmQJNDA5NgorLkxwc3o6CS5sb25nCVBBR0VfU0laRQogLyoKICAqIF9fa2VybmVsX3NpemVfdCBfX2NvcHlfdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgX19rZXJuZWxfc2l6ZV90IG4pOwogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgTk9UIGNvcGllZApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9mYXVsdC5jIGIvYXJjaC9zaC9tbS9mYXVsdC5jCmluZGV4IDY4NjYzYjguLjcxNmViZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vZmF1bHQuYworKysgYi9hcmNoL3NoL21tL2ZhdWx0LmMKQEAgLTI2LDEzICsyNiwxOSBAQAogICogYW5kIHRoZSBwcm9ibGVtLCBhbmQgdGhlbiBwYXNzZXMgaXQgb2ZmIHRvIG9uZSBvZiB0aGUgYXBwcm9wcmlhdGUKICAqIHJvdXRpbmVzLgogICovCi1hc21saW5rYWdlIHZvaWQgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyB3cml0ZWFjY2VzcywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK2FzbWxpbmthZ2Ugdm9pZCBfX2twcm9iZXMgZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJdW5zaWduZWQgbG9uZyB3cml0ZWFjY2VzcywKKwkJCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKIAl1bnNpZ25lZCBsb25nIHBhZ2U7CisJaW50IHNpX2NvZGU7CisJc2lnaW5mb190IGluZm87CisKKwl0cmFjZV9oYXJkaXJxc19vbigpOworCWxvY2FsX2lycV9lbmFibGUoKTsKIAogI2lmZGVmIENPTkZJR19TSF9LR0RCCiAJaWYgKGtnZGJfbm9mYXVsdCAmJiBrZ2RiX2J1c19lcnJfaG9vaykKQEAgLTQxLDYgKzQ3LDQ2IEBACiAKIAl0c2sgPSBjdXJyZW50OwogCW1tID0gdHNrLT5tbTsKKwlzaV9jb2RlID0gU0VHVl9NQVBFUlI7CisKKwlpZiAodW5saWtlbHkoYWRkcmVzcyA+PSBUQVNLX1NJWkUpKSB7CisJCS8qCisJCSAqIFN5bmNocm9uaXplIHRoaXMgdGFzaydzIHRvcCBsZXZlbCBwYWdlLXRhYmxlCisJCSAqIHdpdGggdGhlICdyZWZlcmVuY2UnIHBhZ2UgdGFibGUuCisJCSAqCisJCSAqIERvIF9ub3RfIHVzZSAidHNrIiBoZXJlLiBXZSBtaWdodCBiZSBpbnNpZGUKKwkJICogYW4gaW50ZXJydXB0IGluIHRoZSBtaWRkbGUgb2YgYSB0YXNrIHN3aXRjaC4uCisJCSAqLworCQlpbnQgb2Zmc2V0ID0gcGdkX2luZGV4KGFkZHJlc3MpOworCQlwZ2RfdCAqcGdkLCAqcGdkX2s7CisJCXB1ZF90ICpwdWQsICpwdWRfazsKKwkJcG1kX3QgKnBtZCwgKnBtZF9rOworCisJCXBnZCA9IGdldF9UVEIoKSArIG9mZnNldDsKKwkJcGdkX2sgPSBzd2FwcGVyX3BnX2RpciArIG9mZnNldDsKKworCQkvKiBUaGlzIHdpbGwgbmV2ZXIgaGFwcGVuIHdpdGggdGhlIGZvbGRlZCBwYWdlIHRhYmxlLiAqLworCQlpZiAoIXBnZF9wcmVzZW50KCpwZ2QpKSB7CisJCQlpZiAoIXBnZF9wcmVzZW50KCpwZ2RfaykpCisJCQkJZ290byBiYWRfYXJlYV9ub3NlbWFwaG9yZTsKKwkJCXNldF9wZ2QocGdkLCAqcGdkX2spOworCQkJcmV0dXJuOworCQl9CisKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOworCQlwdWRfayA9IHB1ZF9vZmZzZXQocGdkX2ssIGFkZHJlc3MpOworCQlpZiAocHVkX3ByZXNlbnQoKnB1ZCkgfHwgIXB1ZF9wcmVzZW50KCpwdWRfaykpCisJCQlnb3RvIGJhZF9hcmVhX25vc2VtYXBob3JlOworCQlzZXRfcHVkKHB1ZCwgKnB1ZF9rKTsKKworCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcmVzcyk7CisJCXBtZF9rID0gcG1kX29mZnNldChwdWRfaywgYWRkcmVzcyk7CisJCWlmIChwbWRfcHJlc2VudCgqcG1kKSB8fCAhcG1kX3ByZXNlbnQoKnBtZF9rKSkKKwkJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CisJCXNldF9wbWQocG1kLCAqcG1kX2spOworCisJCXJldHVybjsKKwl9CiAKIAkvKgogCSAqIElmIHdlJ3JlIGluIGFuIGludGVycnVwdCBvciBoYXZlIG5vIHVzZXIKQEAgLTY1LDYgKzExMSw3IEBACiAgKiB3ZSBjYW4gaGFuZGxlIGl0Li4KICAqLwogZ29vZF9hcmVhOgorCXNpX2NvZGUgPSBTRUdWX0FDQ0VSUjsKIAlpZiAod3JpdGVhY2Nlc3MpIHsKIAkJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKIAkJCWdvdG8gYmFkX2FyZWE7CkBAIC0xMDQsMTAgKzE1MSwxMyBAQAogYmFkX2FyZWE6CiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAorYmFkX2FyZWFfbm9zZW1hcGhvcmU6CiAJaWYgKHVzZXJfbW9kZShyZWdzKSkgewotCQl0c2stPnRocmVhZC5hZGRyZXNzID0gYWRkcmVzczsKLQkJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IHdyaXRlYWNjZXNzOwotCQlmb3JjZV9zaWcoU0lHU0VHViwgdHNrKTsKKwkJaW5mby5zaV9zaWdubyA9IFNJR1NFR1Y7CisJCWluZm8uc2lfZXJybm8gPSAwOworCQlpbmZvLnNpX2NvZGUgPSBzaV9jb2RlOworCQlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKSBhZGRyZXNzOworCQlmb3JjZV9zaWdfaW5mbyhTSUdTRUdWLCAmaW5mbywgdHNrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTI3LDExICsxNzcsOSBAQAogCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QiKTsKIAlwcmludGsoIiBhdCB2aXJ0dWFsIGFkZHJlc3MgJTA4bHhcbiIsIGFkZHJlc3MpOwogCXByaW50ayhLRVJOX0FMRVJUICJwYyA9ICUwOGx4XG4iLCByZWdzLT5wYyk7Ci0JYXNtIHZvbGF0aWxlKCJtb3YubAklMSwgJTAiCi0JCSAgICAgOiAiPXIiIChwYWdlKQotCQkgICAgIDogIm0iIChfX20oTU1VX1RUQikpKTsKKwlwYWdlID0gKHVuc2lnbmVkIGxvbmcpZ2V0X1RUQigpOwogCWlmIChwYWdlKSB7Ci0JCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKikgcGFnZSlbYWRkcmVzcyA+PiAyMl07CisJCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKikgcGFnZSlbYWRkcmVzcyA+PiBQR0RJUl9TSElGVF07CiAJCXByaW50ayhLRVJOX0FMRVJUICIqcGRlID0gJTA4bHhcbiIsIHBhZ2UpOwogCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKIAkJCXBhZ2UgJj0gUEFHRV9NQVNLOwpAQCAtMTY2LDk4ICsyMTQsMTMgQEAKIAkgKiBTZW5kIGEgc2lnYnVzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2Ugd2VyZSBpbiBrZXJuZWwKIAkgKiBvciB1c2VyIG1vZGUuCiAJICovCi0JdHNrLT50aHJlYWQuYWRkcmVzcyA9IGFkZHJlc3M7Ci0JdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IHdyaXRlYWNjZXNzOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxNDsKLQlmb3JjZV9zaWcoU0lHQlVTLCB0c2spOworCWluZm8uc2lfc2lnbm8gPSBTSUdCVVM7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gQlVTX0FEUkVSUjsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKWFkZHJlc3M7CisJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgdHNrKTsKIAogCS8qIEtlcm5lbCBtb2RlPyBIYW5kbGUgZXhjZXB0aW9ucyBvciBkaWUgKi8KIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJZ290byBub19jb250ZXh0OwogfQotCi0jaWZkZWYgQ09ORklHX1NIX1NUT1JFX1FVRVVFUwotLyoKLSAqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSBTSC00IHN0b3JlIHF1ZXVlcywgYXMgcGFnZXMgZm9yIHRoaXMKLSAqIHNwYWNlIHN0aWxsIG5lZWQgdG8gYmUgZmF1bHRlZCBpbiBiZWZvcmUgaXQncyBwb3NzaWJsZSB0byBmbHVzaCB0aGUKLSAqIHN0b3JlIHF1ZXVlIGNhY2hlIGZvciB3cml0ZW91dCB0byB0aGUgcmVtYXBwZWQgcmVnaW9uLgotICovCi0jZGVmaW5lIFAzX0FERFJfTUFYCQkoUDRTRUdfU1RPUkVfUVVFICsgMHgwNDAwMDAwMCkKLSNlbHNlCi0jZGVmaW5lIFAzX0FERFJfTUFYCQlQNFNFRwotI2VuZGlmCi0KLS8qCi0gKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgotICovCi1hc21saW5rYWdlIGludCBfX2twcm9iZXMgX19kb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCQkgdW5zaWduZWQgbG9uZyB3cml0ZWFjY2VzcywKLQkJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKLXsKLQlwZ2RfdCAqcGdkOwotCXB1ZF90ICpwdWQ7Ci0JcG1kX3QgKnBtZDsKLQlwdGVfdCAqcHRlOwotCXB0ZV90IGVudHJ5OwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07Ci0Jc3BpbmxvY2tfdCAqcHRsOwotCWludCByZXQgPSAxOwotCi0jaWZkZWYgQ09ORklHX1NIX0tHREIKLQlpZiAoa2dkYl9ub2ZhdWx0ICYmIGtnZGJfYnVzX2Vycl9ob29rKQotCQlrZ2RiX2J1c19lcnJfaG9vaygpOwotI2VuZGlmCi0KLQkvKgotCSAqIFdlIGRvbid0IHRha2UgcGFnZSBmYXVsdHMgZm9yIFAxLCBQMiwgYW5kIHBhcnRzIG9mIFA0LCB0aGVzZQotCSAqIGFyZSBhbHdheXMgbWFwcGVkLCB3aGV0aGVyIGl0IGJlIGR1ZSB0byBsZWdhY3kgYmVoYXZpb3VyIGluCi0JICogMjktYml0IG1vZGUsIG9yIGR1ZSB0byBQTUIgY29uZmlndXJhdGlvbiBpbiAzMi1iaXQgbW9kZS4KLQkgKi8KLQlpZiAoYWRkcmVzcyA+PSBQM1NFRyAmJiBhZGRyZXNzIDwgUDNfQUREUl9NQVgpIHsKLQkJcGdkID0gcGdkX29mZnNldF9rKGFkZHJlc3MpOwotCQltbSA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJaWYgKHVubGlrZWx5KGFkZHJlc3MgPj0gVEFTS19TSVpFIHx8ICFtbSkpCi0JCQlyZXR1cm4gMTsKLQotCQlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKLQl9Ci0KLQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7Ci0JaWYgKHB1ZF9ub25lX29yX2NsZWFyX2JhZChwdWQpKQotCQlyZXR1cm4gMTsKLQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcmVzcyk7Ci0JaWYgKHBtZF9ub25lX29yX2NsZWFyX2JhZChwbWQpKQotCQlyZXR1cm4gMTsKLQotCWlmIChtbSkKLQkJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCAmcHRsKTsKLQllbHNlCi0JCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcmVzcyk7Ci0KLQllbnRyeSA9ICpwdGU7Ci0JaWYgKHVubGlrZWx5KHB0ZV9ub25lKGVudHJ5KSB8fCBwdGVfbm90X3ByZXNlbnQoZW50cnkpKSkKLQkJZ290byB1bmxvY2s7Ci0JaWYgKHVubGlrZWx5KHdyaXRlYWNjZXNzICYmICFwdGVfd3JpdGUoZW50cnkpKSkKLQkJZ290byB1bmxvY2s7Ci0KLQlpZiAod3JpdGVhY2Nlc3MpCi0JCWVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpOwotCWVudHJ5ID0gcHRlX21reW91bmcoZW50cnkpOwotCi0jaWZkZWYgQ09ORklHX0NQVV9TSDQKLQkvKgotCSAqIElUTEIgaXMgbm90IGFmZmVjdGVkIGJ5ICJsZHRsYiIgaW5zdHJ1Y3Rpb24uCi0JICogU28sIHdlIG5lZWQgdG8gZmx1c2ggdGhlIGVudHJ5IGJ5IG91cnNlbHZlcy4KLQkgKi8KLQlfX2ZsdXNoX3RsYl9wYWdlKGdldF9hc2lkKCksIGFkZHJlc3MgJiBQQUdFX01BU0spOwotI2VuZGlmCi0KLQlzZXRfcHRlKHB0ZSwgZW50cnkpOwotCXVwZGF0ZV9tbXVfY2FjaGUoTlVMTCwgYWRkcmVzcywgZW50cnkpOwotCXJldCA9IDA7Ci11bmxvY2s6Ci0JaWYgKG1tKQotCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9zaC9tbS9odWdldGxicGFnZS5jCmluZGV4IDMyOTA1OWQuLmNmMmMyZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3NoL21tL2h1Z2V0bGJwYWdlLmMKQEAgLTYzLDYgKzYzLDExIEBACiAJcmV0dXJuIHB0ZTsKIH0KIAoraW50IGh1Z2VfcG1kX3Vuc2hhcmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgKmFkZHIsIHB0ZV90ICpwdGVwKQoreworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgcGFnZSAqZm9sbG93X2h1Z2VfYWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHdyaXRlKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pbml0LmMgYi9hcmNoL3NoL21tL2luaXQuYwppbmRleCA3MTU0ZDFjLi4yOWJkMzdiIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2luaXQuYworKysgYi9hcmNoL3NoL21tL2luaXQuYwpAQCAtNzcsNiArNzcsNyBAQAogCXByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsY2FjaGVkKTsKIH0KIAorI2lmZGVmIENPTkZJR19NTVUKIHN0YXRpYyB2b2lkIHNldF9wdGVfcGh5cyh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGh5cywgcGdwcm90X3QgcHJvdCkKIHsKIAlwZ2RfdCAqcGdkOwpAQCAtODQsMzAgKzg1LDIyIEBACiAJcG1kX3QgKnBtZDsKIAlwdGVfdCAqcHRlOwogCi0JcGdkID0gc3dhcHBlcl9wZ19kaXIgKyBwZ2RfaW5kZXgoYWRkcik7CisJcGdkID0gcGdkX29mZnNldF9rKGFkZHIpOwogCWlmIChwZ2Rfbm9uZSgqcGdkKSkgewogCQlwZ2RfRVJST1IoKnBnZCk7CiAJCXJldHVybjsKIAl9CiAKLQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7Ci0JaWYgKHB1ZF9ub25lKCpwdWQpKSB7Ci0JCXBtZCA9IChwbWRfdCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKLQkJc2V0X3B1ZChwdWQsIF9fcHVkKF9fcGEocG1kKSB8IF9LRVJOUEdfVEFCTEUgfCBfUEFHRV9VU0VSKSk7Ci0JCWlmIChwbWQgIT0gcG1kX29mZnNldChwdWQsIDApKSB7Ci0JCQlwdWRfRVJST1IoKnB1ZCk7Ci0JCQlyZXR1cm47Ci0JCX0KKwlwdWQgPSBwdWRfYWxsb2MoTlVMTCwgcGdkLCBhZGRyKTsKKwlpZiAodW5saWtlbHkoIXB1ZCkpIHsKKwkJcHVkX0VSUk9SKCpwdWQpOworCQlyZXR1cm47CiAJfQogCi0JcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOwotCWlmIChwbWRfbm9uZSgqcG1kKSkgewotCQlwdGUgPSAocHRlX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7Ci0JCXNldF9wbWQocG1kLCBfX3BtZChfX3BhKHB0ZSkgfCBfS0VSTlBHX1RBQkxFIHwgX1BBR0VfVVNFUikpOwotCQlpZiAocHRlICE9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCkpIHsKLQkJCXBtZF9FUlJPUigqcG1kKTsKLQkJCXJldHVybjsKLQkJfQorCXBtZCA9IHBtZF9hbGxvYyhOVUxMLCBwdWQsIGFkZHIpOworCWlmICh1bmxpa2VseSghcG1kKSkgeworCQlwbWRfRVJST1IoKnBtZCk7CisJCXJldHVybjsKIAl9CiAKIAlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHIpOwpAQCAtMTQ3LDYgKzE0MCw3IEBACiAKIAlzZXRfcHRlX3BoeXMoYWRkcmVzcywgcGh5cywgcHJvdCk7CiB9CisjZW5kaWYJLyogQ09ORklHX01NVSAqLwogCiAvKiBSZWZlcmVuY2VzIHRvIHNlY3Rpb24gYm91bmRhcmllcyAqLwogCkBAIC0xNTUsOSArMTQ5LDYgQEAKIAogLyoKICAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMKLSAqCi0gKiBUaGlzIHJvdXRpbmVzIGFsc28gdW5tYXBzIHRoZSBwYWdlIGF0IHZpcnR1YWwga2VybmVsIGFkZHJlc3MgMCwgc28KLSAqIHRoYXQgd2UgY2FuIHRyYXAgdGhvc2UgcGVza3kgTlVMTC1yZWZlcmVuY2UgZXJyb3JzIGluIHRoZSBrZXJuZWwuCiAgKi8KIHZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCiB7CkBAIC0xODAsMTQgKzE3MSwxMSBAQAogCSAqLwogCXsKIAkJdW5zaWduZWQgbG9uZyBtYXhfZG1hLCBsb3csIHN0YXJ0X3BmbjsKLQkJcGdkX3QgKnBnX2RpcjsKLQkJaW50IGk7CiAKLQkJLyogV2UgZG9uJ3QgbmVlZCBrZXJuZWwgbWFwcGluZyBhcyBoYXJkd2FyZSBzdXBwb3J0IHRoYXQuICovCi0JCXBnX2RpciA9IHN3YXBwZXJfcGdfZGlyOwotCi0JCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QR0Q7IGkrKykKLQkJCXBnZF92YWwocGdfZGlyW2ldKSA9IDA7CisJCS8qIFdlIGRvbid0IG5lZWQgdG8gbWFwIHRoZSBrZXJuZWwgdGhyb3VnaCB0aGUgVExCLCBhcworCQkgKiBpdCBpcyBwZXJtYW5hdGx5IG1hcHBlZCB1c2luZyBQMS4gU28gY2xlYXIgdGhlCisJCSAqIGVudGlyZSBwZ2QuICovCisJCW1lbXNldChzd2FwcGVyX3BnX2RpciwgMCwgc2l6ZW9mKHN3YXBwZXJfcGdfZGlyKSk7CiAKIAkJLyogVHVybiBvbiB0aGUgTU1VICovCiAJCWVuYWJsZV9tbXUoKTsKQEAgLTIwNiw2ICsxOTQsMTAgQEAKIAkJfQogCX0KIAorCS8qIFNldCBhbiBpbml0aWFsIHZhbHVlIGZvciB0aGUgTU1VLlRUQiBzbyB3ZSBkb24ndCBoYXZlIHRvCisJICogY2hlY2sgZm9yIGEgbnVsbCB2YWx1ZS4gKi8KKwlzZXRfVFRCKHN3YXBwZXJfcGdfZGlyKTsKKwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkKIAkvKgogCSAqIElmIHdlIGRvbid0IGhhdmUgQ09ORklHX01NVSBzZXQgYW5kIHRoZSBwcm9jZXNzb3IgaW4gcXVlc3Rpb24KQEAgLTIyNyw3ICsyMTksNiBAQAogCiB2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQogewotCWV4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVsxMDI0XTsKIAlpbnQgY29kZXNpemUsIHJlc2VydmVkcGFnZXMsIGRhdGFzaXplLCBpbml0c2l6ZTsKIAlpbnQgdG1wOwogCWV4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW9yZW1hcC5jIGIvYXJjaC9zaC9tbS9pb3JlbWFwLmMKaW5kZXggYTlmZTgwYy4uOTBiNDk0YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC9zaC9tbS9pb3JlbWFwLmMKQEAgLTE2LDk5ICsxNiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1hcF9hcmVhX3B0ZShwdGVfdCAqIHB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0JcGdwcm90X3QgcGdwcm90ID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwKLQkJCQkgICBfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwKLQkJCQkgICBfUEFHRV9IV19TSEFSRUQgfCBfUEFHRV9GTEFHU19IQVJEIHwgZmxhZ3MpOwotCi0JYWRkcmVzcyAmPSB+UE1EX01BU0s7Ci0JZW5kID0gYWRkcmVzcyArIHNpemU7Ci0JaWYgKGVuZCA+IFBNRF9TSVpFKQotCQllbmQgPSBQTURfU0laRTsKLQlpZiAoYWRkcmVzcyA+PSBlbmQpCi0JCUJVRygpOwotCXBmbiA9IHBoeXNfYWRkciA+PiBQQUdFX1NISUZUOwotCWRvIHsKLQkJaWYgKCFwdGVfbm9uZSgqcHRlKSkgewotCQkJcHJpbnRrKCJyZW1hcF9hcmVhX3B0ZTogcGFnZSBhbHJlYWR5IGV4aXN0c1xuIik7Ci0JCQlCVUcoKTsKLQkJfQotCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwZm4sIHBncHJvdCkpOwotCQlhZGRyZXNzICs9IFBBR0VfU0laRTsKLQkJcGZuKys7Ci0JCXB0ZSsrOwotCX0gd2hpbGUgKGFkZHJlc3MgJiYgKGFkZHJlc3MgPCBlbmQpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmVtYXBfYXJlYV9wbWQocG1kX3QgKiBwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKLQl1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXVuc2lnbmVkIGxvbmcgZW5kOwotCi0JYWRkcmVzcyAmPSB+UEdESVJfTUFTSzsKLQllbmQgPSBhZGRyZXNzICsgc2l6ZTsKLQlpZiAoZW5kID4gUEdESVJfU0laRSkKLQkJZW5kID0gUEdESVJfU0laRTsKLQlwaHlzX2FkZHIgLT0gYWRkcmVzczsKLQlpZiAoYWRkcmVzcyA+PSBlbmQpCi0JCUJVRygpOwotCWRvIHsKLQkJcHRlX3QgKiBwdGUgPSBwdGVfYWxsb2Nfa2VybmVsKHBtZCwgYWRkcmVzcyk7Ci0JCWlmICghcHRlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXJlbWFwX2FyZWFfcHRlKHB0ZSwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywgYWRkcmVzcyArIHBoeXNfYWRkciwgZmxhZ3MpOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKLQkJcG1kKys7Ci0JfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOwotCXJldHVybiAwOwotfQotCi1pbnQgcmVtYXBfYXJlYV9wYWdlcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlpbnQgZXJyb3I7Ci0JcGdkX3QgKiBkaXI7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyZXNzICsgc2l6ZTsKLQotCXBoeXNfYWRkciAtPSBhZGRyZXNzOwotCWRpciA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKLQlmbHVzaF9jYWNoZV9hbGwoKTsKLQlpZiAoYWRkcmVzcyA+PSBlbmQpCi0JCUJVRygpOwotCWRvIHsKLQkJcHVkX3QgKnB1ZDsKLQkJcG1kX3QgKnBtZDsKLQotCQllcnJvciA9IC1FTk9NRU07Ci0KLQkJcHVkID0gcHVkX2FsbG9jKCZpbml0X21tLCBkaXIsIGFkZHJlc3MpOwotCQlpZiAoIXB1ZCkKLQkJCWJyZWFrOwotCQlwbWQgPSBwbWRfYWxsb2MoJmluaXRfbW0sIHB1ZCwgYWRkcmVzcyk7Ci0JCWlmICghcG1kKQotCQkJYnJlYWs7Ci0JCWlmIChyZW1hcF9hcmVhX3BtZChwbWQsIGFkZHJlc3MsIGVuZCAtIGFkZHJlc3MsCi0JCQkJCXBoeXNfYWRkciArIGFkZHJlc3MsIGZsYWdzKSkKLQkJCWJyZWFrOwotCQllcnJvciA9IDA7Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBHRElSX1NJWkUpICYgUEdESVJfTUFTSzsKLQkJZGlyKys7Ci0JfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOwotCWZsdXNoX3RsYl9hbGwoKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIC8qCiAgKiBSZW1hcCBhbiBhcmJpdHJhcnkgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBpbnRvIHRoZSBrZXJuZWwgdmlydHVhbAogICogYWRkcmVzcyBzcGFjZS4gTmVlZGVkIHdoZW4gdGhlIGtlcm5lbCB3YW50cyB0byBhY2Nlc3MgaGlnaCBhZGRyZXNzZXMKQEAgLTEyMyw2ICszNyw3IEBACiB7CiAJc3RydWN0IHZtX3N0cnVjdCAqIGFyZWE7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxhc3RfYWRkciwgYWRkciwgb3JpZ19hZGRyOworCXBncHJvdF90IHBncHJvdDsKIAogCS8qIERvbid0IGFsbG93IHdyYXBhcm91bmQgb3IgemVybyBzaXplICovCiAJbGFzdF9hZGRyID0gcGh5c19hZGRyICsgc2l6ZSAtIDE7CkBAIC0xOTIsOCArMTA3LDkgQEAKIAl9CiAjZW5kaWYKIAorCXBncHJvdCA9IF9fcGdwcm90KHBncHJvdF92YWwoUEFHRV9LRVJORUxfTk9DQUNIRSkgfCBmbGFncyk7CiAJaWYgKGxpa2VseShzaXplKSkKLQkJaWYgKHJlbWFwX2FyZWFfcGFnZXMoYWRkciwgcGh5c19hZGRyLCBzaXplLCBmbGFncykpIHsKKwkJaWYgKGlvcmVtYXBfcGFnZV9yYW5nZShhZGRyLCBhZGRyICsgc2l6ZSwgcGh5c19hZGRyLCBwZ3Byb3QpKSB7CiAJCQl2dW5tYXAoKHZvaWQgKilvcmlnX2FkZHIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctZG1hLmMgYi9hcmNoL3NoL21tL3BnLWRtYS5jCmluZGV4IDE0MDZkMmUuLmJiMjM2NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vcGctZG1hLmMKKysrIGIvYXJjaC9zaC9tbS9wZy1kbWEuYwpAQCAtMzksOCArMzksNiBAQAogCiBzdGF0aWMgdm9pZCBjbGVhcl9wYWdlX2RtYSh2b2lkICp0bykKIHsKLQlleHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbMTAyNF07Ci0KIAkvKgogCSAqIFdlIGdldCBpbnZva2VkIHF1aXRlIGVhcmx5IG9uLCBpZiB0aGUgRE1BQyBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZAogCSAqIHlldCwgZmFsbCBiYWNrIG9uIHRoZSBzbG93IG1hbnVhbCBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctc2g0LmMgYi9hcmNoL3NoL21tL3BnLXNoNC5jCmluZGV4IDA3MzcxZWQuLjNmOThkMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vcGctc2g0LmMKKysrIGIvYXJjaC9zaC9tbS9wZy1zaDQuYwpAQCAtNiwyMiArNiwxMiBAQAogICoKICAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgogICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCi1leHRlcm4gc3RydWN0IHNlbWFwaG9yZSBwM21hcF9zZW1bXTsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggcDNtYXBfbXV0ZXhbXTsKIAogI2RlZmluZSBDQUNIRV9BTElBUyAoY3B1X2RhdGEtPmRjYWNoZS5hbGlhc19tYXNrKQogCkBAIC0zNywxMCArMjcsNiBAQAogCWlmICgoKGFkZHJlc3MgXiAodW5zaWduZWQgbG9uZyl0bykgJiBDQUNIRV9BTElBUykgPT0gMCkKIAkJY2xlYXJfcGFnZSh0byk7CiAJZWxzZSB7Ci0JCXBncHJvdF90IHBncHJvdCA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfAotCQkJCQkgICBfUEFHRV9SVyB8IF9QQUdFX0NBQ0hBQkxFIHwKLQkJCQkJICAgX1BBR0VfRElSVFkgfCBfUEFHRV9BQ0NFU1NFRCB8Ci0JCQkJCSAgIF9QQUdFX0hXX1NIQVJFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpOwogCQl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IFBIWVNBRERSKHRvKTsKIAkJdW5zaWduZWQgbG9uZyBwM19hZGRyID0gUDNTRUcgKyAoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKTsKIAkJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfayhwM19hZGRyKTsKQEAgLTUwLDggKzM2LDggQEAKIAkJcHRlX3QgZW50cnk7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJZW50cnkgPSBwZm5fcHRlKHBoeXNfYWRkciA+PiBQQUdFX1NISUZULCBwZ3Byb3QpOwotCQlkb3duKCZwM21hcF9zZW1bKGFkZHJlc3MgJiBDQUNIRV9BTElBUyk+PjEyXSk7CisJCWVudHJ5ID0gcGZuX3B0ZShwaHlzX2FkZHIgPj4gUEFHRV9TSElGVCwgUEFHRV9LRVJORUwpOworCQltdXRleF9sb2NrKCZwM21hcF9tdXRleFsoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKT4+MTJdKTsKIAkJc2V0X3B0ZShwdGUsIGVudHJ5KTsKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQlfX2ZsdXNoX3RsYl9wYWdlKGdldF9hc2lkKCksIHAzX2FkZHIpOwpAQCAtNTksNyArNDUsNyBAQAogCQl1cGRhdGVfbW11X2NhY2hlKE5VTEwsIHAzX2FkZHIsIGVudHJ5KTsKIAkJX19jbGVhcl91c2VyX3BhZ2UoKHZvaWQgKilwM19hZGRyLCB0byk7CiAJCXB0ZV9jbGVhcigmaW5pdF9tbSwgcDNfYWRkciwgcHRlKTsKLQkJdXAoJnAzbWFwX3NlbVsoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKT4+MTJdKTsKKwkJbXV0ZXhfdW5sb2NrKCZwM21hcF9tdXRleFsoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKT4+MTJdKTsKIAl9CiB9CiAKQEAgLTc3LDEwICs2Myw2IEBACiAJaWYgKCgoYWRkcmVzcyBeICh1bnNpZ25lZCBsb25nKXRvKSAmIENBQ0hFX0FMSUFTKSA9PSAwKQogCQljb3B5X3BhZ2UodG8sIGZyb20pOwogCWVsc2UgewotCQlwZ3Byb3RfdCBwZ3Byb3QgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwKLQkJCQkJICAgX1BBR0VfUlcgfCBfUEFHRV9DQUNIQUJMRSB8Ci0JCQkJCSAgIF9QQUdFX0RJUlRZIHwgX1BBR0VfQUNDRVNTRUQgfAotCQkJCQkgICBfUEFHRV9IV19TSEFSRUQgfCBfUEFHRV9GTEFHU19IQVJEKTsKIAkJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBQSFlTQUREUih0byk7CiAJCXVuc2lnbmVkIGxvbmcgcDNfYWRkciA9IFAzU0VHICsgKGFkZHJlc3MgJiBDQUNIRV9BTElBUyk7CiAJCXBnZF90ICpwZ2QgPSBwZ2Rfb2Zmc2V0X2socDNfYWRkcik7CkBAIC05MCw4ICs3Miw4IEBACiAJCXB0ZV90IGVudHJ5OwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCWVudHJ5ID0gcGZuX3B0ZShwaHlzX2FkZHIgPj4gUEFHRV9TSElGVCwgcGdwcm90KTsKLQkJZG93bigmcDNtYXBfc2VtWyhhZGRyZXNzICYgQ0FDSEVfQUxJQVMpPj4xMl0pOworCQllbnRyeSA9IHBmbl9wdGUocGh5c19hZGRyID4+IFBBR0VfU0hJRlQsIFBBR0VfS0VSTkVMKTsKKwkJbXV0ZXhfbG9jaygmcDNtYXBfbXV0ZXhbKGFkZHJlc3MgJiBDQUNIRV9BTElBUyk+PjEyXSk7CiAJCXNldF9wdGUocHRlLCBlbnRyeSk7CiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJX19mbHVzaF90bGJfcGFnZShnZXRfYXNpZCgpLCBwM19hZGRyKTsKQEAgLTk5LDcgKzgxLDcgQEAKIAkJdXBkYXRlX21tdV9jYWNoZShOVUxMLCBwM19hZGRyLCBlbnRyeSk7CiAJCV9fY29weV91c2VyX3BhZ2UoKHZvaWQgKilwM19hZGRyLCBmcm9tLCB0byk7CiAJCXB0ZV9jbGVhcigmaW5pdF9tbSwgcDNfYWRkciwgcHRlKTsKLQkJdXAoJnAzbWFwX3NlbVsoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKT4+MTJdKTsKKwkJbXV0ZXhfdW5sb2NrKCZwM21hcF9tdXRleFsoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKT4+MTJdKTsKIAl9CiB9CiAKQEAgLTEyMiw0ICsxMDQsMyBAQAogCX0KIAlyZXR1cm4gcHRlOwogfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL3BtYi5jIGIvYXJjaC9zaC9tbS9wbWIuYwppbmRleCA5MmU3NDUzLi5iNjBhZDgzIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL3BtYi5jCisrKyBiL2FyY2gvc2gvbW0vcG1iLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2RlZmluZSBOUl9QTUJfRU5UUklFUwkxNgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpwbWJfY2FjaGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnBtYl9jYWNoZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBtYl9tYXA7CiAKIHN0YXRpYyBzdHJ1Y3QgcG1iX2VudHJ5IHBtYl9pbml0X21hcFtdID0gewpAQCAtMjgzLDcgKzI4Myw3IEBACiAJfSB3aGlsZSAocG1iZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBtYl9jYWNoZV9jdG9yKHZvaWQgKnBtYiwga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBwbWJfY2FjaGVfY3Rvcih2b2lkICpwbWIsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHBtYl9lbnRyeSAqcG1iZSA9IHBtYjsKIApAQCAtMjk3LDcgKzI5Nyw3IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZwbWJfbGlzdF9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgcG1iX2NhY2hlX2R0b3Iodm9pZCAqcG1iLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIHBtYl9jYWNoZV9kdG9yKHZvaWQgKnBtYiwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzcGluX2xvY2tfaXJxKCZwbWJfbGlzdF9sb2NrKTsKIAlwbWJfbGlzdF9kZWwocG1iKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvb3Byb2ZpbGUvb3BfbW9kZWxfc2g3NzUwLmMgYi9hcmNoL3NoL29wcm9maWxlL29wX21vZGVsX3NoNzc1MC5jCmluZGV4IGMyNjUxODUuLjYwNDAyZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvb3Byb2ZpbGUvb3BfbW9kZWxfc2g3NzUwLmMKKysrIGIvYXJjaC9zaC9vcHJvZmlsZS9vcF9tb2RlbF9zaDc3NTAuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHRvX2NvdW50ZXIoc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWU7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZTsKIAogCXJldHVybiAoaW50KXNpbXBsZV9zdHJ0b2wobmFtZSwgTlVMTCwgMTApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCmluZGV4IGFjNTc2MzguLjA1NzE3NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTMwLDMgKzMwLDUgQEAKIFRJVEFOCQkJU0hfVElUQU4KIFNITUlOCQkJU0hfU0hNSU4KIDc3MTBWT0lQR1cJCVNIXzc3MTBWT0lQR1cKKzcyMDZTRQkJCVNIXzcyMDZfU09MVVRJT05fRU5HSU5FCis3NjE5U0UJCQlTSF83NjE5X1NPTFVUSU9OX0VOR0lORQpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L0tjb25maWcgYi9hcmNoL3NoNjQvS2NvbmZpZwppbmRleCA1OGM2NzhlLi43YmMwNzQ0IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQvS2NvbmZpZworKysgYi9hcmNoL3NoNjQvS2NvbmZpZwpAQCAtMzksNiArMzksMTQgQEAKIGNvbmZpZyBHRU5FUklDX0lTQV9ETUEKIAlib29sCiAKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VMzIKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VNjQKKwlib29sCisJZGVmYXVsdCBuCisKIHNvdXJjZSBpbml0L0tjb25maWcKIAogbWVudSAiU3lzdGVtIHR5cGUiCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3NoNjQva2VybmVsL3NldHVwLmMKaW5kZXggZmZiMzEwZS4uYjllN2Q1NCAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvc2V0dXAuYwpAQCAtMjQzLDkgKzI0Myw3IEBACiAJCWlmIChJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSA8PSAoUEZOX1BIWVMobGFzdF9wZm4pKSkgewogCQkgICAgICAgIHJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgSU5JVFJEX1NUQVJUICsgX19NRU1PUllfU1RBUlQsIElOSVRSRF9TSVpFKTsKIAotCQkJaW5pdHJkX3N0YXJ0ID0KLQkJCSAgKGxvbmcpIElOSVRSRF9TVEFSVCA/IElOSVRSRF9TVEFSVCArIFBBR0VfT0ZGU0VUICsgIF9fTUVNT1JZX1NUQVJUIDogMDsKLQorCQkJaW5pdHJkX3N0YXJ0ID0gKGxvbmcpIElOSVRSRF9TVEFSVCArIFBBR0VfT0ZGU0VUICsgX19NRU1PUllfU1RBUlQ7CiAJCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0ICsgSU5JVFJEX1NJWkU7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoImluaXRyZCBleHRlbmRzIGJleW9uZCBlbmQgb2YgbWVtb3J5ICIKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvc2hfa3N5bXMuYyBiL2FyY2gvc2g2NC9rZXJuZWwvc2hfa3N5bXMuYwppbmRleCA0YjJkZjcyLi43YWE0YjRmIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3NoX2tzeW1zLmMKKysrIGIvYXJjaC9zaDY0L2tlcm5lbC9zaF9rc3ltcy5jCkBAIC0zOCw3ICszOCw3IEBACiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwogCiAvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHkpOworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKIAogRVhQT1JUX1NZTUJPTChzdHJzdHIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9zaDY0L2tlcm5lbC9zaWduYWwuYwppbmRleCA5ZTJmZmM0Li4xNjY2ZDNlIDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvc2lnbmFsLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYThmY2MzYS4uOTVjNGQ3NSAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTA4LDEzICsxMDgsNyBAQAogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IENfUEhZUyguaW5pdGNhbGwuaW5pdCkgewotICAJKiguaW5pdGNhbGwxLmluaXQpCi0gIAkqKC5pbml0Y2FsbDIuaW5pdCkKLSAgCSooLmluaXRjYWxsMy5pbml0KQotICAJKiguaW5pdGNhbGw0LmluaXQpCi0gIAkqKC5pbml0Y2FsbDUuaW5pdCkKLSAgCSooLmluaXRjYWxsNi5pbml0KQotICAJKiguaW5pdGNhbGw3LmluaXQpCisJSU5JVENBTExTCiAgIH0KICAgX19pbml0Y2FsbF9lbmQgPSAuOwogICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCmluZGV4IDBlOGE3NDIuLjRiMjY3NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCisrKyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCkBAIC0xMTgsMjQgKzExOCwyNCBAQAogCiAvKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgYSBtZW1vcnkgYmxvY2sgYXQgYnVmZiwgbGVuZ3RoIGxlbiwKICAgIGFuZCBhZGRzIGluICJzdW0iICgzMi1iaXQpICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQgPSBkb19jc3VtKGJ1ZmYsIGxlbik7CiAKIAkvKiBhZGQgaW4gb2xkIHN1bSwgYW5kIGNhcnJ5Li4gKi8KLQlyZXN1bHQgKz0gc3VtOworCXJlc3VsdCArPSAoX19mb3JjZSB1MzIpc3VtOwogCS8qIDMyK2MgYml0cyAtPiAzMiBiaXRzICovCiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAKIAlwcl9kZWJ1ZygiY3N1bV9wYXJ0aWFsLCBidWZmICVwIGxlbiAlZCBzdW0gMHgleCByZXN1bHQ9MHglMDE2THhcbiIsCiAJCWJ1ZmYsIGxlbiwgc3VtLCByZXN1bHQpOwogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KIAogLyogQ29weSB3aGlsZSBjaGVja3N1bW1pbmcsIG90aGVyd2lzZSBsaWtlIGNzdW1fcGFydGlhbC4gICovCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXN1bSA9IGNzdW1fcGFydGlhbChzcmMsIGxlbiwgc3VtKTsKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CkBAIC0xNDUsOSArMTQ1LDkgQEAKIAogLyogQ29weSBmcm9tIHVzZXJzcGFjZSBhbmQgY29tcHV0ZSBjaGVja3N1bS4gIElmIHdlIGNhdGNoIGFuIGV4Y2VwdGlvbgogICAgdGhlbiB6ZXJvIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuICAqLwotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkgICAgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLAorCQkJICAgIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKIAlpbnQgbWlzc2luZzsKIApAQCAtMTY2LDkgKzE2Niw5IEBACiB9CiAKIC8qIENvcHkgdG8gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgKi8KLXVuc2lnbmVkIGludAorX193c3VtCiBjc3VtX3BhcnRpYWxfY29weV90b191c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCisJCQkgIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKIAlzdW0gPSBjc3VtX3BhcnRpYWwoc3JjLCBsZW4sIHN1bSk7CiAKQEAgLTE4MiwyOCArMTgyLDI0IEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi11bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXByX2RlYnVnKCJpcF9mYXN0X2NzdW0gJXAsJWRcbiIsIGlwaCwgaWhsKTsKIAotCXJldHVybiB+ZG9fY3N1bShpcGgsIGlobCAqIDQpOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5kb19jc3VtKGlwaCwgaWhsICogNCk7CiB9CiAKLXVuc2lnbmVkIGludCBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQl1bnNpZ25lZCBsb25nIGRhZGRyLAorX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQl1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCisJCQkJdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdDsKIAogCXByX2RlYnVnKCJudG9ocygweCV4KT0weCV4XG4iLCAweGRlYWQsIG50b2hzKDB4ZGVhZCkpOwogCXByX2RlYnVnKCJodG9ucygweCV4KT0weCV4XG4iLCAweGRlYWQsIGh0b25zKDB4ZGVhZCkpOwogCi0JcmVzdWx0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIHNhZGRyICsKLQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBkYWRkciArCi0JCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3VtICsKLQkJICAoKHVuc2lnbmVkIGxvbmcgbG9uZykgbnRvaHMobGVuKSA8PCAxNikgKwotCQkgICgodW5zaWduZWQgbG9uZyBsb25nKSBwcm90byA8PCA4KSk7CisJcmVzdWx0ID0gKF9fZm9yY2UgdTY0KSBzYWRkciArIChfX2ZvcmNlIHU2NCkgZGFkZHIgKworCQkgKF9fZm9yY2UgdTY0KSBzdW0gKyAoKGxlbiArIHByb3RvKSA8PCA4KTsKIAogCS8qIEZvbGQgZG93biB0byAzMi1iaXRzIHNvIHdlIGRvbid0IGxvb3NlIGluIHRoZSB0eXBlZGVmLWxlc3MKIAkgICBuZXR3b3JrIHN0YWNrLiAgKi8KQEAgLTIxNSwxNiArMjExLDUgQEAKIAlwcl9kZWJ1ZygiJXMgc2FkZHIgJXggZGFkZHIgJXggbGVuICV4IHByb3RvICV4IHN1bSAleCByZXN1bHQgJTA4THhcbiIsCiAJCV9fRlVOQ1RJT05fXywgc2FkZHIsIGRhZGRyLCBsZW4sIHByb3RvLCBzdW0sIHJlc3VsdCk7CiAKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vLyBQb3N0IFNJTToKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKLXsKLQkvLyAgdW5zaWduZWQgZHVtbXk7Ci0JcHJfZGVidWcoImNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgc3JjICVwIGRzdCAlcCBsZW4gJWRcbiIsIHNyYywgZHN0LAotCQlsZW4pOwotCi0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5KHNyYywgZHN0LCBsZW4sIHN1bSk7CisJcmV0dXJuIChfX3dzdW0pcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L2xpYi9kYmcuYyBiL2FyY2gvc2g2NC9saWIvZGJnLmMKaW5kZXggMTMyNmY0NS4uNDMxMGZjOCAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L2xpYi9kYmcuYworKysgYi9hcmNoL3NoNjQvbGliL2RiZy5jCkBAIC0zODMsNyArMzgzLDcgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qCi0qKiBEZXBlbmRpbmcgb24gPGJhc2U+IHNjYW4gdGhlIE1NVSwgRGF0YSBvciBJbnN0cmN0aW9uIHNpZGUKKyoqIERlcGVuZGluZyBvbiA8YmFzZT4gc2NhbiB0aGUgTU1VLCBEYXRhIG9yIEluc3RydWN0aW9uIHNpZGUKICoqIGxvb2tpbmcgZm9yIGEgdmFsaWQgbWFwcGluZyBtYXRjaGluZyBFYWRkciAmIGFzaWQuCiAqKiBSZXR1cm4gLTEgaWYgbm90IGZvdW5kIG9yIHRoZSBUTEIgaWQgZW50cnkgb3RoZXJ3aXNlLgogKiogTm90ZTogaXQgd29ya3Mgb25seSBmb3IgNGsgcGFnZXMhCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbW0vZmF1bHQuYyBiL2FyY2gvc2g2NC9tbS9mYXVsdC5jCmluZGV4IDhlMmY2YzIuLjRmNzJhYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc2g2NC9tbS9mYXVsdC5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQgb3IgaGF2ZSBubyB1c2VyCiAJICogY29udGV4dCwgd2UgbXVzdCBub3QgdGFrZSB0aGUgZmF1bHQuLgogCSAqLwotCWlmIChpbl9pbnRlcnJ1cHQoKSB8fCAhbW0pCisJaWYgKGluX2F0b21pYygpIHx8ICFtbSkKIAkJZ290byBub19jb250ZXh0OwogCiAJLyogVExCIG1pc3NlcyB1cG9uIHNvbWUgY2FjaGUgZmx1c2hlcyBnZXQgZG9uZSB1bmRlciBjbGkoKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL3NoNjQvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCAxODdjZjAxLi40YjQ1NWY2IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3NoNjQvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtNTMsNiArNTMsMTEgQEAKIAlyZXR1cm4gcHRlOwogfQogCitpbnQgaHVnZV9wbWRfdW5zaGFyZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqYWRkciwgcHRlX3QgKnB0ZXApCit7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQgc2V0X2h1Z2VfcHRlX2F0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCSAgICAgcHRlX3QgKnB0ZXAsIHB0ZV90IGVudHJ5KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zaDY0L21tL2lvcmVtYXAuYyBiL2FyY2gvc2g2NC9tbS9pb3JlbWFwLmMKaW5kZXggODBjNTY3NS4uZmYyNmMwMiAxMDA2NDQKLS0tIGEvYXJjaC9zaDY0L21tL2lvcmVtYXAuYworKysgYi9hcmNoL3NoNjQvbW0vaW9yZW1hcC5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtMjgsOTYgKzI4LDYgQEAKIHN0YXRpYyB2b2lkIHNobWVkaWFfbWFwaW9hZGRyKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2htZWRpYV9pb3JlbWFwKHN0cnVjdCByZXNvdXJjZSAqLCB1MzIsIGludCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZW1hcF9hcmVhX3B0ZShwdGVfdCAqIHB0ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0JcGdwcm90X3QgcGdwcm90ID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCAgfCBfUEFHRV9SRUFEICAgfAotCQkJCSAgIF9QQUdFX1dSSVRFICAgIHwgX1BBR0VfRElSVFkgIHwKLQkJCQkgICBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX1NIQVJFRCB8IGZsYWdzKTsKLQotCWFkZHJlc3MgJj0gflBNRF9NQVNLOwotCWVuZCA9IGFkZHJlc3MgKyBzaXplOwotCWlmIChlbmQgPiBQTURfU0laRSkKLQkJZW5kID0gUE1EX1NJWkU7Ci0JaWYgKGFkZHJlc3MgPj0gZW5kKQotCQlCVUcoKTsKLQotCXBmbiA9IHBoeXNfYWRkciA+PiBQQUdFX1NISUZUOwotCi0JcHJfZGVidWcoIiAgICAlczogcHRlICVwIGFkZHJlc3MgJWx4IHNpemUgJWx4IHBoeXNfYWRkciAlbHhcbiIsCi0JCSBfX0ZVTkNUSU9OX18scHRlLGFkZHJlc3Msc2l6ZSxwaHlzX2FkZHIpOwotCi0JZG8gewotCQlpZiAoIXB0ZV9ub25lKCpwdGUpKSB7Ci0JCQlwcmludGsoInJlbWFwX2FyZWFfcHRlOiBwYWdlIGFscmVhZHkgZXhpc3RzXG4iKTsKLQkJCUJVRygpOwotCQl9Ci0KLQkJc2V0X3B0ZShwdGUsIHBmbl9wdGUocGZuLCBwZ3Byb3QpKTsKLQkJYWRkcmVzcyArPSBQQUdFX1NJWkU7Ci0JCXBmbisrOwotCQlwdGUrKzsKLQl9IHdoaWxlIChhZGRyZXNzICYmIChhZGRyZXNzIDwgZW5kKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJlbWFwX2FyZWFfcG1kKHBtZF90ICogcG1kLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQl1bnNpZ25lZCBsb25nIGVuZDsKLQotCWFkZHJlc3MgJj0gflBHRElSX01BU0s7Ci0JZW5kID0gYWRkcmVzcyArIHNpemU7Ci0KLQlpZiAoZW5kID4gUEdESVJfU0laRSkKLQkJZW5kID0gUEdESVJfU0laRTsKLQotCXBoeXNfYWRkciAtPSBhZGRyZXNzOwotCi0JaWYgKGFkZHJlc3MgPj0gZW5kKQotCQlCVUcoKTsKLQotCWRvIHsKLQkJcHRlX3QgKiBwdGUgPSBwdGVfYWxsb2Nfa2VybmVsKHBtZCwgYWRkcmVzcyk7Ci0JCWlmICghcHRlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXJlbWFwX2FyZWFfcHRlKHB0ZSwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywgYWRkcmVzcyArIHBoeXNfYWRkciwgZmxhZ3MpOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKLQkJcG1kKys7Ci0JfSB3aGlsZSAoYWRkcmVzcyAmJiAoYWRkcmVzcyA8IGVuZCkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKLQkJCQkgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWludCBlcnJvcjsKLQlwZ2RfdCAqIGRpcjsKLQl1bnNpZ25lZCBsb25nIGVuZCA9IGFkZHJlc3MgKyBzaXplOwotCi0JcGh5c19hZGRyIC09IGFkZHJlc3M7Ci0JZGlyID0gcGdkX29mZnNldF9rKGFkZHJlc3MpOwotCWZsdXNoX2NhY2hlX2FsbCgpOwotCWlmIChhZGRyZXNzID49IGVuZCkKLQkJQlVHKCk7Ci0JZG8gewotCQlwbWRfdCAqcG1kID0gcG1kX2FsbG9jKCZpbml0X21tLCBkaXIsIGFkZHJlc3MpOwotCQllcnJvciA9IC1FTk9NRU07Ci0JCWlmICghcG1kKQotCQkJYnJlYWs7Ci0JCWlmIChyZW1hcF9hcmVhX3BtZChwbWQsIGFkZHJlc3MsIGVuZCAtIGFkZHJlc3MsCi0JCQkJICAgcGh5c19hZGRyICsgYWRkcmVzcywgZmxhZ3MpKSB7Ci0JCQkgYnJlYWs7Ci0JCX0KLQkJZXJyb3IgPSAwOwotCQlhZGRyZXNzID0gKGFkZHJlc3MgKyBQR0RJUl9TSVpFKSAmIFBHRElSX01BU0s7Ci0JCWRpcisrOwotCX0gd2hpbGUgKGFkZHJlc3MgJiYgKGFkZHJlc3MgPCBlbmQpKTsKLQlmbHVzaF90bGJfYWxsKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBHZW5lcmljIG1hcHBpbmcgZnVuY3Rpb24gKG5vdCB2aXNpYmxlIG91dHNpZGUpOgogICovCkBAIC0xMzYsMTIgKzQ2LDE3IEBACiAJdm9pZCAqIGFkZHI7CiAJc3RydWN0IHZtX3N0cnVjdCAqIGFyZWE7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxhc3RfYWRkcjsKKwlwZ3Byb3RfdCBwZ3Byb3Q7CiAKIAkvKiBEb24ndCBhbGxvdyB3cmFwYXJvdW5kIG9yIHplcm8gc2l6ZSAqLwogCWxhc3RfYWRkciA9IHBoeXNfYWRkciArIHNpemUgLSAxOwogCWlmICghc2l6ZSB8fCBsYXN0X2FkZHIgPCBwaHlzX2FkZHIpCiAJCXJldHVybiBOVUxMOwogCisJcGdwcm90ID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCAgfCBfUEFHRV9SRUFEICAgfAorCQkJICBfUEFHRV9XUklURSAgICB8IF9QQUdFX0RJUlRZICB8CisJCQkgIF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfU0hBUkVEIHwgZmxhZ3MpOworCiAJLyoKIAkgKiBNYXBwaW5ncyBoYXZlIHRvIGJlIHBhZ2UtYWxpZ25lZAogCSAqLwpAQCAtMTU4LDcgKzczLDggQEAKIAkJcmV0dXJuIE5VTEw7CiAJYXJlYS0+cGh5c19hZGRyID0gcGh5c19hZGRyOwogCWFkZHIgPSBhcmVhLT5hZGRyOwotCWlmIChyZW1hcF9hcmVhX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFkZHIsIHBoeXNfYWRkciwgc2l6ZSwgZmxhZ3MpKSB7CisJaWYgKGlvcmVtYXBfcGFnZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLCAodW5zaWduZWQgbG9uZylhZGRyICsgc2l6ZSwKKwkJCSAgICAgICBwaHlzX2FkZHIsIHBncHJvdCkpIHsKIAkJdnVubWFwKGFkZHIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggOTQzMWU5Ni4uZDBkZWMxZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMTY2LDYgKzE2NiwxNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogY29uZmlnIFNVTl9QTQogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTIxMiw4ICsyMjAsOCBAQAogCXRyaXN0YXRlICJTdW40bSBMRUQgZHJpdmVyIgogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHRvZ2dsZXMgdGhlIGZyb250LXBhbmVsIExFRCBvbiBzdW40bSBzeXN0ZW1zCi0JICBpbiBhIHVzZXItc3BlY2lmeWFibGUgbWFubmVyLiAgSXQncyBzdGF0ZSBjYW4gYmUgcHJvYmVkCi0JICBieSByZWFkaW5nIC9wcm9jL2xlZCBhbmQgaXQncyBibGlua2luZyBtb2RlIGNhbiBiZSBjaGFuZ2VkCisJICBpbiBhIHVzZXItc3BlY2lmaWFibGUgbWFubmVyLiAgSXRzIHN0YXRlIGNhbiBiZSBwcm9iZWQKKwkgIGJ5IHJlYWRpbmcgL3Byb2MvbGVkIGFuZCBpdHMgYmxpbmtpbmcgbW9kZSBjYW4gYmUgY2hhbmdlZAogCSAgdmlhIHdyaXRlcyB0byAvcHJvYy9sZWQKIAogc291cmNlICJmcy9LY29uZmlnLmJpbmZtdCIKQEAgLTI4OSw2ICsyOTcsMTMgQEAKIAogc291cmNlICJmcy9LY29uZmlnIgogCittZW51ICJJbnN0cnVtZW50YXRpb24gU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCitzb3VyY2UgImFyY2gvc3BhcmMvb3Byb2ZpbGUvS2NvbmZpZyIKKworZW5kbWVudQorCiBzb3VyY2UgImFyY2gvc3BhcmMvS2NvbmZpZy5kZWJ1ZyIKIAogc291cmNlICJzZWN1cml0eS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9NYWtlZmlsZSBiL2FyY2gvc3BhcmMvTWFrZWZpbGUKaW5kZXggNGNkYmIyZC4uZjMzYzM4MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL01ha2VmaWxlCkBAIC0zMCw2ICszMCw4IEBACiBjb3JlLXkgKz0gYXJjaC9zcGFyYy9rZXJuZWwvIGFyY2gvc3BhcmMvbW0vIGFyY2gvc3BhcmMvbWF0aC1lbXUvCiBsaWJzLXkgKz0gYXJjaC9zcGFyYy9wcm9tLyBhcmNoL3NwYXJjL2xpYi8KIAorZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkJKz0gYXJjaC9zcGFyYy9vcHJvZmlsZS8KKwogIyBFeHBvcnQgd2hhdCBpcyBuZWVkZWQgYnkgYXJjaC9zcGFyYy9ib290L01ha2VmaWxlCiAjIFJlbmFtaW5nIGlzIGRvbmUgdG8gYXZvaWQgY29uZnVzaW5nIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZXMgaW4gMi41LjQ1IChtdWx0eS0pCiBJTklUX1kJCTo9ICQocGF0c3Vic3QgJS8sICUvYnVpbHQtaW4ubywgJChpbml0LXkpKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jCmluZGV4IDc1YWMyNGQuLmJhNThjM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9lYnVzLmMKQEAgLTIzNywxMiArMjM3LDEyIEBACiAJZGV2LT5vZmRldi5ub2RlID0gZHA7CiAJZGV2LT5vZmRldi5kZXYucGFyZW50ID0gJmRldi0+YnVzLT5vZmRldi5kZXY7CiAJZGV2LT5vZmRldi5kZXYuYnVzID0gJmVidXNfYnVzX3R5cGU7Ci0Jc3RyY3B5KGRldi0+b2ZkZXYuZGV2LmJ1c19pZCwgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOworCXNwcmludGYoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCAiZWJ1c1slMDh4XSIsIGRwLT5ub2RlKTsKIAogCS8qIFJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJmRldi0+b2ZkZXYpICE9IDApCiAJCXByaW50ayhLRVJOX0RFQlVHICJlYnVzOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGVycm9yIGZvciAlcyFcbiIsCi0JCSAgICAgICBkZXYtPm9mZGV2LmRldi5idXNfaWQpOworCQkgICAgICAgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOwogCiAJaWYgKChkcCA9IGRwLT5jaGlsZCkgIT0gTlVMTCkgewogCQlkZXYtPmNoaWxkcmVuID0gKHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICopCkBAIC0zMzIsMTIgKzMzMiwxMiBAQAogCQllYnVzLT5vZmRldi5ub2RlID0gZHA7CiAJCWVidXMtPm9mZGV2LmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCQllYnVzLT5vZmRldi5kZXYuYnVzID0gJmVidXNfYnVzX3R5cGU7Ci0JCXN0cmNweShlYnVzLT5vZmRldi5kZXYuYnVzX2lkLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisJCXNwcmludGYoZWJ1cy0+b2ZkZXYuZGV2LmJ1c19pZCwgImVidXMlZCIsIG51bV9lYnVzKTsKIAogCQkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KIAkJaWYgKG9mX2RldmljZV9yZWdpc3RlcigmZWJ1cy0+b2ZkZXYpICE9IDApCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiZWJ1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkJICAgICAgIGVidXMtPm9mZGV2LmRldi5idXNfaWQpOworCQkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKIAogCiAJCW5kID0gZHAtPmNoaWxkOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKaW5kZXggYTRlZGZmNC4uODMxZjU0MCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCkBAIC0zMiwxMyArMzIsMTIgQEAKICNpbmNsdWRlIDxhc20vbXhjYy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFzbS9hc21tYWNyby5oPgogCiAjZGVmaW5lIGN1cnB0ciAgICAgIGc2CiAKLSNkZWZpbmUgTlJfU1lTQ0FMTFMgMzAwICAgICAgLyogRWFjaCBPUyBpcyBkaWZmZXJlbnQuLi4gKi8KLQogLyogVGhlc2UgYXJlIGp1c3QgaGFuZHkuICovCiAjZGVmaW5lIF9TVglzYXZlCSVzcCwgLVNUQUNLRlJBTUVfU1osICVzcAogI2RlZmluZSBfUlMgICAgIHJlc3RvcmUgCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCmluZGV4IDU0ZDUxYjQuLmNiYmM5ODggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCkBAIC0zMTcsOSArMzE3LDggQEAKIAlpZiAoKHZhID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX0NPTVAsIG9yZGVyKSkgPT0gMCkKIAkJZ290byBlcnJfbm9wYWdlczsKIAotCWlmICgocmVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJaWYgKChyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKIAkJZ290byBlcnJfbm9tZW07Ci0JbWVtc2V0KChjaGFyKilyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIAogCWlmIChhbGxvY2F0ZV9yZXNvdXJjZSgmX3NwYXJjX2R2bWEsIHJlcywgbGVuX3RvdGFsLAogCSAgICBfc3BhcmNfZHZtYS5zdGFydCwgX3NwYXJjX2R2bWEuZW5kLCBQQUdFX1NJWkUsIE5VTEwsIE5VTEwpICE9IDApIHsKQEAgLTU4OSwxMiArNTg4LDExIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmICgocmVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwlpZiAoKHJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CiAJCWZyZWVfcGFnZXModmEsIG9yZGVyKTsKIAkJcHJpbnRrKCJwY2lfYWxsb2NfY29uc2lzdGVudDogbm8gY29yZVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQoKGNoYXIqKXJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCiAJaWYgKGFsbG9jYXRlX3Jlc291cmNlKCZfc3BhcmNfZHZtYSwgcmVzLCBsZW5fdG90YWwsCiAJICAgIF9zcGFyY19kdm1hLnN0YXJ0LCBfc3BhcmNfZHZtYS5lbmQsIFBBR0VfU0laRSwgTlVMTCwgTlVMTCkgIT0gMCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnEuYwppbmRleCBiM2I2NjgwLi41YjQ4NDFkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnEuYwpAQCAtMzUxLDcgKzM1MSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9GRAotZXh0ZXJuIHZvaWQgZmxvcHB5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitleHRlcm4gdm9pZCBmbG9wcHlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKIHZvaWQgc3BhcmNfZmxvcHB5X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtNDI1LDcgKzQyNSw3IEBACiAJfQogCQogCWlmIChhY3Rpb24gPT0gTlVMTCkKLQkgICAgYWN0aW9uID0gKHN0cnVjdCBpcnFhY3Rpb24gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJxYWN0aW9uKSwKKwkgICAgYWN0aW9uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlycWFjdGlvbiksCiAJCQkJCQkgR0ZQX0FUT01JQyk7CiAJCiAJaWYgKCFhY3Rpb24pIHsgCkBAIC01MjgsNyArNTI4LDcgQEAKIAl9CiAJCiAJaWYgKGFjdGlvbiA9PSBOVUxMKQotCQlhY3Rpb24gPSAoc3RydWN0IGlycWFjdGlvbiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFhY3Rpb24pLAorCQlhY3Rpb24gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJxYWN0aW9uKSwKIAkJCQkJCSAgICAgR0ZQX0FUT01JQyk7CiAJCiAJaWYgKCFhY3Rpb24pIHsgCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCmluZGV4IDc0YmVmMmEuLmRhYjYxNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCkBAIC02NTEsNyArNjUxLDcgQEAKIAlpZiAoIXBhcmVudCkKIAkJc3RyY3B5KG9wLT5kZXYuYnVzX2lkLCAicm9vdCIpOwogCWVsc2UKLQkJc3RyY3B5KG9wLT5kZXYuYnVzX2lkLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisJCXNwcmludGYob3AtPmRldi5idXNfaWQsICIlMDh4IiwgZHAtPm5vZGUpOwogCiAJaWYgKG9mX2RldmljZV9yZWdpc3RlcihvcCkpIHsKIAkJcHJpbnRrKCIlczogQ291bGQgbm90IHJlZ2lzdGVyIG9mIGRldmljZS5cbiIsCkBAIC03OTMsMTAgKzc5Myw5IEBACiB7CiAJc3RydWN0IG9mX2RldmljZSAqZGV2OwogCi0JZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKIAogCWRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKIAlkZXYtPmRldi5idXMgPSBidXM7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jCmluZGV4IDFiYWYxM2UuLjAwM2Y4ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jCkBAIC0yODksNyArMjg5LDEwIEBACiAKIAlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfVFJBQ0VNRSkgewogCQlyZXQgPSBwdHJhY2VfdHJhY2VtZSgpOwotCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLXJldCk7CisJCWVsc2UKKwkJCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwogCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jCmluZGV4IGY1ZWUxYWMuLjM4MzUyNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYwpAQCAtMTAzLDcgKzEwMyw2IEBACiAKIHVuc2lnbmVkIGludCBib290X2ZsYWdzIF9faW5pdGRhdGEgPSAwOwogI2RlZmluZSBCT09UTUVfREVCVUcgIDB4MQotI2RlZmluZSBCT09UTUVfU0lOR0xFIDB4MgogCiAvKiBFeHBvcnRlZCBmb3IgbW0vaW5pdC5jOnBhZ2luZ19pbml0LiAqLwogdW5zaWduZWQgbG9uZyBjbWRsaW5lX21lbW9yeV9zaXplIF9faW5pdGRhdGEgPSAwOwpAQCAtMTMyLDcgKzEzMSw2IEBACiAJCWJvb3RfZmxhZ3MgfD0gQk9PVE1FX0RFQlVHOwogCQlicmVhazsKIAljYXNlICdzJzoKLQkJYm9vdF9mbGFncyB8PSBCT09UTUVfU0lOR0xFOwogCQlicmVhazsKIAljYXNlICdoJzoKIAkJcHJvbV9wcmludGYoImJvb3RfZmxhZ3NfaW5pdDogSGFsdCFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfaXJxLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYwppbmRleCBkNGY5ZGE4Li4wZTI3ZTIyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9pcnEuYwpAQCAtMzI3LDcgKzMyNyw3IEBACiAJfQogCQogCWlmIChhY3Rpb24gPT0gTlVMTCkKLQkJYWN0aW9uID0gKHN0cnVjdCBpcnFhY3Rpb24gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJxYWN0aW9uKSwKKwkJYWN0aW9uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlycWFjdGlvbiksCiAJCQkJCQkgICAgIEdGUF9BVE9NSUMpOwogCQogCWlmICghYWN0aW9uKSB7IApAQCAtNTQ1LDggKzU0NSwxMSBAQAogCW5zYmkgPSAwOwogCWZvcl9lYWNoX3NidXMoc2J1cykKIAkJbnNiaSsrOwotCXNidXNfYWN0aW9ucyA9IChzdHJ1Y3Qgc2J1c19hY3Rpb24gKilrbWFsbG9jIChuc2JpICogOCAqIDQgKiBzaXplb2Yoc3RydWN0IHNidXNfYWN0aW9uKSwgR0ZQX0FUT01JQyk7Ci0JbWVtc2V0IChzYnVzX2FjdGlvbnMsIDAsIChuc2JpICogOCAqIDQgKiBzaXplb2Yoc3RydWN0IHNidXNfYWN0aW9uKSkpOworCXNidXNfYWN0aW9ucyA9IGt6YWxsb2MgKG5zYmkgKiA4ICogNCAqIHNpemVvZihzdHJ1Y3Qgc2J1c19hY3Rpb24pLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNidXNfYWN0aW9ucykgeworCQlwcm9tX3ByaW50ZigiU1VONEQ6IENhbm5vdCBhbGxvY2F0ZSBzYnVzX2FjdGlvbnMsIGhhbHRpbmcuXG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJfQogCWZvcl9lYWNoX3NidXMoc2J1cykgewogI2lmZGVmIENPTkZJR19TTVAJCiAJCWV4dGVybiB1bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3N1bm9zLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3Vub3MuYwppbmRleCA2ZjNhYzU0Li4wYmY4YzE2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3Vub3MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3Vub3MuYwpAQCAtOTQsOCArOTQsOCBAQAogCSAqIFN1bk9TIGlzIHNvIHN0dXBpZCBzb21lIHRpbWVzLi4uIGhtcGghCiAJICovCiAJaWYgKGZpbGUpIHsKLQkJaWYgKGltYWpvcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgPT0gTUVNX01BSk9SICYmCi0JCSAgICBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpID09IDUpIHsKKwkJaWYgKGltYWpvcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSA9PSBNRU1fTUFKT1IgJiYKKwkJICAgIGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSA9PSA1KSB7CiAJCQlmbGFncyB8PSBNQVBfQU5PTllNT1VTOwogCQkJZnB1dChmaWxlKTsKIAkJCWZpbGUgPSBOVUxMOwpAQCAtNjU1LDcgKzY1NSw3IEBACiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dDsKIAotCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJc29ja2V0ID0gU09DS0VUX0koaW5vZGUpOwogCWxvY2FsLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TCmluZGV4IDEwZGYzOGUuLmVhNzVjYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMKQEAgLTc4LDcgKzc4LDcgQEAKIC8qMjg1Ki8JLmxvbmcgc3lzX21rZGlyYXQsIHN5c19ta25vZGF0LCBzeXNfZmNob3duYXQsIHN5c19mdXRpbWVzYXQsIHN5c19mc3RhdGF0NjQKIC8qMjkwKi8JLmxvbmcgc3lzX3VubGlua2F0LCBzeXNfcmVuYW1lYXQsIHN5c19saW5rYXQsIHN5c19zeW1saW5rYXQsIHN5c19yZWFkbGlua2F0CiAvKjI5NSovCS5sb25nIHN5c19mY2htb2RhdCwgc3lzX2ZhY2Nlc3NhdCwgc3lzX3BzZWxlY3Q2LCBzeXNfcHBvbGwsIHN5c191bnNoYXJlCi0vKjMwMCovCS5sb25nIHN5c19zZXRfcm9idXN0X2xpc3QsIHN5c19nZXRfcm9idXN0X2xpc3QKKy8qMzAwKi8JLmxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdCwgc3lzX21pZ3JhdGVfcGFnZXMKIAogI2lmZGVmIENPTkZJR19TVU5PU19FTVVMCiAJLyogTm93IHRoZSBTdW5PUyBzeXNjYWxsIHRhYmxlLiAqLwpAQCAtMTkwLDYgKzE5MCw3IEBACiAvKjI5MCovCS5sb25nIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKIAkubG9uZyBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCiAJLmxvbmcgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwotCS5sb25nIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKKwkubG9uZyBzdW5vc19ub3N5cworLyozMDAqLwkubG9uZyBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jCmluZGV4IDdkY2QxYTEuLjZjN2FhNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lLmMKQEAgLTk1LDYgKzk1LDggQEAKIAlyZXR1cm4gcGM7CiB9CiAKK0VYUE9SVF9TWU1CT0wocHJvZmlsZV9wYyk7CisKIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKm1hc3Rlcl9sMTBfY291bnRlcjsKIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKm1hc3Rlcl9sMTBfbGltaXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDFkZDc4YzguLmI3M2U2YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTEsNiArMTEsNyBAQAogICAuID0gMHgxMDAwMCArIFNJWkVPRl9IRUFERVJTOwogICAudGV4dCAweGYwMDA0MDAwIDoKICAgeworICAgIF90ZXh0ID0gLjsKICAgICAqKC50ZXh0KQogICAgIFNDSEVEX1RFWFQKICAgICBMT0NLX1RFWFQKQEAgLTQ5LDEzICs1MCw3IEBACiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47CiAgIC5pbml0Y2FsbC5pbml0IDogewotCSooLmluaXRjYWxsMS5pbml0KSAKLQkqKC5pbml0Y2FsbDIuaW5pdCkgCi0JKiguaW5pdGNhbGwzLmluaXQpIAotCSooLmluaXRjYWxsNC5pbml0KSAKLQkqKC5pbml0Y2FsbDUuaW5pdCkgCi0JKiguaW5pdGNhbGw2LmluaXQpIAotCSooLmluaXRjYWxsNy5pbml0KQorCUlOSVRDQUxMUwogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMgYi9hcmNoL3NwYXJjL21tL2hpZ2htZW0uYwppbmRleCA0ZDhlZDljLi4wMWZjNmMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2hpZ2htZW0uYworKysgYi9hcmNoL3NwYXJjL21tL2hpZ2htZW0uYwpAQCAtMzUsNyArMzUsNyBAQAogCXVuc2lnbmVkIGxvbmcgdmFkZHI7CiAKIAkvKiBldmVuICFDT05GSUdfUFJFRU1QVCBuZWVkcyB0aGlzLCBmb3IgaW5fYXRvbWljIGluIGRvX3BhZ2VfZmF1bHQgKi8KLQlpbmNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKIAkJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKIApAQCAtNzAsOCArNzAsNyBAQAogCXVuc2lnbmVkIGxvbmcgaWR4ID0gdHlwZSArIEtNX1RZUEVfTlIqc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJaWYgKHZhZGRyIDwgRklYQUREUl9TVEFSVCkgeyAvLyBGSVhNRQotCQlkZWNfcHJlZW1wdF9jb3VudCgpOwotCQlwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsKKwkJcGFnZWZhdWx0X2VuYWJsZSgpOwogCQlyZXR1cm47CiAJfQogCkBAIC05Nyw4ICs5Niw3IEBACiAjZW5kaWYKICNlbmRpZgogCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKLQlwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiB9CiAKIC8qIFdlIG1heSBiZSBmZWQgYSBwYWdldGFibGUgaGVyZSBieSBwdGVwX3RvX3h4eCBhbmQgb3RoZXJzLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9pby11bml0LmMgYi9hcmNoL3NwYXJjL21tL2lvLXVuaXQuYwppbmRleCAyYmIxMzA5Li40Y2NkYTc3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2lvLXVuaXQuYworKysgYi9hcmNoL3NwYXJjL21tL2lvLXVuaXQuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogCiAvKiAjZGVmaW5lIElPVU5JVF9ERUJVRyAqLwogI2lmZGVmIElPVU5JVF9ERUJVRwpAQCAtNDEsOSArNDIsMTIgQEAKIAlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgaW9tbXVfcHJvbXJlZ3NbUFJPTVJFR19NQVhdOwogCXN0cnVjdCByZXNvdXJjZSByOwogCi0JaW91bml0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlvdW5pdF9zdHJ1Y3QpLCBHRlBfQVRPTUlDKTsKKwlpb3VuaXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW91bml0X3N0cnVjdCksIEdGUF9BVE9NSUMpOworCWlmICghaW91bml0KSB7CisJCXByb21fcHJpbnRmKCJTVU40RDogQ2Fubm90IGFsbG9jIGlvdW5pdCwgaGFsdGluZy5cbiIpOworCQlwcm9tX2hhbHQoKTsKKwl9CiAKLQltZW1zZXQoaW91bml0LCAwLCBzaXplb2YoKmlvdW5pdCkpOwogCWlvdW5pdC0+bGltaXRbMF0gPSBJT1VOSVRfQk1BUDFfU1RBUlQ7CiAJaW91bml0LT5saW1pdFsxXSA9IElPVU5JVF9CTUFQMl9TVEFSVDsKIAlpb3VuaXQtPmxpbWl0WzJdID0gSU9VTklUX0JNQVBNX1NUQVJUOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9vcHJvZmlsZS9LY29uZmlnIGIvYXJjaC9zcGFyYy9vcHJvZmlsZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTg0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL29wcm9maWxlL0tjb25maWcKQEAgLTAsMCArMSwxNyBAQAorY29uZmlnIFBST0ZJTElORworCWJvb2wgIlByb2ZpbGluZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBleHRlbmRlZCBwcm9maWxpbmcgc3VwcG9ydCBtZWNoYW5pc21zIHVzZWQKKwkgIGJ5IHByb2ZpbGVycyBzdWNoIGFzIE9Qcm9maWxlLgorCSAgCisKK2NvbmZpZyBPUFJPRklMRQorCXRyaXN0YXRlICJPUHJvZmlsZSBzeXN0ZW0gcHJvZmlsaW5nIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUFJPRklMSU5HCisJaGVscAorCSAgT1Byb2ZpbGUgaXMgYSBwcm9maWxpbmcgc3lzdGVtIGNhcGFibGUgb2YgcHJvZmlsaW5nIHRoZQorCSAgd2hvbGUgc3lzdGVtLCBpbmNsdWRlIHRoZSBrZXJuZWwsIGtlcm5lbCBtb2R1bGVzLCBsaWJyYXJpZXMsCisJICBhbmQgYXBwbGljYXRpb25zLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9vcHJvZmlsZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWZlY2ExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYy9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKK29iai0kKENPTkZJR19PUFJPRklMRSkgKz0gb3Byb2ZpbGUubworCitEUklWRVJfT0JKUyA9ICQoYWRkcHJlZml4IC4uLy4uLy4uL2RyaXZlcnMvb3Byb2ZpbGUvLCBcCisJCW9wcm9mLm8gY3B1X2J1ZmZlci5vIGJ1ZmZlcl9zeW5jLm8gXAorCQlldmVudF9idWZmZXIubyBvcHJvZmlsZV9maWxlcy5vIFwKKwkJb3Byb2ZpbGVmcy5vIG9wcm9maWxlX3N0YXRzLm8gXAorCQl0aW1lcl9pbnQubyApCisKK29wcm9maWxlLXkJCQkJOj0gJChEUklWRVJfT0JKUykgaW5pdC5vCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL29wcm9maWxlL2luaXQuYyBiL2FyY2gvc3BhcmMvb3Byb2ZpbGUvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjgxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL29wcm9maWxlL2luaXQuYwpAQCAtMCwwICsxLDIzIEBACisvKioKKyAqIEBmaWxlIGluaXQuYworICoKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycworICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKKyAqCisgKiBAYXV0aG9yIEpvaG4gTGV2b24gPGxldm9uQG1vdmVtZW50YXJpYW4ub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorIAoraW50IF9faW5pdCBvcHJvZmlsZV9hcmNoX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKiBvcHMpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKwordm9pZCBvcHJvZmlsZV9hcmNoX2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKaW5kZXggYjYyN2Y4ZC4uZDQxZjY2YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKQEAgLTI2LDYgKzI2LDE0IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgU1RBQ0tUUkFDRV9TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgTE9DS0RFUF9TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgeQorCiBjb25maWcgVElNRV9JTlRFUlBPTEFUSU9OCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMzQsNiArNDIsMTQgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VMzIKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBUkNIX0hBU19JTE9HMl9VNjQKKwlib29sCisJZGVmYXVsdCBuCisKIGNvbmZpZyBBVURJVF9BUkNICiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L0tjb25maWcuZGVidWcgYi9hcmNoL3NwYXJjNjQvS2NvbmZpZy5kZWJ1ZwppbmRleCBhZmUwYTc3Li4xZjEzMGYzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3NwYXJjNjQvS2NvbmZpZy5kZWJ1ZwpAQCAtMSw1ICsxLDkgQEAKIG1lbnUgIktlcm5lbCBoYWNraW5nIgogCitjb25maWcgVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVAorCWJvb2wKKwlkZWZhdWx0IHkKKwogc291cmNlICJsaWIvS2NvbmZpZy5kZWJ1ZyIKIAogY29uZmlnIERFQlVHX1NUQUNLX1VTQUdFCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnIGIvYXJjaC9zcGFyYzY0L2RlZmNvbmZpZwppbmRleCBkY2FlNTU5Li4wZjBkMzhmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9kZWZjb25maWcKQEAgLTEsMjQgKzEsMjkgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOS1yYzEKLSMgVGh1IE9jdCAgNSAwMjowODo0MSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTkKKyMgU2F0IERlYyAgOSAxNTo0MTozMCAyMDA2CiAjCiBDT05GSUdfU1BBUkM9eQogQ09ORklHX1NQQVJDNjQ9eQogQ09ORklHXzY0QklUPXkKIENPTkZJR19NTVU9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKIENPTkZJR19USU1FX0lOVEVSUE9MQVRJT049eQogQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX1NQQVJDNjRfUEFHRV9TSVpFXzhLQj15CiAjIENPTkZJR19TUEFSQzY0X1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQQVJDNjRfUEFHRV9TSVpFXzUxMktCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQQVJDNjRfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CiBDT05GSUdfU0VDQ09NUD15Ci0jIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAotQ09ORklHX0haXzI1MD15CitDT05GSUdfSFpfMTAwPXkKKyMgQ09ORklHX0haXzI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0Ci1DT05GSUdfSFo9MjUwCitDT05GSUdfSFo9MTAwCiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC00MiwxMyArNDcsMTQgQEAKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19VSUQxNj15Ci0jIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTIwMyw2ICsyMDksNyBAQAogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX1RDUF9DT05HX0NVQklDPXkKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogQ09ORklHX0lQVjY9bQogQ09ORklHX0lQVjZfUFJJVkFDWT15CiBDT05GSUdfSVBWNl9ST1VURVJfUFJFRj15CkBAIC0yMTcsOCArMjI0LDggQEAKIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPW0KIENPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD1tCiAjIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAorQ09ORklHX0lQVjZfU0lUPW0KIENPTkZJR19JUFY2X1RVTk5FTD1tCi0jIENPTkZJR19JUFY2X1NVQlRSRUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldApAQCAtMjM3LDYgKzI0NCw4IEBACiAjIENPTkZJR19JUF9EQ0NQX0NDSUQyX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19JUF9EQ0NQX0NDSUQzPW0KIENPTkZJR19JUF9EQ0NQX1RGUkNfTElCPW0KKyMgQ09ORklHX0lQX0RDQ1BfQ0NJRDNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0lQX0RDQ1BfQ0NJRDNfUlRPPTEwMAogCiAjCiAjIERDQ1AgS2VybmVsIEhhY2tpbmcKQEAgLTMzNCw2ICszNDMsMTIgQEAKIENPTkZJR19BVEFfT1ZFUl9FVEg9bQogCiAjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIwogIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CiAjCiBDT05GSUdfSURFPXkKQEAgLTM5OCw2ICs0MTMsNyBAQAogIwogQ09ORklHX1JBSURfQVRUUlM9bQogQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAogQ09ORklHX1NDU0lfTkVUTElOSz15CiBDT05GSUdfU0NTSV9QUk9DX0ZTPXkKIApAQCAtNDE4LDYgKzQzNCw3IEBACiBDT05GSUdfU0NTSV9NVUxUSV9MVU49eQogQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgVHJhbnNwb3J0cwpAQCAtNDYxLDYgKzQ3OCw3IEBACiAjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU1VORVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKIAogIwogIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKQEAgLTU5MSw2ICs2MDksNyBAQAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogCiAjCiAjIFRva2VuIFJpbmcgZGV2aWNlcwpAQCAtNzE3LDEwICs3MzYsNiBAQAogIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKQEAgLTcyOCw3ICs3NDMsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTg0MiwxMSArODU2LDYgQEAKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCi0jIE1pc2MgZGV2aWNlcwotIwotIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CkBAIC0xMDM4LDYgKzEwNDcsMTEgQEAKICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIAogIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisKKyMKICMgVVNCIHN1cHBvcnQKICMKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKQEAgLTEwNTIsNiArMTA2Niw3IEBACiBDT05GSUdfVVNCX0RFVklDRUZTPXkKICMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVUxUSVRIUkVBRF9QUk9CRSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA4OCw4ICsxMTAzLDcgQEAKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKLUNPTkZJR19VU0JfSElESU5QVVQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEX1BPV0VSQk9PSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURfRkYgaXMgbm90IHNldAogQ09ORklHX1VTQl9ISURERVY9eQogIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CkBAIC0xMTA0LDcgKzExMTgsNiBAQAogIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogCiAjCiAjIFVTQiBJbWFnaW5nIGRldmljZXMKQEAgLTExMTksNiArMTEzMiw3IEBACiAjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVRfTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0CiAKQEAgLTExNTAsNiArMTE2NCw3IEBACiAjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CiAKICMKQEAgLTEyMzQsNiArMTI0OSw3IEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQogQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CkBAIC0xMzY0LDYgKzEzODAsNyBAQAogIwogIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKICMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CiAKICMKICMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKQEAgLTEzNzUsNiArMTM5Miw3IEBACiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiBDT05GSUdfUFJJTlRLX1RJTUU9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CkBAIC0xMzg5LDYgKzE0MDcsOCBAQAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKQEAgLTEzOTksNiArMTQxOSw3IEBACiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOV0lORF9JTkZPIGlzIG5vdCBzZXQKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKQEAgLTE0MjEsOCArMTQ0Miw5IEBACiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CiBDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CiBDT05GSUdfQ1JZUFRPX0hBU0g9eQotQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX0hNQUM9eQorQ09ORklHX0NSWVBUT19YQ0JDPXkKIENPTkZJR19DUllQVE9fTlVMTD1tCiBDT05GSUdfQ1JZUFRPX01END15CiBDT05GSUdfQ1JZUFRPX01ENT15CkBAIC0xNDMxLDggKzE0NTMsMTAgQEAKIENPTkZJR19DUllQVE9fU0hBNTEyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19HRjEyOE1VTD1tCiBDT05GSUdfQ1JZUFRPX0VDQj1tCiBDT05GSUdfQ1JZUFRPX0NCQz15CitDT05GSUdfQ1JZUFRPX0xSVz1tCiBDT05GSUdfQ1JZUFRPX0RFUz15CiBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KIENPTkZJR19DUllQVE9fVFdPRklTSD1tCkBAIC0xNDU3LDYgKzE0ODEsNyBAQAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCitDT05GSUdfQklUUkVWRVJTRT15CiBDT05GSUdfQ1JDX0NDSVRUPW0KIENPTkZJR19DUkMxNj1tCiBDT05GSUdfQ1JDMzI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZTFlYWJlYi4uZWZmMGMwMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw3IEBACiAJCSAgIHBvd2VyLm8gc2J1cy5vIGlvbW11X2NvbW1vbi5vIHNwYXJjNjRfa3N5bXMubyBjaG1jLm8gXAogCQkgICB2aXNlbXVsLm8gcHJvbS5vIG9mX2RldmljZS5vCiAKK29iai0kKENPTkZJR19TVEFDS1RSQUNFKSArPSBzdGFja3RyYWNlLm8KIG9iai0kKENPTkZJR19QQ0kpCSArPSBlYnVzLm8gaXNhLm8gcGNpX2NvbW1vbi5vIHBjaV9pb21tdS5vIFwKIAkJCSAgICBwY2lfcHN5Y2hvLm8gcGNpX3NhYnJlLm8gcGNpX3NjaGl6by5vIFwKIAkJCSAgICBwY2lfc3VuNHYubyBwY2lfc3VuNHZfYXNtLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYmluZm10X2FvdXQzMi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfYW91dDMyLmMKaW5kZXggZDdjYWE2MC4uZjIwNWZjNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfYW91dDMyLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfYW91dDMyLmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCWlmICgoTl9NQUdJQyhleCkgIT0gWk1BR0lDICYmIE5fTUFHSUMoZXgpICE9IE9NQUdJQyAmJgogCSAgICAgTl9NQUdJQyhleCkgIT0gUU1BR0lDICYmIE5fTUFHSUMoZXgpICE9IE5NQUdJQykgfHwKIAkgICAgTl9UUlNJWkUoZXgpIHx8IE5fRFJTSVpFKGV4KSB8fAotCSAgICBicHJtLT5maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zaXplIDwgZXguYV90ZXh0K2V4LmFfZGF0YStOX1NZTVNJWkUoZXgpK05fVFhUT0ZGKGV4KSkgeworCSAgICBicHJtLT5maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NpemUgPCBleC5hX3RleHQrZXguYV9kYXRhK05fU1lNU0laRShleCkrTl9UWFRPRkYoZXgpKSB7CiAJCXJldHVybiAtRU5PRVhFQzsKIAl9CiAKQEAgLTM0OSw3ICszNDksNyBAQAogCWludCByZXR2YWw7CiAJc3RydWN0IGV4ZWMgZXg7CiAKLQlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCXJldHZhbCA9IC1FTk9FWEVDOwogCWVycm9yID0ga2VybmVsX3JlYWQoZmlsZSwgMCwgKGNoYXIgKikgJmV4LCBzaXplb2YoZXgpKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYmluZm10X2VsZjMyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2JpbmZtdF9lbGYzMi5jCmluZGV4IGE5OGYzYWUuLjlhZDg0ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfZWxmMzIuYwpAQCAtMTQxLDcgKzE0MSw2IEBACiAJdmFsdWUtPnR2X3NlYyA9IGppZmZpZXMgLyBIWjsKIH0KIAotI2RlZmluZSBlbGZfYWRkcl90CXUzMgogI3VuZGVmIHN0YXJ0X3RocmVhZAogI2RlZmluZSBzdGFydF90aHJlYWQgc3RhcnRfdGhyZWFkMzIKICNkZWZpbmUgaW5pdF9lbGZfYmluZm10IGluaXRfZWxmMzJfYmluZm10CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2NlbnRyYWwuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jCmluZGV4IGI2NjMzNmQuLmU3MjRjNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jCkBAIC0xMjYsNiArMTI2LDEwIEBACiAJCWludCBib2FyZDsKIAkJdTMyIHRtcDsKIAorCQlpZiAoZHAtPnBhcmVudCAmJgorCQkgICAgZHAtPnBhcmVudC0+cGFyZW50ICE9IE5VTEwpCisJCQljb250aW51ZTsKKwogCQlmaGMgPSAoc3RydWN0IGxpbnV4X2ZoYyAqKQogCQkJY2VudHJhbF9hbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgbGludXhfZmhjKSk7CiAJCWlmIChmaGMgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2htYy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaG1jLmMKaW5kZXggMjU5ZjM3ZS4uOTY5OWFiZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaG1jLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaG1jLmMKQEAgLTM0MSw3ICszNDEsNyBAQAogCiBzdGF0aWMgaW50IGluaXRfb25lX21jdHJsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0Jc3RydWN0IG1jdHJsX2luZm8gKm1wID0ga21hbGxvYyhzaXplb2YoKm1wKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IG1jdHJsX2luZm8gKm1wID0ga3phbGxvYyhzaXplb2YoKm1wKSwgR0ZQX0tFUk5FTCk7CiAJaW50IHBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInBvcnRpZCIsIC0xKTsKIAlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKIAl2b2lkICpwdmFsOwpAQCAtMzQ5LDcgKzM0OSw2IEBACiAKIAlpZiAoIW1wKQogCQlyZXR1cm4gLTE7Ci0JbWVtc2V0KG1wLCAwLCBzaXplb2YoKm1wKSk7CiAJaWYgKHBvcnRpZCA9PSAtMSkKIAkJZ290byBmYWlsOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCmluZGV4IDJkZjI1YzIuLjM1YmY4OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCkBAIC0zODksMTIgKzM4OSwxMiBAQAogCWRldi0+b2ZkZXYubm9kZSA9IGRwOwogCWRldi0+b2ZkZXYuZGV2LnBhcmVudCA9ICZkZXYtPmJ1cy0+b2ZkZXYuZGV2OwogCWRldi0+b2ZkZXYuZGV2LmJ1cyA9ICZlYnVzX2J1c190eXBlOwotCXN0cmNweShkZXYtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwlzcHJpbnRmKGRldi0+b2ZkZXYuZGV2LmJ1c19pZCwgImVidXNbJTA4eF0iLCBkcC0+bm9kZSk7CiAKIAkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KIAlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPm9mZGV2KSAhPSAwKQogCQlwcmludGsoS0VSTl9ERUJVRyAiZWJ1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkgICAgICAgZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKIAogCWRwID0gZHAtPmNoaWxkOwogCWlmIChkcCkgewpAQCAtNDk0LDEyICs0OTQsMTIgQEAKIAkJZWJ1cy0+b2ZkZXYubm9kZSA9IGRwOwogCQllYnVzLT5vZmRldi5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAkJZWJ1cy0+b2ZkZXYuZGV2LmJ1cyA9ICZlYnVzX2J1c190eXBlOwotCQlzdHJjcHkoZWJ1cy0+b2ZkZXYuZGV2LmJ1c19pZCwgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOworCQlzcHJpbnRmKGVidXMtPm9mZGV2LmRldi5idXNfaWQsICJlYnVzJWQiLCBudW1fZWJ1cyk7CiAKIAkJLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJmVidXMtPm9mZGV2KSAhPSAwKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgImVidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKLQkJCSAgICAgICBlYnVzLT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJCSAgICAgICBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CiAKIAogCQljaGlsZCA9IGRwLT5jaGlsZDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUwppbmRleCAwYWFhMzVmLi5jMTVhM2VkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0yMiwxMSArMjIsMTAgQEAKICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KICNpbmNsdWRlIDxhc20vc2ZhZnNyLmg+CiAjaW5jbHVkZSA8YXNtL3BpbC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogI2RlZmluZSBjdXJwdHIgICAgICBnNgogCi0jZGVmaW5lIE5SX1NZU0NBTExTIDMwMCAgICAgIC8qIEVhY2ggT1MgaXMgZGlmZmVyZW50Li4uICovCi0KIAkudGV4dAogCS5hbGlnbgkJMzIKIApAQCAtNTk4LDcgKzU5NywxMiBAQAogMToJYmEscHQJCSV4Y2MsIGV0cmFwX2lycQogCSByZAkJJXBjLCAlZzcKIAotMjoJbW92CQklbDQsICVvMQorMjoKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwljYWxsCXRyYWNlX2hhcmRpcnFzX29mZgorCSBub3AKKyNlbmRpZgorCW1vdgkJJWw0LCAlbzEKIAltb3YJCSVsNSwgJW8yCiAJY2FsbAkJc3BpdGZpcmVfYWNjZXNzX2Vycm9yCiAJIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKQEAgLTgyNSw2ICs4MjksMTAgQEAKIAl3cnByCQklZzAsIDE1LCAlcGlsCiAJYmEscHQJCSV4Y2MsIGV0cmFwX2lycQogCSByZAkJJXBjLCAlZzcKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwljYWxsCQl0cmFjZV9oYXJkaXJxc19vZmYKKwkgbm9wCisjZW5kaWYKIAltb3YJCTB4MCwgJW8wCiAJY2FsbAkJY2hlZXRhaF9wbHVzX3Bhcml0eV9lcnJvcgogCSBhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8xCkBAIC04NTYsNiArODY0LDEwIEBACiAJd3JwcgkJJWcwLCAxNSwgJXBpbAogCWJhLHB0CQkleGNjLCBldHJhcF9pcnEKIAkgcmQJCSVwYywgJWc3CisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJY2FsbAkJdHJhY2VfaGFyZGlycXNfb2ZmCisJIG5vcAorI2VuZGlmCiAJbW92CQkweDEsICVvMAogCWNhbGwJCWNoZWV0YWhfcGx1c19wYXJpdHlfZXJyb3IKIAkgYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMQpAQCAtMTE4NCw2ICsxMTk2LDEwIEBACiAJd3JwcgkJJWcwLCAxNSwgJXBpbAogCWJhLHB0CQkleGNjLCBldHJhcF9pcnEKIAkgcmQJCSVwYywgJWc3CisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJY2FsbAkJdHJhY2VfaGFyZGlycXNfb2ZmCisJIG5vcAorI2VuZGlmCiAJbW92CQklbDQsICVvMQogCW1vdgkJJWw1LCAlbzIKIAljYWxsCQljaGVldGFoX2ZlY2NfaGFuZGxlcgpAQCAtMTIxMiw2ICsxMjI4LDEwIEBACiAJd3JwcgkJJWcwLCAxNSwgJXBpbAogCWJhLHB0CQkleGNjLCBldHJhcF9pcnEKIAkgcmQJCSVwYywgJWc3CisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJY2FsbAkJdHJhY2VfaGFyZGlycXNfb2ZmCisJIG5vcAorI2VuZGlmCiAJbW92CQklbDQsICVvMQogCW1vdgkJJWw1LCAlbzIKIAljYWxsCQljaGVldGFoX2NlZV9oYW5kbGVyCkBAIC0xMjQwLDYgKzEyNjAsMTAgQEAKIAl3cnByCQklZzAsIDE1LCAlcGlsCiAJYmEscHQJCSV4Y2MsIGV0cmFwX2lycQogCSByZAkJJXBjLCAlZzcKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwljYWxsCQl0cmFjZV9oYXJkaXJxc19vZmYKKwkgbm9wCisjZW5kaWYKIAltb3YJCSVsNCwgJW8xCiAJbW92CQklbDUsICVvMgogCWNhbGwJCWNoZWV0YWhfZGVmZXJyZWRfaGFuZGxlcgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2hlYWQuUwppbmRleCBjOGU5ZGM5Li4wM2ZmYWY4OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMKQEAgLTQ4OSw2ICs0ODksMTQgQEAKIAljYWxsCV9fYnplcm8KIAkgc3ViCSVvMSwgJW8wLCAlbzEKIAorI2lmZGVmIENPTkZJR19MT0NLREVQCisJLyogV2UgaGF2ZSB0aGlzIGNhbGwgdGhpcyBzdXBlciBlYXJseSwgYXMgZXZlbiBwcm9tX2luaXQgY2FuIGdyYWIKKwkgKiBzcGlubG9ja3MgYW5kIHRodXMgY2FsbCBpbnRvIHRoZSBsb2NrZGVwIGNvZGUuCisJICovCisJY2FsbAlsb2NrZGVwX2luaXQKKwkgbm9wCisjZW5kaWYKKwogCW1vdgklbDYsICVvMQkJCSEgT3BlblBST00gc3RhY2sKIAljYWxsCXByb21faW5pdAogCSBtb3YJJWw3LCAlbzAJCQkhIE9wZW5QUk9NIGNpZiBoYW5kbGVyCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2lzYS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pc2EuYwppbmRleCAwZjNhZWM3Li5hZDFjNGY1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2lzYS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXNhLmMKQEAgLTcyLDE0ICs3MiwxMiBAQAogCQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CiAJCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2OwogCi0JCWlzYV9kZXYgPSBrbWFsbG9jKHNpemVvZigqaXNhX2RldiksIEdGUF9LRVJORUwpOworCQlpc2FfZGV2ID0ga3phbGxvYyhzaXplb2YoKmlzYV9kZXYpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpc2FfZGV2KSB7CiAJCQlmYXRhbF9lcnIoImNhbm5vdCBhbGxvY2F0ZSBjaGlsZCBpc2FfZGV2Iik7CiAJCQlwcm9tX2hhbHQoKTsKIAkJfQogCi0JCW1lbXNldChpc2FfZGV2LCAwLCBzaXplb2YoKmlzYV9kZXYpKTsKLQogCQkvKiBMaW5rIGl0IGluIHRvIHBhcmVudC4gKi8KIAkJaXNhX2Rldi0+bmV4dCA9IHBhcmVudF9pc2FfZGV2LT5jaGlsZDsKIAkJcGFyZW50X2lzYV9kZXYtPmNoaWxkID0gaXNhX2RldjsKQEAgLTEwNCwyMyArMTAyLDIxIEBACiAJCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKIAkJc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmlzYV9kZXY7CiAKLQkJaXNhX2RldiA9IGttYWxsb2Moc2l6ZW9mKCppc2FfZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWlzYV9kZXYgPSBremFsbG9jKHNpemVvZigqaXNhX2RldiksIEdGUF9LRVJORUwpOwogCQlpZiAoIWlzYV9kZXYpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJJU0E6IGNhbm5vdCBhbGxvY2F0ZSBpc2FfZGV2Iik7CiAJCQlyZXR1cm47CiAJCX0KIAotCQltZW1zZXQoaXNhX2RldiwgMCwgc2l6ZW9mKCppc2FfZGV2KSk7Ci0KIAkJaXNhX2Rldi0+b2ZkZXYubm9kZSA9IGRwOwogCQlpc2FfZGV2LT5vZmRldi5kZXYucGFyZW50ID0gJmlzYV9ici0+b2ZkZXYuZGV2OwogCQlpc2FfZGV2LT5vZmRldi5kZXYuYnVzID0gJmlzYV9idXNfdHlwZTsKLQkJc3RyY3B5KGlzYV9kZXYtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwkJc3ByaW50Zihpc2FfZGV2LT5vZmRldi5kZXYuYnVzX2lkLCAiaXNhWyUwOHhdIiwgZHAtPm5vZGUpOwogCiAJCS8qIFJlZ2lzdGVyIHdpdGggY29yZSAqLwogCQlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZpc2FfZGV2LT5vZmRldikgIT0gMCkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgImlzYTogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAotCQkJICAgICAgIGlzYV9kZXYtPm9mZGV2LmRldi5idXNfaWQpOworCQkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKIAkJCWtmcmVlKGlzYV9kZXYpOwogCQkJZ290byBuZXh0X3NpYmxpbmc7CiAJCX0KQEAgLTE4MCwyMyArMTc2LDIxIEBACiAJCXBibSA9IHBkZXZfY29va2llLT5wYm07CiAJCWRwID0gcGRldl9jb29raWUtPnByb21fbm9kZTsKIAotCQlpc2FfYnIgPSBrbWFsbG9jKHNpemVvZigqaXNhX2JyKSwgR0ZQX0tFUk5FTCk7CisJCWlzYV9iciA9IGt6YWxsb2Moc2l6ZW9mKCppc2FfYnIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpc2FfYnIpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJpc2E6IGNhbm5vdCBhbGxvY2F0ZSBzcGFyY19pc2FfYnJpZGdlIik7CiAJCQlyZXR1cm47CiAJCX0KIAotCQltZW1zZXQoaXNhX2JyLCAwLCBzaXplb2YoKmlzYV9icikpOwotCiAJCWlzYV9ici0+b2ZkZXYubm9kZSA9IGRwOwogCQlpc2FfYnItPm9mZGV2LmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCQlpc2FfYnItPm9mZGV2LmRldi5idXMgPSAmaXNhX2J1c190eXBlOwotCQlzdHJjcHkoaXNhX2JyLT5vZmRldi5kZXYuYnVzX2lkLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisJCXNwcmludGYoaXNhX2JyLT5vZmRldi5kZXYuYnVzX2lkLCAiaXNhJWQiLCBpbmRleCk7CiAKIAkJLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJmlzYV9ici0+b2ZkZXYpICE9IDApIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJpc2E6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKLQkJCSAgICAgICBpc2FfYnItPm9mZGV2LmRldi5idXNfaWQpOworCQkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKIAkJCWtmcmVlKGlzYV9icik7CiAJCQlyZXR1cm47CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggOGU3NWVkNy4uYWUyMjFmMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTQ1LDcgKzQ1LDExIEBACiBpbnQgX19rcHJvYmVzIGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlwLT5haW5zbi5pbnNuWzBdID0gKnAtPmFkZHI7CisJZmx1c2hpKCZwLT5haW5zbi5pbnNuWzBdKTsKKwogCXAtPmFpbnNuLmluc25bMV0gPSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OXzI7CisJZmx1c2hpKCZwLT5haW5zbi5pbnNuWzFdKTsKKwogCXAtPm9wY29kZSA9ICpwLT5hZGRyOwogCXJldHVybiAwOwogfQpAQCAtMTg1LDE2ICsxODksMTkgQEAKIC8qIElmIElOU04gaXMgYSByZWxhdGl2ZSBjb250cm9sIHRyYW5zZmVyIGluc3RydWN0aW9uLAogICogcmV0dXJuIHRoZSBjb3JyZWN0ZWQgYnJhbmNoIGRlc3RpbmF0aW9uIHZhbHVlLgogICoKLSAqIFRoZSBvcmlnaW5hbCBJTlNOIGxvY2F0aW9uIHdhcyBSRUFMX1BDLCBpdCBhY3R1YWxseQotICogZXhlY3V0ZWQgYXQgUEMgYW5kIHByb2R1Y2VkIGRlc3RpbmF0aW9uIGFkZHJlc3MgTlBDLgorICogcmVncy0+dHBjIGFuZCByZWdzLT50bnBjIHN0aWxsIGhvbGQgdGhlIHZhbHVlcyBvZiB0aGUKKyAqIHByb2dyYW0gY291bnRlcnMgYXQgdGhlIHRpbWUgb2YgdHJhcCBkdWUgdG8gdGhlIGV4ZWN1dGlvbgorICogb2YgdGhlIEJSRUFLUE9JTlRfSU5TVFJVQ1RJT05fMiBhdCBwLT5haW5zbi5pbnNuWzFdCisgKiAKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIHJlbGJyYW5jaF9maXh1cCh1MzIgaW5zbiwgdW5zaWduZWQgbG9uZyByZWFsX3BjLAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwYywKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnBjKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19rcHJvYmVzIHJlbGJyYW5jaF9maXh1cCh1MzIgaW5zbiwgc3RydWN0IGtwcm9iZSAqcCwKKwkJCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXVuc2lnbmVkIGxvbmcgcmVhbF9wYyA9ICh1bnNpZ25lZCBsb25nKSBwLT5hZGRyOworCiAJLyogQnJhbmNoIG5vdCB0YWtlbiwgbm8gbW9kcyBuZWNlc3NhcnkuICAqLwotCWlmIChucGMgPT0gcGMgKyAweDRVTCkKLQkJcmV0dXJuIHJlYWxfcGMgKyAweDRVTDsKKwlpZiAocmVncy0+dG5wYyA9PSByZWdzLT50cGMgKyAweDRVTCkKKwkJcmV0dXJuIHJlYWxfcGMgKyAweDhVTDsKIAogCS8qIFRoZSB0aHJlZSBjYXNlcyBhcmUgY2FsbCwgYnJhbmNoIHcvcHJlZGljdGlvbiwKIAkgKiBhbmQgdHJhZGl0aW9uYWwgYnJhbmNoLgpAQCAtMjAyLDE0ICsyMDksMjEgQEAKIAlpZiAoKGluc24gJiAweGMwMDAwMDAwKSA9PSAweDQwMDAwMDAwIHx8CiAJICAgIChpbnNuICYgMHhjMWMwMDAwMCkgPT0gMHgwMDQwMDAwMCB8fAogCSAgICAoaW5zbiAmIDB4YzFjMDAwMDApID09IDB4MDA4MDAwMDApIHsKKwkJdW5zaWduZWQgbG9uZyBhaW5zbl9hZGRyOworCisJCWFpbnNuX2FkZHIgPSAodW5zaWduZWQgbG9uZykgJnAtPmFpbnNuLmluc25bMF07CisKIAkJLyogVGhlIGluc3RydWN0aW9uIGRpZCBhbGwgdGhlIHdvcmsgZm9yIHVzCiAJCSAqIGFscmVhZHksIGp1c3QgYXBwbHkgdGhlIG9mZnNldCB0byB0aGUgY29ycmVjdAogCQkgKiBpbnN0cnVjdGlvbiBsb2NhdGlvbi4KIAkJICovCi0JCXJldHVybiAocmVhbF9wYyArIChucGMgLSBwYykpOworCQlyZXR1cm4gKHJlYWxfcGMgKyAocmVncy0+dG5wYyAtIGFpbnNuX2FkZHIpKTsKIAl9CiAKLQlyZXR1cm4gcmVhbF9wYyArIDB4NFVMOworCS8qIEl0IGlzIGptcGwgb3Igc29tZSBvdGhlciBhYnNvbHV0ZSBQQyBtb2RpZmljYXRpb24gaW5zdHJ1Y3Rpb24sCisJICogbGVhdmUgTlBDIGFzLWlzLgorCSAqLworCXJldHVybiByZWdzLT50bnBjOwogfQogCiAvKiBJZiBJTlNOIGlzIGFuIGluc3RydWN0aW9uIHdoaWNoIHdyaXRlcyBpdCdzIFBDIGxvY2F0aW9uCkBAIC0yMjAsMTIgKzIzNCwxMiBAQAogewogCXVuc2lnbmVkIGxvbmcgKnNsb3QgPSBOVUxMOwogCi0JLyogU2ltcGxlc3QgY2FzdCBpcyBjYWxsLCB3aGljaCBhbHdheXMgdXNlcyAlbzcgKi8KKwkvKiBTaW1wbGVzdCBjYXNlIGlzICdjYWxsJywgd2hpY2ggYWx3YXlzIHVzZXMgJW83ICovCiAJaWYgKChpbnNuICYgMHhjMDAwMDAwMCkgPT0gMHg0MDAwMDAwMCkgewogCQlzbG90ID0gJnJlZ3MtPnVfcmVnc1tVUkVHX0k3XTsKIAl9CiAKLQkvKiBKbXBsIGVuY29kZXMgdGhlIHJlZ2lzdGVyIGluc2lkZSBvZiB0aGUgb3Bjb2RlICovCisJLyogJ2ptcGwnIGVuY29kZXMgdGhlIHJlZ2lzdGVyIGluc2lkZSBvZiB0aGUgb3Bjb2RlICovCiAJaWYgKChpbnNuICYgMHhjMWY4MDAwMCkgPT0gMHg4MWMwMDAwMCkgewogCQl1bnNpZ25lZCBsb25nIHJkID0gKChpbnNuID4+IDI1KSAmIDB4MWYpOwogCkBAIC0yNDcsMTEgKzI2MSwxMSBAQAogCiAvKgogICogQ2FsbGVkIGFmdGVyIHNpbmdsZS1zdGVwcGluZy4gIHAtPmFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gKiBpbnN0cnVjdGlvbiB3aG9zZSBmaXJzdCBieXRlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBicmVha3BvaW50CisgKiBpbnN0cnVjdGlvbiB3aGljaCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgYnJlYWtwb2ludAogICogaW5zdHJ1Y3Rpb24uICBUbyBhdm9pZCB0aGUgU01QIHByb2JsZW1zIHRoYXQgY2FuIG9jY3VyIHdoZW4gd2UKICAqIHRlbXBvcmFyaWx5IHB1dCBiYWNrIHRoZSBvcmlnaW5hbCBvcGNvZGUgdG8gc2luZ2xlLXN0ZXAsIHdlCiAgKiBzaW5nbGUtc3RlcHBlZCBhIGNvcHkgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcwotICogY29weSBpcyBwLT5haW5zbi5pbnNuLgorICogY29weSBpcyAmcC0+YWluc24uaW5zblswXS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRvIHJldHVybiBmcm9tIHRoZSBwb3N0LXNpbmdsZS1zdGVwCiAgKiBicmVha3BvaW50IHRyYXAuCkBAIC0yNjEsMTEgKzI3NSwxMSBAQAogewogCXUzMiBpbnNuID0gcC0+YWluc24uaW5zblswXTsKIAorCXJlZ3MtPnRucGMgPSByZWxicmFuY2hfZml4dXAoaW5zbiwgcCwgcmVncyk7CisKKwkvKiBUaGlzIGFzc2lnbm1lbnQgbXVzdCBvY2N1ciBhZnRlciByZWxicmFuY2hfZml4dXAoKSAqLwogCXJlZ3MtPnRwYyA9IGtjYi0+a3Byb2JlX29yaWdfdG5wYzsKLQlyZWdzLT50bnBjID0gcmVsYnJhbmNoX2ZpeHVwKGluc24sCi0JCQkJICAgICAodW5zaWduZWQgbG9uZykgcC0+YWRkciwKLQkJCQkgICAgICh1bnNpZ25lZCBsb25nKSAmcC0+YWluc24uaW5zblswXSwKLQkJCQkgICAgIHJlZ3MtPnRucGMpOworCiAJcmV0cGNfZml4dXAocmVncywgaW5zbiwgKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIpOwogCiAJcmVncy0+dHN0YXRlID0gKChyZWdzLT50c3RhdGUgJiB+VFNUQVRFX1BJTCkgfApAQCAtNDMwLDE3ICs0NDQsOCBAQAogCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKIAlzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiID0gZ2V0X2twcm9iZV9jdGxibGsoKTsKIAotCWtjYi0+anByb2JlX3NhdmVkX3JlZ3NfbG9jYXRpb24gPSByZWdzOwogCW1lbWNweSgmKGtjYi0+anByb2JlX3NhdmVkX3JlZ3MpLCByZWdzLCBzaXplb2YoKnJlZ3MpKTsKIAotCS8qIFNhdmUgYSB3aG9sZSBzdGFjayBmcmFtZSwgdGhpcyBnZXRzIGFyZ3VtZW50cwotCSAqIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBhZnRlciB1c2luZyB1cCBhbGwgdGhlCi0JICogYXJnIHJlZ2lzdGVycy4KLQkgKi8KLQltZW1jcHkoJihrY2ItPmpwcm9iZV9zYXZlZF9zdGFjayksCi0JICAgICAgIChjaGFyICopIChyZWdzLT51X3JlZ3NbVVJFR19GUF0gKyBTVEFDS19CSUFTKSwKLQkgICAgICAgc2l6ZW9mKGtjYi0+anByb2JlX3NhdmVkX3N0YWNrKSk7Ci0KIAlyZWdzLT50cGMgID0gKHVuc2lnbmVkIGxvbmcpIGpwLT5lbnRyeTsKIAlyZWdzLT50bnBjID0gKCh1bnNpZ25lZCBsb25nKSBqcC0+ZW50cnkpICsgMHg0VUw7CiAJcmVncy0+dHN0YXRlIHw9IFRTVEFURV9QSUw7CkBAIC00NTAsMTAgKzQ1NSwxOSBAQAogCiB2b2lkIF9fa3Byb2JlcyBqcHJvYmVfcmV0dXJuKHZvaWQpCiB7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSIuZ2xvYmwJanByb2JlX3JldHVybl90cmFwX2luc3RydWN0aW9uXG4iCisJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYiA9IGdldF9rcHJvYmVfY3RsYmxrKCk7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBvcmlnX2ZwIGFzbSgiZzEiKTsKKworCW9yaWdfZnAgPSBrY2ItPmpwcm9iZV9zYXZlZF9yZWdzLnVfcmVnc1tVUkVHX0ZQXTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiXG4iCisiMToJY21wCQklJXNwLCAlMFxuXHQiCisJImJsdSxhLHB0CSUleGNjLCAxYlxuXHQiCisJIiByZXN0b3JlXG5cdCIKKwkiLmdsb2JsCQlqcHJvYmVfcmV0dXJuX3RyYXBfaW5zdHJ1Y3Rpb25cbiIKICJqcHJvYmVfcmV0dXJuX3RyYXBfaW5zdHJ1Y3Rpb246XG5cdCIKLQkJInRhIDB4NzAiKTsKKwkidGEJCTB4NzAiCisJOiAvKiBubyBvdXRwdXRzICovCisJOiAiciIgKG9yaWdfZnApKTsKIH0KIAogZXh0ZXJuIHZvaWQganByb2JlX3JldHVybl90cmFwX2luc3RydWN0aW9uKHZvaWQpOwpAQCAtNDY2LDI2ICs0ODAsNyBAQAogCXN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IgPSBnZXRfa3Byb2JlX2N0bGJsaygpOwogCiAJaWYgKGFkZHIgPT0gKHUzMiAqKSBqcHJvYmVfcmV0dXJuX3RyYXBfaW5zdHJ1Y3Rpb24pIHsKLQkJaWYgKGtjYi0+anByb2JlX3NhdmVkX3JlZ3NfbG9jYXRpb24gIT0gcmVncykgewotCQkJcHJpbnRrKCJKUFJPQkU6IEN1cnJlbnQgcmVncyAoJXApIGRvZXMgbm90IG1hdGNoICIKLQkJCSAgICAgICAic2F2ZWQgcmVncyAoJXApLlxuIiwKLQkJCSAgICAgICByZWdzLCBrY2ItPmpwcm9iZV9zYXZlZF9yZWdzX2xvY2F0aW9uKTsKLQkJCXByaW50aygiSlBST0JFOiBTYXZlZCByZWdpc3RlcnNcbiIpOwotCQkJX19zaG93X3JlZ3Moa2NiLT5qcHJvYmVfc2F2ZWRfcmVnc19sb2NhdGlvbik7Ci0JCQlwcmludGsoIkpQUk9CRTogQ3VycmVudCByZWdpc3RlcnNcbiIpOwotCQkJX19zaG93X3JlZ3MocmVncyk7Ci0JCQlCVUcoKTsKLQkJfQotCQkvKiBSZXN0b3JlIG9sZCByZWdpc3RlciBzdGF0ZS4gIERvIHB0X3JlZ3MKLQkJICogZmlyc3Qgc28gdGhhdCBVUkVHX0ZQIGlzIHRoZSBvcmlnaW5hbCBvbmUgZm9yCi0JCSAqIHRoZSBzdGFjayBmcmFtZSByZXN0b3JlLgotCQkgKi8KIAkJbWVtY3B5KHJlZ3MsICYoa2NiLT5qcHJvYmVfc2F2ZWRfcmVncyksIHNpemVvZigqcmVncykpOwotCi0JCW1lbWNweSgoY2hhciAqKSAocmVncy0+dV9yZWdzW1VSRUdfRlBdICsgU1RBQ0tfQklBUyksCi0JCSAgICAgICAmKGtjYi0+anByb2JlX3NhdmVkX3N0YWNrKSwKLQkJICAgICAgIHNpemVvZihrY2ItPmpwcm9iZV9zYXZlZF9zdGFjaykpOwotCiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAkJcmV0dXJuIDE7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKaW5kZXggZDgyMmM3Yy4uY2VjMGVjZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jCkBAIC0xMzEsOCArMTMxLDEzIEBACiB2b2lkIF9faW9tZW0gKm9mX2lvcmVtYXAoc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKm5hbWUpCiB7CiAJdW5zaWduZWQgbG9uZyByZXQgPSByZXMtPnN0YXJ0ICsgb2Zmc2V0OworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAotCWlmICghcmVxdWVzdF9yZWdpb24ocmV0LCBzaXplLCBuYW1lKSkKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlyID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJldCwgc2l6ZSwgbmFtZSk7CisJZWxzZQorCQlyID0gcmVxdWVzdF9yZWdpb24ocmV0LCBzaXplLCBuYW1lKTsKKwlpZiAoIXIpCiAJCXJldCA9IDA7CiAKIAlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSByZXQ7CkBAIC0zOTcsMTYgKzQwMiwyMiBAQAogCQkqc2l6ZWMgPSAxOwogfQogCi1zdGF0aWMgaW50IG9mX2J1c19zYnVzX21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQorLyoKKyAqIEZIQy9DZW50cmFsIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9yLgorICoKKyAqIFRoaXMgaXMganVzdCBuZWVkZWQgdG8gaGFyZC1jb2RlIHRoZSBhZGRyZXNzIGFuZCBzaXplIGNlbGwKKyAqIGNvdW50cy4gICdmaGMnIGFuZCAnY2VudHJhbCcgbm9kZXMgbGFjayB0aGUgI2FkZHJlc3MtY2VsbHMgYW5kCisgKiAjc2l6ZS1jZWxscyBwcm9wZXJ0aWVzLCBhbmQgaWYgeW91IHdhbGsgdG8gdGhlIHJvb3Qgb24gc3VjaAorICogRW50ZXJwcmlzZSBib3hlcyBhbGwgeW91J2xsIGdldCBpcyBhICNzaXplLWNlbGxzIG9mIDIgd2hpY2ggaXMKKyAqIG5vdCB3aGF0IHdlIHdhbnQgdG8gdXNlLgorICovCitzdGF0aWMgaW50IG9mX2J1c19maGNfbWF0Y2goc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlyZXR1cm4gb2ZfYnVzX2RlZmF1bHRfbWFwKGFkZHIsIHJhbmdlLCBuYSwgbnMsIHBuYSk7CisJcmV0dXJuICFzdHJjbXAobnAtPm5hbWUsICJmaGMiKSB8fAorCQkhc3RyY21wKG5wLT5uYW1lLCAiY2VudHJhbCIpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19zYnVzX2dldF9mbGFncyh1MzIgKmFkZHIpCi17Ci0JcmV0dXJuIElPUkVTT1VSQ0VfTUVNOwotfQotCisjZGVmaW5lIG9mX2J1c19maGNfY291bnRfY2VsbHMgb2ZfYnVzX3NidXNfY291bnRfY2VsbHMKIAogLyoKICAqIEFycmF5IG9mIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9ycwpAQCAtNDI4LDggKzQzOSwxNyBAQAogCQkuYWRkcl9wcm9wX25hbWUgPSAicmVnIiwKIAkJLm1hdGNoID0gb2ZfYnVzX3NidXNfbWF0Y2gsCiAJCS5jb3VudF9jZWxscyA9IG9mX2J1c19zYnVzX2NvdW50X2NlbGxzLAotCQkubWFwID0gb2ZfYnVzX3NidXNfbWFwLAotCQkuZ2V0X2ZsYWdzID0gb2ZfYnVzX3NidXNfZ2V0X2ZsYWdzLAorCQkubWFwID0gb2ZfYnVzX2RlZmF1bHRfbWFwLAorCQkuZ2V0X2ZsYWdzID0gb2ZfYnVzX2RlZmF1bHRfZ2V0X2ZsYWdzLAorCX0sCisJLyogRkhDICovCisJeworCQkubmFtZSA9ICJmaGMiLAorCQkuYWRkcl9wcm9wX25hbWUgPSAicmVnIiwKKwkJLm1hdGNoID0gb2ZfYnVzX2ZoY19tYXRjaCwKKwkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX2ZoY19jb3VudF9jZWxscywKKwkJLm1hcCA9IG9mX2J1c19kZWZhdWx0X21hcCwKKwkJLmdldF9mbGFncyA9IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncywKIAl9LAogCS8qIERlZmF1bHQgKi8KIAl7CkBAIC04NDEsNyArODYxLDcgQEAKIAlpZiAoIXBhcmVudCkKIAkJc3RyY3B5KG9wLT5kZXYuYnVzX2lkLCAicm9vdCIpOwogCWVsc2UKLQkJc3ByaW50ZihvcC0+ZGV2LmJ1c19pZCwgIiVzQCUwOHgiLCBkcC0+bmFtZSwgZHAtPm5vZGUpOworCQlzcHJpbnRmKG9wLT5kZXYuYnVzX2lkLCAiJTA4eCIsIGRwLT5ub2RlKTsKIAogCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIob3ApKSB7CiAJCXByaW50aygiJXM6IENvdWxkIG5vdCByZWdpc3RlciBvZiBkZXZpY2UuXG4iLApAQCAtOTg3LDEwICsxMDA3LDkgQEAKIHsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7CiAKLQlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwogCiAJZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OwogCWRldi0+ZGV2LmJ1cyA9IGJ1czsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jCmluZGV4IGUwMmYwMWIuLmRmYzQxY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYwpAQCAtNjQ2LDEzICs2NDYsNCBAQAogfQogRVhQT1JUX1NZTUJPTChwY2lfZG9tYWluX25yKTsKIAotaW50IHBjaWJpb3NfcHJlcF9td2koc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQkvKiBXZSBzZXQgY29ycmVjdCBQQ0lfQ0FDSEVfTElORV9TSVpFIHJlZ2lzdGVyIHZhbHVlcyBmb3IgZXZlcnkKLQkgKiBkZXZpY2UgcHJvYmVkIG9uIHRoaXMgcGxhdGZvcm0uICBTbyB0aGVyZSBpcyBub3RoaW5nIHRvIGNoZWNrCi0JICogYW5kIHRoaXMgYWx3YXlzIHN1Y2NlZWRzLgotCSAqLwotCXJldHVybiAwOwotfQotCiAjZW5kaWYgLyogIShDT05GSUdfUENJKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfY29tbW9uLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYwppbmRleCA3YTU5Y2M3Li44MjdhZTMwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYwpAQCAtMzMwLDE5ICszMzAsNiBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBkZXZfcmVzb3VyY2VfY29sbGlzaW9uc19leHBlY3RlZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlpZiAocGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfU1VOKQotCQlyZXR1cm4gMDsKLQotCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fUklPX0VCVVMgfHwKLQkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1JJT18xMzk0IHx8Ci0JICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9SSU9fVVNCKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgcGRldl9yZWNvcmRfYXNzaWdubWVudHMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAogCQkJCQkgICBzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKQEAgLTQwMCwxOSArMzg3LDIzIEBACiAJCXBibS0+cGFyZW50LT5yZXNvdXJjZV9hZGp1c3QocGRldiwgcmVzLCByb290KTsKIAogCQlpZiAocmVxdWVzdF9yZXNvdXJjZShyb290LCByZXMpIDwgMCkgeworCQkJaW50IHJudW07CisKIAkJCS8qIE9LLCB0aGVyZSBpcyBzb21lIGNvbmZsaWN0LiAgQnV0IHRoaXMgaXMgZmluZQogCQkJICogc2luY2Ugd2UnbGwgcmVhc3NpZ24gaXQgaW4gdGhlIGZpeHVwIHBhc3MuCiAJCQkgKgotCQkJICogV2Ugbm90aWZ5IHRoZSB1c2VyIHRoYXQgT0JQIG1hZGUgYW4gZXJyb3IgaWYgaXQKLQkJCSAqIGlzIGEgY2FzZSB3ZSBkb24ndCBleHBlY3QuCisJCQkgKiBEbyBub3QgcHJpbnQgdGhlIHdhcm5pbmcgZm9yIFJPTSByZXNvdXJjZXMKKwkJCSAqIGFzIHN1Y2ggYSBjb25mbGljdCBpcyBxdWl0ZSBjb21tb24gYW5kCisJCQkgKiBoYXJtbGVzcyBhcyB0aGUgUk9NIGJhciBpcyBkaXNhYmxlZC4KIAkJCSAqLwotCQkJaWYgKCFwZGV2X3Jlc291cmNlX2NvbGxpc2lvbnNfZXhwZWN0ZWQocGRldikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQWRkcmVzcyBzcGFjZSBjb2xsaXNpb24gb24gcmVnaW9uICVsZCAiCisJCQlybnVtID0gKHJlcyAtICZwZGV2LT5yZXNvdXJjZVswXSk7CisJCQlpZiAocm51bSAhPSBQQ0lfUk9NX1JFU09VUkNFKQorCQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBSZXNvdXJjZSBjb2xsaXNpb24sICIKKwkJCQkgICAgICAgInJlZ2lvbiAlZCAiCiAJCQkJICAgICAgICJbJTAxNmx4OiUwMTZseF0gb2YgZGV2aWNlICVzXG4iLAotCQkJCSAgICAgICAocmVzIC0gJnBkZXYtPnJlc291cmNlWzBdKSwKKwkJCQkgICAgICAgcm51bSwKIAkJCQkgICAgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQsCiAJCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKLQkJCX0KIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9pb21tdS5jCmluZGV4IDgyZTU0NTUuLjJlN2YxNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYwpAQCAtMjgxLDcgKzI4MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAotCWZyZWVfbnBhZ2VzKGlvbW11LCBkdm1hLCBucGFnZXMpOworCWZyZWVfbnBhZ2VzKGlvbW11LCBkdm1hIC0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UsIG5wYWdlcyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYwppbmRleCA2ZWM1Njk4Li45NGJiNjgxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKQEAgLTExOTYsNyArMTE5Niw3IEBACiAJCQkJCSAgICAmcGJtLT5tZW1fc3BhY2UpOwogfQogCi1zdGF0aWMgdm9pZCBzYWJyZV9wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgc3RydWN0IGRldmljZV9ub2RlICpkcCwgdTMyIGRtYV9iZWdpbikKK3N0YXRpYyB2b2lkIHNhYnJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCB1MzIgZG1hX3N0YXJ0LCB1MzIgZG1hX2VuZCkKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwpAQCAtMTI2MSw2ICsxMjYxLDggQEAKIAkJbm9kZSA9IG5vZGUtPnNpYmxpbmc7CiAJfQogCWlmIChzaW1iYXNfZm91bmQgPT0gMCkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwOworCiAJCS8qIE5vIEFQQnMgdW5kZXJuZWF0aCwgcHJvYmFibHkgdGhpcyBpcyBhIGh1bW1pbmdiaXJkCiAJCSAqIHN5c3RlbS4KIAkJICovCkBAIC0xMzAyLDggKzEzMDQsMTAgQEAKIAkJcGJtLT5pb19zcGFjZS5lbmQgICA9IHBibS0+aW9fc3BhY2Uuc3RhcnQgKyAoMVVMIDw8IDI0KSAtIDFVTDsKIAkJcGJtLT5pb19zcGFjZS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CiAKLQkJcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9NRU1TUEFDRTsKLQkJcGJtLT5tZW1fc3BhY2UuZW5kICAgPSBwYm0tPm1lbV9zcGFjZS5zdGFydCArICh1bnNpZ25lZCBsb25nKWRtYV9iZWdpbiAtIDFVTDsKKwkJcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPQorCQkJKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX01FTVNQQUNFKTsKKwkJcGJtLT5tZW1fc3BhY2UuZW5kID0KKwkJCShwYm0tPm1lbV9zcGFjZS5zdGFydCArICgoMVVMIDw8IDMyVUwpIC0gMVVMKSk7CiAJCXBibS0+bWVtX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CiAKIAkJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnBibS0+aW9fc3BhY2UpIDwgMCkgewpAQCAtMTMxNSw2ICsxMzE5LDE3IEBACiAJCQlwcm9tX2hhbHQoKTsKIAkJfQogCisJCXJwID0ga21hbGxvYyhzaXplb2YoKnJwKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcnApIHsKKwkJCXByb21fcHJpbnRmKCJDYW5ub3QgYWxsb2NhdGUgSU9NTVUgcmVzb3VyY2UuXG4iKTsKKwkJCXByb21faGFsdCgpOworCQl9CisJCXJwLT5uYW1lID0gIklPTU1VIjsKKwkJcnAtPnN0YXJ0ID0gcGJtLT5tZW1fc3BhY2Uuc3RhcnQgKyAodW5zaWduZWQgbG9uZykgZG1hX3N0YXJ0OworCQlycC0+ZW5kID0gcGJtLT5tZW1fc3BhY2Uuc3RhcnQgKyAodW5zaWduZWQgbG9uZykgZG1hX2VuZCAtIDFVTDsKKwkJcnAtPmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZOworCQlyZXF1ZXN0X3Jlc291cmNlKCZwYm0tPm1lbV9zcGFjZSwgcnApOworCiAJCXBjaV9yZWdpc3Rlcl9sZWdhY3lfcmVnaW9ucygmcGJtLT5pb19zcGFjZSwKIAkJCQkJICAgICZwYm0tPm1lbV9zcGFjZSk7CiAJfQpAQCAtMTQ1MCw1ICsxNDY1LDUgQEAKIAkvKgogCSAqIExvb2sgZm9yIEFQQiB1bmRlcm5lYXRoLgogCSAqLwotCXNhYnJlX3BibV9pbml0KHAsIGRwLCB2ZG1hWzBdKTsKKwlzYWJyZV9wYm1faW5pdChwLCBkcCwgdmRtYVswXSwgdmRtYVswXSArIHZkbWFbMV0pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3N1bjR2LmMKaW5kZXggMDNhZDRjMC4uNmIwNDc5NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jCkBAIC03OTgsNyArNzk4LDcgQEAKIHN0YXRpYyB2b2lkIHBibV9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKIAkJCSBzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKmNvb2tpZSA9IGttYWxsb2Moc2l6ZW9mKCpjb29raWUpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqY29va2llID0ga3phbGxvYyhzaXplb2YoKmNvb2tpZSksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFjb29raWUpIHsKIAkJcHJvbV9wcmludGYoIiVzOiBDcml0aWNhbCBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iLCBwYm0tPm5hbWUpOwpAQCAtODA2LDcgKzgwNiw2IEBACiAJfQogCiAJLyogQWxsIHdlIGNhcmUgYWJvdXQgaXMgdGhlIFBCTS4gKi8KLQltZW1zZXQoY29va2llLCAwLCBzaXplb2YoKmNvb2tpZSkpOwogCWNvb2tpZS0+cGJtID0gcGJtOwogCiAJcGJtLT5wY2lfYnVzID0gcGNpX3NjYW5fYnVzKHBibS0+cGNpX2ZpcnN0X2J1c25vLCBwLT5wY2lfb3BzLCBwYm0pOwpAQCAtMTA0OCwxMiArMTA0NywxMSBAQAogCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBmcmVlIGFyZWEgbWFwLiAgKi8KIAlzeiA9IG51bV90c2JfZW50cmllcyAvIDg7CiAJc3ogPSAoc3ogKyA3VUwpICYgfjdVTDsKLQlpb21tdS0+YXJlbmEubWFwID0ga21hbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwogCWlmICghaW9tbXUtPmFyZW5hLm1hcCkgewogCQlwcm9tX3ByaW50ZigiUENJX0lPTU1VOiBFcnJvciwga21hbGxvYyhhcmVuYS5tYXApIGZhaWxlZC5cbiIpOwogCQlwcm9tX2hhbHQoKTsKIAl9Ci0JbWVtc2V0KGlvbW11LT5hcmVuYS5tYXAsIDAsIHN6KTsKIAlpb21tdS0+YXJlbmEubGltaXQgPSBudW1fdHNiX2VudHJpZXM7CiAKIAlzeiA9IHByb2JlX2V4aXN0aW5nX2VudHJpZXMocGJtLCBpb21tdSk7CkBAIC0xMTY0LDI0ICsxMTYyLDIwIEBACiAJCXBlcl9jcHUocGNpX2lvbW11X2JhdGNoLCBpKS5wZ2xpc3QgPSAodTY0ICopIHBhZ2U7CiAJfQogCi0JcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvKSwgR0ZQX0FUT01JQyk7CisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwKQogCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKIAotCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKLQotCWlvbW11ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9pb21tdSksIEdGUF9BVE9NSUMpOworCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9pb21tdSksIEdGUF9BVE9NSUMpOwogCWlmICghaW9tbXUpCiAJCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOwogCi0JbWVtc2V0KGlvbW11LCAwLCBzaXplb2YoKmlvbW11KSk7CiAJcC0+cGJtX0EuaW9tbXUgPSBpb21tdTsKIAotCWlvbW11ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9pb21tdSksIEdGUF9BVE9NSUMpOworCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9pb21tdSksIEdGUF9BVE9NSUMpOwogCWlmICghaW9tbXUpCiAJCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOwogCi0JbWVtc2V0KGlvbW11LCAwLCBzaXplb2YoKmlvbW11KSk7CiAJcC0+cGJtX0IuaW9tbXUgPSBpb21tdTsKIAogCXAtPm5leHQgPSBwY2lfY29udHJvbGxlcl9yb290OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYwppbmRleCBlMjFjZDZhLi4wOTE3YzI0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYwpAQCAtNzkzLDcgKzc5Myw3IEBACiAJcmV0dXJuIHZpcnRfaXJxOwogfQogCi1zdGF0aWMgdm9pZCBzY2hpem9faXJxX3RyYW5zX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCkKK3N0YXRpYyB2b2lkIF9fc2NoaXpvX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGludCBpc190b21hdGlsbG8pCiB7CiAJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAJc3RydWN0IHNjaGl6b19pcnFfZGF0YSAqaXJxX2RhdGE7CkBAIC04MDcsMTEgKzgwNywyNCBAQAogCWRwLT5pcnFfdHJhbnMtPmRhdGEgPSBpcnFfZGF0YTsKIAogCWlycV9kYXRhLT5wYm1fcmVncyA9IHJlZ3NbMF0ucGh5c19hZGRyOwotCWlycV9kYXRhLT5zeW5jX3JlZyA9IHJlZ3NbM10ucGh5c19hZGRyICsgMHgxYTE4VUw7CisJaWYgKGlzX3RvbWF0aWxsbykKKwkJaXJxX2RhdGEtPnN5bmNfcmVnID0gcmVnc1szXS5waHlzX2FkZHIgKyAweDFhMThVTDsKKwllbHNlCisJCWlycV9kYXRhLT5zeW5jX3JlZyA9IDBVTDsKIAlpcnFfZGF0YS0+cG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAicG9ydGlkIiwgMCk7CiAJaXJxX2RhdGEtPmNoaXBfdmVyc2lvbiA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInZlcnNpb24jIiwgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHNjaGl6b19pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCV9fc2NoaXpvX2lycV90cmFuc19pbml0KGRwLCAwKTsKK30KKworc3RhdGljIHZvaWQgdG9tYXRpbGxvX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJX19zY2hpem9faXJxX3RyYW5zX2luaXQoZHAsIDEpOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IHBjaV9zdW40dl9pcnFfYnVpbGQoc3RydWN0IGRldmljZV9ub2RlICpkcCwKIAkJCQkJdW5zaWduZWQgaW50IGRldmlubywKIAkJCQkJdm9pZCAqX2RhdGEpCkBAIC0xMDUwLDggKzEwNjMsOCBAQAogCXsgInBjaTEwOGUsODAwMSIsIHNjaGl6b19pcnFfdHJhbnNfaW5pdCB9LAogCXsgIlNVTlcsc2NoaXpvKyIsIHNjaGl6b19pcnFfdHJhbnNfaW5pdCB9LAogCXsgInBjaTEwOGUsODAwMiIsIHNjaGl6b19pcnFfdHJhbnNfaW5pdCB9LAotCXsgIlNVTlcsdG9tYXRpbGxvIiwgc2NoaXpvX2lycV90cmFuc19pbml0IH0sCi0JeyAicGNpMTA4ZSxhODAxIiwgc2NoaXpvX2lycV90cmFuc19pbml0IH0sCisJeyAiU1VOVyx0b21hdGlsbG8iLCB0b21hdGlsbG9faXJxX3RyYW5zX2luaXQgfSwKKwl7ICJwY2kxMDhlLGE4MDEiLCB0b21hdGlsbG9faXJxX3RyYW5zX2luaXQgfSwKIAl7ICJTVU5XLHN1bjR2LXBjaSIsIHBjaV9zdW40dl9pcnFfdHJhbnNfaW5pdCB9LAogfTsKICNlbmRpZgpAQCAtMTA3OSwyMyArMTA5MiwyMiBAQAogCiBzdGF0aWMgdm9pZCBpcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewotCWNvbnN0IGNoYXIgKm1vZGVsOwogI2lmZGVmIENPTkZJR19QQ0kKKwljb25zdCBjaGFyICptb2RlbDsKIAlpbnQgaTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQogCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKIAlpZiAoIW1vZGVsKQogCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImNvbXBhdGlibGUiLCBOVUxMKTsKLQlpZiAoIW1vZGVsKQotCQlyZXR1cm47CisJaWYgKG1vZGVsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjaV9pcnFfdHJhbnNfdGFibGUpOyBpKyspIHsKKwkJCXN0cnVjdCBpcnFfdHJhbnMgKnQgPSAmcGNpX2lycV90cmFuc190YWJsZVtpXTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2lfaXJxX3RyYW5zX3RhYmxlKTsgaSsrKSB7Ci0JCXN0cnVjdCBpcnFfdHJhbnMgKnQgPSAmcGNpX2lycV90cmFuc190YWJsZVtpXTsKLQotCQlpZiAoIXN0cmNtcChtb2RlbCwgdC0+bmFtZSkpCi0JCQlyZXR1cm4gdC0+aW5pdChkcCk7CisJCQlpZiAoIXN0cmNtcChtb2RlbCwgdC0+bmFtZSkpCisJCQkJcmV0dXJuIHQtPmluaXQoZHApOworCQl9CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NCVVMKQEAgLTExMDMsOCArMTExNSw5IEBACiAJICAgICFzdHJjbXAoZHAtPm5hbWUsICJzYmkiKSkKIAkJcmV0dXJuIHNidXNfaXJxX3RyYW5zX2luaXQoZHApOwogI2VuZGlmCi0JaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJjZW50cmFsIikpCi0JCXJldHVybiBjZW50cmFsX2lycV90cmFuc19pbml0KGRwLT5jaGlsZCk7CisJaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJmaGMiKSAmJgorCSAgICAhc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJjZW50cmFsIikpCisJCXJldHVybiBjZW50cmFsX2lycV90cmFuc19pbml0KGRwKTsKIAlpZiAoIXN0cmNtcChkcC0+bmFtZSwgInZpcnR1YWwtZGV2aWNlcyIpKQogCQlyZXR1cm4gc3VuNHZfdmRldl9pcnFfdHJhbnNfaW5pdChkcCk7CiB9CkBAIC0xNTE2LDcgKzE1MjksNyBAQAogCXJldHVybiBidWY7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX2luaXQgY3JlYXRlX25vZGUocGhhbmRsZSBub2RlKQorc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqIF9faW5pdCBjcmVhdGVfbm9kZShwaGFuZGxlIG5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAKQEAgLTE1MjUsNiArMTUzOCw3IEBACiAKIAlkcCA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKCpkcCkpOwogCWRwLT51bmlxdWVfaWQgPSB1bmlxdWVfaWQrKzsKKwlkcC0+cGFyZW50ID0gcGFyZW50OwogCiAJa3JlZl9pbml0KCZkcC0+a3JlZik7CiAKQEAgLTE1NDMsMTIgKzE1NTcsMTEgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCi0JZHAgPSBjcmVhdGVfbm9kZShub2RlKTsKKwlkcCA9IGNyZWF0ZV9ub2RlKG5vZGUsIHBhcmVudCk7CiAJaWYgKGRwKSB7CiAJCSooKm5leHRwKSA9IGRwOwogCQkqbmV4dHAgPSAmZHAtPmFsbG5leHQ7CiAKLQkJZHAtPnBhcmVudCA9IHBhcmVudDsKIAkJZHAtPnBhdGhfY29tcG9uZW50X25hbWUgPSBidWlsZF9wYXRoX2NvbXBvbmVudChkcCk7CiAJCWRwLT5mdWxsX25hbWUgPSBidWlsZF9mdWxsX25hbWUoZHApOwogCkBAIC0xNTY0LDcgKzE1NzcsNyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKm5leHRwOwogCi0JYWxsbm9kZXMgPSBjcmVhdGVfbm9kZShwcm9tX3Jvb3Rfbm9kZSk7CisJYWxsbm9kZXMgPSBjcmVhdGVfbm9kZShwcm9tX3Jvb3Rfbm9kZSwgTlVMTCk7CiAJYWxsbm9kZXMtPnBhdGhfY29tcG9uZW50X25hbWUgPSAiIjsKIAlhbGxub2Rlcy0+ZnVsbF9uYW1lID0gIi8iOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCBkMzE5NzVlLi44MTExMWExIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTIwMiw3ICsyMDIsMTAgQEAKICNlbmRpZgogCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7CiAJCXJldCA9IHB0cmFjZV90cmFjZW1lKCk7Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXB0X2Vycm9yX3JldHVybihyZWdzLCAtcmV0KTsKKwkJZWxzZQorCQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9ydHJhcC5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9ydHJhcC5TCmluZGV4IDM1MjJjZDYuLjA3OWQxOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcnRyYXAuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3J0cmFwLlMKQEAgLTE2NSwxNCArMTY1LDI2IEBACiBfX2hhbmRsZV9zb2Z0aXJxX2NvbnRpbnVlOgogcnRyYXBfeGNhbGw6CiAJCXNldGhpCQkJJWhpKDB4ZiA8PCAyMCksICVsNAotCQlhbmRjYwkJCSVsMSwgVFNUQVRFX1BSSVYsICVsMwogCQlhbmQJCQklbDEsICVsNCwgJWw0CisJCWFuZG4JCQklbDEsICVsNCwgJWwxCisJCXNybAkJCSVsNCwgMjAsICVsNAorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCQlicm56LHBuCQkJJWw0LCBydHJhcF9ub19pcnFfZW5hYmxlCisJCSBub3AKKwkJY2FsbAkJCXRyYWNlX2hhcmRpcnFzX29uCisJCSBub3AKKwkJd3JwcgkJCSVsNCwgJXBpbAorcnRyYXBfbm9faXJxX2VuYWJsZToKKyNlbmRpZgorCQlhbmRjYwkJCSVsMSwgVFNUQVRFX1BSSVYsICVsMwogCQlibmUscG4JCQklaWNjLCB0b19rZXJuZWwKLQkJIGFuZG4JCQklbDEsICVsNCwgJWwxCisJCSBub3AKIAogCQkvKiBXZSBtdXN0IGhvbGQgSVJRcyBvZmYgYW5kIGF0b21pY2FsbHkgdGVzdCBzY2hlZHVsZStzaWduYWwKIAkJICogc3RhdGUsIHRoZW4gaG9sZCB0aGVtIG9mZiBhbGwgdGhlIHdheSBiYWNrIHRvIHVzZXJzcGFjZS4KLQkJICogSWYgd2UgYXJlIHJldHVybmluZyB0byBrZXJuZWwsIG5vbmUgb2YgdGhpcyBtYXR0ZXJzLgorCQkgKiBJZiB3ZSBhcmUgcmV0dXJuaW5nIHRvIGtlcm5lbCwgbm9uZSBvZiB0aGlzIG1hdHRlcnMuICBOb3RlCisJCSAqIHRoYXQgd2UgYXJlIGRpc2FibGluZyBpbnRlcnJ1cHRzIHZpYSBQU1RBVEVfSUUsIG5vdCB1c2luZworCQkgKiAlcGlsLgogCQkgKgogCQkgKiBJZiB3ZSBkbyBub3QgZG8gdGhpcywgdGhlcmUgaXMgYSB3aW5kb3cgd2hlcmUgd2Ugd291bGQgZG8KIAkJICogdGhlIHRlc3RzLCBsYXRlciB0aGUgc2lnbmFsL3Jlc2NoZWQgZXZlbnQgYXJyaXZlcyBidXQgd2UgZG8KQEAgLTI1Niw3ICsyNjgsNiBAQAogCiAJCWxkCQkJWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9ZXSwgJW8zCiAJCXdyCQkJJW8zLCAlZzAsICV5Ci0JCXNybAkJCSVsNCwgMjAsICVsNAogCQl3cnByCQkJJWw0LCAweDAsICVwaWwKIAkJd3JwcgkJCSVnMCwgMHgxLCAldGwKIAkJd3JwcgkJCSVsMSwgJWcwLCAldHN0YXRlCkBAIC0zNzQsOCArMzg1LDggQEAKIAkJIGxkeAkJCVslZzYgKyBUSV9GTEFHU10sICVsNQogCQlhbmRjYwkJCSVsNSwgX1RJRl9ORUVEX1JFU0NIRUQsICVnMAogCQliZSxwdAkJCSV4Y2MsIGtlcm5fZnB1Y2hlY2sKLQkJIHNybAkJCSVsNCwgMjAsICVsNQotCQljbXAJCQklbDUsIDAKKwkJIG5vcAorCQljbXAJCQklbDQsIDAKIAkJYm5lLHBuCQkJJXhjYywga2Vybl9mcHVjaGVjawogCQkgc2V0aGkJCQklaGkoUFJFRU1QVF9BQ1RJVkUpLCAlbDYKIAkJc3R3CQkJJWw2LCBbJWc2ICsgVElfUFJFX0NPVU5UXQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGNjOGFkNDguLmJmMDMzYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKQEAgLTc0LDcgKzc0LDYgQEAKIAogdW5zaWduZWQgaW50IGJvb3RfZmxhZ3MgPSAwOwogI2RlZmluZSBCT09UTUVfREVCVUcgIDB4MQotI2RlZmluZSBCT09UTUVfU0lOR0xFIDB4MgogCiAvKiBFeHBvcnRlZCBmb3IgbW0vaW5pdC5jOnBhZ2luZ19pbml0LiAqLwogdW5zaWduZWQgbG9uZyBjbWRsaW5lX21lbW9yeV9zaXplID0gMDsKQEAgLTEwMiw3ICsxMDEsNiBAQAogCQlib290X2ZsYWdzIHw9IEJPT1RNRV9ERUJVRzsKIAkJYnJlYWs7CiAJY2FzZSAncyc6Ci0JCWJvb3RfZmxhZ3MgfD0gQk9PVE1FX1NJTkdMRTsKIAkJYnJlYWs7CiAJY2FzZSAnaCc6CiAJCXByb21fcHJpbnRmKCJib290X2ZsYWdzX2luaXQ6IEhhbHQhXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zdGFja3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkMTVmMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC0wLDAgKzEsNDEgQEAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKwordm9pZCBzYXZlX3N0YWNrX3RyYWNlKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGtzcCwgZnAsIHRocmVhZF9iYXNlOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7CisKKwlpZiAoIXRhc2spCisJCXRhc2sgPSBjdXJyZW50OworCXRwID0gdGFza190aHJlYWRfaW5mbyh0YXNrKTsKKwlpZiAodGFzayA9PSBjdXJyZW50KSB7CisJCWZsdXNod19hbGwoKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkibW92CSUlZnAsICUwIgorCQkJOiAiPXIiIChrc3ApCisJCSk7CisJfSBlbHNlCisJCWtzcCA9IHRwLT5rc3A7CisKKwlmcCA9IGtzcCArIFNUQUNLX0JJQVM7CisJdGhyZWFkX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgdHA7CisJZG8geworCQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcnc7CisKKwkJLyogQm9ndXMgZnJhbWUgcG9pbnRlcj8gKi8KKwkJaWYgKGZwIDwgKHRocmVhZF9iYXNlICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykpIHx8CisJCSAgICBmcCA+PSAodGhyZWFkX2Jhc2UgKyBUSFJFQURfU0laRSkpCisJCQlicmVhazsKKworCQlydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdyAqKSBmcDsKKwkJaWYgKHRyYWNlLT5za2lwID4gMCkKKwkJCXRyYWNlLT5za2lwLS07CisJCWVsc2UKKwkJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gcnctPmluc1s3XTsKKworCQlmcCA9IHJ3LT5pbnNbNl0gKyBTVEFDS19CSUFTOworCX0gd2hpbGUgKHRyYWNlLT5ucl9lbnRyaWVzIDwgdHJhY2UtPm1heF9lbnRyaWVzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3VuNHZfaXZlYy5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zdW40dl9pdmVjLlMKaW5kZXggNDk3MDNjMy4uNDA1ODU1ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zdW40dl9pdmVjLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zdW40dl9pdmVjLlMKQEAgLTE5MCw3ICsxOTAsMTAgQEAKIAltb3YJJWcxLCAlZzQKIAliYSxwdAkleGNjLCBldHJhcF9pcnEKIAkgcmQJJXBjLCAlZzcKLQorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCWNhbGwJCXRyYWNlX2hhcmRpcnFzX29mZgorCSBub3AKKyNlbmRpZgogCS8qIExvZyB0aGUgZXZlbnQuICAqLwogCWFkZAklc3AsIFBUUkVHU19PRkYsICVvMAogCWNhbGwJc3VuNHZfcmVzdW1fZXJyb3IKQEAgLTIxNiw3ICsyMTksMTAgQEAKIAl3cnByCSVnMCwgMTUsICVwaWwKIAliYSxwdAkleGNjLCBldHJhcF9pcnEKIAkgcmQJJXBjLCAlZzcKLQorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCWNhbGwJCXRyYWNlX2hhcmRpcnFzX29mZgorCSBub3AKKyNlbmRpZgogCWNhbGwJc3VuNHZfcmVzdW1fb3ZlcmZsb3cKIAkgYWRkCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAKQEAgLTI5NSw3ICszMDEsMTAgQEAKIAltb3YJJWcxLCAlZzQKIAliYSxwdAkleGNjLCBldHJhcF9pcnEKIAkgcmQJJXBjLCAlZzcKLQorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCWNhbGwJCXRyYWNlX2hhcmRpcnFzX29mZgorCSBub3AKKyNlbmRpZgogCS8qIExvZyB0aGUgZXZlbnQuICAqLwogCWFkZAklc3AsIFBUUkVHU19PRkYsICVvMAogCWNhbGwJc3VuNHZfbm9ucmVzdW1fZXJyb3IKQEAgLTMyMSw3ICszMzAsMTAgQEAKIAl3cnByCSVnMCwgMTUsICVwaWwKIAliYSxwdAkleGNjLCBldHJhcF9pcnEKIAkgcmQJJXBjLCAlZzcKLQorI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCWNhbGwJCXRyYWNlX2hhcmRpcnFzX29mZgorCSBub3AKKyNlbmRpZgogCWNhbGwJc3VuNHZfbm9ucmVzdW1fb3ZlcmZsb3cKIAkgYWRkCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3N1bm9zMzIuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3N1bm9zMzIuYwppbmRleCA3ZGE3MmQzLi4yZWJjMmMwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zdW5vczMyLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3Vub3MzMi5jCkBAIC04Myw3ICs4Myw3IEBACiAgCQlmaWxlID0gZmdldChmZCk7CiAJCWlmICghZmlsZSkKIAkJCWdvdG8gb3V0OwotCQlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJCWlmIChpbWFqb3IoaW5vZGUpID09IE1FTV9NQUpPUiAmJiBpbWlub3IoaW5vZGUpID09IDUpIHsKIAkJCWZsYWdzIHw9IE1BUF9BTk9OWU1PVVM7CiAJCQlmcHV0KGZpbGUpOwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJaWYgKCFmaWxlKQogCQlyZXR1cm4gMDsKIAotCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJc29ja2V0ID0gU09DS0VUX0koaW5vZGUpOwogCWxvY2FsLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwpAQCAtMTA1NSw3ICsxMDU1LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSAyOgogCQlydmFsID0gLUVGQVVMVDsKLQkJa21idWYgPSAoc3RydWN0IG1zZ2J1ZiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2didWYpICsgYXJnMywKKwkJa21idWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNnYnVmKSArIGFyZzMsCiAJCQkJCQkgR0ZQX0tFUk5FTCk7CiAJCWlmICgha21idWYpCiAJCQlicmVhazsKQEAgLTEwNzgsNyArMTA3OCw3IEBACiAJCWJyZWFrOwogCWNhc2UgMzoKIAkJcnZhbCA9IC1FRkFVTFQ7Ci0JCWttYnVmID0gKHN0cnVjdCBtc2didWYgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNnYnVmKSArIGFyZzMsCisJCWttYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1zZ2J1ZikgKyBhcmczLAogCQkJCQkJIEdGUF9LRVJORUwpOwogCQlpZiAoIWttYnVmIHx8IHN1bm9zX21zZ2J1Zl9nZXQoKHN0cnVjdCBtc2didWYzMiBfX3VzZXIgKikodW5zaWduZWQgbG9uZylhcmcyLAogCQkJCQkgICAgICAga21idWYsIGFyZzMpKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwppbmRleCA0MTlhNjNmLi45YTgwMjY3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwpAQCAtNzksNyArNzksNyBAQAogCS53b3JkIHN5c19ta2RpcmF0LCBzeXNfbWtub2RhdCwgc3lzX2ZjaG93bmF0LCBjb21wYXRfc3lzX2Z1dGltZXNhdCwgY29tcGF0X3N5c19mc3RhdGF0NjQKIC8qMjkwKi8JLndvcmQgc3lzX3VubGlua2F0LCBzeXNfcmVuYW1lYXQsIHN5c19saW5rYXQsIHN5c19zeW1saW5rYXQsIHN5c19yZWFkbGlua2F0CiAJLndvcmQgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBjb21wYXRfc3lzX3BzZWxlY3Q2LCBjb21wYXRfc3lzX3Bwb2xsLCBzeXNfdW5zaGFyZQotLyozMDAqLwkud29yZCBjb21wYXRfc3lzX3NldF9yb2J1c3RfbGlzdCwgY29tcGF0X3N5c19nZXRfcm9idXN0X2xpc3QKKy8qMzAwKi8JLndvcmQgY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3QsIGNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0LCBjb21wYXRfc3lzX21pZ3JhdGVfcGFnZXMKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJLndvcmQgc3lzX21rZGlyYXQsIHN5c19ta25vZGF0LCBzeXNfZmNob3duYXQsIHN5c19mdXRpbWVzYXQsIHN5c19mc3RhdGF0NjQKIC8qMjkwKi8JLndvcmQgc3lzX3VubGlua2F0LCBzeXNfcmVuYW1lYXQsIHN5c19saW5rYXQsIHN5c19zeW1saW5rYXQsIHN5c19yZWFkbGlua2F0CiAJLndvcmQgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBzeXNfcHNlbGVjdDYsIHN5c19wcG9sbCwgc3lzX3Vuc2hhcmUKLS8qMzAwKi8JLndvcmQgc3lzX3NldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdAorLyozMDAqLwkud29yZCBzeXNfc2V0X3JvYnVzdF9saXN0LCBzeXNfZ2V0X3JvYnVzdF9saXN0LCBzeXNfbWlncmF0ZV9wYWdlcwogCiAjaWYgZGVmaW5lZChDT05GSUdfU1VOT1NfRU1VTCkgfHwgZGVmaW5lZChDT05GSUdfU09MQVJJU19FTVVMKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU09MQVJJU19FTVVMX01PRFVMRSkKQEAgLTI2Miw1ICsyNjIsNyBAQAogLyoyOTAqLwkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCiAJLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKLQkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCisJLndvcmQgc3Vub3Nfbm9zeXMKKy8qMzAwKi8JLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwppbmRleCA2ODQyMGUyLi5hZDY3Nzg0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+ICAvKiBmb3IgamlmZmllcyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KQEAgLTg3LDYgKzg3LDcgQEAKIAkJICAgICAgIGkgKyAxLAogCQkgICAgICAgcC0+dHJhcHN0YWNrW2ldLnRzdGF0ZSwgcC0+dHJhcHN0YWNrW2ldLnRwYywKIAkJICAgICAgIHAtPnRyYXBzdGFja1tpXS50bnBjLCBwLT50cmFwc3RhY2tbaV0udHQpOworCQlwcmludF9zeW1ib2woIlRSQVBMT0c6IFRQQzwlcz5cbiIsIHAtPnRyYXBzdGFja1tpXS50cGMpOwogCX0KIH0KIApAQCAtMTEzNCw2ICsxMTM1LDkgQEAKIAlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBUUENbJWx4XSBUTlBDWyVseF0gTzdbJWx4XSBUU1RBVEVbJWx4XVxuIiwKIAkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICByZWdzLT50cGMsIHJlZ3MtPnRucGMsIHJlZ3MtPnVfcmVnc1tVUkVHX0k3XSwgcmVncy0+dHN0YXRlKTsKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiAiLAorCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXByaW50X3N5bWJvbCgiVFBDPCVzPlxuIiwgcmVncy0+dHBjKTsKIAlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBNX1NZTkQoJWx4KSwgIEVfU1lORCglbHgpJXMlc1xuIiwKIAkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICAoYWZzciAmIENIQUZTUl9NX1NZTkRST01FKSA+PiBDSEFGU1JfTV9TWU5EUk9NRV9TSElGVCwKQEAgLTE3NDEsNiArMTc0NSw3IEBACiAJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksCiAJCSAgICAgICAodHlwZSAmIDB4MSkgPyAnSScgOiAnRCcsCiAJCSAgICAgICByZWdzLT50cGMpOworCQlwcmludF9zeW1ib2woS0VSTl9FTUVSRyAiVFBDPCVzPlxuIiwgcmVncy0+dHBjKTsKIAkJcGFuaWMoIklycmVjb3ZlcmFibGUgQ2hlZXRhaCsgcGFyaXR5IGVycm9yLiIpOwogCX0KIApAQCAtMTc0OCw2ICsxNzUzLDcgQEAKIAkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICAodHlwZSAmIDB4MSkgPyAnSScgOiAnRCcsCiAJICAgICAgIHJlZ3MtPnRwYyk7CisJcHJpbnRfc3ltYm9sKEtFUk5fV0FSTklORyAiVFBDPCVzPlxuIiwgcmVncy0+dHBjKTsKIH0KIAogc3RydWN0IHN1bjR2X2Vycm9yX2VudHJ5IHsKQEAgLTE4NjcsNiArMTg3MywxNiBAQAogCiAJcHV0X2NwdSgpOwogCisJaWYgKGVudC0+ZXJyX3R5cGUgPT0gU1VONFZfRVJSX1RZUEVfV0FSTklOR19SRVMpIHsKKwkJLyogSWYgZXJyX3R5cGUgaXMgMHg0LCBpdCdzIGEgcG93ZXJkb3duIHJlcXVlc3QuICBEbworCQkgKiBub3QgZG8gdGhlIHVzdWFsIHJlc3VtYWJsZSBlcnJvciBsb2cgYmVjYXVzZSB0aGF0CisJCSAqIG1ha2VzIGl0IGxvb2sgbGlrZSBzb21lIGFibm9ybWFsIGVycm9yLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiUG93ZXIgZG93biByZXF1ZXN0Li4uXG4iKTsKKwkJa2lsbF9jYWRfcGlkKFNJR0lOVCwgMSk7CisJCXJldHVybjsKKwl9CisKIAlzdW40dl9sb2dfZXJyb3IocmVncywgJmxvY2FsX2NvcHksIGNwdSwKIAkJCUtFUk5fRVJSICJSRVNVTUFCTEUgRVJST1IiLAogCQkJJnN1bjR2X3Jlc3VtX29mbG93X2NudCk7CkBAIC0xOTQ2LDYgKzE5NjIsNyBAQAogCiAJcHJpbnRrKEtFUk5fRU1FUkcgIlNVTjRWLUlUTEI6IEVycm9yIGF0IFRQQ1slbHhdLCB0bCAlZFxuIiwKIAkgICAgICAgcmVncy0+dHBjLCB0bCk7CisJcHJpbnRfc3ltYm9sKEtFUk5fRU1FUkcgIlNVTjRWLUlUTEI6IFRQQzwlcz5cbiIsIHJlZ3MtPnRwYyk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIlNVTjRWLUlUTEI6IHZhZGRyWyVseF0gY3R4WyVseF0gIgogCSAgICAgICAicHRlWyVseF0gZXJyb3JbJWx4XVxuIiwKIAkgICAgICAgc3VuNHZfZXJyX2l0bGJfdmFkZHIsIHN1bjR2X2Vycl9pdGxiX2N0eCwKQEAgLTE5NjYsNiArMTk4Myw3IEBACiAKIAlwcmludGsoS0VSTl9FTUVSRyAiU1VONFYtRFRMQjogRXJyb3IgYXQgVFBDWyVseF0sIHRsICVkXG4iLAogCSAgICAgICByZWdzLT50cGMsIHRsKTsKKwlwcmludF9zeW1ib2woS0VSTl9FTUVSRyAiU1VONFYtRFRMQjogVFBDPCVzPlxuIiwgcmVncy0+dHBjKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiU1VONFYtRFRMQjogdmFkZHJbJWx4XSBjdHhbJWx4XSAiCiAJICAgICAgICJwdGVbJWx4XSBlcnJvclslbHhdXG4iLAogCSAgICAgICBzdW40dl9lcnJfZHRsYl92YWRkciwgc3VuNHZfZXJyX2R0bGJfY3R4LApAQCAtMjI1Myw4ICsyMjcxLDEyIEBACiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIAorI2RlZmluZSBWSVNfT1BDT0RFX01BU0sJKCgweDMgPDwgMzApIHwgKDB4M2YgPDwgMTkpKQorI2RlZmluZSBWSVNfT1BDT0RFX1ZBTAkoKDB4MiA8PCAzMCkgfCAoMHgzNiA8PCAxOSkpCisKIGV4dGVybiBpbnQgaGFuZGxlX3BvcGModTMyIGluc24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBpbnQgaGFuZGxlX2xkZl9zdHEodTMyIGluc24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBpbnQgdmlzX2VtdWwoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgaW50KTsKIAogdm9pZCBkb19pbGxlZ2FsX2luc3RydWN0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMjI3OSwxMCArMjMwMSwxOCBAQAogCQkJaWYgKGhhbmRsZV9sZGZfc3RxKGluc24sIHJlZ3MpKQogCQkJCXJldHVybjsKIAkJfSBlbHNlIGlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7Ci0JCQlleHRlcm4gaW50IHZpc19lbXVsKHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGludCk7CisJCQlpZiAoKGluc24gJiBWSVNfT1BDT0RFX01BU0spID09IFZJU19PUENPREVfVkFMKSB7CisJCQkJaWYgKCF2aXNfZW11bChyZWdzLCBpbnNuKSkKKwkJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgZnB1c3RhdGUgKmYgPSBGUFVTVEFURTsKIAotCQkJaWYgKCF2aXNfZW11bChyZWdzLCBpbnNuKSkKLQkJCQlyZXR1cm47CisJCQkJLyogWFhYIG1heWJlIHZlcmlmeSBYRlNSIGJpdHMgbGlrZQorCQkJCSAqIFhYWCBkb19mcG90aGVyKCkgZG9lcz8KKwkJCQkgKi8KKwkJCQlpZiAoZG9fbWF0aGVtdShyZWdzLCBmKSkKKwkJCQkJcmV0dXJuOworCQkJfQogCQl9CiAJfQogCWluZm8uc2lfc2lnbm8gPSBTSUdJTEw7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3VuYWxpZ25lZC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC91bmFsaWduZWQuYwppbmRleCBhOWI3NjUyLi5iYzE4ZDQ4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3VuYWxpZ25lZC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdW5hbGlnbmVkLmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCXJldHVybiAhZmxvYXRpbmdfcG9pbnRfbG9hZF9vcl9zdG9yZV9wKGluc24pOwogfQogCi1zdGF0aWMgdm9pZCBrZXJuZWxfbW5hX3RyYXBfZmF1bHQodm9pZCkKK3N0YXRpYyB2b2lkIGtlcm5lbF9tbmFfdHJhcF9mYXVsdChpbnQgZml4dXBfdHN0YXRlX2FzaSkKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+a2Vybl91bmFfcmVnczsKIAl1bnNpZ25lZCBpbnQgaW5zbiA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+a2Vybl91bmFfaW5zbjsKQEAgLTI3NCwxOCArMjc0LDE1IEBACiAJcmVncy0+dHBjID0gZW50cnktPmZpeHVwOwogCXJlZ3MtPnRucGMgPSByZWdzLT50cGMgKyA0OwogCi0JcmVncy0+dHN0YXRlICY9IH5UU1RBVEVfQVNJOwotCXJlZ3MtPnRzdGF0ZSB8PSAoQVNJX0FJVVMgPDwgMjRVTCk7CisJaWYgKGZpeHVwX3RzdGF0ZV9hc2kpIHsKKwkJcmVncy0+dHN0YXRlICY9IH5UU1RBVEVfQVNJOworCQlyZWdzLT50c3RhdGUgfD0gKEFTSV9BSVVTIDw8IDI0VUwpOworCX0KIH0KIAotYXNtbGlua2FnZSB2b2lkIGtlcm5lbF91bmFsaWduZWRfdHJhcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc24pCitzdGF0aWMgdm9pZCBsb2dfdW5hbGlnbmVkKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvdW50LCBsYXN0X3RpbWU7Ci0JZW51bSBkaXJlY3Rpb24gZGlyID0gZGVjb2RlX2RpcmVjdGlvbihpbnNuKTsKLQlpbnQgc2l6ZSA9IGRlY29kZV9hY2Nlc3Nfc2l6ZShpbnNuKTsKLQotCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+a2Vybl91bmFfcmVncyA9IHJlZ3M7Ci0JY3VycmVudF90aHJlYWRfaW5mbygpLT5rZXJuX3VuYV9pbnNuID0gaW5zbjsKIAogCWlmIChqaWZmaWVzIC0gbGFzdF90aW1lID4gNSAqIEhaKQogCQljb3VudCA9IDA7CkBAIC0yOTUsNiArMjkyLDI4IEBACiAJCXByaW50aygiS2VybmVsIHVuYWxpZ25lZCBhY2Nlc3MgYXQgVFBDWyVseF0gIiwgcmVncy0+dHBjKTsKIAkJcHJpbnRfc3ltYm9sKCIlc1xuIiwgcmVncy0+dHBjKTsKIAl9Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBrZXJuZWxfdW5hbGlnbmVkX3RyYXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGludCBpbnNuKQoreworCWVudW0gZGlyZWN0aW9uIGRpciA9IGRlY29kZV9kaXJlY3Rpb24oaW5zbik7CisJaW50IHNpemUgPSBkZWNvZGVfYWNjZXNzX3NpemUoaW5zbik7CisJaW50IG9yaWdfYXNpLCBhc2k7CisKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPmtlcm5fdW5hX3JlZ3MgPSByZWdzOworCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+a2Vybl91bmFfaW5zbiA9IGluc247CisKKwlvcmlnX2FzaSA9IGFzaSA9IGRlY29kZV9hc2koaW5zbiwgcmVncyk7CisKKwkvKiBJZiB0aGlzIGlzIGEge2dldCxwdXR9X3VzZXIoKSBvbiBhbiB1bmFsaWduZWQgdXNlcnNwYWNlIHBvaW50ZXIsCisJICoganVzdCBzaWduYWwgYSBmYXVsdCBhbmQgZG8gbm90IGxvZyB0aGUgZXZlbnQuCisJICovCisJaWYgKGFzaSA9PSBBU0lfQUlVUykgeworCQlrZXJuZWxfbW5hX3RyYXBfZmF1bHQoMCk7CisJCXJldHVybjsKKwl9CisKKwlsb2dfdW5hbGlnbmVkKHJlZ3MpOwogCiAJaWYgKCFva19mb3Jfa2VybmVsKGluc24pIHx8IGRpciA9PSBib3RoKSB7CiAJCXByaW50aygiVW5zdXBwb3J0ZWQgdW5hbGlnbmVkIGxvYWQvc3RvcmUgdHJhcCBmb3Iga2VybmVsICIKQEAgLTMwMiwxMCArMzIxLDEwIEBACiAJCXVuYWxpZ25lZF9wYW5pYygiS2VybmVsIGRvZXMgZnB1L2F0b21pYyAiCiAJCQkJInVuYWxpZ25lZCBsb2FkL3N0b3JlLiIsIHJlZ3MpOwogCi0JCWtlcm5lbF9tbmFfdHJhcF9mYXVsdCgpOworCQlrZXJuZWxfbW5hX3RyYXBfZmF1bHQoMCk7CiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZyBhZGRyLCAqcmVnX2FkZHI7Ci0JCWludCBvcmlnX2FzaSwgYXNpLCBlcnI7CisJCWludCBlcnI7CiAKIAkJYWRkciA9IGNvbXB1dGVfZWZmZWN0aXZlX2FkZHJlc3MocmVncywgaW5zbiwKIAkJCQkJCSAoKGluc24gPj4gMjUpICYgMHgxZikpOwpAQCAtMzE1LDcgKzMzNCw2IEBACiAJCSAgICAgICByZWdzLT50cGMsIGRpcnN0cmluZ3NbZGlyXSwgYWRkciwgc2l6ZSwKIAkJICAgICAgIHJlZ3MtPnVfcmVnc1tVUkVHX1JFVFBDXSk7CiAjZW5kaWYKLQkJb3JpZ19hc2kgPSBhc2kgPSBkZWNvZGVfYXNpKGluc24sIHJlZ3MpOwogCQlzd2l0Y2ggKGFzaSkgewogCQljYXNlIEFTSV9OTDoKIAkJY2FzZSBBU0lfQUlVUEw6CkBAIC0zNjUsNyArMzgzLDcgQEAKIAkJCS8qIE5vdCByZWFjaGVkLi4uICovCiAJCX0KIAkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlrZXJuZWxfbW5hX3RyYXBfZmF1bHQoKTsKKwkJCWtlcm5lbF9tbmFfdHJhcF9mYXVsdCgxKTsKIAkJZWxzZQogCQkJYWR2YW5jZShyZWdzKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Zpc2VtdWwuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlzZW11bC5jCmluZGV4IDg0ZmVkYWEuLmMzZmQ2NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlzZW11bC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlzZW11bC5jCkBAIC0xMjgsOSArMTI4LDYgQEAKIC8qIDAwMTAwMTEwMCAtIFBlcm11dGUgYnl0ZXMgYXMgc3BlY2lmaWVkIGJ5IEdTUi5NQVNLICAqLwogI2RlZmluZSBCU0hVRkZMRV9PUEYJMHgwNGMKIAotI2RlZmluZSBWSVNfT1BDT0RFX01BU0sJKCgweDMgPDwgMzApIHwgKDB4M2YgPDwgMTkpKQotI2RlZmluZSBWSVNfT1BDT0RFX1ZBTAkoKDB4MiA8PCAzMCkgfCAoMHgzNiA8PCAxOSkpCi0KICNkZWZpbmUgVklTX09QRl9TSElGVAk1CiAjZGVmaW5lIFZJU19PUEZfTUFTSwkoMHgxZmYgPDwgVklTX09QRl9TSElGVCkKIApAQCAtODEwLDkgKzgwNyw2IEBACiAJaWYgKGdldF91c2VyKGluc24sICh1MzIgX191c2VyICopIHBjKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoKGluc24gJiBWSVNfT1BDT0RFX01BU0spICE9IFZJU19PUENPREVfVkFMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCW9wZiA9IChpbnNuICYgVklTX09QRl9NQVNLKSA+PiBWSVNfT1BGX1NISUZUOwogCXN3aXRjaCAob3BmKSB7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBiMDk3Mzc5Li40YTYwNjNmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xMyw2ICsxMyw3IEBACiAgIC4gPSAweDQwMDA7CiAgIC50ZXh0IDB4MDAwMDAwMDAwMDQwNDAwMCA6CiAgIHsKKyAgICBfdGV4dCA9IC47CiAgICAgKigudGV4dCkKICAgICBTQ0hFRF9URVhUCiAgICAgTE9DS19URVhUCkBAIC01NywxMyArNTgsNyBAQAogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwogICAuaW5pdGNhbGwuaW5pdCA6IHsKLQkqKC5pbml0Y2FsbDEuaW5pdCkgCi0JKiguaW5pdGNhbGwyLmluaXQpIAotCSooLmluaXRjYWxsMy5pbml0KSAKLQkqKC5pbml0Y2FsbDQuaW5pdCkgCi0JKiguaW5pdGNhbGw1LmluaXQpIAotCSooLmluaXRjYWxsNi5pbml0KSAKLQkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9zcGFyYzY0L21tL2h1Z2V0bGJwYWdlLmMKaW5kZXggNTNiOWIxZi4uMzNmZDBiMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2h1Z2V0bGJwYWdlLmMKQEAgLTIzNSw2ICsyMzUsMTEgQEAKIAlyZXR1cm4gcHRlOwogfQogCitpbnQgaHVnZV9wbWRfdW5zaGFyZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyAqYWRkciwgcHRlX3QgKnB0ZXApCit7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQgc2V0X2h1Z2VfcHRlX2F0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCSAgICAgcHRlX3QgKnB0ZXAsIHB0ZV90IGVudHJ5KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L21tL2luaXQuYyBiL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKaW5kZXggMDljYjdmYy4uYThlODgwMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL2luaXQuYworKysgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCkBAIC0xNzYsOSArMTc2LDkgQEAKIAogaW50IGJpZ2tlcm5lbCA9IDA7CiAKLWttZW1fY2FjaGVfdCAqcGd0YWJsZV9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RydWN0IGttZW1fY2FjaGUgKnBndGFibGVfY2FjaGUgX19yZWFkX21vc3RseTsKIAotc3RhdGljIHZvaWQgemVyb19jdG9yKHZvaWQgKmFkZHIsIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCB6ZXJvX2N0b3Iodm9pZCAqYWRkciwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWNsZWFyX3BhZ2UoYWRkcik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vdHNiLmMgYi9hcmNoL3NwYXJjNjQvbW0vdHNiLmMKaW5kZXggYmVhYTAyOC4uMjM2ZDAyZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL3RzYi5jCisrKyBiL2FyY2gvc3BhcmM2NC9tbS90c2IuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJfQogfQogCi1zdGF0aWMga21lbV9jYWNoZV90ICp0c2JfY2FjaGVzWzhdIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnRzYl9jYWNoZXNbOF0gX19yZWFkX21vc3RseTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnRzYl9jYWNoZV9uYW1lc1s4XSA9IHsKIAkidHNiXzhLQiIsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vdWx0cmEuUyBiL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCmluZGV4IGQ3MGI2MGEuLjczN2MyNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCisrKyBiL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TCkBAIC00NzcsNiArNDc3LDEwIEBACiAJc2V0aGkJCSVoaSgxMDlmKSwgJWc3CiAJYixwdAkJJXhjYywgZXRyYXBfaXJxCiAxMDk6CSBvcgkJJWc3LCAlbG8oMTA5YiksICVnNworI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUworCWNhbGwJCXRyYWNlX2hhcmRpcnFzX29mZgorCSBub3AKKyNlbmRpZgogCWNhbGwJCXNtcF9zeW5jaHJvbml6ZV90aWNrX2NsaWVudAogCSBub3AKIAljbHIJCSVsNgpAQCAtNTA4LDYgKzUxMiwxMCBAQAogCXNldGhpCQklaGkoMTA5ZiksICVnNwogCWIscHQJCSV4Y2MsIGV0cmFwX2lycQogMTA5Ogkgb3IJCSVnNywgJWxvKDEwOWIpLCAlZzcKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKKwljYWxsCQl0cmFjZV9oYXJkaXJxc19vZmYKKwkgbm9wCisjZW5kaWYKIAljYWxsCQlfX3Nob3dfcmVncwogCSBhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAJY2xyCQklbDYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2ZzLmMgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9mcy5jCmluZGV4IDEyYTk0MGMuLjYxYmU1OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2ZzLmMKKysrIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZnMuYwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJZXJyb3IgPSAtRUJBREY7CiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmIChmaWxlKSB7Ci0JCWVycm9yID0gcmVwb3J0X3N0YXR2ZnMoZmlsZS0+Zl92ZnNtbnQsIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBidWYpOworCQllcnJvciA9IHJlcG9ydF9zdGF0dmZzKGZpbGUtPmZfcGF0aC5tbnQsIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGJ1Zik7CiAJCWZwdXQoZmlsZSk7CiAJfQogCkBAIC00ODEsNyArNDgxLDcgQEAKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKGZpbGUpIHsKIAkJbG9ja19rZXJuZWwoKTsKLQkJZXJyb3IgPSByZXBvcnRfc3RhdHZmczY0KGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgYnVmKTsKKwkJZXJyb3IgPSByZXBvcnRfc3RhdHZmczY0KGZpbGUtPmZfcGF0aC5tbnQsIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGJ1Zik7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJZnB1dChmaWxlKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9pb2N0bC5jIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvaW9jdGwuYwppbmRleCBiZTBhMDU0Li4zMzA3NDNjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9pb2N0bC5jCisrKyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2lvY3RsLmMKQEAgLTI5OSw4ICsyOTksOCBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAlmZHQgPSBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKTsKIAlpZiAoISBmZHQtPmZkW2ZkXSB8fAotCSAgICAhIGZkdC0+ZmRbZmRdLT5mX2RlbnRyeSB8fAotCSAgICAhIChpbm8gPSBmZHQtPmZkW2ZkXS0+Zl9kZW50cnktPmRfaW5vZGUpIHx8CisJICAgICEgZmR0LT5mZFtmZF0tPmZfcGF0aC5kZW50cnkgfHwKKwkgICAgISAoaW5vID0gZmR0LT5mZFtmZF0tPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpIHx8CiAJICAgICEgU19JU1NPQ0soaW5vLT5pX21vZGUpKSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gVEJBREY7CkBAIC00ODAsNyArNDgwLDcgQEAKICAgICAgICAgc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICpzb2NrOwogICAgICAgICBzdHJ1Y3QgbW9kdWxlX2luZm8gKm1pOwogCi0gICAgICAgIGlubyA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworICAgICAgICBpbm8gPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogICAgICAgICBpZiAoIVNfSVNTT0NLKGluby0+aV9tb2RlKSkKIAkJcmV0dXJuIC1FQkFERjsKICAgICAgICAgc29jayA9IGZpbHAtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL21pc2MuYyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL21pc2MuYwppbmRleCA5ZWQ5OTc5Li5iY2ExNmU4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9taXNjLmMKKysrIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvbWlzYy5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJCWlmICghZmlsZSkKIAkJCWdvdG8gb3V0OwogCQllbHNlIHsKLQkJCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJCQlpZihpbWFqb3IoaW5vZGUpID09IE1FTV9NQUpPUiAmJgogCQkJICAgaW1pbm9yKGlub2RlKSA9PSA1KSB7CiAJCQkJZmxhZ3MgfD0gTUFQX0FOT05ZTU9VUzsKQEAgLTQyMyw5ICs0MjMsNyBAQAogCQkJICAgU29sYXJpcyBzZXRwZ3JwIGFuZCBzZXRzaWQ/ICovCiAJCQlyZXQgPSBzeXNfc2V0cGdpZCgwLCAwKTsKIAkJCWlmIChyZXQpIHJldHVybiByZXQ7Ci0JCQltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwotCQkJY3VycmVudC0+c2lnbmFsLT50dHkgPSBOVUxMOwotCQkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOworCQkJcHJvY19jbGVhcl90dHkoY3VycmVudCk7CiAJCQlyZXR1cm4gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKIAkJfQogCWNhc2UgMjogLyogZ2V0c2lkICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9zb2Nrc3lzLmMgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9zb2Nrc3lzLmMKaW5kZXggN2M5MGU0MS4uODlhNDc1NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvc29ja3N5cy5jCisrKyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL3NvY2tzeXMuYwpAQCAtOTYsMTMgKzk2LDEzIEBACiAJICogTm8gc2hpdC4gIFdURiBpcyBpdCBzdXBwb3NlZCB0byBkbywgYW55d2F5PwogCSAqCiAJICogVHJ5IGluc3RlYWQ6Ci0JICogZF9kZWxldGUoZmlscC0+Zl9kZW50cnkpLCB0aGVuIGRfaW5zdGFudGlhdGUgd2l0aCBzb2NrIGlub2RlCisJICogZF9kZWxldGUoZmlscC0+Zl9wYXRoLmRlbnRyeSksIHRoZW4gZF9pbnN0YW50aWF0ZSB3aXRoIHNvY2sgaW5vZGUKIAkgKi8KLQlkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKLQlmaWxwLT5mX2RlbnRyeSA9IGRnZXQoZmNoZWNrKGZkKS0+Zl9kZW50cnkpOwotCWZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3JkZXYgPSBpbm9kZS0+aV9yZGV2OwotCWZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2Zsb2NrID0gaW5vZGUtPmlfZmxvY2s7Ci0JU09DS0VUX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT5maWxlID0gZmlscDsKKwlkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OworCWZpbHAtPmZfcGF0aC5kZW50cnkgPSBkZ2V0KGZjaGVjayhmZCktPmZfcGF0aC5kZW50cnkpOworCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfcmRldiA9IGlub2RlLT5pX3JkZXY7CisJZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9mbG9jayA9IGlub2RlLT5pX2Zsb2NrOworCVNPQ0tFVF9JKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5maWxlID0gZmlscDsKIAlmaWxwLT5mX29wID0gJnNvY2tzeXNfZmlsZV9vcHM7CiAgICAgICAgIHNvY2sgPSAoc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0KikgCiAgICAgICAgIAlteWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCksIEdGUF9LRVJORUwpOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJc3RydWN0IGlub2RlICppbm87CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCi0JaW5vPWZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWlubz1maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWlmIChpbm8gJiYgU19JU1NPQ0soaW5vLT5pX21vZGUpKSB7CiAJCXN0cnVjdCBzb2xfc29ja2V0X3N0cnVjdCAqc29jazsKIAkJc29jayA9IChzdHJ1Y3Qgc29sX3NvY2tldF9zdHJ1Y3QqKWZpbHAtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL3RpbW9kLmMgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy90aW1vZC5jCmluZGV4IGI4NGU1NDUuLmE5ZDMyY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL3RpbW9kLmMKKysrIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvdGltb2QuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKIAlTT0xEKCJ3YWtlaW5nIHNvY2tldCIpOwogCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOwotCXNvY2sgPSBTT0NLRVRfSShmZHQtPmZkW2ZkXS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXNvY2sgPSBTT0NLRVRfSShmZHQtPmZkW2ZkXS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzb2NrLT53YWl0KTsKIAlyZWFkX2xvY2soJnNvY2stPnNrLT5za19jYWxsYmFja19sb2NrKTsKIAlpZiAoc29jay0+ZmFzeW5jX2xpc3QgJiYgIXRlc3RfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzb2NrLT5mbGFncykpCkBAIC0zNjEsNyArMzYxLDcgQEAKIAogCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOwogCWZpbHAgPSBmZHQtPmZkW2ZkXTsKLQlpbm8gPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm8gPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNvY2sgPSAoc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICopZmlscC0+cHJpdmF0ZV9kYXRhOwogCVNPTEQoImVudHJ5Iik7CiAJaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKilBKGN0bF9idWYpKSkKQEAgLTY0NCw3ICs2NDQsNyBAQAogCVNPTEREKCgiJXUgJXAgJWQgJXAgJXAgJWQgJXAgJWRcbiIsIGZkLCBjdGxfYnVmLCBjdGxfbWF4bGVuLCBjdGxfbGVuLCBkYXRhX2J1ZiwgZGF0YV9tYXhsZW4sIGRhdGFfbGVuLCAqZmxhZ3NfcCkpOwogCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOwogCWZpbHAgPSBmZHQtPmZkW2ZkXTsKLQlpbm8gPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm8gPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNvY2sgPSAoc3RydWN0IHNvbF9zb2NrZXRfc3RydWN0ICopZmlscC0+cHJpdmF0ZV9kYXRhOwogCVNPTEREKCgiJXAgJXBcbiIsIHNvY2stPnBmaXJzdCwgc29jay0+cGZpcnN0ID8gc29jay0+cGZpcnN0LT5uZXh0IDogTlVMTCkpOwogCWlmICggY3RsX21heGxlbiA+IDAgJiYgIXNvY2stPnBmaXJzdCAmJiBTT0NLRVRfSShpbm8pLT50eXBlID09IFNPQ0tfU1RSRUFNCkBAIC04NjUsNyArODY1LDcgQEAKIAlmaWxwID0gZmR0LT5mZFtmZF07CiAJaWYoIWZpbHApIGdvdG8gb3V0OwogCi0JaW5vID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoIWlubyB8fCAhU19JU1NPQ0soaW5vLT5pX21vZGUpKQogCQlnb3RvIG91dDsKIApAQCAtOTMzLDcgKzkzMyw3IEBACiAJZmlscCA9IGZkdC0+ZmRbZmRdOwogCWlmKCFmaWxwKSBnb3RvIG91dDsKIAotCWlubyA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWlubyA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKCFpbm8pIGdvdG8gb3V0OwogCiAJaWYgKCFTX0lTU09DSyhpbm8tPmlfbW9kZSkgJiYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZyBiL2FyY2gvdW0vS2NvbmZpZwppbmRleCA3OGZiNjE5Li5kMzJhODBlIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcKKysrIGIvYXJjaC91bS9LY29uZmlnCkBAIC0xLDMgKzEsOCBAQAorY29uZmlnIERFRkNPTkZJR19MSVNUCisJc3RyaW5nCisJb3B0aW9uIGRlZmNvbmZpZ19saXN0CisJZGVmYXVsdCAiYXJjaC8kQVJDSC9kZWZjb25maWciCisKICMgVU1MIHVzZXMgdGhlIGdlbmVyaWMgSVJRIHN1Z3N5c3RlbQogY29uZmlnIEdFTkVSSUNfSEFSRElSUVMKIAlib29sCkBAIC00Miw2ICs0NywxMSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEdFTkVSSUNfQlVHCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQlVHCisKICMgVXNlZCBpbiBrZXJuZWwvaXJxL21hbmFnZS5jIGFuZCBpbmNsdWRlL2xpbnV4L2lycS5oCiBjb25maWcgSVJRX1JFTEVBU0VfTUVUSE9ECiAJYm9vbApAQCAtNTIsNiArNjIsNyBAQAogY29uZmlnIE1PREVfVFQKIAlib29sICJUcmFjaW5nIHRocmVhZCBzdXBwb3J0IChERVBSRUNBVEVEKSIKIAlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEJST0tFTgogCWhlbHAKIAlUaGlzIG9wdGlvbiBjb250cm9scyB3aGV0aGVyIHRyYWNpbmcgdGhyZWFkIHN1cHBvcnQgaXMgY29tcGlsZWQKIAlpbnRvIFVNTC4gVGhpcyBvcHRpb24gaXMgbGFyZ2VseSBvYnNvbGV0ZSwgZ2l2ZW4gdGhhdCBza2FzMCBwcm92aWRlcwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLmNoYXIgYi9hcmNoL3VtL0tjb25maWcuY2hhcgppbmRleCA2MmQ4N2I3Li5lMDNlNDBjIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcuY2hhcgorKysgYi9hcmNoL3VtL0tjb25maWcuY2hhcgpAQCAtMTkwLDYgKzE5MCwxMSBAQAogCXRyaXN0YXRlCiAJZGVmYXVsdCBVTUxfU09VTkQKIAorI0l0IGlzIHNlbGVjdGVkIGVsc2V3aGVyZSwgc28ga2NvbmZpZyB3b3VsZCB3YXJuIHdpdGhvdXQgdGhpcy4KK2NvbmZpZyBIV19SQU5ET00KKwl0cmlzdGF0ZQorCWRlZmF1bHQgbgorCiBjb25maWcgVU1MX1JBTkRPTQogCXRyaXN0YXRlICJIYXJkd2FyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlIGIvYXJjaC91bS9NYWtlZmlsZQppbmRleCBjODAxNmE5Li41ZDVlZDcyIDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlCisrKyBiL2FyY2gvdW0vTWFrZWZpbGUKQEAgLTY0LDkgKzY0LDE0IEBACiAKIEFGTEFHUyArPSAkKEFSQ0hfSU5DTFVERSkKIAotVVNFUl9DRkxBR1MgOj0gJChwYXRzdWJzdCAtSSUsLCQoQ0ZMQUdTKSkKLVVTRVJfQ0ZMQUdTIDo9ICQocGF0c3Vic3QgLURfX0tFUk5FTF9fLCwkKFVTRVJfQ0ZMQUdTKSkgJChBUkNIX0lOQ0xVREUpIFwKLQkkKE1PREVfSU5DTFVERSkgLURfRklMRV9PRkZTRVRfQklUUz02NAorVVNFUl9DRkxBR1MgPSAkKHBhdHN1YnN0ICQoS0VSTkVMX0RFRklORVMpLCwkKHBhdHN1YnN0IC1EX19LRVJORUxfXywsXAorCSQocGF0c3Vic3QgLUklLCwkKENGTEFHUykpKSkgJChBUkNIX0lOQ0xVREUpICQoTU9ERV9JTkNMVURFKSBcCisJLURfRklMRV9PRkZTRVRfQklUUz02NAorCitpbmNsdWRlICQoc3JjdHJlZSkvJChBUkNIX0RJUikvTWFrZWZpbGUtJChTVUJBUkNIKQorCisjVGhpcyB3aWxsIGFkanVzdCAqRkxBR1MgYWNjb3JkaW5nbHkgdG8gdGhlIHBsYXRmb3JtLgoraW5jbHVkZSAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL01ha2VmaWxlLW9zLSQoT1MpCiAKICMgLURlcnJubz1rZXJuZWxfZXJybm8gLSBUaGlzIHR1cm5zIGFsbCBrZXJuZWwgcmVmZXJlbmNlcyB0byBlcnJubyBpbnRvCiAjIGtlcm5lbF9lcnJubyB0byBzZXBhcmF0ZSB0aGVtIGZyb20gdGhlIGxpYmMgZXJybm8uICBUaGlzIGFsbG93cyAtZm5vLWNvbW1vbgpAQCAtNzQsMTUgKzc5LDExIEBACiAjIGVycm5vcy4KICMgVGhlc2UgYXBwbHkgdG8ga2VybmVsc3BhY2Ugb25seS4KIAotQ0ZMQUdTICs9IC1EZXJybm89a2VybmVsX2Vycm5vIC1Ec2lncHJvY21hc2s9a2VybmVsX3NpZ3Byb2NtYXNrIFwKLQktRG1rdGltZT1rZXJuZWxfbWt0aW1lCitLRVJORUxfREVGSU5FUyA9IC1EZXJybm89a2VybmVsX2Vycm5vIC1Ec2lncHJvY21hc2s9a2VybmVsX3NpZ3Byb2NtYXNrIFwKKwktRG1rdGltZT1rZXJuZWxfbWt0aW1lICQoQVJDSF9LRVJORUxfREVGSU5FUykKK0NGTEFHUyArPSAkKEtFUk5FTF9ERUZJTkVTKQogQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby11bml0LWF0LWEtdGltZSwpCiAKLWluY2x1ZGUgJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9NYWtlZmlsZS0kKFNVQkFSQ0gpCi0KLSNUaGlzIHdpbGwgYWRqdXN0ICpGTEFHUyBhY2NvcmRpbmdseSB0byB0aGUgcGxhdGZvcm0uCi1pbmNsdWRlICQoc3JjdHJlZSkvJChBUkNIX0RJUikvTWFrZWZpbGUtb3MtJChPUykKLQogIyBUaGVzZSBhcmUgbmVlZGVkIGZvciBjbGVhbiBhbmQgbXJwcm9wZXIsIHNpbmNlIGluIHRoYXQgY2FzZSAuY29uZmlnIGlzIG5vdAogIyBpbmNsdWRlZDsgdGhlIHZhbHVlcyBoZXJlIGFyZSBtZWFuaW5nbGVzcwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlLWkzODYgYi9hcmNoL3VtL01ha2VmaWxlLWkzODYKaW5kZXggYjY1Y2ExMS4uYzlmMWM1YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZS1pMzg2CisrKyBiL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgpAQCAtMTYsNyArMTYsNiBAQAogaWZlcSAoIiQob3JpZ2luIFNVQkFSQ0gpIiwgImNvbW1hbmQgbGluZSIpCiBpZm5lcSAoIiQoc2hlbGwgdW5hbWUgLW0gfCBzZWQgLWUgcy9pLjg2L2kzODYvKSIsICIkKFNVQkFSQ0gpIikKIENGTEFHUwkJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW0zMikKLVVTRVJfQ0ZMQUdTCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tMzIpCiBBRkxBR1MJCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tMzIpCiBMSU5LLXkJCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tMzIpCiBVTUxfT0JKQ09QWUZMQUdTCSs9IC1GICQoRUxGX0ZPUk1BVCkKQEAgLTI1LDcgKzI0LDcgQEAKIGVuZGlmCiBlbmRpZgogCi1DRkxBR1MgKz0gLVVfXyQoU1VCQVJDSClfXyAtVSQoU1VCQVJDSCkKK0FSQ0hfS0VSTkVMX0RFRklORVMgKz0gLVVfXyQoU1VCQVJDSClfXyAtVSQoU1VCQVJDSCkKIAogIyBGaXJzdCBvZiBhbGwsIHR1bmUgQ0ZMQUdTIGZvciB0aGUgc3BlY2lmaWMgQ1BVLiBUaGlzIGFjdHVhbGx5IHNldHMgY2ZsYWdzLXkuCiBpbmNsdWRlICQoc3JjdHJlZSkvYXJjaC9pMzg2L01ha2VmaWxlLmNwdQpAQCAtMzgsNCArMzcsMyBAQAogY2ZsYWdzLXkgKz0gLWZmcmVlc3RhbmRpbmcKIAogQ0ZMQUdTICs9ICQoY2ZsYWdzLXkpCi1VU0VSX0NGTEFHUyArPSAkKGNmbGFncy15KQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQgYi9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NAppbmRleCBkMjc4NjgyLi42OWVjZWE2IDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NAorKysgYi9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NApAQCAtOCw4ICs4LDggQEAKIAogI1dlICN1bmRlZiBfX3g4Nl82NF9fIGZvciBrZXJuZWxzcGFjZSwgbm90IGZvciB1c2Vyc3BhY2Ugd2hlcmUKICNpdCdzIG5lZWRlZCBmb3IgaGVhZGVycyB0byB3b3JrIQotQ0ZMQUdTICs9IC1VX18kKFNVQkFSQ0gpX18gJChfZXh0cmFfZmxhZ3NfKQotVVNFUl9DRkxBR1MgKz0gJChfZXh0cmFfZmxhZ3NfKQorQVJDSF9LRVJORUxfREVGSU5FUyA9IC1VX18kKFNVQkFSQ0gpX18KK0NGTEFHUyArPSAkKF9leHRyYV9mbGFnc18pCiAKIENIRUNLRkxBR1MgICs9IC1tNjQKIEFGTEFHUyArPSAtbTY0CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKaW5kZXggMzU3NmIzYy4uN2Q0MTkwZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYwpAQCAtNjM4LDcgKzYzOCw3IEBACiAJcmV0dXJuIC0xOwogfQogCi12b2lkIGNoYW5faW50ZXJydXB0KHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnRhc2ssCit2b2lkIGNoYW5faW50ZXJydXB0KHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgZGVsYXllZF93b3JrICp0YXNrLAogCQkgICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlycSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbGUsICpuZXh0OwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCmluZGV4IDJmODgwY2IuLjBjYWQzNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCS8qIFRoZXNlIGFyZSBzeW5jaHJvbml6YXRpb24gY2FsbHMgYmV0d2VlbiB2YXJpb3VzIFVNTCB0aHJlYWRzIG9uIHRoZQogCSAqIGhvc3QgLSBzaW5jZSB0aGV5IGFyZSBub3QgZGlmZmVyZW50IGtlcm5lbCB0aHJlYWRzLCB3ZSBjYW5ub3QgdXNlCiAJICoga2VybmVsIHNlbWFwaG9yZXMuIFdlIGRvbid0IHVzZSBTeXNWIHNlbWFwaG9yZXMgYmVjYXVzZSB0aGV5IGFyZQotCSAqIHBlcnNpc3RhbnQuICovCisJICogcGVyc2lzdGVudC4gKi8KIAljb3VudCA9IG9zX3JlYWRfZmlsZShwaXBlX2ZkLCAmYywgc2l6ZW9mKGMpKTsKIAlpZihjb3VudCAhPSBzaXplb2YoYykpCiAJCXByaW50aygid2luY2hfdGhyZWFkIDogZmFpbGVkIHRvIHJlYWQgc3luY2hyb25pemF0aW9uIGJ5dGUsICIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmggYi9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCmluZGV4IDdhNWI0YWYuLmM2YTMwODQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKKysrIGIvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RhdGljIGlubGluZSB2b2lkICpjb3dfbWFsbG9jKGludCBzaXplKQogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYwppbmRleCA4MjQzODY5Li45YzJlN2E3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYwpAQCAtOTgsNCArOTgsNCBAQAogCXJldHVybiAwOwogfQogCi1fX2luaXRjYWxsKHJlZ2lzdGVyX2RhZW1vbik7CitsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX2RhZW1vbik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jCmluZGV4IDc3OTU0ZWEuLjMxMGFmMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKICNkZWZpbmUgTUFYX1BBQ0tFVCAoRVRIX01BWF9QQUNLRVQgKyBFVEhfSEVBREVSX09USEVSKQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvZmQuYyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCmluZGV4IDEwOGI3ZGEuLjIxOGFhMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9mZC5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9mZC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RydWN0IGZkX2NoYW4gewogCWludCBmZDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9saW5lLmMgYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCmluZGV4IDQyNjYzM2UuLjgzMzAxZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwpAQCAtMzEsOSArMzEsOSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgbGluZV90aW1lcl9jYih2b2lkICphcmcpCitzdGF0aWMgdm9pZCBsaW5lX3RpbWVyX2NiKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbGluZSAqbGluZSA9IGFyZzsKKwlzdHJ1Y3QgbGluZSAqbGluZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbGluZSwgdGFzay53b3JrKTsKIAogCWlmKCFsaW5lLT50aHJvdHRsZWQpCiAJCWNoYW5faW50ZXJydXB0KCZsaW5lLT5jaGFuX2xpc3QsICZsaW5lLT50YXNrLCBsaW5lLT50dHksCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIGxpbmVfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpCit2b2lkIGxpbmVfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICogb2xkKQogewogCS8qIG5vdGhpbmcgKi8KIH0KQEAgLTQ0Myw3ICs0NDMsNyBAQAogCQkgKiBpcyByZWdpc3RlcmVkLgogCQkgKi8KIAkJZW5hYmxlX2NoYW4obGluZSk7Ci0JCUlOSVRfV09SSygmbGluZS0+dGFzaywgbGluZV90aW1lcl9jYiwgbGluZSk7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZsaW5lLT50YXNrLCBsaW5lX3RpbWVyX2NiKTsKIAogCQlpZighbGluZS0+c2lnaW8pewogCQkJY2hhbl9lbmFibGVfd2luY2goJmxpbmUtPmNoYW5fbGlzdCwgdHR5KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY2FzdF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3Rfa2Vybi5jCmluZGV4IGMwOTBmYmQuLjUyY2NiN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY2FzdF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jYXN0X2tlcm4uYwpAQCAtMTI3LDQgKzEyNyw0IEBACiAJcmV0dXJuIDA7CiB9CiAKLV9faW5pdGNhbGwocmVnaXN0ZXJfbWNhc3QpOworbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9tY2FzdCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYwppbmRleCA0ZDJiZDM5Li44MTM4ZjVlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogI2RlZmluZSBNQVhfUEFDS0VUIChFVEhfTUFYX1BBQ0tFVCArIEVUSF9IRUFERVJfT1RIRVIpCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jCmluZGV4IGQwOGJkMDMuLjk2ZjAxODkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYwpAQCAtNTYsNyArNTYsNyBAQAogCiBzdGF0aWMgTElTVF9IRUFEKG1jX3JlcXVlc3RzKTsKIAotc3RhdGljIHZvaWQgbWNfd29ya19wcm9jKHZvaWQgKnVudXNlZCkKK3N0YXRpYyB2b2lkIG1jX3dvcmtfcHJvYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgbWNvbnNvbGVfZW50cnkgKnJlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNzIsMTQgKzcyLDE0IEBACiAJfQogfQogCi1zdGF0aWMgREVDTEFSRV9XT1JLKG1jb25zb2xlX3dvcmssIG1jX3dvcmtfcHJvYywgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9XT1JLKG1jb25zb2xlX3dvcmssIG1jX3dvcmtfcHJvYyk7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtY29uc29sZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCS8qIGxvbmcgdG8gYXZvaWQgc2l6ZSBtaXNtYXRjaCB3YXJuaW5ncyBmcm9tIGdjYyAqLwogCWxvbmcgZmQ7CiAJc3RydWN0IG1jb25zb2xlX2VudHJ5ICpuZXc7Ci0Jc3RydWN0IG1jX3JlcXVlc3QgcmVxOworCXN0YXRpYyBzdHJ1Y3QgbWNfcmVxdWVzdCByZXE7CS8qIHRoYXQncyBPSyAqLwogCiAJZmQgPSAobG9uZykgZGV2X2lkOwogCXdoaWxlIChtY29uc29sZV9nZXRfcmVxdWVzdChmZCwgJnJlcSkpewpAQCAtOTEsNiArOTEsNyBAQAogCQkJCW1jb25zb2xlX3JlcGx5KCZyZXEsICJPdXQgb2YgbWVtb3J5IiwgMSwgMCk7CiAJCQllbHNlIHsKIAkJCQluZXctPnJlcXVlc3QgPSByZXE7CisJCQkJbmV3LT5yZXF1ZXN0LnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKS0+cmVnczsKIAkJCQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmbWNfcmVxdWVzdHMpOwogCQkJfQogCQl9CkBAIC0zMTQsOSArMzE1LDIxIEBACiB7CiAJZGVhY3RpdmF0ZV9mZChyZXEtPm9yaWdpbmF0aW5nX2ZkLCBNQ09OU09MRV9JUlEpOwogCW9zX3NldF9mZF9ibG9jayhyZXEtPm9yaWdpbmF0aW5nX2ZkLCAxKTsKLQltY29uc29sZV9yZXBseShyZXEsICIiLCAwLCAwKTsKLQl3aGlsZShtY29uc29sZV9nZXRfcmVxdWVzdChyZXEtPm9yaWdpbmF0aW5nX2ZkLCByZXEpKXsKLQkJaWYocmVxLT5jbWQtPmhhbmRsZXIgPT0gbWNvbnNvbGVfZ28pIGJyZWFrOworCW1jb25zb2xlX3JlcGx5KHJlcSwgInN0b3BwZWQiLCAwLCAwKTsKKwl3aGlsZSAobWNvbnNvbGVfZ2V0X3JlcXVlc3QocmVxLT5vcmlnaW5hdGluZ19mZCwgcmVxKSkgeworCQlpZiAocmVxLT5jbWQtPmhhbmRsZXIgPT0gbWNvbnNvbGVfZ28pCisJCQlicmVhazsKKwkJaWYgKHJlcS0+Y21kLT5oYW5kbGVyID09IG1jb25zb2xlX3N0b3ApIHsKKwkJCW1jb25zb2xlX3JlcGx5KHJlcSwgIkFscmVhZHkgc3RvcHBlZCIsIDEsIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJlcS0+Y21kLT5oYW5kbGVyID09IG1jb25zb2xlX3N5c3JxKSB7CisJCQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7CisJCQlvbGRfcmVncyA9IHNldF9pcnFfcmVncygoc3RydWN0IHB0X3JlZ3MgKikmcmVxLT5yZWdzKTsKKwkJCW1jb25zb2xlX3N5c3JxKHJlcSk7CisJCQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworCQkJY29udGludWU7CisJCX0KIAkJKCpyZXEtPmNtZC0+aGFuZGxlcikocmVxKTsKIAl9CiAJb3Nfc2V0X2ZkX2Jsb2NrKHJlcS0+b3JpZ2luYXRpbmdfZmQsIDApOwpAQCAtNjczLDkgKzY4Niw3IEBACiBzdGF0aWMgdm9pZCBzeXNycV9wcm9jKHZvaWQgKmFyZykKIHsKIAljaGFyICpvcCA9IGFyZzsKLQlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MoJmN1cnJlbnQtPnRocmVhZC5yZWdzKTsKIAloYW5kbGVfc3lzcnEoKm9wLCBOVUxMKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiB2b2lkIG1jb25zb2xlX3N5c3JxKHN0cnVjdCBtY19yZXF1ZXN0ICpyZXEpCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwppbmRleCAxNzA2OGViLi43NWFlZjZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxzeXMvdW4uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgogI2luY2x1ZGUgIm1jb25zb2xlLmgiCiAjaW5jbHVkZSAidW1pZC5oIgogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21tYXBwZXJfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL21tYXBwZXJfa2Vybi5jCmluZGV4IDlhM2I1ZGEuLmRmMzUxNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tbWFwcGVyX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMKQEAgLTk1LDcgKzk1LDggQEAKIAkucmVsZWFzZQk9IG1tYXBwZXJfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlzY2RldmljZSBtbWFwcGVyX2RldiA9IHsKKy8qIE5vIGxvY2tpbmcgbmVlZGVkIC0gb25seSB1c2VkIChhbmQgbW9kaWZpZWQpIGJ5IGJlbG93IGluaXRjYWxsIGFuZCBleGl0Y2FsbC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtbWFwcGVyX2RldiA9IHsKIAkubWlub3IJCT0gTUlTQ19EWU5BTUlDX01JTk9SLAogCS5uYW1lCQk9ICJtbWFwcGVyIiwKIAkuZm9wcwkJPSAmbW1hcHBlcl9mb3BzCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCmluZGV4IGVjOWViOGIuLmFmZTNkNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCkBAIC03Miw5ICs3MiwxMSBAQAogCXJldHVybiBwa3RfbGVuOwogfQogCi1zdGF0aWMgdm9pZCB1bWxfZGV2X2Nsb3NlKHZvaWQqIGRldikKK3N0YXRpYyB2b2lkIHVtbF9kZXZfY2xvc2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCWRldl9jbG9zZSggKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldik7CisJc3RydWN0IHVtbF9uZXRfcHJpdmF0ZSAqbHAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVtbF9uZXRfcHJpdmF0ZSwgd29yayk7CisJZGV2X2Nsb3NlKGxwLT5kZXYpOwogfQogCiBpcnFyZXR1cm5fdCB1bWxfbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCkBAIC04OSw3ICs5MSw2IEBACiAJc3Bpbl9sb2NrKCZscC0+bG9jayk7CiAJd2hpbGUoKGVyciA9IHVtbF9uZXRfcngoZGV2KSkgPiAwKSA7CiAJaWYoZXJyIDwgMCkgewotCQlERUNMQVJFX1dPUksoY2xvc2Vfd29yaywgdW1sX2Rldl9jbG9zZSwgZGV2KTsKIAkJcHJpbnRrKEtFUk5fRVJSIAogCQkgICAgICAgIkRldmljZSAnJXMnIHJlYWQgcmV0dXJuZWQgJWQsIHNodXR0aW5nIGl0IGRvd25cbiIsIAogCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOwpAQCAtOTcsOCArOTgsMTAgQEAKIAkJICogYWdhaW4gbHAtPmxvY2suCiAJCSAqIEFuZCBkZXZfY2xvc2UoKSBjYW4gYmUgc2FmZWx5IGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUKIAkJICogc2FtZSBkZXZpY2UsIHNpbmNlIGl0IHRlc3RzIGZvciAoZGV2LT5mbGFncyAmIElGRl9VUCkuIFNvCi0JCSAqIHRoZXJlJ3Mgbm8gaGFybSBpbiBkZWxheWluZyB0aGUgZGV2aWNlIHNodXRkb3duLiAqLwotCQlzY2hlZHVsZV93b3JrKCZjbG9zZV93b3JrKTsKKwkJICogdGhlcmUncyBubyBoYXJtIGluIGRlbGF5aW5nIHRoZSBkZXZpY2Ugc2h1dGRvd24uCisJCSAqIEZ1cnRoZXJtb3JlLCB0aGUgd29ya3F1ZXVlIHdpbGwgbm90IHJlLWVucXVldWUgYW4gYWxyZWFkeQorCQkgKiBlbnF1ZXVlZCB3b3JrIGl0ZW0uICovCisJCXNjaGVkdWxlX3dvcmsoJmxwLT53b3JrKTsKIAkJZ290byBvdXQ7CiAJfQogCXJlYWN0aXZhdGVfZmQobHAtPmZkLCBVTV9FVEhfSVJRKTsKQEAgLTMzMywxMyArMzM2LDEyIEBACiAJc2l6ZSA9IHRyYW5zcG9ydC0+cHJpdmF0ZV9zaXplICsgc2l6ZW9mKHN0cnVjdCB1bWxfbmV0X3ByaXZhdGUpICsgCiAJCXNpemVvZigoKHN0cnVjdCB1bWxfbmV0X3ByaXZhdGUgKikgMCktPnVzZXIpOwogCi0JZGV2aWNlID0ga21hbGxvYyhzaXplb2YoKmRldmljZSksIEdGUF9LRVJORUwpOworCWRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCpkZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2aWNlID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJldGhfY29uZmlndXJlIGZhaWxlZCB0byBhbGxvY2F0ZSB1bWxfbmV0XG4iKTsKIAkJcmV0dXJuKDEpOwogCX0KIAotCW1lbXNldChkZXZpY2UsIDAsIHNpemVvZigqZGV2aWNlKSk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+bGlzdCk7CiAJZGV2aWNlLT5pbmRleCA9IG47CiAKQEAgLTM2NSw2ICszNjcsNyBAQAogCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSB0cmFuc3BvcnQgcHJpdmF0ZSBkYXRhLiBJdCdzIHN0aWxsIGNsZWFyLCBidXQgd2UKIAkgKiBtdXN0IG1lbXNldCBpdCB0byAwICpub3cqLiBMZXQncyBoZWxwIHRoZSBkcml2ZXJzLiAqLwogCW1lbXNldChscCwgMCwgc2l6ZSk7CisJSU5JVF9XT1JLKCZscC0+d29yaywgdW1sX2Rldl9jbG9zZSk7CiAKIAkvKiBzeXNmcyByZWdpc3RlciAqLwogCWlmICghZHJpdmVyX3JlZ2lzdGVyZWQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9uZXRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKaW5kZXggZjNhM2Y4YS4uMGZmZDdhYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIGludCB0YXBfb3Blbl9jb21tb24odm9pZCAqZGV2LCBjaGFyICpnYXRlX2FkZHIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvcGNhcF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF9rZXJuLmMKaW5kZXggNmUxZWY4NS4uZTY3MzYyYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9wY2FwX2tlcm4uYwpAQCAtMTA5LDQgKzEwOSw0IEBACiAJcmV0dXJuIDA7CiB9CiAKLV9faW5pdGNhbGwocmVnaXN0ZXJfcGNhcCk7CitsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX3BjYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCmluZGV4IDJlZjY0MWQuLjExOTIxYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgInBjYXBfdXNlci5oIgogI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogI2RlZmluZSBNQVhfUEFDS0VUIChFVEhfTUFYX1BBQ0tFVCArIEVUSF9IRUFERVJfT1RIRVIpCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9wb3J0X2tlcm4uYwppbmRleCBjZTlmMzczLi42ZGZlNjMyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcG9ydF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfa2Vybi5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIERFQ0xBUkVfTVVURVgocG9ydHNfc2VtKTsKIHN0cnVjdCBsaXN0X2hlYWQgcG9ydHMgPSBMSVNUX0hFQURfSU5JVChwb3J0cyk7CiAKLXZvaWQgcG9ydF93b3JrX3Byb2Modm9pZCAqdW51c2VkKQordm9pZCBwb3J0X3dvcmtfcHJvYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgcG9ydF9saXN0ICpwb3J0OwogCXN0cnVjdCBsaXN0X2hlYWQgKmVsZTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotREVDTEFSRV9XT1JLKHBvcnRfd29yaywgcG9ydF93b3JrX3Byb2MsIE5VTEwpOworREVDTEFSRV9XT1JLKHBvcnRfd29yaywgcG9ydF93b3JrX3Byb2MpOwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgcG9ydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYwppbmRleCBmMmU4ZmM0Li5iYzZhZmFmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCiAjaW5jbHVkZSAicG9ydC5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0cnVjdCBwb3J0X2NoYW4gewogCWludCByYXc7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvcHR5LmMgYi9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKaW5kZXggYWJlYzYyMC4uODI5YTVlYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3B0eS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9wdHkuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0cnVjdCBwdHlfY2hhbiB7CiAJdm9pZCAoKmFubm91bmNlKShjaGFyICpkZXZfbmFtZSwgaW50IGRldik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF9rZXJuLmMKaW5kZXggNzg4ZGE1NC4uMjU2MzRiZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX2tlcm4uYwpAQCAtOTUsNCArOTUsNCBAQAogCXJldHVybiAwOwogfQogCi1fX2luaXRjYWxsKHJlZ2lzdGVyX3NsaXApOworbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9zbGlwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwppbmRleCA4NDYwMjg1Li43ZWRkYWNjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAic2xpcC5oIgogI2luY2x1ZGUgInNsaXBfY29tbW9uLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogdm9pZCBzbGlwX3VzZXJfaW5pdCh2b2lkICpkYXRhLCB2b2lkICpkZXYpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX2tlcm4uYwppbmRleCBhZTMyMmUxLi5iM2VkOGZiIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF9rZXJuLmMKQEAgLTExOSw0ICsxMTksNCBAQAogCXJldHVybiAwOwogfQogCi1fX2luaXRjYWxsKHJlZ2lzdGVyX3NsaXJwKTsKK2xhdGVfaW5pdGNhbGwocmVnaXN0ZXJfc2xpcnApOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3R0eS5jIGIvYXJjaC91bS9kcml2ZXJzL3R0eS5jCmluZGV4IDExZGUzYWMuLmQ5NWQ2NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy90dHkuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RydWN0IHR0eV9jaGFuIHsKIAljaGFyICpkZXY7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCmluZGV4IGJjNDU4ZjUuLjQ5YzA0N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCkBAIC0xMDYsMTAgKzEwNiwxNSBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJ1bWwtYmxrZGV2IgogCisvKiBDYW4gYmUgdGFrZW4gaW4gaW50ZXJydXB0IGNvbnRleHQsIGFuZCBpcyBwYXNzZWQgdG8gdGhlIGJsb2NrIGxheWVyIHRvIGxvY2sKKyAqIHRoZSByZXF1ZXN0IHF1ZXVlLiBLZXJuZWwgc2lkZSBjb2RlIGtub3dzIHRoYXQuICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHViZF9pb19sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodWJkX2xvY2spOwogCi1zdGF0aWMgdm9pZCAoKmRvX3ViZCkodm9pZCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHViZF9sb2NrKTsKKworLyogWFhYIC0gdGhpcyBtYWRlIHNlbnNlIGluIDIuNCBkYXlzLCBub3cgaXQncyBvbmx5IHVzZWQgYXMgYSBib29sZWFuLCBhbmQKKyAqIHByb2JhYmx5IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBldmVuIGZvciB0aGF0LiAqLworc3RhdGljIGludCBkb191YmQ7CiAKIHN0YXRpYyBpbnQgdWJkX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCk7CiBzdGF0aWMgaW50IHViZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpOwpAQCAtMTE3LDcgKzEyMiw3IEBACiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludCB1YmRfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKIAotI2RlZmluZSBNQVhfREVWICg4KQorI2RlZmluZSBNQVhfREVWICgxNikKIAogc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyB1YmRfYmxvcHMgPSB7CiAgICAgICAgIC5vd25lcgkJPSBUSElTX01PRFVMRSwKQEAgLTE1MCw4ICsxNTUsOSBAQAogc3RhdGljIHN0cnVjdCBvcGVuZmxhZ3MgZ2xvYmFsX29wZW5mbGFncyA9IE9QRU5fRkxBR1M7CiAKIHN0cnVjdCBjb3cgewotCS8qIFRoaXMgaXMgdGhlIGJhY2tpbmcgZmlsZSwgYWN0dWFsbHkgKi8KKwkvKiBiYWNraW5nIGZpbGUgbmFtZSAqLwogCWNoYXIgKmZpbGU7CisJLyogYmFja2luZyBmaWxlIGZkICovCiAJaW50IGZkOwogCXVuc2lnbmVkIGxvbmcgKmJpdG1hcDsKIAl1bnNpZ25lZCBsb25nIGJpdG1hcF9sZW47CkBAIC0xNjAsMTQgKzE2NiwxNiBAQAogfTsKIAogc3RydWN0IHViZCB7CisJLyogbmFtZSAoYW5kIGZkLCBiZWxvdykgb2YgdGhlIGZpbGUgb3BlbmVkIGZvciB3cml0aW5nLCBlaXRoZXIgdGhlCisJICogYmFja2luZyBvciB0aGUgY293IGZpbGUuICovCiAJY2hhciAqZmlsZTsKIAlpbnQgY291bnQ7CiAJaW50IGZkOwogCV9fdTY0IHNpemU7CiAJc3RydWN0IG9wZW5mbGFncyBib290X29wZW5mbGFnczsKIAlzdHJ1Y3Qgb3BlbmZsYWdzIG9wZW5mbGFnczsKLQlpbnQgc2hhcmVkOwotCWludCBub19jb3c7CisJdW5zaWduZWQgc2hhcmVkOjE7CisJdW5zaWduZWQgbm9fY293OjE7CiAJc3RydWN0IGNvdyBjb3c7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSBwZGV2OwogfTsKQEAgLTE5MiwxOCArMjAwLDcgQEAKICAgICAgICAgLmNvdyA9CQkJREVGQVVMVF9DT1csIFwKIH0KIAotc3RydWN0IHViZCB1YmRfZGV2W01BWF9ERVZdID0geyBbIDAgLi4uIE1BWF9ERVYgLSAxIF0gPSBERUZBVUxUX1VCRCB9OwotCi1zdGF0aWMgaW50IHViZDBfaW5pdCh2b2lkKQotewotCXN0cnVjdCB1YmQgKmRldiA9ICZ1YmRfZGV2WzBdOwotCi0JaWYoZGV2LT5maWxlID09IE5VTEwpCi0JCWRldi0+ZmlsZSA9ICJyb290X2ZzIjsKLQlyZXR1cm4oMCk7Ci19Ci0KLV9faW5pdGNhbGwodWJkMF9pbml0KTsKK3N0cnVjdCB1YmQgdWJkX2RldnNbTUFYX0RFVl0gPSB7IFsgMCAuLi4gTUFYX0RFViAtIDEgXSA9IERFRkFVTFRfVUJEIH07CiAKIC8qIE9ubHkgY2hhbmdlZCBieSBmYWtlX2lkZV9zZXR1cCB3aGljaCBpcyBhIHNldHVwICovCiBzdGF0aWMgaW50IGZha2VfaWRlID0gMDsKQEAgLTI3Nyw3ICsyNzQsNyBAQAogCQkJcmV0dXJuKC0xKTsKIAkJKnB0ciA9IGVuZDsKIAl9Ci0JZWxzZSBpZiAoKCdhJyA8PSAqc3RyKSAmJiAoKnN0ciA8PSAnaCcpKSB7CisJZWxzZSBpZiAoKCdhJyA8PSAqc3RyKSAmJiAoKnN0ciA8PSAneicpKSB7CiAJCW4gPSAqc3RyIC0gJ2EnOwogCQlzdHIrKzsKIAkJKnB0ciA9IHN0cjsKQEAgLTI4NSw5ICsyODIsMTMgQEAKIAlyZXR1cm4obik7CiB9CiAKKy8qIElmICppbmRleF9vdXQgPT0gLTEgYXQgZXhpdCwgdGhlIHBhc3NlZCBvcHRpb24gd2FzIGEgZ2VuZXJhbCBvbmU7CisgKiBvdGhlcndpc2UsIHRoZSBzdHIgcG9pbnRlciBpcyB1c2VkIChhbmQgb3duZWQpIGluc2lkZSB1YmRfZGV2cyBhcnJheSwgc28gaXQKKyAqIHNob3VsZCBub3QgYmUgZnJlZWQgb24gZXhpdC4KKyAqLwogc3RhdGljIGludCB1YmRfc2V0dXBfY29tbW9uKGNoYXIgKnN0ciwgaW50ICppbmRleF9vdXQpCiB7Ci0Jc3RydWN0IHViZCAqZGV2OworCXN0cnVjdCB1YmQgKnViZF9kZXY7CiAJc3RydWN0IG9wZW5mbGFncyBmbGFncyA9IGdsb2JhbF9vcGVuZmxhZ3M7CiAJY2hhciAqYmFja2luZ19maWxlOwogCWludCBuLCBlcnIsIGk7CkBAIC0zMTEsNyArMzEyLDcgQEAKIAkJfQogCiAJCWVyciA9IDE7Ci0gCQlzcGluX2xvY2soJnViZF9sb2NrKTsKKyAJCW11dGV4X2xvY2soJnViZF9sb2NrKTsKICAJCWlmKGZha2VfbWFqb3IgIT0gTUFKT1JfTlIpewogIAkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgYXNzaWduIGEgZmFrZSBtYWpvciB0d2ljZVxuIik7CiAgCQkJZ290byBvdXQxOwpAQCAtMzIzLDcgKzMyNCw3IEBACiAJCSAgICAgICBtYWpvcik7CiAgCQllcnIgPSAwOwogIAlvdXQxOgotIAkJc3Bpbl91bmxvY2soJnViZF9sb2NrKTsKKyAJCW11dGV4X3VubG9jaygmdWJkX2xvY2spOwogCQlyZXR1cm4oZXJyKTsKIAl9CiAKQEAgLTM0MCwxMCArMzQxLDEwIEBACiAJfQogCiAJZXJyID0gMTsKLQlzcGluX2xvY2soJnViZF9sb2NrKTsKKwltdXRleF9sb2NrKCZ1YmRfbG9jayk7CiAKLQlkZXYgPSAmdWJkX2RldltuXTsKLQlpZihkZXYtPmZpbGUgIT0gTlVMTCl7CisJdWJkX2RldiA9ICZ1YmRfZGV2c1tuXTsKKwlpZih1YmRfZGV2LT5maWxlICE9IE5VTEwpewogCQlwcmludGsoS0VSTl9FUlIgInViZF9zZXR1cCA6IGRldmljZSBhbHJlYWR5IGNvbmZpZ3VyZWRcbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNjAsMTAgKzM2MSwxMCBAQAogCQkJZmxhZ3MucyA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSAnZCc6Ci0JCQlkZXYtPm5vX2NvdyA9IDE7CisJCQl1YmRfZGV2LT5ub19jb3cgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2MnOgotCQkJZGV2LT5zaGFyZWQgPSAxOworCQkJdWJkX2Rldi0+c2hhcmVkID0gMTsKIAkJCWJyZWFrOwogCQljYXNlICc9JzoKIAkJCXN0cisrOwpAQCAtMzkwLDcgKzM5MSw3IEBACiAJfQogCiAJaWYoYmFja2luZ19maWxlKXsKLQkJaWYoZGV2LT5ub19jb3cpCisJCWlmKHViZF9kZXYtPm5vX2NvdykKIAkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3Qgc3BlY2lmeSBib3RoICdkJyBhbmQgYSAiCiAJCQkgICAgICAgImNvdyBmaWxlXG4iKTsKIAkJZWxzZSB7CkBAIC0zOTgsMTEgKzM5OSwxMSBAQAogCQkJYmFja2luZ19maWxlKys7CiAJCX0KIAl9Ci0JZGV2LT5maWxlID0gc3RyOwotCWRldi0+Y293LmZpbGUgPSBiYWNraW5nX2ZpbGU7Ci0JZGV2LT5ib290X29wZW5mbGFncyA9IGZsYWdzOworCXViZF9kZXYtPmZpbGUgPSBzdHI7CisJdWJkX2Rldi0+Y293LmZpbGUgPSBiYWNraW5nX2ZpbGU7CisJdWJkX2Rldi0+Ym9vdF9vcGVuZmxhZ3MgPSBmbGFnczsKIG91dDoKLQlzcGluX3VubG9jaygmdWJkX2xvY2spOworCW11dGV4X3VubG9jaygmdWJkX2xvY2spOwogCXJldHVybihlcnIpOwogfQogCkBAIC00NzIsOCArNDczLDkgQEAKIAogLyogQ2hhbmdlZCBieSB1YmRfaGFuZGxlciwgd2hpY2ggaXMgc2VyaWFsaXplZCBiZWNhdXNlIGludGVycnVwdHMgb25seQogICogaGFwcGVuIG9uIENQVSAwLgorICogWFhYOiBjdXJyZW50bHkgdW51c2VkLgogICovCi1pbnQgaW50cl9jb3VudCA9IDA7CitzdGF0aWMgaW50IGludHJfY291bnQgPSAwOwogCiAvKiBjYWxsIHViZF9maW5pc2ggaWYgeW91IG5lZWQgdG8gc2VyaWFsaXplICovCiBzdGF0aWMgdm9pZCBfX3ViZF9maW5pc2goc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yKQpAQCAtNDkzLDYgKzQ5NSw4IEBACiAJZW5kX3JlcXVlc3QocmVxLCAxKTsKIH0KIAorLyogQ2FsbGFibGUgb25seSBmcm9tIGludGVycnVwdCBjb250ZXh0IC0gb3RoZXJ3aXNlIHlvdSBuZWVkIHRvIGRvCisgKiBzcGluX2xvY2tfaXJxKCkvc3Bpbl9sb2NrX2lycXNhdmUoKSAqLwogc3RhdGljIGlubGluZSB2b2lkIHViZF9maW5pc2goc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yKQogewogIAlzcGluX2xvY2soJnViZF9pb19sb2NrKTsKQEAgLTUwMCwxNCArNTA0LDE1IEBACiAJc3Bpbl91bmxvY2soJnViZF9pb19sb2NrKTsKIH0KIAotLyogQ2FsbGVkIHdpdGhvdXQgdWJkX2lvX2xvY2sgaGVsZCAqLworLyogWFhYIC0gbW92ZSB0aGlzIGluc2lkZSB1YmRfaW50ci4gKi8KKy8qIENhbGxlZCB3aXRob3V0IHViZF9pb19sb2NrIGhlbGQsIGFuZCBvbmx5IGluIGludGVycnVwdCBjb250ZXh0LiAqLwogc3RhdGljIHZvaWQgdWJkX2hhbmRsZXIodm9pZCkKIHsKIAlzdHJ1Y3QgaW9fdGhyZWFkX3JlcSByZXE7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gZWx2X25leHRfcmVxdWVzdCh1YmRfcXVldWUpOwogCWludCBuOwogCi0JZG9fdWJkID0gTlVMTDsKKwlkb191YmQgPSAwOwogCWludHJfY291bnQrKzsKIAluID0gb3NfcmVhZF9maWxlKHRocmVhZF9mZCwgJnJlcSwgc2l6ZW9mKHJlcSkpOwogCWlmKG4gIT0gc2l6ZW9mKHJlcSkpewpAQCAtNTIxLDcgKzUyNiw5IEBACiAKIAl1YmRfZmluaXNoKHJxLCByZXEuZXJyb3IpOwogCXJlYWN0aXZhdGVfZmQodGhyZWFkX2ZkLCBVQkRfSVJRKTsJCisJc3Bpbl9sb2NrKCZ1YmRfaW9fbG9jayk7CiAJZG9fdWJkX3JlcXVlc3QodWJkX3F1ZXVlKTsKKwlzcGluX3VubG9jaygmdWJkX2lvX2xvY2spOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgdWJkX2ludHIoaW50IGlycSwgdm9pZCAqZGV2KQpAQCAtNTQxLDg3ICs1NDgsOTAgQEAKIAogX191bWxfZXhpdGNhbGwoa2lsbF9pb190aHJlYWQpOwogCi1zdGF0aWMgaW50IHViZF9maWxlX3NpemUoc3RydWN0IHViZCAqZGV2LCBfX3U2NCAqc2l6ZV9vdXQpCitzdGF0aWMgaW5saW5lIGludCB1YmRfZmlsZV9zaXplKHN0cnVjdCB1YmQgKnViZF9kZXYsIF9fdTY0ICpzaXplX291dCkKIHsKIAljaGFyICpmaWxlOwogCi0JZmlsZSA9IGRldi0+Y293LmZpbGUgPyBkZXYtPmNvdy5maWxlIDogZGV2LT5maWxlOworCWZpbGUgPSB1YmRfZGV2LT5jb3cuZmlsZSA/IHViZF9kZXYtPmNvdy5maWxlIDogdWJkX2Rldi0+ZmlsZTsKIAlyZXR1cm4ob3NfZmlsZV9zaXplKGZpbGUsIHNpemVfb3V0KSk7CiB9CiAKLXN0YXRpYyB2b2lkIHViZF9jbG9zZShzdHJ1Y3QgdWJkICpkZXYpCitzdGF0aWMgdm9pZCB1YmRfY2xvc2VfZGV2KHN0cnVjdCB1YmQgKnViZF9kZXYpCiB7Ci0Jb3NfY2xvc2VfZmlsZShkZXYtPmZkKTsKLQlpZihkZXYtPmNvdy5maWxlID09IE5VTEwpCisJb3NfY2xvc2VfZmlsZSh1YmRfZGV2LT5mZCk7CisJaWYodWJkX2Rldi0+Y293LmZpbGUgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0Jb3NfY2xvc2VfZmlsZShkZXYtPmNvdy5mZCk7Ci0JdmZyZWUoZGV2LT5jb3cuYml0bWFwKTsKLQlkZXYtPmNvdy5iaXRtYXAgPSBOVUxMOworCW9zX2Nsb3NlX2ZpbGUodWJkX2Rldi0+Y293LmZkKTsKKwl2ZnJlZSh1YmRfZGV2LT5jb3cuYml0bWFwKTsKKwl1YmRfZGV2LT5jb3cuYml0bWFwID0gTlVMTDsKIH0KIAotc3RhdGljIGludCB1YmRfb3Blbl9kZXYoc3RydWN0IHViZCAqZGV2KQorc3RhdGljIGludCB1YmRfb3Blbl9kZXYoc3RydWN0IHViZCAqdWJkX2RldikKIHsKIAlzdHJ1Y3Qgb3BlbmZsYWdzIGZsYWdzOwogCWNoYXIgKipiYWNrX3B0cjsKIAlpbnQgZXJyLCBjcmVhdGVfY293LCAqY3JlYXRlX3B0cjsKKwlpbnQgZmQ7CiAKLQlkZXYtPm9wZW5mbGFncyA9IGRldi0+Ym9vdF9vcGVuZmxhZ3M7CisJdWJkX2Rldi0+b3BlbmZsYWdzID0gdWJkX2Rldi0+Ym9vdF9vcGVuZmxhZ3M7CiAJY3JlYXRlX2NvdyA9IDA7Ci0JY3JlYXRlX3B0ciA9IChkZXYtPmNvdy5maWxlICE9IE5VTEwpID8gJmNyZWF0ZV9jb3cgOiBOVUxMOwotCWJhY2tfcHRyID0gZGV2LT5ub19jb3cgPyBOVUxMIDogJmRldi0+Y293LmZpbGU7Ci0JZGV2LT5mZCA9IG9wZW5fdWJkX2ZpbGUoZGV2LT5maWxlLCAmZGV2LT5vcGVuZmxhZ3MsIGRldi0+c2hhcmVkLAotCQkJCWJhY2tfcHRyLCAmZGV2LT5jb3cuYml0bWFwX29mZnNldCwKLQkJCQkmZGV2LT5jb3cuYml0bWFwX2xlbiwgJmRldi0+Y293LmRhdGFfb2Zmc2V0LAorCWNyZWF0ZV9wdHIgPSAodWJkX2Rldi0+Y293LmZpbGUgIT0gTlVMTCkgPyAmY3JlYXRlX2NvdyA6IE5VTEw7CisJYmFja19wdHIgPSB1YmRfZGV2LT5ub19jb3cgPyBOVUxMIDogJnViZF9kZXYtPmNvdy5maWxlOworCisJZmQgPSBvcGVuX3ViZF9maWxlKHViZF9kZXYtPmZpbGUsICZ1YmRfZGV2LT5vcGVuZmxhZ3MsIHViZF9kZXYtPnNoYXJlZCwKKwkJCQliYWNrX3B0ciwgJnViZF9kZXYtPmNvdy5iaXRtYXBfb2Zmc2V0LAorCQkJCSZ1YmRfZGV2LT5jb3cuYml0bWFwX2xlbiwgJnViZF9kZXYtPmNvdy5kYXRhX29mZnNldCwKIAkJCQljcmVhdGVfcHRyKTsKIAotCWlmKChkZXYtPmZkID09IC1FTk9FTlQpICYmIGNyZWF0ZV9jb3cpewotCQlkZXYtPmZkID0gY3JlYXRlX2Nvd19maWxlKGRldi0+ZmlsZSwgZGV2LT5jb3cuZmlsZSwKLQkJCQkJICBkZXYtPm9wZW5mbGFncywgMSA8PCA5LCBQQUdFX1NJWkUsCi0JCQkJCSAgJmRldi0+Y293LmJpdG1hcF9vZmZzZXQsCi0JCQkJCSAgJmRldi0+Y293LmJpdG1hcF9sZW4sCi0JCQkJCSAgJmRldi0+Y293LmRhdGFfb2Zmc2V0KTsKLQkJaWYoZGV2LT5mZCA+PSAwKXsKKwlpZigoZmQgPT0gLUVOT0VOVCkgJiYgY3JlYXRlX2Nvdyl7CisJCWZkID0gY3JlYXRlX2Nvd19maWxlKHViZF9kZXYtPmZpbGUsIHViZF9kZXYtPmNvdy5maWxlLAorCQkJCQkgIHViZF9kZXYtPm9wZW5mbGFncywgMSA8PCA5LCBQQUdFX1NJWkUsCisJCQkJCSAgJnViZF9kZXYtPmNvdy5iaXRtYXBfb2Zmc2V0LAorCQkJCQkgICZ1YmRfZGV2LT5jb3cuYml0bWFwX2xlbiwKKwkJCQkJICAmdWJkX2Rldi0+Y293LmRhdGFfb2Zmc2V0KTsKKwkJaWYoZmQgPj0gMCl7CiAJCQlwcmludGsoS0VSTl9JTkZPICJDcmVhdGluZyBcIiVzXCIgYXMgQ09XIGZpbGUgZm9yICIKLQkJCSAgICAgICAiXCIlc1wiXG4iLCBkZXYtPmZpbGUsIGRldi0+Y293LmZpbGUpOworCQkJICAgICAgICJcIiVzXCJcbiIsIHViZF9kZXYtPmZpbGUsIHViZF9kZXYtPmNvdy5maWxlKTsKIAkJfQogCX0KIAotCWlmKGRldi0+ZmQgPCAwKXsKLQkJcHJpbnRrKCJGYWlsZWQgdG8gb3BlbiAnJXMnLCBlcnJubyA9ICVkXG4iLCBkZXYtPmZpbGUsCi0JCSAgICAgICAtZGV2LT5mZCk7Ci0JCXJldHVybihkZXYtPmZkKTsKKwlpZihmZCA8IDApeworCQlwcmludGsoIkZhaWxlZCB0byBvcGVuICclcycsIGVycm5vID0gJWRcbiIsIHViZF9kZXYtPmZpbGUsCisJCSAgICAgICAtZmQpOworCQlyZXR1cm4gZmQ7CiAJfQorCXViZF9kZXYtPmZkID0gZmQ7CiAKLQlpZihkZXYtPmNvdy5maWxlICE9IE5VTEwpeworCWlmKHViZF9kZXYtPmNvdy5maWxlICE9IE5VTEwpewogCQllcnIgPSAtRU5PTUVNOwotCQlkZXYtPmNvdy5iaXRtYXAgPSAodm9pZCAqKSB2bWFsbG9jKGRldi0+Y293LmJpdG1hcF9sZW4pOwotCQlpZihkZXYtPmNvdy5iaXRtYXAgPT0gTlVMTCl7CisJCXViZF9kZXYtPmNvdy5iaXRtYXAgPSAodm9pZCAqKSB2bWFsbG9jKHViZF9kZXYtPmNvdy5iaXRtYXBfbGVuKTsKKwkJaWYodWJkX2Rldi0+Y293LmJpdG1hcCA9PSBOVUxMKXsKIAkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHZtYWxsb2MgQ09XIGJpdG1hcFxuIik7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJCWZsdXNoX3RsYl9rZXJuZWxfdm0oKTsKIAotCQllcnIgPSByZWFkX2Nvd19iaXRtYXAoZGV2LT5mZCwgZGV2LT5jb3cuYml0bWFwLAotCQkJCSAgICAgIGRldi0+Y293LmJpdG1hcF9vZmZzZXQsCi0JCQkJICAgICAgZGV2LT5jb3cuYml0bWFwX2xlbik7CisJCWVyciA9IHJlYWRfY293X2JpdG1hcCh1YmRfZGV2LT5mZCwgdWJkX2Rldi0+Y293LmJpdG1hcCwKKwkJCQkgICAgICB1YmRfZGV2LT5jb3cuYml0bWFwX29mZnNldCwKKwkJCQkgICAgICB1YmRfZGV2LT5jb3cuYml0bWFwX2xlbik7CiAJCWlmKGVyciA8IDApCiAJCQlnb3RvIGVycm9yOwogCi0JCWZsYWdzID0gZGV2LT5vcGVuZmxhZ3M7CisJCWZsYWdzID0gdWJkX2Rldi0+b3BlbmZsYWdzOwogCQlmbGFncy53ID0gMDsKLQkJZXJyID0gb3Blbl91YmRfZmlsZShkZXYtPmNvdy5maWxlLCAmZmxhZ3MsIGRldi0+c2hhcmVkLCBOVUxMLAorCQllcnIgPSBvcGVuX3ViZF9maWxlKHViZF9kZXYtPmNvdy5maWxlLCAmZmxhZ3MsIHViZF9kZXYtPnNoYXJlZCwgTlVMTCwKIAkJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAJCWlmKGVyciA8IDApIGdvdG8gZXJyb3I7Ci0JCWRldi0+Y293LmZkID0gZXJyOworCQl1YmRfZGV2LT5jb3cuZmQgPSBlcnI7CiAJfQogCXJldHVybigwKTsKICBlcnJvcjoKLQlvc19jbG9zZV9maWxlKGRldi0+ZmQpOworCW9zX2Nsb3NlX2ZpbGUodWJkX2Rldi0+ZmQpOwogCXJldHVybihlcnIpOwogfQogCi1zdGF0aWMgaW50IHViZF9uZXdfZGlzayhpbnQgbWFqb3IsIHU2NCBzaXplLCBpbnQgdW5pdCwKK3N0YXRpYyBpbnQgdWJkX2Rpc2tfcmVnaXN0ZXIoaW50IG1ham9yLCB1NjQgc2l6ZSwgaW50IHVuaXQsCiAJCQlzdHJ1Y3QgZ2VuZGlzayAqKmRpc2tfb3V0KQogCQkJCiB7CkBAIC02NDIsMTMgKzY1MiwxMyBAQAogCiAJLyogc3lzZnMgcmVnaXN0ZXIgKG5vdCBmb3IgaWRlIGZha2UgZGV2aWNlcykgKi8KIAlpZiAobWFqb3IgPT0gTUFKT1JfTlIpIHsKLQkJdWJkX2Rldlt1bml0XS5wZGV2LmlkICAgPSB1bml0OwotCQl1YmRfZGV2W3VuaXRdLnBkZXYubmFtZSA9IERSSVZFUl9OQU1FOwotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnViZF9kZXZbdW5pdF0ucGRldik7Ci0JCWRpc2stPmRyaXZlcmZzX2RldiA9ICZ1YmRfZGV2W3VuaXRdLnBkZXYuZGV2OworCQl1YmRfZGV2c1t1bml0XS5wZGV2LmlkICAgPSB1bml0OworCQl1YmRfZGV2c1t1bml0XS5wZGV2Lm5hbWUgPSBEUklWRVJfTkFNRTsKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ1YmRfZGV2c1t1bml0XS5wZGV2KTsKKwkJZGlzay0+ZHJpdmVyZnNfZGV2ID0gJnViZF9kZXZzW3VuaXRdLnBkZXYuZGV2OwogCX0KIAotCWRpc2stPnByaXZhdGVfZGF0YSA9ICZ1YmRfZGV2W3VuaXRdOworCWRpc2stPnByaXZhdGVfZGF0YSA9ICZ1YmRfZGV2c1t1bml0XTsKIAlkaXNrLT5xdWV1ZSA9IHViZF9xdWV1ZTsKIAlhZGRfZGlzayhkaXNrKTsKIApAQCAtNjYwLDI1ICs2NzAsMjUgQEAKIAogc3RhdGljIGludCB1YmRfYWRkKGludCBuKQogewotCXN0cnVjdCB1YmQgKmRldiA9ICZ1YmRfZGV2W25dOworCXN0cnVjdCB1YmQgKnViZF9kZXYgPSAmdWJkX2RldnNbbl07CiAJaW50IGVycjsKIAogCWVyciA9IC1FTk9ERVY7Ci0JaWYoZGV2LT5maWxlID09IE5VTEwpCisJaWYodWJkX2Rldi0+ZmlsZSA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHViZF9maWxlX3NpemUoZGV2LCAmZGV2LT5zaXplKTsKKwllcnIgPSB1YmRfZmlsZV9zaXplKHViZF9kZXYsICZ1YmRfZGV2LT5zaXplKTsKIAlpZihlcnIgPCAwKQogCQlnb3RvIG91dDsKIAotCWRldi0+c2l6ZSA9IFJPVU5EX0JMT0NLKGRldi0+c2l6ZSk7CisJdWJkX2Rldi0+c2l6ZSA9IFJPVU5EX0JMT0NLKHViZF9kZXYtPnNpemUpOwogCi0JZXJyID0gdWJkX25ld19kaXNrKE1BSk9SX05SLCBkZXYtPnNpemUsIG4sICZ1YmRfZ2VuZGlza1tuXSk7CisJZXJyID0gdWJkX2Rpc2tfcmVnaXN0ZXIoTUFKT1JfTlIsIHViZF9kZXYtPnNpemUsIG4sICZ1YmRfZ2VuZGlza1tuXSk7CiAJaWYoZXJyKQogCQlnb3RvIG91dDsKIAogCWlmKGZha2VfbWFqb3IgIT0gTUFKT1JfTlIpCi0JCXViZF9uZXdfZGlzayhmYWtlX21ham9yLCBkZXYtPnNpemUsIG4sCisJCXViZF9kaXNrX3JlZ2lzdGVyKGZha2VfbWFqb3IsIHViZF9kZXYtPnNpemUsIG4sCiAJCQkgICAgICZmYWtlX2dlbmRpc2tbbl0pOwogCiAJLyogcGVyaGFwcyB0aGlzIHNob3VsZCBhbHNvIGJlIHVuZGVyIHRoZSAiaWYgKGZha2VfbWFqb3IpIiBhYm92ZSAqLwpAQCAtNjkzLDMyICs3MDMsNDEgQEAKIAogc3RhdGljIGludCB1YmRfY29uZmlnKGNoYXIgKnN0cikKIHsKLQlpbnQgbiwgZXJyOworCWludCBuLCByZXQ7CiAKIAlzdHIgPSBrc3RyZHVwKHN0ciwgR0ZQX0tFUk5FTCk7Ci0JaWYoc3RyID09IE5VTEwpeworCWlmIChzdHIgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgInViZF9jb25maWcgZmFpbGVkIHRvIHN0cmR1cCBzdHJpbmdcbiIpOwotCQlyZXR1cm4oMSk7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OwogCX0KLQllcnIgPSB1YmRfc2V0dXBfY29tbW9uKHN0ciwgJm4pOwotCWlmKGVycil7Ci0JCWtmcmVlKHN0cik7Ci0JCXJldHVybigtMSk7CisJcmV0ID0gdWJkX3NldHVwX2NvbW1vbihzdHIsICZuKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC0xOworCQlnb3RvIGVycl9mcmVlOwogCX0KLQlpZihuID09IC0xKSByZXR1cm4oMCk7CisJaWYgKG4gPT0gLTEpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnJfZnJlZTsKKwl9CiAKLSAJc3Bpbl9sb2NrKCZ1YmRfbG9jayk7Ci0JZXJyID0gdWJkX2FkZChuKTsKLQlpZihlcnIpCi0JCXViZF9kZXZbbl0uZmlsZSA9IE5VTEw7Ci0gCXNwaW5fdW5sb2NrKCZ1YmRfbG9jayk7CisgCW11dGV4X2xvY2soJnViZF9sb2NrKTsKKwlyZXQgPSB1YmRfYWRkKG4pOworCWlmIChyZXQpCisJCXViZF9kZXZzW25dLmZpbGUgPSBOVUxMOworIAltdXRleF91bmxvY2soJnViZF9sb2NrKTsKIAotCXJldHVybihlcnIpOworb3V0OgorIAlyZXR1cm4gcmV0OworCitlcnJfZnJlZToKKwlrZnJlZShzdHIpOworCWdvdG8gb3V0OwogfQogCiBzdGF0aWMgaW50IHViZF9nZXRfY29uZmlnKGNoYXIgKm5hbWUsIGNoYXIgKnN0ciwgaW50IHNpemUsIGNoYXIgKiplcnJvcl9vdXQpCiB7Ci0Jc3RydWN0IHViZCAqZGV2OworCXN0cnVjdCB1YmQgKnViZF9kZXY7CiAJaW50IG4sIGxlbiA9IDA7CiAKIAluID0gcGFyc2VfdW5pdCgmbmFtZSk7CkBAIC03MjcsMjQgKzc0NiwyNCBAQAogCQlyZXR1cm4oLTEpOwogCX0KIAotCWRldiA9ICZ1YmRfZGV2W25dOwotCXNwaW5fbG9jaygmdWJkX2xvY2spOworCXViZF9kZXYgPSAmdWJkX2RldnNbbl07CisJbXV0ZXhfbG9jaygmdWJkX2xvY2spOwogCi0JaWYoZGV2LT5maWxlID09IE5VTEwpeworCWlmKHViZF9kZXYtPmZpbGUgPT0gTlVMTCl7CiAJCUNPTkZJR19DSFVOSyhzdHIsIHNpemUsIGxlbiwgIiIsIDEpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlDT05GSUdfQ0hVTksoc3RyLCBzaXplLCBsZW4sIGRldi0+ZmlsZSwgMCk7CisJQ09ORklHX0NIVU5LKHN0ciwgc2l6ZSwgbGVuLCB1YmRfZGV2LT5maWxlLCAwKTsKIAotCWlmKGRldi0+Y293LmZpbGUgIT0gTlVMTCl7CisJaWYodWJkX2Rldi0+Y293LmZpbGUgIT0gTlVMTCl7CiAJCUNPTkZJR19DSFVOSyhzdHIsIHNpemUsIGxlbiwgIiwiLCAwKTsKLQkJQ09ORklHX0NIVU5LKHN0ciwgc2l6ZSwgbGVuLCBkZXYtPmNvdy5maWxlLCAxKTsKKwkJQ09ORklHX0NIVU5LKHN0ciwgc2l6ZSwgbGVuLCB1YmRfZGV2LT5jb3cuZmlsZSwgMSk7CiAJfQogCWVsc2UgQ09ORklHX0NIVU5LKHN0ciwgc2l6ZSwgbGVuLCAiIiwgMSk7CiAKICBvdXQ6Ci0Jc3Bpbl91bmxvY2soJnViZF9sb2NrKTsKKwltdXRleF91bmxvY2soJnViZF9sb2NrKTsKIAlyZXR1cm4obGVuKTsKIH0KIApAQCAtNzYwLDIyICs3NzksMjIgQEAKIAogc3RhdGljIGludCB1YmRfcmVtb3ZlKGludCBuKQogewotCXN0cnVjdCB1YmQgKmRldjsKKwlzdHJ1Y3QgdWJkICp1YmRfZGV2OwogCWludCBlcnIgPSAtRU5PREVWOwogCi0Jc3Bpbl9sb2NrKCZ1YmRfbG9jayk7CisJbXV0ZXhfbG9jaygmdWJkX2xvY2spOwogCiAJaWYodWJkX2dlbmRpc2tbbl0gPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQlkZXYgPSAmdWJkX2RldltuXTsKKwl1YmRfZGV2ID0gJnViZF9kZXZzW25dOwogCi0JaWYoZGV2LT5maWxlID09IE5VTEwpCisJaWYodWJkX2Rldi0+ZmlsZSA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAogCS8qIHlvdSBjYW5ub3QgcmVtb3ZlIGEgb3BlbiBkaXNrICovCiAJZXJyID0gLUVCVVNZOwotCWlmKGRldi0+Y291bnQgPiAwKQorCWlmKHViZF9kZXYtPmNvdW50ID4gMCkKIAkJZ290byBvdXQ7CiAKIAlkZWxfZ2VuZGlzayh1YmRfZ2VuZGlza1tuXSk7CkBAIC03ODgsMTQgKzgwNywxNSBAQAogCQlmYWtlX2dlbmRpc2tbbl0gPSBOVUxMOwogCX0KIAotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnBkZXYpOwotCSpkZXYgPSAoKHN0cnVjdCB1YmQpIERFRkFVTFRfVUJEKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmdWJkX2Rldi0+cGRldik7CisJKnViZF9kZXYgPSAoKHN0cnVjdCB1YmQpIERFRkFVTFRfVUJEKTsKIAllcnIgPSAwOwogb3V0OgotCXNwaW5fdW5sb2NrKCZ1YmRfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ1YmRfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIAorLyogQWxsIHRoZXNlIGFyZSBjYWxsZWQgYnkgbWNvbnNvbGUgaW4gcHJvY2VzcyBjb250ZXh0IGFuZCB3aXRob3V0IHViZC1zcGVjaWZpYyBsb2Nrcy4gKi8KIHN0YXRpYyBzdHJ1Y3QgbWNfZGV2aWNlIHViZF9tYyA9IHsKIAkubmFtZQkJPSAidWJkIiwKIAkuY29uZmlnCQk9IHViZF9jb25maWcsCkBAIC04MDQsNyArODI0LDcgQEAKIAkucmVtb3ZlCQk9IHViZF9yZW1vdmUsCiB9OwogCi1zdGF0aWMgaW50IHViZF9tY19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB1YmRfbWNfaW5pdCh2b2lkKQogewogCW1jb25zb2xlX3JlZ2lzdGVyX2RldigmdWJkX21jKTsKIAlyZXR1cm4gMDsKQEAgLTgxMiwxMyArODMyLDI0IEBACiAKIF9faW5pdGNhbGwodWJkX21jX2luaXQpOwogCitzdGF0aWMgaW50IF9faW5pdCB1YmQwX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgdWJkICp1YmRfZGV2ID0gJnViZF9kZXZzWzBdOworCisJaWYodWJkX2Rldi0+ZmlsZSA9PSBOVUxMKQorCQl1YmRfZGV2LT5maWxlID0gInJvb3RfZnMiOworCXJldHVybigwKTsKK30KKworX19pbml0Y2FsbCh1YmQwX2luaXQpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1YmRfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lICA9IERSSVZFUl9OQU1FLAogCX0sCiB9OwogCi1pbnQgdWJkX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHViZF9pbml0KHZvaWQpCiB7CiAgICAgICAgIGludCBpOwogCkBAIC04NDYsNyArODc3LDcgQEAKIAogbGF0ZV9pbml0Y2FsbCh1YmRfaW5pdCk7CiAKLWludCB1YmRfZHJpdmVyX2luaXQodm9pZCl7CitzdGF0aWMgaW50IF9faW5pdCB1YmRfZHJpdmVyX2luaXQodm9pZCl7CiAJdW5zaWduZWQgbG9uZyBzdGFjazsKIAlpbnQgZXJyOwogCkBAIC04NjcsNyArODk4LDcgQEAKIAkJcmV0dXJuKDApOwogCX0KIAllcnIgPSB1bV9yZXF1ZXN0X2lycShVQkRfSVJRLCB0aHJlYWRfZmQsIElSUV9SRUFELCB1YmRfaW50ciwKLQkJCSAgICAgSVJRRl9ESVNBQkxFRCwgInViZCIsIHViZF9kZXYpOworCQkJICAgICBJUlFGX0RJU0FCTEVELCAidWJkIiwgdWJkX2RldnMpOwogCWlmKGVyciAhPSAwKQogCQlwcmludGsoS0VSTl9FUlIgInVtX3JlcXVlc3RfaXJxIGZhaWxlZCAtIGVycm5vID0gJWRcbiIsIC1lcnIpOwogCXJldHVybiAwOwpAQCAtODc4LDI0ICs5MDksMjQgQEAKIHN0YXRpYyBpbnQgdWJkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOwotCXN0cnVjdCB1YmQgKmRldiA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdWJkICp1YmRfZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOwogCWludCBlcnIgPSAwOwogCi0JaWYoZGV2LT5jb3VudCA9PSAwKXsKLQkJZXJyID0gdWJkX29wZW5fZGV2KGRldik7CisJaWYodWJkX2Rldi0+Y291bnQgPT0gMCl7CisJCWVyciA9IHViZF9vcGVuX2Rldih1YmRfZGV2KTsKIAkJaWYoZXJyKXsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IG9wZW4gXCIlc1wiOiBlcnJubyA9ICVkXG4iLAotCQkJICAgICAgIGRpc2stPmRpc2tfbmFtZSwgZGV2LT5maWxlLCAtZXJyKTsKKwkJCSAgICAgICBkaXNrLT5kaXNrX25hbWUsIHViZF9kZXYtPmZpbGUsIC1lcnIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0JZGV2LT5jb3VudCsrOwotCXNldF9kaXNrX3JvKGRpc2ssICFkZXYtPm9wZW5mbGFncy53KTsKKwl1YmRfZGV2LT5jb3VudCsrOworCXNldF9kaXNrX3JvKGRpc2ssICF1YmRfZGV2LT5vcGVuZmxhZ3Mudyk7CiAKIAkvKiBUaGlzIHNob3VsZCBubyBtb3JlIGJlIG5lZWRlZC4gQW5kIGl0IGRpZG4ndCB3b3JrIGFueXdheSB0byBleGNsdWRlCiAJICogcmVhZC13cml0ZSByZW1vdW50aW5nIG9mIGZpbGVzeXN0ZW1zLiovCi0JLyppZigoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmICFkZXYtPm9wZW5mbGFncy53KXsKLQkgICAgICAgIGlmKC0tZGV2LT5jb3VudCA9PSAwKSB1YmRfY2xvc2UoZGV2KTsKKwkvKmlmKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgIXViZF9kZXYtPm9wZW5mbGFncy53KXsKKwkgICAgICAgIGlmKC0tdWJkX2Rldi0+Y291bnQgPT0gMCkgdWJkX2Nsb3NlX2Rldih1YmRfZGV2KTsKIAkgICAgICAgIGVyciA9IC1FUk9GUzsKIAl9Ki8KICBvdXQ6CkBAIC05MDUsMTAgKzkzNiwxMCBAQAogc3RhdGljIGludCB1YmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQogewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKLQlzdHJ1Y3QgdWJkICpkZXYgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHViZCAqdWJkX2RldiA9IGRpc2stPnByaXZhdGVfZGF0YTsKIAotCWlmKC0tZGV2LT5jb3VudCA9PSAwKQotCQl1YmRfY2xvc2UoZGV2KTsKKwlpZigtLXViZF9kZXYtPmNvdW50ID09IDApCisJCXViZF9jbG9zZV9kZXYodWJkX2Rldik7CiAJcmV0dXJuKDApOwogfQogCkBAIC05NzYsMTIgKzEwMDcsMTIgQEAKIHN0YXRpYyBpbnQgcHJlcGFyZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBpb190aHJlYWRfcmVxICppb19yZXEpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSByZXEtPnJxX2Rpc2s7Ci0Jc3RydWN0IHViZCAqZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1YmQgKnViZF9kZXYgPSBkaXNrLT5wcml2YXRlX2RhdGE7CiAJX191NjQgb2Zmc2V0OwogCWludCBsZW47CiAKIAkvKiBUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlIG5vdyAqLwotCWlmKChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKSAmJiAhZGV2LT5vcGVuZmxhZ3Mudyl7CisJaWYoKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpICYmICF1YmRfZGV2LT5vcGVuZmxhZ3Mudyl7CiAJCXByaW50aygiV3JpdGUgYXR0ZW1wdGVkIG9uIHJlYWRvbmx5IHViZCBkZXZpY2UgJXNcbiIsCiAJCSAgICAgICBkaXNrLT5kaXNrX25hbWUpOwogCQllbmRfcmVxdWVzdChyZXEsIDApOwpAQCAtOTkxLDggKzEwMjIsOCBAQAogCW9mZnNldCA9ICgoX191NjQpIHJlcS0+c2VjdG9yKSA8PCA5OwogCWxlbiA9IHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw8IDk7CiAKLQlpb19yZXEtPmZkc1swXSA9IChkZXYtPmNvdy5maWxlICE9IE5VTEwpID8gZGV2LT5jb3cuZmQgOiBkZXYtPmZkOwotCWlvX3JlcS0+ZmRzWzFdID0gZGV2LT5mZDsKKwlpb19yZXEtPmZkc1swXSA9ICh1YmRfZGV2LT5jb3cuZmlsZSAhPSBOVUxMKSA/IHViZF9kZXYtPmNvdy5mZCA6IHViZF9kZXYtPmZkOworCWlvX3JlcS0+ZmRzWzFdID0gdWJkX2Rldi0+ZmQ7CiAJaW9fcmVxLT5jb3dfb2Zmc2V0ID0gLTE7CiAJaW9fcmVxLT5vZmZzZXQgPSBvZmZzZXQ7CiAJaW9fcmVxLT5sZW5ndGggPSBsZW47CkBAIC0xMDAxLDEzICsxMDMyLDEzIEBACiAKIAlpb19yZXEtPm9wID0gKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgPyBVQkRfUkVBRCA6IFVCRF9XUklURTsKIAlpb19yZXEtPm9mZnNldHNbMF0gPSAwOwotCWlvX3JlcS0+b2Zmc2V0c1sxXSA9IGRldi0+Y293LmRhdGFfb2Zmc2V0OworCWlvX3JlcS0+b2Zmc2V0c1sxXSA9IHViZF9kZXYtPmNvdy5kYXRhX29mZnNldDsKIAlpb19yZXEtPmJ1ZmZlciA9IHJlcS0+YnVmZmVyOwogCWlvX3JlcS0+c2VjdG9yc2l6ZSA9IDEgPDwgOTsKIAotCWlmKGRldi0+Y293LmZpbGUgIT0gTlVMTCkKLQkJY293aWZ5X3JlcShpb19yZXEsIGRldi0+Y293LmJpdG1hcCwgZGV2LT5jb3cuYml0bWFwX29mZnNldCwKLQkJCSAgIGRldi0+Y293LmJpdG1hcF9sZW4pOworCWlmKHViZF9kZXYtPmNvdy5maWxlICE9IE5VTEwpCisJCWNvd2lmeV9yZXEoaW9fcmVxLCB1YmRfZGV2LT5jb3cuYml0bWFwLCB1YmRfZGV2LT5jb3cuYml0bWFwX29mZnNldCwKKwkJCSAgIHViZF9kZXYtPmNvdy5iaXRtYXBfbGVuKTsKIAogCXJldHVybigwKTsKIH0KQEAgLTEwMzMsNyArMTA2NCw3IEBACiAJCQlyZXR1cm47CiAJCWVyciA9IHByZXBhcmVfcmVxdWVzdChyZXEsICZpb19yZXEpOwogCQlpZighZXJyKXsKLQkJCWRvX3ViZCA9IHViZF9oYW5kbGVyOworCQkJZG9fdWJkID0gMTsKIAkJCW4gPSBvc193cml0ZV9maWxlKHRocmVhZF9mZCwgKGNoYXIgKikgJmlvX3JlcSwKIAkJCQkJIHNpemVvZihpb19yZXEpKTsKIAkJCWlmKG4gIT0gc2l6ZW9mKGlvX3JlcSkpCkBAIC0xMDQ1LDE4ICsxMDc2LDE4IEBACiAKIHN0YXRpYyBpbnQgdWJkX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKIHsKLQlzdHJ1Y3QgdWJkICpkZXYgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHViZCAqdWJkX2RldiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAogCWdlby0+aGVhZHMgPSAxMjg7CiAJZ2VvLT5zZWN0b3JzID0gMzI7Ci0JZ2VvLT5jeWxpbmRlcnMgPSBkZXYtPnNpemUgLyAoMTI4ICogMzIgKiA1MTIpOworCWdlby0+Y3lsaW5kZXJzID0gdWJkX2Rldi0+c2l6ZSAvICgxMjggKiAzMiAqIDUxMik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdWJkX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IHViZCAqZGV2ID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1YmQgKnViZF9kZXYgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGhkX2RyaXZlaWQgdWJkX2lkID0gewogCQkuY3lscwkJPSAwLAogCQkuaGVhZHMJCT0gMTI4LApAQCAtMTA2Niw3ICsxMDk3LDcgQEAKIAlzd2l0Y2ggKGNtZCkgewogCQlzdHJ1Y3QgY2Ryb21fdm9sY3RybCB2b2x1bWU7CiAJY2FzZSBIRElPX0dFVF9JREVOVElUWToKLQkJdWJkX2lkLmN5bHMgPSBkZXYtPnNpemUgLyAoMTI4ICogMzIgKiA1MTIpOworCQl1YmRfaWQuY3lscyA9IHViZF9kZXYtPnNpemUgLyAoMTI4ICogMzIgKiA1MTIpOwogCQlpZihjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopIGFyZywgKGNoYXIgKikgJnViZF9pZCwKIAkJCQkgc2l6ZW9mKHViZF9pZCkpKQogCQkJcmV0dXJuKC1FRkFVTFQpOwpAQCAtMTM1Myw4ICsxMzg0LDggQEAKICAqLwogaW50IGtlcm5lbF9mZCA9IC0xOwogCi0vKiBPbmx5IGNoYW5nZWQgYnkgdGhlIGlvIHRocmVhZCAqLwotaW50IGlvX2NvdW50ID0gMDsKKy8qIE9ubHkgY2hhbmdlZCBieSB0aGUgaW8gdGhyZWFkLiBYWFg6IGN1cnJlbnRseSB1bnVzZWQuICovCitzdGF0aWMgaW50IGlvX2NvdW50ID0gMDsKIAogaW50IGlvX3RocmVhZCh2b2lkICphcmcpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMveHRlcm0uYyBiL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCmluZGV4IDM4NmY4YjkuLjg1MDIyMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy94dGVybS5jCkBAIC0xMzYsOCArMTM2LDYgQEAKIAkJcmV0dXJuKHBpZCk7CiAJfQogCi0JaWYoZGF0YS0+c3RhY2sgPT0gMCkgZnJlZV9zdGFjayhzdGFjaywgMCk7Ci0KIAlpZiAoZGF0YS0+ZGlyZWN0X3JjdikgewogCQluZXcgPSBvc19yY3ZfZmQoZmQsICZkYXRhLT5oZWxwZXJfcGlkKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oIGIvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oCmluZGV4IDU3MmQyODYuLjkwMDNhMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAl2b2lkICpkYXRhOwogfTsKIAotZXh0ZXJuIHZvaWQgY2hhbl9pbnRlcnJ1cHQoc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIHN0cnVjdCB3b3JrX3N0cnVjdCAqdGFzaywKK2V4dGVybiB2b2lkIGNoYW5faW50ZXJydXB0KHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgZGVsYXllZF93b3JrICp0YXNrLAogCQkJICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlycSk7CiBleHRlcm4gaW50IHBhcnNlX2NoYW5fcGFpcihjaGFyICpzdHIsIHN0cnVjdCBsaW5lICpsaW5lLCBpbnQgZGV2aWNlLAogCQkJICAgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cyk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUva2Vybl91dGlsLmggYi9hcmNoL3VtL2luY2x1ZGUva2Vybl91dGlsLmgKaW5kZXggNTljZmE5ZS4uY2VjOWZjYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2tlcm5fdXRpbC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9rZXJuX3V0aWwuaApAQCAtNiw3ICs2LDYgQEAKICNpZm5kZWYgX19LRVJOX1VUSUxfSF9fCiAjZGVmaW5lIF9fS0VSTl9VVElMX0hfXwogCi0jaW5jbHVkZSAibGludXgvdGhyZWFkcy5oIgogI2luY2x1ZGUgInN5c2RlcC9wdHJhY2UuaCIKICNpbmNsdWRlICJzeXNkZXAvZmF1bHRpbmZvLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9saW5lLmggYi9hcmNoL3VtL2luY2x1ZGUvbGluZS5oCmluZGV4IDdiZTI0ODEuLjVmMjMyYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9saW5lLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2xpbmUuaApAQCAtNTEsNyArNTEsNyBAQAogCWNoYXIgKnRhaWw7CiAKIAlpbnQgc2lnaW87Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHRhc2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0YXNrOwogCWNvbnN0IHN0cnVjdCBsaW5lX2RyaXZlciAqZHJpdmVyOwogCWludCBoYXZlX2lycTsKIH07CkBAIC03Niw3ICs3Niw3IEBACiBleHRlcm4gaW50IGxpbmVfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAogCQkgICAgICBpbnQgbGVuKTsKIGV4dGVybiB2b2lkIGxpbmVfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCk7Ci1leHRlcm4gdm9pZCBsaW5lX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICogb2xkKTsKK2V4dGVybiB2b2lkIGxpbmVfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICogb2xkKTsKIGV4dGVybiBpbnQgbGluZV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gdm9pZCBsaW5lX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiB2b2lkIGxpbmVfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvbWNvbnNvbGUuaCBiL2FyY2gvdW0vaW5jbHVkZS9tY29uc29sZS5oCmluZGV4IDU4ZjY3ZDMuLjI2NjY4MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9tY29uc29sZS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9tY29uc29sZS5oCkBAIC02MSw2ICs2MSw3IEBACiAKIAlzdHJ1Y3QgbWNvbnNvbGVfcmVxdWVzdCByZXF1ZXN0OwogCXN0cnVjdCBtY29uc29sZV9jb21tYW5kICpjbWQ7CisJdW5pb24gdW1sX3B0X3JlZ3MgcmVnczsKIH07CiAKIGV4dGVybiBjaGFyIG1jb25zb2xlX3NvY2tldF9uYW1lW107CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvbWNvbnNvbGVfa2Vybi5oIGIvYXJjaC91bS9pbmNsdWRlL21jb25zb2xlX2tlcm4uaAppbmRleCBkMGI2OTAxLi4xZWE2ZDkyOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL21jb25zb2xlX2tlcm4uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvbWNvbnNvbGVfa2Vybi5oCkBAIC0xNCw2ICsxNCw3IEBACiAJc3RydWN0IG1jX3JlcXVlc3QgcmVxdWVzdDsKIH07CiAKKy8qIEFsbCB0aGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0LiAqLwogc3RydWN0IG1jX2RldmljZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWNoYXIgKm5hbWU7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvbmV0X2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9uZXRfa2Vybi5oCmluZGV4IDI4MDQ1OWYuLjIxOGY4YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9uZXRfa2Vybi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9uZXRfa2Vybi5oCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiBzdHJ1Y3QgdW1sX25ldCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMjYsNiArMjcsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGw7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJaW50IGZkOwogCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKIAl1bnNpZ25lZCBzaG9ydCAoKnByb3RvY29sKShzdHJ1Y3Qgc2tfYnVmZiAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKaW5kZXggNjUxNmY2ZC4uMTNhODZiZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL29zLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKQEAgLTIzMyw2ICsyMzMsOCBAQAogCQkJCSAgICB2b2lkICgqb3ApKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLAogCQkJCQkgICAgICAgaW50IG4pLCBpbnQgKmZhdWx0ZWRfb3V0KTsKIAorLyogZXhlY3ZwLmMgKi8KK2V4dGVybiBpbnQgZXhlY3ZwX25vYWxsb2MoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmaWxlLCBjaGFyICpjb25zdCBhcmd2W10pOwogLyogaGVscGVyLmMgKi8KIGV4dGVybiBpbnQgcnVuX2hlbHBlcih2b2lkICgqcHJlX2V4ZWMpKHZvaWQgKiksIHZvaWQgKnByZV9kYXRhLCBjaGFyICoqYXJndiwKIAkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9iYXJyaWVyLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvYmFycmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGQ1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvYmFycmllci5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX1NZU0RFUF9JMzg2X0JBUlJJRVJfSAorI2RlZmluZSBfX1NZU0RFUF9JMzg2X0JBUlJJRVJfSAorCisvKiBDb3BpZWQgZnJvbSBpbmNsdWRlL2FzbS1pMzg2IGZvciB1c2UgYnkgdXNlcnNwYWNlLiAgaTM4NiBoYXMgdGhlIG9wdGlvbgorICogb2YgdXNpbmcgbWZlbmNlLCBidXQgSSdtIGp1c3QgdXNpbmcgdGhpcywgd2hpY2ggd29ya3MgZXZlcnl3aGVyZSwgZm9yIG5vdy4KKyAqLworI2RlZmluZSBtYigpIGFzbSB2b2xhdGlsZSgibG9jazsgYWRkbCAkMCwwKCVlc3ApIikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvY2hlY2tzdW0uaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9jaGVja3N1bS5oCmluZGV4IDA1MmJiMDYuLjBjYjQ2NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9jaGVja3N1bS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9jaGVja3N1bS5oCkBAIC0yMCw4ICsyMCw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIAotCQkJICB1bnNpZ25lZCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKglOb3RlOiB3aGVuIHlvdSBnZXQgYSBOVUxMIHBvaW50ZXIgZXhjZXB0aW9uIGhlcmUgdGhpcyBtZWFucyBzb21lb25lCkBAIC0zMiw4ICszMSw4IEBACiAgKi8KIAogc3RhdGljIF9faW5saW5lX18KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCSAgICAgICBpbnQgbGVuLCBpbnQgc3VtKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CkBAIC00OCwzNiArNDcsMjUgQEAKICAqLwogCiBzdGF0aWMgX19pbmxpbmVfXwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLAotCQkJCQkgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCQkgaW50IGxlbiwgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCSBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7Ci0JaWYoY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIGxlbikpeworCWlmIChjb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbGVuKSkgewogCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0JCXJldHVybigtMSk7CisJCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7CiAJfQogCiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKIH0KIAogLyoKLSAqIFRoZXNlIGFyZSB0aGUgb2xkIChhbmQgdW5zYWZlKSB3YXkgb2YgZG9pbmcgY2hlY2tzdW1zLCBhIHdhcm5pbmcgbWVzc2FnZSAKLSAqIHdpbGwgYmUgcHJpbnRlZCBpZiB0aGV5IGFyZSB1c2VkIGFuZCBhbiBleGNlcHRpb24gb2NjdXJzLgotICoKLSAqIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgZ28gYXdheSBhZnRlciBzb21lIHRpbWUuCi0gKi8KLQotI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9mcm9tdXNlciBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIKLQotLyoKICAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKgogICoJQnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkIGZvciBsaW51eCBieQogICoJQXJudCBHdWxicmFuZHNlbi4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bTsKIApAQCAtMTA1LDI5ICs5MywyOSBAQAogCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKQogCTogIjEiIChpcGgpLCAiMiIgKGlobCkKIAk6ICJtZW1vcnkiKTsKLQlyZXR1cm4gc3VtOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkJImFkZGwgJTEsICUwCQk7XG4iCiAJCSJhZGNsICQweGZmZmYsICUwCTtcbiIKIAkJOiAiPXIiIChzdW0pCi0JCTogInIiIChzdW0gPDwgMTYpLCAiMCIgKHN1bSAmIDB4ZmZmZjAwMDApCisJCTogInIiICgoX19mb3JjZSB1MzIpc3VtIDw8IDE2KSwKKwkJICAiMCIgKChfX2ZvcmNlIHUzMilzdW0gJiAweGZmZmYwMDAwKQogCSk7Ci0JcmV0dXJuICh+c3VtKSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKICAgICBfX2FzbV9fKAogCSJhZGRsICUxLCAlMAk7XG4iCkBAIC0xMzUsNyArMTIzLDcgQEAKIAkiYWRjbCAlMywgJTAJO1xuIgogCSJhZGNsICQwLCAlMAk7XG4iCiAJOiAiPXIiIChzdW0pCi0JOiAiZyIgKGRhZGRyKSwgImciKHNhZGRyKSwgImciKChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2KSwgIjAiKHN1bSkpOworCTogImciIChkYWRkciksICJnIihzYWRkciksICJnIigobGVuICsgcHJvdG8pIDw8IDgpLCAiMCIoc3VtKSk7CiAgICAgcmV0dXJuIHN1bTsKIH0KIApAQCAtMTQzLDExICsxMzEsMTAgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgdW5zaWduZWQgaW50IHN1bSkKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTU3LDE3ICsxNDQsMTYgQEAKICAqIGluIGljbXAuYwogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW50IGNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkJICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCQkJICAgICBfX3UzMiBsZW4sCi0JCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCQkiYWRkbCAwKCUxKSwgJTAJCTtcbiIKQEAgLTE5MiwxNCArMTc4LDE0IEBACiAgKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCiAgKi8KICNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGNzdW1fYW5kX2NvcHlfdG9fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0JCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICpkc3QsCi0JCQkJCQkgICAgIGludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cikKK3N0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLAorCQkJCQkJICAgICB2b2lkIF9fdXNlciAqZHN0LAorCQkJCQkJICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSl7Ci0JCWlmKGNvcHlfdG9fdXNlcihkc3QsIHNyYywgbGVuKSl7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkgeworCQlpZiAoY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pKSB7CiAJCQkqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0JCQlyZXR1cm4oLTEpOworCQkJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsKIAkJfQogCiAJCXJldHVybiBjc3VtX3BhcnRpYWwoc3JjLCBsZW4sIHN1bSk7CkBAIC0yMDgsNyArMTk0LDcgQEAKIAlpZiAobGVuKQogCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CiAKLQlyZXR1cm4gLTE7IC8qIGludmFsaWQgY2hlY2tzdW0gKi8KKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L3B0cmFjZS5oIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L3B0cmFjZS5oCmluZGV4IDY2NzBjYzkuLjUyYjM5OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2UuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvcHRyYWNlLmgKQEAgLTc1LDcgKzc1LDcgQEAKICNlbmRpZgogI2lmZGVmIFVNTF9DT05GSUdfTU9ERV9TS0FTCiAJc3RydWN0IHNrYXNfcmVncyB7Ci0JCXVuc2lnbmVkIGxvbmcgcmVnc1tIT1NUX0ZSQU1FX1NJWkVdOworCQl1bnNpZ25lZCBsb25nIHJlZ3NbTUFYX1JFR19OUl07CiAJCXVuc2lnbmVkIGxvbmcgZnBbSE9TVF9GUF9TSVpFXTsKIAkJdW5zaWduZWQgbG9uZyB4ZnBbSE9TVF9YRlBfU0laRV07CiAgICAgICAgICAgICAgICAgc3RydWN0IGZhdWx0aW5mbyBmYXVsdGluZm87CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvc3R1Yi5oIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L3N0dWIuaAppbmRleCBiNDkyYjEyLi40ZmZmYWU3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvc3R1Yi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9zdHViLmgKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSAic3R1Yi1kYXRhLmgiCiAjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9iYXJyaWVyLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9iYXJyaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2MTBiZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2JhcnJpZXIuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX19TWVNERVBfWDg2XzY0X0JBUlJJRVJfSAorI2RlZmluZSBfX1NZU0RFUF9YODZfNjRfQkFSUklFUl9ICisKKy8qIENvcGllZCBmcm9tIGluY2x1ZGUvYXNtLXg4Nl82NCBmb3IgdXNlIGJ5IHVzZXJzcGFjZS4gKi8KKyNkZWZpbmUgbWIoKSAJYXNtIHZvbGF0aWxlKCJtZmVuY2UiOjo6Im1lbW9yeSIpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvY2hlY2tzdW0uaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2NoZWNrc3VtLmgKaW5kZXggZWE5NzAwNS4uYTViZTkwMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvY2hlY2tzdW0uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9jaGVja3N1bS5oCkBAIC05LDggKzksNyBAQAogI2luY2x1ZGUgImxpbnV4L2luNi5oIgogI2luY2x1ZGUgImFzbS91YWNjZXNzLmgiCiAKLWV4dGVybiB1bnNpZ25lZCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZiwgdW5zaWduZWQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKglOb3RlOiB3aGVuIHlvdSBnZXQgYSBOVUxMIHBvaW50ZXIgZXhjZXB0aW9uIGhlcmUgdGhpcyBtZWFucyBzb21lb25lCkBAIC0yMSwyMSArMjAsMjEgQEAKICAqLwogCiBzdGF0aWMgX19pbmxpbmVfXwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJICAgICAgIGludCBsZW4sIGludCBzdW0pCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkgICAgICAgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiAJcmV0dXJuKGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKSk7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtLAorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZXJyX3B0cikKIHsKLSAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIGxlbikpeworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIGxlbikpIHsKICAgICAgICAgICAgICAgICAqZXJyX3B0ciA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CkBAIC00OCwxNSArNDcsMTYgQEAKICAqIHRoZSBsYXN0IHN0ZXAgYmVmb3JlIHB1dHRpbmcgYSBjaGVja3N1bSBpbnRvIGEgcGFja2V0LgogICogTWFrZSBzdXJlIG5vdCB0byBtaXggd2l0aCA2NGJpdCBjaGVja3N1bXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJCSIgIGFkZGwgJTEsJTBcbiIKIAkJIiAgYWRjbCAkMHhmZmZmLCUwIgogCQk6ICI9ciIgKHN1bSkKLQkJOiAiciIgKHN1bSA8PCAxNiksICIwIiAoc3VtICYgMHhmZmZmMDAwMCkKKwkJOiAiciIgKChfX2ZvcmNlIHUzMilzdW0gPDwgMTYpLAorCQkgICIwIiAoKF9fZm9yY2UgdTMyKXN1bSAmIDB4ZmZmZjAwMDApCiAJKTsKLQlyZXR1cm4gKH5zdW0pID4+IDE2OworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KSh+KF9fZm9yY2UgdTMyKXN1bSA+PiAxNik7CiB9CiAKIC8qKgpAQCAtNzAsMjggKzcwLDI3IEBACiAgKiBSZXR1cm5zIHRoZSBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtIHRoZSBpbnB1dCBkYXRhLiBSZXN1bHQgaXMKICAqIDMyYml0IHVuZm9sZGVkLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBzYWRkciwgdW5zaWduZWQgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fd3N1bQorY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCWFzbSgiICBhZGRsICUxLCAlMFxuIgogCSAgICAiICBhZGNsICUyLCAlMFxuIgogCSAgICAiICBhZGNsICUzLCAlMFxuIgogCSAgICAiICBhZGNsICQwLCAlMFxuIgogCQk6ICI9ciIgKHN1bSkKLQkgICAgOiAiZyIgKGRhZGRyKSwgImciIChzYWRkciksICJnIiAoKG50b2hzKGxlbik8PDE2KStwcm90byoyNTYpLCAiMCIgKHN1bSkpOwotICAgIHJldHVybiBzdW07CisJICAgIDogImciIChkYWRkciksICJnIiAoc2FkZHIpLCAiZyIgKChsZW4gKyBwcm90bykgPDwgOCksICIwIiAoc3VtKSk7CisJcmV0dXJuIHN1bTsKIH0KIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xMDEsNyArMTAwLDcgQEAKICAqIGlwaDogaXB2NCBoZWFkZXIKICAqIGlobDogbGVuZ3RoIG9mIGhlYWRlciAvIDQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bTsKIApAQCAtMTI4LDcgKzEyNyw3IEBACiAJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpCiAJOiAiMSIgKGlwaCksICIyIiAoaWhsKQogCTogIm1lbW9yeSIpOwotCXJldHVybihzdW0pOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBhZGQzMl93aXRoX2NhcnJ5KHVuc2lnbmVkIGEsIHVuc2lnbmVkIGIpCkBAIC0xNDAsNiArMTM5LDYgQEAKICAgICAgICAgcmV0dXJuIGE7CiB9CiAKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pOworZXh0ZXJuIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZS5oIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvcHRyYWNlLmgKaW5kZXggNjE3YmI5ZWYuLjY2Y2I0MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZS5oCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkJICogZmlsZSBzaXplLCB3aGlsZSBpMzg2IHVzZXMgRlJBTUVfU0laRS4gIFRoZXJlZm9yZSwgd2UgbmVlZAogCQkgKiB0byB1c2UgVU1fRlJBTUVfU0laRSBoZXJlIGluc3RlYWQgb2YgSE9TVF9GUkFNRV9TSVpFLgogCQkgKi8KLQkJdW5zaWduZWQgbG9uZyByZWdzW1VNX0ZSQU1FX1NJWkVdOworCQl1bnNpZ25lZCBsb25nIHJlZ3NbTUFYX1JFR19OUl07CiAJCXVuc2lnbmVkIGxvbmcgZnBbSE9TVF9GUF9TSVpFXTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmF1bHRpbmZvIGZhdWx0aW5mbzsKIAkJbG9uZyBzeXNjYWxsOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oIGIvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjNhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBQYW9sbyAnQmxhaXNvcmJsYWRlJyBHaWFycnVzc28gPGJsYWlzb3JibGFkZUB5YWhvby5pdD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fVU1fTUFMTE9DX0hfXworI2RlZmluZSBfX1VNX01BTExPQ19IX18KKworZXh0ZXJuIHZvaWQgKnVtX2ttYWxsb2MoaW50IHNpemUpOworZXh0ZXJuIHZvaWQgKnVtX2ttYWxsb2NfYXRvbWljKGludCBzaXplKTsKK2V4dGVybiB2b2lkIGtmcmVlKGNvbnN0IHZvaWQgKnB0cik7CisKK2V4dGVybiB2b2lkICp1bV92bWFsbG9jKGludCBzaXplKTsKK2V4dGVybiB2b2lkICp1bV92bWFsbG9jX2F0b21pYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCB2ZnJlZSh2b2lkICpwdHIpOworCisjZW5kaWYgLyogX19VTV9NQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL3VzZXIuaAppbmRleCAzOWY4Yzg4Li5hY2FkY2UzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91c2VyLmgKQEAgLTExLDE3ICsxMSwxMSBAQAogZXh0ZXJuIGludCBwcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwogZXh0ZXJuIHZvaWQgc2NoZWR1bGUodm9pZCk7Ci1leHRlcm4gdm9pZCAqdW1fa21hbGxvYyhpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCAqdW1fa21hbGxvY19hdG9taWMoaW50IHNpemUpOwotZXh0ZXJuIHZvaWQga2ZyZWUodm9pZCAqcHRyKTsKIGV4dGVybiBpbnQgaW5fYXRvbihjaGFyICpzdHIpOwogZXh0ZXJuIGludCBvcGVuX2dkYl9jaGFuKHZvaWQpOwogLyogVGhlc2UgdXNlIHNpemVfdCwgaG93ZXZlciB1bnNpZ25lZCBsb25nIGlzIGNvcnJlY3Qgb24gYm90aCBpMzg2IGFuZCB4ODZfNjQuICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHN0cmxjYXQoY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHZvaWQgKnVtX3ZtYWxsb2MoaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgKnVtX3ZtYWxsb2NfYXRvbWljKGludCBzaXplKTsKLWV4dGVybiB2b2lkIHZmcmVlKHZvaWQgKnB0cik7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdXNlcl91dGlsLmggYi9hcmNoL3VtL2luY2x1ZGUvdXNlcl91dGlsLmgKaW5kZXggODAyZDc4NC4uMDY2MjVmZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3VzZXJfdXRpbC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91c2VyX3V0aWwuaApAQCAtNTIsNyArNTIsNiBAQAogZXh0ZXJuIHZvaWQgc2V0X2NtZGxpbmUoY2hhciAqY21kKTsKIGV4dGVybiB2b2lkIGlucHV0X2NiKHZvaWQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsIGludCBhcmdfbGVuKTsKIGV4dGVybiBpbnQgZ2V0X3B0eSh2b2lkKTsKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jKGludCBzaXplKTsKIGV4dGVybiBpbnQgc3dpdGNoZXJvbyhpbnQgZmQsIGludCBwcm90LCB2b2lkICpmcm9tLCB2b2lkICp0bywgaW50IHNpemUpOwogZXh0ZXJuIHZvaWQgZG9fZXhlYyhpbnQgb2xkX3BpZCwgaW50IG5ld19waWQpOwogZXh0ZXJuIHZvaWQgdHJhY2VyX3BhbmljKGNoYXIgKm1zZywgLi4uKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCmluZGV4IDY4ZWQyNGQuLmUzNmY5MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKQEAgLTE0LDYgKzE0LDcgQEAKICAgICogaXMgcmVtYXBwZWQuKi8KICAgX19iaW5hcnlfc3RhcnQgPSAuOwogICAuID0gQUxJR04oNDA5Nik7CQkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KKyAgX3RleHQgPSAuOwogICBfc3RleHQgPSAuOwogICBfX2luaXRfYmVnaW4gPSAuOwogICAuaW5pdC50ZXh0IDogewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvZXhlYy5jIGIvYXJjaC91bS9rZXJuZWwvZXhlYy5jCmluZGV4IDA1NjFjNDMuLjhkNTZlYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2V4ZWMuYworKysgYi9hcmNoL3VtL2tlcm5lbC9leGVjLmMKQEAgLTM5LDEyICszOSwxMyBAQAogCQkgICAgY2hhciBfX3VzZXIgKl9fdXNlciAqZW52KQogewogICAgICAgICBsb25nIGVycm9yOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKICNpZmRlZiBDT05GSUdfVFRZX0xPRwogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JdGFza19sb2NrKGN1cnJlbnQpOwkvKiBGSVhNRTogIGlzIHRoaXMgbmVlZGVkID8gKi8KLQlsb2dfZXhlYyhhcmd2LCBjdXJyZW50LT5zaWduYWwtPnR0eSk7Ci0JdGFza191bmxvY2soY3VycmVudCk7CisJdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7CisJaWYgKHR0eSkKKwkJbG9nX2V4ZWMoYXJndiwgdHR5KTsKIAltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAjZW5kaWYKICAgICAgICAgZXJyb3IgPSBkb19leGVjdmUoZmlsZSwgYXJndiwgZW52LCAmY3VycmVudC0+dGhyZWFkLnJlZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaXJxLmMgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwppbmRleCBlZjI1OTU2Li41YzFlNjExIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgImlycV9rZXJuLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJzaWdpby5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogI2luY2x1ZGUgIm1pc2NfY29uc3RhbnRzLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZmU2YzY0YS4uMzQ4YjI3MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgIm1vZGUuaCIKICNpbmNsdWRlICJtb2RlX2tlcm4uaCIKICNpbmNsdWRlICJjaG9vc2UtbW9kZS5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiAvKiBUaGlzIGlzIGEgcGVyLWNwdSBhcnJheS4gIEEgcHJvY2Vzc29yIG9ubHkgbW9kaWZpZXMgaXRzIGVudHJ5IGFuZCBpdCBvbmx5CiAgKiBjYXJlcyBhYm91dCBpdHMgZW50cnksIHNvIGl0J3MgT0sgaWYgYW5vdGhlciBwcm9jZXNzb3IgaXMgbW9kaWZ5aW5nIGl0cwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvdHJhY2VyLmMgYi9hcmNoL3VtL2tlcm5lbC90dC90cmFjZXIuYwppbmRleCA5ODgyMzQyLi5iOTE5NTM1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC90cmFjZXIuYworKysgYi9hcmNoL3VtL2tlcm5lbC90dC90cmFjZXIuYwpAQCAtMTc2LDcgKzE3Niw2IEBACiBpbnQgc2lnbmFsX2luZGV4WzMyXTsKIGludCBuc2lnbmFscyA9IDA7CiBpbnQgZGVidWdfdHJhY2UgPSAwOwotZXh0ZXJuIGludCBpb19uc2lnbmFscywgaW9fY291bnQsIGludHJfY291bnQ7CiAKIGV4dGVybiB2b2lkIHNpZ25hbF91c3IxKGludCBzaWcpOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMgYi9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKaW5kZXggOGVjYTQ3YS4uZjYzMDEyNyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCisrKyBiL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUwpAQCAtMjUsNiArMjUsNyBAQAogICAuID0gQUxJR04oNDA5Nik7CQkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KICNlbmRpZgogCisgIF90ZXh0ID0gLjsKICAgX3N0ZXh0ID0gLjsKICAgX19pbml0X2JlZ2luID0gLjsKICAgLmluaXQudGV4dCA6IHsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUgYi9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCmluZGV4IGI0MTgzOTIuLjJmOGM3OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQpAQCAtMyw4ICszLDggQEAKICMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogIwogCi1vYmoteSA9IGFpby5vIGVsZl9hdXgubyBmaWxlLm8gaGVscGVyLm8gaXJxLm8gbWFpbi5vIG1lbS5vIHByb2Nlc3MubyBzaWdpby5vIFwKLQlzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0cmFwLm8gdHR5Lm8gdWFjY2Vzcy5vIHVtaWQubyB0bHMubyBcCitvYmoteSA9IGFpby5vIGVsZl9hdXgubyBleGVjdnAubyBmaWxlLm8gaGVscGVyLm8gaXJxLm8gbWFpbi5vIG1lbS5vIHByb2Nlc3MubyBcCisJc2lnaW8ubyBzaWduYWwubyBzdGFydF91cC5vIHRpbWUubyB0cmFwLm8gdHR5Lm8gdWFjY2Vzcy5vIHVtaWQubyB0bHMubyBcCiAJdXNlcl9zeW1zLm8gdXRpbC5vIGRyaXZlcnMvIHN5cy0kKFNVQkFSQ0gpLwogCiBvYmotJChDT05GSUdfTU9ERV9TS0FTKSArPSBza2FzLwpAQCAtMTUsOSArMTUsOSBAQAogb2JqLSQoQ09ORklHX1RUWV9MT0cpICs9IHR0eV9sb2cubwogdXNlci1vYmpzLSQoQ09ORklHX1RUWV9MT0cpICs9IHR0eV9sb2cubwogCi1VU0VSX09CSlMgOj0gJCh1c2VyLW9ianMteSkgYWlvLm8gZWxmX2F1eC5vIGZpbGUubyBoZWxwZXIubyBpcnEubyBtYWluLm8gbWVtLm8gXAotCXByb2Nlc3MubyBzaWdpby5vIHNpZ25hbC5vIHN0YXJ0X3VwLm8gdGltZS5vIHRyYXAubyB0dHkubyB0bHMubyBcCi0JdWFjY2Vzcy5vIHVtaWQubyB1dGlsLm8KK1VTRVJfT0JKUyA6PSAkKHVzZXItb2Jqcy15KSBhaW8ubyBlbGZfYXV4Lm8gZXhlY3ZwLm8gZmlsZS5vIGhlbHBlci5vIGlycS5vIFwKKwltYWluLm8gbWVtLm8gcHJvY2Vzcy5vIHNpZ2lvLm8gc2lnbmFsLm8gc3RhcnRfdXAubyB0aW1lLm8gdHJhcC5vIHR0eS5vIFwKKwl0bHMubyB1YWNjZXNzLm8gdW1pZC5vIHV0aWwubwogCiBDRkxBR1NfdXNlcl9zeW1zLm8gKz0gLURTVUJBUkNIXyQoU1VCQVJDSCkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX2tlcm4uYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF9rZXJuLmMKaW5kZXggMTYzODVlMi4uNzA1NDE4MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX2tlcm4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfa2Vybi5jCkBAIC0xMDUsNCArMTA1LDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotX19pbml0Y2FsbChyZWdpc3Rlcl9ldGhlcnRhcCk7CitsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX2V0aGVydGFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCmluZGV4IGY1NTliZGY3Li44NjM5ODFiIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJuZXRfdXNlci5oIgogI2luY2x1ZGUgImV0YXAuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiAjZGVmaW5lIE1BWF9QQUNLRVQgRVRIX01BWF9QQUNLRVQKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF9rZXJuLmMgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX2tlcm4uYwppbmRleCAwZWRiYWM2Li43NjU3MGEyIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX2tlcm4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX2tlcm4uYwpAQCAtOTAsNCArOTAsNCBAQAogCXJldHVybiAwOwogfQogCi1fX2luaXRjYWxsKHJlZ2lzdGVyX3R1bnRhcCk7CitsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX3R1bnRhcCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2V4ZWN2cC5jIGIvYXJjaC91bS9vcy1MaW51eC9leGVjdnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmU1ODNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9vcy1MaW51eC9leGVjdnAuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IFBhb2xvIEdpYXJydXNzbyAtIG1vZGlmaWVkIGZyb20gZ2xpYmMnIGV4ZWN2cC5jLgorICAgT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBmb2xsb3dzOgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsMTk5NS05OSwyMDAyLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2lmbmRlZiBURVNUCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIHVtX2ttYWxsb2MgbWFsbG9jCisjZW5kaWYKKyNpbmNsdWRlICJvcy5oIgorCisvKiBFeGVjdXRlIEZJTEUsIHNlYXJjaGluZyBpbiB0aGUgYFBBVEgnIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGNvbnRhaW5zCisgICBubyBzbGFzaGVzLCB3aXRoIGFyZ3VtZW50cyBBUkdWIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9uJy4gICovCitpbnQgZXhlY3ZwX25vYWxsb2MoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmaWxlLCBjaGFyICpjb25zdCBhcmd2W10pCit7CisJaWYgKCpmaWxlID09ICdcMCcpIHsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKHN0cmNociAoZmlsZSwgJy8nKSAhPSBOVUxMKSB7CisJCS8qIERvbid0IHNlYXJjaCB3aGVuIGl0IGNvbnRhaW5zIGEgc2xhc2guICAqLworCQlleGVjdihmaWxlLCBhcmd2KTsKKwl9IGVsc2UgeworCQlpbnQgZ290X2VhY2NlczsKKwkJc2l6ZV90IGxlbiwgcGF0aGxlbjsKKwkJY2hhciAqbmFtZSwgKnA7CisJCWNoYXIgKnBhdGggPSBnZXRlbnYoIlBBVEgiKTsKKwkJaWYgKHBhdGggPT0gTlVMTCkKKwkJCXBhdGggPSAiOi9iaW46L3Vzci9iaW4iOworCisJCWxlbiA9IHN0cmxlbihmaWxlKSArIDE7CisJCXBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7CisJCS8qIENvcHkgdGhlIGZpbGUgbmFtZSBhdCB0aGUgdG9wLiAgKi8KKwkJbmFtZSA9IG1lbWNweShidWYgKyBwYXRobGVuICsgMSwgZmlsZSwgbGVuKTsKKwkJLyogQW5kIGFkZCB0aGUgc2xhc2guICAqLworCQkqLS1uYW1lID0gJy8nOworCisJCWdvdF9lYWNjZXMgPSAwOworCQlwID0gcGF0aDsKKwkJZG8geworCQkJY2hhciAqc3RhcnRwOworCisJCQlwYXRoID0gcDsKKwkJCS8vTGV0J3MgYXZvaWQgdGhpcyBHTlUgZXh0ZW5zaW9uLgorCQkJLy9wID0gc3RyY2hybnVsIChwYXRoLCAnOicpOworCQkJcCA9IHN0cmNocihwYXRoLCAnOicpOworCQkJaWYgKCFwKQorCQkJCXAgPSBzdHJjaHIocGF0aCwgJ1wwJyk7CisKKwkJCWlmIChwID09IHBhdGgpCisJCQkJLyogVHdvIGFkamFjZW50IGNvbG9ucywgb3IgYSBjb2xvbiBhdCB0aGUgYmVnaW5uaW5nIG9yIHRoZSBlbmQKKwkJCQkgICBvZiBgUEFUSCcgbWVhbnMgdG8gc2VhcmNoIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gICovCisJCQkJc3RhcnRwID0gbmFtZSArIDE7CisJCQllbHNlCisJCQkJc3RhcnRwID0gbWVtY3B5KG5hbWUgLSAocCAtIHBhdGgpLCBwYXRoLCBwIC0gcGF0aCk7CisKKwkJCS8qIFRyeSB0byBleGVjdXRlIHRoaXMgbmFtZS4gIElmIGl0IHdvcmtzLCBleGVjdiB3aWxsIG5vdCByZXR1cm4uICAqLworCQkJZXhlY3Yoc3RhcnRwLCBhcmd2KTsKKworCQkJLyoKKwkJCWlmIChlcnJubyA9PSBFTk9FWEVDKSB7CisJCQl9CisJCQkqLworCisJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJY2FzZSBFQUNDRVM6CisJCQkJCS8qIFJlY29yZCB0aGUgd2UgZ290IGEgYFBlcm1pc3Npb24gZGVuaWVkJyBlcnJvci4gIElmIHdlIGVuZAorCQkJCQkgICB1cCBmaW5kaW5nIG5vIGV4ZWN1dGFibGUgd2UgY2FuIHVzZSwgd2Ugd2FudCB0byBkaWFnbm9zZQorCQkJCQkgICB0aGF0IHdlIGRpZCBmaW5kIG9uZSBidXQgd2VyZSBkZW5pZWQgYWNjZXNzLiAgKi8KKwkJCQkJZ290X2VhY2NlcyA9IDE7CisJCQkJY2FzZSBFTk9FTlQ6CisJCQkJY2FzZSBFU1RBTEU6CisJCQkJY2FzZSBFTk9URElSOgorCQkJCQkvKiBUaG9zZSBlcnJvcnMgaW5kaWNhdGUgdGhlIGZpbGUgaXMgbWlzc2luZyBvciBub3QgZXhlY3V0YWJsZQorCQkJCQkgICBieSB1cywgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGp1c3QgdHJ5IHRoZSBuZXh0IHBhdGgKKwkJCQkJICAgZGlyZWN0b3J5LiAgKi8KKwkJCQljYXNlIEVOT0RFVjoKKwkJCQljYXNlIEVUSU1FRE9VVDoKKwkJCQkJLyogU29tZSBzdHJhbmdlIGZpbGVzeXN0ZW1zIGxpa2UgQUZTIHJldHVybiBldmVuCisJCQkJCSAgIHN0cmFuZ2VyIGVycm9yIG51bWJlcnMuICBUaGV5IGNhbm5vdCByZWFzb25hYmx5IG1lYW4KKwkJCQkJICAgYW55dGhpbmcgZWxzZSBzbyBpZ25vcmUgdGhvc2UsIHRvby4gICovCisJCQkJY2FzZSBFTk9FWEVDOgorCQkJCQkvKiBXZSB3b24ndCBnbyBzZWFyY2hpbmcgZm9yIHRoZSBzaGVsbAorCQkJCQkgKiBpZiBpdCBpcyBub3QgZXhlY3V0YWJsZSAtIHRoZSBMaW51eAorCQkJCQkgKiBrZXJuZWwgYWxyZWFkeSBoYW5kbGVzIHRoaXMgZW5vdWdoLAorCQkJCQkgKiBmb3IgdXMuICovCisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJLyogU29tZSBvdGhlciBlcnJvciBtZWFucyB3ZSBmb3VuZCBhbiBleGVjdXRhYmxlIGZpbGUsIGJ1dAorCQkJCQkgICBzb21ldGhpbmcgd2VudCB3cm9uZyBleGVjdXRpbmcgaXQ7IHJldHVybiB0aGUgZXJyb3IgdG8gb3VyCisJCQkJCSAgIGNhbGxlci4gICovCisJCQkJCXJldHVybiAtZXJybm87CisJCQl9CisJCX0gd2hpbGUgKCpwKysgIT0gJ1wwJyk7CisKKwkJLyogV2UgdHJpZWQgZXZlcnkgZWxlbWVudCBhbmQgbm9uZSBvZiB0aGVtIHdvcmtlZC4gICovCisJCWlmIChnb3RfZWFjY2VzKQorCQkJLyogQXQgbGVhc3Qgb25lIGZhaWx1cmUgd2FzIGR1ZSB0byBwZXJtaXNzaW9ucywgc28gcmVwb3J0IHRoYXQKKwkJCSAgIGVycm9yLiAgKi8KKwkJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIFJldHVybiB0aGUgZXJyb3IgZnJvbSB0aGUgbGFzdCBhdHRlbXB0IChwcm9iYWJseSBFTk9FTlQpLiAgKi8KKwlyZXR1cm4gLWVycm5vOworfQorI2lmZGVmIFRFU1QKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiphcmd2KQoreworCWNoYXIgYnVmW1BBVEhfTUFYXTsKKwlpbnQgcmV0OworCWFyZ2MtLTsKKwlpZiAoIWFyZ2MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIGFyZ3VtZW50c1xuIik7CisJCXJldHVybiAxOworCX0KKwlhcmd2Kys7CisJaWYgKHJldCA9IGV4ZWN2cF9ub2FsbG9jKGJ1ZiwgYXJndlswXSwgYXJndikpIHsKKwkJZXJybm8gPSAtcmV0OworCQlwZXJyb3IoImV4ZWN2cF9ub2FsbG9jIik7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jIGIvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYwppbmRleCBjZDE1YjlkLi5jN2FkNjMwIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKQEAgLTgsMTggKzgsMjEgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIHN0cnVjdCBoZWxwZXJfZGF0YSB7CiAJdm9pZCAoKnByZV9leGVjKSh2b2lkKik7CiAJdm9pZCAqcHJlX2RhdGE7CiAJY2hhciAqKmFyZ3Y7CiAJaW50IGZkOworCWNoYXIgKmJ1ZjsKIH07CiAKIC8qIERlYnVnZ2luZyBhaWQsIGNoYW5nZWQgb25seSBmcm9tIGdkYiAqLwpAQCAtMzUsMjIgKzM4LDIyIEBACiAJY2hhciAqKmFyZ3YgPSBkYXRhLT5hcmd2OwogCWludCBlcnJ2YWw7CiAKLQlpZihoZWxwZXJfcGF1c2UpeworCWlmIChoZWxwZXJfcGF1c2UpewogCQlzaWduYWwoU0lHSFVQLCBoZWxwZXJfaHVwKTsKIAkJcGF1c2UoKTsKIAl9Ci0JaWYoZGF0YS0+cHJlX2V4ZWMgIT0gTlVMTCkKKwlpZiAoZGF0YS0+cHJlX2V4ZWMgIT0gTlVMTCkKIAkJKCpkYXRhLT5wcmVfZXhlYykoZGF0YS0+cHJlX2RhdGEpOwotCWV4ZWN2cChhcmd2WzBdLCBhcmd2KTsKLQllcnJ2YWwgPSAtZXJybm87Ci0JcHJpbnRrKCJoZWxwZXJfY2hpbGQgLSBleGVjdmUgb2YgJyVzJyBmYWlsZWQgLSBlcnJubyA9ICVkXG4iLCBhcmd2WzBdLCBlcnJubyk7CisJZXJydmFsID0gZXhlY3ZwX25vYWxsb2MoZGF0YS0+YnVmLCBhcmd2WzBdLCBhcmd2KTsKKwlwcmludGsoImhlbHBlcl9jaGlsZCAtIGV4ZWN2cCBvZiAnJXMnIGZhaWxlZCAtIGVycm5vID0gJWRcbiIsIGFyZ3ZbMF0sIC1lcnJ2YWwpOwogCW9zX3dyaXRlX2ZpbGUoZGF0YS0+ZmQsICZlcnJ2YWwsIHNpemVvZihlcnJ2YWwpKTsKIAlraWxsKG9zX2dldHBpZCgpLCBTSUdLSUxMKTsKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIFJldHVybnMgZWl0aGVyIHRoZSBwaWQgb2YgdGhlIGNoaWxkIHByb2Nlc3Mgd2UgcnVuIG9yIC1FKiBvbiBmYWlsdXJlLgotICogWFhYIFRoZSBhbGxvY19zdGFjayBoZXJlIGJyZWFrcyBpZiB0aGlzIGlzIGNhbGxlZCBpbiB0aGUgdHJhY2luZyB0aHJlYWQgKi8KKyAqIFhYWCBUaGUgYWxsb2Nfc3RhY2sgaGVyZSBicmVha3MgaWYgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIHRyYWNpbmcgdGhyZWFkLCBzbworICogd2UgbmVlZCB0byByZWNlaXZlIGEgcHJlYWxsb2NhdGVkIHN0YWNrIChhIGxvY2FsIGJ1ZmZlciBpcyBvaykuICovCiBpbnQgcnVuX2hlbHBlcih2b2lkICgqcHJlX2V4ZWMpKHZvaWQgKiksIHZvaWQgKnByZV9kYXRhLCBjaGFyICoqYXJndiwKIAkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQogewpAQCAtNTgsMjAgKzYxLDIxIEBACiAJdW5zaWduZWQgbG9uZyBzdGFjaywgc3A7CiAJaW50IHBpZCwgZmRzWzJdLCByZXQsIG47CiAKLQlpZigoc3RhY2tfb3V0ICE9IE5VTEwpICYmICgqc3RhY2tfb3V0ICE9IDApKQorCWlmICgoc3RhY2tfb3V0ICE9IE5VTEwpICYmICgqc3RhY2tfb3V0ICE9IDApKQogCQlzdGFjayA9ICpzdGFja19vdXQ7Ci0JZWxzZSBzdGFjayA9IGFsbG9jX3N0YWNrKDAsIF9fY2FudF9zbGVlcCgpKTsKLQlpZihzdGFjayA9PSAwKQorCWVsc2UKKwkJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CisJaWYgKHN0YWNrID09IDApCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gb3NfcGlwZShmZHMsIDEsIDApOwotCWlmKHJldCA8IDApeworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygicnVuX2hlbHBlciA6IHBpcGUgZmFpbGVkLCByZXQgPSAlZFxuIiwgLXJldCk7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJcmV0ID0gb3Nfc2V0X2V4ZWNfY2xvc2UoZmRzWzFdLCAxKTsKLQlpZihyZXQgPCAwKXsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoInJ1bl9oZWxwZXIgOiBzZXR0aW5nIEZEX0NMT0VYRUMgZmFpbGVkLCByZXQgPSAlZFxuIiwKIAkJICAgICAgIC1yZXQpOwogCQlnb3RvIG91dF9jbG9zZTsKQEAgLTgyLDExICs4NiwxMyBAQAogCWRhdGEucHJlX2RhdGEgPSBwcmVfZGF0YTsKIAlkYXRhLmFyZ3YgPSBhcmd2OwogCWRhdGEuZmQgPSBmZHNbMV07CisJZGF0YS5idWYgPSBfX2NhbnRfc2xlZXAoKSA/IHVtX2ttYWxsb2NfYXRvbWljKFBBVEhfTUFYKSA6CisJCQkJCXVtX2ttYWxsb2MoUEFUSF9NQVgpOwogCXBpZCA9IGNsb25lKGhlbHBlcl9jaGlsZCwgKHZvaWQgKikgc3AsIENMT05FX1ZNIHwgU0lHQ0hMRCwgJmRhdGEpOwotCWlmKHBpZCA8IDApeworCWlmIChwaWQgPCAwKSB7CiAJCXJldCA9IC1lcnJubzsKIAkJcHJpbnRrKCJydW5faGVscGVyIDogY2xvbmUgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7Ci0JCWdvdG8gb3V0X2Nsb3NlOworCQlnb3RvIG91dF9mcmVlMjsKIAl9CiAKIAljbG9zZShmZHNbMV0pOwpAQCAtOTUsMTAgKzEwMSwxMCBAQAogCS8qIFJlYWQgdGhlIGVycm5vIHZhbHVlIGZyb20gdGhlIGNoaWxkLCBpZiB0aGUgZXhlYyBmYWlsZWQsIG9yIGdldCAwIGlmCiAJICogdGhlIGV4ZWMgc3VjY2VlZGVkIGJlY2F1c2UgdGhlIHBpcGUgZmQgd2FzIHNldCBhcyBjbG9zZS1vbi1leGVjLiAqLwogCW4gPSBvc19yZWFkX2ZpbGUoZmRzWzBdLCAmcmV0LCBzaXplb2YocmV0KSk7Ci0JaWYobiA9PSAwKQorCWlmIChuID09IDApIHsKIAkJcmV0ID0gcGlkOwotCWVsc2UgewotCQlpZihuIDwgMCl7CisJfSBlbHNlIHsKKwkJaWYgKG4gPCAwKSB7CiAJCQlwcmludGsoInJ1bl9oZWxwZXIgOiByZWFkIG9uIHBpcGUgZmFpbGVkLCByZXQgPSAlZFxuIiwKIAkJCSAgICAgICAtbik7CiAJCQlyZXQgPSBuOwpAQCAtMTA3LDE1ICsxMTMsMTYgQEAKIAkJQ0FUQ0hfRUlOVFIod2FpdHBpZChwaWQsIE5VTEwsIDApKTsKIAl9CiAKK291dF9mcmVlMjoKKwlrZnJlZShkYXRhLmJ1Zik7CiBvdXRfY2xvc2U6CiAJaWYgKGZkc1sxXSAhPSAtMSkKIAkJY2xvc2UoZmRzWzFdKTsKIAljbG9zZShmZHNbMF0pOwogb3V0X2ZyZWU6Ci0JaWYoc3RhY2tfb3V0ID09IE5VTEwpCisJaWYgKChzdGFja19vdXQgPT0gTlVMTCkgfHwgKCpzdGFja19vdXQgPT0gMCkpCiAJCWZyZWVfc3RhY2soc3RhY2ssIDApOwotCWVsc2UgKnN0YWNrX291dCA9IHN0YWNrOwotCXJldHVybihyZXQpOworCXJldHVybiByZXQ7CiB9CiAKIGludCBydW5faGVscGVyX3RocmVhZChpbnQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGludCBmbGFncywKQEAgLTEyNSwzMSArMTMyLDMyIEBACiAJaW50IHBpZCwgc3RhdHVzLCBlcnI7CiAKIAlzdGFjayA9IGFsbG9jX3N0YWNrKHN0YWNrX29yZGVyLCBfX2NhbnRfc2xlZXAoKSk7Ci0JaWYoc3RhY2sgPT0gMCkgcmV0dXJuKC1FTk9NRU0pOworCWlmIChzdGFjayA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwID0gc3RhY2sgKyAocGFnZV9zaXplKCkgPDwgc3RhY2tfb3JkZXIpIC0gc2l6ZW9mKHZvaWQgKik7CiAJcGlkID0gY2xvbmUocHJvYywgKHZvaWQgKikgc3AsIGZsYWdzIHwgU0lHQ0hMRCwgYXJnKTsKLQlpZihwaWQgPCAwKXsKKwlpZiAocGlkIDwgMCkgewogCQllcnIgPSAtZXJybm87CiAJCXByaW50aygicnVuX2hlbHBlcl90aHJlYWQgOiBjbG9uZSBmYWlsZWQsIGVycm5vID0gJWRcbiIsCiAJCSAgICAgICBlcnJubyk7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmKHN0YWNrX291dCA9PSBOVUxMKXsKKwlpZiAoc3RhY2tfb3V0ID09IE5VTEwpIHsKIAkJQ0FUQ0hfRUlOVFIocGlkID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApKTsKLQkJaWYocGlkIDwgMCl7CisJCWlmIChwaWQgPCAwKSB7CiAJCQllcnIgPSAtZXJybm87CiAJCQlwcmludGsoInJ1bl9oZWxwZXJfdGhyZWFkIC0gd2FpdCBmYWlsZWQsIGVycm5vID0gJWRcbiIsCiAJCQkgICAgICAgZXJybm8pOwogCQkJcGlkID0gZXJyOwogCQl9Ci0JCWlmKCFXSUZFWElURUQoc3RhdHVzKSB8fCAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKSkKKwkJaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKSkKIAkJCXByaW50aygicnVuX2hlbHBlcl90aHJlYWQgLSB0aHJlYWQgcmV0dXJuZWQgc3RhdHVzICIKIAkJCSAgICAgICAiMHgleFxuIiwgc3RhdHVzKTsKIAkJZnJlZV9zdGFjayhzdGFjaywgc3RhY2tfb3JkZXIpOwotCX0KLQllbHNlICpzdGFja19vdXQgPSBzdGFjazsKLQlyZXR1cm4ocGlkKTsKKwl9IGVsc2UKKwkJKnN0YWNrX291dCA9IHN0YWNrOworCXJldHVybiBwaWQ7CiB9CiAKIGludCBoZWxwZXJfd2FpdChpbnQgcGlkKQpAQCAtMTU3LDkgKzE2NSw5IEBACiAJaW50IHJldDsKIAogCUNBVENIX0VJTlRSKHJldCA9IHdhaXRwaWQocGlkLCBOVUxMLCBXTk9IQU5HKSk7Ci0JaWYocmV0IDwgMCl7CisJaWYgKHJldCA8IDApIHsKIAkJcmV0ID0gLWVycm5vOwogCQlwcmludGsoImhlbHBlcl93YWl0IDogd2FpdHBpZCBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKIAl9Ci0JcmV0dXJuKHJldCk7CisJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvaXJxLmMgYi9hcmNoL3VtL29zLUxpbnV4L2lycS5jCmluZGV4IGE5NzIwNmQuLmQ0NmI4MTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvaXJxLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9pcnEuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgInNpZ2lvLmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiBzdGF0aWMgc3RydWN0IHBvbGxmZCAqcG9sbGZkcyA9IE5VTEw7CiBzdGF0aWMgaW50IHBvbGxmZHNfbnVtID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvbWFpbi5jIGIvYXJjaC91bS9vcy1MaW51eC9tYWluLmMKaW5kZXggZDFjNTY3MC4uNjg1ZmVhYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9tYWluLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9tYWluLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJjaG9vc2UtbW9kZS5oIgogI2luY2x1ZGUgInVtbC1jb25maWcuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtX21hbGxvYy5oIgogCiAvKiBTZXQgaW4gc2V0X3N0a2xpbSwgd2hpY2ggaXMgY2FsbGVkIGZyb20gbWFpbiBhbmQgX193cmFwX21hbGxvYy4KICAqIF9fd3JhcF9tYWxsb2Mgb25seSBjYWxscyBpdCBpZiBtYWluIGhhc24ndCBzdGFydGVkLgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwppbmRleCA1MWYwODkzLi5jNjkyYTE5IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKaW5kZXggZjY0NTc3Ni4uOTI1YTY1MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgInNpZ2lvLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogLyogUHJvdGVjdGVkIGJ5IHNpZ2lvX2xvY2soKSwgYWxzbyB1c2VkIGJ5IHNpZ2lvX2NsZWFudXAsIHdoaWNoIGlzIGFuCiAgKiBleGl0Y2FsbC4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jCmluZGV4IDZiODE3MzkuLmI4OTdlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWduYWwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJzaWduYWxfa2Vybi5oIgogI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCisjaW5jbHVkZSAic3lzZGVwL2JhcnJpZXIuaCIKICNpbmNsdWRlICJzaWdjb250ZXh0LmgiCiAjaW5jbHVkZSAibW9kZS5oIgogI2luY2x1ZGUgIm9zLmgiCkBAIC0zNCw4ICszNSwxMiBAQAogI2RlZmluZSBTSUdBTFJNX0JJVCAyCiAjZGVmaW5lIFNJR0FMUk1fTUFTSyAoMSA8PCBTSUdBTFJNX0JJVCkKIAotc3RhdGljIGludCBzaWduYWxzX2VuYWJsZWQgPSAxOwotc3RhdGljIGludCBwZW5kaW5nID0gMDsKKy8qIFRoZXNlIGFyZSB1c2VkIGJ5IGJvdGggdGhlIHNpZ25hbCBoYW5kbGVycyBhbmQKKyAqIGJsb2NrL3VuYmxvY2tfc2lnbmFscy4gIEkgZG9uJ3Qgd2FudCBtb2RpZmljYXRpb25zIGNhY2hlZCBpbiBhCisgKiByZWdpc3RlciAtIHRoZXkgbXVzdCBnbyBzdHJhaWdodCB0byBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2xhdGlsZSBpbnQgc2lnbmFsc19lbmFibGVkID0gMTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcGVuZGluZyA9IDA7CiAKIHZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKQogewpAQCAtMTUyLDYgKzE1NywxMiBAQAogdm9pZCBibG9ja19zaWduYWxzKHZvaWQpCiB7CiAJc2lnbmFsc19lbmFibGVkID0gMDsKKwkvKiBUaGlzIG11c3QgcmV0dXJuIHdpdGggc2lnbmFscyBkaXNhYmxlZCwgc28gdGhpcyBiYXJyaWVyCisJICogZW5zdXJlcyB0aGF0IHdyaXRlcyBhcmUgZmx1c2hlZCBvdXQgYmVmb3JlIHRoZSByZXR1cm4uCisJICogVGhpcyBtaWdodCBtYXR0ZXIgaWYgZ2NjIGZpZ3VyZXMgb3V0IGhvdyB0byBpbmxpbmUgdGhpcyBhbmQKKwkgKiBkZWNpZGVzIHRvIHNodWZmbGUgdGhpcyBjb2RlIGludG8gdGhlIGNhbGxlci4KKwkgKi8KKwltYigpOwogfQogCiB2b2lkIHVuYmxvY2tfc2lnbmFscyh2b2lkKQpAQCAtMTcxLDkgKzE4MiwyMyBAQAogCQkgKi8KIAkJc2lnbmFsc19lbmFibGVkID0gMTsKIAorCQkvKiBTZXR0aW5nIHNpZ25hbHNfZW5hYmxlZCBhbmQgcmVhZGluZyBwZW5kaW5nIG11c3QKKwkJICogaGFwcGVuIGluIHRoaXMgb3JkZXIuCisJCSAqLworCQltYigpOworCiAJCXNhdmVfcGVuZGluZyA9IHBlbmRpbmc7Ci0JCWlmKHNhdmVfcGVuZGluZyA9PSAwKQorCQlpZihzYXZlX3BlbmRpbmcgPT0gMCl7CisJCQkvKiBUaGlzIG11c3QgcmV0dXJuIHdpdGggc2lnbmFscyBlbmFibGVkLCBzbworCQkJICogdGhpcyBiYXJyaWVyIGVuc3VyZXMgdGhhdCB3cml0ZXMgYXJlCisJCQkgKiBmbHVzaGVkIG91dCBiZWZvcmUgdGhlIHJldHVybi4gIFRoaXMgbWlnaHQKKwkJCSAqIG1hdHRlciBpZiBnY2MgZmlndXJlcyBvdXQgaG93IHRvIGlubGluZQorCQkJICogdGhpcyAodW5saWtlbHksIGdpdmVuIGl0cyBzaXplKSBhbmQgZGVjaWRlcworCQkJICogdG8gc2h1ZmZsZSB0aGlzIGNvZGUgaW50byB0aGUgY2FsbGVyLgorCQkJICovCisJCQltYigpOwogCQkJcmV0dXJuOworCQl9CiAKIAkJcGVuZGluZyA9IDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCmluZGV4IGNiOWFiNTQuLjliMzRmZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3VzZXIuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJzeXNkZXAvcHRyYWNlLmgiCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3Rscy5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90bHMuYwppbmRleCA2ZTk0NWFiLi4yNTY1MzIwIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3Rscy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvdGxzLmMKQEAgLTEsNiArMSw5IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKwogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKICNpbmNsdWRlICJzeXNkZXAvdGxzLmgiCiAjaW5jbHVkZSAidXNlcl91dGlsLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdGltZS5jIGIvYXJjaC91bS9vcy1MaW51eC90aW1lLmMKaW5kZXggMzhiZTA5Ni4uMjExNWI4YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC90aW1lLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC90aW1lLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKIAogaW50IHNldF9pbnRlcnZhbChpbnQgaXNfdmlydHVhbCkKIHsKQEAgLTMwLDcgKzMxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19NT0RFX1RUCisjaWZkZWYgVU1MX0NPTkZJR19NT0RFX1RUCiB2b2lkIGVuYWJsZV90aW1lcih2b2lkKQogewogCXNldF9pbnRlcnZhbCgxKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdGxzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3Rscy5jCmluZGV4IGEyZGUyNTguLjE2MjE1YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdGxzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC90bHMuYwpAQCAtMSw0ICsxLDUgQEAKICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS9sZHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCmluZGV4IDBlMzJhZGYuLjA5ODcyMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLW9iai15ID0gYnVncy5vIGNoZWNrc3VtLm8gZGVsYXkubyBmYXVsdC5vIGtzeW1zLm8gbGR0Lm8gcHRyYWNlLm8gXAorb2JqLXkgPSBidWcubyBidWdzLm8gY2hlY2tzdW0ubyBkZWxheS5vIGZhdWx0Lm8ga3N5bXMubyBsZHQubyBwdHJhY2UubyBcCiAJcHRyYWNlX3VzZXIubyBzZXRqbXAubyBzaWduYWwubyBzaWdjb250ZXh0Lm8gc3lzY2FsbHMubyBzeXNycS5vIFwKIAlzeXNfY2FsbF90YWJsZS5vIHRscy5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvYnVnLmMgYi9hcmNoL3VtL3N5cy1pMzg2L2J1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGM4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy1pMzg2L2J1Zy5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgVjIKKyAqLworCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisvKiBNb3N0bHkgY29waWVkIGZyb20gaTM4Ni94ODZfODYgLSBlbGltaW5hdGVkIHRoZSBlaXAgPCBQQUdFX09GRlNFVCBiZWNhdXNlCisgKiB0aGF0J3Mgbm90IHJlbGV2ZW50IGluIHNrYXMgbW9kZS4KKyAqLworCitpbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIGVpcCkKK3sKKwl1bnNpZ25lZCBzaG9ydCB1ZDI7CisKKwlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKWVpcCwgdWQyKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdWQyID09IDB4MGIwZjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMgYi9hcmNoL3VtL3N5cy1pMzg2L2xkdC5jCmluZGV4IGUyOTllZTUuLjVkYjc3MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvbGR0LmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9sZHQuYwpAQCAtMyw3ICszLDYgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaW5jbHVkZSAibGludXgvc3RkZGVmLmgiCiAjaW5jbHVkZSAibGludXgvc2NoZWQuaCIKICNpbmNsdWRlICJsaW51eC9zbGFiLmgiCiAjaW5jbHVkZSAibGludXgvdHlwZXMuaCIKQEAgLTE2Nyw3ICsxNjYsNyBAQAogCXN0cnVjdCBwdHJhY2VfbGR0IHB0cmFjZV9sZHQgPSAoc3RydWN0IHB0cmFjZV9sZHQpIHsKIAkJCS5mdW5jID0gMCwKIAkJCS5ieXRlY291bnQgPSBieXRlY291bnQsCi0JCQkucHRyID0gKHZvaWQgKilrbWFsbG9jKGJ5dGVjb3VudCwgR0ZQX0tFUk5FTCl9OworCQkJLnB0ciA9IGttYWxsb2MoYnl0ZWNvdW50LCBHRlBfS0VSTkVMKX07CiAJdTMyIGNwdTsKIAogCWlmKHB0cmFjZV9sZHQucHRyID09IE5VTEwpCkBAIC00MjcsNyArNDI2LDcgQEAKIAkJaG9zdF9sZHRfZW50cmllcyA9IGR1bW15X2xpc3Q7CiAJZWxzZSB7CiAJCXNpemUgPSAoc2l6ZSArIDEpICogc2l6ZW9mKGR1bW15X2xpc3RbMF0pOwotCQlob3N0X2xkdF9lbnRyaWVzID0gKHNob3J0ICopa21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaG9zdF9sZHRfZW50cmllcyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmKGhvc3RfbGR0X2VudHJpZXMgPT0gTlVMTCkgewogCQkJcHJpbnRrKCJsZHRfZ2V0X2hvc3RfaW5mbzogY291bGRuJ3QgYWxsb2NhdGUgaG9zdCBsZHQgbGlzdFxuIik7CiAJCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9wdHJhY2VfdXNlci5jIGIvYXJjaC91bS9zeXMtaTM4Ni9wdHJhY2VfdXNlci5jCmluZGV4IDVmM2NjNjY4Li4wMTIxMmM4IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3B0cmFjZV91c2VyLmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9wdHJhY2VfdXNlci5jCkBAIC00LDkgKzQsOSBAQAogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKIC8qIEdyciwgYXNtL3VzZXIuaCBpbmNsdWRlcyBhc20vcHRyYWNlLmgsIHNvIGhhcyB0byBmb2xsb3cgcHRyYWNlX3VzZXIuaCAqLwogI2luY2x1ZGUgPGFzbS91c2VyLmg+CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3VubWFwLmMgYi9hcmNoL3VtL3N5cy1pMzg2L3VubWFwLmMKaW5kZXggOGU1NWNkNS4uMWIwYWQwZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvdW5tYXAuYworKysgYi9hcmNoL3VtL3N5cy1pMzg2L3VubWFwLmMKQEAgLTUsMTcgKzUsMjAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KIAorc3RhdGljIGludCBlcnJubzsKKworc3RhdGljIGlubGluZSBfc3lzY2FsbDIoaW50LG11bm1hcCx2b2lkICosc3RhcnQsc2l6ZV90LGxlbikKK3N0YXRpYyBpbmxpbmUgX3N5c2NhbGw2KHZvaWQgKixtbWFwMix2b2lkICosYWRkcixzaXplX3QsbGVuLGludCxwcm90LGludCxmbGFncyxpbnQsZmQsb2ZmX3Qsb2Zmc2V0KQogaW50IHN3aXRjaGVyb28oaW50IGZkLCBpbnQgcHJvdCwgdm9pZCAqZnJvbSwgdm9pZCAqdG8sIGludCBzaXplKQogewotCWlmIChzeXNjYWxsKF9fTlJfbXVubWFwLCB0bywgc2l6ZSkgPCAwKXsKKwlpZihtdW5tYXAodG8sIHNpemUpIDwgMCl7CiAJCXJldHVybigtMSk7CiAJfQotCWlmIChzeXNjYWxsKF9fTlJfbW1hcDIsIHRvLCBzaXplLCBwcm90LCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBmZCwgMCkgPT0gKHZvaWQqKSAtMSApeworCWlmKG1tYXAyKHRvLCBzaXplLCBwcm90LCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBmZCwgMCkgPT0gKHZvaWQqKSAtMSApewogCQlyZXR1cm4oLTEpOwogCX0KLQlpZiAoc3lzY2FsbChfX05SX211bm1hcCwgZnJvbSwgc2l6ZSkgPCAwKXsKKwlpZihtdW5tYXAoZnJvbSwgc2l6ZSkgPCAwKXsKIAkJcmV0dXJuKC0xKTsKIAl9CiAJcmV0dXJuKDApOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni91c2VyLW9mZnNldHMuYyBiL2FyY2gvdW0vc3lzLWkzODYvdXNlci1vZmZzZXRzLmMKaW5kZXggNmY0ZWYyYi4uNDQ3MzA2YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni91c2VyLW9mZnNldHMuYworKysgYi9hcmNoL3VtL3N5cy1pMzg2L3VzZXItb2Zmc2V0cy5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN5cy9wb2xsLmg+CiAKICNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUgYi9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKaW5kZXggZjQxNzY4Yi4uNGQ5ZTVlZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKICMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogIwogCi1vYmoteSA9IGJ1Z3MubyBkZWxheS5vIGZhdWx0Lm8gbGR0Lm8gbWVtLm8gcHRyYWNlLm8gcHRyYWNlX3VzZXIubyBcCitvYmoteSA9IGJ1Zy5vIGJ1Z3MubyBkZWxheS5vIGZhdWx0Lm8gbGR0Lm8gbWVtLm8gcHRyYWNlLm8gcHRyYWNlX3VzZXIubyBcCiAJc2V0am1wLm8gc2lnY29udGV4dC5vIHNpZ25hbC5vIHN5c2NhbGxzLm8gc3lzY2FsbF90YWJsZS5vIHN5c3JxLm8gXAogCWtzeW1zLm8gdGxzLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L2J1Zy5jIGIvYXJjaC91bS9zeXMteDg2XzY0L2J1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGM4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvYnVnLmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTCBWMgorICovCisKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKy8qIE1vc3RseSBjb3BpZWQgZnJvbSBpMzg2L3g4Nl84NiAtIGVsaW1pbmF0ZWQgdGhlIGVpcCA8IFBBR0VfT0ZGU0VUIGJlY2F1c2UKKyAqIHRoYXQncyBub3QgcmVsZXZlbnQgaW4gc2thcyBtb2RlLgorICovCisKK2ludCBpc192YWxpZF9idWdhZGRyKHVuc2lnbmVkIGxvbmcgZWlwKQoreworCXVuc2lnbmVkIHNob3J0IHVkMjsKKworCWlmIChwcm9iZV9rZXJuZWxfYWRkcmVzcygodW5zaWduZWQgc2hvcnQgX191c2VyICopZWlwLCB1ZDIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB1ZDIgPT0gMHgwYjBmOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3N0dWJfc2Vndi5jCmluZGV4IDFjOTY3MDIuLjY1MmZhMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViX3NlZ3YuYworKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMKQEAgLTUsNyArNSw2IEBACiAKICNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCiAjaW5jbHVkZSAic3lzZGVwL3NpZ2NvbnRleHQuaCIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC91bm1hcC5jIGIvYXJjaC91bS9zeXMteDg2XzY0L3VubWFwLmMKaW5kZXggNTdjOTI4Ni4uZjRhNGJmZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMteDg2XzY0L3VubWFwLmMKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L3VubWFwLmMKQEAgLTUsMTcgKzUsMjAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KIAorc3RhdGljIGludCBlcnJubzsKKworc3RhdGljIGlubGluZSBfc3lzY2FsbDIoaW50LG11bm1hcCx2b2lkICosc3RhcnQsc2l6ZV90LGxlbikKK3N0YXRpYyBpbmxpbmUgX3N5c2NhbGw2KHZvaWQgKixtbWFwLHZvaWQgKixhZGRyLHNpemVfdCxsZW4saW50LHByb3QsaW50LGZsYWdzLGludCxmZCxvZmZfdCxvZmZzZXQpCiBpbnQgc3dpdGNoZXJvbyhpbnQgZmQsIGludCBwcm90LCB2b2lkICpmcm9tLCB2b2lkICp0bywgaW50IHNpemUpCiB7Ci0JaWYgKHN5c2NhbGwoX19OUl9tdW5tYXAsIHRvLCBzaXplKSA8IDApeworCWlmKG11bm1hcCh0bywgc2l6ZSkgPCAwKXsKIAkJcmV0dXJuKC0xKTsKIAl9Ci0JaWYgKHN5c2NhbGwoX19OUl9tbWFwLCB0bywgc2l6ZSwgcHJvdCwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgZmQsIDApID09ICh2b2lkKikgLTEpeworCWlmKG1tYXAodG8sIHNpemUsIHByb3QsIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsIGZkLCAwKSA9PSAodm9pZCopIC0xKXsKIAkJcmV0dXJuKC0xKTsKIAl9Ci0JaWYgKHN5c2NhbGwoX19OUl9tdW5tYXAsIGZyb20sIHNpemUpIDwgMCl7CisJaWYobXVubWFwKGZyb20sIHNpemUpIDwgMCl7CiAJCXJldHVybigtMSk7CiAJfQogCXJldHVybigwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9LY29uZmlnIGIvYXJjaC92ODUwL0tjb25maWcKaW5kZXggMzdlYzY0NC4uZjBkNGQ3MiAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL0tjb25maWcKKysrIGIvYXJjaC92ODUwL0tjb25maWcKQEAgLTM4LDYgKzM4LDE0IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiAjIFR1cm4gb2ZmIHNvbWUgcmFuZG9tIDM4NiBjcmFwIHRoYXQgY2FuIGFmZmVjdCBkZXZpY2UgY29uZmlnCiBjb25maWcgSVNBCiAJYm9vbApAQCAtOTcsMTcgKzEwNSwxNyBAQAogICAgIyBjdXJyZW50bHkgc3VwcG9ydAogICAgY29uZmlnIFY4NTBFX01BMQogICAgCSAgYm9vbAotCSAgZGVwZW5kcyBSVEVfQ0JfTUExCisJICBkZXBlbmRzIG9uIFJURV9DQl9NQTEKIAkgIGRlZmF1bHQgeQogICAgIyBTaW1pbGFybHkgZm9yIHRoZSBSVEUtVjg1MEUvTkI4NUUtQ0IgLSBWODUwRS9URUcKICAgIGNvbmZpZyBWODUwRV9URUcKICAgIAkgIGJvb2wKLQkgIGRlcGVuZHMgUlRFX0NCX05CODVFCisJICBkZXBlbmRzIG9uIFJURV9DQl9OQjg1RQogCSAgZGVmYXVsdCB5CiAgICAjIC4uLiBhbmQgdGhlIFJURS1WODUwRS9NRTItQ0IgLSBWODUwRS9NRTIKICAgIGNvbmZpZyBWODUwRV9NRTIKICAgIAkgIGJvb2wKLQkgIGRlcGVuZHMgUlRFX0NCX01FMgorCSAgZGVwZW5kcyBvbiBSVEVfQ0JfTUUyCiAJICBkZWZhdWx0IHkKIAogCkBAIC0xMTUsNyArMTIzLDcgQEAKIAogICAgY29uZmlnIFY4NTBFMl9TSU04NUUyCiAgICAJICBib29sCi0JICBkZXBlbmRzIFY4NTBFMl9TSU04NUUyQyB8fCBWODUwRTJfU0lNODVFMlMKKwkgIGRlcGVuZHMgb24gVjg1MEUyX1NJTTg1RTJDIHx8IFY4NTBFMl9TSU04NUUyUwogCSAgZGVmYXVsdCB5CiAKIApAQCAtMTI0LDcgKzEzMiw3IEBACiAgICAjIFY4NTBFMiBwcm9jZXNzb3JzCiAgICBjb25maWcgVjg1MEUyCiAgICAJICBib29sCi0JICBkZXBlbmRzIFY4NTBFMl9TSU04NUUyIHx8IFY4NTBFMl9GUEdBODVFMkMgfHwgVjg1MEUyX0FOTkEKKwkgIGRlcGVuZHMgb24gVjg1MEUyX1NJTTg1RTIgfHwgVjg1MEUyX0ZQR0E4NUUyQyB8fCBWODUwRTJfQU5OQQogCSAgZGVmYXVsdCB5CiAKIApAQCAtMTMzLDcgKzE0MSw3IEBACiAgICAjIEJvYXJkcyBpbiB0aGUgUlRFLXgtQ0Igc2VyaWVzCiAgICBjb25maWcgUlRFX0NCCiAgICAJICBib29sCi0JICBkZXBlbmRzIFJURV9DQl9NQTEgfHwgUlRFX0NCX05CODVFIHx8IFJURV9DQl9NRTIKKwkgIGRlcGVuZHMgb24gUlRFX0NCX01BMSB8fCBSVEVfQ0JfTkI4NUUgfHwgUlRFX0NCX01FMgogCSAgZGVmYXVsdCB5CiAKICAgIGNvbmZpZyBSVEVfQ0JfTVVMVEkKQEAgLTE0MSwyOCArMTQ5LDI4IEBACiAJICAjIFJURV9DQl9OQjg1RSBjYW4gZWl0aGVyIGhhdmUgbXVsdGkgUk9NIHN1cHBvcnQgb3Igbm90LCBidXQKIAkgICMgb3RoZXIgcGxhdGZvcm1zIChjdXJyZW50bHkgb25seSBSVEVfQ0JfTUExKSByZXF1aXJlIGl0LgogCSAgcHJvbXB0ICJNdWx0aSBtb25pdG9yIFJPTSBzdXBwb3J0IiBpZiBSVEVfQ0JfTkI4NUUKLQkgIGRlcGVuZHMgUlRFX0NCX01BMSB8fCBSVEVfQ0JfTkI4NUUKKwkgIGRlcGVuZHMgb24gUlRFX0NCX01BMSB8fCBSVEVfQ0JfTkI4NUUKIAkgIGRlZmF1bHQgeQogCiAgICBjb25maWcgUlRFX0NCX01VTFRJX0RCVFJBUAogICAgCSAgYm9vbCAiUGFzcyBpbGxlZ2FsIGluc24gdHJhcCAvIGRidHJhcCB0byBrZXJuZWwiCi0JICBkZXBlbmRzIFJURV9DQl9NVUxUSQorCSAgZGVwZW5kcyBvbiBSVEVfQ0JfTVVMVEkKIAkgIGRlZmF1bHQgbgogCiAgICBjb25maWcgUlRFX0NCX01BMV9LU1JBTQogICAgCSAgYm9vbCAiS2VybmVsIGluIFNSQU0gKGxpbWl0cyBzaXplIG9mIGtlcm5lbCkiCi0JICBkZXBlbmRzIFJURV9DQl9NQTEgJiYgUlRFX0NCX01VTFRJCisJICBkZXBlbmRzIG9uIFJURV9DQl9NQTEgJiYgUlRFX0NCX01VTFRJCiAJICBkZWZhdWx0IG4KIAogICAgY29uZmlnIFJURV9NQl9BX1BDSQogICAgCSAgYm9vbCAiTW90aGVyLUEgUENJIHN1cHBvcnQiCi0JICBkZXBlbmRzIFJURV9DQgorCSAgZGVwZW5kcyBvbiBSVEVfQ0IKIAkgIGRlZmF1bHQgeQogCiAgICAjIFRoZSBHQlVTIGlzIHVzZWQgdG8gdGFsayB0byB0aGUgUlRFLU1PVEhFUi1BIGJvYXJkCiAgICBjb25maWcgUlRFX0dCVVNfSU5UCiAgICAJICBib29sCi0JICBkZXBlbmRzIFJURV9NQl9BX1BDSQorCSAgZGVwZW5kcyBvbiBSVEVfTUJfQV9QQ0kKIAkgIGRlZmF1bHQgeQogCiAgICAjIFRoZSBvbmx5IFBDSSBidXMgd2Ugc3VwcG9ydCBpcyBvbiB0aGUgUlRFLU1PVEhFUi1BIGJvYXJkCkBAIC0yMDEsNyArMjA5LDcgQEAKIAogICAgY29uZmlnIFJPTV9LRVJORUwKICAgIAkgIGJvb2wgIktlcm5lbCBpbiBST00iCi0JICBkZXBlbmRzIFY4NTBFMl9BTk5BIHx8IFY4NTBFX0FTODVFUDEgfHwgUlRFX0NCX01FMgorCSAgZGVwZW5kcyBvbiBWODUwRTJfQU5OQSB8fCBWODUwRV9BUzg1RVAxIHx8IFJURV9DQl9NRTIKIAogICAgIyBTb21lIHBsYXRmb3JtcyBwcmUtemVybyBtZW1vcnksIGluIHdoaWNoIGNhc2UgdGhlIGtlcm5lbCBkb2Vzbid0IG5lZWQgdG8KICAgIGNvbmZpZyBaRVJPX0JTUwpAQCAtMjE3LDEwICsyMjUsMTAgQEAKIAogICAgY29uZmlnIFY4NTBFX0hJR0hSRVNfVElNRVIKICAgIAkgIGJvb2wgIkhpZ2ggcmVzb2x1dGlvbiB0aW1lciBzdXBwb3J0IgotCSAgZGVwZW5kcyBWODUwRV9USU1FUl9ECisJICBkZXBlbmRzIG9uIFY4NTBFX1RJTUVSX0QKICAgIGNvbmZpZyBUSU1FX0JPT1RVUAogICAgCSAgYm9vbCAiVGltZSBib290dXAiCi0JICBkZXBlbmRzIFY4NTBFX0hJR0hSRVNfVElNRVIKKwkgIGRlcGVuZHMgb24gVjg1MEVfSElHSFJFU19USU1FUgogCiAgICBjb25maWcgUkVTRVRfR1VBUkQKICAgIAkgIGJvb2wgIlJlc2V0IEd1YXJkIgpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC92ODUwX2tzeW1zLmMgYi9hcmNoL3Y4NTAva2VybmVsL3Y4NTBfa3N5bXMuYwppbmRleCA2N2JjNDhlLi45MzU3NWZkIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL3Y4NTBfa3N5bXMuYworKysgYi9hcmNoL3Y4NTAva2VybmVsL3Y4NTBfa3N5bXMuYwpAQCAtMjQsNyArMjQsNyBAQAogRVhQT1JUX1NZTUJPTCAoX19idWcpOwogCiAvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0wgKGNzdW1fcGFydGlhbF9jb3B5KTsKK0VYUE9SVF9TWU1CT0wgKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOwogRVhQT1JUX1NZTUJPTCAoY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKTsKIEVYUE9SVF9TWU1CT0wgKGlwX2NvbXB1dGVfY3N1bSk7CiBFWFBPUlRfU1lNQk9MIChpcF9mYXN0X2NzdW0pOwpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC92ODUwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDYzMzk5MjEuLjNhNWZkMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3Y4NTAva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTkwLDYgKzkwLDcgQEAKIAogLyogS2VybmVsIHRleHQgc2VnbWVudCwgYW5kIHNvbWUgY29uc3RhbnQgZGF0YSBhcmVhcy4gICovCiAjZGVmaW5lIFRFWFRfQ09OVEVOVFMJCQkJCQkJICAgICAgXAorCQlfdGV4dCA9IC47CQkJCQkJICAgICAgXAogCQlfX3N0ZXh0ID0gLiA7CQkJCQkJICAgICAgXAogICAgICAgICAJKigudGV4dCkJCQkJCQkgICAgICBcCiAJCVNDSEVEX1RFWFQJCQkJCQkgICAgICBcCkBAIC0xNDAsMTMgKzE0MSw3IEBACiAJCV9fX3NldHVwX2VuZCA9IC4gOwkJCQkJICAgICAgXAogCQlfX19pbml0Y2FsbF9zdGFydCA9IC4gOwkJCQkJICAgICAgXAogCQkJKiguaW5pdGNhbGwuaW5pdCkJCQkJICAgICAgXAotCQkJKiguaW5pdGNhbGwxLmluaXQpCQkJCSAgICAgIFwKLQkJCSooLmluaXRjYWxsMi5pbml0KQkJCQkgICAgICBcCi0JCQkqKC5pbml0Y2FsbDMuaW5pdCkJCQkJICAgICAgXAotCQkJKiguaW5pdGNhbGw0LmluaXQpCQkJCSAgICAgIFwKLQkJCSooLmluaXRjYWxsNS5pbml0KQkJCQkgICAgICBcCi0JCQkqKC5pbml0Y2FsbDYuaW5pdCkJCQkJICAgICAgXAotCQkJKiguaW5pdGNhbGw3LmluaXQpCQkJCSAgICAgIFwKKwkJCUlOSVRDQUxMUwkJCQkJICAgICAgXAogCQkuID0gQUxJR04gKDQpIDsJCQkJCQkgICAgICBcCiAJCV9fX2luaXRjYWxsX2VuZCA9IC4gOwkJCQkJICAgICAgXAogCQlfX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwkJCQkgICAgICBcCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAvbGliL2NoZWNrc3VtLmMgYi9hcmNoL3Y4NTAvbGliL2NoZWNrc3VtLmMKaW5kZXggZmE1ODcyNi4uMDQyMTU4ZCAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvdjg1MC9saWIvY2hlY2tzdW0uYwpAQCAtODgsMzIgKzg4LDMyIEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi11bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwgdW5zaWduZWQgaW50IGlobCkKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKIHsKLQlyZXR1cm4gfmRvX2NzdW0oaXBoLGlobCo0KTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShpcGgsaWhsKjQpOwogfQogCiAvKgogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK19fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7Ci0JcmV0dXJuIH5kb19jc3VtKGJ1ZmYsbGVuKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShidWZmLGxlbik7CiB9CiAKIC8qCiAgKiBjb21wdXRlcyBhIHBhcnRpYWwgY2hlY2tzdW0sIGUuZy4gZm9yIFRDUC9VRFAgZnJhZ21lbnRzCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOwogCiAJLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCi0JcmVzdWx0ICs9IHN1bTsKLQlpZihzdW0gPiByZXN1bHQpCisJcmVzdWx0ICs9IChfX2ZvcmNlIHUzMilzdW07CisJaWYgKChfX2ZvcmNlIHUzMilzdW0gPiByZXN1bHQpCiAJCXJlc3VsdCArPSAxOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKQEAgLTEyMSw4ICsxMjEsOCBAQAogLyoKICAqIGNvcHkgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCS8qCiAJICogSXQncyAyOjMwIGFtIGFuZCBJIGRvbid0IGZlZWwgbGlrZSBkb2luZyBpdCByZWFsIC4uLgpAQCAtMTM4LDkgKzEzOCw5IEBACiAgKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgSWYgd2UgY2F0Y2ggYW4gZXhjZXB0aW9uCiAgKiB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlciAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJCQkgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0sCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB2b2lkICpzcmMsCisJCQkJCSAgdm9pZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgX193c3VtIHN1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZXJyX3B0cikKIHsKIAlpbnQgbWlzc2luZzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L0tjb25maWcgYi9hcmNoL3g4Nl82NC9LY29uZmlnCmluZGV4IDAxMGQyMjYuLmQ0Mjc1NTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L0tjb25maWcKKysrIGIvYXJjaC94ODZfNjQvS2NvbmZpZwpAQCAtOTYsNiArOTYsMTkgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX0JVRworCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJVRworCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQVJDSF9IQVNfSUxPRzJfVTY0CisJYm9vbAorCWRlZmF1bHQgbgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogCkBAIC0xMjIsNyArMTM1LDcgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJQcm9jZXNzb3IgZmFtaWx5IgotCWRlZmF1bHQgTUs4CisJZGVmYXVsdCBHRU5FUklDX0NQVQogCiBjb25maWcgTUs4CiAJYm9vbCAiQU1ELU9wdGVyb24vQXRobG9uNjQiCkBAIC0xMzAsMTYgKzE0MywzMSBAQAogCSAgT3B0aW1pemUgZm9yIEFNRCBPcHRlcm9uL0F0aGxvbjY0L0hhbW1lci9LOCBDUFVzLgogCiBjb25maWcgTVBTQwotICAgICAgIGJvb2wgIkludGVsIEVNNjRUIgorICAgICAgIGJvb2wgIkludGVsIFA0IC8gb2xkZXIgTmV0YnVyc3QgYmFzZWQgWGVvbiIKICAgICAgICBoZWxwCi0JICBPcHRpbWl6ZSBmb3IgSW50ZWwgUGVudGl1bSA0IGFuZCBYZW9uIENQVXMgd2l0aCBJbnRlbAotCSAgRXh0ZW5kZWQgTWVtb3J5IDY0IFRlY2hub2xvZ3koRU02NFQpLiBGb3IgZGV0YWlscyBzZWUKKwkgIE9wdGltaXplIGZvciBJbnRlbCBQZW50aXVtIDQgYW5kIG9sZGVyIE5vY29uYS9EZW1wc2V5IFhlb24gQ1BVcworCSAgd2l0aCBJbnRlbCBFeHRlbmRlZCBNZW1vcnkgNjQgVGVjaG5vbG9neShFTTY0VCkuIEZvciBkZXRhaWxzIHNlZQogCSAgPGh0dHA6Ly93d3cuaW50ZWwuY29tL3RlY2hub2xvZ3kvNjRiaXRleHRlbnNpb25zLz4uCisJICBOb3RlIHRoZSB0aGUgbGF0ZXN0IFhlb25zIChYZW9uIDUxeHggYW5kIDUzeHgpIGFyZSBub3QgYmFzZWQgb24gdGhlCisgICAgICAgICAgTmV0YnVyc3QgY29yZSBhbmQgc2hvdWxkbid0IHVzZSB0aGlzIG9wdGlvbi4gWW91IGNhbiBkaXN0aW5ndXNoIHRoZW0KKwkgIHVzaW5nIHRoZSBjcHUgZmFtaWx5IGZpZWxkCisJICBpbiAvcHJvYy9jcHVpbmZvLiBGYW1pbHkgMTUgaXMgYSBvbGRlciBYZW9uLCBGYW1pbHkgNiBhIG5ld2VyIG9uZQorCSAgKHRoaXMgcnVsZSBvbmx5IGFwcGxpZXMgdG8gc3lzdGVtIHRoYXQgc3VwcG9ydCBFTTY0VCkKKworY29uZmlnIE1DT1JFMgorCWJvb2wgIkludGVsIENvcmUyIC8gbmV3ZXIgWGVvbiIKKwloZWxwCisJICBPcHRpbWl6ZSBmb3IgSW50ZWwgQ29yZTIgYW5kIG5ld2VyIFhlb25zICg1MXh4KQorCSAgWW91IGNhbiBkaXN0aW5ndXNoIHRoZSBuZXdlciBYZW9ucyBmcm9tIHRoZSBvbGRlciBvbmVzIHVzaW5nCisJICB0aGUgY3B1IGZhbWlseSBmaWVsZCBpbiAvcHJvYy9jcHVpbmZvLiAxNSBpcyBhIG9sZGVyIFhlb24KKwkgICh1c2UgQ09ORklHX01QU0MgdGhlbiksIDYgaXMgYSBuZXdlciBvbmUuIFRoaXMgcnVsZSBvbmx5CisJICBhcHBsaWVzIHRvIENQVXMgdGhhdCBzdXBwb3J0IEVNNjRULgogCiBjb25maWcgR0VORVJJQ19DUFUKIAlib29sICJHZW5lcmljLXg4Ni02NCIKIAloZWxwCiAJICBHZW5lcmljIHg4Ni02NCBDUFUuCisJICBSdW4gZXF1YWxseSB3ZWxsIG9uIGFsbCB4ODYtNjQgQ1BVcy4KIAogZW5kY2hvaWNlCiAKQEAgLTE0OSwxMiArMTc3LDEyIEBACiBjb25maWcgWDg2X0wxX0NBQ0hFX0JZVEVTCiAJaW50CiAJZGVmYXVsdCAiMTI4IiBpZiBHRU5FUklDX0NQVSB8fCBNUFNDCi0JZGVmYXVsdCAiNjQiIGlmIE1LOAorCWRlZmF1bHQgIjY0IiBpZiBNSzggfHwgTUNPUkUyCiAKIGNvbmZpZyBYODZfTDFfQ0FDSEVfU0hJRlQKIAlpbnQKIAlkZWZhdWx0ICI3IiBpZiBHRU5FUklDX0NQVSB8fCBNUFNDCi0JZGVmYXVsdCAiNiIgaWYgTUs4CisJZGVmYXVsdCAiNiIgaWYgTUs4IHx8IE1DT1JFMgogCiBjb25maWcgWDg2X0lOVEVSTk9ERV9DQUNIRV9CWVRFUwogCWludApAQCAtMzQ0LDExICszNzIsNiBAQAogICAgICAgIGRlcGVuZHMgb24gTlVNQQogICAgICAgIGRlZmF1bHQgeQogCi0KLWNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBOVU1BCi0KIGNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9ERUZBVUxUCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gTlVNQQpAQCAtNDU1LDYgKzQ3OCwxNyBAQAogCSAgTm9ybWFsbHkgdGhlIGtlcm5lbCB3aWxsIG1ha2UgdGhlIHJpZ2h0IGNob2ljZSBieSBpdHNlbGYuCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgQ0FMR0FSWV9JT01NVV9FTkFCTEVEX0JZX0RFRkFVTFQKKwlib29sICJTaG91bGQgQ2FsZ2FyeSBiZSBlbmFibGVkIGJ5IGRlZmF1bHQ/IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ0FMR0FSWV9JT01NVQorCWhlbHAKKwkgIFNob3VsZCBDYWxnYXJ5IGJlIGVuYWJsZWQgYnkgZGVmYXVsdD8gaWYgeW91IGNob29zZSAneScsIENhbGdhcnkKKwkgIHdpbGwgYmUgdXNlZCAoaWYgaXQgZXhpc3RzKS4gSWYgeW91IGNob29zZSAnbicsIENhbGdhcnkgd2lsbCBub3QgYmUKKwkgIHVzZWQgZXZlbiBpZiBpdCBleGlzdHMuIElmIHlvdSBjaG9vc2UgJ24nIGFuZCB3b3VsZCBsaWtlIHRvIHVzZQorCSAgQ2FsZ2FyeSBhbnl3YXksIHBhc3MgJ2lvbW11PWNhbGdhcnknIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogIyBuZWVkIHRoaXMgYWx3YXlzIHNlbGVjdGVkIGJ5IElPTU1VIGZvciB0aGUgVklBIHdvcmthcm91bmQKIGNvbmZpZyBTV0lPVExCCiAJYm9vbApAQCAtNTUwLDcgKzU4NCw3IEBACiAJICBJZiB1bnN1cmUsIHNheSBZLiBPbmx5IGVtYmVkZGVkIHNob3VsZCBzYXkgTiBoZXJlLgogCiBjb25maWcgQ0NfU1RBQ0tQUk9URUNUT1IKLQlib29sICJFbmFibGUgLWZzdGFjay1wcm90ZWN0b3IgYnVmZmVyIG92ZXJmbG93IGRldGVjdGlvbiAoRVhQUklNRU5UQUwpIgorCWJvb2wgIkVuYWJsZSAtZnN0YWNrLXByb3RlY3RvciBidWZmZXIgb3ZlcmZsb3cgZGV0ZWN0aW9uIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAogICAgICAgICAgVGhpcyBvcHRpb24gdHVybnMgb24gdGhlIC1mc3RhY2stcHJvdGVjdG9yIEdDQyBmZWF0dXJlLiBUaGlzCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9NYWtlZmlsZSBiL2FyY2gveDg2XzY0L01ha2VmaWxlCmluZGV4IDFjMGYxOGQuLmI0NzFiODU1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9NYWtlZmlsZQpAQCAtMzAsNiArMzAsMTAgQEAKIGNmbGFncy1rZXJuZWwteQk6PQogY2ZsYWdzLSQoQ09ORklHX01LOCkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9azgpCiBjZmxhZ3MtJChDT05GSUdfTVBTQykgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9bm9jb25hKQorIyBnY2MgZG9lc24ndCBzdXBwb3J0IC1tYXJjaD1jb3JlMiB5ZXQgYXMgb2YgZ2NjIDQuMywgYnV0IEkgaG9wZSBpdAorIyB3aWxsIGV2ZW50dWFsbHkuIFVzZSAtbXR1bmU9Z2VuZXJpYyBhcyBmYWxsYmFjaworY2ZsYWdzLSQoQ09ORklHX01DT1JFMikgKz0gXAorCSQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWNvcmUyLCQoY2FsbCBjYy1vcHRpb24sLW10dW5lPWdlbmVyaWMpKQogY2ZsYWdzLSQoQ09ORklHX0dFTkVSSUNfQ1BVKSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tdHVuZT1nZW5lcmljKQogCiBjZmxhZ3MteSArPSAtbTY0CkBAIC01NCw2ICs1OCwxMCBAQAogY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwtZnVuaXQtYXQtYS10aW1lKQogIyBwcmV2ZW50IGdjYyBmcm9tIGdlbmVyYXRpbmcgYW55IEZQIGNvZGUgYnkgbWlzdGFrZQogY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLXNzZSAtbW5vLW1teCAtbW5vLXNzZTIgLW1uby0zZG5vdywpCisjIHRoaXMgd29ya3MgYXJvdW5kIHNvbWUgaXNzdWVzIHdpdGggZ2VuZXJhdGluZyB1bndpbmQgdGFibGVzIGluIG9sZGVyIGdjY3MKKyMgbmV3ZXIgZ2NjcyBkbyBpdCBieSBkZWZhdWx0CitjZmxhZ3MteSArPSAtbWFjY3VtdWxhdGUtb3V0Z29pbmctYXJncworCiAjIGRvIGJpbnV0aWxzIHN1cHBvcnQgQ0ZJPwogY2ZsYWdzLXkgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJPTEsKQogQUZMQUdTICs9ICQoY2FsbCBhcy1pbnN0ciwuY2ZpX3N0YXJ0cHJvY1xuLmNmaV9lbmRwcm9jLC1EQ09ORklHX0FTX0NGST0xLCkKQEAgLTYyLDggKzcwLDggQEAKIGNmbGFncy15ICs9ICQoY2FsbCBhcy1pbnN0ciwuY2ZpX3N0YXJ0cHJvY1xuLmNmaV9zaWduYWxfZnJhbWVcbi5jZmlfZW5kcHJvYywtRENPTkZJR19BU19DRklfU0lHTkFMX0ZSQU1FPTEsKQogQUZMQUdTICs9ICQoY2FsbCBhcy1pbnN0ciwuY2ZpX3N0YXJ0cHJvY1xuLmNmaV9zaWduYWxfZnJhbWVcbi5jZmlfZW5kcHJvYywtRENPTkZJR19BU19DRklfU0lHTkFMX0ZSQU1FPTEsKQogCi1jZmxhZ3MtJChDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IpICs9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9nY2MteDg2XzY0LWhhcy1zdGFjay1wcm90ZWN0b3Iuc2ggJChDQykgLWZzdGFjay1wcm90ZWN0b3IgKQotY2ZsYWdzLSQoQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SX0FMTCkgKz0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2djYy14ODZfNjQtaGFzLXN0YWNrLXByb3RlY3Rvci5zaCAkKENDKSAtZnN0YWNrLXByb3RlY3Rvci1hbGwgKQorY2ZsYWdzLSQoQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SKSArPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZ2NjLXg4Nl82NC1oYXMtc3RhY2stcHJvdGVjdG9yLnNoICIkKENDKSIgLWZzdGFjay1wcm90ZWN0b3IgKQorY2ZsYWdzLSQoQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SX0FMTCkgKz0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2djYy14ODZfNjQtaGFzLXN0YWNrLXByb3RlY3Rvci5zaCAiJChDQykiIC1mc3RhY2stcHJvdGVjdG9yLWFsbCApCiAKIENGTEFHUyArPSAkKGNmbGFncy15KQogQ0ZMQUdTX0tFUk5FTCArPSAkKGNmbGFncy1rZXJuZWwteSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUyBiL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUwppbmRleCBjM2JmZDIyLi43NzA5NDBjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L3NldHVwLlMKKysrIGIvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TCkBAIC04MzYsMTMgKzgzNiwxMiBAQAogCS53b3JkCTB4OTIwMAkJCQkjIGRhdGEgcmVhZC93cml0ZQogCS53b3JkCTB4MDBDRgkJCQkjIGdyYW51bGFyaXR5ID0gNDA5NiwgMzg2CiAJCQkJCQkjICAoKzV0aCBuaWJibGUgb2YgbGltaXQpCitnZHRfZW5kOgogaWR0XzQ4OgogCS53b3JkCTAJCQkJIyBpZHQgbGltaXQgPSAwCiAJLndvcmQJMCwgMAkJCQkjIGlkdCBiYXNlID0gMEwKIGdkdF80ODoKLQkud29yZAkweDgwMDAJCQkJIyBnZHQgbGltaXQ9MjA0OCwKLQkJCQkJCSMgIDI1NiBHRFQgZW50cmllcwotCisJLndvcmQJZ2R0X2VuZC1nZHQtMQkJCSMgZ2R0IGxpbWl0CiAJLndvcmQJMCwgMAkJCQkjIGdkdCBiYXNlIChmaWxsZWQgaW4gbGF0ZXIpCiAKICMgSW5jbHVkZSB2aWRlbyBzZXR1cCAmIGRldGVjdGlvbiBjb2RlCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9kZWZjb25maWcgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKaW5kZXggNDdiZmJhNmUuLjFhMWM2YTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2RlZmNvbmZpZworKysgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTktcmMxCi0jIFRodSBPY3QgIDUgMTM6MDQ6NDMgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5LWdpdDE0CisjIFNhdCBEZWMgIDkgMjE6MjM6MDkgMjAwNgogIwogQ09ORklHX1g4Nl82ND15CiBDT05GSUdfNjRCSVQ9eQpAQCAtMjIsNiArMjIsOSBAQAogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKIENPTkZJR19ETUk9eQogQ09ORklHX0FVRElUX0FSQ0g9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwpAQCAtNDcsMTMgKzUwLDE0IEBACiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKLSMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTg3LDkgKzkxLDcgQEAKICMgQmxvY2sgbGF5ZXIKICMKIENPTkZJR19CTE9DSz15Ci1DT05GSUdfTEJEPXkKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xMTEsMTAgKzExMywxMSBAQAogIyBDT05GSUdfWDg2X1ZTTVAgaXMgbm90IHNldAogIyBDT05GSUdfTUs4IGlzIG5vdCBzZXQKICMgQ09ORklHX01QU0MgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfQ1BVPXkKLUNPTkZJR19YODZfTDFfQ0FDSEVfQllURVM9MTI4Ci1DT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTcKLUNPTkZJR19YODZfSU5URVJOT0RFX0NBQ0hFX0JZVEVTPTEyOAorQ09ORklHX01DT1JFMj15CisjIENPTkZJR19HRU5FUklDX0NQVSBpcyBub3Qgc2V0CitDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTPTY0CitDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTYKK0NPTkZJR19YODZfSU5URVJOT0RFX0NBQ0hFX0JZVEVTPTY0CiBDT05GSUdfWDg2X1RTQz15CiBDT05GSUdfWDg2X0dPT0RfQVBJQz15CiAjIENPTkZJR19NSUNST0NPREUgaXMgbm90IHNldApAQCAtMTcwLDYgKzE3Myw3IEBACiAjIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAogQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCiAjIENPTkZJR19SRU9SREVSIGlzIG5vdCBzZXQKQEAgLTMyMiw2ICszMjYsNyBAQAogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX1RDUF9DT05HX0NVQklDPXkKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogQ09ORklHX0lQVjY9eQogIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldApAQCAtMzM1LDggKzM0MCw4IEBACiAjIENPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfSVBWNl9TSVQ9eQogIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTQzOCw2ICs0NDMsMTMgQEAKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19JQk1fQVNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwogQ09ORklHX0lERT15CkBAIC01MDYsNiArNTE4LDcgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAogQ09ORklHX1NDU0lfTkVUTElOSz15CiAjIENPTkZJR19TQ1NJX1BST0NfRlMgaXMgbm90IHNldAogCkBAIC01MjYsNiArNTM5LDcgQEAKICMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0NPTlNUQU5UUz15CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIFRyYW5zcG9ydHMKQEAgLTU3OSw2ICs1OTMsNyBAQAogIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CiAKICMKICMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCkBAIC02MTcsNiArNjMyLDcgQEAKICMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CkBAIC03ODgsNiArODA0LDcgQEAKIENPTkZJR19TMklPPW0KICMgQ09ORklHX1MySU9fTkFQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKQEAgLTkyMCwxMCArOTM3LDYgQEAKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwogQ09ORklHX0FHUD15CiBDT05GSUdfQUdQX0FNRDY0PXkKIENPTkZJR19BR1BfSU5URUw9eQpAQCAtMTAwOCw2ICsxMDIxLDcgQEAKICMKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIworIyBDT05GSUdfVzEgaXMgbm90IHNldAogCiAjCiAjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydApAQCAtMTA1OSwxMiArMTA3Myw2IEBACiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwotIyBNaXNjIGRldmljZXMKLSMKLSMgQ09ORklHX0lCTV9BU00gaXMgbm90IHNldAotIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CkBAIC0xMTA1LDEwICsxMTEzLDcgQEAKICMgT3BlbiBTb3VuZCBTeXN0ZW0KICMKIENPTkZJR19TT1VORF9QUklNRT15Ci1DT05GSUdfT1NTX09CU09MRVRFX0RSSVZFUj15CiAjIENPTkZJR19TT1VORF9CVDg3OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9FTVUxMEsxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9FUzEzNzEgaXMgbm90IHNldAogQ09ORklHX1NPVU5EX0lDSD15CiAjIENPTkZJR19TT1VORF9UUklERU5UIGlzIG5vdCBzZXQKQEAgLTExMTgsNiArMTEyMywxMSBAQAogIyBDT05GSUdfU09VTkRfT1NTIGlzIG5vdCBzZXQKIAogIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisKKyMKICMgVVNCIHN1cHBvcnQKICMKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKQEAgLTExMzMsNiArMTE0Myw3IEBACiAjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CiAKICMKQEAgLTExODAsOCArMTE5MSw3IEBACiAjIFVTQiBJbnB1dCBEZXZpY2VzCiAjCiBDT05GSUdfVVNCX0hJRD15Ci1DT05GSUdfVVNCX0hJRElOUFVUPXkKLSMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRF9QT1dFUkJPT0sgaXMgbm90IHNldAogIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CkBAIC0xMTk2LDcgKzEyMDYsNiBAQAogIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogCiAjCiAjIFVTQiBJbWFnaW5nIGRldmljZXMKQEAgLTEyMTEsNiArMTIyMCw3IEBACiAjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVRfTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAogQ09ORklHX1VTQl9NT049eQogCkBAIC0xMjQyLDYgKzEyNTIsNyBAQAogIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogCiAjCkBAIC0xMzE4LDYgKzEzMjksNyBAQAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CkBAIC0xMzQxLDYgKzEzNTMsNyBAQAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19BVVRPRlM0X0ZTPXkKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQUNMPXkKIAogIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCkBAIC0xNDE4LDcgKzE0MzEsNiBAQAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfQUNMPXkKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTE0NzMsNiArMTQ4NSw3IEBACiAjCiAjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgogIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKIAogIwogIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydApAQCAtMTUwNCw2ICsxNTE3LDcgQEAKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKICMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKQEAgLTE1MTIsNiArMTUyNiw3IEBACiBDT05GSUdfVU5XSU5EX0lORk89eQogQ09ORklHX1NUQUNLX1VOV0lORD15CiAjIENPTkZJR19GT1JDRURfSU5MSU5JTkcgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1JPREFUQSBpcyBub3Qgc2V0CkBAIC0xNTMzLDYgKzE1NDgsNyBAQAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCitDT05GSUdfQklUUkVWRVJTRT15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9hb3V0LmMgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfYW91dC5jCmluZGV4IDM5NmQzYzEuLmJlODdkZjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9hb3V0LmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2FvdXQuYwpAQCAtMjcyLDcgKzI3Miw3IEBACiAJaWYgKChOX01BR0lDKGV4KSAhPSBaTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gT01BR0lDICYmCiAJICAgICBOX01BR0lDKGV4KSAhPSBRTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gTk1BR0lDKSB8fAogCSAgICBOX1RSU0laRShleCkgfHwgTl9EUlNJWkUoZXgpIHx8Ci0JICAgIGlfc2l6ZV9yZWFkKGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSA8IGV4LmFfdGV4dCtleC5hX2RhdGErTl9TWU1TSVpFKGV4KStOX1RYVE9GRihleCkpIHsKKwkgICAgaV9zaXplX3JlYWQoYnBybS0+ZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkgPCBleC5hX3RleHQrZXguYV9kYXRhK05fU1lNU0laRShleCkrTl9UWFRPRkYoZXgpKSB7CiAJCXJldHVybiAtRU5PRVhFQzsKIAl9CiAKQEAgLTM1Nyw3ICszNTcsNyBAQAogCQl7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJICAgICAgICJmZF9vZmZzZXQgaXMgbm90IHBhZ2UgYWxpZ25lZC4gUGxlYXNlIGNvbnZlcnQgcHJvZ3JhbTogJXNcbiIsCi0JCQkgICAgICAgYnBybS0+ZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCSAgICAgICBicHJtLT5maWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCQllcnJvcl90aW1lID0gamlmZmllczsKIAkJfQogI2VuZGlmCkBAIC00NDAsNyArNDQwLDcgQEAKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBleGVjIGV4OwogCi0JaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAlyZXR2YWwgPSAtRU5PRVhFQzsKIAllcnJvciA9IGtlcm5lbF9yZWFkKGZpbGUsIDAsIChjaGFyICopICZleCwgc2l6ZW9mKGV4KSk7CkBAIC00NzEsNyArNDcxLDcgQEAKIAkJewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKIAkJCSAgICAgICAiTl9UWFRPRkYgaXMgbm90IHBhZ2UgYWxpZ25lZC4gUGxlYXNlIGNvbnZlcnQgbGlicmFyeTogJXNcbiIsCi0JCQkgICAgICAgZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCSAgICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCQllcnJvcl90aW1lID0gamlmZmllczsKIAkJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfYmluZm10LmMgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfYmluZm10LmMKaW5kZXggODJlZjE4Mi4uNTQzZWY0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2JpbmZtdC5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9iaW5mbXQuYwpAQCAtMzA1LDggKzMwNSw2IEBACiAjdW5kZWYgTU9EVUxFX0RFU0NSSVBUSU9OCiAjdW5kZWYgTU9EVUxFX0FVVEhPUgogCi0jZGVmaW5lIGVsZl9hZGRyX3QgX191MzIKLQogc3RhdGljIHZvaWQgZWxmMzJfaW5pdChzdHJ1Y3QgcHRfcmVncyAqKTsKIAogI2RlZmluZSBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTIDEKQEAgLTM1MSw3ICszNDksNyBAQAogCQlicHJtLT5sb2FkZXIgKz0gc3RhY2tfYmFzZTsKIAlicHJtLT5leGVjICs9IHN0YWNrX2Jhc2U7CiAKLQltcG50ID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCW1wbnQgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1wbnQpIAogCQlyZXR1cm4gLUVOT01FTTsgCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9zaWduYWwuYyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9zaWduYWwuYwppbmRleCBhNmJhOTk1Li5mZjQ5OWVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfc2lnbmFsLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyX3NpZ25hbC5jCkBAIC01NzksNiArNTc5LDE2IEBACiAJcmVncy0+cnNwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwogCXJlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKIAorCS8qIE1ha2UgLW1yZWdwYXJtPTMgd29yayAqLworCXJlZ3MtPnJheCA9IHNpZzsKKwlyZWdzLT5yZHggPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5pbmZvOworCXJlZ3MtPnJjeCA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOworCisJLyogTWFrZSAtbXJlZ3Bhcm09MyB3b3JrICovCisJcmVncy0+cmF4ID0gc2lnOworCXJlZ3MtPnJkeCA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPmluZm87CisJcmVncy0+cmN4ID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CisKIAlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVkcyIgOjogInIiIChfX1VTRVIzMl9EUykpOyAKIAlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVlcyIgOjogInIiIChfX1VTRVIzMl9EUykpOyAKIAkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYyBiL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYwppbmRleCAzYTc1NjFkLi4wNDU2NmZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jCkBAIC0yNDQsNiArMjQ0LDggQEAKIAljYXNlIFBUUkFDRV9ERVRBQ0g6CiAJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoKIAljYXNlIFBUUkFDRV9TRVRPUFRJT05TOgorCWNhc2UgUFRSQUNFX1NFVF9USFJFQURfQVJFQToKKwljYXNlIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUE6CiAJCXJldHVybiBzeXNfcHRyYWNlKHJlcXVlc3QsIHBpZCwgYWRkciwgZGF0YSk7IAogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvc3lzY2FsbDMyLmMgYi9hcmNoL3g4Nl82NC9pYTMyL3N5c2NhbGwzMi5jCmluZGV4IDNhMDEzMjkuLjNlNWVkMjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvc3lzY2FsbDMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9zeXNjYWxsMzIuYwpAQCAtNDksNyArNDksNyBAQAogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJaW50IHJldDsKIAotCXZtYSA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwl2bWEgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZtYSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCmluZGV4IDRkOWQ1ZWQuLjEyNGIyZDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgpAQCAtNDUsNiArNDYsMTIgQEAKIAogaW50IGRpc2FibGVfYXBpY190aW1lciBfX2luaXRkYXRhOwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlICppb2FwaWNfcmVzb3VyY2VzOworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsYXBpY19yZXNvdXJjZSA9IHsKKwkubmFtZSA9ICJMb2NhbCBBUElDIiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWSwKK307CisKIC8qCiAgKiBjcHVfbWFzayB0aGF0IGRlbm90ZXMgdGhlIENQVXMgdGhhdCBuZWVkcyB0aW1lciBpbnRlcnJ1cHQgY29taW5nIGluIGFzCiAgKiBJUElzIGluIHBsYWNlIG9mIGxvY2FsIEFQSUMgdGltZXJzCkBAIC0xMzMsNyArMTQwLDYgQEAKIAkJYXBpY193cml0ZShBUElDX0xWVEVSUiwgQVBJQ19MVlRfTUFTS0VEKTsKIAlpZiAobWF4bHZ0ID49IDQpCiAJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19MVlRfTUFTS0VEKTsKLQl2ID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKIAlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAlhcGljX3JlYWQoQVBJQ19FU1IpOwogfQpAQCAtNDUyLDIzICs0NTgsMzAgQEAKIHN0YXRpYyBpbnQgbGFwaWNfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWF4bHZ0OwogCiAJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKIAkJcmV0dXJuIDA7CiAKKwltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisKIAlhcGljX3BtX3N0YXRlLmFwaWNfaWQgPSBhcGljX3JlYWQoQVBJQ19JRCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX3Rhc2twcmkgPSBhcGljX3JlYWQoQVBJQ19UQVNLUFJJKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfbGRyID0gYXBpY19yZWFkKEFQSUNfTERSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfZGZyID0gYXBpY19yZWFkKEFQSUNfREZSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfc3BpdiA9IGFwaWNfcmVhZChBUElDX1NQSVYpOwogCWFwaWNfcG1fc3RhdGUuYXBpY19sdnR0ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7Ci0JYXBpY19wbV9zdGF0ZS5hcGljX2x2dHBjID0gYXBpY19yZWFkKEFQSUNfTFZUUEMpOworCWlmIChtYXhsdnQgPj0gNCkKKwkJYXBpY19wbV9zdGF0ZS5hcGljX2x2dHBjID0gYXBpY19yZWFkKEFQSUNfTFZUUEMpOwogCWFwaWNfcG1fc3RhdGUuYXBpY19sdnQwID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX2x2dDEgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0ZXJyID0gYXBpY19yZWFkKEFQSUNfTFZURVJSKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfdG1pY3QgPSBhcGljX3JlYWQoQVBJQ19UTUlDVCk7CiAJYXBpY19wbV9zdGF0ZS5hcGljX3RkY3IgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKLQlhcGljX3BtX3N0YXRlLmFwaWNfdGhtciA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOworI2lmZGVmIENPTkZJR19YODZfTUNFX0lOVEVMCisJaWYgKG1heGx2dCA+PSA1KQorCQlhcGljX3BtX3N0YXRlLmFwaWNfdGhtciA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOworI2VuZGlmCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWRpc2FibGVfbG9jYWxfQVBJQygpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTQ3OSwxMCArNDkyLDEzIEBACiB7CiAJdW5zaWduZWQgaW50IGwsIGg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWF4bHZ0OwogCiAJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKIAkJcmV0dXJuIDA7CiAKKwltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwogCWwgJj0gfk1TUl9JQTMyX0FQSUNCQVNFX0JBU0U7CkBAIC00OTYsOCArNTEyLDEyIEBACiAJYXBpY193cml0ZShBUElDX1NQSVYsIGFwaWNfcG1fc3RhdGUuYXBpY19zcGl2KTsKIAlhcGljX3dyaXRlKEFQSUNfTFZUMCwgYXBpY19wbV9zdGF0ZS5hcGljX2x2dDApOwogCWFwaWNfd3JpdGUoQVBJQ19MVlQxLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0MSk7Ci0JYXBpY193cml0ZShBUElDX0xWVFRITVIsIGFwaWNfcG1fc3RhdGUuYXBpY190aG1yKTsKLQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIGFwaWNfcG1fc3RhdGUuYXBpY19sdnRwYyk7CisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfSU5URUwKKwlpZiAobWF4bHZ0ID49IDUpCisJCWFwaWNfd3JpdGUoQVBJQ19MVlRUSE1SLCBhcGljX3BtX3N0YXRlLmFwaWNfdGhtcik7CisjZW5kaWYKKwlpZiAobWF4bHZ0ID49IDQpCisJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgYXBpY19wbV9zdGF0ZS5hcGljX2x2dHBjKTsKIAlhcGljX3dyaXRlKEFQSUNfTFZUVCwgYXBpY19wbV9zdGF0ZS5hcGljX2x2dHQpOwogCWFwaWNfd3JpdGUoQVBJQ19URENSLCBhcGljX3BtX3N0YXRlLmFwaWNfdGRjcik7CiAJYXBpY193cml0ZShBUElDX1RNSUNULCBhcGljX3BtX3N0YXRlLmFwaWNfdG1pY3QpOwpAQCAtNTg1LDYgKzYwNSw2NCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCitzdGF0aWMgc3RydWN0IHJlc291cmNlICogX19pbml0IGlvYXBpY19zZXR1cF9yZXNvdXJjZXModm9pZCkKK3sKKyNkZWZpbmUgSU9BUElDX1JFU09VUkNFX05BTUVfU0laRSAxMQorCXVuc2lnbmVkIGxvbmcgbjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwljaGFyICptZW07CisJaW50IGk7CisKKwlpZiAobnJfaW9hcGljcyA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCW4gPSBJT0FQSUNfUkVTT1VSQ0VfTkFNRV9TSVpFICsgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSk7CisJbiAqPSBucl9pb2FwaWNzOworCisJbWVtID0gYWxsb2NfYm9vdG1lbShuKTsKKwlyZXMgPSAodm9pZCAqKW1lbTsKKworCWlmIChtZW0gIT0gTlVMTCkgeworCQltZW1zZXQobWVtLCAwLCBuKTsKKwkJbWVtICs9IHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogbnJfaW9hcGljczsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CisJCQlyZXNbaV0ubmFtZSA9IG1lbTsKKwkJCXJlc1tpXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOworCQkJc3ByaW50ZihtZW0sICAiSU9BUElDICV1IiwgaSk7CisJCQltZW0gKz0gSU9BUElDX1JFU09VUkNFX05BTUVfU0laRTsKKwkJfQorCX0KKworCWlvYXBpY19yZXNvdXJjZXMgPSByZXM7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpb2FwaWNfaW5zZXJ0X3Jlc291cmNlcyh2b2lkKQoreworCWludCBpOworCXN0cnVjdCByZXNvdXJjZSAqciA9IGlvYXBpY19yZXNvdXJjZXM7CisKKwlpZiAoIXIpIHsKKwkJcHJpbnRrKCJJTyBBUElDIHJlc291cmNlcyBjb3VsZCBiZSBub3QgYmUgYWxsb2NhdGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CisJCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHIpOworCQlyKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEluc2VydCB0aGUgSU8gQVBJQyByZXNvdXJjZXMgYWZ0ZXIgUENJIGluaXRpYWxpemF0aW9uIGhhcyBvY2N1cmVkIHRvIGhhbmRsZQorICogSU8gQVBJQ1MgdGhhdCBhcmUgbWFwcGVkIGluIG9uIGEgQkFSIGluIFBDSSBzcGFjZS4gKi8KK2xhdGVfaW5pdGNhbGwoaW9hcGljX2luc2VydF9yZXNvdXJjZXMpOworI2VuZGlmCisKIHZvaWQgX19pbml0IGluaXRfYXBpY19tYXBwaW5ncyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgYXBpY19waHlzOwpAQCAtNjA0LDYgKzY4MiwxMSBAQAogCWFwaWNfbWFwcGVkID0gMTsKIAlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIm1hcHBlZCBBUElDIHRvICUxNmx4ICglMTZseClcbiIsIEFQSUNfQkFTRSwgYXBpY19waHlzKTsKIAorCS8qIFB1dCBsb2NhbCBBUElDIGludG8gdGhlIHJlc291cmNlIG1hcC4gKi8KKwlsYXBpY19yZXNvdXJjZS5zdGFydCA9IGFwaWNfcGh5czsKKwlsYXBpY19yZXNvdXJjZS5lbmQgPSBsYXBpY19yZXNvdXJjZS5zdGFydCArIFBBR0VfU0laRSAtIDE7CisJaW5zZXJ0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmxhcGljX3Jlc291cmNlKTsKKwogCS8qCiAJICogRmV0Y2ggdGhlIEFQSUMgSUQgb2YgdGhlIEJTUCBpbiBjYXNlIHdlIGhhdmUgYQogCSAqIGRlZmF1bHQgY29uZmlndXJhdGlvbiAob3IgdGhlIE1QIHRhYmxlIGlzIGJyb2tlbikuCkBAIC02MTMsNyArNjk2LDkgQEAKIAl7CiAJCXVuc2lnbmVkIGxvbmcgaW9hcGljX3BoeXMsIGlkeCA9IEZJWF9JT19BUElDX0JBU0VfMDsKIAkJaW50IGk7CisJCXN0cnVjdCByZXNvdXJjZSAqaW9hcGljX3JlczsKIAorCQlpb2FwaWNfcmVzID0gaW9hcGljX3NldHVwX3Jlc291cmNlcygpOwogCQlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CiAJCQlpZiAoc21wX2ZvdW5kX2NvbmZpZykgewogCQkJCWlvYXBpY19waHlzID0gbXBfaW9hcGljc1tpXS5tcGNfYXBpY2FkZHI7CkBAIC02MjUsNiArNzEwLDEyIEBACiAJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIm1hcHBlZCBJT0FQSUMgdG8gJTAxNmx4ICglMDE2bHgpXG4iLAogCQkJCQlfX2ZpeF90b192aXJ0KGlkeCksIGlvYXBpY19waHlzKTsKIAkJCWlkeCsrOworCisJCQlpZiAoaW9hcGljX3JlcyAhPSBOVUxMKSB7CisJCQkJaW9hcGljX3Jlcy0+c3RhcnQgPSBpb2FwaWNfcGh5czsKKwkJCQlpb2FwaWNfcmVzLT5lbmQgPSBpb2FwaWNfcGh5cyArICg0ICogMTAyNCkgLSAxOworCQkJCWlvYXBpY19yZXMrKzsKKwkJCX0KIAkJfQogCX0KIH0KQEAgLTY0NCwxMCArNzM1LDkgQEAKIAogc3RhdGljIHZvaWQgX19zZXR1cF9BUElDX0xWVFQodW5zaWduZWQgaW50IGNsb2NrcykKIHsKLQl1bnNpZ25lZCBpbnQgbHZ0dF92YWx1ZSwgdG1wX3ZhbHVlLCB2ZXI7CisJdW5zaWduZWQgaW50IGx2dHRfdmFsdWUsIHRtcF92YWx1ZTsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JdmVyID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKIAlsdnR0X3ZhbHVlID0gQVBJQ19MVlRfVElNRVJfUEVSSU9ESUMgfCBMT0NBTF9USU1FUl9WRUNUT1I7CiAKIAlpZiAoY3B1X2lzc2V0KGNwdSwgdGltZXJfaW50ZXJydXB0X2Jyb2FkY2FzdF9pcGlfbWFzaykpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvY3B1ZnJlcS9LY29uZmlnIGIvYXJjaC94ODZfNjQva2VybmVsL2NwdWZyZXEvS2NvbmZpZwppbmRleCA4MWYxNTYyLi4zYWJjZmEzIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9jcHVmcmVxL0tjb25maWcKQEAgLTI3LDEwICsyNywxMyBAQAogCWRlZmF1bHQgeQogCiBjb25maWcgWDg2X1NQRUVEU1RFUF9DRU5UUklOTwotCXRyaXN0YXRlICJJbnRlbCBFbmhhbmNlZCBTcGVlZFN0ZXAiCisJdHJpc3RhdGUgIkludGVsIEVuaGFuY2VkIFNwZWVkU3RlcCAoZGVwcmVjYXRlZCkiCiAJc2VsZWN0IENQVV9GUkVRX1RBQkxFCiAJZGVwZW5kcyBvbiBBQ1BJX1BST0NFU1NPUgogCWhlbHAKKwkgIFRoaXMgaXMgZGVwcmVjYXRlZCBhbmQgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdyBtZXJnZWQgaW50bworCSAgYWNwaV9jcHVmcmVxIChYODZfQUNQSV9DUFVGUkVRKS4gVXNlIHRoYXQgZHJpdmVyIGluc3RlYWQgb2YKKwkgIHNwZWVkc3RlcF9jZW50cmluby4KIAkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIEVuaGFuY2VkIFNwZWVkU3RlcCBlbmFibGVkCiAJICBtb2JpbGUgQ1BVcy4gIFRoaXMgbWVhbnMgSW50ZWwgUGVudGl1bSBNIChDZW50cmlubykgQ1BVcwogCSAgb3IgNjRiaXQgZW5hYmxlZCBJbnRlbCBYZW9ucy4KQEAgLTUwLDYgKzUzLDcgQEAKIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIGEgQ1BVRnJlcSBkcml2ZXIgd2hpY2ggdXRpbGl6ZXMgdGhlIEFDUEkKIAkgIFByb2Nlc3NvciBQZXJmb3JtYW5jZSBTdGF0ZXMuCisJICBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIEludGVsIEVuaGFuY2VkIFNwZWVkc3RlcC4KIAogCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2NwdWZyZXEvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvY3B1ZnJlcS9NYWtlZmlsZQppbmRleCBkOGI1OTM4Li43NTNjZTFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvY3B1ZnJlcS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvY3B1ZnJlcS9NYWtlZmlsZQpAQCAtNSw4ICs1LDggQEAKIFNSQ0RJUiA6PSAuLi8uLi8uLi9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcQogCiBvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s4KSArPSBwb3dlcm5vdy1rOC5vCi1vYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOTykgKz0gc3BlZWRzdGVwLWNlbnRyaW5vLm8KIG9iai0kKENPTkZJR19YODZfQUNQSV9DUFVGUkVRKSArPSBhY3BpLWNwdWZyZXEubworb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk8pICs9IHNwZWVkc3RlcC1jZW50cmluby5vCiBvYmotJChDT05GSUdfWDg2X1A0X0NMT0NLTU9EKSArPSBwNC1jbG9ja21vZC5vCiBvYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9MSUIpICs9IHNwZWVkc3RlcC1saWIubwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvY3Jhc2guYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9jcmFzaC5jCmluZGV4IDM1MjVmODguLjk1YTdhMmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9jcmFzaC5jCkBAIC0yOCw3MSArMjgsNiBAQAogLyogVGhpcyBrZWVwcyBhIHRyYWNrIG9mIHdoaWNoIG9uZSBpcyBjcmFzaGluZyBjcHUuICovCiBzdGF0aWMgaW50IGNyYXNoaW5nX2NwdTsKIAotc3RhdGljIHUzMiAqYXBwZW5kX2VsZl9ub3RlKHUzMiAqYnVmLCBjaGFyICpuYW1lLCB1bnNpZ25lZCB0eXBlLAotCQkJCQkJdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQotewotCXN0cnVjdCBlbGZfbm90ZSBub3RlOwotCi0Jbm90ZS5uX25hbWVzeiA9IHN0cmxlbihuYW1lKSArIDE7Ci0Jbm90ZS5uX2Rlc2NzeiA9IGRhdGFfbGVuOwotCW5vdGUubl90eXBlICAgPSB0eXBlOwotCW1lbWNweShidWYsICZub3RlLCBzaXplb2Yobm90ZSkpOwotCWJ1ZiArPSAoc2l6ZW9mKG5vdGUpICszKS80OwotCW1lbWNweShidWYsIG5hbWUsIG5vdGUubl9uYW1lc3opOwotCWJ1ZiArPSAobm90ZS5uX25hbWVzeiArIDMpLzQ7Ci0JbWVtY3B5KGJ1ZiwgZGF0YSwgbm90ZS5uX2Rlc2Nzeik7Ci0JYnVmICs9IChub3RlLm5fZGVzY3N6ICsgMykvNDsKLQotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbmFsX25vdGUodTMyICpidWYpCi17Ci0Jc3RydWN0IGVsZl9ub3RlIG5vdGU7Ci0KLQlub3RlLm5fbmFtZXN6ID0gMDsKLQlub3RlLm5fZGVzY3N6ID0gMDsKLQlub3RlLm5fdHlwZSAgID0gMDsKLQltZW1jcHkoYnVmLCAmbm90ZSwgc2l6ZW9mKG5vdGUpKTsKLX0KLQotc3RhdGljIHZvaWQgY3Jhc2hfc2F2ZV90aGlzX2NwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgZWxmX3Byc3RhdHVzIHByc3RhdHVzOwotCXUzMiAqYnVmOwotCi0JaWYgKChjcHUgPCAwKSB8fCAoY3B1ID49IE5SX0NQVVMpKQotCQlyZXR1cm47Ci0KLQkvKiBVc2luZyBFTEYgbm90ZXMgaGVyZSBpcyBvcHBvcnR1bmlzdGljLgotCSAqIEkgbmVlZCBhIHdlbGwgZGVmaW5lZCBzdHJ1Y3R1cmUgZm9ybWF0Ci0JICogZm9yIHRoZSBkYXRhIEkgcGFzcywgYW5kIEkgbmVlZCB0YWdzCi0JICogb24gdGhlIGRhdGEgdG8gaW5kaWNhdGUgd2hhdCBpbmZvcm1hdGlvbiBJIGhhdmUKLQkgKiBzcXVpcnJlbGxlZCBhd2F5LiAgRUxGIG5vdGVzIGhhcHBlbiB0byBwcm92aWRlCi0JICogYWxsIG9mIHRoYXQsIG5vIG5lZWQgdG8gaW52ZW50IHNvbWV0aGluZyBuZXcuCi0JICovCi0KLQlidWYgPSAodTMyKilwZXJfY3B1X3B0cihjcmFzaF9ub3RlcywgY3B1KTsKLQotCWlmICghYnVmKQotCQlyZXR1cm47Ci0KLQltZW1zZXQoJnByc3RhdHVzLCAwLCBzaXplb2YocHJzdGF0dXMpKTsKLQlwcnN0YXR1cy5wcl9waWQgPSBjdXJyZW50LT5waWQ7Ci0JZWxmX2NvcmVfY29weV9yZWdzKCZwcnN0YXR1cy5wcl9yZWcsIHJlZ3MpOwotCWJ1ZiA9IGFwcGVuZF9lbGZfbm90ZShidWYsICJDT1JFIiwgTlRfUFJTVEFUVVMsICZwcnN0YXR1cywKLQkJCQkJc2l6ZW9mKHByc3RhdHVzKSk7Ci0JZmluYWxfbm90ZShidWYpOwotfQotCi1zdGF0aWMgdm9pZCBjcmFzaF9zYXZlX3NlbGYoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IGNwdTsKLQotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQljcmFzaF9zYXZlX3RoaXNfY3B1KHJlZ3MsIGNwdSk7Ci19Ci0KICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgYXRvbWljX3Qgd2FpdGluZ19mb3JfY3Jhc2hfaXBpOwogCkBAIC0xMTcsNyArNTIsNyBAQAogCQlyZXR1cm4gTk9USUZZX1NUT1A7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAotCWNyYXNoX3NhdmVfdGhpc19jcHUocmVncywgY3B1KTsKKwljcmFzaF9zYXZlX2NwdShyZWdzLCBjcHUpOwogCWRpc2FibGVfbG9jYWxfQVBJQygpOwogCWF0b21pY19kZWMoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSk7CiAJLyogQXNzdW1lIGhsdCB3b3JrcyAqLwpAQCAtMTk2LDUgKzEzMSw1IEBACiAKIAlkaXNhYmxlX0lPX0FQSUMoKTsKIAotCWNyYXNoX3NhdmVfc2VsZihyZWdzKTsKKwljcmFzaF9zYXZlX2NwdShyZWdzLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMKaW5kZXggYjNmMDkwOC4uNmZlMTkxYyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jCkBAIC01NCwxMyArNTQsMTMgQEAKIAogCS8qIHZhcmlvdXMgZ3VuayBiZWxvdyB0aGF0IG5lZWRlZCBmb3IgU01QIHN0YXJ0dXAgKi8KIAlpZiAoYWRkciA8IDB4ODAwMCkgeyAKLQkJKmFkZHJwID0gMHg4MDAwOworCQkqYWRkcnAgPSBQQUdFX0FMSUdOKDB4ODAwMCk7CiAJCXJldHVybiAxOyAKIAl9CiAKIAkvKiBkaXJlY3QgbWFwcGluZyB0YWJsZXMgb2YgdGhlIGtlcm5lbCAqLwogCWlmIChsYXN0ID49IHRhYmxlX3N0YXJ0PDxQQUdFX1NISUZUICYmIGFkZHIgPCB0YWJsZV9lbmQ8PFBBR0VfU0hJRlQpIHsgCi0JCSphZGRycCA9IHRhYmxlX2VuZCA8PCBQQUdFX1NISUZUOyAKKwkJKmFkZHJwID0gUEFHRV9BTElHTih0YWJsZV9lbmQgPDwgUEFHRV9TSElGVCk7CiAJCXJldHVybiAxOwogCX0gCiAKQEAgLTY4LDE4ICs2OCwxOCBAQAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCWlmIChMT0FERVJfVFlQRSAmJiBJTklUUkRfU1RBUlQgJiYgbGFzdCA+PSBJTklUUkRfU1RBUlQgJiYgCiAJICAgIGFkZHIgPCBJTklUUkRfU1RBUlQrSU5JVFJEX1NJWkUpIHsgCi0JCSphZGRycCA9IElOSVRSRF9TVEFSVCArIElOSVRSRF9TSVpFOyAKKwkJKmFkZHJwID0gUEFHRV9BTElHTihJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSk7CiAJCXJldHVybiAxOwogCX0gCiAjZW5kaWYKIAkvKiBrZXJuZWwgY29kZSAqLwotCWlmIChsYXN0ID49IF9fcGFfc3ltYm9sKCZfdGV4dCkgJiYgbGFzdCA8IF9fcGFfc3ltYm9sKCZfZW5kKSkgewotCQkqYWRkcnAgPSBfX3BhX3N5bWJvbCgmX2VuZCk7CisJaWYgKGxhc3QgPj0gX19wYV9zeW1ib2woJl90ZXh0KSAmJiBhZGRyIDwgX19wYV9zeW1ib2woJl9lbmQpKSB7CisJCSphZGRycCA9IFBBR0VfQUxJR04oX19wYV9zeW1ib2woJl9lbmQpKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKGxhc3QgPj0gZWJkYV9hZGRyICYmIGFkZHIgPCBlYmRhX2FkZHIgKyBlYmRhX3NpemUpIHsKLQkJKmFkZHJwID0gZWJkYV9hZGRyICsgZWJkYV9zaXplOworCQkqYWRkcnAgPSBQQUdFX0FMSUdOKGViZGFfYWRkciArIGViZGFfc2l6ZSk7CiAJCXJldHVybiAxOwogCX0KIApAQCAtMTUyLDcgKzE1Miw3IEBACiAJCQljb250aW51ZTsgCiAJCXdoaWxlIChiYWRfYWRkcigmYWRkciwgc2l6ZSkgJiYgYWRkcitzaXplIDw9IGVpLT5hZGRyK2VpLT5zaXplKQogCQkJOwotCQlsYXN0ID0gYWRkciArIHNpemU7CisJCWxhc3QgPSBQQUdFX0FMSUdOKGFkZHIpICsgc2l6ZTsKIAkJaWYgKGxhc3QgPiBlaS0+YWRkciArIGVpLT5zaXplKQogCQkJY29udGludWU7CiAJCWlmIChsYXN0ID4gZW5kKSAKQEAgLTI3OCw3ICsyNzgsNyBAQAogCQkJCQkJCQk+PiBQQUdFX1NISUZUOwogCiAJCS8qIFNraXAgbWFwIGVudHJpZXMgc21hbGxlciB0aGFuIGEgcGFnZSAqLwotCQlpZiAoZWlfc3RhcnRwZm4gPiBlaV9lbmRwZm4pCisJCWlmIChlaV9zdGFydHBmbiA+PSBlaV9lbmRwZm4pCiAJCQljb250aW51ZTsKIAogCQkvKiBDaGVjayBpZiBlbmRfcGZuX21hcCBzaG91bGQgYmUgdXBkYXRlZCAqLwpAQCAtNTk0LDcgKzU5NCw5IEBACiAJCSAqIHNpemUgYmVmb3JlIG9yaWdpbmFsIG1lbW9yeSBtYXAgaXMKIAkJICogcmVzZXQuCiAJCSAqLworCQllODIwX3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKDAsIDAsIC0xVUwpOwogCQlzYXZlZF9tYXhfcGZuID0gZTgyMF9lbmRfb2ZfcmFtKCk7CisJCXJlbW92ZV9hbGxfYWN0aXZlX3JhbmdlcygpOwogI2VuZGlmCiAJCWVuZF9wZm5fbWFwID0gMDsKIAkJZTgyMC5ucl9tYXAgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5LXF1aXJrcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5LXF1aXJrcy5jCmluZGV4IDIwOGUzOGEuLjgyOTY5OGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHktcXVpcmtzLmMKQEAgLTQ1LDcgKzQ1LDEzIEBACiAJLyoKIAkgKiBBbGwgdGltZXIgb3ZlcnJpZGVzIG9uIE52aWRpYSBhcmUKIAkgKiB3cm9uZyB1bmxlc3MgSFBFVCBpcyBlbmFibGVkLgorCSAqIFVuZm9ydHVuYXRlbHkgdGhhdCdzIG5vdCB0cnVlIG9uIG1hbnkgQXN1cyBib2FyZHMuCisJICogV2UgZG9uJ3Qga25vdyB5ZXQgaG93IHRvIGRldGVjdCB0aGlzIGF1dG9tYXRpY2FsbHksIGJ1dAorCSAqIGF0IGxlYXN0IGFsbG93IGEgY29tbWFuZCBsaW5lIG92ZXJyaWRlLgogCSAqLworCWlmIChhY3BpX3VzZV90aW1lcl9vdmVycmlkZSkKKwkJcmV0dXJuOworCiAJbnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPSAwOwogCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9IUEVULCBudmlkaWFfaHBldF9jaGVjayk7CiAJaWYgKG52aWRpYV9ocGV0X2RldGVjdGVkID09IDApIHsKQEAgLTUzLDYgKzU5LDggQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiTnZpZGlhIGJvYXJkICIKIAkJICAgICAgICJkZXRlY3RlZC4gSWdub3JpbmcgQUNQSSAiCiAJCSAgICAgICAidGltZXIgb3ZlcnJpZGUuXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSWYgeW91IGdvdCB0aW1lciB0cm91YmxlICIKKwkJCSJ0cnkgYWNwaV91c2VfdGltZXJfb3ZlcnJpZGVcbiIpOwogCX0KICNlbmRpZgogCS8qIFJFRC1QRU4gc2tpcCB0aGVtIG9uIG1wdGFibGVzIHRvbz8gKi8KQEAgLTYxLDEwICs2OSwxOCBAQAogCiBzdGF0aWMgdm9pZCBhdGlfYnVncyh2b2lkKQogewotI2lmIDEgLyogZm9yIHRlc3RpbmcgKi8KLQlwcmludGsoIkFUSSBib2FyZCBkZXRlY3RlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2J1Z3Modm9pZCkKK3sKKwl1MTYgZGV2aWNlID0gcmVhZF9wY2lfY29uZmlnXzE2KDAsIDAsIDAsIFBDSV9ERVZJQ0VfSUQpOworCisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChkZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9FNzMyMF9NQ0ggfHwKKwkgICAgZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRTc1MjBfTUNIIHx8CisJICAgIGRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTI1X01DSCkKKwkJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSgpOwogI2VuZGlmCi0JLyogTm8gYnVncyByaWdodCBub3cgKi8KIH0KIAogc3RydWN0IGNoaXBzZXQgewpAQCAtNzYsNiArOTIsNyBAQAogCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIG52aWRpYV9idWdzIH0sCiAJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgdmlhX2J1Z3MgfSwKIAl7IFBDSV9WRU5ET1JfSURfQVRJLCBhdGlfYnVncyB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgaW50ZWxfYnVnc30sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseV9wcmludGsuYwppbmRleCBlMjJlY2Q1Li40N2I2ZDkwMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseV9wcmludGsuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCXJldHVybiAwOwogCWVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQgPSAxOwogCi0JaWYgKCFzdHJjbXAoYnVmLCJrZWVwIikpCisJaWYgKHN0cnN0cihidWYsICJrZWVwIikpCiAJCWtlZXBfZWFybHkgPSAxOwogCiAJaWYgKCFzdHJuY21wKGJ1ZiwgInNlcmlhbCIsIDYpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IDM4YTdiMmQuLjYwMWQzMzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0yMzAsNyArMjMwLDYgQEAKIAlDRklfUkVMX09GRlNFVCByaXAsUklQLUFSR09GRlNFVAogCUdFVF9USFJFQURfSU5GTyglcmN4KQogCXRlc3RsICQoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVHxfVElGX1NFQ0NPTVApLHRocmVhZGluZm9fZmxhZ3MoJXJjeCkKLQlDRklfUkVNRU1CRVJfU1RBVEUKIAlqbnogdHJhY2VzeXMKIAljbXBxICRfX05SX3N5c2NhbGxfbWF4LCVyYXgKIAlqYSBiYWRzeXMKQEAgLTI0MSw3ICsyNDAsNiBAQAogICogU3lzY2FsbCByZXR1cm4gcGF0aCBlbmRpbmcgd2l0aCBTWVNSRVQgKGZhc3QgcGF0aCkKICAqIEhhcyBpbmNvbXBsZXRlIHN0YWNrIGZyYW1lIGFuZCB1bmRlZmluZWQgdG9wIG9mIHN0YWNrLiAKICAqLwkJCi0JLmdsb2JsIHJldF9mcm9tX3N5c19jYWxsCiByZXRfZnJvbV9zeXNfY2FsbDoKIAltb3ZsICRfVElGX0FMTFdPUktfTUFTSywlZWRpCiAJLyogZWRpOglmbGFnbWFzayAqLwpAQCAtMjUxLDggKzI0OSw4IEBACiAJVFJBQ0VfSVJRU19PRkYKIAltb3ZsIHRocmVhZGluZm9fZmxhZ3MoJXJjeCksJWVkeAogCWFuZGwgJWVkaSwlZWR4Ci0JQ0ZJX1JFTUVNQkVSX1NUQVRFCiAJam56ICBzeXNyZXRfY2FyZWZ1bCAKKwlDRklfUkVNRU1CRVJfU1RBVEUKIAkvKgogCSAqIHN5c3JldHEgd2lsbCByZS1lbmFibGUgaW50ZXJydXB0czoKIAkgKi8KQEAgLTI2NSwxMCArMjYzLDEwIEBACiAJc3dhcGdzCiAJc3lzcmV0cQogCisJQ0ZJX1JFU1RPUkVfU1RBVEUKIAkvKiBIYW5kbGUgcmVzY2hlZHVsZXMgKi8KIAkvKiBlZHg6CXdvcmssIGVkaTogd29ya21hc2sgKi8JCiBzeXNyZXRfY2FyZWZ1bDoKLQlDRklfUkVTVE9SRV9TVEFURQogCWJ0ICRUSUZfTkVFRF9SRVNDSEVELCVlZHgKIAlqbmMgc3lzcmV0X3NpZ25hbAogCVRSQUNFX0lSUVNfT04KQEAgLTMwNiw3ICszMDQsNiBAQAogCiAJLyogRG8gc3lzY2FsbCB0cmFjaW5nICovCiB0cmFjZXN5czoJCQkgCi0JQ0ZJX1JFU1RPUkVfU1RBVEUKIAlTQVZFX1JFU1QKIAltb3ZxICQtRU5PU1lTLFJBWCglcnNwKQogCUZJWFVQX1RPUF9PRl9TVEFDSyAlcmRpCkBAIC0zMTUsMzcgKzMxMiwyMCBAQAogCUxPQURfQVJHUyBBUkdPRkZTRVQgIC8qIHJlbG9hZCBhcmdzIGZyb20gc3RhY2sgaW4gY2FzZSBwdHJhY2UgY2hhbmdlZCBpdCAqLwogCVJFU1RPUkVfUkVTVAogCWNtcHEgJF9fTlJfc3lzY2FsbF9tYXgsJXJheAorCW1vdnEgJC1FTk9TWVMsJXJjeAorCWNtb3ZhICVyY3gsJXJheAogCWphICAxZgogCW1vdnEgJXIxMCwlcmN4CS8qIGZpeHVwIGZvciBDICovCiAJY2FsbCAqc3lzX2NhbGxfdGFibGUoLCVyYXgsOCkKIDE6CW1vdnEgJXJheCxSQVgtQVJHT0ZGU0VUKCVyc3ApCiAJLyogVXNlIElSRVQgYmVjYXVzZSB1c2VyIGNvdWxkIGhhdmUgY2hhbmdlZCBmcmFtZSAqLwotCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKLQlDRklfRU5EUFJPQwotRU5EKHN5c3RlbV9jYWxsKQogCQkKIC8qIAogICogU3lzY2FsbCByZXR1cm4gcGF0aCBlbmRpbmcgd2l0aCBJUkVULgogICogSGFzIGNvcnJlY3QgdG9wIG9mIHN0YWNrLCBidXQgcGFydGlhbCBzdGFjayBmcmFtZS4KLSAqLyAJCi1FTlRSWShpbnRfcmV0X2Zyb21fc3lzX2NhbGwpCi0JQ0ZJX1NUQVJUUFJPQwlzaW1wbGUKLQlDRklfU0lHTkFMX0ZSQU1FCi0JQ0ZJX0RFRl9DRkEJcnNwLFNTKzgtQVJHT0ZGU0VUCi0JLypDRklfUkVMX09GRlNFVAlzcyxTUy1BUkdPRkZTRVQqLwotCUNGSV9SRUxfT0ZGU0VUCXJzcCxSU1AtQVJHT0ZGU0VUCi0JLypDRklfUkVMX09GRlNFVAlyZmxhZ3MsRUZMQUdTLUFSR09GRlNFVCovCi0JLypDRklfUkVMX09GRlNFVAljcyxDUy1BUkdPRkZTRVQqLwotCUNGSV9SRUxfT0ZGU0VUCXJpcCxSSVAtQVJHT0ZGU0VUCi0JQ0ZJX1JFTF9PRkZTRVQJcmR4LFJEWC1BUkdPRkZTRVQKLQlDRklfUkVMX09GRlNFVAlyY3gsUkNYLUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUCXJheCxSQVgtQVJHT0ZGU0VUCi0JQ0ZJX1JFTF9PRkZTRVQJcmRpLFJESS1BUkdPRkZTRVQKLQlDRklfUkVMX09GRlNFVAlyc2ksUlNJLUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUCXI4LFI4LUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUCXI5LFI5LUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUCXIxMCxSMTAtQVJHT0ZGU0VUCi0JQ0ZJX1JFTF9PRkZTRVQJcjExLFIxMS1BUkdPRkZTRVQKKyAqLworCS5nbG9ibCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKK2ludF9yZXRfZnJvbV9zeXNfY2FsbDoKIAljbGkKIAlUUkFDRV9JUlFTX09GRgogCXRlc3RsICQzLENTLUFSR09GRlNFVCglcnNwKQpAQCAtMzkyLDggKzM3Miw2IEBACiAJcG9wcSAlcmRpCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC04CiAJYW5kbCAkfihfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0lOR0xFU1RFUCksJWVkaQotCWNsaQotCVRSQUNFX0lSUVNfT0ZGCiAJam1wIGludF9yZXN0b3JlX3Jlc3QKIAkKIGludF9zaWduYWw6CkBAIC00MDksNyArMzg3LDcgQEAKIAlUUkFDRV9JUlFTX09GRgogCWptcCBpbnRfd2l0aF9jaGVjawogCUNGSV9FTkRQUk9DCi1FTkQoaW50X3JldF9mcm9tX3N5c19jYWxsKQorRU5EKHN5c3RlbV9jYWxsKQogCQkKIC8qIAogICogQ2VydGFpbiBzcGVjaWFsIHN5c3RlbSBjYWxscyB0aGF0IG5lZWQgdG8gc2F2ZSBhIGNvbXBsZXRlIGZ1bGwgc3RhY2sgZnJhbWUuCkBAIC01MzUsOCArNTEzLDYgQEAKIDE6CWluY2wJJWdzOnBkYV9pcnFjb3VudAogCWNtb3ZlcSAlZ3M6cGRhX2lycXN0YWNrcHRyLCVyc3AKIAlwdXNoICAgICVyYnAJCQkjIGJhY2tsaW5rIGZvciBvbGQgdW53aW5kZXIKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgOAotCUNGSV9SRUxfT0ZGU0VUIHJicCwwCiAJLyoKIAkgKiBXZSBlbnRlcmVkIGFuIGludGVycnVwdCBjb250ZXh0IC0gaXJxcyBhcmUgb2ZmOgogCSAqLwpAQCAtOTgwLDExICs5NTYsNiBAQAogCWNhbGwgZG9fZm9yawogCW1vdnEgJXJheCxSQVgoJXJzcCkKIAl4b3JsICVlZGksJWVkaQotCXRlc3QgJXJheCwlcmF4Ci0Jam56ICAxZgotCS8qIHRlcm1pbmF0ZSBzdGFjayBpbiBjaGlsZCAqLwotCW1vdnEgJXJkaSxSSVAoJXJzcCkKLTE6CiAKIAkvKgogCSAqIEl0IGlzbid0IHdvcnRoIHRvIGNoZWNrIGZvciByZXNjaGVkdWxlIGhlcmUsCkBAIC0xMTc2LDcgKzExNDcsNiBAQAogCWluY2wgJWdzOnBkYV9pcnFjb3VudAogCWNtb3ZlICVnczpwZGFfaXJxc3RhY2twdHIsJXJzcAogCXB1c2ggICVyYnAJCQkjIGJhY2tsaW5rIGZvciBvbGQgdW53aW5kZXIKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgICAgOAogCWNhbGwgX19kb19zb2Z0aXJxCiAJbGVhdmVxCiAJQ0ZJX0RFRl9DRkFfUkVHSVNURVIJcnNwCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWMuYwppbmRleCA4ZTc4YTc1Li5iMDA3NDMzIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljLmMKQEAgLTMzLDcgKzMzLDcgQEAKIGV4dGVybiBzdHJ1Y3QgZ2VuYXBpYyBhcGljX3BoeXNmbGF0OwogCiBzdHJ1Y3QgZ2VuYXBpYyAqZ2VuYXBpYyA9ICZhcGljX2ZsYXQ7Ci0KK3N0cnVjdCBnZW5hcGljICpnZW5hcGljX2ZvcmNlOwogCiAvKgogICogQ2hlY2sgdGhlIEFQSUMgSURzIGluIGJpb3NfY3B1X2FwaWNpZCBhbmQgY2hvb3NlIHRoZSBBUElDIG1vZGUuCkBAIC00Niw2ICs0NiwxMyBAQAogCXU4IGNsdXN0ZXJfY250W05VTV9BUElDX0NMVVNURVJTXTsKIAlpbnQgbWF4X2FwaWMgPSAwOwogCisJLyogZ2VuYXBpYyBzZWxlY3Rpb24gY2FuIGJlIGZvcmNlZCBiZWNhdXNlIG9mIGNlcnRhaW4gcXVpcmtzLgorCSAqLworCWlmIChnZW5hcGljX2ZvcmNlKSB7CisJCWdlbmFwaWMgPSBnZW5hcGljX2ZvcmNlOworCQlnb3RvIHByaW50OworCX0KKwogI2lmIGRlZmluZWQoQ09ORklHX0FDUEkpCiAJLyoKIAkgKiBTb21lIHg4Nl82NCBtYWNoaW5lcyB1c2UgcGh5c2ljYWwgQVBJQyBtb2RlIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYwppbmRleCAwZGZjMjIzLi43YzAxZGI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAogc3RhdGljIGNwdW1hc2tfdCBwaHlzZmxhdF90YXJnZXRfY3B1cyh2b2lkKQogewotCXJldHVybiBjcHVtYXNrX29mX2NwdSgwKTsKKwlyZXR1cm4gY3B1X29ubGluZV9tYXA7CiB9CiAKIHN0YXRpYyBjcHVtYXNrX3QgcGh5c2ZsYXRfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluKGludCBjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZDY0LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZDY0LmMKaW5kZXggOTU2MWViMy4uY2MyMzBiOSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQuYwpAQCAtNTcsMTAgKzU3LDEyIEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJLyogY2xlYXIgYnNzIGJlZm9yZSBzZXRfaW50cl9nYXRlIHdpdGggZWFybHlfaWR0X2hhbmRsZXIgKi8KKwljbGVhcl9ic3MoKTsKKworCWZvciAoaSA9IDA7IGkgPCBJRFRfRU5UUklFUzsgaSsrKQogCQlzZXRfaW50cl9nYXRlKGksIGVhcmx5X2lkdF9oYW5kbGVyKTsKIAlhc20gdm9sYXRpbGUoImxpZHQgJTAiIDo6ICJtIiAoaWR0X2Rlc2NyKSk7Ci0JY2xlYXJfYnNzKCk7CiAKIAllYXJseV9wcmludGsoIktlcm5lbCBhbGl2ZVxuIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pMzg3LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jCmluZGV4IDNhYTFlOWIuLjFkNThjMTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pMzg3LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2kzODcuYwpAQCAtODIsMTEgKzgyLDggQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJaW50IGVyciA9IDA7CiAKLQl7IAotCQlleHRlcm4gdm9pZCBiYWRfdXNlcl9pMzg3X3N0cnVjdCh2b2lkKTsgCi0JCWlmIChzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpICE9IHNpemVvZih0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSkpCi0JCQliYWRfdXNlcl9pMzg3X3N0cnVjdCgpOwotCX0gCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCkgIT0KKwkJCXNpemVvZih0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSkpOwogCiAJaWYgKCh1bnNpZ25lZCBsb25nKWJ1ZiAlIDE2KSAKIAkJcHJpbnRrKCJzYXZlX2kzODc6IGJhZCBmcHN0YXRlICVwXG4iLGJ1Zik7IApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwppbmRleCAwNjEyYTMzLi5kNzNjNzllIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwpAQCAtNzYsNyArNzYsOCBAQAogCUlSUSh4LDgpLCBJUlEoeCw5KSwgSVJRKHgsYSksIElSUSh4LGIpLCBcCiAJSVJRKHgsYyksIElSUSh4LGQpLCBJUlEoeCxlKSwgSVJRKHgsZikKIAotdm9pZCAoKmludGVycnVwdFtOUl9JUlFTXSkodm9pZCkgPSB7CisvKiBmb3IgdGhlIGlycSB2ZWN0b3JzICovCitzdGF0aWMgdm9pZCAoKmludGVycnVwdFtOUl9WRUNUT1JTIC0gRklSU1RfRVhURVJOQUxfVkVDVE9SXSkodm9pZCkgPSB7CiAJCQkJCSAgSVJRTElTVF8xNigweDIpLCBJUlFMSVNUXzE2KDB4MyksCiAJSVJRTElTVF8xNigweDQpLCBJUlFMSVNUXzE2KDB4NSksIElSUUxJU1RfMTYoMHg2KSwgSVJRTElTVF8xNigweDcpLAogCUlSUUxJU1RfMTYoMHg4KSwgSVJRTElTVF8xNigweDkpLCBJUlFMSVNUXzE2KDB4YSksIElSUUxJU1RfMTYoMHhiKSwKQEAgLTE3OCw3ICsxNzksOCBAQAogewogCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwogCWlvX2FwaWNfaXJxcyAmPSB+KDE8PGlycSk7Ci0Jc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmk4MjU5QV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpODI1OUFfY2hpcCwgaGFuZGxlX2xldmVsX2lycSwKKwkJCQkgICAgICAiWFQiKTsKIAllbmFibGVfaXJxKGlycSk7CiB9CiAKQEAgLTQzMSw4ICs0MzMsOCBAQAogCQkJLyoKIAkJCSAqIDE2IG9sZC1zdHlsZSBJTlRBLWN5Y2xlIGludGVycnVwdHM6CiAJCQkgKi8KLQkJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmaTgyNTlBX2NoaXAsCi0JCQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpLCAmaTgyNTlBX2NoaXAsCisJCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAiWFQiKTsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiAnaGlnaCcgUENJIElSUXMgZmlsbGVkIGluIG9uIGRlbWFuZApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKaW5kZXggNDRiNTVmOC4uMmExZGNkNSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCkBAIC01NSwxNSArNTUsMTEgQEAKIAogc3RhdGljIGludCBub190aW1lcl9jaGVjazsKIAotc3RhdGljIGludCBkaXNhYmxlX3RpbWVyX3Bpbl8xIF9faW5pdGRhdGE7Ci0KLWludCB0aW1lcl9vdmVyXzgyNTQgX19pbml0ZGF0YSA9IDA7Ci0KIC8qIFdoZXJlIGlmIGFueXdoZXJlIGlzIHRoZSBpODI1OSBjb25uZWN0IGluIGV4dGVybmFsIGludCBtb2RlICovCiBzdGF0aWMgc3RydWN0IHsgaW50IHBpbiwgYXBpYzsgfSBpb2FwaWNfaTgyNTkgPSB7IC0xLCAtMSB9OwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvYXBpY19sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodmVjdG9yX2xvY2spOworREVGSU5FX1NQSU5MT0NLKHZlY3Rvcl9sb2NrKTsKIAogLyoKICAqICMgb2YgSVJRIHJvdXRpbmcgcmVnaXN0ZXJzCkBAIC04OCw2ICs4NCw1MiBAQAogCXNob3J0IGFwaWMsIHBpbiwgbmV4dDsKIH0gaXJxXzJfcGluW1BJTl9NQVBfU0laRV07CiAKK3N0cnVjdCBpb19hcGljIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHVudXNlZFszXTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKK307CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9jb25zdF9fIHN0cnVjdCBpb19hcGljIF9faW9tZW0gKmlvX2FwaWNfYmFzZShpbnQgaWR4KQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopIF9fZml4X3RvX3ZpcnQoRklYX0lPX0FQSUNfQkFTRV8wICsgaWR4KQorCQkrIChtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyICYgflBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlvX2FwaWNfcmVhZCh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOworCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CisJcmV0dXJuIHJlYWRsKCZpb19hcGljLT5kYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfd3JpdGUodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaW9fYXBpYyBfX2lvbWVtICppb19hcGljID0gaW9fYXBpY19iYXNlKGFwaWMpOworCXdyaXRlbChyZWcsICZpb19hcGljLT5pbmRleCk7CisJd3JpdGVsKHZhbHVlLCAmaW9fYXBpYy0+ZGF0YSk7Cit9CisKKy8qCisgKiBSZS13cml0ZSBhIHZhbHVlOiB0byBiZSB1c2VkIGZvciByZWFkLW1vZGlmeS13cml0ZQorICogY3ljbGVzIHdoZXJlIHRoZSByZWFkIGFscmVhZHkgc2V0IHVwIHRoZSBpbmRleCByZWdpc3Rlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfbW9kaWZ5KHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGlvX2FwaWMgX19pb21lbSAqaW9fYXBpYyA9IGlvX2FwaWNfYmFzZShhcGljKTsKKwl3cml0ZWwodmFsdWUsICZpb19hcGljLT5kYXRhKTsKK30KKworLyoKKyAqIFN5bmNocm9uaXplIHRoZSBJTy1BUElDIGFuZCB0aGUgQ1BVIGJ5IGRvaW5nCisgKiBhIGR1bW15IHJlYWQgZnJvbSB0aGUgSU8tQVBJQworICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19zeW5jKHVuc2lnbmVkIGludCBhcGljKQoreworCXN0cnVjdCBpb19hcGljIF9faW9tZW0gKmlvX2FwaWMgPSBpb19hcGljX2Jhc2UoYXBpYyk7CisJcmVhZGwoJmlvX2FwaWMtPmRhdGEpOworfQorCiAjZGVmaW5lIF9fRE9fQUNUSU9OKFIsIEFDVElPTiwgRklOQUwpCQkJCQlcCiAJCQkJCQkJCQlcCiB7CQkJCQkJCQkJXApAQCAtMTI2LDExICsxNjgsMzkgQEAKIAlyZXR1cm4gZXUuZW50cnk7CiB9CiAKKy8qCisgKiBXaGVuIHdlIHdyaXRlIGEgbmV3IElPIEFQSUMgcm91dGluZyBlbnRyeSwgd2UgbmVlZCB0byB3cml0ZSB0aGUgaGlnaAorICogd29yZCBmaXJzdCEgSWYgdGhlIG1hc2sgYml0IGluIHRoZSBsb3cgd29yZCBpcyBjbGVhciwgd2Ugd2lsbCBlbmFibGUKKyAqIHRoZSBpbnRlcnJ1cHQsIGFuZCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZW50cnkgaXMgZnVsbHkgcG9wdWxhdGVkCisgKiBiZWZvcmUgdGhhdCBoYXBwZW5zLgorICovCitzdGF0aWMgdm9pZAorX19pb2FwaWNfd3JpdGVfZW50cnkoaW50IGFwaWMsIGludCBwaW4sIHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGUpCit7CisJdW5pb24gZW50cnlfdW5pb24gZXU7CisJZXUuZW50cnkgPSBlOworCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIDIqcGluLCBldS53Mik7CisJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMipwaW4sIGV1LncxKTsKK30KKwogc3RhdGljIHZvaWQgaW9hcGljX3dyaXRlX2VudHJ5KGludCBhcGljLCBpbnQgcGluLCBzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5pb24gZW50cnlfdW5pb24gZXU7Ci0JZXUuZW50cnkgPSBlOworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCV9faW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFdoZW4gd2UgbWFzayBhbiBJTyBBUElDIHJvdXRpbmcgZW50cnksIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGxvdworICogd29yZCBmaXJzdCwgaW4gb3JkZXIgdG8gc2V0IHRoZSBtYXNrIGJpdCBiZWZvcmUgd2UgY2hhbmdlIHRoZQorICogaGlnaCBiaXRzIQorICovCitzdGF0aWMgdm9pZCBpb2FwaWNfbWFza19lbnRyeShpbnQgYXBpYywgaW50IHBpbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuaW9uIGVudHJ5X3VuaW9uIGV1ID0geyAuZW50cnkubWFzayA9IDEgfTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMCArIDIqcGluLCBldS53MSk7CiAJaW9fYXBpY193cml0ZShhcGljLCAweDExICsgMipwaW4sIGV1LncyKTsKQEAgLTI1Niw5ICszMjYsNyBAQAogCS8qCiAJICogRGlzYWJsZSBpdCBpbiB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKIAkgKi8KLQltZW1zZXQoJmVudHJ5LCAwLCBzaXplb2YoZW50cnkpKTsKLQllbnRyeS5tYXNrID0gMTsKLQlpb2FwaWNfd3JpdGVfZW50cnkoYXBpYywgcGluLCBlbnRyeSk7CisJaW9hcGljX21hc2tfZW50cnkoYXBpYywgcGluKTsKIH0KIAogc3RhdGljIHZvaWQgY2xlYXJfSU9fQVBJQyAodm9pZCkKQEAgLTI4MiwyOSArMzUwLDYgQEAKIH0KIGVhcmx5X3BhcmFtKCJub2FwaWMiLCBkaXNhYmxlX2lvYXBpY19zZXR1cCk7CiAKLS8qIEFjdHVhbGx5IHRoZSBuZXh0IGlzIG9ic29sZXRlLCBidXQga2VlcCBpdCBmb3IgcGFyYW5vaWQgcmVhc29ucyAtQUsgKi8KLXN0YXRpYyBpbnQgX19pbml0IGRpc2FibGVfdGltZXJfcGluX3NldHVwKGNoYXIgKmFyZykKLXsKLQlkaXNhYmxlX3RpbWVyX3Bpbl8xID0gMTsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoImRpc2FibGVfdGltZXJfcGluXzEiLCBkaXNhYmxlX3RpbWVyX3Bpbl9zZXR1cCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNldHVwX2Rpc2FibGVfODI1NF90aW1lcihjaGFyICpzKQotewotCXRpbWVyX292ZXJfODI1NCA9IC0xOwotCXJldHVybiAxOwotfQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfZW5hYmxlXzgyNTRfdGltZXIoY2hhciAqcykKLXsKLQl0aW1lcl9vdmVyXzgyNTQgPSAyOwotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJkaXNhYmxlXzgyNTRfdGltZXIiLCBzZXR1cF9kaXNhYmxlXzgyNTRfdGltZXIpOwotX19zZXR1cCgiZW5hYmxlXzgyNTRfdGltZXIiLCBzZXR1cF9lbmFibGVfODI1NF90aW1lcik7Ci0KLQogLyoKICAqIEZpbmQgdGhlIElSUSBlbnRyeSBudW1iZXIgb2YgYSBjZXJ0YWluIHBpbi4KICAqLwpAQCAtNjEyLDE1ICs2NTcsMTUgQEAKIAkgKiBBbHNvLCB3ZSd2ZSBnb3QgdG8gYmUgY2FyZWZ1bCBub3QgdG8gdHJhc2ggZ2F0ZQogCSAqIDB4ODAsIGJlY2F1c2UgaW50IDB4ODAgaXMgaG0sIGtpbmQgb2YgaW1wb3J0YW50aXNoLiA7KQogCSAqLwotCXN0YXRpYyBzdHJ1Y3QgewotCQlpbnQgdmVjdG9yOwotCQlpbnQgb2Zmc2V0OwotCX0gcG9zW05SX0NQVVNdID0geyBbIDAgLi4uIE5SX0NQVVMgLSAxXSA9IHtGSVJTVF9ERVZJQ0VfVkVDVE9SLCAwfSB9OworCXN0YXRpYyBpbnQgY3VycmVudF92ZWN0b3IgPSBGSVJTVF9ERVZJQ0VfVkVDVE9SLCBjdXJyZW50X29mZnNldCA9IDA7CiAJaW50IG9sZF92ZWN0b3IgPSAtMTsKIAlpbnQgY3B1OwogCiAJQlVHX09OKCh1bnNpZ25lZClpcnEgPj0gTlJfSVJRX1ZFQ1RPUlMpOwogCisJLyogT25seSB0cnkgYW5kIGFsbG9jYXRlIGlycXMgb24gY3B1cyB0aGF0IGFyZSBwcmVzZW50ICovCisJY3B1c19hbmQobWFzaywgbWFzaywgY3B1X29ubGluZV9tYXApOworCiAJaWYgKGlycV92ZWN0b3JbaXJxXSA+IDApCiAJCW9sZF92ZWN0b3IgPSBpcnFfdmVjdG9yW2lycV07CiAJaWYgKG9sZF92ZWN0b3IgPiAwKSB7CkBAIC02MzAsMTUgKzY3NSwxNSBAQAogCX0KIAogCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykgewotCQljcHVtYXNrX3QgZG9tYWluOwotCQlpbnQgZmlyc3QsIG5ld19jcHU7CisJCWNwdW1hc2tfdCBkb21haW4sIG5ld19tYXNrOworCQlpbnQgbmV3X2NwdTsKIAkJaW50IHZlY3Rvciwgb2Zmc2V0OwogCiAJCWRvbWFpbiA9IHZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbihjcHUpOwotCQlmaXJzdCA9IGZpcnN0X2NwdShkb21haW4pOworCQljcHVzX2FuZChuZXdfbWFzaywgZG9tYWluLCBjcHVfb25saW5lX21hcCk7CiAKLQkJdmVjdG9yID0gcG9zW2ZpcnN0XS52ZWN0b3I7Ci0JCW9mZnNldCA9IHBvc1tmaXJzdF0ub2Zmc2V0OworCQl2ZWN0b3IgPSBjdXJyZW50X3ZlY3RvcjsKKwkJb2Zmc2V0ID0gY3VycmVudF9vZmZzZXQ7CiBuZXh0OgogCQl2ZWN0b3IgKz0gODsKIAkJaWYgKHZlY3RvciA+PSBGSVJTVF9TWVNURU1fVkVDVE9SKSB7CkBAIC02NDYsMjQgKzY5MSwyNCBAQAogCQkJb2Zmc2V0ID0gKG9mZnNldCArIDEpICUgODsKIAkJCXZlY3RvciA9IEZJUlNUX0RFVklDRV9WRUNUT1IgKyBvZmZzZXQ7CiAJCX0KLQkJaWYgKHVubGlrZWx5KHBvc1tmaXJzdF0udmVjdG9yID09IHZlY3RvcikpCisJCWlmICh1bmxpa2VseShjdXJyZW50X3ZlY3RvciA9PSB2ZWN0b3IpKQogCQkJY29udGludWU7CiAJCWlmICh2ZWN0b3IgPT0gSUEzMl9TWVNDQUxMX1ZFQ1RPUikKIAkJCWdvdG8gbmV4dDsKLQkJZm9yX2VhY2hfY3B1X21hc2sobmV3X2NwdSwgZG9tYWluKQotCQkJaWYgKHBlcl9jcHUodmVjdG9yX2lycSwgY3B1KVt2ZWN0b3JdICE9IC0xKQorCQlmb3JfZWFjaF9jcHVfbWFzayhuZXdfY3B1LCBuZXdfbWFzaykKKwkJCWlmIChwZXJfY3B1KHZlY3Rvcl9pcnEsIG5ld19jcHUpW3ZlY3Rvcl0gIT0gLTEpCiAJCQkJZ290byBuZXh0OwogCQkvKiBGb3VuZCBvbmUhICovCi0JCWZvcl9lYWNoX2NwdV9tYXNrKG5ld19jcHUsIGRvbWFpbikgewotCQkJcG9zW2NwdV0udmVjdG9yID0gdmVjdG9yOwotCQkJcG9zW2NwdV0ub2Zmc2V0ID0gb2Zmc2V0OwotCQl9CisJCWN1cnJlbnRfdmVjdG9yID0gdmVjdG9yOworCQljdXJyZW50X29mZnNldCA9IG9mZnNldDsKIAkJaWYgKG9sZF92ZWN0b3IgPj0gMCkgeworCQkJY3B1bWFza190IG9sZF9tYXNrOwogCQkJaW50IG9sZF9jcHU7Ci0JCQlmb3JfZWFjaF9jcHVfbWFzayhvbGRfY3B1LCBpcnFfZG9tYWluW2lycV0pCisJCQljcHVzX2FuZChvbGRfbWFzaywgaXJxX2RvbWFpbltpcnFdLCBjcHVfb25saW5lX21hcCk7CisJCQlmb3JfZWFjaF9jcHVfbWFzayhvbGRfY3B1LCBvbGRfbWFzaykKIAkJCQlwZXJfY3B1KHZlY3Rvcl9pcnEsIG9sZF9jcHUpW29sZF92ZWN0b3JdID0gLTE7CiAJCX0KLQkJZm9yX2VhY2hfY3B1X21hc2sobmV3X2NwdSwgZG9tYWluKQorCQlmb3JfZWFjaF9jcHVfbWFzayhuZXdfY3B1LCBuZXdfbWFzaykKIAkJCXBlcl9jcHUodmVjdG9yX2lycSwgbmV3X2NwdSlbdmVjdG9yXSA9IGlycTsKIAkJaXJxX3ZlY3RvcltpcnFdID0gdmVjdG9yOwogCQlpcnFfZG9tYWluW2lycV0gPSBkb21haW47CkBAIC02ODQsNiArNzI5LDQ2IEBACiAJcmV0dXJuIHZlY3RvcjsKIH0KIAorc3RhdGljIHZvaWQgX19jbGVhcl9pcnFfdmVjdG9yKGludCBpcnEpCit7CisJY3B1bWFza190IG1hc2s7CisJaW50IGNwdSwgdmVjdG9yOworCisJQlVHX09OKCFpcnFfdmVjdG9yW2lycV0pOworCisJdmVjdG9yID0gaXJxX3ZlY3RvcltpcnFdOworCWNwdXNfYW5kKG1hc2ssIGlycV9kb21haW5baXJxXSwgY3B1X29ubGluZV9tYXApOworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykKKwkJcGVyX2NwdSh2ZWN0b3JfaXJxLCBjcHUpW3ZlY3Rvcl0gPSAtMTsKKworCWlycV92ZWN0b3JbaXJxXSA9IDA7CisJaXJxX2RvbWFpbltpcnFdID0gQ1BVX01BU0tfTk9ORTsKK30KKwordm9pZCBfX3NldHVwX3ZlY3Rvcl9pcnEoaW50IGNwdSkKK3sKKwkvKiBJbml0aWFsaXplIHZlY3Rvcl9pcnEgb24gYSBuZXcgY3B1ICovCisJLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHZlY3Rvcl9sb2NrIGhlbGQgKi8KKwlpbnQgaXJxLCB2ZWN0b3I7CisKKwkvKiBNYXJrIHRoZSBpbnVzZSB2ZWN0b3JzICovCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFfVkVDVE9SUzsgKytpcnEpIHsKKwkJaWYgKCFjcHVfaXNzZXQoY3B1LCBpcnFfZG9tYWluW2lycV0pKQorCQkJY29udGludWU7CisJCXZlY3RvciA9IGlycV92ZWN0b3JbaXJxXTsKKwkJcGVyX2NwdSh2ZWN0b3JfaXJxLCBjcHUpW3ZlY3Rvcl0gPSBpcnE7CisJfQorCS8qIE1hcmsgdGhlIGZyZWUgdmVjdG9ycyAqLworCWZvciAodmVjdG9yID0gMDsgdmVjdG9yIDwgTlJfVkVDVE9SUzsgKyt2ZWN0b3IpIHsKKwkJaXJxID0gcGVyX2NwdSh2ZWN0b3JfaXJxLCBjcHUpW3ZlY3Rvcl07CisJCWlmIChpcnEgPCAwKQorCQkJY29udGludWU7CisJCWlmICghY3B1X2lzc2V0KGNwdSwgaXJxX2RvbWFpbltpcnFdKSkKKwkJCXBlcl9jcHUodmVjdG9yX2lycSwgY3B1KVt2ZWN0b3JdID0gLTE7CisJfQorfQorCisKIGV4dGVybiB2b2lkICgqaW50ZXJydXB0W05SX0lSUVNdKSh2b2lkKTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpb2FwaWNfY2hpcDsKQEAgLTY5NiwzNCArNzgxLDc0IEBACiB7CiAJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKIAkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmaW9hcGljX2NoaXAsCi0JCQkJCSBoYW5kbGVfZmFzdGVvaV9pcnEpOwotCWVsc2UKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmlvYXBpY19jaGlwLAotCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaW9hcGljX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9mYXN0ZW9pX2lycSwgImZhc3Rlb2kiKTsKKwllbHNlIHsKKwkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgfD0gSVJRX0RFTEFZRURfRElTQUJMRTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaW9hcGljX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9lZGdlX2lycSwgImVkZ2UiKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfSU9fQVBJQ19pcnEoaW50IGFwaWMsIGludCBwaW4sIGludCBpZHgsIGludCBpcnEpCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJaW50IHZlY3RvcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwkvKgorCSAqIGFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKKwkgKi8KKwltZW1zZXQoJmVudHJ5LDAsc2l6ZW9mKGVudHJ5KSk7CisKKwllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7CisJZW50cnkuZGVzdF9tb2RlID0gSU5UX0RFU1RfTU9ERTsKKwllbnRyeS5tYXNrID0gMDsJCQkJLyogZW5hYmxlIElSUSAqLworCWVudHJ5LmRlc3QubG9naWNhbC5sb2dpY2FsX2Rlc3QgPSBjcHVfbWFza190b19hcGljaWQoVEFSR0VUX0NQVVMpOworCisJZW50cnkudHJpZ2dlciA9IGlycV90cmlnZ2VyKGlkeCk7CisJZW50cnkucG9sYXJpdHkgPSBpcnFfcG9sYXJpdHkoaWR4KTsKKworCWlmIChpcnFfdHJpZ2dlcihpZHgpKSB7CisJCWVudHJ5LnRyaWdnZXIgPSAxOworCQllbnRyeS5tYXNrID0gMTsKKwkJZW50cnkuZGVzdC5sb2dpY2FsLmxvZ2ljYWxfZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZChUQVJHRVRfQ1BVUyk7CisJfQorCisJaWYgKCFhcGljICYmICFJT19BUElDX0lSUShpcnEpKQorCQlyZXR1cm47CisKKwlpZiAoSU9fQVBJQ19JUlEoaXJxKSkgeworCQljcHVtYXNrX3QgbWFzazsKKwkJdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoaXJxLCBUQVJHRVRfQ1BVUywgJm1hc2spOworCQlpZiAodmVjdG9yIDwgMCkKKwkJCXJldHVybjsKKworCQllbnRyeS5kZXN0LmxvZ2ljYWwubG9naWNhbF9kZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKG1hc2spOworCQllbnRyeS52ZWN0b3IgPSB2ZWN0b3I7CisKKwkJaW9hcGljX3JlZ2lzdGVyX2ludHIoaXJxLCB2ZWN0b3IsIElPQVBJQ19BVVRPKTsKKwkJaWYgKCFhcGljICYmIChpcnEgPCAxNikpCisJCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOworCX0KKworCWlvYXBpY193cml0ZV9lbnRyeShhcGljLCBwaW4sIGVudHJ5KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCXNldF9uYXRpdmVfaXJxX2luZm8oaXJxLCBUQVJHRVRfQ1BVUyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfSU9fQVBJQ19pcnFzKHZvaWQpCiB7Ci0Jc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7Ci0JaW50IGFwaWMsIHBpbiwgaWR4LCBpcnEsIGZpcnN0X25vdGNvbiA9IDEsIHZlY3RvcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBhcGljLCBwaW4sIGlkeCwgaXJxLCBmaXJzdF9ub3Rjb24gPSAxOwogCiAJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHICJpbml0IElPX0FQSUMgSVJRc1xuIik7CiAKIAlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKSB7CiAJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdOyBwaW4rKykgewogCi0JCS8qCi0JCSAqIGFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKLQkJICovCi0JCW1lbXNldCgmZW50cnksMCxzaXplb2YoZW50cnkpKTsKLQotCQllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7Ci0JCWVudHJ5LmRlc3RfbW9kZSA9IElOVF9ERVNUX01PREU7Ci0JCWVudHJ5Lm1hc2sgPSAwOwkJCQkvKiBlbmFibGUgSVJRICovCi0JCWVudHJ5LmRlc3QubG9naWNhbC5sb2dpY2FsX2Rlc3QgPSBjcHVfbWFza190b19hcGljaWQoVEFSR0VUX0NQVVMpOwotCiAJCWlkeCA9IGZpbmRfaXJxX2VudHJ5KGFwaWMscGluLG1wX0lOVCk7CiAJCWlmIChpZHggPT0gLTEpIHsKIAkJCWlmIChmaXJzdF9ub3Rjb24pIHsKQEAgLTczNCwzOSArODU5LDExIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWVudHJ5LnRyaWdnZXIgPSBpcnFfdHJpZ2dlcihpZHgpOwotCQllbnRyeS5wb2xhcml0eSA9IGlycV9wb2xhcml0eShpZHgpOwotCi0JCWlmIChpcnFfdHJpZ2dlcihpZHgpKSB7Ci0JCQllbnRyeS50cmlnZ2VyID0gMTsKLQkJCWVudHJ5Lm1hc2sgPSAxOwotCQkJZW50cnkuZGVzdC5sb2dpY2FsLmxvZ2ljYWxfZGVzdCA9IGNwdV9tYXNrX3RvX2FwaWNpZChUQVJHRVRfQ1BVUyk7Ci0JCX0KLQogCQlpcnEgPSBwaW5fMl9pcnEoaWR4LCBhcGljLCBwaW4pOwogCQlhZGRfcGluX3RvX2lycShpcnEsIGFwaWMsIHBpbik7CiAKLQkJaWYgKCFhcGljICYmICFJT19BUElDX0lSUShpcnEpKQotCQkJY29udGludWU7CisJCXNldHVwX0lPX0FQSUNfaXJxKGFwaWMsIHBpbiwgaWR4LCBpcnEpOwogCi0JCWlmIChJT19BUElDX0lSUShpcnEpKSB7Ci0JCQljcHVtYXNrX3QgbWFzazsKLQkJCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgVEFSR0VUX0NQVVMsICZtYXNrKTsKLQkJCWlmICh2ZWN0b3IgPCAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQllbnRyeS5kZXN0LmxvZ2ljYWwubG9naWNhbF9kZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKG1hc2spOwotCQkJZW50cnkudmVjdG9yID0gdmVjdG9yOwotCi0JCQlpb2FwaWNfcmVnaXN0ZXJfaW50cihpcnEsIHZlY3RvciwgSU9BUElDX0FVVE8pOwotCQkJaWYgKCFhcGljICYmIChpcnEgPCAxNikpCi0JCQkJZGlzYWJsZV84MjU5QV9pcnEoaXJxKTsKLQkJfQotCQlpb2FwaWNfd3JpdGVfZW50cnkoYXBpYywgcGluLCBlbnRyeSk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JCXNldF9uYXRpdmVfaXJxX2luZm8oaXJxLCBUQVJHRVRfQ1BVUyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiAJfQogCX0KIApAQCAtODA2LDcgKzkwMyw3IEBACiAJICogVGhlIHRpbWVyIElSUSBkb2Vzbid0IGhhdmUgdG8ga25vdyB0aGF0IGJlaGluZCB0aGUKIAkgKiBzY2VuZSB3ZSBoYXZlIGEgODI1OUEtbWFzdGVyIGluIEFFT0kgbW9kZSAuLi4KIAkgKi8KLQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoMCwgJmlvYXBpY19jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKDAsICZpb2FwaWNfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwogCiAJLyoKIAkgKiBBZGQgaXQgdG8gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CkBAIC0xMjU1LDEyICsxMzUyLDE1IEBACiB7CiAJY3B1bWFza190IG1hc2s7CiAJdW5zaWduZWQgdmVjdG9yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKIAl2ZWN0b3IgPSBpcnFfdmVjdG9yW2lycV07CiAJY3B1c19jbGVhcihtYXNrKTsKLQljcHVfc2V0KHZlY3RvciA+PiA4LCBtYXNrKTsKKwljcHVfc2V0KGZpcnN0X2NwdShpcnFfZG9tYWluW2lycV0pLCBtYXNrKTsKIAotCXNlbmRfSVBJX21hc2sobWFzaywgdmVjdG9yICYgMHhmZik7CisJc2VuZF9JUElfbWFzayhtYXNrLCB2ZWN0b3IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZlY3Rvcl9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTE0NjgsMTAgKzE1NjgsMzMgQEAKICAqIGEgd2lkZSByYW5nZSBvZiBib2FyZHMgYW5kIEJJT1MgYnVncy4gIEZvcnR1bmF0ZWx5IG9ubHkgdGhlIHRpbWVyIElSUQogICogaXMgc28gc2NyZXd5LiAgVGhhbmtzIHRvIEJyaWFuIFBlcmtpbnMgZm9yIHRlc3RpbmcvaGFja2luZyB0aGlzIGJlYXN0CiAgKiBmYW5hdGljYWxseSBvbiBoaXMgdHJ1bHkgYnVnZ3kgYm9hcmQuCi0gKgotICogRklYTUU6IHJlYWxseSBuZWVkIHRvIHJldmFtcCB0aGlzIGZvciBtb2Rlcm4gcGxhdGZvcm1zIG9ubHkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja190aW1lcih2b2lkKQorCitzdGF0aWMgaW50IHRyeV9hcGljX3BpbihpbnQgYXBpYywgaW50IHBpbiwgY2hhciAqbXNnKQoreworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9JTkZPCisJCSAgICAiLi5USU1FUjogdHJ5aW5nIElPLUFQSUM9JWQgUElOPSVkICVzIiwKKwkJICAgIGFwaWMsIHBpbiwgbXNnKTsKKworCS8qCisJICogT2ssIGRvZXMgSVJRMCB0aHJvdWdoIHRoZSBJT0FQSUMgd29yaz8KKwkgKi8KKwlpZiAoIW5vX3RpbWVyX2NoZWNrICYmIHRpbWVyX2lycV93b3JrcygpKSB7CisJCW5taV93YXRjaGRvZ19kZWZhdWx0KCk7CisJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJCWRpc2FibGVfODI1OUFfaXJxKDApOworCQkJc2V0dXBfbm1pKCk7CisJCQllbmFibGVfODI1OUFfaXJxKDApOworCQl9CisJCXJldHVybiAxOworCX0KKwljbGVhcl9JT19BUElDX3BpbihhcGljLCBwaW4pOworCWFwaWNfcHJpbnRrKEFQSUNfUVVJRVQsIEtFUk5fRVJSICIgLi4gZmFpbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGZ1bmN0aW9uIGZyb20gaGVsbCAqLworc3RhdGljIHZvaWQgY2hlY2tfdGltZXIodm9pZCkKIHsKIAlpbnQgYXBpYzEsIHBpbjEsIGFwaWMyLCBwaW4yOwogCWludCB2ZWN0b3I7CkBAIC0xNDkyLDYxICsxNjE1LDQzIEBACiAJICovCiAJYXBpY193cml0ZShBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCB8IEFQSUNfRE1fRVhUSU5UKTsKIAlpbml0XzgyNTlBKDEpOwotCWlmICh0aW1lcl9vdmVyXzgyNTQgPiAwKQotCQllbmFibGVfODI1OUFfaXJxKDApOwogCiAJcGluMSAgPSBmaW5kX2lzYV9pcnFfcGluKDAsIG1wX0lOVCk7CiAJYXBpYzEgPSBmaW5kX2lzYV9pcnFfYXBpYygwLCBtcF9JTlQpOwogCXBpbjIgID0gaW9hcGljX2k4MjU5LnBpbjsKIAlhcGljMiA9IGlvYXBpY19pODI1OS5hcGljOwogCi0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLEtFUk5fSU5GTyAiLi5USU1FUjogdmVjdG9yPTB4JTAyWCBhcGljMT0lZCBwaW4xPSVkIGFwaWMyPSVkIHBpbjI9JWRcbiIsCi0JCXZlY3RvciwgYXBpYzEsIHBpbjEsIGFwaWMyLCBwaW4yKTsKKwkvKiBEbyB0aGlzIGZpcnN0LCBvdGhlcndpc2Ugd2UgZ2V0IGRvdWJsZSBpbnRlcnJ1cHRzIG9uIEFUSSBib2FyZHMgKi8KKwlpZiAoKHBpbjEgIT0gLTEpICYmIHRyeV9hcGljX3BpbihhcGljMSwgcGluMSwid2l0aCA4MjU5IElSUTAgZGlzYWJsZWQiKSkKKwkJcmV0dXJuOwogCi0JaWYgKHBpbjEgIT0gLTEpIHsKLQkJLyoKLQkJICogT2ssIGRvZXMgSVJRMCB0aHJvdWdoIHRoZSBJT0FQSUMgd29yaz8KLQkJICovCi0JCXVubWFza19JT19BUElDX2lycSgwKTsKLQkJaWYgKCFub190aW1lcl9jaGVjayAmJiB0aW1lcl9pcnFfd29ya3MoKSkgewotCQkJbm1pX3dhdGNoZG9nX2RlZmF1bHQoKTsKLQkJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKLQkJCQlkaXNhYmxlXzgyNTlBX2lycSgwKTsKLQkJCQlzZXR1cF9ubWkoKTsKLQkJCQllbmFibGVfODI1OUFfaXJxKDApOwotCQkJfQotCQkJaWYgKGRpc2FibGVfdGltZXJfcGluXzEgPiAwKQotCQkJCWNsZWFyX0lPX0FQSUNfcGluKDAsIHBpbjEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMxLCBwaW4xKTsKLQkJYXBpY19wcmludGsoQVBJQ19RVUlFVCxLRVJOX0VSUiAiLi5NUC1CSU9TIGJ1ZzogODI1NCB0aW1lciBub3QgIgotCQkJCSJjb25uZWN0ZWQgdG8gSU8tQVBJQ1xuIik7Ci0JfQorCS8qIE5vdyB0cnkgYWdhaW4gd2l0aCBJUlEwIDgyNTlBIGVuYWJsZWQuCisJICAgQXNzdW1lcyB0aW1lciBpcyBvbiBJTy1BUElDIDAgPyE/ICovCisJZW5hYmxlXzgyNTlBX2lycSgwKTsKKwl1bm1hc2tfSU9fQVBJQ19pcnEoMCk7CisJaWYgKHRyeV9hcGljX3BpbihhcGljMSwgcGluMSwgIndpdGggODI1OSBJUlEwIGVuYWJsZWQiKSkKKwkJcmV0dXJuOworCWRpc2FibGVfODI1OUFfaXJxKDApOwogCi0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLEtFUk5fSU5GTyAiLi4udHJ5aW5nIHRvIHNldCB1cCB0aW1lciAoSVJRMCkgIgotCQkJCSJ0aHJvdWdoIHRoZSA4MjU5QSAuLi4gIik7CisJLyogQWx3YXlzIHRyeSBwaW4wIGFuZCBwaW4yIG9uIEFQSUMgMCB0byBoYW5kbGUgYnVnZ3kgdGltZXIgb3ZlcnJpZGVzCisJICAgb24gTnZpZGlhIGJvYXJkcyAqLworCWlmICghKGFwaWMxID09IDAgJiYgcGluMSA9PSAwKSAmJgorCSAgICB0cnlfYXBpY19waW4oMCwgMCwgImZhbGxiYWNrIHdpdGggODI1OSBJUlEwIGRpc2FibGVkIikpCisJCXJldHVybjsKKwlpZiAoIShhcGljMSA9PSAwICYmIHBpbjEgPT0gMikgJiYKKwkgICAgdHJ5X2FwaWNfcGluKDAsIDIsICJmYWxsYmFjayB3aXRoIDgyNTkgSVJRMCBkaXNhYmxlZCIpKQorCQlyZXR1cm47CisKKwkvKiBUaGVuIHRyeSBwdXJlIDgyNTlBIHJvdXRpbmcgb24gdGhlIDgyNTkgYXMgcmVwb3J0ZWQgYnkgQklPUyovCisJZW5hYmxlXzgyNTlBX2lycSgwKTsKIAlpZiAocGluMiAhPSAtMSkgewotCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIlxuLi4uLi4gKGZvdW5kIGFwaWMgJWQgcGluICVkKSAuLi4iLAotCQkJYXBpYzIsIHBpbjIpOwotCQkvKgotCQkgKiBsZWdhY3kgZGV2aWNlcyBzaG91bGQgYmUgY29ubmVjdGVkIHRvIElPIEFQSUMgIzAKLQkJICovCiAJCXNldHVwX0V4dElOVF9JUlEwX3BpbihhcGljMiwgcGluMiwgdmVjdG9yKTsKLQkJaWYgKHRpbWVyX2lycV93b3JrcygpKSB7Ci0JCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIiB3b3Jrcy5cbiIpOwotCQkJbm1pX3dhdGNoZG9nX2RlZmF1bHQoKTsKLQkJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKLQkJCQlzZXR1cF9ubWkoKTsKLQkJCX0KKwkJaWYgKHRyeV9hcGljX3BpbihhcGljMixwaW4yLCI4MjU5QSBicm9hZGNhc3QgRXh0SU5UIGZyb20gQklPUyIpKQogCQkJcmV0dXJuOwotCQl9Ci0JCS8qCi0JCSAqIENsZWFudXAsIGp1c3QgaW4gY2FzZSAuLi4KLQkJICovCi0JCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMyLCBwaW4yKTsKIAl9Ci0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCIgZmFpbGVkLlxuIik7CisKKwkvKiBUcmllZCBhbGwgcG9zc2liaWxpdGllcyB0byBnbyB0aHJvdWdoIHRoZSBJTy1BUElDLiBOb3cgY29tZSB0aGUKKwkgICByZWFsbHkgY2hlZXN5IGZhbGxiYWNrcy4gKi8KIAogCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAidGltZXIgZG9lc24ndCB3b3JrIHRocm91Z2ggdGhlIElPLUFQSUMgLSBkaXNhYmxpbmcgTk1JIFdhdGNoZG9nIVxuIik7CkBAIC0xNzQyLDcgKzE4NDcsNyBAQAogCWR5bmFtaWNfaXJxX2NsZWFudXAoaXJxKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOwotCWlycV92ZWN0b3JbaXJxXSA9IDA7CisJX19jbGVhcl9pcnFfdmVjdG9yKGlycSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVjdG9yX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTgzOSw3ICsxOTQ0LDcgQEAKIAogCXdyaXRlX21zaV9tc2coaXJxLCAmbXNnKTsKIAotCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZtc2lfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxKTsKKwlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZtc2lfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODYwLDE4ICsxOTY1LDE2IEBACiAKIHN0YXRpYyB2b2lkIHRhcmdldF9odF9pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGRlc3QsIHU4IHZlY3RvcikKIHsKLQl1MzIgbG93LCBoaWdoOwotCWxvdyAgPSByZWFkX2h0X2lycV9sb3coaXJxKTsKLQloaWdoID0gcmVhZF9odF9pcnFfaGlnaChpcnEpOworCXN0cnVjdCBodF9pcnFfbXNnIG1zZzsKKwlmZXRjaF9odF9pcnFfbXNnKGlycSwgJm1zZyk7CiAKLQlsb3cgICY9IH4oSFRfSVJRX0xPV19WRUNUT1JfTUFTSyB8IEhUX0lSUV9MT1dfREVTVF9JRF9NQVNLKTsKLQloaWdoICY9IH4oSFRfSVJRX0hJR0hfREVTVF9JRF9NQVNLKTsKKwltc2cuYWRkcmVzc19sbyAmPSB+KEhUX0lSUV9MT1dfVkVDVE9SX01BU0sgfCBIVF9JUlFfTE9XX0RFU1RfSURfTUFTSyk7CisJbXNnLmFkZHJlc3NfaGkgJj0gfihIVF9JUlFfSElHSF9ERVNUX0lEX01BU0spOwogCi0JbG93ICB8PSBIVF9JUlFfTE9XX1ZFQ1RPUih2ZWN0b3IpIHwgSFRfSVJRX0xPV19ERVNUX0lEKGRlc3QpOwotCWhpZ2ggfD0gSFRfSVJRX0hJR0hfREVTVF9JRChkZXN0KTsKKwltc2cuYWRkcmVzc19sbyB8PSBIVF9JUlFfTE9XX1ZFQ1RPUih2ZWN0b3IpIHwgSFRfSVJRX0xPV19ERVNUX0lEKGRlc3QpOworCW1zZy5hZGRyZXNzX2hpIHw9IEhUX0lSUV9ISUdIX0RFU1RfSUQoZGVzdCk7CiAKLQl3cml0ZV9odF9pcnFfbG93KGlycSwgbG93KTsKLQl3cml0ZV9odF9pcnFfaGlnaChpcnEsIGhpZ2gpOworCXdyaXRlX2h0X2lycV9tc2coaXJxLCAmbXNnKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2h0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKQEAgLTE4OTIsNyArMTk5NSw3IEBACiAKIAlkZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKHRtcCk7CiAKLQl0YXJnZXRfaHRfaXJxKGlycSwgZGVzdCwgdmVjdG9yICYgMHhmZik7CisJdGFyZ2V0X2h0X2lycShpcnEsIGRlc3QsIHZlY3Rvcik7CiAJc2V0X25hdGl2ZV9pcnFfaW5mbyhpcnEsIG1hc2spOwogfQogI2VuZGlmCkBAIC0xOTE1LDE0ICsyMDE4LDE1IEBACiAKIAl2ZWN0b3IgPSBhc3NpZ25faXJxX3ZlY3RvcihpcnEsIFRBUkdFVF9DUFVTLCAmdG1wKTsKIAlpZiAodmVjdG9yID49IDApIHsKLQkJdTMyIGxvdywgaGlnaDsKKwkJc3RydWN0IGh0X2lycV9tc2cgbXNnOwogCQl1bnNpZ25lZCBkZXN0OwogCiAJCWRlc3QgPSBjcHVfbWFza190b19hcGljaWQodG1wKTsKIAotCQloaWdoID0gCUhUX0lSUV9ISUdIX0RFU1RfSUQoZGVzdCk7CisJCW1zZy5hZGRyZXNzX2hpID0gSFRfSVJRX0hJR0hfREVTVF9JRChkZXN0KTsKIAotCQlsb3cgPQlIVF9JUlFfTE9XX0JBU0UgfAorCQltc2cuYWRkcmVzc19sbyA9CisJCQlIVF9JUlFfTE9XX0JBU0UgfAogCQkJSFRfSVJRX0xPV19ERVNUX0lEKGRlc3QpIHwKIAkJCUhUX0lSUV9MT1dfVkVDVE9SKHZlY3RvcikgfAogCQkJKChJTlRfREVTVF9NT0RFID09IDApID8KQEAgLTE5MzEsMTIgKzIwMzUsMTMgQEAKIAkJCUhUX0lSUV9MT1dfUlFFT0lfRURHRSB8CiAJCQkoKElOVF9ERUxJVkVSWV9NT0RFICE9IGRlc3RfTG93ZXN0UHJpbykgPwogCQkJCUhUX0lSUV9MT1dfTVRfRklYRUQgOgotCQkJCUhUX0lSUV9MT1dfTVRfQVJCSVRSQVRFRCk7CisJCQkJSFRfSVJRX0xPV19NVF9BUkJJVFJBVEVEKSB8CisJCQlIVF9JUlFfTE9XX0lSUV9NQVNLRUQ7CiAKLQkJd3JpdGVfaHRfaXJxX2xvdyhpcnEsIGxvdyk7Ci0JCXdyaXRlX2h0X2lycV9oaWdoKGlycSwgaGlnaCk7CisJCXdyaXRlX2h0X2lycV9tc2coaXJxLCAmbXNnKTsKIAotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmaHRfaXJxX2NoaXAsIGhhbmRsZV9lZGdlX2lycSk7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmh0X2lycV9jaGlwLAorCQkJCQkgICAgICBoYW5kbGVfZWRnZV9pcnEsICJlZGdlIik7CiAJfQogCXJldHVybiB2ZWN0b3I7CiB9CkBAIC0yMDQ0LDcgKzIxNDksMTUgQEAKIAkJCWlmIChpcnFfZW50cnkgPT0gLTEpCiAJCQkJY29udGludWU7CiAJCQlpcnEgPSBwaW5fMl9pcnEoaXJxX2VudHJ5LCBpb2FwaWMsIHBpbik7Ci0JCQlzZXRfaW9hcGljX2FmZmluaXR5X2lycShpcnEsIFRBUkdFVF9DUFVTKTsKKworCQkJLyogc2V0dXBfSU9fQVBJQ19pcnFzIGNvdWxkIGZhaWwgdG8gZ2V0IHZlY3RvciBmb3Igc29tZSBkZXZpY2UKKwkJCSAqIHdoZW4geW91IGhhdmUgdG9vIG1hbnkgZGV2aWNlcywgYmVjYXVzZSBhdCB0aGF0IHRpbWUgb25seSBib290CisJCQkgKiBjcHUgaXMgb25saW5lLgorCQkJICovCisJCQlpZighaXJxX3ZlY3RvcltpcnFdKQorCQkJCXNldHVwX0lPX0FQSUNfaXJxKGlvYXBpYywgcGluLCBpcnFfZW50cnksIGlycSk7CisJCQllbHNlCisJCQkJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBUQVJHRVRfQ1BVUyk7CiAJCX0KIAogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYwppbmRleCBkZmY2OGViLi4wYzA2YWY2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lycS5jCkBAIC03NSw3ICs3NSw3IEBACiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKICNlbmRpZgogCQlzZXFfcHJpbnRmKHAsICIgJThzIiwgaXJxX2Rlc2NbaV0uY2hpcC0+bmFtZSk7Ci0JCXNlcV9wcmludGYocCwgIi0lcyIsIGhhbmRsZV9pcnFfbmFtZShpcnFfZGVzY1tpXS5oYW5kbGVfaXJxKSk7CisJCXNlcV9wcmludGYocCwgIi0lLThzIiwgaXJxX2Rlc2NbaV0ubmFtZSk7CiAKIAkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CiAJCWZvciAoYWN0aW9uPWFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogCWlmIChsaWtlbHkoaXJxIDwgTlJfSVJRUykpCiAJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwotCWVsc2UKKwllbHNlIGlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCXByaW50ayhLRVJOX0VNRVJHICIlczogJWQuJWQgTm8gaXJxIGhhbmRsZXIgZm9yIHZlY3RvclxuIiwKIAkJCV9fZnVuY19fLCBzbXBfcHJvY2Vzc29yX2lkKCksIHZlY3Rvcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGFjMjQxNTYuLjIwOWM4YzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24pOworCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOwogCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL21jZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL21jZS5jCmluZGV4IGJiZWE4ODguLmFjMDg1MDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlLmMKQEAgLTMwNiw4ICszMDYsOCBAQAogICovCiAKIHN0YXRpYyBpbnQgY2hlY2tfaW50ZXJ2YWwgPSA1ICogNjA7IC8qIDUgbWludXRlcyAqLwotc3RhdGljIHZvaWQgbWNoZWNrX3RpbWVyKHZvaWQgKmRhdGEpOwotc3RhdGljIERFQ0xBUkVfV09SSyhtY2hlY2tfd29yaywgbWNoZWNrX3RpbWVyLCBOVUxMKTsKK3N0YXRpYyB2b2lkIG1jaGVja190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKG1jaGVja193b3JrLCBtY2hlY2tfdGltZXIpOwogCiBzdGF0aWMgdm9pZCBtY2hlY2tfY2hlY2tfY3B1KHZvaWQgKmluZm8pCiB7CkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJZG9fbWFjaGluZV9jaGVjayhOVUxMLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgbWNoZWNrX3RpbWVyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBtY2hlY2tfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCW9uX2VhY2hfY3B1KG1jaGVja19jaGVja19jcHUsIE5VTEwsIDEsIDEpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbWNoZWNrX3dvcmssIGNoZWNrX2ludGVydmFsICogSFopOwpAQCAtNjQxLDcgKzY0MSw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIHZvaWQgbWNlX3JlbW92ZV9kZXZpY2UodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaTsKQEAgLTY1Miw2ICs2NTEsNyBAQAogCXN5c2Rldl9yZW1vdmVfZmlsZSgmcGVyX2NwdShkZXZpY2VfbWNlLGNwdSksICZhdHRyX3RvbGVyYW50KTsKIAlzeXNkZXZfcmVtb3ZlX2ZpbGUoJnBlcl9jcHUoZGV2aWNlX21jZSxjcHUpLCAmYXR0cl9jaGVja19pbnRlcnZhbCk7CiAJc3lzZGV2X3VucmVnaXN0ZXIoJnBlcl9jcHUoZGV2aWNlX21jZSxjcHUpKTsKKwltZW1zZXQoJnBlcl9jcHUoZGV2aWNlX21jZSwgY3B1KS5rb2JqLCAwLCBzaXplb2Yoc3RydWN0IGtvYmplY3QpKTsKIH0KIAogLyogR2V0IG5vdGlmaWVkIHdoZW4gYSBjcHUgY29tZXMgb24vb2ZmLiBCZSBob3RwbHVnIGZyaWVuZGx5LiAqLwpAQCAtNjc0LDcgKzY3NCw2IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1jZV9jcHVfbm90aWZpZXIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBtY2VfY3B1X2NhbGxiYWNrLAogfTsKLSNlbmRpZgogCiBzdGF0aWMgX19pbml0IGludCBtY2VfaW5pdF9kZXZpY2Uodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfYW1kLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlX2FtZC5jCmluZGV4IDg4M2ZlNzQuLmZhMDlkZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfYW1kLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21jZV9hbWQuYwpAQCAtNTUxLDcgKzU1MSw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyoKICAqIGxldCdzIGJlIGhvdHBsdWcgZnJpZW5kbHkuCiAgKiBpbiBjYXNlIG9mIG11bHRpcGxlIGNvcmUgcHJvY2Vzc29ycywgdGhlIGZpcnN0IGNvcmUgYWx3YXlzIHRha2VzIG93bmVyc2hpcApAQCAtNTk0LDEyICs1OTMsMTQgQEAKIAogCXNwcmludGYobmFtZSwgInRocmVzaG9sZF9iYW5rJWkiLCBiYW5rKTsKIAorI2lmZGVmIENPTkZJR19TTVAKIAkvKiBzaWJsaW5nIHN5bWxpbmsgKi8KIAlpZiAoc2hhcmVkX2JhbmtbYmFua10gJiYgYi0+YmxvY2tzLT5jcHUgIT0gY3B1KSB7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZwZXJfY3B1KGRldmljZV9tY2UsIGNwdSkua29iaiwgbmFtZSk7CiAJCXBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdID0gTlVMTDsKIAkJcmV0dXJuOwogCX0KKyNlbmRpZgogCiAJLyogcmVtb3ZlIGFsbCBzaWJsaW5nIHN5bWxpbmtzIGJlZm9yZSB1bnJlZ2lzdGVyaW5nICovCiAJZm9yX2VhY2hfY3B1X21hc2soaSwgYi0+Y3B1cykgewpAQCAtNjU2LDcgKzY1Nyw2IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHRocmVzaG9sZF9jcHVfbm90aWZpZXIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSB0aHJlc2hvbGRfY3B1X2NhbGxiYWNrLAogfTsKLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAogc3RhdGljIF9faW5pdCBpbnQgdGhyZXNob2xkX2luaXRfZGV2aWNlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbW9kdWxlLmMKaW5kZXggOWQwOTU4Zi4uYTg4OGU2NyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tb2R1bGUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMTczLDEwICsxNzQsMTIgQEAKIAkJCQkJICAgIGxzZWcsIGxzZWcgKyBsb2Nrcy0+c2hfc2l6ZSwKIAkJCQkJICAgIHRzZWcsIHRzZWcgKyB0ZXh0LT5zaF9zaXplKTsKIAl9Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gbW9kdWxlX2J1Z19maW5hbGl6ZShoZHIsIHNlY2hkcnMsIG1lKTsKIH0KIAogdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKIAlhbHRlcm5hdGl2ZXNfc21wX21vZHVsZV9kZWwobW9kKTsKKwltb2R1bGVfYnVnX2NsZWFudXAobW9kKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IGIxNDdhYjEuLjA4MDcyNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYwpAQCAtMzUsOCArMzUsNiBAQAogaW50IHNtcF9mb3VuZF9jb25maWc7CiB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYXhjcHVzID0gTlJfQ1BVUzsKIAotaW50IGFjcGlfZm91bmRfbWFkdDsKLQogLyoKICAqIFZhcmlvdXMgTGludXgtaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgZnJvbSB0aGUKICAqIE1QLXRhYmxlLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL25taS5jIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCmluZGV4IDdhZjljYjMuLjE4NmFlYmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKQEAgLTEyLDE0ICsxMiwxNSBAQAogICogIE1pa2FlbCBQZXR0ZXJzc29uCTogUE0gY29udmVydGVkIHRvIGRyaXZlciBtb2RlbC4gRGlzYWJsZS9lbmFibGUgQVBJLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9ubWkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm1pLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vbm1pLmg+CkBAIC00MSw2ICs0Miw4IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQsIHBlcmZjdHJfbm1pX293bmVyKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCwgZXZudHNlbF9ubWlfb3duZXJbMl0pOwogCitzdGF0aWMgY3B1bWFza190IGJhY2t0cmFjZV9tYXNrID0gQ1BVX01BU0tfTk9ORTsKKwogLyogdGhpcyBudW1iZXIgaXMgY2FsY3VsYXRlZCBmcm9tIEludGVsJ3MgTVNSX1A0X0NSVV9FU0NSNSByZWdpc3RlciBhbmQgaXQncwogICogb2Zmc2V0IGZyb20gTVNSX1A0X0JTVV9FU0NSMC4gIEl0IHdpbGwgYmUgdGhlIG1heCBmb3IgYWxsIHBsYXRmb3JtcyAoZm9yIG5vdykKICAqLwpAQCAtMTkwLDYgKzE5Myw4IEBACiAJCW5taV93YXRjaGRvZyA9IE5NSV9JT19BUElDOwogfQogCitzdGF0aWMgaW50IGVuZGZsYWcgX19pbml0ZGF0YSA9IDA7CisKICNpZmRlZiBDT05GSUdfU01QCiAvKiBUaGUgcGVyZm9ybWFuY2UgY291bnRlcnMgdXNlZCBieSBOTUlfTE9DQUxfQVBJQyBkb24ndCB0cmlnZ2VyIHdoZW4KICAqIHRoZSBDUFUgaXMgaWRsZS4gVG8gbWFrZSBzdXJlIHRoZSBOTUkgd2F0Y2hkb2cgcmVhbGx5IHRpY2tzIG9uIGFsbApAQCAtMTk3LDcgKzIwMiw2IEBACiAgKi8KIHN0YXRpYyBfX2luaXQgdm9pZCBubWlfY3B1X2J1c3kodm9pZCAqZGF0YSkKIHsKLQl2b2xhdGlsZSBpbnQgKmVuZGZsYWcgPSBkYXRhOwogCWxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOwogCS8qIEludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGNwdV9yZWxheCBoZXJlLiBUaGlzIGlzCiAJICAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVhbGx5IHRpY2tzLApAQCAtMjA1LDE0ICsyMDksMTMgQEAKIAkgICBwYXVzZSBpbnN0cnVjdGlvbi4gT24gYSByZWFsIEhUIG1hY2hpbmUgdGhpcyBpcyBmaW5lIGJlY2F1c2UKIAkgICBhbGwgb3RoZXIgQ1BVcyBhcmUgYnVzeSB3aXRoICJ1c2VsZXNzIiBkZWxheSBsb29wcyBhbmQgZG9uJ3QKIAkgICBjYXJlIGlmIHRoZXkgZ2V0IHNvbWV3aGF0IGxlc3MgY3ljbGVzLiAqLwotCXdoaWxlICgqZW5kZmxhZyA9PSAwKQotCQliYXJyaWVyKCk7CisJd2hpbGUgKGVuZGZsYWcgPT0gMCkKKwkJbWIoKTsKIH0KICNlbmRpZgogCiBpbnQgX19pbml0IGNoZWNrX25taV93YXRjaGRvZyAodm9pZCkKIHsKLQl2b2xhdGlsZSBpbnQgZW5kZmxhZyA9IDA7CiAJaW50ICpjb3VudHM7CiAJaW50IGNwdTsKIApAQCAtMjUzLDYgKzI1Niw3IEBACiAJaWYgKCFhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkpIHsKIAkJa2ZyZWUoY291bnRzKTsKIAkJYXRvbWljX3NldCgmbm1pX2FjdGl2ZSwgLTEpOworCQllbmRmbGFnID0gMTsKIAkJcmV0dXJuIC0xOwogCX0KIAllbmRmbGFnID0gMTsKQEAgLTc4Miw2ICs3ODYsNyBAQAogewogCWludCBzdW07CiAJaW50IHRvdWNoZWQgPSAwOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgKndkID0gJl9fZ2V0X2NwdV92YXIobm1pX3dhdGNoZG9nX2N0bGJsayk7CiAJdTY0IGR1bW15OwogCWludCByYz0wOwpAQCAtNzk5LDYgKzgwNCwxNiBAQAogCQl0b3VjaGVkID0gMTsKIAl9CiAKKwlpZiAoY3B1X2lzc2V0KGNwdSwgYmFja3RyYWNlX21hc2spKSB7CisJCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CS8qIFNlcmlhbGlzZSB0aGUgcHJpbnRrcyAqLworCisJCXNwaW5fbG9jaygmbG9jayk7CisJCXByaW50aygiTk1JIGJhY2t0cmFjZSBmb3IgY3B1ICVkXG4iLCBjcHUpOworCQlkdW1wX3N0YWNrKCk7CisJCXNwaW5fdW5sb2NrKCZsb2NrKTsKKwkJY3B1X2NsZWFyKGNwdSwgYmFja3RyYWNlX21hc2spOworCX0KKwogI2lmZGVmIENPTkZJR19YODZfTUNFCiAJLyogQ291bGQgY2hlY2sgb29wc19pbl9wcm9ncmVzcyBoZXJlIHRvbywgYnV0IGl0J3Mgc2FmZXIKIAkgICBub3QgdG9vICovCkBAIC05MzEsNiArOTQ2LDE5IEBACiAKICNlbmRpZgogCit2b2lkIF9fdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZSh2b2lkKQoreworCWludCBpOworCisJYmFja3RyYWNlX21hc2sgPSBjcHVfb25saW5lX21hcDsKKwkvKiBXYWl0IGZvciB1cCB0byAxMCBzZWNvbmRzIGZvciBhbGwgQ1BVcyB0byBkbyB0aGUgYmFja3RyYWNlICovCisJZm9yIChpID0gMDsgaSA8IDEwICogMTAwMDsgaSsrKSB7CisJCWlmIChjcHVzX2VtcHR5KGJhY2t0cmFjZV9tYXNrKSkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorfQorCiBFWFBPUlRfU1lNQk9MKG5taV9hY3RpdmUpOwogRVhQT1JUX1NZTUJPTChubWlfd2F0Y2hkb2cpOwogRVhQT1JUX1NZTUJPTChhdmFpbF90b19yZXNydl9wZXJmY3RyX25taSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWNhbGdhcnkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCmluZGV4IGIzMjk2Y2MuLjMyMTU2NzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCkBAIC00MSw2ICs0MSwxMyBAQAogI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcmlvLmg+CisKKyNpZmRlZiBDT05GSUdfQ0FMR0FSWV9JT01NVV9FTkFCTEVEX0JZX0RFRkFVTFQKK2ludCB1c2VfY2FsZ2FyeSBfX3JlYWRfbW9zdGx5ID0gMTsKKyNlbHNlCitpbnQgdXNlX2NhbGdhcnkgX19yZWFkX21vc3RseSA9IDA7CisjZW5kaWYgLyogQ09ORklHX0NBTEdBUllfREVGQVVMVF9FTkFCTEVEICovCiAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fQ0FMR0FSWSAweDAyYTEKICNkZWZpbmUgUENJX1ZFTkRPUl9ERVZJQ0VfSURfQ0FMR0FSWSBcCkBAIC01Miw3ICs1OSw4IEBACiAjZGVmaW5lIE9ORV9CQVNFRF9DSEFTU0lTX05VTSAgIDEKIAogLyogcmVnaXN0ZXIgb2Zmc2V0cyBpbnNpZGUgdGhlIGhvc3QgYnJpZGdlIHNwYWNlICovCi0jZGVmaW5lIFBIQl9DU1JfT0ZGU0VUCQkweDAxMTAKKyNkZWZpbmUgQ0FMR0FSWV9DT05GSUdfUkVHCTB4MDEwOAorI2RlZmluZSBQSEJfQ1NSX09GRlNFVAkJMHgwMTEwIC8qIENoYW5uZWwgU3RhdHVzICovCiAjZGVmaW5lIFBIQl9QTFNTUl9PRkZTRVQJMHgwMTIwCiAjZGVmaW5lIFBIQl9DT05GSUdfUldfT0ZGU0VUCTB4MDE2MAogI2RlZmluZSBQSEJfSU9CQVNFX0JBUl9MT1cJMHgwMTcwCkBAIC04Myw2ICs5MSw4IEBACiAjZGVmaW5lIFRBUl9WQUxJRAkJMHgwMDAwMDAwMDAwMDAwMDA4VUwKIC8qIENTUiAoQ2hhbm5lbC9ETUEgU3RhdHVzIFJlZ2lzdGVyKSAqLwogI2RlZmluZSBDU1JfQUdFTlRfTUFTSwkJMHhmZmUwZmZmZgorLyogQ0NSIChDYWxnYXJ5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIpICovCisjZGVmaW5lIENDUl8yU0VDX1RJTUVPVVQgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwRVVMCiAKICNkZWZpbmUgTUFYX05VTV9PRl9QSEJTCQk4IC8qIGhvdyBtYW55IFBIQnMgaW4gdG90YWw/ICovCiAjZGVmaW5lIE1BWF9OVU1fQ0hBU1NJUwkJOCAvKiBtYXggbnVtYmVyIG9mIGNoYXNzaXMgKi8KQEAgLTExMiwxNCArMTIyLDM1IEBACiAJMHhCMDAwIC8qIFBIQjMgKi8KIH07CiAKKy8qIFBIQiBkZWJ1ZyByZWdpc3RlcnMgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcGhiX2RlYnVnX29mZnNldHNbXSA9IHsKKwkweDQwMDAJLyogUEhCIDAgREVCVUcgKi8sCisJMHg1MDAwCS8qIFBIQiAxIERFQlVHICovLAorCTB4NjAwMAkvKiBQSEIgMiBERUJVRyAqLywKKwkweDcwMDAJLyogUEhCIDMgREVCVUcgKi8KK307CisKKy8qCisgKiBTVFVGRiByZWdpc3RlciBmb3IgZWFjaCBkZWJ1ZyBQSEIsCisgKiBieXRlIDEgPSBzdGFydCBidXMgbnVtYmVyLCBieXRlIDIgPSBlbmQgYnVzIG51bWJlcgorICovCisKKyNkZWZpbmUgUEhCX0RFQlVHX1NUVUZGX09GRlNFVAkweDAwMjAKKwogdW5zaWduZWQgaW50IHNwZWNpZmllZF90YWJsZV9zaXplID0gVENFX1RBQkxFX1NJWkVfVU5TUEVDSUZJRUQ7CiBzdGF0aWMgaW50IHRyYW5zbGF0ZV9lbXB0eV9zbG90cyBfX3JlYWRfbW9zdGx5ID0gMDsKIHN0YXRpYyBpbnQgY2FsZ2FyeV9kZXRlY3RlZCBfX3JlYWRfbW9zdGx5ID0gMDsKIAorc3RhdGljIHN0cnVjdCByaW9fdGFibGVfaGRyCSpyaW9fdGFibGVfaGRyIF9faW5pdGRhdGE7CitzdGF0aWMgc3RydWN0IHNjYWxfZGV0YWlsCSpzY2FsX2RldnNbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCByaW9fZGV0YWlsCSpyaW9fZGV2c1tNQVhfTlVNTk9ERVMgKiA0XSBfX2luaXRkYXRhOworCiBzdHJ1Y3QgY2FsZ2FyeV9idXNfaW5mbyB7CiAJdm9pZCAqdGNlX3NwYWNlOwogCXVuc2lnbmVkIGNoYXIgdHJhbnNsYXRpb25fZGlzYWJsZWQ7CiAJc2lnbmVkIGNoYXIgcGhiaWQ7CisJdm9pZCBfX2lvbWVtICpiYmFyOwogfTsKIAogc3RhdGljIHN0cnVjdCBjYWxnYXJ5X2J1c19pbmZvIGJ1c19pbmZvW01BWF9QSEJfQlVTX05VTV0gPSB7IHsgTlVMTCwgMCwgMCB9LCB9OwpAQCAtNDcyLDYgKzUwMywxMSBAQAogCS51bm1hcF9zZyA9IGNhbGdhcnlfdW5tYXBfc2csCiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqIGJ1c25vX3RvX2JiYXIodW5zaWduZWQgY2hhciBudW0pCit7CisJcmV0dXJuIGJ1c19pbmZvW251bV0uYmJhcjsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYnVzbm9fdG9fcGhiaWQodW5zaWduZWQgY2hhciBudW0pCiB7CiAJcmV0dXJuIGJ1c19pbmZvW251bV0ucGhiaWQ7CkBAIC02MTcsMTQgKzY1Myw5IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgY2FsZ2FyeV9yZXNlcnZlX3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1bnNpZ25lZCBpbnQgbnBhZ2VzOwotCXZvaWQgX19pb21lbSAqYmJhcjsKLQl1bnNpZ25lZCBjaGFyIGJ1c251bTsKIAl1NjQgc3RhcnQ7CiAJc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBkZXYtPnN5c2RhdGE7CiAKLQliYmFyID0gdGJsLT5iYmFyOwotCWJ1c251bSA9IGRldi0+YnVzLT5udW1iZXI7Ci0KIAkvKiByZXNlcnZlIGJhZF9kbWFfYWRkcmVzcyBpbiBjYXNlIGl0J3MgYSBsZWdhbCBhZGRyZXNzICovCiAJaW9tbXVfcmFuZ2VfcmVzZXJ2ZSh0YmwsIGJhZF9kbWFfYWRkcmVzcywgMSk7CiAKQEAgLTczMiw2ICs3NjMsMzggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBjYWxnYXJ5X2luY3JlYXNlX3NwbGl0X2NvbXBsZXRpb25fdGltZW91dCh2b2lkIF9faW9tZW0gKmJiYXIsCisJdW5zaWduZWQgY2hhciBidXNudW0pCit7CisJdTY0IHZhbDY0OworCXZvaWQgX19pb21lbSAqdGFyZ2V0OworCXVuc2lnbmVkIGludCBwaGJfc2hpZnQgPSB+MDsgLyogc2lsZW5jZSBnY2MgKi8KKwl1NjQgbWFzazsKKworCXN3aXRjaCAoYnVzbm9fdG9fcGhiaWQoYnVzbnVtKSkgeworCWNhc2UgMDogcGhiX3NoaWZ0ID0gKDYzIC0gMTkpOworCQlicmVhazsKKwljYXNlIDE6IHBoYl9zaGlmdCA9ICg2MyAtIDIzKTsKKwkJYnJlYWs7CisJY2FzZSAyOiBwaGJfc2hpZnQgPSAoNjMgLSAyNyk7CisJCWJyZWFrOworCWNhc2UgMzogcGhiX3NoaWZ0ID0gKDYzIC0gMzUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUdfT04oYnVzbm9fdG9fcGhiaWQoYnVzbnVtKSk7CisJfQorCisJdGFyZ2V0ID0gY2FsZ2FyeV9yZWcoYmJhciwgQ0FMR0FSWV9DT05GSUdfUkVHKTsKKwl2YWw2NCA9IGJlNjRfdG9fY3B1KHJlYWRxKHRhcmdldCkpOworCisJLyogemVybyBvdXQgdGhpcyBQSEIncyB0aW1lciBiaXRzICovCisJbWFzayA9IH4oMHhGVUwgPDwgcGhiX3NoaWZ0KTsKKwl2YWw2NCAmPSBtYXNrOworCXZhbDY0IHw9IChDQ1JfMlNFQ19USU1FT1VUIDw8IHBoYl9zaGlmdCk7CisJd3JpdGVxKGNwdV90b19iZTY0KHZhbDY0KSwgdGFyZ2V0KTsKKwlyZWFkcSh0YXJnZXQpOyAvKiBmbHVzaCAqLworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgY2FsZ2FyeV9lbmFibGVfdHJhbnNsYXRpb24oc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1MzIgdmFsMzI7CkBAIC03NTYsNiArODE5LDEzIEBACiAJd3JpdGVsKGNwdV90b19iZTMyKHZhbDMyKSwgdGFyZ2V0KTsKIAlyZWFkbCh0YXJnZXQpOyAvKiBmbHVzaCAqLwogCisJLyoKKwkgKiBHaXZlIHNwbGl0IGNvbXBsZXRpb24gYSBsb25nZXIgdGltZW91dCBvbiBidXMgMSBmb3IgYWljOTR4eAorCSAqIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD03MTgwCisJICovCisJaWYgKGJ1c251bSA9PSAxKQorCQljYWxnYXJ5X2luY3JlYXNlX3NwbGl0X2NvbXBsZXRpb25fdGltZW91dChiYmFyLCBidXNudW0pOworCiAJaW5pdF90aW1lcigmdGJsLT53YXRjaGRvZ190aW1lcik7CiAJdGJsLT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9ICZjYWxnYXJ5X3dhdGNoZG9nOwogCXRibC0+d2F0Y2hkb2dfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKQEAgLTc4NiwzMyArODU2LDYgQEAKIAlkZWxfdGltZXJfc3luYygmdGJsLT53YXRjaGRvZ190aW1lcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9faW5pdCBsb2NhdGVfcmVnaXN0ZXJfc3BhY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpbnQgcmlvbm9kZWlkOwotCXUzMiBhZGRyZXNzOwotCi0JLyoKLQkgKiBFYWNoIENhbGdhcnkgaGFzIGZvdXIgYnVzc2VzLiBUaGUgZmlyc3QgZm91ciBidXNzZXMgKGZpcnN0IENhbGdhcnkpCi0JICogaGF2ZSBSSU8gbm9kZSBJRCAyLCB0aGVuIHRoZSBuZXh0IGZvdXIgKHNlY29uZCBDYWxnYXJ5KSBoYXZlIFJJTwotCSAqIG5vZGUgSUQgMywgdGhlIG5leHQgZm91ciAodGhpcmQgQ2FsZ2FyeSkgaGF2ZSBub2RlIElEIDIgYWdhaW4sIGV0Yy4KLQkgKiBXZSB1c2UgYSBncm9zcyBoYWNrIC0gcmVseWluZyBvbiB0aGUgZGV2LT5idXMtPm51bWJlciBvcmRlcmluZywKLQkgKiBtb2R1bG8gMTQgLSB0byBkZWNpZGUgd2hpY2ggQ2FsZ2FyeSBhIGdpdmVuIGJ1cyBpcyBvbi4gQnVzc2VzIDAsIDEsCi0JICogMiBhbmQgNCBhcmUgb24gdGhlIGZpcnN0IENhbGdhcnkgKGlkIDIpLCA2LCA4LCBhIGFuZCBjIGFyZSBvbiB0aGUKLQkgKiBzZWNvbmQgKGlkIDMpLCBhbmQgdGhlbiBpdCByZXBlYXRzIG1vZHVsbyAxNC4KLSAJICovCi0Jcmlvbm9kZWlkID0gKGRldi0+YnVzLT5udW1iZXIgJSAxNCA+IDQpID8gMyA6IDI7Ci0JLyoKLQkgKiByZWdpc3RlciBzcGFjZSBhZGRyZXNzIGNhbGN1bGF0aW9uIGFzIGZvbGxvd3M6Ci0JICogRkUwTUItOE1CKk9uZUJhc2VkQ2hhc3Npc051bWJlcisxTUIqKFJpb05vZGVJZC1DaGFzc2lzQmFzZSkKLQkgKiBDaGFzc2lzQmFzZSBpcyBhbHdheXMgemVybyBmb3IgeDM2Ni94MjYwL3g0NjAKLQkgKiBSaW9Ob2RlSWQgaXMgMiBmb3IgZmlyc3QgQ2FsZ2FyeSwgMyBmb3Igc2Vjb25kIENhbGdhcnkKLQkgKi8KLQlhZGRyZXNzID0gU1RBUlRfQUREUkVTUwktCi0JCSgweDgwMDAwMCAqIChPTkVfQkFTRURfQ0hBU1NJU19OVU0gKyBkZXYtPmJ1cy0+bnVtYmVyIC8gMTQpKSArCi0JCSgweDEwMDAwMCkgKiAocmlvbm9kZWlkIC0gQ0hBU1NJU19CQVNFKTsKLQlyZXR1cm4gYWRkcmVzczsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IGNhbGdhcnlfaW5pdF9vbmVfbm9udHJhc2xhdGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJcGNpX2Rldl9nZXQoZGV2KTsKQEAgLTgyMiwyMyArODY1LDE1IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNhbGdhcnlfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQl1MzIgYWRkcmVzczsKIAl2b2lkIF9faW9tZW0gKmJiYXI7CiAJaW50IHJldDsKIAogCUJVR19PTihkZXYtPmJ1cy0+bnVtYmVyID49IE1BWF9QSEJfQlVTX05VTSk7CiAKLQlhZGRyZXNzID0gbG9jYXRlX3JlZ2lzdGVyX3NwYWNlKGRldik7Ci0JLyogbWFwIGVudGlyZSAxTUIgb2YgQ2FsZ2FyeSBjb25maWcgc3BhY2UgKi8KLQliYmFyID0gaW9yZW1hcF9ub2NhY2hlKGFkZHJlc3MsIDEwMjQgKiAxMDI0KTsKLQlpZiAoIWJiYXIpIHsKLQkJcmV0ID0gLUVOT0RBVEE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KKwliYmFyID0gYnVzbm9fdG9fYmJhcihkZXYtPmJ1cy0+bnVtYmVyKTsKIAlyZXQgPSBjYWxnYXJ5X3NldHVwX3RhcihkZXYsIGJiYXIpOwogCWlmIChyZXQpCi0JCWdvdG8gaW91bm1hcDsKKwkJZ290byBkb25lOwogCiAJcGNpX2Rldl9nZXQoZGV2KTsKIAlkZXYtPmJ1cy0+c2VsZiA9IGRldjsKQEAgLTg0NiwxNyArODgxLDY2IEBACiAKIAlyZXR1cm4gMDsKIAotaW91bm1hcDoKLQlpb3VubWFwKGJiYXIpOwogZG9uZToKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IF9faW5pdCBjYWxnYXJ5X2xvY2F0ZV9iYmFycyh2b2lkKQoreworCWludCByZXQ7CisJaW50IHJpb2lkeCwgcGhiLCBidXM7CisJdm9pZCBfX2lvbWVtICpiYmFyOworCXZvaWQgX19pb21lbSAqdGFyZ2V0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXU4IHN0YXJ0X2J1cywgZW5kX2J1czsKKwl1MzIgdmFsOworCisJcmV0ID0gLUVOT0RBVEE7CisJZm9yIChyaW9pZHggPSAwOyByaW9pZHggPCByaW9fdGFibGVfaGRyLT5udW1fcmlvX2RldjsgcmlvaWR4KyspIHsKKwkJc3RydWN0IHJpb19kZXRhaWwgKnJpbyA9IHJpb19kZXZzW3Jpb2lkeF07CisKKwkJaWYgKChyaW8tPnR5cGUgIT0gQ09NUEFUX0NBTEdBUlkpICYmIChyaW8tPnR5cGUgIT0gQUxUX0NBTEdBUlkpKQorCQkJY29udGludWU7CisKKwkJLyogbWFwIGVudGlyZSAxTUIgb2YgQ2FsZ2FyeSBjb25maWcgc3BhY2UgKi8KKwkJYmJhciA9IGlvcmVtYXBfbm9jYWNoZShyaW8tPkJCQVIsIDEwMjQgKiAxMDI0KTsKKwkJaWYgKCFiYmFyKQorCQkJZ290byBlcnJvcjsKKworCQlmb3IgKHBoYiA9IDA7IHBoYiA8IFBIQlNfUEVSX0NBTEdBUlk7IHBoYisrKSB7CisJCQlvZmZzZXQgPSBwaGJfZGVidWdfb2Zmc2V0c1twaGJdIHwgUEhCX0RFQlVHX1NUVUZGX09GRlNFVDsKKwkJCXRhcmdldCA9IGNhbGdhcnlfcmVnKGJiYXIsIG9mZnNldCk7CisKKwkJCXZhbCA9IGJlMzJfdG9fY3B1KHJlYWRsKHRhcmdldCkpOworCQkJc3RhcnRfYnVzID0gKHU4KSgodmFsICYgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJZW5kX2J1cyA9ICh1OCkoKHZhbCAmIDB4MDAwMEZGMDApID4+IDgpOworCQkJZm9yIChidXMgPSBzdGFydF9idXM7IGJ1cyA8PSBlbmRfYnVzOyBidXMrKykgeworCQkJCWJ1c19pbmZvW2J1c10uYmJhciA9IGJiYXI7CisJCQkJYnVzX2luZm9bYnVzXS5waGJpZCA9IHBoYjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnJvcjoKKwkvKiBzY2FuIGJ1c19pbmZvIGFuZCBpb3VubWFwIGFueSBiYmFycyB3ZSBwcmV2aW91c2x5IGlvcmVtYXAnZCAqLworCWZvciAoYnVzID0gMDsgYnVzIDwgQVJSQVlfU0laRShidXNfaW5mbyk7IGJ1cysrKQorCQlpZiAoYnVzX2luZm9bYnVzXS5iYmFyKQorCQkJaW91bm1hcChidXNfaW5mb1tidXNdLmJiYXIpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBfX2luaXQgY2FsZ2FyeV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IC1FTk9ERVY7CisJaW50IHJldDsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAorCXJldCA9IGNhbGdhcnlfbG9jYXRlX2JiYXJzKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWRvIHsKIAkJZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JQk0sCiAJCQkJICAgICBQQ0lfREVWSUNFX0lEX0lCTV9DQUxHQVJZLApAQCAtODc5LDcgKzk2Myw3IEBACiAKIGVycm9yOgogCWRvIHsKLQkJZGV2ID0gcGNpX2ZpbmRfZGV2aWNlX3JldmVyc2UoUENJX1ZFTkRPUl9JRF9JQk0sCisJCWRldiA9IHBjaV9nZXRfZGV2aWNlX3JldmVyc2UoUENJX1ZFTkRPUl9JRF9JQk0sCiAJCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSUJNX0NBTEdBUlksCiAJCQkJCSAgICAgIGRldik7CiAJCWlmICghZGV2KQpAQCAtOTIwLDEzICsxMDA0LDU2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBfX2luaXQgYnVpbGRfZGV0YWlsX2FycmF5cyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcHRyOworCWludCBpLCBzY2FsX2RldGFpbF9zaXplLCByaW9fZGV0YWlsX3NpemU7CisKKwlpZiAocmlvX3RhYmxlX2hkci0+bnVtX3NjYWxfZGV2ID4gTUFYX05VTU5PREVTKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIkNhbGdhcnk6IE1BWF9OVU1OT0RFUyB0b28gbG93ISBEZWZpbmVkIGFzICVkLCAiCisJCQkiYnV0IHN5c3RlbSBoYXMgJWQgbm9kZXMuXG4iLAorCQkJTUFYX05VTU5PREVTLCByaW9fdGFibGVfaGRyLT5udW1fc2NhbF9kZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzd2l0Y2ggKHJpb190YWJsZV9oZHItPnZlcnNpb24peworCWNhc2UgMjoKKwkJc2NhbF9kZXRhaWxfc2l6ZSA9IDExOworCQlyaW9fZGV0YWlsX3NpemUgPSAxMzsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzY2FsX2RldGFpbF9zaXplID0gMTI7CisJCXJpb19kZXRhaWxfc2l6ZSA9IDE1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiQ2FsZ2FyeTogSW52YWxpZCBSaW8gR3JhbmRlIFRhYmxlIFZlcnNpb246ICVkXG4iLAorCQkgICAgICAgcmlvX3RhYmxlX2hkci0+dmVyc2lvbik7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCXB0ciA9ICgodW5zaWduZWQgbG9uZylyaW9fdGFibGVfaGRyKSArIDM7CisJZm9yIChpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldjsKKwkJICAgIGkrKywgcHRyICs9IHNjYWxfZGV0YWlsX3NpemUpCisJCXNjYWxfZGV2c1tpXSA9IChzdHJ1Y3Qgc2NhbF9kZXRhaWwgKilwdHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXY7CisJCSAgICBpKyssIHB0ciArPSByaW9fZGV0YWlsX3NpemUpCisJCXJpb19kZXZzW2ldID0gKHN0cnVjdCByaW9fZGV0YWlsICopcHRyOworCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgX19pbml0IGRldGVjdF9jYWxnYXJ5KHZvaWQpCiB7CiAJdTMyIHZhbDsKIAlpbnQgYnVzOwogCXZvaWQgKnRibDsKIAlpbnQgY2FsZ2FyeV9mb3VuZCA9IDA7Ci0JaW50IHBoYiA9IC0xOworCXVuc2lnbmVkIGxvbmcgcHRyOworCWludCBvZmZzZXQ7CisJaW50IHJldDsKIAogCS8qCiAJICogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIGlvbW11PW9mZiBvciBpb21tdT1zb2Z0IG9yIHdlIGZvdW5kCkBAIC05MzUsMjUgKzEwNjIsNDcgQEAKIAlpZiAoc3dpb3RsYiB8fCBub19pb21tdSB8fCBpb21tdV9kZXRlY3RlZCkKIAkJcmV0dXJuOwogCisJaWYgKCF1c2VfY2FsZ2FyeSkKKwkJcmV0dXJuOworCiAJaWYgKCFlYXJseV9wY2lfYWxsb3dlZCgpKQogCQlyZXR1cm47CiAKKwlwdHIgPSAodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQoZ2V0X2Jpb3NfZWJkYSgpKTsKKworCXJpb190YWJsZV9oZHIgPSBOVUxMOworCW9mZnNldCA9IDB4MTgwOworCXdoaWxlIChvZmZzZXQpIHsKKwkJLyogVGhlIGJsb2NrIGlkIGlzIHN0b3JlZCBpbiB0aGUgMm5kIHdvcmQgKi8KKwkJaWYgKCooKHVuc2lnbmVkIHNob3J0ICopKHB0ciArIG9mZnNldCArIDIpKSA9PSAweDQ3NTIpeworCQkJLyogc2V0IHRoZSBwb2ludGVyIHBhc3QgdGhlIG9mZnNldCAmIGJsb2NrIGlkICovCisJCQlyaW9fdGFibGVfaGRyID0gKHN0cnVjdCByaW9fdGFibGVfaGRyICopKHB0ciArIG9mZnNldCArIDQpOworCQkJYnJlYWs7CisJCX0KKwkJLyogVGhlIG5leHQgb2Zmc2V0IGlzIHN0b3JlZCBpbiB0aGUgMXN0IHdvcmQuIDAgbWVhbnMgbm8gbW9yZSAqLworCQlvZmZzZXQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKShwdHIgKyBvZmZzZXQpKTsKKwl9CisJaWYgKCFyaW9fdGFibGVfaGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogVW5hYmxlIHRvIGxvY2F0ZSAiCisJCQkJIlJpbyBHcmFuZGUgVGFibGUgaW4gRUJEQSAtIGJhaWxpbmchXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGJ1aWxkX2RldGFpbF9hcnJheXMoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogYnVpbGRfZGV0YWlsX2FycmF5cyByZXQgJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKIAlzcGVjaWZpZWRfdGFibGVfc2l6ZSA9IGRldGVybWluZV90Y2VfdGFibGVfc2l6ZShlbmRfcGZuICogUEFHRV9TSVpFKTsKIAogCWZvciAoYnVzID0gMDsgYnVzIDwgTUFYX1BIQl9CVVNfTlVNOyBidXMrKykgewogCQlpbnQgZGV2OwogCQlzdHJ1Y3QgY2FsZ2FyeV9idXNfaW5mbyAqaW5mbyA9ICZidXNfaW5mb1tidXNdOwotCQlpbmZvLT5waGJpZCA9IC0xOwogCiAJCWlmIChyZWFkX3BjaV9jb25maWcoYnVzLCAwLCAwLCAwKSAhPSBQQ0lfVkVORE9SX0RFVklDRV9JRF9DQUxHQVJZKQogCQkJY29udGludWU7CiAKLQkJLyoKLQkJICogVGhlcmUgYXJlIDQgUEhCcyBwZXIgQ2FsZ2FyeSBjaGlwLiAgU2V0IHBoYiB0byB3aGljaCBwaGIgKDAtMykKLQkJICogaXQgaXMgY29ubmVjdGVkIHRvIHJlbGVhdGl2ZSB0byB0aGUgY2xhZ2FyeSBjaGlwLgotCQkgKi8KLQkJcGhiID0gKHBoYiArIDEpICUgUEhCU19QRVJfQ0FMR0FSWTsKLQogCQlpZiAoaW5mby0+dHJhbnNsYXRpb25fZGlzYWJsZWQpCiAJCQljb250aW51ZTsKIApAQCAtOTY4LDcgKzExMTcsNiBAQAogCQkJCWlmICghdGJsKQogCQkJCQlnb3RvIGNsZWFudXA7CiAJCQkJaW5mby0+dGNlX3NwYWNlID0gdGJsOwotCQkJCWluZm8tPnBoYmlkID0gcGhiOwogCQkJCWNhbGdhcnlfZm91bmQgPSAxOwogCQkJCWJyZWFrOwogCQkJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggZjhkODU3NC4uNjgzYjdhNSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWRtYS5jCkBAIC0yOTYsNiArMjk2LDExIEBACiAJCWdhcnRfcGFyc2Vfb3B0aW9ucyhwKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0NBTEdBUllfSU9NTVUKKwkJaWYgKCFzdHJuY21wKHAsICJjYWxnYXJ5IiwgNykpCisJCQl1c2VfY2FsZ2FyeSA9IDE7CisjZW5kaWYgLyogQ09ORklHX0NBTEdBUllfSU9NTVUgKi8KKwogCQlwICs9IHN0cmNzcG4ocCwgIiwiKTsKIAkJaWYgKCpwID09ICcsJykKIAkJCSsrcDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3BjaS1nYXJ0LmMKaW5kZXggMTYyNjFhOC4uZmMxOTYwZiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3BjaS1nYXJ0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3BjaS1nYXJ0LmMKQEAgLTYwMSwxMCArNjAxLDkgQEAKIAkgICAgKCFmb3JjZV9pb21tdSAmJiBlbmRfcGZuIDw9IE1BWF9ETUEzMl9QRk4pIHx8CiAJICAgICFpb21tdV9hcGVydHVyZSB8fAogCSAgICAobm9fYWdwICYmIGluaXRfazhfZ2F0dCgmaW5mbykgPCAwKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiBEaXNhYmxpbmcgSU9NTVUuXG4iKTsKIAkJaWYgKGVuZF9wZm4gPiBNQVhfRE1BMzJfUEZOKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkcgbW9yZSB0aGFuIDRHQiBvZiBtZW1vcnkgIgotCQkJCQkiYnV0IElPTU1VIG5vdCBhdmFpbGFibGUuXG4iCisJCQkJCSJidXQgR0FSVCBJT01NVSBub3QgYXZhaWxhYmxlLlxuIgogCQkJICAgICAgIEtFUk5fRVJSICJXQVJOSU5HIDMyYml0IFBDSSBtYXkgbWFsZnVuY3Rpb24uXG4iKTsKIAkJfQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCA1ZTk1YjI1Li5hNDE4ZWU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTg4LDkgKzg4LDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0X2lkbGUodm9pZCkKIHsKLQlpZiAocmVhZF9wZGEoaXNpZGxlKSA9PSAwKQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXRfcGRhKDAsIGlzaWRsZSkgPT0gMCkKIAkJcmV0dXJuOwotCXdyaXRlX3BkYShpc2lkbGUsIDApOwogCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZpZGxlX25vdGlmaWVyLCBJRExFX0VORCwgTlVMTCk7CiB9CiAKQEAgLTEwOSwxNyArMTA4LDE1IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQogewotCWxvY2FsX2lycV9lbmFibGUoKTsKLQogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19QT0xMSU5HOwogCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7Ci0Jd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJc2FmZV9oYWx0KCk7Ci0JCWVsc2UKLQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQl9CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlpZiAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCS8qIEVuYWJsZXMgaW50ZXJydXB0cyBvbmUgaW5zdHJ1Y3Rpb24gYmVmb3JlIEhMVC4KKwkJICAgeDg2IHNwZWNpYWwgY2FzZXMgdGhpcyBzbyB0aGVyZSBpcyBubyByYWNlLiAqLworCQlzYWZlX2hhbHQoKTsKKwl9IGVsc2UKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzIHw9IFRTX1BPTExJTkc7CiB9CiAKQEAgLTEzMSwyMSArMTI4LDEzIEBACiBzdGF0aWMgdm9pZCBwb2xsX2lkbGUgKHZvaWQpCiB7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JYXNtIHZvbGF0aWxlKAotCQkiMjoiCi0JCSJ0ZXN0bCAlMCwlMTsiCi0JCSJyZXA7IG5vcDsiCi0JCSJqZSAyYjsiCi0JCTogOgotCQkiaSIgKF9USUZfTkVFRF9SRVNDSEVEKSwKLQkJIm0iIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKSk7CisJY3B1X3JlbGF4KCk7CiB9CiAKIHZvaWQgY3B1X2lkbGVfd2FpdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBjcHUsIHRoaXNfY3B1ID0gZ2V0X2NwdSgpOwotCWNwdW1hc2tfdCBtYXA7CisJY3B1bWFza190IG1hcCwgdG1wID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwogCiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSh0aGlzX2NwdSkpOwogCXB1dF9jcHUoKTsKQEAgLTE2OCw2ICsxNTcsOCBAQAogCQl9CiAJCWNwdXNfYW5kKG1hcCwgbWFwLCBjcHVfb25saW5lX21hcCk7CiAJfSB3aGlsZSAoIWNwdXNfZW1wdHkobWFwKSk7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHRtcCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVfaWRsZV93YWl0KTsKIApAQCAtMjE4LDYgKzIwOSwxMiBAQAogCQkJCWlkbGUgPSBkZWZhdWx0X2lkbGU7CiAJCQlpZiAoY3B1X2lzX29mZmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSkKIAkJCQlwbGF5X2RlYWQoKTsKKwkJCS8qCisJCQkgKiBJZGxlIHJvdXRpbmVzIHNob3VsZCBrZWVwIGludGVycnVwdHMgZGlzYWJsZWQKKwkJCSAqIGZyb20gaGVyZSBvbiwgdW50aWwgdGhleSBnbyB0byBpZGxlLgorCQkJICogT3RoZXJ3aXNlLCBpZGxlIGNhbGxiYWNrcyBjYW4gbWlzZmlyZS4KKwkJCSAqLworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJCWVudGVyX2lkbGUoKTsKIAkJCWlkbGUoKTsKIAkJCS8qIEluIG1hbnkgY2FzZXMgdGhlIGludGVycnVwdCB0aGF0IGVuZGVkIGlkbGUKQEAgLTIzOCwxNyArMjM1LDMyIEBACiAgKiBXZSBleGVjdXRlIE1PTklUT1IgYWdhaW5zdCBuZWVkX3Jlc2NoZWQgYW5kIGVudGVyIG9wdGltaXplZCB3YWl0IHN0YXRlCiAgKiB0aHJvdWdoIE1XQUlULiBXaGVuZXZlciBzb21lb25lIGNoYW5nZXMgbmVlZF9yZXNjaGVkLCB3ZSB3b3VsZCBiZSB3b2tlbgogICogdXAgZnJvbSBNV0FJVCAod2l0aG91dCBhbiBJUEkpLgorICoKKyAqIE5ldyB3aXRoIENvcmUgRHVvIHByb2Nlc3NvcnMsIE1XQUlUIGNhbiB0YWtlIHNvbWUgaGludHMgYmFzZWQgb24gQ1BVCisgKiBjYXBhYmlsaXR5LgogICovCi1zdGF0aWMgdm9pZCBtd2FpdF9pZGxlKHZvaWQpCit2b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGVheCwgdW5zaWduZWQgbG9uZyBlY3gpCiB7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0Jd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgeworCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKIAkJX19tb25pdG9yKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIDAsIDApOwogCQlzbXBfbWIoKTsKLQkJaWYgKG5lZWRfcmVzY2hlZCgpKQotCQkJYnJlYWs7Ci0JCV9fbXdhaXQoMCwgMCk7CisJCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCQlfX213YWl0KGVheCwgZWN4KTsKKwl9Cit9CisKKy8qIERlZmF1bHQgTU9OSVRPUi9NV0FJVCB3aXRoIG5vIGhpbnRzLCB1c2VkIGZvciBkZWZhdWx0IEMxIHN0YXRlICovCitzdGF0aWMgdm9pZCBtd2FpdF9pZGxlKHZvaWQpCit7CisJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgeworCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7CisJCXNtcF9tYigpOworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJX19zdGlfbXdhaXQoMCwgMCk7CisJCWVsc2UKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9IGVsc2UgeworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGZjOTQ0YjUuLmFmNDI1YTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCkBAIC00NzEsOCArNDcxLDcgQEAKIAlpZiAoTE9BREVSX1RZUEUgJiYgSU5JVFJEX1NUQVJUKSB7CiAJCWlmIChJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSA8PSAoZW5kX3BmbiA8PCBQQUdFX1NISUZUKSkgewogCQkJcmVzZXJ2ZV9ib290bWVtX2dlbmVyaWMoSU5JVFJEX1NUQVJULCBJTklUUkRfU0laRSk7Ci0JCQlpbml0cmRfc3RhcnQgPQotCQkJCUlOSVRSRF9TVEFSVCA/IElOSVRSRF9TVEFSVCArIFBBR0VfT0ZGU0VUIDogMDsKKwkJCWluaXRyZF9zdGFydCA9IElOSVRSRF9TVEFSVCArIFBBR0VfT0ZGU0VUOwogCQkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCtJTklUUkRfU0laRTsKIAkJfQogCQllbHNlIHsKQEAgLTczMiwxMSArNzMxLDggQEAKIAkvKiBGaXggY3B1aWQ0IGVtdWxhdGlvbiBmb3IgbW9yZSAqLwogCW51bV9jYWNoZV9sZWF2ZXMgPSAzOwogCi0JLyogV2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBjb3JlIG5vIG5lZWQgdG8gc3luY2hyb25pemUgUkRUU0MgKi8KLQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA9PSAxKQotCSAgICAgICAgc2V0X2JpdChYODZfRkVBVFVSRV9TWU5DX1JEVFNDLCAmYy0+eDg2X2NhcGFiaWxpdHkpOwotCWVsc2UKLQkgICAgICAgIGNsZWFyX2JpdChYODZfRkVBVFVSRV9TWU5DX1JEVFNDLCAmYy0+eDg2X2NhcGFiaWxpdHkpOworCS8qIFJEVFNDIGNhbiBiZSBzcGVjdWxhdGVkIGFyb3VuZCAqLworCWNsZWFyX2JpdChYODZfRkVBVFVSRV9TWU5DX1JEVFNDLCAmYy0+eDg2X2NhcGFiaWxpdHkpOwogfQogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgZGV0ZWN0X2h0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKQEAgLTgzNSw2ICs4MzEsMTUgQEAKIAkJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OLCAmYy0+eDg2X2NhcGFiaWxpdHkpOwogCX0KIAorCWlmIChjcHVfaGFzX2RzKSB7CisJCXVuc2lnbmVkIGludCBsMSwgbDI7CisJCXJkbXNyKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsMSwgbDIpOworCQlpZiAoIShsMSAmICgxPDwxMSkpKQorCQkJc2V0X2JpdChYODZfRkVBVFVSRV9CVFMsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJaWYgKCEobDEgJiAoMTw8MTIpKSkKKwkJCXNldF9iaXQoWDg2X0ZFQVRVUkVfUEVCUywgYy0+eDg2X2NhcGFiaWxpdHkpOworCX0KKwogCW4gPSBjLT5leHRlbmRlZF9jcHVpZF9sZXZlbDsKIAlpZiAobiA+PSAweDgwMDAwMDA4KSB7CiAJCXVuc2lnbmVkIGVheCA9IGNwdWlkX2VheCgweDgwMDAwMDA4KTsKQEAgLTg1NCw3ICs4NTksMTAgQEAKIAkJc2V0X2JpdChYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MsICZjLT54ODZfY2FwYWJpbGl0eSk7CiAJaWYgKGMtPng4NiA9PSA2KQogCQlzZXRfYml0KFg4Nl9GRUFUVVJFX1JFUF9HT09ELCAmYy0+eDg2X2NhcGFiaWxpdHkpOwotCXNldF9iaXQoWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQywgJmMtPng4Nl9jYXBhYmlsaXR5KTsKKwlpZiAoYy0+eDg2ID09IDE1KQorCQlzZXRfYml0KFg4Nl9GRUFUVVJFX1NZTkNfUkRUU0MsICZjLT54ODZfY2FwYWJpbGl0eSk7CisJZWxzZQorCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQywgJmMtPng4Nl9jYXBhYmlsaXR5KTsKICAJYy0+eDg2X21heF9jb3JlcyA9IGludGVsX251bV9jcHVfY29yZXMoYyk7CiAKIAlzcmF0X2RldGVjdF9ub2RlKCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wLmMKaW5kZXggNGY2NzY5Ny4uYWYxZWM0ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXAuYwpAQCAtMzc2LDE2ICszNzYsMjAgQEAKIAkvKiBwcmV2ZW50IHByZWVtcHRpb24gYW5kIHJlc2NoZWR1bGUgb24gYW5vdGhlciBwcm9jZXNzb3IgKi8KIAlpbnQgbWUgPSBnZXRfY3B1KCk7CiAJaWYgKGNwdSA9PSBtZSkgewotCQlXQVJOX09OKDEpOwogCQlwdXRfY3B1KCk7Ci0JCXJldHVybiAtRUJVU1k7CisJCXJldHVybiAwOwogCX0KKworCS8qIENhbiBkZWFkbG9jayB3aGVuIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKi8KKwlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CisKIAlzcGluX2xvY2tfYmgoJmNhbGxfbG9jayk7CiAJX19zbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBmdW5jLCBpbmZvLCBub25hdG9taWMsIHdhaXQpOwogCXNwaW5fdW5sb2NrX2JoKCZjYWxsX2xvY2spOwogCXB1dF9jcHUoKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKIAogLyoKICAqIHRoaXMgZnVuY3Rpb24gc2VuZHMgYSAnZ2VuZXJpYyBjYWxsIGZ1bmN0aW9uJyBJUEkgdG8gYWxsIG90aGVyIENQVXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDdiN2E2ODcuLmRhZjE5MzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwpAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL251bWEuaD4KKyNpbmNsdWRlIDxhc20vZ2VuYXBpYy5oPgogCiAvKiBOdW1iZXIgb2Ygc2libGluZ3MgcGVyIENQVSBwYWNrYWdlICovCiBpbnQgc21wX251bV9zaWJsaW5ncyA9IDE7CkBAIC01ODEsMTIgKzU4MiwxNiBAQAogCSAqIHNtcF9jYWxsX2Z1bmN0aW9uKCkuCiAJICovCiAJbG9ja19pcGlfY2FsbF9sb2NrKCk7CisJc3Bpbl9sb2NrKCZ2ZWN0b3JfbG9jayk7CiAKKwkvKiBTZXR1cCB0aGUgcGVyIGNwdSBpcnEgaGFuZGxpbmcgZGF0YSBzdHJ1Y3R1cmVzICovCisJX19zZXR1cF92ZWN0b3JfaXJxKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJLyoKIAkgKiBBbGxvdyB0aGUgbWFzdGVyIHRvIGNvbnRpbnVlLgogCSAqLwogCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CiAJcGVyX2NwdShjcHVfc3RhdGUsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPSBDUFVfT05MSU5FOworCXNwaW5fdW5sb2NrKCZ2ZWN0b3JfbG9jayk7CiAJdW5sb2NrX2lwaV9jYWxsX2xvY2soKTsKIAogCWNwdV9pZGxlKCk7CkBAIC03NDksMTQgKzc1NCwxNiBAQAogfQogCiBzdHJ1Y3QgY3JlYXRlX2lkbGUgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogCWludCBjcHU7CiB9OwogCi12b2lkIGRvX2ZvcmtfaWRsZSh2b2lkICpfY19pZGxlKQordm9pZCBkb19mb3JrX2lkbGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBjcmVhdGVfaWRsZSAqY19pZGxlID0gX2NfaWRsZTsKKwlzdHJ1Y3QgY3JlYXRlX2lkbGUgKmNfaWRsZSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY3JlYXRlX2lkbGUsIHdvcmspOwogCiAJY19pZGxlLT5pZGxlID0gZm9ya19pZGxlKGNfaWRsZS0+Y3B1KTsKIAljb21wbGV0ZSgmY19pZGxlLT5kb25lKTsKQEAgLTc3MSwxMCArNzc4LDEwIEBACiAJaW50IHRpbWVvdXQ7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9yaXA7CiAJc3RydWN0IGNyZWF0ZV9pZGxlIGNfaWRsZSA9IHsKKwkJLndvcmsgPSBfX1dPUktfSU5JVElBTElaRVIoY19pZGxlLndvcmssIGRvX2ZvcmtfaWRsZSksCiAJCS5jcHUgPSBjcHUsCiAJCS5kb25lID0gQ09NUExFVElPTl9JTklUSUFMSVpFUl9PTlNUQUNLKGNfaWRsZS5kb25lKSwKIAl9OwotCURFQ0xBUkVfV09SSyh3b3JrLCBkb19mb3JrX2lkbGUsICZjX2lkbGUpOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBnZHRzIG9mIHNlY29uZGFyeSBjcHVzLiBIb3RwbHVnIGlzIGNvbnNpZGVyZWQgKi8KIAlpZiAoIWNwdV9nZHRfZGVzY3JbY3B1XS5hZGRyZXNzICYmCkBAIC03OTksNyArODA2LDYgQEAKIAkJCQljcHUsIG5vZGUpOwogCX0KIAotCiAJYWx0ZXJuYXRpdmVzX3NtcF9zd2l0Y2goMSk7CiAKIAljX2lkbGUuaWRsZSA9IGdldF9pZGxlX2Zvcl9jcHUoY3B1KTsKQEAgLTgyMiw5ICs4MjgsOSBAQAogCSAqIHRocmVhZC4KIAkgKi8KIAlpZiAoIWtldmVudGRfdXAoKSB8fCBjdXJyZW50X2lzX2tldmVudGQoKSkKLQkJd29yay5mdW5jKHdvcmsuZGF0YSk7CisJCWNfaWRsZS53b3JrLmZ1bmMoJmNfaWRsZS53b3JrKTsKIAllbHNlIHsKLQkJc2NoZWR1bGVfd29yaygmd29yayk7CisJCXNjaGVkdWxlX3dvcmsoJmNfaWRsZS53b3JrKTsKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmY19pZGxlLmRvbmUpOwogCX0KIApAQCAtMTE2NCw2ICsxMTcwLDEzIEBACiAKIAl3aGlsZSAoIWNwdV9pc3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKSkKIAkJY3B1X3JlbGF4KCk7CisKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPiA4ICYmIGdlbmFwaWMgPT0gJmFwaWNfZmxhdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiZmxhdCBBUElDIHJvdXRpbmcgY2FuJ3QgYmUgdXNlZCB3aXRoID4gOCBjcHVzXG4iKTsKKwkJQlVHKCk7CisJfQorCiAJZXJyID0gMDsKIAogCXJldHVybiBlcnI7CkBAIC0xMjQ2LDggKzEyNTksMTAgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCXJlbW92ZV9zaWJsaW5naW5mbyhjcHUpOwogCisJc3Bpbl9sb2NrKCZ2ZWN0b3JfbG9jayk7CiAJLyogSXQncyBub3cgc2FmZSB0byByZW1vdmUgdGhpcyBwcm9jZXNzb3IgZnJvbSB0aGUgb25saW5lIG1hcCAqLwogCWNwdV9jbGVhcihjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKwlzcGluX3VubG9jaygmdmVjdG9yX2xvY2spOwogCXJlbW92ZV9jcHVfZnJvbV9tYXBzKCk7CiAJZml4dXBfaXJxcyhjcHVfb25saW5lX21hcCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwppbmRleCAxYmE1YTQ0Li45ZjA1YmM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKQEAgLTU2Myw3ICs1NjMsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2luaXQgPSAwOwogc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcms7CiAKLXN0YXRpYyB2b2lkIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQgKnYpCitzdGF0aWMgdm9pZCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnYpCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewpAQCAtNjM5LDcgKzYzOSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfdHNjKHZvaWQpCiB7Ci0JSU5JVF9XT1JLKCZjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcmssIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0LCBOVUxMKTsKKwlJTklUX1dPUksoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yaywgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQpOwogCWlmICghY3B1ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcigmdGltZV9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLAogCQkJCSAgICAgICBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpKQogCQljcHVmcmVxX2luaXQgPSAxOwpAQCAtODc2LDE1ICs4NzYsNiBAQAogCXRpbWVyX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwgQ1BVX01BU0tfTk9ORSwgInRpbWVyIiwgTlVMTCwgTlVMTAogfTsKIAotc3RhdGljIGludCBfX2NwdWluaXQKLXRpbWVfY3B1X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQotewotCXVuc2lnbmVkIGNwdSA9ICh1bnNpZ25lZCBsb25nKSBoY3B1OwotCWlmIChhY3Rpb24gPT0gQ1BVX09OTElORSkKLQkJdnN5c2NhbGxfc2V0X2NwdShjcHUpOwotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLQogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7CiAJaWYgKG5vaHBldCkKQEAgLTkyNSw4ICs5MTYsNiBAQAogCXZ4dGltZS5sYXN0X3RzYyA9IGdldF9jeWNsZXNfc3luYygpOwogCXNldF9jeWMybnNfc2NhbGUoY3B1X2toeik7CiAJc2V0dXBfaXJxKDAsICZpcnEwKTsKLQlob3RjcHVfbm90aWZpZXIodGltZV9jcHVfbm90aWZpZXIsIDApOwotCXRpbWVfY3B1X25vdGlmaWVyKE5VTEwsIENQVV9PTkxJTkUsICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogI2lmbmRlZiBDT05GSUdfU01QCiAJdGltZV9pbml0X2d0b2QoKTsKQEAgLTk0OCw3ICs5MzcsNyBAQAogIAlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpIHsKICNpZmRlZiBDT05GSUdfQUNQSQogCQkvKiBCdXQgVFNDIGRvZXNuJ3QgdGljayBpbiBDMyBzbyBkb24ndCB1c2UgaXQgdGhlcmUgKi8KLQkJaWYgKGFjcGlfZmFkdC5sZW5ndGggPiAwICYmIGFjcGlfZmFkdC5wbHZsM19sYXQgPCAxMDApCisJCWlmIChhY3BpX2ZhZHQubGVuZ3RoID4gMCAmJiBhY3BpX2ZhZHQucGx2bDNfbGF0IDwgMTAwMCkKIAkJCXJldHVybiAxOwogI2VuZGlmCiAgCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKaW5kZXggNzgxOTAyMmEuLmI1NGNjYzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCkBAIC0zMCw5ICszMCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KQEAgLTEwOCw3ICsxMDksNyBAQAogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIH0KIAotc3RhdGljIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSAxMjsKK2ludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSAxMjsKICNpZmRlZiBDT05GSUdfU1RBQ0tfVU5XSU5ECiBzdGF0aWMgaW50IGNhbGxfdHJhY2UgPSAxOwogI2Vsc2UKQEAgLTIyNSwxNiArMjI2LDI1IEBACiB7CiAJc3RydWN0IG9wc19hbmRfZGF0YSAqb2FkID0gKHN0cnVjdCBvcHNfYW5kX2RhdGEgKiljb250ZXh0OwogCWludCBuID0gMDsKKwl1bnNpZ25lZCBsb25nIHNwID0gVU5XX1NQKGluZm8pOwogCisJaWYgKGFyY2hfdW53X3VzZXJfbW9kZShpbmZvKSkKKwkJcmV0dXJuIC0xOwogCXdoaWxlICh1bndpbmQoaW5mbykgPT0gMCAmJiBVTldfUEMoaW5mbykpIHsKIAkJbisrOwogCQlvYWQtPm9wcy0+YWRkcmVzcyhvYWQtPmRhdGEsIFVOV19QQyhpbmZvKSk7CiAJCWlmIChhcmNoX3Vud191c2VyX21vZGUoaW5mbykpCiAJCQlicmVhazsKKwkJaWYgKChzcCAmIH4oUEFHRV9TSVpFIC0gMSkpID09IChVTldfU1AoaW5mbykgJiB+KFBBR0VfU0laRSAtIDEpKQorCQkgICAgJiYgc3AgPiBVTldfU1AoaW5mbykpCisJCQlicmVhazsKKwkJc3AgPSBVTldfU1AoaW5mbyk7CiAJfQogCXJldHVybiBuOwogfQogCisjZGVmaW5lIE1TRyh0eHQpIG9wcy0+d2FybmluZyhkYXRhLCB0eHQpCisKIC8qCiAgKiB4ODYtNjQgY2FuIGhhdmUgdXB0byB0aHJlZSBrZXJuZWwgc3RhY2tzOiAKICAqIHByb2Nlc3Mgc3RhY2sKQEAgLTI0MiwxMiArMjUyLDIwIEBACiAgKiBzZXZlcmUgZXhjZXB0aW9uIChkb3VibGUgZmF1bHQsIG5taSwgc3RhY2sgZmF1bHQsIGRlYnVnLCBtY2UpIGhhcmR3YXJlIHN0YWNrCiAgKi8KIAotdm9pZCBkdW1wX3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqIHN0YWNrLAorc3RhdGljIGlubGluZSBpbnQgdmFsaWRfc3RhY2tfcHRyKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm8sIHZvaWQgKnApCit7CisJdm9pZCAqdCA9ICh2b2lkICopdGluZm87CisgICAgICAgIHJldHVybiBwID4gdCAmJiBwIDwgdCArIFRIUkVBRF9TSVpFIC0gMzsKK30KKwordm9pZCBkdW1wX3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJdW5zaWduZWQgbG9uZyAqc3RhY2ssCiAJCXN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQogewotCWNvbnN0IHVuc2lnbmVkIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl1bnNpZ25lZCBsb25nICppcnFzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyAqKWNwdV9wZGEoY3B1KS0+aXJxc3RhY2twdHI7CisJY29uc3QgdW5zaWduZWQgY3B1ID0gZ2V0X2NwdSgpOworCXVuc2lnbmVkIGxvbmcgKmlycXN0YWNrX2VuZCA9ICh1bnNpZ25lZCBsb25nKiljcHVfcGRhKGNwdSktPmlycXN0YWNrcHRyOwogCXVuc2lnbmVkIHVzZWQgPSAwOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm87CiAKIAlpZiAoIXRzaykKIAkJdHNrID0gY3VycmVudDsKQEAgLTI2MSwyOCArMjc5LDMwIEBACiAJCQlpZiAodW53aW5kX2luaXRfZnJhbWVfaW5mbygmaW5mbywgdHNrLCByZWdzKSA9PSAwKQogCQkJCXVud19yZXQgPSBkdW1wX3RyYWNlX3Vud2luZCgmaW5mbywgJm9hZCk7CiAJCX0gZWxzZSBpZiAodHNrID09IGN1cnJlbnQpCi0JCQl1bndfcmV0ID0gdW53aW5kX2luaXRfcnVubmluZygmaW5mbywgZHVtcF90cmFjZV91bndpbmQsICZvYWQpOworCQkJdW53X3JldCA9IHVud2luZF9pbml0X3J1bm5pbmcoJmluZm8sIGR1bXBfdHJhY2VfdW53aW5kLAorCQkJCQkJICAgICAgJm9hZCk7CiAJCWVsc2UgewogCQkJaWYgKHVud2luZF9pbml0X2Jsb2NrZWQoJmluZm8sIHRzaykgPT0gMCkKIAkJCQl1bndfcmV0ID0gZHVtcF90cmFjZV91bndpbmQoJmluZm8sICZvYWQpOwogCQl9CiAJCWlmICh1bndfcmV0ID4gMCkgewogCQkJaWYgKGNhbGxfdHJhY2UgPT0gMSAmJiAhYXJjaF91bndfdXNlcl9tb2RlKCZpbmZvKSkgewotCQkJCW9wcy0+d2FybmluZ19zeW1ib2woZGF0YSwgIkRXQVJGMiB1bndpbmRlciBzdHVjayBhdCAlc1xuIiwKKwkJCQlvcHMtPndhcm5pbmdfc3ltYm9sKGRhdGEsCisJCQkJCSAgICAgIkRXQVJGMiB1bndpbmRlciBzdHVjayBhdCAlcyIsCiAJCQkJCSAgICAgVU5XX1BDKCZpbmZvKSk7CiAJCQkJaWYgKChsb25nKVVOV19TUCgmaW5mbykgPCAwKSB7Ci0JCQkJCW9wcy0+d2FybmluZyhkYXRhLCAiTGVmdG92ZXIgaW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwkJCQkJTVNHKCJMZWZ0b3ZlciBpbmV4YWN0IGJhY2t0cmFjZToiKTsKIAkJCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKVVOV19TUCgmaW5mbyk7CiAJCQkJCWlmICghc3RhY2spCi0JCQkJCQlyZXR1cm47CisJCQkJCQlnb3RvIG91dDsKIAkJCQl9IGVsc2UKLQkJCQkJb3BzLT53YXJuaW5nKGRhdGEsICJGdWxsIGluZXhhY3QgYmFja3RyYWNlIGFnYWluOlxuIik7CisJCQkJCU1TRygiRnVsbCBpbmV4YWN0IGJhY2t0cmFjZSBhZ2FpbjoiKTsKIAkJCX0gZWxzZSBpZiAoY2FsbF90cmFjZSA+PSAxKQotCQkJCXJldHVybjsKKwkJCQlnb3RvIG91dDsKIAkJCWVsc2UKLQkJCQlvcHMtPndhcm5pbmcoZGF0YSwgIkZ1bGwgaW5leGFjdCBiYWNrdHJhY2UgYWdhaW46XG4iKTsKKwkJCQlNU0coIkZ1bGwgaW5leGFjdCBiYWNrdHJhY2UgYWdhaW46Iik7CiAJCX0gZWxzZQotCQkJb3BzLT53YXJuaW5nKGRhdGEsICJJbmV4YWN0IGJhY2t0cmFjZTpcbiIpOworCQkJTVNHKCJJbmV4YWN0IGJhY2t0cmFjZToiKTsKIAl9CiAJaWYgKCFzdGFjaykgewogCQl1bnNpZ25lZCBsb25nIGR1bW15OwpAQCAtMjk5LDkgKzMxOSw5IEBACiAjZGVmaW5lIEhBTkRMRV9TVEFDSyhjb25kKSBcCiAJZG8gd2hpbGUgKGNvbmQpIHsgXAogCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAqc3RhY2srKzsgXAotCQlpZiAob29wc19pbl9wcm9ncmVzcyA/IAkJXAotCQkJX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpIDogXAotCQkJa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgeyBcCisJCS8qIFVzZSB1bmxvY2tlZCBhY2Nlc3MgaGVyZSBiZWNhdXNlIGV4Y2VwdCBmb3IgTk1JcwlcCisJCSAgIHdlIHNob3VsZCBiZSBhbHJlYWR5IHByb3RlY3RlZCBhZ2FpbnN0IG1vZHVsZSB1bmxvYWRzICovIFwKKwkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgeyBcCiAJCQkvKiBcCiAJCQkgKiBJZiB0aGUgYWRkcmVzcyBpcyBlaXRoZXIgaW4gdGhlIHRleHQgc2VnbWVudCBvZiB0aGUgXAogCQkJICoga2VybmVsLCBvciBpbiB0aGUgcmVnaW9uIHdoaWNoIGNvbnRhaW5zIHZtYWxsb2MnZWQgXApAQCAtMzY0LDggKzM4NCwxMSBAQAogCS8qCiAJICogVGhpcyBoYW5kbGVzIHRoZSBwcm9jZXNzIHN0YWNrOgogCSAqLwotCUhBTkRMRV9TVEFDSyAoKChsb25nKSBzdGFjayAmIChUSFJFQURfU0laRS0xKSkgIT0gMCk7CisJdGluZm8gPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisJSEFORExFX1NUQUNLICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSk7CiAjdW5kZWYgSEFORExFX1NUQUNLCitvdXQ6CisJcHV0X2NwdSgpOwogfQogRVhQT1JUX1NZTUJPTChkdW1wX3RyYWNlKTsKIApAQCAtNTAyLDMwICs1MjUsMTUgQEAKIAlwcmludGsoIlxuIik7CiB9CQogCi12b2lkIGhhbmRsZV9CVUcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17IAotCXN0cnVjdCBidWdfZnJhbWUgZjsKLQlsb25nIGxlbjsKLQljb25zdCBjaGFyICpwcmVmaXggPSAiIjsKK2ludCBpc192YWxpZF9idWdhZGRyKHVuc2lnbmVkIGxvbmcgcmlwKQoreworCXVuc2lnbmVkIHNob3J0IHVkMjsKIAotCWlmICh1c2VyX21vZGUocmVncykpCi0JCXJldHVybjsgCi0JaWYgKF9fY29weV9mcm9tX3VzZXIoJmYsIChjb25zdCB2b2lkIF9fdXNlciAqKSByZWdzLT5yaXAsCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgYnVnX2ZyYW1lKSkpCi0JCXJldHVybjsgCi0JaWYgKGYuZmlsZW5hbWUgPj0gMCB8fAotCSAgICBmLnVkMlswXSAhPSAweDBmIHx8IGYudWQyWzFdICE9IDB4MGIpIAotCQlyZXR1cm47Ci0JbGVuID0gX19zdHJubGVuX3VzZXIoKGNoYXIgKikobG9uZylmLmZpbGVuYW1lLCBQQVRIX01BWCkgLSAxOwotCWlmIChsZW4gPCAwIHx8IGxlbiA+PSBQQVRIX01BWCkKLQkJZi5maWxlbmFtZSA9IChpbnQpKGxvbmcpInVubWFwcGVkIGZpbGVuYW1lIjsKLQllbHNlIGlmIChsZW4gPiA1MCkgewotCQlmLmZpbGVuYW1lICs9IGxlbiAtIDUwOwotCQlwcmVmaXggPSAiLi4uIjsKLQl9Ci0JcHJpbnRrKCItLS0tLS0tLS0tLSBbY3V0IGhlcmUgXSAtLS0tLS0tLS0gW3BsZWFzZSBiaXRlIGhlcmUgXSAtLS0tLS0tLS1cbiIpOwotCXByaW50ayhLRVJOX0FMRVJUICJLZXJuZWwgQlVHIGF0ICVzJS41MHM6JWRcbiIsIHByZWZpeCwgKGNoYXIgKikobG9uZylmLmZpbGVuYW1lLCBmLmxpbmUpOwotfSAKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmdWQyLCAoY29uc3Qgdm9pZCBfX3VzZXIgKikgcmlwLCBzaXplb2YodWQyKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHVkMiA9PSAweDBiMGY7Cit9CiAKICNpZmRlZiBDT05GSUdfQlVHCiB2b2lkIG91dF9vZl9saW5lX2J1Zyh2b2lkKQpAQCAtNjA1LDcgKzYxMyw5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IG9vcHNfYmVnaW4oKTsKIAotCWhhbmRsZV9CVUcocmVncyk7CisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCXJlcG9ydF9idWcocmVncy0+cmlwKTsKKwogCV9fZGllKHN0ciwgcmVncywgZXJyKTsKIAlvb3BzX2VuZChmbGFncyk7CiAJZG9fZXhpdChTSUdTRUdWKTsgCkBAIC03NzIsOCArNzgyLDcgQEAKIHsKIAlwcmludGsoS0VSTl9FTUVSRyAiVWhodWguIE5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeC5cbiIsCiAJCXJlYXNvbik7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIllvdSBwcm9iYWJseSBoYXZlIGEgaGFyZHdhcmUgcHJvYmxlbSB3aXRoIHlvdXIgIgotCQkiUkFNIGNoaXBzXG4iKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiWW91IGhhdmUgc29tZSBoYXJkd2FyZSBwcm9ibGVtLCBsaWtlbHkgb24gdGhlIFBDSSBidXMuXG4iKTsKIAogCWlmIChwYW5pY19vbl91bnJlY292ZXJlZF9ubWkpCiAJCXBhbmljKCJOTUk6IE5vdCBjb250aW51aW5nIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGI5ZGYyYWIuLjUxNGJlNWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xMywxMCArMTMsMTIgQEAKIE9VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQogRU5UUlkocGh5c19zdGFydHVwXzY0KQogamlmZmllc182NCA9IGppZmZpZXM7CitfcHJveHlfcGRhID0gMDsKIFBIRFJTIHsKIAl0ZXh0IFBUX0xPQUQgRkxBR1MoNSk7CS8qIFJfRSAqLwogCWRhdGEgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCiAJdXNlciBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KKwlkYXRhLmluaXQgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCiAJbm90ZSBQVF9OT1RFIEZMQUdTKDQpOwkvKiBSX18gKi8KIH0KIFNFQ1RJT05TCkBAIC01MCwxNSArNTIsOSBAQAogCiAgIFJPREFUQQogCi0jaWZkZWYgQ09ORklHX1NUQUNLX1VOV0lORAotICAuID0gQUxJR04oOCk7Ci0gIC5laF9mcmFtZSA6IEFUKEFERFIoLmVoX2ZyYW1lKSAtIExPQURfT0ZGU0VUKSB7Ci0JX19zdGFydF91bndpbmQgPSAuOwotICAJKiguZWhfZnJhbWUpCi0JX19lbmRfdW53aW5kID0gLjsKLSAgfQotI2VuZGlmCisgIEJVR19UQUJMRQogCisgIC4gPSBBTElHTihQQUdFX1NJWkUpOyAgICAgICAgLyogQWxpZ24gZGF0YSBzZWdtZW50IHRvIHBhZ2Ugc2l6ZSBib3VuZGFyeSAqLwogCQkJCS8qIERhdGEgKi8KICAgLmRhdGEgOiBBVChBRERSKC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7CiAJKiguZGF0YSkKQEAgLTEzMSw3ICsxMjcsNyBAQAogICAuID0gQUxJR04oODE5Mik7CQkvKiBpbml0X3Rhc2sgKi8KICAgLmRhdGEuaW5pdF90YXNrIDogQVQoQUREUiguZGF0YS5pbml0X3Rhc2spIC0gTE9BRF9PRkZTRVQpIHsKIAkqKC5kYXRhLmluaXRfdGFzaykKLSAgfSA6ZGF0YQorICB9OmRhdGEuaW5pdAogCiAgIC4gPSBBTElHTig0MDk2KTsKICAgLmRhdGEucGFnZV9hbGlnbmVkIDogQVQoQUREUiguZGF0YS5wYWdlX2FsaWduZWQpIC0gTE9BRF9PRkZTRVQpIHsKQEAgLTE3NCwxMyArMTcwLDcgQEAKICAgX19zZXR1cF9lbmQgPSAuOwogICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKICAgLmluaXRjYWxsLmluaXQgOiBBVChBRERSKC5pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JKiguaW5pdGNhbGwxLmluaXQpIAotCSooLmluaXRjYWxsMi5pbml0KSAKLQkqKC5pbml0Y2FsbDMuaW5pdCkgCi0JKiguaW5pdGNhbGw0LmluaXQpIAotCSooLmluaXRjYWxsNS5pbml0KSAKLQkqKC5pbml0Y2FsbDYuaW5pdCkgCi0JKiguaW5pdGNhbGw3LmluaXQpCisJSU5JVENBTExTCiAgIH0KICAgX19pbml0Y2FsbF9lbmQgPSAuOwogICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnN5c2NhbGwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCmluZGV4IGE5OGI0NjAuLjI0MzNkNmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2dldGNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMzksNiArNDIsNyBAQAogI2luY2x1ZGUgPGFzbS90b3BvbG9neS5oPgogCiAjZGVmaW5lIF9fdnN5c2NhbGwobnIpIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsX19zZWN0aW9uX18oIi52c3lzY2FsbF8iICNucikpKQorI2RlZmluZSBfX3N5c2NhbGxfY2xvYmJlciAicjExIiwicmN4IiwibWVtb3J5IgogCiBpbnQgX19zeXNjdGxfdnN5c2NhbGwgX19zZWN0aW9uX3N5c2N0bF92c3lzY2FsbCA9IDE7CiBzZXFsb2NrX3QgX194dGltZV9sb2NrIF9fc2VjdGlvbl94dGltZV9sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKQEAgLTIyMSw4ICsyMjUsNyBAQAogCiBzdGF0aWMgaW50IHZzeXNjYWxsX3N5c2N0bF9ub3N0cmF0KGN0bF90YWJsZSAqdCwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLAotCQkJCXZvaWQgKipjb250ZXh0KQorCQkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CkBAIC0yNDMsMzIgKzI0NiwxNyBAQAogCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19jcHVpbml0IHdyaXRlX3JkdHNjcF9jYih2b2lkICppbmZvKQotewotCXdyaXRlX3JkdHNjcF9hdXgoKHVuc2lnbmVkIGxvbmcpaW5mbyk7Ci19Ci0KLXZvaWQgX19jcHVpbml0IHZzeXNjYWxsX3NldF9jcHUoaW50IGNwdSkKKy8qIEFzc3VtZSBfX2luaXRjYWxsIGV4ZWN1dGVzIGJlZm9yZSBhbGwgdXNlciBzcGFjZS4gSG9wZWZ1bGx5IGttb2QKKyAgIGRvZXNuJ3QgdmlvbGF0ZSB0aGF0LiBXZSdsbCBmaW5kIG91dCBpZiBpdCBkb2VzLiAqLworc3RhdGljIHZvaWQgX19jcHVpbml0IHZzeXNjYWxsX3NldF9jcHUoaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nICpkOwogCXVuc2lnbmVkIGxvbmcgbm9kZSA9IDA7CiAjaWZkZWYgQ09ORklHX05VTUEKIAlub2RlID0gY3B1X3RvX25vZGVbY3B1XTsKICNlbmRpZgotCWlmIChjcHVfaGFzKCZjcHVfZGF0YVtjcHVdLCBYODZfRkVBVFVSRV9SRFRTQ1ApKSB7Ci0JCXZvaWQgKmluZm8gPSAodm9pZCAqKSgobm9kZSA8PCAxMikgfCBjcHUpOwotCQkvKiBDYW4gaGFwcGVuIG9uIHByZWVtcHRpdmUga2VybmVsICovCi0JCWlmIChnZXRfY3B1KCkgPT0gY3B1KQotCQkJd3JpdGVfcmR0c2NwX2NiKGluZm8pOwotI2lmZGVmIENPTkZJR19TTVAKLQkJZWxzZSB7Ci0JCQkvKiB0aGUgbm90aWZpZXIgaXMgdW5mb3J0dW5hdGVseSBub3QgZXhlY3V0ZWQgb24gdGhlCi0JCQkgICB0YXJnZXQgQ1BVICovCi0JCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LHdyaXRlX3JkdHNjcF9jYixpbmZvLDAsMSk7Ci0JCX0KLSNlbmRpZgotCQlwdXRfY3B1KCk7Ci0JfQorCWlmIChjcHVfaGFzKCZjcHVfZGF0YVtjcHVdLCBYODZfRkVBVFVSRV9SRFRTQ1ApKQorCQl3cml0ZV9yZHRzY3BfYXV4KChub2RlIDw8IDEyKSB8IGNwdSk7CiAKIAkvKiBTdG9yZSBjcHUgbnVtYmVyIGluIGxpbWl0IHNvIHRoYXQgaXQgY2FuIGJlIGxvYWRlZCBxdWlja2x5CiAJICAgaW4gdXNlciBzcGFjZSBpbiB2Z2V0Y3B1LgpAQCAtMjgwLDExICsyNjgsMjcgQEAKIAkqZCB8PSAobm9kZSA+PiA0KSA8PCA0ODsKIH0KIAorc3RhdGljIHZvaWQgX19jcHVpbml0IGNwdV92c3lzY2FsbF9pbml0KHZvaWQgKmFyZykKK3sKKwkvKiBwcmVlbXB0aW9uIHNob3VsZCBiZSBhbHJlYWR5IG9mZiAqLworCXZzeXNjYWxsX3NldF9jcHUocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CisKK3N0YXRpYyBpbnQgX19jcHVpbml0CitjcHVfdnN5c2NhbGxfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqYXJnKQoreworCWxvbmcgY3B1ID0gKGxvbmcpYXJnOworCWlmIChhY3Rpb24gPT0gQ1BVX09OTElORSkKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgY3B1X3ZzeXNjYWxsX2luaXQsIE5VTEwsIDAsIDEpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IG1hcF92c3lzY2FsbCh2b2lkKQogewogCWV4dGVybiBjaGFyIF9fdnN5c2NhbGxfMDsKIAl1bnNpZ25lZCBsb25nIHBoeXNhZGRyX3BhZ2UwID0gX19wYV9zeW1ib2woJl9fdnN5c2NhbGxfMCk7CiAKKwkvKiBOb3RlIHRoYXQgVlNZU0NBTExfTUFQUEVEX1BBR0VTIG11c3QgYWdyZWUgd2l0aCB0aGUgY29kZSBiZWxvdy4gKi8KIAlfX3NldF9maXhtYXAoVlNZU0NBTExfRklSU1RfUEFHRSwgcGh5c2FkZHJfcGFnZTAsIFBBR0VfS0VSTkVMX1ZTWVNDQUxMKTsKIH0KIApAQCAtMjk5LDYgKzMwMyw4IEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXJlZ2lzdGVyX3N5c2N0bF90YWJsZShrZXJuZWxfcm9vdF90YWJsZTIsIDApOwogI2VuZGlmCisJb25fZWFjaF9jcHUoY3B1X3ZzeXNjYWxsX2luaXQsIE5VTEwsIDAsIDEpOworCWhvdGNwdV9ub3RpZmllcihjcHVfdnN5c2NhbGxfbm90aWZpZXIsIDApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvY3N1bS1wYXJ0aWFsLmMgYi9hcmNoL3g4Nl82NC9saWIvY3N1bS1wYXJ0aWFsLmMKaW5kZXggYzQ5MzczNS4uYmM1MDNmNSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2NzdW0tcGFydGlhbC5jCisrKyBiL2FyY2gveDg2XzY0L2xpYi9jc3VtLXBhcnRpYWwuYwpAQCAtOSw4ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KIAotI2RlZmluZSBfX2ZvcmNlX2lubGluZSBpbmxpbmUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCi0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZnJvbTMydG8xNih1bnNpZ25lZCBhKSAKIHsKIAl1bnNpZ25lZCBzaG9ydCBiID0gYSA+PiAxNjsgCkBAIC0zMyw3ICszMSw3IEBACiAgKiBVbnJvbGxpbmcgdG8gYW4gMTI4IGJ5dGVzIGlubmVyIGxvb3AuCiAgKiBVc2luZyBpbnRlcmxlYXZpbmcgd2l0aCBtb3JlIHJlZ2lzdGVycyB0byBicmVhayB0aGUgY2FycnkgY2hhaW5zLgogICovCi1zdGF0aWMgX19mb3JjZV9pbmxpbmUgdW5zaWduZWQgZG9fY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCB1bnNpZ25lZCBsZW4pCitzdGF0aWMgdW5zaWduZWQgZG9fY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCB1bnNpZ25lZCBsZW4pCiB7CiAJdW5zaWduZWQgb2RkLCBjb3VudDsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CkBAIC0xMzIsOSArMTMwLDEwIEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgNjQtYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKLQlyZXR1cm4gYWRkMzJfd2l0aF9jYXJyeShkb19jc3VtKGJ1ZmYsIGxlbiksIHN1bSk7IAorCXJldHVybiAoX19mb3JjZSBfX3dzdW0pYWRkMzJfd2l0aF9jYXJyeShkb19jc3VtKGJ1ZmYsIGxlbiksCisJCQkJCQkoX19mb3JjZSB1MzIpc3VtKTsKIH0KIAogRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwpAQCAtMTQzLDcgKzE0Miw3IEBACiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChidWZmLGxlbiwwKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvY3N1bS13cmFwcGVycy5jIGIvYXJjaC94ODZfNjQvbGliL2NzdW0td3JhcHBlcnMuYwppbmRleCBiMTMyMGVjLi5mZDQyYTRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9saWIvY3N1bS13cmFwcGVycy5jCisrKyBiL2FyY2gveDg2XzY0L2xpYi9jc3VtLXdyYXBwZXJzLmMKQEAgLTE4LDkgKzE4LDkgQEAKICAqIFJldHVybnMgYW4gMzJiaXQgdW5mb2xkZWQgY2hlY2tzdW0gb2YgdGhlIGJ1ZmZlci4KICAqIHNyYyBhbmQgZHN0IGFyZSBiZXN0IGFsaWduZWQgdG8gNjRiaXRzLiAKICAqLyAKLXVuc2lnbmVkIGludCAKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IGlzdW0sIGludCAqZXJycCkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCSAgICBpbnQgbGVuLCBfX3dzdW0gaXN1bSwgaW50ICplcnJwKQogeyAKIAltaWdodF9zbGVlcCgpOwogCSplcnJwID0gMDsKQEAgLTM0LDE3ICszNCwxOSBAQAogCQlpZiAodW5saWtlbHkoKHVuc2lnbmVkIGxvbmcpc3JjICYgNikpIHsJCQkKIAkJCXdoaWxlICgoKHVuc2lnbmVkIGxvbmcpc3JjICYgNikgJiYgbGVuID49IDIpIHsgCiAJCQkJX191MTYgdmFsMTY7CQkJCi0JCQkJKmVycnAgPSBfX2dldF91c2VyKHZhbDE2LCAoX191MTYgX191c2VyICopc3JjKTsgCisJCQkJKmVycnAgPSBfX2dldF91c2VyKHZhbDE2LCAoY29uc3QgX191MTYgX191c2VyICopc3JjKTsKIAkJCQlpZiAoKmVycnApCiAJCQkJCXJldHVybiBpc3VtOwogCQkJCSooX191MTYgKilkc3QgPSB2YWwxNjsKLQkJCQlpc3VtID0gYWRkMzJfd2l0aF9jYXJyeShpc3VtLCB2YWwxNik7IAorCQkJCWlzdW0gPSAoX19mb3JjZSBfX3dzdW0pYWRkMzJfd2l0aF9jYXJyeSgKKwkJCQkJCShfX2ZvcmNlIHVuc2lnbmVkKWlzdW0sIHZhbDE2KTsKIAkJCQlzcmMgKz0gMjsgCiAJCQkJZHN0ICs9IDI7IAogCQkJCWxlbiAtPSAyOwogCQkJfQogCQl9Ci0JCWlzdW0gPSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKChfX2ZvcmNlIHZvaWQgKilzcmMsZHN0LGxlbixpc3VtLGVycnAsTlVMTCk7CisJCWlzdW0gPSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKChfX2ZvcmNlIGNvbnN0IHZvaWQgKilzcmMsCisJCQkJCWRzdCwgbGVuLCBpc3VtLCBlcnJwLCBOVUxMKTsKIAkJaWYgKGxpa2VseSgqZXJycCA9PSAwKSkgCiAJCQlyZXR1cm4gaXN1bTsKIAl9IApAQCAtNjYsOSArNjgsOSBAQAogICogUmV0dXJucyBhbiAzMmJpdCB1bmZvbGRlZCBjaGVja3N1bSBvZiB0aGUgYnVmZmVyLgogICogc3JjIGFuZCBkc3QgYXJlIGJlc3QgYWxpZ25lZCB0byA2NGJpdHMuCiAgKi8gCi11bnNpZ25lZCBpbnQgCi1jc3VtX3BhcnRpYWxfY29weV90b191c2VyKHVuc2lnbmVkIGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciBfX3VzZXIgKmRzdCwKLQkJCSAgaW50IGxlbiwgdW5zaWduZWQgaW50IGlzdW0sIGludCAqZXJycCkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgX191c2VyICpkc3QsCisJCQkgIGludCBsZW4sIF9fd3N1bSBpc3VtLCBpbnQgKmVycnApCiB7IAogCW1pZ2h0X3NsZWVwKCk7CiAJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIGxlbikpKSB7CkBAIC03OSw3ICs4MSw4IEBACiAJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKWRzdCAmIDYpKSB7CiAJCXdoaWxlICgoKHVuc2lnbmVkIGxvbmcpZHN0ICYgNikgJiYgbGVuID49IDIpIHsgCiAJCQlfX3UxNiB2YWwxNiA9ICooX191MTYgKilzcmM7Ci0JCQlpc3VtID0gYWRkMzJfd2l0aF9jYXJyeShpc3VtLCB2YWwxNik7CisJCQlpc3VtID0gKF9fZm9yY2UgX193c3VtKWFkZDMyX3dpdGhfY2FycnkoCisJCQkJCShfX2ZvcmNlIHVuc2lnbmVkKWlzdW0sIHZhbDE2KTsKIAkJCSplcnJwID0gX19wdXRfdXNlcih2YWwxNiwgKF9fdTE2IF9fdXNlciAqKWRzdCk7CiAJCQlpZiAoKmVycnApCiAJCQkJcmV0dXJuIGlzdW07CkBAIC0xMDQsMTkgKzEwNywyMSBAQAogICogCiAgKiBSZXR1cm5zIGFuIDMyYml0IHVuZm9sZGVkIGNoZWNrc3VtIG9mIHRoZSBidWZmZXIuCiAgKi8gCi11bnNpZ25lZCBpbnQgCi1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogeyAKIAlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsZHN0LGxlbixzdW0sTlVMTCxOVUxMKTsKIH0gCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2spOwogCi11bnNpZ25lZCBzaG9ydCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCSAgICAgICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKSAKK19fc3VtMTYgY3N1bV9pcHY2X21hZ2ljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlfX3U2NCByZXN0LCBzdW02NDsKICAgICAgCi0JcmVzdCA9IChfX3U2NClodG9ubChsZW4pICsgKF9fdTY0KWh0b25zKHByb3RvKSArIChfX3U2NClzdW07CisJcmVzdCA9IChfX2ZvcmNlIF9fdTY0KWh0b25sKGxlbikgKyAoX19mb3JjZSBfX3U2NClodG9ucyhwcm90bykgKworCQkoX19mb3JjZSBfX3U2NClzdW07CiAJYXNtKCIgIGFkZHEgKCVbc2FkZHJdKSwlW3N1bV1cbiIKIAkgICAgIiAgYWRjcSA4KCVbc2FkZHJdKSwlW3N1bV1cbiIKIAkgICAgIiAgYWRjcSAoJVtkYWRkcl0pLCVbc3VtXVxuIiAKQEAgLTEyNCw3ICsxMjksNyBAQAogCSAgICAiICBhZGNxICQwLCVbc3VtXVxuIgogCSAgICA6IFtzdW1dICI9ciIgKHN1bTY0KSAKIAkgICAgOiAiW3N1bV0iIChyZXN0KSxbc2FkZHJdICJyIiAoc2FkZHIpLCBbZGFkZHJdICJyIiAoZGFkZHIpKTsKLQlyZXR1cm4gY3N1bV9mb2xkKGFkZDMyX3dpdGhfY2Fycnkoc3VtNjQgJiAweGZmZmZmZmZmLCBzdW02ND4+MzIpKTsKKwlyZXR1cm4gY3N1bV9mb2xkKChfX2ZvcmNlIF9fd3N1bSlhZGQzMl93aXRoX2NhcnJ5KHN1bTY0ICYgMHhmZmZmZmZmZiwgc3VtNjQ+PjMyKSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9pcHY2X21hZ2ljKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9kZWxheS5jIGIvYXJjaC94ODZfNjQvbGliL2RlbGF5LmMKaW5kZXggNTBiZTkwOS4uMmRiZWJkMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2RlbGF5LmMKKysrIGIvYXJjaC94ODZfNjQvbGliL2RlbGF5LmMKQEAgLTQwLDEzICs0MCwxMyBAQAogCiBpbmxpbmUgdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIHhsb29wcykKIHsKLQlfX2RlbGF5KCh4bG9vcHMgKiBIWiAqIGNwdV9kYXRhW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldLmxvb3BzX3Blcl9qaWZmeSkgPj4gMzIpOworCV9fZGVsYXkoKCh4bG9vcHMgKiBIWiAqIGNwdV9kYXRhW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldLmxvb3BzX3Blcl9qaWZmeSkgPj4gMzIpICsgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fY29uc3RfdWRlbGF5KTsKIAogdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQogewotCV9fY29uc3RfdWRlbGF5KHVzZWNzICogMHgwMDAwMTBjNik7ICAvKiAyKiozMiAvIDEwMDAwMDAgKi8KKwlfX2NvbnN0X3VkZWxheSh1c2VjcyAqIDB4MDAwMDEwYzcpOyAgLyogMioqMzIgLyAxMDAwMDAwIChyb3VuZGVkIHVwKSAqLwogfQogRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMgYi9hcmNoL3g4Nl82NC9tbS9mYXVsdC5jCmluZGV4IDM3NTFiNDcuLmE2NWZjNmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vZmF1bHQuYwpAQCAtMjMsOSArMjMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgpAQCAtOTYsNyArOTYsNyBAQAogc3RhdGljIG5vaW5saW5lIGludCBpc19wcmVmZXRjaChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKIHsgCi0JdW5zaWduZWQgY2hhciBfX3VzZXIgKmluc3RyOworCXVuc2lnbmVkIGNoYXIgKmluc3RyOwogCWludCBzY2FuX21vcmUgPSAxOwogCWludCBwcmVmZXRjaCA9IDA7IAogCXVuc2lnbmVkIGNoYXIgKm1heF9pbnN0cjsKQEAgLTExNiw3ICsxMTYsNyBAQAogCQl1bnNpZ25lZCBjaGFyIGluc3RyX2hpOwogCQl1bnNpZ25lZCBjaGFyIGluc3RyX2xvOwogCi0JCWlmIChfX2dldF91c2VyKG9wY29kZSwgKGNoYXIgX191c2VyICopaW5zdHIpKQorCQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoaW5zdHIsIG9wY29kZSkpCiAJCQlicmVhazsgCiAKIAkJaW5zdHJfaGkgPSBvcGNvZGUgJiAweGYwOyAKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQljYXNlIDB4MDA6CiAJCQkvKiBQcmVmZXRjaCBpbnN0cnVjdGlvbiBpcyAweDBGMEQgb3IgMHgwRjE4ICovCiAJCQlzY2FuX21vcmUgPSAwOwotCQkJaWYgKF9fZ2V0X3VzZXIob3Bjb2RlLCAoY2hhciBfX3VzZXIgKilpbnN0cikpCisJCQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoaW5zdHIsIG9wY29kZSkpCiAJCQkJYnJlYWs7CiAJCQlwcmVmZXRjaCA9IChpbnN0cl9sbyA9PSAweEYpICYmCiAJCQkJKG9wY29kZSA9PSAweDBEIHx8IG9wY29kZSA9PSAweDE4KTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogc3RhdGljIGludCBiYWRfYWRkcmVzcyh2b2lkICpwKSAKIHsgCiAJdW5zaWduZWQgbG9uZyBkdW1teTsKLQlyZXR1cm4gX19nZXRfdXNlcihkdW1teSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopcCk7CisJcmV0dXJuIHByb2JlX2tlcm5lbF9hZGRyZXNzKCh1bnNpZ25lZCBsb25nICopcCwgZHVtbXkpOwogfSAKIAogdm9pZCBkdW1wX3BhZ2V0YWJsZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9tbS9pbml0LmMgYi9hcmNoL3g4Nl82NC9tbS9pbml0LmMKaW5kZXggOTcxZGMxMS4uMjk2OGI5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gveDg2XzY0L21tL2luaXQuYwpAQCAtNDk2LDcgKzQ5Niw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZW1vdmVfbWVtb3J5KTsKIAotI2lmbmRlZiBDT05GSUdfQUNQSV9OVU1BCisjaWYgIWRlZmluZWQoQ09ORklHX0FDUElfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfTlVNQSkKIGludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgc3RhcnQpCiB7CiAJcmV0dXJuIDA7CkBAIC01MDQsMTMgKzUwNCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7CiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfQUNQSV9OVU1BCi1pbnQgbWVtb3J5X2FkZF9waHlzYWRkcl90b19uaWQodTY0IHN0YXJ0KQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KIAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFCkBAIC02NTUsOSArNjQ4LDIyIEBACiAKIHZvaWQgX19pbml0IHJlc2VydmVfYm9vdG1lbV9nZW5lcmljKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbGVuKSAKIHsgCi0JLyogU2hvdWxkIGNoZWNrIGhlcmUgYWdhaW5zdCB0aGUgZTgyMCBtYXAgdG8gYXZvaWQgZG91YmxlIGZyZWUgKi8gCiAjaWZkZWYgQ09ORklHX05VTUEKIAlpbnQgbmlkID0gcGh5c190b19uaWQocGh5cyk7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIHBmbiA9IHBoeXMgPj4gUEFHRV9TSElGVDsKKwlpZiAocGZuID49IGVuZF9wZm4pIHsKKwkJLyogVGhpcyBjYW4gaGFwcGVuIHdpdGgga2R1bXAga2VybmVscyB3aGVuIGFjY2Vzc2luZyBmaXJtd2FyZQorCQkgICB0YWJsZXMuICovCisJCWlmIChwZm4gPCBlbmRfcGZuX21hcCkKKwkJCXJldHVybjsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZXNlcnZlX2Jvb3RtZW06IGlsbGVnYWwgcmVzZXJ2ZSAlbHggJXVcbiIsCisJCQkJcGh5cywgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNob3VsZCBjaGVjayBoZXJlIGFnYWluc3QgdGhlIGU4MjAgbWFwIHRvIGF2b2lkIGRvdWJsZSBmcmVlICovCisjaWZkZWYgQ09ORklHX05VTUEKICAgCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuaWQpLCBwaHlzLCBsZW4pOwogI2Vsc2UgICAgICAgCQkKIAlyZXNlcnZlX2Jvb3RtZW0ocGh5cywgbGVuKTsgICAgCkBAIC03MjQsMTQgKzczMCwxNSBAQAogX19pbml0Y2FsbCh4ODY2NF9zeXNjdGxfaW5pdCk7CiAjZW5kaWYKIAotLyogQSBwc2V1ZG8gVk1BcyB0byBhbGxvdyBwdHJhY2UgYWNjZXNzIGZvciB0aGUgdnN5c2NhbGwgcGFnZS4gICBUaGlzIG9ubHkKKy8qIEEgcHNldWRvIFZNQSB0byBhbGxvdyBwdHJhY2UgYWNjZXNzIGZvciB0aGUgdnN5c2NhbGwgcGFnZS4gIFRoaXMgb25seQogICAgY292ZXJzIHRoZSA2NGJpdCB2c3lzY2FsbCBwYWdlIG5vdy4gMzJiaXQgaGFzIGEgcmVhbCBWTUEgbm93IGFuZCBkb2VzCiAgICBub3QgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGFueW1vcmUuICovCiAKIHN0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgZ2F0ZV92bWEgPSB7CiAJLnZtX3N0YXJ0ID0gVlNZU0NBTExfU1RBUlQsCi0JLnZtX2VuZCA9IFZTWVNDQUxMX0VORCwKLQkudm1fcGFnZV9wcm90ID0gUEFHRV9SRUFET05MWQorCS52bV9lbmQgPSBWU1lTQ0FMTF9TVEFSVCArIChWU1lTQ0FMTF9NQVBQRURfUEFHRVMgPDwgUEFHRV9TSElGVCksCisJLnZtX3BhZ2VfcHJvdCA9IFBBR0VfUkVBRE9OTFlfRVhFQywKKwkudm1fZmxhZ3MgPSBWTV9SRUFEIHwgVk1fRVhFQwogfTsKIAogc3RydWN0IHZtX2FyZWFfc3RydWN0ICpnZXRfZ2F0ZV92bWEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9tbS9wYWdlYXR0ci5jIGIvYXJjaC94ODZfNjQvbW0vcGFnZWF0dHIuYwppbmRleCAzZTIzMWQ3Ni4uY2NiOTFkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL3g4Nl82NC9tbS9wYWdlYXR0ci5jCkBAIC02MSwzNCArNjEsNDAgQEAKIAlyZXR1cm4gYmFzZTsKIH0gCiAKLQotc3RhdGljIHZvaWQgZmx1c2hfa2VybmVsX21hcCh2b2lkICphZGRyZXNzKSAKK3N0YXRpYyB2b2lkIGNhY2hlX2ZsdXNoX3BhZ2Uodm9pZCAqYWRyKQogewotCWlmICgwICYmIGFkZHJlc3MgJiYgY3B1X2hhc19jbGZsdXNoKSB7Ci0JCS8qIGlzIHRoaXMgd29ydGggaXQ/ICovIAotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRTsgaSArPSBib290X2NwdV9kYXRhLng4Nl9jbGZsdXNoX3NpemUpIAotCQkJYXNtIHZvbGF0aWxlKCJjbGZsdXNoICglMCkiIDo6ICJyIiAoYWRkcmVzcyArIGkpKTsgCi0JfSBlbHNlCi0JCWFzbSB2b2xhdGlsZSgid2JpbnZkIjo6OiJtZW1vcnkiKTsgCi0JaWYgKGFkZHJlc3MpCi0JCV9fZmx1c2hfdGxiX29uZShhZGRyZXNzKTsKLQllbHNlCi0JCV9fZmx1c2hfdGxiX2FsbCgpOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkU7IGkgKz0gYm9vdF9jcHVfZGF0YS54ODZfY2xmbHVzaF9zaXplKQorCQlhc20gdm9sYXRpbGUoImNsZmx1c2ggKCUwKSIgOjogInIiIChhZHIgKyBpKSk7CiB9CiAKK3N0YXRpYyB2b2lkIGZsdXNoX2tlcm5lbF9tYXAodm9pZCAqYXJnKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmwgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWFyZzsKKwlzdHJ1Y3QgcGFnZSAqcGc7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9tYXAodW5zaWduZWQgbG9uZyBhZGRyZXNzKQorCS8qIFdoZW4gY2xmbHVzaCBpcyBhdmFpbGFibGUgYWx3YXlzIHVzZSBpdCBiZWNhdXNlIGl0IGlzCisJICAgbXVjaCBjaGVhcGVyIHRoYW4gV0JJTlZEICovCisJaWYgKCFjcHVfaGFzX2NsZmx1c2gpCisJCWFzbSB2b2xhdGlsZSgid2JpbnZkIiA6OjogIm1lbW9yeSIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGcsIGwsIGxydSkgeworCQl2b2lkICphZHIgPSBwYWdlX2FkZHJlc3MocGcpOworCQlpZiAoY3B1X2hhc19jbGZsdXNoKQorCQkJY2FjaGVfZmx1c2hfcGFnZShhZHIpOworCQlfX2ZsdXNoX3RsYl9vbmUoYWRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9tYXAoc3RydWN0IGxpc3RfaGVhZCAqbCkKIHsJCi0Jb25fZWFjaF9jcHUoZmx1c2hfa2VybmVsX21hcCwgKHZvaWQgKilhZGRyZXNzLCAxLCAxKTsKKwlvbl9lYWNoX2NwdShmbHVzaF9rZXJuZWxfbWFwLCBsLCAxLCAxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICpkZWZlcnJlZF9wYWdlczsgLyogcHJvdGVjdGVkIGJ5IGluaXRfbW0ubW1hcF9zZW0gKi8KK3N0YXRpYyBMSVNUX0hFQUQoZGVmZXJyZWRfcGFnZXMpOyAvKiBwcm90ZWN0ZWQgYnkgaW5pdF9tbS5tbWFwX3NlbSAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9wYWdlKHN0cnVjdCBwYWdlICpmcGFnZSkKIHsKLQlmcGFnZS0+bHJ1Lm5leHQgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRlZmVycmVkX3BhZ2VzOwotCWRlZmVycmVkX3BhZ2VzID0gZnBhZ2U7CisJbGlzdF9hZGQoJmZwYWdlLT5scnUsICZkZWZlcnJlZF9wYWdlcyk7CiB9CiAKIC8qIApAQCAtMjA3LDE4ICsyMTMsMTggQEAKIAogdm9pZCBnbG9iYWxfZmx1c2hfdGxiKHZvaWQpCiB7IAotCXN0cnVjdCBwYWdlICpkcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqcGcsICpuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgbDsKIAogCWRvd25fcmVhZCgmaW5pdF9tbS5tbWFwX3NlbSk7Ci0JZHBhZ2UgPSB4Y2hnKCZkZWZlcnJlZF9wYWdlcywgTlVMTCk7CisJbGlzdF9yZXBsYWNlX2luaXQoJmRlZmVycmVkX3BhZ2VzLCAmbCk7CiAJdXBfcmVhZCgmaW5pdF9tbS5tbWFwX3NlbSk7CiAKLQlmbHVzaF9tYXAoKGRwYWdlICYmICFkcGFnZS0+bHJ1Lm5leHQpID8gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKGRwYWdlKSA6IDApOwotCXdoaWxlIChkcGFnZSkgewotCQlzdHJ1Y3QgcGFnZSAqdG1wID0gZHBhZ2U7Ci0JCWRwYWdlID0gKHN0cnVjdCBwYWdlICopZHBhZ2UtPmxydS5uZXh0OwotCQlDbGVhclBhZ2VQcml2YXRlKHRtcCk7Ci0JCV9fZnJlZV9wYWdlKHRtcCk7CisJZmx1c2hfbWFwKCZsKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZywgbmV4dCwgJmwsIGxydSkgeworCQlDbGVhclBhZ2VQcml2YXRlKHBnKTsKKwkJX19mcmVlX3BhZ2UocGcpOwogCX0gCiB9IAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9tbS9zcmF0LmMgYi9hcmNoL3g4Nl82NC9tbS9zcmF0LmMKaW5kZXggM2NjMDU0NC4uMTA4N2UxNSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vc3JhdC5jCisrKyBiL2FyY2gveDg2XzY0L21tL3NyYXQuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJcmV0dXJuIGhvdGFkZF9wZXJjZW50ID4gMDsKIH0KICNlbHNlCi1pbnQgdXBkYXRlX2VuZF9vZl9tZW1vcnkodW5zaWduZWQgbG9uZyBlbmQpIHtyZXR1cm4gMDt9CitpbnQgdXBkYXRlX2VuZF9vZl9tZW1vcnkodW5zaWduZWQgbG9uZyBlbmQpIHtyZXR1cm4gLTE7fQogc3RhdGljIGludCBob3RhZGRfZW5vdWdoX21lbW9yeShzdHJ1Y3QgYm9vdG5vZGUgKm5kKSB7cmV0dXJuIDE7fQogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19TUEFSU0UKIHN0YXRpYyBpbmxpbmUgaW50IHNhdmVfYWRkX2luZm8odm9pZCkge3JldHVybiAxO30KQEAgLTMzNyw3ICszMzcsNyBAQAogCXB1c2hfbm9kZV9ib3VuZGFyaWVzKG5vZGUsIG5kLT5zdGFydCA+PiBQQUdFX1NISUZULAogCQkJCQkJbmQtPmVuZCA+PiBQQUdFX1NISUZUKTsKIAotIAlpZiAobWEtPmZsYWdzLmhvdF9wbHVnZ2FibGUgJiYgIXJlc2VydmVfaG90YWRkKG5vZGUsIHN0YXJ0LCBlbmQpIDwgMCkgeworIAlpZiAobWEtPmZsYWdzLmhvdF9wbHVnZ2FibGUgJiYgKHJlc2VydmVfaG90YWRkKG5vZGUsIHN0YXJ0LCBlbmQpIDwgMCkpIHsKIAkJLyogSWdub3JlIGhvdGFkZCByZWdpb24uIFVuZG8gZGFtYWdlICovCiAJCXByaW50ayhLRVJOX05PVElDRSAiU1JBVDogSG90cGx1ZyByZWdpb24gaWdub3JlZFxuIik7CiAJCSpuZCA9IG9sZG5vZGU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUKaW5kZXggMWViMThmNC4uMTQ5YWJhMCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMKICMgUmV1c2UgdGhlIGkzODYgUENJIHN1YnN5c3RlbQogIwotQ0ZMQUdTICs9IC1JYXJjaC9pMzg2L3BjaQorRVhUUkFfQ0ZMQUdTICs9IC1JYXJjaC9pMzg2L3BjaQogCiBvYmoteQkJOj0gaTM4Ni5vCiBvYmotJChDT05GSUdfUENJX0RJUkVDVCkrPSBkaXJlY3QubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvcGNpL21tY29uZmlnLmMgYi9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYwppbmRleCA3NzMyZjQyLi5mOGI2YjI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYworKysgYi9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYwpAQCAtMTYzLDM3ICsxNjMsNiBAQAogCX0KIH0KIAotc3RhdGljIF9faW5pdCB2b2lkIHBjaV9tbWNmZ19pbnNlcnRfcmVzb3VyY2VzKHZvaWQpCi17Ci0jZGVmaW5lIFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiAxOQotCWludCBpOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWNoYXIgKm5hbWVzOwotCXVuc2lnbmVkIG51bV9idXNlczsKLQotCXJlcyA9IGtjYWxsb2MoUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOICsgc2l6ZW9mKCpyZXMpLAotCQkJcGNpX21tY2ZnX2NvbmZpZ19udW0sIEdGUF9LRVJORUwpOwotCi0JaWYgKCFyZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IFVuYWJsZSB0byBhbGxvY2F0ZSBNTUNPTkZJRyByZXNvdXJjZXNcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JbmFtZXMgPSAodm9pZCAqKSZyZXNbcGNpX21tY2ZnX2NvbmZpZ19udW1dOwotCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgaSsrLCByZXMrKykgewotCQludW1fYnVzZXMgPSBwY2lfbW1jZmdfY29uZmlnW2ldLmVuZF9idXNfbnVtYmVyIC0KLQkJICAgIHBjaV9tbWNmZ19jb25maWdbaV0uc3RhcnRfYnVzX251bWJlciArIDE7Ci0JCXJlcy0+bmFtZSA9IG5hbWVzOwotCQlzbnByaW50ZihuYW1lcywgUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOLCAiUENJIE1NQ09ORklHICV1IiwKLQkJCXBjaV9tbWNmZ19jb25maWdbaV0ucGNpX3NlZ21lbnRfZ3JvdXBfbnVtYmVyKTsKLQkJcmVzLT5zdGFydCA9IHBjaV9tbWNmZ19jb25maWdbaV0uYmFzZV9hZGRyZXNzOwotCQlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyAobnVtX2J1c2VzIDw8IDIwKSAtIDE7Ci0JCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKLQkJaW5zZXJ0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKLQkJbmFtZXMgKz0gUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOOwotCX0KLX0KLQogdm9pZCBfX2luaXQgcGNpX21tY2ZnX2luaXQoaW50IHR5cGUpCiB7CiAJaW50IGk7CkBAIC0yMjAsNyArMTg5LDcgQEAKIAogCXBjaV9tbWNmZ192aXJ0ID0ga21hbGxvYyhzaXplb2YoKnBjaV9tbWNmZ192aXJ0KSAqIHBjaV9tbWNmZ19jb25maWdfbnVtLCBHRlBfS0VSTkVMKTsKIAlpZiAocGNpX21tY2ZnX3ZpcnQgPT0gTlVMTCkgewotCQlwcmludGsoIlBDSTogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1tY29uZmlnIHN0cnVjdHVyZXNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1tY29uZmlnIHN0cnVjdHVyZXNcbiIpOwogCQlyZXR1cm47CiAJfQogCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7CkBAIC0yMjgsNyArMTk3LDggQEAKIAkJcGNpX21tY2ZnX3ZpcnRbaV0udmlydCA9IGlvcmVtYXBfbm9jYWNoZShwY2lfbW1jZmdfY29uZmlnW2ldLmJhc2VfYWRkcmVzcywKIAkJCQkJCQkgTU1DT05GSUdfQVBFUl9NQVgpOwogCQlpZiAoIXBjaV9tbWNmZ192aXJ0W2ldLnZpcnQpIHsKLQkJCXByaW50aygiUENJOiBDYW5ub3QgbWFwIG1tY29uZmlnIGFwZXJ0dXJlIGZvciBzZWdtZW50ICVkXG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBtYXAgbW1jb25maWcgYXBlcnR1cmUgZm9yICIKKwkJCQkJInNlZ21lbnQgJWRcbiIsCiAJCQkgICAgICAgcGNpX21tY2ZnX2NvbmZpZ1tpXS5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0yMzYsNyArMjA2LDYgQEAKIAl9CiAKIAl1bnJlYWNoYWJsZV9kZXZpY2VzKCk7Ci0JcGNpX21tY2ZnX2luc2VydF9yZXNvdXJjZXMoKTsKIAogCXJhd19wY2lfb3BzID0gJnBjaV9tbWNmZzsKIAlwY2lfcHJvYmUgPSAocGNpX3Byb2JlICYgflBDSV9QUk9CRV9NQVNLKSB8IFBDSV9QUk9CRV9NTUNPTkY7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9LY29uZmlnIGIvYXJjaC94dGVuc2EvS2NvbmZpZwppbmRleCBjMWU2OWExLi4yZTc0Y2IwIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9LY29uZmlnCisrKyBiL2FyY2gveHRlbnNhL0tjb25maWcKQEAgLTM0LDMxICszNCwyNCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogc291cmNlICJpbml0L0tjb25maWciCiAKIG1lbnUgIlByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcyIKIAogY2hvaWNlCiAJcHJvbXB0ICJYdGVuc2EgUHJvY2Vzc29yIENvbmZpZ3VyYXRpb24iCi0JZGVmYXVsdCBYVEVOU0FfQ1BVX0xJTlVYX0JFCisJZGVmYXVsdCBYVEVOU0FfVkFSSUFOVF9GU0YKIAotY29uZmlnIFhURU5TQV9DUFVfTElOVVhfQkUKLQlib29sICJsaW51eF9iZSIKLQktLS1oZWxwLS0tCi0JICBUaGUgbGludXhfYmUgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24gaXMgdGhlIGJhc2VsaW5lIFh0ZW5zYQotCSAgY29uZmlndXJhdGlvbnMgaW5jbHVkZWQgaW4gdGhpcyBrZXJuZWwgYW5kIGFsc28gdXNlZCBieQotCSAgYmludXRpbHMsIGdjYywgYW5kIGdkYi4gSXQgY29udGFpbnMgbm8gVElFLCBubyBjb3Byb2Nlc3NvcnMsCi0JICBhbmQgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6Ci0KLQkgIENvZGUgRGVuc2l0eSBPcHRpb24gICAgICAgICAgICAgICAgMiBNaXNjIFNwZWNpYWwgUmVnaXN0ZXJzCi0JICBOU0EvTlNBVSBJbnN0cnVjdGlvbnMgICAgICAgICAgICAgIDEyOC1iaXQgRGF0YSBCdXMgV2lkdGgKLQkgIFByb2Nlc3NvciBJRCAgICAgICAgICAgICAgICAgICAgICAgOEssIDItd2F5IEkgYW5kIEQgQ2FjaGVzCi0JICBaZXJvLU92ZXJoZWFkIExvb3BzICAgICAgICAgICAgICAgIDIgSW5zdCBBZGRyZXNzIEJyZWFrIFJlZ2lzdGVycwotCSAgQmlnIEVuZGlhbiAgICAgICAgICAgICAgICAgICAgICAgICAyIERhdGEgQWRkcmVzcyBCcmVhayBSZWdpc3RlcnMKLQkgIDY0IEdlbmVyYWwtUHVycG9zZSBSZWdpc3RlcnMgICAgICAgSlRBRyBJbnRlcmZhY2UgYW5kIFRyYWNlIFBvcnQKLQkgIDE3IEludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgTU1VIHcvIFRMQnMgYW5kIEF1dG9yZWZpbGwKLQkgIDMgSW50ZXJydXB0IExldmVscyAgICAgICAgICAgICAgICAgOCBBdXRvcmVmaWxsIFdheXMgKEkvRCBUTEJzKQotCSAgMyBUaW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmFsaWduZWQgRXhjZXB0aW9ucworY29uZmlnIFhURU5TQV9WQVJJQU5UX0ZTRgorCWJvb2wgImZzZiIKIGVuZGNob2ljZQogCiBjb25maWcgTU1VCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL01ha2VmaWxlCmluZGV4IDNhM2E0YzYuLjk1ZjgzNmQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL01ha2VmaWxlCkBAIC0xMSwxMyArMTEsMTMgQEAKICMgdGhpcyBhcmNoaXRlY3R1cmUKIAogIyBDb3JlIGNvbmZpZ3VyYXRpb24uCi0jIChVc2UgQ1BVPTx4dGVuc2FfY29uZmlnPiB0byB1c2UgYW5vdGhlciBkZWZhdWx0IGNvbXBpbGVyLikKKyMgKFVzZSBWQVI9PHh0ZW5zYV9jb25maWc+IHRvIHVzZSBhbm90aGVyIGRlZmF1bHQgY29tcGlsZXIuKQogCi1jcHUtJChDT05GSUdfWFRFTlNBX0NQVV9MSU5VWF9CRSkJOj0gbGludXhfYmUKLWNwdS0kKENPTkZJR19YVEVOU0FfQ1BVX0xJTlVYX0NVU1RPTSkJOj0gbGludXhfY3VzdG9tCit2YXJpYW50LSQoQ09ORklHX1hURU5TQV9WQVJJQU5UX0ZTRikJCTo9IGZzZgordmFyaWFudC0kKENPTkZJR19YVEVOU0FfVkFSSUFOVF9MSU5VWF9DVVNUT00pCTo9IGN1c3RvbQogCi1DUFUgPSAkKGNwdS15KQotZXhwb3J0IENQVQorVkFSSUFOVCA9ICQodmFyaWFudC15KQorZXhwb3J0IFZBUklBTlQKIAogIyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uCiAKQEAgLTI3LDggKzI3LDYgQEAKIFBMQVRGT1JNID0gJChwbGF0Zm9ybS15KQogZXhwb3J0IFBMQVRGT1JNCiAKLUNQUEZMQUdTCSs9ICQoaWYgJChLQlVJTERfU1JDKSwtSSQoc3JjdHJlZSkvaW5jbHVkZS9hc20teHRlbnNhLykKLUNQUEZMQUdTCSs9IC1JaW5jbHVkZS9hc20KIENGTEFHUwkJKz0gLXBpcGUgLW1sb25nY2FsbHMKIAogS0JVSUxEX0RFRkNPTkZJRyA6PSBpc3NfZGVmY29uZmlnCkBAIC00MSwxMiArMzksMTIgQEAKIAogIyBUZXN0IGZvciBjcm9zcyBjb21waWxpbmcKIAotaWZuZXEgKCQoQ1BVKSwpCitpZm5lcSAoJChWQVJJQU5UKSwpCiAgIENPTVBJTEVfQVJDSCA9ICQoc2hlbGwgdW5hbWUgLW0pCiAKICAgaWZuZXEgKCQoQ09NUElMRV9BUkNIKSwgeHRlbnNhKQogICAgIGlmbmRlZiBDUk9TU19DT01QSUxFCi0gICAgICBDUk9TU19DT01QSUxFID0geHRlbnNhXyQoQ1BVKS0KKyAgICAgIENST1NTX0NPTVBJTEUgPSB4dGVuc2FfJChWQVJJQU5UKS0KICAgICBlbmRpZgogICBlbmRpZgogZW5kaWYKQEAgLTY4LDE0ICs2NiwxMyBAQAogCiBhcmNocHJlcGFyZTogJChhcmNoaW5jKS8ucGxhdGZvcm0KIAotIyBVcGRhdGUgbWFjaGluZSBjcHUgYW5kIHBsYXRmb3JtIHN5bWxpbmtzIGlmIHNvbWV0aGluZyB3aGljaCBhZmZlY3RzCisjIFVwZGF0ZSBwcm9jZXNzb3IgdmFyaWFudCBhbmQgcGxhdGZvcm0gc3ltbGlua3MgaWYgc29tZXRoaW5nIHdoaWNoIGFmZmVjdHMKICMgdGhlbSBjaGFuZ2VkLgogCiAkKGFyY2hpbmMpLy5wbGF0Zm9ybTogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9hcmNoLyouaCkgaW5jbHVkZS9jb25maWcvYXV0by5jb25mCi0JQGVjaG8gJyAgU1lNTElOSyAkKGFyY2hpbmMpL3h0ZW5zYS9jb25maWcgLT4gJChhcmNoaW5jKS94dGVuc2EvY29uZmlnLSQoQ1BVKScKKwlAZWNobyAnICBTWU1MSU5LICQoYXJjaGluYykvdmFyaWFudCAtPiAkKGFyY2hpbmMpL3ZhcmlhbnQtJChWQVJJQU5UKScKIAkkKFEpbWtkaXIgLXAgJChhcmNoaW5jKQotCSQoUSlta2RpciAtcCAkKGFyY2hpbmMpL3h0ZW5zYQotCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvJChhcmNoaW5jKS94dGVuc2EvY29uZmlnLSQoQ1BVKSAkKGFyY2hpbmMpL3h0ZW5zYS9jb25maWcKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpLyQoYXJjaGluYykvdmFyaWFudC0kKFZBUklBTlQpICQoYXJjaGluYykvdmFyaWFudAogCUBlY2hvICcgIFNZTUxJTksgJChhcmNoaW5jKS9wbGF0Zm9ybSAtPiAkKGFyY2hpbmMpL3BsYXRmb3JtLSQoUExBVEZPUk0pJwogCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvJChhcmNoaW5jKS9wbGF0Zm9ybS0kKFBMQVRGT1JNKSAkKGFyY2hpbmMpL3BsYXRmb3JtCiAJQHRvdWNoICRACkBAIC04OSw3ICs4Niw3IEBACiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkQAogCiBDTEVBTl9GSUxFUwkrPSBhcmNoL3h0ZW5zYS92bWxpbnV4LmxkcyAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICQoYXJjaGluYykvcGxhdGZvcm0gJChhcmNoaW5jKS94dGVuc2EvY29uZmlnIFwKKwkJICAgJChhcmNoaW5jKS9wbGF0Zm9ybSAkKGFyY2hpbmMpL3ZhcmlhbnQJXAogCQkgICAkKGFyY2hpbmMpLy5wbGF0Zm9ybQogCiBkZWZpbmUgYXJjaGhlbHAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdHN0cmFwLlMgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3RzdHJhcC5TCmluZGV4IGY4NTdmYzcuLjQ2NDI5OGIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdHN0cmFwLlMKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290c3RyYXAuUwpAQCAtMSw3ICsxLDQgQEAKIAotI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvc3BlY3JlZy5oPgotI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgotCiAjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgogCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1yZWRib290L2Jvb3RzdHJhcC5TIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKaW5kZXggZWU2MzZiMC4uODQ4NDgxMiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKQEAgLTEsOSArMSw3IEBACi0KLSNkZWZpbmUgX0FTTUxBTkdVQUdFCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9zcGVjcmVnLmg+Ci0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+Ci0jaW5jbHVkZSA8eHRlbnNhL2NhY2hlYXNtLmg+Ci0KKyNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVhc20uaD4KIAkvKgogCSAqIFJCLURhdGE6IFJlZEJvb3QgZGF0YS9ic3MKIAkgKiBQOgkgICAgQm9vdC1QYXJhbWV0ZXJzCkBAIC03Nyw4ICs3NSwxNCBAQAogCS8qIE5vdGU6IFRoZSBhc3NlbWJsZXIgY2Fubm90IHJlbGF4ICJhZGRpIGEwLCBhMCwgLi4uIiB0byBhbgogCSAgIGwzMnIsIHNvIHdlIGxvYWQgdG8gYTQgZmlyc3QuICovCiAKLQlhZGRpCWE0LCBhMCwgX19zdGFydCAtIF9fc3RhcnRfYTAKLQltb3YJYTAsIGE0CisJIyBhZGRpCWE0LCBhMCwgX19zdGFydCAtIF9fc3RhcnRfYTAKKwkjIG1vdglhMCwgYTQKKworCW1vdmkJYTQsIF9fc3RhcnQKKwltb3ZpCWE1LCBfX3N0YXJ0X2EwCisJYWRkCWE0LCBhMCwgYTQKKwlzdWIJYTAsIGE0LCBhNQorCiAJbW92aQlhNCwgX19zdGFydAogCW1vdmkJYTUsIF9fcmVsb2NfZW5kCiAKQEAgLTEwNiw5ICsxMTAsMTMgQEAKIAkvKiBXZSBoYXZlIHRvIGZsdXNoIGFuZCBpbnZhbGlkYXRlIHRoZSBjYWNoZXMgaGVyZSBiZWZvcmUgd2UganVtcC4gKi8KIAogI2lmIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sKLQlkY2FjaGVfd3JpdGViYWNrX2FsbCAgYTUsIGE2CisKKwlfX19mbHVzaF9kY2FjaGVfYWxsIGE1IGE2CisKICNlbmRpZgotCWljYWNoZV9pbnZhbGlkYXRlX2FsbCBhNSwgYTYKKworCV9fX2ludmFsaWRhdGVfaWNhY2hlX2FsbCBhNSBhNgorCWlzeW5jCiAKIAltb3ZpCWExMSwgX3JlbG9jCiAJangJYTExCkBAIC0yMDksOSArMjE3LDE0IEBACiAJLyoganVtcCB0byB0aGUga2VybmVsICovCiAyOgogI2lmIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sKLQlkY2FjaGVfd3JpdGViYWNrX2FsbCBhNSwgYTYKKworCV9fX2ZsdXNoX2RjYWNoZV9hbGwgYTUgYTYKKwogI2VuZGlmCi0JaWNhY2hlX2ludmFsaWRhdGVfYWxsIGE1LCBhNgorCisJX19faW52YWxpZGF0ZV9pY2FjaGVfYWxsIGE1IGE2CisKKwlpc3luYwogCiAJbW92aQlhNSwgX19zdGFydAogCW1vdmkJYTMsIGJvb3RfaW5pdHJkX3N0YXJ0CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9jb25maWdzL2lzc19kZWZjb25maWcgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2lzc19kZWZjb25maWcKaW5kZXggODAyNjIxZC4uZjE5ODU0MCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvY29uZmlncy9pc3NfZGVmY29uZmlnCisrKyBiL2FyY2gveHRlbnNhL2NvbmZpZ3MvaXNzX2RlZmNvbmZpZwpAQCAtNTMsMTEgKzUzLDcgQEAKICMKICMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCiAjCi1DT05GSUdfWFRFTlNBX0FSQ0hfTElOVVhfQkU9eQotIyBDT05GSUdfWFRFTlNBX0FSQ0hfTElOVVhfTEUgaXMgbm90IHNldAotIyBDT05GSUdfWFRFTlNBX0FSQ0hfTElOVVhfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YVEVOU0FfQVJDSF9TNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YVEVOU0FfQ1VTVE9NIGlzIG5vdCBzZXQKK0NPTkZJR19YVEVOU0FfVkFSSUFOVF9GU0Y9eQogQ09ORklHX01NVT15CiAjIENPTkZJR19YVEVOU0FfVU5BTElHTkVEX1VTRVIgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZDU3MzAxNy4uNzFmNzMzYyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAogCiBvYmoteSA6PSBhbGlnbi5vIGVudHJ5Lm8gaXJxLm8gY29wcm9jZXNzb3IubyBwcm9jZXNzLm8gcHRyYWNlLm8gc2VtYXBob3JlLm8gIFwKLQkgc2V0dXAubyBzaWduYWwubyBzeXNjYWxscy5vIHRpbWUubyB0cmFwcy5vIHZlY3RvcnMubyBwbGF0Zm9ybS5vICBcCisJIHNldHVwLm8gc2lnbmFsLm8gc3lzY2FsbC5vIHRpbWUubyB0cmFwcy5vIHZlY3RvcnMubyBwbGF0Zm9ybS5vICBcCiAJIHBjaS1kbWEubwogCiAjIyB3aW5kb3dzcGlsbC5vCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYWxpZ24uUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hbGlnbi5TCmluZGV4IGE0OTU2NTcuLjMzZDZlOWQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9hbGlnbi5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hbGlnbi5TCkBAIC0xNiwxNCArMTYsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAKICNpZiBYQ0hBTF9VTkFMSUdORURfTE9BRF9FWENFUFRJT04gfHwgWENIQUxfVU5BTElHTkVEX1NUT1JFX0VYQ0VQVElPTgogCkBAIC0yMTYsNyArMjExLDcgQEAKIAogCWV4dHVpCWE1LCBhNCwgSU5TTl9PUDAsIDQJIyBnZXQgaW5zbi5vcDAgbmliYmxlCiAKLSNpZiBYQ0hBTF9IQVZFX05BUlJPVworI2lmIFhDSEFMX0hBVkVfREVOU0lUWQogCV9iZXFpCWE1LCBPUDBfTDMySV9OLCAuTGxvYWQJIyBMMzJJLk4sIGp1bXAKIAlhZGRpCWE2LCBhNSwgLU9QMF9TMzJJX04KIAlfYmVxeglhNiwgLkxzdG9yZQkJIyBTMzJJLk4sIGRvIGEgc3RvcmUKQEAgLTI1MSw3ICsyNDYsNyBAQAogI2VuZGlmCiAJX19zcmNfYglhMywgYTUsIGE2CQkjIGEzIGhhcyB0aGUgZGF0YSB3b3JkCiAKLSNpZiBYQ0hBTF9IQVZFX05BUlJPVworI2lmIFhDSEFMX0hBVkVfREVOU0lUWQogCWFkZGkJYTcsIGE3LCAyCQkjIGluY3JlbWVudCBQQyAoYXNzdW1lIDE2LWJpdCBpbnNuKQogCiAJZXh0dWkJYTUsIGE0LCBJTlNOX09QMCwgNApAQCAtMjc5LDE0ICsyNzQsMTQgQEAKIAogMToKIAotI2lmIFhDSEFMX0hBVkVfTE9PUAotCXJzcglhMywgTEVORAkJIyBjaGVjayBpZiB3ZSByZWFjaGVkIExFTkQKLQlibmUJYTcsIGEzLCAxZgotCXJzcglhMywgTENPVU5UCQkjIGFuZCBMQ09VTlQgIT0gMAotCWJlcXoJYTMsIDFmCi0JYWRkaQlhMywgYTMsIC0xCQkjIGRlY3JlbWVudCBMQ09VTlQgYW5kIHNldAorI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlyc3IJYTUsIExFTkQJCSMgY2hlY2sgaWYgd2UgcmVhY2hlZCBMRU5ECisJYm5lCWE3LCBhNSwgMWYKKwlyc3IJYTUsIExDT1VOVAkJIyBhbmQgTENPVU5UICE9IDAKKwliZXF6CWE1LCAxZgorCWFkZGkJYTUsIGE1LCAtMQkJIyBkZWNyZW1lbnQgTENPVU5UIGFuZCBzZXQKIAlyc3IJYTcsIExCRUcJCSMgc2V0IFBDIHRvIExCRUdJTgotCXdzcglhMywgTENPVU5UCisJd3NyCWE1LCBMQ09VTlQKICNlbmRpZgogCiAxOgl3c3IJYTcsIEVQQ18xCQkjIHNraXAgbG9hZCBpbnN0cnVjdGlvbgpAQCAtMzM2LDcgKzMzMSw3IEBACiAKIAltb3ZpCWE2LCAwCQkJIyBtYXNrOiBmZmZmZmZmZjowMDAwMDAwMAogCi0jaWYgWENIQUxfSEFWRV9OQVJST1cKKyNpZiBYQ0hBTF9IQVZFX0RFTlNJVFkKIAlhZGRpCWE3LCBhNywgMgkJIyBpbmNyLiBQQyxhc3N1bWUgMTYtYml0IGluc3RydWN0aW9uCiAKIAlleHR1aQlhNSwgYTQsIElOU05fT1AwLCA0CSMgZXh0cmFjdCBPUDAKQEAgLTM1OSwxNCArMzU0LDE0IEBACiAJLyogR2V0IG1lbW9yeSBhZGRyZXNzICovCiAKIDE6Ci0jaWYgWENIQUxfSEFWRV9MT09QCi0JcnNyCWEzLCBMRU5ECQkjIGNoZWNrIGlmIHdlIHJlYWNoZWQgTEVORAotCWJuZQlhNywgYTMsIDFmCi0JcnNyCWEzLCBMQ09VTlQJCSMgYW5kIExDT1VOVCAhPSAwCi0JYmVxeglhMywgMWYKLQlhZGRpCWEzLCBhMywgLTEJCSMgZGVjcmVtZW50IExDT1VOVCBhbmQgc2V0CisjaWYgWENIQUxfSEFWRV9MT09QUworCXJzcglhNCwgTEVORAkJIyBjaGVjayBpZiB3ZSByZWFjaGVkIExFTkQKKwlibmUJYTcsIGE0LCAxZgorCXJzcglhNCwgTENPVU5UCQkjIGFuZCBMQ09VTlQgIT0gMAorCWJlcXoJYTQsIDFmCisJYWRkaQlhNCwgYTQsIC0xCQkjIGRlY3JlbWVudCBMQ09VTlQgYW5kIHNldAogCXJzcglhNywgTEJFRwkJIyBzZXQgUEMgdG8gTEJFR0lOCi0Jd3NyCWEzLCBMQ09VTlQKKwl3c3IJYTQsIExDT1VOVAogI2VuZGlmCiAKIDE6CXdzcglhNywgRVBDXzEJCSMgc2tpcCBzdG9yZSBpbnN0cnVjdGlvbgpAQCAtNDE2LDYgKzQxMSw3IEBACiAKIAkvKiBSZXN0b3JlIHdvcmtpbmcgcmVnaXN0ZXIgKi8KIAorCWwzMmkJYTgsIGEyLCBQVF9BUkVHOAogCWwzMmkJYTcsIGEyLCBQVF9BUkVHNwogCWwzMmkJYTYsIGEyLCBQVF9BUkVHNgogCWwzMmkJYTUsIGEyLCBQVF9BUkVHNQpAQCAtNDQ2LDcgKzQ0Miw3IEBACiAJbW92CWExLCBhMgogCiAJcnNyCWEwLCBQUwotICAgICAgICBiYnNpLmwgIGEyLCBQU19VTV9TSElGVCwgMWYgICAgICMganVtcCBpZiB1c2VyIG1vZGUKKyAgICAgICAgYmJzaS5sICBhMiwgUFNfVU1fQklULCAxZiAgICAgIyBqdW1wIGlmIHVzZXIgbW9kZQogCiAJbW92aQlhMCwgX2tlcm5lbF9leGNlcHRpb24KIAlqeAlhMApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCA3Y2QxZDdmLi5iMjU2Y2ZiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtODcsNiArODcsMTEgQEAKIAlERUZJTkUoTU1fQ09OVEVYVCwgb2Zmc2V0b2YgKHN0cnVjdCBtbV9zdHJ1Y3QsIGNvbnRleHQpKTsKIAlCTEFOSygpOwogCURFRklORShQVF9TSU5HTEVTVEVQX0JJVCwgUFRfU0lOR0xFU1RFUF9CSVQpOworCisJLyogY29uc3RhbnRzICovCisJREVGSU5FKF9DTE9ORV9WTSwgQ0xPTkVfVk0pOworCURFRklORShfQ0xPTkVfVU5UUkFDRUQsIENMT05FX1VOVFJBQ0VEKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvY29wcm9jZXNzb3IuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9jb3Byb2Nlc3Nvci5TCmluZGV4IGNmNWE5M2YuLjAxYmNiOWYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9jb3Byb2Nlc3Nvci5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9jb3Byb2Nlc3Nvci5TCkBAIC05MCw3ICs5MCw2IEBACiAJcnN5bmMKIAlyZXR3CiAKLSNlbmRpZgogCiBFTlRSWShzYXZlX2NvcHJvY2Vzc29yX2V4dHJhKQogCWVudHJ5CXNwLCAxNgpAQCAtMTk3LDQgKzE5Niw1IEBACiAJWENIQUxfQ1A3X1NBX0NPTlRFTlRTX0xJQkRCCiAJLndvcmQJMHhGQzAwMDAwMAkvKiBpbnZhbGlkIHJlZ2lzdGVyIG51bWJlcixtYXJrcyBlbmQgb2YgdGFibGUqLwogX3h0ZW5zYV9yZWdpbmZvX3RhYmxlX2VuZDoKKyNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCmluZGV4IDg5ZTQwOWUuLjllMjcxYmEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KLSNpbmNsdWRlIDx4dGVuc2EvY29yZWFzbS5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCiAvKiBVbmltcGxlbWVudGVkIGZlYXR1cmVzLiAqLwogCkBAIC0zNjQsNyArMzY0LDcgQEAKIAltb3ZpCWEyLCAxCiAJZXh0dWkJYTMsIGEzLCAwLCAxCQkjIGEzID0gUFMuSU5UTEVWRUxbMF0KIAltb3ZlcXoJYTMsIGEyLCBhMAkJIyBhMyA9IDEgaWZmIGludGVycnVwdCBleGNlcHRpb24KLQltb3ZpCWEyLCBQU19XT0VfTUFTSworCW1vdmkJYTIsIDEgPDwgUFNfV09FX0JJVAogCW9yCWEzLCBhMywgYTIKIAlyc3IJYTAsIEVYQ0NBVVNFCiAJeHNyCWEzLCBQUwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJLyogSnVtcCBpZiB3ZSBhcmUgcmV0dXJuaW5nIGZyb20ga2VybmVsIGV4Y2VwdGlvbnMuICovCiAKIDE6CWwzMmkJYTMsIGExLCBQVF9QUwotCV9iYnNpLmwJYTMsIFBTX1VNX1NISUZULCAyZgorCV9iYnNpLmwJYTMsIFBTX1VNX0JJVCwgMmYKIAlqCWtlcm5lbF9leGNlcHRpb25fZXhpdAogCiAJLyogU3BlY2lmaWMgdG8gYSB1c2VyIGV4Y2VwdGlvbiBleGl0OgpAQCAtNDIyLDcgKzQyMiw3IEBACiAJICogICAgICAgKEhpbnQ6IFRoZXJlIGlzIG9ubHkgb25lIHVzZXIgZXhjZXB0aW9uIGZyYW1lIG9uIHN0YWNrKQogCSAqLwogCi0JbW92aQlhMywgUFNfV09FX01BU0sKKwltb3ZpCWEzLCAxIDw8IFBTX1dPRV9CSVQKIAogCV9iYnNpLmwJYTQsIFRJRl9ORUVEX1JFU0NIRUQsIDNmCiAJX2JiY2kubAlhNCwgVElGX1NJR1BFTkRJTkcsIDRmCkBAIC02OTQsNyArNjk0LDcgQEAKIEVOVFJZKGRlYnVnX2V4Y2VwdGlvbikKIAogCXJzcglhMCwgRVBTICsgWENIQUxfREVCVUdMRVZFTAotCWJic2kubAlhMCwgUFNfRVhDTV9TSElGVCwgMWYJIyBleGNlcHRpb24gbW9kZQorCWJic2kubAlhMCwgUFNfRVhDTV9CSVQsIDFmCSMgZXhjZXB0aW9uIG1vZGUKIAogCS8qIFNldCBFUENfMSBhbmQgRVhDQ0FVU0UgKi8KIApAQCAtNzA3LDcgKzcwNyw3IEBACiAKIAkvKiBSZXN0b3JlIFBTIHRvIHRoZSB2YWx1ZSBiZWZvcmUgdGhlIGRlYnVnIGV4YyBidXQgd2l0aCBQUy5FWENNIHNldC4qLwogCi0JbW92aQlhMiwgMSA8PCBQU19FWENNX1NISUZUCisJbW92aQlhMiwgMSA8PCBQU19FWENNX0JJVAogCW9yCWEyLCBhMCwgYTIKIAltb3ZpCWEwLCBkZWJ1Z19leGNlcHRpb24JIyByZXN0b3JlIGEzLCBkZWJ1ZyBqdW1wIHZlY3RvcgogCXdzcglhMiwgUFMKQEAgLTcxNSw3ICs3MTUsNyBAQAogCiAJLyogU3dpdGNoIHRvIGtlcm5lbC91c2VyIHN0YWNrLCByZXN0b3JlIGp1bXAgdmVjdG9yLCBhbmQgc2F2ZSBhMCAqLwogCi0JYmJzaS5sCWEyLCBQU19VTV9TSElGVCwgMmYJIyBqdW1wIGlmIHVzZXIgbW9kZQorCWJic2kubAlhMiwgUFNfVU1fQklULCAyZgkjIGp1bXAgaWYgdXNlciBtb2RlCiAKIAlhZGRpCWEyLCBhMSwgLTE2LVBUX1NJWkUJIyBhc3N1bWUga2VybmVsIHN0YWNrCiAJczMyaQlhMCwgYTIsIFBUX0FSRUcwCkBAIC03NzgsNyArNzc4LDcgQEAKIAl3c3IJYTEsIFdJTkRPV0JBU0UKIAlyc3luYwogCi0JbW92aQlhMSwgUFNfV09FX01BU0sgfCAxCisJbW92aQlhMSwgKDEgPDwgUFNfV09FX0JJVCkgfCAxCiAJd3NyCWExLCBQUwogCXJzeW5jCiAKQEAgLTEwMDQsMTMgKzEwMDQsMTAgQEAKIAogCXJzcglhMCwgREVQQwkJCSMgZ2V0IHN5c2NhbGwtbnIKIAlfYmVxeglhMCwgZmFzdF9zeXNjYWxsX3NwaWxsX3JlZ2lzdGVycwotCi0JYWRkaQlhMCwgYTAsIC1fX05SX3N5c3h0ZW5zYQotCV9iZXF6CWEwLCBmYXN0X3N5c2NhbGxfc3lzeHRlbnNhCisJX2JlcWkJYTAsIF9fTlJfeHRlbnNhLCBmYXN0X3N5c2NhbGxfeHRlbnNhCiAKIAlqCWtlcm5lbF9leGNlcHRpb24KIAotCiBFTlRSWShmYXN0X3N5c2NhbGxfdXNlcikKIAogCS8qIFNraXAgc3lzY2FsbC4gKi8KQEAgLTEwMjQsOSArMTAyMSw3IEBACiAKIAlyc3IJYTAsIERFUEMJCQkjIGdldCBzeXNjYWxsLW5yCiAJX2JlcXoJYTAsIGZhc3Rfc3lzY2FsbF9zcGlsbF9yZWdpc3RlcnMKLQotCWFkZGkJYTAsIGEwLCAtX19OUl9zeXN4dGVuc2EKLQlfYmVxeglhMCwgZmFzdF9zeXNjYWxsX3N5c3h0ZW5zYQorCV9iZXFpCWEwLCBfX05SX3h0ZW5zYSwgZmFzdF9zeXNjYWxsX3h0ZW5zYQogCiAJagl1c2VyX2V4Y2VwdGlvbgogCkBAIC0xMDQ3LDE4ICsxMDQyLDE5IEBACiAvKgogICogc3lzeHRlbnNhIHN5c2NhbGwgaGFuZGxlcgogICoKLSAqIGludCBzeXN4dGVuc2EgKFhURU5TQV9BVE9NSUNfU0VULCBwdHIsIHZhbCwgdW51c2VkKTsKLSAqIGludCBzeXN4dGVuc2EgKFhURU5TQV9BVE9NSUNfQURELCBwdHIsIHZhbCwgdW51c2VkKTsKLSAqIGludCBzeXN4dGVuc2EgKFhURU5TQV9BVE9NSUNfRVhHX0FERCwgcHRyLCB2YWwsIHVudXNlZCk7Ci0gKiBpbnQgc3lzeHRlbnNhIChYVEVOU0FfQVRPTUlDX0NNUF9TV1AsIHB0ciwgb2xkdmFsLCBuZXd2YWwpOwotICogYTIgICAgICAgICAgICAgICAgICAgIGE2ICAgICAgICAgICAgICBhMyAgICBhNCAgICAgIGE1CisgKiBpbnQgc3lzeHRlbnNhIChTWVNfWFRFTlNBX0FUT01JQ19TRVQsICAgICBwdHIsIHZhbCwgICAgdW51c2VkKTsKKyAqIGludCBzeXN4dGVuc2EgKFNZU19YVEVOU0FfQVRPTUlDX0FERCwgICAgIHB0ciwgdmFsLCAgICB1bnVzZWQpOworICogaW50IHN5c3h0ZW5zYSAoU1lTX1hURU5TQV9BVE9NSUNfRVhHX0FERCwgcHRyLCB2YWwsICAgIHVudXNlZCk7CisgKiBpbnQgc3lzeHRlbnNhIChTWVNfWFRFTlNBX0FUT01JQ19DTVBfU1dQLCBwdHIsIG9sZHZhbCwgbmV3dmFsKTsKKyAqICAgICAgICBhMiAgICAgICAgICAgIGE2ICAgICAgICAgICAgICAgICAgIGEzICAgIGE0ICAgICAgYTUKICAqCiAgKiBFbnRyeSBjb25kaXRpb246CiAgKgotICogICBhMDoJdHJhc2hlZCwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0FSRUcwKQorICogICBhMDoJYTIgKHN5c2NhbGwtbnIpLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfQVJFRzApCiAgKiAgIGExOglhMQotICogICBhMjoJbmV3IHN0YWNrIHBvaW50ZXIsIG9yaWdpbmFsIGluIERFUEMKLSAqICAgYTM6CWRpc3BhdGNoIHRhYmxlCisgKiAgIGEyOgluZXcgc3RhY2sgcG9pbnRlciwgb3JpZ2luYWwgaW4gYTAgYW5kIERFUEMKKyAqICAgYTM6CWRpc3BhdGNoIHRhYmxlLCBvcmlnaW5hbCBpbiBleGNzYXZlXzEKKyAqICAgYTQuLmExNToJdW5jaGFuZ2VkCiAgKiAgIGRlcGM6CWEyLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfREVQQykKICAqICAgZXhjc2F2ZV8xOglhMwogICoKQEAgLTEwOTEsNTkgKzEwODcsNjIgQEAKICNkZWZpbmUgQ0FUQ0gJCQkJCQkJCVwKIDY3OgogCi1FTlRSWShmYXN0X3N5c2NhbGxfc3lzeHRlbnNhKQorRU5UUlkoZmFzdF9zeXNjYWxsX3h0ZW5zYSkKIAotCV9iZXF6CWE2LCAxZgotCV9ibHRpCWE2LCBTWVNYVEVOU0FfQ09VTlQsIDJmCisJeHNyCWEzLCBFWENTQVZFXzEJCSMgcmVzdG9yZSBhMywgZXhjc2F2ZTEKIAotMToJagl1c2VyX2V4Y2VwdGlvbgotCi0yOgl4c3IJYTMsIEVYQ1NBVkVfMQkJIyByZXN0b3JlIGEzLCBleGNzYXZlMQotCXMzMmkJYTcsIGEyLCBQVF9BUkVHNwotCisJczMyaQlhNywgYTIsIFBUX0FSRUc3CSMgd2UgbmVlZCBhbiBhZGRpdGlvbmFsIHJlZ2lzdGVyCiAJbW92aQlhNywgNAkJCSMgc2l6ZW9mKHVuc2lnbmVkIGludCkKLQlhY2Nlc3Nfb2sgYTAsIGEzLCBhNywgYTIsIC5MZWFjCisJYWNjZXNzX29rIGEzLCBhNywgYTAsIGEyLCAuTGVhYwkjIGEwOiBzY3JhdGNoIHJlZywgYTI6IHNwCiAKLQlfYmVxaQlhNiwgU1lTWFRFTlNBX0FUT01JQ19TRVQsIC5Mc2V0Ci0JX2JlcWkJYTYsIFNZU1hURU5TQV9BVE9NSUNfRVhHX0FERCwgLkxleGcKLQlfYmVxaQlhNiwgU1lTWFRFTlNBX0FUT01JQ19BREQsIC5MYWRkCisJYWRkaQlhNiwgYTYsIC0xCQkjIGFzc3VtaW5nIFNZU19YVEVOU0FfQVRPTUlDX1NFVCA9IDEKKwlfYmdldWkJYTYsIFNZU19YVEVOU0FfQ09VTlQgLSAxLCAuTGlsbAorCV9ibmVpCWE2LCBTWVNfWFRFTlNBX0FUT01JQ19DTVBfU1dQIC0gMSwgLkxuc3dwCiAKLQkvKiBGYWxsIHRocm91Z2ggZm9yIFNZU1hURU5TQV9BVE9NSUNfQ01QX1NXUCAqLworCS8qIEZhbGwgdGhyb3VnaCBmb3IgQVRPTUlDX0NNUF9TV1AuICovCiAKIC5Mc3dwOgkvKiBBdG9taWMgY29tcGFyZSBhbmQgc3dhcCAqLwogCi1UUlkJbDMyaQlhNywgYTMsIDAJCSMgcmVhZCBvbGQgdmFsdWUKLQlibmUJYTcsIGE0LCAxZgkJIyBzYW1lIGFzIG9sZCB2YWx1ZT8ganVtcAotCXMzMmkJYTUsIGEzLCAwCQkjIGRpZmZlcmVudCwgbW9kaWZ5IHZhbHVlCi0JbW92aQlhNywgMQkJCSMgYW5kIHJldHVybiAxCi0JagkuTHJldAorVFJZCWwzMmkJYTAsIGEzLCAwCQkjIHJlYWQgb2xkIHZhbHVlCisJYm5lCWEwLCBhNCwgMWYJCSMgc2FtZSBhcyBvbGQgdmFsdWU/IGp1bXAKK1RSWQlzMzJpCWE1LCBhMywgMAkJIyBkaWZmZXJlbnQsIG1vZGlmeSB2YWx1ZQorCWwzMmkJYTcsIGEyLCBQVF9BUkVHNwkjIHJlc3RvcmUgYTcKKwlsMzJpCWEwLCBhMiwgUFRfQVJFRzAJIyByZXN0b3JlIGEwCisJbW92aQlhMiwgMQkJCSMgYW5kIHJldHVybiAxCisJYWRkaQlhNiwgYTYsIDEJCSMgcmVzdG9yZSBhNiAocmVhbGx5IG5lY2Vzc2FyeT8pCisJcmZlCiAKLTE6CW1vdmkJYTcsIDAJCQkjIHNhbWUgdmFsdWVzOiByZXR1cm4gMAotCWoJLkxyZXQKKzE6CWwzMmkJYTcsIGEyLCBQVF9BUkVHNwkjIHJlc3RvcmUgYTcKKwlsMzJpCWEwLCBhMiwgUFRfQVJFRzAJIyByZXN0b3JlIGEwCisJbW92aQlhMiwgMAkJCSMgcmV0dXJuIDAgKG5vdGUgdGhhdCB3ZSBjYW5ub3Qgc2V0CisJYWRkaQlhNiwgYTYsIDEJCSMgcmVzdG9yZSBhNiAocmVhbGx5IG5lY2Vzc2FyeT8pCisJcmZlCiAKLS5MYWRkOgkvKiBBdG9taWMgYWRkICovCi0uTGV4ZzoJLyogQXRvbWljIChleGNoYW5nZSkgYWRkICovCisuTG5zd3A6CS8qIEF0b21pYyBzZXQsIGFkZCwgYW5kIGV4Z19hZGQuICovCiAKLVRSWQlsMzJpCWE3LCBhMywgMAotCWFkZAlhNCwgYTQsIGE3Ci0JczMyaQlhNCwgYTMsIDAKLQlqCS5McmV0CitUUlkJbDMyaQlhNywgYTMsIDAJCSMgb3JpZworCWFkZAlhMCwgYTQsIGE3CQkjICsgYXJnCisJbW92ZXF6CWEwLCBhNCwgYTYJCSMgc2V0CitUUlkJczMyaQlhMCwgYTMsIDAJCSMgd3JpdGUgbmV3IHZhbHVlCiAKLS5Mc2V0OgkvKiBBdG9taWMgc2V0ICovCi0KLVRSWQlsMzJpCWE3LCBhMywgMAkJIyByZWFkIG9sZCB2YWx1ZSBhcyByZXR1cm4gdmFsdWUKLQlzMzJpCWE0LCBhMywgMAkJIyB3cml0ZSBuZXcgdmFsdWUKLQotLkxyZXQ6CW1vdglhMCwgYTIKKwltb3YJYTAsIGEyCiAJbW92CWEyLCBhNwotCWwzMmkJYTcsIGEwLCBQVF9BUkVHNwotCWwzMmkJYTMsIGEwLCBQVF9BUkVHMwotCWwzMmkJYTAsIGEwLCBQVF9BUkVHMAorCWwzMmkJYTcsIGEwLCBQVF9BUkVHNwkjIHJlc3RvcmUgYTcKKwlsMzJpCWEwLCBhMCwgUFRfQVJFRzAJIyByZXN0b3JlIGEwCisJYWRkaQlhNiwgYTYsIDEJCSMgcmVzdG9yZSBhNiAocmVhbGx5IG5lY2Vzc2FyeT8pCiAJcmZlCiAKIENBVENICi0uTGVhYzoJbW92aQlhNywgLUVGQVVMVAotCWoJLkxyZXQKKy5MZWFjOglsMzJpCWE3LCBhMiwgUFRfQVJFRzcJIyByZXN0b3JlIGE3CisJbDMyaQlhMCwgYTIsIFBUX0FSRUcwCSMgcmVzdG9yZSBhMAorCW1vdmkJYTIsIC1FRkFVTFQKKwlyZmUKKworLkxpbGw6CWwzMmkJYTcsIGEyLCBQVF9BUkVHMAkjIHJlc3RvcmUgYTcKKwlsMzJpCWEwLCBhMiwgUFRfQVJFRzAJIyByZXN0b3JlIGEwCisJbW92aQlhMiwgLUVJTlZBTAorCXJmZQorCiAKIAogCkBAIC0xNDkxLDcgKzE0OTAsNyBAQAogCSAqLwogCiAJcnNyCWEwLCBQUwotCV9iYmNpLmwJYTAsIFBTX1VNX1NISUZULCAxZgorCV9iYmNpLmwJYTAsIFBTX1VNX0JJVCwgMWYKIAogIAkvKiBVc2VyIHNwYWNlOiBTZXR1cCBhIGR1bW15IGZyYW1lIGFuZCBraWxsIGFwcGxpY2F0aW9uLgogCSAqIE5vdGU6IFdlIGFzc3VtZSBFWENfVEFCTEVfS1NUSyBjb250YWlucyBhIHZhbGlkIHN0YWNrIHBvaW50ZXIuCkBAIC0xNTEwLDcgKzE1MDksNyBAQAogCWwzMmkJYTEsIGEzLCBFWENfVEFCTEVfS1NUSwogCXdzcglhMywgRVhDU0FWRV8xCiAKLQltb3ZpCWE0LCBQU19XT0VfTUFTSyB8IDEKKwltb3ZpCWE0LCAoMSA8PCBQU19XT0VfQklUKSB8IDEKIAl3c3IJYTQsIFBTCiAJcnN5bmMKIApAQCAtMTYxMiw3ICsxNjExLDcgQEAKIAlyc3IJYTEsIFBURVZBRERSCiAJc3JsaQlhMSwgYTEsIFBBR0VfU0hJRlQKIAlzbGxpCWExLCBhMSwgUEFHRV9TSElGVAkjIHB0ZXZhZGRyICYgUEFHRV9NQVNLCi0JYWRkaQlhMSwgYTEsIERUTEJfV0FZX1BHVEFCTEUJIyAuLi4gKyB3YXlfbnVtYmVyCisJYWRkaQlhMSwgYTEsIERUTEJfV0FZX1BHRAkjIC4uLiArIHdheV9udW1iZXIKIAogCXdkdGxiCWEwLCBhMQogCWRzeW5jCkBAIC0xNjU0LDcgKzE2NTMsNyBAQAogCW1vdglhMSwgYTIKIAogCXJzcglhMiwgUFMKLQliYnNpLmwJYTIsIFBTX1VNX1NISUZULCAxZgorCWJic2kubAlhMiwgUFNfVU1fQklULCAxZgogCWoJX2tlcm5lbF9leGNlcHRpb24KIDE6CWoJX3VzZXJfZXhjZXB0aW9uCiAKQEAgLTE3NTMsNyArMTc1Miw3IEBACiAJbW92CWExLCBhMgogCiAJcnNyCWEyLCBQUwotCWJic2kubAlhMiwgUFNfVU1fU0hJRlQsIDFmCisJYmJzaS5sCWEyLCBQU19VTV9CSVQsIDFmCiAJaglfa2VybmVsX2V4Y2VwdGlvbgogMToJaglfdXNlcl9leGNlcHRpb24KIApAQCAtMTkwNyw2ICsxOTA2LDEwMyBAQAogI2VuZGlmIC8qIFhDSEFMX0VYVFJBX1NBX1NJWkUgKi8KIAogLyoKKyAqIFN5c3RlbSBDYWxscy4KKyAqCisgKiB2b2lkIHN5c3RlbV9jYWxsIChzdHJ1Y3QgcHRfcmVncyogcmVncywgaW50IGV4Y2NhdXNlKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIgICAgICAgICAgICAgICAgIGEzCisgKi8KKworRU5UUlkoc3lzdGVtX2NhbGwpCisJZW50cnkJYTEsIDMyCisKKwkvKiByZWdzLT5zeXNjYWxsID0gcmVncy0+YXJlZ1syXSAqLworCisJbDMyaQlhMywgYTIsIFBUX0FSRUcyCisJbW92CWE2LCBhMgorCW1vdmkJYTQsIGRvX3N5c2NhbGxfdHJhY2VfZW50ZXIKKwlzMzJpCWEzLCBhMiwgUFRfU1lTQ0FMTAorCWNhbGx4NAlhNAorCisJLyogc3lzY2FsbCA9IHN5c19jYWxsX3RhYmxlW3N5c2NhbGxfbnJdICovCisKKwltb3ZpCWE0LCBzeXNfY2FsbF90YWJsZTsKKwltb3ZpCWE1LCBfX05SX3N5c2NhbGxfY291bnQKKwltb3ZpCWE2LCAtRU5PU1lTCisJYmdldQlhMywgYTUsIDFmCisKKwlhZGR4NAlhNCwgYTMsIGE0CisJbDMyaQlhNCwgYTQsIDAKKwltb3ZpCWE1LCBzeXNfbmlfc3lzY2FsbDsKKwliZXEJYTQsIGE1LCAxZgorCisJLyogTG9hZCBhcmdzOiBhcmcwIC0gYXJnNSBhcmUgcGFzc2VkIHZpYSByZWdzLiAqLworCisJbDMyaQlhNiwgYTIsIFBUX0FSRUc2CisJbDMyaQlhNywgYTIsIFBUX0FSRUczCisJbDMyaQlhOCwgYTIsIFBUX0FSRUc0CisJbDMyaQlhOSwgYTIsIFBUX0FSRUc1CisJbDMyaQlhMTAsIGEyLCBQVF9BUkVHOAorCWwzMmkJYTExLCBhMiwgUFRfQVJFRzkKKworCS8qIFBhc3Mgb25lIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gdGhlIHN5c2NhbGw6IHB0X3JlZ3MgKG9uIHN0YWNrKSAqLworCXMzMmkJYTIsIGExLCAwCisKKwljYWxseDQJYTQKKworMToJLyogcmVncy0+YXJlZ1syXSA9IHJldHVybl92YWx1ZSAqLworCisJczMyaQlhNiwgYTIsIFBUX0FSRUcyCisJbW92aQlhNCwgZG9fc3lzY2FsbF90cmFjZV9sZWF2ZQorCW1vdglhNiwgYTIKKwljYWxseDQJYTQKKwlyZXR3CisKKworLyoKKyAqIENyZWF0ZSBhIGtlcm5lbCB0aHJlYWQKKyAqCisgKiBpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorICogYTIgICAgICAgICAgICAgICAgICAgIGEyICAgICAgICAgICAgICAgICBhMyAgICAgICAgICAgICBhNAorICovCisKK0VOVFJZKGtlcm5lbF90aHJlYWQpCisJZW50cnkJYTEsIDE2CisKKwltb3YJYTUsIGEyCQkJIyBwcmVzZXJ2ZSBmbiBvdmVyIHN5c2NhbGwKKwltb3YJYTcsIGEzCQkJIyBwcmVzZXJ2ZSBhcmdzIG92ZXIgc3lzY2FsbAorCisJbW92aQlhMywgX0NMT05FX1ZNIHwgX0NMT05FX1VOVFJBQ0VECisJbW92aQlhMiwgX19OUl9jbG9uZQorCW9yCWE2LCBhNCwgYTMJCSMgYXJnMDogZmxhZ3MKKwltb3YJYTMsIGExCQkJIyBhcmcxOiBzcAorCXN5c2NhbGwKKworCWJlcQlhMywgYTEsIDFmCQkjIGJyYW5jaCBpZiBwYXJlbnQKKwltb3YJYTYsIGE3CQkJIyBhcmdzCisJY2FsbHg0CWE1CQkJIyBmbihhcmdzKQorCisJbW92aQlhMiwgX19OUl9leGl0CisJc3lzY2FsbAkJCQkjIHJldHVybiB2YWx1ZSBvZiBmbihhcmdzKSBzdGlsbCBpbiBhNgorCisxOglyZXR3CisKKy8qCisgKiBEbyBhIHN5c3RlbSBjYWxsIGZyb20ga2VybmVsIGluc3RlYWQgb2YgY2FsbGluZyBzeXNfZXhlY3ZlLCBzbyB3ZSBlbmQgdXAKKyAqIHdpdGggcHJvcGVyIHB0X3JlZ3MuCisgKgorICogaW50IGtlcm5lbF9leGVjdmUoY29uc3QgY2hhciAqZm5hbWUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSwgY2hhcmcgKmNvbnN0IGVudnBbXSkKKyAqIGEyICAgICAgICAgICAgICAgICAgICAgICAgYTIgICAgICAgICAgICAgICBhMyAgICAgICAgICAgICAgICAgIGE0CisgKi8KKworRU5UUlkoa2VybmVsX2V4ZWN2ZSkKKwllbnRyeQlhMSwgMTYKKwltb3YJYTYsIGEyCQkJIyBhcmcwIGlzIGluIGE2CisJbW92aQlhMiwgX19OUl9leGVjdmUKKwlzeXNjYWxsCisKKwlyZXR3CisKKy8qCiAgKiBUYXNrIHN3aXRjaC4KICAqCiAgKiBzdHJ1Y3QgdGFzayogIF9zd2l0Y2hfdG8gKHN0cnVjdCB0YXNrKiBwcmV2LCBzdHJ1Y3QgdGFzayogbmV4dCkKQEAgLTE5MjQsNyArMjAyMCw3IEBACiAKIAkvKiBEaXNhYmxlIGludHMgd2hpbGUgd2UgbWFuaXB1bGF0ZSB0aGUgc3RhY2sgcG9pbnRlcjsgc3BpbGwgcmVncy4gKi8KIAotCW1vdmkJYTUsIFBTX0VYQ01fTUFTSyB8IExPQ0tMRVZFTAorCW1vdmkJYTUsICgxIDw8IFBTX0VYQ01fQklUKSB8IExPQ0tMRVZFTAogCXhzcglhNSwgUFMKIAlyc3IJYTMsIEVYQ1NBVkVfMQogCXJzeW5jCkBAIC0xOTY0LDMzICsyMDYwLDkgQEAKIAltb3ZpCWE0LCBzY2hlZHVsZV90YWlsCiAJY2FsbHg0CWE0CiAKLQltb3ZpCWE0LCBkb19zeXNjYWxsX3RyYWNlCisJbW92aQlhNCwgZG9fc3lzY2FsbF90cmFjZV9sZWF2ZQorCW1vdglhNiwgYTEKIAljYWxseDQJYTQKIAogCWoJY29tbW9uX2V4Y2VwdGlvbl9yZXR1cm4KIAotCi0KLS8qCi0gKiBUYWJsZSBvZiBzeXNjYWxscwotICovCi0KLS5kYXRhCi0uYWxpZ24gIDQKLS5nbG9iYWwgc3lzX2NhbGxfdGFibGUKLXN5c19jYWxsX3RhYmxlOgotCi0jZGVmaW5lIFNZU0NBTEwoY2FsbCwgbmFyZykgLndvcmQgY2FsbAotI2luY2x1ZGUgInN5c2NhbGxzLmgiCi0KLS8qCi0gKiBOdW1iZXIgb2YgYXJndW1lbnRzIG9mIGVhY2ggc3lzY2FsbAotICovCi0KLS5nbG9iYWwgc3lzX25hcmdfdGFibGUKLXN5c19uYXJnX3RhYmxlOgotCi0jdW5kZWYgU1lTQ0FMTAotI2RlZmluZSBTWVNDQUxMKGNhbGwsIG5hcmcpIC5ieXRlIG5hcmcKLSNpbmNsdWRlICJzeXNjYWxscy5oIgotCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TIGIvYXJjaC94dGVuc2Eva2VybmVsL2hlYWQuUwppbmRleCBjMDdjYjI1Li5lYTg5OTEwIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9oZWFkLlMKQEAgLTE1LDkgKzE1LDkgQEAKICAqIEtldmluIENoZWEKICAqLwogCi0jaW5jbHVkZSA8eHRlbnNhL2NhY2hlYXNtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlYXNtLmg+CiAKIC8qCiAgKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgZW50cnkgY29kZSBmb3Iga2VybmVsIGltYWdlcy4gSXQgcGVyZm9ybXMgdGhlCkBAIC0zMiwxMyArMzIsNiBAQAogICoKICAqLwogCi0JLm1hY3JvCWl0ZXJhdGUJZnJvbSwgdG8gLCBjbWQKLQkJLmlmZXEJKChcdG8gLSBcZnJvbSkgJiB+MHhmZmYpCi0JCQlcY21kCVxmcm9tCi0JCQlpdGVyYXRlICIoXGZyb20rMSkiLCBcdG8sIFxjbWQKLQkJLmVuZGlmCi0JLmVuZG0KLQogLyoKICAqICBfc3RhcnQKICAqCkBAIC02NCw3ICs1Nyw3IEBACiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIGV4Y2VwdGlvbnMuICovCiAKLQltb3ZpCWEwLCBYQ0hBTF9QU19FWENNX01BU0sKKwltb3ZpCWEwLCBMT0NLTEVWRUwKIAl3c3IJYTAsIFBTCiAKIAkvKiBQcmVzZXJ2ZSB0aGUgcG9pbnRlciB0byB0aGUgYm9vdCBwYXJhbWV0ZXIgbGlzdCBpbiBFWENTQVZFXzEgKi8KQEAgLTkxLDExICs4NCwxMSBAQAogCW1vdmkJYTEsIDE1CiAJd3NyCWEwLCBJQ09VTlRMRVZFTAogCi0JLm1hY3JvIHJlc2V0X2RicmVhayBudW0KLQl3c3IJYTAsIERCUkVBS0MgKyBcbnVtCi0JLmVuZG0KLQotICAgICAgICBpdGVyYXRlIDAsIFhDSEFMX05VTV9JQlJFQUstMSwgcmVzZXRfZGJyZWFrCisJLnNldAlfaW5kZXgsIDAKKwkucmVwdAlYQ0hBTF9OVU1fREJSRUFLIC0gMQorCXdzcglhMCwgREJSRUFLQyArIF9pbmRleAorCS5zZXQJX2luZGV4LCBfaW5kZXggKyAxCisJLmVuZHIKICNlbmRpZgogCiAJLyogQ2xlYXIgQ0NPVU5UIChub3QgcmVhbGx5IG5lY2Vzc2FyeSwgYnV0IG5pY2UpICovCkBAIC0xMTAsMTAgKzEwMywxMSBAQAogCiAJLyogRGlzYWJsZSBhbGwgdGltZXJzLiAqLwogCi0JLm1hY3JvCXJlc2V0X3RpbWVyCW51bQotCXdzcglhMCwgQ0NPTVBBUkVfMCArIFxudW0KLQkuZW5kbQotCWl0ZXJhdGUJMCwgWENIQUxfTlVNX1RJTUVSUy0xLCByZXNldF90aW1lcgorCS5zZXQJX2luZGV4LCAwCisJLnJlcHQJWENIQUxfTlVNX1RJTUVSUyAtIDEKKwl3c3IJYTAsIENDT01QQVJFICsgX2luZGV4CisJLnNldAlfaW5kZXgsIF9pbmRleCArIDEKKwkuZW5kcgogCiAJLyogSW50ZXJydXB0IGluaXRpYWxpemF0aW9uLiAqLwogCkBAIC0xMzksMTIgKzEzMywyMSBAQAogCXJzeW5jCiAKIAkvKiAgSW5pdGlhbGl6ZSB0aGUgY2FjaGVzLgotCSAqICBEb2VzIG5vdCBpbmNsdWRlIGZsdXNoaW5nIHdyaXRlYmFjayBkLWNhY2hlLgotCSAqICBhNiwgYTcgYXJlIGp1c3Qgd29ya2luZyByZWdpc3RlcnMgKGNsb2JiZXJlZCkuCisJICogIGEyLCBhMyBhcmUganVzdCB3b3JraW5nIHJlZ2lzdGVycyAoY2xvYmJlcmVkKS4KIAkgKi8KIAotCWljYWNoZV9yZXNldCAgYTIsIGEzCi0JZGNhY2hlX3Jlc2V0ICBhMiwgYTMKKyNpZiBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRQorCV9fX3VubG9ja19kY2FjaGVfYWxsIGEyIGEzCisjZW5kaWYKKworI2lmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCisJX19fdW5sb2NrX2ljYWNoZV9hbGwgYTIgYTMKKyNlbmRpZgorCisJX19faW52YWxpZGF0ZV9kY2FjaGVfYWxsIGEyIGEzCisJX19faW52YWxpZGF0ZV9pY2FjaGVfYWxsIGEyIGEzCisKKwlpc3luYwogCiAJLyogVW5wYWNrIGRhdGEgc2VjdGlvbnMKIAkgKgpAQCAtMTgxLDkgKzE4NCw5IEBACiAJbW92aQlhMiwgX2Jzc19zdGFydAkjIHN0YXJ0IG9mIEJTUwogCW1vdmkJYTMsIF9ic3NfZW5kCSMgZW5kIG9mIEJTUwogCi0xOglhZGRpCWEyLCBhMiwgNAorCV9fbG9vcHQJYTIsIGEzLCBhNCwgMgogCXMzMmkJYTAsIGEyLCAwCi0JYmx0CWEyLCBhMywgMWIKKwlfX2VuZGxhCWEyLCBhNCwgNAogCiAjaWYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSwogCkBAIC0xOTEsNyArMTk0LDcgQEAKIAkgKiBpbnN0cnVjdGlvbnMvZGF0YSBhcmUgYXZhaWxhYmxlLgogCSAqLwogCi0JZGNhY2hlX3dyaXRlYmFja19hbGwJYTIsIGEzCisJX19fZmx1c2hfZGNhY2hlX2FsbCBhMiBhMwogI2VuZGlmCiAKIAkvKiBTZXR1cCBzdGFjayBhbmQgZW5hYmxlIHdpbmRvdyBleGNlcHRpb25zIChrZWVwIGlycXMgZGlzYWJsZWQpICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaXJxLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvaXJxLmMKaW5kZXggMWNmNzQ0ZS4uYzllYTczYiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL2lycS5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9pcnEuYwpAQCAtNCw3ICs0LDcgQEAKICAqIFh0ZW5zYSBidWlsdC1pbiBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgc29tZSBnZW5lcmljIGZ1bmN0aW9ucyBjb3BpZWQKICAqIGZyb20gaTM4Ni4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA1IFRlbnNpbGljYSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNiBUZW5zaWxpY2EsIEluYy4KICAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5OCBMaW51cyBUb3J2YWxkcywgSW5nbyBNb2xuYXIKICAqCiAgKgpAQCAtMjIsMTEgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS5oPgogCi1zdGF0aWMgdm9pZCBlbmFibGVfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGRpc2FibGVfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja194dGVuc2EodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCBlbmRfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQogc3RhdGljIHVuc2lnbmVkIGludCBjYWNoZWRfaXJxX21hc2s7CiAKIGF0b21pY190IGlycV9lcnJfY291bnQ7CkBAIC00Niw4ICs0MSwxNiBAQAogICogaGFuZGxlcnMpLgogICovCiAKLXVuc2lnbmVkIGludCAgZG9fSVJRKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSB2b2lkIGRvX0lSUShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisKKwlpZiAoaXJxID49IE5SX0lSUVMpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBjYW5ub3QgaGFuZGxlIElSUSAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGlycSk7CisJfQorCiAJaXJxX2VudGVyKCk7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVwpAQCAtNjMsMTIgKzY2LDEwIEBACiAJCQkgICAgICAgc3AgLSBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSk7CiAJfQogI2VuZGlmCi0KLQlfX2RvX0lSUShpcnEsIHJlZ3MpOworCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKIAogCWlycV9leGl0KCk7Ci0KLQlyZXR1cm4gMTsKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwogfQogCiAvKgpAQCAtMTE4LDcyICsxMTksNjggQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0vKiBzaHV0ZG93biBpcyBzYW1lIGFzICJkaXNhYmxlIiAqLwotI2RlZmluZSBzaHV0ZG93bl94dGVuc2FfaXJxIGRpc2FibGVfeHRlbnNhX2lycQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWVuYWJsZV94dGVuc2FfaXJxKGlycSk7Ci0JcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHh0ZW5zYV9pcnFfdHlwZSA9IHsKLQkiWHRlbnNhLUlSUSIsCi0Jc3RhcnR1cF94dGVuc2FfaXJxLAotCXNodXRkb3duX3h0ZW5zYV9pcnEsCi0JZW5hYmxlX3h0ZW5zYV9pcnEsCi0JZGlzYWJsZV94dGVuc2FfaXJxLAotCW1hc2tfYW5kX2Fja194dGVuc2EsCi0JZW5kX3h0ZW5zYV9pcnEKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgeHRlbnNhX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJY2FjaGVkX2lycV9tYXNrICY9IH4oMSA8PCBpcnEpOwogCXNldF9zciAoY2FjaGVkX2lycV9tYXNrLCBJTlRFTkFCTEUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgeHRlbnNhX2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKIHsKIAljYWNoZWRfaXJxX21hc2sgfD0gMSA8PCBpcnE7CiAJc2V0X3NyIChjYWNoZWRfaXJxX21hc2ssIElOVEVOQUJMRSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc2FibGVfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgeHRlbnNhX2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwotCW1hc2tfaXJxKGlycSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXNldF9zcigxIDw8IGlycSwgSU5UQ0xFQVIpOwogfQogCi1zdGF0aWMgdm9pZCBlbmFibGVfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIGludCB4dGVuc2FfaXJxX3JldHJpZ2dlcih1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0JdW5tYXNrX2lycShpcnEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlzZXRfc3IgKDEgPDwgaXJxLCBJTlRTRVQpOworCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfeHRlbnNhKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIGRpc2FibGVfeHRlbnNhX2lycShpcnEpOwotfQogCi1zdGF0aWMgdm9pZCBlbmRfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICBlbmFibGVfeHRlbnNhX2lycShpcnEpOwotfQotCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHh0ZW5zYV9pcnFfY2hpcCA9IHsKKwkubmFtZQkJPSAieHRlbnNhIiwKKwkubWFzawkJPSB4dGVuc2FfaXJxX21hc2ssCisJLnVubWFzawkJPSB4dGVuc2FfaXJxX3VubWFzaywKKwkuYWNrCQk9IHh0ZW5zYV9pcnFfYWNrLAorCS5yZXRyaWdnZXIJPSB4dGVuc2FfaXJxX3JldHJpZ2dlciwKK307CiAKIHZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IGluZGV4OwogCi0JZm9yIChpPTA7IGkgPCBYVEVOU0FfTlJfSVJRUzsgaSsrKQotCQlpcnFfZGVzY1tpXS5jaGlwID0gJnh0ZW5zYV9pcnFfdHlwZTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBYVEVOU0FfTlJfSVJRUzsgaW5kZXgrKykgeworCQlpbnQgbWFzayA9IDEgPDwgaW5kZXg7CisKKwkJaWYgKG1hc2sgJiBYQ0hBTF9JTlRUWVBFX01BU0tfU09GVFdBUkUpCisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaW5kZXgsICZ4dGVuc2FfaXJxX2NoaXAsCisJCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOworCisJCWVsc2UgaWYgKG1hc2sgJiBYQ0hBTF9JTlRUWVBFX01BU0tfRVhURVJOX0VER0UpCisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaW5kZXgsICZ4dGVuc2FfaXJxX2NoaXAsCisJCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKworCQllbHNlIGlmIChtYXNrICYgWENIQUxfSU5UVFlQRV9NQVNLX0VYVEVSTl9MRVZFTCkKKwkJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpbmRleCwgJnh0ZW5zYV9pcnFfY2hpcCwKKwkJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKKworCQllbHNlIGlmIChtYXNrICYgWENIQUxfSU5UVFlQRV9NQVNLX1RJTUVSKQorCQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGluZGV4LCAmeHRlbnNhX2lycV9jaGlwLAorCQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisKKwkJZWxzZQkvKiBYQ0hBTF9JTlRUWVBFX01BU0tfV1JJVEVfRVJST1IgKi8KKwkJCS8qIFhDSEFMX0lOVFRZUEVfTUFTS19OTUkgKi8KKworCQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGluZGV4LCAmeHRlbnNhX2lycV9jaGlwLAorCQkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOworCX0KIAogCWNhY2hlZF9pcnFfbWFzayA9IDA7Ci0KLQlwbGF0Zm9ybV9pbml0X2lycSgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggNjY0OGZhOS4uY2E3NmYwNyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLWRtYS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGFyY2gveHRlbnNhL2tlcm5lbC9wY2ktZG1hLmMKKyAqIGFyY2gveHRlbnNhL3BjaS1kbWEuYwogICoKICAqIERNQSBjb2hlcmVudCBtZW1vcnkgYWxsb2NhdGlvbi4KICAqCkBAIC0yOSwyOCArMjksNDggQEAKICAqLwogCiB2b2lkICoKLWRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpoYW5kbGUsIGdmcF90IGdmcCkKK2RtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsc2l6ZV90IHNpemUsZG1hX2FkZHJfdCAqaGFuZGxlLGdmcF90IGZsYWcpCiB7Ci0Jdm9pZCAqcmV0OworCXVuc2lnbmVkIGxvbmcgcmV0OworCXVuc2lnbmVkIGxvbmcgdW5jYWNoZWQgPSAwOwogCiAJLyogaWdub3JlIHJlZ2lvbiBzcGVpY2lmaWVycyAqLwotCWdmcCAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0pOwogCi0JaWYgKGRldiA9PSBOVUxMIHx8ICgqZGV2LT5kbWFfbWFzayA8IDB4ZmZmZmZmZmYpKQotCQlnZnAgfD0gR0ZQX0RNQTsKLQlyZXQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBnZXRfb3JkZXIoc2l6ZSkpOworCWZsYWcgJj0gfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKTsKIAotCWlmIChyZXQgIT0gTlVMTCkgewotCQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQkJKmhhbmRsZSA9IHZpcnRfdG9fYnVzKHJldCk7CisJaWYgKGRldiA9PSBOVUxMIHx8IChkZXYtPmNvaGVyZW50X2RtYV9tYXNrIDwgMHhmZmZmZmZmZikpCisJCWZsYWcgfD0gR0ZQX0RNQTsKKwlyZXQgPSAodW5zaWduZWQgbG9uZylfX2dldF9mcmVlX3BhZ2VzKGZsYWcsIGdldF9vcmRlcihzaXplKSk7CisKKwlpZiAocmV0ID09IDApCisJCXJldHVybiBOVUxMOworCisJLyogV2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgY29oZXJlbnQgbWVtb3J5IG91dHNpZGUgS1NFRyAqLworCisJaWYgKHJldCA8IFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCisJICAgIHx8IHJldCA+PSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiArIFhDSEFMX0tTRUdfU0laRSkKKwkJQlVHKCk7CisKKworCWlmIChyZXQgIT0gMCkgeworCQltZW1zZXQoKHZvaWQqKSByZXQsIDAsIHNpemUpOworCQl1bmNhY2hlZCA9IHJldCtYQ0hBTF9LU0VHX0JZUEFTU19WQUREUi1YQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUjsKKwkJKmhhbmRsZSA9IHZpcnRfdG9fYnVzKCh2b2lkKilyZXQpOworCQlfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHJldCwgc2l6ZSk7CiAJfQotCXJldHVybiAodm9pZCopIEJZUEFTU19BRERSKCh1bnNpZ25lZCBsb25nKXJldCk7CisKKwlyZXR1cm4gKHZvaWQqKXVuY2FjaGVkOwogfQogCiB2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCSB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQogewotCWZyZWVfcGFnZXMoQ0FDSEVEX0FERFIoKHVuc2lnbmVkIGxvbmcpdmFkZHIpLCBnZXRfb3JkZXIoc2l6ZSkpOworCWxvbmcgYWRkcj0obG9uZyl2YWRkcitYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUi1YQ0hBTF9LU0VHX0JZUEFTU19WQUREUjsKKworCWlmIChhZGRyIDwgMCB8fCBhZGRyID49IFhDSEFMX0tTRUdfU0laRSkKKwkJQlVHKCk7CisKKwlmcmVlX3BhZ2VzKGFkZHIsIGdldF9vcmRlcihzaXplKSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYTdjNDE3OC4uNzk1YmQ1YSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xLDQgKzEsMyBAQAotLy8gVE9ETwl2ZXJpZnkgY29wcm9jZXNzb3IgaGFuZGxpbmcKIC8qCiAgKiBhcmNoL3h0ZW5zYS9rZXJuZWwvcHJvY2Vzcy5jCiAgKgpAQCAtNDMsNyArNDIsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL2NvcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3JlZ3MuaD4KIAogZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKIApAQCAtNjcsMjUgKzY2LDYgQEAKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAogCi0jaWYgWENIQUxfQ1BfTlVNID4gMAotCi0vKgotICogQ29wcm9jZXNzb3Igb3duZXJzaGlwLgotICovCi0KLWNvcHJvY2Vzc29yX2luZm9fdCBjb3Byb2Nlc3Nvcl9pbmZvW10gPSB7Ci0JeyAwLCBYVEVOU0FfQ1BFX0NQMF9PRkZTRVQgfSwKLQl7IDAsIFhURU5TQV9DUEVfQ1AxX09GRlNFVCB9LAotCXsgMCwgWFRFTlNBX0NQRV9DUDJfT0ZGU0VUIH0sCi0JeyAwLCBYVEVOU0FfQ1BFX0NQM19PRkZTRVQgfSwKLQl7IDAsIFhURU5TQV9DUEVfQ1A0X09GRlNFVCB9LAotCXsgMCwgWFRFTlNBX0NQRV9DUDVfT0ZGU0VUIH0sCi0JeyAwLCBYVEVOU0FfQ1BFX0NQNl9PRkZTRVQgfSwKLQl7IDAsIFhURU5TQV9DUEVfQ1A3X09GRlNFVCB9LAotfTsKLQotI2VuZGlmCi0KIC8qCiAgKiBQb3dlcm1hbmFnZW1lbnQgaWRsZSBmdW5jdGlvbiwgaWYgYW55IGlzIHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybS4KICAqLwpAQCAtMTEwLDEyICs5MCwxMCBAQAogCiB2b2lkIGV4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JcmVsZWFzZV9jb3Byb2Nlc3NvcnMoY3VycmVudCk7CS8qIEVtcHR5IG1hY3JvIGlmIG5vIENQcyBhcmUgZGVmaW5lZCAqLwogfQogCiB2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQogewotCXJlbGVhc2VfY29wcm9jZXNzb3JzKGN1cnJlbnQpOwkvKiBFbXB0eSBtYWNybyBpZiBubyBDUHMgYXJlIGRlZmluZWQgKi8KIH0KIAogLyoKQEAgLTE4MywzNiArMTYxLDYgQEAKIAogCiAvKgotICogQ3JlYXRlIGEga2VybmVsIHRocmVhZAotICovCi0KLWludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWxvbmcgcmV0dmFsOwotCV9fYXNtX18gX192b2xhdGlsZV9fCi0JCSgibW92ICAgICAgICAgICBhNSwgJTRcblx0IiAvKiBwcmVzZXJ2ZSBmbiBpbiBhNSAqLwotCQkgIm1vdiAgICAgICAgICAgYTYsICUzXG5cdCIgLyogcHJlc2VydmUgYW5kIHNldHVwIGFyZyBpbiBhNiAqLwotCQkgIm1vdmkJCWEyLCAlMVxuXHQiIC8qIGxvYWQgX19OUl9jbG9uZSBmb3Igc3lzY2FsbCovCi0JCSAibW92CQlhMywgc3Bcblx0IiAvKiBzcCBjaGVjayBhbmQgc3lzX2Nsb25lICovCi0JCSAibW92CQlhNCwgJTVcblx0IiAvKiBsb2FkIGZsYWdzIGZvciBzeXNjYWxsICovCi0JCSAic3lzY2FsbFxuXHQiCi0JCSAiYmVxCQlhMywgc3AsIDFmXG5cdCIgLyogYnJhbmNoIGlmIHBhcmVudCAqLwotCQkgImNhbGx4NAlhNVxuXHQiICAgICAvKiBjYWxsIGZuICovCi0JCSAibW92aQkJYTIsICUyXG5cdCIgLyogbG9hZCBfX05SX2V4aXQgZm9yIHN5c2NhbGwgKi8KLQkJICJtb3YJCWEzLCBhNlxuXHQiIC8qIGxvYWQgZm4gcmV0dXJuIHZhbHVlICovCi0JCSAic3lzY2FsbFxuIgotCQkgIjE6XG5cdCIKLQkJICJtb3YJCSUwLCBhMlxuXHQiIC8qIHBhcmVudCByZXR1cm5zIHplcm8gKi8KLQkJIDoiPXIiIChyZXR2YWwpCi0JCSA6ImkiIChfX05SX2Nsb25lKSwgImkiIChfX05SX2V4aXQpLAotCQkgInIiIChhcmcpLCAiciIgKGZuKSwKLQkJICJyIiAoZmxhZ3MgfCBDTE9ORV9WTSkKLQkJIDogImEyIiwgImEzIiwgImE0IiwgImE1IiwgImE2IiApOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotLyoKICAqIFRoZXNlIGJyYWNrZXQgdGhlIHNsZWVwaW5nIGZ1bmN0aW9ucy4uCiAgKi8KIApAQCAtMjc1LDcgKzIyMyw3IEBACiAJICovCiAKIAllbGZyZWdzLT5wYwkJPSByZWdzLT5wYzsKLQllbGZyZWdzLT5wcwkJPSAocmVncy0+cHMgJiB+WENIQUxfUFNfRVhDTV9NQVNLKTsKKwllbGZyZWdzLT5wcwkJPSAocmVncy0+cHMgJiB+KDEgPDwgUFNfRVhDTV9CSVQpKTsKIAllbGZyZWdzLT5leGNjYXVzZQk9IHJlZ3MtPmV4Y2NhdXNlOwogCWVsZnJlZ3MtPmV4Y3ZhZGRyCT0gcmVncy0+ZXhjdmFkZHI7CiAJZWxmcmVncy0+d2luZG93YmFzZQk9IHJlZ3MtPndpbmRvd2Jhc2U7CkBAIC0zMjUsNyArMjczLDcgQEAKIAkgKi8KIAogCXJlZ3MtPnBjCQk9IGVsZnJlZ3MtPnBjOwotCXJlZ3MtPnBzCQk9IChlbGZyZWdzLT5wcyB8IFhDSEFMX1BTX0VYQ01fTUFTSyk7CisJcmVncy0+cHMJCT0gKGVsZnJlZ3MtPnBzIHwgKDEgPDwgUFNfRVhDTV9CSVQpKTsKIAlyZWdzLT5leGNjYXVzZQkJPSBlbGZyZWdzLT5leGNjYXVzZTsKIAlyZWdzLT5leGN2YWRkcgkJPSBlbGZyZWdzLT5leGN2YWRkcjsKIAlyZWdzLT53aW5kb3diYXNlCT0gZWxmcmVncy0+d2luZG93YmFzZTsKQEAgLTQ1OSwxNiArNDA3LDcgQEAKIGludAogZHVtcF90YXNrX2ZwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBlbGZfZnByZWdzZXRfdCAqcikKIHsKLS8qIHNlZSBhc20vY29wcm9jZXNzb3IuaCBmb3IgdGhpcyBtYWdpYyBudW1iZXIgMTYgKi8KLSNpZiBYVEVOU0FfQ1BfRVhUUkFfU0laRSA+IDE2Ci0JZG9fc2F2ZV9mcHJlZ3MgKHIsIHJlZ3MsIHRhc2spOwotCi0JLyogIEZvciBub3csIGJpdCAxNiBtZWFucyBzb21lIGV4dHJhIHN0YXRlIG1heSBiZSBwcmVzZW50OiAgKi8KLS8vIEZJWE1FISEgbmVlZCB0byB0cmFjayB0byByZXR1cm4gbW9yZSBhY2N1cmF0ZSBtYXNrCi0JcmV0dXJuIDB4MTAwMDAgfCBYQ0hBTF9DUF9NQVNLOwotI2Vsc2UKIAlyZXR1cm4gMDsJLyogbm8gY29wcm9jZXNzb3JzIGFjdGl2ZSBvbiB0aGlzIHByb2Nlc3NvciAqLwotI2VuZGlmCiB9CiAKIC8qCkBAIC00ODMsMyArNDIyLDQ0IEBACiB7CiAJcmV0dXJuIGR1bXBfdGFza19mcHUocmVncywgY3VycmVudCwgcik7CiB9CisKK2FzbWxpbmthZ2UKK2xvbmcgeHRlbnNhX2Nsb25lKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3c3AsCisgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqcGFyZW50X3RpZCwgdm9pZCAqY2hpbGRfdGxzLAorICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmNoaWxkX3RpZCwgbG9uZyBhNSwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBpZiAoIW5ld3NwKQorICAgICAgICAgICAgICAgIG5ld3NwID0gcmVncy0+YXJlZ1sxXTsKKyAgICAgICAgcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCByZWdzLCAwLCBwYXJlbnRfdGlkLCBjaGlsZF90aWQpOworfQorCisvKgorICogICogeHRlbnNhX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCisgKiAgICovCisKK2FzbWxpbmthZ2UKK2xvbmcgeHRlbnNhX2V4ZWN2ZShjaGFyIF9fdXNlciAqbmFtZSwgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmVudnAsCisgICAgICAgICAgICAgICAgICAgbG9uZyBhMywgbG9uZyBhNCwgbG9uZyBhNSwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlsb25nIGVycm9yOworCWNoYXIgKiBmaWxlbmFtZTsKKworCWZpbGVuYW1lID0gZ2V0bmFtZShuYW1lKTsKKwllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOworCWlmIChJU19FUlIoZmlsZW5hbWUpKQorCQlnb3RvIG91dDsKKwkvLyBGSVhNRTogcmVsZWFzZSBjb3Byb2Nlc3Nvcj8/CisJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIGFyZ3YsIGVudnAsIHJlZ3MpOworCWlmIChlcnJvciA9PSAwKSB7CisJCXRhc2tfbG9jayhjdXJyZW50KTsKKwkJY3VycmVudC0+cHRyYWNlICY9IH5QVF9EVFJBQ0U7CisJCXRhc2tfdW5sb2NrKGN1cnJlbnQpOworCX0KKwlwdXRuYW1lKGZpbGVuYW1lKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYwppbmRleCA5YWVhMjNjLi44YjZkM2QwIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCkBAIC05Niw3ICs5Niw3IEBACiAJCQkvKiBOb3RlOiAgUFMuRVhDTSBpcyBub3Qgc2V0IHdoaWxlIHVzZXIgdGFzayBpcyBydW5uaW5nOwogCQkJICogaXRzIGJlaW5nIHNldCBpbiByZWdzIGlzIGZvciBleGNlcHRpb24gaGFuZGxpbmcKIAkJCSAqIGNvbnZlbmllbmNlLiAgKi8KLQkJCXRtcCA9IChyZWdzLT5wcyAmIH5YQ0hBTF9QU19FWENNX01BU0spOworCQkJdG1wID0gKHJlZ3MtPnBzICYgfigxIDw8IFBTX0VYQ01fQklUKSk7CiAJCQlicmVhazsKIAkJY2FzZSBSRUdfV0I6CiAJCQl0bXAgPSByZWdzLT53aW5kb3diYXNlOwpAQCAtMzMyLDEyICszMzIsNiBAQAogCiB2b2lkIGRvX3N5c2NhbGxfdHJhY2Uodm9pZCkKIHsKLQlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQotCQlyZXR1cm47Ci0KLQlpZiAoIShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBUaGUgMHg4MCBwcm92aWRlcyBhIHdheSBmb3IgdGhlIHRyYWNpbmcgcGFyZW50IHRvIGRpc3Rpbmd1aXNoCiAJICogYmV0d2VlbiBhIHN5c2NhbGwgc3RvcCBhbmQgU0lHVFJBUCBkZWxpdmVyeQpAQCAtMzU0LDMgKzM0OCwyMyBAQAogCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOwogCX0KIH0KKwordm9pZCBkb19zeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKQorCQkJJiYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQorCQlkb19zeXNjYWxsX3RyYWNlKCk7CisKKyNpZiAwCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKQorCQlhdWRpdF9zeXNjYWxsX2VudHJ5KGN1cnJlbnQsIEFVRElUX0FSQ0hfWFRFTlNBLi4pOworI2VuZGlmCit9CisKK3ZvaWQgZG9fc3lzY2FsbF90cmFjZV9sZWF2ZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorCQkJJiYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQorCQlkb19zeXNjYWxsX3RyYWNlKCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3NldHVwLmMKaW5kZXggYzk5YWI3Mi4uYjYzNzRjMCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3NldHVwLmMKQEAgLTQyLDggKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9zeXN0ZW0uaD4KLQogI2lmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKSB8fCBkZWZpbmVkKENPTkZJR19EVU1NWV9DT05TT0xFKQogc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvID0geyAwLCAyNCwgMCwgMCwgMCwgODAsIDAsIDAsIDAsIDI0LCAxLCAxNn07CiAjZW5kaWYKQEAgLTMzNiw3ICszMzQsNyBAQAogCS8qIGhpZ2gtbGV2ZWwgc3R1ZmYgKi8KIAlzZXFfcHJpbnRmKGYsInByb2Nlc3Nvclx0OiAwXG4iCiAJCSAgICAgInZlbmRvcl9pZFx0OiBUZW5zaWxpY2FcbiIKLQkJICAgICAibW9kZWxcdFx0OiBYdGVuc2EgIiBYQ0hBTF9IV19SRUxFQVNFX05BTUUgIlxuIgorCQkgICAgICJtb2RlbFx0XHQ6IFh0ZW5zYSAiIFhDSEFMX0hXX1ZFUlNJT05fTkFNRSAiXG4iCiAJCSAgICAgImNvcmUgSURcdFx0OiAiIFhDSEFMX0NPUkVfSUQgIlxuIgogCQkgICAgICJidWlsZCBJRFx0OiAweCV4XG4iCiAJCSAgICAgImJ5dGUgb3JkZXJcdDogJXNcbiIKQEAgLTQyMCwyNSArNDE4LDYgQEAKIAkJICAgICBYQ0hBTF9OVU1fVElNRVJTLAogCQkgICAgIFhDSEFMX0RFQlVHTEVWRUwpOwogCi0JLyogQ29wcm9jZXNzb3JzICovCi0jaWYgWENIQUxfSEFWRV9DUAotCXNlcV9wcmludGYoZiwgImNvcHJvY2Vzc29yc1x0OiAlZFxuIiwgWENIQUxfQ1BfTlVNKTsKLSNlbHNlCi0Jc2VxX3ByaW50ZihmLCAiY29wcm9jZXNzb3JzXHQ6IG5vbmVcbiIpOwotI2VuZGlmCi0KLQkvKiB7SSxEfXtSQU0sUk9NfSBhbmQgWExNSSAqLwotCXNlcV9wcmludGYoZiwiaW5zdCBST01zXHQ6ICVkXG4iCi0JCSAgICAgImluc3QgUkFNc1x0OiAlZFxuIgotCQkgICAgICJkYXRhIFJPTXNcdDogJWRcbiIKLQkJICAgICAiZGF0YSBSQU1zXHQ6ICVkXG4iCi0JCSAgICAgIlhMTUkgcG9ydHNcdDogJWRcbiIsCi0JCSAgICAgWENIQUxfTlVNX0lST00sCi0JCSAgICAgWENIQUxfTlVNX0lSQU0sCi0JCSAgICAgWENIQUxfTlVNX0RST00sCi0JCSAgICAgWENIQUxfTlVNX0RSQU0sCi0JCSAgICAgWENIQUxfTlVNX1hMTUkpOwotCiAJLyogQ2FjaGUgKi8KIAlzZXFfcHJpbnRmKGYsImljYWNoZSBsaW5lIHNpemU6ICVkXG4iCiAJCSAgICAgImljYWNoZSB3YXlzXHQ6ICVkXG4iCkBAIC00NjYsMjQgKzQ0NSw2IEBACiAJCSAgICAgWENIQUxfRENBQ0hFX1dBWVMsCiAJCSAgICAgWENIQUxfRENBQ0hFX1NJWkUpOwogCi0JLyogTU1VICovCi0Jc2VxX3ByaW50ZihmLCJBU0lEIGJpdHNcdDogJWRcbiIKLQkJICAgICAiQVNJRCBpbnZhbGlkXHQ6ICVkXG4iCi0JCSAgICAgIkFTSUQga2VybmVsXHQ6ICVkXG4iCi0JCSAgICAgInJpbmdzXHRcdDogJWRcbiIKLQkJICAgICAiaXRsYiB3YXlzXHQ6ICVkXG4iCi0JCSAgICAgIml0bGIgQVIgd2F5c1x0OiAlZFxuIgotCQkgICAgICJkdGxiIHdheXNcdDogJWRcbiIKLQkJICAgICAiZHRsYiBBUiB3YXlzXHQ6ICVkXG4iLAotCQkgICAgIFhDSEFMX01NVV9BU0lEX0JJVFMsCi0JCSAgICAgWENIQUxfTU1VX0FTSURfSU5WQUxJRCwKLQkJICAgICBYQ0hBTF9NTVVfQVNJRF9LRVJORUwsCi0JCSAgICAgWENIQUxfTU1VX1JJTkdTLAotCQkgICAgIFhDSEFMX0lUTEJfV0FZUywKLQkJICAgICBYQ0hBTF9JVExCX0FSRl9XQVlTLAotCQkgICAgIFhDSEFMX0RUTEJfV0FZUywKLQkJICAgICBYQ0hBTF9EVExCX0FSRl9XQVlTKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYzQ5NGYwOC4uYzZkOTg4MCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zaWduYWwuYwpAQCAtMTIsOCArMTIsOCBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+Ci0jaW5jbHVkZSA8eHRlbnNhL2hhbC5oPgorI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vY29wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CkBAIC00Niw3ICs0Niw3IEBACiAgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgogICovCiAKLWludCBzeXNfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2ludCB4dGVuc2Ffc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlvbGRfc2lnc2V0X3QgbWFzayA9IChvbGRfc2lnc2V0X3QpIHJlZ3MtPmFyZWdbM107CiAJc2lnc2V0X3Qgc2F2ZXNldDsKQEAgLTY4LDcgKzY4LDcgQEAKIH0KIAogYXNtbGlua2FnZSBpbnQKLXN5c19ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreHRlbnNhX3J0X3NpZ3N1c3BlbmQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc2lnc2V0X3QgKnVuZXdzZXQgPSAoc2lnc2V0X3QgKikgcmVncy0+YXJlZ1s0XTsKIAlzaXplX3Qgc2lnc2V0c2l6ZSA9IChzaXplX3QpIHJlZ3MtPmFyZWdbM107CkBAIC05Niw3ICs5Niw3IEBACiB9CiAKIGFzbWxpbmthZ2UgaW50Ci1zeXNfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uICphY3QsCit4dGVuc2Ffc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uICphY3QsCiAJICAgICAgc3RydWN0IG9sZF9zaWdhY3Rpb24gKm9hY3QpCiB7CiAJc3RydWN0IGtfc2lnYWN0aW9uIG5ld19rYSwgb2xkX2thOwpAQCAtMTI4LDcgKzEyOCw3IEBACiB9CiAKIGFzbWxpbmthZ2UgaW50Ci1zeXNfc2lnYWx0c3RhY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit4dGVuc2Ffc2lnYWx0c3RhY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJY29uc3Qgc3RhY2tfdCAqdXNzID0gKHN0YWNrX3QgKikgcmVncy0+YXJlZ1s0XTsKIAlzdGFja190ICp1b3NzID0gKHN0YWNrX3QgKikgcmVncy0+YXJlZ1szXTsKQEAgLTIxNiw4ICsyMTYsOCBAQAogCSAqIGhhbmRsZXIsIG9yIHRoZSB1c2VyIG1vZGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIgKGUuZy4gUFMuT1dCKS4KIAkgKi8KIAllcnIgfD0gX19nZXRfdXNlcihwcywgJnNjLT5zY19wcyk7Ci0JcmVncy0+cHMgPSAocmVncy0+cHMgJiB+WENIQUxfUFNfQ0FMTElOQ19NQVNLKQotCQl8IChwcyAmIFhDSEFMX1BTX0NBTExJTkNfTUFTSyk7CisJcmVncy0+cHMgPSAocmVncy0+cHMgJiB+UFNfQ0FMTElOQ19NQVNLKQorCQl8IChwcyAmIFBTX0NBTExJTkNfTUFTSyk7CiAKIAkvKiBBZGRpdGlvbmFsIGNvcnJ1cHRpb24gY2hlY2tzICovCiAKQEAgLTI4MCw3ICsyODAsNyBAQAogc3RhdGljIGludAogc2F2ZV9jcGV4dHJhIChzdHJ1Y3QgX2Nwc3RhdGUgKmJ1ZikKIHsKLSNpZiAoWENIQUxfRVhUUkFfU0FfU0laRSA9PSAwKSAmJiAoWENIQUxfQ1BfTlVNID09IDApCisjaWYgWENIQUxfQ1BfTlVNID09IDAKIAlyZXR1cm4gMDsKICNlbHNlCiAKQEAgLTM1MCw3ICszNTAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWFzbWxpbmthZ2UgaW50IHN5c19zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGludCB4dGVuc2Ffc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBzaWdmcmFtZSAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lICopcmVncy0+YXJlZ1sxXTsKIAlzaWdzZXRfdCBzZXQ7CkBAIC0zODIsNyArMzgyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBpbnQgc3lzX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2FzbWxpbmthZ2UgaW50IHh0ZW5zYV9ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgKilyZWdzLT5hcmVnWzFdOwogCXNpZ3NldF90IHNldDsKQEAgLTQ5Nyw4ICs0OTcsMTAgQEAKIAogCS8qIEZsdXNoIGdlbmVyYXRlZCBjb2RlIG91dCBvZiB0aGUgZGF0YSBjYWNoZSAqLwogCi0JaWYgKGVyciA9PSAwKQotCQlfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpY29kZW1lbSwgNlVMKTsKKwlpZiAoZXJyID09IDApIHsKKwkJX19pbnZhbGlkYXRlX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyljb2RlbWVtLCA2VUwpOworCQlfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWNvZGVtZW0sIDZVTCk7CisJfQogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzgzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbC5jCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMTk5NSAtIDIwMDAgYnkgUmFsZiBCYWVjaGxlCisgKgorICogSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgorICogTWFyYyBHYXV0aGllciA8bWFyY0B0ZW5zaWxpY2EuY29tLCBtYXJjQGFsdW1uaS51d2F0ZXJsb28uY2E+CisgKiBDaHJpcyBaYW5rZWwgPGNocmlzQHphbmtlbC5uZXQ+CisgKiBLZXZpbiBDaGVhCisgKgorICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zaG0uaD4KKwordHlwZWRlZiB2b2lkICgqc3lzY2FsbF90KSh2b2lkKTsKKworc3lzY2FsbF90IHN5c19jYWxsX3RhYmxlW19fTlJfc3lzY2FsbF9jb3VudF0gLyogRklYTUUgX19jYWNoZWxpbmVfYWxpZ25lZCAqLz0geworCVswIC4uLiBfX05SX3N5c2NhbGxfY291bnQgLSAxXSA9IChzeXNjYWxsX3QpJnN5c19uaV9zeXNjYWxsLAorCisjdW5kZWYgX19TWVNDQUxMCisjZGVmaW5lIF9fU1lTQ0FMTChucixzeW1ib2wsbmFyZ3MpIFsgbnIgXSA9IChzeXNjYWxsX3Qpc3ltYm9sLAorI3VuZGVmIF9YVEVOU0FfVU5JU1REX0gKKyN1bmRlZiAgX19LRVJORUxfU1lTQ0FMTFNfXworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KK307CisKKy8qCisgKiB4dGVuc2FfcGlwZSgpIGlzIHRoZSBub3JtYWwgQyBjYWxsaW5nIHN0YW5kYXJkIGZvciBjcmVhdGluZyBhIHBpcGUuIEl0J3Mgbm90CisgKiB0aGUgd2F5IHVuaXggdHJhZGl0aW9uYWwgZG9lcyB0aGlzLCB0aG91Z2guCisgKi8KKworYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9waXBlKGludCBfX3VzZXIgKnVzZXJmZHMpCit7CisJaW50IGZkWzJdOworCWludCBlcnJvcjsKKworCWVycm9yID0gZG9fcGlwZShmZCk7CisJaWYgKCFlcnJvcikgeworCQlpZiAoY29weV90b191c2VyKHVzZXJmZHMsIGZkLCAyICogc2l6ZW9mKGludCkpKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKworYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorICAgCQkJICAgICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCit7CisJaW50IGVycm9yID0gLUVCQURGOworCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7CisKKwlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7CisJaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgeworCQlmaWxlID0gZmdldChmZCk7CisJCWlmICghZmlsZSkKKwkJCWdvdG8gb3V0OworCX0KKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChmaWxlKQorCQlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9zaG1hdChpbnQgc2htaWQsIGNoYXIgX191c2VyICpzaG1hZGRyLCBpbnQgc2htZmxnKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCWxvbmcgZXJyOworCisJZXJyID0gZG9fc2htYXQoc2htaWQsIHNobWFkZHIsIHNobWZsZywgJnJldCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gKGxvbmcpcmV0OworfQorCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDljYjIzLi4wMDAwMDAwCi0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qCi0gKiBhcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuYwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgLSAyMDAwIGJ5IFJhbGYgQmFlY2hsZQotICoKLSAqIEpvZSBUYXlsb3IgPGpvZUB0ZW5zaWxpY2EuY29tLCBqb2V0eWxyQHlhaG9vLmNvbT4KLSAqIE1hcmMgR2F1dGhpZXIgPG1hcmNAdGVuc2lsaWNhLmNvbSwgbWFyY0BhbHVtbmkudXdhdGVybG9vLmNhPgotICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgotICogS2V2aW4gQ2hlYQotICoKLSAqLwotCi0jZGVmaW5lIERFQlVHCTAKLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1hbi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tc2cuaD4KLSNpbmNsdWRlIDxsaW51eC9zaG0uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vc2lnbmFsLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgotI2luY2x1ZGUgPGFzbS9tbWFuLmg+Ci0jaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLQotZXh0ZXJuIHZvaWQgZG9fc3lzY2FsbF90cmFjZSh2b2lkKTsKLXR5cGVkZWYgaW50ICgqc3lzY2FsbF90KSh2b2lkICphMCwuLi4pOwotZXh0ZXJuIHN5c2NhbGxfdCBzeXNfY2FsbF90YWJsZVtdOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc3lzX25hcmdfdGFibGVbXTsKLQotLyoKLSAqIHN5c19waXBlKCkgaXMgdGhlIG5vcm1hbCBDIGNhbGxpbmcgc3RhbmRhcmQgZm9yIGNyZWF0aW5nIGEgcGlwZS4gSXQncyBub3QKLSAqIHRoZSB3YXkgdW5peCB0cmFkaXRpb25hbCBkb2VzIHRoaXMsIHRob3VnaC4KLSAqLwotCi1pbnQgc3lzX3BpcGUoaW50IF9fdXNlciAqdXNlcmZkcykKLXsKLQlpbnQgZmRbMl07Ci0JaW50IGVycm9yOwotCi0JZXJyb3IgPSBkb19waXBlKGZkKTsKLQlpZiAoIWVycm9yKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIodXNlcmZkcywgZmQsIDIgKiBzaXplb2YoaW50KSkpCi0JCQllcnJvciA9IC1FRkFVTFQ7Ci0JfQotCXJldHVybiBlcnJvcjsKLX0KLQotLyoKLSAqIENvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcy4KLSAqLwotbG9uZyBzeXNfbW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCi0JICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKLXsKLQlpbnQgZXJyb3IgPSAtRUJBREY7Ci0Jc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKLQotCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKLQlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7Ci0JCWZpbGUgPSBmZ2V0KGZkKTsKLQkJaWYgKCFmaWxlKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOwotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCi0JaWYgKGZpbGUpCi0JCWZwdXQoZmlsZSk7Ci1vdXQ6Ci0JcmV0dXJuIGVycm9yOwotfQotCi1pbnQgc3lzX2Nsb25lKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBuZXdzcDsKLQlpbnQgX191c2VyICpwYXJlbnRfdGlkcHRyLCAqY2hpbGRfdGlkcHRyOwotCWNsb25lX2ZsYWdzID0gcmVncy0+YXJlZ1s0XTsKLQluZXdzcCA9IHJlZ3MtPmFyZWdbM107Ci0JcGFyZW50X3RpZHB0ciA9IChpbnQgX191c2VyICopcmVncy0+YXJlZ1s1XTsKLQljaGlsZF90aWRwdHIgPSAoaW50IF9fdXNlciAqKXJlZ3MtPmFyZWdbNl07Ci0JaWYgKCFuZXdzcCkKLQkJbmV3c3AgPSByZWdzLT5hcmVnWzFdOwotCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLG5ld3NwLHJlZ3MsMCxwYXJlbnRfdGlkcHRyLGNoaWxkX3RpZHB0cik7Ci19Ci0KLS8qCi0gKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KLSAqLwotCi1pbnQgc3lzX2V4ZWN2ZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgZXJyb3I7Ci0JY2hhciAqIGZpbGVuYW1lOwotCi0JZmlsZW5hbWUgPSBnZXRuYW1lKChjaGFyICopIChsb25nKXJlZ3MtPmFyZWdbNV0pOwotCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7Ci0JaWYgKElTX0VSUihmaWxlbmFtZSkpCi0JCWdvdG8gb3V0OwotCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCAoY2hhciAqKikgKGxvbmcpcmVncy0+YXJlZ1szXSwKLQkgICAgICAgICAgICAgICAgICAoY2hhciAqKikgKGxvbmcpcmVncy0+YXJlZ1s0XSwgcmVncyk7Ci0JcHV0bmFtZShmaWxlbmFtZSk7Ci0KLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLWludCBzeXNfdW5hbWUoc3RydWN0IG9sZF91dHNuYW1lICogbmFtZSkKLXsKLQlpZiAobmFtZSAmJiAhY29weV90b191c2VyKG5hbWUsIHV0c25hbWUoKSwgc2l6ZW9mICgqbmFtZSkpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLQotLyoKLSAqIEJ1aWxkIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoZSBidWlsdGluICJwb29yIG1hbidzIHN0cmFjZSIuCi0gKi8KLQotI2lmIERFQlVHCi0jZGVmaW5lIFNZU0NBTEwoZnVuLCBuYXJnKSAjZnVuLAotc3RhdGljIGNoYXIgKnNmbmFtZXNbXSA9IHsKLSNpbmNsdWRlICJzeXNjYWxscy5oIgotfTsKLSN1bmRlZiBTWVMKLSNlbmRpZgotCi12b2lkIHN5c3RlbV9jYWxsIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzeXNjYWxsX3Qgc3lzY2FsbDsKLQl1bnNpZ25lZCBsb25nIHBhcm0wLCBwYXJtMSwgcGFybTIsIHBhcm0zLCBwYXJtNCwgcGFybTU7Ci0JaW50IG5hcmdzLCByZXM7Ci0JdW5zaWduZWQgaW50IHN5c2NhbGxucjsKLQlpbnQgcHM7Ci0KLSNpZiBERUJVRwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgcGFybXNbNl07Ci0JY2hhciAqc3lzbmFtZTsKLSNlbmRpZgotCi0JcmVncy0+c3lzY2FsbCA9IHJlZ3MtPmFyZWdbMl07Ci0KLQlkb19zeXNjYWxsX3RyYWNlKCk7Ci0KLQkvKiBIYXZlIHRvIGxvYWQgYWZ0ZXIgc3lzY2FsbF90cmFjZSBiZWNhdXNlIHN0cmFjZQotCSAqIHNvbWV0aW1lcyBjaGFuZ2VzIHJlZ3MtPnN5c2NhbGwuCi0JICovCi0Jc3lzY2FsbG5yID0gcmVncy0+c3lzY2FsbDsKLQotCXBhcm0wID0gcGFybTEgPSBwYXJtMiA9IHBhcm0zID0gcGFybTQgPSBwYXJtNSA9IDA7Ci0KLQkvKiBSZXN0b3JlIGludGVycnVwdCBsZXZlbCB0byBzeXNjYWxsIGludm9rZXIncy4KLQkgKiBJZiB0aGlzIHdlcmUgaW4gYXNzZW1ibHksIHdlIHdvdWxkbid0IGRpc2FibGUKLQkgKiBpbnRlcnJ1cHRzIGluIHRoZSBmaXJzdCBwbGFjZToKLQkgKi8KLQlsb2NhbF9zYXZlX2ZsYWdzIChwcyk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoKHBzICYgflhDSEFMX1BTX0lOVExFVkVMX01BU0spIHwKLQkJCSAgKHJlZ3MtPnBzICYgWENIQUxfUFNfSU5UTEVWRUxfTUFTSykgKTsKLQotCWlmIChzeXNjYWxsbnIgPiBfX05SX0xpbnV4X3N5c2NhbGxzKSB7Ci0JCXJlZ3MtPmFyZWdbMl0gPSAtRU5PU1lTOwotCQlyZXR1cm47Ci0JfQotCi0Jc3lzY2FsbCA9IHN5c19jYWxsX3RhYmxlW3N5c2NhbGxucl07Ci0JbmFyZ3MgPSBzeXNfbmFyZ190YWJsZVtzeXNjYWxsbnJdOwotCi0JaWYgKHN5c2NhbGwgPT0gTlVMTCkgewotCQlyZWdzLT5hcmVnWzJdID0gLUVOT1NZUzsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRoZXJlIHNob3VsZG4ndCBiZSBtb3JlIHRoYW4gc2l4IGFyZ3VtZW50cyBpbiB0aGUgdGFibGUhICovCi0KLQlpZiAobmFyZ3MgPiA2KQotCQlwYW5pYygiSW50ZXJuYWwgZXJyb3IgLSB0b28gbWFueSBzeXNjYWxsIGFyZ3VtZW50cyAoJWQpIVxuIiwKLQkJICAgICAgbmFyZ3MpOwotCi0JLyogTGludXggdGFrZXMgc3lzdGVtLWNhbGwgYXJndW1lbnRzIGluIHJlZ2lzdGVycy4gIFRoZSBBQkkKLSAgICAgICAgICogYW5kIFh0ZW5zYSBzb2Z0d2FyZSBjb252ZW50aW9ucyByZXF1aXJlIHRoZSBzeXN0ZW0tY2FsbAotICAgICAgICAgKiBudW1iZXIgaW4gYTIuICBJZiBhbiBhcmd1bWVudCBleGlzdHMgaW4gYTIsIHdlIG1vdmUgaXQgdG8KLSAgICAgICAgICogdGhlIG5leHQgYXZhaWxhYmxlIHJlZ2lzdGVyLiAgTm90ZSB0aGF0IGZvciBpbXByb3ZlZAotICAgICAgICAgKiBlZmZpY2llbmN5LCB3ZSBkbyBOT1Qgc2hpZnQgYWxsIHBhcmFtZXRlcnMgZG93biBvbmUKLSAgICAgICAgICogcmVnaXN0ZXIgdG8gbWFpbnRhaW4gdGhlIG9yaWdpbmFsIG9yZGVyLgotCSAqCi0gICAgICAgICAqIEF0IGJlc3QgY2FzZSAoemVybyBhcmd1bWVudHMpLCB3ZSBqdXN0IHdyaXRlIHRoZSBzeXNjYWxsCi0gICAgICAgICAqIG51bWJlciB0byBhMi4gIEF0IHdvcnN0IGNhc2UgKDEgdG8gNiBhcmd1bWVudHMpLCB3ZSBtb3ZlCi0gICAgICAgICAqIHRoZSBhcmd1bWVudCBpbiBhMiB0byB0aGUgbmV4dCBhdmFpbGFibGUgcmVnaXN0ZXIsIHRoZW4KLSAgICAgICAgICogd3JpdGUgdGhlIHN5c2NhbGwgbnVtYmVyIHRvIGEyLgotCSAqCi0gICAgICAgICAqIEZvciBjbGFyaXR5LCB0aGUgZm9sbG93aW5nIHRydXRoIHRhYmxlIGVudW1lcmF0ZXMgYWxsCi0gICAgICAgICAqIHBvc3NpYmlsaXRpZXMuCi0JICoKLSAgICAgICAgICogYXJndW1lbnRzCXN5c2NhbGwgbnVtYmVyCWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUKLSAgICAgICAgICogLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKgkwCSAgICAgIGEyCi0JICoJMQkgICAgICBhMglhMwotCSAqCTIJICAgICAgYTIJYTQsICAgYTMKLQkgKgkzCSAgICAgIGEyCWE1LCAgIGEzLCAgIGE0Ci0JICoJNAkgICAgICBhMglhNiwgICBhMywgICBhNCwgICBhNQotCSAqCTUJICAgICAgYTIJYTcsICAgYTMsICAgYTQsICAgYTUsICAgYTYKLQkgKgk2CSAgICAgIGEyCWE4LCAgIGEzLCAgIGE0LCAgIGE1LCAgIGE2LCAgIGE3Ci0JICovCi0JaWYgKG5hcmdzKSB7Ci0JCXBhcm0wID0gcmVncy0+YXJlZ1tuYXJncysyXTsKLQkJcGFybTEgPSByZWdzLT5hcmVnWzNdOwotCQlwYXJtMiA9IHJlZ3MtPmFyZWdbNF07Ci0JCXBhcm0zID0gcmVncy0+YXJlZ1s1XTsKLQkJcGFybTQgPSByZWdzLT5hcmVnWzZdOwotCQlwYXJtNSA9IHJlZ3MtPmFyZWdbN107Ci0JfSBlbHNlIC8qIG5hcmdzID09IDAgKi8KLQkJcGFybTAgPSAodW5zaWduZWQgbG9uZykgcmVnczsKLQotI2lmIERFQlVHCi0JcGFybXNbMF0gPSBwYXJtMDsKLQlwYXJtc1sxXSA9IHBhcm0xOwotCXBhcm1zWzJdID0gcGFybTI7Ci0JcGFybXNbM10gPSBwYXJtMzsKLQlwYXJtc1s0XSA9IHBhcm00OwotCXBhcm1zWzVdID0gcGFybTU7Ci0KLQlzeXNuYW1lID0gc2ZuYW1lc1tzeXNjYWxsbnJdOwotCWlmIChzdHJuY21wKHN5c25hbWUsICJzeXNfIiwgNCkgPT0gMCkKLQkJc3lzbmFtZSA9IHN5c25hbWUgKyA0OwotCi0JcHJpbnRrKCJcMDE3U1lTQ0FMTDpJOiV4OiVkOiVzICAlcygiLCByZWdzLT5wYywgY3VycmVudC0+cGlkLAotCSAgICAgICBjdXJyZW50LT5jb21tLCBzeXNuYW1lKTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkJcHJpbnRrKChpPjApID8gIiwgJSNseCIgOiAiJSNseCIsIHBhcm1zW2ldKTsKLQlwcmludGsoIilcbiIpOwotI2VuZGlmCi0KLQlyZXMgPSBzeXNjYWxsKCh2b2lkICopcGFybTAsIHBhcm0xLCBwYXJtMiwgcGFybTMsIHBhcm00LCBwYXJtNSk7Ci0KLSNpZiBERUJVRwotCXByaW50aygiXDAxN1NZU0NBTEw6TzolZDolcyAgJXMoIixjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIHN5c25hbWUpOwotCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQotCQlwcmludGsoKGk+MCkgPyAiLCAlI2x4IiA6ICIlI2x4IiwgcGFybXNbaV0pOwotCWlmIChyZXMgPCA0MDk2KQotCQlwcmludGsoIikgPSAlZFxuIiwgcmVzKTsKLQllbHNlCi0JCXByaW50aygiKSA9ICUjeFxuIiwgcmVzKTsKLSNlbmRpZiAvKiBERUJVRyAqLwotCi0JcmVncy0+YXJlZ1syXSA9IHJlczsKLQlkb19zeXNjYWxsX3RyYWNlKCk7Ci19Ci0KLS8qCi0gKiBEbyBhIHN5c3RlbSBjYWxsIGZyb20ga2VybmVsIGluc3RlYWQgb2YgY2FsbGluZyBzeXNfZXhlY3ZlIHNvIHdlCi0gKiBlbmQgdXAgd2l0aCBwcm9wZXIgcHRfcmVncy4KLSAqLwotaW50IGtlcm5lbF9leGVjdmUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSwgY2hhciAqY29uc3QgZW52cFtdKQotewotCWxvbmcgX19yZXM7Ci0JYXNtIHZvbGF0aWxlICgKLQkJIiAgbW92ICAgYTUsICUyIFxuIgotCQkiICBtb3YgICBhNCwgJTQgXG4iCi0JCSIgIG1vdiAgIGEzLCAlMyBcbiIKLQkJIiAgbW92aSAgYTIsICUxIFxuIgotCQkiICBzeXNjYWxsICAgICAgXG4iCi0JCSIgIG1vdiAgICUwLCBhMiBcbiIKLQkJOiAiPWEiIChfX3JlcykKLQkJOiAiaSIgKF9fTlJfZXhlY3ZlKSwgImEiIChmaWxlbmFtZSksICJhIiAoYXJndiksICJhIiAoZW52cCkKLQkJOiAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiKTsKLQlyZXR1cm4gX19yZXM7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuaCBiL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZjMTBhLi4wMDAwMDAwCi0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qCi0gKiBhcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBieSBSYWxmIEJhZWNobGUKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqCi0gKiBDaGFuZ2VzIGJ5IEpvZSBUYXlsb3IgPGpvZUB0ZW5zaWxpY2EuY29tPgotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgYmVpbmcgaW5jbHVkZWQgdHdpY2UgLSBvbmNlIHRvIGJ1aWxkIGEgbGlzdCBvZiBhbGwKLSAqIHN5c2NhbGxzIGFuZCBvbmNlIHRvIGJ1aWxkIGEgdGFibGUgb2YgaG93IG1hbnkgYXJndW1lbnRzIGVhY2ggc3lzY2FsbAotICogYWNjZXB0cy4gIFN5c2NhbGxzIHRoYXQgcmVjZWl2ZSBhIHBvaW50ZXIgdG8gdGhlIHNhdmVkIHJlZ2lzdGVycyBhcmUKLSAqIG1hcmtlZCBhcyBoYXZpbmcgemVybyBhcmd1bWVudHMuCi0gKgotICogVGhlIGJpbmFyeSBjb21wYXRpYmlsaXR5IGNhbGxzIGFyZSBpbiBhIHNlcGFyYXRlIGxpc3QuCi0gKgotICogRW50cnkgJzAnIHVzZWQgdG8gYmUgc3lzdGVtX2NhbGwuICBJdCdzIHJlbW92ZWQgdG8gZGlzYWJsZSBpbmRpcmVjdAotICogc3lzdGVtIGNhbGxzIGZvciBub3cgc28gdXNlciB0YXNrcyBjYW4ndCByZWN1cnNlLiAgU2VlIG1pcHMnCi0gKiBzeXNfc3lzY2FsbCBmb3IgYSBjb21wYXJhYmxlIGV4YW1wbGUuCi0gKi8KLQotU1lTQ0FMTCgwLCAwKQkJICAgICAgICAgICAgICAgIC8qIDAwICovCi1TWVNDQUxMKHN5c19leGl0LCAxKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX3JlYWQsIDMpCi1TWVNDQUxMKHN5c193cml0ZSwgMykKLVNZU0NBTEwoc3lzX29wZW4sIDMpCQkJLyogMDUgKi8KLVNZU0NBTEwoc3lzX2Nsb3NlLCAxKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMykKLVNZU0NBTEwoc3lzX2NyZWF0LCAyKQotU1lTQ0FMTChzeXNfbGluaywgMikKLVNZU0NBTEwoc3lzX3VubGluaywgMSkJCQkvKiAxMCAqLwotU1lTQ0FMTChzeXNfZXhlY3ZlLCAwKQotU1lTQ0FMTChzeXNfY2hkaXIsIDEpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQotU1lTQ0FMTChzeXNfbWtub2QsIDMpCi1TWVNDQUxMKHN5c19jaG1vZCwgMikJCQkvKiAxNSAqLwotU1lTQ0FMTChzeXNfbGNob3duLCAzKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX25ld3N0YXQsIDIpCi1TWVNDQUxMKHN5c19sc2VlaywgMykKLVNZU0NBTEwoc3lzX2dldHBpZCwgMCkJCQkvKiAyMCAqLwotU1lTQ0FMTChzeXNfbW91bnQsIDUpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQotU1lTQ0FMTChzeXNfc2V0dWlkLCAxKQotU1lTQ0FMTChzeXNfZ2V0dWlkLCAwKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkJCS8qIDI1ICovCi1TWVNDQUxMKHN5c19wdHJhY2UsIDQpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQotU1lTQ0FMTChzeXNfbmV3ZnN0YXQsIDIpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfdXRpbWUsIDIpCQkJLyogMzAgKi8KLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfYWNjZXNzLCAyKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCQkvKiAzNSAqLwotU1lTQ0FMTChzeXNfc3luYywgMCkKLVNZU0NBTEwoc3lzX2tpbGwsIDIpCi1TWVNDQUxMKHN5c19yZW5hbWUsIDIpCi1TWVNDQUxMKHN5c19ta2RpciwgMikKLVNZU0NBTEwoc3lzX3JtZGlyLCAxKQkJCS8qIDQwICovCi1TWVNDQUxMKHN5c19kdXAsIDEpCi1TWVNDQUxMKHN5c19waXBlLCAxKQotU1lTQ0FMTChzeXNfdGltZXMsIDEpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfYnJrLCAxKQkJCS8qIDQ1ICovCi1TWVNDQUxMKHN5c19zZXRnaWQsIDEpCi1TWVNDQUxMKHN5c19nZXRnaWQsIDApCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfZ2V0ZXVpZCwgMCkKLVNZU0NBTEwoc3lzX2dldGVnaWQsIDApCQkJLyogNTAgKi8KLVNZU0NBTEwoc3lzX2FjY3QsIDEpCi1TWVNDQUxMKHN5c191bW91bnQsIDIpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfaW9jdGwsIDMpCi1TWVNDQUxMKHN5c19mY250bCwgMykJCQkvKiA1NSAqLwotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMikKLVNZU0NBTEwoc3lzX3NldHBnaWQsIDIpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX3VtYXNrLCAxKQkJCS8qIDYwICovCi1TWVNDQUxMKHN5c19jaHJvb3QsIDEpCi1TWVNDQUxMKHN5c191c3RhdCwgMikKLVNZU0NBTEwoc3lzX2R1cDIsIDIpCi1TWVNDQUxMKHN5c19nZXRwcGlkLCAwKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIDY1ICovCi1TWVNDQUxMKHN5c19zZXRzaWQsIDApCi1TWVNDQUxMKHN5c19zaWdhY3Rpb24sIDMpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkKLVNZU0NBTEwoc3lzX3NldHJldWlkLCAyKQkJLyogNzAgKi8KLVNZU0NBTEwoc3lzX3NldHJlZ2lkLCAyKQotU1lTQ0FMTChzeXNfc2lnc3VzcGVuZCwgMCkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCi1TWVNDQUxMKHN5c19zZXRob3N0bmFtZSwgMikKLVNZU0NBTEwoc3lzX3NldHJsaW1pdCwgMikJCS8qIDc1ICovCi1TWVNDQUxMKHN5c19nZXRybGltaXQsIDIpCi1TWVNDQUxMKHN5c19nZXRydXNhZ2UsIDIpCi1TWVNDQUxMKHN5c19nZXR0aW1lb2ZkYXksIDIpCi1TWVNDQUxMKHN5c19zZXR0aW1lb2ZkYXksIDIpCi1TWVNDQUxMKHN5c19nZXRncm91cHMsIDIpCQkvKiA4MCAqLwotU1lTQ0FMTChzeXNfc2V0Z3JvdXBzLCAyKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX3N5bWxpbmssIDIpCi1TWVNDQUxMKHN5c19uZXdsc3RhdCwgMikKLVNZU0NBTEwoc3lzX3JlYWRsaW5rLCAzKQkJLyogODUgKi8KLVNZU0NBTEwoc3lzX3VzZWxpYiwgMSkKLVNZU0NBTEwoc3lzX3N3YXBvbiwgMikKLVNZU0NBTEwoc3lzX3JlYm9vdCwgMykKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDMpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCA2KQkJLyogOTAgKi8KLVNZU0NBTEwoc3lzX211bm1hcCwgMikKLVNZU0NBTEwoc3lzX3RydW5jYXRlLCAyKQotU1lTQ0FMTChzeXNfZnRydW5jYXRlLCAyKQotU1lTQ0FMTChzeXNfZmNobW9kLCAyKQotU1lTQ0FMTChzeXNfZmNob3duLCAzKQkJCS8qIDk1ICovCi1TWVNDQUxMKHN5c19nZXRwcmlvcml0eSwgMikKLVNZU0NBTEwoc3lzX3NldHByaW9yaXR5LCAzKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX3N0YXRmcywgMikKLVNZU0NBTEwoc3lzX2ZzdGF0ZnMsIDIpCQkJLyogMTAwICovCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAzKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMikKLVNZU0NBTEwoc3lzX3N5c2xvZywgMykKLVNZU0NBTEwoc3lzX3NldGl0aW1lciwgMykKLVNZU0NBTEwoc3lzX2dldGl0aW1lciwgMikJCS8qIDEwNSAqLwotU1lTQ0FMTChzeXNfbmV3c3RhdCwgMikKLVNZU0NBTEwoc3lzX25ld2xzdGF0LCAyKQotU1lTQ0FMTChzeXNfbmV3ZnN0YXQsIDIpCi1TWVNDQUxMKHN5c191bmFtZSwgMSkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCQkvKiAxMTAgKi8KLVNZU0NBTEwoc3lzX3ZoYW5ndXAsIDApCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX3dhaXQ0LCA0KQotU1lTQ0FMTChzeXNfc3dhcG9mZiwgMSkJCQkvKiAxMTUgKi8KLVNZU0NBTEwoc3lzX3N5c2luZm8sIDEpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfZnN5bmMsIDEpCi1TWVNDQUxMKHN5c19zaWdyZXR1cm4sIDApCi1TWVNDQUxMKHN5c19jbG9uZSwgMCkJCQkvKiAxMjAgKi8KLVNZU0NBTEwoc3lzX3NldGRvbWFpbm5hbWUsIDIpCi1TWVNDQUxMKHN5c19uZXd1bmFtZSwgMSkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCi1TWVNDQUxMKHN5c19hZGp0aW1leCwgMSkKLVNZU0NBTEwoc3lzX21wcm90ZWN0LCAzKQkJLyogMTI1ICovCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAzKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMikKLVNZU0NBTEwoc3lzX2luaXRfbW9kdWxlLCAyKQotU1lTQ0FMTChzeXNfZGVsZXRlX21vZHVsZSwgMSkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCQkvKiAxMzAgKi8KLVNZU0NBTEwoc3lzX3F1b3RhY3RsLCAwKQotU1lTQ0FMTChzeXNfZ2V0cGdpZCwgMSkKLVNZU0NBTEwoc3lzX2ZjaGRpciwgMSkKLVNZU0NBTEwoc3lzX2JkZmx1c2gsIDIpCi1TWVNDQUxMKHN5c19zeXNmcywgMykJCQkvKiAxMzUgKi8KLVNZU0NBTEwoc3lzX3BlcnNvbmFsaXR5LCAxKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKLVNZU0NBTEwoc3lzX3NldGZzdWlkLCAxKQotU1lTQ0FMTChzeXNfc2V0ZnNnaWQsIDEpCi1TWVNDQUxMKHN5c19sbHNlZWssIDUpCQkJLyogMTQwICovCi1TWVNDQUxMKHN5c19nZXRkZW50cywgMykKLVNZU0NBTEwoc3lzX3NlbGVjdCwgNSkKLVNZU0NBTEwoc3lzX2Zsb2NrLCAyKQotU1lTQ0FMTChzeXNfbXN5bmMsIDMpCi1TWVNDQUxMKHN5c19yZWFkdiwgMykJCQkvKiAxNDUgKi8KLVNZU0NBTEwoc3lzX3dyaXRldiwgMykKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDMpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAzKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgNCkJCS8qIGhhbmRsZWQgaW4gZmFzdCBzeXNjYWxsIGhhbmRsZXIuICovCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQkJLyogMTUwICovCi1TWVNDQUxMKHN5c19nZXRzaWQsIDEpCi1TWVNDQUxMKHN5c19mZGF0YXN5bmMsIDEpCi1TWVNDQUxMKHN5c19zeXNjdGwsIDEpCi1TWVNDQUxMKHN5c19tbG9jaywgMikKLVNZU0NBTEwoc3lzX211bmxvY2ssIDIpCQkJLyogMTU1ICovCi1TWVNDQUxMKHN5c19tbG9ja2FsbCwgMSkKLVNZU0NBTEwoc3lzX211bmxvY2thbGwsIDApCi1TWVNDQUxMKHN5c19zY2hlZF9zZXRwYXJhbSwyKQotU1lTQ0FMTChzeXNfc2NoZWRfZ2V0cGFyYW0sMikKLVNZU0NBTEwoc3lzX3NjaGVkX3NldHNjaGVkdWxlciwzKQkvKiAxNjAgKi8KLVNZU0NBTEwoc3lzX3NjaGVkX2dldHNjaGVkdWxlciwxKQotU1lTQ0FMTChzeXNfc2NoZWRfeWllbGQsMCkKLVNZU0NBTEwoc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsMSkKLVNZU0NBTEwoc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4sMSkKLVNZU0NBTEwoc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCwyKQkvKiAxNjUgKi8KLVNZU0NBTEwoc3lzX25hbm9zbGVlcCwyKQotU1lTQ0FMTChzeXNfbXJlbWFwLDQpCi1TWVNDQUxMKHN5c19hY2NlcHQsIDMpCi1TWVNDQUxMKHN5c19iaW5kLCAzKQotU1lTQ0FMTChzeXNfY29ubmVjdCwgMykJCQkvKiAxNzAgKi8KLVNZU0NBTEwoc3lzX2dldHBlZXJuYW1lLCAzKQotU1lTQ0FMTChzeXNfZ2V0c29ja25hbWUsIDMpCi1TWVNDQUxMKHN5c19nZXRzb2Nrb3B0LCA1KQotU1lTQ0FMTChzeXNfbGlzdGVuLCAyKQotU1lTQ0FMTChzeXNfcmVjdiwgNCkJCQkvKiAxNzUgKi8KLVNZU0NBTEwoc3lzX3JlY3Zmcm9tLCA2KQotU1lTQ0FMTChzeXNfcmVjdm1zZywgMykKLVNZU0NBTEwoc3lzX3NlbmQsIDQpCi1TWVNDQUxMKHN5c19zZW5kbXNnLCAzKQotU1lTQ0FMTChzeXNfc2VuZHRvLCA2KQkJCS8qIDE4MCAqLwotU1lTQ0FMTChzeXNfc2V0c29ja29wdCwgNSkKLVNZU0NBTEwoc3lzX3NodXRkb3duLCAyKQotU1lTQ0FMTChzeXNfc29ja2V0LCAzKQotU1lTQ0FMTChzeXNfc29ja2V0cGFpciwgNCkKLVNZU0NBTEwoc3lzX3NldHJlc3VpZCwgMykJCS8qIDE4NSAqLwotU1lTQ0FMTChzeXNfZ2V0cmVzdWlkLCAzKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgNSkKLVNZU0NBTEwoc3lzX3BvbGwsIDMpCi1TWVNDQUxMKHN5c19uZnNzZXJ2Y3RsLCAzKQotU1lTQ0FMTChzeXNfc2V0cmVzZ2lkLCAzKQkJLyogMTkwICovCi1TWVNDQUxMKHN5c19nZXRyZXNnaWQsIDMpCi1TWVNDQUxMKHN5c19wcmN0bCwgNSkKLVNZU0NBTEwoc3lzX3J0X3NpZ3JldHVybiwgMCkKLVNZU0NBTEwoc3lzX3J0X3NpZ2FjdGlvbiwgNCkKLVNZU0NBTEwoc3lzX3J0X3NpZ3Byb2NtYXNrLCA0KQkJLyogMTk1ICovCi1TWVNDQUxMKHN5c19ydF9zaWdwZW5kaW5nLCAyKQotU1lTQ0FMTChzeXNfcnRfc2lndGltZWR3YWl0LCA0KQotU1lTQ0FMTChzeXNfcnRfc2lncXVldWVpbmZvLCAzKQotU1lTQ0FMTChzeXNfcnRfc2lnc3VzcGVuZCwgMCkKLVNZU0NBTEwoc3lzX3ByZWFkNjQsIDUpCQkJLyogMjAwICovCi1TWVNDQUxMKHN5c19wd3JpdGU2NCwgNSkKLVNZU0NBTEwoc3lzX2Nob3duLCAzKQotU1lTQ0FMTChzeXNfZ2V0Y3dkLCAyKQotU1lTQ0FMTChzeXNfY2FwZ2V0LCAyKQotU1lTQ0FMTChzeXNfY2Fwc2V0LCAyKQkJCS8qIDIwNSAqLwotU1lTQ0FMTChzeXNfc2lnYWx0c3RhY2ssIDApCi1TWVNDQUxMKHN5c19zZW5kZmlsZSwgNCkKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQotU1lTQ0FMTChzeXNfbW1hcCwgNikJCQkvKiAyMTAgKi8KLVNZU0NBTEwoc3lzX3RydW5jYXRlNjQsIDIpCi1TWVNDQUxMKHN5c19mdHJ1bmNhdGU2NCwgMikKLVNZU0NBTEwoc3lzX3N0YXQ2NCwgMikKLVNZU0NBTEwoc3lzX2xzdGF0NjQsIDIpCi1TWVNDQUxMKHN5c19mc3RhdDY0LCAyKQkJCS8qIDIxNSAqLwotU1lTQ0FMTChzeXNfcGl2b3Rfcm9vdCwgMikKLVNZU0NBTEwoc3lzX21pbmNvcmUsIDMpCi1TWVNDQUxMKHN5c19tYWR2aXNlLCAzKQotU1lTQ0FMTChzeXNfZ2V0ZGVudHM2NCwgMykKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCQkvKiAyMjAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCmluZGV4IDM3MzQ3ZTMuLmEzNTA0MzEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYwpAQCAtNDcsNyArNDcsNyBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKWppZmZpZXMgKiAoMTAwMDAwMDAwMCAvIEhaKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHRpbWVyX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CXRpbWVyX2ludGVycnVwdCwKIAkuZmxhZ3MgPQlJUlFGX0RJU0FCTEVELApAQCAtMTUwLDcgKzE1MCw3IEBACiAgKiBUaGUgdGltZXIgaW50ZXJydXB0IGlzIGNhbGxlZCBIWiB0aW1lcyBwZXIgc2Vjb25kLgogICovCiAKLWlycXJldHVybl90IHRpbWVyX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2lycXJldHVybl90IHRpbWVyX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCiAJdW5zaWduZWQgbG9uZyBuZXh0OwpAQCAtMTYwLDkgKzE2MCw5IEBACiBhZ2FpbjoKIAl3aGlsZSAoKHNpZ25lZCBsb25nKShnZXRfY2NvdW50KCkgLSBuZXh0KSA+IDApIHsKIAotCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CisJCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKICNpZm5kZWYgQ09ORklHX1NNUAotCQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUocmVncykpOworCQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKICNlbmRpZgogCiAJCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwppbmRleCBjZTA3N2Q2Li42OTNhYjI2IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwpAQCAtNzUsNyArNzUsNyBAQAogI2RlZmluZSBVU0VSCQkweDAyCiAKICNkZWZpbmUgQ09QUk9DRVNTT1IoeCkJCQkJCQkJXAoteyBYQ0hBTF9FWENDQVVTRV9DT1BST0NFU1NPUiAjIyB4ICMjIF9ESVNBQkxFRCwgVVNFUiwgZmFzdF9jb3Byb2Nlc3NvciB9Cit7IEVYQ0NBVVNFX0NPUFJPQ0VTU09SICMjIHggIyMgX0RJU0FCTEVELCBVU0VSLCBmYXN0X2NvcHJvY2Vzc29yIH0KIAogdHlwZWRlZiBzdHJ1Y3QgewogCWludCBjYXVzZTsKQEAgLTg1LDM4ICs4NSwzOCBAQAogCiBkaXNwYXRjaF9pbml0X3RhYmxlX3QgX19pbml0IGRpc3BhdGNoX2luaXRfdGFibGVbXSA9IHsKIAoteyBYQ0hBTF9FWENDQVVTRV9JTExFR0FMX0lOU1RSVUNUSU9OLAkwLAkgICBkb19pbGxlZ2FsX2luc3RydWN0aW9ufSwKLXsgWENIQUxfRVhDQ0FVU0VfU1lTVEVNX0NBTEwsCQlLUk5MLAkgICBmYXN0X3N5c2NhbGxfa2VybmVsIH0sCi17IFhDSEFMX0VYQ0NBVVNFX1NZU1RFTV9DQUxMLAkJVVNFUiwJICAgZmFzdF9zeXNjYWxsX3VzZXIgfSwKLXsgWENIQUxfRVhDQ0FVU0VfU1lTVEVNX0NBTEwsCQkwLAkgICBzeXN0ZW1fY2FsbCB9LAotLyogWENIQUxfRVhDQ0FVU0VfSU5TVFJVQ1RJT05fRkVUQ0ggdW5oYW5kbGVkICovCi0vKiBYQ0hBTF9FWENDQVVTRV9MT0FEX1NUT1JFX0VSUk9SIHVuaGFuZGxlZCovCi17IFhDSEFMX0VYQ0NBVVNFX0xFVkVMMV9JTlRFUlJVUFQsCTAsCSAgIGRvX2ludGVycnVwdCB9LAoteyBYQ0hBTF9FWENDQVVTRV9BTExPQ0EsCQlVU0VSfEtSTkwsIGZhc3RfYWxsb2NhIH0sCi0vKiBYQ0hBTF9FWENDQVVTRV9JTlRFR0VSX0RJVklERV9CWV9aRVJPIHVuaGFuZGxlZCAqLwotLyogWENIQUxfRVhDQ0FVU0VfUFJJVklMRUdFRCB1bmhhbmRsZWQgKi8KK3sgRVhDQ0FVU0VfSUxMRUdBTF9JTlNUUlVDVElPTiwJMCwJICAgZG9faWxsZWdhbF9pbnN0cnVjdGlvbn0sCit7IEVYQ0NBVVNFX1NZU1RFTV9DQUxMLAkJS1JOTCwJICAgZmFzdF9zeXNjYWxsX2tlcm5lbCB9LAoreyBFWENDQVVTRV9TWVNURU1fQ0FMTCwJCVVTRVIsCSAgIGZhc3Rfc3lzY2FsbF91c2VyIH0sCit7IEVYQ0NBVVNFX1NZU1RFTV9DQUxMLAkJMCwJICAgc3lzdGVtX2NhbGwgfSwKKy8qIEVYQ0NBVVNFX0lOU1RSVUNUSU9OX0ZFVENIIHVuaGFuZGxlZCAqLworLyogRVhDQ0FVU0VfTE9BRF9TVE9SRV9FUlJPUiB1bmhhbmRsZWQqLworeyBFWENDQVVTRV9MRVZFTDFfSU5URVJSVVBULAkwLAkgICBkb19pbnRlcnJ1cHQgfSwKK3sgRVhDQ0FVU0VfQUxMT0NBLAkJVVNFUnxLUk5MLCBmYXN0X2FsbG9jYSB9LAorLyogRVhDQ0FVU0VfSU5URUdFUl9ESVZJREVfQllfWkVSTyB1bmhhbmRsZWQgKi8KKy8qIEVYQ0NBVVNFX1BSSVZJTEVHRUQgdW5oYW5kbGVkICovCiAjaWYgWENIQUxfVU5BTElHTkVEX0xPQURfRVhDRVBUSU9OIHx8IFhDSEFMX1VOQUxJR05FRF9TVE9SRV9FWENFUFRJT04KICNpZmRlZiBDT05GSUdfVU5BTElHTkVEX1VTRVIKLXsgWENIQUxfRVhDQ0FVU0VfVU5BTElHTkVELAkJVVNFUiwJICAgZmFzdF91bmFsaWduZWQgfSwKK3sgRVhDQ0FVU0VfVU5BTElHTkVELAkJVVNFUiwJICAgZmFzdF91bmFsaWduZWQgfSwKICNlbHNlCi17IFhDSEFMX0VYQ0NBVVNFX1VOQUxJR05FRCwJCTAsCSAgIGRvX3VuYWxpZ25lZF91c2VyIH0sCit7IEVYQ0NBVVNFX1VOQUxJR05FRCwJCTAsCSAgIGRvX3VuYWxpZ25lZF91c2VyIH0sCiAjZW5kaWYKLXsgWENIQUxfRVhDQ0FVU0VfVU5BTElHTkVELAkJS1JOTCwJICAgZmFzdF91bmFsaWduZWQgfSwKK3sgRVhDQ0FVU0VfVU5BTElHTkVELAkJS1JOTCwJICAgZmFzdF91bmFsaWduZWQgfSwKICNlbmRpZgoteyBYQ0hBTF9FWENDQVVTRV9JVExCX01JU1MsCQkwLAkgICBkb19wYWdlX2ZhdWx0IH0sCi17IFhDSEFMX0VYQ0NBVVNFX0lUTEJfTUlTUywJCVVTRVJ8S1JOTCwgZmFzdF9zZWNvbmRfbGV2ZWxfbWlzc30sCi17IFhDSEFMX0VYQ0NBVVNFX0lUTEJfTVVMVElISVQsCQkwLAkgICBkb19tdWx0aWhpdCB9LAoteyBYQ0hBTF9FWENDQVVTRV9JVExCX1BSSVZJTEVHRSwJMCwJICAgZG9fcGFnZV9mYXVsdCB9LAotLyogWENIQUxfRVhDQ0FVU0VfU0laRV9SRVNUUklDVElPTiB1bmhhbmRsZWQgKi8KLXsgWENIQUxfRVhDQ0FVU0VfRkVUQ0hfQ0FDSEVfQVRUUklCVVRFLAkwLAkgICBkb19wYWdlX2ZhdWx0IH0sCi17IFhDSEFMX0VYQ0NBVVNFX0RUTEJfTUlTUywJCVVTRVJ8S1JOTCwgZmFzdF9zZWNvbmRfbGV2ZWxfbWlzc30sCi17IFhDSEFMX0VYQ0NBVVNFX0RUTEJfTUlTUywJCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKLXsgWENIQUxfRVhDQ0FVU0VfRFRMQl9NVUxUSUhJVCwJCTAsCSAgIGRvX211bHRpaGl0IH0sCi17IFhDSEFMX0VYQ0NBVVNFX0RUTEJfUFJJVklMRUdFLAkwLAkgICBkb19wYWdlX2ZhdWx0IH0sCi0vKiBYQ0hBTF9FWENDQVVTRV9EVExCX1NJWkVfUkVTVFJJQ1RJT04gdW5oYW5kbGVkICovCi17IFhDSEFMX0VYQ0NBVVNFX1NUT1JFX0NBQ0hFX0FUVFJJQlVURSwJVVNFUnxLUk5MLCBmYXN0X3N0b3JlX3Byb2hpYml0ZWQgfSwKLXsgWENIQUxfRVhDQ0FVU0VfU1RPUkVfQ0FDSEVfQVRUUklCVVRFLAkwLAkgICBkb19wYWdlX2ZhdWx0IH0sCi17IFhDSEFMX0VYQ0NBVVNFX0xPQURfQ0FDSEVfQVRUUklCVVRFLAkwLAkgICBkb19wYWdlX2ZhdWx0IH0sCit7IEVYQ0NBVVNFX0lUTEJfTUlTUywJCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKK3sgRVhDQ0FVU0VfSVRMQl9NSVNTLAkJVVNFUnxLUk5MLCBmYXN0X3NlY29uZF9sZXZlbF9taXNzfSwKK3sgRVhDQ0FVU0VfSVRMQl9NVUxUSUhJVCwJCTAsCSAgIGRvX211bHRpaGl0IH0sCit7IEVYQ0NBVVNFX0lUTEJfUFJJVklMRUdFLAkwLAkgICBkb19wYWdlX2ZhdWx0IH0sCisvKiBFWENDQVVTRV9TSVpFX1JFU1RSSUNUSU9OIHVuaGFuZGxlZCAqLworeyBFWENDQVVTRV9GRVRDSF9DQUNIRV9BVFRSSUJVVEUsCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKK3sgRVhDQ0FVU0VfRFRMQl9NSVNTLAkJVVNFUnxLUk5MLCBmYXN0X3NlY29uZF9sZXZlbF9taXNzfSwKK3sgRVhDQ0FVU0VfRFRMQl9NSVNTLAkJMCwJICAgZG9fcGFnZV9mYXVsdCB9LAoreyBFWENDQVVTRV9EVExCX01VTFRJSElULAkJMCwJICAgZG9fbXVsdGloaXQgfSwKK3sgRVhDQ0FVU0VfRFRMQl9QUklWSUxFR0UsCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKKy8qIEVYQ0NBVVNFX0RUTEJfU0laRV9SRVNUUklDVElPTiB1bmhhbmRsZWQgKi8KK3sgRVhDQ0FVU0VfU1RPUkVfQ0FDSEVfQVRUUklCVVRFLAlVU0VSfEtSTkwsIGZhc3Rfc3RvcmVfcHJvaGliaXRlZCB9LAoreyBFWENDQVVTRV9TVE9SRV9DQUNIRV9BVFRSSUJVVEUsCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKK3sgRVhDQ0FVU0VfTE9BRF9DQUNIRV9BVFRSSUJVVEUsCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKIC8qIFhDQ0hBTF9FWENDQVVTRV9GTE9BVElOR19QT0lOVCB1bmhhbmRsZWQgKi8KICNpZiAoWENIQUxfQ1BfTUFTSyAmIDEpCiBDT1BST0NFU1NPUigwKSwKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC92ZWN0b3JzLlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdmVjdG9ycy5TCmluZGV4IDBlNzQzOTcuLmViMmQ3YmIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC92ZWN0b3JzLlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZlY3RvcnMuUwpAQCAtNTMsNiArNTMsOCBAQAogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAorI2RlZmluZSBXSU5ET1dfVkVDVE9SU19TSVpFICAgMHgxODAKKwogCiAvKgogICogVXNlciBleGNlcHRpb24gdmVjdG9yLiAoRXhjZXB0aW9ucyB3aXRoIFBTLlVNID09IDEsIFBTLkVYQ00gPT0gMCkKQEAgLTIxMCw3ICsyMTIsNyBAQAogCS8qIENoZWNrIGZvciBrZXJuZWwgZG91YmxlIGV4Y2VwdGlvbiAodXN1YWxseSBmYXRhbCkuICovCiAKIAlyc3IJYTMsIFBTCi0JX2JiY2kubAlhMywgUFNfVU1fU0hJRlQsIC5Ma3NwCisJX2JiY2kubAlhMywgUFNfVU1fQklULCAuTGtzcAogCiAJLyogQ2hlY2sgaWYgd2UgYXJlIGN1cnJlbnRseSBoYW5kbGluZyBhIHdpbmRvdyBleGNlcHRpb24uICovCiAJLyogTm90ZTogV2UgZG9uJ3QgbmVlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGVudGVyIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KQEAgLTIxOSw3ICsyMjEsNyBAQAogCiAJbW92aQlhMywgWENIQUxfV0lORE9XX1ZFQ1RPUlNfVkFERFIKIAlfYmx0dQlhMCwgYTMsIC5MZml4dXAKLQlhZGRpCWEzLCBhMywgWFNIQUxfV0lORE9XX1ZFQ1RPUlNfU0laRQorCWFkZGkJYTMsIGEzLCBXSU5ET1dfVkVDVE9SU19TSVpFCiAJX2JnZXUJYTAsIGEzLCAuTGZpeHVwCiAKIAkvKiBXaW5kb3cgb3ZlcmZsb3cvdW5kZXJmbG93IGV4Y2VwdGlvbi4gR2V0IHN0YWNrIHBvaW50ZXIuICovCkBAIC0yNDUsNyArMjQ3LDcgQEAKIAogCXdzcglhMiwgREVQQwkJIyBzYXZlIHN0YWNrIHBvaW50ZXIgdGVtcG9yYXJpbHkKIAlyc3IJYTAsIFBTCi0JZXh0dWkJYTAsIGEwLCBYQ0hBTF9QU19PV0JfU0hJRlQsIFhDSEFMX1BTX09XQl9CSVRTCisJZXh0dWkJYTAsIGEwLCBQU19PV0JfU0hJRlQsIDQKIAl3c3IJYTAsIFdJTkRPV0JBU0UKIAlyc3luYwogCkBAIC0zMTIsOCArMzE0LDggQEAKIC5Ma3NwOgkvKiBhMDogYTAsIGExOiBhMSwgYTI6IGEyLCBhMzogdHJhc2hlZCwgZGVwYzogZGVwYywgZXhjc2F2ZTogYTMgKi8KIAogCXJzcglhMywgRVhDQ0FVU0UKLQliZXFpCWEzLCBYQ0hBTF9FWENDQVVTRV9JVExCX01JU1MsIDFmCi0JYWRkaQlhMywgYTMsIC1YQ0hBTF9FWENDQVVTRV9EVExCX01JU1MKKwliZXFpCWEzLCBFWENDQVVTRV9JVExCX01JU1MsIDFmCisJYWRkaQlhMywgYTMsIC1FWENDQVVTRV9EVExCX01JU1MKIAlibmV6CWEzLCAuTHVucmVjb3ZlcmFibGUKIDE6CW1vdmkJYTMsIGZhc3Rfc2Vjb25kX2xldmVsX21pc3NfZG91YmxlX2tlcm5lbAogCWp4CWEzCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGFiNmNkYmQuLmEzNmMxMDQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xNiwxOSArMTYsMTcgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CiAKLSNkZWZpbmUgX05PQ0xBTkdVQUdFCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+Ci0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CiBPVVRQVVRfQVJDSCh4dGVuc2EpCiBFTlRSWShfc3RhcnQpCiAKLSNpZiBYQ0hBTF9NRU1PUllfT1JERVIgPT0gWFRIQUxfQklHRU5ESUFOCisjaWZkZWYgX19YVEVOU0FfRUJfXwogamlmZmllcyA9IGppZmZpZXNfNjQgKyA0OwogI2Vsc2UKIGppZmZpZXMgPSBqaWZmaWVzXzY0OwogI2VuZGlmCiAKLSNkZWZpbmUgS0VSTkVMT0ZGU0VUIDB4MTAwMAorI2RlZmluZSBLRVJORUxPRkZTRVQgMHhkMDAwMTAwMAogCiAvKiBOb3RlOiBJbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgaXQgd291bGQgYmUgbmljZSB0byBzcGVjaWZ5IG9ubHkgdGhlCiAgICB2ZWN0b3IgbmFtZSBhbmQgc2VjdGlvbiBraW5kIGFuZCBjb25zdHJ1Y3QgInN5bSIgYW5kICJzZWN0aW9uIiB1c2luZwpAQCAtNzUsNyArNzMsNyBAQAogCiBTRUNUSU9OUwogewotICAuID0gWENIQUxfS1NFR19DQUNIRURfVkFERFIgKyBLRVJORUxPRkZTRVQ7CisgIC4gPSBLRVJORUxPRkZTRVQ7CiAgIC8qIC50ZXh0IHNlY3Rpb24gKi8KIAogICBfdGV4dCA9IC47CkBAIC0xNTksNyArMTU3LDcgQEAKIAogICAvKiBJbml0aWFsaXphdGlvbiBjb2RlIGFuZCBkYXRhOiAqLwogCi0gIC4gPSBBTElHTigxPDxYQ0hBTF9NTVVfTUlOX1BURV9QQUdFX1NJWkUpOworICAuID0gQUxJR04oMSA8PCAxMik7CiAgIF9faW5pdF9iZWdpbiA9IC47CiAgIC5pbml0LnRleHQgOiB7CiAgIAlfc2luaXR0ZXh0ID0gLjsKQEAgLTE4NCwxMyArMTgyLDcgQEAKIAogICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKICAgLmluaXRjYWxsLmluaXQgOiB7Ci0gIAkqKC5pbml0Y2FsbDEuaW5pdCkKLSAgCSooLmluaXRjYWxsMi5pbml0KQotICAJKiguaW5pdGNhbGwzLmluaXQpCi0gIAkqKC5pbml0Y2FsbDQuaW5pdCkKLSAgCSooLmluaXRjYWxsNS5pbml0KQotICAJKiguaW5pdGNhbGw2LmluaXQpCi0gIAkqKC5pbml0Y2FsbDcuaW5pdCkKKwlJTklUQ0FMTFMKICAgfQogICBfX2luaXRjYWxsX2VuZCA9IC47CiAKQEAgLTIyOSwzMiArMjIxLDMyIEBACiAJCSAgLmR1bW15KQogICBTRUNUSU9OX1ZFQ1RPUiAoX0RlYnVnSW50ZXJydXB0VmVjdG9yX2xpdGVyYWwsCiAJCSAgLkRlYnVnSW50ZXJydXB0VmVjdG9yLmxpdGVyYWwsCi0JCSAgWENIQUxfSU5UTEVWRUxfVkVDVE9SX1ZBRERSKFhDSEFMX0RFQlVHTEVWRUwpIC0gNCwKKwkJICBYQ0hBTF9ERUJVR19WRUNUT1JfVkFERFIgLSA0LAogCQkgIFNJWkVPRiguV2luZG93VmVjdG9ycy50ZXh0KSwKIAkJICAuV2luZG93VmVjdG9ycy50ZXh0KQogICBTRUNUSU9OX1ZFQ1RPUiAoX0RlYnVnSW50ZXJydXB0VmVjdG9yX3RleHQsCiAJCSAgLkRlYnVnSW50ZXJydXB0VmVjdG9yLnRleHQsCi0JCSAgWENIQUxfSU5UTEVWRUxfVkVDVE9SX1ZBRERSKFhDSEFMX0RFQlVHTEVWRUwpLAorCQkgIFhDSEFMX0RFQlVHX1ZFQ1RPUl9WQUREUiwKIAkJICA0LAogCQkgIC5EZWJ1Z0ludGVycnVwdFZlY3Rvci5saXRlcmFsKQogICBTRUNUSU9OX1ZFQ1RPUiAoX0tlcm5lbEV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsLAogCQkgIC5LZXJuZWxFeGNlcHRpb25WZWN0b3IubGl0ZXJhbCwKLQkJICBYQ0hBTF9LRVJORUxFWENfVkVDVE9SX1ZBRERSIC0gNCwKKwkJICBYQ0hBTF9LRVJORUxfVkVDVE9SX1ZBRERSIC0gNCwKIAkJICBTSVpFT0YoLkRlYnVnSW50ZXJydXB0VmVjdG9yLnRleHQpLAogCQkgIC5EZWJ1Z0ludGVycnVwdFZlY3Rvci50ZXh0KQogICBTRUNUSU9OX1ZFQ1RPUiAoX0tlcm5lbEV4Y2VwdGlvblZlY3Rvcl90ZXh0LAogCQkgIC5LZXJuZWxFeGNlcHRpb25WZWN0b3IudGV4dCwKLQkJICBYQ0hBTF9LRVJORUxFWENfVkVDVE9SX1ZBRERSLAorCQkgIFhDSEFMX0tFUk5FTF9WRUNUT1JfVkFERFIsCiAJCSAgNCwKIAkJICAuS2VybmVsRXhjZXB0aW9uVmVjdG9yLmxpdGVyYWwpCiAgIFNFQ1RJT05fVkVDVE9SIChfVXNlckV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsLAogCQkgIC5Vc2VyRXhjZXB0aW9uVmVjdG9yLmxpdGVyYWwsCi0JCSAgWENIQUxfVVNFUkVYQ19WRUNUT1JfVkFERFIgLSA0LAorCQkgIFhDSEFMX1VTRVJfVkVDVE9SX1ZBRERSIC0gNCwKIAkJICBTSVpFT0YoLktlcm5lbEV4Y2VwdGlvblZlY3Rvci50ZXh0KSwKIAkJICAuS2VybmVsRXhjZXB0aW9uVmVjdG9yLnRleHQpCiAgIFNFQ1RJT05fVkVDVE9SIChfVXNlckV4Y2VwdGlvblZlY3Rvcl90ZXh0LAogCQkgIC5Vc2VyRXhjZXB0aW9uVmVjdG9yLnRleHQsCi0JCSAgWENIQUxfVVNFUkVYQ19WRUNUT1JfVkFERFIsCisJCSAgWENIQUxfVVNFUl9WRUNUT1JfVkFERFIsCiAJCSAgNCwKIAkJICAuVXNlckV4Y2VwdGlvblZlY3Rvci5saXRlcmFsKQogICBTRUNUSU9OX1ZFQ1RPUiAoX0RvdWJsZUV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsLApAQCAtMjY5LDcgKzI2MSw3IEBACiAJCSAgLkRvdWJsZUV4Y2VwdGlvblZlY3Rvci5saXRlcmFsKQogCiAgIC4gPSAoTE9BREFERFIoIC5Eb3VibGVFeGNlcHRpb25WZWN0b3IudGV4dCApICsgU0laRU9GKCAuRG91YmxlRXhjZXB0aW9uVmVjdG9yLnRleHQgKSArIDMpICYgfiAzOwotICAuID0gQUxJR04oMTw8WENIQUxfTU1VX01JTl9QVEVfUEFHRV9TSVpFKTsKKyAgLiA9IEFMSUdOKDEgPDwgMTIpOwogCiAgIF9faW5pdF9lbmQgPSAuOwogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvY2hlY2tzdW0uUyBiL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TCmluZGV4IGUyZDY0ZGYuLjlkOWNkOTkgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TCisrKyBiL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TCkBAIC0xNiw4ICsxNiw3IEBACiAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jZGVmaW5lIF9BU01MQU5HVUFHRQotI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgorI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KIAogLyoKICAqIGNvbXB1dGVzIGEgcGFydGlhbCBjaGVja3N1bSwgZS5nLiBmb3IgVENQL1VEUCBmcmFnbWVudHMKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9tZW1jb3B5LlMgYi9hcmNoL3h0ZW5zYS9saWIvbWVtY29weS5TCmluZGV4IGU4ZjZkN2UuLmRkZGE4ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9tZW1jb3B5LlMKKysrIGIvYXJjaC94dGVuc2EvbGliL21lbWNvcHkuUwpAQCAtOSw3ICs5LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDUgVGVuc2lsaWNhIEluYy4KICAqLwogCi0jaW5jbHVkZSA8eHRlbnNhL2NvcmVhc20uaD4KKyNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CiAKIAkubWFjcm8Jc3JjX2IJciwgdzAsIHcxCiAjaWZkZWYgX19YVEVOU0FfRUJfXwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL21lbXNldC5TIGIvYXJjaC94dGVuc2EvbGliL21lbXNldC5TCmluZGV4IDRkZTI1MTMuLjU2YTE3NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9tZW1zZXQuUworKysgYi9hcmNoL3h0ZW5zYS9saWIvbWVtc2V0LlMKQEAgLTExLDcgKzExLDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KICAqLwogCi0jaW5jbHVkZSA8eHRlbnNhL2NvcmVhc20uaD4KKyNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CiAKIC8qCiAgKiB2b2lkICptZW1zZXQodm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IGxlbmd0aCkKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9zdHJuY3B5X3VzZXIuUyBiL2FyY2gveHRlbnNhL2xpYi9zdHJuY3B5X3VzZXIuUwppbmRleCA3MWQ1NWRmLi5hODM0MDU3IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMKKysrIGIvYXJjaC94dGVuc2EvbGliL3N0cm5jcHlfdXNlci5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCiAgKi8KIAotI2luY2x1ZGUgPHh0ZW5zYS9jb3JlYXNtLmg+CisjaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKIC8qIExvYWQgb3Igc3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5IGNhdXNlIGV4Y2VwdGlvbnMgdXNlIHRoZSBFWCBtYWNyby4gKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUyBiL2FyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUwppbmRleCBjZGZmNGQ2Li41ZTljMWU3IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvc3Rybmxlbl91c2VyLlMKKysrIGIvYXJjaC94dGVuc2EvbGliL3N0cm5sZW5fdXNlci5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCiAgKi8KIAotI2luY2x1ZGUgPHh0ZW5zYS9jb3JlYXNtLmg+CisjaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgogCiAvKiBMb2FkIG9yIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBjYXVzZSBleGNlcHRpb25zIHVzZSB0aGUgRVggbWFjcm8uICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi91c2VyY29weS5TIGIvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMKaW5kZXggNDY0MWVmNS4uYThhYjFkNCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMKKysrIGIvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMKQEAgLTUzLDcgKzUzLDcgQEAKICAqCWExMS8gb3JpZ2luYWwgbGVuZ3RoCiAgKi8KIAotI2luY2x1ZGUgPHh0ZW5zYS9jb3JlYXNtLmg+CisjaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgogCiAjaWZkZWYgX19YVEVOU0FfRUJfXwogI2RlZmluZSBBTElHTihSLCBXMCwgVzEpIHNyYwlSLCBXMCwgVzEKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL21tL2ZhdWx0LmMgYi9hcmNoL3h0ZW5zYS9tbS9mYXVsdC5jCmluZGV4IGRkMGRiZWMuLjNkYzZmMmYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL21tL2ZhdWx0LmMKKysrIGIvYXJjaC94dGVuc2EvbW0vZmF1bHQuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogCi11bnNpZ25lZCBsb25nIGFzaWRfY2FjaGUgPSBBU0lEX0ZJUlNUX1ZFUlNJT047Cit1bnNpZ25lZCBsb25nIGFzaWRfY2FjaGUgPSBBU0lEX1VTRVJfRklSU1Q7CiB2b2lkIGJhZF9wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzKiwgdW5zaWduZWQgbG9uZywgaW50KTsKIAogLyoKQEAgLTU4LDEwICs1OCwxMCBAQAogCQlyZXR1cm47CiAJfQogCi0JaXNfd3JpdGUgPSAoZXhjY2F1c2UgPT0gWENIQUxfRVhDQ0FVU0VfU1RPUkVfQ0FDSEVfQVRUUklCVVRFKSA/IDEgOiAwOwotCWlzX2V4ZWMgPSAgKGV4Y2NhdXNlID09IFhDSEFMX0VYQ0NBVVNFX0lUTEJfUFJJVklMRUdFIHx8Ci0JCSAgICBleGNjYXVzZSA9PSBYQ0hBTF9FWENDQVVTRV9JVExCX01JU1MgfHwKLQkJICAgIGV4Y2NhdXNlID09IFhDSEFMX0VYQ0NBVVNFX0ZFVENIX0NBQ0hFX0FUVFJJQlVURSkgPyAxIDogMDsKKwlpc193cml0ZSA9IChleGNjYXVzZSA9PSBFWENDQVVTRV9TVE9SRV9DQUNIRV9BVFRSSUJVVEUpID8gMSA6IDA7CisJaXNfZXhlYyA9ICAoZXhjY2F1c2UgPT0gRVhDQ0FVU0VfSVRMQl9QUklWSUxFR0UgfHwKKwkJICAgIGV4Y2NhdXNlID09IEVYQ0NBVVNFX0lUTEJfTUlTUyB8fAorCQkgICAgZXhjY2F1c2UgPT0gRVhDQ0FVU0VfRkVUQ0hfQ0FDSEVfQVRUUklCVVRFKSA/IDEgOiAwOwogCiAjaWYgMAogCXByaW50aygiWyVzOiVkOiUwOHg6JWQ6JTA4eDolcyVzXVxuIiwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbW0vaW5pdC5jIGIvYXJjaC94dGVuc2EvbW0vaW5pdC5jCmluZGV4IDY2MGVmMDUuLmUxZWMyZDEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL21tL2luaXQuYworKysgYi9hcmNoL3h0ZW5zYS9tbS9pbml0LmMKQEAgLTE0MSw4ICsxNDEsOCBAQAogCWlmIChtaW5fbG93X3BmbiA+IG1heF9wZm4pCiAJCXBhbmljKCJObyBtZW1vcnkgZm91bmQhXG4iKTsKIAotCW1heF9sb3dfcGZuID0gbWF4X3BmbiA8IE1BWF9MT1dfTUVNT1JZID4+IFBBR0VfU0hJRlQgPwotCQltYXhfcGZuIDogTUFYX0xPV19NRU1PUlkgPj4gUEFHRV9TSElGVDsKKwltYXhfbG93X3BmbiA9IG1heF9wZm4gPCBNQVhfTUVNX1BGTiA+PiBQQUdFX1NISUZUID8KKwkJbWF4X3BmbiA6IE1BWF9NRU1fUEZOID4+IFBBR0VfU0hJRlQ7CiAKIAkvKiBGaW5kIGFuIGFyZWEgdG8gdXNlIGZvciB0aGUgYm9vdG1lbSBiaXRtYXAuICovCiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogCiAJLyogU2V0IHJhc2lkIHJlZ2lzdGVyIHRvIGEga25vd24gdmFsdWUuICovCiAKLQlzZXRfcmFzaWRfcmVnaXN0ZXIgKEFTSURfQUxMX1JFU0VSVkVEKTsKKwlzZXRfcmFzaWRfcmVnaXN0ZXIgKEFTSURfVVNFUl9GSVJTVCk7CiAKIAkvKiBTZXQgUFRFVkFERFIgc3BlY2lhbCByZWdpc3RlciB0byB0aGUgc3RhcnQgb2YgdGhlIHBhZ2UKIAkgKiB0YWJsZSwgd2hpY2ggaXMgaW4ga2VybmVsIG1hcHBhYmxlIHNwYWNlIChpZS4gbm90CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9tbS9taXNjLlMgYi9hcmNoL3h0ZW5zYS9tbS9taXNjLlMKaW5kZXggMzI3YzBmMS4uYWUwODUzMyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvbW0vbWlzYy5TCisrKyBiL2FyY2gveHRlbnNhL21tL21pc2MuUwpAQCAtMTksOSArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0KLSNpbmNsdWRlIDx4dGVuc2EvY2FjaGVhc20uaD4KLSNpbmNsdWRlIDx4dGVuc2EvY2FjaGVhdHRyYXNtLmg+CisjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlYXNtLmg+CiAKIC8qIGNsZWFyX3BhZ2UgKHBhZ2UpICovCiAKQEAgLTc0LDU2ICs3MywxNiBAQAogCiAJcmV0dwogCi0KLS8qCi0gKiB2b2lkIF9fZmx1c2hfaW52YWxpZGF0ZV9jYWNoZV9hbGwodm9pZCkKLSAqLwotCi1FTlRSWShfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfYWxsKQotCWVudHJ5CXNwLCAxNgotCWRjYWNoZV93cml0ZWJhY2tfaW52X2FsbCBhMiwgYTMKLQlpY2FjaGVfaW52YWxpZGF0ZV9hbGwgYTIsIGEzCi0JcmV0dwotCi0vKgotICogdm9pZCBfX2ludmFsaWRhdGVfaWNhY2hlX2FsbCh2b2lkKQotICovCi0KLUVOVFJZKF9faW52YWxpZGF0ZV9pY2FjaGVfYWxsKQotCWVudHJ5CXNwLCAxNgotCWljYWNoZV9pbnZhbGlkYXRlX2FsbCBhMiwgYTMKLQlyZXR3Ci0KLS8qCi0gKiB2b2lkIF9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfYWxsKHZvaWQpCi0gKi8KLQotRU5UUlkoX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9hbGwpCi0JZW50cnkJc3AsIDE2Ci0JZGNhY2hlX3dyaXRlYmFja19pbnZfYWxsIGEyLCBhMwotCXJldHcKLQotCi0vKgotICogdm9pZCBfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfcmFuZ2UodWxvbmcgc3RhcnQsIHVsb25nIHNpemUpCi0gKi8KLQotRU5UUlkoX19mbHVzaF9pbnZhbGlkYXRlX2NhY2hlX3JhbmdlKQotCWVudHJ5CXNwLCAxNgotCW1vdglhNCwgYTIKLQltb3YJYTUsIGEzCi0JZGNhY2hlX3dyaXRlYmFja19pbnZfcmVnaW9uIGE0LCBhNSwgYTYKLQlpY2FjaGVfaW52YWxpZGF0ZV9yZWdpb24gYTIsIGEzLCBhNAotCXJldHcKLQogLyoKICAqIHZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlKHVsb25nIHN0YXJ0KQogICovCiAKIEVOVFJZKF9faW52YWxpZGF0ZV9pY2FjaGVfcGFnZSkKIAllbnRyeQlzcCwgMTYKLQltb3ZpCWEzLCBQQUdFX1NJWkUKLQlpY2FjaGVfaW52YWxpZGF0ZV9yZWdpb24gYTIsIGEzLCBhNAorCisJX19faW52YWxpZGF0ZV9pY2FjaGVfcGFnZSBhMiBhMworCWlzeW5jCisKIAlyZXR3CiAKIC8qCkBAIC0xMzIsMzYgKzkxLDEwIEBACiAKIEVOVFJZKF9faW52YWxpZGF0ZV9kY2FjaGVfcGFnZSkKIAllbnRyeQlzcCwgMTYKLQltb3ZpCWEzLCBQQUdFX1NJWkUKLQlkY2FjaGVfaW52YWxpZGF0ZV9yZWdpb24gYTIsIGEzLCBhNAotCXJldHcKIAotLyoKLSAqIHZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9yYW5nZSh1bG9uZyBzdGFydCwgdWxvbmcgc2l6ZSkKLSAqLworCV9fX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2UgYTIgYTMKKwlkc3luYwogCi1FTlRSWShfX2ludmFsaWRhdGVfaWNhY2hlX3JhbmdlKQotCWVudHJ5CXNwLCAxNgotCWljYWNoZV9pbnZhbGlkYXRlX3JlZ2lvbiBhMiwgYTMsIGE0Ci0JcmV0dwotCi0vKgotICogdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHVsb25nIHN0YXJ0LCB1bG9uZyBzaXplKQotICovCi0KLUVOVFJZKF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UpCi0JZW50cnkJc3AsIDE2Ci0JZGNhY2hlX2ludmFsaWRhdGVfcmVnaW9uIGEyLCBhMywgYTQKLQlyZXR3Ci0KLS8qCi0gKiB2b2lkIF9fZmx1c2hfZGNhY2hlX3BhZ2UodWxvbmcgc3RhcnQpCi0gKi8KLQotRU5UUlkoX19mbHVzaF9kY2FjaGVfcGFnZSkKLQllbnRyeQlzcCwgMTYKLQltb3ZpCWEzLCBQQUdFX1NJWkUKLQlkY2FjaGVfd3JpdGViYWNrX3JlZ2lvbiBhMiwgYTMsIGE0CiAJcmV0dwogCiAvKgpAQCAtMTcwLDggKzEwMywzNiBAQAogCiBFTlRSWShfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2UpCiAJZW50cnkJc3AsIDE2Ci0JbW92aQlhMywgUEFHRV9TSVpFCi0JZGNhY2hlX3dyaXRlYmFja19pbnZfcmVnaW9uIGEyLCBhMywgYTQKKworCV9fX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2UgYTIgYTMKKworCWRzeW5jCisJcmV0dworCisvKgorICogdm9pZCBfX2ZsdXNoX2RjYWNoZV9wYWdlKHVsb25nIHN0YXJ0KQorICovCisKK0VOVFJZKF9fZmx1c2hfZGNhY2hlX3BhZ2UpCisJZW50cnkJc3AsIDE2CisKKwlfX19mbHVzaF9kY2FjaGVfcGFnZSBhMiBhMworCisJZHN5bmMKKwlyZXR3CisKKworCisvKgorICogdm9pZCBfX2ludmFsaWRhdGVfaWNhY2hlX3JhbmdlKHVsb25nIHN0YXJ0LCB1bG9uZyBzaXplKQorICovCisKK0VOVFJZKF9faW52YWxpZGF0ZV9pY2FjaGVfcmFuZ2UpCisJZW50cnkJc3AsIDE2CisKKwlfX19pbnZhbGlkYXRlX2ljYWNoZV9yYW5nZSBhMiBhMyBhNAorCWlzeW5jCisKIAlyZXR3CiAKIC8qCkBAIC0xODAsMTk1ICsxNDEsNjkgQEAKIAogRU5UUlkoX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSkKIAllbnRyeQlzcCwgMTYKLQlkY2FjaGVfd3JpdGViYWNrX2ludl9yZWdpb24gYTIsIGEzLCBhNAorCisJX19fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UgYTIgYTMgYTQKKwlkc3luYworCiAJcmV0dwogCiAvKgotICogdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX2FsbCh2b2lkKQorICogdm9pZCBfZmx1c2hfZGNhY2hlX3JhbmdlKHVsb25nIHN0YXJ0LCB1bG9uZyBzaXplKQorICovCisKK0VOVFJZKF9fZmx1c2hfZGNhY2hlX3JhbmdlKQorCWVudHJ5CXNwLCAxNgorCisJX19fZmx1c2hfZGNhY2hlX3JhbmdlIGEyIGEzIGE0CisJZHN5bmMKKworCXJldHcKKworLyoKKyAqIHZvaWQgX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHVsb25nIHN0YXJ0LCB1bG9uZyBzaXplKQorICovCisKK0VOVFJZKF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UpCisJZW50cnkJc3AsIDE2CisKKwlfX19pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSBhMiBhMyBhNAorCisKKwlyZXR3CisKKy8qCisgKiB2b2lkIF9pbnZhbGlkYXRlX2ljYWNoZV9hbGwodm9pZCkKKyAqLworCitFTlRSWShfX2ludmFsaWRhdGVfaWNhY2hlX2FsbCkKKwllbnRyeQlzcCwgMTYKKworCV9fX2ludmFsaWRhdGVfaWNhY2hlX2FsbCBhMiBhMworCWlzeW5jCisKKwlyZXR3CisKKy8qCisgKiB2b2lkIF9mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9hbGwodm9pZCkKKyAqLworCitFTlRSWShfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX2FsbCkKKwllbnRyeQlzcCwgMTYKKworCV9fX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX2FsbCBhMiBhMworCWRzeW5jCisKKwlyZXR3CisKKy8qCisgKiB2b2lkIF9pbnZhbGlkYXRlX2RjYWNoZV9hbGwodm9pZCkKICAqLwogCiBFTlRSWShfX2ludmFsaWRhdGVfZGNhY2hlX2FsbCkKIAllbnRyeQlzcCwgMTYKLQlkY2FjaGVfaW52YWxpZGF0ZV9hbGwgYTIsIGEzCi0JcmV0dwogCi0vKgotICogdm9pZCBfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2VfcGh5cyh1bG9uZyBzdGFydCkKLSAqLwotCi1FTlRSWShfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2VfcGh5cykKLQllbnRyeQlzcCwgMTYKLQotCW1vdmkJYTMsIFhDSEFMX0RDQUNIRV9TSVpFCi0JbW92aQlhNCwgUEFHRV9NQVNLIHwgMQotCWFkZGkJYTIsIGEyLCAxCi0KLTE6CWFkZGkJYTMsIGEzLCAtWENIQUxfRENBQ0hFX0xJTkVTSVpFCi0KLQlsZGN0CWE2LCBhMworCV9fX2ludmFsaWRhdGVfZGNhY2hlX2FsbCBhMiBhMwogCWRzeW5jCi0JYW5kCWE2LCBhNiwgYTQKLQliZXEJYTYsIGEyLCAyZgotCWJnZXVpCWEzLCAyLCAxYgotCXJldHcKLQotMjoJZGl3YmkJYTMsIDAKLQliZ2V1aQlhMywgMiwgMWIKLQlyZXR3Ci0KLUVOVFJZKGNoZWNrX2RjYWNoZV9sb3cwKQotCWVudHJ5CXNwLCAxNgotCi0JbW92aQlhMywgWENIQUxfRENBQ0hFX1NJWkUgLyA0Ci0JbW92aQlhNCwgUEFHRV9NQVNLIHwgMQotCWFkZGkJYTIsIGEyLCAxCi0KLTE6CWFkZGkJYTMsIGEzLCAtWENIQUxfRENBQ0hFX0xJTkVTSVpFCi0KLQlsZGN0CWE2LCBhMwotCWRzeW5jCi0JYW5kCWE2LCBhNiwgYTQKLQliZXEJYTYsIGEyLCAyZgotCWJnZXVpCWEzLCAyLCAxYgotCXJldHcKLQotMjoJaiAyYgotCi1FTlRSWShjaGVja19kY2FjaGVfaGlnaDApCi0JZW50cnkJc3AsIDE2Ci0KLQltb3ZpCWE1LCBYQ0hBTF9EQ0FDSEVfU0laRSAvIDQKLQltb3ZpCWEzLCBYQ0hBTF9EQ0FDSEVfU0laRSAvIDIKLQltb3ZpCWE0LCBQQUdFX01BU0sgfCAxCi0JYWRkaQlhMiwgYTIsIDEKLQotMToJYWRkaQlhMywgYTMsIC1YQ0hBTF9EQ0FDSEVfTElORVNJWkUKLQlhZGRpCWE1LCBhNSwgLVhDSEFMX0RDQUNIRV9MSU5FU0laRQotCi0JbGRjdAlhNiwgYTMKLQlkc3luYwotCWFuZAlhNiwgYTYsIGE0Ci0JYmVxCWE2LCBhMiwgMmYKLQliZ2V1aQlhNSwgMiwgMWIKLQlyZXR3Ci0KLTI6CWogMmIKLQotRU5UUlkoY2hlY2tfZGNhY2hlX2xvdzEpCi0JZW50cnkJc3AsIDE2Ci0KLQltb3ZpCWE1LCBYQ0hBTF9EQ0FDSEVfU0laRSAvIDQKLQltb3ZpCWEzLCBYQ0hBTF9EQ0FDSEVfU0laRSAqIDMgLyA0Ci0JbW92aQlhNCwgUEFHRV9NQVNLIHwgMQotCWFkZGkJYTIsIGEyLCAxCi0KLTE6CWFkZGkJYTMsIGEzLCAtWENIQUxfRENBQ0hFX0xJTkVTSVpFCi0JYWRkaQlhNSwgYTUsIC1YQ0hBTF9EQ0FDSEVfTElORVNJWkUKLQotCWxkY3QJYTYsIGEzCi0JZHN5bmMKLQlhbmQJYTYsIGE2LCBhNAotCWJlcQlhNiwgYTIsIDJmCi0JYmdldWkJYTUsIDIsIDFiCi0JcmV0dwotCi0yOglqIDJiCi0KLUVOVFJZKGNoZWNrX2RjYWNoZV9oaWdoMSkKLQllbnRyeQlzcCwgMTYKLQotCW1vdmkJYTUsIFhDSEFMX0RDQUNIRV9TSVpFIC8gNAotCW1vdmkJYTMsIFhDSEFMX0RDQUNIRV9TSVpFCi0JbW92aQlhNCwgUEFHRV9NQVNLIHwgMQotCWFkZGkJYTIsIGEyLCAxCi0KLTE6CWFkZGkJYTMsIGEzLCAtWENIQUxfRENBQ0hFX0xJTkVTSVpFCi0JYWRkaQlhNSwgYTUsIC1YQ0hBTF9EQ0FDSEVfTElORVNJWkUKLQotCWxkY3QJYTYsIGEzCi0JZHN5bmMKLQlhbmQJYTYsIGE2LCBhNAotCWJlcQlhNiwgYTIsIDJmCi0JYmdldWkJYTUsIDIsIDFiCi0JcmV0dwotCi0yOglqIDJiCi0KLQotLyoKLSAqIHZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlX3BoeXModWxvbmcgc3RhcnQpCi0gKi8KLQotRU5UUlkoX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlX3BoeXMpCi0JZW50cnkJc3AsIDE2Ci0KLQltb3ZpCWEzLCBYQ0hBTF9JQ0FDSEVfU0laRQotCW1vdmkJYTQsIFBBR0VfTUFTSyB8IDEKLQlhZGRpCWEyLCBhMiwgMQotCi0xOglhZGRpCWEzLCBhMywgLVhDSEFMX0lDQUNIRV9MSU5FU0laRQotCi0JbGljdAlhNiwgYTMKLQlpc3luYwotCWFuZAlhNiwgYTYsIGE0Ci0JYmVxCWE2LCBhMiwgMmYKLQliZ2V1aQlhMywgMiwgMWIKLQlyZXR3Ci0KLTI6CWlpaQlhMywgMAotCWJnZXVpCWEzLCAyLCAxYgotCXJldHcKLQotCi0jaWYgMAotCi0JbW92aQlhMywgWENIQUxfRENBQ0hFX1dBWVMgLSAxCi0JbW92aQlhNCwgUEFHRV9TSVpFCi0KLTE6CW1vdglhNSwgYTIKLQlhZGQJYTYsIGEyLCBhNAotCi0yOglkaXdiaQlhNSwgMAotCWRpd2JpCWE1LCBYQ0hBTF9EQ0FDSEVfTElORVNJWkUKLQlkaXdiaQlhNSwgWENIQUxfRENBQ0hFX0xJTkVTSVpFICogMgotCWRpd2JpCWE1LCBYQ0hBTF9EQ0FDSEVfTElORVNJWkUgKiAzCi0KLQlhZGRpCWE1LCBhNSwgWENIQUxfRENBQ0hFX0xJTkVTSVpFICogNAotCWJsdAlhNSwgYTYsIDJiCi0KLQlhZGRpCWEzLCBhMywgLTEKLQlhZGRpCWEyLCBhMiwgWENIQUxfRENBQ0hFX1NJWkUgLyBYQ0hBTF9EQ0FDSEVfV0FZUwotCWJnZXoJYTMsIDFiCiAKIAlyZXR3CiAKLUVOVFJZKF9faW52YWxpZGF0ZV9pY2FjaGVfcGFnZV9pbmRleCkKLQllbnRyeQlzcCwgMTYKLQotCW1vdmkJYTMsIFhDSEFMX0lDQUNIRV9XQVlTIC0gMQotCW1vdmkJYTQsIFBBR0VfU0laRQotCi0xOgltb3YJYTUsIGEyCi0JYWRkCWE2LCBhMiwgYTQKLQotMjoJaWlpCWE1LCAwCi0JaWlpCWE1LCBYQ0hBTF9JQ0FDSEVfTElORVNJWkUKLQlpaWkJYTUsIFhDSEFMX0lDQUNIRV9MSU5FU0laRSAqIDIKLQlpaWkJYTUsIFhDSEFMX0lDQUNIRV9MSU5FU0laRSAqIDMKLQotCWFkZGkJYTUsIGE1LCBYQ0hBTF9JQ0FDSEVfTElORVNJWkUgKiA0Ci0JYmx0CWE1LCBhNiwgMmIKLQotCWFkZGkJYTMsIGEzLCAtMQotCWFkZGkJYTIsIGEyLCBYQ0hBTF9JQ0FDSEVfU0laRSAvIFhDSEFMX0lDQUNIRV9XQVlTCi0JYmdleglhMywgMmIKLQotCXJldHcKLQotI2VuZGlmCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9tbS90bGIuYyBiL2FyY2gveHRlbnNhL21tL3RsYi5jCmluZGV4IDBmZWZiODY2Li4yMzk0NjFkIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9tbS90bGIuYworKysgYi9hcmNoL3h0ZW5zYS9tbS90bGIuYwpAQCAtMjQsMTIgKzI0LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX2l0bGJfYWxsICh2b2lkKQogewotCWludCB3YXksIGluZGV4OworCWludCB3LCBpOwogCi0JZm9yICh3YXkgPSAwOyB3YXkgPCBYQ0hBTF9JVExCX0FSRl9XQVlTOyB3YXkrKykgewotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBJVExCX0VOVFJJRVNfUEVSX0FSRl9XQVk7IGluZGV4KyspIHsKLQkJCWludCBlbnRyeSA9IHdheSArIChpbmRleCA8PCBQQUdFX1NISUZUKTsKLQkJCWludmFsaWRhdGVfaXRsYl9lbnRyeV9ub19pc3luYyAoZW50cnkpOworCWZvciAodyA9IDA7IHcgPCBJVExCX0FSRl9XQVlTOyB3KyspIHsKKwkJZm9yIChpID0gMDsgaSA8ICgxIDw8IFhDSEFMX0lUTEJfQVJGX0VOVFJJRVNfTE9HMik7IGkrKykgeworCQkJaW50IGUgPSB3ICsgKGkgPDwgUEFHRV9TSElGVCk7CisJCQlpbnZhbGlkYXRlX2l0bGJfZW50cnlfbm9faXN5bmMoZSk7CiAJCX0KIAl9CiAJYXNtIHZvbGF0aWxlICgiaXN5bmNcbiIpOwpAQCAtMzcsMTIgKzM3LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX2R0bGJfYWxsICh2b2lkKQogewotCWludCB3YXksIGluZGV4OworCWludCB3LCBpOwogCi0JZm9yICh3YXkgPSAwOyB3YXkgPCBYQ0hBTF9EVExCX0FSRl9XQVlTOyB3YXkrKykgewotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBEVExCX0VOVFJJRVNfUEVSX0FSRl9XQVk7IGluZGV4KyspIHsKLQkJCWludCBlbnRyeSA9IHdheSArIChpbmRleCA8PCBQQUdFX1NISUZUKTsKLQkJCWludmFsaWRhdGVfZHRsYl9lbnRyeV9ub19pc3luYyAoZW50cnkpOworCWZvciAodyA9IDA7IHcgPCBEVExCX0FSRl9XQVlTOyB3KyspIHsKKwkJZm9yIChpID0gMDsgaSA8ICgxIDw8IFhDSEFMX0RUTEJfQVJGX0VOVFJJRVNfTE9HMik7IGkrKykgeworCQkJaW50IGUgPSB3ICsgKGkgPDwgUEFHRV9TSElGVCk7CisJCQlpbnZhbGlkYXRlX2R0bGJfZW50cnlfbm9faXN5bmMoZSk7CiAJCX0KIAl9CiAJYXNtIHZvbGF0aWxlICgiaXN5bmNcbiIpOwpAQCAtNjMsMjEgKzYzLDI1IEBACiAKIHZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotI2lmIDAKLQlwcmludGsoIlt0bGJtbTwlbHg+XVxuIiwgKHVuc2lnbmVkIGxvbmcpbW0tPmNvbnRleHQpOwotI2VuZGlmCi0KIAlpZiAobW0gPT0gY3VycmVudC0+YWN0aXZlX21tKSB7CiAJCWludCBmbGFnczsKIAkJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWdldF9uZXdfbW11X2NvbnRleHQobW0sIGFzaWRfY2FjaGUpOwotCQlzZXRfcmFzaWRfcmVnaXN0ZXIoQVNJRF9JTlNFUlQobW0tPmNvbnRleHQpKTsKKwkJX19nZXRfbmV3X21tdV9jb250ZXh0KG1tKTsKKwkJX19sb2FkX21tdV9jb250ZXh0KG1tKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAllbHNlCiAJCW1tLT5jb250ZXh0ID0gMDsKIH0KIAorI2RlZmluZSBfSVRMQl9FTlRSSUVTIChJVExCX0FSRl9XQVlTIDw8IFhDSEFMX0lUTEJfQVJGX0VOVFJJRVNfTE9HMikKKyNkZWZpbmUgX0RUTEJfRU5UUklFUyAoRFRMQl9BUkZfV0FZUyA8PCBYQ0hBTF9EVExCX0FSRl9FTlRSSUVTX0xPRzIpCisjaWYgX0lUTEJfRU5UUklFUyA+IF9EVExCX0VOVFJJRVMKKyMgZGVmaW5lIF9UTEJfRU5UUklFUyBfSVRMQl9FTlRSSUVTCisjZWxzZQorIyBkZWZpbmUgX1RMQl9FTlRSSUVTIF9EVExCX0VOVFJJRVMKKyNlbmRpZgorCiB2b2lkIGZsdXNoX3RsYl9yYW5nZSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAgICAgCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKQEAgLTkzLDcgKzk3LDcgQEAKICNlbmRpZgogCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwogCi0JaWYgKGVuZC1zdGFydCArIChQQUdFX1NJWkUtMSkgPD0gU01BTExFU1RfTlRMQl9FTlRSSUVTIDw8IFBBR0VfU0hJRlQpIHsKKwlpZiAoZW5kLXN0YXJ0ICsgKFBBR0VfU0laRS0xKSA8PSBfVExCX0VOVFJJRVMgPDwgUEFHRV9TSElGVCkgewogCQlpbnQgb2xkcGlkID0gZ2V0X3Jhc2lkX3JlZ2lzdGVyKCk7CiAJCXNldF9yYXNpZF9yZWdpc3RlciAoQVNJRF9JTlNFUlQobW0tPmNvbnRleHQpKTsKIAkJc3RhcnQgJj0gUEFHRV9NQVNLOwpAQCAtMTExLDkgKzExNSw3IEBACiAKIAkJc2V0X3Jhc2lkX3JlZ2lzdGVyKG9sZHBpZCk7CiAJfSBlbHNlIHsKLQkJZ2V0X25ld19tbXVfY29udGV4dChtbSwgYXNpZF9jYWNoZSk7Ci0JCWlmIChtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pCi0JCQlzZXRfcmFzaWRfcmVnaXN0ZXIoQVNJRF9JTlNFUlQobW0tPmNvbnRleHQpKTsKKwkJZmx1c2hfdGxiX21tKG1tKTsKIAl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQpAQCAtMTIzLDEwICsxMjUsNiBAQAogCXN0cnVjdCBtbV9zdHJ1Y3QqIG1tID0gdm1hLT52bV9tbTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBvbGRwaWQ7Ci0jaWYgMAotCXByaW50aygiW3RsYnBhZ2U8JTAybHgsJTA4bHg+XVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKW1tLT5jb250ZXh0LCBwYWdlKTsKLSNlbmRpZgogCiAJaWYobW0tPmNvbnRleHQgPT0gTk9fQ09OVEVYVCkKIAkJcmV0dXJuOwpAQCAtMTQyLDQwNCArMTQwLDUgQEAKIAlzZXRfcmFzaWRfcmVnaXN0ZXIob2xkcGlkKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotI2lmIDAKLQlmbHVzaF90bGJfYWxsKCk7Ci0JcmV0dXJuOwotI2VuZGlmCiB9CiAKLQotI2lmZGVmIERFQlVHX1RMQgotCi0jZGVmaW5lIFVTRV9JVExCICAwCi0jZGVmaW5lIFVTRV9EVExCICAxCi0KLXN0cnVjdCB3YXlfY29uZmlnX3QgewotCWludCBpbmRpY2llczsKLQlpbnQgaW5kaWNpZXNfbG9nMjsKLQlpbnQgcGdzel9sb2cyOwotCWludCBhcmY7Ci19OwotCi1zdGF0aWMgc3RydWN0IHdheV9jb25maWdfdCBpdGxiW1hDSEFMX0lUTEJfV0FZU10gPQotewotCXsgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkwX1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTBfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkwX1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMF9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkxX1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTFfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkxX1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMV9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkyX1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTJfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkyX1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMl9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkzX1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTNfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkzX1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZM19TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk0X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTRfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk0X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNF9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk1X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTVfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk1X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNV9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk2X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTZfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk2X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNl9TRVQsIEFSRikKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHdheV9jb25maWdfdCBkdGxiW1hDSEFMX0RUTEJfV0FZU10gPQotewotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkwX1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTBfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkwX1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMF9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkxX1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTFfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkxX1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMV9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkyX1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTJfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkyX1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMl9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkzX1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTNfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkzX1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZM19TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk0X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTRfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk0X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNF9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk1X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTVfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk1X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNV9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk2X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTZfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk2X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNl9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk3X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTdfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk3X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZN19TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk4X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWThfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk4X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZOF9TRVQsIEFSRikKLQl9LAotCXsgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk5X1NFVCwgRU5UUklFUyksCi0JICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTlfU0VULCBFTlRSSUVTX0xPRzIpLAotCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk5X1NFVCwgUEFHRVNaX0xPRzJfTUlOKSwKLQkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZOV9TRVQsIEFSRikKLQl9Ci19OwotCi0vKiAgVG90YWwgbnVtYmVyIG9mIGVudHJpZXM6ICAqLwotI2RlZmluZSBJVExCX1RPVEFMX0VOVFJJRVMJXAotCQlYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTBfU0VULCBFTlRSSUVTKSArIFwKLQkJWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkxX1NFVCwgRU5UUklFUykgKyBcCi0JCVhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMl9TRVQsIEVOVFJJRVMpICsgXAotCQlYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTNfU0VULCBFTlRSSUVTKSArIFwKLQkJWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk0X1NFVCwgRU5UUklFUykgKyBcCi0JCVhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNV9TRVQsIEVOVFJJRVMpICsgXAotCQlYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTZfU0VULCBFTlRSSUVTKQotI2RlZmluZSBEVExCX1RPVEFMX0VOVFJJRVMJXAotCQlYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTBfU0VULCBFTlRSSUVTKSArIFwKLQkJWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkxX1NFVCwgRU5UUklFUykgKyBcCi0JCVhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMl9TRVQsIEVOVFJJRVMpICsgXAotCQlYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTNfU0VULCBFTlRSSUVTKSArIFwKLQkJWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk0X1NFVCwgRU5UUklFUykgKyBcCi0JCVhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNV9TRVQsIEVOVFJJRVMpICsgXAotCQlYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTZfU0VULCBFTlRSSUVTKSArIFwKLQkJWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk3X1NFVCwgRU5UUklFUykgKyBcCi0JCVhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZOF9TRVQsIEVOVFJJRVMpICsgXAotCQlYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTlfU0VULCBFTlRSSUVTKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZAkJdmE7Ci0gICAgdW5zaWduZWQJCXBhOwotICAgIHVuc2lnbmVkIGNoYXIJYXNpZDsKLSAgICB1bnNpZ25lZCBjaGFyCWNhOwotICAgIHVuc2lnbmVkIGNoYXIJd2F5OwotICAgIHVuc2lnbmVkIGNoYXIJaW5kZXg7Ci0gICAgdW5zaWduZWQgY2hhcglwZ3N6X2xvZzI7CS8qIDAgLi4gMzIgKi8KLSAgICB1bnNpZ25lZCBjaGFyCXR5cGU7CQkvKiAwPUlUTEIgMT1EVExCICovCi19IHRsYl9kdW1wX2VudHJ5X3Q7Ci0KLS8qICBSZXR1cm4gLTEgaWYgYSBwcmVjZWRlcyBiLCArMSBpZiBhIGZvbGxvd3MgYiwgMCBpZiBzYW1lOiAgKi8KLWludCBjbXBfdGxiX2R1bXBfaW5mbyggdGxiX2R1bXBfZW50cnlfdCAqYSwgdGxiX2R1bXBfZW50cnlfdCAqYiApCi17Ci0gICAgaWYgKGEtPmFzaWQgPCBiLT5hc2lkKSByZXR1cm4gLTE7Ci0gICAgaWYgKGEtPmFzaWQgPiBiLT5hc2lkKSByZXR1cm4gIDE7Ci0gICAgaWYgKGEtPnZhIDwgYi0+dmEpIHJldHVybiAtMTsKLSAgICBpZiAoYS0+dmEgPiBiLT52YSkgcmV0dXJuICAxOwotICAgIGlmIChhLT5wYSA8IGItPnBhKSByZXR1cm4gLTE7Ci0gICAgaWYgKGEtPnBhID4gYi0+cGEpIHJldHVybiAgMTsKLSAgICBpZiAoYS0+Y2EgPCBiLT5jYSkgcmV0dXJuIC0xOwotICAgIGlmIChhLT5jYSA+IGItPmNhKSByZXR1cm4gIDE7Ci0gICAgaWYgKGEtPndheSA8IGItPndheSkgcmV0dXJuIC0xOwotICAgIGlmIChhLT53YXkgPiBiLT53YXkpIHJldHVybiAgMTsKLSAgICBpZiAoYS0+aW5kZXggPCBiLT5pbmRleCkgcmV0dXJuIC0xOwotICAgIGlmIChhLT5pbmRleCA+IGItPmluZGV4KSByZXR1cm4gIDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgc29ydF90bGJfZHVtcF9pbmZvKCB0bGJfZHVtcF9lbnRyeV90ICp0LCBpbnQgbiApCi17Ci0gICAgaW50IGksIGo7Ci0gICAgLyogIFNpbXBsZSBPKG4qbikgc29ydDogICovCi0gICAgZm9yIChpID0gMDsgaSA8IG4tMTsgaSsrKQotCWZvciAoaiA9IGkrMTsgaiA8IG47IGorKykKLQkgICAgaWYgKGNtcF90bGJfZHVtcF9pbmZvKHQraSwgdCtqKSA+IDApIHsKLQkJdGxiX2R1bXBfZW50cnlfdCB0bXAgPSB0W2ldOwotCQl0W2ldID0gdFtqXTsKLQkJdFtqXSA9IHRtcDsKLQkgICAgfQotfQotCi0KLXN0YXRpYyB0bGJfZHVtcF9lbnRyeV90IGl0bGJfZHVtcF9pbmZvW0lUTEJfVE9UQUxfRU5UUklFU107Ci1zdGF0aWMgdGxiX2R1bXBfZW50cnlfdCBkdGxiX2R1bXBfaW5mb1tEVExCX1RPVEFMX0VOVFJJRVNdOwotCi0KLXN0YXRpYyBpbmxpbmUgY2hhciAqd2F5X3R5cGUgKGludCB0eXBlKQotewotCXJldHVybiB0eXBlID8gImF1dG9yZWZpbGwiIDogIm5vbi1hdXRvcmVmaWxsIjsKLX0KLQotdm9pZCBwcmludF9lbnRyeSAoc3RydWN0IHdheV9jb25maWdfdCAqd2F5X2luZm8sCi0JCSAgdW5zaWduZWQgaW50IHdheSwKLQkJICB1bnNpZ25lZCBpbnQgaW5kZXgsCi0JCSAgdW5zaWduZWQgaW50IHZpcnR1YWwsCi0JCSAgdW5zaWduZWQgaW50IHRyYW5zbGF0aW9uKQotewotCWNoYXIgdmFsaWRfY2hyOwotCXVuc2lnbmVkIGludCB2YSwgcGEsIGFzaWQsIGNhOwotCi0JdmEgPSB2aXJ0dWFsICYKLQkgIAl+KCgxIDw8ICh3YXlfaW5mby0+cGdzel9sb2cyICsgd2F5X2luZm8tPmluZGljaWVzX2xvZzIpKSAtIDEpOwotCWFzaWQgPSB2aXJ0dWFsICYgKCgxIDw8IFhDSEFMX01NVV9BU0lEX0JJVFMpIC0gMSk7Ci0JcGEgPSB0cmFuc2xhdGlvbiAmIH4oKDEgPDwgd2F5X2luZm8tPnBnc3pfbG9nMikgLSAxKTsKLQljYSA9IHRyYW5zbGF0aW9uICYgKCgxIDw8IFhDSEFMX01NVV9DQV9CSVRTKSAtIDEpOwotCXZhbGlkX2NociA9IGFzaWQgPyAnVicgOiAnSSc7Ci0KLQkvKiBDb21wdXRlIGFuZCBpbmNvcnBvcmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBpbmRleCBiaXRzIG9uIHRoZQotCSAqIHZhLiAgSXQncyBtb3JlIHVzZWZ1bCBmb3Iga2VybmVsIGRlYnVnZ2luZywgc2luY2Ugd2UgYWx3YXlzCi0JICogd2FudCB0byBrbm93IHRoZSBlZmZlY3RpdmUgdmEgYW55d2F5LiAqLwotCi0JdmEgKz0gaW5kZXggPDwgd2F5X2luZm8tPnBnc3pfbG9nMjsKLQotCXByaW50ayAoIlx0WyVkLCVkXSAoJWMpIHZwbiAweCUuOHggIHBwbiAweCUuOHggIGFzaWQgMHglLjJ4ICBhbSAweCV4XG4iLAotCQl3YXksIGluZGV4LCB2YWxpZF9jaHIsIHZhLCBwYSwgYXNpZCwgY2EpOwotfQotCi12b2lkIHByaW50X2l0bGJfZW50cnkgKHN0cnVjdCB3YXlfY29uZmlnX3QgKndheV9pbmZvLCBpbnQgd2F5LCBpbnQgaW5kZXgpCi17Ci0JcHJpbnRfZW50cnkgKHdheV9pbmZvLCB3YXksIGluZGV4LAotCQkgICAgIHJlYWRfaXRsYl92aXJ0dWFsICh3YXkgKyAoaW5kZXggPDwgd2F5X2luZm8tPnBnc3pfbG9nMikpLAotCQkgICAgIHJlYWRfaXRsYl90cmFuc2xhdGlvbiAod2F5ICsgKGluZGV4IDw8IHdheV9pbmZvLT5wZ3N6X2xvZzIpKSk7Ci19Ci0KLXZvaWQgcHJpbnRfZHRsYl9lbnRyeSAoc3RydWN0IHdheV9jb25maWdfdCAqd2F5X2luZm8sIGludCB3YXksIGludCBpbmRleCkKLXsKLQlwcmludF9lbnRyeSAod2F5X2luZm8sIHdheSwgaW5kZXgsCi0JCSAgICAgcmVhZF9kdGxiX3ZpcnR1YWwgKHdheSArIChpbmRleCA8PCB3YXlfaW5mby0+cGdzel9sb2cyKSksCi0JCSAgICAgcmVhZF9kdGxiX3RyYW5zbGF0aW9uICh3YXkgKyAoaW5kZXggPDwgd2F5X2luZm8tPnBnc3pfbG9nMikpKTsKLX0KLQotdm9pZCBkdW1wX2l0bGIgKHZvaWQpCi17Ci0JaW50IHdheSwgaW5kZXg7Ci0KLQlwcmludGsgKCJcbklUTEI6IHdheXMgPSAlZFxuIiwgWENIQUxfSVRMQl9XQVlTKTsKLQotCWZvciAod2F5ID0gMDsgd2F5IDwgWENIQUxfSVRMQl9XQVlTOyB3YXkrKykgewotCQlwcmludGsgKCJcbldheTogJWQsIEVudHJpZXM6ICVkLCBNaW5QYWdlU2l6ZTogJWQsIFR5cGU6ICVzXG4iLAotCQkJd2F5LCBpdGxiW3dheV0uaW5kaWNpZXMsCi0JCQlpdGxiW3dheV0ucGdzel9sb2cyLCB3YXlfdHlwZShpdGxiW3dheV0uYXJmKSk7Ci0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGl0bGJbd2F5XS5pbmRpY2llczsgaW5kZXgrKykgewotCQkJcHJpbnRfaXRsYl9lbnRyeSgmaXRsYlt3YXldLCB3YXksIGluZGV4KTsKLQkJfQotCX0KLX0KLQotdm9pZCBkdW1wX2R0bGIgKHZvaWQpCi17Ci0JaW50IHdheSwgaW5kZXg7Ci0KLQlwcmludGsgKCJcbkRUTEI6IHdheXMgPSAlZFxuIiwgWENIQUxfRFRMQl9XQVlTKTsKLQotCWZvciAod2F5ID0gMDsgd2F5IDwgWENIQUxfRFRMQl9XQVlTOyB3YXkrKykgewotCQlwcmludGsgKCJcbldheTogJWQsIEVudHJpZXM6ICVkLCBNaW5QYWdlU2l6ZTogJWQsIFR5cGU6ICVzXG4iLAotCQkJd2F5LCBkdGxiW3dheV0uaW5kaWNpZXMsCi0JCQlkdGxiW3dheV0ucGdzel9sb2cyLCB3YXlfdHlwZShkdGxiW3dheV0uYXJmKSk7Ci0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGR0bGJbd2F5XS5pbmRpY2llczsgaW5kZXgrKykgewotCQkJcHJpbnRfZHRsYl9lbnRyeSgmZHRsYlt3YXldLCB3YXksIGluZGV4KTsKLQkJfQotCX0KLX0KLQotdm9pZCBkdW1wX3RsYiAodGxiX2R1bXBfZW50cnlfdCAqdGluZm8sIHN0cnVjdCB3YXlfY29uZmlnX3QgKmNvbmZpZywKLQkJaW50IGVudHJpZXMsIGludCB3YXlzLCBpbnQgdHlwZSwgaW50IHNob3dfaW52YWxpZCkKLXsKLSAgICB0bGJfZHVtcF9lbnRyeV90ICplID0gdGluZm87Ci0gICAgaW50IHdheSwgaTsKLQotICAgIC8qICBHYXRoZXIgYWxsIGluZm86ICAqLwotICAgIGZvciAod2F5ID0gMDsgd2F5IDwgd2F5czsgd2F5KyspIHsKLQlzdHJ1Y3Qgd2F5X2NvbmZpZ190ICpjZmcgPSBjb25maWcgKyB3YXk7Ci0JZm9yIChpID0gMDsgaSA8IGNmZy0+aW5kaWNpZXM7IGkrKykgewotCSAgICB1bnNpZ25lZCB3YXlpbmRleCA9IHdheSArIChpIDw8IGNmZy0+cGdzel9sb2cyKTsKLQkgICAgdW5zaWduZWQgdnYgPSAodHlwZSA/IHJlYWRfZHRsYl92aXJ0dWFsICh3YXlpbmRleCkKLQkJICAgIAkJOiByZWFkX2l0bGJfdmlydHVhbCAod2F5aW5kZXgpKTsKLQkgICAgdW5zaWduZWQgcHAgPSAodHlwZSA/IHJlYWRfZHRsYl90cmFuc2xhdGlvbiAod2F5aW5kZXgpCi0JCSAgICAJCTogcmVhZF9pdGxiX3RyYW5zbGF0aW9uICh3YXlpbmRleCkpOwotCi0JICAgIC8qIENvbXB1dGUgYW5kIGluY29ycG9yYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGluZGV4IGJpdHMgb24gdGhlCi0JICAgICAqIHZhLiAgSXQncyBtb3JlIHVzZWZ1bCBmb3Iga2VybmVsIGRlYnVnZ2luZywgc2luY2Ugd2UgYWx3YXlzCi0JICAgICAqIHdhbnQgdG8ga25vdyB0aGUgZWZmZWN0aXZlIHZhIGFueXdheS4gKi8KLQotCSAgICBlLT52YSA9ICh2diAmIH4oKDEgPDwgKGNmZy0+cGdzel9sb2cyICsgY2ZnLT5pbmRpY2llc19sb2cyKSkgLSAxKSk7Ci0JICAgIGUtPnZhICs9IChpIDw8IGNmZy0+cGdzel9sb2cyKTsKLQkgICAgZS0+cGEgPSAocHAgJiB+KCgxIDw8IGNmZy0+cGdzel9sb2cyKSAtIDEpKTsKLQkgICAgZS0+YXNpZCA9ICh2diAmICgoMSA8PCBYQ0hBTF9NTVVfQVNJRF9CSVRTKSAtIDEpKTsKLQkgICAgZS0+Y2EgPSAocHAgJiAoKDEgPDwgWENIQUxfTU1VX0NBX0JJVFMpIC0gMSkpOwotCSAgICBlLT53YXkgPSB3YXk7Ci0JICAgIGUtPmluZGV4ID0gaTsKLQkgICAgZS0+cGdzel9sb2cyID0gY2ZnLT5wZ3N6X2xvZzI7Ci0JICAgIGUtPnR5cGUgPSB0eXBlOwotCSAgICBlKys7Ci0JfQotICAgIH0KLSNpZiAxCi0gICAgLyogIFNvcnQgYnkgQVNJRCBhbmQgVkFERFI6ICAqLwotICAgIHNvcnRfdGxiX2R1bXBfaW5mbyAodGluZm8sIGVudHJpZXMpOwotI2VuZGlmCi0KLSAgICAvKiAgRGlzcGxheSBhbGwgc29ydGVkIGluZm86ICAqLwotICAgIHByaW50ayAoIlxuJWNUTEIgZHVtcDpcbiIsICh0eXBlID8gJ0QnIDogJ0knKSk7Ci0gICAgZm9yIChlID0gdGluZm8sIGkgPSAwOyBpIDwgZW50cmllczsgaSsrLCBlKyspIHsKLSNpZiAwCi0JaWYgKGUtPmFzaWQgPT0gMCAmJiAhc2hvd19pbnZhbGlkKQotCSAgICBjb250aW51ZTsKLSNlbmRpZgotCXByaW50ayAoIiVjIHdheT0lZCBpPSVkICBBU0lEPSUwMlggVj0lMDhYIC0+IFA9JTA4WCBDQT0lWCAoJWQgJWNCKVxuIiwKLQkJKGUtPnR5cGUgPyAnRCcgOiAnSScpLCBlLT53YXksIGUtPmluZGV4LAotCQllLT5hc2lkLCBlLT52YSwgZS0+cGEsIGUtPmNhLAotCQkoMSA8PCAoZS0+cGdzel9sb2cyICUgMTApKSwKLQkJIiBrTUciW2UtPnBnc3pfbG9nMiAvIDEwXQotCQkpOwotICAgIH0KLX0KLQotdm9pZCBkdW1wX3RsYnMyIChpbnQgc2hvd2ludikKLXsKLSAgICBkdW1wX3RsYiAoaXRsYl9kdW1wX2luZm8sIGl0bGIsIElUTEJfVE9UQUxfRU5UUklFUywgWENIQUxfSVRMQl9XQVlTLCAwLCBzaG93aW52KTsKLSAgICBkdW1wX3RsYiAoZHRsYl9kdW1wX2luZm8sIGR0bGIsIERUTEJfVE9UQUxfRU5UUklFUywgWENIQUxfRFRMQl9XQVlTLCAxLCBzaG93aW52KTsKLX0KLQotdm9pZCBkdW1wX2FsbF90bGJzICh2b2lkKQotewotICAgIGR1bXBfdGxiczIgKDEpOwotfQotCi12b2lkIGR1bXBfdmFsaWRfdGxicyAodm9pZCkKLXsKLSAgICBkdW1wX3RsYnMyICgwKTsKLX0KLQotCi12b2lkIGR1bXBfdGxicyAodm9pZCkKLXsKLQlkdW1wX2l0bGIoKTsKLQlkdW1wX2R0bGIoKTsKLX0KLQotdm9pZCBkdW1wX2NhY2hlX3RhZyhpbnQgZGNhY2hlLCBpbnQgaWR4KQotewotCWludCB3LCBpLCBzLCBlOwotCXVuc2lnbmVkIGxvbmcgdGFnLCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIG51bV9saW5lcywgbnVtX3dheXMsIGNhY2hlX3NpemUsIGxpbmVfc2l6ZTsKLQotCW51bV93YXlzID0gZGNhY2hlID8gWENIQUxfRENBQ0hFX1dBWVMgOiBYQ0hBTF9JQ0FDSEVfV0FZUzsKLQljYWNoZV9zaXplID0gZGNhY2hlID8gWENIQUxfRENBQ0hFX1NJWkUgOiBYQ0hBTF9JQ0FDSEVfU0laRTsKLQlsaW5lX3NpemUgPSBkY2FjaGUgPyBYQ0hBTF9EQ0FDSEVfTElORVNJWkUgOiBYQ0hBTF9JQ0FDSEVfTElORVNJWkU7Ci0KLQludW1fbGluZXMgPSBjYWNoZV9zaXplIC8gbnVtX3dheXM7Ci0KLQlzID0gMDsgZSA9IG51bV9saW5lczsKLQotCWlmIChpZHggPj0gMCkKLQkJZSA9IChzID0gaWR4ICogbGluZV9zaXplKSArIDE7Ci0KLQlmb3IgKGkgPSBzOyBpIDwgZTsgaSs9IGxpbmVfc2l6ZSkgewotCQlwcmludGsoIlxubGluZSAlIzA4eDoiLCBpKTsKLQkJZm9yICh3ID0gMDsgdyA8IG51bV93YXlzOyB3KyspIHsKLQkJCWluZGV4ID0gdyAqIG51bV9saW5lcyArIGk7Ci0JCQlpZiAoZGNhY2hlKQotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZGN0ICUwLCAlMVxuXHQiCi0JCQkJCQk6ICI9YSIodGFnKSA6ICJhIihpbmRleCkpOwotCQkJZWxzZQotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJsaWN0ICUwLCAlMVxuXHQiCi0JCQkJCQk6ICI9YSIodGFnKSA6ICJhIihpbmRleCkpOwotCi0JCQlwcmludGsoIiAlIzAxMGx4IiwgdGFnKTsKLQkJfQotCX0KLQlwcmludGsgKCJcbiIpOwotfQotCi12b2lkIGR1bXBfaWNhY2hlKGludCBpbmRleCkKLXsKLQl1bnNpZ25lZCBsb25nIGRhdGEsIGFkZHI7Ci0JaW50IHcsIGk7Ci0KLQljb25zdCB1bnNpZ25lZCBsb25nIG51bV93YXlzID0gWENIQUxfSUNBQ0hFX1dBWVM7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBjYWNoZV9zaXplID0gWENIQUxfSUNBQ0hFX1NJWkU7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBsaW5lX3NpemUgPSBYQ0hBTF9JQ0FDSEVfTElORVNJWkU7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBudW1fbGluZXMgPSBjYWNoZV9zaXplIC8gbnVtX3dheXMgLyBsaW5lX3NpemU7Ci0KLQlmb3IgKHcgPSAwOyB3IDwgbnVtX3dheXM7IHcrKykgewotCQlwcmludGsgKCJcbldheSAlZCIsIHcpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBsaW5lX3NpemU7IGkrPSA0KSB7Ci0JCQlhZGRyID0gdyAqIG51bV9saW5lcyArIGluZGV4ICogbGluZV9zaXplICsgaTsKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJsaWN3ICUwLCAlMVxuXHQiCi0JCQkJCTogIj1hIihkYXRhKSA6ICJhIihhZGRyKSk7Ci0JCQlwcmludGsoIiAlIzAxMGx4IiwgZGF0YSk7Ci0JCX0KLQl9Ci0JcHJpbnRrICgiXG4iKTsKLX0KLQotdm9pZCBkdW1wX2NhY2hlX3RhZ3Modm9pZCkKLXsKLQlwcmludGsoIkluc3RydWN0aW9uIGNhY2hlXG4iKTsKLQlkdW1wX2NhY2hlX3RhZygwLCAtMSk7Ci0JcHJpbnRrKCJEYXRhIGNhY2hlXG4iKTsKLQlkdW1wX2NhY2hlX3RhZygxLCAtMSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL2NvbnNvbGUuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9jb25zb2xlLmMKaW5kZXggNWM5NDdjYS4uMmY0ZjIwZiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL2NvbnNvbGUuYworKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvY29uc29sZS5jCkBAIC0yNSwxMSArMjUsMTUgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotI2luY2x1ZGUgPHh0ZW5zYS9zaW1jYWxsLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtL3NpbWNhbGwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAKKyNpZmRlZiBTRVJJQUxfSU5MSU5FCisjZGVmaW5lIF9JTkxJTkVfIGlubGluZQorI2VuZGlmCisKICNkZWZpbmUgU0VSSUFMX01BWF9OVU1fTElORVMgMQogI2RlZmluZSBTRVJJQUxfVElNRVJfVkFMVUUgKDIwICogSFopCiAKQEAgLTE5MSw3ICsxOTUsNyBAQAogfQogCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc2VyaWFsX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc2VyaWFsX29wcyA9IHsKIAkub3BlbiA9IHJzX29wZW4sCiAJLmNsb3NlID0gcnNfY2xvc2UsCiAJLndyaXRlID0gcnNfd3JpdGUsCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvbmV0d29yay5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL25ldHdvcmsuYwppbmRleCAxNWQ2NDQxLi44ZWJmYzg3IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvbmV0d29yay5jCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9uZXR3b3JrLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCi0jaW5jbHVkZSA8eHRlbnNhL3NpbWNhbGwuaD4KKyNpbmNsdWRlIDxhc20vcGxhdGZvcm0vc2ltY2FsbC5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJpc3MtbmV0ZGV2IgogI2RlZmluZSBFVEhfTUFYX1BBQ0tFVCAxNTAwCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCA4Mzc2NmE2Li5hNTBmNDgxIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCisrKyBiL2Jsb2NrL0tjb25maWcKQEAgLTE5LDExICsxOSw5IEBACiAKIGlmIEJMT0NLCiAKLSNYWFggLSBpdCBtYWtlcyBzZW5zZSB0byBlbmFibGUgdGhpcyBvbmx5IGZvciAzMi1iaXQgc3ViYXJjaCdzLCBub3QgZm9yIHg4Nl82NAotI2ZvciBpbnN0YW5jZS4KIGNvbmZpZyBMQkQKIAlib29sICJTdXBwb3J0IGZvciBMYXJnZSBCbG9jayBEZXZpY2VzIgotCWRlcGVuZHMgb24gWDg2IHx8IChNSVBTICYmIDMyQklUKSB8fCBQUEMzMiB8fCAoUzM5MCAmJiAhNjRCSVQpIHx8IFNVUEVSSCB8fCBVTUwKKwlkZXBlbmRzIG9uICE2NEJJVAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYXR0YWNoIGxhcmdlIChiaWdnZXIgdGhhbiAyVEIpIGRpc2NzIHRvCiAJICB5b3VyIG1hY2hpbmUsIG9yIGlmIHlvdSB3YW50IHRvIGhhdmUgYSByYWlkIG9yIGxvb3BiYWNrIGRldmljZQpAQCAtNDQsNyArNDIsNyBAQAogCiBjb25maWcgTFNGCiAJYm9vbCAiU3VwcG9ydCBmb3IgTGFyZ2UgU2luZ2xlIEZpbGVzIgotCWRlcGVuZHMgb24gWDg2IHx8IChNSVBTICYmIDMyQklUKSB8fCBQUEMzMiB8fCBBUkNIX1MzOTBfMzEgfHwgU1VQRVJIIHx8IFVNTAorCWRlcGVuZHMgb24gITY0QklUCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGhhbmRsZSB2ZXJ5IGxhcmdlIGZpbGVzIChiaWdnZXIKIAkgIHRoYW4gMlRCKSwgb3RoZXJ3aXNlIHNheSBOLgpkaWZmIC0tZ2l0IGEvYmxvY2svYXMtaW9zY2hlZC5jIGIvYmxvY2svYXMtaW9zY2hlZC5jCmluZGV4IDUwYjk1ZTRjLi5lZjEyNjI3IDEwMDY0NAotLS0gYS9ibG9jay9hcy1pb3NjaGVkLmMKKysrIGIvYmxvY2svYXMtaW9zY2hlZC5jCkBAIC0xMjc0LDkgKzEyNzQsMTAgQEAKICAqCiAgKiBGSVhNRSEgZGlzcGF0Y2ggcXVldWUgaXMgbm90IGEgcXVldWUgYXQgYWxsIQogICovCi1zdGF0aWMgdm9pZCBhc193b3JrX2hhbmRsZXIodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGFzX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkYXRhOworCXN0cnVjdCBhc19kYXRhICphZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXNfZGF0YSwgYW50aWNfd29yayk7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBhZC0+cTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwpAQCAtMTMxNyw3ICsxMzE4LDcgQEAKIC8qCiAgKiBpbml0aWFsaXplIGVsZXZhdG9yIHByaXZhdGUgZGF0YSAoYXNfZGF0YSkuCiAgKi8KLXN0YXRpYyB2b2lkICphc19pbml0X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgZWxldmF0b3JfdCAqZSkKK3N0YXRpYyB2b2lkICphc19pbml0X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSkKIHsKIAlzdHJ1Y3QgYXNfZGF0YSAqYWQ7CiAKQEAgLTEzMzIsNyArMTMzMyw3IEBACiAJYWQtPmFudGljX3RpbWVyLmZ1bmN0aW9uID0gYXNfYW50aWNfdGltZW91dDsKIAlhZC0+YW50aWNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXE7CiAJaW5pdF90aW1lcigmYWQtPmFudGljX3RpbWVyKTsKLQlJTklUX1dPUksoJmFkLT5hbnRpY193b3JrLCBhc193b3JrX2hhbmRsZXIsIHEpOworCUlOSVRfV09SSygmYWQtPmFudGljX3dvcmssIGFzX3dvcmtfaGFuZGxlcik7CiAKIAlJTklUX0xJU1RfSEVBRCgmYWQtPmZpZm9fbGlzdFtSRVFfU1lOQ10pOwogCUlOSVRfTElTVF9IRUFEKCZhZC0+Zmlmb19saXN0W1JFUV9BU1lOQ10pOwpAQCAtMTQ2MSwyMCArMTQ2Miw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFzX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZWx2X3JlZ2lzdGVyKCZpb3NjaGVkX2FzKTsKLQlpZiAoIXJldCkgewotCQkvKgotCQkgKiBkb24ndCBhbGxvdyBBUyB0byBnZXQgdW5yZWdpc3RlcmVkLCBzaW5jZSB3ZSB3b3VsZCBoYXZlCi0JCSAqIHRvIGJyb3dzZSBhbGwgdGFza3MgaW4gdGhlIHN5c3RlbSBhbmQgcmVsZWFzZSB0aGVpcgotCQkgKiBhc19pb19jb250ZXh0IGZpcnN0Ci0JCSAqLwotCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBlbHZfcmVnaXN0ZXIoJmlvc2NoZWRfYXMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXNfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrdHJhY2UuYyBiL2Jsb2NrL2Jsa3RyYWNlLmMKaW5kZXggMTM1NTkzYy4uZDM2NzlkZCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrdHJhY2UuYworKysgYi9ibG9jay9ibGt0cmFjZS5jCkBAIC0yMiwzMCArMjIsNTggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nIGxvbmcsIGJsa190cmFjZV9jcHVfb2Zmc2V0KSA9IHsgMCwgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmxrdHJhY2Vfc2VxIF9fcmVhZF9tb3N0bHkgPSAxOwogCiAvKgorICogU2VuZCBvdXQgYSBub3RpZnkgbWVzc2FnZS4KKyAqLworc3RhdGljIHZvaWQgdHJhY2Vfbm90ZShzdHJ1Y3QgYmxrX3RyYWNlICpidCwgcGlkX3QgcGlkLCBpbnQgYWN0aW9uLAorCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgYmxrX2lvX3RyYWNlICp0OworCisJdCA9IHJlbGF5X3Jlc2VydmUoYnQtPnJjaGFuLCBzaXplb2YoKnQpICsgbGVuKTsKKwlpZiAodCkgeworCQljb25zdCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJCXQtPm1hZ2ljID0gQkxLX0lPX1RSQUNFX01BR0lDIHwgQkxLX0lPX1RSQUNFX1ZFUlNJT047CisJCXQtPnRpbWUgPSBzY2hlZF9jbG9jaygpIC0gcGVyX2NwdShibGtfdHJhY2VfY3B1X29mZnNldCwgY3B1KTsKKwkJdC0+ZGV2aWNlID0gYnQtPmRldjsKKwkJdC0+YWN0aW9uID0gYWN0aW9uOworCQl0LT5waWQgPSBwaWQ7CisJCXQtPmNwdSA9IGNwdTsKKwkJdC0+cGR1X2xlbiA9IGxlbjsKKwkJbWVtY3B5KCh2b2lkICopIHQgKyBzaXplb2YoKnQpLCBkYXRhLCBsZW4pOworCX0KK30KKworLyoKICAqIFNlbmQgb3V0IGEgbm90aWZ5IGZvciB0aGlzIHByb2Nlc3MsIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBzaW5jZSBhIHRyYWNlCiAgKiBzdGFydGVkCiAgKi8KIHN0YXRpYyB2b2lkIHRyYWNlX25vdGVfdHNrKHN0cnVjdCBibGtfdHJhY2UgKmJ0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlzdHJ1Y3QgYmxrX2lvX3RyYWNlICp0OworCXRzay0+YnRyYWNlX3NlcSA9IGJsa3RyYWNlX3NlcTsKKwl0cmFjZV9ub3RlKGJ0LCB0c2stPnBpZCwgQkxLX1ROX1BST0NFU1MsIHRzay0+Y29tbSwgc2l6ZW9mKHRzay0+Y29tbSkpOworfQogCi0JdCA9IHJlbGF5X3Jlc2VydmUoYnQtPnJjaGFuLCBzaXplb2YoKnQpICsgc2l6ZW9mKHRzay0+Y29tbSkpOwotCWlmICh0KSB7Ci0JCXQtPm1hZ2ljID0gQkxLX0lPX1RSQUNFX01BR0lDIHwgQkxLX0lPX1RSQUNFX1ZFUlNJT047Ci0JCXQtPmRldmljZSA9IGJ0LT5kZXY7Ci0JCXQtPmFjdGlvbiA9IEJMS19UQ19BQ1QoQkxLX1RDX05PVElGWSk7Ci0JCXQtPnBpZCA9IHRzay0+cGlkOwotCQl0LT5jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCXQtPnBkdV9sZW4gPSBzaXplb2YodHNrLT5jb21tKTsKLQkJbWVtY3B5KCh2b2lkICopIHQgKyBzaXplb2YoKnQpLCB0c2stPmNvbW0sIHQtPnBkdV9sZW4pOwotCQl0c2stPmJ0cmFjZV9zZXEgPSBibGt0cmFjZV9zZXE7Ci0JfQorc3RhdGljIHZvaWQgdHJhY2Vfbm90ZV90aW1lKHN0cnVjdCBibGtfdHJhY2UgKmJ0KQoreworCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgd29yZHNbMl07CisKKwlnZXRuc3RpbWVvZmRheSgmbm93KTsKKwl3b3Jkc1swXSA9IG5vdy50dl9zZWM7CisJd29yZHNbMV0gPSBub3cudHZfbnNlYzsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl0cmFjZV9ub3RlKGJ0LCAwLCBCTEtfVE5fVElNRVNUQU1QLCB3b3Jkcywgc2l6ZW9mKHdvcmRzKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IGFjdF9sb2dfY2hlY2soc3RydWN0IGJsa190cmFjZSAqYnQsIHUzMiB3aGF0LCBzZWN0b3JfdCBzZWN0b3IsCkBAIC0zNjYsOCArMzk0LDcgQEAKIAlpZiAoYnQpIHsKIAkJaWYgKGJ0LT5kcm9wcGVkX2ZpbGUpCiAJCQlkZWJ1Z2ZzX3JlbW92ZShidC0+ZHJvcHBlZF9maWxlKTsKLQkJaWYgKGJ0LT5zZXF1ZW5jZSkKLQkJCWZyZWVfcGVyY3B1KGJ0LT5zZXF1ZW5jZSk7CisJCWZyZWVfcGVyY3B1KGJ0LT5zZXF1ZW5jZSk7CiAJCWlmIChidC0+cmNoYW4pCiAJCQlyZWxheV9jbG9zZShidC0+cmNoYW4pOwogCQlrZnJlZShidCk7CkBAIC0zOTQsNiArNDIxLDggQEAKIAkJCWJsa3RyYWNlX3NlcSsrOwogCQkJc21wX21iKCk7CiAJCQlidC0+dHJhY2Vfc3RhdGUgPSBCbGt0cmFjZV9ydW5uaW5nOworCisJCQl0cmFjZV9ub3RlX3RpbWUoYnQpOwogCQkJcmV0ID0gMDsKIAkJfQogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9ibG9jay9jZnEtaW9zY2hlZC5jIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCBkM2Q3NjEzLi41MzNhMjkzIDEwMDY0NAotLS0gYS9ibG9jay9jZnEtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTQzLDggKzQzLDggQEAKICNkZWZpbmUgUlFfQ0lDKHJxKQkJKChzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQqKShycSktPmVsZXZhdG9yX3ByaXZhdGUpCiAjZGVmaW5lIFJRX0NGUVEocnEpCQkoKHJxKS0+ZWxldmF0b3JfcHJpdmF0ZTIpCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmNmcV9wb29sOwotc3RhdGljIGttZW1fY2FjaGVfdCAqY2ZxX2lvY19wb29sOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpjZnFfcG9vbDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY2ZxX2lvY19wb29sOwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgaW9jX2NvdW50KTsKIHN0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiAqaW9jX2dvbmU7CkBAIC0yMTksOSArMjE5LDEyIEBACiAJcmV0dXJuICFjZnFkLT5idXN5X3F1ZXVlczsKIH0KIAotc3RhdGljIGlubGluZSBwaWRfdCBjZnFfcXVldWVfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJ3KQorc3RhdGljIGlubGluZSBwaWRfdCBjZnFfcXVldWVfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJ3LCBpbnQgaXNfc3luYykKIHsKLQlpZiAocncgPT0gUkVBRCB8fCBydyA9PSBXUklURV9TWU5DKQorCS8qCisJICogVXNlIHRoZSBwZXItcHJvY2VzcyBxdWV1ZSwgZm9yIHJlYWQgcmVxdWVzdHMgYW5kIHN5bmNyb25vdXMgd3JpdGVzCisJICovCisJaWYgKCEocncgJiBSRVFfUlcpIHx8IGlzX3N5bmMpCiAJCXJldHVybiB0YXNrLT5waWQ7CiAKIAlyZXR1cm4gQ0ZRX0tFWV9BU1lOQzsKQEAgLTQ1Niw2ICs0NTksOSBAQAogCSAqLwogCXdoaWxlICgoX19hbGlhcyA9IGVsdl9yYl9hZGQoJmNmcXEtPnNvcnRfbGlzdCwgcnEpKSAhPSBOVUxMKQogCQljZnFfZGlzcGF0Y2hfaW5zZXJ0KGNmcWQtPnF1ZXVlLCBfX2FsaWFzKTsKKworCWlmICghY2ZxX2NmcXFfb25fcnIoY2ZxcSkpCisJCWNmcV9hZGRfY2ZxcV9ycihjZnFkLCBjZnFxKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC00NzAsNyArNDc2LDcgQEAKIGNmcV9maW5kX3JxX2ZtZXJnZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JcGlkX3Qga2V5ID0gY2ZxX3F1ZXVlX3BpZCh0c2ssIGJpb19kYXRhX2RpcihiaW8pKTsKKwlwaWRfdCBrZXkgPSBjZnFfcXVldWVfcGlkKHRzaywgYmlvX2RhdGFfZGlyKGJpbyksIGJpb19zeW5jKGJpbykpOwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7CiAKIAljZnFxID0gY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5LCB0c2stPmlvcHJpbyk7CkBAIC0xMjE1LDExICsxMjIxLDEyIEBACiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ljLT5rZXk7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHVubGlrZWx5KCFjZnFkKSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCiAJY2ZxcSA9IGNpYy0+Y2ZxcVtBU1lOQ107CiAJaWYgKGNmcXEpIHsKQEAgLTEyMzYsNyArMTI0Myw3IEBACiAJaWYgKGNmcXEpCiAJCWNmcV9tYXJrX2NmcXFfcHJpb19jaGFuZ2VkKGNmcXEpOwogCi0Jc3Bpbl91bmxvY2soY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgY2ZxX2lvY19zZXRfaW9wcmlvKHN0cnVjdCBpb19jb250ZXh0ICppb2MpCkBAIC0xMzYyLDYgKzEzNjksNyBAQAogCXN0cnVjdCByYl9ub2RlICoqcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50OwogCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqX19jaWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkICprOwogCiAJY2ljLT5pb2MgPSBpb2M7CkBAIC0xMzkxLDkgKzEzOTksOSBAQAogCXJiX2xpbmtfbm9kZSgmY2ljLT5yYl9ub2RlLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcigmY2ljLT5yYl9ub2RlLCAmaW9jLT5jaWNfcm9vdCk7CiAKLQlzcGluX2xvY2tfaXJxKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkKCZjaWMtPnF1ZXVlX2xpc3QsICZjZnFkLT5jaWNfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiB9CiAKIC8qCkBAIC0xNDU5LDggKzE0NjcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotY2ZxX3VwZGF0ZV9pb19zZWVrdGltZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljLAotCQkgICAgICAgc3RydWN0IHJlcXVlc3QgKnJxKQorY2ZxX3VwZGF0ZV9pb19zZWVrdGltZShzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYywgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCXNlY3Rvcl90IHNkaXN0OwogCXU2NCB0b3RhbDsKQEAgLTE2MTIsNyArMTYxOSw3IEBACiAJfQogCiAJY2ZxX3VwZGF0ZV9pb190aGlua3RpbWUoY2ZxZCwgY2ljKTsKLQljZnFfdXBkYXRlX2lvX3NlZWt0aW1lKGNmcWQsIGNpYywgcnEpOworCWNmcV91cGRhdGVfaW9fc2Vla3RpbWUoY2ljLCBycSk7CiAJY2ZxX3VwZGF0ZV9pZGxlX3dpbmRvdyhjZnFkLCBjZnFxLCBjaWMpOwogCiAJY2ljLT5sYXN0X3F1ZXVlID0gamlmZmllczsKQEAgLTE2NTAsOSArMTY1Nyw2IEBACiAKIAljZnFfYWRkX3JxX3JiKHJxKTsKIAotCWlmICghY2ZxX2NmcXFfb25fcnIoY2ZxcSkpCi0JCWNmcV9hZGRfY2ZxcV9ycihjZnFkLCBjZnFxKTsKLQogCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZjZnFxLT5maWZvKTsKIAogCWNmcV9ycV9lbnF1ZXVlZChjZnFkLCBjZnFxLCBycSk7CkBAIC0xNzQ3LDYgKzE3NTEsOSBAQAogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOworCXVuc2lnbmVkIGludCBrZXk7CisKKwlrZXkgPSBjZnFfcXVldWVfcGlkKHRzaywgcncsIHJ3ICYgUkVRX1JXX1NZTkMpOwogCiAJLyoKIAkgKiBkb24ndCBmb3JjZSBzZXR1cCBvZiBhIHF1ZXVlIGZyb20gaGVyZSwgYXMgYSBjYWxsIHRvIG1heV9xdWV1ZQpAQCAtMTc1NCw3ICsxNzYxLDcgQEAKIAkgKiBzbyBqdXN0IGxvb2t1cCBhIHBvc3NpYmx5IGV4aXN0aW5nIHF1ZXVlLCBvciByZXR1cm4gJ21heSBxdWV1ZScKIAkgKiBpZiB0aGF0IGZhaWxzCiAJICovCi0JY2ZxcSA9IGNmcV9maW5kX2NmcV9oYXNoKGNmcWQsIGNmcV9xdWV1ZV9waWQodHNrLCBydyksIHRzay0+aW9wcmlvKTsKKwljZnFxID0gY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5LCB0c2stPmlvcHJpbyk7CiAJaWYgKGNmcXEpIHsKIAkJY2ZxX2luaXRfcHJpb19kYXRhKGNmcXEpOwogCQljZnFfcHJpb19ib29zdChjZnFxKTsKQEAgLTE3NjgsNyArMTc3NSw3IEBACiAvKgogICogcXVldWUgbG9jayBoZWxkIGhlcmUKICAqLwotc3RhdGljIHZvaWQgY2ZxX3B1dF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIHZvaWQgY2ZxX3B1dF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gUlFfQ0ZRUShycSk7CiAKQEAgLTE3OTcsMTAgKzE4MDQsMTAgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CiAJY29uc3QgaW50IHJ3ID0gcnFfZGF0YV9kaXIocnEpOwotCXBpZF90IGtleSA9IGNmcV9xdWV1ZV9waWQodHNrLCBydyk7CisJY29uc3QgaW50IGlzX3N5bmMgPSBycV9pc19zeW5jKHJxKTsKKwlwaWRfdCBrZXkgPSBjZnFfcXVldWVfcGlkKHRzaywgcncsIGlzX3N5bmMpOwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaXNfc3luYyA9IGtleSAhPSBDRlFfS0VZX0FTWU5DOwogCiAJbWlnaHRfc2xlZXBfaWYoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKTsKIApAQCAtMTgzOSw5ICsxODQ2LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGNmcV9raWNrX3F1ZXVlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBjZnFfa2lja19xdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gZGF0YTsKKwlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNmcV9kYXRhLCB1bnBsdWdfd29yayk7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gY2ZxZC0+cXVldWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKQEAgLTE5NDksNyArMTk1OCw3IEBACiAJa2ZyZWUoY2ZxZCk7CiB9CiAKLXN0YXRpYyB2b2lkICpjZnFfaW5pdF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGVsZXZhdG9yX3QgKmUpCitzdGF0aWMgdm9pZCAqY2ZxX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZDsKIAlpbnQgaTsKQEAgLTE5ODUsNyArMTk5NCw3IEBACiAJY2ZxZC0+aWRsZV9jbGFzc190aW1lci5mdW5jdGlvbiA9IGNmcV9pZGxlX2NsYXNzX3RpbWVyOwogCWNmcWQtPmlkbGVfY2xhc3NfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjZnFkOwogCi0JSU5JVF9XT1JLKCZjZnFkLT51bnBsdWdfd29yaywgY2ZxX2tpY2tfcXVldWUsIHEpOworCUlOSVRfV09SSygmY2ZxZC0+dW5wbHVnX3dvcmssIGNmcV9raWNrX3F1ZXVlKTsKIAogCWNmcWQtPmNmcV9xdWFudHVtID0gY2ZxX3F1YW50dW07CiAJY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlWzBdID0gY2ZxX2ZpZm9fZXhwaXJlWzBdOwpkaWZmIC0tZ2l0IGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCmluZGV4IGI3YzViMzQuLjZkNjczZTkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYworKysgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogLyoKICAqIGluaXRpYWxpemUgZWxldmF0b3IgcHJpdmF0ZSBkYXRhIChkZWFkbGluZV9kYXRhKS4KICAqLwotc3RhdGljIHZvaWQgKmRlYWRsaW5lX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBlbGV2YXRvcl90ICplKQorc3RhdGljIHZvaWQgKmRlYWRsaW5lX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCXN0cnVjdCBkZWFkbGluZV9kYXRhICpkZDsKIApkaWZmIC0tZ2l0IGEvYmxvY2svZWxldmF0b3IuYyBiL2Jsb2NrL2VsZXZhdG9yLmMKaW5kZXggOGNjZDE2My4uYzAwNjNmMyAxMDA2NDQKLS0tIGEvYmxvY2svZWxldmF0b3IuYworKysgYi9ibG9jay9lbGV2YXRvci5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAogc3RhdGljIHZvaWQgKmVsZXZhdG9yX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmVxKQogewotCXJldHVybiBlcS0+b3BzLT5lbGV2YXRvcl9pbml0X2ZuKHEsIGVxKTsKKwlyZXR1cm4gZXEtPm9wcy0+ZWxldmF0b3JfaW5pdF9mbihxKTsKIH0KIAogc3RhdGljIHZvaWQgZWxldmF0b3JfYXR0YWNoKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGVsZXZhdG9yX3F1ZXVlICplcSwKQEAgLTgxMCw3ICs4MTAsNyBAQAogCWVsZXZhdG9yX3QgKmUgPSBxLT5lbGV2YXRvcjsKIAogCWlmIChlLT5vcHMtPmVsZXZhdG9yX3B1dF9yZXFfZm4pCi0JCWUtPm9wcy0+ZWxldmF0b3JfcHV0X3JlcV9mbihxLCBycSk7CisJCWUtPm9wcy0+ZWxldmF0b3JfcHV0X3JlcV9mbihycSk7CiB9CiAKIGludCBlbHZfbWF5X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggNjUzOTE5ZC4uNDU3ZmRhYyAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC00MTcsNiArNDE3LDM0IEBACiAJLnNob3cJPSBkaXNrX3N0YXRzX3JlYWQKIH07CiAKKyNpZmRlZiBDT05GSUdfRkFJTF9NQUtFX1JFUVVFU1QKKworc3RhdGljIHNzaXplX3QgZGlza19mYWlsX3N0b3JlKHN0cnVjdCBnZW5kaXNrICogZGlzaywKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaTsKKworCWlmIChjb3VudCA+IDAgJiYgc3NjYW5mKGJ1ZiwgIiVkIiwgJmkpID4gMCkgeworCQlpZiAoaSA9PSAwKQorCQkJZGlzay0+ZmxhZ3MgJj0gfkdFTkhEX0ZMX0ZBSUw7CisJCWVsc2UKKwkJCWRpc2stPmZsYWdzIHw9IEdFTkhEX0ZMX0ZBSUw7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3QgZGlza19mYWlsX3JlYWQoc3RydWN0IGdlbmRpc2sgKiBkaXNrLCBjaGFyICpwYWdlKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9GQUlMID8gMSA6IDApOworfQorc3RhdGljIHN0cnVjdCBkaXNrX2F0dHJpYnV0ZSBkaXNrX2F0dHJfZmFpbCA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJtYWtlLWl0LWZhaWwiLCAubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCisJLnN0b3JlCT0gZGlza19mYWlsX3N0b3JlLAorCS5zaG93CT0gZGlza19mYWlsX3JlYWQKK307CisKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGRlZmF1bHRfYXR0cnNbXSA9IHsKIAkmZGlza19hdHRyX3VldmVudC5hdHRyLAogCSZkaXNrX2F0dHJfZGV2LmF0dHIsCkBAIC00MjQsNiArNDUyLDkgQEAKIAkmZGlza19hdHRyX3JlbW92YWJsZS5hdHRyLAogCSZkaXNrX2F0dHJfc2l6ZS5hdHRyLAogCSZkaXNrX2F0dHJfc3RhdC5hdHRyLAorI2lmZGVmIENPTkZJR19GQUlMX01BS0VfUkVRVUVTVAorCSZkaXNrX2F0dHJfZmFpbC5hdHRyLAorI2VuZGlmCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2lvY3RsLmMgYi9ibG9jay9pb2N0bC5jCmluZGV4IDU4YWFiNjMuLmY2OTYyYjYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2lvY3RsLmMKKysrIGIvYmxvY2svaW9jdGwuYwpAQCAtNzIsNyArNzIsNyBAQAogCQkJYmRldnAgPSBiZGdldF9kaXNrKGRpc2ssIHBhcnQpOwogCQkJaWYgKCFiZGV2cCkKIAkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCW11dGV4X2xvY2tfbmVzdGVkKCZiZGV2cC0+YmRfbXV0ZXgsIEJEX01VVEVYX1BBUlRJVElPTik7CisJCQltdXRleF9sb2NrKCZiZGV2cC0+YmRfbXV0ZXgpOwogCQkJaWYgKGJkZXZwLT5iZF9vcGVuZXJzKSB7CiAJCQkJbXV0ZXhfdW5sb2NrKCZiZGV2cC0+YmRfbXV0ZXgpOwogCQkJCWJkcHV0KGJkZXZwKTsKQEAgLTgyLDcgKzgyLDcgQEAKIAkJCWZzeW5jX2JkZXYoYmRldnApOwogCQkJaW52YWxpZGF0ZV9iZGV2KGJkZXZwLCAwKTsKIAotCQkJbXV0ZXhfbG9ja19uZXN0ZWQoJmJkZXYtPmJkX211dGV4LCBCRF9NVVRFWF9XSE9MRSk7CisJCQltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7CiAJCQlkZWxldGVfcGFydGl0aW9uKGRpc2ssIHBhcnQpOwogCQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7CiAJCQltdXRleF91bmxvY2soJmJkZXZwLT5iZF9tdXRleCk7CkBAIC0yOTAsNyArMjkwLDcgQEAKICAgIEVOT0lPQ1RMQ01EIGZvciB1bmtub3duIGlvY3Rscy4gKi8KIGxvbmcgY29tcGF0X2Jsa2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfYmRldjsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9iZGV2OwogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKIAlpbnQgcmV0ID0gLUVOT0lPQ1RMQ01EOwogCWlmIChkaXNrLT5mb3BzLT5jb21wYXRfaW9jdGwpIHsKZGlmZiAtLWdpdCBhL2Jsb2NrL2xsX3J3X2Jsay5jIGIvYmxvY2svbGxfcndfYmxrLmMKaW5kZXggYzg0N2UxNy4uNzk4MDdkYiAxMDA2NDQKLS0tIGEvYmxvY2svbGxfcndfYmxrLmMKKysrIGIvYmxvY2svbGxfcndfYmxrLmMKQEAgLTI1LDE2ICsyNSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3RyYWNlX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgogCiAvKgogICogZm9yIG1heCBzZW5zZSBzaXplCiAgKi8KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogCi1zdGF0aWMgdm9pZCBibGtfdW5wbHVnX3dvcmsodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBibGtfdW5wbHVnX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIGJsa191bnBsdWdfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOwogc3RhdGljIHZvaWQgZHJpdmVfc3RhdF9hY2N0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IG5yX3NlY3RvcnMsIGludCBuZXdfaW8pOwogc3RhdGljIHZvaWQgaW5pdF9yZXF1ZXN0X2Zyb21fYmlvKHN0cnVjdCByZXF1ZXN0ICpyZXEsIHN0cnVjdCBiaW8gKmJpbyk7CkBAIC00NCwyMiArNDYsMTcgQEAKIC8qCiAgKiBGb3IgdGhlIGFsbG9jYXRlZCByZXF1ZXN0IHRhYmxlcwogICovCi1zdGF0aWMga21lbV9jYWNoZV90ICpyZXF1ZXN0X2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcmVxdWVzdF9jYWNoZXA7CiAKIC8qCiAgKiBGb3IgcXVldWUgYWxsb2NhdGlvbgogICovCi1zdGF0aWMga21lbV9jYWNoZV90ICpyZXF1ZXN0cV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJlcXVlc3RxX2NhY2hlcDsKIAogLyoKICAqIEZvciBpbyBjb250ZXh0IGFsbG9jYXRpb25zCiAgKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmlvY29udGV4dF9jYWNoZXA7Ci0KLXN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBjb25nZXN0aW9uX3dxaFsyXSA9IHsKLQkJX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIoY29uZ2VzdGlvbl93cWhbMF0pLAotCQlfX1dBSVRfUVVFVUVfSEVBRF9JTklUSUFMSVpFUihjb25nZXN0aW9uX3dxaFsxXSkKLQl9Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppb2NvbnRleHRfY2FjaGVwOwogCiAvKgogICogQ29udHJvbGxpbmcgc3RydWN0dXJlIHRvIGtibG9ja2QKQEAgLTExMiwzNSArMTA5LDYgQEAKIAlxLT5ucl9jb25nZXN0aW9uX29mZiA9IG5yOwogfQogCi0vKgotICogQSBxdWV1ZSBoYXMganVzdCBleGl0dGVkIGNvbmdlc3Rpb24uICBOb3RlIHRoaXMgaW4gdGhlIGdsb2JhbCBjb3VudGVyIG9mCi0gKiBjb25nZXN0ZWQgcXVldWVzLCBhbmQgd2FrZSB1cCBhbnlvbmUgd2hvIHdhcyB3YWl0aW5nIGZvciByZXF1ZXN0cyB0byBiZQotICogcHV0IGJhY2suCi0gKi8KLXN0YXRpYyB2b2lkIGNsZWFyX3F1ZXVlX2Nvbmdlc3RlZChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKLXsKLQllbnVtIGJkaV9zdGF0ZSBiaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCA9ICZjb25nZXN0aW9uX3dxaFtyd107Ci0KLQliaXQgPSAocncgPT0gV1JJVEUpID8gQkRJX3dyaXRlX2Nvbmdlc3RlZCA6IEJESV9yZWFkX2Nvbmdlc3RlZDsKLQljbGVhcl9iaXQoYml0LCAmcS0+YmFja2luZ19kZXZfaW5mby5zdGF0ZSk7Ci0Jc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKLQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSh3cWgpKQotCQl3YWtlX3VwKHdxaCk7Ci19Ci0KLS8qCi0gKiBBIHF1ZXVlIGhhcyBqdXN0IGVudGVyZWQgY29uZ2VzdGlvbi4gIEZsYWcgdGhhdCBpbiB0aGUgcXVldWUncyBWTS12aXNpYmxlCi0gKiBzdGF0ZSBmbGFncyBhbmQgaW5jcmVtZW50IHRoZSBnbG9iYWwgZ291bnRlciBvZiBjb25nZXN0ZWQgcXVldWVzLgotICovCi1zdGF0aWMgdm9pZCBzZXRfcXVldWVfY29uZ2VzdGVkKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQotewotCWVudW0gYmRpX3N0YXRlIGJpdDsKLQotCWJpdCA9IChydyA9PSBXUklURSkgPyBCRElfd3JpdGVfY29uZ2VzdGVkIDogQkRJX3JlYWRfY29uZ2VzdGVkOwotCXNldF9iaXQoYml0LCAmcS0+YmFja2luZ19kZXZfaW5mby5zdGF0ZSk7Ci19Ci0KIC8qKgogICogYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvIC0gZ2V0IHRoZSBhZGRyZXNzIG9mIGEgcXVldWUncyBiYWNraW5nX2Rldl9pbmZvCiAgKiBAYmRldjoJZGV2aWNlCkBAIC0xNTksMTcgKzEyNyw4IEBACiAJCXJldCA9ICZxLT5iYWNraW5nX2Rldl9pbmZvOwogCXJldHVybiByZXQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0woYmxrX2dldF9iYWNraW5nX2Rldl9pbmZvKTsKIAotdm9pZCBibGtfcXVldWVfYWN0aXZpdHlfZm4ocmVxdWVzdF9xdWV1ZV90ICpxLCBhY3Rpdml0eV9mbiAqZm4sIHZvaWQgKmRhdGEpCi17Ci0JcS0+YWN0aXZpdHlfZm4gPSBmbjsKLQlxLT5hY3Rpdml0eV9kYXRhID0gZGF0YTsKLX0KLQotRVhQT1JUX1NZTUJPTChibGtfcXVldWVfYWN0aXZpdHlfZm4pOwotCiAvKioKICAqIGJsa19xdWV1ZV9wcmVwX3JxIC0gc2V0IGEgcHJlcGFyZV9yZXF1ZXN0IGZ1bmN0aW9uIGZvciBxdWV1ZQogICogQHE6CQlxdWV1ZQpAQCAtMjYzLDcgKzIyMiw3IEBACiAJaWYgKHEtPnVucGx1Z19kZWxheSA9PSAwKQogCQlxLT51bnBsdWdfZGVsYXkgPSAxOwogCi0JSU5JVF9XT1JLKCZxLT51bnBsdWdfd29yaywgYmxrX3VucGx1Z193b3JrLCBxKTsKKwlJTklUX1dPUksoJnEtPnVucGx1Z193b3JrLCBibGtfdW5wbHVnX3dvcmspOwogCiAJcS0+dW5wbHVnX3RpbWVyLmZ1bmN0aW9uID0gYmxrX3VucGx1Z190aW1lb3V0OwogCXEtPnVucGx1Z190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcTsKQEAgLTI3Miw4ICsyMzEsNiBAQAogCSAqIGJ5IGRlZmF1bHQgYXNzdW1lIG9sZCBiZWhhdmlvdXIgYW5kIGJvdW5jZSBmb3IgYW55IGhpZ2htZW0gcGFnZQogCSAqLwogCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQocSwgQkxLX0JPVU5DRV9ISUdIKTsKLQotCWJsa19xdWV1ZV9hY3Rpdml0eV9mbihxLCBOVUxMLCBOVUxMKTsKIH0KIAogRVhQT1JUX1NZTUJPTChibGtfcXVldWVfbWFrZV9yZXF1ZXN0KTsKQEAgLTE2NjcsOSArMTYyNCw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBibGtfdW5wbHVnX3dvcmsodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGJsa191bnBsdWdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxID0gZGF0YTsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBjb250YWluZXJfb2Yod29yaywgcmVxdWVzdF9xdWV1ZV90LCB1bnBsdWdfd29yayk7CiAKIAlibGtfYWRkX3RyYWNlX3BkdV9pbnQocSwgQkxLX1RBX1VOUExVR19JTywgTlVMTCwKIAkJCQlxLT5ycS5jb3VudFtSRUFEXSArIHEtPnJxLmNvdW50W1dSSVRFXSk7CkBAIC0yMDY3LDcgKzIwMjQsNyBAQAogCXN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsID0gJnEtPnJxOwogCiAJaWYgKHJsLT5jb3VudFtyd10gPCBxdWV1ZV9jb25nZXN0aW9uX29mZl90aHJlc2hvbGQocSkpCi0JCWNsZWFyX3F1ZXVlX2Nvbmdlc3RlZChxLCBydyk7CisJCWJsa19jbGVhcl9xdWV1ZV9jb25nZXN0ZWQocSwgcncpOwogCiAJaWYgKHJsLT5jb3VudFtyd10gKyAxIDw9IHEtPm5yX3JlcXVlc3RzKSB7CiAJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZybC0+d2FpdFtyd10pKQpAQCAtMjEwMSwxNSArMjA1OCwxNiBAQAogICogUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUsIHdpdGggcXVldWVfbG9jayBoZWxkLgogICogUmV0dXJucyAhTlVMTCBvbiBzdWNjZXNzLCB3aXRoIHF1ZXVlX2xvY2sgKm5vdCBoZWxkKi4KICAqLwotc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpnZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywgc3RydWN0IGJpbyAqYmlvLAotCQkJCSAgIGdmcF90IGdmcF9tYXNrKQorc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpnZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCByd19mbGFncywKKwkJCQkgICBzdHJ1Y3QgYmlvICpiaW8sIGdmcF90IGdmcF9tYXNrKQogewogCXN0cnVjdCByZXF1ZXN0ICpycSA9IE5VTEw7CiAJc3RydWN0IHJlcXVlc3RfbGlzdCAqcmwgPSAmcS0+cnE7CiAJc3RydWN0IGlvX2NvbnRleHQgKmlvYyA9IE5VTEw7CisJY29uc3QgaW50IHJ3ID0gcndfZmxhZ3MgJiAweDAxOwogCWludCBtYXlfcXVldWUsIHByaXY7CiAKLQltYXlfcXVldWUgPSBlbHZfbWF5X3F1ZXVlKHEsIHJ3KTsKKwltYXlfcXVldWUgPSBlbHZfbWF5X3F1ZXVlKHEsIHJ3X2ZsYWdzKTsKIAlpZiAobWF5X3F1ZXVlID09IEVMVl9NUVVFVUVfTk8pCiAJCWdvdG8gcnFfc3RhcnZlZDsKIApAQCAtMjEzNyw3ICsyMDk1LDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJc2V0X3F1ZXVlX2Nvbmdlc3RlZChxLCBydyk7CisJCWJsa19zZXRfcXVldWVfY29uZ2VzdGVkKHEsIHJ3KTsKIAl9CiAKIAkvKgpAQCAtMjE1Nyw3ICsyMTE1LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAotCXJxID0gYmxrX2FsbG9jX3JlcXVlc3QocSwgcncsIHByaXYsIGdmcF9tYXNrKTsKKwlycSA9IGJsa19hbGxvY19yZXF1ZXN0KHEsIHJ3X2ZsYWdzLCBwcml2LCBnZnBfbWFzayk7CiAJaWYgKHVubGlrZWx5KCFycSkpIHsKIAkJLyoKIAkJICogQWxsb2NhdGlvbiBmYWlsZWQgcHJlc3VtYWJseSBkdWUgdG8gbWVtb3J5LiBVbmRvIGFueXRoaW5nCkBAIC0yMjA1LDEyICsyMTYzLDEzIEBACiAgKgogICogQ2FsbGVkIHdpdGggcS0+cXVldWVfbG9jayBoZWxkLCBhbmQgcmV0dXJucyB3aXRoIGl0IHVubG9ja2VkLgogICovCi1zdGF0aWMgc3RydWN0IHJlcXVlc3QgKmdldF9yZXF1ZXN0X3dhaXQocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncsCitzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmdldF9yZXF1ZXN0X3dhaXQocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcndfZmxhZ3MsCiAJCQkJCXN0cnVjdCBiaW8gKmJpbykKIHsKKwljb25zdCBpbnQgcncgPSByd19mbGFncyAmIDB4MDE7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCi0JcnEgPSBnZXRfcmVxdWVzdChxLCBydywgYmlvLCBHRlBfTk9JTyk7CisJcnEgPSBnZXRfcmVxdWVzdChxLCByd19mbGFncywgYmlvLCBHRlBfTk9JTyk7CiAJd2hpbGUgKCFycSkgewogCQlERUZJTkVfV0FJVCh3YWl0KTsKIAkJc3RydWN0IHJlcXVlc3RfbGlzdCAqcmwgPSAmcS0+cnE7CkBAIC0yMjE4LDcgKzIxNzcsNyBAQAogCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCZybC0+d2FpdFtyd10sICZ3YWl0LAogCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAotCQlycSA9IGdldF9yZXF1ZXN0KHEsIHJ3LCBiaW8sIEdGUF9OT0lPKTsKKwkJcnEgPSBnZXRfcmVxdWVzdChxLCByd19mbGFncywgYmlvLCBHRlBfTk9JTyk7CiAKIAkJaWYgKCFycSkgewogCQkJc3RydWN0IGlvX2NvbnRleHQgKmlvYzsKQEAgLTIzNTgsNiArMjMxNyw4NCBAQAogCiBFWFBPUlRfU1lNQk9MKGJsa19pbnNlcnRfcmVxdWVzdCk7CiAKK3N0YXRpYyBpbnQgX19ibGtfcnFfdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYmlvKSB7CisJCWlmIChiaW9fZmxhZ2dlZChiaW8sIEJJT19VU0VSX01BUFBFRCkpCisJCQliaW9fdW5tYXBfdXNlcihiaW8pOworCQllbHNlCisJCQlyZXQgPSBiaW9fdW5jb3B5X3VzZXIoYmlvKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fYmxrX3JxX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkJICAgICB2b2lkIF9fdXNlciAqdWJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIHVhZGRyOworCXN0cnVjdCBiaW8gKmJpbywgKm9yaWdfYmlvOworCWludCByZWFkaW5nLCByZXQ7CisKKwlyZWFkaW5nID0gcnFfZGF0YV9kaXIocnEpID09IFJFQUQ7CisKKwkvKgorCSAqIGlmIGFsaWdubWVudCByZXF1aXJlbWVudCBpcyBzYXRpc2ZpZWQsIG1hcCBpbiB1c2VyIHBhZ2VzIGZvcgorCSAqIGRpcmVjdCBkbWEuIGVsc2UsIHNldCB1cCBrZXJuZWwgYm91bmNlIGJ1ZmZlcnMKKwkgKi8KKwl1YWRkciA9ICh1bnNpZ25lZCBsb25nKSB1YnVmOworCWlmICghKHVhZGRyICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkgJiYgIShsZW4gJiBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpKSkKKwkJYmlvID0gYmlvX21hcF91c2VyKHEsIE5VTEwsIHVhZGRyLCBsZW4sIHJlYWRpbmcpOworCWVsc2UKKwkJYmlvID0gYmlvX2NvcHlfdXNlcihxLCB1YWRkciwgbGVuLCByZWFkaW5nKTsKKworCWlmIChJU19FUlIoYmlvKSkgeworCQlyZXR1cm4gUFRSX0VSUihiaW8pOworCX0KKworCW9yaWdfYmlvID0gYmlvOworCWJsa19xdWV1ZV9ib3VuY2UocSwgJmJpbyk7CisJLyoKKwkgKiBXZSBsaW5rIHRoZSBib3VuY2UgYnVmZmVyIGluIGFuZCBjb3VsZCBoYXZlIHRvIHRyYXZlcnNlIGl0CisJICogbGF0ZXIgc28gd2UgaGF2ZSB0byBnZXQgYSByZWYgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGZyZWVkCisJICovCisJYmlvX2dldChiaW8pOworCisJLyoKKwkgKiBmb3IgbW9zdCAoYWxsPyBkb24ndCBrbm93IG9mIGFueSkgcXVldWVzIHdlIGNvdWxkCisJICogc2tpcCBncmFiYmluZyB0aGUgcXVldWUgbG9jayBoZXJlLiBvbmx5IGRyaXZlcnMgd2l0aAorCSAqIGZ1bmt5IHByaXZhdGUgLT5iYWNrX21lcmdlX2ZuKCkgZnVuY3Rpb24gY291bGQgYmUKKwkgKiBwcm9ibGVtYXRpYy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCWlmICghcnEtPmJpbykKKwkJYmxrX3JxX2Jpb19wcmVwKHEsIHJxLCBiaW8pOworCWVsc2UgaWYgKCFxLT5iYWNrX21lcmdlX2ZuKHEsIHJxLCBiaW8pKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKKwkJZ290byB1bm1hcF9iaW87CisJfSBlbHNlIHsKKwkJcnEtPmJpb3RhaWwtPmJpX25leHQgPSBiaW87CisJCXJxLT5iaW90YWlsID0gYmlvOworCisJCXJxLT5ucl9zZWN0b3JzICs9IGJpb19zZWN0b3JzKGJpbyk7CisJCXJxLT5oYXJkX25yX3NlY3RvcnMgPSBycS0+bnJfc2VjdG9yczsKKwkJcnEtPmRhdGFfbGVuICs9IGJpby0+Ymlfc2l6ZTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCisJcmV0dXJuIGJpby0+Ymlfc2l6ZTsKKwordW5tYXBfYmlvOgorCS8qIGlmIGl0IHdhcyBib3VjbmVkIHdlIG11c3QgY2FsbCB0aGUgZW5kIGlvIGZ1bmN0aW9uICovCisJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAwKTsKKwlfX2Jsa19ycV91bm1hcF91c2VyKG9yaWdfYmlvKTsKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIHJldDsKK30KKwogLyoqCiAgKiBibGtfcnFfbWFwX3VzZXIgLSBtYXAgdXNlciBkYXRhIHRvIGEgcmVxdWVzdCwgZm9yIFJFUV9CTE9DS19QQyB1c2FnZQogICogQHE6CQlyZXF1ZXN0IHF1ZXVlIHdoZXJlIHJlcXVlc3Qgc2hvdWxkIGJlIGluc2VydGVkCkBAIC0yMzc5LDQyICsyNDE2LDQ0IEBACiAgKiAgICB1bm1hcHBpbmcuCiAgKi8KIGludCBibGtfcnFfbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHZvaWQgX191c2VyICp1YnVmLAotCQkgICAgdW5zaWduZWQgaW50IGxlbikKKwkJICAgIHVuc2lnbmVkIGxvbmcgbGVuKQogewotCXVuc2lnbmVkIGxvbmcgdWFkZHI7Ci0Jc3RydWN0IGJpbyAqYmlvOwotCWludCByZWFkaW5nOworCXVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVhZCA9IDA7CisJaW50IHJldDsKIAogCWlmIChsZW4gPiAocS0+bWF4X2h3X3NlY3RvcnMgPDwgOSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghbGVuIHx8ICF1YnVmKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJlYWRpbmcgPSBycV9kYXRhX2RpcihycSkgPT0gUkVBRDsKKwl3aGlsZSAoYnl0ZXNfcmVhZCAhPSBsZW4pIHsKKwkJdW5zaWduZWQgbG9uZyBtYXBfbGVuLCBlbmQsIHN0YXJ0OwogCi0JLyoKLQkgKiBpZiBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgaXMgc2F0aXNmaWVkLCBtYXAgaW4gdXNlciBwYWdlcyBmb3IKLQkgKiBkaXJlY3QgZG1hLiBlbHNlLCBzZXQgdXAga2VybmVsIGJvdW5jZSBidWZmZXJzCi0JICovCi0JdWFkZHIgPSAodW5zaWduZWQgbG9uZykgdWJ1ZjsKLQlpZiAoISh1YWRkciAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpICYmICEobGVuICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkpCi0JCWJpbyA9IGJpb19tYXBfdXNlcihxLCBOVUxMLCB1YWRkciwgbGVuLCByZWFkaW5nKTsKLQllbHNlCi0JCWJpbyA9IGJpb19jb3B5X3VzZXIocSwgdWFkZHIsIGxlbiwgcmVhZGluZyk7CisJCW1hcF9sZW4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBsZW4gLSBieXRlc19yZWFkLCBCSU9fTUFYX1NJWkUpOworCQllbmQgPSAoKHVuc2lnbmVkIGxvbmcpdWJ1ZiArIG1hcF9sZW4gKyBQQUdFX1NJWkUgLSAxKQorCQkJCQkJCQk+PiBQQUdFX1NISUZUOworCQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKXVidWYgPj4gUEFHRV9TSElGVDsKIAotCWlmICghSVNfRVJSKGJpbykpIHsKLQkJcnEtPmJpbyA9IHJxLT5iaW90YWlsID0gYmlvOwotCQlibGtfcnFfYmlvX3ByZXAocSwgcnEsIGJpbyk7CisJCS8qCisJCSAqIEEgYmFkIG9mZnNldCBjb3VsZCBjYXVzZSB1cyB0byByZXF1aXJlIEJJT19NQVhfUEFHRVMgKyAxCisJCSAqIHBhZ2VzLiBJZiB0aGlzIGhhcHBlbnMgd2UganVzdCBsb3dlciB0aGUgcmVxdWVzdGVkCisJCSAqIG1hcHBpbmcgbGVuIGJ5IGEgcGFnZSBzbyB0aGF0IHdlIGNhbiBmaXQKKwkJICovCisJCWlmIChlbmQgLSBzdGFydCA+IEJJT19NQVhfUEFHRVMpCisJCQltYXBfbGVuIC09IFBBR0VfU0laRTsKIAotCQlycS0+YnVmZmVyID0gcnEtPmRhdGEgPSBOVUxMOwotCQlycS0+ZGF0YV9sZW4gPSBsZW47Ci0JCXJldHVybiAwOworCQlyZXQgPSBfX2Jsa19ycV9tYXBfdXNlcihxLCBycSwgdWJ1ZiwgbWFwX2xlbik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byB1bm1hcF9ycTsKKwkJYnl0ZXNfcmVhZCArPSByZXQ7CisJCXVidWYgKz0gcmV0OwogCX0KIAotCS8qCi0JICogYmlvIGlzIHRoZSBlcnItcHRyCi0JICovCi0JcmV0dXJuIFBUUl9FUlIoYmlvKTsKKwlycS0+YnVmZmVyID0gcnEtPmRhdGEgPSBOVUxMOworCXJldHVybiAwOwordW5tYXBfcnE6CisJYmxrX3JxX3VubWFwX3VzZXIocnEpOworCXJldHVybiByZXQ7CiB9CiAKIEVYUE9SVF9TWU1CT0woYmxrX3JxX21hcF91c2VyKTsKQEAgLTI0NDAsNyArMjQ3OSw3IEBACiAgKiAgICB1bm1hcHBpbmcuCiAgKi8KIGludCBibGtfcnFfbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAotCQkJc3RydWN0IHNnX2lvdmVjICppb3YsIGludCBpb3ZfY291bnQpCisJCQlzdHJ1Y3Qgc2dfaW92ZWMgKmlvdiwgaW50IGlvdl9jb3VudCwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlzdHJ1Y3QgYmlvICpiaW87CiAKQEAgLTI0NTQsMTAgKzI0OTMsMTUgQEAKIAlpZiAoSVNfRVJSKGJpbykpCiAJCXJldHVybiBQVFJfRVJSKGJpbyk7CiAKLQlycS0+YmlvID0gcnEtPmJpb3RhaWwgPSBiaW87CisJaWYgKGJpby0+Ymlfc2l6ZSAhPSBsZW4pIHsKKwkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAwKTsKKwkJYmlvX3VubWFwX3VzZXIoYmlvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmlvX2dldChiaW8pOwogCWJsa19ycV9iaW9fcHJlcChxLCBycSwgYmlvKTsKIAlycS0+YnVmZmVyID0gcnEtPmRhdGEgPSBOVUxMOwotCXJxLT5kYXRhX2xlbiA9IGJpby0+Ymlfc2l6ZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ2NSwyMyArMjUwOSwyNiBAQAogCiAvKioKICAqIGJsa19ycV91bm1hcF91c2VyIC0gdW5tYXAgYSByZXF1ZXN0IHdpdGggdXNlciBkYXRhCi0gKiBAYmlvOgliaW8gdG8gYmUgdW5tYXBwZWQKLSAqIEB1bGVuOglsZW5ndGggb2YgdXNlciBidWZmZXIKKyAqIEBycToJCXJxIHRvIGJlIHVubWFwcGVkCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgICBVbm1hcCBhIGJpbyBwcmV2aW91c2x5IG1hcHBlZCBieSBibGtfcnFfbWFwX3VzZXIoKS4KKyAqICAgIFVubWFwIGEgcnEgcHJldmlvdXNseSBtYXBwZWQgYnkgYmxrX3JxX21hcF91c2VyKCkuCisgKiAgICBycS0+YmlvIG11c3QgYmUgc2V0IHRvIHRoZSBvcmlnaW5hbCBoZWFkIG9mIHRoZSByZXF1ZXN0LgogICovCi1pbnQgYmxrX3JxX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgdWxlbikKK2ludCBibGtfcnFfdW5tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IGJpbyAqYmlvLCAqbWFwcGVkX2JpbzsKIAotCWlmIChiaW8pIHsKLQkJaWYgKGJpb19mbGFnZ2VkKGJpbywgQklPX1VTRVJfTUFQUEVEKSkKLQkJCWJpb191bm1hcF91c2VyKGJpbyk7CisJd2hpbGUgKChiaW8gPSBycS0+YmlvKSkgeworCQlpZiAoYmlvX2ZsYWdnZWQoYmlvLCBCSU9fQk9VTkNFRCkpCisJCQltYXBwZWRfYmlvID0gYmlvLT5iaV9wcml2YXRlOwogCQllbHNlCi0JCQlyZXQgPSBiaW9fdW5jb3B5X3VzZXIoYmlvKTsKLQl9CisJCQltYXBwZWRfYmlvID0gYmlvOwogCisJCV9fYmxrX3JxX3VubWFwX3VzZXIobWFwcGVkX2Jpbyk7CisJCXJxLT5iaW8gPSBiaW8tPmJpX25leHQ7CisJCWJpb19wdXQoYmlvKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1MTIsMTEgKzI1NTksOCBAQAogCWlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCiAJCWJpby0+YmlfcncgfD0gKDEgPDwgQklPX1JXKTsKIAotCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IGJpbzsKIAlibGtfcnFfYmlvX3ByZXAocSwgcnEsIGJpbyk7Ci0KIAlycS0+YnVmZmVyID0gcnEtPmRhdGEgPSBOVUxMOwotCXJxLT5kYXRhX2xlbiA9IGxlbjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY0NSw5ICsyNjg5LDYgQEAKIHsKIAlkcml2ZV9zdGF0X2FjY3QocmVxLCByZXEtPm5yX3NlY3RvcnMsIDEpOwogCi0JaWYgKHEtPmFjdGl2aXR5X2ZuKQotCQlxLT5hY3Rpdml0eV9mbihxLT5hY3Rpdml0eV9kYXRhLCBycV9kYXRhX2RpcihyZXEpKTsKLQogCS8qCiAJICogZWxldmF0b3IgaW5kaWNhdGVkIHdoZXJlIGl0IHdhbnRzIHRoaXMgcmVxdWVzdCB0byBiZQogCSAqIGluc2VydGVkIGF0IGVsZXZhdG9yX21lcmdlIHRpbWUKQEAgLTI3NTUsNDEgKzI3OTYsNiBAQAogfQogRVhQT1JUX1NZTUJPTChibGtfZW5kX3N5bmNfcnEpOwogCi0vKioKLSAqIGJsa19jb25nZXN0aW9uX3dhaXQgLSB3YWl0IGZvciBhIHF1ZXVlIHRvIGJlY29tZSB1bmNvbmdlc3RlZAotICogQHJ3OiBSRUFEIG9yIFdSSVRFCi0gKiBAdGltZW91dDogdGltZW91dCBpbiBqaWZmaWVzCi0gKgotICogV2FpdHMgZm9yIHVwIHRvIEB0aW1lb3V0IGppZmZpZXMgZm9yIGEgcXVldWUgKGFueSBxdWV1ZSkgdG8gZXhpdCBjb25nZXN0aW9uLgotICogSWYgbm8gcXVldWVzIGFyZSBjb25nZXN0ZWQgdGhlbiBqdXN0IHdhaXQgZm9yIHRoZSBuZXh0IHJlcXVlc3QgdG8gYmUKLSAqIHJldHVybmVkLgotICovCi1sb25nIGJsa19jb25nZXN0aW9uX3dhaXQoaW50IHJ3LCBsb25nIHRpbWVvdXQpCi17Ci0JbG9uZyByZXQ7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCA9ICZjb25nZXN0aW9uX3dxaFtyd107Ci0KLQlwcmVwYXJlX3RvX3dhaXQod3FoLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXJldCA9IGlvX3NjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JZmluaXNoX3dhaXQod3FoLCAmd2FpdCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotRVhQT1JUX1NZTUJPTChibGtfY29uZ2VzdGlvbl93YWl0KTsKLQotLyoqCi0gKiBibGtfY29uZ2VzdGlvbl9lbmQgLSB3YWtlIHVwIHNsZWVwZXJzIG9uIGEgY29uZ2VzdGlvbiBxdWV1ZQotICogQHJ3OiBSRUFEIG9yIFdSSVRFCi0gKi8KLXZvaWQgYmxrX2Nvbmdlc3Rpb25fZW5kKGludCBydykKLXsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoID0gJmNvbmdlc3Rpb25fd3FoW3J3XTsKLQotCWlmICh3YWl0cXVldWVfYWN0aXZlKHdxaCkpCi0JCXdha2VfdXAod3FoKTsKLX0KLQogLyoKICAqIEhhcyB0byBiZSBjYWxsZWQgd2l0aCB0aGUgcmVxdWVzdCBzcGlubG9jayBhY3F1aXJlZAogICovCkBAIC0yOTA2LDYgKzI5MTIsNyBAQAogCWludCBlbF9yZXQsIG5yX3NlY3RvcnMsIGJhcnJpZXIsIGVycjsKIAljb25zdCB1bnNpZ25lZCBzaG9ydCBwcmlvID0gYmlvX3ByaW8oYmlvKTsKIAljb25zdCBpbnQgc3luYyA9IGJpb19zeW5jKGJpbyk7CisJaW50IHJ3X2ZsYWdzOwogCiAJbnJfc2VjdG9ycyA9IGJpb19zZWN0b3JzKGJpbyk7CiAKQEAgLTI5ODAsMTAgKzI5ODcsMTkgQEAKIAogZ2V0X3JxOgogCS8qCisJICogVGhpcyBzeW5jIGNoZWNrIGFuZCBtYXNrIHdpbGwgYmUgcmUtZG9uZSBpbiBpbml0X3JlcXVlc3RfZnJvbV9iaW8oKSwKKwkgKiBidXQgd2UgbmVlZCB0byBzZXQgaXQgZWFybGllciB0byBleHBvc2UgdGhlIHN5bmMgZmxhZyB0byB0aGUKKwkgKiBycSBhbGxvY2F0b3IgYW5kIGlvIHNjaGVkdWxlcnMuCisJICovCisJcndfZmxhZ3MgPSBiaW9fZGF0YV9kaXIoYmlvKTsKKwlpZiAoc3luYykKKwkJcndfZmxhZ3MgfD0gUkVRX1JXX1NZTkM7CisKKwkvKgogCSAqIEdyYWIgYSBmcmVlIHJlcXVlc3QuIFRoaXMgaXMgbWlnaHQgc2xlZXAgYnV0IGNhbiBub3QgZmFpbC4KIAkgKiBSZXR1cm5zIHdpdGggdGhlIHF1ZXVlIHVubG9ja2VkLgogCSAqLwotCXJlcSA9IGdldF9yZXF1ZXN0X3dhaXQocSwgYmlvX2RhdGFfZGlyKGJpbyksIGJpbyk7CisJcmVxID0gZ2V0X3JlcXVlc3Rfd2FpdChxLCByd19mbGFncywgYmlvKTsKIAogCS8qCiAJICogQWZ0ZXIgZHJvcHBpbmcgdGhlIGxvY2sgYW5kIHBvc3NpYmx5IHNsZWVwaW5nIGhlcmUsIG91ciByZXF1ZXN0CkBAIC0zMDQyLDYgKzMwNTgsNDIgQEAKIAlzZXRfYml0KEJJT19FT0YsICZiaW8tPmJpX2ZsYWdzKTsKIH0KIAorI2lmZGVmIENPTkZJR19GQUlMX01BS0VfUkVRVUVTVAorCitzdGF0aWMgREVDTEFSRV9GQVVMVF9BVFRSKGZhaWxfbWFrZV9yZXF1ZXN0KTsKKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfZmFpbF9tYWtlX3JlcXVlc3QoY2hhciAqc3RyKQoreworCXJldHVybiBzZXR1cF9mYXVsdF9hdHRyKCZmYWlsX21ha2VfcmVxdWVzdCwgc3RyKTsKK30KK19fc2V0dXAoImZhaWxfbWFrZV9yZXF1ZXN0PSIsIHNldHVwX2ZhaWxfbWFrZV9yZXF1ZXN0KTsKKworc3RhdGljIGludCBzaG91bGRfZmFpbF9yZXF1ZXN0KHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpZiAoKGJpby0+YmlfYmRldi0+YmRfZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9GQUlMKSB8fAorCSAgICAoYmlvLT5iaV9iZGV2LT5iZF9wYXJ0ICYmIGJpby0+YmlfYmRldi0+YmRfcGFydC0+bWFrZV9pdF9mYWlsKSkKKwkJcmV0dXJuIHNob3VsZF9mYWlsKCZmYWlsX21ha2VfcmVxdWVzdCwgYmlvLT5iaV9zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBmYWlsX21ha2VfcmVxdWVzdF9kZWJ1Z2ZzKHZvaWQpCit7CisJcmV0dXJuIGluaXRfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbF9tYWtlX3JlcXVlc3QsCisJCQkJCSJmYWlsX21ha2VfcmVxdWVzdCIpOworfQorCitsYXRlX2luaXRjYWxsKGZhaWxfbWFrZV9yZXF1ZXN0X2RlYnVnZnMpOworCisjZWxzZSAvKiBDT05GSUdfRkFJTF9NQUtFX1JFUVVFU1QgKi8KKworc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX2ZhaWxfcmVxdWVzdChzdHJ1Y3QgYmlvICpiaW8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRkFJTF9NQUtFX1JFUVVFU1QgKi8KKwogLyoqCiAgKiBnZW5lcmljX21ha2VfcmVxdWVzdDogaGFuZCBhIGJ1ZmZlciB0byBpdHMgZGV2aWNlIGRyaXZlciBmb3IgSS9PCiAgKiBAYmlvOiAgVGhlIGJpbyBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBpbiBtZW1vcnkgYW5kIG9uIHRoZSBkZXZpY2UuCkBAIC0zMDcwLDYgKzMxMjIsNyBAQAogewogCXJlcXVlc3RfcXVldWVfdCAqcTsKIAlzZWN0b3JfdCBtYXhzZWN0b3I7CisJc2VjdG9yX3Qgb2xkX3NlY3RvcjsKIAlpbnQgcmV0LCBucl9zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKIAlkZXZfdCBvbGRfZGV2OwogCkBAIC0zMDk4LDcgKzMxNTEsNyBAQAogCSAqIE5PVEU6IHdlIGRvbid0IHJlcGVhdCB0aGUgYmxrX3NpemUgY2hlY2sgZm9yIGVhY2ggbmV3IGRldmljZS4KIAkgKiBTdGFja2luZyBkcml2ZXJzIGFyZSBleHBlY3RlZCB0byBrbm93IHdoYXQgdGhleSBhcmUgZG9pbmcuCiAJICovCi0JbWF4c2VjdG9yID0gLTE7CisJb2xkX3NlY3RvciA9IC0xOwogCW9sZF9kZXYgPSAwOwogCWRvIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwpAQCAtMzEyNiwyMSArMzE3OSw0MCBAQAogCQlpZiAodW5saWtlbHkodGVzdF9iaXQoUVVFVUVfRkxBR19ERUFELCAmcS0+cXVldWVfZmxhZ3MpKSkKIAkJCWdvdG8gZW5kX2lvOwogCisJCWlmIChzaG91bGRfZmFpbF9yZXF1ZXN0KGJpbykpCisJCQlnb3RvIGVuZF9pbzsKKwogCQkvKgogCQkgKiBJZiB0aGlzIGRldmljZSBoYXMgcGFydGl0aW9ucywgcmVtYXAgYmxvY2sgbgogCQkgKiBvZiBwYXJ0aXRpb24gcCB0byBibG9jayBuK3N0YXJ0KHApIG9mIHRoZSBkaXNrLgogCQkgKi8KIAkJYmxrX3BhcnRpdGlvbl9yZW1hcChiaW8pOwogCi0JCWlmIChtYXhzZWN0b3IgIT0gLTEpCisJCWlmIChvbGRfc2VjdG9yICE9IC0xKQogCQkJYmxrX2FkZF90cmFjZV9yZW1hcChxLCBiaW8sIG9sZF9kZXYsIGJpby0+Ymlfc2VjdG9yLCAKLQkJCQkJICAgIG1heHNlY3Rvcik7CisJCQkJCSAgICBvbGRfc2VjdG9yKTsKIAogCQlibGtfYWRkX3RyYWNlX2JpbyhxLCBiaW8sIEJMS19UQV9RVUVVRSk7CiAKLQkJbWF4c2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CisJCW9sZF9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKIAkJb2xkX2RldiA9IGJpby0+YmlfYmRldi0+YmRfZGV2OwogCisJCW1heHNlY3RvciA9IGJpby0+YmlfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiA5OworCQlpZiAobWF4c2VjdG9yKSB7CisJCQlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKKworCQkJaWYgKG1heHNlY3RvciA8IG5yX3NlY3RvcnMgfHwKKwkJCQkJbWF4c2VjdG9yIC0gbnJfc2VjdG9ycyA8IHNlY3RvcikgeworCQkJCS8qCisJCQkJICogVGhpcyBtYXkgd2VsbCBoYXBwZW4gLSBwYXJ0aXRpb25zIGFyZSBub3QKKwkJCQkgKiBjaGVja2VkIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB3aXRoaW4gdGhlIHNpemUKKwkJCQkgKiBvZiB0aGUgd2hvbGUgZGV2aWNlLgorCQkJCSAqLworCQkJCWhhbmRsZV9iYWRfc2VjdG9yKGJpbyk7CisJCQkJZ290byBlbmRfaW87CisJCQl9CisJCX0KKwogCQlyZXQgPSBxLT5tYWtlX3JlcXVlc3RfZm4ocSwgYmlvKTsKIAl9IHdoaWxlIChyZXQpOwogfQpAQCAtMzE2NCwxMCArMzIzNiwxMiBAQAogCUJJT19CVUdfT04oIWJpby0+Ymlfc2l6ZSk7CiAJQklPX0JVR19PTighYmlvLT5iaV9pb192ZWMpOwogCWJpby0+YmlfcncgfD0gcnc7Ci0JaWYgKHJ3ICYgV1JJVEUpCisJaWYgKHJ3ICYgV1JJVEUpIHsKIAkJY291bnRfdm1fZXZlbnRzKFBHUEdPVVQsIGNvdW50KTsKLQllbHNlCisJfSBlbHNlIHsKKwkJdGFza19pb19hY2NvdW50X3JlYWQoYmlvLT5iaV9zaXplKTsKIAkJY291bnRfdm1fZXZlbnRzKFBHUEdJTiwgY291bnQpOworCX0KIAogCWlmICh1bmxpa2VseShibG9ja19kdW1wKSkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CkBAIC0zNDI4LDggKzM1MDIsNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCiBzdGF0aWMgaW50IGJsa19jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCiAJCQkgIHZvaWQgKmhjcHUpCiB7CkBAIC0zNDU1LDggKzM1MjcsNiBAQAogCS5ub3RpZmllcl9jYWxsCT0gYmxrX2NwdV9ub3RpZnksCiB9OwogCi0jZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCi0KIC8qKgogICogYmxrX2NvbXBsZXRlX3JlcXVlc3QgLSBlbmQgSS9PIG9uIGEgcmVxdWVzdAogICogQHJlcTogICAgICB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKQEAgLTM1NDksNiArMzYxOSw3IEBACiAJcnEtPmhhcmRfY3VyX3NlY3RvcnMgPSBycS0+Y3VycmVudF9ucl9zZWN0b3JzOwogCXJxLT5oYXJkX25yX3NlY3RvcnMgPSBycS0+bnJfc2VjdG9ycyA9IGJpb19zZWN0b3JzKGJpbyk7CiAJcnEtPmJ1ZmZlciA9IGJpb19kYXRhKGJpbyk7CisJcnEtPmRhdGFfbGVuID0gYmlvLT5iaV9zaXplOwogCiAJcnEtPmJpbyA9IHJxLT5iaW90YWlsID0gYmlvOwogfQpAQCAtMzc2NSwxNCArMzgzNiwxNCBAQAogCWJsa19xdWV1ZV9jb25nZXN0aW9uX3RocmVzaG9sZChxKTsKIAogCWlmIChybC0+Y291bnRbUkVBRF0gPj0gcXVldWVfY29uZ2VzdGlvbl9vbl90aHJlc2hvbGQocSkpCi0JCXNldF9xdWV1ZV9jb25nZXN0ZWQocSwgUkVBRCk7CisJCWJsa19zZXRfcXVldWVfY29uZ2VzdGVkKHEsIFJFQUQpOwogCWVsc2UgaWYgKHJsLT5jb3VudFtSRUFEXSA8IHF1ZXVlX2Nvbmdlc3Rpb25fb2ZmX3RocmVzaG9sZChxKSkKLQkJY2xlYXJfcXVldWVfY29uZ2VzdGVkKHEsIFJFQUQpOworCQlibGtfY2xlYXJfcXVldWVfY29uZ2VzdGVkKHEsIFJFQUQpOwogCiAJaWYgKHJsLT5jb3VudFtXUklURV0gPj0gcXVldWVfY29uZ2VzdGlvbl9vbl90aHJlc2hvbGQocSkpCi0JCXNldF9xdWV1ZV9jb25nZXN0ZWQocSwgV1JJVEUpOworCQlibGtfc2V0X3F1ZXVlX2Nvbmdlc3RlZChxLCBXUklURSk7CiAJZWxzZSBpZiAocmwtPmNvdW50W1dSSVRFXSA8IHF1ZXVlX2Nvbmdlc3Rpb25fb2ZmX3RocmVzaG9sZChxKSkKLQkJY2xlYXJfcXVldWVfY29uZ2VzdGVkKHEsIFdSSVRFKTsKKwkJYmxrX2NsZWFyX3F1ZXVlX2Nvbmdlc3RlZChxLCBXUklURSk7CiAKIAlpZiAocmwtPmNvdW50W1JFQURdID49IHEtPm5yX3JlcXVlc3RzKSB7CiAJCWJsa19zZXRfcXVldWVfZnVsbChxLCBSRUFEKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL25vb3AtaW9zY2hlZC5jIGIvYmxvY2svbm9vcC1pb3NjaGVkLmMKaW5kZXggNzlhZjQzMS4uMWMzZGUyYiAxMDA2NDQKLS0tIGEvYmxvY2svbm9vcC1pb3NjaGVkLmMKKysrIGIvYmxvY2svbm9vcC1pb3NjaGVkLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlyZXR1cm4gbGlzdF9lbnRyeShycS0+cXVldWVsaXN0Lm5leHQsIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpOwogfQogCi1zdGF0aWMgdm9pZCAqbm9vcF9pbml0X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgZWxldmF0b3JfdCAqZSkKK3N0YXRpYyB2b2lkICpub29wX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCXN0cnVjdCBub29wX2RhdGEgKm5kOwogCmRpZmYgLS1naXQgYS9ibG9jay9zY3NpX2lvY3RsLmMgYi9ibG9jay9zY3NpX2lvY3RsLmMKaW5kZXggMmRjMzI2NC4uZjMyMmI2YSAxMDA2NDQKLS0tIGEvYmxvY2svc2NzaV9pb2N0bC5jCisrKyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwpAQCAtMjI2LDkgKzIyNiw5IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOwogCWludCB3cml0aW5nID0gMCwgcmV0ID0gMDsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0Jc3RydWN0IGJpbyAqYmlvOwogCWNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKIAl1bnNpZ25lZCBjaGFyIGNtZFtCTEtfTUFYX0NEQl07CisJc3RydWN0IGJpbyAqYmlvOwogCiAJaWYgKGhkci0+aW50ZXJmYWNlX2lkICE9ICdTJykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNDYsMTAgKzI0NiwxMCBAQAogCQlzd2l0Y2ggKGhkci0+ZHhmZXJfZGlyZWN0aW9uKSB7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJY2FzZSBTR19EWEZFUl9UT19GUk9NX0RFVjoKIAkJY2FzZSBTR19EWEZFUl9UT19ERVY6CiAJCQl3cml0aW5nID0gMTsKIAkJCWJyZWFrOworCQljYXNlIFNHX0RYRkVSX1RPX0ZST01fREVWOgogCQljYXNlIFNHX0RYRkVSX0ZST01fREVWOgogCQkJYnJlYWs7CiAJCX0KQEAgLTI1OCw2ICsyNTgsMjUgQEAKIAlpZiAoIXJxKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCS8qCisJICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQorCSAqLworCXJxLT5jbWRfbGVuID0gaGRyLT5jbWRfbGVuOworCW1lbXNldChycS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCisJbWVtY3B5KHJxLT5jbWQsIGNtZCwgaGRyLT5jbWRfbGVuKTsKKworCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7CisJcnEtPnNlbnNlID0gc2Vuc2U7CisJcnEtPnNlbnNlX2xlbiA9IDA7CisKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKKworCXJxLT50aW1lb3V0ID0gamlmZmllc190b19tc2VjcyhoZHItPnRpbWVvdXQpOworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gcS0+c2dfdGltZW91dDsKKwlpZiAoIXJxLT50aW1lb3V0KQorCQlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1RJTUVPVVQ7CisKIAlpZiAoaGRyLT5pb3ZlY19jb3VudCkgewogCQljb25zdCBpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2dfaW92ZWMpICogaGRyLT5pb3ZlY19jb3VudDsKIAkJc3RydWN0IHNnX2lvdmVjICppb3Y7CkBAIC0yNzQsNyArMjkzLDggQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJcmV0ID0gYmxrX3JxX21hcF91c2VyX2lvdihxLCBycSwgaW92LCBoZHItPmlvdmVjX2NvdW50KTsKKwkJcmV0ID0gYmxrX3JxX21hcF91c2VyX2lvdihxLCBycSwgaW92LCBoZHItPmlvdmVjX2NvdW50LAorCQkJCQkgIGhkci0+ZHhmZXJfbGVuKTsKIAkJa2ZyZWUoaW92KTsKIAl9IGVsc2UgaWYgKGhkci0+ZHhmZXJfbGVuKQogCQlyZXQgPSBibGtfcnFfbWFwX3VzZXIocSwgcnEsIGhkci0+ZHhmZXJwLCBoZHItPmR4ZmVyX2xlbik7CkBAIC0yODIsMzQgKzMwMiw3IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIGZpbGwgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKLQkgKi8KLQlycS0+Y21kX2xlbiA9IGhkci0+Y21kX2xlbjsKLQltZW1jcHkocnEtPmNtZCwgY21kLCBoZHItPmNtZF9sZW4pOwotCWlmIChzaXplb2YocnEtPmNtZCkgIT0gaGRyLT5jbWRfbGVuKQotCQltZW1zZXQocnEtPmNtZCArIGhkci0+Y21kX2xlbiwgMCwgc2l6ZW9mKHJxLT5jbWQpIC0gaGRyLT5jbWRfbGVuKTsKLQotCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKHNlbnNlKSk7Ci0JcnEtPnNlbnNlID0gc2Vuc2U7Ci0JcnEtPnNlbnNlX2xlbiA9IDA7Ci0KLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKIAliaW8gPSBycS0+YmlvOwotCi0JLyoKLQkgKiBib3VuY2UgdGhpcyBhZnRlciBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBiaW8sIGl0J3MKLQkgKiBuZWVkZWQgZm9yIHByb3BlciB1bm1hcHBpbmcKLQkgKi8KLQlpZiAocnEtPmJpbykKLQkJYmxrX3F1ZXVlX2JvdW5jZShxLCAmcnEtPmJpbyk7Ci0KLQlycS0+dGltZW91dCA9IChoZHItPnRpbWVvdXQgKiBIWikgLyAxMDAwOwotCWlmICghcnEtPnRpbWVvdXQpCi0JCXJxLT50aW1lb3V0ID0gcS0+c2dfdGltZW91dDsKLQlpZiAoIXJxLT50aW1lb3V0KQotCQlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1RJTUVPVVQ7Ci0KIAlycS0+cmV0cmllcyA9IDA7CiAKIAlzdGFydF90aW1lID0gamlmZmllczsKQEAgLTM0MCw3ICszMzMsOCBAQAogCQkJaGRyLT5zYl9sZW5fd3IgPSBsZW47CiAJfQogCi0JaWYgKGJsa19ycV91bm1hcF91c2VyKGJpbywgaGRyLT5keGZlcl9sZW4pKQorCXJxLT5iaW8gPSBiaW87CisJaWYgKGJsa19ycV91bm1hcF91c2VyKHJxKSkKIAkJcmV0ID0gLUVGQVVMVDsKIAogCS8qIG1heSBub3QgaGF2ZSBzdWNjZWVkZWQsIGJ1dCBvdXRwdXQgdmFsdWVzIHdyaXR0ZW4gdG8gY29udHJvbApkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCAxZTJmMzljLi45MmJhMjQ5IDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMjcsNyArMjcsNiBAQAogY29uZmlnIENSWVBUT19NQU5BR0VSCiAJdHJpc3RhdGUgIkNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIG1hbmFnZXIiCiAJc2VsZWN0IENSWVBUT19BTEdBUEkKLQlkZWZhdWx0IG0KIAloZWxwCiAJICBDcmVhdGUgZGVmYXVsdCBjcnlwdG9ncmFwaGljIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIHN1Y2ggYXMKIAkgIGNiYyhhZXMpLgpAQCAtMzUsMTAgKzM0LDIyIEBACiBjb25maWcgQ1JZUFRPX0hNQUMKIAl0cmlzdGF0ZSAiSE1BQyBzdXBwb3J0IgogCXNlbGVjdCBDUllQVE9fSEFTSAorCXNlbGVjdCBDUllQVE9fTUFOQUdFUgogCWhlbHAKIAkgIEhNQUM6IEtleWVkLUhhc2hpbmcgZm9yIE1lc3NhZ2UgQXV0aGVudGljYXRpb24gKFJGQzIxMDQpLgogCSAgVGhpcyBpcyByZXF1aXJlZCBmb3IgSVBTZWMuCiAKK2NvbmZpZyBDUllQVE9fWENCQworCXRyaXN0YXRlICJYQ0JDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JZUFRPX0hBU0gKKwlzZWxlY3QgQ1JZUFRPX01BTkFHRVIKKwloZWxwCisJICBYQ0JDOiBLZXllZC1IYXNoaW5nIHdpdGggZW5jcnlwdGlvbiBhbGdvcml0aG0KKwkJaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzU2Ni50eHQKKwkJaHR0cDovL2NzcmMubmlzdC5nb3YvZW5jcnlwdGlvbi9tb2Rlcy9wcm9wb3NlZG1vZGVzLworCQkgeGNiYy1tYWMveGNiYy1tYWMtc3BlYy5wZGYKKwogY29uZmlnIENSWVBUT19OVUxMCiAJdHJpc3RhdGUgIk51bGwgYWxnb3JpdGhtcyIKIAlzZWxlY3QgQ1JZUFRPX0FMR0FQSQpAQCAtMTI4LDkgKzEzOSwyMCBAQAogCSAgU2VlIGFsc286CiAJICA8aHR0cDovL3d3dy5jcy50ZWNobmlvbi5hYy5pbC9+YmloYW0vUmVwb3J0cy9UaWdlci8+LgogCitjb25maWcgQ1JZUFRPX0dGMTI4TVVMCisJdHJpc3RhdGUgIkdGKDJeMTI4KSBtdWx0aXBsaWNhdGlvbiBmdW5jdGlvbnMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBFZmZpY2llbnQgdGFibGUgZHJpdmVuIGltcGxlbWVudGF0aW9uIG9mIG11bHRpcGxpY2F0aW9ucyBpbiB0aGUKKwkgIGZpZWxkIEdGKDJeMTI4KS4gIFRoaXMgaXMgbmVlZGVkIGJ5IHNvbWUgY3lwaGVyIG1vZGVzLiBUaGlzCisJICBvcHRpb24gd2lsbCBiZSBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBzZWxlY3Qgc3VjaCBhCisJICBjaXBoZXIgbW9kZS4gIE9ubHkgc2VsZWN0IHRoaXMgb3B0aW9uIGJ5IGhhbmQgaWYgeW91IGV4cGVjdCB0byBsb2FkCisJICBhbiBleHRlcm5hbCBtb2R1bGUgdGhhdCByZXF1aXJlcyB0aGVzZSBmdW5jdGlvbnMuCisKIGNvbmZpZyBDUllQVE9fRUNCCiAJdHJpc3RhdGUgIkVDQiBzdXBwb3J0IgogCXNlbGVjdCBDUllQVE9fQkxLQ0lQSEVSCisJc2VsZWN0IENSWVBUT19NQU5BR0VSCiAJZGVmYXVsdCBtCiAJaGVscAogCSAgRUNCOiBFbGVjdHJvbmljIENvZGVCb29rIG1vZGUKQEAgLTE0MCwxMSArMTYyLDI1IEBACiBjb25maWcgQ1JZUFRPX0NCQwogCXRyaXN0YXRlICJDQkMgc3VwcG9ydCIKIAlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUgorCXNlbGVjdCBDUllQVE9fTUFOQUdFUgogCWRlZmF1bHQgbQogCWhlbHAKIAkgIENCQzogQ2lwaGVyIEJsb2NrIENoYWluaW5nIG1vZGUKIAkgIFRoaXMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobSBpcyByZXF1aXJlZCBmb3IgSVBTZWMuCiAKK2NvbmZpZyBDUllQVE9fTFJXCisJdHJpc3RhdGUgIkxSVyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSWVBUT19CTEtDSVBIRVIKKwlzZWxlY3QgQ1JZUFRPX01BTkFHRVIKKwlzZWxlY3QgQ1JZUFRPX0dGMTI4TVVMCisJaGVscAorCSAgTFJXOiBMaXNrb3YgUml2ZXN0IFdhZ25lciwgYSB0d2Vha2FibGUsIG5vbiBtYWxsZWFibGUsIG5vbiBtb3ZhYmxlCisJICBuYXJyb3cgYmxvY2sgY2lwaGVyIG1vZGUgZm9yIGRtLWNyeXB0LiAgVXNlIGl0IHdpdGggY2lwaGVyCisJICBzcGVjaWZpY2F0aW9uIHN0cmluZyBhZXMtbHJ3LWJlbmJpLCB0aGUga2V5IG11c3QgYmUgMjU2LCAzMjAgb3IgMzg0LgorCSAgVGhlIGZpcnN0IDEyOCwgMTkyIG9yIDI1NiBiaXRzIGluIHRoZSBrZXkgYXJlIHVzZWQgZm9yIEFFUyBhbmQgdGhlCisJICByZXN0IGlzIHVzZWQgdG8gdGllIGVhY2ggY2lwaGVyIGJsb2NrIHRvIGl0cyBsb2dpY2FsIHBvc2l0aW9uLgorCiBjb25maWcgQ1JZUFRPX0RFUwogCXRyaXN0YXRlICJERVMgYW5kIFRyaXBsZSBERVMgRURFIGNpcGhlciBhbGdvcml0aG1zIgogCXNlbGVjdCBDUllQVE9fQUxHQVBJCmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGUKaW5kZXggNzIzNjYyMC4uNjBlM2QyNGYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9NYWtlZmlsZQorKysgYi9jcnlwdG8vTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDcgQEAKIAogb2JqLSQoQ09ORklHX0NSWVBUT19NQU5BR0VSKSArPSBjcnlwdG9tZ3Iubwogb2JqLSQoQ09ORklHX0NSWVBUT19ITUFDKSArPSBobWFjLm8KK29iai0kKENPTkZJR19DUllQVE9fWENCQykgKz0geGNiYy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX05VTEwpICs9IGNyeXB0b19udWxsLm8KIG9iai0kKENPTkZJR19DUllQVE9fTUQ0KSArPSBtZDQubwogb2JqLSQoQ09ORklHX0NSWVBUT19NRDUpICs9IG1kNS5vCkBAIC0yMyw4ICsyNCwxMCBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19TSEE1MTIpICs9IHNoYTUxMi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1dQNTEyKSArPSB3cDUxMi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1RHUjE5MikgKz0gdGdyMTkyLm8KK29iai0kKENPTkZJR19DUllQVE9fR0YxMjhNVUwpICs9IGdmMTI4bXVsLm8KIG9iai0kKENPTkZJR19DUllQVE9fRUNCKSArPSBlY2Iubwogb2JqLSQoQ09ORklHX0NSWVBUT19DQkMpICs9IGNiYy5vCitvYmotJChDT05GSUdfQ1JZUFRPX0xSVykgKz0gbHJ3Lm8KIG9iai0kKENPTkZJR19DUllQVE9fREVTKSArPSBkZXMubwogb2JqLSQoQ09ORklHX0NSWVBUT19CTE9XRklTSCkgKz0gYmxvd2Zpc2gubwogb2JqLSQoQ09ORklHX0NSWVBUT19UV09GSVNIKSArPSB0d29maXNoLm8KZGlmZiAtLWdpdCBhL2NyeXB0by9hcGkuYyBiL2NyeXB0by9hcGkuYwppbmRleCAyZTg0ZDRiLi44YzQ0Njg3IDEwMDY0NAotLS0gYS9jcnlwdG8vYXBpLmMKKysrIGIvY3J5cHRvL2FwaS5jCkBAIC0zMzEsNyArMzMxLDcgQEAKIAl0Zm1fc2l6ZSA9IHNpemVvZigqdGZtKSArIGNyeXB0b19jdHhzaXplKGFsZywgZmxhZ3MpOwogCXRmbSA9IGt6YWxsb2ModGZtX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICh0Zm0gPT0gTlVMTCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2VycjsKIAogCXRmbS0+X19jcnRfYWxnID0gYWxnOwogCkBAIC0zNTUsNiArMzU1LDcgQEAKIAljcnlwdG9fZXhpdF9vcHModGZtKTsKIG91dF9mcmVlX3RmbToKIAlrZnJlZSh0Zm0pOworb3V0X2VycjoKIAl0Zm0gPSBFUlJfUFRSKGVycik7CiBvdXQ6CiAJcmV0dXJuIHRmbTsKQEAgLTQxNCwxNCArNDE1LDE0IEBACiAJCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CiAKIAkJYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKGFsZ19uYW1lLCB0eXBlLCBtYXNrKTsKLQkJZXJyID0gUFRSX0VSUihhbGcpOwotCQl0Zm0gPSBFUlJfUFRSKGVycik7Ci0JCWlmIChJU19FUlIoYWxnKSkKKwkJaWYgKElTX0VSUihhbGcpKSB7CisJCQllcnIgPSBQVFJfRVJSKGFsZyk7CiAJCQlnb3RvIGVycjsKKwkJfQogCiAJCXRmbSA9IF9fY3J5cHRvX2FsbG9jX3RmbShhbGcsIDApOwogCQlpZiAoIUlTX0VSUih0Zm0pKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gdGZtOwogCiAJCWNyeXB0b19tb2RfcHV0KGFsZyk7CiAJCWVyciA9IFBUUl9FUlIodGZtKTsKQEAgLTQzMyw5ICs0MzQsOSBAQAogCQkJZXJyID0gLUVJTlRSOwogCQkJYnJlYWs7CiAJCX0KLQl9OworCX0KIAotCXJldHVybiB0Zm07CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGxvY19iYXNlKTsKICAKQEAgLTQ2NSwyMyArNDY2LDggQEAKIAlrZnJlZSh0Zm0pOwogfQogCi1pbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAobmFtZSwgMCwKLQkJCQkJCSAgICAgICBDUllQVE9fQUxHX0FTWU5DKTsKLQkKLQlpZiAoIUlTX0VSUihhbGcpKSB7Ci0JCWNyeXB0b19tb2RfcHV0KGFsZyk7Ci0JCXJldCA9IDE7Ci0JfQotCQotCXJldHVybiByZXQ7Ci19Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGxvY190Zm0pOwogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2ZyZWVfdGZtKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19hbGdfYXZhaWxhYmxlKTsKIAogaW50IGNyeXB0b19oYXNfYWxnKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKIHsKZGlmZiAtLWdpdCBhL2NyeXB0by9ibGtjaXBoZXIuYyBiL2NyeXB0by9ibGtjaXBoZXIuYwppbmRleCAwMzRjOTM5Yi4uNmU5MzAwNGYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9ibGtjaXBoZXIuYworKysgYi9jcnlwdG8vYmxrY2lwaGVyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0b21nci5jIGIvY3J5cHRvL2NyeXB0b21nci5jCmluZGV4IDliNWIxNTYuLjJlYmZmYjggMTAwNjQ0Ci0tLSBhL2NyeXB0by9jcnlwdG9tZ3IuYworKysgYi9jcnlwdG8vY3J5cHRvbWdyLmMKQEAgLTQwLDkgKzQwLDEwIEBACiAJY2hhciB0ZW1wbGF0ZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKIH07CiAKLXN0YXRpYyB2b2lkIGNyeXB0b21ncl9wcm9iZSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgY3J5cHRvbWdyX3Byb2JlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgY3J5cHRvbWdyX3BhcmFtICpwYXJhbSA9IGRhdGE7CisJc3RydWN0IGNyeXB0b21ncl9wYXJhbSAqcGFyYW0gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNyeXB0b21ncl9wYXJhbSwgd29yayk7CiAJc3RydWN0IGNyeXB0b190ZW1wbGF0ZSAqdG1wbDsKIAlzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0OwogCWludCBlcnI7CkBAIC0xMTIsNyArMTEzLDcgQEAKIAlwYXJhbS0+bGFydmFsLnR5cGUgPSBsYXJ2YWwtPmFsZy5jcmFfZmxhZ3M7CiAJcGFyYW0tPmxhcnZhbC5tYXNrID0gbGFydmFsLT5tYXNrOwogCi0JSU5JVF9XT1JLKCZwYXJhbS0+d29yaywgY3J5cHRvbWdyX3Byb2JlLCBwYXJhbSk7CisJSU5JVF9XT1JLKCZwYXJhbS0+d29yaywgY3J5cHRvbWdyX3Byb2JlKTsKIAlzY2hlZHVsZV93b3JrKCZwYXJhbS0+d29yayk7CiAKIAlyZXR1cm4gTk9USUZZX1NUT1A7CmRpZmYgLS1naXQgYS9jcnlwdG8vZGlnZXN0LmMgYi9jcnlwdG8vZGlnZXN0LmMKaW5kZXggMDE1NWE5NGUuLjhmNDU5MzIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9kaWdlc3QuYworKysgYi9jcnlwdG8vZGlnZXN0LmMKQEAgLTIxLDU0ICsyMSw2IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzY2F0dGVyd2Fsay5oIgogCi12b2lkIGNyeXB0b19kaWdlc3RfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQotewotCXN0cnVjdCBjcnlwdG9faGFzaCAqaGFzaCA9IGNyeXB0b19oYXNoX2Nhc3QodGZtKTsKLQlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2MgPSB7IC50Zm0gPSBoYXNoLCAuZmxhZ3MgPSB0Zm0tPmNydF9mbGFncyB9OwotCi0JY3J5cHRvX2hhc2hfaW5pdCgmZGVzYyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fZGlnZXN0X2luaXQpOwotCi12b2lkIGNyeXB0b19kaWdlc3RfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpCi17Ci0Jc3RydWN0IGNyeXB0b19oYXNoICpoYXNoID0gY3J5cHRvX2hhc2hfY2FzdCh0Zm0pOwotCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYyA9IHsgLnRmbSA9IGhhc2gsIC5mbGFncyA9IHRmbS0+Y3J0X2ZsYWdzIH07Ci0JdW5zaWduZWQgaW50IG5ieXRlcyA9IDA7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspCi0JCW5ieXRlcyArPSBzZ1tpXS5sZW5ndGg7Ci0KLQljcnlwdG9faGFzaF91cGRhdGUoJmRlc2MsIHNnLCBuYnl0ZXMpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2RpZ2VzdF91cGRhdGUpOwotCi12b2lkIGNyeXB0b19kaWdlc3RfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKLXsKLQlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmhhc2ggPSBjcnlwdG9faGFzaF9jYXN0KHRmbSk7Ci0Jc3RydWN0IGhhc2hfZGVzYyBkZXNjID0geyAudGZtID0gaGFzaCwgLmZsYWdzID0gdGZtLT5jcnRfZmxhZ3MgfTsKLQotCWNyeXB0b19oYXNoX2ZpbmFsKCZkZXNjLCBvdXQpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2RpZ2VzdF9maW5hbCk7Ci0KLXZvaWQgY3J5cHRvX2RpZ2VzdF9kaWdlc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCkKLXsKLQlzdHJ1Y3QgY3J5cHRvX2hhc2ggKmhhc2ggPSBjcnlwdG9faGFzaF9jYXN0KHRmbSk7Ci0Jc3RydWN0IGhhc2hfZGVzYyBkZXNjID0geyAudGZtID0gaGFzaCwgLmZsYWdzID0gdGZtLT5jcnRfZmxhZ3MgfTsKLQl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gMDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBuc2c7IGkrKykKLQkJbmJ5dGVzICs9IHNnW2ldLmxlbmd0aDsKLQotCWNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgc2csIG5ieXRlcywgb3V0KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19kaWdlc3RfZGlnZXN0KTsKLQogc3RhdGljIGludCBpbml0KHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MpCiB7CiAJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGNyeXB0b19oYXNoX3RmbShkZXNjLT50Zm0pOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2dmMTI4bXVsLmMgYi9jcnlwdG8vZ2YxMjhtdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTJhYWRmCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2dmMTI4bXVsLmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qIGdmMTI4bXVsLmMgLSBHRigyXjEyOCkgbXVsdGlwbGljYXRpb24gZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCBEciBCcmlhbiBHbGFkbWFuLCBXb3JjZXN0ZXIsIFVLLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCBSaWsgU25lbCA8cnNuZWxAY3ViZS5keW5kbnMub3JnPgorICoKKyAqIEJhc2VkIG9uIERyIEJyaWFuIEdsYWRtYW4ncyAoR1BMJ2QpIHdvcmsgcHVibGlzaGVkIGF0CisgKiBodHRwOi8vZnAuZ2xhZG1hbi5wbHVzLmNvbS9jcnlwdG9ncmFwaHlfdGVjaG5vbG9neS9pbmRleC5odG0KKyAqIFNlZSB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBiZWxvdy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ29weXJpZ2h0IChjKSAyMDAzLCBEciBCcmlhbiBHbGFkbWFuLCBXb3JjZXN0ZXIsIFVLLiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBMSUNFTlNFIFRFUk1TCisKKyBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyBmb3JtIGlzIGFsbG93ZWQgKHdpdGggb3Igd2l0aG91dCBjaGFuZ2VzKSBwcm92aWRlZCB0aGF0OgorCisgICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXI7CisKKyAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAgICAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBhc3NvY2lhdGVkIG1hdGVyaWFsczsKKworICAgMy4gdGhlIGNvcHlyaWdodCBob2xkZXIncyBuYW1lIGlzIG5vdCB1c2VkIHRvIGVuZG9yc2UgcHJvZHVjdHMKKyAgICAgIGJ1aWx0IHVzaW5nIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBBTFRFUk5BVElWRUxZLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHJldGFpbmVkIGluIGZ1bGwsIHRoaXMgcHJvZHVjdAorIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLAorIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorCisgRElTQ0xBSU1FUgorCisgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMgaXMnIHdpdGggbm8gZXhwbGljaXQgb3IgaW1wbGllZCB3YXJyYW50aWVzCisgaW4gcmVzcGVjdCBvZiBpdHMgcHJvcGVydGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIGNvcnJlY3RuZXNzCisgYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSXNzdWUgMzEvMDEvMjAwNgorCisgVGhpcyBmaWxlIHByb3ZpZGVzIGZhc3QgbXVsdGlwbGljYXRpb24gaW4gR0YoMTI4KSBhcyByZXF1aXJlZCBieSBzZXZlcmFsCisgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiBtb2RlcworKi8KKworI2luY2x1ZGUgPGNyeXB0by9nZjEyOG11bC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBnZjEyOG11bF9kYXQocSkgeyBcCisJcSgweDAwKSwgcSgweDAxKSwgcSgweDAyKSwgcSgweDAzKSwgcSgweDA0KSwgcSgweDA1KSwgcSgweDA2KSwgcSgweDA3KSxcCisJcSgweDA4KSwgcSgweDA5KSwgcSgweDBhKSwgcSgweDBiKSwgcSgweDBjKSwgcSgweDBkKSwgcSgweDBlKSwgcSgweDBmKSxcCisJcSgweDEwKSwgcSgweDExKSwgcSgweDEyKSwgcSgweDEzKSwgcSgweDE0KSwgcSgweDE1KSwgcSgweDE2KSwgcSgweDE3KSxcCisJcSgweDE4KSwgcSgweDE5KSwgcSgweDFhKSwgcSgweDFiKSwgcSgweDFjKSwgcSgweDFkKSwgcSgweDFlKSwgcSgweDFmKSxcCisJcSgweDIwKSwgcSgweDIxKSwgcSgweDIyKSwgcSgweDIzKSwgcSgweDI0KSwgcSgweDI1KSwgcSgweDI2KSwgcSgweDI3KSxcCisJcSgweDI4KSwgcSgweDI5KSwgcSgweDJhKSwgcSgweDJiKSwgcSgweDJjKSwgcSgweDJkKSwgcSgweDJlKSwgcSgweDJmKSxcCisJcSgweDMwKSwgcSgweDMxKSwgcSgweDMyKSwgcSgweDMzKSwgcSgweDM0KSwgcSgweDM1KSwgcSgweDM2KSwgcSgweDM3KSxcCisJcSgweDM4KSwgcSgweDM5KSwgcSgweDNhKSwgcSgweDNiKSwgcSgweDNjKSwgcSgweDNkKSwgcSgweDNlKSwgcSgweDNmKSxcCisJcSgweDQwKSwgcSgweDQxKSwgcSgweDQyKSwgcSgweDQzKSwgcSgweDQ0KSwgcSgweDQ1KSwgcSgweDQ2KSwgcSgweDQ3KSxcCisJcSgweDQ4KSwgcSgweDQ5KSwgcSgweDRhKSwgcSgweDRiKSwgcSgweDRjKSwgcSgweDRkKSwgcSgweDRlKSwgcSgweDRmKSxcCisJcSgweDUwKSwgcSgweDUxKSwgcSgweDUyKSwgcSgweDUzKSwgcSgweDU0KSwgcSgweDU1KSwgcSgweDU2KSwgcSgweDU3KSxcCisJcSgweDU4KSwgcSgweDU5KSwgcSgweDVhKSwgcSgweDViKSwgcSgweDVjKSwgcSgweDVkKSwgcSgweDVlKSwgcSgweDVmKSxcCisJcSgweDYwKSwgcSgweDYxKSwgcSgweDYyKSwgcSgweDYzKSwgcSgweDY0KSwgcSgweDY1KSwgcSgweDY2KSwgcSgweDY3KSxcCisJcSgweDY4KSwgcSgweDY5KSwgcSgweDZhKSwgcSgweDZiKSwgcSgweDZjKSwgcSgweDZkKSwgcSgweDZlKSwgcSgweDZmKSxcCisJcSgweDcwKSwgcSgweDcxKSwgcSgweDcyKSwgcSgweDczKSwgcSgweDc0KSwgcSgweDc1KSwgcSgweDc2KSwgcSgweDc3KSxcCisJcSgweDc4KSwgcSgweDc5KSwgcSgweDdhKSwgcSgweDdiKSwgcSgweDdjKSwgcSgweDdkKSwgcSgweDdlKSwgcSgweDdmKSxcCisJcSgweDgwKSwgcSgweDgxKSwgcSgweDgyKSwgcSgweDgzKSwgcSgweDg0KSwgcSgweDg1KSwgcSgweDg2KSwgcSgweDg3KSxcCisJcSgweDg4KSwgcSgweDg5KSwgcSgweDhhKSwgcSgweDhiKSwgcSgweDhjKSwgcSgweDhkKSwgcSgweDhlKSwgcSgweDhmKSxcCisJcSgweDkwKSwgcSgweDkxKSwgcSgweDkyKSwgcSgweDkzKSwgcSgweDk0KSwgcSgweDk1KSwgcSgweDk2KSwgcSgweDk3KSxcCisJcSgweDk4KSwgcSgweDk5KSwgcSgweDlhKSwgcSgweDliKSwgcSgweDljKSwgcSgweDlkKSwgcSgweDllKSwgcSgweDlmKSxcCisJcSgweGEwKSwgcSgweGExKSwgcSgweGEyKSwgcSgweGEzKSwgcSgweGE0KSwgcSgweGE1KSwgcSgweGE2KSwgcSgweGE3KSxcCisJcSgweGE4KSwgcSgweGE5KSwgcSgweGFhKSwgcSgweGFiKSwgcSgweGFjKSwgcSgweGFkKSwgcSgweGFlKSwgcSgweGFmKSxcCisJcSgweGIwKSwgcSgweGIxKSwgcSgweGIyKSwgcSgweGIzKSwgcSgweGI0KSwgcSgweGI1KSwgcSgweGI2KSwgcSgweGI3KSxcCisJcSgweGI4KSwgcSgweGI5KSwgcSgweGJhKSwgcSgweGJiKSwgcSgweGJjKSwgcSgweGJkKSwgcSgweGJlKSwgcSgweGJmKSxcCisJcSgweGMwKSwgcSgweGMxKSwgcSgweGMyKSwgcSgweGMzKSwgcSgweGM0KSwgcSgweGM1KSwgcSgweGM2KSwgcSgweGM3KSxcCisJcSgweGM4KSwgcSgweGM5KSwgcSgweGNhKSwgcSgweGNiKSwgcSgweGNjKSwgcSgweGNkKSwgcSgweGNlKSwgcSgweGNmKSxcCisJcSgweGQwKSwgcSgweGQxKSwgcSgweGQyKSwgcSgweGQzKSwgcSgweGQ0KSwgcSgweGQ1KSwgcSgweGQ2KSwgcSgweGQ3KSxcCisJcSgweGQ4KSwgcSgweGQ5KSwgcSgweGRhKSwgcSgweGRiKSwgcSgweGRjKSwgcSgweGRkKSwgcSgweGRlKSwgcSgweGRmKSxcCisJcSgweGUwKSwgcSgweGUxKSwgcSgweGUyKSwgcSgweGUzKSwgcSgweGU0KSwgcSgweGU1KSwgcSgweGU2KSwgcSgweGU3KSxcCisJcSgweGU4KSwgcSgweGU5KSwgcSgweGVhKSwgcSgweGViKSwgcSgweGVjKSwgcSgweGVkKSwgcSgweGVlKSwgcSgweGVmKSxcCisJcSgweGYwKSwgcSgweGYxKSwgcSgweGYyKSwgcSgweGYzKSwgcSgweGY0KSwgcSgweGY1KSwgcSgweGY2KSwgcSgweGY3KSxcCisJcSgweGY4KSwgcSgweGY5KSwgcSgweGZhKSwgcSgweGZiKSwgcSgweGZjKSwgcSgweGZkKSwgcSgweGZlKSwgcSgweGZmKSBcCit9CisKKy8qCUdpdmVuIHRoZSB2YWx1ZSBpIGluIDAuLjI1NSBhcyB0aGUgYnl0ZSBvdmVyZmxvdyB3aGVuIGEgZmllbGQgZWxlbWVudAorICAgIGluIEdIQVNIIGlzIG11bHRpcGxlZCBieSB4XjgsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHZhbHVlcyB0aGF0CisgICAgYXJlIGdlbmVyYXRlZCBpbiB0aGUgbG8gMTYtYml0IHdvcmQgb2YgdGhlIGZpZWxkIHZhbHVlIGJ5IGFwcGx5aW5nIHRoZQorICAgIG1vZHVsYXIgcG9seW5vbWlhbC4gVGhlIHZhbHVlcyBsb19ieXRlIGFuZCBoaV9ieXRlIGFyZSByZXR1cm5lZCB2aWEgdGhlCisgICAgbWFjcm8geHBfZnVuKGxvX2J5dGUsIGhpX2J5dGUpIHNvIHRoYXQgdGhlIHZhbHVlcyBjYW4gYmUgYXNzZW1ibGVkIGludG8KKyAgICBtZW1vcnkgYXMgcmVxdWlyZWQgYnkgYSBzdWl0YWJsZSBkZWZpbml0aW9uIG9mIHRoaXMgbWFjcm8gb3BlcmF0aW5nIG9uCisgICAgdGhlIHRhYmxlIGFib3ZlCisqLworCisjZGVmaW5lIHh4KHAsIHEpCTB4IyNwIyNxCisKKyNkZWZpbmUgeGRhX2JiZShpKSAoIFwKKwkoaSAmIDB4ODAgPyB4eCg0MywgODApIDogMCkgXiAoaSAmIDB4NDAgPyB4eCgyMSwgYzApIDogMCkgXiBcCisJKGkgJiAweDIwID8geHgoMTAsIGUwKSA6IDApIF4gKGkgJiAweDEwID8geHgoMDgsIDcwKSA6IDApIF4gXAorCShpICYgMHgwOCA/IHh4KDA0LCAzOCkgOiAwKSBeIChpICYgMHgwNCA/IHh4KDAyLCAxYykgOiAwKSBeIFwKKwkoaSAmIDB4MDIgPyB4eCgwMSwgMGUpIDogMCkgXiAoaSAmIDB4MDEgPyB4eCgwMCwgODcpIDogMCkgXAorKQorCisjZGVmaW5lIHhkYV9sbGUoaSkgKCBcCisJKGkgJiAweDgwID8geHgoZTEsIDAwKSA6IDApIF4gKGkgJiAweDQwID8geHgoNzAsIDgwKSA6IDApIF4gXAorCShpICYgMHgyMCA/IHh4KDM4LCA0MCkgOiAwKSBeIChpICYgMHgxMCA/IHh4KDFjLCAyMCkgOiAwKSBeIFwKKwkoaSAmIDB4MDggPyB4eCgwZSwgMTApIDogMCkgXiAoaSAmIDB4MDQgPyB4eCgwNywgMDgpIDogMCkgXiBcCisJKGkgJiAweDAyID8geHgoMDMsIDg0KSA6IDApIF4gKGkgJiAweDAxID8geHgoMDEsIGMyKSA6IDApIFwKKykKKworc3RhdGljIGNvbnN0IHUxNiBnZjEyOG11bF90YWJsZV9sbGVbMjU2XSA9IGdmMTI4bXVsX2RhdCh4ZGFfbGxlKTsKK3N0YXRpYyBjb25zdCB1MTYgZ2YxMjhtdWxfdGFibGVfYmJlWzI1Nl0gPSBnZjEyOG11bF9kYXQoeGRhX2JiZSk7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBtdWx0aXBseSBhIGZpZWxkIGVsZW1lbnQgYnkgeCwgYnkgeF40IGFuZCBieSB4XjgKKyAqIGluIHRoZSBwb2x5bm9taWFsIGZpZWxkIHJlcHJlc2VudGF0aW9uLiBJdCB1c2VzIDMyLWJpdCB3b3JkIG9wZXJhdGlvbnMKKyAqIHRvIGdhaW4gc3BlZWQgYnV0IGNvbXBlbnNhdGVzIGZvciBtYWNoaW5lIGVuZGlhbmVzcyBhbmQgaGVuY2Ugd29ya3MKKyAqIGNvcnJlY3RseSBvbiBib3RoIHN0eWxlcyBvZiBtYWNoaW5lLgorICovCisKK3N0YXRpYyB2b2lkIGdmMTI4bXVsX3hfbGxlKGJlMTI4ICpyLCBjb25zdCBiZTEyOCAqeCkKK3sKKwl1NjQgYSA9IGJlNjRfdG9fY3B1KHgtPmEpOworCXU2NCBiID0gYmU2NF90b19jcHUoeC0+Yik7CisJdTY0IF90dCA9IGdmMTI4bXVsX3RhYmxlX2xsZVsoYiA8PCA3KSAmIDB4ZmZdOworCisJci0+YiA9IGNwdV90b19iZTY0KChiID4+IDEpIHwgKGEgPDwgNjMpKTsKKwlyLT5hID0gY3B1X3RvX2JlNjQoKGEgPj4gMSkgXiAoX3R0IDw8IDQ4KSk7Cit9CisKK3N0YXRpYyB2b2lkIGdmMTI4bXVsX3hfYmJlKGJlMTI4ICpyLCBjb25zdCBiZTEyOCAqeCkKK3sKKwl1NjQgYSA9IGJlNjRfdG9fY3B1KHgtPmEpOworCXU2NCBiID0gYmU2NF90b19jcHUoeC0+Yik7CisJdTY0IF90dCA9IGdmMTI4bXVsX3RhYmxlX2JiZVthID4+IDYzXTsKKworCXItPmEgPSBjcHVfdG9fYmU2NCgoYSA8PCAxKSB8IChiID4+IDYzKSk7CisJci0+YiA9IGNwdV90b19iZTY0KChiIDw8IDEpIF4gX3R0KTsKK30KKworc3RhdGljIHZvaWQgZ2YxMjhtdWxfeDhfbGxlKGJlMTI4ICp4KQoreworCXU2NCBhID0gYmU2NF90b19jcHUoeC0+YSk7CisJdTY0IGIgPSBiZTY0X3RvX2NwdSh4LT5iKTsKKwl1NjQgX3R0ID0gZ2YxMjhtdWxfdGFibGVfbGxlW2IgJiAweGZmXTsKKworCXgtPmIgPSBjcHVfdG9fYmU2NCgoYiA+PiA4KSB8IChhIDw8IDU2KSk7CisJeC0+YSA9IGNwdV90b19iZTY0KChhID4+IDgpIF4gKF90dCA8PCA0OCkpOworfQorCitzdGF0aWMgdm9pZCBnZjEyOG11bF94OF9iYmUoYmUxMjggKngpCit7CisJdTY0IGEgPSBiZTY0X3RvX2NwdSh4LT5hKTsKKwl1NjQgYiA9IGJlNjRfdG9fY3B1KHgtPmIpOworCXU2NCBfdHQgPSBnZjEyOG11bF90YWJsZV9iYmVbYSA+PiA1Nl07CisKKwl4LT5hID0gY3B1X3RvX2JlNjQoKGEgPDwgOCkgfCAoYiA+PiA1NikpOworCXgtPmIgPSBjcHVfdG9fYmU2NCgoYiA8PCA4KSBeIF90dCk7Cit9CisKK3ZvaWQgZ2YxMjhtdWxfbGxlKGJlMTI4ICpyLCBjb25zdCBiZTEyOCAqYikKK3sKKwliZTEyOCBwWzhdOworCWludCBpOworCisJcFswXSA9ICpyOworCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCisJCWdmMTI4bXVsX3hfbGxlKCZwW2kgKyAxXSwgJnBbaV0pOworCisJbWVtc2V0KHIsIDAsIHNpemVvZihyKSk7CisJZm9yIChpID0gMDs7KSB7CisJCXU4IGNoID0gKCh1OCAqKWIpWzE1IC0gaV07CisKKwkJaWYgKGNoICYgMHg4MCkKKwkJCWJlMTI4X3hvcihyLCByLCAmcFswXSk7CisJCWlmIChjaCAmIDB4NDApCisJCQliZTEyOF94b3IociwgciwgJnBbMV0pOworCQlpZiAoY2ggJiAweDIwKQorCQkJYmUxMjhfeG9yKHIsIHIsICZwWzJdKTsKKwkJaWYgKGNoICYgMHgxMCkKKwkJCWJlMTI4X3hvcihyLCByLCAmcFszXSk7CisJCWlmIChjaCAmIDB4MDgpCisJCQliZTEyOF94b3IociwgciwgJnBbNF0pOworCQlpZiAoY2ggJiAweDA0KQorCQkJYmUxMjhfeG9yKHIsIHIsICZwWzVdKTsKKwkJaWYgKGNoICYgMHgwMikKKwkJCWJlMTI4X3hvcihyLCByLCAmcFs2XSk7CisJCWlmIChjaCAmIDB4MDEpCisJCQliZTEyOF94b3IociwgciwgJnBbN10pOworCisJCWlmICgrK2kgPj0gMTYpCisJCQlicmVhazsKKworCQlnZjEyOG11bF94OF9sbGUocik7CisJfQorfQorRVhQT1JUX1NZTUJPTChnZjEyOG11bF9sbGUpOworCit2b2lkIGdmMTI4bXVsX2JiZShiZTEyOCAqciwgY29uc3QgYmUxMjggKmIpCit7CisJYmUxMjggcFs4XTsKKwlpbnQgaTsKKworCXBbMF0gPSAqcjsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgKytpKQorCQlnZjEyOG11bF94X2JiZSgmcFtpICsgMV0sICZwW2ldKTsKKworCW1lbXNldChyLCAwLCBzaXplb2YocikpOworCWZvciAoaSA9IDA7OykgeworCQl1OCBjaCA9ICgodTggKiliKVtpXTsKKworCQlpZiAoY2ggJiAweDgwKQorCQkJYmUxMjhfeG9yKHIsIHIsICZwWzddKTsKKwkJaWYgKGNoICYgMHg0MCkKKwkJCWJlMTI4X3hvcihyLCByLCAmcFs2XSk7CisJCWlmIChjaCAmIDB4MjApCisJCQliZTEyOF94b3IociwgciwgJnBbNV0pOworCQlpZiAoY2ggJiAweDEwKQorCQkJYmUxMjhfeG9yKHIsIHIsICZwWzRdKTsKKwkJaWYgKGNoICYgMHgwOCkKKwkJCWJlMTI4X3hvcihyLCByLCAmcFszXSk7CisJCWlmIChjaCAmIDB4MDQpCisJCQliZTEyOF94b3IociwgciwgJnBbMl0pOworCQlpZiAoY2ggJiAweDAyKQorCQkJYmUxMjhfeG9yKHIsIHIsICZwWzFdKTsKKwkJaWYgKGNoICYgMHgwMSkKKwkJCWJlMTI4X3hvcihyLCByLCAmcFswXSk7CisKKwkJaWYgKCsraSA+PSAxNikKKwkJCWJyZWFrOworCisJCWdmMTI4bXVsX3g4X2JiZShyKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGdmMTI4bXVsX2JiZSk7CisKKy8qICAgICAgVGhpcyB2ZXJzaW9uIHVzZXMgNjRrIGJ5dGVzIG9mIHRhYmxlIHNwYWNlLgorICAgIEEgMTYgYnl0ZSBidWZmZXIgaGFzIHRvIGJlIG11bHRpcGxpZWQgYnkgYSAxNiBieXRlIGtleQorICAgIHZhbHVlIGluIEdGKDEyOCkuICBJZiB3ZSBjb25zaWRlciBhIEdGKDEyOCkgdmFsdWUgaW4KKyAgICB0aGUgYnVmZmVyJ3MgbG93ZXN0IGJ5dGUsIHdlIGNhbiBjb25zdHJ1Y3QgYSB0YWJsZSBvZgorICAgIHRoZSAyNTYgMTYgYnl0ZSB2YWx1ZXMgdGhhdCByZXN1bHQgZnJvbSB0aGUgMjU2IHZhbHVlcworICAgIG9mIHRoaXMgYnl0ZS4gIFRoaXMgcmVxdWlyZXMgNDA5NiBieXRlcy4gQnV0IHdlIGFsc28KKyAgICBuZWVkIHRhYmxlcyBmb3IgZWFjaCBvZiB0aGUgMTYgaGlnaGVyIGJ5dGVzIGluIHRoZQorICAgIGJ1ZmZlciBhcyB3ZWxsLCB3aGljaCBtYWtlcyA2NCBrYnl0ZXMgaW4gdG90YWwuCisqLworLyogYWRkaXRpb25hbCBleHBsYW5hdGlvbgorICogdFswXVtCWVRFXSBjb250YWlucyBnKkJZVEUKKyAqIHRbMV1bQllURV0gY29udGFpbnMgZyp4XjgqQllURQorICogIC4uCisgKiB0WzE1XVtCWVRFXSBjb250YWlucyBnKnheMTIwKkJZVEUgKi8KK3N0cnVjdCBnZjEyOG11bF82NGsgKmdmMTI4bXVsX2luaXRfNjRrX2xsZShjb25zdCBiZTEyOCAqZykKK3sKKwlzdHJ1Y3QgZ2YxMjhtdWxfNjRrICp0OworCWludCBpLCBqLCBrOworCisJdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0KQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXQtPnRbaV0gPSBremFsbG9jKHNpemVvZigqdC0+dFtpXSksIEdGUF9LRVJORUwpOworCQlpZiAoIXQtPnRbaV0pIHsKKwkJCWdmMTI4bXVsX2ZyZWVfNjRrKHQpOworCQkJdCA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXQtPnRbMF0tPnRbMTI4XSA9ICpnOworCWZvciAoaiA9IDY0OyBqID4gMDsgaiA+Pj0gMSkKKwkJZ2YxMjhtdWxfeF9sbGUoJnQtPnRbMF0tPnRbal0sICZ0LT50WzBdLT50W2ogKyBqXSk7CisKKwlmb3IgKGkgPSAwOzspIHsKKwkJZm9yIChqID0gMjsgaiA8IDI1NjsgaiArPSBqKQorCQkJZm9yIChrID0gMTsgayA8IGo7ICsraykKKwkJCQliZTEyOF94b3IoJnQtPnRbaV0tPnRbaiArIGtdLAorCQkJCQkgICZ0LT50W2ldLT50W2pdLCAmdC0+dFtpXS0+dFtrXSk7CisKKwkJaWYgKCsraSA+PSAxNikKKwkJCWJyZWFrOworCisJCWZvciAoaiA9IDEyODsgaiA+IDA7IGogPj49IDEpIHsKKwkJCXQtPnRbaV0tPnRbal0gPSB0LT50W2kgLSAxXS0+dFtqXTsKKwkJCWdmMTI4bXVsX3g4X2xsZSgmdC0+dFtpXS0+dFtqXSk7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gdDsKK30KK0VYUE9SVF9TWU1CT0woZ2YxMjhtdWxfaW5pdF82NGtfbGxlKTsKKworc3RydWN0IGdmMTI4bXVsXzY0ayAqZ2YxMjhtdWxfaW5pdF82NGtfYmJlKGNvbnN0IGJlMTI4ICpnKQoreworCXN0cnVjdCBnZjEyOG11bF82NGsgKnQ7CisJaW50IGksIGosIGs7CisKKwl0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXQpCisJCWdvdG8gb3V0OworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdC0+dFtpXSA9IGt6YWxsb2Moc2l6ZW9mKCp0LT50W2ldKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdC0+dFtpXSkgeworCQkJZ2YxMjhtdWxfZnJlZV82NGsodCk7CisJCQl0ID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJdC0+dFswXS0+dFsxXSA9ICpnOworCWZvciAoaiA9IDE7IGogPD0gNjQ7IGogPDw9IDEpCisJCWdmMTI4bXVsX3hfYmJlKCZ0LT50WzBdLT50W2ogKyBqXSwgJnQtPnRbMF0tPnRbal0pOworCisJZm9yIChpID0gMDs7KSB7CisJCWZvciAoaiA9IDI7IGogPCAyNTY7IGogKz0gaikKKwkJCWZvciAoayA9IDE7IGsgPCBqOyArK2spCisJCQkJYmUxMjhfeG9yKCZ0LT50W2ldLT50W2ogKyBrXSwKKwkJCQkJICAmdC0+dFtpXS0+dFtqXSwgJnQtPnRbaV0tPnRba10pOworCisJCWlmICgrK2kgPj0gMTYpCisJCQlicmVhazsKKworCQlmb3IgKGogPSAxMjg7IGogPiAwOyBqID4+PSAxKSB7CisJCQl0LT50W2ldLT50W2pdID0gdC0+dFtpIC0gMV0tPnRbal07CisJCQlnZjEyOG11bF94OF9iYmUoJnQtPnRbaV0tPnRbal0pOworCQl9CisJfQorCitvdXQ6CisJcmV0dXJuIHQ7Cit9CitFWFBPUlRfU1lNQk9MKGdmMTI4bXVsX2luaXRfNjRrX2JiZSk7CisKK3ZvaWQgZ2YxMjhtdWxfZnJlZV82NGsoc3RydWN0IGdmMTI4bXVsXzY0ayAqdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlrZnJlZSh0LT50W2ldKTsKKwlrZnJlZSh0KTsKK30KK0VYUE9SVF9TWU1CT0woZ2YxMjhtdWxfZnJlZV82NGspOworCit2b2lkIGdmMTI4bXVsXzY0a19sbGUoYmUxMjggKmEsIHN0cnVjdCBnZjEyOG11bF82NGsgKnQpCit7CisJdTggKmFwID0gKHU4ICopYTsKKwliZTEyOCByWzFdOworCWludCBpOworCisJKnIgPSB0LT50WzBdLT50W2FwWzBdXTsKKwlmb3IgKGkgPSAxOyBpIDwgMTY7ICsraSkKKwkJYmUxMjhfeG9yKHIsIHIsICZ0LT50W2ldLT50W2FwW2ldXSk7CisJKmEgPSAqcjsKK30KK0VYUE9SVF9TWU1CT0woZ2YxMjhtdWxfNjRrX2xsZSk7CisKK3ZvaWQgZ2YxMjhtdWxfNjRrX2JiZShiZTEyOCAqYSwgc3RydWN0IGdmMTI4bXVsXzY0ayAqdCkKK3sKKwl1OCAqYXAgPSAodTggKilhOworCWJlMTI4IHJbMV07CisJaW50IGk7CisKKwkqciA9IHQtPnRbMF0tPnRbYXBbMTVdXTsKKwlmb3IgKGkgPSAxOyBpIDwgMTY7ICsraSkKKwkJYmUxMjhfeG9yKHIsIHIsICZ0LT50W2ldLT50W2FwWzE1IC0gaV1dKTsKKwkqYSA9ICpyOworfQorRVhQT1JUX1NZTUJPTChnZjEyOG11bF82NGtfYmJlKTsKKworLyogICAgICBUaGlzIHZlcnNpb24gdXNlcyA0ayBieXRlcyBvZiB0YWJsZSBzcGFjZS4KKyAgICBBIDE2IGJ5dGUgYnVmZmVyIGhhcyB0byBiZSBtdWx0aXBsaWVkIGJ5IGEgMTYgYnl0ZSBrZXkKKyAgICB2YWx1ZSBpbiBHRigxMjgpLiAgSWYgd2UgY29uc2lkZXIgYSBHRigxMjgpIHZhbHVlIGluIGEKKyAgICBzaW5nbGUgYnl0ZSwgd2UgY2FuIGNvbnN0cnVjdCBhIHRhYmxlIG9mIHRoZSAyNTYgMTYgYnl0ZQorICAgIHZhbHVlcyB0aGF0IHJlc3VsdCBmcm9tIHRoZSAyNTYgdmFsdWVzIG9mIHRoaXMgYnl0ZS4KKyAgICBUaGlzIHJlcXVpcmVzIDQwOTYgYnl0ZXMuIElmIHdlIHRha2UgdGhlIGhpZ2hlc3QgYnl0ZSBpbgorICAgIHRoZSBidWZmZXIgYW5kIHVzZSB0aGlzIHRhYmxlIHRvIGdldCB0aGUgcmVzdWx0LCB3ZSB0aGVuCisgICAgaGF2ZSB0byBtdWx0aXBseSBieSB4XjEyMCB0byBnZXQgdGhlIGZpbmFsIHZhbHVlLiBGb3IgdGhlCisgICAgbmV4dCBoaWdoZXN0IGJ5dGUgdGhlIHJlc3VsdCBoYXMgdG8gYmUgbXVsdGlwbGllZCBieSB4XjExMgorICAgIGFuZCBzbyBvbi4gQnV0IHdlIGNhbiBkbyB0aGlzIGJ5IGFjY3VtdWxhdGluZyB0aGUgcmVzdWx0CisgICAgaW4gYW4gYWNjdW11bGF0b3Igc3RhcnRpbmcgd2l0aCB0aGUgcmVzdWx0IGZvciB0aGUgdG9wCisgICAgYnl0ZS4gIFdlIHJlcGVhdGVkbHkgbXVsdGlwbHkgdGhlIGFjY3VtdWxhdG9yIHZhbHVlIGJ5CisgICAgeF44IGFuZCB0aGVuIGFkZCBpbiAoaS5lLiB4b3IpIHRoZSAxNiBieXRlcyBvZiB0aGUgbmV4dAorICAgIGxvd2VyIGJ5dGUgaW4gdGhlIGJ1ZmZlciwgc3RvcHBpbmcgd2hlbiB3ZSByZWFjaCB0aGUKKyAgICBsb3dlc3QgYnl0ZS4gVGhpcyByZXF1aXJlcyBhIDQwOTYgYnl0ZSB0YWJsZS4KKyovCitzdHJ1Y3QgZ2YxMjhtdWxfNGsgKmdmMTI4bXVsX2luaXRfNGtfbGxlKGNvbnN0IGJlMTI4ICpnKQoreworCXN0cnVjdCBnZjEyOG11bF80ayAqdDsKKwlpbnQgaiwgazsKKworCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCWlmICghdCkKKwkJZ290byBvdXQ7CisKKwl0LT50WzEyOF0gPSAqZzsKKwlmb3IgKGogPSA2NDsgaiA+IDA7IGogPj49IDEpCisJCWdmMTI4bXVsX3hfbGxlKCZ0LT50W2pdLCAmdC0+dFtqK2pdKTsKKworCWZvciAoaiA9IDI7IGogPCAyNTY7IGogKz0gaikKKwkJZm9yIChrID0gMTsgayA8IGo7ICsraykKKwkJCWJlMTI4X3hvcigmdC0+dFtqICsga10sICZ0LT50W2pdLCAmdC0+dFtrXSk7CisKK291dDoKKwlyZXR1cm4gdDsKK30KK0VYUE9SVF9TWU1CT0woZ2YxMjhtdWxfaW5pdF80a19sbGUpOworCitzdHJ1Y3QgZ2YxMjhtdWxfNGsgKmdmMTI4bXVsX2luaXRfNGtfYmJlKGNvbnN0IGJlMTI4ICpnKQoreworCXN0cnVjdCBnZjEyOG11bF80ayAqdDsKKwlpbnQgaiwgazsKKworCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCWlmICghdCkKKwkJZ290byBvdXQ7CisKKwl0LT50WzFdID0gKmc7CisJZm9yIChqID0gMTsgaiA8PSA2NDsgaiA8PD0gMSkKKwkJZ2YxMjhtdWxfeF9iYmUoJnQtPnRbaiArIGpdLCAmdC0+dFtqXSk7CisKKwlmb3IgKGogPSAyOyBqIDwgMjU2OyBqICs9IGopCisJCWZvciAoayA9IDE7IGsgPCBqOyArK2spCisJCQliZTEyOF94b3IoJnQtPnRbaiArIGtdLCAmdC0+dFtqXSwgJnQtPnRba10pOworCitvdXQ6CisJcmV0dXJuIHQ7Cit9CitFWFBPUlRfU1lNQk9MKGdmMTI4bXVsX2luaXRfNGtfYmJlKTsKKwordm9pZCBnZjEyOG11bF80a19sbGUoYmUxMjggKmEsIHN0cnVjdCBnZjEyOG11bF80ayAqdCkKK3sKKwl1OCAqYXAgPSAodTggKilhOworCWJlMTI4IHJbMV07CisJaW50IGkgPSAxNTsKKworCSpyID0gdC0+dFthcFsxNV1dOworCXdoaWxlIChpLS0pIHsKKwkJZ2YxMjhtdWxfeDhfbGxlKHIpOworCQliZTEyOF94b3IociwgciwgJnQtPnRbYXBbaV1dKTsKKwl9CisJKmEgPSAqcjsKK30KK0VYUE9SVF9TWU1CT0woZ2YxMjhtdWxfNGtfbGxlKTsKKwordm9pZCBnZjEyOG11bF80a19iYmUoYmUxMjggKmEsIHN0cnVjdCBnZjEyOG11bF80ayAqdCkKK3sKKwl1OCAqYXAgPSAodTggKilhOworCWJlMTI4IHJbMV07CisJaW50IGkgPSAwOworCisJKnIgPSB0LT50W2FwWzBdXTsKKwl3aGlsZSAoKytpIDwgMTYpIHsKKwkJZ2YxMjhtdWxfeDhfYmJlKHIpOworCQliZTEyOF94b3IociwgciwgJnQtPnRbYXBbaV1dKTsKKwl9CisJKmEgPSAqcjsKK30KK0VYUE9SVF9TWU1CT0woZ2YxMjhtdWxfNGtfYmJlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGdW5jdGlvbnMgZm9yIG11bHRpcGx5aW5nIGVsZW1lbnRzIG9mIEdGKDJeMTI4KSIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2xydy5jIGIvY3J5cHRvL2xydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjQyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vbHJ3LmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qIExSVzogYXMgZGVmaW5lZCBieSBDeXJpbCBHdXlvdCBpbgorICoJaHR0cDovL2dyb3VwZXIuaWVlZS5vcmcvZ3JvdXBzLzE2MTkvZW1haWwvcGRmMDAwMTcucGRmCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFJpayBTbmVsIDxyc25lbEBjdWJlLmR5bmRucy5vcmc+CisgKgorICogQmFzZWQgb20gZWNiLmMKKyAqIENvcHlyaWdodCAoYykgMjAwNiBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIHRlc3QgdmVjdG9ycyBpbiB0aGUgYWJvdmUKKyAqIGRvY3VtZW50IGFuZCBieSBhIHRlc3QgdmVjdG9yIHByb3ZpZGVkIGJ5IEtlbiBCdWNoYW5hbiBhdAorICogaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL3N0ZHMtcDE2MTlAbGlzdHNlcnYuaWVlZS5vcmcvbXNnMDAxNzMuaHRtbAorICoKKyAqIFRoZSB0ZXN0IHZlY3RvcnMgYXJlIGluY2x1ZGVkIGluIHRoZSB0ZXN0aW5nIG1vZHVsZSB0Y3J5cHQuW2NoXSAqLworI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxjcnlwdG8vYjEyOG9wcy5oPgorI2luY2x1ZGUgPGNyeXB0by9nZjEyOG11bC5oPgorCitzdHJ1Y3QgcHJpdiB7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmNoaWxkOworCS8qIG9wdGltaXplcyBtdWx0aXBseWluZyBhIHJhbmRvbSAobm9uIGluY3JlbWVudGluZywgYXMgYXQgdGhlCisJICogc3RhcnQgb2YgYSBuZXcgc2VjdG9yKSB2YWx1ZSB3aXRoIGtleTIsIHdlIGNvdWxkIGFsc28gaGF2ZQorCSAqIHVzZWQgNGsgb3B0aW1pemF0aW9uIHRhYmxlcyBvciBubyBvcHRpbWl6YXRpb24gYXQgYWxsLiBJbiB0aGUKKwkgKiBsYXR0ZXIgY2FzZSB3ZSB3b3VsZCBoYXZlIHRvIHN0b3JlIGtleTIgaGVyZSAqLworCXN0cnVjdCBnZjEyOG11bF82NGsgKnRhYmxlOworCS8qIHN0b3JlczoKKwkgKiAga2V5Mip7IDAsMCwuLi4wLDAsMCwwLDEgfSwga2V5Mip7IDAsMCwuLi4wLDAsMCwxLDEgfSwKKwkgKiAga2V5Mip7IDAsMCwuLi4wLDAsMSwxLDEgfSwga2V5Mip7IDAsMCwuLi4wLDEsMSwxLDEgfQorCSAqICBrZXkyKnsgMCwwLC4uLjEsMSwxLDEsMSB9LCBldGMKKwkgKiBuZWVkZWQgZm9yIG9wdGltaXplZCBtdWx0aXBsaWNhdGlvbiBvZiBpbmNyZW1lbnRpbmcgdmFsdWVzCisJICogd2l0aCBrZXkyICovCisJYmUxMjggbXVsaW5jWzEyOF07Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0Yml0MTI4X2JiZSh2b2lkICpiLCBpbnQgYml0KQoreworCV9fc2V0X2JpdChiaXQgXiAweDc4LCBiKTsKK30KKworc3RhdGljIGludCBzZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnBhcmVudCwgY29uc3QgdTggKmtleSwKKwkJICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBwcml2ICpjdHggPSBjcnlwdG9fdGZtX2N0eChwYXJlbnQpOworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpjaGlsZCA9IGN0eC0+Y2hpbGQ7CisJaW50IGVyciwgaTsKKwliZTEyOCB0bXAgPSB7IDAgfTsKKwlpbnQgYnNpemUgPSBjcnlwdG9fY2lwaGVyX2Jsb2Nrc2l6ZShjaGlsZCk7CisKKwljcnlwdG9fY2lwaGVyX2NsZWFyX2ZsYWdzKGNoaWxkLCBDUllQVE9fVEZNX1JFUV9NQVNLKTsKKwljcnlwdG9fY2lwaGVyX3NldF9mbGFncyhjaGlsZCwgY3J5cHRvX3RmbV9nZXRfZmxhZ3MocGFyZW50KSAmCisJCQkJICAgICAgIENSWVBUT19URk1fUkVRX01BU0spOworCWlmICgoZXJyID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkoY2hpbGQsIGtleSwga2V5bGVuIC0gYnNpemUpKSkKKwkJcmV0dXJuIGVycjsKKwljcnlwdG9fdGZtX3NldF9mbGFncyhwYXJlbnQsIGNyeXB0b19jaXBoZXJfZ2V0X2ZsYWdzKGNoaWxkKSAmCisJCQkJICAgICBDUllQVE9fVEZNX1JFU19NQVNLKTsKKworCWlmIChjdHgtPnRhYmxlKQorCQlnZjEyOG11bF9mcmVlXzY0ayhjdHgtPnRhYmxlKTsKKworCS8qIGluaXRpYWxpemUgbXVsdGlwbGljYXRpb24gdGFibGUgZm9yIEtleTIgKi8KKwljdHgtPnRhYmxlID0gZ2YxMjhtdWxfaW5pdF82NGtfYmJlKChiZTEyOCAqKShrZXkgKyBrZXlsZW4gLSBic2l6ZSkpOworCWlmICghY3R4LT50YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBpbml0aWFsaXplIG9wdGltaXphdGlvbiB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQlzZXRiaXQxMjhfYmJlKCZ0bXAsIGkpOworCQljdHgtPm11bGluY1tpXSA9IHRtcDsKKwkJZ2YxMjhtdWxfNjRrX2JiZSgmY3R4LT5tdWxpbmNbaV0sIGN0eC0+dGFibGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc2luZm8geworCWJlMTI4IHQ7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwl2b2lkICgqZm4pKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosIGNvbnN0IHU4ICopOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGluYyhiZTEyOCAqaXYpCit7CisJaWYgKCEoaXYtPmIgPSBjcHVfdG9fYmU2NChiZTY0X3RvX2NwdShpdi0+YikgKyAxKSkpCisJCWl2LT5hID0gY3B1X3RvX2JlNjQoYmU2NF90b19jcHUoaXYtPmEpICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBscndfcm91bmQoc3RydWN0IHNpbmZvICpzLCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYykKK3sKKwliZTEyOF94b3IoZHN0LCAmcy0+dCwgc3JjKTsJCS8qIFBQIDwtIFQgeG9yIFAgKi8KKwlzLT5mbihzLT50Zm0sIGRzdCwgZHN0KTsJCS8qIENDIDwtIEUoS2V5MixQUCkgKi8KKwliZTEyOF94b3IoZHN0LCBkc3QsICZzLT50KTsJCS8qIEMgPC0gVCB4b3IgQ0MgKi8KK30KKworLyogdGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29uc2VxdWF0aXZlIDEgYml0cyBzdGFydGluZworICogZnJvbSB0aGUgcmlnaHQsIGdldF9pbmRleDEyOCgwMCAwMCAwMCAwMCAwMCAwMCAuLi4gMDAgMDAgMTAgRkIpID0gMiAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X2luZGV4MTI4KGJlMTI4ICpibG9jaykKK3sKKwlpbnQgeDsKKwlfX2JlMzIgKnAgPSAoX19iZTMyICopIGJsb2NrOworCisJZm9yIChwICs9IDMsIHggPSAwOyB4IDwgMTI4OyBwLS0sIHggKz0gMzIpIHsKKwkJdTMyIHZhbCA9IGJlMzJfdG9fY3B1cChwKTsKKworCQlpZiAoIX52YWwpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4geCArIGZmeih2YWwpOworCX0KKworCXJldHVybiB4OworfQorCitzdGF0aWMgaW50IGNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZCwKKwkJIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqdywgc3RydWN0IHByaXYgKmN0eCwKKwkJIHZvaWQgKCpmbikoc3RydWN0IGNyeXB0b190Zm0gKiwgdTggKiwgY29uc3QgdTggKikpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgYXZhaWw7CisJY29uc3QgaW50IGJzID0gY3J5cHRvX2NpcGhlcl9ibG9ja3NpemUoY3R4LT5jaGlsZCk7CisJc3RydWN0IHNpbmZvIHMgPSB7CisJCS50Zm0gPSBjcnlwdG9fY2lwaGVyX3RmbShjdHgtPmNoaWxkKSwKKwkJLmZuID0gZm4KKwl9OworCWJlMTI4ICppdjsKKwl1OCAqd3NyYzsKKwl1OCAqd2RzdDsKKworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZCwgdyk7CisJaWYgKCEoYXZhaWwgPSB3LT5uYnl0ZXMpKQorCQlyZXR1cm4gZXJyOworCisJd3NyYyA9IHctPnNyYy52aXJ0LmFkZHI7CisJd2RzdCA9IHctPmRzdC52aXJ0LmFkZHI7CisKKwkvKiBjYWxjdWxhdGUgZmlyc3QgdmFsdWUgb2YgVCAqLworCWl2ID0gKGJlMTI4ICopdy0+aXY7CisJcy50ID0gKml2OworCisJLyogVCA8LSBJKktleTIgKi8KKwlnZjEyOG11bF82NGtfYmJlKCZzLnQsIGN0eC0+dGFibGUpOworCisJZ290byBmaXJzdDsKKworCWZvciAoOzspIHsKKwkJZG8geworCQkJLyogVCA8LSBJKktleTIsIHVzaW5nIHRoZSBvcHRpbWl6YXRpb24KKwkJCSAqIGRpc2N1c3NlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiAqLworCQkJYmUxMjhfeG9yKCZzLnQsICZzLnQsICZjdHgtPm11bGluY1tnZXRfaW5kZXgxMjgoaXYpXSk7CisJCQlpbmMoaXYpOworCitmaXJzdDoKKwkJCWxyd19yb3VuZCgmcywgd2RzdCwgd3NyYyk7CisKKwkJCXdzcmMgKz0gYnM7CisJCQl3ZHN0ICs9IGJzOworCQl9IHdoaWxlICgoYXZhaWwgLT0gYnMpID49IGJzKTsKKworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGQsIHcsIGF2YWlsKTsKKwkJaWYgKCEoYXZhaWwgPSB3LT5uYnl0ZXMpKQorCQkJYnJlYWs7CisKKwkJd3NyYyA9IHctPnNyYy52aXJ0LmFkZHI7CisJCXdkc3QgPSB3LT5kc3QudmlydC5hZGRyOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgcHJpdiAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgdzsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJncsIGRzdCwgc3JjLCBuYnl0ZXMpOworCXJldHVybiBjcnlwdChkZXNjLCAmdywgY3R4LAorCQkgICAgIGNyeXB0b19jaXBoZXJfYWxnKGN0eC0+Y2hpbGQpLT5jaWFfZW5jcnlwdCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgcHJpdiAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgdzsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJncsIGRzdCwgc3JjLCBuYnl0ZXMpOworCXJldHVybiBjcnlwdChkZXNjLCAmdywgY3R4LAorCQkgICAgIGNyeXB0b19jaXBoZXJfYWxnKGN0eC0+Y2hpbGQpLT5jaWFfZGVjcnlwdCk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0ID0gKHZvaWQgKil0Zm0tPl9fY3J0X2FsZzsKKwlzdHJ1Y3QgY3J5cHRvX3NwYXduICpzcGF3biA9IGNyeXB0b19pbnN0YW5jZV9jdHgoaW5zdCk7CisJc3RydWN0IHByaXYgKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKKworCXRmbSA9IGNyeXB0b19zcGF3bl90Zm0oc3Bhd24pOworCWlmIChJU19FUlIodGZtKSkKKwkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKworCWlmIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSAhPSAxNikgeworCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3R4LT5jaGlsZCA9IGNyeXB0b19jaXBoZXJfY2FzdCh0Zm0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleGl0X3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBwcml2ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCWlmIChjdHgtPnRhYmxlKQorCQlnZjEyOG11bF9mcmVlXzY0ayhjdHgtPnRhYmxlKTsKKwljcnlwdG9fZnJlZV9jaXBoZXIoY3R4LT5jaGlsZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICphbGxvYyh2b2lkICpwYXJhbSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0OworCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisKKwlhbGcgPSBjcnlwdG9fZ2V0X2F0dHJfYWxnKHBhcmFtLCBsZW4sIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJCQkJICBDUllQVE9fQUxHX1RZUEVfTUFTSyB8IENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoYWxnKSkKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKworCWluc3QgPSBjcnlwdG9fYWxsb2NfaW5zdGFuY2UoImxydyIsIGFsZyk7CisJaWYgKElTX0VSUihpbnN0KSkKKwkJZ290byBvdXRfcHV0X2FsZzsKKworCWluc3QtPmFsZy5jcmFfZmxhZ3MgPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSOworCWluc3QtPmFsZy5jcmFfcHJpb3JpdHkgPSBhbGctPmNyYV9wcmlvcml0eTsKKwlpbnN0LT5hbGcuY3JhX2Jsb2Nrc2l6ZSA9IGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKKworCWlmIChhbGctPmNyYV9hbGlnbm1hc2sgPCA3KSBpbnN0LT5hbGcuY3JhX2FsaWdubWFzayA9IDc7CisJZWxzZSBpbnN0LT5hbGcuY3JhX2FsaWdubWFzayA9IGFsZy0+Y3JhX2FsaWdubWFzazsKKwlpbnN0LT5hbGcuY3JhX3R5cGUgPSAmY3J5cHRvX2Jsa2NpcGhlcl90eXBlOworCisJaWYgKCEoYWxnLT5jcmFfYmxvY2tzaXplICUgNCkpCisJCWluc3QtPmFsZy5jcmFfYWxpZ25tYXNrIHw9IDM7CisJaW5zdC0+YWxnLmNyYV9ibGtjaXBoZXIuaXZzaXplID0gYWxnLT5jcmFfYmxvY2tzaXplOworCWluc3QtPmFsZy5jcmFfYmxrY2lwaGVyLm1pbl9rZXlzaXplID0KKwkJYWxnLT5jcmFfY2lwaGVyLmNpYV9taW5fa2V5c2l6ZSArIGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKKwlpbnN0LT5hbGcuY3JhX2Jsa2NpcGhlci5tYXhfa2V5c2l6ZSA9CisJCWFsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemUgKyBhbGctPmNyYV9ibG9ja3NpemU7CisKKwlpbnN0LT5hbGcuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IHByaXYpOworCisJaW5zdC0+YWxnLmNyYV9pbml0ID0gaW5pdF90Zm07CisJaW5zdC0+YWxnLmNyYV9leGl0ID0gZXhpdF90Zm07CisKKwlpbnN0LT5hbGcuY3JhX2Jsa2NpcGhlci5zZXRrZXkgPSBzZXRrZXk7CisJaW5zdC0+YWxnLmNyYV9ibGtjaXBoZXIuZW5jcnlwdCA9IGVuY3J5cHQ7CisJaW5zdC0+YWxnLmNyYV9ibGtjaXBoZXIuZGVjcnlwdCA9IGRlY3J5cHQ7CisKK291dF9wdXRfYWxnOgorCWNyeXB0b19tb2RfcHV0KGFsZyk7CisJcmV0dXJuIGluc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWUoc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCkKK3sKKwljcnlwdG9fZHJvcF9zcGF3bihjcnlwdG9faW5zdGFuY2VfY3R4KGluc3QpKTsKKwlrZnJlZShpbnN0KTsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgY3J5cHRvX3RtcGwgPSB7CisJLm5hbWUgPSAibHJ3IiwKKwkuYWxsb2MgPSBhbGxvYywKKwkuZnJlZSA9IGZyZWUsCisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3J5cHRvX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl90ZW1wbGF0ZSgmY3J5cHRvX3RtcGwpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3J5cHRvX21vZHVsZV9leGl0KHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfdGVtcGxhdGUoJmNyeXB0b190bXBsKTsKK30KKworbW9kdWxlX2luaXQoY3J5cHRvX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGNyeXB0b19tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFJXIGJsb2NrIGNpcGhlciBtb2RlIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vc2hhNTEyLmMgYi9jcnlwdG8vc2hhNTEyLmMKaW5kZXggMmRmZTdmMS4uMTVlYWI5ZCAxMDA2NDQKLS0tIGEvY3J5cHRvL3NoYTUxMi5jCisrKyBiL2NyeXB0by9zaGE1MTIuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAjZGVmaW5lIFNIQTM4NF9ESUdFU1RfU0laRSA0OAogI2RlZmluZSBTSEE1MTJfRElHRVNUX1NJWkUgNjQKLSNkZWZpbmUgU0hBMzg0X0hNQUNfQkxPQ0tfU0laRSAgOTYKKyNkZWZpbmUgU0hBMzg0X0hNQUNfQkxPQ0tfU0laRSAxMjgKICNkZWZpbmUgU0hBNTEyX0hNQUNfQkxPQ0tfU0laRSAxMjgKIAogc3RydWN0IHNoYTUxMl9jdHggewpkaWZmIC0tZ2l0IGEvY3J5cHRvL3RjcnlwdC5jIGIvY3J5cHRvL3RjcnlwdC5jCmluZGV4IDgzMzA3NDIuLmQ2NzFlODk0IDEwMDY0NAotLS0gYS9jcnlwdG8vdGNyeXB0LmMKKysrIGIvY3J5cHRvL3RjcnlwdC5jCkBAIC05MDYsNiArOTA2LDEwIEBACiAJCQkgICAgQUVTX0NCQ19FTkNfVEVTVF9WRUNUT1JTKTsKIAkJdGVzdF9jaXBoZXIoImNiYyhhZXMpIiwgREVDUllQVCwgYWVzX2NiY19kZWNfdHZfdGVtcGxhdGUsCiAJCQkgICAgQUVTX0NCQ19ERUNfVEVTVF9WRUNUT1JTKTsKKwkJdGVzdF9jaXBoZXIoImxydyhhZXMpIiwgRU5DUllQVCwgYWVzX2xyd19lbmNfdHZfdGVtcGxhdGUsCisJCQkgICAgQUVTX0xSV19FTkNfVEVTVF9WRUNUT1JTKTsKKwkJdGVzdF9jaXBoZXIoImxydyhhZXMpIiwgREVDUllQVCwgYWVzX2xyd19kZWNfdHZfdGVtcGxhdGUsCisJCQkgICAgQUVTX0xSV19ERUNfVEVTVF9WRUNUT1JTKTsKIAogCQkvL0NBU1Q1CiAJCXRlc3RfY2lwaGVyKCJlY2IoY2FzdDUpIiwgRU5DUllQVCwgY2FzdDVfZW5jX3R2X3RlbXBsYXRlLApAQCAtOTc3LDYgKzk4MSw5IEBACiAJCXRlc3RfaGFzaCgiaG1hYyhzaGEyNTYpIiwgaG1hY19zaGEyNTZfdHZfdGVtcGxhdGUsCiAJCQkgIEhNQUNfU0hBMjU2X1RFU1RfVkVDVE9SUyk7CiAKKwkJdGVzdF9oYXNoKCJ4Y2JjKGFlcykiLCBhZXNfeGNiYzEyOF90dl90ZW1wbGF0ZSwKKwkJCSAgWENCQ19BRVNfVEVTVF9WRUNUT1JTKTsKKwogCQl0ZXN0X2hhc2goIm1pY2hhZWxfbWljIiwgbWljaGFlbF9taWNfdHZfdGVtcGxhdGUsIE1JQ0hBRUxfTUlDX1RFU1RfVkVDVE9SUyk7CiAJCWJyZWFrOwogCkBAIC0xMDUyLDYgKzEwNTksMTAgQEAKIAkJCSAgICBBRVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMpOwogCQl0ZXN0X2NpcGhlcigiY2JjKGFlcykiLCBERUNSWVBULCBhZXNfY2JjX2RlY190dl90ZW1wbGF0ZSwKIAkJCSAgICBBRVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigibHJ3KGFlcykiLCBFTkNSWVBULCBhZXNfbHJ3X2VuY190dl90ZW1wbGF0ZSwKKwkJCSAgICBBRVNfTFJXX0VOQ19URVNUX1ZFQ1RPUlMpOworCQl0ZXN0X2NpcGhlcigibHJ3KGFlcykiLCBERUNSWVBULCBhZXNfbHJ3X2RlY190dl90ZW1wbGF0ZSwKKwkJCSAgICBBRVNfTFJXX0RFQ19URVNUX1ZFQ1RPUlMpOwogCQlicmVhazsKIAogCWNhc2UgMTE6CkBAIC0xMTkxLDYgKzEyMDIsMTAgQEAKIAkJCQkgIGFlc19zcGVlZF90ZW1wbGF0ZSk7CiAJCXRlc3RfY2lwaGVyX3NwZWVkKCJjYmMoYWVzKSIsIERFQ1JZUFQsIHNlYywgTlVMTCwgMCwKIAkJCQkgIGFlc19zcGVlZF90ZW1wbGF0ZSk7CisJCXRlc3RfY2lwaGVyX3NwZWVkKCJscncoYWVzKSIsIEVOQ1JZUFQsIHNlYywgTlVMTCwgMCwKKwkJCQkgIGFlc19scndfc3BlZWRfdGVtcGxhdGUpOworCQl0ZXN0X2NpcGhlcl9zcGVlZCgibHJ3KGFlcykiLCBERUNSWVBULCBzZWMsIE5VTEwsIDAsCisJCQkJICBhZXNfbHJ3X3NwZWVkX3RlbXBsYXRlKTsKIAkJYnJlYWs7CiAKIAljYXNlIDIwMToKZGlmZiAtLWdpdCBhL2NyeXB0by90Y3J5cHQuaCBiL2NyeXB0by90Y3J5cHQuaAppbmRleCBhNDBjNDQxLi40OGE4MTM2IDEwMDY0NAotLS0gYS9jcnlwdG8vdGNyeXB0LmgKKysrIGIvY3J5cHRvL3RjcnlwdC5oCkBAIC0zOSwxNSArMzksMTUgQEAKIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyB7CiAJY2hhciBrZXlbTUFYX0tFWUxFTl0gX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKDQpKSk7CiAJY2hhciBpdltNQVhfSVZMRU5dOwotCWNoYXIgaW5wdXRbNDhdOwotCWNoYXIgcmVzdWx0WzQ4XTsKKwljaGFyIGlucHV0WzUxMl07CisJY2hhciByZXN1bHRbNTEyXTsKIAl1bnNpZ25lZCBjaGFyIHRhcFtNQVhfVEFQXTsKIAlpbnQgbnA7CiAJdW5zaWduZWQgY2hhciBmYWlsOwogCXVuc2lnbmVkIGNoYXIgd2s7IC8qIHdlYWsga2V5IGZsYWcgKi8KIAl1bnNpZ25lZCBjaGFyIGtsZW47Ci0JdW5zaWduZWQgY2hhciBpbGVuOwotCXVuc2lnbmVkIGNoYXIgcmxlbjsKKwl1bnNpZ25lZCBzaG9ydCBpbGVuOworCXVuc2lnbmVkIHNob3J0IHJsZW47CiB9OwogCiBzdHJ1Y3QgY2lwaGVyX3NwZWVkIHsKQEAgLTkzMyw2ICs5MzMsNzQgQEAKIAl9LAogfTsKIAorI2RlZmluZSBYQ0JDX0FFU19URVNUX1ZFQ1RPUlMgNgorCitzdGF0aWMgc3RydWN0IGhhc2hfdGVzdHZlYyBhZXNfeGNiYzEyOF90dl90ZW1wbGF0ZVtdID0geworCXsKKwkJLmtleQk9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkJCSAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmIH0sCisJCS5wbGFpbnRleHQgPSB7IFswIC4uLiAxNV0gPSAwIH0sCisJCS5kaWdlc3QgPSB7IDB4NzUsIDB4ZjAsIDB4MjUsIDB4MWQsIDB4NTIsIDB4OGEsIDB4YzAsIDB4MWMsCisJCQkgICAgMHg0NSwgMHg3MywgMHhkZiwgMHhkNSwgMHg4NCwgMHhkNywgMHg5ZiwgMHgyOSB9LAorCQkucHNpemUJPSAwLAorCQkua3NpemUJPSAxNiwKKwl9LCB7CisJCS5rZXkJPSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJCQkgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiB9LAorCQkucGxhaW50ZXh0ID0geyAweDAwLCAweDAxLCAweDAyIH0sCisJCS5kaWdlc3QJPSB7IDB4NWIsIDB4MzcsIDB4NjUsIDB4ODAsIDB4YWUsIDB4MmYsIDB4MTksIDB4YWYsCisJCQkgICAgMHhlNywgMHgyMSwgMHg5YywgMHhlZSwgMHhmMSwgMHg3MiwgMHg3NSwgMHg2ZiB9LAorCQkucHNpemUJPSAzLAorCQkua3NpemUJPSAxNiwKKwl9ICwgeworCQkua2V5CT0geyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCQkJICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYgfSwKKwkJLnBsYWludGV4dCA9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkJCSAgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmIH0sCisJCS5kaWdlc3QgPSB7IDB4ZDIsIDB4YTIsIDB4NDYsIDB4ZmEsIDB4MzQsIDB4OWIsIDB4NjgsIDB4YTcsCisJCQkgICAgMHg5OSwgMHg5OCwgMHhhNCwgMHgzOSwgMHg0ZiwgMHhmNywgMHhhMiwgMHg2MyB9LAorCQkucHNpemUJPSAxNiwKKwkJLmtzaXplCT0gMTYsCisJfSwgeworCQkua2V5CT0geyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCQkJICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYgfSwKKwkJLnBsYWludGV4dCA9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkJCSAgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAorCQkJICAgICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMgfSwKKwkJLmRpZ2VzdCA9IHsgMHg0NywgMHhmNSwgMHgxYiwgMHg0NSwgMHg2NCwgMHg5NiwgMHg2MiwgMHgxNSwKKwkJCSAgICAweGI4LCAweDk4LCAweDVjLCAweDYzLCAweDA1LCAweDVlLCAweGQzLCAweDA4IH0sCisJCS50YXAJPSB7IDEwLCAxMCB9LAorCQkucHNpemUJPSAyMCwKKwkJLm5wCT0gMiwKKwkJLmtzaXplCT0gMTYsCisJfSwgeworCQkua2V5CT0geyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorCQkJICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYgfSwKKwkJLnBsYWludGV4dCA9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkJCSAgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAorCQkJICAgICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsCisJCQkgICAgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiB9LAorCQkuZGlnZXN0ID0geyAweGY1LCAweDRmLCAweDBlLCAweGM4LCAweGQyLCAweGI5LCAweGYzLCAweGQzLAorCQkJICAgIDB4NjgsIDB4MDcsIDB4NzMsIDB4NGIsIDB4ZDUsIDB4MjgsIDB4M2YsIDB4ZDQgfSwKKwkJLnBzaXplCT0gMzIsCisJCS5rc2l6ZQk9IDE2LAorCX0sIHsKKwkJLmtleQk9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkJCSAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmIH0sCisJCS5wbGFpbnRleHQgPSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisJCQkgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwKKwkJCSAgICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorCQkJICAgICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCisJCQkgICAgICAgMHgyMCwgMHgyMSB9LAorCQkuZGlnZXN0ID0geyAweGJlLCAweGNiLCAweGIzLCAweGJjLCAweGNkLCAweGI1LCAweDE4LCAweGEzLAorCQkJICAgIDB4MDYsIDB4NzcsIDB4ZDUsIDB4NDgsIDB4MWYsIDB4YjYsIDB4YjQsIDB4ZDggfSwKKwkJLnRhcAk9IHsgMTcsIDE3IH0sCisJCS5wc2l6ZQk9IDM0LAorCQkubnAJPSAyLAorCQkua3NpemUJPSAxNiwKKwl9Cit9OworCiAvKgogICogREVTIHRlc3QgdmVjdG9ycy4KICAqLwpAQCAtMTgzMSw2ICsxODk5LDggQEAKICNkZWZpbmUgQUVTX0RFQ19URVNUX1ZFQ1RPUlMgMwogI2RlZmluZSBBRVNfQ0JDX0VOQ19URVNUX1ZFQ1RPUlMgMgogI2RlZmluZSBBRVNfQ0JDX0RFQ19URVNUX1ZFQ1RPUlMgMgorI2RlZmluZSBBRVNfTFJXX0VOQ19URVNUX1ZFQ1RPUlMgOAorI2RlZmluZSBBRVNfTFJXX0RFQ19URVNUX1ZFQ1RPUlMgOAogCiBzdGF0aWMgc3RydWN0IGNpcGhlcl90ZXN0dmVjIGFlc19lbmNfdHZfdGVtcGxhdGVbXSA9IHsKIAl7IC8qIEZyb20gRklQUy0xOTcgKi8KQEAgLTE5NjgsNiArMjAzOCw1MDkgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfbHJ3X2VuY190dl90ZW1wbGF0ZVtdID0geworCS8qIGZyb20gaHR0cDovL2dyb3VwZXIuaWVlZS5vcmcvZ3JvdXBzLzE2MTkvZW1haWwvcGRmMDAwMTcucGRmICovCisJeyAvKiBMUlctMzItQUVTIDEgKi8KKwkJLmtleSAgICA9IHsgMHg0NSwgMHg2MiwgMHhhYywgMHgyNSwgMHhmOCwgMHgyOCwgMHgxNywgMHg2ZCwKKwkJCSAgICAweDRjLCAweDI2LCAweDg0LCAweDE0LCAweGI1LCAweDY4LCAweDAxLCAweDg1LAorCQkJICAgIDB4MjUsIDB4OGUsIDB4MmEsIDB4MDUsIDB4ZTcsIDB4M2UsIDB4OWQsIDB4MDMsCisJCQkgICAgMHhlZSwgMHg1YSwgMHg4MywgMHgwYywgMHhjYywgMHgwOSwgMHg0YywgMHg4NyB9LAorCQkua2xlbiAgID0gMzIsCisJCS5pdiAgICAgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9LAorCQkuaW5wdXQgID0geyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCQkJICAgIDB4MzgsIDB4MzksIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYgfSwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0geyAweGYxLCAweGIyLCAweDczLCAweGNkLCAweDY1LCAweGEzLCAweGRmLCAweDVmLAorCQkJICAgIDB4ZTksIDB4NWQsIDB4NDgsIDB4OTIsIDB4NTQsIDB4NjMsIDB4NGUsIDB4YjggfSwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyAyICovCisJCS5rZXkgICAgPSB7IDB4NTksIDB4NzAsIDB4NDcsIDB4MTQsIDB4ZjUsIDB4NTcsIDB4NDcsIDB4OGMsCisJCSAgCSAgICAweGQ3LCAweDc5LCAweGU4LCAweDBmLCAweDU0LCAweDg4LCAweDc5LCAweDQ0LAorCQkJICAgIDB4MGQsIDB4NDgsIDB4ZjAsIDB4YjcsIDB4YjEsIDB4NWEsIDB4NTMsIDB4ZWEsCisJCQkgICAgMHgxYywgMHhhYSwgMHg2YiwgMHgyOSwgMHhjMiwgMHhjYSwgMHhmYiwgMHhhZgorCQl9LAorCQkua2xlbiAgID0gMzIsCisJCS5pdiAgICAgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiB9LAorCQkuaW5wdXQgID0geyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCQkJICAgIDB4MzgsIDB4MzksIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYgfSwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0geyAweDAwLCAweGM4LCAweDJiLCAweGFlLCAweDk1LCAweGJiLCAweGNkLCAweGU1LAorCQkJICAgIDB4MjcsIDB4NGYsIDB4MDcsIDB4NjksIDB4YjIsIDB4NjAsIDB4ZTEsIDB4MzYgfSwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyAzICovCisJCS5rZXkgICAgPSB7IDB4ZDgsIDB4MmEsIDB4OTEsIDB4MzQsIDB4YjIsIDB4NmEsIDB4NTYsIDB4NTAsCisJCSAgCSAgICAweDMwLCAweGZlLCAweDY5LCAweGUyLCAweDM3LCAweDdmLCAweDk4LCAweDQ3LAorCQkJICAgIDB4Y2QsIDB4ZjksIDB4MGIsIDB4MTYsIDB4MGMsIDB4NjQsIDB4OGYsIDB4YjYsCisJCQkgICAgMHhiMCwgMHgwZCwgMHgwZCwgMHgxYiwgMHhhZSwgMHg4NSwgMHg4NywgMHgxZiB9LAorCQkua2xlbiAgID0gMzIsCisJCS5pdiAgICAgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorCQkuaW5wdXQgID0geyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCQkJICAgIDB4MzgsIDB4MzksIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYgfSwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0geyAweDc2LCAweDMyLCAweDIxLCAweDgzLCAweGVkLCAweDhmLCAweGYxLCAweDgyLAorCQkJICAgIDB4ZjksIDB4NTksIDB4NjIsIDB4MDMsIDB4NjksIDB4MGUsIDB4NWUsIDB4MDEgfSwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyA0ICovCisJCS5rZXkgICAgPSB7IDB4MGYsIDB4NmEsIDB4ZWYsIDB4ZjgsIDB4ZDMsIDB4ZDIsIDB4YmIsIDB4MTUsCisJCSAgCSAgICAweDI1LCAweDgzLCAweGY3LCAweDNjLCAweDFmLCAweDAxLCAweDI4LCAweDc0LAorCQkJICAgIDB4Y2EsIDB4YzYsIDB4YmMsIDB4MzUsIDB4NGQsIDB4NGEsIDB4NjUsIDB4NTQsCisJCQkgICAgMHg5MCwgMHhhZSwgMHg2MSwgMHhjZiwgMHg3YiwgMHhhZSwgMHhiZCwgMHhjYywKKwkJCSAgICAweGFkLCAweGU0LCAweDk0LCAweGM1LCAweDRhLCAweDI5LCAweGFlLCAweDcwIH0sCisJCS5rbGVuICAgPSA0MCwKKwkJLml2ICAgICA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxIH0sCisJCS5pbnB1dCAgPSB7IDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisJCQkgICAgMHgzOCwgMHgzOSwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiB9LAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSB7IDB4OWMsIDB4MGYsIDB4MTUsIDB4MmYsIDB4NTUsIDB4YTIsIDB4ZDgsIDB4ZjAsCisJCQkgICAgMHhkNiwgMHg3YiwgMHg4ZiwgMHg5ZSwgMHgyOCwgMHgyMiwgMHhiYywgMHg0MSB9LAorCQkucmxlbiAgID0gMTYsCisJfSwgeyAvKiBMUlctMzItQUVTIDUgKi8KKwkJLmtleSAgICA9IHsgMHg4YSwgMHhkNCwgMHhlZSwgMHgxMCwgMHgyZiwgMHhiZCwgMHg4MSwgMHhmZiwKKwkJICAJICAgIDB4ZjgsIDB4ODYsIDB4Y2UsIDB4YWMsIDB4OTMsIDB4YzUsIDB4YWQsIDB4YzYsCisJCQkgICAgMHhhMCwgMHgxOSwgMHgwNywgMHhjMCwgMHg5ZCwgMHhmNywgMHhiYiwgMHhkZCwKKwkJCSAgICAweDUyLCAweDEzLCAweGIyLCAweGI3LCAweGYwLCAweGZmLCAweDExLCAweGQ4LAorCQkJICAgIDB4ZDYsIDB4MDgsIDB4ZDAsIDB4Y2QsIDB4MmUsIDB4YjEsIDB4MTcsIDB4NmYgfSwKKwkJLmtsZW4gICA9IDQwLAorCQkuaXYgICAgID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKwkJLmlucHV0ICA9IHsgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKKwkJCSAgICAweDM4LCAweDM5LCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2IH0sCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9IHsgMHhkNCwgMHgyNywgMHg2YSwgMHg3ZiwgMHgxNCwgMHg5MSwgMHgzZCwgMHg2NSwKKwkJCSAgICAweGM4LCAweDYwLCAweDQ4LCAweDAyLCAweDg3LCAweGUzLCAweDM0LCAweDA2IH0sCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7IC8qIExSVy0zMi1BRVMgNiAqLworCQkua2V5ICAgID0geyAweGY4LCAweGQ0LCAweDc2LCAweGZmLCAweGQ2LCAweDQ2LCAweGVlLCAweDZjLAorCQkgIAkgICAgMHgyMywgMHg4NCwgMHhjYiwgMHgxYywgMHg3NywgMHhkNiwgMHgxOSwgMHg1ZCwKKwkJCSAgICAweGZlLCAweGYxLCAweGE5LCAweGYzLCAweDdiLCAweGJjLCAweDhkLCAweDIxLAorCQkJICAgIDB4YTcsIDB4OWMsIDB4MjEsIDB4ZjgsIDB4Y2IsIDB4OTAsIDB4MDIsIDB4ODksCisJCQkgICAgMHhhOCwgMHg0NSwgMHgzNCwgMHg4ZSwgMHhjOCwgMHhjNSwgMHhiNSwgMHhmMSwKKwkJCSAgICAweDI2LCAweGY1LCAweDBlLCAweDc2LCAweGZlLCAweGZkLCAweDFiLCAweDFlIH0sCisJCS5rbGVuICAgPSA0OCwKKwkJLml2ICAgICA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxIH0sCisJCS5pbnB1dCAgPSB7IDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisJCQkgICAgMHgzOCwgMHgzOSwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiB9LAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSB7IDB4YmQsIDB4MDYsIDB4YjgsIDB4ZTEsIDB4ZGIsIDB4OTgsIDB4ODksIDB4OWUsCisJCQkgICAgMHhjNCwgMHg5OCwgMHhlNCwgMHg5MSwgMHhjZiwgMHgxYywgMHg3MCwgMHgyYiB9LAorCQkucmxlbiAgID0gMTYsCisJfSwgeyAvKiBMUlctMzItQUVTIDcgKi8KKwkJLmtleSAgICA9IHsgMHhmYiwgMHg3NiwgMHgxNSwgMHhiMiwgMHgzZCwgMHg4MCwgMHg4OSwgMHgxZCwKKwkJICAJICAgIDB4ZDQsIDB4NzAsIDB4OTgsIDB4MGIsIDB4YzcsIDB4OTUsIDB4ODQsIDB4YzgsCisJCQkgICAgMHhiMiwgMHhmYiwgMHg2NCwgMHhjZSwgMHg2MCwgMHg5NywgMHg4NywgMHg4ZCwKKwkJCSAgICAweDE3LCAweGZjLCAweGU0LCAweDVhLCAweDQ5LCAweGU4LCAweDMwLCAweGI3LAorCQkJICAgIDB4NmUsIDB4NzgsIDB4MTcsIDB4ZTcsIDB4MmQsIDB4NWUsIDB4MTIsIDB4ZDQsCisJCQkgICAgMHg2MCwgMHg2NCwgMHgwNCwgMHg3YSwgMHhmMSwgMHgyZiwgMHg5ZSwgMHgwYyB9LAorCQkua2xlbiAgID0gNDgsCisJCS5pdiAgICAgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorCQkuaW5wdXQgID0geyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCQkJICAgIDB4MzgsIDB4MzksIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYgfSwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0geyAweDViLCAweDkwLCAweDhlLCAweGMxLCAweGFiLCAweGRkLCAweDY3LCAweDVmLAorCQkJICAgIDB4M2QsIDB4NjksIDB4OGEsIDB4OTUsIDB4NTMsIDB4YzgsIDB4OWMsIDB4ZTUgfSwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsKKy8qIGh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS9zdGRzLXAxNjE5QGxpc3RzZXJ2LmllZWUub3JnL21zZzAwMTczLmh0bWwgKi8KKwkJLmtleSAgICA9IHsgMHhmOCwgMHhkNCwgMHg3NiwgMHhmZiwgMHhkNiwgMHg0NiwgMHhlZSwgMHg2YywKKwkJCSAgICAweDIzLCAweDg0LCAweGNiLCAweDFjLCAweDc3LCAweGQ2LCAweDE5LCAweDVkLAorCQkJICAgIDB4ZmUsIDB4ZjEsIDB4YTksIDB4ZjMsIDB4N2IsIDB4YmMsIDB4OGQsIDB4MjEsCisJCQkgICAgMHhhNywgMHg5YywgMHgyMSwgMHhmOCwgMHhjYiwgMHg5MCwgMHgwMiwgMHg4OSwKKwkJCSAgICAweGE4LCAweDQ1LCAweDM0LCAweDhlLCAweGM4LCAweGM1LCAweGI1LCAweGYxLAorCQkJICAgIDB4MjYsIDB4ZjUsIDB4MGUsIDB4NzYsIDB4ZmUsIDB4ZmQsIDB4MWIsIDB4MWUgfSwKKwkJLmtsZW4gICA9IDQ4LAorCQkuaXYgICAgID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfSwKKwkJLmlucHV0ICA9IHsgMHgwNSwgMHgxMSwgMHhiNywgMHgxOCwgMHhhYiwgMHhjNiwgMHgyZCwgMHhhYywKKwkJCSAgICAweDcwLCAweDVkLCAweGY2LCAweDIyLCAweDk0LCAweGNkLCAweGU1LCAweDZjLAorCQkJICAgIDB4MTcsIDB4NmIsIDB4ZjYsIDB4MWMsIDB4ZjAsIDB4ZjMsIDB4NmUsIDB4ZjgsCisJCQkgICAgMHg1MCwgMHgzOCwgMHgxZiwgMHg3MSwgMHg0OSwgMHhiNiwgMHg1NywgMHhkNiwKKwkJCSAgICAweDhmLCAweGNiLCAweDhkLCAweDZiLCAweGUzLCAweGE2LCAweDI5LCAweDkwLAorCQkJICAgIDB4ZmUsIDB4MmEsIDB4NjIsIDB4ODIsIDB4YWUsIDB4NmQsIDB4OGIsIDB4ZjYsCisJCQkgICAgMHhhZCwgMHgxZSwgMHg5ZSwgMHgyMCwgMHg1ZiwgMHgzOCwgMHhiZSwgMHgwNCwKKwkJCSAgICAweGRhLCAweDEwLCAweDhlLCAweGVkLCAweGEyLCAweGE0LCAweDg3LCAweGFiLAorCQkJICAgIDB4ZGEsIDB4NmIsIDB4YjQsIDB4MGMsIDB4NzUsIDB4YmEsIDB4ZDMsIDB4N2MsCisJCQkgICAgMHhjOSwgMHhhYywgMHg0MiwgMHgzMSwgMHg5NSwgMHg3YywgMHhjOSwgMHgwNCwKKwkJCSAgICAweGViLCAweGQ1LCAweDZlLCAweDMyLCAweDY5LCAweDhhLCAweGRiLCAweGE2LAorCQkJICAgIDB4MTUsIDB4ZDcsIDB4M2YsIDB4NGYsIDB4MmYsIDB4NjYsIDB4NjksIDB4MDMsCisJCQkgICAgMHg5YywgMHgxZiwgMHg1NCwgMHgwZiwgMHhkZSwgMHgxZiwgMHhmMywgMHg2NSwKKwkJCSAgICAweDRjLCAweDk2LCAweDEyLCAweGVkLCAweDdjLCAweDkyLCAweDAzLCAweDAxLAorCQkJICAgIDB4NmYsIDB4YmMsIDB4MzUsIDB4OTMsIDB4YWMsIDB4ZjEsIDB4MjcsIDB4ZjEsCisJCQkgICAgMHhiNCwgMHg5NiwgMHg4MiwgMHg1YSwgMHg1ZiwgMHhiMCwgMHhhMCwgMHg1MCwKKwkJCSAgICAweDg5LCAweGE0LCAweDhlLCAweDY2LCAweDQ0LCAweDg1LCAweGNjLCAweGZkLAorCQkJICAgIDB4MzMsIDB4MTQsIDB4NzAsIDB4ZTMsIDB4OTYsIDB4YjIsIDB4YzMsIDB4ZDMsCisJCQkgICAgMHhiYiwgMHg1NCwgMHg1YSwgMHgxYSwgMHhmOSwgMHg3NCwgMHhhMiwgMHhjNSwKKwkJCSAgICAweDJkLCAweDY0LCAweDc1LCAweGRkLCAweGI0LCAweDU0LCAweGU2LCAweDc0LAorCQkJICAgIDB4OGMsIDB4ZDMsIDB4OWQsIDB4OWUsIDB4ODYsIDB4YWIsIDB4NTEsIDB4NTMsCisJCQkgICAgMHhiNywgMHg5MywgMHgzZSwgMHg2ZiwgMHhkMCwgMHg0ZSwgMHgyYywgMHg0MCwKKwkJCSAgICAweGY2LCAweGE4LCAweDJlLCAweDNlLCAweDlkLCAweGY0LCAweDY2LCAweGE1LAorCQkJICAgIDB4NzYsIDB4MTIsIDB4NzMsIDB4NDQsIDB4MWEsIDB4NTYsIDB4ZDcsIDB4NzIsCisJCQkgICAgMHg4OCwgMHhjZCwgMHgyMSwgMHg4YywgMHg0YywgMHgwZiwgMHhmZSwgMHhkYSwKKwkJCSAgICAweDk1LCAweGUwLCAweDNhLCAweGE2LCAweGE1LCAweDg0LCAweDQ2LCAweGNkLAorCQkJICAgIDB4ZDUsIDB4M2UsIDB4OWQsIDB4M2EsIDB4ZTIsIDB4NjcsIDB4ZTYsIDB4NjAsCisJCQkgICAgMHgxYSwgMHhlMiwgMHg3MCwgMHg4NSwgMHg1OCwgMHhjMiwgMHgxYiwgMHgwOSwKKwkJCSAgICAweGUxLCAweGQ3LCAweDJjLCAweGNhLCAweGFkLCAweGE4LCAweDhmLCAweGY5LAorCQkJICAgIDB4YWMsIDB4YjMsIDB4MGUsIDB4ZGIsIDB4Y2EsIDB4MmUsIDB4ZTIsIDB4YjgsCisJCQkgICAgMHg1MSwgMHg3MSwgMHhkOSwgMHgzYywgMHg2YywgMHhmMSwgMHg1NiwgMHhmOCwKKwkJCSAgICAweGVhLCAweDljLCAweGYxLCAweGZiLCAweDBjLCAweGU2LCAweGI3LCAweDEwLAorCQkJICAgIDB4MWMsIDB4ZjgsIDB4YTksIDB4N2MsIDB4ZTgsIDB4NTMsIDB4MzUsIDB4YzEsCisJCQkgICAgMHg5MCwgMHgzZSwgMHg3NiwgMHg0YSwgMHg3NCwgMHhhNCwgMHgyMSwgMHgyYywKKwkJCSAgICAweGY2LCAweDJjLCAweDRlLCAweDBmLCAweDk0LCAweDNhLCAweDg4LCAweDJlLAorCQkJICAgIDB4NDEsIDB4MDksIDB4NmEsIDB4MzMsIDB4N2QsIDB4ZjYsIDB4ZGQsIDB4M2YsCisJCQkgICAgMHg4ZCwgMHgyMywgMHgzMSwgMHg3NCwgMHg4NCwgMHhlYiwgMHg4OCwgMHg2ZSwKKwkJCSAgICAweGNjLCAweGI5LCAweGJjLCAweDIyLCAweDgzLCAweDE5LCAweDA3LCAweDIyLAorCQkJICAgIDB4YTUsIDB4MmQsIDB4ZGYsIDB4YTUsIDB4ZjMsIDB4ODAsIDB4ODUsIDB4NzgsCisJCQkgICAgMHg4NCwgMHgzOSwgMHg2YSwgMHg2ZCwgMHg2YSwgMHg5OSwgMHg0ZiwgMHhhNSwKKwkJCSAgICAweDE1LCAweGZlLCAweDQ2LCAweGIwLCAweGU0LCAweDZjLCAweGE1LCAweDQxLAorCQkJICAgIDB4M2MsIDB4Y2UsIDB4OGYsIDB4NDIsIDB4NjAsIDB4NzEsIDB4YTcsIDB4NzUsCisJCQkgICAgMHgwOCwgMHg0MCwgMHg2NSwgMHg4YSwgMHg4MiwgMHhiZiwgMHhmNSwgMHg0MywKKwkJCSAgICAweDcxLCAweDk2LCAweGE5LCAweDRkLCAweDQ0LCAweDhhLCAweDIwLCAweGJlLAorCQkJICAgIDB4ZmEsIDB4NGQsIDB4YmIsIDB4YzAsIDB4N2QsIDB4MzEsIDB4OTYsIDB4NjUsCisJCQkgICAgMHhlNywgMHg3NSwgMHhlNSwgMHgzZSwgMHhmZCwgMHg5MiwgMHgzYiwgMHhjOSwKKwkJCSAgICAweDU1LCAweGJiLCAweDE2LCAweDdlLCAweGY3LCAweGMyLCAweDhjLCAweGE0LAorCQkJICAgIDB4NDAsIDB4MWQsIDB4ZTUsIDB4ZWYsIDB4MGUsIDB4ZGYsIDB4ZTQsIDB4OWEsCisJCQkgICAgMHg2MiwgMHg3MywgMHg2NSwgMHhmZCwgMHg0NiwgMHg2MywgMHgyNSwgMHgzZCwKKwkJCSAgICAweDJiLCAweGFmLCAweGU1LCAweDY0LCAweGZlLCAweGE1LCAweDVjLCAweGNmLAorCQkJICAgIDB4MjQsIDB4ZjMsIDB4YjQsIDB4YWMsIDB4NjQsIDB4YmEsIDB4ZGYsIDB4NGIsCisJCQkgICAgMHhjNiwgMHg5NiwgMHg3ZCwgMHg4MSwgMHgyZCwgMHg4ZCwgMHg5NywgMHhmNywKKwkJCSAgICAweGM1LCAweDY4LCAweDc3LCAweDg0LCAweDMyLCAweDJiLCAweGNjLCAweDg1LAorCQkJICAgIDB4NzQsIDB4OTYsIDB4ZjAsIDB4MTIsIDB4NzcsIDB4NjEsIDB4YjksIDB4ZWIsCisJCQkgICAgMHg3MSwgMHhhYSwgMHg4MiwgMHhjYiwgMHgxYywgMHhkYiwgMHg4OSwgMHhjOCwKKwkJCSAgICAweGM2LCAweGI1LCAweGUzLCAweDVjLCAweDdkLCAweDM5LCAweDA3LCAweDI0LAorCQkJICAgIDB4ZGEsIDB4MzksIDB4ODcsIDB4NDUsIDB4YzAsIDB4MmIsIDB4YmIsIDB4MDEsCisJCQkgICAgMHhhYywgMHhiYywgMHgyYSwgMHg1YywgMHg3ZiwgMHhmYywgMHhlOCwgMHhjZSwKKwkJCSAgICAweDZkLCAweDljLCAweDZmLCAweGVkLCAweGQzLCAweGMxLCAweGExLCAweGQ2LAorCQkJICAgIDB4YzUsIDB4NTUsIDB4YTksIDB4NjYsIDB4MmYsIDB4ZTEsIDB4YzgsIDB4MzIsCisJCQkgICAgMHhhNiwgMHg1ZCwgMHhhNCwgMHgzYSwgMHg5OCwgMHg3MywgMHhlOCwgMHg0NSwKKwkJCSAgICAweGE0LCAweGM3LCAweGE4LCAweGI0LCAweGY2LCAweDEzLCAweDAzLCAweGY2LAorCQkJICAgIDB4ZTksIDB4MmUsIDB4YzQsIDB4MjksIDB4MGYsIDB4ODQsIDB4ZGIsIDB4YzQsCisJCQkgICAgMHgyMSwgMHhjNCwgMHhjMiwgMHg3NSwgMHg2NywgMHg4OSwgMHgzNywgMHgwYSB9LAorCQkuaWxlbiAgID0gNTEyLAorCQkucmVzdWx0ID0geyAweDFhLCAweDFkLCAweGE5LCAweDMwLCAweGFkLCAweGY5LCAweDJmLCAweDliLAorCQkJICAgIDB4YjYsIDB4MWQsIDB4YWUsIDB4ZWYsIDB4ZjAsIDB4MmYsIDB4ZjgsIDB4NWEsCisJCQkgICAgMHgzOSwgMHgzYywgMHhiZiwgMHgyYSwgMHhiMiwgMHg0NSwgMHhiMiwgMHgyMywKKwkJCSAgICAweDFiLCAweDYzLCAweDNjLCAweGNmLCAweGFhLCAweGJlLCAweGNmLCAweDRlLAorCQkJICAgIDB4ZmEsIDB4ZTgsIDB4MjksIDB4YzIsIDB4MjAsIDB4NjgsIDB4MmIsIDB4M2MsCisJCQkgICAgMHgyZSwgMHg4YiwgMHhmNywgMHg2ZSwgMHgyNSwgMHhiZCwgMHhlMywgMHgzZCwKKwkJCSAgICAweDY2LCAweDI3LCAweGQ2LCAweGFmLCAweGQ2LCAweDY0LCAweDNlLCAweGUzLAorCQkJICAgIDB4ZTgsIDB4NTgsIDB4NDYsIDB4OTcsIDB4MzksIDB4NTEsIDB4MDcsIDB4ZGUsCisJCQkgICAgMHhjYiwgMHgzNywgMHhiYywgMHhhOSwgMHhjMCwgMHg1ZiwgMHg3NSwgMHhjMywKKwkJCSAgICAweDBlLCAweDg0LCAweDIzLCAweDFkLCAweDE2LCAweGQ0LCAweDFjLCAweDU5LAorCQkJICAgIDB4OWMsIDB4MWEsIDB4MDIsIDB4NTUsIDB4YWIsIDB4M2EsIDB4OTcsIDB4MWQsCisJCQkgICAgMHhkZiwgMHhkZCwgMHhjNywgMHgwNiwgMHg1MSwgMHhkNywgMHg3MCwgMHhhZSwKKwkJCSAgICAweDIzLCAweGM2LCAweDhjLCAweGY1LCAweDFlLCAweGEwLCAweGU1LCAweDgyLAorCQkJICAgIDB4YjgsIDB4YjIsIDB4YmYsIDB4MDQsIDB4YTAsIDB4MzIsIDB4OGUsIDB4NjgsCisJCQkgICAgMHhlYiwgMHhhZiwgMHg2ZSwgMHgyZCwgMHg5NCwgMHgyMiwgMHgyZiwgMHhjZSwKKwkJCSAgICAweDRjLCAweGI1LCAweDU5LCAweGUyLCAweGEyLCAweDJmLCAweGEwLCAweDk4LAorCQkJICAgIDB4MWEsIDB4OTcsIDB4YzYsIDB4ZDQsIDB4YjUsIDB4MDAsIDB4NTksIDB4ZjIsCisJCQkgICAgMHg4NCwgMHgxNCwgMHg3MiwgMHhiMSwgMHg5YSwgMHg2ZSwgMHhhMywgMHg3ZiwKKwkJCSAgICAweGVhLCAweDIwLCAweGU3LCAweGNiLCAweDY1LCAweDc3LCAweDNhLCAweGRmLAorCQkJICAgIDB4YzgsIDB4OTcsIDB4NjcsIDB4MTUsIDB4YzIsIDB4MmEsIDB4MjcsIDB4Y2MsCisJCQkgICAgMHgxOCwgMHg1NSwgMHhhMSwgMHgyNCwgMHgwYiwgMHgyNCwgMHgyNCwgMHhhZiwKKwkJCSAgICAweDViLCAweGVjLCAweDY4LCAweGI4LCAweGM4LCAweGY1LCAweGJhLCAweDYzLAorCQkJICAgIDB4ZmYsIDB4ZWQsIDB4ODksIDB4Y2UsIDB4ZDUsIDB4M2QsIDB4ODgsIDB4ZjMsCisJCQkgICAgMHgyNSwgMHhlZiwgMHgwNSwgMHg3YywgMHgzYSwgMHhlZiwgMHhlYiwgMHhkOCwKKwkJCSAgICAweDdhLCAweDMyLCAweDBkLCAweGQxLCAweDFlLCAweDU4LCAweDU5LCAweDk5LAorCQkJICAgIDB4OTAsIDB4MjUsIDB4YjUsIDB4MjYsIDB4YjAsIDB4ZTMsIDB4MmIsIDB4NmMsCisJCQkgICAgMHg0YywgMHhhOSwgMHg4YiwgMHg4NCwgMHg0ZiwgMHg1ZSwgMHgwMSwgMHg1MCwKKwkJCSAgICAweDQxLCAweDMwLCAweDU4LCAweGM1LCAweDYyLCAweDc0LCAweDUyLCAweDFkLAorCQkJICAgIDB4NDUsIDB4MjQsIDB4NmEsIDB4NDIsIDB4NjQsIDB4NGYsIDB4OTcsIDB4MWMsCisJCQkgICAgMHhhOCwgMHg2NiwgMHhiNSwgMHg2ZCwgMHg3OSwgMHhkNCwgMHgwZCwgMHg0OCwKKwkJCSAgICAweGM1LCAweDVmLCAweGYzLCAweDkwLCAweDMyLCAweGRkLCAweGRkLCAweGUxLAorCQkJICAgIDB4ZTQsIDB4YTksIDB4OWYsIDB4ZmMsIDB4YzMsIDB4NTIsIDB4NWEsIDB4NDYsCisJCQkgICAgMHhlNCwgMHg4MSwgMHg4NCwgMHg5NSwgMHgzNiwgMHg1OSwgMHg3YSwgMHg2YiwKKwkJCSAgICAweGFhLCAweGIzLCAweDYwLCAweGFkLCAweGNlLCAweDlmLCAweDlmLCAweDI4LAorCQkJICAgIDB4ZTAsIDB4MDEsIDB4NzUsIDB4MjIsIDB4YzQsIDB4NGUsIDB4YTksIDB4NjIsCisJCQkgICAgMHg1YywgMHg2MiwgMHgwZCwgMHgwMCwgMHhjYiwgMHgxMywgMHhlOCwgMHg0MywKKwkJCSAgICAweDcyLCAweGQ0LCAweDJkLCAweDUzLCAweDQ2LCAweGI1LCAweGQxLCAweDE2LAorCQkJICAgIDB4MjIsIDB4MTgsIDB4ZGYsIDB4MzQsIDB4MzMsIDB4ZjUsIDB4ZDYsIDB4MWMsCisJCQkgICAgMHhiOCwgMHg3OSwgMHg3OCwgMHg5NywgMHg5NCwgMHhmZiwgMHg3MiwgMHgxMywKKwkJCSAgICAweDRjLCAweDI3LCAweGZjLCAweGNiLCAweGJmLCAweDAxLCAweDUzLCAweGE2LAorCQkJICAgIDB4YjQsIDB4NTAsIDB4NmUsIDB4ZGUsIDB4ZGYsIDB4YjUsIDB4NDMsIDB4YTQsCisJCQkgICAgMHg1OSwgMHhkZiwgMHg1MiwgMHhmOSwgMHg3YywgMHhlMCwgMHgxMSwgMHg2ZiwKKwkJCSAgICAweDJkLCAweDE0LCAweDhlLCAweDI0LCAweDYxLCAweDJjLCAweGUxLCAweDE3LAorCQkJICAgIDB4Y2MsIDB4Y2UsIDB4NTEsIDB4MGMsIDB4MTksIDB4OGEsIDB4ODIsIDB4MzAsCisJCQkgICAgMHg5NCwgMHhkNSwgMHgzZCwgMHg2YSwgMHg1MywgMHgwNiwgMHg1ZSwgMHhiZCwKKwkJCSAgICAweGI3LCAweGViLCAweGZhLCAweGZkLCAweDI3LCAweDUxLCAweGRlLCAweDg1LAorCQkJICAgIDB4MWUsIDB4ODYsIDB4NTMsIDB4MTEsIDB4NTMsIDB4OTQsIDB4MDAsIDB4ZWUsCisJCQkgICAgMHgyYiwgMHg4YywgMHgwOCwgMHgyYSwgMHhiZiwgMHhkZCwgMHhhZSwgMHgxMSwKKwkJCSAgICAweGNiLCAweDFlLCAweGEyLCAweDA3LCAweDlhLCAweDgwLCAweGNmLCAweDYyLAorCQkJICAgIDB4OWIsIDB4MDksIDB4ZGMsIDB4OTUsIDB4M2MsIDB4OTYsIDB4OGUsIDB4YjEsCisJCQkgICAgMHgwOSwgMHhiZCwgMHhlNCwgMHhlYiwgMHhkYiwgMHhjYSwgMHg3MCwgMHg3YSwKKwkJCSAgICAweDllLCAweGZhLCAweDMxLCAweDE4LCAweDQ1LCAweDNjLCAweDIxLCAweDMzLAorCQkJICAgIDB4YjAsIDB4YjMsIDB4MmIsIDB4ZWEsIDB4ZjMsIDB4NzEsIDB4MmQsIDB4ZTEsCisJCQkgICAgMHgwMywgMHhhZCwgMHgxYiwgMHg0OCwgMHhkNCwgMHg2NywgMHgyNywgMHhmMCwKKwkJCSAgICAweDYyLCAweGU0LCAweDNkLCAweGZiLCAweDliLCAweDA4LCAweDc2LCAweGU3LAorCQkJICAgIDB4ZGQsIDB4MmIsIDB4MDEsIDB4MzksIDB4MDQsIDB4NWEsIDB4NTgsIDB4N2EsCisJCQkgICAgMHhmNywgMHgxMSwgMHg5MCwgMHhlYywgMHhiZCwgMHg1MSwgMHg1YywgMHgzMiwKKwkJCSAgICAweDZiLCAweGQ3LCAweDM1LCAweDM5LCAweDAyLCAweDZiLCAweGYyLCAweGE2LAorCQkJICAgIDB4ZDAsIDB4MGQsIDB4MDcsIDB4ZTEsIDB4MDYsIDB4YzQsIDB4NWIsIDB4N2QsCisJCQkgICAgMHhlNCwgMHg2YSwgMHhkNywgMHhlZSwgMHgxNSwgMHgxZiwgMHg4MywgMHhiNCwKKwkJCSAgICAweGEzLCAweGE3LCAweDVlLCAweGMzLCAweDkwLCAweGI3LCAweGVmLCAweGQzLAorCQkJICAgIDB4YjcsIDB4NGYsIDB4ZjgsIDB4OTIsIDB4NGMsIDB4YjcsIDB4M2MsIDB4MjksCisJCQkgICAgMHhjZCwgMHg3ZSwgMHgyYiwgMHg1ZCwgMHg0MywgMHhlYSwgMHg0MiwgMHhlNywKKwkJCSAgICAweDc0LCAweDNmLCAweDdkLCAweDU4LCAweDg4LCAweDc1LCAweGRlLCAweDNlIH0sCisJCS5ybGVuICAgPSA1MTIsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjaXBoZXJfdGVzdHZlYyBhZXNfbHJ3X2RlY190dl90ZW1wbGF0ZVtdID0geworCS8qIGZyb20gaHR0cDovL2dyb3VwZXIuaWVlZS5vcmcvZ3JvdXBzLzE2MTkvZW1haWwvcGRmMDAwMTcucGRmICovCisJLyogc2FtZSBhcyBlbmMgdmVjdG9ycyB3aXRoIGlucHV0IGFuZCByZXN1bHQgcmV2ZXJzZWQgKi8KKwl7IC8qIExSVy0zMi1BRVMgMSAqLworCQkua2V5ICAgID0geyAweDQ1LCAweDYyLCAweGFjLCAweDI1LCAweGY4LCAweDI4LCAweDE3LCAweDZkLAorCQkJICAgIDB4NGMsIDB4MjYsIDB4ODQsIDB4MTQsIDB4YjUsIDB4NjgsIDB4MDEsIDB4ODUsCisJCQkgICAgMHgyNSwgMHg4ZSwgMHgyYSwgMHgwNSwgMHhlNywgMHgzZSwgMHg5ZCwgMHgwMywKKwkJCSAgICAweGVlLCAweDVhLCAweDgzLCAweDBjLCAweGNjLCAweDA5LCAweDRjLCAweDg3IH0sCisJCS5rbGVuICAgPSAzMiwKKwkJLml2ICAgICA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxIH0sCisJCS5pbnB1dCAgPSB7IDB4ZjEsIDB4YjIsIDB4NzMsIDB4Y2QsIDB4NjUsIDB4YTMsIDB4ZGYsIDB4NWYsCisJCQkgICAgMHhlOSwgMHg1ZCwgMHg0OCwgMHg5MiwgMHg1NCwgMHg2MywgMHg0ZSwgMHhiOCB9LAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSB7IDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisJCQkgICAgMHgzOCwgMHgzOSwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiB9LAorCQkucmxlbiAgID0gMTYsCisJfSwgeyAvKiBMUlctMzItQUVTIDIgKi8KKwkJLmtleSAgICA9IHsgMHg1OSwgMHg3MCwgMHg0NywgMHgxNCwgMHhmNSwgMHg1NywgMHg0NywgMHg4YywKKwkJICAJICAgIDB4ZDcsIDB4NzksIDB4ZTgsIDB4MGYsIDB4NTQsIDB4ODgsIDB4NzksIDB4NDQsCisJCQkgICAgMHgwZCwgMHg0OCwgMHhmMCwgMHhiNywgMHhiMSwgMHg1YSwgMHg1MywgMHhlYSwKKwkJCSAgICAweDFjLCAweGFhLCAweDZiLCAweDI5LCAweGMyLCAweGNhLCAweGZiLCAweGFmCisJCX0sCisJCS5rbGVuICAgPSAzMiwKKwkJLml2ICAgICA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyIH0sCisJCS5pbnB1dCAgPSB7IDB4MDAsIDB4YzgsIDB4MmIsIDB4YWUsIDB4OTUsIDB4YmIsIDB4Y2QsIDB4ZTUsCisJCQkgICAgMHgyNywgMHg0ZiwgMHgwNywgMHg2OSwgMHhiMiwgMHg2MCwgMHhlMSwgMHgzNiB9LAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgID0geyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCQkJICAgICAweDM4LCAweDM5LCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2IH0sCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7IC8qIExSVy0zMi1BRVMgMyAqLworCQkua2V5ICAgID0geyAweGQ4LCAweDJhLCAweDkxLCAweDM0LCAweGIyLCAweDZhLCAweDU2LCAweDUwLAorCQkgIAkgICAgMHgzMCwgMHhmZSwgMHg2OSwgMHhlMiwgMHgzNywgMHg3ZiwgMHg5OCwgMHg0NywKKwkJCSAgICAweGNkLCAweGY5LCAweDBiLCAweDE2LCAweDBjLCAweDY0LCAweDhmLCAweGI2LAorCQkJICAgIDB4YjAsIDB4MGQsIDB4MGQsIDB4MWIsIDB4YWUsIDB4ODUsIDB4ODcsIDB4MWYgfSwKKwkJLmtsZW4gICA9IDMyLAorCQkuaXYgICAgID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKwkJLmlucHV0ICA9IHsgMHg3NiwgMHgzMiwgMHgyMSwgMHg4MywgMHhlZCwgMHg4ZiwgMHhmMSwgMHg4MiwKKwkJCSAgICAweGY5LCAweDU5LCAweDYyLCAweDAzLCAweDY5LCAweDBlLCAweDVlLCAweDAxIH0sCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9IHsgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKKwkJCSAgICAweDM4LCAweDM5LCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2IH0sCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7IC8qIExSVy0zMi1BRVMgNCAqLworCQkua2V5ICAgID0geyAweDBmLCAweDZhLCAweGVmLCAweGY4LCAweGQzLCAweGQyLCAweGJiLCAweDE1LAorCQkgIAkgICAgMHgyNSwgMHg4MywgMHhmNywgMHgzYywgMHgxZiwgMHgwMSwgMHgyOCwgMHg3NCwKKwkJCSAgICAweGNhLCAweGM2LCAweGJjLCAweDM1LCAweDRkLCAweDRhLCAweDY1LCAweDU0LAorCQkJICAgIDB4OTAsIDB4YWUsIDB4NjEsIDB4Y2YsIDB4N2IsIDB4YWUsIDB4YmQsIDB4Y2MsCisJCQkgICAgMHhhZCwgMHhlNCwgMHg5NCwgMHhjNSwgMHg0YSwgMHgyOSwgMHhhZSwgMHg3MCB9LAorCQkua2xlbiAgID0gNDAsCisJCS5pdiAgICAgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9LAorCQkuaW5wdXQgID0geyAweDljLCAweDBmLCAweDE1LCAweDJmLCAweDU1LCAweGEyLCAweGQ4LCAweGYwLAorCQkJICAgIDB4ZDYsIDB4N2IsIDB4OGYsIDB4OWUsIDB4MjgsIDB4MjIsIDB4YmMsIDB4NDEgfSwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0geyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCQkJICAgIDB4MzgsIDB4MzksIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYgfSwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyA1ICovCisJCS5rZXkgICAgPSB7IDB4OGEsIDB4ZDQsIDB4ZWUsIDB4MTAsIDB4MmYsIDB4YmQsIDB4ODEsIDB4ZmYsCisJCSAgCSAgICAweGY4LCAweDg2LCAweGNlLCAweGFjLCAweDkzLCAweGM1LCAweGFkLCAweGM2LAorCQkJICAgIDB4YTAsIDB4MTksIDB4MDcsIDB4YzAsIDB4OWQsIDB4ZjcsIDB4YmIsIDB4ZGQsCisJCQkgICAgMHg1MiwgMHgxMywgMHhiMiwgMHhiNywgMHhmMCwgMHhmZiwgMHgxMSwgMHhkOCwKKwkJCSAgICAweGQ2LCAweDA4LCAweGQwLCAweGNkLCAweDJlLCAweGIxLCAweDE3LCAweDZmIH0sCisJCS5rbGVuICAgPSA0MCwKKwkJLml2ICAgICA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCisJCS5pbnB1dCAgPSB7IDB4ZDQsIDB4MjcsIDB4NmEsIDB4N2YsIDB4MTQsIDB4OTEsIDB4M2QsIDB4NjUsCisJCQkgICAgMHhjOCwgMHg2MCwgMHg0OCwgMHgwMiwgMHg4NywgMHhlMywgMHgzNCwgMHgwNiB9LAorCQkuaWxlbiAgID0gMTYsCisJCS5yZXN1bHQgPSB7IDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisJCQkgICAgMHgzOCwgMHgzOSwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiB9LAorCQkucmxlbiAgID0gMTYsCisJfSwgeyAvKiBMUlctMzItQUVTIDYgKi8KKwkJLmtleSAgICA9IHsgMHhmOCwgMHhkNCwgMHg3NiwgMHhmZiwgMHhkNiwgMHg0NiwgMHhlZSwgMHg2YywKKwkJICAJICAgIDB4MjMsIDB4ODQsIDB4Y2IsIDB4MWMsIDB4NzcsIDB4ZDYsIDB4MTksIDB4NWQsCisJCQkgICAgMHhmZSwgMHhmMSwgMHhhOSwgMHhmMywgMHg3YiwgMHhiYywgMHg4ZCwgMHgyMSwKKwkJCSAgICAweGE3LCAweDljLCAweDIxLCAweGY4LCAweGNiLCAweDkwLCAweDAyLCAweDg5LAorCQkJICAgIDB4YTgsIDB4NDUsIDB4MzQsIDB4OGUsIDB4YzgsIDB4YzUsIDB4YjUsIDB4ZjEsCisJCQkgICAgMHgyNiwgMHhmNSwgMHgwZSwgMHg3NiwgMHhmZSwgMHhmZCwgMHgxYiwgMHgxZSB9LAorCQkua2xlbiAgID0gNDgsCisJCS5pdiAgICAgPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9LAorCQkuaW5wdXQgID0geyAweGJkLCAweDA2LCAweGI4LCAweGUxLCAweGRiLCAweDk4LCAweDg5LCAweDllLAorCQkJICAgIDB4YzQsIDB4OTgsIDB4ZTQsIDB4OTEsIDB4Y2YsIDB4MWMsIDB4NzAsIDB4MmIgfSwKKwkJLmlsZW4gICA9IDE2LAorCQkucmVzdWx0ID0geyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorCQkJICAgIDB4MzgsIDB4MzksIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYgfSwKKwkJLnJsZW4gICA9IDE2LAorCX0sIHsgLyogTFJXLTMyLUFFUyA3ICovCisJCS5rZXkgICAgPSB7IDB4ZmIsIDB4NzYsIDB4MTUsIDB4YjIsIDB4M2QsIDB4ODAsIDB4ODksIDB4MWQsCisJCSAgCSAgICAweGQ0LCAweDcwLCAweDk4LCAweDBiLCAweGM3LCAweDk1LCAweDg0LCAweGM4LAorCQkJICAgIDB4YjIsIDB4ZmIsIDB4NjQsIDB4Y2UsIDB4NjAsIDB4OTcsIDB4ODcsIDB4OGQsCisJCQkgICAgMHgxNywgMHhmYywgMHhlNCwgMHg1YSwgMHg0OSwgMHhlOCwgMHgzMCwgMHhiNywKKwkJCSAgICAweDZlLCAweDc4LCAweDE3LCAweGU3LCAweDJkLCAweDVlLCAweDEyLCAweGQ0LAorCQkJICAgIDB4NjAsIDB4NjQsIDB4MDQsIDB4N2EsIDB4ZjEsIDB4MmYsIDB4OWUsIDB4MGMgfSwKKwkJLmtsZW4gICA9IDQ4LAorCQkuaXYgICAgID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKwkJLmlucHV0ICA9IHsgMHg1YiwgMHg5MCwgMHg4ZSwgMHhjMSwgMHhhYiwgMHhkZCwgMHg2NywgMHg1ZiwKKwkJCSAgICAweDNkLCAweDY5LCAweDhhLCAweDk1LCAweDUzLCAweGM4LCAweDljLCAweGU1IH0sCisJCS5pbGVuICAgPSAxNiwKKwkJLnJlc3VsdCA9IHsgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKKwkJCSAgICAweDM4LCAweDM5LCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2IH0sCisJCS5ybGVuICAgPSAxNiwKKwl9LCB7CisvKiBodHRwOi8vd3d3Lm1haWwtYXJjaGl2ZS5jb20vc3Rkcy1wMTYxOUBsaXN0c2Vydi5pZWVlLm9yZy9tc2cwMDE3My5odG1sICovCisJCS5rZXkgICAgPSB7IDB4ZjgsIDB4ZDQsIDB4NzYsIDB4ZmYsIDB4ZDYsIDB4NDYsIDB4ZWUsIDB4NmMsCisJCQkgICAgMHgyMywgMHg4NCwgMHhjYiwgMHgxYywgMHg3NywgMHhkNiwgMHgxOSwgMHg1ZCwKKwkJCSAgICAweGZlLCAweGYxLCAweGE5LCAweGYzLCAweDdiLCAweGJjLCAweDhkLCAweDIxLAorCQkJICAgIDB4YTcsIDB4OWMsIDB4MjEsIDB4ZjgsIDB4Y2IsIDB4OTAsIDB4MDIsIDB4ODksCisJCQkgICAgMHhhOCwgMHg0NSwgMHgzNCwgMHg4ZSwgMHhjOCwgMHhjNSwgMHhiNSwgMHhmMSwKKwkJCSAgICAweDI2LCAweGY1LCAweDBlLCAweDc2LCAweGZlLCAweGZkLCAweDFiLCAweDFlIH0sCisJCS5rbGVuICAgPSA0OCwKKwkJLml2ICAgICA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxIH0sCisJCS5pbnB1dAk9IHsgMHgxYSwgMHgxZCwgMHhhOSwgMHgzMCwgMHhhZCwgMHhmOSwgMHgyZiwgMHg5YiwKKwkJCSAgICAweGI2LCAweDFkLCAweGFlLCAweGVmLCAweGYwLCAweDJmLCAweGY4LCAweDVhLAorCQkJICAgIDB4MzksIDB4M2MsIDB4YmYsIDB4MmEsIDB4YjIsIDB4NDUsIDB4YjIsIDB4MjMsCisJCQkgICAgMHgxYiwgMHg2MywgMHgzYywgMHhjZiwgMHhhYSwgMHhiZSwgMHhjZiwgMHg0ZSwKKwkJCSAgICAweGZhLCAweGU4LCAweDI5LCAweGMyLCAweDIwLCAweDY4LCAweDJiLCAweDNjLAorCQkJICAgIDB4MmUsIDB4OGIsIDB4ZjcsIDB4NmUsIDB4MjUsIDB4YmQsIDB4ZTMsIDB4M2QsCisJCQkgICAgMHg2NiwgMHgyNywgMHhkNiwgMHhhZiwgMHhkNiwgMHg2NCwgMHgzZSwgMHhlMywKKwkJCSAgICAweGU4LCAweDU4LCAweDQ2LCAweDk3LCAweDM5LCAweDUxLCAweDA3LCAweGRlLAorCQkJICAgIDB4Y2IsIDB4MzcsIDB4YmMsIDB4YTksIDB4YzAsIDB4NWYsIDB4NzUsIDB4YzMsCisJCQkgICAgMHgwZSwgMHg4NCwgMHgyMywgMHgxZCwgMHgxNiwgMHhkNCwgMHgxYywgMHg1OSwKKwkJCSAgICAweDljLCAweDFhLCAweDAyLCAweDU1LCAweGFiLCAweDNhLCAweDk3LCAweDFkLAorCQkJICAgIDB4ZGYsIDB4ZGQsIDB4YzcsIDB4MDYsIDB4NTEsIDB4ZDcsIDB4NzAsIDB4YWUsCisJCQkgICAgMHgyMywgMHhjNiwgMHg4YywgMHhmNSwgMHgxZSwgMHhhMCwgMHhlNSwgMHg4MiwKKwkJCSAgICAweGI4LCAweGIyLCAweGJmLCAweDA0LCAweGEwLCAweDMyLCAweDhlLCAweDY4LAorCQkJICAgIDB4ZWIsIDB4YWYsIDB4NmUsIDB4MmQsIDB4OTQsIDB4MjIsIDB4MmYsIDB4Y2UsCisJCQkgICAgMHg0YywgMHhiNSwgMHg1OSwgMHhlMiwgMHhhMiwgMHgyZiwgMHhhMCwgMHg5OCwKKwkJCSAgICAweDFhLCAweDk3LCAweGM2LCAweGQ0LCAweGI1LCAweDAwLCAweDU5LCAweGYyLAorCQkJICAgIDB4ODQsIDB4MTQsIDB4NzIsIDB4YjEsIDB4OWEsIDB4NmUsIDB4YTMsIDB4N2YsCisJCQkgICAgMHhlYSwgMHgyMCwgMHhlNywgMHhjYiwgMHg2NSwgMHg3NywgMHgzYSwgMHhkZiwKKwkJCSAgICAweGM4LCAweDk3LCAweDY3LCAweDE1LCAweGMyLCAweDJhLCAweDI3LCAweGNjLAorCQkJICAgIDB4MTgsIDB4NTUsIDB4YTEsIDB4MjQsIDB4MGIsIDB4MjQsIDB4MjQsIDB4YWYsCisJCQkgICAgMHg1YiwgMHhlYywgMHg2OCwgMHhiOCwgMHhjOCwgMHhmNSwgMHhiYSwgMHg2MywKKwkJCSAgICAweGZmLCAweGVkLCAweDg5LCAweGNlLCAweGQ1LCAweDNkLCAweDg4LCAweGYzLAorCQkJICAgIDB4MjUsIDB4ZWYsIDB4MDUsIDB4N2MsIDB4M2EsIDB4ZWYsIDB4ZWIsIDB4ZDgsCisJCQkgICAgMHg3YSwgMHgzMiwgMHgwZCwgMHhkMSwgMHgxZSwgMHg1OCwgMHg1OSwgMHg5OSwKKwkJCSAgICAweDkwLCAweDI1LCAweGI1LCAweDI2LCAweGIwLCAweGUzLCAweDJiLCAweDZjLAorCQkJICAgIDB4NGMsIDB4YTksIDB4OGIsIDB4ODQsIDB4NGYsIDB4NWUsIDB4MDEsIDB4NTAsCisJCQkgICAgMHg0MSwgMHgzMCwgMHg1OCwgMHhjNSwgMHg2MiwgMHg3NCwgMHg1MiwgMHgxZCwKKwkJCSAgICAweDQ1LCAweDI0LCAweDZhLCAweDQyLCAweDY0LCAweDRmLCAweDk3LCAweDFjLAorCQkJICAgIDB4YTgsIDB4NjYsIDB4YjUsIDB4NmQsIDB4NzksIDB4ZDQsIDB4MGQsIDB4NDgsCisJCQkgICAgMHhjNSwgMHg1ZiwgMHhmMywgMHg5MCwgMHgzMiwgMHhkZCwgMHhkZCwgMHhlMSwKKwkJCSAgICAweGU0LCAweGE5LCAweDlmLCAweGZjLCAweGMzLCAweDUyLCAweDVhLCAweDQ2LAorCQkJICAgIDB4ZTQsIDB4ODEsIDB4ODQsIDB4OTUsIDB4MzYsIDB4NTksIDB4N2EsIDB4NmIsCisJCQkgICAgMHhhYSwgMHhiMywgMHg2MCwgMHhhZCwgMHhjZSwgMHg5ZiwgMHg5ZiwgMHgyOCwKKwkJCSAgICAweGUwLCAweDAxLCAweDc1LCAweDIyLCAweGM0LCAweDRlLCAweGE5LCAweDYyLAorCQkJICAgIDB4NWMsIDB4NjIsIDB4MGQsIDB4MDAsIDB4Y2IsIDB4MTMsIDB4ZTgsIDB4NDMsCisJCQkgICAgMHg3MiwgMHhkNCwgMHgyZCwgMHg1MywgMHg0NiwgMHhiNSwgMHhkMSwgMHgxNiwKKwkJCSAgICAweDIyLCAweDE4LCAweGRmLCAweDM0LCAweDMzLCAweGY1LCAweGQ2LCAweDFjLAorCQkJICAgIDB4YjgsIDB4NzksIDB4NzgsIDB4OTcsIDB4OTQsIDB4ZmYsIDB4NzIsIDB4MTMsCisJCQkgICAgMHg0YywgMHgyNywgMHhmYywgMHhjYiwgMHhiZiwgMHgwMSwgMHg1MywgMHhhNiwKKwkJCSAgICAweGI0LCAweDUwLCAweDZlLCAweGRlLCAweGRmLCAweGI1LCAweDQzLCAweGE0LAorCQkJICAgIDB4NTksIDB4ZGYsIDB4NTIsIDB4ZjksIDB4N2MsIDB4ZTAsIDB4MTEsIDB4NmYsCisJCQkgICAgMHgyZCwgMHgxNCwgMHg4ZSwgMHgyNCwgMHg2MSwgMHgyYywgMHhlMSwgMHgxNywKKwkJCSAgICAweGNjLCAweGNlLCAweDUxLCAweDBjLCAweDE5LCAweDhhLCAweDgyLCAweDMwLAorCQkJICAgIDB4OTQsIDB4ZDUsIDB4M2QsIDB4NmEsIDB4NTMsIDB4MDYsIDB4NWUsIDB4YmQsCisJCQkgICAgMHhiNywgMHhlYiwgMHhmYSwgMHhmZCwgMHgyNywgMHg1MSwgMHhkZSwgMHg4NSwKKwkJCSAgICAweDFlLCAweDg2LCAweDUzLCAweDExLCAweDUzLCAweDk0LCAweDAwLCAweGVlLAorCQkJICAgIDB4MmIsIDB4OGMsIDB4MDgsIDB4MmEsIDB4YmYsIDB4ZGQsIDB4YWUsIDB4MTEsCisJCQkgICAgMHhjYiwgMHgxZSwgMHhhMiwgMHgwNywgMHg5YSwgMHg4MCwgMHhjZiwgMHg2MiwKKwkJCSAgICAweDliLCAweDA5LCAweGRjLCAweDk1LCAweDNjLCAweDk2LCAweDhlLCAweGIxLAorCQkJICAgIDB4MDksIDB4YmQsIDB4ZTQsIDB4ZWIsIDB4ZGIsIDB4Y2EsIDB4NzAsIDB4N2EsCisJCQkgICAgMHg5ZSwgMHhmYSwgMHgzMSwgMHgxOCwgMHg0NSwgMHgzYywgMHgyMSwgMHgzMywKKwkJCSAgICAweGIwLCAweGIzLCAweDJiLCAweGVhLCAweGYzLCAweDcxLCAweDJkLCAweGUxLAorCQkJICAgIDB4MDMsIDB4YWQsIDB4MWIsIDB4NDgsIDB4ZDQsIDB4NjcsIDB4MjcsIDB4ZjAsCisJCQkgICAgMHg2MiwgMHhlNCwgMHgzZCwgMHhmYiwgMHg5YiwgMHgwOCwgMHg3NiwgMHhlNywKKwkJCSAgICAweGRkLCAweDJiLCAweDAxLCAweDM5LCAweDA0LCAweDVhLCAweDU4LCAweDdhLAorCQkJICAgIDB4ZjcsIDB4MTEsIDB4OTAsIDB4ZWMsIDB4YmQsIDB4NTEsIDB4NWMsIDB4MzIsCisJCQkgICAgMHg2YiwgMHhkNywgMHgzNSwgMHgzOSwgMHgwMiwgMHg2YiwgMHhmMiwgMHhhNiwKKwkJCSAgICAweGQwLCAweDBkLCAweDA3LCAweGUxLCAweDA2LCAweGM0LCAweDViLCAweDdkLAorCQkJICAgIDB4ZTQsIDB4NmEsIDB4ZDcsIDB4ZWUsIDB4MTUsIDB4MWYsIDB4ODMsIDB4YjQsCisJCQkgICAgMHhhMywgMHhhNywgMHg1ZSwgMHhjMywgMHg5MCwgMHhiNywgMHhlZiwgMHhkMywKKwkJCSAgICAweGI3LCAweDRmLCAweGY4LCAweDkyLCAweDRjLCAweGI3LCAweDNjLCAweDI5LAorCQkJICAgIDB4Y2QsIDB4N2UsIDB4MmIsIDB4NWQsIDB4NDMsIDB4ZWEsIDB4NDIsIDB4ZTcsCisJCQkgICAgMHg3NCwgMHgzZiwgMHg3ZCwgMHg1OCwgMHg4OCwgMHg3NSwgMHhkZSwgMHgzZSB9LAorCQkuaWxlbiAgID0gNTEyLAorCQkucmVzdWx0CT0geyAweDA1LCAweDExLCAweGI3LCAweDE4LCAweGFiLCAweGM2LCAweDJkLCAweGFjLAorCQkJICAgIDB4NzAsIDB4NWQsIDB4ZjYsIDB4MjIsIDB4OTQsIDB4Y2QsIDB4ZTUsIDB4NmMsCisJCQkgICAgMHgxNywgMHg2YiwgMHhmNiwgMHgxYywgMHhmMCwgMHhmMywgMHg2ZSwgMHhmOCwKKwkJCSAgICAweDUwLCAweDM4LCAweDFmLCAweDcxLCAweDQ5LCAweGI2LCAweDU3LCAweGQ2LAorCQkJICAgIDB4OGYsIDB4Y2IsIDB4OGQsIDB4NmIsIDB4ZTMsIDB4YTYsIDB4MjksIDB4OTAsCisJCQkgICAgMHhmZSwgMHgyYSwgMHg2MiwgMHg4MiwgMHhhZSwgMHg2ZCwgMHg4YiwgMHhmNiwKKwkJCSAgICAweGFkLCAweDFlLCAweDllLCAweDIwLCAweDVmLCAweDM4LCAweGJlLCAweDA0LAorCQkJICAgIDB4ZGEsIDB4MTAsIDB4OGUsIDB4ZWQsIDB4YTIsIDB4YTQsIDB4ODcsIDB4YWIsCisJCQkgICAgMHhkYSwgMHg2YiwgMHhiNCwgMHgwYywgMHg3NSwgMHhiYSwgMHhkMywgMHg3YywKKwkJCSAgICAweGM5LCAweGFjLCAweDQyLCAweDMxLCAweDk1LCAweDdjLCAweGM5LCAweDA0LAorCQkJICAgIDB4ZWIsIDB4ZDUsIDB4NmUsIDB4MzIsIDB4NjksIDB4OGEsIDB4ZGIsIDB4YTYsCisJCQkgICAgMHgxNSwgMHhkNywgMHgzZiwgMHg0ZiwgMHgyZiwgMHg2NiwgMHg2OSwgMHgwMywKKwkJCSAgICAweDljLCAweDFmLCAweDU0LCAweDBmLCAweGRlLCAweDFmLCAweGYzLCAweDY1LAorCQkJICAgIDB4NGMsIDB4OTYsIDB4MTIsIDB4ZWQsIDB4N2MsIDB4OTIsIDB4MDMsIDB4MDEsCisJCQkgICAgMHg2ZiwgMHhiYywgMHgzNSwgMHg5MywgMHhhYywgMHhmMSwgMHgyNywgMHhmMSwKKwkJCSAgICAweGI0LCAweDk2LCAweDgyLCAweDVhLCAweDVmLCAweGIwLCAweGEwLCAweDUwLAorCQkJICAgIDB4ODksIDB4YTQsIDB4OGUsIDB4NjYsIDB4NDQsIDB4ODUsIDB4Y2MsIDB4ZmQsCisJCQkgICAgMHgzMywgMHgxNCwgMHg3MCwgMHhlMywgMHg5NiwgMHhiMiwgMHhjMywgMHhkMywKKwkJCSAgICAweGJiLCAweDU0LCAweDVhLCAweDFhLCAweGY5LCAweDc0LCAweGEyLCAweGM1LAorCQkJICAgIDB4MmQsIDB4NjQsIDB4NzUsIDB4ZGQsIDB4YjQsIDB4NTQsIDB4ZTYsIDB4NzQsCisJCQkgICAgMHg4YywgMHhkMywgMHg5ZCwgMHg5ZSwgMHg4NiwgMHhhYiwgMHg1MSwgMHg1MywKKwkJCSAgICAweGI3LCAweDkzLCAweDNlLCAweDZmLCAweGQwLCAweDRlLCAweDJjLCAweDQwLAorCQkJICAgIDB4ZjYsIDB4YTgsIDB4MmUsIDB4M2UsIDB4OWQsIDB4ZjQsIDB4NjYsIDB4YTUsCisJCQkgICAgMHg3NiwgMHgxMiwgMHg3MywgMHg0NCwgMHgxYSwgMHg1NiwgMHhkNywgMHg3MiwKKwkJCSAgICAweDg4LCAweGNkLCAweDIxLCAweDhjLCAweDRjLCAweDBmLCAweGZlLCAweGRhLAorCQkJICAgIDB4OTUsIDB4ZTAsIDB4M2EsIDB4YTYsIDB4YTUsIDB4ODQsIDB4NDYsIDB4Y2QsCisJCQkgICAgMHhkNSwgMHgzZSwgMHg5ZCwgMHgzYSwgMHhlMiwgMHg2NywgMHhlNiwgMHg2MCwKKwkJCSAgICAweDFhLCAweGUyLCAweDcwLCAweDg1LCAweDU4LCAweGMyLCAweDFiLCAweDA5LAorCQkJICAgIDB4ZTEsIDB4ZDcsIDB4MmMsIDB4Y2EsIDB4YWQsIDB4YTgsIDB4OGYsIDB4ZjksCisJCQkgICAgMHhhYywgMHhiMywgMHgwZSwgMHhkYiwgMHhjYSwgMHgyZSwgMHhlMiwgMHhiOCwKKwkJCSAgICAweDUxLCAweDcxLCAweGQ5LCAweDNjLCAweDZjLCAweGYxLCAweDU2LCAweGY4LAorCQkJICAgIDB4ZWEsIDB4OWMsIDB4ZjEsIDB4ZmIsIDB4MGMsIDB4ZTYsIDB4YjcsIDB4MTAsCisJCQkgICAgMHgxYywgMHhmOCwgMHhhOSwgMHg3YywgMHhlOCwgMHg1MywgMHgzNSwgMHhjMSwKKwkJCSAgICAweDkwLCAweDNlLCAweDc2LCAweDRhLCAweDc0LCAweGE0LCAweDIxLCAweDJjLAorCQkJICAgIDB4ZjYsIDB4MmMsIDB4NGUsIDB4MGYsIDB4OTQsIDB4M2EsIDB4ODgsIDB4MmUsCisJCQkgICAgMHg0MSwgMHgwOSwgMHg2YSwgMHgzMywgMHg3ZCwgMHhmNiwgMHhkZCwgMHgzZiwKKwkJCSAgICAweDhkLCAweDIzLCAweDMxLCAweDc0LCAweDg0LCAweGViLCAweDg4LCAweDZlLAorCQkJICAgIDB4Y2MsIDB4YjksIDB4YmMsIDB4MjIsIDB4ODMsIDB4MTksIDB4MDcsIDB4MjIsCisJCQkgICAgMHhhNSwgMHgyZCwgMHhkZiwgMHhhNSwgMHhmMywgMHg4MCwgMHg4NSwgMHg3OCwKKwkJCSAgICAweDg0LCAweDM5LCAweDZhLCAweDZkLCAweDZhLCAweDk5LCAweDRmLCAweGE1LAorCQkJICAgIDB4MTUsIDB4ZmUsIDB4NDYsIDB4YjAsIDB4ZTQsIDB4NmMsIDB4YTUsIDB4NDEsCisJCQkgICAgMHgzYywgMHhjZSwgMHg4ZiwgMHg0MiwgMHg2MCwgMHg3MSwgMHhhNywgMHg3NSwKKwkJCSAgICAweDA4LCAweDQwLCAweDY1LCAweDhhLCAweDgyLCAweGJmLCAweGY1LCAweDQzLAorCQkJICAgIDB4NzEsIDB4OTYsIDB4YTksIDB4NGQsIDB4NDQsIDB4OGEsIDB4MjAsIDB4YmUsCisJCQkgICAgMHhmYSwgMHg0ZCwgMHhiYiwgMHhjMCwgMHg3ZCwgMHgzMSwgMHg5NiwgMHg2NSwKKwkJCSAgICAweGU3LCAweDc1LCAweGU1LCAweDNlLCAweGZkLCAweDkyLCAweDNiLCAweGM5LAorCQkJICAgIDB4NTUsIDB4YmIsIDB4MTYsIDB4N2UsIDB4ZjcsIDB4YzIsIDB4OGMsIDB4YTQsCisJCQkgICAgMHg0MCwgMHgxZCwgMHhlNSwgMHhlZiwgMHgwZSwgMHhkZiwgMHhlNCwgMHg5YSwKKwkJCSAgICAweDYyLCAweDczLCAweDY1LCAweGZkLCAweDQ2LCAweDYzLCAweDI1LCAweDNkLAorCQkJICAgIDB4MmIsIDB4YWYsIDB4ZTUsIDB4NjQsIDB4ZmUsIDB4YTUsIDB4NWMsIDB4Y2YsCisJCQkgICAgMHgyNCwgMHhmMywgMHhiNCwgMHhhYywgMHg2NCwgMHhiYSwgMHhkZiwgMHg0YiwKKwkJCSAgICAweGM2LCAweDk2LCAweDdkLCAweDgxLCAweDJkLCAweDhkLCAweDk3LCAweGY3LAorCQkJICAgIDB4YzUsIDB4NjgsIDB4NzcsIDB4ODQsIDB4MzIsIDB4MmIsIDB4Y2MsIDB4ODUsCisJCQkgICAgMHg3NCwgMHg5NiwgMHhmMCwgMHgxMiwgMHg3NywgMHg2MSwgMHhiOSwgMHhlYiwKKwkJCSAgICAweDcxLCAweGFhLCAweDgyLCAweGNiLCAweDFjLCAweGRiLCAweDg5LCAweGM4LAorCQkJICAgIDB4YzYsIDB4YjUsIDB4ZTMsIDB4NWMsIDB4N2QsIDB4MzksIDB4MDcsIDB4MjQsCisJCQkgICAgMHhkYSwgMHgzOSwgMHg4NywgMHg0NSwgMHhjMCwgMHgyYiwgMHhiYiwgMHgwMSwKKwkJCSAgICAweGFjLCAweGJjLCAweDJhLCAweDVjLCAweDdmLCAweGZjLCAweGU4LCAweGNlLAorCQkJICAgIDB4NmQsIDB4OWMsIDB4NmYsIDB4ZWQsIDB4ZDMsIDB4YzEsIDB4YTEsIDB4ZDYsCisJCQkgICAgMHhjNSwgMHg1NSwgMHhhOSwgMHg2NiwgMHgyZiwgMHhlMSwgMHhjOCwgMHgzMiwKKwkJCSAgICAweGE2LCAweDVkLCAweGE0LCAweDNhLCAweDk4LCAweDczLCAweGU4LCAweDQ1LAorCQkJICAgIDB4YTQsIDB4YzcsIDB4YTgsIDB4YjQsIDB4ZjYsIDB4MTMsIDB4MDMsIDB4ZjYsCisJCQkgICAgMHhlOSwgMHgyZSwgMHhjNCwgMHgyOSwgMHgwZiwgMHg4NCwgMHhkYiwgMHhjNCwKKwkJCSAgICAweDIxLCAweGM0LCAweGMyLCAweDc1LCAweDY3LCAweDg5LCAweDM3LCAweDBhIH0sCisJCS5ybGVuICAgPSA1MTIsCisJfQorfTsKKwogLyogQ2FzdDUgdGVzdCB2ZWN0b3JzIGZyb20gUkZDIDIxNDQgKi8KICNkZWZpbmUgQ0FTVDVfRU5DX1RFU1RfVkVDVE9SUwkzCiAjZGVmaW5lIENBU1Q1X0RFQ19URVNUX1ZFQ1RPUlMJMwpAQCAtMzA4NCw2ICszNjU3LDI3IEBACiAJeyAgLmtsZW4gPSAwLCAuYmxlbiA9IDAsIH0KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2lwaGVyX3NwZWVkIGFlc19scndfc3BlZWRfdGVtcGxhdGVbXSA9IHsKKwl7IC5rbGVuID0gMzIsIC5ibGVuID0gMTYsIH0sCisJeyAua2xlbiA9IDMyLCAuYmxlbiA9IDY0LCB9LAorCXsgLmtsZW4gPSAzMiwgLmJsZW4gPSAyNTYsIH0sCisJeyAua2xlbiA9IDMyLCAuYmxlbiA9IDEwMjQsIH0sCisJeyAua2xlbiA9IDMyLCAuYmxlbiA9IDgxOTIsIH0sCisJeyAua2xlbiA9IDQwLCAuYmxlbiA9IDE2LCB9LAorCXsgLmtsZW4gPSA0MCwgLmJsZW4gPSA2NCwgfSwKKwl7IC5rbGVuID0gNDAsIC5ibGVuID0gMjU2LCB9LAorCXsgLmtsZW4gPSA0MCwgLmJsZW4gPSAxMDI0LCB9LAorCXsgLmtsZW4gPSA0MCwgLmJsZW4gPSA4MTkyLCB9LAorCXsgLmtsZW4gPSA0OCwgLmJsZW4gPSAxNiwgfSwKKwl7IC5rbGVuID0gNDgsIC5ibGVuID0gNjQsIH0sCisJeyAua2xlbiA9IDQ4LCAuYmxlbiA9IDI1NiwgfSwKKwl7IC5rbGVuID0gNDgsIC5ibGVuID0gMTAyNCwgfSwKKwl7IC5rbGVuID0gNDgsIC5ibGVuID0gODE5MiwgfSwKKworCS8qIEVuZCBtYXJrZXIgKi8KKwl7ICAua2xlbiA9IDAsIC5ibGVuID0gMCwgfQorfTsKKwogc3RhdGljIHN0cnVjdCBjaXBoZXJfc3BlZWQgZGVzM19lZGVfc3BlZWRfdGVtcGxhdGVbXSA9IHsKIAl7IC5rbGVuID0gMjQsIC5ibGVuID0gMTYsIH0sCiAJeyAua2xlbiA9IDI0LCAuYmxlbiA9IDY0LCB9LApkaWZmIC0tZ2l0IGEvY3J5cHRvL3hjYmMuYyBiL2NyeXB0by94Y2JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0N2ViNgotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by94Y2JjLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpMjAwNiBVU0FHSS9XSURFIFByb2plY3QKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogQXV0aG9yOgorICogCUthenVub3JpIE1peWF6YXdhIDxtaXlhemF3YUBsaW51eC1pcHY2Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgdV9pbnQzMl90IGtzWzEyXSA9IHsweDAxMDEwMTAxLCAweDAxMDEwMTAxLCAweDAxMDEwMTAxLCAweDAxMDEwMTAxLAorCQkJICAgMHgwMjAyMDIwMiwgMHgwMjAyMDIwMiwgMHgwMjAyMDIwMiwgMHgwMjAyMDIwMiwKKwkJCSAgIDB4MDMwMzAzMDMsIDB4MDMwMzAzMDMsIDB4MDMwMzAzMDMsIDB4MDMwMzAzMDN9OworLyoKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgPHBhcmVudCB0Zm0+CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IGNyeXB0b194Y2JjX2N0eAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCBvZGRzIChibG9jayBzaXplKQorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCBwcmV2IChibG9jayBzaXplKQorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCBrZXkgKGJsb2NrIHNpemUpCisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IGNvbnN0cyAoYmxvY2sgc2l6ZSAqIDMpCisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0cnVjdCBjcnlwdG9feGNiY19jdHggeworCXN0cnVjdCBjcnlwdG9fdGZtICpjaGlsZDsKKwl1OCAqb2RkczsKKwl1OCAqcHJldjsKKwl1OCAqa2V5OworCXU4ICpjb25zdHM7CisJdm9pZCAoKnhvcikodTggKmEsIGNvbnN0IHU4ICpiLCB1bnNpZ25lZCBpbnQgYnMpOworCXVuc2lnbmVkIGludCBrZXlsZW47CisJdW5zaWduZWQgaW50IGxlbjsKK307CisKK3N0YXRpYyB2b2lkIHhvcl8xMjgodTggKmEsIGNvbnN0IHU4ICpiLCB1bnNpZ25lZCBpbnQgYnMpCit7CisJKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOworCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKKwkoKHUzMiAqKWEpWzJdIF49ICgodTMyICopYilbMl07CisJKCh1MzIgKilhKVszXSBePSAoKHUzMiAqKWIpWzNdOworfQorCitzdGF0aWMgaW50IF9jcnlwdG9feGNiY19kaWdlc3Rfc2V0a2V5KHN0cnVjdCBjcnlwdG9faGFzaCAqcGFyZW50LAorCQkJCSAgICAgIHN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCkKK3sKKwlpbnQgYnMgPSBjcnlwdG9faGFzaF9ibG9ja3NpemUocGFyZW50KTsKKwlpbnQgZXJyID0gMDsKKwl1OCBrZXkxW2JzXTsKKworCWlmICgoZXJyID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkoY3R4LT5jaGlsZCwgY3R4LT5rZXksIGN0eC0+a2V5bGVuKSkpCisJICAgIHJldHVybiBlcnI7CisKKwljdHgtPmNoaWxkLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQoY3R4LT5jaGlsZCwga2V5MSwKKwkJCWN0eC0+Y29uc3RzKTsKKworCXJldHVybiBjcnlwdG9fY2lwaGVyX3NldGtleShjdHgtPmNoaWxkLCBrZXkxLCBicyk7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3hjYmNfZGlnZXN0X3NldGtleShzdHJ1Y3QgY3J5cHRvX2hhc2ggKnBhcmVudCwKKwkJCQkgICAgIGNvbnN0IHU4ICppbmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlzdHJ1Y3QgY3J5cHRvX3hjYmNfY3R4ICpjdHggPSBjcnlwdG9faGFzaF9jdHhfYWxpZ25lZChwYXJlbnQpOworCisJaWYgKGtleWxlbiAhPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3R4LT5jaGlsZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJY3R4LT5rZXlsZW4gPSBrZXlsZW47CisJbWVtY3B5KGN0eC0+a2V5LCBpbmtleSwga2V5bGVuKTsKKwljdHgtPmNvbnN0cyA9ICh1OCopa3M7CisKKwlyZXR1cm4gX2NyeXB0b194Y2JjX2RpZ2VzdF9zZXRrZXkocGFyZW50LCBjdHgpOworfQorCitzdGF0aWMgaW50IGNyeXB0b194Y2JjX2RpZ2VzdF9pbml0KHN0cnVjdCBoYXNoX2Rlc2MgKnBkZXNjKQoreworCXN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCA9IGNyeXB0b19oYXNoX2N0eF9hbGlnbmVkKHBkZXNjLT50Zm0pOworCWludCBicyA9IGNyeXB0b19oYXNoX2Jsb2Nrc2l6ZShwZGVzYy0+dGZtKTsKKworCWN0eC0+bGVuID0gMDsKKwltZW1zZXQoY3R4LT5vZGRzLCAwLCBicyk7CisJbWVtc2V0KGN0eC0+cHJldiwgMCwgYnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgaGFzaF9kZXNjICpwZGVzYywKKwkJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdG9faGFzaCAqcGFyZW50ID0gcGRlc2MtPnRmbTsKKwlzdHJ1Y3QgY3J5cHRvX3hjYmNfY3R4ICpjdHggPSBjcnlwdG9faGFzaF9jdHhfYWxpZ25lZChwYXJlbnQpOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBjdHgtPmNoaWxkOworCWludCBicyA9IGNyeXB0b19oYXNoX2Jsb2Nrc2l6ZShwYXJlbnQpOworCXVuc2lnbmVkIGludCBpID0gMDsKKworCWRvIHsKKworCQlzdHJ1Y3QgcGFnZSAqcGcgPSBzZ1tpXS5wYWdlOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2dbaV0ub2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgc2xlbiA9IHNnW2ldLmxlbmd0aDsKKworCQl3aGlsZSAoc2xlbiA+IDApIHsKKwkJCXVuc2lnbmVkIGludCBsZW4gPSBtaW4oc2xlbiwgKCh1bnNpZ25lZCBpbnQpKFBBR0VfU0laRSkpIC0gb2Zmc2V0KTsKKwkJCWNoYXIgKnAgPSBjcnlwdG9fa21hcChwZywgMCkgKyBvZmZzZXQ7CisKKwkJCS8qIGNoZWNraW5nIHRoZSBkYXRhIGNhbiBmaWxsIHRoZSBibG9jayAqLworCQkJaWYgKChjdHgtPmxlbiArIGxlbikgPD0gYnMpIHsKKwkJCQltZW1jcHkoY3R4LT5vZGRzICsgY3R4LT5sZW4sIHAsIGxlbik7CisJCQkJY3R4LT5sZW4gKz0gbGVuOworCQkJCXNsZW4gLT0gbGVuOworCisJCQkJLyogY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlIHBhZ2UgKi8KKwkJCQlpZiAobGVuICsgb2Zmc2V0ID49IFBBR0VfU0laRSkgeworCQkJCQlvZmZzZXQgPSAwOworCQkJCQlwZysrOworCQkJCX0gZWxzZQorCQkJCQlvZmZzZXQgKz0gbGVuOworCisJCQkJY3J5cHRvX2t1bm1hcChwLCAwKTsKKwkJCQljcnlwdG9feWllbGQodGZtLT5jcnRfZmxhZ3MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBmaWxsaW5nIG9kZHMgd2l0aCBuZXcgZGF0YSBhbmQgZW5jcnlwdGluZyBpdCAqLworCQkJbWVtY3B5KGN0eC0+b2RkcyArIGN0eC0+bGVuLCBwLCBicyAtIGN0eC0+bGVuKTsKKwkJCWxlbiAtPSBicyAtIGN0eC0+bGVuOworCQkJcCArPSBicyAtIGN0eC0+bGVuOworCisJCQljdHgtPnhvcihjdHgtPnByZXYsIGN0eC0+b2RkcywgYnMpOworCQkJdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQodGZtLCBjdHgtPnByZXYsIGN0eC0+cHJldik7CisKKwkJCS8qIGNsZWFyaW5nIHRoZSBsZW5ndGggKi8KKwkJCWN0eC0+bGVuID0gMDsKKworCQkJLyogZW5jcnlwdGluZyB0aGUgcmVzdCBvZiBkYXRhICovCisJCQl3aGlsZSAobGVuID4gYnMpIHsKKwkJCQljdHgtPnhvcihjdHgtPnByZXYsIHAsIGJzKTsKKwkJCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIGN0eC0+cHJldiwgY3R4LT5wcmV2KTsKKwkJCQlwICs9IGJzOworCQkJCWxlbiAtPSBiczsKKwkJCX0KKworCQkJLyoga2VlcGluZyB0aGUgc3VycGx1cyBvZiBibG9ja3NpemUgKi8KKwkJCWlmIChsZW4pIHsKKwkJCQltZW1jcHkoY3R4LT5vZGRzLCBwLCBsZW4pOworCQkJCWN0eC0+bGVuID0gbGVuOworCQkJfQorCQkJY3J5cHRvX2t1bm1hcChwLCAwKTsKKwkJCWNyeXB0b195aWVsZCh0Zm0tPmNydF9mbGFncyk7CisJCQlzbGVuIC09IG1pbihzbGVuLCAoKHVuc2lnbmVkIGludCkoUEFHRV9TSVpFKSkgLSBvZmZzZXQpOworCQkJb2Zmc2V0ID0gMDsKKwkJCXBnKys7CisJCX0KKwkJbmJ5dGVzLT1zZ1tpXS5sZW5ndGg7CisJCWkrKzsKKwl9IHdoaWxlIChuYnl0ZXM+MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcnlwdG9feGNiY19kaWdlc3RfZmluYWwoc3RydWN0IGhhc2hfZGVzYyAqcGRlc2MsIHU4ICpvdXQpCit7CisJc3RydWN0IGNyeXB0b19oYXNoICpwYXJlbnQgPSBwZGVzYy0+dGZtOworCXN0cnVjdCBjcnlwdG9feGNiY19jdHggKmN0eCA9IGNyeXB0b19oYXNoX2N0eF9hbGlnbmVkKHBhcmVudCk7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IGN0eC0+Y2hpbGQ7CisJaW50IGJzID0gY3J5cHRvX2hhc2hfYmxvY2tzaXplKHBhcmVudCk7CisJaW50IGVyciA9IDA7CisKKwlpZiAoY3R4LT5sZW4gPT0gYnMpIHsKKwkJdTgga2V5Mltic107CisKKwkJaWYgKChlcnIgPSBjcnlwdG9fY2lwaGVyX3NldGtleSh0Zm0sIGN0eC0+a2V5LCBjdHgtPmtleWxlbikpICE9IDApCisJCQlyZXR1cm4gZXJyOworCisJCXRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0KHRmbSwga2V5MiwgKGNvbnN0IHU4KikoY3R4LT5jb25zdHMrYnMpKTsKKworCQljdHgtPnhvcihjdHgtPnByZXYsIGN0eC0+b2RkcywgYnMpOworCQljdHgtPnhvcihjdHgtPnByZXYsIGtleTIsIGJzKTsKKwkJX2NyeXB0b194Y2JjX2RpZ2VzdF9zZXRrZXkocGFyZW50LCBjdHgpOworCisJCXRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0KHRmbSwgb3V0LCBjdHgtPnByZXYpOworCX0gZWxzZSB7CisJCXU4IGtleTNbYnNdOworCQl1bnNpZ25lZCBpbnQgcmxlbjsKKwkJdTggKnAgPSBjdHgtPm9kZHMgKyBjdHgtPmxlbjsKKwkJKnAgPSAweDgwOworCQlwKys7CisKKwkJcmxlbiA9IGJzIC0gY3R4LT5sZW4gLTE7CisJCWlmIChybGVuKQorCQkJbWVtc2V0KHAsIDAsIHJsZW4pOworCisJCWlmICgoZXJyID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkodGZtLCBjdHgtPmtleSwgY3R4LT5rZXlsZW4pKSAhPSAwKQorCQkJcmV0dXJuIGVycjsKKworCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCh0Zm0sIGtleTMsIChjb25zdCB1OCopKGN0eC0+Y29uc3RzK2JzKjIpKTsKKworCQljdHgtPnhvcihjdHgtPnByZXYsIGN0eC0+b2RkcywgYnMpOworCQljdHgtPnhvcihjdHgtPnByZXYsIGtleTMsIGJzKTsKKworCQlfY3J5cHRvX3hjYmNfZGlnZXN0X3NldGtleShwYXJlbnQsIGN0eCk7CisKKwkJdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQodGZtLCBvdXQsIGN0eC0+cHJldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX3hjYmNfZGlnZXN0KHN0cnVjdCBoYXNoX2Rlc2MgKnBkZXNjLAorCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICpvdXQpCit7CisJY3J5cHRvX3hjYmNfZGlnZXN0X2luaXQocGRlc2MpOworCWNyeXB0b194Y2JjX2RpZ2VzdF91cGRhdGUocGRlc2MsIHNnLCBuYnl0ZXMpOworCXJldHVybiBjcnlwdG9feGNiY19kaWdlc3RfZmluYWwocGRlc2MsIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgeGNiY19pbml0X3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QgPSAodm9pZCAqKXRmbS0+X19jcnRfYWxnOworCXN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduID0gY3J5cHRvX2luc3RhbmNlX2N0eChpbnN0KTsKKwlzdHJ1Y3QgY3J5cHRvX3hjYmNfY3R4ICpjdHggPSBjcnlwdG9faGFzaF9jdHhfYWxpZ25lZChfX2NyeXB0b19oYXNoX2Nhc3QodGZtKSk7CisJaW50IGJzID0gY3J5cHRvX2hhc2hfYmxvY2tzaXplKF9fY3J5cHRvX2hhc2hfY2FzdCh0Zm0pKTsKKworCXRmbSA9IGNyeXB0b19zcGF3bl90Zm0oc3Bhd24pOworCWlmIChJU19FUlIodGZtKSkKKwkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKworCXN3aXRjaChicykgeworCWNhc2UgMTY6CisJCWN0eC0+eG9yID0geG9yXzEyODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3R4LT5jaGlsZCA9IGNyeXB0b19jaXBoZXJfY2FzdCh0Zm0pOworCWN0eC0+b2RkcyA9ICh1OCopKGN0eCsxKTsKKwljdHgtPnByZXYgPSBjdHgtPm9kZHMgKyBiczsKKwljdHgtPmtleSA9IGN0eC0+cHJldiArIGJzOworCisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgdm9pZCB4Y2JjX2V4aXRfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b194Y2JjX2N0eCAqY3R4ID0gY3J5cHRvX2hhc2hfY3R4X2FsaWduZWQoX19jcnlwdG9faGFzaF9jYXN0KHRmbSkpOworCWNyeXB0b19mcmVlX2NpcGhlcihjdHgtPmNoaWxkKTsKK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKnhjYmNfYWxsb2Modm9pZCAqcGFyYW0sIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCWFsZyA9IGNyeXB0b19nZXRfYXR0cl9hbGcocGFyYW0sIGxlbiwgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkJCQkgIENSWVBUT19BTEdfVFlQRV9IQVNIX01BU0sgfCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGFsZykpCisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYWxnKSk7CisKKwlzd2l0Y2goYWxnLT5jcmFfYmxvY2tzaXplKSB7CisJY2FzZSAxNjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKwl9CisKKwlpbnN0ID0gY3J5cHRvX2FsbG9jX2luc3RhbmNlKCJ4Y2JjIiwgYWxnKTsKKwlpZiAoSVNfRVJSKGluc3QpKQorCQlnb3RvIG91dF9wdXRfYWxnOworCisJaW5zdC0+YWxnLmNyYV9mbGFncyA9IENSWVBUT19BTEdfVFlQRV9IQVNIOworCWluc3QtPmFsZy5jcmFfcHJpb3JpdHkgPSBhbGctPmNyYV9wcmlvcml0eTsKKwlpbnN0LT5hbGcuY3JhX2Jsb2Nrc2l6ZSA9IGFsZy0+Y3JhX2Jsb2Nrc2l6ZTsKKwlpbnN0LT5hbGcuY3JhX2FsaWdubWFzayA9IGFsZy0+Y3JhX2FsaWdubWFzazsKKwlpbnN0LT5hbGcuY3JhX3R5cGUgPSAmY3J5cHRvX2hhc2hfdHlwZTsKKworCWluc3QtPmFsZy5jcmFfaGFzaC5kaWdlc3RzaXplID0KKwkJKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0spID09CisJCUNSWVBUT19BTEdfVFlQRV9IQVNIID8gYWxnLT5jcmFfaGFzaC5kaWdlc3RzaXplIDoKKwkJCQkgICAgICAgYWxnLT5jcmFfYmxvY2tzaXplOworCWluc3QtPmFsZy5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3J5cHRvX3hjYmNfY3R4KSArCisJCQkJQUxJR04oaW5zdC0+YWxnLmNyYV9ibG9ja3NpemUgKiAzLCBzaXplb2Yodm9pZCAqKSk7CisJaW5zdC0+YWxnLmNyYV9pbml0ID0geGNiY19pbml0X3RmbTsKKwlpbnN0LT5hbGcuY3JhX2V4aXQgPSB4Y2JjX2V4aXRfdGZtOworCisJaW5zdC0+YWxnLmNyYV9oYXNoLmluaXQgPSBjcnlwdG9feGNiY19kaWdlc3RfaW5pdDsKKwlpbnN0LT5hbGcuY3JhX2hhc2gudXBkYXRlID0gY3J5cHRvX3hjYmNfZGlnZXN0X3VwZGF0ZTsKKwlpbnN0LT5hbGcuY3JhX2hhc2guZmluYWwgPSBjcnlwdG9feGNiY19kaWdlc3RfZmluYWw7CisJaW5zdC0+YWxnLmNyYV9oYXNoLmRpZ2VzdCA9IGNyeXB0b194Y2JjX2RpZ2VzdDsKKwlpbnN0LT5hbGcuY3JhX2hhc2guc2V0a2V5ID0gY3J5cHRvX3hjYmNfZGlnZXN0X3NldGtleTsKKworb3V0X3B1dF9hbGc6CisJY3J5cHRvX21vZF9wdXQoYWxnKTsKKwlyZXR1cm4gaW5zdDsKK30KKworc3RhdGljIHZvaWQgeGNiY19mcmVlKHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QpCit7CisJY3J5cHRvX2Ryb3Bfc3Bhd24oY3J5cHRvX2luc3RhbmNlX2N0eChpbnN0KSk7CisJa2ZyZWUoaW5zdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlIGNyeXB0b194Y2JjX3RtcGwgPSB7CisJLm5hbWUgPSAieGNiYyIsCisJLmFsbG9jID0geGNiY19hbGxvYywKKwkuZnJlZSA9IHhjYmNfZnJlZSwKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjcnlwdG9feGNiY19tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfdGVtcGxhdGUoJmNyeXB0b194Y2JjX3RtcGwpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3J5cHRvX3hjYmNfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl90ZW1wbGF0ZSgmY3J5cHRvX3hjYmNfdG1wbCk7Cit9CisKK21vZHVsZV9pbml0KGNyeXB0b194Y2JjX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGNyeXB0b194Y2JjX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYQ0JDIGtleWVkIGhhc2ggYWxnb3JpdGhtIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL0tjb25maWcgYi9kcml2ZXJzL0tjb25maWcKaW5kZXggMjYzZTg2ZC4uZTdkYTlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9LY29uZmlnCisrKyBiL2RyaXZlcnMvS2NvbmZpZwpAQCAtMTQsNiArMTQsMTAgQEAKIAogc291cmNlICJkcml2ZXJzL2Jsb2NrL0tjb25maWciCiAKKyMgbWlzYyBiZWZvcmUgaWRlIC0gQkxLX0RFVl9TR0lJT0M0IGRlcGVuZHMgb24gU0dJX0lPQzQKKworc291cmNlICJkcml2ZXJzL21pc2MvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL2lkZS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc2NzaS9LY29uZmlnIgpAQCAtNTIsOCArNTYsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL21pc2MvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL21mZC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvS2NvbmZpZyIKQEAgLTYyLDYgKzY0LDggQEAKIAogc291cmNlICJzb3VuZC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvaGlkL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy91c2IvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL21tYy9LY29uZmlnIgpAQCAtNzYsNCArODAsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvZG1hL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9rdm0vS2NvbmZpZyIKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggNGFjMTRkYS4uMGRkOTZkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL01ha2VmaWxlCkBAIC00Myw2ICs0Myw3IEBACiBvYmotJChDT05GSUdfUENDQVJEKQkJKz0gcGNtY2lhLwogb2JqLSQoQ09ORklHX0RJTykJCSs9IGRpby8KIG9iai0kKENPTkZJR19TQlVTKQkJKz0gc2J1cy8KK29iai0kKENPTkZJR19LVk0pCQkrPSBrdm0vCiBvYmotJChDT05GSUdfWk9SUk8pCQkrPSB6b3Jyby8KIG9iai0kKENPTkZJR19NQUMpCQkrPSBtYWNpbnRvc2gvCiBvYmotJChDT05GSUdfQVRBX09WRVJfRVRIKQkrPSBibG9jay9hb2UvCkBAIC03NywzICs3OCw1IEBACiBvYmotJChDT05GSUdfU1VQRVJIKQkJKz0gc2gvCiBvYmotJChDT05GSUdfR0VORVJJQ19USU1FKQkrPSBjbG9ja3NvdXJjZS8KIG9iai0kKENPTkZJR19ETUFfRU5HSU5FKQkrPSBkbWEvCitvYmotJChDT05GSUdfSElEKQkJKz0gaGlkLworb2JqLSQoQ09ORklHX1BQQ19QUzMpCQkrPSBwczMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Fjb3JuL2Jsb2NrL2ZkMTc3Mi5jIGIvZHJpdmVycy9hY29ybi9ibG9jay9mZDE3NzIuYwppbmRleCAwNDg1NDIzLi42NzRiZjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Fjb3JuL2Jsb2NrL2ZkMTc3Mi5jCisrKyBiL2RyaXZlcnMvYWNvcm4vYmxvY2svZmQxNzcyLmMKQEAgLTE1NDksMTIgKzE1NDksMTIgQEAKICNpZmRlZiBUUkFDS0JVRkZFUgogCUJ1ZmZlckRyaXZlID0gQnVmZmVyU2lkZSA9IEJ1ZmZlclRyYWNrID0gLTE7CiAJLyogQXRhcmkgdXNlcyA1MTIgLSBJIHdhbnQgdG8gZXZlbnR1YWxseSBjb3BlIHdpdGggMUsgc2VjdG9ycyAqLwotCURNQUJ1ZmZlciA9IChjaGFyICopa21hbGxvYygoRkQxNzcyX01BWF9TRUNUT1JTKzEpKjUxMixHRlBfS0VSTkVMKTsKKwlETUFCdWZmZXIgPSBrbWFsbG9jKChGRDE3NzJfTUFYX1NFQ1RPUlMrMSkqNTEyLEdGUF9LRVJORUwpOwogCVRyYWNrQnVmZmVyID0gRE1BQnVmZmVyICsgNTEyOwogI2Vsc2UKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBETUFidWZmZXIgLSBvbiB0aGUgQXRhcmkgdGhpcyB0YWtlcyBpdAogCSAgIG91dCBvZiBzb21lIHNwZWNpYWwgbWVtb3J5Li4uICovCi0JRE1BQnVmZmVyID0gKGNoYXIgKikga21hbGxvYygyMDQ4KTsJLyogQ29wZXMgd2l0aCBwcmV0dHkgbGFyZ2Ugc2VjdG9ycyAqLworCURNQUJ1ZmZlciA9IGttYWxsb2MoMjA0OCk7CS8qIENvcGVzIHdpdGggcHJldHR5IGxhcmdlIHNlY3RvcnMgKi8KICNlbmRpZgogCWVyciA9IC1FTk9NRU07CiAJaWYgKCFETUFidWZmZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Fjb3JuL2NoYXIvaTJjLmMgYi9kcml2ZXJzL2Fjb3JuL2NoYXIvaTJjLmMKaW5kZXggYmRiOWM4Yi4uOWU1ODRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY29ybi9jaGFyL2kyYy5jCisrKyBiL2RyaXZlcnMvYWNvcm4vY2hhci9pMmMuYwpAQCAtMzYwLDcgKzM2MCw3IEBACiAJaWYgKHJldCA+PSAwKXsKIAkJcmV0ID0gbWlzY19yZWdpc3RlcigmcnRjX2Rldik7CiAJCWlmKHJldCA8IDApCi0JCQlpMmNfYml0X2RlbF9idXMoJmlvY19vcHMpOworCQkJaTJjX2RlbF9hZGFwdGVyKCZpb2Nfb3BzKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwppbmRleCAwZjlkNGJlLi5iMDg5N2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwpAQCAtOTcsNiArOTcsNyBAQAogCiBjb25maWcgQUNQSV9CVVRUT04KIAl0cmlzdGF0ZSAiQnV0dG9uIgorCWRlcGVuZHMgb24gSU5QVVQKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIGRyaXZlciBoYW5kbGVzIGV2ZW50cyBvbiB0aGUgcG93ZXIsIHNsZWVwIGFuZCBsaWQgYnV0dG9ucy4KQEAgLTE3Miw2ICsxNzMsNyBAQAogY29uZmlnIEFDUElfQVNVUwogICAgICAgICB0cmlzdGF0ZSAiQVNVUy9NZWRpb24gTGFwdG9wIEV4dHJhcyIKIAlkZXBlbmRzIG9uIFg4NgorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAgICAgICAgIC0tLWhlbHAtLS0KICAgICAgICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciBleHRyYSBmZWF0dXJlcyBvZiBBQ1BJLWNvbXBhdGlibGUKICAgICAgICAgICBBU1VTIGxhcHRvcHMuIEFzIHNvbWUgb2YgTWVkaW9uIGxhcHRvcHMgYXJlIG1hZGUgYnkgQVNVUywgaXQgbWF5IGFsc28KQEAgLTIwMCw2ICsyMDIsNyBAQAogY29uZmlnIEFDUElfSUJNCiAJdHJpc3RhdGUgIklCTSBUaGlua1BhZCBMYXB0b3AgRXh0cmFzIgogCWRlcGVuZHMgb24gWDg2CisJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgTGludXggQUNQSSBkcml2ZXIgZm9yIHRoZSBJQk0gVGhpbmtQYWQgbGFwdG9wcy4gSXQgYWRkcwogCSAgc3VwcG9ydCBmb3IgRm4tRngga2V5IGNvbWJpbmF0aW9ucywgQmx1ZXRvb3RoIGNvbnRyb2wsIHZpZGVvCkBAIC0yMjIsOSArMjI1LDIxIEBACiAKIAkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBOIGhlcmUuCiAKK2NvbmZpZyBBQ1BJX0lCTV9CQVkKKwlib29sICJMZWdhY3kgUmVtb3ZhYmxlIEJheSBTdXBwb3J0IgorCWRlcGVuZHMgb24gQUNQSV9JQk0KKwlkZXBlbmRzIG9uIEFDUElfQkFZPW4KKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBBbGxvd3MgdGhlIGlibV9hY3BpIGRyaXZlciB0byBoYW5kbGUgcmVtb3ZhYmxlIGJheXMuCisJICBUaGlzIHN1cHBvcnQgaXMgb2Jzb2xldGVkIGJ5IENPTkZJR19BQ1BJX0JBWS4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IE4gaGVyZS4KKwogY29uZmlnIEFDUElfVE9TSElCQQogCXRyaXN0YXRlICJUb3NoaWJhIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBYODYKKwlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgYWNjZXNzIHRvIGNlcnRhaW4gc3lzdGVtIHNldHRpbmdzCiAJICBvbiAibGVnYWN5IGZyZWUiIFRvc2hpYmEgbGFwdG9wcy4gIFRoZXNlIGxhcHRvcHMgY2FuIGJlIHJlY29nbml6ZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwppbmRleCAxMzY4NzgzLi4xNTAxMTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCkBAIC04NSw2ICs4NSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCByZXNfbGlzdDsKIH07CiAKK3N0YXRpYyBpbnQgYWNwaV9ob3RtZW1faW5pdGlhbGl6ZWQ7CisKIHN0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9tZW1vcnlfZ2V0X3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCkKIHsKQEAgLTQxNCw3ICs0MTYsNyBAQAogCS8qIFNldCB0aGUgZGV2aWNlIHN0YXRlICovCiAJbWVtX2RldmljZS0+c3RhdGUgPSBNRU1PUllfUE9XRVJfT05fU1RBVEU7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlcyBcbiIsIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFxuIiwgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC00MzgsNiArNDQwLDE1IEBACiAJc3RydWN0IGFjcGlfbWVtb3J5X2RldmljZSAqbWVtX2RldmljZTsKIAlpbnQgcmVzdWx0ID0gMDsKIAorCS8qCisJICogRWFybHkgYm9vdCBjb2RlIGhhcyByZWNvZ25pemVkIG1lbW9yeSBhcmVhIGJ5IEVGSS9FODIwLgorCSAqIElmIERTRFQgc2hvd3MgdGhlc2UgbWVtb3J5IGRldmljZXMgb24gYm9vdCwgaG90cGx1ZyBpcyBub3QgbmVjZXNzYXJ5CisJICogZm9yIHRoZW0uIFNvLCBpdCBqdXN0IHJldHVybnMgdW50aWwgY29tcGxldGlvbiBvZiB0aGlzIGRyaXZlcidzCisJICogc3RhcnQgdXAuCisJICovCisJaWYgKCFhY3BpX2hvdG1lbV9pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisKIAltZW1fZGV2aWNlID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCiAJaWYgKCFhY3BpX21lbW9yeV9jaGVja19kZXZpY2UobWVtX2RldmljZSkpIHsKQEAgLTUzNyw2ICs1NDgsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlhY3BpX2hvdG1lbV9pbml0aWFsaXplZCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwppbmRleCBmN2RiOGVhLi5iZmFlM2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xMzgsNiArMTM5LDcgQEAKIAkJUzJ4LAkJLy9TMjAwIChKMSByZXBvcnRlZCksIFZpY3RvciBNUC1YUDcyMTAKIAkJVzFOLAkJLy9XMTAwME4KIAkJVzVBLAkJLy9XNUEKKwkJVzNWLCAgICAgICAgICAgIC8vVzMwMzBWCiAJCXh4TiwJCS8vTTI0MDBOLCBNMzcwME4sIE01MjAwTiwgTTY4MDBOLCBTMTMwME4sIFM1MjAwTgogCQkvLyhDZW50cmlubykKIAkJRU5EX01PREVMCkBAIC0zNzYsNiArMzc4LDE3IEBACiAJIC5kaXNwbGF5X2dldCA9ICJcXEFEVkcifSwKIAogCXsKKwkgLm5hbWUgPSAiVzNWIiwKKwkgLm10X21sZWQgPSAiTUxFRCIsCisJIC5tdF93bGVkID0gIldMRUQiLAorCSAubXRfbGNkX3N3aXRjaCA9IHh4Tl9QUkVGSVggIl9RMTAiLAorCSAubGNkX3N0YXR1cyA9ICJcXEJLTFQiLAorCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCisJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKKwkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAorCSAuZGlzcGxheV9nZXQgPSAiXFxJTkZCIn0sCisKKyAgICAgICB7CiAJIC5uYW1lID0gInh4TiIsCiAJIC5tdF9tbGVkID0gIk1MRUQiLAogLyogV0xFRCBwcmVzZW50LCBidXQgbm90IGNvbnRyb2xsZWQgYnkgQUNQSSAqLwpAQCAtMzkwLDYgKzQwMyw4IEBACiAvKiBwcm9jZGlyIHdlIHVzZSAqLwogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYXN1c19wcm9jX2RpcjsKIAorc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICphc3VzX2JhY2tsaWdodF9kZXZpY2U7CisKIC8qCiAgKiBUaGlzIGhlYWRlciBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbGxvdyBwcm9wZXIgY29uZmlndXJhdGlvbiBnaXZlbiBtb2RlbCwKICAqIHJldmlzaW9uIG51bWJlciAsIC4uLiB0aGlzIGluZm8gY2Fubm90IGdvIGluIHN0cnVjdCBhc3VzX2hvdGsgYmVjYXVzZSBpdCBpcwpAQCAtNTU1LDExICs1NzAsMTEgQEAKIHdyaXRlX2xlZChjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKIAkgIGNoYXIgKmxlZG5hbWUsIGludCBsZWRtYXNrLCBpbnQgaW52ZXJ0KQogewotCWludCB2YWx1ZTsKKwlpbnQgcnYsIHZhbHVlOwogCWludCBsZWRfb3V0ID0gMDsKIAotCWNvdW50ID0gcGFyc2VfYXJnKGJ1ZmZlciwgY291bnQsICZ2YWx1ZSk7Ci0JaWYgKGNvdW50ID4gMCkKKwlydiA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOworCWlmIChydiA+IDApCiAJCWxlZF9vdXQgPSB2YWx1ZSA/IDEgOiAwOwogCiAJaG90ay0+c3RhdHVzID0KQEAgLTU3Miw3ICs1ODcsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IExFRCAoJXMpIHdyaXRlIGZhaWxlZFxuIiwKIAkJICAgICAgIGxlZG5hbWUpOwogCi0JcmV0dXJuIGNvdW50OworCXJldHVybiBydjsKIH0KIAogLyoKQEAgLTYwNywyMCArNjIyLDE4IEBACiBwcm9jX3dyaXRlX2xlZGQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAogCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewotCWludCB2YWx1ZTsKKwlpbnQgcnYsIHZhbHVlOwogCi0JY291bnQgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKLQlpZiAoY291bnQgPiAwKSB7CisJcnYgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKKwlpZiAocnYgPiAwKSB7CiAJCWlmICghd3JpdGVfYWNwaV9pbnQKIAkJICAgIChob3RrLT5oYW5kbGUsIGhvdGstPm1ldGhvZHMtPm10X2xlZGQsIHZhbHVlLCBOVUxMKSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiQXN1cyBBQ1BJOiBMRUQgZGlzcGxheSB3cml0ZSBmYWlsZWRcbiIpOwogCQllbHNlCiAJCQlob3RrLT5sZWRkX3N0YXR1cyA9ICh1MzIpIHZhbHVlOwotCX0gZWxzZSBpZiAoY291bnQgPCAwKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgdXNlciBpbnB1dFxuIik7Ci0KLQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiBydjsKIH0KIAogLyoKQEAgLTc2MSwxNSArNzc0LDE1IEBACiBwcm9jX3dyaXRlX2xjZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCiAJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IHZhbHVlOworCWludCBydiwgdmFsdWU7CiAKLQljb3VudCA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOwotCWlmIChjb3VudCA+IDApCisJcnYgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKKwlpZiAocnYgPiAwKQogCQlzZXRfbGNkX3N0YXRlKHZhbHVlKTsKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgaW50IHJlYWRfYnJpZ2h0bmVzcyh2b2lkKQorc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewogCWludCB2YWx1ZTsKIApAQCAtNzkxLDkgKzgwNCwxMCBAQAogLyoKICAqIENoYW5nZSB0aGUgYnJpZ2h0bmVzcyBsZXZlbAogICovCi1zdGF0aWMgdm9pZCBzZXRfYnJpZ2h0bmVzcyhpbnQgdmFsdWUpCitzdGF0aWMgaW50IHNldF9icmlnaHRuZXNzKGludCB2YWx1ZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCWludCByZXQgPSAwOwogCiAJLyogU1BMViBsYXB0b3AgKi8KIAlpZiAoaG90ay0+bWV0aG9kcy0+YnJpZ2h0bmVzc19zZXQpIHsKQEAgLTgwMSwxMSArODE1LDEyIEBACiAJCQkJICAgIHZhbHVlLCBOVUxMKSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiQXN1cyBBQ1BJOiBFcnJvciBjaGFuZ2luZyBicmlnaHRuZXNzXG4iKTsKLQkJcmV0dXJuOworCQkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogTm8gU1BMViBtZXRob2QgaWYgd2UgYXJlIGhlcmUsIGFjdCBhcyBhcHByb3ByaWF0ZSAqLwotCXZhbHVlIC09IHJlYWRfYnJpZ2h0bmVzcygpOworCXZhbHVlIC09IHJlYWRfYnJpZ2h0bmVzcyhOVUxMKTsKIAl3aGlsZSAodmFsdWUgIT0gMCkgewogCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCAodmFsdWUgPiAwKSA/CiAJCQkJCSAgICAgIGhvdGstPm1ldGhvZHMtPmJyaWdodG5lc3NfdXAgOgpAQCAtODE1LDMzICs4MzAsMzcgQEAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICJBc3VzIEFDUEk6IEVycm9yIGNoYW5naW5nIGJyaWdodG5lc3NcbiIpOworCQkJcmV0ID0gLUVJTzsKIAl9Ci0JcmV0dXJuOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2JyaWdodG5lc3Nfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gc2V0X2JyaWdodG5lc3MoYmQtPnByb3BzLT5icmlnaHRuZXNzKTsKIH0KIAogc3RhdGljIGludAogcHJvY19yZWFkX2JybihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKIAkgICAgICB2b2lkICpkYXRhKQogewotCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgcmVhZF9icmlnaHRuZXNzKCkpOworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgcmVhZF9icmlnaHRuZXNzKE5VTEwpKTsKIH0KIAogc3RhdGljIGludAogcHJvY193cml0ZV9icm4oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAogCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewotCWludCB2YWx1ZTsKKwlpbnQgcnYsIHZhbHVlOwogCi0JY291bnQgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKLQlpZiAoY291bnQgPiAwKSB7CisJcnYgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKKwlpZiAocnYgPiAwKSB7CiAJCXZhbHVlID0gKDAgPCB2YWx1ZSkgPyAoKDE1IDwgdmFsdWUpID8gMTUgOiB2YWx1ZSkgOiAwOwogCQkvKiAwIDw9IHZhbHVlIDw9IDE1ICovCiAJCXNldF9icmlnaHRuZXNzKHZhbHVlKTsKLQl9IGVsc2UgaWYgKGNvdW50IDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgdXNlciBpbnB1dFxuIik7CiAJfQotCi0JcmV0dXJuIGNvdW50OworCXJldHVybiBydjsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2Rpc3BsYXkoaW50IHZhbHVlKQpAQCAtODgwLDE1ICs4OTksMTIgQEAKIHByb2Nfd3JpdGVfZGlzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCiAJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IHZhbHVlOworCWludCBydiwgdmFsdWU7CiAKLQljb3VudCA9IHBhcnNlX2FyZyhidWZmZXIsIGNvdW50LCAmdmFsdWUpOwotCWlmIChjb3VudCA+IDApCisJcnYgPSBwYXJzZV9hcmcoYnVmZmVyLCBjb3VudCwgJnZhbHVlKTsKKwlpZiAocnYgPiAwKQogCQlzZXRfZGlzcGxheSh2YWx1ZSk7Ci0JZWxzZSBpZiAoY291bnQgPCAwKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBc3VzIEFDUEk6IEVycm9yIHJlYWRpbmcgdXNlciBpbnB1dFxuIik7Ci0KLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJ2OwogfQogCiB0eXBlZGVmIGludCAocHJvY19yZWFkZnVuYykgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCkBAIC0xMDk3LDYgKzExMTMsOCBAQAogCQlyZXR1cm4gQTRHOwogCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJXMU4iLCAzKSA9PSAwKQogCQlyZXR1cm4gVzFOOworCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJXM1YiLCAzKSA9PSAwKQorCQlyZXR1cm4gVzNWOwogCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJXNUEiLCAzKSA9PSAwKQogCQlyZXR1cm4gVzVBOwogCWVsc2UKQEAgLTEyMDAsOSArMTIxOCwxMCBAQAogCQlob3RrLT5tZXRob2RzLT5tdF93bGVkID0gTlVMTDsKIAkvKiBMNUQncyBXTEVEIGlzIG5vdCBjb250cm9sbGVkIGJ5IEFDUEkgKi8KIAllbHNlIGlmIChzdHJuY21wKHN0cmluZywgIk0yTiIsIDMpID09IDAgfHwKKwkJIHN0cm5jbXAoc3RyaW5nLCAiVzNWIiwgMykgPT0gMCB8fAogCQkgc3RybmNtcChzdHJpbmcsICJTMU4iLCAzKSA9PSAwKQogCQlob3RrLT5tZXRob2RzLT5tdF93bGVkID0gIldMRUQiOwotCS8qIE0yTiBhbmQgUzFOIGhhdmUgYSB1c2FibGUgV0xFRCAqLworCS8qIE0yTiwgUzFOIGFuZCBXM1YgaGF2ZSBhIHVzYWJsZSBXTEVEICovCiAJZWxzZSBpZiAoYXN1c19pbmZvKSB7CiAJCWlmIChzdHJuY21wKGFzdXNfaW5mby0+b2VtX3RhYmxlX2lkLCAiTDEiLCAyKSA9PSAwKQogCQkJaG90ay0+bWV0aG9kcy0+bWxlZF9zdGF0dXMgPSBOVUxMOwpAQCAtMTMyNSw2ICsxMzQ0LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgYXN1c19iYWNrbGlnaHRfZGF0YSA9IHsKKyAgICAgICAgLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCisgICAgICAgIC5nZXRfYnJpZ2h0bmVzcyA9IHJlYWRfYnJpZ2h0bmVzcywKKyAgICAgICAgLnVwZGF0ZV9zdGF0dXMgID0gc2V0X2JyaWdodG5lc3Nfc3RhdHVzLAorICAgICAgICAubWF4X2JyaWdodG5lc3MgPSAxNSwKK307CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhc3VzX2FjcGlfZXhpdCh2b2lkKQoreworCWlmIChhc3VzX2JhY2tsaWdodF9kZXZpY2UpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihhc3VzX2JhY2tsaWdodF9kZXZpY2UpOworCisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFzdXNfaG90a19kcml2ZXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfQVNVUywgYWNwaV9yb290X2Rpcik7CisKKwlrZnJlZShhc3VzX2luZm8pOworCisJcmV0dXJuOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBhc3VzX2FjcGlfaW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7CkBAIC0xMzYyLDE4ICsxNDAxLDE2IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCisJYXN1c19iYWNrbGlnaHRfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigiYXN1cyIsIE5VTEwsCisJCQkJCQkJICAmYXN1c19iYWNrbGlnaHRfZGF0YSk7CisgICAgICAgIGlmIChJU19FUlIoYXN1c19iYWNrbGlnaHRfZGV2aWNlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciBhc3VzIGJhY2tsaWdodCBkZXZpY2VcbiIpOworCQlhc3VzX2JhY2tsaWdodF9kZXZpY2UgPSBOVUxMOworCQlhc3VzX2FjcGlfZXhpdCgpOworCX0KKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXN1c19hY3BpX2V4aXQodm9pZCkKLXsKLQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19BU1VTLCBhY3BpX3Jvb3RfZGlyKTsKLQotCWtmcmVlKGFzdXNfaW5mbyk7Ci0KLQlyZXR1cm47Ci19Ci0KIG1vZHVsZV9pbml0KGFzdXNfYWNwaV9pbml0KTsKIG1vZHVsZV9leGl0KGFzdXNfYWNwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCmluZGV4IGFkYjBkMjcuLmY0N2M3OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwpAQCAtNjQsNiArNjQsNyBAQAogCiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0dXMpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYmF0dGVyeV9kcml2ZXIgPSB7CiAJLm5hbWUgPSBBQ1BJX0JBVFRFUllfRFJJVkVSX05BTUUsCkBAIC03MSw2ICs3Miw3IEBACiAJLmlkcyA9IEFDUElfQkFUVEVSWV9ISUQsCiAJLm9wcyA9IHsKIAkJLmFkZCA9IGFjcGlfYmF0dGVyeV9hZGQsCisJCS5yZXN1bWUgPSBhY3BpX2JhdHRlcnlfcmVzdW1lLAogCQkucmVtb3ZlID0gYWNwaV9iYXR0ZXJ5X3JlbW92ZSwKIAkJfSwKIH07CkBAIC03NTMsNiArNzU1LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHRoaXMgaXMgbmVlZGVkIHRvIGxlYXJuIGFib3V0IGNoYW5nZXMgbWFkZSBpbiBzdXNwZW5kZWQgc3RhdGUgKi8KK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnk7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliYXR0ZXJ5ID0gZGV2aWNlLT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gYWNwaV9iYXR0ZXJ5X2NoZWNrKGJhdHRlcnkpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX2JhdHRlcnlfaW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKaW5kZXggZmU5MTRlYi4uYWM4NjA1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIApAQCAtNjIsNyArNjMsNyBAQAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JVVFRPTl9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoImFjcGlfYnV0dG9uIikKIAotICAgIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKIE1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0JVVFRPTl9EUklWRVJfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTc4LDEyICs3OSwxNCBAQAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX2J1dHRvbl9hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX2J1dHRvbl9yZW1vdmUsCi0JCX0sCisJfSwKIH07CiAKIHN0cnVjdCBhY3BpX2J1dHRvbiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CS8qIEZpeGVkIGJ1dHRvbiBrbHVkZ2UgKi8KLQl1OCB0eXBlOworCXVuc2lnbmVkIGludCB0eXBlOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCWNoYXIgcGh5c1szMl07CQkJLyogZm9yIGlucHV0IGRldmljZSAqLwogCXVuc2lnbmVkIGxvbmcgcHVzaGVkOwogfTsKIApAQCAtMTExLDcgKzExNCw2IEBACiB7CiAJc3RydWN0IGFjcGlfYnV0dG9uICpidXR0b24gPSBzZXEtPnByaXZhdGU7CiAKLQogCWlmICghYnV0dG9uIHx8ICFidXR0b24tPmRldmljZSkKIAkJcmV0dXJuIDA7CiAKQEAgLTEzMiwxOCArMTM0LDEzIEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAKLQogCWlmICghYnV0dG9uIHx8ICFidXR0b24tPmRldmljZSkKIAkJcmV0dXJuIDA7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoYnV0dG9uLT5kZXZpY2UtPmhhbmRsZSwgIl9MSUQiLCBOVUxMLCAmc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlzZXFfcHJpbnRmKHNlcSwgInN0YXRlOiAgICAgIHVuc3VwcG9ydGVkXG4iKTsKLQl9IGVsc2UgewotCQlzZXFfcHJpbnRmKHNlcSwgInN0YXRlOiAgICAgICVzXG4iLAotCQkJICAgKHN0YXRlID8gIm9wZW4iIDogImNsb3NlZCIpKTsKLQl9Ci0KKwlzZXFfcHJpbnRmKHNlcSwgInN0YXRlOiAgICAgICVzXG4iLAorCQkgICBBQ1BJX0ZBSUxVUkUoc3RhdHVzKSA/ICJ1bnN1cHBvcnRlZCIgOgorCQkJKHN0YXRlID8gIm9wZW4iIDogImNsb3NlZCIpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU5LDggKzE1Niw3IEBACiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IE5VTEw7Ci0KKwlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbjsKIAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI4LDEwICsyMjQsOCBAQAogCiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX3JlbW92ZV9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IE5VTEw7CisJc3RydWN0IGFjcGlfYnV0dG9uICpidXR0b24gPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKLQotCWJ1dHRvbiA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJaWYgKGJ1dHRvbi0+dHlwZSA9PSBBQ1BJX0JVVFRPTl9UWVBFX0xJRCkKIAkJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX0ZJTEVfU1RBVEUsCkBAIC0yNTQsMTMgKzI0OCwzMyBAQAogc3RhdGljIHZvaWQgYWNwaV9idXR0b25fbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gZGF0YTsKLQorCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogCiAJaWYgKCFidXR0b24gfHwgIWJ1dHRvbi0+ZGV2aWNlKQogCQlyZXR1cm47CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBBQ1BJX0JVVFRPTl9OT1RJRllfU1RBVFVTOgorCQlpbnB1dCA9IGJ1dHRvbi0+aW5wdXQ7CisKKwkJaWYgKGJ1dHRvbi0+dHlwZSA9PSBBQ1BJX0JVVFRPTl9UWVBFX0xJRCkgeworCQkJc3RydWN0IGFjcGlfaGFuZGxlICpoYW5kbGUgPSBidXR0b24tPmRldmljZS0+aGFuZGxlOworCQkJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKworCQkJaWYgKCFBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9MSUQiLAorCQkJCQkJCQlOVUxMLCAmc3RhdGUpKSkKKwkJCQlpbnB1dF9yZXBvcnRfc3dpdGNoKGlucHV0LCBTV19MSUQsICFzdGF0ZSk7CisKKwkJfSBlbHNlIHsKKwkJCWludCBrZXljb2RlID0gdGVzdF9iaXQoS0VZX1NMRUVQLCBpbnB1dC0+a2V5Yml0KSA/CisJCQkJCQlLRVlfU0xFRVAgOiBLRVlfUE9XRVI7CisKKwkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDEpOworCQkJaW5wdXRfc3luYyhpbnB1dCk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBrZXljb2RlLCAwKTsKKwkJfQorCQlpbnB1dF9zeW5jKGlucHV0KTsKKwogCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChidXR0b24tPmRldmljZSwgZXZlbnQsCiAJCQkJCSsrYnV0dG9uLT5wdXNoZWQpOwogCQlicmVhazsKQEAgLTI3Nyw3ICsyOTEsNiBAQAogewogCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gZGF0YTsKIAotCiAJaWYgKCFidXR0b24pCiAJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOwogCkBAIC0yODYsMjQgKzI5OSw3NSBAQAogCXJldHVybiBBRV9PSzsKIH0KIAorc3RhdGljIGludCBhY3BpX2J1dHRvbl9pbnN0YWxsX25vdGlmeV9oYW5kbGVycyhzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzd2l0Y2ggKGJ1dHRvbi0+dHlwZSkgeworCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY6CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiwKKwkJCQkJCSAgICAgYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkLAorCQkJCQkJICAgICBidXR0b24pOworCQlicmVhazsKKwljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgorCQlzdGF0dXMgPQorCQkgICAgYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9TTEVFUF9CVVRUT04sCisJCQkJCQkgICAgIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCwKKwkJCQkJCSAgICAgYnV0dG9uKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGJ1dHRvbi0+ZGV2aWNlLT5oYW5kbGUsCisJCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJCSAgICAgYWNwaV9idXR0b25fbm90aWZ5LAorCQkJCQkJICAgICBidXR0b24pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gQUNQSV9GQUlMVVJFKHN0YXR1cykgPyAtRU5PREVWIDogMDsKK30KKworc3RhdGljIHZvaWQgYWNwaV9idXR0b25fcmVtb3ZlX25vdGlmeV9oYW5kbGVycyhzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbikKK3sKKwlzd2l0Y2ggKGJ1dHRvbi0+dHlwZSkgeworCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY6CisJCWFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04sCisJCQkJCQlhY3BpX2J1dHRvbl9ub3RpZnlfZml4ZWQpOworCQlicmVhazsKKwljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgorCQlhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfU0xFRVBfQlVUVE9OLAorCQkJCQkJYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoYnV0dG9uLT5kZXZpY2UtPmhhbmRsZSwKKwkJCQkJICAgQUNQSV9ERVZJQ0VfTk9USUZZLAorCQkJCQkgICBhY3BpX2J1dHRvbl9ub3RpZnkpOworCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYWNwaV9idXR0b25fYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludCByZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gTlVMTDsKLQorCWludCBlcnJvcjsKKwlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWJ1dHRvbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2J1dHRvbiksIEdGUF9LRVJORUwpOworCWJ1dHRvbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2J1dHRvbiksIEdGUF9LRVJORUwpOwogCWlmICghYnV0dG9uKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoYnV0dG9uLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfYnV0dG9uKSk7CiAKIAlidXR0b24tPmRldmljZSA9IGRldmljZTsKIAlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBidXR0b247CiAKKwlidXR0b24tPmlucHV0ID0gaW5wdXQgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9idXR0b247CisJfQorCiAJLyoKIAkgKiBEZXRlcm1pbmUgdGhlIGJ1dHRvbiB0eXBlICh2aWEgaGlkKSwgYXMgZml4ZWQtZmVhdHVyZSBidXR0b25zCiAJICogbmVlZCB0byBiZSBoYW5kbGVkIGEgYml0IGRpZmZlcmVudGx5IHRoYW4gZ2VuZXJpYy1zcGFjZS4KQEAgLTMzOCwzOSArNDAyLDQ4IEBACiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5zdXBwb3J0ZWQgaGlkIFslc11cbiIsCiAJCQkgICAgYWNwaV9kZXZpY2VfaGlkKGRldmljZSkpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGVuZDsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcmVlX2lucHV0OwogCX0KIAotCXJlc3VsdCA9IGFjcGlfYnV0dG9uX2FkZF9mcyhkZXZpY2UpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZW5kOworCWVycm9yID0gYWNwaV9idXR0b25fYWRkX2ZzKGRldmljZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX2lucHV0OworCisJZXJyb3IgPSBhY3BpX2J1dHRvbl9pbnN0YWxsX25vdGlmeV9oYW5kbGVycyhidXR0b24pOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfcmVtb3ZlX2ZzOworCisJc25wcmludGYoYnV0dG9uLT5waHlzLCBzaXplb2YoYnV0dG9uLT5waHlzKSwKKwkJICIlcy9idXR0b24vaW5wdXQwIiwgYWNwaV9kZXZpY2VfaGlkKGRldmljZSkpOworCisJaW5wdXQtPm5hbWUgPSBhY3BpX2RldmljZV9uYW1lKGRldmljZSk7CisJaW5wdXQtPnBoeXMgPSBidXR0b24tPnBoeXM7CisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dC0+aWQucHJvZHVjdCA9IGJ1dHRvbi0+dHlwZTsKIAogCXN3aXRjaCAoYnV0dG9uLT50eXBlKSB7CisJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSOgogCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY6Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiwKLQkJCQkJCSAgICAgYWNwaV9idXR0b25fbm90aWZ5X2ZpeGVkLAotCQkJCQkJICAgICBidXR0b24pOworCQlpbnB1dC0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwkJc2V0X2JpdChLRVlfUE9XRVIsIGlucHV0LT5rZXliaXQpOwogCQlicmVhazsKKworCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUDoKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfU0xFRVBGOgotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9TTEVFUF9CVVRUT04sCi0JCQkJCQkgICAgIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCwKLQkJCQkJCSAgICAgYnV0dG9uKTsKKwkJaW5wdXQtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJCXNldF9iaXQoS0VZX1NMRUVQLCBpbnB1dC0+a2V5Yml0KTsKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGRldmljZS0+aGFuZGxlLAotCQkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCQkJCQkgICAgIGFjcGlfYnV0dG9uX25vdGlmeSwKLQkJCQkJCSAgICAgYnV0dG9uKTsKKworCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9MSUQ6CisJCWlucHV0LT5ldmJpdFswXSA9IEJJVChFVl9TVyk7CisJCXNldF9iaXQoU1dfTElELCBpbnB1dC0+c3diaXQpOwogCQlicmVhazsKIAl9CiAKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJZ290byBlbmQ7Ci0JfQorCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX3JlbW92ZV9oYW5kbGVyczsKIAogCWlmIChkZXZpY2UtPndha2V1cC5mbGFncy52YWxpZCkgewogCQkvKiBCdXR0b24ncyBHUEUgaXMgcnVuLXdha2UgR1BFICovCkBAIC0zODUsNDcgKzQ1OCwzMSBAQAogCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdXG4iLAogCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKTsKIAotICAgICAgZW5kOgotCWlmIChyZXN1bHQpIHsKLQkJYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7Ci0JCWtmcmVlKGJ1dHRvbik7Ci0JfQorCXJldHVybiAwOwogCi0JcmV0dXJuIHJlc3VsdDsKKyBlcnJfcmVtb3ZlX2hhbmRsZXJzOgorCWFjcGlfYnV0dG9uX3JlbW92ZV9ub3RpZnlfaGFuZGxlcnMoYnV0dG9uKTsKKyBlcnJfcmVtb3ZlX2ZzOgorCWFjcGlfYnV0dG9uX3JlbW92ZV9mcyhkZXZpY2UpOworIGVycl9mcmVlX2lucHV0OgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0KTsKKyBlcnJfZnJlZV9idXR0b246CisJa2ZyZWUoYnV0dG9uKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9idXR0b25fcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwotCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gTlVMTDsKLQorCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uOwogCiAJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlidXR0b24gPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKLQkvKiBVbnJlZ2lzdGVyIGZvciBkZXZpY2Ugbm90aWZpY2F0aW9ucy4gKi8KLQlzd2l0Y2ggKGJ1dHRvbi0+dHlwZSkgewotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY6Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfUE9XRVJfQlVUVE9OLAotCQkJCQkJICAgIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCk7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfU0xFRVBfQlVUVE9OLAotCQkJCQkJICAgIGFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGRldmljZS0+aGFuZGxlLAotCQkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKLQkJCQkJCSAgICBhY3BpX2J1dHRvbl9ub3RpZnkpOwotCQlicmVhazsKLQl9Ci0KKwlhY3BpX2J1dHRvbl9yZW1vdmVfbm90aWZ5X2hhbmRsZXJzKGJ1dHRvbik7CiAJYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7Ci0KKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShidXR0b24tPmlucHV0KTsKIAlrZnJlZShidXR0b24pOwogCiAJcmV0dXJuIDA7CkBAIC00MzMsOCArNDkwLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9idXR0b25faW5pdCh2b2lkKQogewotCWludCByZXN1bHQgPSAwOwotCisJaW50IHJlc3VsdDsKIAogCWFjcGlfYnV0dG9uX2RpciA9IHByb2NfbWtkaXIoQUNQSV9CVVRUT05fQ0xBU1MsIGFjcGlfcm9vdF9kaXIpOwogCWlmICghYWNwaV9idXR0b25fZGlyKQpAQCAtNDUxLDcgKzUwNyw2IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX2J1dHRvbl9leGl0KHZvaWQpCiB7Ci0KIAlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9idXR0b25fZHJpdmVyKTsKIAogCWlmIChhY3BpX3Bvd2VyX2RpcikKQEAgLTQ2MSw4ICs1MTYsNiBAQAogCWlmIChhY3BpX2xpZF9kaXIpCiAJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX1NVQkNMQVNTX0xJRCwgYWNwaV9idXR0b25fZGlyKTsKIAlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9DTEFTUywgYWNwaV9yb290X2Rpcik7Ci0KLQlyZXR1cm47CiB9CiAKIG1vZHVsZV9pbml0KGFjcGlfYnV0dG9uX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2RvY2suYyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKaW5kZXggM2MzZGVlOC4uOTA5OTBhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2RvY2suYworKysgYi9kcml2ZXJzL2FjcGkvZG9jay5jCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKQEAgLTM4LDEzICs0MCwxNSBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIGRvY2tfbm90aWZpZXJfbGlzdDsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRvY2tfZGV2aWNlOworc3RhdGljIGNoYXIgZG9ja19kZXZpY2VfbmFtZVtdID0gImRvY2siOwogCiBzdHJ1Y3QgZG9ja19zdGF0aW9uIHsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJdW5zaWduZWQgbG9uZyBsYXN0X2RvY2tfdGltZTsKIAl1MzIgZmxhZ3M7CiAJc3BpbmxvY2tfdCBkZF9sb2NrOwotCXNwaW5sb2NrX3QgaHBfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggaHBfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRlcGVuZGVudF9kZXZpY2VzOwogCXN0cnVjdCBsaXN0X2hlYWQgaG90cGx1Z19kZXZpY2VzOwogfTsKQEAgLTExNCw5ICsxMTgsOSBAQAogZG9ja19hZGRfaG90cGx1Z19kZXZpY2Uoc3RydWN0IGRvY2tfc3RhdGlvbiAqZHMsCiAJCQlzdHJ1Y3QgZG9ja19kZXBlbmRlbnRfZGV2aWNlICpkZCkKIHsKLQlzcGluX2xvY2soJmRzLT5ocF9sb2NrKTsKKwltdXRleF9sb2NrKCZkcy0+aHBfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmZGQtPmhvdHBsdWdfbGlzdCwgJmRzLT5ob3RwbHVnX2RldmljZXMpOwotCXNwaW5fdW5sb2NrKCZkcy0+aHBfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkcy0+aHBfbG9jayk7CiB9CiAKIC8qKgpAQCAtMTMwLDkgKzEzNCw5IEBACiBkb2NrX2RlbF9ob3RwbHVnX2RldmljZShzdHJ1Y3QgZG9ja19zdGF0aW9uICpkcywKIAkJCXN0cnVjdCBkb2NrX2RlcGVuZGVudF9kZXZpY2UgKmRkKQogewotCXNwaW5fbG9jaygmZHMtPmhwX2xvY2spOworCW11dGV4X2xvY2soJmRzLT5ocF9sb2NrKTsKIAlsaXN0X2RlbCgmZGQtPmhvdHBsdWdfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmRzLT5ocF9sb2NrKTsKKwltdXRleF91bmxvY2soJmRzLT5ocF9sb2NrKTsKIH0KIAogLyoqCkBAIC0yOTUsNyArMjk5LDcgQEAKIHsKIAlzdHJ1Y3QgZG9ja19kZXBlbmRlbnRfZGV2aWNlICpkZDsKIAotCXNwaW5fbG9jaygmZHMtPmhwX2xvY2spOworCW11dGV4X2xvY2soJmRzLT5ocF9sb2NrKTsKIAogCS8qCiAJICogRmlyc3QgY2FsbCBkcml2ZXIgc3BlY2lmaWMgaG90cGx1ZyBmdW5jdGlvbnMKQEAgLTMxNywxNSArMzIxLDE3IEBACiAJCWVsc2UKIAkJCWRvY2tfY3JlYXRlX2FjcGlfZGV2aWNlKGRkLT5oYW5kbGUpOwogCX0KLQlzcGluX3VubG9jaygmZHMtPmhwX2xvY2spOworCW11dGV4X3VubG9jaygmZHMtPmhwX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBkb2NrX2V2ZW50KHN0cnVjdCBkb2NrX3N0YXRpb24gKmRzLCB1MzIgZXZlbnQsIGludCBudW0pCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRvY2tfZGV2aWNlLmRldjsKIAkvKgotCSAqIHdlIGRvbid0IGRvIGV2ZW50cyB1bnRpbCBzb21lb25lIHRlbGxzIG1lIHRoYXQKLQkgKiB0aGV5IHdvdWxkIGxpa2UgdG8gaGF2ZSB0aGVtLgorCSAqIEluZGljYXRlIHRoYXQgdGhlIHN0YXR1cyBvZiB0aGUgZG9jayBzdGF0aW9uIGhhcworCSAqIGNoYW5nZWQuCiAJICovCisJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9DSEFOR0UpOwogfQogCiAvKioKQEAgLTQ0MCw2ICs0NDYsOSBAQAogICovCiBpbnQgcmVnaXN0ZXJfZG9ja19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogeworCWlmICghZG9ja19zdGF0aW9uKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmRvY2tfbm90aWZpZXJfbGlzdCwgbmIpOwogfQogCkBAIC00NTEsNiArNDYwLDkgQEAKICAqLwogdm9pZCB1bnJlZ2lzdGVyX2RvY2tfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKIHsKKwlpZiAoIWRvY2tfc3RhdGlvbikKKwkJcmV0dXJuOworCiAJYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmRvY2tfbm90aWZpZXJfbGlzdCwgbmIpOwogfQogCkBAIC01MTEsNiArNTIzLDM3IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UpOwogCiAvKioKKyAqIGhhbmRsZV9lamVjdF9yZXF1ZXN0IC0gaGFuZGxlIGFuIHVuZG9jayByZXF1ZXN0IGNoZWNraW5nIGZvciBlcnJvciBjb25kaXRpb25zCisgKgorICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBkb2NrIGRldmljZSBpcyBzdGlsbCBwcmVzZW50LCB0aGVuIHVuZG9jayBhbmQKKyAqIGhvdHJlbW92ZSBhbGwgdGhlIGRldmljZXMgdGhhdCBtYXkgbmVlZCByZW1vdmluZy4KKyAqLworc3RhdGljIGludCBoYW5kbGVfZWplY3RfcmVxdWVzdChzdHJ1Y3QgZG9ja19zdGF0aW9uICpkcywgdTMyIGV2ZW50KQoreworCWlmICghZG9ja19wcmVzZW50KGRzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoZG9ja19pbl9wcm9ncmVzcyhkcykpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAqIGhlcmUgd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgdW5kb2NrCisJICogZXZlbnQgcHJpb3IgdG8gYWN0dWFsbHkgZG9pbmcgdGhlIHVuZG9jaworCSAqIHNvIHRoYXQgdGhlIGRldmljZSBzdHJ1Y3Qgc3RpbGwgZXhpc3RzLgorCSAqLworCWRvY2tfZXZlbnQoZHMsIGV2ZW50LCBVTkRPQ0tfRVZFTlQpOworCWhvdHBsdWdfZG9ja19kZXZpY2VzKGRzLCBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUKTsKKwl1bmRvY2soZHMpOworCWVqZWN0X2RvY2soZHMpOworCWlmIChkb2NrX3ByZXNlbnQoZHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVuYWJsZSB0byB1bmRvY2shXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBkb2NrX25vdGlmeSAtIGFjdCB1cG9uIGFuIGFjcGkgZG9jayBub3RpZmljYXRpb24KICAqIEBoYW5kbGU6IHRoZSBkb2NrIHN0YXRpb24gaGFuZGxlCiAgKiBAZXZlbnQ6IHRoZSBhY3BpIGV2ZW50CkBAIC01MTgsOSArNTYxLDcgQEAKICAqCiAgKiBJZiB3ZSBhcmUgbm90aWZpZWQgdG8gZG9jaywgdGhlbiBjaGVjayB0byBzZWUgaWYgdGhlIGRvY2sgaXMKICAqIHByZXNlbnQgYW5kIHRoZW4gZG9jay4gIE5vdGlmeSBhbGwgZHJpdmVycyBvZiB0aGUgZG9jayBldmVudCwKLSAqIGFuZCB0aGVuIGhvdHBsdWcgYW5kIGRldmljZXMgdGhhdCBtYXkgbmVlZCBob3RwbHVnZ2luZy4gIEZvciB1bmRvY2sKLSAqIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZG9jayBkZXZpY2UgaXMgc3RpbGwgcHJlc2VudCwgdGhlbiB1bmRvY2sKLSAqIGFuZCBob3RyZW1vdmUgYWxsIHRoZSBkZXZpY2VzIHRoYXQgbWF5IG5lZWQgcmVtb3ZpbmcuCisgKiBhbmQgdGhlbiBob3RwbHVnIGFuZCBkZXZpY2VzIHRoYXQgbWF5IG5lZWQgaG90cGx1Z2dpbmcuCiAgKi8KIHN0YXRpYyB2b2lkIGRvY2tfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewpAQCAtNTUyLDE5ICs1OTMsNyBAQAogCSAqIHRvIHRoZSBkcml2ZXIgd2hvIHdpc2ggdG8gaG90cGx1Zy4KICAgICAgICAgICovCiAJY2FzZSBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUOgotCQlpZiAoIWRvY2tfaW5fcHJvZ3Jlc3MoZHMpICYmIGRvY2tfcHJlc2VudChkcykpIHsKLQkJCS8qCi0JCQkgKiBoZXJlIHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHVuZG9jawotCQkJICogZXZlbnQgcHJpb3IgdG8gYWN0dWFsbHkgZG9pbmcgdGhlIHVuZG9jawotCQkJICogc28gdGhhdCB0aGUgZGV2aWNlIHN0cnVjdCBzdGlsbCBleGlzdHMuCi0JCQkgKi8KLQkJCWRvY2tfZXZlbnQoZHMsIGV2ZW50LCBVTkRPQ0tfRVZFTlQpOwotCQkJaG90cGx1Z19kb2NrX2RldmljZXMoZHMsIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1QpOwotCQkJdW5kb2NrKGRzKTsKLQkJCWVqZWN0X2RvY2soZHMpOwotCQkJaWYgKGRvY2tfcHJlc2VudChkcykpCi0JCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5hYmxlIHRvIHVuZG9jayFcbiIpOwotCQl9CisJCWhhbmRsZV9lamVjdF9yZXF1ZXN0KGRzLCBldmVudCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlVua25vd24gZG9jayBldmVudCAlZFxuIiwgZXZlbnQpOwpAQCAtNjAzLDYgKzYzMiwzMyBAQAogCXJldHVybiBBRV9PSzsKIH0KIAorLyoKKyAqIHNob3dfZG9ja2VkIC0gcmVhZCBtZXRob2QgZm9yICJkb2NrZWQiIGZpbGUgaW4gc3lzZnMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19kb2NrZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZG9ja19wcmVzZW50KGRvY2tfc3RhdGlvbikpOworCit9CitERVZJQ0VfQVRUUihkb2NrZWQsIFNfSVJVR08sIHNob3dfZG9ja2VkLCBOVUxMKTsKKworLyoKKyAqIHdyaXRlX3VuZG9jayAtIHdyaXRlIG1ldGhvZCBmb3IgInVuZG9jayIgZmlsZSBpbiBzeXNmcworICovCitzdGF0aWMgc3NpemVfdCB3cml0ZV91bmRvY2soc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGhhbmRsZV9lamVjdF9yZXF1ZXN0KGRvY2tfc3RhdGlvbiwgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVCk7CisJcmV0dXJuIHJldCA/IHJldDogY291bnQ7Cit9CitERVZJQ0VfQVRUUih1bmRvY2ssIFNfSVdVU1IsIE5VTEwsIHdyaXRlX3VuZG9jayk7CisKIC8qKgogICogZG9ja19hZGQgLSBhZGQgYSBuZXcgZG9jayBzdGF0aW9uCiAgKiBAaGFuZGxlOiB0aGUgZG9jayBzdGF0aW9uIGhhbmRsZQpAQCAtNjI1LDkgKzY4MSwzMyBAQAogCUlOSVRfTElTVF9IRUFEKCZkb2NrX3N0YXRpb24tPmRlcGVuZGVudF9kZXZpY2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmZG9ja19zdGF0aW9uLT5ob3RwbHVnX2RldmljZXMpOwogCXNwaW5fbG9ja19pbml0KCZkb2NrX3N0YXRpb24tPmRkX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZkb2NrX3N0YXRpb24tPmhwX2xvY2spOworCW11dGV4X2luaXQoJmRvY2tfc3RhdGlvbi0+aHBfbG9jayk7CiAJQVRPTUlDX0lOSVRfTk9USUZJRVJfSEVBRCgmZG9ja19ub3RpZmllcl9saXN0KTsKIAorCS8qIGluaXRpYWxpemUgcGxhdGZvcm0gZGV2aWNlIHN0dWZmICovCisJZG9ja19kZXZpY2UubmFtZSA9IGRvY2tfZGV2aWNlX25hbWU7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZkb2NrX2RldmljZSk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciAlZCByZWdpc3RlcmluZyBkb2NrIGRldmljZVxuIiwgcmV0KTsKKwkJa2ZyZWUoZG9ja19zdGF0aW9uKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkb2NrX2RldmljZS5kZXYsICZkZXZfYXR0cl9kb2NrZWQpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCJFcnJvciAlZCBhZGRpbmcgc3lzZnMgZmlsZVxuIiwgcmV0KTsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmRvY2tfZGV2aWNlKTsKKwkJa2ZyZWUoZG9ja19zdGF0aW9uKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkb2NrX2RldmljZS5kZXYsICZkZXZfYXR0cl91bmRvY2spOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCJFcnJvciAlZCBhZGRpbmcgc3lzZnMgZmlsZVxuIiwgcmV0KTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZkb2NrX2RldmljZS5kZXYsICZkZXZfYXR0cl9kb2NrZWQpOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmZG9ja19kZXZpY2UpOworCQlrZnJlZShkb2NrX3N0YXRpb24pOworCQlyZXR1cm4gcmV0OworCX0KKwogCS8qIEZpbmQgZGVwZW5kZW50IGRldmljZXMgKi8KIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCiAJCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBmaW5kX2RvY2tfZGV2aWNlcywgZG9ja19zdGF0aW9uLApAQCAtNjM3LDcgKzcxNyw4IEBACiAJZGQgPSBhbGxvY19kb2NrX2RlcGVuZGVudF9kZXZpY2UoaGFuZGxlKTsKIAlpZiAoIWRkKSB7CiAJCWtmcmVlKGRvY2tfc3RhdGlvbik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvY2tfYWRkX2Vycl91bnJlZ2lzdGVyOwogCX0KIAlhZGRfZG9ja19kZXBlbmRlbnRfZGV2aWNlKGRvY2tfc3RhdGlvbiwgZGQpOwogCkBAIC02NTcsOCArNzM4LDEyIEBACiAJcmV0dXJuIDA7CiAKIGRvY2tfYWRkX2VycjoKLQlrZnJlZShkb2NrX3N0YXRpb24pOwogCWtmcmVlKGRkKTsKK2RvY2tfYWRkX2Vycl91bnJlZ2lzdGVyOgorCWRldmljZV9yZW1vdmVfZmlsZSgmZG9ja19kZXZpY2UuZGV2LCAmZGV2X2F0dHJfZG9ja2VkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRvY2tfZGV2aWNlLmRldiwgJmRldl9hdHRyX3VuZG9jayk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmRvY2tfZGV2aWNlKTsKKwlrZnJlZShkb2NrX3N0YXRpb24pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY4NSw2ICs3NzAsMTEgQEAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXJcbiIpOwogCisJLyogY2xlYW51cCBzeXNmcyAqLworCWRldmljZV9yZW1vdmVfZmlsZSgmZG9ja19kZXZpY2UuZGV2LCAmZGV2X2F0dHJfZG9ja2VkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRvY2tfZGV2aWNlLmRldiwgJmRldl9hdHRyX3VuZG9jayk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmRvY2tfZGV2aWNlKTsKKwogCS8qIGZyZWUgZG9jayBzdGF0aW9uIG1lbW9yeSAqLwogCWtmcmVlKGRvY2tfc3RhdGlvbik7CiAJcmV0dXJuIDA7CkBAIC03MjUsNyArODE1LDcgQEAKIAkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGZpbmRfZG9jaywgJm51bSwgTlVMTCk7CiAKIAlpZiAoIW51bSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXByaW50ayhLRVJOX0lORk8gIk5vIGRvY2sgZGV2aWNlcyBmb3VuZC5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IGQ1NjBiNWUuLjRhOTA5YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC00NSwyMDUgKzQ1LDEyNyBAQAogI2RlZmluZSBBQ1BJX0VDX0RSSVZFUl9OQU1FCQkiQUNQSSBFbWJlZGRlZCBDb250cm9sbGVyIERyaXZlciIKICNkZWZpbmUgQUNQSV9FQ19ERVZJQ0VfTkFNRQkJIkVtYmVkZGVkIENvbnRyb2xsZXIiCiAjZGVmaW5lIEFDUElfRUNfRklMRV9JTkZPCQkiaW5mbyIKKyN1bmRlZiBQUkVGSVgKKyNkZWZpbmUgUFJFRklYCQkJCSJBQ1BJOiBFQzogIgorLyogRUMgc3RhdHVzIHJlZ2lzdGVyICovCiAjZGVmaW5lIEFDUElfRUNfRkxBR19PQkYJMHgwMQkvKiBPdXRwdXQgYnVmZmVyIGZ1bGwgKi8KICNkZWZpbmUgQUNQSV9FQ19GTEFHX0lCRgkweDAyCS8qIElucHV0IGJ1ZmZlciBmdWxsICovCiAjZGVmaW5lIEFDUElfRUNfRkxBR19CVVJTVAkweDEwCS8qIGJ1cnN0IG1vZGUgKi8KICNkZWZpbmUgQUNQSV9FQ19GTEFHX1NDSQkweDIwCS8qIEVDLVNDSSBvY2N1cnJlZCAqLwotI2RlZmluZSBBQ1BJX0VDX0VWRU5UX09CRgkweDAxCS8qIE91dHB1dCBidWZmZXIgZnVsbCAqLwotI2RlZmluZSBBQ1BJX0VDX0VWRU5UX0lCRQkweDAyCS8qIElucHV0IGJ1ZmZlciBlbXB0eSAqLwotI2RlZmluZSBBQ1BJX0VDX0RFTEFZCQk1MAkvKiBXYWl0IDUwbXMgbWF4LiBkdXJpbmcgRUMgb3BzICovCisvKiBFQyBjb21tYW5kcyAqLworZW51bSBlY19jb21tYW5kIHsKKwlBQ1BJX0VDX0NPTU1BTkRfUkVBRCA9IDB4ODAsCisJQUNQSV9FQ19DT01NQU5EX1dSSVRFID0gMHg4MSwKKwlBQ1BJX0VDX0JVUlNUX0VOQUJMRSA9IDB4ODIsCisJQUNQSV9FQ19CVVJTVF9ESVNBQkxFID0gMHg4MywKKwlBQ1BJX0VDX0NPTU1BTkRfUVVFUlkgPSAweDg0LAorfTsKKy8qIEVDIGV2ZW50cyAqLworZW51bSBlY19ldmVudCB7CisJQUNQSV9FQ19FVkVOVF9PQkZfMSA9IDEsCS8qIE91dHB1dCBidWZmZXIgZnVsbCAqLworCUFDUElfRUNfRVZFTlRfSUJGXzAsCS8qIElucHV0IGJ1ZmZlciBlbXB0eSAqLworfTsKKworI2RlZmluZSBBQ1BJX0VDX0RFTEFZCQk1MDAJLyogV2FpdCA1MDBtcyBtYXguIGR1cmluZyBFQyBvcHMgKi8KICNkZWZpbmUgQUNQSV9FQ19VREVMQVlfR0xLCTEwMDAJLyogV2FpdCAxbXMgbWF4LiB0byBnZXQgZ2xvYmFsIGxvY2sgKi8KLSNkZWZpbmUgQUNQSV9FQ19VREVMQVkgICAgICAgICAxMDAJLyogUG9sbCBAIDEwMHVzIGluY3JlbWVudHMgKi8KLSNkZWZpbmUgQUNQSV9FQ19VREVMQVlfQ09VTlQgICAxMDAwCS8qIFdhaXQgMTBtcyBtYXguIGR1cmluZyBFQyBvcHMgKi8KLSNkZWZpbmUgQUNQSV9FQ19DT01NQU5EX1JFQUQJMHg4MAotI2RlZmluZSBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUJMHg4MQotI2RlZmluZSBBQ1BJX0VDX0JVUlNUX0VOQUJMRQkweDgyCi0jZGVmaW5lIEFDUElfRUNfQlVSU1RfRElTQUJMRQkweDgzCi0jZGVmaW5lIEFDUElfRUNfQ09NTUFORF9RVUVSWQkweDg0Ci0jZGVmaW5lIEVDX1BPTEwJCQkweEZGCi0jZGVmaW5lIEVDX0lOVFIJCQkweDAwCisKK3N0YXRpYyBlbnVtIGVjX21vZGUgeworCUVDX0lOVFIgPSAxLAkJLyogT3V0cHV0IGJ1ZmZlciBmdWxsICovCisJRUNfUE9MTCwJCS8qIElucHV0IGJ1ZmZlciBlbXB0eSAqLworfSBhY3BpX2VjX21vZGUgPSBFQ19JTlRSOworCiBzdGF0aWMgaW50IGFjcGlfZWNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfZWNfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX2VjX3N0b3Aoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19pbnRyX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX2VjX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9lY19kcml2ZXIgPSB7CiAJLm5hbWUgPSBBQ1BJX0VDX0RSSVZFUl9OQU1FLAogCS5jbGFzcyA9IEFDUElfRUNfQ0xBU1MsCiAJLmlkcyA9IEFDUElfRUNfSElELAogCS5vcHMgPSB7Ci0JCS5hZGQgPSBhY3BpX2VjX2ludHJfYWRkLAorCQkuYWRkID0gYWNwaV9lY19hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX2VjX3JlbW92ZSwKIAkJLnN0YXJ0ID0gYWNwaV9lY19zdGFydCwKIAkJLnN0b3AgPSBhY3BpX2VjX3N0b3AsCiAJCX0sCiB9OwotdW5pb24gYWNwaV9lYyB7Ci0Jc3RydWN0IHsKLQkJdTMyIG1vZGU7Ci0JCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQkJdW5zaWduZWQgbG9uZyB1aWQ7Ci0JCXVuc2lnbmVkIGxvbmcgZ3BlX2JpdDsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHN0YXR1c19hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgY29tbWFuZF9hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGF0YV9hZGRyOwotCQl1bnNpZ25lZCBsb25nIGdsb2JhbF9sb2NrOwotCX0gY29tbW9uOwogCi0Jc3RydWN0IHsKLQkJdTMyIG1vZGU7Ci0JCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQkJdW5zaWduZWQgbG9uZyB1aWQ7Ci0JCXVuc2lnbmVkIGxvbmcgZ3BlX2JpdDsKLQkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHN0YXR1c19hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgY29tbWFuZF9hZGRyOwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGF0YV9hZGRyOwotCQl1bnNpZ25lZCBsb25nIGdsb2JhbF9sb2NrOwotCQl1bnNpZ25lZCBpbnQgZXhwZWN0X2V2ZW50OwotCQlhdG9taWNfdCBsZWF2aW5nX2J1cnN0OwkvKiAwIDogTm8sIDEgOiBZZXMsIDI6IGFib3J0ICovCi0JCWF0b21pY190IHBlbmRpbmdfZ3BlOwotCQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKLQkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQl9IGludHI7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgbW9kZTsKLQkJYWNwaV9oYW5kbGUgaGFuZGxlOwotCQl1bnNpZ25lZCBsb25nIHVpZDsKLQkJdW5zaWduZWQgbG9uZyBncGVfYml0OwotCQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc3RhdHVzX2FkZHI7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBjb21tYW5kX2FkZHI7Ci0JCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBkYXRhX2FkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgZ2xvYmFsX2xvY2s7Ci0JCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwotCX0gcG9sbDsKLX07Ci0KLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGV2ZW50KTsKLXN0YXRpYyBpbnQgYWNwaV9lY19pbnRyX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHVuc2lnbmVkIGludCBldmVudCk7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19pbnRyX3JlYWQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHUzMiAqIGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX2ludHJfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX3BvbGxfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpOwotc3RhdGljIGludCBhY3BpX2VjX2ludHJfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpOwotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcG9sbF9xdWVyeSh2b2lkICplY19jeHQpOwotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfaW50cl9xdWVyeSh2b2lkICplY19jeHQpOwotc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9wb2xsX2hhbmRsZXIodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdTMyIGFjcGlfZWNfZ3BlX2ludHJfaGFuZGxlcih2b2lkICpkYXRhKTsKLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X3BvbGxfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCXUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X2ludHJfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJICAgICAgdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKTsKLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19wb2xsX2dldF9yZWFsX2VjZHQodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2ludHJfZ2V0X3JlYWxfZWNkdCh2b2lkKTsKIC8qIElmIHdlIGZpbmQgYW4gRUMgdmlhIHRoZSBFQ0RULCB3ZSBuZWVkIHRvIGtlZXAgYSBwdHIgdG8gaXRzIGNvbnRleHQgKi8KLXN0YXRpYyB1bmlvbiBhY3BpX2VjICplY19lY2R0Oworc3RydWN0IGFjcGlfZWMgeworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHVpZDsKKwl1bnNpZ25lZCBsb25nIGdwZTsKKwl1bnNpZ25lZCBsb25nIGNvbW1hbmRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGRhdGFfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGdsb2JhbF9sb2NrOworCXN0cnVjdCBtdXRleCBsb2NrOworCWF0b21pY190IHF1ZXJ5X3BlbmRpbmc7CisJYXRvbWljX3QgbGVhdmluZ19idXJzdDsJLyogMCA6IE5vLCAxIDogWWVzLCAyOiBhYm9ydCAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Cit9ICplY19lY2R0OwogCiAvKiBFeHRlcm5hbCBpbnRlcmZhY2VzIHVzZSBmaXJzdCBFQyBvbmx5LCBzbyByZW1lbWJlciAqLwogc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqZmlyc3RfZWM7Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9tb2RlID0gRUNfSU5UUjsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24gTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHUzMiBhY3BpX2VjX3JlYWRfc3RhdHVzKHVuaW9uIGFjcGlfZWMgKmVjKQorc3RhdGljIGlubGluZSB1OCBhY3BpX2VjX3JlYWRfc3RhdHVzKHN0cnVjdCBhY3BpX2VjICplYykKIHsKLQl1MzIgc3RhdHVzID0gMDsKLQotCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnN0YXR1cywgJmVjLT5jb21tb24uc3RhdHVzX2FkZHIpOwotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIGluYihlYy0+Y29tbWFuZF9hZGRyKTsKIH0KIAotc3RhdGljIGludCBhY3BpX2VjX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGV2ZW50KQorc3RhdGljIGlubGluZSB1OCBhY3BpX2VjX3JlYWRfZGF0YShzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbF9tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19wb2xsX3dhaXQoZWMsIGV2ZW50KTsKLQllbHNlCi0JCXJldHVybiBhY3BpX2VjX2ludHJfd2FpdChlYywgZXZlbnQpOworCXJldHVybiBpbmIoZWMtPmRhdGFfYWRkcik7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9lY19wb2xsX3dhaXQodW5pb24gYWNwaV9lYyAqZWMsIHU4IGV2ZW50KQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfZWNfd3JpdGVfY21kKHN0cnVjdCBhY3BpX2VjICplYywgdTggY29tbWFuZCkKIHsKLQl1MzIgYWNwaV9lY19zdGF0dXMgPSAwOwotCXUzMiBpID0gQUNQSV9FQ19VREVMQVlfQ09VTlQ7CisJb3V0Yihjb21tYW5kLCBlYy0+Y29tbWFuZF9hZGRyKTsKK30KIAotCWlmICghZWMpCi0JCXJldHVybiAtRUlOVkFMOworc3RhdGljIGlubGluZSB2b2lkIGFjcGlfZWNfd3JpdGVfZGF0YShzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IGRhdGEpCit7CisJb3V0YihkYXRhLCBlYy0+ZGF0YV9hZGRyKTsKK30KIAotCS8qIFBvbGwgdGhlIEVDIHN0YXR1cyByZWdpc3RlciB3YWl0aW5nIGZvciB0aGUgZXZlbnQgdG8gb2NjdXIuICovCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgQUNQSV9FQ19FVkVOVF9PQkY6Ci0JCWRvIHsKLQkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLAotCQkJCQkgICAgICAgJmVjLT5jb21tb24uc3RhdHVzX2FkZHIpOwotCQkJaWYgKGFjcGlfZWNfc3RhdHVzICYgQUNQSV9FQ19GTEFHX09CRikKLQkJCQlyZXR1cm4gMDsKLQkJCXVkZWxheShBQ1BJX0VDX1VERUxBWSk7Ci0JCX0gd2hpbGUgKC0taSA+IDApOwotCQlicmVhazsKLQljYXNlIEFDUElfRUNfRVZFTlRfSUJFOgotCQlkbyB7Ci0JCQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZhY3BpX2VjX3N0YXR1cywKLQkJCQkJICAgICAgICZlYy0+Y29tbW9uLnN0YXR1c19hZGRyKTsKLQkJCWlmICghKGFjcGlfZWNfc3RhdHVzICYgQUNQSV9FQ19GTEFHX0lCRikpCi0JCQkJcmV0dXJuIDA7Ci0JCQl1ZGVsYXkoQUNQSV9FQ19VREVMQVkpOwotCQl9IHdoaWxlICgtLWkgPiAwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CitzdGF0aWMgaW5saW5lIGludCBhY3BpX2VjX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgYWNwaV9lYyAqZWMsIGVudW0gZWNfZXZlbnQgZXZlbnQpCit7CisJdTggc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7CisKKwlpZiAoZXZlbnQgPT0gQUNQSV9FQ19FVkVOVF9PQkZfMSkgeworCQlpZiAoc3RhdHVzICYgQUNQSV9FQ19GTEFHX09CRikKKwkJCXJldHVybiAxOworCX0gZWxzZSBpZiAoZXZlbnQgPT0gQUNQSV9FQ19FVkVOVF9JQkZfMCkgeworCQlpZiAoIShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfSUJGKSkKKwkJCXJldHVybiAxOwogCX0KIAotCXJldHVybiAtRVRJTUU7CisJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW50IGFjcGlfZWNfaW50cl93YWl0KHVuaW9uIGFjcGlfZWMgKmVjLCB1bnNpZ25lZCBpbnQgZXZlbnQpCisKK3N0YXRpYyBpbnQgYWNwaV9lY193YWl0KHN0cnVjdCBhY3BpX2VjICplYywgZW51bSBlY19ldmVudCBldmVudCkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCi0JZWMtPmludHIuZXhwZWN0X2V2ZW50ID0gZXZlbnQ7Ci0Jc21wX21iKCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBBQ1BJX0VDX0VWRU5UX0lCRToKLQkJaWYgKH5hY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIEFDUElfRUNfRkxBR19JQkYpIHsKLQkJCWVjLT5pbnRyLmV4cGVjdF9ldmVudCA9IDA7Ci0JCQlyZXR1cm4gMDsKKwlpZiAoYWNwaV9lY19tb2RlID09IEVDX1BPTEwpIHsKKwkJdW5zaWduZWQgbG9uZyBkZWxheSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEFDUElfRUNfREVMQVkpOworCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZGVsYXkpKSB7CisJCQlpZiAoYWNwaV9lY19jaGVja19zdGF0dXMoZWMsIGV2ZW50KSkKKwkJCQlyZXR1cm4gMDsKIAkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZWMtPmludHIud2FpdCwKLQkJCQkgICAgIWVjLT5pbnRyLmV4cGVjdF9ldmVudCwKLQkJCQkgICAgbXNlY3NfdG9famlmZmllcyhBQ1BJX0VDX0RFTEFZKSk7Ci0KLQllYy0+aW50ci5leHBlY3RfZXZlbnQgPSAwOwotCXNtcF9tYigpOwotCi0JLyoKLQkgKiBWZXJpZnkgdGhhdCB0aGUgZXZlbnQgaW4gcXVlc3Rpb24gaGFzIGFjdHVhbGx5IGhhcHBlbmVkIGJ5Ci0JICogcXVlcnlpbmcgRUMgc3RhdHVzLiBEbyB0aGUgY2hlY2sgZXZlbiBpZiBvcGVyYXRpb24gdGltZWQtb3V0Ci0JICogdG8gbWFrZSBzdXJlIHRoYXQgd2UgZGlkIG5vdCBtaXNzIGludGVycnVwdC4KLQkgKi8KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBBQ1BJX0VDX0VWRU5UX09CRjoKLQkJaWYgKGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX09CRikKKwl9IGVsc2UgeworCQlpZiAod2FpdF9ldmVudF90aW1lb3V0KGVjLT53YWl0LAorCQkJCSAgICAgICBhY3BpX2VjX2NoZWNrX3N0YXR1cyhlYywgZXZlbnQpLAorCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKEFDUElfRUNfREVMQVkpKSB8fAorCQkgICAgYWNwaV9lY19jaGVja19zdGF0dXMoZWMsIGV2ZW50KSkgewogCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0VDX0VWRU5UX0lCRToKLQkJaWYgKH5hY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIEFDUElfRUNfRkxBR19JQkYpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJhY3BpX2VjX3dhaXQgdGltZW91dCwiCisJCQkgICAgICAgIiBzdGF0dXMgPSAlZCwgZXhwZWN0X2V2ZW50ID0gJWRcbiIsCisJCQkgICAgICAgYWNwaV9lY19yZWFkX3N0YXR1cyhlYyksIGV2ZW50KTsKKwkJfQogCX0KIAogCXJldHVybiAtRVRJTUU7CkBAIC0yNTQsMjYyICsxNzYsMTUzIEBACiAgKiBOb3RlOiBzYW1zdW5nIG52NTAwMCBkb2Vzbid0IHdvcmsgd2l0aCBlYyBidXJzdCBtb2RlLgogICogaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTQ5ODAKICAqLwotaW50IGFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZSh1bmlvbiBhY3BpX2VjICplYykKK2ludCBhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoc3RydWN0IGFjcGlfZWMgKmVjKQogewotCXUzMiB0bXAgPSAwOwotCWludCBzdGF0dXMgPSAwOwotCisJdTggdG1wID0gMDsKKwl1OCBzdGF0dXMgPSAwOwogCiAJc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7CiAJaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmICEoc3RhdHVzICYgQUNQSV9FQ19GTEFHX0JVUlNUKSkgewotCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gZW5kOwotCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwKLQkJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnRtcCwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKKwkJYWNwaV9lY193cml0ZV9jbWQoZWMsIEFDUElfRUNfQlVSU1RfRU5BQkxFKTsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRl8xKTsKKwkJdG1wID0gYWNwaV9lY19yZWFkX2RhdGEoZWMpOwogCQlpZiAodG1wICE9IDB4OTApIHsJLyogQnVyc3QgQUNLIGJ5dGUgKi8KIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCi0JYXRvbWljX3NldCgmZWMtPmludHIubGVhdmluZ19idXJzdCwgMCk7CisJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QsIDApOwogCXJldHVybiAwOwogICAgICAgZW5kOgotCUFDUElfRVhDRVBUSU9OICgoQUVfSU5GTywgc3RhdHVzLCAiRUMgd2FpdCwgYnVyc3QgbW9kZSIpOworCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJFQyB3YWl0LCBidXJzdCBtb2RlIikpOwogCXJldHVybiAtMTsKIH0KIAotaW50IGFjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZSh1bmlvbiBhY3BpX2VjICplYykKK2ludCBhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoc3RydWN0IGFjcGlfZWMgKmVjKQogewotCWludCBzdGF0dXMgPSAwOwotCisJdTggc3RhdHVzID0gMDsKIAogCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwotCWlmIChzdGF0dXMgIT0gLUVJTlZBTCAmJiAoc3RhdHVzICYgQUNQSV9FQ19GTEFHX0JVUlNUKSl7Ci0JCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19GTEFHX0lCRik7Ci0JCWlmKHN0YXR1cykKKwlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYgKHN0YXR1cyAmIEFDUElfRUNfRkxBR19CVVJTVCkpIHsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKKwkJaWYgKHN0YXR1cykKIAkJCWdvdG8gZW5kOwotCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0RJU0FCTEUsICZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7Ci0JCWFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19GTEFHX0lCRik7Ci0JfSAKLQlhdG9taWNfc2V0KCZlYy0+aW50ci5sZWF2aW5nX2J1cnN0LCAxKTsKKwkJYWNwaV9lY193cml0ZV9jbWQoZWMsIEFDUElfRUNfQlVSU1RfRElTQUJMRSk7CisJCWFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkZfMCk7CisJfQorCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0LCAxKTsKIAlyZXR1cm4gMDsKLWVuZDoKLQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRUMgbGVhdmUgYnVyc3QgbW9kZSIpOworICAgICAgZW5kOgorCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJFQyBsZWF2ZSBidXJzdCBtb2RlIikpOwogCXJldHVybiAtMTsKIH0KLSNlbmRpZiAvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKLXN0YXRpYyBpbnQgYWNwaV9lY19yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKQorc3RhdGljIGludCBhY3BpX2VjX3RyYW5zYWN0aW9uX3VubG9ja2VkKHN0cnVjdCBhY3BpX2VjICplYywgdTggY29tbWFuZCwKKwkJCQkJY29uc3QgdTggKiB3ZGF0YSwgdW5zaWduZWQgd2RhdGFfbGVuLAorCQkJCQl1OCAqIHJkYXRhLCB1bnNpZ25lZCByZGF0YV9sZW4pCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbF9tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19wb2xsX3JlYWQoZWMsIGFkZHJlc3MsIGRhdGEpOwotCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfaW50cl9yZWFkKGVjLCBhZGRyZXNzLCBkYXRhKTsKLX0KLXN0YXRpYyBpbnQgYWNwaV9lY193cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSkKLXsKLQlpZiAoYWNwaV9lY19wb2xsX21vZGUpCi0JCXJldHVybiBhY3BpX2VjX3BvbGxfd3JpdGUoZWMsIGFkZHJlc3MsIGRhdGEpOwotCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfaW50cl93cml0ZShlYywgYWRkcmVzcywgZGF0YSk7Ci19Ci1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9yZWFkKHVuaW9uIGFjcGlfZWMgKmVjLCB1OCBhZGRyZXNzLCB1MzIgKiBkYXRhKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCWludCByZXN1bHQgPSAwOwotCXUzMiBnbGsgPSAwOwogCisJYWNwaV9lY193cml0ZV9jbWQoZWMsIGNvbW1hbmQpOwogCi0JaWYgKCFlYyB8fCAhZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqZGF0YSA9IDA7Ci0KLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykgewotCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJZm9yICg7IHdkYXRhX2xlbiA+IDA7IC0td2RhdGFfbGVuKSB7CisJCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkZfMCk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJCSAgICAgICAid3JpdGVfY21kIHRpbWVvdXQsIGNvbW1hbmQgPSAlZFxuIiwgY29tbWFuZCk7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlhY3BpX2VjX3dyaXRlX2RhdGEoZWMsICood2RhdGErKykpOwogCX0KIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVjLT5wb2xsLnNlbSkpIHsKLQkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOwotCQlnb3RvIGVuZF9ub3NlbTsKKwlpZiAoIXJkYXRhX2xlbikgeworCQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJGXzApOworCQlpZiAocmVzdWx0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCisJCQkgICAgICAgImZpbmlzaC13cml0ZSB0aW1lb3V0LCBjb21tYW5kID0gJWRcbiIsIGNvbW1hbmQpOworCQkJZ290byBlbmQ7CisJCX0KKwl9IGVsc2UgaWYgKGNvbW1hbmQgPT0gQUNQSV9FQ19DT01NQU5EX1FVRVJZKSB7CisJCWF0b21pY19zZXQoJmVjLT5xdWVyeV9wZW5kaW5nLCAwKTsKIAl9Ci0JCi0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsCi0JCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVuZDsKIAotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7CisJZm9yICg7IHJkYXRhX2xlbiA+IDA7IC0tcmRhdGFfbGVuKSB7CisJCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkZfMSk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggInJlYWQgdGltZW91dCwgY29tbWFuZCA9ICVkXG4iLAorCQkJICAgICAgIGNvbW1hbmQpOworCQkJZ290byBlbmQ7CisJCX0KIAotCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgZGF0YSwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlYWQgWyUwMnhdIGZyb20gYWRkcmVzcyBbJTAyeF1cbiIsCi0JCQkgICpkYXRhLCBhZGRyZXNzKSk7Ci0KKwkJKihyZGF0YSsrKSA9IGFjcGlfZWNfcmVhZF9kYXRhKGVjKTsKKwl9CiAgICAgICBlbmQ6Ci0JdXAoJmVjLT5wb2xsLnNlbSk7Ci1lbmRfbm9zZW06Ci0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCi0JCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwotCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBhY3BpX2VjX3BvbGxfd3JpdGUodW5pb24gYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpCitzdGF0aWMgaW50IGFjcGlfZWNfdHJhbnNhY3Rpb24oc3RydWN0IGFjcGlfZWMgKmVjLCB1OCBjb21tYW5kLAorCQkJICAgICAgIGNvbnN0IHU4ICogd2RhdGEsIHVuc2lnbmVkIHdkYXRhX2xlbiwKKwkJCSAgICAgICB1OCAqIHJkYXRhLCB1bnNpZ25lZCByZGF0YV9sZW4pCiB7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdTMyIGdsayA9IDA7Ci0KLQotCWlmICghZWMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spIHsKLQkJc3RhdHVzID0gYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKEFDUElfRUNfVURFTEFZX0dMSywgJmdsayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVjLT5wb2xsLnNlbSkpIHsKLQkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOwotCQlnb3RvIGVuZF9ub3NlbTsKLQl9Ci0JCi0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1dSSVRFLAotCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7Ci0KLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBhZGRyZXNzLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZW5kOwotCi0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgZGF0YSwgJmVjLT5jb21tb24uZGF0YV9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVuZDsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIldyb3RlIFslMDJ4XSB0byBhZGRyZXNzIFslMDJ4XVxuIiwKLQkJCSAgZGF0YSwgYWRkcmVzcykpOwotCi0gICAgICBlbmQ6Ci0JdXAoJmVjLT5wb2xsLnNlbSk7Ci1lbmRfbm9zZW06Ci0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCi0JCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBhY3BpX2VjX2ludHJfcmVhZCh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTMyICogZGF0YSkKLXsKLQlpbnQgc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzOwogCXUzMiBnbGs7CiAKLQotCWlmICghZWMgfHwgIWRhdGEpCisJaWYgKCFlYyB8fCAod2RhdGFfbGVuICYmICF3ZGF0YSkgfHwgKHJkYXRhX2xlbiAmJiAhcmRhdGEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSpkYXRhID0gMDsKKwlpZiAocmRhdGEpCisJCW1lbXNldChyZGF0YSwgMCwgcmRhdGFfbGVuKTsKIAotCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKSB7CisJbXV0ZXhfbG9jaygmZWMtPmxvY2spOworCWlmIChlYy0+Z2xvYmFsX2xvY2spIHsKIAkJc3RhdHVzID0gYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKEFDUElfRUNfVURFTEFZX0dMSywgJmdsayk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCXJldHVybiAtRU5PREVWOwogCX0KIAotCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOwotCWRvd24oJmVjLT5pbnRyLnNlbSk7CisJLyogTWFrZSBzdXJlIEdQRSBpcyBlbmFibGVkIGJlZm9yZSBkb2luZyB0cmFuc2FjdGlvbiAqLworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlLCBBQ1BJX05PVF9JU1IpOwogCi0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CisJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAicmVhZCBFQywgSUIgbm90IGVtcHR5XG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYCisJCSAgICAgICAiaW5wdXQgYnVmZmVyIGlzIG5vdCBlbXB0eSwgYWJvcnRpbmcgdHJhbnNhY3Rpb25cbiIpOwogCQlnb3RvIGVuZDsKIAl9Ci0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsCi0JCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAicmVhZCBFQywgSUIgbm90IGVtcHR5XG4iKTsKLQl9CiAKLQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBhZGRyZXNzLCAmZWMtPmNvbW1vbi5kYXRhX2FkZHIpOwotCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOwotCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJyZWFkIEVDLCBPQiBub3QgZnVsbFxuIik7Ci0JCWdvdG8gZW5kOwotCX0KLQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVhZCBbJTAyeF0gZnJvbSBhZGRyZXNzIFslMDJ4XVxuIiwKLQkJCSAgKmRhdGEsIGFkZHJlc3MpKTsKKwlzdGF0dXMgPSBhY3BpX2VjX3RyYW5zYWN0aW9uX3VubG9ja2VkKGVjLCBjb21tYW5kLAorCQkJCQkgICAgICB3ZGF0YSwgd2RhdGFfbGVuLAorCQkJCQkgICAgICByZGF0YSwgcmRhdGFfbGVuKTsKIAogICAgICAgZW5kOgotCXVwKCZlYy0+aW50ci5zZW0pOwogCi0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCisJaWYgKGVjLT5nbG9iYWxfbG9jaykKIAkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7CisJbXV0ZXhfdW5sb2NrKCZlYy0+bG9jayk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IGFjcGlfZWNfaW50cl93cml0ZSh1bmlvbiBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9lY19yZWFkKHN0cnVjdCBhY3BpX2VjICplYywgdTggYWRkcmVzcywgdTggKiBkYXRhKQogewotCWludCBzdGF0dXMgPSAwOwotCXUzMiBnbGs7CisJaW50IHJlc3VsdDsKKwl1OCBkOwogCisJcmVzdWx0ID0gYWNwaV9lY190cmFuc2FjdGlvbihlYywgQUNQSV9FQ19DT01NQU5EX1JFQUQsCisJCQkJICAgICAmYWRkcmVzcywgMSwgJmQsIDEpOworCSpkYXRhID0gZDsKKwlyZXR1cm4gcmVzdWx0OworfQogCi0JaWYgKCFlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykgewotCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JV0FSTl9PTihpbl9pbnRlcnJ1cHQoKSk7Ci0JZG93bigmZWMtPmludHIuc2VtKTsKLQotCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJ3cml0ZSBFQywgSUIgbm90IGVtcHR5XG4iKTsKLQl9Ci0JYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1dSSVRFLAotCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7Ci0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIndyaXRlIEVDLCBJQiBub3QgZW1wdHlcbiIpOwotCX0KLQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0Jc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIndyaXRlIEVDLCBJQiBub3QgZW1wdHlcbiIpOwotCX0KLQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJXcm90ZSBbJTAyeF0gdG8gYWRkcmVzcyBbJTAyeF1cbiIsCi0JCQkgIGRhdGEsIGFkZHJlc3MpKTsKLQotCXVwKCZlYy0+aW50ci5zZW0pOwotCi0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCi0JCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwotCi0JcmV0dXJuIHN0YXR1czsKK3N0YXRpYyBpbnQgYWNwaV9lY193cml0ZShzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpCit7CisJdTggd2RhdGFbMl0gPSB7IGFkZHJlc3MsIGRhdGEgfTsKKwlyZXR1cm4gYWNwaV9lY190cmFuc2FjdGlvbihlYywgQUNQSV9FQ19DT01NQU5EX1dSSVRFLAorCQkJCSAgIHdkYXRhLCAyLCBOVUxMLCAwKTsKIH0KIAogLyoKQEAgLTUxNyw5ICszMzAsOSBAQAogICovCiBpbnQgZWNfcmVhZCh1OCBhZGRyLCB1OCAqIHZhbCkKIHsKLQl1bmlvbiBhY3BpX2VjICplYzsKKwlzdHJ1Y3QgYWNwaV9lYyAqZWM7CiAJaW50IGVycjsKLQl1MzIgdGVtcF9kYXRhOworCXU4IHRlbXBfZGF0YTsKIAogCWlmICghZmlyc3RfZWMpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNTM5LDcgKzM1Miw3IEBACiAKIGludCBlY193cml0ZSh1OCBhZGRyLCB1OCB2YWwpCiB7Ci0JdW5pb24gYWNwaV9lYyAqZWM7CisJc3RydWN0IGFjcGlfZWMgKmVjOwogCWludCBlcnI7CiAKIAlpZiAoIWZpcnN0X2VjKQpAQCAtNTU0LDI1NSArMzY3LDg2IEBACiAKIEVYUE9SVF9TWU1CT0woZWNfd3JpdGUpOwogCi1zdGF0aWMgaW50IGFjcGlfZWNfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCitpbnQgZWNfdHJhbnNhY3Rpb24odTggY29tbWFuZCwKKwkJCSAgY29uc3QgdTggKiB3ZGF0YSwgdW5zaWduZWQgd2RhdGFfbGVuLAorCQkJICB1OCAqIHJkYXRhLCB1bnNpZ25lZCByZGF0YV9sZW4pCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbF9tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19wb2xsX3F1ZXJ5KGVjLCBkYXRhKTsKLQllbHNlCi0JCXJldHVybiBhY3BpX2VjX2ludHJfcXVlcnkoZWMsIGRhdGEpOwotfQotc3RhdGljIGludCBhY3BpX2VjX3BvbGxfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdTMyIGdsayA9IDA7CisJc3RydWN0IGFjcGlfZWMgKmVjOwogCisJaWYgKCFmaXJzdF9lYykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllYyA9IGFjcGlfZHJpdmVyX2RhdGEoZmlyc3RfZWMpOworCisJcmV0dXJuIGFjcGlfZWNfdHJhbnNhY3Rpb24oZWMsIGNvbW1hbmQsIHdkYXRhLAorCQkJCSAgIHdkYXRhX2xlbiwgcmRhdGEsIHJkYXRhX2xlbik7Cit9CisKK0VYUE9SVF9TWU1CT0woZWNfdHJhbnNhY3Rpb24pOworCitzdGF0aWMgaW50IGFjcGlfZWNfcXVlcnkoc3RydWN0IGFjcGlfZWMgKmVjLCB1OCAqIGRhdGEpCit7CisJaW50IHJlc3VsdDsKKwl1OCBkOwogCiAJaWYgKCFlYyB8fCAhZGF0YSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqZGF0YSA9IDA7Ci0KLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykgewotCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCiAJLyoKIAkgKiBRdWVyeSB0aGUgRUMgdG8gZmluZCBvdXQgd2hpY2ggX1F4eCBtZXRob2Qgd2UgbmVlZCB0byBldmFsdWF0ZS4KIAkgKiBOb3RlIHRoYXQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBxdWVyeSBjYXVzZXMgdGhlIEFDUElfRUNfU0NJCiAJICogYml0IHRvIGJlIGNsZWFyZWQgKGFuZCB0aHVzIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlKS4KIAkgKi8KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlYy0+cG9sbC5zZW0pKSB7Ci0JCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKLQkJZ290byBlbmRfbm9zZW07Ci0JfQotCQotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9RVUVSWSwKLQkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOworCisJcmVzdWx0ID0gYWNwaV9lY190cmFuc2FjdGlvbihlYywgQUNQSV9FQ19DT01NQU5EX1FVRVJZLCBOVUxMLCAwLCAmZCwgMSk7CiAJaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7CisJCXJldHVybiByZXN1bHQ7CiAKLQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0JaWYgKCEqZGF0YSkKLQkJcmVzdWx0ID0gLUVOT0RBVEE7CisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT0RBVEE7CiAKLSAgICAgIGVuZDoKLQl1cCgmZWMtPnBvbGwuc2VtKTsKLWVuZF9ub3NlbToKLQlpZiAoZWMtPmNvbW1vbi5nbG9iYWxfbG9jaykKLQkJYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKGdsayk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotc3RhdGljIGludCBhY3BpX2VjX2ludHJfcXVlcnkodW5pb24gYWNwaV9lYyAqZWMsIHUzMiAqIGRhdGEpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTMyIGdsazsKLQotCi0JaWYgKCFlYyB8fCAhZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JKmRhdGEgPSAwOwotCi0JaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spIHsKLQkJc3RhdHVzID0gYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKEFDUElfRUNfVURFTEFZX0dMSywgJmdsayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQotCWRvd24oJmVjLT5pbnRyLnNlbSk7Ci0KLQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAicXVlcnkgRUMsIElCIG5vdCBlbXB0eVxuIik7Ci0JCWdvdG8gZW5kOwotCX0KLQkvKgotCSAqIFF1ZXJ5IHRoZSBFQyB0byBmaW5kIG91dCB3aGljaCBfUXh4IG1ldGhvZCB3ZSBuZWVkIHRvIGV2YWx1YXRlLgotCSAqIE5vdGUgdGhhdCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHF1ZXJ5IGNhdXNlcyB0aGUgQUNQSV9FQ19TQ0kKLQkgKiBiaXQgdG8gYmUgY2xlYXJlZCAoYW5kIHRodXMgY2xlYXJpbmcgdGhlIGludGVycnVwdCBzb3VyY2UpLgotCSAqLwotCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9RVUVSWSwKLQkJCQkmZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIpOwotCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9PQkYpOwotCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJxdWVyeSBFQywgT0Igbm90IGZ1bGxcbiIpOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+Y29tbW9uLmRhdGFfYWRkcik7Ci0JaWYgKCEqZGF0YSkKLQkJc3RhdHVzID0gLUVOT0RBVEE7Ci0KLSAgICAgIGVuZDoKLQl1cCgmZWMtPmludHIuc2VtKTsKLQotCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQotCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKLQotCXJldHVybiBzdGF0dXM7CisJKmRhdGEgPSBkOworCXJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi11bmlvbiBhY3BpX2VjX3F1ZXJ5X2RhdGEgewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQl1OCBkYXRhOwotfTsKLQogc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcXVlcnkodm9pZCAqZWNfY3h0KQogewotCWlmIChhY3BpX2VjX3BvbGxfbW9kZSkKLQkJYWNwaV9lY19ncGVfcG9sbF9xdWVyeShlY19jeHQpOwotCWVsc2UKLQkJYWNwaV9lY19ncGVfaW50cl9xdWVyeShlY19jeHQpOwotfQorCXN0cnVjdCBhY3BpX2VjICplYyA9IChzdHJ1Y3QgYWNwaV9lYyAqKWVjX2N4dDsKKwl1OCB2YWx1ZSA9IDA7CisJY2hhciBvYmplY3RfbmFtZVs4XTsKIAotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcG9sbF9xdWVyeSh2b2lkICplY19jeHQpCi17Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWVjX2N4dDsKLQl1MzIgdmFsdWUgPSAwOwotCXN0YXRpYyBjaGFyIG9iamVjdF9uYW1lWzVdID0geyAnXycsICdRJywgJzAnLCAnMCcsICdcMCcgfTsKLQljb25zdCBjaGFyIGhleFtdID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKLQkJJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicKLQl9OwotCi0KLQlpZiAoIWVjX2N4dCkKLQkJZ290byBlbmQ7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZWMtPnBvbGwuc2VtKSkgeworCWlmICghZWMgfHwgYWNwaV9lY19xdWVyeShlYywgJnZhbHVlKSkKIAkJcmV0dXJuOwotCX0KLQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ2YWx1ZSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQl1cCgmZWMtPnBvbGwuc2VtKTsKIAotCS8qIFRCRDogSW1wbGVtZW50IGFzeW5jaCBldmVudHMhCi0JICogTk9URTogQWxsIHdlIGNhcmUgYWJvdXQgYXJlIEVDLVNDSSdzLiAgT3RoZXIgRUMgZXZlbnRzIGFyZQotCSAqIGhhbmRsZWQgdmlhIHBvbGxpbmcgKHl1Y2shKS4gIFRoaXMgaXMgYmVjYXVzZSBzb21lIHN5c3RlbXMKLQkgKiB0cmVhdCBFQy1TQ0lzIGFzIGxldmVsICh2ZXJzdXMgRURHRSEpIHRyaWdnZXJlZCwgcHJldmVudGluZwotCSAqICBhIHB1cmVseSBpbnRlcnJ1cHQtZHJpdmVuIGFwcHJvYWNoIChncnVtYmxlLCBncnVtYmxlKS4KLQkgKi8KLQlpZiAoISh2YWx1ZSAmIEFDUElfRUNfRkxBR19TQ0kpKQotCQlnb3RvIGVuZDsKKwlzbnByaW50ZihvYmplY3RfbmFtZSwgOCwgIl9RJTIuMlgiLCB2YWx1ZSk7CiAKLQlpZiAoYWNwaV9lY19xdWVyeShlYywgJnZhbHVlKSkKLQkJZ290byBlbmQ7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggImV2YWx1YXRpbmcgJXNcbiIsIG9iamVjdF9uYW1lKTsKIAotCW9iamVjdF9uYW1lWzJdID0gaGV4WygodmFsdWUgPj4gNCkgJiAweDBGKV07Ci0Jb2JqZWN0X25hbWVbM10gPSBoZXhbKHZhbHVlICYgMHgwRildOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRXZhbHVhdGluZyAlc1xuIiwgb2JqZWN0X25hbWUpKTsKLQotCWFjcGlfZXZhbHVhdGVfb2JqZWN0KGVjLT5jb21tb24uaGFuZGxlLCBvYmplY3RfbmFtZSwgTlVMTCwgTlVMTCk7Ci0KLSAgICAgIGVuZDoKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwotfQotc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfaW50cl9xdWVyeSh2b2lkICplY19jeHQpCi17Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBlY19jeHQ7Ci0JdTMyIHZhbHVlOwotCWludCByZXN1bHQgPSAtRU5PREFUQTsKLQlzdGF0aWMgY2hhciBvYmplY3RfbmFtZVs1XSA9IHsgJ18nLCAnUScsICcwJywgJzAnLCAnXDAnIH07Ci0JY29uc3QgY2hhciBoZXhbXSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCi0JCSc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnCi0JfTsKLQotCi0JaWYgKGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX1NDSSkKLQkJcmVzdWx0ID0gYWNwaV9lY19xdWVyeShlYywgJnZhbHVlKTsKLQotCWlmIChyZXN1bHQpCi0JCWdvdG8gZW5kOwotCi0Jb2JqZWN0X25hbWVbMl0gPSBoZXhbKCh2YWx1ZSA+PiA0KSAmIDB4MEYpXTsKLQlvYmplY3RfbmFtZVszXSA9IGhleFsodmFsdWUgJiAweDBGKV07Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJFdmFsdWF0aW5nICVzXG4iLCBvYmplY3RfbmFtZSkpOwotCi0JYWNwaV9ldmFsdWF0ZV9vYmplY3QoZWMtPmNvbW1vbi5oYW5kbGUsIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKLSAgICAgIGVuZDoKLQlhdG9taWNfZGVjKCZlYy0+aW50ci5wZW5kaW5nX2dwZSk7Ci0JcmV0dXJuOworCWFjcGlfZXZhbHVhdGVfb2JqZWN0KGVjLT5oYW5kbGUsIG9iamVjdF9uYW1lLCBOVUxMLCBOVUxMKTsKIH0KIAogc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9oYW5kbGVyKHZvaWQgKmRhdGEpCiB7Ci0JaWYgKGFjcGlfZWNfcG9sbF9tb2RlKQotCQlyZXR1cm4gYWNwaV9lY19ncGVfcG9sbF9oYW5kbGVyKGRhdGEpOwotCWVsc2UKLQkJcmV0dXJuIGFjcGlfZWNfZ3BlX2ludHJfaGFuZGxlcihkYXRhKTsKLX0KLXN0YXRpYyB1MzIgYWNwaV9lY19ncGVfcG9sbF9oYW5kbGVyKHZvaWQgKmRhdGEpCi17CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBkYXRhOworCXU4IHZhbHVlOworCXN0cnVjdCBhY3BpX2VjICplYyA9IChzdHJ1Y3QgYWNwaV9lYyAqKWRhdGE7CiAKLQlpZiAoIWVjKQotCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7CisJCXdha2VfdXAoJmVjLT53YWl0KTsKKwl9CiAKLQlhY3BpX2Rpc2FibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9JU1IpOwotCi0Jc3RhdHVzID0gYWNwaV9vc19leGVjdXRlKE9TTF9FQ19QT0xMX0hBTkRMRVIsIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7Ci0KLQlpZiAoc3RhdHVzID09IEFFX09LKQotCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKLQllbHNlCi0JCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKLX0KLXN0YXRpYyB1MzIgYWNwaV9lY19ncGVfaW50cl9oYW5kbGVyKHZvaWQgKmRhdGEpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdTMyIHZhbHVlOwotCXVuaW9uIGFjcGlfZWMgKmVjID0gZGF0YTsKLQotCWlmICghZWMpCi0JCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKLQotCWFjcGlfY2xlYXJfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9JU1IpOwogCXZhbHVlID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7Ci0KLQlzd2l0Y2ggKGVjLT5pbnRyLmV4cGVjdF9ldmVudCkgewotCWNhc2UgQUNQSV9FQ19FVkVOVF9PQkY6Ci0JCWlmICghKHZhbHVlICYgQUNQSV9FQ19GTEFHX09CRikpCi0JCQlicmVhazsKLQkJZWMtPmludHIuZXhwZWN0X2V2ZW50ID0gMDsKLQkJd2FrZV91cCgmZWMtPmludHIud2FpdCk7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkU6Ci0JCWlmICgodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfSUJGKSkKLQkJCWJyZWFrOwotCQllYy0+aW50ci5leHBlY3RfZXZlbnQgPSAwOwotCQl3YWtlX3VwKCZlYy0+aW50ci53YWl0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CisJaWYgKCh2YWx1ZSAmIEFDUElfRUNfRkxBR19TQ0kpICYmICFhdG9taWNfcmVhZCgmZWMtPnF1ZXJ5X3BlbmRpbmcpKSB7CisJCWF0b21pY19zZXQoJmVjLT5xdWVyeV9wZW5kaW5nLCAxKTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfb3NfZXhlY3V0ZShPU0xfRUNfQlVSU1RfSEFORExFUiwgYWNwaV9lY19ncGVfcXVlcnksCisJCQkJICAgIGVjKTsKIAl9CiAKLQlpZiAodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfU0NJKSB7Ci0JCWF0b21pY19hZGQoMSwgJmVjLT5pbnRyLnBlbmRpbmdfZ3BlKTsKLQkJc3RhdHVzID0gYWNwaV9vc19leGVjdXRlKE9TTF9FQ19CVVJTVF9IQU5ETEVSLAotCQkJCQkJICAgICBhY3BpX2VjX2dwZV9xdWVyeSwgZWMpOwotCQlyZXR1cm4gc3RhdHVzID09IEFFX09LID8KLQkJICAgIEFDUElfSU5URVJSVVBUX0hBTkRMRUQgOiBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKLQl9Ci0JYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9JU1IpOwogCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPwogCSAgICBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CiB9CkBAIC04MzMsMjggKzQ3NywyNSBAQAogCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQogewogCWludCByZXN1bHQgPSAwOwotCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBOVUxMOwogCXU2NCB0ZW1wID0gKnZhbHVlOwogCWFjcGlfaW50ZWdlciBmX3YgPSAwOwogCWludCBpID0gMDsKIAotCiAJaWYgKChhZGRyZXNzID4gMHhGRikgfHwgIXZhbHVlIHx8ICFoYW5kbGVyX2NvbnRleHQpCiAJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOwogCiAJaWYgKGJpdF93aWR0aCAhPSA4ICYmIGFjcGlfc3RyaWN0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCi0JCSAgICAgICAiYWNwaV9lY19zcGFjZV9oYW5kbGVyOiBiaXRfd2lkdGggc2hvdWxkIGJlIDhcbiIpOwogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAl9CiAKLQllYyA9IGhhbmRsZXJfY29udGV4dDsKKwllYyA9IChzdHJ1Y3QgYWNwaV9lYyAqKWhhbmRsZXJfY29udGV4dDsKIAogICAgICAgbmV4dF9ieXRlOgogCXN3aXRjaCAoZnVuY3Rpb24pIHsKIAljYXNlIEFDUElfUkVBRDoKIAkJdGVtcCA9IDA7Ci0JCXJlc3VsdCA9IGFjcGlfZWNfcmVhZChlYywgKHU4KSBhZGRyZXNzLCAodTMyICopICYgdGVtcCk7CisJCXJlc3VsdCA9IGFjcGlfZWNfcmVhZChlYywgKHU4KSBhZGRyZXNzLCAodTggKikgJiB0ZW1wKTsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1dSSVRFOgogCQlyZXN1bHQgPSBhY3BpX2VjX3dyaXRlKGVjLCAodTgpIGFkZHJlc3MsICh1OCkgdGVtcCk7CkBAIC05MDUsMjAgKzU0NiwxNyBAQAogCiBzdGF0aWMgaW50IGFjcGlfZWNfcmVhZF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBzZXEtPnByaXZhdGU7Ci0KKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSAoc3RydWN0IGFjcGlfZWMgKilzZXEtPnByaXZhdGU7CiAKIAlpZiAoIWVjKQogCQlnb3RvIGVuZDsKIAotCXNlcV9wcmludGYoc2VxLCAiZ3BlIGJpdDogICAgICAgICAgICAgICAgIDB4JTAyeFxuIiwKLQkJICAgKHUzMikgZWMtPmNvbW1vbi5ncGVfYml0KTsKKwlzZXFfcHJpbnRmKHNlcSwgImdwZTogICAgICAgICAgICAgICAgIDB4JTAyeFxuIiwgKHUzMikgZWMtPmdwZSk7CiAJc2VxX3ByaW50ZihzZXEsICJwb3J0czogICAgICAgICAgICAgICAgICAgMHglMDJ4LCAweCUwMnhcbiIsCi0JCSAgICh1MzIpIGVjLT5jb21tb24uc3RhdHVzX2FkZHIuYWRkcmVzcywKLQkJICAgKHUzMikgZWMtPmNvbW1vbi5kYXRhX2FkZHIuYWRkcmVzcyk7CisJCSAgICh1MzIpIGVjLT5jb21tYW5kX2FkZHIsICh1MzIpIGVjLT5kYXRhX2FkZHIpOwogCXNlcV9wcmludGYoc2VxLCAidXNlIGdsb2JhbCBsb2NrOiAgICAgICAgICVzXG4iLAotCQkgICBlYy0+Y29tbW9uLmdsb2JhbF9sb2NrID8gInllcyIgOiAibm8iKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQkgICBlYy0+Z2xvYmFsX2xvY2sgPyAieWVzIiA6ICJubyIpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlLCBBQ1BJX05PVF9JU1IpOwogCiAgICAgICBlbmQ6CiAJcmV0dXJuIDA7CkBAIC05MjksNyArNTY3LDcgQEAKIAlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9lY19yZWFkX2luZm8sIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2VjX2luZm9fb3BzID0geworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9lY19pbmZvX29wcyA9IHsKIAkub3BlbiA9IGFjcGlfZWNfaW5mb19vcGVuX2ZzLAogCS5yZWFkID0gc2VxX3JlYWQsCiAJLmxsc2VlayA9IHNlcV9sc2VlaywKQEAgLTk0MSw3ICs1NzksNiBAQAogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOwogCi0KIAlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gcHJvY19ta2RpcihhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKIAkJCQkJCSAgICAgYWNwaV9lY19kaXIpOwpAQCAtOTc4LDMxICs2MTUsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IGFjcGlfZWNfcG9sbF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFjcGlfZWNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWludCByZXN1bHQgPSAwOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKLQorCXN0cnVjdCBhY3BpX2VjICplYyA9IE5VTEw7CiAKIAlpZiAoIWRldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllYyA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfZWMpLCBHRlBfS0VSTkVMKTsKKwllYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGVjLCAwLCBzaXplb2YodW5pb24gYWNwaV9lYykpOworCW1lbXNldChlYywgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSk7CiAKLQllYy0+Y29tbW9uLmhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwotCWVjLT5jb21tb24udWlkID0gLTE7Ci0JaW5pdF9NVVRFWCgmZWMtPnBvbGwuc2VtKTsKKwllYy0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CisJZWMtPnVpZCA9IC0xOworCW11dGV4X2luaXQoJmVjLT5sb2NrKTsKKwlhdG9taWNfc2V0KCZlYy0+cXVlcnlfcGVuZGluZywgMCk7CisJaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7CisJCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0LCAxKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZWMtPndhaXQpOworCX0KIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0VDX0RFVklDRV9OQU1FKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9FQ19DTEFTUyk7CiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gZWM7CiAKIAkvKiBVc2UgdGhlIGdsb2JhbCBsb2NrIGZvciBhbGwgRUMgdHJhbnNhY3Rpb25zPyAqLwotCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HTEsiLCBOVUxMLAotCQkJICAgICAgJmVjLT5jb21tb24uZ2xvYmFsX2xvY2spOworCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+aGFuZGxlLCAiX0dMSyIsIE5VTEwsICZlYy0+Z2xvYmFsX2xvY2spOwogCiAJLyogWFhYIHdlIGRvbid0IHRlc3QgdWlkcywgYmVjYXVzZSBvbiBzb21lIGJveGVzIGVjZHQgdWlkID0gMCwgc2VlOgogCSAgIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD02MTExICovCkBAIC0xMDExLDcgKzY1MSw3IEBACiAJCQkJCQkgIEFDUElfQURSX1NQQUNFX0VDLAogCQkJCQkJICAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKIAotCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwKKwkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Z3BlLAogCQkJCQkmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAKIAkJa2ZyZWUoZWNfZWNkdCk7CkBAIC0xMDE5LDExICs2NTksMTAgQEAKIAogCS8qIEdldCBHUEUgYml0IGFzc2lnbm1lbnQgKEVDIGV2ZW50cykuICovCiAJLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIF9HUEUgcmV0dXJuaW5nIGEgcGFja2FnZSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+Y29tbW9uLmhhbmRsZSwgIl9HUEUiLCBOVUxMLAotCQkJCSAgJmVjLT5jb21tb24uZ3BlX2JpdCk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5oYW5kbGUsICJfR1BFIiwgTlVMTCwgJmVjLT5ncGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiT2J0YWluaW5nIEdQRSBiaXQiKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJIk9idGFpbmluZyBHUEUgYml0IGFzc2lnbm1lbnQiKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTEwMzIsNzkgKzY3MSw5IEBACiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CiAKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoZ3BlICVkKSBwb2xsaW5nIG1vZGUuXG4iLAotCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCSAgICAgICAodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQpOwotCi0JaWYgKCFmaXJzdF9lYykKLQkJZmlyc3RfZWMgPSBkZXZpY2U7Ci0KLSAgICAgIGVuZDoKLQlpZiAocmVzdWx0KQotCQlrZnJlZShlYyk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotc3RhdGljIGludCBhY3BpX2VjX2ludHJfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWludCByZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKLQotCi0JaWYgKCFkZXZpY2UpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZWMgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGVjLCAwLCBzaXplb2YodW5pb24gYWNwaV9lYykpOwotCi0JZWMtPmNvbW1vbi5oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKLQllYy0+Y29tbW9uLnVpZCA9IC0xOwotCWF0b21pY19zZXQoJmVjLT5pbnRyLnBlbmRpbmdfZ3BlLCAwKTsKLQlhdG9taWNfc2V0KCZlYy0+aW50ci5sZWF2aW5nX2J1cnN0LCAxKTsKLQlpbml0X01VVEVYKCZlYy0+aW50ci5zZW0pOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjLT5pbnRyLndhaXQpOwotCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIEFDUElfRUNfREVWSUNFX05BTUUpOwotCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX0VDX0NMQVNTKTsKLQlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBlYzsKLQotCS8qIFVzZSB0aGUgZ2xvYmFsIGxvY2sgZm9yIGFsbCBFQyB0cmFuc2FjdGlvbnM/ICovCi0JYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dMSyIsIE5VTEwsCi0JCQkgICAgICAmZWMtPmNvbW1vbi5nbG9iYWxfbG9jayk7Ci0KLQkvKiBYWFggd2UgZG9uJ3QgdGVzdCB1aWRzLCBiZWNhdXNlIG9uIHNvbWUgYm94ZXMgZWNkdCB1aWQgPSAwLCBzZWU6Ci0JICAgaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTYxMTEgKi8KLQlpZiAoZWNfZWNkdCkgewotCQlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKLQkJCQkJCSAgQUNQSV9BRFJfU1BBQ0VfRUMsCi0JCQkJCQkgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOwotCi0JCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAotCQkJCQkmYWNwaV9lY19ncGVfaGFuZGxlcik7Ci0KLQkJa2ZyZWUoZWNfZWNkdCk7Ci0JfQotCi0JLyogR2V0IEdQRSBiaXQgYXNzaWdubWVudCAoRUMgZXZlbnRzKS4gKi8KLQkvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgX0dQRSByZXR1cm5pbmcgYSBwYWNrYWdlICovCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGVjLT5jb21tb24uaGFuZGxlLCAiX0dQRSIsIE5VTEwsCi0JCQkJICAmZWMtPmNvbW1vbi5ncGVfYml0KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiT2J0YWluaW5nIEdQRSBiaXQgYXNzaWdubWVudFxuIik7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCWdvdG8gZW5kOwotCX0KLQotCXJlc3VsdCA9IGFjcGlfZWNfYWRkX2ZzKGRldmljZSk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7Ci0KLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoZ3BlICVkKSBpbnRlcnJ1cHQgbW9kZS5cbiIsCi0JICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JICAgICAgICh1MzIpIGVjLT5jb21tb24uZ3BlX2JpdCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiJXMgWyVzXSAoZ3BlICVkKSBpbnRlcnJ1cHQgbW9kZS4iLAorCQkJICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAorCQkJICAodTMyKSBlYy0+Z3BlKSk7CiAKIAlpZiAoIWZpcnN0X2VjKQogCQlmaXJzdF9lYyA9IGRldmljZTsKQEAgLTExMTgsOCArNjg3LDcgQEAKIAogc3RhdGljIGludCBhY3BpX2VjX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOwotCisJc3RydWN0IGFjcGlfZWMgKmVjID0gTlVMTDsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExMzYsOCArNzA0LDcgQEAKIHN0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9lY19pb19wb3J0cyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCiB7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBjb250ZXh0OwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqYWRkcjsKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSAoc3RydWN0IGFjcGlfZWMgKiljb250ZXh0OwogCiAJaWYgKHJlc291cmNlLT50eXBlICE9IEFDUElfUkVTT1VSQ0VfVFlQRV9JTykgewogCQlyZXR1cm4gQUVfT0s7CkBAIC0xMTQ4LDI3ICs3MTUsMjEgQEAKIAkgKiB0aGUgc2Vjb25kIGFkZHJlc3MgcmVnaW9uIHJldHVybmVkIGlzIHRoZSBzdGF0dXMvY29tbWFuZAogCSAqIHBvcnQuCiAJICovCi0JaWYgKGVjLT5jb21tb24uZGF0YV9hZGRyLnJlZ2lzdGVyX2JpdF93aWR0aCA9PSAwKSB7Ci0JCWFkZHIgPSAmZWMtPmNvbW1vbi5kYXRhX2FkZHI7Ci0JfSBlbHNlIGlmIChlYy0+Y29tbW9uLmNvbW1hbmRfYWRkci5yZWdpc3Rlcl9iaXRfd2lkdGggPT0gMCkgewotCQlhZGRyID0gJmVjLT5jb21tb24uY29tbWFuZF9hZGRyOworCWlmIChlYy0+ZGF0YV9hZGRyID09IDApIHsKKwkJZWMtPmRhdGFfYWRkciA9IHJlc291cmNlLT5kYXRhLmlvLm1pbmltdW07CisJfSBlbHNlIGlmIChlYy0+Y29tbWFuZF9hZGRyID09IDApIHsKKwkJZWMtPmNvbW1hbmRfYWRkciA9IHJlc291cmNlLT5kYXRhLmlvLm1pbmltdW07CiAJfSBlbHNlIHsKIAkJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOwogCX0KIAotCWFkZHItPmFkZHJlc3Nfc3BhY2VfaWQgPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU87Ci0JYWRkci0+cmVnaXN0ZXJfYml0X3dpZHRoID0gODsKLQlhZGRyLT5yZWdpc3Rlcl9iaXRfb2Zmc2V0ID0gMDsKLQlhZGRyLT5hZGRyZXNzID0gcmVzb3VyY2UtPmRhdGEuaW8ubWluaW11bTsKLQogCXJldHVybiBBRV9PSzsKIH0KIAogc3RhdGljIGludCBhY3BpX2VjX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZWMgKmVjID0gTlVMTDsKLQorCXN0cnVjdCBhY3BpX2VjICplYyA9IE5VTEw7CiAKIAlpZiAoIWRldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTgxLDQwICs3NDIsMzUgQEAKIAkvKgogCSAqIEdldCBJL08gcG9ydCBhZGRyZXNzZXMuIENvbnZlcnQgdG8gR0FTIGZvcm1hdC4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGVjLT5jb21tb24uaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAorCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoZWMtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKIAkJCQkgICAgIGFjcGlfZWNfaW9fcG9ydHMsIGVjKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykKLQkgICAgfHwgZWMtPmNvbW1vbi5jb21tYW5kX2FkZHIucmVnaXN0ZXJfYml0X3dpZHRoID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgZ2V0dGluZyBJL08gcG9ydCBhZGRyZXNzZXNcbiIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCBlYy0+Y29tbWFuZF9hZGRyID09IDApIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiRXJyb3IgZ2V0dGluZyBJL08gcG9ydCBhZGRyZXNzZXMiKSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVjLT5jb21tb24uc3RhdHVzX2FkZHIgPSBlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcjsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImdwZT0weCUwMngsIHBvcnRzPTB4JTJ4LDB4JTJ4XG4iLAotCQkJICAodTMyKSBlYy0+Y29tbW9uLmdwZV9iaXQsCi0JCQkgICh1MzIpIGVjLT5jb21tb24uY29tbWFuZF9hZGRyLmFkZHJlc3MsCi0JCQkgICh1MzIpIGVjLT5jb21tb24uZGF0YV9hZGRyLmFkZHJlc3MpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJncGU9MHglMDJseCwgcG9ydHM9MHglMmx4LDB4JTJseCIsCisJCQkgIGVjLT5ncGUsIGVjLT5jb21tYW5kX2FkZHIsIGVjLT5kYXRhX2FkZHIpKTsKIAogCS8qCiAJICogSW5zdGFsbCBHUEUgaGFuZGxlcgogCSAqLwotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcihOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKE5VTEwsIGVjLT5ncGUsCiAJCQkJCSAgQUNQSV9HUEVfRURHRV9UUklHR0VSRUQsCiAJCQkJCSAgJmFjcGlfZWNfZ3BlX2hhbmRsZXIsIGVjKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWFjcGlfc2V0X2dwZV90eXBlKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCWFjcGlfc2V0X2dwZV90eXBlKE5VTEwsIGVjLT5ncGUsIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7CisJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGUsIEFDUElfTk9UX0lTUik7CiAKLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGVjLT5jb21tb24uaGFuZGxlLAorCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoZWMtPmhhbmRsZSwKIAkJCQkJCSAgICBBQ1BJX0FEUl9TUEFDRV9FQywKIAkJCQkJCSAgICAmYWNwaV9lY19zcGFjZV9oYW5kbGVyLAogCQkJCQkJICAgICZhY3BpX2VjX3NwYWNlX3NldHVwLCBlYyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjLT5jb21tb24uZ3BlX2JpdCwKLQkJCQkJJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOworCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlYy0+Z3BlLCAmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTIyNCwyMyArNzgwLDIwIEBACiBzdGF0aWMgaW50IGFjcGlfZWNfc3RvcChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOwotCisJc3RydWN0IGFjcGlfZWMgKmVjID0gTlVMTDsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCi0Jc3RhdHVzID0gYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGVjLT5jb21tb24uaGFuZGxlLAorCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihlYy0+aGFuZGxlLAogCQkJCQkJICAgQUNQSV9BRFJfU1BBQ0VfRUMsCiAJCQkJCQkgICAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmNvbW1vbi5ncGVfYml0LAotCQkJCSAgICAmYWNwaV9lY19ncGVfaGFuZGxlcik7CisJc3RhdHVzID0gYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmdwZSwgJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTEyNTEsNzYgKzgwNCwyOSBAQAogYWNwaV9mYWtlX2VjZHRfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAogCQkJdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKQogewotCi0JaWYgKGFjcGlfZWNfcG9sbF9tb2RlKQotCQlyZXR1cm4gYWNwaV9mYWtlX2VjZHRfcG9sbF9jYWxsYmFjayhoYW5kbGUsCi0JCQkJCQkgICAgICAgTGV2ZWwsIGNvbnRleHQsIHJldHZhbCk7Ci0JZWxzZQotCQlyZXR1cm4gYWNwaV9mYWtlX2VjZHRfaW50cl9jYWxsYmFjayhoYW5kbGUsCi0JCQkJCQkgICAgIExldmVsLCBjb250ZXh0LCByZXR2YWwpOwotfQotCi1zdGF0aWMgYWNwaV9zdGF0dXMgX19pbml0Ci1hY3BpX2Zha2VfZWNkdF9wb2xsX2NhbGxiYWNrKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCQl1MzIgTGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCi17CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCisJbXV0ZXhfaW5pdCgmZWNfZWNkdC0+bG9jayk7CisJaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPndhaXQpOworCX0KIAlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKIAkJCQkgICAgIGFjcGlfZWNfaW9fcG9ydHMsIGVjX2VjZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIHN0YXR1czsKLQllY19lY2R0LT5jb21tb24uc3RhdHVzX2FkZHIgPSBlY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyOwogCi0JZWNfZWNkdC0+Y29tbW9uLnVpZCA9IC0xOwotCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfVUlEIiwgTlVMTCwgJmVjX2VjZHQtPmNvbW1vbi51aWQpOworCWVjX2VjZHQtPnVpZCA9IC0xOworCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfVUlEIiwgTlVMTCwgJmVjX2VjZHQtPnVpZCk7CiAKLQlzdGF0dXMgPQotCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dQRSIsIE5VTEwsCi0JCQkJICAmZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQpOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfR1BFIiwgTlVMTCwgJmVjX2VjZHQtPmdwZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gc3RhdHVzOwotCWluaXRfTVVURVgoJmVjX2VjZHQtPnBvbGwuc2VtKTsKLQllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwotCWVjX2VjZHQtPmNvbW1vbi5oYW5kbGUgPSBoYW5kbGU7CisJZWNfZWNkdC0+Z2xvYmFsX2xvY2sgPSBUUlVFOworCWVjX2VjZHQtPmhhbmRsZSA9IGhhbmRsZTsKIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJHUEU9MHglMDJ4LCBwb3J0cz0weCUyeCwgMHglMnhcbiIsCi0JICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LAotCSAgICAgICAodTMyKSBlY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyLmFkZHJlc3MsCi0JICAgICAgICh1MzIpIGVjX2VjZHQtPmNvbW1vbi5kYXRhX2FkZHIuYWRkcmVzcyk7Ci0KLQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfZmFrZV9lY2R0X2ludHJfY2FsbGJhY2soYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJICAgICAgdTMyIExldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dmFsKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCWluaXRfTVVURVgoJmVjX2VjZHQtPmludHIuc2VtKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT5pbnRyLndhaXQpOwotCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQkJCSAgICAgYWNwaV9lY19pb19wb3J0cywgZWNfZWNkdCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gc3RhdHVzOwotCWVjX2VjZHQtPmNvbW1vbi5zdGF0dXNfYWRkciA9IGVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHI7Ci0KLQllY19lY2R0LT5jb21tb24udWlkID0gLTE7Ci0JYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9VSUQiLCBOVUxMLCAmZWNfZWNkdC0+Y29tbW9uLnVpZCk7Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dQRSIsIE5VTEwsCi0JCQkJICAmZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIHN0YXR1czsKLQllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwotCWVjX2VjZHQtPmNvbW1vbi5oYW5kbGUgPSBoYW5kbGU7Ci0KLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiR1BFPTB4JTAyeCwgcG9ydHM9MHglMngsIDB4JTJ4XG4iLAotCSAgICAgICAodTMyKSBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwKLQkgICAgICAgKHUzMikgZWNfZWNkdC0+Y29tbW9uLmNvbW1hbmRfYWRkci5hZGRyZXNzLAotCSAgICAgICAodTMyKSBlY19lY2R0LT5jb21tb24uZGF0YV9hZGRyLmFkZHJlc3MpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkdQRT0weCUwMmx4LCBwb3J0cz0weCUybHgsIDB4JTJseCIsCisJCQkgIGVjX2VjZHQtPmdwZSwgZWNfZWNkdC0+Y29tbWFuZF9hZGRyLAorCQkJICBlY19lY2R0LT5kYXRhX2FkZHIpKTsKIAogCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKIH0KQEAgLTEzNDAsMTQgKzg0NiwxNCBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlpbnQgcmV0ID0gMDsKIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJUcnkgdG8gbWFrZSBhbiBmYWtlIEVDRFRcbiIpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlRyeSB0byBtYWtlIGFuIGZha2UgRUNEVCIpKTsKIAotCWVjX2VjZHQgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7CisJZWNfZWNkdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlY19lY2R0KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQotCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2YodW5pb24gYWNwaV9lYykpOworCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfZWMpKTsKIAogCXN0YXR1cyA9IGFjcGlfZ2V0X2RldmljZXMoQUNQSV9FQ19ISUQsCiAJCQkJICBhY3BpX2Zha2VfZWNkdF9jYWxsYmFjaywgTlVMTCwgTlVMTCk7CkBAIC0xMzU1LDI0ICs4NjEsMTYgQEAKIAkJa2ZyZWUoZWNfZWNkdCk7CiAJCWVjX2VjZHQgPSBOVUxMOwogCQlyZXQgPSAtRU5PREVWOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ2FuJ3QgbWFrZSBhbiBmYWtlIEVDRFQiKSk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCXJldHVybiAwOwogICAgICAgZXJyb3I6Ci0JcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2FuJ3QgbWFrZSBhbiBmYWtlIEVDRFRcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfZ2V0X3JlYWxfZWNkdCh2b2lkKQogewotCWlmIChhY3BpX2VjX3BvbGxfbW9kZSkKLQkJcmV0dXJuIGFjcGlfZWNfcG9sbF9nZXRfcmVhbF9lY2R0KCk7Ci0JZWxzZQotCQlyZXR1cm4gYWNwaV9lY19pbnRyX2dldF9yZWFsX2VjZHQoKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19wb2xsX2dldF9yZWFsX2VjZHQodm9pZCkKLXsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfdGFibGVfZWNkdCAqZWNkdF9wdHI7CiAKQEAgLTEzODIsODAgKzg4MCwzNSBAQAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiRm91bmQgRUNEVFxuIik7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgRUNEVCIpKTsKIAogCS8qCiAJICogR2VuZXJhdGUgYSB0ZW1wb3JhcnkgZWMgY29udGV4dCB0byB1c2UgdW50aWwgdGhlIG5hbWVzcGFjZSBpcyBzY2FubmVkCiAJICovCi0JZWNfZWNkdCA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfZWMpLCBHRlBfS0VSTkVMKTsKKwllY19lY2R0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVjX2VjZHQpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2YodW5pb24gYWNwaV9lYykpOworCW1lbXNldChlY19lY2R0LCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfZWMpKTsKIAotCWVjX2VjZHQtPmNvbW1vbi5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKLQllY19lY2R0LT5jb21tb24uc3RhdHVzX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKLQllY19lY2R0LT5jb21tb24uZGF0YV9hZGRyID0gZWNkdF9wdHItPmVjX2RhdGE7Ci0JZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQgPSBlY2R0X3B0ci0+Z3BlX2JpdDsKLQlpbml0X01VVEVYKCZlY19lY2R0LT5wb2xsLnNlbSk7CisJbXV0ZXhfaW5pdCgmZWNfZWNkdC0+bG9jayk7CisJaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPndhaXQpOworCX0KKwllY19lY2R0LT5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbC5hZGRyZXNzOworCWVjX2VjZHQtPmRhdGFfYWRkciA9IGVjZHRfcHRyLT5lY19kYXRhLmFkZHJlc3M7CisJZWNfZWNkdC0+Z3BlID0gZWNkdF9wdHItPmdwZV9iaXQ7CiAJLyogdXNlIHRoZSBHTCBqdXN0IHRvIGJlIHNhZmUgKi8KLQllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwotCWVjX2VjZHQtPmNvbW1vbi51aWQgPSBlY2R0X3B0ci0+dWlkOworCWVjX2VjZHQtPmdsb2JhbF9sb2NrID0gVFJVRTsKKwllY19lY2R0LT51aWQgPSBlY2R0X3B0ci0+dWlkOwogCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGVjZHRfcHRyLT5lY19pZCwgJmVjX2VjZHQtPmNvbW1vbi5oYW5kbGUpOworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+ZWNfaWQsICZlY19lY2R0LT5oYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGVycm9yOwogCX0KIAogCXJldHVybiAwOwogICAgICAgZXJyb3I6Ci0JcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ291bGQgbm90IHVzZSBFQ0RUXG4iKTsKLQlrZnJlZShlY19lY2R0KTsKLQllY19lY2R0ID0gTlVMTDsKLQotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2ludHJfZ2V0X3JlYWxfZWNkdCh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9lY2R0ICplY2R0X3B0cjsKLQotCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJFQ0RUIiwgMSwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCi0JCQkJCSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKQotCQkJCQkgJmVjZHRfcHRyKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkZvdW5kIEVDRFRcbiIpOwotCi0JLyoKLQkgKiBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBlYyBjb250ZXh0IHRvIHVzZSB1bnRpbCB0aGUgbmFtZXNwYWNlIGlzIHNjYW5uZWQKLQkgKi8KLQllY19lY2R0ID0ga21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9lYyksIEdGUF9LRVJORUwpOwotCWlmICghZWNfZWNkdCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGVjX2VjZHQsIDAsIHNpemVvZih1bmlvbiBhY3BpX2VjKSk7Ci0KLQlpbml0X01VVEVYKCZlY19lY2R0LT5pbnRyLnNlbSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZWNfZWNkdC0+aW50ci53YWl0KTsKLQllY19lY2R0LT5jb21tb24uY29tbWFuZF9hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7Ci0JZWNfZWNkdC0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7Ci0JZWNfZWNkdC0+Y29tbW9uLmRhdGFfYWRkciA9IGVjZHRfcHRyLT5lY19kYXRhOwotCWVjX2VjZHQtPmNvbW1vbi5ncGVfYml0ID0gZWNkdF9wdHItPmdwZV9iaXQ7Ci0JLyogdXNlIHRoZSBHTCBqdXN0IHRvIGJlIHNhZmUgKi8KLQllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwotCWVjX2VjZHQtPmNvbW1vbi51aWQgPSBlY2R0X3B0ci0+dWlkOwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGVjZHRfcHRyLT5lY19pZCwgJmVjX2VjZHQtPmNvbW1vbi5oYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGVycm9yOwotCX0KLQotCXJldHVybiAwOwotICAgICAgZXJyb3I6Ci0JcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ291bGQgbm90IHVzZSBFQ0RUXG4iKTsKKwlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ291bGQgbm90IHVzZSBFQ0RUIikpOwogCWtmcmVlKGVjX2VjZHQpOwogCWVjX2VjZHQgPSBOVUxMOwogCkBAIC0xNDgwLDE0ICs5MzMsMTQgQEAKIAkvKgogCSAqIEluc3RhbGwgR1BFIGhhbmRsZXIKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmdwZSwKIAkJCQkJICBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCwKIAkJCQkJICAmYWNwaV9lY19ncGVfaGFuZGxlciwgZWNfZWNkdCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWFjcGlfc2V0X2dwZV90eXBlKE5VTEwsIGVjX2VjZHQtPmNvbW1vbi5ncGVfYml0LCBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOwotCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlY19lY2R0LT5jb21tb24uZ3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwlhY3BpX3NldF9ncGVfdHlwZShOVUxMLCBlY19lY2R0LT5ncGUsIEFDUElfR1BFX1RZUEVfUlVOVElNRSk7CisJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjX2VjZHQtPmdwZSwgQUNQSV9OT1RfSVNSKTsKIAogCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKIAkJCQkJCSAgICBBQ1BJX0FEUl9TUEFDRV9FQywKQEAgLTE0OTUsNyArOTQ4LDcgQEAKIAkJCQkJCSAgICAmYWNwaV9lY19zcGFjZV9zZXR1cCwKIAkJCQkJCSAgICBlY19lY2R0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoTlVMTCwgZWNfZWNkdC0+Y29tbW9uLmdwZV9iaXQsCisJCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmdwZSwKIAkJCQkJJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTE1MDMsNyArOTU2LDcgQEAKIAlyZXR1cm4gMDsKIAogICAgICAgZXJyb3I6Ci0JcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ291bGQgbm90IHVzZSBFQ0RUXG4iKTsKKwlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ291bGQgbm90IHVzZSBFQ0RUIikpOwogCWtmcmVlKGVjX2VjZHQpOwogCWVjX2VjZHQgPSBOVUxMOwogCkBAIC0xNTE0LDcgKzk2Nyw2IEBACiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKIApAQCAtMTU2MiwxMyArMTAxNCwxNCBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChpbnRyKSB7Ci0JCWFjcGlfZWNfcG9sbF9tb2RlID0gRUNfSU5UUjsKLQkJYWNwaV9lY19kcml2ZXIub3BzLmFkZCA9IGFjcGlfZWNfaW50cl9hZGQ7CisJCWFjcGlfZWNfbW9kZSA9IEVDX0lOVFI7CiAJfSBlbHNlIHsKLQkJYWNwaV9lY19wb2xsX21vZGUgPSBFQ19QT0xMOwotCQlhY3BpX2VjX2RyaXZlci5vcHMuYWRkID0gYWNwaV9lY19wb2xsX2FkZDsKKwkJYWNwaV9lY19tb2RlID0gRUNfUE9MTDsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkVDICVzIG1vZGUuXG4iLCBpbnRyID8gImludGVycnVwdCIgOiAicG9sbGluZyIpOworCWFjcGlfZWNfZHJpdmVyLm9wcy5hZGQgPSBhY3BpX2VjX2FkZDsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJFQyAlcyBtb2RlLlxuIiwKKwkJCSAgaW50ciA/ICJpbnRlcnJ1cHQiIDogInBvbGxpbmciKSk7CisKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKaW5kZXggNmVlZjRlZi4uYmY2M2VkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCkBAIC0zMzEsNyArMzMxLDYgQEAKIHN0YXRpYyB1MzIgYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQgKmNvbnRleHQpCiB7CiAJdTggYWNxdWlyZWQgPSBGQUxTRTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAkvKgogCSAqIEF0dGVtcHQgdG8gZ2V0IHRoZSBsb2NrCkBAIC0zNDIsMjAgKzM0MSw4IEBACiAJaWYgKGFjcXVpcmVkKSB7CiAKIAkJLyogR290IHRoZSBsb2NrLCBub3cgd2FrZSBhbGwgdGhyZWFkcyB3YWl0aW5nIGZvciBpdCAqLwotCiAJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkID0gVFJVRTsKLQotCQkvKiBSdW4gdGhlIEdsb2JhbCBMb2NrIHRocmVhZCB3aGljaCB3aWxsIHNpZ25hbCBhbGwgd2FpdGluZyB0aHJlYWRzICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfb3NfZXhlY3V0ZShPU0xfR0xPQkFMX0xPQ0tfSEFORExFUiwKLQkJCQkgICAgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQsIGNvbnRleHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJDb3VsZCBub3QgcXVldWUgR2xvYmFsIExvY2sgdGhyZWFkIikpOwotCi0JCQlyZXR1cm4gKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKLQkJfQorCQlhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZChjb250ZXh0KTsKIAl9CiAKIAlyZXR1cm4gKEFDUElfSU5URVJSVVBUX0hBTkRMRUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCmluZGV4IDViM2M3YTguLjIwM2QxMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKQEAgLTIyNSwxMyArMjI1LDEyIEBACiAJCQkJaWYgKCEKIAkJCQkgICAgKEFDUElfU1RSTkNNUAogCQkJCSAgICAgKG9iamVjdF9oSUQudmFsdWUsIFBDSV9ST09UX0hJRF9TVFJJTkcsCi0JCQkJICAgICAgc2l6ZW9mKFBDSV9ST09UX0hJRF9TVFJJTkcpKQotCQkJCSAgICAgfHwKLQkJCQkgICAgICEoQUNQSV9TVFJOQ01QCi0JCQkJICAgICAgIChvYmplY3RfaElELnZhbHVlLAotCQkJCQlQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcsCi0JCQkJCXNpemVvZihQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpKSkpKQotCQkJCXsKKwkJCQkgICAgICBzaXplb2YoUENJX1JPT1RfSElEX1NUUklORykpKQorCQkJCSAgICB8fAorCQkJCSAgICAhKEFDUElfU1RSTkNNUAorCQkJCSAgICAgIChvYmplY3RfaElELnZhbHVlLAorCQkJCSAgICAgICBQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcsCisJCQkJICAgICAgIHNpemVvZihQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpKSkpIHsKIAogCQkJCQkvKiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgdGhpcyBQQ0kgcm9vdCBicmlkZ2UgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKaW5kZXggM2EzOWMyZS4uYmY5MGYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCkBAIC0yNjYsMTAgKzI2NiwxMCBAQAogCSAgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpCiAJICAgICYmIChvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXggIT0gQUNQSV9HTE9CQUxfTE9DSykpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiVGhyZWFkICVYIGNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10gYWNxdWlyZWQgYnkgdGhyZWFkICVYIiwKLQkJCSAgICAodTMyKSB3YWxrX3N0YXRlLT50aHJlYWQtPnRocmVhZF9pZCwKKwkJCSAgICAiVGhyZWFkICVsWCBjYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdIGFjcXVpcmVkIGJ5IHRocmVhZCAlbFgiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKXdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkLAogCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSksCi0JCQkgICAgKHUzMikgb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkKSk7CisJCQkgICAgKHVuc2lnbmVkIGxvbmcpb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9UX09XTkVSKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IGJhNTY4NmYuLjhhMDMyNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMTg5LDggKzE4OSwxMiBAQAogCWJ1cyA9IHRtcDsKIAogCWlmIChzZWcgPT0gZmluZC0+c2VnICYmIGJ1cyA9PSBmaW5kLT5idXMpCisJewogCQlmaW5kLT5oYW5kbGUgPSBoYW5kbGU7Ci0Jc3RhdHVzID0gQUVfT0s7CisJCXN0YXR1cyA9IEFFX0NUUkxfVEVSTUlOQVRFOworCX0KKwllbHNlCisJCXN0YXR1cyA9IEFFX09LOwogICAgICAgZXhpdDoKIAlrZnJlZShidWZmZXIucG9pbnRlcik7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTI2Nyw5ICsyNzEsOSBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCWlmIChkZXYtPmZpcm13YXJlX2RhdGEpIHsKKwlpZiAoZGV2LT5hcmNoZGF0YS5hY3BpX2hhbmRsZSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAotCQkgICAgICAgIkRyaXZlcnMgY2hhbmdlZCAnZmlybXdhcmVfZGF0YScgZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJCSAgICAgICAiRHJpdmVycyBjaGFuZ2VkICdhY3BpX2hhbmRsZScgZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlnZXRfZGV2aWNlKGRldik7CkBAIC0yNzgsMjUgKzI4MiwyNiBAQAogCQlwdXRfZGV2aWNlKGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlkZXYtPmZpcm13YXJlX2RhdGEgPSBoYW5kbGU7CisJZGV2LT5hcmNoZGF0YS5hY3BpX2hhbmRsZSA9IGhhbmRsZTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFjcGlfdW5iaW5kX29uZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKCFkZXYtPmZpcm13YXJlX2RhdGEpCisJaWYgKCFkZXYtPmFyY2hkYXRhLmFjcGlfaGFuZGxlKQogCQlyZXR1cm4gMDsKLQlpZiAoZGV2ID09IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShkZXYtPmZpcm13YXJlX2RhdGEpKSB7CisJaWYgKGRldiA9PSBhY3BpX2dldF9waHlzaWNhbF9kZXZpY2UoZGV2LT5hcmNoZGF0YS5hY3BpX2hhbmRsZSkpIHsKIAkJLyogYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlIGluY3JlYXNlIHJlZmNudCBieSBvbmUgKi8KIAkJcHV0X2RldmljZShkZXYpOwotCQlhY3BpX2RldGFjaF9kYXRhKGRldi0+ZmlybXdhcmVfZGF0YSwgYWNwaV9nbHVlX2RhdGFfaGFuZGxlcik7Ci0JCWRldi0+ZmlybXdhcmVfZGF0YSA9IE5VTEw7CisJCWFjcGlfZGV0YWNoX2RhdGEoZGV2LT5hcmNoZGF0YS5hY3BpX2hhbmRsZSwKKwkJCQkgYWNwaV9nbHVlX2RhdGFfaGFuZGxlcik7CisJCWRldi0+YXJjaGRhdGEuYWNwaV9oYW5kbGUgPSBOVUxMOwogCQkvKiBhY3BpX2JpbmRfb25lIGluY3JlYXNlIHJlZmNudCBieSBvbmUgKi8KIAkJcHV0X2RldmljZShkZXYpOwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKLQkJICAgICAgICJPb3BzLCAnZmlybXdhcmVfZGF0YScgY29ycnVwdCBmb3IgJXNcbiIsIGRldi0+YnVzX2lkKTsKKwkJICAgICAgICJPb3BzLCAnYWNwaV9oYW5kbGUnIGNvcnJ1cHQgZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzI4LDcgKzMzMyw4IEBACiAJaWYgKCFyZXQpIHsKIAkJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAotCQlhY3BpX2dldF9uYW1lKGRldi0+ZmlybXdhcmVfZGF0YSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKKwkJYWNwaV9nZXRfbmFtZShkZXYtPmFyY2hkYXRhLmFjcGlfaGFuZGxlLAorCQkJICAgICAgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKIAkJREJHKCJEZXZpY2UgJXMgLT4gJXNcbiIsIGRldi0+YnVzX2lkLCAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKIAkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwppbmRleCA2ZmJiNDIwLi4xZTdhYmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEJvcmlzbGF2IERlaWFub3YgPGJvcmlzbGF2QHVzZXJzLnNmLm5ldD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgSGVucmlxdWUgZGUgTW9yYWVzIEhvbHNjaHVoIDxobWhAaG1oLmVuZy5icj4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTksMTAgKzIwLDE0IEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKLSNkZWZpbmUgSUJNX1ZFUlNJT04gIjAuMTJhIgorI2RlZmluZSBJQk1fVkVSU0lPTiAiMC4xMyIKIAogLyoKICAqICBDaGFuZ2Vsb2c6CisgKgorICogIDIwMDYtMTEtMjIJMC4xMwluZXcgbWFpbnRhaW5lcgorICogIAkJCWNoYW5nZWxvZyBub3cgbGl2ZXMgaW4gZ2l0IGNvbW1pdCBoaXN0b3J5LCBhbmQgd2lsbAorICogIAkJCW5vdCBiZSB1cGRhdGVkIGZ1cnRoZXIgaW4tZmlsZS4KICAqICAKICAqICAyMDA1LTA4LTE3ICAwLjEyCWZpeCBjb21waWxhdGlvbiBvbiAyLjYuMTMtcmMga2VybmVscwogICogIDIwMDUtMDMtMTcJMC4xMQlzdXBwb3J0IGZvciA2MDBlLCA3NzB4CkBAIC03Nyw5ICs4MiwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIApAQCAtODgsNyArMTAwLDcgQEAKICNkZWZpbmUgSUJNX0ZJTEUgImlibV9hY3BpIgogI2RlZmluZSBJQk1fVVJMICJodHRwOi8vaWJtLWFjcGkuc2YubmV0LyIKIAotTU9EVUxFX0FVVEhPUigiQm9yaXNsYXYgRGVpYW5vdiIpOworTU9EVUxFX0FVVEhPUigiQm9yaXNsYXYgRGVpYW5vdiwgSGVucmlxdWUgZGUgTW9yYWVzIEhvbHNjaHVoIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oSUJNX0RFU0MpOwogTU9EVUxFX1ZFUlNJT04oSUJNX1ZFUlNJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMTE2LDI4ICsxMjgsNiBAQAogCXN0YXRpYyBjaGFyICAgICAgICAqb2JqZWN0IyNfcGF0aDsJCQlcCiAJc3RhdGljIGNoYXIgICAgICAgICpvYmplY3QjI19wYXRoc1tdID0geyBwYXRocyB9CiAKLS8qCi0gKiBUaGUgZm9sbG93aW5nIG1vZGVscyBhcmUgc3VwcG9ydGVkIHRvIHZhcmlvdXMgZGVncmVlczoKLSAqCi0gKiA1NzAsIDYwMGUsIDYwMHgsIDc3MGUsIDc3MHgKLSAqIEEyMG0sIEEyMWUsIEEyMW0sIEEyMXAsIEEyMnAsIEEzMCwgQTMwcCwgQTMxLCBBMzFwCi0gKiBHNDAsIEc0MQotICogUjMwLCBSMzEsIFIzMiwgUjQwLCBSNDBlLCBSNTAsIFI1MGUsIFI1MHAsIFI1MQotICogVDIwLCBUMjEsIFQyMiwgVDIzLCBUMzAsIFQ0MCwgVDQwcCwgVDQxLCBUNDFwLCBUNDIsIFQ0MnAsIFQ0MwotICogWDIwLCBYMjEsIFgyMiwgWDIzLCBYMjQsIFgzMCwgWDMxLCBYNDAKLSAqCi0gKiBUaGUgZm9sbG93aW5nIG1vZGVscyBoYXZlIG5vIHN1cHBvcnRlZCBmZWF0dXJlczoKLSAqCi0gKiAyNDAsIDI0MHgsIGkxNDAwCi0gKgotICogU3RpbGwgbWlzc2luZyBEU0RUcyBmb3IgdGhlIGZvbGxvd2luZyBtb2RlbHM6Ci0gKgotICogQTIwcCwgQTIyZSwgQTIybQotICogUjUyCi0gKiBTMzEKLSAqIFQ0M3AKLSAqLwotCiBJQk1fSEFORExFKGVjLCByb290LCAiXFxfU0IuUENJMC5JU0EuRUMwIiwJLyogMjQwLCAyNDB4ICovCiAJICAgIlxcX1NCLlBDSS5JU0EuRUMiLAkvKiA1NzAgKi8KIAkgICAiXFxfU0IuUENJMC5JU0EwLkVDMCIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLwpAQCAtMTY3LDggKzE1NywxMCBAQAogCSAgICJcXF9TQi5QQ0kuSVNBLlNMQ0UiLAkvKiA1NzAgKi8KICAgICApOwkJCQkvKiBBMjFlLEc0eCxSMzAsUjMxLFIzMixSNDAsUjQwZSxSNTBlICovCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQUNQSV9JQk1fQkFZCiBJQk1fSEFORExFKGJheSwgcm9vdCwgIlxcX1NCLlBDSS5JREUuU0VDTi5NQVNUIiwJLyogNTcwICovCiAJICAgIlxcX1NCLlBDSTAuSURFMC5JREVTLklEU00iLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkgICAiXFxfU0IuUENJMC5TQVRBLlNDTkQuTVNUUiIsCS8qIFQ2MCwgWDYwLCBaNjAgKi8gCiAJICAgIlxcX1NCLlBDSTAuSURFMC5TQ05ELk1TVFIiLAkvKiBhbGwgb3RoZXJzICovCiAgICAgKTsJCQkJLyogQTIxZSwgUjMwLCBSMzEgKi8KIApAQCAtMTgzLDYgKzE3NSw3IEBACiBJQk1fSEFORExFKGJheTJfZWosIGJheTIsICJfRUozIiwJLyogNjAwZS94LCA3NzBlLCBBM3ggKi8KIAkgICAiX0VKMCIsCQkvKiA3NzB4ICovCiAgICAgKTsJCQkJLyogYWxsIG90aGVycyAqLworI2VuZGlmCiAKIC8qIGRvbid0IGxpc3Qgb3RoZXIgYWx0ZXJuYXRpdmVzIGFzIHdlIGluc3RhbGwgYSBub3RpZnkgaGFuZGxlciBvbiB0aGUgNTcwICovCiBJQk1fSEFORExFKHBjaSwgcm9vdCwgIlxcX1NCLlBDSSIpOwkvKiA1NzAgKi8KQEAgLTIwMyw3ICsxOTYsNyBAQAogSUJNX0hBTkRMRShiZWVwLCBlYywgIkJFRVAiKTsJLyogYWxsIGV4Y2VwdCBSMzAsIFIzMSAqLwogSUJNX0hBTkRMRShlY3JkLCBlYywgIkVDUkQiKTsJLyogNTcwICovCiBJQk1fSEFORExFKGVjd3IsIGVjLCAiRUNXUiIpOwkvKiA1NzAgKi8KLUlCTV9IQU5ETEUoZmFucywgZWMsICJGQU5TIik7CS8qIFgzMSwgWDQwICovCitJQk1fSEFORExFKGZhbnMsIGVjLCAiRkFOUyIpOwkvKiBYMzEsIFg0MCwgWDQxICovCiAKIElCTV9IQU5ETEUoZ2ZhbiwgZWMsICJHRkFOIiwJLyogNTcwICovCiAJICAgIlxcRlNQRCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KQEAgLTIxNiw2ICsyMDksMTUyIEBACiAjZGVmaW5lIElCTV9IS0VZX0hJRAkiSUJNMDA2OCIKICNkZWZpbmUgSUJNX1BDSV9ISUQJIlBOUDBBMDMiCiAKK2VudW0gdGhlcm1hbF9hY2Nlc3NfbW9kZSB7CisJSUJNQUNQSV9USEVSTUFMX05PTkUgPSAwLAkvKiBObyB0aGVybWFsIHN1cHBvcnQgKi8KKwlJQk1BQ1BJX1RIRVJNQUxfQUNQSV9UTVAwNywJLyogVXNlIEFDUEkgVE1QMC03ICovCisJSUJNQUNQSV9USEVSTUFMX0FDUElfVVBEVCwJLyogVXNlIEFDUEkgVE1QMC03IHdpdGggVVBEVCAqLworCUlCTUFDUElfVEhFUk1BTF9UUEVDXzgsCQkvKiBVc2UgQUNQSSBFQyByZWdzLCA4IHNlbnNvcnMgKi8KKwlJQk1BQ1BJX1RIRVJNQUxfVFBFQ18xNiwJLyogVXNlIEFDUEkgRUMgcmVncywgMTYgc2Vuc29ycyAqLworfTsKKworI2RlZmluZSBJQk1BQ1BJX01BWF9USEVSTUFMX1NFTlNPUlMgMTYJLyogTWF4IHRoZXJtYWwgc2Vuc29ycyBzdXBwb3J0ZWQgKi8KK3N0cnVjdCBpYm1fdGhlcm1hbF9zZW5zb3JzX3N0cnVjdCB7CisJczMyIHRlbXBbSUJNQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTXTsKK307CisKKy8qCisgKiBGQU4gQUNDRVNTIE1PREVTCisgKgorICogSUJNQUNQSV9GQU5fUkRfQUNQSV9HRkFOOgorICogCUFDUEkgR0ZBTiBtZXRob2Q6IHJldHVybnMgZmFuIGxldmVsCisgKgorICogCXNlZSBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX1NGQU4KKyAqIAlFQyAweDJmIG5vdCBhdmFpbGFibGUgaWYgR0ZBTiBleGlzdHMKKyAqCisgKiBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisgKiAJQUNQSSBTRkFOIG1ldGhvZDogc2V0cyBmYW4gbGV2ZWwsIDAgKHN0b3ApIHRvIDcgKG1heCkKKyAqCisgKiAJRUMgMHgyZiBtaWdodCBiZSBhdmFpbGFibGUgKmZvciByZWFkaW5nKiwgYnV0IG5ldmVyIGZvciB3cml0aW5nLgorICoKKyAqIElCTUFDUElfRkFOX1dSX1RQRUM6CisgKiAJVGhpbmtQYWQgRUMgcmVnaXN0ZXIgMHgyZiAoSEZTUCk6IGZhbiBjb250cm9sIGxvb3AgbW9kZSBTdXBwb3J0ZWQKKyAqIAlvbiBhbG1vc3QgYWxsIFRoaW5rUGFkcworICoKKyAqIAlGYW4gc3BlZWQgY2hhbmdlcyBvZiBhbnkgc29ydCAoaW5jbHVkaW5nIHRob3NlIGNhdXNlZCBieSB0aGUKKyAqIAlkaXNlbmdhZ2VkIG1vZGUpIGFyZSB1c3VhbGx5IGRvbmUgc2xvd2x5IGJ5IHRoZSBmaXJtd2FyZSBhcyB0aGUKKyAqIAltYXhpbXVtIGFtbW91bnQgb2YgZmFuIGR1dHkgY3ljbGUgY2hhbmdlIHBlciBzZWNvbmQgc2VlbXMgdG8gYmUKKyAqIAlsaW1pdGVkLgorICoKKyAqIAlSZWFkaW5nIGlzIG5vdCBhdmFpbGFibGUgaWYgR0ZBTiBleGlzdHMuCisgKiAJV3JpdGluZyBpcyBub3QgYXZhaWxhYmxlIGlmIFNGQU4gZXhpc3RzLgorICoKKyAqIAlCaXRzCisgKgkgNwlhdXRvbWF0aWMgbW9kZSBlbmdhZ2VkOworICogIAkJKGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUgb2YgdGhlIFRoaW5rUGFkKQorICogCQlmYW4gbGV2ZWwgaXMgaWdub3JlZCBpbiB0aGlzIG1vZGUuCisgKgkgNglkaXNlbmdhZ2UgbW9kZSAodGFrZXMgcHJlY2VkZW5jZSBvdmVyIGJpdCA3KTsKKyAqCQlub3QgYXZhaWxhYmxlIG9uIGFsbCB0aGlua3BhZHMuICBNYXkgZGlzYWJsZQorICoJCXRoZSB0YWNob21ldGVyLCBhbmQgc3BlZWRzIHVwIGZhbiB0byAxMDAlIGR1dHktY3ljbGUsCisgKgkJd2hpY2ggc3BlZWRzIGl0IHVwIGZhciBhYm92ZSB0aGUgc3RhbmRhcmQgUlBNCisgKgkJbGV2ZWxzLiAgSXQgaXMgbm90IGltcG9zc2libGUgdGhhdCBpdCBjb3VsZCBjYXVzZQorICoJCWhhcmR3YXJlIGRhbWFnZS4KKyAqCTUtMwl1bnVzZWQgaW4gc29tZSBtb2RlbHMuICBFeHRyYSBiaXRzIGZvciBmYW4gbGV2ZWwKKyAqCQlpbiBvdGhlcnMsIGJ1dCBzdGlsbCB1c2VsZXNzIGFzIGFsbCB2YWx1ZXMgYWJvdmUKKyAqCQk3IG1hcCB0byB0aGUgc2FtZSBzcGVlZCBhcyBsZXZlbCA3IGluIHRoZXNlIG1vZGVscy4KKyAqCTItMAlmYW4gbGV2ZWwgKDAuLjcgdXN1YWxseSkKKyAqCQkJMHgwMCA9IHN0b3AKKyAqIAkJCTB4MDcgPSBtYXggKHNldCB3aGVuIHRlbXBlcmF0dXJlcyBjcml0aWNhbCkKKyAqIAkJU29tZSBUaGlua1BhZHMgbWF5IGhhdmUgb3RoZXIgbGV2ZWxzLCBzZWUKKyAqIAkJSUJNQUNQSV9GQU5fV1JfQUNQSV9GQU5TIChYMzEvWDQwL1g0MSkKKyAqCisgKglGSVJNV0FSRSBCVUc6IG9uIHNvbWUgbW9kZWxzLCBFQyAweDJmIG1pZ2h0IG5vdCBiZSBpbml0aWFsaXplZCBhdAorICoJYm9vdC4gQXBwYXJlbnRseSB0aGUgRUMgZG9lcyBub3QgaW50aWFsaXplIGl0LCBzbyB1bmxlc3MgQUNQSSBEU0RUCisgKglkb2VzIHNvLCBpdHMgaW5pdGlhbCB2YWx1ZSBpcyBtZWFuaW5nbGVzcyAoMHgwNykuCisgKgorICoJRm9yIGZpcm13YXJlIGJ1Z3MsIHJlZmVyIHRvOgorICoJaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9FbWJlZGRlZF9Db250cm9sbGVyX0Zpcm13YXJlI0Zpcm13YXJlX0lzc3VlcworICoKKyAqIAktLS0tCisgKgorICoJVGhpbmtQYWQgRUMgcmVnaXN0ZXIgMHg4NCAoTFNCKSwgMHg4NSAoTVNCKToKKyAqCU1haW4gZmFuIHRhY2hvbWV0ZXIgcmVhZGluZyAoaW4gUlBNKQorICoKKyAqCVRoaXMgcmVnaXN0ZXIgaXMgcHJlc2VudCBvbiBhbGwgVGhpbmtQYWRzIHdpdGggYSBuZXctc3R5bGUgRUMsIGFuZAorICoJaXQgaXMga25vd24gbm90IHRvIGJlIHByZXNlbnQgb24gdGhlIEEyMW0vZSwgYW5kIFQyMiwgYXMgdGhlcmUgaXMKKyAqCXNvbWV0aGluZyBlbHNlIGluIG9mZnNldCAweDg0IGFjY29yZGluZyB0byB0aGUgQUNQSSBEU0RULiAgT3RoZXIKKyAqCVRoaW5rUGFkcyBmcm9tIHRoaXMgc2FtZSB0aW1lIHBlcmlvZCAoYW5kIGVhcmxpZXIpIHByb2JhYmx5IGxhY2sgdGhlCisgKgl0YWNob21ldGVyIGFzIHdlbGwuCisgKgorICoJVW5mb3J0dW5hdGVseSBhIGxvdCBvZiBUaGlua1BhZHMgd2l0aCBuZXctc3R5bGUgRUNzIGJ1dCB3aG9zZSBmaXJ3bWFyZQorICoJd2FzIG5ldmVyIGZpeGVkIGJ5IElCTSB0byByZXBvcnQgdGhlIEVDIGZpcm13YXJlIHZlcnNpb24gc3RyaW5nCisgKglwcm9iYWJseSBzdXBwb3J0IHRoZSB0YWNob21ldGVyIChsaWtlIHRoZSBlYXJseSBYIG1vZGVscyksIHNvCisgKglkZXRlY3RpbmcgaXQgaXMgcXVpdGUgaGFyZC4gIFdlIG5lZWQgbW9yZSBkYXRhIHRvIGtub3cgZm9yIHN1cmUuCisgKgorICoJRklSTVdBUkUgQlVHOiBhbHdheXMgcmVhZCAweDg0IGZpcnN0LCBvdGhlcndpc2UgaW5jb3JyZWN0IHJlYWRpbmdzCisgKgltaWdodCByZXN1bHQuCisgKgorICoJRklSTVdBUkUgQlVHOiB3aGVuIEVDIDB4MmYgYml0IDYgaXMgc2V0IChkaXNlbmdhZ2VkIG1vZGUpLCB0aGlzCisgKglyZWdpc3RlciBpcyBub3QgaW52YWxpZGF0ZWQgaW4gVGhpbmtQYWRzIHRoYXQgZGlzYWJsZSB0YWNob21ldGVyCisgKglyZWFkaW5ncy4gIFRodXMsIHRoZSB0YWNob21ldGVyIHJlYWRpbmdzIGdvIHN0YWxlLgorICoKKyAqCUZvciBmaXJtd2FyZSBidWdzLCByZWZlciB0bzoKKyAqCWh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvRW1iZWRkZWRfQ29udHJvbGxlcl9GaXJtd2FyZSNGaXJtd2FyZV9Jc3N1ZXMKKyAqCisgKiBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisgKglUaGlua1BhZCBYMzEsIFg0MCwgWDQxLiAgTm90IGF2YWlsYWJsZSBpbiB0aGUgWDYwLgorICoKKyAqCUZBTlMgQUNQSSBoYW5kbGU6IHRha2VzIHRocmVlIGFyZ3VtZW50czogbG93IHNwZWVkLCBtZWRpdW0gc3BlZWQsCisgKgloaWdoIHNwZWVkLiAgQUNQSSBEU0RUIHNlZW1zIHRvIG1hcCB0aGVzZSB0aHJlZSBzcGVlZHMgdG8gbGV2ZWxzCisgKglhcyBmb2xsb3dzOiBTVE9QIExPVyBMT1cgTUVEIE1FRCBISUdIIEhJR0ggSElHSCBISUdICisgKgkodGhpcyBtYXAgaXMgc3RvcmVkIG9uIEZBTjAuLkZBTjggYXMgIjAsMSwxLDIsMiwzLDMsMywzIikKKyAqCisgKiAJVGhlIHNwZWVkcyBhcmUgc3RvcmVkIG9uIGhhbmRsZXMKKyAqIAkoRkFOQTpGQU45KSwgKEZBTkM6RkFOQiksIChGQU5FOkZBTkQpLgorICoKKyAqIAlUaGVyZSBhcmUgdGhyZWUgZGVmYXVsdCBzcGVlZCBzZXRzLCBhY2Vzc2libGUgYXMgaGFuZGxlczoKKyAqIAlGUzFMLEZTMU0sRlMxSDsgRlMyTCxGUzJNLEZTMkg7IEZTM0wsRlMzTSxGUzNICisgKgorICogCUFDUEkgRFNEVCBzd2l0Y2hlcyB3aGljaCBzZXQgaXMgaW4gdXNlIGRlcGVuZGluZyBvbiB2YXJpb3VzCisgKiAJZmFjdG9ycy4KKyAqCisgKiAJSUJNQUNQSV9GQU5fV1JfVFBFQyBpcyBhbHNvIGF2YWlsYWJsZSBhbmQgc2hvdWxkIGJlIHVzZWQgdG8KKyAqIAljb21tYW5kIHRoZSBmYW4uICBUaGUgWDMxL1g0MC9YNDEgc2VlbXMgdG8gaGF2ZSA4IGZhbiBsZXZlbHMsCisgKiAJYnV0IHRoZSBBQ1BJIHRhYmxlcyBqdXN0IG1lbnRpb24gbGV2ZWwgNy4KKyAqLworCitlbnVtIGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgeworCUlCTUFDUElfRkFOX05PTkUgPSAwLAkJLyogTm8gZmFuIHN0YXR1cyBvciBjb250cm9sICovCisJSUJNQUNQSV9GQU5fUkRfQUNQSV9HRkFOLAkvKiBVc2UgQUNQSSBHRkFOICovCisJSUJNQUNQSV9GQU5fUkRfVFBFQywJCS8qIFVzZSBBQ1BJIEVDIHJlZ3MgMHgyZiwgMHg4NC0weDg1ICovCit9OworCitlbnVtIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlIHsKKwlJQk1BQ1BJX0ZBTl9XUl9OT05FID0gMCwJLyogTm8gZmFuIGNvbnRyb2wgKi8KKwlJQk1BQ1BJX0ZBTl9XUl9BQ1BJX1NGQU4sCS8qIFVzZSBBQ1BJIFNGQU4gKi8KKwlJQk1BQ1BJX0ZBTl9XUl9UUEVDLAkJLyogVXNlIEFDUEkgRUMgcmVnIDB4MmYgKi8KKwlJQk1BQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlMsCS8qIFVzZSBBQ1BJIEZBTlMgYW5kIEVDIHJlZyAweDJmICovCit9OworCitlbnVtIGZhbl9jb250cm9sX2NvbW1hbmRzIHsKKwlJQk1BQ1BJX0ZBTl9DTURfU1BFRUQgCT0gMHgwMDAxLAkvKiBzcGVlZCBjb21tYW5kICovCisJSUJNQUNQSV9GQU5fQ01EX0xFVkVMIAk9IDB4MDAwMiwJLyogbGV2ZWwgY29tbWFuZCAgKi8KKwlJQk1BQ1BJX0ZBTl9DTURfRU5BQkxFCT0gMHgwMDA0LAkvKiBlbmFibGUvZGlzYWJsZSBjbWQsCisJCQkJCQkgKiBhbmQgYWxzbyB3YXRjaGRvZyBjbWQgKi8KK307CisKK2VudW0gewkJCQkJLyogRmFuIGNvbnRyb2wgY29uc3RhbnRzICovCisJZmFuX3N0YXR1c19vZmZzZXQgPSAweDJmLAkvKiBFQyByZWdpc3RlciAweDJmICovCisJZmFuX3JwbV9vZmZzZXQgPSAweDg0LAkJLyogRUMgcmVnaXN0ZXIgMHg4NDogTFNCLCAweDg1IE1TQiAoUlBNKQorCQkJCQkgKiAweDg0IG11c3QgYmUgcmVhZCBiZWZvcmUgMHg4NSAqLworCisJSUJNQUNQSV9GQU5fRUNfRElTRU5HQUdFRCAJPSAweDQwLAkvKiBFQyBtb2RlOiB0YWNob21ldGVyCisJCQkJCQkgKiBkaXNlbmdhZ2VkICovCisJSUJNQUNQSV9GQU5fRUNfQVVUTwkJPSAweDgwLCAvKiBFQyBtb2RlOiBhdXRvIGZhbgorCQkJCQkJICogY29udHJvbCAqLworfTsKKworc3RhdGljIGNoYXIgKmlibV90aGlua3BhZF9lY19mb3VuZCA9IE5VTEw7CisKIHN0cnVjdCBpYm1fc3RydWN0IHsKIAljaGFyICpuYW1lOwogCWNoYXIgcGFyYW1bMzJdOwpAQCAtMjQzLDYgKzM4Miw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyID0gTlVMTDsKIAorc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICppYm1fYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7CisKICNkZWZpbmUgb25vZmYoc3RhdHVzLGJpdCkgKChzdGF0dXMpICYgKDEgPDwgKGJpdCkpID8gIm9uIiA6ICJvZmYiKQogI2RlZmluZSBlbmFibGVkKHN0YXR1cyxiaXQpICgoc3RhdHVzKSAmICgxIDw8IChiaXQpKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpCiAjZGVmaW5lIHN0cmxlbmNtcChhLGIpIChzdHJuY21wKChhKSwgKGIpLCBzdHJsZW4oYikpKQpAQCAtNTgxLDggKzcyMiw3IEBACiB7CiAJaW50IHN0YXR1czsKIAotCWlmICghd2FuX3N1cHBvcnRlZCB8fAotCSAgICAhYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIkdXQU4iLCAiZCIpKQorCWlmICghd2FuX3N1cHBvcnRlZCB8fCAhYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIkdXQU4iLCAiZCIpKQogCQlzdGF0dXMgPSAwOwogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTYzMCwxMiArNzcwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlkZW9fc3VwcG9ydGVkOwotc3RhdGljIGludCB2aWRlb19vcmlnX2F1dG9zdzsKK2VudW0gdmlkZW9fYWNjZXNzX21vZGUgeworCUlCTUFDUElfVklERU9fTk9ORSA9IDAsCisJSUJNQUNQSV9WSURFT181NzAsCS8qIDU3MCAqLworCUlCTUFDUElfVklERU9fNzcwLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwlJQk1BQ1BJX1ZJREVPX05FVywJLyogYWxsIG90aGVycyAqLworfTsKIAotI2RlZmluZSBWSURFT181NzAgMQotI2RlZmluZSBWSURFT183NzAgMgotI2RlZmluZSBWSURFT19ORVcgMworc3RhdGljIGVudW0gdmlkZW9fYWNjZXNzX21vZGUgdmlkZW9fc3VwcG9ydGVkOworc3RhdGljIGludCB2aWRlb19vcmlnX2F1dG9zdzsKIAogc3RhdGljIGludCB2aWRlb19pbml0KHZvaWQpCiB7CkBAIC02NDcsMTYgKzc5MCwxNiBAQAogCiAJaWYgKCF2aWRfaGFuZGxlKQogCQkvKiB2aWRlbyBzd2l0Y2hpbmcgbm90IHN1cHBvcnRlZCBvbiBSMzAsIFIzMSAqLwotCQl2aWRlb19zdXBwb3J0ZWQgPSAwOworCQl2aWRlb19zdXBwb3J0ZWQgPSBJQk1BQ1BJX1ZJREVPX05PTkU7CiAJZWxzZSBpZiAoYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmdmlkZW9fb3JpZ19hdXRvc3csICJTV0lUIiwgInFkIikpCiAJCS8qIDU3MCAqLwotCQl2aWRlb19zdXBwb3J0ZWQgPSBWSURFT181NzA7CisJCXZpZGVvX3N1cHBvcnRlZCA9IElCTUFDUElfVklERU9fNTcwOwogCWVsc2UgaWYgKGFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJnZpZGVvX29yaWdfYXV0b3N3LCAiXlZBREwiLCAicWQiKSkKIAkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCXZpZGVvX3N1cHBvcnRlZCA9IFZJREVPXzc3MDsKKwkJdmlkZW9fc3VwcG9ydGVkID0gSUJNQUNQSV9WSURFT183NzA7CiAJZWxzZQogCQkvKiBhbGwgb3RoZXJzICovCi0JCXZpZGVvX3N1cHBvcnRlZCA9IFZJREVPX05FVzsKKwkJdmlkZW9fc3VwcG9ydGVkID0gSUJNQUNQSV9WSURFT19ORVc7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY2NiwxNSArODA5LDE1IEBACiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IGk7CiAKLQlpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPXzU3MCkgeworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT181NzApIHsKIAkJaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXF9TQi5QSFMiLCAiZGQiLCAweDg3KSkKIAkJCXN0YXR1cyA9IGkgJiAzOwotCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPXzc3MCkgeworCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fNzcwKSB7CiAJCWlmIChhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0RMIiwgImQiKSkKIAkJCXN0YXR1cyB8PSAweDAxICogaTsKIAkJaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREMiLCAiZCIpKQogCQkJc3RhdHVzIHw9IDB4MDIgKiBpOwotCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPX05FVykgeworCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fTkVXKSB7CiAJCWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDEpOwogCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCiAJCQlzdGF0dXMgfD0gMHgwMiAqIGk7CkBAIC02OTMsOSArODM2LDEwIEBACiB7CiAJaW50IGF1dG9zdyA9IDA7CiAKLQlpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPXzU3MCkKKwlpZiAodmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fNTcwKQogCQlhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZhdXRvc3csICJTV0lUIiwgImQiKTsKLQllbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNzcwIHx8IHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT19ORVcpCisJZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fNzcwIHx8CisJCSB2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT19ORVcpCiAJCWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJmF1dG9zdywgIl5WREVFIiwgImQiKTsKIAogCXJldHVybiBhdXRvc3cgJiAxOwpAQCAtNzE1LDEyICs4NTksMTIgQEAKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRzdXBwb3J0ZWRcbiIpOwogCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsY2Q6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMCkpOwogCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjcnQ6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMSkpOwotCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fTkVXKQorCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT19ORVcpCiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJkdmk6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMykpOwogCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJhdXRvOlx0XHQlc1xuIiwgZW5hYmxlZChhdXRvc3csIDApKTsKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsY2RfZW5hYmxlLCBsY2RfZGlzYWJsZVxuIik7CiAJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0Y3J0X2VuYWJsZSwgY3J0X2Rpc2FibGVcbiIpOwotCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fTkVXKQorCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT19ORVcpCiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGR2aV9lbmFibGUsIGR2aV9kaXNhYmxlXG4iKTsKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRhdXRvX2VuYWJsZSwgYXV0b19kaXNhYmxlXG4iKTsKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHR2aWRlb19zd2l0Y2gsIGV4cGFuZF90b2dnbGVcbiIpOwpAQCAtNzM1LDcgKzg3OSw3IEBACiAKIAlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCAxKSkKIAkJcmV0dXJuIC1FSU87Ci0JcmV0ID0gdmlkZW9fc3VwcG9ydGVkID09IFZJREVPXzU3MCA/CisJcmV0ID0gdmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fNTcwID8KIAkgICAgYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJfUTE2IiwgInYiKSA6CiAJICAgIGFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIlZTV1QiLCAidiIpOwogCWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCBhdXRvc3cpOwpAQCAtNzQ1LDkgKzg4OSw5IEBACiAKIHN0YXRpYyBpbnQgdmlkZW9fZXhwYW5kKHZvaWQpCiB7Ci0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT181NzApCisJaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX1ZJREVPXzU3MCkKIAkJcmV0dXJuIGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiX1ExNyIsICJ2Iik7Ci0JZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IFZJREVPXzc3MCkKKwllbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT183NzApCiAJCXJldHVybiBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJWRVhQIiwgInYiKTsKIAllbHNlCiAJCXJldHVybiBhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZFWFAiLCAidiIpOwpAQCAtNzU3LDEwICs5MDEsMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT181NzApIHsKKwlpZiAodmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fNTcwKSB7CiAJCXJldCA9IGFjcGlfZXZhbGYoTlVMTCwgTlVMTCwKIAkJCQkgIlxcX1NCLlBIUzIiLCAidmRkIiwgMHg4Yiwgc3RhdHVzIHwgMHg4MCk7Ci0JfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fNzcwKSB7CisJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT183NzApIHsKIAkJaW50IGF1dG9zdyA9IHZpZGVvX2F1dG9zdygpOwogCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCAxKSkKIAkJCXJldHVybiAtRUlPOwpAQCAtNzk2LDEwICs5NDAsMTAgQEAKIAkJCWVuYWJsZSB8PSAweDAyOwogCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJjcnRfZGlzYWJsZSIpID09IDApIHsKIAkJCWRpc2FibGUgfD0gMHgwMjsKLQkJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVklERU9fTkVXICYmCisJCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fTkVXICYmCiAJCQkgICBzdHJsZW5jbXAoY21kLCAiZHZpX2VuYWJsZSIpID09IDApIHsKIAkJCWVuYWJsZSB8PSAweDA4OwotCQl9IGVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBWSURFT19ORVcgJiYKKwkJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT19ORVcgJiYKIAkJCSAgIHN0cmxlbmNtcChjbWQsICJkdmlfZGlzYWJsZSIpID09IDApIHsKIAkJCWRpc2FibGUgfD0gMHgwODsKIAkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiYXV0b19lbmFibGUiKSA9PSAwKSB7CkBAIC04OTgsNiArMTA0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19BQ1BJX0lCTV9ET0NLKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX0lCTV9CQVkpCiBzdGF0aWMgaW50IF9zdGEoYWNwaV9oYW5kbGUgaGFuZGxlKQogewogCWludCBzdGF0dXM7CkBAIC05MDcsNiArMTA1Miw3IEBACiAKIAlyZXR1cm4gc3RhdHVzOwogfQorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FDUElfSUJNX0RPQ0sKICNkZWZpbmUgZG9ja19kb2NrZWQoKSAoX3N0YShkb2NrX2hhbmRsZSkgJiAxKQogCkBAIC05NzIsNiArMTExOCw3IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BQ1BJX0lCTV9CQVkKIHN0YXRpYyBpbnQgYmF5X3N0YXR1c19zdXBwb3J0ZWQ7CiBzdGF0aWMgaW50IGJheV9zdGF0dXMyX3N1cHBvcnRlZDsKIHN0YXRpYyBpbnQgYmF5X2VqZWN0X3N1cHBvcnRlZDsKQEAgLTEwNDcsNiArMTE5NCw3IEBACiB7CiAJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAwKTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IGNtb3NfcmVhZChjaGFyICpwKQogewpAQCAtMTA5NCwyNiArMTI0MiwyOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxlZF9zdXBwb3J0ZWQ7Ci0KLSNkZWZpbmUgTEVEXzU3MCAxCi0jZGVmaW5lIExFRF9PTEQgMgotI2RlZmluZSBMRURfTkVXIDMKK2VudW0gbGVkX2FjY2Vzc19tb2RlIHsKKwlJQk1BQ1BJX0xFRF9OT05FID0gMCwKKwlJQk1BQ1BJX0xFRF81NzAsCS8qIDU3MCAqLworCUlCTUFDUElfTEVEX09MRCwJLyogNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCisJSUJNQUNQSV9MRURfTkVXLAkvKiBhbGwgb3RoZXJzICovCit9Oworc3RhdGljIGVudW0gbGVkX2FjY2Vzc19tb2RlIGxlZF9zdXBwb3J0ZWQ7CiAKIHN0YXRpYyBpbnQgbGVkX2luaXQodm9pZCkKIHsKIAlpZiAoIWxlZF9oYW5kbGUpCiAJCS8qIGxlZCBub3Qgc3VwcG9ydGVkIG9uIFIzMCwgUjMxICovCi0JCWxlZF9zdXBwb3J0ZWQgPSAwOworCQlsZWRfc3VwcG9ydGVkID0gSUJNQUNQSV9MRURfTk9ORTsKIAllbHNlIGlmIChzdHJsZW5jbXAobGVkX3BhdGgsICJTTEVEIikgPT0gMCkKIAkJLyogNTcwICovCi0JCWxlZF9zdXBwb3J0ZWQgPSBMRURfNTcwOworCQlsZWRfc3VwcG9ydGVkID0gSUJNQUNQSV9MRURfNTcwOwogCWVsc2UgaWYgKHN0cmxlbmNtcChsZWRfcGF0aCwgIlNZU0wiKSA9PSAwKQogCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KLQkJbGVkX3N1cHBvcnRlZCA9IExFRF9PTEQ7CisJCWxlZF9zdXBwb3J0ZWQgPSBJQk1BQ1BJX0xFRF9PTEQ7CiAJZWxzZQogCQkvKiBhbGwgb3RoZXJzICovCi0JCWxlZF9zdXBwb3J0ZWQgPSBMRURfTkVXOworCQlsZWRfc3VwcG9ydGVkID0gSUJNQUNQSV9MRURfTkVXOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTMwLDcgKzEyODAsNyBAQAogCX0KIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRzdXBwb3J0ZWRcbiIpOwogCi0JaWYgKGxlZF9zdXBwb3J0ZWQgPT0gTEVEXzU3MCkgeworCWlmIChsZWRfc3VwcG9ydGVkID09IElCTUFDUElfTEVEXzU3MCkgewogCQkvKiA1NzAgKi8KIAkJaW50IGksIHN0YXR1czsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewpAQCAtMTE3OSwxMyArMTMyOSwxMyBAQAogCQl9IGVsc2UKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmIChsZWRfc3VwcG9ydGVkID09IExFRF81NzApIHsKKwkJaWYgKGxlZF9zdXBwb3J0ZWQgPT0gSUJNQUNQSV9MRURfNTcwKSB7CiAJCQkvKiA1NzAgKi8KIAkJCWxlZCA9IDEgPDwgbGVkOwogCQkJaWYgKCFhY3BpX2V2YWxmKGxlZF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLAogCQkJCQlsZWQsIGxlZF9zbGVkX2FyZzFbaW5kXSkpCiAJCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAobGVkX3N1cHBvcnRlZCA9PSBMRURfT0xEKSB7CisJCX0gZWxzZSBpZiAobGVkX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX0xFRF9PTEQpIHsKIAkJCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMCAqLwogCQkJbGVkID0gMSA8PCBsZWQ7CiAJCQlyZXQgPSBlY193cml0ZShFQ19ITE1TLCBsZWQpOwpAQCAtMTI3Miw1MCArMTQyMiwxNDIgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCB0aGVybWFsX3RtcF9zdXBwb3J0ZWQ7Ci1zdGF0aWMgaW50IHRoZXJtYWxfdXBkdF9zdXBwb3J0ZWQ7CitzdGF0aWMgZW51bSB0aGVybWFsX2FjY2Vzc19tb2RlIHRoZXJtYWxfcmVhZF9tb2RlOwogCiBzdGF0aWMgaW50IHRoZXJtYWxfaW5pdCh2b2lkKQogewotCS8qIHRlbXBlcmF0dXJlcyBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgRzR4LCBSMzAsIFIzMSwgUjMyICovCi0JdGhlcm1hbF90bXBfc3VwcG9ydGVkID0gYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJUTVA3IiwgInF2Iik7CisJdTggdCwgdGExLCB0YTI7CisJaW50IGk7CisJaW50IGFjcGlfdG1wNyA9IGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiVE1QNyIsICJxdiIpOwogCi0JLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JdGhlcm1hbF91cGR0X3N1cHBvcnRlZCA9IGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiVVBEVCIsICJxdiIpOworCWlmIChpYm1fdGhpbmtwYWRfZWNfZm91bmQgJiYgZXhwZXJpbWVudGFsKSB7CisJCS8qCisJCSAqIERpcmVjdCBFQyBhY2Nlc3MgbW9kZTogc2Vuc29ycyBhdCByZWdpc3RlcnMKKwkJICogMHg3OC0weDdGLCAweEMwLTB4QzcuICBSZWdpc3RlcnMgcmV0dXJuIDB4MDAgZm9yCisJCSAqIG5vbi1pbXBsZW1lbnRlZCwgdGhlcm1hbCBzZW5zb3JzIHJldHVybiAweDgwIHdoZW4KKwkJICogbm90IGF2YWlsYWJsZQorCQkgKi8KKworCQl0YTEgPSB0YTIgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAobGlrZWx5KGFjcGlfZWNfcmVhZCgweDc4ICsgaSwgJnQpKSkgeworCQkJCXRhMSB8PSB0OworCQkJfSBlbHNlIHsKKwkJCQl0YTEgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGxpa2VseShhY3BpX2VjX3JlYWQoMHhDMCArIGksICZ0KSkpIHsKKwkJCQl0YTIgfD0gdDsKKwkJCX0gZWxzZSB7CisJCQkJdGExID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodGExID09IDApIHsKKwkJCS8qIFRoaXMgaXMgc2hlZXIgcGFyYW5vaWEsIGJ1dCB3ZSBoYW5kbGUgaXQgYW55d2F5ICovCisJCQlpZiAoYWNwaV90bXA3KSB7CisJCQkJcHJpbnRrKElCTV9FUlIKKwkJCQkgICAgICAgIlRoaW5rUGFkIEFDUEkgRUMgYWNjZXNzIG1pc2JlaGF2aW5nLCAiCisJCQkJICAgICAgICJmYWxsaW5nIGJhY2sgdG8gQUNQSSBUTVB4IGFjY2VzcyBtb2RlXG4iKTsKKwkJCQl0aGVybWFsX3JlYWRfbW9kZSA9IElCTUFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoSUJNX0VSUgorCQkJCSAgICAgICAiVGhpbmtQYWQgQUNQSSBFQyBhY2Nlc3MgbWlzYmVoYXZpbmcsICIKKwkJCQkgICAgICAgImRpc2FibGluZyB0aGVybWFsIHNlbnNvcnMgYWNjZXNzXG4iKTsKKwkJCQl0aGVybWFsX3JlYWRfbW9kZSA9IElCTUFDUElfVEhFUk1BTF9OT05FOworCQkJfQorCQl9IGVsc2UgeworCQkJdGhlcm1hbF9yZWFkX21vZGUgPQorCQkJICAgICh0YTIgIT0gMCkgPworCQkJICAgIElCTUFDUElfVEhFUk1BTF9UUEVDXzE2IDogSUJNQUNQSV9USEVSTUFMX1RQRUNfODsKKwkJfQorCX0gZWxzZSBpZiAoYWNwaV90bXA3KSB7CisJCWlmIChhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAicXYiKSkgeworCQkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCQl0aGVybWFsX3JlYWRfbW9kZSA9IElCTUFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ7CisJCX0gZWxzZSB7CisJCQkvKiBTdGFuZGFyZCBBQ1BJIFRNUHggYWNjZXNzLCBtYXggOCBzZW5zb3JzICovCisJCQl0aGVybWFsX3JlYWRfbW9kZSA9IElCTUFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OworCQl9CisJfSBlbHNlIHsKKwkJLyogdGVtcGVyYXR1cmVzIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCBHNHgsIFIzMCwgUjMxLCBSMzIgKi8KKwkJdGhlcm1hbF9yZWFkX21vZGUgPSBJQk1BQ1BJX1RIRVJNQUxfTk9ORTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0aGVybWFsX2dldF9zZW5zb3JzKHN0cnVjdCBpYm1fdGhlcm1hbF9zZW5zb3JzX3N0cnVjdCAqcykKK3sKKwlpbnQgaSwgdDsKKwlzOCB0bXA7CisJY2hhciB0bXBpW10gPSAiVE1QaSI7CisKKwlpZiAoIXMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0aGVybWFsX3JlYWRfbW9kZSkgeworI2lmIElCTUFDUElfTUFYX1RIRVJNQUxfU0VOU09SUyA+PSAxNgorCWNhc2UgSUJNQUNQSV9USEVSTUFMX1RQRUNfMTY6CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmICghYWNwaV9lY19yZWFkKDB4QzAgKyBpLCAmdG1wKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCXMtPnRlbXBbaSArIDhdID0gdG1wICogMTAwMDsKKwkJfQorCQkvKiBmYWxsdGhyb3VnaCAqLworI2VuZGlmCisJY2FzZSBJQk1BQ1BJX1RIRVJNQUxfVFBFQ184OgorCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoIWFjcGlfZWNfcmVhZCgweDc4ICsgaSwgJnRtcCkpCisJCQkJcmV0dXJuIC1FSU87CisJCQlzLT50ZW1wW2ldID0gdG1wICogMTAwMDsKKwkJfQorCQlyZXR1cm4gKHRoZXJtYWxfcmVhZF9tb2RlID09IElCTUFDUElfVEhFUk1BTF9UUEVDXzE2KSA/IDE2IDogODsKKworCWNhc2UgSUJNQUNQSV9USEVSTUFMX0FDUElfVVBEVDoKKwkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAidiIpKQorCQkJcmV0dXJuIC1FSU87CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXRtcGlbM10gPSAnMCcgKyBpOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCisJCQkJcmV0dXJuIC1FSU87CisJCQlzLT50ZW1wW2ldID0gKHQgLSAyNzMyKSAqIDEwMDsKKwkJfQorCQlyZXR1cm4gODsKKworCWNhc2UgSUJNQUNQSV9USEVSTUFMX0FDUElfVE1QMDc6CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXRtcGlbM10gPSAnMCcgKyBpOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCisJCQkJcmV0dXJuIC1FSU87CisJCQlzLT50ZW1wW2ldID0gdCAqIDEwMDA7CisJCX0KKwkJcmV0dXJuIDg7CisKKwljYXNlIElCTUFDUElfVEhFUk1BTF9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKwogc3RhdGljIGludCB0aGVybWFsX3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKKwlpbnQgbiwgaTsKKwlzdHJ1Y3QgaWJtX3RoZXJtYWxfc2Vuc29yc19zdHJ1Y3QgdDsKIAotCWlmICghdGhlcm1hbF90bXBfc3VwcG9ydGVkKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAidGVtcGVyYXR1cmVzOlx0bm90IHN1cHBvcnRlZFxuIik7Ci0JZWxzZSB7Ci0JCWludCBpLCB0OwotCQljaGFyIHRtcGlbXSA9ICJUTVBpIjsKLQkJczggdG1wWzhdOworCW4gPSB0aGVybWFsX2dldF9zZW5zb3JzKCZ0KTsKKwlpZiAodW5saWtlbHkobiA8IDApKQorCQlyZXR1cm4gbjsKIAotCQlpZiAodGhlcm1hbF91cGR0X3N1cHBvcnRlZCkKLQkJCWlmICghYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJVUERUIiwgInYiKSkKLQkJCQlyZXR1cm4gLUVJTzsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAidGVtcGVyYXR1cmVzOlx0Iik7CiAKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJdG1waVszXSA9ICcwJyArIGk7Ci0JCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCAmdCwgdG1waSwgImQiKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWlmICh0aGVybWFsX3VwZHRfc3VwcG9ydGVkKQotCQkJCXRtcFtpXSA9ICh0IC0gMjczMiArIDUpIC8gMTA7Ci0JCQllbHNlCi0JCQkJdG1wW2ldID0gdDsKLQkJfQotCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sCi0JCQkgICAgICAgInRlbXBlcmF0dXJlczpcdCVkICVkICVkICVkICVkICVkICVkICVkXG4iLAotCQkJICAgICAgIHRtcFswXSwgdG1wWzFdLCB0bXBbMl0sIHRtcFszXSwKLQkJCSAgICAgICB0bXBbNF0sIHRtcFs1XSwgdG1wWzZdLCB0bXBbN10pOwotCX0KKwlpZiAobiA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IChuIC0gMSk7IGkrKykKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIlZCAiLCB0LnRlbXBbaV0gLyAxMDAwKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiVkXG4iLCB0LnRlbXBbaV0gLyAxMDAwKTsKKwl9IGVsc2UKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIm5vdCBzdXBwb3J0ZWRcbiIpOwogCiAJcmV0dXJuIGxlbjsKIH0KQEAgLTEzODEsMTIgKzE2MjMsMjMgQEAKIAogc3RhdGljIGludCBicmlnaHRuZXNzX29mZnNldCA9IDB4MzE7CiAKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19nZXQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXU4IGxldmVsOworCWlmICghYWNwaV9lY19yZWFkKGJyaWdodG5lc3Nfb2Zmc2V0LCAmbGV2ZWwpKQorCQlyZXR1cm4gLUVJTzsKKworCWxldmVsICY9IDB4NzsKKworCXJldHVybiBsZXZlbDsKK30KKwogc3RhdGljIGludCBicmlnaHRuZXNzX3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKLQl1OCBsZXZlbDsKKwlpbnQgbGV2ZWw7CiAKLQlpZiAoIWFjcGlfZWNfcmVhZChicmlnaHRuZXNzX29mZnNldCwgJmxldmVsKSkgeworCWlmICgobGV2ZWwgPSBicmlnaHRuZXNzX2dldChOVUxMKSkgPCAwKSB7CiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0dW5yZWFkYWJsZVxuIik7CiAJfSBlbHNlIHsKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHQlZFxuIiwgbGV2ZWwgJiAweDcpOwpAQCAtMTQwMSwxNiArMTY1NCwzNCBAQAogI2RlZmluZSBCUklHSFRORVNTX1VQCTQKICNkZWZpbmUgQlJJR0hUTkVTU19ET1dOCTUKIAotc3RhdGljIGludCBicmlnaHRuZXNzX3dyaXRlKGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19zZXQoaW50IHZhbHVlKQogewogCWludCBjbW9zX2NtZCwgaW5jLCBpOwotCXU4IGxldmVsOworCWludCBjdXJyZW50X3ZhbHVlID0gYnJpZ2h0bmVzc19nZXQoTlVMTCk7CisKKwl2YWx1ZSAmPSA3OworCisJY21vc19jbWQgPSB2YWx1ZSA+IGN1cnJlbnRfdmFsdWUgPyBCUklHSFRORVNTX1VQIDogQlJJR0hUTkVTU19ET1dOOworCWluYyA9IHZhbHVlID4gY3VycmVudF92YWx1ZSA/IDEgOiAtMTsKKwlmb3IgKGkgPSBjdXJyZW50X3ZhbHVlOyBpICE9IHZhbHVlOyBpICs9IGluYykgeworCQlpZiAoIWNtb3NfZXZhbChjbW9zX2NtZCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKCFhY3BpX2VjX3dyaXRlKGJyaWdodG5lc3Nfb2Zmc2V0LCBpICsgaW5jKSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJyaWdodG5lc3Nfd3JpdGUoY2hhciAqYnVmKQoreworCWludCBsZXZlbDsKIAlpbnQgbmV3X2xldmVsOwogCWNoYXIgKmNtZDsKIAogCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmICghYWNwaV9lY19yZWFkKGJyaWdodG5lc3Nfb2Zmc2V0LCAmbGV2ZWwpKQotCQkJcmV0dXJuIC1FSU87CisJCWlmICgobGV2ZWwgPSBicmlnaHRuZXNzX2dldChOVUxMKSkgPCAwKQorCQkJcmV0dXJuIGxldmVsOwogCQlsZXZlbCAmPSA3OwogCiAJCWlmIChzdHJsZW5jbXAoY21kLCAidXAiKSA9PSAwKSB7CkBAIC0xNDIzLDE5ICsxNjk0LDQ0IEBACiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJY21vc19jbWQgPSBuZXdfbGV2ZWwgPiBsZXZlbCA/IEJSSUdIVE5FU1NfVVAgOiBCUklHSFRORVNTX0RPV047Ci0JCWluYyA9IG5ld19sZXZlbCA+IGxldmVsID8gMSA6IC0xOwotCQlmb3IgKGkgPSBsZXZlbDsgaSAhPSBuZXdfbGV2ZWw7IGkgKz0gaW5jKSB7Ci0JCQlpZiAoIWNtb3NfZXZhbChjbW9zX2NtZCkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpZiAoIWFjcGlfZWNfd3JpdGUoYnJpZ2h0bmVzc19vZmZzZXQsIGkgKyBpbmMpKQotCQkJCXJldHVybiAtRUlPOwotCQl9CisJCWJyaWdodG5lc3Nfc2V0KG5ld19sZXZlbCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc191cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYnJpZ2h0bmVzc19zZXQoYmQtPnByb3BzLT5icmlnaHRuZXNzKTsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBpYm1fYmFja2xpZ2h0X2RhdGEgPSB7CisgICAgICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorICAgICAgICAuZ2V0X2JyaWdodG5lc3MgPSBicmlnaHRuZXNzX2dldCwKKyAgICAgICAgLnVwZGF0ZV9zdGF0dXMgID0gYnJpZ2h0bmVzc191cGRhdGVfc3RhdHVzLAorICAgICAgICAubWF4X2JyaWdodG5lc3MgPSA3LAorfTsKKworc3RhdGljIGludCBicmlnaHRuZXNzX2luaXQodm9pZCkKK3sKKwlpYm1fYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoImlibSIsIE5VTEwsCisJCQkJCQkJICZpYm1fYmFja2xpZ2h0X2RhdGEpOworCWlmIChJU19FUlIoaWJtX2JhY2tsaWdodF9kZXZpY2UpKSB7CisJCXByaW50ayhJQk1fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7CisJCXJldHVybiBQVFJfRVJSKGlibV9iYWNrbGlnaHRfZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnJpZ2h0bmVzc19leGl0KHZvaWQpCit7CisJaWYgKGlibV9iYWNrbGlnaHRfZGV2aWNlKSB7CisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihpYm1fYmFja2xpZ2h0X2RldmljZSk7CisJCWlibV9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgdm9sdW1lX29mZnNldCA9IDB4MzA7CiAKIHN0YXRpYyBpbnQgdm9sdW1lX3JlYWQoY2hhciAqcCkKQEAgLTE1MjIsODQgKzE4MTgsNDgwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmFuX3N0YXR1c19vZmZzZXQgPSAweDJmOwotc3RhdGljIGludCBmYW5fcnBtX29mZnNldCA9IDB4ODQ7CitzdGF0aWMgZW51bSBmYW5fc3RhdHVzX2FjY2Vzc19tb2RlIGZhbl9zdGF0dXNfYWNjZXNzX21vZGU7CitzdGF0aWMgZW51bSBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZTsKK3N0YXRpYyBlbnVtIGZhbl9jb250cm9sX2NvbW1hbmRzIGZhbl9jb250cm9sX2NvbW1hbmRzOworCitzdGF0aWMgaW50IGZhbl9jb250cm9sX3N0YXR1c19rbm93bjsKK3N0YXRpYyB1OCBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1czsKKworc3RhdGljIHZvaWQgZmFuX3dhdGNoZG9nX2ZpcmUoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKTsKK3N0YXRpYyBpbnQgZmFuX3dhdGNoZG9nX21heGludGVydmFsOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGZhbl93YXRjaGRvZ190YXNrLCBmYW5fd2F0Y2hkb2dfZmlyZSk7CisKK3N0YXRpYyBpbnQgZmFuX2luaXQodm9pZCkKK3sKKwlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gSUJNQUNQSV9GQU5fTk9ORTsKKwlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IElCTUFDUElfRkFOX1dSX05PTkU7CisJZmFuX2NvbnRyb2xfY29tbWFuZHMgPSAwOworCWZhbl9jb250cm9sX3N0YXR1c19rbm93biA9IDE7CisJZmFuX3dhdGNoZG9nX21heGludGVydmFsID0gMDsKKworCWlmIChnZmFuX2hhbmRsZSkgeworCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gSUJNQUNQSV9GQU5fUkRfQUNQSV9HRkFOOworCX0gZWxzZSB7CisJCS8qIGFsbCBvdGhlciBUaGlua1BhZHM6IG5vdGUgdGhhdCBldmVuIG9sZC1zdHlsZQorCQkgKiBUaGlua1BhZCBFQ3Mgc3VwcG9ydHMgdGhlIGZhbiBjb250cm9sIHJlZ2lzdGVyICovCisJCWlmIChsaWtlbHkoYWNwaV9lY19yZWFkKGZhbl9zdGF0dXNfb2Zmc2V0LAorCQkJCQkmZmFuX2NvbnRyb2xfaW5pdGlhbF9zdGF0dXMpKSkgeworCQkJZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSA9IElCTUFDUElfRkFOX1JEX1RQRUM7CisKKwkJCS8qIEluIHNvbWUgVGhpbmtQYWRzLCBuZWl0aGVyIHRoZSBFQyBub3IgdGhlIEFDUEkKKwkJCSAqIERTRFQgaW5pdGlhbGl6ZSB0aGUgZmFuIHN0YXR1cywgYW5kIGl0IGVuZHMgdXAKKwkJCSAqIGJlaW5nIHNldCB0byAweDA3IHdoZW4gaXQgKmNvdWxkKiBiZSBlaXRoZXIKKwkJCSAqIDB4MDcgb3IgMHg4MC4KKwkJCSAqCisJCQkgKiBFbmFibGUgZm9yIFRQLTFZIChUNDMpLCBUUC03OCAoUjUxZSksCisJCQkgKiBUUC03NiAoUjUyKSwgVFAtNzAgKFQ0MywgUjUyKSwgd2hpY2ggYXJlIGtub3duCisJCQkgKiB0byBiZSBidWdneS4gKi8KKwkJCWlmIChmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cyA9PSAweDA3ICYmCisJCQkgICAgaWJtX3RoaW5rcGFkX2VjX2ZvdW5kICYmCisJCQkgICAgKChpYm1fdGhpbmtwYWRfZWNfZm91bmRbMF0gPT0gJzEnICYmCisJCQkgICAgICBpYm1fdGhpbmtwYWRfZWNfZm91bmRbMV0gPT0gJ1knKSB8fAorCQkJICAgICAoaWJtX3RoaW5rcGFkX2VjX2ZvdW5kWzBdID09ICc3JyAmJgorCQkJICAgICAgKGlibV90aGlua3BhZF9lY19mb3VuZFsxXSA9PSAnNicgfHwKKwkJCSAgICAgICBpYm1fdGhpbmtwYWRfZWNfZm91bmRbMV0gPT0gJzgnIHx8CisJCQkgICAgICAgaWJtX3RoaW5rcGFkX2VjX2ZvdW5kWzFdID09ICcwJykpCisJCQkgICAgKSkgeworCQkJCXByaW50ayhJQk1fTk9USUNFCisJCQkJICAgICAgICJmYW5faW5pdDogaW5pdGlhbCBmYW4gc3RhdHVzIGlzICIKKwkJCQkgICAgICAgInVua25vd24sIGFzc3VtaW5nIGl0IGlzIGluIGF1dG8gIgorCQkJCSAgICAgICAibW9kZVxuIik7CisJCQkJZmFuX2NvbnRyb2xfc3RhdHVzX2tub3duID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ayhJQk1fRVJSCisJCQkgICAgICAgIlRoaW5rUGFkIEFDUEkgRUMgYWNjZXNzIG1pc2JlaGF2aW5nLCAiCisJCQkgICAgICAgImZhbiBzdGF0dXMgYW5kIGNvbnRyb2wgdW5hdmFpbGFibGVcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoc2Zhbl9oYW5kbGUpIHsKKwkJLyogNTcwLCA3NzB4LUpMICovCisJCWZhbl9jb250cm9sX2FjY2Vzc19tb2RlID0gSUJNQUNQSV9GQU5fV1JfQUNQSV9TRkFOOworCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQorCQkgICAgSUJNQUNQSV9GQU5fQ01EX0xFVkVMIHwgSUJNQUNQSV9GQU5fQ01EX0VOQUJMRTsKKwl9IGVsc2UgeworCQlpZiAoIWdmYW5faGFuZGxlKSB7CisJCQkvKiBnZmFuIHdpdGhvdXQgc2ZhbiBtZWFucyBubyBmYW4gY29udHJvbCAqLworCQkJLyogYWxsIG90aGVyIG1vZGVscyBpbXBsZW1lbnQgVFAgRUMgMHgyZiBjb250cm9sICovCisKKwkJCWlmIChmYW5zX2hhbmRsZSkgeworCQkJCS8qIFgzMSwgWDQwLCBYNDEgKi8KKwkJCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9CisJCQkJICAgIElCTUFDUElfRkFOX1dSX0FDUElfRkFOUzsKKwkJCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQorCQkJCSAgICBJQk1BQ1BJX0ZBTl9DTURfU1BFRUQgfAorCQkJCSAgICBJQk1BQ1BJX0ZBTl9DTURfTEVWRUwgfAorCQkJCSAgICBJQk1BQ1BJX0ZBTl9DTURfRU5BQkxFOworCQkJfSBlbHNlIHsKKwkJCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IElCTUFDUElfRkFOX1dSX1RQRUM7CisJCQkJZmFuX2NvbnRyb2xfY29tbWFuZHMgfD0KKwkJCQkgICAgSUJNQUNQSV9GQU5fQ01EX0xFVkVMIHwKKwkJCQkgICAgSUJNQUNQSV9GQU5fQ01EX0VOQUJMRTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhbl9nZXRfc3RhdHVzKHU4ICpzdGF0dXMpCit7CisJdTggczsKKworCS8qIFRPRE86CisJICogQWRkIElCTUFDUElfRkFOX1JEX0FDUElfRkFOUyA/ICovCisKKwlzd2l0Y2ggKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUpIHsKKwljYXNlIElCTUFDUElfRkFOX1JEX0FDUElfR0ZBTjoKKwkJLyogNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKworCQlpZiAodW5saWtlbHkoIWFjcGlfZXZhbGYoZ2Zhbl9oYW5kbGUsICZzLCBOVUxMLCAiZCIpKSkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChsaWtlbHkoc3RhdHVzKSkKKwkJCSpzdGF0dXMgPSBzICYgMHgwNzsKKworCQlicmVhazsKKworCWNhc2UgSUJNQUNQSV9GQU5fUkRfVFBFQzoKKwkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlpZiAodW5saWtlbHkoIWFjcGlfZWNfcmVhZChmYW5fc3RhdHVzX29mZnNldCwgJnMpKSkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChsaWtlbHkoc3RhdHVzKSkKKwkJCSpzdGF0dXMgPSBzOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYW5fZ2V0X3NwZWVkKHVuc2lnbmVkIGludCAqc3BlZWQpCit7CisJdTggaGksIGxvOworCisJc3dpdGNoIChmYW5fc3RhdHVzX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBJQk1BQ1BJX0ZBTl9SRF9UUEVDOgorCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCWlmICh1bmxpa2VseSghYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0LCAmbG8pIHx8CisJCQkgICAgICFhY3BpX2VjX3JlYWQoZmFuX3JwbV9vZmZzZXQgKyAxLCAmaGkpKSkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChsaWtlbHkoc3BlZWQpKQorCQkJKnNwZWVkID0gKGhpIDw8IDgpIHwgbG87CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmYW5fZXhpdCh2b2lkKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmZhbl93YXRjaGRvZ190YXNrKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCitzdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfcmVzZXQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGZhbl93YXRjaGRvZ19hY3RpdmUgPSAwOworCisJaWYgKGZhbl93YXRjaGRvZ19hY3RpdmUpCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmZhbl93YXRjaGRvZ190YXNrKTsKKworCWlmIChmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwgPiAwKSB7CisJCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAxOworCQlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2ssCisJCQkJbXNlY3NfdG9famlmZmllcyhmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwKKwkJCQkJCSAqIDEwMDApKSkgeworCQkJcHJpbnRrKElCTV9FUlIgImZhaWxlZCB0byBzY2hlZHVsZSB0aGUgZmFuIHdhdGNoZG9nLCAiCisJCQkgICAgICAgIndhdGNoZG9nIHdpbGwgbm90IHRyaWdnZXJcbiIpOworCQl9CisJfSBlbHNlCisJCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAwOworfQogCiBzdGF0aWMgaW50IGZhbl9yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7Ci0JaW50IHM7Ci0JdTggbG8sIGhpLCBzdGF0dXM7CisJaW50IHJjOworCXU4IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc3BlZWQgPSAwOwogCi0JaWYgKGdmYW5faGFuZGxlKSB7CisJc3dpdGNoIChmYW5fc3RhdHVzX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBJQk1BQ1BJX0ZBTl9SRF9BQ1BJX0dGQU46CiAJCS8qIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCWlmICghYWNwaV9ldmFsZihnZmFuX2hhbmRsZSwgJnMsIE5VTEwsICJkIikpCi0JCQlyZXR1cm4gLUVJTzsKKwkJaWYgKChyYyA9IGZhbl9nZXRfc3RhdHVzKCZzdGF0dXMpKSA8IDApCisJCQlyZXR1cm4gcmM7CiAKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHQlZFxuIiwgcyk7Ci0JfSBlbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIKKwkJCSAgICAgICAibGV2ZWw6XHRcdCVkXG4iLAorCQkJICAgICAgIChzdGF0dXMgIT0gMCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgSUJNQUNQSV9GQU5fUkRfVFBFQzoKIAkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCQlpZiAoIWFjcGlfZWNfcmVhZChmYW5fc3RhdHVzX29mZnNldCwgJnN0YXR1cykpCi0JCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHR1bnJlYWRhYmxlXG4iKTsKLQkJZWxzZQotCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCi0JCQkJICAgICAgIGVuYWJsZWQoc3RhdHVzLCA3KSk7CisJCWlmICgocmMgPSBmYW5fZ2V0X3N0YXR1cygmc3RhdHVzKSkgPCAwKQorCQkJcmV0dXJuIHJjOwogCi0JCWlmICghYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0LCAmbG8pIHx8Ci0JCSAgICAhYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0ICsgMSwgJmhpKSkKLQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzcGVlZDpcdFx0dW5yZWFkYWJsZVxuIik7CisJCWlmICh1bmxpa2VseSghZmFuX2NvbnRyb2xfc3RhdHVzX2tub3duKSkgeworCQkJaWYgKHN0YXR1cyAhPSBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cykKKwkJCQlmYW5fY29udHJvbF9zdGF0dXNfa25vd24gPSAxOworCQkJZWxzZQorCQkJCS8qIFJldHVybiBtb3N0IGxpa2VseSBzdGF0dXMuIEluIGZhY3QsIGl0CisJCQkJICogbWlnaHQgYmUgdGhlIG9ubHkgcG9zc2libGUgc3RhdHVzICovCisJCQkJc3RhdHVzID0gSUJNQUNQSV9GQU5fRUNfQVVUTzsKKwkJfQorCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLAorCQkJICAgICAgIChzdGF0dXMgIT0gMCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCQkvKiBObyBUaGlua1BhZCBib290cyBvbiBkaXNlbmdhZ2VkIG1vZGUsIHdlIGNhbiBzYWZlbHkKKwkJICogYXNzdW1lIHRoZSB0YWNob21ldGVyIGlzIG9ubGluZSBpZiBmYW4gY29udHJvbCBzdGF0dXMKKwkJICogd2FzIHVua25vd24gKi8KKwkJaWYgKChyYyA9IGZhbl9nZXRfc3BlZWQoJnNwZWVkKSkgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzcGVlZDpcdFx0JWRcbiIsIHNwZWVkKTsKKworCQlpZiAoc3RhdHVzICYgSUJNQUNQSV9GQU5fRUNfRElTRU5HQUdFRCkKKwkJCS8qIERpc2VuZ2FnZWQgbW9kZSB0YWtlcyBwcmVjZWRlbmNlICovCisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdGRpc2VuZ2FnZWRcbiIpOworCQllbHNlIGlmIChzdGF0dXMgJiBJQk1BQ1BJX0ZBTl9FQ19BVVRPKQorCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHRhdXRvXG4iKTsKIAkJZWxzZQotCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInNwZWVkOlx0XHQlZFxuIiwKLQkJCQkgICAgICAgKGhpIDw8IDgpICsgbG8pOworCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHQlZFxuIiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIElCTUFDUElfRkFOX05PTkU6CisJZGVmYXVsdDoKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CiAJfQogCi0JaWYgKHNmYW5faGFuZGxlKQotCQkvKiA1NzAsIDc3MHgtSkwgKi8KLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGV2ZWwgPGxldmVsPiIKLQkJCSAgICAgICAiICg8bGV2ZWw+IGlzIDAtNylcbiIpOwotCWlmICghZ2Zhbl9oYW5kbGUpCi0JCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlXG4iKTsKLQlpZiAoZmFuc19oYW5kbGUpCi0JCS8qIFgzMSwgWDQwICovCisJaWYgKGZhbl9jb250cm9sX2NvbW1hbmRzICYgSUJNQUNQSV9GQU5fQ01EX0xFVkVMKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGxldmVsIDxsZXZlbD4iKTsKKworCQlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7CisJCWNhc2UgSUJNQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgorCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiAoPGxldmVsPiBpcyAwLTcpXG4iKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiICg8bGV2ZWw+IGlzIDAtNywgIgorCQkJCSAgICAgICAiYXV0bywgZGlzZW5nYWdlZClcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBJQk1BQ1BJX0ZBTl9DTURfRU5BQkxFKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGVcbiIKKwkJCSAgICAgICAiY29tbWFuZHM6XHR3YXRjaGRvZyA8dGltZW91dD4gKDx0aW1lb3V0PiBpcyAwIChvZmYpLCAiCisJCQkgICAgICAgIjEtMTIwIChzZWNvbmRzKSlcbiIpOworCisJaWYgKGZhbl9jb250cm9sX2NvbW1hbmRzICYgSUJNQUNQSV9GQU5fQ01EX1NQRUVEKQogCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRzcGVlZCA8c3BlZWQ+IgogCQkJICAgICAgICIgKDxzcGVlZD4gaXMgMC02NTUzNSlcbiIpOwogCiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBmYW5fd3JpdGUoY2hhciAqYnVmKQorc3RhdGljIGludCBmYW5fc2V0X2xldmVsKGludCBsZXZlbCkKIHsKLQljaGFyICpjbWQ7Ci0JaW50IGxldmVsLCBzcGVlZDsKLQotCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmIChzZmFuX2hhbmRsZSAmJgotCQkgICAgc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJmxldmVsKSA9PSAxICYmCi0JCSAgICBsZXZlbCA+PSAwICYmIGxldmVsIDw9IDcpIHsKLQkJCS8qIDU3MCwgNzcweC1KTCAqLworCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKKwljYXNlIElCTUFDUElfRkFOX1dSX0FDUElfU0ZBTjoKKwkJaWYgKGxldmVsID49IDAgJiYgbGV2ZWwgPD0gNykgewogCQkJaWYgKCFhY3BpX2V2YWxmKHNmYW5faGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBsZXZlbCkpCiAJCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAoIWdmYW5faGFuZGxlICYmIHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSA9PSAwKSB7Ci0JCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIDB4ODApKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UgaWYgKCFnZmFuX2hhbmRsZSAmJiBzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKLQkJCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkJCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgMHgwMCkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAoZmFuc19oYW5kbGUgJiYKLQkJCSAgIHNzY2FuZihjbWQsICJzcGVlZCAlZCIsICZzcGVlZCkgPT0gMSAmJgotCQkJICAgc3BlZWQgPj0gMCAmJiBzcGVlZCA8PSA2NTUzNSkgewotCQkJLyogWDMxLCBYNDAgKi8KKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIElCTUFDUElfRkFOX1dSX0FDUElfRkFOUzoKKwljYXNlIElCTUFDUElfRkFOX1dSX1RQRUM6CisJCWlmICgobGV2ZWwgIT0gSUJNQUNQSV9GQU5fRUNfQVVUTykgJiYKKwkJICAgIChsZXZlbCAhPSBJQk1BQ1BJX0ZBTl9FQ19ESVNFTkdBR0VEKSAmJgorCQkgICAgKChsZXZlbCA8IDApIHx8IChsZXZlbCA+IDcpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgbGV2ZWwpKQorCQkJcmV0dXJuIC1FSU87CisJCWVsc2UKKwkJCWZhbl9jb250cm9sX3N0YXR1c19rbm93biA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3NldF9lbmFibGUodm9pZCkKK3sKKwl1OCBzOworCWludCByYzsKKworCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKKwljYXNlIElCTUFDUElfRkFOX1dSX0FDUElfRkFOUzoKKwljYXNlIElCTUFDUElfRkFOX1dSX1RQRUM6CisJCWlmICgocmMgPSBmYW5fZ2V0X3N0YXR1cygmcykpIDwgMCkKKwkJCXJldHVybiByYzsKKworCQkvKiBEb24ndCBnbyBvdXQgb2YgZW1lcmdlbmN5IGZhbiBtb2RlICovCisJCWlmIChzICE9IDcpCisJCQlzID0gSUJNQUNQSV9GQU5fRUNfQVVUTzsKKworCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIHMpKQorCQkJcmV0dXJuIC1FSU87CisJCWVsc2UKKwkJCWZhbl9jb250cm9sX3N0YXR1c19rbm93biA9IDE7CisJCWJyZWFrOworCisJY2FzZSBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisJCWlmICgocmMgPSBmYW5fZ2V0X3N0YXR1cygmcykpIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlzICY9IDB4MDc7CisKKwkJLyogU2V0IGZhbiB0byBhdCBsZWFzdCBsZXZlbCA0ICovCisJCWlmIChzIDwgNCkKKwkJCXMgPSA0OworCisJCWlmICghYWNwaV9ldmFsZihzZmFuX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgcykpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOWElPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYW5fc2V0X2Rpc2FibGUodm9pZCkKK3sKKwlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisJY2FzZSBJQk1BQ1BJX0ZBTl9XUl9UUEVDOgorCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIDB4MDApKQorCQkJcmV0dXJuIC1FSU87CisJCWVsc2UKKwkJCWZhbl9jb250cm9sX3N0YXR1c19rbm93biA9IDE7CisJCWJyZWFrOworCisJY2FzZSBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisJCWlmICghYWNwaV9ldmFsZihzZmFuX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgMHgwMCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOWElPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYW5fc2V0X3NwZWVkKGludCBzcGVlZCkKK3sKKwlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisJCWlmIChzcGVlZCA+PSAwICYmIHNwZWVkIDw9IDY1NTM1KSB7CiAJCQlpZiAoIWFjcGlfZXZhbGYoZmFuc19oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGRkIiwKIAkJCQkJc3BlZWQsIHNwZWVkLCBzcGVlZCkpCiAJCQkJcmV0dXJuIC1FSU87CiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9sZXZlbChjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCit7CisJaW50IGxldmVsOworCisJaWYgKHN0cmxlbmNtcChjbWQsICJsZXZlbCBhdXRvIikgPT0gMCkKKwkJbGV2ZWwgPSBJQk1BQ1BJX0ZBTl9FQ19BVVRPOworCWVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJsZXZlbCBkaXNlbmdhZ2VkIikgPT0gMCkKKwkJbGV2ZWwgPSBJQk1BQ1BJX0ZBTl9FQ19ESVNFTkdBR0VEOworCWVsc2UgaWYgKHNzY2FuZihjbWQsICJsZXZlbCAlZCIsICZsZXZlbCkgIT0gMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKCpyYyA9IGZhbl9zZXRfbGV2ZWwobGV2ZWwpKSA9PSAtRU5YSU8pCisJCXByaW50ayhJQk1fRVJSICJsZXZlbCBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCisJCSAgICAgICAiYWNjZXNzIG1vZGUgJWQiLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX2VuYWJsZShjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCit7CisJaWYgKHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCWlmICgoKnJjID0gZmFuX3NldF9lbmFibGUoKSkgPT0gLUVOWElPKQorCQlwcmludGsoSUJNX0VSUiAiZW5hYmxlIGNvbW1hbmQgYWNjZXB0ZWQgZm9yIHVuc3VwcG9ydGVkICIKKwkJICAgICAgICJhY2Nlc3MgbW9kZSAlZCIsIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfZGlzYWJsZShjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCit7CisJaWYgKHN0cmxlbmNtcChjbWQsICJkaXNhYmxlIikgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKCpyYyA9IGZhbl9zZXRfZGlzYWJsZSgpKSA9PSAtRU5YSU8pCisJCXByaW50ayhJQk1fRVJSICJkaXNhYmxlIGNvbW1hbmQgYWNjZXB0ZWQgZm9yIHVuc3VwcG9ydGVkICIKKwkJICAgICAgICJhY2Nlc3MgbW9kZSAlZCIsIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfc3BlZWQoY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKQoreworCWludCBzcGVlZDsKKworCS8qIFRPRE86CisJICogU3VwcG9ydCBzcGVlZCA8bG93PiA8bWVkaXVtPiA8aGlnaD4gPyAqLworCisJaWYgKHNzY2FuZihjbWQsICJzcGVlZCAlZCIsICZzcGVlZCkgIT0gMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKCpyYyA9IGZhbl9zZXRfc3BlZWQoc3BlZWQpKSA9PSAtRU5YSU8pCisJCXByaW50ayhJQk1fRVJSICJzcGVlZCBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCisJCSAgICAgICAiYWNjZXNzIG1vZGUgJWQiLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX3dhdGNoZG9nKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKK3sKKwlpbnQgaW50ZXJ2YWw7CisKKwlpZiAoc3NjYW5mKGNtZCwgIndhdGNoZG9nICVkIiwgJmludGVydmFsKSAhPSAxKQorCQlyZXR1cm4gMDsKKworCWlmIChpbnRlcnZhbCA8IDAgfHwgaW50ZXJ2YWwgPiAxMjApCisJCSpyYyA9IC1FSU5WQUw7CisJZWxzZQorCQlmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwgPSBpbnRlcnZhbDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZhbl93cml0ZShjaGFyICpidWYpCit7CisJY2hhciAqY21kOworCWludCByYyA9IDA7CisKKwl3aGlsZSAoIXJjICYmIChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKCEoKGZhbl9jb250cm9sX2NvbW1hbmRzICYgSUJNQUNQSV9GQU5fQ01EX0xFVkVMKSAmJgorCQkgICAgICBmYW5fd3JpdGVfY21kX2xldmVsKGNtZCwgJnJjKSkgJiYKKwkJICAgICEoKGZhbl9jb250cm9sX2NvbW1hbmRzICYgSUJNQUNQSV9GQU5fQ01EX0VOQUJMRSkgJiYKKwkJICAgICAgKGZhbl93cml0ZV9jbWRfZW5hYmxlKGNtZCwgJnJjKSB8fAorCQkgICAgICAgZmFuX3dyaXRlX2NtZF9kaXNhYmxlKGNtZCwgJnJjKSB8fAorCQkgICAgICAgZmFuX3dyaXRlX2NtZF93YXRjaGRvZyhjbWQsICZyYykpKSAmJgorCQkgICAgISgoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBJQk1BQ1BJX0ZBTl9DTURfU1BFRUQpICYmCisJCSAgICAgIGZhbl93cml0ZV9jbWRfc3BlZWQoY21kLCAmcmMpKQorCQkgICAgKQorCQkJcmMgPSAtRUlOVkFMOworCQllbHNlIGlmICghcmMpCisJCQlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGZhbl93YXRjaGRvZ19maXJlKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCkKK3sKKwlwcmludGsoSUJNX05PVElDRSAiZmFuIHdhdGNoZG9nOiBlbmFibGluZyBmYW5cbiIpOworCWlmIChmYW5fc2V0X2VuYWJsZSgpKSB7CisJCXByaW50ayhJQk1fRVJSICJmYW4gd2F0Y2hkb2c6IGVycm9yIHdoaWxlIGVuYWJsaW5nIGZhblxuIik7CisJCS8qIHJlc2NoZWR1bGUgZm9yIGxhdGVyICovCisJCWZhbl93YXRjaGRvZ19yZXNldCgpOworCX0KIH0KIAogc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGlibXNbXSA9IHsKQEAgLTE2NjIsNiArMjM1NCw3IEBACiAJIC50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAogCSB9LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FDUElfSUJNX0JBWQogCXsKIAkgLm5hbWUgPSAiYmF5IiwKIAkgLmluaXQgPSBiYXlfaW5pdCwKQEAgLTE2NzEsNiArMjM2NCw3IEBACiAJIC5oYW5kbGUgPSAmYmF5X2hhbmRsZSwKIAkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCiAJIH0sCisjZW5kaWYKIAl7CiAJIC5uYW1lID0gImNtb3MiLAogCSAucmVhZCA9IGNtb3NfcmVhZCwKQEAgLTE3MDIsMTggKzIzOTYsMjAgQEAKIAkgLm5hbWUgPSAiYnJpZ2h0bmVzcyIsCiAJIC5yZWFkID0gYnJpZ2h0bmVzc19yZWFkLAogCSAud3JpdGUgPSBicmlnaHRuZXNzX3dyaXRlLAotCSAuZXhwZXJpbWVudGFsID0gMSwKKwkgLmluaXQgPSBicmlnaHRuZXNzX2luaXQsCisJIC5leGl0ID0gYnJpZ2h0bmVzc19leGl0LAogCSB9LAogCXsKIAkgLm5hbWUgPSAidm9sdW1lIiwKIAkgLnJlYWQgPSB2b2x1bWVfcmVhZCwKIAkgLndyaXRlID0gdm9sdW1lX3dyaXRlLAotCSAuZXhwZXJpbWVudGFsID0gMSwKIAkgfSwKIAl7CiAJIC5uYW1lID0gImZhbiIsCiAJIC5yZWFkID0gZmFuX3JlYWQsCiAJIC53cml0ZSA9IGZhbl93cml0ZSwKKwkgLmluaXQgPSBmYW5faW5pdCwKKwkgLmV4aXQgPSBmYW5fZXhpdCwKIAkgLmV4cGVyaW1lbnRhbCA9IDEsCiAJIH0sCiB9OwpAQCAtMTgyNyw3ICsyNTIzLDcgQEAKIAl9CiAKIAltZW1zZXQoaWJtLT5kcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9kcml2ZXIpKTsKLQlzcHJpbnRmKGlibS0+ZHJpdmVyLT5uYW1lLCAiJXMvJXMiLCBJQk1fTkFNRSwgaWJtLT5uYW1lKTsKKwlzcHJpbnRmKGlibS0+ZHJpdmVyLT5uYW1lLCAiJXNfJXMiLCBJQk1fTkFNRSwgaWJtLT5uYW1lKTsKIAlpYm0tPmRyaXZlci0+aWRzID0gaWJtLT5oaWQ7CiAJaWJtLT5kcml2ZXItPm9wcy5hZGQgPSAmaWJtX2RldmljZV9hZGQ7CiAKQEAgLTE5NTYsNyArMjY1Miw5IEBACiAjaWZkZWYgQ09ORklHX0FDUElfSUJNX0RPQ0sKIElCTV9QQVJBTShkb2NrKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19BQ1BJX0lCTV9CQVkKIElCTV9QQVJBTShiYXkpOworI2VuZGlmCiBJQk1fUEFSQU0oY21vcyk7CiBJQk1fUEFSQU0obGVkKTsKIElCTV9QQVJBTShiZWVwKTsKQEAgLTE5NzMsNiArMjY3MSwzMyBAQAogCQlpYm1fZXhpdCgmaWJtc1tpXSk7CiAKIAlyZW1vdmVfcHJvY19lbnRyeShJQk1fRElSLCBhY3BpX3Jvb3RfZGlyKTsKKworCWlmIChpYm1fdGhpbmtwYWRfZWNfZm91bmQpCisJCWtmcmVlKGlibV90aGlua3BhZF9lY19mb3VuZCk7Cit9CisKK3N0YXRpYyBjaGFyKiBfX2luaXQgY2hlY2tfZG1pX2Zvcl9lYyh2b2lkKQoreworCXN0cnVjdCBkbWlfZGV2aWNlICpkZXYgPSBOVUxMOworCWNoYXIgZWNfZndfc3RyaW5nWzE4XTsKKworCS8qCisJICogVGhpbmtQYWQgVDIzIG9yIG5ld2VyLCBBMzEgb3IgbmV3ZXIsIFI1MGUgb3IgbmV3ZXIsCisJICogWDMyIG9yIG5ld2VyLCBhbGwgWiBzZXJpZXM7ICBTb21lIG1vZGVscyBtdXN0IGhhdmUgYW4KKwkgKiB1cC10by1kYXRlIEJJT1Mgb3IgdGhleSB3aWxsIG5vdCBiZSBkZXRlY3RlZC4KKwkgKgorCSAqIFNlZSBodHRwOi8vdGhpbmt3aWtpLm9yZy93aWtpL0xpc3Rfb2ZfRE1JX0lEcworCSAqLworCXdoaWxlICgoZGV2ID0gZG1pX2ZpbmRfZGV2aWNlKERNSV9ERVZfVFlQRV9PRU1fU1RSSU5HLCBOVUxMLCBkZXYpKSkgeworCQlpZiAoc3NjYW5mKGRldi0+bmFtZSwKKwkJCSAgICJJQk0gVGhpbmtQYWQgRW1iZWRkZWQgQ29udHJvbGxlciAtWyUxN2MiLAorCQkJICAgZWNfZndfc3RyaW5nKSA9PSAxKSB7CisJCQllY19md19zdHJpbmdbc2l6ZW9mKGVjX2Z3X3N0cmluZykgLSAxXSA9IDA7CisJCQllY19md19zdHJpbmdbc3RyY3NwbihlY19md19zdHJpbmcsICIgXSIpXSA9IDA7CisJCQlyZXR1cm4ga3N0cmR1cChlY19md19zdHJpbmcsIEdGUF9LRVJORUwpOworCQl9CisJfQorCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX2libV9pbml0KHZvaWQpCkBAIC0xOTk0LDYgKzI3MTksMTIgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJLyogTW9kZWxzIHdpdGggbmV3ZXIgZmlybXdhcmUgcmVwb3J0IHRoZSBFQyBpbiBETUkgKi8KKwlpYm1fdGhpbmtwYWRfZWNfZm91bmQgPSBjaGVja19kbWlfZm9yX2VjKCk7CisJaWYgKGlibV90aGlua3BhZF9lY19mb3VuZCkKKwkJcHJpbnRrKElCTV9JTkZPICJUaGlua1BhZCBFQyBmaXJtd2FyZSAlc1xuIiwKKwkJICAgICAgIGlibV90aGlua3BhZF9lY19mb3VuZCk7CisKIAkvKiB0aGVzZSBoYW5kbGVzIGFyZSBub3QgcmVxdWlyZWQgKi8KIAlJQk1fSEFORExFX0lOSVQodmlkKTsKIAlJQk1fSEFORExFX0lOSVQodmlkMik7CkBAIC0yMDA2LDEyICsyNzM3LDE0IEBACiAJSUJNX0hBTkRMRV9JTklUKGRvY2spOwogI2VuZGlmCiAJSUJNX0hBTkRMRV9JTklUKHBjaSk7CisjaWZkZWYgQ09ORklHX0FDUElfSUJNX0JBWQogCUlCTV9IQU5ETEVfSU5JVChiYXkpOwogCWlmIChiYXlfaGFuZGxlKQogCQlJQk1fSEFORExFX0lOSVQoYmF5X2VqKTsKIAlJQk1fSEFORExFX0lOSVQoYmF5Mik7CiAJaWYgKGJheTJfaGFuZGxlKQogCQlJQk1fSEFORExFX0lOSVQoYmF5Ml9laik7CisjZW5kaWYKIAlJQk1fSEFORExFX0lOSVQoYmVlcCk7CiAJSUJNX0hBTkRMRV9JTklUKGVjcmQpOwogCUlCTV9IQU5ETEVfSU5JVChlY3dyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jIGIvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMKaW5kZXggZWM2YjdmOS4uMmUxN2VjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMKKysrIGIvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMKQEAgLTQ4LDYgKzQ4LDEyIEBACiAgKiB0aGUgaW8gcG9ydHMgaWYgdGhleSByZWFsbHkga25vdyB0aGV5IGNhbiB1c2UgaXQsIHdoaWxlCiAgKiBzdGlsbCBwcmV2ZW50aW5nIGhvdHBsdWcgUENJIGRldmljZXMgZnJvbSB1c2luZyBpdC4KICAqLworCisvKgorICogV2hlbiBDT05GSUdfUE5QIGlzIGVuYWJsZWQsIHBucC9zeXN0ZW0uYyBiaW5kcyB0byBQTlAwQzAxCisgKiBhbmQgUE5QMEMwMiwgcmVkdW5kYW50IHdpdGggYWNwaV9yZXNlcnZlX2lvX3JhbmdlcygpLgorICogQnV0IGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMoKSBpcyBuZWNlc3NhcnkgZm9yICFDT05GSUdfUE5QLgorICovCiBzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9yZXNlcnZlX2lvX3JhbmdlcyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVxdWVzdGVkX3JlcyA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvb3NsLmMgYi9kcml2ZXJzL2FjcGkvb3NsLmMKaW5kZXggMmVkMmQ3MC4uYjdjYTAyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9vc2wuYwpAQCAtNTAsNiArNTAsNyBAQAogc3RydWN0IGFjcGlfb3NfZHBjIHsKIAlhY3BpX29zZF9leGVjX2NhbGxiYWNrIGZ1bmN0aW9uOwogCXZvaWQgKmNvbnRleHQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiB9OwogCiAjaWZkZWYgQ09ORklHX0FDUElfQ1VTVE9NX0RTRFQKQEAgLTU2NCwxMiArNTY1LDEwIEBACiAJYWNwaV9vc19kZXJpdmVfcGNpX2lkXzIocmhhbmRsZSwgY2hhbmRsZSwgaWQsICZpc19icmlkZ2UsICZidXNfbnVtYmVyKTsKIH0KIAotc3RhdGljIHZvaWQgYWNwaV9vc19leGVjdXRlX2RlZmVycmVkKHZvaWQgKmNvbnRleHQpCitzdGF0aWMgdm9pZCBhY3BpX29zX2V4ZWN1dGVfZGVmZXJyZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhY3BpX29zX2RwYyAqZHBjID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9vc19kcGMgKmRwYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWNwaV9vc19kcGMsIHdvcmspOwogCi0KLQlkcGMgPSBjb250ZXh0OwogCWlmICghZHBjKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgKE5VTEwpIGNvbnRleHRcbiIpOwogCQlyZXR1cm47CkBAIC02MDIsNyArNjAxLDYgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9vc19kcGMgKmRwYzsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnRhc2s7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJvc19xdWV1ZV9mb3JfZXhlY3V0aW9uIik7CiAKQEAgLTYxNSwyOCArNjEzLDIyIEBACiAKIAkvKgogCSAqIEFsbG9jYXRlL2luaXRpYWxpemUgRFBDIHN0cnVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIG1lbW9yeSB3aWxsIGJlCi0JICogZnJlZWQgYnkgdGhlIGNhbGxlZS4gIFRoZSBrZXJuZWwgaGFuZGxlcyB0aGUgdHFfc3RydWN0IGxpc3QgIGluIGEKKwkgKiBmcmVlZCBieSB0aGUgY2FsbGVlLiAgVGhlIGtlcm5lbCBoYW5kbGVzIHRoZSB3b3JrX3N0cnVjdCBsaXN0ICBpbiBhCiAJICogd2F5IHRoYXQgYWxsb3dzIHVzIHRvIGFsc28gZnJlZSBpdHMgbWVtb3J5IGluc2lkZSB0aGUgY2FsbGVlLgogCSAqIEJlY2F1c2Ugd2UgbWF5IHdhbnQgdG8gc2NoZWR1bGUgc2V2ZXJhbCB0YXNrcyB3aXRoIGRpZmZlcmVudAogCSAqIHBhcmFtZXRlcnMgd2UgY2FuJ3QgdXNlIHRoZSBhcHByb2FjaCBzb21lIGtlcm5lbCBjb2RlIHVzZXMgb2YKLQkgKiBoYXZpbmcgYSBzdGF0aWMgdHFfc3RydWN0LgotCSAqIFdlIGNhbiBzYXZlIHRpbWUgYW5kIGNvZGUgYnkgYWxsb2NhdGluZyB0aGUgRFBDIGFuZCB0cV9zdHJ1Y3RzCi0JICogZnJvbSB0aGUgc2FtZSBtZW1vcnkuCisJICogaGF2aW5nIGEgc3RhdGljIHdvcmtfc3RydWN0LgogCSAqLwogCi0JZHBjID0KLQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfb3NfZHBjKSArIHNpemVvZihzdHJ1Y3Qgd29ya19zdHJ1Y3QpLAotCQkgICAgR0ZQX0FUT01JQyk7CisJZHBjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfb3NfZHBjKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFkcGMpCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCiAJZHBjLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogCWRwYy0+Y29udGV4dCA9IGNvbnRleHQ7CiAKLQl0YXNrID0gKHZvaWQgKikoZHBjICsgMSk7Ci0JSU5JVF9XT1JLKHRhc2ssIGFjcGlfb3NfZXhlY3V0ZV9kZWZlcnJlZCwgKHZvaWQgKilkcGMpOwotCi0JaWYgKCFxdWV1ZV93b3JrKGthY3BpZF93cSwgdGFzaykpIHsKKwlJTklUX1dPUksoJmRwYy0+d29yaywgYWNwaV9vc19leGVjdXRlX2RlZmVycmVkKTsKKwlpZiAoIXF1ZXVlX3dvcmsoa2FjcGlkX3dxLCAmZHBjLT53b3JrKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAogCQkJCSAgIkNhbGwgdG8gcXVldWVfd29yaygpIGZhaWxlZC5cbiIpKTsKIAkJa2ZyZWUoZHBjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKaW5kZXggNjcxODE5OC4uODEyZDczMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCWlmICghbGluayB8fCAhaXJxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJlc291cmNlID0ga21hbGxvYyhzaXplb2YoKnJlc291cmNlKSArIDEsIEdGUF9BVE9NSUMpOworCXJlc291cmNlID0ga21hbGxvYyhzaXplb2YoKnJlc291cmNlKSArIDEsIGlycXNfZGlzYWJsZWQoKSA/IEdGUF9BVE9NSUM6IEdGUF9LRVJORUwpOwogCWlmICghcmVzb3VyY2UpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcG93ZXIuYyBiL2RyaXZlcnMvYWNwaS9wb3dlci5jCmluZGV4IGU5ZGFiNTQuLjIzYThhOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wb3dlci5jCisrKyBiL2RyaXZlcnMvYWNwaS9wb3dlci5jCkBAIC0yMTYsMTAgKzIxNiw4IEBACiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CiAKLQogCXJlc3VsdCA9IGFjcGlfcG93ZXJfZ2V0X2NvbnRleHQoaGFuZGxlLCAmcmVzb3VyY2UpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybiByZXN1bHQ7CkBAIC0yMzAsMTMgKzIyOCwxMyBAQAogCWlmIChyZXNvdXJjZS0+cmVmZXJlbmNlcykgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJICAiUmVzb3VyY2UgWyVzXSBpcyBzdGlsbCBpbiB1c2UsIGRlcmVmZXJlbmNpbmdcbiIsCi0JCQkJICBkZXZpY2UtPnBucC5idXNfaWQpKTsKKwkJCQkgIHJlc291cmNlLT5kZXZpY2UtPnBucC5idXNfaWQpKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHJlc291cmNlLT5zdGF0ZSA9PSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09GRikgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBbJXNdIGFscmVhZHkgb2ZmXG4iLAotCQkJCSAgZGV2aWNlLT5wbnAuYnVzX2lkKSk7CisJCQkJICByZXNvdXJjZS0+ZGV2aWNlLT5wbnAuYnVzX2lkKSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjUxLDggKzI0OSw3IEBACiAJCXJldHVybiAtRU5PRVhFQzsKIAogCS8qIFVwZGF0ZSB0aGUgcG93ZXIgcmVzb3VyY2UncyBfZGV2aWNlXyBwb3dlciBzdGF0ZSAqLwotCWRldmljZSA9IHJlc291cmNlLT5kZXZpY2U7Ci0JZGV2aWNlLT5wb3dlci5zdGF0ZSA9IEFDUElfU1RBVEVfRDM7CisJcmVzb3VyY2UtPmRldmljZS0+cG93ZXIuc3RhdGUgPSBBQ1BJX1NUQVRFX0QzOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUmVzb3VyY2UgWyVzXSB0dXJuZWQgb2ZmXG4iLAogCQkJICByZXNvdXJjZS0+bmFtZSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCA0NGM2MjRiLi4zZTcwYTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtNTE5LDcgKzUxOSw3IEBACiAKIHN0YXRpYyB2b2lkICpwcm9jZXNzb3JfZGV2aWNlX2FycmF5W05SX0NQVVNdOwogCi1zdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2NwdWluaXQgYWNwaV9wcm9jZXNzb3Jfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IDQ1MDQ2ODQuLjRmMjk4MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC0yMTksNiArMjE5LDIzIEBACiAKIHN0YXRpYyBhdG9taWNfdCBjM19jcHVfY291bnQ7CiAKKy8qIENvbW1vbiBDLXN0YXRlIGVudHJ5IGZvciBDMiwgQzMsIC4uICovCitzdGF0aWMgdm9pZCBhY3BpX2NzdGF0ZV9lbnRlcihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmNzdGF0ZSkKK3sKKwlpZiAoY3N0YXRlLT5zcGFjZV9pZCA9PSBBQ1BJX0NTVEFURV9GRkgpIHsKKwkJLyogQ2FsbCBpbnRvIGFyY2hpdGVjdHVyYWwgRkZIIGJhc2VkIEMtc3RhdGUgKi8KKwkJYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9lbnRlcihjc3RhdGUpOworCX0gZWxzZSB7CisJCWludCB1bnVzZWQ7CisJCS8qIElPIHBvcnQgYmFzZWQgQy1zdGF0ZSAqLworCQlpbmIoY3N0YXRlLT5hZGRyZXNzKTsKKwkJLyogRHVtbXkgd2FpdCBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwyIHJlYWQKKwkJICAgYmVjYXVzZSBjaGlwc2V0cyBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgU1RQQ0xLIyBzaWduYWwKKwkJICAgZ2V0cyBhc3NlcnRlZCBpbiB0aW1lIHRvIGZyZWV6ZSBleGVjdXRpb24gcHJvcGVybHkuICovCisJCXVudXNlZCA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9pZGxlKHZvaWQpCiB7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IE5VTEw7CkBAIC0zNjEsMTEgKzM3OCw3IEBACiAJCS8qIEdldCBzdGFydCB0aW1lICh0aWNrcykgKi8KIAkJdDEgPSBpbmwoYWNwaV9mYWR0LnhwbV90bXJfYmxrLmFkZHJlc3MpOwogCQkvKiBJbnZva2UgQzIgKi8KLQkJaW5iKGN4LT5hZGRyZXNzKTsKLQkJLyogRHVtbXkgd2FpdCBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwyIHJlYWQKLQkJICAgYmVjYXVzZSBjaGlwc2V0cyBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgU1RQQ0xLIyBzaWduYWwKLQkJICAgZ2V0cyBhc3NlcnRlZCBpbiB0aW1lIHRvIGZyZWV6ZSBleGVjdXRpb24gcHJvcGVybHkuICovCi0JCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKKwkJYWNwaV9jc3RhdGVfZW50ZXIoY3gpOwogCQkvKiBHZXQgZW5kIHRpbWUgKHRpY2tzKSAqLwogCQl0MiA9IGlubChhY3BpX2ZhZHQueHBtX3Rtcl9ibGsuYWRkcmVzcyk7CiAKQEAgLTQwMSw5ICs0MTQsNyBAQAogCQkvKiBHZXQgc3RhcnQgdGltZSAodGlja3MpICovCiAJCXQxID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKIAkJLyogSW52b2tlIEMzICovCi0JCWluYihjeC0+YWRkcmVzcyk7Ci0JCS8qIER1bW15IHdhaXQgb3AgKHNlZSBhYm92ZSkgKi8KLQkJdDIgPSBpbmwoYWNwaV9mYWR0LnhwbV90bXJfYmxrLmFkZHJlc3MpOworCQlhY3BpX2NzdGF0ZV9lbnRlcihjeCk7CiAJCS8qIEdldCBlbmQgdGltZSAodGlja3MpICovCiAJCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKIAkJaWYgKHByLT5mbGFncy5ibV9jaGVjaykgewpAQCAtNjI4LDIwICs2MzksMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKLQotCS8qIFplcm8gaW5pdGlhbGl6ZSBhbGwgdGhlIEMtc3RhdGVzIGluZm8uICovCi0JbWVtc2V0KHByLT5wb3dlci5zdGF0ZXMsIDAsIHNpemVvZihwci0+cG93ZXIuc3RhdGVzKSk7Ci0KLQkvKiBzZXQgdGhlIGZpcnN0IEMtU3RhdGUgdG8gQzEgKi8KLQlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnR5cGUgPSBBQ1BJX1NUQVRFX0MxOwotCi0JLyogdGhlIEMwIHN0YXRlIG9ubHkgZXhpc3RzIGFzIGEgZmlsbGVyIGluIG91ciBhcnJheSwKLQkgKiBhbmQgYWxsIHByb2Nlc3NvcnMgbmVlZCB0byBzdXBwb3J0IEMxICovCisJaWYgKCFwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnZhbGlkKSB7CisJCS8qIHNldCB0aGUgZmlyc3QgQy1TdGF0ZSB0byBDMSAqLworCQkvKiBhbGwgcHJvY2Vzc29ycyBuZWVkIHRvIHN1cHBvcnQgQzEgKi8KKwkJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MxXS50eXBlID0gQUNQSV9TVEFURV9DMTsKKwkJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MxXS52YWxpZCA9IDE7CisJfQorCS8qIHRoZSBDMCBzdGF0ZSBvbmx5IGV4aXN0cyBhcyBhIGZpbGxlciBpbiBvdXIgYXJyYXkgKi8KIAlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzBdLnZhbGlkID0gMTsKLQlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzFdLnZhbGlkID0gMTsKLQogCXJldHVybiAwOwogfQogCkBAIC02NTgsMTIgKzY2NSw3IEBACiAJaWYgKG5vY3N0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWN1cnJlbnRfY291bnQgPSAxOwotCi0JLyogWmVybyBpbml0aWFsaXplIEMyIG9ud2FyZHMgYW5kIHByZXBhcmUgZm9yIGZyZXNoIENTVCBsb29rdXAgKi8KLQlmb3IgKGkgPSAyOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspCi0JCW1lbXNldCgmKHByLT5wb3dlci5zdGF0ZXNbaV0pLCAwLCAKLQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4KSk7CisJY3VycmVudF9jb3VudCA9IDA7CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX0NTVCIsIE5VTEwsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtNzE4LDIyICs3MjAsMzkgQEAKIAkJICAgIChyZWctPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSkKIAkJCWNvbnRpbnVlOwogCi0JCWN4LmFkZHJlc3MgPSAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkgPwotCQkgICAgMCA6IHJlZy0+YWRkcmVzczsKLQogCQkvKiBUaGVyZSBzaG91bGQgYmUgYW4gZWFzeSB3YXkgdG8gZXh0cmFjdCBhbiBpbnRlZ2VyLi4uICovCiAJCW9iaiA9ICYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1sxXSk7CiAJCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpCiAJCQljb250aW51ZTsKIAogCQljeC50eXBlID0gb2JqLT5pbnRlZ2VyLnZhbHVlOworCQkvKgorCQkgKiBTb21lIGJ1Z2d5IEJJT1NlcyB3b24ndCBsaXN0IEMxIGluIF9DU1QgLQorCQkgKiBMZXQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZGVmYXVsdCgpIGhhbmRsZSB0aGVtIGxhdGVyCisJCSAqLworCQlpZiAoaSA9PSAxICYmIGN4LnR5cGUgIT0gQUNQSV9TVEFURV9DMSkKKwkJCWN1cnJlbnRfY291bnQrKzsKIAotCQlpZiAoKGN4LnR5cGUgIT0gQUNQSV9TVEFURV9DMSkgJiYKLQkJICAgIChyZWctPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykpCi0JCQljb250aW51ZTsKKwkJY3guYWRkcmVzcyA9IHJlZy0+YWRkcmVzczsKKwkJY3guaW5kZXggPSBjdXJyZW50X2NvdW50ICsgMTsKIAotCQlpZiAoKGN4LnR5cGUgPCBBQ1BJX1NUQVRFX0MyKSB8fCAoY3gudHlwZSA+IEFDUElfU1RBVEVfQzMpKQotCQkJY29udGludWU7CisJCWN4LnNwYWNlX2lkID0gQUNQSV9DU1RBVEVfU1lTVEVNSU87CisJCWlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB7CisJCQlpZiAoYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZQorCQkJCQkocHItPmlkLCAmY3gsIHJlZykgPT0gMCkgeworCQkJCWN4LnNwYWNlX2lkID0gQUNQSV9DU1RBVEVfRkZIOworCQkJfSBlbHNlIGlmIChjeC50eXBlICE9IEFDUElfU1RBVEVfQzEpIHsKKwkJCQkvKgorCQkJCSAqIEMxIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIEZJWEVEX0hBUkRXQVJFCisJCQkJICogY2FuIGJlIGhhbmRsZWQgaW4gbm9uLU1XQUlUIHdheSBhcyB3ZWxsLgorCQkJCSAqIEluIHRoYXQgY2FzZSwgc2F2ZSB0aGlzIF9DU1QgZW50cnkgaW5mby4KKwkJCQkgKiBUaGF0IGlzLCB3ZSByZXRhaW4gc3BhY2VfaWQgb2YgU1lTVEVNX0lPIGZvcgorCQkJCSAqIGhhbHQgYmFzZWQgQzEuCisJCQkJICogT3RoZXJ3aXNlLCBpZ25vcmUgdGhpcyBpbmZvIGFuZCBjb250aW51ZS4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQogCiAJCW9iaiA9ICYoZWxlbWVudC0+cGFja2FnZS5lbGVtZW50c1syXSk7CiAJCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpCkBAIC05MzgsMTEgKzk1NywxNyBAQAogCS8qIE5PVEU6IHRoZSBpZGxlIHRocmVhZCBtYXkgbm90IGJlIHJ1bm5pbmcgd2hpbGUgY2FsbGluZwogCSAqIHRoaXMgZnVuY3Rpb24gKi8KIAotCS8qIEFkZGluZyBDMSBzdGF0ZSAqLwotCWFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHRfYzEocHIpOworCS8qIFplcm8gaW5pdGlhbGl6ZSBhbGwgdGhlIEMtc3RhdGVzIGluZm8uICovCisJbWVtc2V0KHByLT5wb3dlci5zdGF0ZXMsIDAsIHNpemVvZihwci0+cG93ZXIuc3RhdGVzKSk7CisKIAlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19jc3QocHIpOwogCWlmIChyZXN1bHQgPT0gLUVOT0RFVikKLQkJYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZmFkdChwcik7CisJCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2ZhZHQocHIpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHQocHIpOwogCiAJcHItPnBvd2VyLmNvdW50ID0gYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5KHByKTsKIApAQCAtMTA4Myw2ICsxMTA4LDcgQEAKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAorI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyB2b2lkIHNtcF9jYWxsYmFjayh2b2lkICp2KQogewogCS8qIHdlIGFscmVhZHkgd29rZSB0aGUgQ1BVIHVwLCBub3RoaW5nIG1vcmUgdG8gZG8gKi8KQEAgLTExMDQsOCArMTEzMCw5IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcGlfcHJvY2Vzc29yX2xhdGVuY3lfbm90aWZpZXIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBhY3BpX3Byb2Nlc3Nvcl9sYXRlbmN5X25vdGlmeSwKIH07CisjZW5kaWYKIAotaW50IGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKK2ludCBfX2NwdWluaXQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAogCQkJICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKQEAgLTExMjEsNyArMTE0OCw5IEBACiAJCQkgICAgICAgIkFDUEk6IHByb2Nlc3NvciBsaW1pdGVkIHRvIG1heCBDLXN0YXRlICVkXG4iLAogCQkJICAgICAgIG1heF9jc3RhdGUpOwogCQlmaXJzdF9ydW4rKzsKKyNpZmRlZiBDT05GSUdfU01QCiAJCXJlZ2lzdGVyX2xhdGVuY3lfbm90aWZpZXIoJmFjcGlfcHJvY2Vzc29yX2xhdGVuY3lfbm90aWZpZXIpOworI2VuZGlmCiAJfQogCiAJaWYgKCFwcikKQEAgLTExOTMsNyArMTIyMiw5IEBACiAJCSAqIGNvcGllcyBvZiBwbV9pZGxlIGJlZm9yZSBwcm9jZWVkaW5nLgogCQkgKi8KIAkJY3B1X2lkbGVfd2FpdCgpOworI2lmZGVmIENPTkZJR19TTVAKIAkJdW5yZWdpc3Rlcl9sYXRlbmN5X25vdGlmaWVyKCZhY3BpX3Byb2Nlc3Nvcl9sYXRlbmN5X25vdGlmaWVyKTsKKyNlbmRpZgogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwppbmRleCAzOWZkYmNjLi4wZTYwMzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYwpAQCAtODMsMTAgKzgzLDggQEAKIAkJZ290byBvdXQ7CiAKIAlwcGMgPSAodW5zaWduZWQgaW50KXByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdDsKLQlpZiAoIXBwYykKLQkJZ290byBvdXQ7CiAKLQlpZiAocHBjID4gcHItPnBlcmZvcm1hbmNlLT5zdGF0ZV9jb3VudCkKKwlpZiAocHBjID49IHByLT5wZXJmb3JtYW5jZS0+c3RhdGVfY291bnQpCiAJCWdvdG8gb3V0OwogCiAJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2JzLmMgYi9kcml2ZXJzL2FjcGkvc2JzLmMKaW5kZXggYzZhODE5YS4uMmZiNzUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Nicy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zYnMuYwpAQCAtOTgsMTEgKzk4LDExIEBACiBzdGF0aWMgaW50IHVwZGF0ZV90aW1lID0gVVBEQVRFX1RJTUU7CiBzdGF0aWMgaW50IHVwZGF0ZV90aW1lMiA9IFVQREFURV9USU1FMjsKIAotbW9kdWxlX3BhcmFtKGNhcGFjaXR5X21vZGUsIGludCwgQ0FQQUNJVFlfVU5JVCk7Ci1tb2R1bGVfcGFyYW0odXBkYXRlX21vZGUsIGludCwgVVBEQVRFX01PREUpOwotbW9kdWxlX3BhcmFtKHVwZGF0ZV9pbmZvX21vZGUsIGludCwgVVBEQVRFX0lORk9fTU9ERSk7Ci1tb2R1bGVfcGFyYW0odXBkYXRlX3RpbWUsIGludCwgVVBEQVRFX1RJTUUpOwotbW9kdWxlX3BhcmFtKHVwZGF0ZV90aW1lMiwgaW50LCBVUERBVEVfVElNRTIpOworbW9kdWxlX3BhcmFtKGNhcGFjaXR5X21vZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXBkYXRlX21vZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXBkYXRlX2luZm9fbW9kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1cGRhdGVfdGltZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1cGRhdGVfdGltZTIsIGludCwgMCk7CiAKIHN0YXRpYyBpbnQgYWNwaV9zYnNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV9zYnNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CkBAIC0xNjg1LDEwICsxNjg1LDE2IEBACiAKIGludCBhY3BpX3Nic19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewotCXN0cnVjdCBhY3BpX3NicyAqc2JzID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCXN0cnVjdCBhY3BpX3NicyAqc2JzOwogCWludCBpZDsKIAotCWlmICghZGV2aWNlIHx8ICFzYnMpIHsKKwlpZiAoIWRldmljZSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzYnMgPSAoc3RydWN0IGFjcGlfc2JzICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCisJaWYgKCFzYnMpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKaW5kZXggYWYxZGJhYi4uZmFiOGYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC93YWtldXAuYwpAQCAtMTgzLDExICsxODMsMTEgQEAKICNlbmRpZgogCiAvKgotICogRGlzYWJsZSBhbGwgd2FrZXVwIEdQRXMgYmVmb3JlIHBvd2VyIG9mZi4KLSAqIAorICogRGlzYWJsZSBhbGwgd2FrZXVwIEdQRXMgYmVmb3JlIGVudGVyaW5nIHJlcXVlc3RlZCBzbGVlcCBzdGF0ZS4KKyAqCUBzbGVlcF9zdGF0ZToJQUNQSSBzdGF0ZQogICogU2luY2UgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSgpIHdpbGwgZGlzYWJsZSBhbGwKICAqIFJVTlRJTUUgR1BFcywgd2Ugc2ltcGx5IG1hcmsgYWxsIEdQRVMgdGhhdAotICogYXJlIG5vdCBlbmFibGVkIGZvciB3YWtldXAgZnJvbSBTNSBhcyBSVU5USU1FLgorICogYXJlIG5vdCBlbmFibGVkIGZvciB3YWtldXAgZnJvbSByZXF1ZXN0ZWQgc3RhdGUgYXMgUlVOVElNRS4KICAqLwogdm9pZCBhY3BpX2dwZV9zbGVlcF9wcmVwYXJlKHUzMiBzbGVlcF9zdGF0ZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYwppbmRleCA3ODU2ZGI3Li4xMWUyZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCkBAIC0zMjQsNyArMzI0LDcgQEAKIAogCWlmIChoZWFkZXItPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlRhYmxlIGxlbmd0aCAoJVgpIGlzIHNtYWxsZXIgdGhhbiBtaW5pbXVtICglWCkiLAorCQkJICAgICJUYWJsZSBsZW5ndGggKCVYKSBpcyBzbWFsbGVyIHRoYW4gbWluaW11bSAoJXpYKSIsCiAJCQkgICAgaGVhZGVyLT5sZW5ndGgsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0lOVkFMSURfVEFCTEVfTEVOR1RIKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCmluZGV4IDBhZDNkYmIuLjg2YTVmY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAKIAlpZiAodGFibGVfcHRyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJSU0RUL1hTRFQgbGVuZ3RoICglWCkgaXMgc21hbGxlciB0aGFuIG1pbmltdW0gKCVYKSIsCisJCQkgICAgIlJTRFQvWFNEVCBsZW5ndGggKCVYKSBpcyBzbWFsbGVyIHRoYW4gbWluaW11bSAoJXpYKSIsCiAJCQkgICAgdGFibGVfcHRyLT5sZW5ndGgsCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jIGIvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCmluZGV4IDdmZTBiN2EuLjJmMzVmODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKQEAgLTQxLDYgKzQxLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KQEAgLTIxMCw2ICsyMTIsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0b3NoaWJhX3Byb2NfZGlyIC8qPSAwKi8gOworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICp0b3NoaWJhX2JhY2tsaWdodF9kZXZpY2U7CiBzdGF0aWMgaW50IGZvcmNlX2ZhbjsKIHN0YXRpYyBpbnQgbGFzdF9rZXlfZXZlbnQ7CiBzdGF0aWMgaW50IGtleV9ldmVudF92YWxpZDsKQEAgLTI3MSwxNCArMjc0LDIzIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGNoYXIgKnJlYWRfbGNkKGNoYXIgKnApCitzdGF0aWMgaW50IGdldF9sY2Qoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZTsKIAogCWhjaV9yZWFkMShIQ0lfTENEX0JSSUdIVE5FU1MsICZ2YWx1ZSwgJmhjaV9yZXN1bHQpOwogCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKSB7Ci0JCXZhbHVlID0gdmFsdWUgPj4gSENJX0xDRF9CUklHSFRORVNTX1NISUZUOworCQlyZXR1cm4gKHZhbHVlID4+IEhDSV9MQ0RfQlJJR0hUTkVTU19TSElGVCk7CisJfSBlbHNlCisJCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgY2hhciAqcmVhZF9sY2QoY2hhciAqcCkKK3sKKwlpbnQgdmFsdWUgPSBnZXRfbGNkKE5VTEwpOworCisJaWYgKHZhbHVlID49IDApIHsKIAkJcCArPSBzcHJpbnRmKHAsICJicmlnaHRuZXNzOiAgICAgICAgICAgICAgJWRcbiIsIHZhbHVlKTsKIAkJcCArPSBzcHJpbnRmKHAsICJicmlnaHRuZXNzX2xldmVsczogICAgICAgJWRcbiIsCiAJCQkgICAgIEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpOwpAQCAtMjg5LDIyICszMDEsMzQgQEAKIAlyZXR1cm4gcDsKIH0KIAorc3RhdGljIGludCBzZXRfbGNkKGludCB2YWx1ZSkKK3sKKwl1MzIgaGNpX3Jlc3VsdDsKKworCXZhbHVlID0gdmFsdWUgPDwgSENJX0xDRF9CUklHSFRORVNTX1NISUZUOworCWhjaV93cml0ZTEoSENJX0xDRF9CUklHSFRORVNTLCB2YWx1ZSwgJmhjaV9yZXN1bHQpOworCWlmIChoY2lfcmVzdWx0ICE9IEhDSV9TVUNDRVNTKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9sY2Rfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gc2V0X2xjZChiZC0+cHJvcHMtPmJyaWdodG5lc3MpOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9sY2QoY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWludCB2YWx1ZTsKLQl1MzIgaGNpX3Jlc3VsdDsKKwlpbnQgcmV0ID0gY291bnQ7CiAKIAlpZiAoc3NjYW5mKGJ1ZmZlciwgIiBicmlnaHRuZXNzIDogJWkiLCAmdmFsdWUpID09IDEgJiYKLQkgICAgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpIHsKLQkJdmFsdWUgPSB2YWx1ZSA8PCBIQ0lfTENEX0JSSUdIVE5FU1NfU0hJRlQ7Ci0JCWhjaV93cml0ZTEoSENJX0xDRF9CUklHSFRORVNTLCB2YWx1ZSwgJmhjaV9yZXN1bHQpOwotCQlpZiAoaGNpX3Jlc3VsdCAhPSBIQ0lfU1VDQ0VTUykKLQkJCXJldHVybiAtRUZBVUxUOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBjb3VudDsKKwkgICAgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMpCisJCXJldCA9IHNldF9sY2QodmFsdWUpOworCWVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY2hhciAqcmVhZF92aWRlbyhjaGFyICpwKQpAQCAtNTA2LDYgKzUzMCwyNiBAQAogCXJldHVybiBBRV9PSzsKIH0KIAorc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyB0b3NoaWJhX2JhY2tsaWdodF9kYXRhID0geworICAgICAgICAub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKyAgICAgICAgLmdldF9icmlnaHRuZXNzID0gZ2V0X2xjZCwKKyAgICAgICAgLnVwZGF0ZV9zdGF0dXMgID0gc2V0X2xjZF9zdGF0dXMsCisgICAgICAgIC5tYXhfYnJpZ2h0bmVzcyA9IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMgLSAxLAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IHRvc2hpYmFfYWNwaV9leGl0KHZvaWQpCit7CisJaWYgKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSkKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSk7CisKKwlyZW1vdmVfZGV2aWNlKCk7CisKKwlpZiAodG9zaGliYV9wcm9jX2RpcikKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKKworCXJldHVybjsKK30KKwogc3RhdGljIGludCBfX2luaXQgdG9zaGliYV9hY3BpX2luaXQodm9pZCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKQEAgLTU0NiwxOCArNTkwLDE2IEBACiAJCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX1RPU0hJQkEsIGFjcGlfcm9vdF9kaXIpOwogCX0KIAorCXRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInRvc2hpYmEiLCBOVUxMLAorCQkJCQkJJnRvc2hpYmFfYmFja2xpZ2h0X2RhdGEpOworICAgICAgICBpZiAoSVNfRVJSKHRvc2hpYmFfYmFja2xpZ2h0X2RldmljZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgdG9zaGliYSBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKKwkJdG9zaGliYV9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKKwkJdG9zaGliYV9hY3BpX2V4aXQoKTsKKwl9CisKIAlyZXR1cm4gKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSA/IDAgOiAtRU5PREVWOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgdG9zaGliYV9hY3BpX2V4aXQodm9pZCkKLXsKLQlyZW1vdmVfZGV2aWNlKCk7Ci0KLQlpZiAodG9zaGliYV9wcm9jX2RpcikKLQkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19UT1NISUJBLCBhY3BpX3Jvb3RfZGlyKTsKLQotCXJldHVybjsKLX0KLQogbW9kdWxlX2luaXQodG9zaGliYV9hY3BpX2luaXQpOwogbW9kdWxlX2V4aXQodG9zaGliYV9hY3BpX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwppbmRleCBiYjFlYWY5Li45ZTkwNTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwpAQCAtMTgwLDggKzE4MCw5IEBACiAJaWYgKHRocmVhZF9pZCAhPSBhY3BpX2dibF9wcmV2X3RocmVhZF9pZCkgewogCQlpZiAoQUNQSV9MVl9USFJFQURTICYgYWNwaV9kYmdfbGV2ZWwpIHsKIAkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCJcbioqKiogQ29udGV4dCBTd2l0Y2ggZnJvbSBUSUQgJVggdG8gVElEICVYICoqKipcblxuIiwKLQkJCSAgICAgKHUzMikgYWNwaV9nYmxfcHJldl90aHJlYWRfaWQsICh1MzIpIHRocmVhZF9pZCk7CisJCQkgICAgKCJcbioqKiogQ29udGV4dCBTd2l0Y2ggZnJvbSBUSUQgJWxYIHRvIFRJRCAlbFggKioqKlxuXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZykgYWNwaV9nYmxfcHJldl90aHJlYWRfaWQsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aHJlYWRfaWQpOwogCQl9CiAKIAkJYWNwaV9nYmxfcHJldl90aHJlYWRfaWQgPSB0aHJlYWRfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bXV0ZXguYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jCmluZGV4IGMzOTA2MmEuLjE4MGU3M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jCkBAIC0yNDMsMjMgKzI0MywyNCBAQAogI2VuZGlmCiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLAotCQkJICAiVGhyZWFkICVYIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBNdXRleCBbJXNdXG4iLAotCQkJICAodTMyKSB0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKKwkJCSAgIlRocmVhZCAlbFggYXR0ZW1wdGluZyB0byBhY3F1aXJlIE11dGV4IFslc11cbiIsCisJCQkgICh1bnNpZ25lZCBsb25nKSB0aGlzX3RocmVhZF9pZCwKKwkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKIAogCXN0YXR1cyA9IGFjcGlfb3NfYWNxdWlyZV9tdXRleChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwKIAkJCQkgICAgICAgQUNQSV9XQUlUX0ZPUkVWRVIpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLAotCQkJCSAgIlRocmVhZCAlWCBhY3F1aXJlZCBNdXRleCBbJXNdXG4iLAotCQkJCSAgKHUzMikgdGhpc190aHJlYWRfaWQsCisJCQkJICAiVGhyZWFkICVsWCBhY3F1aXJlZCBNdXRleCBbJXNdXG4iLAorCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHRoaXNfdGhyZWFkX2lkLAogCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKIAogCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS51c2VfY291bnQrKzsKIAkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udGhyZWFkX2lkID0gdGhpc190aHJlYWRfaWQ7CiAJfSBlbHNlIHsKIAkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiVGhyZWFkICVYIGNvdWxkIG5vdCBhY3F1aXJlIE11dGV4IFslWF0iLAotCQkJCSh1MzIpIHRoaXNfdGhyZWFkX2lkLCBtdXRleF9pZCkpOworCQkJCSJUaHJlYWQgJWxYIGNvdWxkIG5vdCBhY3F1aXJlIE11dGV4IFslWF0iLAorCQkJCSh1bnNpZ25lZCBsb25nKSB0aGlzX3RocmVhZF9pZCwgbXV0ZXhfaWQpKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CkBAIC0yODUsNyArMjg2LDggQEAKIAogCXRoaXNfdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKLQkJCSAgIlRocmVhZCAlWCByZWxlYXNpbmcgTXV0ZXggWyVzXVxuIiwgKHUzMikgdGhpc190aHJlYWRfaWQsCisJCQkgICJUaHJlYWQgJWxYIHJlbGVhc2luZyBNdXRleCBbJXNdXG4iLAorCQkJICAodW5zaWduZWQgbG9uZykgdGhpc190aHJlYWRfaWQsCiAJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CiAKIAlpZiAobXV0ZXhfaWQgPiBBQ1BJX01BWF9NVVRFWCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbWJhL2J1cy5jIGIvZHJpdmVycy9hbWJhL2J1cy5jCmluZGV4IDllM2UyYTYuLmZkNTQ3NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYW1iYS9idXMuYworKysgYi9kcml2ZXJzL2FtYmEvYnVzLmMKQEAgLTgwLDEyICs4MCwzOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgYW1iYV9hdHRyX2Z1bmMobmFtZSxmbXQsYXJnLi4uKQkJCQkJXAorc3RhdGljIHNzaXplX3QgbmFtZSMjX3Nob3coc3RydWN0IGRldmljZSAqX2RldiwJCQkJXAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiA9IHRvX2FtYmFfZGV2aWNlKF9kZXYpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsIGZtdCwgYXJnKTsJCQkJCVwKK30KKworI2RlZmluZSBhbWJhX2F0dHIobmFtZSxmbXQsYXJnLi4uKQlcCithbWJhX2F0dHJfZnVuYyhuYW1lLGZtdCxhcmcpCQlcCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgbmFtZSMjX3Nob3csIE5VTEwpCisKK2FtYmFfYXR0cl9mdW5jKGlkLCAiJTA4eFxuIiwgZGV2LT5wZXJpcGhpZCk7CithbWJhX2F0dHIoaXJxMCwgIiV1XG4iLCBkZXYtPmlycVswXSk7CithbWJhX2F0dHIoaXJxMSwgIiV1XG4iLCBkZXYtPmlycVsxXSk7CithbWJhX2F0dHJfZnVuYyhyZXNvdXJjZSwgIlx0JTAxNmxseFx0JTAxNmxseFx0JTAxNmx4XG4iLAorCSAodW5zaWduZWQgbG9uZyBsb25nKWRldi0+cmVzLnN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKWRldi0+cmVzLmVuZCwKKwkgZGV2LT5yZXMuZmxhZ3MpOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYW1iYV9kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfUk8oaWQpLAorCV9fQVRUUl9STyhyZXNvdXJjZSksCisJX19BVFRSX05VTEwsCit9OworCiAvKgogICogUHJpbWVjZWxscyBhcmUgcGFydCBvZiB0aGUgQWR2YW5jZWQgTWljcm9jb250cm9sbGVyIEJ1cyBBcmNoaXRlY3R1cmUsCiAgKiBzbyB3ZSBjYWxsIHRoZSBidXMgImFtYmEiLgogICovCiBzdGF0aWMgc3RydWN0IGJ1c190eXBlIGFtYmFfYnVzdHlwZSA9IHsKIAkubmFtZQkJPSAiYW1iYSIsCisJLmRldl9hdHRycwk9IGFtYmFfZGV2X2F0dHJzLAogCS5tYXRjaAkJPSBhbWJhX21hdGNoLAogCS51ZXZlbnQJCT0gYW1iYV91ZXZlbnQsCiAJLnN1c3BlbmQJPSBhbWJhX3N1c3BlbmQsCkBAIC0xNjksMjEgKzE5NSw2IEBACiAJa2ZyZWUoZCk7CiB9CiAKLSNkZWZpbmUgYW1iYV9hdHRyKG5hbWUsZm10LGFyZy4uLikJCQkJXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAotewkJCQkJCQkJXAotCXN0cnVjdCBhbWJhX2RldmljZSAqZGV2ID0gdG9fYW1iYV9kZXZpY2UoX2Rldik7CQlcCi0JcmV0dXJuIHNwcmludGYoYnVmLCBmbXQsIGFyZyk7CQkJCVwKLX0JCQkJCQkJCVwKLXN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93XyMjbmFtZSwgTlVMTCkKLQotYW1iYV9hdHRyKGlkLCAiJTA4eFxuIiwgZGV2LT5wZXJpcGhpZCk7Ci1hbWJhX2F0dHIoaXJxMCwgIiV1XG4iLCBkZXYtPmlycVswXSk7Ci1hbWJhX2F0dHIoaXJxMSwgIiV1XG4iLCBkZXYtPmlycVsxXSk7Ci1hbWJhX2F0dHIocmVzb3VyY2UsICJcdCUwMTZsbHhcdCUwMTZsbHhcdCUwMTZseFxuIiwKLQkgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPnJlcy5zdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPnJlcy5lbmQsCi0JIGRldi0+cmVzLmZsYWdzKTsKLQogLyoqCiAgKglhbWJhX2RldmljZV9yZWdpc3RlciAtIHJlZ2lzdGVyIGFuIEFNQkEgZGV2aWNlCiAgKglAZGV2OiBBTUJBIGRldmljZSB0byByZWdpc3RlcgpAQCAtMjA4LDQwICsyMTksNDYgQEAKIAkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiY29oZXJlbnQgZG1hIG1hc2sgaXMgdW5zZXRcbiIpOwogCiAJcmV0ID0gcmVxdWVzdF9yZXNvdXJjZShwYXJlbnQsICZkZXYtPnJlcyk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCXRtcCA9IGlvcmVtYXAoZGV2LT5yZXMuc3RhcnQsIFNaXzRLKTsKLQkJaWYgKCF0bXApIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDsKLQkJfQorCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKIAotCQlmb3IgKHBpZCA9IDAsIGkgPSAwOyBpIDwgNDsgaSsrKQotCQkJcGlkIHw9IChyZWFkbCh0bXAgKyAweGZlMCArIDQgKiBpKSAmIDI1NSkgPDwgKGkgKiA4KTsKLQkJZm9yIChjaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKLQkJCWNpZCB8PSAocmVhZGwodG1wICsgMHhmZjAgKyA0ICogaSkgJiAyNTUpIDw8IChpICogOCk7Ci0KLQkJaW91bm1hcCh0bXApOwotCi0JCWlmIChjaWQgPT0gMHhiMTA1ZjAwZCkKLQkJCWRldi0+cGVyaXBoaWQgPSBwaWQ7Ci0KLQkJaWYgKGRldi0+cGVyaXBoaWQpCi0JCQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2KTsKLQkJZWxzZQotCQkJcmV0ID0gLUVOT0RFVjsKLQotCQlpZiAocmV0ID09IDApIHsKLQkJCWRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9pZCk7Ci0JCQlpZiAoZGV2LT5pcnFbMF0gIT0gTk9fSVJRKQotCQkJCWRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9pcnEwKTsKLQkJCWlmIChkZXYtPmlycVsxXSAhPSBOT19JUlEpCi0JCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2lycTEpOwotCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3Jlc291cmNlKTsKLQkJfSBlbHNlIHsKLSBvdXQ6Ci0JCQlyZWxlYXNlX3Jlc291cmNlKCZkZXYtPnJlcyk7Ci0JCX0KKwl0bXAgPSBpb3JlbWFwKGRldi0+cmVzLnN0YXJ0LCBTWl80Syk7CisJaWYgKCF0bXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZTsKIAl9CisKKwlmb3IgKHBpZCA9IDAsIGkgPSAwOyBpIDwgNDsgaSsrKQorCQlwaWQgfD0gKHJlYWRsKHRtcCArIDB4ZmUwICsgNCAqIGkpICYgMjU1KSA8PCAoaSAqIDgpOworCWZvciAoY2lkID0gMCwgaSA9IDA7IGkgPCA0OyBpKyspCisJCWNpZCB8PSAocmVhZGwodG1wICsgMHhmZjAgKyA0ICogaSkgJiAyNTUpIDw8IChpICogOCk7CisKKwlpb3VubWFwKHRtcCk7CisKKwlpZiAoY2lkID09IDB4YjEwNWYwMGQpCisJCWRldi0+cGVyaXBoaWQgPSBwaWQ7CisKKwlpZiAoIWRldi0+cGVyaXBoaWQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisKKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZWxlYXNlOworCisJaWYgKGRldi0+aXJxWzBdICE9IE5PX0lSUSkKKwkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2lycTApOworCWlmIChyZXQgPT0gMCAmJiBkZXYtPmlycVsxXSAhPSBOT19JUlEpCisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9pcnExKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiByZXQ7CisKKwlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5kZXYpOworCisgZXJyX3JlbGVhc2U6CisJcmVsZWFzZV9yZXNvdXJjZSgmZGV2LT5yZXMpOworIGVycl9vdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvS2NvbmZpZyBiL2RyaXZlcnMvYXRhL0tjb25maWcKaW5kZXggM2Y0YWEwYy4uOTg0YWIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvS2NvbmZpZworKysgYi9kcml2ZXJzL2F0YS9LY29uZmlnCkBAIC02LDYgKzYsNyBAQAogCiBjb25maWcgQVRBCiAJdHJpc3RhdGUgIkFUQSBkZXZpY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJMT0NLCiAJZGVwZW5kcyBvbiAhKE0zMlIgfHwgTTY4SykgfHwgQlJPS0VOCiAJZGVwZW5kcyBvbiAhU1VONCB8fCBCUk9LRU4KIAlzZWxlY3QgU0NTSQpAQCAtMzI3LDYgKzMyOCwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgUEFUQV9NQVJWRUxMCisJdHJpc3RhdGUgIk1hcnZlbGwgUEFUQSBzdXBwb3J0IHZpYSBsZWdhY3kgbW9kZSIKKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgbGltaXRlZCBzdXBwb3J0IGZvciB0aGUgTWFydmVsbCA4OFNFNjE0NSBBVEEKKwkgIGNvbnRyb2xsZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBQQVRBX01QSUlYCiAJdHJpc3RhdGUgIkludGVsIFBBVEEgTVBJSVggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQpAQCAtNDgyLDYgKzQ5MiwzMiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgUEFUQV9XSU5CT05EX1ZMQgorCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc1OUEgVkxCIFBBVEEgc3VwcG9ydCAoRXhwZXJpbWVudGFsKSIKKwlkZXBlbmRzIG9uIElTQSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODM3NTlBIGNvbnRyb2xsZXIgb24gVmVzYSBMb2NhbCBCdXMKKwkgIHN5c3RlbXMuCisKK2NvbmZpZyBQQVRBX1BMQVRGT1JNCisJdHJpc3RhdGUgIkdlbmVyaWMgcGxhdGZvcm0gZGV2aWNlIFBBVEEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEVNQkVEREVECisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBnZW5lcmljIGRpcmVjdGx5IGNvbm5lY3RlZCBBVEEKKwkgIGRldmljZXMgY29tbW9ubHkgZm91bmQgb24gZW1iZWRkZWQgc3lzdGVtcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBBVEFfSVhQNFhYX0NGCisJdHJpc3RhdGUgIklYUDRYWCBDb21wYWN0IEZsYXNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0lYUDRYWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgYSBDb21wYWN0IEZsYXNoIGNvbm5lY3RlZCBvbgorCSAgdGhlIGl4cDR4eCBleHBhbnNpb24gYnVzLiBUaGlzIGRyaXZlciBoYWQgYmVlbiB3cml0dGVuIGZvcgorCSAgTG9mdC9BdmlsYSBib2FyZHMgaW4gbWluZCBidXQgY2FuIHdvcmsgd2l0aCBvdGhlcnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGVuZGlmCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL01ha2VmaWxlIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKaW5kZXggNzIyNDNhNi4uYmMzZDgxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKQEAgLTM4LDYgKzM4LDcgQEAKIG9iai0kKENPTkZJR19QQVRBX05TODc0MTApCSs9IHBhdGFfbnM4NzQxMC5vCiBvYmotJChDT05GSUdfUEFUQV9PUFRJKQkJKz0gcGF0YV9vcHRpLm8KIG9iai0kKENPTkZJR19QQVRBX09QVElETUEpCSs9IHBhdGFfb3B0aWRtYS5vCitvYmotJChDT05GSUdfUEFUQV9NQVJWRUxMKQkrPSBwYXRhX21hcnZlbGwubwogb2JqLSQoQ09ORklHX1BBVEFfTVBJSVgpCSs9IHBhdGFfbXBpaXgubwogb2JqLSQoQ09ORklHX1BBVEFfT0xEUElJWCkJKz0gcGF0YV9vbGRwaWl4Lm8KIG9iai0kKENPTkZJR19QQVRBX1BDTUNJQSkJKz0gcGF0YV9wY21jaWEubwpAQCAtNTEsOCArNTIsMTEgQEAKIG9iai0kKENPTkZJR19QQVRBX1NJTDY4MCkJKz0gcGF0YV9zaWw2ODAubwogb2JqLSQoQ09ORklHX1BBVEFfVklBKQkJKz0gcGF0YV92aWEubwogb2JqLSQoQ09ORklHX1BBVEFfV0lOQk9ORCkJKz0gcGF0YV9zbDgyYzEwNS5vCitvYmotJChDT05GSUdfUEFUQV9XSU5CT05EX1ZMQikJKz0gcGF0YV93aW5ib25kLm8KIG9iai0kKENPTkZJR19QQVRBX1NJUykJCSs9IHBhdGFfc2lzLm8KIG9iai0kKENPTkZJR19QQVRBX1RSSUZMRVgpCSs9IHBhdGFfdHJpZmxleC5vCitvYmotJChDT05GSUdfUEFUQV9JWFA0WFhfQ0YpCSs9IHBhdGFfaXhwNHh4X2NmLm8KK29iai0kKENPTkZJR19QQVRBX1BMQVRGT1JNKQkrPSBwYXRhX3BsYXRmb3JtLm8KICMgU2hvdWxkIGJlIGxhc3QgYnV0IG9uZSBsaWJhdGEgZHJpdmVyCiBvYmotJChDT05GSUdfQVRBX0dFTkVSSUMpCSs9IGF0YV9nZW5lcmljLm8KICMgU2hvdWxkIGJlIGxhc3QgbGliYXRhIGRyaXZlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5jIGIvZHJpdmVycy9hdGEvYWhjaS5jCmluZGV4IDI1OTI5MTIuLmYzNmRhNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuYworKysgYi9kcml2ZXJzL2F0YS9haGNpLmMKQEAgLTUzLDYgKzUzLDcgQEAKIAogZW51bSB7CiAJQUhDSV9QQ0lfQkFSCQk9IDUsCisJQUhDSV9NQVhfUE9SVFMJCT0gMzIsCiAJQUhDSV9NQVhfU0cJCT0gMTY4LCAvKiBoYXJkd2FyZSBtYXggaXMgNjRLICovCiAJQUhDSV9ETUFfQk9VTkRBUlkJPSAweGZmZmZmZmZmLAogCUFIQ0lfVVNFX0NMVVNURVJJTkcJPSAwLApAQCAtNzcsNyArNzgsOSBAQAogCVJYX0ZJU19VTksJCT0gMHg2MCwgLyogb2Zmc2V0IG9mIFVua25vd24gRklTIGRhdGEgKi8KIAogCWJvYXJkX2FoY2kJCT0gMCwKLQlib2FyZF9haGNpX3Z0ODI1MQk9IDEsCisJYm9hcmRfYWhjaV9waQkJPSAxLAorCWJvYXJkX2FoY2lfdnQ4MjUxCT0gMiwKKwlib2FyZF9haGNpX2lnbl9pZmVycgk9IDMsCiAKIAkvKiBnbG9iYWwgY29udHJvbGxlciByZWdpc3RlcnMgKi8KIAlIT1NUX0NBUAkJPSAweDAwLCAvKiBob3N0IGNhcGFiaWxpdGllcyAqLwpAQCAtMTY2LDggKzE2OSw5IEBACiAJQUhDSV9GTEFHX01TSQkJPSAoMSA8PCAwKSwKIAogCS8qIGFwLT5mbGFncyBiaXRzICovCi0JQUhDSV9GTEFHX1JFU0VUX05FRURTX0NMTwk9ICgxIDw8IDI0KSwKLQlBSENJX0ZMQUdfTk9fTkNRCQk9ICgxIDw8IDI1KSwKKwlBSENJX0ZMQUdfTk9fTkNRCQk9ICgxIDw8IDI0KSwKKwlBSENJX0ZMQUdfSUdOX0lSUV9JRl9FUlIJPSAoMSA8PCAyNSksIC8qIGlnbm9yZSBJUlFfSUZfRVJSICovCisJQUhDSV9GTEFHX0hPTk9SX1BJCQk9ICgxIDw8IDI2KSwgLyogaG9ub3IgUE9SVFNfSU1QTCAqLwogfTsKIAogc3RydWN0IGFoY2lfY21kX2hkciB7CkBAIC0yMTQsNiArMjE4LDcgQEAKIHN0YXRpYyB2b2lkIGFoY2lfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgYWhjaV90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgYWhjaV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgYWhjaV92dDgyNTFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIGFoY2lfcG9zdF9pbnRlcm5hbF9jbWQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgaW50IGFoY2lfcG9ydF9zdXNwZW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHBtX21lc3NhZ2VfdCBtZXNnKTsKIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKQEAgLTI3Myw2ICsyNzgsMzcgQEAKIAkucG9ydF9zdG9wCQk9IGFoY2lfcG9ydF9zdG9wLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfdnQ4MjUxX29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisKKwkuY2hlY2tfc3RhdHVzCQk9IGFoY2lfY2hlY2tfc3RhdHVzLAorCS5jaGVja19hbHRzdGF0dXMJPSBhaGNpX2NoZWNrX3N0YXR1cywKKwkuZGV2X3NlbGVjdAkJPSBhdGFfbm9vcF9kZXZfc2VsZWN0LAorCisJLnRmX3JlYWQJCT0gYWhjaV90Zl9yZWFkLAorCisJLnFjX3ByZXAJCT0gYWhjaV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBhaGNpX3FjX2lzc3VlLAorCisJLmlycV9oYW5kbGVyCQk9IGFoY2lfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYWhjaV9pcnFfY2xlYXIsCisKKwkuc2NyX3JlYWQJCT0gYWhjaV9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IGFoY2lfc2NyX3dyaXRlLAorCisJLmZyZWV6ZQkJCT0gYWhjaV9mcmVlemUsCisJLnRoYXcJCQk9IGFoY2lfdGhhdywKKworCS5lcnJvcl9oYW5kbGVyCQk9IGFoY2lfdnQ4MjUxX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gYWhjaV9wb3N0X2ludGVybmFsX2NtZCwKKworCS5wb3J0X3N1c3BlbmQJCT0gYWhjaV9wb3J0X3N1c3BlbmQsCisJLnBvcnRfcmVzdW1lCQk9IGFoY2lfcG9ydF9yZXN1bWUsCisKKwkucG9ydF9zdGFydAkJPSBhaGNpX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhaGNpX3BvcnRfc3RvcCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX3BvcnRfaW5mb1tdID0gewogCS8qIGJvYXJkX2FoY2kgKi8KIAl7CkBAIC0yODQsMTMgKzMyMCwzNCBAQAogCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCiAJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKIAl9LAorCS8qIGJvYXJkX2FoY2lfcGkgKi8KKwl7CisJCS5zaHQJCT0gJmFoY2lfc2h0LAorCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8CisJCQkJICBBVEFfRkxBR19TS0lQX0QySF9CU1kgfCBBSENJX0ZMQUdfSE9OT1JfUEksCisJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCisJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKKwl9LAogCS8qIGJvYXJkX2FoY2lfdnQ4MjUxICovCiAJewogCQkuc2h0CQk9ICZhaGNpX3NodCwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAogCQkJCSAgQVRBX0ZMQUdfTU1JTyB8IEFUQV9GTEFHX1BJT19ETUEgfAogCQkJCSAgQVRBX0ZMQUdfU0tJUF9EMkhfQlNZIHwKLQkJCQkgIEFIQ0lfRkxBR19SRVNFVF9ORUVEU19DTE8gfCBBSENJX0ZMQUdfTk9fTkNRLAorCQkJCSAgQVRBX0ZMQUdfSFJTVF9UT19SRVNVTUUgfCBBSENJX0ZMQUdfTk9fTkNRLAorCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLworCQkucG9ydF9vcHMJPSAmYWhjaV92dDgyNTFfb3BzLAorCX0sCisJLyogYm9hcmRfYWhjaV9pZ25faWZlcnIgKi8KKwl7CisJCS5zaHQJCT0gJmFoY2lfc2h0LAorCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8CisJCQkJICBBVEFfRkxBR19TS0lQX0QySF9CU1kgfAorCQkJCSAgQUhDSV9GTEFHX0lHTl9JUlFfSUZfRVJSLAogCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCkBAIC0zMDksMTggKzM2NiwyOSBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY4MiksIGJvYXJkX2FoY2kgfSwgLyogRVNCMiAqLwogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY4MyksIGJvYXJkX2FoY2kgfSwgLyogRVNCMiAqLwogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdjNiksIGJvYXJkX2FoY2kgfSwgLyogSUNINy1NIERIICovCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODIxKSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4ICovCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODIyKSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4ICovCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODI0KSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4ICovCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODI5KSwgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4TSAqLwotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjgyYSksIGJvYXJkX2FoY2kgfSwgLyogSUNIOE0gKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MjEpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDggKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MjIpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDggKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MjQpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDggKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MjkpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDhNICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODJhKSwgYm9hcmRfYWhjaV9waSB9LCAvKiBJQ0g4TSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyMiksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyMyksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyNCksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyNSksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyNyksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyOSksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOU0gKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MmEpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDlNICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyOTJiKSwgYm9hcmRfYWhjaV9waSB9LCAvKiBJQ0g5TSAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkyZiksIGJvYXJkX2FoY2lfcGkgfSwgLyogSUNIOU0gKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5NGQpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDkgKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5NGUpLCBib2FyZF9haGNpX3BpIH0sIC8qIElDSDlNICovCiAKIAkvKiBKTWljcm9uICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjApLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzYwICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjEpLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzYxICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjMpLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzYzICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjUpLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzY1ICovCi0JeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjYpLCBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzY2ICovCisJeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjApLCBib2FyZF9haGNpX2lnbl9pZmVyciB9LCAvKiBKTUIzNjAgKi8KKwl7IFBDSV9WREVWSUNFKEpNSUNST04sIDB4MjM2MSksIGJvYXJkX2FoY2lfaWduX2lmZXJyIH0sIC8qIEpNQjM2MSAqLworCXsgUENJX1ZERVZJQ0UoSk1JQ1JPTiwgMHgyMzYzKSwgYm9hcmRfYWhjaV9pZ25faWZlcnIgfSwgLyogSk1CMzYzICovCisJeyBQQ0lfVkRFVklDRShKTUlDUk9OLCAweDIzNjUpLCBib2FyZF9haGNpX2lnbl9pZmVyciB9LCAvKiBKTUIzNjUgKi8KKwl7IFBDSV9WREVWSUNFKEpNSUNST04sIDB4MjM2NiksIGJvYXJkX2FoY2lfaWduX2lmZXJyIH0sIC8qIEpNQjM2NiAqLwogCiAJLyogQVRJICovCiAJeyBQQ0lfVkRFVklDRShBVEksIDB4NDM4MCksIGJvYXJkX2FoY2kgfSwgLyogQVRJIFNCNjAwIG5vbi1yYWlkICovCkBAIC0zMzQsMTIgKzQwMiwyNCBAQAogCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NGQpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NSAqLwogCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NGUpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NSAqLwogCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NGYpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NSAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NTQpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NTUpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NTYpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NTcpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NTgpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NTkpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NWEpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NWIpLCBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NyAqLwogCiAJLyogU2lTICovCiAJeyBQQ0lfVkRFVklDRShTSSwgMHgxMTg0KSwgYm9hcmRfYWhjaSB9LCAvKiBTaVMgOTY2ICovCiAJeyBQQ0lfVkRFVklDRShTSSwgMHgxMTg1KSwgYm9hcmRfYWhjaSB9LCAvKiBTaVMgOTY2ICovCiAJeyBQQ0lfVkRFVklDRShTSSwgMHgwMTg2KSwgYm9hcmRfYWhjaSB9LCAvKiBTaVMgOTY4ICovCiAKKwkvKiBHZW5lcmljLCBQQ0kgY2xhc3MgY29kZSBmb3IgQUhDSSAqLworCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgIDB4MDEwNjAxLCAweGZmZmZmZiwgYm9hcmRfYWhjaSB9LAorCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogCkBAIC0zNTQsNiArNDM0LDExIEBACiB9OwogCiAKK3N0YXRpYyBpbmxpbmUgaW50IGFoY2lfbnJfcG9ydHModTMyIGNhcCkKK3sKKwlyZXR1cm4gKGNhcCAmIDB4MWYpICsgMTsKK30KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFoY2lfcG9ydF9iYXNlX3VsICh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBwb3J0KQogewogCXJldHVybiBiYXNlICsgMHgxMDAgKyAocG9ydCAqIDB4ODApOwpAQCAtNTI3LDkgKzYxMiw2IEBACiBzdGF0aWMgdm9pZCBhaGNpX2luaXRfcG9ydCh2b2lkIF9faW9tZW0gKnBvcnRfbW1pbywgdTMyIGNhcCwKIAkJCSAgIGRtYV9hZGRyX3QgY21kX3Nsb3RfZG1hLCBkbWFfYWRkcl90IHJ4X2Zpc19kbWEpCiB7Ci0JLyogcG93ZXIgdXAgKi8KLQlhaGNpX3Bvd2VyX3VwKHBvcnRfbW1pbywgY2FwKTsKLQogCS8qIGVuYWJsZSBGSVMgcmVjZXB0aW9uICovCiAJYWhjaV9zdGFydF9maXNfcngocG9ydF9tbWlvLCBjYXAsIGNtZF9zbG90X2RtYSwgcnhfZmlzX2RtYSk7CiAKQEAgLTU1NSwxOSArNjM3LDE3IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQkvKiBwdXQgZGV2aWNlIGludG8gc2x1bWJlciBtb2RlICovCi0JYWhjaV9wb3dlcl9kb3duKHBvcnRfbW1pbywgY2FwKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFoY2lfcmVzZXRfY29udHJvbGxlcih2b2lkIF9faW9tZW0gKm1taW8sIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXUzMiBjYXBfc2F2ZSwgdG1wOworCXUzMiBjYXBfc2F2ZSwgaW1wbF9zYXZlLCB0bXA7CiAKIAljYXBfc2F2ZSA9IHJlYWRsKG1taW8gKyBIT1NUX0NBUCk7CiAJY2FwX3NhdmUgJj0gKCAoMTw8MjgpIHwgKDE8PDE3KSApOwogCWNhcF9zYXZlIHw9ICgxIDw8IDI3KTsKKwlpbXBsX3NhdmUgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKIAogCS8qIGdsb2JhbCBjb250cm9sbGVyIHJlc2V0ICovCiAJdG1wID0gcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsKQEAgLTU4OCwxMCArNjY4LDIxIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAorCS8qIHR1cm4gb24gQUhDSSBtb2RlICovCiAJd3JpdGVsKEhPU1RfQUhDSV9FTiwgbW1pbyArIEhPU1RfQ1RMKTsKIAkodm9pZCkgcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsJLyogZmx1c2ggKi8KKworCS8qIFRoZXNlIHdyaXRlLW9uY2UgcmVnaXN0ZXJzIGFyZSBub3JtYWxseSBjbGVhcmVkIG9uIHJlc2V0LgorCSAqIFJlc3RvcmUgQklPUyB2YWx1ZXMuLi4gd2hpY2ggd2UgSE9QRSB3ZXJlIHByZXNlbnQgYmVmb3JlCisJICogcmVzZXQuCisJICovCisJaWYgKCFpbXBsX3NhdmUpIHsKKwkJaW1wbF9zYXZlID0gKDEgPDwgYWhjaV9ucl9wb3J0cyhjYXBfc2F2ZSkpIC0gMTsKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCisJCQkgICAiUE9SVFNfSU1QTCBpcyB6ZXJvLCBmb3JjaW5nIDB4JXhcbiIsIGltcGxfc2F2ZSk7CisJfQogCXdyaXRlbChjYXBfc2F2ZSwgbW1pbyArIEhPU1RfQ0FQKTsKLQl3cml0ZWwoMHhmLCBtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwl3cml0ZWwoaW1wbF9zYXZlLCBtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKIAkodm9pZCkgcmVhZGwobW1pbyArIEhPU1RfUE9SVFNfSU1QTCk7CS8qIGZsdXNoICovCiAKIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfSU5URUwpIHsKQEAgLTYwNyw3ICs2OTgsOCBAQAogfQogCiBzdGF0aWMgdm9pZCBhaGNpX2luaXRfY29udHJvbGxlcih2b2lkIF9faW9tZW0gKm1taW8sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSBpbnQgbl9wb3J0cywgdTMyIGNhcCkKKwkJCQkgaW50IG5fcG9ydHMsIHVuc2lnbmVkIGludCBwb3J0X2ZsYWdzLAorCQkJCSBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQogewogCWludCBpLCByYzsKIAl1MzIgdG1wOwpAQCAtNjE2LDEzICs3MDgsMTIgQEAKIAkJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBpKTsKIAkJY29uc3QgY2hhciAqZW1zZyA9IE5VTEw7CiAKLSNpZiAwIC8qIEJJT1NlbiBpbml0aWFsaXplIHRoaXMgaW5jb3JyZWN0bHkgKi8KLQkJaWYgKCEoaHByaXYtPnBvcnRfbWFwICYgKDEgPDwgaSkpKQorCQlpZiAoKHBvcnRfZmxhZ3MgJiBBSENJX0ZMQUdfSE9OT1JfUEkpICYmCisJCSAgICAhKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSkKIAkJCWNvbnRpbnVlOwotI2VuZGlmCiAKIAkJLyogbWFrZSBzdXJlIHBvcnQgaXMgbm90IGFjdGl2ZSAqLwotCQlyYyA9IGFoY2lfZGVpbml0X3BvcnQocG9ydF9tbWlvLCBjYXAsICZlbXNnKTsKKwkJcmMgPSBhaGNpX2RlaW5pdF9wb3J0KHBvcnRfbW1pbywgaHByaXYtPmNhcCwgJmVtc2cpOwogCQlpZiAocmMpCiAJCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgJnBkZXYtPmRldiwKIAkJCQkgICAiJXMgKCVkKVxuIiwgZW1zZywgcmMpOwpAQCAtNjk3LDE3ICs3ODgsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFoY2lfcHJlcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlpZiAoKGFwLT5mbGFncyAmIEFIQ0lfRkxBR19SRVNFVF9ORUVEU19DTE8pICYmCi0JICAgIChhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMTAwMCkgJiBBVEFfQlVTWSkpIHsKLQkJLyogQVRBX0JVU1kgaGFzbid0IGNsZWFyZWQsIHNvIHNlbmQgYSBDTE8gKi8KLQkJYWhjaV9jbG8oYXApOwotCX0KLQotCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKLX0KLQogc3RhdGljIGludCBhaGNpX3NvZnRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQogewogCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwpAQCAtNzM2LDggKzgxNiw3IEBACiAJfQogCiAJLyogY2hlY2sgQlVTWS9EUlEsIHBlcmZvcm0gQ29tbWFuZCBMaXN0IE92ZXJyaWRlIGlmIG5lY2Vzc2FyeSAqLwotCWFoY2lfdGZfcmVhZChhcCwgJnRmKTsKLQlpZiAodGYuY29tbWFuZCAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKSB7CisJaWYgKGFoY2lfY2hlY2tfc3RhdHVzKGFwKSAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKSB7CiAJCXJjID0gYWhjaV9jbG8oYXApOwogCiAJCWlmIChyYyA9PSAtRU9QTk9UU1VQUCkgewpAQCAtODQ2LDYgKzkyNSwzMSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBhaGNpX3Z0ODI1MV9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzcykKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCWludCByYzsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCWFoY2lfc3RvcF9lbmdpbmUocG9ydF9tbWlvKTsKKworCXJjID0gc2F0YV9wb3J0X2hhcmRyZXNldChhcCwgc2F0YV9laGNfZGViX3RpbWluZygmYXAtPmVoX2NvbnRleHQpKTsKKworCS8qIHZ0ODI1MSBuZWVkcyBTRXJyb3IgY2xlYXJlZCBmb3IgdGhlIHBvcnQgdG8gb3BlcmF0ZSAqLworCWFoY2lfc2NyX3dyaXRlKGFwLCBTQ1JfRVJST1IsIGFoY2lfc2NyX3JlYWQoYXAsIFNDUl9FUlJPUikpOworCisJYWhjaV9zdGFydF9lbmdpbmUocG9ydF9tbWlvKTsKKworCURQUklOVEsoIkVYSVQsIHJjPSVkLCBjbGFzcz0ldVxuIiwgcmMsICpjbGFzcyk7CisKKwkvKiB2dDgyNTEgZG9lc24ndCBjbGVhciBCU1kgb24gc2lnbmF0dXJlIEZJUyByZWNlcHRpb24sCisJICogcmVxdWVzdCBmb2xsb3ctdXAgc29mdHJlc2V0LgorCSAqLworCXJldHVybiByYyA/OiAtRUFHQUlOOworfQorCiBzdGF0aWMgdm9pZCBhaGNpX3Bvc3RyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQogewogCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyOwpAQCAtOTYyLDYgKzEwNjYsMTAgQEAKIAkvKiBhbmFseXplIEBpcnFfc3RhdCAqLwogCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgImlycV9zdGF0IDB4JTA4eCIsIGlycV9zdGF0KTsKIAorCS8qIHNvbWUgY29udHJvbGxlcnMgc2V0IElSUV9JRl9FUlIgb24gZGV2aWNlIGVycm9ycywgaWdub3JlIGl0ICovCisJaWYgKGFwLT5mbGFncyAmIEFIQ0lfRkxBR19JR05fSVJRX0lGX0VSUikKKwkJaXJxX3N0YXQgJj0gflBPUlRfSVJRX0lGX0VSUjsKKwogCWlmIChpcnFfc3RhdCAmIFBPUlRfSVJRX1RGX0VSUikKIAkJZXJyX21hc2sgfD0gQUNfRVJSX0RFVjsKIApAQCAtMTA0MSw3ICsxMTQ5LDcgQEAKIAkvKiBobW1tLi4uIGEgc3B1cmlvdXMgaW50ZXJ1cHQgKi8KIAogCS8qIHNvbWUgZGV2aWNlcyBzZW5kIEQySCByZWcgd2l0aCBJIGJpdCBzZXQgZHVyaW5nIE5DUSBjb21tYW5kIHBoYXNlICovCi0JaWYgKGFwLT5zYWN0aXZlICYmIHN0YXR1cyAmIFBPUlRfSVJRX0QySF9SRUdfRklTKQorCWlmIChhcC0+c2FjdGl2ZSAmJiAoc3RhdHVzICYgUE9SVF9JUlFfRDJIX1JFR19GSVMpKQogCQlyZXR1cm47CiAKIAkvKiBpZ25vcmUgaW50ZXJpbSBQSU8gc2V0dXAgZmlzIGludGVycnVwdHMgKi8KQEAgLTExNjEsNyArMTI2OSwyMyBAQAogCX0KIAogCS8qIHBlcmZvcm0gcmVjb3ZlcnkgKi8KLQlhdGFfZG9fZWgoYXAsIGFoY2lfcHJlcmVzZXQsIGFoY2lfc29mdHJlc2V0LCBhaGNpX2hhcmRyZXNldCwKKwlhdGFfZG9fZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGFoY2lfc29mdHJlc2V0LCBhaGNpX2hhcmRyZXNldCwKKwkJICBhaGNpX3Bvc3RyZXNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfdnQ4MjUxX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCisJaWYgKCEoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19GUk9aRU4pKSB7CisJCS8qIHJlc3RhcnQgZW5naW5lICovCisJCWFoY2lfc3RvcF9lbmdpbmUocG9ydF9tbWlvKTsKKwkJYWhjaV9zdGFydF9lbmdpbmUocG9ydF9tbWlvKTsKKwl9CisKKwkvKiBwZXJmb3JtIHJlY292ZXJ5ICovCisJYXRhX2RvX2VoKGFwLCBhdGFfc3RkX3ByZXJlc2V0LCBhaGNpX3NvZnRyZXNldCwgYWhjaV92dDgyNTFfaGFyZHJlc2V0LAogCQkgIGFoY2lfcG9zdHJlc2V0KTsKIH0KIApAQCAtMTE5MSw3ICsxMzE1LDkgQEAKIAlpbnQgcmM7CiAKIAlyYyA9IGFoY2lfZGVpbml0X3BvcnQocG9ydF9tbWlvLCBocHJpdi0+Y2FwLCAmZW1zZyk7Ci0JaWYgKHJjKSB7CisJaWYgKHJjID09IDApCisJCWFoY2lfcG93ZXJfZG93bihwb3J0X21taW8sIGhwcml2LT5jYXApOworCWVsc2UgewogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiJXMgKCVkKVxuIiwgZW1zZywgcmMpOwogCQlhaGNpX2luaXRfcG9ydChwb3J0X21taW8sIGhwcml2LT5jYXAsCiAJCQkgICAgICAgcHAtPmNtZF9zbG90X2RtYSwgcHAtPnJ4X2Zpc19kbWEpOwpAQCAtMTIwNyw2ICsxMzMzLDcgQEAKIAl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+bW1pb19iYXNlOwogCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwogCisJYWhjaV9wb3dlcl91cChwb3J0X21taW8sIGhwcml2LT5jYXApOwogCWFoY2lfaW5pdF9wb3J0KHBvcnRfbW1pbywgaHByaXYtPmNhcCwgcHAtPmNtZF9zbG90X2RtYSwgcHAtPnJ4X2Zpc19kbWEpOwogCiAJcmV0dXJuIDA7CkBAIC0xMjQ2LDcgKzEzNzMsOCBAQAogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAKLQkJYWhjaV9pbml0X2NvbnRyb2xsZXIobW1pbywgcGRldiwgaG9zdC0+bl9wb3J0cywgaHByaXYtPmNhcCk7CisJCWFoY2lfaW5pdF9jb250cm9sbGVyKG1taW8sIHBkZXYsIGhvc3QtPm5fcG9ydHMsCisJCQkJICAgICBob3N0LT5wb3J0c1swXS0+ZmxhZ3MsIGhwcml2KTsKIAl9CiAKIAlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CkBAIC0xMzEyLDYgKzE0NDAsOSBAQAogCiAJYXAtPnByaXZhdGVfZGF0YSA9IHBwOwogCisJLyogcG93ZXIgdXAgcG9ydCAqLworCWFoY2lfcG93ZXJfdXAocG9ydF9tbWlvLCBocHJpdi0+Y2FwKTsKKwogCS8qIGluaXRpYWxpemUgcG9ydCAqLwogCWFoY2lfaW5pdF9wb3J0KHBvcnRfbW1pbywgaHByaXYtPmNhcCwgcHAtPmNtZF9zbG90X2RtYSwgcHAtPnJ4X2Zpc19kbWEpOwogCkBAIC0xMzU4LDcgKzE0ODksNyBAQAogCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBwcm9iZV9lbnQtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYocHJvYmVfZW50LT5kZXYpOwogCXZvaWQgX19pb21lbSAqbW1pbyA9IHByb2JlX2VudC0+bW1pb19iYXNlOwotCXVuc2lnbmVkIGludCBpLCB1c2luZ19kYWM7CisJdW5zaWduZWQgaW50IGksIGNhcF9uX3BvcnRzLCB1c2luZ19kYWM7CiAJaW50IHJjOwogCiAJcmMgPSBhaGNpX3Jlc2V0X2NvbnRyb2xsZXIobW1pbywgcGRldik7CkBAIC0xMzY3LDEwICsxNDk4LDM0IEBACiAKIAlocHJpdi0+Y2FwID0gcmVhZGwobW1pbyArIEhPU1RfQ0FQKTsKIAlocHJpdi0+cG9ydF9tYXAgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKLQlwcm9iZV9lbnQtPm5fcG9ydHMgPSAoaHByaXYtPmNhcCAmIDB4MWYpICsgMTsKKwljYXBfbl9wb3J0cyA9IGFoY2lfbnJfcG9ydHMoaHByaXYtPmNhcCk7CiAKIAlWUFJJTlRLKCJjYXAgMHgleCAgcG9ydF9tYXAgMHgleCAgbl9wb3J0cyAlZFxuIiwKLQkJaHByaXYtPmNhcCwgaHByaXYtPnBvcnRfbWFwLCBwcm9iZV9lbnQtPm5fcG9ydHMpOworCQlocHJpdi0+Y2FwLCBocHJpdi0+cG9ydF9tYXAsIGNhcF9uX3BvcnRzKTsKKworCWlmIChwcm9iZV9lbnQtPnBvcnRfZmxhZ3MgJiBBSENJX0ZMQUdfSE9OT1JfUEkpIHsKKwkJdW5zaWduZWQgaW50IG5fcG9ydHMgPSBjYXBfbl9wb3J0czsKKwkJdTMyIHBvcnRfbWFwID0gaHByaXYtPnBvcnRfbWFwOworCQlpbnQgbWF4X3BvcnQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBBSENJX01BWF9QT1JUUyAmJiBuX3BvcnRzOyBpKyspIHsKKwkJCWlmIChwb3J0X21hcCAmICgxIDw8IGkpKSB7CisJCQkJbl9wb3J0cy0tOworCQkJCXBvcnRfbWFwICY9IH4oMSA8PCBpKTsKKwkJCQltYXhfcG9ydCA9IGk7CisJCQl9IGVsc2UKKwkJCQlwcm9iZV9lbnQtPmR1bW15X3BvcnRfbWFzayB8PSAxIDw8IGk7CisJCX0KKworCQlpZiAobl9wb3J0cyB8fCBwb3J0X21hcCkKKwkJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcGRldi0+ZGV2LAorCQkJCSAgICJucl9wb3J0cyAoJXUpIGFuZCBpbXBsZW1lbnRlZCBwb3J0IG1hcCAiCisJCQkJICAgIigweCV4KSBkb24ndCBtYXRjaFxuIiwKKwkJCQkgICBjYXBfbl9wb3J0cywgaHByaXYtPnBvcnRfbWFwKTsKKworCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSBtYXhfcG9ydCArIDE7CisJfSBlbHNlCisJCXByb2JlX2VudC0+bl9wb3J0cyA9IGNhcF9uX3BvcnRzOwogCiAJdXNpbmdfZGFjID0gaHByaXYtPmNhcCAmIEhPU1RfQ0FQXzY0OwogCWlmICh1c2luZ19kYWMgJiYKQEAgLTE0MDIsNyArMTU1Nyw4IEBACiAJZm9yIChpID0gMDsgaSA8IHByb2JlX2VudC0+bl9wb3J0czsgaSsrKQogCQlhaGNpX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFtpXSwgKHVuc2lnbmVkIGxvbmcpIG1taW8sIGkpOwogCi0JYWhjaV9pbml0X2NvbnRyb2xsZXIobW1pbywgcGRldiwgcHJvYmVfZW50LT5uX3BvcnRzLCBocHJpdi0+Y2FwKTsKKwlhaGNpX2luaXRfY29udHJvbGxlcihtbWlvLCBwZGV2LCBwcm9iZV9lbnQtPm5fcG9ydHMsCisJCQkgICAgIHByb2JlX2VudC0+cG9ydF9mbGFncywgaHByaXYpOwogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMgYi9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCmluZGV4IDM3NzQyNWUuLjkwODc1MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJhdGFfZ2VuZXJpYyIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi42IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjEwIgogCiAvKgogICoJQSBnZW5lcmljIHBhcmFsbGVsIEFUQSBkcml2ZXIgdXNpbmcgbGliYXRhCkBAIC0xMDksMTQgKzEwOSwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBnZW5lcmljX3BvcnRfb3BzID0gewpAQCAtMjI1LDEyICsyMjcsMTQgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gYXRhX2dlbmVyaWMsCiAJLnByb2JlIAkJPSBhdGFfZ2VuZXJpY19pbml0X29uZSwKLQkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQorCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGF0YV9wY2lfZGV2aWNlX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGF0YV9nZW5lcmljX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhdGFfZ2VuZXJpY19wY2lfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXRhX2dlbmVyaWNfcGNpX2RyaXZlcik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKaW5kZXggNTcxOTcwNC4uYzdkZTBiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC00MCw3ICs0MCw3IEBACiAgKiBEb2N1bWVudGF0aW9uCiAgKglQdWJsaWNhbGx5IGF2YWlsYWJsZSBmcm9tIEludGVsIHdlYiBzaXRlLiBFcnJhdGEgZG9jdW1lbnRhdGlvbgogICogaXMgYWxzbyBwdWJsaWNhbGx5IGF2YWlsYWJsZS4gQXMgYW4gYWlkZSB0byBhbnlvbmUgaGFja2luZyBvbiB0aGlzCi0gKiBkcml2ZXIgdGhlIGxpc3Qgb2YgZXJyYXRhIHRoYXQgYXJlIHJlbGV2YW50IGlzIGJlbG93LmdvaW5nIGJhY2sgdG8KKyAqIGRyaXZlciB0aGUgbGlzdCBvZiBlcnJhdGEgdGhhdCBhcmUgcmVsZXZhbnQgaXMgYmVsb3csIGdvaW5nIGJhY2sgdG8KICAqIFBJSVg0LiBPbGRlciBkZXZpY2UgZG9jdW1lbnRhdGlvbiBpcyBub3cgYSBiaXQgdHJpY2t5IHRvIGZpbmQuCiAgKgogICogVGhlIGNoaXBzZXRzIGFsbCBmb2xsb3cgdmVyeSBtdWNoIHRoZSBzYW1lIGRlc2lnbi4gVGhlIG9yZ2luYWwgVHJpdG9uCkBAIC05Myw3ICs5Myw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJImF0YV9waWl4IgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMi4wMGFjNiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMDBhYzciCiAKIGVudW0gewogCVBJSVhfSU9DRkcJCT0gMHg1NCwgLyogSURFIEkvTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCkBAIC0xMDEsMTEgKzEwMSwxMyBAQAogCUlDSDVfUENTCQk9IDB4OTIsCS8qIHBvcnQgY29udHJvbCBhbmQgc3RhdHVzICovCiAJUElJWF9TQ0MJCT0gMHgwQSwgLyogc3ViLWNsYXNzIGNvZGUgcmVnaXN0ZXIgKi8KIAotCVBJSVhfRkxBR19JR05PUkVfUENTCT0gKDEgPDwgMjUpLCAvKiBpZ25vcmUgUENTIHByZXNlbnQgYml0cyAqLwogCVBJSVhfRkxBR19TQ1IJCT0gKDEgPDwgMjYpLCAvKiBTQ1IgYXZhaWxhYmxlICovCiAJUElJWF9GTEFHX0FIQ0kJCT0gKDEgPDwgMjcpLCAvKiBBSENJIHBvc3NpYmxlICovCiAJUElJWF9GTEFHX0NIRUNLSU5UUgk9ICgxIDw8IDI4KSwgLyogbWFrZSBzdXJlIFBDSSBJTlR4IGVuYWJsZWQgKi8KIAorCVBJSVhfUEFUQV9GTEFHUwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTLAorCVBJSVhfU0FUQV9GTEFHUwkJPSBBVEFfRkxBR19TQVRBIHwgUElJWF9GTEFHX0NIRUNLSU5UUiwKKwogCS8qIGNvbWJpbmVkIG1vZGUuICBpZiBzZXQsIFBBVEEgaXMgY2hhbm5lbCAwLgogCSAqIGlmIGNsZWFyLCBQQVRBIGlzIGNoYW5uZWwgMS4KIAkgKi8KQEAgLTEyMiwxMiArMTI0LDEwIEBACiAJaWNoX3BhdGFfMTAwCQk9IDMsCS8qIElDSCB1cCB0byBVRE1BIDEwMCAqLwogCWljaF9wYXRhXzEzMwkJPSA0LAkvKiBJQ0ggdXAgdG8gVURNQSAxMzMgKi8KIAlpY2g1X3NhdGEJCT0gNSwKLQllc2Jfc2F0YQkJPSA2LAotCWljaDZfc2F0YQkJPSA3LAotCWljaDZfc2F0YV9haGNpCQk9IDgsCi0JaWNoNm1fc2F0YV9haGNpCQk9IDksCi0JaWNoN21fc2F0YV9haGNpCQk9IDEwLAotCWljaDhfc2F0YV9haGNpCQk9IDExLAorCWljaDZfc2F0YQkJPSA2LAorCWljaDZfc2F0YV9haGNpCQk9IDcsCisJaWNoNm1fc2F0YV9haGNpCQk9IDgsCisJaWNoOF9zYXRhX2FoY2kJCT0gOSwKIAogCS8qIGNvbnN0YW50cyBmb3IgbWFwcGluZyB0YWJsZSAqLwogCVAwCQkJPSAwLCAgLyogcG9ydCAwICovCkBAIC0xNDQsMTMgKzE0NCwxMSBAQAogc3RydWN0IHBpaXhfbWFwX2RiIHsKIAljb25zdCB1MzIgbWFzazsKIAljb25zdCB1MTYgcG9ydF9lbmFibGU7Ci0JY29uc3QgaW50IHByZXNlbnRfc2hpZnQ7CiAJY29uc3QgaW50IG1hcFtdWzRdOwogfTsKIAogc3RydWN0IHBpaXhfaG9zdF9wcml2IHsKIAljb25zdCBpbnQgKm1hcDsKLQljb25zdCBzdHJ1Y3QgcGlpeF9tYXBfZGIgKm1hcF9kYjsKIH07CiAKIHN0YXRpYyBpbnQgcGlpeF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCkBAIC0yMTUsOSArMjEzLDkgQEAKIAkvKiA4MjgwMUVCIChJQ0g1KSAqLwogCXsgMHg4MDg2LCAweDI0ZGYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDVfc2F0YSB9LAogCS8qIDYzMDBFU0IgKElDSDUgdmFyaWFudCB3aXRoIGJyb2tlbiBQQ1MgcHJlc2VudCBiaXRzKSAqLwotCXsgMHg4MDg2LCAweDI1YTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGVzYl9zYXRhIH0sCisJeyAweDgwODYsIDB4MjVhMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNV9zYXRhIH0sCiAJLyogNjMwMEVTQiBwcmV0ZW5kaW5nIFJBSUQgKi8KLQl7IDB4ODA4NiwgMHgyNWIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBlc2Jfc2F0YSB9LAorCXsgMHg4MDg2LCAweDI1YjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDVfc2F0YSB9LAogCS8qIDgyODAxRkIvRlcgKElDSDYvSUNINlcpICovCiAJeyAweDgwODYsIDB4MjY1MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNl9zYXRhIH0sCiAJLyogODI4MDFGUi9GUlcgKElDSDZSL0lDSDZSVykgKi8KQEAgLTIyNyw3ICsyMjUsNyBAQAogCS8qIDgyODAxR0IvR1IvR0ggKElDSDcsIGlkZW50aWNhbCB0byBJQ0g2KSAqLwogCXsgMHg4MDg2LCAweDI3YzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDZfc2F0YV9haGNpIH0sCiAJLyogMjgwMUdCTS9HSE0gKElDSDdNLCBpZGVudGljYWwgdG8gSUNINk0pICovCi0JeyAweDgwODYsIDB4MjdjNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoN21fc2F0YV9haGNpIH0sCisJeyAweDgwODYsIDB4MjdjNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgaWNoNm1fc2F0YV9haGNpIH0sCiAJLyogRW50ZXJwcmlzZSBTb3V0aGJyaWRnZSAyICh3aGVyZSdzIHRoZSBkYXRhc2hlZXQ/KSAqLwogCXsgMHg4MDg2LCAweDI2ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDZfc2F0YV9haGNpIH0sCiAJLyogU0FUQSBDb250cm9sbGVyIDEgSURFIChJQ0g4LCBubyBkYXRhc2hlZXQgeWV0KSAqLwpAQCAtMzY4LDcgKzM2Niw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHBpaXhfbWFwX2RiIGljaDVfbWFwX2RiID0gewogCS5tYXNrID0gMHg3LAogCS5wb3J0X2VuYWJsZSA9IDB4MywKLQkucHJlc2VudF9zaGlmdCA9IDQsCiAJLm1hcCA9IHsKIAkJLyogUE0gICBQUyAgIFNNICAgU1MgICAgICAgTUFQICAqLwogCQl7ICBQMCwgIE5BLCAgUDEsICBOQSB9LCAvKiAwMDBiICovCkBAIC0zODUsNyArMzgyLDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlpeF9tYXBfZGIgaWNoNl9tYXBfZGIgPSB7CiAJLm1hc2sgPSAweDMsCiAJLnBvcnRfZW5hYmxlID0gMHhmLAotCS5wcmVzZW50X3NoaWZ0ID0gNCwKIAkubWFwID0gewogCQkvKiBQTSAgIFBTICAgU00gICBTUyAgICAgICBNQVAgKi8KIAkJeyAgUDAsICBQMiwgIFAxLCAgUDMgfSwgLyogMDBiICovCkBAIC0zOTgsMjQgKzM5NCwxMCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWl4X21hcF9kYiBpY2g2bV9tYXBfZGIgPSB7CiAJLm1hc2sgPSAweDMsCiAJLnBvcnRfZW5hYmxlID0gMHg1LAotCS5wcmVzZW50X3NoaWZ0ID0gNCwKLQkubWFwID0gewotCQkvKiBQTSAgIFBTICAgU00gICBTUyAgICAgICBNQVAgKi8KLQkJeyAgUDAsICBQMiwgIFJWLCAgUlYgfSwgLyogMDBiICovCi0JCXsgIFJWLCAgUlYsICBSViwgIFJWIH0sCi0JCXsgIFAwLCAgUDIsIElERSwgSURFIH0sIC8qIDEwYiAqLwotCQl7ICBSViwgIFJWLCAgUlYsICBSViB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBpaXhfbWFwX2RiIGljaDdtX21hcF9kYiA9IHsKLQkubWFzayA9IDB4MywKLQkucG9ydF9lbmFibGUgPSAweDUsCi0JLnByZXNlbnRfc2hpZnQgPSA0LAogCiAJLyogTWFwIDAxYiBpc24ndCBzcGVjaWZpZWQgaW4gdGhlIGRvYyBidXQgc29tZSBub3RlYm9va3MgdXNlCi0JICogaXQgYW55d2F5LiAgQVRNLCB0aGUgb25seSBjYXNlIHNwb3R0ZWQgY2FycmllcyBzdWJzeXN0ZW0gSUQKLQkgKiAxMDI1OjAxMDcuICBUaGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbSBpY2g2bS4KKwkgKiBpdCBhbnl3YXkuICBNQVAgMDFiIGhhdmUgYmVlbiBzcG90dGVkIG9uIGJvdGggSUNINk0gYW5kCisJICogSUNIN00uCiAJICovCiAJLm1hcCA9IHsKIAkJLyogUE0gICBQUyAgIFNNICAgU1MgICAgICAgTUFQICovCkBAIC00MjksMjMgKzQxMSwyMCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWl4X21hcF9kYiBpY2g4X21hcF9kYiA9IHsKIAkubWFzayA9IDB4MywKIAkucG9ydF9lbmFibGUgPSAweDMsCi0JLnByZXNlbnRfc2hpZnQgPSA4LAogCS5tYXAgPSB7CiAJCS8qIFBNICAgUFMgICBTTSAgIFNTICAgICAgIE1BUCAqLwotCQl7ICBQMCwgIE5BLCAgUDEsICBOQSB9LCAvKiAwMGIgKGhhcmR3aXJlZCkgKi8KKwkJeyAgUDAsICBQMiwgIFAxLCAgUDMgfSwgLyogMDBiIChoYXJkd2lyZWQgd2hlbiBpbiBBSENJKSAqLwogCQl7ICBSViwgIFJWLCAgUlYsICBSViB9LAotCQl7ICBSViwgIFJWLCAgUlYsICBSViB9LCAvKiAxMGIgKG5ldmVyKSAqLworCQl7ICBJREUsICBJREUsICBOQSwgIE5BIH0sIC8qIDEwYiAoSURFIG1vZGUpICovCiAJCXsgIFJWLCAgUlYsICBSViwgIFJWIH0sCiAJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlpeF9tYXBfZGIgKnBpaXhfbWFwX2RiX3RhYmxlW10gPSB7CiAJW2ljaDVfc2F0YV0JCT0gJmljaDVfbWFwX2RiLAotCVtlc2Jfc2F0YV0JCT0gJmljaDVfbWFwX2RiLAogCVtpY2g2X3NhdGFdCQk9ICZpY2g2X21hcF9kYiwKIAlbaWNoNl9zYXRhX2FoY2ldCT0gJmljaDZfbWFwX2RiLAogCVtpY2g2bV9zYXRhX2FoY2ldCT0gJmljaDZtX21hcF9kYiwKLQlbaWNoN21fc2F0YV9haGNpXQk9ICZpY2g3bV9tYXBfZGIsCiAJW2ljaDhfc2F0YV9haGNpXQk9ICZpY2g4X21hcF9kYiwKIH07CiAKQEAgLTQ1Myw3ICs0MzIsNyBAQAogCS8qIHBpaXhfcGF0YV8zMzogMDogIFBJSVgzIG9yIDQgYXQgMzNNSHogKi8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCisJCS5mbGFncwkJPSBQSUlYX1BBVEFfRkxBR1MsCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDYsIC8qIG13ZG1hMS0yID8/IENIRUNLIDAgc2hvdWxkIGJlIG9rIGJ1dCBzbG93ICovCiAJCS51ZG1hX21hc2sJPSBBVEFfVURNQV9NQVNLXzQwQywKQEAgLTQ2Myw3ICs0NDIsNyBAQAogCS8qIGljaF9wYXRhXzMzOiAxIAlJQ0gwIC0gSUNIIGF0IDMzTWh6Ki8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJCS5mbGFncwkJPSBQSUlYX1BBVEFfRkxBR1MsCiAJCS5waW9fbWFzayAJPSAweDFmLAkvKiBwaW8gMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNiwgLyogQ2hlY2s6IG1heWJlIDB4MDcgICovCiAJCS51ZG1hX21hc2sJPSBBVEFfVURNQTIsIC8qIFVETUEzMyAqLwpAQCAtNDcyLDcgKzQ1MSw3IEBACiAJLyogaWNoX3BhdGFfNjY6IDIgCUlDSCBjb250cm9sbGVycyB1cCB0byA2Nk1IeiAqLwogCXsKIAkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUywKKwkJLmZsYWdzCQk9IFBJSVhfUEFUQV9GTEFHUywKIAkJLnBpb19tYXNrIAk9IDB4MWYsCS8qIHBpbyAwLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA2LCAvKiBNV0RNQTAgaXMgYnJva2VuIG9uIGNoaXAgKi8KIAkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNCwKQEAgLTQ4Miw3ICs0NjEsNyBAQAogCS8qIGljaF9wYXRhXzEwMDogMyAqLwogCXsKIAkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IFBJSVhfRkxBR19DSEVDS0lOVFIsCisJCS5mbGFncwkJPSBQSUlYX1BBVEFfRkxBR1MgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSLAogCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA2LCAvKiBtd2RtYTEtMiAqLwogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE1LCAvKiB1ZG1hMC01ICovCkBAIC00OTIsNyArNDcxLDcgQEAKIAkvKiBpY2hfcGF0YV8xMzM6IDQgCUlDSCB3aXRoIGZ1bGwgVURNQTYgKi8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBQSUlYX0ZMQUdfQ0hFQ0tJTlRSLAorCQkuZmxhZ3MJCT0gUElJWF9QQVRBX0ZMQUdTIHwgUElJWF9GTEFHX0NIRUNLSU5UUiwKIAkJLnBpb19tYXNrIAk9IDB4MWYsCS8qIHBpbyAwLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA2LCAvKiBDaGVjazogbWF5YmUgMHgwNyAgKi8KIAkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwgLyogVURNQTEzMyAqLwpAQCAtNTAyLDQxICs0ODEsMjcgQEAKIAkvKiBpY2g1X3NhdGE6IDUgKi8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IFBJSVhfRkxBR19DSEVDS0lOVFIgfAotCQkJCSAgUElJWF9GTEFHX0lHTk9SRV9QQ1MsCisJCS5mbGFncwkJPSBQSUlYX1NBVEFfRkxBR1MsCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCiAJCS51ZG1hX21hc2sJPSAweDdmLAkvKiB1ZG1hMC02ICovCiAJCS5wb3J0X29wcwk9ICZwaWl4X3NhdGFfb3BzLAogCX0sCiAKLQkvKiBpNjMwMGVzYl9zYXRhOiA2ICovCisJLyogaWNoNl9zYXRhOiA2ICovCiAJewogCQkuc2h0CQk9ICZwaWl4X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfAotCQkJCSAgUElJWF9GTEFHX0NIRUNLSU5UUiB8IFBJSVhfRkxBR19JR05PUkVfUENTLAorCQkuZmxhZ3MJCT0gUElJWF9TQVRBX0ZMQUdTIHwgUElJWF9GTEFHX1NDUiwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KIAkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCiAJfSwKIAotCS8qIGljaDZfc2F0YTogNyAqLworCS8qIGljaDZfc2F0YV9haGNpOiA3ICovCiAJewogCQkuc2h0CQk9ICZwaWl4X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfAotCQkJCSAgUElJWF9GTEFHX0NIRUNLSU5UUiB8IFBJSVhfRkxBR19TQ1IsCi0JCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwotCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCi0JCS51ZG1hX21hc2sJPSAweDdmLAkvKiB1ZG1hMC02ICovCi0JCS5wb3J0X29wcwk9ICZwaWl4X3NhdGFfb3BzLAotCX0sCi0KLQkvKiBpY2g2X3NhdGFfYWhjaTogOCAqLwotCXsKLQkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwKLQkJCQkgIFBJSVhfRkxBR19DSEVDS0lOVFIgfCBQSUlYX0ZMQUdfU0NSIHwKKwkJLmZsYWdzCQk9IFBJSVhfU0FUQV9GTEFHUyB8IFBJSVhfRkxBR19TQ1IgfAogCQkJCSAgUElJWF9GTEFHX0FIQ0ksCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCkBAIC01NDQsMTEgKzUwOSwxMCBAQAogCQkucG9ydF9vcHMJPSAmcGlpeF9zYXRhX29wcywKIAl9LAogCi0JLyogaWNoNm1fc2F0YV9haGNpOiA5ICovCisJLyogaWNoNm1fc2F0YV9haGNpOiA4ICovCiAJewogCQkuc2h0CQk9ICZwaWl4X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfAotCQkJCSAgUElJWF9GTEFHX0NIRUNLSU5UUiB8IFBJSVhfRkxBR19TQ1IgfAorCQkuZmxhZ3MJCT0gUElJWF9TQVRBX0ZMQUdTIHwgUElJWF9GTEFHX1NDUiB8CiAJCQkJICBQSUlYX0ZMQUdfQUhDSSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KQEAgLTU1NiwyMyArNTIwLDEwIEBACiAJCS5wb3J0X29wcwk9ICZwaWl4X3NhdGFfb3BzLAogCX0sCiAKLQkvKiBpY2g3bV9zYXRhX2FoY2k6IDEwICovCisJLyogaWNoOF9zYXRhX2FoY2k6IDkgKi8KIAl7CiAJCS5zaHQJCT0gJnBpaXhfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8Ci0JCQkJICBQSUlYX0ZMQUdfQ0hFQ0tJTlRSIHwgUElJWF9GTEFHX1NDUiB8Ci0JCQkJICBQSUlYX0ZMQUdfQUhDSSwKLQkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCi0JCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KLQkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KLQkJLnBvcnRfb3BzCT0gJnBpaXhfc2F0YV9vcHMsCi0JfSwKLQotCS8qIGljaDhfc2F0YV9haGNpOiAxMSAqLwotCXsKLQkJLnNodAkJPSAmcGlpeF9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwKLQkJCQkgIFBJSVhfRkxBR19DSEVDS0lOVFIgfCBQSUlYX0ZMQUdfU0NSIHwKKwkJLmZsYWdzCQk9IFBJSVhfU0FUQV9GTEFHUyB8IFBJSVhfRkxBR19TQ1IgfAogCQkJCSAgUElJWF9GTEFHX0FIQ0ksCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCkBAIC01OTMsMTAgKzU0NCwyMiBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBpaXhfcGNpX3RibCk7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKLXN0YXRpYyBpbnQgZm9yY2VfcGNzID0gMDsKLW1vZHVsZV9wYXJhbShmb3JjZV9wY3MsIGludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3BjcywgImZvcmNlIGhvbm9yaW5nIG9yIGlnbm9yaW5nIFBDUyB0byB3b3JrIGFyb3VuZCAiCi0JCSAiZGV2aWNlIG1pcy1kZXRlY3Rpb24gKDA9ZGVmYXVsdCwgMT1pZ25vcmUgUENTLCAyPWhvbm9yIFBDUykiKTsKK3N0cnVjdCBpY2hfbGFwdG9wIHsKKwl1MTYgZGV2aWNlOworCXUxNiBzdWJ2ZW5kb3I7CisJdTE2IHN1YmRldmljZTsKK307CisKKy8qCisgKglMaXN0IG9mIGxhcHRvcHMgdGhhdCB1c2Ugc2hvcnQgY2FibGVzIHJhdGhlciB0aGFuIDgwIHdpcmUKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGljaF9sYXB0b3AgaWNoX2xhcHRvcFtdID0geworCS8qIGRldmlkLCBzdWJ2ZW5kb3IsIHN1YmRldiAqLworCXsgMHgyN0RGLCAweDAwMDUsIDB4MDI4MCB9LAkvKiBJQ0g3IG9uIEFjZXIgNTYwMldMTWkgKi8KKwkvKiBlbmQgbWFya2VyICovCisJeyAwLCB9Cit9OwogCiAvKioKICAqCXBpaXhfcGF0YV9jYmxfZGV0ZWN0IC0gUHJvYmUgaG9zdCBjb250cm9sbGVyIGNhYmxlIGRldGVjdCBpbmZvCkBAIC02MTIsMTIgKzU3NSwyNCBAQAogc3RhdGljIHZvaWQgaWNoX3BhdGFfY2JsX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwljb25zdCBzdHJ1Y3QgaWNoX2xhcHRvcCAqbGFwID0gJmljaF9sYXB0b3BbMF07CiAJdTggdG1wLCBtYXNrOwogCiAJLyogbm8gODBjIHN1cHBvcnQgaW4gaG9zdCBjb250cm9sbGVyPyAqLwogCWlmICgoYXAtPnVkbWFfbWFzayAmIH5BVEFfVURNQV9NQVNLXzQwQykgPT0gMCkKIAkJZ290byBjYmw0MDsKIAorCS8qIENoZWNrIGZvciBzcGVjaWFscyAtIEFjZXIgQXNwaXJlIDU2MDJXTE1pICovCisJd2hpbGUgKGxhcC0+ZGV2aWNlKSB7CisJCWlmIChsYXAtPmRldmljZSA9PSBwZGV2LT5kZXZpY2UgJiYKKwkJICAgIGxhcC0+c3VidmVuZG9yID09IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgJiYKKwkJICAgIGxhcC0+c3ViZGV2aWNlID09IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MF9TSE9SVDsKKwkJICAgIAlyZXR1cm47CisJCX0KKwkJbGFwKys7CisJfQorCiAJLyogY2hlY2sgQklPUyBjYWJsZSBkZXRlY3QgcmVzdWx0cyAqLwogCW1hc2sgPSBhcC0+cG9ydF9ubyA9PSAwID8gUElJWF84MENfUFJJIDogUElJWF84MENfU0VDOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBJSVhfSU9DRkcsICZ0bXApOwpAQCAtNjg2LDg0ICs2NjEsOSBAQAogCQkJICAgYXRhX3N0ZF9wb3N0cmVzZXQpOwogfQogCi0vKioKLSAqCXBpaXhfc2F0YV9wcmVzZW50X21hc2sgLSBkZXRlcm1pbmUgcHJlc2VudCBtYXNrIGZvciBTQVRBIGhvc3QgY29udHJvbGxlcgotICoJQGFwOiBUYXJnZXQgcG9ydAotICoKLSAqCVJlYWRzIFNBVEEgUENJIGRldmljZSdzIFBDSSBjb25maWcgcmVnaXN0ZXIgUG9ydCBDb25maWd1cmF0aW9uCi0gKglhbmQgU3RhdHVzIChQQ1MpIHRvIGRldGVybWluZSBwb3J0IGFuZCBkZXZpY2UgYXZhaWxhYmlsaXR5LgotICoKLSAqCUxPQ0tJTkc6Ci0gKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgotICoKLSAqCVJFVFVSTlM6Ci0gKglkZXRlcm1pbmVkIHByZXNlbnRfbWFzawotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHBpaXhfc2F0YV9wcmVzZW50X21hc2soc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0Jc3RydWN0IHBpaXhfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgdW5zaWduZWQgaW50ICptYXAgPSBocHJpdi0+bWFwOwotCWludCBiYXNlID0gMiAqIGFwLT5wb3J0X25vOwotCXVuc2lnbmVkIGludCBwcmVzZW50X21hc2sgPSAwOwotCWludCBwb3J0LCBpOwotCXUxNiBwY3M7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBJQ0g1X1BDUywgJnBjcyk7Ci0JRFBSSU5USygiYXRhJXU6IEVOVEVSLCBwY3M9MHgleCBiYXNlPSVkXG4iLCBhcC0+aWQsIHBjcywgYmFzZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXBvcnQgPSBtYXBbYmFzZSArIGldOwotCQlpZiAocG9ydCA8IDApCi0JCQljb250aW51ZTsKLQkJaWYgKChhcC0+ZmxhZ3MgJiBQSUlYX0ZMQUdfSUdOT1JFX1BDUykgfHwKLQkJICAgIChwY3MgJiAxIDw8IChocHJpdi0+bWFwX2RiLT5wcmVzZW50X3NoaWZ0ICsgcG9ydCkpKQotCQkJcHJlc2VudF9tYXNrIHw9IDEgPDwgaTsKLQl9Ci0KLQlEUFJJTlRLKCJhdGEldTogTEVBVkUsIHBjcz0weCV4IHByZXNlbnRfbWFzaz0weCV4XG4iLAotCQlhcC0+aWQsIHBjcywgcHJlc2VudF9tYXNrKTsKLQotCXJldHVybiBwcmVzZW50X21hc2s7Ci19Ci0KLS8qKgotICoJcGlpeF9zYXRhX3NvZnRyZXNldCAtIHJlc2V0IFNBVEEgaG9zdCBwb3J0IHZpYSBBVEEgU1JTVAotICoJQGFwOiBwb3J0IHRvIHJlc2V0Ci0gKglAY2xhc3NlczogcmVzdWx0aW5nIGNsYXNzZXMgb2YgYXR0YWNoZWQgZGV2aWNlcwotICoKLSAqCVJlc2V0IFNBVEEgaG9zdCBwb3J0IHZpYSBBVEEgU1JTVC4gIE9uIGNvbnRyb2xsZXJzIHdpdGgKLSAqCXJlbGlhYmxlIFBDUyBwcmVzZW50IGJpdHMsIHRoZSBiaXRzIGFyZSB1c2VkIHRvIGRldGVybWluZQotICoJZGV2aWNlIHByZXNlbmNlLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkKLSAqCi0gKglSRVRVUk5TOgotICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW50IHBpaXhfc2F0YV9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKQotewotCXVuc2lnbmVkIGludCBwcmVzZW50X21hc2s7Ci0JaW50IGksIHJjOwotCi0JcHJlc2VudF9tYXNrID0gcGlpeF9zYXRhX3ByZXNlbnRfbWFzayhhcCk7Ci0KLQlyYyA9IGF0YV9zdGRfc29mdHJlc2V0KGFwLCBjbGFzc2VzKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgewotCQlpZiAoIShwcmVzZW50X21hc2sgJiAoMSA8PCBpKSkpCi0JCQljbGFzc2VzW2ldID0gQVRBX0RFVl9OT05FOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBwaWl4X3NhdGFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCWF0YV9ibWRtYV9kcml2ZV9laChhcCwgYXRhX3N0ZF9wcmVyZXNldCwgcGlpeF9zYXRhX3NvZnRyZXNldCwgTlVMTCwKKwlhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLAogCQkJICAgYXRhX3N0ZF9wb3N0cmVzZXQpOwogfQogCkBAIC0xMDc4LDE4ICs5NzgsNiBAQAogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgSUNINV9QQ1MsIG5ld19wY3MpOwogCQltc2xlZXAoMTUwKTsKIAl9Ci0KLQlpZiAoZm9yY2VfcGNzID09IDEpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCi0JCQkgICAiZm9yY2UgaWdub3JpbmcgUENTICgweCV4KVxuIiwgbmV3X3Bjcyk7Ci0JCXBpbmZvWzBdLmZsYWdzIHw9IFBJSVhfRkxBR19JR05PUkVfUENTOwotCQlwaW5mb1sxXS5mbGFncyB8PSBQSUlYX0ZMQUdfSUdOT1JFX1BDUzsKLQl9IGVsc2UgaWYgKGZvcmNlX3BjcyA9PSAyKSB7Ci0JCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAotCQkJICAgImZvcmNlIGhvbm9yaW5nIFBDUyAoMHgleClcbiIsIG5ld19wY3MpOwotCQlwaW5mb1swXS5mbGFncyAmPSB+UElJWF9GTEFHX0lHTk9SRV9QQ1M7Ci0JCXBpbmZvWzFdLmZsYWdzICY9IH5QSUlYX0ZMQUdfSUdOT1JFX1BDUzsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwaWl4X2luaXRfc2F0YV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCkBAIC0xMTM5LDcgKzEwMjcsNiBAQAogCQkJICAgImludmFsaWQgTUFQIHZhbHVlICV1XG4iLCBtYXBfdmFsdWUpOwogCiAJaHByaXYtPm1hcCA9IG1hcDsKLQlocHJpdi0+bWFwX2RiID0gbWFwX2RiOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCmluZGV4IDgzNzI4YTkuLjAxMWMwYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwpAQCAtMTk5LDcgKzE5OSw4IEBACiAKIC8qKgogICoJYXRhX3J3Y21kX3Byb3RvY29sIC0gc2V0IHRhc2tmaWxlIHIvdyBjb21tYW5kcyBhbmQgcHJvdG9jb2wKLSAqCUBxYzogY29tbWFuZCB0byBleGFtaW5lIGFuZCBjb25maWd1cmUKKyAqCUB0ZjogY29tbWFuZCB0byBleGFtaW5lIGFuZCBjb25maWd1cmUKKyAqCUBkZXY6IGRldmljZSB0ZiBiZWxvbmdzIHRvCiAgKgogICoJRXhhbWluZSB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gYW5kIHRmLT5mbGFncyB0byBjYWxjdWxhdGUKICAqCXRoZSBwcm9wZXIgcmVhZC93cml0ZSBjb21tYW5kcyBhbmQgcHJvdG9jb2wgdG8gdXNlLgpAQCAtMjA3LDEwICsyMDgsOCBAQAogICoJTE9DS0lORzoKICAqCWNhbGxlci4KICAqLwotaW50IGF0YV9yd2NtZF9wcm90b2NvbChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQorc3RhdGljIGludCBhdGFfcndjbWRfcHJvdG9jb2woc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnRmOwotCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBxYy0+ZGV2OwogCXU4IGNtZDsKIAogCWludCBpbmRleCwgZnVhLCBsYmE0OCwgd3JpdGU7CkBAIC0yMjIsNyArMjIxLDcgQEAKIAlpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19QSU8pIHsKIAkJdGYtPnByb3RvY29sID0gQVRBX1BST1RfUElPOwogCQlpbmRleCA9IGRldi0+bXVsdGlfY291bnQgPyAwIDogODsKLQl9IGVsc2UgaWYgKGxiYTQ4ICYmIChxYy0+YXAtPmZsYWdzICYgQVRBX0ZMQUdfUElPX0xCQTQ4KSkgeworCX0gZWxzZSBpZiAobGJhNDggJiYgKGRldi0+YXAtPmZsYWdzICYgQVRBX0ZMQUdfUElPX0xCQTQ4KSkgewogCQkvKiBVbmFibGUgdG8gdXNlIERNQSBkdWUgdG8gaG9zdCBsaW1pdGF0aW9uICovCiAJCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX1BJTzsKIAkJaW5kZXggPSBkZXYtPm11bHRpX2NvdW50ID8gMCA6IDg7CkBAIC0yNDAsNiArMjM5LDE3NCBAQAogfQogCiAvKioKKyAqCWF0YV90Zl9yZWFkX2Jsb2NrIC0gUmVhZCBibG9jayBhZGRyZXNzIGZyb20gQVRBIHRhc2tmaWxlCisgKglAdGY6IEFUQSB0YXNrZmlsZSBvZiBpbnRlcmVzdAorICoJQGRldjogQVRBIGRldmljZSBAdGYgYmVsb25ncyB0bworICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICoKKyAqCVJlYWQgYmxvY2sgYWRkcmVzcyBmcm9tIEB0Zi4gIFRoaXMgZnVuY3Rpb24gY2FuIGhhbmRsZSBhbGwKKyAqCXRocmVlIGFkZHJlc3MgZm9ybWF0cyAtIExCQSwgTEJBNDggYW5kIENIUy4gIHRmLT5wcm90b2NvbCBhbmQKKyAqCWZsYWdzIHNlbGVjdCB0aGUgYWRkcmVzcyBmb3JtYXQgdG8gdXNlLgorICoKKyAqCVJFVFVSTlM6CisgKglCbG9jayBhZGRyZXNzIHJlYWQgZnJvbSBAdGYuCisgKi8KK3U2NCBhdGFfdGZfcmVhZF9ibG9jayhzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3sKKwl1NjQgYmxvY2sgPSAwOworCisJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkEpIHsKKwkJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkgeworCQkJYmxvY2sgfD0gKHU2NCl0Zi0+aG9iX2xiYWggPDwgNDA7CisJCQlibG9jayB8PSAodTY0KXRmLT5ob2JfbGJhbSA8PCAzMjsKKwkJCWJsb2NrIHw9IHRmLT5ob2JfbGJhbCA8PCAyNDsKKwkJfSBlbHNlCisJCQlibG9jayB8PSAodGYtPmRldmljZSAmIDB4ZikgPDwgMjQ7CisKKwkJYmxvY2sgfD0gdGYtPmxiYWggPDwgMTY7CisJCWJsb2NrIHw9IHRmLT5sYmFtIDw8IDg7CisJCWJsb2NrIHw9IHRmLT5sYmFsOworCX0gZWxzZSB7CisJCXUzMiBjeWwsIGhlYWQsIHNlY3Q7CisKKwkJY3lsID0gdGYtPmxiYW0gfCAodGYtPmxiYWggPDwgOCk7CisJCWhlYWQgPSB0Zi0+ZGV2aWNlICYgMHhmOworCQlzZWN0ID0gdGYtPmxiYWw7CisKKwkJYmxvY2sgPSAoY3lsICogZGV2LT5oZWFkcyArIGhlYWQpICogZGV2LT5zZWN0b3JzICsgc2VjdDsKKwl9CisKKwlyZXR1cm4gYmxvY2s7Cit9CisKKy8qKgorICoJYXRhX2J1aWxkX3J3X3RmIC0gQnVpbGQgQVRBIHRhc2tmaWxlIGZvciBnaXZlbiByZWFkL3dyaXRlIHJlcXVlc3QKKyAqCUB0ZjogVGFyZ2V0IEFUQSB0YXNrZmlsZQorICoJQGRldjogQVRBIGRldmljZSBAdGYgYmVsb25ncyB0bworICoJQGJsb2NrOiBCbG9jayBhZGRyZXNzCisgKglAbl9ibG9jazogTnVtYmVyIG9mIGJsb2NrcworICoJQHRmX2ZsYWdzOiBSVy9GVUEgZXRjLi4uCisgKglAdGFnOiB0YWcKKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqCisgKglCdWlsZCBBVEEgdGFza2ZpbGUgQHRmIGZvciByZWFkL3dyaXRlIHJlcXVlc3QgZGVzY3JpYmVkIGJ5CisgKglAYmxvY2ssIEBuX2Jsb2NrLCBAdGZfZmxhZ3MgYW5kIEB0YWcgb24gQGRldi4KKyAqCisgKglSRVRVUk5TOgorICoKKyAqCTAgb24gc3VjY2VzcywgLUVSQU5HRSBpZiB0aGUgcmVxdWVzdCBpcyB0b28gbGFyZ2UgZm9yIEBkZXYsCisgKgktRUlOVkFMIGlmIHRoZSByZXF1ZXN0IGlzIGludmFsaWQuCisgKi8KK2ludCBhdGFfYnVpbGRfcndfdGYoc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCSAgICB1NjQgYmxvY2ssIHUzMiBuX2Jsb2NrLCB1bnNpZ25lZCBpbnQgdGZfZmxhZ3MsCisJCSAgICB1bnNpZ25lZCBpbnQgdGFnKQoreworCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKKwl0Zi0+ZmxhZ3MgfD0gdGZfZmxhZ3M7CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiAoQVRBX0RGTEFHX1BJTyB8IEFUQV9ERkxBR19OQ1FfT0ZGIHwKKwkJCSAgIEFUQV9ERkxBR19OQ1EpKSA9PSBBVEFfREZMQUdfTkNRICYmCisJICAgIGxpa2VseSh0YWcgIT0gQVRBX1RBR19JTlRFUk5BTCkpIHsKKwkJLyogeWF5LCBOQ1EgKi8KKwkJaWYgKCFsYmFfNDhfb2soYmxvY2ssIG5fYmxvY2spKQorCQkJcmV0dXJuIC1FUkFOR0U7CisKKwkJdGYtPnByb3RvY29sID0gQVRBX1BST1RfTkNROworCQl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX0xCQSB8IEFUQV9URkxBR19MQkE0ODsKKworCQlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKQorCQkJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX0ZQRE1BX1dSSVRFOworCQllbHNlCisJCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfRlBETUFfUkVBRDsKKworCQl0Zi0+bnNlY3QgPSB0YWcgPDwgMzsKKwkJdGYtPmhvYl9mZWF0dXJlID0gKG5fYmxvY2sgPj4gOCkgJiAweGZmOworCQl0Zi0+ZmVhdHVyZSA9IG5fYmxvY2sgJiAweGZmOworCisJCXRmLT5ob2JfbGJhaCA9IChibG9jayA+PiA0MCkgJiAweGZmOworCQl0Zi0+aG9iX2xiYW0gPSAoYmxvY2sgPj4gMzIpICYgMHhmZjsKKwkJdGYtPmhvYl9sYmFsID0gKGJsb2NrID4+IDI0KSAmIDB4ZmY7CisJCXRmLT5sYmFoID0gKGJsb2NrID4+IDE2KSAmIDB4ZmY7CisJCXRmLT5sYmFtID0gKGJsb2NrID4+IDgpICYgMHhmZjsKKwkJdGYtPmxiYWwgPSBibG9jayAmIDB4ZmY7CisKKwkJdGYtPmRldmljZSA9IDEgPDwgNjsKKwkJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19GVUEpCisJCQl0Zi0+ZGV2aWNlIHw9IDEgPDwgNzsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBKSB7CisJCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfTEJBOworCisJCWlmIChsYmFfMjhfb2soYmxvY2ssIG5fYmxvY2spKSB7CisJCQkvKiB1c2UgTEJBMjggKi8KKwkJCXRmLT5kZXZpY2UgfD0gKGJsb2NrID4+IDI0KSAmIDB4ZjsKKwkJfSBlbHNlIGlmIChsYmFfNDhfb2soYmxvY2ssIG5fYmxvY2spKSB7CisJCQlpZiAoIShkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xCQTQ4KSkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKworCQkJLyogdXNlIExCQTQ4ICovCisJCQl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX0xCQTQ4OworCisJCQl0Zi0+aG9iX25zZWN0ID0gKG5fYmxvY2sgPj4gOCkgJiAweGZmOworCisJCQl0Zi0+aG9iX2xiYWggPSAoYmxvY2sgPj4gNDApICYgMHhmZjsKKwkJCXRmLT5ob2JfbGJhbSA9IChibG9jayA+PiAzMikgJiAweGZmOworCQkJdGYtPmhvYl9sYmFsID0gKGJsb2NrID4+IDI0KSAmIDB4ZmY7CisJCX0gZWxzZQorCQkJLyogcmVxdWVzdCB0b28gbGFyZ2UgZXZlbiBmb3IgTEJBNDggKi8KKwkJCXJldHVybiAtRVJBTkdFOworCisJCWlmICh1bmxpa2VseShhdGFfcndjbWRfcHJvdG9jb2wodGYsIGRldikgPCAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXRmLT5uc2VjdCA9IG5fYmxvY2sgJiAweGZmOworCisJCXRmLT5sYmFoID0gKGJsb2NrID4+IDE2KSAmIDB4ZmY7CisJCXRmLT5sYmFtID0gKGJsb2NrID4+IDgpICYgMHhmZjsKKwkJdGYtPmxiYWwgPSBibG9jayAmIDB4ZmY7CisKKwkJdGYtPmRldmljZSB8PSBBVEFfTEJBOworCX0gZWxzZSB7CisJCS8qIENIUyAqLworCQl1MzIgc2VjdCwgaGVhZCwgY3lsLCB0cmFjazsKKworCQkvKiBUaGUgcmVxdWVzdCAtbWF5LSBiZSB0b28gbGFyZ2UgZm9yIENIUyBhZGRyZXNzaW5nLiAqLworCQlpZiAoIWxiYV8yOF9vayhibG9jaywgbl9ibG9jaykpCisJCQlyZXR1cm4gLUVSQU5HRTsKKworCQlpZiAodW5saWtlbHkoYXRhX3J3Y21kX3Byb3RvY29sKHRmLCBkZXYpIDwgMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBDb252ZXJ0IExCQSB0byBDSFMgKi8KKwkJdHJhY2sgPSAodTMyKWJsb2NrIC8gZGV2LT5zZWN0b3JzOworCQljeWwgICA9IHRyYWNrIC8gZGV2LT5oZWFkczsKKwkJaGVhZCAgPSB0cmFjayAlIGRldi0+aGVhZHM7CisJCXNlY3QgID0gKHUzMilibG9jayAlIGRldi0+c2VjdG9ycyArIDE7CisKKwkJRFBSSU5USygiYmxvY2sgJXUgdHJhY2sgJXUgY3lsICV1IGhlYWQgJXUgc2VjdCAldVxuIiwKKwkJCSh1MzIpYmxvY2ssIHRyYWNrLCBjeWwsIGhlYWQsIHNlY3QpOworCisJCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbnZlcnRlZCBDSFMgY2FuIGZpdC4KKwkJICAgQ3lsaW5kZXI6IDAtNjU1MzUKKwkJICAgSGVhZDogMC0xNQorCQkgICBTZWN0b3I6IDEtMjU1Ki8KKwkJaWYgKChjeWwgPj4gMTYpIHx8IChoZWFkID4+IDQpIHx8IChzZWN0ID4+IDgpIHx8ICghc2VjdCkpCisJCQlyZXR1cm4gLUVSQU5HRTsKKworCQl0Zi0+bnNlY3QgPSBuX2Jsb2NrICYgMHhmZjsgLyogU2VjdG9yIGNvdW50IDAgbWVhbnMgMjU2IHNlY3RvcnMgKi8KKwkJdGYtPmxiYWwgPSBzZWN0OworCQl0Zi0+bGJhbSA9IGN5bDsKKwkJdGYtPmxiYWggPSBjeWwgPj4gODsKKwkJdGYtPmRldmljZSB8PSBoZWFkOworCX0KKworCXJldHVybiAwOworfQorCisvKioKICAqCWF0YV9wYWNrX3hmZXJtYXNrIC0gUGFjayBwaW8sIG13ZG1hIGFuZCB1ZG1hIG1hc2tzIGludG8geGZlcl9tYXNrCiAgKglAcGlvX21hc2s6IHBpb19tYXNrCiAgKglAbXdkbWFfbWFzazogbXdkbWFfbWFzawpAQCAtOTE0LDcgKzEwODEsNyBAQAogICoJYXRhX3BvcnRfcXVldWVfdGFzayAtIFF1ZXVlIHBvcnRfdGFzawogICoJQGFwOiBUaGUgYXRhX3BvcnQgdG8gcXVldWUgcG9ydF90YXNrIGZvcgogICoJQGZuOiB3b3JrcXVldWUgZnVuY3Rpb24gdG8gYmUgc2NoZWR1bGVkCi0gKglAZGF0YTogZGF0YSB2YWx1ZSB0byBwYXNzIHRvIHdvcmtxdWV1ZSBmdW5jdGlvbgorICoJQGRhdGE6IGRhdGEgZm9yIEBmbiB0byB1c2UKICAqCUBkZWxheTogZGVsYXkgdGltZSBmb3Igd29ya3F1ZXVlIGZ1bmN0aW9uCiAgKgogICoJU2NoZWR1bGUgQGZuKEBkYXRhKSBmb3IgZXhlY3V0aW9uIGFmdGVyIEBkZWxheSBqaWZmaWVzIHVzaW5nCkBAIC05MjksNyArMTA5Niw3IEBACiAgKglMT0NLSU5HOgogICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgogICovCi12b2lkIGF0YV9wb3J0X3F1ZXVlX3Rhc2soc3RydWN0IGF0YV9wb3J0ICphcCwgdm9pZCAoKmZuKSh2b2lkICopLCB2b2lkICpkYXRhLAordm9pZCBhdGFfcG9ydF9xdWV1ZV90YXNrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHdvcmtfZnVuY190IGZuLCB2b2lkICpkYXRhLAogCQkJIHVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7CiAJaW50IHJjOwpAQCAtOTM3LDEyICsxMTA0LDEwIEBACiAJaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRkxVU0hfUE9SVF9UQVNLKQogCQlyZXR1cm47CiAKLQlQUkVQQVJFX1dPUksoJmFwLT5wb3J0X3Rhc2ssIGZuLCBkYXRhKTsKKwlQUkVQQVJFX0RFTEFZRURfV09SSygmYXAtPnBvcnRfdGFzaywgZm4pOworCWFwLT5wb3J0X3Rhc2tfZGF0YSA9IGRhdGE7CiAKLQlpZiAoIWRlbGF5KQotCQlyYyA9IHF1ZXVlX3dvcmsoYXRhX3dxLCAmYXAtPnBvcnRfdGFzayk7Ci0JZWxzZQotCQlyYyA9IHF1ZXVlX2RlbGF5ZWRfd29yayhhdGFfd3EsICZhcC0+cG9ydF90YXNrLCBkZWxheSk7CisJcmMgPSBxdWV1ZV9kZWxheWVkX3dvcmsoYXRhX3dxLCAmYXAtPnBvcnRfdGFzaywgZGVsYXkpOwogCiAJLyogcmMgPT0gMCBtZWFucyB0aGF0IGFub3RoZXIgdXNlciBpcyB1c2luZyBwb3J0IHRhc2sgKi8KIAlXQVJOX09OKHJjID09IDApOwpAQCAtOTk5LDEzICsxMTY0LDEzIEBACiB9CiAKIC8qKgotICoJYXRhX2V4ZWNfaW50ZXJuYWwgLSBleGVjdXRlIGxpYmF0YSBpbnRlcm5hbCBjb21tYW5kCisgKglhdGFfZXhlY19pbnRlcm5hbF9zZyAtIGV4ZWN1dGUgbGliYXRhIGludGVybmFsIGNvbW1hbmQKICAqCUBkZXY6IERldmljZSB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBzZW50CiAgKglAdGY6IFRhc2tmaWxlIHJlZ2lzdGVycyBmb3IgdGhlIGNvbW1hbmQgYW5kIHRoZSByZXN1bHQKICAqCUBjZGI6IENEQiBmb3IgcGFja2V0IGNvbW1hbmQKICAqCUBkbWFfZGlyOiBEYXRhIHRyYW5mZXIgZGlyZWN0aW9uIG9mIHRoZSBjb21tYW5kCi0gKglAYnVmOiBEYXRhIGJ1ZmZlciBvZiB0aGUgY29tbWFuZAotICoJQGJ1ZmxlbjogTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgKglAc2c6IHNnIGxpc3QgZm9yIHRoZSBkYXRhIGJ1ZmZlciBvZiB0aGUgY29tbWFuZAorICoJQG5fZWxlbTogTnVtYmVyIG9mIHNnIGVudHJpZXMKICAqCiAgKglFeGVjdXRlcyBsaWJhdGEgaW50ZXJuYWwgY29tbWFuZCB3aXRoIHRpbWVvdXQuICBAdGYgY29udGFpbnMKICAqCWNvbW1hbmQgb24gZW50cnkgYW5kIHJlc3VsdCBvbiByZXR1cm4uICBUaW1lb3V0IGFuZCBlcnJvcgpAQCAtMTAxOSw5ICsxMTg0LDEwIEBACiAgKglSRVRVUk5TOgogICoJWmVybyBvbiBzdWNjZXNzLCBBQ19FUlJfKiBtYXNrIG9uIGZhaWx1cmUKICAqLwotdW5zaWduZWQgYXRhX2V4ZWNfaW50ZXJuYWwoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCBjb25zdCB1OCAqY2RiLAotCQkJICAgaW50IGRtYV9kaXIsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3Vuc2lnbmVkIGF0YV9leGVjX2ludGVybmFsX3NnKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgY29uc3QgdTggKmNkYiwKKwkJCSAgICAgIGludCBkbWFfZGlyLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgICAgdW5zaWduZWQgaW50IG5fZWxlbSkKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5hcDsKIAl1OCBjb21tYW5kID0gdGYtPmNvbW1hbmQ7CkBAIC0xMDc3LDcgKzEyNDMsMTIgQEAKIAlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19SRVNVTFRfVEY7CiAJcWMtPmRtYV9kaXIgPSBkbWFfZGlyOwogCWlmIChkbWFfZGlyICE9IERNQV9OT05FKSB7Ci0JCWF0YV9zZ19pbml0X29uZShxYywgYnVmLCBidWZsZW4pOworCQl1bnNpZ25lZCBpbnQgaSwgYnVmbGVuID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbl9lbGVtOyBpKyspCisJCQlidWZsZW4gKz0gc2dbaV0ubGVuZ3RoOworCisJCWF0YV9zZ19pbml0KHFjLCBzZywgbl9lbGVtKTsKIAkJcWMtPm5zZWN0ID0gYnVmbGVuIC8gQVRBX1NFQ1RfU0laRTsKIAl9CiAKQEAgLTExNjEsNiArMTMzMiwzNSBAQAogfQogCiAvKioKKyAqCWF0YV9leGVjX2ludGVybmFsX3NnIC0gZXhlY3V0ZSBsaWJhdGEgaW50ZXJuYWwgY29tbWFuZAorICoJQGRldjogRGV2aWNlIHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIHNlbnQKKyAqCUB0ZjogVGFza2ZpbGUgcmVnaXN0ZXJzIGZvciB0aGUgY29tbWFuZCBhbmQgdGhlIHJlc3VsdAorICoJQGNkYjogQ0RCIGZvciBwYWNrZXQgY29tbWFuZAorICoJQGRtYV9kaXI6IERhdGEgdHJhbmZlciBkaXJlY3Rpb24gb2YgdGhlIGNvbW1hbmQKKyAqCUBidWY6IERhdGEgYnVmZmVyIG9mIHRoZSBjb21tYW5kCisgKglAYnVmbGVuOiBMZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqCisgKglXcmFwcGVyIGFyb3VuZCBhdGFfZXhlY19pbnRlcm5hbF9zZygpIHdoaWNoIHRha2VzIHNpbXBsZQorICoJYnVmZmVyIGluc3RlYWQgb2Ygc2cgbGlzdC4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4gIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBrZXJuZWwgY29udGV4dCwgbWlnaHQgc2xlZXAuCisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2VzcywgQUNfRVJSXyogbWFzayBvbiBmYWlsdXJlCisgKi8KK3Vuc2lnbmVkIGF0YV9leGVjX2ludGVybmFsKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgY29uc3QgdTggKmNkYiwKKwkJCSAgIGludCBkbWFfZGlyLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCisJc2dfaW5pdF9vbmUoJnNnLCBidWYsIGJ1Zmxlbik7CisKKwlyZXR1cm4gYXRhX2V4ZWNfaW50ZXJuYWxfc2coZGV2LCB0ZiwgY2RiLCBkbWFfZGlyLCAmc2csIDEpOworfQorCisvKioKICAqCWF0YV9kb19zaW1wbGVfY21kIC0gZXhlY3V0ZSBzaW1wbGUgaW50ZXJuYWwgY29tbWFuZAogICoJQGRldjogRGV2aWNlIHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIHNlbnQKICAqCUBjbWQ6IE9wY29kZSB0byBleGVjdXRlCkBAIC0xMjI0LDcgKzE0MjQsNyBAQAogICoJYXRhX2Rldl9yZWFkX2lkIC0gUmVhZCBJRCBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBkZXZpY2UKICAqCUBkZXY6IHRhcmdldCBkZXZpY2UKICAqCUBwX2NsYXNzOiBwb2ludGVyIHRvIGNsYXNzIG9mIHRoZSB0YXJnZXQgZGV2aWNlIChtYXkgYmUgY2hhbmdlZCkKLSAqCUBwb3N0X3Jlc2V0OiBpcyB0aGlzIHJlYWQgSUQgcG9zdC1yZXNldD8KKyAqCUBmbGFnczogQVRBX1JFQURJRF8qIGZsYWdzCiAgKglAaWQ6IGJ1ZmZlciB0byByZWFkIElERU5USUZZIGRhdGEgaW50bwogICoKICAqCVJlYWQgSUQgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgZGV2aWNlLiAgQVRBX0NNRF9JRF9BVEEgaXMKQEAgLTEyMzksNyArMTQzOSw3IEBACiAgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCiAgKi8KIGludCBhdGFfZGV2X3JlYWRfaWQoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpwX2NsYXNzLAotCQkgICAgaW50IHBvc3RfcmVzZXQsIHUxNiAqaWQpCisJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHUxNiAqaWQpCiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+YXA7CiAJdW5zaWduZWQgaW50IGNsYXNzID0gKnBfY2xhc3M7CkBAIC0xMjcxLDEwICsxNDcxLDE3IEBACiAJfQogCiAJdGYucHJvdG9jb2wgPSBBVEFfUFJPVF9QSU87CisJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX1BPTExJTkc7IC8qIGZvciBwb2xsaW5nIHByZXNlbmNlIGRldGVjdGlvbiAqLwogCiAJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX0ZST01fREVWSUNFLAogCQkJCSAgICAgaWQsIHNpemVvZihpZFswXSkgKiBBVEFfSURfV09SRFMpOwogCWlmIChlcnJfbWFzaykgeworCQlpZiAoZXJyX21hc2sgJiBBQ19FUlJfTk9ERVZfSElOVCkgeworCQkJRFBSSU5USygiYXRhJXUuJWQ6IE5PREVWIGFmdGVyIHBvbGxpbmcgZGV0ZWN0aW9uXG4iLAorCQkJCWFwLT5pZCwgZGV2LT5kZXZubyk7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCiAJCXJjID0gLUVJTzsKIAkJcmVhc29uID0gIkkvTyBlcnJvciI7CiAJCWdvdG8gZXJyX291dDsKQEAgLTEyOTQsNyArMTUwMSw3IEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JaWYgKHBvc3RfcmVzZXQgJiYgY2xhc3MgPT0gQVRBX0RFVl9BVEEpIHsKKwlpZiAoKGZsYWdzICYgQVRBX1JFQURJRF9QT1NUUkVTRVQpICYmIGNsYXNzID09IEFUQV9ERVZfQVRBKSB7CiAJCS8qCiAJCSAqIFRoZSBleGFjdCBzZXF1ZW5jZSBleHBlY3RlZCBieSBjZXJ0YWluIHByZS1BVEE0IGRyaXZlcyBpczoKIAkJICogU1JTVCBSRVNFVApAQCAtMTMxNCw3ICsxNTIxLDcgQEAKIAkJCS8qIGN1cnJlbnQgQ0hTIHRyYW5zbGF0aW9uIGluZm8gKGlkWzUzLTU4XSkgbWlnaHQgYmUKIAkJCSAqIGNoYW5nZWQuIHJlcmVhZCB0aGUgaWRlbnRpZnkgZGV2aWNlIGluZm8uCiAJCQkgKi8KLQkJCXBvc3RfcmVzZXQgPSAwOworCQkJZmxhZ3MgJj0gfkFUQV9SRUFESURfUE9TVFJFU0VUOwogCQkJZ290byByZXRyeTsKIAkJfQogCX0KQEAgLTEzNDUsNyArMTU1MiwxMCBAQAogCQlkZXNjWzBdID0gJ1wwJzsKIAkJcmV0dXJuOwogCX0KLQorCWlmIChhdGFfZGV2aWNlX2JsYWNrbGlzdGVkKGRldikgJiBBVEFfSE9SS0FHRV9OT05DUSkgeworCQlzbnByaW50ZihkZXNjLCBkZXNjX3N6LCAiTkNRIChub3QgdXNlZCkiKTsKKwkJcmV0dXJuOworCX0KIAlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTkNRKSB7CiAJCWhkZXB0aCA9IG1pbihhcC0+c2NzaV9ob3N0LT5jYW5fcXVldWUsIEFUQV9NQVhfUVVFVUUgLSAxKTsKIAkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfTkNROwpAQCAtMTM3NCw3ICsxNTg0LDYgQEAKIC8qKgogICoJYXRhX2Rldl9jb25maWd1cmUgLSBDb25maWd1cmUgdGhlIHNwZWNpZmllZCBBVEEvQVRBUEkgZGV2aWNlCiAgKglAZGV2OiBUYXJnZXQgZGV2aWNlIHRvIGNvbmZpZ3VyZQotICoJQHByaW50X2luZm86IEVuYWJsZSBkZXZpY2UgaW5mbyBwcmludG91dAogICoKICAqCUNvbmZpZ3VyZSBAZGV2IGFjY29yZGluZyB0byBAZGV2LT5pZC4gIEdlbmVyaWMgYW5kIGxvdy1sZXZlbAogICoJZHJpdmVyIHNwZWNpZmljIGZpeHVwcyBhcmUgYWxzbyBhcHBsaWVkLgpAQCAtMTM4NSw5ICsxNTk0LDEwIEBACiAgKglSRVRVUk5TOgogICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlCiAgKi8KLWludCBhdGFfZGV2X2NvbmZpZ3VyZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcHJpbnRfaW5mbykKK2ludCBhdGFfZGV2X2NvbmZpZ3VyZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOworCWludCBwcmludF9pbmZvID0gYXAtPmVoX2NvbnRleHQuaS5mbGFncyAmIEFUQV9FSElfUFJJTlRJTkZPOwogCWNvbnN0IHUxNiAqaWQgPSBkZXYtPmlkOwogCXVuc2lnbmVkIGludCB4ZmVyX21hc2s7CiAJY2hhciByZXZidWZbN107CQkvKiBYWVotOTlcMCAqLwpAQCAtMTQ1NCw2ICsxNjY0LDEwIEBACiAJCQlpZiAoYXRhX2lkX2hhc19sYmE0OChpZCkpIHsKIAkJCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19MQkE0ODsKIAkJCQlsYmFfZGVzYyA9ICJMQkE0OCI7CisKKwkJCQlpZiAoZGV2LT5uX3NlY3RvcnMgPj0gKDFVTCA8PCAyOCkgJiYKKwkJCQkgICAgYXRhX2lkX2hhc19mbHVzaF9leHQoaWQpKQorCQkJCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19GTFVTSF9FWFQ7CiAJCQl9CiAKIAkJCS8qIGNvbmZpZyBOQ1EgKi8KQEAgLTE1MzAsNiArMTc0NCwxMSBAQAogCQkJCSAgICAgICBjZGJfaW50cl9zdHJpbmcpOwogCX0KIAorCS8qIGRldGVybWluZSBtYXhfc2VjdG9ycyAqLworCWRldi0+bWF4X3NlY3RvcnMgPSBBVEFfTUFYX1NFQ1RPUlM7CisJaWYgKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBNDgpCisJCWRldi0+bWF4X3NlY3RvcnMgPSBBVEFfTUFYX1NFQ1RPUlNfTEJBNDg7CisKIAlpZiAoZGV2LT5ob3JrYWdlICYgQVRBX0hPUktBR0VfRElBR05PU1RJQykgewogCQkvKiBMZXQgdGhlIHVzZXIga25vdy4gV2UgZG9uJ3Qgd2FudCB0byBkaXNhbGxvdyBvcGVucyBmb3IKIAkJICAgcmVzY3VlIHB1cnBvc2VzLCBvciBpbiBjYXNlIHRoZSB2ZW5kb3IgaXMganVzdCBhIGJsaXRoZXJpbmcKQEAgLTE2MzEsMTEgKzE4NTAsMTQgQEAKIAkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCXJjID0gYXRhX2Rldl9yZWFkX2lkKGRldiwgJmRldi0+Y2xhc3MsIDEsIGRldi0+aWQpOworCQlyYyA9IGF0YV9kZXZfcmVhZF9pZChkZXYsICZkZXYtPmNsYXNzLCBBVEFfUkVBRElEX1BPU1RSRVNFVCwKKwkJCQkgICAgIGRldi0+aWQpOwogCQlpZiAocmMpCiAJCQlnb3RvIGZhaWw7CiAKLQkJcmMgPSBhdGFfZGV2X2NvbmZpZ3VyZShkZXYsIDEpOworCQlhcC0+ZWhfY29udGV4dC5pLmZsYWdzIHw9IEFUQV9FSElfUFJJTlRJTkZPOworCQlyYyA9IGF0YV9kZXZfY29uZmlndXJlKGRldik7CisJCWFwLT5laF9jb250ZXh0LmkuZmxhZ3MgJj0gfkFUQV9FSElfUFJJTlRJTkZPOwogCQlpZiAocmMpCiAJCQlnb3RvIGZhaWw7CiAJfQpAQCAtMjA4MSw3ICsyMzAzLDcgQEAKIAkgKiBETUEgY3ljbGUgdGltaW5nIGlzIHNsb3dlci9lcXVhbCB0aGFuIHRoZSBmYXN0ZXN0IFBJTyB0aW1pbmcuCiAJICovCiAKLQlpZiAoc3BlZWQgPiBYRkVSX1BJT180KSB7CisJaWYgKHNwZWVkID4gWEZFUl9QSU9fNikgewogCQlhdGFfdGltaW5nX2NvbXB1dGUoYWRldiwgYWRldi0+cGlvX21vZGUsICZwLCBULCBVVCk7CiAJCWF0YV90aW1pbmdfbWVyZ2UoJnAsIHQsIHQsIEFUQV9USU1JTkdfQUxMKTsKIAl9CkBAIC0yMTUzLDYgKzIzNzUsNyBAQAogCiBzdGF0aWMgaW50IGF0YV9kZXZfc2V0X21vZGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYyA9ICZkZXYtPmFwLT5laF9jb250ZXh0OwogCXVuc2lnbmVkIGludCBlcnJfbWFzazsKIAlpbnQgcmM7CiAKQEAgLTIxNjcsNyArMjM5MCw5IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAorCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX1BPU1RfU0VUTU9ERTsKIAlyYyA9IGF0YV9kZXZfcmV2YWxpZGF0ZShkZXYsIDApOworCWVoYy0+aS5mbGFncyAmPSB+QVRBX0VISV9QT1NUX1NFVE1PREU7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTIzMjUsMTEgKzI1NTAsMTQgQEAKICAqCVNsZWVwIHVudGlsIEFUQSBTdGF0dXMgcmVnaXN0ZXIgYml0IEJTWSBjbGVhcnMsCiAgKglvciBhIHRpbWVvdXQgb2NjdXJzLgogICoKLSAqCUxPQ0tJTkc6IE5vbmUuCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCiAgKi8KLQotdW5zaWduZWQgaW50IGF0YV9idXN5X3NsZWVwIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHRtb3V0X3BhdCwgdW5zaWduZWQgbG9uZyB0bW91dCkKK2ludCBhdGFfYnVzeV9zbGVlcChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkgICB1bnNpZ25lZCBsb25nIHRtb3V0X3BhdCwgdW5zaWduZWQgbG9uZyB0bW91dCkKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXJ0LCB0aW1lb3V0OwogCXU4IHN0YXR1czsKQEAgLTIzMzcsMjcgKzI1NjUsMzIgQEAKIAlzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMzAwKTsKIAl0aW1lcl9zdGFydCA9IGppZmZpZXM7CiAJdGltZW91dCA9IHRpbWVyX3N0YXJ0ICsgdG1vdXRfcGF0OwotCXdoaWxlICgoc3RhdHVzICYgQVRBX0JVU1kpICYmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkpIHsKKwl3aGlsZSAoc3RhdHVzICE9IDB4ZmYgJiYgKHN0YXR1cyAmIEFUQV9CVVNZKSAmJgorCSAgICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoNTApOwogCQlzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMyk7CiAJfQogCi0JaWYgKHN0YXR1cyAmIEFUQV9CVVNZKQorCWlmIChzdGF0dXMgIT0gMHhmZiAmJiAoc3RhdHVzICYgQVRBX0JVU1kpKQogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywKIAkJCQkicG9ydCBpcyBzbG93IHRvIHJlc3BvbmQsIHBsZWFzZSBiZSBwYXRpZW50ICIKIAkJCQkiKFN0YXR1cyAweCV4KVxuIiwgc3RhdHVzKTsKIAogCXRpbWVvdXQgPSB0aW1lcl9zdGFydCArIHRtb3V0OwotCXdoaWxlICgoc3RhdHVzICYgQVRBX0JVU1kpICYmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkpIHsKKwl3aGlsZSAoc3RhdHVzICE9IDB4ZmYgJiYgKHN0YXR1cyAmIEFUQV9CVVNZKSAmJgorCSAgICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoNTApOwogCQlzdGF0dXMgPSBhdGFfY2hrX3N0YXR1cyhhcCk7CiAJfQogCisJaWYgKHN0YXR1cyA9PSAweGZmKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkgewogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAicG9ydCBmYWlsZWQgdG8gcmVzcG9uZCAiCiAJCQkJIiglbHUgc2VjcywgU3RhdHVzIDB4JXgpXG4iLAogCQkJCXRtb3V0IC8gSFosIHN0YXR1cyk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjQ0OCwxMCArMjY4MSw4IEBACiAJICogdGhlIGJ1cyBzaG93cyAweEZGIGJlY2F1c2UgdGhlIG9kZCBjbG93biBmb3JnZXRzIHRoZSBENwogCSAqIHB1bGxkb3duIHJlc2lzdG9yLgogCSAqLwotCWlmIChhdGFfY2hlY2tfc3RhdHVzKGFwKSA9PSAweEZGKSB7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJTUlNUIGZhaWxlZCAoc3RhdHVzIDB4RkYpXG4iKTsKLQkJcmV0dXJuIEFDX0VSUl9PVEhFUjsKLQl9CisJaWYgKGF0YV9jaGVja19zdGF0dXMoYXApID09IDB4RkYpCisJCXJldHVybiAwOwogCiAJYXRhX2J1c19wb3N0X3Jlc2V0KGFwLCBkZXZtYXNrKTsKIApAQCAtMjc3Nyw5ICszMDA4LDkgQEAKIH0KIAogLyoqCi0gKglzYXRhX3N0ZF9oYXJkcmVzZXQgLSByZXNldCBob3N0IHBvcnQgdmlhIFNBVEEgcGh5IHJlc2V0CisgKglzYXRhX3BvcnRfaGFyZHJlc2V0IC0gcmVzZXQgcG9ydCB2aWEgU0FUQSBwaHkgcmVzZXQKICAqCUBhcDogcG9ydCB0byByZXNldAotICoJQGNsYXNzOiByZXN1bHRpbmcgY2xhc3Mgb2YgYXR0YWNoZWQgZGV2aWNlCisgKglAdGltaW5nOiB0aW1pbmcgcGFyYW1ldGVycyB7IGludGVydmFsLCBkdXJhdGlub24sIHRpbWVvdXQgfSBpbiBtc2VjCiAgKgogICoJU0FUQSBwaHktcmVzZXQgaG9zdCBwb3J0IHVzaW5nIERFVCBiaXRzIG9mIFNDb250cm9sIHJlZ2lzdGVyLgogICoKQEAgLTI3ODksMTAgKzMwMjAsOCBAQAogICoJUkVUVVJOUzoKICAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KICAqLwotaW50IHNhdGFfc3RkX2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQoraW50IHNhdGFfcG9ydF9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3QgdW5zaWduZWQgbG9uZyAqdGltaW5nKQogewotCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmFwLT5laF9jb250ZXh0OwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRpbWluZyA9IHNhdGFfZWhjX2RlYl90aW1pbmcoZWhjKTsKIAl1MzIgc2NvbnRyb2w7CiAJaW50IHJjOwogCkBAIC0yODA1LDI0ICszMDM0LDI0IEBACiAJCSAqIGFuZCBTaWwzMTI0LgogCQkgKi8KIAkJaWYgKChyYyA9IHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpKSkKLQkJCXJldHVybiByYzsKKwkJCWdvdG8gb3V0OwogCiAJCXNjb250cm9sID0gKHNjb250cm9sICYgMHgwZjApIHwgMHgzMDQ7CiAKIAkJaWYgKChyYyA9IHNhdGFfc2NyX3dyaXRlKGFwLCBTQ1JfQ09OVFJPTCwgc2NvbnRyb2wpKSkKLQkJCXJldHVybiByYzsKKwkJCWdvdG8gb3V0OwogCiAJCXNhdGFfc2V0X3NwZChhcCk7CiAJfQogCiAJLyogaXNzdWUgcGh5IHdha2UvcmVzZXQgKi8KIAlpZiAoKHJjID0gc2F0YV9zY3JfcmVhZChhcCwgU0NSX0NPTlRST0wsICZzY29udHJvbCkpKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gb3V0OwogCiAJc2NvbnRyb2wgPSAoc2NvbnRyb2wgJiAweDBmMCkgfCAweDMwMTsKIAogCWlmICgocmMgPSBzYXRhX3Njcl93cml0ZV9mbHVzaChhcCwgU0NSX0NPTlRST0wsIHNjb250cm9sKSkpCi0JCXJldHVybiByYzsKKwkJZ290byBvdXQ7CiAKIAkvKiBDb3VsZG4ndCBmaW5kIGFueXRoaW5nIGluIFNBVEEgSS9JSSBzcGVjcywgYnV0IEFIQ0ktMS4xCiAJICogMTAuNC4yIHNheXMgYXQgbGVhc3QgMSBtcy4KQEAgLTI4MzAsNyArMzA1OSw0MCBAQAogCW1zbGVlcCgxKTsKIAogCS8qIGJyaW5nIHBoeSBiYWNrICovCi0Jc2F0YV9waHlfcmVzdW1lKGFwLCB0aW1pbmcpOworCXJjID0gc2F0YV9waHlfcmVzdW1lKGFwLCB0aW1pbmcpOworIG91dDoKKwlEUFJJTlRLKCJFWElULCByYz0lZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyoqCisgKglzYXRhX3N0ZF9oYXJkcmVzZXQgLSByZXNldCBob3N0IHBvcnQgdmlhIFNBVEEgcGh5IHJlc2V0CisgKglAYXA6IHBvcnQgdG8gcmVzZXQKKyAqCUBjbGFzczogcmVzdWx0aW5nIGNsYXNzIG9mIGF0dGFjaGVkIGRldmljZQorICoKKyAqCVNBVEEgcGh5LXJlc2V0IGhvc3QgcG9ydCB1c2luZyBERVQgYml0cyBvZiBTQ29udHJvbCByZWdpc3RlciwKKyAqCXdhaXQgZm9yICFCU1kgYW5kIGNsYXNzaWZ5IHRoZSBhdHRhY2hlZCBkZXZpY2UuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKQorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCisgKi8KK2ludCBzYXRhX3N0ZF9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzcykKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICp0aW1pbmcgPSBzYXRhX2VoY19kZWJfdGltaW5nKCZhcC0+ZWhfY29udGV4dCk7CisJaW50IHJjOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJLyogZG8gaGFyZHJlc2V0ICovCisJcmMgPSBzYXRhX3BvcnRfaGFyZHJlc2V0KGFwLCB0aW1pbmcpOworCWlmIChyYykgeworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAorCQkJCSJDT01SRVNFVCBmYWlsZWQgKGVycm5vPSVkKVxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQogCiAJLyogVE9ETzogcGh5IGxheWVyIHdpdGggcG9sbGluZywgdGltZW91dHMsIGV0Yy4gKi8KIAlpZiAoYXRhX3BvcnRfb2ZmbGluZShhcCkpIHsKQEAgLTI5NjksNyArMzIzMSw3IEBACiAvKioKICAqCWF0YV9kZXZfcmV2YWxpZGF0ZSAtIFJldmFsaWRhdGUgQVRBIGRldmljZQogICoJQGRldjogZGV2aWNlIHRvIHJldmFsaWRhdGUKLSAqCUBwb3N0X3Jlc2V0OiBpcyB0aGlzIHJldmFsaWRhdGlvbiBhZnRlciByZXNldD8KKyAqCUByZWFkaWRfZmxhZ3M6IHJlYWQgSUQgZmxhZ3MKICAqCiAgKglSZS1yZWFkIElERU5USUZZIHBhZ2UgYW5kIG1ha2Ugc3VyZSBAZGV2IGlzIHN0aWxsIGF0dGFjaGVkIHRvCiAgKgl0aGUgcG9ydC4KQEAgLTI5ODAsNyArMzI0Miw3IEBACiAgKglSRVRVUk5TOgogICoJMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKICAqLwotaW50IGF0YV9kZXZfcmV2YWxpZGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcG9zdF9yZXNldCkKK2ludCBhdGFfZGV2X3JldmFsaWRhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlYWRpZF9mbGFncykKIHsKIAl1bnNpZ25lZCBpbnQgY2xhc3MgPSBkZXYtPmNsYXNzOwogCXUxNiAqaWQgPSAodm9pZCAqKWRldi0+YXAtPnNlY3Rvcl9idWY7CkBAIC0yOTkyLDcgKzMyNTQsNyBAQAogCX0KIAogCS8qIHJlYWQgSUQgZGF0YSAqLwotCXJjID0gYXRhX2Rldl9yZWFkX2lkKGRldiwgJmNsYXNzLCBwb3N0X3Jlc2V0LCBpZCk7CisJcmMgPSBhdGFfZGV2X3JlYWRfaWQoZGV2LCAmY2xhc3MsIHJlYWRpZF9mbGFncywgaWQpOwogCWlmIChyYykKIAkJZ290byBmYWlsOwogCkBAIC0zMDA1LDcgKzMyNjcsNyBAQAogCW1lbWNweShkZXYtPmlkLCBpZCwgc2l6ZW9mKGlkWzBdKSAqIEFUQV9JRF9XT1JEUyk7CiAKIAkvKiBjb25maWd1cmUgZGV2aWNlIGFjY29yZGluZyB0byB0aGUgbmV3IElEICovCi0JcmMgPSBhdGFfZGV2X2NvbmZpZ3VyZShkZXYsIDApOworCXJjID0gYXRhX2Rldl9jb25maWd1cmUoZGV2KTsKIAlpZiAocmMgPT0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTMwMTQsMzcgKzMyNzYsNTUgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRhX2RtYV9ibGFja2xpc3QgW10gPSB7Ci0JIldEQyBBQzExMDAwSCIsIE5VTEwsCi0JIldEQyBBQzIyMTAwSCIsIE5VTEwsCi0JIldEQyBBQzMyNTAwSCIsIE5VTEwsCi0JIldEQyBBQzMzMTAwSCIsIE5VTEwsCi0JIldEQyBBQzMxNjAwSCIsIE5VTEwsCi0JIldEQyBBQzMyMTAwSCIsICIyNC4wOVAwNyIsCi0JIldEQyBBQzIzMjAwTCIsICIyMS4xME4yMSIsCi0JIkNvbXBhcSBDUkQtODI0MUIiLCAgTlVMTCwKLQkiQ1JELTg0MDBCIiwgTlVMTCwKLQkiQ1JELTg0ODBCIiwgTlVMTCwKLQkiQ1JELTg0ODJCIiwgTlVMTCwKLSAJIkNSRC04NCIsIE5VTEwsCi0JIlNhbkRpc2sgU0RQM0IiLCBOVUxMLAotCSJTYW5EaXNrIFNEUDNCLTY0IiwgTlVMTCwKLQkiU0FOWU8gQ0QtUk9NIENSRCIsIE5VTEwsCi0JIkhJVEFDSEkgQ0RSLTgiLCBOVUxMLAotCSJISVRBQ0hJIENEUi04MzM1IiwgTlVMTCwKLQkiSElUQUNISSBDRFItODQzNSIsIE5VTEwsCi0JIlRvc2hpYmEgQ0QtUk9NIFhNLTYyMDJCIiwgTlVMTCwKLQkiVE9TSElCQSBDRC1ST00gWE0tMTcwMkJDIiwgTlVMTCwKLQkiQ0QtNTMyRS1BIiwgTlVMTCwKLQkiRS1JREUgQ0QtUk9NIENSLTg0MCIsIE5VTEwsCi0JIkNELVJPTSBEcml2ZS9GNUEiLCBOVUxMLAotCSJXUEkgQ0RELTgyMCIsIE5VTEwsCi0JIlNBTVNVTkcgQ0QtUk9NIFNDLTE0OEMiLCBOVUxMLAotCSJTQU1TVU5HIENELVJPTSBTQyIsIE5VTEwsCi0JIlNhbkRpc2sgU0RQM0ItNjQiLCBOVUxMLAotCSJBVEFQSSBDRC1ST00gRFJJVkUgNDBYIE1BWElNVU0iLE5VTEwsCi0JIl9ORUMgRFY1ODAwQSIsIE5VTEwsCi0JIlNBTVNVTkcgQ0QtUk9NIFNOLTEyNCIsICJOMDAxIgorc3RydWN0IGF0YV9ibGFja2xpc3RfZW50cnkgeworCWNvbnN0IGNoYXIgKm1vZGVsX251bTsKKwljb25zdCBjaGFyICptb2RlbF9yZXY7CisJdW5zaWduZWQgbG9uZyBob3JrYWdlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfYmxhY2tsaXN0X2VudHJ5IGF0YV9kZXZpY2VfYmxhY2tsaXN0IFtdID0geworCS8qIERldmljZXMgd2l0aCBETUEgcmVsYXRlZCBwcm9ibGVtcyB1bmRlciBMaW51eCAqLworCXsgIldEQyBBQzExMDAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzIyMTAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzMyNTAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzMzMTAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzMxNjAwSCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIldEQyBBQzMyMTAwSCIsCSIyNC4wOVAwNyIsCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiV0RDIEFDMjMyMDBMIiwJIjIxLjEwTjIxIiwJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJDb21wYXEgQ1JELTgyNDFCIiwgCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIkNSRC04NDAwQiIsCQlOVUxMLCAJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiQ1JELTg0ODBCIiwJCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIkNSRC04NDgyQiIsCQlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJDUkQtODQiLAkJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiU2FuRGlzayBTRFAzQiIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIlNhbkRpc2sgU0RQM0ItNjQiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJTQU5ZTyBDRC1ST00gQ1JEIiwJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiSElUQUNISSBDRFItOCIsCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIkhJVEFDSEkgQ0RSLTgzMzUiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJISVRBQ0hJIENEUi04NDM1IiwJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiVG9zaGliYSBDRC1ST00gWE0tNjIwMkIiLCBOVUxMLAlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIlRPU0hJQkEgQ0QtUk9NIFhNLTE3MDJCQyIsIE5VTEwsCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiQ0QtNTMyRS1BIiwgCQlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJFLUlERSBDRC1ST00gQ1ItODQwIixOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJDRC1ST00gRHJpdmUvRjVBIiwJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiV1BJIENERC04MjAiLCAJTlVMTCwJCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiU0FNU1VORyBDRC1ST00gU0MtMTQ4QyIsIE5VTEwsCUFUQV9IT1JLQUdFX05PRE1BIH0sCisJeyAiU0FNU1VORyBDRC1ST00gU0MiLAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJTYW5EaXNrIFNEUDNCLTY0IiwgCU5VTEwsCQlBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIkFUQVBJIENELVJPTSBEUklWRSA0MFggTUFYSU1VTSIsTlVMTCxBVEFfSE9SS0FHRV9OT0RNQSB9LAorCXsgIl9ORUMgRFY1ODAwQSIsIAlOVUxMLAkJQVRBX0hPUktBR0VfTk9ETUEgfSwKKwl7ICJTQU1TVU5HIENELVJPTSBTTi0xMjQiLCJOMDAxIiwJQVRBX0hPUktBR0VfTk9ETUEgfSwKKworCS8qIERldmljZXMgd2UgZXhwZWN0IHRvIGZhaWwgZGlhZ25vc3RpY3MgKi8KKworCS8qIERldmljZXMgd2hlcmUgTkNRIHNob3VsZCBiZSBhdm9pZGVkICovCisJLyogTkNRIGlzIHNsb3cgKi8KKyAgICAgICAgeyAiV0RDIFdENzQwQURGRC0wMCIsICAgTlVMTCwJCUFUQV9IT1JLQUdFX05PTkNRIH0sCisKKwkvKiBEZXZpY2VzIHdpdGggTkNRIGxpbWl0cyAqLworCisJLyogRW5kIE1hcmtlciAqLworCXsgfQogfTsKIAogc3RhdGljIGludCBhdGFfc3RyaW0oY2hhciAqcywgc2l6ZV90IGxlbikKQEAgLTMwNTksMjAgKzMzMzksMTIgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGF0YV9kbWFfYmxhY2tsaXN0ZWQoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3Vuc2lnbmVkIGxvbmcgYXRhX2RldmljZV9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtWzQwXTsKIAl1bnNpZ25lZCBjaGFyIG1vZGVsX3JldlsxNl07CiAJdW5zaWduZWQgaW50IG5sZW4sIHJsZW47Ci0JaW50IGk7Ci0KLQkvKiBXZSBkb24ndCBzdXBwb3J0IHBvbGxpbmcgRE1BLgotCSAqIERNQSBibGFja2xpc3QgdGhvc2UgQVRBUEkgZGV2aWNlcyB3aXRoIENEQi1pbnRyIChhbmQgdXNlIFBJTykKLQkgKiBpZiB0aGUgTExERCBoYW5kbGVzIG9ubHkgaW50ZXJydXB0cyBpbiB0aGUgSFNNX1NUX0xBU1Qgc3RhdGUuCi0JICovCi0JaWYgKChkZXYtPmFwLT5mbGFncyAmIEFUQV9GTEFHX1BJT19QT0xMSU5HKSAmJgotCSAgICAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19DREJfSU5UUikpCi0JCXJldHVybiAxOworCWNvbnN0IHN0cnVjdCBhdGFfYmxhY2tsaXN0X2VudHJ5ICphZCA9IGF0YV9kZXZpY2VfYmxhY2tsaXN0OwogCiAJYXRhX2lkX3N0cmluZyhkZXYtPmlkLCBtb2RlbF9udW0sIEFUQV9JRF9QUk9EX09GUywKIAkJCSAgc2l6ZW9mKG1vZGVsX251bSkpOwpAQCAtMzA4MSwxNyArMzM1MywzMCBAQAogCW5sZW4gPSBhdGFfc3RyaW0obW9kZWxfbnVtLCBzaXplb2YobW9kZWxfbnVtKSk7CiAJcmxlbiA9IGF0YV9zdHJpbShtb2RlbF9yZXYsIHNpemVvZihtb2RlbF9yZXYpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0YV9kbWFfYmxhY2tsaXN0KTsgaSArPSAyKSB7Ci0JCWlmICghc3RybmNtcChhdGFfZG1hX2JsYWNrbGlzdFtpXSwgbW9kZWxfbnVtLCBubGVuKSkgewotCQkJaWYgKGF0YV9kbWFfYmxhY2tsaXN0W2krMV0gPT0gTlVMTCkKLQkJCQlyZXR1cm4gMTsKLQkJCWlmICghc3RybmNtcChhdGFfZG1hX2JsYWNrbGlzdFtpXSwgbW9kZWxfcmV2LCBybGVuKSkKLQkJCQlyZXR1cm4gMTsKKwl3aGlsZSAoYWQtPm1vZGVsX251bSkgeworCQlpZiAoIXN0cm5jbXAoYWQtPm1vZGVsX251bSwgbW9kZWxfbnVtLCBubGVuKSkgeworCQkJaWYgKGFkLT5tb2RlbF9yZXYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gYWQtPmhvcmthZ2U7CisJCQlpZiAoIXN0cm5jbXAoYWQtPm1vZGVsX3JldiwgbW9kZWxfcmV2LCBybGVuKSkKKwkJCQlyZXR1cm4gYWQtPmhvcmthZ2U7CiAJCX0KKwkJYWQrKzsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXRhX2RtYV9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCS8qIFdlIGRvbid0IHN1cHBvcnQgcG9sbGluZyBETUEuCisJICogRE1BIGJsYWNrbGlzdCB0aG9zZSBBVEFQSSBkZXZpY2VzIHdpdGggQ0RCLWludHIgKGFuZCB1c2UgUElPKQorCSAqIGlmIHRoZSBMTEREIGhhbmRsZXMgb25seSBpbnRlcnJ1cHRzIGluIHRoZSBIU01fU1RfTEFTVCBzdGF0ZS4KKwkgKi8KKwlpZiAoKGRldi0+YXAtPmZsYWdzICYgQVRBX0ZMQUdfUElPX1BPTExJTkcpICYmCisJICAgIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0NEQl9JTlRSKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIChhdGFfZGV2aWNlX2JsYWNrbGlzdGVkKGRldikgJiBBVEFfSE9SS0FHRV9OT0RNQSkgPyAxIDogMDsKK30KKwogLyoqCiAgKglhdGFfZGV2X3hmZXJtYXNrIC0gQ29tcHV0ZSBzdXBwb3J0ZWQgeGZlcm1hc2sgb2YgdGhlIGdpdmVuIGRldmljZQogICoJQGRldjogRGV2aWNlIHRvIGNvbXB1dGUgeGZlcm1hc2sgZm9yCkBAIC0zMTE5LDYgKzM0MDQsMTMgQEAKIAkgKi8KIAlpZiAoYXAtPmNibCA9PSBBVEFfQ0JMX1BBVEE0MCkKIAkJeGZlcl9tYXNrICY9IH4oMHhGOCA8PCBBVEFfU0hJRlRfVURNQSk7CisJLyogQXBwbHkgZHJpdmUgc2lkZSBjYWJsZSBydWxlLiBVbmtub3duIG9yIDgwIHBpbiBjYWJsZXMgcmVwb3J0ZWQKKwkgKiBob3N0IHNpZGUgYXJlIGNoZWNrZWQgZHJpdmUgc2lkZSBhcyB3ZWxsLiBDYXNlcyB3aGVyZSB3ZSBrbm93IGEKKwkgKiA0MHdpcmUgY2FibGUgaXMgdXNlZCBzYWZlbHkgZm9yIDgwIGFyZSBub3QgY2hlY2tlZCBoZXJlLgorCSAqLworICAgICAgICBpZiAoYXRhX2RyaXZlXzQwd2lyZShkZXYtPmlkKSAmJiAoYXAtPmNibCA9PSBBVEFfQ0JMX1BBVEFfVU5LIHx8IGFwLT5jYmwgPT0gQVRBX0NCTF9QQVRBODApKQorCQl4ZmVyX21hc2sgJj0gfigweEY4IDw8IEFUQV9TSElGVF9VRE1BKTsKKwogCiAJeGZlcl9tYXNrICY9IGF0YV9wYWNrX3hmZXJtYXNrKGRldi0+cGlvX21hc2ssCiAJCQkJICAgICAgIGRldi0+bXdkbWFfbWFzaywgZGV2LT51ZG1hX21hc2spOwpAQCAtMzIzNiw4ICszNTI4LDcgQEAKICAqCUxPQ0tJTkc6CiAgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0IGxvY2spCiAgKi8KLQotc3RhdGljIHZvaWQgYXRhX3NnX2NsZWFuKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit2b2lkIGF0YV9zZ19jbGVhbihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5fX3NnOwpAQCAtMzM5NSwxOSArMzY4NiwxNSBAQAogCiB2b2lkIGF0YV9zZ19pbml0X29uZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pCiB7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQogCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX1NJTkdMRTsKIAotCW1lbXNldCgmcWMtPnNnZW50LCAwLCBzaXplb2YocWMtPnNnZW50KSk7CiAJcWMtPl9fc2cgPSAmcWMtPnNnZW50OwogCXFjLT5uX2VsZW0gPSAxOwogCXFjLT5vcmlnX25fZWxlbSA9IDE7CiAJcWMtPmJ1Zl92aXJ0ID0gYnVmOwogCXFjLT5uYnl0ZXMgPSBidWZsZW47CiAKLQlzZyA9IHFjLT5fX3NnOwotCXNnX2luaXRfb25lKHNnLCBidWYsIGJ1Zmxlbik7CisJc2dfaW5pdF9vbmUoJnFjLT5zZ2VudCwgYnVmLCBidWZsZW4pOwogfQogCiAvKioKQEAgLTQyMDAsOCArNDQ4NywxMiBAQAogCQkJCQkvKiBkZXZpY2Ugc3RvcHMgSFNNIGZvciBhYm9ydC9lcnJvciAqLwogCQkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0RFVjsKIAkJCQllbHNlCi0JCQkJCS8qIEhTTSB2aW9sYXRpb24uIExldCBFSCBoYW5kbGUgdGhpcyAqLwotCQkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0hTTTsKKwkJCQkJLyogSFNNIHZpb2xhdGlvbi4gTGV0IEVIIGhhbmRsZSB0aGlzLgorCQkJCQkgKiBQaGFudG9tIGRldmljZXMgYWxzbyB0cmlnZ2VyIHRoaXMKKwkJCQkJICogY29uZGl0aW9uLiAgTWFyayBoaW50LgorCQkJCQkgKi8KKwkJCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9IU00gfAorCQkJCQkJCUFDX0VSUl9OT0RFVl9ISU5UOwogCiAJCQkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0VSUjsKIAkJCQlnb3RvIGZzbV9zdGFydDsKQEAgLTQyOTUsMTAgKzQ1ODYsMTEgQEAKIAlyZXR1cm4gcG9sbF9uZXh0OwogfQogCi1zdGF0aWMgdm9pZCBhdGFfcGlvX3Rhc2sodm9pZCAqX2RhdGEpCitzdGF0aWMgdm9pZCBhdGFfcGlvX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBfZGF0YTsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0YV9wb3J0LCBwb3J0X3Rhc2sud29yayk7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IGFwLT5wb3J0X3Rhc2tfZGF0YTsKIAl1OCBzdGF0dXM7CiAJaW50IHBvbGxfbmV4dDsKIApAQCAtNDQ0MCw2ICs0NzMyLDE0IEBACiAJcWMtPmNvbXBsZXRlX2ZuKHFjKTsKIH0KIAorc3RhdGljIHZvaWQgZmlsbF9yZXN1bHRfdGYoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCisJYXAtPm9wcy0+dGZfcmVhZChhcCwgJnFjLT5yZXN1bHRfdGYpOworCXFjLT5yZXN1bHRfdGYuZmxhZ3MgPSBxYy0+dGYuZmxhZ3M7Cit9CisKIC8qKgogICoJYXRhX3FjX2NvbXBsZXRlIC0gQ29tcGxldGUgYW4gYWN0aXZlIEFUQSBjb21tYW5kCiAgKglAcWM6IENvbW1hbmQgdG8gY29tcGxldGUKQEAgLTQ0NzcsNyArNDc3Nyw3IEBACiAJCWlmICh1bmxpa2VseShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkpIHsKIAkJCWlmICghYXRhX3RhZ19pbnRlcm5hbChxYy0+dGFnKSkgewogCQkJCS8qIGFsd2F5cyBmaWxsIHJlc3VsdCBURiBmb3IgZmFpbGVkIHFjICovCi0JCQkJYXAtPm9wcy0+dGZfcmVhZChhcCwgJnFjLT5yZXN1bHRfdGYpOworCQkJCWZpbGxfcmVzdWx0X3RmKHFjKTsKIAkJCQlhdGFfcWNfc2NoZWR1bGVfZWgocWMpOwogCQkJCXJldHVybjsKIAkJCX0KQEAgLTQ0ODUsNyArNDc4NSw3IEBACiAKIAkJLyogcmVhZCByZXN1bHQgVEYgaWYgcmVxdWVzdGVkICovCiAJCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1JFU1VMVF9URikKLQkJCWFwLT5vcHMtPnRmX3JlYWQoYXAsICZxYy0+cmVzdWx0X3RmKTsKKwkJCWZpbGxfcmVzdWx0X3RmKHFjKTsKIAogCQlfX2F0YV9xY19jb21wbGV0ZShxYyk7CiAJfSBlbHNlIHsKQEAgLTQ0OTQsNyArNDc5NCw3IEBACiAKIAkJLyogcmVhZCByZXN1bHQgVEYgaWYgZmFpbGVkIG9yIHJlcXVlc3RlZCAqLwogCQlpZiAocWMtPmVycl9tYXNrIHx8IHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfUkVTVUxUX1RGKQotCQkJYXAtPm9wcy0+dGZfcmVhZChhcCwgJnFjLT5yZXN1bHRfdGYpOworCQkJZmlsbF9yZXN1bHRfdGYocWMpOwogCiAJCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKIAl9CkBAIC00NjYwLDYgKzQ5NjAsNyBAQAogCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QSU9fUE9MTElORykgewogCQlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgewogCQljYXNlIEFUQV9QUk9UX1BJTzoKKwkJY2FzZSBBVEFfUFJPVF9OT0RBVEE6CiAJCWNhc2UgQVRBX1BST1RfQVRBUEk6CiAJCWNhc2UgQVRBX1BST1RfQVRBUElfTk9EQVRBOgogCQkJcWMtPnRmLmZsYWdzIHw9IEFUQV9URkxBR19QT0xMSU5HOwpAQCAtNDY3NCw2ICs0OTc1LDE0IEBACiAJCX0KIAl9CiAKKwkvKiBTb21lIGNvbnRyb2xsZXJzIHNob3cgZmxha3kgaW50ZXJydXB0IGJlaGF2aW9yIGFmdGVyCisJICogc2V0dGluZyB4ZmVyIG1vZGUuICBVc2UgcG9sbGluZyBpbnN0ZWFkLgorCSAqLworCWlmICh1bmxpa2VseShxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX1NFVF9GRUFUVVJFUyAmJgorCQkgICAgIHFjLT50Zi5mZWF0dXJlID09IFNFVEZFQVRVUkVTX1hGRVIpICYmCisJICAgIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TRVRYRkVSX1BPTExJTkcpKQorCQlxYy0+dGYuZmxhZ3MgfD0gQVRBX1RGTEFHX1BPTExJTkc7CisKIAkvKiBzZWxlY3QgdGhlIGRldmljZSAqLwogCWF0YV9kZXZfc2VsZWN0KGFwLCBxYy0+ZGV2LT5kZXZubywgMSwgMCk7CiAKQEAgLTQ3ODIsNiArNTA5MSw3IEBACiBpbmxpbmUgdW5zaWduZWQgaW50IGF0YV9ob3N0X2ludHIgKHN0cnVjdCBhdGFfcG9ydCAqYXAsCiAJCQkJICAgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKKwlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+ZWhfaW5mbzsKIAl1OCBzdGF0dXMsIGhvc3Rfc3RhdCA9IDA7CiAKIAlWUFJJTlRLKCJhdGEldTogcHJvdG9jb2wgJWQgdGFza19zdGF0ZSAlZFxuIiwKQEAgLTQ4NDIsNiArNTE1MiwxMSBAQAogCWFwLT5vcHMtPmlycV9jbGVhcihhcCk7CiAKIAlhdGFfaHNtX21vdmUoYXAsIHFjLCBzdGF0dXMsIDApOworCisJaWYgKHVubGlrZWx5KHFjLT5lcnJfbWFzaykgJiYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEgfHwKKwkJCQkgICAgICAgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkpCisJCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgIkJNRE1BIHN0YXQgMHgleCIsIGhvc3Rfc3RhdCk7CisKIAlyZXR1cm4gMTsJLyogaXJxIGhhbmRsZWQgKi8KIAogaWRsZV9pcnE6CkBAIC01MDQ4LDcgKzUzNjMsNyBAQAogCWlmICghYXRhX3RyeV9mbHVzaF9jYWNoZShkZXYpKQogCQlyZXR1cm4gMDsKIAotCWlmIChhdGFfaWRfaGFzX2ZsdXNoX2V4dChkZXYtPmlkKSkKKwlpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19GTFVTSF9FWFQpCiAJCWNtZCA9IEFUQV9DTURfRkxVU0hfRVhUOwogCWVsc2UKIAkJY21kID0gQVRBX0NNRF9GTFVTSDsKQEAgLTUzMjAsOSArNTYzNSw5IEBACiAJYXAtPm1zZ19lbmFibGUgPSBBVEFfTVNHX0RSViB8IEFUQV9NU0dfRVJSIHwgQVRBX01TR19XQVJOOwogI2VuZGlmCiAKLQlJTklUX1dPUksoJmFwLT5wb3J0X3Rhc2ssIE5VTEwsIE5VTEwpOwotCUlOSVRfV09SSygmYXAtPmhvdHBsdWdfdGFzaywgYXRhX3Njc2lfaG90cGx1ZywgYXApOwotCUlOSVRfV09SSygmYXAtPnNjc2lfcmVzY2FuX3Rhc2ssIGF0YV9zY3NpX2Rldl9yZXNjYW4sIGFwKTsKKwlJTklUX0RFTEFZRURfV09SSygmYXAtPnBvcnRfdGFzaywgTlVMTCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmFwLT5ob3RwbHVnX3Rhc2ssIGF0YV9zY3NpX2hvdHBsdWcpOworCUlOSVRfV09SSygmYXAtPnNjc2lfcmVzY2FuX3Rhc2ssIGF0YV9zY3NpX2Rldl9yZXNjYW4pOwogCUlOSVRfTElTVF9IRUFEKCZhcC0+ZWhfZG9uZV9xKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhcC0+ZWhfd2FpdF9xKTsKIApAQCAtNTUyMCw5ICs1ODM1LDggQEAKIAkJCQlhcC0+aW9hZGRyLmJtZG1hX2FkZHIsCiAJCQkJaXJxX2xpbmUpOwogCi0JCWF0YV9jaGtfc3RhdHVzKGFwKTsKLQkJaG9zdC0+b3BzLT5pcnFfY2xlYXIoYXApOwotCQlhdGFfZWhfZnJlZXplX3BvcnQoYXApOwkvKiBmcmVlemUgcG9ydCBiZWZvcmUgcmVxdWVzdGluZyBJUlEgKi8KKwkJLyogZnJlZXplIHBvcnQgYmVmb3JlIHJlcXVlc3RpbmcgSVJRICovCisJCWF0YV9laF9mcmVlemVfcG9ydChhcCk7CiAJfQogCiAJLyogb2J0YWluIGlycSwgdGhhdCBtYXkgYmUgc2hhcmVkIGJldHdlZW4gY2hhbm5lbHMgKi8KQEAgLTU5NTcsNyArNjI3MSw3IEBACiAJZGVzdHJveV93b3JrcXVldWUoYXRhX2F1eF93cSk7CiB9CiAKLW1vZHVsZV9pbml0KGF0YV9pbml0KTsKK3N1YnN5c19pbml0Y2FsbChhdGFfaW5pdCk7CiBtb2R1bGVfZXhpdChhdGFfZXhpdCk7CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJhdGVsaW1pdF90aW1lOwpAQCAtNjEyMCw5ICs2NDM0LDkgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9idXNfcmVzZXQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9wcmVyZXNldCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX3NvZnRyZXNldCk7CitFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3BvcnRfaGFyZHJlc2V0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNhdGFfc3RkX2hhcmRyZXNldCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX3Bvc3RyZXNldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2X3JldmFsaWRhdGUpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2Rldl9jbGFzc2lmeSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2X3BhaXIpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfZGlzYWJsZSk7CkBAIC02MTQ3LDYgKzY0NjEsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2hvc3RfcmVzdW1lKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9pZF9zdHJpbmcpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2lkX2Nfc3RyaW5nKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9kZXZpY2VfYmxhY2tsaXN0ZWQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfc2ltdWxhdGUpOwogCiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGlvX25lZWRfaW9yZHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCAwMmIyYjI3Li4wOGFkNDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtMzMyLDcgKzMzMiw3IEBACiAJaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfTE9BRElORykKIAkJYXAtPnBmbGFncyAmPSB+QVRBX1BGTEFHX0xPQURJTkc7CiAJZWxzZSBpZiAoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19TQ1NJX0hPVFBMVUcpCi0JCXF1ZXVlX3dvcmsoYXRhX2F1eF93cSwgJmFwLT5ob3RwbHVnX3Rhc2spOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoYXRhX2F1eF93cSwgJmFwLT5ob3RwbHVnX3Rhc2ssIDApOwogCiAJaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfUkVDT1ZFUkVEKQogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgIkVIIGNvbXBsZXRlXG4iKTsKQEAgLTExMzYsMTkgKzExMzYsMjEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFUQV9ERVZfQVRBUEk6Ci0JCXRtcCA9IGF0YXBpX2VoX3JlcXVlc3Rfc2Vuc2UocWMtPmRldiwKLQkJCQkJICAgICBxYy0+c2NzaWNtZC0+c2Vuc2VfYnVmZmVyKTsKLQkJaWYgKCF0bXApIHsKLQkJCS8qIEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQgaXMgdXNlZCB0byB0ZWxsCi0JCQkgKiBhdGFwaV9xY19jb21wbGV0ZSgpIHRoYXQgc2Vuc2UgZGF0YSBpcwotCQkJICogYWxyZWFkeSB2YWxpZC4KLQkJCSAqCi0JCQkgKiBUT0RPOiBpbnRlcnByZXQgc2Vuc2UgZGF0YSBhbmQgc2V0Ci0JCQkgKiBhcHByb3ByaWF0ZSBlcnJfbWFzay4KLQkJCSAqLwotCQkJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQ7Ci0JCX0gZWxzZQotCQkJcWMtPmVycl9tYXNrIHw9IHRtcDsKKwkJaWYgKCEocWMtPmFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKSkgeworCQkJdG1wID0gYXRhcGlfZWhfcmVxdWVzdF9zZW5zZShxYy0+ZGV2LAorCQkJCQkJICAgICBxYy0+c2NzaWNtZC0+c2Vuc2VfYnVmZmVyKTsKKwkJCWlmICghdG1wKSB7CisJCQkJLyogQVRBX1FDRkxBR19TRU5TRV9WQUxJRCBpcyB1c2VkIHRvCisJCQkJICogdGVsbCBhdGFwaV9xY19jb21wbGV0ZSgpIHRoYXQgc2Vuc2UKKwkJCQkgKiBkYXRhIGlzIGFscmVhZHkgdmFsaWQuCisJCQkJICoKKwkJCQkgKiBUT0RPOiBpbnRlcnByZXQgc2Vuc2UgZGF0YSBhbmQgc2V0CisJCQkJICogYXBwcm9wcmlhdGUgZXJyX21hc2suCisJCQkJICovCisJCQkJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQ7CisJCQl9IGVsc2UKKwkJCQlxYy0+ZXJyX21hc2sgfD0gdG1wOworCQl9CiAJfQogCiAJaWYgKHFjLT5lcnJfbWFzayAmIChBQ19FUlJfSFNNIHwgQUNfRVJSX1RJTUVPVVQgfCBBQ19FUlJfQVRBX0JVUykpCkBAIC0xNDMzLDE2ICsxNDM1LDM5IEBACiAJfQogCiAJZm9yICh0YWcgPSAwOyB0YWcgPCBBVEFfTUFYX1FVRVVFOyB0YWcrKykgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZG1hX3N0cltdID0geworCQkJW0RNQV9CSURJUkVDVElPTkFMXQk9ICJiaWRpIiwKKwkJCVtETUFfVE9fREVWSUNFXQkJPSAib3V0IiwKKwkJCVtETUFfRlJPTV9ERVZJQ0VdCT0gImluIiwKKwkJCVtETUFfTk9ORV0JCT0gIiIsCisJCX07CiAJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBfX2F0YV9xY19mcm9tX3RhZyhhcCwgdGFnKTsKKwkJc3RydWN0IGF0YV90YXNrZmlsZSAqY21kID0gJnFjLT50ZiwgKnJlcyA9ICZxYy0+cmVzdWx0X3RmOworCQl1bnNpZ25lZCBpbnQgbmJ5dGVzOwogCiAJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSB8fCAhcWMtPmVycl9tYXNrKQogCQkJY29udGludWU7CiAKLQkJYXRhX2Rldl9wcmludGsocWMtPmRldiwgS0VSTl9FUlIsICJ0YWcgJWQgY21kIDB4JXggIgotCQkJICAgICAgICJFbWFzayAweCV4IHN0YXQgMHgleCBlcnIgMHgleCAoJXMpXG4iLAotCQkJICAgICAgIHFjLT50YWcsIHFjLT50Zi5jb21tYW5kLCBxYy0+ZXJyX21hc2ssCi0JCQkgICAgICAgcWMtPnJlc3VsdF90Zi5jb21tYW5kLCBxYy0+cmVzdWx0X3RmLmZlYXR1cmUsCi0JCQkgICAgICAgYXRhX2Vycl9zdHJpbmcocWMtPmVycl9tYXNrKSk7CisJCW5ieXRlcyA9IHFjLT5uYnl0ZXM7CisJCWlmICghbmJ5dGVzKQorCQkJbmJ5dGVzID0gcWMtPm5zZWN0IDw8IDk7CisKKwkJYXRhX2Rldl9wcmludGsocWMtPmRldiwgS0VSTl9FUlIsCisJCQkiY21kICUwMngvJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC8lMDJ4ICIKKwkJCSJ0YWcgJWQgY2RiIDB4JXggZGF0YSAldSAlc1xuICAgICAgICAgIgorCQkJInJlcyAlMDJ4LyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC8lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngvJTAyeCAiCisJCQkiRW1hc2sgMHgleCAoJXMpXG4iLAorCQkJY21kLT5jb21tYW5kLCBjbWQtPmZlYXR1cmUsIGNtZC0+bnNlY3QsCisJCQljbWQtPmxiYWwsIGNtZC0+bGJhbSwgY21kLT5sYmFoLAorCQkJY21kLT5ob2JfZmVhdHVyZSwgY21kLT5ob2JfbnNlY3QsCisJCQljbWQtPmhvYl9sYmFsLCBjbWQtPmhvYl9sYmFtLCBjbWQtPmhvYl9sYmFoLAorCQkJY21kLT5kZXZpY2UsIHFjLT50YWcsIHFjLT5jZGJbMF0sIG5ieXRlcywKKwkJCWRtYV9zdHJbcWMtPmRtYV9kaXJdLAorCQkJcmVzLT5jb21tYW5kLCByZXMtPmZlYXR1cmUsIHJlcy0+bnNlY3QsCisJCQlyZXMtPmxiYWwsIHJlcy0+bGJhbSwgcmVzLT5sYmFoLAorCQkJcmVzLT5ob2JfZmVhdHVyZSwgcmVzLT5ob2JfbnNlY3QsCisJCQlyZXMtPmhvYl9sYmFsLCByZXMtPmhvYl9sYmFtLCByZXMtPmhvYl9sYmFoLAorCQkJcmVzLT5kZXZpY2UsIHFjLT5lcnJfbWFzaywgYXRhX2Vycl9zdHJpbmcocWMtPmVycl9tYXNrKSk7CiAJfQogfQogCkBAIC0xNjM0LDExICsxNjU5LDE0IEBACiAJRFBSSU5USygiRU5URVJcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCBhY3Rpb247CisJCXVuc2lnbmVkIGludCBhY3Rpb24sIHJlYWRpZF9mbGFncyA9IDA7CiAKIAkJZGV2ID0gJmFwLT5kZXZpY2VbaV07CiAJCWFjdGlvbiA9IGF0YV9laF9kZXZfYWN0aW9uKGRldik7CiAKKwkJaWYgKGVoYy0+aS5mbGFncyAmIEFUQV9FSElfRElEX1JFU0VUKQorCQkJcmVhZGlkX2ZsYWdzIHw9IEFUQV9SRUFESURfUE9TVFJFU0VUOworCiAJCWlmIChhY3Rpb24gJiBBVEFfRUhfUkVWQUxJREFURSAmJiBhdGFfZGV2X3JlYWR5KGRldikpIHsKIAkJCWlmIChhdGFfcG9ydF9vZmZsaW5lKGFwKSkgewogCQkJCXJjID0gLUVJTzsKQEAgLTE2NDYsMTMgKzE2NzQsMTcgQEAKIAkJCX0KIAogCQkJYXRhX2VoX2Fib3V0X3RvX2RvKGFwLCBkZXYsIEFUQV9FSF9SRVZBTElEQVRFKTsKLQkJCXJjID0gYXRhX2Rldl9yZXZhbGlkYXRlKGRldiwKLQkJCQkJZWhjLT5pLmZsYWdzICYgQVRBX0VISV9ESURfUkVTRVQpOworCQkJcmMgPSBhdGFfZGV2X3JldmFsaWRhdGUoZGV2LCByZWFkaWRfZmxhZ3MpOwogCQkJaWYgKHJjKQogCQkJCWJyZWFrOwogCiAJCQlhdGFfZWhfZG9uZShhcCwgZGV2LCBBVEFfRUhfUkVWQUxJREFURSk7CiAKKwkJCS8qIENvbmZpZ3VyYXRpb24gbWF5IGhhdmUgY2hhbmdlZCwgcmVjb25maWd1cmUKKwkJCSAqIHRyYW5zZmVyIG1vZGUuCisJCQkgKi8KKwkJCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX1NFVE1PREU7CisKIAkJCS8qIHNjaGVkdWxlIHRoZSBzY3NpX3Jlc2Nhbl9kZXZpY2UoKSBoZXJlICovCiAJCQlxdWV1ZV93b3JrKGF0YV9hdXhfd3EsICYoYXAtPnNjc2lfcmVzY2FuX3Rhc2spKTsKIAkJfSBlbHNlIGlmIChkZXYtPmNsYXNzID09IEFUQV9ERVZfVU5LTk9XTiAmJgpAQCAtMTY2MCwxOCArMTY5MiwzNSBAQAogCQkJICAgYXRhX2NsYXNzX2VuYWJsZWQoZWhjLT5jbGFzc2VzW2Rldi0+ZGV2bm9dKSkgewogCQkJZGV2LT5jbGFzcyA9IGVoYy0+Y2xhc3Nlc1tkZXYtPmRldm5vXTsKIAotCQkJcmMgPSBhdGFfZGV2X3JlYWRfaWQoZGV2LCAmZGV2LT5jbGFzcywgMSwgZGV2LT5pZCk7Ci0JCQlpZiAocmMgPT0gMCkKLQkJCQlyYyA9IGF0YV9kZXZfY29uZmlndXJlKGRldiwgMSk7CisJCQlyYyA9IGF0YV9kZXZfcmVhZF9pZChkZXYsICZkZXYtPmNsYXNzLCByZWFkaWRfZmxhZ3MsCisJCQkJCSAgICAgZGV2LT5pZCk7CisJCQlpZiAocmMgPT0gMCkgeworCQkJCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX1BSSU5USU5GTzsKKwkJCQlyYyA9IGF0YV9kZXZfY29uZmlndXJlKGRldik7CisJCQkJZWhjLT5pLmZsYWdzICY9IH5BVEFfRUhJX1BSSU5USU5GTzsKKwkJCX0gZWxzZSBpZiAocmMgPT0gLUVOT0VOVCkgeworCQkJCS8qIElERU5USUZZIHdhcyBpc3N1ZWQgdG8gbm9uLWV4aXN0ZW50CisJCQkJICogZGV2aWNlLiAgTm8gbmVlZCB0byByZXNldC4gIEp1c3QKKwkJCQkgKiB0aGF3IGFuZCBraWxsIHRoZSBkZXZpY2UuCisJCQkJICovCisJCQkJYXRhX2VoX3RoYXdfcG9ydChhcCk7CisJCQkJZGV2LT5jbGFzcyA9IEFUQV9ERVZfVU5LTk9XTjsKKwkJCQlyYyA9IDA7CisJCQl9CiAKIAkJCWlmIChyYykgewogCQkJCWRldi0+Y2xhc3MgPSBBVEFfREVWX1VOS05PV047CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7Ci0JCQlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19TQ1NJX0hPVFBMVUc7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCQkJCWFwLT5wZmxhZ3MgfD0gQVRBX1BGTEFHX1NDU0lfSE9UUExVRzsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkJCQkvKiBuZXcgZGV2aWNlIGRpc2NvdmVyZWQsIGNvbmZpZ3VyZSB4ZmVybW9kZSAqLworCQkJCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX1NFVE1PREU7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTE5ODcsMTMgKzIwMzYsMTQgQEAKIAlpZiAocmMpCiAJCWdvdG8gZGV2X2ZhaWw7CiAKLQkvKiBjb25maWd1cmUgdHJhbnNmZXIgbW9kZSBpZiB0aGUgcG9ydCBoYXMgYmVlbiByZXNldCAqLwotCWlmIChlaGMtPmkuZmxhZ3MgJiBBVEFfRUhJX0RJRF9SRVNFVCkgeworCS8qIGNvbmZpZ3VyZSB0cmFuc2ZlciBtb2RlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChlaGMtPmkuZmxhZ3MgJiBBVEFfRUhJX1NFVE1PREUpIHsKIAkJcmMgPSBhdGFfc2V0X21vZGUoYXAsICZkZXYpOwogCQlpZiAocmMpIHsKIAkJCWRvd25feGZlcm1hc2sgPSAxOwogCQkJZ290byBkZXZfZmFpbDsKIAkJfQorCQllaGMtPmkuZmxhZ3MgJj0gfkFUQV9FSElfU0VUTU9ERTsKIAl9CiAKIAkvKiBzdXNwZW5kIGRldmljZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDdhZjJhNGIuLjY2NGUxMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtNjcxLDcgKzY3MSw3IEBACiB9CiAKIC8qCi0gKglhdGFfZ2VuX2F0YV9kZXNjX3NlbnNlIC0gR2VuZXJhdGUgY2hlY2sgY29uZGl0aW9uIHNlbnNlIGJsb2NrLgorICoJYXRhX2dlbl9wYXNzdGhydV9zZW5zZSAtIEdlbmVyYXRlIGNoZWNrIGNvbmRpdGlvbiBzZW5zZSBibG9jay4KICAqCUBxYzogQ29tbWFuZCB0aGF0IGNvbXBsZXRlZC4KICAqCiAgKglUaGlzIGZ1bmN0aW9uIGlzIHNwZWNpZmljIHRvIHRoZSBBVEEgZGVzY3JpcHRvciBmb3JtYXQgc2Vuc2UKQEAgLTY4MSw5ICs2ODEsOSBAQAogICoJYmxvY2suIENsZWFyIHNlbnNlIGtleSwgQVNDICYgQVNDUSBpZiB0aGVyZSBpcyBubyBlcnJvci4KICAqCiAgKglMT0NLSU5HOgotICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdCBsb2NrKQorICoJTm9uZS4KICAqLwotdm9pZCBhdGFfZ2VuX2F0YV9kZXNjX3NlbnNlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgdm9pZCBhdGFfZ2VuX3Bhc3N0aHJ1X3NlbnNlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kID0gcWMtPnNjc2ljbWQ7CiAJc3RydWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnJlc3VsdF90ZjsKQEAgLTcxMywxMiArNzEzLDkgQEAKIAogCWRlc2NbMF0gPSAweDA5OwogCi0JLyoKLQkgKiBTZXQgbGVuZ3RoIG9mIGFkZGl0aW9uYWwgc2Vuc2UgZGF0YS4KLQkgKiBTaW5jZSB3ZSBvbmx5IHBvcHVsYXRlIGRlc2NyaXB0b3IgMCwgdGhlIHRvdGFsCi0JICogbGVuZ3RoIGlzIHRoZSBzYW1lIChmaXhlZCkgbGVuZ3RoIGFzIGRlc2NyaXB0b3IgMC4KLQkgKi8KLQlkZXNjWzFdID0gc2JbN10gPSAxNDsKKwkvKiBzZXQgbGVuZ3RoIG9mIGFkZGl0aW9uYWwgc2Vuc2UgZGF0YSAqLworCXNiWzddID0gMTQ7CisJZGVzY1sxXSA9IDEyOwogCiAJLyoKIAkgKiBDb3B5IHJlZ2lzdGVycyBpbnRvIHNlbnNlIGJ1ZmZlci4KQEAgLTc0Niw1NiArNzQzLDU2IEBACiB9CiAKIC8qKgotICoJYXRhX2dlbl9maXhlZF9zZW5zZSAtIGdlbmVyYXRlIGEgU0NTSSBmaXhlZCBzZW5zZSBibG9jaworICoJYXRhX2dlbl9hdGFfc2Vuc2UgLSBnZW5lcmF0ZSBhIFNDU0kgZml4ZWQgc2Vuc2UgYmxvY2sKICAqCUBxYzogQ29tbWFuZCB0aGF0IHdlIGFyZSBlcnJvcmluZyBvdXQKICAqCi0gKglMZXZlcmFnZSBhdGFfdG9fc2Vuc2VfZXJyb3IoKSB0byBnaXZlIHVzIHRoZSBjb2Rlcy4gIEZpdCBvdXIKLSAqCUxCQSBpbiBoZXJlIGlmIHRoZXJlJ3Mgcm9vbS4KKyAqCUdlbmVyYXRlIHNlbnNlIGJsb2NrIGZvciBhIGZhaWxlZCBBVEEgY29tbWFuZCBAcWMuICBEZXNjcmlwdG9yCisgKglmb3JtYXQgaXMgdXNlZCB0byBhY2NvbW9kYXRlIExCQTQ4IGJsb2NrIGFkZHJlc3MuCiAgKgogICoJTE9DS0lORzoKLSAqCWluaGVyaXRlZCBmcm9tIGNhbGxlcgorICoJTm9uZS4KICAqLwotdm9pZCBhdGFfZ2VuX2ZpeGVkX3NlbnNlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgdm9pZCBhdGFfZ2VuX2F0YV9zZW5zZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogeworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBxYy0+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+ZXJyb3JfaGFuZGxlcikKKwkJYXRhX2R1bXBfc3RhdHVzKGFwLT5pZCwgJnFjLT5yZXN1bHRfdGYpOwogCiAJcWMtPnNjc2lkb25lKGNtZCk7CiAKQEAgLTE2MTIsOSArMTUwNSw5IEBACiAKIGVycl9kaWQ6CiAJYXRhX3FjX2ZyZWUocWMpOwotZXJyX21lbToKIAljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwogCWRvbmUoY21kKTsKK2Vycl9tZW06CiAJRFBSSU5USygiRVhJVCAtIGludGVybmFsXG4iKTsKIAlyZXR1cm4gMDsKIApAQCAtMTcxMyw2ICsxNjA2LDIyIEBACiB9CiAKIC8qKgorICoJQVRBX1NDU0lfUkJVRl9TRVQgLSBoZWxwZXIgdG8gc2V0IHZhbHVlcyBpbiBTQ1NJIHJlc3BvbnNlIGJ1ZmZlcgorICoJQGlkeDogYnl0ZSBpbmRleCBpbnRvIFNDU0kgcmVzcG9uc2UgYnVmZmVyCisgKglAdmFsOiB2YWx1ZSB0byBzZXQKKyAqCisgKglUbyBiZSB1c2VkIGJ5IFNDU0kgY29tbWFuZCBzaW11bGF0b3IgZnVuY3Rpb25zLiAgVGhpcyBtYWNyb3MKKyAqCWV4cGVjdHMgdHdvIGxvY2FsIHZhcmlhYmxlcywgdTggKnJidWYgYW5kIHVuc2lnbmVkIGludCBidWZsZW4sCisgKglhcmUgaW4gc2NvcGUuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKi8KKyNkZWZpbmUgQVRBX1NDU0lfUkJVRl9TRVQoaWR4LCB2YWwpIGRvIHsgXAorCQlpZiAoKGlkeCkgPCBidWZsZW4pIHJidWZbKGlkeCldID0gKHU4KSh2YWwpOyBcCisJfSB3aGlsZSAoMCkKKworLyoqCiAgKglhdGFfc2NzaW9wX2lucV9zdGQgLSBTaW11bGF0ZSBJTlFVSVJZIGNvbW1hbmQKICAqCUBhcmdzOiBkZXZpY2UgSURFTlRJRlkgZGF0YSAvIFNDU0kgY29tbWFuZCBvZiBpbnRlcmVzdC4KICAqCUByYnVmOiBSZXNwb25zZSBidWZmZXIsIHRvIHdoaWNoIHNpbXVsYXRlZCBTQ1NJIGNtZCBvdXRwdXQgaXMgc2VudC4KQEAgLTIxNzEsNjcgKzIwODAsNDIgQEAKICAqCVNpbXVsYXRlIFJFQUQgQ0FQQUNJVFkgY29tbWFuZHMuCiAgKgogICoJTE9DS0lORzoKLSAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QgbG9jaykKKyAqCU5vbmUuCiAgKi8KLQogdW5zaWduZWQgaW50IGF0YV9zY3Npb3BfcmVhZF9jYXAoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAogCQkJICAgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuKQogewotCXU2NCBuX3NlY3RvcnM7Ci0JdTMyIHRtcDsKKwl1NjQgbGFzdF9sYmEgPSBhcmdzLT5kZXYtPm5fc2VjdG9ycyAtIDE7IC8qIExCQSBvZiB0aGUgbGFzdCBibG9jayAqLwogCiAJVlBSSU5USygiRU5URVJcbiIpOwogCi0JaWYgKGF0YV9pZF9oYXNfbGJhKGFyZ3MtPmlkKSkgewotCQlpZiAoYXRhX2lkX2hhc19sYmE0OChhcmdzLT5pZCkpCi0JCQluX3NlY3RvcnMgPSBhdGFfaWRfdTY0KGFyZ3MtPmlkLCAxMDApOwotCQllbHNlCi0JCQluX3NlY3RvcnMgPSBhdGFfaWRfdTMyKGFyZ3MtPmlkLCA2MCk7Ci0JfSBlbHNlIHsKLQkJLyogQ0hTIGRlZmF1bHQgdHJhbnNsYXRpb24gKi8KLQkJbl9zZWN0b3JzID0gYXJncy0+aWRbMV0gKiBhcmdzLT5pZFszXSAqIGFyZ3MtPmlkWzZdOwotCi0JCWlmIChhdGFfaWRfY3VycmVudF9jaHNfdmFsaWQoYXJncy0+aWQpKQotCQkJLyogQ0hTIGN1cnJlbnQgdHJhbnNsYXRpb24gKi8KLQkJCW5fc2VjdG9ycyA9IGF0YV9pZF91MzIoYXJncy0+aWQsIDU3KTsKLQl9Ci0KLQluX3NlY3RvcnMtLTsJCS8qIEFUQSBUb3RhbFVzZXJTZWN0b3JzIC0gMSAqLwotCiAJaWYgKGFyZ3MtPmNtZC0+Y21uZFswXSA9PSBSRUFEX0NBUEFDSVRZKSB7Ci0JCWlmKCBuX3NlY3RvcnMgPj0gMHhmZmZmZmZmZlVMTCApCi0JCQl0bXAgPSAweGZmZmZmZmZmIDsgIC8qIFJldHVybiBtYXggY291bnQgb24gb3ZlcmZsb3cgKi8KLQkJZWxzZQotCQkJdG1wID0gbl9zZWN0b3JzIDsKKwkJaWYgKGxhc3RfbGJhID49IDB4ZmZmZmZmZmZVTEwpCisJCQlsYXN0X2xiYSA9IDB4ZmZmZmZmZmY7CiAKIAkJLyogc2VjdG9yIGNvdW50LCAzMi1iaXQgKi8KLQkJcmJ1ZlswXSA9IHRtcCA+PiAoOCAqIDMpOwotCQlyYnVmWzFdID0gdG1wID4+ICg4ICogMik7Ci0JCXJidWZbMl0gPSB0bXAgPj4gKDggKiAxKTsKLQkJcmJ1ZlszXSA9IHRtcDsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoMCwgbGFzdF9sYmEgPj4gKDggKiAzKSk7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDEsIGxhc3RfbGJhID4+ICg4ICogMikpOworCQlBVEFfU0NTSV9SQlVGX1NFVCgyLCBsYXN0X2xiYSA+PiAoOCAqIDEpKTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoMywgbGFzdF9sYmEpOwogCiAJCS8qIHNlY3RvciBzaXplICovCi0JCXRtcCA9IEFUQV9TRUNUX1NJWkU7Ci0JCXJidWZbNl0gPSB0bXAgPj4gODsKLQkJcmJ1Zls3XSA9IHRtcDsKLQorCQlBVEFfU0NTSV9SQlVGX1NFVCg2LCBBVEFfU0VDVF9TSVpFID4+IDgpOworCQlBVEFfU0NTSV9SQlVGX1NFVCg3LCBBVEFfU0VDVF9TSVpFKTsKIAl9IGVsc2UgewogCQkvKiBzZWN0b3IgY291bnQsIDY0LWJpdCAqLwotCQl0bXAgPSBuX3NlY3RvcnMgPj4gKDggKiA0KTsKLQkJcmJ1ZlsyXSA9IHRtcCA+PiAoOCAqIDMpOwotCQlyYnVmWzNdID0gdG1wID4+ICg4ICogMik7Ci0JCXJidWZbNF0gPSB0bXAgPj4gKDggKiAxKTsKLQkJcmJ1Zls1XSA9IHRtcDsKLQkJdG1wID0gbl9zZWN0b3JzOwotCQlyYnVmWzZdID0gdG1wID4+ICg4ICogMyk7Ci0JCXJidWZbN10gPSB0bXAgPj4gKDggKiAyKTsKLQkJcmJ1Zls4XSA9IHRtcCA+PiAoOCAqIDEpOwotCQlyYnVmWzldID0gdG1wOworCQlBVEFfU0NTSV9SQlVGX1NFVCgwLCBsYXN0X2xiYSA+PiAoOCAqIDcpKTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoMSwgbGFzdF9sYmEgPj4gKDggKiA2KSk7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDIsIGxhc3RfbGJhID4+ICg4ICogNSkpOworCQlBVEFfU0NTSV9SQlVGX1NFVCgzLCBsYXN0X2xiYSA+PiAoOCAqIDQpKTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoNCwgbGFzdF9sYmEgPj4gKDggKiAzKSk7CisJCUFUQV9TQ1NJX1JCVUZfU0VUKDUsIGxhc3RfbGJhID4+ICg4ICogMikpOworCQlBVEFfU0NTSV9SQlVGX1NFVCg2LCBsYXN0X2xiYSA+PiAoOCAqIDEpKTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoNywgbGFzdF9sYmEpOwogCiAJCS8qIHNlY3RvciBzaXplICovCi0JCXRtcCA9IEFUQV9TRUNUX1NJWkU7Ci0JCXJidWZbMTJdID0gdG1wID4+IDg7Ci0JCXJidWZbMTNdID0gdG1wOworCQlBVEFfU0NTSV9SQlVGX1NFVCgxMCwgQVRBX1NFQ1RfU0laRSA+PiA4KTsKKwkJQVRBX1NDU0lfUkJVRl9TRVQoMTEsIEFUQV9TRUNUX1NJWkUpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjMxNyw3ICsyMjAxLDcgQEAKIAkJICogYSBzZW5zZSBkZXNjcmlwdG9ycywgc2luY2UgdGhhdCdzIG9ubHkKIAkJICogY29ycmVjdCBmb3IgQVRBLCBub3QgQVRBUEkKIAkJICovCi0JCWF0YV9nZW5fYXRhX2Rlc2Nfc2Vuc2UocWMpOworCQlhdGFfZ2VuX3Bhc3N0aHJ1X3NlbnNlKHFjKTsKIAl9CiAKIAlxYy0+c2NzaWRvbmUocWMtPnNjc2ljbWQpOwpAQCAtMjM5Miw3ICsyMjc2LDcgQEAKIAkJCSAqIHNlbnNlIGRlc2NyaXB0b3JzLCBzaW5jZSB0aGF0J3Mgb25seQogCQkJICogY29ycmVjdCBmb3IgQVRBLCBub3QgQVRBUEkKIAkJCSAqLwotCQkJYXRhX2dlbl9hdGFfZGVzY19zZW5zZShxYyk7CisJCQlhdGFfZ2VuX3Bhc3N0aHJ1X3NlbnNlKHFjKTsKIAkJfQogCiAJCS8qIFNDU0kgRUggYXV0b21hdGljYWxseSBsb2NrcyBkb29yIGlmIHNkZXYtPmxvY2tlZCBpcwpAQCAtMjQyNSw3ICsyMzA5LDcgQEAKIAkJICogYSBzZW5zZSBkZXNjcmlwdG9ycywgc2luY2UgdGhhdCdzIG9ubHkKIAkJICogY29ycmVjdCBmb3IgQVRBLCBub3QgQVRBUEkKIAkJICovCi0JCWF0YV9nZW5fYXRhX2Rlc2Nfc2Vuc2UocWMpOworCQlhdGFfZ2VuX3Bhc3N0aHJ1X3NlbnNlKHFjKTsKIAl9IGVsc2UgewogCQl1OCAqc2NzaWNtZCA9IGNtZC0+Y21uZDsKIApAQCAtMzA3OSw3ICsyOTYzLDcgQEAKIAogLyoqCiAgKglhdGFfc2NzaV9ob3RwbHVnIC0gU0NTSSBwYXJ0IG9mIGhvdHBsdWcKLSAqCUBkYXRhOiBQb2ludGVyIHRvIEFUQSBwb3J0IHRvIHBlcmZvcm0gU0NTSSBob3RwbHVnIG9uCisgKglAd29yazogUG9pbnRlciB0byBBVEEgcG9ydCB0byBwZXJmb3JtIFNDU0kgaG90cGx1ZyBvbgogICoKICAqCVBlcmZvcm0gU0NTSSBwYXJ0IG9mIGhvdHBsdWcuICBJdCdzIGV4ZWN1dGVkIGZyb20gYSBzZXBhcmF0ZQogICoJd29ya3F1ZXVlIGFmdGVyIEVIIGNvbXBsZXRlcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgU0NTSQpAQCAtMzA4OSw5ICsyOTczLDEwIEBACiAgKglMT0NLSU5HOgogICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgogICovCi12b2lkIGF0YV9zY3NpX2hvdHBsdWcodm9pZCAqZGF0YSkKK3ZvaWQgYXRhX3Njc2lfaG90cGx1ZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IGRhdGE7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRhX3BvcnQsIGhvdHBsdWdfdGFzay53b3JrKTsKIAlpbnQgaTsKIAogCWlmIChhcC0+cGZsYWdzICYgQVRBX1BGTEFHX1VOTE9BRElORykgewpAQCAtMzE4MCwxNyArMzA2NSwxOSBAQAogCQkJcmMgPSAtRUlOVkFMOwogCX0KIAotCWlmIChyYyA9PSAwKQorCWlmIChyYyA9PSAwKSB7CiAJCWF0YV9wb3J0X3NjaGVkdWxlX2VoKGFwKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCQlhdGFfcG9ydF93YWl0X2VoKGFwKTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJjOwogfQogCiAvKioKICAqCWF0YV9zY3NpX2Rldl9yZXNjYW4gLSBpbml0aWF0ZSBzY3NpX3Jlc2Nhbl9kZXZpY2UoKQotICoJQGRhdGE6IFBvaW50ZXIgdG8gQVRBIHBvcnQgdG8gcGVyZm9ybSBzY3NpX3Jlc2Nhbl9kZXZpY2UoKQorICoJQHdvcms6IFBvaW50ZXIgdG8gQVRBIHBvcnQgdG8gcGVyZm9ybSBzY3NpX3Jlc2Nhbl9kZXZpY2UoKQogICoKICAqCUFmdGVyIEFUQSBwYXNzIHRocnUgKFNBVCkgY29tbWFuZHMgYXJlIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSwKICAqCWxpYmF0YSBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlcyB0byBTQ1NJIGxheWVyLiAgVGhpcwpAQCAtMzIwMCwxOCArMzA4NywzMSBAQAogICoJTE9DS0lORzoKICAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4KICAqLwotdm9pZCBhdGFfc2NzaV9kZXZfcmVzY2FuKHZvaWQgKmRhdGEpCit2b2lkIGF0YV9zY3NpX2Rldl9yZXNjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkYXRhOwotCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRhX3BvcnQsIHNjc2lfcmVzY2FuX3Rhc2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKLQkJZGV2ID0gJmFwLT5kZXZpY2VbaV07CisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAotCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikgJiYgZGV2LT5zZGV2KQotCQkJc2NzaV9yZXNjYW5fZGV2aWNlKCYoZGV2LT5zZGV2LT5zZGV2X2dlbmRldikpOworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gJmFwLT5kZXZpY2VbaV07CisJCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IGRldi0+c2RldjsKKworCQlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpIHx8ICFzZGV2KQorCQkJY29udGludWU7CisJCWlmIChzY3NpX2RldmljZV9nZXQoc2RldikpCisJCQljb250aW51ZTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisJCXNjc2lfcmVzY2FuX2RldmljZSgmKHNkZXYtPnNkZXZfZ2VuZGV2KSk7CisJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgpAQCAtMzM0NSwyMCArMzI0NSwyMyBAQAogICoJQGFwOglBVEEgcG9ydCB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBiZWluZyBzZW50CiAgKgogICoJUkVUVVJOUzoKLSAqCVplcm8uCisgKglSZXR1cm4gdmFsdWUgZnJvbSBfX2F0YV9zY3NpX3F1ZXVlY21kKCkgaWYgQGNtZCBjYW4gYmUgcXVldWVkLAorICoJMCBvdGhlcndpc2UuCiAgKi8KIAogaW50IGF0YV9zYXNfcXVldWVjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwKIAkJICAgICBzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogeworCWludCByYyA9IDA7CisKIAlhdGFfc2NzaV9kdW1wX2NkYihhcCwgY21kKTsKIAogCWlmIChsaWtlbHkoYXRhX3Njc2lfZGV2X2VuYWJsZWQoYXAtPmRldmljZSkpKQotCQlfX2F0YV9zY3NpX3F1ZXVlY21kKGNtZCwgZG9uZSwgYXAtPmRldmljZSk7CisJCXJjID0gX19hdGFfc2NzaV9xdWV1ZWNtZChjbWQsIGRvbmUsIGFwLT5kZXZpY2UpOwogCWVsc2UgewogCQljbWQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CiAJCWRvbmUoY21kKTsKIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Nhc19xdWV1ZWNtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKaW5kZXggMDZkYWFhMy4uMTBlZTIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwpAQCAtMzksNiArMzksMzUgQEAKICNpbmNsdWRlICJsaWJhdGEuaCIKIAogLyoqCisgKglhdGFfaXJxX29uIC0gRW5hYmxlIGludGVycnVwdHMgb24gYSBwb3J0LgorICoJQGFwOiBQb3J0IG9uIHdoaWNoIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisgKgorICoJRW5hYmxlIGludGVycnVwdHMgb24gYSBsZWdhY3kgSURFIGRldmljZSB1c2luZyBNTUlPIG9yIFBJTywKKyAqCXdhaXQgZm9yIGlkbGUsIGNsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqLwordTggYXRhX2lycV9vbihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisJdTggdG1wOworCisJYXAtPmN0bCAmPSB+QVRBX05JRU47CisJYXAtPmxhc3RfY3RsID0gYXAtPmN0bDsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQorCQl3cml0ZWIoYXAtPmN0bCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmN0bF9hZGRyKTsKKwllbHNlCisJCW91dGIoYXAtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CisJdG1wID0gYXRhX3dhaXRfaWRsZShhcCk7CisKKwlhcC0+b3BzLT5pcnFfY2xlYXIoYXApOworCisJcmV0dXJuIHRtcDsKK30KKworLyoqCiAgKglhdGFfdGZfbG9hZF9waW8gLSBzZW5kIHRhc2tmaWxlIHJlZ2lzdGVycyB0byBob3N0IGNvbnRyb2xsZXIKICAqCUBhcDogUG9ydCB0byB3aGljaCBvdXRwdXQgaXMgc2VudAogICoJQHRmOiBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0CkBAIC02NzEsNiArNzAwLDE0IEBACiAJCXdyaXRlYihhcC0+Y3RsLCAodm9pZCBfX2lvbWVtICopaW9hZGRyLT5jdGxfYWRkcik7CiAJZWxzZQogCQlvdXRiKGFwLT5jdGwsIGlvYWRkci0+Y3RsX2FkZHIpOworCisJLyogVW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCBzb21lIGNvbnRyb2xsZXJzIHJhaXNlIElSUSBvbgorCSAqIEFUQV9OSUVOIG1hbmlwdWxhdGlvbi4gIEFsc28sIG1hbnkgY29udHJvbGxlcnMgZmFpbCB0byBtYXNrCisJICogcHJldmlvdXNseSBwZW5kaW5nIElSUSBvbiBBVEFfTklFTiBhc3NlcnRpb24uICBDbGVhciBpdC4KKwkgKi8KKwlhdGFfY2hrX3N0YXR1cyhhcCk7CisKKwlhcC0+b3BzLT5pcnFfY2xlYXIoYXApOwogfQogCiAvKioKQEAgLTcxNCw3ICs3NTEsNiBAQAogCQkJYXRhX3Jlc2V0X2ZuX3Qgc29mdHJlc2V0LCBhdGFfcmVzZXRfZm5fdCBoYXJkcmVzZXQsCiAJCQlhdGFfcG9zdHJlc2V0X2ZuX3QgcG9zdHJlc2V0KQogewotCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmFwLT5laF9jb250ZXh0OwogCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdGhhdyA9IDA7CkBAIC03MzIsOSArNzY4LDcgQEAKIAkJICAgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkpIHsKIAkJdTggaG9zdF9zdGF0OwogCi0JCWhvc3Rfc3RhdCA9IGF0YV9ibWRtYV9zdGF0dXMoYXApOwotCi0JCWF0YV9laGlfcHVzaF9kZXNjKCZlaGMtPmksICJCTURNQSBzdGF0IDB4JXgiLCBob3N0X3N0YXQpOworCQlob3N0X3N0YXQgPSBhcC0+b3BzLT5ibWRtYV9zdGF0dXMoYXApOwogCiAJCS8qIEJNRE1BIGNvbnRyb2xsZXJzIGluZGljYXRlIGhvc3QgYnVzIGVycm9yIGJ5CiAJCSAqIHNldHRpbmcgRE1BX0VSUiBiaXQgYW5kIHRpbWluZyBvdXQuICBBcyBpdCB3YXNuJ3QKQEAgLTg3Nyw2ICs5MTEsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXByb2JlX2VudC0+bl9wb3J0cyA9IDI7CisJcHJvYmVfZW50LT5pcnFfZmxhZ3MgPSBJUlFGX1NIQVJFRDsKIAogCWlmIChwb3J0X21hc2sgJiBBVEFfUE9SVF9QUklNQVJZKSB7CiAJCXByb2JlX2VudC0+aXJxID0gQVRBX1BSSU1BUllfSVJROwpAQCAtOTgxLDYgKzEwMTYsMTUgQEAKIAkJbWFzayA9ICgxIDw8IDIpIHwgKDEgPDwgMCk7CiAJCWlmICgodG1wOCAmIG1hc2spICE9IG1hc2spCiAJCQlsZWdhY3lfbW9kZSA9ICgxIDw8IDMpOworI2lmIGRlZmluZWQoQ09ORklHX05PX0FUQV9MRUdBQ1kpCisJCS8qIFNvbWUgcGxhdGZvcm1zIHdpdGggUENJIGxpbWl0cyBjYW5ub3QgYWRkcmVzcyBjb21wYXQKKwkJICAgcG9ydCBzcGFjZS4gSW4gdGhhdCBjYXNlIHdlIHB1bnQgaWYgdGhlaXIgZmlybXdhcmUgaGFzCisJCSAgIGxlZnQgYSBkZXZpY2UgaW4gY29tcGF0aWJpbGl0eSBtb2RlICovCisJCWlmIChsZWdhY3lfbW9kZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhdGE6IENvbXBhdGliaWxpdHkgbW9kZSBBVEEgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLCBza2lwcGluZy5cbiIpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisjZW5kaWYKIAl9CiAKIAlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLmggYi9kcml2ZXJzL2F0YS9saWJhdGEuaAppbmRleCBhNWVjYjcxLi44MWFlNDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEuaAorKysgYi9kcml2ZXJzL2F0YS9saWJhdGEuaApAQCAtMzksMjUgKzM5LDM5IEBACiB9OwogCiAvKiBsaWJhdGEtY29yZS5jICovCitlbnVtIHsKKwkvKiBmbGFncyBmb3IgYXRhX2Rldl9yZWFkX2lkKCkgKi8KKwlBVEFfUkVBRElEX1BPU1RSRVNFVAk9ICgxIDw8IDApLCAvKiByZWFkaW5nIElEIGFmdGVyIHJlc2V0ICovCit9OworCiBleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmF0YV9hdXhfd3E7CiBleHRlcm4gaW50IGF0YXBpX2VuYWJsZWQ7CiBleHRlcm4gaW50IGF0YXBpX2RtYWRpcjsKIGV4dGVybiBpbnQgbGliYXRhX2Z1YTsKIGV4dGVybiBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9xY19uZXdfaW5pdChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgYXRhX3J3Y21kX3Byb3RvY29sKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworZXh0ZXJuIGludCBhdGFfYnVpbGRfcndfdGYoc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkgICB1NjQgYmxvY2ssIHUzMiBuX2Jsb2NrLCB1bnNpZ25lZCBpbnQgdGZfZmxhZ3MsCisJCQkgICB1bnNpZ25lZCBpbnQgdGFnKTsKK2V4dGVybiB1NjQgYXRhX3RmX3JlYWRfYmxvY2soc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgYXRhX2Rldl9kaXNhYmxlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgYXRhX3BvcnRfZmx1c2hfdGFzayhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiB1bnNpZ25lZCBhdGFfZXhlY19pbnRlcm5hbChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIGNvbnN0IHU4ICpjZGIsCiAJCQkJICBpbnQgZG1hX2Rpciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBhdGFfZXhlY19pbnRlcm5hbF9zZyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIGNvbnN0IHU4ICpjZGIsCisJCQkJICAgICBpbnQgZG1hX2Rpciwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBuX2VsZW0pOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfZG9fc2ltcGxlX2NtZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1OCBjbWQpOwogZXh0ZXJuIGludCBhdGFfZGV2X3JlYWRfaWQoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpwX2NsYXNzLAotCQkJICAgaW50IHBvc3RfcmVzZXQsIHUxNiAqaWQpOwotZXh0ZXJuIGludCBhdGFfZGV2X2NvbmZpZ3VyZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcHJpbnRfaW5mbyk7CisJCQkgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHUxNiAqaWQpOworZXh0ZXJuIGludCBhdGFfZGV2X3JldmFsaWRhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBpbnQgYXRhX2Rldl9jb25maWd1cmUoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHNhdGFfZG93bl9zcGRfbGltaXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gaW50IHNhdGFfc2V0X3NwZF9uZWVkZWQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gaW50IGF0YV9kb3duX3hmZXJtYXNrX2xpbWl0KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGludCBmb3JjZV9waW8wKTsKIGV4dGVybiBpbnQgYXRhX3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWRfZGV2KTsKK2V4dGVybiB2b2lkIGF0YV9zZ19jbGVhbihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIGV4dGVybiB2b2lkIGF0YV9xY19mcmVlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogZXh0ZXJuIHZvaWQgYXRhX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogZXh0ZXJuIHZvaWQgX19hdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CkBAIC04MCw3ICs5NCw3IEBACiAKIGV4dGVybiB2b2lkIGF0YV9zY3NpX3NjYW5faG9zdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgYXRhX3Njc2lfb2ZmbGluZV9kZXYoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBhdGFfc2NzaV9ob3RwbHVnKHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgYXRhX3Njc2lfaG90cGx1ZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV9zdGQoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pOwogCkBAIC0xMTAsNyArMTI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAoKmFjdG9yKSAoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnJidWYsIHVuc2lnbmVkIGludCBidWZsZW4pKTsKIGV4dGVybiB2b2lkIGF0YV9zY2hlZHVsZV9zY3NpX2VoKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKLWV4dGVybiB2b2lkIGF0YV9zY3NpX2Rldl9yZXNjYW4odm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBhdGFfc2NzaV9kZXZfcmVzY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBleHRlcm4gaW50IGF0YV9idXNfcHJvYmUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAKIC8qIGxpYmF0YS1laC5jICovCkBAIC0xMTksNCArMTMzLDcgQEAKIGV4dGVybiB2b2lkIGF0YV9wb3J0X3dhaXRfZWgoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfcWNfc2NoZWR1bGVfZWgoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiAKKy8qIGxpYmF0YS1zZmYuYyAqLworZXh0ZXJuIHU4IGF0YV9pcnFfb24oc3RydWN0IGF0YV9wb3J0ICphcCk7CisKICNlbmRpZiAvKiBfX0xJQkFUQV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCmluZGV4IDFkNjk1ZGYuLmM1ZDYxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2FsaSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNi42IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC43LjIiCiAKIC8qCiAgKglDYWJsZSBzcGVjaWFsIGNhc2VzCkBAIC03OCw3ICs3OCw3IEBACiAJICAgaW1wbGVtZW50IHRoZSBkZXRlY3QgbG9naWMgKi8KIAogCWlmIChhbGlfY2FibGVfb3ZlcnJpZGUocGRldikpCi0JCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKKwkJcmV0dXJuIEFUQV9DQkxfUEFUQTQwX1NIT1JUOwogCiAJLyogSG9zdCB2aWV3IGNhYmxlIGRldGVjdCAweDRBIGJpdCAwIHByaW1hcnkgYml0IDEgc2Vjb25kYXJ5CiAJICAgQml0IHNldCBmb3IgNDAgcGluICovCkBAIC0zMzcsMTYgKzMzNywxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkvKiBLZWVwIExCQTI4IGNvdW50cyBzbyBsYXJnZSBJL08ncyBkb24ndCB0dXJuIExCQTQ4IGFuZCBQSU8KLQkgICB3aXRoIG9sZGVyIGNvbnRyb2xsZXJzLiBOb3QgbG9ja2VkIHNvIHdpbGwgZ3JvdyBvbiBDNSBvciBsYXRlciAqLwotCS5tYXhfc2VjdG9ycwkJPSAyNTUsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogLyoKQEAgLTQ5Niw2ICs0OTYsNjkgQEAKIAkuaG9zdF9zdG9wCT0gYXRhX2hvc3Rfc3RvcAogfTsKIAorCisvKioKKyAqCWFsaV9pbml0X2NoaXBzZXQJLQljaGlwIHNldHVwIGZ1bmN0aW9uCisgKglAcGRldjogUENJIGRldmljZSBvZiBBVEEgY29udHJvbGxlcgorICoKKyAqCVBlcmZvcm0gdGhlIHNldHVwIG9uIHRoZSBkZXZpY2UgdGhhdCBtdXN0IGJlIGRvbmUgYm90aCBhdCBib290CisgKglhbmQgYXQgcmVzdW1lIHRpbWUuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGFsaV9pbml0X2NoaXBzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTggcmV2LCB0bXA7CisJc3RydWN0IHBjaV9kZXYgKm5vcnRoLCAqaXNhX2JyaWRnZTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldik7CisKKwkvKgorCSAqIFRoZSBjaGlwc2V0IHJldmlzaW9uIHNlbGVjdHMgdGhlIGRyaXZlciBvcGVyYXRpb25zIGFuZAorCSAqIG1vZGUgZGF0YS4KKwkgKi8KKworCWlmIChyZXYgPj0gMHgyMCAmJiByZXYgPCAweEMyKSB7CisJCS8qIDE1NDMtRS9GLCAxNTQzQy1DLCAxNTQzQy1ELCAxNTQzQy1FICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsICZ0bXApOworCQkvKiBDbGVhciBDRC1ST00gRE1BIHdyaXRlIGJpdCAqLworCQl0bXAgJj0gMHg3RjsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsIHRtcCk7CisJfSBlbHNlIGlmIChyZXYgPj0gMHhDMikgeworCQkvKiBFbmFibGUgY2FibGUgZGV0ZWN0aW9uIGxvZ2ljICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsICZ0bXApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgdG1wIHwgMHgwOCk7CisJfQorCW5vcnRoID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsMCkpOworCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCBOVUxMKTsKKworCWlmIChub3J0aCAmJiBub3J0aC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQUwgJiYgaXNhX2JyaWRnZSkgeworCQkvKiBDb25maWd1cmUgdGhlIEFMaSBicmlkZ2UgbG9naWMuIEZvciBub24gQUxpIHJlbHkgb24gQklPUy4KKwkJICAgU2V0IHRoZSBzb3V0aCBicmlkZ2UgZW5hYmxlIGJpdCAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDc5LCAmdG1wKTsKKwkJaWYgKHJldiA9PSAweEMyKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NzksIHRtcCB8IDB4MDQpOworCQllbHNlIGlmIChyZXYgPiAweEMyICYmIHJldiA8IDB4QzUpCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg3OSwgdG1wIHwgMHgwMik7CisJfQorCWlmIChyZXYgPj0gMHgyMCkgeworCQkvKgorCQkgKiBDRF9ST00gRE1BIG9uICgweDUzIGJpdCAwKS4gRW5hYmxlIHRoaXMgZXZlbiBpZiB3ZSB3YW50CisJCSAqIHRvIHVzZSBQSU8uIDB4NTMgYml0IDEgKHJldiAyMCBvbmx5KSAtIGVuYWJsZSBGSUZPIGNvbnRyb2wKKwkJICogdmlhIDB4NTQvNTUuCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDUzLCAmdG1wKTsKKwkJaWYgKHJldiA8PSAweDIwKQorCQkJdG1wICY9IH4weDAyOworCQlpZiAocmV2ID49IDB4YzcpCisJCQl0bXAgfD0gMHgwMzsKKwkJZWxzZQorCQkJdG1wIHw9IDB4MDE7CS8qIENEX1JPTSBlbmFibGUgZm9yIERNQSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MywgdG1wKTsKKwl9CisJcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CisJcGNpX2Rldl9wdXQobm9ydGgpOworCWF0YV9wY2lfY2xlYXJfc2ltcGxleChwZGV2KTsKK30KIC8qKgogICoJYWxpX2luaXRfb25lCQktCWRpc2NvdmVyeSBjYWxsYmFjawogICoJQHBkZXY6IFBDSSBkZXZpY2UgSUQKQEAgLTU2OSw3ICs2MzIsNyBAQAogCiAJc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl07CiAJdTggcmV2LCB0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKm5vcnRoLCAqaXNhX2JyaWRnZTsKKwlzdHJ1Y3QgcGNpX2RldiAqaXNhX2JyaWRnZTsKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldik7CiAKQEAgLTU4MSwxMSArNjQ0LDYgQEAKIAlpZiAocmV2IDwgMHgyMCkgewogCQlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSAmaW5mb19lYXJseTsKIAl9IGVsc2UgaWYgKHJldiA8IDB4QzIpIHsKLQkJLyogMTU0My1FL0YsIDE1NDNDLUMsIDE1NDNDLUQsIDE1NDNDLUUgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgJnRtcCk7Ci0JCS8qIENsZWFyIENELVJPTSBETUEgd3JpdGUgYml0ICovCi0JCXRtcCAmPSAweDdGOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgdG1wKTsKICAgICAgICAgCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvXzIwOwogCX0gZWxzZSBpZiAocmV2ID09IDB4QzIpIHsKICAgICAgICAgCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvX2MyOwpAQCAtNTk2LDU0ICs2NTQsMjUgQEAKIAl9IGVsc2UKICAgICAgICAgCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvX2M1OwogCi0JaWYgKHJldiA+PSAweEMyKSB7Ci0JCS8qIEVuYWJsZSBjYWJsZSBkZXRlY3Rpb24gbG9naWMgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgJnRtcCk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRCLCB0bXAgfCAweDA4KTsKLQl9Ci0KLQlub3J0aCA9IHBjaV9nZXRfc2xvdChwZGV2LT5idXMsIFBDSV9ERVZGTigwLDApKTsKKwlhbGlfaW5pdF9jaGlwc2V0KHBkZXYpOworCQogCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCBOVUxMKTsKLQotCWlmIChub3J0aCAmJiBub3J0aC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQUwpIHsKLQkJLyogQ29uZmlndXJlIHRoZSBBTGkgYnJpZGdlIGxvZ2ljLiBGb3Igbm9uIEFMaSByZWx5IG9uIEJJT1MuCi0JCSAgIFNldCB0aGUgc291dGggYnJpZGdlIGVuYWJsZSBiaXQgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg3OSwgJnRtcCk7Ci0JCWlmIChyZXYgPT0gMHhDMikKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDc5LCB0bXAgfCAweDA0KTsKLQkJZWxzZSBpZiAocmV2ID4gMHhDMikKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDc5LCB0bXAgfCAweDAyKTsKKwlpZiAoaXNhX2JyaWRnZSAmJiByZXYgPj0gMHgyMCAmJiByZXYgPCAweEMyKSB7CisJCS8qIEFyZSB3ZSBwYWlyZWQgd2l0aCBhIFVETUEgY2FwYWJsZSBjaGlwICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NUUsICZ0bXApOworCQlpZiAoKHRtcCAmIDB4MUUpID09IDB4MTIpCisJICAgICAgICAJcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gJmluZm9fMjBfdWRtYTsKKwkJcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CiAJfQotCi0JaWYgKHJldiA+PSAweDIwKSB7Ci0JCWlmIChyZXYgPCAweEMyKSB7Ci0JCQkvKiBBcmUgd2UgcGFpcmVkIHdpdGggYSBVRE1BIGNhcGFibGUgY2hpcCAqLwotCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg1RSwgJnRtcCk7Ci0JCQlpZiAoKHRtcCAmIDB4MUUpID09IDB4MTIpCi0JCSAgICAgICAgCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvXzIwX3VkbWE7Ci0JCX0KLQkJLyoKLQkJICogQ0RfUk9NIERNQSBvbiAoMHg1MyBiaXQgMCkuIEVuYWJsZSB0aGlzIGV2ZW4gaWYgd2Ugd2FudAotCQkgKiB0byB1c2UgUElPLiAweDUzIGJpdCAxIChyZXYgMjAgb25seSkgLSBlbmFibGUgRklGTyBjb250cm9sCi0JCSAqIHZpYSAweDU0LzU1LgotCQkgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg1MywgJnRtcCk7Ci0JCWlmIChyZXYgPD0gMHgyMCkKLQkJCXRtcCAmPSB+MHgwMjsKLQkJaWYgKHJldiA+PSAweGM3KQotCQkJdG1wIHw9IDB4MDM7Ci0JCWVsc2UKLQkJCXRtcCB8PSAweDAxOwkvKiBDRF9ST00gZW5hYmxlIGZvciBETUEgKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTMsIHRtcCk7Ci0JfQotCi0JcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7Ci0JcGNpX2Rldl9wdXQobm9ydGgpOwotCi0JYXRhX3BjaV9jbGVhcl9zaW1wbGV4KHBkZXYpOwogCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7CiB9CiAKK3N0YXRpYyBpbnQgYWxpX3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJYWxpX2luaXRfY2hpcHNldChwZGV2KTsKKwlyZXR1cm4gYXRhX3BjaV9kZXZpY2VfcmVzdW1lKHBkZXYpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWxpW10gPSB7CiAJeyBQQ0lfVkRFVklDRShBTCwgUENJX0RFVklDRV9JRF9BTF9NNTIyOCksIH0sCiAJeyBQQ0lfVkRFVklDRShBTCwgUENJX0RFVklDRV9JRF9BTF9NNTIyOSksIH0sCkBAIC02NTUsNyArNjg0LDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gYWxpLAogCS5wcm9iZSAJCT0gYWxpX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWxpX3JlaW5pdF9vbmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhbGlfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKaW5kZXggMjkyMzRjOC4uYTZiMzMwMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2FtZCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi40IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjciCiAKIC8qKgogICoJdGltaW5nX3NldHVwCQktCXNoYXJlZCB0aW1pbmcgY29tcHV0YXRpb24gYW5kIGxvYWQKQEAgLTMyNiwxNCArMzI2LDE2IEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKKwkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAorCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFtZDMzX3BvcnRfb3BzID0gewpAQCAtNjYxLDYgKzY2MywyMyBAQAogCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7CiB9CiAKK3N0YXRpYyBpbnQgYW1kX3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCkgeworCQl1OCBmaWZvOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQxLCAmZmlmbyk7CisJCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQxMSkKKwkJCS8qIEZJRk8gaXMgYnJva2VuICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MSwgZmlmbyAmIDB4MEYpOworCQllbHNlCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MSwgZmlmbyB8IDB4RjApOworCQlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQU1EX1ZJUEVSXzc0MDkgfHwKKwkJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF9DT0JSQV83NDAxKQorCQkgICAgCWF0YV9wY2lfY2xlYXJfc2ltcGxleChwZGV2KTsKKwl9CisJcmV0dXJuIGF0YV9wY2lfZGV2aWNlX3Jlc3VtZShwZGV2KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtZFtdID0gewogCXsgUENJX1ZERVZJQ0UoQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9DT0JSQV83NDAxKSwJCTAgfSwKIAl7IFBDSV9WREVWSUNFKEFNRCwJUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQwOSksCQkxIH0sCkBAIC02NzcsNiArNjk2LDggQEAKIAl7IFBDSV9WREVWSUNFKE5WSURJQSwJUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDUxX0lERSksCTggfSwKIAl7IFBDSV9WREVWSUNFKE5WSURJQSwJUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDU1X0lERSksCTggfSwKIAl7IFBDSV9WREVWSUNFKE5WSURJQSwJUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDYxX0lERSksCTggfSwKKwl7IFBDSV9WREVWSUNFKE5WSURJQSwJUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDY1X0lERSksCTggfSwKKwl7IFBDSV9WREVWSUNFKE5WSURJQSwJUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDY3X0lERSksCTggfSwKIAl7IFBDSV9WREVWSUNFKEFNRCwJUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0lERSksCQk5IH0sCiAKIAl7IH0sCkBAIC02ODYsNyArNzA3LDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gYW1kLAogCS5wcm9iZSAJCT0gYW1kX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYW1kX3JlaW5pdF9vbmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhbWRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCmluZGV4IDY5MDgyOGUuLjM3YmMxMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQ5LCAmdG1wKTsKLQlpZiAodG1wICYgKDEgPj4gYXAtPnBvcnRfbm8pKQorCWlmICh0bXAgJiAoMSA8PCBhcC0+cG9ydF9ubykpCiAJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAllbHNlCiAJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKQEAgLTMwNywxMyArMzA3LDEzIEBACiAJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKIAkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAotCS5tYXhfc2VjdG9ycwkJPSBBVEFfTUFYX1NFQ1RPUlMsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCmluZGV4IDFjZTI4ZDIuLjZmNjY3MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2F0aWl4cCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNC4zIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjQiCiAKIGVudW0gewogCUFUSUlYUF9JREVfUElPX1RJTUlORwk9IDB4NDAsCkBAIC0yMDksMTQgKzIwOSwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhdGlpeHBfcG9ydF9vcHMgPSB7CkBAIC0yODAsNyArMjgyLDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gYXRpaXhwLAogCS5wcm9iZSAJCT0gYXRpaXhwX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnJlc3VtZQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgYXRpaXhwX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCmluZGV4IGI5YmJkMWQuLjE1ODQxYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2NtZDY0eCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi4xIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjIiCiAKIC8qCiAgKiBDTUQ2NHggc3BlY2lmaWMgcmVnaXN0ZXJzIGRlZmluaXRpb24uCkBAIC0yNjgsMTQgKzI2OCwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBjbWQ2NHhfcG9ydF9vcHMgPSB7CkBAIC00NjgsNiArNDcwLDIwIEBACiAJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKIH0KIAorc3RhdGljIGludCBjbWQ2NHhfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1OCBtcmRtb2RlOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgNjQpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE1SRE1PREUsICZtcmRtb2RlKTsKKwltcmRtb2RlICY9IH4gMHgzMDsJLyogSVJRIHNldCB1cCAqLworCW1yZG1vZGUgfD0gMHgwMjsJLyogTWVtb3J5IHJlYWQgbGluZSBlbmFibGUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTVJETU9ERSwgbXJkbW9kZSk7CisjaWZkZWYgQ09ORklHX1BQQworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBVRElERVRDUjAsIDB4RjApOworI2VuZGlmCisJcmV0dXJuIGF0YV9wY2lfZGV2aWNlX3Jlc3VtZShwZGV2KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNtZDY0eFtdID0gewogCXsgUENJX1ZERVZJQ0UoQ01ELCBQQ0lfREVWSUNFX0lEX0NNRF82NDMpLCAwIH0sCiAJeyBQQ0lfVkRFVklDRShDTUQsIFBDSV9ERVZJQ0VfSURfQ01EXzY0NiksIDEgfSwKQEAgLTQ4MSw3ICs0OTcsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBjbWQ2NHgsCiAJLnByb2JlIAkJPSBjbWQ2NHhfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBjbWQ2NHhfcmVpbml0X29uZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtZDY0eF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYwppbmRleCAyY2QzYzBmLi45ZjE2NWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9jczU1MjAiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuMiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNi4zIgogCiBzdHJ1Y3QgcGlvX2Nsb2NrcwogewpAQCAtMTU5LDE0ICsxNTksMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgY3M1NTIwX3BvcnRfb3BzID0gewpAQCAtMjk2LDYgKzI5OCwyMiBAQAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogfQogCisvKioKKyAqCWNzNTUyMF9yZWluaXRfb25lCS0JZGV2aWNlIHJlc3VtZQorICoJQHBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKglEbyBhbnkgcmVjb25maWd1cmF0aW9uIHdvcmsgbmVlZGVkIGJ5IGEgcmVzdW1lIGZyb20gUkFNLiBXZSBuZWVkCisgKgl0byByZXN0b3JlIERNQSBtb2RlIHN1cHBvcnQgb24gQklPU2VuIHdoaWNoIGRpc2FibGVkIGl0CisgKi8KKyAKK3N0YXRpYyBpbnQgY3M1NTIwX3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTggcGNpY2ZnOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NjAsICZwY2ljZmcpOworCWlmICgocGNpY2ZnICYgMHg0MCkgPT0gMCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NjAsIHBjaWNmZyB8IDB4NDApOworCXJldHVybiBhdGFfcGNpX2RldmljZV9yZXN1bWUocGRldik7Cit9CiAvKiBGb3Igbm93IGtlZXAgRE1BIG9mZi4gV2UgY2FuIHNldCBpdCBmb3IgYWxsIGJ1dCBBIHJldiBDUzU1MTAgb25jZSB0aGUKICAgIGNvcmUgQVRBIGNvZGUgY2FuIGhhbmRsZSBpdCAqLwogCkBAIC0zMTAsNyArMzI4LDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gcGF0YV9jczU1MjAsCiAJLnByb2JlIAkJPSBjczU1MjBfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBjczU1MjBfcmVtb3ZlX29uZQorCS5yZW1vdmUJCT0gY3M1NTIwX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gY3M1NTIwX3JlaW5pdF9vbmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjczU1MjBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMKaW5kZXggYTA3Y2M4MS4uMWM2MjgwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzMC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfY3M1NTMwIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC43LjEiCiAKIC8qKgogICoJY3M1NTMwX3NldF9waW9tb2RlCQktCVBJTyBzZXR1cApAQCAtMTczLDE0ICsxNzMsMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgY3M1NTMwX3BvcnRfb3BzID0gewpAQCAtMjM4LDM4ICsyNDAsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorCiAvKioKLSAqCWNzNTUzMF9pbml0X29uZQkJLQlJbml0aWFsaXNlIGEgQ1M1NTMwCi0gKglAZGV2OiBQQ0kgZGV2aWNlCi0gKglAaWQ6IEVudHJ5IGluIG1hdGNoIHRhYmxlCisgKgljczU1MzBfaW5pdF9jaGlwCS0JQ2hpcHNldCBpbml0CiAgKgotICoJSW5zdGFsbCBhIGRyaXZlciBmb3IgdGhlIG5ld2x5IGZvdW5kIENTNTUzMCBjb21wYW5pb24gY2hpcC4gTW9zdCBvZgotICoJdGhpcyBpcyBqdXN0IGhvdXNla2VlcGluZy4gV2UgaGF2ZSB0byBzZXQgdGhlIGNoaXAgdXAgY29ycmVjdGx5IGFuZAotICoJdHVybiBvZmYgdmFyaW91cyBiaXRzIG9mIGVtdWxhdGlvbiBtYWdpYy4KKyAqCVBlcmZvcm0gdGhlIGNoaXAgaW5pdGlhbGlzYXRpb24gd29yayB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIGJvdGgKKyAqCXNldHVwIGFuZCByZXN1bWUgcGF0aHMKICAqLwotCi1zdGF0aWMgaW50IGNzNTUzMF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCisgCitzdGF0aWMgaW50IGNzNTUzMF9pbml0X2NoaXAodm9pZCkKIHsKLQlpbnQgY29tcGlsZXJfd2FybmluZ19wb2ludGxlc3NfZml4OwotCXN0cnVjdCBwY2lfZGV2ICptYXN0ZXJfMCA9IE5VTEwsICpjczU1MzBfMCA9IE5VTEw7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7Ci0JCS5zaHQgPSAmY3M1NTMwX3NodCwKLQkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TU3xBVEFfRkxBR19TUlNULAotCQkucGlvX21hc2sgPSAweDFmLAotCQkubXdkbWFfbWFzayA9IDB4MDcsCi0JCS51ZG1hX21hc2sgPSAweDA3LAotCQkucG9ydF9vcHMgPSAmY3M1NTMwX3BvcnRfb3BzCi0JfTsKLQkvKiBUaGUgZG9ja2luZyBjb25uZWN0b3IgZG9lc24ndCBkbyBVRE1BLCBhbmQgaXQgc2VlbXMgbm90IE1XRE1BICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fcGFsbWF4X3NlY29uZGFyeSA9IHsKLQkJLnNodCA9ICZjczU1MzBfc2h0LAotCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCi0JCS5waW9fbWFzayA9IDB4MWYsCi0JCS5wb3J0X29wcyA9ICZjczU1MzBfcG9ydF9vcHMKLQl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyAmaW5mbywgJmluZm8gfTsKKwlzdHJ1Y3QgcGNpX2RldiAqbWFzdGVyXzAgPSBOVUxMLCAqY3M1NTMwXzAgPSBOVUxMLCAqZGV2ID0gTlVMTDsKIAotCWRldiA9IE5VTEw7CiAJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CiAJCXN3aXRjaCAoZGV2LT5kZXZpY2UpIHsKIAkJCWNhc2UgUENJX0RFVklDRV9JRF9DWVJJWF9QQ0lfTUFTVEVSOgpAQCAtMjkwLDcgKzI3Miw3IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIoY3M1NTMwXzApOwotCWNvbXBpbGVyX3dhcm5pbmdfcG9pbnRsZXNzX2ZpeCA9IHBjaV9zZXRfbXdpKGNzNTUzMF8wKTsKKwlwY2lfc2V0X213aShjczU1MzBfMCk7CiAKIAkvKgogCSAqIFNldCBQQ0kgQ2FjaGVMaW5lU2l6ZSB0byAxNi1ieXRlczoKQEAgLTMzOCwxMyArMzIwLDcgQEAKIAogCXBjaV9kZXZfcHV0KG1hc3Rlcl8wKTsKIAlwY2lfZGV2X3B1dChjczU1MzBfMCk7Ci0KLQlpZiAoY3M1NTMwX2lzX3BhbG1heCgpKQotCQlwb3J0X2luZm9bMV0gPSAmaW5mb19wYWxtYXhfc2Vjb25kYXJ5OwotCi0JLyogTm93IGtpY2sgb2ZmIEFUQSBzZXQgdXAgKi8KLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMik7Ci0KKwlyZXR1cm4gMDsKIGZhaWxfcHV0OgogCWlmIChtYXN0ZXJfMCkKIAkJcGNpX2Rldl9wdXQobWFzdGVyXzApOwpAQCAtMzUzLDYgKzMyOSw1MyBAQAogCXJldHVybiAtRU5PREVWOwogfQogCisvKioKKyAqCWNzNTUzMF9pbml0X29uZQkJLQlJbml0aWFsaXNlIGEgQ1M1NTMwCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKglAaWQ6IEVudHJ5IGluIG1hdGNoIHRhYmxlCisgKgorICoJSW5zdGFsbCBhIGRyaXZlciBmb3IgdGhlIG5ld2x5IGZvdW5kIENTNTUzMCBjb21wYW5pb24gY2hpcC4gTW9zdCBvZgorICoJdGhpcyBpcyBqdXN0IGhvdXNla2VlcGluZy4gV2UgaGF2ZSB0byBzZXQgdGhlIGNoaXAgdXAgY29ycmVjdGx5IGFuZAorICoJdHVybiBvZmYgdmFyaW91cyBiaXRzIG9mIGVtdWxhdGlvbiBtYWdpYy4KKyAqLworCitzdGF0aWMgaW50IGNzNTUzMF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCQkuc2h0ID0gJmNzNTUzMF9zaHQsCisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVCwKKwkJLnBpb19tYXNrID0gMHgxZiwKKwkJLm13ZG1hX21hc2sgPSAweDA3LAorCQkudWRtYV9tYXNrID0gMHgwNywKKwkJLnBvcnRfb3BzID0gJmNzNTUzMF9wb3J0X29wcworCX07CisJLyogVGhlIGRvY2tpbmcgY29ubmVjdG9yIGRvZXNuJ3QgZG8gVURNQSwgYW5kIGl0IHNlZW1zIG5vdCBNV0RNQSAqLworCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX3BhbG1heF9zZWNvbmRhcnkgPSB7CisJCS5zaHQgPSAmY3M1NTMwX3NodCwKKwkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TU3xBVEFfRkxBR19TUlNULAorCQkucGlvX21hc2sgPSAweDFmLAorCQkucG9ydF9vcHMgPSAmY3M1NTMwX3BvcnRfb3BzCisJfTsKKwlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsgJmluZm8sICZpbmZvIH07CisJCisJLyogQ2hpcCBpbml0aWFsaXNhdGlvbiAqLworCWlmIChjczU1MzBfaW5pdF9jaGlwKCkpCisJCXJldHVybiAtRU5PREVWOworCQkKKwlpZiAoY3M1NTMwX2lzX3BhbG1heCgpKQorCQlwb3J0X2luZm9bMV0gPSAmaW5mb19wYWxtYXhfc2Vjb25kYXJ5OworCisJLyogTm93IGtpY2sgb2ZmIEFUQSBzZXQgdXAgKi8KKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOworfQorCitzdGF0aWMgaW50IGNzNTUzMF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCS8qIElmIHdlIGZhaWwgb24gcmVzdW1lIHdlIGFyZSBkb29tZWQgKi8KKwlCVUdfT04oY3M1NTMwX2luaXRfY2hpcCgpKTsKKwlyZXR1cm4gYXRhX3BjaV9kZXZpY2VfcmVzdW1lKHBkZXYpOworfQorCQogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNzNTUzMFtdID0gewogCXsgUENJX1ZERVZJQ0UoQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUzMF9JREUpLCB9LAogCkBAIC0zNjMsNyArMzg2LDkgQEAKIAkubmFtZSAJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gY3M1NTMwLAogCS5wcm9iZSAJCT0gY3M1NTMwX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gY3M1NTMwX3JlaW5pdF9vbmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjczU1MzBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKaW5kZXggZjhkZWYzZi4uZTNlZmVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJjczU1MzUiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjIuMTAiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjIuMTEiCiAKIC8qCiAgKglUaGUgR2VvZGUgKEFrYSBBdGhsb24gR1ggbm93KSB1c2VzIGFuIGludGVybmFsIE1TUiBiYXNlZApAQCAtMTc3LDE0ICsxNzcsMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgY3M1NTM1X3BvcnRfb3BzID0gewpAQCAtMjY3LDcgKzI2OSw5IEBACiAJLm5hbWUJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gY3M1NTM1LAogCS5wcm9iZSAJCT0gY3M1NTM1X2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRhX3BjaV9kZXZpY2VfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY3M1NTM1X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jIGIvZHJpdmVycy9hdGEvcGF0YV9jeXByZXNzLmMKaW5kZXggMjQ3YjQzNi4uZTJhOTU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jeXByZXNzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jeXByZXNzLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9jeXByZXNzIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xLjIiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEuNCIKIAogLyogaGVyZSBhcmUgdGhlIG9mZnNldCBkZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycyAqLwogCkBAIC0xMjgsMTQgKzEyOCwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBjeTgyYzY5M19wb3J0X29wcyA9IHsKQEAgLTIwMyw3ICsyMDUsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBjeTgyYzY5MywKIAkucHJvYmUgCQk9IGN5ODJjNjkzX2luaXRfb25lLAotCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXRhX3BjaV9kZXZpY2VfcmVzdW1lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY3k4MmM2OTNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYwppbmRleCBlZjE4YzYwLi5lZGY4YTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2VmYXIiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuMiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC4zIgogCiAvKioKICAqCWVmYXJfcHJlX3Jlc2V0CS0JY2hlY2sgZm9yIDQwLzgwIHBpbgpAQCAtMjI2LDE0ICsyMjYsMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgZWZhcl9vcHMgPSB7CkBAIC0zMTUsNiArMzE3LDggQEAKIAkuaWRfdGFibGUJCT0gZWZhcl9wY2lfdGJsLAogCS5wcm9iZQkJCT0gZWZhcl9pbml0X29uZSwKIAkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisJLnN1c3BlbmQJCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBhdGFfcGNpX2RldmljZV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBlZmFyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCmluZGV4IDZkM2U0YzAuLjI2NjM1OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2hwdDM2NiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNS4zIgogCiBzdHJ1Y3QgaHB0X2Nsb2NrIHsKIAl1OAl4ZmVyX3NwZWVkOwpAQCAtMjIyLDkgKzIyMiwxNyBAQAogCiBzdGF0aWMgaW50IGhwdDM2eF9wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9iaXRzIGhwdDM2eF9lbmFibGVfYml0c1tdID0geworCQl7IDB4NTAsIDEsIDB4MDQsIDB4MDQgfSwKKwkJeyAweDU0LCAxLCAweDA0LCAweDA0IH0KKwl9OworCiAJdTggYXRhNjY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmaHB0MzZ4X2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOworCQkKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDVBLCAmYXRhNjYpOwogCWlmIChhdGE2NiAmICgxIDw8IGFwLT5wb3J0X25vKSkKIAkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwpAQCAtMzIyLDE0ICszMzAsMTYgQEAKIAkuY2FuX3F1ZXVlCQk9IEFUQV9ERUZfUVVFVUUsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gTElCQVRBX01BWF9QUkQsCi0JLm1heF9zZWN0b3JzCQk9IEFUQV9NQVhfU0VDVE9SUywKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKIAkuZW11bGF0ZWQJCT0gQVRBX1NIVF9FTVVMQVRFRCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gQVRBX1NIVF9VU0VfQ0xVU1RFUklORywKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAorCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCisJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCiB9OwogCiAvKgpAQCAtMzcyLDYgKzM4MiwyNyBAQAogfTsKIAogLyoqCisgKglocHQzNnhfaW5pdF9jaGlwc2V0CS0JY29tbW9uIGNoaXAgc2V0dXAKKyAqCUBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKglQZXJmb3JtIHRoZSBjaGlwIHNldHVwIHdvcmsgdGhhdCBtdXN0IGJlIGRvbmUgYXQgYm90aCBpbml0IGFuZAorICoJcmVzdW1lIHRpbWUKKyAqLworCitzdGF0aWMgdm9pZCBocHQzNnhfaW5pdF9jaGlwc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTggZHJpdmVfZmFzdDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAoTDFfQ0FDSEVfQllURVMgLyA0KSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NzgpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9NSU5fR05ULCAweDA4KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTUFYX0xBVCwgMHgwOCk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTEsICZkcml2ZV9mYXN0KTsKKwlpZiAoZHJpdmVfZmFzdCAmIDB4ODApCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTEsIGRyaXZlX2Zhc3QgJiB+MHg4MCk7Cit9CisKKy8qKgogICoJaHB0MzZ4X2luaXRfb25lCQktCUluaXRpYWxpc2UgYW4gSFBUMzY2LzM2OAogICoJQGRldjogUENJIGRldmljZQogICoJQGlkOiBFbnRyeSBpbiBtYXRjaCB0YWJsZQpAQCAtNDA2LDcgKzQzNyw2IEBACiAKIAl1MzIgY2xhc3NfcmV2OwogCXUzMiByZWcxOwotCXU4IGRyaXZlX2Zhc3Q7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOwogCWNsYXNzX3JldiAmPSAweEZGOwpAQCAtNDE2LDE0ICs0NDYsNyBAQAogCWlmIChjbGFzc19yZXYgPiAyKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAoTDFfQ0FDSEVfQllURVMgLyA0KSk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NzgpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9NSU5fR05ULCAweDA4KTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTUFYX0xBVCwgMHgwOCk7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTEsICZkcml2ZV9mYXN0KTsKLQlpZiAoZHJpdmVfZmFzdCAmIDB4ODApCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTEsIGRyaXZlX2Zhc3QgJiB+MHg4MCk7CisJaHB0MzZ4X2luaXRfY2hpcHNldChkZXYpOwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgICZyZWcxKTsKIApAQCAtNDQ0LDkgKzQ2NywxNSBAQAogCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcG9ydF9pbmZvLCAyKTsKIH0KIAorc3RhdGljIGludCBocHQzNnhfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWhwdDM2eF9pbml0X2NoaXBzZXQoZGV2KTsKKwlyZXR1cm4gYXRhX3BjaV9kZXZpY2VfcmVzdW1lKGRldik7Cit9CisKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGhwdDM2eFtdID0gewogCXsgUENJX1ZERVZJQ0UoVFRJLCBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNjYpLCB9LAotCiAJeyB9LAogfTsKIApAQCAtNDU0LDcgKzQ4Myw5IEBACiAJLm5hbWUgCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IGhwdDM2eCwKIAkucHJvYmUgCQk9IGhwdDM2eF9pbml0X29uZSwKLQkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQorCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGhwdDM2eF9yZWluaXRfb25lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaHB0MzZ4X2luaXQodm9pZCkKQEAgLTQ2MiwxMyArNDkzLDExIEBACiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmhwdDM2eF9wY2lfZHJpdmVyKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBfX2V4aXQgaHB0MzZ4X2V4aXQodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmhwdDM2eF9wY2lfZHJpdmVyKTsKIH0KIAotCiBNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciB0aGUgSGlnaHBvaW50IEhQVDM2Ni8zNjgiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCmluZGV4IDczNTA0NDMuLjQ3MDgyZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2hwdDM3eCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNS4xIgogCiBzdHJ1Y3QgaHB0X2Nsb2NrIHsKIAl1OAl4ZmVyX3NwZWVkOwpAQCAtNDUzLDcgKzQ1MywxMyBAQAogewogCXU4IHNjcjIsIGF0YTY2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2JpdHMgaHB0Mzd4X2VuYWJsZV9iaXRzW10gPSB7CisJCXsgMHg1MCwgMSwgMHgwNCwgMHgwNCB9LAorCQl7IDB4NTQsIDEsIDB4MDQsIDB4MDQgfQorCX07CisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmaHB0Mzd4X2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOworCQkKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDVCLCAmc2NyMik7CiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NUIsIHNjcjIgJiB+MHgwMSk7CiAJLyogQ2FibGUgcmVnaXN0ZXIgbm93IGFjdGl2ZSAqLwpAQCAtNDg4LDEwICs0OTQsMTcgQEAKIAogc3RhdGljIGludCBocHQzNzRfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBocHQzN3hfZW5hYmxlX2JpdHNbXSA9IHsKKwkJeyAweDUwLCAxLCAweDA0LCAweDA0IH0sCisJCXsgMHg1NCwgMSwgMHgwNCwgMHgwNCB9CisJfTsKIAl1MTYgbWNyMywgbWNyNjsKIAl1OCBhdGE2NjsKLQogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKworCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmhwdDM3eF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQorCQlyZXR1cm4gLUVOT0VOVDsKKwkJCiAJLyogRG8gdGhlIGV4dHJhIGNoYW5uZWwgd29yayAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NTIsICZtY3IzKTsKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDU2LCAmbWNyNik7CkBAIC03NTUsMTMgKzc2OCwxMyBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4Mm4uYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCmluZGV4IDU4Y2ZiMmIuLmY2ODE3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCkBAIC0zMzQsMTMgKzMzNCwxMyBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwppbmRleCAzMzM0ZDcyLi41ZjFkMzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9ocHQzeDMiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC4yIgogCiBzdGF0aWMgaW50IGhwdDN4M19wcm9iZV9pbml0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CkBAIC0xMTEsMTQgKzExMSwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBocHQzeDNfcG9ydF9vcHMgPSB7CkBAIC0xNTcsNiArMTU5LDI3IEBACiB9OwogCiAvKioKKyAqCWhwdDN4M19pbml0X2NoaXBzZXQJLQljaGlwIHNldHVwCisgKglAZGV2OiBQQ0kgZGV2aWNlCisgKgorICoJUGVyZm9ybSB0aGUgc2V0dXAgcmVxdWlyZWQgYXQgYm9vdCBhbmQgb24gcmVzdW1lLgorICovCisgCitzdGF0aWMgdm9pZCBocHQzeDNfaW5pdF9jaGlwc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTE2IGNtZDsKKwkvKiBJbml0aWFsaXplIHRoZSBib2FyZCAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4ODAsIDB4MDApOworCS8qIENoZWNrIGlmIGl0IGlzIGEgMzQzIG9yIGEgMzYzLiAzNjMgaGFzIENPTU1BTkRfTUVNT1JZIHNldCAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCWlmIChjbWQgJiBQQ0lfQ09NTUFORF9NRU1PUlkpCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweEYwKTsKKwllbHNlCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDIwKTsKK30KKworCisvKioKICAqCWhwdDN4M19pbml0X29uZQkJLQlJbml0aWFsaXNlIGFuIEhQVDM0My8zNjMKICAqCUBkZXY6IFBDSSBkZXZpY2UKICAqCUBpZDogRW50cnkgaW4gbWF0Y2ggdGFibGUKQEAgLTE3NywyMSArMjAwLDE4IEBACiAJCS5wb3J0X29wcyA9ICZocHQzeDNfcG9ydF9vcHMKIAl9OwogCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyAmaW5mbywgJmluZm8gfTsKLQl1MTYgY21kOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgYm9hcmQgKi8KLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDgwLCAweDAwKTsKLQkvKiBDaGVjayBpZiBpdCBpcyBhIDM0MyBvciBhIDM2My4gMzYzIGhhcyBDT01NQU5EX01FTU9SWSBzZXQgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlpZiAoY21kICYgUENJX0NPTU1BTkRfTUVNT1JZKQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHhGMCk7Ci0JZWxzZQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHgyMCk7Ci0KKwlocHQzeDNfaW5pdF9jaGlwc2V0KGRldik7CiAJLyogTm93IGtpY2sgb2ZmIEFUQSBzZXQgdXAgKi8KIAlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMik7CiB9CiAKK3N0YXRpYyBpbnQgaHB0M3gzX3JlaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlocHQzeDNfaW5pdF9jaGlwc2V0KGRldik7CisJcmV0dXJuIGF0YV9wY2lfZGV2aWNlX3Jlc3VtZShkZXYpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaHB0M3gzW10gPSB7CiAJeyBQQ0lfVkRFVklDRShUVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM0MyksIH0sCiAKQEAgLTIwMiw3ICsyMjIsOSBAQAogCS5uYW1lIAkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBocHQzeDMsCiAJLnByb2JlIAkJPSBocHQzeDNfaW5pdF9vbmUsCi0JLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKKwkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBocHQzeDNfcmVpbml0X29uZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGhwdDN4M19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2lzYXBucC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pc2FwbnAuYwppbmRleCA2NDBiOGIwLi5hOTdkNTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2lzYXBucC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXNhcG5wLmMKQEAgLTI3LDEzICsyNywxMyBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkubWF4X3NlY3RvcnMJCT0gQVRBX01BWF9TRUNUT1JTLAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYwppbmRleCAxOGZmM2U1Li4wYjU2ZmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2l0ODIxeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4yIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zLjMiCiAKIHN0cnVjdCBpdDgyMXhfZGV2CiB7CkBAIC02NjYsMTYgKzY2NiwxNiBAQAogCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKLQkvKiAyNTUgc2VjdG9ycyB0byBiZWdpbiB3aXRoLiBUaGlzIGlzIGxvY2tlZCBpbiBzbWFydCBtb2RlIGJ1dCBub3QKLQkgICBpbiBwYXNzIHRocm91Z2ggKi8KLQkubWF4X3NlY3RvcnMJCT0gMjU1LAogCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAogCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAogCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBpdDgyMXhfc21hcnRfcG9ydF9vcHMgPSB7CkBAIC04MDgsNiArODA4LDE0IEBACiAJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKIH0KIAorc3RhdGljIGludCBpdDgyMXhfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwkvKiBSZXN1bWUgLSB0dXJuIHJhaWQgYmFjayBvZmYgaWYgbmVlZCBiZSAqLworCWlmIChpdDgyMTJfbm9yYWlkKQorCQlpdDgyMXhfZGlzYWJsZV9yYWlkKHBkZXYpOworCXJldHVybiBhdGFfcGNpX2RldmljZV9yZXN1bWUocGRldik7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpdDgyMXhbXSA9IHsKIAl7IFBDSV9WREVWSUNFKElURSwgUENJX0RFVklDRV9JRF9JVEVfODIxMSksIH0sCiAJeyBQQ0lfVkRFVklDRShJVEUsIFBDSV9ERVZJQ0VfSURfSVRFXzgyMTIpLCB9LApAQCAtODE5LDcgKzgyNyw5IEBACiAJLm5hbWUgCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IGl0ODIxeCwKIAkucHJvYmUgCQk9IGl0ODIxeF9pbml0X29uZSwKLQkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQorCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5zdXNwZW5kCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGl0ODIxeF9yZWluaXRfb25lLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaXQ4MjF4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXhwNHh4X2NmLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODkyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogaXhwNHh4IFBBVEEvQ29tcGFjdCBGbGFzaCBkcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNiBUb3dlciBUZWNobm9sb2dpZXMKKyAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+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+IDMzTWh6IFZMQgorICoKKyAqCVJlZ2lzdGVyIGEgVkxCIGJ1cyBJREUgaW50ZXJmYWNlLiBTdWNoIGludGVyZmFjZXMgYXJlIFBJTyBhbmQgd2UKKyAqCWFzc3VtZSBkbyBub3Qgc3VwcG9ydCBJUlEgc2hhcmluZy4KKyAqLworCitzdGF0aWMgX19pbml0IGludCB3aW5ib25kX2luaXRfb25lKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlzdHJ1Y3QgYXRhX3Byb2JlX2VudCBhZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCByZXQ7CisJdTggcmVnOworCWludCBpOworCisJcmVnID0gd2luYm9uZF9yZWFkY2ZnKHBvcnQsIDB4ODEpOworCXJlZyB8PSAweDgwOwkvKiBqdW1wZXJlZCBtb2RlIG9mZiAqLworCXdpbmJvbmRfd3JpdGVjZmcocG9ydCwgMHg4MSwgcmVnKTsKKwlyZWcgPSB3aW5ib25kX3JlYWRjZmcocG9ydCwgMHg4Myk7CisJcmVnIHw9IDB4RjA7CS8qIGxvY2FsIGNvbnRyb2wgKi8KKwl3aW5ib25kX3dyaXRlY2ZnKHBvcnQsIDB4ODMsIHJlZyk7CisJcmVnID0gd2luYm9uZF9yZWFkY2ZnKHBvcnQsIDB4ODUpOworCXJlZyB8PSAweEYwOwkvKiBwcm9ncmFtbWFibGUgdGltaW5nICovCisJd2luYm9uZF93cml0ZWNmZyhwb3J0LCAweDg1LCByZWcpOworCisJcmVnID0gd2luYm9uZF9yZWFkY2ZnKHBvcnQsIDB4ODEpOworCQorCWlmICghKHJlZyAmIDB4MDMpKQkJLyogRGlzYWJsZWQgKi8KKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMiA7IGkgKyspIHsKKworCQlpZiAocmVnICYgKDEgPDwgaSkpIHsJCQorCQkJLyoKKwkJCSAqCUZpbGwgaW4gYSBwcm9iZSBzdHJ1Y3R1cmUgZmlyc3Qgb2YgYWxsCisJCQkgKi8KKworCQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJWX05BTUUsIG5yX3dpbmJvbmRfaG9zdCwgTlVMTCwgMCk7CisJCQlpZiAocGRldiA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQltZW1zZXQoJmFlLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wcm9iZV9lbnQpKTsKKwkJCUlOSVRfTElTVF9IRUFEKCZhZS5ub2RlKTsKKwkJCWFlLmRldiA9ICZwZGV2LT5kZXY7CisKKwkJCWFlLnBvcnRfb3BzID0gJndpbmJvbmRfcG9ydF9vcHM7CisJCQlhZS5waW9fbWFzayA9IDB4MUY7CisKKwkJCWFlLnNodCA9ICZ3aW5ib25kX3NodDsKKwkKKwkJCWFlLm5fcG9ydHMgPSAxOworCQkJYWUuaXJxID0gMTQgKyBpOworCQkJYWUuaXJxX2ZsYWdzID0gMDsKKwkJCWFlLnBvcnRfZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVDsKKwkJCWFlLnBvcnRbMF0uY21kX2FkZHIgPSAweDFGMCAtICgweDgwICogaSk7CisJCQlhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0gYWUucG9ydFswXS5jbWRfYWRkciArIDB4MDIwNjsKKwkJCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyOworCQkJYXRhX3N0ZF9wb3J0cygmYWUucG9ydFswXSk7CisJCQkvKgorCQkJICoJSG9vayBpbiBhIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgcGVyIGNoYW5uZWwKKwkJCSAqLworCQkJYWUucHJpdmF0ZV9kYXRhID0gJndpbmJvbmRfZGF0YVtucl93aW5ib25kX2hvc3RdOworCQkJd2luYm9uZF9kYXRhW25yX3dpbmJvbmRfaG9zdF0uY29uZmlnID0gcG9ydDsKKwkJCXdpbmJvbmRfZGF0YVtucl93aW5ib25kX2hvc3RdLnBsYXRmb3JtX2RldiA9IHBkZXY7CisKKwkJCXJldCA9IGF0YV9kZXZpY2VfYWRkKCZhZSk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJCXdpbmJvbmRfaG9zdFtucl93aW5ib25kX2hvc3QrK10gPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl3aW5ib25kX2luaXQJCS0JYXR0YWNoIHdpbmJvbmQgaW50ZXJmYWNlcworICoKKyAqCUF0dGFjaCB3aW5ib25kIElERSBpbnRlcmZhY2VzIGJ5IHNjYW5uaW5nIHRoZSBwb3J0cyBpdCBtYXkgb2NjdXB5LgorICovCisKK3N0YXRpYyBfX2luaXQgaW50IHdpbmJvbmRfaW5pdCh2b2lkKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGNvbmZpZ1syXSA9IHsgMHgxMzAsIDB4MUIwIH07CisKKwlpbnQgY3QgPSAwOworCWludCBpOworCQorCWlmIChwcm9iZV93aW5ib25kID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKyAJICoJQ2hlY2sgYm90aCBiYXNlIGFkZHJlc3NlcworCSAqLworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAocHJvYmVfd2luYm9uZCAmICgxPDxpKSkgeworCQkJaW50IHJldCA9IDA7CisJCQl1bnNpZ25lZCBsb25nIHBvcnQgPSBjb25maWdbaV07CisKKwkJCWlmIChyZXF1ZXN0X3JlZ2lvbihwb3J0LCAyLCAicGF0YV93aW5ib25kIikpIHsKKwkJCQlyZXQgPSB3aW5ib25kX2luaXRfb25lKHBvcnQpOworCQkJCWlmKHJldCA8PSAwKQorCQkJCQlyZWxlYXNlX3JlZ2lvbihwb3J0LCAyKTsKKwkJCQllbHNlIGN0Kz0gcmV0OworCQkJfQorCQl9CisJfQorCWlmIChjdCAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHdpbmJvbmRfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX3dpbmJvbmRfaG9zdDsgaSsrKSB7CisJCWF0YV9ob3N0X3JlbW92ZSh3aW5ib25kX2hvc3RbaV0pOworCQlyZWxlYXNlX3JlZ2lvbih3aW5ib25kX2RhdGFbaV0uY29uZmlnLCAyKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod2luYm9uZF9kYXRhW2ldLnBsYXRmb3JtX2Rldik7CisJfQorfQorCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciBXaW5ib25kIFZMIEFUQSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfaW5pdCh3aW5ib25kX2luaXQpOworbW9kdWxlX2V4aXQod2luYm9uZF9leGl0KTsKKworbW9kdWxlX3BhcmFtKHByb2JlX3dpbmJvbmQsIGludCwgMCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BkY19hZG1hLmMgYi9kcml2ZXJzL2F0YS9wZGNfYWRtYS5jCmluZGV4IDkwMjFlMzQuLjkwNzg2ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BkY19hZG1hLmMKKysrIGIvZHJpdmVycy9hdGEvcGRjX2FkbWEuYwpAQCAtNTUxLDcgKzU1MSw3IEBACiAJCXJldHVybiByYzsKIAlhZG1hX2VudGVyX3JlZ19tb2RlKGFwKTsKIAlyYyA9IC1FTk9NRU07Ci0JcHAgPSBrY2FsbG9jKDEsIHNpemVvZigqcHApLCBHRlBfS0VSTkVMKTsKKwlwcCA9IGt6YWxsb2Moc2l6ZW9mKCpwcCksIEdGUF9LRVJORUwpOwogCWlmICghcHApCiAJCWdvdG8gZXJyX291dDsKIAlwcC0+cGt0ID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgQURNQV9QS1RfQllURVMsICZwcC0+cGt0X2RtYSwKQEAgLTY3Miw3ICs2NzIsNyBAQAogCWlmIChyYykKIAkJZ290byBlcnJfb3V0X2lvdW5tYXA7CiAKLQlwcm9iZV9lbnQgPSBrY2FsbG9jKDEsIHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7CisJcHJvYmVfZW50ID0ga3phbGxvYyhzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOwogCWlmIChwcm9iZV9lbnQgPT0gTlVMTCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9udi5jIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCmluZGV4IDMyM2I2MDcuLjBkMzE2ZWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCkBAIC0yOSw2ICsyOSwxMSBAQAogICogIE5WLXNwZWNpZmljIGRldGFpbHMgc3VjaCBhcyByZWdpc3RlciBvZmZzZXRzLCBTQVRBIHBoeSBsb2NhdGlvbiwKICAqICBob3RwbHVnIGluZm8sIGV0Yy4KICAqCisgKiAgQ0s4MDQvTUNQMDQgY29udHJvbGxlcnMgc3VwcG9ydCBhbiBhbHRlcm5hdGUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlCisgKiAgc2ltaWxhciB0byB0aGUgQURNQSBzcGVjaWZpY2F0aW9uICh3aXRoIHNvbWUgbW9kaWZpY2F0aW9ucykuCisgKiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBOQ1EuIE5vbi1ETUEtbWFwcGVkIEFUQSBjb21tYW5kcyBhcmUgc3RpbGwKKyAqICBzZW50IHRocm91Z2ggdGhlIGxlZ2FjeSBpbnRlcmZhY2UuCisgKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTQwLDEwICs0NSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCQkJInNhdGFfbnYiCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkJIjIuMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCQkiMy4yIgorCisjZGVmaW5lIE5WX0FETUFfRE1BX0JPVU5EQVJZCQkweGZmZmZmZmZmVUwKIAogZW51bSB7CiAJTlZfUE9SVFMJCQk9IDIsCkBAIC03OCw4ICs4NiwxMzggQEAKIAkvLyBGb3IgUENJIGNvbmZpZyByZWdpc3RlciAyMAogCU5WX01DUF9TQVRBX0NGR18yMAkJPSAweDUwLAogCU5WX01DUF9TQVRBX0NGR18yMF9TQVRBX1NQQUNFX0VOID0gMHgwNCwKKwlOVl9NQ1BfU0FUQV9DRkdfMjBfUE9SVDBfRU4JPSAoMSA8PCAxNyksCisJTlZfTUNQX1NBVEFfQ0ZHXzIwX1BPUlQxX0VOCT0gKDEgPDwgMTYpLAorCU5WX01DUF9TQVRBX0NGR18yMF9QT1JUMF9QV0JfRU4JPSAoMSA8PCAxNCksCisJTlZfTUNQX1NBVEFfQ0ZHXzIwX1BPUlQxX1BXQl9FTgk9ICgxIDw8IDEyKSwKKworCU5WX0FETUFfTUFYX0NQQlMJCT0gMzIsCisJTlZfQURNQV9DUEJfU1oJCQk9IDEyOCwKKwlOVl9BRE1BX0FQUkRfU1oJCQk9IDE2LAorCU5WX0FETUFfU0dUQkxfTEVOCQk9ICgxMDI0IC0gTlZfQURNQV9DUEJfU1opIC8KKwkJCQkJICAgTlZfQURNQV9BUFJEX1NaLAorCU5WX0FETUFfU0dUQkxfVE9UQUxfTEVOCQk9IE5WX0FETUFfU0dUQkxfTEVOICsgNSwKKwlOVl9BRE1BX1NHVEJMX1NaICAgICAgICAgICAgICAgID0gTlZfQURNQV9TR1RCTF9MRU4gKiBOVl9BRE1BX0FQUkRfU1osCisJTlZfQURNQV9QT1JUX1BSSVZfRE1BX1NaICAgICAgICA9IE5WX0FETUFfTUFYX0NQQlMgKgorCQkJCQkgICAoTlZfQURNQV9DUEJfU1ogKyBOVl9BRE1BX1NHVEJMX1NaKSwKKworCS8qIEJBUjUgb2Zmc2V0IHRvIEFETUEgZ2VuZXJhbCByZWdpc3RlcnMgKi8KKwlOVl9BRE1BX0dFTgkJCT0gMHg0MDAsCisJTlZfQURNQV9HRU5fQ1RMCQkJPSAweDAwLAorCU5WX0FETUFfTk9USUZJRVJfQ0xFQVIJCT0gMHgzMCwKKworCS8qIEJBUjUgb2Zmc2V0IHRvIEFETUEgcG9ydHMgKi8KKwlOVl9BRE1BX1BPUlQJCQk9IDB4NDgwLAorCisJLyogc2l6ZSBvZiBBRE1BIHBvcnQgcmVnaXN0ZXIgc3BhY2UgICovCisJTlZfQURNQV9QT1JUX1NJWkUJCT0gMHgxMDAsCisKKwkvKiBBRE1BIHBvcnQgcmVnaXN0ZXJzICovCisJTlZfQURNQV9DVEwJCQk9IDB4NDAsCisJTlZfQURNQV9DUEJfQ09VTlQJCT0gMHg0MiwKKwlOVl9BRE1BX05FWFRfQ1BCX0lEWAkJPSAweDQzLAorCU5WX0FETUFfU1RBVAkJCT0gMHg0NCwKKwlOVl9BRE1BX0NQQl9CQVNFX0xPVwkJPSAweDQ4LAorCU5WX0FETUFfQ1BCX0JBU0VfSElHSAkJPSAweDRDLAorCU5WX0FETUFfQVBQRU5ECQkJPSAweDUwLAorCU5WX0FETUFfTk9USUZJRVIJCT0gMHg2OCwKKwlOVl9BRE1BX05PVElGSUVSX0VSUk9SCQk9IDB4NkMsCisKKwkvKiBOVl9BRE1BX0NUTCByZWdpc3RlciBiaXRzICovCisJTlZfQURNQV9DVExfSE9UUExVR19JRU4JCT0gKDEgPDwgMCksCisJTlZfQURNQV9DVExfQ0hBTk5FTF9SRVNFVAk9ICgxIDw8IDUpLAorCU5WX0FETUFfQ1RMX0dPCQkJPSAoMSA8PCA3KSwKKwlOVl9BRE1BX0NUTF9BSUVOCQk9ICgxIDw8IDgpLAorCU5WX0FETUFfQ1RMX1JFQURfTk9OX0NPSEVSRU5UCT0gKDEgPDwgMTEpLAorCU5WX0FETUFfQ1RMX1dSSVRFX05PTl9DT0hFUkVOVAk9ICgxIDw8IDEyKSwKKworCS8qIENQQiByZXNwb25zZSBmbGFnIGJpdHMgKi8KKwlOVl9DUEJfUkVTUF9ET05FCQk9ICgxIDw8IDApLAorCU5WX0NQQl9SRVNQX0FUQV9FUlIJCT0gKDEgPDwgMyksCisJTlZfQ1BCX1JFU1BfQ01EX0VSUgkJPSAoMSA8PCA0KSwKKwlOVl9DUEJfUkVTUF9DUEJfRVJSCQk9ICgxIDw8IDcpLAorCisJLyogQ1BCIGNvbnRyb2wgZmxhZyBiaXRzICovCisJTlZfQ1BCX0NUTF9DUEJfVkFMSUQJCT0gKDEgPDwgMCksCisJTlZfQ1BCX0NUTF9RVUVVRQkJPSAoMSA8PCAxKSwKKwlOVl9DUEJfQ1RMX0FQUkRfVkFMSUQJCT0gKDEgPDwgMiksCisJTlZfQ1BCX0NUTF9JRU4JCQk9ICgxIDw8IDMpLAorCU5WX0NQQl9DVExfRlBETUEJCT0gKDEgPDwgNCksCisKKwkvKiBBUFJEIGZsYWdzICovCisJTlZfQVBSRF9XUklURQkJCT0gKDEgPDwgMSksCisJTlZfQVBSRF9FTkQJCQk9ICgxIDw8IDIpLAorCU5WX0FQUkRfQ09OVAkJCT0gKDEgPDwgMyksCisKKwkvKiBOVl9BRE1BX1NUQVQgZmxhZ3MgKi8KKwlOVl9BRE1BX1NUQVRfVElNRU9VVAkJPSAoMSA8PCAwKSwKKwlOVl9BRE1BX1NUQVRfSE9UVU5QTFVHCQk9ICgxIDw8IDEpLAorCU5WX0FETUFfU1RBVF9IT1RQTFVHCQk9ICgxIDw8IDIpLAorCU5WX0FETUFfU1RBVF9DUEJFUlIJCT0gKDEgPDwgNCksCisJTlZfQURNQV9TVEFUX1NFUlJPUgkJPSAoMSA8PCA1KSwKKwlOVl9BRE1BX1NUQVRfQ01EX0NPTVBMRVRFCT0gKDEgPDwgNiksCisJTlZfQURNQV9TVEFUX0lETEUJCT0gKDEgPDwgOCksCisJTlZfQURNQV9TVEFUX0xFR0FDWQkJPSAoMSA8PCA5KSwKKwlOVl9BRE1BX1NUQVRfU1RPUFBFRAkJPSAoMSA8PCAxMCksCisJTlZfQURNQV9TVEFUX0RPTkUJCT0gKDEgPDwgMTIpLAorCU5WX0FETUFfU1RBVF9FUlIJCT0gTlZfQURNQV9TVEFUX0NQQkVSUiB8CisJIAkJCQkgIE5WX0FETUFfU1RBVF9USU1FT1VULAorCisJLyogcG9ydCBmbGFncyAqLworCU5WX0FETUFfUE9SVF9SRUdJU1RFUl9NT0RFCT0gKDEgPDwgMCksCisJTlZfQURNQV9BVEFQSV9TRVRVUF9DT01QTEVURQk9ICgxIDw8IDEpLAorCiB9OwogCisvKiBBRE1BIFBoeXNpY2FsIFJlZ2lvbiBEZXNjcmlwdG9yIC0gb25lIFNHIHNlZ21lbnQgKi8KK3N0cnVjdCBudl9hZG1hX3ByZCB7CisJX19sZTY0CQkJYWRkcjsKKwlfX2xlMzIJCQlsZW47CisJdTgJCQlmbGFnczsKKwl1OAkJCXBhY2tldF9sZW47CisJX19sZTE2CQkJcmVzZXJ2ZWQ7Cit9OworCitlbnVtIG52X2FkbWFfcmVnYml0cyB7CisJQ01ERU5ECT0gKDEgPDwgMTUpLAkJLyogZW5kIG9mIGNvbW1hbmQgbGlzdCAqLworCVdOQgk9ICgxIDw8IDE0KSwJCS8qIHdhaXQtbm90LUJTWSAqLworCUlHTgk9ICgxIDw8IDEzKSwJCS8qIGlnbm9yZSB0aGlzIGVudHJ5ICovCisJQ1Mxbgk9ICgxIDw8ICg0ICsgOCkpLAkvKiBzdGQuIFBBVEEgc2lnbmFscyBmb2xsb3cuLi4gKi8KKwlEQTIJPSAoMSA8PCAoMiArIDgpKSwKKwlEQTEJPSAoMSA8PCAoMSArIDgpKSwKKwlEQTAJPSAoMSA8PCAoMCArIDgpKSwKK307CisKKy8qIEFETUEgQ29tbWFuZCBQYXJhbWV0ZXIgQmxvY2sKKyAgIFRoZSBmaXJzdCA1IFNHIHNlZ21lbnRzIGFyZSBzdG9yZWQgaW5zaWRlIHRoZSBDb21tYW5kIFBhcmFtZXRlciBCbG9jayBpdHNlbGYuCisgICBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDUgc2VnbWVudHMgdGhlIHJlbWFpbmRlciBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUKKyAgIG1lbW9yeSBhcmVhIGluZGljYXRlZCBieSBuZXh0X2FwcmQuICovCitzdHJ1Y3QgbnZfYWRtYV9jcGIgeworCXU4CQkJcmVzcF9mbGFnczsgICAgLyogMCAqLworCXU4CQkJcmVzZXJ2ZWQxOyAgICAgLyogMSAqLworCXU4CQkJY3RsX2ZsYWdzOyAgICAgLyogMiAqLworCS8qIGxlbiBpcyBsZW5ndGggb2YgdGFza2ZpbGUgaW4gNjQgYml0IHdvcmRzICovCisgCXU4CQkJbGVuOyAgICAgICAgICAgLyogMyAgKi8KKwl1OAkJCXRhZzsgICAgICAgICAgIC8qIDQgKi8KKwl1OAkJCW5leHRfY3BiX2lkeDsgIC8qIDUgKi8KKwlfX2xlMTYJCQlyZXNlcnZlZDI7ICAgICAvKiA2LTcgKi8KKwlfX2xlMTYJCQl0ZlsxMl07ICAgICAgICAvKiA4LTMxICovCisJc3RydWN0IG52X2FkbWFfcHJkCWFwcmRbNV07ICAgICAgIC8qIDMyLTExMSAqLworCV9fbGU2NAkJCW5leHRfYXByZDsgICAgIC8qIDExMi0xMTkgKi8KKwlfX2xlNjQJCQlyZXNlcnZlZDM7ICAgICAvKiAxMjAtMTI3ICovCit9OworCisKK3N0cnVjdCBudl9hZG1hX3BvcnRfcHJpdiB7CisJc3RydWN0IG52X2FkbWFfY3BiCSpjcGI7CisJZG1hX2FkZHJfdAkJY3BiX2RtYTsKKwlzdHJ1Y3QgbnZfYWRtYV9wcmQJKmFwcmQ7CisJZG1hX2FkZHJfdAkJYXByZF9kbWE7CisJdTgJCQlmbGFnczsKK307CisKKyNkZWZpbmUgTlZfQURNQV9DSEVDS19JTlRSKEdDVEwsIFBPUlQpICgoR0NUTCkgJiAoIDEgPDwgKDE5ICsgKDEyICogKFBPUlQpKSkpKQorCiBzdGF0aWMgaW50IG52X2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CiBzdGF0aWMgdm9pZCBudl9jazgwNF9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBudl9nZW5lcmljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOwpAQCAtOTMsMTMgKzIzMSwyOCBAQAogc3RhdGljIHZvaWQgbnZfY2s4MDRfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgbnZfY2s4MDRfdGhhdyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIG52X2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IG52X2FkbWFfc2xhdmVfY29uZmlnKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CitzdGF0aWMgaW50IG52X2FkbWFfY2hlY2tfYXRhcGlfZG1hKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHZvaWQgbnZfYWRtYV9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHVuc2lnbmVkIGludCBudl9hZG1hX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIGlycXJldHVybl90IG52X2FkbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CitzdGF0aWMgdm9pZCBudl9hZG1hX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyBpbnQgbnZfYWRtYV9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgbnZfYWRtYV9wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBudl9hZG1hX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBudl9hZG1hX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOworc3RhdGljIHZvaWQgbnZfYWRtYV9ibWRtYV9zZXR1cChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyB2b2lkIG52X2FkbWFfYm1kbWFfc3RhcnQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgdm9pZCBudl9hZG1hX2JtZG1hX3N0b3Aoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgdTggbnZfYWRtYV9ibWRtYV9zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAKIGVudW0gbnZfaG9zdF90eXBlCiB7CiAJR0VORVJJQywKIAlORk9SQ0UyLAogCU5GT1JDRTMgPSBORk9SQ0UyLAkvKiBORjIgPT0gTkYzIGFzIGZhciBhcyBzYXRhX252IGlzIGNvbmNlcm5lZCAqLwotCUNLODA0CisJQ0s4MDQsCisJQURNQQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG52X3BjaV90YmxbXSA9IHsKQEAgLTExNywxMCArMjcwLDE0IEBACiAJeyBQQ0lfVkRFVklDRShOVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2MV9TQVRBKSwgR0VORVJJQyB9LAogCXsgUENJX1ZERVZJQ0UoTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjFfU0FUQTIpLCBHRU5FUklDIH0sCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2MV9TQVRBMyksIEdFTkVSSUMgfSwKLQl7IFBDSV9WREVWSUNFKE5WSURJQSwgMHgwNDVjKSwgR0VORVJJQyB9LAotCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NWQpLCBHRU5FUklDIH0sCi0JeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ1ZSksIEdFTkVSSUMgfSwKLQl7IFBDSV9WREVWSUNFKE5WSURJQSwgMHgwNDVmKSwgR0VORVJJQyB9LAorCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NWMpLCBHRU5FUklDIH0sIC8qIE1DUDY1ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ1ZCksIEdFTkVSSUMgfSwgLyogTUNQNjUgKi8KKwl7IFBDSV9WREVWSUNFKE5WSURJQSwgMHgwNDVlKSwgR0VORVJJQyB9LCAvKiBNQ1A2NSAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA0NWYpLCBHRU5FUklDIH0sIC8qIE1DUDY1ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1MCksIEdFTkVSSUMgfSwgLyogTUNQNjcgKi8KKwl7IFBDSV9WREVWSUNFKE5WSURJQSwgMHgwNTUxKSwgR0VORVJJQyB9LCAvKiBNQ1A2NyAqLworCXsgUENJX1ZERVZJQ0UoTlZJRElBLCAweDA1NTIpLCBHRU5FUklDIH0sIC8qIE1DUDY3ICovCisJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDU1MyksIEdFTkVSSUMgfSwgLyogTUNQNjcgKi8KIAl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfQU5ZX0lELAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAogCQlQQ0lfQ0xBU1NfU1RPUkFHRV9JREU8PDgsIDB4ZmZmZjAwLCBHRU5FUklDIH0sCkBAIC0xNTYsNiArMzEzLDI0IEBACiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogfTsKIAorc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbnZfYWRtYV9zaHQgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pb2N0bAkJCT0gYXRhX3Njc2lfaW9jdGwsCisJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKKwkuY2FuX3F1ZXVlCQk9IE5WX0FETUFfTUFYX0NQQlMsCisJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAorCS5zZ190YWJsZXNpemUJCT0gTlZfQURNQV9TR1RCTF9UT1RBTF9MRU4sCisJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCisJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCisJLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKKwkuZG1hX2JvdW5kYXJ5CQk9IE5WX0FETUFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBudl9hZG1hX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAorCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBudl9nZW5lcmljX29wcyA9IHsKIAkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCiAJLnRmX2xvYWQJCT0gYXRhX3RmX2xvYWQsCkBAIC0yMzcsMTEgKzQxMiw0MCBAQAogCS5ob3N0X3N0b3AJCT0gbnZfY2s4MDRfaG9zdF9zdG9wLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X2FkbWFfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuY2hlY2tfYXRhcGlfZG1hCT0gbnZfYWRtYV9jaGVja19hdGFwaV9kbWEsCisJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAorCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKKwkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLmJtZG1hX3NldHVwCQk9IG52X2FkbWFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0CQk9IG52X2FkbWFfYm1kbWFfc3RhcnQsCisJLmJtZG1hX3N0b3AJCT0gbnZfYWRtYV9ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMJCT0gbnZfYWRtYV9ibWRtYV9zdGF0dXMsCisJLnFjX3ByZXAJCT0gbnZfYWRtYV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBudl9hZG1hX3FjX2lzc3VlLAorCS5mcmVlemUJCQk9IG52X2NrODA0X2ZyZWV6ZSwKKwkudGhhdwkJCT0gbnZfY2s4MDRfdGhhdywKKwkuZXJyb3JfaGFuZGxlcgkJPSBudl9hZG1hX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gbnZfYWRtYV9ibWRtYV9zdG9wLAorCS5kYXRhX3hmZXIJCT0gYXRhX21taW9fZGF0YV94ZmVyLAorCS5pcnFfaGFuZGxlcgkJPSBudl9hZG1hX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCQk9IG52X2FkbWFfaXJxX2NsZWFyLAorCS5zY3JfcmVhZAkJPSBudl9zY3JfcmVhZCwKKwkuc2NyX3dyaXRlCQk9IG52X3Njcl93cml0ZSwKKwkucG9ydF9zdGFydAkJPSBudl9hZG1hX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBudl9hZG1hX3BvcnRfc3RvcCwKKwkuaG9zdF9zdG9wCQk9IG52X2FkbWFfaG9zdF9zdG9wLAorfTsKKwogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIG52X3BvcnRfaW5mb1tdID0gewogCS8qIGdlbmVyaWMgKi8KIAl7CiAJCS5zaHQJCT0gJm52X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1ksCisJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX0hSU1RfVE9fUkVTVU1FLAogCQkucGlvX21hc2sJPSBOVl9QSU9fTUFTSywKIAkJLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAogCQkudWRtYV9tYXNrCT0gTlZfVURNQV9NQVNLLApAQCAtMjUwLDcgKzQ1NCw4IEBACiAJLyogbmZvcmNlMi8zICovCiAJewogCQkuc2h0CQk9ICZudl9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAorCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19IUlNUX1RPX1JFU1VNRSwKIAkJLnBpb19tYXNrCT0gTlZfUElPX01BU0ssCiAJCS5td2RtYV9tYXNrCT0gTlZfTVdETUFfTUFTSywKIAkJLnVkbWFfbWFzawk9IE5WX1VETUFfTUFTSywKQEAgLTI1OSwxMiArNDY0LDIzIEBACiAJLyogY2s4MDQgKi8KIAl7CiAJCS5zaHQJCT0gJm52X3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1ksCisJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX0hSU1RfVE9fUkVTVU1FLAogCQkucGlvX21hc2sJPSBOVl9QSU9fTUFTSywKIAkJLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAogCQkudWRtYV9tYXNrCT0gTlZfVURNQV9NQVNLLAogCQkucG9ydF9vcHMJPSAmbnZfY2s4MDRfb3BzLAogCX0sCisJLyogQURNQSAqLworCXsKKwkJLnNodAkJPSAmbnZfYWRtYV9zaHQsCisJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19OQ1EsCisJCS5waW9fbWFzawk9IE5WX1BJT19NQVNLLAorCQkubXdkbWFfbWFzawk9IE5WX01XRE1BX01BU0ssCisJCS51ZG1hX21hc2sJPSBOVl9VRE1BX01BU0ssCisJCS5wb3J0X29wcwk9ICZudl9hZG1hX29wcywKKwl9LAogfTsKIAogTU9EVUxFX0FVVEhPUigiTlZJRElBIik7CkBAIC0yNzMsNiArNDg5LDcwMCBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG52X3BjaV90YmwpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwogCitzdGF0aWMgaW50IGFkbWFfZW5hYmxlZCA9IDE7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX252X2FkbWFfY3RsX2Jsb2NrKHZvaWQgX19pb21lbSAqbW1pbywKKwkJCQkJICAgICAgICB1bnNpZ25lZCBpbnQgcG9ydF9ubykKK3sKKwltbWlvICs9IE5WX0FETUFfUE9SVCArIHBvcnRfbm8gKiBOVl9BRE1BX1BPUlRfU0laRTsKKwlyZXR1cm4gbW1pbzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm52X2FkbWFfY3RsX2Jsb2NrKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIF9fbnZfYWRtYV9jdGxfYmxvY2soYXAtPmhvc3QtPm1taW9fYmFzZSwgYXAtPnBvcnRfbm8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbnZfYWRtYV9nZW5fYmxvY2soc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlyZXR1cm4gKGFwLT5ob3N0LT5tbWlvX2Jhc2UgKyBOVl9BRE1BX0dFTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpudl9hZG1hX25vdGlmaWVyX2NsZWFyX2Jsb2NrKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIChudl9hZG1hX2dlbl9ibG9jayhhcCkgKyBOVl9BRE1BX05PVElGSUVSX0NMRUFSICsgKDQgKiBhcC0+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+ZmxhZ3MpOworCQludl9hZG1hX3JlZ2lzdGVyX21vZGUocWMtPmFwKTsKKwkJcmV0dXJuIGF0YV9xY19pc3N1ZV9wcm90KHFjKTsKKwl9IGVsc2UKKwkJbnZfYWRtYV9tb2RlKHFjLT5hcCk7CisKKwkvKiB3cml0ZSBhcHBlbmQgcmVnaXN0ZXIsIGNvbW1hbmQgdGFnIGluIGxvd2VyIDggYml0cworCSAgIGFuZCAobnVtYmVyIG9mIGNwYnMgdG8gYXBwZW5kIC0xKSBpbiB0b3AgOCBiaXRzICovCisJd21iKCk7CisJd3JpdGV3KHFjLT50YWcsIG1taW8gKyBOVl9BRE1BX0FQUEVORCk7CisKKwlEUFJJTlRLKCJJc3N1ZWQgdGFnICV1XG4iLHFjLT50YWcpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBudl9nZW5lcmljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCiB7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2luc3RhbmNlOwpAQCAtMzA2LDM3ICsxMjE2LDYgQEAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAotc3RhdGljIGludCBudl9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgdTggaXJxX3N0YXQpCi17Ci0Jc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCWludCBoYW5kbGVkOwotCi0JLyogZnJlZXplIGlmIGhvdHBsdWdnZWQgKi8KLQlpZiAodW5saWtlbHkoaXJxX3N0YXQgJiAoTlZfSU5UX0FEREVEIHwgTlZfSU5UX1JFTU9WRUQpKSkgewotCQlhdGFfcG9ydF9mcmVlemUoYXApOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBiYWlsIG91dCBpZiBub3Qgb3VyIGludGVycnVwdCAqLwotCWlmICghKGlycV9zdGF0ICYgTlZfSU5UX0RFVikpCi0JCXJldHVybiAwOwotCi0JLyogREVWIGludGVycnVwdCB3LyBubyBhY3RpdmUgcWM/ICovCi0JaWYgKHVubGlrZWx5KCFxYyB8fCAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSkgewotCQlhdGFfY2hlY2tfc3RhdHVzKGFwKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogaGFuZGxlIGludGVycnVwdCAqLwotCWhhbmRsZWQgPSBhdGFfaG9zdF9pbnRyKGFwLCBxYyk7Ci0JaWYgKHVubGlrZWx5KCFoYW5kbGVkKSkgewotCQkvKiBzcHVyaW91cywgY2xlYXIgaXQgKi8KLQkJYXRhX2NoZWNrX3N0YXR1cyhhcCk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBudl9kb19pbnRlcnJ1cHQoc3RydWN0IGF0YV9ob3N0ICpob3N0LCB1OCBpcnFfc3RhdCkKIHsKIAlpbnQgaSwgaGFuZGxlZCA9IDA7CkBAIC00NjIsNiArMTM0MSw1NiBAQAogCQkJICAgbnZfaGFyZHJlc2V0LCBhdGFfc3RkX3Bvc3RyZXNldCk7CiB9CiAKK3N0YXRpYyB2b2lkIG52X2FkbWFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBudl9hZG1hX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCWlmKCEocHAtPmZsYWdzICYgTlZfQURNQV9QT1JUX1JFR0lTVEVSX01PREUpKSB7CisJCXZvaWQgX19pb21lbSAqbW1pbyA9IG52X2FkbWFfY3RsX2Jsb2NrKGFwKTsKKwkJaW50IGk7CisJCXUxNiB0bXA7CisKKwkJdTMyIG5vdGlmaWVyID0gcmVhZGwobW1pbyArIE5WX0FETUFfTk9USUZJRVIpOworCQl1MzIgbm90aWZpZXJfZXJyb3IgPSByZWFkbChtbWlvICsgTlZfQURNQV9OT1RJRklFUl9FUlJPUik7CisJCXUzMiBnZW5fY3RsID0gcmVhZGwobnZfYWRtYV9nZW5fYmxvY2soYXApICsgTlZfQURNQV9HRU5fQ1RMKTsKKwkJdTMyIHN0YXR1cyA9IHJlYWR3KG1taW8gKyBOVl9BRE1BX1NUQVQpOworCisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJFSCBpbiBBRE1BIG1vZGUsIG5vdGlmaWVyIDB4JVggIgorCQkJIm5vdGlmaWVyX2Vycm9yIDB4JVggZ2VuX2N0bCAweCVYIHN0YXR1cyAweCVYXG4iLAorCQkJbm90aWZpZXIsIG5vdGlmaWVyX2Vycm9yLCBnZW5fY3RsLCBzdGF0dXMpOworCisJCWZvciggaT0wO2k8TlZfQURNQV9NQVhfQ1BCUztpKyspIHsKKwkJCXN0cnVjdCBudl9hZG1hX2NwYiAqY3BiID0gJnBwLT5jcGJbaV07CisJCQlpZiggY3BiLT5jdGxfZmxhZ3MgfHwgY3BiLT5yZXNwX2ZsYWdzICkKKwkJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAorCQkJCQkiQ1BCICVkOiBjdGxfZmxhZ3MgMHgleCwgcmVzcF9mbGFncyAweCV4XG4iLAorCQkJCQlpLCBjcGItPmN0bF9mbGFncywgY3BiLT5yZXNwX2ZsYWdzKTsKKwkJfQorCisJCS8qIFB1c2ggdXMgYmFjayBpbnRvIHBvcnQgcmVnaXN0ZXIgbW9kZSBmb3IgZXJyb3IgaGFuZGxpbmcuICovCisJCW52X2FkbWFfcmVnaXN0ZXJfbW9kZShhcCk7CisKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIlJlc2V0dGluZyBwb3J0XG4iKTsKKworCQkvKiBNYXJrIGFsbCBvZiB0aGUgQ1BCcyBhcyBpbnZhbGlkIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIGV4ZWN1dGVkICovCisJCWZvciggaT0wO2k8TlZfQURNQV9NQVhfQ1BCUztpKyspCisJCQlwcC0+Y3BiW2ldLmN0bF9mbGFncyAmPSB+TlZfQ1BCX0NUTF9DUEJfVkFMSUQ7CisKKwkJLyogY2xlYXIgQ1BCIGZldGNoIGNvdW50ICovCisJCXdyaXRldygwLCBtbWlvICsgTlZfQURNQV9DUEJfQ09VTlQpOworCisJCS8qIFJlc2V0IGNoYW5uZWwgKi8KKwkJdG1wID0gcmVhZHcobW1pbyArIE5WX0FETUFfQ1RMKTsKKwkJd3JpdGV3KHRtcCB8IE5WX0FETUFfQ1RMX0NIQU5ORUxfUkVTRVQsIG1taW8gKyBOVl9BRE1BX0NUTCk7CisJCXJlYWRsKCBtbWlvICsgTlZfQURNQV9DVEwgKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCisJCXVkZWxheSgxKTsKKwkJd3JpdGV3KHRtcCAmIH5OVl9BRE1BX0NUTF9DSEFOTkVMX1JFU0VULCBtbWlvICsgTlZfQURNQV9DVEwpOworCQlyZWFkbCggbW1pbyArIE5WX0FETUFfQ1RMICk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLworCX0KKworCWF0YV9ibWRtYV9kcml2ZV9laChhcCwgYXRhX3N0ZF9wcmVyZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsCisJCQkgICBudl9oYXJkcmVzZXQsIGF0YV9zdGRfcG9zdHJlc2V0KTsKK30KKwogc3RhdGljIGludCBudl9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb24gPSAwOwpAQCAtNDcxLDYgKzE0MDAsOCBAQAogCWludCByYzsKIAl1MzIgYmFyOwogCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwl1bnNpZ25lZCBsb25nIHR5cGUgPSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBtYXNrX3NldCA9IDA7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgYSBTQVRBIGNvbnRyb2xsZXIgYnkgY291bnRpbmcgdGhlIG51bWJlciBvZiBiYXJzCiAgICAgICAgIC8vIChOVklESUEgU0FUQSBjb250cm9sbGVycyB3aWxsIGFsd2F5cyBoYXZlIHNpeCBiYXJzKS4gIE90aGVyd2lzZSwKQEAgLTQ3OSw3ICsxNDEwLDcgQEAKIAkJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBiYXIpID09IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJaWYgKAkhcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAogCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC00OTIsMTYgKzE0MjMsMjYgQEAKIAkJZ290byBlcnJfb3V0X2Rpc2FibGU7CiAJfQogCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOwotCWlmIChyYykKLQkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJaWYodHlwZSA+PSBDSzgwNCAmJiBhZG1hX2VuYWJsZWQpIHsKKwkJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgJnBkZXYtPmRldiwgIlVzaW5nIEFETUEgbW9kZVxuIik7CisJCXR5cGUgPSBBRE1BOworCQlpZighcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykgJiYKKwkJICAgIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpCisJCQltYXNrX3NldCA9IDE7CisJfQorCisJaWYoIW1hc2tfc2V0KSB7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCQlpZiAocmMpCisJCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CisJfQogCiAJcmMgPSAtRU5PTUVNOwogCi0JcHBpWzBdID0gcHBpWzFdID0gJm52X3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKKwlwcGlbMF0gPSBwcGlbMV0gPSAmbnZfcG9ydF9pbmZvW3R5cGVdOwogCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCBwcGksIEFUQV9QT1JUX1BSSU1BUlkgfCBBVEFfUE9SVF9TRUNPTkRBUlkpOwogCWlmICghcHJvYmVfZW50KQogCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKQEAgLTUxOCw3ICsxNDU5LDcgQEAKIAlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBiYXNlICsgTlZfUE9SVDFfU0NSX1JFR19PRkZTRVQ7CiAKIAkvKiBlbmFibGUgU0FUQSBzcGFjZSBmb3IgQ0s4MDQgKi8KLQlpZiAoZW50LT5kcml2ZXJfZGF0YSA9PSBDSzgwNCkgeworCWlmICh0eXBlID49IENLODA0KSB7CiAJCXU4IHJlZ3ZhbDsKIAogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsICZyZWd2YWwpOwpAQCAtNTI4LDYgKzE0NjksMTIgQEAKIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCisJaWYgKHR5cGUgPT0gQURNQSkgeworCQlyYyA9IG52X2FkbWFfaG9zdF9pbml0KHByb2JlX2VudCk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKwogCXJjID0gYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKIAlpZiAocmMgIT0gTlZfUE9SVFMpCiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwpAQCAtNTYyLDYgKzE1MDksMzMgQEAKIAlhdGFfcGNpX2hvc3Rfc3RvcChob3N0KTsKIH0KIAorc3RhdGljIHZvaWQgbnZfYWRtYV9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOworCWludCBpOworCXUzMiB0bXAzMjsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJdm9pZCBfX2lvbWVtICptbWlvID0gX19udl9hZG1hX2N0bF9ibG9jayhob3N0LT5tbWlvX2Jhc2UsIGkpOworCQl1MTYgdG1wOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0ICovCisJCXRtcCA9IHJlYWR3KG1taW8gKyBOVl9BRE1BX0NUTCk7CisJCXdyaXRldyh0bXAgJiB+TlZfQURNQV9DVExfQUlFTiwgbW1pbyArIE5WX0FETUFfQ1RMKTsKKwl9CisKKwkvKiBkaXNhYmxlIEFETUEgb24gdGhlIHBvcnRzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgJnRtcDMyKTsKKwl0bXAzMiAmPSB+KE5WX01DUF9TQVRBX0NGR18yMF9QT1JUMF9FTiB8CisJCSAgIE5WX01DUF9TQVRBX0NGR18yMF9QT1JUMF9QV0JfRU4gfAorCQkgICBOVl9NQ1BfU0FUQV9DRkdfMjBfUE9SVDFfRU4gfAorCQkgICBOVl9NQ1BfU0FUQV9DRkdfMjBfUE9SVDFfUFdCX0VOKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTlZfTUNQX1NBVEFfQ0ZHXzIwLCB0bXAzMik7CisKKwludl9jazgwNF9ob3N0X3N0b3AoaG9zdCk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IG52X2luaXQodm9pZCkKIHsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbnZfcGNpX2RyaXZlcik7CkBAIC01NzQsMyArMTU0OCw1IEBACiAKIG1vZHVsZV9pbml0KG52X2luaXQpOwogbW9kdWxlX2V4aXQobnZfZXhpdCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoYWRtYSwgYWRtYV9lbmFibGVkLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWRtYSwgIkVuYWJsZSB1c2Ugb2YgQURNQSAoRGVmYXVsdDogdHJ1ZSkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKaW5kZXggNzJlZGE1MS4uZjA1NTg3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKQEAgLTQ2LDIwICs0NiwxOSBAQAogI2luY2x1ZGUgInNhdGFfcHJvbWlzZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3Byb21pc2UiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIxLjA0IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wNSIKIAogCiBlbnVtIHsKIAlQRENfUEtUX1NVQk1JVAkJPSAweDQwLCAvKiBDb21tYW5kIHBhY2tldCBwb2ludGVyIGFkZHIgKi8KIAlQRENfSU5UX1NFUU1BU0sJCT0gMHg0MCwJLyogTWFzayBvZiBhc3NlcnRlZCBTRVEgSU5UcyAqLwotCVBEQ19UQkdfTU9ERQkJPSAweDQxLAkvKiBUQkcgbW9kZSAqLwogCVBEQ19GTEFTSF9DVEwJCT0gMHg0NCwgLyogRmxhc2ggY29udHJvbCByZWdpc3RlciAqLwotCVBEQ19QQ0lfQ1RMCQk9IDB4NDgsIC8qIFBDSSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KIAlQRENfR0xPQkFMX0NUTAkJPSAweDQ4LCAvKiBHbG9iYWwgY29udHJvbC9zdGF0dXMgKHBlciBwb3J0KSAqLwogCVBEQ19DVExTVEFUCQk9IDB4NjAsCS8qIElERSBjb250cm9sIGFuZCBzdGF0dXMgKHBlciBwb3J0KSAqLwogCVBEQ19TQVRBX1BMVUdfQ1NSCT0gMHg2QywgLyogU0FUQSBQbHVnIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwogCVBEQzJfU0FUQV9QTFVHX0NTUgk9IDB4NjAsIC8qIFNBVEFJSSBQbHVnIGNvbnRyb2wvc3RhdHVzIHJlZyAqLwotCVBEQ19TTEVXX0NUTAkJPSAweDQ3MCwgLyogc2xldyByYXRlIGNvbnRyb2wgcmVnICovCisJUERDX1RCR19NT0RFCQk9IDB4NDFDLCAvKiBUQkcgbW9kZSAobm90IFNBVEFJSSkgKi8KKwlQRENfU0xFV19DVEwJCT0gMHg0NzAsIC8qIHNsZXcgcmF0ZSBjb250cm9sIHJlZyAobm90IFNBVEFJSSkgKi8KIAogCVBEQ19FUlJfTUFTSwkJPSAoMTw8MTkpIHwgKDE8PDIwKSB8ICgxPDwyMSkgfCAoMTw8MjIpIHwKIAkJCQkgICgxPDw4KSB8ICgxPDw5KSB8ICgxPDwxMCksCkBAIC02NywxNyArNjYsMjIgQEAKIAlib2FyZF8yMDM3eAkJPSAwLAkvKiBGYXN0VHJhayBTMTUwIFRYMnBsdXMgKi8KIAlib2FyZF8yMDMxOQkJPSAxLAkvKiBGYXN0VHJhayBTMTUwIFRYNCAqLwogCWJvYXJkXzIwNjE5CQk9IDIsCS8qIEZhc3RUcmFrIFRYNDAwMCAqLwotCWJvYXJkXzIwNzcxCQk9IDMsCS8qIEZhc3RUcmFrIFRYMjMwMCAqLwotCWJvYXJkXzIwNTd4CQk9IDQsCS8qIFNBVEFJSTE1MCBUeDJwbHVzICovCi0JYm9hcmRfNDA1MTgJCT0gNSwJLyogU0FUQUlJMTUwIFR4NCAqLworCWJvYXJkXzIwNTd4CQk9IDMsCS8qIFNBVEFJSTE1MCBUeDJwbHVzICovCisJYm9hcmRfNDA1MTgJCT0gNCwJLyogU0FUQUlJMTUwIFR4NCAqLwogCiAJUERDX0hBU19QQVRBCQk9ICgxIDw8IDEpLCAvKiBQREMyMDM3NS8yMDU3NSBoYXMgUEFUQSAqLwogCisJLyogUERDX0NUTFNUQVQgYml0IGRlZmluaXRpb25zICovCisJUERDX0RNQV9FTkFCTEUJCT0gKDEgPDwgNyksCisJUERDX0lSUV9ESVNBQkxFCQk9ICgxIDw8IDEwKSwKIAlQRENfUkVTRVQJCT0gKDEgPDwgMTEpLCAvKiBIRE1BIHJlc2V0ICovCiAKLQlQRENfQ09NTU9OX0ZMQUdTCT0gQVRBX0ZMQUdfTk9fTEVHQUNZIHwgQVRBX0ZMQUdfU1JTVCB8CisJUERDX0NPTU1PTl9GTEFHUwk9IEFUQV9GTEFHX05PX0xFR0FDWSB8CiAJCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfTk9fQVRBUEkgfAogCQkJCSAgQVRBX0ZMQUdfUElPX1BPTExJTkcsCisKKwkvKiBocC0+ZmxhZ3MgYml0cyAqLworCVBEQ19GTEFHX0dFTl9JSQkJPSAoMSA8PCAwKSwKIH07CiAKIApAQCAtODcsNyArOTEsNyBAQAogfTsKIAogc3RydWN0IHBkY19ob3N0X3ByaXYgewotCWludAkJCWhvdHBsdWdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogfTsKIAogc3RhdGljIHUzMiBwZGNfc2F0YV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZyk7CkBAIC05OCwxMyArMTAyLDE2IEBACiBzdGF0aWMgaW50IHBkY19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgcGRjX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIHBkY19wYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKLXN0YXRpYyB2b2lkIHBkY19zYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIHBkY19xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogc3RhdGljIHZvaWQgcGRjX3RmX2xvYWRfbW1pbyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBjb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CiBzdGF0aWMgdm9pZCBwZGNfZXhlY19jb21tYW5kX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOwogc3RhdGljIHZvaWQgcGRjX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcGRjX3FjX2lzc3VlX3Byb3Qoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgdm9pZCBwZGNfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBwZGNfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcGRjX3RoYXcoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBwZGNfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBkY19wb3N0X2ludGVybmFsX2NtZChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIAogCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwZGNfYXRhX3NodCA9IHsKQEAgLTEzMywxMSArMTQwLDEyIEBACiAJLmV4ZWNfY29tbWFuZAkJPSBwZGNfZXhlY19jb21tYW5kX21taW8sCiAJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAogCi0JLnBoeV9yZXNldAkJPSBwZGNfc2F0YV9waHlfcmVzZXQsCi0KIAkucWNfcHJlcAkJPSBwZGNfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gcGRjX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CQk9IHBkY19lbmdfdGltZW91dCwKKwkuZnJlZXplCQkJPSBwZGNfZnJlZXplLAorCS50aGF3CQkJPSBwZGNfdGhhdywKKwkuZXJyb3JfaGFuZGxlcgkJPSBwZGNfZXJyb3JfaGFuZGxlciwKKwkucG9zdF9pbnRlcm5hbF9jbWQJPSBwZGNfcG9zdF9pbnRlcm5hbF9jbWQsCiAJLmRhdGFfeGZlcgkJPSBhdGFfbW1pb19kYXRhX3hmZXIsCiAJLmlycV9oYW5kbGVyCQk9IHBkY19pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBwZGNfaXJxX2NsZWFyLApAQCAtMTk1LDIzICsyMDMsMTMgQEAKIAkvKiBib2FyZF8yMDYxOSAqLwogCXsKIAkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCi0JCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUywKKwkJLmZsYWdzCQk9IFBEQ19DT01NT05fRkxBR1MgfCBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmcGRjX3BhdGFfb3BzLAogCX0sCiAKLQkvKiBib2FyZF8yMDc3MSAqLwotCXsKLQkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCi0JCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU0FUQSwKLQkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCi0JCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KLQkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwotCQkucG9ydF9vcHMJPSAmcGRjX3NhdGFfb3BzLAotCX0sCi0KIAkvKiBib2FyZF8yMDU3eCAqLwogCXsKIAkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCkBAIC0yMzUsMzMgKzIzMywyNSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGRjX2F0YV9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDMzNzEpLCBib2FyZF8yMDM3eCB9LAotCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzNTcwKSwgYm9hcmRfMjAzN3ggfSwKLQl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzU3MSksIGJvYXJkXzIwMzd4IH0sCiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDMzNzMpLCBib2FyZF8yMDM3eCB9LAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzMzc1KSwgYm9hcmRfMjAzN3ggfSwKIAl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzM3NiksIGJvYXJkXzIwMzd4IH0sCisJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDM1NzApLCBib2FyZF8yMDU3eCB9LAorCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzNTcxKSwgYm9hcmRfMjA1N3ggfSwKIAl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzU3NCksIGJvYXJkXzIwNTd4IH0sCisJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDM1NzcpLCBib2FyZF8yMDU3eCB9LAorCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzZDczKSwgYm9hcmRfMjA1N3ggfSwKIAl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4M2Q3NSksIGJvYXJkXzIwNTd4IH0sCi0JeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDNkNzMpLCBib2FyZF8yMDM3eCB9LAogCiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDMzMTgpLCBib2FyZF8yMDMxOSB9LAogCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzMzE5KSwgYm9hcmRfMjAzMTkgfSwKIAl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzUxNSksIGJvYXJkXzIwMzE5IH0sCiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDM1MTkpLCBib2FyZF8yMDMxOSB9LAotCXsgUENJX1ZERVZJQ0UoUFJPTUlTRSwgMHgzZDE3KSwgYm9hcmRfMjAzMTkgfSwKKwl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4M2QxNyksIGJvYXJkXzQwNTE4IH0sCiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDNkMTgpLCBib2FyZF80MDUxOCB9LAogCiAJeyBQQ0lfVkRFVklDRShQUk9NSVNFLCAweDY2MjkpLCBib2FyZF8yMDYxOSB9LAogCi0vKiBUT0RPOiByZW1vdmUgYWxsIGFzc29jaWF0ZWQgYm9hcmRfMjA3NzEgY29kZSwgYXMgaXQgY29tcGxldGVseQotICogZHVwbGljYXRlcyBib2FyZF8yMDM3eCBjb2RlLCB1bmxlc3MgcmVhc29uIGZvciBzZXBhcmF0aW9uIGNhbiBiZQotICogZGl2aW5lZC4KLSAqLwotI2lmIDAKLQl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzU3MCksIGJvYXJkXzIwNzcxIH0sCi0jZW5kaWYKLQl7IFBDSV9WREVWSUNFKFBST01JU0UsIDB4MzU3NyksIGJvYXJkXzIwNzcxIH0sCi0KIAl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KIH07CiAKQEAgLTI3Nyw2ICsyNjcsNyBAQAogc3RhdGljIGludCBwZGNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0LT5kZXY7CisJc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcGRjX3BvcnRfcHJpdiAqcHA7CiAJaW50IHJjOwogCkBAIC0yOTgsNiArMjg5LDE2IEBACiAKIAlhcC0+cHJpdmF0ZV9kYXRhID0gcHA7CiAKKwkvKiBmaXggdXAgUEhZTU9ERTQgYWxpZ24gdGltaW5nICovCisJaWYgKChocC0+ZmxhZ3MgJiBQRENfRkxBR19HRU5fSUkpICYmIHNhdGFfc2NyX3ZhbGlkKGFwKSkgeworCQl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuc2NyX2FkZHI7CisJCXVuc2lnbmVkIGludCB0bXA7CisKKwkJdG1wID0gcmVhZGwobW1pbyArIDB4MDE0KTsKKwkJdG1wID0gKHRtcCAmIH4zKSB8IDE7CS8qIHNldCBiaXRzIDE6MCA9IDA6MSAqLworCQl3cml0ZWwodG1wLCBtbWlvICsgMHgwMTQpOworCX0KKwogCXJldHVybiAwOwogCiBlcnJfb3V0X2tmcmVlOgpAQCAtMzUyLDEyICszNTMsNiBAQAogCXJlYWRsKG1taW8pOwkvKiBmbHVzaCAqLwogfQogCi1zdGF0aWMgdm9pZCBwZGNfc2F0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlwZGNfcmVzZXRfcG9ydChhcCk7Ci0Jc2F0YV9waHlfcmVzZXQoYXApOwotfQotCiBzdGF0aWMgdm9pZCBwZGNfcGF0YV9jYmxfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJdTggdG1wOwpAQCAtNDI1LDYgKzQyMCw2MSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgcGRjX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jbWRfYWRkcjsKKwl1MzIgdG1wOworCisJdG1wID0gcmVhZGwobW1pbyArIFBEQ19DVExTVEFUKTsKKwl0bXAgfD0gUERDX0lSUV9ESVNBQkxFOworCXRtcCAmPSB+UERDX0RNQV9FTkFCTEU7CisJd3JpdGVsKHRtcCwgbW1pbyArIFBEQ19DVExTVEFUKTsKKwlyZWFkbChtbWlvICsgUERDX0NUTFNUQVQpOyAvKiBmbHVzaCAqLworfQorCitzdGF0aWMgdm9pZCBwZGNfdGhhdyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jbWRfYWRkcjsKKwl1MzIgdG1wOworCisJLyogY2xlYXIgSVJRICovCisJcmVhZGwobW1pbyArIFBEQ19JTlRfU0VRTUFTSyk7CisKKwkvKiB0dXJuIElSUSBiYWNrIG9uICovCisJdG1wID0gcmVhZGwobW1pbyArIFBEQ19DVExTVEFUKTsKKwl0bXAgJj0gflBEQ19JUlFfRElTQUJMRTsKKwl3cml0ZWwodG1wLCBtbWlvICsgUERDX0NUTFNUQVQpOworCXJlYWRsKG1taW8gKyBQRENfQ1RMU1RBVCk7IC8qIGZsdXNoICovCit9CisKK3N0YXRpYyB2b2lkIHBkY19lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJYXRhX3Jlc2V0X2ZuX3QgaGFyZHJlc2V0OworCisJaWYgKCEoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19GUk9aRU4pKQorCQlwZGNfcmVzZXRfcG9ydChhcCk7CisKKwloYXJkcmVzZXQgPSBOVUxMOworCWlmIChzYXRhX3Njcl92YWxpZChhcCkpCisJCWhhcmRyZXNldCA9IHNhdGFfc3RkX2hhcmRyZXNldDsKKworCS8qIHBlcmZvcm0gcmVjb3ZlcnkgKi8KKwlhdGFfZG9fZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBoYXJkcmVzZXQsCisJCSAgYXRhX3N0ZF9wb3N0cmVzZXQpOworfQorCitzdGF0aWMgdm9pZCBwZGNfcG9zdF9pbnRlcm5hbF9jbWQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCisJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKQorCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX09USEVSOworCisJLyogbWFrZSBETUEgZW5naW5lIGZvcmdldCBhYm91dCB0aGUgZmFpbGVkIGNvbW1hbmQgKi8KKwlpZiAocWMtPmVycl9tYXNrKQorCQlwZGNfcmVzZXRfcG9ydChhcCk7Cit9CisKIHN0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGFwLT5ob3N0OwpAQCAtNjMxLDE4ICs2ODEsMjUgQEAKIHsKIAl2b2lkIF9faW9tZW0gKm1taW8gPSBwZS0+bW1pb19iYXNlOwogCXN0cnVjdCBwZGNfaG9zdF9wcml2ICpocCA9IHBlLT5wcml2YXRlX2RhdGE7Ci0JaW50IGhvdHBsdWdfb2Zmc2V0ID0gaHAtPmhvdHBsdWdfb2Zmc2V0OworCWludCBob3RwbHVnX29mZnNldDsKIAl1MzIgdG1wOwogCisJaWYgKGhwLT5mbGFncyAmIFBEQ19GTEFHX0dFTl9JSSkKKwkJaG90cGx1Z19vZmZzZXQgPSBQREMyX1NBVEFfUExVR19DU1I7CisJZWxzZQorCQlob3RwbHVnX29mZnNldCA9IFBEQ19TQVRBX1BMVUdfQ1NSOworCiAJLyoKIAkgKiBFeGNlcHQgZm9yIHRoZSBob3RwbHVnIHN0dWZmLCB0aGlzIGlzIHZvb2RvbyBmcm9tIHRoZQogCSAqIFByb21pc2UgZHJpdmVyLiAgTGFiZWwgdGhpcyBlbnRpcmUgc2VjdGlvbgogCSAqICJUT0RPOiBmaWd1cmUgb3V0IHdoeSB3ZSBkbyB0aGlzIgogCSAqLwogCi0JLyogY2hhbmdlIEZJRk9fU0hEIHRvIDggZHdvcmRzLCBlbmFibGUgQk1SX0JVUlNUICovCisJLyogZW5hYmxlIEJNUl9CVVJTVCwgbWF5YmUgY2hhbmdlIEZJRk9fU0hEIHRvIDggZHdvcmRzICovCiAJdG1wID0gcmVhZGwobW1pbyArIFBEQ19GTEFTSF9DVEwpOwotCXRtcCB8PSAweDEyMDAwOwkvKiBiaXQgMTYgKGZpZm8gOCBkdykgYW5kIDEzIChibXIgYnVyc3Q/KSAqLworCXRtcCB8PSAweDAyMDAwOwkvKiBiaXQgMTMgKGVuYWJsZSBibXIgYnVyc3QpICovCisJaWYgKCEoaHAtPmZsYWdzICYgUERDX0ZMQUdfR0VOX0lJKSkKKwkJdG1wIHw9IDB4MTAwMDA7CS8qIGJpdCAxNiAoZmlmbyB0aHJlc2hvbGQgYXQgOCBkdykgKi8KIAl3cml0ZWwodG1wLCBtbWlvICsgUERDX0ZMQVNIX0NUTCk7CiAKIAkvKiBjbGVhciBwbHVnL3VucGx1ZyBmbGFncyBmb3IgYWxsIHBvcnRzICovCkBAIC02NTMsNiArNzEwLDEwIEBACiAJdG1wID0gcmVhZGwobW1pbyArIGhvdHBsdWdfb2Zmc2V0KTsKIAl3cml0ZWwodG1wIHwgMHhmZjAwMDAsIG1taW8gKyBob3RwbHVnX29mZnNldCk7CiAKKwkvKiBkb24ndCBpbml0aWFsaXNlIFRCRyBvciBTTEVXIG9uIDJuZCBnZW5lcmF0aW9uIGNoaXBzICovCisJaWYgKGhwLT5mbGFncyAmIFBEQ19GTEFHX0dFTl9JSSkKKwkJcmV0dXJuOworCiAJLyogcmVkdWNlIFRCRyBjbG9jayB0byAxMzMgTWh6LiAqLwogCXRtcCA9IHJlYWRsKG1taW8gKyBQRENfVEJHX01PREUpOwogCXRtcCAmPSB+MHgzMDAwMDsgLyogY2xlYXIgYml0IDE3LCAxNiovCkBAIC03MjIsOCArNzgzLDYgQEAKIAkJZ290byBlcnJfb3V0X2ZyZWVfZW50OwogCX0KIAotCS8qIFNldCBkZWZhdWx0IGhvdHBsdWcgb2Zmc2V0ICovCi0JaHAtPmhvdHBsdWdfb2Zmc2V0ID0gUERDX1NBVEFfUExVR19DU1I7CiAJcHJvYmVfZW50LT5wcml2YXRlX2RhdGEgPSBocDsKIAogCXByb2JlX2VudC0+c2h0CQk9IHBkY19wb3J0X2luZm9bYm9hcmRfaWR4XS5zaHQ7CkBAIC03NDYsOCArODA1LDcgQEAKIAkvKiBub3RpY2UgNC1wb3J0IGJvYXJkcyAqLwogCXN3aXRjaCAoYm9hcmRfaWR4KSB7CiAJY2FzZSBib2FyZF80MDUxODoKLQkJLyogT3ZlcnJpZGUgaG90cGx1ZyBvZmZzZXQgZm9yIFNBVEFJSTE1MCAqLwotCQlocC0+aG90cGx1Z19vZmZzZXQgPSBQREMyX1NBVEFfUExVR19DU1I7CisJCWhwLT5mbGFncyB8PSBQRENfRkxBR19HRU5fSUk7CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwogCWNhc2UgYm9hcmRfMjAzMTk6CiAgICAgICAgCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OwpAQCAtNzU5LDE1ICs4MTcsMTEgQEAKIAkJcHJvYmVfZW50LT5wb3J0WzNdLnNjcl9hZGRyID0gYmFzZSArIDB4NzAwOwogCQlicmVhazsKIAljYXNlIGJvYXJkXzIwNTd4OgotCQkvKiBPdmVycmlkZSBob3RwbHVnIG9mZnNldCBmb3IgU0FUQUlJMTUwICovCi0JCWhwLT5ob3RwbHVnX29mZnNldCA9IFBEQzJfU0FUQV9QTFVHX0NTUjsKKwkJaHAtPmZsYWdzIHw9IFBEQ19GTEFHX0dFTl9JSTsKIAkJLyogRmFsbCB0aHJvdWdoICovCiAJY2FzZSBib2FyZF8yMDM3eDoKIAkJcHJvYmVfZW50LT5uX3BvcnRzID0gMjsKIAkJYnJlYWs7Ci0JY2FzZSBib2FyZF8yMDc3MToKLQkJcHJvYmVfZW50LT5uX3BvcnRzID0gMjsKLQkJYnJlYWs7CiAJY2FzZSBib2FyZF8yMDYxOToKIAkJcHJvYmVfZW50LT5uX3BvcnRzID0gNDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaWwuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKaW5kZXggY2E4ZDk5My4uNzgwOGQwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaWwuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCkBAIC0zNTYsNiArMzU2LDcgQEAKIAogc3RhdGljIHZvaWQgc2lsX2hvc3RfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgYm1kbWEyKQogeworCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmFwLT5laF9pbmZvOwogCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKIAl1OCBzdGF0dXM7CiAKQEAgLTQyOCw2ICs0MjksMTAgQEAKIAkvKiBraWNrIEhTTSBpbiB0aGUgYXNzICovCiAJYXRhX2hzbV9tb3ZlKGFwLCBxYywgc3RhdHVzLCAwKTsKIAorCWlmICh1bmxpa2VseShxYy0+ZXJyX21hc2spICYmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfRE1BIHx8CisJCQkJICAgICAgIHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9BVEFQSV9ETUEpKQorCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICJCTURNQTIgc3RhdCAweCV4IiwgYm1kbWEyKTsKKwogCXJldHVybjsKIAogIGVycl9oc206CkBAIC01MzQsNiArNTM5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgc2lsX2Rldl9jb25maWcoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKKwlpbnQgcHJpbnRfaW5mbyA9IGFwLT5laF9jb250ZXh0LmkuZmxhZ3MgJiBBVEFfRUhJX1BSSU5USU5GTzsKIAl1bnNpZ25lZCBpbnQgbiwgcXVpcmtzID0gMDsKIAl1bnNpZ25lZCBjaGFyIG1vZGVsX251bVs0MV07CiAKQEAgLTU0OSwxNiArNTU1LDE4IEBACiAJaWYgKHNsb3dfZG93biB8fAogCSAgICAoKGFwLT5mbGFncyAmIFNJTF9GTEFHX01PRDE1V1JJVEUpICYmCiAJICAgICAocXVpcmtzICYgU0lMX1FVSVJLX01PRDE1V1JJVEUpKSkgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImFwcGx5aW5nIFNlYWdhdGUgZXJyYXRhIGZpeCAiCi0JCQkgICAgICAgIihtb2QxNXdyaXRlIHdvcmthcm91bmQpXG4iKTsKKwkJaWYgKHByaW50X2luZm8pCisJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImFwcGx5aW5nIFNlYWdhdGUgIgorCQkJCSAgICAgICAiZXJyYXRhIGZpeCAobW9kMTV3cml0ZSB3b3JrYXJvdW5kKVxuIik7CiAJCWRldi0+bWF4X3NlY3RvcnMgPSAxNTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGxpbWl0IHRvIHVkbWE1ICovCiAJaWYgKHF1aXJrcyAmIFNJTF9RVUlSS19VRE1BNU1BWCkgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKLQkJCSAgICAgICAiYXBwbHlpbmcgTWF4dG9yIGVycmF0YSBmaXggJXNcbiIsIG1vZGVsX251bSk7CisJCWlmIChwcmludF9pbmZvKQorCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJhcHBseWluZyBNYXh0b3IgIgorCQkJCSAgICAgICAiZXJyYXRhIGZpeCAlc1xuIiwgbW9kZWxfbnVtKTsKIAkJZGV2LT51ZG1hX21hc2sgJj0gQVRBX1VETUE1OwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCmluZGV4IDE2OWUyMDAuLjVhYTI4OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKQEAgLTEwMCwxMCArMTAwLDE0IEBACiAJICovCiAJUE9SVF9SRUdTX1NJWkUJCT0gMHgyMDAwLAogCi0JUE9SVF9MUkFNCQk9IDB4MDAwMCwgLyogMzEgTFJBTSBzbG90cyBhbmQgUE0gcmVncyAqLworCVBPUlRfTFJBTQkJPSAweDAwMDAsIC8qIDMxIExSQU0gc2xvdHMgYW5kIFBNUCByZWdzICovCiAJUE9SVF9MUkFNX1NMT1RfU1oJPSAweDAwODAsIC8qIDMyIGJ5dGVzIFBSQiArIDIgU0dFLCBBQ1QuLi4gKi8KIAotCVBPUlRfUE0JCQk9IDB4MGY4MCwgLyogOCBieXRlcyBQTSAqIDE2ICgxMjggYnl0ZXMpICovCisJUE9SVF9QTVAJCT0gMHgwZjgwLCAvKiA4IGJ5dGVzIFBNUCAqIDE2ICgxMjggYnl0ZXMpICovCisJUE9SVF9QTVBfU1RBVFVTCQk9IDB4MDAwMCwgLyogcG9ydCBkZXZpY2Ugc3RhdHVzIG9mZnNldCAqLworCVBPUlRfUE1QX1FBQ1RJVkUJPSAweDAwMDQsIC8qIHBvcnQgZGV2aWNlIFFBY3RpdmUgb2Zmc2V0ICovCisJUE9SVF9QTVBfU0laRQkJPSAweDAwMDgsIC8qIDggYnl0ZXMgcGVyIFBNUCAqLworCiAJCS8qIDMyIGJpdCByZWdzICovCiAJUE9SVF9DVFJMX1NUQVQJCT0gMHgxMDAwLCAvKiB3cml0ZTogY3RybC1zZXQsIHJlYWQ6IHN0YXQgKi8KIAlQT1JUX0NUUkxfQ0xSCQk9IDB4MTAwNCwgLyogd3JpdGU6IGN0cmwtY2xlYXIgKi8KQEAgLTEyNiw2ICsxMzAsNyBAQAogCVBPUlRfUEhZX0NGRwkJPSAweDEwNTAsCiAJUE9SVF9TTE9UX1NUQVQJCT0gMHgxODAwLAogCVBPUlRfQ01EX0FDVElWQVRFCT0gMHgxYzAwLCAvKiA2NCBiaXQgY21kIGFjdGl2YXRlICogMzEgKDI0OCBieXRlcykgKi8KKwlQT1JUX0NPTlRFWFQJCT0gMHgxZTA0LAogCVBPUlRfRVhFQ19ESUFHCQk9IDB4MWUwMCwgLyogMzJiaXQgZXhlYyBkaWFnICogMTYgKDY0IGJ5dGVzLCAwLTEwIHVzZWQgb24gMzEyNCkgKi8KIAlQT1JUX1BTRF9ESUFHCQk9IDB4MWU0MCwgLyogMzJiaXQgcHNkIGRpYWcgKiAxNiAoNjQgYnl0ZXMsIDAtOCB1c2VkIG9uIDMxMjQpICovCiAJUE9SVF9TQ09OVFJPTAkJPSAweDFmMDAsCkBAIC0xMzksOSArMTQ0LDkgQEAKIAlQT1JUX0NTX0lOSVQJCT0gKDEgPDwgMiksIC8qIHBvcnQgaW5pdGlhbGl6ZSAqLwogCVBPUlRfQ1NfSVJRX1dPQwkJPSAoMSA8PCAzKSwgLyogaW50ZXJydXB0IHdyaXRlIG9uZSB0byBjbGVhciAqLwogCVBPUlRfQ1NfQ0RCMTYJCT0gKDEgPDwgNSksIC8qIDA9MTJiIGNkYiwgMT0xNmIgY2RiICovCi0JUE9SVF9DU19SRVNVTUUJCT0gKDEgPDwgNiksIC8qIHBvcnQgcmVzdW1lICovCisJUE9SVF9DU19QTVBfUkVTVU1FCT0gKDEgPDwgNiksIC8qIFBNUCByZXN1bWUgKi8KIAlQT1JUX0NTXzMyQklUX0FDVFYJPSAoMSA8PCAxMCksIC8qIDMyLWJpdCBhY3RpdmF0aW9uICovCi0JUE9SVF9DU19QTV9FTgkJPSAoMSA8PCAxMyksIC8qIHBvcnQgbXVsdGlwbGllciBlbmFibGUgKi8KKwlQT1JUX0NTX1BNUF9FTgkJPSAoMSA8PCAxMyksIC8qIHBvcnQgbXVsdGlwbGllciBlbmFibGUgKi8KIAlQT1JUX0NTX1JEWQkJPSAoMSA8PCAzMSksIC8qIHBvcnQgcmVhZHkgdG8gYWNjZXB0IGNvbW1hbmRzICovCiAKIAkvKiBQT1JUX0lSUV9TVEFUL0VOQUJMRV9TRVQvQ0xSICovCkBAIC01NjIsNyArNTY3LDcgQEAKIAogCS8qIGRvIFNSU1QgKi8KIAlwcmItPmN0cmwgPSBjcHVfdG9fbGUxNihQUkJfQ1RSTF9TUlNUKTsKLQlwcmItPmZpc1sxXSA9IDA7IC8qIG5vIFBNIHlldCAqLworCXByYi0+ZmlzWzFdID0gMDsgLyogbm8gUE1QIHlldCAqLwogCiAJd3JpdGVsKCh1MzIpcGFkZHIsIHBvcnQgKyBQT1JUX0NNRF9BQ1RJVkFURSk7CiAJd3JpdGVsKCh1NjQpcGFkZHIgPj4gMzIsIHBvcnQgKyBQT1JUX0NNRF9BQ1RJVkFURSArIDQpOwpAQCAtMTA1MCw3ICsxMDU1LDggQEAKIAkJd3JpdGVsKFBPUlRfQ1NfMzJCSVRfQUNUViwgcG9ydCArIFBPUlRfQ1RSTF9DTFIpOwogCiAJCS8qIENsZWFyIHBvcnQgbXVsdGlwbGllciBlbmFibGUgYW5kIHJlc3VtZSBiaXRzICovCi0JCXdyaXRlbChQT1JUX0NTX1BNX0VOIHwgUE9SVF9DU19SRVNVTUUsIHBvcnQgKyBQT1JUX0NUUkxfQ0xSKTsKKwkJd3JpdGVsKFBPUlRfQ1NfUE1QX0VOIHwgUE9SVF9DU19QTVBfUkVTVU1FLAorCQkgICAgICAgcG9ydCArIFBPUlRfQ1RSTF9DTFIpOwogCX0KIAogCS8qIFR1cm4gb24gaW50ZXJydXB0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaXMuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKaW5kZXggMDczOGY1Mi4uOWMyNWExZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaXMuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCkBAIC0xNzMsNyArMTczLDcgQEAKIAlpZiAoKHBkZXYtPmRldmljZSA9PSAweDE4MikgfHwgKHBtciAmIFNJU19QTVJfQ09NQklORUQpKQogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgY2ZnX2FkZHIrMHgxMCwgJnZhbDIpOwogCi0JcmV0dXJuIHZhbHx2YWwyOworCXJldHVybiAodmFsfHZhbDIpICYgIDB4ZmZmZmZmZmI7IC8qIGF2b2lkIHByb2JsZW1zIHdpdGggcG93ZXJkb3duZWQgcG9ydHMgKi8KIH0KIAogc3RhdGljIHZvaWQgc2lzX3Njcl9jZmdfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY3IsIHUzMiB2YWwpCkBAIC0yMTIsNyArMjEyLDcgQEAKIAlpZiAoKHBkZXYtPmRldmljZSA9PSAweDE4MikgfHwgKHBtciAmIFNJU19QTVJfQ09NQklORUQpKQogCQl2YWwyID0gaW5sKGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkgKyAweDEwKTsKIAotCXJldHVybiB2YWwgfCB2YWwyOworCXJldHVybiAodmFsIHwgdmFsMikgJiAgMHhmZmZmZmZmYjsKIH0KIAogc3RhdGljIHZvaWQgc2lzX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCkKQEAgLTIzOSw4ICsyMzksOCBAQAogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQgPSBOVUxMOwogCWludCByYzsKLQl1MzIgZ2VuY3RsOwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbMl07CisJdTMyIGdlbmN0bCwgdmFsOworCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gc2lzX3BvcnRfaW5mbywgKnBwaVsyXSA9IHsgJnBpLCAmcGkgfTsKIAlpbnQgcGNpX2Rldl9idXN5ID0gMDsKIAl1OCBwbXI7CiAJdTggcG9ydDJfc3RhcnQ7CkBAIC0yNjUsNDcgKzI2NSw1MyBAQAogCWlmIChyYykKIAkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CiAKLQlwcGlbMF0gPSBwcGlbMV0gPSAmc2lzX3BvcnRfaW5mbzsKLQlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgcHBpLCBBVEFfUE9SVF9QUklNQVJZIHwgQVRBX1BPUlRfU0VDT05EQVJZKTsKLQlpZiAoIXByb2JlX2VudCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dF9yZWdpb25zOwotCX0KLQogCS8qIGNoZWNrIGFuZCBzZWUgaWYgdGhlIFNDUnMgYXJlIGluIElPIHNwYWNlIG9yIFBDSSBjZmcgc3BhY2UgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgU0lTX0dFTkNUTCwgJmdlbmN0bCk7CiAJaWYgKChnZW5jdGwgJiBHRU5DVExfSU9NQVBQRURfU0NSKSA9PSAwKQotCQlwcm9iZV9lbnQtPnBvcnRfZmxhZ3MgfD0gU0lTX0ZMQUdfQ0ZHU0NSOworCQlwaS5mbGFncyB8PSBTSVNfRkxBR19DRkdTQ1I7CiAKIAkvKiBpZiBoYXJkd2FyZSB0aGlua3MgU0NScyBhcmUgaW4gSU8gc3BhY2UsIGJ1dCB0aGVyZSBhcmUKIAkgKiBubyBJTyByZXNvdXJjZXMgYXNzaWduZWQsIGNoYW5nZSB0byBQQ0kgY2ZnIHNwYWNlLgogCSAqLwotCWlmICgoIShwcm9iZV9lbnQtPnBvcnRfZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpKSAmJgorCWlmICgoIShwaS5mbGFncyAmIFNJU19GTEFHX0NGR1NDUikpICYmCiAJICAgICgocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFNJU19TQ1JfUENJX0JBUikgPT0gMCkgfHwKIAkgICAgIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFNJU19TQ1JfUENJX0JBUikgPCAxMjgpKSkgewogCQlnZW5jdGwgJj0gfkdFTkNUTF9JT01BUFBFRF9TQ1I7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgU0lTX0dFTkNUTCwgZ2VuY3RsKTsKLQkJcHJvYmVfZW50LT5wb3J0X2ZsYWdzIHw9IFNJU19GTEFHX0NGR1NDUjsKKwkJcGkuZmxhZ3MgfD0gU0lTX0ZMQUdfQ0ZHU0NSOwogCX0KIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNJU19QTVIsICZwbXIpOwogCWlmIChlbnQtPmRldmljZSAhPSAweDE4MikgewogCQlpZiAoKHBtciAmIFNJU19QTVJfQ09NQklORUQpID09IDApIHsKIAkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAotCQkJCSAgICJEZXRlY3RlZCBTaVMgMTgwLzE4MSBjaGlwc2V0IGluIFNBVEEgbW9kZVxuIik7CisJCQkJICAgIkRldGVjdGVkIFNpUyAxODAvMTgxLzk2NCBjaGlwc2V0IGluIFNBVEEgbW9kZVxuIik7CiAJCQlwb3J0Ml9zdGFydCA9IDY0OwogCQl9CiAJCWVsc2UgewogCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCiAJCQkJICAgIkRldGVjdGVkIFNpUyAxODAvMTgxIGNoaXBzZXQgaW4gY29tYmluZWQgbW9kZVxuIik7CiAJCQlwb3J0Ml9zdGFydD0wOworCQkJcGkuZmxhZ3MgfD0gQVRBX0ZMQUdfU0xBVkVfUE9TUzsKIAkJfQogCX0KIAllbHNlIHsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJEZXRlY3RlZCBTaVMgMTgyIGNoaXBzZXRcbiIpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKCBwZGV2LCAweDZDLCAmdmFsKTsKKwkJaWYgKHZhbCAmICgxTCA8PCAzMSkpIHsKKwkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAiRGV0ZWN0ZWQgU2lTIDE4Mi85NjUgY2hpcHNldFxuIik7CisJCQlwaS5mbGFncyB8PSBBVEFfRkxBR19TTEFWRV9QT1NTOworCQl9CisJCWVsc2UKKwkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAiRGV0ZWN0ZWQgU2lTIDE4Mi85NjVMIGNoaXBzZXRcbiIpOwogCQlwb3J0Ml9zdGFydCA9IDB4MjA7CiAJfQogCisJcHJvYmVfZW50ID0gYXRhX3BjaV9pbml0X25hdGl2ZV9tb2RlKHBkZXYsIHBwaSwgQVRBX1BPUlRfUFJJTUFSWSB8IEFUQV9QT1JUX1NFQ09OREFSWSk7CisJaWYgKCFwcm9iZV9lbnQpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKKwl9CisKIAlpZiAoIShwcm9iZV9lbnQtPnBvcnRfZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpKSB7CiAJCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciA9CiAJCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgU0lTX1NDUl9QQ0lfQkFSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCmluZGV4IGY0NDU1YTEuLjFjN2YxOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV92aWEuYwpAQCAtMjMwLDcgKzIzMCw3IEBACiAJaW50IG9ubGluZTsKIAogCS8qIGRvbid0IGRvIGFueSBTQ1Igc3R1ZmYgaWYgd2UncmUgbm90IGxvYWRpbmcgKi8KLQlpZiAoIUFUQV9QRkxBR19MT0FESU5HKQorCWlmICghKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfTE9BRElORykpCiAJCWdvdG8gc2tpcF9zY3I7CiAKIAkvKiBSZXN1bWUgcGh5LiAgVGhpcyBpcyB0aGUgb2xkIHJlc3VtZSBzZXF1ZW5jZSBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS8uZ2l0aWdub3JlIGIvZHJpdmVycy9hdG0vLmdpdGlnbm9yZQppbmRleCBhMTY1YjcxLi5mYzBhZTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS8uZ2l0aWdub3JlCisrKyBiL2RyaXZlcnMvYXRtLy5naXRpZ25vcmUKQEAgLTIsNCArMiw0IEBACiBmb3JlMjAwZV9ta2Zpcm0KIGZvcmUyMDBlX3BjYV9mdy5jCiBwY2EyMDBlLmJpbgotCitwY2EyMDBlX2VjZC5iaW4yCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9LY29uZmlnIGIvZHJpdmVycy9hdG0vS2NvbmZpZwppbmRleCBjZmE1YWY4Li4yZGRkNzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYXRtL0tjb25maWcKQEAgLTI0Miw2ICsyNDIsNyBAQAogY29uZmlnIEFUTV9BTUJBU1NBRE9SCiAJdHJpc3RhdGUgIk1hZGdlIEFtYmFzc2Fkb3IgKENvbGxhZ2UgUENJIDE1NSBTZXJ2ZXIpIgogCWRlcGVuZHMgb24gUENJICYmIEFUTQorCXNlbGVjdCBCSVRSRVZFUlNFCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgQVRNaXplciBiYXNlZCBBVE0gY2FyZCBwcm9kdWNlZCBieSBNYWRnZQogCSAgTmV0d29ya3MgTHRkLiBTYXkgWSAob3IgTSB0byBjb21waWxlIGFzIGEgbW9kdWxlIG5hbWVkIGFtYmFzc2Fkb3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9NYWtlZmlsZSBiL2RyaXZlcnMvYXRtL01ha2VmaWxlCmluZGV4IGI1MDc3Y2UuLjFiMTZmODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYXRtL01ha2VmaWxlCkBAIC00MSw3ICs0MSw3IEBACiAgICMgZ3Vlc3MgdGhlIHRhcmdldCBlbmRpYW5lc3MgdG8gY2hvb3NlIHRoZSByaWdodCBQQ0EtMjAwRSBmaXJtd2FyZSBpbWFnZQogICBpZmVxICgkKENPTkZJR19BVE1fRk9SRTIwMEVfUENBX0RFRkFVTFRfRlcpLHkpCiAgICAgYnl0ZW9yZGVyLmgJCQk6PSBpbmNsdWRlJChpZiAkKHBhdHN1YnN0ICQoc3JjdHJlZSksLCQob2JqdHJlZSkpLDIpL2FzbS9ieXRlb3JkZXIuaAotICAgIENPTkZJR19BVE1fRk9SRTIwMEVfUENBX0ZXCTo9ICQob2JqKS9wY2EyMDBlJChpZiAkKHNoZWxsICQoQ0MpIC1FIC1kTSAkKGJ5dGVvcmRlci5oKSB8IGdyZXAgJyBfX0xJVFRMRV9FTkRJQU4gJyksLmJpbixfZWNkLmJpbjIpCisgICAgQ09ORklHX0FUTV9GT1JFMjAwRV9QQ0FfRlcJOj0gJChvYmopL3BjYTIwMGUkKGlmICQoc2hlbGwgJChDQykgJChDUFBGTEFHUykgLUUgLWRNICQoYnl0ZW9yZGVyLmgpIHwgZ3JlcCAnIF9fTElUVExFX0VORElBTiAnKSwuYmluLF9lY2QuYmluMikKICAgZW5kaWYKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYyBiL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYwppbmRleCAzMjM1OTJkLi4zYzM3MmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKKysrIGIvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2lzb24uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTk3Miw3ICs5NzMsNyBAQAogICAgICAgfQogICAgICAgY2FzZSByb3VuZF91cDogewogCS8vIGNoZWNrIGFsbCBiaXRzIHRoYXQgd2UgYXJlIGRpc2NhcmRpbmcKLQlpZiAobWFuICYgKC0xPj45KSkgeworCWlmIChtYW4gJiAofjBVPj45KSkgewogCSAgbWFuID0gKG1hbj4+KDMyLTkpKSArIDE7CiAJICBpZiAobWFuID09ICgxPDw5KSkgewogCSAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGZvciByb3VuZCB1cCBvdXRzaWRlIG9mIHJhbmdlCkBAIC0yMDY4LDE4ICsyMDY5LDYgQEAKICAgUFJJTlRLIChLRVJOX0lORk8sICJtaWNyb2NvZGUgdmVyc2lvbiBpcyAldS4ldSIsIG1ham9yLCBtaW5vcik7CiB9CiAgIAotLy8gc3dhcCBiaXRzIHdpdGhpbiBieXRlIHRvIGdldCBFdGhlcm5ldCBvcmRlcmluZwotc3RhdGljIHU4IGJpdF9zd2FwICh1OCBieXRlKQotewotICAgIGNvbnN0IHU4IHN3YXBbXSA9IHsKLSAgICAgIDB4MCwgMHg4LCAweDQsIDB4YywKLSAgICAgIDB4MiwgMHhhLCAweDYsIDB4ZSwKLSAgICAgIDB4MSwgMHg5LCAweDUsIDB4ZCwKLSAgICAgIDB4MywgMHhiLCAweDcsIDB4ZgotICAgIH07Ci0gICAgcmV0dXJuICgoc3dhcFtieXRlICYgMHhmXTw8NCkgfCBzd2FwW2J5dGU+PjRdKTsKLX0KLQogLy8gZ2V0IGVuZCBzdGF0aW9uIGFkZHJlc3MKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhbWJfZXNpIChhbWJfZGV2ICogZGV2LCB1OCAqIGVzaSkgewogICB1MzIgbG93ZXI0OwpAQCAtMjEwMSw5ICsyMDkwLDkgQEAKICAgICBQUklOVERCIChEQkdfSU5JVCwgIkVTSToiKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgRVNJX0xFTjsgKytpKSB7CiAgICAgICBpZiAoaSA8IDQpCi0JICBlc2lbaV0gPSBiaXRfc3dhcCAobG93ZXI0Pj4oOCppKSk7CisJICBlc2lbaV0gPSBiaXRyZXY4KGxvd2VyND4+KDgqaSkpOwogICAgICAgZWxzZQotCSAgZXNpW2ldID0gYml0X3N3YXAgKHVwcGVyMj4+KDgqKGktNCkpKTsKKwkgIGVzaVtpXSA9IGJpdHJldjgodXBwZXIyPj4oOCooaS00KSkpOwogICAgICAgUFJJTlRETSAoREJHX0lOSVQsICIgJTAyeCIsIGVzaVtpXSk7CiAgICAgfQogICAgIApAQCAtMjQ1Miw4ICsyNDQxLDggQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbWJfbW9kdWxlX2V4aXQgKHZvaWQpCiB7CiAgIFBSSU5URCAoREJHX0ZMT1d8REJHX0lOSVQsICJjbGVhbnVwX21vZHVsZSIpOwotICAKLSAgcmV0dXJuIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYW1iX2RyaXZlcik7CisKKyAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbWJfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYW1iX21vZHVsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2VuaS5jIGIvZHJpdmVycy9hdG0vZW5pLmMKaW5kZXggYmMxYjEzYy4uNWFhYjdiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZW5pLmMKKysrIGIvZHJpdmVycy9hdG0vZW5pLmMKQEAgLTE4MzIsNyArMTgzMiw3IEBACiAJLyogaW5pdGlhbGl6ZSBtZW1vcnkgbWFuYWdlbWVudCAqLwogCWJ1ZmZlcl9tZW0gPSBlbmlfZGV2LT5tZW0gLSAoYnVmIC0gZW5pX2Rldi0+cmFtKTsKIAllbmlfZGV2LT5mcmVlX2xpc3Rfc2l6ZSA9IGJ1ZmZlcl9tZW0vTUlEX01JTl9CVUZfU0laRS8yOwotCWVuaV9kZXYtPmZyZWVfbGlzdCA9IChzdHJ1Y3QgZW5pX2ZyZWUgKikga21hbGxvYygKKwllbmlfZGV2LT5mcmVlX2xpc3QgPSBrbWFsbG9jKAogCSAgICBzaXplb2Yoc3RydWN0IGVuaV9mcmVlKSooZW5pX2Rldi0+ZnJlZV9saXN0X3NpemUrMSksR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbmlfZGV2LT5mcmVlX2xpc3QpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERFVl9MQUJFTCAiKGl0ZiAlZCk6IGNvdWxkbid0IGdldCBmcmVlIHBhZ2VcbiIsCkBAIC0yMjMyLDcgKzIyMzIsNyBAQAogCQlnb3RvIG91dDA7CiAJfQogCi0JZW5pX2RldiA9IChzdHJ1Y3QgZW5pX2RldiAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW5pX2RldiksR0ZQX0tFUk5FTCk7CisJZW5pX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbmlfZGV2KSxHRlBfS0VSTkVMKTsKIAlpZiAoIWVuaV9kZXYpIGdvdG8gb3V0MDsKIAlpZiAoIWNwdV96ZXJvZXMpIHsKIAkJY3B1X3plcm9lcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsRU5JX1pFUk9FU19TSVpFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jIGIvZHJpdmVycy9hdG0vZmlyZXN0cmVhbS5jCmluZGV4IDQwYWI5YjYuLjljNjdkZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2ZpcmVzdHJlYW0uYworKysgYi9kcml2ZXJzL2F0bS9maXJlc3RyZWFtLmMKQEAgLTUxMiw3ICs1MTIsNyBAQAogCQl9CiAJCWNhc2UgUk9VTkRfVVA6IHsKIAkJCS8qIGNoZWNrIGFsbCBiaXRzIHRoYXQgd2UgYXJlIGRpc2NhcmRpbmcgKi8KLQkJCWlmIChtYW4gJiAoLTE+PjkpKSB7CisJCQlpZiAobWFuICYgKH4wVT4+OSkpIHsKIAkJCQltYW4gPSAobWFuPj4oMzItOSkpICsgMTsKIAkJCQlpZiAobWFuID09ICgxPDw5KSkgewogCQkJCQkvKiBubyBuZWVkIHRvIGNoZWNrIGZvciByb3VuZCB1cCBvdXRzaWRlIG9mIHJhbmdlICovCkBAIC0xMDAyLDYgKzEwMDIsMTAgQEAKIAkJCQkJciA9IFJPVU5EX1VQOwogCQkJCX0KIAkJCQllcnJvciA9IG1ha2VfcmF0ZSAocGNyLCByLCAmdG1jMCwgTlVMTCk7CisJCQkJaWYgKGVycm9yKSB7CisJCQkJCWtmcmVlKHRjKTsKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCX0KIAkJCX0KIAkJCWZzX2RwcmludGsgKEZTX0RFQlVHX09QRU4sICJwY3IgPSAlZC5cbiIsIHBjcik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2hlLmMgYi9kcml2ZXJzL2F0bS9oZS5jCmluZGV4IGM3MzE0YTcuLmRiMzNmNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2hlLmMKKysrIGIvZHJpdmVycy9hdG0vaGUuYwpAQCAtODIwLDcgKzgyMCw3IEBACiAJCXZvaWQgKmNwdWFkZHI7CiAKICNpZmRlZiBVU0VfUkJQU19QT09MIAotCQljcHVhZGRyID0gcGNpX3Bvb2xfYWxsb2MoaGVfZGV2LT5yYnBzX3Bvb2wsIFNMQUJfS0VSTkVMfFNMQUJfRE1BLCAmZG1hX2hhbmRsZSk7CisJCWNwdWFkZHIgPSBwY2lfcG9vbF9hbGxvYyhoZV9kZXYtPnJicHNfcG9vbCwgR0ZQX0tFUk5FTHxHRlBfRE1BLCAmZG1hX2hhbmRsZSk7CiAJCWlmIChjcHVhZGRyID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKICNlbHNlCkBAIC04ODQsNyArODg0LDcgQEAKIAkJdm9pZCAqY3B1YWRkcjsKIAogI2lmZGVmIFVTRV9SQlBMX1BPT0wKLQkJY3B1YWRkciA9IHBjaV9wb29sX2FsbG9jKGhlX2Rldi0+cmJwbF9wb29sLCBTTEFCX0tFUk5FTHxTTEFCX0RNQSwgJmRtYV9oYW5kbGUpOworCQljcHVhZGRyID0gcGNpX3Bvb2xfYWxsb2MoaGVfZGV2LT5yYnBsX3Bvb2wsIEdGUF9LRVJORUx8R0ZQX0RNQSwgJmRtYV9oYW5kbGUpOwogCQlpZiAoY3B1YWRkciA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAjZWxzZQpAQCAtMTcyNCw3ICsxNzI0LDcgQEAKIAlzdHJ1Y3QgaGVfdHBkICp0cGQ7CiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOyAKIAotCXRwZCA9IHBjaV9wb29sX2FsbG9jKGhlX2Rldi0+dHBkX3Bvb2wsIFNMQUJfQVRPTUlDfFNMQUJfRE1BLCAmZG1hX2hhbmRsZSk7ICAgICAgICAgICAgICAKKwl0cGQgPSBwY2lfcG9vbF9hbGxvYyhoZV9kZXYtPnRwZF9wb29sLCBHRlBfQVRPTUlDfEdGUF9ETUEsICZkbWFfaGFuZGxlKTsKIAlpZiAodHBkID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCQkJCkBAIC0yMzUxLDcgKzIzNTEsNyBAQAogCiAJY2lkID0gaGVfbWtjaWQoaGVfZGV2LCB2cGksIHZjaSk7CiAKLQloZV92Y2MgPSAoc3RydWN0IGhlX3ZjYyAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGVfdmNjKSwgR0ZQX0FUT01JQyk7CisJaGVfdmNjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhlX3ZjYyksIEdGUF9BVE9NSUMpOwogCWlmIChoZV92Y2MgPT0gTlVMTCkgewogCQlocHJpbnRrKCJ1bmFibGUgdG8gYWxsb2NhdGUgaGVfdmNjIGR1cmluZyBvcGVuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9ob3Jpem9uLmMgYi9kcml2ZXJzL2F0bS9ob3Jpem9uLmMKaW5kZXggZjU5MzQ5Mi4uNGRjMTAxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaG9yaXpvbi5jCisrKyBiL2RyaXZlcnMvYXRtL2hvcml6b24uYwpAQCAtMTc4OSw3ICsxNzg5LDcgQEAKIAlXUklURV9JVF9XQUlUKGRldiwgY3RybCB8IFNFRVBST01fU0spOwogfQogCi1zdGF0aWMgdTE2IF9faW5pdCByZWFkX2JpYSAoY29uc3QgaHJ6X2RldiAqIGRldiwgdTE2IGFkZHIpCitzdGF0aWMgdTE2IF9fZGV2aW5pdCByZWFkX2JpYSAoY29uc3QgaHJ6X2RldiAqIGRldiwgdTE2IGFkZHIpCiB7CiAgIHUzMiBjdHJsID0gcmRfcmVnbCAoZGV2LCBDT05UUk9MXzBfUkVHKTsKICAgCkBAIC0yOTMyLDggKzI5MzIsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaHJ6X21vZHVsZV9leGl0ICh2b2lkKSB7CiAgIFBSSU5URCAoREJHX0ZMT1csICJjbGVhbnVwX21vZHVsZSIpOwotICAKLSAgcmV0dXJuIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaHJ6X2RyaXZlcik7CisKKyAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZocnpfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoaHJ6X21vZHVsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMgYi9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5jCmluZGV4IDg3YjE3YzMuLmY0MDc4NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKKysrIGIvZHJpdmVycy9hdG0vaWR0NzcyNTIuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJCQkgICAgICAgaW50IGZsYWdzKTsKIHN0YXRpYyBpbnQgaWR0NzcyNTJfcHJvY19yZWFkKHN0cnVjdCBhdG1fZGV2ICpkZXYsIGxvZmZfdCAqIHBvcywKIAkJCSAgICAgIGNoYXIgKnBhZ2UpOwotc3RhdGljIHZvaWQgaWR0NzcyNTJfc29mdGludCh2b2lkICpkZXZfaWQpOworc3RhdGljIHZvaWQgaWR0NzcyNTJfc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAKIHN0YXRpYyBzdHJ1Y3QgYXRtZGV2X29wcyBpZHQ3NzI1Ml9vcHMgPQpAQCAtMjg2Niw5ICsyODY2LDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pZHQ3NzI1Ml9zb2Z0aW50KHZvaWQgKmRldl9pZCkKK2lkdDc3MjUyX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpZHQ3NzI1Ml9kZXYgKmNhcmQgPSBkZXZfaWQ7CisJc3RydWN0IGlkdDc3MjUyX2RldiAqY2FyZCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWR0NzcyNTJfZGV2LCB0cXVldWUpOwogCXUzMiBzdGF0OwogCWludCBkb25lOwogCkBAIC0zNjk3LDcgKzM2OTgsNyBAQAogCWNhcmQtPnBjaWRldiA9IHBjaWRldjsKIAlzcHJpbnRmKGNhcmQtPm5hbWUsICJpZHQ3NzI1Mi0lZCIsIGNhcmQtPmluZGV4KTsKIAotCUlOSVRfV09SSygmY2FyZC0+dHF1ZXVlLCBpZHQ3NzI1Ml9zb2Z0aW50LCAodm9pZCAqKWNhcmQpOworCUlOSVRfV09SSygmY2FyZC0+dHF1ZXVlLCBpZHQ3NzI1Ml9zb2Z0aW50KTsKIAogCW1lbWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAxKTsKIAlzcmFtYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaXBoYXNlLmMgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwppbmRleCA5ZWQxYzYwLi5iYjdlZjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9pcGhhc2UuYworKysgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAqKiAgfCAgUiB8IE5aIHwgIDUtYml0IGV4cG9uZW50ICB8ICAgICAgICA5LWJpdCBtYW50aXNzYSAgICAgICAgIHwKICoqICArLS0tLSstLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogKiogCi0qKiAgICBSID0gcmVzZXJ2ZXJkICh3cml0dGVuIGFzIDApCisqKiAgICBSID0gcmVzZXJ2ZWQgKHdyaXR0ZW4gYXMgMCkKICoqICAgIE5aID0gMCBpZiAwIGNlbGxzL3NlYzsgMSBvdGhlcndpc2UKICoqCiAqKiAgICBpZiBOWiA9IDEsIHJhdGUgPSAxLm1tbW1tbW1tbSB4IDJeKGVlZWVlKSBjZWxscy9zZWMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2xhbmFpLmMgYi9kcml2ZXJzL2F0bS9sYW5haS5jCmluZGV4IDI2NzgyNTUuLjA5ZjQ3N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2xhbmFpLmMKKysrIGIvZHJpdmVycy9hdG0vbGFuYWkuYwpAQCAtMjYwMiw3ICsyNjAyLDcgQEAKIAlzdHJ1Y3QgYXRtX2RldiAqYXRtZGV2OwogCWludCByZXN1bHQ7CiAKLQlsYW5haSA9IChzdHJ1Y3QgbGFuYWlfZGV2ICopIGttYWxsb2Moc2l6ZW9mKCpsYW5haSksIEdGUF9LRVJORUwpOworCWxhbmFpID0ga21hbGxvYyhzaXplb2YoKmxhbmFpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGxhbmFpID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERFVl9MQUJFTAogCQkgICAgICAgIjogY291bGRuJ3QgYWxsb2NhdGUgZGV2X2RhdGEgc3RydWN0dXJlIVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9uaWNzdGFyLmMgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKaW5kZXggNjMyZWRlNS4uYWFiOWIzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vbmljc3Rhci5jCisrKyBiL2RyaXZlcnMvYXRtL25pY3N0YXIuYwpAQCAtOTk3LDcgKzk5Nyw3IEBACiAgICBpZiAoc2l6ZSAhPSBWQlJfU0NRU0laRSAmJiBzaXplICE9IENCUl9TQ1FTSVpFKQogICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgIHNjcSA9IChzY3FfaW5mbyAqKSBrbWFsbG9jKHNpemVvZihzY3FfaW5mbyksIEdGUF9LRVJORUwpOworICAgc2NxID0ga21hbGxvYyhzaXplb2Yoc2NxX2luZm8pLCBHRlBfS0VSTkVMKTsKICAgIGlmIChzY3EgPT0gTlVMTCkKICAgICAgIHJldHVybiBOVUxMOwogICAgc2NxLT5vcmcgPSBrbWFsbG9jKDIgKiBzaXplLCBHRlBfS0VSTkVMKTsKQEAgLTEwMDYsNyArMTAwNiw3IEBACiAgICAgICBrZnJlZShzY3EpOwogICAgICAgcmV0dXJuIE5VTEw7CiAgICB9Ci0gICBzY3EtPnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikgKgorICAgc2NxLT5za2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZSAvIE5TX1NDUUVfU0laRSksIEdGUF9LRVJORUwpOwogICAgaWYgKHNjcS0+c2tiID09IE5VTEwpCiAgICB7CkBAIC0yNzU5LDcgKzI3NTksNyBAQAogewogICAgbnNfZGV2ICpjYXJkOwogICAgcG9vbF9sZXZlbHMgcGw7Ci0gICBpbnQgYnR5cGU7CisgICBsb25nIGJ0eXBlOwogICAgdW5zaWduZWQgbG9uZyBmbGFnczsKIAogICAgY2FyZCA9IGRldi0+ZGV2X2RhdGE7CkBAIC0yODU5LDcgKzI4NTksNyBAQAogICAgICAgY2FzZSBOU19BREpCVUZMRVY6CiAgICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJICAgIHJldHVybiAtRVBFUk07Ci0gICAgICAgICBidHlwZSA9IChpbnQpIGFyZzsJLyogYW4gaW50IGlzIHRoZSBzYW1lIHNpemUgYXMgYSBwb2ludGVyICovCisgICAgICAgICBidHlwZSA9IChsb25nKSBhcmc7CS8qIGEgbG9uZyBpcyB0aGUgc2FtZSBzaXplIGFzIGEgcG9pbnRlciBvciBiaWdnZXIgKi8KICAgICAgICAgIHN3aXRjaCAoYnR5cGUpCiAJIHsKIAkgICAgY2FzZSBOU19CVUZUWVBFX1NNQUxMOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vemF0bS5jIGIvZHJpdmVycy9hdG0vemF0bS5jCmluZGV4IDdkZjBmMzcuLjc1NmQ0ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL3phdG0uYworKysgYi9kcml2ZXJzL2F0bS96YXRtLmMKQEAgLTk5Niw3ICs5OTYsNyBAQAogCiAJRFBSSU5USygic3RhcnRfdHhcbiIpOwogCXphdG1fZGV2ID0gWkFUTV9ERVYoZGV2KTsKLQl6YXRtX2Rldi0+dHhfbWFwID0gKHN0cnVjdCBhdG1fdmNjICoqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRtX3ZjYyAqKSoKKwl6YXRtX2Rldi0+dHhfbWFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0bV92Y2MgKikqCiAJICAgIHphdG1fZGV2LT5jaGFucyxHRlBfS0VSTkVMKTsKIAlpZiAoIXphdG1fZGV2LT50eF9tYXApIHJldHVybiAtRU5PTUVNOwogCXphdG1fZGV2LT50eF9idyA9IEFUTV9PQzNfUENSOwpAQCAtMTU5MSw3ICsxNTkxLDcgQEAKIAlzdHJ1Y3QgemF0bV9kZXYgKnphdG1fZGV2OwogCWludCByZXQgPSAtRU5PTUVNOwogCi0JemF0bV9kZXYgPSAoc3RydWN0IHphdG1fZGV2ICopIGttYWxsb2Moc2l6ZW9mKCp6YXRtX2RldiksIEdGUF9LRVJORUwpOworCXphdG1fZGV2ID0ga21hbGxvYyhzaXplb2YoKnphdG1fZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF6YXRtX2RldikgewogCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IG1lbW9yeSBzaG9ydGFnZVxuIiwgREVWX0xBQkVMKTsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCmluZGV4IDBiNGUyMjQuLjE0MjlmM2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwpAQCAtMzcsOCArMzcsOCBAQAogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBhYm91dCB0aGlzLCBzYXkgTiBoZXJlLgogCi1lbmRtZW51Ci0KIGNvbmZpZyBTWVNfSFlQRVJWSVNPUgogCWJvb2wKIAlkZWZhdWx0IG4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IDEyMTczZDEuLjQ3MjgxMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTM1NSw2ICszNTUsMjEgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAorc3RhdGljIGludCBtYWtlX2RlcHJlY2F0ZWRfYnVzX2xpbmtzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwKKwkJCQkgJmRldi0+YnVzLT5zdWJzeXMua3NldC5rb2JqLCAiYnVzIik7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9kZXByZWNhdGVkX2J1c19saW5rcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImJ1cyIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG1ha2VfZGVwcmVjYXRlZF9idXNfbGlua3Moc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX2RlcHJlY2F0ZWRfYnVzX2xpbmtzKHN0cnVjdCBkZXZpY2UgKmRldikgeyB9CisjZW5kaWYKIAogLyoqCiAgKglidXNfYWRkX2RldmljZSAtIGFkZCBkZXZpY2UgdG8gYnVzCkBAIC0zNzIsMTkgKzM4NywyOSBAQAogCQlwcl9kZWJ1ZygiYnVzICVzOiBhZGQgZGV2aWNlICVzXG4iLCBidXMtPm5hbWUsIGRldi0+YnVzX2lkKTsKIAkJZXJyb3IgPSBkZXZpY2VfYWRkX2F0dHJzKGJ1cywgZGV2KTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9wdXQ7CiAJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmJ1cy0+ZGV2aWNlcy5rb2JqLAogCQkJCQkJJmRldi0+a29iaiwgZGV2LT5idXNfaWQpOwogCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X2lkOwogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosCiAJCQkJJmRldi0+YnVzLT5zdWJzeXMua3NldC5rb2JqLCAic3Vic3lzdGVtIik7CiAJCWlmIChlcnJvcikKLQkJCWdvdG8gb3V0OwotCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosCi0JCQkJJmRldi0+YnVzLT5zdWJzeXMua3NldC5rb2JqLCAiYnVzIik7CisJCQlnb3RvIG91dF9zdWJzeXM7CisJCWVycm9yID0gbWFrZV9kZXByZWNhdGVkX2J1c19saW5rcyhkZXYpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF9kZXByZWNhdGVkOwogCX0KLW91dDoKKwlyZXR1cm4gMDsKKworb3V0X2RlcHJlY2F0ZWQ6CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOworb3V0X3N1YnN5czoKKwlzeXNmc19yZW1vdmVfbGluaygmYnVzLT5kZXZpY2VzLmtvYmosIGRldi0+YnVzX2lkKTsKK291dF9pZDoKKwlkZXZpY2VfcmVtb3ZlX2F0dHJzKGJ1cywgZGV2KTsKK291dF9wdXQ6CisJcHV0X2J1cyhkZXYtPmJ1cyk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC00MjUsMTEgKzQ1MCwxMyBAQAogewogCWlmIChkZXYtPmJ1cykgewogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAic3Vic3lzdGVtIik7Ci0JCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJidXMiKTsKKwkJcmVtb3ZlX2RlcHJlY2F0ZWRfYnVzX2xpbmtzKGRldik7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmJ1cy0+ZGV2aWNlcy5rb2JqLCBkZXYtPmJ1c19pZCk7CiAJCWRldmljZV9yZW1vdmVfYXR0cnMoZGV2LT5idXMsIGRldik7Ci0JCWRldi0+aXNfcmVnaXN0ZXJlZCA9IDA7Ci0JCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9idXMpOworCQlpZiAoZGV2LT5pc19yZWdpc3RlcmVkKSB7CisJCQlkZXYtPmlzX3JlZ2lzdGVyZWQgPSAwOworCQkJa2xpc3RfZGVsKCZkZXYtPmtub2RlX2J1cyk7CisJCX0KIAkJcHJfZGVidWcoImJ1cyAlczogcmVtb3ZlIGRldmljZSAlc1xuIiwgZGV2LT5idXMtPm5hbWUsIGRldi0+YnVzX2lkKTsKIAkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7CiAJCXB1dF9idXMoZGV2LT5idXMpOwpAQCAtNTA1LDM0ICs1MzIsMzYgQEAKIAlzdHJ1Y3QgYnVzX3R5cGUgKiBidXMgPSBnZXRfYnVzKGRydi0+YnVzKTsKIAlpbnQgZXJyb3IgPSAwOwogCi0JaWYgKGJ1cykgewotCQlwcl9kZWJ1ZygiYnVzICVzOiBhZGQgZHJpdmVyICVzXG4iLCBidXMtPm5hbWUsIGRydi0+bmFtZSk7Ci0JCWVycm9yID0ga29iamVjdF9zZXRfbmFtZSgmZHJ2LT5rb2JqLCAiJXMiLCBkcnYtPm5hbWUpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF9wdXRfYnVzOwotCQlkcnYtPmtvYmoua3NldCA9ICZidXMtPmRyaXZlcnM7Ci0JCWlmICgoZXJyb3IgPSBrb2JqZWN0X3JlZ2lzdGVyKCZkcnYtPmtvYmopKSkKLQkJCWdvdG8gb3V0X3B1dF9idXM7CisJaWYgKCFidXMpCisJCXJldHVybiAwOwogCi0JCWVycm9yID0gZHJpdmVyX2F0dGFjaChkcnYpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF91bnJlZ2lzdGVyOwotCQlrbGlzdF9hZGRfdGFpbCgmZHJ2LT5rbm9kZV9idXMsICZidXMtPmtsaXN0X2RyaXZlcnMpOwotCQltb2R1bGVfYWRkX2RyaXZlcihkcnYtPm93bmVyLCBkcnYpOworCXByX2RlYnVnKCJidXMgJXM6IGFkZCBkcml2ZXIgJXNcbiIsIGJ1cy0+bmFtZSwgZHJ2LT5uYW1lKTsKKwllcnJvciA9IGtvYmplY3Rfc2V0X25hbWUoJmRydi0+a29iaiwgIiVzIiwgZHJ2LT5uYW1lKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X3B1dF9idXM7CisJZHJ2LT5rb2JqLmtzZXQgPSAmYnVzLT5kcml2ZXJzOworCWlmICgoZXJyb3IgPSBrb2JqZWN0X3JlZ2lzdGVyKCZkcnYtPmtvYmopKSkKKwkJZ290byBvdXRfcHV0X2J1czsKIAotCQllcnJvciA9IGRyaXZlcl9hZGRfYXR0cnMoYnVzLCBkcnYpOwotCQlpZiAoZXJyb3IpIHsKLQkJCS8qIEhvdyB0aGUgaGVsbCBkbyB3ZSBnZXQgb3V0IG9mIHRoaXMgcGlja2xlPyBHaXZlIHVwICovCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZXJfYWRkX2F0dHJzKCVzKSBmYWlsZWRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBkcnYtPm5hbWUpOwotCQl9Ci0JCWVycm9yID0gYWRkX2JpbmRfZmlsZXMoZHJ2KTsKLQkJaWYgKGVycm9yKSB7Ci0JCQkvKiBEaXR0byAqLwotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYWRkX2JpbmRfZmlsZXMoJXMpIGZhaWxlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGRydi0+bmFtZSk7Ci0JCX0KKwllcnJvciA9IGRyaXZlcl9hdHRhY2goZHJ2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJa2xpc3RfYWRkX3RhaWwoJmRydi0+a25vZGVfYnVzLCAmYnVzLT5rbGlzdF9kcml2ZXJzKTsKKwltb2R1bGVfYWRkX2RyaXZlcihkcnYtPm93bmVyLCBkcnYpOworCisJZXJyb3IgPSBkcml2ZXJfYWRkX2F0dHJzKGJ1cywgZHJ2KTsKKwlpZiAoZXJyb3IpIHsKKwkJLyogSG93IHRoZSBoZWxsIGRvIHdlIGdldCBvdXQgb2YgdGhpcyBwaWNrbGU/IEdpdmUgdXAgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJpdmVyX2FkZF9hdHRycyglcykgZmFpbGVkXG4iLAorCQkJX19GVU5DVElPTl9fLCBkcnYtPm5hbWUpOwogCX0KKwllcnJvciA9IGFkZF9iaW5kX2ZpbGVzKGRydik7CisJaWYgKGVycm9yKSB7CisJCS8qIERpdHRvICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFkZF9iaW5kX2ZpbGVzKCVzKSBmYWlsZWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGRydi0+bmFtZSk7CisJfQorCiAJcmV0dXJuIGVycm9yOwogb3V0X3VucmVnaXN0ZXI6CiAJa29iamVjdF91bnJlZ2lzdGVyKCZkcnYtPmtvYmopOwpAQCAtNTUyLDE2ICs1ODEsMTcgQEAKIAogdm9pZCBidXNfcmVtb3ZlX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikKIHsKLQlpZiAoZHJ2LT5idXMpIHsKLQkJcmVtb3ZlX2JpbmRfZmlsZXMoZHJ2KTsKLQkJZHJpdmVyX3JlbW92ZV9hdHRycyhkcnYtPmJ1cywgZHJ2KTsKLQkJa2xpc3RfcmVtb3ZlKCZkcnYtPmtub2RlX2J1cyk7Ci0JCXByX2RlYnVnKCJidXMgJXM6IHJlbW92ZSBkcml2ZXIgJXNcbiIsIGRydi0+YnVzLT5uYW1lLCBkcnYtPm5hbWUpOwotCQlkcml2ZXJfZGV0YWNoKGRydik7Ci0JCW1vZHVsZV9yZW1vdmVfZHJpdmVyKGRydik7Ci0JCWtvYmplY3RfdW5yZWdpc3RlcigmZHJ2LT5rb2JqKTsKLQkJcHV0X2J1cyhkcnYtPmJ1cyk7Ci0JfQorCWlmICghZHJ2LT5idXMpCisJCXJldHVybjsKKworCXJlbW92ZV9iaW5kX2ZpbGVzKGRydik7CisJZHJpdmVyX3JlbW92ZV9hdHRycyhkcnYtPmJ1cywgZHJ2KTsKKwlrbGlzdF9yZW1vdmUoJmRydi0+a25vZGVfYnVzKTsKKwlwcl9kZWJ1ZygiYnVzICVzOiByZW1vdmUgZHJpdmVyICVzXG4iLCBkcnYtPmJ1cy0+bmFtZSwgZHJ2LT5uYW1lKTsKKwlkcml2ZXJfZGV0YWNoKGRydik7CisJbW9kdWxlX3JlbW92ZV9kcml2ZXIoZHJ2KTsKKwlrb2JqZWN0X3VucmVnaXN0ZXIoJmRydi0+a29iaik7CisJcHV0X2J1cyhkcnYtPmJ1cyk7CiB9CiAKIApAQCAtNzA4LDYgKzczOCw4IEBACiB7CiAJaW50IHJldHZhbDsKIAorCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmYnVzLT5idXNfbm90aWZpZXIpOworCiAJcmV0dmFsID0ga29iamVjdF9zZXRfbmFtZSgmYnVzLT5zdWJzeXMua3NldC5rb2JqLCAiJXMiLCBidXMtPm5hbWUpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gb3V0OwpAQCAtNzMyLDExICs3NjQsMTUgQEAKIAogCWtsaXN0X2luaXQoJmJ1cy0+a2xpc3RfZGV2aWNlcywga2xpc3RfZGV2aWNlc19nZXQsIGtsaXN0X2RldmljZXNfcHV0KTsKIAlrbGlzdF9pbml0KCZidXMtPmtsaXN0X2RyaXZlcnMsIE5VTEwsIE5VTEwpOwotCWJ1c19hZGRfYXR0cnMoYnVzKTsKKwlyZXR2YWwgPSBidXNfYWRkX2F0dHJzKGJ1cyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBidXNfYXR0cnNfZmFpbDsKIAogCXByX2RlYnVnKCJidXMgdHlwZSAnJXMnIHJlZ2lzdGVyZWRcbiIsIGJ1cy0+bmFtZSk7CiAJcmV0dXJuIDA7CiAKK2J1c19hdHRyc19mYWlsOgorCWtzZXRfdW5yZWdpc3RlcigmYnVzLT5kcml2ZXJzKTsKIGJ1c19kcml2ZXJzX2ZhaWw6CiAJa3NldF91bnJlZ2lzdGVyKCZidXMtPmRldmljZXMpOwogYnVzX2RldmljZXNfZmFpbDoKQEAgLTc2Miw2ICs3OTgsMTggQEAKIAlzdWJzeXN0ZW1fdW5yZWdpc3RlcigmYnVzLT5zdWJzeXMpOwogfQogCitpbnQgYnVzX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmYnVzLT5idXNfbm90aWZpZXIsIG5iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ1c19yZWdpc3Rlcl9ub3RpZmllcik7CisKK2ludCBidXNfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmYnVzLT5idXNfbm90aWZpZXIsIG5iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKTsKKwogaW50IF9faW5pdCBidXNlc19pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHN1YnN5c3RlbV9yZWdpc3RlcigmYnVzX3N1YnN5cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCmluZGV4IGIzMmI3N2YuLjhiZjJjYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCkBAIC0xNjMsNiArMTYzLDggQEAKIHZvaWQgY2xhc3NfdW5yZWdpc3RlcihzdHJ1Y3QgY2xhc3MgKiBjbHMpCiB7CiAJcHJfZGVidWcoImRldmljZSBjbGFzcyAnJXMnOiB1bnJlZ2lzdGVyaW5nXG4iLCBjbHMtPm5hbWUpOworCWlmIChjbHMtPnZpcnR1YWxfZGlyKQorCQlrb2JqZWN0X3VucmVnaXN0ZXIoY2xzLT52aXJ0dWFsX2Rpcik7CiAJcmVtb3ZlX2NsYXNzX2F0dHJzKGNscyk7CiAJc3Vic3lzdGVtX3VucmVnaXN0ZXIoJmNscy0+c3Vic3lzKTsKIH0KQEAgLTM1Miw2ICszNTQsOTIgQEAKIAlyZXR1cm4gY2xhc3NfZGV2LT5jbGFzcy0+bmFtZTsKIH0KIAorI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECitjaGFyICptYWtlX2NsYXNzX25hbWUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJY2hhciAqY2xhc3NfbmFtZTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzdHJsZW4obmFtZSkgKyBzdHJsZW4oa29iamVjdF9uYW1lKGtvYmopKSArIDI7CisKKwljbGFzc19uYW1lID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsYXNzX25hbWUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3RyY3B5KGNsYXNzX25hbWUsIG5hbWUpOworCXN0cmNhdChjbGFzc19uYW1lLCAiOiIpOworCXN0cmNhdChjbGFzc19uYW1lLCBrb2JqZWN0X25hbWUoa29iaikpOworCXJldHVybiBjbGFzc19uYW1lOworfQorCitzdGF0aWMgaW50IGRlcHJlY2F0ZWRfY2xhc3NfdWV2ZW50KGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGludCAqY3VyX2luZGV4LAorCQkJCSAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplLAorCQkJCSAgIGludCAqY3VyX2xlbiwKKwkJCQkgICBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY2xhc3NfZGV2LT5kZXY7CisJY2hhciAqcGF0aDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCS8qIGFkZCBkZXZpY2UsIGJhY2tpbmcgdGhpcyBjbGFzcyBkZXZpY2UgKGRlcHJlY2F0ZWQpICovCisJcGF0aCA9IGtvYmplY3RfZ2V0X3BhdGgoJmRldi0+a29iaiwgR0ZQX0tFUk5FTCk7CisKKwlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgY3VyX2luZGV4LCBidWZmZXIsIGJ1ZmZlcl9zaXplLAorCQkgICAgICAgY3VyX2xlbiwgIlBIWVNERVZQQVRIPSVzIiwgcGF0aCk7CisJa2ZyZWUocGF0aCk7CisKKwlpZiAoZGV2LT5idXMpCisJCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCBjdXJfaW5kZXgsCisJCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgY3VyX2xlbiwKKwkJCSAgICAgICAiUEhZU0RFVkJVUz0lcyIsIGRldi0+YnVzLT5uYW1lKTsKKworCWlmIChkZXYtPmRyaXZlcikKKwkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsIGN1cl9pbmRleCwKKwkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCBjdXJfbGVuLAorCQkJICAgICAgICJQSFlTREVWRFJJVkVSPSVzIiwgZGV2LT5kcml2ZXItPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ha2VfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCWNoYXIgKmNsYXNzX25hbWU7CisJaW50IGVycm9yOworCisJaWYgKCFjbGFzc19kZXYtPmRldikKKwkJcmV0dXJuIDA7CisKKwljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGNsYXNzX2Rldi0+Y2xhc3MtPm5hbWUsICZjbGFzc19kZXYtPmtvYmopOworCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCAmY2xhc3NfZGV2LT5rb2JqLAorCQkJCSAgY2xhc3NfbmFtZSk7CisJa2ZyZWUoY2xhc3NfbmFtZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCWNoYXIgKmNsYXNzX25hbWU7CisKKwlpZiAoIWNsYXNzX2Rldi0+ZGV2KQorCQlyZXR1cm47CisKKwljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGNsYXNzX2Rldi0+Y2xhc3MtPm5hbWUsICZjbGFzc19kZXYtPmtvYmopOworCXN5c2ZzX3JlbW92ZV9saW5rKCZjbGFzc19kZXYtPmRldi0+a29iaiwgY2xhc3NfbmFtZSk7CisJa2ZyZWUoY2xhc3NfbmFtZSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZGVwcmVjYXRlZF9jbGFzc191ZXZlbnQoY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJCQkJICBpbnQgKmN1cl9pbmRleCwgY2hhciAqYnVmZmVyLAorCQkJCQkgIGludCBidWZmZXJfc2l6ZSwgaW50ICpjdXJfbGVuLAorCQkJCQkgIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IG1ha2VfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7IHJldHVybiAwOyB9CitzdGF0aWMgdm9pZCByZW1vdmVfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3Moc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7IH0KKyNlbmRpZgorCiBzdGF0aWMgaW50IGNsYXNzX3VldmVudChzdHJ1Y3Qga3NldCAqa3NldCwgc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKiplbnZwLAogCQkJIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7CkBAIC0zNjIsMjUgKzQ1MCw4IEBACiAKIAlwcl9kZWJ1ZygiJXMgLSBuYW1lID0gJXNcbiIsIF9fRlVOQ1RJT05fXywgY2xhc3NfZGV2LT5jbGFzc19pZCk7CiAKLQlpZiAoY2xhc3NfZGV2LT5kZXYpIHsKLQkJLyogYWRkIGRldmljZSwgYmFja2luZyB0aGlzIGNsYXNzIGRldmljZSAoZGVwcmVjYXRlZCkgKi8KLQkJc3RydWN0IGRldmljZSAqZGV2ID0gY2xhc3NfZGV2LT5kZXY7Ci0JCWNoYXIgKnBhdGggPSBrb2JqZWN0X2dldF9wYXRoKCZkZXYtPmtvYmosIEdGUF9LRVJORUwpOwotCi0JCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLCBidWZmZXJfc2l6ZSwKLQkJCSAgICAgICAmbGVuZ3RoLCAiUEhZU0RFVlBBVEg9JXMiLCBwYXRoKTsKLQkJa2ZyZWUocGF0aCk7Ci0KLQkJaWYgKGRldi0+YnVzKQotCQkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAotCQkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAotCQkJCSAgICAgICAiUEhZU0RFVkJVUz0lcyIsIGRldi0+YnVzLT5uYW1lKTsKLQotCQlpZiAoZGV2LT5kcml2ZXIpCi0JCQlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCi0JCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCi0JCQkJICAgICAgICJQSFlTREVWRFJJVkVSPSVzIiwgZGV2LT5kcml2ZXItPm5hbWUpOwotCX0KKwlkZXByZWNhdGVkX2NsYXNzX3VldmVudChlbnZwLCBudW1fZW52cCwgJmksIGJ1ZmZlciwgYnVmZmVyX3NpemUsCisJCQkJJmxlbmd0aCwgY2xhc3NfZGV2KTsKIAogCWlmIChNQUpPUihjbGFzc19kZXYtPmRldnQpKSB7CiAJCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKQEAgLTUwNiwyOSArNTc3LDExIEBACiAJSU5JVF9MSVNUX0hFQUQoJmNsYXNzX2Rldi0+bm9kZSk7CiB9CiAKLWNoYXIgKm1ha2VfY2xhc3NfbmFtZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQljaGFyICpjbGFzc19uYW1lOwotCWludCBzaXplOwotCi0Jc2l6ZSA9IHN0cmxlbihuYW1lKSArIHN0cmxlbihrb2JqZWN0X25hbWUoa29iaikpICsgMjsKLQotCWNsYXNzX25hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghY2xhc3NfbmFtZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlzdHJjcHkoY2xhc3NfbmFtZSwgbmFtZSk7Ci0Jc3RyY2F0KGNsYXNzX25hbWUsICI6Iik7Ci0Jc3RyY2F0KGNsYXNzX25hbWUsIGtvYmplY3RfbmFtZShrb2JqKSk7Ci0JcmV0dXJuIGNsYXNzX25hbWU7Ci19Ci0KIGludCBjbGFzc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKIHsKIAlzdHJ1Y3QgY2xhc3MgKnBhcmVudF9jbGFzcyA9IE5VTEw7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqcGFyZW50X2NsYXNzX2RldiA9IE5VTEw7CiAJc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZjsKLQljaGFyICpjbGFzc19uYW1lID0gTlVMTDsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOwogCiAJY2xhc3NfZGV2ID0gY2xhc3NfZGV2aWNlX2dldChjbGFzc19kZXYpOwpAQCAtNTYyLDcgKzYxNSwxMCBAQAogCQlnb3RvIG91dDI7CiAKIAkvKiBhZGQgdGhlIG5lZWRlZCBhdHRyaWJ1dGVzIHRvIHRoaXMgZGV2aWNlICovCi0Jc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwgJnBhcmVudF9jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwgInN1YnN5c3RlbSIpOworCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwKKwkJCQkgICZwYXJlbnRfY2xhc3MtPnN1YnN5cy5rc2V0LmtvYmosICJzdWJzeXN0ZW0iKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0MzsKIAljbGFzc19kZXYtPnVldmVudF9hdHRyLmF0dHIubmFtZSA9ICJ1ZXZlbnQiOwogCWNsYXNzX2Rldi0+dWV2ZW50X2F0dHIuYXR0ci5tb2RlID0gU19JV1VTUjsKIAljbGFzc19kZXYtPnVldmVudF9hdHRyLmF0dHIub3duZXIgPSBwYXJlbnRfY2xhc3MtPm93bmVyOwpAQCAtNTk2LDIwICs2NTIsMTggQEAKIAkJZ290byBvdXQ1OwogCiAJaWYgKGNsYXNzX2Rldi0+ZGV2KSB7Ci0JCWNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoY2xhc3NfZGV2LT5jbGFzcy0+bmFtZSwKLQkJCQkJICAgICAmY2xhc3NfZGV2LT5rb2JqKTsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmY2xhc3NfZGV2LT5rb2JqLAogCQkJCQkgICZjbGFzc19kZXYtPmRldi0+a29iaiwgImRldmljZSIpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDY7Ci0JCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCAmY2xhc3NfZGV2LT5rb2JqLAotCQkJCQkgIGNsYXNzX25hbWUpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dDc7CiAJfQogCiAJZXJyb3IgPSBjbGFzc19kZXZpY2VfYWRkX2dyb3VwcyhjbGFzc19kZXYpOwogCWlmIChlcnJvcikKKwkJZ290byBvdXQ3OworCisJZXJyb3IgPSBtYWtlX2RlcHJlY2F0ZWRfY2xhc3NfZGV2aWNlX2xpbmtzKGNsYXNzX2Rldik7CisJaWYgKGVycm9yKQogCQlnb3RvIG91dDg7CiAKIAlrb2JqZWN0X3VldmVudCgmY2xhc3NfZGV2LT5rb2JqLCBLT0JKX0FERCk7CkBAIC02MjYsOCArNjgwLDcgQEAKIAlnb3RvIG91dDE7CiAKICBvdXQ4OgotCWlmIChjbGFzc19kZXYtPmRldikKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwgY2xhc3NfbmFtZSk7CisJY2xhc3NfZGV2aWNlX3JlbW92ZV9ncm91cHMoY2xhc3NfZGV2KTsKICBvdXQ3OgogCWlmIChjbGFzc19kZXYtPmRldikKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwgImRldmljZSIpOwpAQCAtNjQ2LDcgKzY5OSw2IEBACiAJY2xhc3NfcHV0KHBhcmVudF9jbGFzcyk7CiAgb3V0MToKIAljbGFzc19kZXZpY2VfcHV0KGNsYXNzX2Rldik7Ci0Ja2ZyZWUoY2xhc3NfbmFtZSk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC03MjMsNyArNzc1LDYgQEAKIAlzdHJ1Y3QgY2xhc3MgKnBhcmVudF9jbGFzcyA9IGNsYXNzX2Rldi0+Y2xhc3M7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqcGFyZW50X2RldmljZSA9IGNsYXNzX2Rldi0+cGFyZW50OwogCXN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmNsYXNzX2ludGY7Ci0JY2hhciAqY2xhc3NfbmFtZSA9IE5VTEw7CiAKIAlpZiAocGFyZW50X2NsYXNzKSB7CiAJCWRvd24oJnBhcmVudF9jbGFzcy0+c2VtKTsKQEAgLTczNSwxMCArNzg2LDggQEAKIAl9CiAKIAlpZiAoY2xhc3NfZGV2LT5kZXYpIHsKLQkJY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShjbGFzc19kZXYtPmNsYXNzLT5uYW1lLAotCQkJCQkgICAgICZjbGFzc19kZXYtPmtvYmopOworCQlyZW1vdmVfZGVwcmVjYXRlZF9jbGFzc19kZXZpY2VfbGlua3MoY2xhc3NfZGV2KTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+a29iaiwgImRldmljZSIpOwotCQlzeXNmc19yZW1vdmVfbGluaygmY2xhc3NfZGV2LT5kZXYtPmtvYmosIGNsYXNzX25hbWUpOwogCX0KIAlzeXNmc19yZW1vdmVfbGluaygmY2xhc3NfZGV2LT5rb2JqLCAic3Vic3lzdGVtIik7CiAJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNsYXNzX2RldiwgJmNsYXNzX2Rldi0+dWV2ZW50X2F0dHIpOwpAQCAtNzUyLDcgKzgwMSw2IEBACiAKIAljbGFzc19kZXZpY2VfcHV0KHBhcmVudF9kZXZpY2UpOwogCWNsYXNzX3B1dChwYXJlbnRfY2xhc3MpOwotCWtmcmVlKGNsYXNzX25hbWUpOwogfQogCiB2b2lkIGNsYXNzX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKQEAgLTgwMSwxNCArODQ5LDE3IEBACiAJcHJfZGVidWcoIkNMQVNTOiByZW5hbWluZyAnJXMnIHRvICclcydcbiIsIGNsYXNzX2Rldi0+Y2xhc3NfaWQsCiAJCSBuZXdfbmFtZSk7CiAKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAogCWlmIChjbGFzc19kZXYtPmRldikKIAkJb2xkX2NsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoY2xhc3NfZGV2LT5jbGFzcy0+bmFtZSwKIAkJCQkJCSAmY2xhc3NfZGV2LT5rb2JqKTsKKyNlbmRpZgogCiAJc3RybGNweShjbGFzc19kZXYtPmNsYXNzX2lkLCBuZXdfbmFtZSwgS09CSl9OQU1FX0xFTik7CiAKIAllcnJvciA9IGtvYmplY3RfcmVuYW1lKCZjbGFzc19kZXYtPmtvYmosIG5ld19uYW1lKTsKIAorI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJaWYgKGNsYXNzX2Rldi0+ZGV2KSB7CiAJCW5ld19jbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGNsYXNzX2Rldi0+Y2xhc3MtPm5hbWUsCiAJCQkJCQkgJmNsYXNzX2Rldi0+a29iaik7CkBAIC04MTYsNiArODY3LDcgQEAKIAkJCQkgIG5ld19jbGFzc19uYW1lKTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCBvbGRfY2xhc3NfbmFtZSk7CiAJfQorI2VuZGlmCiAJY2xhc3NfZGV2aWNlX3B1dChjbGFzc19kZXYpOwogCiAJa2ZyZWUob2xkX2NsYXNzX25hbWUpOwpAQCAtODkwLDIzICs5NDIsNiBAQAogCWNsYXNzX3B1dChwYXJlbnQpOwogfQogCi1pbnQgdmlydHVhbF9kZXZpY2VfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpZiAoIWRldi0+Y2xhc3MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKCFkZXYtPmNsYXNzLT52aXJ0dWFsX2RpcikgewotCQlzdGF0aWMgc3RydWN0IGtvYmplY3QgKnZpcnR1YWxfZGlyID0gTlVMTDsKLQotCQlpZiAoIXZpcnR1YWxfZGlyKQotCQkJdmlydHVhbF9kaXIgPSBrb2JqZWN0X2FkZF9kaXIoJmRldmljZXNfc3Vic3lzLmtzZXQua29iaiwgInZpcnR1YWwiKTsKLQkJZGV2LT5jbGFzcy0+dmlydHVhbF9kaXIgPSBrb2JqZWN0X2FkZF9kaXIodmlydHVhbF9kaXIsIGRldi0+Y2xhc3MtPm5hbWUpOwotCX0KLQotCWRldi0+a29iai5wYXJlbnQgPSBkZXYtPmNsYXNzLT52aXJ0dWFsX2RpcjsKLQlyZXR1cm4gMDsKLX0KLQogaW50IF9faW5pdCBjbGFzc2VzX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggYjIyNGJiNC4uNjdiNzlhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKQEAgLTQ0LDcgKzQ1LDcgQEAKIAlyZXR1cm4gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+bmFtZSA6CiAJCQkoZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICIiKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRldl9kcml2ZXJfc3RyaW5nKTsKK0VYUE9SVF9TWU1CT0woZGV2X2RyaXZlcl9zdHJpbmcpOwogCiAjZGVmaW5lIHRvX2RldihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCiAjZGVmaW5lIHRvX2Rldl9hdHRyKF9hdHRyKSBjb250YWluZXJfb2YoX2F0dHIsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlLCBhdHRyKQpAQCAtMTUzLDIwICsxNTQsMjQgQEAKIAkJCSAgICAgICAiTUlOT1I9JXUiLCBNSU5PUihkZXYtPmRldnQpKTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAogCS8qIGFkZCBidXMgbmFtZSAoc2FtZSBhcyBTVUJTWVNURU0sIGRlcHJlY2F0ZWQpICovCiAJaWYgKGRldi0+YnVzKQogCQlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCiAJCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKIAkJCSAgICAgICAiUEhZU0RFVkJVUz0lcyIsIGRldi0+YnVzLT5uYW1lKTsKKyNlbmRpZgogCiAJLyogYWRkIGRyaXZlciBuYW1lIChQSFlTREVWKiB2YWx1ZXMgYXJlIGRlcHJlY2F0ZWQpKi8KIAlpZiAoZGV2LT5kcml2ZXIpIHsKIAkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAogCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCiAJCQkgICAgICAgIkRSSVZFUj0lcyIsIGRldi0+ZHJpdmVyLT5uYW1lKTsKKyNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRAogCQlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCiAJCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKIAkJCSAgICAgICAiUEhZU0RFVkRSSVZFUj0lcyIsIGRldi0+ZHJpdmVyLT5uYW1lKTsKKyNlbmRpZgogCX0KIAogCS8qIHRlcm1pbmF0ZSwgc2V0IHRvIG5leHQgZnJlZSBzbG90LCBzaHJpbmsgYXZhaWxhYmxlIHNwYWNlICovCkBAIC0zODEsOCArMzg2LDU1IEBACiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+bm9kZSk7CiAJaW5pdF9NVVRFWCgmZGV2LT5zZW0pOwogCWRldmljZV9pbml0X3dha2V1cChkZXYsIDApOworCXNldF9kZXZfbm9kZShkZXYsIC0xKTsKIH0KIAorI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECitzdGF0aWMgaW50IHNldHVwX3BhcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwkvKiBTZXQgdGhlIHBhcmVudCB0byB0aGUgY2xhc3MsIG5vdCB0aGUgcGFyZW50IGRldmljZSAqLworCS8qIHRoaXMga2VlcHMgc3lzZnMgZnJvbSBoYXZpbmcgYSBzeW1saW5rIHRvIG1ha2Ugb2xkIHVkZXZzIGhhcHB5ICovCisJaWYgKGRldi0+Y2xhc3MpCisJCWRldi0+a29iai5wYXJlbnQgPSAmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iajsKKwllbHNlIGlmIChwYXJlbnQpCisJCWRldi0+a29iai5wYXJlbnQgPSAmcGFyZW50LT5rb2JqOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCB2aXJ0dWFsX2RldmljZV9wYXJlbnQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICghZGV2LT5jbGFzcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWRldi0+Y2xhc3MtPnZpcnR1YWxfZGlyKSB7CisJCXN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqdmlydHVhbF9kaXIgPSBOVUxMOworCisJCWlmICghdmlydHVhbF9kaXIpCisJCQl2aXJ0dWFsX2RpciA9IGtvYmplY3RfYWRkX2RpcigmZGV2aWNlc19zdWJzeXMua3NldC5rb2JqLCAidmlydHVhbCIpOworCQlkZXYtPmNsYXNzLT52aXJ0dWFsX2RpciA9IGtvYmplY3RfYWRkX2Rpcih2aXJ0dWFsX2RpciwgZGV2LT5jbGFzcy0+bmFtZSk7CisJfQorCisJZGV2LT5rb2JqLnBhcmVudCA9IGRldi0+Y2xhc3MtPnZpcnR1YWxfZGlyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldHVwX3BhcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlpbnQgZXJyb3I7CisKKwkvKiBpZiB0aGlzIGlzIGEgY2xhc3MgZGV2aWNlLCBhbmQgaGFzIG5vIHBhcmVudCwgY3JlYXRlIG9uZSAqLworCWlmICgoZGV2LT5jbGFzcykgJiYgKHBhcmVudCA9PSBOVUxMKSkgeworCQllcnJvciA9IHZpcnR1YWxfZGV2aWNlX3BhcmVudChkZXYpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfSBlbHNlIGlmIChwYXJlbnQpCisJCWRldi0+a29iai5wYXJlbnQgPSAmcGFyZW50LT5rb2JqOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogLyoqCiAgKglkZXZpY2VfYWRkIC0gYWRkIGRldmljZSB0byBkZXZpY2UgaGllcmFyY2h5LgogICoJQGRldjoJZGV2aWNlLgpAQCAtNDA1LDQyICs0NTcsNDQgQEAKIAlpZiAoIWRldiB8fCAhc3RybGVuKGRldi0+YnVzX2lkKSkKIAkJZ290byBFcnJvcjsKIAotCS8qIGlmIHRoaXMgaXMgYSBjbGFzcyBkZXZpY2UsIGFuZCBoYXMgbm8gcGFyZW50LCBjcmVhdGUgb25lICovCi0JaWYgKChkZXYtPmNsYXNzKSAmJiAoZGV2LT5wYXJlbnQgPT0gTlVMTCkpIHsKLQkJZXJyb3IgPSB2aXJ0dWFsX2RldmljZV9wYXJlbnQoZGV2KTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBFcnJvcjsKLQl9CisJcHJfZGVidWcoIkRFVjogcmVnaXN0ZXJpbmcgZGV2aWNlOiBJRCA9ICclcydcbiIsIGRldi0+YnVzX2lkKTsKIAogCXBhcmVudCA9IGdldF9kZXZpY2UoZGV2LT5wYXJlbnQpOwogCi0JcHJfZGVidWcoIkRFVjogcmVnaXN0ZXJpbmcgZGV2aWNlOiBJRCA9ICclcydcbiIsIGRldi0+YnVzX2lkKTsKKwllcnJvciA9IHNldHVwX3BhcmVudChkZXYsIHBhcmVudCk7CisJaWYgKGVycm9yKQorCQlnb3RvIEVycm9yOwogCiAJLyogZmlyc3QsIHJlZ2lzdGVyIHdpdGggZ2VuZXJpYyBsYXllci4gKi8KIAlrb2JqZWN0X3NldF9uYW1lKCZkZXYtPmtvYmosICIlcyIsIGRldi0+YnVzX2lkKTsKLQlpZiAocGFyZW50KQotCQlkZXYtPmtvYmoucGFyZW50ID0gJnBhcmVudC0+a29iajsKLQotCWlmICgoZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqKSkpCisJZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqKTsKKwlpZiAoZXJyb3IpCiAJCWdvdG8gRXJyb3I7CiAKIAkvKiBub3RpZnkgcGxhdGZvcm0gb2YgZGV2aWNlIGVudHJ5ICovCiAJaWYgKHBsYXRmb3JtX25vdGlmeSkKIAkJcGxhdGZvcm1fbm90aWZ5KGRldik7CiAKKwkvKiBub3RpZnkgY2xpZW50cyBvZiBkZXZpY2UgZW50cnkgKG5ldyB3YXkpICovCisJaWYgKGRldi0+YnVzKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+YnVzX25vdGlmaWVyLAorCQkJCQkgICAgIEJVU19OT1RJRllfQUREX0RFVklDRSwgZGV2KTsKKwogCWRldi0+dWV2ZW50X2F0dHIuYXR0ci5uYW1lID0gInVldmVudCI7CiAJZGV2LT51ZXZlbnRfYXR0ci5hdHRyLm1vZGUgPSBTX0lXVVNSOwogCWlmIChkZXYtPmRyaXZlcikKIAkJZGV2LT51ZXZlbnRfYXR0ci5hdHRyLm93bmVyID0gZGV2LT5kcml2ZXItPm93bmVyOwogCWRldi0+dWV2ZW50X2F0dHIuc3RvcmUgPSBzdG9yZV91ZXZlbnQ7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldi0+dWV2ZW50X2F0dHIpOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldi0+dWV2ZW50X2F0dHIpOworCWlmIChlcnJvcikKKwkJZ290byBhdHRyRXJyb3I7CiAKIAlpZiAoTUFKT1IoZGV2LT5kZXZ0KSkgewogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cjsKIAkJYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCphdHRyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghYXR0cikgewogCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJZ290byBQTUVycm9yOworCQkJZ290byB1ZXZlbnRhdHRyRXJyb3I7CiAJCX0KIAkJYXR0ci0+YXR0ci5uYW1lID0gImRldiI7CiAJCWF0dHItPmF0dHIubW9kZSA9IFNfSVJVR087CkBAIC00NTAsNyArNTA0LDcgQEAKIAkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCBhdHRyKTsKIAkJaWYgKGVycm9yKSB7CiAJCQlrZnJlZShhdHRyKTsKLQkJCWdvdG8gYXR0ckVycm9yOworCQkJZ290byB1ZXZlbnRhdHRyRXJyb3I7CiAJCX0KIAogCQlkZXYtPmRldnRfYXR0ciA9IGF0dHI7CkBAIC00NTksMTMgKzUxMywxOCBAQAogCWlmIChkZXYtPmNsYXNzKSB7CiAJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZkZXYtPmNsYXNzLT5zdWJzeXMua3NldC5rb2JqLAogCQkJCSAgInN1YnN5c3RlbSIpOwotCQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwgJmRldi0+a29iaiwKLQkJCQkgIGRldi0+YnVzX2lkKTsKKwkJLyogSWYgdGhpcyBpcyBub3QgYSAiZmFrZSIgY29tcGF0aWJsZSBkZXZpY2UsIHRoZW4gY3JlYXRlIHRoZQorCQkgKiBzeW1saW5rIGZyb20gdGhlIGNsYXNzIHRvIHRoZSBkZXZpY2UuICovCisJCWlmIChkZXYtPmtvYmoucGFyZW50ICE9ICZkZXYtPmNsYXNzLT5zdWJzeXMua3NldC5rb2JqKQorCQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+Y2xhc3MtPnN1YnN5cy5rc2V0LmtvYmosCisJCQkJCSAgJmRldi0+a29iaiwgZGV2LT5idXNfaWQpOworI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJCWlmIChwYXJlbnQpIHsKIAkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZkZXYtPnBhcmVudC0+a29iaiwgImRldmljZSIpOwogCQkJY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShkZXYtPmNsYXNzLT5uYW1lLCAmZGV2LT5rb2JqKTsKIAkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPnBhcmVudC0+a29iaiwgJmRldi0+a29iaiwgY2xhc3NfbmFtZSk7CiAJCX0KKyNlbmRpZgogCX0KIAogCWlmICgoZXJyb3IgPSBkZXZpY2VfYWRkX2F0dHJzKGRldikpKQpAQCAtNDc3LDcgKzUzNiw4IEBACiAJaWYgKChlcnJvciA9IGJ1c19hZGRfZGV2aWNlKGRldikpKQogCQlnb3RvIEJ1c0Vycm9yOwogCWtvYmplY3RfdWV2ZW50KCZkZXYtPmtvYmosIEtPQkpfQUREKTsKLQlidXNfYXR0YWNoX2RldmljZShkZXYpOworCWlmICgoZXJyb3IgPSBidXNfYXR0YWNoX2RldmljZShkZXYpKSkKKwkJZ290byBBdHRhY2hFcnJvcjsKIAlpZiAocGFyZW50KQogCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsICZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKIApAQCAtNDk2LDkgKzU1NiwxNCBAQAogIAlrZnJlZShjbGFzc19uYW1lKTsKIAlwdXRfZGV2aWNlKGRldik7CiAJcmV0dXJuIGVycm9yOworIEF0dGFjaEVycm9yOgorCWJ1c19yZW1vdmVfZGV2aWNlKGRldik7CiAgQnVzRXJyb3I6CiAJZGV2aWNlX3BtX3JlbW92ZShkZXYpOwogIFBNRXJyb3I6CisJaWYgKGRldi0+YnVzKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+YnVzX25vdGlmaWVyLAorCQkJCQkgICAgIEJVU19OT1RJRllfREVMX0RFVklDRSwgZGV2KTsKIAlkZXZpY2VfcmVtb3ZlX2dyb3VwcyhkZXYpOwogIEdyb3VwRXJyb3I6CiAgCWRldmljZV9yZW1vdmVfYXR0cnMoZGV2KTsKQEAgLTUwNyw2ICs1NzIsOCBAQAogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCBkZXYtPmRldnRfYXR0cik7CiAJCWtmcmVlKGRldi0+ZGV2dF9hdHRyKTsKIAl9CisgdWV2ZW50YXR0ckVycm9yOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXYtPnVldmVudF9hdHRyKTsKICBhdHRyRXJyb3I6CiAJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9SRU1PVkUpOwogCWtvYmplY3RfZGVsKCZkZXYtPmtvYmopOwpAQCAtNTc5LDIyICs2NDYsMzEgQEAKIHZvaWQgZGV2aWNlX2RlbChzdHJ1Y3QgZGV2aWNlICogZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKiBwYXJlbnQgPSBkZXYtPnBhcmVudDsKLQljaGFyICpjbGFzc19uYW1lID0gTlVMTDsKIAlzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmOwogCiAJaWYgKHBhcmVudCkKIAkJa2xpc3RfZGVsKCZkZXYtPmtub2RlX3BhcmVudCk7Ci0JaWYgKGRldi0+ZGV2dF9hdHRyKQorCWlmIChkZXYtPmRldnRfYXR0cikgewogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCBkZXYtPmRldnRfYXR0cik7CisJCWtmcmVlKGRldi0+ZGV2dF9hdHRyKTsKKwl9CiAJaWYgKGRldi0+Y2xhc3MpIHsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwotCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwgZGV2LT5idXNfaWQpOwotCQljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGRldi0+Y2xhc3MtPm5hbWUsICZkZXYtPmtvYmopOworCQkvKiBJZiB0aGlzIGlzIG5vdCBhICJmYWtlIiBjb21wYXRpYmxlIGRldmljZSwgcmVtb3ZlIHRoZQorCQkgKiBzeW1saW5rIGZyb20gdGhlIGNsYXNzIHRvIHRoZSBkZXZpY2UuICovCisJCWlmIChkZXYtPmtvYmoucGFyZW50ICE9ICZkZXYtPmNsYXNzLT5zdWJzeXMua3NldC5rb2JqKQorCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnN1YnN5cy5rc2V0LmtvYmosCisJCQkJCSAgZGV2LT5idXNfaWQpOworI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJCWlmIChwYXJlbnQpIHsKLQkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkZXZpY2UiKTsKKwkJCWNoYXIgKmNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoZGV2LT5jbGFzcy0+bmFtZSwKKwkJCQkJCQkgICAmZGV2LT5rb2JqKTsKIAkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPnBhcmVudC0+a29iaiwgY2xhc3NfbmFtZSk7CisJCQlrZnJlZShjbGFzc19uYW1lKTsKKwkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkZXZpY2UiKTsKIAkJfQotCQlrZnJlZShjbGFzc19uYW1lKTsKKyNlbmRpZgorCiAJCWRvd24oJmRldi0+Y2xhc3MtPnNlbSk7CiAJCS8qIG5vdGlmeSBhbnkgaW50ZXJmYWNlcyB0aGF0IHRoZSBkZXZpY2UgaXMgbm93IGdvbmUgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGFzc19pbnRmLCAmZGV2LT5jbGFzcy0+aW50ZXJmYWNlcywgbm9kZSkKQEAgLTYwNywxMyArNjgzLDE2IEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldi0+dWV2ZW50X2F0dHIpOwogCWRldmljZV9yZW1vdmVfZ3JvdXBzKGRldik7CiAJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYpOworCWJ1c19yZW1vdmVfZGV2aWNlKGRldik7CiAKIAkvKiBOb3RpZnkgdGhlIHBsYXRmb3JtIG9mIHRoZSByZW1vdmFsLCBpbiBjYXNlIHRoZXkKIAkgKiBuZWVkIHRvIGRvIGFueXRoaW5nLi4uCiAJICovCiAJaWYgKHBsYXRmb3JtX25vdGlmeV9yZW1vdmUpCiAJCXBsYXRmb3JtX25vdGlmeV9yZW1vdmUoZGV2KTsKLQlidXNfcmVtb3ZlX2RldmljZShkZXYpOworCWlmIChkZXYtPmJ1cykKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPmJ1c19ub3RpZmllciwKKwkJCQkJICAgICBCVVNfTk9USUZZX0RFTF9ERVZJQ0UsIGRldik7CiAJZGV2aWNlX3BtX3JlbW92ZShkZXYpOwogCWtvYmplY3RfdWV2ZW50KCZkZXYtPmtvYmosIEtPQkpfUkVNT1ZFKTsKIAlrb2JqZWN0X2RlbCgmZGV2LT5rb2JqKTsKQEAgLTY3MiwxMiArNzUxLDQ1IEBACiAJcmV0dXJuIGVycm9yOwogfQogCisvKioKKyAqIGRldmljZV9maW5kX2NoaWxkIC0gZGV2aWNlIGl0ZXJhdG9yIGZvciBsb2NhdGluZyBhIHBhcnRpY3VsYXIgZGV2aWNlLgorICogQHBhcmVudDogcGFyZW50IHN0cnVjdCBkZXZpY2UKKyAqIEBkYXRhOiBEYXRhIHRvIHBhc3MgdG8gbWF0Y2ggZnVuY3Rpb24KKyAqIEBtYXRjaDogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2hlY2sgZGV2aWNlCisgKgorICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoKSBmdW5jdGlvbiBhYm92ZSwgYnV0IGl0CisgKiByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZGV2aWNlIHRoYXQgaXMgJ2ZvdW5kJyBmb3IgbGF0ZXIgdXNlLCBhcworICogZGV0ZXJtaW5lZCBieSB0aGUgQG1hdGNoIGNhbGxiYWNrLgorICoKKyAqIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIDAgaWYgdGhlIGRldmljZSBkb2Vzbid0IG1hdGNoIGFuZCBub24temVybworICogaWYgaXQgZG9lcy4gIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIG5vbi16ZXJvIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUKKyAqIGN1cnJlbnQgZGV2aWNlIGNhbiBiZSBvYnRhaW5lZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0byB0aGUgY2FsbGVyCisgKiBhbmQgbm90IGl0ZXJhdGUgb3ZlciBhbnkgbW9yZSBkZXZpY2VzLgorICovCitzdHJ1Y3QgZGV2aWNlICogZGV2aWNlX2ZpbmRfY2hpbGQoc3RydWN0IGRldmljZSAqcGFyZW50LCB2b2lkICpkYXRhLAorCQkJCSAgaW50ICgqbWF0Y2gpKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSkKK3sKKwlzdHJ1Y3Qga2xpc3RfaXRlciBpOworCXN0cnVjdCBkZXZpY2UgKmNoaWxkOworCisJaWYgKCFwYXJlbnQpCisJCXJldHVybiBOVUxMOworCisJa2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CisJd2hpbGUgKChjaGlsZCA9IG5leHRfZGV2aWNlKCZpKSkpCisJCWlmIChtYXRjaChjaGlsZCwgZGF0YSkgJiYgZ2V0X2RldmljZShjaGlsZCkpCisJCQlicmVhazsKKwlrbGlzdF9pdGVyX2V4aXQoJmkpOworCXJldHVybiBjaGlsZDsKK30KKwogaW50IF9faW5pdCBkZXZpY2VzX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gc3Vic3lzdGVtX3JlZ2lzdGVyKCZkZXZpY2VzX3N1YnN5cyk7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9mb3JfZWFjaF9jaGlsZCk7CitFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfZmluZF9jaGlsZCk7CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9pbml0aWFsaXplKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9hZGQpOwpAQCAtODAwLDEzICs5MTIsMTcgQEAKIAogCXByX2RlYnVnKCJERVZJQ0U6IHJlbmFtaW5nICclcycgdG8gJyVzJ1xuIiwgZGV2LT5idXNfaWQsIG5ld19uYW1lKTsKIAorI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJaWYgKChkZXYtPmNsYXNzKSAmJiAoZGV2LT5wYXJlbnQpKQogCQlvbGRfY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShkZXYtPmNsYXNzLT5uYW1lLCAmZGV2LT5rb2JqKTsKKyNlbmRpZgogCiAJaWYgKGRldi0+Y2xhc3MpIHsKIAkJb2xkX3N5bWxpbmtfbmFtZSA9IGttYWxsb2MoQlVTX0lEX1NJWkUsIEdGUF9LRVJORUwpOwotCQlpZiAoIW9sZF9zeW1saW5rX25hbWUpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKCFvbGRfc3ltbGlua19uYW1lKSB7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9mcmVlX29sZF9jbGFzczsKKwkJfQogCQlzdHJsY3B5KG9sZF9zeW1saW5rX25hbWUsIGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSk7CiAJfQogCkBAIC04MTQsNiArOTMwLDcgQEAKIAogCWVycm9yID0ga29iamVjdF9yZW5hbWUoJmRldi0+a29iaiwgbmV3X25hbWUpOwogCisjaWZkZWYgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQKIAlpZiAob2xkX2NsYXNzX25hbWUpIHsKIAkJbmV3X2NsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoZGV2LT5jbGFzcy0+bmFtZSwgJmRldi0+a29iaik7CiAJCWlmIChuZXdfY2xhc3NfbmFtZSkgewpAQCAtODIyLDYgKzkzOSw4IEBACiAJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5wYXJlbnQtPmtvYmosIG9sZF9jbGFzc19uYW1lKTsKIAkJfQogCX0KKyNlbmRpZgorCiAJaWYgKGRldi0+Y2xhc3MpIHsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnN1YnN5cy5rc2V0LmtvYmosCiAJCQkJICBvbGRfc3ltbGlua19uYW1lKTsKQEAgLTgzMCw5ICs5NDksMTAyIEBACiAJfQogCXB1dF9kZXZpY2UoZGV2KTsKIAotCWtmcmVlKG9sZF9jbGFzc19uYW1lKTsKIAlrZnJlZShuZXdfY2xhc3NfbmFtZSk7CiAJa2ZyZWUob2xkX3N5bWxpbmtfbmFtZSk7Cisgb3V0X2ZyZWVfb2xkX2NsYXNzOgorCWtmcmVlKG9sZF9jbGFzc19uYW1lKTsKIAogCXJldHVybiBlcnJvcjsKIH0KKworCitzdGF0aWMgaW50IGRldmljZV9tb3ZlX2NsYXNzX2xpbmtzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpvbGRfcGFyZW50LAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKm5ld19wYXJlbnQpCit7CisjaWZkZWYgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQKKwlpbnQgZXJyb3I7CisJY2hhciAqY2xhc3NfbmFtZTsKKworCWNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoZGV2LT5jbGFzcy0+bmFtZSwgJmRldi0+a29iaik7CisJaWYgKCFjbGFzc19uYW1lKSB7CisJCWVycm9yID0gUFRSX0VSUihjbGFzc19uYW1lKTsKKwkJY2xhc3NfbmFtZSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAob2xkX3BhcmVudCkgeworCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZGV2aWNlIik7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZvbGRfcGFyZW50LT5rb2JqLCBjbGFzc19uYW1lKTsKKwl9CisJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLCAmbmV3X3BhcmVudC0+a29iaiwgImRldmljZSIpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmbmV3X3BhcmVudC0+a29iaiwgJmRldi0+a29iaiwgY2xhc3NfbmFtZSk7CisJaWYgKGVycm9yKQorCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZGV2aWNlIik7CitvdXQ6CisJa2ZyZWUoY2xhc3NfbmFtZSk7CisJcmV0dXJuIGVycm9yOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioKKyAqIGRldmljZV9tb3ZlIC0gbW92ZXMgYSBkZXZpY2UgdG8gYSBuZXcgcGFyZW50CisgKiBAZGV2OiB0aGUgcG9pbnRlciB0byB0aGUgc3RydWN0IGRldmljZSB0byBiZSBtb3ZlZAorICogQG5ld19wYXJlbnQ6IHRoZSBuZXcgcGFyZW50IG9mIHRoZSBkZXZpY2UKKyAqLworaW50IGRldmljZV9tb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbmV3X3BhcmVudCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGRldmljZSAqb2xkX3BhcmVudDsKKworCWRldiA9IGdldF9kZXZpY2UoZGV2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRldmljZV9pc19yZWdpc3RlcmVkKGRldikpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJbmV3X3BhcmVudCA9IGdldF9kZXZpY2UobmV3X3BhcmVudCk7CisJaWYgKCFuZXdfcGFyZW50KSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXByX2RlYnVnKCJERVZJQ0U6IG1vdmluZyAnJXMnIHRvICclcydcbiIsIGRldi0+YnVzX2lkLAorCQluZXdfcGFyZW50LT5idXNfaWQpOworCWVycm9yID0ga29iamVjdF9tb3ZlKCZkZXYtPmtvYmosICZuZXdfcGFyZW50LT5rb2JqKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHV0X2RldmljZShuZXdfcGFyZW50KTsKKwkJZ290byBvdXQ7CisJfQorCW9sZF9wYXJlbnQgPSBkZXYtPnBhcmVudDsKKwlkZXYtPnBhcmVudCA9IG5ld19wYXJlbnQ7CisJaWYgKG9sZF9wYXJlbnQpCisJCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9wYXJlbnQpOworCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwgJm5ld19wYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKKwlpZiAoIWRldi0+Y2xhc3MpCisJCWdvdG8gb3V0X3B1dDsKKwllcnJvciA9IGRldmljZV9tb3ZlX2NsYXNzX2xpbmtzKGRldiwgb2xkX3BhcmVudCwgbmV3X3BhcmVudCk7CisJaWYgKGVycm9yKSB7CisJCS8qIFdlIGlnbm9yZSBlcnJvcnMgb24gY2xlYW51cCBzaW5jZSB3ZSdyZSBob3NlZCBhbnl3YXkuLi4gKi8KKwkJZGV2aWNlX21vdmVfY2xhc3NfbGlua3MoZGV2LCBuZXdfcGFyZW50LCBvbGRfcGFyZW50KTsKKwkJaWYgKCFrb2JqZWN0X21vdmUoJmRldi0+a29iaiwgJm9sZF9wYXJlbnQtPmtvYmopKSB7CisJCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfcGFyZW50KTsKKwkJCWlmIChvbGRfcGFyZW50KQorCQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwKKwkJCQkJICAgICAgICZvbGRfcGFyZW50LT5rbGlzdF9jaGlsZHJlbik7CisJCX0KKwkJcHV0X2RldmljZShuZXdfcGFyZW50KTsKKwkJZ290byBvdXQ7CisJfQorb3V0X3B1dDoKKwlwdXRfZGV2aWNlKG9sZF9wYXJlbnQpOworb3V0OgorCXB1dF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9tb3ZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jcHUuYyBiL2RyaXZlcnMvYmFzZS9jcHUuYwppbmRleCA0YmVmNzZhLi43ZmQwOTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY3B1LmMKKysrIGIvZHJpdmVycy9iYXNlL2NwdS5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xMDMsOCArMTA0LDggQEAKIAogLyoKICAqIHJlZ2lzdGVyX2NwdSAtIFNldHVwIGEgZHJpdmVyZnMgZGV2aWNlIGZvciBhIENQVS4KLSAqIEBjcHUgLSBDYWxsZXJzIGNhbiBzZXQgdGhlIGNwdS0+bm9fY29udHJvbCBmaWVsZCB0byAxLCB0byBpbmRpY2F0ZSBub3QgdG8KLSAqCQkgIGdlbmVyYXRlIGEgY29udHJvbCBmaWxlIGluIHN5c2ZzIGZvciB0aGlzIENQVS4KKyAqIEBjcHUgLSBjcHUtPmhvdHBsdWdnYWJsZSBmaWVsZCBzZXQgdG8gMSB3aWxsIGdlbmVyYXRlIGEgY29udHJvbCBmaWxlIGluCisgKgkgIHN5c2ZzIGZvciB0aGlzIENQVS4KICAqIEBudW0gLSBDUFUgbnVtYmVyIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBkZXZpY2UuCiAgKgogICogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgdGhlIENQVSBkZXZpY2UuCkBAIC0xMTgsNyArMTE5LDcgQEAKIAogCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZjcHUtPnN5c2Rldik7CiAKLQlpZiAoIWVycm9yICYmICFjcHUtPm5vX2NvbnRyb2wpCisJaWYgKCFlcnJvciAmJiBjcHUtPmhvdHBsdWdnYWJsZSkKIAkJcmVnaXN0ZXJfY3B1X2NvbnRyb2woY3B1KTsKIAlpZiAoIWVycm9yKQogCQljcHVfc3lzX2RldmljZXNbbnVtXSA9ICZjcHUtPnN5c2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmMKaW5kZXggYjVmNDNjMy4uNTEwZTc4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RkLmMKKysrIGIvZHJpdmVycy9iYXNlL2RkLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCiAjaW5jbHVkZSAiYmFzZS5oIgogI2luY2x1ZGUgInBvd2VyL3Bvd2VyLmgiCkBAIC0yNSw2ICsyNiw1MCBAQAogI2RlZmluZSB0b19kcnYobm9kZSkgY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBkZXZpY2VfZHJpdmVyLCBrb2JqLmVudHJ5KQogCiAKK3N0YXRpYyB2b2lkIGRyaXZlcl9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+a25vZGVfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2aWNlICVzIGFscmVhZHkgYm91bmRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJCXJldHVybjsKKwl9CisKKwlwcl9kZWJ1ZygiYm91bmQgZGV2aWNlICclcycgdG8gZHJpdmVyICclcydcbiIsCisJCSBkZXYtPmJ1c19pZCwgZGV2LT5kcml2ZXItPm5hbWUpOworCisJaWYgKGRldi0+YnVzKQorCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+YnVzX25vdGlmaWVyLAorCQkJCQkgICAgIEJVU19OT1RJRllfQk9VTkRfRFJJVkVSLCBkZXYpOworCisJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfZHJpdmVyLCAmZGV2LT5kcml2ZXItPmtsaXN0X2RldmljZXMpOworfQorCitzdGF0aWMgaW50IGRyaXZlcl9zeXNmc19hZGQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5kcml2ZXItPmtvYmosICZkZXYtPmtvYmosCisJCQkgIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZkZXYtPmRyaXZlci0+a29iaiwKKwkJCQkJImRyaXZlciIpOworCQlpZiAocmV0KQorCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+ZHJpdmVyLT5rb2JqLAorCQkJCQlrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkcml2ZXJfc3lzZnNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisKKwlpZiAoZHJ2KSB7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkcnYtPmtvYmosIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkcml2ZXIiKTsKKwl9Cit9CisKIC8qKgogICoJZGV2aWNlX2JpbmRfZHJpdmVyIC0gYmluZCBhIGRyaXZlciB0byBvbmUgZGV2aWNlLgogICoJQGRldjoJZGV2aWNlLgpAQCAtNDEsMjcgKzg2LDggQEAKICAqLwogaW50IGRldmljZV9iaW5kX2RyaXZlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaW50IHJldDsKLQotCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZkZXYtPmtub2RlX2RyaXZlcikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldmljZSAlcyBhbHJlYWR5IGJvdW5kXG4iLAotCQkJX19GVU5DVElPTl9fLCBrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcl9kZWJ1ZygiYm91bmQgZGV2aWNlICclcycgdG8gZHJpdmVyICclcydcbiIsCi0JCSBkZXYtPmJ1c19pZCwgZGV2LT5kcml2ZXItPm5hbWUpOwotCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2RyaXZlciwgJmRldi0+ZHJpdmVyLT5rbGlzdF9kZXZpY2VzKTsKLQlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5kcml2ZXItPmtvYmosICZkZXYtPmtvYmosCi0JCQkgIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZkZXYtPmRyaXZlci0+a29iaiwKLQkJCQkJImRyaXZlciIpOwotCQlpZiAocmV0KQotCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+ZHJpdmVyLT5rb2JqLAotCQkJCQlrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOwotCX0KLQlyZXR1cm4gcmV0OworCWRyaXZlcl9ib3VuZChkZXYpOworCXJldHVybiBkcml2ZXJfc3lzZnNfYWRkKGRldik7CiB9CiAKIHN0cnVjdCBzdHVwaWRfdGhyZWFkX3N0cnVjdHVyZSB7CkBAIC03MCw2ICs5Niw4IEBACiB9OwogCiBzdGF0aWMgYXRvbWljX3QgcHJvYmVfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChwcm9iZV93YWl0cXVldWUpOworCiBzdGF0aWMgaW50IHJlYWxseV9wcm9iZSh2b2lkICp2b2lkX2RhdGEpCiB7CiAJc3RydWN0IHN0dXBpZF90aHJlYWRfc3RydWN0dXJlICpkYXRhID0gdm9pZF9kYXRhOwpAQCAtODIsMzAgKzExMCwzMiBAQAogCQkgZHJ2LT5idXMtPm5hbWUsIGRydi0+bmFtZSwgZGV2LT5idXNfaWQpOwogCiAJZGV2LT5kcml2ZXIgPSBkcnY7CisJaWYgKGRyaXZlcl9zeXNmc19hZGQoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcml2ZXJfc3lzZnNfYWRkKCVzKSBmYWlsZWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGRldi0+YnVzX2lkKTsKKwkJZ290byBwcm9iZV9mYWlsZWQ7CisJfQorCiAJaWYgKGRldi0+YnVzLT5wcm9iZSkgewogCQlyZXQgPSBkZXYtPmJ1cy0+cHJvYmUoZGV2KTsKLQkJaWYgKHJldCkgewotCQkJZGV2LT5kcml2ZXIgPSBOVUxMOworCQlpZiAocmV0KQogCQkJZ290byBwcm9iZV9mYWlsZWQ7Ci0JCX0KIAl9IGVsc2UgaWYgKGRydi0+cHJvYmUpIHsKIAkJcmV0ID0gZHJ2LT5wcm9iZShkZXYpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXYtPmRyaXZlciA9IE5VTEw7CisJCWlmIChyZXQpCiAJCQlnb3RvIHByb2JlX2ZhaWxlZDsKLQkJfQogCX0KLQlpZiAoZGV2aWNlX2JpbmRfZHJpdmVyKGRldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZGV2aWNlX2JpbmRfZHJpdmVyKCVzKSBmYWlsZWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIGRldi0+YnVzX2lkKTsKLQkJLyogSG93IGRvZXMgdW5kbyBhIC0+cHJvYmU/ICBXZSdyZSBzY3Jld2VkLiAqLwotCX0KKworCWRyaXZlcl9ib3VuZChkZXYpOwogCXJldCA9IDE7CiAJcHJfZGVidWcoIiVzOiBCb3VuZCBEZXZpY2UgJXMgdG8gRHJpdmVyICVzXG4iLAogCQkgZHJ2LT5idXMtPm5hbWUsIGRldi0+YnVzX2lkLCBkcnYtPm5hbWUpOwogCWdvdG8gZG9uZTsKIAogcHJvYmVfZmFpbGVkOgorCWRyaXZlcl9zeXNmc19yZW1vdmUoZGV2KTsKKwlkZXYtPmRyaXZlciA9IE5VTEw7CisKIAlpZiAocmV0ID09IC1FTk9ERVYgfHwgcmV0ID09IC1FTlhJTykgewogCQkvKiBEcml2ZXIgbWF0Y2hlZCwgYnV0IGRpZG4ndCBzdXBwb3J0IGRldmljZQogCQkgKiBvciBkZXZpY2Ugbm90IGZvdW5kLgpAQCAtMTIxLDYgKzE1MSw3IEBACiBkb25lOgogCWtmcmVlKGRhdGEpOwogCWF0b21pY19kZWMoJnByb2JlX2NvdW50KTsKKwl3YWtlX3VwKCZwcm9iZV93YWl0cXVldWUpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3MSw2ICsyMDIsOCBAQAogCQkgZHJ2LT5idXMtPm5hbWUsIGRldi0+YnVzX2lkLCBkcnYtPm5hbWUpOwogCiAJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKIAlkYXRhLT5kcnYgPSBkcnY7CiAJZGF0YS0+ZGV2ID0gZGV2OwogCkBAIC0xNzgsNyArMjExLDcgQEAKIAkJcHJvYmVfdGFzayA9IGt0aHJlYWRfcnVuKHJlYWxseV9wcm9iZSwgZGF0YSwKIAkJCQkJICJwcm9iZS0lcyIsIGRldi0+YnVzX2lkKTsKIAkJaWYgKElTX0VSUihwcm9iZV90YXNrKSkKLQkJCXJldCA9IFBUUl9FUlIocHJvYmVfdGFzayk7CisJCQlyZXQgPSByZWFsbHlfcHJvYmUoZGF0YSk7CiAJfSBlbHNlCiAJCXJldCA9IHJlYWxseV9wcm9iZShkYXRhKTsKIApAQCAtMjc4LDEwICszMTEsMTUgQEAKIAlkcnYgPSBkZXYtPmRyaXZlcjsKIAlpZiAoZHJ2KSB7CiAJCWdldF9kcml2ZXIoZHJ2KTsKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRydi0+a29iaiwga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwkJZHJpdmVyX3N5c2ZzX3JlbW92ZShkZXYpOwogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZHJpdmVyIik7CiAJCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9kcml2ZXIpOwogCisJCWlmIChkZXYtPmJ1cykKKwkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5idXNfbm90aWZpZXIsCisJCQkJCQkgICAgIEJVU19OT1RJRllfVU5CSU5EX0RSSVZFUiwKKwkJCQkJCSAgICAgZGV2KTsKKwogCQlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnJlbW92ZSkKIAkJCWRldi0+YnVzLT5yZW1vdmUoZGV2KTsKIAkJZWxzZSBpZiAoZHJ2LT5yZW1vdmUpCkBAIC0zMzUsNiArMzczLDMyIEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX1BDSV9NVUxUSVRIUkVBRF9QUk9CRQorc3RhdGljIGludCBfX2luaXQgd2FpdF9mb3JfcHJvYmVzKHZvaWQpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogd2FpdGluZyBmb3IgJWQgdGhyZWFkc1xuIiwgX19GVU5DVElPTl9fLAorCQkJYXRvbWljX3JlYWQoJnByb2JlX2NvdW50KSk7CisJaWYgKCFhdG9taWNfcmVhZCgmcHJvYmVfY291bnQpKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnByb2JlX2NvdW50KSkgeworCQlwcmVwYXJlX3RvX3dhaXQoJnByb2JlX3dhaXRxdWV1ZSwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGF0b21pY19yZWFkKCZwcm9iZV9jb3VudCkpCisJCQlzY2hlZHVsZSgpOworCX0KKwlmaW5pc2hfd2FpdCgmcHJvYmVfd2FpdHF1ZXVlLCAmd2FpdCk7CisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGxfc3luYyh3YWl0X2Zvcl9wcm9iZXMpOworcG9zdGNvcmVfaW5pdGNhbGxfc3luYyh3YWl0X2Zvcl9wcm9iZXMpOworYXJjaF9pbml0Y2FsbF9zeW5jKHdhaXRfZm9yX3Byb2Jlcyk7CitzdWJzeXNfaW5pdGNhbGxfc3luYyh3YWl0X2Zvcl9wcm9iZXMpOworZnNfaW5pdGNhbGxfc3luYyh3YWl0X2Zvcl9wcm9iZXMpOworZGV2aWNlX2luaXRjYWxsX3N5bmMod2FpdF9mb3JfcHJvYmVzKTsKK2xhdGVfaW5pdGNhbGxfc3luYyh3YWl0X2Zvcl9wcm9iZXMpOworI2VuZGlmCiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9iaW5kX2RyaXZlcik7CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcmVsZWFzZV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYXBvb2wuYyBiL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKaW5kZXggMzNjNWNjZS4uZjk1ZDUwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RtYXBvb2wuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIAl9IGVsc2UgaWYgKGFsbG9jYXRpb24gPCBzaXplKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghKHJldHZhbCA9IGttYWxsb2MgKHNpemVvZiAqcmV0dmFsLCBTTEFCX0tFUk5FTCkpKQorCWlmICghKHJldHZhbCA9IGttYWxsb2MgKHNpemVvZiAqcmV0dmFsLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiByZXR2YWw7CiAKIAlzdHJsY3B5IChyZXR2YWwtPm5hbWUsIG5hbWUsIHNpemVvZiByZXR2YWwtPm5hbWUpOwpAQCAtMTQxLDExICsxNDEsMjAgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkICgmcmV0dmFsLT53YWl0cSk7CiAKIAlpZiAoZGV2KSB7CisJCWludCByZXQ7CisKIAkJZG93biAoJnBvb2xzX2xvY2spOwogCQlpZiAobGlzdF9lbXB0eSAoJmRldi0+ZG1hX3Bvb2xzKSkKLQkJCWRldmljZV9jcmVhdGVfZmlsZSAoZGV2LCAmZGV2X2F0dHJfcG9vbHMpOworCQkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlIChkZXYsICZkZXZfYXR0cl9wb29scyk7CisJCWVsc2UKKwkJCXJldCA9IDA7CiAJCS8qIG5vdGU6ICBub3QgY3VycmVudGx5IGluc2lzdGluZyAibmFtZSIgYmUgdW5pcXVlICovCi0JCWxpc3RfYWRkICgmcmV0dmFsLT5wb29scywgJmRldi0+ZG1hX3Bvb2xzKTsKKwkJaWYgKCFyZXQpCisJCQlsaXN0X2FkZCAoJnJldHZhbC0+cG9vbHMsICZkZXYtPmRtYV9wb29scyk7CisJCWVsc2UgeworCQkJa2ZyZWUocmV0dmFsKTsKKwkJCXJldHZhbCA9IE5VTEw7CisJCX0KIAkJdXAgKCZwb29sc19sb2NrKTsKIAl9IGVsc2UKIAkJSU5JVF9MSVNUX0hFQUQgKCZyZXR2YWwtPnBvb2xzKTsKQEAgLTE2NCw3ICsxNzMsNyBAQAogCW1hcHNpemUgPSAobWFwc2l6ZSArIEJJVFNfUEVSX0xPTkcgLSAxKSAvIEJJVFNfUEVSX0xPTkc7CiAJbWFwc2l6ZSAqPSBzaXplb2YgKGxvbmcpOwogCi0JcGFnZSA9IChzdHJ1Y3QgZG1hX3BhZ2UgKikga21hbGxvYyAobWFwc2l6ZSArIHNpemVvZiAqcGFnZSwgbWVtX2ZsYWdzKTsKKwlwYWdlID0ga21hbGxvYyhtYXBzaXplICsgc2l6ZW9mICpwYWdlLCBtZW1fZmxhZ3MpOwogCWlmICghcGFnZSkKIAkJcmV0dXJuIE5VTEw7CiAJcGFnZS0+dmFkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQgKHBvb2wtPmRldiwKQEAgLTI4OCw3ICsyOTcsNyBAQAogCQkJfQogCQl9CiAJfQotCWlmICghKHBhZ2UgPSBwb29sX2FsbG9jX3BhZ2UgKHBvb2wsIFNMQUJfQVRPTUlDKSkpIHsKKwlpZiAoIShwYWdlID0gcG9vbF9hbGxvY19wYWdlIChwb29sLCBHRlBfQVRPTUlDKSkpIHsKIAkJaWYgKG1lbV9mbGFncyAmIF9fR0ZQX1dBSVQpIHsKIAkJCURFQ0xBUkVfV0FJVFFVRVVFICh3YWl0LCBjdXJyZW50KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwppbmRleCAxNDYxNTY5Li40YmFkMjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSAiYmFzZS5oIgogCisjZGVmaW5lIHRvX2RldihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCisKIE1PRFVMRV9BVVRIT1IoIk1hbnVlbCBFc3RyYWRhIFNhaW56IDxyYW50eUBkZWJpYW4ub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNdWx0aSBwdXJwb3NlIGZpcm13YXJlIGxvYWRpbmcgc3VwcG9ydCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtODYsMTIgKzg4LDEyIEBACiAKIHN0YXRpYyBDTEFTU19BVFRSKHRpbWVvdXQsIDA2NDQsIGZpcm13YXJlX3RpbWVvdXRfc2hvdywgZmlybXdhcmVfdGltZW91dF9zdG9yZSk7CiAKLXN0YXRpYyB2b2lkICBmd19jbGFzc19kZXZfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpOworc3RhdGljIHZvaWQgZndfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KTsKIAotc3RhdGljIGludCBmaXJtd2FyZV9jbGFzc191ZXZlbnQoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICoqZW52cCwKLQkJCQkgaW50IG51bV9lbnZwLCBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3N0YXRpYyBpbnQgZmlybXdhcmVfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJCSAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBpID0gMCwgbGVuID0gMDsKIAogCWlmICghdGVzdF9iaXQoRldfU1RBVFVTX1JFQURZLCAmZndfcHJpdi0+c3RhdHVzKSkKQEAgLTExMCwyMSArMTEyLDIxIEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgZmlybXdhcmVfY2xhc3MgPSB7CiAJLm5hbWUJCT0gImZpcm13YXJlIiwKLQkudWV2ZW50CQk9IGZpcm13YXJlX2NsYXNzX3VldmVudCwKLQkucmVsZWFzZQk9IGZ3X2NsYXNzX2Rldl9yZWxlYXNlLAorCS5kZXZfdWV2ZW50CT0gZmlybXdhcmVfdWV2ZW50LAorCS5kZXZfcmVsZWFzZQk9IGZ3X2Rldl9yZWxlYXNlLAogfTsKIAotc3RhdGljIHNzaXplX3QKLWZpcm13YXJlX2xvYWRpbmdfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGZpcm13YXJlX2xvYWRpbmdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBsb2FkaW5nID0gdGVzdF9iaXQoRldfU1RBVFVTX0xPQURJTkcsICZmd19wcml2LT5zdGF0dXMpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBsb2FkaW5nKTsKIH0KIAogLyoqCiAgKiBmaXJtd2FyZV9sb2FkaW5nX3N0b3JlIC0gc2V0IHZhbHVlIGluIHRoZSAnbG9hZGluZycgY29udHJvbCBmaWxlCi0gKiBAY2xhc3NfZGV2OiBjbGFzc19kZXZpY2UgcG9pbnRlcgorICogQGRldjogZGV2aWNlIHBvaW50ZXIKICAqIEBidWY6IGJ1ZmZlciB0byBzY2FuIGZvciBsb2FkaW5nIGNvbnRyb2wgdmFsdWUKICAqIEBjb3VudDogbnVtYmVyIG9mIGJ5dGVzIGluIEBidWYKICAqCkBAIC0xMzQsMTEgKzEzNiwxMSBAQAogICoJIDA6IENvbmNsdWRlIHRoZSBsb2FkIGFuZCBoYW5kIHRoZSBkYXRhIHRvIHRoZSBkcml2ZXIgY29kZS4KICAqCS0xOiBDb25jbHVkZSB0aGUgbG9hZCB3aXRoIGFuIGVycm9yIGFuZCBkaXNjYXJkIGFueSB3cml0dGVuIGRhdGEuCiAgKiovCi1zdGF0aWMgc3NpemVfdAotZmlybXdhcmVfbG9hZGluZ19zdG9yZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCi0JCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGZpcm13YXJlX2xvYWRpbmdfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBsb2FkaW5nID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAogCXN3aXRjaCAobG9hZGluZykgewpAQCAtMTc0LDE1ICsxNzYsMTQgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihsb2FkaW5nLCAwNjQ0LAotCQkJZmlybXdhcmVfbG9hZGluZ19zaG93LCBmaXJtd2FyZV9sb2FkaW5nX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsb2FkaW5nLCAwNjQ0LCBmaXJtd2FyZV9sb2FkaW5nX3Nob3csIGZpcm13YXJlX2xvYWRpbmdfc3RvcmUpOwogCiBzdGF0aWMgc3NpemVfdAogZmlybXdhcmVfZGF0YV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkgICBjaGFyICpidWZmZXIsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSB0b19jbGFzc19kZXYoa29iaik7Ci0Jc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqKTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJc3NpemVfdCByZXRfY291bnQgPSBjb3VudDsKIApAQCAtMjM0LDcgKzIzNSw3IEBACiAKIC8qKgogICogZmlybXdhcmVfZGF0YV93cml0ZSAtIHdyaXRlIG1ldGhvZCBmb3IgZmlybXdhcmUKLSAqIEBrb2JqOiBrb2JqZWN0IGZvciB0aGUgY2xhc3NfZGV2aWNlCisgKiBAa29iajoga29iamVjdCBmb3IgdGhlIGRldmljZQogICogQGJ1ZmZlcjogYnVmZmVyIGJlaW5nIHdyaXR0ZW4KICAqIEBvZmZzZXQ6IGJ1ZmZlciBvZmZzZXQgZm9yIHdyaXRlIGluIHRvdGFsIGRhdGEgc3RvcmUgYXJlYQogICogQGNvdW50OiBidWZmZXIgc2l6ZQpAQCAtMjQ2LDggKzI0Nyw4IEBACiBmaXJtd2FyZV9kYXRhX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkgICAgY2hhciAqYnVmZmVyLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2ID0gdG9fY2xhc3NfZGV2KGtvYmopOwotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iaik7CisJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCXNzaXplX3QgcmV0dmFsOwogCkBAIC0yODAsMTMgKzI4MSwxMiBAQAogCS53cml0ZSA9IGZpcm13YXJlX2RhdGFfd3JpdGUsCiB9OwogCi1zdGF0aWMgdm9pZAotZndfY2xhc3NfZGV2X3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQorc3RhdGljIHZvaWQgZndfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJpdiAqZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJa2ZyZWUoZndfcHJpdik7Ci0Ja2ZyZWUoY2xhc3NfZGV2KTsKKwlrZnJlZShkZXYpOwogCiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CkBAIC0yOTgsMjYgKzI5OCwyMyBAQAogCWZ3X2xvYWRfYWJvcnQoZndfcHJpdik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotZndfc2V0dXBfY2xhc3NfZGV2aWNlX2lkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGZ3X3NldHVwX2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpmX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQogewogCS8qIFhYWCB3YXJuaW5nIHdlIHNob3VsZCB3YXRjaCBvdXQgZm9yIG5hbWUgY29sbGlzaW9ucyAqLwotCXN0cmxjcHkoY2xhc3NfZGV2LT5jbGFzc19pZCwgZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFKTsKKwlzdHJsY3B5KGZfZGV2LT5idXNfaWQsIGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSk7CiB9CiAKLXN0YXRpYyBpbnQKLWZ3X3JlZ2lzdGVyX2NsYXNzX2RldmljZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICoqY2xhc3NfZGV2X3AsCi0JCQkgY29uc3QgY2hhciAqZndfbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBmd19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqKmRldl9wLCBjb25zdCBjaGFyICpmd19uYW1lLAorCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWludCByZXR2YWw7CiAJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXYgPSBremFsbG9jKHNpemVvZigqZndfcHJpdiksCiAJCQkJCQlHRlBfS0VSTkVMKTsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSBremFsbG9jKHNpemVvZigqY2xhc3NfZGV2KSwKLQkJCQkJCSBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgZGV2aWNlICpmX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpmX2RldiksIEdGUF9LRVJORUwpOwogCi0JKmNsYXNzX2Rldl9wID0gTlVMTDsKKwkqZGV2X3AgPSBOVUxMOwogCi0JaWYgKCFmd19wcml2IHx8ICFjbGFzc19kZXYpIHsKKwlpZiAoIWZ3X3ByaXYgfHwgIWZfZGV2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGttYWxsb2MgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX2tmcmVlOwpAQCAtMzMxLDU1ICszMjgsNTQgQEAKIAlmd19wcml2LT50aW1lb3V0LmRhdGEgPSAodV9sb25nKSBmd19wcml2OwogCWluaXRfdGltZXIoJmZ3X3ByaXYtPnRpbWVvdXQpOwogCi0JZndfc2V0dXBfY2xhc3NfZGV2aWNlX2lkKGNsYXNzX2RldiwgZGV2aWNlKTsKLQljbGFzc19kZXYtPmRldiA9IGRldmljZTsKLQljbGFzc19kZXYtPmNsYXNzID0gJmZpcm13YXJlX2NsYXNzOwotCWNsYXNzX3NldF9kZXZkYXRhKGNsYXNzX2RldiwgZndfcHJpdik7Ci0JcmV0dmFsID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKGNsYXNzX2Rldik7CisJZndfc2V0dXBfZGV2aWNlX2lkKGZfZGV2LCBkZXZpY2UpOworCWZfZGV2LT5wYXJlbnQgPSBkZXZpY2U7CisJZl9kZXYtPmNsYXNzID0gJmZpcm13YXJlX2NsYXNzOworCWRldl9zZXRfZHJ2ZGF0YShmX2RldiwgZndfcHJpdik7CisJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKGZfZGV2KTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNsYXNzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCiAJCSAgICAgICBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGVycm9yX2tmcmVlOwogCX0KLQkqY2xhc3NfZGV2X3AgPSBjbGFzc19kZXY7CisJKmRldl9wID0gZl9kZXY7CiAJcmV0dXJuIDA7CiAKIGVycm9yX2tmcmVlOgogCWtmcmVlKGZ3X3ByaXYpOwotCWtmcmVlKGNsYXNzX2Rldik7CisJa2ZyZWUoZl9kZXYpOwogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQKLWZ3X3NldHVwX2NsYXNzX2RldmljZShzdHJ1Y3QgZmlybXdhcmUgKmZ3LCBzdHJ1Y3QgY2xhc3NfZGV2aWNlICoqY2xhc3NfZGV2X3AsCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZ3X25hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgaW50IHVldmVudCkKK3N0YXRpYyBpbnQgZndfc2V0dXBfZGV2aWNlKHN0cnVjdCBmaXJtd2FyZSAqZncsIHN0cnVjdCBkZXZpY2UgKipkZXZfcCwKKwkJCSAgIGNvbnN0IGNoYXIgKmZ3X25hbWUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIGludCB1ZXZlbnQpCiB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UgKmZfZGV2OwogCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2OwogCWludCByZXR2YWw7CiAKLQkqY2xhc3NfZGV2X3AgPSBOVUxMOwotCXJldHZhbCA9IGZ3X3JlZ2lzdGVyX2NsYXNzX2RldmljZSgmY2xhc3NfZGV2LCBmd19uYW1lLCBkZXZpY2UpOworCSpkZXZfcCA9IE5VTEw7CisJcmV0dmFsID0gZndfcmVnaXN0ZXJfZGV2aWNlKCZmX2RldiwgZndfbmFtZSwgZGV2aWNlKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIG91dDsKIAogCS8qIE5lZWQgdG8gcGluIHRoaXMgbW9kdWxlIHVudGlsIGNsYXNzIGRldmljZSBpcyBkZXN0cm95ZWQgKi8KIAlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwogCi0JZndfcHJpdiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShmX2Rldik7CiAKIAlmd19wcml2LT5mdyA9IGZ3OwotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmY2xhc3NfZGV2LT5rb2JqLCAmZndfcHJpdi0+YXR0cl9kYXRhKTsKKwlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmZfZGV2LT5rb2JqLCAmZndfcHJpdi0+YXR0cl9kYXRhKTsKIAlpZiAocmV0dmFsKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSBmYWlsZWRcbiIsCiAJCSAgICAgICBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGVycm9yX3VucmVnOwogCX0KIAotCXJldHZhbCA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc19kZXYsCi0JCQkJCSAgJmNsYXNzX2RldmljZV9hdHRyX2xvYWRpbmcpOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShmX2RldiwgJmRldl9hdHRyX2xvYWRpbmcpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gZXJyb3JfdW5yZWc7CiAJfQpAQCAtMzg4LDExICszODQsMTEgQEAKICAgICAgICAgICAgICAgICBzZXRfYml0KEZXX1NUQVRVU19SRUFEWSwgJmZ3X3ByaXYtPnN0YXR1cyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBzZXRfYml0KEZXX1NUQVRVU19SRUFEWV9OT0hPVFBMVUcsICZmd19wcml2LT5zdGF0dXMpOwotCSpjbGFzc19kZXZfcCA9IGNsYXNzX2RldjsKKwkqZGV2X3AgPSBmX2RldjsKIAlnb3RvIG91dDsKIAogZXJyb3JfdW5yZWc6Ci0JY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoY2xhc3NfZGV2KTsKKwlkZXZpY2VfdW5yZWdpc3RlcihmX2Rldik7CiBvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTQwMSw3ICszOTcsNyBAQAogX3JlcXVlc3RfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZmlybXdhcmVfcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgaW50IHVldmVudCkKIHsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CisJc3RydWN0IGRldmljZSAqZl9kZXY7CiAJc3RydWN0IGZpcm13YXJlX3ByaXYgKmZ3X3ByaXY7CiAJc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKIAlpbnQgcmV0dmFsOwpAQCAtNDE3LDEyICs0MTMsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0dmFsID0gZndfc2V0dXBfY2xhc3NfZGV2aWNlKGZpcm13YXJlLCAmY2xhc3NfZGV2LCBuYW1lLCBkZXZpY2UsCi0JCQkJICAgICAgIHVldmVudCk7CisJcmV0dmFsID0gZndfc2V0dXBfZGV2aWNlKGZpcm13YXJlLCAmZl9kZXYsIG5hbWUsIGRldmljZSwgdWV2ZW50KTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yX2tmcmVlX2Z3OwogCi0JZndfcHJpdiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJZndfcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShmX2Rldik7CiAKIAlpZiAodWV2ZW50KSB7CiAJCWlmIChsb2FkaW5nX3RpbWVvdXQgPiAwKSB7CkBAIC00MzAsNyArNDI1LDcgQEAKIAkJCWFkZF90aW1lcigmZndfcHJpdi0+dGltZW91dCk7CiAJCX0KIAotCQlrb2JqZWN0X3VldmVudCgmY2xhc3NfZGV2LT5rb2JqLCBLT0JKX0FERCk7CisJCWtvYmplY3RfdWV2ZW50KCZmX2Rldi0+a29iaiwgS09CSl9BREQpOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmd19wcml2LT5jb21wbGV0aW9uKTsKIAkJc2V0X2JpdChGV19TVEFUVVNfRE9ORSwgJmZ3X3ByaXYtPnN0YXR1cyk7CiAJCWRlbF90aW1lcl9zeW5jKCZmd19wcml2LT50aW1lb3V0KTsKQEAgLTQ0NSw3ICs0NDAsNyBAQAogCX0KIAlmd19wcml2LT5mdyA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZmd19sb2NrKTsKLQljbGFzc19kZXZpY2VfdW5yZWdpc3RlcihjbGFzc19kZXYpOworCWRldmljZV91bnJlZ2lzdGVyKGZfZGV2KTsKIAlnb3RvIG91dDsKIAogZXJyb3Jfa2ZyZWVfZnc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKaW5kZXggYzZiN2Q5Yy4uNzRiOTY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL21lbW9yeS5jCisrKyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwpAQCAtMjkwLDkgKzI5MCw4IEBACiAKIHN0YXRpYyBpbnQgYmxvY2tfc2l6ZV9pbml0KHZvaWQpCiB7Ci0Jc3lzZnNfY3JlYXRlX2ZpbGUoJm1lbW9yeV9zeXNkZXZfY2xhc3Mua3NldC5rb2JqLAotCQkmY2xhc3NfYXR0cl9ibG9ja19zaXplX2J5dGVzLmF0dHIpOwotCXJldHVybiAwOworCXJldHVybiBzeXNmc19jcmVhdGVfZmlsZSgmbWVtb3J5X3N5c2Rldl9jbGFzcy5rc2V0LmtvYmosCisJCQkJJmNsYXNzX2F0dHJfYmxvY2tfc2l6ZV9ieXRlcy5hdHRyKTsKIH0KIAogLyoKQEAgLTMyMywxMiArMzIyLDE0IEBACiAKIHN0YXRpYyBpbnQgbWVtb3J5X3Byb2JlX2luaXQodm9pZCkKIHsKLQlzeXNmc19jcmVhdGVfZmlsZSgmbWVtb3J5X3N5c2Rldl9jbGFzcy5rc2V0LmtvYmosCi0JCSZjbGFzc19hdHRyX3Byb2JlLmF0dHIpOwotCXJldHVybiAwOworCXJldHVybiBzeXNmc19jcmVhdGVfZmlsZSgmbWVtb3J5X3N5c2Rldl9jbGFzcy5rc2V0LmtvYmosCisJCQkJJmNsYXNzX2F0dHJfcHJvYmUuYXR0cik7CiB9CiAjZWxzZQotI2RlZmluZSBtZW1vcnlfcHJvYmVfaW5pdCguLi4pCWRvIHt9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSBpbnQgbWVtb3J5X3Byb2JlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAvKgpAQCAtNDMxLDkgKzQzMiwxMiBAQAogewogCXVuc2lnbmVkIGludCBpOwogCWludCByZXQ7CisJaW50IGVycjsKIAogCW1lbW9yeV9zeXNkZXZfY2xhc3Mua3NldC51ZXZlbnRfb3BzID0gJm1lbW9yeV91ZXZlbnRfb3BzOwogCXJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmbWVtb3J5X3N5c2Rldl9jbGFzcyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAkvKgogCSAqIENyZWF0ZSBlbnRyaWVzIGZvciBtZW1vcnkgc2VjdGlvbnMgdGhhdCB3ZXJlIGZvdW5kCkBAIC00NDIsMTEgKzQ0NiwxOSBAQAogCWZvciAoaSA9IDA7IGkgPCBOUl9NRU1fU0VDVElPTlM7IGkrKykgewogCQlpZiAoIXZhbGlkX3NlY3Rpb25fbnIoaSkpCiAJCQljb250aW51ZTsKLQkJYWRkX21lbW9yeV9ibG9jaygwLCBfX25yX3RvX3NlY3Rpb24oaSksIE1FTV9PTkxJTkUsIDApOworCQllcnIgPSBhZGRfbWVtb3J5X2Jsb2NrKDAsIF9fbnJfdG9fc2VjdGlvbihpKSwgTUVNX09OTElORSwgMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZXJyOwogCX0KIAotCW1lbW9yeV9wcm9iZV9pbml0KCk7Ci0JYmxvY2tfc2l6ZV9pbml0KCk7Ci0KKwllcnIgPSBtZW1vcnlfcHJvYmVfaW5pdCgpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJZXJyID0gYmxvY2tfc2l6ZV9pbml0KCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKK291dDoKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgZmFpbGVkOiAlZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDk0MGNlNDEuLmY5YzkwM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0yMTIsNyArMjEyLDcgQEAKICAqCXBvaW50ZXIuICBUaGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGxhdGZvcm0gZGF0YSB3aWxsIGJlIGZyZWVkCiAgKgl3aGVuIHRoZSBwbGF0Zm9ybSBkZXZpY2UgaXMgcmVsZWFzZWQuCiAgKi8KLWludCBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCitpbnQgcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQogewogCXZvaWQgKmQ7CiAKQEAgLTM4OCw2ICszODgsMTEgQEAKIAlyZXR1cm4gZHJ2LT5wcm9iZShkZXYpOwogfQogCitzdGF0aWMgaW50IHBsYXRmb3JtX2Rydl9wcm9iZV9mYWlsKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJcmV0dXJuIC1FTlhJTzsKK30KKwogc3RhdGljIGludCBwbGF0Zm9ybV9kcnZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKF9kZXYtPmRyaXZlcik7CkBAIC00NTEsNiArNDU2LDQ5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcik7CiAKKy8qKgorICogcGxhdGZvcm1fZHJpdmVyX3Byb2JlIC0gcmVnaXN0ZXIgZHJpdmVyIGZvciBub24taG90cGx1Z2dhYmxlIGRldmljZQorICogQGRydjogcGxhdGZvcm0gZHJpdmVyIHN0cnVjdHVyZQorICogQHByb2JlOiB0aGUgZHJpdmVyIHByb2JlIHJvdXRpbmUsIHByb2JhYmx5IGZyb20gYW4gX19pbml0IHNlY3Rpb24KKyAqCisgKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigpIHdoZW4geW91IGtub3cgdGhlIGRldmljZQorICogaXMgbm90IGhvdHBsdWdnYWJsZSBhbmQgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLCBhbmQgeW91IHdhbnQgdG8KKyAqIHJlbW92ZSBpdHMgcnVuLW9uY2UgcHJvYmUoKSBpbmZyYXN0cnVjdHVyZSBmcm9tIG1lbW9yeSBhZnRlciB0aGUgZHJpdmVyCisgKiBoYXMgYm91bmQgdG8gdGhlIGRldmljZS4KKyAqCisgKiBPbmUgdHlwaWNhbCB1c2UgZm9yIHRoaXMgd291bGQgYmUgd2l0aCBkcml2ZXJzIGZvciBjb250cm9sbGVycyBpbnRlZ3JhdGVkCisgKiBpbnRvIHN5c3RlbS1vbi1jaGlwIHByb2Nlc3NvcnMsIHdoZXJlIHRoZSBjb250cm9sbGVyIGRldmljZXMgaGF2ZSBiZWVuCisgKiBjb25maWd1cmVkIGFzIHBhcnQgb2YgYm9hcmQgc2V0dXAuCisgKgorICogUmV0dXJucyB6ZXJvIGlmIHRoZSBkcml2ZXIgcmVnaXN0ZXJlZCBhbmQgYm91bmQgdG8gYSBkZXZpY2UsIGVsc2UgcmV0dXJucworICogYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGFuZCB3aXRoIHRoZSBkcml2ZXIgbm90IHJlZ2lzdGVyZWQuCisgKi8KK2ludCBfX2luaXRfb3JfbW9kdWxlIHBsYXRmb3JtX2RyaXZlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpkcnYsCisJCWludCAoKnByb2JlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopKQoreworCWludCByZXR2YWwsIGNvZGU7CisKKwkvKiB0ZW1wb3Jhcnkgc2VjdGlvbiB2aW9sYXRpb24gZHVyaW5nIHByb2JlKCkgKi8KKwlkcnYtPnByb2JlID0gcHJvYmU7CisJcmV0dmFsID0gY29kZSA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcihkcnYpOworCisJLyogRml4dXAgdGhhdCBzZWN0aW9uIHZpb2xhdGlvbiwgYmVpbmcgcGFyYW5vaWQgYWJvdXQgY29kZSBzY2FubmluZworCSAqIHRoZSBsaXN0IG9mIGRyaXZlcnMgaW4gb3JkZXIgdG8gcHJvYmUgbmV3IGRldmljZXMuICBDaGVjayB0byBzZWUKKwkgKiBpZiB0aGUgcHJvYmUgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBtYWtlIHN1cmUgYW55IGZvcmNlZCBwcm9iZXMgb2YKKwkgKiBuZXcgZGV2aWNlcyBmYWlsLgorCSAqLworCXNwaW5fbG9jaygmcGxhdGZvcm1fYnVzX3R5cGUua2xpc3RfZHJpdmVycy5rX2xvY2spOworCWRydi0+cHJvYmUgPSBOVUxMOworCWlmIChjb2RlID09IDAgJiYgbGlzdF9lbXB0eSgmZHJ2LT5kcml2ZXIua2xpc3RfZGV2aWNlcy5rX2xpc3QpKQorCQlyZXR2YWwgPSAtRU5PREVWOworCWRydi0+ZHJpdmVyLnByb2JlID0gcGxhdGZvcm1fZHJ2X3Byb2JlX2ZhaWw7CisJc3Bpbl91bmxvY2soJnBsYXRmb3JtX2J1c190eXBlLmtsaXN0X2RyaXZlcnMua19sb2NrKTsKKworCWlmIChjb2RlICE9IHJldHZhbCkKKwkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoZHJ2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGxhdGZvcm1fZHJpdmVyX3Byb2JlKTsKIAogLyogbW9kYWxpYXMgc3VwcG9ydCBlbmFibGVzIG1vcmUgaGFuZHMtb2ZmIHVzZXJzcGFjZSBzZXR1cDoKICAqIChhKSBlbnZpcm9ubWVudCB2YXJpYWJsZSBsZXRzIG5ldy1zdHlsZSBob3RwbHVnIGV2ZW50cyB3b3JrIG9uY2Ugc3lzdGVtIGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCmluZGV4IDNlZjlkNTEuLjA2N2E5ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCkBAIC05NCw1NSArOTQsNjEgQEAKIAkubmFtZSA9ICJ0b3BvbG9neSIKIH07CiAKK3N0YXRpYyBjcHVtYXNrX3QgdG9wb2xvZ3lfZGV2X21hcCA9IENQVV9NQVNLX05PTkU7CisKIC8qIEFkZC9SZW1vdmUgY3B1X3RvcG9sb2d5IGludGVyZmFjZSBmb3IgQ1BVIGRldmljZSAqLwotc3RhdGljIGludCBfX2NwdWluaXQgdG9wb2xvZ3lfYWRkX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c19kZXYpCitzdGF0aWMgaW50IF9fY3B1aW5pdCB0b3BvbG9neV9hZGRfZGV2KHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmdG9wb2xvZ3lfYXR0cl9ncm91cCk7Ci0JcmV0dXJuIDA7CisJaW50IHJjOworCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKworCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmdG9wb2xvZ3lfYXR0cl9ncm91cCk7CisJaWYgKCFyYykKKwkJY3B1X3NldChjcHUsIHRvcG9sb2d5X2Rldl9tYXApOworCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBfX2NwdWluaXQgdG9wb2xvZ3lfcmVtb3ZlX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c19kZXYpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgdG9wb2xvZ3lfcmVtb3ZlX2Rldih1bnNpZ25lZCBpbnQgY3B1KQogeworCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKworCWlmICghY3B1X2lzc2V0KGNwdSwgdG9wb2xvZ3lfZGV2X21hcCkpCisJCXJldHVybjsKKwljcHVfY2xlYXIoY3B1LCB0b3BvbG9neV9kZXZfbWFwKTsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZ0b3BvbG9neV9hdHRyX2dyb3VwKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2NwdWluaXQgdG9wb2xvZ3lfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0Jc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXY7CisJaW50IHJjID0gMDsKIAotCXN5c19kZXYgPSBnZXRfY3B1X3N5c2RldihjcHUpOwogCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCQl0b3BvbG9neV9hZGRfZGV2KHN5c19kZXYpOworCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CisJCXJjID0gdG9wb2xvZ3lfYWRkX2RldihjcHUpOwogCQlicmVhazsKKwljYXNlIENQVV9VUF9DQU5DRUxFRDoKIAljYXNlIENQVV9ERUFEOgotCQl0b3BvbG9neV9yZW1vdmVfZGV2KHN5c19kZXYpOworCQl0b3BvbG9neV9yZW1vdmVfZGV2KGNwdSk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiByYyA/IE5PVElGWV9CQUQgOiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0YSB0b3BvbG9neV9jcHVfbm90aWZpZXIgPQotewotCS5ub3RpZmllcl9jYWxsID0gdG9wb2xvZ3lfY3B1X2NhbGxiYWNrLAotfTsKLQogc3RhdGljIGludCBfX2NwdWluaXQgdG9wb2xvZ3lfc3lzZnNfaW5pdCh2b2lkKQogewotCWludCBpOworCWludCBjcHU7CisJaW50IHJjOwogCi0JZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCXRvcG9sb2d5X2NwdV9jYWxsYmFjaygmdG9wb2xvZ3lfY3B1X25vdGlmaWVyLCBDUFVfT05MSU5FLAotCQkJCSh2b2lkICopKGxvbmcpaSk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJcmMgPSB0b3BvbG9neV9hZGRfZGV2KGNwdSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKIAl9Ci0KLQlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnRvcG9sb2d5X2NwdV9ub3RpZmllcik7CisJaG90Y3B1X25vdGlmaWVyKHRvcG9sb2d5X2NwdV9jYWxsYmFjaywgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogZGV2aWNlX2luaXRjYWxsKHRvcG9sb2d5X3N5c2ZzX2luaXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jIGIvZHJpdmVycy9ibG9jay9EQUM5NjAuYwppbmRleCA3NDJkMDc0Li44ZDgxYTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jCisrKyBiL2RyaXZlcnMvYmxvY2svREFDOTYwLmMKQEAgLTMyNCwxMyArMzI0LDEzIEBACiAgICAgICBDb21tYW5kLT5OZXh0ID0gQ29udHJvbGxlci0+RnJlZUNvbW1hbmRzOwogICAgICAgQ29udHJvbGxlci0+RnJlZUNvbW1hbmRzID0gQ29tbWFuZDsKICAgICAgIENvbnRyb2xsZXItPkNvbW1hbmRzW0NvbW1hbmRJZGVudGlmaWVyLTFdID0gQ29tbWFuZDsKLSAgICAgIFNjYXR0ZXJHYXRoZXJDUFUgPSBwY2lfcG9vbF9hbGxvYyhTY2F0dGVyR2F0aGVyUG9vbCwgU0xBQl9BVE9NSUMsCisgICAgICBTY2F0dGVyR2F0aGVyQ1BVID0gcGNpX3Bvb2xfYWxsb2MoU2NhdHRlckdhdGhlclBvb2wsIEdGUF9BVE9NSUMsCiAJCQkJCQkJJlNjYXR0ZXJHYXRoZXJETUEpOwogICAgICAgaWYgKFNjYXR0ZXJHYXRoZXJDUFUgPT0gTlVMTCkKIAkgIHJldHVybiBEQUM5NjBfRmFpbHVyZShDb250cm9sbGVyLCAiQVVYSUxJQVJZIFNUUlVDVFVSRSBDUkVBVElPTiIpOwogCiAgICAgICBpZiAoUmVxdWVzdFNlbnNlUG9vbCAhPSBOVUxMKSB7Ci0gIAkgIFJlcXVlc3RTZW5zZUNQVSA9IHBjaV9wb29sX2FsbG9jKFJlcXVlc3RTZW5zZVBvb2wsIFNMQUJfQVRPTUlDLAorICAJICBSZXF1ZXN0U2Vuc2VDUFUgPSBwY2lfcG9vbF9hbGxvYyhSZXF1ZXN0U2Vuc2VQb29sLCBHRlBfQVRPTUlDLAogCQkJCQkJJlJlcXVlc3RTZW5zZURNQSk7CiAgIAkgIGlmIChSZXF1ZXN0U2Vuc2VDUFUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHBjaV9wb29sX2ZyZWUoU2NhdHRlckdhdGhlclBvb2wsIFNjYXR0ZXJHYXRoZXJDUFUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKaW5kZXggMTdkYzIyMi4uNThjMWRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwpAQCAtMjgsMTMgKzI4LDYgQEAKIAl0cmlzdGF0ZSAiQXRhcmkgZmxvcHB5IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBVEFSSQogCi1jb25maWcgQkxLX0RFVl9TV0lNX0lPUAotCWJvb2wgIk1hY2ludG9zaCBJSWZ4L1F1YWRyYSA5MDAvUXVhZHJhIDk1MCBmbG9wcHkgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIE1BQyAmJiBFWFBFUklNRU5UQUwgJiYgQlJPS0VOCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBTV0lNIChTdXBlciBXb3ogSW50ZWdyYXRlZCBNYWNoaW5lKSBJT1AKLQkgIGZsb3BweSBjb250cm9sbGVyIG9uIHRoZSBNYWNpbnRvc2ggSUlmeCBhbmQgUXVhZHJhIDkwMC85NTAuCi0KIGNvbmZpZyBNQUNfRkxPUFBZCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIFBvd2VyTWFjIGZsb3BweSIKIAlkZXBlbmRzIG9uIFBQQ19QTUFDICYmICFQUENfUE1BQzY0CkBAIC0xNjgsNyArMTYxLDggQEAKIAogY29uZmlnIENJU1NfU0NTSV9UQVBFCiAJYm9vbCAiU0NTSSB0YXBlIGRyaXZlIHN1cHBvcnQgZm9yIFNtYXJ0IEFycmF5IDV4eHgiCi0JZGVwZW5kcyBvbiBCTEtfQ1BRX0NJU1NfREEgJiYgU0NTSSAmJiBQUk9DX0ZTCisJZGVwZW5kcyBvbiBCTEtfQ1BRX0NJU1NfREEgJiYgUFJPQ19GUworCWRlcGVuZHMgb24gU0NTST15IHx8IFNDU0k9QkxLX0NQUV9DSVNTX0RBCiAJaGVscAogCSAgV2hlbiBlbmFibGVkIChZKSwgdGhpcyBvcHRpb24gYWxsb3dzIFNDU0kgdGFwZSBkcml2ZXMgYW5kIFNDU0kgbWVkaXVtCiAJICBjaGFuZ2VycyAodGFwZSByb2JvdHMpIHRvIGJlIGFjY2Vzc2VkIHZpYSBhIENvbXBhcSA1eHh4IGFycmF5IApAQCAtMzA1LDYgKzI5OSw3IEBACiBjb25maWcgQkxLX0RFVl9DUllQVE9MT09QCiAJdHJpc3RhdGUgIkNyeXB0b2xvb3AgU3VwcG9ydCIKIAlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IENSWVBUT19DQkMKIAlkZXBlbmRzIG9uIEJMS19ERVZfTE9PUAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgdGhlIGNpcGhlcnMgdGhhdCBhcmUgCkBAIC00MjksMTQgKzQyNCwxOCBAQAogCXRyaXN0YXRlICJQYWNrZXQgd3JpdGluZyBvbiBDRC9EVkQgbWVkaWEiCiAJZGVwZW5kcyBvbiAhVU1MCiAJaGVscAotCSAgSWYgeW91IGhhdmUgYSBDRFJPTSBkcml2ZSB0aGF0IHN1cHBvcnRzIHBhY2tldCB3cml0aW5nLCBzYXkgWSB0bwotCSAgaW5jbHVkZSBwcmVsaW1pbmFyeSBzdXBwb3J0LiBJdCBzaG91bGQgd29yayB3aXRoIGFueSBNTUMvTXQgRnVqaQotCSAgY29tcGxpYW50IEFUQVBJIG9yIFNDU0kgZHJpdmUsIHdoaWNoIGlzIGp1c3QgYWJvdXQgYW55IG5ld2VyIENECi0JICB3cml0ZXIuCisJICBJZiB5b3UgaGF2ZSBhIENEUk9NL0RWRCBkcml2ZSB0aGF0IHN1cHBvcnRzIHBhY2tldCB3cml0aW5nLCBzYXkKKwkgIFkgdG8gaW5jbHVkZSBzdXBwb3J0LiBJdCBzaG91bGQgd29yayB3aXRoIGFueSBNTUMvTXQgRnVqaQorCSAgY29tcGxpYW50IEFUQVBJIG9yIFNDU0kgZHJpdmUsIHdoaWNoIGlzIGp1c3QgYWJvdXQgYW55IG5ld2VyCisJICBEVkQvQ0Qgd3JpdGVyLgogCi0JICBDdXJyZW50bHkgb25seSB3cml0aW5nIHRvIENELVJXLCBEVkQtUlcgYW5kIERWRCtSVyBkaXNjcyBpcyBwb3NzaWJsZS4KKwkgIEN1cnJlbnRseSBvbmx5IHdyaXRpbmcgdG8gQ0QtUlcsIERWRC1SVywgRFZEK1JXIGFuZCBEVkRSQU0gZGlzY3MKKwkgIGlzIHBvc3NpYmxlLgogCSAgRFZELVJXIGRpc2tzIG11c3QgYmUgaW4gcmVzdHJpY3RlZCBvdmVyd3JpdGUgbW9kZS4KIAorCSAgU2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vY2Ryb20vcGFja2V0LXdyaXRpbmcudHh0PgorCSAgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhlIHVzZSBvZiB0aGlzIGRyaXZlci4KKwogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGt0Y2R2ZC4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9NYWtlZmlsZSBiL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKaW5kZXggNDEwZjI1OS4uZGQ4OGUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCkBAIC05LDcgKzksNiBAQAogb2JqLSQoQ09ORklHX0JMS19ERVZfRkQpCSs9IGZsb3BweS5vCiBvYmotJChDT05GSUdfQU1JR0FfRkxPUFBZKQkrPSBhbWlmbG9wLm8KIG9iai0kKENPTkZJR19BVEFSSV9GTE9QUFkpCSs9IGF0YWZsb3Aubwotb2JqLSQoQ09ORklHX0JMS19ERVZfU1dJTV9JT1ApCSs9IHN3aW1faW9wLm8KIG9iai0kKENPTkZJR19BVEFSSV9BQ1NJKQkrPSBhY3NpLm8KIG9iai0kKENPTkZJR19BVEFSSV9TTE0pCQkrPSBhY3NpX3NsbS5vCiBvYmotJChDT05GSUdfQU1JR0FfWjJSQU0pCSs9IHoycmFtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYWNzaV9zbG0uYyBiL2RyaXZlcnMvYmxvY2svYWNzaV9zbG0uYwppbmRleCA4ZTQxYzg3Li5lMDRiZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2Fjc2lfc2xtLmMKKysrIGIvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jCkBAIC0zNjMsNyArMzYzLDcgQEAKIAkJCQkJCSBsb2ZmX3QgKnBwb3MgKQogCiB7Ci0Jc3RydWN0IGlub2RlICpub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICpub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAl1bnNpZ25lZCBsb25nIHBhZ2U7CiAJaW50IGxlbmd0aDsKIAlpbnQgZW5kOwpAQCAtNjE4LDcgKzYxOCw3IEBACiAJCQkJCQkgIGxvZmZfdCAqcHBvcyApCiAKIHsKLQlzdHJ1Y3QgaW5vZGUgKm5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludAkJZGV2aWNlID0gaW1pbm9yKG5vZGUpOwogCWludAkJbiwgZmlsbGVkLCB3LCBoOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2UuaCBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZS5oCmluZGV4IDZlZWJjYjcuLjIzMDhlODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZS5oCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZS5oCkBAIC0xLDUgKzEsNSBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA0IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KLSNkZWZpbmUgVkVSU0lPTiAiMjIiCisvKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLworI2RlZmluZSBWRVJTSU9OICIzMiIKICNkZWZpbmUgQU9FX01BSk9SIDE1MgogI2RlZmluZSBERVZJQ0VfTkFNRSAiYW9lIgogCkBAIC02NSw3ICs2NSw3IEBACiBzdHJ1Y3QgYW9lX2NmZ2hkciB7CiAJX19iZTE2IGJ1ZmNudDsKIAlfX2JlMTYgZnd2ZXI7Ci0JdW5zaWduZWQgY2hhciByZXM7CisJdW5zaWduZWQgY2hhciBzY250OwogCXVuc2lnbmVkIGNoYXIgYW9lY2NtZDsKIAl1bnNpZ25lZCBjaGFyIGNzbGVuWzJdOwogfTsKQEAgLTc4LDEyICs3OCwxNCBAQAogCURFVkZMX0dEQUxMT0MgPSAoMTw8NCksCS8qIG5lZWQgdG8gYWxsb2MgZ2VuZGlzayAqLwogCURFVkZMX1BBVVNFID0gKDE8PDUpLAogCURFVkZMX05FV1NJWkUgPSAoMTw8NiksCS8qIG5lZWQgdG8gdXBkYXRlIGRldiBzaXplIGluIGJsb2NrIGxheWVyICovCisJREVWRkxfTUFYQkNOVCA9ICgxPDw3KSwgLyogZC0+bWF4YmNudCBpcyBub3QgY2hhbmdlYWJsZSAqLworCURFVkZMX0tJQ0tNRSA9ICgxPDw4KSwKIAogCUJVRkZMX0ZBSUwgPSAxLAogfTsKIAogZW51bSB7Ci0JTUFYQVRBREFUQSA9IDEwMjQsCisJREVGQVVMVEJDTlQgPSAyICogNTEyLAkvKiAyIHNlY3RvcnMgKi8KIAlOUEVSU0hFTEYgPSAxNiwJCS8qIG51bWJlciBvZiBzbG90cyBwZXIgc2hlbGYgYWRkcmVzcyAqLwogCUZSRUVUQUcgPSAtMSwKIAlNSU5fQlVGUyA9IDgsCkBAIC0xMDcsMTEgKzEwOSw5IEBACiAJdWxvbmcgd2FpdGVkOwogCXN0cnVjdCBidWYgKmJ1ZjsKIAljaGFyICpidWZhZGRyOwotCWludCB3cml0ZWRhdGFsZW47Ci0JaW50IG5kYXRhOwotCi0JLyogbGFyZ2VzdCBwb3NzaWJsZSAqLwotCXVuc2lnbmVkIGNoYXIgZGF0YVtzaXplb2Yoc3RydWN0IGFvZV9oZHIpICsgc2l6ZW9mKHN0cnVjdCBhb2VfYXRhaGRyKV07CisJdWxvbmcgYmNudDsKKwlzZWN0b3JfdCBsYmE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIH07CiAKIHN0cnVjdCBhb2VkZXYgewpAQCAtMTIxLDkgKzEyMSwxMiBAQAogCXVsb25nIHN5c21pbm9yOwogCXVsb25nIGFvZW1ham9yOwogCXVsb25nIGFvZW1pbm9yOwotCXVsb25nIG5vcGVuOwkJLyogKGJkX29wZW5lcnMgaXNuJ3QgYXZhaWxhYmxlIHdpdGhvdXQgc2xlZXBpbmcpICovCi0JdWxvbmcgcnR0YXZnOwkJLyogcm91bmQgdHJpcCBhdmVyYWdlIG9mIHJlcXVlc3RzL3Jlc3BvbnNlcyAqLworCXUxNiBub3BlbjsJCS8qIChiZF9vcGVuZXJzIGlzbid0IGF2YWlsYWJsZSB3aXRob3V0IHNsZWVwaW5nKSAqLworCXUxNiBsYXN0dGFnOwkJLyogbGFzdCB0YWcgc2VudCAqLworCXUxNiBydHRhdmc7CQkvKiByb3VuZCB0cmlwIGF2ZXJhZ2Ugb2YgcmVxdWVzdHMvcmVzcG9uc2VzICovCisJdTE2IG1pbnRpbWVyOwogCXUxNiBmd192ZXI7CQkvKiB2ZXJzaW9uIG9mIGJsYWRlJ3MgZmlybXdhcmUgKi8KKwl1MTYgbWF4YmNudDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsvKiBkaXNrIGNyZWF0ZSB3b3JrIHN0cnVjdCAqLwogCXN0cnVjdCBnZW5kaXNrICpnZDsKIAlyZXF1ZXN0X3F1ZXVlX3QgYmxrcTsKQEAgLTEzNyw4ICsxNDAsOCBAQAogCW1lbXBvb2xfdCAqYnVmcG9vbDsJLyogZm9yIGRlYWRsb2NrLWZyZWUgQnVmIGFsbG9jYXRpb24gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGJ1ZnE7CS8qIHF1ZXVlIG9mIGJpb3MgdG8gd29yayBvbiAqLwogCXN0cnVjdCBidWYgKmlucHJvY2VzczsJLyogdGhlIG9uZSB3ZSdyZSBjdXJyZW50bHkgd29ya2luZyBvbiAqLwotCXVsb25nIGxhc3R0YWc7CQkvKiBsYXN0IHRhZyBzZW50ICovCi0JdWxvbmcgbmZyYW1lczsJCS8qIG51bWJlciBvZiBmcmFtZXMgYmVsb3cgKi8KKwl1c2hvcnQgbG9zdGp1bWJvOworCXVzaG9ydCBuZnJhbWVzOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBiZWxvdyAqLwogCXN0cnVjdCBmcmFtZSAqZnJhbWVzOwogfTsKIApAQCAtMTU2LDcgKzE1OSw4IEBACiB2b2lkIGFvZWNtZF9jZmcodXNob3J0IGFvZW1ham9yLCB1bnNpZ25lZCBjaGFyIGFvZW1pbm9yKTsKIHZvaWQgYW9lY21kX2F0YV9yc3Aoc3RydWN0IHNrX2J1ZmYgKik7CiB2b2lkIGFvZWNtZF9jZmdfcnNwKHN0cnVjdCBza19idWZmICopOwotdm9pZCBhb2VjbWRfc2xlZXB3b3JrKHZvaWQgKnZwKTsKK3ZvaWQgYW9lY21kX3NsZWVwd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYih1bG9uZyk7CiAKIGludCBhb2VkZXZfaW5pdCh2b2lkKTsKIHZvaWQgYW9lZGV2X2V4aXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VibGsuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCmluZGV4IDM5M2I4NmEuLjQ3ODQ4OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA0IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCiAvKgogICogYW9lYmxrLmMKICAqIGJsb2NrIGRldmljZSByb3V0aW5lcwpAQCAtMTIsOSArMTIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgImFvZS5oIgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpidWZfcG9vbF9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYnVmX3Bvb2xfY2FjaGU7CiAKLS8qIGFkZCBhdHRyaWJ1dGVzIGZvciBvdXIgYmxvY2sgZGV2aWNlcyBpbiBzeXNmcyAqLwogc3RhdGljIHNzaXplX3QgYW9lZGlza19zaG93X3N0YXRlKHN0cnVjdCBnZW5kaXNrICogZGlzaywgY2hhciAqcGFnZSkKIHsKIAlzdHJ1Y3QgYW9lZGV2ICpkID0gZGlzay0+cHJpdmF0ZV9kYXRhOwpAQCAtNjQsMjEgKzYzLDI3IEBACiAJLnNob3cgPSBhb2VkaXNrX3Nob3dfZnd2ZXIKIH07CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYW9lX2F0dHJzW10gPSB7CisJJmRpc2tfYXR0cl9zdGF0ZS5hdHRyLAorCSZkaXNrX2F0dHJfbWFjLmF0dHIsCisJJmRpc2tfYXR0cl9uZXRpZi5hdHRyLAorCSZkaXNrX2F0dHJfZnd2ZXIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFvZV9hdHRycywKK307CisKK3N0YXRpYyBpbnQKIGFvZWRpc2tfYWRkX3N5c2ZzKHN0cnVjdCBhb2VkZXYgKmQpCiB7Ci0Jc3lzZnNfY3JlYXRlX2ZpbGUoJmQtPmdkLT5rb2JqLCAmZGlza19hdHRyX3N0YXRlLmF0dHIpOwotCXN5c2ZzX2NyZWF0ZV9maWxlKCZkLT5nZC0+a29iaiwgJmRpc2tfYXR0cl9tYWMuYXR0cik7Ci0Jc3lzZnNfY3JlYXRlX2ZpbGUoJmQtPmdkLT5rb2JqLCAmZGlza19hdHRyX25ldGlmLmF0dHIpOwotCXN5c2ZzX2NyZWF0ZV9maWxlKCZkLT5nZC0+a29iaiwgJmRpc2tfYXR0cl9md3Zlci5hdHRyKTsKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZkLT5nZC0+a29iaiwgJmF0dHJfZ3JvdXApOwogfQogdm9pZAogYW9lZGlza19ybV9zeXNmcyhzdHJ1Y3QgYW9lZGV2ICpkKQogewotCXN5c2ZzX3JlbW92ZV9saW5rKCZkLT5nZC0+a29iaiwgInN0YXRlIik7Ci0Jc3lzZnNfcmVtb3ZlX2xpbmsoJmQtPmdkLT5rb2JqLCAibWFjIik7Ci0Jc3lzZnNfcmVtb3ZlX2xpbmsoJmQtPmdkLT5rb2JqLCAibmV0aWYiKTsKLQlzeXNmc19yZW1vdmVfbGluaygmZC0+Z2QtPmtvYmosICJmaXJtd2FyZS12ZXJzaW9uIik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkLT5nZC0+a29iaiwgJmF0dHJfZ3JvdXApOwogfQogCiBzdGF0aWMgaW50CkBAIC0xMzIsOCArMTM3LDcgQEAKIAlkID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CiAJYnVmID0gbWVtcG9vbF9hbGxvYyhkLT5idWZwb29sLCBHRlBfTk9JTyk7CiAJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lYmxrX21ha2VfcmVxdWVzdDogYnVmIGFsbG9jYXRpb24gIgotCQkJImZhaWx1cmVcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGJ1ZiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOwogCQliaW9fZW5kaW8oYmlvLCBiaW8tPmJpX3NpemUsIC1FTk9NRU0pOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNDMsMTQgKzE0NywxNSBAQAogCWJ1Zi0+YmlvID0gYmlvOwogCWJ1Zi0+cmVzaWQgPSBiaW8tPmJpX3NpemU7CiAJYnVmLT5zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKLQlidWYtPmJ2ID0gYnVmLT5iaW8tPmJpX2lvX3ZlYzsKKwlidWYtPmJ2ID0gJmJpby0+YmlfaW9fdmVjW2Jpby0+YmlfaWR4XTsKKwlXQVJOX09OKGJ1Zi0+YnYtPmJ2X2xlbiA9PSAwKTsKIAlidWYtPmJ2X3Jlc2lkID0gYnVmLT5idi0+YnZfbGVuOwogCWJ1Zi0+YnVmYWRkciA9IHBhZ2VfYWRkcmVzcyhidWYtPmJ2LT5idl9wYWdlKSArIGJ1Zi0+YnYtPmJ2X29mZnNldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoKGQtPmZsYWdzICYgREVWRkxfVVApID09IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBhb2VibGtfbWFrZV9yZXF1ZXN0OiBkZXZpY2UgJWxkLiVsZCBpcyBub3QgdXBcbiIsCisJCXByaW50ayhLRVJOX0lORk8gImFvZTogZGV2aWNlICVsZC4lbGQgaXMgbm90IHVwXG4iLAogCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwogCQltZW1wb29sX2ZyZWUoYnVmLCBkLT5idWZwb29sKTsKQEAgLTE3Niw3ICsxODEsNyBAQAogCXN0cnVjdCBhb2VkZXYgKmQgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoKGQtPmZsYWdzICYgREVWRkxfVVApID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGFvZWJsa19pb2N0bDogZGlzayBub3QgdXBcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogZGlzayBub3QgdXBcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTIwMyw4ICsyMDgsOCBAQAogCiAJZ2QgPSBhbGxvY19kaXNrKEFPRV9QQVJUSVRJT05TKTsKIAlpZiAoZ2QgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImFvZTogYW9lYmxrX2dkYWxsb2M6IGNhbm5vdCBhbGxvY2F0ZSBkaXNrICIKLQkJCSJzdHJ1Y3R1cmUgZm9yICVsZC4lbGRcbiIsIGQtPmFvZW1ham9yLCBkLT5hb2VtaW5vcik7CisJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBjYW5ub3QgYWxsb2NhdGUgZGlzayBzdHJ1Y3R1cmUgZm9yICVsZC4lbGRcbiIsCisJCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOwogCQlkLT5mbGFncyAmPSB+REVWRkxfR0RBTExPQzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwpAQCAtMjEzLDggKzIxOCw4IEBACiAKIAlkLT5idWZwb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKE1JTl9CVUZTLCBidWZfcG9vbF9jYWNoZSk7CiAJaWYgKGQtPmJ1ZnBvb2wgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImFvZTogYW9lYmxrX2dkYWxsb2M6IGNhbm5vdCBhbGxvY2F0ZSBidWZwb29sICIKLQkJCSJmb3IgJWxkLiVsZFxuIiwgZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGNhbm5vdCBhbGxvY2F0ZSBidWZwb29sIGZvciAlbGQuJWxkXG4iLAorCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yKTsKIAkJcHV0X2Rpc2soZ2QpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOwogCQlkLT5mbGFncyAmPSB+REVWRkxfR0RBTExPQzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKaW5kZXggMWJjMWNmOS4uZTIyYjRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDQgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLworLyogQ29weXJpZ2h0IChjKSAyMDA2IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KIC8qCiAgKiBhb2VjaHIuYwogICogQW9FIGNoYXJhY3RlciBkZXZpY2UgZHJpdmVyCkBAIC0xNSw3ICsxNSw2IEBACiAJTUlOT1JfSU5URVJGQUNFUywKIAlNSU5PUl9SRVZBTElEQVRFLAogCU1TR1NaID0gMjA0OCwKLQlOQVJHUyA9IDEwLAogCU5NU0cgPSAxMDAsCQkvKiBtZXNzYWdlIGJhY2tsb2cgdG8gcmV0YWluICovCiB9OwogCkBAIC01Niw5ICs1NSw4IEBACiBpbnRlcmZhY2VzKGNvbnN0IGNoYXIgX191c2VyICpzdHIsIHNpemVfdCBzaXplKQogewogCWlmIChzZXRfYW9lX2lmbGlzdChzdHIsIHNpemUpKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQKLQkJICAgICAgICIlczogY291bGQgbm90IHNldCBpbnRlcmZhY2UgbGlzdDogJXNcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sICJ0b28gbWFueSBpbnRlcmZhY2VzIik7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImFvZTogY291bGQgbm90IHNldCBpbnRlcmZhY2UgbGlzdDogdG9vIG1hbnkgaW50ZXJmYWNlc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKQEAgLTgxLDggKzc5LDcgQEAKIAkvKiBzaG91bGQgYmUgZSVkLiVkIGZvcm1hdCAqLwogCW4gPSBzc2NhbmYoYnVmLCAiZSVkLiVkIiwgJm1ham9yLCAmbWlub3IpOwogCWlmIChuICE9IDIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6ICVzOiBpbnZhbGlkIGRldmljZSBzcGVjaWZpY2F0aW9uXG4iLAotCQkJX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGludmFsaWQgZGV2aWNlIHNwZWNpZmljYXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZCA9IGFvZWRldl9ieV9hb2VhZGRyKG1ham9yLCBtaW5vcik7CkBAIC05MCw2ICs4Nyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKKwlkLT5mbGFncyAmPSB+REVWRkxfTUFYQkNOVDsKIAlkLT5mbGFncyB8PSBERVZGTF9QQVVTRTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7CiAJYW9lY21kX2NmZyhtYWpvciwgbWlub3IpOwpAQCAtMTE2LDcgKzExNCw3IEBACiAKIAltcCA9IGttYWxsb2MobiwgR0ZQX0FUT01JQyk7CiAJaWYgKG1wID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiYW9lOiBhb2VjaHJfZXJyb3I6IGFsbG9jYXRpb24gZmFpbHVyZSwgbGVuPSVsZFxuIiwgbik7CisJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBhbGxvY2F0aW9uIGZhaWx1cmUsIGxlbj0lbGRcbiIsIG4pOwogCQlnb3RvIGJhaWw7CiAJfQogCkBAIC0xNDEsNyArMTM5LDcgQEAKIAogCXN3aXRjaCAoKHVuc2lnbmVkIGxvbmcpIGZpbHAtPnByaXZhdGVfZGF0YSkgewogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lY2hyX3dyaXRlOiBjYW4ndCB3cml0ZSB0byB0aGF0IGZpbGUuXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBjYW4ndCB3cml0ZSB0byB0aGF0IGZpbGUuXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBNSU5PUl9ESVNDT1ZFUjoKIAkJcmV0ID0gZGlzY292ZXIoKTsKQEAgLTI1MCw3ICsyNDgsNyBAQAogCiAJbiA9IHJlZ2lzdGVyX2NocmRldihBT0VfTUFKT1IsICJhb2VjaHIiLCAmYW9lX2ZvcHMpOwogCWlmIChuIDwgMCkgeyAKLQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGFvZWNocl9pbml0OiBjYW4ndCByZWdpc3RlciBjaGFyIGRldmljZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBjYW4ndCByZWdpc3RlciBjaGFyIGRldmljZVxuIik7CiAJCXJldHVybiBuOwogCX0KIAlzZW1hX2luaXQoJmVtc2dzX3NlbWEsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lY21kLmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYwppbmRleCAzOWRhMjhkLi45N2Y3ZjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwNCBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLwogLyoKICAqIGFvZWNtZC5jCiAgKiBGaWxlc3lzdGVtIHJlcXVlc3QgaGFuZGxpbmcgbWV0aG9kcwpAQCAtMTUsMTcgKzE1LDE5IEBACiAjZGVmaW5lIFRJTUVSVElDSyAoSFogLyAxMCkKICNkZWZpbmUgTUlOVElNRVIgKDIgKiBUSU1FUlRJQ0spCiAjZGVmaW5lIE1BWFRJTUVSIChIWiA8PCAxKQotI2RlZmluZSBNQVhXQUlUICg2MCAqIDMpCS8qIEFmdGVyIE1BWFdBSVQgc2Vjb25kcywgZ2l2ZSB1cCBhbmQgZmFpbCBkZXYgKi8KIAotc3RhdGljIHN0cnVjdCBza19idWZmICoKLW5ld19za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmlmX2RldiwgdWxvbmcgbGVuKQorc3RhdGljIGludCBhb2VfZGVhZHNlY3MgPSA2MCAqIDM7Cittb2R1bGVfcGFyYW0oYW9lX2RlYWRzZWNzLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhhb2VfZGVhZHNlY3MsICJBZnRlciBhb2VfZGVhZHNlY3Mgc2Vjb25kcywgZ2l2ZSB1cCBhbmQgZmFpbCBkZXYuIik7CisKK3N0cnVjdCBza19idWZmICoKK25ld19za2IodWxvbmcgbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiKSB7CiAJCXNrYi0+bmgucmF3ID0gc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwotCQlza2ItPmRldiA9IGlmX2RldjsKIAkJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQU9FKTsKIAkJc2tiLT5wcmlvcml0eSA9IDA7CiAJCXNrYl9wdXQoc2tiLCBsZW4pOwpAQCAtNDAsMjkgKzQyLDYgQEAKIAlyZXR1cm4gc2tiOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgotc2tiX3ByZXBhcmUoc3RydWN0IGFvZWRldiAqZCwgc3RydWN0IGZyYW1lICpmKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JY2hhciAqcDsKLQotCXNrYiA9IG5ld19za2IoZC0+aWZwLCBmLT5uZGF0YSArIGYtPndyaXRlZGF0YWxlbik7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBza2JfcHJlcGFyZTogZmFpbHVyZSB0byBhbGxvY2F0ZSBza2JcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlwID0gc2tiLT5tYWMucmF3OwotCW1lbWNweShwLCBmLT5kYXRhLCBmLT5uZGF0YSk7Ci0KLQlpZiAoZi0+d3JpdGVkYXRhbGVuKSB7Ci0JCXAgKz0gc2l6ZW9mKHN0cnVjdCBhb2VfaGRyKSArIHNpemVvZihzdHJ1Y3QgYW9lX2F0YWhkcik7Ci0JCW1lbWNweShwLCBmLT5idWZhZGRyLCBmLT53cml0ZWRhdGFsZW4pOwotCX0KLQotCXJldHVybiBza2I7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZnJhbWUgKgogZ2V0ZnJhbWUoc3RydWN0IGFvZWRldiAqZCwgaW50IHRhZykKIHsKQEAgLTEwNyw2ICs4NiwxNyBAQAogCXJldHVybiBob3N0X3RhZzsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkCitwdXRfbGJhKHN0cnVjdCBhb2VfYXRhaGRyICphaCwgc2VjdG9yX3QgbGJhKQoreworCWFoLT5sYmEwID0gbGJhOworCWFoLT5sYmExID0gbGJhID4+PSA4OworCWFoLT5sYmEyID0gbGJhID4+PSA4OworCWFoLT5sYmEzID0gbGJhID4+PSA4OworCWFoLT5sYmE0ID0gbGJhID4+PSA4OworCWFoLT5sYmE1ID0gbGJhID4+PSA4OworfQorCiBzdGF0aWMgdm9pZAogYW9lY21kX2F0YV9ydyhzdHJ1Y3QgYW9lZGV2ICpkLCBzdHJ1Y3QgZnJhbWUgKmYpCiB7CkBAIC0xMjUsMjkgKzExNSwyNyBAQAogCiAJc2VjdG9yID0gYnVmLT5zZWN0b3I7CiAJYmNudCA9IGJ1Zi0+YnZfcmVzaWQ7Ci0JaWYgKGJjbnQgPiBNQVhBVEFEQVRBKQotCQliY250ID0gTUFYQVRBREFUQTsKKwlpZiAoYmNudCA+IGQtPm1heGJjbnQpCisJCWJjbnQgPSBkLT5tYXhiY250OwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgaGVhZGVycyAmIGZyYW1lICovCi0JaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBmLT5kYXRhOworCXNrYiA9IGYtPnNrYjsKKwloID0gKHN0cnVjdCBhb2VfaGRyICopIHNrYi0+bWFjLnJhdzsKIAlhaCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaCsxKTsKLQlmLT5uZGF0YSA9IHNpemVvZiAqaCArIHNpemVvZiAqYWg7Ci0JbWVtc2V0KGgsIDAsIGYtPm5kYXRhKTsKKwlza2ItPmxlbiA9IHNpemVvZiAqaCArIHNpemVvZiAqYWg7CisJbWVtc2V0KGgsIDAsIEVUSF9aTEVOKTsKIAlmLT50YWcgPSBhb2VoZHJfYXRhaW5pdChkLCBoKTsKIAlmLT53YWl0ZWQgPSAwOwogCWYtPmJ1ZiA9IGJ1ZjsKIAlmLT5idWZhZGRyID0gYnVmLT5idWZhZGRyOworCWYtPmJjbnQgPSBiY250OworCWYtPmxiYSA9IHNlY3RvcjsKIAogCS8qIHNldCB1cCBhdGEgaGVhZGVyICovCiAJYWgtPnNjbnQgPSBiY250ID4+IDk7Ci0JYWgtPmxiYTAgPSBzZWN0b3I7Ci0JYWgtPmxiYTEgPSBzZWN0b3IgPj49IDg7Ci0JYWgtPmxiYTIgPSBzZWN0b3IgPj49IDg7Ci0JYWgtPmxiYTMgPSBzZWN0b3IgPj49IDg7CisJcHV0X2xiYShhaCwgc2VjdG9yKTsKIAlpZiAoZC0+ZmxhZ3MgJiBERVZGTF9FWFQpIHsKIAkJYWgtPmFmbGFncyB8PSBBT0VBRkxfRVhUOwotCQlhaC0+bGJhNCA9IHNlY3RvciA+Pj0gODsKLQkJYWgtPmxiYTUgPSBzZWN0b3IgPj49IDg7CiAJfSBlbHNlIHsKIAkJZXh0Yml0ID0gMDsKIAkJYWgtPmxiYTMgJj0gMHgwZjsKQEAgLTE1NSwxMSArMTQzLDE0IEBACiAJfQogCiAJaWYgKGJpb19kYXRhX2RpcihidWYtPmJpbykgPT0gV1JJVEUpIHsKKwkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgMCwgdmlydF90b19wYWdlKGYtPmJ1ZmFkZHIpLAorCQkJb2Zmc2V0X2luX3BhZ2UoZi0+YnVmYWRkciksIGJjbnQpOwogCQlhaC0+YWZsYWdzIHw9IEFPRUFGTF9XUklURTsKLQkJZi0+d3JpdGVkYXRhbGVuID0gYmNudDsKKwkJc2tiLT5sZW4gKz0gYmNudDsKKwkJc2tiLT5kYXRhX2xlbiA9IGJjbnQ7CiAJfSBlbHNlIHsKKwkJc2tiLT5sZW4gPSBFVEhfWkxFTjsKIAkJd3JpdGViaXQgPSAwOwotCQlmLT53cml0ZWRhdGFsZW4gPSAwOwogCX0KIAogCWFoLT5jbWRzdGF0ID0gV0lOX1JFQUQgfCB3cml0ZWJpdCB8IGV4dGJpdDsKQEAgLTE2OCwyNiArMTU5LDI3IEBACiAJYnVmLT5uZnJhbWVzb3V0ICs9IDE7CiAJYnVmLT5idWZhZGRyICs9IGJjbnQ7CiAJYnVmLT5idl9yZXNpZCAtPSBiY250OwotLyogcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBidl9yZXNpZD0lbGRcbiIsIGJ1Zi0+YnZfcmVzaWQpOyAqLworLyogcHJpbnRrKEtFUk5fREVCVUcgImFvZTogYnZfcmVzaWQ9JWxkXG4iLCBidWYtPmJ2X3Jlc2lkKTsgKi8KIAlidWYtPnJlc2lkIC09IGJjbnQ7CiAJYnVmLT5zZWN0b3IgKz0gYmNudCA+PiA5OwogCWlmIChidWYtPnJlc2lkID09IDApIHsKIAkJZC0+aW5wcm9jZXNzID0gTlVMTDsKIAl9IGVsc2UgaWYgKGJ1Zi0+YnZfcmVzaWQgPT0gMCkgewogCQlidWYtPmJ2Kys7CisJCVdBUk5fT04oYnVmLT5idi0+YnZfbGVuID09IDApOwogCQlidWYtPmJ2X3Jlc2lkID0gYnVmLT5idi0+YnZfbGVuOwogCQlidWYtPmJ1ZmFkZHIgPSBwYWdlX2FkZHJlc3MoYnVmLT5idi0+YnZfcGFnZSkgKyBidWYtPmJ2LT5idl9vZmZzZXQ7CiAJfQogCi0Jc2tiID0gc2tiX3ByZXBhcmUoZCwgZik7Ci0JaWYgKHNrYikgewotCQlza2ItPm5leHQgPSBOVUxMOwotCQlpZiAoZC0+c2VuZHFfaGQpCi0JCQlkLT5zZW5kcV90bC0+bmV4dCA9IHNrYjsKLQkJZWxzZQotCQkJZC0+c2VuZHFfaGQgPSBza2I7Ci0JCWQtPnNlbmRxX3RsID0gc2tiOwotCX0KKwlza2ItPmRldiA9IGQtPmlmcDsKKwlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoZC0+c2VuZHFfaGQpCisJCWQtPnNlbmRxX3RsLT5uZXh0ID0gc2tiOworCWVsc2UKKwkJZC0+c2VuZHFfaGQgPSBza2I7CisJZC0+c2VuZHFfdGwgPSBza2I7CiB9CiAKIC8qIHNvbWUgY2FsbGVycyBjYW5ub3Qgc2xlZXAsIGFuZCB0aGV5IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sCkBAIC0yMDksMTEgKzIwMSwxMiBAQAogCQlpZiAoIWlzX2FvZV9uZXRpZihpZnApKQogCQkJY29udGludWU7CiAKLQkJc2tiID0gbmV3X3NrYihpZnAsIHNpemVvZiAqaCArIHNpemVvZiAqY2gpOworCQlza2IgPSBuZXdfc2tiKHNpemVvZiAqaCArIHNpemVvZiAqY2gpOwogCQlpZiAoc2tiID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lY21kX2NmZzogc2tiIGFsbG9jIGZhaWx1cmVcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBza2IgYWxsb2MgZmFpbHVyZVxuIik7CiAJCQljb250aW51ZTsKIAkJfQorCQlza2ItPmRldiA9IGlmcDsKIAkJaWYgKHNsX3RhaWwgPT0gTlVMTCkKIAkJCXNsX3RhaWwgPSBza2I7CiAJCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OwpAQCAtMjM3LDYgKzIzMCwyOSBAQAogCXJldHVybiBzbDsKIH0KIAorc3RhdGljIHN0cnVjdCBmcmFtZSAqCitmcmVlZnJhbWUoc3RydWN0IGFvZWRldiAqZCkKK3sKKwlzdHJ1Y3QgZnJhbWUgKmYsICplOworCWludCBuID0gMDsKKworCWYgPSBkLT5mcmFtZXM7CisJZSA9IGYgKyBkLT5uZnJhbWVzOworCWZvciAoOyBmPGU7IGYrKykgeworCQlpZiAoZi0+dGFnICE9IEZSRUVUQUcpCisJCQljb250aW51ZTsKKwkJaWYgKGF0b21pY19yZWFkKCZza2Jfc2hpbmZvKGYtPnNrYiktPmRhdGFyZWYpID09IDEpIHsKKwkJCXNrYl9zaGluZm8oZi0+c2tiKS0+bnJfZnJhZ3MgPSBmLT5za2ItPmRhdGFfbGVuID0gMDsKKwkJCXJldHVybiBmOworCQl9CisJCW4rKzsKKwl9CisJaWYgKG4gPT0gZC0+bmZyYW1lcykJLyogd2FpdCBmb3IgbmV0d29yayBsYXllciAqLworCQlkLT5mbGFncyB8PSBERVZGTF9LSUNLTUU7CisKKwlyZXR1cm4gTlVMTDsKK30KKwogLyogZW50ZXJzIHdpdGggZC0+bG9jayBoZWxkICovCiB2b2lkCiBhb2VjbWRfd29yayhzdHJ1Y3QgYW9lZGV2ICpkKQpAQCAtMjUyLDcgKzI2OCw3IEBACiAJfQogCiBsb29wOgotCWYgPSBnZXRmcmFtZShkLCBGUkVFVEFHKTsKKwlmID0gZnJlZWZyYW1lKGQpOwogCWlmIChmID09IE5VTEwpCiAJCXJldHVybjsKIAlpZiAoZC0+aW5wcm9jZXNzID09IE5VTEwpIHsKQEAgLTI2MCw3ICsyNzYsNyBAQAogCQkJcmV0dXJuOwogCQlidWYgPSBjb250YWluZXJfb2YoZC0+YnVmcS5uZXh0LCBzdHJ1Y3QgYnVmLCBidWZzKTsKIAkJbGlzdF9kZWwoZC0+YnVmcS5uZXh0KTsKLS8qcHJpbnRrKEtFUk5fSU5GTyAiYW9lY21kX3dvcms6IGJpX3NpemU9JWxkXG4iLCBidWYtPmJpby0+Ymlfc2l6ZSk7ICovCisvKnByaW50ayhLRVJOX0RFQlVHICJhb2U6IGJpX3NpemU9JWxkXG4iLCBidWYtPmJpby0+Ymlfc2l6ZSk7ICovCiAJCWQtPmlucHJvY2VzcyA9IGJ1ZjsKIAl9CiAJYW9lY21kX2F0YV9ydyhkLCBmKTsKQEAgLTI3Miw2ICsyODgsNyBAQAogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGFvZV9oZHIgKmg7CisJc3RydWN0IGFvZV9hdGFoZHIgKmFoOwogCWNoYXIgYnVmWzEyOF07CiAJdTMyIG47CiAKQEAgLTI4MywyMSArMzAwLDQxIEBACiAJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vciwgZi0+dGFnLCBqaWZmaWVzLCBuKTsKIAlhb2VjaHJfZXJyb3IoYnVmKTsKIAotCWggPSAoc3RydWN0IGFvZV9oZHIgKikgZi0+ZGF0YTsKKwlza2IgPSBmLT5za2I7CisJaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2ItPm1hYy5yYXc7CisJYWggPSAoc3RydWN0IGFvZV9hdGFoZHIgKikgKGgrMSk7CiAJZi0+dGFnID0gbjsKIAloLT50YWcgPSBjcHVfdG9fYmUzMihuKTsKIAltZW1jcHkoaC0+ZHN0LCBkLT5hZGRyLCBzaXplb2YgaC0+ZHN0KTsKIAltZW1jcHkoaC0+c3JjLCBkLT5pZnAtPmRldl9hZGRyLCBzaXplb2YgaC0+c3JjKTsKIAotCXNrYiA9IHNrYl9wcmVwYXJlKGQsIGYpOwotCWlmIChza2IpIHsKLQkJc2tiLT5uZXh0ID0gTlVMTDsKLQkJaWYgKGQtPnNlbmRxX2hkKQotCQkJZC0+c2VuZHFfdGwtPm5leHQgPSBza2I7Ci0JCWVsc2UKLQkJCWQtPnNlbmRxX2hkID0gc2tiOwotCQlkLT5zZW5kcV90bCA9IHNrYjsKKwluID0gREVGQVVMVEJDTlQgLyA1MTI7CisJaWYgKGFoLT5zY250ID4gbikgeworCQlhaC0+c2NudCA9IG47CisJCWlmIChhaC0+YWZsYWdzICYgQU9FQUZMX1dSSVRFKSB7CisJCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCAwLCB2aXJ0X3RvX3BhZ2UoZi0+YnVmYWRkciksCisJCQkJb2Zmc2V0X2luX3BhZ2UoZi0+YnVmYWRkciksIERFRkFVTFRCQ05UKTsKKwkJCXNrYi0+bGVuID0gc2l6ZW9mICpoICsgc2l6ZW9mICphaCArIERFRkFVTFRCQ05UOworCQkJc2tiLT5kYXRhX2xlbiA9IERFRkFVTFRCQ05UOworCQl9CisJCWlmICgrK2QtPmxvc3RqdW1ibyA+IChkLT5uZnJhbWVzIDw8IDEpKQorCQlpZiAoZC0+bWF4YmNudCAhPSBERUZBVUxUQkNOVCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBlJWxkLiVsZDogdG9vIG1hbnkgbG9zdCBqdW1ibyBvbiAlcyAtIHVzaW5nIDFLQiBmcmFtZXMuXG4iLAorCQkJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vciwgZC0+aWZwLT5uYW1lKTsKKwkJCWQtPm1heGJjbnQgPSBERUZBVUxUQkNOVDsKKwkJCWQtPmZsYWdzIHw9IERFVkZMX01BWEJDTlQ7CisJCX0KIAl9CisKKwlza2ItPmRldiA9IGQtPmlmcDsKKwlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoZC0+c2VuZHFfaGQpCisJCWQtPnNlbmRxX3RsLT5uZXh0ID0gc2tiOworCWVsc2UKKwkJZC0+c2VuZHFfaGQgPSBza2I7CisJZC0+c2VuZHFfdGwgPSBza2I7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTM0MCwxMyArMzc3LDE3IEBACiAJCWlmIChmLT50YWcgIT0gRlJFRVRBRyAmJiB0c2luY2UoZi0+dGFnKSA+PSB0aW1lb3V0KSB7CiAJCQluID0gZi0+d2FpdGVkICs9IHRpbWVvdXQ7CiAJCQluIC89IEhaOwotCQkJaWYgKG4gPiBNQVhXQUlUKSB7IC8qIHdhaXRlZCB0b28gbG9uZy4gIGRldmljZSBmYWlsdXJlLiAqLworCQkJaWYgKG4gPiBhb2VfZGVhZHNlY3MpIHsgLyogd2FpdGVkIHRvbyBsb25nIGZvciByZXNwb25zZSAqLwogCQkJCWFvZWRldl9kb3duZGV2KGQpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJcmV4bWl0KGQsIGYpOwogCQl9CiAJfQorCWlmIChkLT5mbGFncyAmIERFVkZMX0tJQ0tNRSkgeworCQlkLT5mbGFncyAmPSB+REVWRkxfS0lDS01FOworCQlhb2VjbWRfd29yayhkKTsKKwl9CiAKIAlzbCA9IGQtPnNlbmRxX2hkOwogCWQtPnNlbmRxX2hkID0gZC0+c2VuZHFfdGwgPSBOVUxMOwpAQCAtMzY3LDkgKzQwOCw5IEBACiAvKiB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHdvcmsgdGhhdCBoYXMgYmVlbiBkZWZlcnJlZCB1bnRpbCBzbGVlcGluZyBpcyBPSwogICovCiB2b2lkCi1hb2VjbWRfc2xlZXB3b3JrKHZvaWQgKnZwKQorYW9lY21kX3NsZWVwd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGFvZWRldiAqZCA9IChzdHJ1Y3QgYW9lZGV2ICopIHZwOworCXN0cnVjdCBhb2VkZXYgKmQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFvZWRldiwgd29yayk7CiAKIAlpZiAoZC0+ZmxhZ3MgJiBERVZGTF9HREFMTE9DKQogCQlhb2VibGtfZ2RhbGxvYyhkKTsKQEAgLTQzMSw4ICs0NzIsOCBAQAogCX0KIAogCWlmIChkLT5zc2l6ZSAhPSBzc2l6ZSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiAlMDEybGx4IGUlbHUuJWx1IHYlMDR4IGhhcyAlbGx1ICIKLQkJCSJzZWN0b3JzXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW1hY19hZGRyKGQtPmFkZHIpLAorCQlwcmludGsoS0VSTl9JTkZPICJhb2U6ICUwMTJsbHggZSVsdS4lbHUgdiUwNHggaGFzICVsbHUgc2VjdG9yc1xuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWFjX2FkZHIoZC0+YWRkciksCiAJCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsCiAJCQlkLT5md192ZXIsIChsb25nIGxvbmcpc3NpemUpOwogCWQtPnNzaXplID0gc3NpemU7CkBAIC00NDIsMTEgKzQ4Myw5IEBACiAJCWQtPmZsYWdzIHw9IERFVkZMX05FV1NJWkU7CiAJfSBlbHNlIHsKIAkJaWYgKGQtPmZsYWdzICYgREVWRkxfR0RBTExPQykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiAlczogJXMgZSVsdS4lbHUsICVzXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgICAiY2FuJ3Qgc2NoZWR1bGUgd29yayBmb3IiLAorCQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGNhbid0IHNjaGVkdWxlIHdvcmsgZm9yIGUlbHUuJWx1LCAlc1xuIiwKIAkJCSAgICAgICBkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsCi0JCQkgICAgICAgIml0J3MgYWxyZWFkeSBvbiEgKFRoaXMgcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4pLlxuIik7CisJCQkgICAgICAgIml0J3MgYWxyZWFkeSBvbiEgIFRoaXMgc2hvdWxkbid0IGhhcHBlbi5cbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCWQtPmZsYWdzIHw9IERFVkZMX0dEQUxMT0M7CkBAIC00NjAsOCArNDk5LDE1IEBACiAJcmVnaXN0ZXIgbG9uZyBuOwogCiAJbiA9IHJ0dDsKLQlpZiAobiA8IE1JTlRJTUVSKQotCQluID0gTUlOVElNRVI7CisJaWYgKG4gPCAwKSB7CisJCW4gPSAtcnR0OworCQlpZiAobiA8IE1JTlRJTUVSKQorCQkJbiA9IE1JTlRJTUVSOworCQllbHNlIGlmIChuID4gTUFYVElNRVIpCisJCQluID0gTUFYVElNRVI7CisJCWQtPm1pbnRpbWVyICs9IChuIC0gZC0+bWludGltZXIpID4+IDE7CisJfSBlbHNlIGlmIChuIDwgZC0+bWludGltZXIpCisJCW4gPSBkLT5taW50aW1lcjsKIAllbHNlIGlmIChuID4gTUFYVElNRVIpCiAJCW4gPSBNQVhUSU1FUjsKIApAQCAtNDc0LDcgKzUyMCw3IEBACiBhb2VjbWRfYXRhX3JzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBhb2VkZXYgKmQ7Ci0Jc3RydWN0IGFvZV9oZHIgKmhpbjsKKwlzdHJ1Y3QgYW9lX2hkciAqaGluLCAqaG91dDsKIAlzdHJ1Y3QgYW9lX2F0YWhkciAqYWhpbiwgKmFob3V0OwogCXN0cnVjdCBmcmFtZSAqZjsKIAlzdHJ1Y3QgYnVmICpidWY7CkBAIC00OTcsOCArNTQzLDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOwogCi0JZiA9IGdldGZyYW1lKGQsIGJlMzJfdG9fY3B1KGhpbi0+dGFnKSk7CisJbiA9IGJlMzJfdG9fY3B1KGhpbi0+dGFnKTsKKwlmID0gZ2V0ZnJhbWUoZCwgbik7CiAJaWYgKGYgPT0gTlVMTCkgeworCQljYWxjX3J0dGF2ZyhkLCAtdHNpbmNlKG4pKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwogCQlzbnByaW50ZihlYnVmLCBzaXplb2YgZWJ1ZiwKIAkJCSIlMTVzIGUlZC4lZCAgICB0YWc9JTA4eEAlMDhseFxuIiwKQEAgLTUxNCwyNiArNTYyLDI3IEBACiAJY2FsY19ydHRhdmcoZCwgdHNpbmNlKGYtPnRhZykpOwogCiAJYWhpbiA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaGluKzEpOwotCWFob3V0ID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChmLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBhb2VfaGRyKSk7CisJaG91dCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBmLT5za2ItPm1hYy5yYXc7CisJYWhvdXQgPSAoc3RydWN0IGFvZV9hdGFoZHIgKikgKGhvdXQrMSk7CiAJYnVmID0gZi0+YnVmOwogCiAJaWYgKGFob3V0LT5jbWRzdGF0ID09IFdJTl9JREVOVElGWSkKIAkJZC0+ZmxhZ3MgJj0gfkRFVkZMX1BBVVNFOwogCWlmIChhaGluLT5jbWRzdGF0ICYgMHhhOSkgewkvKiB0aGVzZSBiaXRzIGNsZWFyZWQgb24gc3VjY2VzcyAqLwotCQlwcmludGsoS0VSTl9DUklUICJhb2U6IGFvZWNtZF9hdGFfcnNwOiBhdGEgZXJyb3IgY21kPSUyLjJYaCAiCi0JCQkic3RhdD0lMi4yWGggZnJvbSBlJWxkLiVsZFxuIiwgCisJCXByaW50ayhLRVJOX0VSUgorCQkJImFvZTogYXRhIGVycm9yIGNtZD0lMi4yWGggc3RhdD0lMi4yWGggZnJvbSBlJWxkLiVsZFxuIiwKIAkJCWFob3V0LT5jbWRzdGF0LCBhaGluLT5jbWRzdGF0LAogCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yKTsKIAkJaWYgKGJ1ZikKIAkJCWJ1Zi0+ZmxhZ3MgfD0gQlVGRkxfRkFJTDsKIAl9IGVsc2UgeworCQluID0gYWhvdXQtPnNjbnQgPDwgOTsKIAkJc3dpdGNoIChhaG91dC0+Y21kc3RhdCkgewogCQljYXNlIFdJTl9SRUFEOgogCQljYXNlIFdJTl9SRUFEX0VYVDoKLQkJCW4gPSBhaG91dC0+c2NudCA8PCA5OwogCQkJaWYgKHNrYi0+bGVuIC0gc2l6ZW9mICpoaW4gLSBzaXplb2YgKmFoaW4gPCBuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fQ1JJVCAiYW9lOiBhb2VjbWRfYXRhX3JzcDogcnVudCAiCi0JCQkJCSJhdGEgZGF0YSBzaXplIGluIHJlYWQuICBza2ItPmxlbj0lZFxuIiwKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImFvZTogcnVudCBkYXRhIHNpemUgaW4gcmVhZC4gIHNrYi0+bGVuPSVkXG4iLAogCQkJCQlza2ItPmxlbik7CiAJCQkJLyogZmFpbCBmcmFtZSBmPyAganVzdCByZXR1cm5pbmcgd2lsbCByZXhtaXQuICovCiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwpAQCAtNTQyLDIyICs1OTEsNDkgQEAKIAkJCW1lbWNweShmLT5idWZhZGRyLCBhaGluKzEsIG4pOwogCQljYXNlIFdJTl9XUklURToKIAkJY2FzZSBXSU5fV1JJVEVfRVhUOgorCQkJaWYgKGYtPmJjbnQgLT0gbikgeworCQkJCXNrYiA9IGYtPnNrYjsKKwkJCQlmLT5idWZhZGRyICs9IG47CisJCQkJcHV0X2xiYShhaG91dCwgZi0+bGJhICs9IGFob3V0LT5zY250KTsKKwkJCQluID0gZi0+YmNudDsKKwkJCQlpZiAobiA+IERFRkFVTFRCQ05UKQorCQkJCQluID0gREVGQVVMVEJDTlQ7CisJCQkJYWhvdXQtPnNjbnQgPSBuID4+IDk7CisJCQkJaWYgKGFob3V0LT5hZmxhZ3MgJiBBT0VBRkxfV1JJVEUpIHsKKwkJCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgMCwKKwkJCQkJCXZpcnRfdG9fcGFnZShmLT5idWZhZGRyKSwKKwkJCQkJCW9mZnNldF9pbl9wYWdlKGYtPmJ1ZmFkZHIpLCBuKTsKKwkJCQkJc2tiLT5sZW4gPSBzaXplb2YgKmhvdXQgKyBzaXplb2YgKmFob3V0ICsgbjsKKwkJCQkJc2tiLT5kYXRhX2xlbiA9IG47CisJCQkJfQorCQkJCWYtPnRhZyA9IG5ld3RhZyhkKTsKKwkJCQlob3V0LT50YWcgPSBjcHVfdG9fYmUzMihmLT50YWcpOworCQkJCXNrYi0+ZGV2ID0gZC0+aWZwOworCQkJCXNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAoc2tiKQorCQkJCQlhb2VuZXRfeG1pdChza2IpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChuID4gREVGQVVMVEJDTlQpCisJCQkJZC0+bG9zdGp1bWJvID0gMDsKIAkJCWJyZWFrOwogCQljYXNlIFdJTl9JREVOVElGWToKIAkJCWlmIChza2ItPmxlbiAtIHNpemVvZiAqaGluIC0gc2l6ZW9mICphaGluIDwgNTEyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBhb2VjbWRfYXRhX3JzcDogcnVudCBkYXRhIHNpemUgIgotCQkJCQkiaW4gYXRhaWQuICBza2ItPmxlbj0lZFxuIiwgc2tiLT5sZW4pOworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJImFvZTogcnVudCBkYXRhIHNpemUgaW4gYXRhaWQuICBza2ItPmxlbj0lZFxuIiwKKwkJCQkJc2tiLT5sZW4pOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlhdGFpZF9jb21wbGV0ZShkLCAoY2hhciAqKSAoYWhpbisxKSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lY21kX2F0YV9yc3A6IHVucmVjb2duaXplZCAiCi0JCQkgICAgICAgIm91dGJvdW5kIGF0YSBjb21tYW5kICUyLjJYaCBmb3IgJWQuJWRcbiIsIAotCQkJICAgICAgIGFob3V0LT5jbWRzdGF0LAotCQkJICAgICAgIGJlMTZfdG9fY3B1KGhpbi0+bWFqb3IpLAotCQkJICAgICAgIGhpbi0+bWlub3IpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJhb2U6IHVucmVjb2duaXplZCBhdGEgY29tbWFuZCAlMi4yWGggZm9yICVkLiVkXG4iLAorCQkJCWFob3V0LT5jbWRzdGF0LAorCQkJCWJlMTZfdG9fY3B1KGhpbi0+bWFqb3IpLAorCQkJCWhpbi0+bWlub3IpOwogCQl9CiAJfQogCkBAIC02MTIsMzMgKzY4OCwzMiBAQAogCXN0cnVjdCBmcmFtZSAqZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JZiA9IGdldGZyYW1lKGQsIEZSRUVUQUcpOworCWYgPSBmcmVlZnJhbWUoZCk7CiAJaWYgKGYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9DUklUICJhb2U6IGFvZWNtZF9hdGFfaWQ6IGNhbid0IGdldCBhIGZyYW1lLiAgIgotCQkJIlRoaXMgc2hvdWxkbid0IGhhcHBlbi5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogY2FuJ3QgZ2V0IGEgZnJhbWUuIFRoaXMgc2hvdWxkbid0IGhhcHBlbi5cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzICYgZnJhbWUgKi8KLQloID0gKHN0cnVjdCBhb2VfaGRyICopIGYtPmRhdGE7CisJc2tiID0gZi0+c2tiOworCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OwogCWFoID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChoKzEpOwotCWYtPm5kYXRhID0gc2l6ZW9mICpoICsgc2l6ZW9mICphaDsKLQltZW1zZXQoaCwgMCwgZi0+bmRhdGEpOworCXNrYi0+bGVuID0gRVRIX1pMRU47CisJbWVtc2V0KGgsIDAsIEVUSF9aTEVOKTsKIAlmLT50YWcgPSBhb2VoZHJfYXRhaW5pdChkLCBoKTsKIAlmLT53YWl0ZWQgPSAwOwotCWYtPndyaXRlZGF0YWxlbiA9IDA7CiAKIAkvKiBzZXQgdXAgYXRhIGhlYWRlciAqLwogCWFoLT5zY250ID0gMTsKIAlhaC0+Y21kc3RhdCA9IFdJTl9JREVOVElGWTsKIAlhaC0+bGJhMyA9IDB4YTA7CiAKLQlza2IgPSBza2JfcHJlcGFyZShkLCBmKTsKKwlza2ItPmRldiA9IGQtPmlmcDsKIAogCWQtPnJ0dGF2ZyA9IE1BWFRJTUVSOwogCWQtPnRpbWVyLmZ1bmN0aW9uID0gcmV4bWl0X3RpbWVyOwogCi0JcmV0dXJuIHNrYjsKKwlyZXR1cm4gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiB9CiAgCiB2b2lkCkBAIC02NDgsOSArNzIzLDkgQEAKIAlzdHJ1Y3QgYW9lX2hkciAqaDsKIAlzdHJ1Y3QgYW9lX2NmZ2hkciAqY2g7CiAJdWxvbmcgZmxhZ3MsIHN5c21pbm9yLCBhb2VtYWpvcjsKLQl1MTYgYnVmY250OwogCXN0cnVjdCBza19idWZmICpzbDsKIAllbnVtIHsgTUFYRlJBTUVTID0gMTYgfTsKKwl1MTYgbjsKIAogCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OwogCWNoID0gKHN0cnVjdCBhb2VfY2ZnaGRyICopIChoKzEpOwpAQCAtNjYxLDI2ICs3MzYsMjUgQEAKIAkgKi8KIAlhb2VtYWpvciA9IGJlMTZfdG9fY3B1KGgtPm1ham9yKTsKIAlpZiAoYW9lbWFqb3IgPT0gMHhmZmYpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiYW9lOiBhb2VjbWRfY2ZnX3JzcDogV2FybmluZzogc2hlbGYgIgotCQkJImFkZHJlc3MgaXMgYWxsIG9uZXMuICBDaGVjayBzaGVsZiBkaXAgc3dpdGNoZXNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFvZTogV2FybmluZzogc2hlbGYgYWRkcmVzcyBpcyBhbGwgb25lcy4gICIKKwkJCSJDaGVjayBzaGVsZiBkaXAgc3dpdGNoZXMuXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCXN5c21pbm9yID0gU1lTTUlOT1IoYW9lbWFqb3IsIGgtPm1pbm9yKTsKIAlpZiAoc3lzbWlub3IgKiBBT0VfUEFSVElUSU9OUyArIEFPRV9QQVJUSVRJT05TID4gTUlOT1JNQVNLKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJCSJhb2U6IGUlbGQuJWQ6IG1pbm9yIG51bWJlciB0b28gbGFyZ2VcbiIsIAorCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGUlbGQuJWQ6IG1pbm9yIG51bWJlciB0b28gbGFyZ2VcbiIsCiAJCQlhb2VtYWpvciwgKGludCkgaC0+bWlub3IpOwogCQlyZXR1cm47CiAJfQogCi0JYnVmY250ID0gYmUxNl90b19jcHUoY2gtPmJ1ZmNudCk7Ci0JaWYgKGJ1ZmNudCA+IE1BWEZSQU1FUykJLyoga2VlcCBpdCByZWFzb25hYmxlICovCi0JCWJ1ZmNudCA9IE1BWEZSQU1FUzsKKwluID0gYmUxNl90b19jcHUoY2gtPmJ1ZmNudCk7CisJaWYgKG4gPiBNQVhGUkFNRVMpCS8qIGtlZXAgaXQgcmVhc29uYWJsZSAqLworCQluID0gTUFYRlJBTUVTOwogCi0JZCA9IGFvZWRldl9ieV9zeXNtaW5vcl9tKHN5c21pbm9yLCBidWZjbnQpOworCWQgPSBhb2VkZXZfYnlfc3lzbWlub3JfbShzeXNtaW5vciwgbik7CiAJaWYgKGQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGFvZWNtZF9jZmdfcnNwOiBkZXZpY2Ugc3lzbWlub3JfbSBmYWlsdXJlXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBkZXZpY2Ugc3lzbWlub3JfbSBmYWlsdXJlXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjg5LDYgKzc2MywyMCBAQAogCS8qIHBlcm1pdCBkZXZpY2UgdG8gbWlncmF0ZSBtYWMgYW5kIG5ldHdvcmsgaW50ZXJmYWNlICovCiAJZC0+aWZwID0gc2tiLT5kZXY7CiAJbWVtY3B5KGQtPmFkZHIsIGgtPnNyYywgc2l6ZW9mIGQtPmFkZHIpOworCWlmICghKGQtPmZsYWdzICYgREVWRkxfTUFYQkNOVCkpIHsKKwkJbiA9IGQtPmlmcC0+bXR1OworCQluIC09IHNpemVvZiAoc3RydWN0IGFvZV9oZHIpICsgc2l6ZW9mIChzdHJ1Y3QgYW9lX2F0YWhkcik7CisJCW4gLz0gNTEyOworCQlpZiAobiA+IGNoLT5zY250KQorCQkJbiA9IGNoLT5zY250OworCQluID0gbiA/IG4gKiA1MTIgOiBERUZBVUxUQkNOVDsKKwkJaWYgKG4gIT0gZC0+bWF4YmNudCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJhb2U6IGUlbGQuJWxkOiBzZXR0aW5nICVkIGJ5dGUgZGF0YSBmcmFtZXMgb24gJXNcbiIsCisJCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yLCBuLCBkLT5pZnAtPm5hbWUpOworCQkJZC0+bWF4YmNudCA9IG47CisJCX0KKwl9CiAKIAkvKiBkb24ndCBjaGFuZ2UgdXNlcnMnIHBlcnNwZWN0aXZlICovCiAJaWYgKGQtPm5vcGVuICYmICEoZC0+ZmxhZ3MgJiBERVZGTF9QQVVTRSkpIHsKQEAgLTY5Niw2ICs3ODQsNyBAQAogCQlyZXR1cm47CiAJfQogCWQtPmZsYWdzIHw9IERFVkZMX1BBVVNFOwkvKiBmb3JjZSBwYXVzZSAqLworCWQtPm1pbnRpbWVyID0gTUlOVElNRVI7CiAJZC0+ZndfdmVyID0gYmUxNl90b19jcHUoY2gtPmZ3dmVyKTsKIAogCS8qIGNoZWNrIGZvciBhbHJlYWR5IG91dHN0YW5kaW5nIGF0YWlkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VkZXYuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCmluZGV4IGVkNDI1OGEuLjA1YTk3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA0IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCiAvKgogICogYW9lZGV2LmMKICAqIEFvRSBkZXZpY2UgdXRpbGl0eSBmdW5jdGlvbnM7IG1haW50YWlucyBkZXZpY2UgbGlzdC4KQEAgLTIwLDExICsyMCw4IEBACiAJZiA9IGQtPmZyYW1lczsKIAllID0gZiArIGQtPm5mcmFtZXM7CiAJZG8gewotCQlpZiAoZi0+dGFnICE9IEZSRUVUQUcpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJhb2U6ICVsZC4lbGQgaXNidXN5XG4iLAotCQkJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vcik7CisJCWlmIChmLT50YWcgIT0gRlJFRVRBRykKIAkJCXJldHVybiAxOwotCQl9CiAJfSB3aGlsZSAoKytmIDwgZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTY2LDIyICs2MywzMiBAQAogCXN0cnVjdCBmcmFtZSAqZiwgKmU7CiAKIAlkID0ga3phbGxvYyhzaXplb2YgKmQsIEdGUF9BVE9NSUMpOwotCWlmIChkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwogCWYgPSBrY2FsbG9jKG5mcmFtZXMsIHNpemVvZiAqZiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGYgPT0gTlVMTCkgewotCQlrZnJlZShkKTsKKyAJc3dpdGNoICghZCB8fCAhZikgeworIAljYXNlIDA6CisgCQlkLT5uZnJhbWVzID0gbmZyYW1lczsKKyAJCWQtPmZyYW1lcyA9IGY7CisgCQllID0gZiArIG5mcmFtZXM7CisgCQlmb3IgKDsgZjxlOyBmKyspIHsKKyAJCQlmLT50YWcgPSBGUkVFVEFHOworIAkJCWYtPnNrYiA9IG5ld19za2IoRVRIX1pMRU4pOworIAkJCWlmICghZi0+c2tiKQorIAkJCQlicmVhazsKKyAJCX0KKyAJCWlmIChmID09IGUpCisgCQkJYnJlYWs7CisgCQl3aGlsZSAoZiA+IGQtPmZyYW1lcykgeworIAkJCWYtLTsKKyAJCQlkZXZfa2ZyZWVfc2tiKGYtPnNrYik7CisgCQl9CisgCWRlZmF1bHQ6CisgCQlpZiAoZikKKyAJCQlrZnJlZShmKTsKKyAJCWlmIChkKQorIAkJCWtmcmVlKGQpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0KLQlJTklUX1dPUksoJmQtPndvcmssIGFvZWNtZF9zbGVlcHdvcmssIGQpOwotCi0JZC0+bmZyYW1lcyA9IG5mcmFtZXM7Ci0JZC0+ZnJhbWVzID0gZjsKLQllID0gZiArIG5mcmFtZXM7Ci0JZm9yICg7IGY8ZTsgZisrKQotCQlmLT50YWcgPSBGUkVFVEFHOwotCisJSU5JVF9XT1JLKCZkLT53b3JrLCBhb2VjbWRfc2xlZXB3b3JrKTsKIAlzcGluX2xvY2tfaW5pdCgmZC0+bG9jayk7CiAJaW5pdF90aW1lcigmZC0+dGltZXIpOwogCWQtPnRpbWVyLmRhdGEgPSAodWxvbmcpIGQ7CkBAIC0xMTQsNiArMTIxLDcgQEAKIAkJCW1lbXBvb2xfZnJlZShidWYsIGQtPmJ1ZnBvb2wpOwogCQkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAtRUlPKTsKIAkJfQorCQlza2Jfc2hpbmZvKGYtPnNrYiktPm5yX2ZyYWdzID0gZi0+c2tiLT5kYXRhX2xlbiA9IDA7CiAJfQogCWQtPmlucHJvY2VzcyA9IE5VTEw7CiAKQEAgLTE0OCw3ICsxNTYsNyBAQAogCQlkID0gYW9lZGV2X25ld2RldihidWZjbnQpOwogCSAJaWYgKGQgPT0gTlVMTCkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2bGlzdF9sb2NrLCBmbGFncyk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGFvZWRldl9zZXQ6IGFvZWRldl9uZXdkZXYgZmFpbHVyZS5cbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBhb2VkZXZfbmV3ZGV2IGZhaWx1cmUuXG4iKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWQtPnN5c21pbm9yID0gc3lzbWlub3I7CkBAIC0xNjMsMTEgKzE3MSwxOSBAQAogc3RhdGljIHZvaWQKIGFvZWRldl9mcmVlZGV2KHN0cnVjdCBhb2VkZXYgKmQpCiB7CisJc3RydWN0IGZyYW1lICpmLCAqZTsKKwogCWlmIChkLT5nZCkgewogCQlhb2VkaXNrX3JtX3N5c2ZzKGQpOwogCQlkZWxfZ2VuZGlzayhkLT5nZCk7CiAJCXB1dF9kaXNrKGQtPmdkKTsKIAl9CisJZiA9IGQtPmZyYW1lczsKKwllID0gZiArIGQtPm5mcmFtZXM7CisJZm9yICg7IGY8ZTsgZisrKSB7CisJCXNrYl9zaGluZm8oZi0+c2tiKS0+bnJfZnJhZ3MgPSAwOworCQlkZXZfa2ZyZWVfc2tiKGYtPnNrYik7CisJfQogCWtmcmVlKGQtPmZyYW1lcyk7CiAJaWYgKGQtPmJ1ZnBvb2wpCiAJCW1lbXBvb2xfZGVzdHJveShkLT5idWZwb29sKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZW1haW4uYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW1haW4uYwppbmRleCBkZTA4NDkxLi5hMDRiN2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VtYWluLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lbWFpbi5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA0IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCiAvKgogICogYW9lbWFpbi5jCiAgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMsIGRpc2NvdmVyIHRpbWVyCkBAIC04NCwxMyArODQsMTEgQEAKIAkJZ290byBuZXRfZmFpbDsKIAlyZXQgPSByZWdpc3Rlcl9ibGtkZXYoQU9FX01BSk9SLCBERVZJQ0VfTkFNRSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGFvZWJsa19pbml0OiBjYW4ndCByZWdpc3RlciBtYWpvclxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBjYW4ndCByZWdpc3RlciBtYWpvclxuIik7CiAJCWdvdG8gYmxrcmVnX2ZhaWw7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTwotCSAgICAgICAiYW9lOiBhb2VfaW5pdDogQW9FIHYlcyBpbml0aWFsaXNlZC5cbiIsCi0JICAgICAgIFZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gImFvZTogQW9FIHYlcyBpbml0aWFsaXNlZC5cbiIsIFZFUlNJT04pOwogCWRpc2NvdmVyX3RpbWVyKFRJTklUKTsKIAlyZXR1cm4gMDsKIApAQCAtMTAzLDcgKzEwMSw3IEBACiAgY2hyX2ZhaWw6CiAJYW9lZGV2X2V4aXQoKTsKIAkKLQlwcmludGsoS0VSTl9JTkZPICJhb2U6IGFvZV9pbml0OiBpbml0aWFsaXNhdGlvbiBmYWlsdXJlLlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBpbml0aWFsaXNhdGlvbiBmYWlsdXJlLlxuIik7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lbmV0LmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYwppbmRleCBjMTQzNGVkLi45NjI2ZTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwNCBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLwogLyoKICAqIGFvZW5ldC5jCiAgKiBFdGhlcm5ldCBwb3J0aW9uIG9mIEFvRSBkcml2ZXIKQEAgLTc0LDcgKzc0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoYW9lX2lmbGlzdCwgdXNlcl9zdHIsIHNpemUpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImFvZTogJXM6IGNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBjb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYW9lX2lmbGlzdFtzaXplXSA9IDB4MDA7CkBAIC0xMzIsOCArMTMyLDcgQEAKIAkJaWYgKG4gPiBORUNPREVTKQogCQkJbiA9IDA7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9FUlIgImFvZTogYW9lbmV0X3JjdjogZXJyb3IgcGFja2V0IGZyb20gJWQuJWQ7ICIKLQkJCSAgICAgICAiZWNvZGU9JWQgJyVzJ1xuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBlcnJvciBwYWNrZXQgZnJvbSAlZC4lZDsgZWNvZGU9JWQgJyVzJ1xuIiwKIAkJCSAgICAgICBiZTE2X3RvX2NwdShoLT5tYWpvciksIGgtPm1pbm9yLCAKIAkJCSAgICAgICBoLT5lcnIsIGFvZV9lcnJsaXN0W25dKTsKIAkJZ290byBleGl0OwpAQCAtMTQ3LDcgKzE0Niw3IEBACiAJCWFvZWNtZF9jZmdfcnNwKHNrYik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gImFvZTogYW9lbmV0X3JjdjogdW5rbm93biBjbWQgJWRcbiIsIGgtPmNtZCk7CisJCXByaW50ayhLRVJOX0lORk8gImFvZTogdW5rbm93biBjbWQgJWRcbiIsIGgtPmNtZCk7CiAJfQogZXhpdDoKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggZGNjY2FmMi4uZDcxOWE1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtNDcsMTQgKzQ3LDE1IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogCiAjZGVmaW5lIENDSVNTX0RSSVZFUl9WRVJTSU9OKG1haixtaW4sc3VibWluKSAoKG1hajw8MTYpfChtaW48PDgpfChzdWJtaW4pKQotI2RlZmluZSBEUklWRVJfTkFNRSAiSFAgQ0lTUyBEcml2ZXIgKHYgMy42LjEwKSIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gQ0NJU1NfRFJJVkVSX1ZFUlNJT04oMyw2LDEwKQorI2RlZmluZSBEUklWRVJfTkFNRSAiSFAgQ0lTUyBEcml2ZXIgKHYgMy42LjE0KSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gQ0NJU1NfRFJJVkVSX1ZFUlNJT04oMyw2LDE0KQogCiAvKiBFbWJlZGRlZCBtb2R1bGUgZG9jdW1lbnRhdGlvbiBtYWNyb3MgLSBzZWUgbW9kdWxlcy5oICovCiBNT0RVTEVfQVVUSE9SKCJIZXdsZXR0LVBhY2thcmQgQ29tcGFueSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEhQIENvbnRyb2xsZXIgU0E1eHh4IFNBNnh4eCB2ZXJzaW9uIDMuNi4xMCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEhQIENvbnRyb2xsZXIgU0E1eHh4IFNBNnh4eCB2ZXJzaW9uIDMuNi4xNCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkhQIFNBNWkgU0E1aSsgU0E1MzIgU0E1MzAwIFNBNTMxMiBTQTY0MSBTQTY0MiBTQTY0MDAiCiAJCQkiIFNBNmkgUDYwMCBQODAwIFA0MDAgUDQwMGkgRTIwMCBFMjAwaSBFNTAwIik7CitNT0RVTEVfVkVSU0lPTigiMy42LjE0Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNpbmNsdWRlICJjY2lzc19jbWQuaCIKQEAgLTgxLDcgKzgyLDkgQEAKIAl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0QsICAgICAweDEwM0MsIDB4MzIxM30sCiAJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NELCAgICAgMHgxMDNDLCAweDMyMTR9LAogCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwgICAgIDB4MTAzQywgMHgzMjE1fSwKLQl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0MsICAgICAweDEwM0MsIDB4MzIzM30sCisJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NDLCAgICAgMHgxMDNDLCAweDMyMzd9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0FOWV9JRCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkJUENJX0NMQVNTX1NUT1JBR0VfUkFJRCA8PCA4LCAweGZmZmYgPDwgOCwgMH0sCiAJezAsfQogfTsKIApAQCAtOTAsMjcgKzkzLDI5IEBACiAvKiAgYm9hcmRfaWQgPSBTdWJzeXN0ZW0gRGV2aWNlIElEICYgVmVuZG9yIElECiAgKiAgcHJvZHVjdCA9IE1hcmtldGluZyBOYW1lIGZvciB0aGUgYm9hcmQKICAqICBhY2Nlc3MgPSBBZGRyZXNzIG9mIHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gcG9pbnRlcnMKKyAqICBucl9jbWRzID0gTnVtYmVyIG9mIGNvbW1hbmRzIHN1cHBvcnRlZCBieSBjb250cm9sbGVyCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYm9hcmRfdHlwZSBwcm9kdWN0c1tdID0gewotCXsweDQwNzAwRTExLCAiU21hcnQgQXJyYXkgNTMwMCIsICZTQTVfYWNjZXNzfSwKLQl7MHg0MDgwMEUxMSwgIlNtYXJ0IEFycmF5IDVpIiwgJlNBNUJfYWNjZXNzfSwKLQl7MHg0MDgyMEUxMSwgIlNtYXJ0IEFycmF5IDUzMiIsICZTQTVCX2FjY2Vzc30sCi0JezB4NDA4MzBFMTEsICJTbWFydCBBcnJheSA1MzEyIiwgJlNBNUJfYWNjZXNzfSwKLQl7MHg0MDlBMEUxMSwgIlNtYXJ0IEFycmF5IDY0MSIsICZTQTVfYWNjZXNzfSwKLQl7MHg0MDlCMEUxMSwgIlNtYXJ0IEFycmF5IDY0MiIsICZTQTVfYWNjZXNzfSwKLQl7MHg0MDlDMEUxMSwgIlNtYXJ0IEFycmF5IDY0MDAiLCAmU0E1X2FjY2Vzc30sCi0JezB4NDA5RDBFMTEsICJTbWFydCBBcnJheSA2NDAwIEVNIiwgJlNBNV9hY2Nlc3N9LAotCXsweDQwOTEwRTExLCAiU21hcnQgQXJyYXkgNmkiLCAmU0E1X2FjY2Vzc30sCi0JezB4MzIyNTEwM0MsICJTbWFydCBBcnJheSBQNjAwIiwgJlNBNV9hY2Nlc3N9LAotCXsweDMyMjMxMDNDLCAiU21hcnQgQXJyYXkgUDgwMCIsICZTQTVfYWNjZXNzfSwKLQl7MHgzMjM0MTAzQywgIlNtYXJ0IEFycmF5IFA0MDAiLCAmU0E1X2FjY2Vzc30sCi0JezB4MzIzNTEwM0MsICJTbWFydCBBcnJheSBQNDAwaSIsICZTQTVfYWNjZXNzfSwKLQl7MHgzMjExMTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAotCXsweDMyMTIxMDNDLCAiU21hcnQgQXJyYXkgRTIwMCIsICZTQTVfYWNjZXNzfSwKLQl7MHgzMjEzMTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAotCXsweDMyMTQxMDNDLCAiU21hcnQgQXJyYXkgRTIwMGkiLCAmU0E1X2FjY2Vzc30sCi0JezB4MzIxNTEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzfSwKLQl7MHgzMjMzMTAzQywgIlNtYXJ0IEFycmF5IEU1MDAiLCAmU0E1X2FjY2Vzc30sCisJezB4NDA3MDBFMTEsICJTbWFydCBBcnJheSA1MzAwIiwgJlNBNV9hY2Nlc3MsIDUxMn0sCisJezB4NDA4MDBFMTEsICJTbWFydCBBcnJheSA1aSIsICZTQTVCX2FjY2VzcywgNTEyfSwKKwl7MHg0MDgyMEUxMSwgIlNtYXJ0IEFycmF5IDUzMiIsICZTQTVCX2FjY2VzcywgNTEyfSwKKwl7MHg0MDgzMEUxMSwgIlNtYXJ0IEFycmF5IDUzMTIiLCAmU0E1Ql9hY2Nlc3MsIDUxMn0sCisJezB4NDA5QTBFMTEsICJTbWFydCBBcnJheSA2NDEiLCAmU0E1X2FjY2VzcywgNTEyfSwKKwl7MHg0MDlCMEUxMSwgIlNtYXJ0IEFycmF5IDY0MiIsICZTQTVfYWNjZXNzLCA1MTJ9LAorCXsweDQwOUMwRTExLCAiU21hcnQgQXJyYXkgNjQwMCIsICZTQTVfYWNjZXNzLCA1MTJ9LAorCXsweDQwOUQwRTExLCAiU21hcnQgQXJyYXkgNjQwMCBFTSIsICZTQTVfYWNjZXNzLCA1MTJ9LAorCXsweDQwOTEwRTExLCAiU21hcnQgQXJyYXkgNmkiLCAmU0E1X2FjY2VzcywgNTEyfSwKKwl7MHgzMjI1MTAzQywgIlNtYXJ0IEFycmF5IFA2MDAiLCAmU0E1X2FjY2VzcywgNTEyfSwKKwl7MHgzMjIzMTAzQywgIlNtYXJ0IEFycmF5IFA4MDAiLCAmU0E1X2FjY2VzcywgNTEyfSwKKwl7MHgzMjM0MTAzQywgIlNtYXJ0IEFycmF5IFA0MDAiLCAmU0E1X2FjY2VzcywgNTEyfSwKKwl7MHgzMjM1MTAzQywgIlNtYXJ0IEFycmF5IFA0MDBpIiwgJlNBNV9hY2Nlc3MsIDUxMn0sCisJezB4MzIxMTEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzLCAxMjB9LAorCXsweDMyMTIxMDNDLCAiU21hcnQgQXJyYXkgRTIwMCIsICZTQTVfYWNjZXNzLCAxMjB9LAorCXsweDMyMTMxMDNDLCAiU21hcnQgQXJyYXkgRTIwMGkiLCAmU0E1X2FjY2VzcywgMTIwfSwKKwl7MHgzMjE0MTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3MsIDEyMH0sCisJezB4MzIxNTEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzLCAxMjB9LAorCXsweDMyMzcxMDNDLCAiU21hcnQgQXJyYXkgRTUwMCIsICZTQTVfYWNjZXNzLCA1MTJ9LAorCXsweEZGRkYxMDNDLCAiVW5rbm93biBTbWFydCBBcnJheSIsICZTQTVfYWNjZXNzLCAxMjB9LAogfTsKIAogLyogSG93IGxvbmcgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgYm9hcmQgdG8gZ28gaW50byBzaW1wbGUgbW9kZSAqLwpAQCAtMTIxLDcgKzEyNiw2IEBACiAjZGVmaW5lIE1BWF9DTURfUkVUUklFUyAzCiAKICNkZWZpbmUgUkVBRF9BSEVBRCAJIDEwMjQKLSNkZWZpbmUgTlJfQ01EUwkJIDM4NAkvKiAjY29tbWFuZHMgdGhhdCBjYW4gYmUgb3V0c3RhbmRpbmcgKi8KICNkZWZpbmUgTUFYX0NUTFIJMzIKIAogLyogT3JpZ2luYWxseSBjY2lzcyBkcml2ZXIgb25seSBzdXBwb3J0cyA4IG1ham9yIG51bWJlcnMgKi8KQEAgLTEzNyw3ICsxNDEsNiBAQAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludCBjY2lzc19nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pOwogCi1zdGF0aWMgaW50IHJldmFsaWRhdGVfYWxsdm9sKGN0bHJfaW5mb190ICpob3N0KTsKIHN0YXRpYyBpbnQgY2Npc3NfcmV2YWxpZGF0ZShzdHJ1Y3QgZ2VuZGlzayAqZGlzayk7CiBzdGF0aWMgaW50IHJlYnVpbGRfbHVuX3RhYmxlKGN0bHJfaW5mb190ICpoLCBzdHJ1Y3QgZ2VuZGlzayAqZGVsX2Rpc2spOwogc3RhdGljIGludCBkZXJlZ2lzdGVyX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2ssIGRyaXZlX2luZm9fc3RydWN0ICpkcnYsCkBAIC0yNjUsNiArMjY4LDcgQEAKIAkJICAgICAgICJGaXJtd2FyZSBWZXJzaW9uOiAlYyVjJWMlY1xuIgogCQkgICAgICAgIklSUTogJWRcbiIKIAkJICAgICAgICJMb2dpY2FsIGRyaXZlczogJWRcbiIKKwkJICAgICAgICJNYXggc2VjdG9yczogJWRcbiIKIAkJICAgICAgICJDdXJyZW50IFEgZGVwdGg6ICVkXG4iCiAJCSAgICAgICAiQ3VycmVudCAjIGNvbW1hbmRzIG9uIGNvbnRyb2xsZXI6ICVkXG4iCiAJCSAgICAgICAiTWF4IFEgZGVwdGggc2luY2UgaW5pdDogJWRcbiIKQEAgLTI3NSw3ICsyNzksOSBAQAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaC0+Ym9hcmRfaWQsCiAJCSAgICAgICBoLT5maXJtX3ZlclswXSwgaC0+ZmlybV92ZXJbMV0sIGgtPmZpcm1fdmVyWzJdLAogCQkgICAgICAgaC0+ZmlybV92ZXJbM10sICh1bnNpZ25lZCBpbnQpaC0+aW50cltTSU1QTEVfTU9ERV9JTlRdLAotCQkgICAgICAgaC0+bnVtX2x1bnMsIGgtPlFkZXB0aCwgaC0+Y29tbWFuZHNfb3V0c3RhbmRpbmcsCisJCSAgICAgICBoLT5udW1fbHVucywKKwkJICAgICAgIGgtPmNjaXNzX21heF9zZWN0b3JzLAorCQkgICAgICAgaC0+UWRlcHRoLCBoLT5jb21tYW5kc19vdXRzdGFuZGluZywKIAkJICAgICAgIGgtPm1heFFzaW5jZWluaXQsIGgtPm1heF9vdXRzdGFuZGluZywgaC0+bWF4U0cpOwogCiAJcG9zICs9IHNpemU7CkBAIC00MDAsOCArNDA2LDggQEAKIAl9IGVsc2UgewkJLyogZ2V0IGl0IG91dCBvZiB0aGUgY29udHJvbGxlcnMgcG9vbCAqLwogCiAJCWRvIHsKLQkJCWkgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGgtPmNtZF9wb29sX2JpdHMsIE5SX0NNRFMpOwotCQkJaWYgKGkgPT0gTlJfQ01EUykKKwkJCWkgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGgtPmNtZF9wb29sX2JpdHMsIGgtPm5yX2NtZHMpOworCQkJaWYgKGkgPT0gaC0+bnJfY21kcykKIAkJCQlyZXR1cm4gTlVMTDsKIAkJfSB3aGlsZSAodGVzdF9hbmRfc2V0X2JpdAogCQkJIChpICYgKEJJVFNfUEVSX0xPTkcgLSAxKSwKQEAgLTQ4Nyw3ICs0OTMsNyBAQAogCSAqIGJ1dCBJJ20gYWxyZWFkeSB1c2luZyB3YXkgdG8gbWFueSBkZXZpY2Ugbm9kZXMgdG8gY2xhaW0gYW5vdGhlciBvbmUKIAkgKiBmb3IgInJhdyBjb250cm9sbGVyIi4KIAkgKi8KLQlpZiAoZHJ2LT5ucl9ibG9ja3MgPT0gMCkgeworCWlmIChkcnYtPmhlYWRzID09IDApIHsKIAkJaWYgKGltaW5vcihpbm9kZSkgIT0gMCkgewkvKiBub3Qgbm9kZSAwPyAqLwogCQkJLyogaWYgbm90IG5vZGUgMCBtYWtlIHN1cmUgaXQgaXMgYSBwYXJ0aXRpb24gPSAwICovCiAJCQlpZiAoaW1pbm9yKGlub2RlKSAmIDB4MGYpIHsKQEAgLTUyOSw3ICs1MzUsNyBAQAogewogCWludCByZXQ7CiAJbG9ja19rZXJuZWwoKTsKLQlyZXQgPSBjY2lzc19pb2N0bChmLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZiwgY21kLCBhcmcpOworCXJldCA9IGNjaXNzX2lvY3RsKGYtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGYsIGNtZCwgYXJnKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTg1MCw5ICs4NTYsNyBAQAogCQl9CiAKIAljYXNlIENDSVNTX1JFVkFMSURWT0xTOgotCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucyB8fCBkcnYgIT0gaG9zdC0+ZHJ2KQotCQkJcmV0dXJuIC1FTlhJTzsKLQkJcmV0dXJuIHJldmFsaWRhdGVfYWxsdm9sKGhvc3QpOworCQlyZXR1cm4gcmVidWlsZF9sdW5fdGFibGUoaG9zdCwgTlVMTCk7CiAKIAljYXNlIENDSVNTX0dFVExVTklORk86ewogCQkJTG9ndm9sSW5mb19zdHJ1Y3QgbHVuaW5mbzsKQEAgLTEwMzUsNyArMTAzOSw3IEBACiAJCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCQlnb3RvIGNsZWFudXAxOwogCQkJfQotCQkJYnVmZl9zaXplID0gKGludCAqKWttYWxsb2MoTUFYU0dFTlRSSUVTICogc2l6ZW9mKGludCksCisJCQlidWZmX3NpemUgPSBrbWFsbG9jKE1BWFNHRU5UUklFUyAqIHNpemVvZihpbnQpLAogCQkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWJ1ZmZfc2l6ZSkgewogCQkJCXN0YXR1cyA9IC1FTk9NRU07CkBAIC0xMTUyLDc1ICsxMTU2LDYgQEAKIAl9CiB9CiAKLS8qCi0gKiByZXZhbGlkYXRlX2FsbHZvbCBpcyBmb3Igb25saW5lIGFycmF5IGNvbmZpZyB1dGlsaXRpZXMuICBBZnRlciBhCi0gKiB1dGlsaXR5IHJlY29uZmlndXJlcyB0aGUgZHJpdmVzIGluIHRoZSBhcnJheSwgaXQgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uCi0gKiAodGhyb3VnaCBhbiBpb2N0bCkgdG8gbWFrZSB0aGUgZHJpdmVyIHphcCBhbnkgcHJldmlvdXMgZGlzayBzdHJ1Y3RzIGZvcgotICogdGhhdCBjb250cm9sbGVyIGFuZCBnZXQgbmV3IG9uZXMuCi0gKgotICogUmlnaHQgbm93IEknbSB1c2luZyB0aGUgZ2V0Z2VvbWV0cnkoKSBmdW5jdGlvbiB0byBkbyB0aGlzLCBidXQgdGhpcwotICogZnVuY3Rpb24gc2hvdWxkIHByb2JhYmx5IGJlIGZpbmVyIGdyYWluZWQgYW5kIGFsbG93IHlvdSB0byByZXZhbGlkYXRlIG9uZQotICogcGFydGljdWxhciBsb2dpY2FsIHZvbHVtZSAoaW5zdGVhZCBvZiBhbGwgb2YgdGhlbSBvbiBhIHBhcnRpY3VsYXIKLSAqIGNvbnRyb2xsZXIpLgotICovCi1zdGF0aWMgaW50IHJldmFsaWRhdGVfYWxsdm9sKGN0bHJfaW5mb190ICpob3N0KQotewotCWludCBjdGxyID0gaG9zdC0+Y3RsciwgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCWlmIChob3N0LT51c2FnZV9jb3VudCA+IDEpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBEZXZpY2UgYnVzeSBmb3Igdm9sdW1lIgotCQkgICAgICAgIiByZXZhbGlkYXRpb24gKHVzYWdlPSVkKVxuIiwgaG9zdC0+dXNhZ2VfY291bnQpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlob3N0LT51c2FnZV9jb3VudCsrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCi0JZm9yIChpID0gMDsgaSA8IE5XRDsgaSsrKSB7Ci0JCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaG9zdC0+Z2VuZGlza1tpXTsKLQkJaWYgKGRpc2spIHsKLQkJCXJlcXVlc3RfcXVldWVfdCAqcSA9IGRpc2stPnF1ZXVlOwotCi0JCQlpZiAoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkKLQkJCQlkZWxfZ2VuZGlzayhkaXNrKTsKLQkJCWlmIChxKQotCQkJCWJsa19jbGVhbnVwX3F1ZXVlKHEpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBTZXQgdGhlIHBhcnRpdGlvbiBhbmQgYmxvY2sgc2l6ZSBzdHJ1Y3R1cmVzIGZvciBhbGwgdm9sdW1lcwotCSAqIG9uIHRoaXMgY29udHJvbGxlciB0byB6ZXJvLiAgV2Ugd2lsbCByZXJlYWQgYWxsIG9mIHRoaXMgZGF0YQotCSAqLwotCW1lbXNldChob3N0LT5kcnYsIDAsIHNpemVvZihkcml2ZV9pbmZvX3N0cnVjdCkKLQkgICAgICAgKiBDSVNTX01BWF9MVU4pOwotCS8qCi0JICogVGVsbCB0aGUgYXJyYXkgY29udHJvbGxlciBub3QgdG8gZ2l2ZSB1cyBhbnkgaW50ZXJydXB0cyB3aGlsZQotCSAqIHdlIGNoZWNrIHRoZSBuZXcgZ2VvbWV0cnkuICBUaGVuIHR1cm4gaW50ZXJydXB0cyBiYWNrIG9uIHdoZW4KLQkgKiB3ZSdyZSBkb25lLgotCSAqLwotCWhvc3QtPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGhvc3QsIENDSVNTX0lOVFJfT0ZGKTsKLQljY2lzc19nZXRnZW9tZXRyeShjdGxyKTsKLQlob3N0LT5hY2Nlc3Muc2V0X2ludHJfbWFzayhob3N0LCBDQ0lTU19JTlRSX09OKTsKLQotCS8qIExvb3AgdGhyb3VnaCBlYWNoIHJlYWwgZGV2aWNlICovCi0JZm9yIChpID0gMDsgaSA8IE5XRDsgaSsrKSB7Ci0JCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaG9zdC0+Z2VuZGlza1tpXTsKLQkJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9ICYoaG9zdC0+ZHJ2W2ldKTsKLQkJLyogd2UgbXVzdCByZWdpc3RlciB0aGUgY29udHJvbGxlciBldmVuIGlmIG5vIGRpc2tzIGV4aXN0ICovCi0JCS8qIHRoaXMgaXMgZm9yIHRoZSBvbmxpbmUgYXJyYXkgdXRpbGl0aWVzICovCi0JCWlmICghZHJ2LT5oZWFkcyAmJiBpKQotCQkJY29udGludWU7Ci0JCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGRydi0+cXVldWUsIGRydi0+YmxvY2tfc2l6ZSk7Ci0JCXNldF9jYXBhY2l0eShkaXNrLCBkcnYtPm5yX2Jsb2Nrcyk7Ci0JCWFkZF9kaXNrKGRpc2spOwotCX0KLQlob3N0LT51c2FnZV9jb3VudC0tOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgY29tcGxldGVfYnVmZmVycyhzdHJ1Y3QgYmlvICpiaW8sIGludCBzdGF0dXMpCiB7CiAJd2hpbGUgKGJpbykgewpAQCAtMTI0Myw3ICsxMTc4LDcgQEAKIAkgKiBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgd2Ugc2VydmljZWQgd2FzIGZyb20gYW4gaW9jdGwgYW5kIGRpZCBub3QKIAkgKiBmcmVlIGFueSBuZXcgY29tbWFuZHMuCiAJICovCi0JaWYgKChmaW5kX2ZpcnN0X3plcm9fYml0KGgtPmNtZF9wb29sX2JpdHMsIE5SX0NNRFMpKSA9PSBOUl9DTURTKQorCWlmICgoZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBoLT5ucl9jbWRzKSkgPT0gaC0+bnJfY21kcykKIAkJcmV0dXJuOwogCiAJLyogV2UgaGF2ZSByb29tIG9uIHRoZSBxdWV1ZSBmb3IgbW9yZSBjb21tYW5kcy4gIE5vdyB3ZSBuZWVkIHRvIHF1ZXVlCkBAIC0xMjYyLDcgKzExOTcsNyBAQAogCQkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBtYXhlZCBvdXQgdGhlIG51bWJlciBvZiBjb21tYW5kcwogCQkgKiB0aGF0IGNhbiBiZSBwbGFjZWQgb24gdGhlIHF1ZXVlLgogCQkgKi8KLQkJaWYgKChmaW5kX2ZpcnN0X3plcm9fYml0KGgtPmNtZF9wb29sX2JpdHMsIE5SX0NNRFMpKSA9PSBOUl9DTURTKSB7CisJCWlmICgoZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBoLT5ucl9jbWRzKSkgPT0gaC0+bnJfY21kcykgewogCQkJaWYgKGN1cnJfcXVldWUgPT0gc3RhcnRfcXVldWUpIHsKIAkJCQloLT5uZXh0X3RvX3J1biA9CiAJCQkJICAgIChzdGFydF9xdWV1ZSArIDEpICUgKGgtPmhpZ2hlc3RfbHVuICsgMSk7CkBAIC0xMzAwLDYgKzEyMzUsMTIgQEAKIAogCWNvbXBsZXRlX2J1ZmZlcnMocnEtPmJpbywgcnEtPmVycm9ycyk7CiAKKwlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpKSB7CisJCWNvbnN0IGludCBydyA9IHJxX2RhdGFfZGlyKHJxKTsKKworCQlkaXNrX3N0YXRfYWRkKHJxLT5ycV9kaXNrLCBzZWN0b3JzW3J3XSwgcnEtPm5yX3NlY3RvcnMpOworCX0KKwogI2lmZGVmIENDSVNTX0RFQlVHCiAJcHJpbnRrKCJEb25lIHdpdGggJXBcbiIsIHJxKTsKICNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwpAQCAtMTM3NCw2ICsxMzE1LDExIEBACiAJLyogaWYgaXQncyB0aGUgY29udHJvbGxlciBpdCdzIGFscmVhZHkgYWRkZWQgKi8KIAlpZiAoZHJ2X2luZGV4KSB7CiAJCWRpc2stPnF1ZXVlID0gYmxrX2luaXRfcXVldWUoZG9fY2Npc3NfcmVxdWVzdCwgJmgtPmxvY2spOworCQlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgImNjaXNzL2MlZGQlZCIsIGN0bHIsIGRydl9pbmRleCk7CisJCWRpc2stPm1ham9yID0gaC0+bWFqb3I7CisJCWRpc2stPmZpcnN0X21pbm9yID0gZHJ2X2luZGV4IDw8IE5XRF9TSElGVDsKKwkJZGlzay0+Zm9wcyA9ICZjY2lzc19mb3BzOworCQlkaXNrLT5wcml2YXRlX2RhdGEgPSAmaC0+ZHJ2W2Rydl9pbmRleF07CiAKIAkJLyogU2V0IHVwIHF1ZXVlIGluZm9ybWF0aW9uICovCiAJCWRpc2stPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzID0gUkVBRF9BSEVBRDsKQEAgLTEzODUsNyArMTMzMSw3IEBACiAJCS8qIFRoaXMgaXMgYSBsaW1pdCBpbiB0aGUgZHJpdmVyIGFuZCBjb3VsZCBiZSBlbGltaW5hdGVkLiAqLwogCQlibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHMoZGlzay0+cXVldWUsIE1BWFNHRU5UUklFUyk7CiAKLQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKGRpc2stPnF1ZXVlLCA1MTIpOworCQlibGtfcXVldWVfbWF4X3NlY3RvcnMoZGlzay0+cXVldWUsIGgtPmNjaXNzX21heF9zZWN0b3JzKTsKIAogCQlibGtfcXVldWVfc29mdGlycV9kb25lKGRpc2stPnF1ZXVlLCBjY2lzc19zb2Z0aXJxX2RvbmUpOwogCkBAIC0xNDUyLDExICsxMzk4LDYgQEAKIAogCS8qIFNldCBidXN5X2NvbmZpZ3VyaW5nIGZsYWcgZm9yIHRoaXMgb3BlcmF0aW9uICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOwotCWlmIChoLT5udW1fbHVucyA+PSBDSVNTX01BWF9MVU4pIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWlmIChoLT5idXN5X2NvbmZpZ3VyaW5nKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTQ4OSwxNyArMTQzMCw4IEBACiAJCQkJCSAgICAgIDAsIDAsIFRZUEVfQ01EKTsKIAogCQlpZiAocmV0dXJuX2NvZGUgPT0gSU9fT0spIHsKLQkJCWxpc3RsZW5ndGggfD0KLQkJCSAgICAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbMF0pKQotCQkJICAgIDw8IDI0OwotCQkJbGlzdGxlbmd0aCB8PQotCQkJICAgICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFsxXSkpCi0JCQkgICAgPDwgMTY7Ci0JCQlsaXN0bGVuZ3RoIHw9Ci0JCQkgICAgKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzJdKSkKLQkJCSAgICA8PCA4OwotCQkJbGlzdGxlbmd0aCB8PQotCQkJICAgIDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzNdKTsKKwkJCWxpc3RsZW5ndGggPQorCQkJCWJlMzJfdG9fY3B1KCooX191MzIgKikgbGRfYnVmZi0+TFVOTGlzdExlbmd0aCk7CiAJCX0gZWxzZSB7CS8qIHJlYWRpbmcgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBmYWlsZWQgKi8KIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiByZXBvcnQgbG9naWNhbCB2b2x1bWUiCiAJCQkgICAgICAgIiBjb21tYW5kIGZhaWxlZFxuIik7CkBAIC0xNTUwLDYgKzE0ODIsMTQgQEAKIAkJCQlpZiAoZHJ2X2luZGV4ID09IC0xKQogCQkJCQlnb3RvIGZyZWVyZXQ7CiAKKwkJCQkvKkNoZWNrIGlmIHRoZSBnZW5kaXNrIG5lZWRzIHRvIGJlIGFsbG9jYXRlZCAqLworCQkJCWlmICghaC0+Z2VuZGlza1tkcnZfaW5kZXhdKXsKKwkJCQkJaC0+Z2VuZGlza1tkcnZfaW5kZXhdID0gYWxsb2NfZGlzaygxIDw8IE5XRF9TSElGVCk7CisJCQkJCWlmICghaC0+Z2VuZGlza1tkcnZfaW5kZXhdKXsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgZGlzayAlZFxuIiwgZHJ2X2luZGV4KTsKKwkJCQkJCWdvdG8gbWVtX21zZzsKKwkJCQkJfQorCQkJCX0KIAkJCX0KIAkJCWgtPmRydltkcnZfaW5kZXhdLkx1bklEID0gbHVuaWQ7CiAJCQljY2lzc191cGRhdGVfZHJpdmVfaW5mbyhjdGxyLCBkcnZfaW5kZXgpOwpAQCAtMTU4Nyw2ICsxNTI3LDcgQEAKIHN0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2LAogCQkJICAgaW50IGNsZWFyX2FsbCkKIHsKKwlpbnQgaTsKIAljdGxyX2luZm9fdCAqaCA9IGdldF9ob3N0KGRpc2spOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQpAQCAtMTYxMCw5ICsxNTUxLDM1IEBACiAJCQkJZGVsX2dlbmRpc2soZGlzayk7CiAJCQlpZiAocSkgewogCQkJCWJsa19jbGVhbnVwX3F1ZXVlKHEpOworCQkJCS8qIFNldCBkcnYtPnF1ZXVlIHRvIE5VTEwgc28gdGhhdCB3ZSBkbyBub3QgdHJ5CisJCQkJICogdG8gY2FsbCBibGtfc3RhcnRfcXVldWUgb24gdGhpcyBxdWV1ZSBpbiB0aGUKKwkJCQkgKiBpbnRlcnJ1cHQgaGFuZGxlcgorCQkJCSAqLwogCQkJCWRydi0+cXVldWUgPSBOVUxMOwogCQkJfQorCQkJLyogSWYgY2xlYXJfYWxsIGlzIHNldCB0aGVuIHdlIGFyZSBkZWxldGluZyB0aGUgbG9naWNhbAorCQkJICogZHJpdmUsIG5vdCBqdXN0IHJlZnJlc2hpbmcgaXRzIGluZm8uICBGb3IgZHJpdmVzCisJCQkgKiBvdGhlciB0aGFuIGRpc2sgMCB3ZSB3aWxsIGNhbGwgcHV0X2Rpc2suICBXZSBkbyBub3QKKwkJCSAqIGRvIHRoaXMgZm9yIGRpc2sgMCBhcyB3ZSBuZWVkIGl0IHRvIGJlIGFibGUgdG8KKwkJCSAqIGNvbmZpZ3VyZSB0aGUgY29udHJvbGxlci4KKwkJCSovCisJCQlpZiAoY2xlYXJfYWxsKXsKKwkJCQkvKiBUaGlzIGlzbid0IHByZXR0eSwgYnV0IHdlIG5lZWQgdG8gZmluZCB0aGUKKwkJCQkgKiBkaXNrIGluIG91ciBhcnJheSBhbmQgTlVMTCBvdXIgdGhlIHBvaW50ZXIuCisJCQkJICogVGhpcyBpcyBzbyB0aGF0IHdlIHdpbGwgY2FsbCBhbGxvY19kaXNrIGlmCisJCQkJICogdGhpcyBpbmRleCBpcyB1c2VkIGFnYWluIGxhdGVyLgorCQkJCSovCisJCQkJZm9yIChpPTA7IGkgPCBDSVNTX01BWF9MVU47IGkrKyl7CisJCQkJCWlmKGgtPmdlbmRpc2tbaV0gPT0gZGlzayl7CisJCQkJCQloLT5nZW5kaXNrW2ldID0gTlVMTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCXB1dF9kaXNrKGRpc2spOworCQkJfQogCQl9CisJfSBlbHNlIHsKKwkJc2V0X2NhcGFjaXR5KGRpc2ssIDApOwogCX0KIAogCS0taC0+bnVtX2x1bnM7CkBAIC0xOTIzLDcgKzE4OTAsNiBAQAogewogCWludCByZXR1cm5fY29kZTsKIAl1bnNpZ25lZCBsb25nIHQ7Ci0JdW5zaWduZWQgbG9uZyByZW07CiAKIAltZW1zZXQoaW5xX2J1ZmYsIDAsIHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpKTsKIAlpZiAod2l0aGlycSkKQEAgLTE5MzksMjYgKzE5MDUsMjMgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiY2Npc3M6IHJlYWRpbmcgZ2VvbWV0cnkgZmFpbGVkLCB2b2x1bWUgIgogCQkJICAgICAgICJkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgZ2VvbWV0cnlcbiIpOwotCQkJZHJ2LT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKLQkJCWRydi0+bnJfYmxvY2tzID0gdG90YWxfc2l6ZTsKIAkJCWRydi0+aGVhZHMgPSAyNTU7CiAJCQlkcnYtPnNlY3RvcnMgPSAzMjsJLy8gU2VjdG9ycyBwZXIgdHJhY2sKLQkJCXQgPSBkcnYtPmhlYWRzICogZHJ2LT5zZWN0b3JzOwotCQkJZHJ2LT5jeWxpbmRlcnMgPSB0b3RhbF9zaXplOwotCQkJcmVtID0gZG9fZGl2KGRydi0+Y3lsaW5kZXJzLCB0KTsKIAkJfSBlbHNlIHsKLQkJCWRydi0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7Ci0JCQlkcnYtPm5yX2Jsb2NrcyA9IHRvdGFsX3NpemU7CiAJCQlkcnYtPmhlYWRzID0gaW5xX2J1ZmYtPmRhdGFfYnl0ZVs2XTsKIAkJCWRydi0+c2VjdG9ycyA9IGlucV9idWZmLT5kYXRhX2J5dGVbN107CiAJCQlkcnYtPmN5bGluZGVycyA9IChpbnFfYnVmZi0+ZGF0YV9ieXRlWzRdICYgMHhmZikgPDwgODsKIAkJCWRydi0+Y3lsaW5kZXJzICs9IGlucV9idWZmLT5kYXRhX2J5dGVbNV07CiAJCQlkcnYtPnJhaWRfbGV2ZWwgPSBpbnFfYnVmZi0+ZGF0YV9ieXRlWzhdOwotCQkJdCA9IGRydi0+aGVhZHMgKiBkcnYtPnNlY3RvcnM7Ci0JCQlpZiAodCA+IDEpIHsKLQkJCQlkcnYtPmN5bGluZGVycyA9IHRvdGFsX3NpemU7Ci0JCQkJcmVtID0gZG9fZGl2KGRydi0+Y3lsaW5kZXJzLCB0KTsKLQkJCX0KKwkJfQorCQlkcnYtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworCQlkcnYtPm5yX2Jsb2NrcyA9IHRvdGFsX3NpemU7CisJCXQgPSBkcnYtPmhlYWRzICogZHJ2LT5zZWN0b3JzOworCQlpZiAodCA+IDEpIHsKKwkJCXVuc2lnbmVkIHJlbSA9IHNlY3Rvcl9kaXYodG90YWxfc2l6ZSwgdCk7CisJCQlpZiAocmVtKQorCQkJCXRvdGFsX3NpemUrKzsKKwkJCWRydi0+Y3lsaW5kZXJzID0gdG90YWxfc2l6ZTsKIAkJfQogCX0gZWxzZSB7CQkvKiBHZXQgZ2VvbWV0cnkgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiByZWFkaW5nIGdlb21ldHJ5IGZhaWxlZFxuIik7CkBAIC0xOTk2LDggKzE5NTksOCBAQAogCQkqYmxvY2tfc2l6ZSA9IEJMT0NLX1NJWkU7CiAJfQogCWlmICgqdG90YWxfc2l6ZSAhPSAoX191MzIpIDApCi0JCXByaW50ayhLRVJOX0lORk8gIiAgICAgIGJsb2Nrcz0gJWxsZCBibG9ja19zaXplPSAlZFxuIiwKLQkJKnRvdGFsX3NpemUsICpibG9ja19zaXplKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgYmxvY2tzPSAlbGx1IGJsb2NrX3NpemU9ICVkXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSp0b3RhbF9zaXplLCAqYmxvY2tfc2l6ZSk7CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm47CiB9CkBAIC0yMDMxLDggKzE5OTQsOCBAQAogCQkqdG90YWxfc2l6ZSA9IDA7CiAJCSpibG9ja19zaXplID0gQkxPQ0tfU0laRTsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgYmxvY2tzPSAlbGxkIGJsb2NrX3NpemU9ICVkXG4iLAotCSAgICAgICAqdG90YWxfc2l6ZSwgKmJsb2NrX3NpemUpOworCXByaW50ayhLRVJOX0lORk8gIiAgICAgIGJsb2Nrcz0gJWxsdSBibG9ja19zaXplPSAlZFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykqdG90YWxfc2l6ZSwgKmJsb2NrX3NpemUpOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuOwogfQpAQCAtMjEzNCw3ICsyMDk3LDcgQEAKIAogCS8qIFdlJ3ZlIHNlbnQgZG93biBhbiBhYm9ydCBvciByZXNldCwgYnV0IHNvbWV0aGluZyBlbHNlCiAJICAgaGFzIGNvbXBsZXRlZCAqLwotCWlmIChzcmwtPm5jb21wbGV0aW9ucyA+PSAoTlJfQ01EUyArIDIpKSB7CisJaWYgKHNybC0+bmNvbXBsZXRpb25zID49IChoYmFbY3Rscl0tPm5yX2NtZHMgKyAyKSkgewogCQkvKiBVaCBvaC4gIE5vIHJvb20gdG8gc2F2ZSBpdCBmb3IgbGF0ZXIuLi4gKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogU2VuZGNtZDogSW52YWxpZCBjb21tYW5kIGFkZHIsICIKIAkJICAgICAgICJyZWplY3QgbGlzdCBvdmVyZmxvdywgY29tbWFuZCBsb3N0IVxuIiwgY3Rscik7CkBAIC0yNjcxLDcgKzI2MzQsNyBAQAogCQkJYTEgPSBhOwogCQkJaWYgKChhICYgMHgwNCkpIHsKIAkJCQlhMiA9IChhID4+IDMpOwotCQkJCWlmIChhMiA+PSBOUl9DTURTKSB7CisJCQkJaWYgKGEyID49IGgtPm5yX2NtZHMpIHsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCQkgICAgICAgImNjaXNzOiBjb250cm9sbGVyIGNjaXNzJWQgZmFpbGVkLCBzdG9wcGluZy5cbiIsCiAJCQkJCSAgICAgICBoLT5jdGxyKTsKQEAgLTI4MjUsMjMgKzI3ODgsMjEgQEAKIAkJaWYgKGVyciA+IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBvbmx5ICVkIE1TSS1YIHZlY3RvcnMgIgogCQkJICAgICAgICJhdmFpbGFibGVcbiIsIGVycik7CisJCQlnb3RvIGRlZmF1bHRfaW50X21vZGU7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogTVNJLVggaW5pdCBmYWlsZWQgJWRcbiIsCiAJCQkgICAgICAgZXJyKTsKKwkJCWdvdG8gZGVmYXVsdF9pbnRfbW9kZTsKIAkJfQogCX0KIAlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX01TSSkpIHsKIAkJaWYgKCFwY2lfZW5hYmxlX21zaShwZGV2KSkgewotCQkJYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOwogCQkJYy0+bXNpX3ZlY3RvciA9IDE7Ci0JCQlyZXR1cm47CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogTVNJIGluaXQgZmFpbGVkXG4iKTsKLQkJCWMtPmludHJbU0lNUExFX01PREVfSU5UXSA9IHBkZXYtPmlycTsKLQkJCXJldHVybjsKIAkJfQogCX0KLSAgICAgIGRlZmF1bHRfaW50X21vZGU6CitkZWZhdWx0X2ludF9tb2RlOgogI2VuZGlmCQkJCS8qIENPTkZJR19QQ0lfTVNJICovCiAJLyogaWYgd2UgZ2V0IGhlcmUgd2UncmUgZ29pbmcgdG8gdXNlIHRoZSBkZWZhdWx0IGludGVycnVwdCBtb2RlICovCiAJYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOwpAQCAtMjg3Niw3ICsyODM3LDcgQEAKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IENhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgIgogCQkgICAgICAgImFib3J0aW5nXG4iKTsKLQkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwkJcmV0dXJuIGVycjsKIAl9CiAKIAlzdWJzeXN0ZW1fdmVuZG9yX2lkID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKQEAgLTI5MDQsNyArMjg2NSw3IEBACiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImFkZHJlc3MgMCA9ICV4XG4iLCBjLT5wYWRkcik7CiAjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KLQljLT52YWRkciA9IHJlbWFwX3BjaV9tZW0oYy0+cGFkZHIsIDIwMCk7CisJYy0+dmFkZHIgPSByZW1hcF9wY2lfbWVtKGMtPnBhZGRyLCAweDI1MCk7CiAKIAkvKiBXYWl0IGZvciB0aGUgYm9hcmQgdG8gYmVjb21lIHJlYWR5LiAgKFBDSSBob3RwbHVnIG5lZWRzIHRoaXMuKQogCSAqIFdlIHBvbGwgZm9yIHVwIHRvIDEyMCBzZWNzLCBvbmNlIHBlciAxMDBtcy4gKi8KQEAgLTI5NTQsMTYgKzI5MTUsMTAgQEAKIAkJaWYgKGJvYXJkX2lkID09IHByb2R1Y3RzW2ldLmJvYXJkX2lkKSB7CiAJCQljLT5wcm9kdWN0X25hbWUgPSBwcm9kdWN0c1tpXS5wcm9kdWN0X25hbWU7CiAJCQljLT5hY2Nlc3MgPSAqKHByb2R1Y3RzW2ldLmFjY2Vzcyk7CisJCQljLT5ucl9jbWRzID0gcHJvZHVjdHNbaV0ubnJfY21kczsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChpID09IEFSUkFZX1NJWkUocHJvZHVjdHMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBTb3JyeSwgSSBkb24ndCBrbm93IGhvdyIKLQkJICAgICAgICIgdG8gYWNjZXNzIHRoZSBTbWFydCBBcnJheSBjb250cm9sbGVyICUwOGx4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYm9hcmRfaWQpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7Ci0JfQogCWlmICgocmVhZGIoJmMtPmNmZ3RhYmxlLT5TaWduYXR1cmVbMF0pICE9ICdDJykgfHwKIAkgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzFdKSAhPSAnSScpIHx8CiAJICAgIChyZWFkYigmYy0+Y2ZndGFibGUtPlNpZ25hdHVyZVsyXSkgIT0gJ1MnKSB8fApAQCAtMjk3Miw2ICsyOTI3LDI3IEBACiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9CisJLyogV2UgZGlkbid0IGZpbmQgdGhlIGNvbnRyb2xsZXIgaW4gb3VyIGxpc3QuIFdlIGtub3cgdGhlCisJICogc2lnbmF0dXJlIGlzIHZhbGlkLiBJZiBpdCdzIGFuIEhQIGRldmljZSBsZXQncyB0cnkgdG8KKwkgKiBiaW5kIHRvIHRoZSBkZXZpY2UgYW5kIGZpcmUgaXQgdXAuIE90aGVyd2lzZSB3ZSBiYWlsLgorCSAqLworCWlmIChpID09IEFSUkFZX1NJWkUocHJvZHVjdHMpKSB7CisJCWlmIChzdWJzeXN0ZW1fdmVuZG9yX2lkID09IFBDSV9WRU5ET1JfSURfSFApIHsKKwkJCWMtPnByb2R1Y3RfbmFtZSA9IHByb2R1Y3RzW2ktMV0ucHJvZHVjdF9uYW1lOworCQkJYy0+YWNjZXNzID0gKihwcm9kdWN0c1tpLTFdLmFjY2Vzcyk7CisJCQljLT5ucl9jbWRzID0gcHJvZHVjdHNbaS0xXS5ucl9jbWRzOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IFRoaXMgaXMgYW4gdW5rbm93biAiCisJCQkJIlNtYXJ0IEFycmF5IGNvbnRyb2xsZXIuXG4iCisJCQkJImNjaXNzOiBQbGVhc2UgdXBkYXRlIHRvIHRoZSBsYXRlc3QgZHJpdmVyICIKKwkJCQkiYXZhaWxhYmxlIGZyb20gd3d3LmhwLmNvbS5cbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IFNvcnJ5LCBJIGRvbid0IGtub3cgaG93IgorCQkJCSIgdG8gYWNjZXNzIHRoZSBTbWFydCBBcnJheSBjb250cm9sbGVyICUwOGx4XG4iCisJCQkJCSwgKHVuc2lnbmVkIGxvbmcpYm9hcmRfaWQpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwkJfQorCX0KICNpZmRlZiBDT05GSUdfWDg2CiAJewogCQkvKiBOZWVkIHRvIGVuYWJsZSBwcmVmZXRjaCBpbiB0aGUgU0NTSSBjb3JlIGZvciA2NDAwIGluIHg4NiAqLwpAQCAtMjk4Miw2ICsyOTU4LDE3IEBACiAJfQogI2VuZGlmCiAKKwkvKiBEaXNhYmxpbmcgRE1BIHByZWZldGNoIGZvciB0aGUgUDYwMAorCSAqIEFuIEFTSUMgYnVnIG1heSByZXN1bHQgaW4gYSBwcmVmZXRjaCBiZXlvbmQKKwkgKiBwaHlzaWNhbCBtZW1vcnkuCisJICovCisJaWYoYm9hcmRfaWQgPT0gMHgzMjI1MTAzQykgeworCQlfX3UzMiBkbWFfcHJlZmV0Y2g7CisJCWRtYV9wcmVmZXRjaCA9IHJlYWRsKGMtPnZhZGRyICsgSTJPX0RNQTFfQ0ZHKTsKKwkJZG1hX3ByZWZldGNoIHw9IDB4ODAwMDsKKwkJd3JpdGVsKGRtYV9wcmVmZXRjaCwgYy0+dmFkZHIgKyBJMk9fRE1BMV9DRkcpOworCX0KKwogI2lmZGVmIENDSVNTX0RFQlVHCiAJcHJpbnRrKCJUcnlpbmcgdG8gcHV0IGJvYXJkIGludG8gU2ltcGxlIG1vZGVcbiIpOwogI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCkBAIC0zMDE3LDExICszMDA0LDEyIEBACiAJfQogCXJldHVybiAwOwogCi0gICAgICBlcnJfb3V0X2ZyZWVfcmVzOgorZXJyX291dF9mcmVlX3JlczoKKwkvKgorCSAqIERlbGliZXJhdGVseSBvbWl0IHBjaV9kaXNhYmxlX2RldmljZSgpOiBpdCBkb2VzIHNvbWV0aGluZyBuYXN0eSB0bworCSAqIFNtYXJ0IEFycmF5IGNvbnRyb2xsZXJzIHRoYXQgcGNpX2VuYWJsZV9kZXZpY2UgZG9lcyBub3QgdW5kbworCSAqLwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0KLSAgICAgIGVycl9vdXRfZGlzYWJsZV9wZGV2OgotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zMTU2LDEzICszMTQ0LDcgQEAKIC8qIFJldHVybnMgLTEgaWYgbm8gZnJlZSBlbnRyaWVzIGFyZSBsZWZ0LiAgKi8KIHN0YXRpYyBpbnQgYWxsb2NfY2Npc3NfaGJhKHZvaWQpCiB7Ci0Jc3RydWN0IGdlbmRpc2sgKmRpc2tbTldEXTsKLQlpbnQgaSwgbjsKLQlmb3IgKG4gPSAwOyBuIDwgTldEOyBuKyspIHsKLQkJZGlza1tuXSA9IGFsbG9jX2Rpc2soMSA8PCBOV0RfU0hJRlQpOwotCQlpZiAoIWRpc2tbbl0pCi0JCQlnb3RvIG91dDsKLQl9CisJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0NUTFI7IGkrKykgewogCQlpZiAoIWhiYVtpXSkgewpAQCAtMzE3MCwyMCArMzE1MiwxOCBAQAogCQkJcCA9IGt6YWxsb2Moc2l6ZW9mKGN0bHJfaW5mb190KSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXApCiAJCQkJZ290byBFbm9tZW07Ci0JCQlmb3IgKG4gPSAwOyBuIDwgTldEOyBuKyspCi0JCQkJcC0+Z2VuZGlza1tuXSA9IGRpc2tbbl07CisJCQlwLT5nZW5kaXNrWzBdID0gYWxsb2NfZGlzaygxIDw8IE5XRF9TSElGVCk7CisJCQlpZiAoIXAtPmdlbmRpc2tbMF0pCisJCQkJZ290byBFbm9tZW07CiAJCQloYmFbaV0gPSBwOwogCQkJcmV0dXJuIGk7CiAJCX0KIAl9CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IFRoaXMgZHJpdmVyIHN1cHBvcnRzIGEgbWF4aW11bSIKIAkgICAgICAgIiBvZiAlZCBjb250cm9sbGVycy5cbiIsIE1BWF9DVExSKTsKLQlnb3RvIG91dDsKLSAgICAgIEVub21lbToKKwlyZXR1cm4gLTE7CitFbm9tZW06CiAJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeS5cbiIpOwotICAgICAgb3V0OgotCXdoaWxlIChuLS0pCi0JCXB1dF9kaXNrKGRpc2tbbl0pOwogCXJldHVybiAtMTsKIH0KIApAQCAtMzE5Myw3ICszMTczLDcgQEAKIAlpbnQgbjsKIAogCWhiYVtpXSA9IE5VTEw7Ci0JZm9yIChuID0gMDsgbiA8IE5XRDsgbisrKQorCWZvciAobiA9IDA7IG4gPCBDSVNTX01BWF9MVU47IG4rKykKIAkJcHV0X2Rpc2socC0+Z2VuZGlza1tuXSk7CiAJa2ZyZWUocCk7CiB9CkBAIC0zMjA2LDkgKzMxODYsOCBAQAogc3RhdGljIGludCBfX2RldmluaXQgY2Npc3NfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxOwogCWludCBpOwotCWludCBqOworCWludCBqID0gMDsKIAlpbnQgcmM7CiAJaW50IGRhYzsKIApAQCAtMzI2NywxNSArMzI0NiwxNSBAQAogCSAgICAgICBoYmFbaV0tPmludHJbU0lNUExFX01PREVfSU5UXSwgZGFjID8gIiIgOiAiIG5vdCIpOwogCiAJaGJhW2ldLT5jbWRfcG9vbF9iaXRzID0KLQkgICAga21hbGxvYygoKE5SX0NNRFMgKyBCSVRTX1BFUl9MT05HIC0KKwkgICAga21hbGxvYygoKGhiYVtpXS0+bnJfY21kcyArIEJJVFNfUEVSX0xPTkcgLQogCQkgICAgICAxKSAvIEJJVFNfUEVSX0xPTkcpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKIAloYmFbaV0tPmNtZF9wb29sID0gKENvbW1hbmRMaXN0X3N0cnVjdCAqKQogCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsCi0JCSAgICBOUl9DTURTICogc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksCisJCSAgICBoYmFbaV0tPm5yX2NtZHMgKiBzaXplb2YoQ29tbWFuZExpc3Rfc3RydWN0KSwKIAkJICAgICYoaGJhW2ldLT5jbWRfcG9vbF9kaGFuZGxlKSk7CiAJaGJhW2ldLT5lcnJpbmZvX3Bvb2wgPSAoRXJyb3JJbmZvX3N0cnVjdCAqKQogCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsCi0JCSAgICBOUl9DTURTICogc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpLAorCQkgICAgaGJhW2ldLT5ucl9jbWRzICogc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpLAogCQkgICAgJihoYmFbaV0tPmVycmluZm9fcG9vbF9kaGFuZGxlKSk7CiAJaWYgKChoYmFbaV0tPmNtZF9wb29sX2JpdHMgPT0gTlVMTCkKIAkgICAgfHwgKGhiYVtpXS0+Y21kX3Bvb2wgPT0gTlVMTCkKQEAgLTMyODYsNyArMzI2NSw3IEBACiAjaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCiAJaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGUgPQogCSAgICBrbWFsbG9jKHNpemVvZihoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZVswXSkgKgotCQkgICAgKE5SX0NNRFMgKyA1KSwgR0ZQX0tFUk5FTCk7CisJCSAgICAoaGJhW2ldLT5ucl9jbWRzICsgNSksIEdGUF9LRVJORUwpOwogCWlmIChoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnkiKTsKIAkJZ290byBjbGVhbjQ7CkBAIC0zMzAwLDcgKzMyNzksNyBAQAogCS8qIGNvbW1hbmQgYW5kIGVycm9yIGluZm8gcmVjcyB6ZXJvZWQgb3V0IGJlZm9yZQogCSAgIHRoZXkgYXJlIHVzZWQgKi8KIAltZW1zZXQoaGJhW2ldLT5jbWRfcG9vbF9iaXRzLCAwLAotCSAgICAgICAoKE5SX0NNRFMgKyBCSVRTX1BFUl9MT05HIC0KKwkgICAgICAgKChoYmFbaV0tPm5yX2NtZHMgKyBCSVRTX1BFUl9MT05HIC0KIAkJIDEpIC8gQklUU19QRVJfTE9ORykgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCiAjaWZkZWYgQ0NJU1NfREVCVUcKQEAgLTMzMTUsMTggKzMyOTQsMzQgQEAKIAloYmFbaV0tPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGhiYVtpXSwgQ0NJU1NfSU5UUl9PTik7CiAKIAljY2lzc19wcm9jaW5pdChpKTsKKworCWhiYVtpXS0+Y2Npc3NfbWF4X3NlY3RvcnMgPSAyMDQ4OworCiAJaGJhW2ldLT5idXN5X2luaXRpYWxpemluZyA9IDA7CiAKLQlmb3IgKGogPSAwOyBqIDwgTldEOyBqKyspIHsJLyogbWZtICovCisJZG8gewogCQlkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2ID0gJihoYmFbaV0tPmRydltqXSk7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaGJhW2ldLT5nZW5kaXNrW2pdOworCQlyZXF1ZXN0X3F1ZXVlX3QgKnE7CisKKwkJLyogQ2hlY2sgaWYgdGhlIGRpc2sgd2FzIGFsbG9jYXRlZCBhbHJlYWR5ICovCisJCWlmICghZGlzayl7CisJCQloYmFbaV0tPmdlbmRpc2tbal0gPSBhbGxvY19kaXNrKDEgPDwgTldEX1NISUZUKTsKKwkJCWRpc2sgPSBoYmFbaV0tPmdlbmRpc2tbal07CisJCX0KKworCQkvKiBDaGVjayB0aGF0IHRoZSBkaXNrIHdhcyBhYmxlIHRvIGJlIGFsbG9jYXRlZCAqLworCQlpZiAoIWRpc2spIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRpc2sgJWRcbiIsIGopOworCQkJZ290byBjbGVhbjQ7CisJCX0KIAogCQlxID0gYmxrX2luaXRfcXVldWUoZG9fY2Npc3NfcmVxdWVzdCwgJmhiYVtpXS0+bG9jayk7CiAJCWlmICghcSkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgImNjaXNzOiAgdW5hYmxlIHRvIGFsbG9jYXRlIHF1ZXVlIGZvciBkaXNrICVkXG4iLAogCQkJICAgICAgIGopOwotCQkJYnJlYWs7CisJCQlnb3RvIGNsZWFuNDsKIAkJfQogCQlkcnYtPnF1ZXVlID0gcTsKIApAQCAtMzMzOSw3ICszMzM0LDcgQEAKIAkJLyogVGhpcyBpcyBhIGxpbWl0IGluIHRoZSBkcml2ZXIgYW5kIGNvdWxkIGJlIGVsaW1pbmF0ZWQuICovCiAJCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxLCBNQVhTR0VOVFJJRVMpOwogCi0JCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCA1MTIpOworCQlibGtfcXVldWVfbWF4X3NlY3RvcnMocSwgaGJhW2ldLT5jY2lzc19tYXhfc2VjdG9ycyk7CiAKIAkJYmxrX3F1ZXVlX3NvZnRpcnFfZG9uZShxLCBjY2lzc19zb2Z0aXJxX2RvbmUpOwogCkBAIC0zMzU4LDcgKzMzNTMsOCBAQAogCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShxLCBkcnYtPmJsb2NrX3NpemUpOwogCQlzZXRfY2FwYWNpdHkoZGlzaywgZHJ2LT5ucl9ibG9ja3MpOwogCQlhZGRfZGlzayhkaXNrKTsKLQl9CisJCWorKzsKKwl9IHdoaWxlIChqIDw9IGhiYVtpXS0+aGlnaGVzdF9sdW4pOwogCiAJcmV0dXJuIDE7CiAKQEAgLTMzNjksMTEgKzMzNjUsMTEgQEAKIAlrZnJlZShoYmFbaV0tPmNtZF9wb29sX2JpdHMpOwogCWlmIChoYmFbaV0tPmNtZF9wb29sKQogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhiYVtpXS0+cGRldiwKLQkJCQkgICAgTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLAorCQkJCSAgICBoYmFbaV0tPm5yX2NtZHMgKiBzaXplb2YoQ29tbWFuZExpc3Rfc3RydWN0KSwKIAkJCQkgICAgaGJhW2ldLT5jbWRfcG9vbCwgaGJhW2ldLT5jbWRfcG9vbF9kaGFuZGxlKTsKIAlpZiAoaGJhW2ldLT5lcnJpbmZvX3Bvb2wpCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LAotCQkJCSAgICBOUl9DTURTICogc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpLAorCQkJCSAgICBoYmFbaV0tPm5yX2NtZHMgKiBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCksCiAJCQkJICAgIGhiYVtpXS0+ZXJyaW5mb19wb29sLAogCQkJCSAgICBoYmFbaV0tPmVycmluZm9fcG9vbF9kaGFuZGxlKTsKIAlmcmVlX2lycShoYmFbaV0tPmludHJbU0lNUExFX01PREVfSU5UXSwgaGJhW2ldKTsKQEAgLTMzODEsNiArMzM3NywxOCBAQAogCXVucmVnaXN0ZXJfYmxrZGV2KGhiYVtpXS0+bWFqb3IsIGhiYVtpXS0+ZGV2bmFtZSk7CiAgICAgICBjbGVhbjE6CiAJaGJhW2ldLT5idXN5X2luaXRpYWxpemluZyA9IDA7CisJLyogY2xlYW51cCBhbnkgcXVldWVzIHRoYXQgbWF5IGhhdmUgYmVlbiBpbml0aWFsaXplZCAqLworCWZvciAoaj0wOyBqIDw9IGhiYVtpXS0+aGlnaGVzdF9sdW47IGorKyl7CisJCWRyaXZlX2luZm9fc3RydWN0ICpkcnYgPSAmKGhiYVtpXS0+ZHJ2W2pdKTsKKwkJaWYgKGRydi0+cXVldWUpCisJCQlibGtfY2xlYW51cF9xdWV1ZShkcnYtPnF1ZXVlKTsKKwl9CisJLyoKKwkgKiBEZWxpYmVyYXRlbHkgb21pdCBwY2lfZGlzYWJsZV9kZXZpY2UoKTogaXQgZG9lcyBzb21ldGhpbmcgbmFzdHkgdG8KKwkgKiBTbWFydCBBcnJheSBjb250cm9sbGVycyB0aGF0IHBjaV9lbmFibGVfZGV2aWNlIGRvZXMgbm90IHVuZG8KKwkgKi8KKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlmcmVlX2hiYShpKTsKIAlyZXR1cm4gLTE7CiB9CkBAIC0zNDI4LDcgKzM0MzYsNyBAQAogCXJlbW92ZV9wcm9jX2VudHJ5KGhiYVtpXS0+ZGV2bmFtZSwgcHJvY19jY2lzcyk7CiAKIAkvKiByZW1vdmUgaXQgZnJvbSB0aGUgZGlzayBsaXN0ICovCi0JZm9yIChqID0gMDsgaiA8IE5XRDsgaisrKSB7CisJZm9yIChqID0gMDsgaiA8IENJU1NfTUFYX0xVTjsgaisrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaGJhW2ldLT5nZW5kaXNrW2pdOwogCQlpZiAoZGlzaykgewogCQkJcmVxdWVzdF9xdWV1ZV90ICpxID0gZGlzay0+cXVldWU7CkBAIC0zNDQwLDE2ICszNDQ4LDE5IEBACiAJCX0KIAl9CiAKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGhiYVtpXS0+cGRldiwgTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLAorCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LCBoYmFbaV0tPm5yX2NtZHMgKiBzaXplb2YoQ29tbWFuZExpc3Rfc3RydWN0KSwKIAkJCSAgICBoYmFbaV0tPmNtZF9wb29sLCBoYmFbaV0tPmNtZF9wb29sX2RoYW5kbGUpOwotCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LCBOUl9DTURTICogc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpLAorCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LCBoYmFbaV0tPm5yX2NtZHMgKiBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCksCiAJCQkgICAgaGJhW2ldLT5lcnJpbmZvX3Bvb2wsIGhiYVtpXS0+ZXJyaW5mb19wb29sX2RoYW5kbGUpOwogCWtmcmVlKGhiYVtpXS0+Y21kX3Bvb2xfYml0cyk7CiAjaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCiAJa2ZyZWUoaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGUpOwogI2VuZGlmCisJLyoKKwkgKiBEZWxpYmVyYXRlbHkgb21pdCBwY2lfZGlzYWJsZV9kZXZpY2UoKTogaXQgZG9lcyBzb21ldGhpbmcgbmFzdHkgdG8KKwkgKiBTbWFydCBBcnJheSBjb250cm9sbGVycyB0aGF0IHBjaV9lbmFibGVfZGV2aWNlIGRvZXMgbm90IHVuZG8KKwkgKi8KIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJZnJlZV9oYmEoaSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmggYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKaW5kZXggNTYyMjM1Yy4uYjcwOTg4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5oCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaApAQCAtNiw3ICs2LDYgQEAKICNpbmNsdWRlICJjY2lzc19jbWQuaCIKIAogCi0jZGVmaW5lIE5XRAkJMTYKICNkZWZpbmUgTldEX1NISUZUCTQKICNkZWZpbmUgTUFYX1BBUlQJKDEgPDwgTldEX1NISUZUKQogCkBAIC02MCw2ICs1OSw3IEBACiAJX191MzIJYm9hcmRfaWQ7CiAJdm9pZCBfX2lvbWVtICp2YWRkcjsKIAl1bnNpZ25lZCBsb25nIHBhZGRyOworCWludCAJbnJfY21kczsgLyogTnVtYmVyIG9mIGNvbW1hbmRzIGFsbG93ZWQgb24gdGhpcyBjb250cm9sbGVyICovCiAJQ2ZnVGFibGVfc3RydWN0IF9faW9tZW0gKmNmZ3RhYmxlOwogCWludAlpbnRlcnJ1cHRzX2VuYWJsZWQ7CiAJaW50CW1ham9yOwpAQCAtNzYsNiArNzYsNyBAQAogCXVuc2lnbmVkIGludCBpbnRyWzRdOwogCXVuc2lnbmVkIGludCBtc2l4X3ZlY3RvcjsKIAl1bnNpZ25lZCBpbnQgbXNpX3ZlY3RvcjsKKwlpbnQgCWNjaXNzX21heF9zZWN0b3JzOwogCUJZVEUJY2Npc3NfcmVhZDsKIAlCWVRFCWNjaXNzX3dyaXRlOwogCUJZVEUJY2Npc3NfcmVhZF9jYXBhY2l0eTsKQEAgLTExMCw3ICsxMTEsNyBAQAogCWludAkJCW5leHRfdG9fcnVuOwogCiAJLy8gRGlzayBzdHJ1Y3R1cmVzIHdlIG5lZWQgdG8gcGFzcyBiYWNrCi0Jc3RydWN0IGdlbmRpc2sgICAqZ2VuZGlza1tOV0RdOworCXN0cnVjdCBnZW5kaXNrICAgKmdlbmRpc2tbQ0lTU19NQVhfTFVOXTsKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKIAl2b2lkICpzY3NpX2N0bHI7IC8qIHB0ciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyBzY3NpIHJlbGF0ZWQgc3R1ZmYgKi8KIAkvKiBsaXN0IG9mIGJsb2NrIHNpZGUgY29tbWFuZHMgdGhlIHNjc2kgZXJyb3IgaGFuZGxpbmcgc3Vja2VkIHVwICovCkBAIC0yODIsNiArMjgzLDcgQEAKIAlfX3UzMglib2FyZF9pZDsKIAljaGFyCSpwcm9kdWN0X25hbWU7CiAJc3RydWN0IGFjY2Vzc19tZXRob2QgKmFjY2VzczsKKwlpbnQgbnJfY21kczsgLyogTWF4IGNtZHMgdGhpcyBraW5kIG9mIGN0bHIgY2FuIGhhbmRsZS4gKi8KIH07CiAKICNkZWZpbmUgQ0NJU1NfTE9DSyhpKQkoJmhiYVtpXS0+bG9jaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3NfY21kLmggYi9kcml2ZXJzL2Jsb2NrL2NjaXNzX2NtZC5oCmluZGV4IDRhZjdjNGMuLjQzYmY1NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3NfY21kLmgKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzc19jbWQuaApAQCAtNTUsNiArNTUsNyBAQAogI2RlZmluZSBJMk9fSU5UX01BU0sgICAgICAgICAgICAweDM0CiAjZGVmaW5lIEkyT19JQlBPU1RfUSAgICAgICAgICAgIDB4NDAKICNkZWZpbmUgSTJPX09CUE9TVF9RICAgICAgICAgICAgMHg0NAorI2RlZmluZSBJMk9fRE1BMV9DRkcJCTB4MjE0CiAKIC8vQ29uZmlndXJhdGlvbiBUYWJsZQogI2RlZmluZSBDRkdUQkxfQ2hhbmdlUmVxICAgICAgICAweDAwMDAwMDAxbApAQCAtODgsNyArODksNyBAQAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIC8vU1RSVUNUVVJFUwogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNkZWZpbmUgQ0lTU19NQVhfTFVOCTE2CQorI2RlZmluZSBDSVNTX01BWF9MVU4JMTAyNAogI2RlZmluZSBDSVNTX01BWF9QSFlTX0xVTgkxMDI0CiAvLyBTQ1NJLTMgQ21tYW5kcyAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jIGIvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCmluZGV4IDU3MGQyZjAuLmI5NGNkMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKQEAgLTk5OCw2ICs5OTgsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY29tcGxldGVfY29tbWFuZChjbWRsaXN0X3QgKmNtZCwgaW50IHRpbWVvdXQpCiB7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gY21kLT5ycTsKIAlpbnQgb2s9MTsKIAlpbnQgaSwgZGRpcjsKIApAQCAtMTAyOSwxMiArMTAzMCwxOCBAQAogICAgICAgICAgICAgICAgIHBjaV91bm1hcF9wYWdlKGhiYVtjbWQtPmN0bHJdLT5wY2lfZGV2LCBjbWQtPnJlcS5zZ1tpXS5hZGRyLAogCQkJCWNtZC0+cmVxLnNnW2ldLnNpemUsIGRkaXIpOwogCi0JY29tcGxldGVfYnVmZmVycyhjbWQtPnJxLT5iaW8sIG9rKTsKKwljb21wbGV0ZV9idWZmZXJzKHJxLT5iaW8sIG9rKTsKIAotCWFkZF9kaXNrX3JhbmRvbW5lc3MoY21kLT5ycS0+cnFfZGlzayk7CisJaWYgKGJsa19mc19yZXF1ZXN0KHJxKSkgeworCQljb25zdCBpbnQgcncgPSBycV9kYXRhX2RpcihycSk7CiAKLSAgICAgICAgREJHUFgocHJpbnRrKCJEb25lIHdpdGggJXBcbiIsIGNtZC0+cnEpOyk7Ci0JZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGNtZC0+cnEsIG9rID8gMSA6IC1FSU8pOworCQlkaXNrX3N0YXRfYWRkKHJxLT5ycV9kaXNrLCBzZWN0b3JzW3J3XSwgcnEtPm5yX3NlY3RvcnMpOworCX0KKworCWFkZF9kaXNrX3JhbmRvbW5lc3MocnEtPnJxX2Rpc2spOworCisJREJHUFgocHJpbnRrKCJEb25lIHdpdGggJXBcbiIsIHJxKTspOworCWVuZF90aGF0X3JlcXVlc3RfbGFzdChycSwgb2sgPyAxIDogLUVJTyk7CiB9CiAKIC8qCkBAIC0xNjE4LDcgKzE2MjUsNyBAQAogCQkiIHByb2Nlc3NpbmdcbiIpOwogCS8qIENvbW1hbmQgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLCBidXQgaWRhc2VuZCBjb21tYW5kIG5lZWRzIGEgCiAJCWJ1ZmZlciAqLwotCWlkX2N0bHJfYnVmID0gKGlkX2N0bHJfdCAqKWttYWxsb2Moc2l6ZW9mKGlkX2N0bHJfdCksIEdGUF9LRVJORUwpOworCWlkX2N0bHJfYnVmID0ga21hbGxvYyhzaXplb2YoaWRfY3Rscl90KSwgR0ZQX0tFUk5FTCk7CiAJaWYoaWRfY3Rscl9idWY9PU5VTEwpCiAJewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjcHFhcnJheTogT3V0IG9mIG1lbW9yeS4gIgpAQCAtMTY1MywxNCArMTY2MCwxNCBAQAogCiAJaW5mb19wLT5sb2dfZHJ2X21hcCA9IDA7CQogCQotCWlkX2xkcml2ZSA9IChpZF9sb2dfZHJ2X3QgKilrbWFsbG9jKHNpemVvZihpZF9sb2dfZHJ2X3QpLCBHRlBfS0VSTkVMKTsKKwlpZF9sZHJpdmUgPSBrbWFsbG9jKHNpemVvZihpZF9sb2dfZHJ2X3QpLCBHRlBfS0VSTkVMKTsKIAlpZihpZF9sZHJpdmUgPT0gTlVMTCkKIAl7CiAJCXByaW50ayggS0VSTl9FUlIgImNwcWFycmF5OiAgb3V0IG9mIG1lbW9yeS5cbiIpOwogCQlyZXR1cm47CiAJfQogCi0JaWRfY3Rscl9idWYgPSAoaWRfY3Rscl90ICopa21hbGxvYyhzaXplb2YoaWRfY3Rscl90KSwgR0ZQX0tFUk5FTCk7CisJaWRfY3Rscl9idWYgPSBrbWFsbG9jKHNpemVvZihpZF9jdGxyX3QpLCBHRlBfS0VSTkVMKTsKIAlpZihpZF9jdGxyX2J1ZiA9PSBOVUxMKQogCXsKIAkJa2ZyZWUoaWRfbGRyaXZlKTsKQEAgLTE2NjgsNyArMTY3NSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZF9sc3RhdHVzX2J1ZiA9IChzZW5zZV9sb2dfZHJ2X3N0YXRfdCAqKWttYWxsb2Moc2l6ZW9mKHNlbnNlX2xvZ19kcnZfc3RhdF90KSwgR0ZQX0tFUk5FTCk7CisJaWRfbHN0YXR1c19idWYgPSBrbWFsbG9jKHNpemVvZihzZW5zZV9sb2dfZHJ2X3N0YXRfdCksIEdGUF9LRVJORUwpOwogCWlmKGlkX2xzdGF0dXNfYnVmID09IE5VTEwpCiAJewogCQlrZnJlZShpZF9jdGxyX2J1Zik7CkBAIC0xNjc3LDcgKzE2ODQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2Vuc2VfY29uZmlnX2J1ZiA9IChjb25maWdfdCAqKWttYWxsb2Moc2l6ZW9mKGNvbmZpZ190KSwgR0ZQX0tFUk5FTCk7CisJc2Vuc2VfY29uZmlnX2J1ZiA9IGttYWxsb2Moc2l6ZW9mKGNvbmZpZ190KSwgR0ZQX0tFUk5FTCk7CiAJaWYoc2Vuc2VfY29uZmlnX2J1ZiA9PSBOVUxMKQogCXsKIAkJa2ZyZWUoaWRfbHN0YXR1c19idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9mbG9wcHkuYyBiL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKaW5kZXggOWU2ZDNhOC4uM2YxYjM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9mbG9wcHkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCkBAIC05OTIsMTEgKzk5MiwxMSBAQAogewogfQogCi1zdGF0aWMgREVDTEFSRV9XT1JLKGZsb3BweV93b3JrLCBOVUxMLCBOVUxMKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoZmxvcHB5X3dvcmssIE5VTEwpOwogCiBzdGF0aWMgdm9pZCBzY2hlZHVsZV9iaCh2b2lkICgqaGFuZGxlcikgKHZvaWQpKQogewotCVBSRVBBUkVfV09SSygmZmxvcHB5X3dvcmssICh2b2lkICgqKSh2b2lkICopKWhhbmRsZXIsIE5VTEwpOworCVBSRVBBUkVfV09SSygmZmxvcHB5X3dvcmssICh3b3JrX2Z1bmNfdCloYW5kbGVyKTsKIAlzY2hlZHVsZV93b3JrKCZmbG9wcHlfd29yayk7CiB9CiAKQEAgLTEwMDgsNyArMTAwOCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZmxvcHB5X2xvY2ssIGZsYWdzKTsKIAlkb19mbG9wcHkgPSBOVUxMOwotCVBSRVBBUkVfV09SSygmZmxvcHB5X3dvcmssICh2b2lkICopZW1wdHksIE5VTEwpOworCVBSRVBBUkVfV09SSygmZmxvcHB5X3dvcmssICh3b3JrX2Z1bmNfdCllbXB0eSk7CiAJZGVsX3RpbWVyKCZmZF90aW1lcik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmxvcHB5X2xvY2ssIGZsYWdzKTsKIH0KQEAgLTE4NjgsNyArMTg2OCw3IEBACiAJcHJpbnRrKCJmZGNfYnVzeT0lbHVcbiIsIGZkY19idXN5KTsKIAlpZiAoZG9fZmxvcHB5KQogCQlwcmludGsoImRvX2Zsb3BweT0lcFxuIiwgZG9fZmxvcHB5KTsKLQlpZiAoZmxvcHB5X3dvcmsucGVuZGluZykKKwlpZiAod29ya19wZW5kaW5nKCZmbG9wcHlfd29yaykpCiAJCXByaW50aygiZmxvcHB5X3dvcmsuZnVuYz0lcFxuIiwgZmxvcHB5X3dvcmsuZnVuYyk7CiAJaWYgKHRpbWVyX3BlbmRpbmcoJmZkX3RpbWVyKSkKIAkJcHJpbnRrKCJmZF90aW1lci5mdW5jdGlvbj0lcFxuIiwgZmRfdGltZXIuZnVuY3Rpb24pOwpAQCAtNDQ5OCw3ICs0NDk4LDcgQEAKIAkJcHJpbnRrKCJmbG9wcHkgdGltZXIgc3RpbGwgYWN0aXZlOiVzXG4iLCB0aW1lb3V0X21lc3NhZ2UpOwogCWlmICh0aW1lcl9wZW5kaW5nKCZmZF90aW1lcikpCiAJCXByaW50aygiYXV4aWxpYXJ5IGZsb3BweSB0aW1lciBzdGlsbCBhY3RpdmVcbiIpOwotCWlmIChmbG9wcHlfd29yay5wZW5kaW5nKQorCWlmICh3b3JrX3BlbmRpbmcoJmZsb3BweV93b3JrKSkKIAkJcHJpbnRrKCJ3b3JrIHN0aWxsIHBlbmRpbmdcbiIpOwogI2VuZGlmCiAJb2xkX2ZkYyA9IGZkYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggYmVhYjZkMi4uNmI1YjY0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAKIAlpZiAobG8tPmxvX3N0YXRlICE9IExvX2JvdW5kKQogCQlyZXR1cm4gLUVOWElPOwotCWVycm9yID0gdmZzX2dldGF0dHIoZmlsZS0+Zl92ZnNtbnQsIGZpbGUtPmZfZGVudHJ5LCAmc3RhdCk7CisJZXJyb3IgPSB2ZnNfZ2V0YXR0cihmaWxlLT5mX3BhdGgubW50LCBmaWxlLT5mX3BhdGguZGVudHJ5LCAmc3RhdCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwpAQCAtMTI4Nyw3ICsxMjg3LDcgQEAKIAogc3RhdGljIGxvbmcgbG9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGxvb3BfZGV2aWNlICpsbyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCA5ZDEwMzVlLi4wOTA3OTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL25iZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKQEAgLTM1NSwxNCArMzU1LDMwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHBpZF9zaG93KHN0cnVjdCBnZW5kaXNrICpkaXNrLCBjaGFyICpwYWdlKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlbGRcbiIsCisJCShsb25nKSAoKHN0cnVjdCBuYmRfZGV2aWNlICopZGlzay0+cHJpdmF0ZV9kYXRhKS0+cGlkKTsKK30KKworc3RhdGljIHN0cnVjdCBkaXNrX2F0dHJpYnV0ZSBwaWRfYXR0ciA9IHsKKwkuYXR0ciA9IHsgLm5hbWUgPSAicGlkIiwgLm1vZGUgPSBTX0lSVUdPIH0sCisJLnNob3cgPSBwaWRfc2hvdywKK307CisKIHN0YXRpYyB2b2lkIG5iZF9kb19pdChzdHJ1Y3QgbmJkX2RldmljZSAqbG8pCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAogCUJVR19PTihsby0+bWFnaWMgIT0gTE9fTUFHSUMpOwogCisJbG8tPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwlzeXNmc19jcmVhdGVfZmlsZSgmbG8tPmRpc2stPmtvYmosICZwaWRfYXR0ci5hdHRyKTsKKwogCXdoaWxlICgocmVxID0gbmJkX3JlYWRfc3RhdChsbykpICE9IE5VTEwpCiAJCW5iZF9lbmRfcmVxdWVzdChyZXEpOworCisJc3lzZnNfcmVtb3ZlX2ZpbGUoJmxvLT5kaXNrLT5rb2JqLCAmcGlkX2F0dHIuYXR0cik7CiAJcmV0dXJuOwogfQogCkBAIC01MjEsNyArNTM3LDcgQEAKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlmaWxlID0gZmdldChhcmcpOwogCQlpZiAoZmlsZSkgewotCQkJaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJCWlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAkJCWlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkgewogCQkJCWxvLT5maWxlID0gZmlsZTsKIAkJCQlsby0+c29jayA9IFNPQ0tFVF9JKGlub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL2F0ZW4uYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2F0ZW4uYwppbmRleCBjNGQ2OTZkLi4yNjk1NDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9hdGVuLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvYXRlbi5jCkBAIC0xNDksMTIgKzE0OSwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhdGVuX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGlfcmVnaXN0ZXIoJmF0ZW4pLTE7CisJcmV0dXJuIHBhcmlkZV9yZWdpc3RlcigmYXRlbik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhdGVuX2V4aXQodm9pZCkKIHsKLQlwaV91bnJlZ2lzdGVyKCAmYXRlbiApOworCXBhcmlkZV91bnJlZ2lzdGVyKCAmYXRlbiApOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9icGNrLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9icGNrLmMKaW5kZXggZDQ2MmZmNi4uNGYyN2U3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvYnBjay5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2JwY2suYwpAQCAtNDY0LDEyICs0NjQsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgYnBja19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBpX3JlZ2lzdGVyKCZicGNrKS0xOworCXJldHVybiBwYXJpZGVfcmVnaXN0ZXIoJmJwY2spOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYnBja19leGl0KHZvaWQpCiB7Ci0JcGlfdW5yZWdpc3RlcigmYnBjayk7CisJcGFyaWRlX3VucmVnaXN0ZXIoJmJwY2spOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9icGNrNi5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvYnBjazYuYwppbmRleCA0MWEyMzdjLi5hZDEyNDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9icGNrNi5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2JwY2s2LmMKQEAgLTMxLDEwICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19QQVJQT1JUX01PRFVMRSl8fGRlZmluZWQoQ09ORklHX1BBUlBPUlQpCiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgotI2VuZGlmCiAKICNpbmNsdWRlICJwcGM2bG54LmMiCiAjaW5jbHVkZSAicGFyaWRlLmgiCkBAIC0xMzksMTEgKzEzNiw2IEBACiAJUFBDU1RSVUNUKHBpKS0+cHBjX2lkPXBpLT51bml0OwogCVBQQ1NUUlVDVChwaSktPmxwdF9hZGRyPXBpLT5wb3J0OwogCi0jaWZkZWYgQ09ORklHX1BBUlBPUlRfUENfTU9EVUxFCi0jZGVmaW5lIENPTkZJR19QQVJQT1JUX1BDCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QQVJQT1JUX1BDCiAJLyogbG9vayBhdCB0aGUgcGFycG9ydCBkZXZpY2UgdG8gc2VlIGlmIHdoYXQgbW9kZXMgd2UgY2FuIHVzZSAqLwogCWlmKCgoc3RydWN0IHBhcmRldmljZSAqKShwaS0+cGFyZGV2KSktPnBvcnQtPm1vZGVzICYgCiAJCShQQVJQT1JUX01PREVfRVBQKQpAQCAtMTYxLDExICsxNTMsNiBAQAogCXsKIAkJcmV0dXJuIDE7CiAJfQotI2Vsc2UKLQkvKiB0aGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyB3aGF0IGtpbmQgb2YgcG9ydCB3ZSBoYXZlCi0JICAgZGVmYXVsdCB0byB0aGUgaGlnaGVzdCBtb2RlIHBvc3NpYmxlICovCi0JcmV0dXJuIDU7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGludCBicGNrNl9wcm9iZV91bml0ICggUElBICpwaSApCkBAIC0yNjUsMTIgKzI1MiwxMiBAQAogCXByaW50ayhLRVJOX0lORk8gImJwY2s2OiBDb3B5cmlnaHQgMjAwMSBieSBNaWNybyBTb2x1dGlvbnMsIEluYy4sIERlS2FsYiBJTC4gVVNBXG4iKTsKIAlpZih2ZXJib3NlKQogCQlwcmludGsoS0VSTl9ERUJVRyAiYnBjazY6IHZlcmJvc2UgZGVidWcgZW5hYmxlZC5cbiIpOwotCXJldHVybiBwaV9yZWdpc3RlcigmYnBjazYpIC0gMTsgIAorCXJldHVybiBwYXJpZGVfcmVnaXN0ZXIoJmJwY2s2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGJwY2s2X2V4aXQodm9pZCkKIHsKLQlwaV91bnJlZ2lzdGVyKCZicGNrNik7CisJcGFyaWRlX3VucmVnaXN0ZXIoJmJwY2s2KTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvY29tbS5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvY29tbS5jCmluZGV4IDQzZDYxMzUuLjliY2QzNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL2NvbW0uYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9jb21tLmMKQEAgLTIwNSwxMiArMjA1LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNvbW1faW5pdCh2b2lkKQogewotCXJldHVybiBwaV9yZWdpc3RlcigmY29tbSktMTsKKwlyZXR1cm4gcGFyaWRlX3JlZ2lzdGVyKCZjb21tKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNvbW1fZXhpdCh2b2lkKQogewotCXBpX3VucmVnaXN0ZXIoJmNvbW0pOworCXBhcmlkZV91bnJlZ2lzdGVyKCZjb21tKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvZHN0ci5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvZHN0ci5jCmluZGV4IDA0ZDUzYmYuLmFjY2M1YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL2RzdHIuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9kc3RyLmMKQEAgLTIyMCwxMiArMjIwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGRzdHJfaW5pdCh2b2lkKQogewotCXJldHVybiBwaV9yZWdpc3RlcigmZHN0ciktMTsKKwlyZXR1cm4gcGFyaWRlX3JlZ2lzdGVyKCZkc3RyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGRzdHJfZXhpdCh2b2lkKQogewotCXBpX3VucmVnaXN0ZXIoJmRzdHIpOworCXBhcmlkZV91bnJlZ2lzdGVyKCZkc3RyKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvZXBhdC5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvZXBhdC5jCmluZGV4IDU1ZDFjMGEuLjFiY2RmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL2VwYXQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9lcGF0LmMKQEAgLTMyNywxMiArMzI3LDEyIEBACiAjaWZkZWYgQ09ORklHX1BBUklERV9FUEFUQzgKIAllcGF0YzggPSAxOwogI2VuZGlmCi0JcmV0dXJuIHBpX3JlZ2lzdGVyKCZlcGF0KS0xOworCXJldHVybiBwYXJpZGVfcmVnaXN0ZXIoJmVwYXQpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXBhdF9leGl0KHZvaWQpCiB7Ci0JcGlfdW5yZWdpc3RlcigmZXBhdCk7CisJcGFyaWRlX3VucmVnaXN0ZXIoJmVwYXQpOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9lcGlhLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9lcGlhLmMKaW5kZXggMGYyZTBjMi4uZmIwZTc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvZXBpYS5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2VwaWEuYwpAQCAtMzAzLDEyICszMDMsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgZXBpYV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBpX3JlZ2lzdGVyKCZlcGlhKS0xOworCXJldHVybiBwYXJpZGVfcmVnaXN0ZXIoJmVwaWEpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXBpYV9leGl0KHZvaWQpCiB7Ci0JcGlfdW5yZWdpc3RlcigmZXBpYSk7CisJcGFyaWRlX3VucmVnaXN0ZXIoJmVwaWEpOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9maXQyLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9maXQyLmMKaW5kZXggZTBmMDY5MS4uMzgxMjgzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvZml0Mi5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2ZpdDIuYwpAQCAtMTM4LDEyICsxMzgsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgZml0Ml9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBpX3JlZ2lzdGVyKCZmaXQyKS0xOworCXJldHVybiBwYXJpZGVfcmVnaXN0ZXIoJmZpdDIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZml0Ml9leGl0KHZvaWQpCiB7Ci0JcGlfdW5yZWdpc3RlcigmZml0Mik7CisJcGFyaWRlX3VucmVnaXN0ZXIoJmZpdDIpOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9maXQzLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9maXQzLmMKaW5kZXggMTU0MDBlNy4uMjc1ZDI2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvZml0My5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2ZpdDMuYwpAQCAtMTk4LDEyICsxOTgsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgZml0M19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBpX3JlZ2lzdGVyKCZmaXQzKS0xOworCXJldHVybiBwYXJpZGVfcmVnaXN0ZXIoJmZpdDMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZml0M19leGl0KHZvaWQpCiB7Ci0JcGlfdW5yZWdpc3RlcigmZml0Myk7CisJcGFyaWRlX3VucmVnaXN0ZXIoJmZpdDMpOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9mcmlxLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9mcmlxLmMKaW5kZXggNWVhMjkwNC4uNGYyYmEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvZnJpcS5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2ZyaXEuYwpAQCAtMjYzLDEyICsyNjMsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgZnJpcV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBpX3JlZ2lzdGVyKCZmcmlxKS0xOworCXJldHVybiBwYXJpZGVfcmVnaXN0ZXIoJmZyaXEpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZnJpcV9leGl0KHZvaWQpCiB7Ci0JcGlfdW5yZWdpc3RlcigmZnJpcSk7CisJcGFyaWRlX3VucmVnaXN0ZXIoJmZyaXEpOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9mcnB3LmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9mcnB3LmMKaW5kZXggNTZiMzgyNC4uYzNjZGUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvZnJwdy5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2ZycHcuYwpAQCAtMzAwLDEyICszMDAsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgZnJwd19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBpX3JlZ2lzdGVyKCZmcnB3KS0xOworCXJldHVybiBwYXJpZGVfcmVnaXN0ZXIoJmZycHcpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZnJwd19leGl0KHZvaWQpCiB7Ci0JcGlfdW5yZWdpc3RlcigmZnJwdyk7CisJcGFyaWRlX3VucmVnaXN0ZXIoJmZycHcpOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9qdW1ibyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2p1bWJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzkzYjljLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL2p1bWJvCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIFRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkICJqdW1ibyIgbW9kdWxlcyB0aGF0IGNvbnRhaW4gdGhlCi0jIGJhc2UgUEFSSURFIHN1cHBvcnQsIG9uZSBwcm90b2NvbCBtb2R1bGUgYW5kIG9uZSBoaWdoLWxldmVsIGRyaXZlci4KLSMKLWVjaG8gLW4gIkhpZ2ggbGV2ZWwgZHJpdmVyIFtwY2RdIDogIgotcmVhZCBYCi1ITEQ9JHtYOi1wY2R9Ci0jCi1lY2hvIC1uICJQcm90b2NvbCBtb2R1bGUgW2JwY2tdIDogIgotcmVhZCBYCi1QUk9UTz0ke1g6LWJwY2t9Ci0jCi1lY2hvIC1uICJVc2UgTU9EVkVSU0lPTlMgW3ldID8gIgotcmVhZCBYCi1VTU9EVj0ke1g6LXl9Ci0jCi1lY2hvIC1uICJGb3IgU01QIGtlcm5lbCBbbl0gPyAiCi1yZWFkIFgKLVVTTVA9JHtYOi1ufQotIwotZWNobyAtbiAiU3VwcG9ydCBQQVJQT1JUIFtuXSA/ICIKLXJlYWQgWAotVVBBUlA9JHtYOi1ufQotIwotZWNobwotIwotY2FzZSAkVVNNUCBpbgotCXkqIHwgWSogKSBGU01QPSItRENPTkZJR19TTVAiCi0JCSAgOzsKLQkqKQkgIEZTTVA9IiIKLQkJICA7OwotZXNhYwotIwotTU9EST0iLWluY2x1ZGUgLi4vLi4vLi4vaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oIgotIwotY2FzZSAkVU1PRFYgaW4KLQl5KiB8IFkqICkgRk1PRFY9Ii1ETU9EVkVSU0lPTlMgJE1PREkiCi0JCSAgOzsKLQkqKQkgIEZNT0RWPSIiCi0JCSAgOzsKLWVzYWMKLSMKLWNhc2UgJFVQQVJQIGluCi0JeSogfCBZKiApIEZQQVJQPSItRENPTkZJR19QQVJQT1JUIgotCQkgIDs7Ci0JKikJICBGUEFSUD0iIgotCQkgIDs7Ci1lc2FjCi0jCi1UQVJHPSRITEQtJFBST1RPLm8KLUZQUk9UTz0tRENPTkZJR19QQVJJREVfYGVjaG8gIiRQUk9UTyIgfCB0ciBbYS16XSBbQS1aXWAKLUZLPSItRF9fS0VSTkVMX18gLUkgLi4vLi4vLi4vaW5jbHVkZSIKLUZMQ0g9LURfTElOVVhfQ09ORklHX0gKLSMKLWVjaG8gY2MgJEZLICRGU01QICRGTENIICRGUEFSUCAkRlBST1RPICRGTU9EViAtV2FsbCAtTzIgLW8gSmIubyAtYyBwYXJpZGUuYwotY2MgJEZLICRGU01QICRGTENIICRGUEFSUCAkRlBST1RPICRGTU9EViAtV2FsbCAtTzIgLW8gSmIubyAtYyBwYXJpZGUuYwotIwotZWNobyBjYyAkRksgJEZTTVAgJEZNT0RWIC1XYWxsIC1PMiAtbyBKcC5vIC1jICRQUk9UTy5jCi1jYyAkRksgJEZTTVAgJEZNT0RWIC1XYWxsIC1PMiAtbyBKcC5vIC1jICRQUk9UTy5jCi0jCi1lY2hvIGNjICRGSyAkRlNNUCAkRk1PRFYgLURNT0RVTEUgLURQQVJJREVfSlVNQk8gLVdhbGwgLU8yIC1vIEpkLm8gLWMgJEhMRC5jCi1jYyAkRksgJEZTTVAgJEZNT0RWIC1ETU9EVUxFIC1EUEFSSURFX0pVTUJPIC1XYWxsIC1PMiAtbyBKZC5vIC1jICRITEQuYwotIwotZWNobyBsZCAtciAtbyAkVEFSRyBKcC5vIEpiLm8gSmQubwotbGQgLXIgLW8gJFRBUkcgSnAubyBKYi5vIEpkLm8KLSMKLSMKLXJtIEpwLm8gSmIubyBKZC5vCi0jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9rYmljLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9rYmljLmMKaW5kZXggZDk4M2JjZS4uMzU5OTljNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUva2JpYy5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL2tiaWMuYwpAQCAtMjgzLDEzICsyODMsMjEgQEAKIAogc3RhdGljIGludCBfX2luaXQga2JpY19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIChwaV9yZWdpc3Rlcigmazk1MSl8fHBpX3JlZ2lzdGVyKCZrOTcxKSktMTsKKwlpbnQgcnY7CisKKwlydiA9IHBhcmlkZV9yZWdpc3Rlcigmazk1MSk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIHJ2OworCXJ2ID0gcGFyaWRlX3JlZ2lzdGVyKCZrOTcxKTsKKwlpZiAocnYgPCAwKQorCQlwYXJpZGVfdW5yZWdpc3Rlcigmazk1MSk7CisJcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQga2JpY19leGl0KHZvaWQpCiB7Ci0JcGlfdW5yZWdpc3Rlcigmazk1MSk7Ci0JcGlfdW5yZWdpc3Rlcigmazk3MSk7CisJcGFyaWRlX3VucmVnaXN0ZXIoJms5NTEpOworCXBhcmlkZV91bnJlZ2lzdGVyKCZrOTcxKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUva3R0aS5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUva3R0aS5jCmluZGV4IDZjN2VkYmYuLjExN2FiMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL2t0dGkuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9rdHRpLmMKQEAgLTExNSwxMiArMTE1LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGt0dGlfaW5pdCh2b2lkKQogewotCXJldHVybiBwaV9yZWdpc3Rlcigma3R0aSktMTsKKwlyZXR1cm4gcGFyaWRlX3JlZ2lzdGVyKCZrdHRpKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGt0dGlfZXhpdCh2b2lkKQogewotCXBpX3VucmVnaXN0ZXIoJmt0dGkpOworCXBhcmlkZV91bnJlZ2lzdGVyKCZrdHRpKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvb24yMC5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvb24yMC5jCmluZGV4IDlmOGUwMTAuLjAxNzM2OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL29uMjAuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9vbjIwLmMKQEAgLTE0MCwxMiArMTQwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9uMjBfaW5pdCh2b2lkKQogewotCXJldHVybiBwaV9yZWdpc3Rlcigmb24yMCktMTsKKwlyZXR1cm4gcGFyaWRlX3JlZ2lzdGVyKCZvbjIwKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG9uMjBfZXhpdCh2b2lkKQogewotCXBpX3VucmVnaXN0ZXIoJm9uMjApOworCXBhcmlkZV91bnJlZ2lzdGVyKCZvbjIwKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvb24yNi5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvb24yNi5jCmluZGV4IDBmODMzY2EuLjk1YmEyNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL29uMjYuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9vbjI2LmMKQEAgLTMwNiwxMiArMzA2LDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9uMjZfaW5pdCh2b2lkKQogewotCXJldHVybiBwaV9yZWdpc3Rlcigmb24yNiktMTsKKwlyZXR1cm4gcGFyaWRlX3JlZ2lzdGVyKCZvbjI2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG9uMjZfZXhpdCh2b2lkKQogewotCXBpX3VucmVnaXN0ZXIoJm9uMjYpOworCXBhcmlkZV91bnJlZ2lzdGVyKCZvbjI2KTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGFyaWRlLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wYXJpZGUuYwppbmRleCA0YjI1OGY3Li40OGM1MGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wYXJpZGUuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wYXJpZGUuYwpAQCAtMjksMTQgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBUQVNLXyogKi8KLQotI2lmZGVmIENPTkZJR19QQVJQT1JUX01PRFVMRQotI2RlZmluZSBDT05GSUdfUEFSUE9SVAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUEFSUE9SVAogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSAicGFyaWRlLmgiCiAKQEAgLTc2LDggKzY5LDYgQEAKIAogRVhQT1JUX1NZTUJPTChwaV9yZWFkX2Jsb2NrKTsKIAotI2lmZGVmIENPTkZJR19QQVJQT1JUCi0KIHN0YXRpYyB2b2lkIHBpX3dha2VfdXAodm9pZCAqcCkKIHsKIAlQSUEgKnBpID0gKFBJQSAqKSBwOwpAQCAtMTAwLDExICs5MSw4IEBACiAJCWNvbnQoKTsKIH0KIAotI2VuZGlmCi0KIGludCBwaV9zY2hlZHVsZV9jbGFpbWVkKFBJQSAqIHBpLCB2b2lkICgqY29udCkgKHZvaWQpKQogewotI2lmZGVmIENPTkZJR19QQVJQT1JUCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwaV9zcGlubG9jaywgZmxhZ3MpOwpAQCAtMTE1LDcgKzEwMyw2IEBACiAJfQogCXBpLT5jbGFpbWVkID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaV9zcGlubG9jaywgZmxhZ3MpOwotI2VuZGlmCiAJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MKHBpX3NjaGVkdWxlX2NsYWltZWQpOwpAQCAtMTMzLDIwICsxMjAsMTYgQEAKIAlpZiAocGktPmNsYWltZWQpCiAJCXJldHVybjsKIAlwaS0+Y2xhaW1lZCA9IDE7Ci0jaWZkZWYgQ09ORklHX1BBUlBPUlQKIAlpZiAocGktPnBhcmRldikKIAkJd2FpdF9ldmVudChwaS0+cGFycSwKIAkJCSAgICFwYXJwb3J0X2NsYWltKChzdHJ1Y3QgcGFyZGV2aWNlICopIHBpLT5wYXJkZXYpKTsKLSNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBwaV91bmNsYWltKFBJQSAqIHBpKQogewogCXBpLT5jbGFpbWVkID0gMDsKLSNpZmRlZiBDT05GSUdfUEFSUE9SVAogCWlmIChwaS0+cGFyZGV2KQogCQlwYXJwb3J0X3JlbGVhc2UoKHN0cnVjdCBwYXJkZXZpY2UgKikgKHBpLT5wYXJkZXYpKTsKLSNlbmRpZgogfQogCiB2b2lkIHBpX2Nvbm5lY3QoUElBICogcGkpCkBAIC0xNjcsMjEgKzE1MCwxNSBAQAogCiBzdGF0aWMgdm9pZCBwaV91bnJlZ2lzdGVyX3BhcnBvcnQoUElBICogcGkpCiB7Ci0jaWZkZWYgQ09ORklHX1BBUlBPUlQKIAlpZiAocGktPnBhcmRldikgewogCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKChzdHJ1Y3QgcGFyZGV2aWNlICopIChwaS0+cGFyZGV2KSk7CiAJCXBpLT5wYXJkZXYgPSBOVUxMOwogCX0KLSNlbmRpZgogfQogCiB2b2lkIHBpX3JlbGVhc2UoUElBICogcGkpCiB7CiAJcGlfdW5yZWdpc3Rlcl9wYXJwb3J0KHBpKTsKLSNpZm5kZWYgQ09ORklHX1BBUlBPUlQKLQlpZiAocGktPnJlc2VydmVkKQotCQlyZWxlYXNlX3JlZ2lvbihwaS0+cG9ydCwgcGktPnJlc2VydmVkKTsKLSNlbmRpZgkJCQkvKiAhQ09ORklHX1BBUlBPUlQgKi8KIAlpZiAocGktPnByb3RvLT5yZWxlYXNlX3Byb3RvKQogCQlwaS0+cHJvdG8tPnJlbGVhc2VfcHJvdG8ocGkpOwogCW1vZHVsZV9wdXQocGktPnByb3RvLT5vd25lcik7CkBAIC0yMjksNyArMjA2LDcgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgcGlfcmVnaXN0ZXIoUElQICogcHIpCitpbnQgcGFyaWRlX3JlZ2lzdGVyKFBJUCAqIHByKQogewogCWludCBrOwogCkBAIC0yMzcsMjQgKzIxNCwyNCBAQAogCQlpZiAocHJvdG9jb2xzW2tdICYmICFzdHJjbXAocHItPm5hbWUsIHByb3RvY29sc1trXS0+bmFtZSkpIHsKIAkJCXByaW50aygicGFyaWRlOiAlcyBwcm90b2NvbCBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIsCiAJCQkgICAgICAgcHItPm5hbWUpOwotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLTE7CiAJCX0KIAlrID0gMDsKIAl3aGlsZSAoKGsgPCBNQVhfUFJPVE9TKSAmJiAocHJvdG9jb2xzW2tdKSkKIAkJaysrOwogCWlmIChrID09IE1BWF9QUk9UT1MpIHsKIAkJcHJpbnRrKCJwYXJpZGU6IHByb3RvY29sIHRhYmxlIGZ1bGxcbiIpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC0xOwogCX0KIAlwcm90b2NvbHNba10gPSBwcjsKIAlwci0+aW5kZXggPSBrOwogCXByaW50aygicGFyaWRlOiAlcyByZWdpc3RlcmVkIGFzIHByb3RvY29sICVkXG4iLCBwci0+bmFtZSwgayk7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0wocGlfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChwYXJpZGVfcmVnaXN0ZXIpOwogCi12b2lkIHBpX3VucmVnaXN0ZXIoUElQICogcHIpCit2b2lkIHBhcmlkZV91bnJlZ2lzdGVyKFBJUCAqIHByKQogewogCWlmICghcHIpCiAJCXJldHVybjsKQEAgLTI2NSwxMiArMjQyLDEwIEBACiAJcHJvdG9jb2xzW3ByLT5pbmRleF0gPSBOVUxMOwogfQogCi1FWFBPUlRfU1lNQk9MKHBpX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChwYXJpZGVfdW5yZWdpc3Rlcik7CiAKIHN0YXRpYyBpbnQgcGlfcmVnaXN0ZXJfcGFycG9ydChQSUEgKiBwaSwgaW50IHZlcmJvc2UpCiB7Ci0jaWZkZWYgQ09ORklHX1BBUlBPUlQKLQogCXN0cnVjdCBwYXJwb3J0ICpwb3J0OwogCiAJcG9ydCA9IHBhcnBvcnRfZmluZF9iYXNlKHBpLT5wb3J0KTsKQEAgLTI5MCw3ICsyNjUsNiBAQAogCQlwcmludGsoIiVzOiAweCV4IGlzICVzXG4iLCBwaS0+ZGV2aWNlLCBwaS0+cG9ydCwgcG9ydC0+bmFtZSk7CiAKIAlwaS0+cGFybmFtZSA9IChjaGFyICopIHBvcnQtPm5hbWU7Ci0jZW5kaWYKIAogCXJldHVybiAxOwogfQpAQCAtNDQ3LDEzICs0MjEsNiBAQAogCQkJcHJpbnRrKCIlczogQWRhcHRlciBub3QgZm91bmRcbiIsIGRldmljZSk7CiAJCXJldHVybiAwOwogCX0KLSNpZm5kZWYgQ09ORklHX1BBUlBPUlQKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKHBpLT5wb3J0LCBwaS0+cmVzZXJ2ZWQsIHBpLT5kZXZpY2UpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBhcmlkZTogVW5hYmxlIHRvIHJlcXVlc3QgcmVnaW9uIDB4JXhcbiIsCi0JCSAgICAgICBwaS0+cG9ydCk7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgkJCQkvKiAhQ09ORklHX1BBUlBPUlQgKi8KIAogCWlmIChwaS0+cGFybmFtZSkKIAkJcHJpbnRrKCIlczogU2hhcmluZyAlcyBhdCAweCV4XG4iLCBwaS0+ZGV2aWNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGFyaWRlLmggYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wYXJpZGUuaAppbmRleCBjNmQ5OGVmLi4yYmRkYmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wYXJpZGUuaAorKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wYXJpZGUuaApAQCAtMTYzLDggKzE2Myw4IEBACiAKIHR5cGVkZWYgc3RydWN0IHBpX3Byb3RvY29sIFBJUDsKIAotZXh0ZXJuIGludCBwaV9yZWdpc3RlciggUElQICogKTsKLWV4dGVybiB2b2lkIHBpX3VucmVnaXN0ZXIgKCBQSVAgKiApOworZXh0ZXJuIGludCBwYXJpZGVfcmVnaXN0ZXIoIFBJUCAqICk7CitleHRlcm4gdm9pZCBwYXJpZGVfdW5yZWdpc3RlciAoIFBJUCAqICk7CiAKICNlbmRpZiAvKiBfX0RSSVZFUlNfUEFSSURFX0hfXyAqLwogLyogZW5kIG9mIHBhcmlkZS5oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCmluZGV4IGFjNWJhNDYuLmM4NTJlZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCkBAIC05MTIsMTIgKzkxMiwxMiBAQAogCWludCB1bml0OwogCiAJaWYgKGRpc2FibGUpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwY2RfaW5pdF91bml0cygpOwogCiAJaWYgKHBjZF9kZXRlY3QoKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGdldCB0aGUgYXRhcGkgY2FwYWJpbGl0aWVzIHBhZ2UgKi8KIAlwY2RfcHJvYmVfY2FwYWJpbGl0aWVzKCk7CkBAIC05MjUsNyArOTI1LDcgQEAKIAlpZiAocmVnaXN0ZXJfYmxrZGV2KG1ham9yLCBuYW1lKSkgewogCQlmb3IgKHVuaXQgPSAwLCBjZCA9IHBjZDsgdW5pdCA8IFBDRF9VTklUUzsgdW5pdCsrLCBjZCsrKQogCQkJcHV0X2Rpc2soY2QtPmRpc2spOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJcGNkX3F1ZXVlID0gYmxrX2luaXRfcXVldWUoZG9fcGNkX3JlcXVlc3QsICZwY2RfbG9jayk7CkBAIC05MzMsNyArOTMzLDcgQEAKIAkJdW5yZWdpc3Rlcl9ibGtkZXYobWFqb3IsIG5hbWUpOwogCQlmb3IgKHVuaXQgPSAwLCBjZCA9IHBjZDsgdW5pdCA8IFBDRF9VTklUUzsgdW5pdCsrLCBjZCsrKQogCQkJcHV0X2Rpc2soY2QtPmRpc2spOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWZvciAodW5pdCA9IDAsIGNkID0gcGNkOyB1bml0IDwgUENEX1VOSVRTOyB1bml0KyssIGNkKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BkLmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZC5jCmluZGV4IDQwYTExZTUuLjlkOWJmZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BkLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGQuYwpAQCAtMzUyLDE5ICszNTIsMTkgQEAKIAogc3RhdGljIHZvaWQgcnVuX2ZzbSh2b2lkKTsKIAotc3RhdGljIHZvaWQgcHNfdHFfaW50KCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHBzX3RxX2ludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCi1zdGF0aWMgREVDTEFSRV9XT1JLKGZzbV90cSwgcHNfdHFfaW50LCBOVUxMKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhmc21fdHEsIHBzX3RxX2ludCk7CiAKIHN0YXRpYyB2b2lkIHNjaGVkdWxlX2ZzbSh2b2lkKQogewogCWlmICghbmljZSkKLQkJc2NoZWR1bGVfd29yaygmZnNtX3RxKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmc21fdHEsIDApOwogCWVsc2UKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmc21fdHEsIG5pY2UtMSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBzX3RxX2ludCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgcHNfdHFfaW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlydW5fZnNtKCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZi5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGYuYwppbmRleCAxYTlkZWUxLi43Y2RhYTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZi5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMKQEAgLTkzMywyNSArOTMzLDI1IEBACiAJaW50IHVuaXQ7CiAKIAlpZiAoZGlzYWJsZSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBmX2luaXRfdW5pdHMoKTsKIAogCWlmIChwZl9kZXRlY3QoKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT0RFVjsKIAlwZl9idXN5ID0gMDsKIAogCWlmIChyZWdpc3Rlcl9ibGtkZXYobWFqb3IsIG5hbWUpKSB7CiAJCWZvciAocGYgPSB1bml0cywgdW5pdCA9IDA7IHVuaXQgPCBQRl9VTklUUzsgcGYrKywgdW5pdCsrKQogCQkJcHV0X2Rpc2socGYtPmRpc2spOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCXBmX3F1ZXVlID0gYmxrX2luaXRfcXVldWUoZG9fcGZfcmVxdWVzdCwgJnBmX3NwaW5fbG9jayk7CiAJaWYgKCFwZl9xdWV1ZSkgewogCQl1bnJlZ2lzdGVyX2Jsa2RldihtYWpvciwgbmFtZSk7CiAJCWZvciAocGYgPSB1bml0cywgdW5pdCA9IDA7IHVuaXQgPCBQRl9VTklUUzsgcGYrKywgdW5pdCsrKQogCQkJcHV0X2Rpc2socGYtPmRpc2spOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhwZl9xdWV1ZSwgY2x1c3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGcuYwppbmRleCAxM2Y5OThhLi45OTcwYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BnLmMKQEAgLTY0NiwxNCArNjQ2LDE0IEBACiAJaW50IGVycjsKIAogCWlmIChkaXNhYmxlKXsKLQkJZXJyID0gLTE7CisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAogCXBnX2luaXRfdW5pdHMoKTsKIAogCWlmIChwZ19kZXRlY3QoKSkgewotCQllcnIgPSAtMTsKKwkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wc2V1ZG8uaCBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BzZXVkby5oCmluZGV4IDkzMjM0MmQuLmJjMzcwMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BzZXVkby5oCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BzZXVkby5oCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAotc3RhdGljIHZvaWQgcHNfdHFfaW50KCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHBzX3RxX2ludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdGF0aWMgdm9pZCAoKiBwc19jb250aW51YXRpb24pKHZvaWQpOwogc3RhdGljIGludCAoKiBwc19yZWFkeSkodm9pZCk7CkBAIC00NSw3ICs0NSw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHNfc3BpbmxvY2sgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpOwogCi1zdGF0aWMgREVDTEFSRV9XT1JLKHBzX3RxLCBwc190cV9pbnQsIE5VTEwpOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHBzX3RxLCBwc190cV9pbnQpOwogCiBzdGF0aWMgdm9pZCBwc19zZXRfaW50cih2b2lkICgqY29udGludWF0aW9uKSh2b2lkKSwgCiAJCQlpbnQgKCpyZWFkeSkodm9pZCksCkBAIC02MywxNCArNjMsMTQgQEAKIAlpZiAoIXBzX3RxX2FjdGl2ZSkgewogCQlwc190cV9hY3RpdmUgPSAxOwogCQlpZiAoIXBzX25pY2UpCi0JCQlzY2hlZHVsZV93b3JrKCZwc190cSk7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBzX3RxLCAwKTsKIAkJZWxzZQogCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwc190cSwgcHNfbmljZS0xKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHNfc3BpbmxvY2ssZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBwc190cV9pbnQodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHBzX3RxX2ludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJdm9pZCAoKmNvbikodm9pZCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTkyLDcgKzkyLDcgQEAKIAl9CiAJcHNfdHFfYWN0aXZlID0gMTsKIAlpZiAoIXBzX25pY2UpCi0JCXNjaGVkdWxlX3dvcmsoJnBzX3RxKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwc190cSwgMCk7CiAJZWxzZQogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBzX3RxLCBwc19uaWNlLTEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzX3NwaW5sb2NrLGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3B0LmMgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wdC5jCmluZGV4IDM1ZmIyNjYuLmM5MDJiMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3B0LmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcHQuYwpAQCAtOTQ2LDEyICs5NDYsMTIgQEAKIAlpbnQgZXJyOwogCiAJaWYgKGRpc2FibGUpIHsKLQkJZXJyID0gLTE7CisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmIChwdF9kZXRlY3QoKSkgewotCQllcnIgPSAtMTsKKwkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCmluZGV4IGYyOTA0ZjYuLjdjOTVjNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMCBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPgogICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUGV0ZXIgT3N0ZXJsdW5kIDxwZXRlcm8yQHRlbGlhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaG9tYXMgTWFpZXIgPGJhbGFnaUBqdXN0bWFpbC5kZT4KICAqCiAgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCkBAIC01NCwxMSArNTUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2lvY3RsLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtODMsOSArODYsNDI0IEBACiBzdGF0aWMgc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwa3RfZGV2c1tNQVhfV1JJVEVSU107CiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwa3RfcHJvYzsKIHN0YXRpYyBpbnQgcGt0ZGV2X21ham9yOworc3RhdGljIGludCB3cml0ZV9jb25nZXN0aW9uX29uICA9IFBLVF9XUklURV9DT05HRVNUSU9OX09OOworc3RhdGljIGludCB3cml0ZV9jb25nZXN0aW9uX29mZiA9IFBLVF9XUklURV9DT05HRVNUSU9OX09GRjsKIHN0YXRpYyBzdHJ1Y3QgbXV0ZXggY3RsX211dGV4OwkvKiBTZXJpYWxpemUgb3Blbi9jbG9zZS9zZXR1cC90ZWFyZG93biAqLwogc3RhdGljIG1lbXBvb2xfdCAqcHNkX3Bvb2w7CiAKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MJKmNsYXNzX3BrdGNkdmQgPSBOVUxMOyAgICAvKiAvc3lzL2NsYXNzL3BrdGNkdmQgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5CSpwa3RfZGVidWdmc19yb290ID0gTlVMTDsgLyogL2RlYnVnL3BrdGNkdmQgKi8KKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIGludCBwa3Rfc2V0dXBfZGV2KGRldl90IGRldiwgZGV2X3QqIHBrdF9kZXYpOworc3RhdGljIGludCBwa3RfcmVtb3ZlX2RldihkZXZfdCBwa3RfZGV2KTsKK3N0YXRpYyBpbnQgcGt0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCk7CisKKworCisvKgorICogY3JlYXRlIGFuZCByZWdpc3RlciBhIHBrdGNkdmQga2VybmVsIG9iamVjdC4KKyAqLworc3RhdGljIHN0cnVjdCBwa3RjZHZkX2tvYmoqIHBrdF9rb2JqX2NyZWF0ZShzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkLAorCQkJCQljb25zdCBjaGFyKiBuYW1lLAorCQkJCQlzdHJ1Y3Qga29iamVjdCogcGFyZW50LAorCQkJCQlzdHJ1Y3Qga29ial90eXBlKiBrdHlwZSkKK3sKKwlzdHJ1Y3QgcGt0Y2R2ZF9rb2JqICpwOworCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisJa29iamVjdF9zZXRfbmFtZSgmcC0+a29iaiwgIiVzIiwgbmFtZSk7CisJcC0+a29iai5wYXJlbnQgPSBwYXJlbnQ7CisJcC0+a29iai5rdHlwZSA9IGt0eXBlOworCXAtPnBkID0gcGQ7CisJaWYgKGtvYmplY3RfcmVnaXN0ZXIoJnAtPmtvYmopICE9IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiBwOworfQorLyoKKyAqIHJlbW92ZSBhIHBrdGNkdmQga2VybmVsIG9iamVjdC4KKyAqLworc3RhdGljIHZvaWQgcGt0X2tvYmpfcmVtb3ZlKHN0cnVjdCBwa3RjZHZkX2tvYmogKnApCit7CisJaWYgKHApCisJCWtvYmplY3RfdW5yZWdpc3RlcigmcC0+a29iaik7Cit9CisvKgorICogZGVmYXVsdCByZWxlYXNlIGZ1bmN0aW9uIGZvciBwa3RjZHZkIGtlcm5lbCBvYmplY3RzLgorICovCitzdGF0aWMgdm9pZCBwa3Rfa29ial9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWtmcmVlKHRvX3BrdGNkdmRrb2JqKGtvYmopKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN5c2ZzIGludGVyZmFjZSBmb3IgcGt0Y2R2ZAorICogYnkgKEMpIDIwMDYgIFRob21hcyBNYWllciA8YmFsYWdpQGp1c3RtYWlsLmRlPgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERFRl9BVFRSKF9vYmosX25hbWUsX21vZGUpIFwKKwlzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSBfb2JqID0geyBcCisJCS5uYW1lID0gX25hbWUsIC5vd25lciA9IFRISVNfTU9EVUxFLCAubW9kZSA9IF9tb2RlIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgL3N5cy9jbGFzcy9wa3RjZHZkL3BrdGNkdmRbMC03XS8KKyAgICAgICAgICAgICAgICAgICAgIHN0YXQvcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgIHN0YXQvcGFja2V0c19zdGFydGVkCisgICAgICAgICAgICAgICAgICAgICBzdGF0L3BhY2tldHNfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgIHN0YXQva2Jfd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgc3RhdC9rYl9yZWFkCisgICAgICAgICAgICAgICAgICAgICBzdGF0L2tiX3JlYWRfZ2F0aGVyCisgICAgICAgICAgICAgICAgICAgICB3cml0ZV9xdWV1ZS9zaXplCisgICAgICAgICAgICAgICAgICAgICB3cml0ZV9xdWV1ZS9jb25nZXN0aW9uX29mZgorICAgICAgICAgICAgICAgICAgICAgd3JpdGVfcXVldWUvY29uZ2VzdGlvbl9vbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0RFRl9BVFRSKGtvYmpfcGt0X2F0dHJfc3QxLCAicmVzZXQiLCAwMjAwKTsKK0RFRl9BVFRSKGtvYmpfcGt0X2F0dHJfc3QyLCAicGFja2V0c19zdGFydGVkIiwgMDQ0NCk7CitERUZfQVRUUihrb2JqX3BrdF9hdHRyX3N0MywgInBhY2tldHNfZmluaXNoZWQiLCAwNDQ0KTsKK0RFRl9BVFRSKGtvYmpfcGt0X2F0dHJfc3Q0LCAia2Jfd3JpdHRlbiIsIDA0NDQpOworREVGX0FUVFIoa29ial9wa3RfYXR0cl9zdDUsICJrYl9yZWFkIiwgMDQ0NCk7CitERUZfQVRUUihrb2JqX3BrdF9hdHRyX3N0NiwgImtiX3JlYWRfZ2F0aGVyIiwgMDQ0NCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICprb2JqX3BrdF9hdHRyc19zdGF0W10gPSB7CisJJmtvYmpfcGt0X2F0dHJfc3QxLAorCSZrb2JqX3BrdF9hdHRyX3N0MiwKKwkma29ial9wa3RfYXR0cl9zdDMsCisJJmtvYmpfcGt0X2F0dHJfc3Q0LAorCSZrb2JqX3BrdF9hdHRyX3N0NSwKKwkma29ial9wa3RfYXR0cl9zdDYsCisJTlVMTAorfTsKKworREVGX0FUVFIoa29ial9wa3RfYXR0cl93cTEsICJzaXplIiwgMDQ0NCk7CitERUZfQVRUUihrb2JqX3BrdF9hdHRyX3dxMiwgImNvbmdlc3Rpb25fb2ZmIiwgMDY0NCk7CitERUZfQVRUUihrb2JqX3BrdF9hdHRyX3dxMywgImNvbmdlc3Rpb25fb24iLCAgMDY0NCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICprb2JqX3BrdF9hdHRyc193cXVldWVbXSA9IHsKKwkma29ial9wa3RfYXR0cl93cTEsCisJJmtvYmpfcGt0X2F0dHJfd3EyLAorCSZrb2JqX3BrdF9hdHRyX3dxMywKKwlOVUxMCit9OworCisvKiBkZWNsYXJlcyBhIGNoYXIgYnVmZmVyWzY0XSBfZGJ1ZiwgY29waWVzIGRhdGEgZnJvbQorICogX2Igd2l0aCBsZW5ndGggX2wgaW50byBpdCBhbmQgZW5zdXJlcyB0aGF0IF9kYnVmIGVuZHMKKyAqIHdpdGggYSBcMCBjaGFyYWN0ZXIuCisgKi8KKyNkZWZpbmUgREVDTEFSRV9CVUZfQVNfU1RSSU5HKF9kYnVmLCBfYiwgX2wpIFwKKwljaGFyIF9kYnVmWzY0XTsgaW50IGRsZW4gPSAoX2wpIDwgMCA/IDAgOiAoX2wpOyBcCisJaWYgKGRsZW4gPj0gc2l6ZW9mKF9kYnVmKSkgZGxlbiA9IHNpemVvZihfZGJ1ZiktMTsgXAorCW1lbWNweShfZGJ1ZiwgX2IsIGRsZW4pOyBfZGJ1ZltkbGVuXSA9IDAKKworc3RhdGljIHNzaXplX3Qga29ial9wa3Rfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCA9IHRvX3BrdGNkdmRrb2JqKGtvYmopLT5wZDsKKwlpbnQgbiA9IDA7CisJaW50IHY7CisJaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAicGFja2V0c19zdGFydGVkIikgPT0gMCkgeworCQluID0gc3ByaW50ZihkYXRhLCAiJWx1XG4iLCBwZC0+c3RhdHMucGt0X3N0YXJ0ZWQpOworCisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgInBhY2tldHNfZmluaXNoZWQiKSA9PSAwKSB7CisJCW4gPSBzcHJpbnRmKGRhdGEsICIlbHVcbiIsIHBkLT5zdGF0cy5wa3RfZW5kZWQpOworCisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgImtiX3dyaXR0ZW4iKSA9PSAwKSB7CisJCW4gPSBzcHJpbnRmKGRhdGEsICIlbHVcbiIsIHBkLT5zdGF0cy5zZWNzX3cgPj4gMSk7CisKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAia2JfcmVhZCIpID09IDApIHsKKwkJbiA9IHNwcmludGYoZGF0YSwgIiVsdVxuIiwgcGQtPnN0YXRzLnNlY3NfciA+PiAxKTsKKworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJrYl9yZWFkX2dhdGhlciIpID09IDApIHsKKwkJbiA9IHNwcmludGYoZGF0YSwgIiVsdVxuIiwgcGQtPnN0YXRzLnNlY3NfcmcgPj4gMSk7CisKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAic2l6ZSIpID09IDApIHsKKwkJc3Bpbl9sb2NrKCZwZC0+bG9jayk7CisJCXYgPSBwZC0+YmlvX3F1ZXVlX3NpemU7CisJCXNwaW5fdW5sb2NrKCZwZC0+bG9jayk7CisJCW4gPSBzcHJpbnRmKGRhdGEsICIlZFxuIiwgdik7CisKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAiY29uZ2VzdGlvbl9vZmYiKSA9PSAwKSB7CisJCXNwaW5fbG9jaygmcGQtPmxvY2spOworCQl2ID0gcGQtPndyaXRlX2Nvbmdlc3Rpb25fb2ZmOworCQlzcGluX3VubG9jaygmcGQtPmxvY2spOworCQluID0gc3ByaW50ZihkYXRhLCAiJWRcbiIsIHYpOworCisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgImNvbmdlc3Rpb25fb24iKSA9PSAwKSB7CisJCXNwaW5fbG9jaygmcGQtPmxvY2spOworCQl2ID0gcGQtPndyaXRlX2Nvbmdlc3Rpb25fb247CisJCXNwaW5fdW5sb2NrKCZwZC0+bG9jayk7CisJCW4gPSBzcHJpbnRmKGRhdGEsICIlZFxuIiwgdik7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBpbml0X3dyaXRlX2Nvbmdlc3Rpb25fbWFya3MoaW50KiBsbywgaW50KiBoaSkKK3sKKwlpZiAoKmhpID4gMCkgeworCQkqaGkgPSBtYXgoKmhpLCA1MDApOworCQkqaGkgPSBtaW4oKmhpLCAxMDAwMDAwKTsKKwkJaWYgKCpsbyA8PSAwKQorCQkJKmxvID0gKmhpIC0gMTAwOworCQllbHNlIHsKKwkJCSpsbyA9IG1pbigqbG8sICpoaSAtIDEwMCk7CisJCQkqbG8gPSBtYXgoKmxvLCAxMDApOworCQl9CisJfSBlbHNlIHsKKwkJKmhpID0gLTE7CisJCSpsbyA9IC0xOworCX0KK30KKworc3RhdGljIHNzaXplX3Qga29ial9wa3Rfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkID0gdG9fcGt0Y2R2ZGtvYmooa29iaiktPnBkOworCWludCB2YWw7CisJREVDTEFSRV9CVUZfQVNfU1RSSU5HKGRidWYsIGRhdGEsIGxlbik7IC8qIGVuc3VyZSBzc2NhbmYgc2NhbnMgYSBzdHJpbmcgKi8KKworCWlmIChzdHJjbXAoYXR0ci0+bmFtZSwgInJlc2V0IikgPT0gMCAmJiBkbGVuID4gMCkgeworCQlwZC0+c3RhdHMucGt0X3N0YXJ0ZWQgPSAwOworCQlwZC0+c3RhdHMucGt0X2VuZGVkID0gMDsKKwkJcGQtPnN0YXRzLnNlY3NfdyA9IDA7CisJCXBkLT5zdGF0cy5zZWNzX3JnID0gMDsKKwkJcGQtPnN0YXRzLnNlY3NfciA9IDA7CisKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAiY29uZ2VzdGlvbl9vZmYiKSA9PSAwCisJCSAgICYmIHNzY2FuZihkYnVmLCAiJWQiLCAmdmFsKSA9PSAxKSB7CisJCXNwaW5fbG9jaygmcGQtPmxvY2spOworCQlwZC0+d3JpdGVfY29uZ2VzdGlvbl9vZmYgPSB2YWw7CisJCWluaXRfd3JpdGVfY29uZ2VzdGlvbl9tYXJrcygmcGQtPndyaXRlX2Nvbmdlc3Rpb25fb2ZmLAorCQkJCQkmcGQtPndyaXRlX2Nvbmdlc3Rpb25fb24pOworCQlzcGluX3VubG9jaygmcGQtPmxvY2spOworCisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgImNvbmdlc3Rpb25fb24iKSA9PSAwCisJCSAgICYmIHNzY2FuZihkYnVmLCAiJWQiLCAmdmFsKSA9PSAxKSB7CisJCXNwaW5fbG9jaygmcGQtPmxvY2spOworCQlwZC0+d3JpdGVfY29uZ2VzdGlvbl9vbiA9IHZhbDsKKwkJaW5pdF93cml0ZV9jb25nZXN0aW9uX21hcmtzKCZwZC0+d3JpdGVfY29uZ2VzdGlvbl9vZmYsCisJCQkJCSZwZC0+d3JpdGVfY29uZ2VzdGlvbl9vbik7CisJCXNwaW5fdW5sb2NrKCZwZC0+bG9jayk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGtvYmpfcGt0X29wcyA9IHsKKwkuc2hvdyA9IGtvYmpfcGt0X3Nob3csCisJLnN0b3JlID0ga29ial9wa3Rfc3RvcmUKK307CitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrb2JqX3BrdF90eXBlX3N0YXQgPSB7CisJLnJlbGVhc2UgPSBwa3Rfa29ial9yZWxlYXNlLAorCS5zeXNmc19vcHMgPSAma29ial9wa3Rfb3BzLAorCS5kZWZhdWx0X2F0dHJzID0ga29ial9wa3RfYXR0cnNfc3RhdAorfTsKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGtvYmpfcGt0X3R5cGVfd3F1ZXVlID0geworCS5yZWxlYXNlID0gcGt0X2tvYmpfcmVsZWFzZSwKKwkuc3lzZnNfb3BzID0gJmtvYmpfcGt0X29wcywKKwkuZGVmYXVsdF9hdHRycyA9IGtvYmpfcGt0X2F0dHJzX3dxdWV1ZQorfTsKKworc3RhdGljIHZvaWQgcGt0X3N5c2ZzX2Rldl9uZXcoc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCkKK3sKKwlpZiAoY2xhc3NfcGt0Y2R2ZCkgeworCQlwZC0+Y2xzZGV2ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShjbGFzc19wa3RjZHZkLAorCQkJCQlOVUxMLCBwZC0+cGt0X2RldiwKKwkJCQkJTlVMTCwgIiVzIiwgcGQtPm5hbWUpOworCQlpZiAoSVNfRVJSKHBkLT5jbHNkZXYpKQorCQkJcGQtPmNsc2RldiA9IE5VTEw7CisJfQorCWlmIChwZC0+Y2xzZGV2KSB7CisJCXBkLT5rb2JqX3N0YXQgPSBwa3Rfa29ial9jcmVhdGUocGQsICJzdGF0IiwKKwkJCQkJJnBkLT5jbHNkZXYtPmtvYmosCisJCQkJCSZrb2JqX3BrdF90eXBlX3N0YXQpOworCQlwZC0+a29ial93cXVldWUgPSBwa3Rfa29ial9jcmVhdGUocGQsICJ3cml0ZV9xdWV1ZSIsCisJCQkJCSZwZC0+Y2xzZGV2LT5rb2JqLAorCQkJCQkma29ial9wa3RfdHlwZV93cXVldWUpOworCX0KK30KKworc3RhdGljIHZvaWQgcGt0X3N5c2ZzX2Rldl9yZW1vdmUoc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCkKK3sKKwlwa3Rfa29ial9yZW1vdmUocGQtPmtvYmpfc3RhdCk7CisJcGt0X2tvYmpfcmVtb3ZlKHBkLT5rb2JqX3dxdWV1ZSk7CisJaWYgKGNsYXNzX3BrdGNkdmQpCisJCWNsYXNzX2RldmljZV9kZXN0cm95KGNsYXNzX3BrdGNkdmQsIHBkLT5wa3RfZGV2KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgL3N5cy9jbGFzcy9wa3RjZHZkLworICAgICAgICAgICAgICAgICAgICAgYWRkICAgICAgICAgICAgbWFwIGJsb2NrIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlICAgICAgICAgdW5tYXAgcGFja2V0IGRldgorICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX21hcCAgICAgc2hvdyBtYXBwaW5ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNsYXNzX3BrdGNkdmRfcmVsZWFzZShzdHJ1Y3QgY2xhc3MgKmNscykKK3sKKwlrZnJlZShjbHMpOworfQorc3RhdGljIHNzaXplX3QgY2xhc3NfcGt0Y2R2ZF9zaG93X21hcChzdHJ1Y3QgY2xhc3MgKmMsIGNoYXIgKmRhdGEpCit7CisJaW50IG4gPSAwOworCWludCBpZHg7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmN0bF9tdXRleCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX1dSSVRFUlM7IGlkeCsrKSB7CisJCXN0cnVjdCBwa3RjZHZkX2RldmljZSAqcGQgPSBwa3RfZGV2c1tpZHhdOworCQlpZiAoIXBkKQorCQkJY29udGludWU7CisJCW4gKz0gc3ByaW50ZihkYXRhK24sICIlcyAldToldSAldToldVxuIiwKKwkJCXBkLT5uYW1lLAorCQkJTUFKT1IocGQtPnBrdF9kZXYpLCBNSU5PUihwZC0+cGt0X2RldiksCisJCQlNQUpPUihwZC0+YmRldi0+YmRfZGV2KSwKKwkJCU1JTk9SKHBkLT5iZGV2LT5iZF9kZXYpKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjdGxfbXV0ZXgpOworCXJldHVybiBuOworfQorCitzdGF0aWMgc3NpemVfdCBjbGFzc19wa3RjZHZkX3N0b3JlX2FkZChzdHJ1Y3QgY2xhc3MgKmMsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBtYWpvciwgbWlub3I7CisJREVDTEFSRV9CVUZfQVNfU1RSSU5HKGRidWYsIGJ1ZiwgY291bnQpOworCWlmIChzc2NhbmYoZGJ1ZiwgIiV1OiV1IiwgJm1ham9yLCAmbWlub3IpID09IDIpIHsKKwkJcGt0X3NldHVwX2RldihNS0RFVihtYWpvciwgbWlub3IpLCBOVUxMKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgY2xhc3NfcGt0Y2R2ZF9zdG9yZV9yZW1vdmUoc3RydWN0IGNsYXNzICpjLCBjb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFqb3IsIG1pbm9yOworCURFQ0xBUkVfQlVGX0FTX1NUUklORyhkYnVmLCBidWYsIGNvdW50KTsKKwlpZiAoc3NjYW5mKGRidWYsICIldToldSIsICZtYWpvciwgJm1pbm9yKSA9PSAyKSB7CisJCXBrdF9yZW1vdmVfZGV2KE1LREVWKG1ham9yLCBtaW5vcikpOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSBjbGFzc19wa3RjZHZkX2F0dHJzW10gPSB7CisgX19BVFRSKGFkZCwgICAgICAgICAgICAwMjAwLCBOVUxMLCBjbGFzc19wa3RjZHZkX3N0b3JlX2FkZCksCisgX19BVFRSKHJlbW92ZSwgICAgICAgICAwMjAwLCBOVUxMLCBjbGFzc19wa3RjZHZkX3N0b3JlX3JlbW92ZSksCisgX19BVFRSKGRldmljZV9tYXAsICAgICAwNDQ0LCBjbGFzc19wa3RjZHZkX3Nob3dfbWFwLCBOVUxMKSwKKyBfX0FUVFJfTlVMTAorfTsKKworCitzdGF0aWMgaW50IHBrdF9zeXNmc19pbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIGNyZWF0ZSBjb250cm9sIGZpbGVzIGluIHN5c2ZzCisJICogL3N5cy9jbGFzcy9wa3RjZHZkLy4uLgorCSAqLworCWNsYXNzX3BrdGNkdmQgPSBremFsbG9jKHNpemVvZigqY2xhc3NfcGt0Y2R2ZCksIEdGUF9LRVJORUwpOworCWlmICghY2xhc3NfcGt0Y2R2ZCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY2xhc3NfcGt0Y2R2ZC0+bmFtZSA9IERSSVZFUl9OQU1FOworCWNsYXNzX3BrdGNkdmQtPm93bmVyID0gVEhJU19NT0RVTEU7CisJY2xhc3NfcGt0Y2R2ZC0+Y2xhc3NfcmVsZWFzZSA9IGNsYXNzX3BrdGNkdmRfcmVsZWFzZTsKKwljbGFzc19wa3RjZHZkLT5jbGFzc19hdHRycyA9IGNsYXNzX3BrdGNkdmRfYXR0cnM7CisJcmV0ID0gY2xhc3NfcmVnaXN0ZXIoY2xhc3NfcGt0Y2R2ZCk7CisJaWYgKHJldCkgeworCQlrZnJlZShjbGFzc19wa3RjZHZkKTsKKwkJY2xhc3NfcGt0Y2R2ZCA9IE5VTEw7CisJCXByaW50ayhEUklWRVJfTkFNRSI6IGZhaWxlZCB0byBjcmVhdGUgY2xhc3MgcGt0Y2R2ZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwa3Rfc3lzZnNfY2xlYW51cCh2b2lkKQoreworCWlmIChjbGFzc19wa3RjZHZkKQorCQljbGFzc19kZXN0cm95KGNsYXNzX3BrdGNkdmQpOworCWNsYXNzX3BrdGNkdmQgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgZW50cmllcyBpbiBkZWJ1Z2ZzCisKKyAgL2RlYnVnZnMvcGt0Y2R2ZFswLTddLworCQkJaW5mbworCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBwa3RfZGVidWdmc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCit7CisJcmV0dXJuIHBrdF9zZXFfc2hvdyhtLCBwKTsKK30KKworc3RhdGljIGludCBwa3RfZGVidWdmc19mb3BzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHBrdF9kZWJ1Z2ZzX3NlcV9zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfZm9wcyA9IHsKKwkub3BlbgkJPSBwa3RfZGVidWdmc19mb3BzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgdm9pZCBwa3RfZGVidWdmc19kZXZfbmV3KHN0cnVjdCBwa3RjZHZkX2RldmljZSAqcGQpCit7CisJaWYgKCFwa3RfZGVidWdmc19yb290KQorCQlyZXR1cm47CisJcGQtPmRmc19mX2luZm8gPSBOVUxMOworCXBkLT5kZnNfZF9yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKHBkLT5uYW1lLCBwa3RfZGVidWdmc19yb290KTsKKwlpZiAoSVNfRVJSKHBkLT5kZnNfZF9yb290KSkgeworCQlwZC0+ZGZzX2Rfcm9vdCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJcGQtPmRmc19mX2luZm8gPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpbmZvIiwgU19JUlVHTywKKwkJCQlwZC0+ZGZzX2Rfcm9vdCwgcGQsICZkZWJ1Z19mb3BzKTsKKwlpZiAoSVNfRVJSKHBkLT5kZnNfZl9pbmZvKSkgeworCQlwZC0+ZGZzX2ZfaW5mbyA9IE5VTEw7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBrdF9kZWJ1Z2ZzX2Rldl9yZW1vdmUoc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZCkKK3sKKwlpZiAoIXBrdF9kZWJ1Z2ZzX3Jvb3QpCisJCXJldHVybjsKKwlpZiAocGQtPmRmc19mX2luZm8pCisJCWRlYnVnZnNfcmVtb3ZlKHBkLT5kZnNfZl9pbmZvKTsKKwlwZC0+ZGZzX2ZfaW5mbyA9IE5VTEw7CisJaWYgKHBkLT5kZnNfZF9yb290KQorCQlkZWJ1Z2ZzX3JlbW92ZShwZC0+ZGZzX2Rfcm9vdCk7CisJcGQtPmRmc19kX3Jvb3QgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwa3RfZGVidWdmc19pbml0KHZvaWQpCit7CisJcGt0X2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihEUklWRVJfTkFNRSwgTlVMTCk7CisJaWYgKElTX0VSUihwa3RfZGVidWdmc19yb290KSkgeworCQlwa3RfZGVidWdmc19yb290ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgcGt0X2RlYnVnZnNfY2xlYW51cCh2b2lkKQoreworCWlmICghcGt0X2RlYnVnZnNfcm9vdCkKKwkJcmV0dXJuOworCWRlYnVnZnNfcmVtb3ZlKHBrdF9kZWJ1Z2ZzX3Jvb3QpOworCXBrdF9kZWJ1Z2ZzX3Jvb3QgPSBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogCiBzdGF0aWMgdm9pZCBwa3RfYmlvX2ZpbmlzaGVkKHN0cnVjdCBwa3RjZHZkX2RldmljZSAqcGQpCiB7CkBAIC04OTMsNiArMTMxMSw3IEBACiAJc2VjdG9yX3Qgem9uZSA9IDA7IC8qIFN1cHByZXNzIGdjYyB3YXJuaW5nICovCiAJc3RydWN0IHBrdF9yYl9ub2RlICpub2RlLCAqZmlyc3Rfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlpbnQgd2FrZXVwOwogCiAJVlBSSU5USygiaGFuZGxlX3F1ZXVlXG4iKTsKIApAQCAtOTY1LDcgKzEzODQsMTMgQEAKIAkJcGt0LT53cml0ZV9zaXplICs9IGJpby0+Ymlfc2l6ZSAvIENEX0ZSQU1FU0laRTsKIAkJc3Bpbl91bmxvY2soJnBrdC0+bG9jayk7CiAJfQorCS8qIGNoZWNrIHdyaXRlIGNvbmdlc3Rpb24gbWFya3MsIGFuZCBpZiBiaW9fcXVldWVfc2l6ZSBpcworCSAgIGJlbG93LCB3YWtlIHVwIGFueSB3YWl0ZXJzICovCisJd2FrZXVwID0gKHBkLT53cml0ZV9jb25nZXN0aW9uX29uID4gMAorCSAJCSYmIHBkLT5iaW9fcXVldWVfc2l6ZSA8PSBwZC0+d3JpdGVfY29uZ2VzdGlvbl9vZmYpOwogCXNwaW5fdW5sb2NrKCZwZC0+bG9jayk7CisJaWYgKHdha2V1cCkKKwkJYmxrX2NsZWFyX3F1ZXVlX2Nvbmdlc3RlZChwZC0+ZGlzay0+cXVldWUsIFdSSVRFKTsKIAogCXBrdC0+c2xlZXBfdGltZSA9IG1heChQQUNLRVRfV0FJVF9USU1FLCAxKTsKIAlwa3Rfc2V0X3N0YXRlKHBrdCwgUEFDS0VUX1dBSVRJTkdfU1RBVEUpOwpAQCAtMjE3OCw2ICsyNjAzLDIzIEBACiAJfQogCXNwaW5fdW5sb2NrKCZwZC0+Y2Rydy5hY3RpdmVfbGlzdF9sb2NrKTsKIAorIAkvKgorCSAqIFRlc3QgaWYgdGhlcmUgaXMgZW5vdWdoIHJvb20gbGVmdCBpbiB0aGUgYmlvIHdvcmsgcXVldWUKKwkgKiAocXVldWUgc2l6ZSA+PSBjb25nZXN0aW9uIG9uIG1hcmspLgorCSAqIElmIG5vdCwgd2FpdCB0aWxsIHRoZSB3b3JrIHF1ZXVlIHNpemUgaXMgYmVsb3cgdGhlIGNvbmdlc3Rpb24gb2ZmIG1hcmsuCisJICovCisJc3Bpbl9sb2NrKCZwZC0+bG9jayk7CisJaWYgKHBkLT53cml0ZV9jb25nZXN0aW9uX29uID4gMAorCSAgICAmJiBwZC0+YmlvX3F1ZXVlX3NpemUgPj0gcGQtPndyaXRlX2Nvbmdlc3Rpb25fb24pIHsKKwkJYmxrX3NldF9xdWV1ZV9jb25nZXN0ZWQocSwgV1JJVEUpOworCQlkbyB7CisJCQlzcGluX3VubG9jaygmcGQtPmxvY2spOworCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWik7CisJCQlzcGluX2xvY2soJnBkLT5sb2NrKTsKKwkJfSB3aGlsZShwZC0+YmlvX3F1ZXVlX3NpemUgPiBwZC0+d3JpdGVfY29uZ2VzdGlvbl9vZmYpOworCX0KKwlzcGluX3VubG9jaygmcGQtPmxvY2spOworCiAJLyoKIAkgKiBObyBtYXRjaGluZyBwYWNrZXQgZm91bmQuIFN0b3JlIHRoZSBiaW8gaW4gdGhlIHdvcmsgcXVldWUuCiAJICovCkBAIC0yMjk3LDYgKzI3MzksOSBAQAogCXNlcV9wcmludGYobSwgIlx0c3RhdGU6XHRcdFx0aTolZCBvdzolZCBydzolZCB3dzolZCByZWM6JWQgZmluOiVkXG4iLAogCQkgICBzdGF0ZXNbMF0sIHN0YXRlc1sxXSwgc3RhdGVzWzJdLCBzdGF0ZXNbM10sIHN0YXRlc1s0XSwgc3RhdGVzWzVdKTsKIAorCXNlcV9wcmludGYobSwgIlx0d3JpdGUgY29uZ2VzdGlvbiBtYXJrczpcdG9mZj0lZCBvbj0lZFxuIiwKKwkJCXBkLT53cml0ZV9jb25nZXN0aW9uX29mZiwKKwkJCXBkLT53cml0ZV9jb25nZXN0aW9uX29uKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQzNiwzNiArMjg4MSwzMyBAQAogLyoKICAqIFNldCB1cCBtYXBwaW5nIGZyb20gcGt0Y2R2ZCBkZXZpY2UgdG8gQ0QtUk9NIGRldmljZS4KICAqLwotc3RhdGljIGludCBwa3Rfc2V0dXBfZGV2KHN0cnVjdCBwa3RfY3RybF9jb21tYW5kICpjdHJsX2NtZCkKK3N0YXRpYyBpbnQgcGt0X3NldHVwX2RldihkZXZfdCBkZXYsIGRldl90KiBwa3RfZGV2KQogewogCWludCBpZHg7CiAJaW50IHJldCA9IC1FTk9NRU07CiAJc3RydWN0IHBrdGNkdmRfZGV2aWNlICpwZDsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKLQlkZXZfdCBkZXYgPSBuZXdfZGVjb2RlX2RldihjdHJsX2NtZC0+ZGV2KTsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZjdGxfbXV0ZXgsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX1dSSVRFUlM7IGlkeCsrKQogCQlpZiAoIXBrdF9kZXZzW2lkeF0pCiAJCQlicmVhazsKIAlpZiAoaWR4ID09IE1BWF9XUklURVJTKSB7CiAJCXByaW50ayhEUklWRVJfTkFNRSI6IG1heCAlZCB3cml0ZXJzIHN1cHBvcnRlZFxuIiwgTUFYX1dSSVRFUlMpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X211dGV4OwogCX0KIAogCXBkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBrdGNkdmRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfbXV0ZXg7CiAKIAlwZC0+cmJfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbChQS1RfUkJfUE9PTF9TSVpFLAogCQkJCQkJICBzaXplb2Yoc3RydWN0IHBrdF9yYl9ub2RlKSk7CiAJaWYgKCFwZC0+cmJfcG9vbCkKIAkJZ290byBvdXRfbWVtOwogCi0JZGlzayA9IGFsbG9jX2Rpc2soMSk7Ci0JaWYgKCFkaXNrKQotCQlnb3RvIG91dF9tZW07Ci0JcGQtPmRpc2sgPSBkaXNrOwotCiAJSU5JVF9MSVNUX0hFQUQoJnBkLT5jZHJ3LnBrdF9mcmVlX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZwZC0+Y2Rydy5wa3RfYWN0aXZlX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZwZC0+Y2Rydy5hY3RpdmVfbGlzdF9sb2NrKTsKQEAgLTI0NzYsMTEgKzI5MTgsMTggQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZC0+d3F1ZXVlKTsKIAlwZC0+YmlvX3F1ZXVlID0gUkJfUk9PVDsKIAorCXBkLT53cml0ZV9jb25nZXN0aW9uX29uICA9IHdyaXRlX2Nvbmdlc3Rpb25fb247CisJcGQtPndyaXRlX2Nvbmdlc3Rpb25fb2ZmID0gd3JpdGVfY29uZ2VzdGlvbl9vZmY7CisKKwlkaXNrID0gYWxsb2NfZGlzaygxKTsKKwlpZiAoIWRpc2spCisJCWdvdG8gb3V0X21lbTsKKwlwZC0+ZGlzayA9IGRpc2s7CiAJZGlzay0+bWFqb3IgPSBwa3RkZXZfbWFqb3I7CiAJZGlzay0+Zmlyc3RfbWlub3IgPSBpZHg7CiAJZGlzay0+Zm9wcyA9ICZwa3RjZHZkX29wczsKIAlkaXNrLT5mbGFncyA9IEdFTkhEX0ZMX1JFTU9WQUJMRTsKLQlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgRFJJVkVSX05BTUUiJWQiLCBpZHgpOworCXN0cmNweShkaXNrLT5kaXNrX25hbWUsIHBkLT5uYW1lKTsKIAlkaXNrLT5wcml2YXRlX2RhdGEgPSBwZDsKIAlkaXNrLT5xdWV1ZSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKIAlpZiAoIWRpc2stPnF1ZXVlKQpAQCAtMjQ5Miw4ICsyOTQxLDE1IEBACiAJCWdvdG8gb3V0X25ld19kZXY7CiAKIAlhZGRfZGlzayhkaXNrKTsKKworCXBrdF9zeXNmc19kZXZfbmV3KHBkKTsKKwlwa3RfZGVidWdmc19kZXZfbmV3KHBkKTsKKwogCXBrdF9kZXZzW2lkeF0gPSBwZDsKLQljdHJsX2NtZC0+cGt0X2RldiA9IG5ld19lbmNvZGVfZGV2KHBkLT5wa3RfZGV2KTsKKwlpZiAocGt0X2RldikKKwkJKnBrdF9kZXYgPSBwZC0+cGt0X2RldjsKKworCW11dGV4X3VubG9jaygmY3RsX211dGV4KTsKIAlyZXR1cm4gMDsKIAogb3V0X25ld19kZXY6CkBAIC0yNTA0LDE3ICsyOTYwLDIyIEBACiAJaWYgKHBkLT5yYl9wb29sKQogCQltZW1wb29sX2Rlc3Ryb3kocGQtPnJiX3Bvb2wpOwogCWtmcmVlKHBkKTsKK291dF9tdXRleDoKKwltdXRleF91bmxvY2soJmN0bF9tdXRleCk7CisJcHJpbnRrKERSSVZFUl9OQU1FIjogc2V0dXAgb2YgcGt0Y2R2ZCBkZXZpY2UgZmFpbGVkXG4iKTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKgogICogVGVhciBkb3duIG1hcHBpbmcgZnJvbSBwa3RjZHZkIGRldmljZSB0byBDRC1ST00gZGV2aWNlLgogICovCi1zdGF0aWMgaW50IHBrdF9yZW1vdmVfZGV2KHN0cnVjdCBwa3RfY3RybF9jb21tYW5kICpjdHJsX2NtZCkKK3N0YXRpYyBpbnQgcGt0X3JlbW92ZV9kZXYoZGV2X3QgcGt0X2RldikKIHsKIAlzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkOwogCWludCBpZHg7Ci0JZGV2X3QgcGt0X2RldiA9IG5ld19kZWNvZGVfZGV2KGN0cmxfY21kLT5wa3RfZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZjdGxfbXV0ZXgsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX1dSSVRFUlM7IGlkeCsrKSB7CiAJCXBkID0gcGt0X2RldnNbaWR4XTsKQEAgLTI1MjMsMTUgKzI5ODQsMjIgQEAKIAl9CiAJaWYgKGlkeCA9PSBNQVhfV1JJVEVSUykgewogCQlEUFJJTlRLKERSSVZFUl9OQU1FIjogZGV2IG5vdCBzZXR1cFxuIik7Ci0JCXJldHVybiAtRU5YSU87CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHBkLT5yZWZjbnQgPiAwKQotCQlyZXR1cm4gLUVCVVNZOwotCisJaWYgKHBkLT5yZWZjbnQgPiAwKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQogCWlmICghSVNfRVJSKHBkLT5jZHJ3LnRocmVhZCkpCiAJCWt0aHJlYWRfc3RvcChwZC0+Y2Rydy50aHJlYWQpOwogCisJcGt0X2RldnNbaWR4XSA9IE5VTEw7CisKKwlwa3RfZGVidWdmc19kZXZfcmVtb3ZlKHBkKTsKKwlwa3Rfc3lzZnNfZGV2X3JlbW92ZShwZCk7CisKIAlibGtkZXZfcHV0KHBkLT5iZGV2KTsKIAogCXJlbW92ZV9wcm9jX2VudHJ5KHBkLT5uYW1lLCBwa3RfcHJvYyk7CkBAIC0yNTQxLDE4ICszMDA5LDI0IEBACiAJYmxrX2NsZWFudXBfcXVldWUocGQtPmRpc2stPnF1ZXVlKTsKIAlwdXRfZGlzayhwZC0+ZGlzayk7CiAKLQlwa3RfZGV2c1tpZHhdID0gTlVMTDsKIAltZW1wb29sX2Rlc3Ryb3kocGQtPnJiX3Bvb2wpOwogCWtmcmVlKHBkKTsKIAogCS8qIFRoaXMgaXMgc2FmZTogb3BlbigpIGlzIHN0aWxsIGhvbGRpbmcgYSByZWZlcmVuY2UuICovCiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JcmV0dXJuIDA7CisKK291dDoKKwltdXRleF91bmxvY2soJmN0bF9tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgcGt0X2dldF9zdGF0dXMoc3RydWN0IHBrdF9jdHJsX2NvbW1hbmQgKmN0cmxfY21kKQogewotCXN0cnVjdCBwa3RjZHZkX2RldmljZSAqcGQgPSBwa3RfZmluZF9kZXZfZnJvbV9taW5vcihjdHJsX2NtZC0+ZGV2X2luZGV4KTsKKwlzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UgKnBkOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJmN0bF9tdXRleCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCisJcGQgPSBwa3RfZmluZF9kZXZfZnJvbV9taW5vcihjdHJsX2NtZC0+ZGV2X2luZGV4KTsKIAlpZiAocGQpIHsKIAkJY3RybF9jbWQtPmRldiA9IG5ld19lbmNvZGVfZGV2KHBkLT5iZGV2LT5iZF9kZXYpOwogCQljdHJsX2NtZC0+cGt0X2RldiA9IG5ld19lbmNvZGVfZGV2KHBkLT5wa3RfZGV2KTsKQEAgLTI1NjEsNiArMzAzNSw4IEBACiAJCWN0cmxfY21kLT5wa3RfZGV2ID0gMDsKIAl9CiAJY3RybF9jbWQtPm51bV9kZXZpY2VzID0gTUFYX1dSSVRFUlM7CisKKwltdXRleF91bmxvY2soJmN0bF9tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgcGt0X2N0bF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCkBAIC0yNTY4LDYgKzMwNDQsNyBAQAogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCXN0cnVjdCBwa3RfY3RybF9jb21tYW5kIGN0cmxfY21kOwogCWludCByZXQgPSAwOworCWRldl90IHBrdF9kZXYgPSAwOwogCiAJaWYgKGNtZCAhPSBQQUNLRVRfQ1RSTF9DTUQpCiAJCXJldHVybiAtRU5PVFRZOwpAQCAtMjU3OSwyMSArMzA1NiwxNiBAQAogCWNhc2UgUEtUX0NUUkxfQ01EX1NFVFVQOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwotCQltdXRleF9sb2NrX25lc3RlZCgmY3RsX211dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7Ci0JCXJldCA9IHBrdF9zZXR1cF9kZXYoJmN0cmxfY21kKTsKLQkJbXV0ZXhfdW5sb2NrKCZjdGxfbXV0ZXgpOworCQlyZXQgPSBwa3Rfc2V0dXBfZGV2KG5ld19kZWNvZGVfZGV2KGN0cmxfY21kLmRldiksICZwa3RfZGV2KTsKKwkJY3RybF9jbWQucGt0X2RldiA9IG5ld19lbmNvZGVfZGV2KHBrdF9kZXYpOwogCQlicmVhazsKIAljYXNlIFBLVF9DVFJMX0NNRF9URUFSRE9XTjoKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKLQkJbXV0ZXhfbG9ja19uZXN0ZWQoJmN0bF9tdXRleCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwotCQlyZXQgPSBwa3RfcmVtb3ZlX2RldigmY3RybF9jbWQpOwotCQltdXRleF91bmxvY2soJmN0bF9tdXRleCk7CisJCXJldCA9IHBrdF9yZW1vdmVfZGV2KG5ld19kZWNvZGVfZGV2KGN0cmxfY21kLnBrdF9kZXYpKTsKIAkJYnJlYWs7CiAJY2FzZSBQS1RfQ1RSTF9DTURfU1RBVFVTOgotCQltdXRleF9sb2NrX25lc3RlZCgmY3RsX211dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAJCXBrdF9nZXRfc3RhdHVzKCZjdHJsX2NtZCk7Ci0JCW11dGV4X3VubG9jaygmY3RsX211dGV4KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UVFk7CkBAIC0yNjIwLDYgKzMwOTIsOCBAQAogewogCWludCByZXQ7CiAKKwltdXRleF9pbml0KCZjdGxfbXV0ZXgpOworCiAJcHNkX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9rbWFsbG9jX3Bvb2woUFNEX1BPT0xfU0laRSwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBwYWNrZXRfc3RhY2tlZF9kYXRhKSk7CiAJaWYgKCFwc2RfcG9vbCkKQEAgLTI2MzMsMTggKzMxMDcsMjUgQEAKIAlpZiAoIXBrdGRldl9tYWpvcikKIAkJcGt0ZGV2X21ham9yID0gcmV0OwogCisJcmV0ID0gcGt0X3N5c2ZzX2luaXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXBrdF9kZWJ1Z2ZzX2luaXQoKTsKKwogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnBrdF9taXNjKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhEUklWRVJfTkFNRSI6IFVuYWJsZSB0byByZWdpc3RlciBtaXNjIGRldmljZVxuIik7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9taXNjOwogCX0KIAotCW11dGV4X2luaXQoJmN0bF9tdXRleCk7Ci0KIAlwa3RfcHJvYyA9IHByb2NfbWtkaXIoRFJJVkVSX05BTUUsIHByb2Nfcm9vdF9kcml2ZXIpOwogCiAJcmV0dXJuIDA7CiAKK291dF9taXNjOgorCXBrdF9kZWJ1Z2ZzX2NsZWFudXAoKTsKKwlwa3Rfc3lzZnNfY2xlYW51cCgpOwogb3V0OgogCXVucmVnaXN0ZXJfYmxrZGV2KHBrdGRldl9tYWpvciwgRFJJVkVSX05BTUUpOwogb3V0MjoKQEAgLTI2NTYsNiArMzEzNywxMCBAQAogewogCXJlbW92ZV9wcm9jX2VudHJ5KERSSVZFUl9OQU1FLCBwcm9jX3Jvb3RfZHJpdmVyKTsKIAltaXNjX2RlcmVnaXN0ZXIoJnBrdF9taXNjKTsKKworCXBrdF9kZWJ1Z2ZzX2NsZWFudXAoKTsKKwlwa3Rfc3lzZnNfY2xlYW51cCgpOworCiAJdW5yZWdpc3Rlcl9ibGtkZXYocGt0ZGV2X21ham9yLCBEUklWRVJfTkFNRSk7CiAJbWVtcG9vbF9kZXN0cm95KHBzZF9wb29sKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcmQuYyBiL2RyaXZlcnMvYmxvY2svcmQuYwppbmRleCBhM2Y2NGJmLi40ODVhYTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JkLmMKKysrIGIvZHJpdmVycy9ibG9jay9yZC5jCkBAIC00MzIsNiArNDMyLDEyIEBACiAJCXJkX2Rpc2tzW2ldID0gYWxsb2NfZGlzaygxKTsKIAkJaWYgKCFyZF9kaXNrc1tpXSkKIAkJCWdvdG8gb3V0OworCisJCXJkX3F1ZXVlW2ldID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOworCQlpZiAoIXJkX3F1ZXVlW2ldKSB7CisJCQlwdXRfZGlzayhyZF9kaXNrc1tpXSk7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCWlmIChyZWdpc3Rlcl9ibGtkZXYoUkFNRElTS19NQUpPUiwgInJhbWRpc2siKSkgewpAQCAtNDQyLDEwICs0NDgsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ7IGkrKykgewogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHJkX2Rpc2tzW2ldOwogCi0JCXJkX3F1ZXVlW2ldID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwotCQlpZiAoIXJkX3F1ZXVlW2ldKQotCQkJZ290byBvdXRfcXVldWU7Ci0KIAkJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChyZF9xdWV1ZVtpXSwgJnJkX21ha2VfcmVxdWVzdCk7CiAJCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHJkX3F1ZXVlW2ldLCByZF9ibG9ja3NpemUpOwogCkBAIC00NjYsOCArNDY4LDYgQEAKIAkJQ09ORklHX0JMS19ERVZfUkFNX0NPVU5ULCByZF9zaXplLCByZF9ibG9ja3NpemUpOwogCiAJcmV0dXJuIDA7Ci1vdXRfcXVldWU6Ci0JdW5yZWdpc3Rlcl9ibGtkZXYoUkFNRElTS19NQUpPUiwgInJhbWRpc2siKTsKIG91dDoKIAl3aGlsZSAoaS0tKSB7CiAJCXB1dF9kaXNrKHJkX2Rpc2tzW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3dpbV9pb3AuYyBiL2RyaXZlcnMvYmxvY2svc3dpbV9pb3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3YjA2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Jsb2NrL3N3aW1faW9wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgdGhlIFNXSU0gKFN1cGVyIFdveiBJbnRlZ3JhdGVkIE1hY2hpbmUpIElPUAotICogZmxvcHB5IGNvbnRyb2xsZXIgb24gdGhlIE1hY2ludG9zaCBJSWZ4IGFuZCBRdWFkcmEgOTAwLzk1MAotICoKLSAqIFdyaXR0ZW4gYnkgSm9zaHVhIE0uIFRob21wc29uIChmdW5haG9AanVyYWkub3JnKQotICogYmFzZWQgb24gdGhlIFNXSU0zIGRyaXZlciAoYykgMTk5NiBieSBQYXVsIE1hY2tlcnJhcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIDE5OTktMDYtMTIgKGptdCkgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uLgotICovCi0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBUaGVvcnkgb2YgT3BlcmF0aW9uCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogU2luY2UgdGhlIFNXSU0gSU9QIGlzIG1lc3NhZ2UtZHJpdmVuIHdlIGltcGxlbWVudCBhIHNpbXBsZSByZXF1ZXN0IHF1ZXVlCi0gKiBzeXN0ZW0uICBPbmUgb3V0c3RhbmRpbmcgcmVxdWVzdCBtYXkgYmUgcXVldWVkIGF0IGFueSBnaXZlbiB0aW1lICh0aGlzIGlzCi0gKiBhbiBJT1AgbGltaXRhdGlvbik7IG9ubHkgd2hlbiB0aGF0IHJlcXVlc3QgaGFzIGNvbXBsZXRlZCBjYW4gYSBuZXcgcmVxdWVzdAotICogYmUgc2VudC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY19pb3AuaD4KLSNpbmNsdWRlIDxhc20vc3dpbV9pb3AuaD4KLQotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiVmVyc2lvbiAwLjEgKDE5OTktMDYtMTIpIgotCi0jZGVmaW5lIE1BWF9GTE9QUElFUwk0Ci0KLWVudW0gc3dpbV9zdGF0ZSB7Ci0JaWRsZSwKLQlhdmFpbGFibGUsCi0JcmV2YWxpZGF0aW5nLAotCXRyYW5zZmVycmluZywKLQllamVjdGluZwotfTsKLQotc3RydWN0IGZsb3BweV9zdGF0ZSB7Ci0JZW51bSBzd2ltX3N0YXRlIHN0YXRlOwotCWludAlkcml2ZV9udW07CS8qIGRldmljZSBudW1iZXIgKi8KLQlpbnQJc2VjcGVyY3lsOwkvKiBkaXNrIGdlb21ldHJ5IGluZm9ybWF0aW9uICovCi0JaW50CXNlY3BlcnRyYWNrOwotCWludAl0b3RhbF9zZWNzOwotCWludAl3cml0ZV9wcm90OwkvKiAxIGlmIHdyaXRlLXByb3RlY3RlZCwgMCBpZiBub3QsIC0xIGR1bm5vICovCi0JaW50CXJlZl9jb3VudDsKLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OwotCWludAllamVjdGVkOwotCXN0cnVjdCB3YWl0X3F1ZXVlICp3YWl0OwotCWludAl3YW50ZWQ7Ci0JaW50CXRpbWVvdXRfcGVuZGluZzsKLX07Ci0KLXN0cnVjdCBzd2ltX2lvcF9yZXEgewotCWludAlzZW50OwotCWludAljb21wbGV0ZTsKLQlfX3U4CWNvbW1hbmRbMzJdOwotCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzOwotCXZvaWQJKCpkb25lKShzdHJ1Y3Qgc3dpbV9pb3BfcmVxICopOwotfTsKLQotc3RhdGljIHN0cnVjdCBzd2ltX2lvcF9yZXEgKmN1cnJlbnRfcmVxOwotc3RhdGljIGludCBmbG9wcHlfY291bnQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmxvcHB5X3N0YXRlIGZsb3BweV9zdGF0ZXNbTUFYX0ZMT1BQSUVTXTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dpbV9pb3BfbG9jayk7Ci0KLSNkZWZpbmUgQ1VSUkVOVCBlbHZfbmV4dF9yZXF1ZXN0KHN3aW1fcXVldWUpCi0KLXN0YXRpYyBjaGFyICpkcml2ZV9uYW1lc1s3XSA9IHsKLQkibm90IGluc3RhbGxlZCIsCS8qIERSVl9OT05FICAgICovCi0JInVua25vd24gKDEpIiwJCS8qIERSVl9VTktOT1dOICovCi0JImEgNDAwSyBkcml2ZSIsCQkvKiBEUlZfNDAwSyAgICAqLwotCSJhbiA4MDBLIGRyaXZlIgkJLyogRFJWXzgwMEsgICAgKi8KLQkidW5rbm93biAoNCkiLAkJLyogPz8/PyAgICAgICAgKi8KLQkiYW4gRkRIRCIsCQkvKiBEUlZfRkRIRCAgICAqLwotCSJ1bmtub3duICg2KSIsCQkvKiA/Pz8/ICAgICAgICAqLwotCSJhbiBBcHBsZSBIRDIwIgkJLyogRFJWX0hEMjAgICAgKi8KLX07Ci0KLWludCBzd2ltaW9wX2luaXQodm9pZCk7Ci1zdGF0aWMgdm9pZCBzd2ltaW9wX2luaXRfcmVxdWVzdChzdHJ1Y3Qgc3dpbV9pb3BfcmVxICopOwotc3RhdGljIGludCBzd2ltaW9wX3NlbmRfcmVxdWVzdChzdHJ1Y3Qgc3dpbV9pb3BfcmVxICopOwotc3RhdGljIHZvaWQgc3dpbWlvcF9yZWNlaXZlKHN0cnVjdCBpb3BfbXNnICopOwotc3RhdGljIHZvaWQgc3dpbWlvcF9zdGF0dXNfdXBkYXRlKGludCwgc3RydWN0IHN3aW1fZHJ2c3RhdHVzICopOwotc3RhdGljIGludCBzd2ltaW9wX2VqZWN0KHN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzKTsKLQotc3RhdGljIGludCBmbG9wcHlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIHBhcmFtKTsKLXN0YXRpYyBpbnQgZmxvcHB5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIGludCBmbG9wcHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgaW50IGZsb3BweV9jaGVja19jaGFuZ2Uoc3RydWN0IGdlbmRpc2sgKmRpc2spOwotc3RhdGljIGludCBmbG9wcHlfcmV2YWxpZGF0ZShzdHJ1Y3QgZ2VuZGlzayAqZGlzayk7Ci1zdGF0aWMgaW50IGdyYWJfZHJpdmUoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGVudW0gc3dpbV9zdGF0ZSBzdGF0ZSwKLQkJICAgICAgaW50IGludGVycnVwdGlibGUpOwotc3RhdGljIHZvaWQgcmVsZWFzZV9kcml2ZShzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyk7Ci1zdGF0aWMgdm9pZCBzZXRfdGltZW91dChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcywgaW50IG50aWNrcywKLQkJCXZvaWQgKCpwcm9jKSh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBmZF9yZXF1ZXN0X3RpbWVvdXQodW5zaWduZWQgbG9uZyk7Ci1zdGF0aWMgdm9pZCBkb19mZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqIHEpOwotc3RhdGljIHZvaWQgc3RhcnRfcmVxdWVzdChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgZmxvcHB5X2ZvcHMgPSB7Ci0JLm9wZW4JCT0gZmxvcHB5X29wZW4sCi0JLnJlbGVhc2UJPSBmbG9wcHlfcmVsZWFzZSwKLQkuaW9jdGwJCT0gZmxvcHB5X2lvY3RsLAotCS5tZWRpYV9jaGFuZ2VkCT0gZmxvcHB5X2NoZWNrX2NoYW5nZSwKLQkucmV2YWxpZGF0ZV9kaXNrPSBmbG9wcHlfcmV2YWxpZGF0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqc3dpbV9xdWV1ZTsKLS8qCi0gKiBTV0lNIElPUCBpbml0aWFsaXphdGlvbgotICovCi0KLWludCBzd2ltaW9wX2luaXQodm9pZCkKLXsKLQl2b2xhdGlsZSBzdHJ1Y3Qgc3dpbV9pb3BfcmVxIHJlcTsKLQlzdHJ1Y3Qgc3dpbWNtZF9zdGF0dXMgKmNtZCA9IChzdHJ1Y3Qgc3dpbWNtZF9zdGF0dXMgKikgJnJlcS5jb21tYW5kWzBdOwotCXN0cnVjdCBzd2ltX2RydnN0YXR1cyAqZHMgPSAmY21kLT5zdGF0dXM7Ci0Jc3RydWN0IGZsb3BweV9zdGF0ZSAqZnM7Ci0JaW50IGk7Ci0KLQljdXJyZW50X3JlcSA9IE5VTEw7Ci0JZmxvcHB5X2NvdW50ID0gMDsKLQotCWlmICghaW9wX2lzbV9wcmVzZW50KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChyZWdpc3Rlcl9ibGtkZXYoRkxPUFBZX01BSk9SLCAiZmQiKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXN3aW1fcXVldWUgPSBibGtfaW5pdF9xdWV1ZShkb19mZF9yZXF1ZXN0LCAmc3dpbV9pb3BfbG9jayk7Ci0JaWYgKCFzd2ltX3F1ZXVlKSB7Ci0JCXVucmVnaXN0ZXJfYmxrZGV2KEZMT1BQWV9NQUpPUiwgImZkIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXByaW50aygiU1dJTS1JT1A6ICVzIGJ5IEpvc2h1YSBNLiBUaG9tcHNvbiAoZnVuYWhvQGp1cmFpLm9yZylcbiIsCi0JCURSSVZFUl9WRVJTSU9OKTsKLQotCWlmIChpb3BfbGlzdGVuKFNXSU1fSU9QLCBTV0lNX0NIQU4sIHN3aW1pb3BfcmVjZWl2ZSwgIlNXSU0iKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1dJTS1JT1A6IElPUCBjaGFubmVsIGFscmVhZHkgaW4gdXNlOyBjYW4ndCBpbml0aWFsaXplLlxuIik7Ci0JCXVucmVnaXN0ZXJfYmxrZGV2KEZMT1BQWV9NQUpPUiwgImZkIik7Ci0JCWJsa19jbGVhbnVwX3F1ZXVlKHN3aW1fcXVldWUpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXByaW50ayhLRVJOX0VSUiAiU1dJTV9JT1A6IHByb2JpbmcgZm9yIGluc3RhbGxlZCBkcml2ZXMuXG4iKTsKLQotCWZvciAoaSA9IDAgOyBpIDwgTUFYX0ZMT1BQSUVTIDsgaSsrKSB7Ci0JCW1lbXNldCgmZmxvcHB5X3N0YXRlc1tpXSwgMCwgc2l6ZW9mKHN0cnVjdCBmbG9wcHlfc3RhdGUpKTsKLQkJZnMgPSAmZmxvcHB5X3N0YXRlc1tmbG9wcHlfY291bnRdOwotCi0JCXN3aW1pb3BfaW5pdF9yZXF1ZXN0KCZyZXEpOwotCQljbWQtPmNvZGUgPSBDTURfU1RBVFVTOwotCQljbWQtPmRyaXZlX251bSA9IGkgKyAxOwotCQlpZiAoc3dpbWlvcF9zZW5kX3JlcXVlc3QoJnJlcSkgIT0gMCkgY29udGludWU7Ci0JCXdoaWxlICghcmVxLmNvbXBsZXRlKTsKLQkJaWYgKGNtZC0+ZXJyb3IgIT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTV0lNLUlPUDogcHJvYmUgb24gZHJpdmUgJWQgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIGksICh1aW50KSBjbWQtPmVycm9yKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChkcy0+aW5zdGFsbGVkICE9IDB4MDEpIGNvbnRpbnVlOwotCQlwcmludGsoIlNXSU0tSU9QOiBkcml2ZSAlZCBpcyAlcyAoJXMsICVzLCAlcywgJXMpXG4iLCBpLAotCQkJZHJpdmVfbmFtZXNbZHMtPmluZm8udHlwZV0sCi0JCQlkcy0+aW5mby5leHRlcm5hbD8gImV4dCIgOiAiaW50IiwKLQkJCWRzLT5pbmZvLnNjc2k/ICJzY3NpIiA6ICJmbG9wcHkiLAotCQkJZHMtPmluZm8uZml4ZWQ/ICJmaXhlZCIgOiAicmVtb3ZhYmxlIiwKLQkJCWRzLT5pbmZvLnNlY29uZGFyeT8gInNlY29uZGFyeSIgOiAicHJpbWFyeSIpOwotCQlzd2ltaW9wX3N0YXR1c191cGRhdGUoZmxvcHB5X2NvdW50LCBkcyk7Ci0JCWZzLT5zdGF0ZSA9IGlkbGU7Ci0KLQkJaW5pdF90aW1lcigmZnMtPnRpbWVvdXQpOwotCQlmbG9wcHlfY291bnQrKzsKLQl9Ci0JcHJpbnRrKCJTV0lNLUlPUDogZGV0ZWN0ZWQgJWQgaW5zdGFsbGVkIGRyaXZlcy5cbiIsIGZsb3BweV9jb3VudCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZmxvcHB5X2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBhbGxvY19kaXNrKDEpOwotCQlpZiAoIWRpc2spCi0JCQljb250aW51ZTsKLQkJZGlzay0+bWFqb3IgPSBGTE9QUFlfTUFKT1I7Ci0JCWRpc2stPmZpcnN0X21pbm9yID0gaTsKLQkJZGlzay0+Zm9wcyA9ICZmbG9wcHlfZm9wczsKLQkJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJmZCVkIiwgaSk7Ci0JCWRpc2stPnByaXZhdGVfZGF0YSA9ICZmbG9wcHlfc3RhdGVzW2ldOwotCQlkaXNrLT5xdWV1ZSA9IHN3aW1fcXVldWU7Ci0JCXNldF9jYXBhY2l0eShkaXNrLCAyODgwICogMik7Ci0JCWFkZF9kaXNrKGRpc2spOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzd2ltaW9wX2luaXRfcmVxdWVzdChzdHJ1Y3Qgc3dpbV9pb3BfcmVxICpyZXEpCi17Ci0JcmVxLT5zZW50ID0gMDsKLQlyZXEtPmNvbXBsZXRlID0gMDsKLQlyZXEtPmRvbmUgPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IHN3aW1pb3Bfc2VuZF9yZXF1ZXN0KHN0cnVjdCBzd2ltX2lvcF9yZXEgKnJlcSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnI7Ci0KLQkvKiBJdCdzIGRvdWJ0ZnVsIGFuIGludGVycnVwdCByb3V0aW5lIHdvdWxkIHRyeSB0byBzZW5kICovCi0JLyogYSBTV0lNIHJlcXVlc3QsIGJ1dCBJJ2QgcmF0aGVyIHBsYXkgaXQgc2FmZSBoZXJlLiAgICAqLwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JaWYgKGN1cnJlbnRfcmVxICE9IE5VTEwpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQljdXJyZW50X3JlcSA9IHJlcTsKLQotCS8qIEludGVycnVwdHMgc2hvdWxkIGJlIGJhY2sgb24gZm9yIGlvcF9zZW5kX21lc3NhZ2UoKSAqLwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JZXJyID0gaW9wX3NlbmRfbWVzc2FnZShTV0lNX0lPUCwgU1dJTV9DSEFOLCAodm9pZCAqKSByZXEsCi0JCQkJc2l6ZW9mKHJlcS0+Y29tbWFuZCksIChfX3U4ICopICZyZXEtPmNvbW1hbmRbMF0sCi0JCQkJc3dpbWlvcF9yZWNlaXZlKTsKLQotCS8qIE5vIHJhY2UgY29uZGl0aW9uIGhlcmU7IHdlIG93biBjdXJyZW50X3JlcSBhdCB0aGlzIHBvaW50ICovCi0KLQlpZiAoZXJyKSB7Ci0JCWN1cnJlbnRfcmVxID0gTlVMTDsKLQl9IGVsc2UgewotCQlyZXEtPnNlbnQgPSAxOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogUmVjZWl2ZSBhIFNXSU0gbWVzc2FnZSBmcm9tIHRoZSBJT1AuCi0gKgotICogVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiB0d28gY2FzZXM6Ci0gKgotICogMS4gQSBtZXNzYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50IHRvIHRoZSBJT1AuCi0gKiAyLiBBbiB1bnNvbGljaXRlZCBtZXNzYWdlIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBJT1AuCi0gKi8KLQotdm9pZCBzd2ltaW9wX3JlY2VpdmUoc3RydWN0IGlvcF9tc2cgKm1zZykKLXsKLQlzdHJ1Y3Qgc3dpbV9pb3BfcmVxICpyZXE7Ci0Jc3RydWN0IHN3aW1tc2dfc3RhdHVzICpzbTsKLQlzdHJ1Y3Qgc3dpbV9kcnZzdGF0dXMgKmRzOwotCi0JcmVxID0gY3VycmVudF9yZXE7Ci0KLQlzd2l0Y2gobXNnLT5zdGF0dXMpIHsKLQkJY2FzZSBJT1BfTVNHU1RBVFVTX0NPTVBMRVRFOgotCQkJbWVtY3B5KCZyZXEtPmNvbW1hbmRbMF0sICZtc2ctPnJlcGx5WzBdLCBzaXplb2YocmVxLT5jb21tYW5kKSk7Ci0JCQlyZXEtPmNvbXBsZXRlID0gMTsKLQkJCWlmIChyZXEtPmRvbmUpICgqcmVxLT5kb25lKShyZXEpOwotCQkJY3VycmVudF9yZXEgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU9QX01TR1NUQVRVU19VTlNPTDoKLQkJCXNtID0gKHN0cnVjdCBzd2ltbXNnX3N0YXR1cyAqKSAmbXNnLT5tZXNzYWdlWzBdOwotCQkJZHMgPSAmc20tPnN0YXR1czsKLQkJCXN3aW1pb3Bfc3RhdHVzX3VwZGF0ZShzbS0+ZHJpdmVfbnVtLCBkcyk7Ci0JCQlpb3BfY29tcGxldGVfbWVzc2FnZShtc2cpOwotCQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzd2ltaW9wX3N0YXR1c191cGRhdGUoaW50IGRyaXZlX251bSwgc3RydWN0IHN3aW1fZHJ2c3RhdHVzICpkcykKLXsKLQlzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyA9ICZmbG9wcHlfc3RhdGVzW2RyaXZlX251bV07Ci0KLQlmcy0+d3JpdGVfcHJvdCA9IChkcy0+d3JpdGVfcHJvdCA9PSAweDgwKTsKLQlpZiAoKGRzLT5kaXNrX2luX2RyaXZlICE9IDB4MDEpICYmIChkcy0+ZGlza19pbl9kcml2ZSAhPSAweDAyKSkgewotCQlmcy0+ZWplY3RlZCA9IDE7Ci0JfSBlbHNlIHsKLQkJZnMtPmVqZWN0ZWQgPSAwOwotCX0KLQlzd2l0Y2goZHMtPmluZm8udHlwZSkgewotCQljYXNlIERSVl80MDBLOgotCQkJZnMtPnNlY3BlcmN5bCA9IDEwOwotCQkJZnMtPnNlY3BlcnRyYWNrID0gMTA7Ci0JCQlmcy0+dG90YWxfc2VjcyA9IDgwMDsKLQkJCWJyZWFrOwotCQljYXNlIERSVl84MDBLOgotCQkJZnMtPnNlY3BlcmN5bCA9IDIwOwotCQkJZnMtPnNlY3BlcnRyYWNrID0gMTA7Ci0JCQlmcy0+dG90YWxfc2VjcyA9IDE2MDA7Ci0JCQlicmVhazsKLQkJY2FzZSBEUlZfRkRIRDoKLQkJCWZzLT5zZWNwZXJjeWwgPSAzNjsKLQkJCWZzLT5zZWNwZXJ0cmFjayA9IDE4OwotCQkJZnMtPnRvdGFsX3NlY3MgPSAyODgwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmcy0+c2VjcGVyY3lsID0gMDsKLQkJCWZzLT5zZWNwZXJ0cmFjayA9IDA7Ci0JCQlmcy0+dG90YWxfc2VjcyA9IDA7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgc3dpbWlvcF9lamVjdChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcykKLXsKLQlpbnQgZXJyLCBuOwotCXN0cnVjdCBzd2ltX2lvcF9yZXEgcmVxOwotCXN0cnVjdCBzd2ltY21kX2VqZWN0ICpjbWQgPSAoc3RydWN0IHN3aW1jbWRfZWplY3QgKikgJnJlcS5jb21tYW5kWzBdOwotCi0JZXJyID0gZ3JhYl9kcml2ZShmcywgZWplY3RpbmcsIDEpOwotCWlmIChlcnIpIHJldHVybiBlcnI7Ci0KLQlzd2ltaW9wX2luaXRfcmVxdWVzdCgmcmVxKTsKLQljbWQtPmNvZGUgPSBDTURfRUpFQ1Q7Ci0JY21kLT5kcml2ZV9udW0gPSBmcy0+ZHJpdmVfbnVtOwotCWVyciA9IHN3aW1pb3Bfc2VuZF9yZXF1ZXN0KCZyZXEpOwotCWlmIChlcnIpIHsKLQkJcmVsZWFzZV9kcml2ZShmcyk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCWZvciAobiA9IDIqSFo7IG4gPiAwOyAtLW4pIHsKLQkJaWYgKHJlcS5jb21wbGV0ZSkgYnJlYWs7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJZXJyID0gLUVJTlRSOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwotCX0KLQlyZWxlYXNlX2RyaXZlKGZzKTsKLQlyZXR1cm4gY21kLT5lcnJvcjsKLX0KLQotc3RhdGljIHN0cnVjdCBmbG9wcHlfc3RydWN0IGZsb3BweV90eXBlID0KLQl7IDI4ODAsMTgsMiw4MCwwLDB4MUIsMHgwMCwweENGLDB4NkMsTlVMTCB9OwkvKiAgNyAxLjQ0TUIgMy41IiAgICovCi0KLXN0YXRpYyBpbnQgZmxvcHB5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBwYXJhbSkKLXsKLQlzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKLQlpbnQgZXJyOwotCi0JaWYgKChjbWQgJiAweDgwKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBGREVKRUNUOgotCQlpZiAoZnMtPnJlZl9jb3VudCAhPSAxKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJZXJyID0gc3dpbWlvcF9lamVjdChmcyk7Ci0JCXJldHVybiBlcnI7Ci0JY2FzZSBGREdFVFBSTToKLQkgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgcGFyYW0sICh2b2lkICopICZmbG9wcHlfdHlwZSwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBmbG9wcHlfc3RydWN0KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRU5PVFRZOwotfQotCi1zdGF0aWMgaW50IGZsb3BweV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGZzLT5yZWZfY291bnQgPT0gLTEgfHwgZmlscC0+Zl9mbGFncyAmIE9fRVhDTCkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTkRFTEFZKSA9PSAwICYmIChmaWxwLT5mX21vZGUgJiAzKSkgewotCQljaGVja19kaXNrX2NoYW5nZShpbm9kZS0+aV9iZGV2KTsKLQkJaWYgKGZzLT5lamVjdGVkKQotCQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlpZiAoKGZpbHAtPmZfbW9kZSAmIDIpICYmIGZzLT53cml0ZV9wcm90KQotCQlyZXR1cm4gLUVST0ZTOwotCi0JaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0VYQ0wpCi0JCWZzLT5yZWZfY291bnQgPSAtMTsKLQllbHNlCi0JCSsrZnMtPnJlZl9jb3VudDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZsb3BweV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCWlmIChmcy0+cmVmX2NvdW50ID4gMCkKLQkJZnMtPnJlZl9jb3VudC0tOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZsb3BweV9jaGVja19jaGFuZ2Uoc3RydWN0IGdlbmRpc2sgKmRpc2spCi17Ci0Jc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMgPSBkaXNrLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIGZzLT5lamVjdGVkOwotfQotCi1zdGF0aWMgaW50IGZsb3BweV9yZXZhbGlkYXRlKHN0cnVjdCBnZW5kaXNrICpkaXNrKQotewotCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzID0gZGlzay0+cHJpdmF0ZV9kYXRhOwotCWdyYWJfZHJpdmUoZnMsIHJldmFsaWRhdGluZywgMCk7Ci0JLyogeWFkZGEsIHlhZGRhICovCi0JcmVsZWFzZV9kcml2ZShmcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsb3BweV9vZmYodW5zaWduZWQgaW50IG5yKQotewotfQotCi1zdGF0aWMgaW50IGdyYWJfZHJpdmUoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGVudW0gc3dpbV9zdGF0ZSBzdGF0ZSwKLQkJICAgICAgaW50IGludGVycnVwdGlibGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoZnMtPnN0YXRlICE9IGlkbGUpIHsKLQkJKytmcy0+d2FudGVkOwotCQl3aGlsZSAoZnMtPnN0YXRlICE9IGF2YWlsYWJsZSkgewotCQkJaWYgKGludGVycnVwdGlibGUgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQktLWZzLT53YW50ZWQ7Ci0JCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkJCXJldHVybiAtRUlOVFI7Ci0JCQl9Ci0JCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZmcy0+d2FpdCk7Ci0JCX0KLQkJLS1mcy0+d2FudGVkOwotCX0KLQlmcy0+c3RhdGUgPSBzdGF0ZTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfZHJpdmUoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlmcy0+c3RhdGUgPSBpZGxlOwotCXN0YXJ0X3JlcXVlc3QoZnMpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3RpbWVvdXQoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGludCBudGlja3MsCi0JCQl2b2lkICgqcHJvYykodW5zaWduZWQgbG9uZykpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoZnMtPnRpbWVvdXRfcGVuZGluZykKLQkJZGVsX3RpbWVyKCZmcy0+dGltZW91dCk7Ci0JaW5pdF90aW1lcigmZnMtPnRpbWVvdXQpOwotCWZzLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgbnRpY2tzOwotCWZzLT50aW1lb3V0LmZ1bmN0aW9uID0gcHJvYzsKLQlmcy0+dGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGZzOwotCWFkZF90aW1lcigmZnMtPnRpbWVvdXQpOwotCWZzLT50aW1lb3V0X3BlbmRpbmcgPSAxOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQotewotCWludCBpOwotCi0JZm9yIChpID0gMCA7IGkgPCBmbG9wcHlfY291bnQgOyBpKyspIHsKLQkJc3RhcnRfcmVxdWVzdCgmZmxvcHB5X3N0YXRlc1tpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmZF9yZXF1ZXN0X2NvbXBsZXRlKHN0cnVjdCBzd2ltX2lvcF9yZXEgKnJlcSkKLXsKLQlzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyA9IHJlcS0+ZnM7Ci0Jc3RydWN0IHN3aW1jbWRfcncgKmNtZCA9IChzdHJ1Y3Qgc3dpbWNtZF9ydyAqKSAmcmVxLT5jb21tYW5kWzBdOwotCi0JZGVsX3RpbWVyKCZmcy0+dGltZW91dCk7Ci0JZnMtPnRpbWVvdXRfcGVuZGluZyA9IDA7Ci0JZnMtPnN0YXRlID0gaWRsZTsKLQlpZiAoY21kLT5lcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgIlNXSU0tSU9QOiBlcnJvciAlZCBvbiByZWFkL3dyaXRlIHJlcXVlc3QuXG4iLCBjbWQtPmVycm9yKTsKLQkJZW5kX3JlcXVlc3QoQ1VSUkVOVCwgMCk7Ci0JfSBlbHNlIHsKLQkJQ1VSUkVOVC0+c2VjdG9yICs9IGNtZC0+bnVtX2Jsb2NrczsKLQkJQ1VSUkVOVC0+Y3VycmVudF9ucl9zZWN0b3JzIC09IGNtZC0+bnVtX2Jsb2NrczsKLQkJaWYgKENVUlJFTlQtPmN1cnJlbnRfbnJfc2VjdG9ycyA8PSAwKSB7Ci0JCQllbmRfcmVxdWVzdChDVVJSRU5ULCAxKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlzdGFydF9yZXF1ZXN0KGZzKTsKLX0KLQotc3RhdGljIHZvaWQgZmRfcmVxdWVzdF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyA9IChzdHJ1Y3QgZmxvcHB5X3N0YXRlICopIGRhdGE7Ci0KLQlmcy0+dGltZW91dF9wZW5kaW5nID0gMDsKLQllbmRfcmVxdWVzdChDVVJSRU5ULCAwKTsKLQlmcy0+c3RhdGUgPSBpZGxlOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9yZXF1ZXN0KHN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzKQotewotCXZvbGF0aWxlIHN0cnVjdCBzd2ltX2lvcF9yZXEgcmVxOwotCXN0cnVjdCBzd2ltY21kX3J3ICpjbWQgPSAoc3RydWN0IHN3aW1jbWRfcncgKikgJnJlcS5jb21tYW5kWzBdOwotCi0JaWYgKGZzLT5zdGF0ZSA9PSBpZGxlICYmIGZzLT53YW50ZWQpIHsKLQkJZnMtPnN0YXRlID0gYXZhaWxhYmxlOwotCQl3YWtlX3VwKCZmcy0+d2FpdCk7Ci0JCXJldHVybjsKLQl9Ci0Jd2hpbGUgKENVUlJFTlQgJiYgZnMtPnN0YXRlID09IGlkbGUpIHsKLQkJaWYgKENVUlJFTlQtPmJoICYmICFidWZmZXJfbG9ja2VkKENVUlJFTlQtPmJoKSkKLQkJCXBhbmljKCJmbG9wcHk6IGJsb2NrIG5vdCBsb2NrZWQiKTsKLSNpZiAwCi0JCXByaW50aygiZG9fZmRfcmVxOiBkZXY9JXMgY21kPSVkIHNlYz0lbGQgbnJfc2VjPSVsZCBidWY9JXBcbiIsCi0JCSAgICAgICBDVVJSRU5ULT5ycV9kaXNrLT5kaXNrX25hbWUsIENVUlJFTlQtPmNtZCwKLQkJICAgICAgIENVUlJFTlQtPnNlY3RvciwgQ1VSUkVOVC0+bnJfc2VjdG9ycywgQ1VSUkVOVC0+YnVmZmVyKTsKLQkJcHJpbnRrKCIgICAgICAgICAgIGVycm9ycz0lZCBjdXJyZW50X25yX3NlY3RvcnM9JWxkXG4iLAotCQkgICAgICBDVVJSRU5ULT5lcnJvcnMsIENVUlJFTlQtPmN1cnJlbnRfbnJfc2VjdG9ycyk7Ci0jZW5kaWYKLQotCQlpZiAoQ1VSUkVOVC0+c2VjdG9yIDwgMCB8fCBDVVJSRU5ULT5zZWN0b3IgPj0gZnMtPnRvdGFsX3NlY3MpIHsKLQkJCWVuZF9yZXF1ZXN0KENVUlJFTlQsIDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKENVUlJFTlQtPmN1cnJlbnRfbnJfc2VjdG9ycyA9PSAwKSB7Ci0JCQllbmRfcmVxdWVzdChDVVJSRU5ULCAxKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChmcy0+ZWplY3RlZCkgewotCQkJZW5kX3JlcXVlc3QoQ1VSUkVOVCwgMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXN3aW1pb3BfaW5pdF9yZXF1ZXN0KCZyZXEpOwotCQlyZXEuZnMgPSBmczsKLQkJcmVxLmRvbmUgPSBmZF9yZXF1ZXN0X2NvbXBsZXRlOwotCi0JCWlmIChDVVJSRU5ULT5jbWQgPT0gV1JJVEUpIHsKLQkJCWlmIChmcy0+d3JpdGVfcHJvdCkgewotCQkJCWVuZF9yZXF1ZXN0KENVUlJFTlQsIDApOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY21kLT5jb2RlID0gQ01EX1dSSVRFOwotCQl9IGVsc2UgewotCQkJY21kLT5jb2RlID0gQ01EX1JFQUQ7Ci0KLQkJfQotCQljbWQtPmRyaXZlX251bSA9IGZzLT5kcml2ZV9udW07Ci0JCWNtZC0+YnVmZmVyID0gQ1VSUkVOVC0+YnVmZmVyOwotCQljbWQtPmZpcnN0X2Jsb2NrID0gQ1VSUkVOVC0+c2VjdG9yOwotCQljbWQtPm51bV9ibG9ja3MgPSBDVVJSRU5ULT5jdXJyZW50X25yX3NlY3RvcnM7Ci0KLQkJaWYgKHN3aW1pb3Bfc2VuZF9yZXF1ZXN0KCZyZXEpKSB7Ci0JCQllbmRfcmVxdWVzdChDVVJSRU5ULCAwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc2V0X3RpbWVvdXQoZnMsIEhaKkNVUlJFTlQtPmN1cnJlbnRfbnJfc2VjdG9ycywKLQkJCQlmZF9yZXF1ZXN0X3RpbWVvdXQpOwotCi0JCWZzLT5zdGF0ZSA9IHRyYW5zZmVycmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N4OC5jIGIvZHJpdmVycy9ibG9jay9zeDguYwppbmRleCA0N2Q2OTc1Li41NDUwOWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3N4OC5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3g4LmMKQEAgLTEyNDQsOSArMTI0NCwxMCBAQAogCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwogfQogCi1zdGF0aWMgdm9pZCBjYXJtX2ZzbV90YXNrICh2b2lkICpfZGF0YSkKK3N0YXRpYyB2b2lkIGNhcm1fZnNtX3Rhc2sgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgY2FybV9ob3N0ICpob3N0ID0gX2RhdGE7CisJc3RydWN0IGNhcm1faG9zdCAqaG9zdCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2FybV9ob3N0LCBmc21fdGFzayk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CiAJaW50IHJjLCBpLCBuZXh0X2RldjsKQEAgLTE2MTksNyArMTYyMCw3IEBACiAJaG9zdC0+cGRldiA9IHBkZXY7CiAJaG9zdC0+ZmxhZ3MgPSBwY2lfZGFjID8gRkxfREFDIDogMDsKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7Ci0JSU5JVF9XT1JLKCZob3N0LT5mc21fdGFzaywgY2FybV9mc21fdGFzaywgaG9zdCk7CisJSU5JVF9XT1JLKCZob3N0LT5mc21fdGFzaywgY2FybV9mc21fdGFzayk7CiAJaW5pdF9jb21wbGV0aW9uKCZob3N0LT5wcm9iZV9jb21wKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhvc3QtPnJlcSk7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdWIuYyBiL2RyaXZlcnMvYmxvY2svdWIuYwppbmRleCAwZDVjNzNmLi4yMDk4ZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ViLmMKKysrIGIvZHJpdmVycy9ibG9jay91Yi5jCkBAIC0zNzYsNyArMzc2LDcgQEAKICAgICBpbnQgc3RhbGxlZF9waXBlKTsKIHN0YXRpYyB2b2lkIHViX3RvcF9zZW5zZV9kb25lKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKnNjbWQpOwogc3RhdGljIHZvaWQgdWJfcmVzZXRfZW50ZXIoc3RydWN0IHViX2RldiAqc2MsIGludCB0cnkpOwotc3RhdGljIHZvaWQgdWJfcmVzZXRfdGFzayh2b2lkICphcmcpOworc3RhdGljIHZvaWQgdWJfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIGludCB1Yl9zeW5jX3R1cihzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX2x1biAqbHVuKTsKIHN0YXRpYyBpbnQgdWJfc3luY19yZWFkX2NhcChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX2x1biAqbHVuLAogICAgIHN0cnVjdCB1Yl9jYXBhY2l0eSAqcmV0KTsKQEAgLTE1NTgsOSArMTU1OCw5IEBACiAJc2NoZWR1bGVfd29yaygmc2MtPnJlc2V0X3dvcmspOwogfQogCi1zdGF0aWMgdm9pZCB1Yl9yZXNldF90YXNrKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIHViX3Jlc2V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB1Yl9kZXYgKnNjID0gYXJnOworCXN0cnVjdCB1Yl9kZXYgKnNjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1Yl9kZXYsIHJlc2V0X3dvcmspOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3QgdWJfbHVuICpsdW47CkBAIC0yMTc5LDcgKzIxNzksNyBAQAogCXVzYl9pbml0X3VyYigmc2MtPndvcmtfdXJiKTsKIAl0YXNrbGV0X2luaXQoJnNjLT50YXNrbGV0LCB1Yl9zY3NpX2FjdGlvbiwgKHVuc2lnbmVkIGxvbmcpc2MpOwogCWF0b21pY19zZXQoJnNjLT5wb2lzb24sIDApOwotCUlOSVRfV09SSygmc2MtPnJlc2V0X3dvcmssIHViX3Jlc2V0X3Rhc2ssIHNjKTsKKwlJTklUX1dPUksoJnNjLT5yZXNldF93b3JrLCB1Yl9yZXNldF90YXNrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYy0+cmVzZXRfd2FpdCk7CiAKIAlpbml0X3RpbWVyKCZzYy0+d29ya190aW1lcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYyBiL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jCmluZGV4IGVjNWExYjkuLmUxOWJhNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jCkBAIC03NTksNiArNzU5LDggQEAKIAl9CiB9OwogCitzdGF0aWMgaW50IG5lZWRfZGVsZXRlX3Byb2JlOworCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgd2hvbGUgZGV2aWNlIGRyaXZlci4gIEhhbmRsZSBtb2R1bGUgYW5kIG5vbi1tb2R1bGUKICAqIHZlcnNpb25zCkBAIC03NzMsNDYgKzc3NSw2NyBAQAogCiAJaWYgKHZpb3BhdGhfaG9zdExwID09IEh2THBJbmRleEludmFsaWQpIHsKIAkJcHJpbnRrKFZJT0RfS0VSTl9XQVJOSU5HICJpbnZhbGlkIGhvc3RpbmcgcGFydGl0aW9uXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCXJjID0gLUVJTzsKKwkJZ290byBlYXJseV9mYWlsOwogCX0KIAogCXByaW50ayhWSU9EX0tFUk5fSU5GTyAidmVycyAiIFZJT0RfVkVSUyAiLCBob3N0aW5nIHBhcnRpdGlvbiAlZFxuIiwKIAkJCXZpb3BhdGhfaG9zdExwKTsKIAogICAgICAgICAvKiByZWdpc3RlciB0aGUgYmxvY2sgZGV2aWNlICovCi0JaWYgKHJlZ2lzdGVyX2Jsa2RldihWSU9EQVNEX01BSk9SLCBWSU9EX0dFTkhEX05BTUUpKSB7CisJcmMgPSAgcmVnaXN0ZXJfYmxrZGV2KFZJT0RBU0RfTUFKT1IsIFZJT0RfR0VOSERfTkFNRSk7CisJaWYgKHJjKSB7CiAJCXByaW50ayhWSU9EX0tFUk5fV0FSTklORwogCQkJCSJVbmFibGUgdG8gZ2V0IG1ham9yIG51bWJlciAlZCBmb3IgJXNcbiIsCiAJCQkJVklPREFTRF9NQUpPUiwgVklPRF9HRU5IRF9OQU1FKTsKLQkJcmV0dXJuIC1FSU87CisJCWdvdG8gZWFybHlfZmFpbDsKIAl9CiAJLyogQWN0dWFsbHkgb3BlbiB0aGUgcGF0aCB0byB0aGUgaG9zdGluZyBwYXJ0aXRpb24gKi8KLQlpZiAodmlvcGF0aF9vcGVuKHZpb3BhdGhfaG9zdExwLCB2aW9tYWpvcnN1YnR5cGVfYmxvY2tpbywKLQkJCQlWSU9NQVhSRVEgKyAyKSkgeworCXJjID0gdmlvcGF0aF9vcGVuKHZpb3BhdGhfaG9zdExwLCB2aW9tYWpvcnN1YnR5cGVfYmxvY2tpbywKKwkJCQlWSU9NQVhSRVEgKyAyKTsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKFZJT0RfS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiZXJyb3Igb3BlbmluZyBwYXRoIHRvIGhvc3QgcGFydGl0aW9uICVkXG4iLAogCQkgICAgICAgdmlvcGF0aF9ob3N0THApOwotCQl1bnJlZ2lzdGVyX2Jsa2RldihWSU9EQVNEX01BSk9SLCBWSU9EX0dFTkhEX05BTUUpOwotCQlyZXR1cm4gLUVJTzsKKwkJZ290byB1bnJlZ2lzdGVyX2JsazsKIAl9CiAKIAkvKiBJbml0aWFsaXplIG91ciByZXF1ZXN0IGhhbmRsZXIgKi8KIAl2aW9fc2V0SGFuZGxlcih2aW9tYWpvcnN1YnR5cGVfYmxvY2tpbywgaGFuZGxlX2Jsb2NrX2V2ZW50KTsKIAogCXJjID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmdmlvZGFzZF9kcml2ZXIpOwotCWlmIChyYyA9PSAwKQotCQlkcml2ZXJfY3JlYXRlX2ZpbGUoJnZpb2Rhc2RfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX3Byb2JlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKFZJT0RfS0VSTl9XQVJOSU5HICJ2aW9fcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZFxuIik7CisJCWdvdG8gdW5zZXRfaGFuZGxlcjsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgY2FsbCBmYWlscywgaXQganVzdCBtZWFucyB0aGF0IHdlIGNhbm5vdCBkeW5hbWljYWxseQorCSAqIGFkZCB2aXJ0dWFsIGRpc2tzLCBidXQgdGhlIGRyaXZlciB3aWxsIHN0aWxsIHdvcmsgZmluZSBmb3IKKwkgKiBhbGwgZXhpc3RpbmcgZGlzaywgc28gaWdub3JlIHRoZSBmYWlsdXJlLgorCSAqLworCWlmICghZHJpdmVyX2NyZWF0ZV9maWxlKCZ2aW9kYXNkX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9wcm9iZSkpCisJCW5lZWRfZGVsZXRlX3Byb2JlID0gMTsKKworCXJldHVybiAwOworCit1bnNldF9oYW5kbGVyOgorCXZpb19jbGVhckhhbmRsZXIodmlvbWFqb3JzdWJ0eXBlX2Jsb2NraW8pOworCXZpb3BhdGhfY2xvc2UodmlvcGF0aF9ob3N0THAsIHZpb21ham9yc3VidHlwZV9ibG9ja2lvLCBWSU9NQVhSRVEgKyAyKTsKK3VucmVnaXN0ZXJfYmxrOgorCXVucmVnaXN0ZXJfYmxrZGV2KFZJT0RBU0RfTUFKT1IsIFZJT0RfR0VOSERfTkFNRSk7CitlYXJseV9mYWlsOgogCXJldHVybiByYzsKIH0KIG1vZHVsZV9pbml0KHZpb2Rhc2RfaW5pdCk7CiAKLXZvaWQgdmlvZGFzZF9leGl0KHZvaWQpCit2b2lkIF9fZXhpdCB2aW9kYXNkX2V4aXQodm9pZCkKIHsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnZpb2Rhc2RfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX3Byb2JlKTsKKwlpZiAobmVlZF9kZWxldGVfcHJvYmUpCisJCWRyaXZlcl9yZW1vdmVfZmlsZSgmdmlvZGFzZF9kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfcHJvYmUpOwogCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdmlvZGFzZF9kcml2ZXIpOwogCXZpb19jbGVhckhhbmRsZXIodmlvbWFqb3JzdWJ0eXBlX2Jsb2NraW8pOwotCXVucmVnaXN0ZXJfYmxrZGV2KFZJT0RBU0RfTUFKT1IsIFZJT0RfR0VOSERfTkFNRSk7CiAJdmlvcGF0aF9jbG9zZSh2aW9wYXRoX2hvc3RMcCwgdmlvbWFqb3JzdWJ0eXBlX2Jsb2NraW8sIFZJT01BWFJFUSArIDIpOworCXVucmVnaXN0ZXJfYmxrZGV2KFZJT0RBU0RfTUFKT1IsIFZJT0RfR0VOSERfTkFNRSk7CiB9Ci0KIG1vZHVsZV9leGl0KHZpb2Rhc2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9iY20yMDN4LmMgYi9kcml2ZXJzL2JsdWV0b290aC9iY20yMDN4LmMKaW5kZXggNjdjZGRhNC4uOTI1Njk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JjbTIwM3guYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC00Myw3ICs0Miw3IEBACiAjZGVmaW5lIEJUX0RCRyhELi4uKQogI2VuZGlmCiAKLSNkZWZpbmUgVkVSU0lPTiAiMS4wIgorI2RlZmluZSBWRVJTSU9OICIxLjEiCiAKIHN0YXRpYyBpbnQgaWdub3JlID0gMDsKIApAQCAtNzIsNyArNzEsNyBAQAogCiAJdW5zaWduZWQgbG9uZwkJc3RhdGU7CiAKLQlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKIAogCXN0cnVjdCB1cmIJCSp1cmI7CiAJdW5zaWduZWQgY2hhcgkJKmJ1ZmZlcjsKQEAgLTEwNSw3ICsxMDQsNyBAQAogCiAJCWRhdGEtPnN0YXRlID0gQkNNMjAzWF9TRUxFQ1RfTUVNT1JZOwogCi0JCW1vZF90aW1lcigmZGF0YS0+dGltZXIsIGppZmZpZXMgKyAoSFogLyAxMCkpOworCQlzY2hlZHVsZV93b3JrKCZkYXRhLT53b3JrKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJDTTIwM1hfU0VMRUNUX01FTU9SWToKQEAgLTE1OCw5ICsxNTcsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJjbTIwM3hfdGltZXIodW5zaWduZWQgbG9uZyB1c2VyX2RhdGEpCitzdGF0aWMgdm9pZCBiY20yMDN4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBiY20yMDN4X2RhdGEgKmRhdGEgPSAoc3RydWN0IGJjbTIwM3hfZGF0YSAqKSB1c2VyX2RhdGE7CisJc3RydWN0IGJjbTIwM3hfZGF0YSAqZGF0YSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmNtMjAzeF9kYXRhLCB3b3JrKTsKIAogCWlmICh1c2Jfc3VibWl0X3VyYihkYXRhLT51cmIsIEdGUF9BVE9NSUMpIDwgMCkKIAkJQlRfRVJSKCJDYW4ndCBzdWJtaXQgVVJCIik7CkBAIC0yNDcsMTMgKzI0NywxMSBAQAogCiAJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CiAKLQlpbml0X3RpbWVyKCZkYXRhLT50aW1lcik7Ci0JZGF0YS0+dGltZXIuZnVuY3Rpb24gPSBiY20yMDN4X3RpbWVyOwotCWRhdGEtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKKwlJTklUX1dPUksoJmRhdGEtPndvcmssIGJjbTIwM3hfd29yayk7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRhdGEpOwogCi0JbW9kX3RpbWVyKCZkYXRhLT50aW1lciwgamlmZmllcyArIEhaKTsKKwlzY2hlZHVsZV93b3JrKCZkYXRhLT53b3JrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKaW5kZXggODQ1Yjg2OC4uYWNmYjZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAkJY2xlYXJfYml0KHJlYWR5X2JpdCwgJihpbmZvLT50eF9zdGF0ZSkpOwogCiAJCWlmIChidF9jYihza2IpLT5wa3RfdHlwZSAmIDB4ODApIHsKLQkJCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdxKTsKKwkJCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sod3EpOwogCQkJREVGSU5FX1dBSVQod2FpdCk7CiAKIAkJCXVuc2lnbmVkIGNoYXIgYmF1ZF9yZWc7CkBAIC04OTIsNDMgKzg5MiwxMCBAQAogfQogCiAKLXN0YXRpYyBpbnQgZmlyc3RfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsIGNpc3BhcnNlX3QgKnBhcnNlKQotewotCWludCBpOwotCi0JaSA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSk7Ci0JaWYgKGkgIT0gQ1NfU1VDQ0VTUykKLQkJcmV0dXJuIENTX05PX01PUkVfSVRFTVM7Ci0KLQlpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpCi0JCXJldHVybiBpOwotCi0JcmV0dXJuIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7Ci19Ci0KIHN0YXRpYyBpbnQgYmx1ZWNhcmRfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewogCWJsdWVjYXJkX2luZm9fdCAqaW5mbyA9IGxpbmstPnByaXY7Ci0JdHVwbGVfdCB0dXBsZTsKLQl1X3Nob3J0IGJ1ZlsyNTZdOwotCWNpc3BhcnNlX3QgcGFyc2U7Ci0JaW50IGksIG4sIGxhc3RfcmV0LCBsYXN0X2ZuOwotCi0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCi0JLyogR2V0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW5mb3JtYXRpb24gKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCWxhc3RfcmV0ID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCWlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7Ci0JCWxhc3RfZm4gPSBQYXJzZVR1cGxlOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCWludCBpLCBuOwogCiAJbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4MjA7CiAJbGluay0+aW8uTnVtUG9ydHMxID0gNjQ7CkBAIC05NjYsOSArOTMzLDYgQEAKIAogCXJldHVybiAwOwogCi1jc19mYWlsZWQ6Ci0JY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOwotCiBmYWlsZWQ6CiAJYmx1ZWNhcmRfcmVsZWFzZShsaW5rKTsKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwppbmRleCAzYTk2YTBiLi5hYWUzYWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCkBAIC03MTMsMjIgKzcxMyw3IEBACiAJdV9zaG9ydCBidWZbMjU2XTsKIAljaXNwYXJzZV90IHBhcnNlOwogCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmID0gJnBhcnNlLmNmdGFibGVfZW50cnk7Ci0JaW50IGksIGosIHRyeSwgbGFzdF9yZXQsIGxhc3RfZm47Ci0KLQl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0KLQkvKiBHZXQgY29uZmlndXJhdGlvbiByZWdpc3RlciBpbmZvcm1hdGlvbiAqLwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JbGFzdF9yZXQgPSBmaXJzdF90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0JaWYgKGxhc3RfcmV0ICE9IENTX1NVQ0NFU1MpIHsKLQkJbGFzdF9mbiA9IFBhcnNlVHVwbGU7Ci0JCWdvdG8gY3NfZmFpbGVkOwotCX0KLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisJaW50IGksIGosIHRyeTsKIAogCS8qIEZpcnN0IHBhc3M6IGxvb2sgZm9yIGEgY29uZmlnIGVudHJ5IHRoYXQgbG9va3Mgbm9ybWFsLiAqLwogCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CkBAIC04MDIsOSArNzg3LDYgQEAKIAogCXJldHVybiAwOwogCi1jc19mYWlsZWQ6Ci0JY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOwotCiBmYWlsZWQ6CiAJYnQzY19yZWxlYXNlKGxpbmspOwogCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYwppbmRleCAzYjI5MDg2Li45MjY0OGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYwpAQCAtNjQ0LDIyICs2NDQsNyBAQAogCXVfc2hvcnQgYnVmWzI1Nl07CiAJY2lzcGFyc2VfdCBwYXJzZTsKIAljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OwotCWludCBpLCBqLCB0cnksIGxhc3RfcmV0LCBsYXN0X2ZuOwotCi0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCi0JLyogR2V0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW5mb3JtYXRpb24gKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCWxhc3RfcmV0ID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCWlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7Ci0JCWxhc3RfZm4gPSBQYXJzZVR1cGxlOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCWludCBpLCBqLCB0cnk7CiAKIAkvKiBGaXJzdCBwYXNzOiBsb29rIGZvciBhIGNvbmZpZyBlbnRyeSB0aGF0IGxvb2tzIG5vcm1hbC4gKi8KIAl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKQEAgLTczNCw5ICs3MTksNiBAQAogCiAJcmV0dXJuIDA7CiAKLWNzX2ZhaWxlZDoKLQljc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7Ci0KIGZhaWxlZDoKIAlidHVhcnRfcmVsZWFzZShsaW5rKTsKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwppbmRleCBlN2M4MDBmLi43N2I5OWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCkBAIC02MjYsMjIgKzYyNiw3IEBACiAJdV9zaG9ydCBidWZbMjU2XTsKIAljaXNwYXJzZV90IHBhcnNlOwogCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmID0gJnBhcnNlLmNmdGFibGVfZW50cnk7Ci0JaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOwotCi0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCi0JLyogR2V0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaW5mb3JtYXRpb24gKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCWxhc3RfcmV0ID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCWlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7Ci0JCWxhc3RfZm4gPSBQYXJzZVR1cGxlOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCWludCBpOwogCiAJdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CkBAIC02OTAsOSArNjc1LDYgQEAKIAogCXJldHVybiAwOwogCi1jc19mYWlsZWQ6Ci0JY3NfZXJyb3IobGluaywgbGFzdF9mbiwgbGFzdF9yZXQpOwotCiBmYWlsZWQ6CiAJZHRsMV9yZWxlYXNlKGxpbmspOwogCXJldHVybiAtRU5PREVWOwpAQCAtNzExLDYgKzY5Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBkdGwxX2lkc1tdID0gewogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOb2tpYSBNb2JpbGUgUGhvbmVzIiwgIkRUTC0xIiwgMHhlMWJmZGQ2NCwgMHhlMTY4NDgwZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5va2lhIE1vYmlsZSBQaG9uZXMiLCAiRFRMLTQiLCAweGUxYmZkZDY0LCAweDkxMDJiYzgyKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU29ja2V0IiwgIkNGIiwgMHhiMzhiY2MyZSwgMHg0NGViZjg2MyksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNvY2tldCIsICJDRisgUGVyc29uYWwgTmV0d29yayBDYXJkIiwgMHhiMzhiY2MyZSwgMHhlNzMyYmFlMyksCiAJUENNQ0lBX0RFVklDRV9OVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYwppbmRleCBkMGNmYWNlLi41ZTJjMzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKQEAgLTMzMCw3ICszMzAsNyBAQAogCSAgIHJlbGlhYmxlIHBhY2tldCBpZiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgc2VudCBidXQgbm90IHlldCBhY2snZWQKIAkgICBpcyA8IHRoYW4gdGhlIHdpbnNpemUgKi8KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZiY3NwLT51bmFjay5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKCZiY3NwLT51bmFjay5sb2NrLCBmbGFncywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwogCiAJaWYgKGJjc3AtPnVuYWNrLnFsZW4gPCBCQ1NQX1RYV0lOU0laRSAmJiAoc2tiID0gc2tiX2RlcXVldWUoJmJjc3AtPnJlbCkpICE9IE5VTEwpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBiY3NwX3ByZXBhcmVfcGt0KGJjc3AsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIGJ0X2NiKHNrYiktPnBrdF90eXBlKTsKQEAgLTY5Niw3ICs2OTYsNyBAQAogCiAJQlRfREJHKCJodSAlcCByZXRyYW5zbWl0dGluZyAldSBwa3RzIiwgaHUsIGJjc3AtPnVuYWNrLnFsZW4pOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJjc3AtPnVuYWNrLmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZV9uZXN0ZWQoJmJjc3AtPnVuYWNrLmxvY2ssIGZsYWdzLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKIAl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWVfdGFpbCgmYmNzcC0+dW5hY2spKSAhPSBOVUxMKSB7CiAJCWJjc3AtPm1zZ3FfdHhzZXEgPSAoYmNzcC0+bXNncV90eHNlcSAtIDEpICYgMHgwNzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91c2IuYwppbmRleCA3NTY1NjQyLi5mZGVhNThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdXNiLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VzYi5jCkBAIC0xMTgsNiArMTE4LDkgQEAKIAkvKiBJQk0vTGVub3ZvIFRoaW5rUGFkIHdpdGggQnJvYWRjb20gY2hpcCAqLwogCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjAxZSksIC5kcml2ZXJfaW5mbyA9IEhDSV9XUk9OR19TQ09fTVRVIH0sCiAKKwkvKiBBTllDT00gQmx1ZXRvb3RoIFVTQi0yMDAgYW5kIFVTQi0yNTAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIxMTEpLCAuZHJpdmVyX2luZm8gPSBIQ0lfUkVTRVQgfSwKKwogCS8qIE1pY3Jvc29mdCBXaXJlbGVzcyBUcmFuc2NlaXZlciBmb3IgQmx1ZXRvb3RoIDIuMCAqLwogCXsgVVNCX0RFVklDRSgweDA0NWUsIDB4MDA5YyksIC5kcml2ZXJfaW5mbyA9IEhDSV9SRVNFVCB9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKaW5kZXggN2VhMGY0OGYuLmU0YTJmOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vY2Ryb20uYworKysgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKQEAgLTE4MTAsNyArMTgxMCw3IEBACiAKIAlzaXplID0gc2l6ZW9mKHMtPmRpc2NrZXkudmFsdWUpICsgNDsKIAotCWlmICgoYnVmID0gKHVfY2hhciAqKSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWlmICgoYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbml0X2Nkcm9tX2NvbW1hbmQoJmNnYywgYnVmLCBzaXplLCBDR0NfREFUQV9SRUFEKTsKQEAgLTE4NjEsNyArMTg2MSw3IEBACiAKIAlzaXplID0gc2l6ZW9mKHMtPm1hbnVmYWN0LnZhbHVlKSArIDQ7CiAKLQlpZiAoKGJ1ZiA9ICh1X2NoYXIgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlpZiAoKGJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaW5pdF9jZHJvbV9jb21tYW5kKCZjZ2MsIGJ1Ziwgc2l6ZSwgQ0dDX0RBVEFfUkVBRCk7CkBAIC0yMTMzLDE2ICsyMTMzLDE0IEBACiAJCXJxLT50aW1lb3V0ID0gNjAgKiBIWjsKIAkJYmlvID0gcnEtPmJpbzsKIAotCQlpZiAocnEtPmJpbykKLQkJCWJsa19xdWV1ZV9ib3VuY2UocSwgJnJxLT5iaW8pOwotCiAJCWlmIChibGtfZXhlY3V0ZV9ycShxLCBjZGktPmRpc2ssIHJxLCAwKSkgewogCQkJc3RydWN0IHJlcXVlc3Rfc2Vuc2UgKnMgPSBycS0+c2Vuc2U7CiAJCQlyZXQgPSAtRUlPOwogCQkJY2RpLT5sYXN0X3NlbnNlID0gcy0+c2Vuc2Vfa2V5OwogCQl9CiAKLQkJaWYgKGJsa19ycV91bm1hcF91c2VyKGJpbywgbGVuKSkKKwkJcnEtPmJpbyA9IGJpbzsKKwkJaWYgKGJsa19ycV91bm1hcF91c2VyKHJxKSkKIAkJCXJldCA9IC1FRkFVTFQ7CiAKIAkJaWYgKHJldCkKQEAgLTI4NTEsNyArMjg0OSw3IEBACiAJCS8qIEZJWE1FOiB3ZSBuZWVkIHVwcGVyIGJvdW5kIGNoZWNraW5nLCB0b28hISAqLwogCQlpZiAobGJhIDwgMCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQljZ2MuYnVmZmVyID0gKGNoYXIgKikga21hbGxvYyhibG9ja3NpemUsIEdGUF9LRVJORUwpOworCQljZ2MuYnVmZmVyID0ga21hbGxvYyhibG9ja3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoY2djLmJ1ZmZlciA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCW1lbXNldCgmc2Vuc2UsIDAsIHNpemVvZihzZW5zZSkpOwpAQCAtMzAzMyw3ICszMDMxLDcgQEAKIAkJaW50IHNpemUgPSBzaXplb2YoZHZkX3N0cnVjdCk7CiAJCWlmICghQ0RST01fQ0FOKENEQ19EVkQpKQogCQkJcmV0dXJuIC1FTk9TWVM7Ci0JCWlmICgocyA9IChkdmRfc3RydWN0ICopIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWlmICgocyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJY2RpbmZvKENEX0RPX0lPQ1RMLCAiZW50ZXJpbmcgRFZEX1JFQURfU1RSVUNUXG4iKTsgCiAJCWlmIChjb3B5X2Zyb21fdXNlcihzLCAoZHZkX3N0cnVjdCBfX3VzZXIgKilhcmcsIHNpemUpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL2NtMjA2LmMgYi9kcml2ZXJzL2Nkcm9tL2NtMjA2LmMKaW5kZXggZTZkOGU5ZS4uYjZjNjFiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jbTIwNi5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY20yMDYuYwpAQCAtMTQyMCw3ICsxNDIwLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCXByaW50aygiIGFkYXB0ZXIgYXQgMHgleCIsIGNtMjA2X2Jhc2UpOwotCWNkID0gKHN0cnVjdCBjbTIwNl9zdHJ1Y3QgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwljZCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjZCkKICAgICAgICAgICAgICAgIGdvdG8gb3V0X2Jhc2U7CiAJLyogTm93IHdlIGhhdmUgZm91bmQgdGhlIGFkYXB0b3IgY2FyZCwgdHJ5IHRvIHJlc2V0IGl0LiBBcyB3ZSBoYXZlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL29wdGNkLmMgYi9kcml2ZXJzL2Nkcm9tL29wdGNkLmMKaW5kZXggMjUwMzJkNy4uMzU0MTY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9vcHRjZC5jCisrKyBiL2RyaXZlcnMvY2Ryb20vb3B0Y2QuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCXJldHVybjsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNwcmludGYocywgZm10LCBhcmdzKTsKKwl2c25wcmludGYocywgc2l6ZW9mKHMpLCBmbXQsIGFyZ3MpOwogCXByaW50ayhLRVJOX0RFQlVHICJvcHRjZDogJXNcbiIsIHMpOwogCXZhX2VuZChhcmdzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vc2JwY2QuYyBiL2RyaXZlcnMvY2Ryb20vc2JwY2QuYwppbmRleCBiYTUwZTVhLi5hMTI4M2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL3NicGNkLmMKKysrIGIvZHJpdmVycy9jZHJvbS9zYnBjZC5jCkBAIC03NzAsMTEgKzc3MCwxMCBAQAogCQogCW1zZ251bSsrOwogCWlmIChtc2dudW0+OTkpIG1zZ251bT0wOwotCXNwcmludGYoYnVmLCBNU0dfTEVWRUwgIiVzLSVkIFslMDJkXTogICIsIG1ham9yX25hbWUsIGN1cnJlbnRfZHJpdmUgLSBEX1MsIG1zZ251bSk7CiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c3ByaW50ZigmYnVmWzE4XSwgZm10LCBhcmdzKTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7Ci0JcHJpbnRrKGJ1Zik7CisJcHJpbnRrKE1TR19MRVZFTCAiJXMtJWQgWyUwMmRdOiAgJXMiLCBtYWpvcl9uYW1lLCBjdXJyZW50X2RyaXZlIC0gRF9TLCBtc2dudW0sIGJ1Zik7CiAjaWYgS0xPR0RfUEFVU0UKIAlzYnBfc2xlZXAoS0xPR0RfUEFVU0UpOyAvKiBlbHNlIG1lc3NhZ2VzIGdldCBsb3N0ICovCiAjZW5kaWYgLyogS0xPR0RfUEFVU0UgKi8gCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IDBlNmYzNWYuLjllNDNlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC05Nyw3ICs5Nyw3IEBACiAKIGNvbmZpZyBDT01QVVRPTkUKIAl0cmlzdGF0ZSAiQ29tcHV0b25lIEludGVsbGlQb3J0IFBsdXMgc2VyaWFsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBlbnRpcmUgZmFtaWx5IG9mIEludGVsbGlwb3J0IElJL1BsdXMKIAkgIGNvbnRyb2xsZXJzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgTWljcm9DaGFubmVsIGNvbnRyb2xsZXJzIGFuZApAQCAtMjAxLDkgKzIwMSwyNCBAQAogCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBteHNlci4gSWYgeW91IHdhbnQgdG8gZG8gdGhhdCwgc2F5IE0KIAkgIGhlcmUuCiAKK2NvbmZpZyBNT1hBX1NNQVJUSU9fTkVXCisJdHJpc3RhdGUgIk1veGEgU21hcnRJTyBzdXBwb3J0IHYuIDIuMCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiAoUENJIHx8IEVJU0EgfHwgSVNBKQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBNb3hhIFNtYXJ0SU8gbXVsdGlwb3J0IHNlcmlhbCBjYXJkIGFuZC9vcgorCSAgd2FudCB0byBoZWxwIGRldmVsb3AgYSBuZXcgdmVyc2lvbiBvZiB0aGlzIGRyaXZlci4KKworCSAgVGhpcyBpcyB1cGdyYWRlZCAoMS45LjEpIGRyaXZlciBmcm9tIG9yaWdpbmFsIE1veGEgZHJpdmVycyB3aXRoCisJICBjaGFuZ2VzIGZpbmFsbHkgcmVzdWx0aW5nIGluIFBDSSBwcm9iaW5nLgorCisJICBVc2UgYXQgeW91ciBvd24gcmlzay4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIG14c2VyX25ldy4gSWYgeW91IHdhbnQgdG8gZG8gdGhhdCwgc2F5IE0gaGVyZS4KKwogY29uZmlnIElTSQogCXRyaXN0YXRlICJNdWx0aS1UZWNoIG11bHRpcG9ydCBjYXJkIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiBQQ0kKIAlzZWxlY3QgRldfTE9BREVSCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIE11bHRpLVRlY2ggY2FyZHMgd2hpY2ggcHJvdmlkZSBzZXZlcmFsCkBAIC0yOTcsNyArMzEyLDcgQEAKIAogY29uZmlnIFNYCiAJdHJpc3RhdGUgIlNwZWNpYWxpeCBTWCAoYW5kIFNJKSBjYXJkIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKKwlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRCAmJiAoUENJIHx8IEVJU0EgfHwgSVNBKQogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBTWCBhbmQgU0kgbXVsdGlwb3J0IHNlcmlhbCBjYXJkcy4KIAkgIFBsZWFzZSByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vc3gudHh0PiBmb3IgZGV0YWlscy4KQEAgLTQwOSwxNCArNDI0LDYgQEAKICAgICAgICAgIElmIHlvdSBoYXZlIGFuIFNHSSBBbHRpeCB3aXRoIGFuIGF0dGFjaGVkIFNBQnJpY2sKICAgICAgICAgIHNheSBZIG9yIE0gaGVyZSwgb3RoZXJ3aXNlIHNheSBOLgogCi1jb25maWcgTVNQRUMKLQl0cmlzdGF0ZSAiTWVtb3J5IHNwZWNpYWwgb3BlcmF0aW9ucyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBJQTY0Ci0JaGVscAotCSAgSWYgeW91IGhhdmUgYW4gaWE2NCBhbmQgeW91IHdhbnQgdG8gZW5hYmxlIG1lbW9yeSBzcGVjaWFsCi0JICBvcGVyYXRpb25zIHN1cHBvcnQgKGZvcm1lcmx5IGtub3duIGFzIGZldGNob3ApLCBzYXkgWSBoZXJlLAotCSAgb3RoZXJ3aXNlIHNheSBOLgotCiBzb3VyY2UgImRyaXZlcnMvc2VyaWFsL0tjb25maWciCiAKIGNvbmZpZyBVTklYOThfUFRZUwpAQCAtODYwLDQyICs4NjcsOSBAQAogCiBjb25maWcgVEFOQkFDX1RCMDIxOQogCXRyaXN0YXRlICJUQU5CQUMgVEIwMjE5IGJhc2UgYm9hcmQgc3VwcG9ydCIKLQlkZXBlbmRzIFRBTkJBQ19UQjAyMlgKKwlkZXBlbmRzIG9uIFRBTkJBQ19UQjAyMlgKIAlzZWxlY3QgR1BJT19WUjQxWFgKIAotbWVudSAiRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyIgotCi1jb25maWcgRlRBUEUKLQl0cmlzdGF0ZSAiRnRhcGUgKFFJQy04MC9UcmF2YW4pIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCUk9LRU5fT05fU01QICYmIChBTFBIQSB8fCBYODYpCi0JLS0taGVscC0tLQotCSAgSWYgeW91IGhhdmUgYSB0YXBlIGRyaXZlIHRoYXQgaXMgY29ubmVjdGVkIHRvIHlvdXIgZmxvcHB5Ci0JICBjb250cm9sbGVyLCBzYXkgWSBoZXJlLgotCi0JICBTb21lIHRhcGUgZHJpdmVzIChsaWtlIHRoZSBTZWFnYXRlICJUYXBlIFN0b3JlIDMyMDAiIG9yIHRoZSBJb21lZ2EKLQkgICJEaXR0byAzMjAwIiBvciB0aGUgRXhhYnl0ZSAiRWFnbGUgVFItMyIpIGNvbWUgd2l0aCBhICJoaWdoIHNwZWVkIgotCSAgY29udHJvbGxlciBvZiB0aGVpciBvd24uIFRoZXNlIGRyaXZlcyAoYW5kIHRoZWlyIGNvbXBhbmlvbgotCSAgY29udHJvbGxlcnMpIGFyZSBhbHNvIHN1cHBvcnRlZCBpZiB5b3Ugc2F5IFkgaGVyZS4KLQotCSAgSWYgeW91IGhhdmUgYSBzcGVjaWFsIGNvbnRyb2xsZXIgKHN1Y2ggYXMgdGhlIENNUyBGQy0xMCwgRkMtMjAsCi0JICBNb3VudGFpbiBNYWNoLUlJLCBvciBhbnkgY29udHJvbGxlciB0aGF0IGlzIGJhc2VkIG9uIHRoZSBJbnRlbCA4MjA3OAotCSAgRkRDIGxpa2UgdGhlIGhpZ2ggc3BlZWQgY29udHJvbGxlcnMgYnkgU2VhZ2F0ZSBhbmQgRXhhYnl0ZSBhbmQKLQkgIElvbWVnYSdzICJEaXR0byBEYXNoIikgeW91IG11c3QgY29uZmlndXJlIGl0IGJ5IHNlbGVjdGluZyB0aGUKLQkgIGFwcHJvcHJpYXRlIGVudHJpZXMgZnJvbSB0aGUgIkZsb3BweSB0YXBlIGNvbnRyb2xsZXJzIiBzdWItbWVudQotCSAgYmVsb3cgYW5kIHBvc3NpYmx5IG1vZGlmeSB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBJUlEgYW5kIERNQQotCSAgY2hhbm5lbCBhbmQgdGhlIElPIGJhc2UgaW4gZnRhcGUncyBjb25maWd1cmF0aW9uIG1lbnUuCi0KLQkgIElmIHlvdSB3YW50IHRvIHVzZSB5b3VyIGZsb3BweSB0YXBlIGRyaXZlIG9uIGEgUENJLWJ1cyBiYXNlZCBzeXN0ZW0sCi0JICBwbGVhc2UgcmVhZCB0aGUgZmlsZSA8ZmlsZTpkcml2ZXJzL2NoYXIvZnRhcGUvUkVBRE1FLlBDST4uCi0KLQkgIFRoZSBmdGFwZSBrZXJuZWwgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgcnVudGltZSBsb2FkYWJsZQotCSAgbW9kdWxlLiBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBmdGFwZS4KLQotc291cmNlICJkcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZyIKLQotZW5kbWVudQotCiBzb3VyY2UgImRyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2NoYXIvZHJtL0tjb25maWciCkBAIC0xMDAyLDcgKzk3Niw3IEBACiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGhhdmUgYSBtaXNjZGV2aWNlIG5hbWVkICIvZGV2L2hwZXQvIi4gIEVhY2gKIAkgIG9wZW4gc2VsZWN0cyBvbmUgb2YgdGhlIHRpbWVycyBzdXBwb3J0ZWQgYnkgdGhlIEhQRVQuICBUaGUgdGltZXJzIGFyZQotCSAgbm9uLXBlcmlvZGlvYyBhbmQvb3IgcGVyaW9kaWMuCisJICBub24tcGVyaW9kaWMgYW5kL29yIHBlcmlvZGljLgogCiBjb25maWcgSFBFVF9SVENfSVJRCiAJYm9vbCAiSFBFVCBDb250cm9sIFJUQyBJUlEiIGlmICFIUEVUX0VNVUxBVEVfUlRDCkBAIC0xMDQ2LDcgKzEwMjAsNyBAQAogCiBjb25maWcgVEVMQ0xPQ0sKIAl0cmlzdGF0ZSAiVGVsZWNvbSBjbG9jayBkcml2ZXIgZm9yIE1QQkwwMDEwIEFUQ0EgU0JDIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgWDg2CiAJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhlIHRlbGVjb20gY2xvY2sgZGV2aWNlIGlzIHNwZWNpZmljIHRvIHRoZSBNUEJMMDAxMCBBVENBIGNvbXB1dGVyIGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDc3N2NhZDAuLmZjMTEwNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTMxLDYgKzMxLDcgQEAKIG9iai0kKENPTkZJR19BMjIzMikJCSs9IHNlcl9hMjIzMi5vIGdlbmVyaWNfc2VyaWFsLm8KIG9iai0kKENPTkZJR19BVEFSSV9EU1A1NkspCSs9IGRzcDU2ay5vCiBvYmotJChDT05GSUdfTU9YQV9TTUFSVElPKQkrPSBteHNlci5vCitvYmotJChDT05GSUdfTU9YQV9TTUFSVElPX05FVykJKz0gbXhzZXJfbmV3Lm8KIG9iai0kKENPTkZJR19DT01QVVRPTkUpCQkrPSBpcDIvCiBvYmotJChDT05GSUdfUklTQ09NOCkJCSs9IHJpc2NvbTgubwogb2JqLSQoQ09ORklHX0lTSSkJCSs9IGlzaWNvbS5vCkBAIC03OCw3ICs3OSw2IEBACiBvYmotJChDT05GSUdfSThLKQkJKz0gaThrLm8KIG9iai0kKENPTkZJR19EUzE2MjApCQkrPSBkczE2MjAubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTSkJCSs9IGh3X3JhbmRvbS8KLW9iai0kKENPTkZJR19GVEFQRSkJCSs9IGZ0YXBlLwogb2JqLSQoQ09ORklHX0NPQkFMVF9MQ0QpCSs9IGxjZC5vCiBvYmotJChDT05GSUdfUFBERVYpCQkrPSBwcGRldi5vCiBvYmotJChDT05GSUdfTldCVVRUT04pCQkrPSBud2J1dHRvbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcKaW5kZXggYzYwM2JmMi4uYTlmOWM0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZwpAQCAtODYsNyArODYsNyBAQAogCiBjb25maWcgQUdQX1NJUwogCXRyaXN0YXRlICJTaVMgY2hpcHNldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQUdQCisJZGVwZW5kcyBvbiBBR1AgJiYgWDg2CiAJaGVscAogCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgR0xYIGNvbXBvbmVudCBvZgogCSAgWCBvbiBTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBbU2lTXSBjaGlwc2V0cy4KQEAgLTEwMyw3ICsxMDMsNyBAQAogCiBjb25maWcgQUdQX1ZJQQogCXRyaXN0YXRlICJWSUEgY2hpcHNldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQUdQCisJZGVwZW5kcyBvbiBBR1AgJiYgWDg2CiAJaGVscAogCSAgVGhpcyBvcHRpb24gZ2l2ZXMgeW91IEFHUCBzdXBwb3J0IGZvciB0aGUgR0xYIGNvbXBvbmVudCBvZgogCSAgWCBvbiBWSUEgTVZQMy9BcG9sbG8gUHJvIGNoaXBzZXRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKaW5kZXggMDBiMTdhZS4uMmYyYzRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCkBAIC00NTksNyArNDU5LDcgQEAKIAogLyogSGFuZGxlIHNoYWRvdyBkZXZpY2Ugb2YgdGhlIE52aWRpYSBORm9yY2UzICovCiAvKiBDSEVDSy1NRSBvcmlnaW5hbCAyLjQgdmVyc2lvbiBzZXQgdXAgc29tZSBJT1JScy4gQ2hlY2sgaWYgdGhhdCBpcyBuZWVkZWQuICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBuZm9yY2UzX2FncF9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCBuZm9yY2UzX2FncF9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXUzMiB0bXAsIGFwYmFzZSwgYXBiYXIsIGFwbGltaXQ7CiAJc3RydWN0IHBjaV9kZXYgKmRldjE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCmluZGV4IGMzOTIwMDEuLjg4M2EzNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCkBAIC00MTksNiArNDE5LDMxIEBACiAJCSpyZXF1ZXN0ZWRfbW9kZSAmPSB+QUdQMl9SRVNFUlZFRF9NQVNLOwogCX0KIAorCS8qCisJICogU29tZSBkdW1iIGJyaWRnZXMgYXJlIHByb2dyYW1tZWQgdG8gZGlzb2JleSB0aGUgQUdQMiBzcGVjLgorCSAqIFRoaXMgaXMgbGlrZWx5IGEgQklPUyBtaXNwcm9ncmFtbWluZyByYXRoZXIgdGhhbiBwb3dlcm9uIGRlZmF1bHQsIG9yCisJICogaXQgd291bGQgYmUgYSBsb3QgbW9yZSBjb21tb24uCisJICogaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODgxNgorCSAqIEFHUHYyIHNwZWMgNi4xLjkgc3RhdGVzOgorCSAqICAgVGhlIFJBVEUgZmllbGQgaW5kaWNhdGVzIHRoZSBkYXRhIHRyYW5zZmVyIHJhdGVzIHN1cHBvcnRlZCBieSB0aGlzCisJICogICBkZXZpY2UuIEEuRy5QLiBkZXZpY2VzIG11c3QgcmVwb3J0IGFsbCB0aGF0IGFwcGx5LgorCSAqIEZpeCB0aGVtIHVwIGFzIGJlc3Qgd2UgY2FuLgorCSAqLworCXN3aXRjaCAoKmJyaWRnZV9hZ3BzdGF0ICYgNykgeworCWNhc2UgNDoKKwkJKmJyaWRnZV9hZ3BzdGF0IHw9IChBR1BTVEFUMl8yWCB8IEFHUFNUQVQyXzFYKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkJJT1MgYnVnLiBBR1AgYnJpZGdlIGNsYWltcyB0byBvbmx5IHN1cHBvcnQgeDQgcmF0ZSIKKwkJCSJGaXhpbmcgdXAgc3VwcG9ydCBmb3IgeDIgJiB4MVxuIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKmJyaWRnZV9hZ3BzdGF0IHw9IEFHUFNUQVQyXzFYOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQklPUyBidWcuIEFHUCBicmlkZ2UgY2xhaW1zIHRvIG9ubHkgc3VwcG9ydCB4MiByYXRlIgorCQkJIkZpeGluZyB1cCBzdXBwb3J0IGZvciB4MVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCS8qIENoZWNrIHRoZSBzcGVlZCBiaXRzIG1ha2Ugc2Vuc2UuIE9ubHkgb25lIHNob3VsZCBiZSBzZXQuICovCiAJdG1wID0gKnJlcXVlc3RlZF9tb2RlICYgNzsKIAlzd2l0Y2ggKHRtcCkgewpAQCAtMTA1NCw3ICsxMDc5LDcgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CiAKLQlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQTMyKTsKIAlpZiAocGFnZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKaW5kZXggZDFlZGU3ZC4uNTU1YjNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCkBAIC0xNjksNyArMTY5LDcgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CiAKLQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMik7CisJcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BMzIsIDIpOwogCWlmIChwYWdlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCkBAIC0zODcsMTEgKzM4Nyw3IEBACiAJLyogV2Ugb2J0YWluIHRoZSBzaXplIG9mIHRoZSBHVFQsIHdoaWNoIGlzIGFsc28gc3RvcmVkIChmb3Igc29tZQogCSAqIHJlYXNvbikgYXQgdGhlIHRvcCBvZiBzdG9sZW4gbWVtb3J5LiBUaGVuIHdlIGFkZCA0S0IgdG8gdGhhdAogCSAqIGZvciB0aGUgdmlkZW8gQklPUyBwb3B1cCwgd2hpY2ggaXMgYWxzbyBzdG9yZWQgaW4gdGhlcmUuICovCi0KLQlpZiAoSVNfSTk2NSkKLQkJc2l6ZSA9IDUxMiArIDQ7Ci0JZWxzZQotCQlzaXplID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5mZXRjaF9zaXplKCkgKyA0OworCXNpemUgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPmZldGNoX3NpemUoKSArIDQ7CiAKIAlpZiAoYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9IQiB8fAogCSAgICBhZ3BfYnJpZGdlLT5kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1R19IQikgewpAQCAtODA1LDYgKzgwMSwyNiBAQAogCiAJcmV0dXJuIDA7CiB9CisKKy8qCisgKiBUaGUgaTk2NSBzdXBwb3J0cyAzNi1iaXQgcGh5c2ljYWwgYWRkcmVzc2VzLCBidXQgdG8ga2VlcAorICogdGhlIGZvcm1hdCBvZiB0aGUgR1RUIHRoZSBzYW1lLCB0aGUgYml0cyB0aGF0IGRvbid0IGZpdAorICogaW4gYSAzMi1iaXQgd29yZCBhcmUgc2hpZnRlZCBkb3duIHRvIGJpdHMgNC4uNy4KKyAqCisgKiBHY2MgaXMgc21hcnQgZW5vdWdoIHRvIG5vdGljZSB0aGF0ICIoYWRkciA+PiAyOCkgJiAweGYwIgorICogaXMgYWx3YXlzIHplcm8gb24gMzItYml0IGFyY2hpdGVjdHVyZXMsIHNvIG5vIG5lZWQgdG8gbWFrZQorICogdGhpcyBjb25kaXRpb25hbC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50ZWxfaTk2NV9tYXNrX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCisJdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgdHlwZSkKK3sKKwkvKiBTaGlmdCBoaWdoIGJpdHMgZG93biAqLworCWFkZHIgfD0gKGFkZHIgPj4gMjgpICYgMHhmMDsKKworCS8qIFR5cGUgY2hlY2tpbmcgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSAqLworCXJldHVybiBhZGRyIHwgYnJpZGdlLT5kcml2ZXItPm1hc2tzW3R5cGVdLm1hc2s7Cit9CisKIHN0YXRpYyBpbnQgaW50ZWxfaTk2NV9mZXRjaF9zaXplKHZvaWQpCiB7CiAgICAgICAgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICp2YWx1ZXM7CkBAIC04MzIsNyArODQ4LDggQEAKIAogICAgICAgIGFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSh2YWx1ZXMgKyBvZmZzZXQpOwogCi0gICAgICAgcmV0dXJuIHZhbHVlc1tvZmZzZXRdLnNpemU7CisJLyogVGhlIGk5NjUgR1RUIGlzIGFsd2F5cyBzaXplZCBhcyBpZiBpdCBoYWQgYSA1MTJrQiBhcGVydHVyZSBzaXplICovCisJcmV0dXJuIDUxMjsKIH0KIAogLyogVGhlIGludGVsIGk5NjUgYXV0b21hdGljYWxseSBpbml0aWFsaXplcyB0aGUgYWdwIGFwZXJ0dXJlIGR1cmluZyBQT1NULgpAQCAtMTU4NCw3ICsxNjAxLDcgQEAKICAgICAgICAuZmV0Y2hfc2l6ZSAgICAgICAgICAgICA9IGludGVsX2k5NjVfZmV0Y2hfc2l6ZSwKICAgICAgICAuY2xlYW51cCAgICAgICAgICAgICAgICA9IGludGVsX2k5MTVfY2xlYW51cCwKICAgICAgICAudGxiX2ZsdXNoICAgICAgICAgICAgICA9IGludGVsX2k4MTBfdGxiZmx1c2gsCi0gICAgICAgLm1hc2tfbWVtb3J5ICAgICAgICAgICAgPSBpbnRlbF9pODEwX21hc2tfbWVtb3J5LAorICAgICAgIC5tYXNrX21lbW9yeSAgICAgICAgICAgID0gaW50ZWxfaTk2NV9tYXNrX21lbW9yeSwKICAgICAgICAubWFza3MgICAgICAgICAgICAgICAgICA9IGludGVsX2k4MTBfbWFza3MsCiAgICAgICAgLmFncF9lbmFibGUgICAgICAgICAgICAgPSBpbnRlbF9pODEwX2FncF9lbmFibGUsCiAgICAgICAgLmNhY2hlX2ZsdXNoICAgICAgICAgICAgPSBnbG9iYWxfY2FjaGVfZmx1c2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYwppbmRleCA5MWI3MWU3Li5kZmZjMTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMKQEAgLTI3LDMyICsyNyw0MiBAQAogc3RhdGljIGludCB1bmlub3J0aF9yZXY7CiBzdGF0aWMgaW50IGlzX3UzOwogCitzdGF0aWMgY2hhciBfX2RldmluaXRkYXRhICphcGVydHVyZSA9IE5VTEw7CiAKIHN0YXRpYyBpbnQgdW5pbm9ydGhfZmV0Y2hfc2l6ZSh2b2lkKQogewotCWludCBpOwotCXUzMiB0ZW1wOwotCXN0cnVjdCBhcGVyX3NpemVfaW5mb18zMiAqdmFsdWVzOworCWludCBpLCBzaXplID0gMDsKKwlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fMzIgKnZhbHVlcyA9CisJICAgIEFfU0laRV8zMihhZ3BfYnJpZGdlLT5kcml2ZXItPmFwZXJ0dXJlX3NpemVzKTsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZ3BfYnJpZGdlLT5kZXYsIFVOSV9OX0NGR19HQVJUX0JBU0UsICZ0ZW1wKTsKLQl0ZW1wICY9IH4oMHhmZmZmZjAwMCk7Ci0JdmFsdWVzID0gQV9TSVpFXzMyKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOworCWlmIChhcGVydHVyZSkgeworCQljaGFyICpzYXZlID0gYXBlcnR1cmU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykgewotCQlpZiAodGVtcCA9PSB2YWx1ZXNbaV0uc2l6ZV92YWx1ZSkgewotCQkJYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSA9Ci0JCQkgICAgYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIGkpOwotCQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSBpOwotCQkJcmV0dXJuIHZhbHVlc1tpXS5zaXplOworCQlzaXplID0gbWVtcGFyc2UoYXBlcnR1cmUsICZhcGVydHVyZSkgPj4gMjA7CisJCWFwZXJ0dXJlID0gc2F2ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgYWdwX2JyaWRnZS0+ZHJpdmVyLT5udW1fYXBlcnR1cmVfc2l6ZXM7IGkrKykKKwkJCWlmIChzaXplID09IHZhbHVlc1tpXS5zaXplKQorCQkJCWJyZWFrOworCisJCWlmIChpID09IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIGFwZXJ0dXJlIHNpemUsIHVzaW5nIgorCQkJICAgICAgICIgZGVmYXVsdFxuIik7CisJCQlzaXplID0gMDsKKwkJCWFwZXJ0dXJlID0gTlVMTDsKIAkJfQogCX0KIAotCWFncF9icmlkZ2UtPnByZXZpb3VzX3NpemUgPQotCSAgICBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzICsgMSk7Ci0JYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSAxOwotCXJldHVybiB2YWx1ZXNbMV0uc2l6ZTsKKwlpZiAoIXNpemUpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFncF9icmlkZ2UtPmRyaXZlci0+bnVtX2FwZXJ0dXJlX3NpemVzOyBpKyspCisJCQlpZiAodmFsdWVzW2ldLnNpemUgPT0gMzIpCisJCQkJYnJlYWs7CisJfQogCi0JcmV0dXJuIDA7CisJYWdwX2JyaWRnZS0+cHJldmlvdXNfc2l6ZSA9CisJICAgIGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZSA9ICh2b2lkICopKHZhbHVlcyArIGkpOworCWFncF9icmlkZ2UtPmFwZXJ0dXJlX3NpemVfaWR4ID0gaTsKKwlyZXR1cm4gdmFsdWVzW2ldLnNpemU7CiB9CiAKIHN0YXRpYyB2b2lkIHVuaW5vcnRoX3RsYmZsdXNoKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCkBAIC02ODMsNSArNjkzLDExIEBACiBtb2R1bGVfaW5pdChhZ3BfdW5pbm9ydGhfaW5pdCk7CiBtb2R1bGVfZXhpdChhZ3BfdW5pbm9ydGhfY2xlYW51cCk7CiAKK21vZHVsZV9wYXJhbShhcGVydHVyZSwgY2hhcnAsIDApOworTU9EVUxFX1BBUk1fREVTQyhhcGVydHVyZSwKKwkJICJBcGVydHVyZSBzaXplLCBtdXN0IGJlIHBvd2VyIG9mIHR3byBiZXR3ZWVuIDRNQiBhbmQgYW5cbiIKKwkJICJcdFx0dXBwZXIgbGltaXQgc3BlY2lmaWMgdG8gdGhlIFVuaU5vcnRoIHJldmlzaW9uLlxuIgorCQkgIlx0XHREZWZhdWx0OiAzMk0iKTsKKwogTU9EVUxFX0FVVEhPUigiQmVuIEhlcnJlbnNjaG1pZHQgJiBQYXVsIE1hY2tlcnJhcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCmluZGV4IDY2MDg2ZmEuLmZlYjRhYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBjdXJyZW50X2N0bF9iaXRzOwogCi1zdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywgc3RydWN0IHRlcm1pb3MgKm9sZCk7CitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywgc3RydWN0IGt0ZXJtaW9zICpvbGQpOwogc3RhdGljIHZvaWQgcnNfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKIAogCkBAIC02OTQsNyArNjk0LDcgQEAKICAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgogICovCiBzdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQoc3RydWN0IGFzeW5jX3N0cnVjdCAqaW5mbywKLQkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCQkgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlpbnQJcXVvdCA9IDAsIGJhdWRfYmFzZSwgYmF1ZDsKIAl1bnNpZ25lZCBjZmxhZywgY3ZhbCA9IDA7CkBAIC0xMzY1LDcgKzEzNjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCByc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IGFzeW5jX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMgYi9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCmluZGV4IDA0YTEyMDIuLmI5OWI3NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKKysrIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJcCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqdmMtPnZjX3VuaV9wYWdlZGlyX2xvYzsKIAlpZiAocCAmJiBwLT5yZWFkb25seSkgcmV0dXJuIC1FSU87CiAJaWYgKCFwIHx8IC0tcC0+cmVmY291bnQpIHsKLQkJcSA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKilrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCQlxID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFxKSB7CiAJCQlpZiAocCkgcC0+cmVmY291bnQrKzsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2NzNTUzNV9ncGlvLmMgYi9kcml2ZXJzL2NoYXIvY3M1NTM1X2dwaW8uYwppbmRleCA4Y2UzZjM0Li5jMDJkOWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY3M1NTM1X2dwaW8uYworKysgYi9kcml2ZXJzL2NoYXIvY3M1NTM1X2dwaW8uYwpAQCAtODIsNyArODIsNyBAQAogc3RhdGljIHNzaXplX3QgY3M1NTM1X2dwaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAogCQkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JdTMyCW0gPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXUzMgltID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWludAlpLCBqOwogCXUzMgliYXNlID0gZ3Bpb19iYXNlICsgY3M1NTM1X2xvd2hpZ2hfYmFzZShtKTsKIAl1MzIJbTAsIG0xOwpAQCAtMTE3LDcgKzExNyw3IEBACiBzdGF0aWMgc3NpemVfdCBjczU1MzVfZ3Bpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKIHsKLQl1MzIJbSA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJdTMyCW0gPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJdTMyCWJhc2UgPSBncGlvX2Jhc2UgKyBjczU1MzVfbG93aGlnaF9iYXNlKG0pOwogCWludAlyZF9iaXQgPSAxIDw8IChtICYgMHgwZik7CiAJaW50CWk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCmluZGV4IGU2MDhkYWQuLjNmZmEwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCisrKyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCkBAIC0xLDggKzEsNiBAQAogI3VuZGVmCUJMT0NLTU9WRQogI2RlZmluZQlaX1dBS0UKICN1bmRlZglaX0VYVF9DSEFSU19JTl9CVUZGRVIKLXN0YXRpYyBjaGFyIHJjc2lkW10gPQotIiRSZXZpc2lvbjogMi4zLjIuMjAgJCREYXRlOiAyMDA0LzAyLzI1IDE4OjE0OjE2ICQiOwogCiAvKgogICogIGxpbnV4L2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCkBAIC01OTMsMTggKzU5MSwyMCBAQAogICoKICAqLwogCisjZGVmaW5lIENZX1ZFUlNJT04JIjIuNCIKKwogLyogSWYgeW91IG5lZWQgdG8gaW5zdGFsbCBtb3JlIGJvYXJkcyB0aGFuIE5SX0NBUkRTLCBjaGFuZ2UgdGhlIGNvbnN0YW50CiAgICBpbiB0aGUgZGVmaW5pdGlvbiBiZWxvdy4gTm8gb3RoZXIgY2hhbmdlIGlzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IHVwIHRvCiAgICBlaWdodCBib2FyZHMuIEJleW9uZCB0aGF0IHlvdSdsbCBoYXZlIHRvIGV4dGVuZCBjeV9pc2FfYWRkcmVzc2VzLiAqLwogCi0jZGVmaW5lIE5SX0NBUkRTICAgICAgICA0CisjZGVmaW5lIE5SX0NBUkRTCTQKIAogLyoKICAgIElmIHRoZSB0b3RhbCBudW1iZXIgb2YgcG9ydHMgaXMgbGFyZ2VyIHRoYW4gTlJfUE9SVFMsIGNoYW5nZSB0aGlzCiAgICBjb25zdGFudCBpbiB0aGUgZGVmaW5pdGlvbiBiZWxvdy4gTm8gb3RoZXIgY2hhbmdlIGlzIG5lY2Vzc2FyeSB0bwogICAgc3VwcG9ydCBtb3JlIGJvYXJkcy9wb3J0cy4gKi8KIAotI2RlZmluZSBOUl9QT1JUUyAgICAgICAgMjU2CisjZGVmaW5lIE5SX1BPUlRTCTI1NgogCiAjZGVmaW5lIFpFX1YxX05QT1JUUwk2NAogI2RlZmluZSBaT19WMQkwCkBAIC02MjUsOSArNjI1LDkgQEAKICN1bmRlZglDWV9QQ0lfREVCVUcKIAogI2lmIDAKLSNkZWZpbmUgUEFVU0UgX19hc21fXygibm9wIik7CisjZGVmaW5lIFBBVVNFIF9fYXNtX18oIm5vcCIpCiAjZWxzZQotI2RlZmluZSBQQVVTRSA7CisjZGVmaW5lIFBBVVNFIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKIC8qCkBAIC02NjMsNyArNjYzLDcgQEAKIAkJZG8gewkJCQkJCVwKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmN5X2NhcmRbaW5mby0+Y2FyZF0uY2FyZF9sb2NrLCBmbGFncyk7IFwKIAkJfSB3aGlsZSAoMCkKLQkJCisKICNkZWZpbmUJQ1lfVU5MT0NLKGluZm8sZmxhZ3MpCQkJCQlcCiAJCWRvIHsJCQkJCQlcCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN5X2NhcmRbaW5mby0+Y2FyZF0uY2FyZF9sb2NrLCBmbGFncyk7IFwKQEAgLTY3NiwxNCArNjc2LDE0IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KIAotc3RhdGljIHZvaWQgY3lfdGhyb3R0bGUgKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgY3lfc2VuZF94Y2hhciAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7CitzdGF0aWMgdm9pZCBjeV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGN5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7CiAKICNkZWZpbmUgSVNfQ1lDX1ooY2FyZCkgKChjYXJkKS5udW1fY2hpcHMgPT0gLTEpCiAKICNkZWZpbmUgWl9GUEdBX0NIRUNLKGNhcmQpIFwKLSAgICAoKGN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSBcCi0JCSAoKGNhcmQpLmN0bF9hZGRyKSktPmluaXRfY3RybCkgJiAoMTw8MTcpKSAhPSAwKQorCSgoY3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopIFwKKwkJKChjYXJkKS5jdGxfYWRkcikpLT5pbml0X2N0cmwpICYgKDE8PDE3KSkgIT0gMCkKIAogI2RlZmluZSBJU1pMT0FERUQoY2FyZCkJKCgoWk9fVjE9PWN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSBcCiAJCQkoKGNhcmQpLmN0bF9hZGRyKSktPm1haWxfYm94XzApKSB8fCBcCkBAIC02OTgsOCArNjk4LDYgQEAKIAogI2RlZmluZSBTVERfQ09NX0ZMQUdTICgwKQogCi0jZGVmaW5lCUpJRkZJRVNfRElGRihuLCBqKQkoKGopIC0gKG4pKQotCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmN5X3NlcmlhbF9kcml2ZXI7CiAKICNpZmRlZiBDT05GSUdfSVNBCkBAIC03MTMsMjcgKzcxMSwyOCBAQAogKi8KIAogc3RhdGljIHVuc2lnbmVkIGludCBjeV9pc2FfYWRkcmVzc2VzW10gPSB7Ci0gICAgICAgIDB4RDAwMDAsCi0gICAgICAgIDB4RDIwMDAsCi0gICAgICAgIDB4RDQwMDAsCi0gICAgICAgIDB4RDYwMDAsCi0gICAgICAgIDB4RDgwMDAsCi0gICAgICAgIDB4REEwMDAsCi0gICAgICAgIDB4REMwMDAsCi0gICAgICAgIDB4REUwMDAsCi0gICAgICAgIDAsMCwwLDAsMCwwLDAsMAorCTB4RDAwMDAsCisJMHhEMjAwMCwKKwkweEQ0MDAwLAorCTB4RDYwMDAsCisJMHhEODAwMCwKKwkweERBMDAwLAorCTB4REMwMDAsCisJMHhERTAwMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiB9OworCiAjZGVmaW5lIE5SX0lTQV9BRERSUyBBUlJBWV9TSVpFKGN5X2lzYV9hZGRyZXNzZXMpCiAKICNpZmRlZiBNT0RVTEUKIHN0YXRpYyBsb25nIG1hZGRyW05SX0NBUkRTXSA9IHsgMCwgfTsKLXN0YXRpYyBpbnQgaXJxW05SX0NBUkRTXSAgPSB7IDAsIH07CitzdGF0aWMgaW50IGlycVtOUl9DQVJEU10gPSB7IDAsIH07CiAKIG1vZHVsZV9wYXJhbV9hcnJheShtYWRkciwgbG9uZywgTlVMTCwgMCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOwogI2VuZGlmCiAKLSNlbmRpZiAvKiBDT05GSUdfSVNBICovCisjZW5kaWYJCQkJLyogQ09ORklHX0lTQSAqLwogCiAvKiBUaGlzIGlzIHRoZSBwZXItY2FyZCBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGFkZHJlc3MsIGlycSwgbnVtYmVyIG9mCiAgICBjaGFubmVscywgZXRjLiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhIG1heGltdW0gb2YgTlJfQ0FSRFMgY2FyZHMuCkBAIC03NDUsNyArNzQ0LDcgQEAKICovCiBzdGF0aWMgc3RydWN0IGN5Y2xhZGVzX3BvcnQgY3lfcG9ydFtOUl9QT1JUU107CiAKLXN0YXRpYyBpbnQgY3lfbmV4dF9jaGFubmVsOyAvKiBuZXh0IG1pbm9yIGF2YWlsYWJsZSAqLworc3RhdGljIGludCBjeV9uZXh0X2NoYW5uZWw7CS8qIG5leHQgbWlub3IgYXZhaWxhYmxlICovCiAKIC8qCiAgKiBUaGlzIGlzIHVzZWQgdG8gbG9vayB1cCB0aGUgZGl2aXNvciBzcGVlZHMgYW5kIHRoZSB0aW1lb3V0cwpAQCAtNzU3LDM2ICs3NTYsNDIgQEAKICAqICAgICAyMAogICovCiBzdGF0aWMgaW50IGJhdWRfdGFibGVbXSA9IHsKLSAgICAgICAwLCAgICA1MCwgICAgNzUsICAgMTEwLCAgIDEzNCwgICAxNTAsICAgMjAwLCAgIDMwMCwgICA2MDAsICAxMjAwLAotICAgIDE4MDAsICAyNDAwLCAgNDgwMCwgIDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDc2ODAwLDExNTIwMCwxNTAwMDAsCi0gIDIzMDQwMCwgICAgIDB9OworCTAsIDUwLCA3NSwgMTEwLCAxMzQsIDE1MCwgMjAwLCAzMDAsIDYwMCwgMTIwMCwKKwkxODAwLCAyNDAwLCA0ODAwLCA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCA3NjgwMCwgMTE1MjAwLCAxNTAwMDAsCisJMjMwNDAwLCAwCit9OwogCi1zdGF0aWMgY2hhciBiYXVkX2NvXzI1W10gPSB7ICAvKiAyNSBNSHogY2xvY2sgb3B0aW9uIHRhYmxlICovCi0gICAgLyogdmFsdWUgPT4gICAgMDAgICAgMDEgICAwMiAgICAwMyAgICAwNCAqLwotICAgIC8qIGRpdmlkZSBieSAgICA4ICAgIDMyICAgMTI4ICAgNTEyICAyMDQ4ICovCi0gICAgMHgwMCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwMywgIDB4MDMsICAweDAzLCAgMHgwMiwKLSAgICAweDAyLCAgMHgwMiwgIDB4MDEsICAweDAxLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwfTsKK3N0YXRpYyBjaGFyIGJhdWRfY29fMjVbXSA9IHsJLyogMjUgTUh6IGNsb2NrIG9wdGlvbiB0YWJsZSAqLworCS8qIHZhbHVlID0+ICAgIDAwICAgIDAxICAgMDIgICAgMDMgICAgMDQgKi8KKwkvKiBkaXZpZGUgYnkgICAgOCAgICAzMiAgIDEyOCAgIDUxMiAgMjA0OCAqLworCTB4MDAsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDIsCisJMHgwMiwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKIAotc3RhdGljIGNoYXIgYmF1ZF9icHJfMjVbXSA9IHsgIC8qIDI1IE1IeiBiYXVkIHJhdGUgcGVyaW9kIHRhYmxlICovCi0gICAgMHgwMCwgIDB4ZjUsICAweGEzLCAgMHg2ZiwgIDB4NWMsICAweDUxLCAgMHhmNSwgIDB4YTMsICAweDUxLCAgMHhhMywKLSAgICAweDZkLCAgMHg1MSwgIDB4YTMsICAweDUxLCAgMHhhMywgIDB4NTEsICAweDM2LCAgMHgyOSwgIDB4MWIsICAweDE1fTsKK3N0YXRpYyBjaGFyIGJhdWRfYnByXzI1W10gPSB7CS8qIDI1IE1IeiBiYXVkIHJhdGUgcGVyaW9kIHRhYmxlICovCisJMHgwMCwgMHhmNSwgMHhhMywgMHg2ZiwgMHg1YywgMHg1MSwgMHhmNSwgMHhhMywgMHg1MSwgMHhhMywKKwkweDZkLCAweDUxLCAweGEzLCAweDUxLCAweGEzLCAweDUxLCAweDM2LCAweDI5LCAweDFiLCAweDE1Cit9OwogCi1zdGF0aWMgY2hhciBiYXVkX2NvXzYwW10gPSB7ICAvKiA2MCBNSHogY2xvY2sgb3B0aW9uIHRhYmxlIChDRDE0MDAgSikgKi8KLSAgICAvKiB2YWx1ZSA9PiAgICAwMCAgICAwMSAgIDAyICAgIDAzICAgIDA0ICovCi0gICAgLyogZGl2aWRlIGJ5ICAgIDggICAgMzIgICAxMjggICA1MTIgIDIwNDggKi8KLSAgICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDA0LCAgMHgwNCwgIDB4MDQsICAweDA0LCAgMHgwNCwgIDB4MDMsICAweDAzLAotICAgIDB4MDMsICAweDAyLCAgMHgwMiwgIDB4MDEsICAweDAxLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsCi0gICAgMHgwMH07CitzdGF0aWMgY2hhciBiYXVkX2NvXzYwW10gPSB7CS8qIDYwIE1IeiBjbG9jayBvcHRpb24gdGFibGUgKENEMTQwMCBKKSAqLworCS8qIHZhbHVlID0+ICAgIDAwICAgIDAxICAgMDIgICAgMDMgICAgMDQgKi8KKwkvKiBkaXZpZGUgYnkgICAgOCAgICAzMiAgIDEyOCAgIDUxMiAgMjA0OCAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDMsIDB4MDMsCisJMHgwMywgMHgwMiwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwCit9OwogCi1zdGF0aWMgY2hhciBiYXVkX2Jwcl82MFtdID0geyAgLyogNjAgTUh6IGJhdWQgcmF0ZSBwZXJpb2QgdGFibGUgKENEMTQwMCBKKSAqLwotICAgIDB4MDAsICAweDgyLCAgMHgyMSwgIDB4ZmYsICAweGRiLCAgMHhjMywgIDB4OTIsICAweDYyLCAgMHhjMywgIDB4NjIsCi0gICAgMHg0MSwgIDB4YzMsICAweDYyLCAgMHhjMywgIDB4NjIsICAweGMzLCAgMHg4MiwgIDB4NjIsICAweDQxLCAgMHgzMiwKLSAgICAweDIxfTsKK3N0YXRpYyBjaGFyIGJhdWRfYnByXzYwW10gPSB7CS8qIDYwIE1IeiBiYXVkIHJhdGUgcGVyaW9kIHRhYmxlIChDRDE0MDAgSikgKi8KKwkweDAwLCAweDgyLCAweDIxLCAweGZmLCAweGRiLCAweGMzLCAweDkyLCAweDYyLCAweGMzLCAweDYyLAorCTB4NDEsIDB4YzMsIDB4NjIsIDB4YzMsIDB4NjIsIDB4YzMsIDB4ODIsIDB4NjIsIDB4NDEsIDB4MzIsCisJMHgyMQorfTsKIAotc3RhdGljIGNoYXIgYmF1ZF9jb3IzW10gPSB7ICAvKiByZWNlaXZlIHRocmVzaG9sZCAqLwotICAgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsCi0gICAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwOSwgIDB4MDksICAweDA4LCAgMHgwOCwgIDB4MDgsICAweDA4LCAgMHgwNywKLSAgICAweDA3fTsKK3N0YXRpYyBjaGFyIGJhdWRfY29yM1tdID0gewkvKiByZWNlaXZlIHRocmVzaG9sZCAqLworCTB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsCisJMHgwYSwgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwNywKKwkweDA3Cit9OwogCiAvKgogICogVGhlIEN5Y2xhZGVzIGRyaXZlciBpbXBsZW1lbnRzIEhXIGZsb3cgY29udHJvbCBhcyBhbnkgc2VyaWFsIGRyaXZlci4KQEAgLTc5OSw0MiArODA0LDQyIEBACiAgKiBjYWJsZXMuCiAgKi8KIAotc3RhdGljIGNoYXIgcmZsb3dfdGhyW10gPSB7ICAvKiByZmxvdyB0aHJlc2hvbGQgKi8KLSAgICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MDAsICAweDAwLAotICAgIDB4MDAsICAweDAwLCAgMHgwMCwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsICAweDBhLCAgMHgwYSwgIDB4MGEsCi0gICAgMHgwYX07CitzdGF0aWMgY2hhciByZmxvd190aHJbXSA9IHsJLyogcmZsb3cgdGhyZXNob2xkICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLCAweDBhLAorCTB4MGEKK307CiAKIC8qICBUaGUgQ3ljbG9tLVllIGhhcyBwbGFjZWQgdGhlIHNlcXVlbnRpYWwgY2hpcHMgaW4gbm9uLXNlcXVlbnRpYWwKICAqICBhZGRyZXNzIG9yZGVyLiAgVGhpcyBsb29rLXVwIHRhYmxlIG92ZXJjb21lcyB0aGF0IHByb2JsZW0uCiAgKi8KLXN0YXRpYyBpbnQgY3lfY2hpcF9vZmZzZXQgW10gPQotICAgIHsgMHgwMDAwLAotICAgICAgMHgwNDAwLAotICAgICAgMHgwODAwLAotICAgICAgMHgwQzAwLAotICAgICAgMHgwMjAwLAotICAgICAgMHgwNjAwLAotICAgICAgMHgwQTAwLAotICAgICAgMHgwRTAwCi0gICAgfTsKK3N0YXRpYyBpbnQgY3lfY2hpcF9vZmZzZXRbXSA9IHsgMHgwMDAwLAorCTB4MDQwMCwKKwkweDA4MDAsCisJMHgwQzAwLAorCTB4MDIwMCwKKwkweDA2MDAsCisJMHgwQTAwLAorCTB4MEUwMAorfTsKIAogLyogUENJIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KIAotc3RhdGljIHVuc2lnbmVkIHNob3J0CWN5X3BjaV9uYm9hcmQ7Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQJY3lfaXNhX25ib2FyZDsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAljeV9uYm9hcmQ7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY3lfcGNpX25ib2FyZDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjeV9pc2FfbmJvYXJkOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGN5X25ib2FyZDsKICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQJY3lfcGNpX2Rldl9pZFtdID0gewotCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfTG8sCS8qIFBDSSA8IDFNYiAqLwotCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfSGksCS8qIFBDSSA+IDFNYiAqLwotCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzRZX0xvLAkvKiA0WSBQQ0kgPCAxTWIgKi8KLQkJCSAgICBQQ0lfREVWSUNFX0lEX0NZQ0xPTV80WV9IaSwJLyogNFkgUENJID4gMU1iICovCi0JCQkgICAgUENJX0RFVklDRV9JRF9DWUNMT01fOFlfTG8sCS8qIDhZIFBDSSA8IDFNYiAqLwotCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NXzhZX0hpLAkvKiA4WSBQQ0kgPiAxTWIgKi8KLQkJCSAgICBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9aX0xvLAkvKiBaIFBDSSA8IDFNYiAqLwotCQkJICAgIFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfSGksCS8qIFogUENJID4gMU1iICovCi0JCQkgICAgMAkJCQkvKiBlbmQgb2YgdGFibGUgKi8KLQkJCX07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY3lfcGNpX2Rldl9pZFtdID0geworCVBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfTG8sCS8qIFBDSSA8IDFNYiAqLworCVBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfSGksCS8qIFBDSSA+IDFNYiAqLworCVBDSV9ERVZJQ0VfSURfQ1lDTE9NXzRZX0xvLAkvKiA0WSBQQ0kgPCAxTWIgKi8KKwlQQ0lfREVWSUNFX0lEX0NZQ0xPTV80WV9IaSwJLyogNFkgUENJID4gMU1iICovCisJUENJX0RFVklDRV9JRF9DWUNMT01fOFlfTG8sCS8qIDhZIFBDSSA8IDFNYiAqLworCVBDSV9ERVZJQ0VfSURfQ1lDTE9NXzhZX0hpLAkvKiA4WSBQQ0kgPiAxTWIgKi8KKwlQQ0lfREVWSUNFX0lEX0NZQ0xPTV9aX0xvLAkvKiBaIFBDSSA8IDFNYiAqLworCVBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfSGksCS8qIFogUENJID4gMU1iICovCisJMAkJCS8qIGVuZCBvZiB0YWJsZSAqLworfTsKICNlbmRpZgogCiBzdGF0aWMgdm9pZCBjeV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKQEAgLTg0Miw5ICs4NDcsOSBAQAogc3RhdGljIGludCBjeXpfaXNzdWVfY21kKHN0cnVjdCBjeWNsYWRlc19jYXJkICosIHVjbG9uZywgdWNjaGFyLCB1Y2xvbmcpOwogI2lmZGVmIENPTkZJR19JU0EKIHN0YXRpYyB1bnNpZ25lZCBkZXRlY3RfaXNhX2lycSh2b2lkIF9faW9tZW0gKik7Ci0jZW5kaWYgLyogQ09ORklHX0lTQSAqLworI2VuZGlmCQkJCS8qIENPTkZJR19JU0EgKi8KIAotc3RhdGljIGludCBjeWNsYWRlc19nZXRfcHJvY19pbmZvKGNoYXIgKiwgY2hhciAqKiwgb2ZmX3QgLCBpbnQgLCBpbnQgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgY3ljbGFkZXNfZ2V0X3Byb2NfaW5mbyhjaGFyICosIGNoYXIgKiosIG9mZl90LCBpbnQsIGludCAqLCB2b2lkICopOwogCiAjaWZuZGVmIENPTkZJR19DWVpfSU5UUgogc3RhdGljIHZvaWQgY3l6X3BvbGwodW5zaWduZWQgbG9uZyk7CkBAIC04NTUsNDEgKzg2MCwzNiBAQAogc3RhdGljIGludCBjeXpfdGltZXJvbiA9IDA7CiBzdGF0aWMgREVGSU5FX1RJTUVSKGN5el90aW1lcmxpc3QsIGN5el9wb2xsLCAwLCAwKTsKIAotI2Vsc2UgLyogQ09ORklHX0NZWl9JTlRSICovCisjZWxzZQkJCQkvKiBDT05GSUdfQ1laX0lOVFIgKi8KIHN0YXRpYyB2b2lkIGN5el9yeF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGN5el9yeF9mdWxsX3RpbWVyW05SX1BPUlRTXTsKLSNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfQ1laX0lOVFIgKi8KIAotc3RhdGljIGlubGluZSBpbnQKLXNlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCitzdGF0aWMgaW5saW5lIGludCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sCisJCWNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCiB7CiAjaWZkZWYgU0VSSUFMX1BBUkFOT0lBX0NIRUNLCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmJhZG1hZ2ljID0KLSAgICAgICAgImN5YyBXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciBzZXJpYWwgc3RydWN0ICglcykgaW4gJXNcbiI7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmJhZGluZm8gPQotICAgICAgICAiY3ljIFdhcm5pbmc6IG51bGwgY3ljbGFkZXNfcG9ydCBmb3IgKCVzKSBpbiAlc1xuIjsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqYmFkcmFuZ2UgPQotICAgICAgICAiY3ljIFdhcm5pbmc6IGN5Y2xhZGVzX3BvcnQgb3V0IG9mIHJhbmdlIGZvciAoJXMpIGluICVzXG4iOworCWlmICghaW5mbykgeworCQlwcmludGsoImN5YyBXYXJuaW5nOiBudWxsIGN5Y2xhZGVzX3BvcnQgZm9yICglcykgaW4gJXNcbiIsCisJCQkJbmFtZSwgcm91dGluZSk7CisJCXJldHVybiAxOworCX0KIAotICAgIGlmICghaW5mbykgewotICAgICAgICBwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KKwlpZiAoKGxvbmcpaW5mbyA8IChsb25nKSgmY3lfcG9ydFswXSkgfHwKKwkJCShsb25nKSgmY3lfcG9ydFtOUl9QT1JUU10pIDwgKGxvbmcpaW5mbykgeworCQlwcmludGsoImN5YyBXYXJuaW5nOiBjeWNsYWRlc19wb3J0IG91dCBvZiByYW5nZSBmb3IgKCVzKSBpbiAiCisJCQkJIiVzXG4iLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQogCi0gICAgaWYoIChsb25nKWluZm8gPCAobG9uZykoJmN5X3BvcnRbMF0pCi0gICAgfHwgKGxvbmcpKCZjeV9wb3J0W05SX1BPUlRTXSkgPCAobG9uZylpbmZvICl7Ci0gICAgICAgIHByaW50ayhiYWRyYW5nZSwgbmFtZSwgcm91dGluZSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmIChpbmZvLT5tYWdpYyAhPSBDWUNMQURFU19NQUdJQykgewotICAgICAgICBwcmludGsoYmFkbWFnaWMsIG5hbWUsIHJvdXRpbmUpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9CisJaWYgKGluZm8tPm1hZ2ljICE9IENZQ0xBREVTX01BR0lDKSB7CisJCXByaW50aygiY3ljIFdhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHNlcmlhbCBzdHJ1Y3QgKCVzKSAiCisJCQkJImluICVzXG4iLCBuYW1lLCByb3V0aW5lKTsKKwkJcmV0dXJuIDE7CisJfQogI2VuZGlmCi0gICAgICAgIHJldHVybiAwOwotfSAvKiBzZXJpYWxfcGFyYW5vaWFfY2hlY2sgKi8KKwlyZXR1cm4gMDsKK30JCQkJLyogc2VyaWFsX3BhcmFub2lhX2NoZWNrICovCiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gc2NoZWR1bGUKQEAgLTg5NywxMyArODk3LDExIEBACiAgKiAoYWxzbyBrbm93biBhcyB0aGUgImJvdHRvbSBoYWxmIikuICBUaGlzIGNhbiBiZSBjYWxsZWQgYW55CiAgKiBudW1iZXIgb2YgdGltZXMgZm9yIGFueSBjaGFubmVsIHdpdGhvdXQgaGFybS4KICAqLwotc3RhdGljIGlubGluZSB2b2lkCi1jeV9zY2hlZF9ldmVudChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywgaW50IGV2ZW50KQorc3RhdGljIGlubGluZSB2b2lkIGN5X3NjaGVkX2V2ZW50KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCBpbnQgZXZlbnQpCiB7Ci0gICAgaW5mby0+ZXZlbnQgfD0gMSA8PCBldmVudDsgLyogcmVtZW1iZXIgd2hhdCBraW5kIG9mIGV2ZW50IGFuZCB3aG8gKi8KLSAgICBzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwotfSAvKiBjeV9zY2hlZF9ldmVudCAqLwotCisJaW5mby0+ZXZlbnQgfD0gMSA8PCBldmVudDsgLyogcmVtZW1iZXIgd2hhdCBraW5kIG9mIGV2ZW50IGFuZCB3aG8gKi8KKwlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOworfQkJCQkvKiBjeV9zY2hlZF9ldmVudCAqLwogCiAvKgogICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSAiYm90dG9tIGhhbGYiIHByb2Nlc3NpbmcgZm9yIHRoZQpAQCAtOTI2LDQ0ICs5MjQsNDAgQEAKICAqIGhhZCB0byBwb2xsIGV2ZXJ5IHBvcnQgdG8gc2VlIGlmIHRoYXQgcG9ydCBuZWVkZWQgc2VydmljaW5nLgogICovCiBzdGF0aWMgdm9pZAotZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK2RvX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKSBwcml2YXRlXzsKLSAgc3RydWN0IHR0eV9zdHJ1Y3QgICAgKnR0eTsKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCwgdHF1ZXVlKTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAgICAqdHR5OwogCi0gICAgdHR5ID0gaW5mby0+dHR5OwotICAgIGlmICghdHR5KQotICAgICAgICByZXR1cm47CisJdHR5ID0gaW5mby0+dHR5OworCWlmICghdHR5KQorCQlyZXR1cm47CiAKLSAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX0hBTkdVUCwgJmluZm8tPmV2ZW50KSkgewotICAgICAgICB0dHlfaGFuZ3VwKGluZm8tPnR0eSk7Ci0gICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKLSAgICAgICAgaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0gICAgfQotICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfT1BFTl9XQUtFVVAsICZpbmZvLT5ldmVudCkpIHsKLSAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwotICAgIH0KLSNpZmRlZiBDT05GSUdfQ1laX0lOVFIKLSAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX1pfUlhfRlVMTCwgJmluZm8tPmV2ZW50KSkgewotCWlmIChjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXS5mdW5jdGlvbiA9PSBOVUxMKSB7Ci0JICAgIGN5el9yeF9mdWxsX3RpbWVyW2luZm8tPmxpbmVdLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKLQkgICAgY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0uZnVuY3Rpb24gPSBjeXpfcnhfcmVzdGFydDsKLQkgICAgY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0uZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluZm87Ci0JICAgIGFkZF90aW1lcigmY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0pOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfSEFOR1VQLCAmaW5mby0+ZXZlbnQpKSB7CisJCXR0eV9oYW5ndXAoaW5mby0+dHR5KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCQkgICAgICAgIGluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwogCX0KLSAgICB9CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDeV9FVkVOVF9PUEVOX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworI2lmZGVmIENPTkZJR19DWVpfSU5UUgorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ3lfRVZFTlRfWl9SWF9GVUxMLCAmaW5mby0+ZXZlbnQpKSB7CisJCWlmIChjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXS5mdW5jdGlvbiA9PSBOVUxMKSB7CisJCQljeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXS5leHBpcmVzID0gamlmZmllcyArIDE7CisJCQljeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXS5mdW5jdGlvbiA9IGN5el9yeF9yZXN0YXJ0OworCQkJY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0uZGF0YSA9CisJCQkJCQkodW5zaWduZWQgbG9uZylpbmZvOworCQkJYWRkX3RpbWVyKCZjeXpfcnhfZnVsbF90aW1lcltpbmZvLT5saW5lXSk7CisJCX0KKwl9CiAjZW5kaWYKLSAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX0RFTFRBX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgewotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOwotICAgIH0KLSAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX1dSSVRFX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgewotICAgICAgICB0dHlfd2FrZXVwKHR0eSk7Ci0gICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKLSAgICB9CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDeV9FVkVOVF9ERUxUQV9XQUtFVVAsICZpbmZvLT5ldmVudCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCXR0eV93YWtldXAodHR5KTsKICNpZmRlZiBaX1dBS0UKLSAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX1NIVVRET1dOX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgewotICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPnNodXRkb3duX3dhaXQpOwotICAgIH0KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX1NIVVRET1dOX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKICNlbmRpZgogfSAvKiBkb19zb2Z0aW50ICovCiAKQEAgLTk3OCwzNDEgKzk3MiwzMzkgQEAKIAogICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIGluc2lkZSBzcGlubG9jay1wcm90ZWN0ZWQgY29kZS4KICAqLwotc3RhdGljIGludAotY3l5X2lzc3VlX2NtZCh2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwgdV9jaGFyIGNtZCwgaW50IGluZGV4KQorc3RhdGljIGludCBjeXlfaXNzdWVfY21kKHZvaWQgX19pb21lbSAqIGJhc2VfYWRkciwgdV9jaGFyIGNtZCwgaW50IGluZGV4KQogewotICB2b2xhdGlsZSBpbnQgIGk7CisJdm9sYXRpbGUgaW50IGk7CiAKLSAgICAvKiBDaGVjayB0byBzZWUgdGhhdCB0aGUgcHJldmlvdXMgY29tbWFuZCBoYXMgY29tcGxldGVkICovCi0gICAgZm9yKGkgPSAwIDsgaSA8IDEwMCA7IGkrKyl7Ci0JaWYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lDQ1I8PGluZGV4KSkgPT0gMCl7Ci0JICAgIGJyZWFrOworCS8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwcmV2aW91cyBjb21tYW5kIGhhcyBjb21wbGV0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKGN5X3JlYWRiKGJhc2VfYWRkciArIChDeUNDUiA8PCBpbmRleCkpID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMEwpOwogCX0KLQl1ZGVsYXkoMTBMKTsKLSAgICB9Ci0gICAgLyogaWYgdGhlIENDUiBuZXZlciBjbGVhcmVkLCB0aGUgcHJldmlvdXMgY29tbWFuZAotICAgICAgIGRpZG4ndCBmaW5pc2ggd2l0aGluIHRoZSAicmVhc29uYWJsZSB0aW1lIiAqLwotICAgIGlmIChpID09IDEwMCkJcmV0dXJuICgtMSk7CisJLyogaWYgdGhlIENDUiBuZXZlciBjbGVhcmVkLCB0aGUgcHJldmlvdXMgY29tbWFuZAorCSAgIGRpZG4ndCBmaW5pc2ggd2l0aGluIHRoZSAicmVhc29uYWJsZSB0aW1lIiAqLworCWlmIChpID09IDEwMCkKKwkJcmV0dXJuIC0xOwogCi0gICAgLyogSXNzdWUgdGhlIG5ldyBjb21tYW5kICovCi0gICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQ1I8PGluZGV4KSwgY21kKTsKKwkvKiBJc3N1ZSB0aGUgbmV3IGNvbW1hbmQgKi8KKwljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0NSIDw8IGluZGV4KSwgY21kKTsKIAotICAgIHJldHVybigwKTsKLX0gLyogY3l5X2lzc3VlX2NtZCAqLworCXJldHVybiAwOworfQkJCQkvKiBjeXlfaXNzdWVfY21kICovCiAKICNpZmRlZiBDT05GSUdfSVNBCiAvKiBJU0EgaW50ZXJydXB0IGRldGVjdGlvbiBjb2RlICovCi1zdGF0aWMgdW5zaWduZWQgCi1kZXRlY3RfaXNhX2lycSh2b2lkIF9faW9tZW0gKmFkZHJlc3MpCitzdGF0aWMgdW5zaWduZWQgZGV0ZWN0X2lzYV9pcnEodm9pZCBfX2lvbWVtICogYWRkcmVzcykKIHsKLSAgaW50IGlycTsKLSAgdW5zaWduZWQgbG9uZyBpcnFzLCBmbGFnczsKLSAgaW50IHNhdmVfeGlyLCBzYXZlX2NhcjsKLSAgaW50IGluZGV4ID0gMDsgLyogSVJRIHByb2JpbmcgaXMgb25seSBmb3IgSVNBICovCisJaW50IGlycTsKKwl1bnNpZ25lZCBsb25nIGlycXMsIGZsYWdzOworCWludCBzYXZlX3hpciwgc2F2ZV9jYXI7CisJaW50IGluZGV4ID0gMDsJCS8qIElSUSBwcm9iaW5nIGlzIG9ubHkgZm9yIElTQSAqLwogCi0gICAgLyogZm9yZ2V0IHBvc3NpYmxlIGluaXRpYWxseSBtYXNrZWQgYW5kIHBlbmRpbmcgSVJRICovCi0gICAgaXJxID0gcHJvYmVfaXJxX29mZihwcm9iZV9pcnFfb24oKSk7CisJLyogZm9yZ2V0IHBvc3NpYmxlIGluaXRpYWxseSBtYXNrZWQgYW5kIHBlbmRpbmcgSVJRICovCisJaXJxID0gcHJvYmVfaXJxX29mZihwcm9iZV9pcnFfb24oKSk7CiAKLSAgICAvKiBDbGVhciBpbnRlcnJ1cHRzIG9uIHRoZSBib2FyZCBmaXJzdCAqLwotICAgIGN5X3dyaXRlYihhZGRyZXNzICsgKEN5X0NsckludHI8PGluZGV4KSwgMCk7Ci0JCQkgICAgICAvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLworCS8qIENsZWFyIGludGVycnVwdHMgb24gdGhlIGJvYXJkIGZpcnN0ICovCisJY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lfQ2xySW50ciA8PCBpbmRleCksIDApOworCS8qIEN5X0NsckludHIgaXMgMHgxODAwICovCiAKLSAgICBpcnFzID0gcHJvYmVfaXJxX29uKCk7Ci0gICAgLyogV2FpdCAuLi4gKi8KLSAgICB1ZGVsYXkoNTAwMEwpOworCWlycXMgPSBwcm9iZV9pcnFfb24oKTsKKwkvKiBXYWl0IC4uLiAqLworCXVkZWxheSg1MDAwTCk7CiAKLSAgICAvKiBFbmFibGUgdGhlIFR4IGludGVycnVwdHMgb24gdGhlIENEMTQwMCAqLwotICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQljeV93cml0ZWIoYWRkcmVzcyArIChDeUNBUjw8aW5kZXgpLCAwKTsKLQljeXlfaXNzdWVfY21kKGFkZHJlc3MsIEN5Q0hBTl9DVEx8Q3lFTkJfWE1UUiwgaW5kZXgpOworCS8qIEVuYWJsZSB0aGUgVHggaW50ZXJydXB0cyBvbiB0aGUgQ0QxNDAwICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWN5X3dyaXRlYihhZGRyZXNzICsgKEN5Q0FSIDw8IGluZGV4KSwgMCk7CisJY3l5X2lzc3VlX2NtZChhZGRyZXNzLCBDeUNIQU5fQ1RMIHwgQ3lFTkJfWE1UUiwgaW5kZXgpOwogCi0JY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lDQVI8PGluZGV4KSwgMCk7Ci0JY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lTUkVSPDxpbmRleCksIAotCQljeV9yZWFkYihhZGRyZXNzICsgKEN5U1JFUjw8aW5kZXgpKSB8IEN5VHhSZHkpOwotICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwljeV93cml0ZWIoYWRkcmVzcyArIChDeUNBUiA8PCBpbmRleCksIDApOworCWN5X3dyaXRlYihhZGRyZXNzICsgKEN5U1JFUiA8PCBpbmRleCksCisJCSAgY3lfcmVhZGIoYWRkcmVzcyArIChDeVNSRVIgPDwgaW5kZXgpKSB8IEN5VHhSZHkpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotICAgIC8qIFdhaXQgLi4uICovCi0gICAgdWRlbGF5KDUwMDBMKTsKKwkvKiBXYWl0IC4uLiAqLworCXVkZWxheSg1MDAwTCk7CiAKLSAgICAvKiBDaGVjayB3aGljaCBpbnRlcnJ1cHQgaXMgaW4gdXNlICovCi0gICAgaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKwkvKiBDaGVjayB3aGljaCBpbnRlcnJ1cHQgaXMgaW4gdXNlICovCisJaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKIAotICAgIC8qIENsZWFuIHVwICovCi0gICAgc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihhZGRyZXNzICsgKEN5VElSPDxpbmRleCkpOwotICAgIHNhdmVfY2FyID0gY3lfcmVhZGIoYWRkcmVzcyArIChDeUNBUjw8aW5kZXgpKTsKLSAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeUNBUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDMpKTsKLSAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeVNSRVI8PGluZGV4KSwKLQljeV9yZWFkYihhZGRyZXNzICsgKEN5U1JFUjw8aW5kZXgpKSAmIH5DeVR4UmR5KTsKLSAgICBjeV93cml0ZWIoYWRkcmVzcyArIChDeVRJUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDNmKSk7Ci0gICAgY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lDQVI8PGluZGV4KSwgKHNhdmVfY2FyKSk7Ci0gICAgY3lfd3JpdGViKGFkZHJlc3MgKyAoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsKLQkJCSAgICAgIC8qIEN5X0NsckludHIgaXMgMHgxODAwICovCisJLyogQ2xlYW4gdXAgKi8KKwlzYXZlX3hpciA9ICh1X2NoYXIpIGN5X3JlYWRiKGFkZHJlc3MgKyAoQ3lUSVIgPDwgaW5kZXgpKTsKKwlzYXZlX2NhciA9IGN5X3JlYWRiKGFkZHJlc3MgKyAoQ3lDQVIgPDwgaW5kZXgpKTsKKwljeV93cml0ZWIoYWRkcmVzcyArIChDeUNBUiA8PCBpbmRleCksIChzYXZlX3hpciAmIDB4MykpOworCWN5X3dyaXRlYihhZGRyZXNzICsgKEN5U1JFUiA8PCBpbmRleCksCisJCSAgY3lfcmVhZGIoYWRkcmVzcyArIChDeVNSRVIgPDwgaW5kZXgpKSAmIH5DeVR4UmR5KTsKKwljeV93cml0ZWIoYWRkcmVzcyArIChDeVRJUiA8PCBpbmRleCksIChzYXZlX3hpciAmIDB4M2YpKTsKKwljeV93cml0ZWIoYWRkcmVzcyArIChDeUNBUiA8PCBpbmRleCksIChzYXZlX2NhcikpOworCWN5X3dyaXRlYihhZGRyZXNzICsgKEN5X0NsckludHIgPDwgaW5kZXgpLCAwKTsKKwkvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLwogCi0gICAgcmV0dXJuIChpcnEgPiAwKT8gaXJxIDogMDsKKwlyZXR1cm4gKGlycSA+IDApID8gaXJxIDogMDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfSVNBICovCisjZW5kaWYJCQkJLyogQ09ORklHX0lTQSAqLwogCi0vKiBUaGUgcmVhbCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGlzIGNhbGxlZAotICAgd2hlbmV2ZXIgdGhlIGNhcmQgd2FudHMgaXRzIGhhbmQgaGVsZC0tY2hhcnMKLSAgIHJlY2VpdmVkLCBvdXQgYnVmZmVyIGVtcHR5LCBtb2RlbSBjaGFuZ2UsIGV0Yy4KLSAqLwotc3RhdGljIGlycXJldHVybl90Ci1jeXlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyB2b2lkIGN5eV9pbnRyX2NoaXAoc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvLCBpbnQgY2hpcCwKKwkJCXZvaWQgX19pb21lbSAqIGJhc2VfYWRkciwgaW50IHN0YXR1cywgaW50IGluZGV4KQogewotICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvOwotICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwgKmNhcmRfYmFzZV9hZGRyOwotICBpbnQgY2hpcDsKLSAgaW50IHNhdmVfeGlyLCBjaGFubmVsLCBzYXZlX2NhcjsKLSAgY2hhciBkYXRhOwotICB2b2xhdGlsZSBpbnQgY2hhcl9jb3VudDsKLSAgaW50IG91dGNoOwotICBpbnQgaSxqLGluZGV4OwotICBpbnQgdG9vX21hbnk7Ci0gIGludCBoYWRfd29yazsKLSAgaW50IG1kbV9jaGFuZ2U7Ci0gIGludCBtZG1fc3RhdHVzOwotICBpbnQgbGVuOwotICAgIGlmKChjaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqKWRldl9pZCkgPT0gMCl7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl2b2xhdGlsZSBpbnQgY2hhcl9jb3VudDsKKwlpbnQgaSwgaiwgbGVuLCBtZG1fY2hhbmdlLCBtZG1fc3RhdHVzLCBvdXRjaDsKKwlpbnQgc2F2ZV94aXIsIGNoYW5uZWwsIHNhdmVfY2FyOworCWNoYXIgZGF0YTsKKworCWlmIChzdGF0dXMgJiBDeVNSUmVjZWl2ZSkgewkvKiByZWNlcHRpb24gaW50ZXJydXB0ICovCiAjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUwotCXByaW50aygiY3l5X2ludGVycnVwdDogc3B1cmlvdXMgaW50ZXJydXB0ICVkXG5cciIsIGlycSk7CisJCXByaW50aygiY3l5X2ludGVycnVwdDogcmN2ZCBpbnRyLCBjaGlwICVkXG5cciIsIGNoaXApOwogI2VuZGlmCi0gICAgICAgIHJldHVybiBJUlFfTk9ORTsgLyogc3B1cmlvdXMgaW50ZXJydXB0ICovCi0gICAgfQorCQkvKiBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgJiBjaGFuZ2UgdG8gdGhhdCBjb250ZXh0ICovCisJCXNwaW5fbG9jaygmY2luZm8tPmNhcmRfbG9jayk7CisJCXNhdmVfeGlyID0gKHVfY2hhcikgY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5UklSIDw8IGluZGV4KSk7CisJCWNoYW5uZWwgPSAodV9zaG9ydCkgKHNhdmVfeGlyICYgQ3lJUkNoYW5uZWwpOworCQlpID0gY2hhbm5lbCArIGNoaXAgKiA0ICsgY2luZm8tPmZpcnN0X2xpbmU7CisJCWluZm8gPSAmY3lfcG9ydFtpXTsKKwkJaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCQlzYXZlX2NhciA9IGN5X3JlYWRiKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCkpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwgc2F2ZV94aXIpOwogCi0gICAgY2FyZF9iYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyOwotICAgIGluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKKwkJLyogaWYgdGhlcmUgaXMgbm93aGVyZSB0byBwdXQgdGhlIGRhdGEsIGRpc2NhcmQgaXQgKi8KKwkJaWYgKGluZm8tPnR0eSA9PSAwKSB7CisJCQlqID0gKGN5X3JlYWRiKGJhc2VfYWRkciArIChDeVJJVlIgPDwgaW5kZXgpKSAmCisJCQkJQ3lJVlJNYXNrKTsKKwkJCWlmIChqID09IEN5SVZSUnhFeCkgewkvKiBleGNlcHRpb24gKi8KKwkJCQlkYXRhID0gY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5UkRTUiA8PCBpbmRleCkpOworCQkJfSBlbHNlIHsJLyogbm9ybWFsIGNoYXJhY3RlciByZWNlcHRpb24gKi8KKwkJCQljaGFyX2NvdW50ID0gY3lfcmVhZGIoYmFzZV9hZGRyICsKKwkJCQkJCShDeVJEQ1IgPDwgaW5kZXgpKTsKKwkJCQl3aGlsZSAoY2hhcl9jb3VudC0tKSB7CisJCQkJCWRhdGEgPSBjeV9yZWFkYihiYXNlX2FkZHIgKworCQkJCQkJKEN5UkRTUiA8PCBpbmRleCkpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsJLyogdGhlcmUgaXMgYW4gb3BlbiBwb3J0IGZvciB0aGlzIGRhdGEgKi8KKwkJCXR0eSA9IGluZm8tPnR0eTsKKwkJCWogPSAoY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5UklWUiA8PCBpbmRleCkpICYKKwkJCQkJQ3lJVlJNYXNrKTsKKwkJCWlmIChqID09IEN5SVZSUnhFeCkgewkvKiBleGNlcHRpb24gKi8KKwkJCQlkYXRhID0gY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5UkRTUiA8PCBpbmRleCkpOwogCisJCQkJLyogRm9yIHN0YXRpc3RpY3Mgb25seSAqLworCQkJCWlmIChkYXRhICYgQ3lCUkVBSykKKwkJCQkJaW5mby0+aWNvdW50LmJyaysrOworCQkJCWVsc2UgaWYgKGRhdGEgJiBDeUZSQU1FKQorCQkJCQlpbmZvLT5pY291bnQuZnJhbWUrKzsKKwkJCQllbHNlIGlmIChkYXRhICYgQ3lQQVJJVFkpCisJCQkJCWluZm8tPmljb3VudC5wYXJpdHkrKzsKKwkJCQllbHNlIGlmIChkYXRhICYgQ3lPVkVSUlVOKQorCQkJCQlpbmZvLT5pY291bnQub3ZlcnJ1bisrOwogCi0gICAgLyogVGhpcyBsb29wIGNoZWNrcyBhbGwgY2hpcHMgaW4gdGhlIGNhcmQuICBNYWtlIGEgbm90ZSB3aGVuZXZlcgotICAgICAgIF9hbnlfIGNoaXAgaGFkIHNvbWUgd29yayB0byBkbywgYXMgdGhpcyBpcyBjb25zaWRlcmVkIGFuCi0gICAgICAgaW5kaWNhdGlvbiB0aGF0IHRoZXJlIHdpbGwgYmUgbW9yZSB0byBkby4gIE9ubHkgd2hlbiBubyBjaGlwCi0gICAgICAgaGFzIGFueSB3b3JrIGRvZXMgdGhpcyBvdXRlcm1vc3QgbG9vcCBleGl0LgotICAgICAqLwotICAgIGRvewotICAgICAgICBoYWRfd29yayA9IDA7Ci0gICAgICAgIGZvciAoIGNoaXAgPSAwIDsgY2hpcCA8IGNpbmZvLT5udW1fY2hpcHMgOyBjaGlwICsrKSB7Ci0gICAgICAgICAgICBiYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7Ci0gICAgICAgICAgICB0b29fbWFueSA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoIChzdGF0dXMgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1ZSUjw8aW5kZXgpKSkgIT0gMHgwMCkgewotICAgICAgICAgICAgICAgIGhhZF93b3JrKys7Ci0gICAgICAgICAgICAgICAgLyogVGhlIHB1cnBvc2Ugb2YgdGhlIGZvbGxvd2luZyB0ZXN0IGlzIHRvIGVuc3VyZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgbm8gY2hpcCBjYW4gbW9ub3BvbGl6ZSB0aGUgZHJpdmVyLiAgVGhpcyBmb3JjZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgY2hpcHMgdG8gYmUgY2hlY2tlZCBpbiBhIHJvdW5kLXJvYmluIGZhc2hpb24gKGFmdGVyCi0gICAgICAgICAgICAgICAgICAgZHJhaW5pbmcgZWFjaCBvZiBhIGJ1bmNoICgxMDAwKSBvZiBjaGFyYWN0ZXJzKS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZigxMDAwPHRvb19tYW55KyspewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEN5U1JSZWNlaXZlKSB7IC8qIHJlY2VwdGlvbiBpbnRlcnJ1cHQgKi8KLSNpZmRlZiBDWV9ERUJVR19JTlRFUlJVUFRTCi0JCSAgICBwcmludGsoImN5eV9pbnRlcnJ1cHQ6IHJjdmQgaW50ciwgY2hpcCAlZFxuXHIiLCBjaGlwKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgJiBjaGFuZ2UgdG8gdGhhdCBjb250ZXh0ICovCi0JCSAgICBzcGluX2xvY2soJmNpbmZvLT5jYXJkX2xvY2spOwotICAgICAgICAgICAgICAgICAgICBzYXZlX3hpciA9ICh1X2NoYXIpIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSSVI8PGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSAodV9zaG9ydCApIChzYXZlX3hpciAmIEN5SVJDaGFubmVsKTsKLSAgICAgICAgICAgICAgICAgICAgaSA9IGNoYW5uZWwgKyBjaGlwICogNCArIGNpbmZvLT5maXJzdF9saW5lOwotICAgICAgICAgICAgICAgICAgICBpbmZvID0gJmN5X3BvcnRbaV07Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKLSAgICAgICAgICAgICAgICAgICAgc2F2ZV9jYXIgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCkpOwotICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCBzYXZlX3hpcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlcmUgaXMgbm93aGVyZSB0byBwdXQgdGhlIGRhdGEsIGRpc2NhcmQgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+dHR5ID09IDApewotICAgICAgICAgICAgICAgICAgICAgICAgaiA9IChjeV9yZWFkYihiYXNlX2FkZHIrKEN5UklWUjw8aW5kZXgpKSAmIEN5SVZSTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGogPT0gQ3lJVlJSeEV4ICkgeyAvKiBleGNlcHRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEU1I8PGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBub3JtYWwgY2hhcmFjdGVyIHJlY2VwdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY291bnQgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRDUjw8aW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjaGFyX2NvdW50LS0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEU1I8PGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9ZWxzZXsgLyogdGhlcmUgaXMgYW4gb3BlbiBwb3J0IGZvciB0aGlzIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHR0eSA9IGluZm8tPnR0eTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGogPSAoY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJJVlI8PGluZGV4KSkgJiBDeUlWUk1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBqID09IEN5SVZSUnhFeCApIHsgLyogZXhjZXB0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOwotCi0JCQkgICAgLyogRm9yIHN0YXRpc3RpY3Mgb25seSAqLwotCQkJICAgIGlmIChkYXRhICYgQ3lCUkVBSykKLQkJCQlpbmZvLT5pY291bnQuYnJrKys7Ci0JCQkgICAgZWxzZSBpZihkYXRhICYgQ3lGUkFNRSkKLQkJCQlpbmZvLT5pY291bnQuZnJhbWUrKzsKLQkJCSAgICBlbHNlIGlmKGRhdGEgJiBDeVBBUklUWSkKLQkJCQlpbmZvLT5pY291bnQucGFyaXR5Kys7Ci0JCQkgICAgZWxzZSBpZihkYXRhICYgQ3lPVkVSUlVOKQotCQkJCWluZm8tPmljb3VudC5vdmVycnVuKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhICYgaW5mby0+aWdub3JlX3N0YXR1c19tYXNrKXsKLQkJCQlpbmZvLT5pY291bnQucngrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhICYgaW5mby0+cmVhZF9zdGF0dXNfbWFzayl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhICYgQ3lCUkVBSyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKSwgVFRZX0JSRUFLKTsKKwkJCQlpZiAoZGF0YSAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzaykgewogCQkJCQlpbmZvLT5pY291bnQucngrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19TQUsodHR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihkYXRhICYgQ3lGUkFNRSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKSwgVFRZX0ZSQU1FKTsKLQkJCQkJaW5mby0+aWNvdW50LnJ4Kys7Ci0JCQkJCWluZm8tPmlkbGVfc3RhdHMuZnJhbWVfZXJycysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZGF0YSAmIEN5UEFSSVRZKXsKLQkJCQkJLyogUGllY2VzIG9mIHNldmVuLi4uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjeV9yZWFkYihiYXNlX2FkZHIrKEN5UkRTUjw8aW5kZXgpKSwgVFRZX1BBUklUWSk7Ci0JCQkJCWluZm8tPmljb3VudC5yeCsrOwotCQkJCQlpbmZvLT5pZGxlX3N0YXRzLnBhcml0eV9lcnJzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihkYXRhICYgQ3lPVkVSUlVOKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKLQkJCQkJaW5mby0+aWNvdW50LnJ4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGZsaXAgYnVmZmVyIGl0c2VsZiBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93aW5nLCB3ZSBzdGlsbCBsb3NlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5leHQgaW5jb21pbmcgY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVJEU1I8PGluZGV4KSksIFRUWV9GUkFNRSk7Ci0JCQkJICAgICAgICBpbmZvLT5pY291bnQucngrKzsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlpZiAodHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCAxKSkgeworCQkJCQlpZiAoZGF0YSAmIGluZm8tPnJlYWRfc3RhdHVzX21hc2spIHsKKwkJCQkJCWlmIChkYXRhICYgQ3lCUkVBSykgeworCQkJCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKAorCQkJCQkJCQl0dHksCisJCQkJCQkJCWN5X3JlYWRiKAorCQkJCQkJCQliYXNlX2FkZHIgKworCQkJCQkJCQkoQ3lSRFNSIDw8CisJCQkJCQkJCQlpbmRleCkpLAorCQkJCQkJCQlUVFlfQlJFQUspOworCQkJCQkJCWluZm8tPmljb3VudC5yeCsrOworCQkJCQkJCWlmIChpbmZvLT5mbGFncyAmCisJCQkJCQkJICAgIEFTWU5DX1NBSykgeworCQkJCQkJCQlkb19TQUsodHR5KTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKGRhdGEgJiBDeUZSQU1FKSB7CisJCQkJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoCisJCQkJCQkJCXR0eSwKKwkJCQkJCQkJY3lfcmVhZGIoCisJCQkJCQkJCWJhc2VfYWRkciArCisJCQkJCQkJCShDeVJEU1IgPDwKKwkJCQkJCQkJCWluZGV4KSksCisJCQkJCQkJCVRUWV9GUkFNRSk7CisJCQkJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisJCQkJCQkJaW5mby0+aWRsZV9zdGF0cy4KKwkJCQkJCQkJZnJhbWVfZXJycysrOworCQkJCQkJfSBlbHNlIGlmIChkYXRhICYgQ3lQQVJJVFkpIHsKKwkJCQkJCQkvKiBQaWVjZXMgb2Ygc2V2ZW4uLi4gKi8KKwkJCQkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcigKKwkJCQkJCQkJdHR5LAorCQkJCQkJCQljeV9yZWFkYigKKwkJCQkJCQkJYmFzZV9hZGRyICsKKwkJCQkJCQkJKEN5UkRTUiA8PAorCQkJCQkJCQkJaW5kZXgpKSwKKwkJCQkJCQkJVFRZX1BBUklUWSk7CisJCQkJCQkJaW5mby0+aWNvdW50LnJ4Kys7CisJCQkJCQkJaW5mby0+aWRsZV9zdGF0cy4KKwkJCQkJCQkJcGFyaXR5X2VycnMrKzsKKwkJCQkJCX0gZWxzZSBpZiAoZGF0YSAmIEN5T1ZFUlJVTikgeworCQkJCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKAorCQkJCQkJCQl0dHksIDAsCisJCQkJCQkJCVRUWV9PVkVSUlVOKTsKKwkJCQkJCQlpbmZvLT5pY291bnQucngrKzsKKwkJCQkJCS8qIElmIHRoZSBmbGlwIGJ1ZmZlciBpdHNlbGYgaXMKKwkJCQkJCSAgIG92ZXJmbG93aW5nLCB3ZSBzdGlsbCBsb3NlCisJCQkJCQkgICB0aGUgbmV4dCBpbmNvbWluZyBjaGFyYWN0ZXIuCisJCQkJCQkgKi8KKwkJCQkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcigKKwkJCQkJCQkJdHR5LAorCQkJCQkJCQljeV9yZWFkYigKKwkJCQkJCQkJYmFzZV9hZGRyICsKKwkJCQkJCQkJKEN5UkRTUiA8PAorCQkJCQkJCQkJaW5kZXgpKSwKKwkJCQkJCQkJVFRZX0ZSQU1FKTsKKwkJCQkJCQlpbmZvLT5pY291bnQucngrKzsKKwkJCQkJCQlpbmZvLT5pZGxlX3N0YXRzLgorCQkJCQkJCQlvdmVycnVucysrOworCQkJCQkvKiBUaGVzZSB0d28gY29uZGl0aW9ucyBtYXkgaW1wbHkgKi8KKwkJCQkJLyogYSBub3JtYWwgcmVhZCBzaG91bGQgYmUgZG9uZS4gKi8KKwkJCQkJLyogfWVsc2UgaWYoZGF0YSAmIEN5VElNRU9VVCl7ICovCisJCQkJCS8qIH1lbHNlIGlmKGRhdGEgJiBDeVNQRUNIQVIpeyAqLworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcigKKwkJCQkJCQkJdHR5LCAwLAorCQkJCQkJCQlUVFlfTk9STUFMKTsKKwkJCQkJCQlpbmZvLT5pY291bnQucngrKzsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwKKwkJCQkJCQkJVFRZX05PUk1BTCk7CisJCQkJCQlpbmZvLT5pY291bnQucngrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qIHRoZXJlIHdhcyBhIHNvZnR3YXJlIGJ1ZmZlcgorCQkJCQkgICBvdmVycnVuIGFuZCBub3RoaW5nIGNvdWxkIGJlCisJCQkJCSAgIGRvbmUgYWJvdXQgaXQhISEgKi8KKwkJCQkJaW5mby0+aWNvdW50LmJ1Zl9vdmVycnVuKys7CiAJCQkJCWluZm8tPmlkbGVfc3RhdHMub3ZlcnJ1bnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXNlIHR3byBjb25kaXRpb25zIG1heSBpbXBseSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYSBub3JtYWwgcmVhZCBzaG91bGQgYmUgZG9uZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIH1lbHNlIGlmKGRhdGEgJiBDeVRJTUVPVVQpeyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogfWVsc2UgaWYoZGF0YSAmIEN5U1BFQ0hBUil7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0JCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX05PUk1BTCk7Ci0JCQkJICAgICAgICBpbmZvLT5pY291bnQucngrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0JCQkJICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX05PUk1BTCk7Ci0JCQkJICAgIGluZm8tPmljb3VudC5yeCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBhIHNvZnR3YXJlIGJ1ZmZlcgotCQkJCSAgIG92ZXJydW4gYW5kIG5vdGhpbmcgY291bGQgYmUKLQkJCQkgICBkb25lIGFib3V0IGl0ISEhICovCi0JCQkJaW5mby0+aWNvdW50LmJ1Zl9vdmVycnVuKys7Ci0JCQkJaW5mby0+aWRsZV9zdGF0cy5vdmVycnVucysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIG5vcm1hbCBjaGFyYWN0ZXIgcmVjZXB0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9hZCAjIGNoYXJzIGF2YWlsYWJsZSBmcm9tIHRoZSBjaGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jb3VudCA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRENSPDxpbmRleCkpOworCQkJCX0KKwkJCX0gZWxzZSB7CS8qIG5vcm1hbCBjaGFyYWN0ZXIgcmVjZXB0aW9uICovCisJCQkJLyogbG9hZCAjIGNoYXJzIGF2YWlsYWJsZSBmcm9tIHRoZSBjaGlwICovCisJCQkJY2hhcl9jb3VudCA9IGN5X3JlYWRiKGJhc2VfYWRkciArCisJCQkJCQkoQ3lSRENSIDw8IGluZGV4KSk7CiAKICNpZmRlZiBDWV9FTkFCTEVfTU9OSVRPUklORwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraW5mby0+bW9uLmludF9jb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tb24uY2hhcl9jb3VudCArPSBjaGFyX2NvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyX2NvdW50ID4gaW5mby0+bW9uLmNoYXJfbWF4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1vbi5jaGFyX21heCA9IGNoYXJfY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bW9uLmNoYXJfbGFzdCA9IGNoYXJfY291bnQ7CisJCQkJKytpbmZvLT5tb24uaW50X2NvdW50OworCQkJCWluZm8tPm1vbi5jaGFyX2NvdW50ICs9IGNoYXJfY291bnQ7CisJCQkJaWYgKGNoYXJfY291bnQgPiBpbmZvLT5tb24uY2hhcl9tYXgpCisJCQkJCWluZm8tPm1vbi5jaGFyX21heCA9IGNoYXJfY291bnQ7CisJCQkJaW5mby0+bW9uLmNoYXJfbGFzdCA9IGNoYXJfY291bnQ7CiAjZW5kaWYKLQkJCSAgICBsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGNoYXJfY291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGxlbi0tKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSRFNSPDxpbmRleCkpOwotCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgZGF0YSwgVFRZX05PUk1BTCk7Ci0JCQkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2J5dGVzKys7Ci0JCQkJaW5mby0+aWNvdW50LnJ4Kys7CisJCQkJbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBjaGFyX2NvdW50KTsKKwkJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQkJZGF0YSA9IGN5X3JlYWRiKGJhc2VfYWRkciArCisJCQkJCQkJKEN5UkRTUiA8PCBpbmRleCkpOworCQkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGEsCisJCQkJCQkJVFRZX05PUk1BTCk7CisJCQkJCWluZm8tPmlkbGVfc3RhdHMucmVjdl9ieXRlcysrOworCQkJCQlpbmZvLT5pY291bnQucngrKzsKICNpZmRlZiBDWV8xNllfSEFDSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTBMKTsKKwkJCQkJdWRlbGF5KDEwTCk7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmlkbGVfc3RhdHMucmVjdl9pZGxlID0gamlmZmllczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQl9CisJCQkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2lkbGUgPSBqaWZmaWVzOworCQkJfQogCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc2VydmljZSAqLwotICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJJUjw8aW5kZXgpLCAoc2F2ZV94aXIgJiAweDNmKSk7Ci0gICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksIChzYXZlX2NhcikpOwotCQkgICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOwotICAgICAgICAgICAgICAgIH0KKwkJfQorCQkvKiBlbmQgb2Ygc2VydmljZSAqLworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5UklSIDw8IGluZGV4KSwgKHNhdmVfeGlyICYgMHgzZikpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwgKHNhdmVfY2FyKSk7CisJCXNwaW5fdW5sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKwl9CiAKLQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBDeVNSVHJhbnNtaXQpIHsgLyogdHJhbnNtaXNzaW9uIGludGVycnVwdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBTaW5jZSB3ZSBvbmx5IGdldCBoZXJlIHdoZW4gdGhlIHRyYW5zbWl0IGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICBpcyBlbXB0eSwgd2Uga25vdyB3ZSBjYW4gYWx3YXlzIHN0dWZmIGEgZG96ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycy4gKi8KKwlpZiAoc3RhdHVzICYgQ3lTUlRyYW5zbWl0KSB7CS8qIHRyYW5zbWlzc2lvbiBpbnRlcnJ1cHQgKi8KKwkJLyogU2luY2Ugd2Ugb25seSBnZXQgaGVyZSB3aGVuIHRoZSB0cmFuc21pdCBidWZmZXIKKwkJICAgaXMgZW1wdHksIHdlIGtub3cgd2UgY2FuIGFsd2F5cyBzdHVmZiBhIGRvemVuCisJCSAgIGNoYXJhY3RlcnMuICovCiAjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUwotCQkgICAgcHJpbnRrKCJjeXlfaW50ZXJydXB0OiB4bWl0IGludHIsIGNoaXAgJWRcblxyIiwgY2hpcCk7CisJCXByaW50aygiY3l5X2ludGVycnVwdDogeG1pdCBpbnRyLCBjaGlwICVkXG5cciIsIGNoaXApOwogI2VuZGlmCiAKLSAgICAgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBjaGFubmVsICYgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLwotCQkgICAgc3Bpbl9sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5VElSPDxpbmRleCkpOwotICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gKHVfc2hvcnQgKSAoc2F2ZV94aXIgJiBDeUlSQ2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBjaGFubmVsICsgY2hpcCAqIDQgKyBjaW5mby0+Zmlyc3RfbGluZTsKLSAgICAgICAgICAgICAgICAgICAgc2F2ZV9jYXIgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCkpOwotICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCBzYXZlX3hpcik7CisJCS8qIGRldGVybWluZSB0aGUgY2hhbm5lbCAmIGNoYW5nZSB0byB0aGF0IGNvbnRleHQgKi8KKwkJc3Bpbl9sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKwkJc2F2ZV94aXIgPSAodV9jaGFyKSBjeV9yZWFkYihiYXNlX2FkZHIgKyAoQ3lUSVIgPDwgaW5kZXgpKTsKKwkJY2hhbm5lbCA9ICh1X3Nob3J0KSAoc2F2ZV94aXIgJiBDeUlSQ2hhbm5lbCk7CisJCWkgPSBjaGFubmVsICsgY2hpcCAqIDQgKyBjaW5mby0+Zmlyc3RfbGluZTsKKwkJc2F2ZV9jYXIgPSBjeV9yZWFkYihiYXNlX2FkZHIgKyAoQ3lDQVIgPDwgaW5kZXgpKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksIHNhdmVfeGlyKTsKIAotICAgICAgICAgICAgICAgICAgICAvKiB2YWxpZGF0ZSB0aGUgcG9ydCMgKGFzIGNvbmZpZ3VyZWQgYW5kIG9wZW4pICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoaSA8IDApIHx8IChOUl9QT1JUUyA8PSBpKSApewotICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgfkN5VHhSZHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0eGVuZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbmZvID0gJmN5X3BvcnRbaV07Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKLSAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+dHR5ID09IDApewotICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgfkN5VHhSZHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0eGRvbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKwkJLyogdmFsaWRhdGUgdGhlIHBvcnQjIChhcyBjb25maWd1cmVkIGFuZCBvcGVuKSAqLworCQlpZiAoKGkgPCAwKSB8fCAoTlJfUE9SVFMgPD0gaSkpIHsKKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSwKKwkJCQkgIGN5X3JlYWRiKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpKSAmCisJCQkJICB+Q3lUeFJkeSk7CisJCQlnb3RvIHR4ZW5kOworCQl9CisJCWluZm8gPSAmY3lfcG9ydFtpXTsKKwkJaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCQlpZiAoaW5mby0+dHR5ID09IDApIHsKKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSwKKwkJCQkgIGN5X3JlYWRiKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpKSAmCisJCQkJICB+Q3lUeFJkeSk7CisJCQlnb3RvIHR4ZG9uZTsKKwkJfQogCi0gICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgdGhlIG9uLWNoaXAgc3BhY2UgZm9yIG91dGJvdW5kIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgY2hhcl9jb3VudCA9IGluZm8tPnhtaXRfZmlmb19zaXplOworCQkvKiBsb2FkIHRoZSBvbi1jaGlwIHNwYWNlIGZvciBvdXRib3VuZCBkYXRhICovCisJCWNoYXJfY291bnQgPSBpbmZvLT54bWl0X2ZpZm9fc2l6ZTsKIAotICAgICAgICAgICAgICAgICAgICBpZihpbmZvLT54X2NoYXIpIHsgLyogc2VuZCBzcGVjaWFsIGNoYXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGNoID0gaW5mby0+eF9jaGFyOwotICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lURFI8PGluZGV4KSwgb3V0Y2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jb3VudC0tOworCQlpZiAoaW5mby0+eF9jaGFyKSB7CS8qIHNlbmQgc3BlY2lhbCBjaGFyICovCisJCQlvdXRjaCA9IGluZm8tPnhfY2hhcjsKKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lURFIgPDwgaW5kZXgpLCBvdXRjaCk7CisJCQljaGFyX2NvdW50LS07CiAJCQlpbmZvLT5pY291bnQudHgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnhfY2hhciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KKwkJCWluZm8tPnhfY2hhciA9IDA7CisJCX0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnJlYWtvbiB8fCBpbmZvLT5icmVha29mZikgeworCQlpZiAoaW5mby0+YnJlYWtvbiB8fCBpbmZvLT5icmVha29mZikgewogCQkJaWYgKGluZm8tPmJyZWFrb24pIHsKLQkJCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5VERSPDxpbmRleCksIDApOyAKLQkJCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5VERSPDxpbmRleCksIDB4ODEpOwotCQkJICAgIGluZm8tPmJyZWFrb24gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY291bnQgLT0gMjsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5VERSIDw8IGluZGV4KSwgMCk7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVREUiA8PCBpbmRleCksIDB4ODEpOworCQkJCWluZm8tPmJyZWFrb24gPSAwOworCQkJCWNoYXJfY291bnQgLT0gMjsKIAkJCX0KIAkJCWlmIChpbmZvLT5icmVha29mZikgewotCQkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lURFI8PGluZGV4KSwgMCk7IAotCQkJICAgIGN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lURFI8PGluZGV4KSwgMHg4Myk7Ci0JCQkgICAgaW5mby0+YnJlYWtvZmYgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfY291bnQgLT0gMjsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5VERSIDw8IGluZGV4KSwgMCk7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVREUiA8PCBpbmRleCksIDB4ODMpOworCQkJCWluZm8tPmJyZWFrb2ZmID0gMDsKKwkJCQljaGFyX2NvdW50IC09IDI7CiAJCQl9Ci0gICAgICAgICAgICAgICAgICAgIH0KKwkJfQogCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaGFyX2NvdW50LS0gPiAwKXsKLQkJCWlmICghaW5mby0+eG1pdF9jbnQpewotCQkJICAgIGlmIChjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSZDeVR4TXB0eSkgewotCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAotCQkJCQkgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYKLQkJCQkJICB+Q3lUeE1wdHkpOwotCQkJICAgIH0gZWxzZSB7Ci0JCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCi0JCQkJCSAgKChjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKQotCQkJCQkgICAgJiB+Q3lUeFJkeSkKLQkJCQkJICAgfCBDeVR4TXB0eSkpOwotCQkJICAgIH0KLQkJCSAgICBnb3RvIHR4ZG9uZTsKKwkJd2hpbGUgKGNoYXJfY291bnQtLSA+IDApIHsKKwkJCWlmICghaW5mby0+eG1pdF9jbnQpIHsKKwkJCQlpZiAoY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5U1JFUiA8PCBpbmRleCkpICYKKwkJCQkJCUN5VHhNcHR5KSB7CisJCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSwKKwkJCQkJCWN5X3JlYWRiKGJhc2VfYWRkciArCisJCQkJCQkJKEN5U1JFUiA8PCBpbmRleCkpICYKKwkJCQkJCX5DeVR4TXB0eSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpLAorCQkJCQkJKGN5X3JlYWRiKGJhc2VfYWRkciArCisJCQkJCQkgIAkoQ3lTUkVSIDw8IGluZGV4KSkgJgorCQkJCQkJfkN5VHhSZHkpIHwgQ3lUeE1wdHkpOworCQkJCX0KKwkJCQlnb3RvIHR4ZG9uZTsKIAkJCX0KLQkJCWlmIChpbmZvLT54bWl0X2J1ZiA9PSAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKLQkJCQljeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIAorCQkJaWYgKGluZm8tPnhtaXRfYnVmID09IDApIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5U1JFUiA8PCBpbmRleCksCisJCQkJCWN5X3JlYWRiKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpKSYKIAkJCQkJfkN5VHhSZHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHhkb25lOworCQkJCWdvdG8gdHhkb25lOwogCQkJfQotCQkJaWYgKGluZm8tPnR0eS0+c3RvcHBlZCB8fCBpbmZvLT50dHktPmh3X3N0b3BwZWQpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpLAotCQkJCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgCisJCQlpZiAoaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSwKKwkJCQkJY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5U1JFUiA8PCBpbmRleCkpJgogCQkJCQl+Q3lUeFJkeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0eGRvbmU7CisJCQkJZ290byB0eGRvbmU7CiAJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBCZWNhdXNlIHRoZSBFbWJlZGRlZCBUcmFuc21pdCBDb21tYW5kcyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGVuYWJsZWQsIHdlIG11c3QgY2hlY2sgdG8gc2VlIGlmIHRoZQorCQkJLyogQmVjYXVzZSB0aGUgRW1iZWRkZWQgVHJhbnNtaXQgQ29tbWFuZHMgaGF2ZQorCQkJICAgYmVlbiBlbmFibGVkLCB3ZSBtdXN0IGNoZWNrIHRvIHNlZSBpZiB0aGUKIAkJCSAgIGVzY2FwZSBjaGFyYWN0ZXIsIE5VTEwsIGlzIGJlaW5nIHNlbnQuICBJZiBpdAogCQkJICAgaXMsIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMgcm9vbSBmb3IgaXQKIAkJCSAgIHRvIGJlIGRvdWJsZWQgaW4gdGhlIG91dHB1dCBzdHJlYW0uICBUaGVyZWZvcmUKQEAgLTEzMjEsMTI1ICsxMzEzLDE4MiBAQAogCQkJICAgYWZ0ZXIgdGhlIGNoZWNrIGZvciBhIE5VTEwgb3V0cHV0IGNoYXJhY3Rlci4KIAkJCSAgIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlcmUgbWF5IG5vdCBiZQogCQkJICAgcm9vbSBmb3IgdGhlIHR3byBjaGFycyBuZWVkZWQgdG8gc2VuZCBhIE5VTEwuKQotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRjaCA9IGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggb3V0Y2ggKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT54bWl0X2NudC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VERSPDxpbmRleCksIG91dGNoKTsKLQkJCSAgICBpbmZvLT5pY291bnQudHgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoYXJfY291bnQgPiAxKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+eG1pdF9jbnQtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIDEpCi0JCQkJCQkgICAgICAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VERSPDxpbmRleCksIAotCQkJCQkgIG91dGNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lURFI8PGluZGV4KSwgMCk7CisJCQkgKi8KKwkJCW91dGNoID0gaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXTsKKwkJCWlmIChvdXRjaCkgeworCQkJCWluZm8tPnhtaXRfY250LS07CisJCQkJaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIDEpICYKKwkJCQkJCShTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVREUiA8PCBpbmRleCksIG91dGNoKTsKIAkJCQlpbmZvLT5pY291bnQudHgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jb3VudC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoY2hhcl9jb3VudCA+IDEpIHsKKwkJCQkJaW5mby0+eG1pdF9jbnQtLTsKKwkJCQkJaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIDEpJgorCQkJCQkJKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVREUiA8PCBpbmRleCksCisJCQkJCQlvdXRjaCk7CisJCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lURFIgPDwgaW5kZXgpLAorCQkJCQkJMCk7CisJCQkJCWluZm8tPmljb3VudC50eCsrOworCQkJCQljaGFyX2NvdW50LS07CisJCQkJfSBlbHNlIHsKKwkJCQl9CisJCQl9CisJCX0KIAotICAgICAgICB0eGRvbmU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgewotICAgICAgICAgICAgICAgICAgICAgICAgY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfV1JJVEVfV0FLRVVQKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICB0eGVuZDoKLSAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIHNlcnZpY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lUSVI8PGluZGV4KSwgCi0JCQkgICAgICAoc2F2ZV94aXIgJiAweDNmKSk7Ci0gICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksIChzYXZlX2NhcikpOwotCQkgICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOwotICAgICAgICAgICAgICAgIH0KK3R4ZG9uZToKKwkJaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7CisJCQljeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9XUklURV9XQUtFVVApOworCQl9Cit0eGVuZDoKKwkJLyogZW5kIG9mIHNlcnZpY2UgKi8KKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVRJUiA8PCBpbmRleCksIChzYXZlX3hpciAmIDB4M2YpKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksIChzYXZlX2NhcikpOworCQlzcGluX3VubG9jaygmY2luZm8tPmNhcmRfbG9jayk7CisJfQogCi0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIEN5U1JNb2RlbSkgeyAgICAgICAgLyogbW9kZW0gaW50ZXJydXB0ICovCisJaWYgKHN0YXR1cyAmIEN5U1JNb2RlbSkgewkvKiBtb2RlbSBpbnRlcnJ1cHQgKi8KIAotICAgICAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgdGhlIGNoYW5uZWwgJiBjaGFuZ2UgdG8gdGhhdCBjb250ZXh0ICovCi0JCSAgICBzcGluX2xvY2soJmNpbmZvLT5jYXJkX2xvY2spOwotICAgICAgICAgICAgICAgICAgICBzYXZlX3hpciA9ICh1X2NoYXIpIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNSVI8PGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSAodV9zaG9ydCApIChzYXZlX3hpciAmIEN5SVJDaGFubmVsKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWwgKyBjaGlwICogNAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNpbmZvLT5maXJzdF9saW5lXTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOwotICAgICAgICAgICAgICAgICAgICBzYXZlX2NhciA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksIHNhdmVfeGlyKTsKKwkJLyogZGV0ZXJtaW5lIHRoZSBjaGFubmVsICYgY2hhbmdlIHRvIHRoYXQgY29udGV4dCAqLworCQlzcGluX2xvY2soJmNpbmZvLT5jYXJkX2xvY2spOworCQlzYXZlX3hpciA9ICh1X2NoYXIpIGN5X3JlYWRiKGJhc2VfYWRkciArIChDeU1JUiA8PCBpbmRleCkpOworCQljaGFubmVsID0gKHVfc2hvcnQpIChzYXZlX3hpciAmIEN5SVJDaGFubmVsKTsKKwkJaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWwgKyBjaGlwICogNCArIGNpbmZvLT5maXJzdF9saW5lXTsKKwkJaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCQlzYXZlX2NhciA9IGN5X3JlYWRiKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCkpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwgc2F2ZV94aXIpOwogCi0gICAgICAgICAgICAgICAgICAgIG1kbV9jaGFuZ2UgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TUlTUjw8aW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgbWRtX3N0YXR1cyA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpKTsKKwkJbWRtX2NoYW5nZSA9IGN5X3JlYWRiKGJhc2VfYWRkciArIChDeU1JU1IgPDwgaW5kZXgpKTsKKwkJbWRtX3N0YXR1cyA9IGN5X3JlYWRiKGJhc2VfYWRkciArIChDeU1TVlIxIDw8IGluZGV4KSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+dHR5ID09IDApey8qIG5vIHBsYWNlIGZvciBkYXRhLCBpZ25vcmUgaXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKwkJaWYgKGluZm8tPnR0eSA9PSAwKSB7CS8qIG5vIHBsYWNlIGZvciBkYXRhLCBpZ25vcmUgaXQgKi8KKwkJCTsKKwkJfSBlbHNlIHsKIAkJCWlmIChtZG1fY2hhbmdlICYgQ3lBTllfREVMVEEpIHsKLQkJCSAgICAvKiBGb3Igc3RhdGlzdGljcyBvbmx5ICovCi0JCQkgICAgaWYgKG1kbV9jaGFuZ2UgJiBDeURDRCkJaW5mby0+aWNvdW50LmRjZCsrOwotCQkJICAgIGlmIChtZG1fY2hhbmdlICYgQ3lDVFMpCWluZm8tPmljb3VudC5jdHMrKzsKLQkJCSAgICBpZiAobWRtX2NoYW5nZSAmIEN5RFNSKQlpbmZvLT5pY291bnQuZHNyKys7Ci0JCQkgICAgaWYgKG1kbV9jaGFuZ2UgJiBDeVJJKQlpbmZvLT5pY291bnQucm5nKys7CisJCQkJLyogRm9yIHN0YXRpc3RpY3Mgb25seSAqLworCQkJCWlmIChtZG1fY2hhbmdlICYgQ3lEQ0QpCisJCQkJCWluZm8tPmljb3VudC5kY2QrKzsKKwkJCQlpZiAobWRtX2NoYW5nZSAmIEN5Q1RTKQorCQkJCQlpbmZvLT5pY291bnQuY3RzKys7CisJCQkJaWYgKG1kbV9jaGFuZ2UgJiBDeURTUikKKwkJCQkJaW5mby0+aWNvdW50LmRzcisrOworCQkJCWlmIChtZG1fY2hhbmdlICYgQ3lSSSkKKwkJCQkJaW5mby0+aWNvdW50LnJuZysrOwogCi0JCQkgICAgY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfREVMVEFfV0FLRVVQKTsKKwkJCQljeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9ERUxUQV9XQUtFVVApOwogCQkJfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZigobWRtX2NoYW5nZSAmIEN5RENEKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtZG1fc3RhdHVzICYgQ3lEQ0QpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9zY2hlZF9ldmVudChpbmZvLAotCQkJCSAgICBDeV9FVkVOVF9PUEVOX1dBS0VVUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sCi0JCQkJICAgIEN5X0VWRU5UX0hBTkdVUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1kbV9jaGFuZ2UgJiBDeUNUUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mby0+dHR5LT5od19zdG9wcGVkKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobWRtX3N0YXR1cyAmIEN5Q1RTKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5X3N0YXJ0IGlzbid0IHVzZWQKLQkJCQkgICAgICAgICBiZWNhdXNlLi4uICEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDeVR4UmR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sCi0JCQkJICAgICAgICBDeV9FVkVOVF9XUklURV9XQUtFVVApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEobWRtX3N0YXR1cyAmIEN5Q1RTKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjeV9zdG9wIGlzbid0IHVzZWQKLQkJCQkgICAgICAgICBiZWNhdXNlIC4uLiAhISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkN5VHhSZHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYobWRtX2NoYW5nZSAmIEN5RFNSKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1kbV9jaGFuZ2UgJiBDeVJJKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc2VydmljZSAqLwotICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1JUjw8aW5kZXgpLCAKLQkJCSAgICAgIChzYXZlX3hpciAmIDB4M2YpKTsKLSAgICAgICAgICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgc2F2ZV9jYXIpOwotCQkgICAgc3Bpbl91bmxvY2soJmNpbmZvLT5jYXJkX2xvY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgLyogZW5kIHdoaWxlIHN0YXR1cyAhPSAwICovCi0gICAgICAgIH0gICAgICAgICAgICAvKiBlbmQgbG9vcCBmb3IgY2hpcHMuLi4gKi8KLSAgICB9IHdoaWxlKGhhZF93b3JrKTsKKwkJCWlmICgobWRtX2NoYW5nZSAmIEN5RENEKSAmJgorCQkJCQkoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DSEVDS19DRCkpIHsKKwkJCQlpZiAobWRtX3N0YXR1cyAmIEN5RENEKSB7CisJCQkJCWN5X3NjaGVkX2V2ZW50KGluZm8sCisJCQkJCQkJQ3lfRVZFTlRfT1BFTl9XQUtFVVApOworCQkJCX0gZWxzZSB7CisJCQkJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX0hBTkdVUCk7CisJCQkJfQorCQkJfQorCQkJaWYgKChtZG1fY2hhbmdlICYgQ3lDVFMpICYmCisJCQkJCShpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSkgeworCQkJCWlmIChpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKKwkJCQkJaWYgKG1kbV9zdGF0dXMgJiBDeUNUUykgeworCQkJCQkJLyogY3lfc3RhcnQgaXNuJ3QgdXNlZAorCQkJCQkJICAgYmVjYXVzZS4uLiAhISEgKi8KKwkJCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCQkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsKKwkJCQkJCQkoQ3lTUkVSIDw8IGluZGV4KSwKKwkJCQkJCQljeV9yZWFkYihiYXNlX2FkZHIgKworCQkJCQkJCQkoQ3lTUkVSIDw8CisJCQkJCQkJCQlpbmRleCkpfAorCQkJCQkJCUN5VHhSZHkpOworCQkJCQkJY3lfc2NoZWRfZXZlbnQoaW5mbywKKwkJCQkJCQlDeV9FVkVOVF9XUklURV9XQUtFVVApOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCEobWRtX3N0YXR1cyAmIEN5Q1RTKSkgeworCQkJCQkJLyogY3lfc3RvcCBpc24ndCB1c2VkCisJCQkJCQkgICBiZWNhdXNlIC4uLiAhISEgKi8KKwkJCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsKKwkJCQkJCQkoQ3lTUkVSIDw8IGluZGV4KSwKKwkJCQkJCQljeV9yZWFkYihiYXNlX2FkZHIgKworCQkJCQkJCQkoQ3lTUkVSIDw8CisJCQkJCQkJCWluZGV4KSkgJgorCQkJCQkJCX5DeVR4UmR5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChtZG1fY2hhbmdlICYgQ3lEU1IpIHsKKwkJCX0KKwkJCWlmIChtZG1fY2hhbmdlICYgQ3lSSSkgeworCQkJfQorCQl9CisJCS8qIGVuZCBvZiBzZXJ2aWNlICovCisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lNSVIgPDwgaW5kZXgpLCAoc2F2ZV94aXIgJiAweDNmKSk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lDQVIgPDwgaW5kZXgpLCBzYXZlX2Nhcik7CisJCXNwaW5fdW5sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKwl9Cit9CiAKLSAgIC8qIGNsZWFyIGludGVycnVwdHMgKi8KLSAgIHNwaW5fbG9jaygmY2luZm8tPmNhcmRfbG9jayk7Ci0gICBjeV93cml0ZWIoY2FyZF9iYXNlX2FkZHIgKyAoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3lfQ2xySW50ciBpcyAweDE4MDAgKi8KLSAgIHNwaW5fdW5sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKLSAgIHJldHVybiBJUlFfSEFORExFRDsKLX0gLyogY3l5X2ludGVycnVwdCAqLworLyogVGhlIHJlYWwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBpcyBjYWxsZWQKKyAgIHdoZW5ldmVyIHRoZSBjYXJkIHdhbnRzIGl0cyBoYW5kIGhlbGQtLWNoYXJzCisgICByZWNlaXZlZCwgb3V0IGJ1ZmZlciBlbXB0eSwgbW9kZW0gY2hhbmdlLCBldGMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBjeXlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwgKmNhcmRfYmFzZV9hZGRyOworCWludCBjaGlwOworCWludCBpbmRleDsKKwlpbnQgdG9vX21hbnk7CisJaW50IGhhZF93b3JrOworCisJaWYgKChjaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqKWRldl9pZCkgPT0gMCkgeworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJcHJpbnRrKCJjeXlfaW50ZXJydXB0OiBzcHVyaW91cyBpbnRlcnJ1cHQgJWRcblxyIiwgaXJxKTsKKyNlbmRpZgorCQlyZXR1cm4gSVJRX05PTkU7CS8qIHNwdXJpb3VzIGludGVycnVwdCAqLworCX0KKworCWNhcmRfYmFzZV9hZGRyID0gY2luZm8tPmJhc2VfYWRkcjsKKwlpbmRleCA9IGNpbmZvLT5idXNfaW5kZXg7CisKKwkvKiBUaGlzIGxvb3AgY2hlY2tzIGFsbCBjaGlwcyBpbiB0aGUgY2FyZC4gIE1ha2UgYSBub3RlIHdoZW5ldmVyCisJICAgX2FueV8gY2hpcCBoYWQgc29tZSB3b3JrIHRvIGRvLCBhcyB0aGlzIGlzIGNvbnNpZGVyZWQgYW4KKwkgICBpbmRpY2F0aW9uIHRoYXQgdGhlcmUgd2lsbCBiZSBtb3JlIHRvIGRvLiAgT25seSB3aGVuIG5vIGNoaXAKKwkgICBoYXMgYW55IHdvcmsgZG9lcyB0aGlzIG91dGVybW9zdCBsb29wIGV4aXQuCisJICovCisJZG8geworCQloYWRfd29yayA9IDA7CisJCWZvciAoY2hpcCA9IDA7IGNoaXAgPCBjaW5mby0+bnVtX2NoaXBzOyBjaGlwKyspIHsKKwkJCWJhc2VfYWRkciA9IGNpbmZvLT5iYXNlX2FkZHIgKworCQkJCQkoY3lfY2hpcF9vZmZzZXRbY2hpcF0gPDwgaW5kZXgpOworCQkJdG9vX21hbnkgPSAwOworCQkJd2hpbGUgKChzdGF0dXMgPSBjeV9yZWFkYihiYXNlX2FkZHIgKworCQkJCQkJKEN5U1ZSUiA8PCBpbmRleCkpKSAhPSAweDAwKSB7CisJCQkJaGFkX3dvcmsrKzsKKwkJCS8qIFRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0byBlbnN1cmUgdGhhdAorCQkJICAgbm8gY2hpcCBjYW4gbW9ub3BvbGl6ZSB0aGUgZHJpdmVyLiAgVGhpcyBmb3JjZXMgdGhlCisJCQkgICBjaGlwcyB0byBiZSBjaGVja2VkIGluIGEgcm91bmQtcm9iaW4gZmFzaGlvbiAoYWZ0ZXIKKwkJCSAgIGRyYWluaW5nIGVhY2ggb2YgYSBidW5jaCAoMTAwMCkgb2YgY2hhcmFjdGVycykuCisJCQkgKi8KKwkJCQlpZiAoMTAwMCA8IHRvb19tYW55KyspIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWN5eV9pbnRyX2NoaXAoY2luZm8sIGNoaXAsIGJhc2VfYWRkciwgc3RhdHVzLAorCQkJCQkJaW5kZXgpOworCQkJfQorCQl9CisJfSB3aGlsZSAoaGFkX3dvcmspOworCisJLyogY2xlYXIgaW50ZXJydXB0cyAqLworCXNwaW5fbG9jaygmY2luZm8tPmNhcmRfbG9jayk7CisJY3lfd3JpdGViKGNhcmRfYmFzZV9hZGRyICsgKEN5X0NsckludHIgPDwgaW5kZXgpLCAwKTsKKwkvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLworCXNwaW5fdW5sb2NrKCZjaW5mby0+Y2FyZF9sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CQkJCS8qIGN5eV9pbnRlcnJ1cHQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKiBFbmQgb2YgYmxvY2sgb2YgQ3ljbG9tLVkgc3BlY2lmaWMgY29kZSAqKioqKioqKioqLwpAQCAtMTQ0Nyw2NDMgKzE0OTYsNjU1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQKLWN5el9mZXRjaF9tc2coIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbywKLQkgICAgdWNsb25nICpjaGFubmVsLCB1Y2NoYXIgKmNtZCwgdWNsb25nICpwYXJhbSkKK2N5el9mZXRjaF9tc2coc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvLAorCQl1Y2xvbmcgKiBjaGFubmVsLCB1Y2NoYXIgKiBjbWQsIHVjbG9uZyAqIHBhcmFtKQogewotICBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOwotICBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7Ci0gIHN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7Ci0gIHVuc2lnbmVkIGxvbmcgbG9jX2Rvb3JiZWxsOworCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CisJdW5zaWduZWQgbG9uZyBsb2NfZG9vcmJlbGw7CiAKLSAgICBmaXJtX2lkID0gY2luZm8tPmJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0gICAgaWYgKCFJU1pMT0FERUQoKmNpbmZvKSl7Ci0JcmV0dXJuICgtMSk7Ci0gICAgfQotICAgIHpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwotICAgIGJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJZmlybV9pZCA9IGNpbmZvLT5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCWlmICghSVNaTE9BREVEKCpjaW5mbykpIHsKKwkJcmV0dXJuIC0xOworCX0KKwl6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJgorCQkJMHhmZmZmZik7CisJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKIAotICAgIGxvY19kb29yYmVsbCA9IGN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKQotICAgICAgICAgICAgICAgICAgICAgKGNpbmZvLT5jdGxfYWRkcikpLT5sb2NfZG9vcmJlbGwpOwotICAgIGlmIChsb2NfZG9vcmJlbGwpewotCSpjbWQgPSAoY2hhcikoMHhmZiAmIGxvY19kb29yYmVsbCk7Ci0JKmNoYW5uZWwgPSBjeV9yZWFkbCgmYm9hcmRfY3RybC0+ZndjbWRfY2hhbm5lbCk7Ci0JKnBhcmFtID0gKHVjbG9uZyljeV9yZWFkbCgmYm9hcmRfY3RybC0+ZndjbWRfcGFyYW0pOwotCWN5X3dyaXRlbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikoY2luZm8tPmN0bF9hZGRyKSktPmxvY19kb29yYmVsbCwgCi0gICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYpOwotCXJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0gLyogY3l6X2ZldGNoX21zZyAqLworCWxvY19kb29yYmVsbCA9IGN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKQorCQkJCSAgKGNpbmZvLT5jdGxfYWRkcikpLT5sb2NfZG9vcmJlbGwpOworCWlmIChsb2NfZG9vcmJlbGwpIHsKKwkJKmNtZCA9IChjaGFyKSgweGZmICYgbG9jX2Rvb3JiZWxsKTsKKwkJKmNoYW5uZWwgPSBjeV9yZWFkbCgmYm9hcmRfY3RybC0+ZndjbWRfY2hhbm5lbCk7CisJCSpwYXJhbSA9ICh1Y2xvbmcpIGN5X3JlYWRsKCZib2FyZF9jdHJsLT5md2NtZF9wYXJhbSk7CisJCWN5X3dyaXRlbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikoY2luZm8tPmN0bF9hZGRyKSktPgorCQkJICBsb2NfZG9vcmJlbGwsIDB4ZmZmZmZmZmYpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CQkJCS8qIGN5el9mZXRjaF9tc2cgKi8KIAogc3RhdGljIGludAotY3l6X2lzc3VlX2NtZCggc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvLAotCSAgICB1Y2xvbmcgY2hhbm5lbCwgdWNjaGFyIGNtZCwgdWNsb25nIHBhcmFtKQorY3l6X2lzc3VlX2NtZChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8sCisJCXVjbG9uZyBjaGFubmVsLCB1Y2NoYXIgY21kLCB1Y2xvbmcgcGFyYW0pCiB7Ci0gIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7Ci0gIHN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKLSAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKLSAgdW5zaWduZWQgbG9uZyBfX2lvbWVtICpwY2lfZG9vcmJlbGw7Ci0gIGludCBpbmRleDsKKwlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKKwlzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqcGNpX2Rvb3JiZWxsOworCWludCBpbmRleDsKIAotICAgIGZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKLSAgICBpZiAoIUlTWkxPQURFRCgqY2luZm8pKXsKLQlyZXR1cm4gKC0xKTsKLSAgICB9Ci0gICAgemZ3X2N0cmwgPSBjaW5mby0+YmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7Ci0gICAgYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwlmaXJtX2lkID0gY2luZm8tPmJhc2VfYWRkciArIElEX0FERFJFU1M7CisJaWYgKCFJU1pMT0FERUQoKmNpbmZvKSkgeworCQlyZXR1cm4gLTE7CisJfQorCXpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmCisJCQkweGZmZmZmKTsKKwlib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOwogCi0gICAgaW5kZXggPSAwOwotICAgIHBjaV9kb29yYmVsbCA9ICYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSAoY2luZm8tPmN0bF9hZGRyKSktPnBjaV9kb29yYmVsbDsKLSAgICB3aGlsZSggKGN5X3JlYWRsKHBjaV9kb29yYmVsbCkgJiAweGZmKSAhPSAwKXsKLSAgICAgICAgaWYgKGluZGV4KysgPT0gMTAwMCl7Ci0JICAgIHJldHVybigoaW50KShjeV9yZWFkbChwY2lfZG9vcmJlbGwpICYgMHhmZikpOwotICAgICAgICB9Ci0JdWRlbGF5KDUwTCk7Ci0gICAgfQotICAgIGN5X3dyaXRlbCgmYm9hcmRfY3RybC0+aGNtZF9jaGFubmVsLCBjaGFubmVsKTsKLSAgICBjeV93cml0ZWwoJmJvYXJkX2N0cmwtPmhjbWRfcGFyYW0gLCBwYXJhbSk7Ci0gICAgY3lfd3JpdGVsKHBjaV9kb29yYmVsbCwgKGxvbmcpY21kKTsKKwlpbmRleCA9IDA7CisJcGNpX2Rvb3JiZWxsID0KKwkgICAgJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopKGNpbmZvLT5jdGxfYWRkcikpLT5wY2lfZG9vcmJlbGw7CisJd2hpbGUgKChjeV9yZWFkbChwY2lfZG9vcmJlbGwpICYgMHhmZikgIT0gMCkgeworCQlpZiAoaW5kZXgrKyA9PSAxMDAwKSB7CisJCQlyZXR1cm4gKGludCkoY3lfcmVhZGwocGNpX2Rvb3JiZWxsKSAmIDB4ZmYpOworCQl9CisJCXVkZWxheSg1MEwpOworCX0KKwljeV93cml0ZWwoJmJvYXJkX2N0cmwtPmhjbWRfY2hhbm5lbCwgY2hhbm5lbCk7CisJY3lfd3JpdGVsKCZib2FyZF9jdHJsLT5oY21kX3BhcmFtLCBwYXJhbSk7CisJY3lfd3JpdGVsKHBjaV9kb29yYmVsbCwgKGxvbmcpY21kKTsKIAotICAgIHJldHVybigwKTsKLX0gLyogY3l6X2lzc3VlX2NtZCAqLworCXJldHVybiAwOworfQkJCQkvKiBjeXpfaXNzdWVfY21kICovCiAKIHN0YXRpYyB2b2lkCiBjeXpfaGFuZGxlX3J4KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLAotCSAgICAgIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmwsCi0JICAgICAgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKmJ1Zl9jdHJsKQorCQl2b2xhdGlsZSBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICogY2hfY3RybCwKKwkJdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKiBidWZfY3RybCkKIHsKLSAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07Ci0gIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7Ci0gIHZvbGF0aWxlIGludCBjaGFyX2NvdW50OwotICBpbnQgbGVuOworCXN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbyA9ICZjeV9jYXJkW2luZm8tPmNhcmRdOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisJdm9sYXRpbGUgaW50IGNoYXJfY291bnQ7CisJaW50IGxlbjsKICNpZmRlZiBCTE9DS01PVkUKLSAgaW50IHNtYWxsX2NvdW50OworCWludCBzbWFsbF9jb3VudDsKICNlbHNlCi0gIGNoYXIgZGF0YTsKKwljaGFyIGRhdGE7CiAjZW5kaWYKLSAgdm9sYXRpbGUgdWNsb25nIHJ4X3B1dCwgcnhfZ2V0LCBuZXdfcnhfZ2V0LCByeF9idWZzaXplLCByeF9idWZhZGRyOworCXZvbGF0aWxlIHVjbG9uZyByeF9wdXQsIHJ4X2dldCwgbmV3X3J4X2dldCwgcnhfYnVmc2l6ZSwgcnhfYnVmYWRkcjsKIAotICAgIHJ4X2dldCA9IG5ld19yeF9nZXQgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnJ4X2dldCk7Ci0gICAgcnhfcHV0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9wdXQpOwotICAgIHJ4X2J1ZnNpemUgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnJ4X2J1ZnNpemUpOwotICAgIHJ4X2J1ZmFkZHIgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnJ4X2J1ZmFkZHIpOwotICAgIGlmIChyeF9wdXQgPj0gcnhfZ2V0KQotCWNoYXJfY291bnQgPSByeF9wdXQgLSByeF9nZXQ7Ci0gICAgZWxzZQotCWNoYXJfY291bnQgPSByeF9wdXQgLSByeF9nZXQgKyByeF9idWZzaXplOworCXJ4X2dldCA9IG5ld19yeF9nZXQgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnJ4X2dldCk7CisJcnhfcHV0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9wdXQpOworCXJ4X2J1ZnNpemUgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnJ4X2J1ZnNpemUpOworCXJ4X2J1ZmFkZHIgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnJ4X2J1ZmFkZHIpOworCWlmIChyeF9wdXQgPj0gcnhfZ2V0KQorCQljaGFyX2NvdW50ID0gcnhfcHV0IC0gcnhfZ2V0OworCWVsc2UKKwkJY2hhcl9jb3VudCA9IHJ4X3B1dCAtIHJ4X2dldCArIHJ4X2J1ZnNpemU7CiAKLSAgICBpZiAoIGNoYXJfY291bnQgKSB7Ci0JaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOwotCWluZm8tPmppZmZpZXNbMV0gPSBqaWZmaWVzOworCWlmIChjaGFyX2NvdW50KSB7CisJCWluZm8tPmxhc3RfYWN0aXZlID0gamlmZmllczsKKwkJaW5mby0+amlmZmllc1sxXSA9IGppZmZpZXM7CiAKICNpZmRlZiBDWV9FTkFCTEVfTU9OSVRPUklORwotCWluZm8tPm1vbi5pbnRfY291bnQrKzsKLQlpbmZvLT5tb24uY2hhcl9jb3VudCArPSBjaGFyX2NvdW50OwotCWlmIChjaGFyX2NvdW50ID4gaW5mby0+bW9uLmNoYXJfbWF4KQotCSAgICBpbmZvLT5tb24uY2hhcl9tYXggPSBjaGFyX2NvdW50OwotCWluZm8tPm1vbi5jaGFyX2xhc3QgPSBjaGFyX2NvdW50OworCQlpbmZvLT5tb24uaW50X2NvdW50Kys7CisJCWluZm8tPm1vbi5jaGFyX2NvdW50ICs9IGNoYXJfY291bnQ7CisJCWlmIChjaGFyX2NvdW50ID4gaW5mby0+bW9uLmNoYXJfbWF4KQorCQkJaW5mby0+bW9uLmNoYXJfbWF4ID0gY2hhcl9jb3VudDsKKwkJaW5mby0+bW9uLmNoYXJfbGFzdCA9IGNoYXJfY291bnQ7CiAjZW5kaWYKLQlpZih0dHkgPT0gMCl7Ci0JICAgIC8qIGZsdXNoIHJlY2VpdmVkIGNoYXJhY3RlcnMgKi8KLQkgICAgbmV3X3J4X2dldCA9IChuZXdfcnhfZ2V0ICsgY2hhcl9jb3VudCkgJiAocnhfYnVmc2l6ZSAtIDEpOwotCSAgICBpbmZvLT5yZmx1c2hfY291bnQrKzsKLQl9ZWxzZXsKKwkJaWYgKHR0eSA9PSAwKSB7CisJCQkvKiBmbHVzaCByZWNlaXZlZCBjaGFyYWN0ZXJzICovCisJCQluZXdfcnhfZ2V0ID0gKG5ld19yeF9nZXQgKyBjaGFyX2NvdW50KSAmCisJCQkJCShyeF9idWZzaXplIC0gMSk7CisJCQlpbmZvLT5yZmx1c2hfY291bnQrKzsKKwkJfSBlbHNlIHsKICNpZmRlZiBCTE9DS01PVkUKLQkgICAgLyogd2UnZCBsaWtlIHRvIHVzZSBtZW1jcHkodCwgZiwgbikgYW5kIG1lbXNldChzLCBjLCBjb3VudCkKLQkgICAgICAgZm9yIHBlcmZvcm1hbmNlLCBidXQgYmVjYXVzZSBvZiBidWZmZXIgYm91bmRhcmllcywgdGhlcmUKLQkgICAgICAgbWF5IGJlIHNldmVyYWwgc3RlcHMgdG8gdGhlIG9wZXJhdGlvbiAqLwotCSAgICB3aGlsZSgwIDwgKHNtYWxsX2NvdW50ID0gCi0JCSAgICAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIChyeF9idWZzaXplIC0gbmV3X3J4X2dldCksCi0JCSAgICAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIChUVFlfRkxJUEJVRl9TSVpFIC0gdHR5LT5mbGlwLmNvdW50KSwgY2hhcl9jb3VudCkpCi0JCSApKSB7Ci0JCW1lbWNweV9mcm9taW8odHR5LT5mbGlwLmNoYXJfYnVmX3B0ciwKLQkJCSAgICAgIChjaGFyICopKGNpbmZvLT5iYXNlX2FkZHIKLQkJCQkgICAgICAgKyByeF9idWZhZGRyICsgbmV3X3J4X2dldCksCi0JCQkgICAgICBzbWFsbF9jb3VudCk7CisJCS8qIHdlJ2QgbGlrZSB0byB1c2UgbWVtY3B5KHQsIGYsIG4pIGFuZCBtZW1zZXQocywgYywgY291bnQpCisJCSAgIGZvciBwZXJmb3JtYW5jZSwgYnV0IGJlY2F1c2Ugb2YgYnVmZmVyIGJvdW5kYXJpZXMsIHRoZXJlCisJCSAgIG1heSBiZSBzZXZlcmFsIHN0ZXBzIHRvIHRoZSBvcGVyYXRpb24gKi8KKwkJCXdoaWxlICgwIDwgKHNtYWxsX2NvdW50ID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQlyeF9idWZzaXplIC0gbmV3X3J4X2dldCwKKwkJCQkJbWluX3QodW5zaWduZWQgaW50LCBUVFlfRkxJUEJVRl9TSVpFIC0KKwkJCQkJCXR0eS0+ZmxpcC5jb3VudCwgY2hhcl9jb3VudCkpKSl7CisJCQkJbWVtY3B5X2Zyb21pbyh0dHktPmZsaXAuY2hhcl9idWZfcHRyLAorCQkJCQkoY2hhciAqKShjaW5mby0+YmFzZV9hZGRyICsgcnhfYnVmYWRkciArCisJCQkJCQluZXdfcnhfZ2V0KSwKKwkJCQkJc21hbGxfY291bnQpOwogCi0JCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIgKz0gc21hbGxfY291bnQ7Ci0JCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCBUVFlfTk9STUFMLCBzbWFsbF9jb3VudCk7Ci0JCXR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIgKz0gc21hbGxfY291bnQ7Ci0JCW5ld19yeF9nZXQgPSAobmV3X3J4X2dldCArIHNtYWxsX2NvdW50KSAmIChyeF9idWZzaXplIC0gMSk7Ci0JCWNoYXJfY291bnQgLT0gc21hbGxfY291bnQ7Ci0JCWluZm8tPmljb3VudC5yeCArPSBzbWFsbF9jb3VudDsKLQkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2J5dGVzICs9IHNtYWxsX2NvdW50OwotCQl0dHktPmZsaXAuY291bnQgKz0gc21hbGxfY291bnQ7Ci0JICAgIH0KKwkJCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IHNtYWxsX2NvdW50OworCQkJCW1lbXNldCh0dHktPmZsaXAuZmxhZ19idWZfcHRyLCBUVFlfTk9STUFMLAorCQkJCQlzbWFsbF9jb3VudCk7CisJCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBzbWFsbF9jb3VudDsKKwkJCQluZXdfcnhfZ2V0ID0gKG5ld19yeF9nZXQgKyBzbWFsbF9jb3VudCkgJgorCQkJCQkJKHJ4X2J1ZnNpemUgLSAxKTsKKwkJCQljaGFyX2NvdW50IC09IHNtYWxsX2NvdW50OworCQkJCWluZm8tPmljb3VudC5yeCArPSBzbWFsbF9jb3VudDsKKwkJCQlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfYnl0ZXMgKz0gc21hbGxfY291bnQ7CisJCQkJdHR5LT5mbGlwLmNvdW50ICs9IHNtYWxsX2NvdW50OworCQkJfQogI2Vsc2UKLQkgICAgbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBjaGFyX2NvdW50KTsKLQkgICAgd2hpbGUobGVuLS0pewotCQlkYXRhID0gY3lfcmVhZGIoY2luZm8tPmJhc2VfYWRkciArIHJ4X2J1ZmFkZHIgKyBuZXdfcnhfZ2V0KTsKLQkJbmV3X3J4X2dldCA9IChuZXdfcnhfZ2V0ICsgMSkgJiAocnhfYnVmc2l6ZSAtIDEpOwotCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGEsIFRUWV9OT1JNQUwpOwotCQlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfYnl0ZXMrKzsKLQkJaW5mby0+aWNvdW50LnJ4Kys7Ci0JICAgIH0KKwkJCWxlbiA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgY2hhcl9jb3VudCk7CisJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQlkYXRhID0gY3lfcmVhZGIoY2luZm8tPmJhc2VfYWRkciArIHJ4X2J1ZmFkZHIgKworCQkJCQkJbmV3X3J4X2dldCk7CisJCQkJbmV3X3J4X2dldCA9IChuZXdfcnhfZ2V0ICsgMSkmIChyeF9idWZzaXplIC0gMSk7CisJCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhLCBUVFlfTk9STUFMKTsKKwkJCQlpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfYnl0ZXMrKzsKKwkJCQlpbmZvLT5pY291bnQucngrKzsKKwkJCX0KICNlbmRpZgogI2lmZGVmIENPTkZJR19DWVpfSU5UUgotCSAgICAvKiBSZWNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBSWCBidWZmZXIgYW5kIGlzc3VlCi0JICAgICAgIGEgY21kIGluIGNhc2UgaXQncyBoaWdoZXIgdGhhbiB0aGUgUlggaGlnaCB3YXRlciBtYXJrICovCi0JICAgIHJ4X3B1dCA9IGN5X3JlYWRsKCZidWZfY3RybC0+cnhfcHV0KTsKLQkgICAgaWYgKHJ4X3B1dCA+PSByeF9nZXQpCi0JCWNoYXJfY291bnQgPSByeF9wdXQgLSByeF9nZXQ7Ci0JICAgIGVsc2UKLQkJY2hhcl9jb3VudCA9IHJ4X3B1dCAtIHJ4X2dldCArIHJ4X2J1ZnNpemU7Ci0JICAgIGlmKGNoYXJfY291bnQgPj0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF90aHJlc2hvbGQpKSB7Ci0JCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1pfUlhfRlVMTCk7Ci0JICAgIH0KKwkJLyogUmVjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjaGFycyBpbiB0aGUgUlggYnVmZmVyIGFuZCBpc3N1ZQorCQkgICBhIGNtZCBpbiBjYXNlIGl0J3MgaGlnaGVyIHRoYW4gdGhlIFJYIGhpZ2ggd2F0ZXIgbWFyayAqLworCQkJcnhfcHV0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT5yeF9wdXQpOworCQkJaWYgKHJ4X3B1dCA+PSByeF9nZXQpCisJCQkJY2hhcl9jb3VudCA9IHJ4X3B1dCAtIHJ4X2dldDsKKwkJCWVsc2UKKwkJCQljaGFyX2NvdW50ID0gcnhfcHV0IC0gcnhfZ2V0ICsgcnhfYnVmc2l6ZTsKKwkJCWlmIChjaGFyX2NvdW50ID49IChpbnQpY3lfcmVhZGwoJmJ1Zl9jdHJsLT4KKwkJCQkJcnhfdGhyZXNob2xkKSkgeworCQkJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1pfUlhfRlVMTCk7CisJCQl9CiAjZW5kaWYKLQkgICAgaW5mby0+aWRsZV9zdGF0cy5yZWN2X2lkbGUgPSBqaWZmaWVzOwotCSAgICB0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOworCQkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2lkbGUgPSBqaWZmaWVzOworCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKKwkJfQorCQkvKiBVcGRhdGUgcnhfZ2V0ICovCisJCWN5X3dyaXRlbCgmYnVmX2N0cmwtPnJ4X2dldCwgbmV3X3J4X2dldCk7CiAJfQotCS8qIFVwZGF0ZSByeF9nZXQgKi8KLQljeV93cml0ZWwoJmJ1Zl9jdHJsLT5yeF9nZXQsIG5ld19yeF9nZXQpOwotICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGN5el9oYW5kbGVfdHgoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sCi0JICAgICAgdm9sYXRpbGUgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybCwKLQkgICAgICB2b2xhdGlsZSBzdHJ1Y3QgQlVGX0NUUkwgX19pb21lbSAqYnVmX2N0cmwpCisJCXZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKiBjaF9jdHJsLAorCQl2b2xhdGlsZSBzdHJ1Y3QgQlVGX0NUUkwgX19pb21lbSAqIGJ1Zl9jdHJsKQogewotICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKLSAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKLSAgY2hhciBkYXRhOwotICB2b2xhdGlsZSBpbnQgY2hhcl9jb3VudDsKKwlzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gaW5mby0+dHR5OworCWNoYXIgZGF0YTsKKwl2b2xhdGlsZSBpbnQgY2hhcl9jb3VudDsKICNpZmRlZiBCTE9DS01PVkUKLSAgaW50IHNtYWxsX2NvdW50OworCWludCBzbWFsbF9jb3VudDsKICNlbmRpZgotICB2b2xhdGlsZSB1Y2xvbmcgdHhfcHV0LCB0eF9nZXQsIHR4X2J1ZnNpemUsIHR4X2J1ZmFkZHI7CisJdm9sYXRpbGUgdWNsb25nIHR4X3B1dCwgdHhfZ2V0LCB0eF9idWZzaXplLCB0eF9idWZhZGRyOwogCi0gICAgaWYgKGluZm8tPnhtaXRfY250IDw9IDApCS8qIE5vdGhpbmcgdG8gdHJhbnNtaXQgKi8KLQlyZXR1cm47CisJaWYgKGluZm8tPnhtaXRfY250IDw9IDApCS8qIE5vdGhpbmcgdG8gdHJhbnNtaXQgKi8KKwkJcmV0dXJuOwogCi0gICAgdHhfZ2V0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9nZXQpOwotICAgIHR4X3B1dCA9IGN5X3JlYWRsKCZidWZfY3RybC0+dHhfcHV0KTsKLSAgICB0eF9idWZzaXplID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9idWZzaXplKTsKLSAgICB0eF9idWZhZGRyID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9idWZhZGRyKTsKLSAgICBpZiAodHhfcHV0ID49IHR4X2dldCkKLQljaGFyX2NvdW50ID0gdHhfZ2V0IC0gdHhfcHV0IC0gMSArIHR4X2J1ZnNpemU7Ci0gICAgZWxzZQotCWNoYXJfY291bnQgPSB0eF9nZXQgLSB0eF9wdXQgLSAxOworCXR4X2dldCA9IGN5X3JlYWRsKCZidWZfY3RybC0+dHhfZ2V0KTsKKwl0eF9wdXQgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnR4X3B1dCk7CisJdHhfYnVmc2l6ZSA9IGN5X3JlYWRsKCZidWZfY3RybC0+dHhfYnVmc2l6ZSk7CisJdHhfYnVmYWRkciA9IGN5X3JlYWRsKCZidWZfY3RybC0+dHhfYnVmYWRkcik7CisJaWYgKHR4X3B1dCA+PSB0eF9nZXQpCisJCWNoYXJfY291bnQgPSB0eF9nZXQgLSB0eF9wdXQgLSAxICsgdHhfYnVmc2l6ZTsKKwllbHNlCisJCWNoYXJfY291bnQgPSB0eF9nZXQgLSB0eF9wdXQgLSAxOwogCi0gICAgaWYgKCBjaGFyX2NvdW50ICkgeworCWlmIChjaGFyX2NvdW50KSB7CiAKLQlpZiggdHR5ID09IDAgKXsKLQkgICAgZ290byB6dHhkb25lOwotCX0KLQotCWlmKGluZm8tPnhfY2hhcikgeyAvKiBzZW5kIHNwZWNpYWwgY2hhciAqLwotCSAgICBkYXRhID0gaW5mby0+eF9jaGFyOwotCi0JICAgIGN5X3dyaXRlYigoY2luZm8tPmJhc2VfYWRkciArIHR4X2J1ZmFkZHIgKyB0eF9wdXQpLCBkYXRhKTsKLQkgICAgdHhfcHV0ID0gKHR4X3B1dCArIDEpICYgKHR4X2J1ZnNpemUgLSAxKTsKLQkgICAgaW5mby0+eF9jaGFyID0gMDsKLQkgICAgY2hhcl9jb3VudC0tOwotCSAgICBpbmZvLT5pY291bnQudHgrKzsKLQkgICAgaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOwotCSAgICBpbmZvLT5qaWZmaWVzWzJdID0gamlmZmllczsKLQl9Ci0jaWZkZWYgQkxPQ0tNT1ZFCi0Jd2hpbGUoMCA8IChzbWFsbF9jb3VudCA9IAotCQkgICBtaW5fdCh1bnNpZ25lZCBpbnQsICh0eF9idWZzaXplIC0gdHhfcHV0KSwKLQkJICAgICAgIG1pbl90KHVuc2lnbmVkIGludCwgKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X3RhaWwpLAotCQkJICAgbWluX3QodW5zaWduZWQgaW50LCBpbmZvLT54bWl0X2NudCwgY2hhcl9jb3VudCkpKSkpIHsKLQotCSAgICBtZW1jcHlfdG9pbygoY2hhciAqKShjaW5mby0+YmFzZV9hZGRyICsgdHhfYnVmYWRkciArIHR4X3B1dCksCi0JCQkmaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXSwKLQkJCXNtYWxsX2NvdW50KTsKLQotCSAgICB0eF9wdXQgPSAodHhfcHV0ICsgc21hbGxfY291bnQpICYgKHR4X2J1ZnNpemUgLSAxKTsKLQkgICAgY2hhcl9jb3VudCAtPSBzbWFsbF9jb3VudDsKLQkgICAgaW5mby0+aWNvdW50LnR4ICs9IHNtYWxsX2NvdW50OwotCSAgICBpbmZvLT54bWl0X2NudCAtPSBzbWFsbF9jb3VudDsKLQkgICAgaW5mby0+eG1pdF90YWlsID0gCi0JCShpbmZvLT54bWl0X3RhaWwgKyBzbWFsbF9jb3VudCkgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOwotCSAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7Ci0JICAgIGluZm8tPmppZmZpZXNbMl0gPSBqaWZmaWVzOwotCX0KLSNlbHNlCi0Jd2hpbGUgKGluZm8tPnhtaXRfY250ICYmIGNoYXJfY291bnQpewotCSAgICBkYXRhID0gaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsXTsKLQkgICAgaW5mby0+eG1pdF9jbnQtLTsKLQkgICAgaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIDEpICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKLQotCSAgICBjeV93cml0ZWIoY2luZm8tPmJhc2VfYWRkciArIHR4X2J1ZmFkZHIgKyB0eF9wdXQsIGRhdGEpOwotCSAgICB0eF9wdXQgPSAodHhfcHV0ICsgMSkgJiAodHhfYnVmc2l6ZSAtIDEpOwotCSAgICBjaGFyX2NvdW50LS07Ci0JICAgIGluZm8tPmljb3VudC50eCsrOwotCSAgICBpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7Ci0JICAgIGluZm8tPmppZmZpZXNbMl0gPSBqaWZmaWVzOwotCX0KLSNlbmRpZgotICAgIHp0eGRvbmU6Ci0JaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKSB7Ci0JICAgIGN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1dSSVRFX1dBS0VVUCk7Ci0JfQotCS8qIFVwZGF0ZSB0eF9wdXQgKi8KLQljeV93cml0ZWwoJmJ1Zl9jdHJsLT50eF9wdXQsIHR4X3B1dCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY3l6X2hhbmRsZV9jbWQoc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvKQotewotICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbzsKLSAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7Ci0gIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7Ci0gIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOwotICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKLSAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBCVUZfQ1RSTCBfX2lvbWVtICpidWZfY3RybDsKLSAgdWNsb25nIGNoYW5uZWw7Ci0gIHVjY2hhciBjbWQ7Ci0gIHVjbG9uZyBwYXJhbTsKLSAgdWNsb25nIGh3X3ZlciwgZndfdmVyOwotICBpbnQgc3BlY2lhbF9jb3VudDsKLSAgaW50IGRlbHRhX2NvdW50OwotCi0gICAgZmlybV9pZCA9IGNpbmZvLT5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOwotICAgIHpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwotICAgIGJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7Ci0gICAgZndfdmVyID0gY3lfcmVhZGwoJmJvYXJkX2N0cmwtPmZ3X3ZlcnNpb24pOwotICAgIGh3X3ZlciA9IGN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKShjaW5mby0+Y3RsX2FkZHIpKS0+bWFpbF9ib3hfMCk7Ci0KLQotICAgIHdoaWxlKGN5el9mZXRjaF9tc2coY2luZm8sICZjaGFubmVsLCAmY21kLCAmcGFyYW0pID09IDEpIHsKLQlzcGVjaWFsX2NvdW50ID0gMDsKLQlkZWx0YV9jb3VudCA9IDA7Ci0JaW5mbyA9ICZjeV9wb3J0W2NoYW5uZWwgKyBjaW5mby0+Zmlyc3RfbGluZV07Ci0JaWYoKHR0eSA9IGluZm8tPnR0eSkgPT0gMCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0JY2hfY3RybCA9ICYoemZ3X2N0cmwtPmNoX2N0cmxbY2hhbm5lbF0pOwotCWJ1Zl9jdHJsID0gJih6ZndfY3RybC0+YnVmX2N0cmxbY2hhbm5lbF0pOwotCi0Jc3dpdGNoKGNtZCkgewotCSAgICBjYXNlIENfQ01fUFJfRVJST1I6Ci0JCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX1BBUklUWSk7Ci0JCWluZm8tPmljb3VudC5yeCsrOwotCQlzcGVjaWFsX2NvdW50Kys7Ci0JCWJyZWFrOwotCSAgICBjYXNlIENfQ01fRlJfRVJST1I6Ci0JCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX0ZSQU1FKTsKLQkJaW5mby0+aWNvdW50LnJ4Kys7Ci0JCXNwZWNpYWxfY291bnQrKzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgQ19DTV9SWEJSSzoKLQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfQlJFQUspOwotCQlpbmZvLT5pY291bnQucngrKzsKLQkJc3BlY2lhbF9jb3VudCsrOwotCQlicmVhazsKLQkgICAgY2FzZSBDX0NNX01EQ0Q6Ci0JCWluZm8tPmljb3VudC5kY2QrKzsKLQkJZGVsdGFfY291bnQrKzsKLQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpewotCQkgICAgaWYgKChmd192ZXIgPiAyNDEgPyAKLQkJCSAgKCh1X2xvbmcpcGFyYW0pIDogCi0JCQkgIGN5X3JlYWRsKCZjaF9jdHJsLT5yc19zdGF0dXMpKSAmIENfUlNfRENEKSB7Ci0JCQljeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9PUEVOX1dBS0VVUCk7Ci0JCSAgICB9ZWxzZXsKLQkJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX0hBTkdVUCk7Ci0JCSAgICB9CisJCWlmICh0dHkgPT0gMCkgeworCQkJZ290byB6dHhkb25lOwogCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIENfQ01fTUNUUzoKLQkJaW5mby0+aWNvdW50LmN0cysrOwotCQlkZWx0YV9jb3VudCsrOwotCQlicmVhazsKLQkgICAgY2FzZSBDX0NNX01SSToKLQkJaW5mby0+aWNvdW50LnJuZysrOwotCQlkZWx0YV9jb3VudCsrOwotCQlicmVhazsKLQkgICAgY2FzZSBDX0NNX01EU1I6Ci0JCWluZm8tPmljb3VudC5kc3IrKzsKLQkJZGVsdGFfY291bnQrKzsKLQkJYnJlYWs7Ci0jaWZkZWYgWl9XQUtFCi0JICAgIGNhc2UgQ19DTV9JT0NUTFc6Ci0JCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1NIVVRET1dOX1dBS0VVUCk7Ci0JCWJyZWFrOworCisJCWlmIChpbmZvLT54X2NoYXIpIHsJLyogc2VuZCBzcGVjaWFsIGNoYXIgKi8KKwkJCWRhdGEgPSBpbmZvLT54X2NoYXI7CisKKwkJCWN5X3dyaXRlYihjaW5mby0+YmFzZV9hZGRyICsgdHhfYnVmYWRkciArIHR4X3B1dCwgZGF0YSk7CisJCQl0eF9wdXQgPSAodHhfcHV0ICsgMSkgJiAodHhfYnVmc2l6ZSAtIDEpOworCQkJaW5mby0+eF9jaGFyID0gMDsKKwkJCWNoYXJfY291bnQtLTsKKwkJCWluZm8tPmljb3VudC50eCsrOworCQkJaW5mby0+bGFzdF9hY3RpdmUgPSBqaWZmaWVzOworCQkJaW5mby0+amlmZmllc1syXSA9IGppZmZpZXM7CisJCX0KKyNpZmRlZiBCTE9DS01PVkUKKwkJd2hpbGUgKDAgPCAoc21hbGxfY291bnQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJdHhfYnVmc2l6ZSAtIHR4X3B1dCwgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkoU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfdGFpbCksCisJCQkJCW1pbl90KHVuc2lnbmVkIGludCwgaW5mby0+eG1pdF9jbnQsCisJCQkJCQljaGFyX2NvdW50KSkpKSkgeworCisJCQltZW1jcHlfdG9pbygoY2hhciAqKShjaW5mby0+YmFzZV9hZGRyICsgdHhfYnVmYWRkciArCisJCQkJCXR4X3B1dCksCisJCQkJCSZpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdLAorCQkJCQlzbWFsbF9jb3VudCk7CisKKwkJCXR4X3B1dCA9ICh0eF9wdXQgKyBzbWFsbF9jb3VudCkgJiAodHhfYnVmc2l6ZSAtIDEpOworCQkJY2hhcl9jb3VudCAtPSBzbWFsbF9jb3VudDsKKwkJCWluZm8tPmljb3VudC50eCArPSBzbWFsbF9jb3VudDsKKwkJCWluZm8tPnhtaXRfY250IC09IHNtYWxsX2NvdW50OworCQkJaW5mby0+eG1pdF90YWlsID0gKGluZm8tPnhtaXRfdGFpbCArIHNtYWxsX2NvdW50KSAmCisJCQkJCShTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCQlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisJCQlpbmZvLT5qaWZmaWVzWzJdID0gamlmZmllczsKKwkJfQorI2Vsc2UKKwkJd2hpbGUgKGluZm8tPnhtaXRfY250ICYmIGNoYXJfY291bnQpIHsKKwkJCWRhdGEgPSBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWxdOworCQkJaW5mby0+eG1pdF9jbnQtLTsKKwkJCWluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyAxKSAmCisJCQkJCShTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisKKwkJCWN5X3dyaXRlYihjaW5mby0+YmFzZV9hZGRyICsgdHhfYnVmYWRkciArIHR4X3B1dCwgZGF0YSk7CisJCQl0eF9wdXQgPSAodHhfcHV0ICsgMSkgJiAodHhfYnVmc2l6ZSAtIDEpOworCQkJY2hhcl9jb3VudC0tOworCQkJaW5mby0+aWNvdW50LnR4Kys7CisJCQlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CisJCQlpbmZvLT5qaWZmaWVzWzJdID0gamlmZmllczsKKwkJfQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0NZWl9JTlRSCi0JICAgIGNhc2UgQ19DTV9SWEhJV006Ci0JICAgIGNhc2UgQ19DTV9SWE5ORFQ6Ci0JICAgIGNhc2UgQ19DTV9JTlRCQUNLMjoKLQkJLyogUmVjZXB0aW9uIEludGVycnVwdCAqLwotI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKLQkJcHJpbnRrKCJjeXpfaW50ZXJydXB0OiByY3ZkIGludHIsIGNhcmQgJWQsIHBvcnQgJWxkXG5cciIsIAotCQkJaW5mby0+Y2FyZCwgY2hhbm5lbCk7Ci0jZW5kaWYKLQkJY3l6X2hhbmRsZV9yeChpbmZvLCBjaF9jdHJsLCBidWZfY3RybCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIENfQ01fVFhCRU1QVFk6Ci0JICAgIGNhc2UgQ19DTV9UWExPV1dNOgotCSAgICBjYXNlIENfQ01fSU5UQkFDSzoKLQkJLyogVHJhbnNtaXNzaW9uIEludGVycnVwdCAqLwotI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKLQkJcHJpbnRrKCJjeXpfaW50ZXJydXB0OiB4bWl0IGludHIsIGNhcmQgJWQsIHBvcnQgJWxkXG5cciIsIAotCQkJaW5mby0+Y2FyZCwgY2hhbm5lbCk7Ci0jZW5kaWYKLQkJY3l6X2hhbmRsZV90eChpbmZvLCBjaF9jdHJsLCBidWZfY3RybCk7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLwotCSAgICBjYXNlIENfQ01fRkFUQUw6Ci0JCS8qIHNob3VsZCBkbyBzb21ldGhpbmcgd2l0aCB0aGlzICEhISAqLwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Cit6dHhkb25lOgorCQlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKKwkJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1dSSVRFX1dBS0VVUCk7CisJCX0KKwkJLyogVXBkYXRlIHR4X3B1dCAqLworCQljeV93cml0ZWwoJmJ1Zl9jdHJsLT50eF9wdXQsIHR4X3B1dCk7CiAJfQotCWlmKGRlbHRhX2NvdW50KQotCSAgICBjeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9ERUxUQV9XQUtFVVApOwotCWlmKHNwZWNpYWxfY291bnQpCi0JICAgIHR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7Ci0gICAgfQogfQogCi0jaWZkZWYgQ09ORklHX0NZWl9JTlRSCi1zdGF0aWMgaXJxcmV0dXJuX3QKLWN5el9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorc3RhdGljIHZvaWQgY3l6X2hhbmRsZV9jbWQoc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvKQogewotICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87Ci0KLSAgICBpZigoY2luZm8gPSAoc3RydWN0IGN5Y2xhZGVzX2NhcmQgKilkZXZfaWQpID09IDApewotI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKLQlwcmludGsoImN5el9pbnRlcnJ1cHQ6IHNwdXJpb3VzIGludGVycnVwdCAlZFxuXHIiLCBpcnEpOwotI2VuZGlmCi0gICAgICAgIHJldHVybiBJUlFfTk9ORTsgLyogc3B1cmlvdXMgaW50ZXJydXB0ICovCi0gICAgfQotCi0gICAgaWYgKCFJU1pMT0FERUQoKmNpbmZvKSkgewotI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKLQlwcmludGsoImN5el9pbnRlcnJ1cHQ6IGJvYXJkIG5vdCB5ZXQgbG9hZGVkIChJUlElZCkuXG5cciIsIGlycSk7Ci0jZW5kaWYKLQlyZXR1cm4gSVJRX05PTkU7Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIHRoZSBpbnRlcnJ1cHRzICovCi0gICAgY3l6X2hhbmRsZV9jbWQoY2luZm8pOwotCi0gICAgcmV0dXJuIElSUV9IQU5ETEVEOwotfSAvKiBjeXpfaW50ZXJydXB0ICovCi0KLXN0YXRpYyB2b2lkCi1jeXpfcnhfcmVzdGFydCh1bnNpZ25lZCBsb25nIGFyZykKLXsKLSAgICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKWFyZzsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICB1Y2xvbmcgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLSAgICByZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lOVEJBQ0syLCAwTCk7Ci0gICAgaWYgKHJldHZhbCAhPSAwKXsKLQlwcmludGsoImN5YzpjeXpfcnhfcmVzdGFydCByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwgCi0JICAgICAgIGluZm8tPmxpbmUsIHJldHZhbCk7Ci0gICAgfQotICAgIGN5el9yeF9mdWxsX3RpbWVyW2luZm8tPmxpbmVdLmZ1bmN0aW9uID0gTlVMTDsKLSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotfQotCi0jZWxzZSAvKiBDT05GSUdfQ1laX0lOVFIgKi8KLQotc3RhdGljIHZvaWQKLWN5el9wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKQotewotICBzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvOwotICBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEZJUk1fSUQgKmZpcm1faWQ7Ci0gIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgWkZXX0NUUkwgKnpmd19jdHJsOwotICBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJPQVJEX0NUUkwgKmJvYXJkX2N0cmw7Ci0gIHN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQ0hfQ1RSTCAqY2hfY3RybDsKLSAgc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBCVUZfQ1RSTCAqYnVmX2N0cmw7Ci0gIGludCBjYXJkLCBwb3J0OwotCi0gICAgY3l6X3RpbWVybGlzdC5leHBpcmVzID0gamlmZmllcyArIChIWik7Ci0gICAgZm9yIChjYXJkID0gMCA7IGNhcmQgPCBOUl9DQVJEUyA7IGNhcmQrKyl7Ci0JY2luZm8gPSAmY3lfY2FyZFtjYXJkXTsKLQotCWlmICghSVNfQ1lDX1ooKmNpbmZvKSkgY29udGludWU7Ci0JaWYgKCFJU1pMT0FERUQoKmNpbmZvKSkgY29udGludWU7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbzsKKwlzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKwlzdGF0aWMgdm9sYXRpbGUgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQlVGX0NUUkwgX19pb21lbSAqYnVmX2N0cmw7CisJdWNsb25nIGNoYW5uZWw7CisJdWNjaGFyIGNtZDsKKwl1Y2xvbmcgcGFyYW07CisJdWNsb25nIGh3X3ZlciwgZndfdmVyOworCWludCBzcGVjaWFsX2NvdW50OworCWludCBkZWx0YV9jb3VudDsKIAogCWZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKLQl6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKLQlib2FyZF9jdHJsID0gJih6ZndfY3RybC0+Ym9hcmRfY3RybCk7CisJemZ3X2N0cmwgPSBjaW5mby0+YmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYKKwkJCTB4ZmZmZmYpOworCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJZndfdmVyID0gY3lfcmVhZGwoJmJvYXJkX2N0cmwtPmZ3X3ZlcnNpb24pOworCWh3X3ZlciA9IGN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKShjaW5mby0+Y3RsX2FkZHIpKS0+CisJCQltYWlsX2JveF8wKTsKIAotCS8qIFNraXAgZmlyc3QgcG9sbGluZyBjeWNsZSB0byBhdm9pZCByYWNpbmcgY29uZGl0aW9ucyB3aXRoIHRoZSBGVyAqLwotCWlmICghY2luZm8tPmludHJfZW5hYmxlZCkgewotCSAgICBjaW5mby0+bnBvcnRzID0gKGludCkgY3lfcmVhZGwoJmJvYXJkX2N0cmwtPm5fY2hhbm5lbCk7Ci0JICAgIGNpbmZvLT5pbnRyX2VuYWJsZWQgPSAxOwotCSAgICBjb250aW51ZTsKKwl3aGlsZSAoY3l6X2ZldGNoX21zZyhjaW5mbywgJmNoYW5uZWwsICZjbWQsICZwYXJhbSkgPT0gMSkgeworCQlzcGVjaWFsX2NvdW50ID0gMDsKKwkJZGVsdGFfY291bnQgPSAwOworCQlpbmZvID0gJmN5X3BvcnRbY2hhbm5lbCArIGNpbmZvLT5maXJzdF9saW5lXTsKKwkJaWYgKCh0dHkgPSBpbmZvLT50dHkpID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNoX2N0cmwgPSAmKHpmd19jdHJsLT5jaF9jdHJsW2NoYW5uZWxdKTsKKwkJYnVmX2N0cmwgPSAmKHpmd19jdHJsLT5idWZfY3RybFtjaGFubmVsXSk7CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBDX0NNX1BSX0VSUk9SOgorCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfUEFSSVRZKTsKKwkJCWluZm8tPmljb3VudC5yeCsrOworCQkJc3BlY2lhbF9jb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgQ19DTV9GUl9FUlJPUjoKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX0ZSQU1FKTsKKwkJCWluZm8tPmljb3VudC5yeCsrOworCQkJc3BlY2lhbF9jb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgQ19DTV9SWEJSSzoKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX0JSRUFLKTsKKwkJCWluZm8tPmljb3VudC5yeCsrOworCQkJc3BlY2lhbF9jb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgQ19DTV9NRENEOgorCQkJaW5mby0+aWNvdW50LmRjZCsrOworCQkJZGVsdGFfY291bnQrKzsKKwkJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSB7CisJCQkJaWYgKChmd192ZXIgPiAyNDEgPyAoKHVfbG9uZykgcGFyYW0pIDoKKwkJCQkJCWN5X3JlYWRsKCZjaF9jdHJsLT5yc19zdGF0dXMpKSAmCisJCQkJCQlDX1JTX0RDRCkgeworCQkJCQljeV9zY2hlZF9ldmVudChpbmZvLAorCQkJCQkJIAlDeV9FVkVOVF9PUEVOX1dBS0VVUCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfSEFOR1VQKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDX0NNX01DVFM6CisJCQlpbmZvLT5pY291bnQuY3RzKys7CisJCQlkZWx0YV9jb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgQ19DTV9NUkk6CisJCQlpbmZvLT5pY291bnQucm5nKys7CisJCQlkZWx0YV9jb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgQ19DTV9NRFNSOgorCQkJaW5mby0+aWNvdW50LmRzcisrOworCQkJZGVsdGFfY291bnQrKzsKKwkJCWJyZWFrOworI2lmZGVmIFpfV0FLRQorCQljYXNlIENfQ01fSU9DVExXOgorCQkJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfU0hVVERPV05fV0FLRVVQKTsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJCWNhc2UgQ19DTV9SWEhJV006CisJCWNhc2UgQ19DTV9SWE5ORFQ6CisJCWNhc2UgQ19DTV9JTlRCQUNLMjoKKwkJCS8qIFJlY2VwdGlvbiBJbnRlcnJ1cHQgKi8KKyNpZmRlZiBDWV9ERUJVR19JTlRFUlJVUFRTCisJCQlwcmludGsoImN5el9pbnRlcnJ1cHQ6IHJjdmQgaW50ciwgY2FyZCAlZCwgIgorCQkJCQkicG9ydCAlbGRcblxyIiwgaW5mby0+Y2FyZCwgY2hhbm5lbCk7CisjZW5kaWYKKwkJCWN5el9oYW5kbGVfcngoaW5mbywgY2hfY3RybCwgYnVmX2N0cmwpOworCQkJYnJlYWs7CisJCWNhc2UgQ19DTV9UWEJFTVBUWToKKwkJY2FzZSBDX0NNX1RYTE9XV006CisJCWNhc2UgQ19DTV9JTlRCQUNLOgorCQkJLyogVHJhbnNtaXNzaW9uIEludGVycnVwdCAqLworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJCXByaW50aygiY3l6X2ludGVycnVwdDogeG1pdCBpbnRyLCBjYXJkICVkLCAiCisJCQkJCSJwb3J0ICVsZFxuXHIiLCBpbmZvLT5jYXJkLCBjaGFubmVsKTsKKyNlbmRpZgorCQkJY3l6X2hhbmRsZV90eChpbmZvLCBjaF9jdHJsLCBidWZfY3RybCk7CisJCQlicmVhazsKKyNlbmRpZgkJCQkvKiBDT05GSUdfQ1laX0lOVFIgKi8KKwkJY2FzZSBDX0NNX0ZBVEFMOgorCQkJLyogc2hvdWxkIGRvIHNvbWV0aGluZyB3aXRoIHRoaXMgISEhICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWlmIChkZWx0YV9jb3VudCkKKwkJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX0RFTFRBX1dBS0VVUCk7CisJCWlmIChzcGVjaWFsX2NvdW50KQorCQkJdHR5X3NjaGVkdWxlX2ZsaXAodHR5KTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfQ1laX0lOVFIKK3N0YXRpYyBpcnFyZXR1cm5fdCBjeXpfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm87CisKKwlpZiAoKGNpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19jYXJkICopZGV2X2lkKSA9PSAwKSB7CisjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUworCQlwcmludGsoImN5el9pbnRlcnJ1cHQ6IHNwdXJpb3VzIGludGVycnVwdCAlZFxuXHIiLCBpcnEpOworI2VuZGlmCisJCXJldHVybiBJUlFfTk9ORTsJLyogc3B1cmlvdXMgaW50ZXJydXB0ICovCiAJfQogCisJaWYgKCFJU1pMT0FERUQoKmNpbmZvKSkgeworI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKKwkJcHJpbnRrKCJjeXpfaW50ZXJydXB0OiBib2FyZCBub3QgeWV0IGxvYWRlZCAoSVJRJWQpLlxuXHIiLCBpcnEpOworI2VuZGlmCisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBIYW5kbGUgdGhlIGludGVycnVwdHMgKi8KIAljeXpfaGFuZGxlX2NtZChjaW5mbyk7CiAKLQlmb3IgKHBvcnQgPSAwIDsgcG9ydCA8IGNpbmZvLT5ucG9ydHMgOyBwb3J0KyspIHsKLQkgICAgaW5mbyA9ICZjeV9wb3J0WyBwb3J0ICsgY2luZm8tPmZpcnN0X2xpbmUgXTsKLSAgICAgICAgICAgIHR0eSA9IGluZm8tPnR0eTsKLQkgICAgY2hfY3RybCA9ICYoemZ3X2N0cmwtPmNoX2N0cmxbcG9ydF0pOwotCSAgICBidWZfY3RybCA9ICYoemZ3X2N0cmwtPmJ1Zl9jdHJsW3BvcnRdKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CQkJCS8qIGN5el9pbnRlcnJ1cHQgKi8KIAotCSAgICBpZiAoIWluZm8tPnRocm90dGxlKQotCSAgICAgICAgY3l6X2hhbmRsZV9yeChpbmZvLCBjaF9jdHJsLCBidWZfY3RybCk7Ci0JICAgIGN5el9oYW5kbGVfdHgoaW5mbywgY2hfY3RybCwgYnVmX2N0cmwpOworc3RhdGljIHZvaWQgY3l6X3J4X3Jlc3RhcnQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKilhcmc7CisJaW50IHJldHZhbDsKKwlpbnQgY2FyZCA9IGluZm8tPmNhcmQ7CisJdWNsb25nIGNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9JTlRCQUNLMiwgMEwpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQlwcmludGsoImN5YzpjeXpfcnhfcmVzdGFydCByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJCWluZm8tPmxpbmUsIHJldHZhbCk7CiAJfQotCS8qIHBvbGwgZXZlcnkgJ2N5el9wb2xsaW5nX2N5Y2xlJyBwZXJpb2QgKi8KLQljeXpfdGltZXJsaXN0LmV4cGlyZXMgPSBqaWZmaWVzICsgY3l6X3BvbGxpbmdfY3ljbGU7Ci0gICAgfQotICAgIGFkZF90aW1lcigmY3l6X3RpbWVybGlzdCk7CisJY3l6X3J4X2Z1bGxfdGltZXJbaW5mby0+bGluZV0uZnVuY3Rpb24gPSBOVUxMOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7Cit9CiAKLSAgICByZXR1cm47Ci19IC8qIGN5el9wb2xsICovCisjZWxzZQkJCQkvKiBDT05GSUdfQ1laX0lOVFIgKi8KIAotI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworc3RhdGljIHZvaWQgY3l6X3BvbGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBGSVJNX0lEICpmaXJtX2lkOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgWkZXX0NUUkwgKnpmd19jdHJsOworCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQk9BUkRfQ1RSTCAqYm9hcmRfY3RybDsKKwlzdGF0aWMgdm9sYXRpbGUgc3RydWN0IENIX0NUUkwgKmNoX2N0cmw7CisJc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBCVUZfQ1RSTCAqYnVmX2N0cmw7CisJaW50IGNhcmQsIHBvcnQ7CisKKwljeXpfdGltZXJsaXN0LmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaKTsKKwlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgTlJfQ0FSRFM7IGNhcmQrKykgeworCQljaW5mbyA9ICZjeV9jYXJkW2NhcmRdOworCisJCWlmICghSVNfQ1lDX1ooKmNpbmZvKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIUlTWkxPQURFRCgqY2luZm8pKQorCQkJY29udGludWU7CisKKwkJZmlybV9pZCA9IGNpbmZvLT5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCQl6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKworCQkJCShjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworCQlib2FyZF9jdHJsID0gJih6ZndfY3RybC0+Ym9hcmRfY3RybCk7CisKKwkvKiBTa2lwIGZpcnN0IHBvbGxpbmcgY3ljbGUgdG8gYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMgd2l0aCB0aGUgRlcgKi8KKwkJaWYgKCFjaW5mby0+aW50cl9lbmFibGVkKSB7CisJCQljaW5mby0+bnBvcnRzID0gKGludCljeV9yZWFkbCgmYm9hcmRfY3RybC0+bl9jaGFubmVsKTsKKwkJCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQljeXpfaGFuZGxlX2NtZChjaW5mbyk7CisKKwkJZm9yIChwb3J0ID0gMDsgcG9ydCA8IGNpbmZvLT5ucG9ydHM7IHBvcnQrKykgeworCQkJaW5mbyA9ICZjeV9wb3J0W3BvcnQgKyBjaW5mby0+Zmlyc3RfbGluZV07CisJCQl0dHkgPSBpbmZvLT50dHk7CisJCQljaF9jdHJsID0gJih6ZndfY3RybC0+Y2hfY3RybFtwb3J0XSk7CisJCQlidWZfY3RybCA9ICYoemZ3X2N0cmwtPmJ1Zl9jdHJsW3BvcnRdKTsKKworCQkJaWYgKCFpbmZvLT50aHJvdHRsZSkKKwkJCQljeXpfaGFuZGxlX3J4KGluZm8sIGNoX2N0cmwsIGJ1Zl9jdHJsKTsKKwkJCWN5el9oYW5kbGVfdHgoaW5mbywgY2hfY3RybCwgYnVmX2N0cmwpOworCQl9CisJCS8qIHBvbGwgZXZlcnkgJ2N5el9wb2xsaW5nX2N5Y2xlJyBwZXJpb2QgKi8KKwkJY3l6X3RpbWVybGlzdC5leHBpcmVzID0gamlmZmllcyArIGN5el9wb2xsaW5nX2N5Y2xlOworCX0KKwlhZGRfdGltZXIoJmN5el90aW1lcmxpc3QpOworfQkJCQkvKiBjeXpfcG9sbCAqLworCisjZW5kaWYJCQkJLyogQ09ORklHX0NZWl9JTlRSICovCiAKIC8qKioqKioqKioqIEVuZCBvZiBibG9jayBvZiBDeWNsYWRlcy1aIHNwZWNpZmljIGNvZGUgKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGEgcG9ydCBiZWNvbWVzIGFjdGl2ZTsKICAgIGludGVycnVwdHMgYXJlIGVuYWJsZWQgYW5kIERUUiAmIFJUUyBhcmUgdHVybmVkIG9uLgogICovCi1zdGF0aWMgaW50Ci1zdGFydHVwKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbykKK3N0YXRpYyBpbnQgc3RhcnR1cChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbykKIHsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgaW50IHJldHZhbCA9IDA7Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwotICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgcGFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCWludCBjYXJkLCBjaGlwLCBjaGFubmVsLCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CiAKLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOwogCi0gICAgcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLSAgICBpZiAoIXBhZ2UpCi0JcmV0dXJuIC1FTk9NRU07Ci0KLSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQotICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKXsKLQlmcmVlX3BhZ2UocGFnZSk7Ci0JZ290byBlcnJvdXQ7Ci0gICAgfQotCi0gICAgaWYgKCFpbmZvLT50eXBlKXsKLSAgICAgICAgaWYgKGluZm8tPnR0eSl7Ci0gICAgICAgICAgICBzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotICAgICAgICB9Ci0JZnJlZV9wYWdlKHBhZ2UpOwotCWdvdG8gZXJyb3V0OwotICAgIH0KLQotICAgIGlmIChpbmZvLT54bWl0X2J1ZikKLQlmcmVlX3BhZ2UocGFnZSk7Ci0gICAgZWxzZQotCWluZm8tPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKLQotICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0KLSAgICBzZXRfbGluZV9jaGFyKGluZm8pOwotCi0gICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgewotCWNoaXAgPSBjaGFubmVsPj4yOwotCWNoYW5uZWwgJj0gMHgwMzsKLQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OwotCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7Ci0KLSNpZmRlZiBDWV9ERUJVR19PUEVOCi0JcHJpbnRrKCJjeWMgc3RhcnR1cCBjYXJkICVkLCBjaGlwICVkLCBjaGFubmVsICVkLCBiYXNlX2FkZHIgJWx4XG4iLAotCSAgICAgY2FyZCwgY2hpcCwgY2hhbm5lbCwgKGxvbmcpYmFzZV9hZGRyKTsvKiovCi0jZW5kaWYKKwlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlDWV9MT0NLKGluZm8sIGZsYWdzKTsKIAotCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7Ci0KLQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJUUFI8PGluZGV4KSwgKGluZm8tPmRlZmF1bHRfdGltZW91dAotCQkgPyBpbmZvLT5kZWZhdWx0X3RpbWVvdXQgOiAweDAyKSk7IC8qIDEwbXMgcnggdGltZW91dCAqLwotCi0JY3l5X2lzc3VlX2NtZChiYXNlX2FkZHIsQ3lDSEFOX0NUTHxDeUVOQl9SQ1ZSfEN5RU5CX1hNVFIsaW5kZXgpOwotCi0JY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKLQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCksIEN5UlRTKTsKLQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIEN5RFRSKTsKLQotI2lmZGVmIENZX0RFQlVHX0RUUgotCXByaW50aygiY3ljOnN0YXJ0dXAgcmFpc2luZyBEVFJcbiIpOwotCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCi0JCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpKSwgCi0gICAgICAgICAgICAgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCkpKTsKLSNlbmRpZgotCi0JY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCi0JCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpIHwgQ3lSeERhdGEpOwotCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwotCi0JaWYgKGluZm8tPnR0eSl7Ci0JICAgIGNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlmcmVlX3BhZ2UocGFnZSk7CisJCWdvdG8gZXJyb3V0OwogCX0KLQlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7Ci0JaW5mby0+YnJlYWtvbiA9IGluZm8tPmJyZWFrb2ZmID0gMDsKLQltZW1zZXQoKGNoYXIgKikmaW5mby0+aWRsZV9zdGF0cywgMCwgc2l6ZW9mKGluZm8tPmlkbGVfc3RhdHMpKTsKLQlpbmZvLT5pZGxlX3N0YXRzLmluX3VzZSAgICA9Ci0JaW5mby0+aWRsZV9zdGF0cy5yZWN2X2lkbGUgPQotCWluZm8tPmlkbGVfc3RhdHMueG1pdF9pZGxlID0gamlmZmllczsKKworCWlmICghaW5mby0+dHlwZSkgeworCQlpZiAoaW5mby0+dHR5KSB7CisJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQl9CisJCWZyZWVfcGFnZShwYWdlKTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJaWYgKGluZm8tPnhtaXRfYnVmKQorCQlmcmVlX3BhZ2UocGFnZSk7CisJZWxzZQorCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopcGFnZTsKIAogCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CiAKLSAgICB9IGVsc2UgewotICAgICAgc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKLSAgICAgIHN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKLSAgICAgIHN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7Ci0gICAgICBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOwotICAgICAgaW50IHJldHZhbDsKKwlzZXRfbGluZV9jaGFyKGluZm8pOwogCi0JYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7Ci0KLSAgICAgICAgZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0gICAgICAgIGlmICghSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKXsKLQkgICAgcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwotCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7Ci0JY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCWlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKKwkJY2hhbm5lbCAmPSAweDAzOworCQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArCisJCQkJKGN5X2NoaXBfb2Zmc2V0W2NoaXBdIDw8IGluZGV4KTsKIAogI2lmZGVmIENZX0RFQlVHX09QRU4KLQlwcmludGsoImN5YyBzdGFydHVwIFogY2FyZCAlZCwgY2hhbm5lbCAlZCwgYmFzZV9hZGRyICVseFxuIiwKLQkgICAgIGNhcmQsIGNoYW5uZWwsIChsb25nKWJhc2VfYWRkcik7LyoqLworCQlwcmludGsoImN5YyBzdGFydHVwIGNhcmQgJWQsIGNoaXAgJWQsIGNoYW5uZWwgJWQsICIKKwkJCQkiYmFzZV9hZGRyICVseFxuIiwKKwkJCQljYXJkLCBjaGlwLCBjaGFubmVsLCAobG9uZyliYXNlX2FkZHIpOworCQkvKiovCisjZW5kaWYKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksICh1X2NoYXIpIGNoYW5uZWwpOworCisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lSVFBSIDw8IGluZGV4KSwKKwkJCShpbmZvLT5kZWZhdWx0X3RpbWVvdXQgPyBpbmZvLT5kZWZhdWx0X3RpbWVvdXQgOiAweDAyKSk7CisJCS8qIDEwbXMgcnggdGltZW91dCAqLworCisJCWN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLCBDeUNIQU5fQ1RMIHwgQ3lFTkJfUkNWUiB8IEN5RU5CX1hNVFIsCisJCQkJaW5kZXgpOworCisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lDQVIgPDwgaW5kZXgpLCAodV9jaGFyKSBjaGFubmVsKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIxIDw8IGluZGV4KSwgQ3lSVFMpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TVNWUjIgPDwgaW5kZXgpLCBDeURUUik7CisKKyNpZmRlZiBDWV9ERUJVR19EVFIKKwkJcHJpbnRrKCJjeWM6c3RhcnR1cCByYWlzaW5nIERUUlxuIik7CisJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCQljeV9yZWFkYihiYXNlX2FkZHIgKyAoQ3lNU1ZSMSA8PCBpbmRleCkpLAorCQkJY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5TVNWUjIgPDwgaW5kZXgpKSk7CiAjZW5kaWYKIAotCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5U1JFUiA8PCBpbmRleCksCisJCQljeV9yZWFkYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSkgfCBDeVJ4RGF0YSk7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwogCi0JY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLm9wX21vZGUsIENfQ0hfRU5BQkxFKTsKKwkJaWYgKGluZm8tPnR0eSkgeworCQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQl9CisJCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwkJaW5mby0+YnJlYWtvbiA9IGluZm8tPmJyZWFrb2ZmID0gMDsKKwkJbWVtc2V0KChjaGFyICopJmluZm8tPmlkbGVfc3RhdHMsIDAsIHNpemVvZihpbmZvLT5pZGxlX3N0YXRzKSk7CisJCWluZm8tPmlkbGVfc3RhdHMuaW5fdXNlID0KKwkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2lkbGUgPQorCQlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfaWRsZSA9IGppZmZpZXM7CisKKwkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworCX0gZWxzZSB7CisJCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisJCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKKwkJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKwkJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKwkJaW50IHJldHZhbDsKKworCQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkcjsKKworCQlmaXJtX2lkID0gYmFzZV9hZGRyICsgSURfQUREUkVTUzsKKwkJaWYgKCFJU1pMT0FERUQoY3lfY2FyZFtjYXJkXSkpIHsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArCisJCQkJKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CisJCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJCWNoX2N0cmwgPSB6ZndfY3RybC0+Y2hfY3RybDsKKworI2lmZGVmIENZX0RFQlVHX09QRU4KKwkJcHJpbnRrKCJjeWMgc3RhcnR1cCBaIGNhcmQgJWQsIGNoYW5uZWwgJWQsIGJhc2VfYWRkciAlbHhcbiIsCisJCQljYXJkLCBjaGFubmVsLCAobG9uZyliYXNlX2FkZHIpOworCQkvKiovCisjZW5kaWYKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisKKwkJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLm9wX21vZGUsIENfQ0hfRU5BQkxFKTsKICNpZmRlZiBaX1dBS0UKICNpZmRlZiBDT05GSUdfQ1laX0lOVFIKLQljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0uaW50cl9lbmFibGUsIAotCQkgIENfSU5fVFhCRU1QVFl8Q19JTl9UWExPV1dNfENfSU5fUlhISVdNfENfSU5fUlhOTkRUfAotCQkgIENfSU5fSU9DVExXfAotCQkgIENfSU5fTURDRCk7CisJCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5pbnRyX2VuYWJsZSwKKwkJCSAgQ19JTl9UWEJFTVBUWSB8IENfSU5fVFhMT1dXTSB8IENfSU5fUlhISVdNIHwKKwkJCSAgQ19JTl9SWE5ORFQgfCBDX0lOX0lPQ1RMVyB8IENfSU5fTURDRCk7CiAjZWxzZQotCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5pbnRyX2VuYWJsZSwgCi0JCSAgQ19JTl9JT0NUTFd8Ci0JCSAgQ19JTl9NRENEKTsKLSNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKwkJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLmludHJfZW5hYmxlLAorCQkJICBDX0lOX0lPQ1RMVyB8IENfSU5fTURDRCk7CisjZW5kaWYJCQkJLyogQ09ORklHX0NZWl9JTlRSICovCiAjZWxzZQogI2lmZGVmIENPTkZJR19DWVpfSU5UUgotCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5pbnRyX2VuYWJsZSwgCi0JCSAgQ19JTl9UWEJFTVBUWXxDX0lOX1RYTE9XV018Q19JTl9SWEhJV018Q19JTl9SWE5ORFR8Ci0JCSAgQ19JTl9NRENEKTsKKwkJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLmludHJfZW5hYmxlLAorCQkJICBDX0lOX1RYQkVNUFRZIHwgQ19JTl9UWExPV1dNIHwgQ19JTl9SWEhJV00gfAorCQkJICBDX0lOX1JYTk5EVCB8IENfSU5fTURDRCk7CiAjZWxzZQotCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5pbnRyX2VuYWJsZSwgCi0JCSAgQ19JTl9NRENEKTsKLSNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KLSNlbmRpZiAvKiBaX1dBS0UgKi8KKwkJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLmludHJfZW5hYmxlLCBDX0lOX01EQ0QpOworI2VuZGlmCQkJCS8qIENPTkZJR19DWVpfSU5UUiAqLworI2VuZGlmCQkJCS8qIFpfV0FLRSAqLwogCi0JcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9JT0NUTCwgMEwpOwotCWlmIChyZXR2YWwgIT0gMCl7Ci0JICAgIHByaW50aygiY3ljOnN0YXJ0dXAoMSkgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCi0JCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7Ci0JfQorCQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lPQ1RMLCAwTCk7CisJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJcHJpbnRrKCJjeWM6c3RhcnR1cCgxKSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJCQlpbmZvLT5saW5lLCByZXR2YWwpOworCQl9CiAKLQkvKiBGbHVzaCBSWCBidWZmZXJzIGJlZm9yZSByYWlzaW5nIERUUiBhbmQgUlRTICovCi0JcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9GTFVTSF9SWCwgMEwpOwotCWlmIChyZXR2YWwgIT0gMCl7Ci0JICAgIHByaW50aygiY3ljOnN0YXJ0dXAoMikgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCi0JCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7Ci0JfQorCQkvKiBGbHVzaCBSWCBidWZmZXJzIGJlZm9yZSByYWlzaW5nIERUUiBhbmQgUlRTICovCisJCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbY2FyZF0sIGNoYW5uZWwsIENfQ01fRkxVU0hfUlgsCisJCQkJMEwpOworCQlpZiAocmV0dmFsICE9IDApIHsKKwkJCXByaW50aygiY3ljOnN0YXJ0dXAoMikgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCQkJaW5mby0+bGluZSwgcmV0dmFsKTsKKwkJfQogCi0JLyogc2V0IHRpbWVvdXQgISEhICovCi0JLyogc2V0IFJUUyBhbmQgRFRSICEhISAqLwotCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAotICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wpIHwgQ19SU19SVFMgfCBDX1JTX0RUUikgOwotCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCi0JICAgIGNoYW5uZWwsIENfQ01fSU9DVExNLCAwTCk7Ci0JaWYgKHJldHZhbCAhPSAwKXsKLQkgICAgcHJpbnRrKCJjeWM6c3RhcnR1cCgzKSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKLQkJICAgaW5mby0+bGluZSwgcmV0dmFsKTsKLQl9CisJCS8qIHNldCB0aW1lb3V0ICEhISAqLworCQkvKiBzZXQgUlRTIGFuZCBEVFIgISEhICovCisJCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorCQkJY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgfCBDX1JTX1JUUyB8CisJCQlDX1JTX0RUUik7CisJCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sIGNoYW5uZWwsCisJCQkJQ19DTV9JT0NUTE0sIDBMKTsKKwkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQlwcmludGsoImN5YzpzdGFydHVwKDMpIHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAorCQkJCWluZm8tPmxpbmUsIHJldHZhbCk7CisJCX0KICNpZmRlZiBDWV9ERUJVR19EVFIKLQkgICAgcHJpbnRrKCJjeWM6c3RhcnR1cCByYWlzaW5nIFogRFRSXG4iKTsKKwkJcHJpbnRrKCJjeWM6c3RhcnR1cCByYWlzaW5nIFogRFRSXG4iKTsKICNlbmRpZgogCi0JLyogZW5hYmxlIHNlbmQsIHJlY3YsIG1vZGVtICEhISAqLworCQkvKiBlbmFibGUgc2VuZCwgcmVjdiwgbW9kZW0gISEhICovCiAKLQlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKLQlpZiAoaW5mby0+dHR5KXsKLQkgICAgY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKKwkJaWYgKGluZm8tPnR0eSkgeworCQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQl9CisJCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKwkJaW5mby0+YnJlYWtvbiA9IGluZm8tPmJyZWFrb2ZmID0gMDsKKwkJbWVtc2V0KChjaGFyICopJmluZm8tPmlkbGVfc3RhdHMsIDAsIHNpemVvZihpbmZvLT5pZGxlX3N0YXRzKSk7CisJCWluZm8tPmlkbGVfc3RhdHMuaW5fdXNlID0KKwkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2lkbGUgPQorCQlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfaWRsZSA9IGppZmZpZXM7CisKKwkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKIAl9Ci0JaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwotCWluZm8tPmJyZWFrb24gPSBpbmZvLT5icmVha29mZiA9IDA7Ci0JbWVtc2V0KChjaGFyICopJmluZm8tPmlkbGVfc3RhdHMsIDAsIHNpemVvZihpbmZvLT5pZGxlX3N0YXRzKSk7Ci0JaW5mby0+aWRsZV9zdGF0cy5pbl91c2UgICAgPQotCWluZm8tPmlkbGVfc3RhdHMucmVjdl9pZGxlID0KLQlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfaWRsZSA9IGppZmZpZXM7Ci0KLQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgIH0KIAogI2lmZGVmIENZX0RFQlVHX09QRU4KIAlwcmludGsoIiBjeWMgc3RhcnR1cCBkb25lXG4iKTsKQEAgLTIwOTMsMTY1ICsyMTU0LDE2NSBAQAogZXJyb3V0OgogCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKLX0gLyogc3RhcnR1cCAqLworfQkJCQkvKiBzdGFydHVwICovCiAKLQotc3RhdGljIHZvaWQKLXN0YXJ0X3htaXQoIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvICkKK3N0YXRpYyB2b2lkIHN0YXJ0X3htaXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8pCiB7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwotICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwlpbnQgY2FyZCwgY2hpcCwgY2hhbm5lbCwgaW5kZXg7CiAKLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7Ci0gICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgewotCWNoaXAgPSBjaGFubmVsPj4yOwotCWNoYW5uZWwgJj0gMHgwMzsKLQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OwotCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworCWlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKKwkJY2hhbm5lbCAmPSAweDAzOworCQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArCisJCQkJKGN5X2NoaXBfb2Zmc2V0W2NoaXBdIDw8IGluZGV4KTsKIAotCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCBjaGFubmVsKTsKLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksIAotICAgICAgICAgICAgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgfCBDeVR4UmR5KTsKLQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgIH0gZWxzZSB7CisJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwgY2hhbm5lbCk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSwKKwkJCWN5X3JlYWRiKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpKSB8IEN5VHhSZHkpOworCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCX0gZWxzZSB7CiAjaWZkZWYgQ09ORklHX0NZWl9JTlRSCi0gICAgICBpbnQgcmV0dmFsOworCQlpbnQgcmV0dmFsOwogCi0JQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0JICAgIHJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbY2FyZF0sIGNoYW5uZWwsIENfQ01fSU5UQkFDSywgMEwpOwotCSAgICBpZiAocmV0dmFsICE9IDApewotCQlwcmludGsoImN5YzpzdGFydF94bWl0IHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAotCQkgICAgICAgaW5mby0+bGluZSwgcmV0dmFsKTsKLQkgICAgfQotCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0jZWxzZSAvKiBDT05GSUdfQ1laX0lOVFIgKi8KLQkvKiBEb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGF0IHRoaXMgdGltZSAqLwotI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLwotICAgIH0KLX0gLyogc3RhcnRfeG1pdCAqLworCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9JTlRCQUNLLAorCQkJCTBMKTsKKwkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQlwcmludGsoImN5YzpzdGFydF94bWl0IHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAorCQkJCWluZm8tPmxpbmUsIHJldHZhbCk7CisJCX0KKwkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKyNlbHNlCQkJCS8qIENPTkZJR19DWVpfSU5UUiAqLworCQkvKiBEb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGF0IHRoaXMgdGltZSAqLworI2VuZGlmCQkJCS8qIENPTkZJR19DWVpfSU5UUiAqLworCX0KK30JCQkJLyogc3RhcnRfeG1pdCAqLwogCiAvKgogICogVGhpcyByb3V0aW5lIHNodXRzIGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsCiAgKiBhbmQgRFRSIGlzIGRyb3BwZWQgaWYgdGhlIGhhbmd1cCBvbiBjbG9zZSB0ZXJtaW8gZmxhZyBpcyBvbi4KICAqLwotc3RhdGljIHZvaWQKLXNodXRkb3duKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbykKK3N0YXRpYyB2b2lkIHNodXRkb3duKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvKQogewotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKLSAgaW50IGNhcmQsY2hpcCxjaGFubmVsLGluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJaW50IGNhcmQsIGNoaXAsIGNoYW5uZWwsIGluZGV4OwogCi0gICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FyZCA9IGluZm8tPmNhcmQ7Ci0gICAgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7Ci0gICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgewotCWNoaXAgPSBjaGFubmVsPj4yOwotCWNoYW5uZWwgJj0gMHgwMzsKLQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OwotCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7Ci0KLSNpZmRlZiBDWV9ERUJVR19PUEVOCi0gICAgcHJpbnRrKCJjeWMgc2h1dGRvd24gWSBjYXJkICVkLCBjaGlwICVkLCBjaGFubmVsICVkLCBiYXNlX2FkZHIgJWx4XG4iLAotCQljYXJkLCBjaGlwLCBjaGFubmVsLCAobG9uZyliYXNlX2FkZHIpOwotI2VuZGlmCi0KLQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQotCSAgICAvKiBDbGVhciBkZWx0YV9tc3Jfd2FpdCBxdWV1ZSB0byBhdm9pZCBtZW0gbGVha3MuICovCi0JICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOwotCi0JICAgIGlmIChpbmZvLT54bWl0X2J1Zil7Ci0JCXVuc2lnbmVkIGNoYXIgKiB0ZW1wOwotCQl0ZW1wID0gaW5mby0+eG1pdF9idWY7Ci0JCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSB0ZW1wKTsKLQkgICAgfQotCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOwotCSAgICBpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKSB7Ci0JCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgfkN5UlRTKTsKLQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCB+Q3lEVFIpOwotI2lmZGVmIENZX0RFQlVHX0RUUgotCQlwcmludGsoImN5YyBzaHV0ZG93biBkcm9wcGluZyBEVFJcbiIpOwotCQlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAotCQkgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCkpLCAKLSAgICAgICAgICAgICAgICAgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCkpKTsKLSNlbmRpZgotCSAgICB9Ci0JICAgIGN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLEN5Q0hBTl9DVEx8Q3lESVNfUkNWUixpbmRleCk7Ci0JICAgICAvKiBpdCBtYXkgYmUgYXBwcm9wcmlhdGUgdG8gY2xlYXIgX1hNSVQgYXQKLQkgICAgICAgc29tZSBsYXRlciBkYXRlIChhZnRlciB0ZXN0aW5nKSEhISAqLwotCi0JICAgIGlmIChpbmZvLT50dHkpewotCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCSAgICB9Ci0JICAgIGluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOwotICAgICAgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOwotICAgICAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKLSAgICAgIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7Ci0gICAgICBpbnQgcmV0dmFsOwotCi0JYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7Ci0jaWZkZWYgQ1lfREVCVUdfT1BFTgotICAgIHByaW50aygiY3ljIHNodXRkb3duIFogY2FyZCAlZCwgY2hhbm5lbCAlZCwgYmFzZV9hZGRyICVseFxuIiwKLQkJY2FyZCwgY2hhbm5lbCwgKGxvbmcpYmFzZV9hZGRyKTsKLSNlbmRpZgotCi0gICAgICAgIGZpcm1faWQgPSBiYXNlX2FkZHIgKyBJRF9BRERSRVNTOwotICAgICAgICBpZiAoIUlTWkxPQURFRChjeV9jYXJkW2NhcmRdKSkgewotCSAgICByZXR1cm47CisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJcmV0dXJuOwogCX0KIAotCXpmd19jdHJsID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKLQlib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOwotCWNoX2N0cmwgPSB6ZndfY3RybC0+Y2hfY3RybDsKLQotCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCi0JICAgIGlmIChpbmZvLT54bWl0X2J1Zil7Ci0JCXVuc2lnbmVkIGNoYXIgKiB0ZW1wOwotCQl0ZW1wID0gaW5mby0+eG1pdF9idWY7Ci0JCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSB0ZW1wKTsKLQkgICAgfQotCSAgICAKLQkgICAgaWYgKCFpbmZvLT50dHkgfHwgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkgewotCQljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAodWNsb25nKShjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sKSAmIAotICAgICAgICAgICAgICAgICAgIH4oQ19SU19SVFMgfCBDX1JTX0RUUikpKTsKLQkJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtpbmZvLT5jYXJkXSwKLQkJCWNoYW5uZWwsIENfQ01fSU9DVExNLCAwTCk7Ci0JCWlmIChyZXR2YWwgIT0gMCl7Ci0JCSAgICBwcmludGsoImN5YzpzaHV0ZG93biByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKLQkJCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7Ci0JCX0KLSNpZmRlZiBDWV9ERUJVR19EVFIKLQkJcHJpbnRrKCJjeWM6c2h1dGRvd24gZHJvcHBpbmcgWiBEVFJcbiIpOwotI2VuZGlmCi0JICAgIH0KLQkgICAgCi0JICAgIGlmIChpbmZvLT50dHkpewotCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCSAgICB9Ci0JICAgIGluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQotCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0gICAgfQorCWNhcmQgPSBpbmZvLT5jYXJkOworCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lOworCWlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKKwkJY2hhbm5lbCAmPSAweDAzOworCQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArCisJCQkJKGN5X2NoaXBfb2Zmc2V0W2NoaXBdIDw8IGluZGV4KTsKIAogI2lmZGVmIENZX0RFQlVHX09QRU4KLSAgICBwcmludGsoIiBjeWMgc2h1dGRvd24gZG9uZVxuIik7CisJCXByaW50aygiY3ljIHNodXRkb3duIFkgY2FyZCAlZCwgY2hpcCAlZCwgY2hhbm5lbCAlZCwgIgorCQkJCSJiYXNlX2FkZHIgJWx4XG4iLAorCQkJCWNhcmQsIGNoaXAsIGNoYW5uZWwsIChsb25nKWJhc2VfYWRkcik7CiAjZW5kaWYKLSAgICByZXR1cm47Ci19IC8qIHNodXRkb3duICovCiAKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisKKwkJLyogQ2xlYXIgZGVsdGFfbXNyX3dhaXQgcXVldWUgdG8gYXZvaWQgbWVtIGxlYWtzLiAqLworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKworCQlpZiAoaW5mby0+eG1pdF9idWYpIHsKKwkJCXVuc2lnbmVkIGNoYXIgKnRlbXA7CisJCQl0ZW1wID0gaW5mby0+eG1pdF9idWY7CisJCQlpbmZvLT54bWl0X2J1ZiA9IE5VTEw7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdGVtcCk7CisJCX0KKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksICh1X2NoYXIpIGNoYW5uZWwpOworCQlpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKSB7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TVNWUjEgPDwgaW5kZXgpLCB+Q3lSVFMpOworCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIyIDw8IGluZGV4KSwgfkN5RFRSKTsKKyNpZmRlZiBDWV9ERUJVR19EVFIKKwkJCXByaW50aygiY3ljIHNodXRkb3duIGRyb3BwaW5nIERUUlxuIik7CisJCQlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAorCQkJCWN5X3JlYWRiKGJhc2VfYWRkciArIChDeU1TVlIxIDw8IGluZGV4KSksCisJCQkJY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5TVNWUjIgPDwgaW5kZXgpKSk7CisjZW5kaWYKKwkJfQorCQljeXlfaXNzdWVfY21kKGJhc2VfYWRkciwgQ3lDSEFOX0NUTCB8IEN5RElTX1JDVlIsIGluZGV4KTsKKwkJLyogaXQgbWF5IGJlIGFwcHJvcHJpYXRlIHRvIGNsZWFyIF9YTUlUIGF0CisJCSAgIHNvbWUgbGF0ZXIgZGF0ZSAoYWZ0ZXIgdGVzdGluZykhISEgKi8KKworCQlpZiAoaW5mby0+dHR5KSB7CisJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQl9CisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKKwkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOworCQlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisJCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CisJCXN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7CisJCWludCByZXR2YWw7CisKKwkJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHI7CisjaWZkZWYgQ1lfREVCVUdfT1BFTgorCQlwcmludGsoImN5YyBzaHV0ZG93biBaIGNhcmQgJWQsIGNoYW5uZWwgJWQsIGJhc2VfYWRkciAlbHhcbiIsCisJCQljYXJkLCBjaGFubmVsLCAobG9uZyliYXNlX2FkZHIpOworI2VuZGlmCisKKwkJZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisJCWlmICghSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl6ZndfY3RybCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsKKwkJCQkoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwkJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwkJY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCisJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCisJCWlmIChpbmZvLT54bWl0X2J1ZikgeworCQkJdW5zaWduZWQgY2hhciAqdGVtcDsKKwkJCXRlbXAgPSBpbmZvLT54bWl0X2J1ZjsKKwkJCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0ZW1wKTsKKwkJfQorCisJCWlmICghaW5mby0+dHR5IHx8IChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBIVVBDTCkpIHsKKwkJCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorCQkJCSh1Y2xvbmcpKGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wpJgorCQkJCQl+KENfUlNfUlRTIHwgQ19SU19EVFIpKSk7CisJCQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLCBjaGFubmVsLAorCQkJCQlDX0NNX0lPQ1RMTSwgMEwpOworCQkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQkJcHJpbnRrKCJjeWM6c2h1dGRvd24gcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCisJCQkJCWluZm8tPmxpbmUsIHJldHZhbCk7CisJCQl9CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCQlwcmludGsoImN5YzpzaHV0ZG93biBkcm9wcGluZyBaIERUUlxuIik7CisjZW5kaWYKKwkJfQorCisJCWlmIChpbmZvLT50dHkpIHsKKwkJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJCX0KKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJfQorCisjaWZkZWYgQ1lfREVCVUdfT1BFTgorCXByaW50aygiIGN5YyBzaHV0ZG93biBkb25lXG4iKTsKKyNlbmRpZgorfQkJCQkvKiBzaHV0ZG93biAqLwogCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMjYwLDUyNyArMjMyMSw1NDYgQEAKICAqLwogCiBzdGF0aWMgaW50Ci1ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8pCitibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvKQogewotICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLSAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICBpbnQgY2hpcCwgY2hhbm5lbCxpbmRleDsKLSAgaW50IHJldHZhbDsKLSAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNoaXAsIGNoYW5uZWwsIGluZGV4OworCWludCByZXR2YWw7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CiAKLSAgICBjaW5mbyA9ICZjeV9jYXJkW2luZm8tPmNhcmRdOwotICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2luZm8tPmZpcnN0X2xpbmU7CisJY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKwljaGFubmVsID0gaW5mby0+bGluZSAtIGNpbmZvLT5maXJzdF9saW5lOwogCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCi0gICAgICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCi0gICAgICovCi0gICAgaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykpIHsKLQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7Ci0gICAgICAgICAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKLQl9Ci0gICAgICAgIHJldHVybiAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPyAtRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udAotICAgICAqIGFuZCB0aGVuIGV4aXQuCi0gICAgICovCi0gICAgaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKLQkodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0gICAgICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKLSAgICAgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgotICAgICAqIHRoaXMgbG9vcCwgaW5mby0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKLSAgICAgKiBjeV9jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KLSAgICAgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgotICAgICAqLwotICAgIHJldHZhbCA9IDA7Ci0gICAgYWRkX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOwotI2lmZGVmIENZX0RFQlVHX09QRU4KLSAgICBwcmludGsoImN5YyBibG9ja190aWxfcmVhZHkgYmVmb3JlIGJsb2NrOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCi0gICAgICAgICAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCi0jZW5kaWYKLSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLSAgICBpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JaW5mby0+Y291bnQtLTsKLSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotI2lmZGVmIENZX0RFQlVHX0NPVU5UCi0gICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5OiAoJWQpOiBkZWNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsCi0gICAgICAgIGN1cnJlbnQtPnBpZCwgaW5mby0+Y291bnQpOwotI2VuZGlmCi0gICAgaW5mby0+YmxvY2tlZF9vcGVuKys7Ci0KLSAgICBpZiAoIUlTX0NZQ19aKCpjaW5mbykpIHsKLQljaGlwID0gY2hhbm5lbD4+MjsKLQljaGFubmVsICY9IDB4MDM7Ci0JaW5kZXggPSBjaW5mby0+YnVzX2luZGV4OwotCWJhc2VfYWRkciA9IGNpbmZvLT5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKLQotCXdoaWxlICgxKSB7Ci0JICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOwotCQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSl7Ci0JCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOwotCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCBDeVJUUyk7Ci0JCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIEN5RFRSKTsKLSNpZmRlZiBDWV9ERUJVR19EVFIKLQkJICAgIHByaW50aygiY3ljOmJsb2NrX3RpbF9yZWFkeSByYWlzaW5nIERUUlxuIik7Ci0JCSAgICBwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAotCQkJY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCkpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpKSk7Ci0jZW5kaWYKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyBjbG9zZWQsIHRoZW4gYmxvY2sKKwkgKiB1bnRpbCBpdCdzIGRvbmUsIGFuZCB0aGVuIHRyeSBhZ2Fpbi4KKwkgKi8KKwlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSkgeworCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSB7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKIAkJfQotCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQlyZXR1cm4gKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPyAtRUFHQUlOOiAtRVJFU1RBUlRTWVM7CisJfQogCi0JICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JICAgIGlmICh0dHlfaHVuZ191cF9wKGZpbHApCi0JICAgIHx8ICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgKXsKLQkJcmV0dmFsID0gKChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8gCi0JCSAgICAtRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKLQkJYnJlYWs7Ci0JICAgIH0KKwkvKgorCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udAorCSAqIGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCQlyZXR1cm4gMDsKKwl9CiAKLQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0JCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7Ci0JCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKLQkJJiYgKENfQ0xPQ0FMKHR0eSkKLQkJICAgIHx8IChjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSkgJiBDeURDRCkpKSB7CisJLyoKKwkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQorCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCisJICogdGhpcyBsb29wLCBpbmZvLT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAorCSAqIGN5X2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgorCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCisJICovCisJcmV0dmFsID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisjaWZkZWYgQ1lfREVCVUdfT1BFTgorCXByaW50aygiY3ljIGJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eUMlZCwgY291bnQgPSAlZFxuIiwKKwkJaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworCS8qKi8KKyNlbmRpZgorCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJaW5mby0+Y291bnQtLTsKKwlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworI2lmZGVmIENZX0RFQlVHX0NPVU5UCisJcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5OiAoJWQpOiBkZWNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsCisJCWN1cnJlbnQtPnBpZCwgaW5mby0+Y291bnQpOworI2VuZGlmCisJaW5mby0+YmxvY2tlZF9vcGVuKys7CisKKwlpZiAoIUlTX0NZQ19aKCpjaW5mbykpIHsKKwkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKKwkJY2hhbm5lbCAmPSAweDAzOworCQlpbmRleCA9IGNpbmZvLT5idXNfaW5kZXg7CisJCWJhc2VfYWRkciA9IGNpbmZvLT5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF0gPDwgaW5kZXgpOworCisJCXdoaWxlICgxKSB7CisJCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksCisJCQkJCSAgKHVfY2hhcikgY2hhbm5lbCk7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIxIDw8IGluZGV4KSwKKwkJCQkJICBDeVJUUyk7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIyIDw8IGluZGV4KSwKKwkJCQkJICBDeURUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCQkJcHJpbnRrKCJjeWM6YmxvY2tfdGlsX3JlYWR5IHJhaXNpbmcgRFRSXG4iKTsKKwkJCQlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAorCQkJCQljeV9yZWFkYihiYXNlX2FkZHIgKworCQkJCQkJKEN5TVNWUjEgPDwgaW5kZXgpKSwKKwkJCQkJY3lfcmVhZGIoYmFzZV9hZGRyICsKKwkJCQkJCShDeU1TVlIyIDw8IGluZGV4KSkpOworI2VuZGlmCisJCQl9CiAJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKIAotCSAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCQlicmVhazsKLQkgICAgfQorCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8CisJCQkJCSEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCQlyZXR2YWwgPSAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPworCQkJCQkgIC1FQUdBSU4gOiAtRVJFU1RBUlRTWVMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lDQVIgPDwgaW5kZXgpLAorCQkJCSAgKHVfY2hhcikgY2hhbm5lbCk7CisJCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmIChDX0NMT0NBTCh0dHkpIHx8CisJCQkJCShjeV9yZWFkYihiYXNlX2FkZHIgKworCQkJCQkJKEN5TVNWUjEgPDwgaW5kZXgpKSAmIEN5RENEKSkpIHsKKwkJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQkJCWJyZWFrOworCQkJfQorCQkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQogI2lmZGVmIENZX0RFQlVHX09QRU4KLQkgICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCi0JCSAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCisJCQlwcmludGsoImN5YyBibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eUMlZCwgIgorCQkJCQkiY291bnQgPSAlZFxuIiwKKwkJCQkJaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworCQkJLyoqLwogI2VuZGlmCi0JICAgIHNjaGVkdWxlKCk7Ci0JfQotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOwotICAgICAgc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOwotICAgICAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKLSAgICAgIHN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7Ci0gICAgICBpbnQgcmV0dmFsOwotCi0JYmFzZV9hZGRyID0gY2luZm8tPmJhc2VfYWRkcjsKLQlmaXJtX2lkID0gYmFzZV9hZGRyICsgSURfQUREUkVTUzsKLSAgICAgICAgaWYgKCFJU1pMT0FERUQoKmNpbmZvKSl7Ci0gICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkgICAgcmVtb3ZlX3dhaXRfcXVldWUoJmluZm8tPm9wZW5fd2FpdCwgJndhaXQpOwotCSAgICByZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl6ZndfY3RybCA9IGJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwotCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7Ci0JY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOwotCi0Jd2hpbGUgKDEpIHsKLQkgICAgaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpewotCQljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKLQkJCWN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wpIHwKLQkJCShDX1JTX1JUUyB8IENfUlNfRFRSKSk7Ci0JCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCi0JCQkJICAgICAgIGNoYW5uZWwsIENfQ01fSU9DVExNLCAwTCk7Ci0JCWlmIChyZXR2YWwgIT0gMCl7Ci0JCSAgICBwcmludGsoImN5YzpibG9ja190aWxfcmVhZHkgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCi0JCQkgICBpbmZvLT5saW5lLCByZXR2YWwpOworCQkJc2NoZWR1bGUoKTsKIAkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisJCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKKwkJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKwkJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKwkJaW50IHJldHZhbDsKKworCQliYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyOworCQlmaXJtX2lkID0gYmFzZV9hZGRyICsgSURfQUREUkVTUzsKKwkJaWYgKCFJU1pMT0FERUQoKmNpbmZvKSkgeworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXpmd19jdHJsID0gYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYKKwkJCQkweGZmZmZmKTsKKwkJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwkJY2hfY3RybCA9IHpmd19jdHJsLT5jaF9jdHJsOworCisJCXdoaWxlICgxKSB7CisJCQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKSkgeworCQkJCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorCQkJCQkgIGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLgorCQkJCQkJICAgcnNfY29udHJvbCkgfCAoQ19SU19SVFMgfAorCQkJCQkJCQkgIENfUlNfRFRSKSk7CisJCQkJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtpbmZvLT5jYXJkXSwKKwkJCQkJCWNoYW5uZWwsIENfQ01fSU9DVExNLCAwTCk7CisJCQkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQkJCXByaW50aygiY3ljOmJsb2NrX3RpbF9yZWFkeSByZXR2YWwgb24gIgorCQkJCQkJInR0eUMlZCB3YXMgJXhcbiIsCisJCQkJCQlpbmZvLT5saW5lLCByZXR2YWwpOworCQkJCX0KICNpZmRlZiBDWV9ERUJVR19EVFIKLQkJcHJpbnRrKCJjeWM6YmxvY2tfdGlsX3JlYWR5IHJhaXNpbmcgWiBEVFJcbiIpOworCQkJCXByaW50aygiY3ljOmJsb2NrX3RpbF9yZWFkeSByYWlzaW5nIFogRFRSXG4iKTsKICNlbmRpZgotCSAgICB9CisJCQl9CiAKLQkgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkgICAgaWYgKHR0eV9odW5nX3VwX3AoZmlscCkKLQkgICAgfHwgIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSApewotCQlyZXR2YWwgPSAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPwotCQkgICAgLUVBR0FJTiA6IC1FUkVTVEFSVFNZUyk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykKLQkgICAgJiYgKENfQ0xPQ0FMKHR0eSkKLQkgICAgICB8fCAoY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfc3RhdHVzKSAmIENfUlNfRENEKSkpIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJYnJlYWs7Ci0JICAgIH0KKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAorCQkJCQkhKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7CisJCQkJcmV0dmFsID0gKChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8KKwkJCQkJICAtRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYgKENfQ0xPQ0FMKHR0eSkgfHwKKwkJCQkJKGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX3N0YXR1cykgJgorCQkJCQkJQ19SU19EQ0QpKSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQogI2lmZGVmIENZX0RFQlVHX09QRU4KLQkgICAgcHJpbnRrKCJjeWMgYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlDJWQsIGNvdW50ID0gJWRcbiIsCi0JCSAgIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsvKiovCisJCQlwcmludGsoImN5YyBibG9ja190aWxfcmVhZHkgYmxvY2tpbmc6IHR0eUMlZCwgIgorCQkJCQkiY291bnQgPSAlZFxuIiwKKwkJCQkJaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworCQkJLyoqLwogI2VuZGlmCi0JICAgIHNjaGVkdWxlKCk7CisJCQlzY2hlZHVsZSgpOworCQl9CiAJfQotICAgIH0KLSAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLSAgICByZW1vdmVfd2FpdF9xdWV1ZSgmaW5mby0+b3Blbl93YWl0LCAmd2FpdCk7Ci0gICAgaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKXsKLQlpbmZvLT5jb3VudCsrOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJaW5mby0+Y291bnQrKzsKICNpZmRlZiBDWV9ERUJVR19DT1VOVAotCXByaW50aygiY3ljOmJsb2NrX3RpbF9yZWFkeSAoJWQpOiBpbmNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsCi0JICAgIGN1cnJlbnQtPnBpZCwgaW5mby0+Y291bnQpOworCQlwcmludGsoImN5YzpibG9ja190aWxfcmVhZHkgKCVkKTogaW5jcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLAorCQkJY3VycmVudC0+cGlkLCBpbmZvLT5jb3VudCk7CiAjZW5kaWYKLSAgICB9Ci0gICAgaW5mby0+YmxvY2tlZF9vcGVuLS07CisJfQorCWluZm8tPmJsb2NrZWRfb3Blbi0tOwogI2lmZGVmIENZX0RFQlVHX09QRU4KLSAgICBwcmludGsoImN5YzpibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmc6IHR0eUMlZCwgY291bnQgPSAlZFxuIiwKLQkgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7LyoqLworCXByaW50aygiY3ljOmJsb2NrX3RpbF9yZWFkeSBhZnRlciBibG9ja2luZzogdHR5QyVkLCBjb3VudCA9ICVkXG4iLAorCQlpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisJLyoqLwogI2VuZGlmCi0gICAgaWYgKHJldHZhbCkKLQlyZXR1cm4gcmV0dmFsOwotICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0gICAgcmV0dXJuIDA7Ci19IC8qIGJsb2NrX3RpbF9yZWFkeSAqLwotCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCXJldHVybiAwOworfQkJCQkvKiBibG9ja190aWxfcmVhZHkgKi8KIAogLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAogICogcGVyZm9ybXMgdGhlIHNlcmlhbC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBmb3IgdGhlIHR0eSBzdHJ1Y3R1cmUuCiAgKi8KLXN0YXRpYyBpbnQKLWN5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQorc3RhdGljIGludCBjeV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAgKmluZm87Ci0gIGludCByZXR2YWwsIGxpbmU7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisJaW50IHJldHZhbCwgbGluZTsKIAotICAgIGxpbmUgPSB0dHktPmluZGV4OwotICAgIGlmICgobGluZSA8IDApIHx8IChOUl9QT1JUUyA8PSBsaW5lKSl7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpbmZvID0gJmN5X3BvcnRbbGluZV07Ci0gICAgaWYgKGluZm8tPmxpbmUgPCAwKXsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIAotICAgIC8qIElmIHRoZSBjYXJkJ3MgZmlybXdhcmUgaGFzbid0IGJlZW4gbG9hZGVkLAotICAgICAgIHRyZWF0IGl0IGFzIGFic2VudCBmcm9tIHRoZSBzeXN0ZW0uICBUaGlzCi0gICAgICAgd2lsbCBtYWtlIHRoZSB1c2VyIHBheSBhdHRlbnRpb24uCi0gICAgKi8KLSAgICBpZiAoSVNfQ1lDX1ooY3lfY2FyZFtpbmZvLT5jYXJkXSkpIHsKLQlzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKLQlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkID0gY2luZm8tPmJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0KLSAgICAgICAgaWYgKCFJU1pMT0FERUQoKmNpbmZvKSkgewotCSAgICBpZiAoKChaRV9WMSA9PWN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKQotCQkoY2luZm8tPmN0bF9hZGRyKSktPm1haWxfYm94XzApKSAmJgotCQlaX0ZQR0FfQ0hFQ0sgKCpjaW5mbykpICYmCi0JCShaRklSTV9ITFQgPT0gY3lfcmVhZGwgKCZmaXJtX2lkLT5zaWduYXR1cmUpKSkKLQkgICAgewotCQlwcmludGsgKCJjeWM6Q3ljbGFkZXMtWiBFcnJvcjogeW91IG5lZWQgYW4gZXh0ZXJuYWwgcG93ZXIgc3VwcGx5IGZvciB0aGlzIG51bWJlciBvZiBwb3J0cy5cblxyRmlybXdhcmUgaGFsdGVkLlxyXG4iKTsKLQkgICAgfSBlbHNlIHsKLQkJcHJpbnRrKCJjeWM6Q3ljbGFkZXMtWiBmaXJtd2FyZSBub3QgeWV0IGxvYWRlZFxuIik7Ci0JICAgIH0KLQkgICAgcmV0dXJuIC1FTk9ERVY7Ci0JfQotI2lmZGVmIENPTkZJR19DWVpfSU5UUgotCWVsc2UgewotCSAgICAvKiBJbiBjYXNlIHRoaXMgWiBib2FyZCBpcyBvcGVyYXRpbmcgaW4gaW50ZXJydXB0IG1vZGUsIGl0cyAKLQkgICAgICAgaW50ZXJydXB0cyBzaG91bGQgYmUgZW5hYmxlZCBhcyBzb29uIGFzIHRoZSBmaXJzdCBvcGVuIGhhcHBlbnMgCi0JICAgICAgIHRvIG9uZSBvZiBpdHMgcG9ydHMuICovCi0gICAgICAgICAgICBpZiAoIWNpbmZvLT5pbnRyX2VuYWJsZWQpIHsKLQkJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOwotCQlzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOwotCi0JCXpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChjeV9yZWFkbCAoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKLQotCQlib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOwotCi0JCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBQTFggY2hpcCAqLwotCQljeV93cml0ZXcoY2luZm8tPmN0bF9hZGRyKzB4NjgsCi0JCQljeV9yZWFkdyhjaW5mby0+Y3RsX2FkZHIrMHg2OCl8MHgwOTAwKTsKLQkJLyogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIEZXICovCi0JCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoY2luZm8sCi0JCQkJCTAsIENfQ01fSVJRX0VOQkwsIDBMKTsKLQkJaWYgKHJldHZhbCAhPSAwKXsKLQkJICAgIHByaW50aygiY3ljOklSUSBlbmFibGUgcmV0dmFsIHdhcyAleFxuIiwgcmV0dmFsKTsKLQkJfQotCQljaW5mby0+bnBvcnRzID0gKGludCkgY3lfcmVhZGwgKCZib2FyZF9jdHJsLT5uX2NoYW5uZWwpOwotCQljaW5mby0+aW50cl9lbmFibGVkID0gMTsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KLQkvKiBNYWtlIHN1cmUgdGhpcyBaIHBvcnQgcmVhbGx5IGV4aXN0cyBpbiBoYXJkd2FyZSAqLwotCWlmIChpbmZvLT5saW5lID4gKGNpbmZvLT5maXJzdF9saW5lICsgY2luZm8tPm5wb3J0cyAtIDEpKQorCWxpbmUgPSB0dHktPmluZGV4OworCWlmICgobGluZSA8IDApIHx8IChOUl9QT1JUUyA8PSBsaW5lKSkgewogCQlyZXR1cm4gLUVOT0RFVjsKLSAgICB9CisJfQorCWluZm8gPSAmY3lfcG9ydFtsaW5lXTsKKwlpZiAoaW5mby0+bGluZSA8IDApIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogSWYgdGhlIGNhcmQncyBmaXJtd2FyZSBoYXNuJ3QgYmVlbiBsb2FkZWQsCisJICAgdHJlYXQgaXQgYXMgYWJzZW50IGZyb20gdGhlIHN5c3RlbS4gIFRoaXMKKwkgICB3aWxsIG1ha2UgdGhlIHVzZXIgcGF5IGF0dGVudGlvbi4KKwkgKi8KKwlpZiAoSVNfQ1lDX1ooY3lfY2FyZFtpbmZvLT5jYXJkXSkpIHsKKwkJc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07CisJCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKKworCQlpZiAoIUlTWkxPQURFRCgqY2luZm8pKSB7CisJCQlpZiAoKChaRV9WMSA9PSBjeV9yZWFkbCgKKwkJCQkJJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopCisJCQkJCSAoY2luZm8tPmN0bF9hZGRyKSktPm1haWxfYm94XzApKSAmJgorCQkJCQlaX0ZQR0FfQ0hFQ0soKmNpbmZvKSkgJiYKKwkJCQkJKFpGSVJNX0hMVCA9PSBjeV9yZWFkbCgKKwkJCQkJCSZmaXJtX2lkLT5zaWduYXR1cmUpKSkgeworCQkJCXByaW50aygiY3ljOkN5Y2xhZGVzLVogRXJyb3I6IHlvdSBuZWVkIGFuICIKKwkJCQkJImV4dGVybmFsIHBvd2VyIHN1cHBseSBmb3IgdGhpcyBudW1iZXIgIgorCQkJCQkib2YgcG9ydHMuXG5cckZpcm13YXJlIGhhbHRlZC5cclxuIik7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiY3ljOkN5Y2xhZGVzLVogZmlybXdhcmUgbm90IHlldCAiCisJCQkJCSJsb2FkZWRcbiIpOworCQkJfQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKyNpZmRlZiBDT05GSUdfQ1laX0lOVFIKKwkJZWxzZSB7CisJCS8qIEluIGNhc2UgdGhpcyBaIGJvYXJkIGlzIG9wZXJhdGluZyBpbiBpbnRlcnJ1cHQgbW9kZSwgaXRzCisJCSAgIGludGVycnVwdHMgc2hvdWxkIGJlIGVuYWJsZWQgYXMgc29vbiBhcyB0aGUgZmlyc3Qgb3BlbgorCQkgICBoYXBwZW5zIHRvIG9uZSBvZiBpdHMgcG9ydHMuICovCisJCQlpZiAoIWNpbmZvLT5pbnRyX2VuYWJsZWQpIHsKKwkJCQlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisJCQkJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKworCQkJCXpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArCisJCQkJCShjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmCisJCQkJCQkweGZmZmZmKTsKKworCQkJCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisKKwkJCQkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgUExYIGNoaXAgKi8KKwkJCQljeV93cml0ZXcoY2luZm8tPmN0bF9hZGRyICsgMHg2OCwKKwkJCQkJICBjeV9yZWFkdyhjaW5mby0+Y3RsX2FkZHIgKworCQkJCQkJICAgMHg2OCkgfCAweDA5MDApOworCQkJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBGVyAqLworCQkJCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoY2luZm8sIDAsCisJCQkJCQlDX0NNX0lSUV9FTkJMLCAwTCk7CisJCQkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQkJCXByaW50aygiY3ljOklSUSBlbmFibGUgcmV0dmFsIHdhcyAleFxuIiwKKwkJCQkJCXJldHZhbCk7CisJCQkJfQorCQkJCWNpbmZvLT5ucG9ydHMgPQorCQkJCQkoaW50KWN5X3JlYWRsKCZib2FyZF9jdHJsLT5uX2NoYW5uZWwpOworCQkJCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAxOworCQkJfQorCQl9CisjZW5kaWYJCQkJLyogQ09ORklHX0NZWl9JTlRSICovCisJCS8qIE1ha2Ugc3VyZSB0aGlzIFogcG9ydCByZWFsbHkgZXhpc3RzIGluIGhhcmR3YXJlICovCisJCWlmIChpbmZvLT5saW5lID4gKGNpbmZvLT5maXJzdF9saW5lICsgY2luZm8tPm5wb3J0cyAtIDEpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQogI2lmZGVmIENZX0RFQlVHX09USEVSCi0gICAgcHJpbnRrKCJjeWM6Y3lfb3BlbiB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworCXByaW50aygiY3ljOmN5X29wZW4gdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsJLyogKi8KICNlbmRpZgotICAgIHR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwotICAgIGluZm8tPnR0eSA9IHR0eTsKLSAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X29wZW4iKSl7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9vcGVuIikpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogI2lmZGVmIENZX0RFQlVHX09QRU4KLSAgICBwcmludGsoImN5YzpjeV9vcGVuIHR0eUMlZCwgY291bnQgPSAlZFxuIiwKLSAgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOy8qKi8KKwlwcmludGsoImN5YzpjeV9vcGVuIHR0eUMlZCwgY291bnQgPSAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworCS8qKi8KICNlbmRpZgotICAgIGluZm8tPmNvdW50Kys7CisJaW5mby0+Y291bnQrKzsKICNpZmRlZiBDWV9ERUJVR19DT1VOVAotICAgIHByaW50aygiY3ljOmN5X29wZW4gKCVkKTogaW5jcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLAotICAgICAgICBjdXJyZW50LT5waWQsIGluZm8tPmNvdW50KTsKKwlwcmludGsoImN5YzpjeV9vcGVuICglZCk6IGluY3JlbWVudGluZyBjb3VudCB0byAlZFxuIiwKKwkJY3VycmVudC0+cGlkLCBpbmZvLT5jb3VudCk7CiAjZW5kaWYKIAotICAgIC8qCi0gICAgICogSWYgdGhlIHBvcnQgaXMgdGhlIG1pZGRsZSBvZiBjbG9zaW5nLCBiYWlsIG91dCBub3cKLSAgICAgKi8KLSAgICBpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSkgewotCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpCi0JICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPmNsb3NlX3dhaXQpOwotCXJldHVybiAoKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkgPyAtRUFHQUlOIDogLUVSRVNUQVJUU1lTKTsKLSAgICB9CisJLyoKKwkgKiBJZiB0aGUgcG9ydCBpcyB0aGUgbWlkZGxlIG9mIGNsb3NpbmcsIGJhaWwgb3V0IG5vdworCSAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8IChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpKSB7CisJCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpCisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkJcmV0dXJuIChpbmZvLT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpID8gLUVBR0FJTjogLUVSRVNUQVJUU1lTOworCX0KIAotICAgIC8qCi0gICAgICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKLSAgICAgKi8KLSAgICByZXR2YWwgPSBzdGFydHVwKGluZm8pOwotICAgIGlmIChyZXR2YWwpewotICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KKwkvKgorCSAqIFN0YXJ0IHVwIHNlcmlhbCBwb3J0CisJICovCisJcmV0dmFsID0gc3RhcnR1cChpbmZvKTsKKwlpZiAocmV0dmFsKSB7CisJCXJldHVybiByZXR2YWw7CisJfQogCi0gICAgcmV0dmFsID0gYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7Ci0gICAgaWYgKHJldHZhbCkgeworCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOworCWlmIChyZXR2YWwpIHsKICNpZmRlZiBDWV9ERUJVR19PUEVOCi0gICAgICAgIHByaW50aygiY3ljOmN5X29wZW4gcmV0dXJuaW5nIGFmdGVyIGJsb2NrX3RpbF9yZWFkeSB3aXRoICVkXG4iLAotICAgICAgICAgICAgICAgcmV0dmFsKTsKKwkJcHJpbnRrKCJjeWM6Y3lfb3BlbiByZXR1cm5pbmcgYWZ0ZXIgYmxvY2tfdGlsX3JlYWR5IHdpdGggJWRcbiIsCisJCQlyZXR2YWwpOwogI2VuZGlmCi0gICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQorCQlyZXR1cm4gcmV0dmFsOworCX0KIAotICAgIGluZm8tPnRocm90dGxlID0gMDsKKwlpbmZvLT50aHJvdHRsZSA9IDA7CiAKICNpZmRlZiBDWV9ERUJVR19PUEVOCi0gICAgcHJpbnRrKCIgY3ljOmN5X29wZW4gZG9uZVxuIik7LyoqLworCXByaW50aygiIGN5YzpjeV9vcGVuIGRvbmVcbiIpOworCS8qKi8KICNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19IC8qIGN5X29wZW4gKi8KLQorCXJldHVybiAwOworfQkJCQkvKiBjeV9vcGVuICovCiAKIC8qCiAgKiBjeV93YWl0X3VudGlsX3NlbnQoKSAtLS0gd2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkKICAqLwotc3RhdGljIHZvaWQgCi1jeV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCitzdGF0aWMgdm9pZCBjeV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCiB7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwotICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzOwotICBpbnQgY2hhcl90aW1lOwotCQotICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfd2FpdF91bnRpbF9zZW50IikpCi0JcmV0dXJuOworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwlpbnQgY2FyZCwgY2hpcCwgY2hhbm5lbCwgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXM7CisJaW50IGNoYXJfdGltZTsKIAotICAgIGlmIChpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9PSAwKQotCXJldHVybjsgLyogSnVzdCBpbiBjYXNlLi4uLiAqLworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfd2FpdF91bnRpbF9zZW50IikpCisJCXJldHVybjsKIAorCWlmIChpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9PSAwKQorCQlyZXR1cm47CQkvKiBKdXN0IGluIGNhc2UuLi4uICovCiAKLSAgICBvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOwotICAgIC8qCi0gICAgICogU2V0IHRoZSBjaGVjayBpbnRlcnZhbCB0byBiZSAxLzUgb2YgdGhlIGVzdGltYXRlZCB0aW1lIHRvCi0gICAgICogc2VuZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuICBUaGUgY2hlY2sKLSAgICAgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCi0gICAgICogCi0gICAgICogTm90ZTogd2UgaGF2ZSB0byB1c2UgcHJldHR5IHRpZ2h0IHRpbWluZ3MgaGVyZSB0byBzYXRpc2Z5Ci0gICAgICogdGhlIE5JU1QtUENUUy4KLSAgICAgKi8KLSAgICBjaGFyX3RpbWUgPSAoaW5mby0+dGltZW91dCAtIEhaLzUwKSAvIGluZm8tPnhtaXRfZmlmb19zaXplOwotICAgIGNoYXJfdGltZSA9IGNoYXJfdGltZSAvIDU7Ci0gICAgaWYgKGNoYXJfdGltZSA8PSAwKQotCWNoYXJfdGltZSA9IDE7Ci0gICAgaWYgKHRpbWVvdXQgPCAwKQotCXRpbWVvdXQgPSAwOwotICAgIGlmICh0aW1lb3V0KQotCWNoYXJfdGltZSA9IG1pbihjaGFyX3RpbWUsIHRpbWVvdXQpOwotICAgIC8qCi0gICAgICogSWYgdGhlIHRyYW5zbWl0dGVyIGhhc24ndCBjbGVhcmVkIGluIHR3aWNlIHRoZSBhcHByb3hpbWF0ZQotICAgICAqIGFtb3VudCBvZiB0aW1lIHRvIHNlbmQgdGhlIGVudGlyZSBGSUZPLCBpdCBwcm9iYWJseSB3b24ndAotICAgICAqIGV2ZXIgY2xlYXIuICBUaGlzIGFzc3VtZXMgdGhlIFVBUlQgaXNuJ3QgZG9pbmcgZmxvdwotICAgICAqIGNvbnRyb2wsIHdoaWNoIGlzIGN1cnJlbnRseSB0aGUgY2FzZS4gIEhlbmNlLCBpZiBpdCBldmVyCi0gICAgICogdGFrZXMgbG9uZ2VyIHRoYW4gaW5mby0+dGltZW91dCwgdGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYQotICAgICAqIFVBUlQgYnVnIG9mIHNvbWUga2luZC4gIFNvLCB3ZSBjbGFtcCB0aGUgdGltZW91dCBwYXJhbWV0ZXIgYXQKLSAgICAgKiAyKmluZm8tPnRpbWVvdXQuCi0gICAgICovCi0gICAgaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQgPiAyKmluZm8tPnRpbWVvdXQpCi0JdGltZW91dCA9IDIqaW5mby0+dGltZW91dDsKKwlvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOworCS8qCisJICogU2V0IHRoZSBjaGVjayBpbnRlcnZhbCB0byBiZSAxLzUgb2YgdGhlIGVzdGltYXRlZCB0aW1lIHRvCisJICogc2VuZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGFuZCBtYWtlIGl0IGF0IGxlYXN0IDEuICBUaGUgY2hlY2sKKwkgKiBpbnRlcnZhbCBzaG91bGQgYWxzbyBiZSBsZXNzIHRoYW4gdGhlIHRpbWVvdXQuCisJICoKKwkgKiBOb3RlOiB3ZSBoYXZlIHRvIHVzZSBwcmV0dHkgdGlnaHQgdGltaW5ncyBoZXJlIHRvIHNhdGlzZnkKKwkgKiB0aGUgTklTVC1QQ1RTLgorCSAqLworCWNoYXJfdGltZSA9IChpbmZvLT50aW1lb3V0IC0gSFogLyA1MCkgLyBpbmZvLT54bWl0X2ZpZm9fc2l6ZTsKKwljaGFyX3RpbWUgPSBjaGFyX3RpbWUgLyA1OworCWlmIChjaGFyX3RpbWUgPD0gMCkKKwkJY2hhcl90aW1lID0gMTsKKwlpZiAodGltZW91dCA8IDApCisJCXRpbWVvdXQgPSAwOworCWlmICh0aW1lb3V0KQorCQljaGFyX3RpbWUgPSBtaW4oY2hhcl90aW1lLCB0aW1lb3V0KTsKKwkvKgorCSAqIElmIHRoZSB0cmFuc21pdHRlciBoYXNuJ3QgY2xlYXJlZCBpbiB0d2ljZSB0aGUgYXBwcm94aW1hdGUKKwkgKiBhbW91bnQgb2YgdGltZSB0byBzZW5kIHRoZSBlbnRpcmUgRklGTywgaXQgcHJvYmFibHkgd29uJ3QKKwkgKiBldmVyIGNsZWFyLiAgVGhpcyBhc3N1bWVzIHRoZSBVQVJUIGlzbid0IGRvaW5nIGZsb3cKKwkgKiBjb250cm9sLCB3aGljaCBpcyBjdXJyZW50bHkgdGhlIGNhc2UuICBIZW5jZSwgaWYgaXQgZXZlcgorCSAqIHRha2VzIGxvbmdlciB0aGFuIGluZm8tPnRpbWVvdXQsIHRoaXMgaXMgcHJvYmFibHkgZHVlIHRvIGEKKwkgKiBVQVJUIGJ1ZyBvZiBzb21lIGtpbmQuICBTbywgd2UgY2xhbXAgdGhlIHRpbWVvdXQgcGFyYW1ldGVyIGF0CisJICogMippbmZvLT50aW1lb3V0LgorCSAqLworCWlmICghdGltZW91dCB8fCB0aW1lb3V0ID4gMiAqIGluZm8tPnRpbWVvdXQpCisJCXRpbWVvdXQgPSAyICogaW5mby0+dGltZW91dDsKICNpZmRlZiBDWV9ERUJVR19XQUlUX1VOVElMX1NFTlQKLSAgICBwcmludGsoIkluIGN5X3dhaXRfdW50aWxfc2VudCglZCkgY2hlY2s9JWx1Li4uIiwgdGltZW91dCwgY2hhcl90aW1lKTsKLSAgICBwcmludGsoImppZmY9JWx1Li4uIiwgamlmZmllcyk7CisJcHJpbnRrKCJJbiBjeV93YWl0X3VudGlsX3NlbnQoJWQpIGNoZWNrPSVsdS4uLiIsIHRpbWVvdXQsIGNoYXJfdGltZSk7CisJcHJpbnRrKCJqaWZmPSVsdS4uLiIsIGppZmZpZXMpOwogI2VuZGlmCi0gICAgY2FyZCA9IGluZm8tPmNhcmQ7Ci0gICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOwotICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKLQljaGlwID0gY2hhbm5lbD4+MjsKLQljaGFubmVsICY9IDB4MDM7Ci0JaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKLQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOwotCXdoaWxlIChjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSAmIEN5VHhSZHkpIHsKKwljYXJkID0gaW5mby0+Y2FyZDsKKwljaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7CisJaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCQljaGlwID0gY2hhbm5lbCA+PiAyOworCQljaGFubmVsICY9IDB4MDM7CisJCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJCWJhc2VfYWRkciA9CisJCSAgICBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXSA8PCBpbmRleCk7CisJCXdoaWxlIChjeV9yZWFkYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSkgJiBDeVR4UmR5KSB7CiAjaWZkZWYgQ1lfREVCVUdfV0FJVF9VTlRJTF9TRU5UCi0JICAgIHByaW50aygiTm90IGNsZWFuIChqaWZmPSVsdSkuLi4iLCBqaWZmaWVzKTsKKwkJCXByaW50aygiTm90IGNsZWFuIChqaWZmPSVsdSkuLi4iLCBqaWZmaWVzKTsKICNlbmRpZgotCSAgICBpZiAobXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUpKSkKLQkJYnJlYWs7Ci0JICAgIGlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCi0JCWJyZWFrOworCQkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSkpCisJCQkJYnJlYWs7CisJCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArCisJCQkJCXRpbWVvdXQpKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogTm90aGluZyB0byBkbyEgKi8KIAl9Ci0gICAgfSBlbHNlIHsKLQkvLyBOb3RoaW5nIHRvIGRvIQotICAgIH0KLSAgICAvKiBSdW4gb25lIG1vcmUgY2hhciBjeWNsZSAqLwotICAgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lICogNSkpOworCS8qIFJ1biBvbmUgbW9yZSBjaGFyIGN5Y2xlICovCisJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2VjcyhjaGFyX3RpbWUgKiA1KSk7CiAjaWZkZWYgQ1lfREVCVUdfV0FJVF9VTlRJTF9TRU5UCi0gICAgcHJpbnRrKCJDbGVhbiAoamlmZj0lbHUpLi4uZG9uZVxuIiwgamlmZmllcyk7CisJcHJpbnRrKCJDbGVhbiAoamlmZj0lbHUpLi4uZG9uZVxuIiwgamlmZmllcyk7CiAjZW5kaWYKIH0KIAogLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhIHBhcnRpY3VsYXIgdHR5IGRldmljZSBpcyBjbG9zZWQuCiAgKi8KLXN0YXRpYyB2b2lkCi1jeV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIGN5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICNpZmRlZiBDWV9ERUJVR19PVEhFUgotICAgIHByaW50aygiY3ljOmN5X2Nsb3NlIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7CisJcHJpbnRrKCJjeWM6Y3lfY2xvc2UgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsKICNlbmRpZgogCi0gICAgaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9jbG9zZSIpKXsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOwotICAgIC8qIElmIHRoZSBUVFkgaXMgYmVpbmcgaHVuZyB1cCwgbm90aGluZyB0byBkbyAqLwotICAgIGlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7Ci0JQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0jaWZkZWYgQ1lfREVCVUdfT1BFTgotICAgIHByaW50aygiY3ljOmN5X2Nsb3NlIHR0eUMlZCwgY291bnQgPSAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOwotI2VuZGlmCi0gICAgaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQotICAgICAgICAgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIEluZm8tPmNvdW50IHNob3VsZCBhbHdheXMKLSAgICAgICAgICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgotICAgICAgICAgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKLSAgICAgICAgICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCi0gICAgICAgICAqLwotICAgICAgICBwcmludGsoImN5YzpjeV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKLSAgICAgICAgICAgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7Ci0gICAgICAgIGluZm8tPmNvdW50ID0gMTsKLSAgICB9Ci0jaWZkZWYgQ1lfREVCVUdfQ09VTlQKLSAgICBwcmludGsoImN5YzpjeV9jbG9zZSBhdCAoJWQpOiBkZWNyZW1lbnRpbmcgY291bnQgdG8gJWRcbiIsCi0gICAgICAgIGN1cnJlbnQtPnBpZCwgaW5mby0+Y291bnQgLSAxKTsKLSNlbmRpZgotICAgIGlmICgtLWluZm8tPmNvdW50IDwgMCkgewotI2lmZGVmIENZX0RFQlVHX0NPVU5UCi0gICAgcHJpbnRrKCJjeWM6Y3ljX2Nsb3NlIHNldHRpbmcgY291bnQgdG8gMFxuIik7Ci0jZW5kaWYKLSAgICAgICAgaW5mby0+Y291bnQgPSAwOwotICAgIH0KLSAgICBpZiAoaW5mby0+Y291bnQpIHsKLQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7Ci0KLSAgICAvKgotICAgICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkKLSAgICAqIHRoZSBsaW5lIGRpc2NpcGxpbmUgdG8gb25seSBwcm9jZXNzIFhPTi9YT0ZGIGNoYXJhY3RlcnMuCi0gICAgKi8KLSAgICB0dHktPmNsb3NpbmcgPSAxOwotICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0gICAgaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBDWV9DTE9TSU5HX1dBSVRfTk9ORSkgewotCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOwotICAgIH0KLSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQotICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtpbmZvLT5jYXJkXSkpIHsKLQlpbnQgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2luZm8tPmNhcmRdLmZpcnN0X2xpbmU7Ci0JaW50IGluZGV4ID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5idXNfaW5kZXg7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlX2FkZHIgPSBjeV9jYXJkW2luZm8tPmNhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGFubmVsPj4yXSA8PCBpbmRleCk7Ci0JLyogU3RvcCBhY2NlcHRpbmcgaW5wdXQgKi8KLQljaGFubmVsICY9IDB4MDM7Ci0JY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKLQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKLQkJCWN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgfkN5UnhEYXRhKTsKLQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCSAgICAvKiBXYWl0aW5nIGZvciBvbi1ib2FyZCBidWZmZXJzIHRvIGJlIGVtcHR5IGJlZm9yZSBjbG9zaW5nIAotCSAgICAgICB0aGUgcG9ydCAqLwotCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotCSAgICBjeV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKLQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9jbG9zZSIpKSB7CisJCXJldHVybjsKIAl9Ci0gICAgfSBlbHNlIHsKLSNpZmRlZiBaX1dBS0UKLQkvKiBXYWl0aW5nIGZvciBvbi1ib2FyZCBidWZmZXJzIHRvIGJlIGVtcHR5IGJlZm9yZSBjbG9zaW5nIHRoZSBwb3J0ICovCi0Jdm9pZCBfX2lvbWVtICpiYXNlX2FkZHIgPSBjeV9jYXJkW2luZm8tPmNhcmRdLmJhc2VfYWRkcjsKLQlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkID0gYmFzZV9hZGRyICsgSURfQUREUkVTUzsKLQlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmwgPSBiYXNlX2FkZHIgKyAoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKLQlzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7Ci0JaW50IGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtpbmZvLT5jYXJkXS5maXJzdF9saW5lOwotCWludCByZXR2YWw7CiAKLQlpZiAoY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0uZmxvd19zdGF0dXMpICE9IENfRlNfVFhJRExFKSB7Ci0JICAgIHJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sIGNoYW5uZWwsIAotCQkJCSAgIENfQ01fSU9DVExXLCAwTCk7Ci0JICAgIGlmIChyZXR2YWwgIT0gMCl7Ci0JCXByaW50aygiY3ljOmN5X2Nsb3NlIHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAotCQkgICAgICAgaW5mby0+bGluZSwgcmV0dmFsKTsKLQkgICAgfQotCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotCSAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKLQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLSAgICBzaHV0ZG93bihpbmZvKTsKLSAgICBpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKLSAgICAgICAgdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwotICAgIHR0eV9sZGlzY19mbHVzaCh0dHkpOyAgICAgICAgCi0gICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0KLSAgICB0dHktPmNsb3NpbmcgPSAwOwotICAgIGluZm8tPmV2ZW50ID0gMDsKLSAgICBpbmZvLT50dHkgPSBOVUxMOwotICAgIGlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKLQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgICAgICBpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKLSAgICAgICAgICAgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoaW5mby0+Y2xvc2VfZGVsYXkpKTsKLSAgICAgICAgfQotICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CiAJQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0gICAgfQotICAgIGluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRXxBU1lOQ19DTE9TSU5HKTsKLSAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmNsb3NlX3dhaXQpOworCS8qIElmIHRoZSBUVFkgaXMgYmVpbmcgaHVuZyB1cCwgbm90aGluZyB0byBkbyAqLworCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7CisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisjaWZkZWYgQ1lfREVCVUdfT1BFTgorCXByaW50aygiY3ljOmN5X2Nsb3NlIHR0eUMlZCwgY291bnQgPSAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOworI2VuZGlmCisJaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgeworCQkvKgorCQkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQorCQkgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIEluZm8tPmNvdW50IHNob3VsZCBhbHdheXMKKwkJICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgorCQkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKKwkJICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCisJCSAqLworCQlwcmludGsoImN5YzpjeV9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyB0dHktPmNvdW50IGlzIDEsICIKKwkJCSJpbmZvLT5jb3VudCBpcyAlZFxuIiwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDE7CisJfQorI2lmZGVmIENZX0RFQlVHX0NPVU5UCisJcHJpbnRrKCJjeWM6Y3lfY2xvc2UgYXQgKCVkKTogZGVjcmVtZW50aW5nIGNvdW50IHRvICVkXG4iLAorCQljdXJyZW50LT5waWQsIGluZm8tPmNvdW50IC0gMSk7CisjZW5kaWYKKwlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKKyNpZmRlZiBDWV9ERUJVR19DT1VOVAorCQlwcmludGsoImN5YzpjeWNfY2xvc2Ugc2V0dGluZyBjb3VudCB0byAwXG4iKTsKKyNlbmRpZgorCQlpbmZvLT5jb3VudCA9IDA7CisJfQorCWlmIChpbmZvLT5jb3VudCkgeworCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisKKwkvKgorCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5CisJICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KKwkgKi8KKwl0dHktPmNsb3NpbmcgPSAxOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBDWV9DTE9TSU5HX1dBSVRfTk9ORSkgeworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKKwl9CisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisKKwlpZiAoIUlTX0NZQ19aKGN5X2NhcmRbaW5mby0+Y2FyZF0pKSB7CisJCWludCBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbaW5mby0+Y2FyZF0uZmlyc3RfbGluZTsKKwkJaW50IGluZGV4ID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5idXNfaW5kZXg7CisJCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5iYXNlX2FkZHIgKworCQkJKGN5X2NoaXBfb2Zmc2V0W2NoYW5uZWwgPj4gMl0gPDwgaW5kZXgpOworCQkvKiBTdG9wIGFjY2VwdGluZyBpbnB1dCAqLworCQljaGFubmVsICY9IDB4MDM7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lDQVIgPDwgaW5kZXgpLCAodV9jaGFyKSBjaGFubmVsKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpLAorCQkJICBjeV9yZWFkYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSkgJiB+Q3lSeERhdGEpOworCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQkJLyogV2FpdGluZyBmb3Igb24tYm9hcmQgYnVmZmVycyB0byBiZSBlbXB0eSBiZWZvcmUgY2xvc2luZworCQkJICAgdGhlIHBvcnQgKi8KKwkJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJCQljeV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT50aW1lb3V0KTsKKwkJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQl9CisJfSBlbHNlIHsKKyNpZmRlZiBaX1dBS0UKKwkJLyogV2FpdGluZyBmb3Igb24tYm9hcmQgYnVmZmVycyB0byBiZSBlbXB0eSBiZWZvcmUgY2xvc2luZyB0aGUgcG9ydCAqLworCQl2b2lkIF9faW9tZW0gKmJhc2VfYWRkciA9IGN5X2NhcmRbaW5mby0+Y2FyZF0uYmFzZV9hZGRyOworCQlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkID0gYmFzZV9hZGRyICsgSURfQUREUkVTUzsKKwkJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsID0KKwkJICAgIGJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOworCQlzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7CisJCWludCBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbaW5mby0+Y2FyZF0uZmlyc3RfbGluZTsKKwkJaW50IHJldHZhbDsKKworCQlpZiAoY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0uZmxvd19zdGF0dXMpICE9IENfRlNfVFhJRExFKSB7CisJCQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLCBjaGFubmVsLAorCQkJCQkJQ19DTV9JT0NUTFcsIDBMKTsKKwkJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJCXByaW50aygiY3ljOmN5X2Nsb3NlIHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAorCQkJCQlpbmZvLT5saW5lLCByZXR2YWwpOworCQkJfQorCQkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmluZm8tPnNodXRkb3duX3dhaXQpOworCQkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCX0KKyNlbmRpZgorCX0KKworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJc2h1dGRvd24oaW5mbyk7CisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKworCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+ZXZlbnQgPSAwOworCWluZm8tPnR0eSA9IE5VTEw7CisJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgeworCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MKKwkJCQkJCShpbmZvLT5jbG9zZV9kZWxheSkpOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJfQorCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0NMT1NJTkcpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+Y2xvc2Vfd2FpdCk7CiAKICNpZmRlZiBDWV9ERUJVR19PVEhFUgotICAgIHByaW50aygiIGN5YzpjeV9jbG9zZSBkb25lXG4iKTsKKwlwcmludGsoIiBjeWM6Y3lfY2xvc2UgZG9uZVxuIik7CiAjZW5kaWYKIAotICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0gICAgcmV0dXJuOwotfSAvKiBjeV9jbG9zZSAqLwotCisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKK30JCQkJLyogY3lfY2xvc2UgKi8KIAogLyogVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIHdoZW4gdHR5X3dyaXRlIGhhcyBwdXQgc29tZXRoaW5nIGludG8KICAqIHRoZSB3cml0ZV9xdWV1ZS4gIFRoZSBjaGFyYWN0ZXJzIG1heSBjb21lIGZyb20gdXNlciBzcGFjZSBvcgpAQCAtMjc5NSw1MCArMjg3NSw0OSBAQAogICogSWYgdGhlIHBvcnQgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2ljayBpdC4KICAqCiAgKi8KLXN0YXRpYyBpbnQKLWN5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgY3lfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgaW50IGMsIHJldCA9IDA7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGMsIHJldCA9IDA7CiAKICNpZmRlZiBDWV9ERUJVR19JTwotICAgIHByaW50aygiY3ljOmN5X3dyaXRlIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7IC8qICovCisJcHJpbnRrKCJjeWM6Y3lfd3JpdGUgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsJLyogKi8KICNlbmRpZgogCi0gICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV93cml0ZSIpKXsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAoIWluZm8tPnhtaXRfYnVmKQotCXJldHVybiAwOworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfd3JpdGUiKSkgeworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLSAgICB3aGlsZSAoMSkgewotCWMgPSBtaW4oY291bnQsIG1pbigoaW50KShTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxKSwKLQkJCShpbnQpKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQpKSk7Ci0JICAgICAgICAKLQlpZiAoYyA8PSAwKQotCSAgICBicmVhazsKKwlpZiAoIWluZm8tPnhtaXRfYnVmKQorCQlyZXR1cm4gMDsKIAotCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKLQlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKLQlpbmZvLT54bWl0X2NudCArPSBjOwotCWJ1ZiArPSBjOwotCWNvdW50IC09IGM7Ci0JcmV0ICs9IGM7Ci0gICAgfQotICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJd2hpbGUgKDEpIHsKKwkJYyA9IG1pbihjb3VudCwgbWluKChpbnQpKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDEpLAorCQkJCSAgIChpbnQpKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2hlYWQpKSk7CiAKLSAgICBpbmZvLT5pZGxlX3N0YXRzLnhtaXRfYnl0ZXMgKz0gcmV0OwotICAgIGluZm8tPmlkbGVfc3RhdHMueG1pdF9pZGxlICAgPSBqaWZmaWVzOworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CiAKLSAgICBpZiAoaW5mby0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCAmJiAhdHR5LT5od19zdG9wcGVkKSB7Ci0gICAgICAgIHN0YXJ0X3htaXQoaW5mbyk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19IC8qIGN5X3dyaXRlICovCisJCW1lbWNweShpbmZvLT54bWl0X2J1ZiArIGluZm8tPnhtaXRfaGVhZCwgYnVmLCBjKTsKKwkJaW5mby0+eG1pdF9oZWFkID0gKGluZm8tPnhtaXRfaGVhZCArIGMpICYKKwkJCShTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCWluZm8tPnhtaXRfY250ICs9IGM7CisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQlyZXQgKz0gYzsKKwl9CisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKIAorCWluZm8tPmlkbGVfc3RhdHMueG1pdF9ieXRlcyArPSByZXQ7CisJaW5mby0+aWRsZV9zdGF0cy54bWl0X2lkbGUgPSBqaWZmaWVzOworCisJaWYgKGluZm8tPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIXR0eS0+aHdfc3RvcHBlZCkgeworCQlzdGFydF94bWl0KGluZm8pOworCX0KKwlyZXR1cm4gcmV0OworfQkJCQkvKiBjeV93cml0ZSAqLwogCiAvKgogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUga2VybmVsIHRvIHdyaXRlIGEgc2luZ2xlCkBAIC0yODQ3LDYwICsyOTI2LDU2IEBACiAgKiBkb25lIHN0dWZmaW5nIGNoYXJhY3RlcnMgaW50byB0aGUgZHJpdmVyLiAgSWYgdGhlcmUgaXMgbm8gcm9vbQogICogaW4gdGhlIHF1ZXVlLCB0aGUgY2hhcmFjdGVyIGlzIGlnbm9yZWQuCiAgKi8KLXN0YXRpYyB2b2lkCi1jeV9wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQorc3RhdGljIHZvaWQgY3lfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKIHsKLSAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwotICB1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAjaWZkZWYgQ1lfREVCVUdfSU8KLSAgICBwcmludGsoImN5YzpjeV9wdXRfY2hhciB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOworCXByaW50aygiY3ljOmN5X3B1dF9jaGFyIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7CiAjZW5kaWYKIAotICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfcHV0X2NoYXIiKSkKLSAgICAgICAgcmV0dXJuOworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfcHV0X2NoYXIiKSkKKwkJcmV0dXJuOwogCi0gICAgaWYgKCFpbmZvLT54bWl0X2J1ZikKLSAgICAgICAgcmV0dXJuOworCWlmICghaW5mby0+eG1pdF9idWYpCisJCXJldHVybjsKIAotICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOwotICAgICAgICBpZiAoaW5mby0+eG1pdF9jbnQgPj0gU0VSSUFMX1hNSVRfU0laRSAtIDEpIHsKLQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCWlmIChpbmZvLT54bWl0X2NudCA+PSAoaW50KShTRVJJQUxfWE1JVF9TSVpFIC0gMSkpIHsKKwkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KIAotICAgICAgICBpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X2hlYWQrK10gPSBjaDsKLSAgICAgICAgaW5mby0+eG1pdF9oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUgLSAxOwotICAgICAgICBpbmZvLT54bWl0X2NudCsrOworCWluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfaGVhZCsrXSA9IGNoOworCWluZm8tPnhtaXRfaGVhZCAmPSBTRVJJQUxfWE1JVF9TSVpFIC0gMTsKKwlpbmZvLT54bWl0X2NudCsrOwogCWluZm8tPmlkbGVfc3RhdHMueG1pdF9ieXRlcysrOwogCWluZm8tPmlkbGVfc3RhdHMueG1pdF9pZGxlID0gamlmZmllczsKLSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotfSAvKiBjeV9wdXRfY2hhciAqLwotCisJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKK30JCQkJLyogY3lfcHV0X2NoYXIgKi8KIAogLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCBhZnRlciBpdCBoYXMgd3JpdHRlbiBhCiAgKiBzZXJpZXMgb2YgY2hhcmFjdGVycyB0byB0aGUgdHR5IGRldmljZSB1c2luZyBwdXRfY2hhcigpLiAgCiAgKi8KLXN0YXRpYyB2b2lkCi1jeV9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIHZvaWQgY3lfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLSAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisKICNpZmRlZiBDWV9ERUJVR19JTwotICAgIHByaW50aygiY3ljOmN5X2ZsdXNoX2NoYXJzIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7IC8qICovCisJcHJpbnRrKCJjeWM6Y3lfZmx1c2hfY2hhcnMgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsJLyogKi8KICNlbmRpZgogCi0gICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9mbHVzaF9jaGFycyIpKQotICAgICAgICByZXR1cm47CisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9mbHVzaF9jaGFycyIpKQorCQlyZXR1cm47CiAKLSAgICBpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQKLSAgICB8fCB0dHktPmh3X3N0b3BwZWQgfHwgIWluZm8tPnhtaXRfYnVmKQotICAgICAgICByZXR1cm47CisJaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwgdHR5LT5zdG9wcGVkIHx8IHR0eS0+aHdfc3RvcHBlZCB8fAorCQkJIWluZm8tPnhtaXRfYnVmKQorCQlyZXR1cm47CiAKLSAgICBzdGFydF94bWl0KGluZm8pOwotfSAvKiBjeV9mbHVzaF9jaGFycyAqLwotCisJc3RhcnRfeG1pdChpbmZvKTsKK30JCQkJLyogY3lfZmx1c2hfY2hhcnMgKi8KIAogLyoKICAqIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBudW1iZXJzIG9mIGNoYXJhY3RlcnMgdGhlIHR0eSBkcml2ZXIKQEAgLTI5MDgsNzUgKzI5ODMsNzAgQEAKICAqIHRvIGNoYW5nZSBhcyBvdXRwdXQgYnVmZmVycyBnZXQgZW1wdGllZCwgb3IgaWYgdGhlIG91dHB1dCBmbG93CiAgKiBjb250cm9sIGlzIGFjdGl2YXRlZC4KICAqLwotc3RhdGljIGludAotY3lfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIGludCBjeV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKLSAgaW50ICAgcmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKKwogI2lmZGVmIENZX0RFQlVHX0lPCi0gICAgcHJpbnRrKCJjeWM6Y3lfd3JpdGVfcm9vbSB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLworCXByaW50aygiY3ljOmN5X3dyaXRlX3Jvb20gdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsJLyogKi8KICNlbmRpZgogCi0gICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV93cml0ZV9yb29tIikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldCA9IFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDE7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldCA9IDA7Ci0gICAgcmV0dXJuIHJldDsKLX0gLyogY3lfd3JpdGVfcm9vbSAqLworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfd3JpdGVfcm9vbSIpKQorCQlyZXR1cm4gMDsKKwlyZXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxOworCWlmIChyZXQgPCAwKQorCQlyZXQgPSAwOworCXJldHVybiByZXQ7Cit9CQkJCS8qIGN5X3dyaXRlX3Jvb20gKi8KIAotCi1zdGF0aWMgaW50Ci1jeV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3N0YXRpYyBpbnQgY3lfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKLSAgaW50IGNhcmQsIGNoYW5uZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfY2hhcnNfaW5fYnVmZmVyIikpCi0gICAgICAgIHJldHVybiAwOworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgY2FyZCwgY2hhbm5lbDsKIAotICAgIGNhcmQgPSBpbmZvLT5jYXJkOwotICAgIGNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lKTsKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X2NoYXJzX2luX2J1ZmZlciIpKQorCQlyZXR1cm4gMDsKKworCWNhcmQgPSBpbmZvLT5jYXJkOworCWNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lKTsKIAogI2lmZGVmIFpfRVhUX0NIQVJTX0lOX0JVRkZFUgotICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKLSNlbmRpZiAvKiBaX0VYVF9DSEFSU19JTl9CVUZGRVIgKi8KKwlpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisjZW5kaWYJCQkJLyogWl9FWFRfQ0hBUlNfSU5fQlVGRkVSICovCiAjaWZkZWYgQ1lfREVCVUdfSU8KLQlwcmludGsoImN5YzpjeV9jaGFyc19pbl9idWZmZXIgdHR5QyVkICVkXG4iLAotCQlpbmZvLT5saW5lLCBpbmZvLT54bWl0X2NudCk7IC8qICovCisJCXByaW50aygiY3ljOmN5X2NoYXJzX2luX2J1ZmZlciB0dHlDJWQgJWRcbiIsIGluZm8tPmxpbmUsIGluZm8tPnhtaXRfY250KTsJLyogKi8KICNlbmRpZgotCXJldHVybiBpbmZvLT54bWl0X2NudDsKKwkJcmV0dXJuIGluZm8tPnhtaXRfY250OwogI2lmZGVmIFpfRVhUX0NIQVJTX0lOX0JVRkZFUgotICAgIH0gZWxzZSB7Ci0Jc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBGSVJNX0lEICpmaXJtX2lkOwotCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgWkZXX0NUUkwgKnpmd19jdHJsOwotCXN0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgQ0hfQ1RSTCAqY2hfY3RybDsKLQlzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMICpidWZfY3RybDsKLQlpbnQgY2hhcl9jb3VudDsKLQl2b2xhdGlsZSB1Y2xvbmcgdHhfcHV0LCB0eF9nZXQsIHR4X2J1ZnNpemU7CisJfSBlbHNlIHsKKwkJc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBGSVJNX0lEICpmaXJtX2lkOworCQlzdGF0aWMgdm9sYXRpbGUgc3RydWN0IFpGV19DVFJMICp6ZndfY3RybDsKKwkJc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBDSF9DVFJMICpjaF9jdHJsOworCQlzdGF0aWMgdm9sYXRpbGUgc3RydWN0IEJVRl9DVFJMICpidWZfY3RybDsKKwkJaW50IGNoYXJfY291bnQ7CisJCXZvbGF0aWxlIHVjbG9uZyB0eF9wdXQsIHR4X2dldCwgdHhfYnVmc2l6ZTsKIAotCWZpcm1faWQgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0JemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwotCWNoX2N0cmwgPSAmKHpmd19jdHJsLT5jaF9jdHJsW2NoYW5uZWxdKTsKLQlidWZfY3RybCA9ICYoemZ3X2N0cmwtPmJ1Zl9jdHJsW2NoYW5uZWxdKTsKKwkJZmlybV9pZCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgSURfQUREUkVTUzsKKwkJemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArCisJCQkoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwkJY2hfY3RybCA9ICYoemZ3X2N0cmwtPmNoX2N0cmxbY2hhbm5lbF0pOworCQlidWZfY3RybCA9ICYoemZ3X2N0cmwtPmJ1Zl9jdHJsW2NoYW5uZWxdKTsKIAotCXR4X2dldCA9IGN5X3JlYWRsKCZidWZfY3RybC0+dHhfZ2V0KTsKLQl0eF9wdXQgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnR4X3B1dCk7Ci0JdHhfYnVmc2l6ZSA9IGN5X3JlYWRsKCZidWZfY3RybC0+dHhfYnVmc2l6ZSk7Ci0JaWYgKHR4X3B1dCA+PSB0eF9nZXQpCi0JICAgIGNoYXJfY291bnQgPSB0eF9wdXQgLSB0eF9nZXQ7Ci0JZWxzZQotCSAgICBjaGFyX2NvdW50ID0gdHhfcHV0IC0gdHhfZ2V0ICsgdHhfYnVmc2l6ZTsKKwkJdHhfZ2V0ID0gY3lfcmVhZGwoJmJ1Zl9jdHJsLT50eF9nZXQpOworCQl0eF9wdXQgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnR4X3B1dCk7CisJCXR4X2J1ZnNpemUgPSBjeV9yZWFkbCgmYnVmX2N0cmwtPnR4X2J1ZnNpemUpOworCQlpZiAodHhfcHV0ID49IHR4X2dldCkKKwkJCWNoYXJfY291bnQgPSB0eF9wdXQgLSB0eF9nZXQ7CisJCWVsc2UKKwkJCWNoYXJfY291bnQgPSB0eF9wdXQgLSB0eF9nZXQgKyB0eF9idWZzaXplOwogI2lmZGVmIENZX0RFQlVHX0lPCi0JcHJpbnRrKCJjeWM6Y3lfY2hhcnNfaW5fYnVmZmVyIHR0eUMlZCAlZFxuIiwKLQkJaW5mby0+bGluZSwgaW5mby0+eG1pdF9jbnQgKyBjaGFyX2NvdW50KTsgLyogKi8KKwkJcHJpbnRrKCJjeWM6Y3lfY2hhcnNfaW5fYnVmZmVyIHR0eUMlZCAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+eG1pdF9jbnQgKyBjaGFyX2NvdW50KTsJLyogKi8KICNlbmRpZgotCXJldHVybiAoaW5mby0+eG1pdF9jbnQgKyBjaGFyX2NvdW50KTsKLSAgICB9Ci0jZW5kaWYgLyogWl9FWFRfQ0hBUlNfSU5fQlVGRkVSICovCi19IC8qIGN5X2NoYXJzX2luX2J1ZmZlciAqLwotCisJCXJldHVybiBpbmZvLT54bWl0X2NudCArIGNoYXJfY291bnQ7CisJfQorI2VuZGlmCQkJCS8qIFpfRVhUX0NIQVJTX0lOX0JVRkZFUiAqLworfQkJCQkvKiBjeV9jaGFyc19pbl9idWZmZXIgKi8KIAogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjk4NCwxNzggKzMwNTQsMTc5IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCi1zdGF0aWMgdm9pZAotY3l5X2JhdWRfY2FsYyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywgdWNsb25nIGJhdWQpCitzdGF0aWMgdm9pZCBjeXlfYmF1ZF9jYWxjKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1Y2xvbmcgYmF1ZCkKIHsKLSAgICBpbnQgY28sIGNvX3ZhbCwgYnByOwotICAgIHVjbG9uZyBjeV9jbG9jayA9ICgoaW5mby0+Y2hpcF9yZXYgPj0gQ0QxNDAwX1JFVl9KKSA/IDYwMDAwMDAwIDogMjUwMDAwMDApOworCWludCBjbywgY29fdmFsLCBicHI7CisJdWNsb25nIGN5X2Nsb2NrID0gKChpbmZvLT5jaGlwX3JldiA+PSBDRDE0MDBfUkVWX0opID8gNjAwMDAwMDAgOgorCQkJMjUwMDAwMDApOwogCi0gICAgaWYgKGJhdWQgPT0gMCkgewotCWluZm8tPnRicHIgPSBpbmZvLT50Y28gPSBpbmZvLT5yYnByID0gaW5mby0+cmNvID0gMDsKLQlyZXR1cm47Ci0gICAgfQorCWlmIChiYXVkID09IDApIHsKKwkJaW5mby0+dGJwciA9IGluZm8tPnRjbyA9IGluZm8tPnJicHIgPSBpbmZvLT5yY28gPSAwOworCQlyZXR1cm47CisJfQogCi0gICAgLyogZGV0ZXJtaW5lIHdoaWNoIHByZXNjYWxlciB0byB1c2UgKi8KLSAgICBmb3IgKGNvID0gNCwgY29fdmFsID0gMjA0ODsgY287IGNvLS0sIGNvX3ZhbCA+Pj0gMikgewotCWlmIChjeV9jbG9jayAvIGNvX3ZhbCAvIGJhdWQgPiA2MykKLQkgICAgYnJlYWs7Ci0gICAgfQorCS8qIGRldGVybWluZSB3aGljaCBwcmVzY2FsZXIgdG8gdXNlICovCisJZm9yIChjbyA9IDQsIGNvX3ZhbCA9IDIwNDg7IGNvOyBjby0tLCBjb192YWwgPj49IDIpIHsKKwkJaWYgKGN5X2Nsb2NrIC8gY29fdmFsIC8gYmF1ZCA+IDYzKQorCQkJYnJlYWs7CisJfQogCi0gICAgYnByID0gKGN5X2Nsb2NrIC8gY29fdmFsICogMiAvIGJhdWQgKyAxKSAvIDI7Ci0gICAgaWYgKGJwciA+IDI1NSkKLQlicHIgPSAyNTU7CisJYnByID0gKGN5X2Nsb2NrIC8gY29fdmFsICogMiAvIGJhdWQgKyAxKSAvIDI7CisJaWYgKGJwciA+IDI1NSkKKwkJYnByID0gMjU1OwogCi0gICAgaW5mby0+dGJwciA9IGluZm8tPnJicHIgPSBicHI7Ci0gICAgaW5mby0+dGNvID0gaW5mby0+cmNvID0gY287CisJaW5mby0+dGJwciA9IGluZm8tPnJicHIgPSBicHI7CisJaW5mby0+dGNvID0gaW5mby0+cmNvID0gY287CiB9CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgZmluZHMgb3IgY29tcHV0ZXMgdGhlIHZhcmlvdXMgbGluZSBjaGFyYWN0ZXJpc3RpY3MuCiAgKiBJdCB1c2VkIHRvIGJlIGNhbGxlZCBjb25maWdfc2V0dXAKICAqLwotc3RhdGljIHZvaWQKLXNldF9saW5lX2NoYXIoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvKQorc3RhdGljIHZvaWQgc2V0X2xpbmVfY2hhcihzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbykKIHsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7Ci0gIGludCBjYXJkLGNoaXAsY2hhbm5lbCxpbmRleDsKLSAgdW5zaWduZWQgY2ZsYWcsIGlmbGFnOwotICB1bnNpZ25lZCBzaG9ydCBjaGlwX251bWJlcjsKLSAgaW50IGJhdWQsIGJhdWRfcmF0ZSA9IDA7Ci0gIGludCAgIGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwlpbnQgY2FyZCwgY2hpcCwgY2hhbm5lbCwgaW5kZXg7CisJdW5zaWduZWQgY2ZsYWcsIGlmbGFnOworCXVuc2lnbmVkIHNob3J0IGNoaXBfbnVtYmVyOworCWludCBiYXVkLCBiYXVkX3JhdGUgPSAwOworCWludCBpOwogCi0KLSAgICBpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKXsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoaW5mby0+bGluZSA9PSAtMSl7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0gICAgaWZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfaWZsYWc7Ci0KLSAgICAvKgotICAgICAqIFNldCB1cCB0aGUgdHR5LT5hbHRfc3BlZWQga2x1ZGdlCi0gICAgICovCi0gICAgaWYgKGluZm8tPnR0eSkgewotCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQotCSAgICBpbmZvLT50dHktPmFsdF9zcGVlZCA9IDU3NjAwOwotCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKLQkgICAgaW5mby0+dHR5LT5hbHRfc3BlZWQgPSAxMTUyMDA7Ci0JaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfU0hJKQotCSAgICBpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKLQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9XQVJQKQotCSAgICBpbmZvLT50dHktPmFsdF9zcGVlZCA9IDQ2MDgwMDsKLSAgICB9Ci0KLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7Ci0gICAgY2hpcF9udW1iZXIgPSBjaGFubmVsIC8gNDsKLQotICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKLQotCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7Ci0KLQkvKiBiYXVkIHJhdGUgKi8KLQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKLQlpZiAoKGJhdWQgPT0gMzg0MDApICYmCi0JICAgICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpKSB7Ci0JICAgIGlmIChpbmZvLT5jdXN0b21fZGl2aXNvcikKLQkJYmF1ZF9yYXRlID0gaW5mby0+YmF1ZCAvIGluZm8tPmN1c3RvbV9kaXZpc29yOwotCSAgICBlbHNlCi0JCWJhdWRfcmF0ZSA9IGluZm8tPmJhdWQ7Ci0JfSBlbHNlIGlmIChiYXVkID4gQ0QxNDAwX01BWF9TUEVFRCkgewotCSAgICBiYXVkID0gQ0QxNDAwX01BWF9TUEVFRDsKKwlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zKSB7CisJCXJldHVybjsKIAl9Ci0JLyogZmluZCB0aGUgYmF1ZCBpbmRleCAqLwotCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0JICAgIGlmIChiYXVkID09IGJhdWRfdGFibGVbaV0pIHsKLQkJYnJlYWs7Ci0JICAgIH0KKwlpZiAoaW5mby0+bGluZSA9PSAtMSkgeworCQlyZXR1cm47CiAJfQotCWlmIChpID09IDIwKSB7Ci0JICAgIGkgPSAxOTsgLyogQ0QxNDAwX01BWF9TUEVFRCAqLwotCX0gCisJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJaWZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfaWZsYWc7CiAKLQlpZiAoKGJhdWQgPT0gMzg0MDApICYmCi0JICAgICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0NVU1QpKSB7Ci0JICAgIGN5eV9iYXVkX2NhbGMoaW5mbywgYmF1ZF9yYXRlKTsKLQl9IGVsc2UgewotCSAgICBpZihpbmZvLT5jaGlwX3JldiA+PSBDRDE0MDBfUkVWX0opIHsKLQkJLyogSXQgaXMgYSBDRDE0MDAgcmV2LiBKIG9yIGxhdGVyICovCi0JCWluZm8tPnRicHIgPSBiYXVkX2Jwcl82MFtpXTsgLyogVHggQlBSICovCi0JCWluZm8tPnRjbyA9IGJhdWRfY29fNjBbaV07IC8qIFR4IENPICovCi0JCWluZm8tPnJicHIgPSBiYXVkX2Jwcl82MFtpXTsgLyogUnggQlBSICovCi0JCWluZm8tPnJjbyA9IGJhdWRfY29fNjBbaV07IC8qIFJ4IENPICovCi0JICAgIH0gZWxzZSB7Ci0JCWluZm8tPnRicHIgPSBiYXVkX2Jwcl8yNVtpXTsgLyogVHggQlBSICovCi0JCWluZm8tPnRjbyA9IGJhdWRfY29fMjVbaV07IC8qIFR4IENPICovCi0JCWluZm8tPnJicHIgPSBiYXVkX2Jwcl8yNVtpXTsgLyogUnggQlBSICovCi0JCWluZm8tPnJjbyA9IGJhdWRfY29fMjVbaV07IC8qIFJ4IENPICovCi0JICAgIH0KKwkvKgorCSAqIFNldCB1cCB0aGUgdHR5LT5hbHRfc3BlZWQga2x1ZGdlCisJICovCisJaWYgKGluZm8tPnR0eSkgeworCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9ISSkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNTc2MDA7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gMTE1MjAwOworCQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9TSEkpCisJCQlpbmZvLT50dHktPmFsdF9zcGVlZCA9IDIzMDQwMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfV0FSUCkKKwkJCWluZm8tPnR0eS0+YWx0X3NwZWVkID0gNDYwODAwOwogCX0KLQlpZiAoYmF1ZF90YWJsZVtpXSA9PSAxMzQpIHsKLQkgICAgLyogZ2V0IGl0IHJpZ2h0IGZvciAxMzQuNSBiYXVkICovCi0JICAgIGluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqMzAvMjY5KSArIDI7Ci0JfSBlbHNlIGlmICgoYmF1ZCA9PSAzODQwMCkgJiYKLQkJICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpIHsKLQkgICAgaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSpIWioxNS9iYXVkX3JhdGUpICsgMjsKLQl9IGVsc2UgaWYgKGJhdWRfdGFibGVbaV0pIHsKLQkgICAgaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSpIWioxNS9iYXVkX3RhYmxlW2ldKSArIDI7Ci0JICAgIC8qIHRoaXMgbmVlZHMgdG8gYmUgcHJvcGFnYXRlZCBpbnRvIHRoZSBjYXJkIGluZm8gKi8KLQl9IGVsc2UgewotCSAgICBpbmZvLT50aW1lb3V0ID0gMDsKLQl9Ci0JLyogQnkgdHJhZGl0aW9uIChpcyBpdCBhIHN0YW5kYXJkPykgYSBiYXVkIHJhdGUgb2YgemVybwotCSAgIGltcGxpZXMgdGhlIGxpbmUgc2hvdWxkIGJlL2hhcyBiZWVuIGNsb3NlZC4gIEEgYml0Ci0JICAgbGF0ZXIgaW4gdGhpcyByb3V0aW5lIHN1Y2ggYSB0ZXN0IGlzIHBlcmZvcm1lZC4gKi8KIAotCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCi0JaW5mby0+Y29yNSA9IDA7Ci0JaW5mby0+Y29yNCA9IDA7Ci0JaW5mby0+Y29yMyA9IChpbmZvLT5kZWZhdWx0X3RocmVzaG9sZAotCQkgICAgICA/IGluZm8tPmRlZmF1bHRfdGhyZXNob2xkCi0JCSAgICAgIDogYmF1ZF9jb3IzW2ldKTsgLyogcmVjZWl2ZSB0aHJlc2hvbGQgKi8KLQlpbmZvLT5jb3IyID0gQ3lFVEM7Ci0Jc3dpdGNoKGNmbGFnICYgQ1NJWkUpewotCWNhc2UgQ1M1OgotCSAgICBpbmZvLT5jb3IxID0gQ3lfNV9CSVRTOwotCSAgICBicmVhazsKLQljYXNlIENTNjoKLQkgICAgaW5mby0+Y29yMSA9IEN5XzZfQklUUzsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUzc6Ci0JICAgIGluZm8tPmNvcjEgPSBDeV83X0JJVFM7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1M4OgotCSAgICBpbmZvLT5jb3IxID0gQ3lfOF9CSVRTOwotCSAgICBicmVhazsKLQl9Ci0JaWYoY2ZsYWcgJiBDU1RPUEIpewotCSAgICBpbmZvLT5jb3IxIHw9IEN5XzJfU1RPUDsKLQl9Ci0JaWYgKGNmbGFnICYgUEFSRU5CKXsKLQkgICAgaWYgKGNmbGFnICYgUEFST0REKXsKLQkJaW5mby0+Y29yMSB8PSBDeVBBUklUWV9POwotCSAgICB9ZWxzZXsKLQkJaW5mby0+Y29yMSB8PSBDeVBBUklUWV9FOwotCSAgICB9Ci0JfWVsc2V7Ci0JICAgIGluZm8tPmNvcjEgfD0gQ3lQQVJJVFlfTk9ORTsKLQl9Ci0JICAgIAotCS8qIENUUyBmbG93IGNvbnRyb2wgZmxhZyAqLwotCWlmIChjZmxhZyAmIENSVFNDVFMpewotCSAgICBpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKLQkgICAgaW5mby0+Y29yMiB8PSBDeUN0c0FFOwotCX1lbHNlewotCSAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7Ci0JICAgIGluZm8tPmNvcjIgJj0gfkN5Q3RzQUU7Ci0JfQotCWlmIChjZmxhZyAmIENMT0NBTCkKLQkgICAgaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOwotCWVsc2UKLQkgICAgaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworCWNoaXBfbnVtYmVyID0gY2hhbm5lbCAvIDQ7CisKKwlpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisKKwkJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKworCQkvKiBiYXVkIHJhdGUgKi8KKwkJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7CisJCWlmIChiYXVkID09IDM4NDAwICYmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PQorCQkJCUFTWU5DX1NQRF9DVVNUKSB7CisJCQlpZiAoaW5mby0+Y3VzdG9tX2Rpdmlzb3IpCisJCQkJYmF1ZF9yYXRlID0gaW5mby0+YmF1ZCAvIGluZm8tPmN1c3RvbV9kaXZpc29yOworCQkJZWxzZQorCQkJCWJhdWRfcmF0ZSA9IGluZm8tPmJhdWQ7CisJCX0gZWxzZSBpZiAoYmF1ZCA+IENEMTQwMF9NQVhfU1BFRUQpIHsKKwkJCWJhdWQgPSBDRDE0MDBfTUFYX1NQRUVEOworCQl9CisJCS8qIGZpbmQgdGhlIGJhdWQgaW5kZXggKi8KKwkJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJCWlmIChiYXVkID09IGJhdWRfdGFibGVbaV0pIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSAyMCkgeworCQkJaSA9IDE5OwkvKiBDRDE0MDBfTUFYX1NQRUVEICovCisJCX0KKworCQlpZiAoYmF1ZCA9PSAzODQwMCAmJiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0KKwkJCQlBU1lOQ19TUERfQ1VTVCkgeworCQkJY3l5X2JhdWRfY2FsYyhpbmZvLCBiYXVkX3JhdGUpOworCQl9IGVsc2UgeworCQkJaWYgKGluZm8tPmNoaXBfcmV2ID49IENEMTQwMF9SRVZfSikgeworCQkJCS8qIEl0IGlzIGEgQ0QxNDAwIHJldi4gSiBvciBsYXRlciAqLworCQkJCWluZm8tPnRicHIgPSBiYXVkX2Jwcl82MFtpXTsJLyogVHggQlBSICovCisJCQkJaW5mby0+dGNvID0gYmF1ZF9jb182MFtpXTsJLyogVHggQ08gKi8KKwkJCQlpbmZvLT5yYnByID0gYmF1ZF9icHJfNjBbaV07CS8qIFJ4IEJQUiAqLworCQkJCWluZm8tPnJjbyA9IGJhdWRfY29fNjBbaV07CS8qIFJ4IENPICovCisJCQl9IGVsc2UgeworCQkJCWluZm8tPnRicHIgPSBiYXVkX2Jwcl8yNVtpXTsJLyogVHggQlBSICovCisJCQkJaW5mby0+dGNvID0gYmF1ZF9jb18yNVtpXTsJLyogVHggQ08gKi8KKwkJCQlpbmZvLT5yYnByID0gYmF1ZF9icHJfMjVbaV07CS8qIFJ4IEJQUiAqLworCQkJCWluZm8tPnJjbyA9IGJhdWRfY29fMjVbaV07CS8qIFJ4IENPICovCisJCQl9CisJCX0KKwkJaWYgKGJhdWRfdGFibGVbaV0gPT0gMTM0KSB7CisJCQkvKiBnZXQgaXQgcmlnaHQgZm9yIDEzNC41IGJhdWQgKi8KKwkJCWluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUgKiBIWiAqIDMwIC8gMjY5KSArCisJCQkJCTI7CisJCX0gZWxzZSBpZiAoYmF1ZCA9PSAzODQwMCAmJiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0KKwkJCQlBU1lOQ19TUERfQ1VTVCkgeworCQkJaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSAqIEhaICogMTUgLworCQkJCQliYXVkX3JhdGUpICsgMjsKKwkJfSBlbHNlIGlmIChiYXVkX3RhYmxlW2ldKSB7CisJCQlpbmZvLT50aW1lb3V0ID0gKGluZm8tPnhtaXRfZmlmb19zaXplICogSFogKiAxNSAvCisJCQkJCWJhdWRfdGFibGVbaV0pICsgMjsKKwkJCS8qIHRoaXMgbmVlZHMgdG8gYmUgcHJvcGFnYXRlZCBpbnRvIHRoZSBjYXJkIGluZm8gKi8KKwkJfSBlbHNlIHsKKwkJCWluZm8tPnRpbWVvdXQgPSAwOworCQl9CisJCS8qIEJ5IHRyYWRpdGlvbiAoaXMgaXQgYSBzdGFuZGFyZD8pIGEgYmF1ZCByYXRlIG9mIHplcm8KKwkJICAgaW1wbGllcyB0aGUgbGluZSBzaG91bGQgYmUvaGFzIGJlZW4gY2xvc2VkLiAgQSBiaXQKKwkJICAgbGF0ZXIgaW4gdGhpcyByb3V0aW5lIHN1Y2ggYSB0ZXN0IGlzIHBlcmZvcm1lZC4gKi8KKworCQkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLworCQlpbmZvLT5jb3I1ID0gMDsKKwkJaW5mby0+Y29yNCA9IDA7CisJCS8qIHJlY2VpdmUgdGhyZXNob2xkICovCisJCWluZm8tPmNvcjMgPSAoaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQgPworCQkJCWluZm8tPmRlZmF1bHRfdGhyZXNob2xkIDogYmF1ZF9jb3IzW2ldKTsKKwkJaW5mby0+Y29yMiA9IEN5RVRDOworCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwkJY2FzZSBDUzU6CisJCQlpbmZvLT5jb3IxID0gQ3lfNV9CSVRTOworCQkJYnJlYWs7CisJCWNhc2UgQ1M2OgorCQkJaW5mby0+Y29yMSA9IEN5XzZfQklUUzsKKwkJCWJyZWFrOworCQljYXNlIENTNzoKKwkJCWluZm8tPmNvcjEgPSBDeV83X0JJVFM7CisJCQlicmVhazsKKwkJY2FzZSBDUzg6CisJCQlpbmZvLT5jb3IxID0gQ3lfOF9CSVRTOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CisJCQlpbmZvLT5jb3IxIHw9IEN5XzJfU1RPUDsKKwkJfQorCQlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKKwkJCWlmIChjZmxhZyAmIFBBUk9ERCkgeworCQkJCWluZm8tPmNvcjEgfD0gQ3lQQVJJVFlfTzsKKwkJCX0gZWxzZSB7CisJCQkJaW5mby0+Y29yMSB8PSBDeVBBUklUWV9FOworCQkJfQorCQl9IGVsc2UgeworCQkJaW5mby0+Y29yMSB8PSBDeVBBUklUWV9OT05FOworCQl9CisKKwkJLyogQ1RTIGZsb3cgY29udHJvbCBmbGFnICovCisJCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKKwkJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQkJaW5mby0+Y29yMiB8PSBDeUN0c0FFOworCQl9IGVsc2UgeworCQkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOworCQkJaW5mby0+Y29yMiAmPSB+Q3lDdHNBRTsKKwkJfQorCQlpZiAoY2ZsYWcgJiBDTE9DQUwpCisJCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJCWVsc2UKKwkJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOwogCiAJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCSAgICBUaGUgaGFyZHdhcmUgb3B0aW9uLCBDeVJ0c0FPLCBwcmVzZW50cyBSVFMgd2hlbgpAQCAtMzE2NywzMDAgKzMyMzgsMzE5IEBACiAJICAgIGNhYmxlLiAgQ29udGFjdCBNYXJjaW8gU2FpdG8gZm9yIGRldGFpbHMuCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JY2hpcCA9IGNoYW5uZWw+PjI7Ci0JY2hhbm5lbCAmPSAweDAzOwotCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisJCWNoaXAgPSBjaGFubmVsID4+IDI7CisJCWNoYW5uZWwgJj0gMHgwMzsKKwkJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKworCQkJKGN5X2NoaXBfb2Zmc2V0W2NoaXBdIDw8IGluZGV4KTsKIAotCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOworCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksICh1X2NoYXIpIGNoYW5uZWwpOwogCi0JICAgLyogdHggYW5kIHJ4IGJhdWQgcmF0ZSAqLworCQkvKiB0eCBhbmQgcnggYmF1ZCByYXRlICovCiAKLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lUQ09SPDxpbmRleCksIGluZm8tPnRjbyk7Ci0JICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5VEJQUjw8aW5kZXgpLCBpbmZvLT50YnByKTsKLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lSQ09SPDxpbmRleCksIGluZm8tPnJjbyk7Ci0JICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5UkJQUjw8aW5kZXgpLCBpbmZvLT5yYnByKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVRDT1IgPDwgaW5kZXgpLCBpbmZvLT50Y28pOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5VEJQUiA8PCBpbmRleCksIGluZm8tPnRicHIpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5UkNPUiA8PCBpbmRleCksIGluZm8tPnJjbyk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lSQlBSIDw8IGluZGV4KSwgaW5mby0+cmJwcik7CiAKLQkgICAgLyogc2V0IGxpbmUgY2hhcmFjdGVyaXN0aWNzICBhY2NvcmRpbmcgY29uZmlndXJhdGlvbiAqLworCQkvKiBzZXQgbGluZSBjaGFyYWN0ZXJpc3RpY3MgIGFjY29yZGluZyBjb25maWd1cmF0aW9uICovCiAKLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTQ0hSMTw8aW5kZXgpLCAKLQkJICAgICAgU1RBUlRfQ0hBUihpbmZvLT50dHkpKTsKLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTQ0hSMjw8aW5kZXgpLCAKLQkJICAgICAgU1RPUF9DSEFSKGluZm8tPnR0eSkpOwotCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNPUjE8PGluZGV4KSwgaW5mby0+Y29yMSk7Ci0JICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q09SMjw8aW5kZXgpLCBpbmZvLT5jb3IyKTsKLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDT1IzPDxpbmRleCksIGluZm8tPmNvcjMpOwotCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNPUjQ8PGluZGV4KSwgaW5mby0+Y29yNCk7Ci0JICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q09SNTw8aW5kZXgpLCBpbmZvLT5jb3I1KTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVNDSFIxIDw8IGluZGV4KSwKKwkJCSAgU1RBUlRfQ0hBUihpbmZvLT50dHkpKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVNDSFIyIDw8IGluZGV4KSwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q09SMSA8PCBpbmRleCksIGluZm8tPmNvcjEpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q09SMiA8PCBpbmRleCksIGluZm8tPmNvcjIpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q09SMyA8PCBpbmRleCksIGluZm8tPmNvcjMpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q09SNCA8PCBpbmRleCksIGluZm8tPmNvcjQpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q09SNSA8PCBpbmRleCksIGluZm8tPmNvcjUpOwogCi0JICAgIGN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLAotCQkgICAgIEN5Q09SX0NIQU5HRXxDeUNPUjFjaHxDeUNPUjJjaHxDeUNPUjNjaCxpbmRleCk7CisJCWN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLCBDeUNPUl9DSEFOR0UgfCBDeUNPUjFjaCB8IEN5Q09SMmNoIHwKKwkJCQlDeUNPUjNjaCwgaW5kZXgpOwogCi0JICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksIAotCQkgICAgICAodV9jaGFyKWNoYW5uZWwpOyAvKiAhISEgSXMgdGhpcyBuZWVkZWQ/ICovCi0JICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5UlRQUjw8aW5kZXgpLCAoaW5mby0+ZGVmYXVsdF90aW1lb3V0Ci0JCQkJCSAgICAgICAgID8gaW5mby0+ZGVmYXVsdF90aW1lb3V0Ci0JCQkJCSAgICAgICAgIDogMHgwMikpOyAvKiAxMG1zIHJ4IHRpbWVvdXQgKi8KKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksICh1X2NoYXIpIGNoYW5uZWwpOwkvKiAhISEgSXMgdGhpcyBuZWVkZWQ/ICovCisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lSVFBSIDw8IGluZGV4KSwKKwkJCShpbmZvLT5kZWZhdWx0X3RpbWVvdXQgPyBpbmZvLT5kZWZhdWx0X3RpbWVvdXQgOiAweDAyKSk7CisJCS8qIDEwbXMgcnggdGltZW91dCAqLwogCi0JICAgIGlmIChDX0NMT0NBTChpbmZvLT50dHkpKSB7Ci0JCS8qIHdpdGhvdXQgbW9kZW0gaW50ciAqLwotCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwKLSAgICAgICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSB8IEN5TWRtQ2gpOyAKLQkJCQkJLyogYWN0IG9uIDEtPjAgbW9kZW0gdHJhbnNpdGlvbnMgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGNmbGFnICYgQ1JUU0NUUykgJiYgaW5mby0+cmZsb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjE8PGluZGV4KSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEN5Q1RTfHJmbG93X3RocltpXSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IxPDxpbmRleCksIEN5Q1RTKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJCS8qIGFjdCBvbiAwLT4xIG1vZGVtIHRyYW5zaXRpb25zICovCi0JCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjI8PGluZGV4KSwgQ3lDVFMpOwotCSAgICB9IGVsc2UgewotCQkvKiB3aXRob3V0IG1vZGVtIGludHIgKi8KLQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksCi0gICAgICAgICAgICAgICAgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgfCBDeU1kbUNoKTsgCi0JCQkJCS8qIGFjdCBvbiAxLT4wIG1vZGVtIHRyYW5zaXRpb25zICovCi0gICAgICAgICAgICAgICAgaWYgKChjZmxhZyAmIENSVFNDVFMpICYmIGluZm8tPnJmbG93KSB7Ci0JCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IxPDxpbmRleCksIAotICAgICAgICAJICAgICAgICAgICAgICAgICAgKEN5RFNSfEN5Q1RTfEN5Ukl8Q3lEQ0R8cmZsb3dfdGhyW2ldKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TUNPUjE8PGluZGV4KSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3lEU1J8Q3lDVFN8Q3lSSXxDeURDRCk7Ci0gICAgICAgICAgICAgICAgfQotCQkJCQkvKiBhY3Qgb24gMC0+MSBtb2RlbSB0cmFuc2l0aW9ucyAqLwotCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1DT1IyPDxpbmRleCksIAotCQkJICBDeURTUnxDeUNUU3xDeVJJfEN5RENEKTsKLQkgICAgfQotCi0JICAgIGlmKGkgPT0gMCl7IC8qIGJhdWQgcmF0ZSBpcyB6ZXJvLCB0dXJuIG9mZiBsaW5lICovCi0JICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgewotCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCB+Q3lSVFMpOworCQlpZiAoQ19DTE9DQUwoaW5mby0+dHR5KSkgeworCQkJLyogd2l0aG91dCBtb2RlbSBpbnRyICovCisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5U1JFUiA8PCBpbmRleCksCisJCQkJICBjeV9yZWFkYihiYXNlX2FkZHIgKworCQkJCQkgICAoQ3lTUkVSIDw8IGluZGV4KSkgfCBDeU1kbUNoKTsKKwkJCS8qIGFjdCBvbiAxLT4wIG1vZGVtIHRyYW5zaXRpb25zICovCisJCQlpZiAoKGNmbGFnICYgQ1JUU0NUUykgJiYgaW5mby0+cmZsb3cpIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TUNPUjEgPDwgaW5kZXgpLAorCQkJCQkgIChDeUNUUyB8IHJmbG93X3RocltpXSkpOworCQkJfSBlbHNlIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TUNPUjEgPDwgaW5kZXgpLAorCQkJCQkgIEN5Q1RTKTsKKwkJCX0KKwkJCS8qIGFjdCBvbiAwLT4xIG1vZGVtIHRyYW5zaXRpb25zICovCisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TUNPUjIgPDwgaW5kZXgpLCBDeUNUUyk7CiAJCX0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIH5DeURUUik7CisJCQkvKiB3aXRob3V0IG1vZGVtIGludHIgKi8KKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lTUkVSIDw8IGluZGV4KSwKKwkJCQkgIGN5X3JlYWRiKGJhc2VfYWRkciArCisJCQkJCSAgIChDeVNSRVIgPDwgaW5kZXgpKSB8IEN5TWRtQ2gpOworCQkJLyogYWN0IG9uIDEtPjAgbW9kZW0gdHJhbnNpdGlvbnMgKi8KKwkJCWlmICgoY2ZsYWcgJiBDUlRTQ1RTKSAmJiBpbmZvLT5yZmxvdykgeworCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lNQ09SMSA8PCBpbmRleCksCisJCQkJCSAgKEN5RFNSIHwgQ3lDVFMgfCBDeVJJIHwgQ3lEQ0QgfAorCQkJCQkgICByZmxvd190aHJbaV0pKTsKKwkJCX0gZWxzZSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1DT1IxIDw8IGluZGV4KSwKKwkJCQkJICBDeURTUiB8IEN5Q1RTIHwgQ3lSSSB8IEN5RENEKTsKKwkJCX0KKwkJCS8qIGFjdCBvbiAwLT4xIG1vZGVtIHRyYW5zaXRpb25zICovCisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TUNPUjIgPDwgaW5kZXgpLAorCQkJCSAgQ3lEU1IgfCBDeUNUUyB8IEN5UkkgfCBDeURDRCk7CiAJCX0KKworCQlpZiAoaSA9PSAwKSB7CS8qIGJhdWQgcmF0ZSBpcyB6ZXJvLCB0dXJuIG9mZiBsaW5lICovCisJCQlpZiAoaW5mby0+cnRzZHRyX2ludikgeworCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lNU1ZSMSA8PCBpbmRleCksCisJCQkJCSAgfkN5UlRTKTsKKwkJCX0gZWxzZSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIyIDw8IGluZGV4KSwKKwkJCQkJICB+Q3lEVFIpOworCQkJfQogI2lmZGVmIENZX0RFQlVHX0RUUgotCQlwcmludGsoImN5YzpzZXRfbGluZV9jaGFyIGRyb3BwaW5nIERUUlxuIik7Ci0JCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsIAotCQkgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCkpLAotCQkgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCkpKTsKKwkJCXByaW50aygiY3ljOnNldF9saW5lX2NoYXIgZHJvcHBpbmcgRFRSXG4iKTsKKwkJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCQkJY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5TVNWUjEgPDwgaW5kZXgpKSwKKwkJCQljeV9yZWFkYihiYXNlX2FkZHIgKyAoQ3lNU1ZSMiA8PCBpbmRleCkpKTsKICNlbmRpZgotCSAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgewotCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCBDeVJUUyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSwgQ3lEVFIpOwotICAgICAgICAgICAgICAgIH0KKwkJfSBlbHNlIHsKKwkJCWlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIxIDw8IGluZGV4KSwKKwkJCQkJICBDeVJUUyk7CisJCQl9IGVsc2UgeworCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lNU1ZSMiA8PCBpbmRleCksCisJCQkJCSAgQ3lEVFIpOworCQkJfQogI2lmZGVmIENZX0RFQlVHX0RUUgotCQlwcmludGsoImN5YzpzZXRfbGluZV9jaGFyIHJhaXNpbmcgRFRSXG4iKTsKLQkJcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwKLQkJICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpKSwKLQkJICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpKSk7CisJCQlwcmludGsoImN5YzpzZXRfbGluZV9jaGFyIHJhaXNpbmcgRFRSXG4iKTsKKwkJCXByaW50aygiICAgICBzdGF0dXM6IDB4JXgsIDB4JXhcbiIsCisJCQkJY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5TVNWUjEgPDwgaW5kZXgpKSwKKwkJCQljeV9yZWFkYihiYXNlX2FkZHIgKyAoQ3lNU1ZSMiA8PCBpbmRleCkpKTsKICNlbmRpZgotCSAgICB9CisJCX0KIAotCSAgICBpZiAoaW5mby0+dHR5KXsKLQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCSAgICB9Ci0JQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJaWYgKGluZm8tPnR0eSkgeworCQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQl9CisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CiAKLSAgICB9IGVsc2UgewotICAgICAgc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKLSAgICAgIHN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKLSAgICAgIHN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7Ci0gICAgICBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOwotICAgICAgc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKmJ1Zl9jdHJsOwotICAgICAgdWNsb25nIHN3X2Zsb3c7Ci0gICAgICBpbnQgcmV0dmFsOwotCi0gICAgICAgIGZpcm1faWQgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0gICAgICAgIGlmICghSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKSB7Ci0JICAgIHJldHVybjsKLQl9Ci0KLQl6ZndfY3RybCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X3JlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7Ci0JYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKLQljaF9jdHJsID0gJih6ZndfY3RybC0+Y2hfY3RybFtjaGFubmVsXSk7Ci0JYnVmX2N0cmwgPSAmemZ3X2N0cmwtPmJ1Zl9jdHJsW2NoYW5uZWxdOwotCi0JLyogYmF1ZCByYXRlICovCi0JYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7Ci0JaWYgKChiYXVkID09IDM4NDAwKSAmJgotCSAgICAoKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09IEFTWU5DX1NQRF9DVVNUKSkgewotCSAgICBpZiAoaW5mby0+Y3VzdG9tX2Rpdmlzb3IpCi0JCWJhdWRfcmF0ZSA9IGluZm8tPmJhdWQgLyBpbmZvLT5jdXN0b21fZGl2aXNvcjsKLQkgICAgZWxzZQotCQliYXVkX3JhdGUgPSBpbmZvLT5iYXVkOwotCX0gZWxzZSBpZiAoYmF1ZCA+IENZWl9NQVhfU1BFRUQpIHsKLQkgICAgYmF1ZCA9IENZWl9NQVhfU1BFRUQ7Ci0JfQotCWN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9iYXVkICwgYmF1ZCk7Ci0KLQlpZiAoYmF1ZCA9PSAxMzQpIHsKLQkgICAgLyogZ2V0IGl0IHJpZ2h0IGZvciAxMzQuNSBiYXVkICovCi0JICAgIGluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUqSFoqMzAvMjY5KSArIDI7Ci0JfSBlbHNlIGlmICgoYmF1ZCA9PSAzODQwMCkgJiYKLQkJICAgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCkpIHsKLQkgICAgaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSpIWioxNS9iYXVkX3JhdGUpICsgMjsKLQl9IGVsc2UgaWYgKGJhdWQpIHsKLQkgICAgaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSpIWioxNS9iYXVkKSArIDI7Ci0JICAgIC8qIHRoaXMgbmVlZHMgdG8gYmUgcHJvcGFnYXRlZCBpbnRvIHRoZSBjYXJkIGluZm8gKi8KIAl9IGVsc2UgewotCSAgICBpbmZvLT50aW1lb3V0ID0gMDsKLQl9CisJCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7CisJCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKKwkJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKwkJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKwkJc3RydWN0IEJVRl9DVFJMIF9faW9tZW0gKmJ1Zl9jdHJsOworCQl1Y2xvbmcgc3dfZmxvdzsKKwkJaW50IHJldHZhbDsKIAotCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCi0Jc3dpdGNoKGNmbGFnICYgQ1NJWkUpewotCWNhc2UgQ1M1OiBjeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sICwgQ19ETF9DUzUpOyBicmVhazsKLQljYXNlIENTNjogY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCAsIENfRExfQ1M2KTsgYnJlYWs7Ci0JY2FzZSBDUzc6IGN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9kYXRhX2wgLCBDX0RMX0NTNyk7IGJyZWFrOwotCWNhc2UgQ1M4OiBjeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sICwgQ19ETF9DUzgpOyBicmVhazsKLQl9Ci0JaWYoY2ZsYWcgJiBDU1RPUEIpewotCSAgICBjeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sLAotICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sKSB8IENfRExfMlNUT1ApOwotCX1lbHNlewotCSAgICBjeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sLAotICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sKSB8IENfRExfMVNUT1ApOwotCX0KLQlpZiAoY2ZsYWcgJiBQQVJFTkIpewotCSAgICBpZiAoY2ZsYWcgJiBQQVJPREQpewotCQljeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fcGFyaXR5ICwgQ19QUl9PREQpOwotCSAgICB9ZWxzZXsKLQkJY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX3Bhcml0eSAsIENfUFJfRVZFTik7Ci0JICAgIH0KLQl9ZWxzZXsKLQkgICAgY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX3Bhcml0eSAsIENfUFJfTk9ORSk7Ci0JfQorCQlmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCQlpZiAoIUlTWkxPQURFRChjeV9jYXJkW2NhcmRdKSkgeworCQkJcmV0dXJuOworCQl9CiAKLQkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgKi8KLQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKXsKLQkgICAgY3lfd3JpdGVsKCZjaF9jdHJsLT5od19mbG93LAotICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmwtPmh3X2Zsb3cpIHwgQ19SU19DVFMgfCBDX1JTX1JUUyk7Ci0JfWVsc2V7Ci0JICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+aHdfZmxvdywKLSAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsLT5od19mbG93KSAmIH4oQ19SU19DVFMgfCBDX1JTX1JUUykpOwotCX0KLQkvKiBBcyB0aGUgSFcgZmxvdyBjb250cm9sIGlzIGRvbmUgaW4gZmlybXdhcmUsIHRoZSBkcml2ZXIgZG9lc24ndAotCSAgIG5lZWQgdG8gY2FyZSBhYm91dCBpdCAqLwotCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwkJemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArCisJCQkoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwkJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKKwkJY2hfY3RybCA9ICYoemZ3X2N0cmwtPmNoX2N0cmxbY2hhbm5lbF0pOworCQlidWZfY3RybCA9ICZ6ZndfY3RybC0+YnVmX2N0cmxbY2hhbm5lbF07CiAKLQkvKiBYT04vWE9GRi9YQU5ZIGZsb3cgY29udHJvbCBmbGFncyAqLwotCXN3X2Zsb3cgPSAwOwotCWlmIChpZmxhZyAmIElYT04pewotCSAgICBzd19mbG93IHw9IENfRkxfT1hYOwotCSAgICBpZiAoaWZsYWcgJiBJWEFOWSkKLQkJc3dfZmxvdyB8PSBDX0ZMX09JWEFOWTsKLQl9Ci0JY3lfd3JpdGVsKCZjaF9jdHJsLT5zd19mbG93LCBzd19mbG93KTsKKwkJLyogYmF1ZCByYXRlICovCisJCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCQlpZiAoYmF1ZCA9PSAzODQwMCAmJiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0KKwkJCQlBU1lOQ19TUERfQ1VTVCkgeworCQkJaWYgKGluZm8tPmN1c3RvbV9kaXZpc29yKQorCQkJCWJhdWRfcmF0ZSA9IGluZm8tPmJhdWQgLyBpbmZvLT5jdXN0b21fZGl2aXNvcjsKKwkJCWVsc2UKKwkJCQliYXVkX3JhdGUgPSBpbmZvLT5iYXVkOworCQl9IGVsc2UgaWYgKGJhdWQgPiBDWVpfTUFYX1NQRUVEKSB7CisJCQliYXVkID0gQ1laX01BWF9TUEVFRDsKKwkJfQorCQljeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fYmF1ZCwgYmF1ZCk7CiAKLQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lPQ1RMLCAwTCk7Ci0JaWYgKHJldHZhbCAhPSAwKXsKLQkgICAgcHJpbnRrKCJjeWM6c2V0X2xpbmVfY2hhciByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKLQkJICAgaW5mby0+bGluZSwgcmV0dmFsKTsKLQl9CisJCWlmIChiYXVkID09IDEzNCkgeworCQkJLyogZ2V0IGl0IHJpZ2h0IGZvciAxMzQuNSBiYXVkICovCisJCQlpbmZvLT50aW1lb3V0ID0gKGluZm8tPnhtaXRfZmlmb19zaXplICogSFogKiAzMCAvIDI2OSkgKworCQkJCQkyOworCQl9IGVsc2UgaWYgKGJhdWQgPT0gMzg0MDAgJiYgKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spID09CisJCQkJQVNZTkNfU1BEX0NVU1QpIHsKKwkJCWluZm8tPnRpbWVvdXQgPSAoaW5mby0+eG1pdF9maWZvX3NpemUgKiBIWiAqIDE1IC8KKwkJCQkJYmF1ZF9yYXRlKSArIDI7CisJCX0gZWxzZSBpZiAoYmF1ZCkgeworCQkJaW5mby0+dGltZW91dCA9IChpbmZvLT54bWl0X2ZpZm9fc2l6ZSAqIEhaICogMTUgLworCQkJCQliYXVkKSArIDI7CisJCQkvKiB0aGlzIG5lZWRzIHRvIGJlIHByb3BhZ2F0ZWQgaW50byB0aGUgY2FyZCBpbmZvICovCisJCX0gZWxzZSB7CisJCQlpbmZvLT50aW1lb3V0ID0gMDsKKwkJfQogCi0JLyogQ0Qgc2Vuc2l0aXZpdHkgKi8KLQlpZiAoY2ZsYWcgJiBDTE9DQUwpewotCSAgICBpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7Ci0JfWVsc2V7Ci0JICAgIGluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOwotCX0KKwkJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwkJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJCWNhc2UgQ1M1OgorCQkJY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCwgQ19ETF9DUzUpOworCQkJYnJlYWs7CisJCWNhc2UgQ1M2OgorCQkJY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCwgQ19ETF9DUzYpOworCQkJYnJlYWs7CisJCWNhc2UgQ1M3OgorCQkJY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCwgQ19ETF9DUzcpOworCQkJYnJlYWs7CisJCWNhc2UgQ1M4OgorCQkJY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCwgQ19ETF9DUzgpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CisJCQljeV93cml0ZWwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sLAorCQkJCSAgY3lfcmVhZGwoJmNoX2N0cmwtPmNvbW1fZGF0YV9sKSB8IENfRExfMlNUT1ApOworCQl9IGVsc2UgeworCQkJY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCwKKwkJCQkgIGN5X3JlYWRsKCZjaF9jdHJsLT5jb21tX2RhdGFfbCkgfCBDX0RMXzFTVE9QKTsKKwkJfQorCQlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKKwkJCWlmIChjZmxhZyAmIFBBUk9ERCkgeworCQkJCWN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9wYXJpdHksIENfUFJfT0REKTsKKwkJCX0gZWxzZSB7CisJCQkJY3lfd3JpdGVsKCZjaF9jdHJsLT5jb21tX3Bhcml0eSwgQ19QUl9FVkVOKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWN5X3dyaXRlbCgmY2hfY3RybC0+Y29tbV9wYXJpdHksIENfUFJfTk9ORSk7CisJCX0KIAotCWlmKGJhdWQgPT0gMCl7IC8qIGJhdWQgcmF0ZSBpcyB6ZXJvLCB0dXJuIG9mZiBsaW5lICovCi0JICAgIGN5X3dyaXRlbCgmY2hfY3RybC0+cnNfY29udHJvbCwKLSAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsLT5yc19jb250cm9sKSAmIH5DX1JTX0RUUik7CisJCS8qIENUUyBmbG93IGNvbnRyb2wgZmxhZyAqLworCQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCQljeV93cml0ZWwoJmNoX2N0cmwtPmh3X2Zsb3csCisJCQkJICBjeV9yZWFkbCgmY2hfY3RybC0+CisJCQkJCSAgIGh3X2Zsb3cpIHwgQ19SU19DVFMgfCBDX1JTX1JUUyk7CisJCX0gZWxzZSB7CisJCQljeV93cml0ZWwoJmNoX2N0cmwtPmh3X2Zsb3csCisJCQkJICBjeV9yZWFkbCgmY2hfY3RybC0+CisJCQkJCSAgIGh3X2Zsb3cpICYgfihDX1JTX0NUUyB8IENfUlNfUlRTKSk7CisJCX0KKwkJLyogQXMgdGhlIEhXIGZsb3cgY29udHJvbCBpcyBkb25lIGluIGZpcm13YXJlLCB0aGUgZHJpdmVyCisJCSAgIGRvZXNuJ3QgbmVlZCB0byBjYXJlIGFib3V0IGl0ICovCisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKworCQkvKiBYT04vWE9GRi9YQU5ZIGZsb3cgY29udHJvbCBmbGFncyAqLworCQlzd19mbG93ID0gMDsKKwkJaWYgKGlmbGFnICYgSVhPTikgeworCQkJc3dfZmxvdyB8PSBDX0ZMX09YWDsKKwkJCWlmIChpZmxhZyAmIElYQU5ZKQorCQkJCXN3X2Zsb3cgfD0gQ19GTF9PSVhBTlk7CisJCX0KKwkJY3lfd3JpdGVsKCZjaF9jdHJsLT5zd19mbG93LCBzd19mbG93KTsKKworCQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0lPQ1RMLCAwTCk7CisJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJcHJpbnRrKCJjeWM6c2V0X2xpbmVfY2hhciByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJCQlpbmZvLT5saW5lLCByZXR2YWwpOworCQl9CisKKwkJLyogQ0Qgc2Vuc2l0aXZpdHkgKi8KKwkJaWYgKGNmbGFnICYgQ0xPQ0FMKSB7CisJCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJCX0gZWxzZSB7CisJCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DSEVDS19DRDsKKwkJfQorCisJCWlmIChiYXVkID09IDApIHsJLyogYmF1ZCByYXRlIGlzIHplcm8sIHR1cm4gb2ZmIGxpbmUgKi8KKwkJCWN5X3dyaXRlbCgmY2hfY3RybC0+cnNfY29udHJvbCwKKwkJCQkgIGN5X3JlYWRsKCZjaF9jdHJsLT5yc19jb250cm9sKSAmIH5DX1JTX0RUUik7CiAjaWZkZWYgQ1lfREVCVUdfRFRSCi0JICAgIHByaW50aygiY3ljOnNldF9saW5lX2NoYXIgZHJvcHBpbmcgWiBEVFJcbiIpOworCQkJcHJpbnRrKCJjeWM6c2V0X2xpbmVfY2hhciBkcm9wcGluZyBaIERUUlxuIik7CiAjZW5kaWYKLQl9ZWxzZXsKLQkgICAgY3lfd3JpdGVsKCZjaF9jdHJsLT5yc19jb250cm9sLAotICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmwtPnJzX2NvbnRyb2wpIHwgQ19SU19EVFIpOworCQl9IGVsc2UgeworCQkJY3lfd3JpdGVsKCZjaF9jdHJsLT5yc19jb250cm9sLAorCQkJCSAgY3lfcmVhZGwoJmNoX2N0cmwtPnJzX2NvbnRyb2wpIHwgQ19SU19EVFIpOwogI2lmZGVmIENZX0RFQlVHX0RUUgotCSAgICBwcmludGsoImN5YzpzZXRfbGluZV9jaGFyIHJhaXNpbmcgWiBEVFJcbiIpOworCQkJcHJpbnRrKCJjeWM6c2V0X2xpbmVfY2hhciByYWlzaW5nIFogRFRSXG4iKTsKICNlbmRpZgotCX0KKwkJfQogCi0JcmV0dmFsID0gY3l6X2lzc3VlX2NtZCggJmN5X2NhcmRbY2FyZF0sIGNoYW5uZWwsIENfQ01fSU9DVExNLCAwTCk7Ci0JaWYgKHJldHZhbCAhPSAwKXsKLQkgICAgcHJpbnRrKCJjeWM6c2V0X2xpbmVfY2hhcigyKSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKLQkJICAgaW5mby0+bGluZSwgcmV0dmFsKTsKLQl9CisJCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbY2FyZF0sIGNoYW5uZWwsIENfQ01fSU9DVExNLDBMKTsKKwkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQlwcmludGsoImN5YzpzZXRfbGluZV9jaGFyKDIpIHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAorCQkJCWluZm8tPmxpbmUsIHJldHZhbCk7CisJCX0KIAotCWlmIChpbmZvLT50dHkpewotCSAgICBjbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJCWlmIChpbmZvLT50dHkpIHsKKwkJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKwkJfQogCX0KLSAgICB9Ci19IC8qIHNldF9saW5lX2NoYXIgKi8KLQorfQkJCQkvKiBzZXRfbGluZV9jaGFyICovCiAKIHN0YXRpYyBpbnQKLWdldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiByZXRpbmZvKQorZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLAorCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiByZXRpbmZvKQogewotICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7Ci0gIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbyA9ICZjeV9jYXJkW2luZm8tPmNhcmRdOworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKwlzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKIAotICAgIGlmICghcmV0aW5mbykKLSAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIG1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0gICAgdG1wLnR5cGUgPSBpbmZvLT50eXBlOwotICAgIHRtcC5saW5lID0gaW5mby0+bGluZTsKLSAgICB0bXAucG9ydCA9IGluZm8tPmNhcmQgKiAweDEwMCArIGluZm8tPmxpbmUgLSBjaW5mby0+Zmlyc3RfbGluZTsKLSAgICB0bXAuaXJxID0gY2luZm8tPmlycTsKLSAgICB0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKLSAgICB0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKLSAgICB0bXAuYmF1ZF9iYXNlID0gaW5mby0+YmF1ZDsKLSAgICB0bXAuY3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKLSAgICB0bXAuaHViNiA9IDA7ICAgICAgICAgICAgICAgLyohISEqLwotICAgIHJldHVybiBjb3B5X3RvX3VzZXIocmV0aW5mbywmdG1wLHNpemVvZigqcmV0aW5mbykpPy1FRkFVTFQ6MDsKLX0gLyogZ2V0X3NlcmlhbF9pbmZvICovCi0KKwlpZiAoIXJldGluZm8pCisJCXJldHVybiAtRUZBVUxUOworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLnR5cGUgPSBpbmZvLT50eXBlOworCXRtcC5saW5lID0gaW5mby0+bGluZTsKKwl0bXAucG9ydCA9IGluZm8tPmNhcmQgKiAweDEwMCArIGluZm8tPmxpbmUgLSBjaW5mby0+Zmlyc3RfbGluZTsKKwl0bXAuaXJxID0gY2luZm8tPmlycTsKKwl0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKKwl0bXAuY2xvc2VfZGVsYXkgPSBpbmZvLT5jbG9zZV9kZWxheTsKKwl0bXAuYmF1ZF9iYXNlID0gaW5mby0+YmF1ZDsKKwl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKKwl0bXAuaHViNiA9IDA7CQkvKiEhISAqLworCXJldHVybiBjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkgPyAtRUZBVUxUIDogMDsKK30JCQkJLyogZ2V0X3NlcmlhbF9pbmZvICovCiAKIHN0YXRpYyBpbnQKLXNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdfaW5mbykKK3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywKKwkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICogbmV3X2luZm8pCiB7Ci0gIHN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0IG9sZF9pbmZvOworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgb2xkX2luZm87CiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsbmV3X2luZm8sc2l6ZW9mKG5ld19zZXJpYWwpKSkKLQlyZXR1cm4gLUVGQVVMVDsKLSAgICBvbGRfaW5mbyA9ICppbmZvOworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3X2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCisJCXJldHVybiAtRUZBVUxUOworCW9sZF9pbmZvID0gKmluZm87CiAKLSAgICBpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLSAgICAgICAgICAgIGlmICgobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwKLQkJKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IGluZm8tPmJhdWQpIHx8Ci0JCSgobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTICYgfkFTWU5DX1VTUl9NQVNLKSAhPQotCQkgKGluZm8tPmZsYWdzICYgQVNZTkNfRkxBR1MgJiB+QVNZTkNfVVNSX01BU0spKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKLSAgICAgICAgICAgIGluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOwotICAgICAgICAgICAgaW5mby0+YmF1ZCA9IG5ld19zZXJpYWwuYmF1ZF9iYXNlOwotCSAgICBpbmZvLT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7Ci0gICAgICAgICAgICBnb3RvIGNoZWNrX2FuZF9leGl0OwotICAgIH0KKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkgfHwKKwkJCQluZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkIHx8CisJCQkJKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUyAmCisJCQkJCX5BU1lOQ19VU1JfTUFTSykgIT0KKwkJCQkoaW5mby0+ZmxhZ3MgJiBBU1lOQ19GTEFHUyAmIH5BU1lOQ19VU1JfTUFTSykpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpbmZvLT5mbGFncyA9IChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spOworCQlpbmZvLT5iYXVkID0gbmV3X3NlcmlhbC5iYXVkX2Jhc2U7CisJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKKwkJZ290byBjaGVja19hbmRfZXhpdDsKKwl9CiAKKwkvKgorCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KKwkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCisJICovCiAKLSAgICAvKgotICAgICAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KLSAgICAgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCi0gICAgICovCi0KLSAgICBpbmZvLT5iYXVkID0gbmV3X3NlcmlhbC5iYXVkX2Jhc2U7Ci0gICAgaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwotICAgIGluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAotICAgICAgICAgICAgICAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7Ci0gICAgaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFovMTAwOwotICAgIGluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFovMTAwOworCWluZm8tPmJhdWQgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKKwlpbmZvLT5jdXN0b21fZGl2aXNvciA9IG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3I7CisJaW5mby0+ZmxhZ3MgPSAoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKKwkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpOworCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOworCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7CiAKIGNoZWNrX2FuZF9leGl0OgotICAgIGlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKXsKLSAgICAgICAgc2V0X2xpbmVfY2hhcihpbmZvKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfWVsc2V7Ci0gICAgICAgIHJldHVybiBzdGFydHVwKGluZm8pOwotICAgIH0KLX0gLyogc2V0X3NlcmlhbF9pbmZvICovCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKKwkJc2V0X2xpbmVfY2hhcihpbmZvKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHN0YXJ0dXAoaW5mbyk7CisJfQorfQkJCQkvKiBzZXRfc2VyaWFsX2luZm8gKi8KIAogLyoKICAqIGdldF9sc3JfaW5mbyAtIGdldCBsaW5lIHN0YXR1cyByZWdpc3RlciBpbmZvCkBAIC0zNDcyLDQ0MSArMzU2Miw0NTIgQEAKICAqCSAgICB0cmFuc21pdCBob2xkaW5nIHJlZ2lzdGVyIGlzIGVtcHR5LiAgVGhpcyBmdW5jdGlvbmFsaXR5CiAgKgkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3N0YXRpYyBpbnQgZ2V0X2xzcl9pbmZvKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBpbnQgX191c2VyICogdmFsdWUpCiB7Ci0gICAgaW50IGNhcmQsIGNoaXAsIGNoYW5uZWwsIGluZGV4OwotICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOwotICAgIHVuc2lnbmVkIGludCByZXN1bHQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwlpbnQgY2FyZCwgY2hpcCwgY2hhbm5lbCwgaW5kZXg7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwogCi0gICAgY2FyZCA9IGluZm8tPmNhcmQ7Ci0gICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOwotICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKLQljaGlwID0gY2hhbm5lbD4+MjsKLQljaGFubmVsICY9IDB4MDM7Ci0JaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKLQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworCWNhcmQgPSBpbmZvLT5jYXJkOworCWNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lKTsKKwlpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJCWNoaXAgPSBjaGFubmVsID4+IDI7CisJCWNoYW5uZWwgJj0gMHgwMzsKKwkJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKwkJYmFzZV9hZGRyID0KKwkJICAgIGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdIDw8IGluZGV4KTsKIAotCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCXN0YXR1cyA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCkpICYgKEN5VHhSZHl8Q3lUeE1wdHkpOwotCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0JcmVzdWx0ID0gKHN0YXR1cyA/IDAgOiBUSU9DU0VSX1RFTVQpOwotICAgIH0gZWxzZSB7Ci0JLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIHZhbHVlKTsKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCXN0YXR1cyA9IGN5X3JlYWRiKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpKSAmCisJCQkJKEN5VHhSZHkgfCBDeVR4TXB0eSk7CisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJCXJlc3VsdCA9IChzdGF0dXMgPyAwIDogVElPQ1NFUl9URU1UKTsKKwl9IGVsc2UgeworCQkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopdmFsdWUpOwogfQogCi1zdGF0aWMgaW50Ci1jeV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgY3lfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gIGludCBjYXJkLGNoaXAsY2hhbm5lbCxpbmRleDsKLSAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gIHVuc2lnbmVkIGNoYXIgc3RhdHVzOwotICB1bnNpZ25lZCBsb25nIGxzdGF0dXM7Ci0gIHVuc2lnbmVkIGludCByZXN1bHQ7Ci0gIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7Ci0gIHN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKLSAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKLSAgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IGNhcmQsIGNoaXAsIGNoYW5uZWwsIGluZGV4OworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBsc3RhdHVzOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKwlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKwlzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOwogCi0gICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCi0JcmV0dXJuIC1FTk9ERVY7CisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsIF9fRlVOQ1RJT05fXykpCisJCXJldHVybiAtRU5PREVWOwogCi0gICAgY2FyZCA9IGluZm8tPmNhcmQ7Ci0gICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOwotICAgIGlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKLQljaGlwID0gY2hhbm5lbD4+MjsKLQljaGFubmVsICY9IDB4MDM7Ci0JaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKLQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworCWNhcmQgPSBpbmZvLT5jYXJkOworCWNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lKTsKKwlpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJCWNoaXAgPSBjaGFubmVsID4+IDI7CisJCWNoYW5uZWwgJj0gMHgwMzsKKwkJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKwkJYmFzZV9hZGRyID0KKwkJICAgIGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdIDw8IGluZGV4KTsKIAotCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOwotCSAgICBzdGF0dXMgPSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSk7Ci0JICAgIHN0YXR1cyB8PSBjeV9yZWFkYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSk7Ci0JQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lDQVIgPDwgaW5kZXgpLCAodV9jaGFyKSBjaGFubmVsKTsKKwkJc3RhdHVzID0gY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5TVNWUjEgPDwgaW5kZXgpKTsKKwkJc3RhdHVzIHw9IGN5X3JlYWRiKGJhc2VfYWRkciArIChDeU1TVlIyIDw8IGluZGV4KSk7CisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CiAKLSAgICAgICAgaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKLQkgICAgcmVzdWx0ID0gICgoc3RhdHVzICAmIEN5UlRTKSA/IFRJT0NNX0RUUiA6IDApCi0JCSAgICB8ICgoc3RhdHVzICAmIEN5RFRSKSA/IFRJT0NNX1JUUyA6IDApOworCQlpZiAoaW5mby0+cnRzZHRyX2ludikgeworCQkJcmVzdWx0ID0gKChzdGF0dXMgJiBDeVJUUykgPyBUSU9DTV9EVFIgOiAwKSB8CisJCQkJKChzdGF0dXMgJiBDeURUUikgPyBUSU9DTV9SVFMgOiAwKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9ICgoc3RhdHVzICYgQ3lSVFMpID8gVElPQ01fUlRTIDogMCkgfAorCQkJCSgoc3RhdHVzICYgQ3lEVFIpID8gVElPQ01fRFRSIDogMCk7CisJCX0KKwkJcmVzdWx0IHw9ICgoc3RhdHVzICYgQ3lEQ0QpID8gVElPQ01fQ0FSIDogMCkgfAorCQkJKChzdGF0dXMgJiBDeVJJKSA/IFRJT0NNX1JORyA6IDApIHwKKwkJCSgoc3RhdHVzICYgQ3lEU1IpID8gVElPQ01fRFNSIDogMCkgfAorCQkJKChzdGF0dXMgJiBDeUNUUykgPyBUSU9DTV9DVFMgOiAwKTsKIAl9IGVsc2UgewotCSAgICByZXN1bHQgPSAgKChzdGF0dXMgICYgQ3lSVFMpID8gVElPQ01fUlRTIDogMCkKLQkJICAgIHwgKChzdGF0dXMgICYgQ3lEVFIpID8gVElPQ01fRFRSIDogMCk7CisJCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyOworCisJCWlmIChjeV9jYXJkW2NhcmRdLm51bV9jaGlwcyAhPSAtMSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCQlpZiAoSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKSB7CisJCQl6ZndfY3RybCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsKKwkJCQkoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwkJCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJCQljaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7CisJCQlsc3RhdHVzID0gY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfc3RhdHVzKTsKKwkJCXJlc3VsdCA9ICgobHN0YXR1cyAmIENfUlNfUlRTKSA/IFRJT0NNX1JUUyA6IDApIHwKKwkJCQkoKGxzdGF0dXMgJiBDX1JTX0RUUikgPyBUSU9DTV9EVFIgOiAwKSB8CisJCQkJKChsc3RhdHVzICYgQ19SU19EQ0QpID8gVElPQ01fQ0FSIDogMCkgfAorCQkJCSgobHN0YXR1cyAmIENfUlNfUkkpID8gVElPQ01fUk5HIDogMCkgfAorCQkJCSgobHN0YXR1cyAmIENfUlNfRFNSKSA/IFRJT0NNX0RTUiA6IDApIHwKKwkJCQkoKGxzdGF0dXMgJiBDX1JTX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IDA7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCiAJfQotCXJlc3VsdCB8PSAgKChzdGF0dXMgICYgQ3lEQ0QpID8gVElPQ01fQ0FSIDogMCkKLQkJIHwgKChzdGF0dXMgICYgQ3lSSSkgPyBUSU9DTV9STkcgOiAwKQotCQkgfCAoKHN0YXR1cyAgJiBDeURTUikgPyBUSU9DTV9EU1IgOiAwKQotCQkgfCAoKHN0YXR1cyAgJiBDeUNUUykgPyBUSU9DTV9DVFMgOiAwKTsKLSAgICB9IGVsc2UgewotCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyOwotCi0gICAgICAgIGlmIChjeV9jYXJkW2NhcmRdLm51bV9jaGlwcyAhPSAtMSl7Ci0JICAgIHJldHVybiAtRUlOVkFMOwotCX0KLQotCWZpcm1faWQgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0gICAgICAgIGlmIChJU1pMT0FERUQoY3lfY2FyZFtjYXJkXSkpIHsKLQkgICAgemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwotCSAgICBib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOwotCSAgICBjaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7Ci0JICAgIGxzdGF0dXMgPSBjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS5yc19zdGF0dXMpOwotCSAgICByZXN1bHQgPSAgKChsc3RhdHVzICAmIENfUlNfUlRTKSA/IFRJT0NNX1JUUyA6IDApCi0JCSAgICB8ICgobHN0YXR1cyAgJiBDX1JTX0RUUikgPyBUSU9DTV9EVFIgOiAwKQotCSAgICAgICAgICAgIHwgKChsc3RhdHVzICAmIENfUlNfRENEKSA/IFRJT0NNX0NBUiA6IDApCi0JCSAgICB8ICgobHN0YXR1cyAgJiBDX1JTX1JJKSA/IFRJT0NNX1JORyA6IDApCi0JCSAgICB8ICgobHN0YXR1cyAgJiBDX1JTX0RTUikgPyBUSU9DTV9EU1IgOiAwKQotCQkgICAgfCAoKGxzdGF0dXMgICYgQ19SU19DVFMpID8gVElPQ01fQ1RTIDogMCk7Ci0JfWVsc2V7Ci0JICAgIHJlc3VsdCA9IDA7Ci0JICAgIHJldHVybiAtRU5PREVWOwotCX0KLQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfSAvKiBjeV90aW9tZ2V0ICovCi0KKwlyZXR1cm4gcmVzdWx0OworfQkJCQkvKiBjeV90aW9tZ2V0ICovCiAKIHN0YXRpYyBpbnQKIGN5X3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQorCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCiB7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gIGludCBjYXJkLGNoaXAsY2hhbm5lbCxpbmRleDsKLSAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gIHN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpcm1faWQ7Ci0gIHN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKLSAgc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKLSAgc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKLSAgaW50IHJldHZhbDsKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IGNhcmQsIGNoaXAsIGNoYW5uZWwsIGluZGV4OworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKwlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKwlzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOworCWludCByZXR2YWw7CiAKLSAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgX19GVU5DVElPTl9fKSkKLQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgX19GVU5DVElPTl9fKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICBjaGFubmVsID0gKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZSk7Ci0gICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgewotCWNoaXAgPSBjaGFubmVsPj4yOwotCWNoYW5uZWwgJj0gMHgwMzsKLQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OwotCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdPDxpbmRleCk7CisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworCWlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKKwkJY2hhbm5lbCAmPSAweDAzOworCQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCQliYXNlX2FkZHIgPQorCQkgICAgY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF0gPDwgaW5kZXgpOwogCi0JaWYgKHNldCAmIFRJT0NNX1JUUyl7Ci0JCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCSAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgewotCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgQ3lSVFMpOwotICAgICAgICAgICAgICAgIH0KLQkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLQl9Ci0JaWYgKGNsZWFyICYgVElPQ01fUlRTKSB7Ci0JCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7Ci0JCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCksIH5DeURUUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgfkN5UlRTKTsKLSAgICAgICAgICAgICAgICB9Ci0JCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0JfQotCWlmIChzZXQgJiBUSU9DTV9EVFIpewotCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwgKHVfY2hhciljaGFubmVsKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgewotCQkJY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpLCBDeVJUUyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSwgQ3lEVFIpOwotICAgICAgICAgICAgICAgIH0KKwkJaWYgKHNldCAmIFRJT0NNX1JUUykgeworCQkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwKKwkJCQkgICh1X2NoYXIpIGNoYW5uZWwpOworCQkJaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TVNWUjIgPDwgaW5kZXgpLAorCQkJCQkgIEN5RFRSKTsKKwkJCX0gZWxzZSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIxIDw8IGluZGV4KSwKKwkJCQkJICBDeVJUUyk7CisJCQl9CisJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQl9CisJCWlmIChjbGVhciAmIFRJT0NNX1JUUykgeworCQkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwKKwkJCQkgICh1X2NoYXIpIGNoYW5uZWwpOworCQkJaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TVNWUjIgPDwgaW5kZXgpLAorCQkJCQkgIH5DeURUUik7CisJCQl9IGVsc2UgeworCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lNU1ZSMSA8PCBpbmRleCksCisJCQkJCSAgfkN5UlRTKTsKKwkJCX0KKwkJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJCX0KKwkJaWYgKHNldCAmIFRJT0NNX0RUUikgeworCQkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwKKwkJCQkgICh1X2NoYXIpIGNoYW5uZWwpOworCQkJaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TVNWUjEgPDwgaW5kZXgpLAorCQkJCQkgIEN5UlRTKTsKKwkJCX0gZWxzZSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIyIDw8IGluZGV4KSwKKwkJCQkJICBDeURUUik7CisJCQl9CiAjaWZkZWYgQ1lfREVCVUdfRFRSCi0JCXByaW50aygiY3ljOnNldF9tb2RlbV9pbmZvIHJhaXNpbmcgRFRSXG4iKTsKLQkJcHJpbnRrKCIgICAgIHN0YXR1czogMHgleCwgMHgleFxuIiwKLQkJICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMTw8aW5kZXgpKSwgCi0gICAgICAgICAgICAgICAgICAgIGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpKSk7CisJCQlwcmludGsoImN5YzpzZXRfbW9kZW1faW5mbyByYWlzaW5nIERUUlxuIik7CisJCQlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAorCQkJCWN5X3JlYWRiKGJhc2VfYWRkciArIChDeU1TVlIxIDw8IGluZGV4KSksCisJCQkJY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5TVNWUjIgPDwgaW5kZXgpKSk7CiAjZW5kaWYKLQkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLQl9Ci0JaWYgKGNsZWFyICYgVElPQ01fRFRSKSB7Ci0JCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvLT5ydHNkdHJfaW52KSB7Ci0JCQljeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCksIH5DeVJUUyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJCWN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSwgfkN5RFRSKTsKLSAgICAgICAgICAgICAgICB9CisJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQl9CisJCWlmIChjbGVhciAmIFRJT0NNX0RUUikgeworCQkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwKKwkJCQkgICh1X2NoYXIpIGNoYW5uZWwpOworCQkJaWYgKGluZm8tPnJ0c2R0cl9pbnYpIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TVNWUjEgPDwgaW5kZXgpLAorCQkJCQkgIH5DeVJUUyk7CisJCQl9IGVsc2UgeworCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lNU1ZSMiA8PCBpbmRleCksCisJCQkJCSAgfkN5RFRSKTsKKwkJCX0KIAogI2lmZGVmIENZX0RFQlVHX0RUUgotCQlwcmludGsoImN5YzpzZXRfbW9kZW1faW5mbyBkcm9wcGluZyBEVFJcbiIpOwotCQlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAotCQkgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCkpLCAKLSAgICAgICAgICAgICAgICAgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeU1TVlIyPDxpbmRleCkpKTsKKwkJCXByaW50aygiY3ljOnNldF9tb2RlbV9pbmZvIGRyb3BwaW5nIERUUlxuIik7CisJCQlwcmludGsoIiAgICAgc3RhdHVzOiAweCV4LCAweCV4XG4iLAorCQkJCWN5X3JlYWRiKGJhc2VfYWRkciArIChDeU1TVlIxIDw8IGluZGV4KSksCisJCQkJY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5TVNWUjIgPDwgaW5kZXgpKSk7CiAjZW5kaWYKKwkJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJCX0KKwl9IGVsc2UgeworCQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkcjsKKworCQlmaXJtX2lkID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCQlpZiAoSVNaTE9BREVEKGN5X2NhcmRbY2FyZF0pKSB7CisJCQl6ZndfY3RybCA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsKKwkJCQkoY3lfcmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKKwkJCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CisJCQljaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7CisKKwkJCWlmIChzZXQgJiBUSU9DTV9SVFMpIHsKKwkJCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJCQljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKKwkJCQkJICBjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS4KKwkJCQkJCSAgIHJzX2NvbnRyb2wpIHwgQ19SU19SVFMpOworCQkJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJCQl9CisJCQlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpIHsKKwkJCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJCQljeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKKwkJCQkJICBjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS4KKwkJCQkJCSAgIHJzX2NvbnRyb2wpICYgfkNfUlNfUlRTKTsKKwkJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQkJfQorCQkJaWYgKHNldCAmIFRJT0NNX0RUUikgeworCQkJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQkJCWN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAorCQkJCQkgIGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLgorCQkJCQkJICAgcnNfY29udHJvbCkgfCBDX1JTX0RUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCQkJcHJpbnRrKCJjeWM6c2V0X21vZGVtX2luZm8gcmFpc2luZyBaIERUUlxuIik7CisjZW5kaWYKKwkJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQkJfQorCQkJaWYgKGNsZWFyICYgVElPQ01fRFRSKSB7CisJCQkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCQkJY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wsCisJCQkJCSAgY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0uCisJCQkJCQkgICByc19jb250cm9sKSAmIH5DX1JTX0RUUik7CisjaWZkZWYgQ1lfREVCVUdfRFRSCisJCQkJcHJpbnRrKCJjeWM6c2V0X21vZGVtX2luZm8gY2xlYXJpbmcgWiBEVFJcbiIpOworI2VuZGlmCisJCQkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLAorCQkJCQljaGFubmVsLCBDX0NNX0lPQ1RMTSwgMEwpOworCQlpZiAocmV0dmFsICE9IDApIHsKKwkJCXByaW50aygiY3ljOnNldF9tb2RlbV9pbmZvIHJldHZhbCBvbiB0dHlDJWQgd2FzICV4XG4iLAorCQkJCWluZm8tPmxpbmUsIHJldHZhbCk7CisJCX0KIAkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKIAl9Ci0gICAgfSBlbHNlIHsKLQliYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkcjsKLQotCWZpcm1faWQgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0gICAgICAgIGlmIChJU1pMT0FERUQoY3lfY2FyZFtjYXJkXSkpIHsKLQkgICAgemZ3X2N0cmwgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9yZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwotCSAgICBib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOwotCSAgICBjaF9jdHJsID0gemZ3X2N0cmwtPmNoX2N0cmw7Ci0KLQkgICAgaWYgKHNldCAmIFRJT0NNX1JUUyl7Ci0JCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQkJICAgIGN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sKSB8IENfUlNfUlRTKTsKLQkJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0JICAgIH0KLQkgICAgaWYgKGNsZWFyICYgVElPQ01fUlRTKSB7Ci0JCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQkJICAgIGN5X3dyaXRlbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICBjeV9yZWFkbCgmY2hfY3RybFtjaGFubmVsXS5yc19jb250cm9sKSAmIH5DX1JTX1JUUyk7Ci0JCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotCSAgICB9Ci0JICAgIGlmIChzZXQgJiBUSU9DTV9EVFIpewotCQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0JCSAgICBjeV93cml0ZWwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY3lfcmVhZGwoJmNoX2N0cmxbY2hhbm5lbF0ucnNfY29udHJvbCkgfCBDX1JTX0RUUik7Ci0jaWZkZWYgQ1lfREVCVUdfRFRSCi0JCSAgICBwcmludGsoImN5YzpzZXRfbW9kZW1faW5mbyByYWlzaW5nIFogRFRSXG4iKTsKLSNlbmRpZgotCQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLQkgICAgfQotCSAgICBpZiAoY2xlYXIgJiBUSU9DTV9EVFIpIHsKLQkJICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOwotCQkgICAgY3lfd3JpdGVsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgIGN5X3JlYWRsKCZjaF9jdHJsW2NoYW5uZWxdLnJzX2NvbnRyb2wpICYgfkNfUlNfRFRSKTsKLSNpZmRlZiBDWV9ERUJVR19EVFIKLQkJICAgIHByaW50aygiY3ljOnNldF9tb2RlbV9pbmZvIGNsZWFyaW5nIFogRFRSXG4iKTsKLSNlbmRpZgotCQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLQkgICAgfQotCX1lbHNlewotCSAgICByZXR1cm4gLUVOT0RFVjsKLQl9Ci0JQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0gICAgICAgIHJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCi0JCQkJICAgIGNoYW5uZWwsIENfQ01fSU9DVExNLDBMKTsKLQlpZiAocmV0dmFsICE9IDApewotCSAgICBwcmludGsoImN5YzpzZXRfbW9kZW1faW5mbyByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKLQkJICAgaW5mby0+bGluZSwgcmV0dmFsKTsKLQl9Ci0JQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19IC8qIGN5X3Rpb2Ntc2V0ICovCisJcmV0dXJuIDA7Cit9CQkJCS8qIGN5X3Rpb2Ntc2V0ICovCiAKIC8qCiAgKiBjeV9icmVhaygpIC0tLSByb3V0aW5lIHdoaWNoIHR1cm5zIHRoZSBicmVhayBoYW5kbGluZyBvbiBvciBvZmYKICAqLwotc3RhdGljIHZvaWQKLWN5X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKK3N0YXRpYyB2b2lkIGN5X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKIHsKLSAgICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X2JyZWFrIikpCi0JcmV0dXJuOwotCi0gICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0gICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2luZm8tPmNhcmRdKSkgewotICAgICAgICAvKiBMZXQgdGhlIHRyYW5zbWl0IElTUiB0YWtlIGNhcmUgb2YgdGhpcyAoc2luY2UgaXQKLQkgICByZXF1aXJlcyBzdHVmZmluZyBjaGFyYWN0ZXJzIGludG8gdGhlIG91dHB1dCBzdHJlYW0pLgotICAgICAgICAqLwotCWlmIChicmVha19zdGF0ZSA9PSAtMSkgewotCSAgICBpZiAoIWluZm8tPmJyZWFrb24pIHsKLQkJaW5mby0+YnJlYWtvbiA9IDE7Ci0JCWlmICghaW5mby0+eG1pdF9jbnQpIHsKLQkJICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0JCSAgICBzdGFydF94bWl0KGluZm8pOwotCQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0JCX0KLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIGlmICghaW5mby0+YnJlYWtvZmYpIHsKLQkJaW5mby0+YnJlYWtvZmYgPSAxOwotCQlpZiAoIWluZm8tPnhtaXRfY250KSB7Ci0JCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotCQkgICAgc3RhcnRfeG1pdChpbmZvKTsKLQkJICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfSBlbHNlIHsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKGJyZWFrX3N0YXRlID09IC0xKSB7Ci0JICAgIHJldHZhbCA9IGN5el9pc3N1ZV9jbWQoJmN5X2NhcmRbaW5mby0+Y2FyZF0sCi0JCShpbmZvLT5saW5lKSAtIChjeV9jYXJkW2luZm8tPmNhcmRdLmZpcnN0X2xpbmUpLAotCQlDX0NNX1NFVF9CUkVBSywgMEwpOwotCSAgICBpZiAocmV0dmFsICE9IDApIHsKLQkJcHJpbnRrKCJjeWM6Y3lfYnJlYWsgKHNldCkgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCi0JCSAgICAgICBpbmZvLT5saW5lLCByZXR2YWwpOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtpbmZvLT5jYXJkXSwKLQkJKGluZm8tPmxpbmUpIC0gKGN5X2NhcmRbaW5mby0+Y2FyZF0uZmlyc3RfbGluZSksCi0JCUNfQ01fQ0xSX0JSRUFLLCAwTCk7Ci0JICAgIGlmIChyZXR2YWwgIT0gMCkgewotCQlwcmludGsoImN5YzpjeV9icmVhayAoY2xyKSByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKLQkJICAgICAgIGluZm8tPmxpbmUsIHJldHZhbCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci19IC8qIGN5X2JyZWFrICovCi0KLXN0YXRpYyBpbnQKLWdldF9tb25faW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHN0cnVjdCBjeWNsYWRlc19tb25pdG9yIF9fdXNlciAqIG1vbikKLXsKLQotICAgIGlmKGNvcHlfdG9fdXNlcihtb24sICZpbmZvLT5tb24sIHNpemVvZihzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvcikpKQotICAgIAlyZXR1cm4gLUVGQVVMVDsKLSAgICBpbmZvLT5tb24uaW50X2NvdW50ICA9IDA7Ci0gICAgaW5mby0+bW9uLmNoYXJfY291bnQgPSAwOwotICAgIGluZm8tPm1vbi5jaGFyX21heCAgID0gMDsKLSAgICBpbmZvLT5tb24uY2hhcl9sYXN0ICA9IDA7Ci0gICAgcmV0dXJuIDA7Ci19LyogZ2V0X21vbl9pbmZvICovCi0KLQotc3RhdGljIGludAotc2V0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwotICBpbnQgY2FyZCxjaGFubmVsLGNoaXAsaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAKLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKLSAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7Ci0JY2hpcCA9IGNoYW5uZWw+PjI7Ci0JY2hhbm5lbCAmPSAweDAzOwotCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7Ci0JYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKLQotCWluZm8tPmNvcjMgJj0gfkN5UkVDX0ZJRk87Ci0JaW5mby0+Y29yMyB8PSB2YWx1ZSAmIEN5UkVDX0ZJRk87CisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9icmVhayIpKQorCQlyZXR1cm47CiAKIAlDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDT1IzPDxpbmRleCksIGluZm8tPmNvcjMpOwotCSAgICBjeXlfaXNzdWVfY21kKGJhc2VfYWRkcixDeUNPUl9DSEFOR0V8Q3lDT1IzY2gsaW5kZXgpOworCWlmICghSVNfQ1lDX1ooY3lfY2FyZFtpbmZvLT5jYXJkXSkpIHsKKwkJLyogTGV0IHRoZSB0cmFuc21pdCBJU1IgdGFrZSBjYXJlIG9mIHRoaXMgKHNpbmNlIGl0CisJCSAgIHJlcXVpcmVzIHN0dWZmaW5nIGNoYXJhY3RlcnMgaW50byB0aGUgb3V0cHV0IHN0cmVhbSkuCisJCSAqLworCQlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpIHsKKwkJCWlmICghaW5mby0+YnJlYWtvbikgeworCQkJCWluZm8tPmJyZWFrb24gPSAxOworCQkJCWlmICghaW5mby0+eG1pdF9jbnQpIHsKKwkJCQkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJCQkJc3RhcnRfeG1pdChpbmZvKTsKKwkJCQkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFpbmZvLT5icmVha29mZikgeworCQkJCWluZm8tPmJyZWFrb2ZmID0gMTsKKwkJCQlpZiAoIWluZm8tPnhtaXRfY250KSB7CisJCQkJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJCQkJCXN0YXJ0X3htaXQoaW5mbyk7CisJCQkJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWludCByZXR2YWw7CisKKwkJaWYgKGJyZWFrX3N0YXRlID09IC0xKSB7CisJCQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2luZm8tPmNhcmRdLAorCQkJCWluZm8tPmxpbmUgLSBjeV9jYXJkW2luZm8tPmNhcmRdLmZpcnN0X2xpbmUsCisJCQkJQ19DTV9TRVRfQlJFQUssIDBMKTsKKwkJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJCXByaW50aygiY3ljOmN5X2JyZWFrIChzZXQpIHJldHZhbCBvbiB0dHlDJWQgIgorCQkJCQkid2FzICV4XG4iLCBpbmZvLT5saW5lLCByZXR2YWwpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dmFsID0gY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtpbmZvLT5jYXJkXSwKKwkJCQlpbmZvLT5saW5lIC0gY3lfY2FyZFtpbmZvLT5jYXJkXS5maXJzdF9saW5lLAorCQkJCUNfQ01fQ0xSX0JSRUFLLCAwTCk7CisJCQlpZiAocmV0dmFsICE9IDApIHsKKwkJCQlwcmludGsoImN5YzpjeV9icmVhayAoY2xyKSByZXR2YWwgb24gdHR5QyVkICIKKwkJCQkJIndhcyAleFxuIiwgaW5mby0+bGluZSwgcmV0dmFsKTsKKwkJCX0KKwkJfQorCX0KIAlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgIH0gZWxzZSB7Ci0JLy8gTm90aGluZyB0byBkbyEKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Lyogc2V0X3RocmVzaG9sZCAqLwotCit9CQkJCS8qIGN5X2JyZWFrICovCiAKIHN0YXRpYyBpbnQKLWdldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCitnZXRfbW9uX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sIHN0cnVjdCBjeWNsYWRlc19tb25pdG9yIF9fdXNlciAqIG1vbikKIHsKLSAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7Ci0gIGludCBjYXJkLGNoYW5uZWwsY2hpcCxpbmRleDsKLSAgdW5zaWduZWQgbG9uZyB0bXA7Ci0gICAKLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKLSAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7Ci0JY2hpcCA9IGNoYW5uZWw+PjI7Ci0JY2hhbm5lbCAmPSAweDAzOwotCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7Ci0JYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKIAotCXRtcCA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lDT1IzPDxpbmRleCkpICYgQ3lSRUNfRklGTzsKLQlyZXR1cm4gcHV0X3VzZXIodG1wLHZhbHVlKTsKLSAgICB9IGVsc2UgewotCS8vIE5vdGhpbmcgdG8gZG8hCisJaWYgKGNvcHlfdG9fdXNlcihtb24sICZpbmZvLT5tb24sIHNpemVvZihzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpbmZvLT5tb24uaW50X2NvdW50ID0gMDsKKwlpbmZvLT5tb24uY2hhcl9jb3VudCA9IDA7CisJaW5mby0+bW9uLmNoYXJfbWF4ID0gMDsKKwlpbmZvLT5tb24uY2hhcl9sYXN0ID0gMDsKIAlyZXR1cm4gMDsKLSAgICB9Ci19LyogZ2V0X3RocmVzaG9sZCAqLworfQkJCQkvKiBnZXRfbW9uX2luZm8gKi8KIAotCi1zdGF0aWMgaW50Ci1zZXRfZGVmYXVsdF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIHZhbHVlKQorc3RhdGljIGludCBzZXRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotICAgIGluZm8tPmRlZmF1bHRfdGhyZXNob2xkID0gdmFsdWUgJiAweDBmOwotICAgIHJldHVybiAwOwotfS8qIHNldF9kZWZhdWx0X3RocmVzaG9sZCAqLworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCWludCBjYXJkLCBjaGFubmVsLCBjaGlwLCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisJaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCQljaGlwID0gY2hhbm5lbCA+PiAyOworCQljaGFubmVsICY9IDB4MDM7CisJCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJCWJhc2VfYWRkciA9CisJCSAgICBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXSA8PCBpbmRleCk7CiAKLXN0YXRpYyBpbnQKLWdldF9kZWZhdWx0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgX191c2VyICp2YWx1ZSkKLXsKLSAgICByZXR1cm4gcHV0X3VzZXIoaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQsdmFsdWUpOwotfS8qIGdldF9kZWZhdWx0X3RocmVzaG9sZCAqLworCQlpbmZvLT5jb3IzICY9IH5DeVJFQ19GSUZPOworCQlpbmZvLT5jb3IzIHw9IHZhbHVlICYgQ3lSRUNfRklGTzsKIAotCi1zdGF0aWMgaW50Ci1zZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwotICBpbnQgY2FyZCxjaGFubmVsLGNoaXAsaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAKLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKLSAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7Ci0JY2hpcCA9IGNoYW5uZWw+PjI7Ci0JY2hhbm5lbCAmPSAweDAzOwotCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7Ci0JYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKLQotCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVJUUFI8PGluZGV4KSwgdmFsdWUgJiAweGZmKTsKLQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgIH0gZWxzZSB7Ci0JLy8gTm90aGluZyB0byBkbyEKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Lyogc2V0X3RpbWVvdXQgKi8KLQotCi1zdGF0aWMgaW50Ci1nZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgX191c2VyICp2YWx1ZSkKLXsKLSAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7Ci0gIGludCBjYXJkLGNoYW5uZWwsY2hpcCxpbmRleDsKLSAgdW5zaWduZWQgbG9uZyB0bXA7Ci0gICAKLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKLSAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKLSAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7Ci0JY2hpcCA9IGNoYW5uZWw+PjI7Ci0JY2hhbm5lbCAmPSAweDAzOwotCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7Ci0JYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKLQotCXRtcCA9IGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lSVFBSPDxpbmRleCkpOwotCXJldHVybiBwdXRfdXNlcih0bXAsdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0JLy8gTm90aGluZyB0byBkbyEKKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lDT1IzIDw8IGluZGV4KSwgaW5mby0+Y29yMyk7CisJCWN5eV9pc3N1ZV9jbWQoYmFzZV9hZGRyLCBDeUNPUl9DSEFOR0UgfCBDeUNPUjNjaCwgaW5kZXgpOworCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qIE5vdGhpbmcgdG8gZG8hICovCisJfQogCXJldHVybiAwOwotICAgIH0KLX0vKiBnZXRfdGltZW91dCAqLwotCit9CQkJCS8qIHNldF90aHJlc2hvbGQgKi8KIAogc3RhdGljIGludAotc2V0X2RlZmF1bHRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCitnZXRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqIHZhbHVlKQogewotICAgIGluZm8tPmRlZmF1bHRfdGltZW91dCA9IHZhbHVlICYgMHhmZjsKLSAgICByZXR1cm4gMDsKLX0vKiBzZXRfZGVmYXVsdF90aW1lb3V0ICovCisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJaW50IGNhcmQsIGNoYW5uZWwsIGNoaXAsIGluZGV4OworCXVuc2lnbmVkIGxvbmcgdG1wOwogCisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisJaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgeworCQljaGlwID0gY2hhbm5lbCA+PiAyOworCQljaGFubmVsICY9IDB4MDM7CisJCWluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7CisJCWJhc2VfYWRkciA9CisJCSAgICBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXSA8PCBpbmRleCk7CisKKwkJdG1wID0gY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5Q09SMyA8PCBpbmRleCkpICYgQ3lSRUNfRklGTzsKKwkJcmV0dXJuIHB1dF91c2VyKHRtcCwgdmFsdWUpOworCX0gZWxzZSB7CisJCS8qIE5vdGhpbmcgdG8gZG8hICovCisJCXJldHVybiAwOworCX0KK30JCQkJLyogZ2V0X3RocmVzaG9sZCAqLwogCiBzdGF0aWMgaW50Ci1nZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnZhbHVlKQorc2V0X2RlZmF1bHRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotICAgIHJldHVybiBwdXRfdXNlcihpbmZvLT5kZWZhdWx0X3RpbWVvdXQsdmFsdWUpOwotfS8qIGdldF9kZWZhdWx0X3RpbWVvdXQgKi8KKwlpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IHZhbHVlICYgMHgwZjsKKwlyZXR1cm4gMDsKK30JCQkJLyogc2V0X2RlZmF1bHRfdGhyZXNob2xkICovCisKK3N0YXRpYyBpbnQKK2dldF9kZWZhdWx0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKiB2YWx1ZSkKK3sKKwlyZXR1cm4gcHV0X3VzZXIoaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQsIHZhbHVlKTsKK30JCQkJLyogZ2V0X2RlZmF1bHRfdGhyZXNob2xkICovCisKK3N0YXRpYyBpbnQgc2V0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJaW50IGNhcmQsIGNoYW5uZWwsIGNoaXAsIGluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljYXJkID0gaW5mby0+Y2FyZDsKKwljaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKKwlpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJCWNoaXAgPSBjaGFubmVsID4+IDI7CisJCWNoYW5uZWwgJj0gMHgwMzsKKwkJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKwkJYmFzZV9hZGRyID0KKwkJICAgIGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdIDw8IGluZGV4KTsKKworCQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeVJUUFIgPDwgaW5kZXgpLCB2YWx1ZSAmIDB4ZmYpOworCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qIE5vdGhpbmcgdG8gZG8hICovCisJfQorCXJldHVybiAwOworfQkJCQkvKiBzZXRfdGltZW91dCAqLworCitzdGF0aWMgaW50IGdldF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqIHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCWludCBjYXJkLCBjaGFubmVsLCBjaGlwLCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWNhcmQgPSBpbmZvLT5jYXJkOworCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lOworCWlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKKwkJY2hhbm5lbCAmPSAweDAzOworCQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCQliYXNlX2FkZHIgPQorCQkgICAgY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF0gPDwgaW5kZXgpOworCisJCXRtcCA9IGN5X3JlYWRiKGJhc2VfYWRkciArIChDeVJUUFIgPDwgaW5kZXgpKTsKKwkJcmV0dXJuIHB1dF91c2VyKHRtcCwgdmFsdWUpOworCX0gZWxzZSB7CisJCS8qIE5vdGhpbmcgdG8gZG8hICovCisJCXJldHVybiAwOworCX0KK30JCQkJLyogZ2V0X3RpbWVvdXQgKi8KKworc3RhdGljIGludCBzZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCWluZm8tPmRlZmF1bHRfdGltZW91dCA9IHZhbHVlICYgMHhmZjsKKwlyZXR1cm4gMDsKK30JCQkJLyogc2V0X2RlZmF1bHRfdGltZW91dCAqLworCitzdGF0aWMgaW50CitnZXRfZGVmYXVsdF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqIHZhbHVlKQoreworCXJldHVybiBwdXRfdXNlcihpbmZvLT5kZWZhdWx0X3RpbWVvdXQsIHZhbHVlKTsKK30JCQkJLyogZ2V0X2RlZmF1bHRfdGltZW91dCAqLwogCiAvKgogICogVGhpcyByb3V0aW5lIGFsbG93cyB0aGUgdHR5IGRyaXZlciB0byBpbXBsZW1lbnQgZGV2aWNlLQpAQCAtMzkxNCwxODQgKzQwMTUsMTkzIEBACiAgKiBub3QgcmVjb2duaXplZCBieSB0aGUgZHJpdmVyLCBpdCBzaG91bGQgcmV0dXJuIEVOT0lPQ1RMQ01ELgogICovCiBzdGF0aWMgaW50Ci1jeV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2N5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLSAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKLSAgc3RydWN0IGN5Y2xhZGVzX2ljb3VudCBjcHJldiwgY25vdzsJCS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCi0gIHN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsJLyogdXNlciBzcGFjZSAqLwotICBpbnQgcmV0X3ZhbCA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgY3ljbGFkZXNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLworCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsJLyogdXNlciBzcGFjZSAqLworCWludCByZXRfdmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCi0gICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9pb2N0bCIpKQotCXJldHVybiAtRU5PREVWOworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfaW9jdGwiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKICNpZmRlZiBDWV9ERUJVR19PVEhFUgotICAgIHByaW50aygiY3ljOmN5X2lvY3RsIHR0eUMlZCwgY21kID0gJXggYXJnID0gJWx4XG4iLAotICAgICAgICBpbmZvLT5saW5lLCBjbWQsIGFyZyk7IC8qICovCisJcHJpbnRrKCJjeWM6Y3lfaW9jdGwgdHR5QyVkLCBjbWQgPSAleCBhcmcgPSAlbHhcbiIsIGluZm8tPmxpbmUsIGNtZCwgYXJnKTsJLyogKi8KICNlbmRpZgogCi0gICAgc3dpdGNoIChjbWQpIHsKLSAgICAgICAgY2FzZSBDWUdFVE1PTjoKLSAgICAgICAgICAgIHJldF92YWwgPSBnZXRfbW9uX2luZm8oaW5mbywgYXJncCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDWUdFVFRIUkVTSDoKLSAgICAgICAgICAgIHJldF92YWwgPSBnZXRfdGhyZXNob2xkKGluZm8sIGFyZ3ApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1lTRVRUSFJFU0g6Ci0gICAgICAgICAgICByZXRfdmFsID0gc2V0X3RocmVzaG9sZChpbmZvLCBhcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1lHRVRERUZUSFJFU0g6Ci0gICAgICAgICAgICByZXRfdmFsID0gZ2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sIGFyZ3ApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1lTRVRERUZUSFJFU0g6Ci0gICAgICAgICAgICByZXRfdmFsID0gc2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sIGFyZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDWUdFVFRJTUVPVVQ6Ci0gICAgICAgICAgICByZXRfdmFsID0gZ2V0X3RpbWVvdXQoaW5mbywgYXJncCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDWVNFVFRJTUVPVVQ6Ci0gICAgICAgICAgICByZXRfdmFsID0gc2V0X3RpbWVvdXQoaW5mbywgYXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENZR0VUREVGVElNRU9VVDoKLSAgICAgICAgICAgIHJldF92YWwgPSBnZXRfZGVmYXVsdF90aW1lb3V0KGluZm8sIGFyZ3ApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1lTRVRERUZUSU1FT1VUOgotICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9kZWZhdWx0X3RpbWVvdXQoaW5mbywgYXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotCWNhc2UgQ1lTRVRSRkxPVzoKLSAgICAJICAgIGluZm8tPnJmbG93ID0gKGludClhcmc7Ci0JICAgIHJldF92YWwgPSAwOwotCSAgICBicmVhazsKLQljYXNlIENZR0VUUkZMT1c6Ci0JICAgIHJldF92YWwgPSBpbmZvLT5yZmxvdzsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDWVNFVFJUU0RUUl9JTlY6Ci0gICAgCSAgICBpbmZvLT5ydHNkdHJfaW52ID0gKGludClhcmc7Ci0JICAgIHJldF92YWwgPSAwOwotCSAgICBicmVhazsKLQljYXNlIENZR0VUUlRTRFRSX0lOVjoKLQkgICAgcmV0X3ZhbCA9IGluZm8tPnJ0c2R0cl9pbnY7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1lHRVRDQVJESU5GTzoKLSAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmN5X2NhcmRbaW5mby0+Y2FyZF0sIAotCQkJc2l6ZW9mIChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCkpKSB7Ci0JCXJldF92YWwgPSAtRUZBVUxUOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDWUdFVE1PTjoKKwkJcmV0X3ZhbCA9IGdldF9tb25faW5mbyhpbmZvLCBhcmdwKTsKIAkJYnJlYWs7Ci0JICAgIH0KLQkgICAgcmV0X3ZhbCA9IDA7Ci0gICAgICAgICAgICBicmVhazsKKwljYXNlIENZR0VUVEhSRVNIOgorCQlyZXRfdmFsID0gZ2V0X3RocmVzaG9sZChpbmZvLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBDWVNFVFRIUkVTSDoKKwkJcmV0X3ZhbCA9IHNldF90aHJlc2hvbGQoaW5mbywgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDWUdFVERFRlRIUkVTSDoKKwkJcmV0X3ZhbCA9IGdldF9kZWZhdWx0X3RocmVzaG9sZChpbmZvLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBDWVNFVERFRlRIUkVTSDoKKwkJcmV0X3ZhbCA9IHNldF9kZWZhdWx0X3RocmVzaG9sZChpbmZvLCBhcmcpOworCQlicmVhazsKKwljYXNlIENZR0VUVElNRU9VVDoKKwkJcmV0X3ZhbCA9IGdldF90aW1lb3V0KGluZm8sIGFyZ3ApOworCQlicmVhazsKKwljYXNlIENZU0VUVElNRU9VVDoKKwkJcmV0X3ZhbCA9IHNldF90aW1lb3V0KGluZm8sIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ1lHRVRERUZUSU1FT1VUOgorCQlyZXRfdmFsID0gZ2V0X2RlZmF1bHRfdGltZW91dChpbmZvLCBhcmdwKTsKKwkJYnJlYWs7CisJY2FzZSBDWVNFVERFRlRJTUVPVVQ6CisJCXJldF92YWwgPSBzZXRfZGVmYXVsdF90aW1lb3V0KGluZm8sIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ1lTRVRSRkxPVzoKKwkJaW5mby0+cmZsb3cgPSAoaW50KWFyZzsKKwkJcmV0X3ZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgQ1lHRVRSRkxPVzoKKwkJcmV0X3ZhbCA9IGluZm8tPnJmbG93OworCQlicmVhazsKKwljYXNlIENZU0VUUlRTRFRSX0lOVjoKKwkJaW5mby0+cnRzZHRyX2ludiA9IChpbnQpYXJnOworCQlyZXRfdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBDWUdFVFJUU0RUUl9JTlY6CisJCXJldF92YWwgPSBpbmZvLT5ydHNkdHJfaW52OworCQlicmVhazsKKwljYXNlIENZR0VUQ0FSRElORk86CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmN5X2NhcmRbaW5mby0+Y2FyZF0sCisJCQkJIHNpemVvZihzdHJ1Y3QgY3ljbGFkZXNfY2FyZCkpKSB7CisJCQlyZXRfdmFsID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJldF92YWwgPSAwOworCQlicmVhazsKIAljYXNlIENZR0VUQ0QxNDAwVkVSOgotCSAgICByZXRfdmFsID0gaW5mby0+Y2hpcF9yZXY7Ci0JICAgIGJyZWFrOworCQlyZXRfdmFsID0gaW5mby0+Y2hpcF9yZXY7CisJCWJyZWFrOwogI2lmbmRlZiBDT05GSUdfQ1laX0lOVFIKIAljYXNlIENZWlNFVFBPTExDWUNMRToKLSAgICAgICAgICAgIGN5el9wb2xsaW5nX2N5Y2xlID0gKGFyZyAqIEhaKSAvIDEwMDA7Ci0JICAgIHJldF92YWwgPSAwOwotCSAgICBicmVhazsKKwkJY3l6X3BvbGxpbmdfY3ljbGUgPSAoYXJnICogSFopIC8gMTAwMDsKKwkJcmV0X3ZhbCA9IDA7CisJCWJyZWFrOwogCWNhc2UgQ1laR0VUUE9MTENZQ0xFOgotICAgICAgICAgICAgcmV0X3ZhbCA9IChjeXpfcG9sbGluZ19jeWNsZSAqIDEwMDApIC8gSFo7Ci0JICAgIGJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLworCQlyZXRfdmFsID0gKGN5el9wb2xsaW5nX2N5Y2xlICogMTAwMCkgLyBIWjsKKwkJYnJlYWs7CisjZW5kaWYJCQkJLyogQ09ORklHX0NZWl9JTlRSICovCiAJY2FzZSBDWVNFVFdBSVQ6Ci0gICAgCSAgICBpbmZvLT5jbG9zaW5nX3dhaXQgPSAodW5zaWduZWQgc2hvcnQpYXJnICogSFovMTAwOwotCSAgICByZXRfdmFsID0gMDsKLQkgICAgYnJlYWs7CisJCWluZm8tPmNsb3Npbmdfd2FpdCA9ICh1bnNpZ25lZCBzaG9ydClhcmcgKkhaIC8gMTAwOworCQlyZXRfdmFsID0gMDsKKwkJYnJlYWs7CiAJY2FzZSBDWUdFVFdBSVQ6Ci0JICAgIHJldF92YWwgPSBpbmZvLT5jbG9zaW5nX3dhaXQgLyAoSFovMTAwKTsKLQkgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElPQ0dTRVJJQUw6Ci0gICAgICAgICAgICByZXRfdmFsID0gZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVElPQ1NTRVJJQUw6Ci0gICAgICAgICAgICByZXRfdmFsID0gc2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwotICAgICAgICAgICAgYnJlYWs7Ci0JY2FzZSBUSU9DU0VSR0VUTFNSOiAvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkgICAgcmV0X3ZhbCA9IGdldF9sc3JfaW5mbyhpbmZvLCBhcmdwKTsKLQkgICAgYnJlYWs7Ci0JLyoKLQkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlIAotCSAqIC0gbWFzayBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdAotCSAqICAgKHVzZSB8J2VkIFRJT0NNX1JORy9EU1IvQ0QvQ1RTIGZvciBtYXNraW5nKQotCSAqIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCi0JICovCisJCXJldF92YWwgPSBpbmZvLT5jbG9zaW5nX3dhaXQgLyAoSFogLyAxMDApOworCQlicmVhazsKKwljYXNlIFRJT0NHU0VSSUFMOgorCQlyZXRfdmFsID0gZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFRJT0NTU0VSSUFMOgorCQlyZXRfdmFsID0gc2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOworCQlicmVhazsKKwljYXNlIFRJT0NTRVJHRVRMU1I6CS8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLworCQlyZXRfdmFsID0gZ2V0X2xzcl9pbmZvKGluZm8sIGFyZ3ApOworCQlicmVhazsKKwkJLyoKKwkJICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZQorCQkgKiAtIG1hc2sgcGFzc2VkIGluIGFyZyBmb3IgbGluZXMgb2YgaW50ZXJlc3QKKwkJICogICAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMgZm9yIG1hc2tpbmcpCisJCSAqIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCisJCSAqLwogCWNhc2UgVElPQ01JV0FJVDoKLQkgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0JICAgIC8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCi0JICAgIGNwcmV2ID0gaW5mby0+aWNvdW50OwotCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotCSAgICB3aGlsZSAoMSkgewotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Ci0JCS8qIHNlZSBpZiBhIHNpZ25hbCBkaWQgaXQgKi8KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCSAgICByZXR1cm4gLUVSRVNUQVJUU1lTOwotCQl9Ci0KIAkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0JCWNub3cgPSBpbmZvLT5pY291bnQ7IC8qIGF0b21pYyBjb3B5ICovCisJCS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJCWNwcmV2ID0gaW5mby0+aWNvdW50OwogCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQl3aGlsZSAoMSkgeworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCQkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCX0KIAotCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmIGNub3cuZHNyID09IGNwcmV2LmRzciAmJiAKLQkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJiBjbm93LmN0cyA9PSBjcHJldi5jdHMpIHsKLQkJICAgIHJldHVybiAtRUlPOyAvKiBubyBjaGFuZ2UgPT4gZXJyb3IgKi8KLQkJfQotCQlpZiAoICgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwgCi0JCSAgICAgKChhcmcgJiBUSU9DTV9EU1IpICYmIChjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fCAKLQkJICAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8IAotCQkgICAgICgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYuY3RzKSkgKSB7Ci0JCSAgICByZXR1cm4gMDsKLQkJfQotCQljcHJldiA9IGNub3c7Ci0JICAgIH0KLQkgICAgLyogTk9UUkVBQ0hFRCAqLworCQkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCQljbm93ID0gaW5mby0+aWNvdW50OwkvKiBhdG9taWMgY29weSAqLworCQkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKIAotCS8qCi0JICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCi0JICogUmV0dXJuOiB3cml0ZSBjb3VudGVycyB0byB0aGUgdXNlciBwYXNzZWQgY291bnRlciBzdHJ1Y3QKLQkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKLQkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCi0JICovCisJCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmIGNub3cuZHNyID09IGNwcmV2LmRzciAmJgorCQkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJiBjbm93LmN0cyA9PSBjcHJldi5jdHMpIHsKKwkJCQlyZXR1cm4gLUVJTzsJLyogbm8gY2hhbmdlID0+IGVycm9yICovCisJCQl9CisJCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAorCQkJICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwKKwkJCSAgICAoKGFyZyAmIFRJT0NNX0NEKSAmJiAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKKwkJCSAgICAoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQljcHJldiA9IGNub3c7CisJCX0KKwkJLyogTk9UUkVBQ0hFRCAqLworCisJCS8qCisJCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCQkgKiBSZXR1cm46IHdyaXRlIGNvdW50ZXJzIHRvIHRoZSB1c2VyIHBhc3NlZCBjb3VudGVyIHN0cnVjdAorCQkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkJICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgorCQkgKi8KIAljYXNlIFRJT0NHSUNPVU5UOgotCSAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQkgICAgY25vdyA9IGluZm8tPmljb3VudDsKLQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLQkgICAgcF9jdXNlciA9IGFyZ3A7Ci0JICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LmN0cywgJnBfY3VzZXItPmN0cyk7Ci0JICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKLQkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKLQkgICAgaWYgKHJldF92YWwpIHJldHVybiByZXRfdmFsOwotCSAgICByZXRfdmFsID0gcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOwotCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7Ci0JICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LmRjZCwgJnBfY3VzZXItPmRjZCk7Ci0JICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKLQkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cucngsICZwX2N1c2VyLT5yeCk7Ci0JICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKLQkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cudHgsICZwX2N1c2VyLT50eCk7Ci0JICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKLQkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cuZnJhbWUsICZwX2N1c2VyLT5mcmFtZSk7Ci0JICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKLQkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cub3ZlcnJ1biwgJnBfY3VzZXItPm92ZXJydW4pOwotCSAgICBpZiAocmV0X3ZhbCkgcmV0dXJuIHJldF92YWw7Ci0JICAgIHJldF92YWwgPSBwdXRfdXNlcihjbm93LnBhcml0eSwgJnBfY3VzZXItPnBhcml0eSk7Ci0JICAgIGlmIChyZXRfdmFsKSByZXR1cm4gcmV0X3ZhbDsKLQkgICAgcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cuYnJrLCAmcF9jdXNlci0+YnJrKTsKLQkgICAgaWYgKHJldF92YWwpIHJldHVybiByZXRfdmFsOwotCSAgICByZXRfdmFsID0gcHV0X3VzZXIoY25vdy5idWZfb3ZlcnJ1biwgJnBfY3VzZXItPmJ1Zl9vdmVycnVuKTsKLQkgICAgaWYgKHJldF92YWwpIHJldHVybiByZXRfdmFsOwotCSAgICByZXRfdmFsID0gMDsKLQkgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXRfdmFsID0gLUVOT0lPQ1RMQ01EOwotICAgIH0KKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJCXBfY3VzZXIgPSBhcmdwOworCQlyZXRfdmFsID0gcHV0X3VzZXIoY25vdy5jdHMsICZwX2N1c2VyLT5jdHMpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gcHV0X3VzZXIoY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gcHV0X3VzZXIoY25vdy5kY2QsICZwX2N1c2VyLT5kY2QpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gcHV0X3VzZXIoY25vdy5yeCwgJnBfY3VzZXItPnJ4KTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJcmV0X3ZhbCA9IHB1dF91c2VyKGNub3cudHgsICZwX2N1c2VyLT50eCk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCXJldF92YWwgPSBwdXRfdXNlcihjbm93LmZyYW1lLCAmcF9jdXNlci0+ZnJhbWUpOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gcHV0X3VzZXIoY25vdy5vdmVycnVuLCAmcF9jdXNlci0+b3ZlcnJ1bik7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCXJldF92YWwgPSBwdXRfdXNlcihjbm93LnBhcml0eSwgJnBfY3VzZXItPnBhcml0eSk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCXJldF92YWwgPSBwdXRfdXNlcihjbm93LmJyaywgJnBfY3VzZXItPmJyayk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJCXJldF92YWwgPSBwdXRfdXNlcihjbm93LmJ1Zl9vdmVycnVuLCAmcF9jdXNlci0+YnVmX292ZXJydW4pOworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOworCQlyZXRfdmFsID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0X3ZhbCA9IC1FTk9JT0NUTENNRDsKKwl9CiAKICNpZmRlZiBDWV9ERUJVR19PVEhFUgotICAgIHByaW50aygiIGN5YzpjeV9pb2N0bCBkb25lXG4iKTsKKwlwcmludGsoIiBjeWM6Y3lfaW9jdGwgZG9uZVxuIik7CiAjZW5kaWYKIAotICAgIHJldHVybiByZXRfdmFsOwotfSAvKiBjeV9pb2N0bCAqLwotCisJcmV0dXJuIHJldF92YWw7Cit9CQkJCS8qIGN5X2lvY3RsICovCiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgYWxsb3dzIHRoZSB0dHkgZHJpdmVyIHRvIGJlIG5vdGlmaWVkIHdoZW4KQEAgLTQwOTksNjYgKzQyMDksNjQgQEAKICAqIHdlbGwtZGVzaWduZWQgdHR5IGRyaXZlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYWNjZXB0IHRoZSBjYXNlCiAgKiB3aGVyZSBvbGQgPT0gTlVMTCwgYW5kIHRyeSB0byBkbyBzb21ldGhpbmcgcmF0aW9uYWwuCiAgKi8KLXN0YXRpYyB2b2lkCi1jeV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgY3lfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKLSAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKIAogI2lmZGVmIENZX0RFQlVHX09USEVSCi0gICAgcHJpbnRrKCJjeWM6Y3lfc2V0X3Rlcm1pb3MgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsKKwlwcmludGsoImN5YzpjeV9zZXRfdGVybWlvcyB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOwogI2VuZGlmCiAKLSAgICBpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykgJiYKLQkoKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIChJWE9OfElYQU5ZKSkgPT0gCi0JIChvbGRfdGVybWlvcy0+Y19pZmxhZyAmIChJWE9OfElYQU5ZKSkpKQotICAgICAgICByZXR1cm47Ci0gICAgc2V0X2xpbmVfY2hhcihpbmZvKTsKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnICYmCisJCQkodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgKElYT04gfCBJWEFOWSkpID09CisJCQkob2xkX3Rlcm1pb3MtPmNfaWZsYWcgJiAoSVhPTiB8IElYQU5ZKSkpCisJCXJldHVybjsKKwlzZXRfbGluZV9jaGFyKGluZm8pOwogCi0gICAgaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCi0gICAgICAgICEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKLSAgICAgICAgICAgIHR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0gICAgICAgICAgICBjeV9zdGFydCh0dHkpOwotICAgIH0KKwlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKwkJCSEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKKwkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJY3lfc3RhcnQodHR5KTsKKwl9CiAjaWYgMAotICAgIC8qCi0gICAgICogTm8gbmVlZCB0byB3YWtlIHVwIHByb2Nlc3NlcyBpbiBvcGVuIHdhaXQsIHNpbmNlIHRoZXkKLSAgICAgKiBzYW1wbGUgdGhlIENMT0NBTCBmbGFnIG9uY2UsIGFuZCBkb24ndCByZWNoZWNrIGl0LgotICAgICAqIFhYWCAgSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGUgY3VycmVudCBiZWhhdmlvciBpcyBjb3JyZWN0Ci0gICAgICogb3Igbm90LiAgSGVuY2UsIHRoaXMgbWF5IGNoYW5nZS4uLi4uCi0gICAgICovCi0gICAgaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCi0gICAgICAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpKQotICAgICAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCS8qCisJICogTm8gbmVlZCB0byB3YWtlIHVwIHByb2Nlc3NlcyBpbiBvcGVuIHdhaXQsIHNpbmNlIHRoZXkKKwkgKiBzYW1wbGUgdGhlIENMT0NBTCBmbGFnIG9uY2UsIGFuZCBkb24ndCByZWNoZWNrIGl0LgorCSAqIFhYWCAgSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGUgY3VycmVudCBiZWhhdmlvciBpcyBjb3JyZWN0CisJICogb3Igbm90LiAgSGVuY2UsIHRoaXMgbWF5IGNoYW5nZS4uLi4uCisJICovCisJaWYgKCEob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICYmCisJICAgICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CiAjZW5kaWYKLQotICAgIHJldHVybjsKLX0gLyogY3lfc2V0X3Rlcm1pb3MgKi8KK30JCQkJLyogY3lfc2V0X3Rlcm1pb3MgKi8KIAogLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYSBoaWdoLXByaW9yaXR5IFhPTi9YT0ZGIGNoYXJhY3RlciB0bwogICAgdGhlIGRldmljZS4KICovCi1zdGF0aWMgdm9pZAotY3lfc2VuZF94Y2hhciAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKK3N0YXRpYyB2b2lkIGN5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKIHsKLQlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgY2FyZCwgY2hhbm5lbDsKIAotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2sgKGluZm8sIHR0eS0+bmFtZSwgImN5X3NlbmRfeGNoYXIiKSkKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3NlbmRfeGNoYXIiKSkKIAkJcmV0dXJuOwogCi0gIAlpbmZvLT54X2NoYXIgPSBjaDsKKwlpbmZvLT54X2NoYXIgPSBjaDsKIAogCWlmIChjaCkKLQkJY3lfc3RhcnQgKHR0eSk7CisJCWN5X3N0YXJ0KHR0eSk7CiAKIAljYXJkID0gaW5mby0+Y2FyZDsKIAljaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKIAotCWlmIChJU19DWUNfWiAoY3lfY2FyZFtjYXJkXSkpIHsKLQkJaWYgKGNoID09IFNUT1BfQ0hBUiAodHR5KSkKLQkgIAkJY3l6X2lzc3VlX2NtZCAoJmN5X2NhcmRbY2FyZF0sIGNoYW5uZWwsIENfQ01fU0VORFhPRkYsIDBMKTsKLQkJZWxzZSBpZiAoY2ggPT0gU1RBUlRfQ0hBUiAodHR5KSkKLQkJCWN5el9pc3N1ZV9jbWQgKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX1NFTkRYT04sIDBMKTsKKwlpZiAoSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwkJaWYgKGNoID09IFNUT1BfQ0hBUih0dHkpKQorCQkJY3l6X2lzc3VlX2NtZCgmY3lfY2FyZFtjYXJkXSwgY2hhbm5lbCwgQ19DTV9TRU5EWE9GRiwKKwkJCQkJMEwpOworCQllbHNlIGlmIChjaCA9PSBTVEFSVF9DSEFSKHR0eSkpCisJCQljeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX1NFTkRYT04sCisJCQkJCTBMKTsKIAl9CiB9CiAKQEAgLTQxNjYsMjYwICs0Mjc0LDI0OCBAQAogICAgdGhhdCBpbmNvbWluZyBjaGFyYWN0ZXJzIHNob3VsZCBiZSB0aHJvdHRsZWQgYmVjYXVzZSB0aGUgaW5wdXQKICAgIGJ1ZmZlcnMgYXJlIGNsb3NlIHRvIGZ1bGwuCiAgKi8KLXN0YXRpYyB2b2lkCi1jeV90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3N0YXRpYyB2b2lkIGN5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7Ci0gIGludCBjYXJkLGNoaXAsY2hhbm5lbCxpbmRleDsKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwlpbnQgY2FyZCwgY2hpcCwgY2hhbm5lbCwgaW5kZXg7CiAKICNpZmRlZiBDWV9ERUJVR19USFJPVFRMRQotICBjaGFyIGJ1Zls2NF07CisJY2hhciBidWZbNjRdOwogCi0gICAgcHJpbnRrKCJjeWM6dGhyb3R0bGUgJXM6ICVkLi4uLnR0eUMlZFxuIiwgCi0JICAgdHR5X25hbWUodHR5LCBidWYpLAotICAgICAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpLCBpbmZvLT5saW5lKTsKKwlwcmludGsoImN5Yzp0aHJvdHRsZSAlczogJWQuLi4udHR5QyVkXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJCQl0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpLCBpbmZvLT5saW5lKTsKICNlbmRpZgogCi0gICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV90aHJvdHRsZSIpKXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9CisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV90aHJvdHRsZSIpKSB7CisJCXJldHVybjsKKwl9CiAKLSAgICBjYXJkID0gaW5mby0+Y2FyZDsKKwljYXJkID0gaW5mby0+Y2FyZDsKIAotICAgIGlmIChJX0lYT0ZGKHR0eSkpIHsKLSAgICAgICAgaWYgKCFJU19DWUNfWiAoY3lfY2FyZFtjYXJkXSkpCi0gICAgICAgICAgICBjeV9zZW5kX3hjaGFyICh0dHksIFNUT1BfQ0hBUiAodHR5KSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluZm8tPnRocm90dGxlID0gMTsKLSAgICB9CisJaWYgKElfSVhPRkYodHR5KSkgeworCQlpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKQorCQkJY3lfc2VuZF94Y2hhcih0dHksIFNUT1BfQ0hBUih0dHkpKTsKKwkJZWxzZQorCQkJaW5mby0+dGhyb3R0bGUgPSAxOworCX0KIAotICAgIGlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0gICAgICAgIGNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lOwotICAgICAgICBpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7Ci0gICAgICAgICAgICBjaGlwID0gY2hhbm5lbD4+MjsKLSAgICAgICAgICAgIGNoYW5uZWwgJj0gMHgwMzsKLSAgICAgICAgICAgIGluZGV4ID0gY3lfY2FyZFtjYXJkXS5idXNfaW5kZXg7Ci0gICAgICAgICAgICBiYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY3lfY2FyZFtjYXJkXS5maXJzdF9saW5lOworCQlpZiAoIUlTX0NZQ19aKGN5X2NhcmRbY2FyZF0pKSB7CisJCQljaGlwID0gY2hhbm5lbCA+PiAyOworCQkJY2hhbm5lbCAmPSAweDAzOworCQkJaW5kZXggPSBjeV9jYXJkW2NhcmRdLmJ1c19pbmRleDsKKwkJCWJhc2VfYWRkciA9IGN5X2NhcmRbY2FyZF0uYmFzZV9hZGRyICsKKwkJCQkoY3lfY2hpcF9vZmZzZXRbY2hpcF0gPDwgaW5kZXgpOwogCi0gICAgICAgICAgICBDWV9MT0NLKGluZm8sIGZsYWdzKTsKLSAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksICh1X2NoYXIpY2hhbm5lbCk7Ci0gICAgICAgICAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgewotICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjI8PGluZGV4KSwgfkN5RFRSKTsKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5TVNWUjE8PGluZGV4KSwgfkN5UlRTKTsKLQkgICAgIH0KLQkgICAgQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLQl9IGVsc2UgewotCSAgICBpbmZvLT50aHJvdHRsZSA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci19IC8qIGN5X3Rocm90dGxlICovCi0KKwkJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksCisJCQkJICAodV9jaGFyKSBjaGFubmVsKTsKKwkJCWlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIyIDw8IGluZGV4KSwKKwkJCQkJICB+Q3lEVFIpOworCQkJfSBlbHNlIHsKKwkJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5TVNWUjEgPDwgaW5kZXgpLAorCQkJCQkgIH5DeVJUUyk7CisJCQl9CisJCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJaW5mby0+dGhyb3R0bGUgPSAxOworCQl9CisJfQorfQkJCQkvKiBjeV90aHJvdHRsZSAqLwogCiAvKgogICogVGhpcyByb3V0aW5lIG5vdGlmaWVzIHRoZSB0dHkgZHJpdmVyIHRoYXQgaXQgc2hvdWxkIHNpZ25hbAogICogdGhhdCBjaGFyYWN0ZXJzIGNhbiBub3cgYmUgc2VudCB0byB0aGUgdHR5IHdpdGhvdXQgZmVhciBvZgogICogb3ZlcnJ1bm5pbmcgdGhlIGlucHV0IGJ1ZmZlcnMgb2YgdGhlIGxpbmUgZGlzY2lwbGluZXMuCiAgKi8KLXN0YXRpYyB2b2lkCi1jeV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQorc3RhdGljIHZvaWQgY3lfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwotICBpbnQgY2FyZCxjaGlwLGNoYW5uZWwsaW5kZXg7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJaW50IGNhcmQsIGNoaXAsIGNoYW5uZWwsIGluZGV4OwogCiAjaWZkZWYgQ1lfREVCVUdfVEhST1RUTEUKLSAgY2hhciBidWZbNjRdOwotICAgICAgICAKLSAgICBwcmludGsoImN5Yzp1bnRocm90dGxlICVzOiAlZC4uLi50dHlDJWRcbiIsIAotCSAgIHR0eV9uYW1lKHR0eSwgYnVmKSwKLSAgICAgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSwgaW5mby0+bGluZSk7CisJY2hhciBidWZbNjRdOworCisJcHJpbnRrKCJjeWM6dW50aHJvdHRsZSAlczogJWQuLi4udHR5QyVkXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZiksCisJCXR0eS0+bGRpc2MuY2hhcnNfaW5fYnVmZmVyKHR0eSksIGluZm8tPmxpbmUpOwogI2VuZGlmCiAKLSAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3VudGhyb3R0bGUiKSl7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKElfSVhPRkYodHR5KSkgewotCWlmIChpbmZvLT54X2NoYXIpCi0JICAgIGluZm8tPnhfY2hhciA9IDA7Ci0JZWxzZQotCSAgICBjeV9zZW5kX3hjaGFyICh0dHksIFNUQVJUX0NIQVIgKHR0eSkpOwotICAgIH0KLQotICAgIGlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0gICAgICAgIGNhcmQgPSBpbmZvLT5jYXJkOwotICAgICAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGN5X2NhcmRbY2FyZF0uZmlyc3RfbGluZTsKLSAgICAgICAgaWYgKCFJU19DWUNfWihjeV9jYXJkW2NhcmRdKSkgewotCSAgICBjaGlwID0gY2hhbm5lbD4+MjsKLQkgICAgY2hhbm5lbCAmPSAweDAzOwotCSAgICBpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OwotCSAgICBiYXNlX2FkZHIgPSBjeV9jYXJkW2NhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOwotCi0JICAgIENZX0xPQ0soaW5mbywgZmxhZ3MpOwotCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUNBUjw8aW5kZXgpLCAodV9jaGFyKWNoYW5uZWwpOwotCSAgICBpZiAoaW5mby0+cnRzZHRyX2ludikgewotCQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lNU1ZSMjw8aW5kZXgpLCBDeURUUik7Ci0JICAgIH0gZWxzZSB7Ci0JCSAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeU1TVlIxPDxpbmRleCksIEN5UlRTKTsKLQkgICAgfQotCSAgICBDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgICAgICB9IGVsc2UgewotCSAgICBpbmZvLT50aHJvdHRsZSA9IDA7CisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV91bnRocm90dGxlIikpIHsKKwkJcmV0dXJuOwogCX0KLSAgICB9CiAKLSAgICByZXR1cm47Ci19IC8qIGN5X3VudGhyb3R0bGUgKi8KKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCWlmIChpbmZvLT54X2NoYXIpCisJCQlpbmZvLT54X2NoYXIgPSAwOworCQllbHNlCisJCQljeV9zZW5kX3hjaGFyKHR0eSwgU1RBUlRfQ0hBUih0dHkpKTsKKwl9CiAKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQljYXJkID0gaW5mby0+Y2FyZDsKKwkJY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmU7CisJCWlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwkJCWNoaXAgPSBjaGFubmVsID4+IDI7CisJCQljaGFubmVsICY9IDB4MDM7CisJCQlpbmRleCA9IGN5X2NhcmRbY2FyZF0uYnVzX2luZGV4OworCQkJYmFzZV9hZGRyID0gY3lfY2FyZFtjYXJkXS5iYXNlX2FkZHIgKworCQkJCShjeV9jaGlwX29mZnNldFtjaGlwXSA8PCBpbmRleCk7CisKKwkJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUNBUiA8PCBpbmRleCksCisJCQkJICAodV9jaGFyKSBjaGFubmVsKTsKKwkJCWlmIChpbmZvLT5ydHNkdHJfaW52KSB7CisJCQkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeU1TVlIyIDw8IGluZGV4KSwKKwkJCQkJICBDeURUUik7CisJCQl9IGVsc2UgeworCQkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lNU1ZSMSA8PCBpbmRleCksCisJCQkJCSAgQ3lSVFMpOworCQkJfQorCQkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCWluZm8tPnRocm90dGxlID0gMDsKKwkJfQorCX0KK30JCQkJLyogY3lfdW50aHJvdHRsZSAqLwogCiAvKiBjeV9zdGFydCBhbmQgY3lfc3RvcCBwcm92aWRlIHNvZnR3YXJlIG91dHB1dCBmbG93IGNvbnRyb2wgYXMgYQogICAgZnVuY3Rpb24gb2YgWE9OL1hPRkYsIHNvZnR3YXJlIENUUywgYW5kIG90aGVyIHN1Y2ggc3R1ZmYuCiAqLwotc3RhdGljIHZvaWQKLWN5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3N0YXRpYyB2b2lkIGN5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLSAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOwotICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwotICBpbnQgY2hpcCxjaGFubmVsLGluZGV4OwotICB1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJaW50IGNoaXAsIGNoYW5uZWwsIGluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICNpZmRlZiBDWV9ERUJVR19PVEhFUgotICAgIHByaW50aygiY3ljOmN5X3N0b3AgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsgLyogKi8KKwlwcmludGsoImN5YzpjeV9zdG9wIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7CS8qICovCiAjZW5kaWYKIAotICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfc3RvcCIpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07Ci0gICAgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjaW5mby0+Zmlyc3RfbGluZTsKLSAgICBpZiAoIUlTX0NZQ19aKCpjaW5mbykpIHsKLSAgICAgICAgaW5kZXggPSBjaW5mby0+YnVzX2luZGV4OwotICAgICAgICBjaGlwID0gY2hhbm5lbD4+MjsKLSAgICAgICAgY2hhbm5lbCAmPSAweDAzOwotICAgICAgICBiYXNlX2FkZHIgPSBjeV9jYXJkW2luZm8tPmNhcmRdLmJhc2VfYWRkciArIChjeV9jaGlwX29mZnNldFtjaGlwXTw8aW5kZXgpOworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfc3RvcCIpKQorCQlyZXR1cm47CiAKLQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKLSAgICAgICAgICAgIGN5X3dyaXRlYihiYXNlX2FkZHIrKEN5Q0FSPDxpbmRleCksCi0JICAgICAgICh1X2NoYXIpKGNoYW5uZWwgJiAweDAwMDMpKTsgLyogaW5kZXggY2hhbm5lbCAqLwotICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lTUkVSPDxpbmRleCksIAotICAgICAgICAgICAgICAgY3lfcmVhZGIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSkgJiB+Q3lUeFJkeSk7Ci0JQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKLSAgICB9IGVsc2UgewotCS8vIE5vdGhpbmcgdG8gZG8hCi0gICAgfQorCWNpbmZvID0gJmN5X2NhcmRbaW5mby0+Y2FyZF07CisJY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjaW5mby0+Zmlyc3RfbGluZTsKKwlpZiAoIUlTX0NZQ19aKCpjaW5mbykpIHsKKwkJaW5kZXggPSBjaW5mby0+YnVzX2luZGV4OworCQljaGlwID0gY2hhbm5lbCA+PiAyOworCQljaGFubmVsICY9IDB4MDM7CisJCWJhc2VfYWRkciA9IGN5X2NhcmRbaW5mby0+Y2FyZF0uYmFzZV9hZGRyICsKKwkJCShjeV9jaGlwX29mZnNldFtjaGlwXSA8PCBpbmRleCk7CiAKLSAgICByZXR1cm47Ci19IC8qIGN5X3N0b3AgKi8KLQotCi1zdGF0aWMgdm9pZAotY3lfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLSAgc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOwotICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwotICBpbnQgY2hpcCxjaGFubmVsLGluZGV4OwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0jaWZkZWYgQ1lfREVCVUdfT1RIRVIKLSAgICBwcmludGsoImN5YzpjeV9zdGFydCB0dHlDJWRcbiIsIGluZm8tPmxpbmUpOyAvKiAqLwotI2VuZGlmCi0KLSAgICBpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X3N0YXJ0IikpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKLSAgICBjaGFubmVsID0gaW5mby0+bGluZSAtIGNpbmZvLT5maXJzdF9saW5lOwotICAgIGluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKLSAgICBpZiAoIUlTX0NZQ19aKCpjaW5mbykpIHsKLSAgICAgICAgY2hpcCA9IGNoYW5uZWw+PjI7Ci0gICAgICAgIGNoYW5uZWwgJj0gMHgwMzsKLSAgICAgICAgYmFzZV9hZGRyID0gY3lfY2FyZFtpbmZvLT5jYXJkXS5iYXNlX2FkZHIgKyAoY3lfY2hpcF9vZmZzZXRbY2hpcF08PGluZGV4KTsKLQotCUNZX0xPQ0soaW5mbywgZmxhZ3MpOwotICAgICAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQVI8PGluZGV4KSwKLQkgICAgICAgKHVfY2hhcikoY2hhbm5lbCAmIDB4MDAwMykpOyAvKiBpbmRleCBjaGFubmVsICovCi0gICAgICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeVNSRVI8PGluZGV4KSwgCi0gICAgICAgICAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5U1JFUjw8aW5kZXgpKSB8IEN5VHhSZHkpOwotCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0gICAgfSBlbHNlIHsKLQkvLyBOb3RoaW5nIHRvIGRvIQotICAgIH0KLQotICAgIHJldHVybjsKLX0gLyogY3lfc3RhcnQgKi8KLQotCi1zdGF0aWMgdm9pZAotY3lfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKLSAgaW50IGNhcmQsIGNoYW5uZWwsIHJldHZhbDsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jaWZkZWYgQ1lfREVCVUdfSU8KLSAgICBwcmludGsoImN5YzpjeV9mbHVzaF9idWZmZXIgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsgLyogKi8KLSNlbmRpZgotCi0gICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9mbHVzaF9idWZmZXIiKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FyZCA9IGluZm8tPmNhcmQ7Ci0gICAgY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOwotCi0gICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7Ci0gICAgaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwotICAgIENZX1VOTE9DSyhpbmZvLCBmbGFncyk7Ci0KLSAgICBpZiAoSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsgLyogSWYgaXQgaXMgYSBaIGNhcmQsIGZsdXNoIHRoZSBvbi1ib2FyZCAKLQkJCQkgICAgICBidWZmZXJzIGFzIHdlbGwgKi8KLQlDWV9MT0NLKGluZm8sIGZsYWdzKTsKLQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0ZMVVNIX1RYLCAwTCk7Ci0JaWYgKHJldHZhbCAhPSAwKSB7Ci0JICAgIHByaW50aygiY3ljOiBmbHVzaF9idWZmZXIgcmV0dmFsIG9uIHR0eUMlZCB3YXMgJXhcbiIsCi0JCSAgIGluZm8tPmxpbmUsIHJldHZhbCk7CisJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwKKwkJCSh1X2NoYXIpKGNoYW5uZWwgJiAweDAwMDMpKTsgLyogaW5kZXggY2hhbm5lbCAqLworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5U1JFUiA8PCBpbmRleCksCisJCQkgIGN5X3JlYWRiKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpKSAmIH5DeVR4UmR5KTsKKwkJQ1lfVU5MT0NLKGluZm8sIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvKiBOb3RoaW5nIHRvIGRvISAqLwogCX0KLQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOwotICAgIH0KLSAgICB0dHlfd2FrZXVwKHR0eSk7Ci0gICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOwotfSAvKiBjeV9mbHVzaF9idWZmZXIgKi8KK30JCQkJLyogY3lfc3RvcCAqLwogCitzdGF0aWMgdm9pZCBjeV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJaW50IGNoaXAsIGNoYW5uZWwsIGluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBDWV9ERUJVR19PVEhFUgorCXByaW50aygiY3ljOmN5X3N0YXJ0IHR0eUMlZFxuIiwgaW5mby0+bGluZSk7CS8qICovCisjZW5kaWYKKworCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfc3RhcnQiKSkKKwkJcmV0dXJuOworCisJY2luZm8gPSAmY3lfY2FyZFtpbmZvLT5jYXJkXTsKKwljaGFubmVsID0gaW5mby0+bGluZSAtIGNpbmZvLT5maXJzdF9saW5lOworCWluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKKwlpZiAoIUlTX0NZQ19aKCpjaW5mbykpIHsKKwkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKKwkJY2hhbm5lbCAmPSAweDAzOworCQliYXNlX2FkZHIgPSBjeV9jYXJkW2luZm8tPmNhcmRdLmJhc2VfYWRkciArCisJCQkoY3lfY2hpcF9vZmZzZXRbY2hpcF0gPDwgaW5kZXgpOworCisJCUNZX0xPQ0soaW5mbywgZmxhZ3MpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0FSIDw8IGluZGV4KSwgKHVfY2hhcikgKGNoYW5uZWwgJiAweDAwMDMpKTsJLyogaW5kZXggY2hhbm5lbCAqLworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5U1JFUiA8PCBpbmRleCksCisJCQkgIGN5X3JlYWRiKGJhc2VfYWRkciArIChDeVNSRVIgPDwgaW5kZXgpKSB8IEN5VHhSZHkpOworCQlDWV9VTkxPQ0soaW5mbywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qIE5vdGhpbmcgdG8gZG8hICovCisJfQorfQkJCQkvKiBjeV9zdGFydCAqLworCitzdGF0aWMgdm9pZCBjeV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJaW50IGNhcmQsIGNoYW5uZWwsIHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgQ1lfREVCVUdfSU8KKwlwcmludGsoImN5YzpjeV9mbHVzaF9idWZmZXIgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsJLyogKi8KKyNlbmRpZgorCisJaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9mbHVzaF9idWZmZXIiKSkKKwkJcmV0dXJuOworCisJY2FyZCA9IGluZm8tPmNhcmQ7CisJY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjeV9jYXJkW2NhcmRdLmZpcnN0X2xpbmUpOworCisJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisKKwlpZiAoSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsJLyogSWYgaXQgaXMgYSBaIGNhcmQsIGZsdXNoIHRoZSBvbi1ib2FyZAorCQkJCQkgICBidWZmZXJzIGFzIHdlbGwgKi8KKwkJQ1lfTE9DSyhpbmZvLCBmbGFncyk7CisJCXJldHZhbCA9CisJCSAgICBjeXpfaXNzdWVfY21kKCZjeV9jYXJkW2NhcmRdLCBjaGFubmVsLCBDX0NNX0ZMVVNIX1RYLCAwTCk7CisJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJcHJpbnRrKCJjeWM6IGZsdXNoX2J1ZmZlciByZXR2YWwgb24gdHR5QyVkIHdhcyAleFxuIiwKKwkJCQlpbmZvLT5saW5lLCByZXR2YWwpOworCQl9CisJCUNZX1VOTE9DSyhpbmZvLCBmbGFncyk7CisJfQorCXR0eV93YWtldXAodHR5KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7Cit9CQkJCS8qIGN5X2ZsdXNoX2J1ZmZlciAqLwogCiAvKgogICogY3lfaGFuZ3VwKCkgLS0tIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KICAqLwotc3RhdGljIHZvaWQKLWN5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIHZvaWQgY3lfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0gIHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0gICAgICAgIAorCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gKHN0cnVjdCBjeWNsYWRlc19wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKKwogI2lmZGVmIENZX0RFQlVHX09USEVSCi0gICAgcHJpbnRrKCJjeWM6Y3lfaGFuZ3VwIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7IC8qICovCisJcHJpbnRrKCJjeWM6Y3lfaGFuZ3VwIHR0eUMlZFxuIiwgaW5mby0+bGluZSk7CS8qICovCiAjZW5kaWYKIAotICAgIGlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3lfaGFuZ3VwIikpCi0gICAgICAgIHJldHVybjsKKwlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImN5X2hhbmd1cCIpKQorCQlyZXR1cm47CiAKLSAgICBjeV9mbHVzaF9idWZmZXIodHR5KTsKLSAgICBzaHV0ZG93bihpbmZvKTsKLSAgICBpbmZvLT5ldmVudCA9IDA7Ci0gICAgaW5mby0+Y291bnQgPSAwOworCWN5X2ZsdXNoX2J1ZmZlcih0dHkpOworCXNodXRkb3duKGluZm8pOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT5jb3VudCA9IDA7CiAjaWZkZWYgQ1lfREVCVUdfQ09VTlQKLSAgICBwcmludGsoImN5YzpjeV9oYW5ndXAgKCVkKTogc2V0dGluZyBjb3VudCB0byAwXG4iLCBjdXJyZW50LT5waWQpOworCXByaW50aygiY3ljOmN5X2hhbmd1cCAoJWQpOiBzZXR0aW5nIGNvdW50IHRvIDBcbiIsIGN1cnJlbnQtPnBpZCk7CiAjZW5kaWYKLSAgICBpbmZvLT50dHkgPSBOVUxMOwotICAgIGluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwotICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKLX0gLyogY3lfaGFuZ3VwICovCi0KKwlpbmZvLT50dHkgPSBOVUxMOworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKK30JCQkJLyogY3lfaGFuZ3VwICovCiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ0MzIsODIgKzQ1MjgsODQgQEAKIC8qIGluaXRpYWxpemUgY2hpcHMgb24gQ3ljbG9tLVkgY2FyZCAtLSByZXR1cm4gbnVtYmVyIG9mIHZhbGlkCiAgICBjaGlwcyAod2hpY2ggaXMgbnVtYmVyIG9mIHBvcnRzLzQpICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgX19pbml0Ci1jeXlfaW5pdF9jYXJkKHZvaWQgX19pb21lbSAqdHJ1ZV9iYXNlX2FkZHIsaW50IGluZGV4KQorY3l5X2luaXRfY2FyZCh2b2lkIF9faW9tZW0gKiB0cnVlX2Jhc2VfYWRkciwgaW50IGluZGV4KQogewotICB1bnNpZ25lZCBpbnQgY2hpcF9udW1iZXI7Ci0gIHZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCXVuc2lnbmVkIGludCBjaGlwX251bWJlcjsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKIAotICAgIGN5X3dyaXRlYih0cnVlX2Jhc2VfYWRkcisoQ3lfSHdSZXNldDw8aW5kZXgpLCAwKTsgCi0JCQkJCQkvKiBDeV9Id1Jlc2V0IGlzIDB4MTQwMCAqLwotICAgIGN5X3dyaXRlYih0cnVlX2Jhc2VfYWRkcisoQ3lfQ2xySW50cjw8aW5kZXgpLCAwKTsgCi0JCQkJCQkvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLwotICAgIHVkZWxheSg1MDBMKTsKKwljeV93cml0ZWIodHJ1ZV9iYXNlX2FkZHIgKyAoQ3lfSHdSZXNldCA8PCBpbmRleCksIDApOworCS8qIEN5X0h3UmVzZXQgaXMgMHgxNDAwICovCisJY3lfd3JpdGViKHRydWVfYmFzZV9hZGRyICsgKEN5X0NsckludHIgPDwgaW5kZXgpLCAwKTsKKwkvKiBDeV9DbHJJbnRyIGlzIDB4MTgwMCAqLworCXVkZWxheSg1MDBMKTsKIAotICAgIGZvcihjaGlwX251bWJlcj0wOyBjaGlwX251bWJlcjxDeU1BWF9DSElQU19QRVJfQ0FSRDsgY2hpcF9udW1iZXIrKyl7Ci0gICAgICAgIGJhc2VfYWRkciA9IHRydWVfYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBfbnVtYmVyXTw8aW5kZXgpOwotICAgICAgICBtZGVsYXkoMSk7Ci0gICAgICAgIGlmKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lDQ1I8PGluZGV4KSkgIT0gMHgwMCl7Ci0gICAgICAgICAgICAvKioqKioqKioqKioqKgotICAgICAgICAgICAgcHJpbnRrKCIgY2hpcCAjJWQgYXQgJSM2bHggaXMgbmV2ZXIgaWRsZSAoQ0NSICE9IDApXG4iLAotICAgICAgICAgICAgICAgY2hpcF9udW1iZXIsICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkcik7Ci0gICAgICAgICAgICAqKioqKioqKioqKioqLwotICAgICAgICAgICAgcmV0dXJuIGNoaXBfbnVtYmVyOwotICAgICAgICB9CisJZm9yIChjaGlwX251bWJlciA9IDA7IGNoaXBfbnVtYmVyIDwgQ3lNQVhfQ0hJUFNfUEVSX0NBUkQ7IGNoaXBfbnVtYmVyKyspIHsKKwkJYmFzZV9hZGRyID0KKwkJICAgIHRydWVfYmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBfbnVtYmVyXSA8PCBpbmRleCk7CisJCW1kZWxheSgxKTsKKwkJaWYgKGN5X3JlYWRiKGJhc2VfYWRkciArIChDeUNDUiA8PCBpbmRleCkpICE9IDB4MDApIHsKKwkJCS8qKioqKioqKioqKioqCisJCQlwcmludGsoIiBjaGlwICMlZCBhdCAlIzZseCBpcyBuZXZlciBpZGxlIChDQ1IgIT0gMClcbiIsCisJCQljaGlwX251bWJlciwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyKTsKKwkJCSoqKioqKioqKioqKiovCisJCQlyZXR1cm4gY2hpcF9udW1iZXI7CisJCX0KIAotICAgICAgICBjeV93cml0ZWIoYmFzZV9hZGRyKyhDeUdGUkNSPDxpbmRleCksIDApOwotICAgICAgICB1ZGVsYXkoMTBMKTsKKwkJY3lfd3JpdGViKGJhc2VfYWRkciArIChDeUdGUkNSIDw8IGluZGV4KSwgMCk7CisJCXVkZWxheSgxMEwpOwogCi0gICAgICAgIC8qIFRoZSBDeWNsb20tMTZZIGRvZXMgbm90IGRlY29kZSBhZGRyZXNzIGJpdCA5IGFuZCB0aGVyZWZvcmUKLSAgICAgICAgICAgY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gcmVmZXJlbmNlcyB0byBjaGlwIDAgYW5kIGEgbm9uLQotICAgICAgICAgICBleGlzdGVudCBjaGlwIDQuICBJZiB0aGUgcHJlY2VkaW5nIGNsZWFyaW5nIG9mIHRoZSBzdXBwb3NlZAotICAgICAgICAgICBjaGlwIDQgR0ZSQ1IgcmVnaXN0ZXIgYXBwZWFycyBhdCBjaGlwIDAsIHRoZXJlIGlzIG5vIGNoaXAgNAotICAgICAgICAgICBhbmQgdGhpcyBtdXN0IGJlIGEgQ3ljbG9tLTE2WSwgbm90IGEgQ3ljbG9tLTMyWWUuCi0gICAgICAgICovCi0gICAgICAgIGlmIChjaGlwX251bWJlciA9PSA0Ci0gICAgICAgICYmIGN5X3JlYWRiKHRydWVfYmFzZV9hZGRyCi0JICAgICsgKGN5X2NoaXBfb2Zmc2V0WzBdPDxpbmRleCkKLQkgICAgKyAoQ3lHRlJDUjw8aW5kZXgpKSA9PSAwKXsKLSAgICAgICAgICAgIHJldHVybiBjaGlwX251bWJlcjsKLSAgICAgICAgfQorCQkvKiBUaGUgQ3ljbG9tLTE2WSBkb2VzIG5vdCBkZWNvZGUgYWRkcmVzcyBiaXQgOSBhbmQgdGhlcmVmb3JlCisJCSAgIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHJlZmVyZW5jZXMgdG8gY2hpcCAwIGFuZCBhIG5vbi0KKwkJICAgZXhpc3RlbnQgY2hpcCA0LiAgSWYgdGhlIHByZWNlZGluZyBjbGVhcmluZyBvZiB0aGUgc3VwcG9zZWQKKwkJICAgY2hpcCA0IEdGUkNSIHJlZ2lzdGVyIGFwcGVhcnMgYXQgY2hpcCAwLCB0aGVyZSBpcyBubyBjaGlwIDQKKwkJICAgYW5kIHRoaXMgbXVzdCBiZSBhIEN5Y2xvbS0xNlksIG5vdCBhIEN5Y2xvbS0zMlllLgorCQkgKi8KKwkJaWYgKGNoaXBfbnVtYmVyID09IDQgJiYgY3lfcmVhZGIodHJ1ZV9iYXNlX2FkZHIgKworCQkJCShjeV9jaGlwX29mZnNldFswXSA8PCBpbmRleCkgKworCQkJCShDeUdGUkNSIDw8IGluZGV4KSkgPT0gMCkgeworCQkJcmV0dXJuIGNoaXBfbnVtYmVyOworCQl9CiAKLSAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lDQ1I8PGluZGV4KSwgQ3lDSElQX1JFU0VUKTsKLSAgICAgICAgbWRlbGF5KDEpOworCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5Q0NSIDw8IGluZGV4KSwgQ3lDSElQX1JFU0VUKTsKKwkJbWRlbGF5KDEpOwogCi0gICAgICAgIGlmKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSA9PSAweDAwKXsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBwcmludGsoIiBjaGlwICMlZCBhdCAlIzZseCBpcyBub3QgcmVzcG9uZGluZyAiLAotICAgICAgICAgICAgICAgY2hpcF9udW1iZXIsICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkcik7Ci0gICAgICAgICAgICBwcmludGsoIihHRlJDUiBzdGF5ZWQgMClcbiIsCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgcmV0dXJuIGNoaXBfbnVtYmVyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCgweGYwICYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSkpICE9IDB4NDApewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIHByaW50aygiIGNoaXAgIyVkIGF0ICUjNmx4IGlzIG5vdCB2YWxpZCAoR0ZSQ1IgPT0gJSMyeClcbiIsCi0gICAgICAgICAgICAgICBjaGlwX251bWJlciwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLAotCSAgICAgICBiYXNlX2FkZHJbQ3lHRlJDUjw8aW5kZXhdKTsKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXR1cm4gY2hpcF9udW1iZXI7Ci0gICAgICAgIH0KLSAgICAgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lHQ1I8PGluZGV4KSwgQ3lDSDBfU0VSSUFMKTsKLSAgICAgICAgaWYgKGN5X3JlYWRiKGJhc2VfYWRkcisoQ3lHRlJDUjw8aW5kZXgpKSA+PSBDRDE0MDBfUkVWX0opewotCSAgICAvKiBJdCBpcyBhIENEMTQwMCByZXYuIEogb3IgbGF0ZXIgKi8KLQkgICAgLyogSW1wb3NzaWJsZSB0byByZWFjaCA1bXMgd2l0aCB0aGlzIGNoaXAuIAotCSAgICAgICBDaGFuZ2VkIHRvIDJtcyBpbnN0ZWFkIChmID0gNTAwIEh6KS4gKi8KLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lQUFI8PGluZGV4KSwgQ3lDTE9DS182MF8yTVMpOwotCX0gZWxzZSB7Ci0JICAgIC8qIGYgPSAyMDAgSHogKi8KLQkgICAgY3lfd3JpdGViKGJhc2VfYWRkcisoQ3lQUFI8PGluZGV4KSwgQ3lDTE9DS18yNV81TVMpOworCQlpZiAoY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5R0ZSQ1IgPDwgaW5kZXgpKSA9PSAweDAwKSB7CisJCQkvKgorCQkJICAgcHJpbnRrKCIgY2hpcCAjJWQgYXQgJSM2bHggaXMgbm90IHJlc3BvbmRpbmcgIiwKKwkJCSAgIGNoaXBfbnVtYmVyLCAodW5zaWduZWQgbG9uZyliYXNlX2FkZHIpOworCQkJICAgcHJpbnRrKCIoR0ZSQ1Igc3RheWVkIDApXG4iLAorCQkJICovCisJCQlyZXR1cm4gY2hpcF9udW1iZXI7CisJCX0KKwkJaWYgKCgweGYwICYgKGN5X3JlYWRiKGJhc2VfYWRkciArIChDeUdGUkNSIDw8IGluZGV4KSkpKSAhPQorCQkJCTB4NDApIHsKKwkJCS8qCisJCQlwcmludGsoIiBjaGlwICMlZCBhdCAlIzZseCBpcyBub3QgdmFsaWQgKEdGUkNSID09ICIKKwkJCQkJIiUjMngpXG4iLAorCQkJCQljaGlwX251bWJlciwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLAorCQkJCQliYXNlX2FkZHJbQ3lHRlJDUjw8aW5kZXhdKTsKKwkJCSAqLworCQkJcmV0dXJuIGNoaXBfbnVtYmVyOworCQl9CisJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lHQ1IgPDwgaW5kZXgpLCBDeUNIMF9TRVJJQUwpOworCQlpZiAoY3lfcmVhZGIoYmFzZV9hZGRyICsgKEN5R0ZSQ1IgPDwgaW5kZXgpKSA+PSBDRDE0MDBfUkVWX0opIHsKKwkJCS8qIEl0IGlzIGEgQ0QxNDAwIHJldi4gSiBvciBsYXRlciAqLworCQkJLyogSW1wb3NzaWJsZSB0byByZWFjaCA1bXMgd2l0aCB0aGlzIGNoaXAuCisJCQkgICBDaGFuZ2VkIHRvIDJtcyBpbnN0ZWFkIChmID0gNTAwIEh6KS4gKi8KKwkJCWN5X3dyaXRlYihiYXNlX2FkZHIgKyAoQ3lQUFIgPDwgaW5kZXgpLCBDeUNMT0NLXzYwXzJNUyk7CisJCX0gZWxzZSB7CisJCQkvKiBmID0gMjAwIEh6ICovCisJCQljeV93cml0ZWIoYmFzZV9hZGRyICsgKEN5UFBSIDw8IGluZGV4KSwgQ3lDTE9DS18yNV81TVMpOworCQl9CisKKwkJLyoKKwkJICAgcHJpbnRrKCIgY2hpcCAjJWQgYXQgJSM2bHggaXMgcmV2IDB4JTJ4XG4iLAorCQkgICBjaGlwX251bWJlciwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLAorCQkgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5R0ZSQ1I8PGluZGV4KSkpOworCQkgKi8KIAl9Ci0KLSAgICAvKgotICAgICAgICBwcmludGsoIiBjaGlwICMlZCBhdCAlIzZseCBpcyByZXYgMHglMnhcbiIsCi0gICAgICAgICAgICAgICBjaGlwX251bWJlciwgKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyLAotCSAgICAgICBjeV9yZWFkYihiYXNlX2FkZHIrKEN5R0ZSQ1I8PGluZGV4KSkpOwotICAgICovCi0gICAgfQotICAgIHJldHVybiBjaGlwX251bWJlcjsKLX0gLyogY3l5X2luaXRfY2FyZCAqLworCXJldHVybiBjaGlwX251bWJlcjsKK30JCQkJLyogY3l5X2luaXRfY2FyZCAqLwogCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NTE1LDEyNiArNDYxMywxMjQgQEAKICAqIHNldHMgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgSVNBIGJvYXJkcyBmb3VuZC4KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi1zdGF0aWMgaW50IF9faW5pdAotY3lfZGV0ZWN0X2lzYSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY3lfZGV0ZWN0X2lzYSh2b2lkKQogewogI2lmZGVmIENPTkZJR19JU0EKLSAgdW5zaWduZWQgc2hvcnQJY3lfaXNhX2lycSxuYm9hcmQ7Ci0gIHZvaWQgX19pb21lbQkJKmN5X2lzYV9hZGRyZXNzOwotICB1bnNpZ25lZCBzaG9ydAlpLGosY3lfaXNhX25jaGFuOworCXVuc2lnbmVkIHNob3J0IGN5X2lzYV9pcnEsIG5ib2FyZDsKKwl2b2lkIF9faW9tZW0gKmN5X2lzYV9hZGRyZXNzOworCXVuc2lnbmVkIHNob3J0IGksIGosIGN5X2lzYV9uY2hhbjsKICNpZmRlZiBNT0RVTEUKLSAgaW50IGlzcGFyYW0gPSAwOworCWludCBpc3BhcmFtID0gMDsKICNlbmRpZgogCi0gICAgICAgIG5ib2FyZCA9IDA7CisJbmJvYXJkID0gMDsKIAogI2lmZGVmIE1PRFVMRQogCS8qIENoZWNrIGZvciBtb2R1bGUgcGFyYW1ldGVycyAqLwotCWZvcihpID0gMCA7IGkgPCBOUl9DQVJEUzsgaSsrKSB7Ci0JICAgIGlmIChtYWRkcltpXSB8fCBpKSB7Ci0JCWlzcGFyYW0gPSAxOwotCQljeV9pc2FfYWRkcmVzc2VzW2ldID0gbWFkZHJbaV07Ci0JICAgIH0KLQkgICAgaWYgKCFtYWRkcltpXSkKLQkJYnJlYWs7CisJZm9yIChpID0gMDsgaSA8IE5SX0NBUkRTOyBpKyspIHsKKwkJaWYgKG1hZGRyW2ldIHx8IGkpIHsKKwkJCWlzcGFyYW0gPSAxOworCQkJY3lfaXNhX2FkZHJlc3Nlc1tpXSA9IG1hZGRyW2ldOworCQl9CisJCWlmICghbWFkZHJbaV0pCisJCQlicmVhazsKIAl9CiAjZW5kaWYKIAotICAgICAgICAvKiBzY2FuIHRoZSBhZGRyZXNzIHRhYmxlIHByb2JpbmcgZm9yIEN5Y2xvbS1ZL0lTQSBib2FyZHMgKi8KLSAgICAgICAgZm9yIChpID0gMCA7IGkgPCBOUl9JU0FfQUREUlMgOyBpKyspIHsKLSAgICAgICAgCXVuc2lnbmVkIGludCBpc2FfYWRkcmVzcyA9IGN5X2lzYV9hZGRyZXNzZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGlzYV9hZGRyZXNzICA9PSAweDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihuYm9hcmQpOwotICAgICAgICAgICAgICAgIH0KKwkvKiBzY2FuIHRoZSBhZGRyZXNzIHRhYmxlIHByb2JpbmcgZm9yIEN5Y2xvbS1ZL0lTQSBib2FyZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVNBX0FERFJTOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGlzYV9hZGRyZXNzID0gY3lfaXNhX2FkZHJlc3Nlc1tpXTsKKwkJaWYgKGlzYV9hZGRyZXNzID09IDB4MDAwMCkgeworCQkJcmV0dXJuIG5ib2FyZDsKKwkJfQogCi0gICAgICAgICAgICAgICAgLyogcHJvYmUgZm9yIENEMTQwMC4uLiAqLworCQkvKiBwcm9iZSBmb3IgQ0QxNDAwLi4uICovCiAJCWN5X2lzYV9hZGRyZXNzID0gaW9yZW1hcChpc2FfYWRkcmVzcywgQ3lJU0FfWXdpbik7Ci0gICAgICAgICAgICAgICAgY3lfaXNhX25jaGFuID0gQ3lQT1JUU19QRVJfQ0hJUCAqIAotICAgICAgICAgICAgICAgICAgICAgY3l5X2luaXRfY2FyZChjeV9pc2FfYWRkcmVzcywwKTsKLSAgICAgICAgICAgICAgICBpZiAoY3lfaXNhX25jaGFuID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQorCQljeV9pc2FfbmNoYW4gPSBDeVBPUlRTX1BFUl9DSElQICoKKwkJCWN5eV9pbml0X2NhcmQoY3lfaXNhX2FkZHJlc3MsIDApOworCQlpZiAoY3lfaXNhX25jaGFuID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CiAjaWZkZWYgTU9EVUxFCiAJCWlmIChpc3BhcmFtICYmIGlycVtpXSkKLQkJICAgIGN5X2lzYV9pcnEgPSBpcnFbaV07CisJCQljeV9pc2FfaXJxID0gaXJxW2ldOwogCQllbHNlCiAjZW5kaWYKLSAgICAgICAgICAgICAgICAvKiBmaW5kIG91dCB0aGUgYm9hcmQncyBpcnEgYnkgcHJvYmluZyAqLwotICAgICAgICAgICAgICAgIGN5X2lzYV9pcnEgPSBkZXRlY3RfaXNhX2lycShjeV9pc2FfYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGN5X2lzYV9pcnEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9JU0EgZm91bmQgYXQgMHglbHggIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGN5X2lzYV9hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiYnV0IHRoZSBJUlEgY291bGQgbm90IGJlIGRldGVjdGVkLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CisJCQkvKiBmaW5kIG91dCB0aGUgYm9hcmQncyBpcnEgYnkgcHJvYmluZyAqLworCQkJY3lfaXNhX2lycSA9IGRldGVjdF9pc2FfaXJxKGN5X2lzYV9hZGRyZXNzKTsKKwkJaWYgKGN5X2lzYV9pcnEgPT0gMCkgeworCQkJcHJpbnRrKCJDeWNsb20tWS9JU0EgZm91bmQgYXQgMHglbHggIiwKKwkJCQkodW5zaWduZWQgbG9uZyljeV9pc2FfYWRkcmVzcyk7CisJCQlwcmludGsoImJ1dCB0aGUgSVJRIGNvdWxkIG5vdCBiZSBkZXRlY3RlZC5cbiIpOworCQkJY29udGludWU7CisJCX0KIAotICAgICAgICAgICAgICAgIGlmKChjeV9uZXh0X2NoYW5uZWwrY3lfaXNhX25jaGFuKSA+IE5SX1BPUlRTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL0lTQSBmb3VuZCBhdCAweCVseCAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgY3lfaXNhX2FkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gbW9yZSBjaGFubmVscyBhcmUgYXZhaWxhYmxlLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9QT1JUUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obmJvYXJkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgbmV4dCBjeV9jYXJkIHN0cnVjdHVyZSBhdmFpbGFibGUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IE5SX0NBUkRTIDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3lfY2FyZFtqXS5iYXNlX2FkZHIgPT0gMCkgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaiA9PSBOUl9DQVJEUykgeyAgICAvKiBubyBtb3JlIGN5X2NhcmRzIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9JU0EgZm91bmQgYXQgMHglbHggIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGN5X2lzYV9hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiYnV0IG5vIG1vcmUgY2FyZHMgY2FuIGJlIHVzZWQgLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9DQVJEUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obmJvYXJkKTsKLSAgICAgICAgICAgICAgICB9CisJCWlmICgoY3lfbmV4dF9jaGFubmVsICsgY3lfaXNhX25jaGFuKSA+IE5SX1BPUlRTKSB7CisJCQlwcmludGsoIkN5Y2xvbS1ZL0lTQSBmb3VuZCBhdCAweCVseCAiLAorCQkJCSh1bnNpZ25lZCBsb25nKWN5X2lzYV9hZGRyZXNzKTsKKwkJCXByaW50aygiYnV0IG5vIG1vcmUgY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS5cbiIpOworCQkJcHJpbnRrKCJDaGFuZ2UgTlJfUE9SVFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlICIKKwkJCQkJImtlcm5lbC5cbiIpOworCQkJcmV0dXJuIG5ib2FyZDsKKwkJfQorCQkvKiBmaWxsIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworCQlmb3IgKGogPSAwOyBqIDwgTlJfQ0FSRFM7IGorKykgeworCQkJaWYgKGN5X2NhcmRbal0uYmFzZV9hZGRyID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogPT0gTlJfQ0FSRFMpIHsJLyogbm8gbW9yZSBjeV9jYXJkcyBhdmFpbGFibGUgKi8KKwkJCXByaW50aygiQ3ljbG9tLVkvSVNBIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkJKHVuc2lnbmVkIGxvbmcpY3lfaXNhX2FkZHJlc3MpOworCQkJcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZCAuXG4iKTsKKwkJCXByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSAiCisJCQkJCSJrZXJuZWwuXG4iKTsKKwkJCXJldHVybiBuYm9hcmQ7CisJCX0KIAotICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIElSUSAqLwotICAgICAgICAgICAgICAgIGlmKHJlcXVlc3RfaXJxKGN5X2lzYV9pcnEsIGN5eV9pbnRlcnJ1cHQsCi0JCQkJICAgSVJRRl9ESVNBQkxFRCwgIkN5Y2xvbS1ZIiwgJmN5X2NhcmRbal0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvSVNBIGZvdW5kIGF0IDB4JWx4ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBjeV9pc2FfYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRIyVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lfaXNhX2lycSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obmJvYXJkKTsKLSAgICAgICAgICAgICAgICB9CisJCS8qIGFsbG9jYXRlIElSUSAqLworCQlpZiAocmVxdWVzdF9pcnEoY3lfaXNhX2lycSwgY3l5X2ludGVycnVwdCwKKwkJCQlJUlFGX0RJU0FCTEVELCAiQ3ljbG9tLVkiLCAmY3lfY2FyZFtqXSkpIHsKKwkJCXByaW50aygiQ3ljbG9tLVkvSVNBIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkJKHVuc2lnbmVkIGxvbmcpY3lfaXNhX2FkZHJlc3MpOworCQkJcHJpbnRrKCJidXQgY291bGQgbm90IGFsbG9jYXRlIElSUSMlZC5cbiIsIGN5X2lzYV9pcnEpOworCQkJcmV0dXJuIG5ib2FyZDsKKwkJfQogCi0gICAgICAgICAgICAgICAgLyogc2V0IGN5X2NhcmQgKi8KLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJhc2VfYWRkciA9IGN5X2lzYV9hZGRyZXNzOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uY3RsX2FkZHIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uaXJxID0gKGludCkgY3lfaXNhX2lycTsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJ1c19pbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0ubnVtX2NoaXBzID0gY3lfaXNhX25jaGFuLzQ7Ci0gICAgICAgICAgICAgICAgbmJvYXJkKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKiBwcmludCBtZXNzYWdlICovCi0gICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9JU0EgIyVkOiAweCVseC0weCVseCwgSVJRJWQsICIsCi0gICAgICAgICAgICAgICAgICAgIGorMSwgKHVuc2lnbmVkIGxvbmcpIGN5X2lzYV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykoY3lfaXNhX2FkZHJlc3MgKyAoQ3lJU0FfWXdpbiAtIDEpKSwKLQkJICAgIGN5X2lzYV9pcnEpOwotICAgICAgICAgICAgICAgIHByaW50aygiJWQgY2hhbm5lbHMgc3RhcnRpbmcgZnJvbSBwb3J0ICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN5X2lzYV9uY2hhbiwgY3lfbmV4dF9jaGFubmVsKTsKLSAgICAgICAgICAgICAgICBjeV9uZXh0X2NoYW5uZWwgKz0gY3lfaXNhX25jaGFuOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybihuYm9hcmQpOworCQkvKiBzZXQgY3lfY2FyZCAqLworCQljeV9jYXJkW2pdLmJhc2VfYWRkciA9IGN5X2lzYV9hZGRyZXNzOworCQljeV9jYXJkW2pdLmN0bF9hZGRyID0gTlVMTDsKKwkJY3lfY2FyZFtqXS5pcnEgPSAoaW50KWN5X2lzYV9pcnE7CisJCWN5X2NhcmRbal0uYnVzX2luZGV4ID0gMDsKKwkJY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOworCQljeV9jYXJkW2pdLm51bV9jaGlwcyA9IGN5X2lzYV9uY2hhbiAvIDQ7CisJCW5ib2FyZCsrOworCisJCS8qIHByaW50IG1lc3NhZ2UgKi8KKwkJcHJpbnRrKCJDeWNsb20tWS9JU0EgIyVkOiAweCVseC0weCVseCwgSVJRJWQsICIsCisJCQlqICsgMSwgKHVuc2lnbmVkIGxvbmcpY3lfaXNhX2FkZHJlc3MsCisJCQkodW5zaWduZWQgbG9uZykoY3lfaXNhX2FkZHJlc3MgKyAoQ3lJU0FfWXdpbiAtIDEpKSwKKwkJCWN5X2lzYV9pcnEpOworCQlwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCisJCQljeV9pc2FfbmNoYW4sIGN5X25leHRfY2hhbm5lbCk7CisJCWN5X25leHRfY2hhbm5lbCArPSBjeV9pc2FfbmNoYW47CisJfQorCXJldHVybiBuYm9hcmQ7CiAjZWxzZQotICAgICAgICByZXR1cm4oMCk7Ci0jZW5kaWYgLyogQ09ORklHX0lTQSAqLwotfSAvKiBjeV9kZXRlY3RfaXNhICovCisJcmV0dXJuIDA7CisjZW5kaWYJCQkJLyogQ09ORklHX0lTQSAqLworfQkJCQkvKiBjeV9kZXRlY3RfaXNhICovCiAKLXN0YXRpYyB2b2lkIAotcGx4X2luaXQodm9pZCBfX2lvbWVtICphZGRyLCB1Y2xvbmcgaW5pdGN0bCkKK3N0YXRpYyB2b2lkIHBseF9pbml0KHZvaWQgX19pb21lbSAqIGFkZHIsIHVjbG9uZyBpbml0Y3RsKQogewotICAgIC8qIFJlc2V0IFBMWCAqLwotICAgIGN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgY3lfcmVhZGwoYWRkciArIGluaXRjdGwpIHwgMHg0MDAwMDAwMCk7Ci0gICAgdWRlbGF5KDEwMEwpOwotICAgIGN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgY3lfcmVhZGwoYWRkciArIGluaXRjdGwpICYgfjB4NDAwMDAwMDApOworCS8qIFJlc2V0IFBMWCAqLworCWN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgY3lfcmVhZGwoYWRkciArIGluaXRjdGwpIHwgMHg0MDAwMDAwMCk7CisJdWRlbGF5KDEwMEwpOworCWN5X3dyaXRlbChhZGRyICsgaW5pdGN0bCwgY3lfcmVhZGwoYWRkciArIGluaXRjdGwpICYgfjB4NDAwMDAwMDApOwogCi0gICAgLyogUmVsb2FkIENvbmZpZy4gUmVnaXN0ZXJzIGZyb20gRUVQUk9NICovCi0gICAgY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCBjeV9yZWFkbChhZGRyICsgaW5pdGN0bCkgfCAweDIwMDAwMDAwKTsKLSAgICB1ZGVsYXkoMTAwTCk7Ci0gICAgY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCBjeV9yZWFkbChhZGRyICsgaW5pdGN0bCkgJiB+MHgyMDAwMDAwMCk7CisJLyogUmVsb2FkIENvbmZpZy4gUmVnaXN0ZXJzIGZyb20gRUVQUk9NICovCisJY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCBjeV9yZWFkbChhZGRyICsgaW5pdGN0bCkgfCAweDIwMDAwMDAwKTsKKwl1ZGVsYXkoMTAwTCk7CisJY3lfd3JpdGVsKGFkZHIgKyBpbml0Y3RsLCBjeV9yZWFkbChhZGRyICsgaW5pdGN0bCkgJiB+MHgyMDAwMDAwMCk7CiB9CiAKIC8qCkBAIC00NjQzLDQzICs0NzM5LDQyIEBACiAgKiBzZXRzIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIFBDSSBib2FyZHMgZm91bmQuCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotc3RhdGljIGludCBfX2luaXQKLWN5X2RldGVjdF9wY2kodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGN5X2RldGVjdF9wY2kodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUENJCiAKLSAgc3RydWN0IHBjaV9kZXYJKnBkZXYgPSBOVUxMOwotICB1bnNpZ25lZCBjaGFyCQljeXlfcmV2X2lkOwotICB1bnNpZ25lZCBjaGFyCQljeV9wY2lfaXJxID0gMDsKLSAgdWNsb25nCQljeV9wY2lfcGh5czAsIGN5X3BjaV9waHlzMjsKLSAgdm9pZCBfX2lvbWVtCQkqY3lfcGNpX2FkZHIwLCAqY3lfcGNpX2FkZHIyOwotICB1bnNpZ25lZCBzaG9ydAlpLGosY3lfcGNpX25jaGFuLCBwbHhfdmVyOwotICB1bnNpZ25lZCBzaG9ydAlkZXZpY2VfaWQsZGV2X2luZGV4ID0gMDsKLSAgdWNsb25nCQltYWlsYm94OwotICB1Y2xvbmcJCVplSW5kZXggPSAwOwotICB2b2lkIF9faW9tZW0JCSpaZV9hZGRyMFtOUl9DQVJEU10sICpaZV9hZGRyMltOUl9DQVJEU107Ci0gIHVjbG9uZwkJWmVfcGh5czBbTlJfQ0FSRFNdLCBaZV9waHlzMltOUl9DQVJEU107Ci0gIHVuc2lnbmVkIGNoYXIJCVplX2lycVtOUl9DQVJEU107Ci0gIHN0cnVjdCBwY2lfZGV2CSpaZV9wZGV2W05SX0NBUkRTXTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBjeXlfcmV2X2lkOworCXVuc2lnbmVkIGNoYXIgY3lfcGNpX2lycSA9IDA7CisJdWNsb25nIGN5X3BjaV9waHlzMCwgY3lfcGNpX3BoeXMyOworCXZvaWQgX19pb21lbSAqY3lfcGNpX2FkZHIwLCAqY3lfcGNpX2FkZHIyOworCXVuc2lnbmVkIHNob3J0IGksIGosIGN5X3BjaV9uY2hhbiwgcGx4X3ZlcjsKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsIGRldl9pbmRleCA9IDA7CisJdWNsb25nIG1haWxib3g7CisJdWNsb25nIFplSW5kZXggPSAwOworCXZvaWQgX19pb21lbSAqWmVfYWRkcjBbTlJfQ0FSRFNdLCAqWmVfYWRkcjJbTlJfQ0FSRFNdOworCXVjbG9uZyBaZV9waHlzMFtOUl9DQVJEU10sIFplX3BoeXMyW05SX0NBUkRTXTsKKwl1bnNpZ25lZCBjaGFyIFplX2lycVtOUl9DQVJEU107CisJc3RydWN0IHBjaV9kZXYgKlplX3BkZXZbTlJfQ0FSRFNdOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBOUl9DQVJEUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLyogbG9vayBmb3IgYSBDeWNsYWRlcyBjYXJkIGJ5IHZlbmRvciBhbmQgZGV2aWNlIGlkICovCi0gICAgICAgICAgICAgICAgd2hpbGUoKGRldmljZV9pZCA9IGN5X3BjaV9kZXZfaWRbZGV2X2luZGV4XSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NZQ0xBREVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9pZCwgcGRldikpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZGV4Kys7ICAgIC8qIHRyeSBuZXh0IGRldmljZSBpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIGZvdW5kIGEgYm9hcmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisJZm9yIChpID0gMDsgaSA8IE5SX0NBUkRTOyBpKyspIHsKKwkJLyogbG9vayBmb3IgYSBDeWNsYWRlcyBjYXJkIGJ5IHZlbmRvciBhbmQgZGV2aWNlIGlkICovCisJCXdoaWxlICgoZGV2aWNlX2lkID0gY3lfcGNpX2Rldl9pZFtkZXZfaW5kZXhdKSAhPSAwKSB7CisJCQlpZiAoKHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0NZQ0xBREVTLAorCQkJCQkJICAgZGV2aWNlX2lkLCBwZGV2KSkgPT0gTlVMTCkgeworCQkJCWRldl9pbmRleCsrOwkvKiB0cnkgbmV4dCBkZXZpY2UgaWQgKi8KKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CS8qIGZvdW5kIGEgYm9hcmQgKi8KKwkJCX0KKwkJfQogCiAJCWlmIChkZXZpY2VfaWQgPT0gMCkKLQkJICAgIGJyZWFrOworCQkJYnJlYWs7CiAKIAkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQotCQkgICAgY29udGludWU7CisJCQljb250aW51ZTsKIAotICAgICAgICAgICAgICAgIC8qIHJlYWQgUENJIGNvbmZpZ3VyYXRpb24gYXJlYSAqLworCQkvKiByZWFkIFBDSSBjb25maWd1cmF0aW9uIGFyZWEgKi8KIAkJY3lfcGNpX2lycSA9IHBkZXYtPmlycTsKIAkJY3lfcGNpX3BoeXMwID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwogCQljeV9wY2lfcGh5czIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CkBAIC00Njg3LDQ4MiArNDc4Miw0OTcgQEAKIAogCQlkZXZpY2VfaWQgJj0gflBDSV9ERVZJQ0VfSURfTUFTSzsKIAotICAgIGlmICgoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfTG8pCi0JICAgfHwgKGRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9ZX0hpKSl7CisJCWlmIChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWV9MbyB8fAorCQkJCWRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9ZX0hpKSB7CiAjaWZkZWYgQ1lfUENJX0RFQlVHCi0gICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSSAoYnVzPTB4MCV4LCBwY2lfaWQ9MHgleCwgIiwKLQkJcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKLSAgICAgICAgICAgIHByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwKLQkJY3l5X3Jldl9pZCwgKGludCljeV9wY2lfaXJxKTsKLSAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJOmZvdW5kICB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCi0JCSh1bG9uZyljeV9wY2lfcGh5czIsICh1bG9uZyljeV9wY2lfcGh5czApOworCQkJcHJpbnRrKCJDeWNsb20tWS9QQ0kgKGJ1cz0weDAleCwgcGNpX2lkPTB4JXgsICIsCisJCQkJcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKKwkJCXByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwKKwkJCQljeXlfcmV2X2lkLCAoaW50KWN5X3BjaV9pcnEpOworCQkJcHJpbnRrKCJDeWNsb20tWS9QQ0k6Zm91bmQgIHdpbmFkZHI9MHglbHggIgorCQkJCSJjdGxhZGRyPTB4JWx4XG4iLAorCQkJCSh1bG9uZyljeV9wY2lfcGh5czIsICh1bG9uZyljeV9wY2lfcGh5czApOwogI2VuZGlmCiAKLQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAyKSAmIElPUkVTT1VSQ0VfSU8pIHsKLQkJICAgIHByaW50aygiICBXYXJuaW5nOiBQQ0kgSS9PIGJpdCBpbmNvcnJlY3RseSBzZXQuICIKLQkJCSAgICJJZ25vcmluZyBpdC4uLlxuIik7Ci0JCSAgICBwZGV2LT5yZXNvdXJjZVsyXS5mbGFncyAmPSB+SU9SRVNPVVJDRV9JTzsKLQkJfQorCQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAyKSAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJCQlwcmludGsoIiAgV2FybmluZzogUENJIEkvTyBiaXQgaW5jb3JyZWN0bHkgIgorCQkJCQkic2V0LiBJZ25vcmluZyBpdC4uLlxuIik7CisJCQkJcGRldi0+cmVzb3VyY2VbMl0uZmxhZ3MgJj0gfklPUkVTT1VSQ0VfSU87CisJCQl9CiAKLQkJLyogQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgSS9PIHJlZ2lvbiwgd2Ugc2hvdWxkCi0JCSAgIHJlcXVlc3QgaXQgZnJvbSB0aGUga2VybmVsIGFueXdheSwgdG8gYXZvaWQgcHJvYmxlbXMKLQkJICAgd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4gKi8KLQkJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIkN5Y2xvbS1ZIikgIT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjeWNsYWRlczogZmFpbGVkIHRvIHJlc2VydmUgUENJIHJlc291cmNlc1xuIik7Ci0JCQljb250aW51ZTsKLQkJfQotCisJCQkvKiBBbHRob3VnaCB3ZSBkb24ndCB1c2UgdGhpcyBJL08gcmVnaW9uLCB3ZSBzaG91bGQKKwkJCSAgIHJlcXVlc3QgaXQgZnJvbSB0aGUga2VybmVsIGFueXdheSwgdG8gYXZvaWQgcHJvYmxlbXMKKwkJCSAgIHdpdGggb3RoZXIgZHJpdmVycyBhY2Nlc3NpbmcgaXQuICovCisJCQlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiQ3ljbG9tLVkiKSAhPSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJjeWNsYWRlczogZmFpbGVkIHRvIHJlc2VydmUgIgorCQkJCQkJIlBDSSByZXNvdXJjZXNcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQogI2lmIGRlZmluZWQoX19hbHBoYV9fKQotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfaWQgID09IFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1lfTG8pIHsgLyogYmVsb3cgMU0/ICovCi0JCSAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSSAoYnVzPTB4MCV4LCBwY2lfaWQ9MHgleCwgIiwKLQkJCXBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7Ci0JCSAgICBwcmludGsoInJldl9pZD0lZCkgSVJRJWRcbiIsCi0JCSAgICAgICAgY3l5X3Jldl9pZCwgKGludCljeV9wY2lfaXJxKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9QQ0k6Zm91bmQgIHdpbmFkZHI9MHglbHggY3RsYWRkcj0weCVseFxuIiwKLQkJICAgICAgICAodWxvbmcpY3lfcGNpX3BoeXMyLCAodWxvbmcpY3lfcGNpX3BoeXMwKTsKLQkgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSSBub3Qgc3VwcG9ydGVkIGZvciBsb3cgYWRkcmVzc2VzIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHBoYSBzeXN0ZW1zLlxuIik7Ci0JCSAgICBpLS07Ci0JICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQorCQkJaWYgKGRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9ZX0xvKSB7CS8qIGJlbG93IDFNPyAqLworCQkJCXByaW50aygiQ3ljbG9tLVkvUENJIChidXM9MHgwJXgsIHBjaV9pZD0weCV4LCAiLAorCQkJCQlwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOworCQkJCXByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwKKwkJCQkJY3l5X3Jldl9pZCwgKGludCljeV9wY2lfaXJxKTsKKwkJCQlwcmludGsoIkN5Y2xvbS1ZL1BDSTpmb3VuZCAgd2luYWRkcj0weCVseCAiCisJCQkJCSJjdGxhZGRyPTB4JWx4XG4iLAorCQkJCQkodWxvbmcpY3lfcGNpX3BoeXMyLAorCQkJCQkodWxvbmcpY3lfcGNpX3BoeXMwKTsKKwkJCQlwcmludGsoIkN5Y2xvbS1ZL1BDSSBub3Qgc3VwcG9ydGVkIGZvciBsb3cgIgorCQkJCQkiYWRkcmVzc2VzIGluIEFscGhhIHN5c3RlbXMuXG4iKTsKKwkJCQlpLS07CisJCQkJY29udGludWU7CisJCQl9CiAjZW5kaWYKLQkJY3lfcGNpX2FkZHIwID0gaW9yZW1hcChjeV9wY2lfcGh5czAsIEN5UENJX1ljdGwpOwotCQljeV9wY2lfYWRkcjIgPSBpb3JlbWFwKGN5X3BjaV9waHlzMiwgQ3lQQ0lfWXdpbik7CisJCQljeV9wY2lfYWRkcjAgPSBpb3JlbWFwKGN5X3BjaV9waHlzMCwgQ3lQQ0lfWWN0bCk7CisJCQljeV9wY2lfYWRkcjIgPSBpb3JlbWFwKGN5X3BjaV9waHlzMiwgQ3lQQ0lfWXdpbik7CiAKICNpZmRlZiBDWV9QQ0lfREVCVUcKLSAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJOiByZWxvY2F0ZSB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCi0JCSh1X2xvbmcpY3lfcGNpX2FkZHIyLCAodV9sb25nKWN5X3BjaV9hZGRyMCk7CisJCQlwcmludGsoIkN5Y2xvbS1ZL1BDSTogcmVsb2NhdGUgd2luYWRkcj0weCVseCAiCisJCQkJImN0bGFkZHI9MHglbHhcbiIsCisJCQkJKHVfbG9uZyljeV9wY2lfYWRkcjIsICh1X2xvbmcpY3lfcGNpX2FkZHIwKTsKICNlbmRpZgotICAgICAgICAgICAgICAgIGN5X3BjaV9uY2hhbiA9ICh1bnNpZ25lZCBzaG9ydCkoQ3lQT1JUU19QRVJfQ0hJUCAqIAotICAgICAgICAgICAgICAgICAgICAgICBjeXlfaW5pdF9jYXJkKGN5X3BjaV9hZGRyMiwgMSkpOwotICAgICAgICAgICAgICAgIGlmKGN5X3BjaV9uY2hhbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZIFBDSSBob3N0IGNhcmQgd2l0aCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygibm8gU2VyaWFsLU1vZHVsZXMgYXQgMHglbHguXG4iLAotCQkJICAgICh1bG9uZykgY3lfcGNpX3BoeXMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZigoY3lfbmV4dF9jaGFubmVsK2N5X3BjaV9uY2hhbikgPiBOUl9QT1JUUykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9QQ0kgZm91bmQgYXQgMHglbHggIiwKLQkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBubyBjaGFubmVscyBhcmUgYXZhaWxhYmxlLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkNoYW5nZSBOUl9QT1JUUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGZpbGwgdGhlIG5leHQgY3lfY2FyZCBzdHJ1Y3R1cmUgYXZhaWxhYmxlICovCi0gICAgICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBOUl9DQVJEUyA7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5X2NhcmRbal0uYmFzZV9hZGRyID09IDApICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gTlJfQ0FSRFMpIHsgICAgLyogbm8gbW9yZSBjeV9jYXJkcyBhdmFpbGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVkvUENJIGZvdW5kIGF0IDB4JWx4ICIsCi0JCQkgICAgKHVsb25nKSBjeV9wY2lfcGh5czIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZC5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfQ0FSRFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOwotICAgICAgICAgICAgICAgIH0KKwkJCWN5X3BjaV9uY2hhbiA9ICh1bnNpZ25lZCBzaG9ydCkoQ3lQT1JUU19QRVJfQ0hJUCAqCisJCQkJCWN5eV9pbml0X2NhcmQoY3lfcGNpX2FkZHIyLCAxKSk7CisJCQlpZiAoY3lfcGNpX25jaGFuID09IDApIHsKKwkJCQlwcmludGsoIkN5Y2xvbS1ZIFBDSSBob3N0IGNhcmQgd2l0aCAiKTsKKwkJCQlwcmludGsoIm5vIFNlcmlhbC1Nb2R1bGVzIGF0IDB4JWx4LlxuIiwKKwkJCQkJKHVsb25nKSBjeV9wY2lfcGh5czIpOworCQkJCWktLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgoY3lfbmV4dF9jaGFubmVsICsgY3lfcGNpX25jaGFuKSA+IE5SX1BPUlRTKSB7CisJCQkJcHJpbnRrKCJDeWNsb20tWS9QQ0kgZm91bmQgYXQgMHglbHggIiwKKwkJCQkJKHVsb25nKSBjeV9wY2lfcGh5czIpOworCQkJCXByaW50aygiYnV0IG5vIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUuXG4iKTsKKwkJCQlwcmludGsoIkNoYW5nZSBOUl9QT1JUUyBpbiBjeWNsYWRlcy5jIGFuZCAiCisJCQkJCQkicmVjb21waWxlIGtlcm5lbC5cbiIpOworCQkJCXJldHVybiBpOworCQkJfQorCQkJLyogZmlsbCB0aGUgbmV4dCBjeV9jYXJkIHN0cnVjdHVyZSBhdmFpbGFibGUgKi8KKwkJCWZvciAoaiA9IDA7IGogPCBOUl9DQVJEUzsgaisrKSB7CisJCQkJaWYgKGN5X2NhcmRbal0uYmFzZV9hZGRyID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGogPT0gTlJfQ0FSRFMpIHsJLyogbm8gbW9yZSBjeV9jYXJkcyBhdmFpbGFibGUgKi8KKwkJCQlwcmludGsoIkN5Y2xvbS1ZL1BDSSBmb3VuZCBhdCAweCVseCAiLAorCQkJCQkodWxvbmcpIGN5X3BjaV9waHlzMik7CisJCQkJcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZC5cbiIpOworCQkJCXByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kICIKKwkJCQkJCSJyZWNvbXBpbGUga2VybmVsLlxuIik7CisJCQkJcmV0dXJuIGk7CisJCQl9CiAKLSAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBJUlEgKi8KLSAgICAgICAgICAgICAgICBpZihyZXF1ZXN0X2lycShjeV9wY2lfaXJxLCBjeXlfaW50ZXJydXB0LAotCQkgICAgICAgIElSUUZfU0hBUkVELCAiQ3ljbG9tLVkiLCAmY3lfY2FyZFtqXSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsb20tWS9QQ0kgZm91bmQgYXQgMHglbHggIiwKLQkJCSAgICAodWxvbmcpIGN5X3BjaV9waHlzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAotCQkJICAgIGN5X3BjaV9pcnEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOwotICAgICAgICAgICAgICAgIH0KKwkJCS8qIGFsbG9jYXRlIElSUSAqLworCQkJaWYgKHJlcXVlc3RfaXJxKGN5X3BjaV9pcnEsIGN5eV9pbnRlcnJ1cHQsCisJCQkJCUlSUUZfU0hBUkVELCAiQ3ljbG9tLVkiLCAmY3lfY2FyZFtqXSkpIHsKKwkJCQlwcmludGsoIkN5Y2xvbS1ZL1BDSSBmb3VuZCBhdCAweCVseCAiLAorCQkJCQkodWxvbmcpIGN5X3BjaV9waHlzMik7CisJCQkJcHJpbnRrKCJidXQgY291bGQgbm90IGFsbG9jYXRlIElSUSVkLlxuIiwKKwkJCQkJY3lfcGNpX2lycSk7CisJCQkJcmV0dXJuIGk7CisJCQl9CiAKLSAgICAgICAgICAgICAgICAvKiBzZXQgY3lfY2FyZCAqLwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYmFzZV9waHlzID0gKHVsb25nKWN5X3BjaV9waHlzMjsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmN0bF9waHlzID0gKHVsb25nKWN5X3BjaV9waHlzMDsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJhc2VfYWRkciA9IGN5X3BjaV9hZGRyMjsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmN0bF9hZGRyID0gY3lfcGNpX2FkZHIwOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uaXJxID0gKGludCkgY3lfcGNpX2lycTsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJ1c19pbmRleCA9IDE7Ci0gICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0ubnVtX2NoaXBzID0gY3lfcGNpX25jaGFuLzQ7Ci0JCWN5X2NhcmRbal0ucGRldiA9IHBkZXY7Ci0JCi0gICAgICAgICAgICAgICAgLyogZW5hYmxlIGludGVycnVwdHMgaW4gdGhlIFBDSSBpbnRlcmZhY2UgKi8KLQkJcGx4X3ZlciA9IGN5X3JlYWRiKGN5X3BjaV9hZGRyMiArIEN5UExYX1ZFUikgJiAweDBmOwotCQlzd2l0Y2ggKHBseF92ZXIpIHsKLQkJICAgIGNhc2UgUExYXzkwNTA6CisJCQkvKiBzZXQgY3lfY2FyZCAqLworCQkJY3lfY2FyZFtqXS5iYXNlX3BoeXMgPSAodWxvbmcpIGN5X3BjaV9waHlzMjsKKwkJCWN5X2NhcmRbal0uY3RsX3BoeXMgPSAodWxvbmcpIGN5X3BjaV9waHlzMDsKKwkJCWN5X2NhcmRbal0uYmFzZV9hZGRyID0gY3lfcGNpX2FkZHIyOworCQkJY3lfY2FyZFtqXS5jdGxfYWRkciA9IGN5X3BjaV9hZGRyMDsKKwkJCWN5X2NhcmRbal0uaXJxID0gKGludCljeV9wY2lfaXJxOworCQkJY3lfY2FyZFtqXS5idXNfaW5kZXggPSAxOworCQkJY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOworCQkJY3lfY2FyZFtqXS5udW1fY2hpcHMgPSBjeV9wY2lfbmNoYW4gLyA0OworCQkJY3lfY2FyZFtqXS5wZGV2ID0gcGRldjsKIAotCQkgICAgY3lfd3JpdGViKGN5X3BjaV9hZGRyMCsweDRjLCAweDQzKTsKLQkJICAgIGJyZWFrOworCQkJLyogZW5hYmxlIGludGVycnVwdHMgaW4gdGhlIFBDSSBpbnRlcmZhY2UgKi8KKwkJCXBseF92ZXIgPSBjeV9yZWFkYihjeV9wY2lfYWRkcjIgKyBDeVBMWF9WRVIpICYgMHgwZjsKKwkJCXN3aXRjaCAocGx4X3ZlcikgeworCQkJY2FzZSBQTFhfOTA1MDoKIAotCQkgICAgY2FzZSBQTFhfOTA2MDoKLQkJICAgIGNhc2UgUExYXzkwODA6Ci0JCSAgICBkZWZhdWx0OiAvKiBPbGQgYm9hcmRzLCB1c2UgUExYXzkwNjAgKi8KKwkJCQljeV93cml0ZWIoY3lfcGNpX2FkZHIwICsgMHg0YywgMHg0Myk7CisJCQkJYnJlYWs7CiAKLQkJICAgIHBseF9pbml0KGN5X3BjaV9hZGRyMCwgMHg2Yyk7Ci0JCSAgICAvKiBGb3Igc29tZSB5ZXQgdW5rbm93biByZWFzb24sIG9uY2UgdGhlIFBMWDkwNjAgcmVsb2FkcwotCQkgICAgICAgdGhlIEVFUFJPTSwgdGhlIElSUSBpcyBsb3N0IGFuZCwgdGh1cywgd2UgaGF2ZSB0bwotCQkgICAgICAgcmUtd3JpdGUgaXQgdG8gdGhlIFBDSSBjb25maWcuIHJlZ2lzdGVycy4KLQkJICAgICAgIFRoaXMgd2lsbCByZW1haW4gaGVyZSB1bnRpbCB3ZSBmaW5kIGEgcGVybWFuZW50IGZpeC4gKi8KLQkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGN5X3BjaV9pcnEpOworCQkJY2FzZSBQTFhfOTA2MDoKKwkJCWNhc2UgUExYXzkwODA6CisJCQlkZWZhdWx0OgkvKiBPbGQgYm9hcmRzLCB1c2UgUExYXzkwNjAgKi8KIAotCQkgICAgY3lfd3JpdGV3KGN5X3BjaV9hZGRyMCsweDY4LCAKLQkJCWN5X3JlYWR3KGN5X3BjaV9hZGRyMCsweDY4KXwweDA5MDApOwotCQkgICAgYnJlYWs7Ci0JCX0KKwkJCQlwbHhfaW5pdChjeV9wY2lfYWRkcjAsIDB4NmMpOworCQkJLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMKKwkJCSAgIHRoZSBFRVBST00sIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8KKwkJCSAgIHJlLXdyaXRlIGl0IHRvIHRoZSBQQ0kgY29uZmlnLiByZWdpc3RlcnMuCisJCQkgICBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudAorCQkJICAgZml4LiAqLworCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsCisJCQkJCQljeV9wY2lfaXJxKTsKIAotICAgICAgICAgICAgICAgIC8qIHByaW50IG1lc3NhZ2UgKi8KLSAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS1ZL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKLQkJICAgICAgIGorMSwgCi0JCSAgICAgICAodWxvbmcpY3lfcGNpX3BoeXMyLCAKLQkJICAgICAgICh1bG9uZykoY3lfcGNpX3BoeXMyICsgQ3lQQ0lfWXdpbiAtIDEpLAotCQkgICAgICAgKGludCljeV9wY2lfaXJxKTsKLSAgICAgICAgICAgICAgICBwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCi0JCSAgICBjeV9wY2lfbmNoYW4sIGN5X25leHRfY2hhbm5lbCk7CisJCQkJY3lfd3JpdGV3KGN5X3BjaV9hZGRyMCArIDB4NjgsCisJCQkJCSAgY3lfcmVhZHcoY3lfcGNpX2FkZHIwICsKKwkJCQkJCSAgIDB4NjgpIHwgMHgwOTAwKTsKKwkJCQlicmVhazsKKwkJCX0KIAotICAgICAgICAgICAgICAgIGN5X25leHRfY2hhbm5lbCArPSBjeV9wY2lfbmNoYW47Ci0gICAgfWVsc2UgaWYgKGRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0NZQ0xPTV9aX0xvKXsKLQkgICAgLyogcHJpbnQgbWVzc2FnZSAqLwotCQlwcmludGsoIkN5Y2xhZGVzLVovUENJIChidXM9MHgwJXgsIHBjaV9pZD0weCV4LCAiLAotCQkgICAgcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKLQkJcHJpbnRrKCJyZXZfaWQ9JWQpIElSUSVkXG4iLAotCQkgICAgY3l5X3Jldl9pZCwgKGludCljeV9wY2lfaXJxKTsKLQkJcHJpbnRrKCJDeWNsYWRlcy1aL1BDSTogZm91bmQgd2luYWRkcj0weCVseCBjdGxhZGRyPTB4JWx4XG4iLAotCQkgICAgKHVsb25nKWN5X3BjaV9waHlzMiwgKHVsb25nKWN5X3BjaV9waHlzMCk7Ci0JICAgIHByaW50aygiQ3ljbGFkZXMtWi9QQ0kgbm90IHN1cHBvcnRlZCBmb3IgbG93IGFkZHJlc3Nlc1xuIik7Ci0JICAgIGJyZWFrOwotICAgIH1lbHNlIGlmIChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWl9IaSl7CisJCQkvKiBwcmludCBtZXNzYWdlICovCisJCQlwcmludGsoIkN5Y2xvbS1ZL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKKwkJCQlqICsgMSwgKHVsb25nKWN5X3BjaV9waHlzMiwKKwkJCQkodWxvbmcpIChjeV9wY2lfcGh5czIgKyBDeVBDSV9Zd2luIC0gMSksCisJCQkJKGludCljeV9wY2lfaXJxKTsKKwkJCXByaW50aygiJWQgY2hhbm5lbHMgc3RhcnRpbmcgZnJvbSBwb3J0ICVkLlxuIiwKKwkJCQljeV9wY2lfbmNoYW4sIGN5X25leHRfY2hhbm5lbCk7CisKKwkJCWN5X25leHRfY2hhbm5lbCArPSBjeV9wY2lfbmNoYW47CisJCX0gZWxzZSBpZiAoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfQ1lDTE9NX1pfTG8pIHsKKwkJCS8qIHByaW50IG1lc3NhZ2UgKi8KKwkJCXByaW50aygiQ3ljbGFkZXMtWi9QQ0kgKGJ1cz0weDAleCwgcGNpX2lkPTB4JXgsICIsCisJCQkJcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKKwkJCXByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwKKwkJCQljeXlfcmV2X2lkLCAoaW50KWN5X3BjaV9pcnEpOworCQkJcHJpbnRrKCJDeWNsYWRlcy1aL1BDSTogZm91bmQgd2luYWRkcj0weCVseCAiCisJCQkJImN0bGFkZHI9MHglbHhcbiIsCisJCQkJKHVsb25nKWN5X3BjaV9waHlzMiwgKHVsb25nKWN5X3BjaV9waHlzMCk7CisJCQlwcmludGsoIkN5Y2xhZGVzLVovUENJIG5vdCBzdXBwb3J0ZWQgZm9yIGxvdyAiCisJCQkJImFkZHJlc3Nlc1xuIik7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9DWUNMT01fWl9IaSkgewogI2lmZGVmIENZX1BDSV9ERUJVRwotICAgICAgICAgICAgcHJpbnRrKCJDeWNsYWRlcy1aL1BDSSAoYnVzPTB4MCV4LCBwY2lfaWQ9MHgleCwgIiwKLQkgICAgICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7Ci0gICAgICAgICAgICBwcmludGsoInJldl9pZD0lZCkgSVJRJWRcbiIsCi0JCWN5eV9yZXZfaWQsIChpbnQpY3lfcGNpX2lycSk7Ci0gICAgICAgICAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJOiBmb3VuZCB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCi0gICAgICAgICAgICAgICAgKHVsb25nKWN5X3BjaV9waHlzMiwgKHVsb25nKWN5X3BjaV9waHlzMCk7CisJCQlwcmludGsoIkN5Y2xhZGVzLVovUENJIChidXM9MHgwJXgsIHBjaV9pZD0weCV4LCAiLAorCQkJCXBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7CisJCQlwcmludGsoInJldl9pZD0lZCkgSVJRJWRcbiIsCisJCQkJY3l5X3Jldl9pZCwgKGludCljeV9wY2lfaXJxKTsKKwkJCXByaW50aygiQ3ljbGFkZXMtWi9QQ0k6IGZvdW5kIHdpbmFkZHI9MHglbHggIgorCQkJCSJjdGxhZGRyPTB4JWx4XG4iLAorCQkJCSh1bG9uZykgY3lfcGNpX3BoeXMyLCAodWxvbmcpIGN5X3BjaV9waHlzMCk7CiAjZW5kaWYKLQkJY3lfcGNpX2FkZHIwID0gaW9yZW1hcChjeV9wY2lfcGh5czAsIEN5UENJX1pjdGwpOworCQkJY3lfcGNpX2FkZHIwID0gaW9yZW1hcChjeV9wY2lfcGh5czAsIEN5UENJX1pjdGwpOwogCi0JCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgUExYIGJlZm9yZSByZXNldHRpbmcgaXQgKi8KLQkJY3lfd3JpdGV3KGN5X3BjaV9hZGRyMCsweDY4LAotCQkJY3lfcmVhZHcoY3lfcGNpX2FkZHIwKzB4NjgpICYgfjB4MDkwMCk7CisJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIFBMWCBiZWZvcmUgcmVzZXR0aW5nIGl0ICovCisJCQljeV93cml0ZXcoY3lfcGNpX2FkZHIwICsgMHg2OCwKKwkJCQljeV9yZWFkdyhjeV9wY2lfYWRkcjAgKyAweDY4KSAmIH4weDA5MDApOwogCi0JCXBseF9pbml0KGN5X3BjaV9hZGRyMCwgMHg2Yyk7Ci0JCS8qIEZvciBzb21lIHlldCB1bmtub3duIHJlYXNvbiwgb25jZSB0aGUgUExYOTA2MCByZWxvYWRzCi0JCSAgIHRoZSBFRVBST00sIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8KLQkJICAgcmUtd3JpdGUgaXQgdG8gdGhlIFBDSSBjb25maWcuIHJlZ2lzdGVycy4KLQkJICAgVGhpcyB3aWxsIHJlbWFpbiBoZXJlIHVudGlsIHdlIGZpbmQgYSBwZXJtYW5lbnQgZml4LiAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBjeV9wY2lfaXJxKTsKKwkJCXBseF9pbml0KGN5X3BjaV9hZGRyMCwgMHg2Yyk7CisJCQkvKiBGb3Igc29tZSB5ZXQgdW5rbm93biByZWFzb24sIG9uY2UgdGhlIFBMWDkwNjAgcmVsb2FkcworCQkJICAgdGhlIEVFUFJPTSwgdGhlIElSUSBpcyBsb3N0IGFuZCwgdGh1cywgd2UgaGF2ZSB0bworCQkJICAgcmUtd3JpdGUgaXQgdG8gdGhlIFBDSSBjb25maWcuIHJlZ2lzdGVycy4KKwkJCSAgIFRoaXMgd2lsbCByZW1haW4gaGVyZSB1bnRpbCB3ZSBmaW5kIGEgcGVybWFuZW50CisJCQkgICBmaXguICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLAorCQkJCQkJY3lfcGNpX2lycSk7CiAKLQkJbWFpbGJveCA9ICh1Y2xvbmcpY3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopIAotCQkJICAgY3lfcGNpX2FkZHIwKS0+bWFpbF9ib3hfMCk7CisJCQltYWlsYm94ID0KKwkJCSAgICAodWNsb25nKWN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKQorCQkJCQkJY3lfcGNpX2FkZHIwKS0+bWFpbF9ib3hfMCk7CiAKLQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAyKSAmIElPUkVTT1VSQ0VfSU8pIHsKLQkJICAgIHByaW50aygiICBXYXJuaW5nOiBQQ0kgSS9PIGJpdCBpbmNvcnJlY3RseSBzZXQuICIKLQkJCSAgICJJZ25vcmluZyBpdC4uLlxuIik7Ci0JCSAgICBwZGV2LT5yZXNvdXJjZVsyXS5mbGFncyAmPSB+SU9SRVNPVVJDRV9JTzsKLQkJfQorCQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAyKSAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJCQlwcmludGsoIiAgV2FybmluZzogUENJIEkvTyBiaXQgaW5jb3JyZWN0bHkgIgorCQkJCQkic2V0LiBJZ25vcmluZyBpdC4uLlxuIik7CisJCQkJcGRldi0+cmVzb3VyY2VbMl0uZmxhZ3MgJj0gfklPUkVTT1VSQ0VfSU87CisJCQl9CiAKLQkJLyogQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgSS9PIHJlZ2lvbiwgd2Ugc2hvdWxkCi0JCSAgIHJlcXVlc3QgaXQgZnJvbSB0aGUga2VybmVsIGFueXdheSwgdG8gYXZvaWQgcHJvYmxlbXMKLQkJICAgd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4gKi8KLQkJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIkN5Y2xhZGVzLVoiKSAhPSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImN5Y2xhZGVzOiBmYWlsZWQgdG8gcmVzZXJ2ZSBQQ0kgcmVzb3VyY2VzXG4iKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCi0JCWlmIChtYWlsYm94ID09IFpFX1YxKSB7Ci0JCSAgICBjeV9wY2lfYWRkcjIgPSBpb3JlbWFwKGN5X3BjaV9waHlzMiwgQ3lQQ0lfWmVfd2luKTsKLQkJICAgIGlmIChaZUluZGV4ID09IE5SX0NBUkRTKSB7Ci0JCQlwcmludGsoIkN5Y2xhZGVzLVplL1BDSSBmb3VuZCBhdCAweCVseCAiLAotCQkJCSh1bG9uZyljeV9wY2lfcGh5czIpOwotCQkJcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZC5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfQ0FSRFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOwotCQkgICAgfSBlbHNlIHsKLQkJCVplX3BoeXMwW1plSW5kZXhdID0gY3lfcGNpX3BoeXMwOwotCQkJWmVfcGh5czJbWmVJbmRleF0gPSBjeV9wY2lfcGh5czI7Ci0JCQlaZV9hZGRyMFtaZUluZGV4XSA9IGN5X3BjaV9hZGRyMDsKLQkJCVplX2FkZHIyW1plSW5kZXhdID0gY3lfcGNpX2FkZHIyOwotCQkJWmVfaXJxW1plSW5kZXhdID0gY3lfcGNpX2lycTsKLQkJCVplX3BkZXZbWmVJbmRleF0gPSBwZGV2OwotCQkJWmVJbmRleCsrOwotCQkgICAgfQotCQkgICAgaS0tOwotCQkgICAgY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCSAgICBjeV9wY2lfYWRkcjIgPSBpb3JlbWFwKGN5X3BjaV9waHlzMiwgQ3lQQ0lfWndpbik7Ci0JCX0KKwkJCS8qIEFsdGhvdWdoIHdlIGRvbid0IHVzZSB0aGlzIEkvTyByZWdpb24sIHdlIHNob3VsZAorCQkJICAgcmVxdWVzdCBpdCBmcm9tIHRoZSBrZXJuZWwgYW55d2F5LCB0byBhdm9pZCBwcm9ibGVtcworCQkJICAgd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4gKi8KKwkJCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJDeWNsYWRlcy1aIikgIT0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiY3ljbGFkZXM6IGZhaWxlZCB0byByZXNlcnZlICIKKwkJCQkJIlBDSSByZXNvdXJjZXNcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAobWFpbGJveCA9PSBaRV9WMSkgeworCQkJCWN5X3BjaV9hZGRyMiA9IGlvcmVtYXAoY3lfcGNpX3BoeXMyLAorCQkJCQkJQ3lQQ0lfWmVfd2luKTsKKwkJCQlpZiAoWmVJbmRleCA9PSBOUl9DQVJEUykgeworCQkJCQlwcmludGsoIkN5Y2xhZGVzLVplL1BDSSBmb3VuZCBhdCAiCisJCQkJCQkiMHglbHggYnV0IG5vIG1vcmUgY2FyZHMgY2FuICIKKwkJCQkJCSJiZSB1c2VkLlxuQ2hhbmdlIE5SX0NBUkRTIGluICIKKwkJCQkJCSJjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUgIgorCQkJCQkJImtlcm5lbC5cbiIsCisJCQkJCQkodWxvbmcpY3lfcGNpX3BoeXMyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlaZV9waHlzMFtaZUluZGV4XSA9IGN5X3BjaV9waHlzMDsKKwkJCQkJWmVfcGh5czJbWmVJbmRleF0gPSBjeV9wY2lfcGh5czI7CisJCQkJCVplX2FkZHIwW1plSW5kZXhdID0gY3lfcGNpX2FkZHIwOworCQkJCQlaZV9hZGRyMltaZUluZGV4XSA9IGN5X3BjaV9hZGRyMjsKKwkJCQkJWmVfaXJxW1plSW5kZXhdID0gY3lfcGNpX2lycTsKKwkJCQkJWmVfcGRldltaZUluZGV4XSA9IHBkZXY7CisJCQkJCVplSW5kZXgrKzsKKwkJCQl9CisJCQkJaS0tOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQljeV9wY2lfYWRkcjIgPSBpb3JlbWFwKGN5X3BjaV9waHlzMixDeVBDSV9ad2luKTsKKwkJCX0KIAogI2lmZGVmIENZX1BDSV9ERUJVRwotICAgICAgICAgICAgcHJpbnRrKCJDeWNsYWRlcy1aL1BDSTogcmVsb2NhdGUgd2luYWRkcj0weCVseCBjdGxhZGRyPTB4JWx4XG4iLAotICAgICAgICAgICAgICAgICh1bG9uZyljeV9wY2lfYWRkcjIsICh1bG9uZyljeV9wY2lfYWRkcjApOwotCSAgICBpZiAobWFpbGJveCA9PSBaT19WMSkgewotCQljeV93cml0ZWwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCAqKQotCQkJICAoY3lfcGNpX2FkZHIwKSktPmxvY19hZGRyX2Jhc2UsIFdJTl9DUkVHKTsKLQkJUEFVU0UKLQkJcHJpbnRrKCJDeWNsYWRlcy04Wm8vUENJOiBGUEdBIGlkICVseCwgdmVyICVseFxuIiwKLQkJICAgICAgICh1bG9uZykoMHhmZiAmIGN5X3JlYWRsKCYoKHN0cnVjdCBDVVNUT01fUkVHICopCi0JCSAgICAgICAgKGN5X3BjaV9hZGRyMikpLT5mcGdhX2lkKSksCi0JCSAgICAgICAodWxvbmcpKDB4ZmYgJiBjeV9yZWFkbCgmKChzdHJ1Y3QgQ1VTVE9NX1JFRyAqKQotCQkgICAgICAgIChjeV9wY2lfYWRkcjIpKS0+ZnBnYV92ZXJzaW9uKSkpOwotCQljeV93cml0ZWwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCAqKQotCQkJICAoY3lfcGNpX2FkZHIwKSktPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0pOwotCSAgICB9IGVsc2UgewotCQlwcmludGsoIkN5Y2xhZGVzLVovUENJOiBOZXcgQ3ljbGFkZXMtWiBib2FyZC4gIEZQR0Egbm90IGxvYWRlZFxuIik7Ci0JICAgIH0KKwkJCXByaW50aygiQ3ljbGFkZXMtWi9QQ0k6IHJlbG9jYXRlIHdpbmFkZHI9MHglbHggIgorCQkJCSJjdGxhZGRyPTB4JWx4XG4iLAorCQkJCSh1bG9uZykgY3lfcGNpX2FkZHIyLCAodWxvbmcpIGN5X3BjaV9hZGRyMCk7CisJCQlpZiAobWFpbGJveCA9PSBaT19WMSkgeworCQkJCWN5X3dyaXRlbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwICopCisJCQkJCShjeV9wY2lfYWRkcjApKS0+bG9jX2FkZHJfYmFzZSwKKwkJCQkJV0lOX0NSRUcpOworCQkJCVBBVVNFOworCQkJCXByaW50aygiQ3ljbGFkZXMtOFpvL1BDSTogRlBHQSBpZCAlbHgsIHZlciAiCisJCQkJCSIlbHhcbiIsICh1bG9uZykgKDB4ZmYgJgorCQkJCQljeV9yZWFkbCgmKChzdHJ1Y3QgQ1VTVE9NX1JFRyAqKQorCQkJCQkJKGN5X3BjaV9hZGRyMikpLT5mcGdhX2lkKSksCisJCQkJCSh1bG9uZykoMHhmZiAmCisJCQkJCWN5X3JlYWRsKCYoKHN0cnVjdCBDVVNUT01fUkVHICopCisJCQkJCQkoY3lfcGNpX2FkZHIyKSktPgorCQkJCQkJCWZwZ2FfdmVyc2lvbikpKTsKKwkJCQljeV93cml0ZWwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCAqKQorCQkJCQkoY3lfcGNpX2FkZHIwKSktPmxvY19hZGRyX2Jhc2UsCisJCQkJCVdJTl9SQU0pOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoIkN5Y2xhZGVzLVovUENJOiBOZXcgQ3ljbGFkZXMtWiBib2FyZC4gICIKKwkJCQkJCSJGUEdBIG5vdCBsb2FkZWRcbiIpOworCQkJfQogI2VuZGlmCi0JICAgIC8qIFRoZSBmb2xsb3dpbmcgY2xlYXJzIHRoZSBmaXJtd2FyZSBpZCB3b3JkLiAgVGhpcyBlbnN1cmVzCi0JICAgICAgIHRoYXQgdGhlIGRyaXZlciB3aWxsIG5vdCBhdHRlbXB0IHRvIHRhbGsgdG8gdGhlIGJvYXJkCi0JICAgICAgIHVudGlsIGl0IGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLgotCSAgICAgKi8KLQkJUEFVU0UKLQkJaWYgKChtYWlsYm94ID09IFpPX1YxKSB8fCAobWFpbGJveCA9PSBaT19WMikpCi0JCSAgICBjeV93cml0ZWwoY3lfcGNpX2FkZHIyICsgSURfQUREUkVTUywgMEwpOworCQkJLyogVGhlIGZvbGxvd2luZyBjbGVhcnMgdGhlIGZpcm13YXJlIGlkIHdvcmQuICBUaGlzCisJCQkgICBlbnN1cmVzIHRoYXQgdGhlIGRyaXZlciB3aWxsIG5vdCBhdHRlbXB0IHRvIHRhbGsgdG8KKwkJCSAgIHRoZSBib2FyZCB1bnRpbCBpdCBoYXMgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4KKwkJCSAqLworCQkJUEFVU0U7CisJCQlpZiAoKG1haWxib3ggPT0gWk9fVjEpIHx8IChtYWlsYm94ID09IFpPX1YyKSkKKwkJCQljeV93cml0ZWwoY3lfcGNpX2FkZHIyICsgSURfQUREUkVTUywgMEwpOwogCi0gICAgICAgICAgICAgICAgLyogVGhpcyBtdXN0IGJlIGEgQ3ljbGFkZXMtOFpvL1BDSS4gIFRoZSBleHRlbmRhYmxlCi0gICAgICAgICAgICAgICAgICAgdmVyc2lvbiB3aWxsIGhhdmUgYSBkaWZmZXJlbnQgZGV2aWNlX2lkIGFuZCB3aWxsCi0gICAgICAgICAgICAgICAgICAgYmUgYWxsb2NhdGVkIGl0cyBtYXhpbXVtIG51bWJlciBvZiBwb3J0cy4gKi8KLSAgICAgICAgICAgICAgICBjeV9wY2lfbmNoYW4gPSA4OworCQkJLyogVGhpcyBtdXN0IGJlIGEgQ3ljbGFkZXMtOFpvL1BDSS4gIFRoZSBleHRlbmRhYmxlCisJCQkgICB2ZXJzaW9uIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBkZXZpY2VfaWQgYW5kIHdpbGwKKwkJCSAgIGJlIGFsbG9jYXRlZCBpdHMgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMuICovCisJCQljeV9wY2lfbmNoYW4gPSA4OwogCi0gICAgICAgICAgICAgICAgaWYoKGN5X25leHRfY2hhbm5lbCtjeV9wY2lfbmNoYW4pID4gTlJfUE9SVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSBmb3VuZCBhdCAweCVseCAiLAotCQkJICAgICh1bG9uZyljeV9wY2lfcGh5czIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgbm8gY2hhbm5lbHMgYXJlIGF2YWlsYWJsZS5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfUE9SVFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGkpOwotICAgICAgICAgICAgICAgIH0KKwkJCWlmICgoY3lfbmV4dF9jaGFubmVsICsgY3lfcGNpX25jaGFuKSA+IE5SX1BPUlRTKSB7CisJCQkJcHJpbnRrKCJDeWNsYWRlcy04Wm8vUENJIGZvdW5kIGF0IDB4JWx4IGJ1dCIKKwkJCQkJIm5vIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUuXG5DaGFuZ2UgIgorCQkJCQkiTlJfUE9SVFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlICIKKwkJCQkJImtlcm5lbC5cbiIsICh1bG9uZyljeV9wY2lfcGh5czIpOworCQkJCXJldHVybiBpOworCQkJfQogCi0gICAgICAgICAgICAgICAgLyogZmlsbCB0aGUgbmV4dCBjeV9jYXJkIHN0cnVjdHVyZSBhdmFpbGFibGUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IE5SX0NBUkRTIDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3lfY2FyZFtqXS5iYXNlX2FkZHIgPT0gMCkgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaiA9PSBOUl9DQVJEUykgeyAgICAvKiBubyBtb3JlIGN5X2NhcmRzIGF2YWlsYWJsZSAqLwotCQkgICAgcHJpbnRrKCJDeWNsYWRlcy04Wm8vUENJIGZvdW5kIGF0IDB4JWx4ICIsCi0JCQkodWxvbmcpY3lfcGNpX3BoeXMyKTsKLQkJICAgIHByaW50aygiYnV0IG5vIG1vcmUgY2FyZHMgY2FuIGJlIHVzZWQuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfQ0FSRFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOwotCQkgICAgcmV0dXJuKGkpOwotICAgICAgICAgICAgICAgIH0KLQorCQkJLyogZmlsbCB0aGUgbmV4dCBjeV9jYXJkIHN0cnVjdHVyZSBhdmFpbGFibGUgKi8KKwkJCWZvciAoaiA9IDA7IGogPCBOUl9DQVJEUzsgaisrKSB7CisJCQkJaWYgKGN5X2NhcmRbal0uYmFzZV9hZGRyID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGogPT0gTlJfQ0FSRFMpIHsJLyogbm8gbW9yZSBjeV9jYXJkcyBhdmFpbGFibGUgKi8KKwkJCQlwcmludGsoIkN5Y2xhZGVzLThaby9QQ0kgZm91bmQgYXQgMHglbHggYnV0IgorCQkJCQkibm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZC5cbkNoYW5nZSAiCisJCQkJCSJOUl9DQVJEUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUgIgorCQkJCQkia2VybmVsLlxuIiwgKHVsb25nKWN5X3BjaV9waHlzMik7CisJCQkJcmV0dXJuIGk7CisJCQl9CiAjaWZkZWYgQ09ORklHX0NZWl9JTlRSCi0gICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgSVJRIG9ubHkgaWYgYm9hcmQgaGFzIGFuIElSUSAqLwotCQlpZiggKGN5X3BjaV9pcnEgIT0gMCkgJiYgKGN5X3BjaV9pcnEgIT0gMjU1KSApIHsKLQkJICAgIGlmKHJlcXVlc3RfaXJxKGN5X3BjaV9pcnEsIGN5el9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgIkN5Y2xhZGVzLVoiLCAmY3lfY2FyZFtqXSkpCi0JCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkN5Y2xvbS04Wm8vUENJIGZvdW5kIGF0IDB4JWx4ICIsCi0JCQkgICAgKHVsb25nKSBjeV9wY2lfcGh5czIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJidXQgY291bGQgbm90IGFsbG9jYXRlIElSUSVkLlxuIiwKLQkJCSAgICBjeV9wY2lfaXJxKTsKLQkJCXJldHVybihpKTsKLQkJICAgIH0KKwkJCS8qIGFsbG9jYXRlIElSUSBvbmx5IGlmIGJvYXJkIGhhcyBhbiBJUlEgKi8KKwkJCWlmICgoY3lfcGNpX2lycSAhPSAwKSAmJiAoY3lfcGNpX2lycSAhPSAyNTUpKSB7CisJCQkJaWYgKHJlcXVlc3RfaXJxKGN5X3BjaV9pcnEsIGN5el9pbnRlcnJ1cHQsCisJCQkJCQlJUlFGX1NIQVJFRCwgIkN5Y2xhZGVzLVoiLAorCQkJCQkJJmN5X2NhcmRbal0pKSB7CisJCQkJCXByaW50aygiQ3ljbG9tLThaby9QQ0kgZm91bmQgYXQgMHglbHggIgorCQkJCQkJImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkJCQkJIklSUSVkLlxuIiwgKHVsb25nKWN5X3BjaV9waHlzMiwKKwkJCQkJCWN5X3BjaV9pcnEpOworCQkJCQlyZXR1cm4gaTsKKwkJCQl9CisJCQl9CisjZW5kaWYJCQkJLyogQ09ORklHX0NZWl9JTlRSICovCisKKwkJCS8qIHNldCBjeV9jYXJkICovCisJCQljeV9jYXJkW2pdLmJhc2VfcGh5cyA9IGN5X3BjaV9waHlzMjsKKwkJCWN5X2NhcmRbal0uY3RsX3BoeXMgPSBjeV9wY2lfcGh5czA7CisJCQljeV9jYXJkW2pdLmJhc2VfYWRkciA9IGN5X3BjaV9hZGRyMjsKKwkJCWN5X2NhcmRbal0uY3RsX2FkZHIgPSBjeV9wY2lfYWRkcjA7CisJCQljeV9jYXJkW2pdLmlycSA9IChpbnQpY3lfcGNpX2lycTsKKwkJCWN5X2NhcmRbal0uYnVzX2luZGV4ID0gMTsKKwkJCWN5X2NhcmRbal0uZmlyc3RfbGluZSA9IGN5X25leHRfY2hhbm5lbDsKKwkJCWN5X2NhcmRbal0ubnVtX2NoaXBzID0gLTE7CisJCQljeV9jYXJkW2pdLnBkZXYgPSBwZGV2OworCisJCQkvKiBwcmludCBtZXNzYWdlICovCisjaWZkZWYgQ09ORklHX0NZWl9JTlRSCisJCQkvKiBkb24ndCByZXBvcnQgSVJRIGlmIGJvYXJkIGlzIG5vIElSUSAqLworCQkJaWYgKChjeV9wY2lfaXJxICE9IDApICYmIChjeV9wY2lfaXJxICE9IDI1NSkpCisJCQkJcHJpbnRrKCJDeWNsYWRlcy04Wm8vUENJICMlZDogMHglbHgtMHglbHgsICIKKwkJCQkJIklSUSVkLCAiLCBqICsgMSwgKHVsb25nKWN5X3BjaV9waHlzMiwKKwkJCQkJKHVsb25nKSAoY3lfcGNpX3BoeXMyICsgQ3lQQ0lfWndpbiAtIDEpLAorCQkJCQkoaW50KWN5X3BjaV9pcnEpOworCQkJZWxzZQorI2VuZGlmCQkJCS8qIENPTkZJR19DWVpfSU5UUiAqLworCQkJCXByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCAiLAorCQkJCQlqICsgMSwgKHVsb25nKWN5X3BjaV9waHlzMiwKKwkJCQkJKHVsb25nKShjeV9wY2lfcGh5czIgKyBDeVBDSV9ad2luIC0gMSkpOworCisJCQlwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCisJCQkJCWN5X3BjaV9uY2hhbiwgY3lfbmV4dF9jaGFubmVsKTsKKwkJCWN5X25leHRfY2hhbm5lbCArPSBjeV9wY2lfbmNoYW47CiAJCX0KLSNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KLQotCi0gICAgICAgICAgICAgICAgLyogc2V0IGN5X2NhcmQgKi8KLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJhc2VfcGh5cyA9IGN5X3BjaV9waHlzMjsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmN0bF9waHlzID0gY3lfcGNpX3BoeXMwOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYmFzZV9hZGRyID0gY3lfcGNpX2FkZHIyOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uY3RsX2FkZHIgPSBjeV9wY2lfYWRkcjA7Ci0gICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5pcnEgPSAoaW50KSBjeV9wY2lfaXJxOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uYnVzX2luZGV4ID0gMTsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmZpcnN0X2xpbmUgPSBjeV9uZXh0X2NoYW5uZWw7Ci0gICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5udW1fY2hpcHMgPSAtMTsKLQkJY3lfY2FyZFtqXS5wZGV2ID0gcGRldjsKLQotICAgICAgICAgICAgICAgIC8qIHByaW50IG1lc3NhZ2UgKi8KLSNpZmRlZiBDT05GSUdfQ1laX0lOVFIKLQkJLyogZG9uJ3QgcmVwb3J0IElSUSBpZiBib2FyZCBpcyBubyBJUlEgKi8KLQkJaWYoIChjeV9wY2lfaXJxICE9IDApICYmIChjeV9wY2lfaXJxICE9IDI1NSkgKQotCQkgICAgcHJpbnRrKCJDeWNsYWRlcy04Wm8vUENJICMlZDogMHglbHgtMHglbHgsIElSUSVkLCAiLAotCQkJaisxLCh1bG9uZyljeV9wY2lfcGh5czIsCi0JCQkodWxvbmcpKGN5X3BjaV9waHlzMiArIEN5UENJX1p3aW4gLSAxKSwKLQkJCShpbnQpY3lfcGNpX2lycSk7Ci0JCWVsc2UKLSNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KLQkJICAgIHByaW50aygiQ3ljbGFkZXMtOFpvL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCAiLAotCQkJaisxLCh1bG9uZyljeV9wY2lfcGh5czIsCi0JCQkodWxvbmcpKGN5X3BjaV9waHlzMiArIEN5UENJX1p3aW4gLSAxKSk7Ci0KLSAgICAgICAgICAgICAgICBwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCi0JCSAgICBjeV9wY2lfbmNoYW4sY3lfbmV4dF9jaGFubmVsKTsKLSAgICAgICAgICAgICAgICBjeV9uZXh0X2NoYW5uZWwgKz0gY3lfcGNpX25jaGFuOwotCSAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKDsgWmVJbmRleCAhPSAwICYmIGkgPCBOUl9DQVJEUzsgaSsrKSB7Ci0JICAgIGN5X3BjaV9waHlzMCA9IFplX3BoeXMwWzBdOwotCSAgICBjeV9wY2lfcGh5czIgPSBaZV9waHlzMlswXTsKLQkgICAgY3lfcGNpX2FkZHIwID0gWmVfYWRkcjBbMF07Ci0JICAgIGN5X3BjaV9hZGRyMiA9IFplX2FkZHIyWzBdOwotCSAgICBjeV9wY2lfaXJxID0gWmVfaXJxWzBdOwotCSAgICBwZGV2ID0gWmVfcGRldlswXTsKLQkgICAgZm9yIChqID0gMCA7IGogPCBaZUluZGV4LTEgOyBqKyspIHsKLQkJWmVfcGh5czBbal0gPSBaZV9waHlzMFtqKzFdOwotCQlaZV9waHlzMltqXSA9IFplX3BoeXMyW2orMV07Ci0JCVplX2FkZHIwW2pdID0gWmVfYWRkcjBbaisxXTsKLQkJWmVfYWRkcjJbal0gPSBaZV9hZGRyMltqKzFdOwotCQlaZV9pcnFbal0gPSBaZV9pcnFbaisxXTsKLQkJWmVfcGRldltqXSA9IFplX3BkZXZbaisxXTsKLQkgICAgfQotCSAgICBaZUluZGV4LS07Ci0JCW1haWxib3ggPSAodWNsb25nKWN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSAKLQkJCQkJICAgY3lfcGNpX2FkZHIwKS0+bWFpbF9ib3hfMCk7Ci0jaWZkZWYgQ1lfUENJX0RFQlVHCi0gICAgICAgICAgICBwcmludGsoIkN5Y2xhZGVzLVovUENJOiByZWxvY2F0ZSB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCi0gICAgICAgICAgICAgICAgKHVsb25nKWN5X3BjaV9hZGRyMiwgKHVsb25nKWN5X3BjaV9hZGRyMCk7Ci0JICAgIHByaW50aygiQ3ljbGFkZXMtWi9QQ0k6IE5ldyBDeWNsYWRlcy1aIGJvYXJkLiAgRlBHQSBub3QgbG9hZGVkXG4iKTsKLSNlbmRpZgotCQlQQVVTRQotICAgICAgICAgICAgICAgIC8qIFRoaXMgbXVzdCBiZSB0aGUgbmV3IEN5Y2xhZGVzLVplL1BDSS4gKi8KLSAgICAgICAgICAgICAgICBjeV9wY2lfbmNoYW4gPSBaRV9WMV9OUE9SVFM7Ci0KLSAgICAgICAgICAgICAgICBpZigoY3lfbmV4dF9jaGFubmVsK2N5X3BjaV9uY2hhbikgPiBOUl9QT1JUUykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJDeWNsYWRlcy1aZS9QQ0kgZm91bmQgYXQgMHglbHggIiwKLQkJCSAgICAodWxvbmcpY3lfcGNpX3BoeXMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiYnV0IG5vIGNoYW5uZWxzIGFyZSBhdmFpbGFibGUuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX1BPUlRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBmaWxsIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTlJfQ0FSRFMgOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeV9jYXJkW2pdLmJhc2VfYWRkciA9PSAwKSAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChqID09IE5SX0NBUkRTKSB7ICAgIC8qIG5vIG1vcmUgY3lfY2FyZHMgYXZhaWxhYmxlICovCi0JCSAgICBwcmludGsoIkN5Y2xhZGVzLVplL1BDSSBmb3VuZCBhdCAweCVseCAiLAotCQkJKHVsb25nKWN5X3BjaV9waHlzMik7Ci0JCSAgICBwcmludGsoImJ1dCBubyBtb3JlIGNhcmRzIGNhbiBiZSB1c2VkLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50aygiQ2hhbmdlIE5SX0NBUkRTIGluIGN5Y2xhZGVzLmMgYW5kIHJlY29tcGlsZSBrZXJuZWwuXG4iKTsKLQkJICAgIHJldHVybihpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBDT05GSUdfQ1laX0lOVFIKLSAgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBJUlEgb25seSBpZiBib2FyZCBoYXMgYW4gSVJRICovCi0JCWlmKCAoY3lfcGNpX2lycSAhPSAwKSAmJiAoY3lfcGNpX2lycSAhPSAyNTUpICkgewotCQkgICAgaWYocmVxdWVzdF9pcnEoY3lfcGNpX2lycSwgY3l6X2ludGVycnVwdCwKLQkJCUlSUUZfU0hBUkVELCAiQ3ljbGFkZXMtWiIsICZjeV9jYXJkW2pdKSkKLQkJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiQ3ljbG9tLVplL1BDSSBmb3VuZCBhdCAweCVseCAiLAotCQkJICAgICh1bG9uZykgY3lfcGNpX3BoeXMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlElZC5cbiIsCi0JCQkgICAgY3lfcGNpX2lycSk7Ci0JCQlyZXR1cm4oaSk7Ci0JCSAgICB9Ci0JCX0KLSNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KLQotICAgICAgICAgICAgICAgIC8qIHNldCBjeV9jYXJkICovCi0gICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5iYXNlX3BoeXMgPSBjeV9wY2lfcGh5czI7Ci0gICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5jdGxfcGh5cyA9IGN5X3BjaV9waHlzMDsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJhc2VfYWRkciA9IGN5X3BjaV9hZGRyMjsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmN0bF9hZGRyID0gY3lfcGNpX2FkZHIwOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0uaXJxID0gKGludCkgY3lfcGNpX2lycTsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2pdLmJ1c19pbmRleCA9IDE7Ci0gICAgICAgICAgICAgICAgY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbal0ubnVtX2NoaXBzID0gLTE7Ci0JCWN5X2NhcmRbal0ucGRldiA9IHBkZXY7Ci0KLSAgICAgICAgICAgICAgICAvKiBwcmludCBtZXNzYWdlICovCi0jaWZkZWYgQ09ORklHX0NZWl9JTlRSCi0JCS8qIGRvbid0IHJlcG9ydCBJUlEgaWYgYm9hcmQgaXMgbm8gSVJRICovCi0JCWlmKCAoY3lfcGNpX2lycSAhPSAwKSAmJiAoY3lfcGNpX2lycSAhPSAyNTUpICkKLQkJICAgIHByaW50aygiQ3ljbGFkZXMtWmUvUENJICMlZDogMHglbHgtMHglbHgsIElSUSVkLCAiLAotCQkJaisxLCh1bG9uZyljeV9wY2lfcGh5czIsCi0JCQkodWxvbmcpKGN5X3BjaV9waHlzMiArIEN5UENJX1plX3dpbiAtIDEpLAotCQkJKGludCljeV9wY2lfaXJxKTsKLQkJZWxzZQotI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLwotCQkgICAgcHJpbnRrKCJDeWNsYWRlcy1aZS9QQ0kgIyVkOiAweCVseC0weCVseCwgIiwKLQkJCWorMSwodWxvbmcpY3lfcGNpX3BoeXMyLAotCQkJKHVsb25nKShjeV9wY2lfcGh5czIgKyBDeVBDSV9aZV93aW4gLSAxKSk7Ci0KLSAgICAgICAgICAgICAgICBwcmludGsoIiVkIGNoYW5uZWxzIHN0YXJ0aW5nIGZyb20gcG9ydCAlZC5cbiIsCi0JCSAgICBjeV9wY2lfbmNoYW4sY3lfbmV4dF9jaGFubmVsKTsKLSAgICAgICAgICAgICAgICBjeV9uZXh0X2NoYW5uZWwgKz0gY3lfcGNpX25jaGFuOwotICAgICAgICB9Ci0JaWYgKFplSW5kZXggIT0gMCkgewotCSAgICBwcmludGsoIkN5Y2xhZGVzLVplL1BDSSBmb3VuZCBhdCAweCV4ICIsCi0JCSh1bnNpZ25lZCBpbnQpIFplX3BoeXMyWzBdKTsKLQkgICAgcHJpbnRrKCJidXQgbm8gbW9yZSBjYXJkcyBjYW4gYmUgdXNlZC5cbiIpOwotICAgICAgICAgICAgcHJpbnRrKCJDaGFuZ2UgTlJfQ0FSRFMgaW4gY3ljbGFkZXMuYyBhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIpOwogCX0KLSAgICAgICAgcmV0dXJuKGkpOwotI2Vsc2UKLSAgICAgICAgcmV0dXJuKDApOwotI2VuZGlmIC8qIGlmZGVmIENPTkZJR19QQ0kgKi8KLX0gLyogY3lfZGV0ZWN0X3BjaSAqLwogCisJZm9yICg7IFplSW5kZXggIT0gMCAmJiBpIDwgTlJfQ0FSRFM7IGkrKykgeworCQljeV9wY2lfcGh5czAgPSBaZV9waHlzMFswXTsKKwkJY3lfcGNpX3BoeXMyID0gWmVfcGh5czJbMF07CisJCWN5X3BjaV9hZGRyMCA9IFplX2FkZHIwWzBdOworCQljeV9wY2lfYWRkcjIgPSBaZV9hZGRyMlswXTsKKwkJY3lfcGNpX2lycSA9IFplX2lycVswXTsKKwkJcGRldiA9IFplX3BkZXZbMF07CisJCWZvciAoaiA9IDA7IGogPCBaZUluZGV4IC0gMTsgaisrKSB7CisJCQlaZV9waHlzMFtqXSA9IFplX3BoeXMwW2ogKyAxXTsKKwkJCVplX3BoeXMyW2pdID0gWmVfcGh5czJbaiArIDFdOworCQkJWmVfYWRkcjBbal0gPSBaZV9hZGRyMFtqICsgMV07CisJCQlaZV9hZGRyMltqXSA9IFplX2FkZHIyW2ogKyAxXTsKKwkJCVplX2lycVtqXSA9IFplX2lycVtqICsgMV07CisJCQlaZV9wZGV2W2pdID0gWmVfcGRldltqICsgMV07CisJCX0KKwkJWmVJbmRleC0tOworCQltYWlsYm94ID0gKHVjbG9uZyljeV9yZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikKKwkJCQkJCWN5X3BjaV9hZGRyMCktPm1haWxfYm94XzApOworI2lmZGVmIENZX1BDSV9ERUJVRworCQlwcmludGsoIkN5Y2xhZGVzLVovUENJOiByZWxvY2F0ZSB3aW5hZGRyPTB4JWx4IGN0bGFkZHI9MHglbHhcbiIsCisJCQkodWxvbmcpY3lfcGNpX2FkZHIyLCAodWxvbmcpY3lfcGNpX2FkZHIwKTsKKwkJcHJpbnRrKCJDeWNsYWRlcy1aL1BDSTogTmV3IEN5Y2xhZGVzLVogYm9hcmQuICBGUEdBIG5vdCAiCisJCQkJImxvYWRlZFxuIik7CisjZW5kaWYKKwkJUEFVU0U7CisJCS8qIFRoaXMgbXVzdCBiZSB0aGUgbmV3IEN5Y2xhZGVzLVplL1BDSS4gKi8KKwkJY3lfcGNpX25jaGFuID0gWkVfVjFfTlBPUlRTOworCisJCWlmICgoY3lfbmV4dF9jaGFubmVsICsgY3lfcGNpX25jaGFuKSA+IE5SX1BPUlRTKSB7CisJCQlwcmludGsoIkN5Y2xhZGVzLVplL1BDSSBmb3VuZCBhdCAweCVseCBidXQgbm8gY2hhbm5lbHMgIgorCQkJCSJhcmUgYXZhaWxhYmxlLlxuQ2hhbmdlIE5SX1BPUlRTIGluIGN5Y2xhZGVzLmMgIgorCQkJCSJhbmQgcmVjb21waWxlIGtlcm5lbC5cbiIsCisJCQkJKHVsb25nKSBjeV9wY2lfcGh5czIpOworCQkJcmV0dXJuIGk7CisJCX0KKworCQkvKiBmaWxsIHRoZSBuZXh0IGN5X2NhcmQgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworCQlmb3IgKGogPSAwOyBqIDwgTlJfQ0FSRFM7IGorKykgeworCQkJaWYgKGN5X2NhcmRbal0uYmFzZV9hZGRyID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogPT0gTlJfQ0FSRFMpIHsJLyogbm8gbW9yZSBjeV9jYXJkcyBhdmFpbGFibGUgKi8KKwkJCXByaW50aygiQ3ljbGFkZXMtWmUvUENJIGZvdW5kIGF0IDB4JWx4IGJ1dCBubyBtb3JlICIKKwkJCQkiY2FyZHMgY2FuIGJlIHVzZWQuXG5DaGFuZ2UgTlJfQ0FSRFMgaW4gIgorCQkJCSJjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUga2VybmVsLlxuIiwKKwkJCQkodWxvbmcpIGN5X3BjaV9waHlzMik7CisJCQlyZXR1cm4gaTsKKwkJfQorI2lmZGVmIENPTkZJR19DWVpfSU5UUgorCQkvKiBhbGxvY2F0ZSBJUlEgb25seSBpZiBib2FyZCBoYXMgYW4gSVJRICovCisJCWlmICgoY3lfcGNpX2lycSAhPSAwKSAmJiAoY3lfcGNpX2lycSAhPSAyNTUpKSB7CisJCQlpZiAocmVxdWVzdF9pcnEoY3lfcGNpX2lycSwgY3l6X2ludGVycnVwdCwKKwkJCQkJSVJRRl9TSEFSRUQsICJDeWNsYWRlcy1aIiwKKwkJCQkJJmN5X2NhcmRbal0pKSB7CisJCQkJcHJpbnRrKCJDeWNsb20tWmUvUENJIGZvdW5kIGF0IDB4JWx4ICIsCisJCQkJCSh1bG9uZykgY3lfcGNpX3BoeXMyKTsKKwkJCQlwcmludGsoImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgSVJRJWQuXG4iLAorCQkJCQljeV9wY2lfaXJxKTsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorI2VuZGlmCQkJCS8qIENPTkZJR19DWVpfSU5UUiAqLworCisJCS8qIHNldCBjeV9jYXJkICovCisJCWN5X2NhcmRbal0uYmFzZV9waHlzID0gY3lfcGNpX3BoeXMyOworCQljeV9jYXJkW2pdLmN0bF9waHlzID0gY3lfcGNpX3BoeXMwOworCQljeV9jYXJkW2pdLmJhc2VfYWRkciA9IGN5X3BjaV9hZGRyMjsKKwkJY3lfY2FyZFtqXS5jdGxfYWRkciA9IGN5X3BjaV9hZGRyMDsKKwkJY3lfY2FyZFtqXS5pcnEgPSAoaW50KWN5X3BjaV9pcnE7CisJCWN5X2NhcmRbal0uYnVzX2luZGV4ID0gMTsKKwkJY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOworCQljeV9jYXJkW2pdLm51bV9jaGlwcyA9IC0xOworCQljeV9jYXJkW2pdLnBkZXYgPSBwZGV2OworCisJCS8qIHByaW50IG1lc3NhZ2UgKi8KKyNpZmRlZiBDT05GSUdfQ1laX0lOVFIKKwkJLyogZG9uJ3QgcmVwb3J0IElSUSBpZiBib2FyZCBpcyBubyBJUlEgKi8KKwkJaWYgKChjeV9wY2lfaXJxICE9IDApICYmIChjeV9wY2lfaXJxICE9IDI1NSkpCisJCQlwcmludGsoIkN5Y2xhZGVzLVplL1BDSSAjJWQ6IDB4JWx4LTB4JWx4LCBJUlElZCwgIiwKKwkJCQlqICsgMSwgKHVsb25nKSBjeV9wY2lfcGh5czIsCisJCQkJKHVsb25nKSAoY3lfcGNpX3BoeXMyICsgQ3lQQ0lfWmVfd2luIC0gMSksCisJCQkJKGludCljeV9wY2lfaXJxKTsKKwkJZWxzZQorI2VuZGlmCQkJCS8qIENPTkZJR19DWVpfSU5UUiAqLworCQkJcHJpbnRrKCJDeWNsYWRlcy1aZS9QQ0kgIyVkOiAweCVseC0weCVseCwgIiwKKwkJCQlqICsgMSwgKHVsb25nKSBjeV9wY2lfcGh5czIsCisJCQkJKHVsb25nKSAoY3lfcGNpX3BoeXMyICsgQ3lQQ0lfWmVfd2luIC0gMSkpOworCisJCXByaW50aygiJWQgY2hhbm5lbHMgc3RhcnRpbmcgZnJvbSBwb3J0ICVkLlxuIiwKKwkJCWN5X3BjaV9uY2hhbiwgY3lfbmV4dF9jaGFubmVsKTsKKwkJY3lfbmV4dF9jaGFubmVsICs9IGN5X3BjaV9uY2hhbjsKKwl9CisJaWYgKFplSW5kZXggIT0gMCkgeworCQlwcmludGsoIkN5Y2xhZGVzLVplL1BDSSBmb3VuZCBhdCAweCV4IGJ1dCBubyBtb3JlIGNhcmRzIGNhbiBiZSAiCisJCQkidXNlZC5cbkNoYW5nZSBOUl9DQVJEUyBpbiBjeWNsYWRlcy5jIGFuZCByZWNvbXBpbGUgIgorCQkJImtlcm5lbC5cbiIsICh1bnNpZ25lZCBpbnQpWmVfcGh5czJbMF0pOworCX0KKwlyZXR1cm4gaTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYJCQkJLyogaWZkZWYgQ09ORklHX1BDSSAqLworfQkJCQkvKiBjeV9kZXRlY3RfcGNpICovCiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgcHJpbnRzIG91dCB0aGUgYXBwcm9wcmlhdGUgc2VyaWFsIGRyaXZlciB2ZXJzaW9uIG51bWJlcgogICogYW5kIGlkZW50aWZpZXMgd2hpY2ggb3B0aW9ucyB3ZXJlIGNvbmZpZ3VyZWQgaW50byB0aGlzIGRyaXZlci4KICAqLwotc3RhdGljIGlubGluZSB2b2lkCi1zaG93X3ZlcnNpb24odm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3ZlcnNpb24odm9pZCkKIHsKLSAgY2hhciAqcmNzdmVycywgKnJjc2RhdGUsICp0bXA7Ci0gICAgcmNzdmVycyA9IHN0cmNocihyY3NpZCwgJyAnKTsgcmNzdmVycysrOwotICAgIHRtcCA9IHN0cmNocihyY3N2ZXJzLCAnICcpOyAqdG1wKysgPSAnXDAnOwotICAgIHJjc2RhdGUgPSBzdHJjaHIodG1wLCAnICcpOyByY3NkYXRlKys7Ci0gICAgdG1wID0gc3RycmNocihyY3NkYXRlLCAnICcpOyAqdG1wID0gJ1wwJzsKLSAgICBwcmludGsoIkN5Y2xhZGVzIGRyaXZlciAlcyAlc1xuIiwKLSAgICAgICAgcmNzdmVycywgcmNzZGF0ZSk7Ci0gICAgcHJpbnRrKCIgICAgICAgIGJ1aWx0ICVzICVzXG4iLAotCV9fREFURV9fLCBfX1RJTUVfXyk7Ci19IC8qIHNob3dfdmVyc2lvbiAqLworCXByaW50aygiQ3ljbGFkZXMgZHJpdmVyICIgQ1lfVkVSU0lPTiAiXG4iKTsKKwlwcmludGsoIiAgICAgICAgYnVpbHQgJXMgJXNcbiIsIF9fREFURV9fLCBfX1RJTUVfXyk7Cit9CQkJCS8qIHNob3dfdmVyc2lvbiAqLwogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogY3ljbGFkZXNfZ2V0X3Byb2NfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAotCQkgICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCisJCWludCAqZW9mLCB2b2lkICpkYXRhKQogewotICAgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICAqaW5mbzsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGVuPTA7Ci0gICAgb2ZmX3QgYmVnaW49MDsKLSAgICBvZmZfdCBwb3M9MDsKLSAgICBpbnQgc2l6ZTsKLSAgICBfX3UzMiBjdXJfamlmcyA9IGppZmZpZXM7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisJaW50IGk7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgYmVnaW4gPSAwOworCW9mZl90IHBvcyA9IDA7CisJaW50IHNpemU7CisJX191MzIgY3VyX2ppZnMgPSBqaWZmaWVzOwogCi0gICAgc2l6ZSA9IHNwcmludGYoYnVmLCAiRGV2IFRpbWVPcGVuICAgQnl0ZXNPdXQgIElkbGVPdXQgICAgQnl0ZXNJbiAgIElkbGVJbiAgT3ZlcnJ1bnMgIExkaXNjXG4iKTsKKwlzaXplID0gc3ByaW50ZihidWYsICJEZXYgVGltZU9wZW4gICBCeXRlc091dCAgSWRsZU91dCAgICBCeXRlc0luICAgIgorCQkJIklkbGVJbiAgT3ZlcnJ1bnMgIExkaXNjXG4iKTsKIAotICAgIHBvcyArPSBzaXplOwotICAgIGxlbiArPSBzaXplOwotCi0gICAgLyogT3V0cHV0IG9uZSBsaW5lIGZvciBlYWNoIGtub3duIHBvcnQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFMgJiYgY3lfcG9ydFtpXS5saW5lID49IDA7IGkrKykgewotCWluZm8gPSAmY3lfcG9ydFtpXTsKLQotCWlmIChpbmZvLT5jb3VudCkKLQkgICAgc2l6ZSA9IHNwcmludGYoYnVmK2xlbiwKLQkJCSIlM2QgJThsdSAlMTBsdSAlOGx1ICUxMGx1ICU4bHUgJTlsdSAlNmxkXG4iLAotCQkJaW5mby0+bGluZSwKLQkJCUpJRkZJRVNfRElGRihpbmZvLT5pZGxlX3N0YXRzLmluX3VzZSwgY3VyX2ppZnMpIC8gSFosCi0JCQlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfYnl0ZXMsCi0JCQlKSUZGSUVTX0RJRkYoaW5mby0+aWRsZV9zdGF0cy54bWl0X2lkbGUsIGN1cl9qaWZzKSAvIEhaLAotCQkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2J5dGVzLAotCQkJSklGRklFU19ESUZGKGluZm8tPmlkbGVfc3RhdHMucmVjdl9pZGxlLCBjdXJfamlmcykgLyBIWiwKLQkJCWluZm8tPmlkbGVfc3RhdHMub3ZlcnJ1bnMsCi0JCQkobG9uZykgaW5mby0+dHR5LT5sZGlzYy5udW0pOwotCWVsc2UKLQkgICAgc2l6ZSA9IHNwcmludGYoYnVmK2xlbiwKLQkJCSIlM2QgJThsdSAlMTBsdSAlOGx1ICUxMGx1ICU4bHUgJTlsdSAlNmxkXG4iLAotCQkJaW5mby0+bGluZSwgMEwsIDBMLCAwTCwgMEwsIDBMLCAwTCwgMEwpOworCXBvcyArPSBzaXplOwogCWxlbiArPSBzaXplOwotCXBvcyA9IGJlZ2luICsgbGVuOwogCi0JaWYgKHBvcyA8IG9mZnNldCkgewotCSAgICBsZW4gICA9IDA7Ci0JICAgIGJlZ2luID0gcG9zOworCS8qIE91dHB1dCBvbmUgbGluZSBmb3IgZWFjaCBrbm93biBwb3J0ICovCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTICYmIGN5X3BvcnRbaV0ubGluZSA+PSAwOyBpKyspIHsKKwkJaW5mbyA9ICZjeV9wb3J0W2ldOworCisJCWlmIChpbmZvLT5jb3VudCkKKwkJCXNpemUgPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiUzZCAlOGx1ICUxMGx1ICU4bHUgJTEwbHUgIgorCQkJCSIlOGx1ICU5bHUgJTZsZFxuIiwgaW5mby0+bGluZSwKKwkJCQkoY3VyX2ppZnMgLSBpbmZvLT5pZGxlX3N0YXRzLmluX3VzZSkgLyBIWiwKKwkJCQlpbmZvLT5pZGxlX3N0YXRzLnhtaXRfYnl0ZXMsCisJCQkJKGN1cl9qaWZzIC0gaW5mby0+aWRsZV9zdGF0cy54bWl0X2lkbGUpIC8gSFosCisJCQkJaW5mby0+aWRsZV9zdGF0cy5yZWN2X2J5dGVzLAorCQkJCShjdXJfamlmcyAtIGluZm8tPmlkbGVfc3RhdHMucmVjdl9pZGxlKSAvIEhaLAorCQkJCWluZm8tPmlkbGVfc3RhdHMub3ZlcnJ1bnMsCisJCQkJKGxvbmcpaW5mby0+dHR5LT5sZGlzYy5udW0pOworCQllbHNlCisJCQlzaXplID0gc3ByaW50ZihidWYgKyBsZW4sICIlM2QgJThsdSAlMTBsdSAlOGx1ICUxMGx1ICIKKwkJCQkiJThsdSAlOWx1ICU2bGRcbiIsCisJCQkJaW5mby0+bGluZSwgMEwsIDBMLCAwTCwgMEwsIDBMLCAwTCwgMEwpOworCQlsZW4gKz0gc2l6ZTsKKwkJcG9zID0gYmVnaW4gKyBsZW47CisKKwkJaWYgKHBvcyA8IG9mZnNldCkgeworCQkJbGVuID0gMDsKKwkJCWJlZ2luID0gcG9zOworCQl9CisJCWlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCisJCQlnb3RvIGRvbmU7CiAJfQotCWlmIChwb3MgPiBvZmZzZXQgKyBsZW5ndGgpCi0JICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgKmVvZiA9IDE7CisJKmVvZiA9IDE7CiBkb25lOgotICAgICpzdGFydCA9IGJ1ZiArIChvZmZzZXQgLSBiZWdpbik7CS8qIFN0YXJ0IG9mIHdhbnRlZCBkYXRhICovCi0gICAgbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CQkvKiBTdGFydCBzbG9wICovCi0gICAgaWYgKGxlbiA+IGxlbmd0aCkKLQlsZW4gPSBsZW5ndGg7CQkJLyogRW5kaW5nIHNsb3AgKi8KLSAgICBpZiAobGVuIDwgMCkKLQlsZW4gPSAwOwotICAgIHJldHVybiBsZW47CisJKnN0YXJ0ID0gYnVmICsgKG9mZnNldCAtIGJlZ2luKTsJLyogU3RhcnQgb2Ygd2FudGVkIGRhdGEgKi8KKwlsZW4gLT0gKG9mZnNldCAtIGJlZ2luKTsJLyogU3RhcnQgc2xvcCAqLworCWlmIChsZW4gPiBsZW5ndGgpCisJCWxlbiA9IGxlbmd0aDsJLyogRW5kaW5nIHNsb3AgKi8KKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKwlyZXR1cm4gbGVuOwogfQogCiAvKiBUaGUgc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKQEAgLTUxODQsMjkwICs1Mjk0LDI4OCBAQAogICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgY3lfb3BzID0gewotICAgIC5vcGVuID0gY3lfb3BlbiwKLSAgICAuY2xvc2UgPSBjeV9jbG9zZSwKLSAgICAud3JpdGUgPSBjeV93cml0ZSwKLSAgICAucHV0X2NoYXIgPSBjeV9wdXRfY2hhciwKLSAgICAuZmx1c2hfY2hhcnMgPSBjeV9mbHVzaF9jaGFycywKLSAgICAud3JpdGVfcm9vbSA9IGN5X3dyaXRlX3Jvb20sCi0gICAgLmNoYXJzX2luX2J1ZmZlciA9IGN5X2NoYXJzX2luX2J1ZmZlciwKLSAgICAuZmx1c2hfYnVmZmVyID0gY3lfZmx1c2hfYnVmZmVyLAotICAgIC5pb2N0bCA9IGN5X2lvY3RsLAotICAgIC50aHJvdHRsZSA9IGN5X3Rocm90dGxlLAotICAgIC51bnRocm90dGxlID0gY3lfdW50aHJvdHRsZSwKLSAgICAuc2V0X3Rlcm1pb3MgPSBjeV9zZXRfdGVybWlvcywKLSAgICAuc3RvcCA9IGN5X3N0b3AsCi0gICAgLnN0YXJ0ID0gY3lfc3RhcnQsCi0gICAgLmhhbmd1cCA9IGN5X2hhbmd1cCwKLSAgICAuYnJlYWtfY3RsID0gY3lfYnJlYWssCi0gICAgLndhaXRfdW50aWxfc2VudCA9IGN5X3dhaXRfdW50aWxfc2VudCwKLSAgICAucmVhZF9wcm9jID0gY3ljbGFkZXNfZ2V0X3Byb2NfaW5mbywKLSAgICAudGlvY21nZXQgPSBjeV90aW9jbWdldCwKLSAgICAudGlvY21zZXQgPSBjeV90aW9jbXNldCwKKwkub3BlbiA9IGN5X29wZW4sCisJLmNsb3NlID0gY3lfY2xvc2UsCisJLndyaXRlID0gY3lfd3JpdGUsCisJLnB1dF9jaGFyID0gY3lfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gY3lfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBjeV93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBjeV9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IGN5X2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBjeV9pb2N0bCwKKwkudGhyb3R0bGUgPSBjeV90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IGN5X3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gY3lfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBjeV9zdG9wLAorCS5zdGFydCA9IGN5X3N0YXJ0LAorCS5oYW5ndXAgPSBjeV9oYW5ndXAsCisJLmJyZWFrX2N0bCA9IGN5X2JyZWFrLAorCS53YWl0X3VudGlsX3NlbnQgPSBjeV93YWl0X3VudGlsX3NlbnQsCisJLnJlYWRfcHJvYyA9IGN5Y2xhZGVzX2dldF9wcm9jX2luZm8sCisJLnRpb2NtZ2V0ID0gY3lfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gY3lfdGlvY21zZXQsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdAotY3lfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY3lfaW5pdCh2b2lkKQogewotICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAgKmluZm87Ci0gIHN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbzsKLSAgaW50IG51bWJlcl96X2JvYXJkcyA9IDA7Ci0gIGludCBib2FyZCxwb3J0LGksaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgbWFpbGJveDsKLSAgdW5zaWduZWQgc2hvcnQgY2hpcF9udW1iZXI7Ci0gIGludCBucG9ydHM7CisJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87CisJc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOworCWludCBudW1iZXJfel9ib2FyZHMgPSAwOworCWludCBib2FyZCwgcG9ydCwgaSwgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBtYWlsYm94OworCXVuc2lnbmVkIHNob3J0IGNoaXBfbnVtYmVyOworCWludCBucG9ydHM7CiAKLSAgICBjeV9zZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihOUl9QT1JUUyk7Ci0gICAgaWYgKCFjeV9zZXJpYWxfZHJpdmVyKQotCXJldHVybiAtRU5PTUVNOwotICAgIHNob3dfdmVyc2lvbigpOworCWN5X3NlcmlhbF9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE5SX1BPUlRTKTsKKwlpZiAoIWN5X3NlcmlhbF9kcml2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCXNob3dfdmVyc2lvbigpOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KLSAgICAKLSAgICBjeV9zZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOwotICAgIGN5X3NlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gImN5Y2xhZGVzIjsKLSAgICBjeV9zZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eUMiOwotICAgIGN5X3NlcmlhbF9kcml2ZXItPm1ham9yID0gQ1lDTEFERVNfTUFKT1I7Ci0gICAgY3lfc2VyaWFsX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOwotICAgIGN5X3NlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotICAgIGN5X3NlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0gICAgY3lfc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwotICAgIGN5X3NlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KLSAgICAgICAgICAgIEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKLSAgICBjeV9zZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7Ci0gICAgdHR5X3NldF9vcGVyYXRpb25zKGN5X3NlcmlhbF9kcml2ZXIsICZjeV9vcHMpOworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCiAKLSAgICBpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKSkKLSAgICAgICAgICAgIHBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBDeWNsYWRlcyBzZXJpYWwgZHJpdmVyXG4iKTsKKwljeV9zZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCWN5X3NlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gImN5Y2xhZGVzIjsKKwljeV9zZXJpYWxfZHJpdmVyLT5uYW1lID0gInR0eUMiOworCWN5X3NlcmlhbF9kcml2ZXItPm1ham9yID0gQ1lDTEFERVNfTUFKT1I7CisJY3lfc2VyaWFsX2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCWN5X3NlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWN5X3NlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJY3lfc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCWN5X3NlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkgICAgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCWN5X3NlcmlhbF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwl0dHlfc2V0X29wZXJhdGlvbnMoY3lfc2VyaWFsX2RyaXZlciwgJmN5X29wcyk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlJfQ0FSRFM7IGkrKykgewotICAgICAgICAgICAgLyogYmFzZV9hZGRyPTAgaW5kaWNhdGVzIGJvYXJkIG5vdCBmb3VuZCAqLwotICAgICAgICAgICAgY3lfY2FyZFtpXS5iYXNlX2FkZHIgPSBOVUxMOwotICAgIH0KKwlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKSkKKwkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIEN5Y2xhZGVzIHNlcmlhbCBkcml2ZXJcbiIpOwogCi0gICAgLyogdGhlIGNvZGUgYmVsb3cgaXMgcmVzcG9uc2libGUgdG8gZmluZCB0aGUgYm9hcmRzLiBFYWNoIGRpZmZlcmVudAotICAgICAgIHR5cGUgb2YgYm9hcmQgaGFzIGl0cyBvd24gZGV0ZWN0aW9uIHJvdXRpbmUuIElmIGEgYm9hcmQgaXMgZm91bmQsCi0gICAgICAgdGhlIG5leHQgY3lfY2FyZCBzdHJ1Y3R1cmUgYXZhaWxhYmxlIGlzIHNldCBieSB0aGUgZGV0ZWN0aW9uCi0gICAgICAgcm91dGluZS4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgdGhlCi0gICAgICAgYXZhaWxhYmlsaXR5IG9mIGN5X2NhcmQgYW5kIGN5X3BvcnQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB1cGRhdGluZwotICAgICAgIHRoZSBjeV9uZXh0X2NoYW5uZWwuICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NBUkRTOyBpKyspIHsKKwkJLyogYmFzZV9hZGRyPTAgaW5kaWNhdGVzIGJvYXJkIG5vdCBmb3VuZCAqLworCQljeV9jYXJkW2ldLmJhc2VfYWRkciA9IE5VTEw7CisJfQogCi0gICAgLyogbG9vayBmb3IgaXNhIGJvYXJkcyAqLwotICAgIGN5X2lzYV9uYm9hcmQgPSBjeV9kZXRlY3RfaXNhKCk7CisJLyogdGhlIGNvZGUgYmVsb3cgaXMgcmVzcG9uc2libGUgdG8gZmluZCB0aGUgYm9hcmRzLiBFYWNoIGRpZmZlcmVudAorCSAgIHR5cGUgb2YgYm9hcmQgaGFzIGl0cyBvd24gZGV0ZWN0aW9uIHJvdXRpbmUuIElmIGEgYm9hcmQgaXMgZm91bmQsCisJICAgdGhlIG5leHQgY3lfY2FyZCBzdHJ1Y3R1cmUgYXZhaWxhYmxlIGlzIHNldCBieSB0aGUgZGV0ZWN0aW9uCisJICAgcm91dGluZS4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgdGhlCisJICAgYXZhaWxhYmlsaXR5IG9mIGN5X2NhcmQgYW5kIGN5X3BvcnQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB1cGRhdGluZworCSAgIHRoZSBjeV9uZXh0X2NoYW5uZWwuICovCiAKLSAgICAvKiBsb29rIGZvciBwY2kgYm9hcmRzICovCi0gICAgY3lfcGNpX25ib2FyZCA9IGN5X2RldGVjdF9wY2koKTsKKwkvKiBsb29rIGZvciBpc2EgYm9hcmRzICovCisJY3lfaXNhX25ib2FyZCA9IGN5X2RldGVjdF9pc2EoKTsKIAotICAgIGN5X25ib2FyZCA9IGN5X2lzYV9uYm9hcmQgKyBjeV9wY2lfbmJvYXJkOworCS8qIGxvb2sgZm9yIHBjaSBib2FyZHMgKi8KKwljeV9wY2lfbmJvYXJkID0gY3lfZGV0ZWN0X3BjaSgpOwogCi0gICAgLyogaW52YWxpZGF0ZSByZW1haW5pbmcgY3lfY2FyZCBzdHJ1Y3R1cmVzICovCi0gICAgZm9yIChpID0gMCA7IGkgPCBOUl9DQVJEUyA7IGkrKykgewotICAgICAgICBpZiAoY3lfY2FyZFtpXS5iYXNlX2FkZHIgPT0gMCkgewotICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uZmlyc3RfbGluZSA9IC0xOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uY3RsX2FkZHIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGN5X2NhcmRbaV0uaXJxID0gMDsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2ldLmJ1c19pbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgY3lfY2FyZFtpXS5maXJzdF9saW5lID0gMDsKLSAgICAgICAgICAgICAgICBjeV9jYXJkW2ldLm51bV9jaGlwcyA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogaW52YWxpZGF0ZSByZW1haW5pbmcgY3lfcG9ydCBzdHJ1Y3R1cmVzICovCi0gICAgZm9yIChpID0gY3lfbmV4dF9jaGFubmVsIDsgaSA8IE5SX1BPUlRTIDsgaSsrKSB7Ci0gICAgICAgIGN5X3BvcnRbaV0ubGluZSA9IC0xOwotICAgICAgICBjeV9wb3J0W2ldLm1hZ2ljID0gLTE7Ci0gICAgfQorCWN5X25ib2FyZCA9IGN5X2lzYV9uYm9hcmQgKyBjeV9wY2lfbmJvYXJkOwogCi0gICAgLyogaW5pdGlhbGl6ZSBwZXItcG9ydCBkYXRhIHN0cnVjdHVyZXMgZm9yIGVhY2ggdmFsaWQgYm9hcmQgZm91bmQgKi8KLSAgICBmb3IgKGJvYXJkID0gMCA7IGJvYXJkIDwgY3lfbmJvYXJkIDsgYm9hcmQrKykgewotICAgICAgICAgICAgY2luZm8gPSAmY3lfY2FyZFtib2FyZF07Ci0gICAgICAgICAgICBpZiAoY2luZm8tPm51bV9jaGlwcyA9PSAtMSkgeyAvKiBDeWNsYWRlcy1aICovCi0JCW51bWJlcl96X2JvYXJkcysrOwotCQltYWlsYm94ID0gY3lfcmVhZGwoJigoc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICopCi0JCQkgICAgIGN5X2NhcmRbYm9hcmRdLmN0bF9hZGRyKS0+bWFpbF9ib3hfMCk7Ci0JCW5wb3J0cyA9IChtYWlsYm94ID09IFpFX1YxKSA/IFpFX1YxX05QT1JUUyA6IDg7Ci0JCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAwOwotCQljaW5mby0+bnBvcnRzID0gMDsgLyogV2lsbCBiZSBjb3JyZWN0bHkgc2V0IGxhdGVyLCBhZnRlciAKLQkJCQkgICAgICBaIEZXIGlzIGxvYWRlZCAqLwotCQlzcGluX2xvY2tfaW5pdCgmY2luZm8tPmNhcmRfbG9jayk7Ci0gICAgICAgICAgICAgICAgZm9yIChwb3J0ID0gY2luZm8tPmZpcnN0X2xpbmUgOwotICAgICAgICAgICAgICAgICAgICAgcG9ydCA8IGNpbmZvLT5maXJzdF9saW5lICsgbnBvcnRzOwotICAgICAgICAgICAgICAgICAgICAgcG9ydCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9ICZjeV9wb3J0W3BvcnRdOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5tYWdpYyA9IENZQ0xBREVTX01BR0lDOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT50eXBlID0gUE9SVF9TVEFSVEVDSDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Y2FyZCA9IGJvYXJkOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5saW5lID0gcG9ydDsKLQkJICAgIGluZm8tPmNoaXBfcmV2ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT50dHkgPSBOVUxMOwotCQkgICAgaWYgKG1haWxib3ggPT0gWk9fVjEpCi0JCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IENZWl9GSUZPX1NJWkU7Ci0JCSAgICBlbHNlCi0JCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDQgKiBDWVpfRklGT19TSVpFOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yMiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmNvcjMgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3I0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yNSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnRicHIgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT50Y28gPSAwOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5yYnByID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+cmNvID0gMDsKLQkJICAgIGluZm8tPmN1c3RvbV9kaXZpc29yID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOwotCQkgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gQ0xPU0lOR19XQUlUX0RFTEFZOwotCQkgICAgaW5mby0+aWNvdW50LmN0cyA9IGluZm8tPmljb3VudC5kc3IgPSAKLQkJCWluZm8tPmljb3VudC5ybmcgPSBpbmZvLT5pY291bnQuZGNkID0gMDsKLQkJICAgIGluZm8tPmljb3VudC5yeCA9IGluZm8tPmljb3VudC50eCA9IDA7Ci0JCSAgICBpbmZvLT5pY291bnQuZnJhbWUgPSBpbmZvLT5pY291bnQucGFyaXR5ID0gMDsKLQkJICAgIGluZm8tPmljb3VudC5vdmVycnVuID0gaW5mby0+aWNvdW50LmJyayA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnhfY2hhciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmV2ZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Y291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5ibG9ja2VkX29wZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmRlZmF1bHRfdGltZW91dCA9IDA7Ci0JCSAgICBJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCwgaW5mbyk7Ci0JCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOwotCQkgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7Ci0JCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKLQkJICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+c2Vzc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT5wZ3JwICovCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSAwOwotICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT50aW1lb3V0ICovCi0JCSAgICAvKiBCZW50c29uJ3MgdmFycyAqLwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5qaWZmaWVzWzBdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+amlmZmllc1sxXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmppZmZpZXNbMl0gPSAwOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZmx1c2hfY291bnQgPSAwOworCS8qIGludmFsaWRhdGUgcmVtYWluaW5nIGN5X2NhcmQgc3RydWN0dXJlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9DQVJEUzsgaSsrKSB7CisJCWlmIChjeV9jYXJkW2ldLmJhc2VfYWRkciA9PSAwKSB7CisJCQljeV9jYXJkW2ldLmZpcnN0X2xpbmUgPSAtMTsKKwkJCWN5X2NhcmRbaV0uY3RsX2FkZHIgPSBOVUxMOworCQkJY3lfY2FyZFtpXS5pcnEgPSAwOworCQkJY3lfY2FyZFtpXS5idXNfaW5kZXggPSAwOworCQkJY3lfY2FyZFtpXS5maXJzdF9saW5lID0gMDsKKwkJCWN5X2NhcmRbaV0ubnVtX2NoaXBzID0gMDsKKwkJfQorCX0KKwkvKiBpbnZhbGlkYXRlIHJlbWFpbmluZyBjeV9wb3J0IHN0cnVjdHVyZXMgKi8KKwlmb3IgKGkgPSBjeV9uZXh0X2NoYW5uZWw7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCWN5X3BvcnRbaV0ubGluZSA9IC0xOworCQljeV9wb3J0W2ldLm1hZ2ljID0gLTE7CisJfQorCisJLyogaW5pdGlhbGl6ZSBwZXItcG9ydCBkYXRhIHN0cnVjdHVyZXMgZm9yIGVhY2ggdmFsaWQgYm9hcmQgZm91bmQgKi8KKwlmb3IgKGJvYXJkID0gMDsgYm9hcmQgPCBjeV9uYm9hcmQ7IGJvYXJkKyspIHsKKwkJY2luZm8gPSAmY3lfY2FyZFtib2FyZF07CisJCWlmIChjaW5mby0+bnVtX2NoaXBzID09IC0xKSB7CS8qIEN5Y2xhZGVzLVogKi8KKwkJCW51bWJlcl96X2JvYXJkcysrOworCQkJbWFpbGJveCA9IGN5X3JlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKQorCQkJCQkgICAgIGN5X2NhcmRbYm9hcmRdLmN0bF9hZGRyKS0+CisJCQkJCSAgIG1haWxfYm94XzApOworCQkJbnBvcnRzID0gKG1haWxib3ggPT0gWkVfVjEpID8gWkVfVjFfTlBPUlRTIDogODsKKwkJCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAwOworCQkJY2luZm8tPm5wb3J0cyA9IDA7CS8qIFdpbGwgYmUgY29ycmVjdGx5IHNldCBsYXRlciwgYWZ0ZXIgCisJCQkJCQkgICBaIEZXIGlzIGxvYWRlZCAqLworCQkJc3Bpbl9sb2NrX2luaXQoJmNpbmZvLT5jYXJkX2xvY2spOworCQkJZm9yIChwb3J0ID0gY2luZm8tPmZpcnN0X2xpbmU7CisJCQkgICAgIHBvcnQgPCBjaW5mby0+Zmlyc3RfbGluZSArIG5wb3J0czsgcG9ydCsrKSB7CisJCQkJaW5mbyA9ICZjeV9wb3J0W3BvcnRdOworCQkJCWluZm8tPm1hZ2ljID0gQ1lDTEFERVNfTUFHSUM7CisJCQkJaW5mby0+dHlwZSA9IFBPUlRfU1RBUlRFQ0g7CisJCQkJaW5mby0+Y2FyZCA9IGJvYXJkOworCQkJCWluZm8tPmxpbmUgPSBwb3J0OworCQkJCWluZm8tPmNoaXBfcmV2ID0gMDsKKwkJCQlpbmZvLT5mbGFncyA9IFNURF9DT01fRkxBR1M7CisJCQkJaW5mby0+dHR5ID0gTlVMTDsKKwkJCQlpZiAobWFpbGJveCA9PSBaT19WMSkKKwkJCQkJaW5mby0+eG1pdF9maWZvX3NpemUgPSBDWVpfRklGT19TSVpFOworCQkJCWVsc2UKKwkJCQkJaW5mby0+eG1pdF9maWZvX3NpemUgPQorCQkJCQkgICAgNCAqIENZWl9GSUZPX1NJWkU7CisJCQkJaW5mby0+Y29yMSA9IDA7CisJCQkJaW5mby0+Y29yMiA9IDA7CisJCQkJaW5mby0+Y29yMyA9IDA7CisJCQkJaW5mby0+Y29yNCA9IDA7CisJCQkJaW5mby0+Y29yNSA9IDA7CisJCQkJaW5mby0+dGJwciA9IDA7CisJCQkJaW5mby0+dGNvID0gMDsKKwkJCQlpbmZvLT5yYnByID0gMDsKKwkJCQlpbmZvLT5yY28gPSAwOworCQkJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gMDsKKwkJCQlpbmZvLT5jbG9zZV9kZWxheSA9IDUgKiBIWiAvIDEwOworCQkJCWluZm8tPmNsb3Npbmdfd2FpdCA9IENMT1NJTkdfV0FJVF9ERUxBWTsKKwkJCQlpbmZvLT5pY291bnQuY3RzID0gaW5mby0+aWNvdW50LmRzciA9CisJCQkJICAgIGluZm8tPmljb3VudC5ybmcgPSBpbmZvLT5pY291bnQuZGNkID0gMDsKKwkJCQlpbmZvLT5pY291bnQucnggPSBpbmZvLT5pY291bnQudHggPSAwOworCQkJCWluZm8tPmljb3VudC5mcmFtZSA9IGluZm8tPmljb3VudC5wYXJpdHkgPSAwOworCQkJCWluZm8tPmljb3VudC5vdmVycnVuID0gaW5mby0+aWNvdW50LmJyayA9IDA7CisJCQkJaW5mby0+eF9jaGFyID0gMDsKKwkJCQlpbmZvLT5ldmVudCA9IDA7CisJCQkJaW5mby0+Y291bnQgPSAwOworCQkJCWluZm8tPmJsb2NrZWRfb3BlbiA9IDA7CisJCQkJaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQgPSAwOworCQkJCWluZm8tPmRlZmF1bHRfdGltZW91dCA9IDA7CisJCQkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWUsIGRvX3NvZnRpbnQpOworCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CisJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+c2h1dGRvd25fd2FpdCk7CisJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCQkJCS8qIGluZm8tPnNlc3Npb24gKi8KKwkJCQkvKiBpbmZvLT5wZ3JwICovCisJCQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayA9IDA7CisJCQkJLyogaW5mby0+dGltZW91dCAqLworCQkJCS8qIEJlbnRzb24ncyB2YXJzICovCisJCQkJaW5mby0+amlmZmllc1swXSA9IDA7CisJCQkJaW5mby0+amlmZmllc1sxXSA9IDA7CisJCQkJaW5mby0+amlmZmllc1syXSA9IDA7CisJCQkJaW5mby0+cmZsdXNoX2NvdW50ID0gMDsKICNpZmRlZiBDT05GSUdfQ1laX0lOVFIKLQkJICAgIGluaXRfdGltZXIoJmN5el9yeF9mdWxsX3RpbWVyW3BvcnRdKTsKLQkJICAgIGN5el9yeF9mdWxsX3RpbWVyW3BvcnRdLmZ1bmN0aW9uID0gTlVMTDsKKwkJCQlpbml0X3RpbWVyKCZjeXpfcnhfZnVsbF90aW1lcltwb3J0XSk7CisJCQkJY3l6X3J4X2Z1bGxfdGltZXJbcG9ydF0uZnVuY3Rpb24gPSBOVUxMOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfWVsc2V7IC8qIEN5Y2xvbS1ZIG9mIHNvbWUga2luZCovCi0gICAgICAgICAgICAgICAgaW5kZXggPSBjaW5mby0+YnVzX2luZGV4OwotCQlzcGluX2xvY2tfaW5pdCgmY2luZm8tPmNhcmRfbG9jayk7Ci0JCWNpbmZvLT5ucG9ydHMgPSBDeVBPUlRTX1BFUl9DSElQICogY2luZm8tPm51bV9jaGlwczsKLSAgICAgICAgICAgICAgICBmb3IgKHBvcnQgPSBjaW5mby0+Zmlyc3RfbGluZSA7Ci0gICAgICAgICAgICAgICAgICAgICBwb3J0IDwgY2luZm8tPmZpcnN0X2xpbmUgKyBjaW5mby0+bnBvcnRzIDsKLSAgICAgICAgICAgICAgICAgICAgIHBvcnQrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSAmY3lfcG9ydFtwb3J0XTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bWFnaWMgPSBDWUNMQURFU19NQUdJQzsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+dHlwZSA9IFBPUlRfQ0lSUlVTOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5jYXJkID0gYm9hcmQ7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmxpbmUgPSBwb3J0OwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IFNURF9DT01fRkxBR1M7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnR0eSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnhtaXRfZmlmb19zaXplID0gQ3lNQVhfQ0hBUl9GSUZPOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IxID0gQ3lQQVJJVFlfTk9ORXxDeV8xX1NUT1B8Q3lfOF9CSVRTOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3IyID0gQ3lFVEM7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmNvcjMgPSAweDA4OyAvKiBfdmVyeV8gc21hbGwgcmN2IHRocmVzaG9sZCAqLwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5jb3I0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Y29yNSA9IDA7Ci0JCSAgICBpbmZvLT5jdXN0b21fZGl2aXNvciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKLQkJICAgIGluZm8tPmNsb3Npbmdfd2FpdCA9IENMT1NJTkdfV0FJVF9ERUxBWTsKLQkJICAgIGluZm8tPmljb3VudC5jdHMgPSBpbmZvLT5pY291bnQuZHNyID0gCi0JCQlpbmZvLT5pY291bnQucm5nID0gaW5mby0+aWNvdW50LmRjZCA9IDA7Ci0JCSAgICBpbmZvLT5pY291bnQucnggPSBpbmZvLT5pY291bnQudHggPSAwOwotCQkgICAgaW5mby0+aWNvdW50LmZyYW1lID0gaW5mby0+aWNvdW50LnBhcml0eSA9IDA7Ci0JCSAgICBpbmZvLT5pY291bnQub3ZlcnJ1biA9IGluZm8tPmljb3VudC5icmsgPSAwOwotCQkgICAgY2hpcF9udW1iZXIgPSAocG9ydCAtIGNpbmZvLT5maXJzdF9saW5lKSAvIDQ7Ci0JCSAgICBpZiAoKGluZm8tPmNoaXBfcmV2ID0KLQkJCSBjeV9yZWFkYihjaW5mby0+YmFzZV9hZGRyICsKLQkJCQkgIChjeV9jaGlwX29mZnNldFtjaGlwX251bWJlcl08PGluZGV4KSArCi0JCQkJICAoQ3lHRlJDUjw8aW5kZXgpKSkgPj0gQ0QxNDAwX1JFVl9KKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBpcyBhIENEMTQwMCByZXYuIEogb3IgbGF0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRicHIgPSBiYXVkX2Jwcl82MFsxM107IC8qIFR4IEJQUiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+dGNvID0gYmF1ZF9jb182MFsxM107IC8qIFR4IENPICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yYnByID0gYmF1ZF9icHJfNjBbMTNdOyAvKiBSeCBCUFIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJjbyA9IGJhdWRfY29fNjBbMTNdOyAvKiBSeCBDTyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cmZsb3cgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cnRzZHRyX2ludiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT50YnByID0gYmF1ZF9icHJfMjVbMTNdOyAvKiBUeCBCUFIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnRjbyA9IGJhdWRfY29fMjVbMTNdOyAvKiBUeCBDTyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+cmJwciA9IGJhdWRfYnByXzI1WzEzXTsgLyogUnggQlBSICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yY28gPSBiYXVkX2NvXzI1WzEzXTsgLyogUnggQ08gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJmbG93ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnJ0c2R0cl9pbnYgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnhfY2hhciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmV2ZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Y291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5ibG9ja2VkX29wZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmRlZmF1bHRfdGltZW91dCA9IDA7Ci0JCSAgICBJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCwgaW5mbyk7Ci0JCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOwotCQkgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7Ci0JCSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKLQkJICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+c2Vzc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBpbmZvLT5wZ3JwICovCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRfc3RhdHVzX21hc2sgPQotCQkgICAgICAgICAgICAgICAgICBDeVRJTUVPVVR8IEN5U1BFQ0hBUnwgQ3lCUkVBSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ3lQQVJJVFl8IEN5RlJBTUV8IEN5T1ZFUlJVTjsKLSAgICAgICAgICAgICAgICAgICAgLyogaW5mby0+dGltZW91dCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICB9CisJCQl9CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsJLyogQ3ljbG9tLVkgb2Ygc29tZSBraW5kICovCisJCQlpbmRleCA9IGNpbmZvLT5idXNfaW5kZXg7CisJCQlzcGluX2xvY2tfaW5pdCgmY2luZm8tPmNhcmRfbG9jayk7CisJCQljaW5mby0+bnBvcnRzID0gQ3lQT1JUU19QRVJfQ0hJUCAqIGNpbmZvLT5udW1fY2hpcHM7CisJCQlmb3IgKHBvcnQgPSBjaW5mby0+Zmlyc3RfbGluZTsKKwkJCSAgICAgcG9ydCA8IGNpbmZvLT5maXJzdF9saW5lICsgY2luZm8tPm5wb3J0czsgcG9ydCsrKSB7CisJCQkJaW5mbyA9ICZjeV9wb3J0W3BvcnRdOworCQkJCWluZm8tPm1hZ2ljID0gQ1lDTEFERVNfTUFHSUM7CisJCQkJaW5mby0+dHlwZSA9IFBPUlRfQ0lSUlVTOworCQkJCWluZm8tPmNhcmQgPSBib2FyZDsKKwkJCQlpbmZvLT5saW5lID0gcG9ydDsKKwkJCQlpbmZvLT5mbGFncyA9IFNURF9DT01fRkxBR1M7CisJCQkJaW5mby0+dHR5ID0gTlVMTDsKKwkJCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IEN5TUFYX0NIQVJfRklGTzsKKwkJCQlpbmZvLT5jb3IxID0KKwkJCQkgICAgQ3lQQVJJVFlfTk9ORSB8IEN5XzFfU1RPUCB8IEN5XzhfQklUUzsKKwkJCQlpbmZvLT5jb3IyID0gQ3lFVEM7CisJCQkJaW5mby0+Y29yMyA9IDB4MDg7CS8qIF92ZXJ5XyBzbWFsbCByY3YgdGhyZXNob2xkICovCisJCQkJaW5mby0+Y29yNCA9IDA7CisJCQkJaW5mby0+Y29yNSA9IDA7CisJCQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSAwOworCQkJCWluZm8tPmNsb3NlX2RlbGF5ID0gNSAqIEhaIC8gMTA7CisJCQkJaW5mby0+Y2xvc2luZ193YWl0ID0gQ0xPU0lOR19XQUlUX0RFTEFZOworCQkJCWluZm8tPmljb3VudC5jdHMgPSBpbmZvLT5pY291bnQuZHNyID0KKwkJCQkgICAgaW5mby0+aWNvdW50LnJuZyA9IGluZm8tPmljb3VudC5kY2QgPSAwOworCQkJCWluZm8tPmljb3VudC5yeCA9IGluZm8tPmljb3VudC50eCA9IDA7CisJCQkJaW5mby0+aWNvdW50LmZyYW1lID0gaW5mby0+aWNvdW50LnBhcml0eSA9IDA7CisJCQkJaW5mby0+aWNvdW50Lm92ZXJydW4gPSBpbmZvLT5pY291bnQuYnJrID0gMDsKKwkJCQljaGlwX251bWJlciA9IChwb3J0IC0gY2luZm8tPmZpcnN0X2xpbmUpIC8gNDsKKwkJCQlpZiAoKGluZm8tPmNoaXBfcmV2ID0KKwkJCQkgICAgIGN5X3JlYWRiKGNpbmZvLT5iYXNlX2FkZHIgKworCQkJCQkgICAgICAoY3lfY2hpcF9vZmZzZXRbY2hpcF9udW1iZXJdIDw8CisJCQkJCSAgICAgICBpbmRleCkgKyAoQ3lHRlJDUiA8PCBpbmRleCkpKSA+PQorCQkJCSAgICBDRDE0MDBfUkVWX0opIHsKKwkJCQkJLyogSXQgaXMgYSBDRDE0MDAgcmV2LiBKIG9yIGxhdGVyICovCisJCQkJCWluZm8tPnRicHIgPSBiYXVkX2Jwcl82MFsxM107CS8qIFR4IEJQUiAqLworCQkJCQlpbmZvLT50Y28gPSBiYXVkX2NvXzYwWzEzXTsJLyogVHggQ08gKi8KKwkJCQkJaW5mby0+cmJwciA9IGJhdWRfYnByXzYwWzEzXTsJLyogUnggQlBSICovCisJCQkJCWluZm8tPnJjbyA9IGJhdWRfY29fNjBbMTNdOwkvKiBSeCBDTyAqLworCQkJCQlpbmZvLT5yZmxvdyA9IDA7CisJCQkJCWluZm8tPnJ0c2R0cl9pbnYgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWluZm8tPnRicHIgPSBiYXVkX2Jwcl8yNVsxM107CS8qIFR4IEJQUiAqLworCQkJCQlpbmZvLT50Y28gPSBiYXVkX2NvXzI1WzEzXTsJLyogVHggQ08gKi8KKwkJCQkJaW5mby0+cmJwciA9IGJhdWRfYnByXzI1WzEzXTsJLyogUnggQlBSICovCisJCQkJCWluZm8tPnJjbyA9IGJhdWRfY29fMjVbMTNdOwkvKiBSeCBDTyAqLworCQkJCQlpbmZvLT5yZmxvdyA9IDA7CisJCQkJCWluZm8tPnJ0c2R0cl9pbnYgPSAwOworCQkJCX0KKwkJCQlpbmZvLT54X2NoYXIgPSAwOworCQkJCWluZm8tPmV2ZW50ID0gMDsKKwkJCQlpbmZvLT5jb3VudCA9IDA7CisJCQkJaW5mby0+YmxvY2tlZF9vcGVuID0gMDsKKwkJCQlpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7CisJCQkJaW5mby0+ZGVmYXVsdF90aW1lb3V0ID0gMDsKKwkJCQlJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCk7CisJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKKwkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKKwkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5zaHV0ZG93bl93YWl0KTsKKwkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCQkJLyogaW5mby0+c2Vzc2lvbiAqLworCQkJCS8qIGluZm8tPnBncnAgKi8KKwkJCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0KKwkJCQkgICAgQ3lUSU1FT1VUIHwgQ3lTUEVDSEFSIHwgQ3lCUkVBSworCQkJCSAgICB8IEN5UEFSSVRZIHwgQ3lGUkFNRSB8IEN5T1ZFUlJVTjsKKwkJCQkvKiBpbmZvLT50aW1lb3V0ICovCisJCQl9CisJCX0KKwl9CiAKICNpZm5kZWYgQ09ORklHX0NZWl9JTlRSCi0gICAgaWYgKG51bWJlcl96X2JvYXJkcyAmJiAhY3l6X3RpbWVyb24pewotCWN5el90aW1lcm9uKys7Ci0JY3l6X3RpbWVybGlzdC5leHBpcmVzID0gamlmZmllcyArIDE7Ci0JYWRkX3RpbWVyKCZjeXpfdGltZXJsaXN0KTsKKwlpZiAobnVtYmVyX3pfYm9hcmRzICYmICFjeXpfdGltZXJvbikgeworCQljeXpfdGltZXJvbisrOworCQljeXpfdGltZXJsaXN0LmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwkJYWRkX3RpbWVyKCZjeXpfdGltZXJsaXN0KTsKICNpZmRlZiBDWV9QQ0lfREVCVUcKLQlwcmludGsoIkN5Y2xhZGVzLVogcG9sbGluZyBpbml0aWFsaXplZFxuIik7CisJCXByaW50aygiQ3ljbGFkZXMtWiBwb2xsaW5nIGluaXRpYWxpemVkXG4iKTsKICNlbmRpZgotICAgIH0KLSNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KKwl9CisjZW5kaWYJCQkJLyogQ09ORklHX0NZWl9JTlRSICovCiAKLSAgICByZXR1cm4gMDsKLSAgICAKLX0gLyogY3lfaW5pdCAqLworCXJldHVybiAwOwogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWN5X2NsZWFudXBfbW9kdWxlKHZvaWQpCit9CQkJCS8qIGN5X2luaXQgKi8KKworc3RhdGljIHZvaWQgX19leGl0IGN5X2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7Ci0gICAgaW50IGksIGUxOworCWludCBpLCBlMTsKIAogI2lmbmRlZiBDT05GSUdfQ1laX0lOVFIKLSAgICBpZiAoY3l6X3RpbWVyb24pewotCWN5el90aW1lcm9uID0gMDsKLQlkZWxfdGltZXIoJmN5el90aW1lcmxpc3QpOwotICAgIH0KKwlpZiAoY3l6X3RpbWVyb24peworCQljeXpfdGltZXJvbiA9IDA7CisJCWRlbF90aW1lcigmY3l6X3RpbWVybGlzdCk7CisJfQogI2VuZGlmIC8qIENPTkZJR19DWVpfSU5UUiAqLwogCi0gICAgaWYgKChlMSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihjeV9zZXJpYWxfZHJpdmVyKSkpCi0gICAgICAgICAgICBwcmludGsoImN5YzogZmFpbGVkIHRvIHVucmVnaXN0ZXIgQ3ljbGFkZXMgc2VyaWFsIGRyaXZlciglZClcbiIsCi0JCWUxKTsKKwlpZiAoKGUxID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGN5X3NlcmlhbF9kcml2ZXIpKSkKKwkJcHJpbnRrKCJjeWM6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIEN5Y2xhZGVzIHNlcmlhbCBkcml2ZXIoJWQpXG4iLAorCQkJZTEpOwogCi0gICAgcHV0X3R0eV9kcml2ZXIoY3lfc2VyaWFsX2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIoY3lfc2VyaWFsX2RyaXZlcik7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlJfQ0FSRFM7IGkrKykgewotICAgICAgICBpZiAoY3lfY2FyZFtpXS5iYXNlX2FkZHIpIHsKLQkgICAgaW91bm1hcChjeV9jYXJkW2ldLmJhc2VfYWRkcik7Ci0JICAgIGlmIChjeV9jYXJkW2ldLmN0bF9hZGRyKQotCQlpb3VubWFwKGN5X2NhcmRbaV0uY3RsX2FkZHIpOwotCSAgICBpZiAoY3lfY2FyZFtpXS5pcnEKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ0FSRFM7IGkrKykgeworCQlpZiAoY3lfY2FyZFtpXS5iYXNlX2FkZHIpIHsKKwkJCWlvdW5tYXAoY3lfY2FyZFtpXS5iYXNlX2FkZHIpOworCQkJaWYgKGN5X2NhcmRbaV0uY3RsX2FkZHIpCisJCQkJaW91bm1hcChjeV9jYXJkW2ldLmN0bF9hZGRyKTsKKwkJCWlmIChjeV9jYXJkW2ldLmlycQogI2lmbmRlZiBDT05GSUdfQ1laX0lOVFIKLQkJJiYgY3lfY2FyZFtpXS5udW1fY2hpcHMgIT0gLTEgLyogbm90IGEgWiBjYXJkICovCisJCQkJJiYgY3lfY2FyZFtpXS5udW1fY2hpcHMgIT0gLTEgLyogbm90IGEgWiBjYXJkICovCiAjZW5kaWYgLyogQ09ORklHX0NZWl9JTlRSICovCi0JICAgICkKLQkJZnJlZV9pcnEoY3lfY2FyZFtpXS5pcnEsICZjeV9jYXJkW2ldKTsKKwkJCQkpCisJCQkJZnJlZV9pcnEoY3lfY2FyZFtpXS5pcnEsICZjeV9jYXJkW2ldKTsKICNpZmRlZiBDT05GSUdfUENJCi0JCWlmIChjeV9jYXJkW2ldLnBkZXYpCi0JCQlwY2lfcmVsZWFzZV9yZWdpb25zKGN5X2NhcmRbaV0ucGRldik7CisJCQlpZiAoY3lfY2FyZFtpXS5wZGV2KQorCQkJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY3lfY2FyZFtpXS5wZGV2KTsKICNlbmRpZgotICAgICAgICB9Ci0gICAgfQorCQl9CisJfQogfSAvKiBjeV9jbGVhbnVwX21vZHVsZSAqLwogCiBtb2R1bGVfaW5pdChjeV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kZWNzZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9kZWNzZXJpYWwuYwppbmRleCA4NWY0MDRlLi44ZWEyYmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZGVjc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2RlY3NlcmlhbC5jCkBAIC0yMywyMCArMjMsMTIgQEAKIGV4dGVybiBpbnQgenNfaW5pdCh2b2lkKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0RaCi1leHRlcm4gaW50IGR6X2luaXQodm9pZCk7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19TRVJJQUxfQ09OU09MRQogCiAjaWZkZWYgQ09ORklHX1pTCiBleHRlcm4gdm9pZCB6c19zZXJpYWxfY29uc29sZV9pbml0KHZvaWQpOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfRFoKLWV4dGVybiB2b2lkIGR6X3NlcmlhbF9jb25zb2xlX2luaXQodm9pZCk7Ci0jZW5kaWYKLQogI2VuZGlmCiAKIC8qIHJzX2luaXQgLSBzdGFydHMgdXAgdGhlIHNlcmlhbCBpbnRlcmZhY2UgLQpAQCAtNDYsMjMgKzM4LDExIEBACiAKIGludCBfX2luaXQgcnNfaW5pdCh2b2lkKQogewotCi0jaWYgZGVmaW5lZChDT05GSUdfWlMpICYmIGRlZmluZWQoQ09ORklHX0RaKQorI2lmZGVmIENPTkZJR19aUwogICAgIGlmIChJT0FTSUMpCiAJcmV0dXJuIHpzX2luaXQoKTsKLSAgICBlbHNlCi0JcmV0dXJuIGR6X2luaXQoKTsKLSNlbHNlCi0KLSNpZmRlZiBDT05GSUdfWlMKLSAgICByZXR1cm4genNfaW5pdCgpOwogI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfRFoKLSAgICByZXR1cm4gZHpfaW5pdCgpOwotI2VuZGlmCi0KLSNlbmRpZgorICAgIHJldHVybiAtRU5YSU87CiB9CiAKIF9faW5pdGNhbGwocnNfaW5pdCk7CkBAIC03NiwyMSArNTYsOSBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBkZWNzZXJpYWxfY29uc29sZV9pbml0KHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfWlMpICYmIGRlZmluZWQoQ09ORklHX0RaKQorI2lmZGVmIENPTkZJR19aUwogICAgIGlmIChJT0FTSUMpCiAJenNfc2VyaWFsX2NvbnNvbGVfaW5pdCgpOwotICAgIGVsc2UKLQlkel9zZXJpYWxfY29uc29sZV9pbml0KCk7Ci0jZWxzZQotCi0jaWZkZWYgQ09ORklHX1pTCi0gICAgenNfc2VyaWFsX2NvbnNvbGVfaW5pdCgpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfRFoKLSAgICBkel9zZXJpYWxfY29uc29sZV9pbml0KCk7Ci0jZW5kaWYKLQogI2VuZGlmCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm0uaAppbmRleCA1NjQyYWM0Li44ZGI5MDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKQEAgLTExNyw2ICsxMTcsMTQgQEAKIH0gZHJtX2NsaXBfcmVjdF90OwogCiAvKioKKyAqIERyYXdhYmxlIGluZm9ybWF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyB7CisJdW5zaWduZWQgaW50IG51bV9yZWN0czsKKwlkcm1fY2xpcF9yZWN0X3QgKnJlY3RzOworfSBkcm1fZHJhd2FibGVfaW5mb190OworCisvKioKICAqIFRleHR1cmUgcmVnaW9uLAogICovCiB0eXBlZGVmIHN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB7CkBAIC0zNDgsNyArMzU2LDggQEAKIAkJX0RSTV9QQUdFX0FMSUdOID0gMHgwMSwJLyoqPCBBbGlnbiBvbiBwYWdlIGJvdW5kYXJpZXMgZm9yIERNQSAqLwogCQlfRFJNX0FHUF9CVUZGRVIgPSAweDAyLAkvKio8IEJ1ZmZlciBpcyBpbiBBR1Agc3BhY2UgKi8KIAkJX0RSTV9TR19CVUZGRVIgPSAweDA0LAkvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBidWZmZXIgKi8KLQkJX0RSTV9GQl9CVUZGRVIgPSAweDA4CS8qKjwgQnVmZmVyIGlzIGluIGZyYW1lIGJ1ZmZlciAqLworCQlfRFJNX0ZCX0JVRkZFUiA9IDB4MDgsCS8qKjwgQnVmZmVyIGlzIGluIGZyYW1lIGJ1ZmZlciAqLworCQlfRFJNX1BDSV9CVUZGRVJfUk8gPSAweDEwIC8qKjwgTWFwIFBDSSBETUEgYnVmZmVyIHJlYWQtb25seSAqLwogCX0gZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7IC8qKjwKIAkJCQkgICogU3RhcnQgYWRkcmVzcyBvZiB3aGVyZSB0aGUgQUdQIGJ1ZmZlcnMgYXJlCkBAIC00NDQsNiArNDUzLDIwIEBACiB9IGRybV9kcmF3X3Q7CiAKIC8qKgorICogRFJNX0lPQ1RMX1VQREFURV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJRFJNX0RSQVdBQkxFX0NMSVBSRUNUUywKK30gZHJtX2RyYXdhYmxlX2luZm9fdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcgeworCWRybV9kcmF3YWJsZV90IGhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgbnVtOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhOworfSBkcm1fdXBkYXRlX2RyYXdfdDsKKworLyoqCiAgKiBEUk1fSU9DVExfR0VUX01BR0lDIGFuZCBEUk1fSU9DVExfQVVUSF9NQUdJQyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCiB0eXBlZGVmIHN0cnVjdCBkcm1fYXV0aCB7CkBAIC00NjUsMTAgKzQ4OCwxNCBAQAogdHlwZWRlZiBlbnVtIHsKIAlfRFJNX1ZCTEFOS19BQlNPTFVURSA9IDB4MCwJLyoqPCBXYWl0IGZvciBzcGVjaWZpYyB2Ymxhbmsgc2VxdWVuY2UgbnVtYmVyICovCiAJX0RSTV9WQkxBTktfUkVMQVRJVkUgPSAweDEsCS8qKjwgV2FpdCBmb3IgZ2l2ZW4gbnVtYmVyIG9mIHZibGFua3MgKi8KKwlfRFJNX1ZCTEFOS19ORVhUT05NSVNTID0gMHgxMDAwMDAwMCwJLyoqPCBJZiBtaXNzZWQsIHdhaXQgZm9yIG5leHQgdmJsYW5rICovCisJX0RSTV9WQkxBTktfU0VDT05EQVJZID0gMHgyMDAwMDAwMCwJLyoqPCBTZWNvbmRhcnkgZGlzcGxheSBjb250cm9sbGVyICovCiAJX0RSTV9WQkxBTktfU0lHTkFMID0gMHg0MDAwMDAwMAkvKio8IFNlbmQgc2lnbmFsIGluc3RlYWQgb2YgYmxvY2tpbmcgKi8KIH0gZHJtX3ZibGFua19zZXFfdHlwZV90OwogCi0jZGVmaW5lIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0sgX0RSTV9WQkxBTktfU0lHTkFMCisjZGVmaW5lIF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgKF9EUk1fVkJMQU5LX0FCU09MVVRFIHwgX0RSTV9WQkxBTktfUkVMQVRJVkUpCisjZGVmaW5lIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0sgKF9EUk1fVkJMQU5LX1NJR05BTCB8IF9EUk1fVkJMQU5LX1NFQ09OREFSWSB8IFwKKwkJCQlfRFJNX1ZCTEFOS19ORVhUT05NSVNTKQogCiBzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QgewogCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOwpAQCAtNjIzLDYgKzY1MCw4IEBACiAKICNkZWZpbmUgRFJNX0lPQ1RMX1dBSVRfVkJMQU5LCQlEUk1fSU9XUigweDNhLCBkcm1fd2FpdF92YmxhbmtfdCkKIAorI2RlZmluZSBEUk1fSU9DVExfVVBEQVRFX0RSQVcJCURSTV9JT1coMHgzZiwgZHJtX3VwZGF0ZV9kcmF3X3QpCisKIC8qKgogICogRGV2aWNlIHNwZWNpZmljIGlvY3RscyBzaG91bGQgb25seSBiZSBpbiB0aGVpciByZXNwZWN0aXZlIGhlYWRlcnMKICAqIFRoZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgcmFuZ2UgaXMgZnJvbSAweDQwIHRvIDB4NzkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCmluZGV4IDc2OTBhNTkuLjBiYmIwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oCkBAIC05Nyw2ICs5Nyw3IEBACiAjZGVmaW5lIERSSVZFUl9JUlFfVkJMICAgICAweDEwMAogI2RlZmluZSBEUklWRVJfRE1BX1FVRVVFICAgMHgyMDAKICNkZWZpbmUgRFJJVkVSX0ZCX0RNQSAgICAgIDB4NDAwCisjZGVmaW5lIERSSVZFUl9JUlFfVkJMMiAgICAweDgwMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiogXG5hbWUgQmVnaW4gdGhlIERSTS4uLiAqLwpAQCAtNDMwLDcgKzQzMSw4IEBACiAJZW51bSB7CiAJCV9EUk1fRE1BX1VTRV9BR1AgPSAweDAxLAogCQlfRFJNX0RNQV9VU0VfU0cgPSAweDAyLAotCQlfRFJNX0RNQV9VU0VfRkIgPSAweDA0CisJCV9EUk1fRE1BX1VTRV9GQiA9IDB4MDQsCisJCV9EUk1fRE1BX1VTRV9QQ0lfUk8gPSAweDA4CiAJfSBmbGFnczsKIAogfSBkcm1fZGV2aWNlX2RtYV90OwpAQCAtNTYyLDYgKzU2NCw3IEBACiAJdm9pZCAoKmtlcm5lbF9jb250ZXh0X3N3aXRjaF91bmxvY2spIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICAgICAgZHJtX2xvY2tfdCAqbG9jayk7CiAJaW50ICgqdmJsYW5rX3dhaXQpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CisJaW50ICgqdmJsYW5rX3dhaXQyKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogCWludCAoKmRyaV9saWJyYXJ5X25hbWUpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjaGFyICpidWYpOwogCiAJLyoqCkBAIC03MDgsOSArNzExLDEzIEBACiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCB2YmxfcXVldWU7CS8qKjwgVkJMQU5LIHdhaXQgcXVldWUgKi8KIAlhdG9taWNfdCB2YmxfcmVjZWl2ZWQ7CisJYXRvbWljX3QgdmJsX3JlY2VpdmVkMjsJCS8qKjwgbnVtYmVyIG9mIHNlY29uZGFyeSBWQkxBTksgaW50ZXJydXB0cyAqLwogCXNwaW5sb2NrX3QgdmJsX2xvY2s7CiAJZHJtX3ZibF9zaWdfdCB2Ymxfc2lnczsJCS8qKjwgc2lnbmFsIGxpc3QgdG8gc2VuZCBvbiBWQkxBTksgKi8KKwlkcm1fdmJsX3NpZ190IHZibF9zaWdzMjsJLyoqPCBzaWduYWxzIHRvIHNlbmQgb24gc2Vjb25kYXJ5IFZCTEFOSyAqLwogCXVuc2lnbmVkIGludCB2YmxfcGVuZGluZzsKKwlzcGlubG9ja190IHRhc2tsZXRfbG9jazsJLyoqPCBGb3IgZHJtX2xvY2tlZF90YXNrbGV0ICovCisJdm9pZCAoKmxvY2tlZF90YXNrbGV0X2Z1bmMpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAJLypAfSAqLwogCWN5Y2xlc190IGN0eF9zdGFydDsKQEAgLTczOCw2ICs3NDUsMTUgQEAKIAlkcm1fbG9jYWxfbWFwX3QgKmFncF9idWZmZXJfbWFwOwogCXVuc2lnbmVkIGludCBhZ3BfYnVmZmVyX3Rva2VuOwogCWRybV9oZWFkX3QgcHJpbWFyeTsJCS8qKjwgcHJpbWFyeSBzY3JlZW4gaGVhZCAqLworCisJLyoqIFxuYW1lIERyYXdhYmxlIGluZm9ybWF0aW9uICovCisJLypAeyAqLworCXNwaW5sb2NrX3QgZHJ3X2xvY2s7CisJdW5zaWduZWQgaW50IGRyd19iaXRmaWVsZF9sZW5ndGg7CisJdTMyICpkcndfYml0ZmllbGQ7CisJdW5zaWduZWQgaW50IGRyd19pbmZvX2xlbmd0aDsKKwlkcm1fZHJhd2FibGVfaW5mb190ICoqZHJ3X2luZm87CisJLypAfSAqLwogfSBkcm1fZGV2aWNlX3Q7CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBkcm1fY29yZV9jaGVja19mZWF0dXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCkBAIC04ODUsNiArOTAxLDEwIEBACiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV9ybWRyYXcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBpbnQgZHJtX3VwZGF0ZV9kcmF3YWJsZV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGRybV9kcmF3YWJsZV9pbmZvX3QgKmRybV9nZXRfZHJhd2FibGVfaW5mbyhkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkJCSAgZHJtX2RyYXdhYmxlX3QgaWQpOwogCiAJCQkJLyogQXV0aGVudGljYXRpb24gSU9DVEwgc3VwcG9ydCAoZHJtX2F1dGguaCkgKi8KIGV4dGVybiBpbnQgZHJtX2dldG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtOTQ5LDYgKzk2OSw3IEBACiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqdmJsX3NlcSk7CiBleHRlcm4gdm9pZCBkcm1fdmJsX3NlbmRfc2lnbmFscyhkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2xvY2tlZF90YXNrbGV0KGRybV9kZXZpY2VfdCAqZGV2LCB2b2lkKCpmdW5jKShkcm1fZGV2aWNlX3QqKSk7CiAKIAkJCQkvKiBBR1AvR0FSVCBzdXBwb3J0IChkcm1fYWdwc3VwcG9ydC5oKSAqLwogZXh0ZXJuIGRybV9hZ3BfaGVhZF90ICpkcm1fYWdwX2luaXQoZHJtX2RldmljZV90ICogZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwppbmRleCAwMjliYWVhLi45ZjY1ZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCkBAIC0yMzcsNiArMjM3LDggQEAKIAogCWxpc3QgPSBkcm1fYWxsb2Moc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKIAlpZiAoIWxpc3QpIHsKKwkJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX1JFR0lTVEVSUykKKwkJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOwogCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjUyLDYgKzI1NCw4IEBACiAJCW1hcC0+b2Zmc2V0OwogCXJldCA9IGRybV9tYXBfaGFuZGxlKGRldiwgJmxpc3QtPmhhc2gsIHVzZXJfdG9rZW4sIDApOwogCWlmIChyZXQpIHsKKwkJaWYgKG1hcC0+dHlwZSA9PSBfRFJNX1JFR0lTVEVSUykKKwkJCWRybV9pb3JlbWFwZnJlZShtYXAtPmhhbmRsZSwgbWFwLT5zaXplLCBkZXYpOwogCQlkcm1fZnJlZShtYXAsIHNpemVvZigqbWFwKSwgRFJNX01FTV9NQVBTKTsKIAkJZHJtX2ZyZWUobGlzdCwgc2l6ZW9mKCpsaXN0KSwgRFJNX01FTV9NQVBTKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC04ODMsNiArODg3LDkgQEAKIAlyZXF1ZXN0LT5jb3VudCA9IGVudHJ5LT5idWZfY291bnQ7CiAJcmVxdWVzdC0+c2l6ZSA9IHNpemU7CiAKKwlpZiAocmVxdWVzdC0+ZmxhZ3MgJiBfRFJNX1BDSV9CVUZGRVJfUk8pCisJCWRtYS0+ZmxhZ3MgPSBfRFJNX0RNQV9VU0VfUENJX1JPOworCiAJYXRvbWljX2RlYygmZGV2LT5idWZfYWxsb2MpOwogCXJldHVybiAwOwogCkBAIC0xNDY3LDkgKzE0NzQsMTAgQEAKICAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfbWFwIHN0cnVjdHVyZS4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKgotICogTWFwcyB0aGUgQUdQIG9yIFNHIGJ1ZmZlciByZWdpb24gd2l0aCBkb19tbWFwKCksIGFuZCBjb3BpZXMgaW5mb3JtYXRpb24KLSAqIGFib3V0IGVhY2ggYnVmZmVyIGludG8gdXNlciBzcGFjZS4gVGhlIFBDSSBidWZmZXJzIGFyZSBhbHJlYWR5IG1hcHBlZCBvbiB0aGUKLSAqIGFkZGJ1ZnNfcGNpKCkgY2FsbC4KKyAqIE1hcHMgdGhlIEFHUCwgU0cgb3IgUENJIGJ1ZmZlciByZWdpb24gd2l0aCBkb19tbWFwKCksIGFuZCBjb3BpZXMgaW5mb3JtYXRpb24KKyAqIGFib3V0IGVhY2ggYnVmZmVyIGludG8gdXNlciBzcGFjZS4gRm9yIFBDSSBidWZmZXJzLCBpdCBjYWxscyBkb19tbWFwKCkgd2l0aAorICogb2Zmc2V0IGVxdWFsIHRvIDAsIHdoaWNoIGRybV9tbWFwKCkgaW50ZXJwcmV0ZXMgYXMgUENJIGJ1ZmZlcnMgYW5kIGNhbGxzCisgKiBkcm1fbW1hcF9kbWEoKS4KICAqLwogaW50IGRybV9tYXBidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvcmUuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvcmUuaAppbmRleCBmNGY5ZGI2Yy4uMzE2NzM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29yZS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvcmUuaApAQCAtMjQsMTEgKzI0LDExIEBACiAKICNkZWZpbmUgQ09SRV9OQU1FCQkiZHJtIgogI2RlZmluZSBDT1JFX0RFU0MJCSJEUk0gc2hhcmVkIGNvcmUgcm91dGluZXMiCi0jZGVmaW5lIENPUkVfREFURQkJIjIwMDUxMTAyIgorI2RlZmluZSBDT1JFX0RBVEUJCSIyMDA2MDgxMCIKIAogI2RlZmluZSBEUk1fSUZfTUFKT1IJMQotI2RlZmluZSBEUk1fSUZfTUlOT1IJMgorI2RlZmluZSBEUk1fSUZfTUlOT1IJMwogCiAjZGVmaW5lIENPUkVfTUFKT1IJMQotI2RlZmluZSBDT1JFX01JTk9SCTAKLSNkZWZpbmUgQ09SRV9QQVRDSExFVkVMIDEKKyNkZWZpbmUgQ09SRV9NSU5PUgkxCisjZGVmaW5lIENPUkVfUEFUQ0hMRVZFTCAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcmF3YWJsZS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJhd2FibGUuYwppbmRleCA3ODU3NDUzLi5kZTM3ZDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcmF3YWJsZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKQEAgLTQsNiArNCw3IEBACiAgKgogICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KICAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogXGF1dGhvciBNaWNoZWwgRMOkbnplciA8bWljaGVsQHR1bmdzdGVuZ3JhcGhpY3MuY29tPgogICovCiAKIC8qCkBAIC0xMSw2ICsxMiw3IEBACiAgKgogICogQ29weXJpZ2h0IDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQ29weXJpZ2h0IDIwMDAgVkEgTGludXggU3lzdGVtcywgSW5jLiwgU3Vubnl2YWxlLCBDYWxpZm9ybmlhLgorICogQ29weXJpZ2h0IDIwMDYgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIEJpc21hcmNrLCBOb3J0aCBEYWtvdGEuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCkBAIC0zNSwyMiArMzcsMjk0IEBACiAKICNpbmNsdWRlICJkcm1QLmgiCiAKLS8qKiBOby1vcC4gKi8KLWludCBkcm1fYWRkZHJhdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisvKioKKyAqIEFsbG9jYXRlIGRyYXdhYmxlIElEIGFuZCBtZW1vcnkgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgaXQuCisgKi8KK2ludCBkcm1fYWRkZHJhdyhEUk1fSU9DVExfQVJHUykKIHsKKwlEUk1fREVWSUNFOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJaW50IGksIGo7CisJdTMyICpiaXRmaWVsZCA9IGRldi0+ZHJ3X2JpdGZpZWxkOworCXVuc2lnbmVkIGludCBiaXRmaWVsZF9sZW5ndGggPSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGg7CisJZHJtX2RyYXdhYmxlX2luZm9fdCAqKmluZm8gPSBkZXYtPmRyd19pbmZvOworCXVuc2lnbmVkIGludCBpbmZvX2xlbmd0aCA9IGRldi0+ZHJ3X2luZm9fbGVuZ3RoOwogCWRybV9kcmF3X3QgZHJhdzsKIAotCWRyYXcuaGFuZGxlID0gMDsJLyogTk9PUCAqLworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgYml0ZmllbGRfbGVuZ3RoOyBpKyspIHsKKwkJaWYgKGJpdGZpZWxkW2ldID09IH4wKQorCQkJY29udGludWU7CisKKwkJZm9yICg7IGogPCA4ICogc2l6ZW9mKCpiaXRmaWVsZCk7IGorKykKKwkJCWlmICghKGJpdGZpZWxkW2ldICYgKDEgPDwgaikpKQorCQkJCWdvdG8gZG9uZTsKKwl9Citkb25lOgorCisJaWYgKGkgPT0gYml0ZmllbGRfbGVuZ3RoKSB7CisJCWJpdGZpZWxkX2xlbmd0aCsrOworCisJCWJpdGZpZWxkID0gZHJtX2FsbG9jKGJpdGZpZWxkX2xlbmd0aCAqIHNpemVvZigqYml0ZmllbGQpLAorCQkJCSAgICAgRFJNX01FTV9CVUZTKTsKKworCQlpZiAoIWJpdGZpZWxkKSB7CisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgZHJhd2FibGUgYml0ZmllbGRcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJfQorCisJCWlmICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkgKiBiaXRmaWVsZF9sZW5ndGggPiBpbmZvX2xlbmd0aCkgeworCQkJaW5mb19sZW5ndGggKz0gOCAqIHNpemVvZigqYml0ZmllbGQpOworCisJCQlpbmZvID0gZHJtX2FsbG9jKGluZm9fbGVuZ3RoICogc2l6ZW9mKCppbmZvKSwKKwkJCQkJIERSTV9NRU1fQlVGUyk7CisKKwkJCWlmICghaW5mbykgeworCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBkcmF3YWJsZSBpbmZvIgorCQkJCQkgICIgYXJyYXlcbiIpOworCisJCQkJZHJtX2ZyZWUoYml0ZmllbGQsCisJCQkJCSBiaXRmaWVsZF9sZW5ndGggKiBzaXplb2YoKmJpdGZpZWxkKSwKKwkJCQkJIERSTV9NRU1fQlVGUyk7CisJCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJCX0KKwkJfQorCisJCWJpdGZpZWxkW2ldID0gMDsKKwl9CisKKwlkcmF3LmhhbmRsZSA9IGkgKiA4ICogc2l6ZW9mKCpiaXRmaWVsZCkgKyBqICsgMTsKIAlEUk1fREVCVUcoIiVkXG4iLCBkcmF3LmhhbmRsZSk7Ci0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2RyYXdfdCBfX3VzZXIgKikgYXJnLCAmZHJhdywgc2l6ZW9mKGRyYXcpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOworCisJYml0ZmllbGRbaV0gfD0gMSA8PCBqOworCWluZm9bZHJhdy5oYW5kbGUgLSAxXSA9IE5VTEw7CisKKwlpZiAoYml0ZmllbGQgIT0gZGV2LT5kcndfYml0ZmllbGQpIHsKKwkJbWVtY3B5KGJpdGZpZWxkLCBkZXYtPmRyd19iaXRmaWVsZCwgZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoICoKKwkJICAgICAgIHNpemVvZigqYml0ZmllbGQpKTsKKwkJZHJtX2ZyZWUoZGV2LT5kcndfYml0ZmllbGQsIHNpemVvZigqYml0ZmllbGQpICoKKwkJCSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGgsIERSTV9NRU1fQlVGUyk7CisJCWRldi0+ZHJ3X2JpdGZpZWxkID0gYml0ZmllbGQ7CisJCWRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCA9IGJpdGZpZWxkX2xlbmd0aDsKKwl9CisKKwlpZiAoaW5mbyAhPSBkZXYtPmRyd19pbmZvKSB7CisJCW1lbWNweShpbmZvLCBkZXYtPmRyd19pbmZvLCBkZXYtPmRyd19pbmZvX2xlbmd0aCAqCisJCSAgICAgICBzaXplb2YoKmluZm8pKTsKKwkJZHJtX2ZyZWUoZGV2LT5kcndfaW5mbywgc2l6ZW9mKCppbmZvKSAqIGRldi0+ZHJ3X2luZm9fbGVuZ3RoLAorCQkJIERSTV9NRU1fQlVGUyk7CisJCWRldi0+ZHJ3X2luZm8gPSBpbmZvOworCQlkZXYtPmRyd19pbmZvX2xlbmd0aCA9IGluZm9fbGVuZ3RoOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV9kcmF3X3QgX191c2VyICopZGF0YSwgZHJhdywgc2l6ZW9mKGRyYXcpKTsKKwogCXJldHVybiAwOwogfQogCi0vKiogTm8tb3AuICovCi1pbnQgZHJtX3JtZHJhdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisvKioKKyAqIEZyZWUgZHJhd2FibGUgSUQgYW5kIG1lbW9yeSB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBpdC4KKyAqLworaW50IGRybV9ybWRyYXcoRFJNX0lPQ1RMX0FSR1MpCiB7Ci0JcmV0dXJuIDA7CQkvKiBOT09QICovCisJRFJNX0RFVklDRTsKKwlkcm1fZHJhd190IGRyYXc7CisgCWludCBpZCwgaWR4OworIAl1bnNpZ25lZCBpbnQgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwl1MzIgKmJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7CisJdW5zaWduZWQgaW50IGJpdGZpZWxkX2xlbmd0aCA9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aDsKKwlkcm1fZHJhd2FibGVfaW5mb190ICoqaW5mbyA9IGRldi0+ZHJ3X2luZm87CisJdW5zaWduZWQgaW50IGluZm9fbGVuZ3RoID0gZGV2LT5kcndfaW5mb19sZW5ndGg7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZHJhdywgKGRybV9kcmF3X3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihkcmF3KSk7CisKKwlpZCA9IGRyYXcuaGFuZGxlIC0gMTsKKwlpZHggPSBpZCAvICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOworCXNoaWZ0ID0gaWQgJSAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKKworCWlmIChpZHggPCAwIHx8IGlkeCA+PSBiaXRmaWVsZF9sZW5ndGggfHwKKwkgICAgIShiaXRmaWVsZFtpZHhdICYgKDEgPDwgc2hpZnQpKSkgeworCQlEUk1fREVCVUcoIk5vIHN1Y2ggZHJhd2FibGUgJWRcbiIsIGRyYXcuaGFuZGxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKworCWJpdGZpZWxkW2lkeF0gJj0gfigxIDw8IHNoaWZ0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKworCWlmIChpbmZvW2lkXSkgeworCQlkcm1fZnJlZShpbmZvW2lkXS0+cmVjdHMsIGluZm9baWRdLT5udW1fcmVjdHMgKgorCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOworCQlkcm1fZnJlZShpbmZvW2lkXSwgc2l6ZW9mKCoqaW5mbyksIERSTV9NRU1fQlVGUyk7CisJfQorCisJLyogQ2FuIHdlIHNocmluayB0aGUgYXJyYXlzPyAqLworCWlmIChpZHggPT0gYml0ZmllbGRfbGVuZ3RoIC0gMSkgeworCQl3aGlsZSAoaWR4ID49IDAgJiYgIWJpdGZpZWxkW2lkeF0pCisJCQktLWlkeDsKKworCQliaXRmaWVsZF9sZW5ndGggPSBpZHggKyAxOworCisJCWlmIChpZHggIT0gaWQgLyAoOCAqIHNpemVvZigqYml0ZmllbGQpKSkKKwkJCWJpdGZpZWxkID0gZHJtX2FsbG9jKGJpdGZpZWxkX2xlbmd0aCAqCisJCQkJCSAgICAgc2l6ZW9mKCpiaXRmaWVsZCksIERSTV9NRU1fQlVGUyk7CisKKwkJaWYgKCFiaXRmaWVsZCAmJiBiaXRmaWVsZF9sZW5ndGgpIHsKKwkJCWJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7CisJCQliaXRmaWVsZF9sZW5ndGggPSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGg7CisJCX0KKwl9CisKKwlpZiAoYml0ZmllbGQgIT0gZGV2LT5kcndfYml0ZmllbGQpIHsKKwkJaW5mb19sZW5ndGggPSA4ICogc2l6ZW9mKCpiaXRmaWVsZCkgKiBiaXRmaWVsZF9sZW5ndGg7CisKKwkJaW5mbyA9IGRybV9hbGxvYyhpbmZvX2xlbmd0aCAqIHNpemVvZigqaW5mbyksIERSTV9NRU1fQlVGUyk7CisKKwkJaWYgKCFpbmZvICYmIGluZm9fbGVuZ3RoKSB7CisJCQlpbmZvID0gZGV2LT5kcndfaW5mbzsKKwkJCWluZm9fbGVuZ3RoID0gZGV2LT5kcndfaW5mb19sZW5ndGg7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOworCisJCW1lbWNweShiaXRmaWVsZCwgZGV2LT5kcndfYml0ZmllbGQsIGJpdGZpZWxkX2xlbmd0aCAqCisJCSAgICAgICBzaXplb2YoKmJpdGZpZWxkKSk7CisJCWRybV9mcmVlKGRldi0+ZHJ3X2JpdGZpZWxkLCBzaXplb2YoKmJpdGZpZWxkKSAqCisJCQkgZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoLCBEUk1fTUVNX0JVRlMpOworCQlkZXYtPmRyd19iaXRmaWVsZCA9IGJpdGZpZWxkOworCQlkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggPSBiaXRmaWVsZF9sZW5ndGg7CisKKwkJaWYgKGluZm8gIT0gZGV2LT5kcndfaW5mbykgeworCQkJbWVtY3B5KGluZm8sIGRldi0+ZHJ3X2luZm8sIGluZm9fbGVuZ3RoICoKKwkJCSAgICAgICBzaXplb2YoKmluZm8pKTsKKwkJCWRybV9mcmVlKGRldi0+ZHJ3X2luZm8sIHNpemVvZigqaW5mbykgKgorCQkJCSBkZXYtPmRyd19pbmZvX2xlbmd0aCwgRFJNX01FTV9CVUZTKTsKKwkJCWRldi0+ZHJ3X2luZm8gPSBpbmZvOworCQkJZGV2LT5kcndfaW5mb19sZW5ndGggPSBpbmZvX2xlbmd0aDsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKwl9CisKKwlEUk1fREVCVUcoIiVkXG4iLCBkcmF3LmhhbmRsZSk7CisJcmV0dXJuIDA7CiB9CisKK2ludCBkcm1fdXBkYXRlX2RyYXdhYmxlX2luZm8oRFJNX0lPQ1RMX0FSR1MpIHsKKwlEUk1fREVWSUNFOworCWRybV91cGRhdGVfZHJhd190IHVwZGF0ZTsKKwl1bnNpZ25lZCBpbnQgaWQsIGlkeCwgc2hpZnQ7CisJdTMyICpiaXRmaWVsZCA9IGRldi0+ZHJ3X2JpdGZpZWxkOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MsIGJpdGZpZWxkX2xlbmd0aCA9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aDsKKwlkcm1fZHJhd2FibGVfaW5mb190ICppbmZvOworCWRybV9jbGlwX3JlY3RfdCAqcmVjdHM7CisJaW50IGVycjsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh1cGRhdGUsIChkcm1fdXBkYXRlX2RyYXdfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKHVwZGF0ZSkpOworCisJaWQgPSB1cGRhdGUuaGFuZGxlIC0gMTsKKwlpZHggPSBpZCAvICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOworCXNoaWZ0ID0gaWQgJSAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKKworCWlmIChpZHggPCAwIHx8IGlkeCA+PSBiaXRmaWVsZF9sZW5ndGggfHwKKwkgICAgIShiaXRmaWVsZFtpZHhdICYgKDEgPDwgc2hpZnQpKSkgeworCQlEUk1fRVJST1IoIk5vIHN1Y2ggZHJhd2FibGUgJWRcbiIsIHVwZGF0ZS5oYW5kbGUpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWluZm8gPSBkZXYtPmRyd19pbmZvW2lkXTsKKworCWlmICghaW5mbykgeworCQlpbmZvID0gZHJtX2NhbGxvYygxLCBzaXplb2YoZHJtX2RyYXdhYmxlX2luZm9fdCksIERSTV9NRU1fQlVGUyk7CisKKwkJaWYgKCFpbmZvKSB7CisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBkcmF3YWJsZSBpbmZvIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCQl9CisJfQorCisJc3dpdGNoICh1cGRhdGUudHlwZSkgeworCWNhc2UgRFJNX0RSQVdBQkxFX0NMSVBSRUNUUzoKKwkJaWYgKHVwZGF0ZS5udW0gIT0gaW5mby0+bnVtX3JlY3RzKSB7CisJCQlyZWN0cyA9IGRybV9hbGxvYyh1cGRhdGUubnVtICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksCisJCQkJCSBEUk1fTUVNX0JVRlMpOworCQl9IGVsc2UKKwkJCXJlY3RzID0gaW5mby0+cmVjdHM7CisKKwkJaWYgKHVwZGF0ZS5udW0gJiYgIXJlY3RzKSB7CisJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBjbGlwcmVjdCBtZW1vcnlcbiIpOworCQkJZXJyID0gRFJNX0VSUihFTk9NRU0pOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlmICh1cGRhdGUubnVtICYmIERSTV9DT1BZX0ZST01fVVNFUihyZWN0cywKKwkJCQkJCSAgICAgKGRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKikKKwkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpdXBkYXRlLmRhdGEsCisJCQkJCQkgICAgIHVwZGF0ZS5udW0gKgorCQkJCQkJICAgICBzaXplb2YoKnJlY3RzKSkpIHsKKwkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGNvcHkgY2xpcHJlY3RzIGZyb20gdXNlcnNwYWNlXG4iKTsKKwkJCWVyciA9IERSTV9FUlIoRUZBVUxUKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOworCisJCWlmIChyZWN0cyAhPSBpbmZvLT5yZWN0cykgeworCQkJZHJtX2ZyZWUoaW5mby0+cmVjdHMsIGluZm8tPm51bV9yZWN0cyAqCisJCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOworCQl9CisKKwkJaW5mby0+cmVjdHMgPSByZWN0czsKKwkJaW5mby0+bnVtX3JlY3RzID0gdXBkYXRlLm51bTsKKwkJZGV2LT5kcndfaW5mb1tpZF0gPSBpbmZvOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKworCQlEUk1fREVCVUcoIlVwZGF0ZWQgJWQgY2xpcHJlY3RzIGZvciBkcmF3YWJsZSAlZFxuIiwKKwkJCSAgaW5mby0+bnVtX3JlY3RzLCBpZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiSW52YWxpZCB1cGRhdGUgdHlwZSAlZFxuIiwgdXBkYXRlLnR5cGUpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAoIWRldi0+ZHJ3X2luZm9baWRdKQorCQlkcm1fZnJlZShpbmZvLCBzaXplb2YoKmluZm8pLCBEUk1fTUVNX0JVRlMpOworCWVsc2UgaWYgKHJlY3RzICE9IGRldi0+ZHJ3X2luZm9baWRdLT5yZWN0cykKKwkJZHJtX2ZyZWUocmVjdHMsIHVwZGF0ZS5udW0gKgorCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBkcmF3YWJsZSBzcGlubG9jayEKKyAqLworZHJtX2RyYXdhYmxlX2luZm9fdCAqZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZHJhd2FibGVfdCBpZCkgeworCXUzMiAqYml0ZmllbGQgPSBkZXYtPmRyd19iaXRmaWVsZDsKKwl1bnNpZ25lZCBpbnQgaWR4LCBzaGlmdDsKKworCWlkLS07CisJaWR4ID0gaWQgLyAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKKwlzaGlmdCA9IGlkICUgKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7CisKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoIHx8CisJICAgICEoYml0ZmllbGRbaWR4XSAmICgxIDw8IHNoaWZ0KSkpIHsKKwkJRFJNX0RFQlVHKCJObyBzdWNoIGRyYXdhYmxlICVkXG4iLCBpZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkZXYtPmRyd19pbmZvW2lkXTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2dldF9kcmF3YWJsZV9pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKaW5kZXggYjM2NmM1Yi4uYTcwYWYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKQEAgLTExNiw2ICsxMTYsOCBAQAogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NHX0ZSRUUpXSA9IHtkcm1fc2dfZnJlZSwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKIAogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1dBSVRfVkJMQU5LKV0gPSB7ZHJtX3dhaXRfdmJsYW5rLCAwfSwKKworCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1VQREFURV9EUkFXKV0gPSB7ZHJtX3VwZGF0ZV9kcmF3YWJsZV9pbmZvLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAogfTsKIAogI2RlZmluZSBEUklWRVJfSU9DVExfQ09VTlQJQVJSQVlfU0laRSggZHJtX2lvY3RscyApCkBAIC0xNTEsNiArMTUzLDE4IEBACiAJaWYgKGRldi0+aXJxX2VuYWJsZWQpCiAJCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CiAKKwkvKiBGcmVlIGRyYXdhYmxlIGluZm9ybWF0aW9uIG1lbW9yeSAqLworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggLyBzaXplb2YoKmRldi0+ZHJ3X2JpdGZpZWxkKTsKKwkgICAgIGkrKykgeworCQlkcm1fZHJhd2FibGVfaW5mb190ICppbmZvID0gZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRldiwgaSk7CisKKwkJaWYgKGluZm8pIHsKKwkJCWRybV9mcmVlKGluZm8tPnJlY3RzLCBpbmZvLT5udW1fcmVjdHMgKgorCQkJCSBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwgRFJNX01FTV9CVUZTKTsKKwkJCWRybV9mcmVlKGluZm8sIHNpemVvZigqaW5mbyksIERSTV9NRU1fQlVGUyk7CisJCX0KKwl9CisKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZGVsX3RpbWVyKCZkZXYtPnRpbWVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKaW5kZXggZDRmODc0NS4uZmFmZWIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJCSAgJnZlcnNpb24tPmRlc2MpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9WRVJTSU9OLCAodW5zaWduZWQgbG9uZyl2ZXJzaW9uKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJCQkgICZ1LT51bmlxdWUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9HRVRfVU5JUVVFLCAodW5zaWduZWQgbG9uZyl1KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJCQkgICZ1LT51bmlxdWUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9TRVRfVU5JUVVFLCAodW5zaWduZWQgbG9uZyl1KTsKIH0KIApAQCAtMjAzLDcgKzIwMyw3IEBACiAJaWYgKF9fcHV0X3VzZXIoaWR4LCAmbWFwLT5vZmZzZXQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9HRVRfTUFQLCAodW5zaWduZWQgbG9uZyltYXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkgICAgfHwgX19wdXRfdXNlcihtMzIuZmxhZ3MsICZtYXAtPmZsYWdzKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQlEUk1fSU9DVExfQUREX01BUCwgKHVuc2lnbmVkIGxvbmcpbWFwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJaWYgKF9fcHV0X3VzZXIoKHZvaWQgKikodW5zaWduZWQgbG9uZyloYW5kbGUsICZtYXAtPmhhbmRsZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX1JNX01BUCwgKHVuc2lnbmVkIGxvbmcpbWFwKTsKIH0KIApAQCAtMzEyLDcgKzMxMiw3IEBACiAJaWYgKF9fcHV0X3VzZXIoaWR4LCAmY2xpZW50LT5pZHgpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9HRVRfQ0xJRU5ULCAodW5zaWduZWQgbG9uZyljbGllbnQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0zNDksNyArMzQ5LDcgQEAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHN0YXRzLCBzaXplb2YoKnN0YXRzKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJRFJNX0lPQ1RMX0dFVF9TVEFUUywgKHVuc2lnbmVkIGxvbmcpc3RhdHMpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0zOTMsNyArMzkzLDcgQEAKIAkgICAgfHwgX19wdXRfdXNlcihhZ3Bfc3RhcnQsICZidWYtPmFncF9zdGFydCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJRFJNX0lPQ1RMX0FERF9CVUZTLCAodW5zaWduZWQgbG9uZylidWYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC00MjUsNyArNDI1LDcgQEAKIAkgICAgfHwgX19wdXRfdXNlcihiMzIuaGlnaF9tYXJrLCAmYnVmLT5oaWdoX21hcmspKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9NQVJLX0JVRlMsICh1bnNpZ25lZCBsb25nKWJ1Zik7CiB9CiAKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCSAgICB8fCBfX3B1dF91c2VyKGxpc3QsICZyZXF1ZXN0LT5saXN0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQlEUk1fSU9DVExfSU5GT19CVUZTLCAodW5zaWduZWQgbG9uZylyZXF1ZXN0KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtNTI5LDcgKzUyOSw3IEBACiAJICAgIHx8IF9fcHV0X3VzZXIobGlzdCwgJnJlcXVlc3QtPmxpc3QpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9NQVBfQlVGUywgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTU3Niw3ICs1NzYsNyBAQAogCQkJICAmcmVxdWVzdC0+bGlzdCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX0ZSRUVfQlVGUywgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiAKQEAgLTYwMyw3ICs2MDMsNyBAQAogCQkJICAmcmVxdWVzdC0+aGFuZGxlKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWCwgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiAKQEAgLTYyNiw3ICs2MjYsNyBAQAogCWlmIChfX3B1dF91c2VyKGN0eF9pZCwgJnJlcXVlc3QtPmN0eF9pZCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJRFJNX0lPQ1RMX0dFVF9TQVJFQV9DVFgsICh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC02NjIsNyArNjYyLDcgQEAKIAkJCSAgJnJlcy0+Y29udGV4dHMpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9SRVNfQ1RYLCAodW5zaWduZWQgbG9uZylyZXMpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC03MTYsNyArNzE2LDcgQEAKIAkJCSAgJmQtPnJlcXVlc3Rfc2l6ZXMpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9ETUEsICh1bnNpZ25lZCBsb25nKWQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC03NDksNyArNzQ5LDcgQEAKIAlpZiAocHV0X3VzZXIobTMyLm1vZGUsICZtb2RlLT5tb2RlKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfQUdQX0VOQUJMRSwgKHVuc2lnbmVkIGxvbmcpbW9kZSk7CiB9CiAKQEAgLTc3OSw3ICs3NzksNyBAQAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgaW5mbywgc2l6ZW9mKCppbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJRFJNX0lPQ1RMX0FHUF9JTkZPLCAodW5zaWduZWQgbG9uZylpbmZvKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtODI1LDcgKzgyNSw3IEBACiAJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIudHlwZSwgJnJlcXVlc3QtPnR5cGUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9BR1BfQUxMT0MsICh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC04MzMsNyArODMzLDcgQEAKIAlpZiAoX19nZXRfdXNlcihyZXEzMi5oYW5kbGUsICZyZXF1ZXN0LT5oYW5kbGUpCiAJICAgIHx8IF9fZ2V0X3VzZXIocmVxMzIucGh5c2ljYWwsICZyZXF1ZXN0LT5waHlzaWNhbCkKIAkgICAgfHwgY29weV90b191c2VyKGFyZ3AsICZyZXEzMiwgc2l6ZW9mKHJlcTMyKSkpIHsKLQkJZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQlkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSAgRFJNX0lPQ1RMX0FHUF9GUkVFLCAodW5zaWduZWQgbG9uZylyZXF1ZXN0KTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtODU0LDcgKzg1NCw3IEBACiAJICAgIHx8IF9fcHV0X3VzZXIoaGFuZGxlLCAmcmVxdWVzdC0+aGFuZGxlKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfQUdQX0ZSRUUsICh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOwogfQogCkBAIC04NzksNyArODc5LDcgQEAKIAkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5vZmZzZXQsICZyZXF1ZXN0LT5vZmZzZXQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9BR1BfQklORCwgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiAKQEAgLTg5Niw3ICs4OTYsNyBAQAogCSAgICB8fCBfX3B1dF91c2VyKGhhbmRsZSwgJnJlcXVlc3QtPmhhbmRsZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX0FHUF9VTkJJTkQsICh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOwogfQogI2VuZGlmCQkJCS8qIF9fT1NfSEFTX0FHUCAqLwpAQCAtOTIxLDcgKzkyMSw3IEBACiAJICAgIHx8IF9fcHV0X3VzZXIoeCwgJnJlcXVlc3QtPnNpemUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCURSTV9JT0NUTF9TR19BTExPQywgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTk0OCw3ICs5NDgsNyBAQAogCSAgICB8fCBfX3B1dF91c2VyKHggPDwgUEFHRV9TSElGVCwgJnJlcXVlc3QtPmhhbmRsZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX1NHX0ZSRUUsICh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOwogfQogCkBAIC05ODgsNyArOTg4LDcgQEAKIAkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5yZXF1ZXN0LnNpZ25hbCwgJnJlcXVlc3QtPnJlcXVlc3Quc2lnbmFsKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQlEUk1fSU9DVExfV0FJVF9WQkxBTkssICh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogCWlmIChmbiAhPSBOVUxMKQogCQlyZXQgPSAoKmZuKSAoZmlscCwgY21kLCBhcmcpOwogCWVsc2UKLQkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJCXJldCA9IGRybV9pb2N0bChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKaW5kZXggNDU1M2EzYS4uOWQwMGM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKQEAgLTEyMSw2ICsxMjEsNyBAQAogCQlzcGluX2xvY2tfaW5pdCgmZGV2LT52YmxfbG9jayk7CiAKIAkJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJsX3NpZ3MuaGVhZCk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZibF9zaWdzMi5oZWFkKTsKIAogCQlkZXYtPnZibF9wZW5kaW5nID0gMDsKIAl9CkBAIC0xNzUsNiArMTc2LDggQEAKIAogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCisJZGV2LT5sb2NrZWRfdGFza2xldF9mdW5jID0gTlVMTDsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNDcsMTAgKzI1MCw3IEBACiAJZHJtX3dhaXRfdmJsYW5rX3QgdmJsd2FpdDsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotCi0JaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0lSUV9WQkwpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MsIHNlcTsKIAogCWlmICghZGV2LT5pcnEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjU4LDkgKzI1OCwyNiBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmdmJsd2FpdCwgYXJncCwgc2l6ZW9mKHZibHdhaXQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlzd2l0Y2ggKHZibHdhaXQucmVxdWVzdC50eXBlICYgfl9EUk1fVkJMQU5LX0ZMQUdTX01BU0spIHsKKwlpZiAodmJsd2FpdC5yZXF1ZXN0LnR5cGUgJgorCSAgICB+KF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgfCBfRFJNX1ZCTEFOS19GTEFHU19NQVNLKSkgeworCQlEUk1fRVJST1IoIlVuc3VwcG9ydGVkIHR5cGUgdmFsdWUgMHgleCwgc3VwcG9ydGVkIG1hc2sgMHgleFxuIiwKKwkJCSAgdmJsd2FpdC5yZXF1ZXN0LnR5cGUsCisJCQkgIChfRFJNX1ZCTEFOS19UWVBFU19NQVNLIHwgX0RSTV9WQkxBTktfRkxBR1NfTUFTSykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmbGFncyA9IHZibHdhaXQucmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfRkxBR1NfTUFTSzsKKworCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIChmbGFncyAmIF9EUk1fVkJMQU5LX1NFQ09OREFSWSkgPworCQkJCSAgICBEUklWRVJfSVJRX1ZCTDIgOiBEUklWRVJfSVJRX1ZCTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJc2VxID0gYXRvbWljX3JlYWQoKGZsYWdzICYgX0RSTV9WQkxBTktfU0VDT05EQVJZKSA/ICZkZXYtPnZibF9yZWNlaXZlZDIKKwkJCSAgOiAmZGV2LT52YmxfcmVjZWl2ZWQpOworCisJc3dpdGNoICh2Ymx3YWl0LnJlcXVlc3QudHlwZSAmIF9EUk1fVkJMQU5LX1RZUEVTX01BU0spIHsKIAljYXNlIF9EUk1fVkJMQU5LX1JFTEFUSVZFOgotCQl2Ymx3YWl0LnJlcXVlc3Quc2VxdWVuY2UgKz0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwkJdmJsd2FpdC5yZXF1ZXN0LnNlcXVlbmNlICs9IHNlcTsKIAkJdmJsd2FpdC5yZXF1ZXN0LnR5cGUgJj0gfl9EUk1fVkJMQU5LX1JFTEFUSVZFOwogCWNhc2UgX0RSTV9WQkxBTktfQUJTT0xVVEU6CiAJCWJyZWFrOwpAQCAtMjY4LDI2ICsyODUsMzAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZmxhZ3MgPSB2Ymx3YWl0LnJlcXVlc3QudHlwZSAmIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0s7CisJaWYgKChmbGFncyAmIF9EUk1fVkJMQU5LX05FWFRPTk1JU1MpICYmCisJICAgIChzZXEgLSB2Ymx3YWl0LnJlcXVlc3Quc2VxdWVuY2UpIDw9ICgxPDwyMykpIHsKKwkJdmJsd2FpdC5yZXF1ZXN0LnNlcXVlbmNlID0gc2VxICsgMTsKKwl9CiAKIAlpZiAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19TSUdOQUwpIHsKIAkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZ3MgPSAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19TRUNPTkRBUlkpCisJCQkJICAgICAgPyAmZGV2LT52Ymxfc2lnczIgOiAmZGV2LT52Ymxfc2lnczsKIAkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZzsKIAotCQl2Ymx3YWl0LnJlcGx5LnNlcXVlbmNlID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKTsKLQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCiAJCS8qIENoZWNrIGlmIHRoaXMgdGFzayBoYXMgYWxyZWFkeSBzY2hlZHVsZWQgdGhlIHNhbWUgc2lnbmFsCiAJCSAqIGZvciB0aGUgc2FtZSB2Ymxhbmsgc2VxdWVuY2UgbnVtYmVyOyBub3RoaW5nIHRvIGJlIGRvbmUgaW4KIAkJICogdGhhdCBjYXNlCiAJCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZibF9zaWcsICZkZXYtPnZibF9zaWdzLmhlYWQsIGhlYWQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2Ymxfc2lnLCAmdmJsX3NpZ3MtPmhlYWQsIGhlYWQpIHsKIAkJCWlmICh2Ymxfc2lnLT5zZXF1ZW5jZSA9PSB2Ymx3YWl0LnJlcXVlc3Quc2VxdWVuY2UKIAkJCSAgICAmJiB2Ymxfc2lnLT5pbmZvLnNpX3NpZ25vID09IHZibHdhaXQucmVxdWVzdC5zaWduYWwKIAkJCSAgICAmJiB2Ymxfc2lnLT50YXNrID09IGN1cnJlbnQpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLAogCQkJCQkJICAgICAgIGlycWZsYWdzKTsKKwkJCQl2Ymx3YWl0LnJlcGx5LnNlcXVlbmNlID0gc2VxOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAkJfQpAQCAtMzE1LDExICszMzYsMTYgQEAKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCi0JCWxpc3RfYWRkX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKil2Ymxfc2lnLCAmZGV2LT52Ymxfc2lncy5oZWFkKTsKKwkJbGlzdF9hZGRfdGFpbCgoc3RydWN0IGxpc3RfaGVhZCAqKXZibF9zaWcsICZ2Ymxfc2lncy0+aGVhZCk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworCisJCXZibHdhaXQucmVwbHkuc2VxdWVuY2UgPSBzZXE7CiAJfSBlbHNlIHsKLQkJaWYgKGRldi0+ZHJpdmVyLT52Ymxhbmtfd2FpdCkKKwkJaWYgKGZsYWdzICYgX0RSTV9WQkxBTktfU0VDT05EQVJZKSB7CisJCQlpZiAoZGV2LT5kcml2ZXItPnZibGFua193YWl0MikKKwkJCQlyZXQgPSBkZXYtPmRyaXZlci0+dmJsYW5rX3dhaXQyKGRldiwgJnZibHdhaXQucmVxdWVzdC5zZXF1ZW5jZSk7CisJCX0gZWxzZSBpZiAoZGV2LT5kcml2ZXItPnZibGFua193YWl0KQogCQkJcmV0ID0KIAkJCSAgICBkZXYtPmRyaXZlci0+dmJsYW5rX3dhaXQoZGV2LAogCQkJCQkJICAgICAmdmJsd2FpdC5yZXF1ZXN0LnNlcXVlbmNlKTsKQEAgLTM0NywyNSArMzczLDMyIEBACiAgKi8KIHZvaWQgZHJtX3ZibF9zZW5kX3NpZ25hbHMoZHJtX2RldmljZV90ICogZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICp0bXA7Ci0JZHJtX3ZibF9zaWdfdCAqdmJsX3NpZzsKLQl1bnNpZ25lZCBpbnQgdmJsX3NlcSA9IGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBmbGFncyk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdG1wLCAmZGV2LT52Ymxfc2lncy5oZWFkKSB7Ci0JCXZibF9zaWcgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV92Ymxfc2lnX3QsIGhlYWQpOwotCQlpZiAoKHZibF9zZXEgLSB2Ymxfc2lnLT5zZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSB7Ci0JCQl2Ymxfc2lnLT5pbmZvLnNpX2NvZGUgPSB2Ymxfc2VxOwotCQkJc2VuZF9zaWdfaW5mbyh2Ymxfc2lnLT5pbmZvLnNpX3NpZ25vLCAmdmJsX3NpZy0+aW5mbywKLQkJCQkgICAgICB2Ymxfc2lnLT50YXNrKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICp0bXA7CisJCWRybV92Ymxfc2lnX3QgKnZibF9zaWc7CisJCWRybV92Ymxfc2lnX3QgKnZibF9zaWdzID0gaSA/ICZkZXYtPnZibF9zaWdzMiA6ICZkZXYtPnZibF9zaWdzOworCQl1bnNpZ25lZCBpbnQgdmJsX3NlcSA9IGF0b21pY19yZWFkKGkgPyAmZGV2LT52YmxfcmVjZWl2ZWQyIDoKKwkJCQkJCSAgICZkZXYtPnZibF9yZWNlaXZlZCk7CiAKLQkJCWxpc3RfZGVsKGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdG1wLCAmdmJsX3NpZ3MtPmhlYWQpIHsKKwkJCXZibF9zaWcgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV92Ymxfc2lnX3QsIGhlYWQpOworCQkJaWYgKCh2Ymxfc2VxIC0gdmJsX3NpZy0+c2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkgeworCQkJCXZibF9zaWctPmluZm8uc2lfY29kZSA9IHZibF9zZXE7CisJCQkJc2VuZF9zaWdfaW5mbyh2Ymxfc2lnLT5pbmZvLnNpX3NpZ25vLAorCQkJCQkgICAgICAmdmJsX3NpZy0+aW5mbywgdmJsX3NpZy0+dGFzayk7CiAKLQkJCWRybV9mcmVlKHZibF9zaWcsIHNpemVvZigqdmJsX3NpZyksIERSTV9NRU1fRFJJVkVSKTsKKwkJCQlsaXN0X2RlbChsaXN0KTsKIAotCQkJZGV2LT52YmxfcGVuZGluZy0tOworCQkJCWRybV9mcmVlKHZibF9zaWcsIHNpemVvZigqdmJsX3NpZyksCisJCQkJCSBEUk1fTUVNX0RSSVZFUik7CisKKwkJCQlkZXYtPnZibF9wZW5kaW5nLS07CisJCQl9CiAJCX0KIAl9CiAKQEAgLTM3MywzICs0MDYsNzcgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1fdmJsX3NlbmRfc2lnbmFscyk7CisKKy8qKgorICogVGFza2xldCB3cmFwcGVyIGZ1bmN0aW9uLgorICoKKyAqIFxwYXJhbSBkYXRhIERSTSBkZXZpY2UgaW4gZGlzZ3Vpc2UuCisgKgorICogQXR0ZW1wdHMgdG8gZ3JhYiB0aGUgSFcgbG9jayBhbmQgY2FsbHMgdGhlIGRyaXZlciBjYWxsYmFjayBvbiBzdWNjZXNzLiBPbgorICogZmFpbHVyZSwgbGVhdmUgdGhlIGxvY2sgbWFya2VkIGFzIGNvbnRlbmRlZCBzbyB0aGUgY2FsbGJhY2sgY2FuIGJlIGNhbGxlZAorICogZnJvbSBkcm1fdW5sb2NrKCkuCisgKi8KK3N0YXRpYyB2b2lkIGRybV9sb2NrZWRfdGFza2xldF9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnRhc2tsZXRfbG9jaywgaXJxZmxhZ3MpOworCisJaWYgKCFkZXYtPmxvY2tlZF90YXNrbGV0X2Z1bmMgfHwKKwkgICAgIWRybV9sb2NrX3Rha2UoJmRldi0+bG9jay5od19sb2NrLT5sb2NrLAorCQkJICAgRFJNX0tFUk5FTF9DT05URVhUKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnRhc2tsZXRfbG9jaywgaXJxZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZGV2LT5sb2NrLmxvY2tfdGltZSA9IGppZmZpZXM7CisJYXRvbWljX2luYygmZGV2LT5jb3VudHNbX0RSTV9TVEFUX0xPQ0tTXSk7CisKKwlkZXYtPmxvY2tlZF90YXNrbGV0X2Z1bmMoZGV2KTsKKworCWRybV9sb2NrX2ZyZWUoZGV2LCAmZGV2LT5sb2NrLmh3X2xvY2stPmxvY2ssCisJCSAgICAgIERSTV9LRVJORUxfQ09OVEVYVCk7CisKKwlkZXYtPmxvY2tlZF90YXNrbGV0X2Z1bmMgPSBOVUxMOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50YXNrbGV0X2xvY2ssIGlycWZsYWdzKTsKK30KKworLyoqCisgKiBTY2hlZHVsZSBhIHRhc2tsZXQgdG8gY2FsbCBiYWNrIGEgZHJpdmVyIGhvb2sgd2l0aCB0aGUgSFcgbG9jayBoZWxkLgorICoKKyAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KKyAqIFxwYXJhbSBmdW5jIERyaXZlciBjYWxsYmFjay4KKyAqCisgKiBUaGlzIGlzIGludGVuZGVkIGZvciB0cmlnZ2VyaW5nIGFjdGlvbnMgdGhhdCByZXF1aXJlIHRoZSBIVyBsb2NrIGZyb20gYW4KKyAqIGludGVycnVwdCBoYW5kbGVyLiBUaGUgbG9jayB3aWxsIGJlIGdyYWJiZWQgQVNBUCBhZnRlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqIGNvbXBsZXRlcy4gTm90ZSB0aGF0IHRoZSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IG9yIHByb2Nlc3MKKyAqIGNvbnRleHQsIGl0IG11c3Qgbm90IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoaXMuIEFsc28sIHRoZSBIVyBsb2NrIHdpbGwKKyAqIGJlIGhlbGQgd2l0aCB0aGUga2VybmVsIGNvbnRleHQgb3IgYW55IGNsaWVudCBjb250ZXh0LgorICovCit2b2lkIGRybV9sb2NrZWRfdGFza2xldChkcm1fZGV2aWNlX3QgKmRldiwgdm9pZCAoKmZ1bmMpKGRybV9kZXZpY2VfdCopKQoreworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJc3RhdGljIERFQ0xBUkVfVEFTS0xFVChkcm1fdGFza2xldCwgZHJtX2xvY2tlZF90YXNrbGV0X2Z1bmMsIDApOworCisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSB8fAorCSAgICB0ZXN0X2JpdChUQVNLTEVUX1NUQVRFX1NDSEVELCAmZHJtX3Rhc2tsZXQuc3RhdGUpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50YXNrbGV0X2xvY2ssIGlycWZsYWdzKTsKKworCWlmIChkZXYtPmxvY2tlZF90YXNrbGV0X2Z1bmMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50YXNrbGV0X2xvY2ssIGlycWZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWRldi0+bG9ja2VkX3Rhc2tsZXRfZnVuYyA9IGZ1bmM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnRhc2tsZXRfbG9jaywgaXJxZmxhZ3MpOworCisJZHJtX3Rhc2tsZXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmRybV90YXNrbGV0KTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2xvY2tlZF90YXNrbGV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYwppbmRleCBmOWU0NTMwLi4xMTZlZDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCkBAIC0xNTUsNiArMTU1LDcgQEAKIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZsb2NrLCAoZHJtX2xvY2tfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YobG9jaykpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE2NSw2ICsxNjYsMTYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dGFza2xldF9sb2NrLCBpcnFmbGFncyk7CisKKwlpZiAoZGV2LT5sb2NrZWRfdGFza2xldF9mdW5jKSB7CisJCWRldi0+bG9ja2VkX3Rhc2tsZXRfZnVuYyhkZXYpOworCisJCWRldi0+bG9ja2VkX3Rhc2tsZXRfZnVuYyA9IE5VTEw7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50YXNrbGV0X2xvY2ssIGlycWZsYWdzKTsKKwogCWF0b21pY19pbmMoJmRldi0+Y291bnRzW19EUk1fU1RBVF9VTkxPQ0tTXSk7CiAKIAkvKiBrZXJuZWxfY29udGV4dF9zd2l0Y2ggaXNuJ3QgdXNlZCBieSBhbnkgb2YgdGhlIHg4NiBkcm0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uYwppbmRleCA0MjVjODIzLi4xOWM4MWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5jCkBAIC0xNjIsNiArMTYyLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkcm1fc21hbl9zZXRfbWFuYWdlcik7CiAKIHN0YXRpYyBkcm1fb3duZXJfaXRlbV90ICpkcm1fc21hbl9nZXRfb3duZXJfaXRlbShkcm1fc21hbl90ICogc21hbiwKIAkJCQkJCSB1bnNpZ25lZCBsb25nIG93bmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCmluZGV4IDdiMWQ0ZTguLjVmZDZkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKQEAgLTYwLDYgKzYwLDggQEAKIAlpbnQgcmV0Y29kZTsKIAogCXNwaW5fbG9ja19pbml0KCZkZXYtPmNvdW50X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmRyd19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT50YXNrbGV0X2xvY2spOwogCWluaXRfdGltZXIoJmRldi0+dGltZXIpOwogCW11dGV4X2luaXQoJmRldi0+c3RydWN0X211dGV4KTsKIAltdXRleF9pbml0KCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggNTFhZDk4Yy4uYmE0YjhkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCkBAIC00MiwxMyArNDIsMjQgQEAKIHN0cnVjdCBjbGFzcyAqZHJtX3N5c2ZzX2NyZWF0ZShzdHJ1Y3QgbW9kdWxlICpvd25lciwgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgY2xhc3MgKmNsYXNzOworCWludCBlcnI7CiAKIAljbGFzcyA9IGNsYXNzX2NyZWF0ZShvd25lciwgbmFtZSk7Ci0JaWYgKCFjbGFzcykKLQkJcmV0dXJuIGNsYXNzOworCWlmICghY2xhc3MpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KIAotCWNsYXNzX2NyZWF0ZV9maWxlKGNsYXNzLCAmY2xhc3NfYXR0cl92ZXJzaW9uKTsKKwllcnIgPSBjbGFzc19jcmVhdGVfZmlsZShjbGFzcywgJmNsYXNzX2F0dHJfdmVyc2lvbik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2NsYXNzOworCiAJcmV0dXJuIGNsYXNzOworCitlcnJfb3V0X2NsYXNzOgorCWNsYXNzX2Rlc3Ryb3koY2xhc3MpOworZXJyX291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCiAvKioKQEAgLTk2LDIwICsxMDcsMzYgQEAKIHN0cnVjdCBjbGFzc19kZXZpY2UgKmRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzcyAqY3MsIGRybV9oZWFkX3QgKmhlYWQpCiB7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwotCWludCBpOworCWludCBpLCBqLCBlcnI7CiAKIAljbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKGNzLCBOVUxMLAogCQkJCQlNS0RFVihEUk1fTUFKT1IsIGhlYWQtPm1pbm9yKSwKIAkJCQkJJihoZWFkLT5kZXYtPnBkZXYpLT5kZXYsCiAJCQkJCSJjYXJkJWQiLCBoZWFkLT5taW5vcik7Ci0JaWYgKCFjbGFzc19kZXYpCi0JCXJldHVybiBOVUxMOworCWlmICghY2xhc3NfZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CiAKIAljbGFzc19zZXRfZGV2ZGF0YShjbGFzc19kZXYsIGhlYWQpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xhc3NfZGV2aWNlX2F0dHJzKTsgaSsrKQotCQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xhc3NfZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspIHsKKwkJZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsYXNzX2RldiwKKwkJCQkJICAgICAgICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0X2ZpbGVzOworCX0KKwogCXJldHVybiBjbGFzc19kZXY7CisKK2Vycl9vdXRfZmlsZXM6CisJaWYgKGkgPiAwKQorCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNsYXNzX2RldiwKKwkJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcihjbGFzc19kZXYpOworZXJyX291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCmluZGV4IGI0MGFlNDMuLmI5Y2ZjMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpAQCAtMTQ3LDE0ICsxNDcsMTQgQEAKIAlpZiAoYWRkcmVzcyA+IHZtYS0+dm1fZW5kKQogCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsJLyogRGlzYWxsb3cgbXJlbWFwICovCiAJaWYgKCFtYXApCi0JCXJldHVybiBOT1BBR0VfT09NOwkvKiBOb3RoaW5nIGFsbG9jYXRlZCAqLworCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsJLyogTm90aGluZyBhbGxvY2F0ZWQgKi8KIAogCW9mZnNldCA9IGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0OwogCWkgPSAodW5zaWduZWQgbG9uZyltYXAtPmhhbmRsZSArIG9mZnNldDsKIAlwYWdlID0gKG1hcC0+dHlwZSA9PSBfRFJNX0NPTlNJU1RFTlQpID8KIAkJdmlydF90b19wYWdlKCh2b2lkICopaSkgOiB2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilpKTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiBOT1BBR0VfT09NOworCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsKIAlnZXRfcGFnZShwYWdlKTsKIAogCURSTV9ERUJVRygic2htX25vcGFnZSAweCVseFxuIiwgYWRkcmVzcyk7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAlpZiAoYWRkcmVzcyA+IHZtYS0+dm1fZW5kKQogCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsJLyogRGlzYWxsb3cgbXJlbWFwICovCiAJaWYgKCFkbWEtPnBhZ2VsaXN0KQotCQlyZXR1cm4gTk9QQUdFX09PTTsJLyogTm90aGluZyBhbGxvY2F0ZWQgKi8KKwkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7CS8qIE5vdGhpbmcgYWxsb2NhdGVkICovCiAKIAlvZmZzZXQgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsJLyogdm1fW3BnXW9mZltzZXRdIHNob3VsZCBiZSAwICovCiAJcGFnZV9uciA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkKIAkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7CS8qIERpc2FsbG93IG1yZW1hcCAqLwogCWlmICghZW50cnktPnBhZ2VsaXN0KQotCQlyZXR1cm4gTk9QQUdFX09PTTsJLyogTm90aGluZyBhbGxvY2F0ZWQgKi8KKwkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7CS8qIE5vdGhpbmcgYWxsb2NhdGVkICovCiAKIAlvZmZzZXQgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsKIAltYXBfb2Zmc2V0ID0gbWFwLT5vZmZzZXQgLSAodW5zaWduZWQgbG9uZylkZXYtPnNnLT52aXJ0dWFsOwpAQCAtNDczLDYgKzQ3MywyMiBAQAogCX0KIAl1bmxvY2tfa2VybmVsKCk7CiAKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgJiYKKwkgICAgKGRtYS0+ZmxhZ3MgJiBfRFJNX0RNQV9VU0VfUENJX1JPKSkgeworCQl2bWEtPnZtX2ZsYWdzICY9IH4oVk1fV1JJVEUgfCBWTV9NQVlXUklURSk7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSAmPSB+X1BBR0VfUlc7CisjZWxzZQorCQkvKiBZZSBnYWRzIHRoaXMgaXMgdWdseS4gIFdpdGggbW9yZSB0aG91Z2h0CisJCSAgIHdlIGNvdWxkIG1vdmUgdGhpcyB1cCBoaWdoZXIgYW5kIHVzZQorCQkgICBgcHJvdGVjdGlvbl9tYXAnIGluc3RlYWQuICAqLworCQl2bWEtPnZtX3BhZ2VfcHJvdCA9CisJCSAgICBfX3BncHJvdChwdGVfdmFsCisJCQkgICAgIChwdGVfd3Jwcm90ZWN0CisJCQkgICAgICAoX19wdGUocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpKSkpOworI2VuZGlmCisJfQorCiAJdm1hLT52bV9vcHMgPSAmZHJtX3ZtX2RtYV9vcHM7CiAKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOwkvKiBEb24ndCBzd2FwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKaW5kZXggZmI3OTEzZi4uOTM1NGNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwpAQCAtMTYyLDYgKzE2Miw3IEBACiAKIAlkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID0gZGV2X3ByaXYtPnJpbmcubWFwLmhhbmRsZTsKIAorCWRldl9wcml2LT5jcHAgPSBpbml0LT5jcHA7CiAJZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ID0gaW5pdC0+YmFja19vZmZzZXQ7CiAJZGV2X3ByaXYtPmZyb250X29mZnNldCA9IGluaXQtPmZyb250X29mZnNldDsKIAlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMDsKQEAgLTc4Miw2ICs3ODMsNyBAQAogCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfREVTVFJPWV9IRUFQKV0gPSB7IGk5MTVfbWVtX2Rlc3Ryb3lfaGVhcCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZIH0sCiAJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9TRVRfVkJMQU5LX1BJUEUpXSA9IHsgaTkxNV92YmxhbmtfcGlwZV9zZXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSB9LAogCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfR0VUX1ZCTEFOS19QSVBFKV0gPSB7IGk5MTVfdmJsYW5rX3BpcGVfZ2V0LCBEUk1fQVVUSCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfVkJMQU5LX1NXQVApXSA9IHtpOTE1X3ZibGFua19zd2FwLCBEUk1fQVVUSH0sCiB9OwogCiBpbnQgaTkxNV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpOTE1X2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKaW5kZXggNmFmODNlNi4uOTZhNDY4ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKQEAgLTEwNCw2ICsxMDQsMTUgQEAKIAl1bnNpZ25lZCBpbnQgZGVwdGhfdGlsZWQ7CiAJdW5zaWduZWQgaW50IHJvdGF0ZWRfdGlsZWQ7CiAJdW5zaWduZWQgaW50IHJvdGF0ZWQyX3RpbGVkOworCisJaW50IHBpcGVBX3g7CisJaW50IHBpcGVBX3k7CisJaW50IHBpcGVBX3c7CisJaW50IHBpcGVBX2g7CisJaW50IHBpcGVCX3g7CisJaW50IHBpcGVCX3k7CisJaW50IHBpcGVCX3c7CisJaW50IHBpcGVCX2g7CiB9IGRybV9pOTE1X3NhcmVhX3Q7CiAKIC8qIEZsYWdzIGZvciBwZXJmX2JveGVzCkBAIC0xMzIsNiArMTQxLDcgQEAKICNkZWZpbmUgRFJNX0k5MTVfREVTVFJPWV9IRUFQCTB4MGMKICNkZWZpbmUgRFJNX0k5MTVfU0VUX1ZCTEFOS19QSVBFCTB4MGQKICNkZWZpbmUgRFJNX0k5MTVfR0VUX1ZCTEFOS19QSVBFCTB4MGUKKyNkZWZpbmUgRFJNX0k5MTVfVkJMQU5LX1NXQVAJMHgwZgogCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0lOSVQJCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JTklULCBkcm1faTkxNV9pbml0X3QpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0ZMVVNICQlEUk1fSU8gKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfRkxVU0gpCkBAIC0xNDgsNiArMTU4LDcgQEAKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfREVTVFJPWV9IRUFQCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9ERVNUUk9ZX0hFQVAsIGRybV9pOTE1X21lbV9kZXN0cm95X2hlYXBfdCkKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfU0VUX1ZCTEFOS19QSVBFCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9TRVRfVkJMQU5LX1BJUEUsIGRybV9pOTE1X3ZibGFua19waXBlX3QpCiAjZGVmaW5lIERSTV9JT0NUTF9JOTE1X0dFVF9WQkxBTktfUElQRQlEUk1fSU9SKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfR0VUX1ZCTEFOS19QSVBFLCBkcm1faTkxNV92YmxhbmtfcGlwZV90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9WQkxBTktfU1dBUAlEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX0k5MTVfVkJMQU5LX1NXQVAsIGRybV9pOTE1X3ZibGFua19zd2FwX3QpCiAKIC8qIEFsbG93IGRyaXZlcnMgdG8gc3VibWl0IGJhdGNoYnVmZmVycyBkaXJlY3RseSB0byBoYXJkd2FyZSwgcmVseWluZwogICogb24gdGhlIHNlY3VyaXR5IG1lY2hhbmlzbXMgcHJvdmlkZWQgYnkgaGFyZHdhcmUuCkBAIC0yNDMsNCArMjU0LDEyIEBACiAJaW50IHBpcGU7CiB9IGRybV9pOTE1X3ZibGFua19waXBlX3Q7CiAKKy8qIFNjaGVkdWxlIGJ1ZmZlciBzd2FwIGF0IGdpdmVuIHZlcnRpY2FsIGJsYW5rOgorICovCit0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV92Ymxhbmtfc3dhcCB7CisJZHJtX2RyYXdhYmxlX3QgZHJhd2FibGU7CisJZHJtX3ZibGFua19zZXFfdHlwZV90IHNlcXR5cGU7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlOworfSBkcm1faTkxNV92Ymxhbmtfc3dhcF90OworCiAjZW5kaWYJCQkJLyogX0k5MTVfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKaW5kZXggOGUyZTYwOS4uODViY2MyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYwpAQCAtNDQsMTIgKzQ0LDE0IEBACiAJICovCiAJLmRyaXZlcl9mZWF0dXJlcyA9CiAJICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1JFUVVJUkVfQUdQIHwgLyogRFJJVkVSX1VTRV9NVFJSIHwqLwotCSAgICBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMLAorCSAgICBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCB8IERSSVZFUl9JUlFfVkJMIHwKKwkgICAgRFJJVkVSX0lSUV9WQkwyLAogCS5sb2FkID0gaTkxNV9kcml2ZXJfbG9hZCwKIAkubGFzdGNsb3NlID0gaTkxNV9kcml2ZXJfbGFzdGNsb3NlLAogCS5wcmVjbG9zZSA9IGk5MTVfZHJpdmVyX3ByZWNsb3NlLAogCS5kZXZpY2VfaXNfYWdwID0gaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncCwKIAkudmJsYW5rX3dhaXQgPSBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkudmJsYW5rX3dhaXQyID0gaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQyLAogCS5pcnFfcHJlaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAogCS5pcnFfcG9zdGluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCiAJLmlycV91bmluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCmluZGV4IGZkYzJiZjEuLjkzY2RjZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKQEAgLTQ2LDkgKzQ2LDExIEBACiAgKiAxLjM6IEFkZCB2Ymxhbmsgc3VwcG9ydAogICogMS40OiBGaXggY21kYnVmZmVyIHBhdGgsIGFkZCBoZWFwIGRlc3Ryb3kKICAqIDEuNTogQWRkIHZibGFuayBwaXBlIGNvbmZpZ3VyYXRpb24KKyAqIDEuNjogLSBOZXcgaW9jdGwgZm9yIHNjaGVkdWxpbmcgYnVmZmVyIHN3YXBzIG9uIHZlcnRpY2FsIGJsYW5rCisgKiAgICAgIC0gU3VwcG9ydCB2ZXJ0aWNhbCBibGFuayBvbiBzZWNvbmRhcnkgZGlzcGxheSBwaXBlCiAgKi8KICNkZWZpbmUgRFJJVkVSX01BSk9SCQkxCi0jZGVmaW5lIERSSVZFUl9NSU5PUgkJNQorI2RlZmluZSBEUklWRVJfTUlOT1IJCTYKICNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAogCiB0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfcmluZ19idWZmZXIgewpAQCAtNzEsNiArNzMsMTMgQEAKIAlEUk1GSUxFIGZpbHA7CQkvKiAwOiBmcmVlLCAtMTogaGVhcCwgb3RoZXI6IHJlYWwgZmlsZXMgKi8KIH07CiAKK3R5cGVkZWYgc3RydWN0IF9kcm1faTkxNV92Ymxfc3dhcCB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCWRybV9kcmF3YWJsZV90IGRyd19pZDsKKwl1bnNpZ25lZCBpbnQgcGlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7Cit9IGRybV9pOTE1X3ZibF9zd2FwX3Q7CisKIHR5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgewogCWRybV9sb2NhbF9tYXBfdCAqc2FyZWE7CiAJZHJtX2xvY2FsX21hcF90ICptbWlvX21hcDsKQEAgLTgzLDYgKzkyLDcgQEAKIAlkbWFfYWRkcl90IGRtYV9zdGF0dXNfcGFnZTsKIAl1bnNpZ25lZCBsb25nIGNvdW50ZXI7CiAKKwl1bnNpZ25lZCBpbnQgY3BwOwogCWludCBiYWNrX29mZnNldDsKIAlpbnQgZnJvbnRfb2Zmc2V0OwogCWludCBjdXJyZW50X3BhZ2U7CkBAIC05OCw2ICsxMDgsMTAgQEAKIAlzdHJ1Y3QgbWVtX2Jsb2NrICphZ3BfaGVhcDsKIAl1bnNpZ25lZCBpbnQgc3IwMSwgYWRwYSwgcHBjciwgZHZvYiwgZHZvYywgbHZkczsKIAlpbnQgdmJsYW5rX3BpcGU7CisKKwlzcGlubG9ja190IHN3YXBzX2xvY2s7CisJZHJtX2k5MTVfdmJsX3N3YXBfdCB2Ymxfc3dhcHM7CisJdW5zaWduZWQgaW50IHN3YXBzX3BlbmRpbmc7CiB9IGRybV9pOTE1X3ByaXZhdGVfdDsKIAogZXh0ZXJuIGRybV9pb2N0bF9kZXNjX3QgaTkxNV9pb2N0bHNbXTsKQEAgLTExNywxMiArMTMxLDE0IEBACiBleHRlcm4gaW50IGk5MTVfaXJxX3dhaXQoRFJNX0lPQ1RMX0FSR1MpOwogCiBleHRlcm4gaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQyKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKIGV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIGludCBpOTE1X3ZibGFua19waXBlX3NldChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3BpcGVfZ2V0KERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV92Ymxhbmtfc3dhcChEUk1fSU9DVExfQVJHUyk7CiAKIC8qIGk5MTVfbWVtLmMgKi8KIGV4dGVybiBpbnQgaTkxNV9tZW1fYWxsb2MoRFJNX0lPQ1RMX0FSR1MpOwpAQCAtMjU2LDYgKzI3MiwxMCBAQAogCiAjZGVmaW5lIEdGWF9PUF9EUkFXUkVDVF9JTkZPX0k5NjUgKCgweDc5MDA8PDE2KXwweDIpCiAKKyNkZWZpbmUgWFlfU1JDX0NPUFlfQkxUX0NNRAkJKCgyPDwyOSl8KDB4NTM8PDIyKXw2KQorI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEJKDE8PDIxKQorI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfUkdCCSgxPDwyMCkKKwogI2RlZmluZSBNSV9CQVRDSF9CVUZGRVIgCSgoMHgzMDw8MjMpfDEpCiAjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9TVEFSVCAJKDB4MzE8PDIzKQogI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfRU5EIAkoMHhBPDwyMykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lvYzMyLmMKaW5kZXggMjk2MjQ4Yy4uMWZlNjhhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lvYzMyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lvYzMyLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAkJCSAgJmJhdGNoYnVmZmVyLT5jbGlwcmVjdHMpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9JOTE1X0JBVENIQlVGRkVSLAogCQkJICh1bnNpZ25lZCBsb25nKWJhdGNoYnVmZmVyKTsKIH0KQEAgLTEwMiw3ICsxMDIsNyBAQAogCQkJICAmY21kYnVmZmVyLT5jbGlwcmVjdHMpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9JOTE1X0NNREJVRkZFUiwgKHVuc2lnbmVkIGxvbmcpY21kYnVmZmVyKTsKIH0KIApAQCAtMTI1LDcgKzEyNSw3IEBACiAJCQkgICZyZXF1ZXN0LT5pcnFfc2VxKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfSTkxNV9JUlFfRU1JVCwgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiB0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9nZXRwYXJhbTMyIHsKQEAgLTE0OSw3ICsxNDksNyBAQAogCQkJICAmcmVxdWVzdC0+dmFsdWUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAodW5zaWduZWQgbG9uZylyZXF1ZXN0KTsKIH0KIApAQCAtMTc4LDcgKzE3OCw3IEBACiAJCQkgICZyZXF1ZXN0LT5yZWdpb25fb2Zmc2V0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfSTkxNV9BTExPQywgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogCWlmIChmbiAhPSBOVUxMKQogCQlyZXQgPSAoKmZuKSAoZmlscCwgY21kLCBhcmcpOwogCWVsc2UKLQkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJCXJldCA9IGRybV9pb2N0bChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwppbmRleCAwZDRhMTYyLi5lNTQ2M2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCkBAIC0zNyw2ICszNyw5OSBAQAogCiAjZGVmaW5lIE1BWF9OT1BJRCAoKHUzMil+MCkKIAorLyoqCisgKiBFbWl0IGJsaXRzIGZvciBzY2hlZHVsZWQgYnVmZmVyIHN3YXBzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgSFcgbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBpOTE1X3ZibGFua190YXNrbGV0KGRybV9kZXZpY2VfdCAqZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqdG1wOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5zd2Fwc19sb2NrLCBpcnFmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdG1wLCAmZGV2X3ByaXYtPnZibF9zd2Fwcy5oZWFkKSB7CisJCWRybV9pOTE1X3ZibF9zd2FwX3QgKnZibF9zd2FwID0KKwkJCWxpc3RfZW50cnkobGlzdCwgZHJtX2k5MTVfdmJsX3N3YXBfdCwgaGVhZCk7CisJCWF0b21pY190ICpjb3VudGVyID0gdmJsX3N3YXAtPnBpcGUgPyAmZGV2LT52YmxfcmVjZWl2ZWQyIDoKKwkJCSZkZXYtPnZibF9yZWNlaXZlZDsKKworCQlpZiAoKGF0b21pY19yZWFkKGNvdW50ZXIpIC0gdmJsX3N3YXAtPnNlcXVlbmNlKSA8PSAoMTw8MjMpKSB7CisJCQlkcm1fZHJhd2FibGVfaW5mb190ICpkcnc7CisKKwkJCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+c3dhcHNfbG9jayk7CisKKwkJCXNwaW5fbG9jaygmZGV2LT5kcndfbG9jayk7CisKKwkJCWRydyA9IGRybV9nZXRfZHJhd2FibGVfaW5mbyhkZXYsIHZibF9zd2FwLT5kcndfaWQpOworCQkJCQorCQkJaWYgKGRydykgeworCQkJCWludCBpLCBudW1fcmVjdHMgPSBkcnctPm51bV9yZWN0czsKKwkJCQlkcm1fY2xpcF9yZWN0X3QgKnJlY3QgPSBkcnctPnJlY3RzOworCQkJCWRybV9pOTE1X3NhcmVhX3QgKnNhcmVhX3ByaXYgPQorCQkJCSAgICBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwkJCQl1MzIgY3BwID0gZGV2X3ByaXYtPmNwcDsKKwkJCQl1MzIgY21kID0gKGNwcCA9PSA0KSA/IChYWV9TUkNfQ09QWV9CTFRfQ01EIHwKKwkJCQkJCQlYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEgfAorCQkJCQkJCVhZX1NSQ19DT1BZX0JMVF9XUklURV9SR0IpCisJCQkJCQkgICAgIDogWFlfU1JDX0NPUFlfQkxUX0NNRDsKKwkJCQl1MzIgcGl0Y2hyb3BjcHAgPSAoc2FyZWFfcHJpdi0+cGl0Y2ggKiBjcHApIHwKKwkJCQkJCSAgKDB4Y2MgPDwgMTYpIHwgKGNwcCA8PCAyMykgfAorCQkJCQkJICAoMSA8PCAyNCk7CisJCQkJUklOR19MT0NBTFM7CisKKwkJCQlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKworCQkJCUJFR0lOX0xQX1JJTkcoNik7CisKKwkJCQlPVVRfUklORyhHRlhfT1BfRFJBV1JFQ1RfSU5GTyk7CisJCQkJT1VUX1JJTkcoMCk7CisJCQkJT1VUX1JJTkcoMCk7CisJCQkJT1VUX1JJTkcoc2FyZWFfcHJpdi0+d2lkdGggfAorCQkJCQkgc2FyZWFfcHJpdi0+aGVpZ2h0IDw8IDE2KTsKKwkJCQlPVVRfUklORyhzYXJlYV9wcml2LT53aWR0aCB8CisJCQkJCSBzYXJlYV9wcml2LT5oZWlnaHQgPDwgMTYpOworCQkJCU9VVF9SSU5HKDApOworCisJCQkJQURWQU5DRV9MUF9SSU5HKCk7CisKKwkJCQlzYXJlYV9wcml2LT5jdHhPd25lciA9IERSTV9LRVJORUxfQ09OVEVYVDsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBudW1fcmVjdHM7IGkrKywgcmVjdCsrKSB7CisJCQkJCUJFR0lOX0xQX1JJTkcoOCk7CisKKwkJCQkJT1VUX1JJTkcoY21kKTsKKwkJCQkJT1VUX1JJTkcocGl0Y2hyb3BjcHApOworCQkJCQlPVVRfUklORygocmVjdC0+eTEgPDwgMTYpIHwgcmVjdC0+eDEpOworCQkJCQlPVVRfUklORygocmVjdC0+eTIgPDwgMTYpIHwgcmVjdC0+eDIpOworCQkJCQlPVVRfUklORyhzYXJlYV9wcml2LT5mcm9udF9vZmZzZXQpOworCQkJCQlPVVRfUklORygocmVjdC0+eTEgPDwgMTYpIHwgcmVjdC0+eDEpOworCQkJCQlPVVRfUklORyhwaXRjaHJvcGNwcCAmIDB4ZmZmZik7CisJCQkJCU9VVF9SSU5HKHNhcmVhX3ByaXYtPmJhY2tfb2Zmc2V0KTsKKworCQkJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJCQl9CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZkZXYtPmRyd19sb2NrKTsKKworCQkJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+c3dhcHNfbG9jayk7CisKKwkJCWxpc3RfZGVsKGxpc3QpOworCisJCQlkcm1fZnJlZSh2Ymxfc3dhcCwgc2l6ZW9mKCp2Ymxfc3dhcCksIERSTV9NRU1fRFJJVkVSKTsKKworCQkJZGV2X3ByaXYtPnN3YXBzX3BlbmRpbmctLTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5zd2Fwc19sb2NrLCBpcnFmbGFncyk7Cit9CisKIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKIAlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOwpAQCAtNjAsOSArMTUzLDI2IEBACiAJCURSTV9XQUtFVVAoJmRldl9wcml2LT5pcnFfcXVldWUpOwogCiAJaWYgKHRlbXAgJiAoVlNZTkNfUElQRUFfRkxBRyB8IFZTWU5DX1BJUEVCX0ZMQUcpKSB7Ci0JCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwkJaW50IHZibGFua19waXBlID0gZGV2X3ByaXYtPnZibGFua19waXBlOworCisJCWlmICgodmJsYW5rX3BpcGUgJgorCQkgICAgIChEUk1fSTkxNV9WQkxBTktfUElQRV9BIHwgRFJNX0k5MTVfVkJMQU5LX1BJUEVfQikpCisJCSAgICA9PSAoRFJNX0k5MTVfVkJMQU5LX1BJUEVfQSB8IERSTV9JOTE1X1ZCTEFOS19QSVBFX0IpKSB7CisJCQlpZiAodGVtcCAmIFZTWU5DX1BJUEVBX0ZMQUcpCisJCQkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworCQkJaWYgKHRlbXAgJiBWU1lOQ19QSVBFQl9GTEFHKQorCQkJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkMik7CisJCX0gZWxzZSBpZiAoKCh0ZW1wICYgVlNZTkNfUElQRUFfRkxBRykgJiYKKwkJCSAgICAodmJsYW5rX3BpcGUgJiBEUk1fSTkxNV9WQkxBTktfUElQRV9BKSkgfHwKKwkJCSAgICgodGVtcCAmIFZTWU5DX1BJUEVCX0ZMQUcpICYmCisJCQkgICAgKHZibGFua19waXBlICYgRFJNX0k5MTVfVkJMQU5LX1BJUEVfQikpKQorCQkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworCiAJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKIAkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoZGV2KTsKKworCQlpZiAoZGV2X3ByaXYtPnN3YXBzX3BlbmRpbmcgPiAwKQorCQkJZHJtX2xvY2tlZF90YXNrbGV0KGRldiwgaTkxNV92YmxhbmtfdGFza2xldCk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTIwLDcgKzIzMCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQorc3RhdGljIGludCBpOTE1X2RyaXZlcl92YmxhbmtfZG9fd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSwKKwkJCQkgICAgICBhdG9taWNfdCAqY291bnRlcikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKQEAgLTEzMiw3ICsyNDMsNyBAQAogCX0KIAogCURSTV9XQUlUX09OKHJldCwgZGV2LT52YmxfcXVldWUsIDMgKiBEUk1fSFosCi0JCSAgICAoKChjdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKSkKKwkJICAgICgoKGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZChjb3VudGVyKSkKIAkJCS0gKnNlcXVlbmNlKSA8PSAoMTw8MjMpKSk7CiAJCiAJKnNlcXVlbmNlID0gY3VyX3ZibGFuazsKQEAgLTE0MSw2ICsyNTIsMTYgQEAKIH0KIAogCitpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJcmV0dXJuIGk5MTVfZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsICZkZXYtPnZibF9yZWNlaXZlZCk7Cit9CisKK2ludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdDIoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJcmV0dXJuIGk5MTVfZHJpdmVyX3ZibGFua19kb193YWl0KGRldiwgc2VxdWVuY2UsICZkZXYtPnZibF9yZWNlaXZlZDIpOworfQorCiAvKiBOZWVkcyB0aGUgbG9jayBhcyBpdCB0b3VjaGVzIHRoZSByaW5nLgogICovCiBpbnQgaTkxNV9pcnFfZW1pdChEUk1fSU9DVExfQVJHUykKQEAgLTE4OSw3ICszMTAsNyBAQAogCXJldHVybiBpOTE1X3dhaXRfaXJxKGRldiwgaXJxd2FpdC5pcnFfc2VxKTsKIH0KIAotc3RhdGljIGludCBpOTE1X2VuYWJsZV9pbnRlcnJ1cHQgKGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIHZvaWQgaTkxNV9lbmFibGVfaW50ZXJydXB0IChkcm1fZGV2aWNlX3QgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiBmbGFnOwpAQCAtMTk5LDEzICszMjAsOCBAQAogCQlmbGFnIHw9IFZTWU5DX1BJUEVBX0ZMQUc7CiAJaWYgKGRldl9wcml2LT52YmxhbmtfcGlwZSAmIERSTV9JOTE1X1ZCTEFOS19QSVBFX0IpCiAJCWZsYWcgfD0gVlNZTkNfUElQRUJfRkxBRzsKLQlpZiAoZGV2X3ByaXYtPnZibGFua19waXBlICYgfihEUk1fSTkxNV9WQkxBTktfUElQRV9BfERSTV9JOTE1X1ZCTEFOS19QSVBFX0IpKSB7Ci0JCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggaW52YWxpZCBwaXBlIDB4JXhcbiIsCi0JCQkgIF9fRlVOQ1RJT05fXywgZGV2X3ByaXYtPnZibGFua19waXBlKTsKLQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKLQl9CisKIAlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfRU5BQkxFX1IsIFVTRVJfSU5UX0ZMQUcgfCBmbGFnKTsKLQlyZXR1cm4gMDsKIH0KIAogLyogU2V0IHRoZSB2YmxhbmsgbW9uaXRvciBwaXBlCkBAIC0yMjQsOCArMzQwLDE3IEBACiAJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHBpcGUsIChkcm1faTkxNV92YmxhbmtfcGlwZV90IF9fdXNlciAqKSBkYXRhLAogCQkJCSBzaXplb2YocGlwZSkpOwogCisJaWYgKHBpcGUucGlwZSAmIH4oRFJNX0k5MTVfVkJMQU5LX1BJUEVfQXxEUk1fSTkxNV9WQkxBTktfUElQRV9CKSkgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIGludmFsaWQgcGlwZSAweCV4XG4iLCAKKwkJCSAgX19GVU5DVElPTl9fLCBwaXBlLnBpcGUpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwogCWRldl9wcml2LT52YmxhbmtfcGlwZSA9IHBpcGUucGlwZTsKLQlyZXR1cm4gaTkxNV9lbmFibGVfaW50ZXJydXB0IChkZXYpOworCisJaTkxNV9lbmFibGVfaW50ZXJydXB0IChkZXYpOworCisJcmV0dXJuIDA7CiB9CiAKIGludCBpOTE1X3ZibGFua19waXBlX2dldChEUk1fSU9DVExfQVJHUykKQEAgLTI1MSw2ICszNzYsMTE4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogU2NoZWR1bGUgYnVmZmVyIHN3YXAgYXQgZ2l2ZW4gdmVydGljYWwgYmxhbmsuCisgKi8KK2ludCBpOTE1X3ZibGFua19zd2FwKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfdmJsYW5rX3N3YXBfdCBzd2FwOworCWRybV9pOTE1X3ZibF9zd2FwX3QgKnZibF9zd2FwOworCXVuc2lnbmVkIGludCBwaXBlLCBzZXF0eXBlLCBjdXJzZXE7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJaWYgKGRldl9wcml2LT5zYXJlYV9wcml2LT5yb3RhdGlvbikgeworCQlEUk1fREVCVUcoIlJvdGF0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChzd2FwLCAoZHJtX2k5MTVfdmJsYW5rX3N3YXBfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKHN3YXApKTsKKworCWlmIChzd2FwLnNlcXR5cGUgJiB+KF9EUk1fVkJMQU5LX1JFTEFUSVZFIHwgX0RSTV9WQkxBTktfQUJTT0xVVEUgfAorCQkJICAgICBfRFJNX1ZCTEFOS19TRUNPTkRBUlkgfCBfRFJNX1ZCTEFOS19ORVhUT05NSVNTKSkgeworCQlEUk1fRVJST1IoIkludmFsaWQgc2VxdWVuY2UgdHlwZSAweCV4XG4iLCBzd2FwLnNlcXR5cGUpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXBpcGUgPSAoc3dhcC5zZXF0eXBlICYgX0RSTV9WQkxBTktfU0VDT05EQVJZKSA/IDEgOiAwOworCisJc2VxdHlwZSA9IHN3YXAuc2VxdHlwZSAmIChfRFJNX1ZCTEFOS19SRUxBVElWRSB8IF9EUk1fVkJMQU5LX0FCU09MVVRFKTsKKworCWlmICghKGRldl9wcml2LT52YmxhbmtfcGlwZSAmICgxIDw8IHBpcGUpKSkgeworCQlEUk1fRVJST1IoIkludmFsaWQgcGlwZSAlZFxuIiwgcGlwZSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKworCWlmICghZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRldiwgc3dhcC5kcmF3YWJsZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kcndfbG9jaywgaXJxZmxhZ3MpOworCQlEUk1fRVJST1IoIkludmFsaWQgZHJhd2FibGUgSUQgJWRcbiIsIHN3YXAuZHJhd2FibGUpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKworCWN1cnNlcSA9IGF0b21pY19yZWFkKHBpcGUgPyAmZGV2LT52YmxfcmVjZWl2ZWQyIDogJmRldi0+dmJsX3JlY2VpdmVkKTsKKworCWlmIChzZXF0eXBlID09IF9EUk1fVkJMQU5LX1JFTEFUSVZFKQorCQlzd2FwLnNlcXVlbmNlICs9IGN1cnNlcTsKKworCWlmICgoY3Vyc2VxIC0gc3dhcC5zZXF1ZW5jZSkgPD0gKDE8PDIzKSkgeworCQlpZiAoc3dhcC5zZXF0eXBlICYgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykgeworCQkJc3dhcC5zZXF1ZW5jZSA9IGN1cnNlcSArIDE7CisJCX0gZWxzZSB7CisJCQlEUk1fREVCVUcoIk1pc3NlZCB0YXJnZXQgc2VxdWVuY2VcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+c3dhcHNfbG9jaywgaXJxZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2X3ByaXYtPnZibF9zd2Fwcy5oZWFkKSB7CisJCXZibF9zd2FwID0gbGlzdF9lbnRyeShsaXN0LCBkcm1faTkxNV92Ymxfc3dhcF90LCBoZWFkKTsKKworCQlpZiAodmJsX3N3YXAtPmRyd19pZCA9PSBzd2FwLmRyYXdhYmxlICYmCisJCSAgICB2Ymxfc3dhcC0+cGlwZSA9PSBwaXBlICYmCisJCSAgICB2Ymxfc3dhcC0+c2VxdWVuY2UgPT0gc3dhcC5zZXF1ZW5jZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnN3YXBzX2xvY2ssIGlycWZsYWdzKTsKKwkJCURSTV9ERUJVRygiQWxyZWFkeSBzY2hlZHVsZWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+c3dhcHNfbG9jaywgaXJxZmxhZ3MpOworCisJaWYgKGRldl9wcml2LT5zd2Fwc19wZW5kaW5nID49IDEwMCkgeworCQlEUk1fREVCVUcoIlRvbyBtYW55IHN3YXBzIHF1ZXVlZFxuIik7CisJCXJldHVybiBEUk1fRVJSKEVCVVNZKTsKKwl9CisKKwl2Ymxfc3dhcCA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKHZibF9zd2FwKSwgRFJNX01FTV9EUklWRVIpOworCisJaWYgKCF2Ymxfc3dhcCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gcXVldWUgc3dhcFxuIik7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfQorCisJRFJNX0RFQlVHKCJcbiIpOworCisJdmJsX3N3YXAtPmRyd19pZCA9IHN3YXAuZHJhd2FibGU7CisJdmJsX3N3YXAtPnBpcGUgPSBwaXBlOworCXZibF9zd2FwLT5zZXF1ZW5jZSA9IHN3YXAuc2VxdWVuY2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnN3YXBzX2xvY2ssIGlycWZsYWdzKTsKKworCWxpc3RfYWRkX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKil2Ymxfc3dhcCwgJmRldl9wcml2LT52Ymxfc3dhcHMuaGVhZCk7CisJZGV2X3ByaXYtPnN3YXBzX3BlbmRpbmcrKzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5zd2Fwc19sb2NrLCBpcnFmbGFncyk7CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1faTkxNV92Ymxhbmtfc3dhcF90IF9fdXNlciAqKSBkYXRhLCBzd2FwLAorCQkJICAgICAgIHNpemVvZihzd2FwKSk7CisKKwlyZXR1cm4gMDsKK30KKwogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwogdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCkBAIC0yNjYsNiArNTAzLDEyIEBACiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAorCWRldl9wcml2LT5zd2Fwc19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+dmJsX3N3YXBzLmhlYWQpOworCWRldl9wcml2LT5zd2Fwc19wZW5kaW5nID0gMDsKKworCWlmICghZGV2X3ByaXYtPnZibGFua19waXBlKQorCQlkZXZfcHJpdi0+dmJsYW5rX3BpcGUgPSBEUk1fSTkxNV9WQkxBTktfUElQRV9BOwogCWk5MTVfZW5hYmxlX2ludGVycnVwdChkZXYpOwogCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCmluZGV4IGUzMGY1NTYuLmJlNDlkYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX1BDSV9ETUEgfAogCSAgICBEUklWRVJfSEFWRV9ETUEgfCBEUklWRVJfSEFWRV9JUlEgfCBEUklWRVJfSVJRX1NIQVJFRCB8CiAJICAgIERSSVZFUl9JUlFfVkJMLAorCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9tZ2FfYnVmX3ByaXZfdCksCiAJLmxvYWQgPSBtZ2FfZHJpdmVyX2xvYWQsCiAJLnVubG9hZCA9IG1nYV9kcml2ZXJfdW5sb2FkLAogCS5sYXN0Y2xvc2UgPSBtZ2FfZHJpdmVyX2xhc3RjbG9zZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lvYzMyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9pb2MzMi5jCmluZGV4IDU0YTE4ZWIuLjMwZDAwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lvYzMyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfaW9jMzIuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfTUdBX0lOSVQsICh1bnNpZ25lZCBsb25nKWluaXQpOwogfQogCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkJCSAgJmdldHBhcmFtLT52YWx1ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX01HQV9HRVRQQVJBTSwgKHVuc2lnbmVkIGxvbmcpZ2V0cGFyYW0pOwogfQogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkgICAgfHwgX19wdXRfdXNlcihkbWFfYm9vdHN0cmFwMzIuYWdwX3NpemUsICZkbWFfYm9vdHN0cmFwLT5hZ3Bfc2l6ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJRFJNX0lPQ1RMX01HQV9ETUFfQk9PVFNUUkFQLAogCQkJKHVuc2lnbmVkIGxvbmcpZG1hX2Jvb3RzdHJhcCk7CiAJaWYgKGVycikKQEAgLTIyNCw3ICsyMjQsNyBAQAogCWlmIChmbiAhPSBOVUxMKQogCQlyZXQgPSAoKmZuKSAoZmlscCwgY21kLCBhcmcpOwogCWVsc2UKLQkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJCXJldCA9IGRybV9pb2N0bChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMKaW5kZXggOWRkNmQ0MS4uZDNjYjY3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAkJCSAgJmluaXQtPmFncF90ZXh0dXJlc19vZmZzZXQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9SMTI4X0lOSVQsICh1bnNpZ25lZCBsb25nKWluaXQpOwogfQogCkBAIC0xMjksNyArMTI5LDcgQEAKIAkJCSAgJmRlcHRoLT5tYXNrKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfUjEyOF9ERVBUSCwgKHVuc2lnbmVkIGxvbmcpZGVwdGgpOwogCiB9CkBAIC0xNTMsNyArMTUzLDcgQEAKIAkJCSAgJnN0aXBwbGUtPm1hc2spKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9SMTI4X1NUSVBQTEUsICh1bnNpZ25lZCBsb25nKXN0aXBwbGUpOwogfQogCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJCSAgJmdldHBhcmFtLT52YWx1ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX1IxMjhfR0VUUEFSQU0sICh1bnNpZ25lZCBsb25nKWdldHBhcmFtKTsKIH0KIApAQCAtMjE0LDcgKzIxNCw3IEBACiAJaWYgKGZuICE9IE5VTEwpCiAJCXJldCA9ICgqZm4pIChmaWxwLCBjbWQsIGFyZyk7CiAJZWxzZQotCQlyZXQgPSBkcm1faW9jdGwoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbHAsIGNtZCwgYXJnKTsKKwkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbHAsIGNtZCwgYXJnKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCmluZGV4IDI2YmRmMmMuLmQxNDQ3N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKQEAgLTUzOCw2ICs1MzgsMzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfZW1pdF9pbmR4X2J1ZmZlcihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCSAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCit7CisJdTMyICpjbWQgPSAodTMyICopIGNtZGJ1Zi0+YnVmOworCWludCBjb3VudCwgcmV0OworCVJJTkdfTE9DQUxTOworCisJY291bnQ9KGNtZFswXT4+MTYpICYgMHgzZmZmOworCisJaWYgKChjbWRbMV0gJiAweDgwMDBmZmZmKSAhPSAweDgwMDAwODEwKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBpbmR4X2J1ZmZlciByZWcgYWRkcmVzcyAlMDhYXG4iLCBjbWRbMV0pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlyZXQgPSByMzAwX2NoZWNrX29mZnNldChkZXZfcHJpdiwgY21kWzJdKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBpbmR4X2J1ZmZlciBvZmZzZXQgaXMgJTA4WFxuIiwgY21kWzJdKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlCRUdJTl9SSU5HKGNvdW50KzIpOworCU9VVF9SSU5HKGNtZFswXSk7CisJT1VUX1JJTkdfVEFCTEUoKGludCAqKShjbWRidWYtPmJ1ZiArIDQpLCBjb3VudCArIDEpOworCUFEVkFOQ0VfUklORygpOworCisJY21kYnVmLT5idWYgKz0gKGNvdW50KzIpKjQ7CisJY21kYnVmLT5idWZzeiAtPSAoY291bnQrMikqNDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgcjMwMF9lbWl0X3Jhd19wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKIAkJCQkJICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQogewpAQCAtNTc4LDEwICs2MDgsMTEgQEAKIAljYXNlIFJBREVPTl9DTlRMX0JJVEJMVF9NVUxUSToKIAkJcmV0dXJuIHIzMDBfZW1pdF9iaXRibHRfbXVsdGkoZGV2X3ByaXYsIGNtZGJ1Zik7CiAKKwljYXNlIFJBREVPTl9DUF9JTkRYX0JVRkZFUjoJLyogRFJBV19JTkRYXzIgd2l0aG91dCBJTkRYX0JVRkZFUiBzZWVtcyB0byBsb2NrIHVwIHRoZSBncHUgKi8KKwkJcmV0dXJuIHIzMDBfZW1pdF9pbmR4X2J1ZmZlcihkZXZfcHJpdiwgY21kYnVmKTsKIAljYXNlIFJBREVPTl9DUF8zRF9EUkFXX0lNTURfMjoJLyogdHJpZ2dlcnMgZHJhd2luZyB1c2luZyBpbi1wYWNrZXQgdmVydGV4IGRhdGEgKi8KIAljYXNlIFJBREVPTl9DUF8zRF9EUkFXX1ZCVUZfMjoJLyogdHJpZ2dlcnMgZHJhd2luZyBvZiB2ZXJ0ZXggYnVmZmVycyBzZXR1cCBlbHNld2hlcmUgKi8KIAljYXNlIFJBREVPTl9DUF8zRF9EUkFXX0lORFhfMjoJLyogdHJpZ2dlcnMgZHJhd2luZyB1c2luZyBpbmRpY2VzIHRvIHZlcnRleCBidWZmZXIgKi8KLQljYXNlIFJBREVPTl9DUF9JTkRYX0JVRkZFUjoJLyogRFJBV19JTkRYXzIgd2l0aG91dCBJTkRYX0JVRkZFUiBzZWVtcyB0byBsb2NrIHVwIHRoZSBncHUgKi8KIAljYXNlIFJBREVPTl9XQUlUX0ZPUl9JRExFOgogCWNhc2UgUkFERU9OX0NQX05PUDoKIAkJLyogdGhlc2UgcGFja2V0cyBhcmUgc2FmZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lvYzMyLmMKaW5kZXggMGNjZmQzNjEuLjFmMWY5Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lvYzMyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faW9jMzIuYwpAQCAtOTIsNyArOTIsNyBAQAogCQkJICAmaW5pdC0+Z2FydF90ZXh0dXJlc19vZmZzZXQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9SQURFT05fQ1BfSU5JVCwgKHVuc2lnbmVkIGxvbmcpaW5pdCk7CiB9CiAKQEAgLTEyNSw3ICsxMjUsNyBAQAogCQkJICAmY2xyLT5kZXB0aF9ib3hlcykpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX1JBREVPTl9DTEVBUiwgKHVuc2lnbmVkIGxvbmcpY2xyKTsKIH0KIApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCQkgICZyZXF1ZXN0LT5tYXNrKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfUkFERU9OX1NUSVBQTEUsICh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOwogfQogCkBAIC0yMDQsNyArMjA0LDcgQEAKIAkJCSAgJmltYWdlLT5kYXRhKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSBEUk1fSU9DVExfUkFERU9OX1RFWFRVUkUsICh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOwogfQogCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJCSAgJnJlcXVlc3QtPnByaW0pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9SQURFT05fVkVSVEVYMiwgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiAKQEAgLTI2OCw3ICsyNjgsNyBAQAogCQkJICAmcmVxdWVzdC0+Ym94ZXMpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLAogCQkJIERSTV9JT0NUTF9SQURFT05fQ01EQlVGLCAodW5zaWduZWQgbG9uZylyZXF1ZXN0KTsKIH0KIApAQCAtMjkzLDcgKzI5Myw3IEBACiAJCQkgICZyZXF1ZXN0LT52YWx1ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX1JBREVPTl9HRVRQQVJBTSwgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiAKQEAgLTMyMiw3ICszMjIsNyBAQAogCQkJICAmcmVxdWVzdC0+cmVnaW9uX29mZnNldCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX1JBREVPTl9BTExPQywgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiAKQEAgLTM0NSw3ICszNDUsNyBAQAogCQkJICAmcmVxdWVzdC0+aXJxX3NlcSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsCiAJCQkgRFJNX0lPQ1RMX1JBREVPTl9JUlFfRU1JVCwgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7CiB9CiAKQEAgLTM4Niw3ICszODYsNyBAQAogCWlmIChmbiAhPSBOVUxMKQogCQlyZXQgPSAoKmZuKSAoZmlscCwgY21kLCBhcmcpOwogCWVsc2UKLQkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJCXJldCA9IGRybV9pb2N0bChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCmluZGV4IGZlYWM1ZjAuLjZlMDRmZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpAQCAtMjc1LDYgKzI3NSw4IEBACiAJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqY21kc3opCiB7CiAJdTMyICpjbWQgPSAodTMyICopIGNtZGJ1Zi0+YnVmOworCXUzMiBvZmZzZXQsIG5hcnJheXM7CisJaW50IGNvdW50LCBpLCBrOwogCiAJKmNtZHN6ID0gMiArICgoY21kWzBdICYgUkFERU9OX0NQX1BBQ0tFVF9DT1VOVF9NQVNLKSA+PiAxNik7CiAKQEAgLTI4OCwxMCArMjkwLDEwNiBAQAogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCS8qIENoZWNrIGNsaWVudCBzdGF0ZSBhbmQgZml4IGl0IHVwIGlmIG5lY2Vzc2FyeSAqLwotCWlmIChjbWRbMF0gJiAweDgwMDApIHsJLyogTVNCIG9mIG9wY29kZTogbmV4dCBEV09SRCBHVUlfQ05UTCAqLwotCQl1MzIgb2Zmc2V0OworCXN3aXRjaChjbWRbMF0gJiAweGZmMDApIHsKKwkvKiBYWFggQXJlIHRoZXJlIG9sZCBkcml2ZXJzIG5lZWRpbmcgb3RoZXIgcGFja2V0cz8gKi8KIAorCWNhc2UgUkFERU9OXzNEX0RSQVdfSU1NRDoKKwljYXNlIFJBREVPTl8zRF9EUkFXX1ZCVUY6CisJY2FzZSBSQURFT05fM0RfRFJBV19JTkRYOgorCWNhc2UgUkFERU9OX1dBSVRfRk9SX0lETEU6CisJY2FzZSBSQURFT05fQ1BfTk9QOgorCWNhc2UgUkFERU9OXzNEX0NMRUFSX1pNQVNLOgorLyoJY2FzZSBSQURFT05fQ1BfTkVYVF9DSEFSOgorCWNhc2UgUkFERU9OX0NQX1BMWV9ORVhUU0NBTjoKKwljYXNlIFJBREVPTl9DUF9TRVRfU0NJU1NPUlM6ICovIC8qIHByb2JhYmx5IHNhZmUgYnV0IHdpbGwgbmV2ZXIgbmVlZCB0aGVtPyAqLworCQkvKiB0aGVzZSBwYWNrZXRzIGFyZSBzYWZlICovCisJCWJyZWFrOworCisJY2FzZSBSQURFT05fQ1BfM0RfRFJBV19JTU1EXzI6CisJY2FzZSBSQURFT05fQ1BfM0RfRFJBV19WQlVGXzI6CisJY2FzZSBSQURFT05fQ1BfM0RfRFJBV19JTkRYXzI6CisJY2FzZSBSQURFT05fM0RfQ0xFQVJfSElaOgorCQkvKiBzYWZlIGJ1dCByMjAwIG9ubHkgKi8KKwkJaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbiAhPSBVQ09ERV9SMjAwKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgM2QgcGFja2V0IGZvciByMTAwLWNsYXNzIGNoaXBcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OXzNEX0xPQURfVkJQTlRSOgorCQljb3VudCA9IChjbWRbMF0gPj4gMTYpICYgMHgzZmZmOworCisJCWlmIChjb3VudCA+IDE4KSB7IC8qIDEyIGFycmF5cyBtYXggKi8KKwkJCURSTV9FUlJPUigiVG9vIGxhcmdlIHBheWxvYWQgaW4gM0RfTE9BRF9WQlBOVFIgKGNvdW50PSVkKVxuIiwKKwkJCQkgIGNvdW50KTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCX0KKworCQkvKiBjYXJlZnVsbHkgY2hlY2sgcGFja2V0IGNvbnRlbnRzICovCisJCW5hcnJheXMgPSBjbWRbMV0gJiB+MHhjMDAwOworCQlrID0gMDsKKwkJaSA9IDI7CisJCXdoaWxlICgoayA8IG5hcnJheXMpICYmIChpIDwgKGNvdW50ICsgMikpKSB7CisJCQlpKys7CQkvKiBza2lwIGF0dHJpYnV0ZSBmaWVsZCAqLworCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsICZjbWRbaV0pKSB7CisJCQkJRFJNX0VSUk9SCisJCQkJICAgICgiSW52YWxpZCBvZmZzZXQgKGs9JWQgaT0lZCkgaW4gM0RfTE9BRF9WQlBOVFIgcGFja2V0LlxuIiwKKwkJCQkgICAgIGssIGkpOworCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQl9CisJCQlrKys7CisJCQlpKys7CisJCQlpZiAoayA9PSBuYXJyYXlzKQorCQkJCWJyZWFrOworCQkJLyogaGF2ZSBvbmUgbW9yZSB0byBwcm9jZXNzLCB0aGV5IGNvbWUgaW4gcGFpcnMgKi8KKwkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LCAmY21kW2ldKSkgeworCQkJCURSTV9FUlJPUgorCQkJCSAgICAoIkludmFsaWQgb2Zmc2V0IChrPSVkIGk9JWQpIGluIDNEX0xPQURfVkJQTlRSIHBhY2tldC5cbiIsCisJCQkJICAgICBrLCBpKTsKKwkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJfQorCQkJaysrOworCQkJaSsrOworCQl9CisJCS8qIGRvIHRoZSBjb3VudHMgbWF0Y2ggd2hhdCB3ZSBleHBlY3QgPyAqLworCQlpZiAoKGsgIT0gbmFycmF5cykgfHwgKGkgIT0gKGNvdW50ICsgMikpKSB7CisJCQlEUk1fRVJST1IKKwkJCSAgICAoIk1hbGZvcm1lZCAzRF9MT0FEX1ZCUE5UUiBwYWNrZXQgKGs9JWQgaT0lZCBuYXJyYXlzPSVkIGNvdW50KzE9JWQpLlxuIiwKKwkJCSAgICAgIGssIGksIG5hcnJheXMsIGNvdW50ICsgMSk7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNOgorCQlpZiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uICE9IFVDT0RFX1IxMDApIHsKKwkJCURSTV9FUlJPUigiSW52YWxpZCAzZCBwYWNrZXQgZm9yIHIyMDAtY2xhc3MgY2hpcFxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LCAmY21kWzFdKSkgeworCQkJCURSTV9FUlJPUigiSW52YWxpZCBybmRyX2dlbl9pbmR4IG9mZnNldFxuIik7CisJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OX0NQX0lORFhfQlVGRkVSOgorCQlpZiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uICE9IFVDT0RFX1IyMDApIHsKKwkJCURSTV9FUlJPUigiSW52YWxpZCAzZCBwYWNrZXQgZm9yIHIxMDAtY2xhc3MgY2hpcFxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWlmICgoY21kWzFdICYgMHg4MDAwZmZmZikgIT0gMHg4MDAwMDgxMCkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGluZHhfYnVmZmVyIHJlZyBhZGRyZXNzICUwOFhcbiIsIGNtZFsxXSk7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQl9CisJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LCAmY21kWzJdKSkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGluZHhfYnVmZmVyIG9mZnNldCBpcyAlMDhYXG4iLCBjbWRbMl0pOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OX0NOVExfSE9TVERBVEFfQkxUOgorCWNhc2UgUkFERU9OX0NOVExfUEFJTlRfTVVMVEk6CisJY2FzZSBSQURFT05fQ05UTF9CSVRCTFRfTVVMVEk6CisJCS8qIE1TQiBvZiBvcGNvZGU6IG5leHQgRFdPUkQgR1VJX0NOVEwgKi8KIAkJaWYgKGNtZFsxXSAmIChSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTAogCQkJICAgICAgfCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCkpIHsKIAkJCW9mZnNldCA9IGNtZFsyXSA8PCAxMDsKQEAgLTMxMyw2ICs0MTEsMTEgQEAKIAkJCX0KIAkJCWNtZFszXSA9IChjbWRbM10gJiAweGZmYzAwMDAwKSB8IG9mZnNldCA+PiAxMDsKIAkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiSW52YWxpZCBwYWNrZXQgdHlwZSAleFxuIiwgY21kWzBdICYgMHhmZjAwKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKaW5kZXggNTljNzUyMC4uYTlhODRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfYmNpLmMKQEAgLTcyOCw2ICs3MjgsNyBAQAogCQlkZXZfcHJpdi0+c3RhdHVzID0gTlVMTDsKIAl9CiAJaWYgKGRldl9wcml2LT5kbWFfdHlwZSA9PSBTQVZBR0VfRE1BX0FHUCAmJiBpbml0LT5idWZmZXJzX29mZnNldCkgeworCQlkZXYtPmFncF9idWZmZXJfdG9rZW4gPSBpbml0LT5idWZmZXJzX29mZnNldDsKIAkJZGV2LT5hZ3BfYnVmZmVyX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LAogCQkJCQkJICAgICAgIGluaXQtPmJ1ZmZlcnNfb2Zmc2V0KTsKIAkJaWYgKCFkZXYtPmFncF9idWZmZXJfbWFwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYwppbmRleCBlZjI1ODFkLi4xY2ExZTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKQEAgLTk5NCw3ICs5OTQsNyBAQAogCWlmIChjbWRidWYuc2l6ZSkgewogCQlrY21kX2FkZHIgPSBkcm1fYWxsb2MoY21kYnVmLnNpemUgKiA4LCBEUk1fTUVNX0RSSVZFUik7CiAJCWlmIChrY21kX2FkZHIgPT0gTlVMTCkKLQkJCXJldHVybiBFTk9NRU07CisJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwogCiAJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoa2NtZF9hZGRyLCBjbWRidWYuY21kX2FkZHIsCiAJCQkJICAgICAgIGNtZGJ1Zi5zaXplICogOCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMKaW5kZXggNjBjMTY5NS4uODA2ZjljZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuYwpAQCAtNTAwLDkgKzUwMCw5IEBACiAKIAogc3RhdGljIHZvaWQgCi12aWFfZG1hYmxpdF93b3JrcXVldWUodm9pZCAqZGF0YSkKK3ZpYV9kbWFibGl0X3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IChkcm1fdmlhX2JsaXRxX3QgKikgZGF0YTsKKwlkcm1fdmlhX2JsaXRxX3QgKmJsaXRxID0gY29udGFpbmVyX29mKHdvcmssIGRybV92aWFfYmxpdHFfdCwgd3EpOwogCWRybV9kZXZpY2VfdCAqZGV2ID0gYmxpdHEtPmRldjsKIAl1bnNpZ25lZCBsb25nIGlycXNhdmU7CiAJZHJtX3ZpYV9zZ19pbmZvX3QgKmN1cl9zZzsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCQkJRFJNX0lOSVRfV0FJVFFVRVVFKGJsaXRxLT5ibGl0X3F1ZXVlICsgaik7CiAJCX0KIAkJRFJNX0lOSVRfV0FJVFFVRVVFKCZibGl0cS0+YnVzeV9xdWV1ZSk7Ci0JCUlOSVRfV09SSygmYmxpdHEtPndxLCB2aWFfZG1hYmxpdF93b3JrcXVldWUsIGJsaXRxKTsKKwkJSU5JVF9XT1JLKCZibGl0cS0+d3EsIHZpYV9kbWFibGl0X3dvcmtxdWV1ZSk7CiAJCWluaXRfdGltZXIoJmJsaXRxLT5wb2xsX3RpbWVyKTsKIAkJYmxpdHEtPnBvbGxfdGltZXIuZnVuY3Rpb24gPSAmdmlhX2RtYWJsaXRfdGltZXI7CiAJCWJsaXRxLT5wb2xsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYmxpdHE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHNwNTZrLmMgYi9kcml2ZXJzL2NoYXIvZHNwNTZrLmMKaW5kZXggOWIxYmY2MC4uMDZmMmRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RzcDU2ay5jCisrKyBiL2RyaXZlcnMvY2hhci9kc3A1NmsuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiBzdGF0aWMgc3NpemVfdCBkc3A1NmtfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCQkJICAgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CiAKIAlzd2l0Y2goZGV2KQpAQCAtMjY0LDcgKzI2NCw3IEBACiBzdGF0aWMgc3NpemVfdCBkc3A1Nmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCSAgICBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBkZXYgPSBpbWlub3IoaW5vZGUpICYgMHgwZjsKIAogCXN3aXRjaChkZXYpCkBAIC00MjAsNyArNDIwLDcgQEAKICNpZiAwCiBzdGF0aWMgdW5zaWduZWQgaW50IGRzcDU2a19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewotCWludCBkZXYgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpICYgMHgwZjsKKwlpbnQgZGV2ID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpICYgMHgwZjsKIAogCXN3aXRjaChkZXYpCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2R0bGsuYyBiL2RyaXZlcnMvY2hhci9kdGxrLmMKaW5kZXggNWU4MmMzYi4uZDQwMDVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2R0bGsuYworKysgYi9kcml2ZXJzL2NoYXIvZHRsay5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIHN0YXRpYyBzc2l6ZV90IGR0bGtfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0JdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJY2hhciBjaDsKIAlpbnQgaSA9IDAsIHJldHJpZXM7CiAKQEAgLTE3NCw3ICsxNzQsNyBAQAogCX0KICNlbmRpZgogCi0JaWYgKGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgIT0gRFRMS19NSU5PUikKKwlpZiAoaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpICE9IERUTEtfTUlOT1IpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJd2hpbGUgKDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lcGNhLmMgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCmluZGV4IGMzZjk1NTguLmEwZjgyMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9lcGNhLmMKKysrIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpAQCAtMTk5LDggKzE5OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgaW50IGluZm9faW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwKICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyB2b2lkIHBjX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCB0ZXJtaW9zICopOwotc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICopOworc3RhdGljIHZvaWQgcGNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGt0ZXJtaW9zICopOworc3RhdGljIHZvaWQgZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgcGNfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIHBjX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICopOwogc3RhdGljIHZvaWQgcGNfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwpAQCAtMTE1Nyw2ICsxMTU3LDcgQEAKIAlpbnQgY3JkOwogCXN0cnVjdCBib2FyZF9pbmZvICpiZDsKIAl1bnNpZ25lZCBjaGFyIGJvYXJkX2lkID0gMDsKKwlpbnQgZXJyID0gLUVOT01FTTsKIAogCWludCBwY2lfYm9hcmRzX2ZvdW5kLCBwY2lfY291bnQ7CiAKQEAgLTExNjQsMTMgKzExNjUsMTEgQEAKIAogCXBjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoTUFYX0FMTE9DKTsKIAlpZiAoIXBjX2RyaXZlcikKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0MTsKIAogCXBjX2luZm8gPSBhbGxvY190dHlfZHJpdmVyKE1BWF9BTExPQyk7Ci0JaWYgKCFwY19pbmZvKSB7Ci0JCXB1dF90dHlfZHJpdmVyKHBjX2RyaXZlcik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAoIXBjX2luZm8pCisJCWdvdG8gb3V0MjsKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCUlmIGVwY2Ffc2V0dXAgaGFzIG5vdCBiZWVuIHJhbiBieSBMSUxPIHNldCBudW1fY2FyZHMgdG8gZGVmYXVsdHM7IGNvcHkKQEAgLTEyMzcsNiArMTIzNiw4IEBACiAJcGNfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vZmxhZyA9IDA7CiAJcGNfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBDTE9DQUwgfCBIVVBDTDsKIAlwY19kcml2ZXItPmluaXRfdGVybWlvcy5jX2xmbGFnID0gMDsKKwlwY19kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7CisJcGNfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOwogCXBjX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwogCXR0eV9zZXRfb3BlcmF0aW9ucyhwY19kcml2ZXIsICZwY19vcHMpOwogCkBAIC0xMjUxLDYgKzEyNTIsOCBAQAogCXBjX2luZm8tPmluaXRfdGVybWlvcy5jX29mbGFnID0gMDsKIAlwY19pbmZvLT5pbml0X3Rlcm1pb3MuY19sZmxhZyA9IDA7CiAJcGNfaW5mby0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0w7CisJcGNfaW5mby0+aW5pdF90ZXJtaW9zLmNfaXNwZWVkID0gOTYwMDsKKwlwY19pbmZvLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOwogCXBjX2luZm8tPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKIAl0dHlfc2V0X29wZXJhdGlvbnMocGNfaW5mbywgJmluZm9fb3BzKTsKIApAQCAtMTM3MCwxMSArMTM3MywxNyBAQAogCiAJfSAvKiBFbmQgZm9yIGVhY2ggY2FyZCAqLwogCi0JaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIocGNfZHJpdmVyKSkKLQkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIERpZ2kgUEMvIGRyaXZlciIpOworCWVyciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIocGNfZHJpdmVyKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgcmVnaXN0ZXIgRGlnaSBQQy8gZHJpdmVyIik7CisJCWdvdG8gb3V0MzsKKwl9CiAKLQlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihwY19pbmZvKSkKLQkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIERpZ2kgUEMvIGluZm8gIik7CisJZXJyID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihwY19pbmZvKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgcmVnaXN0ZXIgRGlnaSBQQy8gaW5mbyAiKTsKKwkJZ290byBvdXQ0OworCX0KIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgICBTdGFydCB1cCB0aGUgcG9sbGVyIHRvIGNoZWNrIGZvciBldmVudHMgb24gYWxsIGVuYWJsZWQgYm9hcmRzCkBAIC0xMzg1LDYgKzEzOTQsMTUgQEAKIAltb2RfdGltZXIoJmVwY2FfdGltZXIsIGppZmZpZXMgKyBIWi8yNSk7CiAJcmV0dXJuIDA7CiAKK291dDQ6CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHBjX2RyaXZlcik7CitvdXQzOgorCXB1dF90dHlfZHJpdmVyKHBjX2luZm8pOworb3V0MjoKKwlwdXRfdHR5X2RyaXZlcihwY19kcml2ZXIpOworb3V0MToKKwlyZXR1cm4gZXJyOworCiB9IC8qIEVuZCBwY19pbml0ICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwb3N0X2ZlcF9pbml0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDkxLDcgKzE1MDksNyBAQAogCiAJCWNoLT5icmRjaGFuICAgICAgICA9IGJjOwogCQljaC0+bWFpbGJveCAgICAgICAgPSBnZDsgCi0JCUlOSVRfV09SSygmY2gtPnRxdWV1ZSwgZG9fc29mdGludCwgY2gpOworCQlJTklUX1dPUksoJmNoLT50cXVldWUsIGRvX3NvZnRpbnQpOwogCQljaC0+Ym9hcmQgICAgICAgICAgPSAmYm9hcmRzW2NyZF07CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmVwY2FfbG9jaywgZmxhZ3MpOwpAQCAtMTk4NSw3ICsyMDAzLDcgQEAKIHsgLyogQmVnaW4gZXBjYXBhcmFtICovCiAKIAl1bnNpZ25lZCBpbnQgY21kSGVhZDsKLQlzdHJ1Y3QgdGVybWlvcyAqdHM7CisJc3RydWN0IGt0ZXJtaW9zICp0czsKIAlzdHJ1Y3QgYm9hcmRfY2hhbiBfX2lvbWVtICpiYzsKIAl1bnNpZ25lZCBtdmFsLCBoZmxvdywgY2ZsYWcsIGlmbGFnOwogCkBAIC0yMTAwLDcgKzIxMTgsNyBAQAogeyAvKiBCZWdpbiByZWNlaXZlX2RhdGEgKi8KIAogCXVuY2hhciAqcnB0cjsKLQlzdHJ1Y3QgdGVybWlvcyAqdHMgPSBOVUxMOworCXN0cnVjdCBrdGVybWlvcyAqdHMgPSBOVUxMOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IGJvYXJkX2NoYW4gX19pb21lbSAqYmM7CiAJaW50IGRhdGFUb1JlYWQsIHdyYXBnYXAsIGJ5dGVzQXZhaWxhYmxlOwpAQCAtMjM0OCwxMiArMjM2NiwxNCBAQAogCXN3aXRjaCAoY21kKSAKIAl7IC8qIEJlZ2luIHN3aXRjaCBjbWQgKi8KIAorI2lmIDAJLyogSGFuZGxlZCBieSBjYWxsaW5nIGxheWVyIHByb3Blcmx5ICovCiAJCWNhc2UgVENHRVRTOgotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCB0dHktPnRlcm1pb3MsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpKQorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCB0dHktPnRlcm1pb3MsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAwOwogCQljYXNlIFRDR0VUQToKIAkJCXJldHVybiBnZXRfdGVybWlvKHR0eSwgYXJncCk7CisjZW5kaWYKIAkJY2FzZSBUQ1NCUks6CS8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLwogCQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwogCQkJaWYgKHJldHZhbCkKQEAgLTI1MjIsNyArMjU0Miw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBwY19zZXRfdGVybWlvcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHZvaWQgcGNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgcGNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsgLyogQmVnaW4gcGNfc2V0X3Rlcm1pb3MgKi8KIAogCXN0cnVjdCBjaGFubmVsICpjaDsKQEAgLTI1NTIsOSArMjU3Miw5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCZWdpbiBkb19zb2Z0aW50ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZCBkb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKQorc3RhdGljIHZvaWQgZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7IC8qIEJlZ2luIGRvX3NvZnRpbnQgKi8KLQlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSAoc3RydWN0IGNoYW5uZWwgKikgcHJpdmF0ZV87CisJc3RydWN0IGNoYW5uZWwgKmNoID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjaGFubmVsLCB0cXVldWUpOwogCS8qIENhbGxlZCBpbiByZXNwb25zZSB0byBhIG1vZGVtIGNoYW5nZSBldmVudCAqLwogCWlmIChjaCAmJiBjaC0+bWFnaWMgPT0gRVBDQV9NQUdJQykgIHsgLyogQmVnaW4gRVBDQV9NQUdJQyAqLwogCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gY2gtPnR0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lc3AuYyBiL2RyaXZlcnMvY2hhci9lc3AuYwppbmRleCAxNWE0ZWE4Li5kMWJmYmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXNwLmMKKysrIGIvZHJpdmVycy9jaGFyL2VzcC5jCkBAIC03MjMsOSArNzIzLDEwIEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAotc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBlc3Bfc3RydWN0CSppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopIHByaXZhdGVfOworCXN0cnVjdCBlc3Bfc3RydWN0CSppbmZvID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlc3Bfc3RydWN0LCB0cXVldWUpOwogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAJCiAJdHR5ID0gaW5mby0+dHR5OwpAQCAtNzQ2LDkgKzc0NywxMCBAQAogICogCWRvX3NlcmlhbF9oYW5ndXAoKSAtPiB0dHktPmhhbmd1cCgpIC0+IGVzcF9oYW5ndXAoKQogICogCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3NlcmlhbF9oYW5ndXAodm9pZCAqcHJpdmF0ZV8pCitzdGF0aWMgdm9pZCBkb19zZXJpYWxfaGFuZ3VwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZXNwX3N0cnVjdAkqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKSBwcml2YXRlXzsKKwlzdHJ1Y3QgZXNwX3N0cnVjdAkqaW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXNwX3N0cnVjdCwgdHF1ZXVlX2hhbmd1cCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAkKIAl0dHkgPSBpbmZvLT50dHk7CkBAIC0xOTEzLDcgKzE5MTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCByc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBlc3Bfc3RydWN0ICppbmZvID0gKHN0cnVjdCBlc3Bfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjUwMSw4ICsyNTAzLDggQEAKIAkJaW5mby0+bWFnaWMgPSBFU1BfTUFHSUM7CiAJCWluZm8tPmNsb3NlX2RlbGF5ID0gNSpIWi8xMDsKIAkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAqSFo7Ci0JCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBkb19zb2Z0aW50LCBpbmZvKTsKLQkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWVfaGFuZ3VwLCBkb19zZXJpYWxfaGFuZ3VwLCBpbmZvKTsKKwkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWUsIGRvX3NvZnRpbnQpOworCQlJTklUX1dPUksoJmluZm8tPnRxdWV1ZV9oYW5ndXAsIGRvX3NlcmlhbF9oYW5ndXApOwogCQlpbmZvLT5jb25maWcucnhfdGltZW91dCA9IHJ4X3RpbWVvdXQ7CiAJCWluZm8tPmNvbmZpZy5mbG93X29uID0gZmxvd19vbjsKIAkJaW5mby0+Y29uZmlnLmZsb3dfb2ZmID0gZmxvd19vZmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY1MTg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLSMKLSMgRnRhcGUgY29uZmlndXJhdGlvbgotIwotY29uZmlnIFpGVEFQRQotCXRyaXN0YXRlICJaZnRhcGUsIHRoZSBWRlMgaW50ZXJmYWNlIgotCWRlcGVuZHMgb24gRlRBUEUKLQktLS1oZWxwLS0tCi0JICBOb3JtYWxseSwgeW91IHdhbnQgdG8gc2F5IFkgb3IgTS4gRE9OJ1Qgc2F5IE4gaGVyZSBvciB5b3UKLQkgIFdPTidUIEJFIEFCTEUgVE8gVVNFIFlPVVIgRkxPUFBZIFRBUEUgRFJJVkUuCi0KLQkgIFRoZSBmdGFwZSBtb2R1bGUgaXRzZWxmIG5vIGxvbmdlciBjb250YWlucyB0aGUgcm91dGluZXMgbmVjZXNzYXJ5Ci0JICB0byBpbnRlcmZhY2Ugd2l0aCB0aGUga2VybmVsIFZGUyBsYXllciAoaS5lLiB0byBhY3R1YWxseSB3cml0ZSBkYXRhCi0JICB0byBhbmQgcmVhZCBkYXRhIGZyb20gdGhlIHRhcGUgZHJpdmUpLiAgSW5zdGVhZCB0aGUgZmlsZSBzeXN0ZW0KLQkgIGludGVyZmFjZSAoaS5lLiB0aGUgaGFyZHdhcmUgaW5kZXBlbmRlbnQgcGFydCBvZiB0aGUgZHJpdmVyKSBoYXMKLQkgIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBtb2R1bGUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHpmdGFwZS4KLQotCSAgUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHlvdSBzYXkgWSBvciBNIGhlcmUsIGFuIGFkZGl0aW9uYWwgcnVudGltZQotCSAgbG9hZGFibGUgbW9kdWxlIGNhbGxlZCBgemZ0LWNvbXByZXNzb3InIHdoaWNoIGNvbnRhaW5zIGNvZGUgdG8KLQkgIHN1cHBvcnQgdXNlciB0cmFuc3BhcmVudCBvbi10aGUtZmx5IGNvbXByZXNzaW9uIGJhc2VkIG9uIFJvc3MKLQkgIFdpbGxpYW0ncyBsenJ3MyBhbGdvcml0aG0gd2lsbCBiZSBwcm9kdWNlZC4gIElmIHlvdSBoYXZlIGVuYWJsZWQgdGhlCi0JICBrZXJuZWwgbW9kdWxlIGxvYWRlciAoaS5lLiBoYXZlIHNhaWQgWSB0byAiS2VybmVsIG1vZHVsZSBsb2FkZXIKLQkgIHN1cHBvcnQiLCBhYm92ZSkgdGhlbiBgemZ0LWNvbXByZXNzb3InIHdpbGwgYmUgbG9hZGVkCi0JICBhdXRvbWF0aWNhbGx5IGJ5IHpmdGFwZSB3aGVuIG5lZWRlZC4KLQotCSAgRGVzcGl0ZSBpdHMgbmFtZSwgemZ0YXBlIGRvZXMgTk9UIHVzZSBjb21wcmVzc2lvbiBieSBkZWZhdWx0LgotCi1jb25maWcgWkZUX0RGTFRfQkxLX1NaCi0JaW50ICJEZWZhdWx0IGJsb2NrIHNpemUiCi0JZGVwZW5kcyBvbiBaRlRBUEUKLQlkZWZhdWx0ICIxMDI0MCIKLQktLS1oZWxwLS0tCi0JICBJZiB1bnN1cmUgbGVhdmUgdGhpcyBhdCBpdHMgZGVmYXVsdCB2YWx1ZSwgaS5lLiAxMDI0MC4gTm90ZSB0aGF0Ci0JICB5b3Ugc3BlY2lmeSBvbmx5IHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaGVyZS4gVGhlIGJsb2NrIHNpemUgY2FuIGJlCi0JICBjaGFuZ2VkIGF0IHJ1biB0aW1lIHVzaW5nIHRoZSBNVFNFVEJMSyB0YXBlIG9wZXJhdGlvbiB3aXRoIHRoZQotCSAgTVRJT0NUT1AgaW9jdGwgKGkuZS4gd2l0aCAibXQgLWYgL2Rldi9xZnQwIHNldGJsayAjQkxLU1oiIGZyb20gdGhlCi0JICBzaGVsbCBjb21tYW5kIGxpbmUpLgotCi0JICBUaGUgcHJvYmFibHkgbW9zdCBzdHJpa2luZyBkaWZmZXJlbmNlIGJldHdlZW4gemZ0YXBlIGFuZCBwcmV2aW91cwotCSAgdmVyc2lvbnMgb2YgZnRhcGUgaXMgdGhlIGZhY3QgdGhhdCBhbGwgZGF0YSBtdXN0IGJlIHdyaXR0ZW4gb3IgcmVhZAotCSAgaW4gbXVsdGlwbGVzIG9mIGEgZml4ZWQgYmxvY2sgc2l6ZS4gVGhlIGJsb2NrIHNpemUgZGVmYXVsdHMgdG8KLQkgIDEwMjQwIHdoaWNoIGlzIHdoYXQgR05VIHRhciB1c2VzLiBUaGUgdmFsdWVzIGZvciB0aGUgYmxvY2sgc2l6ZQotCSAgc2hvdWxkIGJlIGVpdGhlciAxIG9yIG11bHRpcGxlcyBvZiAxMDI0IHVwIHRvIGEgbWF4aW11bSB2YWx1ZSBvZgotCSAgNjM0ODggKGkuZS4gNjIgSykuIElmIHlvdSBzcGVjaWZ5IGAxJyB0aGVuIHpmdGFwZSdzIGJ1aWx0aW4KLQkgIGNvbXByZXNzaW9uIHdpbGwgYmUgZGlzYWJsZWQuCi0KLQkgIFJlYXNvbmFibGUgdmFsdWVzIGFyZSBgMTAyNDAnIChHTlUgdGFyJ3MgZGVmYXVsdCBibG9jayBzaXplKSwKLQkgIGA1MTIwJyAoYWZpbydzIGRlZmF1bHQgYmxvY2sgc2l6ZSksIGAzMjc2OCcgKGRlZmF1bHQgYmxvY2sgc2l6ZSBzb21lCi0JICBiYWNrdXAgcHJvZ3JhbXMgYXNzdW1lIGZvciBTQ1NJIHRhcGUgZHJpdmVzKSBvciBgMScgKG5vIHJlc3RyaWN0aW9uCi0JICBvbiBibG9jayBzaXplLCBidXQgZGlzYWJsZXMgYnVpbHRpbiBjb21wcmVzc2lvbikuCi0KLWNvbW1lbnQgIlRoZSBjb21wcmVzc29yIHdpbGwgYmUgYnVpbHQgYXMgYSBtb2R1bGUgb25seSEiCi0JZGVwZW5kcyBvbiBGVEFQRSAmJiBaRlRBUEUKLQotY29uZmlnIFpGVF9DT01QUkVTU09SCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIEZUQVBFIT1uICYmIFpGVEFQRSE9bgotCWRlZmF1bHQgbQotCi1jb25maWcgRlRfTlJfQlVGRkVSUwotCWludCAiTnVtYmVyIG9mIGZ0YXBlIGJ1ZmZlcnMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBGVEFQRSAmJiBFWFBFUklNRU5UQUwKLQlkZWZhdWx0ICIzIgotCWhlbHAKLQkgIFBsZWFzZSBsZWF2ZSB0aGlzIGF0IGAzJyB1bmxlc3MgeW91IFJFQUxMWSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KLQkgIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoaXMgdmFsdWUuIFZhbHVlcyBiZWxvdyAzIG1ha2UgdGhlCi0JICBwcm9wZXIgdXNlIG9mIGZ0YXBlIGltcG9zc2libGUsIHZhbHVlcyBncmVhdGVyIHRoYW4gMyBhcmUgYSB3YXN0ZSBvZgotCSAgbWVtb3J5LiBZb3UgY2FuIGNoYW5nZSB0aGUgYW1vdW50IG9mIERNQSBtZW1vcnkgdXNlZCBieSBmdGFwZSBhdAotCSAgcnVudGltZSB3aXRoICJtdCAtZiAvZGV2L3FmdDAgc2V0ZHJ2YnVmZmVyICNOVU1CVUZGRVJTIi4gRWFjaCBidWZmZXIKLQkgIHdhc3RlcyAzMiBLQiBvZiBtZW1vcnkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZW1vcnkgY2Fubm90IGJlCi0JICBzd2FwcGVkIG91dC4KLQotY29uZmlnIEZUX1BST0NfRlMKLQlib29sICJFbmFibGUgcHJvY2ZzIHN0YXR1cyByZXBvcnQgKCsya2IpIgotCWRlcGVuZHMgb24gRlRBUEUgJiYgUFJPQ19GUwotCS0tLWhlbHAtLS0KLQkgIE9wdGlvbmFsLiBTYXlpbmcgWSB3aWxsIHJlc3VsdCBpbiBjcmVhdGlvbiBvZiBhIGRpcmVjdG9yeQotCSAgYC9wcm9jL2Z0YXBlJyB1bmRlciB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0uIFRoZSBmaWxlcyBjYW4gYmUgdmlld2VkCi0JICB3aXRoIHlvdXIgZmF2b3JpdGUgcGFnZXIgKGkuZS4gdXNlICJtb3JlIC9wcm9jL2Z0YXBlL2hpc3RvcnkiIG9yCi0JICAibGVzcyAvcHJvYy9mdGFwZS9oaXN0b3J5IiBvciBzaW1wbHkgImNhdCAvcHJvYy9mdGFwZS9oaXN0b3J5IikuIFRoZQotCSAgZmlsZSB3aWxsIGNvbnRhaW4gc29tZSBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc2VydGVkCi0JICBjYXJ0cmlkZ2UsIHRoZSBrZXJuZWwgZHJpdmVyLCB5b3VyIHRhcGUgZHJpdmUsIHRoZSBmbG9wcHkgZGlzawotCSAgY29udHJvbGxlciBhbmQgdGhlIGVycm9yIGhpc3RvcnkgZm9yIHRoZSBtb3N0IHJlY2VudCB1c2Ugb2YgdGhlCi0JICBrZXJuZWwgZHJpdmVyLiBTYXlpbmcgWSB3aWxsIGVubGFyZ2UgdGhlIHNpemUgb2YgdGhlIGZ0YXBlIGRyaXZlcgotCSAgYnkgYXBwcm94aW1hdGVseSAyIEtCLgotCi0JICBXQVJOSU5HOiBXaGVuIGNvbXBpbGluZyBmdGFwZSBhcyBhIG1vZHVsZSAoaS5lLiBzYXlpbmcgTSB0byAiRmxvcHB5Ci0JICB0YXBlIGRyaXZlIikgaXQgaXMgZGFuZ2Vyb3VzIHRvIHVzZSBmdGFwZSdzIC9wcm9jIGZpbGUgc3lzdGVtCi0JICBpbnRlcmZhY2UuIEFjY2Vzc2luZyBgL3Byb2MvZnRhcGUnIHdoaWxlIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQgd2lsbAotCSAgcmVzdWx0IGluIGEga2VybmVsIE9vcHMuIFRoaXMgY2Fubm90IGJlIGZpeGVkIGZyb20gaW5zaWRlIGZ0YXBlLgotCi1jaG9pY2UKLQlwcm9tcHQgIkRlYnVnZ2luZyBvdXRwdXQiCi0JZGVwZW5kcyBvbiBGVEFQRQotCWRlZmF1bHQgRlRfTk9STUFMX0RFQlVHCi0KLWNvbmZpZyBGVF9OT1JNQUxfREVCVUcKLQlib29sICJOb3JtYWwiCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gY29udHJvbHMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IHRoZSBmdGFwZSBkcml2ZXIKLQkgIGlzIEFCTEUgdG8gcHJvZHVjZTsgaXQgZG9lcyBub3QgaW5jcmVhc2Ugb3IgZGltaW5pc2ggdGhlIGRlYnVnZ2luZwotCSAgbGV2ZWwgaXRzZWxmLiBJZiB1bnN1cmUsIGxlYXZlIHRoaXMgYXQgaXRzIGRlZmF1bHQgc2V0dGluZywKLQkgIGkuZS4gY2hvb3NlICJOb3JtYWwiLgotCi0JICBGdGFwZSBjYW4gcHJpbnQgbG90cyBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBjb25zb2xlCi0JICByZXNwLiBrZXJuZWwgbG9nIGZpbGVzLiBSZWR1Y2luZyB0aGUgYW1vdW50IG9mIHBvc3NpYmxlIGRlYnVnZ2luZwotCSAgb3V0cHV0IHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGtlcm5lbCBtb2R1bGUgYnkgc29tZSBLQiwgc28gaXQgbWlnaHQKLQkgIGJlIGEgZ29vZCBpZGVhIHRvIHVzZSAiTm9uZSIgZm9yIGVtZXJnZW5jeSBib290IGZsb3BwaWVzLgotCi0JICBJZiB5b3Ugd2FudCB0byBzYXZlIG1lbW9yeSB0aGVuIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgaXMKLQkgIHJlY29tbWVuZGVkOiBsZWF2ZSB0aGlzIG9wdGlvbiBhdCBpdHMgZGVmYXVsdCBzZXR0aW5nICJOb3JtYWwiIHVudGlsCi0JICB5b3Uga25vdyB0aGF0IHRoZSBkcml2ZXIgd29ya3MgYXMgZXhwZWN0ZWQsIGFmdGVyd2FyZHMgcmVjb25maWd1cmUKLQkgIHRoZSBrZXJuZWwsIHRoaXMgdGltZSBzcGVjaWZ5aW5nICJSZWR1Y2VkIiBvciAiTm9uZSIgYW5kIHJlY29tcGlsZQotCSAgYW5kIGluc3RhbGwgdGhlIGtlcm5lbCBhcyB1c3VhbC4gTm90ZSB0aGF0IGNob29zaW5nICJFeGNlc3NpdmUiCi0JICBkZWJ1Z2dpbmcgb3V0cHV0IGRvZXMgbm90IGluY3JlYXNlIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dAotCSAgcHJpbnRlZCB0byB0aGUgY29uc29sZSBidXQgb25seSBtYWtlcyBpdCBwb3NzaWJsZSB0byBwcm9kdWNlCi0JICAiRXhjZXNzaXZlIiBkZWJ1Z2dpbmcgb3V0cHV0LgotCi0JICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gZm9yIGEgc2hvcnQgZGVzY3JpcHRpb24KLQkgIGhvdyB0byBjb250cm9sIHRoZSBhbW91bnQgb2YgZGVidWdnaW5nIG91dHB1dC4KLQotY29uZmlnIEZUX0ZVTExfREVCVUcKLQlib29sICJFeGNlc3NpdmUiCi0JaGVscAotCSAgRXh0cmVtZWx5IHZlcmJvc2Ugb3V0cHV0IGZvciBkcml2ZXIgZGVidWdnaW5nIHB1cnBvc2VzLgotCi1jb25maWcgRlRfTk9fVFJBQ0UKLQlib29sICJSZWR1Y2VkIgotCWhlbHAKLQkgIFJlZHVjZWQgdGFwZSBkcml2ZXIgZGVidWdnaW5nIG91dHB1dC4KLQotY29uZmlnIEZUX05PX1RSQUNFX0FUX0FMTAotCWJvb2wgIk5vbmUiCi0JaGVscAotCSAgU3VwcHJlc3MgYWxsIGRlYnVnZ2luZyBvdXRwdXQgZnJvbSB0aGUgdGFwZSBkcml2ZS4KLQotZW5kY2hvaWNlCi0KLWNvbW1lbnQgIkhhcmR3YXJlIGNvbmZpZ3VyYXRpb24iCi0JZGVwZW5kcyBvbiBGVEFQRQotCi1jaG9pY2UKLQlwcm9tcHQgIkZsb3BweSB0YXBlIGNvbnRyb2xsZXJzIgotCWRlcGVuZHMgb24gRlRBUEUKLQlkZWZhdWx0IEZUX1NURF9GREMKLQotY29uZmlnIEZUX1NURF9GREMKLQlib29sICJTdGFuZGFyZCIKLQktLS1oZWxwLS0tCi0JICBPbmx5IGNoYW5nZSB0aGlzIHNldHRpbmcgaWYgeW91IGhhdmUgYSBzcGVjaWFsIGNvbnRyb2xsZXIuIElmIHlvdQotCSAgZGlkbid0IHBsdWcgYW55IGFkZC1vbiBjYXJkIGludG8geW91ciBjb21wdXRlciBzeXN0ZW0gYnV0IGp1c3QKLQkgIHBsdWdnZWQgdGhlIGZsb3BweSB0YXBlIGNhYmxlIGludG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgZmxvcHB5IGRyaXZlCi0JICBjb250cm9sbGVyIHRoZW4geW91IGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHNldHRpbmcsCi0JICBpLmUuIGNob29zZSAiU3RhbmRhcmQiLgotCi0JICBDaG9vc2UgIk1BQ0gtMiIgaWYgeW91IGhhdmUgYSBNb3VudGFpbiBNYWNoLTIgY29udHJvbGxlci4KLQkgIENob29zZSAiRkMtMTAvRkMtMjAiIGlmIHlvdSBoYXZlIGEgQ29sb3JhZG8gRkMtMTAgb3IgRkMtMjAKLQkgIGNvbnRyb2xsZXIuCi0JICBDaG9vc2UgIkFsdC84MjA3OCIgaWYgeW91IGhhdmUgYW5vdGhlciBjb250cm9sbGVyIHRoYXQgaXMgbG9jYXRlZCBhdAotCSAgYW4gSU8gYmFzZSBhZGRyZXNzIGRpZmZlcmVudCBmcm9tIHRoZSBzdGFuZGFyZCBmbG9wcHkgZHJpdmUKLQkgIGNvbnRyb2xsZXIncyBiYXNlIGFkZHJlc3Mgb2YgYDB4M2YwJywgb3IgdXNlcyBhbiBJUlEgKGludGVycnVwdCkKLQkgIGNoYW5uZWwgZGlmZmVyZW50IGZyb20gYDYnLCBvciBhIERNQSBjaGFubmVsIGRpZmZlcmVudCBmcm9tCi0JICBgMicuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBhbnkgY29udHJvbGxlciBjYXJkIHRoYXQgaXMgYmFzZWQgb24KLQkgIEludGVsJ3MgODIwNzggRkRDIHN1Y2ggYXMgU2VhZ2F0ZSdzLCBFeGFieXRlJ3MgYW5kIElvbWVnYSdzICJoaWdoCi0JICBzcGVlZCIgY29udHJvbGxlcnMuCi0KLQkgIElmIHlvdSBjaG9vc2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIlN0YW5kYXJkIiB0aGVuIHBsZWFzZSBtYWtlCi0JICBzdXJlIHRoYXQgdGhlIHNldHRpbmdzIGZvciB0aGUgSU8gYmFzZSBhZGRyZXNzIGFuZCB0aGUgSVJRIGFuZCBETUEKLQkgIGNoYW5uZWwgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbWVudXMgYmVsb3cgYXJlIGNvcnJlY3QuIFVzZSB0aGUgbWFudWFsCi0JICBvZiB5b3VyIHRhcGUgZHJpdmUgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHNldHRpbmdzIQotCi0JICBJZiB5b3UgYXJlIGFscmVhZHkgc3VjY2Vzc2Z1bGx5IHVzaW5nIHlvdXIgdGFwZSBkcml2ZSB3aXRoIGFub3RoZXIKLQkgIG9wZXJhdGluZyBzeXN0ZW0gdGhlbiB5b3UgZGVmaW5pdGVseSBzaG91bGQgdXNlIHRoZSBzYW1lIHNldHRpbmdzCi0JICBmb3IgdGhlIElPIGJhc2UsIHRoZSBJUlEgYW5kIERNQSBjaGFubmVsIHRoYXQgaGF2ZSBwcm92ZW4gdG8gd29yawotCSAgd2l0aCB0aGF0IG90aGVyIE9TLgotCi0JICBOb3RlIHRoYXQgdGhpcyBtZW51IGxldHMgeW91IHNwZWNpZnkgb25seSB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvcgotCSAgdGhlIGhhcmR3YXJlIHNldHVwLiBUaGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hhbmdlZCBhdAotCSAgYm9vdCB0aW1lICh3aGVuIGZ0YXBlIGlzIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCwgaS5lLiBpZiB5b3UKLQkgIGhhdmUgc2FpZCBZIHRvICJGbG9wcHkgdGFwZSBkcml2ZSIpIG9yIG1vZHVsZSBsb2FkIHRpbWUgKGkuZS4gaWYgeW91Ci0JICBoYXZlIHNhaWQgTSB0byAiRmxvcHB5IHRhcGUgZHJpdmUiKS4KLQotCSAgUGxlYXNlIHJlYWQgYWxzbyB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2Z0YXBlLnR4dD4gd2hpY2gKLQkgIGNvbnRhaW5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IGF0Ci0JICBib290IG9yIGxvYWQgdGltZS4gSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIgZmxvcHB5IHRhcGUgZHJpdmUgb24gYQotCSAgUENJLWJ1cyBiYXNlZCBzeXN0ZW0sIHBsZWFzZSByZWFkIHRoZSBmaWxlCi0JICA8ZmlsZTpkcml2ZXJzL2NoYXIvZnRhcGUvUkVBRE1FLlBDST4uCi0KLWNvbmZpZyBGVF9NQUNIMgotCWJvb2wgIk1BQ0gtMiIKLQotY29uZmlnIEZUX1BST0JFX0ZDMTAKLQlib29sICJGQy0xMC9GQy0yMCIKLQotY29uZmlnIEZUX0FMVF9GREMKLQlib29sICJBbHQvODIwNzgiCi0KLWVuZGNob2ljZQotCi1jb21tZW50ICJDb25zdWx0IHRoZSBtYW51YWxzIG9mIHlvdXIgdGFwZSBkcml2ZSBmb3IgdGhlIGNvcnJlY3Qgc2V0dGluZ3MhIgotCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKLQotY29uZmlnIEZUX0ZEQ19CQVNFCi0JaGV4ICJJTyBiYXNlIG9mIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gRlRBUEUgJiYgIUZUX1NURF9GREMKLQlkZWZhdWx0ICIwIgotCS0tLWhlbHAtLS0KLQkgIFlvdSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgYSB2YWx1ZSBpZiB0aGUgZm9sbG93aW5nIGRlZmF1bHQKLQkgIHNldHRpbmdzIGZvciB0aGUgYmFzZSBJTyBhZGRyZXNzIGFyZSBjb3JyZWN0OgotCSAgPDw8IE1BQ0gtMiAgICAgOiAweDFFMCA+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+Ci0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mZGMtaW8uaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1yZWFkLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS1pby5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnNtLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmgiCi0KLS8qIGJhZCBzZWN0b3IgaGFuZGxpbmcgZnJvbSBmdGFwZS1ic20uYyAqLwotRVhQT1JUX1NZTUJPTChmdGFwZV9nZXRfYmFkX3NlY3Rvcl9lbnRyeSk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX2ZpbmRfZW5kX29mX2JzbV9saXN0KTsKLS8qIGZyb20gZnRhcGUtcncuYyAqLwotRVhQT1JUX1NZTUJPTChmdGFwZV9zZXRfc3RhdGUpOwotLyogZnJvbSBmdGFwZS1jdGwuYyAqLwotRVhQT1JUX1NZTUJPTChmdGFwZV9zZWVrX3RvX2JvdCk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3NlZWtfdG9fZW90KTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfYWJvcnRfb3BlcmF0aW9uKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfZ2V0X3N0YXR1cyk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX2VuYWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX2Rpc2FibGUpOwotRVhQT1JUX1NZTUJPTChmdGFwZV9tbWFwKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfY2FsaWJyYXRlX2RhdGFfcmF0ZSk7Ci0vKiBmcm9tIGZ0YXBlLWlvLmMgKi8KLUVYUE9SVF9TWU1CT0woZnRhcGVfcmVzZXRfZHJpdmUpOwotRVhQT1JUX1NZTUJPTChmdGFwZV9jb21tYW5kKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfcGFyYW1ldGVyKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfcmVhZHlfd2FpdCk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24pOwotRVhQT1JUX1NZTUJPTChmdGFwZV9yZXBvcnRfZXJyb3IpOwotLyogZnJvbSBmdGFwZS1yZWFkLmMgKi8KLUVYUE9SVF9TWU1CT0woZnRhcGVfcmVhZF9zZWdtZW50X2ZyYWN0aW9uKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfemFwX3JlYWRfYnVmZmVycyk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3JlYWRfaGVhZGVyX3NlZ21lbnQpOwotRVhQT1JUX1NZTUJPTChmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQpOwotLyogZnJvbSBmdGFwZS13cml0ZS5jICovCi1FWFBPUlRfU1lNQk9MKGZ0YXBlX3dyaXRlX3NlZ21lbnQpOwotRVhQT1JUX1NZTUJPTChmdGFwZV9zdGFydF93cml0aW5nKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSk7Ci0vKiBmcm9tIGZ0YXBlLWJ1ZmZlci5oICovCi1FWFBPUlRfU1lNQk9MKGZ0YXBlX3NldF9ucl9idWZmZXJzKTsKLS8qIGZyb20gZnRhcGUtZm9ybWF0LmggKi8KLUVYUE9SVF9TWU1CT0woZnRhcGVfZm9ybWF0X3RyYWNrKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfZm9ybWF0X3N0YXR1cyk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3ZlcmlmeV9zZWdtZW50KTsKLS8qIGZyb20gdHJhY2luZy5jICovCi0jaWZuZGVmIENPTkZJR19GVF9OT19UUkFDRV9BVF9BTEwKLUVYUE9SVF9TWU1CT0woZnRhcGVfdHJhY2luZyk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX2Z1bmN0aW9uX25lc3RfbGV2ZWwpOwotRVhQT1JUX1NZTUJPTChmdGFwZV90cmFjZV9jYWxsKTsKLUVYUE9SVF9TWU1CT0woZnRhcGVfdHJhY2VfZXhpdCk7Ci1FWFBPUlRfU1lNQk9MKGZ0YXBlX3RyYWNlX2xvZyk7Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTFjMWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotIwotIyAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL01ha2VmaWxlLHYgJAotIyAkUmV2aXNpb246IDEuNCAkCi0jICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU4ICQKLSMKLSMgICAgICBNYWtlZmlsZSBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgemZ0YXBlIGludGVyZmFjZSBWRlMgdG8KLSMgICAgICBmdGFwZQotIwotCi0KLSMgWkZUX09CU09MRVRFIC0gZW5hYmxlIHRoZSBNVElPQ19aRlRBUEVfR0VUQkxLU1ogaW9jdGwuIFlvdSBzaG91bGQKLSMgICAgICAgICAgICAgICAgbGVhdmUgdGhpcyBlbmFibGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGFwZXIuCi0KLW9iai0kKENPTkZJR19aRlRBUEUpICs9IHpmdGFwZS5vCi0KLXpmdGFwZS1vYmpzIDo9IHpmdGFwZS1ydy5vIHpmdGFwZS1jdGwubyB6ZnRhcGUtcmVhZC5vIFwKLQkgICAgICAgemZ0YXBlLXdyaXRlLm8gemZ0YXBlLXZ0YmwubyB6ZnRhcGUtZW9mLm8gXAotCSAgICAgICB6ZnRhcGUtaW5pdC5vIHpmdGFwZS1idWZmZXJzLm8gemZ0YXBlX3N5bXMubwotCi1FWFRSQV9DRkxBR1MgOj0gLURaRlRfT0JTT0xFVEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwNmYxMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1idWZmZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE4OjU5ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZHluYW1pYyBidWZmZXIgYWxsb2NhdGlvbiByb3V0aW5lcyAKLSAqICAgICAgb2YgemZ0YXBlCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3pmdGFwZS5oPgotCi0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCi0KLS8qICBnbG9iYWwgdmFyaWFibGVzCi0gKi8KLQotLyogIGxvY2FsIHZhcmliYWxlcwotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHVzZWRfbWVtb3J5Owotc3RhdGljIHVuc2lnbmVkIGludCBwZWFrX21lbW9yeTsKLQotdm9pZCB6ZnRfbWVtb3J5X3N0YXRzKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X25vaXNlLCAiTWVtb3J5IHVzYWdlICh2bWFsbG9jIGFsbG9jYXRpb25zKTpcbiIKLQkgICAgICBLRVJOX0lORk8gInRvdGFsIGFsbG9jYXRlZDogJWRcbiIKLQkgICAgICBLRVJOX0lORk8gInBlYWsgYWxsb2NhdGlvbjogJWQiLAotCSAgICAgIHVzZWRfbWVtb3J5LCBwZWFrX21lbW9yeSk7Ci0JcGVha19tZW1vcnkgPSB1c2VkX21lbW9yeTsKLQlUUkFDRV9FWElUOwotfQotCi1pbnQgemZ0X3ZjYWxsb2Nfb25jZSh2b2lkICpuZXcsIHNpemVfdCBzaXplKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCWlmICh6ZnRfdm1hbGxvY19vbmNlKG5ldywgc2l6ZSkgPCAwKSB7Ci0JCVRSQUNFX0VYSVQgLUVOT01FTTsKLQl9Ci0JbWVtc2V0KCoodm9pZCAqKiluZXcsICdcMCcsIHNpemUpOwotCVRSQUNFX0VYSVQgMDsKLX0KLWludCB6ZnRfdm1hbGxvY19vbmNlKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoKih2b2lkICoqKW5ldyAhPSBOVUxMIHx8IHNpemUgPT0gMCkgewotCQlUUkFDRV9FWElUIDA7Ci0JfQotCWlmICgoKih2b2lkICoqKW5ldyA9IHZtYWxsb2Moc2l6ZSkpID09IE5VTEwpIHsKLQkJVFJBQ0VfRVhJVCAtRU5PTUVNOwotCX0KLQl1c2VkX21lbW9yeSArPSBzaXplOwotCWlmIChwZWFrX21lbW9yeSA8IHVzZWRfbWVtb3J5KSB7Ci0JCXBlYWtfbWVtb3J5ID0gdXNlZF9tZW1vcnk7Ci0JfQotCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsCi0JCSAgICAiYWxsb2NhdGVkIGJ1ZmZlciBAICVwLCAlZCBieXRlcyIsICoodm9pZCAqKiluZXcsIHNpemUpOwotfQotaW50IHpmdF92bWFsbG9jX2Fsd2F5cyh2b2lkICpuZXcsIHNpemVfdCBzaXplKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JemZ0X3ZmcmVlKG5ldywgc2l6ZSk7Ci0JVFJBQ0VfRVhJVCB6ZnRfdm1hbGxvY19vbmNlKG5ldywgc2l6ZSk7Ci19Ci12b2lkIHpmdF92ZnJlZSh2b2lkICpvbGQsIHNpemVfdCBzaXplKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKCoodm9pZCAqKilvbGQpIHsKLQkJdmZyZWUoKih2b2lkICoqKW9sZCk7Ci0JCXVzZWRfbWVtb3J5IC09IHNpemU7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJyZWxlYXNlZCBidWZmZXIgQCAlcCwgJWQgYnl0ZXMiLAotCQkgICAgICAqKHZvaWQgKiopb2xkLCBzaXplKTsKLQkJKih2b2lkICoqKW9sZCA9IE5VTEw7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLXZvaWQgKnpmdF9rbWFsbG9jKHNpemVfdCBzaXplKQotewotCXZvaWQgKm5ldzsKLQotCXdoaWxlICgobmV3ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApOwotCX0KLQltZW1zZXQobmV3LCAwLCBzaXplKTsKLQl1c2VkX21lbW9yeSArPSBzaXplOwotCWlmIChwZWFrX21lbW9yeSA8IHVzZWRfbWVtb3J5KSB7Ci0JCXBlYWtfbWVtb3J5ID0gdXNlZF9tZW1vcnk7Ci0JfQotCXJldHVybiBuZXc7Ci19Ci0KLXZvaWQgemZ0X2tmcmVlKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpCi17Ci0Ja2ZyZWUob2xkKTsKLQl1c2VkX21lbW9yeSAtPSBzaXplOwotfQotCi0vKiB0aGVyZSBhcmUgc29tZSBtb3JlIGJ1ZmZlcnMgdGhhdCBhcmUgYWxsb2NhdGVkIG9uIGRlbWFuZC4KLSAqIGNsZWFudXBfbW9kdWxlKCkgY2FsbGVzIHRoaXMgZnVuY3Rpb24gdG8gYmUgc3VyZSB0byBoYXZlIHJlbGVhc2VkCi0gKiB0aGVtIAotICovCi12b2lkIHpmdF91bmluaXRfbWVtKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQl6ZnRfdmZyZWUoJnpmdF9oc2VnX2J1ZiwgRlRfU0VHTUVOVF9TSVpFKTsKLQl6ZnRfdmZyZWUoJnpmdF9kZWJsb2NrX2J1ZiwgRlRfU0VHTUVOVF9TSVpFKTsgemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOwotCXpmdF9mcmVlX3Z0YmwoKTsKLQlpZiAoemZ0X2NtcHJfbG9jaygwIC8qIGRvbid0IGxvYWQgKi8pID09IDApIHsKLQkJKCp6ZnRfY21wcl9vcHMtPmNsZWFudXApKCk7Ci0JCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsgLyogdW5sb2NrIGl0IGFnYWluICovCi0JfQotCXpmdF9tZW1vcnlfc3RhdHMoKTsKLQlUUkFDRV9FWElUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OThlMzEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSNpZm5kZWYgX0ZUQVBFX0RZTk1FTV9ICi0jZGVmaW5lIF9GVEFQRV9EWU5NRU1fSAotCi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTg6NTkgJAotICoKLSAqICAgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCi0gKgotICovCi0KLS8qIHdlIGRvIG5vdCBhbGxvY2F0ZSBhbGwgb2YgdGhlIHJlYWxseSBsYXJnZSBidWZmZXIgbWVtb3J5IGJlZm9yZQotICogc29tZW9uZSB0cmllcyB0byBvcGVuIHRoZSBkcml2ZS4gZnRhcGVfb3BlbigpIG1heSBmYWlsIHdpdGgKLSAqIC1FTk9NRU0sIGJ1dCB0aGF0J3MgYmV0dGVyIGhhdmluZyAyMDBrIG9mIHZtYWxsb2NlZCBtZW1vcnkgd2hpY2gKLSAqIGNhbm5vdCBiZSBzd2FwcGVkIG91dC4KLSAqLwotCi1leHRlcm4gdm9pZCAgemZ0X21lbW9yeV9zdGF0cyh2b2lkKTsKLWV4dGVybiBpbnQgICB6ZnRfdm1hbGxvY19vbmNlKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpOwotZXh0ZXJuIGludCAgIHpmdF92Y2FsbG9jX29uY2Uodm9pZCAqbmV3LCBzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gaW50ICAgemZ0X3ZtYWxsb2NfYWx3YXlzKHZvaWQgKm5ldywgc2l6ZV90IHNpemUpOwotZXh0ZXJuIHZvaWQgIHpmdF92ZnJlZSh2b2lkICpvbGQsIHNpemVfdCBzaXplKTsKLWV4dGVybiB2b2lkICp6ZnRfa21hbGxvYyhzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gdm9pZCAgemZ0X2tmcmVlKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpOwotCi0vKiBjYWxsZWQgYnkgY2xlYW51cF9tb2R1bGUoKSAKLSAqLwotZXh0ZXJuIHZvaWQgemZ0X3VuaW5pdF9tZW0odm9pZCk7Ci0KLSNlbmRpZgotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmJhMGY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxNyArMCwwIEBACi0vKiAKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWN0bC5jLHYgJAotICogJFJldmlzaW9uOiAxLjIuNi4yICQKLSAqICREYXRlOiAxOTk3LzExLzE0IDE4OjA3OjMzICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm9uLXJlYWQvd3JpdGUgemZ0YXBlIGZ1bmN0aW9ucwotICogICAgICBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotaW50IHpmdF93cml0ZV9wcm90ZWN0ZWQ7IC8qIHRoaXMgaXMgd2hlbiBjYXJ0cmlkZ2UgcmRvbmx5IG9yIE9fUkRPTkxZICovCi1pbnQgemZ0X2hlYWRlcl9yZWFkOwotaW50IHpmdF9vZmZsaW5lOwotdW5zaWduZWQgaW50IHpmdF91bml0OwotaW50IHpmdF9yZXNpZDsKLWludCB6ZnRfbXRfY29tcHJlc3Npb247Ci0KLS8qICAgICAgTG9jYWwgdmFycy4KLSAqLwotc3RhdGljIGludCBnb2luZ19vZmZsaW5lOwotCi10eXBlZGVmIGludCAobXRfZnVuKShpbnQgKmFyZ3B0cik7Ci10eXBlZGVmIGludCAoKm10X2Z1bnApKGludCAqYXJncHRyKTsKLXR5cGVkZWYgc3RydWN0Ci17Ci0JbXRfZnVucCBmdW5jdGlvbjsKLQl1bnNpZ25lZCBvZmZsaW5lICAgICAgICAgOiAxOyAvKiBvcCBwZXJtaXR0ZWQgaWYgb2ZmbGluZSBvciBub190YXBlICovCi0JdW5zaWduZWQgd3JpdGVfcHJvdGVjdGVkIDogMTsgLyogb3AgcGVybWl0dGVkIGlmIHdyaXRlLXByb3RlY3RlZCAgICAqLwotCXVuc2lnbmVkIG5vdF9mb3JtYXR0ZWQgICA6IDE7IC8qIG9wIHBlcm1pdHRlZCBpZiB0YXBlIG5vdCBmb3JtYXR0ZWQgKi8KLQl1bnNpZ25lZCByYXdfbW9kZSAgICAgICAgOiAxOyAvKiBvcCBwZXJtaXR0ZWQgaWYgemZ0X21vZGUgPT0gMCAgICAqLwotCXVuc2lnbmVkIG5lZWRfaWRsZV9zdGF0ZSA6IDE7IC8qIG5lZWQgdG8gY2FsbCBkZWZfaWRsZV9zdGF0ZSAgICAgICAgKi8KLQljaGFyICAgICAqbmFtZTsKLX0gZnVuX2VudHJ5OwotCi1zdGF0aWMgbXRfZnVuIG10X2R1bW15LCBtdF9yZXNldCwgbXRfZnNyLCBtdF9ic3IsIG10X3JldywgbXRfb2ZmbCwgbXRfbm9wLAotCW10X3dlb2YsIG10X2VyYXNlLCBtdF9yYXMyLCBtdF9zZXRibGssIG10X3NldGRlbnNpdHksCi0JbXRfc2VlaywgbXRfdGVsbCwgbXRfcmV0ZW4sIG10X2VvbSwgbXRfZnNmLCBtdF9ic2YsCi0JbXRfZnNmbSwgbXRfYnNmbSwgbXRfc2V0ZHJ2YnVmZmVyLCBtdF9jb21wcmVzc2lvbjsKLQotc3RhdGljIGZ1bl9lbnRyeSBtdF9mdW5zW109Ci17IAotCXttdF9yZXNldCAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9SRVNFVCIgfSwgLyogIDAgKi8KLQl7bXRfZnNmICAgICAgICAgLCAwLCAxLCAwLCAwLCAxLCAiTVRfRlNGIiAgIH0sCi0Je210X2JzZiAgICAgICAgICwgMCwgMSwgMCwgMCwgMSwgIk1UX0JTRiIgICB9LAotCXttdF9mc3IgICAgICAgICAsIDAsIDEsIDAsIDEsIDEsICJNVF9GU1IiICAgfSwKLQl7bXRfYnNyICAgICAgICAgLCAwLCAxLCAwLCAxLCAxLCAiTVRfQlNSIiAgIH0sCi0Je210X3dlb2YgICAgICAgICwgMCwgMCwgMCwgMCwgMCwgIk1UX1dFT0YiICB9LCAvKiAgNSAqLwotCXttdF9yZXcgICAgICAgICAsIDAsIDEsIDEsIDEsIDAsICJNVF9SRVciICAgfSwKLQl7bXRfb2ZmbCAgICAgICAgLCAwLCAxLCAxLCAxLCAwLCAiTVRfT0ZGTCIgIH0sCi0Je210X25vcCAgICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX05PUCIgICB9LAotCXttdF9yZXRlbiAgICAgICAsIDAsIDEsIDEsIDEsIDAsICJNVF9SRVRFTiIgfSwKLQl7bXRfYnNmbSAgICAgICAgLCAwLCAxLCAwLCAwLCAxLCAiTVRfQlNGTSIgIH0sIC8qIDEwICovCi0Je210X2ZzZm0gICAgICAgICwgMCwgMSwgMCwgMCwgMSwgIk1UX0ZTRk0iICB9LAotCXttdF9lb20gICAgICAgICAsIDAsIDEsIDAsIDAsIDEsICJNVF9FT00iICAgfSwKLQl7bXRfZXJhc2UgICAgICAgLCAwLCAwLCAwLCAxLCAwLCAiTVRfRVJBU0UiIH0sCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1JBUzEiICB9LAotCXttdF9yYXMyICAgICAgICAsIDAsIDAsIDAsIDEsIDAsICJNVF9SQVMyIiAgfSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfUkFTMyIgIH0sCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIlVOS05PV04iICB9LAotCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJVTktOT1dOIiAgfSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiVU5LTk9XTiIgIH0sCi0Je210X3NldGJsayAgICAgICwgMSwgMSwgMSwgMSwgMSwgIk1UX1NFVEJMSyJ9LCAvKiAyMCAqLwotCXttdF9zZXRkZW5zaXR5ICAsIDEsIDEsIDEsIDEsIDAsICJNVF9TRVRERU5TSVRZIn0sCi0Je210X3NlZWsgICAgICAgICwgMCwgMSwgMCwgMSwgMSwgIk1UX1NFRUsiICB9LAotCXttdF9kdW1teSAgICAgICAsIDAsIDEsIDAsIDEsIDEsICJNVF9URUxMIiAgfSwgLyogd3Itb25seSA/ISAqLwotCXttdF9zZXRkcnZidWZmZXIsIDEsIDEsIDEsIDEsIDAsICJNVF9TRVREUlZCVUZGRVIiIH0sCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX0ZTUyIgICB9LCAvKiAyNSAqLwotCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9CU1MiICAgfSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfV1NNIiAgIH0sCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX0xPQ0siICB9LAotCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9VTkxPQ0sifSwKLQl7bXRfZHVtbXkgICAgICAgLCAxLCAxLCAxLCAxLCAwLCAiTVRfTE9BRCIgIH0sIC8qIDMwICovCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX1VOTE9BRCJ9LAotCXttdF9jb21wcmVzc2lvbiAsIDEsIDEsIDEsIDAsIDEsICJNVF9DT01QUkVTU0lPTiJ9LAotCXttdF9kdW1teSAgICAgICAsIDEsIDEsIDEsIDEsIDAsICJNVF9TRVRQQVJUIn0sCi0Je210X2R1bW15ICAgICAgICwgMSwgMSwgMSwgMSwgMCwgIk1UX01LUEFSVCJ9Ci19OyAgCi0KLSNkZWZpbmUgTlJfTVRfQ01EUyBOUl9JVEVNUyhtdF9mdW5zKQotCi12b2lkIHpmdF9yZXNldF9wb3NpdGlvbih6ZnRfcG9zaXRpb24gKnBvcykKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXBvcy0+c2VnX2J5dGVfcG9zID0KLQkJcG9zLT52b2x1bWVfcG9zID0gMDsKLQlpZiAoemZ0X2hlYWRlcl9yZWFkKSB7Ci0JCS8qIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgdm9sdW1lIHRhYmxlIGFuZAotCQkgKiBjb21wcmVzc2lvbiBtYXAuIFdlIHRoZXJlZm9yIHNpbXBseQotCQkgKiBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdAotCQkgKiB2b2x1bWUuIFRoaXMgY292ZXJzIG9sZCBmdGFwZSBhcmNoaXZlcyBhcwotCQkgKiB3ZWxsIGhhcyB2YXJpb3VzIGZsYXZvdXJzIG9mIHRoZQotCQkgKiBjb21wcmVzc2lvbiBtYXAgc2VnbWVudHMuIFRoZSB3b3JzdCBjYXNlIGlzCi0JCSAqIHRoYXQgdGhlIGNvbXByZXNzaW9uIG1hcCBzaG93cyB1cCBhcyBhCi0JCSAqIGFkZGl0aW9uYWwgdm9sdW1lIGluIGZyb250IG9mIGFsbCBvdGhlcnMuCi0JCSAqLwotCQlwb3MtPnNlZ19wb3MgID0gemZ0X2ZpbmRfdm9sdW1lKDApLT5zdGFydF9zZWc7Ci0JCXBvcy0+dGFwZV9wb3MgPSB6ZnRfY2FsY190YXBlX3Bvcyhwb3MtPnNlZ19wb3MpOwotCX0gZWxzZSB7Ci0JCXBvcy0+dGFwZV9wb3MgPSAgMDsKLQkJcG9zLT5zZWdfcG9zICA9IC0xOwotCX0KLQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gIDA7Ci0JemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOwotCXpmdF9pb19zdGF0ZSAgICAgICAgPSB6ZnRfaWRsZTsKLQl6ZnRfemFwX3JlYWRfYnVmZmVycygpOwotCXpmdF9wcmV2ZW50X2ZsdXNoKCk7Ci0JLyogIHVubG9jayB0aGUgY29tcHJlc2lzb24gbW9kdWxlIGlmIGl0IGlzIGxvYWRlZC4KLQkgKiAgVGhlIHplcm8gYXJnIG1lYW5zIG5vdCB0byB0cnkgdG8gbG9hZCB0aGUgbW9kdWxlLgotCSAqLwotCWlmICh6ZnRfY21wcl9sb2NrKDApID09IDApIHsKLQkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOyAvKiB1bmxvY2sgKi8KLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotc3RhdGljIHZvaWQgemZ0X2luaXRfZHJpdmVyKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQl6ZnRfcmVzaWQgPQotCQl6ZnRfaGVhZGVyX3JlYWQgICAgICAgICAgPQotCQl6ZnRfb2xkX2Z0YXBlICAgICAgICAgICAgPQotCQl6ZnRfb2ZmbGluZSAgICAgICAgICAgICAgPQotCQl6ZnRfd3JpdGVfcHJvdGVjdGVkICAgICAgPQotCQlnb2luZ19vZmZsaW5lICAgICAgICAgICAgPQotCQl6ZnRfbXRfY29tcHJlc3Npb24gICAgICAgPQotCQl6ZnRfaGVhZGVyX2NoYW5nZWQgICAgICAgPQotCQl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPQotCQl6ZnRfd3JpdHRlbl9zZWdtZW50cyAgICAgPSAwOwotCXpmdF9ibGtfc3ogPSBDT05GSUdfWkZUX0RGTFRfQkxLX1NaOwotCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7IC8qIGRvZXMgbW9zdCBvZiB0aGUgc3R1ZmYgKi8KLQlmdGFwZV96YXBfcmVhZF9idWZmZXJzKCk7Ci0JZnRhcGVfc2V0X3N0YXRlKGlkbGUpOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLWludCB6ZnRfZGVmX2lkbGVfc3RhdGUodm9pZCkKLXsgCi0JaW50IHJlc3VsdCA9IDA7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYgKCF6ZnRfaGVhZGVyX3JlYWQpIHsKLQkJcmVzdWx0ID0gemZ0X3JlYWRfaGVhZGVyX3NlZ21lbnRzKCk7Ci0JfSBlbHNlIGlmICgocmVzdWx0ID0gemZ0X2ZsdXNoX2J1ZmZlcnMoKSkgPj0gMCAmJiB6ZnRfcWljX21vZGUpIHsKLQkJLyogIGRvbid0IG1vdmUgcGFzdCBlb2YKLQkJICovCi0JCSh2b2lkKXpmdF9jbG9zZV92b2x1bWUoJnpmdF9wb3MpOwotCX0KLQlpZiAoZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCkgPCAwKSB7Ci0JCVRSQUNFKGZ0X3Rfd2FybiwgImZ0YXBlX2Fib3J0X29wZXJhdGlvbigpIGZhaWxlZCIpOwotCQlyZXN1bHQgPSAtRUlPOwotCX0KLQkvKiBjbGVhciByZW1haW5pbmcgcmVhZCBidWZmZXJzICovCi0JemZ0X3phcF9yZWFkX2J1ZmZlcnMoKTsKLQl6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBmdW5jdGlvbnMgZm9yIHRoZSBNVElPQ1RPUCBjb21tYW5kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgbXRfZHVtbXkoaW50ICpkdW1teSkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlUUkFDRV9FWElUIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfcmVzZXQoaW50ICpkdW1teSkKLXsgICAgICAgIAotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCSh2b2lkKWZ0YXBlX3NlZWtfdG9fYm90KCk7Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfcmVzZXRfZHJpdmUoKSwKLQkJICAgIHpmdF9pbml0X2RyaXZlcigpOyB6ZnRfdW5pbml0X21lbSgpOyB6ZnRfb2ZmbGluZSA9IDEpOwotCS8qICBmYWtlIGEgcmUtb3BlbiBvZiB0aGUgZGV2aWNlLiBUaGlzIHdpbGwgc2V0IGFsbCBmbGFnZSBhbmQgCi0JICogIGFsbG9jYXRlIGJ1ZmZlcnMgYXMgYXBwcm9wcmlhdGUuIFRoZSBuZXcgdGFwZSBjb25kaXRpb24gd2lsbAotCSAqICBmb3JjZSB0aGUgb3BlbiByb3V0aW5lIHRvIGRvIGFueXRoaW5nIHdlIG5lZWQuCi0JICovCi0JVFJBQ0VfQ0FUQ0goX3pmdF9vcGVuKC0xIC8qIGZha2UgcmVvcGVuICovLCAwIC8qIGR1bW15ICovKSwpOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCBtdF9mc2YoaW50ICphcmcpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXJlc3VsdCA9IHpmdF9za2lwX3ZvbHVtZXMoKmFyZywgJnpmdF9wb3MpOwotCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAwOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X2JzZihpbnQgKmFyZykKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoKmFyZyAhPSAwKSB7Ci0JCXJlc3VsdCA9IHpmdF9za2lwX3ZvbHVtZXMoLSphcmcgKyAxLCAmemZ0X3Bvcyk7Ci0JfQotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IHNlZWtfYmxvY2soX19zNjQgZGF0YV9vZmZzZXQsCi0JCSAgICAgIF9fczY0IGJsb2NrX2luY3JlbWVudCwKLQkJICAgICAgemZ0X3Bvc2l0aW9uICpwb3MpCi17IAotCWludCByZXN1bHQgICAgICA9IDA7Ci0JX19zNjQgbmV3X2Jsb2NrX3BvczsKLQlfX3M2NCB2b2xfYmxvY2tfY291bnQ7Ci0JY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZTsKLQlpbnQgZXhjZWVkOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOwotCWlmICh2b2x1bWUtPnN0YXJ0X3NlZyA9PSAwIHx8IHZvbHVtZS0+ZW5kX3NlZyA9PSAwKSB7Ci0JCVRSQUNFX0VYSVQgLUVJTzsKLQl9Ci0JbmV3X2Jsb2NrX3BvcyAgID0gKHpmdF9kaXZfYmxrc3ooZGF0YV9vZmZzZXQsIHZvbHVtZS0+YmxrX3N6KQotCQkJICAgKyBibG9ja19pbmNyZW1lbnQpOwotCXZvbF9ibG9ja19jb3VudCA9IHpmdF9kaXZfYmxrc3oodm9sdW1lLT5zaXplLCB2b2x1bWUtPmJsa19zeik7Ci0JaWYgKG5ld19ibG9ja19wb3MgPCAwKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCSAgICAgICJuZXdfYmxvY2tfcG9zICIgTExfWCAiIDwgMCIsIExMKG5ld19ibG9ja19wb3MpKTsKLQkJemZ0X3Jlc2lkICAgICA9IChpbnQpbmV3X2Jsb2NrX3BvczsKLQkJbmV3X2Jsb2NrX3BvcyA9IDA7Ci0JCWV4Y2VlZCA9IDE7Ci0JfSBlbHNlIGlmIChuZXdfYmxvY2tfcG9zID4gdm9sX2Jsb2NrX2NvdW50KSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCSAgICAgICJuZXdfYmxvY2tfcG9zICIgTExfWCAiIGV4Y2VlZHMgc2l6ZSBvZiB2b2x1bWUgIiBMTF9YLAotCQkgICAgICBMTChuZXdfYmxvY2tfcG9zKSwgTEwodm9sX2Jsb2NrX2NvdW50KSk7Ci0JCXpmdF9yZXNpZCAgICAgPSAoaW50KSh2b2xfYmxvY2tfY291bnQgLSBuZXdfYmxvY2tfcG9zKTsKLQkJbmV3X2Jsb2NrX3BvcyA9IHZvbF9ibG9ja19jb3VudDsKLQkJZXhjZWVkID0gMTsKLQl9IGVsc2UgewotCQlleGNlZWQgPSAwOwotCX0KLQlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbiAmJiB2b2x1bWUtPnVzZV9jb21wcmVzc2lvbikgewotCQlUUkFDRV9DQVRDSCh6ZnRfY21wcl9sb2NrKDEgLyogdHJ5IHRvIGxvYWQgKi8pLCk7Ci0JCXJlc3VsdCA9ICgqemZ0X2NtcHJfb3BzLT5zZWVrKShuZXdfYmxvY2tfcG9zLCBwb3MsIHZvbHVtZSwKLQkJCQkJICAgICAgIHpmdF9kZWJsb2NrX2J1Zik7Ci0JCXBvcy0+dGFwZV9wb3MgID0gemZ0X2NhbGNfdGFwZV9wb3MocG9zLT5zZWdfcG9zKTsKLQkJcG9zLT50YXBlX3BvcyArPSBwb3MtPnNlZ19ieXRlX3BvczsKLQl9IGVsc2UgewotCQlwb3MtPnZvbHVtZV9wb3MgPSB6ZnRfbXVsX2Jsa3N6KG5ld19ibG9ja19wb3MsIHZvbHVtZS0+YmxrX3N6KTsKLQkJcG9zLT50YXBlX3BvcyAgID0gemZ0X2NhbGNfdGFwZV9wb3Modm9sdW1lLT5zdGFydF9zZWcpOwotCQlwb3MtPnRhcGVfcG9zICArPSBwb3MtPnZvbHVtZV9wb3M7Ci0JCXBvcy0+c2VnX3BvcyAgICA9IHpmdF9jYWxjX3NlZ19ieXRlX2Nvb3JkKCZwb3MtPnNlZ19ieXRlX3BvcywKLQkJCQkJCQkgIHBvcy0+dGFwZV9wb3MpOwotCX0KLQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gdm9sdW1lLT5zaXplID09IHBvcy0+dm9sdW1lX3BvczsKLQlpZiAoemZ0X2p1c3RfYmVmb3JlX2VvZikgewotCQkvKiB3aHkgdGhpcz8gYmVjYXVzZSB6ZnRfZmlsZV9ubyBjaGVja3MgYWdhaW5zIHN0YXJ0Ci0JCSAqIGFuZCBlbmQgc2VnbWVudCBvZiBhIHZvbHVtZS4gV2UgZG8gbm90IHdhbnQgdG8KLQkJICogYWR2YW5jZSB0byB0aGUgbmV4dCB2b2x1bWUgd2l0aCB0aGlzIGZ1bmN0aW9uLgotCQkgKi8KLQkJVFJBQ0UoZnRfdF9ub2lzZSwgInNldCB6ZnRfanVzdF9iZWZvcmVfZW9mIik7Ci0JCXpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mKHBvcywgdm9sdW1lKTsKLQl9Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgotCSAgICAgIEtFUk5fSU5GTyAibmV3X3NlZ19wb3MgOiAlZFxuIgotCSAgICAgIEtFUk5fSU5GTyAibmV3X3RhcGVfcG9zOiAiIExMX1ggIlxuIgotCSAgICAgIEtFUk5fSU5GTyAidm9sX3NpemUgICAgOiAiIExMX1ggIlxuIgotCSAgICAgIEtFUk5fSU5GTyAic2VnX2J5dGVfcG9zOiAlZFxuIgotCSAgICAgIEtFUk5fSU5GTyAiYmxrX3N6ICA6ICVkIiwgCi0JICAgICAgcG9zLT5zZWdfcG9zLCBMTChwb3MtPnRhcGVfcG9zKSwKLQkgICAgICBMTCh2b2x1bWUtPnNpemUpLCBwb3MtPnNlZ19ieXRlX3BvcywKLQkgICAgICB2b2x1bWUtPmJsa19zeik7Ci0JaWYgKCFleGNlZWQpIHsKLQkJemZ0X3Jlc2lkID0gbmV3X2Jsb2NrX3BvcyAtIHpmdF9kaXZfYmxrc3oocG9zLT52b2x1bWVfcG9zLAotCQkJCQkJCSAgdm9sdW1lLT5ibGtfc3opOwotCX0KLQlpZiAoemZ0X3Jlc2lkIDwgMCkgewotCQl6ZnRfcmVzaWQgPSAtemZ0X3Jlc2lkOwotCX0KLQlUUkFDRV9FWElUICgoZXhjZWVkIHx8IHpmdF9yZXNpZCAhPSAwKSAmJiByZXN1bHQgPj0gMCkgPyAtRUlOVkFMIDogcmVzdWx0OwotfSAgICAgCi0KLXN0YXRpYyBpbnQgbXRfZnNyKGludCAqYXJnKQoteyAKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXJlc3VsdCA9IHNlZWtfYmxvY2soemZ0X3Bvcy52b2x1bWVfcG9zLCAgKmFyZywgJnpmdF9wb3MpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X2JzcihpbnQgKmFyZykKLXsgICAKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXJlc3VsdCA9IHNlZWtfYmxvY2soemZ0X3Bvcy52b2x1bWVfcG9zLCAtKmFyZywgJnpmdF9wb3MpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X3dlb2YoaW50ICphcmcpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlUUkFDRV9DQVRDSCh6ZnRfZmx1c2hfYnVmZmVycygpLCk7Ci0JcmVzdWx0ID0gemZ0X3dlb2YoKmFyZywgJnpmdF9wb3MpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X3JldyhpbnQgKmR1bW15KQoteyAgICAgICAgICAKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmKHpmdF9oZWFkZXJfcmVhZCkgewotCQkodm9pZCl6ZnRfZGVmX2lkbGVfc3RhdGUoKTsKLQl9Ci0JcmVzdWx0ID0gZnRhcGVfc2Vla190b19ib3QoKTsKLQl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X29mZmwoaW50ICpkdW1teSkKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWdvaW5nX29mZmxpbmU9IDE7Ci0JcmVzdWx0ID0gbXRfcmV3KE5VTEwpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X25vcChpbnQgKmR1bW15KQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCS8qICBzaG91bGQgd2Ugc2V0IHRhcGUgc3RhdHVzPwotCSAqLwotCWlmICghemZ0X29mZmxpbmUpIHsgLyogb2ZmbGluZSBpbmNsdWRlcyBub190YXBlICovCi0JCSh2b2lkKXpmdF9kZWZfaWRsZV9zdGF0ZSgpOwotCX0KLQlUUkFDRV9FWElUIDA7IAotfQotCi1zdGF0aWMgaW50IG10X3JldGVuKGludCAqZHVtbXkpCi17ICAKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmKHpmdF9oZWFkZXJfcmVhZCkgewotCQkodm9pZCl6ZnRfZGVmX2lkbGVfc3RhdGUoKTsKLQl9Ci0JcmVzdWx0ID0gZnRhcGVfc2Vla190b19lb3QoKTsKLQlpZiAocmVzdWx0ID49IDApIHsKLQkJcmVzdWx0ID0gZnRhcGVfc2Vla190b19ib3QoKTsKLQl9Ci0JVFJBQ0VfRVhJVChyZXN1bHQpOwotfQotCi1zdGF0aWMgaW50IGZzZmJzZm0oaW50IGFyZywgemZ0X3Bvc2l0aW9uICpwb3MpCi17IAotCWNvbnN0IHpmdF92b2xpbmZvICp2dGJsOwotCV9fczY0IGJsb2NrX3BvczsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQkvKiBXaGF0IHRvIGRvPyBUaGlzIHNob3VsZCBzZWVrIHRvIHRoZSBuZXh0IGZpbGUtbWFyayBhbmQKLQkgKiBwb3NpdGlvbiBCRUZPUkUuIFRoYXQgaXMsIGEgbmV4dCB3cml0ZSB3b3VsZCBqdXN0IGV4dGVuZAotCSAqIHRoZSBjdXJyZW50IGZpbGUuICBXZWxsLiBMZXQncyBqdXN0IHNlZWsgdG8gdGhlIGVuZCBvZiB0aGUKLQkgKiBjdXJyZW50IGZpbGUsIGlmIGNvdW50ID09IDEuICBJZiBjb3VudCA+IDEsIHRoZW4gZG8gYQotCSAqICJtdF9mc2YoY291bnQgLSAxKSIsIGFuZCB0aGVuIHNlZWsgdG8gdGhlIGVuZCBvZiB0aGF0IGZpbGUuCi0JICogSWYgY291bnQgPT0gMCwgZG8gbm90aGluZwotCSAqLwotCWlmIChhcmcgPT0gMCkgewotCQlUUkFDRV9FWElUIDA7Ci0JfQotCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAwOwotCVRSQUNFX0NBVENIKHpmdF9za2lwX3ZvbHVtZXMoYXJnIDwgMCA/IGFyZyA6IGFyZy0xLCBwb3MpLAotCQkgICAgaWYgKGFyZyA+IDApIHsKLQkJCSAgICB6ZnRfcmVzaWQgKys7IAotCQkgICAgfSk7Ci0JdnRibCAgICAgID0gemZ0X2ZpbmRfdm9sdW1lKHBvcy0+c2VnX3Bvcyk7Ci0JYmxvY2tfcG9zID0gemZ0X2Rpdl9ibGtzeih2dGJsLT5zaXplLCB2dGJsLT5ibGtfc3opOwotCSh2b2lkKXNlZWtfYmxvY2soMCwgYmxvY2tfcG9zLCBwb3MpOwotCWlmIChwb3MtPnZvbHVtZV9wb3MgIT0gdnRibC0+c2l6ZSkgewotCQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMDsKLQkJemZ0X3Jlc2lkID0gMTsKLQkJLyogd2UgZGlkbid0IG1hbmFnZWQgdG8gZ28gdGhlcmUgKi8KLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsIAotCQkJICAgICJ3YW50ZWQgZmlsZSBwb3NpdGlvbiAiIExMX1ggIiwgYXJyaXZlZCBhdCAiIExMX1gsIAotCQkJICAgIExMKHZ0YmwtPnNpemUpLCBMTChwb3MtPnZvbHVtZV9wb3MpKTsKLQl9Ci0JemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDE7Ci0JVFJBQ0VfRVhJVCAwOyAKLX0KLQotc3RhdGljIGludCBtdF9ic2ZtKGludCAqYXJnKQotewotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JcmVzdWx0ID0gZnNmYnNmbSgtKmFyZywgJnpmdF9wb3MpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IG10X2ZzZm0oaW50ICphcmcpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlyZXN1bHQgPSBmc2Zic2ZtKCphcmcsICZ6ZnRfcG9zKTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBtdF9lb20oaW50ICpkdW1teSkKLXsgICAgICAgICAgICAgIAotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXpmdF9za2lwX3RvX2VvbSgmemZ0X3Bvcyk7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi1zdGF0aWMgaW50IG10X2VyYXNlKGludCAqZHVtbXkpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlyZXN1bHQgPSB6ZnRfZXJhc2UoKTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBtdF9yYXMyKGludCAqZHVtbXkpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlyZXN1bHQgPSAtRU5PU1lTOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfSAKLQotLyogIFNldHMgdGhlIG5ldyBibG9ja3NpemUgaW4gQllURVMKLSAqCi0gKi8KLXN0YXRpYyBpbnQgbXRfc2V0YmxrKGludCAqbmV3X3NpemUpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYoKHVuc2lnbmVkIGludCkoKm5ld19zaXplKSA+IFpGVF9NQVhfQkxLX1NaKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKLQkJCSAgICAiZGVzaXJlZCBibGtfc3ogKCVkKSBzaG91bGQgYmUgPD0gJWQgYnl0ZXMiLAotCQkJICAgICpuZXdfc2l6ZSwgWkZUX01BWF9CTEtfU1opOwotCX0KLQlpZiAoKCpuZXdfc2l6ZSAmIChGVF9TRUNUT1JfU0laRS0xKSkgIT0gMCkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCi0JCQkiZGVzaXJlZCBibGtfc3ogKCVkKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJWQgYnl0ZXMiLAotCQkJICAgICpuZXdfc2l6ZSwgRlRfU0VDVE9SX1NJWkUpOwotCX0KLQlpZiAoKm5ld19zaXplID09IDApIHsKLQkJaWYgKHpmdF91c2VfY29tcHJlc3Npb24pIHsKLQkJCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywKLQkJCQkgICAgIlZhcmlhYmxlIGJsb2NrIHNpemUgbm90IHlldCAiCi0JCQkJICAgICJzdXBwb3J0ZWQgd2l0aCBjb21wcmVzc2lvbiIpOwotCQl9Ci0JCSpuZXdfc2l6ZSA9IDE7Ci0JfQotCXpmdF9ibGtfc3ogPSAqbmV3X3NpemU7Ci0JVFJBQ0VfRVhJVCAwOwotfSAKLQotc3RhdGljIGludCBtdF9zZXRkZW5zaXR5KGludCAqYXJnKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVNFVF9UUkFDRV9MRVZFTCgqYXJnKTsKLQlUUkFDRShUUkFDRV9MRVZFTCwgInRyYWNpbmcgc2V0IHRvICVkIiwgVFJBQ0VfTEVWRUwpOwotCWlmICgoaW50KVRSQUNFX0xFVkVMICE9ICphcmcpIHsKLQkJVFJBQ0VfRVhJVCAtRUlOVkFMOwotCX0KLQlUUkFDRV9FWElUIDA7Ci19ICAgICAgICAgIAotCi1zdGF0aWMgaW50IG10X3NlZWsoaW50ICpuZXdfYmxvY2tfcG9zKQoteyAKLQlpbnQgcmVzdWx0PSAwOyAgICAgICAgCi0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkKLQlyZXN1bHQgPSBzZWVrX2Jsb2NrKDAsIChfX3M2NCkqbmV3X2Jsb2NrX3BvcywgJnpmdF9wb3MpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKiAgT0ssIHRoaXMgaXMgdG90YWxseSBkaWZmZXJlbnQgZnJvbSBTQ1NJLCBidXQgdGhlIHdvcnN0IHRoaW5nIHRoYXQgY2FuIAotICogIGhhcHBlbiBpcyB0aGF0IHRoZXJlIGlzIG5vdCBlbm91Z2ggZGVmcmFnbWVudGF0ZWQgbWVtb3J5IHRoYXQgY2FuIGJlIAotICogIGFsbG9jYXRlZC4gQWxzbywgdGhlcmUgaXMgYSBoYXJkd2lyZWQgbGltaXQgb2YgMTYgZG1hIGJ1ZmZlcnMgaW4gdGhlIAotICogIHN0b2NrIGZ0YXBlIG1vZHVsZS4gVGhpcyBzaG91bGRuJ3QgYnJpbmcgdGhlIHN5c3RlbSBkb3duLgotICoKLSAqIE5PVEU6IHRoZSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHRvdGFsIG51bWJlciBvZiBkbWEgYnVmZmVycyB0byB1c2UuCi0gKiAgICAgICBUaGUgZHJpdmVyIG5lZWRzIGF0IGxlYXN0IDMgYnVmZmVycyB0byBmdW5jdGlvbiBhdCBhbGwuCi0gKiAKLSAqLwotc3RhdGljIGludCBtdF9zZXRkcnZidWZmZXIoaW50ICpjbnQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoKmNudCA8IDMpIHsKLQkJVFJBQ0VfRVhJVCAtRUlOVkFMOwotCX0KLQlUUkFDRV9DQVRDSChmdGFwZV9zZXRfbnJfYnVmZmVycygqY250KSwpOwotCVRSQUNFX0VYSVQgMDsKLX0KLS8qIHJldHVybiB0aGUgYmxvY2sgcG9zaXRpb24gZnJvbSBzdGFydCBvZiB2b2x1bWUgCi0gKi8KLXN0YXRpYyBpbnQgbXRfdGVsbChpbnQgKmFyZykKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQkqYXJnICAgPSB6ZnRfZGl2X2Jsa3N6KHpmdF9wb3Mudm9sdW1lX3BvcywKLQkJCSAgICAgICB6ZnRfZmluZF92b2x1bWUoemZ0X3Bvcy5zZWdfcG9zKS0+YmxrX3N6KTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXRfY29tcHJlc3Npb24oaW50ICphcmcpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JLyogIE9rLiBXZSBjb3VsZCBhbHNvIGNoZWNrIHdoZXRoZXIgY29tcHJlc3Npb24gaXMgYXZhaWxhYmxlIGF0Ci0JICogIGFsbCBieSB0cnlpbmcgdG8gbG9hZCB0aGUgY29tcHJlc3Npb24gbW9kdWxlLiAgV2UgY291bGQKLQkgKiAgYWxzbyBjaGVjayBmb3IgYSBibG9jayBzaXplIG9mIDEgYnl0ZSB3aGljaCBpcyBpbGxlZ2FsCi0JICogIHdpdGggY29tcHJlc3Npb24uICBJbnN0ZWFkIG9mIGRvaW5nIGl0IGhlcmUgd2UgcmVseSBvbgotCSAqICB6ZnRhcGVfd3JpdGUoKSB0byBkbyB0aGUgcHJvcGVyIGNoZWNrcy4KLQkgKi8KLQlpZiAoKHVuc2lnbmVkIGludCkqYXJnID4gMSkgewotCQlUUkFDRV9FWElUIC1FSU5WQUw7Ci0JfQotCWlmICgqYXJnICE9IDAgJiYgemZ0X2Jsa19zeiA9PSAxKSB7IC8qIHZhcmlhYmxlIGJsb2NrIHNpemUgKi8KLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAotCQkJICAgICJDb21wcmVzc2lvbiBub3QgeWV0IHN1cHBvcnRlZCAiCi0JCQkgICAgIndpdGggdmFyaWFibGUgYmxvY2sgc2l6ZSIpOwotCX0KLQl6ZnRfbXRfY29tcHJlc3Npb24gID0gKmFyZzsKLQlpZiAoKHpmdF91bml0ICYgWkZUX1pJUF9NT0RFKSA9PSAwKSB7Ci0JCXpmdF91c2VfY29tcHJlc3Npb24gPSB6ZnRfbXRfY29tcHJlc3Npb247Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogIGNoZWNrIHdoZXRoZXIgd3JpdGUgYWNjZXNzIGlzIGFsbG93ZWQuIFdyaXRlIGFjY2VzcyBpcyBkZW5pZWQgd2hlbgotICogICsgemZ0X3dyaXRlX3Byb3RlY3RlZCA9PSAxIC0tIHRoaXMgYWNjb3VudHMgZm9yIGVpdGhlciBoYXJkIHdyaXRlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3Rpb24gb2YgdGhlIGNhcnRyaWRnZSBvciBmb3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19SRE9OTFkgYWNjZXNzIG1vZGUgb2YgdGhlIHRhcGUgZGV2aWNlCi0gKiAgKyB6ZnRfb2ZmbGluZSA9PSAxICAgICAgICAgLS0gdGhpcyBtZWFueSB0aGF0IHRoZXJlIGlzIGVpdGhlciBubyB0YXBlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRoYXQgdGhlIE1UT0ZGTElORSBpb2N0bCBoYXMgYmVlbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IGlzc3VlZCAoYHNvZnQgZWplY3QnKQotICogICsgZnRfZm9ybWF0dGVkID09IDAgICAgICAgIC0tIHRoaXMgbWVhbnMgdGhhdCB0aGUgY2FydHJpZGdlIGlzIG5vdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZAotICogIFRoZW4gd2UgZGlzdGludWd1aXNoIHR3byBjYXNlcy4gV2hlbiB6ZnRfcWljX21vZGUgaXMgVFJVRSwgdGhlbiB3ZSB0cnkKLSAqICB0byBlbXVsYXRlIGEgYHRyYWRpdGlvbmFsJyAoYWthIFNDU0kgbGlrZSkgVU4qWCB0YXBlIGRldmljZS4gVGhlcmVmb3JlIHdlCi0gKiAgZGVueSB3cml0ZXMgd2hlbgotICogICsgemZ0X3FpY19tb2RlID09MSAmJiAKLSAqICAgICAgICghemZ0X3RhcGVfYXRfbGJvdCgpICYmICAgLS0gdGFwZSBubyBhdCBsb2dpY2FsIEJPVAotICogICAgICAgICEoemZ0X3RhcGVfYXRfZW9tKCkgfHwgICAtLSB0YXBlIG5vdCBhdCBsb2dpY2FsIEVPTSAob3IgRU9EKQotICogICAgICAgICAgKHpmdF90YXBlX2F0X2VvbSgpICYmCi0gKiAgICAgICAgICAgemZ0X29sZF9mdGFwZSgpKSkpICAgIC0tIHdlIGNhbid0IGFkZCBuZXcgdm9sdW1lIHRvIHRhcGVzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIGJ5IG9sZCBmdGFwZSBiZWNhdXNlIGZ0YXBlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IHVzZSB0aGUgdm9sdW1lIHRhYmxlCi0gKgotICogIHdoZW4gdGhlIGRyaXZlIGlzIGluIHRydWUgcmF3IG1vZGUgKGFrYSAvZGV2L3Jhd2Z0MCkgdGhlbiB3ZSBkb24ndCAKLSAqICBjYXJlIGFib3V0IExCT1QgYW5kIEVPTSBjb25kaXRpb25zLiBUaGlzIGRldmljZSBpcyBpbnRlbmRlZCBmb3IgYSAKLSAqICB1c2VyIGxldmVsIHByb2dyYW0gdGhhdCB3YW50cyB0byB0cnVseSBpbXBsZW1lbnQgdGhlIFFJQy04MCBjb21wbGlhbmNlCi0gKiAgYXQgdGhlIGxvZ2ljYWwgZGF0YSBsYXlvdXQgbGV2ZWwgb2YgdGhlIGNhcnRyaWRnZSwgaS5lLiBpbXBsZW1lbnQgYWxsCi0gKiAgdGhhdCB2b2x1bWUgdGFibGUgYW5kIHZvbHVtZSBkaXJlY3Rvcnkgc3R1ZmYgZXRjLjwKLSAqLwotaW50IHpmdF9jaGVja193cml0ZV9hY2Nlc3MoemZ0X3Bvc2l0aW9uICpwb3MpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoemZ0X29mZmxpbmUpIHsgLyogb2ZmbGluZSBpbmNsdWRlcyBub190YXBlICovCi0JCVRSQUNFX0FCT1JUKC1FTlhJTywKLQkJCSAgICBmdF90X2luZm8sICJ0YXBlIGlzIG9mZmxpbmUgb3Igbm8gY2FydHJpZGdlIik7Ci0JfQotCWlmICghZnRfZm9ybWF0dGVkKSB7Ci0JCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywgInRhcGUgaXMgbm90IGZvcm1hdHRlZCIpOwotCX0gCi0JaWYgKHpmdF93cml0ZV9wcm90ZWN0ZWQpIHsKLQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLCAiY2FydHJpZGdlIHdyaXRlIHByb3RlY3RlZCIpOwotCX0gCi0JaWYgKHpmdF9xaWNfbW9kZSkgewotCQkvKiAgY2hlY2sgQk9UIGNvbmRpdGlvbiAqLwotCQlpZiAoIXpmdF90YXBlX2F0X2xib3QocG9zKSkgewotCQkJLyogIHByb3RlY3QgY2FydHJpZGdlcyB3cml0dGVuIGJ5IG9sZCBmdGFwZSBpZgotCQkJICogIG5vdCBhdCBCT1QgYmVjYXVzZSB0aGV5IHVzZSB0aGUgdnRibAotCQkJICogIHNlZ21lbnQgZm9yIHN0b3JpbmcgZGF0YQotCQkJICovCi0JCQlpZiAoemZ0X29sZF9mdGFwZSkgewotCQkJCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3Rfd2FybiwgCi0gICAgICAiQ2Fubm90IHdyaXRlIHRvIGNhcnRyaWRnZXMgd3JpdHRlbiBieSBvbGQgZnRhcGUgd2hlbiBub3QgYXQgQk9UIik7Ci0JCQl9Ci0JCQkvKiAgbm90IGF0IEJPVCwgYnV0IGFsbG93IHdyaXRlcyBhdCBFT0QsIG9mIGNvdXJzZQotCQkJICovCi0JCQlpZiAoIXpmdF90YXBlX2F0X2VvZChwb3MpKSB7Ci0JCQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLAotCQkJCQkgICAgInRhcGUgbm90IGF0IEJPVCBhbmQgbm90IGF0IEVPRCIpOwotCQkJfQotCQl9Ci0JCS8qICBmaW5lLiBOb3cgdGhlIHRhcGUgaXMgZWl0aGVyIGF0IEJPVCBvciBhdCBFT0QuICovCi0JfQotCS8qIG9yIGluIHJhdyBtb2RlIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCBCT1QgYW5kIEVPRCAqLwotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogICAgICBPUEVOIHJvdXRpbmUgY2FsbGVkIGJ5IGtlcm5lbC1pbnRlcmZhY2UgY29kZQotICoKLSAqICAgICAgTk9URTogdGhpcyBpcyBhbHNvIGNhbGxlZCBieSBtdF9yZXNldCgpIHdpdGggZGV2X21pbm9yID09IC0xCi0gKiAgICAgICAgICAgIHRvIGZha2UgYSByZW9wZW4gYWZ0ZXIgYSByZXNldC4KLSAqLwotaW50IF96ZnRfb3Blbih1bnNpZ25lZCBpbnQgZGV2X21pbm9yLCB1bnNpZ25lZCBpbnQgYWNjZXNzX21vZGUpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCB0YXBlX3VuaXQ7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBmaWxlX2FjY2Vzc19tb2RlOwotCWludCByZXN1bHQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoKGludClkZXZfbWlub3IgPT0gLTEpIHsKLQkJLyogZmFrZSByZW9wZW4gKi8KLQkJemZ0X3VuaXQgICAgPSB0YXBlX3VuaXQ7Ci0JCWFjY2Vzc19tb2RlID0gZmlsZV9hY2Nlc3NfbW9kZTsKLQkJemZ0X2luaXRfZHJpdmVyKCk7IC8qIHJlc2V0IGFsbCBzdGF0aWMgZGF0YSB0byBkZWZhdWx0cyAqLwotCX0gZWxzZSB7Ci0JCXRhcGVfdW5pdCAgICAgICAgPSBkZXZfbWlub3I7Ci0JCWZpbGVfYWNjZXNzX21vZGUgPSBhY2Nlc3NfbW9kZTsKLQkJaWYgKChyZXN1bHQgPSBmdGFwZV9lbmFibGUoRlRBUEVfU0VMKGRldl9taW5vcikpKSA8IDApIHsKLQkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9lcnIsCi0JCQkJICAgICJmdGFwZV9lbmFibGUgZmFpbGVkOiAlZCIsIHJlc3VsdCk7Ci0JCX0KLQkJaWYgKGZ0X25ld190YXBlIHx8IGZ0X25vX3RhcGUgfHwgIWZ0X2Zvcm1hdHRlZCB8fAotCQkgICAgKEZUQVBFX1NFTCh6ZnRfdW5pdCkgIT0gRlRBUEVfU0VMKGRldl9taW5vcikpIHx8Ci0JCSAgICAoemZ0X3VuaXQgJiBaRlRfUkFXX01PREUpICE9IChkZXZfbWlub3IgJiBaRlRfUkFXX01PREUpKSB7Ci0JCQkvKiByZXNldCBhbGwgc3RhdGljIGRhdGEgdG8gZGVmYXVsdHMsCi0JCQkgKi8KLQkJCXpmdF9pbml0X2RyaXZlcigpOyAKLQkJfQotCQl6ZnRfdW5pdCA9IGRldl9taW5vcjsKLQl9Ci0JemZ0X3NldF9mbGFncyh6ZnRfdW5pdCk7IC8qIGRlY29kZSB0aGUgbWlub3IgYml0cyAqLwotCWlmICh6ZnRfYmxrX3N6ID09IDEgJiYgemZ0X3VzZV9jb21wcmVzc2lvbikgewotCQlmdGFwZV9kaXNhYmxlKCk7IC8qIHJlc2V0cyBmdF9ub190YXBlICovCi0JCVRSQUNFX0FCT1JUKC1FTk9ERVYsIGZ0X3Rfd2FybiwgIlZhcmlhYmxlIGJsb2NrIHNpemUgbm90IHlldCAiCi0JCQkgICAgInN1cHBvcnRlZCB3aXRoIGNvbXByZXNzaW9uIik7Ci0JfQotCS8qICBubyBuZWVkIGZvciBtb3N0IG9mIHRoZSBidWZmZXJzIHdoZW4gbm8gdGFwZSBvciBub3QKLQkgKiAgZm9ybWF0dGVkLiAgZm9yIHRoZSByZWFkL3dyaXRlIG9wZXJhdGlvbnMsIGl0IGlzIHRoZQotCSAqICByZWdhcmRsZXNzIHdoZXRoZXIgdGhlcmUgaXMgbm8gdGFwZSwgYSBub3QtZm9ybWF0dGVkIHRhcGUKLQkgKiAgb3IgdGhlIHdoZXRoZXIgdGhlIGRyaXZlciBpcyBzb2Z0IG9mZmxpbmUuICAKLQkgKiAgTmV2ZXJ0aGVsZXNzIHdlIGFsbG93IHNvbWUgaW9jdGxzIHdpdGggbm9uLWZvcm1hdHRlZCB0YXBlcywgCi0JICogIGxpa2UgcmV3aW5kIGFuZCByZXNldC4KLQkgKi8KLQlpZiAoZnRfbm9fdGFwZSB8fCAhZnRfZm9ybWF0dGVkKSB7Ci0JCXpmdF91bmluaXRfbWVtKCk7Ci0JfQotCWlmIChmdF9ub190YXBlKSB7Ci0JCXpmdF9vZmZsaW5lID0gMTsgLyogc28gd2UgbmVlZCBub3QgdGVzdCB0d28gdmFyaWFibGVzICovCi0JfQotCWlmICgoYWNjZXNzX21vZGUgPT0gT19XUk9OTFkgfHwgYWNjZXNzX21vZGUgPT0gT19SRFdSKSAmJgotCSAgICAoZnRfd3JpdGVfcHJvdGVjdGVkIHx8IGZ0X25vX3RhcGUpKSB7Ci0JCWZ0YXBlX2Rpc2FibGUoKTsgLyogcmVzZXRzIGZ0X25vX3RhcGUgKi8KLQkJVFJBQ0VfQUJPUlQoZnRfbm9fdGFwZSA/IC1FTlhJTyA6IC1FUk9GUywKLQkJCSAgICBmdF90X3dhcm4sICJ3cm9uZyBhY2Nlc3MgbW9kZSAlcyBjYXJ0cmlkZ2UiLAotCQkJICAgIGZ0X25vX3RhcGUgPyAid2l0aG91dCBhIiA6ICJ3aXRoIHdyaXRlIHByb3RlY3RlZCIpOwotCX0KLQl6ZnRfd3JpdGVfcHJvdGVjdGVkID0gKGFjY2Vzc19tb2RlID09IE9fUkRPTkxZIHx8IAotCQkJICAgICAgIGZ0X3dyaXRlX3Byb3RlY3RlZCAhPSAwKTsKLQlpZiAoemZ0X3dyaXRlX3Byb3RlY3RlZCkgewotCQlUUkFDRShmdF90X25vaXNlLAotCQkgICAgICAicmVhZCBvbmx5IGFjY2VzcyBtb2RlOiAlZCwgIgotCQkgICAgICAiZHJpdmUgd3JpdGUgcHJvdGVjdGVkOiAlZCIsIAotCQkgICAgICBhY2Nlc3NfbW9kZSA9PSBPX1JET05MWSwKLQkJICAgICAgZnRfd3JpdGVfcHJvdGVjdGVkICE9IDApOwotCX0KLQlpZiAoIXpmdF9vZmZsaW5lKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF92bWFsbG9jX29uY2UoJnpmdF9kZWJsb2NrX2J1ZixGVF9TRUdNRU5UX1NJWkUpLAotCQkJICAgIGZ0YXBlX2Rpc2FibGUoKSk7Ci0JfQotCS8qIHpmdF9zZWdfcG9zIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHZ0Ymwgc2VncG9zIGJ1dCBub3QKLQkgKiBpZiBpbiBjb21wYXRpYmlsaXR5IG1vZGUgYW5kIG9ubHkgYWZ0ZXIgd2UgcmVhZCBpbiB0aGUKLQkgKiBoZWFkZXIgc2VnbWVudHMKLQkgKgotCSAqIG1pZ2h0IGFsc28gYmUgYSBwcm9ibGVtIGlmIHRoZSB1c2VyIG1ha2VzIGEgYmFja3VwIHdpdGggYQotCSAqICpxZnQqIGRldmljZSBhbmQgcmV3aW5kcyBpdCB3aXRoIGEgcmF3IGRldmljZS4KLQkgKi8KLQlpZiAoemZ0X3FpY19tb2RlICAgICAgICAgJiYKLQkgICAgIXpmdF9vbGRfZnRhcGUgICAgICAgJiYKLQkgICAgemZ0X3Bvcy5zZWdfcG9zID49IDAgJiYKLQkgICAgemZ0X2hlYWRlcl9yZWFkICAgICAgJiYgCi0JICAgIHpmdF9wb3Muc2VnX3BvcyA8PSBmdF9maXJzdF9kYXRhX3NlZ21lbnQpIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgInlvdSBwcm9iYWJseSBtaXhlZCB1cCB0aGUgemZ0YXBlIGRldmljZXMhIik7Ci0JCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7IAotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICAgICAgUkVMRUFTRSByb3V0aW5lIGNhbGxlZCBieSBrZXJuZWwtaW50ZXJmYWNlIGNvZGUKLSAqLwotaW50IF96ZnRfY2xvc2Uodm9pZCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoemZ0X29mZmxpbmUpIHsKLQkJLyogY2FsbCB0aGUgaGFyZHdhcmUgcmVsZWFzZSByb3V0aW5lLiBQdXRzIHRoZSBkcml2ZSBvZmZsaW5lICovCi0JCWZ0YXBlX2Rpc2FibGUoKTsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlpZiAoIShmdF93cml0ZV9wcm90ZWN0ZWQgfHwgemZ0X29sZF9mdGFwZSkpIHsKLQkJcmVzdWx0ID0gemZ0X2ZsdXNoX2J1ZmZlcnMoKTsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIndyaXRpbmcgZmlsZSBtYXJrIGF0IGN1cnJlbnQgcG9zaXRpb24iKTsKLQkJaWYgKHpmdF9xaWNfbW9kZSAmJiB6ZnRfY2xvc2Vfdm9sdW1lKCZ6ZnRfcG9zKSA9PSAwKSB7Ci0JCQl6ZnRfbW92ZV9wYXN0X2VvZigmemZ0X3Bvcyk7Ci0JCX0KLQkJaWYgKCh6ZnRfdGFwZV9hdF9sYm90KCZ6ZnRfcG9zKSB8fAotCQkgICAgICEoemZ0X3VuaXQgJiBGVEFQRV9OT19SRVdJTkQpKSkgewotCQkJaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCQkJcmVzdWx0ID0gemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsCi0JCQkJIkVycm9yOiB1bmFibGUgdG8gdXBkYXRlIGhlYWRlciBzZWdtZW50cyIpOwotCQkJfQotCQl9Ci0JfQotCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOwotCWlmICghKHpmdF91bml0ICYgRlRBUEVfTk9fUkVXSU5EKSkgewotCQlUUkFDRShmdF90X25vaXNlLCAicmV3aW5kaW5nIHRhcGUiKTsKLQkJaWYgKGZ0YXBlX3NlZWtfdG9fYm90KCkgPCAwICYmIHJlc3VsdCA+PSAwKSB7Ci0JCQlyZXN1bHQgPSAtRUlPOyAvKiBrZWVwIG9sZCB2YWx1ZSAqLwotCQl9Ci0JCXpmdF9yZXNldF9wb3NpdGlvbigmemZ0X3Bvcyk7Ci0JfSAKLQl6ZnRfemFwX3JlYWRfYnVmZmVycygpOwotCS8qICBub3cgZnJlZSB1cCBtZW1vcnkgYXMgbXVjaCBhcyBwb3NzaWJsZS4gV2UgZG9uJ3QgZGVzdHJveQotCSAqICB0aGUgZGVibG9jayBidWZmZXIgaWYgaXQgY29udGFpbmVzIGEgdmFsaWQgc2VnbWVudC4KLQkgKi8KLQlpZiAoemZ0X2RlYmxvY2tfc2VnbWVudCA9PSAtMSkgewotCQl6ZnRfdmZyZWUoJnpmdF9kZWJsb2NrX2J1ZiwgRlRfU0VHTUVOVF9TSVpFKTsgCi0JfQotCS8qIGhpZ2ggbGV2ZWwgZHJpdmVyIHN0YXR1cywgZm9yY2VzIGNyZWF0aW9uIG9mIGEgbmV3IHZvbHVtZQotCSAqIHdoZW4gY2FsbGluZyBmdGFwZV93cml0ZSBhZ2FpbiBhbmQgbm90IHpmdF9qdXN0X2JlZm9yZV9lb2YKLQkgKi8KLQl6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsgIAotCWlmIChnb2luZ19vZmZsaW5lKSB7Ci0JCXpmdF9pbml0X2RyaXZlcigpOwotCQl6ZnRfdW5pbml0X21lbSgpOwotCQlnb2luZ19vZmZsaW5lID0gMDsKLQkJemZ0X29mZmxpbmUgICA9IDE7Ci0JfSBlbHNlIGlmICh6ZnRfY21wcl9sb2NrKDAgLyogZG9uJ3QgbG9hZCAqLykgPT0gMCkgewotCQkoKnpmdF9jbXByX29wcy0+cmVzZXQpKCk7IC8qIHVubG9jayBpdCBhZ2FpbiAqLwotCX0KLQl6ZnRfbWVtb3J5X3N0YXRzKCk7Ci0JLyogY2FsbCB0aGUgaGFyZHdhcmUgcmVsZWFzZSByb3V0aW5lLiBQdXRzIHRoZSBkcml2ZSBvZmZsaW5lICovCi0JZnRhcGVfZGlzYWJsZSgpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKgotICogIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIGFyb3VuZCB0aGUgd3JhcHBlciBNVElPQ1RPUCBpb2N0bAotICovCi1zdGF0aWMgaW50IG10aW9jdG9wKHN0cnVjdCBtdG9wICptdG9wLCBpbnQgYXJnX3NpemUpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JZnVuX2VudHJ5ICptdF9mdW5fZW50cnk7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgbXRvcCkgfHwgbXRvcC0+bXRfb3AgPj0gTlJfTVRfQ01EUykgewotCQlUUkFDRV9FWElUIC1FSU5WQUw7Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJjYWxsaW5nIE1USU9DVE9QIGNvbW1hbmQ6ICVzIiwKLQkgICAgICBtdF9mdW5zW210b3AtPm10X29wXS5uYW1lKTsKLQltdF9mdW5fZW50cnk9ICZtdF9mdW5zW210b3AtPm10X29wXTsKLQl6ZnRfcmVzaWQgPSBtdG9wLT5tdF9jb3VudDsKLQlpZiAoIW10X2Z1bl9lbnRyeS0+b2ZmbGluZSAmJiB6ZnRfb2ZmbGluZSkgewotCQlpZiAoZnRfbm9fdGFwZSkgewotCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2luZm8sICJubyB0YXBlIHByZXNlbnQiKTsKLQkJfSBlbHNlIHsKLQkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF9pbmZvLCAiZHJpdmUgaXMgb2ZmbGluZSIpOwotCQl9Ci0JfQotCWlmICghbXRfZnVuX2VudHJ5LT5ub3RfZm9ybWF0dGVkICYmICFmdF9mb3JtYXR0ZWQpIHsKLQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLCAidGFwZSBpcyBub3QgZm9ybWF0dGVkIik7Ci0JfQotCWlmICghbXRfZnVuX2VudHJ5LT53cml0ZV9wcm90ZWN0ZWQpIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X2NoZWNrX3dyaXRlX2FjY2VzcygmemZ0X3BvcyksKTsKLQl9Ci0JaWYgKG10X2Z1bl9lbnRyeS0+bmVlZF9pZGxlX3N0YXRlICYmICEoemZ0X29mZmxpbmUgfHwgIWZ0X2Zvcm1hdHRlZCkpIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKLQl9Ci0JaWYgKCF6ZnRfcWljX21vZGUgJiYgIW10X2Z1bl9lbnRyeS0+cmF3X21vZGUpIHsKLQkJVFJBQ0VfQUJPUlQoLUVBQ0NFUywgZnRfdF9pbmZvLCAKLSJEcml2ZSBuZWVkcyB0byBiZSBpbiBRSUMtODAgY29tcGF0aWJpbGl0eSBtb2RlIGZvciB0aGlzIGNvbW1hbmQiKTsKLQl9Ci0JcmVzdWx0ID0gKG10X2Z1bl9lbnRyeS0+ZnVuY3Rpb24pKCZtdG9wLT5tdF9jb3VudCk7Ci0JaWYgKHpmdF90YXBlX2F0X2xib3QoJnpmdF9wb3MpKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF91cGRhdGVfaGVhZGVyX3NlZ21lbnRzKCksKTsKLQl9Ci0JaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCXpmdF9yZXNpZCA9IDA7Ci0JfQotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKgotICogIHN0YW5kYXJkIE1USU9DR0VUIGlvY3RsCi0gKi8KLXN0YXRpYyBpbnQgbXRpb2NnZXQoc3RydWN0IG10Z2V0ICptdGdldCwgaW50IGFyZ19zaXplKQotewotCWNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWU7Ci0JX19zNjQgbWF4X3RhcGVfcG9zOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10Z2V0KSkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLAotCQkJICAgIGFyZ19zaXplKTsKLQl9Ci0JbXRnZXQtPm10X3R5cGUgID0gZnRfZHJpdmVfdHlwZS52ZW5kb3JfaWQgKyAweDgwMDAwMDsKLQltdGdldC0+bXRfZHNyZWcgPSBmdF9sYXN0X3N0YXR1cy5zcGFjZTsKLQltdGdldC0+bXRfZXJyZWcgPSBmdF9sYXN0X2Vycm9yLnNwYWNlOyAvKiBlcnJvciByZWdpc3RlciAqLwotCW10Z2V0LT5tdF9yZXNpZCA9IHpmdF9yZXNpZDsgLyogcmVzaWR1dW0gb2Ygd3JpdGVzLCByZWFkcyBhbmQKLQkJCQkgICAgICAqIE1USU9DVE9QIGNvbW1hbmRzIAotCQkJCSAgICAgICovCi0JaWYgKCF6ZnRfb2ZmbGluZSkgeyAvKiBuZWl0aGVyIG5vX3RhcGUgbm9yIHNvZnQgb2ZmbGluZSAqLwotCQltdGdldC0+bXRfZ3N0YXQgPSBHTVRfT05MSU5FKH4wVUwpOwotCQkvKiBzaG91bGQgcmF0aGVyIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBjYXJ0cmlkZ2UKLQkJICogdGhhbiB0aGUgYWNjZXNzIG1vZGUgb2YgdGhlIGZpbGUsIHRoZXJlZm9yIHVzZQotCQkgKiBmdF93cml0ZV9wcm90ZWN0ZWQsIG5vdCB6ZnRfd3JpdGVfcHJvdGVjdGVkIAotCQkgKi8KLQkJaWYgKGZ0X3dyaXRlX3Byb3RlY3RlZCkgewotCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9XUl9QUk9UKH4wVUwpOwotCQl9Ci0JCWlmKHpmdF9oZWFkZXJfcmVhZCkgeyAvKiB0aGlzIGNhdGNoZXMgbm9uLWZvcm1hdHRlZCAqLwotCQkJdm9sdW1lID0gemZ0X2ZpbmRfdm9sdW1lKHpmdF9wb3Muc2VnX3Bvcyk7Ci0JCQltdGdldC0+bXRfZmlsZW5vID0gdm9sdW1lLT5jb3VudDsKLQkJCW1heF90YXBlX3BvcyA9IHpmdF9jYXBhY2l0eSAtIHpmdF9ibGtfc3o7Ci0JCQlpZiAoemZ0X3VzZV9jb21wcmVzc2lvbikgewotCQkJCW1heF90YXBlX3BvcyAtPSBaRlRfQ01QUl9PVkVSSEVBRDsKLQkJCX0KLQkJCWlmICh6ZnRfdGFwZV9hdF9lb2QoJnpmdF9wb3MpKSB7Ci0JCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9FT0QofjBVTCk7Ci0JCQl9Ci0JCQlpZiAoemZ0X3Bvcy50YXBlX3BvcyA+IG1heF90YXBlX3BvcykgewotCQkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfRU9UKH4wVUwpOwotCQkJfQotCQkJbXRnZXQtPm10X2Jsa25vID0gemZ0X2Rpdl9ibGtzeih6ZnRfcG9zLnZvbHVtZV9wb3MsCi0JCQkJCQkJdm9sdW1lLT5ibGtfc3opOwotCQkJaWYgKHpmdF9qdXN0X2JlZm9yZV9lb2YpIHsKLQkJCQltdGdldC0+bXRfZ3N0YXQgfD0gR01UX0VPRih+MFVMKTsKLQkJCX0KLQkJCWlmICh6ZnRfdGFwZV9hdF9sYm90KCZ6ZnRfcG9zKSkgewotCQkJCW10Z2V0LT5tdF9nc3RhdCB8PSBHTVRfQk9UKH4wVUwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbXRnZXQtPm10X2ZpbGVubyA9IG10Z2V0LT5tdF9ibGtubyA9IC0xOwotCQkJaWYgKG10Z2V0LT5tdF9kc3JlZyAmIFFJQ19TVEFUVVNfQVRfQk9UKSB7Ci0JCQkJbXRnZXQtPm10X2dzdGF0IHw9IEdNVF9CT1QofjBVTCk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoZnRfbm9fdGFwZSkgewotCQkJbXRnZXQtPm10X2dzdGF0ID0gR01UX0RSX09QRU4ofjBVTCk7Ci0JCX0gZWxzZSB7Ci0JCQltdGdldC0+bXRfZ3N0YXQgPSAwVUw7Ci0JCX0KLSAJCW10Z2V0LT5tdF9maWxlbm8gPSBtdGdldC0+bXRfYmxrbm8gPSAtMTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0jaWZkZWYgTVRJT0NSREZUU0VHCi0vKgotICogIFJlYWQgYSBmbG9wcHkgdGFwZSBzZWdtZW50LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWFuaXB1bGF0aW5nIHRoZQotICogIHZvbHVtZSB0YWJsZSwgYW5kIHJlYWQgdGhlIG9sZCBoZWFkZXIgc2VnbWVudCBiZWZvcmUgcmUtZm9ybWF0dGluZwotICogIHRoZSBjYXJ0cmlkZ2UuCi0gKi8KLXN0YXRpYyBpbnQgbXRpb2NyZGZ0c2VnKHN0cnVjdCBtdGZ0c2VnICogbXRmdHNlZywgaW50IGFyZ19zaXplKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ1JERlRTRUciKTsKLQlpZiAoemZ0X3FpY19tb2RlKSB7Ci0JCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywKLQkJCSAgICAiZHJpdmVyIG5lZWRzIHRvIGJlIGluIHJhdyBtb2RlIGZvciB0aGlzIGlvY3RsIik7Ci0JfSAKLQlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdGZ0c2VnKSkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLAotCQkJICAgIGFyZ19zaXplKTsKLQl9Ci0JaWYgKHpmdF9vZmZsaW5lKSB7Ci0JCVRSQUNFX0VYSVQgLUVOWElPOwotCX0KLQlpZiAobXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9SRF9TSU5HTEUgJiYKLQkgICAgbXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9SRF9BSEVBRCkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sICJpbnZhbGlkIHJlYWQgbW9kZSIpOwotCX0KLQlpZiAoIWZ0X2Zvcm1hdHRlZCkgewotCQlUUkFDRV9FWElUIC1FQUNDRVM7IC8qIC1FTlhJTyA/ICovCi0KLQl9Ci0JaWYgKCF6ZnRfaGVhZGVyX3JlYWQpIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKLQl9Ci0JaWYgKG10ZnRzZWctPm10X3NlZ25vID4gZnRfbGFzdF9kYXRhX3NlZ21lbnQpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAic2VnbWVudCBudW1iZXIgaXMgdG9vIGxhcmdlIik7Ci0JfQotCW10ZnRzZWctPm10X3Jlc3VsdCA9IGZ0YXBlX3JlYWRfc2VnbWVudChtdGZ0c2VnLT5tdF9zZWdubywKLQkJCQkJCXpmdF9kZWJsb2NrX2J1ZiwKLQkJCQkJCW10ZnRzZWctPm10X21vZGUpOwotCWlmIChtdGZ0c2VnLT5tdF9yZXN1bHQgPCAwKSB7Ci0JCS8qICBhIG5lZ2F0aXYgcmVzdWx0IGlzIG5vdCBhbiBpb2N0bCBlcnJvci4gaWYKLQkJICogIHRoZSB1c2VyIHdhbnRzIHRvIHJlYWQgZGFtYWdlZCB0YXBlcywKLQkJICogIGl0J3MgdXAgdG8gaGVyL2hpbQotCQkgKi8KLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQlpZiAoY29weV90b191c2VyKG10ZnRzZWctPm10X2RhdGEsCi0JCQkgemZ0X2RlYmxvY2tfYnVmLAotCQkJIG10ZnRzZWctPm10X3Jlc3VsdCkgIT0gMCkgewotCQlUUkFDRV9FWElUIC1FRkFVTFQ7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgTVRJT0NXUkZUU0VHCi0vKgotICogIHdyaXRlIGEgZmxvcHB5IHRhcGUgc2VnbWVudC4gVGhpcyB2ZXJzaW9uIGZlYXR1cmVzIHdyaXRpbmcgb2YKLSAqICBkZWxldGVkIGFkZHJlc3MgbWFya3MsIGFuZCBncmFjZWZ1bGx5IGlnbm9yZXMgdGhlIChzb2Z0d2FyZSkKLSAqICBmdF9mb3JtYXR0ZWQgZmxhZyB0byBzdXBwb3J0IHdyaXRpbmcgb2YgaGVhZGVyIHNlZ21lbnRzIGFmdGVyCi0gKiAgZm9ybWF0dGluZy4KLSAqLwotc3RhdGljIGludCBtdGlvY3dyZnRzZWcoc3RydWN0IG10ZnRzZWcgKiBtdGZ0c2VnLCBpbnQgYXJnX3NpemUpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NXUkZUU0VHIik7Ci0JaWYgKHpmdF93cml0ZV9wcm90ZWN0ZWQgfHwgemZ0X3FpY19tb2RlKSB7Ci0JCVRSQUNFX0VYSVQgLUVBQ0NFUzsKLQl9IAotCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10ZnRzZWcpKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsCi0JCQkgICAgYXJnX3NpemUpOwotCX0KLQlpZiAoemZ0X29mZmxpbmUpIHsKLQkJVFJBQ0VfRVhJVCAtRU5YSU87Ci0JfQotCWlmIChtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1dSX0FTWU5DICAgJiYgCi0JICAgIG10ZnRzZWctPm10X21vZGUgIT0gRlRfV1JfTVVMVEkgICAmJgotCSAgICBtdGZ0c2VnLT5tdF9tb2RlICE9IEZUX1dSX1NJTkdMRSAgJiYKLQkgICAgbXRmdHNlZy0+bXRfbW9kZSAhPSBGVF9XUl9ERUxFVEUpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLCAiaW52YWxpZCB3cml0ZSBtb2RlIik7Ci0JfQotCS8qCi0JICogIFdlIGRvbid0IGNoZWNrIGZvciBmdF9mb3JtYXR0ZWQsIGJlY2F1c2UgdGhpcyBnaXZlcwotCSAqICBvbmx5IHRoZSBzb2Z0d2FyZSBzdGF0dXMgb2YgdGhlIGRyaXZlci4KLQkgKgotCSAqICBXZSBhc3N1bWUgdGhhdCB0aGUgdXNlciBrbm93cyB3aGF0IGl0IGlzCi0JICogIGRvaW5nLiBBbmQgcmVseSBvbiB0aGUgbG93IGxldmVsIHN0dWZmIHRvIGZhaWwKLQkgKiAgd2hlbiB0aGUgdGFwZSBpc24ndCBmb3JtYXR0ZWQuIFdlIG9ubHkgbWFrZSBzdXJlCi0JICogIHRoYXQgVGhlIGhlYWRlciBzZWdtZW50IGJ1ZmZlciBpcyBhbGxvY2F0ZWQsCi0JICogIGJlY2F1c2UgaXQgaG9sZHMgdGhlIGJhZCBzZWN0b3IgbWFwLgotCSAqLwotCWlmICh6ZnRfaHNlZ19idWYgPT0gTlVMTCkgewotCQlUUkFDRV9FWElUIC1FTlhJTzsKLQl9Ci0JaWYgKG10ZnRzZWctPm10X21vZGUgIT0gRlRfV1JfREVMRVRFKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcih6ZnRfZGVibG9ja19idWYsIAotCQkJCSAgIG10ZnRzZWctPm10X2RhdGEsCi0JCQkJICAgRlRfU0VHTUVOVF9TSVpFKSAhPSAwKSB7Ci0JCQlUUkFDRV9FWElUIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JbXRmdHNlZy0+bXRfcmVzdWx0ID0gZnRhcGVfd3JpdGVfc2VnbWVudChtdGZ0c2VnLT5tdF9zZWdubywgCi0JCQkJCQkgemZ0X2RlYmxvY2tfYnVmLAotCQkJCQkJIG10ZnRzZWctPm10X21vZGUpOwotCWlmIChtdGZ0c2VnLT5tdF9yZXN1bHQgPj0gMCAmJiBtdGZ0c2VnLT5tdF9tb2RlID09IEZUX1dSX1NJTkdMRSkgewotCQkvKiAgCi0JCSAqICBhIG5lZ2F0aXYgcmVzdWx0IGlzIG5vdCBhbiBpb2N0bCBlcnJvci4gaWYKLQkJICogIHRoZSB1c2VyIHdhbnRzIHRvIHdyaXRlIGRhbWFnZWQgdGFwZXMsCi0JCSAqICBpdCdzIHVwIHRvIGhlci9oaW0KLQkJICovCi0JCWlmICgocmVzdWx0ID0gZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpKSA8IDApIHsKLQkJCW10ZnRzZWctPm10X3Jlc3VsdCA9IHJlc3VsdDsKLQkJfQotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0jZW5kaWYKLSAgCi0jaWZkZWYgTVRJT0NWT0xJTkZPCi0vKgotICogIGdldCBpbmZvcm1hdGlvbiBhYm91dCB2b2x1bWUgcG9zaXRpb25lZCBhdC4KLSAqLwotc3RhdGljIGludCBtdGlvY3ZvbGluZm8oc3RydWN0IG10dm9saW5mbyAqdm9saW5mbywgaW50IGFyZ19zaXplKQotewotCWNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWU7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JVFJBQ0UoZnRfdF9ub2lzZSwgIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DVk9MSU5GTyIpOwotCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10dm9saW5mbykpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKLQkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7Ci0JfQotCWlmICh6ZnRfb2ZmbGluZSkgewotCQlUUkFDRV9FWElUIC1FTlhJTzsKLQl9Ci0JaWYgKCFmdF9mb3JtYXR0ZWQpIHsKLQkJVFJBQ0VfRVhJVCAtRUFDQ0VTOwotCX0KLQlUUkFDRV9DQVRDSCh6ZnRfZGVmX2lkbGVfc3RhdGUoKSwpOwotCXZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZSh6ZnRfcG9zLnNlZ19wb3MpOwotCXZvbGluZm8tPm10X3ZvbG5vICAgPSB2b2x1bWUtPmNvdW50OwotCXZvbGluZm8tPm10X2Jsa3N6ICAgPSB2b2x1bWUtPmJsa19zeiA9PSAxID8gMCA6IHZvbHVtZS0+YmxrX3N6OwotCXZvbGluZm8tPm10X3NpemUgICAgPSB2b2x1bWUtPnNpemUgPj4gMTA7Ci0Jdm9saW5mby0+bXRfcmF3c2l6ZSA9ICgoemZ0X2NhbGNfdGFwZV9wb3Modm9sdW1lLT5lbmRfc2VnICsgMSkgPj4gMTApIC0KLQkJCSAgICAgICAoemZ0X2NhbGNfdGFwZV9wb3Modm9sdW1lLT5zdGFydF9zZWcpID4+IDEwKSk7Ci0Jdm9saW5mby0+bXRfY21wciAgICA9IHZvbHVtZS0+dXNlX2NvbXByZXNzaW9uOwotCVRSQUNFX0VYSVQgMDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgWkZUX09CU09MRVRFICAKLXN0YXRpYyBpbnQgbXRpb2NfemZ0YXBlX2dldGJsa3N6KHN0cnVjdCBtdGJsa3N6ICpibGtzeiwgaW50IGFyZ19zaXplKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJcbiIKLQkgICAgICBLRVJOX0lORk8gIk1hZyB0YXBlIGlvY3RsIGNvbW1hbmQ6IE1USU9DX1pUQVBFX0dFVEJMS1NaXG4iCi0JICAgICAgS0VSTl9JTkZPICJUaGlzIGlvY3RsIGlzIGhlcmUgbWVyZWx5IGZvciBjb21wYXRpYmlsaXR5LlxuIgotCSAgICAgIEtFUk5fSU5GTyAiUGxlYXNlIHVzZSBNVElPQ1ZPTElORk8gaW5zdGVhZCIpOwotCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10Ymxrc3opKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsCi0JCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOwotCX0KLQlpZiAoemZ0X29mZmxpbmUpIHsKLQkJVFJBQ0VfRVhJVCAtRU5YSU87Ci0JfQotCWlmICghZnRfZm9ybWF0dGVkKSB7Ci0JCVRSQUNFX0VYSVQgLUVBQ0NFUzsKLQl9Ci0JVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKLQlibGtzei0+bXRfYmxrc3ogPSB6ZnRfZmluZF92b2x1bWUoemZ0X3Bvcy5zZWdfcG9zKS0+YmxrX3N6OwotCVRSQUNFX0VYSVQgMDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgTVRJT0NHRVRTSVpFCi0vKgotICogIGdldCB0aGUgY2FwYWNpdHkgb2YgdGhlIHRhcGUgY2FydHJpZGdlLgotICovCi1zdGF0aWMgaW50IG10aW9jZ2V0c2l6ZShzdHJ1Y3QgbXR0YXBlc2l6ZSAqc2l6ZSwgaW50IGFyZ19zaXplKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ19aRlRBUEVfR0VUU0laRSIpOwotCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IG10dGFwZXNpemUpKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU5WQUwsCi0JCQkgICAgZnRfdF9pbmZvLCAiYmFkIGFyZ3VtZW50IHNpemU6ICVkIiwgYXJnX3NpemUpOwotCX0KLQlpZiAoemZ0X29mZmxpbmUpIHsKLQkJVFJBQ0VfRVhJVCAtRU5YSU87Ci0JfQotCWlmICghZnRfZm9ybWF0dGVkKSB7Ci0JCVRSQUNFX0VYSVQgLUVBQ0NFUzsKLQl9Ci0JVFJBQ0VfQ0FUQ0goemZ0X2RlZl9pZGxlX3N0YXRlKCksKTsKLQlzaXplLT5tdF9jYXBhY2l0eSA9ICh1bnNpZ25lZCBpbnQpKHpmdF9jYXBhY2l0eT4+MTApOwotCXNpemUtPm10X3VzZWQgICAgID0gKHVuc2lnbmVkIGludCkoemZ0X2dldF9lb21fcG9zKCk+PjEwKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBtdGlvY3BvcyhzdHJ1Y3QgbXRwb3MgKm10cG9zLCBpbnQgYXJnX3NpemUpCi17Ci0JaW50IHJlc3VsdDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NQT1MiKTsKLQlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdHBvcykpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKLQkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7Ci0JfQotCXJlc3VsdCA9IG10X3RlbGwoKGludCAqKSZtdHBvcy0+bXRfYmxrbm8pOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0jaWZkZWYgTVRJT0NGVEZPUk1BVAotLyoKLSAqIGZvcm1hdHRpbmcgb2YgZmxvcHB5IHRhcGUgY2FydHJpZGdlcy4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCi0gKiB0b2dldGhlciB3aXRoIHRoZSBNVElPQ0ZUQ01EIGlvY3RsIGFuZCB0aGUgbmV3IG1tYXAgZmVhdHVyZSAKLSAqLwotCi0vKiAKLSAqICBUaGlzIGZ1bmN0aW9uIHVzZXMgZnRhcGVfZGVjb2RlX2hlYWRlcl9zZWdtZW50KCkgdG8gaW5mb3JtIHRoZSBsb3cKLSAqICBsZXZlbCBmdGFwZSBtb2R1bGUgYWJvdXQgdGhlIG5ldyBwYXJhbWV0ZXJzLgotICoKLSAqICBJdCBlcmFzZXMgdGhlIGhzZWdfYnVmLiBUaGUgY2FsbGluZyBwcm9jZXNzIG11c3Qgc3BlY2lmeSBhbGwKLSAqICBwYXJhbWV0ZXJzIHRvIGFzc3VyZSBwcm9wZXIgb3BlcmF0aW9uLgotICoKLSAqICByZXR1cm4gdmFsdWVzOiAtRUlOVkFMIC0gd3JvbmcgYXJndW1lbnQgc2l6ZQotICogICAgICAgICAgICAgICAgIC1FSU5WQUwgLSBpZiBmdGFwZV9kZWNvZGVfaGVhZGVyX3NlZ21lbnQoKSBmYWlsZWQuCi0gKi8KLXN0YXRpYyBpbnQgc2V0X2Zvcm1hdF9wYXJtcyhzdHJ1Y3QgZnRmbXRwYXJtcyAqcCwgX191OCAqaHNlZ19idWYpCi17Ci0JZnRfdHJhY2VfdCBvbGRfbGV2ZWwgPSBUUkFDRV9MRVZFTDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJNVElPQ0ZURk9STUFUIG9wZXJhdGlvbiBGVEZNVF9TRVRQQVJNUyIpOwotCW1lbXNldChoc2VnX2J1ZiwgMCwgRlRfU0VHTUVOVF9TSVpFKTsKLQlQVVQ0KGhzZWdfYnVmLCBGVF9TSUdOQVRVUkUsIEZUX0hTRUdfTUFHSUMpOwotCi0JLyogIGZpbGwgaW4gdXNlciBzcGVjaWZpZWQgcGFyYW1ldGVycwotCSAqLwotCWhzZWdfYnVmW0ZUX0ZNVF9DT0RFXSA9IChfX3U4KXAtPmZ0X2ZtdGNvZGU7Ci0JUFVUMihoc2VnX2J1ZiwgRlRfU1BULCBwLT5mdF9zcHQpOwotCWhzZWdfYnVmW0ZUX1RQQ10gICAgICA9IChfX3U4KXAtPmZ0X3RwYzsKLQloc2VnX2J1ZltGVF9GSE1dICAgICAgPSAoX191OClwLT5mdF9maG07Ci0JaHNlZ19idWZbRlRfRlRNXSAgICAgID0gKF9fdTgpcC0+ZnRfZnRtOwotCi0JLyogIGZpbGwgaW4gc2FuZSBkZWZhdWx0cyB0byBtYWtlIGZ0YXBlIGhhcHB5LgotCSAqLyAKLQloc2VnX2J1ZltGVF9GU01dID0gKF9fdTgpMTI4OyAvKiAxMjggaXMgaGFyZCB3aXJlZCBhbGwgb3ZlciBmdGFwZSAqLwotCWlmIChwLT5mdF9mbXRjb2RlID09IGZtdF9iaWcpIHsKLQkJUFVUNChoc2VnX2J1ZiwgRlRfNl9IU0VHXzEsICAgMCk7Ci0JCVBVVDQoaHNlZ19idWYsIEZUXzZfSFNFR18yLCAgIDEpOwotCQlQVVQ0KGhzZWdfYnVmLCBGVF82X0ZSU1RfU0VHLCAyKTsKLQkJUFVUNChoc2VnX2J1ZiwgRlRfNl9MQVNUX1NFRywgcC0+ZnRfc3B0ICogcC0+ZnRfdHBjIC0gMSk7Ci0JfSBlbHNlIHsKLQkJUFVUMihoc2VnX2J1ZiwgRlRfSFNFR18xLCAgICAwKTsKLQkJUFVUMihoc2VnX2J1ZiwgRlRfSFNFR18yLCAgICAxKTsKLQkJUFVUMihoc2VnX2J1ZiwgRlRfRlJTVF9TRUcsICAyKTsKLQkJUFVUMihoc2VnX2J1ZiwgRlRfTEFTVF9TRUcsIHAtPmZ0X3NwdCAqIHAtPmZ0X3RwYyAtIDEpOwotCX0KLQotCS8qICBTeW5jaHJvbml6ZSB3aXRoIHRoZSBsb3cgbGV2ZWwgbW9kdWxlLiBUaGlzIGlzIHBhcnRpY3VsYXJseQotCSAqICBuZWVkZWQgZm9yIHVuZm9ybWF0dGVkIGNhcnRyaWRnZXMgYXMgdGhlIFFJQyBzdGQgd2FzIHByZXZpb3VzbHkgCi0JICogIHVua25vd24gQlVUIGlzIG5lZWRlZCB0byBzZXQgZGF0YSByYXRlIGFuZCB0byBjYWxjdWxhdGUgdGltZW91dHMuCi0JICovCi0JVFJBQ0VfQ0FUQ0goZnRhcGVfY2FsaWJyYXRlX2RhdGFfcmF0ZShwLT5mdF9xaWNzdGQmUUlDX1RBUEVfU1REX01BU0spLAotCQkgICAgX3JlcyA9IC1FSU5WQUwpOwotCi0JLyogIFRoZSBmb2xsb3dpbmcgd2lsbCBhbHNvIHJlY2FsY3VhbHRlIHRoZSB0aW1lb3V0cyBmb3IgdGhlIHRhcGUKLQkgKiAgbGVuZ3RoIGFuZCBRSUMgc3RkIHdlIHdhbnQgdG8gZm9ybWF0IHRvLgotCSAqICBhYm9ydCB3aXRoIC1FSU5WQUwgcmF0aGVyIHRoYW4gLUVJTwotCSAqLwotCVNFVF9UUkFDRV9MRVZFTChmdF90X3dhcm4pOwotCVRSQUNFX0NBVENIKGZ0YXBlX2RlY29kZV9oZWFkZXJfc2VnbWVudChoc2VnX2J1ZiksCi0JCSAgICBTRVRfVFJBQ0VfTEVWRUwob2xkX2xldmVsKTsgX3JlcyA9IC1FSU5WQUwpOwotCVNFVF9UUkFDRV9MRVZFTChvbGRfbGV2ZWwpOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyoKLSAqICBSZXR1cm4gdGhlIGludGVybmFsIFNPRlRXQVJFIHN0YXR1cyBvZiB0aGUga2VybmVsIGRyaXZlci4gVGhpcyBkb2VzCi0gKiAgTk9UIHF1ZXJ5IHRoZSB0YXBlIGRyaXZlIGFib3V0IGl0cyBzdGF0dXMuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2Zvcm1hdF9wYXJtcyhzdHJ1Y3QgZnRmbXRwYXJtcyAqcCwgX191OCAqaHNlZ19idWZmZXIpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X25vaXNlLCAiTVRJT0NGVEZPUk1BVCBvcGVyYXRpb24gRlRGTVRfR0VUUEFSTVMiKTsKLQlwLT5mdF9xaWNzdGQgID0gZnRfcWljX3N0ZDsKLQlwLT5mdF9mbXRjb2RlID0gZnRfZm9ybWF0X2NvZGU7Ci0JcC0+ZnRfZmhtICAgICA9IGhzZWdfYnVmZmVyW0ZUX0ZITV07Ci0JcC0+ZnRfZnRtICAgICA9IGhzZWdfYnVmZmVyW0ZUX0ZUTV07Ci0JcC0+ZnRfc3B0ICAgICA9IGZ0X3NlZ21lbnRzX3Blcl90cmFjazsKLQlwLT5mdF90cGMgICAgID0gZnRfdHJhY2tzX3Blcl90YXBlOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCBtdGlvY2Z0Zm9ybWF0KHN0cnVjdCBtdGZ0Zm9ybWF0ICptdGZ0Zm9ybWF0LCBpbnQgYXJnX3NpemUpCi17Ci0JaW50IHJlc3VsdDsKLQl1bmlvbiBmbXRfYXJnICphcmcgPSAmbXRmdGZvcm1hdC0+Zm10X2FyZzsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJNYWcgdGFwZSBpb2N0bCBjb21tYW5kOiBNVElPQ0ZURk9STUFUIik7Ci0JaWYgKHpmdF9vZmZsaW5lKSB7Ci0JCWlmIChmdF9ub190YXBlKSB7Ci0JCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfaW5mbywgIm5vIHRhcGUgcHJlc2VudCIpOwotCQl9IGVsc2UgewotCQkJVFJBQ0VfQUJPUlQoLUVOWElPLCBmdF90X2luZm8sICJkcml2ZSBpcyBvZmZsaW5lIik7Ci0JCX0KLQl9Ci0JaWYgKHpmdF9xaWNfbW9kZSkgewotCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sCi0JCQkgICAgImRyaXZlciBuZWVkcyB0byBiZSBpbiByYXcgbW9kZSBmb3IgdGhpcyBpb2N0bCIpOwotCX0gCi0JaWYgKHpmdF9oc2VnX2J1ZiA9PSBOVUxMKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF92Y2FsbG9jX29uY2UoJnpmdF9oc2VnX2J1ZiwgRlRfU0VHTUVOVF9TSVpFKSwpOwotCX0KLQl6ZnRfaGVhZGVyX3JlYWQgPSAwOwotCXN3aXRjaChtdGZ0Zm9ybWF0LT5mbXRfb3ApIHsKLQljYXNlIEZURk1UX1NFVF9QQVJNUzoKLQkJVFJBQ0VfQ0FUQ0goc2V0X2Zvcm1hdF9wYXJtcygmYXJnLT5mbXRfcGFybXMsIHpmdF9oc2VnX2J1ZiksKTsKLQkJVFJBQ0VfRVhJVCAwOwotCWNhc2UgRlRGTVRfR0VUX1BBUk1TOgotCQlUUkFDRV9DQVRDSChnZXRfZm9ybWF0X3Bhcm1zKCZhcmctPmZtdF9wYXJtcywgemZ0X2hzZWdfYnVmKSwpOwotCQlUUkFDRV9FWElUIDA7Ci0JY2FzZSBGVEZNVF9GT1JNQVRfVFJBQ0s6Ci0JCWlmICgoZnRfZm9ybWF0dGVkICYmIHpmdF9jaGVja193cml0ZV9hY2Nlc3MoJnpmdF9wb3MpIDwgMCkgfHwKLQkJICAgICghZnRfZm9ybWF0dGVkICYmIHpmdF93cml0ZV9wcm90ZWN0ZWQpKSB7Ci0JCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLCBmdF90X2luZm8sICJXcml0ZSBhY2Nlc3MgZGVuaWVkIik7Ci0JCX0KLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfZm9ybWF0X3RyYWNrKGFyZy0+Zm10X3RyYWNrLmZ0X3RyYWNrLAotCQkJCQkgICAgICAgYXJnLT5mbXRfdHJhY2suZnRfZ2FwMyksKTsKLQkJVFJBQ0VfRVhJVCAwOwotCWNhc2UgRlRGTVRfU1RBVFVTOgotCQlUUkFDRV9DQVRDSChmdGFwZV9mb3JtYXRfc3RhdHVzKCZhcmctPmZtdF9zdGF0dXMuZnRfc2VnbWVudCksKTsKLQkJVFJBQ0VfRVhJVCAwOwotCWNhc2UgRlRGTVRfVkVSSUZZOgotCQlUUkFDRV9DQVRDSChmdGFwZV92ZXJpZnlfc2VnbWVudChhcmctPmZtdF92ZXJpZnkuZnRfc2VnbWVudCwKLQkJCQkoU2VjdG9yTWFwICopJmFyZy0+Zm10X3ZlcmlmeS5mdF9ic20pLCk7Ci0JCVRSQUNFX0VYSVQgMDsKLQlkZWZhdWx0OgotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2VyciwgIkludmFsaWQgZm9ybWF0IG9wZXJhdGlvbiIpOwotCX0KLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLSNlbmRpZgotCi0jaWZkZWYgTVRJT0NGVENNRAotLyoKLSAqICBzZW5kIGEgUUlDLTExNyBjb21tYW5kIHRvIHRoZSBkcml2ZSwgd2l0aCBvcHRpb25hbCB0aW1lb3V0cywKLSAqICBwYXJhbWV0ZXIgYW5kIHJlc3VsdCBiaXRzLiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG9nZXRoZXIKLSAqICB3aXRoIHRoZSBmb3JtYXR0aW5nIGlvY3RsLgotICovCi1zdGF0aWMgaW50IG10aW9jZnRjbWQoc3RydWN0IG10ZnRjbWQgKmZ0Y21kLCBpbnQgYXJnX3NpemUpCi17Ci0JaW50IGk7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X25vaXNlLCAiTWFnIHRhcGUgaW9jdGwgY29tbWFuZDogTVRJT0NGVENNRCIpOwotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQlUUkFDRV9BQk9SVCgtRVBFUk0sIGZ0X3RfaW5mbywKLQkJCSAgICAibmVlZCBDQVBfU1lTX0FETUlOIGNhcGFiaWxpdHkgdG8gc2VuZCByYXcgcWljLTExNyBjb21tYW5kcyIpOwotCX0KLQlpZiAoemZ0X3FpY19tb2RlKSB7Ci0JCVRSQUNFX0FCT1JUKC1FQUNDRVMsIGZ0X3RfaW5mbywKLQkJCSAgICAiZHJpdmVyIG5lZWRzIHRvIGJlIGluIHJhdyBtb2RlIGZvciB0aGlzIGlvY3RsIik7Ci0JfSAKLQlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBtdGZ0Y21kKSkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLAotCQkJICAgIGZ0X3RfaW5mbywgImJhZCBhcmd1bWVudCBzaXplOiAlZCIsIGFyZ19zaXplKTsKLQl9Ci0JaWYgKGZ0Y21kLT5mdF93YWl0X2JlZm9yZSkgewotCQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkeV93YWl0KGZ0Y21kLT5mdF93YWl0X2JlZm9yZSwKLQkJCQkJICAgICAmZnRjbWQtPmZ0X3N0YXR1cyksKTsKLQl9Ci0JaWYgKGZ0Y21kLT5mdF9zdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKQotCQlnb3RvIGZ0bXRjbWRfZXJyb3I7Ci0JaWYgKGZ0Y21kLT5mdF9yZXN1bHRfYml0cyAhPSAwKSB7Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9vcGVyYXRpb24oJmZ0Y21kLT5mdF9yZXN1bHQsCi0JCQkJCQkgICBmdGNtZC0+ZnRfY21kLAotCQkJCQkJICAgZnRjbWQtPmZ0X3Jlc3VsdF9iaXRzKSwpOwotCX0gZWxzZSB7Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX2NvbW1hbmQoZnRjbWQtPmZ0X2NtZCksKTsKLQkJaWYgKGZ0Y21kLT5mdF9zdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKQotCQkJZ290byBmdG10Y21kX2Vycm9yOwotCQlmb3IgKGkgPSAwOyBpIDwgZnRjbWQtPmZ0X3Bhcm1fY250OyBpKyspIHsKLQkJCVRSQUNFX0NBVENIKGZ0YXBlX3BhcmFtZXRlcihmdGNtZC0+ZnRfcGFybXNbaV0mMHgwZiksKTsKLQkJCWlmIChmdGNtZC0+ZnRfc3RhdHVzICYgUUlDX1NUQVRVU19FUlJPUikKLQkJCQlnb3RvIGZ0bXRjbWRfZXJyb3I7Ci0JCX0KLQl9Ci0JaWYgKGZ0Y21kLT5mdF93YWl0X2FmdGVyICE9IDApIHsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZHlfd2FpdChmdGNtZC0+ZnRfd2FpdF9hZnRlciwKLQkJCQkJICAgICAmZnRjbWQtPmZ0X3N0YXR1cyksKTsKLQl9Ci1mdG10Y21kX2Vycm9yOgkgICAgICAgCi0JaWYgKGZ0Y21kLT5mdF9zdGF0dXMgJiBRSUNfU1RBVFVTX0VSUk9SKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJlcnJvciBzdGF0dXMgc2V0Iik7Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX3JlcG9ydF9lcnJvcigmZnRjbWQtPmZ0X2Vycm9yLAotCQkJCQkgICAgICAgJmZ0Y21kLT5mdF9jbWQsIDEpLCk7Ci0JfQotCVRSQUNFX0VYSVQgMDsgLyogdGhpcyBpcyBub3QgYW4gaS9vIGVycm9yICovCi19Ci0jZW5kaWYKLQotLyogIElPQ1RMIHJvdXRpbmUgY2FsbGVkIGJ5IGtlcm5lbC1pbnRlcmZhY2UgY29kZQotICovCi1pbnQgX3pmdF9pb2N0bCh1bnNpZ25lZCBpbnQgY29tbWFuZCwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0JaW50IHJlc3VsdDsKLQl1bmlvbiB7IHN0cnVjdCBtdG9wICAgICAgIG10b3A7Ci0JCXN0cnVjdCBtdGdldCAgICAgIG10Z2V0OwotCQlzdHJ1Y3QgbXRwb3MgICAgICBtdHBvczsKLSNpZmRlZiBNVElPQ1JERlRTRUcKLQkJc3RydWN0IG10ZnRzZWcgICAgbXRmdHNlZzsKLSNlbmRpZgotI2lmZGVmIE1USU9DVk9MSU5GTwotCQlzdHJ1Y3QgbXR2b2xpbmZvICBtdHZvbGluZm87Ci0jZW5kaWYKLSNpZmRlZiBNVElPQ0dFVFNJWkUKLQkJc3RydWN0IG10dGFwZXNpemUgbXR0YXBlc2l6ZTsKLSNlbmRpZgotI2lmZGVmIE1USU9DRlRGT1JNQVQKLQkJc3RydWN0IG10ZnRmb3JtYXQgbXRmdGZvcm1hdDsKLSNlbmRpZgotI2lmZGVmIFpGVF9PQlNPTEVURQotCQlzdHJ1Y3QgbXRibGtzeiBtdGJsa3N6OwotI2VuZGlmCi0jaWZkZWYgTVRJT0NGVENNRAotCQlzdHJ1Y3QgbXRmdGNtZCBtdGZ0Y21kOwotI2VuZGlmCi0JfSBrcm5sX2FyZzsKLQlpbnQgYXJnX3NpemUgPSBfSU9DX1NJWkUoY29tbWFuZCk7Ci0JaW50IGRpciA9IF9JT0NfRElSKGNvbW1hbmQpOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JLyogVGhpcyBjaGVjayB3aWxsIG9ubHkgY2F0Y2ggYXJndW1lbnRzIHRoYXQgYXJlIHRvbyBsYXJnZSAhCi0JICovCi0JaWYgKGRpciAmIChfSU9DX1JFQUQgfCBfSU9DX1dSSVRFKSAmJiBhcmdfc2l6ZSA+IHNpemVvZihrcm5sX2FyZykpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwKLQkJCSAgICBmdF90X2luZm8sICJiYWQgYXJndW1lbnQgc2l6ZTogJWQiLCBhcmdfc2l6ZSk7Ci0JfQotCWlmIChkaXIgJiBfSU9DX1dSSVRFKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigma3JubF9hcmcsIGFyZywgYXJnX3NpemUpICE9IDApIHsKLQkJCVRSQUNFX0VYSVQgLUVGQVVMVDsKLQkJfQotCX0KLQlUUkFDRShmdF90X2Zsb3csICJjYWxsZWQgd2l0aCBpb2N0bCBjb21tYW5kOiAweCUwOHgiLCBjb21tYW5kKTsKLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIE1USU9DVE9QOgotCQlyZXN1bHQgPSBtdGlvY3RvcCgma3JubF9hcmcubXRvcCwgYXJnX3NpemUpOwotCQlicmVhazsKLQljYXNlIE1USU9DR0VUOgotCQlyZXN1bHQgPSBtdGlvY2dldCgma3JubF9hcmcubXRnZXQsIGFyZ19zaXplKTsKLQkJYnJlYWs7Ci0JY2FzZSBNVElPQ1BPUzoKLQkJcmVzdWx0ID0gbXRpb2Nwb3MoJmtybmxfYXJnLm10cG9zLCBhcmdfc2l6ZSk7Ci0JCWJyZWFrOwotI2lmZGVmIE1USU9DVk9MSU5GTwotCWNhc2UgTVRJT0NWT0xJTkZPOgotCQlyZXN1bHQgPSBtdGlvY3ZvbGluZm8oJmtybmxfYXJnLm10dm9saW5mbywgYXJnX3NpemUpOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIFpGVF9PQlNPTEVURQotCWNhc2UgTVRJT0NfWkZUQVBFX0dFVEJMS1NaOgotCQlyZXN1bHQgPSBtdGlvY196ZnRhcGVfZ2V0Ymxrc3ooJmtybmxfYXJnLm10Ymxrc3osIGFyZ19zaXplKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNVElPQ1JERlRTRUcKLQljYXNlIE1USU9DUkRGVFNFRzogLyogcmVhZCBhIHNlZ21lbnQgdmlhIGlvY3RsICovCi0JCXJlc3VsdCA9IG10aW9jcmRmdHNlZygma3JubF9hcmcubXRmdHNlZywgYXJnX3NpemUpOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIE1USU9DV1JGVFNFRwotCWNhc2UgTVRJT0NXUkZUU0VHOiAvKiB3cml0ZSBhIHNlZ21lbnQgdmlhIGlvY3RsICovCi0JCXJlc3VsdCA9IG10aW9jd3JmdHNlZygma3JubF9hcmcubXRmdHNlZywgYXJnX3NpemUpOwotCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIE1USU9DR0VUU0laRQotCWNhc2UgTVRJT0NHRVRTSVpFOgotCQlyZXN1bHQgPSBtdGlvY2dldHNpemUoJmtybmxfYXJnLm10dGFwZXNpemUsIGFyZ19zaXplKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNVElPQ0ZURk9STUFUCi0JY2FzZSBNVElPQ0ZURk9STUFUOgotCQlyZXN1bHQgPSBtdGlvY2Z0Zm9ybWF0KCZrcm5sX2FyZy5tdGZ0Zm9ybWF0LCBhcmdfc2l6ZSk7Ci0JCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTVRJT0NGVENNRAotCWNhc2UgTVRJT0NGVENNRDoKLQkJcmVzdWx0ID0gbXRpb2NmdGNtZCgma3JubF9hcmcubXRmdGNtZCwgYXJnX3NpemUpOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlpZiAoKHJlc3VsdCA+PSAwKSAmJiAoZGlyICYgX0lPQ19SRUFEKSkgewotCQlpZiAoY29weV90b191c2VyKGFyZywgJmtybmxfYXJnLCBhcmdfc2l6ZSkgIT0gMCkgewotCQkJVFJBQ0VfRVhJVCAtRUZBVUxUOwotCQl9Ci0JfQotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtY3RsLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2ZjJkNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNpZm5kZWYgX1pGVEFQRV9DVExfSAotI2RlZmluZSBfWkZUQVBFX0NUTF9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1jdGwuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjAyICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm9uLXN0YW5kYXJkIElPQ1RMIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvciBMaW51eC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGlvLmg+Ci0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCi0KLSNpZmRlZiBDT05GSUdfWkZUQVBFX01PRFVMRQotI2RlZmluZSBmdGFwZV9zdGF0dXMgKCp6ZnRfc3RhdHVzKQotI2VuZGlmCi0KLWV4dGVybiBpbnQgemZ0X29mZmxpbmU7Ci1leHRlcm4gaW50IHpmdF9tdF9jb21wcmVzc2lvbjsKLWV4dGVybiBpbnQgemZ0X3dyaXRlX3Byb3RlY3RlZDsKLWV4dGVybiBpbnQgemZ0X2hlYWRlcl9yZWFkOwotZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfdW5pdDsKLWV4dGVybiBpbnQgemZ0X3Jlc2lkOwotCi1leHRlcm4gdm9pZCB6ZnRfcmVzZXRfcG9zaXRpb24oemZ0X3Bvc2l0aW9uICpwb3MpOwotZXh0ZXJuIGludCAgemZ0X2NoZWNrX3dyaXRlX2FjY2Vzcyh6ZnRfcG9zaXRpb24gKnBvcyk7Ci1leHRlcm4gaW50ICB6ZnRfZGVmX2lkbGVfc3RhdGUodm9pZCk7Ci0KLS8qICBob29rcyBmb3IgdGhlIFZGUyBpbnRlcmZhY2UgCi0gKi8KLWV4dGVybiBpbnQgIF96ZnRfb3Blbih1bnNpZ25lZCBpbnQgZGV2X21pbm9yLCB1bnNpZ25lZCBpbnQgYWNjZXNzX21vZGUpOwotZXh0ZXJuIGludCAgX3pmdF9jbG9zZSh2b2lkKTsKLWV4dGVybiBpbnQgIF96ZnRfaW9jdGwodW5zaWduZWQgaW50IGNvbW1hbmQsIHZvaWQgX191c2VyICphcmcpOwotI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FkY2FlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWVvZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiAgIEkgdXNlIHRoZXNlIHJvdXRpbmVzIGp1c3QgdG8gZGVjaWRlIHdoZW4gSSBoYXZlIHRvIGZha2UgYSAKLSAqICAgdm9sdW1lLXRhYmxlIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgdG8gb3JpZ2luYWwgZnRhcGUuCi0gKi8KLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1IEJhcyBMYWFyaG92ZW4uCi0gKiAgICAgIAotICogICAgICBNb2RpZmllZCBmb3IgemZ0YXBlIDE5OTYsIDE5OTcgQ2xhdXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjAyICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZW9mIG1hcmsgaGFuZGxpbmcgY29kZQotICogICAgICBmb3IgdGhlIFFJQy00MC84MCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotCi0jaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+Ci0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotCi0vKiBhIGNvcHkgb2YgdGhlIGZhaWxlZCBzZWN0b3IgbG9nIGZyb20gdGhlIGhlYWRlciBzZWdtZW50LgotICovCi1lb2ZfbWFya191bmlvbiAqemZ0X2VvZl9tYXA7Ci0KLS8qIG51bWJlciBvZiBlb2YgbWFya3MgKGVudHJpZXMgaW4gYmFkIHNlY3RvciBsb2cpIG9uIHRhcGUuCi0gKi8KLWludCB6ZnRfbnJfZW9mX21hcmtzID0gLTE7Ci0KLQotLyogICAgICBMb2NhbCB2YXJzLgotICovCi0KLXN0YXRpYyBjaGFyIGxpbnV4X3RhcGVfbGFiZWxbXSA9ICJMaW51eCByYXcgZm9ybWF0IFYiOwotZW51bSB7IAotCW1pbl9mbXRfdmVyc2lvbiA9IDEsIG1heF9mbXRfdmVyc2lvbiA9IDIgCi19Owotc3RhdGljIHVuc2lnbmVkIGZ0YXBlX2ZtdF92ZXJzaW9uID0gMDsKLQotCi0vKiBGdGFwZSAobWlzKXVzZXMgdGhlIGJhZCBzZWN0b3IgbG9nIHRvIHJlY29yZCBlbmQtb2YtZmlsZSBtYXJrcy4KLSAqIEluaXRpYWxseSAod2hlbiB0aGUgdGFwZSBpcyBlcmFzZWQpIGFsbCBlbnRyaWVzIGluIHRoZSBiYWQgc2VjdG9yCi0gKiBsb2cgYXJlIGFkZGVkIHRvIHRoZSB0YXBlJ3MgYmFkIHNlY3RvciBtYXAuIFRoZSBiYWQgc2VjdG9yIGxvZyB0aGVuCi0gKiBpcyBjbGVhcmVkLgotICoKLSAqIFRoZSBiYWQgc2VjdG9yIGxvZyBub3JtYWxseSBjb250YWlucyBlbnRyaWVzIG9mIHRoZSBmb3JtOiAKLSAqIGV2ZW4gMTYtYml0IHdvcmQ6IHNlZ21lbnQgbnVtYmVyIG9mIGJhZCBzZWN0b3IgCi0gKiBvZGQgMTYtYml0IHdvcmQ6IGVuY29kZWQgZGF0ZQotICogVGhlcmUgY2FuIGJlIGEgdG90YWwgb2YgNDQ4IGVudHJpZXMgKDE3OTIgYnl0ZXMpLgotICoKLSAqIE15IGd1ZXNzIGlzIHRoYXQgbm8gcHJvZ3JhbSBpcyB1c2luZyB0aGlzIGJhZCBzZWN0b3IgbG9nICh0aGUgKgotICogZm9ybWF0IHNlZW1zIHVzZWxlc3MgYXMgdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiBvZiB0aGUgYmFkIHNlY3RvcgotICogaXRzZWxmLCBvbmx5IHRoZSBzZWdtZW50KSBIb3dldmVyLCBpZiBhbnkgcHJvZ3JhbSBkb2VzIHVzZSB0aGUgYmFkCi0gKiBzZWN0b3IgbG9nLCB0aGUgZm9ybWF0IHVzZWQgYnkgZnRhcGUgd2lsbCBsZXQgdGhlIHByb2dyYW0gdGhpbmsKLSAqIHRoZXJlIGFyZSBzb21lIGJhZCBzZWN0b3JzIGFuZCBubyBoYXJtIGlzIGRvbmUuCi0gKiAgCi0gKiBUaGUgZW9mIG1hcmsgZW50cmllcyB0aGF0IGZ0YXBlIHN0b3JlcyBpbiB0aGUgYmFkIHNlY3RvciBsb2c6IGV2ZW4KLSAqIDE2LWJpdCB3b3JkOiBzZWdtZW50IG51bWJlciBvZiBlb2YgbWFyayBvZGQgMTYtYml0IHdvcmQ6IHNlY3RvcgotICogbnVtYmVyIG9mIGVvZiBtYXJrIFsxLi4zMl0KLSAqICAKLSAqIFRoZSB6ZnRfZW9mX21hcCBhcyBtYWludGFpbmVkIGlzIGEgc29ydGVkIGxpc3Qgb2YgZW9mIG1hcmsgZW50cmllcy4KLSAqCi0gKgotICogVGhlIHRhcGUgbmFtZSBmaWVsZCBpbiB0aGUgaGVhZGVyIHNlZ21lbnRzIGlzIHVzZWQgdG8gc3RvcmUgYSBsaW51eAotICogdGFwZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcgYW5kIGEgdmVyc2lvbiBudW1iZXIuICBUaGlzIHdheSB0aGUgdGFwZQotICogY2FuIGJlIHJlY29nbml6ZWQgYXMgYSBMaW51eCByYXcgZm9ybWF0IHRhcGUgd2hlbiB1c2luZyB0b29scyB1bmRlcgotICogb3RoZXIgT1Mncy4KLSAqCi0gKiAnV2lkZScgUUlDIHRhcGVzIChmb3JtYXQgY29kZSA0KSBkb24ndCBoYXZlIGEgZmFpbGVkIHNlY3RvciBsaXN0Ci0gKiBhbnltb3JlLiBUaGF0IHNwYWNlIGlzIHVzZWQgZm9yIHRoZSAobG9uZ2VyKSBiYWQgc2VjdG9yIG1hcCB0aGF0Ci0gKiBub3cgaXMgYSB2YXJpYWJsZSBsZW5ndGggbGlzdCB0b28uICBXZSBub3cgc3RvcmUgb3VyIGVuZC1vZi1maWxlCi0gKiBtYXJrZXIgbGlzdCBhZnRlciB0aGUgYmFkLXNlY3Rvci1tYXAgb24gdGFwZS4gVGhlIGxpc3QgaXMgZGVsaW1pdGVkCi0gKiBieSBhIChfX3UzMikgMCBlbnRyeS4KLSAqLwotCi1pbnQgemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKGNoYXIgKmxhYmVsKQotewotCXN0YXRpYyBjaGFyIHRtcF9sYWJlbFs0NV07Ci0JaW50IHJlc3VsdCA9IDA7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkKLQltZW1jcHkodG1wX2xhYmVsLCBsYWJlbCwgRlRfTEFCRUxfU1opOwotCXRtcF9sYWJlbFtGVF9MQUJFTF9TWl0gPSAnXDAnOwotCVRSQUNFKGZ0X3Rfbm9pc2UsICJ0YXBlICBsYWJlbCA9IGAlcyciLCB0bXBfbGFiZWwpOwotCWZ0YXBlX2ZtdF92ZXJzaW9uID0gMDsKLQlpZiAobWVtY21wKGxhYmVsLCBsaW51eF90YXBlX2xhYmVsLCBzdHJsZW4obGludXhfdGFwZV9sYWJlbCkpID09IDApIHsKLQkJaW50IHBvcyA9IHN0cmxlbihsaW51eF90YXBlX2xhYmVsKTsKLQkJd2hpbGUgKGxhYmVsW3Bvc10gPj0gJzAnICYmIGxhYmVsW3Bvc10gPD0gJzknKSB7Ci0JCQlmdGFwZV9mbXRfdmVyc2lvbiAqPSAxMDsKLQkJCWZ0YXBlX2ZtdF92ZXJzaW9uID0gbGFiZWxbIHBvcysrXSAtICcwJzsKLQkJfQotCQlyZXN1bHQgPSAoZnRhcGVfZm10X3ZlcnNpb24gPj0gbWluX2ZtdF92ZXJzaW9uICYmCi0JCQkgIGZ0YXBlX2ZtdF92ZXJzaW9uIDw9IG1heF9mbXRfdmVyc2lvbik7Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJmb3JtYXQgdmVyc2lvbiA9ICVkIiwgZnRhcGVfZm10X3ZlcnNpb24pOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi1zdGF0aWMgX191OCAqIGZpbmRfZW5kX29mX2VvZl9saXN0KF9fdTggKiBwdHIsIF9fdTggKiBsaW1pdCkKLXsKLQl3aGlsZSAocHRyICsgMyA8IGxpbWl0KSB7Ci0KLQkJaWYgKGdldF91bmFsaWduZWQoKF9fdTMyKilwdHIpKSB7Ci0JCQlwdHIgKz0gc2l6ZW9mKF9fdTMyKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwdHI7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgemZ0X2Z0YXBlX2V4dHJhY3RfZmlsZV9tYXJrcyhfX3U4KiBhZGRyZXNzKQotewotCWludCBpOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0JCi0JemZ0X2VvZl9tYXAgPSBOVUxMOwotCWlmIChmdF9mb3JtYXRfY29kZSA9PSBmbXRfdmFyIHx8IGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKLQkJX191OCogZW5kOwotCQlfX3U4KiBzdGFydCA9IGZ0YXBlX2ZpbmRfZW5kX29mX2JzbV9saXN0KGFkZHJlc3MpOwotCi0JCXpmdF9ucl9lb2ZfbWFya3MgPSAwOwotCQlpZiAoc3RhcnQpIHsKLQkJCXN0YXJ0ICs9IDM7IC8qIHNraXAgZW5kIG9mIGxpc3QgbWFyayAqLwotCQkJZW5kID0gZmluZF9lbmRfb2ZfZW9mX2xpc3Qoc3RhcnQsIAotCQkJCQkJICAgYWRkcmVzcyArIEZUX1NFR01FTlRfU0laRSk7Ci0JCQlpZiAoZW5kICYmIGVuZCAtIHN0YXJ0IDw9IEZUX0ZTTF9TSVpFKSB7Ci0JCQkJemZ0X25yX2VvZl9tYXJrcyA9ICgoZW5kIC0gc3RhcnQpIC8gCi0JCQkJCQkgICAgc2l6ZW9mKGVvZl9tYXJrX3VuaW9uKSk7Ci0JCQkJemZ0X2VvZl9tYXAgPSAoZW9mX21hcmtfdW5pb24gKilzdGFydDsKLQkJCX0gZWxzZSB7Ci0JCQkJVFJBQ0UoZnRfdF9lcnIsCi0JCQkJICAgICAgIkVPRiBNYXJrIExpc3QgaXMgdG9vIGxvbmcgb3IgZGFtYWdlZCEiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVRSQUNFKGZ0X3RfZXJyLCAKLQkJCSAgICAgICJCYWQgU2VjdG9yIExpc3QgaXMgdG9vIGxvbmcgb3IgZGFtYWdlZCAhIik7Ci0JCX0KLQl9IGVsc2UgewotCQl6ZnRfZW9mX21hcCA9IChlb2ZfbWFya191bmlvbiAqKSZhZGRyZXNzW0ZUX0ZTTF07Ci0JCXpmdF9ucl9lb2ZfbWFya3MgPSBHRVQyKGFkZHJlc3MsIEZUX0ZTTF9DTlQpOwotCX0KLQlUUkFDRShmdF90X25vaXNlLCAibnVtYmVyIG9mIGZpbGUgbWFya3M6ICVkIiwgemZ0X25yX2VvZl9tYXJrcyk7Ci0JaWYgKGZ0YXBlX2ZtdF92ZXJzaW9uID09IDEpIHsKLQkJVFJBQ0UoZnRfdF9pbmZvLCAic3dhcHBpbmcgdmVyc2lvbiAxIGZpZWxkcyIpOwotCQkvKiB2ZXJzaW9uIDEgZm9ybWF0IHVzZXMgc3dhcHBlZCBzZWN0b3IgYW5kIHNlZ21lbnQKLQkJICogZmllbGRzLCBjb3JyZWN0IHRoYXQgISAgCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgemZ0X25yX2VvZl9tYXJrczsgKytpKSB7Ci0JCQlfX3UxNiB0bXAgPSBHRVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLnNlZ21lbnQsMCk7Ci0JCQlQVVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLnNlZ21lbnQsIDAsIAotCQkJICAgICBHRVQyKCZ6ZnRfZW9mX21hcFtpXS5tYXJrLmRhdGUsMCkpOwotCQkJUFVUMigmemZ0X2VvZl9tYXBbaV0ubWFyay5kYXRlLCAwLCB0bXApOwotCQl9Ci0JfQotCWZvciAoaSA9IDA7IGkgPCB6ZnRfbnJfZW9mX21hcmtzOyArK2kpIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgImVvZiBtYXJrOiAlNWQvJTJkIiwKLQkJCUdFVDIoJnpmdF9lb2ZfbWFwW2ldLm1hcmsuc2VnbWVudCwgMCksIAotCQkJR0VUMigmemZ0X2VvZl9tYXBbaV0ubWFyay5kYXRlLDApKTsKLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotdm9pZCB6ZnRfY2xlYXJfZnRhcGVfZmlsZV9tYXJrcyh2b2lkKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCS8qICBDbGVhciBmYWlsZWQgc2VjdG9yIGxvZzogcmVtb3ZlIGFsbCB0YXBlIG1hcmtzLiBXZQotCSAqICBkb24ndCB1c2Ugb2xkIGZ0YXBlLXN0eWxlIEVPRi1tYXJrcy4KLQkgKi8KLQlUUkFDRShmdF90X2luZm8sICJDbGVhcmluZyBvbGQgZnRhcGUncyBlb2YgbWFwIik7Ci0JbWVtc2V0KHpmdF9lb2ZfbWFwLCAwLCB6ZnRfbnJfZW9mX21hcmtzICogc2l6ZW9mKF9fdTMyKSk7Ci0JemZ0X25yX2VvZl9tYXJrcyA9IDA7Ci0JUFVUMih6ZnRfaHNlZ19idWYsIEZUX0ZTTF9DTlQsIDApOyAvKiBuciBvZiBlb2YtbWFya3MgKi8KLQl6ZnRfaGVhZGVyX2NoYW5nZWQgPSAxOwotCXpmdF91cGRhdGVfbGFiZWwoemZ0X2hzZWdfYnVmKTsKLQlUUkFDRV9FWElUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtZW9mLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1NjhjMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1lb2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSNpZm5kZWYgX1pGVEFQRV9FT0ZfSAotI2RlZmluZSBfWkZUQVBFX0VPRl9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSBCYXMgTGFhcmhvdmVuLgotICogYWRhcHRhZWQgZm9yIHpmdGFwZSAxOTk2LCAxOTk3IGJ5IENsYXVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtZW9mLmgsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOTowMyAkCi0gKgotICogICAgICBEZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZvciB0aGUgZW5kIG9mIGZpbGUgbWFya2VycwotICogICAgICBmb3IgdGhlIFFJQy00MC84MCBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mdGFwZS1oZWFkZXItc2VnbWVudC5oPgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgotLyogIGZhaWxlZCBzZWN0b3IgbG9nIHNpemUgKG9ubHkgdXNlZCBpZiBmb3JtYXQgY29kZSAhPSA0KS4KLSAqLwotCi10eXBlZGVmIHVuaW9uIHsKLQlmdF9mc2xfZW50cnkgbWFyazsKLQlfX3UzMiBlbnRyeTsKLX0gZW9mX21hcmtfdW5pb247Ci0gCi0vKiAgICAgIGZ0YXBlLWVvZi5jIGRlZmluZWQgZ2xvYmFsIHZhcnMuCi0gKi8KLWV4dGVybiBpbnQgemZ0X25yX2VvZl9tYXJrczsKLWV4dGVybiBlb2ZfbWFya191bmlvbiAqemZ0X2VvZl9tYXA7Ci0KLS8qICAgICAgZnRhcGUtZW9mLmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgotICovCi1leHRlcm4gdm9pZCB6ZnRfZnRhcGVfZXh0cmFjdF9maWxlX21hcmtzKF9fdTgqIGFkZHJlc3MpOwotZXh0ZXJuIGludCAgemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKGNoYXIqIGxhYmVsKTsKLWV4dGVybiB2b2lkIHpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY0YTFhYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZS4KLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0aGF0IHJlZ2lzdGVycyB0aGUgemZ0YXBlIGZyb250ZW5kIAotICogICAgICB0byB0aGUgZnRhcGUgZmxvcHB5IHRhcGUgZHJpdmVyIGZvciBMaW51eAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaWZkZWYgQ09ORklHX0tNT0QKLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXdyaXRlLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKLQotTU9EVUxFX0FVVEhPUigiKGMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lICIKLQkgICAgICAiKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSkiKTsKLU1PRFVMRV9ERVNDUklQVElPTihaRlRBUEVfVkVSU0lPTiAiIC0gIgotCQkgICAiVkZTIGludGVyZmFjZSBmb3IgdGhlIExpbnV4IGZsb3BweSB0YXBlIGRyaXZlci4gIgotCQkgICAiU3VwcG9ydCBmb3IgUUlDLTExMyBjb21wYXRpYmxlIHZvbHVtZSB0YWJsZSAiCi0JCSAgICJhbmQgYnVpbHRpbiBjb21wcmVzc2lvbiAobHpydzMgYWxnb3JpdGhtKSIpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoImNoYXItbWFqb3ItMjciKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotc3RydWN0IHpmdF9jbXByX29wcyAqemZ0X2NtcHJfb3BzID0gTlVMTDsKLWNvbnN0IGZ0YXBlX2luZm8gKnpmdF9zdGF0dXM7Ci0KLS8qICAgICAgTG9jYWwgdmFycy4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzeV9mbGFnOwotCi1zdGF0aWMgc2lnc2V0X3Qgb3JpZ19zaWdtYXNrOwotCi0vKiAgdGhlIGludGVyZmFjZSB0byB0aGUga2VybmVsIHZmcyBsYXllcgotICovCi0KLS8qIE5vdGUgYWJvdXQgbGxzZWVrKCk6Ci0gKgotICogc3QuYyBhbmQgdHBxaWMuYyB1cGRhdGUgZnAtPmZfcG9zIGJ1dCBkb24ndCBpbXBsbWVudCBsbHNlZWsoKSBhbmQKLSAqIGluaXRpYWxpemUgdGhlIGxsc2VlayBjb21wb25lbnQgb2YgdGhlIGZpbGVfb3BzIHN0cnVjdCB3aXRoIE5VTEwuCi0gKiBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgd2lsbCBnZXQgdGhlIGRlZmF1bHQgc2VlaywgYnV0IHRoZSB0YXBlCi0gKiBkZXZpY2Ugd2lsbCBub3QgcmVzcGVjdCB0aGUgbmV3IHBvc2l0aW9uLCBidXQgaGFwcGlseSByZWFkIGZyb20gdGhlCi0gKiBvbGQgcG9zaXRpb24uIFRoaW5rIGEgemZ0YXBlIHNwZWNpZmljIGxsc2VlaygpIGZ1bmN0aW9uIHdvdWxkIGJlCi0gKiBiZXR0ZXIsIHJldHVybmluZyAtRVNQSVBFLiBUT0RPLgotICovCi0KLXN0YXRpYyBpbnQgIHpmdF9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwKTsKLXN0YXRpYyBpbnQgemZ0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOwotc3RhdGljIGludCAgemZ0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgaW50ICB6ZnRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLXN0YXRpYyBzc2l6ZV90IHpmdF9yZWFkIChzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICpidWZmLAotCQkJIHNpemVfdCByZXFfbGVuLCBsb2ZmX3QgKnBwb3MpOwotc3RhdGljIHNzaXplX3QgemZ0X3dyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsCi0JCQkgc2l6ZV90IHJlcV9sZW4sIGxvZmZfdCAqcHBvcyk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHpmdF9jZGV2ID0KLXsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLnJlYWQJCT0gemZ0X3JlYWQsCi0JLndyaXRlCQk9IHpmdF93cml0ZSwKLQkuaW9jdGwJCT0gemZ0X2lvY3RsLAotCS5tbWFwCQk9IHpmdF9tbWFwLAotCS5vcGVuCQk9IHpmdF9vcGVuLAotCS5yZWxlYXNlCT0gemZ0X2Nsb3NlLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGFzcyAqemZ0X2NsYXNzOwotCi0vKiAgICAgIE9wZW4gZmxvcHB5IHRhcGUgZGV2aWNlCi0gKi8KLXN0YXRpYyBpbnQgemZ0X29wZW4oc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCkKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0Jbm9uc2Vla2FibGVfb3Blbihpbm8sIGZpbGVwKTsKLQlUUkFDRShmdF90X2Zsb3csICJjYWxsZWQgZm9yIG1pbm9yICVkIiwgaW1pbm9yKGlubykpOwotCWlmICggdGVzdF9hbmRfc2V0X2JpdCgwLCZidXN5X2ZsYWcpICkgewotCQlUUkFDRV9BQk9SVCgtRUJVU1ksIGZ0X3Rfd2FybiwgImZhaWxlZDogYWxyZWFkeSBidXN5Iik7Ci0JfQotCWlmICgoaW1pbm9yKGlubykgJiB+KFpGVF9NSU5PUl9PUF9NQVNLIHwgRlRBUEVfTk9fUkVXSU5EKSkKLQkgICAgID4gCi0JICAgIEZUQVBFX1NFTF9EKSB7Ci0JCWNsZWFyX2JpdCgwLCZidXN5X2ZsYWcpOwotCQlUUkFDRV9BQk9SVCgtRU5YSU8sIGZ0X3RfZXJyLCAiZmFpbGVkOiBpbnZhbGlkIHVuaXQgbnIiKTsKLQl9Ci0Jb3JpZ19zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsKLQlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKLQlyZXN1bHQgPSBfemZ0X29wZW4oaW1pbm9yKGlubyksIGZpbGVwLT5mX2ZsYWdzICYgT19BQ0NNT0RFKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQljdXJyZW50LT5ibG9ja2VkID0gb3JpZ19zaWdtYXNrOyAvKiByZXN0b3JlIG1hc2sgKi8KLQkJY2xlYXJfYml0KDAsJmJ1c3lfZmxhZyk7Ci0JCVRSQUNFX0FCT1JUKHJlc3VsdCwgZnRfdF9lcnIsICJfZnRhcGVfb3BlbiBmYWlsZWQiKTsKLQl9IGVsc2UgewotCQkvKiBNYXNrIHNpZ25hbHMgdGhhdCB3aWxsIGRpc3R1cmIgcHJvcGVyIG9wZXJhdGlvbiBvZiB0aGUKLQkJICogcHJvZ3JhbSB0aGF0IGlzIGNhbGxpbmcuCi0JCSAqLwotCQljdXJyZW50LT5ibG9ja2VkID0gb3JpZ19zaWdtYXNrOwotCQlzaWdhZGRzZXRtYXNrICgmY3VycmVudC0+YmxvY2tlZCwgX0RPX0JMT0NLKTsKLQkJVFJBQ0VfRVhJVCAwOwotCX0KLX0KLQotLyogICAgICBDbG9zZSBmbG9wcHkgdGFwZSBkZXZpY2UKLSAqLwotc3RhdGljIGludCB6ZnRfY2xvc2Uoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlcCkKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKCAhdGVzdF9iaXQoMCwmYnVzeV9mbGFnKSB8fCBpbWlub3IoaW5vKSAhPSB6ZnRfdW5pdCkgewotCQlUUkFDRShmdF90X2VyciwgImZhaWxlZDogbm90IGJ1c3kgb3Igd3JvbmcgdW5pdCIpOwotCQlUUkFDRV9FWElUIDA7Ci0JfQotCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwotCXJlc3VsdCA9IF96ZnRfY2xvc2UoKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlUUkFDRShmdF90X2VyciwgIl96ZnRfY2xvc2UgZmFpbGVkIik7Ci0JfQotCWN1cnJlbnQtPmJsb2NrZWQgPSBvcmlnX3NpZ21hc2s7IC8qIHJlc3RvcmUgYmVmb3JlIG9wZW4gc3RhdGUgKi8KLQljbGVhcl9iaXQoMCwmYnVzeV9mbGFnKTsKLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qICAgICAgSW9jdGwgZm9yIGZsb3BweSB0YXBlIGRldmljZQotICovCi1zdGF0aWMgaW50IHpmdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGVwLAotCQkgICAgIHVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmVzdWx0ID0gLUVJTzsKLQlzaWdzZXRfdCBvbGRfc2lnbWFzazsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCWlmICggIXRlc3RfYml0KDAsJmJ1c3lfZmxhZykgfHwgaW1pbm9yKGlubykgIT0gemZ0X3VuaXQgfHwgZnRfZmFpbHVyZSkgewotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCSAgICAiZmFpbGVkOiBub3QgYnVzeSwgZmFpbHVyZSBvciB3cm9uZyB1bml0Iik7Ci0JfQotCW9sZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsgLyogc2F2ZSBtYXNrICovCi0Jc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7Ci0JLyogVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyBzaXplb2Yodm9pZCAqKSA9PSBzaXplb2YobG9uZykgKi8KLQlyZXN1bHQgPSBfemZ0X2lvY3RsKGNvbW1hbmQsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRfc2lnbWFzazsgLyogcmVzdG9yZSBtYXNrICovCi0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLS8qICAgICAgSW9jdGwgZm9yIGZsb3BweSB0YXBlIGRldmljZQotICovCi1zdGF0aWMgaW50ICB6ZnRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWludCByZXN1bHQgPSAtRUlPOwotCXNpZ3NldF90IG9sZF9zaWdtYXNrOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKCAhdGVzdF9iaXQoMCwmYnVzeV9mbGFnKSB8fCAKLQkgICAgaW1pbm9yKGZpbGVwLT5mX2RlbnRyeS0+ZF9pbm9kZSkgIT0gemZ0X3VuaXQgfHwgCi0JICAgIGZ0X2ZhaWx1cmUpCi0JewotCQlUUkFDRV9BQk9SVCgtRUlPLCBmdF90X2VyciwKLQkJCSAgICAiZmFpbGVkOiBub3QgYnVzeSwgZmFpbHVyZSBvciB3cm9uZyB1bml0Iik7Ci0JfQotCW9sZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsgLyogc2F2ZSBtYXNrICovCi0Jc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7Ci0JaWYgKChyZXN1bHQgPSBmdGFwZV9tbWFwKHZtYSkpID49IDApIHsKLSNpZm5kZWYgTVNZTkNfQlVHX1dBU19GSVhFRAotCQlzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGR1bW15ID0geyBOVUxMLCB9OwotCQl2bWEtPnZtX29wcyA9ICZkdW1teTsKLSNlbmRpZgotCX0KLQljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7IC8qIHJlc3RvcmUgbWFzayAqLwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKiAgICAgIFJlYWQgZnJvbSBmbG9wcHkgdGFwZSBkZXZpY2UKLSAqLwotc3RhdGljIHNzaXplX3QgemZ0X3JlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmZiwKLQkJCXNpemVfdCByZXFfbGVuLCBsb2ZmX3QgKnBwb3MpCi17Ci0JaW50IHJlc3VsdCA9IC1FSU87Ci0Jc2lnc2V0X3Qgb2xkX3NpZ21hc2s7Ci0Jc3RydWN0IGlub2RlICppbm8gPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X2RhdGFfZmxvdywgImNhbGxlZCB3aXRoIGNvdW50OiAlbGQiLCAodW5zaWduZWQgbG9uZylyZXFfbGVuKTsKLQlpZiAoIXRlc3RfYml0KDAsJmJ1c3lfZmxhZykgIHx8IGltaW5vcihpbm8pICE9IHpmdF91bml0IHx8IGZ0X2ZhaWx1cmUpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCi0JCQkgICAgImZhaWxlZDogbm90IGJ1c3ksIGZhaWx1cmUgb3Igd3JvbmcgdW5pdCIpOwotCX0KLQlvbGRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7IC8qIHNhdmUgbWFzayAqLwotCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwotCXJlc3VsdCA9IF96ZnRfcmVhZChidWZmLCByZXFfbGVuKTsKLQljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NpZ21hc2s7IC8qIHJlc3RvcmUgbWFzayAqLwotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAicmV0dXJuIHdpdGggY291bnQ6ICVkIiwgcmVzdWx0KTsKLQlUUkFDRV9FWElUIHJlc3VsdDsKLX0KLQotLyogICAgICBXcml0ZSB0byB0YXBlIGRldmljZQotICovCi1zdGF0aWMgc3NpemVfdCB6ZnRfd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwKLQkJCSBzaXplX3QgcmVxX2xlbiwgbG9mZl90ICpwcG9zKQotewotCWludCByZXN1bHQgPSAtRUlPOwotCXNpZ3NldF90IG9sZF9zaWdtYXNrOwotCXN0cnVjdCBpbm9kZSAqaW5vID0gZnAtPmZfZGVudHJ5LT5kX2lub2RlOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JVFJBQ0UoZnRfdF9mbG93LCAiY2FsbGVkIHdpdGggY291bnQ6ICVsZCIsICh1bnNpZ25lZCBsb25nKXJlcV9sZW4pOwotCWlmICghdGVzdF9iaXQoMCwmYnVzeV9mbGFnKSB8fCBpbWlub3IoaW5vKSAhPSB6ZnRfdW5pdCB8fCBmdF9mYWlsdXJlKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJICAgICJmYWlsZWQ6IG5vdCBidXN5LCBmYWlsdXJlIG9yIHdyb25nIHVuaXQiKTsKLQl9Ci0Jb2xkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOyAvKiBzYXZlIG1hc2sgKi8KLQlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKLQlyZXN1bHQgPSBfemZ0X3dyaXRlKGJ1ZmYsIHJlcV9sZW4pOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBvbGRfc2lnbWFzazsgLyogcmVzdG9yZSBtYXNrICovCi0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJyZXR1cm4gd2l0aCBjb3VudDogJWQiLCByZXN1bHQpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKiAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFZGUyBJTlRFUkZBQ0UgCi0gKiAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogIGRyaXZlci9tb2R1bGUgaW5pdGlhbGl6YXRpb24KLSAqLwotCi0vKiAgdGhlIGNvbXByZXNzaW9uIG1vZHVsZSBoYXMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGhvb2sgaW50byB0aGUgemZ0YXBlIAotICogIGNvZGUKLSAqLwotaW50IHpmdF9jbXByX3JlZ2lzdGVyKHN0cnVjdCB6ZnRfY21wcl9vcHMgKm5ld19vcHMpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYgKHpmdF9jbXByX29wcyAhPSBOVUxMKSB7Ci0JCVRSQUNFX0VYSVQgLUVCVVNZOwotCX0gZWxzZSB7Ci0JCXpmdF9jbXByX29wcyA9IG5ld19vcHM7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci19Ci0KLS8qICBsb2NrIHRoZSB6ZnQtY29tcHJlc3NvcigpIG1vZHVsZS4KLSAqLwotaW50IHpmdF9jbXByX2xvY2soaW50IHRyeV90b19sb2FkKQotewotCWlmICh6ZnRfY21wcl9vcHMgPT0gTlVMTCkgewotI2lmZGVmIENPTkZJR19LTU9ECi0JCWlmICh0cnlfdG9fbG9hZCkgewotCQkJcmVxdWVzdF9tb2R1bGUoInpmdC1jb21wcmVzc29yIik7Ci0JCQlpZiAoemZ0X2NtcHJfb3BzID09IE5VTEwpIHsKLQkJCQlyZXR1cm4gLUVOT1NZUzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtRU5PU1lTOwotCQl9Ci0jZWxzZQotCQlyZXR1cm4gLUVOT1NZUzsKLSNlbmRpZgotCX0KLQkoKnpmdF9jbXByX29wcy0+bG9jaykoKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19aRlRfQ09NUFJFU1NPUgotZXh0ZXJuIGludCB6ZnRfY29tcHJlc3Nvcl9pbml0KHZvaWQpOwotI2VuZGlmCi0KLS8qICBDYWxsZWQgYnkgbW9kdWxlcyBwYWNrYWdlIHdoZW4gaW5zdGFsbGluZyB0aGUgZHJpdmVyIG9yIGJ5IGtlcm5lbAotICogIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gcGhhc2UKLSAqLwotaW50IF9faW5pdCB6ZnRfaW5pdCh2b2lkKQotewotCWludCBpOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0jaWZkZWYgTU9EVUxFCi0JcHJpbnRrKEtFUk5fSU5GTyBaRlRBUEVfVkVSU0lPTiAiXG4iKTsKLSAgICAgICAgaWYgKFRSQUNFX0xFVkVMID49IGZ0X3RfaW5mbykgewotCQlwcmludGsoCi1LRVJOX0lORk8KLSIoYykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgKGNsYXVzQG1vbW8ubWF0aC5yd3RoLWFhY2hlbi5kZSlcbiIKLUtFUk5fSU5GTwotInZmcyBpbnRlcmZhY2UgZm9yIGZ0YXBlIGZsb3BweSB0YXBlIGRyaXZlci5cbiIKLUtFUk5fSU5GTwotIlN1cHBvcnQgZm9yIFFJQy0xMTMgY29tcGF0aWJsZSB2b2x1bWUgdGFibGUsIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb25cbiIKLUtFUk5fSU5GTwotImFuZCBidWlsdGluIGNvbXByZXNzaW9uIChsenJ3MyBhbGdvcml0aG0pLlxuIik7Ci0gICAgICAgIH0KLSNlbHNlIC8qICFNT0RVTEUgKi8KLQkvKiBwcmludCBhIHNob3J0IG5vLW5vbnNlbnNlIGJvb3QgbWVzc2FnZSAqLwotCXByaW50ayhLRVJOX0lORk8gWkZUQVBFX1ZFUlNJT04gIlxuIik7Ci0jZW5kaWYgLyogTU9EVUxFICovCi0JVFJBQ0UoZnRfdF9pbmZvLCAiemZ0X2luaXQgQCAweCVwIiwgemZ0X2luaXQpOwotCVRSQUNFKGZ0X3RfaW5mbywKLQkgICAgICAiaW5zdGFsbGluZyB6ZnRhcGUgVkZTIGludGVyZmFjZSBmb3IgZnRhcGUgZHJpdmVyIC4uLiIpOwotCVRSQUNFX0NBVENIKHJlZ2lzdGVyX2NocmRldihRSUMxMTdfVEFQRV9NQUpPUiwgInpmdCIsICZ6ZnRfY2RldiksKTsKLQotCXpmdF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInpmdCIpOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZSh6ZnRfY2xhc3MsIE5VTEwsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpKSwgTlVMTCwgInFmdCVpIiwgaSk7Ci0JCWNsYXNzX2RldmljZV9jcmVhdGUoemZ0X2NsYXNzLCBOVUxMLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDQpLCBOVUxMLCAibnFmdCVpIiwgaSk7Ci0JCWNsYXNzX2RldmljZV9jcmVhdGUoemZ0X2NsYXNzLCBOVUxMLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDE2KSwgTlVMTCwgInpxZnQlaSIsIGkpOwotCQljbGFzc19kZXZpY2VfY3JlYXRlKHpmdF9jbGFzcywgTlVMTCwgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAyMCksIE5VTEwsICJuenFmdCVpIiwgaSk7Ci0JCWNsYXNzX2RldmljZV9jcmVhdGUoemZ0X2NsYXNzLCBOVUxMLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDMyKSwgTlVMTCwgInJhd3FmdCVpIiwgaSk7Ci0JCWNsYXNzX2RldmljZV9jcmVhdGUoemZ0X2NsYXNzLCBOVUxMLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDM2KSwgTlVMTCwgIm5yYXdyYXdxZnQlaSIsIGkpOwotCX0KLQotI2lmZGVmIENPTkZJR19aRlRfQ09NUFJFU1NPUgotCSh2b2lkKXpmdF9jb21wcmVzc29yX2luaXQoKTsKLSNlbmRpZgotCXpmdF9zdGF0dXMgPSBmdGFwZV9nZXRfc3RhdHVzKCk7IC8qICBmZXRjaCBnbG9iYWwgZGF0YSBvZiBmdGFwZSAKLQkJCQkJICAqICBoYXJkd2FyZSBkcml2ZXIgCi0JCQkJCSAgKi8KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLQotLyogQ2FsbGVkIGJ5IG1vZHVsZXMgcGFja2FnZSB3aGVuIHJlbW92aW5nIHRoZSBkcml2ZXIgCi0gKi8KLXN0YXRpYyB2b2lkIHpmdF9leGl0KHZvaWQpCi17Ci0JaW50IGk7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAodW5yZWdpc3Rlcl9jaHJkZXYoUUlDMTE3X1RBUEVfTUFKT1IsICJ6ZnQiKSAhPSAwKSB7Ci0JCVRSQUNFKGZ0X3Rfd2FybiwgImZhaWxlZCIpOwotCX0gZWxzZSB7Ci0JCVRSQUNFKGZ0X3RfaW5mbywgInN1Y2Nlc3NmdWwiKTsKLQl9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSkpOwotCQljbGFzc19kZXZpY2VfZGVzdHJveSh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgNCkpOwotCQljbGFzc19kZXZpY2VfZGVzdHJveSh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMTYpKTsKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koemZ0X2NsYXNzLCBNS0RFVihRSUMxMTdfVEFQRV9NQUpPUiwgaSArIDIwKSk7Ci0JCWNsYXNzX2RldmljZV9kZXN0cm95KHpmdF9jbGFzcywgTUtERVYoUUlDMTE3X1RBUEVfTUFKT1IsIGkgKyAzMikpOwotCQljbGFzc19kZXZpY2VfZGVzdHJveSh6ZnRfY2xhc3MsIE1LREVWKFFJQzExN19UQVBFX01BSk9SLCBpICsgMzYpKTsKLQl9Ci0JY2xhc3NfZGVzdHJveSh6ZnRfY2xhc3MpOwotCXpmdF91bmluaXRfbWVtKCk7IC8qIHJlbGVhc2UgcmVtYWluaW5nIG1lbW9yeSwgaWYgYW55ICovCi0gICAgICAgIHByaW50ayhLRVJOX0lORk8gInpmdGFwZSBzdWNjZXNzZnVsbHkgdW5sb2FkZWQuXG4iKTsKLQlUUkFDRV9FWElUOwotfQotCi1tb2R1bGVfaW5pdCh6ZnRfaW5pdCk7Ci1tb2R1bGVfZXhpdCh6ZnRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1pbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2U1ZDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtaW5pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotI2lmbmRlZiBfWkZUQVBFX0lOSVRfSAotI2RlZmluZSBfWkZUQVBFX0lOSVRfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLWluaXQuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA1ICQKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgYW5kIG1hY3JvIGZvciB0aGUgdmZzIAotICogaW50ZXJmYWNlIGRlZmluZWQgYnkgemZ0YXBlCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mdGFwZS1oZWFkZXItc2VnbWVudC5oPgotCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtdHJhY2luZy5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi9sb3dsZXZlbC9mdGFwZS13cml0ZS5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWJzbS5oIgotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLWlvLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtYnVmZmVyLmgiCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtZm9ybWF0LmgiCi0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCi0KLSNpZmRlZiBNT0RVTEUKLSNkZWZpbmUgZnRhcGVfc3RhdHVzICgqemZ0X3N0YXR1cykKLSNlbmRpZgotCi1leHRlcm4gY29uc3QgIGZ0YXBlX2luZm8gKnpmdF9zdGF0dXM7IC8qIG5lZWRlZCBmb3IgemZ0YXBlLXZ0YmwuaCAqLwotCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCi0KLXN0cnVjdCB6ZnRfY21wcl9vcHMgewotCWludCAoKndyaXRlKShpbnQgKndyaXRlX2NudCwKLQkJICAgICBfX3U4ICpkc3RfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAotCQkgICAgIGNvbnN0IF9fdTggX191c2VyICpzcmNfYnVmLCBjb25zdCBpbnQgcmVxX2xlbiwgCi0JCSAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOwotCWludCAoKnJlYWQpKGludCAqcmVhZF9jbnQsCi0JCSAgICBfX3U4IF9fdXNlciAqZHN0X2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sCi0JCSAgICBjb25zdCBfX3U4ICpzcmNfYnVmLCBjb25zdCBpbnQgc2VnX3N6LAotCQkgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpOwotCWludCAoKnNlZWspKHVuc2lnbmVkIGludCBuZXdfYmxvY2tfcG9zLAotCQkgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCi0JCSAgICBfX3U4ICpidWZmZXIpOwotCXZvaWQgKCpsb2NrKSAgICh2b2lkKTsKLQl2b2lkICgqcmVzZXQpICAodm9pZCk7Ci0Jdm9pZCAoKmNsZWFudXApKHZvaWQpOwotfTsKLQotZXh0ZXJuIHN0cnVjdCB6ZnRfY21wcl9vcHMgKnpmdF9jbXByX29wczsKLS8qIHpmdGFwZS1pbml0LmMgZGVmaW5lZCBnbG9iYWwgZnVuY3Rpb25zLgotICovCi1leHRlcm4gaW50ICAgICAgICAgICAgICAgICAgemZ0X2NtcHJfcmVnaXN0ZXIoc3RydWN0IHpmdF9jbXByX29wcyAqbmV3X29wcyk7Ci1leHRlcm4gaW50ICAgICAgICAgICAgICAgICAgemZ0X2NtcHJfbG9jayhpbnQgdHJ5X3RvX2xvYWQpOwotCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNGJmMDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qCi0gKiAgICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmMsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOTowNiAkCi0gKgotICogICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhpZ2ggbGV2ZWwgcmVhZGluZyBjb2RlCi0gKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotaW50IHpmdF9qdXN0X2JlZm9yZV9lb2Y7Ci0KLS8qICAgICAgTG9jYWwgdmFycy4KLSAqLwotc3RhdGljIGludCBidWZfbGVuX3JkOwotCi12b2lkIHpmdF96YXBfcmVhZF9idWZmZXJzKHZvaWQpCi17Ci0JYnVmX2xlbl9yZCA9IDA7Ci19Ci0KLWludCB6ZnRfcmVhZF9oZWFkZXJfc2VnbWVudHModm9pZCkgICAgICAKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXpmdF9oZWFkZXJfcmVhZCA9IDA7Ci0JVFJBQ0VfQ0FUQ0goemZ0X3ZtYWxsb2Nfb25jZSgmemZ0X2hzZWdfYnVmLCBGVF9TRUdNRU5UX1NJWkUpLCk7Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfcmVhZF9oZWFkZXJfc2VnbWVudCh6ZnRfaHNlZ19idWYpLCk7Ci0JVFJBQ0UoZnRfdF9pbmZvLCAiU2VnbWVudHMgd3JpdHRlbiBzaW5jZSBmaXJzdCBmb3JtYXQ6ICVkIiwKLQkgICAgICAoaW50KUdFVDQoemZ0X2hzZWdfYnVmLCBGVF9TRUdfQ05UKSk7Ci0JemZ0X3FpYzExMyA9IChmdF9mb3JtYXRfY29kZSAhPSBmbXRfbm9ybWFsICYmCi0JCSAgICAgIGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF8xMTAwZnQgJiYKLQkJICAgICAgZnRfZm9ybWF0X2NvZGUgIT0gZm10XzQyNWZ0KTsKLQlUUkFDRShmdF90X2luZm8sICJmdF9maXJzdF9kYXRhX3NlZ21lbnQ6ICVkLCBmdF9sYXN0X2RhdGFfc2VnbWVudDogJWQiLCAKLQkgICAgICBmdF9maXJzdF9kYXRhX3NlZ21lbnQsIGZ0X2xhc3RfZGF0YV9zZWdtZW50KTsKLQl6ZnRfY2FwYWNpdHkgPSB6ZnRfZ2V0X2NhcGFjaXR5KCk7Ci0JemZ0X29sZF9mdGFwZSA9IHpmdF9mdGFwZV92YWxpZGF0ZV9sYWJlbCgmemZ0X2hzZWdfYnVmW0ZUX0xBQkVMXSk7Ci0JaWYgKHpmdF9vbGRfZnRhcGUpIHsKLQkJVFJBQ0UoZnRfdF9pbmZvLCAKLSJGb3VuZCBvbGQgZnRhcGVkIHRhcGUsIGVtdWxhdGluZyBlb2YgbWFya3MsIGVudGVyaW5nIHJlYWQtb25seSBtb2RlIik7Ci0JCXpmdF9mdGFwZV9leHRyYWN0X2ZpbGVfbWFya3MoemZ0X2hzZWdfYnVmKTsKLQkJVFJBQ0VfQ0FUQ0goemZ0X2Zha2Vfdm9sdW1lX2hlYWRlcnMoemZ0X2VvZl9tYXAsIAotCQkJCQkJICAgIHpmdF9ucl9lb2ZfbWFya3MpLCk7Ci0JfSBlbHNlIHsKLQkJLyogdGhlIHNwZWNzIHNheSB0aGF0IHRoZSB2b2x1bWUgdGFibGUgbXVzdCBiZQotCQkgKiBpbml0aWFsaXplZCB3aXRoIHplcm9lcyBkdXJpbmcgZm9ybWF0dGluZywgc28gaXQKLQkJICogTVVTVCBiZSByZWFkYWJsZSwgaS5lLiBjb250YWluIHZhaWQgRUNDCi0JCSAqIGluZm9ybWF0aW9uLiAgCi0JCSAqLwotCQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkX3NlZ21lbnQoZnRfZmlyc3RfZGF0YV9zZWdtZW50LCAKLQkJCQkJICAgICAgIHpmdF9kZWJsb2NrX2J1ZiwgCi0JCQkJCSAgICAgICBGVF9SRF9TSU5HTEUpLCk7Ci0JCVRSQUNFX0NBVENIKHpmdF9leHRyYWN0X3ZvbHVtZV9oZWFkZXJzKHpmdF9kZWJsb2NrX2J1ZiksKTsKLQl9Ci0JemZ0X2hlYWRlcl9yZWFkID0gMTsKLQl6ZnRfc2V0X2ZsYWdzKHpmdF91bml0KTsKLQl6ZnRfcmVzZXRfcG9zaXRpb24oJnpmdF9wb3MpOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotaW50IHpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKGNvbnN0IHVuc2lnbmVkIGludCBzZWdtZW50LCB2b2lkICpidWZmZXIsCi0JCQkgICAgICAgY29uc3QgZnRfcmVhZF9tb2RlX3QgcmVhZF9tb2RlLAotCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzdGFydCwKLQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlpbnQgc2VnX3N6OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKHNlZ21lbnQgPT0gemZ0X2RlYmxvY2tfc2VnbWVudCkgewotCQlUUkFDRShmdF90X2RhdGFfZmxvdywKLQkJICAgICAgInJlLXVzaW5nIHNlZ21lbnQgJWQgYWxyZWFkeSBpbiBkZWJsb2NrIGJ1ZmZlciIsCi0JCSAgICAgIHNlZ21lbnQpOwotCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeihzZWdtZW50KTsKLQkJaWYgKHN0YXJ0ID4gc2VnX3N6KSB7Ci0JCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2J1ZywKLQkJCQkgICAgInRyeWluZyB0byByZWFkIGJleW9uZCBlbmQgb2Ygc2VnbWVudDpcbiIKLQkJCQkgICAgS0VSTl9JTkZPICJzZWdfc3ogOiAlZFxuIgotCQkJCSAgICBLRVJOX0lORk8gInN0YXJ0ICA6ICVkXG4iCi0JCQkJICAgIEtFUk5fSU5GTyAic2VnbWVudDogJWQiLAotCQkJCSAgICBzZWdfc3osIHN0YXJ0LCBzZWdtZW50KTsKLQkJfQotCQlpZiAoKHN0YXJ0ICsgc2l6ZSkgPiBzZWdfc3opIHsKLQkJCVRSQUNFX0VYSVQgc2VnX3N6IC0gc3RhcnQ7Ci0JCX0KLQkJVFJBQ0VfRVhJVCBzaXplOwotCX0KLQlzZWdfc3ogPSBmdGFwZV9yZWFkX3NlZ21lbnRfZnJhY3Rpb24oc2VnbWVudCwgYnVmZmVyLCByZWFkX21vZGUsCi0JCQkJCSAgICAgc3RhcnQsIHNpemUpOwotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAic2VnbWVudCAlZCwgcmVzdWx0ICVkIiwgc2VnbWVudCwgc2VnX3N6KTsKLQlpZiAoKGludClzZWdfc3ogPj0gMCAmJiBzdGFydCA9PSAwICYmIHNpemUgPT0gRlRfU0VHTUVOVF9TSVpFKSB7Ci0JCS8qICB0aGlzIGltcGxpY2l0bHkgYXNzdW1lcyB0aGF0IHdlIGFyZSBhbHdheXMgY2FsbGVkIHdpdGgKLQkJICogIGJ1ZmZlciA9PSB6ZnRfZGVibG9ja19idWYgCi0JCSAqLwotCQl6ZnRfZGVibG9ja19zZWdtZW50ID0gc2VnbWVudDsKLQl9IGVsc2UgewotCQl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7Ci0JfQotCVRSQUNFX0VYSVQgc2VnX3N6OwotfQotCi0vKgotICogb3V0OgotICoKLSAqIGludCAqcmVhZF9jbnQ6IHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgcmVtb3ZlZCBmcm9tIHRoZQotICogICAgICAgICAgICAgICAgemZ0X2RlYmxvY2tfYnVmIChyZXN1bHQpCi0gKgotICogaW50ICp0b19kbyAgIDogdGhlIHJlbWFpbmluZyBzaXplIG9mIHRoZSByZWFkLXJlcXVlc3QuIElzIGNoYW5nZWQuCi0gKgotICogaW46Ci0gKgotICogY2hhciAqYnVmZiAgICAgIDogYnVmZiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgdXNlcgotICogICAgICAgICAgICAgICAgICAgYnVmZmVyLCB0aGF0IGhhc24ndCBiZWVuIGZpbGxlZCB3aXRoIGRhdGEgeWV0LgotICogaW50IGJ1Zl9wb3NfcmVhZDogY29weSBvZiBidWZfcG9zX3JkCi0gKiBpbnQgYnVmX2xlbl9yZWFkOiBjb3B5IG9mIGJ1Zl9sZW5fcmQKLSAqIGNoYXIgKnpmdF9kZWJsb2NrX2J1ZjogZnRhcGVfemZ0X2RlYmxvY2tfYnVmCi0gKgotICogcmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgYWN0dWFsbHkgY29waWVkIHRvIHRoZSB1c2VyLWJ1ZmZlcgotICoKLSAqIHRvX2RvIE1VU1QgTk9UIFNIUklOSyBleGNlcHQgdG8gaW5kaWNhdGUgYW4gRU9ULiBJbiB0aGlzIGNhc2UgdG9fZG8KLSAqIGhhcyB0byBiZSBzZXQgdG8gMC4gV2UgY2Fubm90IHJldHVybiAtRU5PU1BDLCBiZWNhdXNlIHdlIHJldHVybiB0aGUKLSAqIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5ICogY29waWVkIHRvIHRoZSB1c2VyLWJ1ZmZlcgotICovCi1zdGF0aWMgaW50IHpmdF9zaW1wbGVfcmVhZCAoaW50ICpyZWFkX2NudCwgCi0JCQkgICAgX191OCAgX191c2VyICpkc3RfYnVmLCAKLQkJCSAgICBjb25zdCBpbnQgdG9fZG8sIAotCQkJICAgIGNvbnN0IF9fdTggKnNyY19idWYsIAotCQkJICAgIGNvbnN0IGludCBzZWdfc3osIAotCQkJICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLAotCQkJICAgIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoc2VnX3N6IC0gcG9zLT5zZWdfYnl0ZV9wb3MgPCB0b19kbykgewotCQkqcmVhZF9jbnQgPSBzZWdfc3ogLSBwb3MtPnNlZ19ieXRlX3BvczsKLQl9IGVsc2UgewotCQkqcmVhZF9jbnQgPSB0b19kbzsKLQl9Ci0JaWYgKGNvcHlfdG9fdXNlcihkc3RfYnVmLCAKLQkJCSBzcmNfYnVmICsgcG9zLT5zZWdfYnl0ZV9wb3MsICpyZWFkX2NudCkgIT0gMCkgewotCQlUUkFDRV9FWElUIC1FRkFVTFQ7Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJuciBieXRlcyBqdXN0IHJlYWQ6ICVkIiwgKnJlYWRfY250KTsKLQlUUkFDRV9FWElUICpyZWFkX2NudDsKLX0KLQotLyogcmVxX2xlbjogZ2V0cyBjbGlwcGVkIGR1ZSB0byBFT1Qgb2YgRU9GLgotICogcmVxX2NsaXBwZWQ6IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgcmVxX2xlbiB3YXMgY2xpcHBlZCBvciBub3QKLSAqIHZvbHVtZTogY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3VycmVudCB2b2x1bWUgKGJsa19zeiBldGMuKQotICovCi1zdGF0aWMgaW50IGNoZWNrX3JlYWRfYWNjZXNzKGludCAqcmVxX2xlbiwgCi0JCQkgICAgIGNvbnN0IHpmdF92b2xpbmZvICoqdm9sdW1lLAotCQkJICAgICBpbnQgKnJlcV9jbGlwcGVkLCAKLQkJCSAgICAgY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpCi17Ci0Jc3RhdGljIF9fczY0IHJlbWFpbmluZzsKLQlzdGF0aWMgaW50IGVvZDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoemZ0X2lvX3N0YXRlICE9IHpmdF9yZWFkaW5nKSB7Ci0JCWlmICh6ZnRfb2ZmbGluZSkgeyAvKiBvZmZsaW5lIGluY2x1ZGVzIG5vX3RhcGUgKi8KLQkJCVRSQUNFX0FCT1JUKC1FTlhJTywgZnRfdF93YXJuLAotCQkJCSAgICAidGFwZSBpcyBvZmZsaW5lIG9yIG5vIGNhcnRyaWRnZSIpOwotCQl9Ci0JCWlmICghZnRfZm9ybWF0dGVkKSB7Ci0JCQlUUkFDRV9BQk9SVCgtRUFDQ0VTLAotCQkJCSAgICBmdF90X3dhcm4sICJ0YXBlIGlzIG5vdCBmb3JtYXR0ZWQiKTsKLQkJfQotCQkvKiAgbm93IGVudGVyIGRlZmluZWQgc3RhdGUsIHJlYWQgaGVhZGVyIHNlZ21lbnQgaWYgbm90Ci0JCSAqICBhbHJlYWR5IGRvbmUgYW5kIGZsdXNoIHdyaXRlIGJ1ZmZlcnMKLQkJICovCi0JCVRSQUNFX0NBVENIKHpmdF9kZWZfaWRsZV9zdGF0ZSgpLCk7Ci0JCXpmdF9pb19zdGF0ZSA9IHpmdF9yZWFkaW5nOwotCQlpZiAoemZ0X3RhcGVfYXRfZW9kKHBvcykpIHsKLQkJCWVvZCA9IDE7Ci0JCQlUUkFDRV9FWElUIDE7Ci0JCX0KLQkJZW9kID0gMDsKLQkJKnZvbHVtZSA9IHpmdF9maW5kX3ZvbHVtZShwb3MtPnNlZ19wb3MpOwotCQkvKiBnZXQgdGhlIHNwYWNlIGxlZnQgdW50aWwgRU9GICovCi0JCXJlbWFpbmluZyA9IHpmdF9jaGVja19mb3JfZW9mKCp2b2x1bWUsIHBvcyk7Ci0JCWJ1Zl9sZW5fcmQgPSAwOwotCQlUUkFDRShmdF90X25vaXNlLCAicmVtYWluaW5nOiAiIExMX1ggIiwgdm9sX25vOiAlZCIsCi0JCSAgICAgIExMKHJlbWFpbmluZyksICgqdm9sdW1lKS0+Y291bnQpOwotCX0gZWxzZSBpZiAoemZ0X3RhcGVfYXRfZW9kKHBvcykpIHsKLQkJaWYgKCsrZW9kID4gMikgewotCQkJVFJBQ0VfRVhJVCAtRUlPOyAvKiBzdC5jIGFsc28gcmV0dXJucyAtRUlPICovCi0JCX0gZWxzZSB7Ci0JCQlUUkFDRV9FWElUIDE7Ci0JCX0KLQl9Ci0JaWYgKCgqcmVxX2xlbiAlICgqdm9sdW1lKS0+YmxrX3N6KSAhPSAwKSB7Ci0JCS8qICB0aGlzIG1lc3NhZ2UgaXMgaW5mb3JtYXRpb25hbCBvbmx5LiBUaGUgdXNlciBnZXRzIHRoZQotCQkgKiAgcHJvcGVyIHJldHVybiB2YWx1ZQotCQkgKi8KLQkJVFJBQ0VfQUJPUlQoLUVJTlZBTCwgZnRfdF9pbmZvLAotCQkJICAgICJyZXFfbGVuICVkIG5vdCBhIG11bHRpcGxlIG9mIGJsb2NrIHNpemUgJWQiLAotCQkJICAgICpyZXFfbGVuLCAoKnZvbHVtZSktPmJsa19zeik7Ci0JfQotCS8qIEFzIEdOVSB0YXIgZG9lc24ndCBhY2NlcHQgcGFydGlhbCByZWFkIGNvdW50cyB3aGVuIHRoZQotCSAqIG11bHRpcGxlIHZvbHVtZSBmbGFnIGlzIHNldCwgd2UgbWFrZSBzdXJlIHRvIHJldHVybiB0aGUKLQkgKiByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEuIEV4Y2VwdCwgb2YgY291cnNlLCBhdCB0aGUgZW5kIG9mCi0JICogdGhlIHRhcGUgb3IgZmlsZSBtYXJrLiAgCi0JICovCi0JcmVtYWluaW5nIC09ICpyZXFfbGVuOwotCWlmIChyZW1haW5pbmcgPD0gMCkgewotCQlUUkFDRShmdF90X25vaXNlLCAKLQkJICAgICAgImNsaXBwZWQgcmVxdWVzdCBmcm9tICVkIHRvICVkLiIsIAotCQkgICAgICAqcmVxX2xlbiwgKGludCkoKnJlcV9sZW4gKyByZW1haW5pbmcpKTsKLQkJKnJlcV9sZW4gKz0gcmVtYWluaW5nOwotCQkqcmVxX2NsaXBwZWQgPSAxOwotCX0gZWxzZSB7Ci0JCSpyZXFfY2xpcHBlZCA9IDA7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogdGhpc19zZWdzX3NpemU6IHRoZSBjdXJyZW50IHNlZ21lbnQncyBzaXplLgotICogYnVmZjogdGhlIFVTRVItU1BBQ0UgYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBjYWxsaW5nIGZ1bmN0aW9uLgotICogcmVxX2xlbjogaG93IG11Y2ggZGF0YSBzaG91bGQgYmUgcmVhZCBhdCBtb3N0LgotICogdm9sdW1lOiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjdXJyZW50IHZvbHVtZSAoYmxrX3N6IGV0Yy4pCi0gKi8gIAotc3RhdGljIGludCBlbXB0eV9kZWJsb2NrX2J1ZihfX3U4IF9fdXNlciAqdXNyX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sCi0JCQkgICAgIGNvbnN0IF9fdTggKnNyY19idWYsIGNvbnN0IGludCBzZWdfc3osCi0JCQkgICAgIHpmdF9wb3NpdGlvbiAqcG9zLAotCQkJICAgICBjb25zdCB6ZnRfdm9saW5mbyAqdm9sdW1lKQotewotCWludCBjbnQ7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X2RhdGFfZmxvdywgInRoaXNfc2Vnc19zaXplOiAlZCIsIHNlZ19zeik7Ci0JaWYgKHpmdF91c2VfY29tcHJlc3Npb24gJiYgdm9sdW1lLT51c2VfY29tcHJlc3Npb24pIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfbG9jaygxIC8qIHRyeSB0byBsb2FkICovKSwpOwotCQlUUkFDRV9DQVRDSChyZXN1bHQ9ICgqemZ0X2NtcHJfb3BzLT5yZWFkKSgmY250LAotCQkJCQkJCSAgdXNyX2J1ZiwgcmVxX2xlbiwKLQkJCQkJCQkgIHNyY19idWYsIHNlZ19zeiwKLQkJCQkJCQkgIHBvcywgdm9sdW1lKSwpOwotCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlUUkFDRV9DQVRDSChyZXN1bHQ9IHpmdF9zaW1wbGVfcmVhZCAoJmNudCwKLQkJCQkJCSAgICAgdXNyX2J1ZiwgcmVxX2xlbiwKLQkJCQkJCSAgICAgc3JjX2J1Ziwgc2VnX3N6LAotCQkJCQkJICAgICBwb3MsIHZvbHVtZSksKTsKLQl9Ci0JcG9zLT52b2x1bWVfcG9zICAgKz0gcmVzdWx0OwotICAgICAgICBwb3MtPnRhcGVfcG9zICAgICArPSBjbnQ7Ci0JcG9zLT5zZWdfYnl0ZV9wb3MgKz0gY250OwotCWJ1Zl9sZW5fcmQgICAgICAgIC09IGNudDsgLyogcmVtYWluaW5nIGJ5dGVzIGluIGJ1ZmZlciAqLwotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiYnVmX2xlbl9yZDogJWQsIGNudDogJWQiLCBidWZfbGVuX3JkLCBjbnQpOwotCWlmKHBvcy0+c2VnX2J5dGVfcG9zID49IHNlZ19zeikgewotCQlwb3MtPnNlZ19wb3MrKzsKLQkJcG9zLT5zZWdfYnl0ZV9wb3MgPSAwOwotCX0KLQlUUkFDRShmdF90X2RhdGFfZmxvdywgImJ5dGVzIG1vdmVkIG91dCBvZiBkZWJsb2NrLWJ1ZmZlcjogJWQiLCBjbnQpOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0KLS8qIG5vdGU6IHdlIHN0b3JlIHRoZSBzZWdtZW50IGlkIG9mIHRoZSBzZWdtZW50IHRoYXQgaXMgaW5zaWRlIHRoZQotICogZGVibG9jayBidWZmZXIuIFRoaXMgc3BhcmVzIGEgbG90IG9mIGZ0YXBlX3JlYWRfc2VnbWVudCgpcyB3aGVuIHdlCi0gKiB1c2Ugc21hbGwgYmxvY2stc2l6ZXMuIFRoZSBibG9jay1zaXplIG1heSBiZSAxa2IgKFNFQ1RPUl9TSVpFKS4gSW4KLSAqIHRoaXMgY2FzZSBhIE1URlNSIDI4IG1heWJlIHN0aWxsIGluc2lkZSB0aGUgc2FtZSBzZWdtZW50LgotICovCi1pbnQgX3pmdF9yZWFkKGNoYXIgX191c2VyICpidWZmLCBpbnQgcmVxX2xlbikKLXsKLQlpbnQgcmVxX2NsaXBwZWQ7Ci0JaW50IHJlc3VsdCAgICAgPSAwOwotCWludCBieXRlc19yZWFkID0gMDsKLQlzdGF0aWMgdW5zaWduZWQgaW50IHNlZ19zeiA9IDA7Ci0Jc3RhdGljIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUgPSBOVUxMOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXpmdF9yZXNpZCA9IHJlcV9sZW47Ci0JcmVzdWx0ID0gY2hlY2tfcmVhZF9hY2Nlc3MoJnJlcV9sZW4sICZ2b2x1bWUsCi0JCQkJICAgJnJlcV9jbGlwcGVkLCAmemZ0X3Bvcyk7Ci0Jc3dpdGNoKHJlc3VsdCkgewotCWNhc2UgMDogCi0JCWJyZWFrOyAvKiBub3RoaW5nIHNwZWNpYWwgKi8KLQljYXNlIDE6IAotCQlUUkFDRShmdF90X25vaXNlLCAiRU9EIHJlYWNoZWQiKTsKLQkJVFJBQ0VfRVhJVCAwOyAgIC8qIEVPRCAqLwotCWRlZmF1bHQ6Ci0JCVRSQUNFX0FCT1JUKHJlc3VsdCwgZnRfdF9ub2lzZSwKLQkJCSAgICAiY2hlY2tfcmVhZF9hY2Nlc3MoKSBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkJICAgIHJlc3VsdCk7Ci0JCVRSQUNFX0VYSVQgcmVzdWx0OwotCX0KLQl3aGlsZSAocmVxX2xlbiA+IDApIHsgCi0JCS8qICBBbGxvdyBlc2NhcGUgZnJvbSB0aGlzIGxvb3Agb24gc2lnbmFsICEKLQkJICovCi0JCUZUX1NJR05BTF9FWElUKF9ET05UX0JMT0NLKTsKLQkJLyogYnVmX2xlbl9yZCA9PSAwIG1lYW5zIHRoYXQgd2UgbmVlZCB0byByZWFkIGEgbmV3Ci0JCSAqIHNlZ21lbnQuCi0JCSAqLwotCQlpZiAoYnVmX2xlbl9yZCA9PSAwKSB7Ci0JCQl3aGlsZSgocmVzdWx0ID0gemZ0X2ZldGNoX3NlZ21lbnQoemZ0X3Bvcy5zZWdfcG9zLAotCQkJCQkJCSAgemZ0X2RlYmxvY2tfYnVmLAotCQkJCQkJCSAgRlRfUkRfQUhFQUQpKSA9PSAwKSB7Ci0JCQkJemZ0X3Bvcy5zZWdfcG9zICsrOwotCQkJCXpmdF9wb3Muc2VnX2J5dGVfcG9zID0gMDsKLQkJCX0KLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJemZ0X3Jlc2lkIC09IGJ5dGVzX3JlYWQ7Ci0JCQkJVFJBQ0VfQUJPUlQocmVzdWx0LCBmdF90X25vaXNlLAotCQkJCQkgICAgInpmdF9mZXRjaF9zZWdtZW50KCk6ICVkIiwKLQkJCQkJICAgIHJlc3VsdCk7Ci0JCQl9Ci0JCQlzZWdfc3ogPSByZXN1bHQ7Ci0JCQlidWZfbGVuX3JkID0gc2VnX3N6IC0gemZ0X3Bvcy5zZWdfYnl0ZV9wb3M7Ci0JCX0KLQkJVFJBQ0VfQ0FUQ0gocmVzdWx0ID0gZW1wdHlfZGVibG9ja19idWYoYnVmZiwgCi0JCQkJCQkgICAgICAgcmVxX2xlbiwKLQkJCQkJCSAgICAgICB6ZnRfZGVibG9ja19idWYsIAotCQkJCQkJICAgICAgIHNlZ19zeiwgCi0JCQkJCQkgICAgICAgJnpmdF9wb3MsCi0JCQkJCQkgICAgICAgdm9sdW1lKSwKLQkJCSAgICB6ZnRfcmVzaWQgLT0gYnl0ZXNfcmVhZCk7Ci0JCVRSQUNFKGZ0X3RfZGF0YV9mbG93LCAiYnl0ZXMganVzdCByZWFkOiAlZCIsIHJlc3VsdCk7Ci0JCWJ5dGVzX3JlYWQgKz0gcmVzdWx0OyAvKiB3aGF0IHdlIGdvdCBzbyBmYXIgICAgICAgKi8KLQkJYnVmZiAgICAgICArPSByZXN1bHQ7IC8qIGluZGV4IGluIHVzZXItYnVmZmVyICAgICAqLwotCQlyZXFfbGVuICAgIC09IHJlc3VsdDsgLyogd2hhdCdzIGxlZnQgZnJvbSByZXFfbGVuICovCi0JfSAvKiB3aGlsZSAocmVxX2xlbiAgPiAwKSAqLwotCWlmIChyZXFfY2xpcHBlZCkgewotCQlUUkFDRShmdF90X2RhdGFfZmxvdywKLQkJICAgICAgIm1heWJlIHBhcnRpYWwgY291bnQgYmVjYXVzZSBvZiBlb2YgbWFyayIpOwotCQlpZiAoemZ0X2p1c3RfYmVmb3JlX2VvZiAmJiBieXRlc19yZWFkID09IDApIHsKLQkJCS8qIHJlcV9sZW4gd2FzID4gMCwgYnV0IHVzZXIgZGlkbid0IGdldAotCQkJICogYW55dGhpbmcgdGhlIHVzZXIgaGFzIHJlYWQgaW4gdGhlIGVvZi1tYXJrIAotCQkJICovCi0JCQl6ZnRfbW92ZV9wYXN0X2VvZigmemZ0X3Bvcyk7Ci0JCQlmdGFwZV9hYm9ydF9vcGVyYXRpb24oKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGRvbid0IHNraXAgdG8gdGhlIG5leHQgZmlsZSBiZWZvcmUgdGhlIHVzZXIKLQkJCSAqIHRyaWVkIHRvIHJlYWQgYSBzZWNvbmQgdGltZSBwYXN0IEVPRiBKdXN0Ci0JCQkgKiBtYXJrIHRoYXQgd2UgYXJlIGF0IEVPRiBhbmQgbWF5YmUgZGVjcmVtZW50Ci0JCQkgKiB6ZnRfc2VnX3BvcyB0byBzdGF5IGluIHRoZSBzYW1lIHZvbHVtZTsKLQkJCSAqLwotCQkJemZ0X2p1c3RfYmVmb3JlX2VvZiA9IDE7Ci0JCQl6ZnRfcG9zaXRpb25fYmVmb3JlX2VvZigmemZ0X3Bvcywgdm9sdW1lKTsKLQkJCVRSQUNFKGZ0X3Rfbm9pc2UsICJqdXN0IGJlZm9yZSBlb2YiKTsKLQkJfQotCX0KLQl6ZnRfcmVzaWQgLT0gcmVzdWx0OyAvKiBmb3IgTVRTVEFUVVMgICAgICAgKi8KLQlUUkFDRV9FWElUIGJ5dGVzX3JlYWQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS1yZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTQxZGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotI2lmbmRlZiBfWkZUQVBFX1JFQURfSAotI2RlZmluZSBfWkZUQVBFX1JFQURfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXJlYWQuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA3ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWFkIGZ1bmN0aW9ucwotICogICAgICBmb3IgdGhlIHpmdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICoKLSAqLwotCi0jaW5jbHVkZSAiLi4vbG93bGV2ZWwvZnRhcGUtcmVhZC5oIgotCi0vKiAgICAgIGZ0YXBlLXJlYWQuYyBkZWZpbmVkIGdsb2JhbCB2YXJzLgotICovCi1leHRlcm4gaW50IHpmdF9qdXN0X2JlZm9yZV9lb2Y7Ci0JCi0vKiAgICAgIGZ0YXBlLXJlYWQuYyBkZWZpbmVkIGdsb2JhbCBmdW5jdGlvbnMuCi0gKi8KLWV4dGVybiB2b2lkIHpmdF96YXBfcmVhZF9idWZmZXJzKHZvaWQpOwotZXh0ZXJuIGludCAgemZ0X3JlYWRfaGVhZGVyX3NlZ21lbnRzKHZvaWQpOwotZXh0ZXJuIGludCAgemZ0X2ZldGNoX3NlZ21lbnRfZnJhY3Rpb24oY29uc3QgdW5zaWduZWQgaW50IHNlZ21lbnQsCi0JCQkJICAgICAgIHZvaWQgKmJ1ZmZlciwKLQkJCQkgICAgICAgY29uc3QgZnRfcmVhZF9tb2RlX3QgcmVhZF9tb2RlLAotCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc3RhcnQsCi0JCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzaXplKTsKLSNkZWZpbmUgemZ0X2ZldGNoX3NlZ21lbnQoc2VnbWVudCwgYWRkcmVzcywgcmVhZF9tb2RlKQkJXAotCXpmdF9mZXRjaF9zZWdtZW50X2ZyYWN0aW9uKHNlZ21lbnQsIGFkZHJlc3MsIHJlYWRfbW9kZSwJXAotCQkJCSAgIDAsIEZUX1NFR01FTlRfU0laRSkKLS8qICAgaG9vayBmb3IgdGhlIFZGUyBpbnRlcmZhY2UKLSAqLwotZXh0ZXJuIGludCAgX3pmdF9yZWFkKGNoYXIgX191c2VyICpidWZmLCBpbnQgcmVxX2xlbik7Ci0KLSNlbmRpZiAvKiBfWkZUQVBFX1JFQURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuYyBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjYzNDYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA4ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGNvbW1vbiBjb2RlIGZvciB0aGUgci93IGNvZGUgZm9yCi0gKiAgICAgIHpmdGFwZS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jaW5jbHVkZSA8bGludXgvemZ0YXBlLmg+Ci0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1pbml0LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1lb2YuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWN0bC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtd3JpdGUuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJlYWQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS12dGJsLmgiCi0KLS8qICAgICAgR2xvYmFsIHZhcnMuCi0gKi8KLQotX191OCAqemZ0X2RlYmxvY2tfYnVmOwotX191OCAqemZ0X2hzZWdfYnVmOwotaW50IHpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsKLXpmdF9zdGF0dXNfZW51bSB6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsKLWludCB6ZnRfaGVhZGVyX2NoYW5nZWQ7Ci1pbnQgemZ0X3FpYzExMzsgLyogY29uZm9ybSB0byBvbGQgc3BlY3MuIGFuZCBvbGQgemZ0YXBlICovCi1pbnQgemZ0X3VzZV9jb21wcmVzc2lvbjsKLXpmdF9wb3NpdGlvbiB6ZnRfcG9zID0gewotCS0xLCAvKiBzZWdfcG9zICovCi0JMCwgIC8qIHNlZ19ieXRlX3BvcyAqLwotCTAsICAvKiB0YXBlX3BvcyAqLwotCTAgICAvKiB2b2x1bWVfcG9zICovCi19OwotdW5zaWduZWQgaW50IHpmdF9ibGtfc3ogPSBDT05GSUdfWkZUX0RGTFRfQkxLX1NaOwotX19zNjQgemZ0X2NhcGFjaXR5OwotCi11bnNpZ25lZCBpbnQgemZ0X3dyaXR0ZW5fc2VnbWVudHM7Ci1pbnQgemZ0X2xhYmVsX2NoYW5nZWQ7Ci0KLS8qICAgICAgTG9jYWwgdmFycy4KLSAqLwotCi11bnNpZ25lZCBpbnQgemZ0X2dldF9zZWdfc3oodW5zaWduZWQgaW50IHNlZ21lbnQpCi17Ci0JaW50IHNpemU7Ci0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQkKLQlzaXplID0gRlRfU0VHTUVOVF9TSVpFIC0gCi0JCWNvdW50X29uZXMoZnRhcGVfZ2V0X2JhZF9zZWN0b3JfZW50cnkoc2VnbWVudCkpKkZUX1NFQ1RPUl9TSVpFOwotCWlmIChzaXplID4gMCkgewotCQlUUkFDRV9FWElUICh1bnNpZ25lZClzaXplOyAKLQl9IGVsc2UgewotCQlUUkFDRV9FWElUIDA7Ci0JfQotfQotCi0vKiBmdGFwZV9zZXRfZmxhZ3MoKS4gQ2xhdXMtSnVzdHVzIEhlaW5lLCAxOTk0LzE5OTUKLSAqLwotdm9pZCB6ZnRfc2V0X2ZsYWdzKHVuc2lnbmVkIG1pbm9yX3VuaXQpCi17ICAgICAKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQl6ZnRfdXNlX2NvbXByZXNzaW9uID0gemZ0X3FpY19tb2RlID0gMDsKLQlzd2l0Y2ggKG1pbm9yX3VuaXQgJiBaRlRfTUlOT1JfT1BfTUFTSykgewotCWNhc2UgKFpGVF9RODBfTU9ERSB8IFpGVF9aSVBfTU9ERSk6Ci0JY2FzZSBaRlRfWklQX01PREU6Ci0JCXpmdF91c2VfY29tcHJlc3Npb24gPSAxOwotCWNhc2UgMDoKLQljYXNlIFpGVF9RODBfTU9ERToKLQkJemZ0X3FpY19tb2RlID0gMTsKLQkJaWYgKHpmdF9tdF9jb21wcmVzc2lvbikgeyAvKiBvdmVycmlkZSB0aGUgZGVmYXVsdCAqLwotCQkJemZ0X3VzZV9jb21wcmVzc2lvbiA9IDE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBaRlRfUkFXX01PREU6Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJzd2l0Y2hpbmcgdG8gcmF3IG1vZGUiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzpcbiIKLQkJICAgICAgS0VSTl9JTkZPICJXcm9uZyBjb21iaW5hdGlvbiBvZiBtaW5vciBkZXZpY2UgYml0cy5cbiIKLQkJICAgICAgS0VSTl9JTkZPICJTd2l0Y2hpbmcgdG8gcmF3IHJlYWQtb25seSBtb2RlLiIpOwotCQl6ZnRfd3JpdGVfcHJvdGVjdGVkID0gMTsKLQkJYnJlYWs7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qIGNvbXB1dGVzIHRoZSBzZWdtZW50IGFuZCBieXRlIG9mZnNldCBpbnNpZGUgdGhlIHNlZ21lbnQKLSAqIGNvcnJlc3BvbmRpbmcgdG8gdGFwZV9wb3MuCi0gKgotICogdGFwZV9wb3MgZ2l2ZXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gKiBmdF9maXJzdF9kYXRhX3NlZ21lbnQgKnNlZ19ieXRlX3BvcyBpcyB0aGUgb2Zmc2V0IGluIHRoZSBjdXJyZW50Ci0gKiBzZWdtZW50IGluIGJ5dGVzCi0gKgotICogT2YsIGlmIHRoaXMgcm91dGluZSB3YXMgY2FsbGVkIG9mdGVuIG9uZSBzaG91bGQgY2FjaGUgdGhlIGxhc3QgZGF0YQotICogcG9zIGl0IHdhcyBjYWxsZWQgd2l0aCwgYnV0IGFjdHVhbGx5IHRoaXMgaXMgb25seSBuZWVkZWQgaW4KLSAqIGZ0YXBlX3NlZWtfYmxvY2soKSwgdGhhdCBpcywgYWxtb3N0IG5ldmVyLgotICovCi1pbnQgemZ0X2NhbGNfc2VnX2J5dGVfY29vcmQoaW50ICpzZWdfYnl0ZV9wb3MsIF9fczY0IHRhcGVfcG9zKQotewotCWludCBzZWdtZW50OwotCWludCBzZWdfc3o7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYgKHRhcGVfcG9zID09IDApIHsKLQkJKnNlZ19ieXRlX3BvcyA9IDA7Ci0JCXNlZ21lbnQgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JfSBlbHNlIHsKLQkJc2VnX3N6ID0gMDsKLQkJCi0JCWZvciAoc2VnbWVudCA9IGZ0X2ZpcnN0X2RhdGFfc2VnbWVudDsgCi0JCSAgICAgKCh0YXBlX3BvcyA+IDApICYmIChzZWdtZW50IDw9IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSk7Ci0JCSAgICAgc2VnbWVudCsrKSB7Ci0JCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeihzZWdtZW50KTsgCi0JCQl0YXBlX3BvcyAtPSBzZWdfc3o7Ci0JCX0KLQkJaWYodGFwZV9wb3MgPj0gMCkgewotCQkJLyogdGhlIGNhc2UgdGFwZV9wb3MgPiAhPSAwIG1lYW5zIHRoYXQgdGhlCi0JCQkgKiBhcmd1bWVudCB0YXBlX3BvcyBsaWVzIGJleW9uZCB0aGUgRU9ULgotCQkJICovCi0JCQkqc2VnX2J5dGVfcG9zPSAwOwotCQl9IGVsc2UgeyAvKiB0YXBlX3BvcyA8IDAgKi8KLQkJCXNlZ21lbnQtLTsKLQkJCSpzZWdfYnl0ZV9wb3M9IHRhcGVfcG9zICsgc2VnX3N6OwotCQl9Ci0JfQotCVRSQUNFX0VYSVQoc2VnbWVudCk7Ci19Ci0KLS8qIGZ0YXBlX2NhbGNfdGFwZV9wb3MoKS4KLSAqCi0gKiBjb21wdXRlcyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAqIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCBpbnZlcnNlIHRvIGZ0YXBlX2NhbGNfc2VnX2J5dGVfY29vcmQKLSAqCi0gKiBXZSBzaG91bGQgZG8gc29tZSBjYWNoaW5nLiBCdXQgaG93OgotICoKLSAqIEVhY2ggdGltZSB0aGUgaGVhZGVyIHNlZ21lbnRzIGFyZSByZWFkIGluLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkCi0gKiB3aXRoIGZ0X3RyYWNrc19wZXJfdGFwZSpzZWdtZW50c19wZXJfdHJhY2sgYXJndW1uZXQuIFNvIHRoaXMgc2hvdWxkIGJlCi0gKiB0aGUgdGltZSB0byByZXNldCB0aGUgY2FjaGUuCi0gKgotICogQWxzbywgaXQgbWlnaHQgYmUgaW4gdGhlIGZ1dHVyZSB0aGF0IHRoZSBiYWQgc2VjdG9yIG1hcCBnZXRzCi0gKiBjaGFuZ2VkLiAgLT4gcmVzZXQgdGhlIGNhY2hlCi0gKi8KLXN0YXRpYyBpbnQgc2VnX3BvczsKLXN0YXRpYyBfX3M2NCB0YXBlX3BvczsKLQotX19zNjQgemZ0X2dldF9jYXBhY2l0eSh2b2lkKQotewotCXNlZ19wb3MgID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OwotCXRhcGVfcG9zID0gMDsKLQotCXdoaWxlIChzZWdfcG9zIDw9IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSB7Ci0JCXRhcGVfcG9zICs9IHpmdF9nZXRfc2VnX3N6KHNlZ19wb3MgKyspOwotCX0KLQlyZXR1cm4gdGFwZV9wb3M7Ci19Ci0KLV9fczY0IHpmdF9jYWxjX3RhcGVfcG9zKGludCBzZWdtZW50KQotewotCWludCBkMSwgZDIsIGQzOwotCVRSQUNFX0ZVTihmdF90X2FueSk7Ci0JCi0JaWYgKHNlZ21lbnQgPiBmdF9sYXN0X2RhdGFfc2VnbWVudCkgewotCSAgICAgICAgVFJBQ0VfRVhJVCB6ZnRfY2FwYWNpdHk7Ci0JfQotCWlmIChzZWdtZW50IDwgZnRfZmlyc3RfZGF0YV9zZWdtZW50KSB7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JZDIgPSBzZWdtZW50IC0gc2VnX3BvczsKLQlpZiAoLWQyID4gMTApIHsKLQkJZDEgPSBzZWdtZW50IC0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OwotCQlpZiAoLWQyID4gZDEpIHsKLQkJCXRhcGVfcG9zID0gMDsKLQkJCXNlZ19wb3MgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JCQlkMiA9IGQxOwotCQl9Ci0JfQotCWlmIChkMiA+IDEwKSB7Ci0JCWQzID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgLSBzZWdtZW50OwotCQlpZiAoZDIgPiBkMykgewotCQkJdGFwZV9wb3MgPSB6ZnRfY2FwYWNpdHk7Ci0JCQlzZWdfcG9zICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKLQkJCWQyID0gLWQzOwotCQl9Ci0JfQkJCi0JaWYgKGQyID4gMCkgewotCQl3aGlsZSAoc2VnX3BvcyA8IHNlZ21lbnQpIHsKLQkJCXRhcGVfcG9zICs9ICB6ZnRfZ2V0X3NlZ19zeihzZWdfcG9zKyspOwotCQl9Ci0JfSBlbHNlIHsKLQkJd2hpbGUgKHNlZ19wb3MgPiBzZWdtZW50KSB7Ci0JCQl0YXBlX3BvcyAtPSAgemZ0X2dldF9zZWdfc3ooLS1zZWdfcG9zKTsKLQkJfQotCX0KLQlUUkFDRShmdF90X25vaXNlLCAibmV3IGNhY2hlZCBwb3M6ICVkIiwgc2VnX3Bvcyk7Ci0KLQlUUkFDRV9FWElUIHRhcGVfcG9zOwotfQotCi0vKiBjb3B5IFotbGFiZWwgc3RyaW5nIHRvIGJ1ZmZlciwga2VlcHMgdHJhY2sgb2YgdGhlIGNvcnJlY3Qgb2Zmc2V0IGluCi0gKiBgYnVmZmVyJyAKLSAqLwotdm9pZCB6ZnRfdXBkYXRlX2xhYmVsKF9fdTggKmJ1ZmZlcikKLXsgCi0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JaWYgKHN0cm5jbXAoJmJ1ZmZlcltGVF9MQUJFTF0sIFpGVEFQRV9MQUJFTCwgCi0JCSAgICBzaXplb2YoWkZUQVBFX0xBQkVMKS0xKSAhPSAwKSB7Ci0JCVRSQUNFKGZ0X3RfaW5mbywgInVwZGF0aW5nIGxhYmVsIGZyb20gXCIlc1wiIHRvIFwiJXNcIiIsCi0JCSAgICAgICZidWZmZXJbRlRfTEFCRUxdLCBaRlRBUEVfTEFCRUwpOwotCQlzdHJjcHkoJmJ1ZmZlcltGVF9MQUJFTF0sIFpGVEFQRV9MQUJFTCk7Ci0JCW1lbXNldCgmYnVmZmVyW0ZUX0xBQkVMXSArIHNpemVvZihaRlRBUEVfTEFCRUwpIC0gMSwgJyAnLCAKLQkJICAgICAgIEZUX0xBQkVMX1NaIC0gc2l6ZW9mKFpGVEFQRV9MQUJFTCArIDEpKTsKLQkJUFVUNChidWZmZXIsIEZUX0xBQkVMX0RBVEUsIDApOwotCQl6ZnRfbGFiZWxfY2hhbmdlZCA9IHpmdF9oZWFkZXJfY2hhbmdlZCA9IDE7IC8qIGNoYW5nZWQgKi8KLQl9Ci0JVFJBQ0VfRVhJVDsKLX0KLQotaW50IHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHModW5zaWduZWQgaW50IHNlZ21lbnQsIAotCQkJICAgICAgX191OCAqZGF0YSwgc2l6ZV90IHNpemUsCi0JCQkgICAgICBfX3U4ICpidWZmZXIpCi17Ci0JaW50IHJlc3VsdDsKLQlfX3U4ICp3cml0ZV9idWY7Ci0JX191OCAqc3JjX2J1ZjsKLQlpbnQgc2luZ2xlOwotCWludCBzZWdfcG9zOwotCWludCBzZWdfc3o7Ci0JaW50IHJlbWFpbmluZzsKLQlmdF93cml0ZV9tb2RlX3Qgd3JpdGVfbW9kZTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCXNlZ19wb3MgICA9IHNlZ21lbnQ7Ci0Jc2VnX3N6ICAgID0gemZ0X2dldF9zZWdfc3ooc2VnX3Bvcyk7Ci0Jc3JjX2J1ZiAgID0gZGF0YTsKLQlzaW5nbGUgICAgPSBzaXplIDw9IHNlZ19zejsKLQlyZW1haW5pbmcgPSBzaXplOwotCWRvIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIlxuIgotCQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZzogJWRcbiIKLQkJICAgICAgS0VSTl9JTkZPICJzZWdfc3ogICA6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAic2VnbWVudCAgOiAlZCIsCi0JCSAgICAgIHJlbWFpbmluZywgc2VnX3N6LCBzZWdfcG9zKTsKLQkJaWYgKHJlbWFpbmluZyA9PSBzZWdfc3opIHsKLQkJCXdyaXRlX2J1ZiA9IHNyY19idWY7Ci0JCQl3cml0ZV9tb2RlID0gc2luZ2xlID8gRlRfV1JfU0lOR0xFIDogRlRfV1JfTVVMVEk7Ci0JCQlyZW1haW5pbmcgPSAwOwotCQl9IGVsc2UgaWYgKHJlbWFpbmluZyA+IHNlZ19zeikgewotCQkJd3JpdGVfYnVmID0gc3JjX2J1ZjsKLQkJCXdyaXRlX21vZGUgPSBGVF9XUl9BU1lOQzsgLyogZG9uJ3Qgc3RhcnQgdGFwZSAqLwotCQkJcmVtYWluaW5nIC09IHNlZ19zejsKLQkJfSBlbHNlIHsgLyogcmVtYWluaW5nIDwgc2VnX3N6ICovCi0JCQl3cml0ZV9idWYgPSBidWZmZXI7Ci0JCQltZW1jcHkod3JpdGVfYnVmLCBzcmNfYnVmLCByZW1haW5pbmcpOwotCQkJbWVtc2V0KCZ3cml0ZV9idWZbcmVtYWluaW5nXSwnXDAnLHNlZ19zei1yZW1haW5pbmcpOwotCQkJd3JpdGVfbW9kZSA9IHNpbmdsZSA/IEZUX1dSX1NJTkdMRSA6IEZUX1dSX01VTFRJOwotCQkJcmVtYWluaW5nID0gMDsKLQkJfQotCQlpZiAoKHJlc3VsdCA9IGZ0YXBlX3dyaXRlX3NlZ21lbnQoc2VnX3BvcywgCi0JCQkJCQkgIHdyaXRlX2J1ZiwgCi0JCQkJCQkgIHdyaXRlX21vZGUpKSAhPSBzZWdfc3opIHsKLQkJCVRSQUNFKGZ0X3RfZXJyLCAiRXJyb3I6ICIKLQkJCSAgICAgICJDb3VsZG4ndCB3cml0ZSBzZWdtZW50ICVkIiwgc2VnX3Bvcyk7Ci0JCQlUUkFDRV9FWElUIHJlc3VsdCA8IDAgPyByZXN1bHQgOiAtRUlPOyAvKiBiYWlsIG91dCAqLwotCQl9Ci0JCXpmdF93cml0dGVuX3NlZ21lbnRzICsrOwotCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeigrK3NlZ19wb3MpOwotCQlzcmNfYnVmICs9IHJlc3VsdDsKLQl9IHdoaWxlIChyZW1haW5pbmcgPiAwKTsKLQlpZiAoZnRhcGVfZ2V0X3N0YXR1cygpLT5mdGlfc3RhdGUgPT0gd3JpdGluZykgewotCQlUUkFDRV9DQVRDSChmdGFwZV9sb29wX3VudGlsX3dyaXRlc19kb25lKCksKTsKLQkJVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKLQkJemZ0X3ByZXZlbnRfZmx1c2goKTsKLQl9Ci0Jc2VnX3BvcyA9IHNlZ21lbnQ7Ci0Jc3JjX2J1ZiA9IGRhdGE7Ci0JcmVtYWluaW5nID0gc2l6ZTsKLQlkbyB7Ci0JCVRSQUNFX0NBVENIKHJlc3VsdCA9IGZ0YXBlX3JlYWRfc2VnbWVudChzZWdfcG9zLCBidWZmZXIsIAotCQkJCQkJCXNpbmdsZSA/IEZUX1JEX1NJTkdMRQotCQkJCQkJCTogRlRfUkRfQUhFQUQpLCk7Ci0JCWlmIChtZW1jbXAoc3JjX2J1ZiwgYnVmZmVyLCAKLQkJCSAgIHJlbWFpbmluZyA+IHJlc3VsdCA/IHJlc3VsdCA6IHJlbWFpbmluZykgIT0gMCkgewotCQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9lcnIsCi0JCQkJICAgICJGYWlsZWQgdG8gdmVyaWZ5IHdyaXR0ZW4gc2VnbWVudCAlZCIsCi0JCQkJICAgIHNlZ19wb3MpOwotCQl9Ci0JCXJlbWFpbmluZyAtPSByZXN1bHQ7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJ2ZXJpZnkgc3VjY2Vzc2Z1bDpcbiIKLQkJICAgICAgS0VSTl9JTkZPICJzZWdtZW50ICA6ICVkXG4iCi0JCSAgICAgIEtFUk5fSU5GTyAic2Vnc2l6ZSAgOiAlZFxuIgotCQkgICAgICBLRVJOX0lORk8gInJlbWFpbmluZzogJWQiLAotCQkgICAgICBzZWdfcG9zLCByZXN1bHQsIHJlbWFpbmluZyk7Ci0JCXNyY19idWYgICArPSBzZWdfc3o7Ci0JCXNlZ19wb3MrKzsKLQl9IHdoaWxlIChyZW1haW5pbmcgPiAwKTsKLQlUUkFDRV9FWElUIHNpemU7Ci19Ci0KLQotLyogemZ0X2VyYXNlKCkuICBpbXBsZW1lbnRlZCBjb21wcmVzc2lvbi1oYW5kbGluZwotICoKLSAqIGNhbGN1bGF0ZSB0aGUgZmlyc3QgZGF0YS1zZWdtZW50IHdoZW4gdXNpbmcvbm90IHVzaW5nIGNvbXByZXNzaW9uLgotICoKLSAqIHVwZGF0ZSBoZWFkZXItc2VnbWVudCBhbmQgY29tcHJlc3Npb24tbWFwLXNlZ21lbnQuCi0gKi8KLWludCB6ZnRfZXJhc2Uodm9pZCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgewotCQlUUkFDRV9DQVRDSCh6ZnRfdm1hbGxvY19vbmNlKCh2b2lkICoqKSZ6ZnRfaHNlZ19idWYsCi0JCQkJCSAgICAgRlRfU0VHTUVOVF9TSVpFKSwpOwotCQkvKiBubyBuZWVkIHRvIHJlYWQgdGhlIHZ0YmwgYW5kIGNvbXByZXNzaW9uIG1hcCAqLwotCQlUUkFDRV9DQVRDSChmdGFwZV9yZWFkX2hlYWRlcl9zZWdtZW50KHpmdF9oc2VnX2J1ZiksKTsKLQkJaWYgKCh6ZnRfb2xkX2Z0YXBlID0gCi0JCSAgICAgemZ0X2Z0YXBlX3ZhbGlkYXRlX2xhYmVsKCZ6ZnRfaHNlZ19idWZbRlRfTEFCRUxdKSkpIHsKLQkJCXpmdF9mdGFwZV9leHRyYWN0X2ZpbGVfbWFya3MoemZ0X2hzZWdfYnVmKTsKLQkJfQotCQlUUkFDRShmdF90X25vaXNlLAotCQkgICAgICAiZnRfZmlyc3RfZGF0YV9zZWdtZW50OiAlZCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQ6ICVkIiwgCi0JCSAgICAgIGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCwgZnRfbGFzdF9kYXRhX3NlZ21lbnQpOwotCQl6ZnRfcWljMTEzID0gKGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF9ub3JtYWwgJiYKLQkJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF8xMTAwZnQgJiYKLQkJCSAgICAgIGZ0X2Zvcm1hdF9jb2RlICE9IGZtdF80MjVmdCk7Ci0JfQotCWlmICh6ZnRfb2xkX2Z0YXBlKSB7Ci0JCXpmdF9jbGVhcl9mdGFwZV9maWxlX21hcmtzKCk7Ci0JCXpmdF9vbGRfZnRhcGUgPSAwOyAvKiBubyBsb25nZXIgb2xkIGZ0YXBlICovCi0JfQotCVBVVDIoemZ0X2hzZWdfYnVmLCBGVF9DTUFQX1NUQVJULCAwKTsKLQl6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQgPSAxOwotCXpmdF9jYXBhY2l0eSA9IHpmdF9nZXRfY2FwYWNpdHkoKTsKLQl6ZnRfaW5pdF92dGJsKCk7Ci0JLyogdGhlIHJlc3QgbXVzdCBiZSBkb25lIGluIGZ0YXBlX3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMgCi0JICovCi0JemZ0X2hlYWRlcl9yZWFkID0gMTsKLQl6ZnRfaGVhZGVyX2NoYW5nZWQgPSAxOyAvKiBmb3JjZSB1cGRhdGUgb2YgdGltZXN0YW1wICovCi0JcmVzdWx0ID0gemZ0X3VwZGF0ZV9oZWFkZXJfc2VnbWVudHMoKTsKLQotCWZ0YXBlX2Fib3J0X29wZXJhdGlvbigpOwotCi0JemZ0X3Jlc2V0X3Bvc2l0aW9uKCZ6ZnRfcG9zKTsKLQl6ZnRfc2V0X2ZsYWdzICh6ZnRfdW5pdCk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLXVuc2lnbmVkIGludCB6ZnRfZ2V0X3RpbWUodm9pZCkgCi17Ci0JdW5zaWduZWQgaW50IGRhdGUgPSBGVF9USU1FX1NUQU1QKDIwOTcsIDExLCAzMCwgMjMsIDU5LCA1OSk7IC8qIGZ1biAqLwotCXJldHVybiBkYXRlOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXJ3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWVjMjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0jaWZuZGVmIF9aRlRBUEVfUldfSAotI2RlZmluZSBfWkZUQVBFX1JXX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtcncuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4yICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjA5ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWFkIGFuZCB3cml0ZQotICogICAgICBmdW5jdGlvbnMgZm9yIHRoZSBRSUMtMTE3IGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCi0gKgotICovCi0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWJ1ZmZlcnMuaCIKLQotI2RlZmluZSBTRUdNRU5UU19QRVJfVEFQRSAgKGZ0X3NlZ21lbnRzX3Blcl90cmFjayAqIGZ0X3RyYWNrc19wZXJfdGFwZSkKLQotLyogIFFJQy0xMTMgUmV2LiBHIHNheXMgdGhhdCBgYSBtYXhpbXVtIG9mIDYzNDg4IHJhdyBieXRlcyBtYXkgYmUKLSAqICBjb21wcmVzc2VkIGludG8gYSBzaW5nbGUgZnJhbWUnLgotICogIE1heWJlIHdlIHNob3VsZCBzdGljayB0byAzMmtiIHRvIG1ha2UgaXQgbW9yZSBgYmVhdXRpZnVsJwotICovCi0jZGVmaW5lIFpGVF9NQVhfQkxLX1NaICAgICAgICAgICAoNjIqMTAyNCkgLyogYnl0ZXMgKi8KLSNpZiAhZGVmaW5lZChDT05GSUdfWkZUX0RGTFRfQkxLX1NaKQotIyBkZWZpbmUgQ09ORklHX1pGVF9ERkxUX0JMS19TWiAgICgxMCoxMDI0KSAvKiBieXRlcywgZGVmYXVsdCBvZiBnbnUgdGFyICovCi0jZWxpZiBDT05GSUdfWkZUX0RGTFRfQkxLX1NaID09IDAKLSMgdW5kZWYgIENPTkZJR19aRlRfREZMVF9CTEtfU1oKLSMgZGVmaW5lIENPTkZJR19aRlRfREZMVF9CTEtfU1ogMQotI2VsaWYgKENPTkZJR19aRlRfREZMVF9CTEtfU1ogJSAxMDI0KSAhPSAwCi0jIGVycm9yIENPTkZJR19aRlRfREZMVF9CTEtfU1ogbXVzdCBiZSAxIG9yIGEgbXVsdGlwbGUgb2YgMTAyNAotI2VuZGlmCi0vKiBUaGUgKm9wdGlvbmFsKiBjb21wcmVzc2lvbiByb3V0aW5lcyBuZWVkIHNvbWUgb3ZlcmhlYWQgcGVyIHRhcGUKLSAqICBibG9jayBmb3IgdGhlaXIgcHVycG9zZXMuIEluc3RlYWQgb2YgYXNraW5nIHRoZSBhY3R1YWwgY29tcHJlc3Npb24KLSAqICBpbXBsZW1lbnRhdGlvbiBob3cgbXVjaCBpdCBuZWVkcywgd2UgcmVzdHJpY3QgdGhpcyBvdmVyaGVhZCB0byBiZQotICogIG1heGltYWwgb2YgWkZUX0NNUFRfT1ZFUkhFQUQgc2l6ZS4gV2UgbmVlZCB0aGlzIGZvciBFT1QKLSAqICBjb25kaXRpb25zLiBUaGUgdGFwZSBpcyBhc3N1bWVkIHRvIGJlIGxvZ2ljYWwgYXQgRU9UIHdoZW4gdGhlCi0gKiAgZGlzdGFuY2UgZnJvbSB0aGUgcGh5c2ljYWwgRU9UIGlzIGxlc3MgdGhhbiAKLSAqICBvbmUgdGFwZSBibG9jayArIFpGVF9DTVBSX09WRVJIRUFEIAotICovCi0jZGVmaW5lIFpGVF9DTVBSX09WRVJIRUFEIDE2ICAgICAgICAvKiBieXRlcyAqLwotCi10eXBlZGVmIGVudW0KLXsgCi0JemZ0X2lkbGUgPSAwLAotCXpmdF9yZWFkaW5nLAotCXpmdF93cml0aW5nLAotfSB6ZnRfc3RhdHVzX2VudW07Ci0KLXR5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICAgLyogIGFsbCB2YWx1ZXMgbWVhc3VyZWQgaW4gYnl0ZXMgKi8KLXsKLQlpbnQgICBzZWdfcG9zOyAgICAgICAvKiAgc2VnbWVudCBjdXJyZW50bHkgcG9zaXRpb25lZCBhdCAqLwotCWludCAgIHNlZ19ieXRlX3BvczsgIC8qICBvZmZzZXQgaW4gY3VycmVudCBzZWdtZW50ICovIAotCV9fczY0IHRhcGVfcG9zOyAgICAgIC8qICByZWFsIG9mZnNldCBmcm9tIEJPVCAqLwotCV9fczY0IHZvbHVtZV9wb3M7ICAgIC8qICBwb3MuIGluIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbSBpbgotCQkJICAgICAgKiAgY3VycmVudCB2b2x1bWUgCi0JCQkgICAgICAqLwotfSB6ZnRfcG9zaXRpb247IAotCi1leHRlcm4gemZ0X3Bvc2l0aW9uIHpmdF9wb3M7Ci1leHRlcm4gX191OCAqemZ0X2RlYmxvY2tfYnVmOwotZXh0ZXJuIF9fdTggKnpmdF9oc2VnX2J1ZjsKLWV4dGVybiBpbnQgemZ0X2RlYmxvY2tfc2VnbWVudDsKLWV4dGVybiB6ZnRfc3RhdHVzX2VudW0gemZ0X2lvX3N0YXRlOwotZXh0ZXJuIGludCB6ZnRfaGVhZGVyX2NoYW5nZWQ7Ci1leHRlcm4gaW50IHpmdF9xaWMxMTM7IC8qIGNvbmZvcm0gdG8gb2xkIHNwZWNzLiBhbmQgb2xkIHpmdGFwZSAqLwotZXh0ZXJuIGludCB6ZnRfdXNlX2NvbXByZXNzaW9uOwotZXh0ZXJuIHVuc2lnbmVkIGludCB6ZnRfYmxrX3N6OwotZXh0ZXJuIF9fczY0IHpmdF9jYXBhY2l0eTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgemZ0X3dyaXR0ZW5fc2VnbWVudHM7Ci1leHRlcm4gaW50IHpmdF9sYWJlbF9jaGFuZ2VkOwotCi0vKiAgemZ0YXBlLXJ3LmMgZXhwb3J0ZWQgZnVuY3Rpb25zCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgemZ0X2dldF9zZWdfc3oodW5zaWduZWQgaW50IHNlZ21lbnQpOwotZXh0ZXJuIHZvaWQgIHpmdF9zZXRfZmxhZ3ModW5zaWduZWQgaW50IG1pbm9yX3VuaXQpOwotZXh0ZXJuIGludCAgIHpmdF9jYWxjX3NlZ19ieXRlX2Nvb3JkKGludCAqc2VnX2J5dGVfcG9zLCBfX3M2NCB0YXBlX3Bvcyk7Ci1leHRlcm4gX19zNjQgemZ0X2NhbGNfdGFwZV9wb3MoaW50IHNlZ21lbnQpOwotZXh0ZXJuIF9fczY0IHpmdF9nZXRfY2FwYWNpdHkodm9pZCk7Ci1leHRlcm4gdm9pZCAgemZ0X3VwZGF0ZV9sYWJlbChfX3U4ICpidWZmZXIpOwotZXh0ZXJuIGludCAgIHpmdF9lcmFzZSh2b2lkKTsKLWV4dGVybiBpbnQgICB6ZnRfdmVyaWZ5X3dyaXRlX3NlZ21lbnRzKHVuc2lnbmVkIGludCBzZWdtZW50LCAKLQkJCQkgICAgICAgX191OCAqZGF0YSwgc2l6ZV90IHNpemUsIF9fdTggKmJ1ZmZlcik7Ci1leHRlcm4gdW5zaWduZWQgaW50IHpmdF9nZXRfdGltZSh2b2lkKTsKLSNlbmRpZiAvKiBfWkZUQVBFX1JXX0ggKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGUtdnRibC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDdmOGJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuYworKysgL2Rldi9udWxsCkBAIC0xLDc1NyArMCwwIEBACi0vKgotICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUgCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0geW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuYyx2ICQKLSAqICRSZXZpc2lvbjogMS43LjYuMSAkCi0gKiAkRGF0ZTogMTk5Ny8xMS8yNCAxMzo0ODozMSAkCi0gKgotICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIHZvbHVtZSB0YWJsZSBhcyBkZWZpbmVkIGluIHZhcmlvdXMgUUlDCi0gKiAgICAgIHN0YW5kYXJkcy4KLSAqIAotICogICAgICBUaGlzIGlzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiwganVzdCBhbGxvd2luZyBvcmRpbmFyeSBET1MKLSAqICAgICAgOiggcHJncmFtcyB0byBpZGVudGlmeSB0aGUgY2FydHJpZGdlIGFzIHVzZWQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKLQotI2RlZmluZSBaRlRfQ01BUF9IQUNLIC8qIGxlYXZlIHRoaXMgZGVmaW5lZCB0byBoaWRlIHRoZSBjb21wcmVzc2lvbiBtYXAgKi8KLQotLyoKLSAqICBnbG9iYWwgdmFyaWFibGVzIAotICovCi1pbnQgemZ0X3FpY19tb2RlICAgPSAxOyAvKiB1c2UgdGhlIHZ0YmwgKi8KLWludCB6ZnRfb2xkX2Z0YXBlOyAvKiBwcmV2ZW50cyBvbGQgZnRhcGVkIHRhcGVzIHRvIGJlIG92ZXJ3cml0dGVuICovCi1pbnQgemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkOyAvKiBmb3Igd3JpdGVfaGVhZGVyX3NlZ21lbnRzKCkgKi8KLQotLyoKLSAqICBwcml2YXRlIHZhcmlhYmxlcyAob25seSBleHBvcnRlZCBmb3IgaW5saW5lIGZ1bmN0aW9ucykKLSAqLwotTElTVF9IRUFEKHpmdF92dGJsKTsKLQotLyogIFdlIGNvdWxkIGFsc28gYWxsb2NhdGUgdGhlc2UgZHluYW1pY2FsbHkgd2hlbiBleHRyYWN0aW5nIHRoZSB2b2x1bWUgdGFibGUKLSAqICBzaXplb2YoemZ0X3ZvbGluZm8pIGlzIGFib3V0IDMyIG9yIHNvbWV0aGluZyBjbG9zZSB0byB0aGF0Ci0gKi8KLXN0YXRpYyB6ZnRfdm9saW5mbyAgdGFwZV92dGJsOwotc3RhdGljIHpmdF92b2xpbmZvICBlb3RfdnRibDsKLXN0YXRpYyB6ZnRfdm9saW5mbyAqY3VyX3Z0Ymw7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB6ZnRfbmV3X3Z0YmxfZW50cnkodm9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSAmemZ0X2xhc3RfdnRibC0+bm9kZTsKLQl6ZnRfdm9saW5mbyAqbmV3ID0gemZ0X2ttYWxsb2Moc2l6ZW9mKHpmdF92b2xpbmZvKSk7Ci0KLQlsaXN0X2FkZCgmbmV3LT5ub2RlLCB0bXApOwotCW5ldy0+Y291bnQgPSB6ZnRfZW9tX3Z0YmwtPmNvdW50ICsrOwotfQotCi12b2lkIHpmdF9mcmVlX3Z0Ymwodm9pZCkKLXsKLQlmb3IgKDs7KSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9IHpmdF92dGJsLnByZXY7Ci0JCXpmdF92b2xpbmZvICp2dGJsOwotCi0JCWlmICh0bXAgPT0gJnpmdF92dGJsKQotCQkJYnJlYWs7Ci0JCWxpc3RfZGVsKHRtcCk7Ci0JCXZ0YmwgPSBsaXN0X2VudHJ5KHRtcCwgemZ0X3ZvbGluZm8sIG5vZGUpOwotCQl6ZnRfa2ZyZWUodnRibCwgc2l6ZW9mKHpmdF92b2xpbmZvKSk7Ci0JfQotCUlOSVRfTElTVF9IRUFEKCZ6ZnRfdnRibCk7Ci0JY3VyX3Z0YmwgPSBOVUxMOwotfQotCi0vKiAgaW5pdGlhbGl6ZSB2dGJsLCBjYWxsZWQgYnkgZnRhcGVfbmV3X2NhcnRyaWRnZSgpCi0gKi8KLXZvaWQgemZ0X2luaXRfdnRibCh2b2lkKQoteyAKLQl6ZnRfdm9saW5mbyAqbmV3OwotCi0JemZ0X2ZyZWVfdnRibCgpOwotCQotCS8qICBDcmVhdGUgdGhlIHR3byBkdW1teSB2dGJsIGVudHJpZXMKLQkgKi8KLQluZXcgPSB6ZnRfa21hbGxvYyhzaXplb2YoemZ0X3ZvbGluZm8pKTsKLQlsaXN0X2FkZCgmbmV3LT5ub2RlLCAmemZ0X3Z0YmwpOwotCW5ldyA9IHpmdF9rbWFsbG9jKHNpemVvZih6ZnRfdm9saW5mbykpOwotCWxpc3RfYWRkKCZuZXctPm5vZGUsICZ6ZnRfdnRibCk7Ci0JemZ0X2hlYWRfdnRibC0+ZW5kX3NlZyAgID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OwotCXpmdF9oZWFkX3Z0YmwtPmJsa19zeiAgICA9IHpmdF9ibGtfc3o7Ci0JemZ0X2hlYWRfdnRibC0+Y291bnQgICAgID0gLTE7Ci0JemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50ICsgMTsKLQl6ZnRfZW9tX3Z0YmwtPmVuZF9zZWcgICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCArIDE7Ci0JemZ0X2VvbV92dGJsLT5ibGtfc3ogICAgID0gemZ0X2Jsa19zejsKLQl6ZnRfZW9tX3Z0YmwtPmNvdW50ICAgICAgPSAwOwotCi0JLyogIFJlc2V0IHRoZSBwb2ludGVyIGZvciB6ZnRfZmluZF92b2x1bWUoKQotCSAqLwotCWN1cl92dGJsID0gemZ0X2VvbV92dGJsOwotCi0JLyogaW5pdGlhbGl6ZSB0aGUgZHVtbXkgdnRibCBlbnRyaWVzIGZvciB6ZnRfcWljX21vZGUgPT0gMAotCSAqLwotCWVvdF92dGJsLnN0YXJ0X3NlZyAgICAgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50ICsgMTsKLQllb3RfdnRibC5lbmRfc2VnICAgICAgICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCArIDE7Ci0JZW90X3Z0YmwuYmxrX3N6ICAgICAgICAgID0gemZ0X2Jsa19zejsKLQllb3RfdnRibC5jb3VudCAgICAgICAgICAgPSAtMTsKLQl0YXBlX3Z0Ymwuc3RhcnRfc2VnID0gZnRfZmlyc3RfZGF0YV9zZWdtZW50OwotCXRhcGVfdnRibC5lbmRfc2VnICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudDsKLQl0YXBlX3Z0YmwuYmxrX3N6ICAgID0gemZ0X2Jsa19zejsKLQl0YXBlX3Z0Ymwuc2l6ZSAgICAgID0gemZ0X2NhcGFjaXR5OwotCXRhcGVfdnRibC5jb3VudCAgICAgPSAwOwotfQotCi0vKiBjaGVjayBmb3IgYSB2YWxpZCBWVEJMIHNpZ25hdHVyZS4gCi0gKi8KLXN0YXRpYyBpbnQgdnRibF9zaWduYXR1cmVfdmFsaWQoX191OCBzaWduYXR1cmVbNF0pCi17Ci0JY29uc3QgY2hhciAqdnRibF9pZHNbXSA9IFZUQkxfSURTOyAvKiB2YWxpZCBzaWduYXR1cmVzICovCi0JaW50IGo7Ci0JCi0JZm9yIChqID0gMDsgCi0JICAgICAoaiA8IE5SX0lURU1TKHZ0YmxfaWRzKSkgJiYgKG1lbWNtcChzaWduYXR1cmUsIHZ0YmxfaWRzW2pdLCA0KSAhPSAwKTsKLQkgICAgIGorKyk7Ci0JcmV0dXJuIGogPCBOUl9JVEVNUyh2dGJsX2lkcyk7Ci19Ci0KLS8qIFdlIHVzZWQgdG8gc3RvcmUgdGhlIGJsb2NrLXNpemUgb2YgdGhlIHZvbHVtZSBpbiB0aGUgdm9sdW1lLWxhYmVsLAotICogdXNpbmcgdGhlIGtleXdvcmQgImJsb2Nrc2l6ZSIuIFRoZSBibG9ja3NpemUgd3JpdHRlbiB0byB0aGUKLSAqIHZvbHVtZS1sYWJlbCBpcyBpbiBieXRlcy4KLSAqCi0gKiBXZSB1c2UgdGhpcyBub3cgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB6ZnRhcGUgdmVyc2lvbi4gV2UKLSAqIHN0b3JlIHRoZSBibG9ja3NpemUgZGlyZWN0bHkgYXMgYmluYXJ5IG51bWJlciBpbiB0aGUgdmVuZG9yCi0gKiBleHRlbnNpb24gcGFydCBvZiB0aGUgdm9sdW1lIGVudHJ5LgotICovCi1zdGF0aWMgaW50IGNoZWNrX3ZvbHVtZV9sYWJlbChjb25zdCBjaGFyICpsYWJlbCwgaW50ICpibGtfc3opCi17IAotCWludCB2YWxpZF9mb3JtYXQ7Ci0JY2hhciAqYmxvY2tzaXplOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJjYWxsZWQgd2l0aCBcIiVzXCIgLyBcIiVzXCIiLCBsYWJlbCwgWkZUX1ZPTF9OQU1FKTsKLQlpZiAoc3RybmNtcChsYWJlbCwgWkZUX1ZPTF9OQU1FLCBzdHJsZW4oWkZUX1ZPTF9OQU1FKSkgIT0gMCkgewotCQkqYmxrX3N6ID0gMTsgLyogc21hbGxlc3QgYmxvY2sgc2l6ZSB0aGF0IHdlIGFsbG93ICovCi0JCXZhbGlkX2Zvcm1hdCA9IDA7Ci0JfSBlbHNlIHsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgImdvdCBvbGQgc3R5bGUgemZ0YXBlIHZ0YmwgZW50cnkiKTsKLQkJLyogZ2V0IHRoZSBkZWZhdWx0IGJsb2Nrc2l6ZSAqLwotCQkvKiB1c2UgdGhlIGtlcm5lbCBzdHJzdHIoKSAgICovCi0JCWJsb2Nrc2l6ZT0gc3Ryc3RyKGxhYmVsLCAiIGJsb2Nrc2l6ZSAiKTsKLQkJaWYgKGJsb2Nrc2l6ZSkgewotCQkJYmxvY2tzaXplICs9IHN0cmxlbigiIGJsb2Nrc2l6ZSAiKTsKLQkJCWZvcigqYmxrX3N6PSAwOyAKLQkJCSAgICAqYmxvY2tzaXplID49ICcwJyAmJiAqYmxvY2tzaXplIDw9ICc5JzsgCi0JCQkgICAgYmxvY2tzaXplKyspIHsKLQkJCQkqYmxrX3N6ICo9IDEwOwotCQkJCSpibGtfc3ogKz0gKmJsb2Nrc2l6ZSAtICcwJzsKLQkJCX0KLQkJCWlmICgqYmxrX3N6ID4gWkZUX01BWF9CTEtfU1opIHsKLQkJCQkqYmxrX3N6PSAxOwotCQkJCXZhbGlkX2Zvcm1hdD0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsaWRfZm9ybWF0ID0gMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCSpibGtfc3o9IDE7Ci0JCQl2YWxpZF9mb3JtYXQ9IDA7Ci0JCX0KLQl9Ci0JVFJBQ0VfRVhJVCB2YWxpZF9mb3JtYXQ7Ci19Ci0KLS8qICAgY2hlY2sgZm9yIGEgemZ0YXBlIHZvbHVtZQotICovCi1zdGF0aWMgaW50IGNoZWNrX3ZvbHVtZShfX3U4ICplbnRyeSwgemZ0X3ZvbGluZm8gKnZvbHVtZSkKLXsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZihzdHJuY21wKCZlbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX1NJR10sIFpGVEFQRV9TSUcsCi0JCSAgIHN0cmxlbihaRlRBUEVfU0lHKSkgPT0gMCkgewotCQlUUkFDRShmdF90X25vaXNlLCAiZ290IG5ldyBzdHlsZSB6ZnRhcGUgdnRibCBlbnRyeSIpOwotCQl2b2x1bWUtPmJsa19zeiA9IEdFVDIoZW50cnksIFZUQkxfRVhUK0VYVF9aRlRBUEVfQkxLU1opOwotCQl2b2x1bWUtPnFpYzExMyA9IGVudHJ5W1ZUQkxfRVhUK0VYVF9aRlRBUEVfUUlDMTEzXTsKLQkJVFJBQ0VfRVhJVCAxOwotCX0gZWxzZSB7Ci0JCVRSQUNFX0VYSVQgY2hlY2tfdm9sdW1lX2xhYmVsKCZlbnRyeVtWVEJMX0RFU0NdLCAmdm9sdW1lLT5ibGtfc3opOwotCX0KLX0KLQotCi0vKiBjcmVhdGUgemZ0YXBlIHNwZWNpZmljIHZ0YmwgZW50cnksIHRoZSB2b2x1bWUgYm91bmRzIGFyZSBpbnNlcnRlZAotICogaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sIHpmdF9jcmVhdGVfdm9sdW1lX2hlYWRlcnMoKQotICovCi1zdGF0aWMgdm9pZCBjcmVhdGVfemZ0X3ZvbHVtZShfX3U4ICplbnRyeSwgemZ0X3ZvbGluZm8gKnZ0YmwpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQltZW1zZXQoZW50cnksIDAsIFZUQkxfU0laRSk7Ci0JbWVtY3B5KCZlbnRyeVtWVEJMX1NJR10sIFZUQkxfSUQsIDQpOwotCXNwcmludGYoJmVudHJ5W1ZUQkxfREVTQ10sIFpGVF9WT0xfTkFNRSIgJTAzZCIsIHZ0YmwtPmNvdW50KTsKLQllbnRyeVtWVEJMX0ZMQUdTXSA9IChWVEJMX0ZMX05PVF9WRVJJRklFRCB8IFZUQkxfRkxfU0VHX1NQQU5OSU5HKTsKLQllbnRyeVtWVEJMX01fTk9dID0gMTsgLyogbXVsdGlfY2FydHJpZGdlX2NvdW50ICovCi0Jc3RyY3B5KCZlbnRyeVtWVEJMX0VYVCtFWFRfWkZUQVBFX1NJR10sIFpGVEFQRV9TSUcpOwotCVBVVDIoZW50cnksIFZUQkxfRVhUK0VYVF9aRlRBUEVfQkxLU1osIHZ0YmwtPmJsa19zeik7Ci0JaWYgKHpmdF9xaWMxMTMpIHsKLQkJUFVUOChlbnRyeSwgVlRCTF9EQVRBX1NJWkUsIHZ0YmwtPnNpemUpOwotCQllbnRyeVtWVEJMX0NNUFJdID0gVlRCTF9DTVBSX1VOUkVHOyAKLQkJaWYgKHZ0YmwtPnVzZV9jb21wcmVzc2lvbikgeyAvKiB1c2UgY29tcHJlc3Npb246ICovCi0JCQllbnRyeVtWVEJMX0NNUFJdIHw9IFZUQkxfQ01QUl9VU0VEOwotCQl9Ci0JCWVudHJ5W1ZUQkxfRVhUK0VYVF9aRlRBUEVfUUlDMTEzXSA9IDE7Ci0JfSBlbHNlIHsKLQkJUFVUNChlbnRyeSwgVlRCTF9EQVRBX1NJWkUsIHZ0YmwtPnNpemUpOwotCQllbnRyeVtWVEJMX0tfQ01QUl0gPSBWVEJMX0NNUFJfVU5SRUc7IAotCQlpZiAodnRibC0+dXNlX2NvbXByZXNzaW9uKSB7IC8qIHVzZSBjb21wcmVzc2lvbjogKi8KLQkJCWVudHJ5W1ZUQkxfS19DTVBSXSB8PSBWVEJMX0NNUFJfVVNFRDsKLQkJfQotCX0KLQlpZiAoZnRfZm9ybWF0X2NvZGUgPT0gZm10X2JpZykgewotCQkvKiBTQ1NJIGxpa2UgdnRibCwgc3RvcmUgdGhlIG51bWJlciBvZiB1c2VkCi0JCSAqIHNlZ21lbnRzIGFzIDQgYnl0ZSB2YWx1ZSAKLQkJICovCi0JCVBVVDQoZW50cnksIFZUQkxfU0NTSV9TRUdTLCB2dGJsLT5lbmRfc2VnLXZ0YmwtPnN0YXJ0X3NlZyArIDEpOwotCX0gZWxzZSB7Ci0JCS8qIG5vcm1hbCwgUUlDLTgwTUMgbGlrZSB2dGJsIAotCQkgKi8KLQkJUFVUMihlbnRyeSwgVlRCTF9TVEFSVCwgdnRibC0+c3RhcnRfc2VnKTsKLQkJUFVUMihlbnRyeSwgVlRCTF9FTkQsIHZ0YmwtPmVuZF9zZWcpOwotCX0KLQlUUkFDRV9FWElUOwotfQotCi0vKiB0aGlzIG9uZSBjcmVhdGVzIHRoZSB2b2x1bWUgaGVhZGVycyBmb3IgZWFjaCB2b2x1bWUuIEl0IGlzIGFzc3VtZWQKLSAqIHRoYXQgYnVmZmVyIGFscmVhZHkgY29udGFpbnMgdGhlIG9sZCB2b2x1bWUtdGFibGUsIHNvIHRoYXQgdnRibAotICogZW50cmllcyB3aXRob3V0IHRoZSB6ZnRfdm9sdW1lIGZsYWcgc2V0IGNhbiBzYXZlbHkgYmUgaWdub3JlZC4KLSAqLwotc3RhdGljIHZvaWQgemZ0X2NyZWF0ZV92b2x1bWVfaGVhZGVycyhfX3U4ICpidWZmZXIpCi17ICAgCi0JX191OCAqZW50cnk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCXpmdF92b2xpbmZvICp2dGJsOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotI2lmZGVmIFpGVF9DTUFQX0hBQ0sKLQlpZigoc3RybmNtcCgmYnVmZmVyW1ZUQkxfRVhUK0VYVF9aRlRBUEVfU0lHXSwgWkZUQVBFX1NJRywKLQkJICAgIHN0cmxlbihaRlRBUEVfU0lHKSkgPT0gMCkgJiYgCi0JICAgYnVmZmVyW1ZUQkxfRVhUK0VYVF9aRlRBUEVfQ01BUF0gIT0gMCkgewotCQlUUkFDRShmdF90X25vaXNlLCAiZGVsZXRpbmcgY21hcCB2b2x1bWUiKTsKLQkJbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArIFZUQkxfU0laRSwKLQkJCUZUX1NFR01FTlRfU0laRSAtIFZUQkxfU0laRSk7Ci0JfQotI2VuZGlmCi0JZW50cnkgPSBidWZmZXI7Ci0JZm9yICh0bXAgPSB6ZnRfaGVhZF92dGJsLT5ub2RlLm5leHQ7Ci0JICAgICB0bXAgIT0gJnpmdF9lb21fdnRibC0+bm9kZTsKLQkgICAgIHRtcCA9IHRtcC0+bmV4dCkgewotCQl2dGJsID0gbGlzdF9lbnRyeSh0bXAsIHpmdF92b2xpbmZvLCBub2RlKTsKLQkJLyogd2Ugbm93IGZpbGwgaW4gdGhlIHZhbHVlcyBvbmx5IGZvciBuZXdseSBjcmVhdGVkIHZvbHVtZXMuCi0JCSAqLwotCQlpZiAodnRibC0+bmV3X3ZvbHVtZSkgewotCQkJY3JlYXRlX3pmdF92b2x1bWUoZW50cnksIHZ0YmwpOwotCQkJdnRibC0+bmV3X3ZvbHVtZSA9IDA7IC8qIGNsZWFyIHRoZSBmbGFnICovCi0JCX0KLQkJCi0JCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAmZW50cnlbVlRCTF9ERVNDXSwgdnRibCk7Ci0JCWVudHJ5ICs9IFZUQkxfU0laRTsKLQl9Ci0JbWVtc2V0KGVudHJ5LCAwLCBGVF9TRUdNRU5UX1NJWkUgLSB6ZnRfZW9tX3Z0YmwtPmNvdW50ICogVlRCTF9TSVpFKTsKLQlUUkFDRV9FWElUOwotfQotCi0vKiAgd3JpdGUgdm9sdW1lIHRhYmxlIHRvIHRhcGUuIENhbGxzIHpmdF9jcmVhdGVfdm9sdW1lX2hlYWRlcnMoKQotICovCi1pbnQgemZ0X3VwZGF0ZV92b2x1bWVfdGFibGUodW5zaWduZWQgaW50IHNlZ21lbnQpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JX191OCAqdmVyaWZ5X2J1ZiA9IE5VTEw7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRV9DQVRDSChyZXN1bHQgPSBmdGFwZV9yZWFkX3NlZ21lbnQoZnRfZmlyc3RfZGF0YV9zZWdtZW50LCAKLQkJCQkJCXpmdF9kZWJsb2NrX2J1ZiwKLQkJCQkJCUZUX1JEX1NJTkdMRSksKTsKLQl6ZnRfY3JlYXRlX3ZvbHVtZV9oZWFkZXJzKHpmdF9kZWJsb2NrX2J1Zik7Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgIndyaXRpbmcgdm9sdW1lIHRhYmxlIHNlZ21lbnQgJWQiLCBzZWdtZW50KTsKLQlpZiAoemZ0X3ZtYWxsb2Nfb25jZSgmdmVyaWZ5X2J1ZiwgRlRfU0VHTUVOVF9TSVpFKSA9PSAwKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHMoc2VnbWVudCwgCi0JCQkJCQkgICAgICB6ZnRfZGVibG9ja19idWYsIHJlc3VsdCwKLQkJCQkJCSAgICAgIHZlcmlmeV9idWYpLAotCQkJICAgIHpmdF92ZnJlZSgmdmVyaWZ5X2J1ZiwgRlRfU0VHTUVOVF9TSVpFKSk7Ci0JCXpmdF92ZnJlZSgmdmVyaWZ5X2J1ZiwgRlRfU0VHTUVOVF9TSVpFKTsKLQl9IGVsc2UgewotCQlUUkFDRV9DQVRDSChmdGFwZV93cml0ZV9zZWdtZW50KHNlZ21lbnQsIHpmdF9kZWJsb2NrX2J1ZiwgCi0JCQkJCQlGVF9XUl9TSU5HTEUpLCk7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogbm9uIHpmdGFwZSB2b2x1bWVzIGFyZSBoYW5kbGVkIGluIHJhdyBtb2RlLiBUaHVzIHdlIG5lZWQgdG8KLSAqIGNhbGN1bGF0ZSB0aGUgcmF3IGFtb3VudCBvZiBkYXRhIGNvbnRhaW5lZCBpbiB0aG9zZSBzZWdtZW50cy4gIAotICovCi1zdGF0aWMgdm9pZCBleHRyYWN0X2FsaWVuX3ZvbHVtZShfX3U4ICplbnRyeSwgemZ0X3ZvbGluZm8gKnZ0YmwpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQl2dGJsLT5zaXplICA9ICh6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5lbmRfc2VnKzEpIC0KLQkJICAgICAgIHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZykpOwotCXZ0YmwtPnVzZV9jb21wcmVzc2lvbiA9IDA7Ci0JdnRibC0+cWljMTEzID0gemZ0X3FpYzExMzsKLQlpZiAodnRibC0+cWljMTEzKSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsIAotCQkgICAgICAiRmFrZSBhbGllbiB2b2x1bWUncyBzaXplIGZyb20gIiBMTF9YICIgdG8gIiBMTF9YLCAKLQkJICAgICAgTEwoR0VUOChlbnRyeSwgVlRCTF9EQVRBX1NJWkUpKSwgTEwodnRibC0+c2l6ZSkpOwotCX0gZWxzZSB7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JCSAgICAgICJGYWtlIGFsaWVuIHZvbHVtZSdzIHNpemUgZnJvbSAlZCB0byAiIExMX1gsIAotCQkgICAgICAoaW50KUdFVDQoZW50cnksIFZUQkxfREFUQV9TSVpFKSwgTEwodnRibC0+c2l6ZSkpOwotCX0KLQlUUkFDRV9FWElUOwotfQotCi0KLS8qIGV4dHJhY3QgYW4gemZ0YXBlIHNwZWNpZmljIHZvbHVtZQotICovCi1zdGF0aWMgdm9pZCBleHRyYWN0X3pmdF92b2x1bWUoX191OCAqZW50cnksIHpmdF92b2xpbmZvICp2dGJsKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKHZ0YmwtPnFpYzExMykgewotCQl2dGJsLT5zaXplID0gR0VUOChlbnRyeSwgVlRCTF9EQVRBX1NJWkUpOwotCQl2dGJsLT51c2VfY29tcHJlc3Npb24gPSAKLQkJCShlbnRyeVtWVEJMX0NNUFJdICYgVlRCTF9DTVBSX1VTRUQpICE9IDA7IAotCX0gZWxzZSB7Ci0JCXZ0YmwtPnNpemUgPSBHRVQ0KGVudHJ5LCBWVEJMX0RBVEFfU0laRSk7Ci0JCWlmIChlbnRyeVtWVEJMX0tfQ01QUl0gJiBWVEJMX0NNUFJfVU5SRUcpIHsKLQkJCXZ0YmwtPnVzZV9jb21wcmVzc2lvbiA9IAotCQkJCShlbnRyeVtWVEJMX0tfQ01QUl0gJiBWVEJMX0NNUFJfVVNFRCkgIT0gMDsKLQkJfSBlbHNlIGlmIChlbnRyeVtWVEJMX0NNUFJdICYgVlRCTF9DTVBSX1VOUkVHKSB7Ci0JCQl2dGJsLT51c2VfY29tcHJlc3Npb24gPSAKLQkJCQkoZW50cnlbVlRCTF9DTVBSXSAmIFZUQkxfQ01QUl9VU0VEKSAhPSAwOyAKLQkJfSBlbHNlIHsKLQkJCVRSQUNFKGZ0X3Rfd2FybiwgIkdlZWghIFRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZzpcbiIKLQkJCSAgICAgIEtFUk5fSU5GTyAiUUlDIGNvbXByZXNzaW9uIChSZXYgPSBLKTogJXhcbiIKLQkJCSAgICAgIEtFUk5fSU5GTyAiUUlDIGNvbXByZXNzaW9uIChSZXYgPiBLKTogJXgiLAotCQkJICAgICAgZW50cnlbVlRCTF9LX0NNUFJdLCBlbnRyeVtWVEJMX0NNUFJdKTsKLQkJfQotCX0KLQlUUkFDRV9FWElUOwotfQotCi0vKiBleHRyYWN0IHRoZSB2b2x1bWUgdGFibGUgZnJvbSBidWZmZXIuICJidWZmZXIiIG11c3QgYWxyZWFkeSBjb250YWluCi0gKiB0aGUgdnRibC1zZWdtZW50IAotICovCi1pbnQgemZ0X2V4dHJhY3Rfdm9sdW1lX2hlYWRlcnMoX191OCAqYnVmZmVyKQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgX191OCAqZW50cnk7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JemZ0X2luaXRfdnRibCgpOwotCWVudHJ5ID0gYnVmZmVyOwotI2lmZGVmIFpGVF9DTUFQX0hBQ0sKLQlpZiAoKHN0cm5jbXAoJmVudHJ5W1ZUQkxfRVhUK0VYVF9aRlRBUEVfU0lHXSwgWkZUQVBFX1NJRywKLQkJICAgICBzdHJsZW4oWkZUQVBFX1NJRykpID09IDApICYmCi0JICAgIGVudHJ5W1ZUQkxfRVhUK0VYVF9aRlRBUEVfQ01BUF0gIT0gMCkgewotCQlUUkFDRShmdF90X25vaXNlLCAiaWdub3JpbmcgY21hcCB2b2x1bWUiKTsKLQkJZW50cnkgKz0gVlRCTF9TSVpFOwotCX0gCi0jZW5kaWYKLQkvKiB0aGUgZW5kIG9mIHRoZSB2dGJsIGlzIGluZGljYXRlZCBieSBhbiBpbnZhbGlkIHNpZ25hdHVyZSAKLQkgKi8KLQl3aGlsZSAodnRibF9zaWduYXR1cmVfdmFsaWQoJmVudHJ5W1ZUQkxfU0lHXSkgJiYKLQkgICAgICAgKGVudHJ5IC0gYnVmZmVyKSA8IEZUX1NFR01FTlRfU0laRSkgewotCQl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKLQkJaWYgKGZ0X2Zvcm1hdF9jb2RlID09IGZtdF9iaWcpIHsKLQkJCS8qIFNDU0kgbGlrZSB2dGJsLCBzdG9yZXMgb25seSB0aGUgbnVtYmVyIG9mCi0JCQkgKiBzZWdtZW50cyB1c2VkIAotCQkJICovCi0JCQl1bnNpZ25lZCBpbnQgbnVtX3NlZ21lbnRzPSBHRVQ0KGVudHJ5LCBWVEJMX1NDU0lfU0VHUyk7Ci0JCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgPSB6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZzsKLQkJCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgPSAKLQkJCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgKyBudW1fc2VnbWVudHMgLSAxOwotCQl9IGVsc2UgewotCQkJLyogYG5vcm1hbCcsIFFJQy04MCBsaWtlIHZ0YmwgCi0JCQkgKi8KLQkJCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyA9IEdFVDIoZW50cnksIFZUQkxfU1RBUlQpOwotCQkJemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyAgID0gR0VUMihlbnRyeSwgVlRCTF9FTkQpOwotCQl9Ci0JCXpmdF9lb21fdnRibC0+c3RhcnRfc2VnICA9IHpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgKyAxOwotCQkvKiBjaGVjayBpZiB3ZSBjcmVhdGVkIHRoaXMgdm9sdW1lIGFuZCBnZXQgdGhlCi0JCSAqIGJsa19zeiAKLQkJICovCi0JCXpmdF9sYXN0X3Z0YmwtPnpmdF92b2x1bWUgPSBjaGVja192b2x1bWUoZW50cnksIHpmdF9sYXN0X3Z0YmwpOwotCQlpZiAoemZ0X2xhc3RfdnRibC0+emZ0X3ZvbHVtZSA9PSAwKSB7Ci0JCQlleHRyYWN0X2FsaWVuX3ZvbHVtZShlbnRyeSwgemZ0X2xhc3RfdnRibCk7Ci0JCX0gZWxzZSB7Ci0JCQlleHRyYWN0X3pmdF92b2x1bWUoZW50cnksIHpmdF9sYXN0X3Z0YmwpOwotCQl9Ci0JCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAmZW50cnlbVlRCTF9ERVNDXSwgemZ0X2xhc3RfdnRibCk7Ci0JCWVudHJ5ICs9VlRCTF9TSVpFOwotCX0KLSNpZiAwCi0vKgotICogIHVuZGVmaW5lIHRvIHRlc3QgZW5kIG9mIHRhcGUgaGFuZGxpbmcKLSAqLwotCXpmdF9uZXdfdnRibF9lbnRyeSgpOwotCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyA9IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnOwotCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50IC0gMTA7Ci0JemZ0X2xhc3RfdnRibC0+YmxrX3N6ICAgICAgICAgID0gemZ0X2Jsa19zejsKLQl6ZnRfbGFzdF92dGJsLT56ZnRfdm9sdW1lICAgICAgPSAxOwotCXpmdF9sYXN0X3Z0YmwtPnFpYzExMyAgICAgICAgICA9IHpmdF9xaWMxMTM7Ci0JemZ0X2xhc3RfdnRibC0+c2l6ZSA9ICh6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5lbmRfc2VnKzEpCi0JCQkgICAgICAgLSB6ZnRfY2FsY190YXBlX3Bvcyh6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcpKTsKLSNlbmRpZgotCVRSQUNFX0VYSVQgMDsKLX0KLQotLyogdGhpcyBmdW5jdGlvbnMgdHJhbnNsYXRlcyB0aGUgZmFpbGVkX3NlY3Rvcl9sb2csIG1pc3VzZWQgYXMKLSAqIEVPRi1tYXJrZXIgbGlzdCwgaW50byBhIHZpcnR1YWwgdm9sdW1lIHRhYmxlLiBUaGUgdGFibGUgbXVzdG4ndCBiZQotICogd3JpdHRlbiB0byB0YXBlLCBiZWNhdXNlIHRoaXMgd291bGQgb2NjdXB5IHRoZSBmaXJzdCBkYXRhIHNlZ21lbnQsCi0gKiB3aGljaCBzaG91bGQgYmUgdGhlIHZvbHVtZSB0YWJsZSwgYnV0IGlzIGFjdHVhbGx5IHRoZSBmaXJzdCBzZWdtZW50Ci0gKiB0aGF0IGlzIGZpbGxlZCB3aXRoIGRhdGEgKHdoZW4gdXNpbmcgc3RhbmRhcmQgZnRhcGUpLiAgV2UgYXNzdW1lLAotICogdGhhdCB3ZSBnZXQgYSBub24tZW1wdHkgZmFpbGVkX3NlY3Rvcl9sb2cuCi0gKi8KLWludCB6ZnRfZmFrZV92b2x1bWVfaGVhZGVycyAoZW9mX21hcmtfdW5pb24gKmVvZl9tYXAsIGludCBudW1fZmFpbGVkX3NlY3RvcnMpCi17Ci0JdW5zaWduZWQgaW50IHNlZ21lbnQsIHNlY3RvcjsKLQlpbnQgaGF2ZV9lb20gPSAwOwotCWludCB2b2xfbm87Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAoKG51bV9mYWlsZWRfc2VjdG9ycyA+PSAyKSAmJgotCSAgICAoR0VUMigmZW9mX21hcFtudW1fZmFpbGVkX3NlY3RvcnMgLSAxXS5tYXJrLnNlZ21lbnQsIDApIAotCSAgICAgPT0gCi0JICAgICBHRVQyKCZlb2ZfbWFwW251bV9mYWlsZWRfc2VjdG9ycyAtIDJdLm1hcmsuc2VnbWVudCwgMCkgKyAxKSAmJgotCSAgICAoR0VUMigmZW9mX21hcFtudW1fZmFpbGVkX3NlY3RvcnMgLSAxXS5tYXJrLmRhdGUsIDApID09IDEpKSB7Ci0JCS8qIHRoaXMgc2hvdWxkIGJlIGVvbS4gV2Uga2VlcCB0aGUgcmVtYWluZGVyIG9mIHRoZQotCQkgKiB0YXBlIGFzIGFub3RoZXIgdm9sdW1lLgotCQkgKi8KLQkJaGF2ZV9lb20gPSAxOwotCX0KLQl6ZnRfaW5pdF92dGJsKCk7Ci0JemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgPSBmdF9maXJzdF9kYXRhX3NlZ21lbnQ7Ci0JZm9yKHZvbF9ubyA9IDA7IHZvbF9ubyA8IG51bV9mYWlsZWRfc2VjdG9ycyAtIGhhdmVfZW9tOyB2b2xfbm8gKyspIHsKLQkJemZ0X25ld192dGJsX2VudHJ5KCk7Ci0KLQkJc2VnbWVudCA9IEdFVDIoJmVvZl9tYXBbdm9sX25vXS5tYXJrLnNlZ21lbnQsIDApOwotCQlzZWN0b3IgID0gR0VUMigmZW9mX21hcFt2b2xfbm9dLm1hcmsuZGF0ZSwgMCk7Ci0KLQkJemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnICA9IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnOwotCQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgID0gc2VnbWVudDsKLQkJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gc2VnbWVudCArIDE7Ci0JCXpmdF9sYXN0X3Z0YmwtPmJsa19zeiAgICAgPSAxOwotCQl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAgID0gCi0JCQkoemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2xhc3RfdnRibC0+ZW5kX3NlZykKLQkJCSAtIHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZykKLQkJCSArIChzZWN0b3ItMSkgKiBGVF9TRUNUT1JfU0laRSk7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsIAotCQkgICAgICAiZmFpbGVkIHNlY3RvciBsb2c6IHNlZ21lbnQ6ICVkLCBzZWN0b3I6ICVkIiwgCi0JCSAgICAgIHNlZ21lbnQsIHNlY3Rvcik7Ci0JCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAiRmFrZWQgdm9sdW1lIiwgemZ0X2xhc3RfdnRibCk7Ci0JfQotCWlmICghaGF2ZV9lb20pIHsKLQkJemZ0X25ld192dGJsX2VudHJ5KCk7Ci0JCXpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyA9IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnOwotCQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudDsKLQkJemZ0X2VvbV92dGJsLT5zdGFydF9zZWcgID0gZnRfbGFzdF9kYXRhX3NlZ21lbnQgKyAxOwotCQl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAgPSB6ZnRfY2FwYWNpdHk7Ci0JCXpmdF9sYXN0X3Z0YmwtPnNpemUgICAgIC09IHpmdF9jYWxjX3RhcGVfcG9zKHpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZyk7Ci0JCXpmdF9sYXN0X3Z0YmwtPmJsa19zeiAgICA9IDE7Ci0JCURVTVBfVk9MSU5GTyhmdF90X25vaXNlLCAiRmFrZWQgdm9sdW1lIix6ZnRfbGFzdF92dGJsKTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiB1cGRhdGUgdGhlIGludGVybmFsIHZvbHVtZSB0YWJsZQotICoKLSAqIGlmIGJlZm9yZSBzdGFydCBvZiBsYXN0IHZvbHVtZTogZXJhc2UgYWxsIGZvbGxvd2luZyB2b2x1bWVzIGlmCi0gKiBpbnNpZGUgYSB2b2x1bWU6IHNldCBlbmQgb2Ygdm9sdW1lIHRvIGluZmluaXR5Ci0gKgotICogdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZXZlcnkgdGltZSBfZnRhcGVfd3JpdGUoKSBpcwotICogY2FsbGVkCi0gKgotICogcmV0dXJuOiAwIGlmIG5vIG5ldyB2b2x1bWUgd2FzIGNyZWF0ZWQsIDEgaWYgYSBuZXcgdm9sdW1lIHdhcwotICogY3JlYXRlZAotICoKLSAqIE5PVEU6IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHpmdF9tb2RlIGFzIGZ0YXBlX3dyaXRlKCkgZG9lcwotICogdGhhdCBhbHJlYWR5LiBUaGlzIGZ1bmN0aW9uIGdldHMgbmV2ZXIgY2FsbGVkIHdpdGhvdXQgYWNjZXNzaW5nCi0gKiB6ZnRhcGUgdmlhIHRoZSAqcWZ0KiBkZXZpY2VzIAotICovCi0KLWludCB6ZnRfb3Blbl92b2x1bWUoemZ0X3Bvc2l0aW9uICpwb3MsIGludCBibGtfc3osIGludCB1c2VfY29tcHJlc3Npb24pCi17IAotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCWlmICghemZ0X3FpY19tb2RlKSB7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JaWYgKHpmdF90YXBlX2F0X2xib3QocG9zKSkgewotCQl6ZnRfaW5pdF92dGJsKCk7Ci0JCWlmKHpmdF9vbGRfZnRhcGUpIHsKLQkJCS8qIGNsZWFyIG9sZCBmdGFwZSdzIGVvZiBtYXJrcyAqLwotCQkJemZ0X2NsZWFyX2Z0YXBlX2ZpbGVfbWFya3MoKTsKLQkJCXpmdF9vbGRfZnRhcGUgPSAwOyAvKiBubyBsb25nZXIgb2xkIGZ0YXBlICovCi0JCX0KLQkJemZ0X3Jlc2V0X3Bvc2l0aW9uKHBvcyk7Ci0JfQotCWlmIChwb3MtPnNlZ19wb3MgIT0gemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyArIDEpIHsKLQkJVFJBQ0VfQUJPUlQoLUVJTywgZnRfdF9idWcsIAotCQkgICAgICAiQlVHOiBzZWdfcG9zOiAlZCwgemZ0X2xhc3RfdnRibC0+ZW5kX3NlZzogJWQiLCAKLQkJICAgICAgcG9zLT5zZWdfcG9zLCB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnKTsKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCVRSQUNFKGZ0X3Rfbm9pc2UsICJjcmVhdGUgbmV3IHZvbHVtZSIpOwotCWlmICh6ZnRfZW9tX3Z0YmwtPmNvdW50ID49IFpGVF9NQVhfVk9MVU1FUykgewotCQlUUkFDRV9BQk9SVCgtRU5PU1BDLCBmdF90X2VyciwKLQkJCSAgICAiRXJyb3I6IG1heG1pbWFsIG51bWJlciBvZiB2b2x1bWVzIGV4aGF1c3RlZCAiCi0JCQkgICAgIihtYXhtaW11bSBpcyAlZCkiLCBaRlRfTUFYX1ZPTFVNRVMpOwotCX0KLQl6ZnRfbmV3X3Z0YmxfZW50cnkoKTsKLQlwb3MtPnZvbHVtZV9wb3MgPSBwb3MtPnNlZ19ieXRlX3BvcyA9IDA7Ci0JemZ0X2xhc3RfdnRibC0+c3RhcnRfc2VnICAgICAgID0gcG9zLT5zZWdfcG9zOwotCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICAgICAgICA9IGZ0X2xhc3RfZGF0YV9zZWdtZW50OyAvKiBpbmZpbml0eSAqLwotCXpmdF9sYXN0X3Z0YmwtPmJsa19zeiAgICAgICAgICA9IGJsa19zejsKLQl6ZnRfbGFzdF92dGJsLT5zaXplICAgICAgICAgICAgPSB6ZnRfY2FwYWNpdHk7Ci0JemZ0X2xhc3RfdnRibC0+emZ0X3ZvbHVtZSAgICAgID0gMTsKLQl6ZnRfbGFzdF92dGJsLT51c2VfY29tcHJlc3Npb24gPSB1c2VfY29tcHJlc3Npb247Ci0JemZ0X2xhc3RfdnRibC0+cWljMTEzICAgICAgICAgID0gemZ0X3FpYzExMzsKLQl6ZnRfbGFzdF92dGJsLT5uZXdfdm9sdW1lICAgICAgPSAxOwotCXpmdF9sYXN0X3Z0YmwtPm9wZW4gICAgICAgICAgICA9IDE7Ci0JemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0gMTsKLQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSBmdF9sYXN0X2RhdGFfc2VnbWVudCArIDE7Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiAgcGVyZm9ybSBtdGZzZiwgbXRic2YsIG5vdCBhbGxvd2VkIHdpdGhvdXQgemZ0X3FpY19tb2RlCi0gKi8KLWludCB6ZnRfc2tpcF92b2x1bWVzKGludCBjb3VudCwgemZ0X3Bvc2l0aW9uICpwb3MpCi17IAotCWNvbnN0IHpmdF92b2xpbmZvICp2dGJsOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCVRSQUNFKGZ0X3Rfbm9pc2UsICJjb3VudDogJWQiLCBjb3VudCk7Ci0JCi0JdnRibD0gemZ0X2ZpbmRfdm9sdW1lKHBvcy0+c2VnX3Bvcyk7Ci0Jd2hpbGUgKGNvdW50ID4gMCAmJiB2dGJsICE9IHpmdF9lb21fdnRibCkgewotCQl2dGJsID0gbGlzdF9lbnRyeSh2dGJsLT5ub2RlLm5leHQsIHpmdF92b2xpbmZvLCBub2RlKTsKLQkJY291bnQgLS07Ci0JfQotCXdoaWxlIChjb3VudCA8IDAgJiYgdnRibCAhPSB6ZnRfZmlyc3RfdnRibCkgewotCQl2dGJsID0gbGlzdF9lbnRyeSh2dGJsLT5ub2RlLnByZXYsIHpmdF92b2xpbmZvLCBub2RlKTsKLQkJY291bnQgKys7Ci0JfQotCXBvcy0+c2VnX3BvcyAgICAgICAgPSB2dGJsLT5zdGFydF9zZWc7Ci0JcG9zLT5zZWdfYnl0ZV9wb3MgICA9IDA7Ci0JcG9zLT52b2x1bWVfcG9zICAgICA9IDA7Ci0JcG9zLT50YXBlX3BvcyAgICAgICA9IHpmdF9jYWxjX3RhcGVfcG9zKHBvcy0+c2VnX3Bvcyk7Ci0JemZ0X2p1c3RfYmVmb3JlX2VvZiA9IHZ0YmwtPnNpemUgPT0gMDsKLQlpZiAoemZ0X2NtcHJfb3BzKSB7Ci0JCSgqemZ0X2NtcHJfb3BzLT5yZXNldCkoKTsKLQl9Ci0JemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOyAvKiBubyBuZWVkIHRvIGtlZXAgY2FjaGUgKi8KLQlUUkFDRShmdF90X25vaXNlLCAicmVwb3NpdGlvbmluZyB0bzpcbiIKLQkgICAgICBLRVJOX0lORk8gInpmdF9zZWdfcG9zICAgICAgICA6ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICJ6ZnRfc2VnX2J5dGVfcG9zICAgOiAlZFxuIgotCSAgICAgIEtFUk5fSU5GTyAiemZ0X3RhcGVfcG9zICAgICAgIDogIiBMTF9YICJcbiIKLQkgICAgICBLRVJOX0lORk8gInpmdF92b2x1bWVfcG9zICAgICA6ICIgTExfWCAiXG4iCi0JICAgICAgS0VSTl9JTkZPICJmaWxlIG51bWJlciAgICAgICAgOiAlZCIsCi0JICAgICAgcG9zLT5zZWdfcG9zLCBwb3MtPnNlZ19ieXRlX3BvcywgCi0JICAgICAgTEwocG9zLT50YXBlX3BvcyksIExMKHBvcy0+dm9sdW1lX3BvcyksIHZ0YmwtPmNvdW50KTsKLQl6ZnRfcmVzaWQgPSBjb3VudCA8IDAgPyAtY291bnQgOiBjb3VudDsKLQlUUkFDRV9FWElUIHpmdF9yZXNpZCA/IC1FSU5WQUwgOiAwOwotfQotCi0vKiB0aGUgZm9sbG93aW5nIHNpbXBseSByZXR1cm5zIHRoZSByYXcgZGF0YSBwb3NpdGlvbiBvZiB0aGUgRU9NCi0gKiBtYXJrZXIsIE1USU9DU0laRSBpb2N0bCAKLSAqLwotX19zNjQgemZ0X2dldF9lb21fcG9zKHZvaWQpCi17Ci0JaWYgKHpmdF9xaWNfbW9kZSkgewotCQlyZXR1cm4gemZ0X2NhbGNfdGFwZV9wb3MoemZ0X2VvbV92dGJsLT5zdGFydF9zZWcpOwotCX0gZWxzZSB7Ci0JCS8qIHRoZXJlIGlzIG9ubHkgb25lIHZvbHVtZSBpbiByYXcgbW9kZSAqLwotCQlyZXR1cm4gemZ0X2NhcGFjaXR5OwotCX0KLX0KLQotLyogc2tpcCB0byBlb20sIHVzZWQgZm9yIE1URU9NCi0gKi8KLXZvaWQgemZ0X3NraXBfdG9fZW9tKHpmdF9wb3NpdGlvbiAqcG9zKQotewotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCXBvcy0+c2VnX3BvcyAgICAgID0gemZ0X2VvbV92dGJsLT5zdGFydF9zZWc7Ci0JcG9zLT5zZWdfYnl0ZV9wb3MgPSAKLQkJcG9zLT52b2x1bWVfcG9zICAgICA9IAotCQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gMDsKLQlwb3MtPnRhcGVfcG9zID0gemZ0X2NhbGNfdGFwZV9wb3MocG9zLT5zZWdfcG9zKTsKLQlUUkFDRShmdF90X25vaXNlLCAiZnRhcGUgcG9zaXRpb25lZCB0byBzZWdtZW50ICVkLCBkYXRhIHBvcyAiIExMX1gsIAotCSAgICAgIHBvcy0+c2VnX3BvcywgTEwocG9zLT50YXBlX3BvcykpOwotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qICB3cml0ZSBhbiBFT0YtbWFya2VyIGJ5IHNldHRpbmcgemZ0X2xhc3RfdnRibC0+ZW5kX3NlZyB0byBzZWdfcG9zLgotICogIE5PVEU6IHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHpmdF9sYXN0X3Z0YmwgcG9pbnRzIHRvIGEgdmFsaWQKLSAqICB2dGJsIGVudHJ5Ci0gKgotICogIE5PVEU6IHRoaXMgcm91dGluZSBhbHdheXMgcG9zaXRpb25zIGJlZm9yZSB0aGUgRU9GIG1hcmtlcgotICovCi1pbnQgemZ0X2Nsb3NlX3ZvbHVtZSh6ZnRfcG9zaXRpb24gKnBvcykKLXsKLQlUUkFDRV9GVU4oZnRfdF9hbnkpOwotCi0JaWYgKHpmdF92dGJsX2VtcHR5IHx8ICF6ZnRfbGFzdF92dGJsLT5vcGVuKSB7IC8qIHNob3VsZCBub3QgaGFwcGVuICovCi0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJUaGVyZSBhcmUgbm8gdm9sdW1lcyB0byBmaW5pc2giKTsKLQkJVFJBQ0VfRVhJVCAtRUlPOwotCX0KLQlpZiAocG9zLT5zZWdfYnl0ZV9wb3MgPT0gMCAmJiAKLQkgICAgcG9zLT5zZWdfcG9zICE9IHpmdF9sYXN0X3Z0YmwtPnN0YXJ0X3NlZykgewotCQlwb3MtPnNlZ19wb3MgLS07Ci0JCXBvcy0+c2VnX2J5dGVfcG9zICAgICAgPSB6ZnRfZ2V0X3NlZ19zeihwb3MtPnNlZ19wb3MpOwotCX0KLQl6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICAgPSBwb3MtPnNlZ19wb3M7Ci0JemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgID0gcG9zLT52b2x1bWVfcG9zOwotCXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCA9IDE7Ci0JemZ0X2p1c3RfYmVmb3JlX2VvZiAgICAgID0gMTsKLQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyAgPSB6ZnRfbGFzdF92dGJsLT5lbmRfc2VnICsgMTsKLQl6ZnRfbGFzdF92dGJsLT5vcGVuICAgICAgPSAwOyAvKiBjbG9zZWQgKi8KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLS8qIHdyaXRlIGNvdW50IGZpbGUtbWFya3MgYXQgY3VycmVudCBwb3NpdGlvbi4gCi0gKgotICogIFRoZSB0YXBlIGlzIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlIGVvZi1tYXJrZXIsIHRoYXQgaXMgYXQgYnl0ZSAwIG9mCi0gKiAgdGhlIHNlZ21lbnQgZm9sbG93aW5nIHRoZSBlb2YtbWFya2VyCi0gKgotICogIHRoaXMgZnVuY3Rpb24gaXMgb25seSBhbGxvd2VkIGluIHpmdF9xaWNfbW9kZQotICoKLSAqICBPbmx5IGFsbG93ZWQgd2hlbiB0YXBlIGlzIGF0IEJPVCBvciBFT0QuCi0gKi8KLWludCB6ZnRfd2VvZih1bnNpZ25lZCBpbnQgY291bnQsIHpmdF9wb3NpdGlvbiAqcG9zKQotewotCQotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKCFjb3VudCkgeyAvKiB3cml0ZSB6ZXJvIEVPRiBtYXJrcyBzaG91bGQgYmUgYSByZWFsIG5vLW9wICovCi0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0gMTsKLQlpZiAoemZ0X3RhcGVfYXRfbGJvdChwb3MpKSB7Ci0JCXpmdF9pbml0X3Z0YmwoKTsKLQkJaWYoemZ0X29sZF9mdGFwZSkgewotCQkJLyogY2xlYXIgb2xkIGZ0YXBlJ3MgZW9mIG1hcmtzICovCi0JCQl6ZnRfY2xlYXJfZnRhcGVfZmlsZV9tYXJrcygpOwotCQkJemZ0X29sZF9mdGFwZSA9IDA7ICAgIC8qIG5vIGxvbmdlciBvbGQgZnRhcGUgKi8KLQkJfQotCX0KLQlpZiAoemZ0X2xhc3RfdnRibC0+b3BlbikgewotCQl6ZnRfY2xvc2Vfdm9sdW1lKHBvcyk7Ci0JCXpmdF9tb3ZlX3Bhc3RfZW9mKHBvcyk7Ci0JCWNvdW50IC0tOwotCX0KLQkvKiBub3cgaXQncyBlYXN5LCBqdXN0IGFwcGVuZCBlb2YtbWFya3MsIHRoYXQgaXMgZW1wdHkKLQkgKiB2b2x1bWVzLCB0byB0aGUgZW5kIG9mIHRoZSBhbHJlYWR5IHJlY29yZGVkIG1lZGlhLgotCSAqLwotCXdoaWxlIChjb3VudCA+IDAgJiYgCi0JICAgICAgIHBvcy0+c2VnX3BvcyA8PSBmdF9sYXN0X2RhdGFfc2VnbWVudCAmJiAKLQkgICAgICAgemZ0X2VvbV92dGJsLT5jb3VudCA8IFpGVF9NQVhfVk9MVU1FUykgewotCQlUUkFDRShmdF90X25vaXNlLAotCQkgICAgICAiV3JpdGluZyB6ZXJvIHNpemVkIGZpbGUgYXQgc2VnbWVudCAlZCIsIHBvcy0+c2VnX3Bvcyk7Ci0JCXpmdF9uZXdfdnRibF9lbnRyeSgpOwotCQl6ZnRfbGFzdF92dGJsLT5zdGFydF9zZWcgICAgICAgPSBwb3MtPnNlZ19wb3M7Ci0JCXpmdF9sYXN0X3Z0YmwtPmVuZF9zZWcgICAgICAgICA9IHBvcy0+c2VnX3BvczsKLQkJemZ0X2xhc3RfdnRibC0+c2l6ZSAgICAgICAgICAgID0gMDsKLQkJemZ0X2xhc3RfdnRibC0+YmxrX3N6ICAgICAgICAgID0gemZ0X2Jsa19zejsKLQkJemZ0X2xhc3RfdnRibC0+emZ0X3ZvbHVtZSAgICAgID0gMTsKLQkJemZ0X2xhc3RfdnRibC0+dXNlX2NvbXByZXNzaW9uID0gMDsKLQkJcG9zLT50YXBlX3BvcyArPSB6ZnRfZ2V0X3NlZ19zeihwb3MtPnNlZ19wb3MpOwotCQl6ZnRfZW9tX3Z0YmwtPnN0YXJ0X3NlZyA9ICsrIHBvcy0+c2VnX3BvczsKLQkJY291bnQgLS07Ci0JfSAKLQlpZiAoY291bnQgPiAwKSB7Ci0JCS8qICB0aGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXM6IGVuZCBvZiB0YXBlLCBvciB0aGUKLQkJICogIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIGlzIGV4aGF1c3RlZC4KLQkJICovCi0JCXpmdF9yZXNpZCA9IGNvdW50OwotCQlUUkFDRShmdF90X25vaXNlLCJOdW1iZXIgb2YgbWFya3MgTk9UIHdyaXR0ZW46ICVkIiwgemZ0X3Jlc2lkKTsKLQkJaWYgKHpmdF9lb21fdnRibC0+Y291bnQgPT0gWkZUX01BWF9WT0xVTUVTKSB7Ci0JCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X3dhcm4sCi0JCQkJICAgICJtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIGZpbGVzICIKLQkJCQkgICAgImV4aGF1c3RlZDogJWQiLCBaRlRfTUFYX1ZPTFVNRVMpOwotCQl9IGVsc2UgewotCQkJVFJBQ0VfQUJPUlQoLUVOT1NQQywKLQkJCQkgICAgZnRfdF9ub2lzZSwgInJlYWNoZWQgZW5kIG9mIHRhcGUiKTsKLQkJfQotCX0KLQlUUkFDRV9FWElUIDA7Ci19Ci0KLWNvbnN0IHpmdF92b2xpbmZvICp6ZnRfZmluZF92b2x1bWUodW5zaWduZWQgaW50IHNlZ19wb3MpCi17Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0JCi0JVFJBQ0UoZnRfdF9hbnksICJjYWxsZWQgd2l0aCBzZWdfcG9zICVkIixzZWdfcG9zKTsKLQlpZiAoIXpmdF9xaWNfbW9kZSkgewotCQlpZiAoc2VnX3BvcyA+IGZ0X2xhc3RfZGF0YV9zZWdtZW50KSB7Ci0JCQlUUkFDRV9FWElUICZlb3RfdnRibDsKLQkJfQotCQl0YXBlX3Z0YmwuYmxrX3N6ID0gIHpmdF9ibGtfc3o7Ci0JCVRSQUNFX0VYSVQgJnRhcGVfdnRibDsKLQl9Ci0JaWYgKHNlZ19wb3MgPCB6ZnRfZmlyc3RfdnRibC0+c3RhcnRfc2VnKSB7Ci0JCVRSQUNFX0VYSVQgKGN1cl92dGJsID0gemZ0X2ZpcnN0X3Z0YmwpOwotCX0KLQl3aGlsZSAoc2VnX3BvcyA+IGN1cl92dGJsLT5lbmRfc2VnKSB7Ci0JCWN1cl92dGJsID0gbGlzdF9lbnRyeShjdXJfdnRibC0+bm9kZS5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSk7Ci0JCVRSQUNFKGZ0X3Rfbm9pc2UsICIlZCAtICVkIiwgY3VyX3Z0YmwtPnN0YXJ0X3NlZywgY3VyX3Z0YmwtPmVuZF9zZWcpOwotCX0KLQl3aGlsZSAoc2VnX3BvcyA8IGN1cl92dGJsLT5zdGFydF9zZWcpIHsKLQkJY3VyX3Z0YmwgPSBsaXN0X2VudHJ5KGN1cl92dGJsLT5ub2RlLnByZXYsIHpmdF92b2xpbmZvLCBub2RlKTsKLQkJVFJBQ0UoZnRfdF9ub2lzZSwgIiVkIC0gJWQiLCBjdXJfdnRibC0+c3RhcnRfc2VnLCBjdXJfdnRibC0+ZW5kX3NlZyk7Ci0JfQotCWlmIChzZWdfcG9zID4gY3VyX3Z0YmwtPmVuZF9zZWcgfHwgc2VnX3BvcyA8IGN1cl92dGJsLT5zdGFydF9zZWcpIHsKLQkJVFJBQ0UoZnRfdF9idWcsICJUaGlzIGNhbm5vdCBoYXBwZW4iKTsKLQl9Ci0JRFVNUF9WT0xJTkZPKGZ0X3Rfbm9pc2UsICIiLCBjdXJfdnRibCk7Ci0JVFJBQ0VfRVhJVCBjdXJfdnRibDsKLX0KLQotLyogdGhpcyBmdW5jdGlvbiByZWFsbHkgYXNzdW1lcyB0aGF0IHdlIGFyZSBqdXN0IGJlZm9yZSBlb2YKLSAqLwotdm9pZCB6ZnRfbW92ZV9wYXN0X2VvZih6ZnRfcG9zaXRpb24gKnBvcykKLXsgCi0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlUUkFDRShmdF90X25vaXNlLCAib2xkIHNlZy4gcG9zOiAlZCIsIHBvcy0+c2VnX3Bvcyk7Ci0JcG9zLT50YXBlX3BvcyArPSB6ZnRfZ2V0X3NlZ19zeihwb3MtPnNlZ19wb3MrKykgLSBwb3MtPnNlZ19ieXRlX3BvczsKLQlwb3MtPnNlZ19ieXRlX3BvcyA9IDA7Ci0JcG9zLT52b2x1bWVfcG9zICAgPSAwOwotCWlmICh6ZnRfY21wcl9vcHMpIHsKLQkJKCp6ZnRfY21wcl9vcHMtPnJlc2V0KSgpOwotCX0KLQl6ZnRfanVzdF9iZWZvcmVfZW9mID0gIDA7Ci0JemZ0X2RlYmxvY2tfc2VnbWVudCA9IC0xOyAvKiBubyBuZWVkIHRvIGNhY2hlIGl0IGFueW1vcmUgKi8KLQlUUkFDRShmdF90X25vaXNlLCAibmV3IHNlZy4gcG9zOiAlZCIsIHBvcy0+c2VnX3Bvcyk7Ci0JVFJBQ0VfRVhJVDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuaCBiL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxZDE5Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS12dGJsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotI2lmbmRlZiBfWkZUQVBFX1ZUQkxfSAotI2RlZmluZSBfWkZUQVBFX1ZUQkxfSAotCi0vKgotICogICAgICBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyAgQ2xhdXMtSnVzdHVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0geW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIAotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlLXZ0YmwuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4zICQKLSAqICREYXRlOiAxOTk3LzEwLzI4IDE0OjMwOjA5ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgdm9sdW1lIHRhYmxlIGFzIGRlZmluZWQgaW4gdGhlIFFJQy04MAotICogICAgICBkZXZlbG9wbWVudCBzdGFuZGFyZHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLQotI2luY2x1ZGUgIi4uL2xvd2xldmVsL2Z0YXBlLXRyYWNpbmcuaCIKLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtZW9mLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS1jdGwuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXJ3LmgiCi0KLSNkZWZpbmUgVlRCTF9TSVpFIDEyOCAvKiBieXRlcyAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBvZmZzZXRzIGluIHRoZSB2dGJsLiAgKi8KLSNkZWZpbmUgVlRCTF9TSUcgICAwCi0jZGVmaW5lIFZUQkxfU1RBUlQgNAotI2RlZmluZSBWVEJMX0VORCAgIDYKLSNkZWZpbmUgVlRCTF9ERVNDICA4Ci0jZGVmaW5lIFZUQkxfREFURSAgNTIKLSNkZWZpbmUgVlRCTF9GTEFHUyA1NgotI2RlZmluZSBWVEJMX0ZMX1ZFTkRPUl9TUEVDSUZJQyAoMTw8MCkKLSNkZWZpbmUgVlRCTF9GTF9NVVRMSV9DQVJUUklER0UgKDE8PDEpCi0jZGVmaW5lIFZUQkxfRkxfTk9UX1ZFUklGSUVEICAgICgxPDwyKQotI2RlZmluZSBWVEJMX0ZMX1JFRElSX0lOSElCSVQgICAoMTw8MykKLSNkZWZpbmUgVlRCTF9GTF9TRUdfU1BBTk5JTkcgICAgKDE8PDQpCi0jZGVmaW5lIFZUQkxfRkxfRElSRUNUT1JZX0xBU1QgICgxPDw1KQotI2RlZmluZSBWVEJMX0ZMX1JFU0VSVkVEXzYgICAgICAoMTw8NikKLSNkZWZpbmUgVlRCTF9GTF9SRVNFUlZFRF83ICAgICAgKDE8PDcpCi0jZGVmaW5lIFZUQkxfTV9OTyAgNTcKLSNkZWZpbmUgVlRCTF9FWFQgICA1OAotI2RlZmluZSBFWFRfWkZUQVBFX1NJRyAgICAgMAotI2RlZmluZSBFWFRfWkZUQVBFX0JMS1NaICAxMAotI2RlZmluZSBFWFRfWkZUQVBFX0NNQVAgICAxMgotI2RlZmluZSBFWFRfWkZUQVBFX1FJQzExMyAxMwotI2RlZmluZSBWVEJMX1BXRCAgIDg0Ci0jZGVmaW5lIFZUQkxfRElSX1NJWkUgOTIKLSNkZWZpbmUgVlRCTF9EQVRBX1NJWkUgOTYKLSNkZWZpbmUgVlRCTF9PU19WRVJTSU9OIDEwNAotI2RlZmluZSBWVEJMX1NSQ19EUklWRSAgMTA2Ci0jZGVmaW5lIFZUQkxfREVWICAgICAgICAxMjIKLSNkZWZpbmUgVlRCTF9SRVNFUlZFRF8xIDEyMwotI2RlZmluZSBWVEJMX0NNUFIgICAgICAgMTI0Ci0jZGVmaW5lIFZUQkxfQ01QUl9VTlJFRyAweDNmCi0jZGVmaW5lIFZUQkxfQ01QUl9VU0VEICAweDgwCi0jZGVmaW5lIFZUQkxfRk1UICAgICAgICAxMjUKLSNkZWZpbmUgVlRCTF9SRVNFUlZFRF8yIDEyNgotI2RlZmluZSBWVEJMX1JFU0VSVkVEXzMgMTI3Ci0vKiBjb21wYXRpYmlsaXR5IHdpdGggcHJlIHJldmlzaW9uIEsgKi8KLSNkZWZpbmUgVlRCTF9LX0NNUFIgICAgIDEyMCAKLQotLyogIHRoZSBuZXh0IGlzIHVzZWQgYnkgUUlDLTMwMjAgdGFwZXMgd2l0aCBmb3JtYXQgY29kZSA2ICg+Ml4xNgotICogIHNlZ21lbnRzKSBJdCBpcyBzcGVjaWZpZWQgaW4gUUlDLTExMywgUmV2LiBHLCBTZWN0aW9uIDUgKFNDU0kKLSAqICB2b2x1bWUgdGFibGUpLiBUaGUgZGlmZmVyZW5jZSBpcyBzaW1wbHksIHRoYXQgd2Ugb25seSBzdG9yZSB0aGUKLSAqICBudW1iZXIgb2Ygc2VnbWVudHMgdXNlZCwgbm90IHRoZSBzdGFydGluZyBzZWdtZW50LgotICovCi0jZGVmaW5lIFZUQkxfU0NTSV9TRUdTICA0IC8qIGlzIGEgNCBieXRlIHZhbHVlICovCi0KLS8qICBvbmUgdnRibCBpcyAxMjggYnl0ZXMsIHRoYXQgcmVzdWx0cyBpbiBhIG1heGltdW0gbnVtYmVyIG9mCi0gKiAgMjkqMTAyNC8xMjggPSAyMzIgdm9sdW1lcy4KLSAqLwotI2RlZmluZSBaRlRfTUFYX1ZPTFVNRVMgKEZUX1NFR01FTlRfU0laRS9WVEJMX1NJWkUpCi0jZGVmaW5lIFZUQkxfSUQgICJWVEJMIgotI2RlZmluZSBWVEJMX0lEUyB7IFZUQkxfSUQsICJYVEJMIiwgIlVUSUQiLCAiRVhWVCIgfSAvKiBvdGhlciB2YWxpZCBpZHMgKi8KLSNkZWZpbmUgWkZUX1ZPTF9OQU1FICJ6ZnRhcGUgdm9sdW1lIiAvKiB2b2x1bWUgbGFiZWwgdXNlZCBieSBtZSAqLwotI2RlZmluZSBaRlRBUEVfU0lHICJMSU5VWCBaRlQiCi0KLS8qICBnbG9iYWwgdmFyaWFibGVzCi0gKi8KLXR5cGVkZWYgc3RydWN0IHpmdF9pbnRlcm5hbF92dGJsCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOwotCWludCAgICAgICAgICBjb3VudDsKLQl1bnNpZ25lZCBpbnQgc3RhcnRfc2VnOyAgICAgICAgIC8qIDMyIGJpdHMgYXJlIGVub3VnaCBmb3Igbm93ICovCi0JdW5zaWduZWQgaW50IGVuZF9zZWc7ICAgICAgICAgICAvKiAzMiBiaXRzIGFyZSBlbm91Z2ggZm9yIG5vdyAqLwotCV9fczY0ICAgICAgICBzaXplOyAgICAgICAgICAgICAgLyogdW5jb21wcmVzc2VkIHNpemUgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IGJsa19zejsgICAgICAgICAgICAvKiBibG9jayBzaXplIGZvciB0aGlzIHZvbHVtZSAqLwotCXVuc2lnbmVkIGludCB6ZnRfdm9sdW1lICAgICA6MTsgLyogemZ0YXBlIGNyZWF0ZWQgdGhpcyB2b2x1bWUgKi8KLQl1bnNpZ25lZCBpbnQgdXNlX2NvbXByZXNzaW9uOjE7IC8qIGNvbXByZXNzZWQgdm9sdW1lICAqLwotCXVuc2lnbmVkIGludCBxaWMxMTMgICAgICAgICA6MTsgLyogbGF5b3V0IG9mIGNvbXByZXNzZWQgYmxvY2sKLQkJCQkJICogaW5mbyBhbmQgdnRibCBjb25mb3JtcyB0bwotCQkJCQkgKiBRSUMtMTEzLCBSZXYuIEcgCi0JCQkJCSAqLwotCXVuc2lnbmVkIGludCBuZXdfdm9sdW1lICAgICA6MTsgLyogaXQgd2FzIGNyZWF0ZWQgYnkgdXMsIHRoaXMKLQkJCQkJICogcnVuLiAgdGhpcyBhbGxvd3MgdGhlCi0JCQkJCSAqIGZpZWxkcyB0aGF0IGFyZW4ndCByZWFsbHkKLQkJCQkJICogdXNlZCBieSB6ZnRhcGUgdG8gYmUgZmlsbGVkCi0JCQkJCSAqIGluIGJ5IHNvbWUgdXNlciBsZXZlbAotCQkJCQkgKiBwcm9ncmFtLgotCQkJCQkgKi8KLQl1bnNpZ25lZCBpbnQgb3BlbiAgICAgICAgICAgOjE7IC8qIGp1c3QgaW4gcHJvZ3Jlc3Mgb2YgYmVpbmcgCi0JCQkJCSAqIHdyaXR0ZW4KLQkJCQkJICovCi19IHpmdF92b2xpbmZvOwotCi1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCB6ZnRfdnRibDsKLSNkZWZpbmUgemZ0X2hlYWRfdnRibCAgbGlzdF9lbnRyeSh6ZnRfdnRibC5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSkKLSNkZWZpbmUgemZ0X2VvbV92dGJsICAgbGlzdF9lbnRyeSh6ZnRfdnRibC5wcmV2LCB6ZnRfdm9saW5mbywgbm9kZSkKLSNkZWZpbmUgemZ0X2xhc3RfdnRibCAgbGlzdF9lbnRyeSh6ZnRfZW9tX3Z0YmwtPm5vZGUucHJldiwgemZ0X3ZvbGluZm8sIG5vZGUpCi0jZGVmaW5lIHpmdF9maXJzdF92dGJsIGxpc3RfZW50cnkoemZ0X2hlYWRfdnRibC0+bm9kZS5uZXh0LCB6ZnRfdm9saW5mbywgbm9kZSkKLSNkZWZpbmUgemZ0X3Z0YmxfZW1wdHkgKHpmdF9lb21fdnRibC0+bm9kZS5wcmV2ID09ICZ6ZnRfaGVhZF92dGJsLT5ub2RlKQotCi0jZGVmaW5lIERVTVBfVk9MSU5GTyhsZXZlbCwgZGVzYywgaW5mbykJCQkJCVwKLXsJCQkJCQkJCQlcCi0JY2hhciB0bXBbMjFdOwkJCQkJCQlcCi0Jc3RybGNweSh0bXAsIGRlc2MsIHNpemVvZih0bXApKTsJCQkJXAotCVRSQUNFKGxldmVsLCAiVm9sdW1lICVkOlxuIgkJCQkJXAotCSAgICAgIEtFUk5fSU5GTyAiZGVzY3JpcHRpb24gIDogJXNcbiIJCQkJXAotCSAgICAgIEtFUk5fSU5GTyAiZmlyc3Qgc2VnbWVudDogJWRcbiIJCQkJXAotCSAgICAgIEtFUk5fSU5GTyAibGFzdCAgc2VnbWVudDogJWRcbiIJCQkJXAotCSAgICAgIEtFUk5fSU5GTyAic2l6ZSAgICAgICAgIDogIiBMTF9YICJcbiIJCQlcCi0JICAgICAgS0VSTl9JTkZPICJibG9jayBzaXplICAgOiAlZFxuIgkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJjb21wcmVzc2lvbiAgOiAlZFxuIgkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJ6ZnRhcGUgdm9sdW1lOiAlZFxuIgkJCQlcCi0JICAgICAgS0VSTl9JTkZPICJRSUMtMTEzIGNvbmYuOiAlZCIsCQkJCVwKLQkgICAgICAoaW5mbyktPmNvdW50LCB0bXAsIChpbmZvKS0+c3RhcnRfc2VnLCAoaW5mbyktPmVuZF9zZWcsCVwKLQkgICAgICBMTCgoaW5mbyktPnNpemUpLCAoaW5mbyktPmJsa19zeiwJCQkJXAotCSAgICAgIChpbmZvKS0+dXNlX2NvbXByZXNzaW9uICE9IDAsIChpbmZvKS0+emZ0X3ZvbHVtZSAhPSAwLAlcCi0JICAgICAgKGluZm8pLT5xaWMxMTMgIT0gMCk7CQkJCQlcCi19Ci0KLWV4dGVybiBpbnQgemZ0X3FpY19tb2RlOwotZXh0ZXJuIGludCB6ZnRfb2xkX2Z0YXBlOwotZXh0ZXJuIGludCB6ZnRfdm9sdW1lX3RhYmxlX2NoYW5nZWQ7Ci0KLS8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgIHpmdF9pbml0X3Z0YmwgICAgICAgICAgICAgKHZvaWQpOwotZXh0ZXJuIHZvaWQgIHpmdF9mcmVlX3Z0YmwgICAgICAgICAgICAgKHZvaWQpOwotZXh0ZXJuIGludCAgIHpmdF9leHRyYWN0X3ZvbHVtZV9oZWFkZXJzKF9fdTggKmJ1ZmZlcik7Ci1leHRlcm4gaW50ICAgemZ0X3VwZGF0ZV92b2x1bWVfdGFibGUgICAodW5zaWduZWQgaW50IHNlZ21lbnQpOwotZXh0ZXJuIGludCAgIHpmdF9vcGVuX3ZvbHVtZSAgICAgICAgICAgKHpmdF9wb3NpdGlvbiAqcG9zLAotCQkJCQlpbnQgYmxrX3N6LCBpbnQgdXNlX2NvbXByZXNzaW9uKTsKLWV4dGVybiBpbnQgICB6ZnRfY2xvc2Vfdm9sdW1lICAgICAgICAgICh6ZnRfcG9zaXRpb24gKnBvcyk7Ci1leHRlcm4gY29uc3QgemZ0X3ZvbGluZm8gKnpmdF9maW5kX3ZvbHVtZSh1bnNpZ25lZCBpbnQgc2VnX3Bvcyk7Ci1leHRlcm4gaW50ICAgemZ0X3NraXBfdm9sdW1lcyAgICAgICAgICAoaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcyk7Ci1leHRlcm4gX19zNjQgemZ0X2dldF9lb21fcG9zICAgICAgICAgICAodm9pZCk7Ci1leHRlcm4gdm9pZCAgemZ0X3NraXBfdG9fZW9tICAgICAgICAgICAoemZ0X3Bvc2l0aW9uICpwb3MpOwotZXh0ZXJuIGludCAgIHpmdF9mYWtlX3ZvbHVtZV9oZWFkZXJzICAgKGVvZl9tYXJrX3VuaW9uICplb2ZfbWFwLCAKLQkJCQkJaW50IG51bV9mYWlsZWRfc2VjdG9ycyk7Ci1leHRlcm4gaW50ICAgemZ0X3dlb2YgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50IGNvdW50LCB6ZnRfcG9zaXRpb24gKnBvcyk7Ci1leHRlcm4gdm9pZCAgemZ0X21vdmVfcGFzdF9lb2YgICAgICAgICAoemZ0X3Bvc2l0aW9uICpwb3MpOwotCi1zdGF0aWMgaW5saW5lIGludCAgIHpmdF90YXBlX2F0X2VvZCAgICAgICAgIChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyk7Ci1zdGF0aWMgaW5saW5lIGludCAgIHpmdF90YXBlX2F0X2xib3QgICAgICAgIChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcyk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgIHpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mICh6ZnRfcG9zaXRpb24gKnBvcywgCi0JCQkJCSAgICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSk7Ci1zdGF0aWMgaW5saW5lIF9fczY0IHpmdF9jaGVja19mb3JfZW9mKGNvbnN0IHpmdF92b2xpbmZvICp2dGJsLAotCQkJCSAgICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zKTsKLQotLyogdGhpcyBmdW5jdGlvbiBkZWNyZW1lbnRzIHRoZSB6ZnRfc2VnX3BvcyBjb3VudGVyIGlmIHdlIGFyZSByaWdodAotICogYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlZ21lbnQuIFRoaXMgaXMgdG8gaGFuZGxlIGZzZm0vYnNmbSAtLSB3ZQotICogbmVlZCB0byBwb3NpdGlvbiBiZWZvcmUgdGhlIGVvZiBtYXJrLiAgTk9URTogemZ0X3RhcGVfcG9zIGlzIG5vdAotICogY2hhbmdlZCAKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHpmdF9wb3NpdGlvbl9iZWZvcmVfZW9mKHpmdF9wb3NpdGlvbiAqcG9zLCAKLQkJCQkJICAgY29uc3QgemZ0X3ZvbGluZm8gKnZvbHVtZSkKLXsgCi0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQlpZiAocG9zLT5zZWdfcG9zID09IHZvbHVtZS0+ZW5kX3NlZyArIDEgJiYgIHBvcy0+c2VnX2J5dGVfcG9zID09IDApIHsKLQkJcG9zLT5zZWdfcG9zIC0tOwotCQlwb3MtPnNlZ19ieXRlX3BvcyA9IHpmdF9nZXRfc2VnX3N6KHBvcy0+c2VnX3Bvcyk7Ci0JfQotCVRSQUNFX0VYSVQ7Ci19Ci0KLS8qICBNbW1oLiBJcyB0aGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCB2b2x1bWUsIHRoYXQgaXMgcmlnaHQKLSAqICBiZWZvcmUgdGhlIGxhc3QgRU9GIG1hcmsgYWxzbyBsb2dpY2FsIGFuIEVPRCBjb25kaXRpb24/Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHpmdF90YXBlX2F0X2VvZChjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKLXsgCi0JVFJBQ0VfRlVOKGZ0X3RfYW55KTsKLQotCWlmICh6ZnRfcWljX21vZGUpIHsKLQkJVFJBQ0VfRVhJVCAocG9zLT5zZWdfcG9zID49IHpmdF9lb21fdnRibC0+c3RhcnRfc2VnIHx8Ci0JCQkgICAgemZ0X2xhc3RfdnRibC0+b3Blbik7Ci0JfSBlbHNlIHsKLQkJVFJBQ0VfRVhJVCBwb3MtPnNlZ19wb3MgPiBmdF9sYXN0X2RhdGFfc2VnbWVudDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHpmdF90YXBlX2F0X2xib3QoY29uc3QgemZ0X3Bvc2l0aW9uICpwb3MpCi17Ci0JaWYgKHpmdF9xaWNfbW9kZSkgewotCQlyZXR1cm4gKHBvcy0+c2VnX3BvcyA8PSB6ZnRfZmlyc3RfdnRibC0+c3RhcnRfc2VnICYmCi0JCQlwb3MtPnZvbHVtZV9wb3MgPT0gMCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIChwb3MtPnNlZ19wb3MgPD0gZnRfZmlyc3RfZGF0YV9zZWdtZW50ICYmIAotCQkJcG9zLT52b2x1bWVfcG9zID09IDApOwotCX0KLX0KLQotLyogVGhpcyBvbmUgY2hlY2tzIGZvciBFT0YuICByZXR1cm4gcmVtYWluZyBzcGFjZSAobWF5IGJlIG5lZ2F0aXZlKSAKLSAqLwotc3RhdGljIGlubGluZSBfX3M2NCB6ZnRfY2hlY2tfZm9yX2VvZihjb25zdCB6ZnRfdm9saW5mbyAqdnRibCwKLQkJCQkgICAgICBjb25zdCB6ZnRfcG9zaXRpb24gKnBvcykKLXsgICAgIAotCXJldHVybiAoX19zNjQpKHZ0YmwtPnNpemUgLSBwb3MtPnZvbHVtZV9wb3MpOwotfQotCi0jZW5kaWYgLyogX1pGVEFQRV9WVEJMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDMyN2I4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IENsYXVzIEhlaW5lCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2Z0YXBlL3pmdGFwZS96ZnRhcGUtd3JpdGUuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4zICQKLSAqICREYXRlOiAxOTk3LzExLzA2IDAwOjUwOjI5ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgd3JpdGluZyBjb2RlCi0gKiAgICAgIGZvciB0aGUgUUlDLTExNyBmbG9wcHktdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWluaXQuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLWVvZi5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCi0jaW5jbHVkZSAiLi4vemZ0YXBlL3pmdGFwZS13cml0ZS5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcncuaCIKLSNpbmNsdWRlICIuLi96ZnRhcGUvemZ0YXBlLXZ0YmwuaCIKLQotLyogICAgICBHbG9iYWwgdmFycy4KLSAqLwotCi0vKiAgICAgIExvY2FsIHZhcnMuCi0gKi8KLXN0YXRpYyBpbnQgbGFzdF93cml0ZV9mYWlsZWQ7Ci1zdGF0aWMgaW50IG5lZWRfZmx1c2g7Ci0KLXZvaWQgemZ0X3ByZXZlbnRfZmx1c2godm9pZCkKLXsKLQluZWVkX2ZsdXNoID0gMDsKLX0KLQotc3RhdGljIGludCB6ZnRfd3JpdGVfaGVhZGVyX3NlZ21lbnRzKF9fdTgqIGJ1ZmZlcikKLXsKLQlpbnQgaGVhZGVyXzFfb2sgPSAwOwotCWludCBoZWFkZXJfMl9vayA9IDA7Ci0JdW5zaWduZWQgaW50IHRpbWVfc3RhbXA7Ci0JVFJBQ0VfRlVOKGZ0X3Rfbm9pc2UpOwotCQotCVRSQUNFX0NBVENIKGZ0YXBlX2Fib3J0X29wZXJhdGlvbigpLCk7Ci0JZnRhcGVfc2Vla190b19ib3QoKTsgICAgLyogcHJldmVudHMgZXh0cmEgcmV3aW5kICovCi0JaWYgKEdFVDQoYnVmZmVyLCAwKSAhPSBGVF9IU0VHX01BR0lDKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLAotCQkJICAgICJ3cm9uZyBoZWFkZXIgc2lnbmF0dXJlIGZvdW5kLCBhYm9ydGluZyIpOwotCX0gCi0JLyogICBCZSBvcHRpbWlzdGljOiAqLwotCVBVVDQoYnVmZmVyLCBGVF9TRUdfQ05ULAotCSAgICAgemZ0X3dyaXR0ZW5fc2VnbWVudHMgKyBHRVQ0KGJ1ZmZlciwgRlRfU0VHX0NOVCkgKyAyKTsKLQlpZiAoKHRpbWVfc3RhbXAgPSB6ZnRfZ2V0X3RpbWUoKSkgIT0gMCkgewotCQlQVVQ0KGJ1ZmZlciwgRlRfV1JfREFURSwgdGltZV9zdGFtcCk7Ci0JCWlmICh6ZnRfbGFiZWxfY2hhbmdlZCkgewotCQkJUFVUNChidWZmZXIsIEZUX0xBQkVMX0RBVEUsIHRpbWVfc3RhbXApOwotCQl9Ci0JfQotCVRSQUNFKGZ0X3Rfbm9pc2UsCi0JICAgICAgIndyaXRpbmcgZmlyc3QgaGVhZGVyIHNlZ21lbnQgJWQiLCBmdF9oZWFkZXJfc2VnbWVudF8xKTsKLQloZWFkZXJfMV9vayA9IHpmdF92ZXJpZnlfd3JpdGVfc2VnbWVudHMoZnRfaGVhZGVyX3NlZ21lbnRfMSwgCi0JCQkJCQlidWZmZXIsIEZUX1NFR01FTlRfU0laRSwKLQkJCQkJCXpmdF9kZWJsb2NrX2J1ZikgPj0gMDsKLQlUUkFDRShmdF90X25vaXNlLAotCSAgICAgICJ3cml0aW5nIHNlY29uZCBoZWFkZXIgc2VnbWVudCAlZCIsIGZ0X2hlYWRlcl9zZWdtZW50XzIpOwotCWhlYWRlcl8yX29rID0gemZ0X3ZlcmlmeV93cml0ZV9zZWdtZW50cyhmdF9oZWFkZXJfc2VnbWVudF8yLCAKLQkJCQkJCWJ1ZmZlciwgRlRfU0VHTUVOVF9TSVpFLAotCQkJCQkJemZ0X2RlYmxvY2tfYnVmKSA+PSAwOwotCWlmICghaGVhZGVyXzFfb2spIHsKLQkJVFJBQ0UoZnRfdF93YXJuLCAiV2FybmluZzogIgotCQkgICAgICAidXBkYXRlIG9mIGZpcnN0IGhlYWRlciBzZWdtZW50IGZhaWxlZCIpOwotCX0KLQlpZiAoIWhlYWRlcl8yX29rKSB7Ci0JCVRSQUNFKGZ0X3Rfd2FybiwgIldhcm5pbmc6ICIKLQkJICAgICAgInVwZGF0ZSBvZiBzZWNvbmQgaGVhZGVyIHNlZ21lbnQgZmFpbGVkIik7Ci0JfQotCWlmICghaGVhZGVyXzFfb2sgJiYgIWhlYWRlcl8yX29rKSB7Ci0JCVRSQUNFX0FCT1JUKC1FSU8sIGZ0X3RfZXJyLCAiRXJyb3I6ICIKLQkJICAgICAgInVwZGF0ZSBvZiBib3RoIGhlYWRlciBzZWdtZW50cyBmYWlsZWQuIik7Ci0JfQotCVRSQUNFX0VYSVQgMDsKLX0KLQotaW50IHpmdF91cGRhdGVfaGVhZGVyX3NlZ21lbnRzKHZvaWQpCi17Ci0JVFJBQ0VfRlVOKGZ0X3Rfbm9pc2UpOwotCQotCS8qICBtdXN0IE5PVCB1c2UgemZ0X3dyaXRlX3Byb3RlY3RlZCwgYXMgaXQgYWxzbyBpbmNsdWRlcyB0aGUKLQkgKiAgZmlsZSBhY2Nlc3MgbW9kZS4gQnV0IHdlIGFsc28gd2FudCB0byB1cGRhdGUgd2hlbiBzb2Z0Ci0JICogIHdyaXRlIHByb3RlY3Rpb24gaXMgZW5hYmxlZCAoT19SRE9OTFkpCi0JICovCi0JaWYgKGZ0X3dyaXRlX3Byb3RlY3RlZCB8fCB6ZnRfb2xkX2Z0YXBlKSB7Ci0JCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsICJUYXBlIHNldCByZWFkLW9ubHk6IG5vIHVwZGF0ZSIpOwotCX0gCi0JaWYgKCF6ZnRfaGVhZGVyX3JlYWQpIHsKLQkJVFJBQ0VfQUJPUlQoMCwgZnRfdF9ub2lzZSwgIk5vdGhpbmcgdG8gdXBkYXRlIik7Ci0JfQotCWlmICghemZ0X2hlYWRlcl9jaGFuZ2VkKSB7Ci0JCXpmdF9oZWFkZXJfY2hhbmdlZCA9IHpmdF93cml0dGVuX3NlZ21lbnRzID4gMDsKLQl9Ci0JaWYgKCF6ZnRfaGVhZGVyX2NoYW5nZWQgJiYgIXpmdF92b2x1bWVfdGFibGVfY2hhbmdlZCkgewotCQlUUkFDRV9BQk9SVCgwLCBmdF90X25vaXNlLCAiTm90aGluZyB0byB1cGRhdGUiKTsKLQl9Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgIlVwZGF0aW5nIGhlYWRlciBzZWdtZW50cyIpOwotCWlmIChmdGFwZV9nZXRfc3RhdHVzKCktPmZ0aV9zdGF0ZSA9PSB3cml0aW5nKSB7Ci0JCVRSQUNFX0NBVENIKGZ0YXBlX2xvb3BfdW50aWxfd3JpdGVzX2RvbmUoKSwpOwotCX0KLQlUUkFDRV9DQVRDSChmdGFwZV9hYm9ydF9vcGVyYXRpb24oKSwpOwotCQotCXpmdF9kZWJsb2NrX3NlZ21lbnQgPSAtMTsgLyogaW52YWxpZGF0ZSB0aGUgY2FjaGUgKi8KLQlpZiAoemZ0X2hlYWRlcl9jaGFuZ2VkKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF93cml0ZV9oZWFkZXJfc2VnbWVudHMoemZ0X2hzZWdfYnVmKSwpOwotCX0KLQlpZiAoemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkKSB7Ci0JCVRSQUNFX0NBVENIKHpmdF91cGRhdGVfdm9sdW1lX3RhYmxlKGZ0X2ZpcnN0X2RhdGFfc2VnbWVudCksKTsKLQl9Ci0JemZ0X2hlYWRlcl9jaGFuZ2VkID0KLQkJemZ0X3ZvbHVtZV90YWJsZV9jaGFuZ2VkID0gCi0JCXpmdF9sYWJlbF9jaGFuZ2VkICAgICAgICA9Ci0JCXpmdF93cml0dGVuX3NlZ21lbnRzICAgICA9IDA7Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCksKTsKLQlmdGFwZV9zZWVrX3RvX2JvdCgpOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCByZWFkX21lcmdlX2J1ZmZlcihpbnQgc2VnX3BvcywgX191OCAqYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2VnX3N6KQotewotCWludCByZXN1bHQgPSAwOwotCWNvbnN0IGZ0X3RyYWNlX3Qgb2xkX3RyYWNpbmcgPSBUUkFDRV9MRVZFTDsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQkKLQlpZiAoemZ0X3FpY19tb2RlKSB7Ci0JCS8qICB3cml0aW5nIGluIHRoZSBtaWRkbGUgb2YgYSB2b2x1bWUgaXMgTk9UIGFsbG93ZWQKLQkJICoKLQkJICovCi0JCVRSQUNFKGZ0X3Rfbm9pc2UsICJObyBuZWVkIHRvIHJlYWQgYSBzZWdtZW50Iik7Ci0JCW1lbXNldChidWZmZXIgKyBvZmZzZXQsIDAsIHNlZ19zeiAtIG9mZnNldCk7Ci0JCVRSQUNFX0VYSVQgMDsKLQl9Ci0JVFJBQ0UoZnRfdF9hbnksICJ3YWl0aW5nIik7Ci0JZnRhcGVfc3RhcnRfd3JpdGluZyhGVF9XUl9NVUxUSSk7Ci0JVFJBQ0VfQ0FUQ0goZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpLCk7Ci0JCi0JVFJBQ0UoZnRfdF9ub2lzZSwgInRyeWluZyB0byByZWFkIHNlZ21lbnQgJWQgZnJvbSBvZmZzZXQgJWQiLAotCSAgICAgIHNlZ19wb3MsIG9mZnNldCk7Ci0JU0VUX1RSQUNFX0xFVkVMKGZ0X3RfYnVnKTsKLQlyZXN1bHQgPSB6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbihzZWdfcG9zLCBidWZmZXIsIAotCQkJCQkgICAgRlRfUkRfU0lOR0xFLAotCQkJCQkgICAgb2Zmc2V0LCBzZWdfc3ogLSBvZmZzZXQpOwotCVNFVF9UUkFDRV9MRVZFTChvbGRfdHJhY2luZyk7Ci0JaWYgKHJlc3VsdCAhPSAoc2VnX3N6IC0gb2Zmc2V0KSkgewotCQlUUkFDRShmdF90X25vaXNlLCAiSWdub3JlIGVycm9yOiByZWFkX3NlZ21lbnQoKSByZXN1bHQ6ICVkIiwKLQkJICAgICAgcmVzdWx0KTsKLQkJbWVtc2V0KGJ1ZmZlciArIG9mZnNldCwgMCwgc2VnX3N6IC0gb2Zmc2V0KTsKLQl9Ci0JVFJBQ0VfRVhJVCAwOwotfQotCi0vKiBmbHVzaCB0aGUgd3JpdGUgYnVmZmVyIHRvIHRhcGUgYW5kIHdyaXRlIGFuIGVvZi1tYXJrZXIgYXQgdGhlCi0gKiBjdXJyZW50IHBvc2l0aW9uIGlmIG5vdCBpbiByYXcgbW9kZS4gIFRoaXMgZnVuY3Rpb24gYWx3YXlzCi0gKiBwb3NpdGlvbnMgdGhlIHRhcGUgYmVmb3JlIHRoZSBlb2YtbWFya2VyLiAgX2Z0YXBlX2Nsb3NlKCkgc2hvdWxkCi0gKiB0aGVuIGFkdmFuY2UgdG8gdGhlIG5leHQgc2VnbWVudC4KLSAqCi0gKiB0aGUgcGFyYW1ldGVyICJmaW5pc2hfdm9sdW1lIiBkZXNjcmliZXMgd2hldGhlciB0byBwb3NpdGlvbiBiZWZvcmUKLSAqIG9yIGFmdGVyIHRoZSBwb3NzaWJseSBjcmVhdGVkIGZpbGUtbWFyay4gV2UgYWx3YXlzIHBvc2l0aW9uIGFmdGVyCi0gKiB0aGUgZmlsZS1tYXJrIHdoZW4gY2FsbGVkIGZyb20gZnRhcGVfY2xvc2UoKSBhbmQgYSBmbHVzaCB3YXMgbmVlZGVkCi0gKiAodGhhdCBpcyBmdGFwZV93cml0ZSgpIHdhcyB0aGUgbGFzdCB0YXBlIG9wZXJhdGlvbiBiZWZvcmUgY2FsbGluZwotICogZnRhcGVfZmx1c2gpIEJ1dCB3ZSBhbHdheXMgcG9zaXRpb24gYmVmb3JlIHRoZSBmaWxlLW1hcmsgd2hlbiB0aGlzCi0gKiBmdW5jdGlvbiBnZXQncyBjYWxsZWQgZnJvbSBvdXRzaWRlIGZ0YXBlX2Nsb3NlKCkgCi0gKi8KLWludCB6ZnRfZmx1c2hfYnVmZmVycyh2b2lkKQotewotCWludCByZXN1bHQ7Ci0JaW50IGRhdGFfcmVtYWluaW5nOwotCWludCB0aGlzX3NlZ3Nfc2l6ZTsKLQlUUkFDRV9GVU4oZnRfdF9mbG93KTsKLQotCVRSQUNFKGZ0X3RfZGF0YV9mbG93LAotCSAgICAgICJlbnRlcmVkLCBmdGFwZV9zdGF0ZSA9ICVkIiwgZnRhcGVfZ2V0X3N0YXR1cygpLT5mdGlfc3RhdGUpOwotCWlmIChmdGFwZV9nZXRfc3RhdHVzKCktPmZ0aV9zdGF0ZSAhPSB3cml0aW5nICYmICFuZWVkX2ZsdXNoKSB7Ci0JCVRSQUNFX0FCT1JUKDAsIGZ0X3Rfbm9pc2UsICJubyBuZWVkIGZvciBmbHVzaCIpOwotCX0KLQl6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsgLyogIHRyaWdnZXJzIHNvbWUgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUKLQkJCQkgICogIHJlYWQgYW5kIHdyaXRlIHJvdXRpbmVzIAotCQkJCSAgKi8KLQlpZiAobGFzdF93cml0ZV9mYWlsZWQpIHsKLQkJZnRhcGVfYWJvcnRfb3BlcmF0aW9uKCk7Ci0JCVRSQUNFX0VYSVQgLUVJTzsKLQl9Ci0JVFJBQ0UoZnRfdF9ub2lzZSwgImZsdXNoaW5nIHdyaXRlIGJ1ZmZlcnMiKTsKLQl0aGlzX3NlZ3Nfc2l6ZSA9IHpmdF9nZXRfc2VnX3N6KHpmdF9wb3Muc2VnX3Bvcyk7Ci0JaWYgKHRoaXNfc2Vnc19zaXplID09IHpmdF9wb3Muc2VnX2J5dGVfcG9zKSB7Ci0JCXpmdF9wb3Muc2VnX3BvcyArKzsKLQkJZGF0YV9yZW1haW5pbmcgPSB6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9IDA7Ci0JfSBlbHNlIHsKLQkJZGF0YV9yZW1haW5pbmcgPSB6ZnRfcG9zLnNlZ19ieXRlX3BvczsKLQl9Ci0JLyogSWYgdGhlcmUgaXMgYW55IGRhdGEgbm90IHdyaXR0ZW4gdG8gdGFwZSB5ZXQsIGFwcGVuZCB6ZXJvJ3MKLQkgKiB1cCB0byB0aGUgZW5kIG9mIHRoZSBzZWN0b3IgKGlmIHVzaW5nIGNvbXByZXNzaW9uKSBvciBtZXJnZQotCSAqIGl0IHdpdGggdGhlIGRhdGEgZXhpc3Rpbmcgb24gdGhlIHRhcGUgVGhlbiB3cml0ZSB0aGUKLQkgKiBzZWdtZW50KHMpIHRvIHRhcGUuCi0JICovCi0JVFJBQ0UoZnRfdF9ub2lzZSwgIlBvc2l0aW9uOlxuIgotCSAgICAgIEtFUk5fSU5GTyAic2VnX3BvcyAgOiAlZFxuIgotCSAgICAgIEtFUk5fSU5GTyAiYnl0ZSBwb3MgOiAlZFxuIgotCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nOiAlZCIsCi0JICAgICAgemZ0X3Bvcy5zZWdfcG9zLCB6ZnRfcG9zLnNlZ19ieXRlX3BvcywgZGF0YV9yZW1haW5pbmcpOwotCWlmIChkYXRhX3JlbWFpbmluZyA+IDApIHsKLQkJZG8gewotCQkJdGhpc19zZWdzX3NpemUgPSB6ZnRfZ2V0X3NlZ19zeih6ZnRfcG9zLnNlZ19wb3MpOwotCQkJaWYgKHRoaXNfc2Vnc19zaXplID4gZGF0YV9yZW1haW5pbmcpIHsKLQkJCQlUUkFDRV9DQVRDSChyZWFkX21lcmdlX2J1ZmZlcih6ZnRfcG9zLnNlZ19wb3MsCi0JCQkJCQkJICAgICAgemZ0X2RlYmxvY2tfYnVmLAotCQkJCQkJCSAgICAgIGRhdGFfcmVtYWluaW5nLAotCQkJCQkJCSAgICAgIHRoaXNfc2Vnc19zaXplKSwKLQkJCQkJICAgIGxhc3Rfd3JpdGVfZmFpbGVkID0gMSk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBmdGFwZV93cml0ZV9zZWdtZW50KHpmdF9wb3Muc2VnX3BvcywgCi0JCQkJCQkgICAgIHpmdF9kZWJsb2NrX2J1ZiwKLQkJCQkJCSAgICAgRlRfV1JfTVVMVEkpOwotCQkJaWYgKHJlc3VsdCAhPSB0aGlzX3NlZ3Nfc2l6ZSkgewotCQkJCVRSQUNFKGZ0X3RfZXJyLCAiZmx1c2ggYnVmZmVycyBmYWlsZWQiKTsKLQkJCQl6ZnRfcG9zLnRhcGVfcG9zICAgIC09IHpmdF9wb3Muc2VnX2J5dGVfcG9zOwotCQkJCXpmdF9wb3Muc2VnX2J5dGVfcG9zID0gMDsKLQotCQkJCWxhc3Rfd3JpdGVfZmFpbGVkID0gMTsKLQkJCQlUUkFDRV9FWElUIHJlc3VsdDsKLQkJCX0KLQkJCXpmdF93cml0dGVuX3NlZ21lbnRzICsrOwotCQkJVFJBQ0UoZnRfdF9kYXRhX2Zsb3csCi0JCQkgICAgICAiZmx1c2gsIG1vdmVkIG91dCBidWZmZXI6ICVkIiwgcmVzdWx0KTsKLQkJCS8qIG5lZWQgbmV4dCBzZWdtZW50IGZvciBtb3JlIGRhdGEgKGVtcHR5IHNlZ21lbnRzPykKLQkJCSAqLwotCQkJaWYgKHJlc3VsdCA8IGRhdGFfcmVtYWluaW5nKSB7IAotCQkJCWlmIChyZXN1bHQgPiAwKSB7ICAgICAgIAotCQkJCQkvKiBtb3ZlIHJlbWFpbmRlciB0byBidWZmZXIgYmVnaW5uaW5nIAotCQkJCQkgKi8KLQkJCQkJbWVtbW92ZSh6ZnRfZGVibG9ja19idWYsIAotCQkJCQkJemZ0X2RlYmxvY2tfYnVmICsgcmVzdWx0LAotCQkJCQkJRlRfU0VHTUVOVF9TSVpFIC0gcmVzdWx0KTsKLQkJCQl9Ci0JCQl9IAotCQkJZGF0YV9yZW1haW5pbmcgLT0gcmVzdWx0OwotCQkJemZ0X3Bvcy5zZWdfcG9zICsrOwotCQl9IHdoaWxlIChkYXRhX3JlbWFpbmluZyA+IDApOwotCQlUUkFDRShmdF90X2FueSwgInJlc3VsdDogJWQiLCByZXN1bHQpOwotCQl6ZnRfZGVibG9ja19zZWdtZW50ID0gLS16ZnRfcG9zLnNlZ19wb3M7Ci0JCWlmIChkYXRhX3JlbWFpbmluZyA9PSAwKSB7ICAvKiBmaXJzdCBieXRlIG5leHQgc2VnbWVudCAqLwotCQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSB0aGlzX3NlZ3Nfc2l6ZTsKLQkJfSBlbHNlIHsgLyogYWZ0ZXIgZGF0YSBwcmV2aW91cyBzZWdtZW50LCBkYXRhX3JlbWFpbmluZyA8IDAgKi8KLQkJCXpmdF9wb3Muc2VnX2J5dGVfcG9zID0gZGF0YV9yZW1haW5pbmcgKyByZXN1bHQ7Ci0JCX0KLQl9IGVsc2UgewotCQlUUkFDRShmdF90X25vaXNlLCAiemZ0X2RlYmxvY2tfYnVmIGVtcHR5Iik7Ci0JCXpmdF9wb3Muc2VnX3BvcyAtLTsKLQkJemZ0X3Bvcy5zZWdfYnl0ZV9wb3MgPSB6ZnRfZ2V0X3NlZ19zeiAoemZ0X3Bvcy5zZWdfcG9zKTsKLQkJZnRhcGVfc3RhcnRfd3JpdGluZyhGVF9XUl9NVUxUSSk7Ci0JfQotCVRSQUNFKGZ0X3RfYW55LCAid2FpdGluZyIpOwotCWlmICgocmVzdWx0ID0gZnRhcGVfbG9vcF91bnRpbF93cml0ZXNfZG9uZSgpKSA8IDApIHsKLQkJLyogdGhhdCdzIHJlYWxseSBiYWQuIFdoYXQgdG8gdG8gd2l0aCB6ZnRfdGFwZV9wb3M/IAotCQkgKi8KLQkJVFJBQ0UoZnRfdF9lcnIsICJmbHVzaCBidWZmZXJzIGZhaWxlZCIpOwotCX0KLQlUUkFDRShmdF90X2FueSwgInpmdF9zZWdfcG9zOiAlZCwgemZ0X3NlZ19ieXRlX3BvczogJWQiLAotCSAgICAgIHpmdF9wb3Muc2VnX3BvcywgemZ0X3Bvcy5zZWdfYnl0ZV9wb3MpOwotCWxhc3Rfd3JpdGVfZmFpbGVkICA9Ci0JCW5lZWRfZmx1c2ggPSAwOwotCVRSQUNFX0VYSVQgcmVzdWx0OwotfQotCi0vKiByZXR1cm4tdmFsdWU6IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtb3ZlZCBmcm9tIHRoZSB1c2VyLWJ1ZmZlcgotICoKLSAqIG91dDogCi0gKiAgICAgIGludCAqd3JpdGVfY250OiBob3cgbXVjaCBhY3R1YWxseSBoYXMgYmVlbiBtb3ZlZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIHpmdF9kZWJsb2NrX2J1ZgotICogICAgICBpbnQgcmVxX2xlbiAgOiBNVVNUIE5PVCBCRSBDSEFOR0VELCBleGNlcHQgYXQgRU9ULCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGNhc2UgaXQgbWF5IGJlIGFkanVzdGVkCi0gKiBpbiA6IAotICogICAgICBjaGFyICpidWZmICAgICAgICA6IHRoZSB1c2VyIGJ1ZmZlcgotICogICAgICBpbnQgYnVmX3Bvc193cml0ZSA6IGNvcHkgb2YgYnVmX2xlbl93ciBpbnQKLSAqICAgICAgdGhpc19zZWdzX3NpemUgICAgOiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYWN0dWFsIHNlZ21lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyCi0gKiAgICAgICp6ZnRfZGVibG9ja19idWYgICA6IHpmdF9kZWJsb2NrX2J1ZgotICovCi1zdGF0aWMgaW50IHpmdF9zaW1wbGVfd3JpdGUoaW50ICpjbnQsCi0JCQkgICAgX191OCAqZHN0X2J1ZiwgY29uc3QgaW50IHNlZ19zeiwKLQkJCSAgICBjb25zdCBfX3U4IF9fdXNlciAqc3JjX2J1ZiwgY29uc3QgaW50IHJlcV9sZW4sIAotCQkJICAgIGNvbnN0IHpmdF9wb3NpdGlvbiAqcG9zLGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUpCi17Ci0JaW50IHNwYWNlX2xlZnQ7Ci0JVFJBQ0VfRlVOKGZ0X3RfZmxvdyk7Ci0KLQkvKiB2b2x1bWUtPnNpemUgaG9sZHMgdGhlIHRhcGUgY2FwYWNpdHkgd2hpbGUgdm9sdW1lIGlzIG9wZW4gKi8KLQlpZiAocG9zLT50YXBlX3BvcyArIHZvbHVtZS0+YmxrX3N6ID4gdm9sdW1lLT5zaXplKSB7Ci0JCVRSQUNFX0VYSVQgLUVOT1NQQzsKLQl9Ci0JLyogIHJlbWFpbmluZyBzcGFjZSBpbiB0aGlzIHNlZ21lbnQsIE5PVCB6ZnRfZGVibG9ja19idWYKLQkgKi8KLQlzcGFjZV9sZWZ0ID0gc2VnX3N6IC0gcG9zLT5zZWdfYnl0ZV9wb3M7Ci0JKmNudCA9IHJlcV9sZW4gPCBzcGFjZV9sZWZ0ID8gcmVxX2xlbiA6IHNwYWNlX2xlZnQ7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGRzdF9idWYgKyBwb3MtPnNlZ19ieXRlX3Bvcywgc3JjX2J1ZiwgKmNudCkgIT0gMCkgewotCQlUUkFDRV9FWElUIC1FRkFVTFQ7Ci0JfQotCVRSQUNFX0VYSVQgKmNudDsKLX0KLQotc3RhdGljIGludCBjaGVja193cml0ZV9hY2Nlc3MoaW50IHJlcV9sZW4sCi0JCQkgICAgICBjb25zdCB6ZnRfdm9saW5mbyAqKnZvbHVtZSwKLQkJCSAgICAgIHpmdF9wb3NpdGlvbiAqcG9zLAotCQkJICAgICAgY29uc3QgdW5zaWduZWQgaW50IGJsa19zeikKLXsKLQlpbnQgcmVzdWx0OwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKChyZXFfbGVuICUgemZ0X2Jsa19zeikgIT0gMCkgewotCQlUUkFDRV9BQk9SVCgtRUlOVkFMLCBmdF90X2luZm8sCi0JCQkgICAgIndyaXRlLWNvdW50ICVkIG11c3QgYmUgbXVsdGlwbGUgb2YgYmxvY2stc2l6ZSAlZCIsCi0JCQkgICAgcmVxX2xlbiwgYmxrX3N6KTsKLQl9Ci0JaWYgKHpmdF9pb19zdGF0ZSA9PSB6ZnRfd3JpdGluZykgewotCQkvKiAgYWxsIG90aGVyIGVycm9yIGNvbmRpdGlvbnMgaGF2ZSBiZWVuIGNoZWNrZWQgZWFybGllcgotCQkgKi8KLQkJVFJBQ0VfRVhJVCAwOwotCX0KLQl6ZnRfaW9fc3RhdGUgPSB6ZnRfaWRsZTsKLQlUUkFDRV9DQVRDSCh6ZnRfY2hlY2tfd3JpdGVfYWNjZXNzKHBvcyksKTsKLQkvKiAgSWYgd2UgaGF2ZW4ndCByZWFkIHRoZSBoZWFkZXIgc2VnbWVudCB5ZXQsIGRvIGl0IG5vdy4KLQkgKiAgVGhpcyB3aWxsIHZlcmlmeSB0aGUgY29uZmlndXJhdGlvbiwgZ2V0IHRoZSBiYWQgc2VjdG9yCi0JICogIHRhYmxlIGFuZCByZWFkIHRoZSB2b2x1bWUgdGFibGUgc2VnbWVudCAKLQkgKi8KLQlpZiAoIXpmdF9oZWFkZXJfcmVhZCkgewotCQlUUkFDRV9DQVRDSCh6ZnRfcmVhZF9oZWFkZXJfc2VnbWVudHMoKSwpOwotCX0KLQkvKiAgZmluZS4gTm93IHRoZSB0YXBlIGlzIGVpdGhlciBhdCBCT1Qgb3IgYXQgRU9ELAotCSAqICBXcml0ZSBzdGFydCBvZiB2b2x1bWUgbm93Ci0JICovCi0JVFJBQ0VfQ0FUQ0goemZ0X29wZW5fdm9sdW1lKHBvcywgYmxrX3N6LCB6ZnRfdXNlX2NvbXByZXNzaW9uKSwpOwotCSp2b2x1bWUgPSB6ZnRfZmluZF92b2x1bWUocG9zLT5zZWdfcG9zKTsKLQlEVU1QX1ZPTElORk8oZnRfdF9ub2lzZSwgIiIsICp2b2x1bWUpOwotCXpmdF9qdXN0X2JlZm9yZV9lb2YgPSAwOwotCS8qIG5vdyBtZXJnZSB3aXRoIG9sZCBkYXRhIGlmIG5lY2Vzc2FyeSAqLwotCWlmICghemZ0X3FpY19tb2RlICYmIHBvcy0+c2VnX2J5dGVfcG9zICE9IDApewotCQlyZXN1bHQgPSB6ZnRfZmV0Y2hfc2VnbWVudChwb3MtPnNlZ19wb3MsCi0JCQkJCSAgIHpmdF9kZWJsb2NrX2J1ZiwKLQkJCQkJICAgRlRfUkRfU0lOR0xFKTsKLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCWlmIChyZXN1bHQgPT0gLUVJTlRSIHx8IHJlc3VsdCA9PSAtRU5PU1BDKSB7Ci0JCQkJVFJBQ0VfRVhJVCByZXN1bHQ7Ci0JCQl9Ci0JCQlUUkFDRShmdF90X25vaXNlLCAKLQkJCSAgICAgICJmdGFwZV9yZWFkX3NlZ21lbnQoKSByZXN1bHQ6ICVkLiAiCi0JCQkgICAgICAiVGhpcyBtaWdodCBiZSBub3JtYWwgd2hlbiB1c2luZyAiCi0JCQkgICAgICAiYSBuZXdseVxuZm9ybWF0dGVkIHRhcGUiLCByZXN1bHQpOwotCQkJbWVtc2V0KHpmdF9kZWJsb2NrX2J1ZiwgJ1wwJywgcG9zLT5zZWdfYnl0ZV9wb3MpOwotCQl9Ci0JfQotCXpmdF9pb19zdGF0ZSA9IHpmdF93cml0aW5nOwotCVRSQUNFX0VYSVQgMDsKLX0KLQotc3RhdGljIGludCBmaWxsX2RlYmxvY2tfYnVmKF9fdTggKmRzdF9idWYsIGNvbnN0IGludCBzZWdfc3osCi0JCQkgICAgemZ0X3Bvc2l0aW9uICpwb3MsIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUsCi0JCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzcl9idWYsIGNvbnN0IGludCByZXFfbGVuKQotewotCWludCBjbnQgPSAwOwotCWludCByZXN1bHQgPSAwOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCi0JaWYgKHNlZ19zeiA9PSAwKSB7Ci0JCVRSQUNFX0FCT1JUKDAsIGZ0X3RfZGF0YV9mbG93LCAiZW1wdHkgc2VnbWVudCIpOwotCX0KLQlUUkFDRShmdF90X2RhdGFfZmxvdywgIlxuIgotCSAgICAgIEtFUk5fSU5GTyAicmVtYWluaW5nIHJlcV9sZW46ICVkXG4iCi0JICAgICAgS0VSTl9JTkZPICIgICAgICAgICAgYnVmX3BvczogJWQiLCAKLQkgICAgICByZXFfbGVuLCBwb3MtPnNlZ19ieXRlX3Bvcyk7Ci0JLyogemZ0X2RlYmxvY2tfYnVmIHdpbGwgbm90IGNvbnRhaW4gYSB2YWxpZCBzZWdtZW50IGFueSBsb25nZXIgKi8KLQl6ZnRfZGVibG9ja19zZWdtZW50ID0gLTE7Ci0JaWYgKHpmdF91c2VfY29tcHJlc3Npb24pIHsKLQkJVFJBQ0VfQ0FUQ0goemZ0X2NtcHJfbG9jaygxIC8qIHRyeSB0byBsb2FkICovKSwpOwotCQlUUkFDRV9DQVRDSChyZXN1bHQ9ICgqemZ0X2NtcHJfb3BzLT53cml0ZSkoJmNudCwKLQkJCQkJCQkgICBkc3RfYnVmLCBzZWdfc3osCi0JCQkJCQkJICAgdXNyX2J1ZiwgcmVxX2xlbiwKLQkJCQkJCQkgICBwb3MsIHZvbHVtZSksKTsKLQl9IGVsc2UgewotCQlUUkFDRV9DQVRDSChyZXN1bHQ9IHpmdF9zaW1wbGVfd3JpdGUoJmNudCwKLQkJCQkJCSAgICAgZHN0X2J1Ziwgc2VnX3N6LAotCQkJCQkJICAgICB1c3JfYnVmLCByZXFfbGVuLAotCQkJCQkJICAgICBwb3MsIHZvbHVtZSksKTsKLQl9Ci0JcG9zLT52b2x1bWVfcG9zICAgKz0gcmVzdWx0OwotCXBvcy0+c2VnX2J5dGVfcG9zICs9IGNudDsKLQlwb3MtPnRhcGVfcG9zICAgICArPSBjbnQ7Ci0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJcbiIKLQkgICAgICBLRVJOX0lORk8gInJlbW92ZWQgZnJvbSB1c2VyLWJ1ZmZlciA6ICVkIGJ5dGVzLlxuIgotCSAgICAgIEtFUk5fSU5GTyAiY29waWVkIHRvIHpmdF9kZWJsb2NrX2J1ZjogJWQgYnl0ZXMuXG4iCi0JICAgICAgS0VSTl9JTkZPICJ6ZnRfdGFwZV9wb3MgICAgICAgICAgICAgOiAiIExMX1ggIiBieXRlcy4iLAotCSAgICAgIHJlc3VsdCwgY250LCBMTChwb3MtPnRhcGVfcG9zKSk7Ci0JVFJBQ0VfRVhJVCByZXN1bHQ7Ci19Ci0KLQotLyogIGNhbGxlZCBieSB0aGUga2VybmVsLWludGVyZmFjZSByb3V0aW5lICJ6ZnRfd3JpdGUoKSIKLSAqLwotaW50IF96ZnRfd3JpdGUoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmYsIGludCByZXFfbGVuKQotewotCWludCByZXN1bHQgPSAwOwotCWludCB3cml0dGVuID0gMDsKLQlpbnQgd3JpdGVfY250OwotCWludCBzZWdfc3o7Ci0Jc3RhdGljIGNvbnN0IHpmdF92b2xpbmZvICp2b2x1bWUgPSBOVUxMOwotCVRSQUNFX0ZVTihmdF90X2Zsb3cpOwotCQotCXpmdF9yZXNpZCAgICAgICAgID0gcmVxX2xlbjsJCi0JbGFzdF93cml0ZV9mYWlsZWQgPSAxOyAvKiByZXNldCB0byAwIHdoZW4gc3VjY2Vzc2Z1bCAqLwotCS8qIGNoZWNrIGlmIHdyaXRlIGlzIGFsbG93ZWQgCi0JICovCi0JVFJBQ0VfQ0FUQ0goY2hlY2tfd3JpdGVfYWNjZXNzKHJlcV9sZW4sICZ2b2x1bWUsJnpmdF9wb3MsemZ0X2Jsa19zeiksKTsKLQl3aGlsZSAocmVxX2xlbiA+IDApIHsKLQkJLyogQWxsb3cgdXMgdG8gZXNjYXBlIGZyb20gdGhpcyBsb29wIHdpdGggYSBzaWduYWwgIQotCQkgKi8KLQkJRlRfU0lHTkFMX0VYSVQoX0RPTlRfQkxPQ0spOwotCQlzZWdfc3ogPSB6ZnRfZ2V0X3NlZ19zeih6ZnRfcG9zLnNlZ19wb3MpOwotCQlpZiAoKHdyaXRlX2NudCA9IGZpbGxfZGVibG9ja19idWYoemZ0X2RlYmxvY2tfYnVmLAotCQkJCQkJICBzZWdfc3osCi0JCQkJCQkgICZ6ZnRfcG9zLAotCQkJCQkJICB2b2x1bWUsCi0JCQkJCQkgIGJ1ZmYsCi0JCQkJCQkgIHJlcV9sZW4pKSA8IDApIHsKLQkJCXpmdF9yZXNpZCAtPSB3cml0dGVuOwotCQkJaWYgKHdyaXRlX2NudCA9PSAtRU5PU1BDKSB7Ci0JCQkJLyogbGVhdmUgdGhlIHJlbWFpbmRlciB0byBmbHVzaF9idWZmZXJzKCkKLQkJCQkgKi8KLQkJCQlUUkFDRShmdF90X2luZm8sICJObyBzcGFjZSBsZWZ0IG9uIGRldmljZSIpOwotCQkJCWxhc3Rfd3JpdGVfZmFpbGVkID0gMDsKLQkJCQlpZiAoIW5lZWRfZmx1c2gpIHsKLQkJCQkJbmVlZF9mbHVzaCA9IHdyaXR0ZW4gPiAwOwotCQkJCX0KLQkJCQlUUkFDRV9FWElUIHdyaXR0ZW4gPiAwID8gd3JpdHRlbiA6IC1FTk9TUEM7Ci0JCQl9IGVsc2UgewotCQkJCVRSQUNFX0VYSVQgcmVzdWx0OwotCQkJfQotCQl9Ci0JCWlmICh6ZnRfcG9zLnNlZ19ieXRlX3BvcyA9PSBzZWdfc3opIHsKLQkJCVRSQUNFX0NBVENIKGZ0YXBlX3dyaXRlX3NlZ21lbnQoemZ0X3Bvcy5zZWdfcG9zLCAKLQkJCQkJCQl6ZnRfZGVibG9ja19idWYsCi0JCQkJCQkJRlRfV1JfQVNZTkMpLAotCQkJCSAgICB6ZnRfcmVzaWQgLT0gd3JpdHRlbik7Ci0JCQl6ZnRfd3JpdHRlbl9zZWdtZW50cyArKzsKLQkJCXpmdF9wb3Muc2VnX2J5dGVfcG9zID0gIDA7Ci0JCQl6ZnRfZGVibG9ja19zZWdtZW50ICA9IHpmdF9wb3Muc2VnX3BvczsKLQkJCSsremZ0X3Bvcy5zZWdfcG9zOwotCQl9Ci0JCXdyaXR0ZW4gKz0gd3JpdGVfY250OwotCQlidWZmICAgICs9IHdyaXRlX2NudDsKLQkJcmVxX2xlbiAtPSB3cml0ZV9jbnQ7Ci0JfSAvKiB3aGlsZSAocmVxX2xlbiA+IDApICovCi0JVFJBQ0UoZnRfdF9kYXRhX2Zsb3csICJyZW1haW5pbmcgaW4gYmxvY2tpbmcgYnVmZmVyOiAlZCIsCi0JICAgICAgIHpmdF9wb3Muc2VnX2J5dGVfcG9zKTsKLQlUUkFDRShmdF90X2RhdGFfZmxvdywgImp1c3Qgd3JpdHRlbiBieXRlczogJWQiLCB3cml0dGVuKTsKLQlsYXN0X3dyaXRlX2ZhaWxlZCA9IDA7Ci0JemZ0X3Jlc2lkIC09IHdyaXR0ZW47Ci0JbmVlZF9mbHVzaCA9IG5lZWRfZmx1c2ggfHwgd3JpdHRlbiA+IDA7Ci0JVFJBQ0VfRVhJVCB3cml0dGVuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHdyaXR0ZW4gKi8KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmggYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTg4NzAxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9mdGFwZS96ZnRhcGUvemZ0YXBlLXdyaXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jaWZuZGVmIF9aRlRBUEVfV1JJVEVfSAotI2RlZmluZSBfWkZUQVBFX1dSSVRFX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUKLQotIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gYW55IGxhdGVyIHZlcnNpb24uCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0KLSAqCi0gKiAkU291cmNlOiAvaG9tZXMvY3ZzL2Z0YXBlLXN0YWNrZWQvZnRhcGUvemZ0YXBlL3pmdGFwZS13cml0ZS5oLHYgJAotICogJFJldmlzaW9uOiAxLjIgJAotICogJERhdGU6IDE5OTcvMTAvMDUgMTk6MTk6MTMgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHdyaXRlIGZ1bmN0aW9ucwotICogICAgICBmb3IgdGhlIHpmdGFwZSBkcml2ZXIgZm9yIExpbnV4LgotICoKLSAqLwotCi1leHRlcm4gaW50ICB6ZnRfZmx1c2hfYnVmZmVycyh2b2lkKTsKLWV4dGVybiBpbnQgIHpmdF91cGRhdGVfaGVhZGVyX3NlZ21lbnRzKHZvaWQpOwotZXh0ZXJuIHZvaWQgemZ0X3ByZXZlbnRfZmx1c2godm9pZCk7Ci0KLS8qICBob29rIGZvciB0aGUgVkZTIGludGVyZmFjZSAKLSAqLwotZXh0ZXJuIGludCBfemZ0X3dyaXRlKGNvbnN0IGNoYXIgX191c2VyICpidWZmLCBpbnQgcmVxX2xlbik7Ci0jZW5kaWYgLyogX1pGVEFQRV9XUklURV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZV9zeW1zLmMgYi9kcml2ZXJzL2NoYXIvZnRhcGUvemZ0YXBlL3pmdGFwZV9zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYjE0MDEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL3pmdGFwZS96ZnRhcGVfc3ltcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IENsYXVzLUp1c3R1cyBIZWluZQotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9mdGFwZS96ZnRhcGUvemZ0YXBlX3N5bXMuYyx2ICQKLSAqICRSZXZpc2lvbjogMS4zICQKLSAqICREYXRlOiAxOTk3LzEwLzA1IDE5OjE5OjE0ICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3ltYm9scyB0aGF0IHRoZSB6ZnRhcGUgZnJvbnRlbmQgdG8gCi0gKiAgICAgIHRoZSBmdGFwZSBmbG9wcHkgdGFwZSBkcml2ZXIgZXhwb3J0cyAKLSAqLwkJIAotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC96ZnRhcGUuaD4KLQotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtaW5pdC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtcmVhZC5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtYnVmZmVycy5oIgotI2luY2x1ZGUgIi4uL3pmdGFwZS96ZnRhcGUtY3RsLmgiCi0KLS8qIHpmdGFwZS1pbml0LmMgKi8KLUVYUE9SVF9TWU1CT0woemZ0X2NtcHJfcmVnaXN0ZXIpOwotLyogemZ0YXBlLXJlYWQuYyAqLwotRVhQT1JUX1NZTUJPTCh6ZnRfZmV0Y2hfc2VnbWVudF9mcmFjdGlvbik7Ci0vKiB6ZnRhcGUtYnVmZmVycy5jICovCi1FWFBPUlRfU1lNQk9MKHpmdF92bWFsbG9jX29uY2UpOwotRVhQT1JUX1NZTUJPTCh6ZnRfdm1hbGxvY19hbHdheXMpOwotRVhQT1JUX1NZTUJPTCh6ZnRfdmZyZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwppbmRleCA4NzEyN2U0Li5lNzY5ODExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvZ2VuZXJpY19zZXJpYWwuYwpAQCAtNzE4LDExICs3MTgsMTEgQEAKIAogCiB2b2lkIGdzX3NldF90ZXJtaW9zIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgCi0gICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt0ZXJtaW9zICogb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IGdzX3BvcnQgKnBvcnQ7CiAJaW50IGJhdWRyYXRlLCB0bXAsIHJ2OwotCXN0cnVjdCB0ZXJtaW9zICp0aW9zcDsKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRpb3NwOwogCiAJZnVuY19lbnRlcigpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZ2VucnRjLmMgYi9kcml2ZXJzL2NoYXIvZ2VucnRjLmMKaW5kZXggODE3ZGM0MC4uMjNiMjVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jCisrKyBiL2RyaXZlcnMvY2hhci9nZW5ydGMuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAgKiBSb3V0aW5lIHRvIHBvbGwgUlRDIHNlY29uZHMgZmllbGQgZm9yIGNoYW5nZSBhcyBvZnRlbiBhcyBwb3NzaWJsZSwKICAqIGFmdGVyIGZpcnN0IFJUQ19VSUUgdXNlIHRpbWVyIHRvIHJlZHVjZSBwb2xsaW5nCiAgKi8KLXN0YXRpYyB2b2lkIGdlbnJ0Y190cm91dGluZSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZ2VucnRjX3Ryb3V0aW5lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBpbnQgdG1wID0gZ2V0X3J0Y19zcygpOwogCQpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCWlycV9hY3RpdmUgPSAxOwogCQlzdG9wX3J0Y190aW1lcnMgPSAwOwogCQlsb3N0aW50ID0gMDsKLQkJSU5JVF9XT1JLKCZnZW5ydGNfdGFzaywgZ2VucnRjX3Ryb3V0aW5lLCBOVUxMKTsKKwkJSU5JVF9XT1JLKCZnZW5ydGNfdGFzaywgZ2VucnRjX3Ryb3V0aW5lKTsKIAkJb2xkc2VjcyA9IGdldF9ydGNfc3MoKTsKIAkJaW5pdF90aW1lcigmdGltZXJfdGFzayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ocGV0LmMgYi9kcml2ZXJzL2NoYXIvaHBldC5jCmluZGV4IDA5MWExMWMuLjIwZGMzYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ocGV0LmMKKysrIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwppbmRleCA5OTAyZmZhLi5jYzJjZDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNzLmMgYi9kcml2ZXJzL2NoYXIvaHZjcy5jCmluZGV4IDg3MjgyNTUuLjIwN2Y3MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNzLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y3MuYwpAQCAtMTkyLDExICsxOTIsMTMgQEAKICAqIHRoYXQgd2lsbCBjYXVzZSBlY2hvaW5nIG9yIHdlJ2xsIGdvIGludG8gcmVjdXJzaXZlIGxvb3AgZWNob2luZyBjaGFycyBiYWNrCiAgKiBhbmQgZm9ydGggd2l0aCB0aGUgY29uc29sZSBkcml2ZXJzLgogICovCi1zdGF0aWMgc3RydWN0IHRlcm1pb3MgaHZjc190dHlfdGVybWlvcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qga3Rlcm1pb3MgaHZjc190dHlfdGVybWlvcyA9IHsKIAkuY19pZmxhZyA9IElHTkJSSyB8IElHTlBBUiwKIAkuY19vZmxhZyA9IE9QT1NULAogCS5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCwKLQkuY19jYyA9IElOSVRfQ19DQworCS5jX2NjID0gSU5JVF9DX0NDLAorCS5jX2lzcGVlZCA9IDM4NDAwLAorCS5jX29zcGVlZCA9IDM4NDAwCiB9OwogCiAvKgpAQCAtMzM3LDExICszMzksNiBAQAogc3RhdGljIHZvaWQgaHZjc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBzdGF0aWMgdm9pZCBodmNzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CiAKLXN0YXRpYyB2b2lkIGh2Y3NfY3JlYXRlX2RldmljZV9hdHRycyhzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkKTsKLXN0YXRpYyB2b2lkIGh2Y3NfcmVtb3ZlX2RldmljZV9hdHRycyhzdHJ1Y3QgdmlvX2RldiAqdmRldik7Ci1zdGF0aWMgdm9pZCBodmNzX2NyZWF0ZV9kcml2ZXJfYXR0cnModm9pZCk7Ci1zdGF0aWMgdm9pZCBodmNzX3JlbW92ZV9kcml2ZXJfYXR0cnModm9pZCk7Ci0KIHN0YXRpYyBpbnQgX19kZXZpbml0IGh2Y3NfcHJvYmUoc3RydWN0IHZpb19kZXYgKmRldiwKIAkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKTsKIHN0YXRpYyBpbnQgX19kZXZleGl0IGh2Y3NfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICpkZXYpOwpAQCAtMzUzLDYgKzM1MCwxNzIgQEAKICNkZWZpbmUgSFZDU19UUllfV1JJVEUJMHgwMDAwMDAwNAogI2RlZmluZSBIVkNTX1JFQURfTUFTSwkoSFZDU19TQ0hFRF9SRUFEIHwgSFZDU19RVUlDS19SRUFEKQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBodmNzX3N0cnVjdCAqZnJvbV92aW9fZGV2KHN0cnVjdCB2aW9fZGV2ICp2aW9kKQoreworCXJldHVybiB2aW9kLT5kZXYuZHJpdmVyX2RhdGE7Cit9CisvKiBUaGUgc3lzZnMgaW50ZXJmYWNlIGZvciB0aGUgZHJpdmVyIGFuZCBkZXZpY2VzICovCisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfcGFydG5lcl92dHlzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlWFxuIiwgaHZjc2QtPnBfdW5pdF9hZGRyZXNzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocGFydG5lcl92dHlzLCBTX0lSVUdPLCBodmNzX3BhcnRuZXJfdnR5c19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgaHZjc19wYXJ0bmVyX2NsY3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR2YWwgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAmaHZjc2QtPnBfbG9jYXRpb25fY29kZVswXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorc3RhdGljIERFVklDRV9BVFRSKHBhcnRuZXJfY2xjcywgU19JUlVHTywgaHZjc19wYXJ0bmVyX2NsY3Nfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfY3VycmVudF92dHlfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqIGJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCS8qCisJICogRG9uJ3QgbmVlZCB0aGlzIGZlYXR1cmUgYXQgdGhlIHByZXNlbnQgdGltZSBiZWNhdXNlIGZpcm13YXJlIGRvZXNuJ3QKKwkgKiB5ZXQgc3VwcG9ydCBtdWx0aXBsZSBwYXJ0bmVycy4KKwkgKi8KKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiBEZW5pZWQgY3VycmVudF92dHkgY2hhbmdlOiAtRVBFUk0uXG4iKTsKKwlyZXR1cm4gLUVQRVJNOworfQorCitzdGF0aWMgc3NpemVfdCBodmNzX2N1cnJlbnRfdnR5X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlc1xuIiwgJmh2Y3NkLT5wX2xvY2F0aW9uX2NvZGVbMF0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGN1cnJlbnRfdnR5LAorCVNfSVJVR08gfCBTX0lXVVNSLCBodmNzX2N1cnJlbnRfdnR5X3Nob3csIGh2Y3NfY3VycmVudF92dHlfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBodmNzX3Z0ZXJtX3N0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHdyaXRpbmcgYSAnMCcgdG8gdGhpcyBzeXNmcyBlbnRyeSB3aWxsIHJlc3VsdCBpbiB0aGUgZGlzY29ubmVjdC4gKi8KKwlpZiAoc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDApICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaHZjc2QtPm9wZW5fY291bnQgPiAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0ZXJtIHN0YXRlIHVuY2hhbmdlZC4gICIKKwkJCQkiVGhlIGh2Y3MgZGV2aWNlIG5vZGUgaXMgc3RpbGwgaW4gdXNlLlxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKGh2Y3NkLT5jb25uZWN0ZWQgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9JTkZPICJIVkNTOiB2dGVybSBzdGF0ZSB1bmNoYW5nZWQuIFRoZSIKKwkJCQkiIHZ0eS1zZXJ2ZXIgaXMgbm90IGNvbm5lY3RlZCB0byBhIHZ0eS5cbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWh2Y3NfcGFydG5lcl9mcmVlKGh2Y3NkKTsKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiBDbG9zZWQgdnR5LXNlcnZlckAlWCBhbmQiCisJCQkiIHBhcnRuZXIgdnR5QCVYOiVkIGNvbm5lY3Rpb24uXG4iLAorCQkJaHZjc2QtPnZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCWh2Y3NkLT5wX3VuaXRfYWRkcmVzcywKKwkJCSh1aW50MzJfdClodmNzZC0+cF9wYXJ0aXRpb25fSUQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfdnRlcm1fc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7CisJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKKwlyZXR2YWwgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBodmNzZC0+Y29ubmVjdGVkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIodnRlcm1fc3RhdGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlodmNzX3Z0ZXJtX3N0YXRlX3Nob3csIGh2Y3NfdnRlcm1fc3RhdGVfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBodmNzX2luZGV4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QgPSBmcm9tX3Zpb19kZXYodmlvZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gc3ByaW50ZihidWYsICIlZFxuIiwgaHZjc2QtPmluZGV4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpbmRleCwgU19JUlVHTywgaHZjc19pbmRleF9zaG93LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmh2Y3NfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGFydG5lcl92dHlzLmF0dHIsCisJJmRldl9hdHRyX3BhcnRuZXJfY2xjcy5hdHRyLAorCSZkZXZfYXR0cl9jdXJyZW50X3Z0eS5hdHRyLAorCSZkZXZfYXR0cl92dGVybV9zdGF0ZS5hdHRyLAorCSZkZXZfYXR0cl9pbmRleC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBodmNzX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gaHZjc19hdHRycywKK307CisKK3N0YXRpYyBzc2l6ZV90IGh2Y3NfcmVzY2FuX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY2hhciAqYnVmKQoreworCS8qIEEgMSBtZWFucyBpdCBpcyB1cGRhdGluZywgYSAwIG1lYW5zIGl0IGlzIGRvbmUgdXBkYXRpbmcgKi8KKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaHZjc19yZXNjYW5fc3RhdHVzKTsKK30KKworc3RhdGljIHNzaXplX3QgaHZjc19yZXNjYW5fc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRkcCwgY29uc3QgY2hhciAqIGJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCWlmICgoc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDApICE9IDEpCisJCSYmIChodmNzX3Jlc2Nhbl9zdGF0dXMgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaHZjc19yZXNjYW5fc3RhdHVzID0gMTsKKwlwcmludGsoS0VSTl9JTkZPICJIVkNTOiByZXNjYW5uaW5nIHBhcnRuZXIgaW5mbyBmb3IgYWxsIgorCQkiIHZ0eS1zZXJ2ZXJzLlxuIik7CisJaHZjc19yZXNjYW5fZGV2aWNlc19saXN0KCk7CisJaHZjc19yZXNjYW5fc3RhdHVzID0gMDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUihyZXNjYW4sCisJU19JUlVHTyB8IFNfSVdVU1IsIGh2Y3NfcmVzY2FuX3Nob3csIGh2Y3NfcmVzY2FuX3N0b3JlKTsKKwogc3RhdGljIHZvaWQgaHZjc19raWNrKHZvaWQpCiB7CiAJaHZjc19raWNrZWQgPSAxOwpAQCAtNTc1LDcgKzczOCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKIAlzcGluX3VubG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOwogCi0JaHZjc19yZW1vdmVfZGV2aWNlX2F0dHJzKHZkZXYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmdmRldi0+ZGV2LmtvYmosICZodmNzX2F0dHJfZ3JvdXApOwogCiAJa2ZyZWUoaHZjc2QpOwogfQpAQCAtNjA4LDYgKzc3MSw3IEBACiB7CiAJc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZDsKIAlpbnQgaW5kZXg7CisJaW50IHJldHZhbDsKIAogCWlmICghZGV2IHx8ICFpZCkgewogCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IHByb2JlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVyLlxuIik7CkBAIC02NTgsMTQgKzgyMiwxNiBAQAogCSAqIHRoZSBodmNzX3N0cnVjdCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZGV2aWNlcyBsaXN0IHRoZW4gdGhlIHVzZXIgYXBwCiAJICogd2lsbCBnZXQgLUVOT0RFVi4KIAkgKi8KLQogCXNwaW5fbG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOwotCiAJbGlzdF9hZGRfdGFpbCgmKGh2Y3NkLT5uZXh0KSwgJmh2Y3Nfc3RydWN0cyk7Ci0KIAlzcGluX3VubG9jaygmaHZjc19zdHJ1Y3RzX2xvY2spOwogCi0JaHZjc19jcmVhdGVfZGV2aWNlX2F0dHJzKGh2Y3NkKTsKKwlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+ZGV2LmtvYmosICZodmNzX2F0dHJfZ3JvdXApOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiBDYW4ndCBjcmVhdGUgc3lzZnMgYXR0cnMgZm9yIHZ0eS1zZXJ2ZXJAJVhcbiIsCisJCSAgICAgICBodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJIVkNTOiB2dHktc2VydmVyQCVYIGFkZGVkIHRvIHRoZSB2aW8gYnVzLlxuIiwgZGV2LT51bml0X2FkZHJlc3MpOwogCkBAIC0xMzU0LDggKzE1MjAsMTAgQEAKIAlpZiAoIWh2Y3NfdHR5X2RyaXZlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoaHZjc19hbGxvY19pbmRleF9saXN0KG51bV90dHlzX3RvX2FsbG9jKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGh2Y3NfYWxsb2NfaW5kZXhfbGlzdChudW1fdHR5c190b19hbGxvYykpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGluZGV4X2ZhaWw7CisJfQogCiAJaHZjc190dHlfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOwogCkBAIC0xMzg1LDQxICsxNTUzLDU3IEBACiAJICogZHluYW1pY2FsbHkgYXNzaWduZWQgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgZm9yIG91ciBkZXZpY2VzLgogCSAqLwogCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJIVkNTOiByZWdpc3RyYXRpb24gIgotCQkJIiBhcyBhIHR0eSBkcml2ZXIgZmFpbGVkLlxuIik7Ci0JCWh2Y3NfZnJlZV9pbmRleF9saXN0KCk7Ci0JCXB1dF90dHlfZHJpdmVyKGh2Y3NfdHR5X2RyaXZlcik7Ci0JCXJldHVybiAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgIkhWQ1M6IHJlZ2lzdHJhdGlvbiBhcyBhIHR0eSBkcml2ZXIgZmFpbGVkLlxuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byByZWdpc3Rlcl9mYWlsOwogCX0KIAogCWh2Y3NfcGlfYnVmZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWh2Y3NfcGlfYnVmZikgewotCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoaHZjc190dHlfZHJpdmVyKTsKLQkJaHZjc19mcmVlX2luZGV4X2xpc3QoKTsKLQkJcHV0X3R0eV9kcml2ZXIoaHZjc190dHlfZHJpdmVyKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBidWZmX2FsbG9jX2ZhaWw7CiAJfQogCiAJaHZjc190YXNrID0ga3RocmVhZF9ydW4oa2h2Y3NkLCBOVUxMLCAia2h2Y3NkIik7CiAJaWYgKElTX0VSUihodmNzX3Rhc2spKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiSFZDUzoga2h2Y3NkIGNyZWF0aW9uIGZhaWxlZC4gIERyaXZlciBub3QgbG9hZGVkLlxuIik7Ci0JCWtmcmVlKGh2Y3NfcGlfYnVmZik7Ci0JCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOwotCQlodmNzX2ZyZWVfaW5kZXhfbGlzdCgpOwotCQlwdXRfdHR5X2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGt0aHJlYWRfZmFpbDsKIAl9CiAKIAlyYyA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJmh2Y3NfdmlvX2RyaXZlcik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogY2FuJ3QgcmVnaXN0ZXIgdmlvIGRyaXZlclxuIik7CisJCWdvdG8gdmlvX2ZhaWw7CisJfQogCiAJLyoKIAkgKiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgQUZURVIgdGhlIHZpb19yZWdpc3Rlcl9kcml2ZXIoKSBjYWxsIG9yIGVsc2UKIAkgKiB0aGUga29iamVjdHMgd29uJ3QgYmUgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCiAJICovCi0JaHZjc19jcmVhdGVfZHJpdmVyX2F0dHJzKCk7CisJcmMgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJihodmNzX3Zpb19kcml2ZXIuZHJpdmVyKSwgJmRyaXZlcl9hdHRyX3Jlc2Nhbik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSFZDUzogc3lzZnMgYXR0ciBjcmVhdGUgZmFpbGVkXG4iKTsKKwkJZ290byBhdHRyX2ZhaWw7CisJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogZHJpdmVyIG1vZHVsZSBpbnNlcnRlZC5cbiIpOwogCisJcmV0dXJuIDA7CisKK2F0dHJfZmFpbDoKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmh2Y3NfdmlvX2RyaXZlcik7Cit2aW9fZmFpbDoKKwlrdGhyZWFkX3N0b3AoaHZjc190YXNrKTsKK2t0aHJlYWRfZmFpbDoKKwlrZnJlZShodmNzX3BpX2J1ZmYpOworYnVmZl9hbGxvY19mYWlsOgorCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworcmVnaXN0ZXJfZmFpbDoKKwlodmNzX2ZyZWVfaW5kZXhfbGlzdCgpOworaW5kZXhfZmFpbDoKKwlwdXRfdHR5X2RyaXZlcihodmNzX3R0eV9kcml2ZXIpOworCWh2Y3NfdHR5X2RyaXZlciA9IE5VTEw7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNDQxLDcgKzE2MjUsNyBAQAogCWh2Y3NfcGlfYnVmZiA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmh2Y3NfcGlfbG9jayk7CiAKLQlodmNzX3JlbW92ZV9kcml2ZXJfYXR0cnMoKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmh2Y3NfdmlvX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9yZXNjYW4pOwogCiAJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZodmNzX3Zpb19kcml2ZXIpOwogCkBAIC0xNDU2LDE5MSArMTY0MCwzIEBACiAKIG1vZHVsZV9pbml0KGh2Y3NfbW9kdWxlX2luaXQpOwogbW9kdWxlX2V4aXQoaHZjc19tb2R1bGVfZXhpdCk7Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGh2Y3Nfc3RydWN0ICpmcm9tX3Zpb19kZXYoc3RydWN0IHZpb19kZXYgKnZpb2QpCi17Ci0JcmV0dXJuIHZpb2QtPmRldi5kcml2ZXJfZGF0YTsKLX0KLS8qIFRoZSBzeXNmcyBpbnRlcmZhY2UgZm9yIHRoZSBkcml2ZXIgYW5kIGRldmljZXMgKi8KLQotc3RhdGljIHNzaXplX3QgaHZjc19wYXJ0bmVyX3Z0eXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7Ci0Jc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXR2YWw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKLQlyZXR2YWwgPSBzcHJpbnRmKGJ1ZiwgIiVYXG4iLCBodmNzZC0+cF91bml0X2FkZHJlc3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwYXJ0bmVyX3Z0eXMsIFNfSVJVR08sIGh2Y3NfcGFydG5lcl92dHlzX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBodmNzX3BhcnRuZXJfY2xjc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgdmlvX2RldiAqdmlvZCA9IHRvX3Zpb19kZXYoZGV2KTsKLQlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV92aW9fZGV2KHZpb2QpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldHZhbDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOwotCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJXNcbiIsICZodmNzZC0+cF9sb2NhdGlvbl9jb2RlWzBdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXR2YWw7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIocGFydG5lcl9jbGNzLCBTX0lSVUdPLCBodmNzX3BhcnRuZXJfY2xjc19zaG93LCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgaHZjc19jdXJyZW50X3Z0eV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICogYnVmLAotCQlzaXplX3QgY291bnQpCi17Ci0JLyoKLQkgKiBEb24ndCBuZWVkIHRoaXMgZmVhdHVyZSBhdCB0aGUgcHJlc2VudCB0aW1lIGJlY2F1c2UgZmlybXdhcmUgZG9lc24ndAotCSAqIHlldCBzdXBwb3J0IG11bHRpcGxlIHBhcnRuZXJzLgotCSAqLwotCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IERlbmllZCBjdXJyZW50X3Z0eSBjaGFuZ2U6IC1FUEVSTS5cbiIpOwotCXJldHVybiAtRVBFUk07Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGh2Y3NfY3VycmVudF92dHlfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7Ci0Jc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXR2YWw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKLQlyZXR2YWwgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAmaHZjc2QtPnBfbG9jYXRpb25fY29kZVswXSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoY3VycmVudF92dHksCi0JU19JUlVHTyB8IFNfSVdVU1IsIGh2Y3NfY3VycmVudF92dHlfc2hvdywgaHZjc19jdXJyZW50X3Z0eV9zdG9yZSk7Ci0KLXN0YXRpYyBzc2l6ZV90IGh2Y3NfdnRlcm1fc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7Ci0Jc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogd3JpdGluZyBhICcwJyB0byB0aGlzIHN5c2ZzIGVudHJ5IHdpbGwgcmVzdWx0IGluIHRoZSBkaXNjb25uZWN0LiAqLwotCWlmIChzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMCkgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChodmNzZC0+b3Blbl9jb3VudCA+IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogdnRlcm0gc3RhdGUgdW5jaGFuZ2VkLiAgIgotCQkJCSJUaGUgaHZjcyBkZXZpY2Ugbm9kZSBpcyBzdGlsbCBpbiB1c2UuXG4iKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLQlpZiAoaHZjc2QtPmNvbm5lY3RlZCA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7Ci0JCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IHZ0ZXJtIHN0YXRlIHVuY2hhbmdlZC4gVGhlIgotCQkJCSIgdnR5LXNlcnZlciBpcyBub3QgY29ubmVjdGVkIHRvIGEgdnR5LlxuIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JaHZjc19wYXJ0bmVyX2ZyZWUoaHZjc2QpOwotCXByaW50ayhLRVJOX0lORk8gIkhWQ1M6IENsb3NlZCB2dHktc2VydmVyQCVYIGFuZCIKLQkJCSIgcGFydG5lciB2dHlAJVg6JWQgY29ubmVjdGlvbi5cbiIsCi0JCQlodmNzZC0+dmRldi0+dW5pdF9hZGRyZXNzLAotCQkJaHZjc2QtPnBfdW5pdF9hZGRyZXNzLAotCQkJKHVpbnQzMl90KWh2Y3NkLT5wX3BhcnRpdGlvbl9JRCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodmNzZC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgaHZjc192dGVybV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgdmlvX2RldiAqdmlvZCA9IHRvX3Zpb19kZXYoZGV2KTsKLQlzdHJ1Y3QgaHZjc19zdHJ1Y3QgKmh2Y3NkID0gZnJvbV92aW9fZGV2KHZpb2QpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldHZhbDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZodmNzZC0+bG9jaywgZmxhZ3MpOwotCXJldHZhbCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGh2Y3NkLT5jb25uZWN0ZWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUih2dGVybV9zdGF0ZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCWh2Y3NfdnRlcm1fc3RhdGVfc2hvdywgaHZjc192dGVybV9zdGF0ZV9zdG9yZSk7Ci0KLXN0YXRpYyBzc2l6ZV90IGh2Y3NfaW5kZXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHZpb19kZXYgKnZpb2QgPSB0b192aW9fZGV2KGRldik7Ci0Jc3RydWN0IGh2Y3Nfc3RydWN0ICpodmNzZCA9IGZyb21fdmlvX2Rldih2aW9kKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXR2YWw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHZjc2QtPmxvY2ssIGZsYWdzKTsKLQlyZXR2YWwgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBodmNzZC0+aW5kZXgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh2Y3NkLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGluZGV4LCBTX0lSVUdPLCBodmNzX2luZGV4X3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaHZjc19hdHRyc1tdID0gewotCSZkZXZfYXR0cl9wYXJ0bmVyX3Z0eXMuYXR0ciwKLQkmZGV2X2F0dHJfcGFydG5lcl9jbGNzLmF0dHIsCi0JJmRldl9hdHRyX2N1cnJlbnRfdnR5LmF0dHIsCi0JJmRldl9hdHRyX3Z0ZXJtX3N0YXRlLmF0dHIsCi0JJmRldl9hdHRyX2luZGV4LmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGh2Y3NfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBodmNzX2F0dHJzLAotfTsKLQotc3RhdGljIHZvaWQgaHZjc19jcmVhdGVfZGV2aWNlX2F0dHJzKHN0cnVjdCBodmNzX3N0cnVjdCAqaHZjc2QpCi17Ci0Jc3RydWN0IHZpb19kZXYgKnZkZXYgPSBodmNzZC0+dmRldjsKLQlzeXNmc19jcmVhdGVfZ3JvdXAoJnZkZXYtPmRldi5rb2JqLCAmaHZjc19hdHRyX2dyb3VwKTsKLX0KLQotc3RhdGljIHZvaWQgaHZjc19yZW1vdmVfZGV2aWNlX2F0dHJzKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQotewotCXN5c2ZzX3JlbW92ZV9ncm91cCgmdmRldi0+ZGV2LmtvYmosICZodmNzX2F0dHJfZ3JvdXApOwotfQotCi1zdGF0aWMgc3NpemVfdCBodmNzX3Jlc2Nhbl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKLXsKLQkvKiBBIDEgbWVhbnMgaXQgaXMgdXBkYXRpbmcsIGEgMCBtZWFucyBpdCBpcyBkb25lIHVwZGF0aW5nICovCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGh2Y3NfcmVzY2FuX3N0YXR1cyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGh2Y3NfcmVzY2FuX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNvbnN0IGNoYXIgKiBidWYsCi0JCXNpemVfdCBjb3VudCkKLXsKLQlpZiAoKHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAwKSAhPSAxKQotCQkmJiAoaHZjc19yZXNjYW5fc3RhdHVzICE9IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWh2Y3NfcmVzY2FuX3N0YXR1cyA9IDE7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiSFZDUzogcmVzY2FubmluZyBwYXJ0bmVyIGluZm8gZm9yIGFsbCIKLQkJIiB2dHktc2VydmVycy5cbiIpOwotCWh2Y3NfcmVzY2FuX2RldmljZXNfbGlzdCgpOwotCWh2Y3NfcmVzY2FuX3N0YXR1cyA9IDA7Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIERSSVZFUl9BVFRSKHJlc2NhbiwKLQlTX0lSVUdPIHwgU19JV1VTUiwgaHZjc19yZXNjYW5fc2hvdywgaHZjc19yZXNjYW5fc3RvcmUpOwotCi1zdGF0aWMgdm9pZCBodmNzX2NyZWF0ZV9kcml2ZXJfYXR0cnModm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyZnMgPSAmKGh2Y3NfdmlvX2RyaXZlci5kcml2ZXIpOwotCWRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3Jlc2Nhbik7Ci19Ci0KLXN0YXRpYyB2b2lkIGh2Y3NfcmVtb3ZlX2RyaXZlcl9hdHRycyh2b2lkKQotewotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXJmcyA9ICYoaHZjc192aW9fZHJpdmVyLmRyaXZlcik7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfcmVzY2FuKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odnNpLmMgYi9kcml2ZXJzL2NoYXIvaHZzaS5jCmluZGV4IDJjZjYzZTcuLmQ3ODA2ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odnNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2c2kuYwpAQCAtNjksNyArNjksNyBAQAogI2RlZmluZSBfX0FMSUdORURfXwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhzaXplb2YobG9uZykpKSkKIAogc3RydWN0IGh2c2lfc3RydWN0IHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3JpdGVyOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd3JpdGVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBoYW5kc2hha2VyOwogCXdhaXRfcXVldWVfaGVhZF90IGVtcHR5cTsgLyogd29rZW4gd2hlbiBvdXRidWYgaXMgZW1wdGllZCAqLwogCXdhaXRfcXVldWVfaGVhZF90IHN0YXRlcTsgLyogd29rZW4gd2hlbiBIVlNJIHN0YXRlIGNoYW5nZXMgKi8KQEAgLTc0NCw5ICs3NDQsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaHZzaV9oYW5kc2hha2VyKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGh2c2lfaGFuZHNoYWtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGh2c2lfc3RydWN0ICpocCA9IChzdHJ1Y3QgaHZzaV9zdHJ1Y3QgKilhcmc7CisJc3RydWN0IGh2c2lfc3RydWN0ICpocCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaHZzaV9zdHJ1Y3QsIGhhbmRzaGFrZXIpOwogCiAJaWYgKGh2c2lfaGFuZHNoYWtlKGhwKSA+PSAwKQogCQlyZXR1cm47CkBAIC05NTEsOSArOTUyLDEwIEBACiB9CiAKIC8qIGh2c2lfd3JpdGVfd29ya2VyIHdpbGwga2VlcCByZXNjaGVkdWxpbmcgaXRzZWxmIHVudGlsIG91dGJ1ZiBpcyBlbXB0eSAqLwotc3RhdGljIHZvaWQgaHZzaV93cml0ZV93b3JrZXIodm9pZCAqYXJnKQorc3RhdGljIHZvaWQgaHZzaV93cml0ZV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPSAoc3RydWN0IGh2c2lfc3RydWN0ICopYXJnOworCXN0cnVjdCBodnNpX3N0cnVjdCAqaHAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGh2c2lfc3RydWN0LCB3cml0ZXIud29yayk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKICNpZmRlZiBERUJVRwogCXN0YXRpYyBsb25nIHN0YXJ0X2ogPSAwOwpAQCAtMTE1OSw2ICsxMTYxLDggQEAKIAlodnNpX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TWVNURU07CiAJaHZzaV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKIAlodnNpX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0w7CisJaHZzaV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7CisJaHZzaV9kcml2ZXItPmluaXRfdGVybWlvcy5jX29zcGVlZCA9IDk2MDA7CiAJaHZzaV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKIAl0dHlfc2V0X29wZXJhdGlvbnMoaHZzaV9kcml2ZXIsICZodnNpX29wcyk7CiAKQEAgLTEyODcsOCArMTI5MSw4IEBACiAJCX0KIAogCQlocCA9ICZodnNpX3BvcnRzW2h2c2lfY291bnRdOwotCQlJTklUX1dPUksoJmhwLT53cml0ZXIsIGh2c2lfd3JpdGVfd29ya2VyLCBocCk7Ci0JCUlOSVRfV09SSygmaHAtPmhhbmRzaGFrZXIsIGh2c2lfaGFuZHNoYWtlciwgaHApOworCQlJTklUX0RFTEFZRURfV09SSygmaHAtPndyaXRlciwgaHZzaV93cml0ZV93b3JrZXIpOworCQlJTklUX1dPUksoJmhwLT5oYW5kc2hha2VyLCBodnNpX2hhbmRzaGFrZXIpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZocC0+ZW1wdHlxKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmaHAtPnN0YXRlcSk7CiAJCXNwaW5fbG9ja19pbml0KCZocC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKaW5kZXggOWY3NjM1Zi4uNWYzYWNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZwpAQCAtMywxNyArMywyMCBAQAogIwogCiBjb25maWcgSFdfUkFORE9NCi0JYm9vbCAiSGFyZHdhcmUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgQ29yZSBzdXBwb3J0IgotCWRlZmF1bHQgeQorCXRyaXN0YXRlICJIYXJkd2FyZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBDb3JlIHN1cHBvcnQiCisJZGVmYXVsdCBtCiAJLS0taGVscC0tLQogCSAgSGFyZHdhcmUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgQ29yZSBpbmZyYXN0cnVjdHVyZS4KIAorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcm5nLWNvcmUuCisKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBIV19SQU5ET01fSU5URUwKIAl0cmlzdGF0ZSAiSW50ZWwgSFcgUmFuZG9tIE51bWJlciBHZW5lcmF0b3Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEhXX1JBTkRPTSAmJiAoWDg2IHx8IElBNjQpICYmIFBDSQotCWRlZmF1bHQgeQorCWRlZmF1bHQgSFdfUkFORE9NCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMga2VybmVsLXNpZGUgc3VwcG9ydCBmb3IgdGhlIFJhbmRvbSBOdW1iZXIKIAkgIEdlbmVyYXRvciBoYXJkd2FyZSBmb3VuZCBvbiBJbnRlbCBpOHh4LWJhc2VkIG1vdGhlcmJvYXJkcy4KQEAgLTI2LDcgKzI5LDcgQEAKIGNvbmZpZyBIV19SQU5ET01fQU1ECiAJdHJpc3RhdGUgIkFNRCBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gSFdfUkFORE9NICYmIFg4NiAmJiBQQ0kKLQlkZWZhdWx0IHkKKwlkZWZhdWx0IEhXX1JBTkRPTQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGtlcm5lbC1zaWRlIHN1cHBvcnQgZm9yIHRoZSBSYW5kb20gTnVtYmVyCiAJICBHZW5lcmF0b3IgaGFyZHdhcmUgZm91bmQgb24gQU1EIDc2eC1iYXNlZCBtb3RoZXJib2FyZHMuCkBAIC0zOSw3ICs0Miw3IEBACiBjb25maWcgSFdfUkFORE9NX0dFT0RFCiAJdHJpc3RhdGUgIkFNRCBHZW9kZSBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gSFdfUkFORE9NICYmIFg4NiAmJiBQQ0kKLQlkZWZhdWx0IHkKKwlkZWZhdWx0IEhXX1JBTkRPTQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGtlcm5lbC1zaWRlIHN1cHBvcnQgZm9yIHRoZSBSYW5kb20gTnVtYmVyCiAJICBHZW5lcmF0b3IgaGFyZHdhcmUgZm91bmQgb24gdGhlIEFNRCBHZW9kZSBMWC4KQEAgLTUyLDcgKzU1LDcgQEAKIGNvbmZpZyBIV19SQU5ET01fVklBCiAJdHJpc3RhdGUgIlZJQSBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gSFdfUkFORE9NICYmIFg4Nl8zMgotCWRlZmF1bHQgeQorCWRlZmF1bHQgSFdfUkFORE9NCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMga2VybmVsLXNpZGUgc3VwcG9ydCBmb3IgdGhlIFJhbmRvbSBOdW1iZXIKIAkgIEdlbmVyYXRvciBoYXJkd2FyZSBmb3VuZCBvbiBWSUEgYmFzZWQgbW90aGVyYm9hcmRzLgpAQCAtNjUsNyArNjgsNyBAQAogY29uZmlnIEhXX1JBTkRPTV9JWFA0WFgKIAl0cmlzdGF0ZSAiSW50ZWwgSVhQNHh4IE5QVSBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gSFdfUkFORE9NICYmIEFSQ0hfSVhQNFhYCi0JZGVmYXVsdCB5CisJZGVmYXVsdCBIV19SQU5ET00KIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tCiAJICBOdW1iZXIgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIHRoZSBJbnRlbCBJWFA0eHggTlBVLgpAQCAtNzgsNyArODEsNyBAQAogY29uZmlnIEhXX1JBTkRPTV9PTUFQCiAJdHJpc3RhdGUgIk9NQVAgUmFuZG9tIE51bWJlciBHZW5lcmF0b3Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEhXX1JBTkRPTSAmJiAoQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVAyNFhYKQotCWRlZmF1bHQgeQorCWRlZmF1bHQgSFdfUkFORE9NCiAgCS0tLWhlbHAtLS0KICAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwtc2lkZSBzdXBwb3J0IGZvciB0aGUgUmFuZG9tIE51bWJlcgogCSAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIE9NQVAxNnh4IGFuZCBPTUFQMjR4eCBtdWx0aW1lZGlhCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQppbmRleCBlMjYzYWU5Li5jNDFmYTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vTWFrZWZpbGUKQEAgLTIsNyArMiw4IEBACiAjIE1ha2VmaWxlIGZvciBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAoUk5HKSBkZXZpY2UgZHJpdmVycy4KICMKIAotb2JqLSQoQ09ORklHX0hXX1JBTkRPTSkgKz0gY29yZS5vCitvYmotJChDT05GSUdfSFdfUkFORE9NKSArPSBybmctY29yZS5vCitybmctY29yZS15IDo9IGNvcmUubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9JTlRFTCkgKz0gaW50ZWwtcm5nLm8KIG9iai0kKENPTkZJR19IV19SQU5ET01fQU1EKSArPSBhbWQtcm5nLm8KIG9iai0kKENPTkZJR19IV19SQU5ET01fR0VPREUpICs9IGdlb2RlLXJuZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jCmluZGV4IDE1NGE4MWQuLjI2YTg2MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vY29yZS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTE2Miw3ICsxNjMsOCBAQAogfTsKIAogCi1zdGF0aWMgc3NpemVfdCBod3JuZ19hdHRyX2N1cnJlbnRfc3RvcmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3MsCitzdGF0aWMgc3NpemVfdCBod3JuZ19hdHRyX2N1cnJlbnRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewogCWludCBlcnI7CkBAIC0xOTIsNyArMTk0LDggQEAKIAlyZXR1cm4gZXJyID8gOiBsZW47CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGh3cm5nX2F0dHJfY3VycmVudF9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzLAorc3RhdGljIHNzaXplX3QgaHdybmdfYXR0cl9jdXJyZW50X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgICAgY2hhciAqYnVmKQogewogCWludCBlcnI7CkBAIC0yMTAsNyArMjEzLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCBod3JuZ19hdHRyX2F2YWlsYWJsZV9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzLAorc3RhdGljIHNzaXplX3QgaHdybmdfYXR0cl9hdmFpbGFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJIGNoYXIgKmJ1ZikKIHsKIAlpbnQgZXJyOwpAQCAtMjM0LDIwICsyMzgsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocm5nX2N1cnJlbnQsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJIGh3cm5nX2F0dHJfY3VycmVudF9zaG93LAotCQkJIGh3cm5nX2F0dHJfY3VycmVudF9zdG9yZSk7Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocm5nX2F2YWlsYWJsZSwgU19JUlVHTywKLQkJCSBod3JuZ19hdHRyX2F2YWlsYWJsZV9zaG93LAotCQkJIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHJuZ19jdXJyZW50LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgaHdybmdfYXR0cl9jdXJyZW50X3Nob3csCisJCSAgIGh3cm5nX2F0dHJfY3VycmVudF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocm5nX2F2YWlsYWJsZSwgU19JUlVHTywKKwkJICAgaHdybmdfYXR0cl9hdmFpbGFibGVfc2hvdywKKwkJICAgTlVMTCk7CiAKIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9taXNjZGV2KHZvaWQpCiB7Ci0JY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKHJuZ19taXNjZGV2LmNsYXNzLAotCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJfcm5nX2F2YWlsYWJsZSk7Ci0JY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKHJuZ19taXNjZGV2LmNsYXNzLAotCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJfcm5nX2N1cnJlbnQpOworCWRldmljZV9yZW1vdmVfZmlsZShybmdfbWlzY2Rldi50aGlzX2RldmljZSwgJmRldl9hdHRyX3JuZ19hdmFpbGFibGUpOworCWRldmljZV9yZW1vdmVfZmlsZShybmdfbWlzY2Rldi50aGlzX2RldmljZSwgJmRldl9hdHRyX3JuZ19jdXJyZW50KTsKIAltaXNjX2RlcmVnaXN0ZXIoJnJuZ19taXNjZGV2KTsKIH0KIApAQCAtMjU4LDIwICsyNjAsMTkgQEAKIAllcnIgPSBtaXNjX3JlZ2lzdGVyKCZybmdfbWlzY2Rldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHJuZ19taXNjZGV2LmNsYXNzLAotCQkJCSAgICAgICAmY2xhc3NfZGV2aWNlX2F0dHJfcm5nX2N1cnJlbnQpOworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShybmdfbWlzY2Rldi50aGlzX2RldmljZSwKKwkJCQkgJmRldl9hdHRyX3JuZ19jdXJyZW50KTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9taXNjX2RlcmVnOwotCWVyciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShybmdfbWlzY2Rldi5jbGFzcywKLQkJCQkgICAgICAgJmNsYXNzX2RldmljZV9hdHRyX3JuZ19hdmFpbGFibGUpOworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShybmdfbWlzY2Rldi50aGlzX2RldmljZSwKKwkJCQkgJmRldl9hdHRyX3JuZ19hdmFpbGFibGUpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3JlbW92ZV9jdXJyZW50Owogb3V0OgogCXJldHVybiBlcnI7CiAKIGVycl9yZW1vdmVfY3VycmVudDoKLQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUocm5nX21pc2NkZXYuY2xhc3MsCi0JCQkJICZjbGFzc19kZXZpY2VfYXR0cl9ybmdfY3VycmVudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKHJuZ19taXNjZGV2LnRoaXNfZGV2aWNlLCAmZGV2X2F0dHJfcm5nX2N1cnJlbnQpOwogZXJyX21pc2NfZGVyZWc6CiAJbWlzY19kZXJlZ2lzdGVyKCZybmdfbWlzY2Rldik7CiAJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmggYi9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmgKaW5kZXggYmFhNGU3Mi4uMjkyNzdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5oCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJjbWQuaApAQCAtMzY3LDExICszNjcsNiBAQAogI2RlZmluZSBDU0VfTlVMTCAgMyAgLy8gUmVwbGFjZSB3aXRoIGEgbnVsbAogI2RlZmluZSBDU0VfTUFSSyAgNCAgLy8gUmVwbGFjZSB3aXRoIGEgMy1jaGFyYWN0ZXIgc2VxdWVuY2UgKGFzIFVuaXgpCiAKLSNkZWZpbmUgIENNRF9TRVRfUkVQTEFDRU1FTlQoYXJnLGNoKSAgIFwKLQkJCSgoKGNtZFN5bnRheFB0cikoY3QzNmEpKS0+Y21kWzFdID0gKGFyZyksIFwKLQkJCSgoKGNtZFN5bnRheFB0cikoY3QzNmEpKS0+Y21kWzJdID0gKGNoKSwgIFwKLQkJCShjbWRTeW50YXhQdHIpKGN0MzZhKSkKLQogI2RlZmluZSBDU0VfUkVQTEFDRSAgMHg4CS8vIFJlcGxhY2UgdGhlIGVycm9yZWQgY2hhcmFjdGVyIHdpdGggdGhlCiAJCQkJCQkJLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGRlZmluZWQgaGVyZQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMKaW5kZXggNTRkOTNmMC4uNzgwNDU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuYwpAQCAtODQsOCArODQsOCBAQAogc3RhdGljIHZvaWQgc2VydmljZU91dGdvaW5nRmlmbyhpMmVCb3JkU3RyUHRyKTsKIAogLy8gRnVuY3Rpb25zIGRlZmluZWQgaW4gaXAyLmMgYXMgcGFydCBvZiBpbnRlcnJ1cHQgaGFuZGxpbmcKLXN0YXRpYyB2b2lkIGRvX2lucHV0KHZvaWQgKik7Ci1zdGF0aWMgdm9pZCBkb19zdGF0dXModm9pZCAqKTsKK3N0YXRpYyB2b2lkIGRvX2lucHV0KHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGRvX3N0YXR1cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKIC8vKioqKioqKioqKioqKioqCiAvLyogRGVidWcgIERhdGEgKgpAQCAtMzMxLDggKzMzMSw4IEBACiAJCXBDaC0+Q2xvc2luZ1dhaXRUaW1lICA9IDMwKkhaOwogCiAJCS8vIEluaXRpYWxpemUgdGFzayBxdWV1ZSBvYmplY3RzCi0JCUlOSVRfV09SSygmcENoLT50cXVldWVfaW5wdXQsIGRvX2lucHV0LCBwQ2gpOwotCQlJTklUX1dPUksoJnBDaC0+dHF1ZXVlX3N0YXR1cywgZG9fc3RhdHVzLCBwQ2gpOworCQlJTklUX1dPUksoJnBDaC0+dHF1ZXVlX2lucHV0LCBkb19pbnB1dCk7CisJCUlOSVRfV09SSygmcENoLT50cXVldWVfc3RhdHVzLCBkb19zdGF0dXMpOwogCiAjaWZkZWYgSVAyREVCVUdfVFJBQ0UKIAkJcENoLT50cmFjZSA9IGlwMnRyYWNlOwpAQCAtMTAxNiw3ICsxMDE2LDYgQEAKIAl1bnNpZ25lZCBzaG9ydCBjaGFubmVsOwogCXVuc2lnbmVkIHNob3J0IHN0dWZmSW5kZXg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmMgPSAwOwogCiAJaW50IGJhaWxvdXQgPSAxMDsKIApAQCAtMTU3Myw3ICsxNTcyLDcgQEAKICNpZmRlZiBVU0VfSVEKIAkJCXNjaGVkdWxlX3dvcmsoJnBDaC0+dHF1ZXVlX2lucHV0KTsKICNlbHNlCi0JCQlkb19pbnB1dChwQ2gpOworCQkJZG9faW5wdXQoJnBDaC0+dHF1ZXVlX2lucHV0KTsKICNlbmRpZgogCiAJCQkvLyBOb3RlIHdlIGRvIG5vdCBuZWVkIHRvIG1haW50YWluIGFueSBmbG93LWNvbnRyb2wgY3JlZGl0cyBhdCB0aGlzCkBAIC0xODEwLDcgKzE4MDksNyBAQAogI2lmZGVmIFVTRV9JUQogCQkJCQkJc2NoZWR1bGVfd29yaygmcENoLT50cXVldWVfc3RhdHVzKTsKICNlbHNlCi0JCQkJCQlkb19zdGF0dXMocENoKTsKKwkJCQkJCWRvX3N0YXR1cygmcENoLT50cXVldWVfc3RhdHVzKTsKICNlbmRpZgogCQkJCQl9CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pcDJtYWluLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwppbmRleCBhM2YzMmQ0Li43YzcwMzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYworKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiBzdGF0aWMgaW50ICBpcDJfY2hhcnNfaW5fYnVmKFBUVFkpOwogc3RhdGljIHZvaWQgaXAyX2ZsdXNoX2J1ZmZlcihQVFRZKTsKIHN0YXRpYyBpbnQgIGlwMl9pb2N0bChQVFRZLCBzdHJ1Y3QgZmlsZSAqLCBVSU5ULCBVTE9ORyk7Ci1zdGF0aWMgdm9pZCBpcDJfc2V0X3Rlcm1pb3MoUFRUWSwgc3RydWN0IHRlcm1pb3MgKik7CitzdGF0aWMgdm9pZCBpcDJfc2V0X3Rlcm1pb3MoUFRUWSwgc3RydWN0IGt0ZXJtaW9zICopOwogc3RhdGljIHZvaWQgaXAyX3NldF9saW5lX2Rpc2NpcGxpbmUoUFRUWSk7CiBzdGF0aWMgdm9pZCBpcDJfdGhyb3R0bGUoUFRUWSk7CiBzdGF0aWMgdm9pZCBpcDJfdW50aHJvdHRsZShQVFRZKTsKQEAgLTE4OSwxNiArMTg5LDE2IEBACiAJCQkgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKIAogc3RhdGljIHZvaWQgc2V0X2lycShpbnQsIGludCk7Ci1zdGF0aWMgdm9pZCBpcDJfaW50ZXJydXB0X2JoKGkyZUJvcmRTdHJQdHIgcEIpOworc3RhdGljIHZvaWQgaXAyX2ludGVycnVwdF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIGlycXJldHVybl90IGlwMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyB2b2lkIGlwMl9wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXJ2aWNlX2FsbF9ib2FyZHModm9pZCk7Ci1zdGF0aWMgdm9pZCBkb19pbnB1dCh2b2lkICpwKTsKLXN0YXRpYyB2b2lkIGRvX3N0YXR1cyh2b2lkICpwKTsKK3N0YXRpYyB2b2lkIGRvX2lucHV0KHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGRvX3N0YXR1cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKIHN0YXRpYyB2b2lkIGlwMl93YWl0X3VudGlsX3NlbnQoUFRUWSxpbnQpOwogCi1zdGF0aWMgdm9pZCBzZXRfcGFyYW1zIChpMkNoYW5TdHJQdHIsIHN0cnVjdCB0ZXJtaW9zICopOworc3RhdGljIHZvaWQgc2V0X3BhcmFtcyAoaTJDaGFuU3RyUHRyLCBzdHJ1Y3Qga3Rlcm1pb3MgKik7CiBzdGF0aWMgaW50IGdldF9zZXJpYWxfaW5mbyhpMkNoYW5TdHJQdHIsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKTsKIHN0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKGkyQ2hhblN0clB0ciwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopOwogCkBAIC05MTgsNyArOTE4LDcgQEAKIAkJcENoKys7CiAJfQogZXhfZXhpdDoKLQlJTklUX1dPUksoJnBCLT50cXVldWVfaW50ZXJydXB0LCAodm9pZCgqKSh2b2lkKikpIGlwMl9pbnRlcnJ1cHRfYmgsIHBCKTsKKwlJTklUX1dPUksoJnBCLT50cXVldWVfaW50ZXJydXB0LCBpcDJfaW50ZXJydXB0X2JoKTsKIAlyZXR1cm47CiAKIGVycl9yZWxlYXNlX3JlZ2lvbjoKQEAgLTExMjUsOCArMTEyNSw4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZ1bmN0aW9uOiAgIGlwMl9pbnRlcnJ1cHRfYmgocEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQYXJhbWV0ZXJzOiBwQiAtIHBvaW50ZXIgdG8gdGhlIGJvYXJkIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRnVuY3Rpb246ICAgaXAyX2ludGVycnVwdF9iaCh3b3JrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBhcmFtZXRlcnM6IHdvcmsgLSBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSZXR1cm5zOiAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMTM1LDggKzExMzUsOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZAotaXAyX2ludGVycnVwdF9iaChpMmVCb3JkU3RyUHRyIHBCKQoraXAyX2ludGVycnVwdF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJaTJlQm9yZFN0clB0ciBwQiA9IGNvbnRhaW5lcl9vZih3b3JrLCBpMmVCb3JkU3RyLCB0cXVldWVfaW50ZXJydXB0KTsKIC8vCXBCIGJldHRlciB3ZWxsIGJlIHNldCBvciB3ZSBoYXZlIGEgcHJvYmxlbSEgIFdlIGNhbiBvbmx5IGdldAogLy8JaGVyZSBmcm9tIHRoZSBJTU1FRElBVEUgcXVldWUuICBIZXJlLCB3ZSBwcm9jZXNzIHRoZSBib2FyZHMuCiAvLwlDaGVja2luZyBwQiBkb2Vzbid0IGNvc3QgbXVjaCBhbmQgaXQgc2F2ZXMgdXMgZnJvbSB0aGUgc2FuaXR5IGNoZWNrZXJzLgpAQCAtMTI0NSw5ICsxMjQ2LDkgQEAKIAlpcDJ0cmFjZSAoSVRSQ19OT19QT1JULCBJVFJDX0lOVFIsIElUUkNfUkVUVVJOLCAwICk7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX2lucHV0KHZvaWQgKnApCitzdGF0aWMgdm9pZCBkb19pbnB1dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JaTJDaGFuU3RyUHRyIHBDaCA9IHA7CisJaTJDaGFuU3RyUHRyIHBDaCA9IGNvbnRhaW5lcl9vZih3b3JrLCBpMkNoYW5TdHIsIHRxdWV1ZV9pbnB1dCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlwMnRyYWNlKENIQU5OLCBJVFJDX0lOUFVULCAyMSwgMCApOwpAQCAtMTI3OSw5ICsxMjgwLDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3N0YXR1cyh2b2lkICpwKQorc3RhdGljIHZvaWQgZG9fc3RhdHVzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlpMkNoYW5TdHJQdHIgcENoID0gcDsKKwlpMkNoYW5TdHJQdHIgcENoID0gY29udGFpbmVyX29mKHdvcmssIGkyQ2hhblN0ciwgdHF1ZXVlX3N0YXR1cyk7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9ICBpMkdldFN0YXR1cyggcENoLCAoSTJfQlJLfEkyX1BBUnxJMl9GUkF8STJfT1ZSKSApOwpAQCAtMjM5Nyw3ICsyMzk4LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQKLWlwMl9zZXRfdGVybWlvcyggUFRUWSB0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyApCitpcDJfc2V0X3Rlcm1pb3MoIFBUVFkgdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zICkKIHsKIAlpMkNoYW5TdHJQdHIgcENoID0gKGkyQ2hhblN0clB0cil0dHktPmRyaXZlcl9kYXRhOwogCkBAIC0yNDM5LDExICsyNDQwLDExIEBACiAvKiBjaGFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkCi1zZXRfcGFyYW1zKCBpMkNoYW5TdHJQdHIgcENoLCBzdHJ1Y3QgdGVybWlvcyAqb190aW9zICkKK3NldF9wYXJhbXMoIGkyQ2hhblN0clB0ciBwQ2gsIHN0cnVjdCBrdGVybWlvcyAqb190aW9zICkKIHsKIAl0Y2ZsYWdfdCBjZmxhZywgaWZsYWcsIGxmbGFnOwogCWNoYXIgc3RvcF9jaGFyLCBzdGFydF9jaGFyOwotCXN0cnVjdCB0ZXJtaW9zIGR1bW15OworCXN0cnVjdCBrdGVybWlvcyBkdW1teTsKIAogCWxmbGFnID0gcENoLT5wVFRZLT50ZXJtaW9zLT5jX2xmbGFnOwogCWNmbGFnID0gcENoLT5wVFRZLT50ZXJtaW9zLT5jX2NmbGFnOwpAQCAtMjY5OSw3ICsyNzAwLDcgQEAKIHNzaXplX3QKIGlwMl9pcGxfcmVhZChzdHJ1Y3QgZmlsZSAqcEZpbGUsIGNoYXIgX191c2VyICpwRGF0YSwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZiApCiB7Ci0JdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKHBGaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKHBGaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQgcmMgPSAwOwogCiAjaWZkZWYgSVAyREVCVUdfSVBMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2J0X3NtLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2J0X3NtLmMKaW5kZXggMDAzMGNkOC4uZTczNjExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9idF9zbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfYnRfc20uYwpAQCAtMzMsMTEgKzMzLDE1IEBACiAjaW5jbHVkZSA8bGludXgvaXBtaV9tc2dkZWZzLmg+CQkvKiBmb3IgY29tcGxldGlvbiBjb2RlcyAqLwogI2luY2x1ZGUgImlwbWlfc2lfc20uaCIKIAotc3RhdGljIGludCBidF9kZWJ1ZyA9IDB4MDA7CS8qIFByb2R1Y3Rpb24gdmFsdWUgMCwgc2VlIGZvbGxvd2luZyBmbGFncyAqLworI2RlZmluZSBCVF9ERUJVR19PRkYJMAkvKiBVc2VkIGluIHByb2R1Y3Rpb24gKi8KKyNkZWZpbmUgQlRfREVCVUdfRU5BQkxFCTEJLyogR2VuZXJpYyBtZXNzYWdlcyAqLworI2RlZmluZSBCVF9ERUJVR19NU0cJMgkvKiBQcmludHMgYWxsIHJlcXVlc3QvcmVzcG9uc2UgYnVmZmVycyAqLworI2RlZmluZSBCVF9ERUJVR19TVEFURVMJNAkvKiBWZXJib3NlIGxvb2sgYXQgc3RhdGUgY2hhbmdlcyAqLworLyogQlRfREVCVUdfT0ZGIG11c3QgYmUgemVybyB0byBjb3JyZXNwb25kIHRvIHRoZSBkZWZhdWx0IHVuaW5pdGlhbGl6ZWQKKyAgIHZhbHVlICovCiAKLSNkZWZpbmUJQlRfREVCVUdfRU5BQkxFCTEKLSNkZWZpbmUgQlRfREVCVUdfTVNHCTIKLSNkZWZpbmUgQlRfREVCVUdfU1RBVEVTCTQKK3N0YXRpYyBpbnQgYnRfZGVidWc7IC8qIDAgPT0gQlRfREVCVUdfT0ZGICovCisKIG1vZHVsZV9wYXJhbShidF9kZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYnRfZGVidWcsICJkZWJ1ZyBiaXRtYXNrLCAxPWVuYWJsZSwgMj1tZXNzYWdlcywgND1zdGF0ZXMiKTsKIApAQCAtNDcsMzggKzUxLDU0IEBACiAgICBTaW5jZSB0aGUgT3BlbiBJUE1JIGFyY2hpdGVjdHVyZSBpcyBzaW5nbGUtbWVzc2FnZSBvcmllbnRlZCBhdCB0aGlzCiAgICBzdGFnZSwgdGhlIHF1ZXVlIGRlcHRoIG9mIEJUIGlzIG9mIG5vIGNvbmNlcm4uICovCiAKLSNkZWZpbmUgQlRfTk9STUFMX1RJTUVPVVQJNTAwMDAwMAkvKiBzZWNvbmRzIGluIG1pY3Jvc2Vjb25kcyAqLwotI2RlZmluZSBCVF9SRVRSWV9MSU1JVAkJMgotI2RlZmluZSBCVF9SRVNFVF9ERUxBWQkJNjAwMDAwMAkvKiA2IHNlY29uZHMgYWZ0ZXIgd2FybSByZXNldCAqLworI2RlZmluZSBCVF9OT1JNQUxfVElNRU9VVAk1CS8qIHNlY29uZHMgKi8KKyNkZWZpbmUgQlRfTk9STUFMX1JFVFJZX0xJTUlUCTIKKyNkZWZpbmUgQlRfUkVTRVRfREVMQVkJCTYJLyogc2Vjb25kcyBhZnRlciB3YXJtIHJlc2V0ICovCisKKy8qIFN0YXRlcyBhcmUgd3JpdHRlbiBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIGFuZCB1c3VhbGx5IGNvdmVyCisgICBtdWx0aXBsZSByb3dzIG9mIHRoZSBzdGF0ZSB0YWJsZSBkaXNjdXNzaW9uIGluIHRoZSBJUE1JIHNwZWMuICovCiAKIGVudW0gYnRfc3RhdGVzIHsKLQlCVF9TVEFURV9JRExFLAorCUJUX1NUQVRFX0lETEUgPSAwLAkvKiBPcmRlciBpcyBjcml0aWNhbCBpbiB0aGlzIGxpc3QgKi8KIAlCVF9TVEFURV9YQUNUSU9OX1NUQVJULAogCUJUX1NUQVRFX1dSSVRFX0JZVEVTLAotCUJUX1NUQVRFX1dSSVRFX0VORCwKIAlCVF9TVEFURV9XUklURV9DT05TVU1FLAotCUJUX1NUQVRFX0IySF9XQUlULAotCUJUX1NUQVRFX1JFQURfRU5ELAotCUJUX1NUQVRFX1JFU0VUMSwJCS8qIFRoZXNlIG11c3QgY29tZSBsYXN0ICovCisJQlRfU1RBVEVfUkVBRF9XQUlULAorCUJUX1NUQVRFX0NMRUFSX0IySCwKKwlCVF9TVEFURV9SRUFEX0JZVEVTLAorCUJUX1NUQVRFX1JFU0VUMSwJLyogVGhlc2UgbXVzdCBjb21lIGxhc3QgKi8KIAlCVF9TVEFURV9SRVNFVDIsCiAJQlRfU1RBVEVfUkVTRVQzLAogCUJUX1NUQVRFX1JFU1RBUlQsCi0JQlRfU1RBVEVfSE9TRUQKKwlCVF9TVEFURV9QUklOVE1FLAorCUJUX1NUQVRFX0NBUEFCSUxJVElFU19CRUdJTiwKKwlCVF9TVEFURV9DQVBBQklMSVRJRVNfRU5ELAorCUJUX1NUQVRFX0xPTkdfQlVTWQkvKiBCVCBkb2Vzbid0IGdldCBob3NlZCA6LSkgKi8KIH07CiAKKy8qIE1hY3JvcyBzZWVuIGF0IHRoZSBlbmQgb2Ygc3RhdGUgImNhc2UiIGJsb2Nrcy4gIFRoZXkgaGVscCB3aXRoIGxlZ2liaWxpdHkKKyAgIGFuZCBkZWJ1Z2dpbmcuICovCisKKyNkZWZpbmUgQlRfU1RBVEVfQ0hBTkdFKFgsWSkgeyBidC0+c3RhdGUgPSBYOyByZXR1cm4gWTsgfQorCisjZGVmaW5lIEJUX1NJX1NNX1JFVFVSTihZKSAgIHsgbGFzdF9wcmludGVkID0gQlRfU1RBVEVfUFJJTlRNRTsgcmV0dXJuIFk7IH0KKwogc3RydWN0IHNpX3NtX2RhdGEgewogCWVudW0gYnRfc3RhdGVzCXN0YXRlOwotCWVudW0gYnRfc3RhdGVzCWxhc3Rfc3RhdGU7CS8qIGFzc2lzdCBwcmludGluZyBhbmQgcmVzZXRzICovCiAJdW5zaWduZWQgY2hhcglzZXE7CQkvKiBCVCBzZXF1ZW5jZSBudW1iZXIgKi8KIAlzdHJ1Y3Qgc2lfc21faW8JKmlvOwotICAgICAgICB1bnNpZ25lZCBjaGFyCXdyaXRlX2RhdGFbSVBNSV9NQVhfTVNHX0xFTkdUSF07Ci0gICAgICAgIGludAkJd3JpdGVfY291bnQ7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIJcmVhZF9kYXRhW0lQTUlfTUFYX01TR19MRU5HVEhdOwotICAgICAgICBpbnQJCXJlYWRfY291bnQ7Ci0gICAgICAgIGludAkJdHJ1bmNhdGVkOwotICAgICAgICBsb25nCQl0aW1lb3V0OwotICAgICAgICB1bnNpZ25lZCBpbnQJZXJyb3JfcmV0cmllczsJLyogZW5kIG9mICJjb21tb24iIGZpZWxkcyAqLworCXVuc2lnbmVkIGNoYXIJd3JpdGVfZGF0YVtJUE1JX01BWF9NU0dfTEVOR1RIXTsKKwlpbnQJCXdyaXRlX2NvdW50OworCXVuc2lnbmVkIGNoYXIJcmVhZF9kYXRhW0lQTUlfTUFYX01TR19MRU5HVEhdOworCWludAkJcmVhZF9jb3VudDsKKwlpbnQJCXRydW5jYXRlZDsKKwlsb25nCQl0aW1lb3V0OwkvKiBtaWNyb3NlY29uZHMgY291bnRkb3duICovCisJaW50CQllcnJvcl9yZXRyaWVzOwkvKiBlbmQgb2YgImNvbW1vbiIgZmllbGRzICovCiAJaW50CQlub256ZXJvX3N0YXR1czsJLyogaHVuZyBCTUNzIHN0YXkgYWxsIDAgKi8KKwllbnVtIGJ0X3N0YXRlcwljb21wbGV0ZTsJLyogdG8gZGl2ZXJ0IHRoZSBzdGF0ZSBtYWNoaW5lICovCisJaW50CQlCVF9DQVBfb3V0cmVxczsKKwlsb25nCQlCVF9DQVBfcmVxMnJzcDsKKwlpbnQJCUJUX0NBUF9yZXRyaWVzOwkvKiBSZWNvbW1lbmRlZCByZXRyaWVzICovCiB9OwogCiAjZGVmaW5lIEJUX0NMUl9XUl9QVFIJMHgwMQkvKiBTZWUgSVBNSSAxLjUgdGFibGUgMTEuNi40ICovCkBAIC0xMTEsODYgKzEzMSwxMTggQEAKIHN0YXRpYyBjaGFyICpzdGF0ZTJ0eHQodW5zaWduZWQgY2hhciBzdGF0ZSkKIHsKIAlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgQlRfU1RBVEVfSURMRToJCXJldHVybigiSURMRSIpOwotCQljYXNlIEJUX1NUQVRFX1hBQ1RJT05fU1RBUlQ6CXJldHVybigiWEFDVElPTiIpOwotCQljYXNlIEJUX1NUQVRFX1dSSVRFX0JZVEVTOglyZXR1cm4oIldSX0JZVEVTIik7Ci0JCWNhc2UgQlRfU1RBVEVfV1JJVEVfRU5EOglyZXR1cm4oIldSX0VORCIpOwotCQljYXNlIEJUX1NUQVRFX1dSSVRFX0NPTlNVTUU6CXJldHVybigiV1JfQ09OU1VNRSIpOwotCQljYXNlIEJUX1NUQVRFX0IySF9XQUlUOgkJcmV0dXJuKCJCMkhfV0FJVCIpOwotCQljYXNlIEJUX1NUQVRFX1JFQURfRU5EOgkJcmV0dXJuKCJSRF9FTkQiKTsKLQkJY2FzZSBCVF9TVEFURV9SRVNFVDE6CQlyZXR1cm4oIlJFU0VUMSIpOwotCQljYXNlIEJUX1NUQVRFX1JFU0VUMjoJCXJldHVybigiUkVTRVQyIik7Ci0JCWNhc2UgQlRfU1RBVEVfUkVTRVQzOgkJcmV0dXJuKCJSRVNFVDMiKTsKLQkJY2FzZSBCVF9TVEFURV9SRVNUQVJUOgkJcmV0dXJuKCJSRVNUQVJUIik7Ci0JCWNhc2UgQlRfU1RBVEVfSE9TRUQ6CQlyZXR1cm4oIkhPU0VEIik7CisJY2FzZSBCVF9TVEFURV9JRExFOgkJcmV0dXJuKCJJRExFIik7CisJY2FzZSBCVF9TVEFURV9YQUNUSU9OX1NUQVJUOglyZXR1cm4oIlhBQ1RJT04iKTsKKwljYXNlIEJUX1NUQVRFX1dSSVRFX0JZVEVTOglyZXR1cm4oIldSX0JZVEVTIik7CisJY2FzZSBCVF9TVEFURV9XUklURV9DT05TVU1FOglyZXR1cm4oIldSX0NPTlNVTUUiKTsKKwljYXNlIEJUX1NUQVRFX1JFQURfV0FJVDoJcmV0dXJuKCJSRF9XQUlUIik7CisJY2FzZSBCVF9TVEFURV9DTEVBUl9CMkg6CXJldHVybigiQ0xFQVJfQjJIIik7CisJY2FzZSBCVF9TVEFURV9SRUFEX0JZVEVTOglyZXR1cm4oIlJEX0JZVEVTIik7CisJY2FzZSBCVF9TVEFURV9SRVNFVDE6CQlyZXR1cm4oIlJFU0VUMSIpOworCWNhc2UgQlRfU1RBVEVfUkVTRVQyOgkJcmV0dXJuKCJSRVNFVDIiKTsKKwljYXNlIEJUX1NUQVRFX1JFU0VUMzoJCXJldHVybigiUkVTRVQzIik7CisJY2FzZSBCVF9TVEFURV9SRVNUQVJUOgkJcmV0dXJuKCJSRVNUQVJUIik7CisJY2FzZSBCVF9TVEFURV9MT05HX0JVU1k6CXJldHVybigiTE9OR19CVVNZIik7CisJY2FzZSBCVF9TVEFURV9DQVBBQklMSVRJRVNfQkVHSU46IHJldHVybigiQ0FQX0JFR0lOIik7CisJY2FzZSBCVF9TVEFURV9DQVBBQklMSVRJRVNfRU5EOglyZXR1cm4oIkNBUF9FTkQiKTsKIAl9CiAJcmV0dXJuKCJCQUQgU1RBVEUiKTsKIH0KICNkZWZpbmUgU1RBVEUyVFhUIHN0YXRlMnR4dChidC0+c3RhdGUpCiAKLXN0YXRpYyBjaGFyICpzdGF0dXMydHh0KHVuc2lnbmVkIGNoYXIgc3RhdHVzLCBjaGFyICpidWYpCitzdGF0aWMgY2hhciAqc3RhdHVzMnR4dCh1bnNpZ25lZCBjaGFyIHN0YXR1cykKIHsKKwkvKgorCSAqIFRoaXMgY2Fubm90IGJlIGNhbGxlZCBieSB0d28gdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lIGFuZAorCSAqIHRoZSBidWZmZXIgaXMgYWx3YXlzIGNvbnN1bWVkIGltbWVkaWF0ZWx5LCBzbyB0aGUgc3RhdGljIGlzCisJICogc2FmZSB0byB1c2UuCisJICovCisJc3RhdGljIGNoYXIgYnVmWzQwXTsKKwogCXN0cmNweShidWYsICJbICIpOwotCWlmIChzdGF0dXMgJiBCVF9CX0JVU1kpIHN0cmNhdChidWYsICJCX0JVU1kgIik7Ci0JaWYgKHN0YXR1cyAmIEJUX0hfQlVTWSkgc3RyY2F0KGJ1ZiwgIkhfQlVTWSAiKTsKLQlpZiAoc3RhdHVzICYgQlRfT0VNMCkgc3RyY2F0KGJ1ZiwgIk9FTTAgIik7Ci0JaWYgKHN0YXR1cyAmIEJUX1NNU19BVE4pIHN0cmNhdChidWYsICJTTVMgIik7Ci0JaWYgKHN0YXR1cyAmIEJUX0IySF9BVE4pIHN0cmNhdChidWYsICJCMkggIik7Ci0JaWYgKHN0YXR1cyAmIEJUX0gyQl9BVE4pIHN0cmNhdChidWYsICJIMkIgIik7CisJaWYgKHN0YXR1cyAmIEJUX0JfQlVTWSkKKwkJc3RyY2F0KGJ1ZiwgIkJfQlVTWSAiKTsKKwlpZiAoc3RhdHVzICYgQlRfSF9CVVNZKQorCQlzdHJjYXQoYnVmLCAiSF9CVVNZICIpOworCWlmIChzdGF0dXMgJiBCVF9PRU0wKQorCQlzdHJjYXQoYnVmLCAiT0VNMCAiKTsKKwlpZiAoc3RhdHVzICYgQlRfU01TX0FUTikKKwkJc3RyY2F0KGJ1ZiwgIlNNUyAiKTsKKwlpZiAoc3RhdHVzICYgQlRfQjJIX0FUTikKKwkJc3RyY2F0KGJ1ZiwgIkIySCAiKTsKKwlpZiAoc3RhdHVzICYgQlRfSDJCX0FUTikKKwkJc3RyY2F0KGJ1ZiwgIkgyQiAiKTsKIAlzdHJjYXQoYnVmLCAiXSIpOwogCXJldHVybiBidWY7CiB9Ci0jZGVmaW5lIFNUQVRVUzJUWFQoYnVmKSBzdGF0dXMydHh0KHN0YXR1cywgYnVmKQorI2RlZmluZSBTVEFUVVMyVFhUIHN0YXR1czJ0eHQoc3RhdHVzKQogCi0vKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoaXMgbW9kdWxlIG9uIGEgaG9zZWQgY29uZGl0aW9uICovCi0jZGVmaW5lIEZJUlNUX1NFUQkwCisvKiBjYWxsZWQgZXh0ZXJuYWxseSBhdCBpbnNtb2QgdGltZSwgYW5kIGludGVybmFsbHkgb24gY2xlYW51cCAqLworCiBzdGF0aWMgdW5zaWduZWQgaW50IGJ0X2luaXRfZGF0YShzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQsIHN0cnVjdCBzaV9zbV9pbyAqaW8pCiB7Ci0JYnQtPnN0YXRlID0gQlRfU1RBVEVfSURMRTsKLQlidC0+bGFzdF9zdGF0ZSA9IEJUX1NUQVRFX0lETEU7Ci0JYnQtPnNlcSA9IEZJUlNUX1NFUTsKLQlidC0+aW8gPSBpbzsKLQlidC0+d3JpdGVfY291bnQgPSAwOwotCWJ0LT5yZWFkX2NvdW50ID0gMDsKLQlidC0+ZXJyb3JfcmV0cmllcyA9IDA7Ci0JYnQtPm5vbnplcm9fc3RhdHVzID0gMDsKLQlidC0+dHJ1bmNhdGVkID0gMDsKLQlidC0+dGltZW91dCA9IEJUX05PUk1BTF9USU1FT1VUOworCW1lbXNldChidCwgMCwgc2l6ZW9mKHN0cnVjdCBzaV9zbV9kYXRhKSk7CisJaWYgKGJ0LT5pbyAhPSBpbykgewkJLyogZXh0ZXJuYWw6IG9uZS10aW1lIG9ubHkgdGhpbmdzICovCisJCWJ0LT5pbyA9IGlvOworCQlidC0+c2VxID0gMDsKKwl9CisJYnQtPnN0YXRlID0gQlRfU1RBVEVfSURMRTsJLyogc3RhcnQgaGVyZSAqLworCWJ0LT5jb21wbGV0ZSA9IEJUX1NUQVRFX0lETEU7CS8qIGVuZCBoZXJlICovCisJYnQtPkJUX0NBUF9yZXEycnNwID0gQlRfTk9STUFMX1RJTUVPVVQgKiAxMDAwMDAwOworCWJ0LT5CVF9DQVBfcmV0cmllcyA9IEJUX05PUk1BTF9SRVRSWV9MSU1JVDsKKwkvKiBCVF9DQVBfb3V0cmVxcyA9PSB6ZXJvIGlzIGEgZmxhZyB0byByZWFkIEJUIENhcGFiaWxpdGllcyAqLwogCXJldHVybiAzOyAvKiBXZSBjbGFpbSAzIGJ5dGVzIG9mIHNwYWNlOyBvdWdodCB0byBjaGVjayBTUE1JIHRhYmxlICovCiB9CiAKKy8qIEphbSBhIGNvbXBsZXRpb24gY29kZSAocHJvYmFibHkgYW4gZXJyb3IpIGludG8gYSByZXNwb25zZSAqLworCitzdGF0aWMgdm9pZCBmb3JjZV9yZXN1bHQoc3RydWN0IHNpX3NtX2RhdGEgKmJ0LCB1bnNpZ25lZCBjaGFyIGNvbXBsZXRpb25fY29kZSkKK3sKKwlidC0+cmVhZF9kYXRhWzBdID0gNDsJCQkJLyogIyBmb2xsb3dpbmcgYnl0ZXMgKi8KKwlidC0+cmVhZF9kYXRhWzFdID0gYnQtPndyaXRlX2RhdGFbMV0gfCA0OwkvKiBPZGQgTmV0Rm4vTFVOICovCisJYnQtPnJlYWRfZGF0YVsyXSA9IGJ0LT53cml0ZV9kYXRhWzJdOwkJLyogc2VxIChpZ25vcmVkKSAqLworCWJ0LT5yZWFkX2RhdGFbM10gPSBidC0+d3JpdGVfZGF0YVszXTsJCS8qIENvbW1hbmQgKi8KKwlidC0+cmVhZF9kYXRhWzRdID0gY29tcGxldGlvbl9jb2RlOworCWJ0LT5yZWFkX2NvdW50ID0gNTsKK30KKworLyogVGhlIHVwcGVyIHN0YXRlIG1hY2hpbmUgc3RhcnRzIGhlcmUgKi8KKwogc3RhdGljIGludCBidF9zdGFydF90cmFuc2FjdGlvbihzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQsCiAJCQkJdW5zaWduZWQgY2hhciAqZGF0YSwKIAkJCQl1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWlmICgoc2l6ZSA8IDIpIHx8IChzaXplID4gKElQTUlfTUFYX01TR19MRU5HVEggLSAyKSkpCi0JICAgICAgIHJldHVybiAtMTsKKwlpZiAoc2l6ZSA8IDIpCisJCXJldHVybiBJUE1JX1JFUV9MRU5fSU5WQUxJRF9FUlI7CisJaWYgKHNpemUgPiBJUE1JX01BWF9NU0dfTEVOR1RIKQorCQlyZXR1cm4gSVBNSV9SRVFfTEVOX0VYQ0VFREVEX0VSUjsKIAotCWlmICgoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0lETEUpICYmIChidC0+c3RhdGUgIT0gQlRfU1RBVEVfSE9TRUQpKQotCQlyZXR1cm4gLTI7CisJaWYgKGJ0LT5zdGF0ZSA9PSBCVF9TVEFURV9MT05HX0JVU1kpCisJCXJldHVybiBJUE1JX05PREVfQlVTWV9FUlI7CisKKwlpZiAoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0lETEUpCisJCXJldHVybiBJUE1JX05PVF9JTl9NWV9TVEFURV9FUlI7CiAKIAlpZiAoYnRfZGVidWcgJiBCVF9ERUJVR19NU0cpIHsKLSAgICAJCXByaW50ayhLRVJOX1dBUk5JTkcgIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogd3JpdGUgc2VxPTB4JTAyWDoiLCBidC0+c2VxKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6ICsrKysrKysrKysrKysrKysrIE5ldyBjb21tYW5kXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IE5ldEZuL0xVTiBDTUQgWyVkIGRhdGFdOiIsIHNpemUgLSAyKTsKIAkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKyspCi0JCSAgICAgICBwcmludGsgKCIgJTAyeCIsIGRhdGFbaV0pOworCQkJcHJpbnRrICgiICUwMngiLCBkYXRhW2ldKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KIAlidC0+d3JpdGVfZGF0YVswXSA9IHNpemUgKyAxOwkvKiBhbGwgZGF0YSBwbHVzIHNlcSBieXRlICovCiAJYnQtPndyaXRlX2RhdGFbMV0gPSAqZGF0YTsJLyogTmV0Rm4vTFVOICovCi0JYnQtPndyaXRlX2RhdGFbMl0gPSBidC0+c2VxOworCWJ0LT53cml0ZV9kYXRhWzJdID0gYnQtPnNlcSsrOwogCW1lbWNweShidC0+d3JpdGVfZGF0YSArIDMsIGRhdGEgKyAxLCBzaXplIC0gMSk7CiAJYnQtPndyaXRlX2NvdW50ID0gc2l6ZSArIDI7Ci0KIAlidC0+ZXJyb3JfcmV0cmllcyA9IDA7CiAJYnQtPm5vbnplcm9fc3RhdHVzID0gMDsKLQlidC0+cmVhZF9jb3VudCA9IDA7CiAJYnQtPnRydW5jYXRlZCA9IDA7CiAJYnQtPnN0YXRlID0gQlRfU1RBVEVfWEFDVElPTl9TVEFSVDsKLQlidC0+bGFzdF9zdGF0ZSA9IEJUX1NUQVRFX0lETEU7Ci0JYnQtPnRpbWVvdXQgPSBCVF9OT1JNQUxfVElNRU9VVDsKKwlidC0+dGltZW91dCA9IGJ0LT5CVF9DQVBfcmVxMnJzcDsKKwlmb3JjZV9yZXN1bHQoYnQsIElQTUlfRVJSX1VOU1BFQ0lGSUVEKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk4LDM4ICsyNTAsMzAgQEAKICAgIGl0IGNhbGxzIHRoaXMuICBTdHJpcCBvdXQgdGhlIGxlbmd0aCBhbmQgc2VxIGJ5dGVzLiAqLwogCiBzdGF0aWMgaW50IGJ0X2dldF9yZXN1bHQoc3RydWN0IHNpX3NtX2RhdGEgKmJ0LAotCQkJICAgdW5zaWduZWQgY2hhciAqZGF0YSwKLQkJCSAgIHVuc2lnbmVkIGludCBsZW5ndGgpCisJCQkgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCWludCBpLCBtc2dfbGVuOwogCiAJbXNnX2xlbiA9IGJ0LT5yZWFkX2NvdW50IC0gMjsJCS8qIGFjY291bnQgZm9yIGxlbmd0aCAmIHNlcSAqLwotCS8qIEFsd2F5cyBOZXRGbiwgQ21kLCBjQ29kZSAqLwogCWlmIChtc2dfbGVuIDwgMyB8fCBtc2dfbGVuID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiQlQgcmVzdWx0czogYmFkIG1zZ19sZW4gPSAlZFxuIiwgbXNnX2xlbik7Ci0JCWRhdGFbMF0gPSBidC0+d3JpdGVfZGF0YVsxXSB8IDB4NDsJLyogS2x1ZGdlIGEgcmVzcG9uc2UgKi8KLQkJZGF0YVsxXSA9IGJ0LT53cml0ZV9kYXRhWzNdOwotCQlkYXRhWzJdID0gSVBNSV9FUlJfVU5TUEVDSUZJRUQ7CisJCWZvcmNlX3Jlc3VsdChidCwgSVBNSV9FUlJfVU5TUEVDSUZJRUQpOwogCQltc2dfbGVuID0gMzsKLQl9IGVsc2UgewotCQlkYXRhWzBdID0gYnQtPnJlYWRfZGF0YVsxXTsKLQkJZGF0YVsxXSA9IGJ0LT5yZWFkX2RhdGFbM107Ci0JCWlmIChsZW5ndGggPCBtc2dfbGVuKQotCQkgICAgICAgYnQtPnRydW5jYXRlZCA9IDE7Ci0JCWlmIChidC0+dHJ1bmNhdGVkKSB7CS8qIGNhbiBiZSBzZXQgaW4gcmVhZF9hbGxfYnl0ZXMoKSAqLwotCQkJZGF0YVsyXSA9IElQTUlfRVJSX01TR19UUlVOQ0FURUQ7Ci0JCQltc2dfbGVuID0gMzsKLQkJfSBlbHNlCi0JCSAgICAgICBtZW1jcHkoZGF0YSArIDIsIGJ0LT5yZWFkX2RhdGEgKyA0LCBtc2dfbGVuIC0gMik7Ci0KLQkJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSB7Ci0JCQlwcmludGsgKEtFUk5fV0FSTklORyAiQlQ6IHJlcyAocmF3KSIpOwotCQkJZm9yIChpID0gMDsgaSA8IG1zZ19sZW47IGkrKykKLQkJCSAgICAgICBwcmludGsoIiAlMDJ4IiwgZGF0YVtpXSk7Ci0JCQlwcmludGsgKCJcbiIpOwotCQl9CiAJfQotCWJ0LT5yZWFkX2NvdW50ID0gMDsJLyogcGFyYW5vaWEgKi8KKwlkYXRhWzBdID0gYnQtPnJlYWRfZGF0YVsxXTsKKwlkYXRhWzFdID0gYnQtPnJlYWRfZGF0YVszXTsKKwlpZiAobGVuZ3RoIDwgbXNnX2xlbiB8fCBidC0+dHJ1bmNhdGVkKSB7CisJCWRhdGFbMl0gPSBJUE1JX0VSUl9NU0dfVFJVTkNBVEVEOworCQltc2dfbGVuID0gMzsKKwl9IGVsc2UKKwkJbWVtY3B5KGRhdGEgKyAyLCBidC0+cmVhZF9kYXRhICsgNCwgbXNnX2xlbiAtIDIpOworCisJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCVDogcmVzdWx0ICVkIGJ5dGVzOiIsIG1zZ19sZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgbXNnX2xlbjsgaSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsIGRhdGFbaV0pOworCQlwcmludGsgKCJcbiIpOworCX0KIAlyZXR1cm4gbXNnX2xlbjsKIH0KIApAQCAtMjM4LDIyICsyODIsNDAgQEAKIAogc3RhdGljIHZvaWQgcmVzZXRfZmxhZ3Moc3RydWN0IHNpX3NtX2RhdGEgKmJ0KQogeworCWlmIChidF9kZWJ1ZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVBNSSBCVDogZmxhZyByZXNldCAlc1xuIiwKKwkJCQkJc3RhdHVzMnR4dChCVF9TVEFUVVMpKTsKIAlpZiAoQlRfU1RBVFVTICYgQlRfSF9CVVNZKQotCSAgICAgICBCVF9DT05UUk9MKEJUX0hfQlVTWSk7Ci0JaWYgKEJUX1NUQVRVUyAmIEJUX0JfQlVTWSkKLQkgICAgICAgQlRfQ09OVFJPTChCVF9CX0JVU1kpOwotCUJUX0NPTlRST0woQlRfQ0xSX1dSX1BUUik7Ci0JQlRfQ09OVFJPTChCVF9TTVNfQVROKTsKKwkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOwkvKiBmb3JjZSBjbGVhciAqLworCUJUX0NPTlRST0woQlRfQ0xSX1dSX1BUUik7CS8qIGFsd2F5cyByZXNldCAqLworCUJUX0NPTlRST0woQlRfU01TX0FUTik7CQkvKiBhbHdheXMgY2xlYXIgKi8KKwlCVF9JTlRNQVNLX1coQlRfQk1DX0hXUlNUKTsKK30KIAotCWlmIChCVF9TVEFUVVMgJiBCVF9CMkhfQVROKSB7Ci0JCWludCBpOwotCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7Ci0JCUJUX0NPTlRST0woQlRfQjJIX0FUTik7Ci0JCUJUX0NPTlRST0woQlRfQ0xSX1JEX1BUUik7Ci0JCWZvciAoaSA9IDA7IGkgPCBJUE1JX01BWF9NU0dfTEVOR1RIICsgMjsgaSsrKQotCQkgICAgICAgQk1DMkhPU1Q7Ci0JCUJUX0NPTlRST0woQlRfSF9CVVNZKTsKLQl9CisvKiBHZXQgcmlkIG9mIGFuIHVud2FudGVkL3N0YWxlIHJlc3BvbnNlLiAgVGhpcyBzaG91bGQgb25seSBiZSBuZWVkZWQgZm9yCisgICBCTUNzIHRoYXQgc3VwcG9ydCBtdWx0aXBsZSBvdXRzdGFuZGluZyByZXF1ZXN0cy4gKi8KKworc3RhdGljIHZvaWQgZHJhaW5fQk1DMkhPU1Qoc3RydWN0IHNpX3NtX2RhdGEgKmJ0KQoreworCWludCBpLCBzaXplOworCisJaWYgKCEoQlRfU1RBVFVTICYgQlRfQjJIX0FUTikpIAkvKiBOb3Qgc2lnbmFsbGluZyBhIHJlc3BvbnNlICovCisJCXJldHVybjsKKworCUJUX0NPTlRST0woQlRfSF9CVVNZKTsJCS8qIG5vdyBzZXQgKi8KKwlCVF9DT05UUk9MKEJUX0IySF9BVE4pOwkJLyogYWx3YXlzIGNsZWFyICovCisJQlRfU1RBVFVTOwkJCS8qIHBhdXNlICovCisJQlRfQ09OVFJPTChCVF9CMkhfQVROKTsJCS8qIHNvbWUgQk1DcyBhcmUgc3R1YmJvcm4gKi8KKwlCVF9DT05UUk9MKEJUX0NMUl9SRF9QVFIpOwkvKiBhbHdheXMgcmVzZXQgKi8KKwlpZiAoYnRfZGVidWcpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklQTUkgQlQ6IHN0YWxlIHJlc3BvbnNlICVzOyAiLAorCQkJc3RhdHVzMnR4dChCVF9TVEFUVVMpKTsKKwlzaXplID0gQk1DMkhPU1Q7CisJZm9yIChpID0gMDsgaSA8IHNpemUgOyBpKyspCisJCUJNQzJIT1NUOworCUJUX0NPTlRST0woQlRfSF9CVVNZKTsJCS8qIG5vdyBjbGVhciAqLworCWlmIChidF9kZWJ1ZykKKwkJcHJpbnRrKCJkcmFpbmVkICVkIGJ5dGVzXG4iLCBzaXplICsgMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9hbGxfYnl0ZXMoc3RydWN0IHNpX3NtX2RhdGEgKmJ0KQpAQCAtMjYxLDIwMSArMzIzLDI1NiBAQAogCWludCBpOwogCiAJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKSB7Ci0gICAgCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogd3JpdGUgJWQgYnl0ZXMgc2VxPTB4JTAyWCIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUOiB3cml0ZSAlZCBieXRlcyBzZXE9MHglMDJYIiwKIAkJCWJ0LT53cml0ZV9jb3VudCwgYnQtPnNlcSk7CiAJCWZvciAoaSA9IDA7IGkgPCBidC0+d3JpdGVfY291bnQ7IGkrKykKIAkJCXByaW50ayAoIiAlMDJ4IiwgYnQtPndyaXRlX2RhdGFbaV0pOwogCQlwcmludGsgKCJcbiIpOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgYnQtPndyaXRlX2NvdW50OyBpKyspCi0JICAgICAgIEhPU1QyQk1DKGJ0LT53cml0ZV9kYXRhW2ldKTsKKwkJSE9TVDJCTUMoYnQtPndyaXRlX2RhdGFbaV0pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCByZWFkX2FsbF9ieXRlcyhzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQpCiB7CiAJdW5zaWduZWQgY2hhciBpOwogCisJLyogbGVuZ3RoIGlzICJmcmFtaW5nIGluZm8iLCBtaW5pbXVtID0gNDogTmV0Rm4sIFNlcSwgQ21kLCBjQ29kZS4KKwkgICBLZWVwIGxheW91dCBvZiBmaXJzdCBmb3VyIGJ5dGVzIGFsaWduZWQgd2l0aCB3cml0ZV9kYXRhW10gKi8KKwogCWJ0LT5yZWFkX2RhdGFbMF0gPSBCTUMySE9TVDsKIAlidC0+cmVhZF9jb3VudCA9IGJ0LT5yZWFkX2RhdGFbMF07Ci0JaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKQotICAgIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IHJlYWQgJWQgYnl0ZXM6IiwgYnQtPnJlYWRfY291bnQpOwogCi0JLyogbWluaW11bTogbGVuZ3RoLCBOZXRGbiwgU2VxLCBDbWQsIGNDb2RlID09IDUgdG90YWwsIG9yIDQgbW9yZQotCSAgIGZvbGxvd2luZyB0aGUgbGVuZ3RoIGJ5dGUuICovCiAJaWYgKGJ0LT5yZWFkX2NvdW50IDwgNCB8fCBidC0+cmVhZF9jb3VudCA+PSBJUE1JX01BWF9NU0dfTEVOR1RIKSB7CiAJCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykKLQkJCXByaW50aygiYmFkIGxlbmd0aCAlZFxuIiwgYnQtPnJlYWRfY291bnQpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQlQ6IGJhZCByYXcgcnNwIGxlbj0lZFxuIiwKKwkJCQlidC0+cmVhZF9jb3VudCk7CiAJCWJ0LT50cnVuY2F0ZWQgPSAxOwogCQlyZXR1cm4gMTsJLyogbGV0IG5leHQgWEFDVElPTiBTVEFSVCBjbGVhbiBpdCB1cCAqLwogCX0KIAlmb3IgKGkgPSAxOyBpIDw9IGJ0LT5yZWFkX2NvdW50OyBpKyspCi0JICAgICAgIGJ0LT5yZWFkX2RhdGFbaV0gPSBCTUMySE9TVDsKLQlidC0+cmVhZF9jb3VudCsrOwkvKiBhY2NvdW50IGZvciB0aGUgbGVuZ3RoIGJ5dGUgKi8KKwkJYnQtPnJlYWRfZGF0YVtpXSA9IEJNQzJIT1NUOworCWJ0LT5yZWFkX2NvdW50Kys7CS8qIEFjY291bnQgaW50ZXJuYWxseSBmb3IgbGVuZ3RoIGJ5dGUgKi8KIAogCWlmIChidF9kZWJ1ZyAmIEJUX0RFQlVHX01TRykgewotCSAgICAJZm9yIChpID0gMDsgaSA8IGJ0LT5yZWFkX2NvdW50OyBpKyspCi0JCQlwcmludGsgKCIgJTAyeCIsIGJ0LT5yZWFkX2RhdGFbaV0pOwotCSAgICAJcHJpbnRrICgiXG4iKTsKLQl9Ci0JaWYgKGJ0LT5zZXEgIT0gYnQtPndyaXRlX2RhdGFbMl0pCS8qIGlkaW90IGNoZWNrICovCi0JCXByaW50ayhLRVJOX0RFQlVHICJCVDogaW50ZXJuYWwgZXJyb3I6IHNlcXVlbmNlIG1pc21hdGNoXG4iKTsKKwkJaW50IG1heCA9IGJ0LT5yZWFkX2NvdW50OwogCi0JLyogcGVyIHRoZSBzcGVjLCB0aGUgKE5ldEZuLCBTZXEsIENtZCkgdHVwbGVzIHNob3VsZCBtYXRjaCAqLwotCWlmICgoYnQtPnJlYWRfZGF0YVszXSA9PSBidC0+d3JpdGVfZGF0YVszXSkgJiYJCS8qIENtZCAqLwotICAgICAgICAJKGJ0LT5yZWFkX2RhdGFbMl0gPT0gYnQtPndyaXRlX2RhdGFbMl0pICYmCS8qIFNlcXVlbmNlICovCi0gICAgICAgIAkoKGJ0LT5yZWFkX2RhdGFbMV0gJiAweEY4KSA9PSAoYnQtPndyaXRlX2RhdGFbMV0gJiAweEY4KSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJUOiBnb3QgJWQgYnl0ZXMgc2VxPTB4JTAyWCIsCisJCQltYXgsIGJ0LT5yZWFkX2RhdGFbMl0pOworCQlpZiAobWF4ID4gMTYpCisJCQltYXggPSAxNjsKKwkJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQorCQkJcHJpbnRrICgiICUwMngiLCBidC0+cmVhZF9kYXRhW2ldKTsKKwkJcHJpbnRrICgiJXNcbiIsIGJ0LT5yZWFkX2NvdW50ID09IG1heCA/ICIiIDogIiAuLi4iKTsKKwl9CisKKwkvKiBwZXIgdGhlIHNwZWMsIHRoZSAoTmV0Rm5bMV0sIFNlcVsyXSwgQ21kWzNdKSB0dXBsZXMgbXVzdCBtYXRjaCAqLworCWlmICgoYnQtPnJlYWRfZGF0YVszXSA9PSBidC0+d3JpdGVfZGF0YVszXSkgJiYKKwkgICAgKGJ0LT5yZWFkX2RhdGFbMl0gPT0gYnQtPndyaXRlX2RhdGFbMl0pICYmCisJICAgICgoYnQtPnJlYWRfZGF0YVsxXSAmIDB4RjgpID09IChidC0+d3JpdGVfZGF0YVsxXSAmIDB4RjgpKSkKIAkJCXJldHVybiAxOwogCiAJaWYgKGJ0X2RlYnVnICYgQlRfREVCVUdfTVNHKQotCSAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJCVDogYmFkIHBhY2tldDogIgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJJUE1JIEJUOiBiYWQgcGFja2V0OiAiCiAJCSJ3YW50IDB4KCUwMlgsICUwMlgsICUwMlgpIGdvdCAoJTAyWCwgJTAyWCwgJTAyWClcbiIsCi0JCWJ0LT53cml0ZV9kYXRhWzFdLCBidC0+d3JpdGVfZGF0YVsyXSwgYnQtPndyaXRlX2RhdGFbM10sCisJCWJ0LT53cml0ZV9kYXRhWzFdIHwgMHgwNCwgYnQtPndyaXRlX2RhdGFbMl0sIGJ0LT53cml0ZV9kYXRhWzNdLAogCQlidC0+cmVhZF9kYXRhWzFdLCAgYnQtPnJlYWRfZGF0YVsyXSwgIGJ0LT5yZWFkX2RhdGFbM10pOwogCXJldHVybiAwOwogfQogCi0vKiBNb2RpZmllcyBidC0+c3RhdGUgYXBwcm9wcmlhdGVseSwgbmVlZCB0byBnZXQgaW50byB0aGUgYnRfZXZlbnQoKSBzd2l0Y2ggKi8KKy8qIFJlc3RhcnQgaWYgcmV0cmllcyBhcmUgbGVmdCwgb3IgcmV0dXJuIGFuIGVycm9yIGNvbXBsZXRpb24gY29kZSAqLwogCi1zdGF0aWMgdm9pZCBlcnJvcl9yZWNvdmVyeShzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQsIGNoYXIgKnJlYXNvbikKK3N0YXRpYyBlbnVtIHNpX3NtX3Jlc3VsdCBlcnJvcl9yZWNvdmVyeShzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQsCisJCQkJCXVuc2lnbmVkIGNoYXIgc3RhdHVzLAorCQkJCQl1bnNpZ25lZCBjaGFyIGNDb2RlKQogewotCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwotCWNoYXIgYnVmWzQwXTsgLyogRm9yIGdldHRpbmcgc3RhdHVzICovCisJY2hhciAqcmVhc29uOwogCi0JYnQtPnRpbWVvdXQgPSBCVF9OT1JNQUxfVElNRU9VVDsgLyogdmFyaW91cyBwbGFjZXMgd2FudCB0byByZXRyeSAqLworCWJ0LT50aW1lb3V0ID0gYnQtPkJUX0NBUF9yZXEycnNwOwogCi0Jc3RhdHVzID0gQlRfU1RBVFVTOwotCXByaW50ayhLRVJOX0RFQlVHICJCVDogJXMgaW4gJXMgJXNcbiIsIHJlYXNvbiwgU1RBVEUyVFhULAotCSAgICAgICBTVEFUVVMyVFhUKGJ1ZikpOworCXN3aXRjaCAoY0NvZGUpIHsKKwljYXNlIElQTUlfVElNRU9VVF9FUlI6CisJCXJlYXNvbiA9ICJ0aW1lb3V0IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVhc29uID0gImludGVybmFsIGVycm9yIjsKKwkJYnJlYWs7CisJfQogCisJcHJpbnRrKEtFUk5fV0FSTklORyAiSVBNSSBCVDogJXMgaW4gJXMgJXMgIiwgCS8qIG9wZW4tZW5kZWQgbGluZSAqLworCQlyZWFzb24sIFNUQVRFMlRYVCwgU1RBVFVTMlRYVCk7CisKKwkvKiBQZXIgdGhlIElQTUkgc3BlYywgcmV0cmllcyBhcmUgYmFzZWQgb24gdGhlIHNlcXVlbmNlIG51bWJlcgorCSAgIGtub3duIG9ubHkgdG8gdGhpcyBtb2R1bGUsIHNvIG1hbmFnZSBhIHJlc3RhcnQgaGVyZS4gKi8KIAkoYnQtPmVycm9yX3JldHJpZXMpKys7Ci0JaWYgKGJ0LT5lcnJvcl9yZXRyaWVzID4gQlRfUkVUUllfTElNSVQpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJldHJ5IGxpbWl0ICglZCkgZXhjZWVkZWRcbiIsIEJUX1JFVFJZX0xJTUlUKTsKLQkJYnQtPnN0YXRlID0gQlRfU1RBVEVfSE9TRUQ7Ci0JCWlmICghYnQtPm5vbnplcm9fc3RhdHVzKQotCQkJcHJpbnRrKEtFUk5fRVJSICJJUE1JOiBCVCBzdHVjaywgdHJ5IHBvd2VyIGN5Y2xlXG4iKTsKLQkJZWxzZSBpZiAoYnQtPmVycm9yX3JldHJpZXMgPD0gQlRfUkVUUllfTElNSVQgKyAxKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiSVBNSTogQlQgcmVzZXQgKHRha2VzIDUgc2VjcylcbiIpOwotICAgICAgICAJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1JFU0VUMTsKKwlpZiAoYnQtPmVycm9yX3JldHJpZXMgPCBidC0+QlRfQ0FQX3JldHJpZXMpIHsKKwkJcHJpbnRrKCIlZCByZXRyaWVzIGxlZnRcbiIsCisJCQlidC0+QlRfQ0FQX3JldHJpZXMgLSBidC0+ZXJyb3JfcmV0cmllcyk7CisJCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1JFU1RBUlQ7CisJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7CisJfQorCisJcHJpbnRrKCJmYWlsZWQgJWQgcmV0cmllcywgc2VuZGluZyBlcnJvciByZXNwb25zZVxuIiwKKwkJYnQtPkJUX0NBUF9yZXRyaWVzKTsKKwlpZiAoIWJ0LT5ub256ZXJvX3N0YXR1cykKKwkJcHJpbnRrKEtFUk5fRVJSICJJUE1JIEJUOiBzdHVjaywgdHJ5IHBvd2VyIGN5Y2xlXG4iKTsKKworCS8qIHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVyaW5nIGluc21vZCAqLworCWVsc2UgaWYgKGJ0LT5zZXEgPD0gKHVuc2lnbmVkIGNoYXIpKGJ0LT5CVF9DQVBfcmV0cmllcyAmIDB4RkYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklQTUk6IEJUIHJlc2V0ICh0YWtlcyA1IHNlY3MpXG4iKTsKKwkJYnQtPnN0YXRlID0gQlRfU1RBVEVfUkVTRVQxOworCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOworCX0KKworCS8qIENvbmNvY3QgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZSwgc2V0IHVwIHRoZSBuZXh0IHN0YXRlLCBhbmQKKwkgICBiZSBkb25lIHdpdGggdGhpcyBzZXF1ZW5jZS4gKi8KKworCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX0lETEU7CisJc3dpdGNoIChjQ29kZSkgeworCWNhc2UgSVBNSV9USU1FT1VUX0VSUjoKKwkJaWYgKHN0YXR1cyAmIEJUX0JfQlVTWSkgeworCQkJY0NvZGUgPSBJUE1JX05PREVfQlVTWV9FUlI7CisJCQlidC0+c3RhdGUgPSBCVF9TVEFURV9MT05HX0JVU1k7CiAJCX0KLQlyZXR1cm47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KLQotCS8qIFNvbWV0aW1lcyB0aGUgQk1DIHF1ZXVlcyBnZXQgaW4gYW4gIm9mZi1ieS1vbmUiIHN0YXRlLi4uKi8KLQlpZiAoKGJ0LT5zdGF0ZSA9PSBCVF9TVEFURV9CMkhfV0FJVCkgJiYgKHN0YXR1cyAmIEJUX0IySF9BVE4pKSB7Ci0gICAgCQlwcmludGsoS0VSTl9ERUJVRyAicmV0cnkgQjJIX1dBSVRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpbnRrKEtFUk5fREVCVUcgInJlc3RhcnQgY29tbWFuZFxuIik7Ci0JYnQtPnN0YXRlID0gQlRfU1RBVEVfUkVTVEFSVDsKKwlmb3JjZV9yZXN1bHQoYnQsIGNDb2RlKTsKKwlyZXR1cm4gU0lfU01fVFJBTlNBQ1RJT05fQ09NUExFVEU7CiB9CiAKLS8qIENoZWNrIHRoZSBzdGF0dXMgYW5kIChwb3NzaWJseSkgYWR2YW5jZSB0aGUgQlQgc3RhdGUgbWFjaGluZS4gIFRoZQotICAgZGVmYXVsdCByZXR1cm4gaXMgU0lfU01fQ0FMTF9XSVRIX0RFTEFZLiAqLworLyogQ2hlY2sgc3RhdHVzIGFuZCAodXN1YWxseSkgdGFrZSBhY3Rpb24gYW5kIGNoYW5nZSB0aGlzIHN0YXRlIG1hY2hpbmUuICovCiAKIHN0YXRpYyBlbnVtIHNpX3NtX3Jlc3VsdCBidF9ldmVudChzdHJ1Y3Qgc2lfc21fZGF0YSAqYnQsIGxvbmcgdGltZSkKIHsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1czsKLQljaGFyIGJ1Zls0MF07IC8qIEZvciBnZXR0aW5nIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgc3RhdHVzLCBCVF9DQVBbOF07CisJc3RhdGljIGVudW0gYnRfc3RhdGVzIGxhc3RfcHJpbnRlZCA9IEJUX1NUQVRFX1BSSU5UTUU7CiAJaW50IGk7CiAKIAlzdGF0dXMgPSBCVF9TVEFUVVM7CiAJYnQtPm5vbnplcm9fc3RhdHVzIHw9IHN0YXR1czsKLQotCWlmICgoYnRfZGVidWcgJiBCVF9ERUJVR19TVEFURVMpICYmIChidC0+c3RhdGUgIT0gYnQtPmxhc3Rfc3RhdGUpKQorCWlmICgoYnRfZGVidWcgJiBCVF9ERUJVR19TVEFURVMpICYmIChidC0+c3RhdGUgIT0gbGFzdF9wcmludGVkKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVDogJXMgJXMgVE89JWxkIC0gJWxkIFxuIiwKIAkJCVNUQVRFMlRYVCwKLQkJCVNUQVRVUzJUWFQoYnVmKSwKKwkJCVNUQVRVUzJUWFQsCiAJCQlidC0+dGltZW91dCwKIAkJCXRpbWUpOwotCWJ0LT5sYXN0X3N0YXRlID0gYnQtPnN0YXRlOworCQlsYXN0X3ByaW50ZWQgPSBidC0+c3RhdGU7CisJfQogCi0JaWYgKGJ0LT5zdGF0ZSA9PSBCVF9TVEFURV9IT1NFRCkKLQkgICAgICAgcmV0dXJuIFNJX1NNX0hPU0VEOworCS8qIENvbW1hbmRzIHRoYXQgdGltZSBvdXQgbWF5IHN0aWxsIChldmVudHVhbGx5KSBwcm92aWRlIGEgcmVzcG9uc2UuCisJICAgVGhpcyBzdGFsZSByZXNwb25zZSB3aWxsIGdldCBpbiB0aGUgd2F5IG9mIGEgbmV3IHJlc3BvbnNlIHNvIHJlbW92ZQorCSAgIGl0IGlmIHBvc3NpYmxlIChob3BlZnVsbHkgZHVyaW5nIElETEUpLiAgRXZlbiBpZiBpdCBjb21lcyB1cCBsYXRlcgorCSAgIGl0IHdpbGwgYmUgcmVqZWN0ZWQgYnkgaXRzIChub3ctZm9yZ290dGVuKSBzZXEgbnVtYmVyLiAqLwogCi0JaWYgKGJ0LT5zdGF0ZSAhPSBCVF9TVEFURV9JRExFKSB7CS8qIGRvIHRpbWVvdXQgdGVzdCAqLworCWlmICgoYnQtPnN0YXRlIDwgQlRfU1RBVEVfV1JJVEVfQllURVMpICYmIChzdGF0dXMgJiBCVF9CMkhfQVROKSkgeworCQlkcmFpbl9CTUMySE9TVChidCk7CisJCUJUX1NJX1NNX1JFVFVSTihTSV9TTV9DQUxMX1dJVEhfREVMQVkpOworCX0KKworCWlmICgoYnQtPnN0YXRlICE9IEJUX1NUQVRFX0lETEUpICYmCisJICAgIChidC0+c3RhdGUgPCAgQlRfU1RBVEVfUFJJTlRNRSkpIHsJCS8qIGNoZWNrIHRpbWVvdXQgKi8KIAkJYnQtPnRpbWVvdXQgLT0gdGltZTsKLQkJaWYgKChidC0+dGltZW91dCA8IDApICYmIChidC0+c3RhdGUgPCBCVF9TVEFURV9SRVNFVDEpKSB7Ci0JCQllcnJvcl9yZWNvdmVyeShidCwgInRpbWVkIG91dCIpOwotCQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsKLQkJfQorCQlpZiAoKGJ0LT50aW1lb3V0IDwgMCkgJiYgKGJ0LT5zdGF0ZSA8IEJUX1NUQVRFX1JFU0VUMSkpCisJCQlyZXR1cm4gZXJyb3JfcmVjb3ZlcnkoYnQsCisJCQkJCSAgICAgIHN0YXR1cywKKwkJCQkJICAgICAgSVBNSV9USU1FT1VUX0VSUik7CiAJfQogCiAJc3dpdGNoIChidC0+c3RhdGUpIHsKIAotICAgIAljYXNlIEJUX1NUQVRFX0lETEU6CS8qIGNoZWNrIGZvciBhc3luY2hyb25vdXMgbWVzc2FnZXMgKi8KKwkvKiBJZGxlIHN0YXRlIGZpcnN0IGNoZWNrcyBmb3IgYXN5bmNocm9ub3VzIG1lc3NhZ2VzIGZyb20gYW5vdGhlcgorCSAgIGNoYW5uZWwsIHRoZW4gZG9lcyBzb21lIG9wcG9ydHVuaXN0aWMgaG91c2VrZWVwaW5nLiAqLworCisJY2FzZSBCVF9TVEFURV9JRExFOgogCQlpZiAoc3RhdHVzICYgQlRfU01TX0FUTikgewogCQkJQlRfQ09OVFJPTChCVF9TTVNfQVROKTsJLyogY2xlYXIgaXQgKi8KIAkJCXJldHVybiBTSV9TTV9BVFROOwogCQl9Ci0JCXJldHVybiBTSV9TTV9JRExFOworCisJCWlmIChzdGF0dXMgJiBCVF9IX0JVU1kpCQkvKiBjbGVhciBhIGxlZnRvdmVyIEhfQlVTWSAqLworCQkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOworCisJCS8qIFJlYWQgQlQgY2FwYWJpbGl0aWVzIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgeWV0ICovCisJCWlmICghYnQtPkJUX0NBUF9vdXRyZXFzKQorCQkJQlRfU1RBVEVfQ0hBTkdFKEJUX1NUQVRFX0NBUEFCSUxJVElFU19CRUdJTiwKKwkJCQkJU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZKTsKKwkJYnQtPnRpbWVvdXQgPSBidC0+QlRfQ0FQX3JlcTJyc3A7CisJCUJUX1NJX1NNX1JFVFVSTihTSV9TTV9JRExFKTsKIAogCWNhc2UgQlRfU1RBVEVfWEFDVElPTl9TVEFSVDoKLQkJaWYgKHN0YXR1cyAmIEJUX0hfQlVTWSkgewotCQkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOwotCQkJYnJlYWs7Ci0JCX0KLSAgICAJCWlmIChzdGF0dXMgJiBCVF9CMkhfQVROKQotCQkgICAgICAgYnJlYWs7Ci0JCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1dSSVRFX0JZVEVTOwotCQlyZXR1cm4gU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOwkvKiBmb3IgbG9nZ2luZyAqLworCQlpZiAoc3RhdHVzICYgKEJUX0JfQlVTWSB8IEJUX0gyQl9BVE4pKQorCQkJQlRfU0lfU01fUkVUVVJOKFNJX1NNX0NBTExfV0lUSF9ERUxBWSk7CisJCWlmIChCVF9TVEFUVVMgJiBCVF9IX0JVU1kpCisJCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CS8qIGZvcmNlIGNsZWFyICovCisJCUJUX1NUQVRFX0NIQU5HRShCVF9TVEFURV9XUklURV9CWVRFUywKKwkJCQlTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVkpOwogCiAJY2FzZSBCVF9TVEFURV9XUklURV9CWVRFUzoKLQkJaWYgKHN0YXR1cyAmIChCVF9CX0JVU1kgfCBCVF9IMkJfQVROKSkKLQkJICAgICAgIGJyZWFrOworCQlpZiAoc3RhdHVzICYgQlRfSF9CVVNZKQorCQkJQlRfQ09OVFJPTChCVF9IX0JVU1kpOwkvKiBjbGVhciAqLwogCQlCVF9DT05UUk9MKEJUX0NMUl9XUl9QVFIpOwogCQl3cml0ZV9hbGxfYnl0ZXMoYnQpOwotCQlCVF9DT05UUk9MKEJUX0gyQl9BVE4pOwkvKiBjbGVhcnMgdG9vIGZhc3QgdG8gY2F0Y2g/ICovCi0JCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1dSSVRFX0NPTlNVTUU7Ci0JCXJldHVybiBTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVk7IC8qIGl0IE1JR0hUIHNhaWwgdGhyb3VnaCAqLworCQlCVF9DT05UUk9MKEJUX0gyQl9BVE4pOwkvKiBjYW4gY2xlYXIgdG9vIGZhc3QgdG8gY2F0Y2ggKi8KKwkJQlRfU1RBVEVfQ0hBTkdFKEJUX1NUQVRFX1dSSVRFX0NPTlNVTUUsCisJCQkJU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZKTsKIAotCWNhc2UgQlRfU1RBVEVfV1JJVEVfQ09OU1VNRTogLyogQk1DcyB1c3VhbGx5IGJsb3cgcmlnaHQgdGhydSBoZXJlICovCi0gICAgICAgIAlpZiAoc3RhdHVzICYgKEJUX0gyQl9BVE4gfCBCVF9CX0JVU1kpKQotCQkgICAgICAgYnJlYWs7Ci0JCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX0IySF9XQUlUOwotCQkvKiBmYWxsIHRocm91Z2ggd2l0aCBzdGF0dXMgKi8KKwljYXNlIEJUX1NUQVRFX1dSSVRFX0NPTlNVTUU6CisJCWlmIChzdGF0dXMgJiAoQlRfQl9CVVNZIHwgQlRfSDJCX0FUTikpCisJCQlCVF9TSV9TTV9SRVRVUk4oU0lfU01fQ0FMTF9XSVRIX0RFTEFZKTsKKwkJQlRfU1RBVEVfQ0hBTkdFKEJUX1NUQVRFX1JFQURfV0FJVCwKKwkJCQlTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVkpOwogCi0JLyogU3RheSBpbiBCVF9TVEFURV9CMkhfV0FJVCB1bnRpbCBhIHBhY2tldCBtYXRjaGVzLiAgSG93ZXZlciwgc3Bpbm5pbmcKLQkgICBoYXJkIGhlcmUsIGNvbnN0YW50bHkgcmVhZGluZyBzdGF0dXMsIHNlZW1zIHRvIGhvbGQgb2ZmIHRoZQotCSAgIGdlbmVyYXRpb24gb2YgQjJIX0FUTiBzbyBBTFdBWVMgcmV0dXJuIENBTExfV0lUSF9ERUxBWS4gKi8KKwkvKiBTcGlubmluZyBoYXJkIGNhbiBzdXBwcmVzcyBCMkhfQVROIGFuZCBmb3JjZSBhIHRpbWVvdXQgKi8KIAotCWNhc2UgQlRfU1RBVEVfQjJIX1dBSVQ6Ci0gICAgCQlpZiAoIShzdGF0dXMgJiBCVF9CMkhfQVROKSkKLQkJICAgICAgIGJyZWFrOworCWNhc2UgQlRfU1RBVEVfUkVBRF9XQUlUOgorCQlpZiAoIShzdGF0dXMgJiBCVF9CMkhfQVROKSkKKwkJCUJUX1NJX1NNX1JFVFVSTihTSV9TTV9DQUxMX1dJVEhfREVMQVkpOworCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CQkvKiBzZXQgKi8KIAotCQkvKiBBc3N1bWUgb3JkZXJlZCwgdW5jYWNoZWQgd3JpdGVzOiBubyBuZWVkIHRvIHdhaXQgKi8KLQkJaWYgKCEoc3RhdHVzICYgQlRfSF9CVVNZKSkKLQkJICAgICAgIEJUX0NPTlRST0woQlRfSF9CVVNZKTsgLyogc2V0ICovCi0JCUJUX0NPTlRST0woQlRfQjJIX0FUTik7CQkvKiBjbGVhciBpdCwgQUNLIHRvIHRoZSBCTUMgKi8KLQkJQlRfQ09OVFJPTChCVF9DTFJfUkRfUFRSKTsJLyogcmVzZXQgdGhlIHF1ZXVlICovCi0JCWkgPSByZWFkX2FsbF9ieXRlcyhidCk7Ci0JCUJUX0NPTlRST0woQlRfSF9CVVNZKTsJCS8qIGNsZWFyICovCi0JCWlmICghaSkJCQkJLyogVHJ5IHRoaXMgc3RhdGUgYWdhaW4gKi8KLQkJICAgICAgIGJyZWFrOwotCQlidC0+c3RhdGUgPSBCVF9TVEFURV9SRUFEX0VORDsKLQkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsJLyogZm9yIGxvZ2dpbmcgKi8KKwkJLyogVW5jYWNoZWQsIG9yZGVyZWQgd3JpdGVzIHNob3VsZCBqdXN0IHByb2NlZWVkIHNlcmlhbGx5IGJ1dAorCQkgICBzb21lIEJNQ3MgZG9uJ3QgY2xlYXIgQjJIX0FUTiB3aXRoIG9uZSBoaXQuICBGYXN0LXBhdGggYQorCQkgICB3b3JrYXJvdW5kIHdpdGhvdXQgdG9vIG11Y2ggcGVuYWx0eSB0byB0aGUgZ2VuZXJhbCBjYXNlLiAqLwogCi0gICAgCWNhc2UgQlRfU1RBVEVfUkVBRF9FTkQ6CisJCUJUX0NPTlRST0woQlRfQjJIX0FUTik7CQkvKiBjbGVhciBpdCB0byBBQ0sgdGhlIEJNQyAqLworCQlCVF9TVEFURV9DSEFOR0UoQlRfU1RBVEVfQ0xFQVJfQjJILAorCQkJCVNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWSk7CiAKLQkJLyogSSBjb3VsZCB3YWl0IG9uIEJUX0hfQlVTWSB0byBnbyBjbGVhciBmb3IgYSB0cnVseSBjbGVhbgotCQkgICBleGl0LiAgSG93ZXZlciwgdGhpcyBpcyBhbHJlYWR5IGRvbmUgaW4gWEFDVElPTl9TVEFSVAotCQkgICBhbmQgdGhlIChwb3NzaWJsZSkgZXh0cmEgbG9vcC9zdGF0dXMvcG9zc2libGUgd2FpdCBhZmZlY3RzCi0JCSAgIHBlcmZvcm1hbmNlLiAgU28sIGFzIGxvbmcgYXMgaXQgd29ya3MsIGp1c3QgaWdub3JlIEhfQlVTWSAqLworCWNhc2UgQlRfU1RBVEVfQ0xFQVJfQjJIOgorCQlpZiAoc3RhdHVzICYgQlRfQjJIX0FUTikgewkvKiBrZWVwIGhpdHRpbmcgaXQgKi8KKwkJCUJUX0NPTlRST0woQlRfQjJIX0FUTik7CisJCQlCVF9TSV9TTV9SRVRVUk4oU0lfU01fQ0FMTF9XSVRIX0RFTEFZKTsKKwkJfQorCQlCVF9TVEFURV9DSEFOR0UoQlRfU1RBVEVfUkVBRF9CWVRFUywKKwkJCQlTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVkpOwogCi0jaWZkZWYgTUFLRV9USElTX1RSVUVfSUZfTkVDRVNTQVJZCisJY2FzZSBCVF9TVEFURV9SRUFEX0JZVEVTOgorCQlpZiAoIShzdGF0dXMgJiBCVF9IX0JVU1kpKQkvKiBjaGVjayBpbiBjYXNlIG9mIHJldHJ5ICovCisJCQlCVF9DT05UUk9MKEJUX0hfQlVTWSk7CisJCUJUX0NPTlRST0woQlRfQ0xSX1JEX1BUUik7CS8qIHN0YXJ0IG9mIEJNQzJIT1NUIGJ1ZmZlciAqLworCQlpID0gcmVhZF9hbGxfYnl0ZXMoYnQpOwkJLyogdHJ1ZSA9PSBwYWNrZXQgc2VxIG1hdGNoICovCisJCUJUX0NPTlRST0woQlRfSF9CVVNZKTsJCS8qIE5PVyBjbGVhciAqLworCQlpZiAoIWkpIAkJCS8qIE5vdCBteSBtZXNzYWdlICovCisJCQlCVF9TVEFURV9DSEFOR0UoQlRfU1RBVEVfUkVBRF9XQUlULAorCQkJCQlTSV9TTV9DQUxMX1dJVEhPVVRfREVMQVkpOworCQlidC0+c3RhdGUgPSBidC0+Y29tcGxldGU7CisJCXJldHVybiBidC0+c3RhdGUgPT0gQlRfU1RBVEVfSURMRSA/CS8qIHdoZXJlIHRvIG5leHQ/ICovCisJCQlTSV9TTV9UUkFOU0FDVElPTl9DT01QTEVURSA6CS8qIG5vcm1hbCAqLworCQkJU0lfU01fQ0FMTF9XSVRIT1VUX0RFTEFZOwkvKiBTdGFydHVwIG1hZ2ljICovCiAKLQkJaWYgKHN0YXR1cyAmIEJUX0hfQlVTWSkKLQkJICAgICAgIGJyZWFrOwotI2VuZGlmCi0JCWJ0LT5zZXErKzsKLQkJYnQtPnN0YXRlID0gQlRfU1RBVEVfSURMRTsKLQkJcmV0dXJuIFNJX1NNX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCWNhc2UgQlRfU1RBVEVfTE9OR19CVVNZOgkvKiBGb3IgZXhhbXBsZTogYWZ0ZXIgRlcgdXBkYXRlICovCisJCWlmICghKHN0YXR1cyAmIEJUX0JfQlVTWSkpIHsKKwkJCXJlc2V0X2ZsYWdzKGJ0KTsJLyogbmV4dCBzdGF0ZSBpcyBub3cgSURMRSAqLworCQkJYnRfaW5pdF9kYXRhKGJ0LCBidC0+aW8pOworCQl9CisJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CS8qIE5vIHJlcGVhdCBwcmludGluZyAqLwogCiAJY2FzZSBCVF9TVEFURV9SRVNFVDE6Ci0gICAgCQlyZXNldF9mbGFncyhidCk7Ci0gICAgCQlidC0+dGltZW91dCA9IEJUX1JFU0VUX0RFTEFZOwotCQlidC0+c3RhdGUgPSBCVF9TVEFURV9SRVNFVDI7Ci0JCWJyZWFrOworCQlyZXNldF9mbGFncyhidCk7CisJCWRyYWluX0JNQzJIT1NUKGJ0KTsKKwkJQlRfU1RBVEVfQ0hBTkdFKEJUX1NUQVRFX1JFU0VUMiwKKwkJCQlTSV9TTV9DQUxMX1dJVEhfREVMQVkpOwogCiAJY2FzZSBCVF9TVEFURV9SRVNFVDI6CQkvKiBTZW5kIGEgc29mdCByZXNldCAqLwogCQlCVF9DT05UUk9MKEJUX0NMUl9XUl9QVFIpOwpAQCAtNDY0LDI5ICs1ODEsNTkgQEAKIAkJSE9TVDJCTUMoNDIpOwkJLyogU2VxdWVuY2UgbnVtYmVyICovCiAJCUhPU1QyQk1DKDMpOwkJLyogQ21kID09IFNvZnQgcmVzZXQgKi8KIAkJQlRfQ09OVFJPTChCVF9IMkJfQVROKTsKLQkJYnQtPnN0YXRlID0gQlRfU1RBVEVfUkVTRVQzOwotCQlicmVhazsKKwkJYnQtPnRpbWVvdXQgPSBCVF9SRVNFVF9ERUxBWSAqIDEwMDAwMDA7CisJCUJUX1NUQVRFX0NIQU5HRShCVF9TVEFURV9SRVNFVDMsCisJCQkJU0lfU01fQ0FMTF9XSVRIX0RFTEFZKTsKIAotCWNhc2UgQlRfU1RBVEVfUkVTRVQzOgorCWNhc2UgQlRfU1RBVEVfUkVTRVQzOgkJLyogSG9sZCBvZmYgZXZlcnl0aGluZyBmb3IgYSBiaXQgKi8KIAkJaWYgKGJ0LT50aW1lb3V0ID4gMCkKLQkJICAgICAgIHJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7Ci0JCWJ0LT5zdGF0ZSA9IEJUX1NUQVRFX1JFU1RBUlQ7CS8qIHByaW50ayBpbiBkZWJ1ZyBtb2RlcyAqLwotCQlicmVhazsKKwkJCXJldHVybiBTSV9TTV9DQUxMX1dJVEhfREVMQVk7CisJCWRyYWluX0JNQzJIT1NUKGJ0KTsKKwkJQlRfU1RBVEVfQ0hBTkdFKEJUX1NUQVRFX1JFU1RBUlQsCisJCQkJU0lfU01fQ0FMTF9XSVRIX0RFTEFZKTsKIAotCWNhc2UgQlRfU1RBVEVfUkVTVEFSVDoJCS8qIGRvbid0IHJlc2V0IHJldHJpZXMhICovCi0JCXJlc2V0X2ZsYWdzKGJ0KTsKLQkJYnQtPndyaXRlX2RhdGFbMl0gPSArK2J0LT5zZXE7CisJY2FzZSBCVF9TVEFURV9SRVNUQVJUOgkJLyogZG9uJ3QgcmVzZXQgcmV0cmllcyBvciBzZXEhICovCiAJCWJ0LT5yZWFkX2NvdW50ID0gMDsKIAkJYnQtPm5vbnplcm9fc3RhdHVzID0gMDsKLQkJYnQtPnRpbWVvdXQgPSBCVF9OT1JNQUxfVElNRU9VVDsKLQkJYnQtPnN0YXRlID0gQlRfU1RBVEVfWEFDVElPTl9TVEFSVDsKLQkJYnJlYWs7CisJCWJ0LT50aW1lb3V0ID0gYnQtPkJUX0NBUF9yZXEycnNwOworCQlCVF9TVEFURV9DSEFOR0UoQlRfU1RBVEVfWEFDVElPTl9TVEFSVCwKKwkJCQlTSV9TTV9DQUxMX1dJVEhfREVMQVkpOwogCi0JZGVmYXVsdDoJLyogSE9TRUQgaXMgc3VwcG9zZWQgdG8gYmUgY2F1Z2h0IG11Y2ggZWFybGllciAqLwotCQllcnJvcl9yZWNvdmVyeShidCwgImludGVybmFsIGxvZ2ljIGVycm9yIik7Ci0JCWJyZWFrOwotICAJfQotICAJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKKwkvKiBHZXQgQlQgQ2FwYWJpbGl0aWVzLCB1c2luZyB0aW1pbmcgb2YgdXBwZXIgbGV2ZWwgc3RhdGUgbWFjaGluZS4KKwkgICBTZXQgb3V0cmVxcyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3Agb24gdGltZW91dC4gKi8KKwljYXNlIEJUX1NUQVRFX0NBUEFCSUxJVElFU19CRUdJTjoKKwkJYnQtPkJUX0NBUF9vdXRyZXFzID0gMTsKKwkJeworCQkJdW5zaWduZWQgY2hhciBHZXRCVF9DQVBbXSA9IHsgMHgxOCwgMHgzNiB9OworCQkJYnQtPnN0YXRlID0gQlRfU1RBVEVfSURMRTsKKwkJCWJ0X3N0YXJ0X3RyYW5zYWN0aW9uKGJ0LCBHZXRCVF9DQVAsIHNpemVvZihHZXRCVF9DQVApKTsKKwkJfQorCQlidC0+Y29tcGxldGUgPSBCVF9TVEFURV9DQVBBQklMSVRJRVNfRU5EOworCQlCVF9TVEFURV9DSEFOR0UoQlRfU1RBVEVfWEFDVElPTl9TVEFSVCwKKwkJCQlTSV9TTV9DQUxMX1dJVEhfREVMQVkpOworCisJY2FzZSBCVF9TVEFURV9DQVBBQklMSVRJRVNfRU5EOgorCQlpID0gYnRfZ2V0X3Jlc3VsdChidCwgQlRfQ0FQLCBzaXplb2YoQlRfQ0FQKSk7CisJCWJ0X2luaXRfZGF0YShidCwgYnQtPmlvKTsKKwkJaWYgKChpID09IDgpICYmICFCVF9DQVBbMl0pIHsKKwkJCWJ0LT5CVF9DQVBfb3V0cmVxcyA9IEJUX0NBUFszXTsKKwkJCWJ0LT5CVF9DQVBfcmVxMnJzcCA9IEJUX0NBUFs2XSAqIDEwMDAwMDA7CisJCQlidC0+QlRfQ0FQX3JldHJpZXMgPSBCVF9DQVBbN107CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSVBNSSBCVDogdXNpbmcgZGVmYXVsdCB2YWx1ZXNcbiIpOworCQlpZiAoIWJ0LT5CVF9DQVBfb3V0cmVxcykKKwkJCWJ0LT5CVF9DQVBfb3V0cmVxcyA9IDE7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklQTUkgQlQ6IHJlcTJyc3A9JWxkIHNlY3MgcmV0cmllcz0lZFxuIiwKKwkJCWJ0LT5CVF9DQVBfcmVxMnJzcCAvIDEwMDAwMDBMLCBidC0+QlRfQ0FQX3JldHJpZXMpOworCQlidC0+dGltZW91dCA9IGJ0LT5CVF9DQVBfcmVxMnJzcDsKKwkJcmV0dXJuIFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsKKworCWRlZmF1bHQ6CS8qIHNob3VsZCBuZXZlciBvY2N1ciAqLworCQlyZXR1cm4gZXJyb3JfcmVjb3ZlcnkoYnQsCisJCQkJICAgICAgc3RhdHVzLAorCQkJCSAgICAgIElQTUlfRVJSX1VOU1BFQ0lGSUVEKTsKKwl9CisJcmV0dXJuIFNJX1NNX0NBTExfV0lUSF9ERUxBWTsKIH0KIAogc3RhdGljIGludCBidF9kZXRlY3Qoc3RydWN0IHNpX3NtX2RhdGEgKmJ0KQpAQCAtNDk3LDcgKzY0NCw3IEBACiAJICAgdGVzdCB0aGF0IGZpcnN0LiAgVGhlIGNhbGxpbmcgcm91dGluZSB1c2VzIG5lZ2F0aXZlIGxvZ2ljLiAqLwogCiAJaWYgKChCVF9TVEFUVVMgPT0gMHhGRikgJiYgKEJUX0lOVE1BU0tfUiA9PSAweEZGKSkKLQkgICAgICAgcmV0dXJuIDE7CisJCXJldHVybiAxOwogCXJlc2V0X2ZsYWdzKGJ0KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUxMywxMSArNjYwLDExIEBACiAKIHN0cnVjdCBzaV9zbV9oYW5kbGVycyBidF9zbWlfaGFuZGxlcnMgPQogewotCS5pbml0X2RhdGEgICAgICAgICA9IGJ0X2luaXRfZGF0YSwKLQkuc3RhcnRfdHJhbnNhY3Rpb24gPSBidF9zdGFydF90cmFuc2FjdGlvbiwKLQkuZ2V0X3Jlc3VsdCAgICAgICAgPSBidF9nZXRfcmVzdWx0LAotCS5ldmVudCAgICAgICAgICAgICA9IGJ0X2V2ZW50LAotCS5kZXRlY3QgICAgICAgICAgICA9IGJ0X2RldGVjdCwKLQkuY2xlYW51cCAgICAgICAgICAgPSBidF9jbGVhbnVwLAotCS5zaXplICAgICAgICAgICAgICA9IGJ0X3NpemUsCisJLmluaXRfZGF0YQkJPSBidF9pbml0X2RhdGEsCisJLnN0YXJ0X3RyYW5zYWN0aW9uCT0gYnRfc3RhcnRfdHJhbnNhY3Rpb24sCisJLmdldF9yZXN1bHQJCT0gYnRfZ2V0X3Jlc3VsdCwKKwkuZXZlbnQJCQk9IGJ0X2V2ZW50LAorCS5kZXRlY3QJCQk9IGJ0X2RldGVjdCwKKwkuY2xlYW51cAkJPSBidF9jbGVhbnVwLAorCS5zaXplCQkJPSBidF9zaXplLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKaW5kZXggODFmY2YwYy4uZmYyZDA1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9kZXZpbnRmLmMKQEAgLTU5Niw2ICs1OTYsMzEgQEAKIAkJcnYgPSAwOwogCQlicmVhazsKIAl9CisKKwljYXNlIElQTUlDVExfR0VUX01BSU5URU5BTkNFX01PREVfQ01EOgorCXsKKwkJaW50IG1vZGU7CisKKwkJbW9kZSA9IGlwbWlfZ2V0X21haW50ZW5hbmNlX21vZGUocHJpdi0+dXNlcik7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmbW9kZSwgc2l6ZW9mKG1vZGUpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcnYgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIElQTUlDVExfU0VUX01BSU5URU5BTkNFX01PREVfQ01EOgorCXsKKwkJaW50IG1vZGU7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtb2RlLCBhcmcsIHNpemVvZihtb2RlKSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJ2ID0gaXBtaV9zZXRfbWFpbnRlbmFuY2VfbW9kZShwcml2LT51c2VyLCBtb2RlKTsKKwkJYnJlYWs7CisJfQogCX0KICAgCiAJcmV0dXJuIHJ2OwpAQCAtNzczLDcgKzc5OCw3IEBACiAJCWlmIChjb3B5X3RvX3VzZXIocHJlY3Y2NCwgJnJlY3Y2NCwgc2l6ZW9mKHJlY3Y2NCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJcmMgPSBpcG1pX2lvY3RsKGZpbGVwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZXAsCisJCXJjID0gaXBtaV9pb2N0bChmaWxlcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZXAsCiAJCQkJKChjbWQgPT0gQ09NUEFUX0lQTUlDVExfUkVDRUlWRV9NU0cpCiAJCQkJID8gSVBNSUNUTF9SRUNFSVZFX01TRwogCQkJCSA6IElQTUlDVExfUkVDRUlWRV9NU0dfVFJVTkMpLApAQCAtNzkwLDcgKzgxNSw3IEBACiAJCXJldHVybiByYzsKIAl9CiAJZGVmYXVsdDoKLQkJcmV0dXJuIGlwbWlfaW9jdGwoZmlsZXAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlcCwgY21kLCBhcmcpOworCQlyZXR1cm4gaXBtaV9pb2N0bChmaWxlcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZXAsIGNtZCwgYXJnKTsKIAl9CiB9CiAjZW5kaWYKQEAgLTgwOSw3ICs4MzQsNyBAQAogCiAjZGVmaW5lIERFVklDRV9OQU1FICAgICAiaXBtaWRldiIKIAotc3RhdGljIGludCBpcG1pX21ham9yID0gMDsKK3N0YXRpYyBpbnQgaXBtaV9tYWpvcjsKIG1vZHVsZV9wYXJhbShpcG1pX21ham9yLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhpcG1pX21ham9yLCAiU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBJUE1JIGRldmljZS4gIEJ5IgogCQkgIiBkZWZhdWx0LCBvciBpZiB5b3Ugc2V0IGl0IHRvIHplcm8sIGl0IHdpbGwgY2hvb3NlIHRoZSBuZXh0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9rY3Nfc20uYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfa2NzX3NtLmMKaW5kZXggMjA2MjY3NS4uYzFiODIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9rY3Nfc20uYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2tjc19zbS5jCkBAIC05Myw4ICs5Myw4IEBACiAJCQkJICAgc3RhdGUgbWFjaGluZS4gKi8KIH07CiAKLSNkZWZpbmUgTUFYX0tDU19SRUFEX1NJWkUgODAKLSNkZWZpbmUgTUFYX0tDU19XUklURV9TSVpFIDgwCisjZGVmaW5lIE1BWF9LQ1NfUkVBRF9TSVpFIElQTUlfTUFYX01TR19MRU5HVEgKKyNkZWZpbmUgTUFYX0tDU19XUklURV9TSVpFIElQTUlfTUFYX01TR19MRU5HVEgKIAogLyogVGltZW91dHMgaW4gbWljcm9zZWNvbmRzLiAqLwogI2RlZmluZSBJQkZfUkVUUllfVElNRU9VVCAxMDAwMDAwCkBAIC0yNjEsMTIgKzI2MSwxNCBAQAogewogCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKChzaXplIDwgMikgfHwgKHNpemUgPiBNQVhfS0NTX1dSSVRFX1NJWkUpKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKChrY3MtPnN0YXRlICE9IEtDU19JRExFKSAmJiAoa2NzLT5zdGF0ZSAhPSBLQ1NfSE9TRUQpKSB7Ci0JCXJldHVybiAtMjsKLQl9CisJaWYgKHNpemUgPCAyKQorCQlyZXR1cm4gSVBNSV9SRVFfTEVOX0lOVkFMSURfRVJSOworCWlmIChzaXplID4gTUFYX0tDU19XUklURV9TSVpFKQorCQlyZXR1cm4gSVBNSV9SRVFfTEVOX0VYQ0VFREVEX0VSUjsKKworCWlmICgoa2NzLT5zdGF0ZSAhPSBLQ1NfSURMRSkgJiYgKGtjcy0+c3RhdGUgIT0gS0NTX0hPU0VEKSkKKwkJcmV0dXJuIElQTUlfTk9UX0lOX01ZX1NUQVRFX0VSUjsKKwogCWlmIChrY3NfZGVidWcgJiBLQ1NfREVCVUdfTVNHKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJzdGFydF9rY3NfdHJhbnNhY3Rpb24gLSIpOwogCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwppbmRleCAzNGE0ZmQxLi40ZTQ2OTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwpAQCAtNDgsMTcgKzQ4LDIwIEBACiAKICNkZWZpbmUgUEZYICJJUE1JIG1lc3NhZ2UgaGFuZGxlcjogIgogCi0jZGVmaW5lIElQTUlfRFJJVkVSX1ZFUlNJT04gIjM5LjAiCisjZGVmaW5lIElQTUlfRFJJVkVSX1ZFUlNJT04gIjM5LjEiCiAKIHN0YXRpYyBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqaXBtaV9hbGxvY19yZWN2X21zZyh2b2lkKTsKIHN0YXRpYyBpbnQgaXBtaV9pbml0X21zZ2hhbmRsZXIodm9pZCk7CiAKLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworc3RhdGljIGludCBpbml0aWFsaXplZDsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lwbWlfcm9vdCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lwbWlfcm9vdDsKICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCisvKiBSZW1haW4gaW4gYXV0by1tYWludGVuYW5jZSBtb2RlIGZvciB0aGlzIGFtb3VudCBvZiB0aW1lIChpbiBtcykuICovCisjZGVmaW5lIElQTUlfTUFJTlRFTkFOQ0VfTU9ERV9USU1FT1VUIDMwMDAwCisKICNkZWZpbmUgTUFYX0VWRU5UU19JTl9RVUVVRQkyNQogCiAvKiBEb24ndCBsZXQgYSBtZXNzYWdlIHNpdCBpbiBhIHF1ZXVlIGZvcmV2ZXIsIGFsd2F5cyB0aW1lIGl0IHdpdGggYXQgbGVzdApAQCAtMTkzLDE3ICsxOTYsMjggQEAKIAogCXN0cnVjdCBrcmVmIHJlZmNvdW50OwogCisJLyogVXNlZCBmb3IgYSBsaXN0IG9mIGludGVyZmFjZXMuICovCisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCiAJLyogVGhlIGxpc3Qgb2YgdXBwZXIgbGF5ZXJzIHRoYXQgYXJlIHVzaW5nIG1lLiAgc2VxX2xvY2sKIAkgKiBwcm90ZWN0cyB0aGlzLiAqLwogCXN0cnVjdCBsaXN0X2hlYWQgdXNlcnM7CiAKKwkvKiBJbmZvcm1hdGlvbiB0byBzdXBwbHkgdG8gdXNlcnMuICovCisJdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb25fbWFqb3I7CisJdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb25fbWlub3I7CisKIAkvKiBVc2VkIGZvciB3YWtlIHVwcyBhdCBzdGFydHVwLiAqLwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOwogCiAJc3RydWN0IGJtY19kZXZpY2UgKmJtYzsKIAljaGFyICpteV9kZXZfbmFtZTsKKwljaGFyICpzeXNmc19uYW1lOwogCi0JLyogVGhpcyBpcyB0aGUgbG93ZXItbGF5ZXIncyBzZW5kZXIgcm91dGluZS4gKi8KKwkvKiBUaGlzIGlzIHRoZSBsb3dlci1sYXllcidzIHNlbmRlciByb3V0aW5lLiAgTm90ZSB0aGF0IHlvdQorCSAqIG11c3QgZWl0aGVyIGJlIGhvbGRpbmcgdGhlIGlwbWlfaW50ZXJmYWNlc19tdXRleCBvciBiZSBpbgorCSAqIGFuIHVtcHJlZW1wdGlibGUgcmVnaW9uIHRvIHVzZSB0aGlzLiAgWW91IG11c3QgZmV0Y2ggdGhlCisJICogdmFsdWUgaW50byBhIGxvY2FsIHZhcmlhYmxlIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IE5VTEwuICovCiAJc3RydWN0IGlwbWlfc21pX2hhbmRsZXJzICpoYW5kbGVyczsKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgKnNlbmRfaW5mbzsKIApAQCAtMjQyLDYgKzI1Niw3IEBACiAJc3BpbmxvY2tfdCAgICAgICBldmVudHNfbG9jazsgLyogRm9yIGRlYWxpbmcgd2l0aCBldmVudCBzdHVmZi4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRpbmdfZXZlbnRzOwogCXVuc2lnbmVkIGludCAgICAgd2FpdGluZ19ldmVudHNfY291bnQ7IC8qIEhvdyBtYW55IGV2ZW50cyBpbiBxdWV1ZT8gKi8KKwlpbnQgICAgICAgICAgICAgIGRlbGl2ZXJpbmdfZXZlbnRzOwogCiAJLyogVGhlIGV2ZW50IHJlY2VpdmVyIGZvciBteSBCTUMsIG9ubHkgcmVhbGx5IHVzZWQgYXQgcGFuaWMKIAkgICBzaHV0ZG93biBhcyBhIHBsYWNlIHRvIHN0b3JlIHRoaXMuICovCkBAIC0yNTAsNiArMjY1LDEyIEBACiAJdW5zaWduZWQgY2hhciBsb2NhbF9zZWxfZGV2aWNlOwogCXVuc2lnbmVkIGNoYXIgbG9jYWxfZXZlbnRfZ2VuZXJhdG9yOwogCisJLyogRm9yIGhhbmRsaW5nIG9mIG1haW50ZW5hbmNlIG1vZGUuICovCisJaW50IG1haW50ZW5hbmNlX21vZGU7CisJaW50IG1haW50ZW5hbmNlX21vZGVfZW5hYmxlOworCWludCBhdXRvX21haW50ZW5hbmNlX3RpbWVvdXQ7CisJc3BpbmxvY2tfdCBtYWludGVuYW5jZV9tb2RlX2xvY2s7IC8qIFVzZWQgaW4gYSB0aW1lci4uLiAqLworCiAJLyogQSBjaGVhcCBoYWNrLCBpZiB0aGlzIGlzIG5vbi1udWxsIGFuZCBhIG1lc3NhZ2UgdG8gYW4KIAkgICBpbnRlcmZhY2UgY29tZXMgaW4gd2l0aCBhIE5VTEwgdXNlciwgY2FsbCB0aGlzIHJvdXRpbmUgd2l0aAogCSAgIGl0LiAgTm90ZSB0aGF0IHRoZSBtZXNzYWdlIHdpbGwgc3RpbGwgYmUgZnJlZWQgYnkgdGhlCkBAIC0zMzgsMTMgKzM1OSw2IEBACiB9OwogI2RlZmluZSB0b19zaV9pbnRmX2Zyb21fZGV2KGRldmljZSkgY29udGFpbmVyX29mKGRldmljZSwgc3RydWN0IGlwbWlfc21pLCBkZXYpCiAKLS8qIFVzZWQgdG8gbWFyayBhbiBpbnRlcmZhY2UgZW50cnkgdGhhdCBjYW5ub3QgYmUgdXNlZCBidXQgaXMgbm90IGEKLSAqIGZyZWUgZW50cnksIGVpdGhlciwgcHJpbWFyaWx5IHVzZWQgYXQgY3JlYXRpb24gYW5kIGRlbGV0aW9uIHRpbWUgc28KLSAqIGEgc2xvdCBkb2Vzbid0IGdldCByZXVzZWQgdG9vIHF1aWNrbHkuICovCi0jZGVmaW5lIElQTUlfSU5WQUxJRF9JTlRFUkZBQ0VfRU5UUlkgKChpcG1pX3NtaV90KSAoKGxvbmcpIDEpKQotI2RlZmluZSBJUE1JX0lOVkFMSURfSU5URVJGQUNFKGkpICgoKGkpID09IE5VTEwpIFwKLQkJCQkgICB8fCAoaSA9PSBJUE1JX0lOVkFMSURfSU5URVJGQUNFX0VOVFJZKSkKLQogLyoqCiAgKiBUaGUgZHJpdmVyIG1vZGVsIHZpZXcgb2YgdGhlIElQTUkgbWVzc2FnaW5nIGRyaXZlci4KICAqLwpAQCAtMzU0LDE2ICszNjgsMTMgQEAKIH07CiBzdGF0aWMgREVGSU5FX01VVEVYKGlwbWlkcml2ZXJfbXV0ZXgpOwogCi0jZGVmaW5lIE1BWF9JUE1JX0lOVEVSRkFDRVMgNAotc3RhdGljIGlwbWlfc21pX3QgaXBtaV9pbnRlcmZhY2VzW01BWF9JUE1JX0lOVEVSRkFDRVNdOwotCi0vKiBEaXJlY3RseSBwcm90ZWN0cyB0aGUgaXBtaV9pbnRlcmZhY2VzIGRhdGEgc3RydWN0dXJlLiAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhpbnRlcmZhY2VzX2xvY2spOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaXBtaV9pbnRlcmZhY2VzID0gTElTVF9IRUFEX0lOSVQoaXBtaV9pbnRlcmZhY2VzKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoaXBtaV9pbnRlcmZhY2VzX211dGV4KTsKIAogLyogTGlzdCBvZiB3YXRjaGVycyB0aGF0IHdhbnQgdG8ga25vdyB3aGVuIHNtaSdzIGFyZSBhZGRlZCBhbmQKICAgIGRlbGV0ZWQuICovCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBzbWlfd2F0Y2hlcnMgPSBMSVNUX0hFQURfSU5JVChzbWlfd2F0Y2hlcnMpOwotc3RhdGljIERFQ0xBUkVfUldTRU0oc21pX3dhdGNoZXJzX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKHNtaV93YXRjaGVyc19tdXRleCk7CiAKIAogc3RhdGljIHZvaWQgZnJlZV9yZWN2X21zZ19saXN0KHN0cnVjdCBsaXN0X2hlYWQgKnEpCkBAIC0zNzYsMTMgKzM4NywyMyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZnJlZV9zbWlfbXNnX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqcSkKK3sKKwlzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2csICptc2cyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgcSwgbGluaykgeworCQlsaXN0X2RlbCgmbXNnLT5saW5rKTsKKwkJaXBtaV9mcmVlX3NtaV9tc2cobXNnKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGNsZWFuX3VwX2ludGVyZmFjZV9kYXRhKGlwbWlfc21pX3QgaW50ZikKIHsKIAlpbnQgICAgICAgICAgICAgIGk7CiAJc3RydWN0IGNtZF9yY3ZyICAqcmN2ciwgKnJjdnIyOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAotCWZyZWVfcmVjdl9tc2dfbGlzdCgmaW50Zi0+d2FpdGluZ19tc2dzKTsKKwlmcmVlX3NtaV9tc2dfbGlzdCgmaW50Zi0+d2FpdGluZ19tc2dzKTsKIAlmcmVlX3JlY3ZfbXNnX2xpc3QoJmludGYtPndhaXRpbmdfZXZlbnRzKTsKIAogCS8qIFdob2xlc2FsZSByZW1vdmUgYWxsIHRoZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgaW4gdGhlCkBAIC00MTMsNDggKzQzNCw4NCBAQAogCWtmcmVlKGludGYpOwogfQogCitzdHJ1Y3Qgd2F0Y2hlcl9lbnRyeSB7CisJaW50ICAgICAgICAgICAgICBpbnRmX251bTsKKwlpcG1pX3NtaV90ICAgICAgIGludGY7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworfTsKKwogaW50IGlwbWlfc21pX3dhdGNoZXJfcmVnaXN0ZXIoc3RydWN0IGlwbWlfc21pX3dhdGNoZXIgKndhdGNoZXIpCiB7Ci0JaW50ICAgICAgICAgICBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaXBtaV9zbWlfdCBpbnRmOworCXN0cnVjdCBsaXN0X2hlYWQgdG9fZGVsaXZlciA9IExJU1RfSEVBRF9JTklUKHRvX2RlbGl2ZXIpOworCXN0cnVjdCB3YXRjaGVyX2VudHJ5ICplLCAqZTI7CiAKLQlkb3duX3dyaXRlKCZzbWlfd2F0Y2hlcnNfc2VtKTsKLQlsaXN0X2FkZCgmKHdhdGNoZXItPmxpbmspLCAmc21pX3dhdGNoZXJzKTsKLQl1cF93cml0ZSgmc21pX3dhdGNoZXJzX3NlbSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKLQkJaXBtaV9zbWlfdCBpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOwotCQlpZiAoSVBNSV9JTlZBTElEX0lOVEVSRkFDRShpbnRmKSkKKwltdXRleF9sb2NrKCZzbWlfd2F0Y2hlcnNfbXV0ZXgpOworCisJbXV0ZXhfbG9jaygmaXBtaV9pbnRlcmZhY2VzX211dGV4KTsKKworCS8qIEJ1aWxkIGEgbGlzdCBvZiB0aGluZ3MgdG8gZGVsaXZlci4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpbnRmLCAmaXBtaV9pbnRlcmZhY2VzLCBsaW5rKSB7CisJCWlmIChpbnRmLT5pbnRmX251bSA9PSAtMSkKIAkJCWNvbnRpbnVlOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlcmZhY2VzX2xvY2ssIGZsYWdzKTsKLQkJd2F0Y2hlci0+bmV3X3NtaShpLCBpbnRmLT5zaV9kZXYpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZXJmYWNlc19sb2NrLCBmbGFncyk7CisJCWUgPSBrbWFsbG9jKHNpemVvZigqZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWUpCisJCQlnb3RvIG91dF9lcnI7CisJCWtyZWZfZ2V0KCZpbnRmLT5yZWZjb3VudCk7CisJCWUtPmludGYgPSBpbnRmOworCQllLT5pbnRmX251bSA9IGludGYtPmludGZfbnVtOworCQlsaXN0X2FkZF90YWlsKCZlLT5saW5rLCAmdG9fZGVsaXZlcik7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOworCisJLyogV2Ugd2lsbCBzdWNjZWVkLCBzbyBhZGQgaXQgdG8gdGhlIGxpc3QuICovCisJbGlzdF9hZGQoJndhdGNoZXItPmxpbmssICZzbWlfd2F0Y2hlcnMpOworCisJbXV0ZXhfdW5sb2NrKCZpcG1pX2ludGVyZmFjZXNfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIGUyLCAmdG9fZGVsaXZlciwgbGluaykgeworCQlsaXN0X2RlbCgmZS0+bGluayk7CisJCXdhdGNoZXItPm5ld19zbWkoZS0+aW50Zl9udW0sIGUtPmludGYtPnNpX2Rldik7CisJCWtyZWZfcHV0KCZlLT5pbnRmLT5yZWZjb3VudCwgaW50Zl9mcmVlKTsKKwkJa2ZyZWUoZSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzbWlfd2F0Y2hlcnNfbXV0ZXgpOworCiAJcmV0dXJuIDA7CisKKyBvdXRfZXJyOgorCW11dGV4X3VubG9jaygmaXBtaV9pbnRlcmZhY2VzX211dGV4KTsKKwltdXRleF91bmxvY2soJnNtaV93YXRjaGVyc19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIGUyLCAmdG9fZGVsaXZlciwgbGluaykgeworCQlsaXN0X2RlbCgmZS0+bGluayk7CisJCWtyZWZfcHV0KCZlLT5pbnRmLT5yZWZjb3VudCwgaW50Zl9mcmVlKTsKKwkJa2ZyZWUoZSk7CisJfQorCXJldHVybiAtRU5PTUVNOwogfQogCiBpbnQgaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKHN0cnVjdCBpcG1pX3NtaV93YXRjaGVyICp3YXRjaGVyKQogewotCWRvd25fd3JpdGUoJnNtaV93YXRjaGVyc19zZW0pOworCW11dGV4X2xvY2soJnNtaV93YXRjaGVyc19tdXRleCk7CiAJbGlzdF9kZWwoJih3YXRjaGVyLT5saW5rKSk7Ci0JdXBfd3JpdGUoJnNtaV93YXRjaGVyc19zZW0pOworCW11dGV4X3VubG9jaygmc21pX3dhdGNoZXJzX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggc21pX3dhdGNoZXJzX211dGV4IGhlbGQuCisgKi8KIHN0YXRpYyB2b2lkCiBjYWxsX3NtaV93YXRjaGVycyhpbnQgaSwgc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpcG1pX3NtaV93YXRjaGVyICp3OwogCi0JZG93bl9yZWFkKCZzbWlfd2F0Y2hlcnNfc2VtKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZzbWlfd2F0Y2hlcnMsIGxpbmspIHsKIAkJaWYgKHRyeV9tb2R1bGVfZ2V0KHctPm93bmVyKSkgewogCQkJdy0+bmV3X3NtaShpLCBkZXYpOwogCQkJbW9kdWxlX3B1dCh3LT5vd25lcik7CiAJCX0KIAl9Ci0JdXBfcmVhZCgmc21pX3dhdGNoZXJzX3NlbSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTU4MCw2ICs2MzcsMTcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCitkZWxpdmVyX2Vycl9yZXNwb25zZShzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnLCBpbnQgZXJyKQoreworCW1zZy0+cmVjdl90eXBlID0gSVBNSV9SRVNQT05TRV9SRUNWX1RZUEU7CisJbXNnLT5tc2dfZGF0YVswXSA9IGVycjsKKwltc2ctPm1zZy5uZXRmbiB8PSAxOyAvKiBDb252ZXJ0IHRvIGEgcmVzcG9uc2UuICovCisJbXNnLT5tc2cuZGF0YV9sZW4gPSAxOworCW1zZy0+bXNnLmRhdGEgPSBtc2ctPm1zZ19kYXRhOworCWRlbGl2ZXJfcmVzcG9uc2UobXNnKTsKK30KKwogLyogRmluZCB0aGUgbmV4dCBzZXF1ZW5jZSBudW1iZXIgbm90IGJlaW5nIHVzZWQgYW5kIGFkZCB0aGUgZ2l2ZW4KICAgIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gdGltZW91dCB0byB0aGUgc2VxdWVuY2UgdGFibGUuICBUaGlzIG11c3QgYmUKICAgIGNhbGxlZCB3aXRoIHRoZSBpbnRlcmZhY2UncyBzZXFfbG9jayBoZWxkLiAqLwpAQCAtNzE3LDE0ICs3ODUsOCBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaW50Zi0+c2VxX2xvY2spLCBmbGFncyk7CiAKLQlpZiAobXNnKSB7Ci0JCW1zZy0+cmVjdl90eXBlID0gSVBNSV9SRVNQT05TRV9SRUNWX1RZUEU7Ci0JCW1zZy0+bXNnX2RhdGFbMF0gPSBlcnI7Ci0JCW1zZy0+bXNnLm5ldGZuIHw9IDE7IC8qIENvbnZlcnQgdG8gYSByZXNwb25zZS4gKi8KLQkJbXNnLT5tc2cuZGF0YV9sZW4gPSAxOwotCQltc2ctPm1zZy5kYXRhID0gbXNnLT5tc2dfZGF0YTsKLQkJZGVsaXZlcl9yZXNwb25zZShtc2cpOwotCX0KKwlpZiAobXNnKQorCQlkZWxpdmVyX2Vycl9yZXNwb25zZShtc2csIGVycik7CiAKIAlyZXR1cm4gcnY7CiB9CkBAIC03NjYsMTcgKzgyOCwxOCBAQAogCWlmICghbmV3X3VzZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOwotCWludGYgPSBpcG1pX2ludGVyZmFjZXNbaWZfbnVtXTsKLQlpZiAoKGlmX251bSA+PSBNQVhfSVBNSV9JTlRFUkZBQ0VTKSB8fCBJUE1JX0lOVkFMSURfSU5URVJGQUNFKGludGYpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOwotCQlydiA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2tmcmVlOworCW11dGV4X2xvY2soJmlwbWlfaW50ZXJmYWNlc19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaW50ZiwgJmlwbWlfaW50ZXJmYWNlcywgbGluaykgeworCQlpZiAoaW50Zi0+aW50Zl9udW0gPT0gaWZfbnVtKQorCQkJZ290byBmb3VuZDsKIAl9CisJLyogTm90IGZvdW5kLCByZXR1cm4gYW4gZXJyb3IgKi8KKwlydiA9IC1FSU5WQUw7CisJZ290byBvdXRfa2ZyZWU7CiAKKyBmb3VuZDoKIAkvKiBOb3RlIHRoYXQgZWFjaCBleGlzdGluZyB1c2VyIGhvbGRzIGEgcmVmY291bnQgdG8gdGhlIGludGVyZmFjZS4gKi8KIAlrcmVmX2dldCgmaW50Zi0+cmVmY291bnQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOwogCiAJa3JlZl9pbml0KCZuZXdfdXNlci0+cmVmY291bnQpOwogCW5ld191c2VyLT5oYW5kbGVyID0gaGFuZGxlcjsKQEAgLTc5Nyw2ICs4NjAsMTAgQEAKIAkJfQogCX0KIAorCS8qIEhvbGQgdGhlIGxvY2sgc28gaW50Zi0+aGFuZGxlcnMgaXMgZ3VhcmFudGVlZCB0byBiZSBnb29kCisJICogdW50aWwgbm93ICovCisJbXV0ZXhfdW5sb2NrKCZpcG1pX2ludGVyZmFjZXNfbXV0ZXgpOworCiAJbmV3X3VzZXItPnZhbGlkID0gMTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+c2VxX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZF9yY3UoJm5ld191c2VyLT5saW5rLCAmaW50Zi0+dXNlcnMpOwpAQCAtODA3LDYgKzg3NCw3IEBACiBvdXRfa3JlZjoKIAlrcmVmX3B1dCgmaW50Zi0+cmVmY291bnQsIGludGZfZnJlZSk7CiBvdXRfa2ZyZWU6CisJbXV0ZXhfdW5sb2NrKCZpcG1pX2ludGVyZmFjZXNfbXV0ZXgpOwogCWtmcmVlKG5ld191c2VyKTsKIAlyZXR1cm4gcnY7CiB9CkBAIC04MzYsNiArOTA0LDcgQEAKIAkJICAgICYmIChpbnRmLT5zZXFfdGFibGVbaV0ucmVjdl9tc2ctPnVzZXIgPT0gdXNlcikpCiAJCXsKIAkJCWludGYtPnNlcV90YWJsZVtpXS5pbnVzZSA9IDA7CisJCQlpcG1pX2ZyZWVfcmVjdl9tc2coaW50Zi0+c2VxX3RhYmxlW2ldLnJlY3ZfbXNnKTsKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5zZXFfbG9jaywgZmxhZ3MpOwpAQCAtODYyLDkgKzkzMSwxMyBAQAogCQlrZnJlZShyY3ZyKTsKIAl9CiAKLQltb2R1bGVfcHV0KGludGYtPmhhbmRsZXJzLT5vd25lcik7Ci0JaWYgKGludGYtPmhhbmRsZXJzLT5kZWNfdXNlY291bnQpCi0JCWludGYtPmhhbmRsZXJzLT5kZWNfdXNlY291bnQoaW50Zi0+c2VuZF9pbmZvKTsKKwltdXRleF9sb2NrKCZpcG1pX2ludGVyZmFjZXNfbXV0ZXgpOworCWlmIChpbnRmLT5oYW5kbGVycykgeworCQltb2R1bGVfcHV0KGludGYtPmhhbmRsZXJzLT5vd25lcik7CisJCWlmIChpbnRmLT5oYW5kbGVycy0+ZGVjX3VzZWNvdW50KQorCQkJaW50Zi0+aGFuZGxlcnMtPmRlY191c2Vjb3VudChpbnRmLT5zZW5kX2luZm8pOworCX0KKwltdXRleF91bmxvY2soJmlwbWlfaW50ZXJmYWNlc19tdXRleCk7CiAKIAlrcmVmX3B1dCgmaW50Zi0+cmVmY291bnQsIGludGZfZnJlZSk7CiAKQEAgLTg3Nyw4ICs5NTAsOCBAQAogCQkgICAgICB1bnNpZ25lZCBjaGFyICptYWpvciwKIAkJICAgICAgdW5zaWduZWQgY2hhciAqbWlub3IpCiB7Ci0JKm1ham9yID0gaXBtaV92ZXJzaW9uX21ham9yKCZ1c2VyLT5pbnRmLT5ibWMtPmlkKTsKLQkqbWlub3IgPSBpcG1pX3ZlcnNpb25fbWlub3IoJnVzZXItPmludGYtPmJtYy0+aWQpOworCSptYWpvciA9IHVzZXItPmludGYtPmlwbWlfdmVyc2lvbl9tYWpvcjsKKwkqbWlub3IgPSB1c2VyLT5pbnRmLT5pcG1pX3ZlcnNpb25fbWlub3I7CiB9CiAKIGludCBpcG1pX3NldF9teV9hZGRyZXNzKGlwbWlfdXNlcl90ICAgdXNlciwKQEAgLTkyMSw2ICs5OTQsNjUgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGlwbWlfZ2V0X21haW50ZW5hbmNlX21vZGUoaXBtaV91c2VyX3QgdXNlcikKK3sKKwlpbnQgICAgICAgICAgIG1vZGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2VyLT5pbnRmLT5tYWludGVuYW5jZV9tb2RlX2xvY2ssIGZsYWdzKTsKKwltb2RlID0gdXNlci0+aW50Zi0+bWFpbnRlbmFuY2VfbW9kZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2VyLT5pbnRmLT5tYWludGVuYW5jZV9tb2RlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBtb2RlOworfQorRVhQT1JUX1NZTUJPTChpcG1pX2dldF9tYWludGVuYW5jZV9tb2RlKTsKKworc3RhdGljIHZvaWQgbWFpbnRlbmFuY2VfbW9kZV91cGRhdGUoaXBtaV9zbWlfdCBpbnRmKQoreworCWlmIChpbnRmLT5oYW5kbGVycy0+c2V0X21haW50ZW5hbmNlX21vZGUpCisJCWludGYtPmhhbmRsZXJzLT5zZXRfbWFpbnRlbmFuY2VfbW9kZSgKKwkJCWludGYtPnNlbmRfaW5mbywgaW50Zi0+bWFpbnRlbmFuY2VfbW9kZV9lbmFibGUpOworfQorCitpbnQgaXBtaV9zZXRfbWFpbnRlbmFuY2VfbW9kZShpcG1pX3VzZXJfdCB1c2VyLCBpbnQgbW9kZSkKK3sKKwlpbnQgICAgICAgICAgIHJ2ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlwbWlfc21pX3QgICAgaW50ZiA9IHVzZXItPmludGY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+bWFpbnRlbmFuY2VfbW9kZV9sb2NrLCBmbGFncyk7CisJaWYgKGludGYtPm1haW50ZW5hbmNlX21vZGUgIT0gbW9kZSkgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBJUE1JX01BSU5URU5BTkNFX01PREVfQVVUTzoKKwkJCWludGYtPm1haW50ZW5hbmNlX21vZGUgPSBtb2RlOworCQkJaW50Zi0+bWFpbnRlbmFuY2VfbW9kZV9lbmFibGUKKwkJCQk9IChpbnRmLT5hdXRvX21haW50ZW5hbmNlX3RpbWVvdXQgPiAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBNSV9NQUlOVEVOQU5DRV9NT0RFX09GRjoKKwkJCWludGYtPm1haW50ZW5hbmNlX21vZGUgPSBtb2RlOworCQkJaW50Zi0+bWFpbnRlbmFuY2VfbW9kZV9lbmFibGUgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUE1JX01BSU5URU5BTkNFX01PREVfT046CisJCQlpbnRmLT5tYWludGVuYW5jZV9tb2RlID0gbW9kZTsKKwkJCWludGYtPm1haW50ZW5hbmNlX21vZGVfZW5hYmxlID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQltYWludGVuYW5jZV9tb2RlX3VwZGF0ZShpbnRmKTsKKwl9Cisgb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRmLT5tYWludGVuYW5jZV9tb2RlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBydjsKK30KK0VYUE9SVF9TWU1CT0woaXBtaV9zZXRfbWFpbnRlbmFuY2VfbW9kZSk7CisKIGludCBpcG1pX3NldF9nZXRzX2V2ZW50cyhpcG1pX3VzZXJfdCB1c2VyLCBpbnQgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgICAgICAgIGZsYWdzOwpAQCAtOTMzLDIwICsxMDY1LDMzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmV2ZW50c19sb2NrLCBmbGFncyk7CiAJdXNlci0+Z2V0c19ldmVudHMgPSB2YWw7CiAKLQlpZiAodmFsKSB7Ci0JCS8qIERlbGl2ZXIgYW55IHF1ZXVlZCBldmVudHMuICovCisJaWYgKGludGYtPmRlbGl2ZXJpbmdfZXZlbnRzKQorCQkvKgorCQkgKiBBbm90aGVyIHRocmVhZCBpcyBkZWxpdmVyaW5nIGV2ZW50cyBmb3IgdGhpcywgc28KKwkJICogbGV0IGl0IGhhbmRsZSBhbnkgbmV3IGV2ZW50cy4KKwkJICovCisJCWdvdG8gb3V0OworCisJLyogRGVsaXZlciBhbnkgcXVldWVkIGV2ZW50cy4gKi8KKwl3aGlsZSAodXNlci0+Z2V0c19ldmVudHMgJiYgIWxpc3RfZW1wdHkoJmludGYtPndhaXRpbmdfZXZlbnRzKSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmaW50Zi0+d2FpdGluZ19ldmVudHMsIGxpbmspCiAJCQlsaXN0X21vdmVfdGFpbCgmbXNnLT5saW5rLCAmbXNncyk7CiAJCWludGYtPndhaXRpbmdfZXZlbnRzX2NvdW50ID0gMDsKKworCQlpbnRmLT5kZWxpdmVyaW5nX2V2ZW50cyA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmV2ZW50c19sb2NrLCBmbGFncyk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJm1zZ3MsIGxpbmspIHsKKwkJCW1zZy0+dXNlciA9IHVzZXI7CisJCQlrcmVmX2dldCgmdXNlci0+cmVmY291bnQpOworCQkJZGVsaXZlcl9yZXNwb25zZShtc2cpOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmV2ZW50c19sb2NrLCBmbGFncyk7CisJCWludGYtPmRlbGl2ZXJpbmdfZXZlbnRzID0gMDsKIAl9CiAKLQkvKiBIb2xkIHRoZSBldmVudHMgbG9jayB3aGlsZSBkb2luZyB0aGlzIHRvIHByZXNlcnZlIG9yZGVyLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZtc2dzLCBsaW5rKSB7Ci0JCW1zZy0+dXNlciA9IHVzZXI7Ci0JCWtyZWZfZ2V0KCZ1c2VyLT5yZWZjb3VudCk7Ci0JCWRlbGl2ZXJfcmVzcG9uc2UobXNnKTsKLQl9Ci0KKyBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+ZXZlbnRzX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMTA1Nyw3ICsxMjAyLDggQEAKIHZvaWQgaXBtaV91c2VyX3NldF9ydW5fdG9fY29tcGxldGlvbihpcG1pX3VzZXJfdCB1c2VyLCBpbnQgdmFsKQogewogCWlwbWlfc21pX3QgaW50ZiA9IHVzZXItPmludGY7Ci0JaW50Zi0+aGFuZGxlcnMtPnNldF9ydW5fdG9fY29tcGxldGlvbihpbnRmLT5zZW5kX2luZm8sIHZhbCk7CisJaWYgKGludGYtPmhhbmRsZXJzKQorCQlpbnRmLT5oYW5kbGVycy0+c2V0X3J1bl90b19jb21wbGV0aW9uKGludGYtPnNlbmRfaW5mbywgdmFsKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGNoYXIKQEAgLTExNjgsMTAgKzEzMTQsMTEgQEAKIAkJCSAgaW50ICAgICAgICAgICAgICAgICAgcmV0cmllcywKIAkJCSAgdW5zaWduZWQgaW50ICAgICAgICAgcmV0cnlfdGltZV9tcykKIHsKLQlpbnQgICAgICAgICAgICAgICAgICBydiA9IDA7Ci0Jc3RydWN0IGlwbWlfc21pX21zZyAgKnNtaV9tc2c7Ci0Jc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJlY3ZfbXNnOwotCXVuc2lnbmVkIGxvbmcgICAgICAgIGZsYWdzOworCWludCAgICAgICAgICAgICAgICAgICAgICBydiA9IDA7CisJc3RydWN0IGlwbWlfc21pX21zZyAgICAgICpzbWlfbXNnOworCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICAgICAqcmVjdl9tc2c7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGZsYWdzOworCXN0cnVjdCBpcG1pX3NtaV9oYW5kbGVycyAqaGFuZGxlcnM7CiAKIAogCWlmIChzdXBwbGllZF9yZWN2KSB7CkBAIC0xMTk0LDYgKzEzNDEsMTMgQEAKIAkJfQogCX0KIAorCXJjdV9yZWFkX2xvY2soKTsKKwloYW5kbGVycyA9IGludGYtPmhhbmRsZXJzOworCWlmICghaGFuZGxlcnMpIHsKKwkJcnYgPSAtRU5PREVWOworCQlnb3RvIG91dF9lcnI7CisJfQorCiAJcmVjdl9tc2ctPnVzZXIgPSB1c2VyOwogCWlmICh1c2VyKQogCQlrcmVmX2dldCgmdXNlci0+cmVmY291bnQpOwpAQCAtMTIzNiw2ICsxMzkwLDI0IEBACiAJCQlnb3RvIG91dF9lcnI7CiAJCX0KIAorCQlpZiAoKChtc2ctPm5ldGZuID09IElQTUlfTkVURk5fQVBQX1JFUVVFU1QpCisJCSAgICAgICYmICgobXNnLT5jbWQgPT0gSVBNSV9DT0xEX1JFU0VUX0NNRCkKKwkJCSAgfHwgKG1zZy0+Y21kID09IElQTUlfV0FSTV9SRVNFVF9DTUQpKSkKKwkJICAgICB8fCAobXNnLT5uZXRmbiA9PSBJUE1JX05FVEZOX0ZJUk1XQVJFX1JFUVVFU1QpKQorCQl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+bWFpbnRlbmFuY2VfbW9kZV9sb2NrLCBmbGFncyk7CisJCQlpbnRmLT5hdXRvX21haW50ZW5hbmNlX3RpbWVvdXQKKwkJCQk9IElQTUlfTUFJTlRFTkFOQ0VfTU9ERV9USU1FT1VUOworCQkJaWYgKCFpbnRmLT5tYWludGVuYW5jZV9tb2RlCisJCQkgICAgJiYgIWludGYtPm1haW50ZW5hbmNlX21vZGVfZW5hYmxlKQorCQkJeworCQkJCWludGYtPm1haW50ZW5hbmNlX21vZGVfZW5hYmxlID0gMTsKKwkJCQltYWludGVuYW5jZV9tb2RlX3VwZGF0ZShpbnRmKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPm1haW50ZW5hbmNlX21vZGVfbG9jaywKKwkJCQkJICAgICAgIGZsYWdzKTsKKwkJfQorCiAJCWlmICgobXNnLT5kYXRhX2xlbiArIDIpID4gSVBNSV9NQVhfTVNHX0xFTkdUSCkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwogCQkJaW50Zi0+c2VudF9pbnZhbGlkX2NvbW1hbmRzKys7CkBAIC0xNTEwLDExICsxNjgyLDE0IEBACiAJCXByaW50aygiXG4iKTsKIAl9CiAjZW5kaWYKLQlpbnRmLT5oYW5kbGVycy0+c2VuZGVyKGludGYtPnNlbmRfaW5mbywgc21pX21zZywgcHJpb3JpdHkpOworCisJaGFuZGxlcnMtPnNlbmRlcihpbnRmLT5zZW5kX2luZm8sIHNtaV9tc2csIHByaW9yaXR5KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiAwOwogCiAgb3V0X2VycjoKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpcG1pX2ZyZWVfc21pX21zZyhzbWlfbXNnKTsKIAlpcG1pX2ZyZWVfcmVjdl9tc2cocmVjdl9tc2cpOwogCXJldHVybiBydjsKQEAgLTE1OTQsNiArMTc2OSw3IEBACiAJCQkgICAgICAtMSwgMCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGludCBpcG1iX2ZpbGVfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJICAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CkBAIC0xNjgyLDYgKzE4NTgsNyBAQAogCiAJcmV0dXJuIChvdXQgLSAoKGNoYXIgKikgcGFnZSkpOwogfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKIGludCBpcG1pX3NtaV9hZGRfcHJvY19lbnRyeShpcG1pX3NtaV90IHNtaSwgY2hhciAqbmFtZSwKIAkJCSAgICByZWFkX3Byb2NfdCAqcmVhZF9wcm9jLCB3cml0ZV9wcm9jX3QgKndyaXRlX3Byb2MsCkBAIC0xODA3LDEzICsxOTg0LDEyIEBACiAJc3RydWN0IGJtY19kZXZpY2UgKmJtYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIChibWMtPmlkLnByb2R1Y3RfaWQgPT0gaWQtPnByb2R1Y3RfaWQKLQkJJiYgYm1jLT5pZC5wcm9kdWN0X2lkID09IGlkLT5wcm9kdWN0X2lkCiAJCSYmIGJtYy0+aWQuZGV2aWNlX2lkID09IGlkLT5kZXZpY2VfaWQpOwogfQogCiBzdGF0aWMgc3RydWN0IGJtY19kZXZpY2UgKmlwbWlfZmluZF9ibWNfcHJvZF9kZXZfaWQoCiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKLQl1bnNpZ25lZCBjaGFyIHByb2R1Y3RfaWQsIHVuc2lnbmVkIGNoYXIgZGV2aWNlX2lkKQorCXVuc2lnbmVkIGludCBwcm9kdWN0X2lkLCB1bnNpZ25lZCBjaGFyIGRldmljZV9pZCkKIHsKIAlzdHJ1Y3QgcHJvZF9kZXZfaWQgaWQgPSB7CiAJCS5wcm9kdWN0X2lkID0gcHJvZHVjdF9pZCwKQEAgLTE4NDQsNyArMjAyMCw3IEBACiAJc3RydWN0IGJtY19kZXZpY2UgKmJtYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMTAsICIldVxuIiwKLQkJCWJtYy0+aWQuZGV2aWNlX3JldmlzaW9uICYmIDB4ODAgPj4gNyk7CisJCQkoYm1jLT5pZC5kZXZpY2VfcmV2aXNpb24gJiAweDgwKSA+PiA3KTsKIH0KIAogc3RhdGljIHNzaXplX3QgcmV2aXNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMTg1Myw3ICsyMDI5LDcgQEAKIAlzdHJ1Y3QgYm1jX2RldmljZSAqYm1jID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiV1XG4iLAotCQkJYm1jLT5pZC5kZXZpY2VfcmV2aXNpb24gJiYgMHgwRik7CisJCQlibWMtPmlkLmRldmljZV9yZXZpc2lvbiAmIDB4MEYpOwogfQogCiBzdGF0aWMgc3NpemVfdCBmaXJtd2FyZV9yZXZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xOTMwLDYgKzIxMDYsOSBAQAogCiBzdGF0aWMgdm9pZCByZW1vdmVfZmlsZXMoc3RydWN0IGJtY19kZXZpY2UgKmJtYykKIHsKKwlpZiAoIWJtYy0+ZGV2KQorCQlyZXR1cm47CisKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCiAJCQkgICAmYm1jLT5kZXZpY2VfaWRfYXR0cik7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZibWMtPmRldi0+ZGV2LApAQCAtMTk3MSw3ICsyMTUwLDExIEBACiB7CiAJc3RydWN0IGJtY19kZXZpY2UgKmJtYyA9IGludGYtPmJtYzsKIAotCXN5c2ZzX3JlbW92ZV9saW5rKCZpbnRmLT5zaV9kZXYtPmtvYmosICJibWMiKTsKKwlpZiAoaW50Zi0+c3lzZnNfbmFtZSkgeworCQlzeXNmc19yZW1vdmVfbGluaygmaW50Zi0+c2lfZGV2LT5rb2JqLCBpbnRmLT5zeXNmc19uYW1lKTsKKwkJa2ZyZWUoaW50Zi0+c3lzZnNfbmFtZSk7CisJCWludGYtPnN5c2ZzX25hbWUgPSBOVUxMOworCX0KIAlpZiAoaW50Zi0+bXlfZGV2X25hbWUpIHsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmJtYy0+ZGV2LT5kZXYua29iaiwgaW50Zi0+bXlfZGV2X25hbWUpOwogCQlrZnJlZShpbnRmLT5teV9kZXZfbmFtZSk7CkBAIC0xOTgwLDYgKzIxNjMsNyBAQAogCiAJbXV0ZXhfbG9jaygmaXBtaWRyaXZlcl9tdXRleCk7CiAJa3JlZl9wdXQoJmJtYy0+cmVmY291bnQsIGNsZWFudXBfYm1jX2RldmljZSk7CisJaW50Zi0+Ym1jID0gTlVMTDsKIAltdXRleF91bmxvY2soJmlwbWlkcml2ZXJfbXV0ZXgpOwogfQogCkBAIC0xOTg3LDYgKzIxNzEsNTYgQEAKIHsKIAlpbnQgZXJyOwogCisJYm1jLT5kZXZpY2VfaWRfYXR0ci5hdHRyLm5hbWUgPSAiZGV2aWNlX2lkIjsKKwlibWMtPmRldmljZV9pZF9hdHRyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKKwlibWMtPmRldmljZV9pZF9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CisJYm1jLT5kZXZpY2VfaWRfYXR0ci5zaG93ID0gZGV2aWNlX2lkX3Nob3c7CisKKwlibWMtPnByb3ZpZGVzX2Rldl9zZHJzX2F0dHIuYXR0ci5uYW1lID0gInByb3ZpZGVzX2RldmljZV9zZHJzIjsKKwlibWMtPnByb3ZpZGVzX2Rldl9zZHJzX2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOworCWJtYy0+cHJvdmlkZXNfZGV2X3NkcnNfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCWJtYy0+cHJvdmlkZXNfZGV2X3NkcnNfYXR0ci5zaG93ID0gcHJvdmlkZXNfZGV2X3NkcnNfc2hvdzsKKworCWJtYy0+cmV2aXNpb25fYXR0ci5hdHRyLm5hbWUgPSAicmV2aXNpb24iOworCWJtYy0+cmV2aXNpb25fYXR0ci5hdHRyLm93bmVyID0gVEhJU19NT0RVTEU7CisJYm1jLT5yZXZpc2lvbl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CisJYm1jLT5yZXZpc2lvbl9hdHRyLnNob3cgPSByZXZpc2lvbl9zaG93OworCisJYm1jLT5maXJtd2FyZV9yZXZfYXR0ci5hdHRyLm5hbWUgPSAiZmlybXdhcmVfcmV2aXNpb24iOworCWJtYy0+ZmlybXdhcmVfcmV2X2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOworCWJtYy0+ZmlybXdhcmVfcmV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwlibWMtPmZpcm13YXJlX3Jldl9hdHRyLnNob3cgPSBmaXJtd2FyZV9yZXZfc2hvdzsKKworCWJtYy0+dmVyc2lvbl9hdHRyLmF0dHIubmFtZSA9ICJpcG1pX3ZlcnNpb24iOworCWJtYy0+dmVyc2lvbl9hdHRyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKKwlibWMtPnZlcnNpb25fYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCWJtYy0+dmVyc2lvbl9hdHRyLnNob3cgPSBpcG1pX3ZlcnNpb25fc2hvdzsKKworCWJtYy0+YWRkX2Rldl9zdXBwb3J0X2F0dHIuYXR0ci5uYW1lID0gImFkZGl0aW9uYWxfZGV2aWNlX3N1cHBvcnQiOworCWJtYy0+YWRkX2Rldl9zdXBwb3J0X2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOworCWJtYy0+YWRkX2Rldl9zdXBwb3J0X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwlibWMtPmFkZF9kZXZfc3VwcG9ydF9hdHRyLnNob3cgPSBhZGRfZGV2X3N1cHBvcnRfc2hvdzsKKworCWJtYy0+bWFudWZhY3R1cmVyX2lkX2F0dHIuYXR0ci5uYW1lID0gIm1hbnVmYWN0dXJlcl9pZCI7CisJYm1jLT5tYW51ZmFjdHVyZXJfaWRfYXR0ci5hdHRyLm93bmVyID0gVEhJU19NT0RVTEU7CisJYm1jLT5tYW51ZmFjdHVyZXJfaWRfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCWJtYy0+bWFudWZhY3R1cmVyX2lkX2F0dHIuc2hvdyA9IG1hbnVmYWN0dXJlcl9pZF9zaG93OworCisJYm1jLT5wcm9kdWN0X2lkX2F0dHIuYXR0ci5uYW1lID0gInByb2R1Y3RfaWQiOworCWJtYy0+cHJvZHVjdF9pZF9hdHRyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKKwlibWMtPnByb2R1Y3RfaWRfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCWJtYy0+cHJvZHVjdF9pZF9hdHRyLnNob3cgPSBwcm9kdWN0X2lkX3Nob3c7CisKKwlibWMtPmd1aWRfYXR0ci5hdHRyLm5hbWUgPSAiZ3VpZCI7CisJYm1jLT5ndWlkX2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOworCWJtYy0+Z3VpZF9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087CisJYm1jLT5ndWlkX2F0dHIuc2hvdyA9IGd1aWRfc2hvdzsKKworCWJtYy0+YXV4X2Zpcm13YXJlX3Jldl9hdHRyLmF0dHIubmFtZSA9ICJhdXhfZmlybXdhcmVfcmV2aXNpb24iOworCWJtYy0+YXV4X2Zpcm13YXJlX3Jldl9hdHRyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKKwlibWMtPmF1eF9maXJtd2FyZV9yZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCWJtYy0+YXV4X2Zpcm13YXJlX3Jldl9hdHRyLnNob3cgPSBhdXhfZmlybXdhcmVfcmV2X3Nob3c7CisKIAllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmJtYy0+ZGV2LT5kZXYsCiAJCQkgICAmYm1jLT5kZXZpY2VfaWRfYXR0cik7CiAJaWYgKGVycikgZ290byBvdXQ7CkBAIC0yMDU2LDcgKzIyOTAsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgaXBtaV9ibWNfcmVnaXN0ZXIoaXBtaV9zbWlfdCBpbnRmKQorc3RhdGljIGludCBpcG1pX2JtY19yZWdpc3RlcihpcG1pX3NtaV90IGludGYsIGludCBpZm51bSwKKwkJCSAgICAgY29uc3QgY2hhciAqc3lzZnNfbmFtZSkKIHsKIAlpbnQgICAgICAgICAgICAgICBydjsKIAlzdHJ1Y3QgYm1jX2RldmljZSAqYm1jID0gaW50Zi0+Ym1jOwpAQCAtMjA5Niw5ICsyMzMxLDM4IEBACiAJCSAgICAgICBibWMtPmlkLnByb2R1Y3RfaWQsCiAJCSAgICAgICBibWMtPmlkLmRldmljZV9pZCk7CiAJfSBlbHNlIHsKLQkJYm1jLT5kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImlwbWlfYm1jIiwKLQkJCQkJCSBibWMtPmlkLmRldmljZV9pZCk7CisJCWNoYXIgbmFtZVsxNF07CisJCXVuc2lnbmVkIGNoYXIgb3JpZ19kZXZfaWQgPSBibWMtPmlkLmRldmljZV9pZDsKKwkJaW50IHdhcm5fcHJpbnRlZCA9IDA7CisKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLAorCQkJICJpcG1pX2JtYy4lNC40eCIsIGJtYy0+aWQucHJvZHVjdF9pZCk7CisKKwkJd2hpbGUgKGlwbWlfZmluZF9ibWNfcHJvZF9kZXZfaWQoJmlwbWlkcml2ZXIsCisJCQkJCQkgYm1jLT5pZC5wcm9kdWN0X2lkLAorCQkJCQkJIGJtYy0+aWQuZGV2aWNlX2lkKSkgeworCQkJaWYgKCF3YXJuX3ByaW50ZWQpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAorCQkJCSAgICAgICAiVGhpcyBtYWNoaW5lIGhhcyB0d28gZGlmZmVyZW50IEJNQ3MiCisJCQkJICAgICAgICIgd2l0aCB0aGUgc2FtZSBwcm9kdWN0IGlkIGFuZCBkZXZpY2UiCisJCQkJICAgICAgICIgaWQuICBUaGlzIGlzIGFuIGVycm9yIGluIHRoZSIKKwkJCQkgICAgICAgIiBmaXJtd2FyZSwgYnV0IGluY3JlbWVudGluZyB0aGUiCisJCQkJICAgICAgICIgZGV2aWNlIGlkIHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtLiIKKwkJCQkgICAgICAgIiBQcm9kIElEID0gMHgleCwgRGV2IElEID0gMHgleFxuIiwKKwkJCQkgICAgICAgYm1jLT5pZC5wcm9kdWN0X2lkLCBibWMtPmlkLmRldmljZV9pZCk7CisJCQkJd2Fybl9wcmludGVkID0gMTsKKwkJCX0KKwkJCWJtYy0+aWQuZGV2aWNlX2lkKys7IC8qIFdyYXBzIGF0IDI1NSAqLworCQkJaWYgKGJtYy0+aWQuZGV2aWNlX2lkID09IG9yaWdfZGV2X2lkKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJCSAgICAgICAiT3V0IG9mIGRldmljZSBpZHMhXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWJtYy0+ZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIGJtYy0+aWQuZGV2aWNlX2lkKTsKIAkJaWYgKCFibWMtPmRldikgeworCQkJbXV0ZXhfdW5sb2NrKCZpcG1pZHJpdmVyX211dGV4KTsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJpcG1pX21zZ2hhbmRsZXI6IgogCQkJICAgICAgICIgVW5hYmxlIHRvIGFsbG9jYXRlIHBsYXRmb3JtIGRldmljZVxuIik7CkBAIC0yMTA4LDkgKzIzNzIsMTEgQEAKIAkJZGV2X3NldF9kcnZkYXRhKCZibWMtPmRldi0+ZGV2LCBibWMpOwogCQlrcmVmX2luaXQoJmJtYy0+cmVmY291bnQpOwogCi0JCXJ2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKGJtYy0+ZGV2KTsKKwkJcnYgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGJtYy0+ZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZpcG1pZHJpdmVyX211dGV4KTsKIAkJaWYgKHJ2KSB7CisJCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGJtYy0+ZGV2KTsKKwkJCWJtYy0+ZGV2ID0gTlVMTDsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJpcG1pX21zZ2hhbmRsZXI6IgogCQkJICAgICAgICIgVW5hYmxlIHRvIHJlZ2lzdGVyIGJtYyBkZXZpY2U6ICVkXG4iLApAQCAtMjEyMCw1NyArMjM4Niw2IEBACiAJCQlyZXR1cm4gcnY7CiAJCX0KIAotCQlibWMtPmRldmljZV9pZF9hdHRyLmF0dHIubmFtZSA9ICJkZXZpY2VfaWQiOwotCQlibWMtPmRldmljZV9pZF9hdHRyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKLQkJYm1jLT5kZXZpY2VfaWRfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwotCQlibWMtPmRldmljZV9pZF9hdHRyLnNob3cgPSBkZXZpY2VfaWRfc2hvdzsKLQotCQlibWMtPnByb3ZpZGVzX2Rldl9zZHJzX2F0dHIuYXR0ci5uYW1lID0gInByb3ZpZGVzX2RldmljZV9zZHJzIjsKLQkJYm1jLT5wcm92aWRlc19kZXZfc2Ryc19hdHRyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKLQkJYm1jLT5wcm92aWRlc19kZXZfc2Ryc19hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087Ci0JCWJtYy0+cHJvdmlkZXNfZGV2X3NkcnNfYXR0ci5zaG93ID0gcHJvdmlkZXNfZGV2X3NkcnNfc2hvdzsKLQotCQlibWMtPnJldmlzaW9uX2F0dHIuYXR0ci5uYW1lID0gInJldmlzaW9uIjsKLQkJYm1jLT5yZXZpc2lvbl9hdHRyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKLQkJYm1jLT5yZXZpc2lvbl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087Ci0JCWJtYy0+cmV2aXNpb25fYXR0ci5zaG93ID0gcmV2aXNpb25fc2hvdzsKLQotCQlibWMtPmZpcm13YXJlX3Jldl9hdHRyLmF0dHIubmFtZSA9ICJmaXJtd2FyZV9yZXZpc2lvbiI7Ci0JCWJtYy0+ZmlybXdhcmVfcmV2X2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwotCQlibWMtPmZpcm13YXJlX3Jldl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087Ci0JCWJtYy0+ZmlybXdhcmVfcmV2X2F0dHIuc2hvdyA9IGZpcm13YXJlX3Jldl9zaG93OwotCi0JCWJtYy0+dmVyc2lvbl9hdHRyLmF0dHIubmFtZSA9ICJpcG1pX3ZlcnNpb24iOwotCQlibWMtPnZlcnNpb25fYXR0ci5hdHRyLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCWJtYy0+dmVyc2lvbl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087Ci0JCWJtYy0+dmVyc2lvbl9hdHRyLnNob3cgPSBpcG1pX3ZlcnNpb25fc2hvdzsKLQotCQlibWMtPmFkZF9kZXZfc3VwcG9ydF9hdHRyLmF0dHIubmFtZQotCQkJPSAiYWRkaXRpb25hbF9kZXZpY2Vfc3VwcG9ydCI7Ci0JCWJtYy0+YWRkX2Rldl9zdXBwb3J0X2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwotCQlibWMtPmFkZF9kZXZfc3VwcG9ydF9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087Ci0JCWJtYy0+YWRkX2Rldl9zdXBwb3J0X2F0dHIuc2hvdyA9IGFkZF9kZXZfc3VwcG9ydF9zaG93OwotCi0JCWJtYy0+bWFudWZhY3R1cmVyX2lkX2F0dHIuYXR0ci5uYW1lID0gIm1hbnVmYWN0dXJlcl9pZCI7Ci0JCWJtYy0+bWFudWZhY3R1cmVyX2lkX2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwotCQlibWMtPm1hbnVmYWN0dXJlcl9pZF9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087Ci0JCWJtYy0+bWFudWZhY3R1cmVyX2lkX2F0dHIuc2hvdyA9IG1hbnVmYWN0dXJlcl9pZF9zaG93OwotCi0JCWJtYy0+cHJvZHVjdF9pZF9hdHRyLmF0dHIubmFtZSA9ICJwcm9kdWN0X2lkIjsKLQkJYm1jLT5wcm9kdWN0X2lkX2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwotCQlibWMtPnByb2R1Y3RfaWRfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwotCQlibWMtPnByb2R1Y3RfaWRfYXR0ci5zaG93ID0gcHJvZHVjdF9pZF9zaG93OwotCi0JCWJtYy0+Z3VpZF9hdHRyLmF0dHIubmFtZSA9ICJndWlkIjsKLQkJYm1jLT5ndWlkX2F0dHIuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwotCQlibWMtPmd1aWRfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwotCQlibWMtPmd1aWRfYXR0ci5zaG93ID0gZ3VpZF9zaG93OwotCi0JCWJtYy0+YXV4X2Zpcm13YXJlX3Jldl9hdHRyLmF0dHIubmFtZSA9ICJhdXhfZmlybXdhcmVfcmV2aXNpb24iOwotCQlibWMtPmF1eF9maXJtd2FyZV9yZXZfYXR0ci5hdHRyLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCWJtYy0+YXV4X2Zpcm13YXJlX3Jldl9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR087Ci0JCWJtYy0+YXV4X2Zpcm13YXJlX3Jldl9hdHRyLnNob3cgPSBhdXhfZmlybXdhcmVfcmV2X3Nob3c7Ci0KIAkJcnYgPSBjcmVhdGVfZmlsZXMoYm1jKTsKIAkJaWYgKHJ2KSB7CiAJCQltdXRleF9sb2NrKCZpcG1pZHJpdmVyX211dGV4KTsKQEAgLTIxOTIsMjkgKzI0MDcsNDQgQEAKIAkgKiBjcmVhdGUgc3ltbGluayBmcm9tIHN5c3RlbSBpbnRlcmZhY2UgZGV2aWNlIHRvIGJtYyBkZXZpY2UKIAkgKiBhbmQgYmFjay4KIAkgKi8KKwlpbnRmLT5zeXNmc19uYW1lID0ga3N0cmR1cChzeXNmc19uYW1lLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWludGYtPnN5c2ZzX25hbWUpIHsKKwkJcnYgPSAtRU5PTUVNOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJpcG1pX21zZ2hhbmRsZXI6IGFsbG9jYXRlIGxpbmsgdG8gQk1DOiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwkJZ290byBvdXRfZXJyOworCX0KKwogCXJ2ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmludGYtPnNpX2Rldi0+a29iaiwKLQkJCSAgICAgICAmYm1jLT5kZXYtPmRldi5rb2JqLCAiYm1jIik7CisJCQkgICAgICAgJmJtYy0+ZGV2LT5kZXYua29iaiwgaW50Zi0+c3lzZnNfbmFtZSk7CiAJaWYgKHJ2KSB7CisJCWtmcmVlKGludGYtPnN5c2ZzX25hbWUpOworCQlpbnRmLT5zeXNmc19uYW1lID0gTlVMTDsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiaXBtaV9tc2doYW5kbGVyOiBVbmFibGUgdG8gY3JlYXRlIGJtYyBzeW1saW5rOiAlZFxuIiwKIAkJICAgICAgIHJ2KTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAotCXNpemUgPSBzbnByaW50ZihkdW1teSwgMCwgImlwbWklZCIsIGludGYtPmludGZfbnVtKTsKKwlzaXplID0gc25wcmludGYoZHVtbXksIDAsICJpcG1pJWQiLCBpZm51bSk7CiAJaW50Zi0+bXlfZGV2X25hbWUgPSBrbWFsbG9jKHNpemUrMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnRmLT5teV9kZXZfbmFtZSkgeworCQlrZnJlZShpbnRmLT5zeXNmc19uYW1lKTsKKwkJaW50Zi0+c3lzZnNfbmFtZSA9IE5VTEw7CiAJCXJ2ID0gLUVOT01FTTsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiaXBtaV9tc2doYW5kbGVyOiBhbGxvY2F0ZSBsaW5rIGZyb20gQk1DOiAlZFxuIiwKIAkJICAgICAgIHJ2KTsKIAkJZ290byBvdXRfZXJyOwogCX0KLQlzbnByaW50ZihpbnRmLT5teV9kZXZfbmFtZSwgc2l6ZSsxLCAiaXBtaSVkIiwgaW50Zi0+aW50Zl9udW0pOworCXNucHJpbnRmKGludGYtPm15X2Rldl9uYW1lLCBzaXplKzEsICJpcG1pJWQiLCBpZm51bSk7CiAKIAlydiA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZibWMtPmRldi0+ZGV2LmtvYmosICZpbnRmLT5zaV9kZXYtPmtvYmosCiAJCQkgICAgICAgaW50Zi0+bXlfZGV2X25hbWUpOwogCWlmIChydikgeworCQlrZnJlZShpbnRmLT5zeXNmc19uYW1lKTsKKwkJaW50Zi0+c3lzZnNfbmFtZSA9IE5VTEw7CiAJCWtmcmVlKGludGYtPm15X2Rldl9uYW1lKTsKIAkJaW50Zi0+bXlfZGV2X25hbWUgPSBOVUxMOwogCQlwcmludGsoS0VSTl9FUlIKQEAgLTIzOTksMTcgKzI2MjksMTQgQEAKIAkJICAgICAgdm9pZAkJICAgICAgICpzZW5kX2luZm8sCiAJCSAgICAgIHN0cnVjdCBpcG1pX2RldmljZV9pZCAgICAqZGV2aWNlX2lkLAogCQkgICAgICBzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAgKnNpX2RldiwKKwkJICAgICAgY29uc3QgY2hhciAgICAgICAgICAgICAgICpzeXNmc19uYW1lLAogCQkgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgc2xhdmVfYWRkcikKIHsKIAlpbnQgICAgICAgICAgICAgIGksIGo7CiAJaW50ICAgICAgICAgICAgICBydjsKIAlpcG1pX3NtaV90ICAgICAgIGludGY7Ci0JdW5zaWduZWQgbG9uZyAgICBmbGFnczsKLQlpbnQgICAgICAgICAgICAgIHZlcnNpb25fbWFqb3I7Ci0JaW50ICAgICAgICAgICAgICB2ZXJzaW9uX21pbm9yOwotCi0JdmVyc2lvbl9tYWpvciA9IGlwbWlfdmVyc2lvbl9tYWpvcihkZXZpY2VfaWQpOwotCXZlcnNpb25fbWlub3IgPSBpcG1pX3ZlcnNpb25fbWlub3IoZGV2aWNlX2lkKTsKKwlpcG1pX3NtaV90ICAgICAgIHRpbnRmOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpbms7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIGRyaXZlciBpcyBhY3R1YWxseSBpbml0aWFsaXplZCwgdGhpcyBoYW5kbGVzCiAJICAgcHJvYmxlbXMgd2l0aCBpbml0aWFsaXphdGlvbiBvcmRlci4gKi8KQEAgLTI0MjcsMTIgKzI2NTQsMTYgQEAKIAlpZiAoIWludGYpCiAJCXJldHVybiAtRU5PTUVNOwogCW1lbXNldChpbnRmLCAwLCBzaXplb2YoKmludGYpKTsKKworCWludGYtPmlwbWlfdmVyc2lvbl9tYWpvciA9IGlwbWlfdmVyc2lvbl9tYWpvcihkZXZpY2VfaWQpOworCWludGYtPmlwbWlfdmVyc2lvbl9taW5vciA9IGlwbWlfdmVyc2lvbl9taW5vcihkZXZpY2VfaWQpOworCiAJaW50Zi0+Ym1jID0ga3phbGxvYyhzaXplb2YoKmludGYtPmJtYyksIEdGUF9LRVJORUwpOwogCWlmICghaW50Zi0+Ym1jKSB7CiAJCWtmcmVlKGludGYpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JaW50Zi0+aW50Zl9udW0gPSAtMTsKKwlpbnRmLT5pbnRmX251bSA9IC0xOyAvKiBNYXJrIGl0IGludmFsaWQgZm9yIG5vdy4gKi8KIAlrcmVmX2luaXQoJmludGYtPnJlZmNvdW50KTsKIAlpbnRmLT5ibWMtPmlkID0gKmRldmljZV9pZDsKIAlpbnRmLT5zaV9kZXYgPSBzaV9kZXY7CkBAIC0yNDYwLDI2ICsyNjkxLDMwIEBACiAJSU5JVF9MSVNUX0hFQUQoJmludGYtPndhaXRpbmdfZXZlbnRzKTsKIAlpbnRmLT53YWl0aW5nX2V2ZW50c19jb3VudCA9IDA7CiAJbXV0ZXhfaW5pdCgmaW50Zi0+Y21kX3JjdnJzX211dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmaW50Zi0+bWFpbnRlbmFuY2VfbW9kZV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmaW50Zi0+Y21kX3JjdnJzKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbnRmLT53YWl0cSk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaW50Zi0+Y291bnRlcl9sb2NrKTsKIAlpbnRmLT5wcm9jX2RpciA9IE5VTEw7CiAKLQlydiA9IC1FTk9NRU07Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKLQkJaWYgKGlwbWlfaW50ZXJmYWNlc1tpXSA9PSBOVUxMKSB7Ci0JCQlpbnRmLT5pbnRmX251bSA9IGk7Ci0JCQkvKiBSZXNlcnZlIHRoZSBlbnRyeSB0aWxsIHdlIGFyZSBkb25lLiAqLwotCQkJaXBtaV9pbnRlcmZhY2VzW2ldID0gSVBNSV9JTlZBTElEX0lOVEVSRkFDRV9FTlRSWTsKLQkJCXJ2ID0gMDsKKwltdXRleF9sb2NrKCZzbWlfd2F0Y2hlcnNfbXV0ZXgpOworCW11dGV4X2xvY2soJmlwbWlfaW50ZXJmYWNlc19tdXRleCk7CisJLyogTG9vayBmb3IgYSBob2xlIGluIHRoZSBudW1iZXJzLiAqLworCWkgPSAwOworCWxpbmsgPSAmaXBtaV9pbnRlcmZhY2VzOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRpbnRmLCAmaXBtaV9pbnRlcmZhY2VzLCBsaW5rKSB7CisJCWlmICh0aW50Zi0+aW50Zl9udW0gIT0gaSkgeworCQkJbGluayA9ICZ0aW50Zi0+bGluazsKIAkJCWJyZWFrOwogCQl9CisJCWkrKzsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZXJmYWNlc19sb2NrLCBmbGFncyk7Ci0JaWYgKHJ2KQotCQlnb3RvIG91dDsKKwkvKiBBZGQgdGhlIG5ldyBpbnRlcmZhY2UgaW4gbnVtZXJpYyBvcmRlci4gKi8KKwlpZiAoaSA9PSAwKQorCQlsaXN0X2FkZF9yY3UoJmludGYtPmxpbmssICZpcG1pX2ludGVyZmFjZXMpOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbF9yY3UoJmludGYtPmxpbmssIGxpbmspOwogCiAJcnYgPSBoYW5kbGVycy0+c3RhcnRfcHJvY2Vzc2luZyhzZW5kX2luZm8sIGludGYpOwogCWlmIChydikKQEAgLTI0ODcsOCArMjcyMiw5IEBACiAKIAlnZXRfZ3VpZChpbnRmKTsKIAotCWlmICgodmVyc2lvbl9tYWpvciA+IDEpCi0JICAgIHx8ICgodmVyc2lvbl9tYWpvciA9PSAxKSAmJiAodmVyc2lvbl9taW5vciA+PSA1KSkpCisJaWYgKChpbnRmLT5pcG1pX3ZlcnNpb25fbWFqb3IgPiAxKQorCSAgICB8fCAoKGludGYtPmlwbWlfdmVyc2lvbl9tYWpvciA9PSAxKQorCQkmJiAoaW50Zi0+aXBtaV92ZXJzaW9uX21pbm9yID49IDUpKSkKIAl7CiAJCS8qIFN0YXJ0IHNjYW5uaW5nIHRoZSBjaGFubmVscyB0byBzZWUgd2hhdCBpcwogCQkgICBhdmFpbGFibGUuICovCkBAIC0yNTExLDY0ICsyNzQ3LDY3IEBACiAJaWYgKHJ2ID09IDApCiAJCXJ2ID0gYWRkX3Byb2NfZW50cmllcyhpbnRmLCBpKTsKIAotCXJ2ID0gaXBtaV9ibWNfcmVnaXN0ZXIoaW50Zik7CisJcnYgPSBpcG1pX2JtY19yZWdpc3RlcihpbnRmLCBpLCBzeXNmc19uYW1lKTsKIAogIG91dDoKIAlpZiAocnYpIHsKIAkJaWYgKGludGYtPnByb2NfZGlyKQogCQkJcmVtb3ZlX3Byb2NfZW50cmllcyhpbnRmKTsKKwkJaW50Zi0+aGFuZGxlcnMgPSBOVUxMOworCQlsaXN0X2RlbF9yY3UoJmludGYtPmxpbmspOworCQltdXRleF91bmxvY2soJmlwbWlfaW50ZXJmYWNlc19tdXRleCk7CisJCW11dGV4X3VubG9jaygmc21pX3dhdGNoZXJzX211dGV4KTsKKwkJc3luY2hyb25pemVfcmN1KCk7CiAJCWtyZWZfcHV0KCZpbnRmLT5yZWZjb3VudCwgaW50Zl9mcmVlKTsKLQkJaWYgKGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZXJmYWNlc19sb2NrLCBmbGFncyk7Ci0JCQlpcG1pX2ludGVyZmFjZXNbaV0gPSBOVUxMOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZXJmYWNlc19sb2NrLCBmbGFncyk7Ci0JCX0KIAl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZXJmYWNlc19sb2NrLCBmbGFncyk7Ci0JCWlwbWlfaW50ZXJmYWNlc1tpXSA9IGludGY7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOworCQkvKiBBZnRlciB0aGlzIHBvaW50IHRoZSBpbnRlcmZhY2UgaXMgbGVnYWwgdG8gdXNlLiAqLworCQlpbnRmLT5pbnRmX251bSA9IGk7CisJCW11dGV4X3VubG9jaygmaXBtaV9pbnRlcmZhY2VzX211dGV4KTsKIAkJY2FsbF9zbWlfd2F0Y2hlcnMoaSwgaW50Zi0+c2lfZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZzbWlfd2F0Y2hlcnNfbXV0ZXgpOwogCX0KIAogCXJldHVybiBydjsKIH0KIAorc3RhdGljIHZvaWQgY2xlYW51cF9zbWlfbXNncyhpcG1pX3NtaV90IGludGYpCit7CisJaW50ICAgICAgICAgICAgICBpOworCXN0cnVjdCBzZXFfdGFibGUgKmVudDsKKworCS8qIE5vIG5lZWQgZm9yIGxvY2tzLCB0aGUgaW50ZXJmYWNlIGlzIGRvd24uICovCisJZm9yIChpID0gMDsgaSA8IElQTUlfSVBNQl9OVU1fU0VROyBpKyspIHsKKwkJZW50ID0gJihpbnRmLT5zZXFfdGFibGVbaV0pOworCQlpZiAoIWVudC0+aW51c2UpCisJCQljb250aW51ZTsKKwkJZGVsaXZlcl9lcnJfcmVzcG9uc2UoZW50LT5yZWN2X21zZywgSVBNSV9FUlJfVU5TUEVDSUZJRUQpOworCX0KK30KKwogaW50IGlwbWlfdW5yZWdpc3Rlcl9zbWkoaXBtaV9zbWlfdCBpbnRmKQogewotCWludCAgICAgICAgICAgICAgICAgICAgIGk7CiAJc3RydWN0IGlwbWlfc21pX3dhdGNoZXIgKnc7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CisJaW50ICAgIGludGZfbnVtID0gaW50Zi0+aW50Zl9udW07CiAKIAlpcG1pX2JtY191bnJlZ2lzdGVyKGludGYpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmludGVyZmFjZXNfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKLQkJaWYgKGlwbWlfaW50ZXJmYWNlc1tpXSA9PSBpbnRmKSB7Ci0JCQkvKiBTZXQgdGhlIGludGVyZmFjZSBudW1iZXIgcmVzZXJ2ZWQgdW50aWwgd2UKLQkJCSAqIGFyZSBkb25lLiAqLwotCQkJaXBtaV9pbnRlcmZhY2VzW2ldID0gSVBNSV9JTlZBTElEX0lOVEVSRkFDRV9FTlRSWTsKLQkJCWludGYtPmludGZfbnVtID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlcmZhY2VzX2xvY2ssZmxhZ3MpOworCW11dGV4X2xvY2soJnNtaV93YXRjaGVyc19tdXRleCk7CisJbXV0ZXhfbG9jaygmaXBtaV9pbnRlcmZhY2VzX211dGV4KTsKKwlpbnRmLT5pbnRmX251bSA9IC0xOworCWludGYtPmhhbmRsZXJzID0gTlVMTDsKKwlsaXN0X2RlbF9yY3UoJmludGYtPmxpbmspOworCW11dGV4X3VubG9jaygmaXBtaV9pbnRlcmZhY2VzX211dGV4KTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAotCWlmIChpID09IE1BWF9JUE1JX0lOVEVSRkFDRVMpCi0JCXJldHVybiAtRU5PREVWOworCWNsZWFudXBfc21pX21zZ3MoaW50Zik7CiAKIAlyZW1vdmVfcHJvY19lbnRyaWVzKGludGYpOwogCiAJLyogQ2FsbCBhbGwgdGhlIHdhdGNoZXIgaW50ZXJmYWNlcyB0byB0ZWxsIHRoZW0gdGhhdAogCSAgIGFuIGludGVyZmFjZSBpcyBnb25lLiAqLwotCWRvd25fcmVhZCgmc21pX3dhdGNoZXJzX3NlbSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmc21pX3dhdGNoZXJzLCBsaW5rKQotCQl3LT5zbWlfZ29uZShpKTsKLQl1cF9yZWFkKCZzbWlfd2F0Y2hlcnNfc2VtKTsKLQotCS8qIEFsbG93IHRoZSBlbnRyeSB0byBiZSByZXVzZWQgbm93LiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlcmZhY2VzX2xvY2ssIGZsYWdzKTsKLQlpcG1pX2ludGVyZmFjZXNbaV0gPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVyZmFjZXNfbG9jayxmbGFncyk7CisJCXctPnNtaV9nb25lKGludGZfbnVtKTsKKwltdXRleF91bmxvY2soJnNtaV93YXRjaGVyc19tdXRleCk7CiAKIAlrcmVmX3B1dCgmaW50Zi0+cmVmY291bnQsIGludGZfZnJlZSk7CiAJcmV0dXJuIDA7CkBAIC0yNjUwLDYgKzI4ODksNyBAQAogCXN0cnVjdCBpcG1pX2lwbWJfYWRkciAgICAqaXBtYl9hZGRyOwogCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICAgICAqcmVjdl9tc2c7CiAJdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGZsYWdzOworCXN0cnVjdCBpcG1pX3NtaV9oYW5kbGVycyAqaGFuZGxlcnM7CiAKIAlpZiAobXNnLT5yc3Bfc2l6ZSA8IDEwKSB7CiAJCS8qIE1lc3NhZ2Ugbm90IGJpZyBlbm91Z2gsIGp1c3QgaWdub3JlIGl0LiAqLwpAQCAtMjcwNiwxMCArMjk0NiwxNiBAQAogCQlwcmludGsoIlxuIik7CiAJfQogI2VuZGlmCi0JCWludGYtPmhhbmRsZXJzLT5zZW5kZXIoaW50Zi0+c2VuZF9pbmZvLCBtc2csIDApOwotCi0JCXJ2ID0gLTE7IC8qIFdlIHVzZWQgdGhlIG1lc3NhZ2UsIHNvIHJldHVybiB0aGUgdmFsdWUgdGhhdAotCQkJICAgIGNhdXNlcyBpdCB0byBub3QgYmUgZnJlZWQgb3IgcXVldWVkLiAqLworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWhhbmRsZXJzID0gaW50Zi0+aGFuZGxlcnM7CisJCWlmIChoYW5kbGVycykgeworCQkJaGFuZGxlcnMtPnNlbmRlcihpbnRmLT5zZW5kX2luZm8sIG1zZywgMCk7CisJCQkvKiBXZSB1c2VkIHRoZSBtZXNzYWdlLCBzbyByZXR1cm4gdGhlIHZhbHVlCisJCQkgICB0aGF0IGNhdXNlcyBpdCB0byBub3QgYmUgZnJlZWQgb3IKKwkJCSAgIHF1ZXVlZC4gKi8KKwkJCXJ2ID0gLTE7CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfSBlbHNlIHsKIAkJLyogRGVsaXZlciB0aGUgbWVzc2FnZSB0byB0aGUgdXNlci4gKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwpAQCAtMzIzMiw3ICszNDc4LDkgQEAKICAgICAgICAgICAgICAgICAgICByZXBvcnQgdGhlIGVycm9yIGltbWVkaWF0ZWx5LiAqLwogCQlpZiAoKG1zZy0+cnNwX3NpemUgPj0gMykgJiYgKG1zZy0+cnNwWzJdICE9IDApCiAJCSAgICAmJiAobXNnLT5yc3BbMl0gIT0gSVBNSV9OT0RFX0JVU1lfRVJSKQotCQkgICAgJiYgKG1zZy0+cnNwWzJdICE9IElQTUlfTE9TVF9BUkJJVFJBVElPTl9FUlIpKQorCQkgICAgJiYgKG1zZy0+cnNwWzJdICE9IElQTUlfTE9TVF9BUkJJVFJBVElPTl9FUlIpCisJCSAgICAmJiAobXNnLT5yc3BbMl0gIT0gSVBNSV9CVVNfRVJSKQorCQkgICAgJiYgKG1zZy0+cnNwWzJdICE9IElQTUlfTkFLX09OX1dSSVRFX0VSUikpCiAJCXsKIAkJCWludCBjaGFuID0gbXNnLT5yc3BbM10gJiAweGY7CiAKQEAgLTMyOTcsMTYgKzM1NDUsNiBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCi1zdGF0aWMgdm9pZAotaGFuZGxlX21zZ190aW1lb3V0KHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2cpCi17Ci0JbXNnLT5yZWN2X3R5cGUgPSBJUE1JX1JFU1BPTlNFX1JFQ1ZfVFlQRTsKLQltc2ctPm1zZ19kYXRhWzBdID0gSVBNSV9USU1FT1VUX0NPTVBMRVRJT05fQ09ERTsKLQltc2ctPm1zZy5uZXRmbiB8PSAxOyAvKiBDb252ZXJ0IHRvIGEgcmVzcG9uc2UuICovCi0JbXNnLT5tc2cuZGF0YV9sZW4gPSAxOwotCW1zZy0+bXNnLmRhdGEgPSBtc2ctPm1zZ19kYXRhOwotCWRlbGl2ZXJfcmVzcG9uc2UobXNnKTsKLX0KIAogc3RhdGljIHN0cnVjdCBpcG1pX3NtaV9tc2cgKgogc21pX2Zyb21fcmVjdl9tc2coaXBtaV9zbWlfdCBpbnRmLCBzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqcmVjdl9tc2csCkBAIC0zMzM4LDcgKzM1NzYsMTEgQEAKIAkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnRpbWVvdXRzLCBsb25nIHRpbWVvdXRfcGVyaW9kLAogCQkJICAgICAgaW50IHNsb3QsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewotCXN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2c7CisJc3RydWN0IGlwbWlfcmVjdl9tc2cgICAgICptc2c7CisJc3RydWN0IGlwbWlfc21pX2hhbmRsZXJzICpoYW5kbGVyczsKKworCWlmIChpbnRmLT5pbnRmX251bSA9PSAtMSkKKwkJcmV0dXJuOwogCiAJaWYgKCFlbnQtPmludXNlKQogCQlyZXR1cm47CkBAIC0zMzgxLDEzICszNjIzLDE5IEBACiAJCQlyZXR1cm47CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+c2VxX2xvY2ssICpmbGFncyk7CisKIAkJLyogU2VuZCB0aGUgbmV3IG1lc3NhZ2UuICBXZSBzZW5kIHdpdGggYSB6ZXJvCiAJCSAqIHByaW9yaXR5LiAgSXQgdGltZWQgb3V0LCBJIGRvdWJ0IHRpbWUgaXMKIAkJICogdGhhdCBjcml0aWNhbCBub3csIGFuZCBoaWdoIHByaW9yaXR5CiAJCSAqIG1lc3NhZ2VzIGFyZSByZWFsbHkgb25seSBmb3IgbWVzc2FnZXMgdG8gdGhlCiAJCSAqIGxvY2FsIE1DLCB3aGljaCBkb24ndCBnZXQgcmVzZW50LiAqLwotCQlpbnRmLT5oYW5kbGVycy0+c2VuZGVyKGludGYtPnNlbmRfaW5mbywKLQkJCQkgICAgICAgc21pX21zZywgMCk7CisJCWhhbmRsZXJzID0gaW50Zi0+aGFuZGxlcnM7CisJCWlmIChoYW5kbGVycykKKwkJCWludGYtPmhhbmRsZXJzLT5zZW5kZXIoaW50Zi0+c2VuZF9pbmZvLAorCQkJCQkgICAgICAgc21pX21zZywgMCk7CisJCWVsc2UKKwkJCWlwbWlfZnJlZV9zbWlfbXNnKHNtaV9tc2cpOworCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5zZXFfbG9jaywgKmZsYWdzKTsKIAl9CiB9CkBAIC0zMzk5LDE4ICszNjQ3LDEyIEBACiAJc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZywgKm1zZzI7CiAJc3RydWN0IGlwbWlfc21pX21zZyAgKnNtaV9tc2csICpzbWlfbXNnMjsKIAl1bnNpZ25lZCBsb25nICAgICAgICBmbGFnczsKLQlpbnQgICAgICAgICAgICAgICAgICBpLCBqOworCWludCAgICAgICAgICAgICAgICAgIGk7CiAKIAlJTklUX0xJU1RfSEVBRCgmdGltZW91dHMpOwogCi0Jc3Bpbl9sb2NrKCZpbnRlcmZhY2VzX2xvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKLQkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKLQkJaWYgKElQTUlfSU5WQUxJRF9JTlRFUkZBQ0UoaW50ZikpCi0JCQljb250aW51ZTsKLQkJa3JlZl9nZXQoJmludGYtPnJlZmNvdW50KTsKLQkJc3Bpbl91bmxvY2soJmludGVyZmFjZXNfbG9jayk7Ci0KKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaW50ZiwgJmlwbWlfaW50ZXJmYWNlcywgbGluaykgewogCQkvKiBTZWUgaWYgYW55IHdhaXRpbmcgbWVzc2FnZXMgbmVlZCB0byBiZSBwcm9jZXNzZWQuICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT53YWl0aW5nX21zZ3NfbG9jaywgZmxhZ3MpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc21pX21zZywgc21pX21zZzIsCkBAIC0zNDMwLDM1ICszNjcyLDYwIEBACiAJCSAgIGhhdmUgdGltZWQgb3V0LCBwdXR0aW5nIHRoZW0gaW4gdGhlIHRpbWVvdXRzCiAJCSAgIGxpc3QuICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5zZXFfbG9jaywgZmxhZ3MpOwotCQlmb3IgKGogPSAwOyBqIDwgSVBNSV9JUE1CX05VTV9TRVE7IGorKykKLQkJCWNoZWNrX21zZ190aW1lb3V0KGludGYsICYoaW50Zi0+c2VxX3RhYmxlW2pdKSwKLQkJCQkJICAmdGltZW91dHMsIHRpbWVvdXRfcGVyaW9kLCBqLAorCQlmb3IgKGkgPSAwOyBpIDwgSVBNSV9JUE1CX05VTV9TRVE7IGkrKykKKwkJCWNoZWNrX21zZ190aW1lb3V0KGludGYsICYoaW50Zi0+c2VxX3RhYmxlW2ldKSwKKwkJCQkJICAmdGltZW91dHMsIHRpbWVvdXRfcGVyaW9kLCBpLAogCQkJCQkgICZmbGFncyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPnNlcV9sb2NrLCBmbGFncyk7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJnRpbWVvdXRzLCBsaW5rKQotCQkJaGFuZGxlX21zZ190aW1lb3V0KG1zZyk7CisJCQlkZWxpdmVyX2Vycl9yZXNwb25zZShtc2csIElQTUlfVElNRU9VVF9DT01QTEVUSU9OX0NPREUpOwogCi0JCWtyZWZfcHV0KCZpbnRmLT5yZWZjb3VudCwgaW50Zl9mcmVlKTsKLQkJc3Bpbl9sb2NrKCZpbnRlcmZhY2VzX2xvY2spOworCQkvKgorCQkgKiBNYWludGVuYW5jZSBtb2RlIGhhbmRsaW5nLiAgQ2hlY2sgdGhlIHRpbWVvdXQKKwkJICogb3B0aW1pc3RpY2FsbHkgYmVmb3JlIHdlIGNsYWltIHRoZSBsb2NrLiAgSXQgbWF5CisJCSAqIG1lYW4gYSB0aW1lb3V0IGdldHMgbWlzc2VkIG9jY2FzaW9uYWxseSwgYnV0IHRoYXQKKwkJICogb25seSBtZWFucyB0aGUgdGltZW91dCBnZXRzIGV4dGVuZGVkIGJ5IG9uZSBwZXJpb2QKKwkJICogaW4gdGhhdCBjYXNlLiAgTm8gYmlnIGRlYWwsIGFuZCBpdCBhdm9pZHMgdGhlIGxvY2sKKwkJICogbW9zdCBvZiB0aGUgdGltZS4KKwkJICovCisJCWlmIChpbnRmLT5hdXRvX21haW50ZW5hbmNlX3RpbWVvdXQgPiAwKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+bWFpbnRlbmFuY2VfbW9kZV9sb2NrLCBmbGFncyk7CisJCQlpZiAoaW50Zi0+YXV0b19tYWludGVuYW5jZV90aW1lb3V0ID4gMCkgeworCQkJCWludGYtPmF1dG9fbWFpbnRlbmFuY2VfdGltZW91dAorCQkJCQktPSB0aW1lb3V0X3BlcmlvZDsKKwkJCQlpZiAoIWludGYtPm1haW50ZW5hbmNlX21vZGUKKwkJCQkgICAgJiYgKGludGYtPmF1dG9fbWFpbnRlbmFuY2VfdGltZW91dCA8PSAwKSkKKwkJCQl7CisJCQkJCWludGYtPm1haW50ZW5hbmNlX21vZGVfZW5hYmxlID0gMDsKKwkJCQkJbWFpbnRlbmFuY2VfbW9kZV91cGRhdGUoaW50Zik7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50Zi0+bWFpbnRlbmFuY2VfbW9kZV9sb2NrLAorCQkJCQkgICAgICAgZmxhZ3MpOworCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZpbnRlcmZhY2VzX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgdm9pZCBpcG1pX3JlcXVlc3RfZXZlbnQodm9pZCkKIHsKLQlpcG1pX3NtaV90IGludGY7Ci0JaW50ICAgICAgICBpOworCWlwbWlfc21pX3QgICAgICAgICAgICAgICBpbnRmOworCXN0cnVjdCBpcG1pX3NtaV9oYW5kbGVycyAqaGFuZGxlcnM7CiAKLQlzcGluX2xvY2soJmludGVyZmFjZXNfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgewotCQlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOwotCQlpZiAoSVBNSV9JTlZBTElEX0lOVEVSRkFDRShpbnRmKSkKKwlyY3VfcmVhZF9sb2NrKCk7CisJLyogQ2FsbGVkIGZyb20gdGhlIHRpbWVyLCBubyBuZWVkIHRvIGNoZWNrIGlmIGhhbmRsZXJzIGlzCisJICogdmFsaWQuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaW50ZiwgJmlwbWlfaW50ZXJmYWNlcywgbGluaykgeworCQkvKiBObyBldmVudCByZXF1ZXN0cyB3aGVuIGluIG1haW50ZW5hbmNlIG1vZGUuICovCisJCWlmIChpbnRmLT5tYWludGVuYW5jZV9tb2RlX2VuYWJsZSkKIAkJCWNvbnRpbnVlOwogCi0JCWludGYtPmhhbmRsZXJzLT5yZXF1ZXN0X2V2ZW50cyhpbnRmLT5zZW5kX2luZm8pOworCQloYW5kbGVycyA9IGludGYtPmhhbmRsZXJzOworCQlpZiAoaGFuZGxlcnMpCisJCQloYW5kbGVycy0+cmVxdWVzdF9ldmVudHMoaW50Zi0+c2VuZF9pbmZvKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmludGVyZmFjZXNfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpcG1pX3RpbWVyOwpAQCAtMzU4Nyw3ICszODU0LDYgQEAKIAlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgbXNnOwogCWlwbWlfc21pX3QgICAgICAgICAgICAgICAgICAgICAgICBpbnRmOwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICBkYXRhWzE2XTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKIAlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgKnNpOwogCXN0cnVjdCBpcG1pX2FkZHIgICAgICAgICAgICAgICAgICBhZGRyOwogCXN0cnVjdCBpcG1pX3NtaV9tc2cgICAgICAgICAgICAgICBzbWlfbXNnOwpAQCAtMzYyMSw5ICszODg3LDkgQEAKIAlyZWN2X21zZy5kb25lID0gZHVtbXlfcmVjdl9kb25lX2hhbmRsZXI7CiAKIAkvKiBGb3IgZXZlcnkgcmVnaXN0ZXJlZCBpbnRlcmZhY2UsIHNlbmQgdGhlIGV2ZW50LiAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBNSV9JTlRFUkZBQ0VTOyBpKyspIHsKLQkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKLQkJaWYgKElQTUlfSU5WQUxJRF9JTlRFUkZBQ0UoaW50ZikpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaW50ZiwgJmlwbWlfaW50ZXJmYWNlcywgbGluaykgeworCQlpZiAoIWludGYtPmhhbmRsZXJzKQorCQkJLyogSW50ZXJmYWNlIGlzIG5vdCByZWFkeS4gKi8KIAkJCWNvbnRpbnVlOwogCiAJCS8qIFNlbmQgdGhlIGV2ZW50IGFubm91bmNpbmcgdGhlIHBhbmljLiAqLwpAQCAtMzY0OCwxMyArMzkxNCwxNCBAQAogCWlmICghc3RyKSAKIAkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgeworCS8qIEZvciBldmVyeSByZWdpc3RlcmVkIGludGVyZmFjZSwgc2VuZCB0aGUgZXZlbnQuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaW50ZiwgJmlwbWlfaW50ZXJmYWNlcywgbGluaykgewogCQljaGFyICAgICAgICAgICAgICAgICAgKnAgPSBzdHI7CiAJCXN0cnVjdCBpcG1pX2lwbWJfYWRkciAqaXBtYjsKIAkJaW50ICAgICAgICAgICAgICAgICAgIGo7CiAKLQkJaW50ZiA9IGlwbWlfaW50ZXJmYWNlc1tpXTsKLQkJaWYgKElQTUlfSU5WQUxJRF9JTlRFUkZBQ0UoaW50ZikpCisJCWlmIChpbnRmLT5pbnRmX251bSA9PSAtMSkKKwkJCS8qIEludGVyZmFjZSB3YXMgbm90IHJlYWR5IHlldC4gKi8KIAkJCWNvbnRpbnVlOwogCiAJCS8qIEZpcnN0IGpvYiBoZXJlIGlzIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdG8gc2VuZCB0aGUKQEAgLTM3NzQsMTMgKzQwNDEsMTIgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfSVBNSV9QQU5JQ19FVkVOVCAqLwogCi1zdGF0aWMgaW50IGhhc19wYW5pY2tlZCA9IDA7CitzdGF0aWMgaW50IGhhc19wYW5pY2tlZDsKIAogc3RhdGljIGludCBwYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAqcHRyKQogewotCWludCAgICAgICAgaTsKIAlpcG1pX3NtaV90IGludGY7CiAKIAlpZiAoaGFzX3Bhbmlja2VkKQpAQCAtMzc4OCw5ICs0MDU0LDkgQEAKIAloYXNfcGFuaWNrZWQgPSAxOwogCiAJLyogRm9yIGV2ZXJ5IHJlZ2lzdGVyZWQgaW50ZXJmYWNlLCBzZXQgaXQgdG8gcnVuIHRvIGNvbXBsZXRpb24uICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9JUE1JX0lOVEVSRkFDRVM7IGkrKykgewotCQlpbnRmID0gaXBtaV9pbnRlcmZhY2VzW2ldOwotCQlpZiAoSVBNSV9JTlZBTElEX0lOVEVSRkFDRShpbnRmKSkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShpbnRmLCAmaXBtaV9pbnRlcmZhY2VzLCBsaW5rKSB7CisJCWlmICghaW50Zi0+aGFuZGxlcnMpCisJCQkvKiBJbnRlcmZhY2UgaXMgbm90IHJlYWR5LiAqLwogCQkJY29udGludWU7CiAKIAkJaW50Zi0+aGFuZGxlcnMtPnNldF9ydW5fdG9fY29tcGxldGlvbihpbnRmLT5zZW5kX2luZm8sIDEpOwpAQCAtMzgxMSw3ICs0MDc3LDYgQEAKIAogc3RhdGljIGludCBpcG1pX2luaXRfbXNnaGFuZGxlcih2b2lkKQogewotCWludCBpOwogCWludCBydjsKIAogCWlmIChpbml0aWFsaXplZCkKQEAgLTM4MjYsOSArNDA5MSw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiaXBtaSBtZXNzYWdlIGhhbmRsZXIgdmVyc2lvbiAiCiAJICAgICAgIElQTUlfRFJJVkVSX1ZFUlNJT04gIlxuIik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQTUlfSU5URVJGQUNFUzsgaSsrKQotCQlpcG1pX2ludGVyZmFjZXNbaV0gPSBOVUxMOwotCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlwcm9jX2lwbWlfcm9vdCA9IHByb2NfbWtkaXIoImlwbWkiLCBOVUxMKTsKIAlpZiAoIXByb2NfaXBtaV9yb290KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKaW5kZXggOGQ5NDFkYi4uOWQyMzEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYwpAQCAtNDMsNiArNDMsOSBAQAogCiAjZGVmaW5lIFBGWCAiSVBNSSBwb3dlcm9mZjogIgogCitzdGF0aWMgdm9pZCBpcG1pX3BvX3NtaV9nb25lKGludCBpZl9udW0pOworc3RhdGljIHZvaWQgaXBtaV9wb19uZXdfc21pKGludCBpZl9udW0sIHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CisKIC8qIERlZmluaXRpb25zIGZvciBjb250cm9sbGluZyBwb3dlciBvZmYgKGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgaXQpLiAgSXQKICAqIGNvbnZlbmllbnRseSBtYXRjaGVzIHRoZSBJUE1JIGNoYXNzaXMgY29udHJvbCB2YWx1ZXMuICovCiAjZGVmaW5lIElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOCQkwCS8qIHBvd2VyIGRvd24sIHRoZSBkZWZhdWx0LiAqLwpAQCAtNTEsNiArNTQsMzcgQEAKIC8qIHRoZSBJUE1JIGRhdGEgY29tbWFuZCAqLwogc3RhdGljIGludCBwb3dlcm9mZl9wb3dlcmN5Y2xlOwogCisvKiBXaGljaCBpbnRlcmZhY2UgdG8gdXNlLCAtMSBtZWFucyB0aGUgZmlyc3Qgd2Ugc2VlLiAqLworc3RhdGljIGludCBpZm51bV90b191c2UgPSAtMTsKKworLyogT3VyIGxvY2FsIHN0YXRlLiAqLworc3RhdGljIGludCByZWFkeTsKK3N0YXRpYyBpcG1pX3VzZXJfdCBpcG1pX3VzZXI7CitzdGF0aWMgaW50IGlwbWlfaWZudW07CitzdGF0aWMgdm9pZCAoKnNwZWNpZmljX3Bvd2Vyb2ZmX2Z1bmMpKGlwbWlfdXNlcl90IHVzZXIpOworCisvKiBIb2xkcyB0aGUgb2xkIHBvd2Vyb2ZmIGZ1bmN0aW9uIHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIHJlbW92YWwuICovCitzdGF0aWMgdm9pZCAoKm9sZF9wb3dlcm9mZl9mdW5jKSh2b2lkKTsKKworc3RhdGljIGludCBzZXRfcGFyYW1faWZudW0oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpbnQgcnYgPSBwYXJhbV9zZXRfaW50KHZhbCwga3ApOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCWlmICgoaWZudW1fdG9fdXNlIDwgMCkgfHwgKGlmbnVtX3RvX3VzZSA9PSBpcG1pX2lmbnVtKSkKKwkJcmV0dXJuIDA7CisKKwlpcG1pX3BvX3NtaV9nb25lKGlwbWlfaWZudW0pOworCWlwbWlfcG9fbmV3X3NtaShpZm51bV90b191c2UsIE5VTEwpOworCXJldHVybiAwOworfQorCittb2R1bGVfcGFyYW1fY2FsbChpZm51bV90b191c2UsIHNldF9wYXJhbV9pZm51bSwgcGFyYW1fZ2V0X2ludCwKKwkJICAmaWZudW1fdG9fdXNlLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWZudW1fdG9fdXNlLCAiVGhlIGludGVyZmFjZSBudW1iZXIgdG8gdXNlIGZvciB0aGUgd2F0Y2hkb2cgIgorCQkgInRpbWVyLiAgU2V0dGluZyB0byAtMSBkZWZhdWx0cyB0byB0aGUgZmlyc3QgcmVnaXN0ZXJlZCAiCisJCSAiaW50ZXJmYWNlIik7CisKIC8qIHBhcmFtZXRlciBkZWZpbml0aW9uIHRvIGFsbG93IHVzZXIgdG8gZmxhZyBwb3dlciBjeWNsZSAqLwogbW9kdWxlX3BhcmFtKHBvd2Vyb2ZmX3Bvd2VyY3ljbGUsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd2Vyb2ZmX3Bvd2VyY3ljbGUsICIgU2V0IHRvIG5vbi16ZXJvIHRvIGVuYWJsZSBwb3dlciBjeWNsZSBpbnN0ZWFkIG9mIHBvd2VyIGRvd24uIFBvd2VyIGN5Y2xlIGlzIGNvbnRpbmdlbnQgb24gaGFyZHdhcmUgc3VwcG9ydCwgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzIGJhY2sgdG8gcG93ZXIgZG93bi4iKTsKQEAgLTE0Miw2ICsxNzYsNDIgQEAKICNkZWZpbmUgSVBNSV9BVENBX0dFVF9BRERSX0lORk9fQ01ECTB4MDEKICNkZWZpbmUgSVBNSV9QSUNNR19JRAkJCTAKIAorI2RlZmluZSBJUE1JX05FVEZOX09FTQkJCQkweDJlCisjZGVmaW5lIElQTUlfQVRDQV9QUFNfR1JBQ0VGVUxfUkVTVEFSVAkJMHgxMQorI2RlZmluZSBJUE1JX0FUQ0FfUFBTX0lBTkEJCQkiXHgwMFx4NDBceDBBIgorI2RlZmluZSBJUE1JX01PVE9ST0xBX01BTlVGQUNUVVJFUl9JRAkJMHgwMDAwQTEKKyNkZWZpbmUgSVBNSV9NT1RPUk9MQV9QUFNfSVBNQ19QUk9EVUNUX0lECTB4MDA1MQorCitzdGF0aWMgdm9pZCAoKmF0Y2Ffb2VtX3Bvd2Vyb2ZmX2hvb2spKGlwbWlfdXNlcl90IHVzZXIpOworCitzdGF0aWMgdm9pZCBwcHNfcG93ZXJvZmZfYXRjYSAoaXBtaV91c2VyX3QgdXNlcikKK3sKKyAgICAgICAgc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIHNtaV9hZGRyOworICAgICAgICBzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgc2VuZF9tc2c7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29uZmlndXJlIElQTUkgYWRkcmVzcyBmb3IgbG9jYWwgYWNjZXNzCisgICAgICAgICAqLworICAgICAgICBzbWlfYWRkci5hZGRyX3R5cGUgPSBJUE1JX1NZU1RFTV9JTlRFUkZBQ0VfQUREUl9UWVBFOworICAgICAgICBzbWlfYWRkci5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKKyAgICAgICAgc21pX2FkZHIubHVuID0gMDsKKworICAgICAgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiUFBTIHBvd2VyZG93biBob29rIHVzZWQiKTsKKworICAgICAgICBzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fT0VNOworICAgICAgICBzZW5kX21zZy5jbWQgPSBJUE1JX0FUQ0FfUFBTX0dSQUNFRlVMX1JFU1RBUlQ7CisgICAgICAgIHNlbmRfbXNnLmRhdGEgPSBJUE1JX0FUQ0FfUFBTX0lBTkE7CisgICAgICAgIHNlbmRfbXNnLmRhdGFfbGVuID0gMzsKKyAgICAgICAgcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbmRfbXNnKTsKKyAgICAgICAgaWYgKHJ2ICYmIHJ2ICE9IElQTUlfVU5LTk9XTl9FUlJfQ09NUExFVElPTl9DT0RFKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHNlbmQgQVRDQSAsIgorICAgICAgICAgICAgICAgICAgICAgICAiIElQTUkgZXJyb3IgMHgleFxuIiwgcnYpOworICAgICAgICB9CisJcmV0dXJuOworfQorCiBzdGF0aWMgaW50IGlwbWlfYXRjYV9kZXRlY3QgKGlwbWlfdXNlcl90IHVzZXIpCiB7CiAJc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyIHNtaV9hZGRyOwpAQCAtMTY3LDYgKzIzNywxMyBAQAogCXJ2ID0gaXBtaV9yZXF1ZXN0X3dhaXRfZm9yX3Jlc3BvbnNlKHVzZXIsCiAJCQkJCSAgICAoc3RydWN0IGlwbWlfYWRkciAqKSAmc21pX2FkZHIsCiAJCQkJCSAgICAmc2VuZF9tc2cpOworCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gUEZYICJBVENBIERldGVjdCBtZmcgMHglWCBwcm9kIDB4JVhcbiIsIG1mZ19pZCwgcHJvZF9pZCk7CisgICAgICAgIGlmKChtZmdfaWQgPT0gSVBNSV9NT1RPUk9MQV9NQU5VRkFDVFVSRVJfSUQpCisgICAgICAgICAgICAmJiAocHJvZF9pZCA9PSBJUE1JX01PVE9ST0xBX1BQU19JUE1DX1BST0RVQ1RfSUQpKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJJbnN0YWxsaW5nIFBpZ2VvbiBQb2ludCBTeXN0ZW1zIFBvd2Vyb2ZmIEhvb2tcbiIpOworCQlhdGNhX29lbV9wb3dlcm9mZl9ob29rID0gcHBzX3Bvd2Vyb2ZmX2F0Y2E7CisJfQogCXJldHVybiAhcnY7CiB9CiAKQEAgLTIwMCwxMiArMjc3LDE5IEBACiAJcnYgPSBpcG1pX3JlcXVlc3RfaW5fcmNfbW9kZSh1c2VyLAogCQkJCSAgICAgKHN0cnVjdCBpcG1pX2FkZHIgKikgJnNtaV9hZGRyLAogCQkJCSAgICAgJnNlbmRfbXNnKTsKLQlpZiAocnYpIHsKKyAgICAgICAgLyoqIEF0IHRoaXMgcG9pbnQsIHRoZSBzeXN0ZW0gbWF5IGJlIHNodXR0aW5nIGRvd24sIGFuZCBtb3N0CisgICAgICAgICAqKiBzZXJpYWwgZHJpdmVycyAoaWYgdXNlZCkgd2lsbCBoYXZlIGludGVycnVwdHMgdHVybmVkIG9mZgorICAgICAgICAgKiogaXQgbWF5IGJlIGJldHRlciB0byBpZ25vcmUgSVBNSV9VTktOT1dOX0VSUl9DT01QTEVUSU9OX0NPREUKKyAgICAgICAgICoqIHJldHVybiBjb2RlCisgICAgICAgICAqKi8KKyAgICAgICAgaWYgKHJ2ICYmIHJ2ICE9IElQTUlfVU5LTk9XTl9FUlJfQ09NUExFVElPTl9DT0RFKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBzZW5kIEFUQ0EgcG93ZXJkb3duIG1lc3NhZ2UsIgogCQkgICAgICAgIiBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKIAkJZ290byBvdXQ7CiAJfQogCisJaWYoYXRjYV9vZW1fcG93ZXJvZmZfaG9vaykKKwkJcmV0dXJuIGF0Y2Ffb2VtX3Bvd2Vyb2ZmX2hvb2sodXNlcik7CiAgb3V0OgogCXJldHVybjsKIH0KQEAgLTQ0MCwxNSArNTI0LDYgQEAKIAkJICAgICAgLyBzaXplb2Yoc3RydWN0IHBvd2Vyb2ZmX2Z1bmN0aW9uKSkKIAogCi0vKiBPdXIgbG9jYWwgc3RhdGUuICovCi1zdGF0aWMgaW50IHJlYWR5ID0gMDsKLXN0YXRpYyBpcG1pX3VzZXJfdCBpcG1pX3VzZXI7Ci1zdGF0aWMgdm9pZCAoKnNwZWNpZmljX3Bvd2Vyb2ZmX2Z1bmMpKGlwbWlfdXNlcl90IHVzZXIpID0gTlVMTDsKLQotLyogSG9sZHMgdGhlIG9sZCBwb3dlcm9mZiBmdW5jdGlvbiBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiByZW1vdmFsLiAqLwotc3RhdGljIHZvaWQgKCpvbGRfcG93ZXJvZmZfZnVuYykodm9pZCk7Ci0KLQogLyogQ2FsbGVkIG9uIGEgcG93ZXJkb3duIHJlcXVlc3QuICovCiBzdGF0aWMgdm9pZCBpcG1pX3Bvd2Vyb2ZmX2Z1bmN0aW9uICh2b2lkKQogewpAQCAtNDczLDYgKzU0OCw5IEBACiAJaWYgKHJlYWR5KQogCQlyZXR1cm47CiAKKwlpZiAoKGlmbnVtX3RvX3VzZSA+PSAwKSAmJiAoaWZudW1fdG9fdXNlICE9IGlmX251bSkpCisJCXJldHVybjsKKwogCXJ2ID0gaXBtaV9jcmVhdGVfdXNlcihpZl9udW0sICZpcG1pX3Bvd2Vyb2ZmX2hhbmRsZXIsIE5VTEwsCiAJCQkgICAgICAmaXBtaV91c2VyKTsKIAlpZiAocnYpIHsKQEAgLTQ4MSw2ICs1NTksOCBAQAogCQlyZXR1cm47CiAJfQogCisJaXBtaV9pZm51bSA9IGlmX251bTsKKwogICAgICAgICAvKgogICAgICAgICAgKiBEbyBhIGdldCBkZXZpY2UgaWRlIGFuZCBzdG9yZSBzb21lIHJlc3VsdHMsIHNpbmNlIHRoaXMgaXMKIAkgKiB1c2VkIGJ5IHNldmVyYWwgZnVuY3Rpb25zLgpAQCAtNTQxLDkgKzYyMSwxNSBAQAogCiBzdGF0aWMgdm9pZCBpcG1pX3BvX3NtaV9nb25lKGludCBpZl9udW0pCiB7Ci0JLyogVGhpcyBjYW4gbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIG9uY2UgcG93ZXJvZmYgZHJpdmVyIGlzCi0JICAgcmVnaXN0ZXJlZCwgdGhlIGludGVyZmFjZSBjYW4ndCBnbyBhd2F5IHVudGlsIHRoZSBwb3dlcgotCSAgIGRyaXZlciBpcyB1bnJlZ2lzdGVyZWQuICovCisJaWYgKCFyZWFkeSkKKwkJcmV0dXJuOworCisJaWYgKGlwbWlfaWZudW0gIT0gaWZfbnVtKQorCQlyZXR1cm47CisKKwlyZWFkeSA9IDA7CisJaXBtaV9kZXN0cm95X3VzZXIoaXBtaV91c2VyKTsKKwlwbV9wb3dlcl9vZmYgPSBvbGRfcG93ZXJvZmZfZnVuYzsKIH0KIAogc3RhdGljIHN0cnVjdCBpcG1pX3NtaV93YXRjaGVyIHNtaV93YXRjaGVyID0KQEAgLTYxNiw5ICs3MDIsOSBAQAogCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgU01JIHdhdGNoZXI6ICVkXG4iLCBydik7CiAJCWdvdG8gb3V0X2VycjsKIAl9Ci0jZW5kaWYKIAogIG91dF9lcnI6CisjZW5kaWYKIAlyZXR1cm4gcnY7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKaW5kZXggMjQ4MjViZC4uZjFhZmQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKQEAgLTYxLDYgKzYxLDEwIEBACiAjaW5jbHVkZSAiaXBtaV9zaV9zbS5oIgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjZGVmaW5lIFBGWCAiaXBtaV9zaTogIgogCiAvKiBNZWFzdXJlIHRpbWVzIGJldHdlZW4gZXZlbnRzIGluIHRoZSBkcml2ZXIuICovCiAjdW5kZWYgREVCVUdfVElNSU5HCkBAIC05Miw3ICs5Niw3IEBACiBlbnVtIHNpX3R5cGUgewogICAgIFNJX0tDUywgU0lfU01JQywgU0lfQlQKIH07Ci1zdGF0aWMgY2hhciAqc2lfdG9fc3RyW10gPSB7ICJLQ1MiLCAiU01JQyIsICJCVCIgfTsKK3N0YXRpYyBjaGFyICpzaV90b19zdHJbXSA9IHsgImtjcyIsICJzbWljIiwgImJ0IiB9OwogCiAjZGVmaW5lIERFVklDRV9OQU1FICJpcG1pX3NpIgogCkBAIC0yMjIsNyArMjI2LDEwIEBACiBzdGF0aWMgaW50IGZvcmNlX2tpcG1pZFtTSV9NQVhfUEFSTVNdOwogc3RhdGljIGludCBudW1fZm9yY2Vfa2lwbWlkOwogCitzdGF0aWMgaW50IHVubG9hZF93aGVuX2VtcHR5ID0gMTsKKwogc3RhdGljIGludCB0cnlfc21pX2luaXQoc3RydWN0IHNtaV9pbmZvICpzbWkpOworc3RhdGljIHZvaWQgY2xlYW51cF9vbmVfc2koc3RydWN0IHNtaV9pbmZvICp0b19jbGVhbik7CiAKIHN0YXRpYyBBVE9NSUNfTk9USUZJRVJfSEVBRCh4YWN0aW9uX25vdGlmaWVyX2xpc3QpOwogc3RhdGljIGludCByZWdpc3Rlcl94YWN0aW9uX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqIG5iKQpAQCAtMjQwLDE0ICsyNDcsMTggQEAKIAlzcGluX2xvY2soJihzbWlfaW5mby0+c2lfbG9jaykpOwogfQogCi1zdGF0aWMgdm9pZCByZXR1cm5faG9zZWRfbXNnKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCitzdGF0aWMgdm9pZCByZXR1cm5faG9zZWRfbXNnKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8sIGludCBjQ29kZSkKIHsKIAlzdHJ1Y3QgaXBtaV9zbWlfbXNnICptc2cgPSBzbWlfaW5mby0+Y3Vycl9tc2c7CiAKKwlpZiAoY0NvZGUgPCAwIHx8IGNDb2RlID4gSVBNSV9FUlJfVU5TUEVDSUZJRUQpCisJCWNDb2RlID0gSVBNSV9FUlJfVU5TUEVDSUZJRUQ7CisJLyogZWxzZSB1c2UgaXQgYXMgaXMgKi8KKwogCS8qIE1ha2UgaXQgYSByZXBvbnNlICovCiAJbXNnLT5yc3BbMF0gPSBtc2ctPmRhdGFbMF0gfCA0OwogCW1zZy0+cnNwWzFdID0gbXNnLT5kYXRhWzFdOwotCW1zZy0+cnNwWzJdID0gMHhGRjsgLyogVW5rbm93biBlcnJvci4gKi8KKwltc2ctPnJzcFsyXSA9IGNDb2RlOwogCW1zZy0+cnNwX3NpemUgPSAzOwogCiAJc21pX2luZm8tPmN1cnJfbXNnID0gTlVMTDsKQEAgLTI5OCw3ICszMDksNyBAQAogCQkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhLAogCQkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhX3NpemUpOwogCQlpZiAoZXJyKSB7Ci0JCQlyZXR1cm5faG9zZWRfbXNnKHNtaV9pbmZvKTsKKwkJCXJldHVybl9ob3NlZF9tc2coc21pX2luZm8sIGVycik7CiAJCX0KIAogCQlydiA9IFNJX1NNX0NBTExfV0lUSE9VVF9ERUxBWTsKQEAgLTY0MCw3ICs2NTEsNyBAQAogCQkJLyogSWYgd2Ugd2VyZSBoYW5kbGluZyBhIHVzZXIgbWVzc2FnZSwgZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHJlc3BvbnNlIHRvIHNlbmQgdG8gdGhlIHVwcGVyIGxheWVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxsIGl0IGFib3V0IHRoZSBlcnJvci4gKi8KLQkJCXJldHVybl9ob3NlZF9tc2coc21pX2luZm8pOworCQkJcmV0dXJuX2hvc2VkX21zZyhzbWlfaW5mbywgSVBNSV9FUlJfVU5TUEVDSUZJRUQpOwogCQl9CiAJCXNpX3NtX3Jlc3VsdCA9IHNtaV9pbmZvLT5oYW5kbGVycy0+ZXZlbnQoc21pX2luZm8tPnNpX3NtLCAwKTsKIAl9CkBAIC02ODQsMjIgKzY5NSwyNCBAQAogCXsKIAkJLyogV2UgYXJlIGlkbGUgYW5kIHRoZSB1cHBlciBsYXllciByZXF1ZXN0ZWQgdGhhdCBJIGZldGNoCiAJCSAgIGV2ZW50cywgc28gZG8gc28uICovCi0JCXVuc2lnbmVkIGNoYXIgbXNnWzJdOwotCi0JCXNwaW5fbG9jaygmc21pX2luZm8tPmNvdW50X2xvY2spOwotCQlzbWlfaW5mby0+ZmxhZ19mZXRjaGVzKys7Ci0JCXNwaW5fdW5sb2NrKCZzbWlfaW5mby0+Y291bnRfbG9jayk7Ci0KIAkJYXRvbWljX3NldCgmc21pX2luZm8tPnJlcV9ldmVudHMsIDApOwotCQltc2dbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKLQkJbXNnWzFdID0gSVBNSV9HRVRfTVNHX0ZMQUdTX0NNRDsKKworCQlzbWlfaW5mby0+Y3Vycl9tc2cgPSBpcG1pX2FsbG9jX3NtaV9tc2coKTsKKwkJaWYgKCFzbWlfaW5mby0+Y3Vycl9tc2cpCisJCQlnb3RvIG91dDsKKworCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFbMF0gPSAoSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyKTsKKwkJc21pX2luZm8tPmN1cnJfbXNnLT5kYXRhWzFdID0gSVBNSV9SRUFEX0VWRU5UX01TR19CVUZGRVJfQ01EOworCQlzbWlfaW5mby0+Y3Vycl9tc2ctPmRhdGFfc2l6ZSA9IDI7CiAKIAkJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbigKLQkJCXNtaV9pbmZvLT5zaV9zbSwgbXNnLCAyKTsKLQkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19GTEFHUzsKKwkJCXNtaV9pbmZvLT5zaV9zbSwKKwkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YSwKKwkJCXNtaV9pbmZvLT5jdXJyX21zZy0+ZGF0YV9zaXplKTsKKwkJc21pX2luZm8tPnNpX3N0YXRlID0gU0lfR0VUVElOR19FVkVOVFM7CiAJCWdvdG8gcmVzdGFydDsKIAl9Ci0KKyBvdXQ6CiAJcmV0dXJuIHNpX3NtX3Jlc3VsdDsKIH0KIApAQCAtNzE0LDYgKzcyNywxNSBAQAogCXN0cnVjdCB0aW1ldmFsICAgIHQ7CiAjZW5kaWYKIAorCWlmIChhdG9taWNfcmVhZCgmc21pX2luZm8tPnN0b3Bfb3BlcmF0aW9uKSkgeworCQltc2ctPnJzcFswXSA9IG1zZy0+ZGF0YVswXSB8IDQ7CisJCW1zZy0+cnNwWzFdID0gbXNnLT5kYXRhWzFdOworCQltc2ctPnJzcFsyXSA9IElQTUlfRVJSX1VOU1BFQ0lGSUVEOworCQltc2ctPnJzcF9zaXplID0gMzsKKwkJZGVsaXZlcl9yZWN2X21zZyhzbWlfaW5mbywgbXNnKTsKKwkJcmV0dXJuOworCX0KKwogCXNwaW5fbG9ja19pcnFzYXZlKCYoc21pX2luZm8tPm1zZ19sb2NrKSwgZmxhZ3MpOwogI2lmZGVmIERFQlVHX1RJTUlORwogCWRvX2dldHRpbWVvZmRheSgmdCk7CkBAIC04MDUsMTcgKzgyNywyNSBAQAogewogCXN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8gPSBzZW5kX2luZm87CiAKLQlzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywgMCk7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZSBkZWxheSBpbiB0aGUgcG9sbCBsb29wIHNvIHdlIGNhbgorCSAqIGRyaXZlIHRpbWUgZm9yd2FyZCBhbmQgdGltZW91dCB0aGluZ3MuCisJICovCisJdWRlbGF5KDEwKTsKKwlzbWlfZXZlbnRfaGFuZGxlcihzbWlfaW5mbywgMTApOwogfQogCiBzdGF0aWMgdm9pZCByZXF1ZXN0X2V2ZW50cyh2b2lkICpzZW5kX2luZm8pCiB7CiAJc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbyA9IHNlbmRfaW5mbzsKIAorCWlmIChhdG9taWNfcmVhZCgmc21pX2luZm8tPnN0b3Bfb3BlcmF0aW9uKSkKKwkJcmV0dXJuOworCiAJYXRvbWljX3NldCgmc21pX2luZm8tPnJlcV9ldmVudHMsIDEpOwogfQogCi1zdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiAKIHN0YXRpYyB2b2lkIHNtaV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKQEAgLTk0OSwxMiArOTc5LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9tYWludGVuYW5jZV9tb2RlKHZvaWQgKnNlbmRfaW5mbywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc21pX2luZm8gICAqc21pX2luZm8gPSBzZW5kX2luZm87CisKKwlpZiAoIWVuYWJsZSkKKwkJYXRvbWljX3NldCgmc21pX2luZm8tPnJlcV9ldmVudHMsIDApOworfQorCiBzdGF0aWMgc3RydWN0IGlwbWlfc21pX2hhbmRsZXJzIGhhbmRsZXJzID0KIHsKIAkub3duZXIgICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAogCS5zdGFydF9wcm9jZXNzaW5nICAgICAgID0gc21pX3N0YXJ0X3Byb2Nlc3NpbmcsCiAJLnNlbmRlcgkJCT0gc2VuZGVyLAogCS5yZXF1ZXN0X2V2ZW50cwkJPSByZXF1ZXN0X2V2ZW50cywKKwkuc2V0X21haW50ZW5hbmNlX21vZGUgICA9IHNldF9tYWludGVuYW5jZV9tb2RlLAogCS5zZXRfcnVuX3RvX2NvbXBsZXRpb24gID0gc2V0X3J1bl90b19jb21wbGV0aW9uLAogCS5wb2xsCQkJPSBwb2xsLAogfTsKQEAgLTk3OSwxNCArMTAxOCwyNCBAQAogc3RhdGljIGludCAgICAgICAgICAgaXJxc1tTSV9NQVhfUEFSTVNdOwogc3RhdGljIGludCBudW1faXJxczsKIHN0YXRpYyBpbnQgICAgICAgICAgIHJlZ3NwYWNpbmdzW1NJX01BWF9QQVJNU107Ci1zdGF0aWMgaW50IG51bV9yZWdzcGFjaW5ncyA9IDA7CitzdGF0aWMgaW50IG51bV9yZWdzcGFjaW5nczsKIHN0YXRpYyBpbnQgICAgICAgICAgIHJlZ3NpemVzW1NJX01BWF9QQVJNU107Ci1zdGF0aWMgaW50IG51bV9yZWdzaXplcyA9IDA7CitzdGF0aWMgaW50IG51bV9yZWdzaXplczsKIHN0YXRpYyBpbnQgICAgICAgICAgIHJlZ3NoaWZ0c1tTSV9NQVhfUEFSTVNdOwotc3RhdGljIGludCBudW1fcmVnc2hpZnRzID0gMDsKK3N0YXRpYyBpbnQgbnVtX3JlZ3NoaWZ0czsKIHN0YXRpYyBpbnQgc2xhdmVfYWRkcnNbU0lfTUFYX1BBUk1TXTsKLXN0YXRpYyBpbnQgbnVtX3NsYXZlX2FkZHJzID0gMDsKK3N0YXRpYyBpbnQgbnVtX3NsYXZlX2FkZHJzOwogCisjZGVmaW5lIElQTUlfSU9fQUREUl9TUEFDRSAgMAorI2RlZmluZSBJUE1JX01FTV9BRERSX1NQQUNFIDEKK3N0YXRpYyBjaGFyICphZGRyX3NwYWNlX3RvX3N0cltdID0geyAiaS9vIiwgIm1lbSIgfTsKKworc3RhdGljIGludCBob3Rtb2RfaGFuZGxlcihjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKKworbW9kdWxlX3BhcmFtX2NhbGwoaG90bW9kLCBob3Rtb2RfaGFuZGxlciwgTlVMTCwgTlVMTCwgMDIwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhvdG1vZCwgIkFkZCBhbmQgcmVtb3ZlIGludGVyZmFjZXMuICBTZWUiCisJCSAiIERvY3VtZW50YXRpb24vSVBNSS50eHQgaW4gdGhlIGtlcm5lbCBzb3VyY2VzIGZvciB0aGUiCisJCSAiIGdvcnkgZGV0YWlscy4iKTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKHRyeWRlZmF1bHRzLCBzaV90cnlkZWZhdWx0cywgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRyeWRlZmF1bHRzLCAiU2V0dGluZyB0aGlzIHRvICdmYWxzZScgd2lsbCBkaXNhYmxlIHRoZSIKQEAgLTEwMzgsMTIgKzEwODcsMTIgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfa2lwbWlkLCAiRm9yY2UgdGhlIGtpcG1pIGRhZW1vbiB0byBiZSBlbmFibGVkICgxKSBvciIKIAkJICIgZGlzYWJsZWQoMCkuICBOb3JtYWxseSB0aGUgSVBNSSBkcml2ZXIgYXV0by1kZXRlY3RzIgogCQkgIiB0aGlzLCBidXQgdGhlIHZhbHVlIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoaXMgcGFybS4iKTsKK21vZHVsZV9wYXJhbSh1bmxvYWRfd2hlbl9lbXB0eSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModW5sb2FkX3doZW5fZW1wdHksICJVbmxvYWQgdGhlIG1vZHVsZSBpZiBubyBpbnRlcmZhY2VzIGFyZSIKKwkJICIgc3BlY2lmaWVkIG9yIGZvdW5kLCBkZWZhdWx0IGlzIDEuICBTZXR0aW5nIHRvIDAiCisJCSAiIGlzIHVzZWZ1bCBmb3IgaG90IGFkZCBvZiBkZXZpY2VzIHVzaW5nIGhvdG1vZC4iKTsKIAogCi0jZGVmaW5lIElQTUlfSU9fQUREUl9TUEFDRSAgMAotI2RlZmluZSBJUE1JX01FTV9BRERSX1NQQUNFIDEKLXN0YXRpYyBjaGFyICphZGRyX3NwYWNlX3RvX3N0cltdID0geyAiSS9PIiwgIm1lbW9yeSIgfTsKLQogc3RhdGljIHZvaWQgc3RkX2lycV9jbGVhbnVwKHN0cnVjdCBzbWlfaW5mbyAqaW5mbykKIHsKIAlpZiAoaW5mby0+c2lfdHlwZSA9PSBTSV9CVCkKQEAgLTEyMTEsNyArMTI2MCw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBpbnRmX21lbV9pbncoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAlyZXR1cm4gKHJlYWR3KChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KQotCQkmJiAweGZmOworCQkmIDB4ZmY7CiB9CiAKIHN0YXRpYyB2b2lkIGludGZfbWVtX291dHcoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKQEAgLTEyMjMsNyArMTI3Miw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBpbnRmX21lbV9pbmwoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAlyZXR1cm4gKHJlYWRsKChpby0+YWRkcikrKG9mZnNldCAqIGlvLT5yZWdzcGFjaW5nKSkgPj4gaW8tPnJlZ3NoaWZ0KQotCQkmJiAweGZmOworCQkmIDB4ZmY7CiB9CiAKIHN0YXRpYyB2b2lkIGludGZfbWVtX291dGwoc3RydWN0IHNpX3NtX2lvICppbywgdW5zaWduZWQgaW50IG9mZnNldCwKQEAgLTEyMzYsNyArMTI4NSw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBtZW1faW5xKHN0cnVjdCBzaV9zbV9pbyAqaW8sIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJcmV0dXJuIChyZWFkcSgoaW8tPmFkZHIpKyhvZmZzZXQgKiBpby0+cmVnc3BhY2luZykpID4+IGlvLT5yZWdzaGlmdCkKLQkJJiYgMHhmZjsKKwkJJiAweGZmOwogfQogCiBzdGF0aWMgdm9pZCBtZW1fb3V0cShzdHJ1Y3Qgc2lfc21faW8gKmlvLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LApAQCAtMTMxNyw2ICsxMzY2LDI1MCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogUGFybXMgY29tZSBpbiBhcyA8b3AxPls6b3AyWzpvcDMuLi5dXS4gIG9wcyBhcmU6CisgKiAgIGFkZHxyZW1vdmUsa2NzfGJ0fHNtaWMsbWVtfGkvbyw8YWRkcmVzcz5bLDxvcHQxPlssPG9wdDI+WywuLi5dXV0KKyAqIE9wdGlvbnMgYXJlOgorICogICByc3A9PHJlZ3NwYWNpbmc+CisgKiAgIHJzaT08cmVnc2l6ZT4KKyAqICAgcnNoPTxyZWdzaGlmdD4KKyAqICAgaXJxPTxpcnE+CisgKiAgIGlwbWI9PGlwbWIgYWRkcj4KKyAqLworZW51bSBob3Rtb2Rfb3AgeyBITV9BREQsIEhNX1JFTU9WRSB9Oworc3RydWN0IGhvdG1vZF92YWxzIHsKKwljaGFyICpuYW1lOworCWludCAgdmFsOworfTsKK3N0YXRpYyBzdHJ1Y3QgaG90bW9kX3ZhbHMgaG90bW9kX29wc1tdID0geworCXsgImFkZCIsCUhNX0FERCB9LAorCXsgInJlbW92ZSIsCUhNX1JFTU9WRSB9LAorCXsgTlVMTCB9Cit9Oworc3RhdGljIHN0cnVjdCBob3Rtb2RfdmFscyBob3Rtb2Rfc2lbXSA9IHsKKwl7ICJrY3MiLAlTSV9LQ1MgfSwKKwl7ICJzbWljIiwJU0lfU01JQyB9LAorCXsgImJ0IiwJCVNJX0JUIH0sCisJeyBOVUxMIH0KK307CitzdGF0aWMgc3RydWN0IGhvdG1vZF92YWxzIGhvdG1vZF9hc1tdID0geworCXsgIm1lbSIsCUlQTUlfTUVNX0FERFJfU1BBQ0UgfSwKKwl7ICJpL28iLAlJUE1JX0lPX0FERFJfU1BBQ0UgfSwKKwl7IE5VTEwgfQorfTsKKworc3RhdGljIGludCBwYXJzZV9zdHIoc3RydWN0IGhvdG1vZF92YWxzICp2LCBpbnQgKnZhbCwgY2hhciAqbmFtZSwgY2hhciAqKmN1cnIpCit7CisJY2hhciAqczsKKwlpbnQgIGk7CisKKwlzID0gc3RyY2hyKCpjdXJyLCAnLCcpOworCWlmICghcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiTm8gaG90bW9kICVzIGdpdmVuLlxuIiwgbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkqcyA9ICdcMCc7CisJcysrOworCWZvciAoaSA9IDA7IGhvdG1vZF9vcHNbaV0ubmFtZTsgaSsrKSB7CisJCWlmIChzdHJjbXAoKmN1cnIsIHZbaV0ubmFtZSkgPT0gMCkgeworCQkJKnZhbCA9IHZbaV0udmFsOworCQkJKmN1cnIgPSBzOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSW52YWxpZCBob3Rtb2QgJXMgJyVzJ1xuIiwgbmFtZSwgKmN1cnIpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGNoZWNrX2hvdG1vZF9pbnRfb3AoY29uc3QgY2hhciAqY3VyciwgY29uc3QgY2hhciAqb3B0aW9uLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqdmFsKQoreworCWNoYXIgKm47CisKKwlpZiAoc3RyY21wKGN1cnIsIG5hbWUpID09IDApIHsKKwkJaWYgKCFvcHRpb24pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkgICAgICAgIk5vIG9wdGlvbiBnaXZlbiBmb3IgJyVzJ1xuIiwKKwkJCSAgICAgICBjdXJyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCSp2YWwgPSBzaW1wbGVfc3RydG91bChvcHRpb24sICZuLCAwKTsKKwkJaWYgKCgqbiAhPSAnXDAnKSB8fCAoKm9wdGlvbiA9PSAnXDAnKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSAgICAgICAiQmFkIG9wdGlvbiBnaXZlbiBmb3IgJyVzJ1xuIiwKKwkJCSAgICAgICBjdXJyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob3Rtb2RfaGFuZGxlcihjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCWNoYXIgKnN0ciA9IGtzdHJkdXAodmFsLCBHRlBfS0VSTkVMKTsKKwlpbnQgIHJ2OworCWNoYXIgKm5leHQsICpjdXJyLCAqcywgKm4sICpvOworCWVudW0gaG90bW9kX29wIG9wOworCWVudW0gc2lfdHlwZSBzaV90eXBlOworCWludCAgYWRkcl9zcGFjZTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHJlZ3NwYWNpbmc7CisJaW50IHJlZ3NpemU7CisJaW50IHJlZ3NoaWZ0OworCWludCBpcnE7CisJaW50IGlwbWI7CisJaW50IGl2YWw7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc21pX2luZm8gKmluZm87CisKKwlpZiAoIXN0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBLaWxsIGFueSB0cmFpbGluZyBzcGFjZXMsIGFzIHdlIGNhbiBnZXQgYSAiXG4iIGZyb20gZWNoby4gKi8KKwlsZW4gPSBzdHJsZW4oc3RyKTsKKwlpdmFsID0gbGVuIC0gMTsKKwl3aGlsZSAoKGl2YWwgPj0gMCkgJiYgaXNzcGFjZShzdHJbaXZhbF0pKSB7CisJCXN0cltpdmFsXSA9ICdcMCc7CisJCWl2YWwtLTsKKwl9CisKKwlmb3IgKGN1cnIgPSBzdHI7IGN1cnI7IGN1cnIgPSBuZXh0KSB7CisJCXJlZ3NwYWNpbmcgPSAxOworCQlyZWdzaXplID0gMTsKKwkJcmVnc2hpZnQgPSAwOworCQlpcnEgPSAwOworCQlpcG1iID0gMHgyMDsKKworCQluZXh0ID0gc3RyY2hyKGN1cnIsICc6Jyk7CisJCWlmIChuZXh0KSB7CisJCQkqbmV4dCA9ICdcMCc7CisJCQluZXh0Kys7CisJCX0KKworCQlydiA9IHBhcnNlX3N0cihob3Rtb2Rfb3BzLCAmaXZhbCwgIm9wZXJhdGlvbiIsICZjdXJyKTsKKwkJaWYgKHJ2KQorCQkJYnJlYWs7CisJCW9wID0gaXZhbDsKKworCQlydiA9IHBhcnNlX3N0cihob3Rtb2Rfc2ksICZpdmFsLCAiaW50ZXJmYWNlIHR5cGUiLCAmY3Vycik7CisJCWlmIChydikKKwkJCWJyZWFrOworCQlzaV90eXBlID0gaXZhbDsKKworCQlydiA9IHBhcnNlX3N0cihob3Rtb2RfYXMsICZhZGRyX3NwYWNlLCAiYWRkcmVzcyBzcGFjZSIsICZjdXJyKTsKKwkJaWYgKHJ2KQorCQkJYnJlYWs7CisKKwkJcyA9IHN0cmNocihjdXJyLCAnLCcpOworCQlpZiAocykgeworCQkJKnMgPSAnXDAnOworCQkJcysrOworCQl9CisJCWFkZHIgPSBzaW1wbGVfc3RydG91bChjdXJyLCAmbiwgMCk7CisJCWlmICgoKm4gIT0gJ1wwJykgfHwgKCpjdXJyID09ICdcMCcpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSW52YWxpZCBob3Rtb2QgYWRkcmVzcyIKKwkJCSAgICAgICAiICclcydcbiIsIGN1cnIpOworCQkJYnJlYWs7CisJCX0KKworCQl3aGlsZSAocykgeworCQkJY3VyciA9IHM7CisJCQlzID0gc3RyY2hyKGN1cnIsICcsJyk7CisJCQlpZiAocykgeworCQkJCSpzID0gJ1wwJzsKKwkJCQlzKys7CisJCQl9CisJCQlvID0gc3RyY2hyKGN1cnIsICc9Jyk7CisJCQlpZiAobykgeworCQkJCSpvID0gJ1wwJzsKKwkJCQlvKys7CisJCQl9CisJCQlydiA9IGNoZWNrX2hvdG1vZF9pbnRfb3AoY3VyciwgbywgInJzcCIsICZyZWdzcGFjaW5nKTsKKwkJCWlmIChydiA8IDApCisJCQkJZ290byBvdXQ7CisJCQllbHNlIGlmIChydikKKwkJCQljb250aW51ZTsKKwkJCXJ2ID0gY2hlY2tfaG90bW9kX2ludF9vcChjdXJyLCBvLCAicnNpIiwgJnJlZ3NpemUpOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWVsc2UgaWYgKHJ2KQorCQkJCWNvbnRpbnVlOworCQkJcnYgPSBjaGVja19ob3Rtb2RfaW50X29wKGN1cnIsIG8sICJyc2giLCAmcmVnc2hpZnQpOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWVsc2UgaWYgKHJ2KQorCQkJCWNvbnRpbnVlOworCQkJcnYgPSBjaGVja19ob3Rtb2RfaW50X29wKGN1cnIsIG8sICJpcnEiLCAmaXJxKTsKKwkJCWlmIChydiA8IDApCisJCQkJZ290byBvdXQ7CisJCQllbHNlIGlmIChydikKKwkJCQljb250aW51ZTsKKwkJCXJ2ID0gY2hlY2tfaG90bW9kX2ludF9vcChjdXJyLCBvLCAiaXBtYiIsICZpcG1iKTsKKwkJCWlmIChydiA8IDApCisJCQkJZ290byBvdXQ7CisJCQllbHNlIGlmIChydikKKwkJCQljb250aW51ZTsKKworCQkJcnYgPSAtRUlOVkFMOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSAgICAgICAiSW52YWxpZCBob3Rtb2Qgb3B0aW9uICclcydcbiIsCisJCQkgICAgICAgY3Vycik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChvcCA9PSBITV9BREQpIHsKKwkJCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFpbmZvKSB7CisJCQkJcnYgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpbmZvLT5hZGRyX3NvdXJjZSA9ICJob3Rtb2QiOworCQkJaW5mby0+c2lfdHlwZSA9IHNpX3R5cGU7CisJCQlpbmZvLT5pby5hZGRyX2RhdGEgPSBhZGRyOworCQkJaW5mby0+aW8uYWRkcl90eXBlID0gYWRkcl9zcGFjZTsKKwkJCWlmIChhZGRyX3NwYWNlID09IElQTUlfTUVNX0FERFJfU1BBQ0UpCisJCQkJaW5mby0+aW9fc2V0dXAgPSBtZW1fc2V0dXA7CisJCQllbHNlCisJCQkJaW5mby0+aW9fc2V0dXAgPSBwb3J0X3NldHVwOworCisJCQlpbmZvLT5pby5hZGRyID0gTlVMTDsKKwkJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSByZWdzcGFjaW5nOworCQkJaWYgKCFpbmZvLT5pby5yZWdzcGFjaW5nKQorCQkJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CisJCQlpbmZvLT5pby5yZWdzaXplID0gcmVnc2l6ZTsKKwkJCWlmICghaW5mby0+aW8ucmVnc2l6ZSkKKwkJCQlpbmZvLT5pby5yZWdzaXplID0gREVGQVVMVF9SRUdTUEFDSU5HOworCQkJaW5mby0+aW8ucmVnc2hpZnQgPSByZWdzaGlmdDsKKwkJCWluZm8tPmlycSA9IGlycTsKKwkJCWlmIChpbmZvLT5pcnEpCisJCQkJaW5mby0+aXJxX3NldHVwID0gc3RkX2lycV9zZXR1cDsKKwkJCWluZm8tPnNsYXZlX2FkZHIgPSBpcG1iOworCisJCQl0cnlfc21pX2luaXQoaW5mbyk7CisJCX0gZWxzZSB7CisJCQkvKiByZW1vdmUgKi8KKwkJCXN0cnVjdCBzbWlfaW5mbyAqZSwgKnRtcF9lOworCisJCQltdXRleF9sb2NrKCZzbWlfaW5mb3NfbG9jayk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdG1wX2UsICZzbWlfaW5mb3MsIGxpbmspIHsKKwkJCQlpZiAoZS0+aW8uYWRkcl90eXBlICE9IGFkZHJfc3BhY2UpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChlLT5zaV90eXBlICE9IHNpX3R5cGUpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChlLT5pby5hZGRyX2RhdGEgPT0gYWRkcikKKwkJCQkJY2xlYW51cF9vbmVfc2koZSk7CisJCQl9CisJCQltdXRleF91bmxvY2soJnNtaV9pbmZvc19sb2NrKTsKKwkJfQorCX0KKwlydiA9IGxlbjsKKyBvdXQ6CisJa2ZyZWUoc3RyKTsKKwlyZXR1cm4gcnY7Cit9CiAKIHN0YXRpYyBfX2RldmluaXQgdm9pZCBoYXJkY29kZV9maW5kX2JtYyh2b2lkKQogewpAQCAtMTM5MSw3ICsxNjg0LDcgQEAKIC8qIE9uY2Ugd2UgZ2V0IGFuIEFDUEkgZmFpbHVyZSwgd2UgZG9uJ3QgdHJ5IGFueSBtb3JlLCBiZWNhdXNlIHdlIGdvCiAgICB0aHJvdWdoIHRoZSB0YWJsZXMgc2VxdWVudGlhbGx5LiAgT25jZSB3ZSBkb24ndCBmaW5kIGEgdGFibGUsIHRoZXJlCiAgICBhcmUgbm8gbW9yZS4gKi8KLXN0YXRpYyBpbnQgYWNwaV9mYWlsdXJlID0gMDsKK3N0YXRpYyBpbnQgYWNwaV9mYWlsdXJlOwogCiAvKiBGb3IgR1BFLXR5cGUgaW50ZXJydXB0cy4gKi8KIHN0YXRpYyB1MzIgaXBtaV9hY3BpX2dwZSh2b2lkICpjb250ZXh0KQpAQCAtMTUwMiw3ICsxNzk1LDYgQEAKIHN0YXRpYyBfX2RldmluaXQgaW50IHRyeV9pbml0X2FjcGkoc3RydWN0IFNQTUlUYWJsZSAqc3BtaSkKIHsKIAlzdHJ1Y3Qgc21pX2luZm8gICppbmZvOwotCWNoYXIgICAgICAgICAgICAgKmlvX3R5cGU7CiAJdTggCQkgYWRkcl9zcGFjZTsKIAogCWlmIChzcG1pLT5JUE1JbGVnYWN5ICE9IDEpIHsKQEAgLTE1NjYsMTEgKzE4NTgsOSBAQAogCWluZm8tPmlvLnJlZ3NoaWZ0ID0gc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfb2Zmc2V0OwogCiAJaWYgKHNwbWktPmFkZHIuYWRkcmVzc19zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKSB7Ci0JCWlvX3R5cGUgPSAibWVtb3J5IjsKIAkJaW5mby0+aW9fc2V0dXAgPSBtZW1fc2V0dXA7CiAJCWluZm8tPmlvLmFkZHJfdHlwZSA9IElQTUlfSU9fQUREUl9TUEFDRTsKIAl9IGVsc2UgaWYgKHNwbWktPmFkZHIuYWRkcmVzc19zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pIHsKLQkJaW9fdHlwZSA9ICJJL08iOwogCQlpbmZvLT5pb19zZXR1cCA9IHBvcnRfc2V0dXA7CiAJCWluZm8tPmlvLmFkZHJfdHlwZSA9IElQTUlfTUVNX0FERFJfU1BBQ0U7CiAJfSBlbHNlIHsKQEAgLTE3ODksNyArMjA3OSw3IEBACiAKIAlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pCi0JCXJldHVybiBFTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCiAJaW5mby0+YWRkcl9zb3VyY2UgPSAiUENJIjsKIApAQCAtMTgxMCw3ICsyMTAwLDcgQEAKIAkJa2ZyZWUoaW5mbyk7CiAJCXByaW50ayhLRVJOX0lORk8gImlwbWlfc2k6ICVzOiBVbmtub3duIElQTUkgdHlwZTogJWRcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgY2xhc3NfdHlwZSk7Ci0JCXJldHVybiBFTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXJ2ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC0xODY3LDcgKzIxNTcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXBtaV9wY2lfZGV2aWNlc1tdID0gewogCXsgUENJX0RFVklDRShQQ0lfSFBfVkVORE9SX0lELCBQQ0lfTU1DX0RFVklDRV9JRCkgfSwKLQl7IFBDSV9ERVZJQ0VfQ0xBU1MoUENJX0VSTUNfQ0xBU1NDT0RFLCBQQ0lfRVJNQ19DTEFTU0NPREUpIH0KKwl7IFBDSV9ERVZJQ0VfQ0xBU1MoUENJX0VSTUNfQ0xBU1NDT0RFLCBQQ0lfRVJNQ19DTEFTU0NPREVfTUFTSykgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpcG1pX3BjaV9kZXZpY2VzKTsKIApAQCAtMTk1MiwxOSArMjI0Miw5IEBACiBzdGF0aWMgaW50IHR5cGVfZmlsZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQljaGFyICAgICAgICAgICAgKm91dCA9IChjaGFyICopIHBhZ2U7CiAJc3RydWN0IHNtaV9pbmZvICpzbWkgPSBkYXRhOwogCi0Jc3dpdGNoIChzbWktPnNpX3R5cGUpIHsKLQkgICAgY2FzZSBTSV9LQ1M6Ci0JCXJldHVybiBzcHJpbnRmKG91dCwgImtjc1xuIik7Ci0JICAgIGNhc2UgU0lfU01JQzoKLQkJcmV0dXJuIHNwcmludGYob3V0LCAic21pY1xuIik7Ci0JICAgIGNhc2UgU0lfQlQ6Ci0JCXJldHVybiBzcHJpbnRmKG91dCwgImJ0XG4iKTsKLQkgICAgZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQorCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlc1xuIiwgc2lfdG9fc3RyW3NtaS0+c2lfdHlwZV0pOwogfQogCiBzdGF0aWMgaW50IHN0YXRfZmlsZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCkBAIC0yMDAwLDcgKzIyODAsMjQgQEAKIAlvdXQgKz0gc3ByaW50ZihvdXQsICJpbmNvbWluZ19tZXNzYWdlczogICAgICVsZFxuIiwKIAkJICAgICAgIHNtaS0+aW5jb21pbmdfbWVzc2FnZXMpOwogCi0JcmV0dXJuIChvdXQgLSAoKGNoYXIgKikgcGFnZSkpOworCXJldHVybiBvdXQgLSBwYWdlOworfQorCitzdGF0aWMgaW50IHBhcmFtX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNtaV9pbmZvICpzbWkgPSBkYXRhOworCisJcmV0dXJuIHNwcmludGYocGFnZSwKKwkJICAgICAgICIlcywlcywweCVseCxyc3A9JWQscnNpPSVkLHJzaD0lZCxpcnE9JWQsaXBtYj0lZFxuIiwKKwkJICAgICAgIHNpX3RvX3N0cltzbWktPnNpX3R5cGVdLAorCQkgICAgICAgYWRkcl9zcGFjZV90b19zdHJbc21pLT5pby5hZGRyX3R5cGVdLAorCQkgICAgICAgc21pLT5pby5hZGRyX2RhdGEsCisJCSAgICAgICBzbWktPmlvLnJlZ3NwYWNpbmcsCisJCSAgICAgICBzbWktPmlvLnJlZ3NpemUsCisJCSAgICAgICBzbWktPmlvLnJlZ3NoaWZ0LAorCQkgICAgICAgc21pLT5pcnEsCisJCSAgICAgICBzbWktPnNsYXZlX2FkZHIpOwogfQogCiAvKgpAQCAtMjM0Niw3ICsyNjQzLDcgQEAKIAkJbmV3X3NtaS0+ZGV2ID0gJm5ld19zbWktPnBkZXYtPmRldjsKIAkJbmV3X3NtaS0+ZGV2LT5kcml2ZXIgPSAmaXBtaV9kcml2ZXI7CiAKLQkJcnYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIobmV3X3NtaS0+cGRldik7CisJCXJ2ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChuZXdfc21pLT5wZGV2KTsKIAkJaWYgKHJ2KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiaXBtaV9zaV9pbnRmOiIKQEAgLTIzNjIsNiArMjY1OSw3IEBACiAJCQkgICAgICAgbmV3X3NtaSwKIAkJCSAgICAgICAmbmV3X3NtaS0+ZGV2aWNlX2lkLAogCQkJICAgICAgIG5ld19zbWktPmRldiwKKwkJCSAgICAgICAiYm1jIiwKIAkJCSAgICAgICBuZXdfc21pLT5zbGF2ZV9hZGRyKTsKIAlpZiAocnYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCkBAIC0yMzkwLDYgKzI2ODgsMTYgQEAKIAkJZ290byBvdXRfZXJyX3N0b3BfdGltZXI7CiAJfQogCisJcnYgPSBpcG1pX3NtaV9hZGRfcHJvY19lbnRyeShuZXdfc21pLT5pbnRmLCAicGFyYW1zIiwKKwkJCQkgICAgIHBhcmFtX3JlYWRfcHJvYywgTlVMTCwKKwkJCQkgICAgIG5ld19zbWksIFRISVNfTU9EVUxFKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaXBtaV9zaTogVW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGVudHJ5OiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwkJZ290byBvdXRfZXJyX3N0b3BfdGltZXI7CisJfQorCiAJbGlzdF9hZGRfdGFpbCgmbmV3X3NtaS0+bGluaywgJnNtaV9pbmZvcyk7CiAKIAltdXRleF91bmxvY2soJnNtaV9pbmZvc19sb2NrKTsKQEAgLTI0NzgsMTIgKzI3ODYsMTYgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FDUEkKLQlpZiAoc2lfdHJ5ZGVmYXVsdHMpCi0JCWFjcGlfZmluZF9ibWMoKTsKKwlhY3BpX2ZpbmRfYm1jKCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QQ0kKLQlwY2lfbW9kdWxlX2luaXQoJmlwbWlfcGNpX2RyaXZlcik7CisJcnYgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpcG1pX3BjaV9kcml2ZXIpOworCWlmIChydil7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImluaXRfaXBtaV9zaTogVW5hYmxlIHRvIHJlZ2lzdGVyIFBDSSBkcml2ZXI6ICVkXG4iLAorCQkgICAgICAgcnYpOworCX0KICNlbmRpZgogCiAJaWYgKHNpX3RyeWRlZmF1bHRzKSB7CkBAIC0yNDk4LDcgKzI4MTAsNyBAQAogCX0KIAogCW11dGV4X2xvY2soJnNtaV9pbmZvc19sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmc21pX2luZm9zKSkgeworCWlmICh1bmxvYWRfd2hlbl9lbXB0eSAmJiBsaXN0X2VtcHR5KCZzbWlfaW5mb3MpKSB7CiAJCW11dGV4X3VubG9jaygmc21pX2luZm9zX2xvY2spOwogI2lmZGVmIENPTkZJR19QQ0kKIAkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpcG1pX3BjaV9kcml2ZXIpOwpAQCAtMjUxMyw3ICsyODI1LDcgQEAKIH0KIG1vZHVsZV9pbml0KGluaXRfaXBtaV9zaSk7CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjbGVhbnVwX29uZV9zaShzdHJ1Y3Qgc21pX2luZm8gKnRvX2NsZWFuKQorc3RhdGljIHZvaWQgY2xlYW51cF9vbmVfc2koc3RydWN0IHNtaV9pbmZvICp0b19jbGVhbikKIHsKIAlpbnQgICAgICAgICAgIHJ2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NtaWNfc20uYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc21pY19zbS5jCmluZGV4IDM5ZDdlNWUuLmU2NGVhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc21pY19zbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc21pY19zbS5jCkBAIC0xNDEsMTIgKzE0MSwxNCBAQAogewogCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKChzaXplIDwgMikgfHwgKHNpemUgPiBNQVhfU01JQ19XUklURV9TSVpFKSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoc21pYy0+c3RhdGUgIT0gU01JQ19JRExFKSAmJiAoc21pYy0+c3RhdGUgIT0gU01JQ19IT1NFRCkpIHsKLQkJcmV0dXJuIC0yOwotCX0KKwlpZiAoc2l6ZSA8IDIpCisJCXJldHVybiBJUE1JX1JFUV9MRU5fSU5WQUxJRF9FUlI7CisJaWYgKHNpemUgPiBNQVhfU01JQ19XUklURV9TSVpFKQorCQlyZXR1cm4gSVBNSV9SRVFfTEVOX0VYQ0VFREVEX0VSUjsKKworCWlmICgoc21pYy0+c3RhdGUgIT0gU01JQ19JRExFKSAmJiAoc21pYy0+c3RhdGUgIT0gU01JQ19IT1NFRCkpCisJCXJldHVybiBJUE1JX05PVF9JTl9NWV9TVEFURV9FUlI7CisKIAlpZiAoc21pY19kZWJ1ZyAmIFNNSUNfREVCVUdfTVNHKSB7CiAJCXByaW50ayhLRVJOX0lORk8gInN0YXJ0X3NtaWNfdHJhbnNhY3Rpb24gLSIpOwogCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCmluZGV4IDczZjc1OWUuLjc4MjgwMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKQEAgLTEzNCwxMyArMTM0LDE0IEBACiAKIHN0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKIAotc3RhdGljIGlwbWlfdXNlcl90IHdhdGNoZG9nX3VzZXIgPSBOVUxMOworc3RhdGljIGlwbWlfdXNlcl90IHdhdGNoZG9nX3VzZXI7CitzdGF0aWMgaW50IHdhdGNoZG9nX2lmbnVtOwogCiAvKiBEZWZhdWx0IHRoZSB0aW1lb3V0IHRvIDEwIHNlY29uZHMuICovCiBzdGF0aWMgaW50IHRpbWVvdXQgPSAxMDsKIAogLyogVGhlIHByZS10aW1lb3V0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICovCi1zdGF0aWMgaW50IHByZXRpbWVvdXQgPSAwOworc3RhdGljIGludCBwcmV0aW1lb3V0OwogCiAvKiBEZWZhdWx0IGFjdGlvbiBpcyB0byByZXNldCB0aGUgYm9hcmQgb24gYSB0aW1lb3V0LiAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgYWN0aW9uX3ZhbCA9IFdET0dfVElNRU9VVF9SRVNFVDsKQEAgLTE1NSwxMiArMTU2LDE0IEBACiAKIHN0YXRpYyBjaGFyIHByZW9wWzE2XSA9ICJwcmVvcF9ub25lIjsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBtaV9yZWFkX2xvY2spOwotc3RhdGljIGNoYXIgZGF0YV90b19yZWFkID0gMDsKK3N0YXRpYyBjaGFyIGRhdGFfdG9fcmVhZDsKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyZWFkX3EpOwotc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmNfcSA9IE5VTEw7Ci1zdGF0aWMgY2hhciBwcmV0aW1lb3V0X3NpbmNlX2xhc3RfaGVhcnRiZWF0ID0gMDsKK3N0YXRpYyBzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmFzeW5jX3E7CitzdGF0aWMgY2hhciBwcmV0aW1lb3V0X3NpbmNlX2xhc3RfaGVhcnRiZWF0Owogc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOwogCitzdGF0aWMgaW50IGlmbnVtX3RvX3VzZSA9IC0xOworCiBzdGF0aWMgREVDTEFSRV9SV1NFTShyZWdpc3Rlcl9zZW0pOwogCiAvKiBQYXJhbWV0ZXJzIHRvIGlwbWlfc2V0X3RpbWVvdXQgKi8KQEAgLTE2OSwxMCArMTcyLDEyIEBACiAjZGVmaW5lIElQTUlfU0VUX1RJTUVPVVRfRk9SQ0VfSEIJCTIKIAogc3RhdGljIGludCBpcG1pX3NldF90aW1lb3V0KGludCBkb19oZWFydGJlYXQpOworc3RhdGljIHZvaWQgaXBtaV9yZWdpc3Rlcl93YXRjaGRvZyhpbnQgaXBtaV9pbnRmKTsKK3N0YXRpYyB2b2lkIGlwbWlfdW5yZWdpc3Rlcl93YXRjaGRvZyhpbnQgaXBtaV9pbnRmKTsKIAogLyogSWYgdHJ1ZSwgdGhlIGRyaXZlciB3aWxsIHN0YXJ0IHJ1bm5pbmcgYXMgc29vbiBhcyBpdCBpcyBjb25maWd1cmVkCiAgICBhbmQgcmVhZHkuICovCi1zdGF0aWMgaW50IHN0YXJ0X25vdyA9IDA7CitzdGF0aWMgaW50IHN0YXJ0X25vdzsKIAogc3RhdGljIGludCBzZXRfcGFyYW1faW50KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7CkBAIC0yNDUsNiArMjUwLDI2IEBACiAJcmV0dXJuIHN0cmxlbihidWZmZXIpOwogfQogCisKK3N0YXRpYyBpbnQgc2V0X3BhcmFtX3dkb2dfaWZudW0oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpbnQgcnYgPSBwYXJhbV9zZXRfaW50KHZhbCwga3ApOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCWlmICgoaWZudW1fdG9fdXNlIDwgMCkgfHwgKGlmbnVtX3RvX3VzZSA9PSB3YXRjaGRvZ19pZm51bSkpCisJCXJldHVybiAwOworCisJaXBtaV91bnJlZ2lzdGVyX3dhdGNoZG9nKHdhdGNoZG9nX2lmbnVtKTsKKwlpcG1pX3JlZ2lzdGVyX3dhdGNoZG9nKGlmbnVtX3RvX3VzZSk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9wYXJhbV9jYWxsKGlmbnVtX3RvX3VzZSwgc2V0X3BhcmFtX3dkb2dfaWZudW0sIGdldF9wYXJhbV9pbnQsCisJCSAgJmlmbnVtX3RvX3VzZSwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlmbnVtX3RvX3VzZSwgIlRoZSBpbnRlcmZhY2UgbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHdhdGNoZG9nICIKKwkJICJ0aW1lci4gIFNldHRpbmcgdG8gLTEgZGVmYXVsdHMgdG8gdGhlIGZpcnN0IHJlZ2lzdGVyZWQgIgorCQkgImludGVyZmFjZSIpOworCiBtb2R1bGVfcGFyYW1fY2FsbCh0aW1lb3V0LCBzZXRfcGFyYW1faW50LCBnZXRfcGFyYW1faW50LCAmdGltZW91dCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJUaW1lb3V0IHZhbHVlIGluIHNlY29uZHMuIik7CiAKQEAgLTI2MywyNyArMjg4LDI4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHByZW9wLCAiUHJldGltZW91dCBkcml2ZXIgb3BlcmF0aW9uLiAgT25lIG9mOiAiCiAJCSAicHJlb3Bfbm9uZSwgcHJlb3BfcGFuaWMsIHByZW9wX2dpdmVfZGF0YS4iKTsKIAotbW9kdWxlX3BhcmFtKHN0YXJ0X25vdywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzdGFydF9ub3csIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X25vdywgIlNldCB0byAxIHRvIHN0YXJ0IHRoZSB3YXRjaGRvZyBhcyIKIAkJICJzb29uIGFzIHRoZSBkcml2ZXIgaXMgbG9hZGVkLiIpOwogCiBtb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgIgorCQkgIihkZWZhdWx0PUNPTkZJR19XQVRDSERPR19OT1dBWU9VVCkiKTsKIAogLyogRGVmYXVsdCBzdGF0ZSBvZiB0aGUgdGltZXIuICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciBpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX05PTkU7CiAKIC8qIElmIHNodXR0aW5nIGRvd24gdmlhIElQTUksIHdlIGlnbm9yZSB0aGUgaGVhcnRiZWF0LiAqLwotc3RhdGljIGludCBpcG1pX2lnbm9yZV9oZWFydGJlYXQgPSAwOworc3RhdGljIGludCBpcG1pX2lnbm9yZV9oZWFydGJlYXQ7CiAKIC8qIElzIHNvbWVvbmUgdXNpbmcgdGhlIHdhdGNoZG9nPyAgT25seSBvbmUgdXNlciBpcyBhbGxvd2VkLiAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaXBtaV93ZG9nX29wZW4gPSAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXBtaV93ZG9nX29wZW47CiAKIC8qIElmIHNldCB0byAxLCB0aGUgaGVhcnRiZWF0IGNvbW1hbmQgd2lsbCBzZXQgdGhlIHN0YXRlIHRvIHJlc2V0IGFuZAogICAgc3RhcnQgdGhlIHRpbWVyLiAgVGhlIHRpbWVyIGRvZXNuJ3Qgbm9ybWFsbHkgcnVuIHdoZW4gdGhlIGRyaXZlciBpcwogICAgZmlyc3Qgb3BlbmVkIHVudGlsIHRoZSBoZWFydGJlYXQgaXMgc2V0IHRoZSBmaXJzdCB0aW1lLCB0aGlzCiAgICB2YXJpYWJsZSBpcyB1c2VkIHRvIGFjY29tcGxpc2ggdGhpcy4gKi8KLXN0YXRpYyBpbnQgaXBtaV9zdGFydF90aW1lcl9vbl9oZWFydGJlYXQgPSAwOworc3RhdGljIGludCBpcG1pX3N0YXJ0X3RpbWVyX29uX2hlYXJ0YmVhdDsKIAogLyogSVBNSSB2ZXJzaW9uIG9mIHRoZSBCTUMuICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciBpcG1pX3ZlcnNpb25fbWFqb3I7CkBAIC04NzIsNiArODk4LDExIEBACiAJaWYgKHdhdGNoZG9nX3VzZXIpCiAJCWdvdG8gb3V0OwogCisJaWYgKChpZm51bV90b191c2UgPj0gMCkgJiYgKGlmbnVtX3RvX3VzZSAhPSBpcG1pX2ludGYpKQorCQlnb3RvIG91dDsKKworCXdhdGNoZG9nX2lmbnVtID0gaXBtaV9pbnRmOworCiAJcnYgPSBpcG1pX2NyZWF0ZV91c2VyKGlwbWlfaW50ZiwgJmlwbWlfaG5kbHJzLCBOVUxMLCAmd2F0Y2hkb2dfdXNlcik7CiAJaWYgKHJ2IDwgMCkgewogCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggaXBtaVxuIik7CkBAIC05MDEsNiArOTMyLDM5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBpcG1pX3VucmVnaXN0ZXJfd2F0Y2hkb2coaW50IGlwbWlfaW50ZikKK3sKKwlpbnQgcnY7CisKKwlkb3duX3dyaXRlKCZyZWdpc3Rlcl9zZW0pOworCisJaWYgKCF3YXRjaGRvZ191c2VyKQorCQlnb3RvIG91dDsKKworCWlmICh3YXRjaGRvZ19pZm51bSAhPSBpcG1pX2ludGYpCisJCWdvdG8gb3V0OworCisJLyogTWFrZSBzdXJlIG5vIG9uZSBjYW4gY2FsbCB1cyBhbnkgbW9yZS4gKi8KKwltaXNjX2RlcmVnaXN0ZXIoJmlwbWlfd2RvZ19taXNjZGV2KTsKKworCS8qIFdhaXQgdG8gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIG1ha2VzIGl0IG91dC4gIFRoZSBsb3dlciBsYXllciBoYXMKKwkgICBwb2ludGVycyB0byBvdXIgYnVmZmVycywgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhleSBhcmUgZG9uZSBiZWZvcmUKKwkgICB3ZSByZWxlYXNlIG91ciBtZW1vcnkuICovCisJd2hpbGUgKGF0b21pY19yZWFkKCZzZXRfdGltZW91dF90b2ZyZWUpKQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKworCS8qIERpc2Nvbm5lY3QgZnJvbSBJUE1JLiAqLworCXJ2ID0gaXBtaV9kZXN0cm95X3VzZXIod2F0Y2hkb2dfdXNlcik7CisJaWYgKHJ2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJlcnJvciB1bmxpbmtpbmcgZnJvbSBJUE1JOiAlZFxuIiwKKwkJICAgICAgIHJ2KTsKKwl9CisJd2F0Y2hkb2dfdXNlciA9IE5VTEw7CisKKyBvdXQ6CisJdXBfd3JpdGUoJnJlZ2lzdGVyX3NlbSk7Cit9CisKICNpZmRlZiBIQVZFX05NSV9IQU5ETEVSCiBzdGF0aWMgaW50CiBpcG1pX25taSh2b2lkICpkZXZfaWQsIGludCBjcHUsIGludCBoYW5kbGVkKQpAQCAtMTAwNCw5ICsxMDY4LDcgQEAKIAogc3RhdGljIHZvaWQgaXBtaV9zbWlfZ29uZShpbnQgaWZfbnVtKQogewotCS8qIFRoaXMgY2FuIG5ldmVyIGJlIGNhbGxlZCwgYmVjYXVzZSBvbmNlIHRoZSB3YXRjaGRvZyBpcwotCSAgIHJlZ2lzdGVyZWQsIHRoZSBpbnRlcmZhY2UgY2FuJ3QgZ28gYXdheSB1bnRpbCB0aGUgd2F0Y2hkb2cKLQkgICBpcyB1bnJlZ2lzdGVyZWQuICovCisJaXBtaV91bnJlZ2lzdGVyX3dhdGNoZG9nKGlmX251bSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXBtaV9zbWlfd2F0Y2hlciBzbWlfd2F0Y2hlciA9CkBAIC0xMTQ4LDMwICsxMjEwLDMyIEBACiAKIAljaGVja19wYXJtcygpOwogCisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZG9nX3JlYm9vdF9ub3RpZmllcik7CisJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAorCQkJJndkb2dfcGFuaWNfbm90aWZpZXIpOworCiAJcnYgPSBpcG1pX3NtaV93YXRjaGVyX3JlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CiAJaWYgKHJ2KSB7CiAjaWZkZWYgSEFWRV9OTUlfSEFORExFUgogCQlpZiAocHJlYWN0aW9uX3ZhbCA9PSBXRE9HX1BSRVRJTUVPVVRfTk1JKQogCQkJcmVsZWFzZV9ubWkoJmlwbWlfbm1pX2hhbmRsZXIpOwogI2VuZGlmCisJCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAorCQkJCQkJICZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkb2dfcmVib290X25vdGlmaWVyKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggImNhbid0IHJlZ2lzdGVyIHNtaSB3YXRjaGVyXG4iKTsKIAkJcmV0dXJuIHJ2OwogCX0KIAotCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2RvZ19yZWJvb3Rfbm90aWZpZXIpOwotCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwKLQkJCSZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKLQogCXByaW50ayhLRVJOX0lORk8gUEZYICJkcml2ZXIgaW5pdGlhbGl6ZWRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBfX2V4aXQgdm9pZCBpcG1pX3VucmVnaXN0ZXJfd2F0Y2hkb2codm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcG1pX3dkb2dfZXhpdCh2b2lkKQogewotCWludCBydjsKLQotCWRvd25fd3JpdGUoJnJlZ2lzdGVyX3NlbSk7CisJaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7CisJaXBtaV91bnJlZ2lzdGVyX3dhdGNoZG9nKHdhdGNoZG9nX2lmbnVtKTsKIAogI2lmZGVmIEhBVkVfTk1JX0hBTkRMRVIKIAlpZiAobm1pX2hhbmRsZXJfcmVnaXN0ZXJlZCkKQEAgLTExNzksMzcgKzEyNDMsOCBAQAogI2VuZGlmCiAKIAlhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwKLQkJCSZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKKwkJCQkJICZ3ZG9nX3BhbmljX25vdGlmaWVyKTsKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2RvZ19yZWJvb3Rfbm90aWZpZXIpOwotCi0JaWYgKCEgd2F0Y2hkb2dfdXNlcikKLQkJZ290byBvdXQ7Ci0KLQkvKiBNYWtlIHN1cmUgbm8gb25lIGNhbiBjYWxsIHVzIGFueSBtb3JlLiAqLwotCW1pc2NfZGVyZWdpc3RlcigmaXBtaV93ZG9nX21pc2NkZXYpOwotCi0JLyogV2FpdCB0byBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgbWFrZXMgaXQgb3V0LiAgVGhlIGxvd2VyIGxheWVyIGhhcwotCSAgIHBvaW50ZXJzIHRvIG91ciBidWZmZXJzLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkb25lIGJlZm9yZQotCSAgIHdlIHJlbGVhc2Ugb3VyIG1lbW9yeS4gKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnNldF90aW1lb3V0X3RvZnJlZSkpCi0JCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCi0JLyogRGlzY29ubmVjdCBmcm9tIElQTUkuICovCi0JcnYgPSBpcG1pX2Rlc3Ryb3lfdXNlcih3YXRjaGRvZ191c2VyKTsKLQlpZiAocnYpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggImVycm9yIHVubGlua2luZyBmcm9tIElQTUk6ICVkXG4iLAotCQkgICAgICAgcnYpOwotCX0KLQl3YXRjaGRvZ191c2VyID0gTlVMTDsKLQotIG91dDoKLQl1cF93cml0ZSgmcmVnaXN0ZXJfc2VtKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwbWlfd2RvZ19leGl0KHZvaWQpCi17Ci0JaXBtaV9zbWlfd2F0Y2hlcl91bnJlZ2lzdGVyKCZzbWlfd2F0Y2hlcik7Ci0JaXBtaV91bnJlZ2lzdGVyX3dhdGNoZG9nKCk7CiB9CiBtb2R1bGVfZXhpdChpcG1pX3dkb2dfZXhpdCk7CiBtb2R1bGVfaW5pdChpcG1pX3dkb2dfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKaW5kZXggZTllOWJmMy4uNWE3NDdlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwpAQCAtMTcyLDEyICsxNzIsMTQgQEAKIHN0YXRpYyBpbnQgcHJldl9jYXJkID0gMzsJLyoJc3RhcnQgc2VydmljaW5nIGlzaV9jYXJkWzBdCSovCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmlzaWNvbV9ub3JtYWw7CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0eDsKK3N0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oaXNpX3RpbWVyZG9uZSk7CiBzdGF0aWMgY2hhciByZV9zY2hlZHVsZSA9IDE7CiAKIHN0YXRpYyB2b2lkIGlzaWNvbV90eCh1bnNpZ25lZCBsb25nIF9kYXRhKTsKIHN0YXRpYyB2b2lkIGlzaWNvbV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIAorc3RhdGljIERFRklORV9USU1FUih0eCwgaXNpY29tX3R4LCAwLCAwKTsKKwogLyogICBiYXVkIGluZGV4IG1hcHBpbmdzIGZyb20gbGludXggZGVmbnMgdG8gaXNpICovCiAKIHN0YXRpYyBzaWduZWQgY2hhciBsaW51eGJfdG9faXNpYltdID0gewpAQCAtMTkzLDkgKzE5NSw5IEBACiAJdW5zaWduZWQgc2hvcnQJCXNoaWZ0X2NvdW50OwogCXN0cnVjdCBpc2lfcG9ydAkJKiBwb3J0czsKIAlzaWduZWQgY2hhcgkJY291bnQ7Ci0JdW5zaWduZWQgY2hhcgkJaXNhOwogCXNwaW5sb2NrX3QJCWNhcmRfbG9jazsgLyogQ2FyZCB3aWRlIGxvY2sgMTEvNS8wMCAtc2FtZWVyICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJdW5zaWduZWQgaW50CQlpbmRleDsKIH07CiAKIHN0cnVjdAlpc2lfcG9ydCB7CkBAIC01MTQsMjUgKzUxNiwxOSBAQAogCS8qCXNjaGVkdWxlIGFub3RoZXIgdHggZm9yIGhvcGVmdWxseSBpbiBhYm91dCAxMG1zCSovCiBzY2hlZF9hZ2FpbjoKIAlpZiAoIXJlX3NjaGVkdWxlKSB7Ci0JCXJlX3NjaGVkdWxlID0gMjsKKwkJY29tcGxldGUoJmlzaV90aW1lcmRvbmUpOwogIAkJcmV0dXJuOwogCX0KIAotCWluaXRfdGltZXIoJnR4KTsKLQl0eC5leHBpcmVzID0gamlmZmllcyArIEhaLzEwMDsKLQl0eC5kYXRhID0gMDsKLQl0eC5mdW5jdGlvbiA9IGlzaWNvbV90eDsKLQlhZGRfdGltZXIoJnR4KTsKLQotCXJldHVybjsKKwltb2RfdGltZXIoJnR4LCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCkpOwogfQogCiAvKiAJSW50ZXJydXB0IGhhbmRsZXJzIAkqLwogCiAKLXN0YXRpYyB2b2lkIGlzaWNvbV9ib3R0b21oYWxmKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpc2ljb21fYm90dG9taGFsZihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gKHN0cnVjdCBpc2lfcG9ydCAqKSBkYXRhOworCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXNpX3BvcnQsIGJoX3RxdWV1ZSk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKIAogCWlmICghdHR5KQpAQCAtNTYyLDE0ICs1NTgsMTIgQEAKIAliYXNlID0gY2FyZC0+YmFzZTsKIAlzcGluX2xvY2soJmNhcmQtPmNhcmRfbG9jayk7CiAKLQlpZiAoY2FyZC0+aXNhID09IE5PKSB7Ci0JCS8qCi0JCSAqIGRpc2FibGUgYW55IGludGVycnVwdHMgZnJvbSB0aGUgUENJIGNhcmQgYW5kIGxvd2VyIHRoZQotCQkgKiBpbnRlcnJ1cHQgbGluZQotCQkgKi8KLQkJb3V0dygweDgwMDAsIGJhc2UrMHgwNCk7Ci0JCUNsZWFySW50ZXJydXB0KGJhc2UpOwotCX0KKwkvKgorCSAqIGRpc2FibGUgYW55IGludGVycnVwdHMgZnJvbSB0aGUgUENJIGNhcmQgYW5kIGxvd2VyIHRoZQorCSAqIGludGVycnVwdCBsaW5lCisJICovCisJb3V0dygweDgwMDAsIGJhc2UrMHgwNCk7CisJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7CiAKIAlpbncoYmFzZSk7CQkvKiBnZXQgdGhlIGR1bW15IHdvcmQgb3V0ICovCiAJaGVhZGVyID0gaW53KGJhc2UpOwpAQCAtNTc5LDE5ICs1NzMsMTMgQEAKIAlpZiAoY2hhbm5lbCArIDEgPiBjYXJkLT5wb3J0X2NvdW50KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogaXNpY29tX2ludGVycnVwdCgweCVseCk6ICIKIAkJCSIlZChjaGFubmVsKSA+IHBvcnRfY291bnQuXG4iLCBiYXNlLCBjaGFubmVsKzEpOwotCQlpZiAoY2FyZC0+aXNhKQotCQkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7Ci0JCWVsc2UKLQkJCW91dHcoMHgwMDAwLCBiYXNlKzB4MDQpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KIAkJc3Bpbl91bmxvY2soJmNhcmQtPmNhcmRfbG9jayk7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAJcG9ydCA9IGNhcmQtPnBvcnRzICsgY2hhbm5lbDsKIAlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgewotCQlpZiAoY2FyZC0+aXNhKQotCQkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7Ci0JCWVsc2UKLQkJCW91dHcoMHgwMDAwLCBiYXNlKzB4MDQpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApAQCAtNjA0LDEwICs1OTIsNyBAQAogCQl9CiAJCWlmIChieXRlX2NvdW50ICYgMHgwMSkKIAkJCWludyhiYXNlKTsKLQkJaWYgKGNhcmQtPmlzYSA9PSBZRVMpCi0JCQlDbGVhckludGVycnVwdChiYXNlKTsKLQkJZWxzZQotCQkJb3V0dygweDAwMDAsIGJhc2UrMHgwNCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCW91dHcoMHgwMDAwLCBiYXNlKzB4MDQpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLwogCQlzcGluX3VubG9jaygmY2FyZC0+Y2FyZF9sb2NrKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KQEAgLTcwOCwxMCArNjkzLDcgQEAKIAkJfQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KLQlpZiAoY2FyZC0+aXNhID09IFlFUykKLQkJQ2xlYXJJbnRlcnJ1cHQoYmFzZSk7Ci0JZWxzZQotCQlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwlvdXR3KDB4MDAwMCwgYmFzZSsweDA0KTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTk2NCw4ICs5NDYsOCBAQAogewogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkOwotCXVuc2lnbmVkIGludCBsaW5lLCBib2FyZDsKLQlpbnQgZXJyb3I7CisJdW5zaWduZWQgaW50IGJvYXJkOworCWludCBlcnJvciwgbGluZTsKIAogCWxpbmUgPSB0dHktPmluZGV4OwogCWlmIChsaW5lIDwgMCB8fCBsaW5lID4gUE9SVF9DT1VOVC0xKQpAQCAtMTA2MiwxMSArMTA0NCwxMiBAQAogc3RhdGljIHZvaWQgaXNpY29tX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IHBvcnQtPmNhcmQ7CisJc3RydWN0IGlzaV9ib2FyZCAqY2FyZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CisJY2FyZCA9IHBvcnQtPmNhcmQ7CiAJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fY2xvc2UiKSkKIAkJcmV0dXJuOwogCkBAIC0xMzk4LDcgKzEzODEsNyBAQAogCiAvKiBzZXRfdGVybWlvcyBldCBhbGwgKi8KIHN0YXRpYyB2b2lkIGlzaWNvbV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCXN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKKwlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE0NzMsOSArMTQ1Niw5IEBACiB9CiAKIC8qIGhhbmd1cCBldCBhbGwgKi8KLXN0YXRpYyB2b2lkIGRvX2lzaWNvbV9oYW5ndXAodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGRvX2lzaWNvbV9oYW5ndXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpc2lfcG9ydCAqcG9ydCA9IGRhdGE7CisJc3RydWN0IGlzaV9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpc2lfcG9ydCwgaGFuZ3VwX3RxKTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCiAJdHR5ID0gcG9ydC0+dHR5OwpAQCAtMTUxOSwzNyArMTUwMiw2IEBACiAgKiBEcml2ZXIgaW5pdCBhbmQgZGVpbml0IGZ1bmN0aW9ucwogICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGlzaWNvbV9yZWdpc3Rlcl9pb3JlZ2lvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQljb25zdCB1bnNpZ25lZCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGlzaV9ib2FyZCAqYm9hcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQlpZiAoIWJvYXJkLT5iYXNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghcmVxdWVzdF9yZWdpb24oYm9hcmQtPmJhc2UsIDE2LCBJU0lDT01fTkFNRSkpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiSS9PIFJlZ2lvbiAweCVseC0weCVseCBpcyBidXN5LiBDYXJkJWQgIgotCQkJIndpbGwgYmUgZGlzYWJsZWQuXG4iLCBib2FyZC0+YmFzZSwgYm9hcmQtPmJhc2UgKyAxNSwKLQkJCWluZGV4ICsgMSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0gCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpc2ljb21fdW5yZWdpc3Rlcl9pb3JlZ2lvbihzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgaXNpX2JvYXJkICpib2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmICghYm9hcmQtPmJhc2UpCi0JCXJldHVybjsKLQotCXJlbGVhc2VfcmVnaW9uKGJvYXJkLT5iYXNlLCAxNik7Ci0JZGV2X2RiZygmcGRldi0+ZGV2LCAiSS9PIFJlZ2lvbiAweCVseC0weCVseCByZWxlYXNlZC5cbiIsCi0JCWJvYXJkLT5iYXNlLCBib2FyZC0+YmFzZSArIDE1KTsKLQlib2FyZC0+YmFzZSA9IDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgaXNpY29tX29wcyA9IHsKIAkub3BlbgkJCT0gaXNpY29tX29wZW4sCiAJLmNsb3NlCQkJPSBpc2ljb21fY2xvc2UsCkBAIC0xNTcwLDcwICsxNTIyLDYgQEAKIAkudGlvY21zZXQJCT0gaXNpY29tX3Rpb2Ntc2V0LAogfTsKIAotc3RhdGljIGludCBfX2RldmluaXQgaXNpY29tX3JlZ2lzdGVyX3R0eV9kcml2ZXIodm9pZCkKLXsKLQlpbnQgZXJyb3IgPSAtRU5PTUVNOwotCi0JLyogdHR5IGRyaXZlciBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24gKi8KLQlpc2ljb21fbm9ybWFsID0gYWxsb2NfdHR5X2RyaXZlcihQT1JUX0NPVU5UKTsKLQlpZiAoIWlzaWNvbV9ub3JtYWwpCi0JCWdvdG8gZW5kOwotCi0JaXNpY29tX25vcm1hbC0+b3duZXIJCQk9IFRISVNfTU9EVUxFOwotCWlzaWNvbV9ub3JtYWwtPm5hbWUgCQkJPSAidHR5TSI7Ci0JaXNpY29tX25vcm1hbC0+bWFqb3IJCQk9IElTSUNPTV9OTUFKT1I7Ci0JaXNpY29tX25vcm1hbC0+bWlub3Jfc3RhcnQJCT0gMDsKLQlpc2ljb21fbm9ybWFsLT50eXBlCQkJPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCWlzaWNvbV9ub3JtYWwtPnN1YnR5cGUJCQk9IFNFUklBTF9UWVBFX05PUk1BTDsKLQlpc2ljb21fbm9ybWFsLT5pbml0X3Rlcm1pb3MJCT0gdHR5X3N0ZF90ZXJtaW9zOwotCWlzaWNvbV9ub3JtYWwtPmluaXRfdGVybWlvcy5jX2NmbGFnCT0gQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwKLQkJQ0xPQ0FMOwotCWlzaWNvbV9ub3JtYWwtPmZsYWdzCQkJPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwotCXR0eV9zZXRfb3BlcmF0aW9ucyhpc2ljb21fbm9ybWFsLCAmaXNpY29tX29wcyk7Ci0KLQlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihpc2ljb21fbm9ybWFsKSkpIHsKLQkJcHJfZGJnKCJDb3VsZG4ndCByZWdpc3RlciB0aGUgZGlhbGluIGRyaXZlciwgZXJyb3I9JWRcbiIsCi0JCQllcnJvcik7Ci0JCXB1dF90dHlfZHJpdmVyKGlzaWNvbV9ub3JtYWwpOwotCX0KLWVuZDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB2b2lkIGlzaWNvbV91bnJlZ2lzdGVyX3R0eV9kcml2ZXIodm9pZCkKLXsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoKGVycm9yID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGlzaWNvbV9ub3JtYWwpKSkKLQkJcHJfZGJnKCJjb3VsZG4ndCB1bnJlZ2lzdGVyIG5vcm1hbCBkcml2ZXIsIGVycm9yPSVkLlxuIiwgZXJyb3IpOwotCi0JcHV0X3R0eV9kcml2ZXIoaXNpY29tX25vcm1hbCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGlzaWNvbV9yZWdpc3Rlcl9pc3Ioc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JY29uc3QgdW5zaWduZWQgaW50IGluZGV4KQotewotCXN0cnVjdCBpc2lfYm9hcmQgKmJvYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MgPSBJUlFGX0RJU0FCTEVEOwotCWludCByZXR2YWwgPSAtRUlOVkFMOwotCi0JaWYgKCFib2FyZC0+YmFzZSkKLQkJZ290byBlbmQ7Ci0KLQlpZiAoYm9hcmQtPmlzYSA9PSBOTykKLQkJaXJxZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7Ci0KLQlyZXR2YWwgPSByZXF1ZXN0X2lycShib2FyZC0+aXJxLCBpc2ljb21faW50ZXJydXB0LCBpcnFmbGFncywKLQkJSVNJQ09NX05BTUUsIGJvYXJkKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkNvdWxkIG5vdCBpbnN0YWxsIGhhbmRsZXIgYXQgSXJxICVkLiAiCi0JCQkiQ2FyZCVkIHdpbGwgYmUgZGlzYWJsZWQuXG4iLCBib2FyZC0+aXJxLCBpbmRleCArIDEpOwotIAllbHNlCi0JCXJldHZhbCA9IDA7Ci1lbmQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQogc3RhdGljIGludCBfX2RldmluaXQgcmVzZXRfY2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAljb25zdCB1bnNpZ25lZCBpbnQgY2FyZCwgdW5zaWduZWQgaW50ICpzaWduYXR1cmUpCiB7CkBAIC0xNjU1LDM2ICsxNTQzLDIzIEBACiAKIAkqc2lnbmF0dXJlID0gaW53KGJhc2UgKyAweDQpICYgMHhmZjsKIAotCWlmIChib2FyZC0+aXNhID09IFlFUykgewotCQlpZiAoIShpbncoYmFzZSArIDB4ZSkgJiAweDEpIHx8IChpbncoYmFzZSArIDB4MikpKSB7Ci0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJiYXNlKzB4Mj0weCVseCwgYmFzZSsweGU9MHglbHhcbiIsCi0JCQkJaW53KGJhc2UgKyAweDIpLCBpbncoYmFzZSArIDB4ZSkpOwotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVNJTG9hZDpJU0EgQ2FyZCVkIHJlc2V0IGZhaWx1cmUgIgotCQkJCSIoUG9zc2libGUgYmFkIEkvTyBQb3J0IEFkZHJlc3MgMHglbHgpLlxuIiwKLQkJCQljYXJkICsgMSwgYmFzZSk7Ci0JCQlyZXR2YWwgPSAtRUlPOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9IGVsc2UgewotCQlwb3J0Y291bnQgPSBpbncoYmFzZSArIDB4Mik7Ci0JCWlmICghKGludyhiYXNlICsgMHhlKSAmIDB4MSkgfHwgKChwb3J0Y291bnQgIT0gMCkgJiYKLQkJCQkocG9ydGNvdW50ICE9IDQpICYmIChwb3J0Y291bnQgIT0gOCkpKSB7Ci0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJiYXNlKzB4Mj0weCVseCwgYmFzZSsweGU9MHglbHhcbiIsCi0JCQkJaW53KGJhc2UgKyAweDIpLCBpbncoYmFzZSArIDB4ZSkpOwotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVNJTG9hZDpQQ0kgQ2FyZCVkIHJlc2V0IGZhaWx1cmUgIgotCQkJCSIoUG9zc2libGUgYmFkIEkvTyBQb3J0IEFkZHJlc3MgMHglbHgpLlxuIiwKLQkJCQljYXJkICsgMSwgYmFzZSk7Ci0JCQlyZXR2YWwgPSAtRUlPOwotCQkJZ290byBlbmQ7Ci0JCX0KKwlwb3J0Y291bnQgPSBpbncoYmFzZSArIDB4Mik7CisJaWYgKCEoaW53KGJhc2UgKyAweGUpICYgMHgxKSB8fCAoKHBvcnRjb3VudCAhPSAwKSAmJgorCQkJKHBvcnRjb3VudCAhPSA0KSAmJiAocG9ydGNvdW50ICE9IDgpKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJiYXNlKzB4Mj0weCVseCwgYmFzZSsweGU9MHglbHhcbiIsCisJCQlpbncoYmFzZSArIDB4MiksIGludyhiYXNlICsgMHhlKSk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIklTSUxvYWQ6UENJIENhcmQlZCByZXNldCBmYWlsdXJlICIKKwkJCSIoUG9zc2libGUgYmFkIEkvTyBQb3J0IEFkZHJlc3MgMHglbHgpLlxuIiwKKwkJCWNhcmQgKyAxLCBiYXNlKTsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmQ7CiAJfQogCiAJc3dpdGNoICgqc2lnbmF0dXJlKSB7CiAJY2FzZSAweGE1OgogCWNhc2UgMHhiYjoKIAljYXNlIDB4ZGQ6Ci0JCWJvYXJkLT5wb3J0X2NvdW50ID0gKGJvYXJkLT5pc2EgPT0gTk8gJiYgcG9ydGNvdW50ID09IDQpID8gNCA6Ci0JCQk4OworCQlib2FyZC0+cG9ydF9jb3VudCA9IChwb3J0Y291bnQgPT0gNCkgPyA0IDogODsKIAkJYm9hcmQtPnNoaWZ0X2NvdW50ID0gMTI7CiAJCWJyZWFrOwogCWNhc2UgMHhjYzoKQEAgLTE4MzAsNiArMTcwNSwxMSBAQAogCQl9CiAKIAkJZGF0YSA9IGttYWxsb2Mod29yZF9jb3VudCAqIDIsIEdGUF9LRVJORUwpOworCQlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYXJkJWQsIGZpcm13YXJlIHVwbG9hZCAiCisJCQkJImZhaWxlZCwgbm90IGVub3VnaCBtZW1vcnlcbiIsIGluZGV4ICsgMSk7CisJCQlnb3RvIGVycnJlbGZ3OworCQl9CiAJCWludyhiYXNlKTsKIAkJaW5zdyhiYXNlLCBkYXRhLCB3b3JkX2NvdW50KTsKIAkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKQEAgLTE4NzgsOCArMTc1OCw2IEBACiAvKgogICoJSW5zbW9kIGNhbiBzZXQgc3RhdGljIHN5bWJvbHMgc28ga2VlcCB0aGVzZSBzdGF0aWMKICAqLwotc3RhdGljIGludCBpb1s0XTsKLXN0YXRpYyBpbnQgaXJxWzRdOwogc3RhdGljIGludCBjYXJkOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2ljb21fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCkBAIC0xOTA1LDIwICsxNzgzLDI5IEBACiAJCQlicmVhazsKIAkJfQogCisJYm9hcmQtPmluZGV4ID0gaW5kZXg7CiAJYm9hcmQtPmJhc2UgPSBpb2FkZHI7CiAJYm9hcmQtPmlycSA9IHBjaWlycTsKLQlib2FyZC0+aXNhID0gTk87CiAJY2FyZCsrOwogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJvYXJkKTsKIAotCXJldHZhbCA9IGlzaWNvbV9yZWdpc3Rlcl9pb3JlZ2lvbihwZGV2LCBpbmRleCk7Ci0JaWYgKHJldHZhbCA8IDApCisJcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDMsIElTSUNPTV9OQU1FKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkkvTyBSZWdpb24gMHglbHgtMHglbHggaXMgYnVzeS4gQ2FyZCVkICIKKwkJCSJ3aWxsIGJlIGRpc2FibGVkLlxuIiwgYm9hcmQtPmJhc2UsIGJvYXJkLT5iYXNlICsgMTUsCisJCQlpbmRleCArIDEpOworCQlyZXR2YWwgPSAtRUJVU1k7CiAJCWdvdG8gZXJyOworIAl9CiAKLQlyZXR2YWwgPSBpc2ljb21fcmVnaXN0ZXJfaXNyKHBkZXYsIGluZGV4KTsKLQlpZiAocmV0dmFsIDwgMCkKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShib2FyZC0+aXJxLCBpc2ljb21faW50ZXJydXB0LAorCQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBJU0lDT01fTkFNRSwgYm9hcmQpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCBpbnN0YWxsIGhhbmRsZXIgYXQgSXJxICVkLiAiCisJCQkiQ2FyZCVkIHdpbGwgYmUgZGlzYWJsZWQuXG4iLCBib2FyZC0+aXJxLCBpbmRleCArIDEpOwogCQlnb3RvIGVycnVucnI7CisJfQogCiAJcmV0dmFsID0gcmVzZXRfY2FyZChwZGV2LCBpbmRleCwgJnNpZ25hdHVyZSk7CiAJaWYgKHJldHZhbCA8IDApCkBAIC0xOTI4LDEyICsxODE1LDE2IEBACiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gZXJydW5yaTsKIAorCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGJvYXJkLT5wb3J0X2NvdW50OyBpbmRleCsrKQorCQl0dHlfcmVnaXN0ZXJfZGV2aWNlKGlzaWNvbV9ub3JtYWwsIGJvYXJkLT5pbmRleCAqIDE2ICsgaW5kZXgsCisJCQkJJnBkZXYtPmRldik7CisKIAlyZXR1cm4gMDsKIAogZXJydW5yaToKIAlmcmVlX2lycShib2FyZC0+aXJxLCBib2FyZCk7CiBlcnJ1bnJyOgotCWlzaWNvbV91bnJlZ2lzdGVyX2lvcmVnaW9uKHBkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAzKTsKIGVycjoKIAlib2FyZC0+YmFzZSA9IDA7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTE5NDIsMTggKzE4MzMsMjEgQEAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpc2ljb21fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBpc2lfYm9hcmQgKmJvYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJvYXJkLT5wb3J0X2NvdW50OyBpKyspCisJCXR0eV91bnJlZ2lzdGVyX2RldmljZShpc2ljb21fbm9ybWFsLCBib2FyZC0+aW5kZXggKiAxNiArIGkpOwogCiAJZnJlZV9pcnEoYm9hcmQtPmlycSwgYm9hcmQpOwotCWlzaWNvbV91bnJlZ2lzdGVyX2lvcmVnaW9uKHBkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAzKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgaXNpY29tX3NldHVwKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpc2ljb21faW5pdCh2b2lkKQogewogCWludCByZXR2YWwsIGlkeCwgY2hhbm5lbDsKIAlzdHJ1Y3QgaXNpX3BvcnQgKnBvcnQ7CiAKIAljYXJkID0gMDsKLQltZW1zZXQoaXNpX3BvcnRzLCAwLCBzaXplb2YoaXNpX3BvcnRzKSk7CiAKIAlmb3IoaWR4ID0gMDsgaWR4IDwgQk9BUkRfQ09VTlQ7IGlkeCsrKSB7CiAJCXBvcnQgPSAmaXNpX3BvcnRzW2lkeCAqIDE2XTsKQEAgLTE5NjUsOCArMTg1OSw4IEBACiAJCQlwb3J0LT5jaGFubmVsID0gY2hhbm5lbDsKIAkJCXBvcnQtPmNsb3NlX2RlbGF5ID0gNTAgKiBIWi8xMDA7CiAJCQlwb3J0LT5jbG9zaW5nX3dhaXQgPSAzMDAwICogSFovMTAwOwotCQkJSU5JVF9XT1JLKCZwb3J0LT5oYW5ndXBfdHEsIGRvX2lzaWNvbV9oYW5ndXAsIHBvcnQpOwotCQkJSU5JVF9XT1JLKCZwb3J0LT5iaF90cXVldWUsIGlzaWNvbV9ib3R0b21oYWxmLCBwb3J0KTsKKwkJCUlOSVRfV09SSygmcG9ydC0+aGFuZ3VwX3RxLCBkb19pc2ljb21faGFuZ3VwKTsKKwkJCUlOSVRfV09SSygmcG9ydC0+YmhfdHF1ZXVlLCBpc2ljb21fYm90dG9taGFsZik7CiAJCQlwb3J0LT5zdGF0dXMgPSAwOwogCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+b3Blbl93YWl0KTsKIAkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmNsb3NlX3dhaXQpOwpAQCAtMTk3NCw2NiArMTg2OCw2NSBAQAogIAkJfQogCQlpc2lfY2FyZFtpZHhdLmJhc2UgPSAwOwogCQlpc2lfY2FyZFtpZHhdLmlycSA9IDA7Ci0KLQkJaWYgKCFpb1tpZHhdKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGlycVtpZHhdID09IDIgfHwgaXJxW2lkeF0gPT0gMyB8fCBpcnFbaWR4XSA9PSA0CXx8Ci0JCQkJaXJxW2lkeF0gPT0gNQl8fCBpcnFbaWR4XSA9PSA3CXx8Ci0JCQkJaXJxW2lkeF0gPT0gMTAJfHwgaXJxW2lkeF0gPT0gMTEJfHwKLQkJCQlpcnFbaWR4XSA9PSAxMgl8fCBpcnFbaWR4XSA9PSAxNSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IElTQSBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOwotCQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0gZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICJJU0lDT006IElycSAlZCB1bnN1cHBvcnRlZC4gIgotCQkJCSJEaXNhYmxpbmcgQ2FyZCVkLi4uXG4iLCBpcnFbaWR4XSwgaWR4ICsgMSk7CiAJfQogCi0JcmV0dmFsID0gaXNpY29tX3JlZ2lzdGVyX3R0eV9kcml2ZXIoKTsKLQlpZiAocmV0dmFsIDwgMCkKKwkvKiB0dHkgZHJpdmVyIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbiAqLworCWlzaWNvbV9ub3JtYWwgPSBhbGxvY190dHlfZHJpdmVyKFBPUlRfQ09VTlQpOworCWlmICghaXNpY29tX25vcm1hbCkgeworCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yOworCX0KKworCWlzaWNvbV9ub3JtYWwtPm93bmVyCQkJPSBUSElTX01PRFVMRTsKKwlpc2ljb21fbm9ybWFsLT5uYW1lIAkJCT0gInR0eU0iOworCWlzaWNvbV9ub3JtYWwtPm1ham9yCQkJPSBJU0lDT01fTk1BSk9SOworCWlzaWNvbV9ub3JtYWwtPm1pbm9yX3N0YXJ0CQk9IDA7CisJaXNpY29tX25vcm1hbC0+dHlwZQkJCT0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlpc2ljb21fbm9ybWFsLT5zdWJ0eXBlCQkJPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJaXNpY29tX25vcm1hbC0+aW5pdF90ZXJtaW9zCQk9IHR0eV9zdGRfdGVybWlvczsKKwlpc2ljb21fbm9ybWFsLT5pbml0X3Rlcm1pb3MuY19jZmxhZwk9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8CisJCUNMT0NBTDsKKwlpc2ljb21fbm9ybWFsLT5mbGFncwkJCT0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8CisJCVRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CisJdHR5X3NldF9vcGVyYXRpb25zKGlzaWNvbV9ub3JtYWwsICZpc2ljb21fb3BzKTsKKworCXJldHZhbCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoaXNpY29tX25vcm1hbCk7CisJaWYgKHJldHZhbCkgeworCQlwcl9kYmcoIkNvdWxkbid0IHJlZ2lzdGVyIHRoZSBkaWFsaW4gZHJpdmVyXG4iKTsKKwkJZ290byBlcnJfcHV0dHR5OworCX0KIAogCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlzaWNvbV9kcml2ZXIpOwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiSVNJQ09NOiBVbmFibGUgdG8gcmVnaXN0ZXIgcGNpIGRyaXZlci5cbiIpOwotCQlnb3RvIGVycnR0eTsKKwkJZ290byBlcnJfdW5ydHR5OwogCX0KIAotCWluaXRfdGltZXIoJnR4KTsKLQl0eC5leHBpcmVzID0gamlmZmllcyArIDE7Ci0JdHguZGF0YSA9IDA7Ci0JdHguZnVuY3Rpb24gPSBpc2ljb21fdHg7Ci0JcmVfc2NoZWR1bGUgPSAxOwotCWFkZF90aW1lcigmdHgpOworCW1vZF90aW1lcigmdHgsIGppZmZpZXMgKyAxKTsKIAogCXJldHVybiAwOwotZXJydHR5OgotCWlzaWNvbV91bnJlZ2lzdGVyX3R0eV9kcml2ZXIoKTsKK2Vycl91bnJ0dHk6CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGlzaWNvbV9ub3JtYWwpOworZXJyX3B1dHR0eToKKwlwdXRfdHR5X2RyaXZlcihpc2ljb21fbm9ybWFsKTsKIGVycm9yOgogCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpc2ljb21fZXhpdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBpbmRleCA9IDA7Ci0KIAlyZV9zY2hlZHVsZSA9IDA7CiAKLQl3aGlsZSAocmVfc2NoZWR1bGUgIT0gMiAmJiBpbmRleCsrIDwgMTAwKQotCQltc2xlZXAoMTApOworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaXNpX3RpbWVyZG9uZSwgSFopOwogCiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpc2ljb21fZHJpdmVyKTsKLQlpc2ljb21fdW5yZWdpc3Rlcl90dHlfZHJpdmVyKCk7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGlzaWNvbV9ub3JtYWwpOworCXB1dF90dHlfZHJpdmVyKGlzaWNvbV9ub3JtYWwpOwogfQogCi1tb2R1bGVfaW5pdChpc2ljb21fc2V0dXApOworbW9kdWxlX2luaXQoaXNpY29tX2luaXQpOwogbW9kdWxlX2V4aXQoaXNpY29tX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJNdWx0aVRlY2giKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgSVNJIHNlcmllcyBvZiBjYXJkcyBieSBNdWx0aVRlY2giKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gcG9ydHMgZm9yIHRoZSBjYXJkcyIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSW50ZXJydXB0cyBmb3IgdGhlIGNhcmRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKaW5kZXggZmZkZjlkZi4uNjg2NDVkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwpAQCAtMTQsMTQgKzE0LDYgQEAKICAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MSw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTYxLDIxICs1NCwxMCBAQAogI2RlZmluZQlCUkRfQlJVTUJZNAkyCiAjZGVmaW5lCUJSRF9PTkJPQVJEMgkzCiAjZGVmaW5lCUJSRF9PTkJPQVJECTQKLSNkZWZpbmUJQlJEX0JSVU1CWTgJNQotI2RlZmluZQlCUkRfQlJVTUJZMTYJNgogI2RlZmluZQlCUkRfT05CT0FSREUJNwotI2RlZmluZQlCUkRfT05CT0FSRDMyCTkKLSNkZWZpbmUJQlJEX09OQk9BUkQyXzMyCTEwCi0jZGVmaW5lCUJSRF9PTkJPQVJEUlMJMTEKLSNkZWZpbmUJQlJEX0VBU1lJTwkyMAotI2RlZmluZQlCUkRfRUNICQkyMQotI2RlZmluZQlCUkRfRUNITUMJMjIKICNkZWZpbmUJQlJEX0VDUAkJMjMKICNkZWZpbmUgQlJEX0VDUEUJMjQKICNkZWZpbmUJQlJEX0VDUE1DCTI1Ci0jZGVmaW5lCUJSRF9FQ0hQQ0kJMjYKLSNkZWZpbmUJQlJEX0VDSDY0UENJCTI3Ci0jZGVmaW5lCUJSRF9FQVNZSU9QQ0kJMjgKICNkZWZpbmUJQlJEX0VDUFBDSQkyOQogCiAjZGVmaW5lCUJSRF9CUlVNQlkJQlJEX0JSVU1CWTQKQEAgLTExOSwyMCArMTAxLDE2IEBACiAgKglpbnRlcnJ1cHQgaXMgcmVxdWlyZWQuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IHN0bGNvbmYgewogCWludAkJYnJkdHlwZTsKIAlpbnQJCWlvYWRkcjE7CiAJaW50CQlpb2FkZHIyOwogCXVuc2lnbmVkIGxvbmcJbWVtYWRkcjsKIAlpbnQJCWlycTsKIAlpbnQJCWlycXR5cGU7Ci19IHN0bGNvbmZfdDsKLQotc3RhdGljIHN0bGNvbmZfdAlzdGxpX2JyZGNvbmZbXSA9IHsKLQkvKnsgQlJEX0VDUCwgMHgyYTAsIDAsIDB4Y2MwMDAsIDAsIDAgfSwqLwogfTsKIAotc3RhdGljIGludAlzdGxpX25yYnJkcyA9IEFSUkFZX1NJWkUoc3RsaV9icmRjb25mKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RsaV9ucmJyZHM7CiAKIC8qIHN0bGlfbG9jayBtdXN0IE5PVCBiZSB0YWtlbiBob2xkaW5nIGJyZF9sb2NrICovCiBzdGF0aWMgc3BpbmxvY2tfdCBzdGxpX2xvY2s7CS8qIFRUWSBsb2dpYyBsb2NrICovCkBAIC0xOTQsOSArMTcyLDExIEBACiAgKgl3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuIEJhc2ljYWxseSBhbGwgaXQgZGVmaW5lcyBpcyBhIHJhdyBwb3J0CiAgKglhdCA5NjAwIGJhdWQsIDggZGF0YSBiaXRzLCBubyBwYXJpdHksIDEgc3RvcCBiaXQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdGVybWlvcwkJc3RsaV9kZWZ0ZXJtaW9zID0geworc3RhdGljIHN0cnVjdCBrdGVybWlvcwkJc3RsaV9kZWZ0ZXJtaW9zID0gewogCS5jX2NmbGFnCT0gKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCksCiAJLmNfY2MJCT0gSU5JVF9DX0NDLAorCS5jX2lzcGVlZAk9IDk2MDAsCisJLmNfb3NwZWVkCT0gOTYwMCwKIH07CiAKIC8qCkBAIC0yMDUsMTMgKzE4NSwxMiBAQAogICovCiBzdGF0aWMgY29tc3RhdHNfdAlzdGxpX2NvbXN0YXRzOwogc3RhdGljIGNvbWJyZF90CQlzdGxpX2JyZHN0YXRzOwotc3RhdGljIGFzeXN0YXRzX3QJc3RsaV9jZGtzdGF0czsKLXN0YXRpYyBzdGxpYnJkX3QJc3RsaV9kdW1teWJyZDsKLXN0YXRpYyBzdGxpcG9ydF90CXN0bGlfZHVtbXlwb3J0Oworc3RhdGljIHN0cnVjdCBhc3lzdGF0cwlzdGxpX2Nka3N0YXRzOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdGxpYnJkX3QJKnN0bGlfYnJkc1tTVExfTUFYQlJEU107CitzdGF0aWMgREVGSU5FX01VVEVYKHN0bGlfYnJkc2xvY2spOworc3RhdGljIHN0cnVjdCBzdGxpYnJkCSpzdGxpX2JyZHNbU1RMX01BWEJSRFNdOwogCiBzdGF0aWMgaW50CQlzdGxpX3NoYXJlZDsKIApAQCAtMjIzLDYgKzIwMiw3IEBACiAgKi8KICNkZWZpbmUJQlNUX0ZPVU5ECTB4MQogI2RlZmluZQlCU1RfU1RBUlRFRAkweDIKKyNkZWZpbmUJQlNUX1BST0JFRAkweDQKIAogLyoKICAqCURlZmluZSB0aGUgc2V0IG9mIHBvcnQgc3RhdGUgZmxhZ3MuIFRoZXNlIGFyZSBtYXJrZWQgZm9yIGludGVybmFsCkBAIC0yNTUsMTggKzIzNSwxOCBAQAogCSJCcnVtYnkiLAogCSJCcnVtYnkiLAogCSJPTmJvYXJkLUVJIiwKLQkoY2hhciAqKSBOVUxMLAorCU5VTEwsCiAJIk9OYm9hcmQiLAogCSJPTmJvYXJkLU1DIiwKIAkiT05ib2FyZC1NQyIsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKIAkiRWFzeUlPIiwKIAkiRUM4LzMyLUFUIiwKIAkiRUM4LzMyLU1DIiwKQEAgLTMwNCwxMiArMjg0LDEwIEBACiAgKglwYXJzZSBhbnkgbW9kdWxlIGFyZ3VtZW50cy4KICAqLwogCi10eXBlZGVmIHN0cnVjdCBzdGxpYnJkdHlwZSB7CitzdGF0aWMgc3RydWN0IHN0bGlicmR0eXBlIHsKIAljaGFyCSpuYW1lOwogCWludAl0eXBlOwotfSBzdGxpYnJkdHlwZV90OwotCi1zdGF0aWMgc3RsaWJyZHR5cGVfdAlzdGxpX2JyZHN0cltdID0geworfSBzdGxpX2JyZHN0cltdID0gewogCXsgInN0YWxsaW9uIiwgQlJEX1NUQUxMSU9OIH0sCiAJeyAiMSIsIEJSRF9TVEFMTElPTiB9LAogCXsgImJydW1ieSIsIEJSRF9CUlVNQlkgfSwKQEAgLTM3OSw2ICszNTcsNyBAQAogbW9kdWxlX3BhcmFtX2FycmF5KGJvYXJkMywgY2hhcnAsIE5VTEwsIDApOwogTU9EVUxFX1BBUk1fREVTQyhib2FyZDMsICJCb2FyZCAzIGNvbmZpZyAtPiBuYW1lWyxpb2FkZHJbLG1lbWFkZHJdIik7CiAKKyNpZiBTVExJX0VJU0FQUk9CRSAhPSAwCiAvKgogICoJU2V0IHVwIGEgZGVmYXVsdCBtZW1vcnkgYWRkcmVzcyB0YWJsZSBmb3IgRUlTQSBib2FyZCBwcm9iaW5nLgogICoJVGhlIGRlZmF1bHQgYWRkcmVzc2VzIGFyZSBhbGwgYmVsbG93IDFNYnl0ZSwgd2hpY2ggaGFzIHRvIGJlIHRoZQpAQCAtMzk2LDE0ICszNzUsMTEgQEAKIH07CiAKIHN0YXRpYyBpbnQJc3RsaV9laXNhbWVtcHNpemUgPSBBUlJBWV9TSVpFKHN0bGlfZWlzYW1lbXByb2JlYWRkcnMpOworI2VuZGlmCiAKIC8qCiAgKglEZWZpbmUgdGhlIFN0YWxsaW9uIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuCiAgKi8KLSNpZmRlZiBDT05GSUdfUENJCi0jaWZuZGVmCVBDSV9WRU5ET1JfSURfU1RBTExJT04KLSNkZWZpbmUJUENJX1ZFTkRPUl9JRF9TVEFMTElPTgkJMHgxMjRkCi0jZW5kaWYKICNpZm5kZWYgUENJX0RFVklDRV9JRF9FQ1JBCiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfRUNSQQkJMHgwMDA0CiAjZW5kaWYKQEAgLTQxNCw3ICszOTAsNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpc3RhbGxpb25fcGNpX3RibCk7CiAKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3RsaV9wY2lkcml2ZXI7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNjE1LDIyICs1OTEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqCURlZmluZSBzb21lIGhhbmR5IGxvY2FsIG1hY3Jvcy4uLgotICovCi0jdW5kZWYgTUlOCi0jZGVmaW5lCU1JTihhLGIpCSgoKGEpIDw9IChiKSkgPyAoYSkgOiAoYikpCi0KLSN1bmRlZglUT0xPV0VSCi0jZGVmaW5lCVRPTE9XRVIoeCkJKCgoKHgpID49ICdBJykgJiYgKCh4KSA8PSAnWicpKSA/ICgoeCkgKyAweDIwKSA6ICh4KSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgogICoJUHJvdG90eXBlIGFsbCBmdW5jdGlvbnMgaW4gdGhpcyBkcml2ZXIhCiAgKi8KIAotc3RhdGljIGludAlzdGxpX3BhcnNlYnJkKHN0bGNvbmZfdCAqY29uZnAsIGNoYXIgKiphcmdwKTsKLXN0YXRpYyBpbnQJc3RsaV9pbml0KHZvaWQpOworc3RhdGljIGludAlzdGxpX3BhcnNlYnJkKHN0cnVjdCBzdGxjb25mICpjb25mcCwgY2hhciAqKmFyZ3ApOwogc3RhdGljIGludAlzdGxpX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIHZvaWQJc3RsaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBzdGF0aWMgaW50CXN0bGlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwpAQCAtNjM5LDcgKzYwMyw3IEBACiBzdGF0aWMgaW50CXN0bGlfd3JpdGVyb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogc3RhdGljIGludAlzdGxpX2NoYXJzaW5idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgaW50CXN0bGlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyB2b2lkCXN0bGlfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKK3N0YXRpYyB2b2lkCXN0bGlfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCk7CiBzdGF0aWMgdm9pZAlzdGxpX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogc3RhdGljIHZvaWQJc3RsaV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogc3RhdGljIHZvaWQJc3RsaV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtNjQ5LDg2ICs2MTMsODQgQEAKIHN0YXRpYyB2b2lkCXN0bGlfd2FpdHVudGlsc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCk7CiBzdGF0aWMgdm9pZAlzdGxpX3NlbmR4Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKTsKIHN0YXRpYyB2b2lkCXN0bGlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludAlzdGxpX3BvcnRpbmZvKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIGludCBwb3J0bnIsIGNoYXIgKnBvcyk7CitzdGF0aWMgaW50CXN0bGlfcG9ydGluZm8oc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIGludCBwb3J0bnIsIGNoYXIgKnBvcyk7CiAKLXN0YXRpYyBpbnQJc3RsaV9icmRpbml0KHN0bGlicmRfdCAqYnJkcCk7Ci1zdGF0aWMgaW50CXN0bGlfc3RhcnRicmQoc3RsaWJyZF90ICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9icmRpbml0KHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9zdGFydGJyZChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CiBzdGF0aWMgc3NpemVfdAlzdGxpX21lbXJlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7CiBzdGF0aWMgc3NpemVfdAlzdGxpX21lbXdyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApOwogc3RhdGljIGludAlzdGxpX21lbWlvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIHZvaWQJc3RsaV9icmRwb2xsKHN0bGlicmRfdCAqYnJkcCwgY2RraGRyX3QgX19pb21lbSAqaGRycCk7CitzdGF0aWMgdm9pZAlzdGxpX2JyZHBvbGwoc3RydWN0IHN0bGlicmQgKmJyZHAsIGNka2hkcl90IF9faW9tZW0gKmhkcnApOwogc3RhdGljIHZvaWQJc3RsaV9wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBpbnQJc3RsaV9ob3N0Y21kKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApOwotc3RhdGljIGludAlzdGxpX2luaXRvcGVuKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApOwotc3RhdGljIGludAlzdGxpX3Jhd29wZW4oc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KTsKLXN0YXRpYyBpbnQJc3RsaV9yYXdjbG9zZShzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IHdhaXQpOwotc3RhdGljIGludAlzdGxpX3dhaXRjYXJyaWVyKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkCXN0bGlfZG9oYW5ndXAodm9pZCAqYXJnKTsKLXN0YXRpYyBpbnQJc3RsaV9zZXRwb3J0KHN0bGlwb3J0X3QgKnBvcnRwKTsKLXN0YXRpYyBpbnQJc3RsaV9jbWR3YWl0KHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spOwotc3RhdGljIHZvaWQJc3RsaV9zZW5kY21kKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spOwotc3RhdGljIHZvaWQJX19zdGxpX3NlbmRjbWQoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmFyZywgaW50IHNpemUsIGludCBjb3B5YmFjayk7Ci1zdGF0aWMgdm9pZAlzdGxpX2RvZGVsYXljbWQoc3RsaXBvcnRfdCAqcG9ydHAsIGNka2N0cmxfdCBfX2lvbWVtICpjcCk7Ci1zdGF0aWMgdm9pZAlzdGxpX21rYXN5cG9ydChzdGxpcG9ydF90ICpwb3J0cCwgYXN5cG9ydF90ICpwcCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKTsKK3N0YXRpYyBpbnQJc3RsaV9ob3N0Y21kKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9pbml0b3BlbihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bGlfcmF3b3BlbihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KTsKK3N0YXRpYyBpbnQJc3RsaV9yYXdjbG9zZShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KTsKK3N0YXRpYyBpbnQJc3RsaV93YWl0Y2FycmllcihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQJc3RsaV9kb2hhbmd1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgaW50CXN0bGlfc2V0cG9ydChzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9jbWR3YWl0KHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKTsKK3N0YXRpYyB2b2lkCXN0bGlfc2VuZGNtZChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmFyZywgaW50IHNpemUsIGludCBjb3B5YmFjayk7CitzdGF0aWMgdm9pZAlfX3N0bGlfc2VuZGNtZChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmFyZywgaW50IHNpemUsIGludCBjb3B5YmFjayk7CitzdGF0aWMgdm9pZAlzdGxpX2RvZGVsYXljbWQoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgY2RrY3RybF90IF9faW9tZW0gKmNwKTsKK3N0YXRpYyB2b2lkCXN0bGlfbWthc3lwb3J0KHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIGFzeXBvcnRfdCAqcHAsIHN0cnVjdCBrdGVybWlvcyAqdGlvc3ApOwogc3RhdGljIHZvaWQJc3RsaV9ta2FzeXNpZ3MoYXN5c2lnc190ICpzcCwgaW50IGR0ciwgaW50IHJ0cyk7CiBzdGF0aWMgbG9uZwlzdGxpX21rdGlvY20odW5zaWduZWQgbG9uZyBzaWd2YWx1ZSk7Ci1zdGF0aWMgdm9pZAlzdGxpX3JlYWQoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCk7Ci1zdGF0aWMgaW50CXN0bGlfZ2V0c2VyaWFsKHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKLXN0YXRpYyBpbnQJc3RsaV9zZXRzZXJpYWwoc3RsaXBvcnRfdCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApOworc3RhdGljIHZvaWQJc3RsaV9yZWFkKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRzZXJpYWwoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCk7CitzdGF0aWMgaW50CXN0bGlfc2V0c2VyaWFsKHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApOwogc3RhdGljIGludAlzdGxpX2dldGJyZHN0YXRzKGNvbWJyZF90IF9fdXNlciAqYnApOwotc3RhdGljIGludAlzdGxpX2dldHBvcnRzdGF0cyhzdGxpcG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKLXN0YXRpYyBpbnQJc3RsaV9wb3J0Y21kc3RhdHMoc3RsaXBvcnRfdCAqcG9ydHApOwotc3RhdGljIGludAlzdGxpX2NscnBvcnRzdGF0cyhzdGxpcG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKLXN0YXRpYyBpbnQJc3RsaV9nZXRwb3J0c3RydWN0KHN0bGlwb3J0X3QgX191c2VyICphcmcpOwotc3RhdGljIGludAlzdGxpX2dldGJyZHN0cnVjdChzdGxpYnJkX3QgX191c2VyICphcmcpOwotc3RhdGljIHN0bGlicmRfdCAqc3RsaV9hbGxvY2JyZCh2b2lkKTsKK3N0YXRpYyBpbnQJc3RsaV9nZXRwb3J0c3RhdHMoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKK3N0YXRpYyBpbnQJc3RsaV9wb3J0Y21kc3RhdHMoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bGlfY2xycG9ydHN0YXRzKHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bGlfZ2V0cG9ydHN0cnVjdChzdHJ1Y3Qgc3RsaXBvcnQgX191c2VyICphcmcpOworc3RhdGljIGludAlzdGxpX2dldGJyZHN0cnVjdChzdHJ1Y3Qgc3RsaWJyZCBfX3VzZXIgKmFyZyk7CitzdGF0aWMgc3RydWN0IHN0bGlicmQgKnN0bGlfYWxsb2NicmQodm9pZCk7CiAKLXN0YXRpYyB2b2lkCXN0bGlfZWNwaW5pdChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQJc3RsaV9lY3BlbmFibGUoc3RsaWJyZF90ICpicmRwKTsKLXN0YXRpYyB2b2lkCXN0bGlfZWNwZGlzYWJsZShzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9lY3BnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOwotc3RhdGljIHZvaWQJc3RsaV9lY3ByZXNldChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQJc3RsaV9lY3BpbnRyKHN0bGlicmRfdCAqYnJkcCk7Ci1zdGF0aWMgdm9pZAlzdGxpX2VjcGVpaW5pdChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQJc3RsaV9lY3BlaWVuYWJsZShzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQJc3RsaV9lY3BlaWRpc2FibGUoc3RsaWJyZF90ICpicmRwKTsKLXN0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfZWNwZWlnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOwotc3RhdGljIHZvaWQJc3RsaV9lY3BlaXJlc2V0KHN0bGlicmRfdCAqYnJkcCk7Ci1zdGF0aWMgdm9pZAlzdGxpX2VjcG1jZW5hYmxlKHN0bGlicmRfdCAqYnJkcCk7Ci1zdGF0aWMgdm9pZAlzdGxpX2VjcG1jZGlzYWJsZShzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9lY3BtY2dldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7Ci1zdGF0aWMgdm9pZAlzdGxpX2VjcG1jcmVzZXQoc3RsaWJyZF90ICpicmRwKTsKLXN0YXRpYyB2b2lkCXN0bGlfZWNwcGNpaW5pdChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9lY3BwY2lnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOwotc3RhdGljIHZvaWQJc3RsaV9lY3BwY2lyZXNldChzdGxpYnJkX3QgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3Bpbml0KHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZW5hYmxlKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZGlzYWJsZShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzdGxpX2VjcGdldG1lbXB0cihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwcmVzZXQoc3RydWN0IHN0bGlicmQgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BpbnRyKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZWlpbml0KHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZWllbmFibGUoc3RydWN0IHN0bGlicmQgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BlaWRpc2FibGUoc3RydWN0IHN0bGlicmQgKmJyZHApOworc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9lY3BlaWdldG1lbXB0cihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwZWlyZXNldChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcG1jZW5hYmxlKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfZWNwbWNkaXNhYmxlKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfZWNwbWNnZXRtZW1wdHIoc3RydWN0IHN0bGlicmQgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CitzdGF0aWMgdm9pZAlzdGxpX2VjcG1jcmVzZXQoc3RydWN0IHN0bGlicmQgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9lY3BwY2lpbml0KHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfZWNwcGNpZ2V0bWVtcHRyKHN0cnVjdCBzdGxpYnJkICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9lY3BwY2lyZXNldChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CiAKLXN0YXRpYyB2b2lkCXN0bGlfb25iaW5pdChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQJc3RsaV9vbmJlbmFibGUoc3RsaWJyZF90ICpicmRwKTsKLXN0YXRpYyB2b2lkCXN0bGlfb25iZGlzYWJsZShzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9vbmJnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOwotc3RhdGljIHZvaWQJc3RsaV9vbmJyZXNldChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQJc3RsaV9vbmJlaW5pdChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQJc3RsaV9vbmJlZW5hYmxlKHN0bGlicmRfdCAqYnJkcCk7Ci1zdGF0aWMgdm9pZAlzdGxpX29uYmVkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCk7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICpzdGxpX29uYmVnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOwotc3RhdGljIHZvaWQJc3RsaV9vbmJlcmVzZXQoc3RsaWJyZF90ICpicmRwKTsKLXN0YXRpYyB2b2lkCXN0bGlfYmJ5aW5pdChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9iYnlnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOwotc3RhdGljIHZvaWQJc3RsaV9iYnlyZXNldChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQJc3RsaV9zdGFsaW5pdChzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9zdGFsZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKLXN0YXRpYyB2b2lkCXN0bGlfc3RhbHJlc2V0KHN0bGlicmRfdCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmluaXQoc3RydWN0IHN0bGlicmQgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9vbmJlbmFibGUoc3RydWN0IHN0bGlicmQgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9vbmJkaXNhYmxlKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfb25iZ2V0bWVtcHRyKHN0cnVjdCBzdGxpYnJkICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpOworc3RhdGljIHZvaWQJc3RsaV9vbmJyZXNldChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmVpbml0KHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZWVuYWJsZShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CitzdGF0aWMgdm9pZAlzdGxpX29uYmVkaXNhYmxlKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfb25iZWdldG1lbXB0cihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfb25iZXJlc2V0KHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyB2b2lkCXN0bGlfYmJ5aW5pdChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzdGxpX2JieWdldG1lbXB0cihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKTsKK3N0YXRpYyB2b2lkCXN0bGlfYmJ5cmVzZXQoc3RydWN0IHN0bGlicmQgKmJyZHApOworc3RhdGljIHZvaWQJc3RsaV9zdGFsaW5pdChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzdGxpX3N0YWxnZXRtZW1wdHIoc3RydWN0IHN0bGlicmQgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CitzdGF0aWMgdm9pZAlzdGxpX3N0YWxyZXNldChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CiAKLXN0YXRpYyBzdGxpcG9ydF90ICpzdGxpX2dldHBvcnQoaW50IGJyZG5yLCBpbnQgcGFuZWxuciwgaW50IHBvcnRucik7CitzdGF0aWMgc3RydWN0IHN0bGlwb3J0ICpzdGxpX2dldHBvcnQodW5zaWduZWQgaW50IGJyZG5yLCB1bnNpZ25lZCBpbnQgcGFuZWxuciwgdW5zaWduZWQgaW50IHBvcnRucik7CiAKLXN0YXRpYyBpbnQJc3RsaV9pbml0ZWNwKHN0bGlicmRfdCAqYnJkcCk7Ci1zdGF0aWMgaW50CXN0bGlfaW5pdG9uYihzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIGludAlzdGxpX2Vpc2FtZW1wcm9iZShzdGxpYnJkX3QgKmJyZHApOwotc3RhdGljIGludAlzdGxpX2luaXRwb3J0cyhzdGxpYnJkX3QgKmJyZHApOwotCi0jaWZkZWYJQ09ORklHX1BDSQotc3RhdGljIGludAlzdGxpX2luaXRwY2licmQoaW50IGJyZHR5cGUsIHN0cnVjdCBwY2lfZGV2ICpkZXZwKTsKK3N0YXRpYyBpbnQJc3RsaV9pbml0ZWNwKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsaV9pbml0b25iKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKKyNpZiBTVExJX0VJU0FQUk9CRSAhPSAwCitzdGF0aWMgaW50CXN0bGlfZWlzYW1lbXByb2JlKHN0cnVjdCBzdGxpYnJkICpicmRwKTsKICNlbmRpZgorc3RhdGljIGludAlzdGxpX2luaXRwb3J0cyhzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNzY2LDE1NCArNzI4LDM3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKmlzdGFsbGlvbl9jbGFzczsKIAotLyoKLSAqCUxvYWRhYmxlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBzdHVmZi4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBpc3RhbGxpb25fbW9kdWxlX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIHN0bGlfY2xlYW51cF9wb3J0cyhzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsKLQlzdGxpX2luaXQoKTsKLQlyZXR1cm4gMDsKLX0KKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwOworCXVuc2lnbmVkIGludCBqOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpc3RhbGxpb25fbW9kdWxlX2V4aXQodm9pZCkKLXsKLQlzdGxpYnJkX3QJKmJyZHA7Ci0Jc3RsaXBvcnRfdAkqcG9ydHA7Ci0JaW50CQlpLCBqOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiVW5sb2FkaW5nICVzOiB2ZXJzaW9uICVzXG4iLCBzdGxpX2RydnRpdGxlLAotCQlzdGxpX2RydnZlcnNpb24pOwotCi0JLyoKLQkgKglGcmVlIHVwIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIHBvcnRzLiBUaGlzIGluY2x1ZGVzCi0JICoJbWVtb3J5IGFuZCBpbnRlcnJ1cHRzLgotCSAqLwotCWlmIChzdGxpX3RpbWVyb24pIHsKLQkJc3RsaV90aW1lcm9uID0gMDsKLQkJZGVsX3RpbWVyX3N5bmMoJnN0bGlfdGltZXJsaXN0KTsKLQl9Ci0KLQlpID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHN0bGlfc2VyaWFsKTsKLQlpZiAoaSkgewotCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgdHR5IGRyaXZlciwgIgotCQkJImVycm5vPSVkXG4iLCAtaSk7Ci0JCXJldHVybjsKLQl9Ci0JcHV0X3R0eV9kcml2ZXIoc3RsaV9zZXJpYWwpOwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCWNsYXNzX2RldmljZV9kZXN0cm95KGlzdGFsbGlvbl9jbGFzcywgTUtERVYoU1RMX1NJT01FTU1BSk9SLCBpKSk7Ci0JY2xhc3NfZGVzdHJveShpc3RhbGxpb25fY2xhc3MpOwotCWlmICgoaSA9IHVucmVnaXN0ZXJfY2hyZGV2KFNUTF9TSU9NRU1NQUpPUiwgInN0YWxpb21lbSIpKSkKLQkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHVuLXJlZ2lzdGVyIHNlcmlhbCBtZW1vcnkgZGV2aWNlLCAiCi0JCQkiZXJybm89JWRcbiIsIC1pKTsKLQotCWtmcmVlKHN0bGlfdHhjb29rYnVmKTsKLQotCWZvciAoaSA9IDA7IChpIDwgc3RsaV9ucmJyZHMpOyBpKyspIHsKLQkJaWYgKChicmRwID0gc3RsaV9icmRzW2ldKSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWZvciAoaiA9IDA7IChqIDwgU1RMX01BWFBPUlRTKTsgaisrKSB7Ci0JCQlwb3J0cCA9IGJyZHAtPnBvcnRzW2pdOwotCQkJaWYgKHBvcnRwICE9IE5VTEwpIHsKLQkJCQlpZiAocG9ydHAtPnR0eSAhPSBOVUxMKQotCQkJCQl0dHlfaGFuZ3VwKHBvcnRwLT50dHkpOwotCQkJCWtmcmVlKHBvcnRwKTsKLQkJCX0KKwlmb3IgKGogPSAwOyBqIDwgU1RMX01BWFBPUlRTOyBqKyspIHsKKwkJcG9ydHAgPSBicmRwLT5wb3J0c1tqXTsKKwkJaWYgKHBvcnRwICE9IE5VTEwpIHsKKwkJCWlmIChwb3J0cC0+dHR5ICE9IE5VTEwpCisJCQkJdHR5X2hhbmd1cChwb3J0cC0+dHR5KTsKKwkJCWtmcmVlKHBvcnRwKTsKIAkJfQotCi0JCWlvdW5tYXAoYnJkcC0+bWVtYmFzZSk7Ci0JCWlmIChicmRwLT5pb3NpemUgPiAwKQotCQkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOwotCQlrZnJlZShicmRwKTsKLQkJc3RsaV9icmRzW2ldID0gTlVMTDsKIAl9CiB9CiAKLW1vZHVsZV9pbml0KGlzdGFsbGlvbl9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChpc3RhbGxpb25fbW9kdWxlX2V4aXQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKglDaGVjayBmb3IgYW55IGFyZ3VtZW50cyBwYXNzZWQgaW4gb24gdGhlIG1vZHVsZSBsb2FkIGNvbW1hbmQgbGluZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBzdGxpX2FyZ2JyZHModm9pZCkKLXsKLQlzdGxjb25mX3QgY29uZjsKLQlzdGxpYnJkX3QgKmJyZHA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSBzdGxpX25yYnJkczsgaSA8IEFSUkFZX1NJWkUoc3RsaV9icmRzcCk7IGkrKykgewotCQltZW1zZXQoJmNvbmYsIDAsIHNpemVvZihjb25mKSk7Ci0JCWlmIChzdGxpX3BhcnNlYnJkKCZjb25mLCBzdGxpX2JyZHNwW2ldKSA9PSAwKQotCQkJY29udGludWU7Ci0JCWlmICgoYnJkcCA9IHN0bGlfYWxsb2NicmQoKSkgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlzdGxpX25yYnJkcyA9IGkgKyAxOwotCQlicmRwLT5icmRuciA9IGk7Ci0JCWJyZHAtPmJyZHR5cGUgPSBjb25mLmJyZHR5cGU7Ci0JCWJyZHAtPmlvYmFzZSA9IGNvbmYuaW9hZGRyMTsKLQkJYnJkcC0+bWVtYWRkciA9IGNvbmYubWVtYWRkcjsKLQkJc3RsaV9icmRpbml0KGJyZHApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICoJQ29udmVydCBhbiBhc2NpaSBzdHJpbmcgbnVtYmVyIGludG8gYW4gdW5zaWduZWQgbG9uZy4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzdGxpX2F0b2woY2hhciAqc3RyKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBiYXNlLCBjOwotCWNoYXIgKnNwOwotCi0JdmFsID0gMDsKLQlzcCA9IHN0cjsKLQlpZiAoKCpzcCA9PSAnMCcpICYmICgqKHNwKzEpID09ICd4JykpIHsKLQkJYmFzZSA9IDE2OwotCQlzcCArPSAyOwotCX0gZWxzZSBpZiAoKnNwID09ICcwJykgewotCQliYXNlID0gODsKLQkJc3ArKzsKLQl9IGVsc2UgewotCQliYXNlID0gMTA7Ci0JfQotCi0JZm9yICg7ICgqc3AgIT0gMCk7IHNwKyspIHsKLQkJYyA9ICgqc3AgPiAnOScpID8gKFRPTE9XRVIoKnNwKSAtICdhJyArIDEwKSA6ICgqc3AgLSAnMCcpOwotCQlpZiAoKGMgPCAwKSB8fCAoYyA+PSBiYXNlKSkgewotCQkJcHJpbnRrKCJTVEFMTElPTjogaW52YWxpZCBhcmd1bWVudCAlc1xuIiwgc3RyKTsKLQkJCXZhbCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQl2YWwgPSAodmFsICogYmFzZSkgKyBjOwotCX0KLQlyZXR1cm4odmFsKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgogICoJUGFyc2UgdGhlIHN1cHBsaWVkIGFyZ3VtZW50IHN0cmluZywgaW50byB0aGUgYm9hcmQgY29uZiBzdHJ1Y3QuCiAgKi8KIAotc3RhdGljIGludCBzdGxpX3BhcnNlYnJkKHN0bGNvbmZfdCAqY29uZnAsIGNoYXIgKiphcmdwKQorc3RhdGljIGludCBzdGxpX3BhcnNlYnJkKHN0cnVjdCBzdGxjb25mICpjb25mcCwgY2hhciAqKmFyZ3ApCiB7CisJdW5zaWduZWQgaW50IGk7CiAJY2hhciAqc3A7Ci0JaW50IGk7CiAKIAlpZiAoYXJncFswXSA9PSBOVUxMIHx8ICphcmdwWzBdID09IDApCiAJCXJldHVybiAwOwogCiAJZm9yIChzcCA9IGFyZ3BbMF0sIGkgPSAwOyAoKCpzcCAhPSAwKSAmJiAoaSA8IDI1KSk7IHNwKyssIGkrKykKLQkJKnNwID0gVE9MT1dFUigqc3ApOworCQkqc3AgPSB0b2xvd2VyKCpzcCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGxpX2JyZHN0cik7IGkrKykgewogCQlpZiAoc3RyY21wKHN0bGlfYnJkc3RyW2ldLm5hbWUsIGFyZ3BbMF0pID09IDApCkBAIC05MjYsOSArNzcxLDkgQEAKIAogCWNvbmZwLT5icmR0eXBlID0gc3RsaV9icmRzdHJbaV0udHlwZTsKIAlpZiAoYXJncFsxXSAhPSBOVUxMICYmICphcmdwWzFdICE9IDApCi0JCWNvbmZwLT5pb2FkZHIxID0gc3RsaV9hdG9sKGFyZ3BbMV0pOworCQljb25mcC0+aW9hZGRyMSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3BbMV0sIE5VTEwsIDApOwogCWlmIChhcmdwWzJdICE9ICBOVUxMICYmICphcmdwWzJdICE9IDApCi0JCWNvbmZwLT5tZW1hZGRyID0gc3RsaV9hdG9sKGFyZ3BbMl0pOworCQljb25mcC0+bWVtYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3BbMl0sIE5VTEwsIDApOwogCXJldHVybigxKTsKIH0KIApAQCAtOTM2LDEwICs3ODEsMTAgQEAKIAogc3RhdGljIGludCBzdGxpX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RsaWJyZF90ICpicmRwOwotCXN0bGlwb3J0X3QgKnBvcnRwOwotCXVuc2lnbmVkIGludCBtaW5vcmRldjsKLQlpbnQgYnJkbnIsIHBvcnRuciwgcmM7CisJc3RydWN0IHN0bGlicmQgKmJyZHA7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKKwl1bnNpZ25lZCBpbnQgbWlub3JkZXYsIGJyZG5yLCBwb3J0bnI7CisJaW50IHJjOwogCiAJbWlub3JkZXYgPSB0dHktPmluZGV4OwogCWJyZG5yID0gTUlOT1IyQlJEKG1pbm9yZGV2KTsKQEAgLTk1MSw3ICs3OTYsNyBAQAogCWlmICgoYnJkcC0+c3RhdGUgJiBCU1RfU1RBUlRFRCkgPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcG9ydG5yID0gTUlOT1IyUE9SVChtaW5vcmRldik7Ci0JaWYgKChwb3J0bnIgPCAwKSB8fCAocG9ydG5yID4gYnJkcC0+bnJwb3J0cykpCisJaWYgKHBvcnRuciA+IGJyZHAtPm5ycG9ydHMpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcG9ydHAgPSBicmRwLT5wb3J0c1twb3J0bnJdOwpAQCAtMTAzMSw4ICs4NzYsOCBAQAogCiBzdGF0aWMgdm9pZCBzdGxpX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0bGlicmRfdCAqYnJkcDsKLQlzdGxpcG9ydF90ICpwb3J0cDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CkBAIC0xMTA5LDcgKzk1NCw3IEBACiAgKgl0aGlzIHN0aWxsIGFsbCBoYXBwZW5zIHByZXR0eSBxdWlja2x5LgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9pbml0b3BlbihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwKQorc3RhdGljIGludCBzdGxpX2luaXRvcGVuKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJYXN5bm90aWZ5X3QgbnQ7CkBAIC0xMTU3LDcgKzEwMDIsNyBAQAogICoJdG8gb3ZlcmxhcC4KICAqLwogCi1zdGF0aWMgaW50IHN0bGlfcmF3b3BlbihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IHdhaXQpCitzdGF0aWMgaW50IHN0bGlfcmF3b3BlbihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KQogewogCWNka2hkcl90IF9faW9tZW0gKmhkcnA7CiAJY2RrY3RybF90IF9faW9tZW0gKmNwOwpAQCAtMTIyOCw3ICsxMDczLDcgQEAKICAqCXdhaXQgaXMgdHJ1ZSB0aGVuIG11c3QgaGF2ZSB1c2VyIGNvbnRleHQgKHRvIHNsZWVwKS4KICAqLwogCi1zdGF0aWMgaW50IHN0bGlfcmF3Y2xvc2Uoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KQorc3RhdGljIGludCBzdGxpX3Jhd2Nsb3NlKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IHdhaXQpCiB7CiAJY2RraGRyX3QgX19pb21lbSAqaGRycDsKIAljZGtjdHJsX3QgX19pb21lbSAqY3A7CkBAIC0xMjkyLDcgKzExMzcsNyBAQAogICoJdG8gY29tcGxldGUgKGFzIG9wcG9zZWQgdG8gaW5pdGlhdGluZyB0aGUgY29tbWFuZCB0aGVuIHJldHVybmluZykuCiAgKi8KIAotc3RhdGljIGludCBzdGxpX2NtZHdhaXQoc3RsaWJyZF90ICpicmRwLCBzdGxpcG9ydF90ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmFyZywgaW50IHNpemUsIGludCBjb3B5YmFjaykKK3N0YXRpYyBpbnQgc3RsaV9jbWR3YWl0KHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKQogewogCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwb3J0cC0+cmF3X3dhaXQsCiAJCQkhdGVzdF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKSk7CkBAIC0xMzE4LDE2ICsxMTYzLDE2IEBACiAgKgl3YWl0aW5nIGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAtIHNvIG11c3QgaGF2ZSB1c2VyIGNvbnRleHQuCiAgKi8KIAotc3RhdGljIGludCBzdGxpX3NldHBvcnQoc3RsaXBvcnRfdCAqcG9ydHApCitzdGF0aWMgaW50IHN0bGlfc2V0cG9ydChzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKQogewotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAlhc3lwb3J0X3QgYXBvcnQ7CiAKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHBvcnRwLT50dHkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHBvcnRwLT5icmRuciA8IDAgJiYgcG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQorCWlmIChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCiAJCXJldHVybiAtRU5PREVWOwogCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKIAlpZiAoYnJkcCA9PSBOVUxMKQpAQCAtMTM0NCw3ICsxMTg5LDcgQEAKICAqCW1heWJlIGJlY2F1c2UgaWYgd2UgYXJlIGNsb2NhbCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gd2FpdC4uLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV93YWl0Y2FycmllcihzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgc3RsaV93YWl0Y2FycmllcihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmMsIGRvY2xvY2FsOwpAQCAtMTQwOSw4ICsxMjU0LDggQEAKIAl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmJpdHM7CiAJdW5zaWduZWQgY2hhciBfX2lvbWVtICpzaGJ1ZjsKIAl1bnNpZ25lZCBjaGFyICpjaGJ1ZjsKLQlzdGxpcG9ydF90ICpwb3J0cDsKLQlzdGxpYnJkX3QgKmJyZHA7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAl1bnNpZ25lZCBpbnQgbGVuLCBzdGxlbiwgaGVhZCwgdGFpbCwgc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xNDE5LDcgKzEyNjQsNyBAQAogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JaWYgKChwb3J0cC0+YnJkbnIgPCAwKSB8fCAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKSkKKwlpZiAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQogCQlyZXR1cm4gMDsKIAlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CiAJaWYgKGJyZHAgPT0gTlVMTCkKQEAgLTE0NDUsMTIgKzEyOTAsMTIgQEAKIAkJc3RsZW4gPSBsZW47CiAJfQogCi0JbGVuID0gTUlOKGxlbiwgY291bnQpOworCWxlbiA9IG1pbihsZW4sICh1bnNpZ25lZCBpbnQpY291bnQpOwogCWNvdW50ID0gMDsKIAlzaGJ1ZiA9IChjaGFyIF9faW9tZW0gKikgRUJSREdFVE1FTVBUUihicmRwLCBwb3J0cC0+dHhvZmZzZXQpOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKLQkJc3RsZW4gPSBNSU4obGVuLCBzdGxlbik7CisJCXN0bGVuID0gbWluKGxlbiwgc3RsZW4pOwogCQltZW1jcHlfdG9pbyhzaGJ1ZiArIGhlYWQsIGNoYnVmLCBzdGxlbik7CiAJCWNoYnVmICs9IHN0bGVuOwogCQlsZW4gLT0gc3RsZW47CkBAIC0xNTE2LDggKzEzNjEsOCBAQAogCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqYml0czsKIAljZGthc3lfdCBfX2lvbWVtICphcDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqY29va3R0eTsKLQlzdGxpcG9ydF90ICpwb3J0cDsKLQlzdGxpYnJkX3QgKmJyZHA7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAl1bnNpZ25lZCBpbnQgbGVuLCBzdGxlbiwgaGVhZCwgdGFpbCwgc2l6ZSwgY291bnQsIGNvb2tzaXplOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKnNoYnVmOwpAQCAtMTU0MSw3ICsxMzg2LDcgQEAKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAoKHBvcnRwLT5icmRuciA8IDApIHx8IChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpKQorCWlmIChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCiAJCXJldHVybjsKIAlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CiAJaWYgKGJyZHAgPT0gTlVMTCkKQEAgLTE1NjQsMTMgKzE0MDksMTMgQEAKIAkJc3RsZW4gPSBsZW47CiAJfQogCi0JbGVuID0gTUlOKGxlbiwgY29va3NpemUpOworCWxlbiA9IG1pbihsZW4sIGNvb2tzaXplKTsKIAljb3VudCA9IDA7CiAJc2hidWYgPSBFQlJER0VUTUVNUFRSKGJyZHAsIHBvcnRwLT50eG9mZnNldCk7CiAJYnVmID0gc3RsaV90eGNvb2tidWY7CiAKIAl3aGlsZSAobGVuID4gMCkgewotCQlzdGxlbiA9IE1JTihsZW4sIHN0bGVuKTsKKwkJc3RsZW4gPSBtaW4obGVuLCBzdGxlbik7CiAJCW1lbWNweV90b2lvKHNoYnVmICsgaGVhZCwgYnVmLCBzdGxlbik7CiAJCWJ1ZiArPSBzdGxlbjsKIAkJbGVuIC09IHN0bGVuOwpAQCAtMTYwNCw4ICsxNDQ5LDggQEAKIHN0YXRpYyBpbnQgc3RsaV93cml0ZXJvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAljZGthc3lycV90IF9faW9tZW0gKnJwOwotCXN0bGlwb3J0X3QgKnBvcnRwOwotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwOworCXN0cnVjdCBzdGxpYnJkICpicmRwOwogCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsLCBsZW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTYxOSw3ICsxNDY0LDcgQEAKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAwOwotCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJaWYgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykKIAkJcmV0dXJuIDA7CiAJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOwogCWlmIChicmRwID09IE5VTEwpCkBAIC0xNjU3LDggKzE1MDIsOCBAQAogc3RhdGljIGludCBzdGxpX2NoYXJzaW5idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAljZGthc3lycV90IF9faW9tZW0gKnJwOwotCXN0bGlwb3J0X3QgKnBvcnRwOwotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwOworCXN0cnVjdCBzdGxpYnJkICpicmRwOwogCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsLCBsZW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTY2Nyw3ICsxNTEyLDcgQEAKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAwOwotCWlmICgocG9ydHAtPmJyZG5yIDwgMCkgfHwgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykpCisJaWYgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykKIAkJcmV0dXJuIDA7CiAJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOwogCWlmIChicmRwID09IE5VTEwpCkBAIC0xNjk1LDEwICsxNTQwLDEwIEBACiAgKglHZW5lcmF0ZSB0aGUgc2VyaWFsIHN0cnVjdCBpbmZvLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9nZXRzZXJpYWwoc3RsaXBvcnRfdCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApCitzdGF0aWMgaW50IHN0bGlfZ2V0c2VyaWFsKHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApCiB7CiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2lvOwotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAogCW1lbXNldCgmc2lvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKTsKIAlzaW8udHlwZSA9IFBPUlRfVU5LTk9XTjsKQEAgLTE3MjgsNyArMTU3Myw3IEBACiAgKglqdXN0IHF1aWV0bHkgaWdub3JlIGFueSByZXF1ZXN0cyB0byBjaGFuZ2UgaXJxLCBldGMuCiAgKi8KIAotc3RhdGljIGludCBzdGxpX3NldHNlcmlhbChzdGxpcG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3N0YXRpYyBpbnQgc3RsaV9zZXRzZXJpYWwoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKIHsKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzaW87CiAJaW50IHJjOwpAQCAtMTc1OSwxMyArMTYwNCwxMyBAQAogCiBzdGF0aWMgaW50IHN0bGlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RsaXBvcnRfdCAqcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAlpbnQgcmM7CiAKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHBvcnRwLT5icmRuciA8IDAgfHwgcG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQorCWlmIChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCiAJCXJldHVybiAwOwogCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKIAlpZiAoYnJkcCA9PSBOVUxMKQpAQCAtMTc4MywxMyArMTYyOCwxMyBAQAogc3RhdGljIGludCBzdGxpX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKIHsKLQlzdGxpcG9ydF90ICpwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0Jc3RsaWJyZF90ICpicmRwOworCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBzdGxpYnJkICpicmRwOwogCWludCBydHMgPSAtMSwgZHRyID0gLTE7CiAKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHBvcnRwLT5icmRuciA8IDAgfHwgcG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQorCWlmIChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCiAJCXJldHVybiAwOwogCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKIAlpZiAoYnJkcCA9PSBOVUxMKQpAQCAtMTgxNCw4ICsxNjU5LDggQEAKIAogc3RhdGljIGludCBzdGxpX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdGxpcG9ydF90ICpwb3J0cDsKLQlzdGxpYnJkX3QgKmJyZHA7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAl1bnNpZ25lZCBpbnQgaXZhbDsKIAlpbnQgcmM7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CkBAIC0xODIzLDcgKzE2NjgsNyBAQAogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHBvcnRwLT5icmRuciA8IDAgfHwgcG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQorCWlmIChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCiAJCXJldHVybiAwOwogCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKIAlpZiAoYnJkcCA9PSBOVUxMKQpAQCAtMTg4OSwxMSArMTczNCwxMSBAQAogICoJTG9va3MgbGlrZSBpdCBpcyB0cnVlIGZvciB0aGUgY3VycmVudCB0dHlzIGltcGxlbWVudGF0aW9uLi4hIQogICovCiAKLXN0YXRpYyB2b2lkIHN0bGlfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorc3RhdGljIHZvaWQgc3RsaV9zZXR0ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewotCXN0bGlwb3J0X3QgKnBvcnRwOwotCXN0bGlicmRfdCAqYnJkcDsKLQlzdHJ1Y3QgdGVybWlvcyAqdGlvc3A7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRpb3NwOwogCWFzeXBvcnRfdCBhcG9ydDsKIAogCWlmICh0dHkgPT0gTlVMTCkKQEAgLTE5MDEsNyArMTc0Niw3IEBACiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwogCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47Ci0JaWYgKHBvcnRwLT5icmRuciA8IDAgfHwgcG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQorCWlmIChwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCiAJCXJldHVybjsKIAlicmRwID0gc3RsaV9icmRzW3BvcnRwLT5icmRucl07CiAJaWYgKGJyZHAgPT0gTlVMTCkKQEAgLTE5MzcsNyArMTc4Miw3IEBACiAKIHN0YXRpYyB2b2lkIHN0bGlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdGxpcG9ydF90CSpwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHN0bGlwb3J0CSpwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKIAlzZXRfYml0KFNUX1JYU1RPUCwgJnBvcnRwLT5zdGF0ZSk7CkBAIC0xOTUzLDcgKzE3OTgsNyBAQAogCiBzdGF0aWMgdm9pZCBzdGxpX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdGxpcG9ydF90CSpwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHN0bGlwb3J0CSpwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKIAljbGVhcl9iaXQoU1RfUlhTVE9QLCAmcG9ydHAtPnN0YXRlKTsKQEAgLTE5OTAsOSArMTgzNSw5IEBACiAgKglhcmVuJ3QgdGhhdCB0aW1lIGNyaXRpY2FsKS4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxpX2RvaGFuZ3VwKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIHN0bGlfZG9oYW5ndXAoc3RydWN0IHdvcmtfc3RydWN0ICp1Z2x5X2FwaSkKIHsKLQlzdGxpcG9ydF90ICpwb3J0cCA9IChzdGxpcG9ydF90ICopIGFyZzsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gY29udGFpbmVyX29mKHVnbHlfYXBpLCBzdHJ1Y3Qgc3RsaXBvcnQsIHRxaGFuZ3VwKTsKIAlpZiAocG9ydHAtPnR0eSAhPSBOVUxMKSB7CiAJCXR0eV9oYW5ndXAocG9ydHAtPnR0eSk7CiAJfQpAQCAtMjAwOSwxNCArMTg1NCwxNCBAQAogCiBzdGF0aWMgdm9pZCBzdGxpX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0bGlwb3J0X3QgKnBvcnRwOwotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwOworCXN0cnVjdCBzdGxpYnJkICpicmRwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAocG9ydHAtPmJyZG5yIDwgMCB8fCBwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCisJaWYgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykKIAkJcmV0dXJuOwogCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKIAlpZiAoYnJkcCA9PSBOVUxMKQpAQCAtMjA2MiwxNCArMTkwNywxNCBAQAogCiBzdGF0aWMgdm9pZCBzdGxpX2ZsdXNoYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RsaXBvcnRfdCAqcG9ydHA7Ci0Jc3RsaWJyZF90ICpicmRwOworCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHA7CisJc3RydWN0IHN0bGlicmQgKmJyZHA7CiAJdW5zaWduZWQgbG9uZyBmdHlwZSwgZmxhZ3M7CiAKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAocG9ydHAtPmJyZG5yIDwgMCB8fCBwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCisJaWYgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykKIAkJcmV0dXJuOwogCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKIAlpZiAoYnJkcCA9PSBOVUxMKQpAQCAtMjA5OSwxNCArMTk0NCwxNCBAQAogCiBzdGF0aWMgdm9pZCBzdGxpX2JyZWFrY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBzdGF0ZSkKIHsKLQlzdGxpYnJkX3QJKmJyZHA7Ci0Jc3RsaXBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHN0bGlicmQJKmJyZHA7CisJc3RydWN0IHN0bGlwb3J0CSpwb3J0cDsKIAlsb25nCQlhcmc7CiAKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAocG9ydHAtPmJyZG5yIDwgMCB8fCBwb3J0cC0+YnJkbnIgPj0gc3RsaV9ucmJyZHMpCisJaWYgKHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykKIAkJcmV0dXJuOwogCWJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKIAlpZiAoYnJkcCA9PSBOVUxMKQpAQCAtMjEyMCw3ICsxOTY1LDcgQEAKIAogc3RhdGljIHZvaWQgc3RsaV93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQogewotCXN0bGlwb3J0X3QgKnBvcnRwOworCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHA7CiAJdW5zaWduZWQgbG9uZyB0ZW5kOwogCiAJaWYgKHR0eSA9PSBOVUxMKQpAQCAtMjE0NiwxNCArMTk5MSwxNCBAQAogCiBzdGF0aWMgdm9pZCBzdGxpX3NlbmR4Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKQogewotCXN0bGlicmRfdAkqYnJkcDsKLQlzdGxpcG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RsaWJyZAkqYnJkcDsKKwlzdHJ1Y3Qgc3RsaXBvcnQJKnBvcnRwOwogCWFzeWN0cmxfdAlhY3RybDsKIAogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwotCWlmIChwb3J0cC0+YnJkbnIgPCAwIHx8IHBvcnRwLT5icmRuciA+PSBzdGxpX25yYnJkcykKKwlpZiAocG9ydHAtPmJyZG5yID49IHN0bGlfbnJicmRzKQogCQlyZXR1cm47CiAJYnJkcCA9IHN0bGlfYnJkc1twb3J0cC0+YnJkbnJdOwogCWlmIChicmRwID09IE5VTEwpCkBAIC0yMTgxLDcgKzIwMjYsNyBAQAogICoJc2hvcnQgdGhlbiBwYWRkZWQgd2l0aCBzcGFjZXMpLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9wb3J0aW5mbyhzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCBpbnQgcG9ydG5yLCBjaGFyICpwb3MpCitzdGF0aWMgaW50IHN0bGlfcG9ydGluZm8oc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIGludCBwb3J0bnIsIGNoYXIgKnBvcykKIHsKIAljaGFyICpzcCwgKnVhcnQ7CiAJaW50IHJjLCBjbnQ7CkBAIC0yMjQ0LDkgKzIwODksOSBAQAogCiBzdGF0aWMgaW50IHN0bGlfcmVhZHByb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RsaWJyZF90ICpicmRwOwotCXN0bGlwb3J0X3QgKnBvcnRwOwotCWludCBicmRuciwgcG9ydG5yLCB0b3RhbHBvcnQ7CisJc3RydWN0IHN0bGlicmQgKmJyZHA7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKKwl1bnNpZ25lZCBpbnQgYnJkbnIsIHBvcnRuciwgdG90YWxwb3J0OwogCWludCBjdXJvZmYsIG1heG9mZjsKIAljaGFyICpwb3M7CiAKQEAgLTIzMTYsNyArMjE2MSw3IEBACiAgKgllbnRyeSBwb2ludCkKICAqLwogCi1zdGF0aWMgdm9pZCBfX3N0bGlfc2VuZGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKQorc3RhdGljIHZvaWQgX19zdGxpX3NlbmRjbWQoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spCiB7CiAJY2RraGRyX3QgX19pb21lbSAqaGRycDsKIAljZGtjdHJsX3QgX19pb21lbSAqY3A7CkBAIC0yMzUyLDcgKzIxOTcsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZF9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0bGlfc2VuZGNtZChzdGxpYnJkX3QgKmJyZHAsIHN0bGlwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKQorc3RhdGljIHZvaWQgc3RsaV9zZW5kY21kKHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKQogewogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCkBAIC0yMzcxLDcgKzIyMTYsNyBAQAogICoJbW9yZSBjaGFycyB0byB1bmxvYWQuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9yZWFkKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApCitzdGF0aWMgdm9pZCBzdGxpX3JlYWQoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHApCiB7CiAJY2RrYXN5cnFfdCBfX2lvbWVtICpycDsKIAljaGFyIF9faW9tZW0gKnNoYnVmOwpAQCAtMjQwNiw3ICsyMjUxLDcgQEAKIAl3aGlsZSAobGVuID4gMCkgewogCQl1bnNpZ25lZCBjaGFyICpjcHRyOwogCi0JCXN0bGVuID0gTUlOKGxlbiwgc3RsZW4pOworCQlzdGxlbiA9IG1pbihsZW4sIHN0bGVuKTsKIAkJdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcodHR5LCAmY3B0ciwgc3RsZW4pOwogCQltZW1jcHlfZnJvbWlvKGNwdHIsIHNoYnVmICsgdGFpbCwgc3RsZW4pOwogCQlsZW4gLT0gc3RsZW47CkBAIC0yNDMzLDcgKzIyNzgsNyBAQAogICoJZGlmZmljdWx0IHRvIGRlYWwgd2l0aCB0aGVtIGhlcmUuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9kb2RlbGF5Y21kKHN0bGlwb3J0X3QgKnBvcnRwLCBjZGtjdHJsX3QgX19pb21lbSAqY3ApCitzdGF0aWMgdm9pZCBzdGxpX2RvZGVsYXljbWQoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgY2RrY3RybF90IF9faW9tZW0gKmNwKQogewogCWludCBjbWQ7CiAKQEAgLTI0ODEsNyArMjMyNiw3IEBACiAgKgl0aGVuIHBvcnQgaXMgc3RpbGwgYnVzeSwgb3RoZXJ3aXNlIG5vIGxvbmdlciBidXN5LgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9ob3N0Y21kKHN0bGlicmRfdCAqYnJkcCwgc3RsaXBvcnRfdCAqcG9ydHApCitzdGF0aWMgaW50IHN0bGlfaG9zdGNtZChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCkKIHsKIAljZGthc3lfdCBfX2lvbWVtICphcDsKIAljZGtjdHJsX3QgX19pb21lbSAqY3A7CkBAIC0yNjI4LDkgKzI0NzMsOSBAQAogICoJYXQgdGhlIGNkayBoZWFkZXIgc3RydWN0dXJlLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bGlfYnJkcG9sbChzdGxpYnJkX3QgKmJyZHAsIGNka2hkcl90IF9faW9tZW0gKmhkcnApCitzdGF0aWMgdm9pZCBzdGxpX2JyZHBvbGwoc3RydWN0IHN0bGlicmQgKmJyZHAsIGNka2hkcl90IF9faW9tZW0gKmhkcnApCiB7Ci0Jc3RsaXBvcnRfdCAqcG9ydHA7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKIAl1bnNpZ25lZCBjaGFyIGhvc3RiaXRzWyhTVExfTUFYQ0hBTlMgLyA4KSArIDFdOwogCXVuc2lnbmVkIGNoYXIgc2xhdmViaXRzWyhTVExfTUFYQ0hBTlMgLyA4KSArIDFdOwogCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqc2xhdmVwOwpAQCAtMjY5NywxMSArMjU0MiwxMCBAQAogc3RhdGljIHZvaWQgc3RsaV9wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWNka2hkcl90IF9faW9tZW0gKmhkcnA7Ci0Jc3RsaWJyZF90ICpicmRwOwotCWludCBicmRucjsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKKwl1bnNpZ25lZCBpbnQgYnJkbnI7CiAKLQlzdGxpX3RpbWVybGlzdC5leHBpcmVzID0gU1RMSV9USU1FT1VUOwotCWFkZF90aW1lcigmc3RsaV90aW1lcmxpc3QpOworCW1vZF90aW1lcigmc3RsaV90aW1lcmxpc3QsIFNUTElfVElNRU9VVCk7CiAKIC8qCiAgKglDaGVjayBlYWNoIGJvYXJkIGFuZCBkbyBhbnkgc2VydmljaW5nIHJlcXVpcmVkLgpAQCAtMjczMCw3ICsyNTc0LDcgQEAKICAqCXRoZSBzbGF2ZS4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxpX21rYXN5cG9ydChzdGxpcG9ydF90ICpwb3J0cCwgYXN5cG9ydF90ICpwcCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKQorc3RhdGljIHZvaWQgc3RsaV9ta2FzeXBvcnQoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgYXN5cG9ydF90ICpwcCwgc3RydWN0IGt0ZXJtaW9zICp0aW9zcCkKIHsKIAltZW1zZXQocHAsIDAsIHNpemVvZihhc3lwb3J0X3QpKTsKIApAQCAtMjg3OSwxMyArMjcyMywxMyBAQAogICoJd2UgbmVlZCB0byBkbyBoZXJlIGlzIHNldCB1cCB0aGUgYXBwcm9wcmlhdGUgcGVyIHBvcnQgZGF0YSBzdHJ1Y3R1cmVzLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9pbml0cG9ydHMoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIGludCBzdGxpX2luaXRwb3J0cyhzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsKLQlzdGxpcG9ydF90CSpwb3J0cDsKLQlpbnQJCWksIHBhbmVsbnIsIHBhbmVscG9ydDsKKwlzdHJ1Y3Qgc3RsaXBvcnQJKnBvcnRwOworCXVuc2lnbmVkIGludCBpLCBwYW5lbG5yLCBwYW5lbHBvcnQ7CiAKIAlmb3IgKGkgPSAwLCBwYW5lbG5yID0gMCwgcGFuZWxwb3J0ID0gMDsgKGkgPCBicmRwLT5ucnBvcnRzKTsgaSsrKSB7Ci0JCXBvcnRwID0ga3phbGxvYyhzaXplb2Yoc3RsaXBvcnRfdCksIEdGUF9LRVJORUwpOworCQlwb3J0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGxpcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvcnRwKSB7CiAJCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgcG9ydCBzdHJ1Y3R1cmVcbiIpOwogCQkJY29udGludWU7CkBAIC0yODk4LDcgKzI3NDIsNyBAQAogCQlwb3J0cC0+YmF1ZF9iYXNlID0gU1RMX0JBVURCQVNFOwogCQlwb3J0cC0+Y2xvc2VfZGVsYXkgPSBTVExfQ0xPU0VERUxBWTsKIAkJcG9ydHAtPmNsb3Npbmdfd2FpdCA9IDMwICogSFo7Ci0JCUlOSVRfV09SSygmcG9ydHAtPnRxaGFuZ3VwLCBzdGxpX2RvaGFuZ3VwLCBwb3J0cCk7CisJCUlOSVRfV09SSygmcG9ydHAtPnRxaGFuZ3VwLCBzdGxpX2RvaGFuZ3VwKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPm9wZW5fd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnRwLT5jbG9zZV93YWl0KTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPnJhd193YWl0KTsKQEAgLTI5MTksNyArMjc2Myw3IEBACiAgKglBbGwgdGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgYm9hcmQgc3BlY2lmaWMgaGFyZHdhcmUgb3BlcmF0aW9ucy4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxpX2VjcGluaXQoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIHZvaWQgc3RsaV9lY3Bpbml0KHN0cnVjdCBzdGxpYnJkICpicmRwKQogewogCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKIApAQCAtMjkzNCwyMSArMjc3OCwyMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bGlfZWNwZW5hYmxlKHN0bGlicmRfdCAqYnJkcCkKK3N0YXRpYyB2b2lkIHN0bGlfZWNwZW5hYmxlKHN0cnVjdCBzdGxpYnJkICpicmRwKQogewkKIAlvdXRiKEVDUF9BVEVOQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsaV9lY3BkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3N0YXRpYyB2b2lkIHN0bGlfZWNwZGlzYWJsZShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsJCiAJb3V0YihFQ1BfQVRESVNBQkxFLCAoYnJkcC0+aW9iYXNlICsgRUNQX0FUQ09ORlIpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpzdGxpX2VjcGdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfZWNwZ2V0bWVtcHRyKHN0cnVjdCBzdGxpYnJkICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCiB7CQogCXZvaWQgX19pb21lbSAqcHRyOwogCXVuc2lnbmVkIGNoYXIgdmFsOwpAQCAtMjk2OSw3ICsyODEzLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxpX2VjcHJlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3N0YXRpYyB2b2lkIHN0bGlfZWNwcmVzZXQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoRUNQX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9BVENPTkZSKSk7CiAJdWRlbGF5KDEwKTsKQEAgLTI5NzksNyArMjgyMyw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsaV9lY3BpbnRyKHN0bGlicmRfdCAqYnJkcCkKK3N0YXRpYyB2b2lkIHN0bGlfZWNwaW50cihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsJCiAJb3V0YigweDEsIGJyZHAtPmlvYmFzZSk7CiB9CkBAIC0yOTkwLDcgKzI4MzQsNyBAQAogICoJVGhlIGZvbGxvd2luZyBzZXQgb2YgZnVuY3Rpb25zIGFjdCBvbiBFQ1AgRUlTQSBib2FyZHMuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9lY3BlaWluaXQoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIHZvaWQgc3RsaV9lY3BlaWluaXQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CiAJdW5zaWduZWQgbG9uZwltZW1jb25mOwogCkBAIC0zMDA4LDIxICsyODUyLDIxIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsaV9lY3BlaWVuYWJsZShzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX2VjcGVpZW5hYmxlKHN0cnVjdCBzdGxpYnJkICpicmRwKQogewkKIAlvdXRiKEVDUF9FSUVOQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUNPTkZSKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsaV9lY3BlaWRpc2FibGUoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIHZvaWQgc3RsaV9lY3BlaWRpc2FibGUoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoRUNQX0VJRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUNPTkZSKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9lY3BlaWdldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfZWNwZWlnZXRtZW1wdHIoc3RydWN0IHN0bGlicmQgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKIHsJCiAJdm9pZCBfX2lvbWVtICpwdHI7CiAJdW5zaWduZWQgY2hhcgl2YWw7CkBAIC0zMDQ2LDcgKzI4OTAsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bGlfZWNwZWlyZXNldChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX2VjcGVpcmVzZXQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoRUNQX0VJU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9FSUNPTkZSKSk7CiAJdWRlbGF5KDEwKTsKQEAgLTMwNjAsMjEgKzI5MDQsMjEgQEAKICAqCVRoZSBmb2xsb3dpbmcgc2V0IG9mIGZ1bmN0aW9ucyBhY3Qgb24gRUNQIE1DQSBib2FyZHMuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9lY3BtY2VuYWJsZShzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX2VjcG1jZW5hYmxlKHN0cnVjdCBzdGxpYnJkICpicmRwKQogewkKIAlvdXRiKEVDUF9NQ0VOQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9NQ0NPTkZSKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsaV9lY3BtY2Rpc2FibGUoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIHZvaWQgc3RsaV9lY3BtY2Rpc2FibGUoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoRUNQX01DRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIEVDUF9NQ0NPTkZSKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9lY3BtY2dldG1lbXB0cihzdGxpYnJkX3QgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfZWNwbWNnZXRtZW1wdHIoc3RydWN0IHN0bGlicmQgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKIHsJCiAJdm9pZCBfX2lvbWVtICpwdHI7CiAJdW5zaWduZWQgY2hhciB2YWw7CkBAIC0zMDk1LDcgKzI5MzksNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bGlfZWNwbWNyZXNldChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX2VjcG1jcmVzZXQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoRUNQX01DU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9NQ0NPTkZSKSk7CiAJdWRlbGF5KDEwKTsKQEAgLTMxMDksNyArMjk1Myw3IEBACiAgKglUaGUgZm9sbG93aW5nIHNldCBvZiBmdW5jdGlvbnMgYWN0IG9uIEVDUCBQQ0kgYm9hcmRzLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bGlfZWNwcGNpaW5pdChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX2VjcHBjaWluaXQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CiAJb3V0YihFQ1BfUENJU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9QQ0lDT05GUikpOwogCXVkZWxheSgxMCk7CkBAIC0zMTE5LDcgKzI5NjMsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfZWNwcGNpZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9lY3BwY2lnZXRtZW1wdHIoc3RydWN0IHN0bGlicmQgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKIHsJCiAJdm9pZCBfX2lvbWVtICpwdHI7CiAJdW5zaWduZWQgY2hhcgl2YWw7CkBAIC0zMTQwLDcgKzI5ODQsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bGlfZWNwcGNpcmVzZXQoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIHZvaWQgc3RsaV9lY3BwY2lyZXNldChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsJCiAJb3V0YihFQ1BfUENJU1RPUCwgKGJyZHAtPmlvYmFzZSArIEVDUF9QQ0lDT05GUikpOwogCXVkZWxheSgxMCk7CkBAIC0zMTU0LDcgKzI5OTgsNyBAQAogICoJVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhY3Qgb24gT05ib2FyZHMuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9vbmJpbml0KHN0bGlicmRfdCAqYnJkcCkKK3N0YXRpYyB2b2lkIHN0bGlfb25iaW5pdChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsKIAl1bnNpZ25lZCBsb25nCW1lbWNvbmY7CiAKQEAgLTMxNzEsMjEgKzMwMTUsMjEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxpX29uYmVuYWJsZShzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX29uYmVuYWJsZShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsJCiAJb3V0YigoYnJkcC0+ZW5hYnZhbCB8IE9OQl9BVEVOQUJMRSksIChicmRwLT5pb2Jhc2UgKyBPTkJfQVRDT05GUikpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bGlfb25iZGlzYWJsZShzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX29uYmRpc2FibGUoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoKGJyZHAtPmVuYWJ2YWwgfCBPTkJfQVRESVNBQkxFKSwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9vbmJnZXRtZW1wdHIoc3RsaWJyZF90ICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzdGxpX29uYmdldG1lbXB0cihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQogewkKIAl2b2lkIF9faW9tZW0gKnB0cjsKIApAQCAtMzIwMiw3ICszMDQ2LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxpX29uYnJlc2V0KHN0bGlicmRfdCAqYnJkcCkKK3N0YXRpYyB2b2lkIHN0bGlfb25icmVzZXQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoT05CX0FUU1RPUCwgKGJyZHAtPmlvYmFzZSArIE9OQl9BVENPTkZSKSk7CiAJdWRlbGF5KDEwKTsKQEAgLTMyMTYsNyArMzA2MCw3IEBACiAgKglUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjdCBvbiBPTmJvYXJkIEVJU0EuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9vbmJlaW5pdChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX29uYmVpbml0KHN0cnVjdCBzdGxpYnJkICpicmRwKQogewogCXVuc2lnbmVkIGxvbmcJbWVtY29uZjsKIApAQCAtMzIzNiwyMSArMzA4MCwyMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bGlfb25iZWVuYWJsZShzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX29uYmVlbmFibGUoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoT05CX0VJRU5BQkxFLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxpX29uYmVkaXNhYmxlKHN0bGlicmRfdCAqYnJkcCkKK3N0YXRpYyB2b2lkIHN0bGlfb25iZWRpc2FibGUoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCW91dGIoT05CX0VJRElTQUJMRSwgKGJyZHAtPmlvYmFzZSArIE9OQl9FSUNPTkZSKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9vbmJlZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9vbmJlZ2V0bWVtcHRyKHN0cnVjdCBzdGxpYnJkICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCiB7CQogCXZvaWQgX19pb21lbSAqcHRyOwogCXVuc2lnbmVkIGNoYXIgdmFsOwpAQCAtMzI3NCw3ICszMTE4LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxpX29uYmVyZXNldChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX29uYmVyZXNldChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsJCiAJb3V0YihPTkJfRUlTVE9QLCAoYnJkcC0+aW9iYXNlICsgT05CX0VJQ09ORlIpKTsKIAl1ZGVsYXkoMTApOwpAQCAtMzI4OCw3ICszMTMyLDcgQEAKICAqCVRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWN0IG9uIEJydW1ieSBib2FyZHMuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9iYnlpbml0KHN0bGlicmRfdCAqYnJkcCkKK3N0YXRpYyB2b2lkIHN0bGlfYmJ5aW5pdChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsKIAlvdXRiKEJCWV9BVFNUT1AsIChicmRwLT5pb2Jhc2UgKyBCQllfQVRDT05GUikpOwogCXVkZWxheSgxMCk7CkBAIC0zMzAwLDcgKzMxNDQsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKnN0bGlfYmJ5Z2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9iYnlnZXRtZW1wdHIoc3RydWN0IHN0bGlicmQgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSkKIHsJCiAJdm9pZCBfX2lvbWVtICpwdHI7CiAJdW5zaWduZWQgY2hhciB2YWw7CkBAIC0zMzE1LDcgKzMxNTksNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bGlfYmJ5cmVzZXQoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIHZvaWQgc3RsaV9iYnlyZXNldChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsJCiAJb3V0YihCQllfQVRTVE9QLCAoYnJkcC0+aW9iYXNlICsgQkJZX0FUQ09ORlIpKTsKIAl1ZGVsYXkoMTApOwpAQCAtMzMyOSw3ICszMTczLDcgQEAKICAqCVRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWN0IG9uIG9yaWdpbmFsIG9sZCBTdGFsbGlvbiBib2FyZHMuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsaV9zdGFsaW5pdChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgdm9pZCBzdGxpX3N0YWxpbml0KHN0cnVjdCBzdGxpYnJkICpicmRwKQogewogCW91dGIoMHgxLCBicmRwLT5pb2Jhc2UpOwogCW1kZWxheSgxMDAwKTsKQEAgLTMzMzcsNyArMzE4MSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9zdGFsZ2V0bWVtcHRyKHN0bGlicmRfdCAqYnJkcCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBsaW5lKQorc3RhdGljIHZvaWQgX19pb21lbSAqc3RsaV9zdGFsZ2V0bWVtcHRyKHN0cnVjdCBzdGxpYnJkICpicmRwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IGxpbmUpCiB7CQogCUJVR19PTihvZmZzZXQgPiBicmRwLT5tZW1zaXplKTsKIAlyZXR1cm4gYnJkcC0+bWVtYmFzZSArIChvZmZzZXQgJSBTVEFMX1BBR0VTSVpFKTsKQEAgLTMzNDUsNyArMzE4OSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsaV9zdGFscmVzZXQoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIHZvaWQgc3RsaV9zdGFscmVzZXQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CQogCXUzMiBfX2lvbWVtICp2ZWNwOwogCkBAIC0zMzYyLDIxICszMjA2LDIyIEBACiAgKglib2FyZCB0eXBlcy4KICAqLwogCi1zdGF0aWMgaW50IHN0bGlfaW5pdGVjcChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgaW50IHN0bGlfaW5pdGVjcChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsKIAljZGtlY3BzaWdfdCBzaWc7CiAJY2RrZWNwc2lnX3QgX19pb21lbSAqc2lnc3A7CiAJdW5zaWduZWQgaW50IHN0YXR1cywgbnh0aWQ7CiAJY2hhciAqbmFtZTsKLQlpbnQgcGFuZWxuciwgbnJwb3J0czsKKwlpbnQgcmV0dmFsLCBwYW5lbG5yLCBucnBvcnRzOwogCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSwgImlzdGFsbGlvbiIpKQotCQlyZXR1cm4gLUVJTzsKLQkKLQlpZiAoKGJyZHAtPmlvYmFzZSA9PSAwKSB8fCAoYnJkcC0+bWVtYWRkciA9PSAwKSkKLQl7Ci0JCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKChicmRwLT5pb2Jhc2UgPT0gMCkgfHwgKGJyZHAtPm1lbWFkZHIgPT0gMCkpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSwgImlzdGFsbGlvbiIpKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZXJyOwogCX0KIAogCWJyZHAtPmlvc2l6ZSA9IEVDUF9JT1NJWkU7CkBAIC0zMzg4LDcgKzMyMzMsNiBAQAogICovCiAJc3dpdGNoIChicmRwLT5icmR0eXBlKSB7CiAJY2FzZSBCUkRfRUNQOgotCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKIAkJYnJkcC0+bWVtc2l6ZSA9IEVDUF9NRU1TSVpFOwogCQlicmRwLT5wYWdlc2l6ZSA9IEVDUF9BVFBBR0VTSVpFOwogCQlicmRwLT5pbml0ID0gc3RsaV9lY3Bpbml0OwpAQCAtMzQwMiw3ICszMjQ2LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEJSRF9FQ1BFOgotCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKIAkJYnJkcC0+bWVtc2l6ZSA9IEVDUF9NRU1TSVpFOwogCQlicmRwLT5wYWdlc2l6ZSA9IEVDUF9FSVBBR0VTSVpFOwogCQlicmRwLT5pbml0ID0gc3RsaV9lY3BlaWluaXQ7CkBAIC0zNDE2LDcgKzMyNTksNiBAQAogCQlicmVhazsKIAogCWNhc2UgQlJEX0VDUE1DOgotCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKIAkJYnJkcC0+bWVtc2l6ZSA9IEVDUF9NRU1TSVpFOwogCQlicmRwLT5wYWdlc2l6ZSA9IEVDUF9NQ1BBR0VTSVpFOwogCQlicmRwLT5pbml0ID0gTlVMTDsKQEAgLTM0MzAsNyArMzI3Miw2IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCUkRfRUNQUENJOgotCQlicmRwLT5tZW1iYXNlID0gKHZvaWQgKikgYnJkcC0+bWVtYWRkcjsKIAkJYnJkcC0+bWVtc2l6ZSA9IEVDUF9QQ0lNRU1TSVpFOwogCQlicmRwLT5wYWdlc2l6ZSA9IEVDUF9QQ0lQQUdFU0laRTsKIAkJYnJkcC0+aW5pdCA9IHN0bGlfZWNwcGNpaW5pdDsKQEAgLTM0NDQsOCArMzI4NSw4IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVnOwogCX0KIAogLyoKQEAgLTM0NTcsMTAgKzMyOTgsOSBAQAogCUVCUkRJTklUKGJyZHApOwogCiAJYnJkcC0+bWVtYmFzZSA9IGlvcmVtYXAoYnJkcC0+bWVtYWRkciwgYnJkcC0+bWVtc2l6ZSk7Ci0JaWYgKGJyZHAtPm1lbWJhc2UgPT0gTlVMTCkKLQl7Ci0JCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGJyZHAtPm1lbWJhc2UgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZWc7CiAJfQogCiAvKgpAQCAtMzQ3MywxMCArMzMxMyw5IEBACiAJbWVtY3B5X2Zyb21pbygmc2lnLCBzaWdzcCwgc2l6ZW9mKGNka2VjcHNpZ190KSk7CiAJRUJSRERJU0FCTEUoYnJkcCk7CiAKLQlpZiAoc2lnLm1hZ2ljICE9IGNwdV90b19sZTMyKEVDUF9NQUdJQykpCi0JewotCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7Ci0JCXJldHVybiAtRU5PREVWOworCWlmIChzaWcubWFnaWMgIT0gY3B1X3RvX2xlMzIoRUNQX01BR0lDKSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl91bm1hcDsKIAl9CiAKIC8qCkBAIC0zNTAxLDYgKzMzNDAsMTMgQEAKIAogCWJyZHAtPnN0YXRlIHw9IEJTVF9GT1VORDsKIAlyZXR1cm4gMDsKK2Vycl91bm1hcDoKKwlpb3VubWFwKGJyZHAtPm1lbWJhc2UpOworCWJyZHAtPm1lbWJhc2UgPSBOVUxMOworZXJyX3JlZzoKKwlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzUxMCwyMyArMzM1NiwyNyBAQAogICoJVGhpcyBoYW5kbGVzIG9ubHkgdGhlc2UgYm9hcmQgdHlwZXMuCiAgKi8KIAotc3RhdGljIGludCBzdGxpX2luaXRvbmIoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIGludCBzdGxpX2luaXRvbmIoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CiAJY2Rrb25ic2lnX3Qgc2lnOwogCWNka29uYnNpZ190IF9faW9tZW0gKnNpZ3NwOwogCWNoYXIgKm5hbWU7Ci0JaW50IGk7CisJaW50IGksIHJldHZhbDsKIAogLyoKICAqCURvIGEgYmFzaWMgc2FuaXR5IGNoZWNrIG9uIHRoZSBJTyBhbmQgbWVtb3J5IGFkZHJlc3Nlcy4KICAqLwotCWlmIChicmRwLT5pb2Jhc2UgPT0gMCB8fCBicmRwLT5tZW1hZGRyID09IDApCi0JCXJldHVybiAtRU5PREVWOworCWlmIChicmRwLT5pb2Jhc2UgPT0gMCB8fCBicmRwLT5tZW1hZGRyID09IDApIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQogCiAJYnJkcC0+aW9zaXplID0gT05CX0lPU0laRTsKIAkKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplLCAiaXN0YWxsaW9uIikpCi0JCXJldHVybiAtRUlPOworCWlmICghcmVxdWVzdF9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUsICJpc3RhbGxpb24iKSkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CiAKIC8qCiAgKglCYXNlZCBvbiB0aGUgc3BlY2lmaWMgYm9hcmQgdHlwZSBzZXR1cCB0aGUgY29tbW9uIHZhcnMgdG8gYWNjZXNzCkBAIC0zNTM1LDEwICszMzg1LDcgQEAKICAqLwogCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgewogCWNhc2UgQlJEX09OQk9BUkQ6Ci0JY2FzZSBCUkRfT05CT0FSRDMyOgogCWNhc2UgQlJEX09OQk9BUkQyOgotCWNhc2UgQlJEX09OQk9BUkQyXzMyOgotCWNhc2UgQlJEX09OQk9BUkRSUzoKIAkJYnJkcC0+bWVtc2l6ZSA9IE9OQl9NRU1TSVpFOwogCQlicmRwLT5wYWdlc2l6ZSA9IE9OQl9BVFBBR0VTSVpFOwogCQlicmRwLT5pbml0ID0gc3RsaV9vbmJpbml0OwpAQCAtMzU2OSw4ICszNDE2LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEJSRF9CUlVNQlk0OgotCWNhc2UgQlJEX0JSVU1CWTg6Ci0JY2FzZSBCUkRfQlJVTUJZMTY6CiAJCWJyZHAtPm1lbXNpemUgPSBCQllfTUVNU0laRTsKIAkJYnJkcC0+cGFnZXNpemUgPSBCQllfUEFHRVNJWkU7CiAJCWJyZHAtPmluaXQgPSBzdGxpX2JieWluaXQ7CkBAIC0zNTk3LDggKzM0NDIsOCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlZzsKIAl9CiAKIC8qCkBAIC0zNjEwLDEwICszNDU1LDkgQEAKIAlFQlJESU5JVChicmRwKTsKIAogCWJyZHAtPm1lbWJhc2UgPSBpb3JlbWFwKGJyZHAtPm1lbWFkZHIsIGJyZHAtPm1lbXNpemUpOwotCWlmIChicmRwLT5tZW1iYXNlID09IE5VTEwpCi0JewotCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7Ci0JCXJldHVybiAtRU5PTUVNOworCWlmIChicmRwLT5tZW1iYXNlID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVnOwogCX0KIAogLyoKQEAgLTM2MjksMTAgKzM0NzMsOSBAQAogCWlmIChzaWcubWFnaWMwICE9IGNwdV90b19sZTE2KE9OQl9NQUdJQzApIHx8CiAJICAgIHNpZy5tYWdpYzEgIT0gY3B1X3RvX2xlMTYoT05CX01BR0lDMSkgfHwKIAkgICAgc2lnLm1hZ2ljMiAhPSBjcHVfdG9fbGUxNihPTkJfTUFHSUMyKSB8fAotCSAgICBzaWcubWFnaWMzICE9IGNwdV90b19sZTE2KE9OQl9NQUdJQzMpKQotCXsKLQkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkgICAgc2lnLm1hZ2ljMyAhPSBjcHVfdG9fbGUxNihPTkJfTUFHSUMzKSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl91bm1hcDsKIAl9CiAKIC8qCkBAIC0zNjU0LDYgKzM0OTcsMTMgQEAKIAogCWJyZHAtPnN0YXRlIHw9IEJTVF9GT1VORDsKIAlyZXR1cm4gMDsKK2Vycl91bm1hcDoKKwlpb3VubWFwKGJyZHAtPm1lbWJhc2UpOworCWJyZHAtPm1lbWJhc2UgPSBOVUxMOworZXJyX3JlZzoKKwlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2Jhc2UsIGJyZHAtPmlvc2l6ZSk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzY2NCwxNCArMzUxNCwxNSBAQAogICoJcmVhZCBpbiB0aGUgbWVtb3J5IG1hcCwgYW5kIGdldCB0aGUgc2hvdyBvbiB0aGUgcm9hZC4uLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9zdGFydGJyZChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgaW50IHN0bGlfc3RhcnRicmQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7CiAJY2RraGRyX3QgX19pb21lbSAqaGRycDsKIAljZGttZW1fdCBfX2lvbWVtICptZW1wOwogCWNka2FzeV90IF9faW9tZW0gKmFwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RsaXBvcnRfdCAqcG9ydHA7Ci0JaW50IHBvcnRuciwgbnJkZXZzLCBpLCByYyA9IDA7CisJdW5zaWduZWQgaW50IHBvcnRuciwgbnJkZXZzLCBpOworCXN0cnVjdCBzdGxpcG9ydCAqcG9ydHA7CisJaW50IHJjID0gMDsKIAl1MzIgbWVtb2ZmOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CkBAIC0zNzU4LDggKzM2MDksNyBAQAogCiAJaWYgKCEgc3RsaV90aW1lcm9uKSB7CiAJCXN0bGlfdGltZXJvbisrOwotCQlzdGxpX3RpbWVybGlzdC5leHBpcmVzID0gU1RMSV9USU1FT1VUOwotCQlhZGRfdGltZXIoJnN0bGlfdGltZXJsaXN0KTsKKwkJbW9kX3RpbWVyKCZzdGxpX3RpbWVybGlzdCwgU1RMSV9USU1FT1VUKTsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0zNzcxLDQ5ICszNjIxLDMyIEBACiAgKglQcm9iZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIGJvYXJkLgogICovCiAKLXN0YXRpYyBpbnQgX19pbml0IHN0bGlfYnJkaW5pdChzdGxpYnJkX3QgKmJyZHApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdGxpX2JyZGluaXQoc3RydWN0IHN0bGlicmQgKmJyZHApCiB7Ci0Jc3RsaV9icmRzW2JyZHAtPmJyZG5yXSA9IGJyZHA7CisJaW50IHJldHZhbDsKIAogCXN3aXRjaCAoYnJkcC0+YnJkdHlwZSkgewogCWNhc2UgQlJEX0VDUDoKIAljYXNlIEJSRF9FQ1BFOgogCWNhc2UgQlJEX0VDUE1DOgogCWNhc2UgQlJEX0VDUFBDSToKLQkJc3RsaV9pbml0ZWNwKGJyZHApOworCQlyZXR2YWwgPSBzdGxpX2luaXRlY3AoYnJkcCk7CiAJCWJyZWFrOwogCWNhc2UgQlJEX09OQk9BUkQ6CiAJY2FzZSBCUkRfT05CT0FSREU6CiAJY2FzZSBCUkRfT05CT0FSRDI6Ci0JY2FzZSBCUkRfT05CT0FSRDMyOgotCWNhc2UgQlJEX09OQk9BUkQyXzMyOgotCWNhc2UgQlJEX09OQk9BUkRSUzoKIAljYXNlIEJSRF9CUlVNQlk0OgotCWNhc2UgQlJEX0JSVU1CWTg6Ci0JY2FzZSBCUkRfQlJVTUJZMTY6CiAJY2FzZSBCUkRfU1RBTExJT046Ci0JCXN0bGlfaW5pdG9uYihicmRwKTsKKwkJcmV0dmFsID0gc3RsaV9pbml0b25iKGJyZHApOwogCQlicmVhazsKLQljYXNlIEJSRF9FQVNZSU86Ci0JY2FzZSBCUkRfRUNIOgotCWNhc2UgQlJEX0VDSE1DOgotCWNhc2UgQlJEX0VDSFBDSToKLQkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogJXMgYm9hcmQgdHlwZSBub3Qgc3VwcG9ydGVkIGluICIKLQkJCQkidGhpcyBkcml2ZXJcbiIsIHN0bGlfYnJkbmFtZXNbYnJkcC0+YnJkdHlwZV0pOwotCQlyZXR1cm4gLUVOT0RFVjsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBib2FyZD0lZCBpcyB1bmtub3duIGJvYXJkICIKIAkJCQkidHlwZT0lZFxuIiwgYnJkcC0+YnJkbnIsIGJyZHAtPmJyZHR5cGUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dmFsID0gLUVOT0RFVjsKIAl9CiAKLQlpZiAoKGJyZHAtPnN0YXRlICYgQlNUX0ZPVU5EKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046ICVzIGJvYXJkIG5vdCBmb3VuZCwgYm9hcmQ9JWQgIgotCQkJCSJpbz0leCBtZW09JXhcbiIsCi0JCQlzdGxpX2JyZG5hbWVzW2JyZHAtPmJyZHR5cGVdLCBicmRwLT5icmRuciwKLQkJCWJyZHAtPmlvYmFzZSwgKGludCkgYnJkcC0+bWVtYWRkcik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwogCiAJc3RsaV9pbml0cG9ydHMoYnJkcCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiU1RBTExJT046ICVzIGZvdW5kLCBib2FyZD0lZCBpbz0leCBtZW09JXggIgpAQCAtMzgyMyw2ICszNjU2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIFNUTElfRUlTQVBST0JFICE9IDAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKQEAgLTM4MzAsNyArMzY2NCw3IEBACiAgKgltaWdodCBiZS4gVGhpcyBpcyBhIGJpdCBpZiBoYWNrLCBidXQgaXQgaXMgdGhlIGJlc3Qgd2UgY2FuIGRvLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9laXNhbWVtcHJvYmUoc3RsaWJyZF90ICpicmRwKQorc3RhdGljIGludCBzdGxpX2Vpc2FtZW1wcm9iZShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCkKIHsKIAljZGtlY3BzaWdfdAllY3BzaWcsIF9faW9tZW0gKmVjcHNpZ3A7CiAJY2Rrb25ic2lnX3QJb25ic2lnLCBfX2lvbWVtICpvbmJzaWdwOwpAQCAtMzkxNiwxMCArMzc1MCwxMSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IHN0bGlfZ2V0YnJkbnIodm9pZCkKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBTVExfTUFYQlJEUzsgaSsrKSB7CiAJCWlmICghc3RsaV9icmRzW2ldKSB7CkBAIC0zOTMxLDYgKzM3NjYsNyBAQAogCXJldHVybiAtMTsKIH0KIAorI2lmIFNUTElfRUlTQVBST0JFICE9IDAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKQEAgLTM5NDUsOSArMzc4MSw5IEBACiAKIHN0YXRpYyBpbnQgc3RsaV9maW5kZWlzYWJyZHModm9pZCkKIHsKLQlzdGxpYnJkX3QgKmJyZHA7Ci0JdW5zaWduZWQgaW50IGlvYmFzZSwgZWlkOwotCWludCBpOworCXN0cnVjdCBzdGxpYnJkICpicmRwOworCXVuc2lnbmVkIGludCBpb2Jhc2UsIGVpZCwgaTsKKwlpbnQgYnJkbnIsIGZvdW5kID0gMDsKIAogLyoKICAqCUZpcnN0bHkgY2hlY2sgaWYgdGhpcyBpcyBhbiBFSVNBIHN5c3RlbS4gIElmIHRoaXMgaXMgbm90IGFuIEVJU0Egc3lzdGVtIHRoZW4KQEAgLTM5ODUsOSArMzgyMSwxMSBAQAogICoJCUFsbG9jYXRlIGEgYm9hcmQgc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIGl0LgogICovCiAJCWlmICgoYnJkcCA9IHN0bGlfYWxsb2NicmQoKSkgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlpZiAoKGJyZHAtPmJyZG5yID0gc3RsaV9nZXRicmRucigpKSA8IDApCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJldHVybiBmb3VuZCA/IDogLUVOT01FTTsKKwkJYnJkbnIgPSBzdGxpX2dldGJyZG5yKCk7CisJCWlmIChicmRuciA8IDApCisJCQlyZXR1cm4gZm91bmQgPyA6IC1FTk9NRU07CisJCWJyZHAtPmJyZG5yID0gKHVuc2lnbmVkIGludClicmRucjsKIAkJZWlkID0gaW5iKGlvYmFzZSArIDB4YzgyKTsKIAkJaWYgKGVpZCA9PSBFQ1BfRUlTQUlEKQogCQkJYnJkcC0+YnJkdHlwZSA9IEJSRF9FQ1BFOwpAQCAtMzk5OSwxMSArMzgzNywyNCBAQAogCQlvdXRiKDB4MSwgKGlvYmFzZSArIDB4Yzg0KSk7CiAJCWlmIChzdGxpX2Vpc2FtZW1wcm9iZShicmRwKSkKIAkJCW91dGIoMCwgKGlvYmFzZSArIDB4Yzg0KSk7Ci0JCXN0bGlfYnJkaW5pdChicmRwKTsKKwkJaWYgKHN0bGlfYnJkaW5pdChicmRwKSA8IDApIHsKKwkJCWtmcmVlKGJyZHApOworCQkJY29udGludWU7CisJCX0KKworCQlzdGxpX2JyZHNbYnJkcC0+YnJkbnJdID0gYnJkcDsKKwkJZm91bmQrKzsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnJkcC0+bnJwb3J0czsgaSsrKQorCQkJdHR5X3JlZ2lzdGVyX2RldmljZShzdGxpX3NlcmlhbCwKKwkJCQkJYnJkcC0+YnJkbnIgKiBTVExfTUFYUE9SVFMgKyBpLCBOVUxMKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZm91bmQ7CiB9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc3RsaV9maW5kZWlzYWJyZHModm9pZCkgeyByZXR1cm4gMDsgfQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDAxMyw3MiArMzg2NCwxMDQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYJQ09ORklHX1BDSQotCiAvKgogICoJV2UgaGF2ZSBhIFN0YWxsaW9uIGJvYXJkLiBBbGxvY2F0ZSBhIGJvYXJkIHN0cnVjdHVyZSBhbmQKICAqCWluaXRpYWxpemUgaXQuIFJlYWQgaXRzIElPIGFuZCBNRU1PUlkgcmVzb3VyY2VzIGZyb20gUENJCiAgKgljb25maWd1cmF0aW9uIHNwYWNlLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9pbml0cGNpYnJkKGludCBicmR0eXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2cCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN0bGlfcGNpcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RsaWJyZF90ICpicmRwOworCXN0cnVjdCBzdGxpYnJkICpicmRwOworCXVuc2lnbmVkIGludCBpOworCWludCBicmRuciwgcmV0dmFsID0gLUVJTzsKIAotCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXZwKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKChicmRwID0gc3RsaV9hbGxvY2JyZCgpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoKGJyZHAtPmJyZG5yID0gc3RsaV9nZXRicmRucigpKSA8IDApIHsKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKwlicmRwID0gc3RsaV9hbGxvY2JyZCgpOworCWlmIChicmRwID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCW11dGV4X2xvY2soJnN0bGlfYnJkc2xvY2spOworCWJyZG5yID0gc3RsaV9nZXRicmRucigpOworCWlmIChicmRuciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiU1RBTExJT046IHRvbyBtYW55IGJvYXJkcyBmb3VuZCwgIgogCQkJIm1heGltdW0gc3VwcG9ydGVkICVkXG4iLCBTVExfTUFYQlJEUyk7Ci0JCXJldHVybiAwOworCQltdXRleF91bmxvY2soJnN0bGlfYnJkc2xvY2spOworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGVycl9mcjsKIAl9Ci0JYnJkcC0+YnJkdHlwZSA9IGJyZHR5cGU7CisJYnJkcC0+YnJkbnIgPSAodW5zaWduZWQgaW50KWJyZG5yOworCXN0bGlfYnJkc1ticmRwLT5icmRucl0gPSBicmRwOworCW11dGV4X3VubG9jaygmc3RsaV9icmRzbG9jayk7CisJYnJkcC0+YnJkdHlwZSA9IEJSRF9FQ1BQQ0k7CiAvKgogICoJV2UgaGF2ZSBhbGwgcmVzb3VyY2VzIGZyb20gdGhlIGJvYXJkLCBzbyBsZXRzIHNldHVwIHRoZSBhY3R1YWwKICAqCWJvYXJkIHN0cnVjdHVyZSBub3cuCiAgKi8KLQlicmRwLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMyk7Ci0JYnJkcC0+bWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAyKTsKLQlzdGxpX2JyZGluaXQoYnJkcCk7CisJYnJkcC0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCWJyZHAtPm1lbWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJcmV0dmFsID0gc3RsaV9icmRpbml0KGJyZHApOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX251bGw7CisKKwlicmRwLT5zdGF0ZSB8PSBCU1RfUFJPQkVEOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmRwKTsKKworCUVCUkRFTkFCTEUoYnJkcCk7CisJYnJkcC0+ZW5hYmxlID0gTlVMTDsKKwlicmRwLT5kaXNhYmxlID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBicmRwLT5ucnBvcnRzOyBpKyspCisJCXR0eV9yZWdpc3Rlcl9kZXZpY2Uoc3RsaV9zZXJpYWwsIGJyZHAtPmJyZG5yICogU1RMX01BWFBPUlRTICsgaSwKKwkJCQkmcGRldi0+ZGV2KTsKIAogCXJldHVybiAwOworZXJyX251bGw6CisJc3RsaV9icmRzW2JyZHAtPmJyZG5yXSA9IE5VTEw7CitlcnJfZnI6CisJa2ZyZWUoYnJkcCk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICoJRmluZCBhbGwgU3RhbGxpb24gUENJIGJvYXJkcyB0aGF0IG1pZ2h0IGJlIGluc3RhbGxlZC4gSW5pdGlhbGl6ZSBlYWNoCi0gKglvbmUgYXMgaXQgaXMgZm91bmQuCi0gKi8KLQotc3RhdGljIGludCBzdGxpX2ZpbmRwY2licmRzKHZvaWQpCitzdGF0aWMgdm9pZCBzdGxpX3BjaXJlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TVEFMTElPTiwgUENJX0RFVklDRV9JRF9FQ1JBLCBkZXYpKSkgewotCQlzdGxpX2luaXRwY2licmQoQlJEX0VDUFBDSSwgZGV2KTsKLQl9Ci0JcmV0dXJuIDA7CisJc3RsaV9jbGVhbnVwX3BvcnRzKGJyZHApOworCisJaW91bm1hcChicmRwLT5tZW1iYXNlKTsKKwlpZiAoYnJkcC0+aW9zaXplID4gMCkKKwkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9iYXNlLCBicmRwLT5pb3NpemUpOworCisJc3RsaV9icmRzW2JyZHAtPmJyZG5yXSA9IE5VTEw7CisJa2ZyZWUoYnJkcCk7CiB9CiAKLSNlbmRpZgotCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3RsaV9wY2lkcml2ZXIgPSB7CisJLm5hbWUgPSAiaXN0YWxsaW9uIiwKKwkuaWRfdGFibGUgPSBpc3RhbGxpb25fcGNpX3RibCwKKwkucHJvYmUgPSBzdGxpX3BjaXByb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzdGxpX3BjaXJlbW92ZSkKK307CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCiAgKglBbGxvY2F0ZSBhIG5ldyBib2FyZCBzdHJ1Y3R1cmUuIEZpbGwgb3V0IHRoZSBiYXNpYyBpbmZvIGluIGl0LgogICovCiAKLXN0YXRpYyBzdGxpYnJkX3QgKnN0bGlfYWxsb2NicmQodm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgc3RsaWJyZCAqc3RsaV9hbGxvY2JyZCh2b2lkKQogewotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAotCWJyZHAgPSBremFsbG9jKHNpemVvZihzdGxpYnJkX3QpLCBHRlBfS0VSTkVMKTsKKwlicmRwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0bGlicmQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJyZHApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAiCi0JCQkJIihzaXplPSVaZClcbiIsIHNpemVvZihzdGxpYnJkX3QpKTsKKwkJCQkiKHNpemU9JVpkKVxuIiwgc2l6ZW9mKHN0cnVjdCBzdGxpYnJkKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlicmRwLT5tYWdpYyA9IFNUTElfQk9BUkRNQUdJQzsKQEAgLTQwOTQsNDMgKzM5NzcsMzcgQEAKIAogc3RhdGljIGludCBzdGxpX2luaXRicmRzKHZvaWQpCiB7Ci0Jc3RsaWJyZF90ICpicmRwLCAqbnh0YnJkcDsKLQlzdGxjb25mX3QgKmNvbmZwOwotCWludCBpLCBqOworCXN0cnVjdCBzdGxpYnJkICpicmRwLCAqbnh0YnJkcDsKKwlzdHJ1Y3Qgc3RsY29uZiBjb25mOworCXVuc2lnbmVkIGludCBpLCBqLCBmb3VuZCA9IDA7CisJaW50IHJldHZhbDsKIAotCWlmIChzdGxpX25yYnJkcyA+IFNUTF9NQVhCUkRTKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlNUQUxMSU9OOiB0b28gbWFueSBib2FyZHMgaW4gY29uZmlndXJhdGlvbiAiCi0JCQkidGFibGUsIHRydW5jYXRpbmcgdG8gJWRcbiIsIFNUTF9NQVhCUkRTKTsKLQkJc3RsaV9ucmJyZHMgPSBTVExfTUFYQlJEUzsKLQl9Ci0KLS8qCi0gKglGaXJzdGx5IHNjYW4gdGhlIGxpc3Qgb2Ygc3RhdGljIGJvYXJkcyBjb25maWd1cmVkLiBBbGxvY2F0ZQotICoJcmVzb3VyY2VzIGFuZCBpbml0aWFsaXplIHRoZSBib2FyZHMgYXMgZm91bmQuIElmIHRoaXMgaXMgYQotICoJbW9kdWxlIHRoZW4gbGV0IHRoZSBtb2R1bGUgYXJncyBvdmVycmlkZSBzdGF0aWMgY29uZmlndXJhdGlvbi4KLSAqLwotCWZvciAoaSA9IDA7IChpIDwgc3RsaV9ucmJyZHMpOyBpKyspIHsKLQkJY29uZnAgPSAmc3RsaV9icmRjb25mW2ldOwotCQlzdGxpX3BhcnNlYnJkKGNvbmZwLCBzdGxpX2JyZHNwW2ldKTsKKwlmb3IgKHN0bGlfbnJicmRzID0gMDsgc3RsaV9ucmJyZHMgPCBBUlJBWV9TSVpFKHN0bGlfYnJkc3ApOworCQkJc3RsaV9ucmJyZHMrKykgeworCQltZW1zZXQoJmNvbmYsIDAsIHNpemVvZihjb25mKSk7CisJCWlmIChzdGxpX3BhcnNlYnJkKCZjb25mLCBzdGxpX2JyZHNwW3N0bGlfbnJicmRzXSkgPT0gMCkKKwkJCWNvbnRpbnVlOwogCQlpZiAoKGJyZHAgPSBzdGxpX2FsbG9jYnJkKCkpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJYnJkcC0+YnJkbnIgPSBpOwotCQlicmRwLT5icmR0eXBlID0gY29uZnAtPmJyZHR5cGU7Ci0JCWJyZHAtPmlvYmFzZSA9IGNvbmZwLT5pb2FkZHIxOwotCQlicmRwLT5tZW1hZGRyID0gY29uZnAtPm1lbWFkZHI7Ci0JCXN0bGlfYnJkaW5pdChicmRwKTsKKwkJCWNvbnRpbnVlOworCQlicmRwLT5icmRuciA9IHN0bGlfbnJicmRzOworCQlicmRwLT5icmR0eXBlID0gY29uZi5icmR0eXBlOworCQlicmRwLT5pb2Jhc2UgPSBjb25mLmlvYWRkcjE7CisJCWJyZHAtPm1lbWFkZHIgPSBjb25mLm1lbWFkZHI7CisJCWlmIChzdGxpX2JyZGluaXQoYnJkcCkgPCAwKSB7CisJCQlrZnJlZShicmRwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN0bGlfYnJkc1ticmRwLT5icmRucl0gPSBicmRwOworCQlmb3VuZCsrOworCisJCWZvciAoaSA9IDA7IGkgPCBicmRwLT5ucnBvcnRzOyBpKyspCisJCQl0dHlfcmVnaXN0ZXJfZGV2aWNlKHN0bGlfc2VyaWFsLAorCQkJCQlicmRwLT5icmRuciAqIFNUTF9NQVhQT1JUUyArIGksIE5VTEwpOwogCX0KIAotLyoKLSAqCVN0YXRpYyBjb25maWd1cmF0aW9uIHRhYmxlIGRvbmUsIHNvIG5vdyB1c2UgZHluYW1pYyBtZXRob2RzIHRvCi0gKglzZWUgaWYgYW55IG1vcmUgYm9hcmRzIHNob3VsZCBiZSBjb25maWd1cmVkLgotICovCi0Jc3RsaV9hcmdicmRzKCk7Ci0JaWYgKFNUTElfRUlTQVBST0JFKQotCQlzdGxpX2ZpbmRlaXNhYnJkcygpOwotI2lmZGVmIENPTkZJR19QQ0kKLQlzdGxpX2ZpbmRwY2licmRzKCk7Ci0jZW5kaWYKKwlyZXR2YWwgPSBzdGxpX2ZpbmRlaXNhYnJkcygpOworCWlmIChyZXR2YWwgPiAwKQorCQlmb3VuZCArPSByZXR2YWw7CiAKIC8qCiAgKglBbGwgZm91bmQgYm9hcmRzIGFyZSBpbml0aWFsaXplZC4gTm93IGZvciBhIGxpdHRsZSBvcHRpbWl6YXRpb24sIGlmCkBAIC00MTcwLDcgKzQwNDcsMTYgQEAKIAkJfQogCX0KIAorCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnN0bGlfcGNpZHJpdmVyKTsKKwlpZiAocmV0dmFsICYmIGZvdW5kID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOZWl0aGVyIGlzYSBub3IgZWlzYSBjYXJkcyBmb3VuZCBub3IgcGNpICIKKwkJCQkiZHJpdmVyIGNhbiBiZSByZWdpc3RlcmVkIVxuIik7CisJCWdvdG8gZXJyOworCX0KKwogCXJldHVybiAwOworZXJyOgorCXJldHVybiByZXR2YWw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxODUsMTIgKzQwNzEsMTMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgX19pb21lbSAqbWVtcHRyOwotCXN0bGlicmRfdCAqYnJkcDsKLQlpbnQgYnJkbnIsIHNpemUsIG47CisJc3RydWN0IHN0bGlicmQgKmJyZHA7CisJdW5zaWduZWQgaW50IGJyZG5yOworCWludCBzaXplLCBuOwogCXZvaWQgKnA7CiAJbG9mZl90IG9mZiA9ICpvZmZwOwogCi0JYnJkbnIgPSBpbWlub3IoZnAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlicmRuciA9IGltaW5vcihmcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJaWYgKGJyZG5yID49IHN0bGlfbnJicmRzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlicmRwID0gc3RsaV9icmRzW2JyZG5yXTsKQEAgLTQyMDEsNyArNDA4OCw3IEBACiAJaWYgKG9mZiA+PSBicmRwLT5tZW1zaXplIHx8IG9mZiArIGNvdW50IDwgb2ZmKQogCQlyZXR1cm4gMDsKIAotCXNpemUgPSBNSU4oY291bnQsIChicmRwLT5tZW1zaXplIC0gb2ZmKSk7CisJc2l6ZSA9IG1pbihjb3VudCwgKHNpemVfdCkoYnJkcC0+bWVtc2l6ZSAtIG9mZikpOwogCiAJLyoKIAkgKglDb3B5IHRoZSBkYXRhIGEgcGFnZSBhdCBhIHRpbWUKQEAgLTQyMTUsOCArNDEwMiw4IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZicmRfbG9jaywgZmxhZ3MpOwogCQlFQlJERU5BQkxFKGJyZHApOwogCQltZW1wdHIgPSBFQlJER0VUTUVNUFRSKGJyZHAsIG9mZik7Ci0JCW4gPSBNSU4oc2l6ZSwgKGJyZHAtPnBhZ2VzaXplIC0gKCgodW5zaWduZWQgbG9uZykgb2ZmKSAlIGJyZHAtPnBhZ2VzaXplKSkpOwotCQluID0gTUlOKG4sIFBBR0VfU0laRSk7CisJCW4gPSBtaW4oc2l6ZSwgKGludCkoYnJkcC0+cGFnZXNpemUgLSAoKCh1bnNpZ25lZCBsb25nKSBvZmYpICUgYnJkcC0+cGFnZXNpemUpKSk7CisJCW4gPSBtaW4obiwgKGludClQQUdFX1NJWkUpOwogCQltZW1jcHlfZnJvbWlvKHAsIG1lbXB0ciwgbik7CiAJCUVCUkRESVNBQkxFKGJyZHApOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmRfbG9jaywgZmxhZ3MpOwpAQCAtNDI0OCwxMyArNDEzNSwxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCBfX2lvbWVtICptZW1wdHI7Ci0Jc3RsaWJyZF90ICpicmRwOworCXN0cnVjdCBzdGxpYnJkICpicmRwOwogCWNoYXIgX191c2VyICpjaGJ1ZjsKLQlpbnQgYnJkbnIsIHNpemUsIG47CisJdW5zaWduZWQgaW50IGJyZG5yOworCWludCBzaXplLCBuOwogCXZvaWQgKnA7CiAJbG9mZl90IG9mZiA9ICpvZmZwOwogCi0JYnJkbnIgPSBpbWlub3IoZnAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlicmRuciA9IGltaW5vcihmcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAKIAlpZiAoYnJkbnIgPj0gc3RsaV9ucmJyZHMpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNDI2Nyw3ICs0MTU1LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAljaGJ1ZiA9IChjaGFyIF9fdXNlciAqKSBidWY7Ci0Jc2l6ZSA9IE1JTihjb3VudCwgKGJyZHAtPm1lbXNpemUgLSBvZmYpKTsKKwlzaXplID0gbWluKGNvdW50LCAoc2l6ZV90KShicmRwLT5tZW1zaXplIC0gb2ZmKSk7CiAKIAkvKgogCSAqCUNvcHkgdGhlIGRhdGEgYSBwYWdlIGF0IGEgdGltZQpAQCAtNDI3OCw4ICs0MTY2LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl3aGlsZSAoc2l6ZSA+IDApIHsKLQkJbiA9IE1JTihzaXplLCAoYnJkcC0+cGFnZXNpemUgLSAoKCh1bnNpZ25lZCBsb25nKSBvZmYpICUgYnJkcC0+cGFnZXNpemUpKSk7Ci0JCW4gPSBNSU4obiwgUEFHRV9TSVpFKTsKKwkJbiA9IG1pbihzaXplLCAoaW50KShicmRwLT5wYWdlc2l6ZSAtICgoKHVuc2lnbmVkIGxvbmcpIG9mZikgJSBicmRwLT5wYWdlc2l6ZSkpKTsKKwkJbiA9IG1pbihuLCAoaW50KVBBR0VfU0laRSk7CiAJCWlmIChjb3B5X2Zyb21fdXNlcihwLCBjaGJ1ZiwgbikpIHsKIAkJCWlmIChjb3VudCA9PSAwKQogCQkJCWNvdW50ID0gLUVGQVVMVDsKQEAgLTQzMDksOCArNDE5Nyw4IEBACiAKIHN0YXRpYyBpbnQgc3RsaV9nZXRicmRzdGF0cyhjb21icmRfdCBfX3VzZXIgKmJwKQogewotCXN0bGlicmRfdCAqYnJkcDsKLQlpbnQgaTsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9icmRzdGF0cywgYnAsIHNpemVvZihjb21icmRfdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTQzNDYsMTkgKzQyMzQsMjAgQEAKICAqCVJlc29sdmUgdGhlIHJlZmVyZW5jZWQgcG9ydCBudW1iZXIgaW50byBhIHBvcnQgc3RydWN0IHBvaW50ZXIuCiAgKi8KIAotc3RhdGljIHN0bGlwb3J0X3QgKnN0bGlfZ2V0cG9ydChpbnQgYnJkbnIsIGludCBwYW5lbG5yLCBpbnQgcG9ydG5yKQorc3RhdGljIHN0cnVjdCBzdGxpcG9ydCAqc3RsaV9nZXRwb3J0KHVuc2lnbmVkIGludCBicmRuciwgdW5zaWduZWQgaW50IHBhbmVsbnIsCisJCXVuc2lnbmVkIGludCBwb3J0bnIpCiB7Ci0Jc3RsaWJyZF90ICpicmRwOwotCWludCBpOworCXN0cnVjdCBzdGxpYnJkICpicmRwOworCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKGJyZG5yIDwgMCB8fCBicmRuciA+PSBTVExfTUFYQlJEUykKKwlpZiAoYnJkbnIgPj0gU1RMX01BWEJSRFMpCiAJCXJldHVybiBOVUxMOwogCWJyZHAgPSBzdGxpX2JyZHNbYnJkbnJdOwogCWlmIChicmRwID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCWZvciAoaSA9IDA7IChpIDwgcGFuZWxucik7IGkrKykKIAkJcG9ydG5yICs9IGJyZHAtPnBhbmVsc1tpXTsKLQlpZiAoKHBvcnRuciA8IDApIHx8IChwb3J0bnIgPj0gYnJkcC0+bnJwb3J0cykpCisJaWYgKHBvcnRuciA+PSBicmRwLT5ucnBvcnRzKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gYnJkcC0+cG9ydHNbcG9ydG5yXTsKIH0KQEAgLTQzNzEsMTAgKzQyNjAsMTAgQEAKICAqCXdoYXQgcG9ydCB0byBnZXQgc3RhdHMgZm9yICh1c2VkIHRocm91Z2ggYm9hcmQgY29udHJvbCBkZXZpY2UpLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9wb3J0Y21kc3RhdHMoc3RsaXBvcnRfdCAqcG9ydHApCitzdGF0aWMgaW50IHN0bGlfcG9ydGNtZHN0YXRzKHN0cnVjdCBzdGxpcG9ydCAqcG9ydHApCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKLQlzdGxpYnJkX3QJKmJyZHA7CisJc3RydWN0IHN0bGlicmQJKmJyZHA7CiAJaW50CQlyYzsKIAogCW1lbXNldCgmc3RsaV9jb21zdGF0cywgMCwgc2l6ZW9mKGNvbXN0YXRzX3QpKTsKQEAgLTQ0NDUsOSArNDMzNCw5IEBACiAgKgl3aGF0IHBvcnQgdG8gZ2V0IHN0YXRzIGZvciAodXNlZCB0aHJvdWdoIGJvYXJkIGNvbnRyb2wgZGV2aWNlKS4KICAqLwogCi1zdGF0aWMgaW50IHN0bGlfZ2V0cG9ydHN0YXRzKHN0bGlwb3J0X3QgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCitzdGF0aWMgaW50IHN0bGlfZ2V0cG9ydHN0YXRzKHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCkKIHsKLQlzdGxpYnJkX3QgKmJyZHA7CisJc3RydWN0IHN0bGlicmQgKmJyZHA7CiAJaW50IHJjOwogCiAJaWYgKCFwb3J0cCkgewpAQCAtNDQ3Niw5ICs0MzY1LDkgQEAKICAqCUNsZWFyIHRoZSBwb3J0IHN0YXRzIHN0cnVjdHVyZS4gV2UgYWxzbyByZXR1cm4gaXQgemVyb2VkIG91dC4uLgogICovCiAKLXN0YXRpYyBpbnQgc3RsaV9jbHJwb3J0c3RhdHMoc3RsaXBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCkKK3N0YXRpYyBpbnQgc3RsaV9jbHJwb3J0c3RhdHMoc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKQogewotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAlpbnQgcmM7CiAKIAlpZiAoIXBvcnRwKSB7CkBAIC00NTE1LDE3ICs0NDA0LDE4IEBACiAgKglSZXR1cm4gdGhlIGVudGlyZSBkcml2ZXIgcG9ydHMgc3RydWN0dXJlIHRvIGEgdXNlciBhcHAuCiAgKi8KIAotc3RhdGljIGludCBzdGxpX2dldHBvcnRzdHJ1Y3Qoc3RsaXBvcnRfdCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc3RsaV9nZXRwb3J0c3RydWN0KHN0cnVjdCBzdGxpcG9ydCBfX3VzZXIgKmFyZykKIHsKLQlzdGxpcG9ydF90ICpwb3J0cDsKKwlzdHJ1Y3Qgc3RsaXBvcnQgc3RsaV9kdW1teXBvcnQ7CisJc3RydWN0IHN0bGlwb3J0ICpwb3J0cDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsaV9kdW1teXBvcnQsIGFyZywgc2l6ZW9mKHN0bGlwb3J0X3QpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0bGlfZHVtbXlwb3J0LCBhcmcsIHNpemVvZihzdHJ1Y3Qgc3RsaXBvcnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcG9ydHAgPSBzdGxpX2dldHBvcnQoc3RsaV9kdW1teXBvcnQuYnJkbnIsIHN0bGlfZHVtbXlwb3J0LnBhbmVsbnIsCiAJCSBzdGxpX2R1bW15cG9ydC5wb3J0bnIpOwogCWlmICghcG9ydHApCiAJCXJldHVybiAtRU5PREVWOwotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBwb3J0cCwgc2l6ZW9mKHN0bGlwb3J0X3QpKSkKKwlpZiAoY29weV90b191c2VyKGFyZywgcG9ydHAsIHNpemVvZihzdHJ1Y3Qgc3RsaXBvcnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CkBAIC00NTM2LDE4ICs0NDI2LDE5IEBACiAgKglSZXR1cm4gdGhlIGVudGlyZSBkcml2ZXIgYm9hcmQgc3RydWN0dXJlIHRvIGEgdXNlciBhcHAuCiAgKi8KIAotc3RhdGljIGludCBzdGxpX2dldGJyZHN0cnVjdChzdGxpYnJkX3QgX191c2VyICphcmcpCitzdGF0aWMgaW50IHN0bGlfZ2V0YnJkc3RydWN0KHN0cnVjdCBzdGxpYnJkIF9fdXNlciAqYXJnKQogewotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaWJyZCBzdGxpX2R1bW15YnJkOworCXN0cnVjdCBzdGxpYnJkICpicmRwOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxpX2R1bW15YnJkLCBhcmcsIHNpemVvZihzdGxpYnJkX3QpKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0bGlfZHVtbXlicmQsIGFyZywgc2l6ZW9mKHN0cnVjdCBzdGxpYnJkKSkpCiAJCXJldHVybiAtRUZBVUxUOwotCWlmICgoc3RsaV9kdW1teWJyZC5icmRuciA8IDApIHx8IChzdGxpX2R1bW15YnJkLmJyZG5yID49IFNUTF9NQVhCUkRTKSkKKwlpZiAoc3RsaV9kdW1teWJyZC5icmRuciA+PSBTVExfTUFYQlJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJYnJkcCA9IHN0bGlfYnJkc1tzdGxpX2R1bW15YnJkLmJyZG5yXTsKIAlpZiAoIWJyZHApCiAJCXJldHVybiAtRU5PREVWOwotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBicmRwLCBzaXplb2Yoc3RsaWJyZF90KSkpCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsIGJyZHAsIHNpemVvZihzdHJ1Y3Qgc3RsaWJyZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1NjIsNyArNDQ1Myw3IEBACiAKIHN0YXRpYyBpbnQgc3RsaV9tZW1pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0bGlicmRfdCAqYnJkcDsKKwlzdHJ1Y3Qgc3RsaWJyZCAqYnJkcDsKIAlpbnQgYnJkbnIsIHJjLCBkb25lOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCkBAIC00NjYxLDQ2ICs0NTUyLDUzIEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICoJTG9hZGFibGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIHN0dWZmLgorICovCiAKLXN0YXRpYyBpbnQgX19pbml0IHN0bGlfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgaXN0YWxsaW9uX2NsZWFudXBfaXNhKHZvaWQpCiB7Ci0JaW50IGk7CisJc3RydWN0IHN0bGlicmQJKmJyZHA7CisJdW5zaWduZWQgaW50IGo7CisKKwlmb3IgKGogPSAwOyAoaiA8IHN0bGlfbnJicmRzKTsgaisrKSB7CisJCWlmICgoYnJkcCA9IHN0bGlfYnJkc1tqXSkgPT0gTlVMTCB8fCAoYnJkcC0+c3RhdGUgJiBCU1RfUFJPQkVEKSkKKwkJCWNvbnRpbnVlOworCisJCXN0bGlfY2xlYW51cF9wb3J0cyhicmRwKTsKKworCQlpb3VubWFwKGJyZHAtPm1lbWJhc2UpOworCQlpZiAoYnJkcC0+aW9zaXplID4gMCkKKwkJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplKTsKKwkJa2ZyZWUoYnJkcCk7CisJCXN0bGlfYnJkc1tqXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpc3RhbGxpb25fbW9kdWxlX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0dmFsOworCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHZlcnNpb24gJXNcbiIsIHN0bGlfZHJ2dGl0bGUsIHN0bGlfZHJ2dmVyc2lvbik7CiAKIAlzcGluX2xvY2tfaW5pdCgmc3RsaV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYnJkX2xvY2spOwogCi0Jc3RsaV9pbml0YnJkcygpOwotCi0Jc3RsaV9zZXJpYWwgPSBhbGxvY190dHlfZHJpdmVyKFNUTF9NQVhCUkRTICogU1RMX01BWFBPUlRTKTsKLQlpZiAoIXN0bGlfc2VyaWFsKQotCQlyZXR1cm4gLUVOT01FTTsKLQotLyoKLSAqCUFsbG9jYXRlIGEgdGVtcG9yYXJ5IHdyaXRlIGJ1ZmZlci4KLSAqLwogCXN0bGlfdHhjb29rYnVmID0ga21hbGxvYyhTVExJX1RYQlVGU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdGxpX3R4Y29va2J1ZikKKwlpZiAoIXN0bGlfdHhjb29rYnVmKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgIgogCQkJCSIoc2l6ZT0lZClcbiIsIFNUTElfVFhCVUZTSVpFKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQogCi0vKgotICoJU2V0IHVwIGEgY2hhcmFjdGVyIGRyaXZlciBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uLiBXZSBuZWVkIHRoaXMKLSAqCXRvIGRvd24gbG9hZCB0aGUgc2xhdmUgY29kZSBpbWFnZS4gQWxzbyBpdCBpcyBhIHVzZWZ1bCBkZWJ1Z2dpbmcgdG9vbC4KLSAqLwotCWlmIChyZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIiwgJnN0bGlfZnNpb21lbSkpCi0JCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGZhaWxlZCB0byByZWdpc3RlciBzZXJpYWwgbWVtb3J5ICIKLQkJCQkiZGV2aWNlXG4iKTsKKwlzdGxpX3NlcmlhbCA9IGFsbG9jX3R0eV9kcml2ZXIoU1RMX01BWEJSRFMgKiBTVExfTUFYUE9SVFMpOworCWlmICghc3RsaV9zZXJpYWwpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CiAKLQlpc3RhbGxpb25fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJzdGFsaW9tZW0iKTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQljbGFzc19kZXZpY2VfY3JlYXRlKGlzdGFsbGlvbl9jbGFzcywgTlVMTCwKLQkJCQlNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLAotCQkJCU5VTEwsICJzdGFsaW9tZW0lZCIsIGkpOwotCi0vKgotICoJU2V0IHVwIHRoZSB0dHkgZHJpdmVyIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgdXMgYXMgYSBkcml2ZXIuCi0gKi8KIAlzdGxpX3NlcmlhbC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlzdGxpX3NlcmlhbC0+ZHJpdmVyX25hbWUgPSBzdGxpX2Rydm5hbWU7CiAJc3RsaV9zZXJpYWwtPm5hbWUgPSBzdGxpX3NlcmlhbG5hbWU7CkBAIC00NzA5LDE1ICs0NjA3LDc5IEBACiAJc3RsaV9zZXJpYWwtPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwogCXN0bGlfc2VyaWFsLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOwogCXN0bGlfc2VyaWFsLT5pbml0X3Rlcm1pb3MgPSBzdGxpX2RlZnRlcm1pb3M7Ci0Jc3RsaV9zZXJpYWwtPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwlzdGxpX3NlcmlhbC0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9EWU5BTUlDX0RFVjsKIAl0dHlfc2V0X29wZXJhdGlvbnMoc3RsaV9zZXJpYWwsICZzdGxpX29wcyk7CiAKLQlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihzdGxpX3NlcmlhbCkpIHsKLQkJcHV0X3R0eV9kcml2ZXIoc3RsaV9zZXJpYWwpOworCXJldHZhbCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc3RsaV9zZXJpYWwpOworCWlmIChyZXR2YWwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTVEFMTElPTjogZmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXJcbiIpOwotCQlyZXR1cm4gLUVCVVNZOworCQlnb3RvIGVycl90dHlwdXQ7CiAJfQorCisJcmV0dmFsID0gc3RsaV9pbml0YnJkcygpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX3R0eXVucjsKKworLyoKKyAqCVNldCB1cCBhIGNoYXJhY3RlciBkcml2ZXIgZm9yIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbi4gV2UgbmVlZCB0aGlzCisgKgl0byBkb3duIGxvYWQgdGhlIHNsYXZlIGNvZGUgaW1hZ2UuIEFsc28gaXQgaXMgYSB1c2VmdWwgZGVidWdnaW5nIHRvb2wuCisgKi8KKwlyZXR2YWwgPSByZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIiwgJnN0bGlfZnNpb21lbSk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIG1lbW9yeSAiCisJCQkJImRldmljZVxuIik7CisJCWdvdG8gZXJyX2RlaW5pdDsKKwl9CisKKwlpc3RhbGxpb25fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJzdGFsaW9tZW0iKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQljbGFzc19kZXZpY2VfY3JlYXRlKGlzdGFsbGlvbl9jbGFzcywgTlVMTCwKKwkJCQlNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLAorCQkJCU5VTEwsICJzdGFsaW9tZW0lZCIsIGkpOworCiAJcmV0dXJuIDA7CitlcnJfZGVpbml0OgorCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3RsaV9wY2lkcml2ZXIpOworCWlzdGFsbGlvbl9jbGVhbnVwX2lzYSgpOworZXJyX3R0eXVucjoKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc3RsaV9zZXJpYWwpOworZXJyX3R0eXB1dDoKKwlwdXRfdHR5X2RyaXZlcihzdGxpX3NlcmlhbCk7CitlcnJfZnJlZToKKwlrZnJlZShzdGxpX3R4Y29va2J1Zik7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgaXN0YWxsaW9uX21vZHVsZV9leGl0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGo7CisKKwlwcmludGsoS0VSTl9JTkZPICJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHN0bGlfZHJ2dGl0bGUsCisJCXN0bGlfZHJ2dmVyc2lvbik7CisKKwlpZiAoc3RsaV90aW1lcm9uKSB7CisJCXN0bGlfdGltZXJvbiA9IDA7CisJCWRlbF90aW1lcl9zeW5jKCZzdGxpX3RpbWVybGlzdCk7CisJfQorCisJdW5yZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIik7CisKKwlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorCQljbGFzc19kZXZpY2VfZGVzdHJveShpc3RhbGxpb25fY2xhc3MsIE1LREVWKFNUTF9TSU9NRU1NQUpPUiwKKwkJCQkJaikpOworCWNsYXNzX2Rlc3Ryb3koaXN0YWxsaW9uX2NsYXNzKTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3RsaV9wY2lkcml2ZXIpOworCWlzdGFsbGlvbl9jbGVhbnVwX2lzYSgpOworCisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHN0bGlfc2VyaWFsKTsKKwlwdXRfdHR5X2RyaXZlcihzdGxpX3NlcmlhbCk7CisKKwlrZnJlZShzdGxpX3R4Y29va2J1Zik7Cit9CisKK21vZHVsZV9pbml0KGlzdGFsbGlvbl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpc3RhbGxpb25fbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwppbmRleCAyMGI2YzhiLi43YTZjMWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYworKysgYi9kcml2ZXJzL2NoYXIva2V5Ym9hcmQuYwpAQCAtNzEwLDcgKzcxMCw3IEBACiAKIHN0YXRpYyB2b2lkIGtfY3VyKHN0cnVjdCB2Y19kYXRhICp2YywgdW5zaWduZWQgY2hhciB2YWx1ZSwgY2hhciB1cF9mbGFnKQogewotCXN0YXRpYyBjb25zdCBjaGFyICpjdXJfY2hhcnMgPSAiQkRDQSI7CisJc3RhdGljIGNvbnN0IGNoYXIgY3VyX2NoYXJzW10gPSAiQkRDQSI7CiAKIAlpZiAodXBfZmxhZykKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2xjZC5jIGIvZHJpdmVycy9jaGFyL2xjZC5jCmluZGV4IGRhNjAxZmQuLmQ2NDlhYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9sY2QuYworKysgYi9kcml2ZXJzL2NoYXIvbGNkLmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogCQkJICAgICgmZGlzcGxheSwgKHN0cnVjdCBsY2RfZGlzcGxheSAqKSBhcmcsCiAJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGNkX2Rpc3BsYXkpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJvbSA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MoKDEyOCksIEdGUF9BVE9NSUMpOworCQkJcm9tID0ga21hbGxvYygoMTI4KSwgR0ZQX0FUT01JQyk7CiAJCQlpZiAocm9tID09IE5VTEwpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgTENEICJrbWFsbG9jKCkgZmFpbGVkIGluICVzXG4iLAogCQkJCQkJX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9scC5jIGIvZHJpdmVycy9jaGFyL2xwLmMKaW5kZXggMWVjZWE3ZC4uYjUxZDA4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2xwLmMKKysrIGIvZHJpdmVycy9jaGFyL2xwLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogc3RhdGljIHNzaXplX3QgbHBfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKIAkJICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQ7CiAJY2hhciAqa2J1ZiA9IGxwX3RhYmxlW21pbm9yXS5scF9idWZmZXI7CiAJc3NpemVfdCByZXR2ID0gMDsKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7Ci0JdW5zaWduZWQgaW50IG1pbm9yPWltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJdW5zaWduZWQgaW50IG1pbm9yPWltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGxwX3RhYmxlW21pbm9yXS5kZXYtPnBvcnQ7CiAJc3NpemVfdCByZXR2YWwgPSAwOwogCWNoYXIgKmtidWYgPSBscF90YWJsZVttaW5vcl0ubHBfYnVmZmVyOwpAQCAtNTI1LDcgKzUyNSw3IEBACiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KLQlscF90YWJsZVttaW5vcl0ubHBfYnVmZmVyID0gKGNoYXIgKikga21hbGxvYyhMUF9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlciA9IGttYWxsb2MoTFBfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghbHBfdGFibGVbbWlub3JdLmxwX2J1ZmZlcikgewogCQlMUF9GKG1pbm9yKSAmPSB+TFBfQlVTWTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWVtLmMgYi9kcml2ZXJzL2NoYXIvbWVtLmMKaW5kZXggNTU0NzMzNy4uNGYxODEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9tZW0uYwpAQCAtNjQ2LDcgKzY0Niw4IEBACiAJCQljb3VudCA9IHNpemU7CiAKIAkJemFwX3BhZ2VfcmFuZ2Uodm1hLCBhZGRyLCBjb3VudCwgTlVMTCk7Ci0gICAgICAgIAl6ZXJvbWFwX3BhZ2VfcmFuZ2Uodm1hLCBhZGRyLCBjb3VudCwgUEFHRV9DT1BZKTsKKyAgICAgICAgCWlmICh6ZXJvbWFwX3BhZ2VfcmFuZ2Uodm1hLCBhZGRyLCBjb3VudCwgUEFHRV9DT1BZKSkKKwkJCWJyZWFrOwogCiAJCXNpemUgLT0gY291bnQ7CiAJCWJ1ZiArPSBjb3VudDsKQEAgLTcxMywxMSArNzE0LDE0IEBACiAKIHN0YXRpYyBpbnQgbW1hcF96ZXJvKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQogeworCWludCBlcnI7CisKIAlpZiAodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkKIAkJcmV0dXJuIHNobWVtX3plcm9fc2V0dXAodm1hKTsKLQlpZiAoemVyb21hcF9wYWdlX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpCi0JCXJldHVybiAtRUFHQUlOOwotCXJldHVybiAwOworCWVyciA9IHplcm9tYXBfcGFnZV9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQl2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KTsKKwlCVUdfT04oZXJyID09IC1FRVhJU1QpOworCXJldHVybiBlcnI7CiB9CiAjZWxzZSAvKiBDT05GSUdfTU1VICovCiBzdGF0aWMgc3NpemVfdCByZWFkX3plcm8oc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyICogYnVmLCAKQEAgLTc3NCw3ICs3NzgsNyBAQAogewogCWxvZmZfdCByZXQ7CiAKLQltdXRleF9sb2NrKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoIChvcmlnKSB7CiAJCWNhc2UgMDoKIAkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OwpAQCAtNzg5LDcgKzc5Myw3IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXQgPSAtRUlOVkFMOwogCX0KLQltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF91bmxvY2soJmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk4MCwxMCArOTg0LDEwIEBACiAKIAltZW1fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJtZW0iKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZsaXN0KTsgaSsrKQotCQljbGFzc19kZXZpY2VfY3JlYXRlKG1lbV9jbGFzcywgTlVMTCwKLQkJCQkJTUtERVYoTUVNX01BSk9SLCBkZXZsaXN0W2ldLm1pbm9yKSwKLQkJCQkJTlVMTCwgZGV2bGlzdFtpXS5uYW1lKTsKLQkKKwkJZGV2aWNlX2NyZWF0ZShtZW1fY2xhc3MsIE5VTEwsCisJCQkgICAgICBNS0RFVihNRU1fTUFKT1IsIGRldmxpc3RbaV0ubWlub3IpLAorCQkJICAgICAgZGV2bGlzdFtpXS5uYW1lKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWlzYy5jIGIvZHJpdmVycy9jaGFyL21pc2MuYwppbmRleCA2MmViZTA5Li43ZTk3NWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWlzYy5jCisrKyBiL2RyaXZlcnMvY2hhci9taXNjLmMKQEAgLTE2OSwxMSArMTY5LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKiAKLSAqIFRPRE8gZm9yIDIuNzoKLSAqICAtIGFkZCBhIHN0cnVjdCBrcmVmIHRvIHN0cnVjdCBtaXNjZGV2aWNlIGFuZCBtYWtlIGFsbCB1c2FnZXMgb2YKLSAqICAgIHRoZW0gZHluYW1pYy4KLSAqLwogc3RhdGljIHN0cnVjdCBjbGFzcyAqbWlzY19jbGFzczsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWlzY19mb3BzID0gewpAQCAtMjA0LDYgKzE5OSw4IEBACiAJZGV2X3QgZGV2OwogCWludCBlcnIgPSAwOwogCisJSU5JVF9MSVNUX0hFQUQoJm1pc2MtPmxpc3QpOworCiAJZG93bigmbWlzY19zZW0pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJm1pc2NfbGlzdCwgbGlzdCkgewogCQlpZiAoYy0+bWlub3IgPT0gbWlzYy0+bWlub3IpIHsKQEAgLTIyOCwxMCArMjI1LDEwIEBACiAJCW1pc2NfbWlub3JzW21pc2MtPm1pbm9yID4+IDNdIHw9IDEgPDwgKG1pc2MtPm1pbm9yICYgNyk7CiAJZGV2ID0gTUtERVYoTUlTQ19NQUpPUiwgbWlzYy0+bWlub3IpOwogCi0JbWlzYy0+Y2xhc3MgPSBjbGFzc19kZXZpY2VfY3JlYXRlKG1pc2NfY2xhc3MsIE5VTEwsIGRldiwgbWlzYy0+ZGV2LAorCW1pc2MtPnRoaXNfZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShtaXNjX2NsYXNzLCBtaXNjLT5wYXJlbnQsIGRldiwKIAkJCQkJICAiJXMiLCBtaXNjLT5uYW1lKTsKLQlpZiAoSVNfRVJSKG1pc2MtPmNsYXNzKSkgewotCQllcnIgPSBQVFJfRVJSKG1pc2MtPmNsYXNzKTsKKwlpZiAoSVNfRVJSKG1pc2MtPnRoaXNfZGV2aWNlKSkgeworCQllcnIgPSBQVFJfRVJSKG1pc2MtPnRoaXNfZGV2aWNlKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yNjQsNyArMjYxLDcgQEAKIAogCWRvd24oJm1pc2Nfc2VtKTsKIAlsaXN0X2RlbCgmbWlzYy0+bGlzdCk7Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3kobWlzY19jbGFzcywgTUtERVYoTUlTQ19NQUpPUiwgbWlzYy0+bWlub3IpKTsKKwlkZXZpY2VfZGVzdHJveShtaXNjX2NsYXNzLCBNS0RFVihNSVNDX01BSk9SLCBtaXNjLT5taW5vcikpOwogCWlmIChpIDwgRFlOQU1JQ19NSU5PUlMgJiYgaT4wKSB7CiAJCW1pc2NfbWlub3JzW2k+PjNdICY9IH4oMSA8PCAobWlzYy0+bWlub3IgJiA3KSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21tdGltZXIuYyBiL2RyaXZlcnMvY2hhci9tbXRpbWVyLmMKaW5kZXggMjJiOTkwNS4uYzA5MTYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21tdGltZXIuYworKysgYi9kcml2ZXJzL2NoYXIvbW10aW1lci5jCkBAIC02ODAsNyArNjgwLDcgQEAKIAlpZiAoc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kIDwgMTAwMDAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBkZXRlcm1pbmUgY2xvY2sgZnJlcXVlbmN5XG4iLAogCQkgICAgICAgTU1USU1FUl9OQU1FKTsKLQkJcmV0dXJuIC0xOworCQlnb3RvIG91dDE7CiAJfQogCiAJbW10aW1lcl9mZW10b3BlcmlvZCA9ICgodW5zaWduZWQgbG9uZykxRTE1ICsgc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kIC8KQEAgLTY4OSwxMyArNjg5LDEzIEBACiAJaWYgKHJlcXVlc3RfaXJxKFNHSV9NTVRJTUVSX1ZFQ1RPUiwgbW10aW1lcl9pbnRlcnJ1cHQsIElSUUZfUEVSQ1BVLCBNTVRJTUVSX05BTUUsIE5VTEwpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0LiIsCiAJCQlNTVRJTUVSX05BTUUpOwotCQlyZXR1cm4gLTE7CisJCWdvdG8gb3V0MTsKIAl9CiAKIAlpZiAobWlzY19yZWdpc3RlcigmbW10aW1lcl9taXNjZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlXG4iLAogCQkgICAgICAgTU1USU1FUl9OQU1FKTsKLQkJcmV0dXJuIC0xOworCQlnb3RvIG91dDI7CiAJfQogCiAJLyogR2V0IG1heCBudW1iZXJlZCBub2RlLCBjYWxjdWxhdGUgc2xvdHMgbmVlZGVkICovCkBAIC03MDksMTYgKzcwOSwxOCBAQAogCWlmICh0aW1lcnMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2VcbiIsCiAJCQkJTU1USU1FUl9OQU1FKTsKLQkJcmV0dXJuIC0xOworCQlnb3RvIG91dDM7CiAJfQogCisJbWVtc2V0KHRpbWVycywwLChzaXplb2YobW10aW1lcl90ICopKm1heG4pKTsKKwogCS8qIEFsbG9jYXRlIG1tdGltZXJfdCdzIGZvciBlYWNoIG9ubGluZSBub2RlICovCiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCQl0aW1lcnNbbm9kZV0gPSBrbWFsbG9jX25vZGUoc2l6ZW9mKG1tdGltZXJfdCkqTlVNX0NPTVBBUkFUT1JTLCBHRlBfS0VSTkVMLCBub2RlKTsKIAkJaWYgKHRpbWVyc1tub2RlXSA9PSBOVUxMKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2VcbiIsCiAJCQkJTU1USU1FUl9OQU1FKTsKLQkJCXJldHVybiAtMTsKKwkJCWdvdG8gb3V0NDsKIAkJfQogCQlmb3IgKGk9MDsgaTwgTlVNX0NPTVBBUkFUT1JTOyBpKyspIHsKIAkJCW1tdGltZXJfdCAqIGJhc2UgPSB0aW1lcnNbbm9kZV0gKyBpOwpAQCAtNzM5LDYgKzc0MSwxNyBAQAogCSAgICAgICBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQvKHVuc2lnbmVkIGxvbmcpMUU2KTsKIAogCXJldHVybiAwOworCitvdXQ0OgorCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJa2ZyZWUodGltZXJzW25vZGVdKTsKKwl9CitvdXQzOgorCW1pc2NfZGVyZWdpc3RlcigmbW10aW1lcl9taXNjZGV2KTsKK291dDI6CisJZnJlZV9pcnEoU0dJX01NVElNRVJfVkVDVE9SLCBOVUxMKTsKK291dDE6CisJcmV0dXJuIC0xOwogfQogCiBtb2R1bGVfaW5pdChtbXRpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21veGEuYyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKaW5kZXggYjQwMTM4My4uZjM5MWEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21veGEuYworKysgYi9kcml2ZXJzL2NoYXIvbW94YS5jCkBAIC0xMzAsNiArMTMwLDcgQEAKIHR5cGVkZWYgc3RydWN0IF9tb3hhX3BjaV9kZXZpbmZvIHsKIAl1c2hvcnQgYnVzTnVtOwogCXVzaG9ydCBkZXZOdW07CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiB9IG1veGFfcGNpX2RldmluZm87CiAKIHR5cGVkZWYgc3RydWN0IF9tb3hhX2JvYXJkX2NvbmYgewpAQCAtMjIxLDcgKzIyMiw3IEBACiAvKgogICogc3RhdGljIGZ1bmN0aW9uczoKICAqLwotc3RhdGljIHZvaWQgZG9fbW94YV9zb2Z0aW50KHZvaWQgKik7CitzdGF0aWMgdm9pZCBkb19tb3hhX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICopOwogc3RhdGljIGludCBtb3hhX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgdm9pZCBtb3hhX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIGludCBtb3hhX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKQEAgLTIzMyw3ICsyMzQsNyBAQAogc3RhdGljIGludCBtb3hhX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgdm9pZCBtb3hhX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICopOwogc3RhdGljIHZvaWQgbW94YV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICopOwotc3RhdGljIHZvaWQgbW94YV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvcyAqKTsKK3N0YXRpYyB2b2lkIG1veGFfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGt0ZXJtaW9zICopOwogc3RhdGljIHZvaWQgbW94YV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICopOwogc3RhdGljIHZvaWQgbW94YV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIG1veGFfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICopOwpAQCAtMjYwLDcgKzI2MSw3IEBACiBzdGF0aWMgdm9pZCBNb3hhUG9ydERpc2FibGUoaW50KTsKIHN0YXRpYyBsb25nIE1veGFQb3J0R2V0TWF4QmF1ZChpbnQpOwogc3RhdGljIGxvbmcgTW94YVBvcnRTZXRCYXVkKGludCwgbG9uZyk7Ci1zdGF0aWMgaW50IE1veGFQb3J0U2V0VGVybWlvKGludCwgc3RydWN0IHRlcm1pb3MgKiwgc3BlZWRfdCk7CitzdGF0aWMgaW50IE1veGFQb3J0U2V0VGVybWlvKGludCwgc3RydWN0IGt0ZXJtaW9zICosIHNwZWVkX3QpOwogc3RhdGljIGludCBNb3hhUG9ydEdldExpbmVPdXQoaW50LCBpbnQgKiwgaW50ICopOwogc3RhdGljIHZvaWQgTW94YVBvcnRMaW5lQ3RybChpbnQsIGludCwgaW50KTsKIHN0YXRpYyB2b2lkIE1veGFQb3J0Rmxvd0N0cmwoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7CkBAIC0zMjQsNiArMzI1LDkgQEAKIAlib2FyZC0+YnVzVHlwZSA9IE1PWEFfQlVTX1RZUEVfUENJOwogCWJvYXJkLT5wY2lJbmZvLmJ1c051bSA9IHAtPmJ1cy0+bnVtYmVyOwogCWJvYXJkLT5wY2lJbmZvLmRldk51bSA9IHAtPmRldmZuID4+IDM7CisJYm9hcmQtPnBjaUluZm8ucGRldiA9IHA7CisJLyogZG9uJ3QgbG9zZSB0aGUgcmVmZXJlbmNlIGluIHRoZSBuZXh0IHBjaV9nZXRfZGV2aWNlIGl0ZXJhdGlvbiAqLworCXBjaV9kZXZfZ2V0KHApOwogCiAJcmV0dXJuICgwKTsKIH0KQEAgLTM1MSw2ICszNTUsOCBAQAogCW1veGFEcml2ZXItPmluaXRfdGVybWlvcy5jX29mbGFnID0gMDsKIAltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBDTE9DQUwgfCBIVVBDTDsKIAltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MuY19sZmxhZyA9IDA7CisJbW94YURyaXZlci0+aW5pdF90ZXJtaW9zLmNfaXNwZWVkID0gOTYwMDsKKwltb3hhRHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOwogCW1veGFEcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKIAl0dHlfc2V0X29wZXJhdGlvbnMobW94YURyaXZlciwgJm1veGFfb3BzKTsKIApAQCAtMzU5LDcgKzM2NSw3IEBACiAJZm9yIChpID0gMCwgY2ggPSBtb3hhQ2hhbm5lbHM7IGkgPCBNQVhfUE9SVFM7IGkrKywgY2grKykgewogCQljaC0+dHlwZSA9IFBPUlRfMTY1NTBBOwogCQljaC0+cG9ydCA9IGk7Ci0JCUlOSVRfV09SSygmY2gtPnRxdWV1ZSwgZG9fbW94YV9zb2Z0aW50LCBjaCk7CisJCUlOSVRfV09SSygmY2gtPnRxdWV1ZSwgZG9fbW94YV9zb2Z0aW50KTsKIAkJY2gtPnR0eSA9IE5VTEw7CiAJCWNoLT5jbG9zZV9kZWxheSA9IDUgKiBIWiAvIDEwOwogCQljaC0+Y2xvc2luZ193YWl0ID0gMzAgKiBIWjsKQEAgLTQ5Myw2ICs0OTksMTQgQEAKIAlpZiAodHR5X3VucmVnaXN0ZXJfZHJpdmVyKG1veGFEcml2ZXIpKQogCQlwcmludGsoIkNvdWxkbid0IHVucmVnaXN0ZXIgTU9YQSBJbnRlbGxpbyBmYW1pbHkgc2VyaWFsIGRyaXZlclxuIik7CiAJcHV0X3R0eV9kcml2ZXIobW94YURyaXZlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JPQVJEUzsgaSsrKSB7CisJCWlmIChtb3hhQmFzZUFkZHJbaV0pCisJCQlpb3VubWFwKG1veGFCYXNlQWRkcltpXSk7CisJCWlmIChtb3hhX2JvYXJkc1tpXS5idXNUeXBlID09IE1PWEFfQlVTX1RZUEVfUENJKQorCQkJcGNpX2Rldl9wdXQobW94YV9ib2FyZHNbaV0ucGNpSW5mby5wZGV2KTsKKwl9CisKIAlpZiAodmVyYm9zZSkKIAkJcHJpbnRrKCJEb25lXG4iKTsKIH0KQEAgLTUwMCw5ICs1MTQsOSBAQAogbW9kdWxlX2luaXQobW94YV9pbml0KTsKIG1vZHVsZV9leGl0KG1veGFfZXhpdCk7CiAKLXN0YXRpYyB2b2lkIGRvX21veGFfc29mdGludCh2b2lkICpwcml2YXRlXykKK3N0YXRpYyB2b2lkIGRvX21veGFfc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG1veGFfc3RyICpjaCA9IChzdHJ1Y3QgbW94YV9zdHIgKikgcHJpdmF0ZV87CisJc3RydWN0IG1veGFfc3RyICpjaCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbW94YV9zdHIsIHRxdWV1ZSk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCWlmIChjaCAmJiAodHR5ID0gY2gtPnR0eSkpIHsKQEAgLTg1Miw3ICs4NjYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBtb3hhX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCQkgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKKwkJCSAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgbW94YV9zdHIgKmNoID0gKHN0cnVjdCBtb3hhX3N0ciAqKSB0dHktPmRyaXZlcl9kYXRhOwogCkBAIC05NjYsNyArOTgwLDcgQEAKIAogc3RhdGljIHZvaWQgc2V0X3R0eV9wYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXJlZ2lzdGVyIHN0cnVjdCB0ZXJtaW9zICp0czsKKwlyZWdpc3RlciBzdHJ1Y3Qga3Rlcm1pb3MgKnRzOwogCXN0cnVjdCBtb3hhX3N0ciAqY2g7CiAJaW50IHJ0cywgY3RzLCB0eGZsb3csIHJ4ZmxvdywgeGFueTsKIApAQCAtMTEzNyw3ICsxMTUxLDcgQEAKIHN0YXRpYyB2b2lkIHJlY2VpdmVfZGF0YShzdHJ1Y3QgbW94YV9zdHIgKmNoKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0cDsKLQlzdHJ1Y3QgdGVybWlvcyAqdHM7CisJc3RydWN0IGt0ZXJtaW9zICp0czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJdHMgPSBOVUxMOwpAQCAtMTkwMCw5ICsxOTE0LDkgQEAKICAqCiAgKiAgICAgIEZ1bmN0aW9uIDEyOiAgICBDb25maWd1cmUgdGhlIHBvcnQuCiAgKiAgICAgIFN5bnRheDoKLSAqICAgICAgaW50ICBNb3hhUG9ydFNldFRlcm1pbyhpbnQgcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pbywgc3BlZWRfdCBiYXVkKTsKKyAqICAgICAgaW50ICBNb3hhUG9ydFNldFRlcm1pbyhpbnQgcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW8sIHNwZWVkX3QgYmF1ZCk7CiAgKiAgICAgICAgICAgaW50IHBvcnQgICAgICAgICAgIDogcG9ydCBudW1iZXIgKDAgLSAxMjcpCi0gKiAgICAgICAgICAgc3RydWN0IHRlcm1pb3MgKiB0ZXJtaW8gOiB0ZXJtaW8gc3RydWN0dXJlIHBvaW50ZXIKKyAqICAgICAgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKiB0ZXJtaW8gOiB0ZXJtaW8gc3RydWN0dXJlIHBvaW50ZXIKICAqCSAgICAgc3BlZWRfdCBiYXVkCTogYmF1ZCByYXRlCiAgKgogICogICAgICAgICAgIHJldHVybjogICAgLTEgICAgICA6IHRoaXMgcG9ydCBpcyBpbnZhbGlkIG9yIHRlcm1pbyA9PSBOVUxMCkBAIC0yMTgzLDcgKzIxOTcsNyBAQAogCXJldHVybiAoYmF1ZCk7CiB9CiAKLWludCBNb3hhUG9ydFNldFRlcm1pbyhpbnQgcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pbywgc3BlZWRfdCBiYXVkKQoraW50IE1veGFQb3J0U2V0VGVybWlvKGludCBwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pbywgc3BlZWRfdCBiYXVkKQogewogCXZvaWQgX19pb21lbSAqb2ZzQWRkcjsKIAl0Y2ZsYWdfdCBjZmxhZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tc3BlYy5jIGIvZHJpdmVycy9jaGFyL21zcGVjLmMKaW5kZXggNWMwZGVjMy4uMjM1ZTg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21zcGVjLmMKKysrIGIvZHJpdmVycy9jaGFyL21zcGVjLmMKQEAgLTcyLDcgKzcyLDExIEBACiAJTVNQRUNfVU5DQUNIRUQKIH07CiAKKyNpZmRlZiBDT05GSUdfU0dJX1NOCiBzdGF0aWMgaW50IGlzX3NuMjsKKyNlbHNlCisjZGVmaW5lIGlzX3NuMgkJMAorI2VuZGlmCiAKIC8qCiAgKiBPbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBhbGxvY2F0ZWQgd2hlbiBhbiBtc3BlYyByZWdpb24gaXMgbW1hcGVkLiBUaGUKQEAgLTIxMSw3ICsyMTUsNyBAQAogCWlmICh2ZGF0YS0+dHlwZSA9PSBNU1BFQ19GRVRDSE9QKQogCQlwYWRkciA9IFRPX0FNTyhtYWRkcik7CiAJZWxzZQotCQlwYWRkciA9IF9fcGEoVE9fQ0FDKG1hZGRyKSk7CisJCXBhZGRyID0gbWFkZHIgJiB+X19JQTY0X1VOQ0FDSEVEX09GRlNFVDsKIAogCXBmbiA9IHBhZGRyID4+IFBBR0VfU0hJRlQ7CiAKQEAgLTMzNSw2ICszMzksNyBAQAogCSAqIFRoZSBmZXRjaG9wIGRldmljZSBvbmx5IHdvcmtzIG9uIFNOMiBoYXJkd2FyZSwgdW5jYWNoZWQgYW5kIGNhY2hlZAogCSAqIG1lbW9yeSBkcml2ZXJzIHNob3VsZCBib3RoIGJlIHZhbGlkIG9uIGFsbCBpYTY0IGhhcmR3YXJlCiAJICovCisjaWZkZWYgQ09ORklHX1NHSV9TTgogCWlmIChpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkgewogCQlpc19zbjIgPSAxOwogCQlpZiAoaXNfc2h1YjIoKSkgewpAQCAtMzYzLDYgKzM2OCw3IEBACiAJCQlnb3RvIGZyZWVfc2NyYXRjaF9wYWdlczsKIAkJfQogCX0KKyNlbmRpZgogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmNhY2hlZF9taXNjZGV2KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgJWlcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXIuYyBiL2RyaXZlcnMvY2hhci9teHNlci5jCmluZGV4IDA0OGQ5MTEuLmMwNjMzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9teHNlci5jCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5jCkBAIC0zMjgsOCArMzI4LDggQEAKIAlpbnQgeG1pdF90YWlsOwogCWludCB4bWl0X2NudDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHF1ZXVlOwotCXN0cnVjdCB0ZXJtaW9zIG5vcm1hbF90ZXJtaW9zOwotCXN0cnVjdCB0ZXJtaW9zIGNhbGxvdXRfdGVybWlvczsKKwlzdHJ1Y3Qga3Rlcm1pb3Mgbm9ybWFsX3Rlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zIGNhbGxvdXRfdGVybWlvczsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgY2xvc2Vfd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBkZWx0YV9tc3Jfd2FpdDsKQEAgLTM2NCw4ICszNjQsOCBAQAogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpteHZhcl9zZHJpdmVyOwogc3RhdGljIHN0cnVjdCBteHNlcl9zdHJ1Y3QgbXh2YXJfdGFibGVbTVhTRVJfUE9SVFNdOwogc3RhdGljIHN0cnVjdCB0dHlfc3RydWN0ICpteHZhcl90dHlbTVhTRVJfUE9SVFMgKyAxXTsKLXN0YXRpYyBzdHJ1Y3QgdGVybWlvcyAqbXh2YXJfdGVybWlvc1tNWFNFUl9QT1JUUyArIDFdOwotc3RhdGljIHN0cnVjdCB0ZXJtaW9zICpteHZhcl90ZXJtaW9zX2xvY2tlZFtNWFNFUl9QT1JUUyArIDFdOworc3RhdGljIHN0cnVjdCBrdGVybWlvcyAqbXh2YXJfdGVybWlvc1tNWFNFUl9QT1JUUyArIDFdOworc3RhdGljIHN0cnVjdCBrdGVybWlvcyAqbXh2YXJfdGVybWlvc19sb2NrZWRbTVhTRVJfUE9SVFMgKyAxXTsKIHN0YXRpYyBzdHJ1Y3QgbXhzZXJfbG9nIG14dmFyX2xvZzsKIHN0YXRpYyBpbnQgbXh2YXJfZGlhZ2ZsYWc7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBteHNlcl9tc3JbTVhTRVJfUE9SVFMgKyAxXTsKQEAgLTM4OSw3ICszODksNyBAQAogLyogc3RhdGljIHZvaWQgICBteHNlcl9wb2xsKHVuc2lnbmVkIGxvbmcpOyAqLwogc3RhdGljIGludCBteHNlcl9nZXRfSVNBX2NvbmYoaW50LCBzdHJ1Y3QgbXhzZXJfaHdjb25mICopOwogc3RhdGljIGludCBteHNlcl9nZXRfUENJX2NvbmYoaW50LCBpbnQsIGludCwgc3RydWN0IG14c2VyX2h3Y29uZiAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX2RvX3NvZnRpbnQodm9pZCAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX2RvX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICopOwogc3RhdGljIGludCBteHNlcl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIHZvaWQgbXhzZXJfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgaW50IG14c2VyX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKQEAgLTQwMiw3ICs0MDIsNyBAQAogc3RhdGljIGludCBteHNlcl9pb2N0bF9zcGVjaWFsKHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CiBzdGF0aWMgdm9pZCBteHNlcl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIG14c2VyX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKik7Ci1zdGF0aWMgdm9pZCBteHNlcl9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdGVybWlvcyAqKTsKK3N0YXRpYyB2b2lkIG14c2VyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBrdGVybWlvcyAqKTsKIHN0YXRpYyB2b2lkIG14c2VyX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKik7CiBzdGF0aWMgdm9pZCBteHNlcl9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIG14c2VyX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKQEAgLTQxNCw3ICs0MTQsNyBAQAogc3RhdGljIGludCBteHNlcl9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwgc3RydWN0IG14c2VyX3N0cnVjdCAqKTsKIHN0YXRpYyBpbnQgbXhzZXJfc3RhcnR1cChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopOwogc3RhdGljIHZvaWQgbXhzZXJfc2h1dGRvd24oc3RydWN0IG14c2VyX3N0cnVjdCAqKTsKLXN0YXRpYyBpbnQgbXhzZXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKTsKK3N0YXRpYyBpbnQgbXhzZXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyk7CiBzdGF0aWMgaW50IG14c2VyX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKTsKIHN0YXRpYyBpbnQgbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopOwogc3RhdGljIGludCBteHNlcl9nZXRfbHNyX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqLCB1bnNpZ25lZCBpbnQgX191c2VyICopOwpAQCAtNTE1LDYgKzUxNSw3IEBACiAJCQlpZiAocGRldiAhPSBOVUxMKSB7CS8qIFBDSSAqLwogCQkJCXJlbGVhc2VfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7CiAJCQkJcmVsZWFzZV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpKTsKKwkJCQlwY2lfZGV2X3B1dChwZGV2KTsKIAkJCX0gZWxzZSB7CiAJCQkJcmVsZWFzZV9yZWdpb24obXhzZXJjZmdbaV0uaW9hZGRyWzBdLCA4ICogbXhzZXJjZmdbaV0ucG9ydHMpOwogCQkJCXJlbGVhc2VfcmVnaW9uKG14c2VyY2ZnW2ldLnZlY3RvciwgMSk7CkBAIC01NTYsNyArNTU3LDcgQEAKIAluID0gYm9hcmQgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7CiAJaW5mbyA9ICZteHZhcl90YWJsZVtuXTsKIAkvKmlmICh2ZXJib3NlKSAqLyAgewotCQlwcmludGsoS0VSTl9ERUJVRyAiICAgICAgICB0dHlNJWQgLSB0dHlNJWQgIiwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICAgdHR5TUklZCAtIHR0eU1JJWQgIiwKIAkJCW4sIG4gKyBod2NvbmYtPnBvcnRzIC0gMSk7CiAJCXByaW50aygiIG1heC4gYmF1ZCByYXRlID0gJWQgYnBzLlxuIiwKIAkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbMF0pOwpAQCAtNTkwLDcgKzU5MSw3IEBACiAJCWluZm8tPmN1c3RvbV9kaXZpc29yID0gaHdjb25mLT5iYXVkX2Jhc2VbaV0gKiAxNjsKIAkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1ICogSFogLyAxMDsKIAkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAgKiBIWjsKLQkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWUsIG14c2VyX2RvX3NvZnRpbnQsIGluZm8pOworCQlJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgbXhzZXJfZG9fc29mdGludCk7CiAJCWluZm8tPm5vcm1hbF90ZXJtaW9zID0gbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKQEAgLTcxNyw3ICs3MTgsNyBAQAogCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCiAJbWVtc2V0KG14dmFyX3Nkcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOwogCW14dmFyX3Nkcml2ZXItPm1hZ2ljID0gVFRZX0RSSVZFUl9NQUdJQzsKLQlteHZhcl9zZHJpdmVyLT5uYW1lID0gInR0eU0iOworCW14dmFyX3Nkcml2ZXItPm5hbWUgPSAidHR5TUkiOwogCW14dmFyX3Nkcml2ZXItPm1ham9yID0gdHR5bWFqb3I7CiAJbXh2YXJfc2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOwogCW14dmFyX3Nkcml2ZXItPm51bSA9IE1YU0VSX1BPUlRTICsgMTsKQEAgLTcyNSw2ICs3MjYsOCBAQAogCW14dmFyX3Nkcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CiAJbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwogCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDB8Q1M4fENSRUFEfEhVUENMfENMT0NBTDsKKwlteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSA5NjAwOworCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcy5jX29zcGVlZCA9IDk2MDA7CiAJbXh2YXJfc2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwogCXR0eV9zZXRfb3BlcmF0aW9ucyhteHZhcl9zZHJpdmVyLCAmbXhzZXJfb3BzKTsKIAlteHZhcl9zZHJpdmVyLT50dHlzID0gbXh2YXJfdHR5OwpAQCAtODM5LDkgKzg0Miw5IEBACiAJaW5kZXggPSAwOwogCWIgPSAwOwogCXdoaWxlIChiIDwgbikgewotCQlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKG14c2VyX3BjaWJyZHNbYl0udmVuZG9yLAorCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UobXhzZXJfcGNpYnJkc1tiXS52ZW5kb3IsCiAJCQkJbXhzZXJfcGNpYnJkc1tiXS5kZXZpY2UsIHBkZXYpOwotCQkJaWYgKHBkZXYgPT0gTlVMTCkgeworCQlpZiAocGRldiA9PSBOVUxMKSB7CiAJCQliKys7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtODkzLDYgKzg5Niw5IEBACiAJCQlpZiAobXhzZXJfaW5pdGJyZChtLCAmaHdjb25mKSA8IDApCiAJCQkJY29udGludWU7CiAJCQltKys7CisJCQkvKiBLZWVwIGFuIGV4dHJhIHJlZmVyZW5jZSBpZiB3ZSBzdWNjZWVkZWQuIEl0IHdpbGwKKwkJCSAgIGJlIHJldHVybmVkIGF0IHVubG9hZCB0aW1lICovCisJCQlwY2lfZGV2X2dldChwZGV2KTsKIAkJfQogCX0KICNlbmRpZgpAQCAtOTE3LDkgKzkyMywxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBteHNlcl9kb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKQorc3RhdGljIHZvaWQgbXhzZXJfZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHByaXZhdGVfOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG14c2VyX3N0cnVjdCwgdHF1ZXVlKTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCiAJdHR5ID0gaW5mby0+dHR5OwpAQCAtOTkzLDcgKzEwMDAsNyBAQAogCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CiAJfQogCi0JaW5mby0+c2Vzc2lvbiA9IGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbjsKKwlpbmZvLT5zZXNzaW9uID0gcHJvY2Vzc19zZXNzaW9uKGN1cnJlbnQpOwogCWluZm8tPnBncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOwogCiAJLyoKQEAgLTE3NDQsNyArMTc1MSw3IEBACiAJLyogTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7ICovCiB9CiAKLXN0YXRpYyB2b2lkIG14c2VyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIG14c2VyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI1MzYsNyArMjU0Myw3IEBACiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHNldCB0aGUgVUFSVCBkaXZpc29yIHJlZ2lzdGVycyB0byBtYXRjaAogICogdGhlIHNwZWNpZmllZCBiYXVkIHJhdGUgZm9yIGEgc2VyaWFsIHBvcnQuCiAgKi8KLXN0YXRpYyBpbnQgbXhzZXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyBpbnQgbXhzZXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJdW5zaWduZWQgY2ZsYWcsIGN2YWwsIGZjcjsKIAlpbnQgcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlcl9uZXcuYyBiL2RyaXZlcnMvY2hhci9teHNlcl9uZXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDk4OWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL214c2VyX25ldy5jCkBAIC0wLDAgKzEsMjgxMiBAQAorLyoKKyAqICAgICAgICAgIG14c2VyLmMgIC0tIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgTW94YSBUZWNobm9sb2dpZXMgKHN1cHBvcnRAbW94YS5jb20udHcpLgorICoJQ29weXJpZ2h0IChDKSAyMDA2ICAgICAgIEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CisgKgorICogICAgICBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgMS44IG1veGEgZHJpdmVyIHdoaWNoIGlzIGJhc2VkIG9uCisgKglMaW51eCBzZXJpYWwgZHJpdmVyLCB3cml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzLCBUaGVvZG9yZSBUJ3NvIGFuZAorICoJb3RoZXJzLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglGZWQgdGhyb3VnaCBhIGNsZWFudXAsIGluZGVudCBhbmQgcmVtb3ZlIG9mIG5vbiAyLjYgY29kZSBieSBBbGFuIENveAorICoJPGFsYW5AcmVkaGF0LmNvbT4uIFRoZSBvcmlnaW5hbCAxLjggY29kZSBpcyBhdmFpbGFibGUgb24gd3d3Lm1veGEuY29tLgorICoJLSBGaXhlZCB4ODZfNjQgY2xlYW5uZXNzCisgKgktIEZpeGVkIHNsZWVwIHdpdGggc3BpbmxvY2sgaGVsZCBpbiBteHNlcl9zZW5kX2JyZWFrCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIm14c2VyX25ldy5oIgorCisjZGVmaW5lCU1YU0VSX1ZFUlNJT04JIjIuMCIKKyNkZWZpbmUJTVhTRVJNQUpPUgkgMTc0CisjZGVmaW5lCU1YU0VSQ1VNQUpPUgkgMTc1CisKKyNkZWZpbmUJTVhTRVJfRVZFTlRfVFhMT1cJMQorCisjZGVmaW5lIE1YU0VSX0JPQVJEUwkJNAkvKiBNYXguIGJvYXJkcyAqLworI2RlZmluZSBNWFNFUl9QT1JUU19QRVJfQk9BUkQJOAkvKiBNYXguIHBvcnRzIHBlciBib2FyZCAqLworI2RlZmluZSBNWFNFUl9QT1JUUwkJKE1YU0VSX0JPQVJEUyAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRCkKKyNkZWZpbmUgTVhTRVJfSVNSX1BBU1NfTElNSVQJOTk5OTlMCisKKyNkZWZpbmUJTVhTRVJfRVJSX0lPQUREUgktMQorI2RlZmluZQlNWFNFUl9FUlJfSVJRCQktMgorI2RlZmluZQlNWFNFUl9FUlJfSVJRX0NPTkZMSVQJLTMKKyNkZWZpbmUJTVhTRVJfRVJSX1ZFQ1RPUgktNAorCisjZGVmaW5lIFdBS0VVUF9DSEFSUwkJMjU2CisKKyNkZWZpbmUgVUFSVF9NQ1JfQUZFCQkweDIwCisjZGVmaW5lIFVBUlRfTFNSX1NQRUNJQUwJMHgxRQorCisjZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKQkoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLfFwKKwkJCQkJICBJWE9OfElYT0ZGKSkKKworI2RlZmluZSBDMTY4X0FTSUNfSUQgICAgMQorI2RlZmluZSBDMTA0X0FTSUNfSUQgICAgMgorI2RlZmluZSBDMTAyX0FTSUNfSUQJMHhCCisjZGVmaW5lIENJMTMyX0FTSUNfSUQJNAorI2RlZmluZSBDSTEzNF9BU0lDX0lECTMKKyNkZWZpbmUgQ0kxMDRKX0FTSUNfSUQgIDUKKworI2RlZmluZSBNWFNFUl9ISUdIQkFVRAkxCisjZGVmaW5lIE1YU0VSX0hBUzIJMgorCisvKiBUaGlzIGlzIG9ubHkgZm9yIFBDSSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IHR5cGU7CisJaW50IHR4X2ZpZm87CisJaW50IHJ4X2ZpZm87CisJaW50IHhtaXRfZmlmb19zaXplOworCWludCByeF9oaWdoX3dhdGVyOworCWludCByeF90cmlnZ2VyOworCWludCByeF9sb3dfd2F0ZXI7CisJbG9uZyBtYXhfYmF1ZDsKK30gR3BjaV91YXJ0X2luZm9bXSA9IHsKKwl7TU9YQV9PVEhFUl9VQVJULCAxNiwgMTYsIDE2LCAxNCwgMTQsIDEsIDkyMTYwMEx9LAorCXtNT1hBX01VU1RfTVUxNTBfSFdJRCwgNjQsIDY0LCA2NCwgNDgsIDQ4LCAxNiwgMjMwNDAwTH0sCisJe01PWEFfTVVTVF9NVTg2MF9IV0lELCAxMjgsIDEyOCwgMTI4LCA5NiwgOTYsIDMyLCA5MjE2MDBMfQorfTsKKyNkZWZpbmUgVUFSVF9JTkZPX05VTQlBUlJBWV9TSVpFKEdwY2lfdWFydF9pbmZvKQorCitzdHJ1Y3QgbXhzZXJfY2FyZGluZm8geworCXVuc2lnbmVkIGludCBucG9ydHM7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14c2VyX2NhcmRpbmZvIG14c2VyX2NhcmRzW10gPSB7CisJeyA4LCAiQzE2OCBzZXJpZXMiLCB9LAkJCS8qIEMxNjgtSVNBICovCisJeyA0LCAiQzEwNCBzZXJpZXMiLCB9LAkJCS8qIEMxMDQtSVNBICovCisJeyA0LCAiQ0ktMTA0SiBzZXJpZXMiLCB9LAkJLyogQ0kxMDRKICovCisJeyA4LCAiQzE2OEgvUENJIHNlcmllcyIsIH0sCQkvKiBDMTY4LVBDSSAqLworCXsgNCwgIkMxMDRIL1BDSSBzZXJpZXMiLCB9LAkJLyogQzEwNC1QQ0kgKi8KKwl7IDQsICJDMTAyIHNlcmllcyIsIE1YU0VSX0hBUzIgfSwJLyogQzEwMi1JU0EgKi8KKwl7IDQsICJDSS0xMzIgc2VyaWVzIiwgTVhTRVJfSEFTMiB9LAkvKiBDSTEzMiAqLworCXsgNCwgIkNJLTEzNCBzZXJpZXMiLCB9LAkJLyogQ0kxMzQgKi8KKwl7IDIsICJDUC0xMzIgc2VyaWVzIiwgfSwJCS8qIENQMTMyICovCisJeyA0LCAiQ1AtMTE0IHNlcmllcyIsIH0sCQkvKiBDUDExNCAqLworCXsgNCwgIkNULTExNCBzZXJpZXMiLCB9LAkJLyogQ1QxMTQgKi8KKwl7IDIsICJDUC0xMDIgc2VyaWVzIiwgTVhTRVJfSElHSEJBVUQgfSwJLyogQ1AxMDIgKi8KKwl7IDQsICJDUC0xMDRVIHNlcmllcyIsIH0sCQkvKiBDUDEwNFUgKi8KKwl7IDgsICJDUC0xNjhVIHNlcmllcyIsIH0sCQkvKiBDUDE2OFUgKi8KKwl7IDIsICJDUC0xMzJVIHNlcmllcyIsIH0sCQkvKiBDUDEzMlUgKi8KKwl7IDQsICJDUC0xMzRVIHNlcmllcyIsIH0sCQkvKiBDUDEzNFUgKi8KKwl7IDQsICJDUC0xMDRKVSBzZXJpZXMiLCB9LAkJLyogQ1AxMDRKVSAqLworCXsgOCwgIk1veGEgVUM3MDAwIFNlcmlhbCIsIH0sCQkvKiBSQzcwMDAgKi8KKwl7IDgsICJDUC0xMThVIHNlcmllcyIsIH0sCQkvKiBDUDExOFUgKi8KKwl7IDIsICJDUC0xMDJVTCBzZXJpZXMiLCB9LAkJLyogQ1AxMDJVTCAqLworCXsgMiwgIkNQLTEwMlUgc2VyaWVzIiwgfSwJCS8qIENQMTAyVSAqLworCXsgOCwgIkNQLTExOEVMIHNlcmllcyIsIH0sCQkvKiBDUDExOEVMICovCisJeyA4LCAiQ1AtMTY4RUwgc2VyaWVzIiwgfSwJCS8qIENQMTY4RUwgKi8KKwl7IDQsICJDUC0xMDRFTCBzZXJpZXMiLCB9CQkvKiBDUDEwNEVMICovCit9OworCisvKiBkcml2ZXJfZGF0YSBjb3JyZXNwb25kIHRvIHRoZSBsaW5lcyBpbiB0aGUgc3RydWN0dXJlIGFib3ZlCisgICBzZWUgYWxzbyBJU0EgcHJvYmUgZnVuY3Rpb24gYmVmb3JlIHlvdSBjaGFuZ2Ugc29tZXRoaW5nICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbXhzZXJfcGNpYnJkc1tdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTY4KSwKKwkJLmRyaXZlcl9kYXRhID0gMyB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTA0KSwKKwkJLmRyaXZlcl9kYXRhID0gNCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzMiksCisJCS5kcml2ZXJfZGF0YSA9IDggfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMTQpLAorCQkuZHJpdmVyX2RhdGEgPSA5IH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NUMTE0KSwKKwkJLmRyaXZlcl9kYXRhID0gMTAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDIpLAorCQkuZHJpdmVyX2RhdGEgPSAxMSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwNFUpLAorCQkuZHJpdmVyX2RhdGEgPSAxMiB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDE2OFUpLAorCQkuZHJpdmVyX2RhdGEgPSAxMyB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzMlUpLAorCQkuZHJpdmVyX2RhdGEgPSAxNCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzNFUpLAorCQkuZHJpdmVyX2RhdGEgPSAxNSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwNEpVKSwKKwkJLmRyaXZlcl9kYXRhID0gMTYgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfUkM3MDAwKSwKKwkJLmRyaXZlcl9kYXRhID0gMTcgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMThVKSwKKwkJLmRyaXZlcl9kYXRhID0gMTggfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDJVTCksCisJCS5kcml2ZXJfZGF0YSA9IDE5IH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTAyVSksCisJCS5kcml2ZXJfZGF0YSA9IDIwIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTE4RUwpLAorCQkuZHJpdmVyX2RhdGEgPSAyMSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDE2OEVMKSwKKwkJLmRyaXZlcl9kYXRhID0gMjIgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDRFTCksCisJCS5kcml2ZXJfZGF0YSA9IDIzIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG14c2VyX3BjaWJyZHMpOworCitzdGF0aWMgaW50IGlvYWRkcltNWFNFUl9CT0FSRFNdID0geyAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IHR0eW1ham9yID0gTVhTRVJNQUpPUjsKK3N0YXRpYyBpbnQgY2FsbG91dG1ham9yID0gTVhTRVJDVU1BSk9SOworCisvKiBWYXJpYWJsZXMgZm9yIGluc21vZCAqLworCitNT0RVTEVfQVVUSE9SKCJDYXNwZXIgWWFuZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gRmFtaWx5IE11bHRpcG9ydCBCb2FyZCBEZXZpY2UgRHJpdmVyIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW9hZGRyLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHR0eW1ham9yLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgbXhzZXJfbG9nIHsKKwlpbnQgdGljazsKKwl1bnNpZ25lZCBsb25nIHJ4Y250W01YU0VSX1BPUlRTXTsKKwl1bnNpZ25lZCBsb25nIHR4Y250W01YU0VSX1BPUlRTXTsKK307CisKKworc3RydWN0IG14c2VyX21vbiB7CisJdW5zaWduZWQgbG9uZyByeGNudDsKKwl1bnNpZ25lZCBsb25nIHR4Y250OworCXVuc2lnbmVkIGxvbmcgdXBfcnhjbnQ7CisJdW5zaWduZWQgbG9uZyB1cF90eGNudDsKKwlpbnQgbW9kZW1fc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgaG9sZF9yZWFzb247Cit9OworCitzdHJ1Y3QgbXhzZXJfbW9uX2V4dCB7CisJdW5zaWduZWQgbG9uZyByeF9jbnRbMzJdOworCXVuc2lnbmVkIGxvbmcgdHhfY250WzMyXTsKKwl1bnNpZ25lZCBsb25nIHVwX3J4Y250WzMyXTsKKwl1bnNpZ25lZCBsb25nIHVwX3R4Y250WzMyXTsKKwlpbnQgbW9kZW1fc3RhdHVzWzMyXTsKKworCWxvbmcgYmF1ZHJhdGVbMzJdOworCWludCBkYXRhYml0c1szMl07CisJaW50IHN0b3BiaXRzWzMyXTsKKwlpbnQgcGFyaXR5WzMyXTsKKwlpbnQgZmxvd2N0cmxbMzJdOworCWludCBmaWZvWzMyXTsKKwlpbnQgaWZ0eXBlWzMyXTsKK307CisKK3N0cnVjdCBteHNlcl9ib2FyZDsKKworc3RydWN0IG14c2VyX3BvcnQgeworCXN0cnVjdCBteHNlcl9ib2FyZCAqYm9hcmQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCXVuc2lnbmVkIGxvbmcgb3Btb2RlX2lvYWRkcjsKKwlpbnQgbWF4X2JhdWQ7CisKKwlpbnQgcnhfaGlnaF93YXRlcjsKKwlpbnQgcnhfdHJpZ2dlcjsJCS8qIFJ4IGZpZm8gdHJpZ2dlciBsZXZlbCAqLworCWludCByeF9sb3dfd2F0ZXI7CisJaW50IGJhdWRfYmFzZTsJCS8qIG1heC4gc3BlZWQgKi8KKwlsb25nIHJlYWxiYXVkOworCWludCB0eXBlOwkJLyogVUFSVCB0eXBlICovCisJaW50IGZsYWdzOwkJLyogZGVmaW5lZCBpbiB0dHkuaCAqLworCWxvbmcgc2Vzc2lvbjsJCS8qIFNlc3Npb24gb2Ygb3BlbmluZyBwcm9jZXNzICovCisJbG9uZyBwZ3JwOwkJLyogcGdycCBvZiBvcGVuaW5nIHByb2Nlc3MgKi8KKworCWludCB4X2NoYXI7CQkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KKwlpbnQgSUVSOwkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworCWludCBNQ1I7CQkvKiBNb2RlbSBjb250cm9sIHJlZ2lzdGVyICovCisKKwl1bnNpZ25lZCBjaGFyIHN0b3Bfcng7CisJdW5zaWduZWQgY2hhciBsZGlzY19zdG9wX3J4OworCisJaW50IGN1c3RvbV9kaXZpc29yOworCWludCBjbG9zZV9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydCBjbG9zaW5nX3dhaXQ7CisJdW5zaWduZWQgY2hhciBlcnJfc2hhZG93OworCXVuc2lnbmVkIGxvbmcgZXZlbnQ7CisKKwlpbnQgY291bnQ7CQkvKiAjIG9mIGZkIG9uIGRldmljZSAqLworCWludCBibG9ja2VkX29wZW47CS8qICMgb2YgYmxvY2tlZCBvcGVucyAqLworCXN0cnVjdCBhc3luY19pY291bnQgaWNvdW50OyAvKiBrZXJuZWwgY291bnRlcnMgZm9yIDQgaW5wdXQgaW50ZXJydXB0cyAqLworCWludCB0aW1lb3V0OworCisJaW50IHJlYWRfc3RhdHVzX21hc2s7CisJaW50IGlnbm9yZV9zdGF0dXNfbWFzazsKKwlpbnQgeG1pdF9maWZvX3NpemU7CisJdW5zaWduZWQgY2hhciAqeG1pdF9idWY7CisJaW50IHhtaXRfaGVhZDsKKwlpbnQgeG1pdF90YWlsOworCWludCB4bWl0X2NudDsKKworCXN0cnVjdCBrdGVybWlvcyBub3JtYWxfdGVybWlvczsKKwlzdHJ1Y3Qga3Rlcm1pb3MgY2FsbG91dF90ZXJtaW9zOworCisJc3RydWN0IG14c2VyX21vbiBtb25fZGF0YTsKKworCXNwaW5sb2NrX3Qgc2xvY2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHRxdWV1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgY2xvc2Vfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBkZWx0YV9tc3Jfd2FpdDsKK307CisKK3N0cnVjdCBteHNlcl9ib2FyZCB7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgaXJxOworCWNvbnN0IHN0cnVjdCBteHNlcl9jYXJkaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBsb25nIHZlY3RvcjsKKwl1bnNpZ25lZCBsb25nIHZlY3Rvcl9tYXNrOworCisJaW50IGNoaXBfZmxhZzsKKwlpbnQgdWFydF90eXBlOworCisJc3RydWN0IG14c2VyX3BvcnQgcG9ydHNbTVhTRVJfUE9SVFNfUEVSX0JPQVJEXTsKK307CisKK3N0cnVjdCBteHNlcl9tc3RhdHVzIHsKKwl0Y2ZsYWdfdCBjZmxhZzsKKwlpbnQgY3RzOworCWludCBkc3I7CisJaW50IHJpOworCWludCBkY2Q7Cit9OworCitzdGF0aWMgc3RydWN0IG14c2VyX21zdGF0dXMgR01TdGF0dXNbTVhTRVJfUE9SVFNdOworCitzdGF0aWMgaW50IG14c2VyQm9hcmRDQVBbTVhTRVJfQk9BUkRTXSA9IHsKKwkwLCAwLCAwLCAwCisJLyogIDB4MTgwLCAweDI4MCwgMHgyMDAsIDB4MzIwICovCit9OworCitzdGF0aWMgc3RydWN0IG14c2VyX2JvYXJkIG14c2VyX2JvYXJkc1tNWFNFUl9CT0FSRFNdOworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpteHZhcl9zZHJpdmVyOworc3RhdGljIHN0cnVjdCBteHNlcl9sb2cgbXh2YXJfbG9nOworc3RhdGljIGludCBteHZhcl9kaWFnZmxhZzsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG14c2VyX21zcltNWFNFUl9QT1JUUyArIDFdOworc3RhdGljIHN0cnVjdCBteHNlcl9tb25fZXh0IG1vbl9kYXRhX2V4dDsKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X2JhdWRfbWV0aG9kW01YU0VSX1BPUlRTICsgMV07CitzdGF0aWMgc3BpbmxvY2tfdCBnbV9sb2NrOworCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBDaGVja0lzTW94YU11c3QoaW50IGlvKQoreworCXU4IG9sZG1jciwgaHdpZDsKKwlpbnQgaTsKKworCW91dGIoMCwgaW8gKyBVQVJUX0xDUik7CisJRElTQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShpbyk7CisJb2xkbWNyID0gaW5iKGlvICsgVUFSVF9NQ1IpOworCW91dGIoMCwgaW8gKyBVQVJUX01DUik7CisJU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGlvLCAweDExKTsKKwlpZiAoKGh3aWQgPSBpbmIoaW8gKyBVQVJUX01DUikpICE9IDApIHsKKwkJb3V0YihvbGRtY3IsIGlvICsgVUFSVF9NQ1IpOworCQlyZXR1cm4gTU9YQV9PVEhFUl9VQVJUOworCX0KKworCUdFVF9NT1hBX01VU1RfSEFSRFdBUkVfSUQoaW8sICZod2lkKTsKKwlmb3IgKGkgPSAxOyBpIDwgVUFSVF9JTkZPX05VTTsgaSsrKSB7IC8qIDAgPSBPVEhFUl9VQVJUICovCisJCWlmIChod2lkID09IEdwY2lfdWFydF9pbmZvW2ldLnR5cGUpCisJCQlyZXR1cm4gKGludClod2lkOworCX0KKwlyZXR1cm4gTU9YQV9PVEhFUl9VQVJUOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdHhyeF9maWZvKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvKQoreworCWludCBpOworCisJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY0NTApIHx8IChpbmZvLT50eXBlID09IFBPUlRfODI1MCkpIHsKKwkJaW5mby0+cnhfdHJpZ2dlciA9IDE7CisJCWluZm8tPnJ4X2hpZ2hfd2F0ZXIgPSAxOworCQlpbmZvLT5yeF9sb3dfd2F0ZXIgPSAxOworCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDE7CisJfSBlbHNlCisJCWZvciAoaSA9IDA7IGkgPCBVQVJUX0lORk9fTlVNOyBpKyspCisJCQlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZyA9PSBHcGNpX3VhcnRfaW5mb1tpXS50eXBlKSB7CisJCQkJaW5mby0+cnhfdHJpZ2dlciA9IEdwY2lfdWFydF9pbmZvW2ldLnJ4X3RyaWdnZXI7CisJCQkJaW5mby0+cnhfbG93X3dhdGVyID0gR3BjaV91YXJ0X2luZm9baV0ucnhfbG93X3dhdGVyOworCQkJCWluZm8tPnJ4X2hpZ2hfd2F0ZXIgPSBHcGNpX3VhcnRfaW5mb1tpXS5yeF9oaWdoX3dhdGVyOworCQkJCWluZm8tPnhtaXRfZmlmb19zaXplID0gR3BjaV91YXJ0X2luZm9baV0ueG1pdF9maWZvX3NpemU7CisJCQkJYnJlYWs7CisJCQl9Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX2RvX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteHNlcl9wb3J0LCB0cXVldWUpOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1YU0VSX0VWRU5UX1RYTE9XLCAmaW5mby0+ZXZlbnQpKQorCQl0dHlfd2FrZXVwKHR0eSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG14c2VyX2dldF9tc3IoaW50IGJhc2VhZGRyLCBpbnQgbW9kZSwgaW50IHBvcnQpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSAwOworCisJc3RhdHVzID0gaW5iKGJhc2VhZGRyICsgVUFSVF9NU1IpOworCisJbXhzZXJfbXNyW3BvcnRdICY9IDB4MEY7CisJbXhzZXJfbXNyW3BvcnRdIHw9IHN0YXR1czsKKwlzdGF0dXMgPSBteHNlcl9tc3JbcG9ydF07CisJaWYgKG1vZGUpCisJCW14c2VyX21zcltwb3J0XSA9IDA7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG14c2VyX2Jsb2NrX3RpbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJc3RydWN0IG14c2VyX3BvcnQgKnBvcnQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IHJldHZhbDsKKwlpbnQgZG9fY2xvY2FsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAorCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KKwkgKi8KKwlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAorCQkJdGVzdF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncykpIHsKKwkJcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkKKwkJZG9fY2xvY2FsID0gMTsKKworCS8qCisJICogQmxvY2sgd2FpdGluZyBmb3IgdGhlIGNhcnJpZXIgZGV0ZWN0IGFuZCB0aGUgbGluZSB0byBiZWNvbWUKKwkgKiBmcmVlIChpLmUuLCBub3QgaW4gdXNlIGJ5IHRoZSBjYWxsb3V0KS4gIFdoaWxlIHdlIGFyZSBpbgorCSAqIHRoaXMgbG9vcCwgcG9ydC0+Y291bnQgaXMgZHJvcHBlZCBieSBvbmUsIHNvIHRoYXQKKwkgKiBteHNlcl9jbG9zZSgpIGtub3dzIHdoZW4gdG8gZnJlZSB0aGluZ3MuICBXZSByZXN0b3JlIGl0IHVwb24KKwkgKiBleGl0LCBlaXRoZXIgbm9ybWFsIG9yIGFibm9ybWFsLgorCSAqLworCXJldHZhbCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnNsb2NrLCBmbGFncyk7CisJaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQorCQlwb3J0LT5jb3VudC0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnNsb2NrLCBmbGFncyk7CisJcG9ydC0+YmxvY2tlZF9vcGVuKys7CisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnNsb2NrLCBmbGFncyk7CisJCW91dGIoaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTUNSKSB8CisJCQlVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMsIHBvcnQtPmlvYWRkciArIFVBUlRfTUNSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+c2xvY2ssIGZsYWdzKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgeworCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZWxzZQorCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKKwkJCQkoZG9fY2xvY2FsIHx8CisJCQkJKGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX01TUikgJiBVQVJUX01TUl9EQ0QpKSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPm9wZW5fd2FpdCwgJndhaXQpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydC0+Y291bnQrKzsKKwlwb3J0LT5ibG9ja2VkX29wZW4tLTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X2JhdWQoc3RydWN0IG14c2VyX3BvcnQgKmluZm8sIGxvbmcgbmV3c3BkKQoreworCWludCBxdW90ID0gMDsKKwl1bnNpZ25lZCBjaGFyIGN2YWw7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIShpbmZvLT5pb2FkZHIpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ld3NwZCA+IGluZm8tPm1heF9iYXVkKQorCQlyZXR1cm4gMDsKKworCWluZm8tPnJlYWxiYXVkID0gbmV3c3BkOworCWlmIChuZXdzcGQgPT0gMTM0KSB7CisJCXF1b3QgPSAoMiAqIGluZm8tPmJhdWRfYmFzZSAvIDI2OSk7CisJfSBlbHNlIGlmIChuZXdzcGQpIHsKKwkJcXVvdCA9IGluZm8tPmJhdWRfYmFzZSAvIG5ld3NwZDsKKwkJaWYgKHF1b3QgPT0gMCkKKwkJCXF1b3QgPSAxOworCX0gZWxzZSB7CisJCXF1b3QgPSAwOworCX0KKworCWluZm8tPnRpbWVvdXQgPSAoKGluZm8tPnhtaXRfZmlmb19zaXplICogSFogKiAxMCAqIHF1b3QpIC8gaW5mby0+YmF1ZF9iYXNlKTsKKwlpbmZvLT50aW1lb3V0ICs9IEhaIC8gNTA7CS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCisKKwlpZiAocXVvdCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKKwkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9EVFI7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiByZXQ7CisJfQorCisJY3ZhbCA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CisKKwlvdXRiKGN2YWwgfCBVQVJUX0xDUl9ETEFCLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CS8qIHNldCBETEFCICovCisKKwlvdXRiKHF1b3QgJiAweGZmLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0RMTCk7CS8qIExTIG9mIGRpdmlzb3IgKi8KKwlvdXRiKHF1b3QgPj4gOCwgaW5mby0+aW9hZGRyICsgVUFSVF9ETE0pOwkvKiBNUyBvZiBkaXZpc29yICovCisJb3V0YihjdmFsLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CS8qIHJlc2V0IERMQUIgKi8KKworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoCisgKiB0aGUgc3BlY2lmaWVkIGJhdWQgcmF0ZSBmb3IgYSBzZXJpYWwgcG9ydC4KKyAqLworc3RhdGljIGludCBteHNlcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IG14c2VyX3BvcnQgKmluZm8sCisJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJdW5zaWduZWQgY2ZsYWcsIGN2YWwsIGZjcjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwlsb25nIGJhdWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCisJCXJldHVybiByZXQ7CisJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJaWYgKCEoaW5mby0+aW9hZGRyKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChteHNlcl9zZXRfYmF1ZF9tZXRob2RbaW5mby0+dHR5LT5pbmRleF0gPT0gMCkgeworCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKKwkJbXhzZXJfc2V0X2JhdWQoaW5mbywgYmF1ZCk7CisJfQorCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNToKKwkJY3ZhbCA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQljdmFsID0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCWN2YWwgPSAweDAyOworCQlicmVhazsKKwljYXNlIENTODoKKwkJY3ZhbCA9IDB4MDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN2YWwgPSAweDAwOworCQlicmVhazsJCS8qIHRvbyBrZWVwIEdDQyBzaHV0Li4uICovCisJfQorCWlmIChjZmxhZyAmIENTVE9QQikKKwkJY3ZhbCB8PSAweDA0OworCWlmIChjZmxhZyAmIFBBUkVOQikKKwkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7CisJaWYgKCEoY2ZsYWcgJiBQQVJPREQpKQorCQljdmFsIHw9IFVBUlRfTENSX0VQQVI7CisJaWYgKGNmbGFnICYgQ01TUEFSKQorCQljdmFsIHw9IFVBUlRfTENSX1NQQVI7CisKKwlpZiAoKGluZm8tPnR5cGUgPT0gUE9SVF84MjUwKSB8fCAoaW5mby0+dHlwZSA9PSBQT1JUXzE2NDUwKSkgeworCQlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgeworCQkJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk87CisJCQlmY3IgfD0gTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEU7CisJCQlTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbyk7CisJCX0gZWxzZQorCQkJZmNyID0gMDsKKwl9IGVsc2UgeworCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKwkJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJCWZjciB8PSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRTsKKwkJCVNFVF9NT1hBX01VU1RfRklGT19WQUxVRShpbmZvKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoaW5mby0+cnhfdHJpZ2dlcikgeworCQkJY2FzZSAxOgorCQkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl84OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIENUUyBmbG93IGNvbnRyb2wgZmxhZyBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgKi8KKwlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX01TSTsKKwlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX0FGRTsKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NUU19GTE9XOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCQlpZiAoKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8IChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSkgeworCQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0FGRTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX01TUik7CisJCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKSB7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgeworCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOworCQkJCQlpZiAoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSAmJgorCQkJCQkJCSFpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSB7CisJCQkJCQlvdXRiKGluZm8tPklFUiAmIH5VQVJUX0lFUl9USFJJLAorCQkJCQkJCWluZm8tPmlvYWRkciArCisJCQkJCQkJVUFSVF9JRVIpOworCQkJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsKKwkJCQkJCQkJVUFSVF9JRVIpOworCQkJCQl9CisJCQkJCXNldF9iaXQoTVhTRVJfRVZFTlRfVFhMT1csICZpbmZvLT5ldmVudCk7CisJCQkJCXNjaGVkdWxlX3dvcmsoJmluZm8tPnRxdWV1ZSk7CQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCEoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSkgeworCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOworCQkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCisJCQkJCQkJKCFpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSkgeworCQkJCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArCisJCQkJCQkJCVVBUlRfSUVSKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19DVFNfRkxPVzsKKwl9CisJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKKwlpZiAoY2ZsYWcgJiBDTE9DQUwpIHsKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NIRUNLX0NEOworCX0gZWxzZSB7CisJCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NIRUNLX0NEOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOworCX0KKwlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCisJLyoKKwkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKKwkgKi8KKwlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfRFI7CisJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOworCWlmIChJX0JSS0lOVChpbmZvLT50dHkpIHx8IElfUEFSTVJLKGluZm8tPnR0eSkpCisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisKKwlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCisJaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKKwkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQkvKgorCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUKKwkJICogb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKSB7CisJCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0KKwkJCQkJCVVBUlRfTFNSX09FIHwKKwkJCQkJCVVBUlRfTFNSX1BFIHwKKwkJCQkJCVVBUlRfTFNSX0ZFOworCQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PQorCQkJCQkJVUFSVF9MU1JfT0UgfAorCQkJCQkJVUFSVF9MU1JfUEUgfAorCQkJCQkJVUFSVF9MU1JfRkU7CisJCX0KKwl9CisJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCVNFVF9NT1hBX01VU1RfWE9OMV9WQUxVRShpbmZvLT5pb2FkZHIsIFNUQVJUX0NIQVIoaW5mby0+dHR5KSk7CisJCVNFVF9NT1hBX01VU1RfWE9GRjFfVkFMVUUoaW5mby0+aW9hZGRyLCBTVE9QX0NIQVIoaW5mby0+dHR5KSk7CisJCWlmIChJX0lYT04oaW5mby0+dHR5KSkgeworCQkJRU5BQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+aW9hZGRyKTsKKwkJfSBlbHNlIHsKKwkJCURJU0FCTEVfTU9YQV9NVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5pb2FkZHIpOworCQl9CisJCWlmIChJX0lYT0ZGKGluZm8tPnR0eSkpIHsKKwkJCUVOQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmlvYWRkcik7CisJCX0gZWxzZSB7CisJCQlESVNBQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+aW9hZGRyKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCX0KKworCisJb3V0YihmY3IsIGluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsJLyogc2V0IGZjciAqLworCW91dGIoY3ZhbCwgaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBteHNlcl9wb3J0ICpwb3J0LCBpbnQgc3RhdHVzKQoreworCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCisJCXBvcnQtPmljb3VudC5ybmcrKzsKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKKwkJcG9ydC0+aWNvdW50LmRzcisrOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQorCQlwb3J0LT5pY291bnQuZGNkKys7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCisJCXBvcnQtPmljb3VudC5jdHMrKzsKKwlwb3J0LT5tb25fZGF0YS5tb2RlbV9zdGF0dXMgPSBzdGF0dXM7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5kZWx0YV9tc3Jfd2FpdCk7CisKKwlpZiAoKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpICYmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKSkgeworCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCQlzY2hlZHVsZV93b3JrKCZwb3J0LT50cXVldWUpOworCX0KKworCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSB7CisJCWlmIChwb3J0LT50dHktPmh3X3N0b3BwZWQpIHsKKwkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpIHsKKwkJCQlwb3J0LT50dHktPmh3X3N0b3BwZWQgPSAwOworCisJCQkJaWYgKChwb3J0LT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgorCQkJCQkJKCFwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSkgeworCQkJCQlvdXRiKHBvcnQtPklFUiAmIH5VQVJUX0lFUl9USFJJLAorCQkJCQkJcG9ydC0+aW9hZGRyICsgVUFSVF9JRVIpOworCQkJCQlwb3J0LT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCQkJb3V0Yihwb3J0LT5JRVIsIHBvcnQtPmlvYWRkciArCisJCQkJCQkJVUFSVF9JRVIpOworCQkJCX0KKwkJCQlzZXRfYml0KE1YU0VSX0VWRU5UX1RYTE9XLCAmcG9ydC0+ZXZlbnQpOworCQkJCXNjaGVkdWxlX3dvcmsoJnBvcnQtPnRxdWV1ZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShzdGF0dXMgJiBVQVJUX01TUl9DVFMpKSB7CisJCQkJcG9ydC0+dHR5LT5od19zdG9wcGVkID0gMTsKKwkJCQlpZiAocG9ydC0+dHlwZSAhPSBQT1JUXzE2NTUwQSAmJgorCQkJCQkJIXBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJCQkJcG9ydC0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQkJCQlvdXRiKHBvcnQtPklFUiwgcG9ydC0+aW9hZGRyICsKKwkJCQkJCQlVQVJUX0lFUik7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IG14c2VyX3N0YXJ0dXAoc3RydWN0IG14c2VyX3BvcnQgKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBwYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwYWdlID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWZyZWVfcGFnZShwYWdlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFpbmZvLT5pb2FkZHIgfHwgIWluZm8tPnR5cGUpIHsKKwkJaWYgKGluZm8tPnR0eSkKKwkJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJCWZyZWVfcGFnZShwYWdlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpbmZvLT54bWl0X2J1ZikKKwkJZnJlZV9wYWdlKHBhZ2UpOworCWVsc2UKKwkJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOworCisJLyoKKwkgKiBDbGVhciB0aGUgRklGTyBidWZmZXJzIGFuZCBkaXNhYmxlIHRoZW0KKwkgKiAodGhleSB3aWxsIGJlIHJlZW5hYmxlZCBpbiBteHNlcl9jaGFuZ2Vfc3BlZWQoKSkKKwkgKi8KKwlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykKKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8CisJCQlVQVJUX0ZDUl9DTEVBUl9YTUlUIHwKKwkJCU1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+aW9hZGRyICsgVUFSVF9GQ1IpOworCWVsc2UKKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLAorCQkJaW5mby0+aW9hZGRyICsgVUFSVF9GQ1IpOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHRoZXJlJ3Mgbm8gd2F5IHRoZSBMU1IgY291bGQgc3RpbGwgYmUgMHhGRjsKKwkgKiBpZiBpdCBpcywgdGhlbiBiYWlsIG91dCwgYmVjYXVzZSB0aGVyZSdzIGxpa2VseSBubyBVQVJUCisJICogaGVyZS4KKwkgKi8KKwlpZiAoaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKSA9PSAweGZmKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCQlpZiAoaW5mby0+dHR5KQorCQkJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqIENsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLgorCSAqLworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MU1IpOworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9SWCk7CisJKHZvaWQpIGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0lJUik7CisJKHZvaWQpIGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX01TUik7CisKKwkvKgorCSAqIE5vdywgaW5pdGlhbGl6ZSB0aGUgVUFSVAorCSAqLworCW91dGIoVUFSVF9MQ1JfV0xFTjgsIGluZm8tPmlvYWRkciArIFVBUlRfTENSKTsJLyogcmVzZXQgRExBQiAqLworCWluZm8tPk1DUiA9IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUzsKKwlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgaW50ZXJydXB0cworCSAqLworCWluZm8tPklFUiA9IFVBUlRfSUVSX01TSSB8IFVBUlRfSUVSX1JMU0kgfCBVQVJUX0lFUl9SREk7CisKKwlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykKKwkJaW5mby0+SUVSIHw9IE1PWEFfTVVTVF9JRVJfRUdEQUk7CisJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKworCS8qCisJICogQW5kIGNsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGFnYWluIGZvciBsdWNrLgorCSAqLworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MU1IpOworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9SWCk7CisJKHZvaWQpIGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0lJUik7CisJKHZvaWQpIGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX01TUik7CisKKwlpZiAoaW5mby0+dHR5KQorCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7CisJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOworCisJLyoKKwkgKiBhbmQgc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBOVUxMKTsKKworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBtYXliZSBkaXNhYmxlZCwgYW5kCisgKiBEVFIgaXMgZHJvcHBlZCBpZiB0aGUgaGFuZ3VwIG9uIGNsb3NlIHRlcm1pbyBmbGFnIGlzIG9uLgorICovCitzdGF0aWMgdm9pZCBteHNlcl9zaHV0ZG93bihzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBjbGVhciBkZWx0YV9tc3Jfd2FpdCBxdWV1ZSB0byBhdm9pZCBtZW0gbGVha3M6IHdlIG1heSBmcmVlIHRoZSBpcnEKKwkgKiBoZXJlIHNvIHRoZSBxdWV1ZSBtaWdodCBuZXZlciBiZSB3YWtlbiB1cAorCSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCisJLyoKKwkgKiBGcmVlIHRoZSBJUlEsIGlmIG5lY2Vzc2FyeQorCSAqLworCWlmIChpbmZvLT54bWl0X2J1ZikgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnhtaXRfYnVmKTsKKwkJaW5mby0+eG1pdF9idWYgPSBOVUxMOworCX0KKworCWluZm8tPklFUiA9IDA7CisJb3V0YigweDAwLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CisKKwlpZiAoIWluZm8tPnR0eSB8fCAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKQorCQlpbmZvLT5NQ1IgJj0gfihVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpOworCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7CisKKwkvKiBjbGVhciBSeC9UeCBGSUZPJ3MgKi8KKwlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykKKwkJb3V0YihVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8CisJCQkJTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEUsCisJCQkJaW5mby0+aW9hZGRyICsgVUFSVF9GQ1IpOworCWVsc2UKKwkJb3V0YihVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCwKKwkJCWluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKKworCS8qIHJlYWQgZGF0YSBwb3J0IHRvIHJlc2V0IHRoaW5ncyAqLworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9SWCk7CisKKwlpZiAoaW5mby0+dHR5KQorCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOworCisJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCisJCVNFVF9NT1hBX01VU1RfTk9fU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmlvYWRkcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNlcmlhbCBwb3J0IGlzIG9wZW5lZC4gIEl0CisgKiBlbmFibGVzIGludGVycnVwdHMgZm9yIGEgc2VyaWFsIHBvcnQsIGxpbmtpbmcgaW4gaXRzIGFzeW5jIHN0cnVjdHVyZSBpbnRvCisgKiB0aGUgSVJRIGNoYWluLiAgIEl0IGFsc28gcGVyZm9ybXMgdGhlIHNlcmlhbC1zcGVjaWZpYworICogaW5pdGlhbGl6YXRpb24gZm9yIHRoZSB0dHkgc3RydWN0dXJlLgorICovCitzdGF0aWMgaW50IG14c2VyX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm87CisJaW50IHJldHZhbCwgbGluZTsKKworCS8qIGluaXRpYWxpemUgZHJpdmVyX2RhdGEgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgKi8KKwl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKworCWxpbmUgPSB0dHktPmluZGV4OworCWlmIChsaW5lID09IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gMDsKKwlpZiAobGluZSA8IDAgfHwgbGluZSA+IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpbmZvID0gJm14c2VyX2JvYXJkc1tsaW5lIC8gTVhTRVJfUE9SVFNfUEVSX0JPQVJEXS5wb3J0c1tsaW5lICUgTVhTRVJfUE9SVFNfUEVSX0JPQVJEXTsKKwlpZiAoIWluZm8tPmlvYWRkcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKKwlpbmZvLT50dHkgPSB0dHk7CisJLyoKKwkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAorCSAqLworCWluZm8tPmNvdW50Kys7CisJcmV0dmFsID0gbXhzZXJfc3RhcnR1cChpbmZvKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dmFsID0gbXhzZXJfYmxvY2tfdGlsX3JlYWR5KHR0eSwgZmlscCwgaW5mbyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmICgoaW5mby0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmZsYWdzICYgQVNZTkNfU1BMSVRfVEVSTUlPUykpIHsKKwkJaWYgKHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFNFUklBTF9UWVBFX05PUk1BTCkKKwkJCSp0dHktPnRlcm1pb3MgPSBpbmZvLT5ub3JtYWxfdGVybWlvczsKKwkJZWxzZQorCQkJKnR0eS0+dGVybWlvcyA9IGluZm8tPmNhbGxvdXRfdGVybWlvczsKKwkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOworCX0KKworCWluZm8tPnNlc3Npb24gPSBwcm9jZXNzX3Nlc3Npb24oY3VycmVudCk7CisJaW5mby0+cGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisKKwkvKiB1bm1hcmsgaGVyZSBmb3IgdmVyeSBoaWdoIGJhdWQgcmF0ZSAoZXguIDkyMTYwMCBicHMpIHVzZWQgKi8KKwl0dHktPmxvd19sYXRlbmN5ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgc2VyaWFsIHBvcnQgZ2V0cyBjbG9zZWQuICBGaXJzdCwgd2UKKyAqIHdhaXQgZm9yIHRoZSBsYXN0IHJlbWFpbmluZyBkYXRhIHRvIGJlIHNlbnQuICBUaGVuLCB3ZSB1bmxpbmsgaXRzCisgKiBhc3luYyBzdHJ1Y3R1cmUgZnJvbSB0aGUgaW50ZXJydXB0IGNoYWluIGlmIG5lY2Vzc2FyeSwgYW5kIHdlIGZyZWUKKyAqIHRoYXQgSVJRIGlmIG5vdGhpbmcgaXMgbGVmdCBpbiB0aGUgY2hhaW4uCisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCisJCXJldHVybjsKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7CisJCS8qCisJCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5CisJCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgSW5mby0+Y291bnQgc2hvdWxkIGFsd2F5cworCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCisJCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQorCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAibXhzZXJfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgIgorCQkJInR0eS0+Y291bnQgaXMgMSwgaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJaW5mby0+Y291bnQgPSAxOworCX0KKwlpZiAoLS1pbmZvLT5jb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJteHNlcl9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciAiCisJCQkidHR5cyVkOiAlZFxuIiwgdHR5LT5pbmRleCwgaW5mby0+Y291bnQpOworCQlpbmZvLT5jb3VudCA9IDA7CisJfQorCWlmIChpbmZvLT5jb3VudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWluZm8tPmZsYWdzIHw9IEFTWU5DX0NMT1NJTkc7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIFNhdmUgdGhlIHRlcm1pb3Mgc3RydWN0dXJlLCBzaW5jZSB0aGlzIHBvcnQgbWF5IGhhdmUKKwkgKiBzZXBhcmF0ZSB0ZXJtaW9zIGZvciBjYWxsb3V0IGFuZCBkaWFsaW4uCisJICovCisJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfTk9STUFMX0FDVElWRSkKKwkJaW5mby0+bm9ybWFsX3Rlcm1pb3MgPSAqdHR5LT50ZXJtaW9zOworCS8qCisJICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkKKwkgKiB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIG9ubHkgcHJvY2VzcyBYT04vWE9GRiBjaGFyYWN0ZXJzLgorCSAqLworCXR0eS0+Y2xvc2luZyA9IDE7CisJaWYgKGluZm8tPmNsb3Npbmdfd2FpdCAhPSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSkKKwkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIGluZm8tPmNsb3Npbmdfd2FpdCk7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKKwkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMsIGFuZCB0ZWxsIHRoZQorCSAqIGludGVycnVwdCBkcml2ZXIgdG8gc3RvcCBjaGVja2luZyB0aGUgZGF0YSByZWFkeSBiaXQgaW4gdGhlCisJICogbGluZSBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9STFNJOworCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKQorCQlpbmZvLT5JRVIgJj0gfk1PWEFfTVVTVF9SRUNWX0lTUjsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CisJCS8qCisJCSAqIEJlZm9yZSB3ZSBkcm9wIERUUiwgbWFrZSBzdXJlIHRoZSBVQVJUIHRyYW5zbWl0dGVyCisJCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQorCQkgKiBpbXBvcnRhbnQgaWYgdGhlcmUgaXMgYSB0cmFuc21pdCBGSUZPIQorCQkgKi8KKwkJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwkJd2hpbGUgKCEoaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKSB7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoNSk7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlteHNlcl9zaHV0ZG93bihpbmZvKTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKworCXR0eS0+Y2xvc2luZyA9IDA7CisJaW5mby0+ZXZlbnQgPSAwOworCWluZm8tPnR0eSA9IE5VTEw7CisJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgeworCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpCisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoaW5mby0+Y2xvc2VfZGVsYXkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CisJfQorCisJaW5mby0+ZmxhZ3MgJj0gfihBU1lOQ19OT1JNQUxfQUNUSVZFIHwgQVNZTkNfQ0xPU0lORyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5jbG9zZV93YWl0KTsKKworfQorCitzdGF0aWMgaW50IG14c2VyX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBjLCB0b3RhbCA9IDA7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWluZm8tPnhtaXRfYnVmKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgxKSB7CisJCWMgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwKKwkJCQkJICBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9oZWFkKSk7CisJCWlmIChjIDw9IDApCisJCQlicmVhazsKKworCQltZW1jcHkoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X2hlYWQsIGJ1ZiwgYyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJgorCQkJCSAgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJaW5mby0+eG1pdF9jbnQgKz0gYzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJdG90YWwgKz0gYzsKKwl9CisKKwlpZiAoaW5mby0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCkgeworCQlpZiAoIXR0eS0+aHdfc3RvcHBlZCB8fAorCQkJCShpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fAorCQkJCShpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCQlvdXRiKGluZm8tPklFUiAmIH5VQVJUX0lFUl9USFJJLCBpbmZvLT5pb2FkZHIgKworCQkJCQlVQVJUX0lFUik7CisJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQl9CisJfQorCXJldHVybiB0b3RhbDsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaW5mby0+eG1pdF9idWYpCisJCXJldHVybjsKKworCWlmIChpbmZvLT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7CisJaW5mby0+eG1pdF9oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUgLSAxOworCWluZm8tPnhtaXRfY250Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoIXR0eS0+c3RvcHBlZCkgeworCQlpZiAoIXR0eS0+aHdfc3RvcHBlZCB8fAorCQkJCShpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fAorCQkJCWluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQkJb3V0YihpbmZvLT5JRVIgJiB+VUFSVF9JRVJfVEhSSSwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwKKwkJCXR0eS0+c3RvcHBlZCB8fAorCQkJIWluZm8tPnhtaXRfYnVmIHx8CisJCQkodHR5LT5od19zdG9wcGVkICYmCisJCQkgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCisJCQkgKCFpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKQorCQkJKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlvdXRiKGluZm8tPklFUiAmIH5VQVJUX0lFUl9USFJJLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CisJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG14c2VyX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwljaGFyIGZjcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CisKKwlmY3IgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9GQ1IpOworCW91dGIoKGZjciB8IFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwKKwkJaW5mby0+aW9hZGRyICsgVUFSVF9GQ1IpOworCW91dGIoZmNyLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0ZDUik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmcmllbmRzIG9mIG14c2VyX2lvY3RsKCkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IG14c2VyX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKKwkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAudHlwZSA9IGluZm8tPnR5cGU7CisJdG1wLmxpbmUgPSBpbmZvLT50dHktPmluZGV4OworCXRtcC5wb3J0ID0gaW5mby0+aW9hZGRyOworCXRtcC5pcnEgPSBpbmZvLT5ib2FyZC0+aXJxOworCXRtcC5mbGFncyA9IGluZm8tPmZsYWdzOworCXRtcC5iYXVkX2Jhc2UgPSBpbmZvLT5iYXVkX2Jhc2U7CisJdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7CisJdG1wLmNsb3Npbmdfd2FpdCA9IGluZm8tPmNsb3Npbmdfd2FpdDsKKwl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKKwl0bXAuaHViNiA9IDA7CisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvLAorCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisJdW5zaWduZWQgaW50IGZsYWdzOworCWludCByZXR2YWwgPSAwOworCisJaWYgKCFuZXdfaW5mbyB8fCAhaW5mby0+aW9hZGRyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXJpYWwsIG5ld19pbmZvLCBzaXplb2YobmV3X3NlcmlhbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgobmV3X3NlcmlhbC5pcnEgIT0gaW5mby0+Ym9hcmQtPmlycSkgfHwKKwkJCShuZXdfc2VyaWFsLnBvcnQgIT0gaW5mby0+aW9hZGRyKSB8fAorCQkJKG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3IgIT0gaW5mby0+Y3VzdG9tX2Rpdmlzb3IpIHx8CisJCQkobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWZsYWdzID0gaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSzsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IGluZm8tPmJhdWRfYmFzZSkgfHwKKwkJCQkobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwKKwkJCQkoKG5ld19zZXJpYWwuZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spICE9IChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykpKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8CisJCQkJKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19VU1JfTUFTSykpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KKwkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RhcnQgbWFraW5nIGNoYW5nZXMuLi4uLgorCQkgKi8KKwkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8CisJCQkJKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOworCQlpbmZvLT5jbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiBIWiAvIDEwMDsKKwkJaW5mby0+Y2xvc2luZ193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgKiBIWiAvIDEwMDsKKwkJaW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9CisJCQkJKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisJCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAwOworCX0KKworCWluZm8tPnR5cGUgPSBuZXdfc2VyaWFsLnR5cGU7CisKKwlwcm9jZXNzX3R4cnhfZmlmbyhpbmZvKTsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWlmIChmbGFncyAhPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpCisJCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CisJfSBlbHNlCisJCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogbXhzZXJfZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KKyAqCisgKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5CisgKgkgICAgaXMgZW1wdGllZC4gIE9uIGJ1cyB0eXBlcyBsaWtlIFJTNDg1LCB0aGUgdHJhbnNtaXR0ZXIgbXVzdAorICoJICAgIHJlbGVhc2UgdGhlIGJ1cyBhZnRlciB0cmFuc21pdHRpbmcuIFRoaXMgbXVzdCBiZSBkb25lIHdoZW4KKyAqCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCisgKgkgICAgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gIFRoaXMgZnVuY3Rpb25hbGl0eQorICoJICAgIGFsbG93cyBhbiBSUzQ4NSBkcml2ZXIgdG8gYmUgd3JpdHRlbiBpbiB1c2VyIHNwYWNlLgorICovCitzdGF0aWMgaW50IG14c2VyX2dldF9sc3JfaW5mbyhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKKwkJdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJc3RhdHVzID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXJlc3VsdCA9ICgoc3RhdHVzICYgVUFSVF9MU1JfVEVNVCkgPyBUSU9DU0VSX1RFTVQgOiAwKTsKKwlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCB2YWx1ZSk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgc2VuZHMgYSBicmVhayBjaGFyYWN0ZXIgb3V0IHRoZSBzZXJpYWwgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgbXhzZXJfc2VuZF9icmVhayhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywgaW50IGR1cmF0aW9uKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWluZm8tPmlvYWRkcikKKwkJcmV0dXJuOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJb3V0YihpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpIHwgVUFSVF9MQ1JfU0JDLAorCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlzY2hlZHVsZV90aW1lb3V0KGR1cmF0aW9uKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlvdXRiKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUikgJiB+VUFSVF9MQ1JfU0JDLAorCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBteHNlcl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgY2hhciBjb250cm9sLCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJaWYgKHRlc3RfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTzsKKworCWNvbnRyb2wgPSBpbmZvLT5NQ1I7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlzdGF0dXMgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9BTllfREVMVEEpCisJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuICgoY29udHJvbCAmIFVBUlRfTUNSX1JUUykgPyBUSU9DTV9SVFMgOiAwKSB8CisJCSAgICAoKGNvbnRyb2wgJiBVQVJUX01DUl9EVFIpID8gVElPQ01fRFRSIDogMCkgfAorCQkgICAgKChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpID8gVElPQ01fQ0FSIDogMCkgfAorCQkgICAgKChzdGF0dXMgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKSB8CisJCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX0RTUikgPyBUSU9DTV9EU1IgOiAwKSB8CisJCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKK30KKworc3RhdGljIGludCBteHNlcl90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlpZiAodHR5LT5pbmRleCA9PSBNWFNFUl9QT1JUUykKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwlpZiAodGVzdF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncykpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9EVFI7CisKKwlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfcHJvZ3JhbV9tb2RlKGludCBwb3J0KQoreworCWludCBpZCwgaSwgaiwgbjsKKworCXNwaW5fbG9jaygmZ21fbG9jayk7CisJb3V0YigwLCBwb3J0KTsKKwlvdXRiKDAsIHBvcnQpOworCW91dGIoMCwgcG9ydCk7CisJKHZvaWQpaW5iKHBvcnQpOworCSh2b2lkKWluYihwb3J0KTsKKwlvdXRiKDAsIHBvcnQpOworCSh2b2lkKWluYihwb3J0KTsKKwlzcGluX3VubG9jaygmZ21fbG9jayk7CisKKwlpZCA9IGluYihwb3J0ICsgMSkgJiAweDFGOworCWlmICgoaWQgIT0gQzE2OF9BU0lDX0lEKSAmJgorCQkJKGlkICE9IEMxMDRfQVNJQ19JRCkgJiYKKwkJCShpZCAhPSBDMTAyX0FTSUNfSUQpICYmCisJCQkoaWQgIT0gQ0kxMzJfQVNJQ19JRCkgJiYKKwkJCShpZCAhPSBDSTEzNF9BU0lDX0lEKSAmJgorCQkJKGlkICE9IENJMTA0Sl9BU0lDX0lEKSkKKwkJcmV0dXJuIC0xOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgNDsgaSsrKSB7CisJCW4gPSBpbmIocG9ydCArIDIpOworCQlpZiAobiA9PSAnTScpIHsKKwkJCWogPSAxOworCQl9IGVsc2UgaWYgKChqID09IDEpICYmIChuID09IDEpKSB7CisJCQlqID0gMjsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWogPSAwOworCX0KKwlpZiAoaiAhPSAyKQorCQlpZCA9IC0yOworCXJldHVybiBpZDsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfbm9ybWFsX21vZGUoaW50IHBvcnQpCit7CisJaW50IGksIG47CisKKwlvdXRiKDB4QTUsIHBvcnQgKyAxKTsKKwlvdXRiKDB4ODAsIHBvcnQgKyAzKTsKKwlvdXRiKDEyLCBwb3J0ICsgMCk7CS8qIDk2MDAgYnBzICovCisJb3V0YigwLCBwb3J0ICsgMSk7CisJb3V0YigweDAzLCBwb3J0ICsgMyk7CS8qIDggZGF0YSBiaXRzICovCisJb3V0YigweDEzLCBwb3J0ICsgNCk7CS8qIGxvb3AgYmFjayBtb2RlICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJbiA9IGluYihwb3J0ICsgNSk7CisJCWlmICgobiAmIDB4NjEpID09IDB4NjApCisJCQlicmVhazsKKwkJaWYgKChuICYgMSkgPT0gMSkKKwkJCSh2b2lkKWluYihwb3J0KTsKKwl9CisJb3V0YigweDAwLCBwb3J0ICsgNCk7Cit9CisKKyNkZWZpbmUgQ0hJUF9TSyAJMHgwMQkvKiBTZXJpYWwgRGF0YSBDbG9jayAgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9ETyAJMHgwMgkvKiBTZXJpYWwgRGF0YSBPdXRwdXQgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9DUyAJMHgwNAkvKiBTZXJpYWwgQ2hpcCBTZWxlY3QgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9ESSAJMHgwOAkvKiBTZXJpYWwgRGF0YSBJbnB1dCAgaW4gRXByb20gKi8KKyNkZWZpbmUgRU5fQ0NNRCAJMHgwMDAJLyogQ2hpcCdzIGNvbW1hbmQgcmVnaXN0ZXIgICAgICovCisjZGVmaW5lIEVOMF9SU0FSTE8JMHgwMDgJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDAgICovCisjZGVmaW5lIEVOMF9SU0FSSEkJMHgwMDkJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDEgICovCisjZGVmaW5lIEVOMF9SQ05UTE8JMHgwMEEJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCisjZGVmaW5lIEVOMF9SQ05USEkJMHgwMEIJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCisjZGVmaW5lIEVOMF9EQ0ZHCTB4MDBFCS8qIERhdGEgY29uZmlndXJhdGlvbiByZWcgV1IgICAqLworI2RlZmluZSBFTjBfUE9SVAkweDAxMAkvKiBSY3YgbWlzc2VkIGZyYW1lIGVycm9yIGNvdW50ZXIgUkQgKi8KKyNkZWZpbmUgRU5DX1BBR0UwCTB4MDAwCS8qIFNlbGVjdCBwYWdlIDAgb2YgY2hpcCByZWdpc3RlcnMgICAqLworI2RlZmluZSBFTkNfUEFHRTMJMHgwQzAJLyogU2VsZWN0IHBhZ2UgMyBvZiBjaGlwIHJlZ2lzdGVycyAgICovCitzdGF0aWMgaW50IG14c2VyX3JlYWRfcmVnaXN0ZXIoaW50IHBvcnQsIHVuc2lnbmVkIHNob3J0ICpyZWdzKQoreworCWludCBpLCBrLCB2YWx1ZSwgaWQ7CisJdW5zaWduZWQgaW50IGo7CisKKwlpZCA9IG14c2VyX3Byb2dyYW1fbW9kZShwb3J0KTsKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gaWQ7CisJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHsKKwkJayA9IChpICYgMHgzRikgfCAweDE4MDsKKwkJZm9yIChqID0gMHgxMDA7IGogPiAwOyBqID4+PSAxKSB7CisJCQlvdXRiKENISVBfQ1MsIHBvcnQpOworCQkJaWYgKGsgJiBqKSB7CisJCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9ETywgcG9ydCk7CisJCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9ETyB8IENISVBfU0ssIHBvcnQpOwkvKiBBPyBiaXQgb2YgcmVhZCAqLworCQkJfSBlbHNlIHsKKwkJCQlvdXRiKENISVBfQ1MsIHBvcnQpOworCQkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOwkvKiBBPyBiaXQgb2YgcmVhZCAqLworCQkJfQorCQl9CisJCSh2b2lkKWluYihwb3J0KTsKKwkJdmFsdWUgPSAwOworCQlmb3IgKGsgPSAwLCBqID0gMHg4MDAwOyBrIDwgMTY7IGsrKywgaiA+Pj0gMSkgeworCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKKwkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOworCQkJaWYgKGluYihwb3J0KSAmIENISVBfREkpCisJCQkJdmFsdWUgfD0gajsKKwkJfQorCQlyZWdzW2ldID0gdmFsdWU7CisJCW91dGIoMCwgcG9ydCk7CisJfQorCW14c2VyX25vcm1hbF9tb2RlKHBvcnQpOworCXJldHVybiBpZDsKK30KKworc3RhdGljIGludCBteHNlcl9pb2N0bF9zcGVjaWFsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmdwKQoreworCXN0cnVjdCBteHNlcl9wb3J0ICpwb3J0OworCWludCByZXN1bHQsIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNT1hBX0dFVF9DT05GOgorLyoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbXhzZXJjZmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBteHNlcl9od2NvbmYpICogNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7Ki8KKwkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIE1PWEFfR0VUX01BSk9SOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ0dHltYWpvciwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBNT1hBX0dFVF9DVU1BSk9SOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjYWxsb3V0bWFqb3IsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgTU9YQV9DSEtQT1JURU5BQkxFOgorCQlyZXN1bHQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKKwkJCWZvciAoaiA9IDA7IGogPCBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7IGorKykKKwkJCQlpZiAobXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdLmlvYWRkcikKKwkJCQkJcmVzdWx0IHw9ICgxIDw8IGkpOworCisJCXJldHVybiBwdXRfdXNlcihyZXN1bHQsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCWNhc2UgTU9YQV9HRVREQVRBQ09VTlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm14dmFyX2xvZywgc2l6ZW9mKG14dmFyX2xvZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgTU9YQV9HRVRNU1RBVFVTOgorCQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspCisJCQlmb3IgKGogPSAwOyBqIDwgTVhTRVJfUE9SVFNfUEVSX0JPQVJEOyBqKyspIHsKKwkJCQlwb3J0ID0gJm14c2VyX2JvYXJkc1tpXS5wb3J0c1tqXTsKKworCQkJCUdNU3RhdHVzW2ldLnJpID0gMDsKKwkJCQlpZiAoIXBvcnQtPmlvYWRkcikgeworCQkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCQkJCQlHTVN0YXR1c1tpXS5kc3IgPSAwOworCQkJCQlHTVN0YXR1c1tpXS5jdHMgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoIXBvcnQtPnR0eSB8fCAhcG9ydC0+dHR5LT50ZXJtaW9zKQorCQkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9CisJCQkJCQlwb3J0LT5ub3JtYWxfdGVybWlvcy5jX2NmbGFnOworCQkJCWVsc2UKKwkJCQkJR01TdGF0dXNbaV0uY2ZsYWcgPQorCQkJCQkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJCQkJc3RhdHVzID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTVNSKTsKKwkJCQlpZiAoc3RhdHVzICYgMHg4MCAvKlVBUlRfTVNSX0RDRCAqLyApCisJCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDE7CisJCQkJZWxzZQorCQkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCisJCQkJaWYgKHN0YXR1cyAmIDB4MjAgLypVQVJUX01TUl9EU1IgKi8gKQorCQkJCQlHTVN0YXR1c1tpXS5kc3IgPSAxOworCQkJCWVsc2UKKwkJCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKKworCisJCQkJaWYgKHN0YXR1cyAmIDB4MTAgLypVQVJUX01TUl9DVFMgKi8gKQorCQkJCQlHTVN0YXR1c1tpXS5jdHMgPSAxOworCQkJCWVsc2UKKwkJCQkJR01TdGF0dXNbaV0uY3RzID0gMDsKKwkJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBHTVN0YXR1cywKKwkJCQlzaXplb2Yoc3RydWN0IG14c2VyX21zdGF0dXMpICogTVhTRVJfUE9SVFMpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgTU9YQV9BU1BQX01PTl9FWFQ6IHsKKwkJaW50IHN0YXR1cywgcCwgc2hpZnRiaXQ7CisJCXVuc2lnbmVkIGxvbmcgb3Btb2RlOworCQl1bnNpZ25lZCBjZmxhZywgaWZsYWc7CisKKwkJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKQorCQkJZm9yIChqID0gMDsgaiA8IE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsgaisrKSB7CisJCQkJcG9ydCA9ICZteHNlcl9ib2FyZHNbaV0ucG9ydHNbal07CisJCQkJaWYgKCFwb3J0LT5pb2FkZHIpCisJCQkJCWNvbnRpbnVlOworCisJCQkJc3RhdHVzID0gbXhzZXJfZ2V0X21zcihwb3J0LT5pb2FkZHIsIDAsIGkpOworCisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCisJCQkJCXBvcnQtPmljb3VudC5ybmcrKzsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKKwkJCQkJcG9ydC0+aWNvdW50LmRzcisrOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQorCQkJCQlwb3J0LT5pY291bnQuZGNkKys7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCisJCQkJCXBvcnQtPmljb3VudC5jdHMrKzsKKworCQkJCXBvcnQtPm1vbl9kYXRhLm1vZGVtX3N0YXR1cyA9IHN0YXR1czsKKwkJCQltb25fZGF0YV9leHQucnhfY250W2ldID0gcG9ydC0+bW9uX2RhdGEucnhjbnQ7CisJCQkJbW9uX2RhdGFfZXh0LnR4X2NudFtpXSA9IHBvcnQtPm1vbl9kYXRhLnR4Y250OworCQkJCW1vbl9kYXRhX2V4dC51cF9yeGNudFtpXSA9CisJCQkJCXBvcnQtPm1vbl9kYXRhLnVwX3J4Y250OworCQkJCW1vbl9kYXRhX2V4dC51cF90eGNudFtpXSA9CisJCQkJCXBvcnQtPm1vbl9kYXRhLnVwX3R4Y250OworCQkJCW1vbl9kYXRhX2V4dC5tb2RlbV9zdGF0dXNbaV0gPQorCQkJCQlwb3J0LT5tb25fZGF0YS5tb2RlbV9zdGF0dXM7CisJCQkJbW9uX2RhdGFfZXh0LmJhdWRyYXRlW2ldID0gcG9ydC0+cmVhbGJhdWQ7CisKKwkJCQlpZiAoIXBvcnQtPnR0eSB8fCAhcG9ydC0+dHR5LT50ZXJtaW9zKSB7CisJCQkJCWNmbGFnID0gcG9ydC0+bm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKKwkJCQkJaWZsYWcgPSBwb3J0LT5ub3JtYWxfdGVybWlvcy5jX2lmbGFnOworCQkJCX0gZWxzZSB7CisJCQkJCWNmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCQkJCQlpZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKwkJCQl9CisKKwkJCQltb25fZGF0YV9leHQuZGF0YWJpdHNbaV0gPSBjZmxhZyAmIENTSVpFOworCisJCQkJbW9uX2RhdGFfZXh0LnN0b3BiaXRzW2ldID0gY2ZsYWcgJiBDU1RPUEI7CisKKwkJCQltb25fZGF0YV9leHQucGFyaXR5W2ldID0KKwkJCQkJY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKTsKKworCQkJCW1vbl9kYXRhX2V4dC5mbG93Y3RybFtpXSA9IDB4MDA7CisKKwkJCQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gfD0gMHgwMzsKKworCQkJCWlmIChpZmxhZyAmIChJWE9OIHwgSVhPRkYpKQorCQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gfD0gMHgwQzsKKworCQkJCWlmIChwb3J0LT50eXBlID09IFBPUlRfMTY1NTBBKQorCQkJCQltb25fZGF0YV9leHQuZmlmb1tpXSA9IDE7CisJCQkJZWxzZQorCQkJCQltb25fZGF0YV9leHQuZmlmb1tpXSA9IDA7CisKKwkJCQlwID0gaSAlIDQ7CisJCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCQlvcG1vZGUgPSBpbmIocG9ydC0+b3Btb2RlX2lvYWRkcikgPj4gc2hpZnRiaXQ7CisJCQkJb3Btb2RlICY9IE9QX01PREVfTUFTSzsKKworCQkJCW1vbl9kYXRhX2V4dC5pZnR5cGVbaV0gPSBvcG1vZGU7CisKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm1vbl9kYXRhX2V4dCwKKwkJCQkJCXNpemVvZihtb25fZGF0YV9leHQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIDA7CisKKwl9IGRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14c2VyX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldiwgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBfX3VzZXIgKnBfY3VzZXI7CisJdW5zaWduZWQgbG9uZyB0ZW1wbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCByZXR2YWw7CisKKwlpZiAodHR5LT5pbmRleCA9PSBNWFNFUl9QT1JUUykKKwkJcmV0dXJuIG14c2VyX2lvY3RsX3NwZWNpYWwoY21kLCBhcmdwKTsKKworCWlmIChjbWQgPT0gTU9YQV9TRVRfT1BfTU9ERSB8fCBjbWQgPT0gTU9YQV9HRVRfT1BfTU9ERSkgeworCQlpbnQgcDsKKwkJdW5zaWduZWQgbG9uZyBvcG1vZGU7CisJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIE1vZGVNYXNrW10gPSB7IDB4ZmMsIDB4ZjMsIDB4Y2YsIDB4M2YgfTsKKwkJaW50IHNoaWZ0Yml0OworCQl1bnNpZ25lZCBjaGFyIHZhbCwgbWFzazsKKworCQlwID0gdHR5LT5pbmRleCAlIDQ7CisJCWlmIChjbWQgPT0gTU9YQV9TRVRfT1BfTU9ERSkgeworCQkJaWYgKGdldF91c2VyKG9wbW9kZSwgKGludCBfX3VzZXIgKikgYXJncCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAob3Btb2RlICE9IFJTMjMyX01PREUgJiYKKwkJCQkJb3Btb2RlICE9IFJTNDg1XzJXSVJFX01PREUgJiYKKwkJCQkJb3Btb2RlICE9IFJTNDIyX01PREUgJiYKKwkJCQkJb3Btb2RlICE9IFJTNDg1XzRXSVJFX01PREUpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQltYXNrID0gTW9kZU1hc2tbcF07CisJCQlzaGlmdGJpdCA9IHAgKiAyOworCQkJdmFsID0gaW5iKGluZm8tPm9wbW9kZV9pb2FkZHIpOworCQkJdmFsICY9IG1hc2s7CisJCQl2YWwgfD0gKG9wbW9kZSA8PCBzaGlmdGJpdCk7CisJCQlvdXRiKHZhbCwgaW5mby0+b3Btb2RlX2lvYWRkcik7CisJCX0gZWxzZSB7CisJCQlzaGlmdGJpdCA9IHAgKiAyOworCQkJb3Btb2RlID0gaW5iKGluZm8tPm9wbW9kZV9pb2FkZHIpID4+IHNoaWZ0Yml0OworCQkJb3Btb2RlICY9IE9QX01PREVfTUFTSzsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm9wbW9kZSwgc2l6ZW9mKGludCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChjbWQgIT0gVElPQ0dTRVJJQUwgJiYgY21kICE9IFRJT0NNSVdBSVQgJiYgY21kICE9IFRJT0NHSUNPVU5UICYmCisJCQl0ZXN0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVENTQlJLOgkJLyogU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrICovCisJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKKwkJaWYgKCFhcmcpCisJCQlteHNlcl9zZW5kX2JyZWFrKGluZm8sIEhaIC8gNCk7CS8qIDEvNCBzZWNvbmQgKi8KKwkJcmV0dXJuIDA7CisJY2FzZSBUQ1NCUktQOgkJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLworCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CisJCW14c2VyX3NlbmRfYnJlYWsoaW5mbywgYXJnID8gYXJnICogKEhaIC8gMTApIDogSFogLyA0KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBUSU9DR1NPRlRDQVI6CisJCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCWNhc2UgVElPQ1NTT0ZUQ0FSOgorCQlpZiAoZ2V0X3VzZXIodGVtcGwsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlhcmcgPSB0ZW1wbDsKKwkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8IChhcmcgPyBDTE9DQUwgOiAwKSk7CisJCXJldHVybiAwOworCWNhc2UgVElPQ0dTRVJJQUw6CisJCXJldHVybiBteHNlcl9nZXRfc2VyaWFsX2luZm8oaW5mbywgYXJncCk7CisJY2FzZSBUSU9DU1NFUklBTDoKKwkJcmV0dXJuIG14c2VyX3NldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKKwljYXNlIFRJT0NTRVJHRVRMU1I6CS8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLworCQlyZXR1cm4gbXhzZXJfZ2V0X2xzcl9pbmZvKGluZm8sIGFyZ3ApOworCQkvKgorCQkgKiBXYWl0IGZvciBhbnkgb2YgdGhlIDQgbW9kZW0gaW5wdXRzIChEQ0QsUkksRFNSLENUUykgdG8gY2hhbmdlCisJCSAqIC0gbWFzayBwYXNzZWQgaW4gYXJnIGZvciBsaW5lcyBvZiBpbnRlcmVzdAorCQkgKiAgICh1c2UgfCdlZCBUSU9DTV9STkcvRFNSL0NEL0NUUyBmb3IgbWFza2luZykKKwkJICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMKKwkJICovCisJY2FzZSBUSU9DTUlXQUlUOiB7CisJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQlpbnQgcmV0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJY3ByZXYgPSBpbmZvLT5pY291bnQ7CS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwkJYWRkX3dhaXRfcXVldWUoJmluZm8tPmRlbHRhX21zcl93YWl0LCAmd2FpdCk7CisJCXdoaWxlICgxKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJCWNub3cgPSBpbmZvLT5pY291bnQ7CS8qIGF0b21pYyBjb3B5ICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKCgoYXJnICYgVElPQ01fUk5HKSAmJgorCQkJCQkoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCQkJKChhcmcgJiBUSU9DTV9EU1IpICYmCisJCQkJCShjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fAorCQkJCQkoKGFyZyAmIFRJT0NNX0NEKSAmJgorCQkJCQkoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKKwkJCQkJKChhcmcgJiBUSU9DTV9DVFMpICYmCisJCQkJCShjbm93LmN0cyAhPSBjcHJldi5jdHMpKSkgeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljcHJldiA9IGNub3c7CisJCX0KKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCwgJndhaXQpOworCQlicmVhazsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworCS8qCisJICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCisJICogUmV0dXJuOiB3cml0ZSBjb3VudGVycyB0byB0aGUgdXNlciBwYXNzZWQgY291bnRlciBzdHJ1Y3QKKwkgKiBOQjogYm90aCAxLT4wIGFuZCAwLT4xIHRyYW5zaXRpb25zIGFyZSBjb3VudGVkIGV4Y2VwdCBmb3IKKwkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCisJICovCisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCWNub3cgPSBpbmZvLT5pY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXBfY3VzZXIgPSBhcmdwOworCQlpZiAocHV0X3VzZXIoY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5icmssICZwX2N1c2VyLT5icmspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihjbm93Lm92ZXJydW4sICZwX2N1c2VyLT5vdmVycnVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5idWZfb3ZlcnJ1biwgJnBfY3VzZXItPmJ1Zl9vdmVycnVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoY25vdy5wYXJpdHksICZwX2N1c2VyLT5wYXJpdHkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihjbm93LnJ4LCAmcF9jdXNlci0+cngpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihjbm93LnR4LCAmcF9jdXNlci0+dHgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB1dF91c2VyKGNub3cuY3RzLCAmcF9jdXNlci0+Y3RzKTsKKwkJcHV0X3VzZXIoY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpOworCQlwdXRfdXNlcihjbm93LnJuZywgJnBfY3VzZXItPnJuZyk7CisJCXB1dF91c2VyKGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBNT1hBX0hpZ2hTcGVlZE9uOgorCQlyZXR1cm4gcHV0X3VzZXIoaW5mby0+YmF1ZF9iYXNlICE9IDExNTIwMCA/IDEgOiAwLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCWNhc2UgTU9YQV9TRFNfUlNUSUNPVU5URVI6CisJCWluZm8tPm1vbl9kYXRhLnJ4Y250ID0gMDsKKwkJaW5mby0+bW9uX2RhdGEudHhjbnQgPSAwOworCQlyZXR1cm4gMDsKKwljYXNlIE1PWEFfQVNQUF9TRVRCQVVEOnsKKwkJbG9uZyBiYXVkOworCQlpZiAoZ2V0X3VzZXIoYmF1ZCwgKGxvbmcgX191c2VyICopYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbXhzZXJfc2V0X2JhdWQoaW5mbywgYmF1ZCk7CisJCXJldHVybiAwOworCX0KKwljYXNlIE1PWEFfQVNQUF9HRVRCQVVEOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5yZWFsYmF1ZCwgc2l6ZW9mKGxvbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCisJY2FzZSBNT1hBX0FTUFBfT1FVRVVFOnsKKwkJaW50IGxlbiwgbHNyOworCisJCWxlbiA9IG14c2VyX2NoYXJzX2luX2J1ZmZlcih0dHkpOworCisJCWxzciA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UOworCisJCWxlbiArPSAobHNyID8gMCA6IDEpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmxlbiwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgTU9YQV9BU1BQX01PTjogeworCQlpbnQgbWNyLCBzdGF0dXM7CisKKwkJc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5pb2FkZHIsIDEsIHR0eS0+aW5kZXgpOworCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgc3RhdHVzKTsKKworCQltY3IgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOworCQlpZiAobWNyICYgTU9YQV9NVVNUX01DUl9YT05fRkxBRykKKwkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9YT0ZGSE9MRDsKKwkJZWxzZQorCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gfD0gTlBQSV9OT1RJRllfWE9GRkhPTEQ7CisKKwkJaWYgKG1jciAmIE1PWEFfTVVTVF9NQ1JfVFhfWE9OKQorCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX1hPRkZYRU5UOworCQllbHNlCisJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9YT0ZGWEVOVDsKKworCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKQorCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gfD0gTlBQSV9OT1RJRllfQ1RTSE9MRDsKKwkJZWxzZQorCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX0NUU0hPTEQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mby0+bW9uX2RhdGEsCisJCQkJc2l6ZW9mKHN0cnVjdCBteHNlcl9tb24pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKwljYXNlIE1PWEFfQVNQUF9MU1RBVFVTOiB7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPmVycl9zaGFkb3csCisJCQkJc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWluZm8tPmVycl9zaGFkb3cgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBNT1hBX1NFVF9CQVVEX01FVEhPRDogeworCQlpbnQgbWV0aG9kOworCisJCWlmIChnZXRfdXNlcihtZXRob2QsIChpbnQgX191c2VyICopYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbXhzZXJfc2V0X2JhdWRfbWV0aG9kW3R0eS0+aW5kZXhdID0gbWV0aG9kOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtZXRob2QsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfc3RvcHJ4KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCisJaW5mby0+bGRpc2Nfc3RvcF9yeCA9IDE7CisJaWYgKElfSVhPRkYodHR5KSkgeworCQlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgeworCQkJaW5mby0+SUVSICY9IH5NT1hBX01VU1RfUkVDVl9JU1I7CisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCQl9IGVsc2UgeworCQkJaW5mby0+eF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CisJCQlvdXRiKDAsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKKwkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKKwkJfQorCX0KKworCWlmIChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOworCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOworCX0KK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHVwcGVyLWxheWVyIHR0eSBsYXllciB0byBzaWduYWwgdGhhdAorICogaW5jb21pbmcgY2hhcmFjdGVycyBzaG91bGQgYmUgdGhyb3R0bGVkLgorICovCitzdGF0aWMgdm9pZCBteHNlcl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCW14c2VyX3N0b3ByeCh0dHkpOworfQorCitzdGF0aWMgdm9pZCBteHNlcl91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCisJLyogc3RhcnRyeCAqLworCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJaWYgKGluZm8tPnhfY2hhcikKKwkJCWluZm8tPnhfY2hhciA9IDA7CisJCWVsc2UgeworCQkJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJCQlpbmZvLT5JRVIgfD0gTU9YQV9NVVNUX1JFQ1ZfSVNSOworCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CisJCQl9IGVsc2UgeworCQkJCWluZm8tPnhfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKKwkJCQlvdXRiKDAsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKKwkJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCQkJfQorCQl9CisJfQorCisJaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX1JUUzsKKwkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKKwl9Cit9CisKKy8qCisgKiBteHNlcl9zdG9wKCkgYW5kIG14c2VyX3N0YXJ0KCkKKyAqCisgKiBUaGlzIHJvdXRpbmVzIGFyZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgb3IgcmVzZXR0aW5nIHR0eS0+c3RvcHBlZC4KKyAqIFRoZXkgZW5hYmxlIG9yIGRpc2FibGUgdHJhbnNtaXR0ZXIgaW50ZXJydXB0cywgYXMgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgdm9pZCBteHNlcl9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkgeworCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAoaW5mby0+eG1pdF9jbnQgJiYgaW5mby0+eG1pdF9idWYpIHsKKwkJb3V0YihpbmZvLT5JRVIgJiB+VUFSVF9JRVJfVEhSSSwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKKwkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSB8fAorCQkJKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgIT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCisJCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CisKKwkJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJCQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQkJdHR5LT5od19zdG9wcGVkID0gMDsKKwkJCW14c2VyX3N0YXJ0KHR0eSk7CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgc3cgc3RvcHBlZCAqLworCWlmICgob2xkX3Rlcm1pb3MtPmNfaWZsYWcgJiBJWE9OKSAmJgorCQkJISh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9OKSkgeworCQl0dHktPnN0b3BwZWQgPSAwOworCisJCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJCURJU0FCTEVfTU9YQV9NVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5pb2FkZHIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJfQorCisJCW14c2VyX3N0YXJ0KHR0eSk7CisJfQorfQorCisvKgorICogbXhzZXJfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5CisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMsIGNoYXJfdGltZTsKKwlpbnQgbHNyOworCisJaWYgKGluZm8tPnR5cGUgPT0gUE9SVF9VTktOT1dOKQorCQlyZXR1cm47CisKKwlpZiAoaW5mby0+eG1pdF9maWZvX3NpemUgPT0gMCkKKwkJcmV0dXJuOwkJLyogSnVzdCBpbiBjYXNlLi4uLiAqLworCisJb3JpZ19qaWZmaWVzID0gamlmZmllczsKKwkvKgorCSAqIFNldCB0aGUgY2hlY2sgaW50ZXJ2YWwgdG8gYmUgMS81IG9mIHRoZSBlc3RpbWF0ZWQgdGltZSB0bworCSAqIHNlbmQgYSBzaW5nbGUgY2hhcmFjdGVyLCBhbmQgbWFrZSBpdCBhdCBsZWFzdCAxLiAgVGhlIGNoZWNrCisJICogaW50ZXJ2YWwgc2hvdWxkIGFsc28gYmUgbGVzcyB0aGFuIHRoZSB0aW1lb3V0LgorCSAqCisJICogTm90ZTogd2UgaGF2ZSB0byB1c2UgcHJldHR5IHRpZ2h0IHRpbWluZ3MgaGVyZSB0byBzYXRpc2Z5CisJICogdGhlIE5JU1QtUENUUy4KKwkgKi8KKwljaGFyX3RpbWUgPSAoaW5mby0+dGltZW91dCAtIEhaIC8gNTApIC8gaW5mby0+eG1pdF9maWZvX3NpemU7CisJY2hhcl90aW1lID0gY2hhcl90aW1lIC8gNTsKKwlpZiAoY2hhcl90aW1lID09IDApCisJCWNoYXJfdGltZSA9IDE7CisJaWYgKHRpbWVvdXQgJiYgdGltZW91dCA8IGNoYXJfdGltZSkKKwkJY2hhcl90aW1lID0gdGltZW91dDsKKwkvKgorCSAqIElmIHRoZSB0cmFuc21pdHRlciBoYXNuJ3QgY2xlYXJlZCBpbiB0d2ljZSB0aGUgYXBwcm94aW1hdGUKKwkgKiBhbW91bnQgb2YgdGltZSB0byBzZW5kIHRoZSBlbnRpcmUgRklGTywgaXQgcHJvYmFibHkgd29uJ3QKKwkgKiBldmVyIGNsZWFyLiAgVGhpcyBhc3N1bWVzIHRoZSBVQVJUIGlzbid0IGRvaW5nIGZsb3cKKwkgKiBjb250cm9sLCB3aGljaCBpcyBjdXJyZW50bHkgdGhlIGNhc2UuICBIZW5jZSwgaWYgaXQgZXZlcgorCSAqIHRha2VzIGxvbmdlciB0aGFuIGluZm8tPnRpbWVvdXQsIHRoaXMgaXMgcHJvYmFibHkgZHVlIHRvIGEKKwkgKiBVQVJUIGJ1ZyBvZiBzb21lIGtpbmQuICBTbywgd2UgY2xhbXAgdGhlIHRpbWVvdXQgcGFyYW1ldGVyIGF0CisJICogMippbmZvLT50aW1lb3V0LgorCSAqLworCWlmICghdGltZW91dCB8fCB0aW1lb3V0ID4gMiAqIGluZm8tPnRpbWVvdXQpCisJCXRpbWVvdXQgPSAyICogaW5mby0+dGltZW91dDsKKyNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCisJcHJpbnRrKEtFUk5fREVCVUcgIkluIHJzX3dhaXRfdW50aWxfc2VudCglZCkgY2hlY2s9JWx1Li4uIiwKKwkJdGltZW91dCwgY2hhcl90aW1lKTsKKwlwcmludGsoImppZmY9JWx1Li4uIiwgamlmZmllcyk7CisjZW5kaWYKKwl3aGlsZSAoISgobHNyID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKSkgJiBVQVJUX0xTUl9URU1UKSkgeworI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKKwkJcHJpbnRrKCJsc3IgPSAlZCAoamlmZj0lbHUpLi4uIiwgbHNyLCBqaWZmaWVzKTsKKyNlbmRpZgorCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoY2hhcl90aW1lKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWlmICh0aW1lb3V0ICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgb3JpZ19qaWZmaWVzICsgdGltZW91dCkpCisJCQlicmVhazsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKKwlwcmludGsoImxzciA9ICVkIChqaWZmPSVsdSkuLi5kb25lXG4iLCBsc3IsIGppZmZpZXMpOworI2VuZGlmCit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgorICovCit2b2lkIG14c2VyX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCW14c2VyX2ZsdXNoX2J1ZmZlcih0dHkpOworCW14c2VyX3NodXRkb3duKGluZm8pOworCWluZm8tPmV2ZW50ID0gMDsKKwlpbmZvLT5jb3VudCA9IDA7CisJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CisJaW5mby0+dHR5ID0gTlVMTDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Cit9CisKKy8qCisgKiBteHNlcl9yc19icmVhaygpIC0tLSByb3V0aW5lIHdoaWNoIHR1cm5zIHRoZSBicmVhayBoYW5kbGluZyBvbiBvciBvZmYKKyAqLworc3RhdGljIHZvaWQgbXhzZXJfcnNfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJaWYgKGJyZWFrX3N0YXRlID09IC0xKQorCQlvdXRiKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsCisJCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CisJZWxzZQorCQlvdXRiKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUikgJiB+VUFSVF9MQ1JfU0JDLAorCQkJaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX3JlY2VpdmVfY2hhcnMoc3RydWN0IG14c2VyX3BvcnQgKnBvcnQsIGludCAqc3RhdHVzKQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT50dHk7CisJdW5zaWduZWQgY2hhciBjaCwgZ2RsOworCWludCBpZ25vcmVkID0gMDsKKwlpbnQgY250ID0gMDsKKwlpbnQgcmVjdl9yb29tOworCWludCBtYXggPSAyNTY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5zbG9jaywgZmxhZ3MpOworCisJcmVjdl9yb29tID0gdHR5LT5yZWNlaXZlX3Jvb207CisJaWYgKChyZWN2X3Jvb20gPT0gMCkgJiYgKCFwb3J0LT5sZGlzY19zdG9wX3J4KSkKKwkJbXhzZXJfc3RvcHJ4KHR0eSk7CisKKwlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZyAhPSBNT1hBX09USEVSX1VBUlQpIHsKKworCQlpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX1NQRUNJQUwpCisJCQlnb3RvIGludHJfb2xkOworCQlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZyA9PSBNT1hBX01VU1RfTVU4NjBfSFdJRCAmJgorCQkJCSgqc3RhdHVzICYgTU9YQV9NVVNUX0xTUl9SRVJSKSkKKwkJCWdvdG8gaW50cl9vbGQ7CisJCWlmICgqc3RhdHVzICYgTU9YQV9NVVNUX0xTUl9SRVJSKQorCQkJZ290byBpbnRyX29sZDsKKworCQlnZGwgPSBpbmIocG9ydC0+aW9hZGRyICsgTU9YQV9NVVNUX0dETF9SRUdJU1RFUik7CisKKwkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcgPT0gTU9YQV9NVVNUX01VMTUwX0hXSUQpCisJCQlnZGwgJj0gTU9YQV9NVVNUX0dETF9NQVNLOworCQlpZiAoZ2RsID49IHJlY3Zfcm9vbSkgeworCQkJaWYgKCFwb3J0LT5sZGlzY19zdG9wX3J4KQorCQkJCW14c2VyX3N0b3ByeCh0dHkpOworCQl9CisJCXdoaWxlIChnZGwtLSkgeworCQkJY2ggPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9SWCk7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCAwKTsKKwkJCWNudCsrOworCQl9CisJCWdvdG8gZW5kX2ludHI7CisJfQoraW50cl9vbGQ6CisKKwlkbyB7CisJCWlmIChtYXgtLSA8IDApCisJCQlicmVhazsKKworCQljaCA9IGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX1JYKTsKKwkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcgJiYgKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkpCisJCQlvdXRiKDB4MjMsIHBvcnQtPmlvYWRkciArIFVBUlRfRkNSKTsKKwkJKnN0YXR1cyAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQlpZiAoKnN0YXR1cyAmIHBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzaykgeworCQkJaWYgKCsraWdub3JlZCA+IDEwMCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWNoYXIgZmxhZyA9IDA7CisJCQlpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX1NQRUNJQUwpIHsKKwkJCQlpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX0JJKSB7CisJCQkJCWZsYWcgPSBUVFlfQlJFQUs7CisJCQkJCXBvcnQtPmljb3VudC5icmsrKzsKKworCQkJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCQlkb19TQUsodHR5KTsKKwkJCQl9IGVsc2UgaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9QRSkgeworCQkJCQlmbGFnID0gVFRZX1BBUklUWTsKKwkJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOworCQkJCX0gZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX0ZFKSB7CisJCQkJCWZsYWcgPSBUVFlfRlJBTUU7CisJCQkJCXBvcnQtPmljb3VudC5mcmFtZSsrOworCQkJCX0gZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX09FKSB7CisJCQkJCWZsYWcgPSBUVFlfT1ZFUlJVTjsKKwkJCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKKwkJCQl9CisJCQl9CisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKKwkJCWNudCsrOworCQkJaWYgKGNudCA+PSByZWN2X3Jvb20pIHsKKwkJCQlpZiAoIXBvcnQtPmxkaXNjX3N0b3BfcngpCisJCQkJCW14c2VyX3N0b3ByeCh0dHkpOworCQkJCWJyZWFrOworCQkJfQorCisJCX0KKworCQlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZykKKwkJCWJyZWFrOworCisJCSpzdGF0dXMgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9MU1IpOworCX0gd2hpbGUgKCpzdGF0dXMgJiBVQVJUX0xTUl9EUik7CisKK2VuZF9pbnRyOgorCW14dmFyX2xvZy5yeGNudFtwb3J0LT50dHktPmluZGV4XSArPSBjbnQ7CisJcG9ydC0+bW9uX2RhdGEucnhjbnQgKz0gY250OworCXBvcnQtPm1vbl9kYXRhLnVwX3J4Y250ICs9IGNudDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5zbG9jaywgZmxhZ3MpOworCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworc3RhdGljIHZvaWQgbXhzZXJfdHJhbnNtaXRfY2hhcnMoc3RydWN0IG14c2VyX3BvcnQgKnBvcnQpCit7CisJaW50IGNvdW50LCBjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5zbG9jaywgZmxhZ3MpOworCisJaWYgKHBvcnQtPnhfY2hhcikgeworCQlvdXRiKHBvcnQtPnhfY2hhciwgcG9ydC0+aW9hZGRyICsgVUFSVF9UWCk7CisJCXBvcnQtPnhfY2hhciA9IDA7CisJCW14dmFyX2xvZy50eGNudFtwb3J0LT50dHktPmluZGV4XSsrOworCQlwb3J0LT5tb25fZGF0YS50eGNudCsrOworCQlwb3J0LT5tb25fZGF0YS51cF90eGNudCsrOworCQlwb3J0LT5pY291bnQudHgrKzsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKHBvcnQtPnhtaXRfYnVmID09IDApCisJCWdvdG8gdW5sb2NrOworCisJaWYgKChwb3J0LT54bWl0X2NudCA8PSAwKSB8fCBwb3J0LT50dHktPnN0b3BwZWQgfHwKKwkJCShwb3J0LT50dHktPmh3X3N0b3BwZWQgJiYKKwkJCShwb3J0LT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgorCQkJKCFwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSkpIHsKKwkJcG9ydC0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQlvdXRiKHBvcnQtPklFUiwgcG9ydC0+aW9hZGRyICsgVUFSVF9JRVIpOworCQlnb3RvIHVubG9jazsKKwl9CisKKwljbnQgPSBwb3J0LT54bWl0X2NudDsKKwljb3VudCA9IHBvcnQtPnhtaXRfZmlmb19zaXplOworCWRvIHsKKwkJb3V0Yihwb3J0LT54bWl0X2J1Zltwb3J0LT54bWl0X3RhaWwrK10sCisJCQlwb3J0LT5pb2FkZHIgKyBVQVJUX1RYKTsKKwkJcG9ydC0+eG1pdF90YWlsID0gcG9ydC0+eG1pdF90YWlsICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKKwkJaWYgKC0tcG9ydC0+eG1pdF9jbnQgPD0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKKwlteHZhcl9sb2cudHhjbnRbcG9ydC0+dHR5LT5pbmRleF0gKz0gKGNudCAtIHBvcnQtPnhtaXRfY250KTsKKworCXBvcnQtPm1vbl9kYXRhLnR4Y250ICs9IChjbnQgLSBwb3J0LT54bWl0X2NudCk7CisJcG9ydC0+bW9uX2RhdGEudXBfdHhjbnQgKz0gKGNudCAtIHBvcnQtPnhtaXRfY250KTsKKwlwb3J0LT5pY291bnQudHggKz0gKGNudCAtIHBvcnQtPnhtaXRfY250KTsKKworCWlmIChwb3J0LT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgeworCQlzZXRfYml0KE1YU0VSX0VWRU5UX1RYTE9XLCAmcG9ydC0+ZXZlbnQpOworCQlzY2hlZHVsZV93b3JrKCZwb3J0LT50cXVldWUpOworCX0KKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCkgeworCQlwb3J0LT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCW91dGIocG9ydC0+SUVSLCBwb3J0LT5pb2FkZHIgKyBVQVJUX0lFUik7CisJfQordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnNsb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzZXJpYWwgZHJpdmVyJ3MgZ2VuZXJpYyBpbnRlcnJ1cHQgcm91dGluZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbXhzZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlpbnQgc3RhdHVzLCBpaXIsIGk7CisJc3RydWN0IG14c2VyX2JvYXJkICpicmQgPSBOVUxMOworCXN0cnVjdCBteHNlcl9wb3J0ICpwb3J0OworCWludCBtYXgsIGlycWJpdHMsIGJpdHMsIG1zcjsKKwlpbnQgcGFzc19jb3VudGVyID0gMDsKKwl1bnNpZ25lZCBpbnQgaW50X2NudDsKKwlpbnQgaGFuZGxlZCA9IElSUV9OT05FOworCisJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKQorCQlpZiAoZGV2X2lkID09ICZteHNlcl9ib2FyZHNbaV0pIHsKKwkJCWJyZCA9IGRldl9pZDsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoaSA9PSBNWFNFUl9CT0FSRFMpCisJCWdvdG8gaXJxX3N0b3A7CisJaWYgKGJyZCA9PSBOVUxMKQorCQlnb3RvIGlycV9zdG9wOworCW1heCA9IGJyZC0+aW5mby0+bnBvcnRzOworCXdoaWxlICgxKSB7CisJCWlycWJpdHMgPSBpbmIoYnJkLT52ZWN0b3IpICYgYnJkLT52ZWN0b3JfbWFzazsKKwkJaWYgKGlycWJpdHMgPT0gYnJkLT52ZWN0b3JfbWFzaykKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwkJZm9yIChpID0gMCwgYml0cyA9IDE7IGkgPCBtYXg7IGkrKywgaXJxYml0cyB8PSBiaXRzLCBiaXRzIDw8PSAxKSB7CisJCQlpZiAoaXJxYml0cyA9PSBicmQtPnZlY3Rvcl9tYXNrKQorCQkJCWJyZWFrOworCQkJaWYgKGJpdHMgJiBpcnFiaXRzKQorCQkJCWNvbnRpbnVlOworCQkJcG9ydCA9ICZicmQtPnBvcnRzW2ldOworCisJCQlpbnRfY250ID0gMDsKKwkJCWRvIHsKKwkJCQlpaXIgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9JSVIpOworCQkJCWlmIChpaXIgJiBVQVJUX0lJUl9OT19JTlQpCisJCQkJCWJyZWFrOworCQkJCWlpciAmPSBNT1hBX01VU1RfSUlSX01BU0s7CisJCQkJaWYgKCFwb3J0LT50dHkpIHsKKwkJCQkJc3RhdHVzID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTFNSKTsKKwkJCQkJb3V0YigweDI3LCBwb3J0LT5pb2FkZHIgKyBVQVJUX0ZDUik7CisJCQkJCWluYihwb3J0LT5pb2FkZHIgKyBVQVJUX01TUik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXN0YXR1cyA9IGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX0xTUik7CisKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfUEUpCisJCQkJCXBvcnQtPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfUEFSSVRZOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkKKwkJCQkJcG9ydC0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9GUkFNSU5HOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9PRSkKKwkJCQkJcG9ydC0+ZXJyX3NoYWRvdyB8PQorCQkJCQkJTlBQSV9OT1RJRllfSFdfT1ZFUlJVTjsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfQkkpCisJCQkJCXBvcnQtPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfQlJFQUs7CisKKwkJCQlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZykgeworCQkJCQlpZiAoaWlyID09IE1PWEFfTVVTVF9JSVJfR0RBIHx8CisJCQkJCSAgICBpaXIgPT0gTU9YQV9NVVNUX0lJUl9SREEgfHwKKwkJCQkJICAgIGlpciA9PSBNT1hBX01VU1RfSUlSX1JUTyB8fAorCQkJCQkgICAgaWlyID09IE1PWEFfTVVTVF9JSVJfTFNSKQorCQkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyhwb3J0LAorCQkJCQkJCQkmc3RhdHVzKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXN0YXR1cyAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRFIpCisJCQkJCQlteHNlcl9yZWNlaXZlX2NoYXJzKHBvcnQsCisJCQkJCQkJCSZzdGF0dXMpOworCQkJCX0KKwkJCQltc3IgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9NU1IpOworCQkJCWlmIChtc3IgJiBVQVJUX01TUl9BTllfREVMVEEpCisJCQkJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhwb3J0LCBtc3IpOworCisJCQkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJCQkJaWYgKGlpciA9PSAweDAyICYmIChzdGF0dXMgJgorCQkJCQkJCQlVQVJUX0xTUl9USFJFKSkKKwkJCQkJCW14c2VyX3RyYW5zbWl0X2NoYXJzKHBvcnQpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9USFJFKQorCQkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnMocG9ydCk7CisJCQkJfQorCQkJfSB3aGlsZSAoaW50X2NudCsrIDwgTVhTRVJfSVNSX1BBU1NfTElNSVQpOworCQl9CisJCWlmIChwYXNzX2NvdW50ZXIrKyA+IE1YU0VSX0lTUl9QQVNTX0xJTUlUKQorCQkJYnJlYWs7CS8qIFByZXZlbnQgaW5maW5pdGUgbG9vcHMgKi8KKwl9CisKK2lycV9zdG9wOgorCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIG14c2VyX29wcyA9IHsKKwkub3BlbiA9IG14c2VyX29wZW4sCisJLmNsb3NlID0gbXhzZXJfY2xvc2UsCisJLndyaXRlID0gbXhzZXJfd3JpdGUsCisJLnB1dF9jaGFyID0gbXhzZXJfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gbXhzZXJfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBteHNlcl93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBteHNlcl9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IG14c2VyX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBteHNlcl9pb2N0bCwKKwkudGhyb3R0bGUgPSBteHNlcl90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IG14c2VyX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gbXhzZXJfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBteHNlcl9zdG9wLAorCS5zdGFydCA9IG14c2VyX3N0YXJ0LAorCS5oYW5ndXAgPSBteHNlcl9oYW5ndXAsCisJLmJyZWFrX2N0bCA9IG14c2VyX3JzX2JyZWFrLAorCS53YWl0X3VudGlsX3NlbnQgPSBteHNlcl93YWl0X3VudGlsX3NlbnQsCisJLnRpb2NtZ2V0ID0gbXhzZXJfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gbXhzZXJfdGlvY21zZXQsCit9OworCisvKgorICogVGhlIE1PWEEgU21hcnRpby9JbmR1c3RpbyBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQorICovCisKK3N0YXRpYyB2b2lkIG14c2VyX3JlbGVhc2VfcmVzKHN0cnVjdCBteHNlcl9ib2FyZCAqYnJkLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJdW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxKQorCQlmcmVlX2lycShicmQtPmlycSwgYnJkKTsKKwlpZiAocGRldiAhPSBOVUxMKSB7CS8qIFBDSSAqLworI2lmZGVmIENPTkZJR19QQ0kKKwkJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDIpOworCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMyk7CisJCXBjaV9kZXZfcHV0KHBkZXYpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJcmVsZWFzZV9yZWdpb24oYnJkLT5wb3J0c1swXS5pb2FkZHIsIDggKiBicmQtPmluZm8tPm5wb3J0cyk7CisJCXJlbGVhc2VfcmVnaW9uKGJyZC0+dmVjdG9yLCAxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG14c2VyX2luaXRicmQoc3RydWN0IG14c2VyX2JvYXJkICpicmQsCisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvOworCXVuc2lnbmVkIGludCBpOworCWludCByZXR2YWw7CisKKwlwcmludGsoS0VSTl9JTkZPICJtYXguIGJhdWQgcmF0ZSA9ICVkIGJwcy5cbiIsIGJyZC0+cG9ydHNbMF0ubWF4X2JhdWQpOworCisJZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspIHsKKwkJaW5mbyA9ICZicmQtPnBvcnRzW2ldOworCQlpbmZvLT5ib2FyZCA9IGJyZDsKKwkJaW5mby0+c3RvcF9yeCA9IDA7CisJCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOworCisJCS8qIEVuaGFuY2UgbW9kZSBlbmFibGVkIGhlcmUgKi8KKwkJaWYgKGJyZC0+Y2hpcF9mbGFnICE9IE1PWEFfT1RIRVJfVUFSVCkKKwkJCUVOQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShpbmZvLT5pb2FkZHIpOworCisJCWluZm8tPmZsYWdzID0gQVNZTkNfU0hBUkVfSVJROworCQlpbmZvLT50eXBlID0gYnJkLT51YXJ0X3R5cGU7CisKKwkJcHJvY2Vzc190eHJ4X2ZpZm8oaW5mbyk7CisKKwkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5iYXVkX2Jhc2UgKiAxNjsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1ICogSFogLyAxMDsKKwkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAgKiBIWjsKKwkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWUsIG14c2VyX2RvX3NvZnRpbnQpOworCQlpbmZvLT5ub3JtYWxfdGVybWlvcyA9IG14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvczsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+Y2xvc2Vfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwkJbWVtc2V0KCZpbmZvLT5tb25fZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBteHNlcl9tb24pKTsKKwkJaW5mby0+ZXJyX3NoYWRvdyA9IDA7CisJCXNwaW5fbG9ja19pbml0KCZpbmZvLT5zbG9jayk7CisKKwkJLyogYmVmb3JlIHNldCBJTlQgSVNSLCBkaXNhYmxlIGFsbCBpbnQgKi8KKwkJb3V0YihpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpICYgMHhmMCwKKwkJCWluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKKwl9CisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgSVJRIGlmIG5lY2Vzc2FyeQorCSAqLworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoYnJkLT5pcnEsIG14c2VyX2ludGVycnVwdCwKKwkJCShicmQtPnBvcnRzWzBdLmZsYWdzICYgQVNZTkNfU0hBUkVfSVJRKSA/IElSUUZfU0hBUkVEIDoKKwkJCUlSUUZfRElTQUJMRUQsICJteHNlciIsIGJyZCk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgIkJvYXJkICVzOiBSZXF1ZXN0IGlycSBmYWlsZWQsIElSUSAoJWQpIG1heSAiCisJCQkiY29uZmxpY3Qgd2l0aCBhbm90aGVyIGRldmljZS5cbiIsCisJCQlicmQtPmluZm8tPm5hbWUsIGJyZC0+aXJxKTsKKwkJLyogV2UgaG9sZCByZXNvdXJjZXMsIHdlIG5lZWQgdG8gcmVsZWFzZSB0aGVtLiAqLworCQlteHNlcl9yZWxlYXNlX3JlcyhicmQsIHBkZXYsIDApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXhzZXJfZ2V0X0lTQV9jb25mKGludCBjYXAsIHN0cnVjdCBteHNlcl9ib2FyZCAqYnJkKQoreworCWludCBpZCwgaSwgYml0czsKKwl1bnNpZ25lZCBzaG9ydCByZWdzWzE2XSwgaXJxOworCXVuc2lnbmVkIGNoYXIgc2NyYXRjaCwgc2NyYXRjaDI7CisKKwlicmQtPmNoaXBfZmxhZyA9IE1PWEFfT1RIRVJfVUFSVDsKKworCWlkID0gbXhzZXJfcmVhZF9yZWdpc3RlcihjYXAsIHJlZ3MpOworCXN3aXRjaCAoaWQpIHsKKwljYXNlIEMxNjhfQVNJQ19JRDoKKwkJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzWzBdOworCQlicmVhazsKKwljYXNlIEMxMDRfQVNJQ19JRDoKKwkJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzWzFdOworCQlicmVhazsKKwljYXNlIENJMTA0Sl9BU0lDX0lEOgorCQlicmQtPmluZm8gPSAmbXhzZXJfY2FyZHNbMl07CisJCWJyZWFrOworCWNhc2UgQzEwMl9BU0lDX0lEOgorCQlicmQtPmluZm8gPSAmbXhzZXJfY2FyZHNbNV07CisJCWJyZWFrOworCWNhc2UgQ0kxMzJfQVNJQ19JRDoKKwkJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzWzZdOworCQlicmVhazsKKwljYXNlIENJMTM0X0FTSUNfSUQ6CisJCWJyZC0+aW5mbyA9ICZteHNlcl9jYXJkc1s3XTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaXJxID0gMDsKKwkvKiBzb21lIElTQSBjYXJkcyBoYXZlIDIgcG9ydHMsIGJ1dCB3ZSB3YW50IHRvIHNlZSB0aGVtIGFzIDQtcG9ydCAod2h5PykKKwkgICBGbGFnLWhhY2sgY2hlY2tzIGlmIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHJlYWQgYXMgMi1wb3J0IGhlcmUuICovCisJaWYgKGJyZC0+aW5mby0+bnBvcnRzID09IDIgfHwgKGJyZC0+aW5mby0+ZmxhZ3MgJiBNWFNFUl9IQVMyKSkgeworCQlpcnEgPSByZWdzWzldICYgMHhGMDAwOworCQlpcnEgPSBpcnEgfCAoaXJxID4+IDQpOworCQlpZiAoaXJxICE9IChyZWdzWzldICYgMHhGRjAwKSkKKwkJCXJldHVybiBNWFNFUl9FUlJfSVJRX0NPTkZMSVQ7CisJfSBlbHNlIGlmIChicmQtPmluZm8tPm5wb3J0cyA9PSA0KSB7CisJCWlycSA9IHJlZ3NbOV0gJiAweEYwMDA7CisJCWlycSA9IGlycSB8IChpcnEgPj4gNCk7CisJCWlycSA9IGlycSB8IChpcnEgPj4gOCk7CisJCWlmIChpcnEgIT0gcmVnc1s5XSkKKwkJCXJldHVybiBNWFNFUl9FUlJfSVJRX0NPTkZMSVQ7CisJfSBlbHNlIGlmIChicmQtPmluZm8tPm5wb3J0cyA9PSA4KSB7CisJCWlycSA9IHJlZ3NbOV0gJiAweEYwMDA7CisJCWlycSA9IGlycSB8IChpcnEgPj4gNCk7CisJCWlycSA9IGlycSB8IChpcnEgPj4gOCk7CisJCWlmICgoaXJxICE9IHJlZ3NbOV0pIHx8IChpcnEgIT0gcmVnc1sxMF0pKQorCQkJcmV0dXJuIE1YU0VSX0VSUl9JUlFfQ09ORkxJVDsKKwl9CisKKwlpZiAoIWlycSkKKwkJcmV0dXJuIE1YU0VSX0VSUl9JUlE7CisJYnJkLT5pcnEgPSAoKGludCkoaXJxICYgMHhGMDAwKSA+PiAxMik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJYnJkLT5wb3J0c1tpXS5pb2FkZHIgPSAoaW50KSByZWdzW2kgKyAxXSAmIDB4RkZGODsKKwlpZiAoKHJlZ3NbMTJdICYgMHg4MCkgPT0gMCkKKwkJcmV0dXJuIE1YU0VSX0VSUl9WRUNUT1I7CisJYnJkLT52ZWN0b3IgPSAoaW50KXJlZ3NbMTFdOwkvKiBpbnRlcnJ1cHQgdmVjdG9yICovCisJaWYgKGlkID09IDEpCisJCWJyZC0+dmVjdG9yX21hc2sgPSAweDAwRkY7CisJZWxzZQorCQlicmQtPnZlY3Rvcl9tYXNrID0gMHgwMDBGOworCWZvciAoaSA9IDcsIGJpdHMgPSAweDAxMDA7IGkgPj0gMDsgaS0tLCBiaXRzIDw8PSAxKSB7CisJCWlmIChyZWdzWzEyXSAmIGJpdHMpIHsKKwkJCWJyZC0+cG9ydHNbaV0uYmF1ZF9iYXNlID0gOTIxNjAwOworCQkJYnJkLT5wb3J0c1tpXS5tYXhfYmF1ZCA9IDkyMTYwMDsKKwkJfSBlbHNlIHsKKwkJCWJyZC0+cG9ydHNbaV0uYmF1ZF9iYXNlID0gMTE1MjAwOworCQkJYnJkLT5wb3J0c1tpXS5tYXhfYmF1ZCA9IDExNTIwMDsKKwkJfQorCX0KKwlzY3JhdGNoMiA9IGluYihjYXAgKyBVQVJUX0xDUikgJiAoflVBUlRfTENSX0RMQUIpOworCW91dGIoc2NyYXRjaDIgfCBVQVJUX0xDUl9ETEFCLCBjYXAgKyBVQVJUX0xDUik7CisJb3V0YigwLCBjYXAgKyBVQVJUX0VGUik7CS8qIEVGUiBpcyB0aGUgc2FtZSBhcyBGQ1IgKi8KKwlvdXRiKHNjcmF0Y2gyLCBjYXAgKyBVQVJUX0xDUik7CisJb3V0YihVQVJUX0ZDUl9FTkFCTEVfRklGTywgY2FwICsgVUFSVF9GQ1IpOworCXNjcmF0Y2ggPSBpbmIoY2FwICsgVUFSVF9JSVIpOworCisJaWYgKHNjcmF0Y2ggJiAweEMwKQorCQlicmQtPnVhcnRfdHlwZSA9IFBPUlRfMTY1NTBBOworCWVsc2UKKwkJYnJkLT51YXJ0X3R5cGUgPSBQT1JUXzE2NDUwOworCWlmICghcmVxdWVzdF9yZWdpb24oYnJkLT5wb3J0c1swXS5pb2FkZHIsIDggKiBicmQtPmluZm8tPm5wb3J0cywKKwkJCSJteHNlcihJTykiKSkKKwkJcmV0dXJuIE1YU0VSX0VSUl9JT0FERFI7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihicmQtPnZlY3RvciwgMSwgIm14c2VyKHZlY3RvcikiKSkgeworCQlyZWxlYXNlX3JlZ2lvbihicmQtPnBvcnRzWzBdLmlvYWRkciwgOCAqIGJyZC0+aW5mby0+bnBvcnRzKTsKKwkJcmV0dXJuIE1YU0VSX0VSUl9WRUNUT1I7CisJfQorCXJldHVybiBicmQtPmluZm8tPm5wb3J0czsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXhzZXJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisjaWZkZWYgQ09ORklHX1BDSQorCXN0cnVjdCBteHNlcl9ib2FyZCAqYnJkOworCXVuc2lnbmVkIGludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyZXNzOworCWludCByZXR2YWwgPSAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKQorCQlpZiAobXhzZXJfYm9hcmRzW2ldLmluZm8gPT0gTlVMTCkKKwkJCWJyZWFrOworCisJaWYgKGkgPj0gTVhTRVJfQk9BUkRTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVG9vIG1hbnkgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgYm9hcmRzIGZvdW5kICIKKwkJCSIobWF4aW11bSAlZCksIGJvYXJkIG5vdCBjb25maWd1cmVkXG4iLCBNWFNFUl9CT0FSRFMpOworCQlnb3RvIGVycjsKKwl9CisKKwlicmQgPSAmbXhzZXJfYm9hcmRzW2ldOworCWJyZC0+aWR4ID0gaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsKKwlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkIChCdXNObz0lZCwgRGV2Tm89JWQpXG4iLAorCQlteHNlcl9jYXJkc1tlbnQtPmRyaXZlcl9kYXRhXS5uYW1lLAorCQlwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pKTsKKworCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNb3hhIFNtYXJ0SS9PIFBDSSBlbmFibGUgZmFpbCAhXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogaW8gYWRkcmVzcyAqLworCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwlyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMiwgIm14c2VyKElPKSIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzW2VudC0+ZHJpdmVyX2RhdGFdOworCWZvciAoaSA9IDA7IGkgPCBicmQtPmluZm8tPm5wb3J0czsgaSsrKQorCQlicmQtPnBvcnRzW2ldLmlvYWRkciA9IGlvYWRkcmVzcyArIDggKiBpOworCisJLyogdmVjdG9yICovCisJaW9hZGRyZXNzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCXJldHZhbCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAzLCAibXhzZXIodmVjdG9yKSIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX3JlbGlvOworCWJyZC0+dmVjdG9yID0gaW9hZGRyZXNzOworCisJLyogaXJxICovCisJYnJkLT5pcnEgPSBwZGV2LT5pcnE7CisKKwlicmQtPmNoaXBfZmxhZyA9IENoZWNrSXNNb3hhTXVzdChicmQtPnBvcnRzWzBdLmlvYWRkcik7CisJYnJkLT51YXJ0X3R5cGUgPSBQT1JUXzE2NTUwQTsKKwlicmQtPnZlY3Rvcl9tYXNrID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBicmQtPmluZm8tPm5wb3J0czsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBVQVJUX0lORk9fTlVNOyBqKyspIHsKKwkJCWlmIChHcGNpX3VhcnRfaW5mb1tqXS50eXBlID09IGJyZC0+Y2hpcF9mbGFnKSB7CisJCQkJYnJkLT5wb3J0c1tpXS5tYXhfYmF1ZCA9CisJCQkJCUdwY2lfdWFydF9pbmZvW2pdLm1heF9iYXVkOworCisJCQkJLyogZXhjZXB0aW9uLi4uLkNQLTEwMiAqLworCQkJCWlmIChicmQtPmluZm8tPmZsYWdzICYgTVhTRVJfSElHSEJBVUQpCisJCQkJCWJyZC0+cG9ydHNbaV0ubWF4X2JhdWQgPSA5MjE2MDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoYnJkLT5jaGlwX2ZsYWcgPT0gTU9YQV9NVVNUX01VODYwX0hXSUQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspIHsKKwkJCWlmIChpIDwgNCkKKwkJCQlicmQtPnBvcnRzW2ldLm9wbW9kZV9pb2FkZHIgPSBpb2FkZHJlc3MgKyA0OworCQkJZWxzZQorCQkJCWJyZC0+cG9ydHNbaV0ub3Btb2RlX2lvYWRkciA9IGlvYWRkcmVzcyArIDB4MGM7CisJCX0KKwkJb3V0YigwLCBpb2FkZHJlc3MgKyA0KTsJLyogZGVmYXVsdCBzZXQgdG8gUlMyMzIgbW9kZSAqLworCQlvdXRiKDAsIGlvYWRkcmVzcyArIDB4MGMpOwkvKiBkZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlICovCisJfQorCisJZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspIHsKKwkJYnJkLT52ZWN0b3JfbWFzayB8PSAoMSA8PCBpKTsKKwkJYnJkLT5wb3J0c1tpXS5iYXVkX2Jhc2UgPSA5MjE2MDA7CisJfQorCisJLyogbXhzZXJfaW5pdGJyZCB3aWxsIGhvb2sgSVNSLiAqLworCWlmIChteHNlcl9pbml0YnJkKGJyZCwgcGRldikgPCAwKQorCQlnb3RvIGVycl9yZWx2ZWM7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5pbmZvLT5ucG9ydHM7IGkrKykKKwkJdHR5X3JlZ2lzdGVyX2RldmljZShteHZhcl9zZHJpdmVyLCBicmQtPmlkeCArIGksICZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJyZCk7CisKKwlyZXR1cm4gMDsKK2Vycl9yZWx2ZWM6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDMpOworZXJyX3JlbGlvOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAyKTsKKwlicmQtPmluZm8gPSBOVUxMOworZXJyOgorCXJldHVybiByZXR2YWw7CisjZWxzZQorCXJldHVybiAtRU5PREVWOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBteHNlcl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG14c2VyX2JvYXJkICpicmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5pbmZvLT5ucG9ydHM7IGkrKykKKwkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKG14dmFyX3Nkcml2ZXIsIGJyZC0+aWR4ICsgaSk7CisKKwlteHNlcl9yZWxlYXNlX3JlcyhicmQsIHBkZXYsIDEpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbXhzZXJfZHJpdmVyID0geworCS5uYW1lID0gIm14c2VyIiwKKwkuaWRfdGFibGUgPSBteHNlcl9wY2licmRzLAorCS5wcm9iZSA9IG14c2VyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChteHNlcl9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBteHNlcl9tb2R1bGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBteHNlcl9ib2FyZCAqYnJkOworCXVuc2lnbmVkIGxvbmcgY2FwOworCXVuc2lnbmVkIGludCBpLCBtLCBpc2Fsb29wOworCWludCByZXR2YWwsIGI7CisKKwlwcl9kZWJ1ZygiTG9hZGluZyBtb2R1bGUgbXhzZXIgLi4uXG4iKTsKKworCW14dmFyX3Nkcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1YU0VSX1BPUlRTICsgMSk7CisJaWYgKCFteHZhcl9zZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2tfaW5pdCgmZ21fbG9jayk7CisKKwlwcmludGsoS0VSTl9JTkZPICJNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGRyaXZlciB2ZXJzaW9uICVzXG4iLAorCQlNWFNFUl9WRVJTSU9OKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisJbXh2YXJfc2RyaXZlci0+bWFnaWMgPSBUVFlfRFJJVkVSX01BR0lDOworCW14dmFyX3Nkcml2ZXItPm5hbWUgPSAidHR5TUkiOworCW14dmFyX3Nkcml2ZXItPm1ham9yID0gdHR5bWFqb3I7CisJbXh2YXJfc2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCW14dmFyX3Nkcml2ZXItPm51bSA9IE1YU0VSX1BPUlRTICsgMTsKKwlteHZhcl9zZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlteHZhcl9zZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwfENTOHxDUkVBRHxIVVBDTHxDTE9DQUw7CisJbXh2YXJfc2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXfFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CisJdHR5X3NldF9vcGVyYXRpb25zKG14dmFyX3Nkcml2ZXIsICZteHNlcl9vcHMpOworCisJcmV0dmFsID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihteHZhcl9zZHJpdmVyKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgaW5zdGFsbCBNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5ICIKKwkJCQkidHR5IGRyaXZlciAhXG4iKTsKKwkJZ290byBlcnJfcHV0OworCX0KKworCW14dmFyX2RpYWdmbGFnID0gMDsKKworCW0gPSAwOworCS8qIFN0YXJ0IGZpbmRpbmcgSVNBIGJvYXJkcyBoZXJlICovCisJZm9yIChpc2Fsb29wID0gMDsgaXNhbG9vcCA8IDI7IGlzYWxvb3ArKykKKwkJZm9yIChiID0gMDsgYiA8IE1YU0VSX0JPQVJEUyAmJiBtIDwgTVhTRVJfQk9BUkRTOyBiKyspIHsKKwkJCWlmICghaXNhbG9vcCkKKwkJCQljYXAgPSBteHNlckJvYXJkQ0FQW2JdOyAvKiBwcmVkZWZpbmVkICovCisJCQllbHNlCisJCQkJY2FwID0gaW9hZGRyW2JdOyAvKiBtb2R1bGUgcGFyYW0gKi8KKworCQkJaWYgKCFjYXApCisJCQkJY29udGludWU7CisKKwkJCWJyZCA9ICZteHNlcl9ib2FyZHNbbV07CisJCQlyZXR2YWwgPSBteHNlcl9nZXRfSVNBX2NvbmYoY2FwLCBicmQpOworCisJCQlpZiAocmV0dmFsICE9IDApCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAiCisJCQkJCSIoQ0FQPTB4JXgpXG4iLAorCQkJCQlicmQtPmluZm8tPm5hbWUsIGlvYWRkcltiXSk7CisKKwkJCWlmIChyZXR2YWwgPD0gMCkgeworCQkJCWlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUSkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCAiCisJCQkJCQkibnVtYmVyLCBib2FyZCBub3QgIgorCQkJCQkJImNvbmZpZ3VyZWRcbiIpOworCQkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRX0NPTkZMSVQpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgIgorCQkJCQkJIm51bWJlciwgYm9hcmQgbm90ICIKKwkJCQkJCSJjb25maWd1cmVkXG4iKTsKKwkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCAiCisJCQkJCQkidmVjdG9yLCBib2FyZCBub3QgIgorCQkJCQkJImNvbmZpZ3VyZWRcbiIpOworCQkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSU9BRERSKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgSS9PIGFkZHJlc3MsICIKKwkJCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisKKwkJCQlicmQtPmluZm8gPSBOVUxMOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBteHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuICovCisJCQlpZiAobXhzZXJfaW5pdGJyZChicmQsIE5VTEwpIDwgMCkgeworCQkJCWJyZC0+aW5mbyA9IE5VTEw7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWJyZC0+aWR4ID0gbSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRDsKKwkJCWZvciAoaSA9IDA7IGkgPCBicmQtPmluZm8tPm5wb3J0czsgaSsrKQorCQkJCXR0eV9yZWdpc3Rlcl9kZXZpY2UobXh2YXJfc2RyaXZlciwgYnJkLT5pZHggKyBpLAorCQkJCQkJTlVMTCk7CisKKwkJCW0rKzsKKwkJfQorCisJcmV0dmFsID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbXhzZXJfZHJpdmVyKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVnaXN0ZXIgcGNpIGRyaXZlclxuIik7CisJCWlmICghbSkgeworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyX3VucjsKKwkJfSAvKiBlbHNlOiB3ZSBoYXZlIHNvbWUgSVNBIGNhcmRzIHVuZGVyIGNvbnRyb2wgKi8KKwl9CisKKwlwcl9kZWJ1ZygiRG9uZS5cbiIpOworCisJcmV0dXJuIDA7CitlcnJfdW5yOgorCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihteHZhcl9zZHJpdmVyKTsKK2Vycl9wdXQ6CisJcHV0X3R0eV9kcml2ZXIobXh2YXJfc2RyaXZlcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG14c2VyX21vZHVsZV9leGl0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlwcl9kZWJ1ZygiVW5sb2FkaW5nIG1vZHVsZSBteHNlciAuLi5cbiIpOworCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZteHNlcl9kcml2ZXIpOworCisJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSAvKiBJU0EgcmVtYWlucyAqLworCQlpZiAobXhzZXJfYm9hcmRzW2ldLmluZm8gIT0gTlVMTCkKKwkJCWZvciAoaiA9IDA7IGogPCBteHNlcl9ib2FyZHNbaV0uaW5mby0+bnBvcnRzOyBqKyspCisJCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKG14dmFyX3Nkcml2ZXIsCisJCQkJCQlteHNlcl9ib2FyZHNbaV0uaWR4ICsgaik7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKG14dmFyX3Nkcml2ZXIpOworCXB1dF90dHlfZHJpdmVyKG14dmFyX3Nkcml2ZXIpOworCisJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKQorCQlpZiAobXhzZXJfYm9hcmRzW2ldLmluZm8gIT0gTlVMTCkKKwkJCW14c2VyX3JlbGVhc2VfcmVzKCZteHNlcl9ib2FyZHNbaV0sIE5VTEwsIDEpOworCisJcHJfZGVidWcoIkRvbmUuXG4iKTsKK30KKworbW9kdWxlX2luaXQobXhzZXJfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobXhzZXJfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyX25ldy5oIGIvZHJpdmVycy9jaGFyL214c2VyX25ldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOGYwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvbXhzZXJfbmV3LmgKQEAgLTAsMCArMSw0NTAgQEAKKyNpZm5kZWYgX01YU0VSX0gKKyNkZWZpbmUgX01YU0VSX0gKKworLyoKKyAqCVNlbWktcHVibGljIGNvbnRyb2wgaW50ZXJmYWNlcworICovCisKKy8qCisgKglNT1hBIGlvY3RscworICovCisKKyNkZWZpbmUgTU9YQQkJCTB4NDAwCisjZGVmaW5lIE1PWEFfR0VUREFUQUNPVU5UCShNT1hBICsgMjMpCisjZGVmaW5lCU1PWEFfR0VUX0NPTkYJCShNT1hBICsgMzUpCisjZGVmaW5lIE1PWEFfRElBR05PU0UJCShNT1hBICsgNTApCisjZGVmaW5lIE1PWEFfQ0hLUE9SVEVOQUJMRQkoTU9YQSArIDYwKQorI2RlZmluZSBNT1hBX0hpZ2hTcGVlZE9uCShNT1hBICsgNjEpCisjZGVmaW5lIE1PWEFfR0VUX01BSk9SCQkoTU9YQSArIDYzKQorI2RlZmluZSBNT1hBX0dFVF9DVU1BSk9SCShNT1hBICsgNjQpCisjZGVmaW5lIE1PWEFfR0VUTVNUQVRVUwkJKE1PWEEgKyA2NSkKKyNkZWZpbmUgTU9YQV9TRVRfT1BfTU9ERQkoTU9YQSArIDY2KQorI2RlZmluZSBNT1hBX0dFVF9PUF9NT0RFCShNT1hBICsgNjcpCisKKyNkZWZpbmUgUlMyMzJfTU9ERQkJMAorI2RlZmluZSBSUzQ4NV8yV0lSRV9NT0RFCTEKKyNkZWZpbmUgUlM0MjJfTU9ERQkJMgorI2RlZmluZSBSUzQ4NV80V0lSRV9NT0RFCTMKKyNkZWZpbmUgT1BfTU9ERV9NQVNLCQkzCisvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0CisKKyNkZWZpbmUgVFRZX1RIUkVTSE9MRF9USFJPVFRMRSAgMTI4CisKKyNkZWZpbmUgTE9fV0FURVIJIAkoVFRZX0ZMSVBCVUZfU0laRSkKKyNkZWZpbmUgSElfV0FURVIJCShUVFlfRkxJUEJVRl9TSVpFKjIqMy80KQorCisvLyBhZGRlZCBieSBKYW1lcy4gMDMtMTEtMjAwNC4KKyNkZWZpbmUgTU9YQV9TRFNfR0VUSUNPVU5URVIgIAkoTU9YQSArIDY4KQorI2RlZmluZSBNT1hBX1NEU19SU1RJQ09VTlRFUiAgCShNT1hBICsgNjkpCisvLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorCisjZGVmaW5lIE1PWEFfQVNQUF9PUVVFVUUgIAkoTU9YQSArIDcwKQorI2RlZmluZSBNT1hBX0FTUFBfU0VUQkFVRCAJKE1PWEEgKyA3MSkKKyNkZWZpbmUgTU9YQV9BU1BQX0dFVEJBVUQgCShNT1hBICsgNzIpCisjZGVmaW5lIE1PWEFfQVNQUF9NT04gICAgIAkoTU9YQSArIDczKQorI2RlZmluZSBNT1hBX0FTUFBfTFNUQVRVUyAJKE1PWEEgKyA3NCkKKyNkZWZpbmUgTU9YQV9BU1BQX01PTl9FWFQgCShNT1hBICsgNzUpCisjZGVmaW5lIE1PWEFfU0VUX0JBVURfTUVUSE9ECShNT1hBICsgNzYpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTlBQSV9OT1RJRllfUEFSSVRZCTB4MDEKKyNkZWZpbmUgTlBQSV9OT1RJRllfRlJBTUlORwkweDAyCisjZGVmaW5lIE5QUElfTk9USUZZX0hXX09WRVJSVU4JMHgwNAorI2RlZmluZSBOUFBJX05PVElGWV9TV19PVkVSUlVOCTB4MDgKKyNkZWZpbmUgTlBQSV9OT1RJRllfQlJFQUsJMHgxMAorCisjZGVmaW5lIE5QUElfTk9USUZZX0NUU0hPTEQgICAgICAgICAweDAxCS8vIFR4IGhvbGQgYnkgQ1RTIGxvdworI2RlZmluZSBOUFBJX05PVElGWV9EU1JIT0xEICAgICAgICAgMHgwMgkvLyBUeCBob2xkIGJ5IERTUiBsb3cKKyNkZWZpbmUgTlBQSV9OT1RJRllfWE9GRkhPTEQgICAgICAgIDB4MDgJLy8gVHggaG9sZCBieSBYb2ZmIHJlY2VpdmVkCisjZGVmaW5lIE5QUElfTk9USUZZX1hPRkZYRU5UICAgICAgICAweDEwCS8vIFhvZmYgU2VudAorCisvL0NoZWNrSXNNb3hhTXVzdCByZXR1cm4gdmFsdWUKKyNkZWZpbmUgTU9YQV9PVEhFUl9VQVJUCQkJMHgwMAorI2RlZmluZSBNT1hBX01VU1RfTVUxNTBfSFdJRAkJMHgwMQorI2RlZmluZSBNT1hBX01VU1RfTVU4NjBfSFdJRAkJMHgwMgorCisvLyBmb2xsb3cganVzdCBmb3IgTW94YSBNdXN0IGNoaXAgZGVmaW5lLgorLy8KKy8vIHdoZW4gTENSIHJlZ2lzdGVyIChvZmZzZXQgMHgwMykgd3JpdGUgZm9sbG93aW5nIHZhbHVlLAorLy8gdGhlIE11c3QgY2hpcCB3aWxsIGVudGVyIGVuY2hhbmNlIG1vZGUuIEFuZCB3cml0ZSB2YWx1ZQorLy8gb24gRUZSIChvZmZzZXQgMHgwMikgYml0IDYsNyB0byBjaGFuZ2UgYmFuay4KKyNkZWZpbmUgTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFCTB4QkYKKworLy8gd2hlbiBlbmhhbmNlIG1vZGUgZW5hYmxlLCBhY2Nlc3Mgb24gZ2VuZXJhbCBiYW5rIHJlZ2lzdGVyCisjZGVmaW5lIE1PWEFfTVVTVF9HRExfUkVHSVNURVIJCTB4MDcKKyNkZWZpbmUgTU9YQV9NVVNUX0dETF9NQVNLCQkweDdGCisjZGVmaW5lIE1PWEFfTVVTVF9HRExfSEFTX0JBRF9EQVRBCTB4ODAKKworI2RlZmluZSBNT1hBX01VU1RfTFNSX1JFUlIJCTB4ODAJLy8gZXJyb3IgaW4gcmVjZWl2ZSBGSUZPCisvLyBlbmNoYW5jZSByZWdpc3RlciBiYW5rIHNlbGVjdCBhbmQgZW5jaGFuY2UgbW9kZSBzZXR0aW5nIHJlZ2lzdGVyCisvLyB3aGVuIExDUiByZWdpc3RlciBlcXVhbCB0byAweEJGCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfUkVHSVNURVIJCTB4MDIKKy8vIGVuY2hhbmNlIG1vZGUgZW5hYmxlCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEUJMHgxMAorLy8gZW5jaGFuY2UgcmVpc3RlciBiYW5rIHNldCAwLCAxLCAyCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzAJCTB4MDAKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LMQkJMHg0MAorI2RlZmluZSBNT1hBX01VU1RfRUZSX0JBTksyCQkweDgwCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzMJCTB4QzAKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LX01BU0sJCTB4QzAKKworLy8gc2V0IFhPTjEgdmFsdWUgcmVnaXN0ZXIsIHdoZW4gTENSPTB4QkYgYW5kIGNoYW5nZSB0byBiYW5rMAorI2RlZmluZSBNT1hBX01VU1RfWE9OMV9SRUdJU1RFUgkJMHgwNAorCisvLyBzZXQgWE9OMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT04yX1JFR0lTVEVSCQkweDA1CisKKy8vIHNldCBYT0ZGMSB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMV9SRUdJU1RFUgkweDA2CisKKy8vIHNldCBYT0ZGMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisjZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMl9SRUdJU1RFUgkweDA3CisKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRMX1JFR0lTVEVSCTB4MDQKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRIX1JFR0lTVEVSCTB4MDUKKyNkZWZpbmUgTU9YQV9NVVNUX1JCUlRJX1JFR0lTVEVSCTB4MDYKKyNkZWZpbmUgTU9YQV9NVVNUX1RIUlRMX1JFR0lTVEVSCTB4MDcKKyNkZWZpbmUgTU9YQV9NVVNUX0VOVU1fUkVHSVNURVIJCTB4MDQKKyNkZWZpbmUgTU9YQV9NVVNUX0hXSURfUkVHSVNURVIJCTB4MDUKKyNkZWZpbmUgTU9YQV9NVVNUX0VDUl9SRUdJU1RFUgkJMHgwNgorI2RlZmluZSBNT1hBX01VU1RfQ1NSX1JFR0lTVEVSCQkweDA3CisKKy8vIGdvb2QgZGF0YSBtb2RlIGVuYWJsZQorI2RlZmluZSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRQkweDIwCisvLyBvbmx5IGdvb2QgZGF0YSBwdXQgaW50byBSeEZJRk8KKyNkZWZpbmUgTU9YQV9NVVNUX0ZDUl9HREFfT05MWV9FTkFCTEUJMHgxMAorCisvLyBlbmFibGUgQ1RTIGludGVycnVwdAorI2RlZmluZSBNT1hBX01VU1RfSUVSX0VDVFNJCQkweDgwCisvLyBlbmFibGUgUlRTIGludGVycnVwdAorI2RlZmluZSBNT1hBX01VU1RfSUVSX0VSVFNJCQkweDQwCisvLyBlbmFibGUgWG9uL1hvZmYgaW50ZXJydXB0CisjZGVmaW5lIE1PWEFfTVVTVF9JRVJfWElOVAkJMHgyMAorLy8gZW5hYmxlIEdEQSBpbnRlcnJ1cHQKKyNkZWZpbmUgTU9YQV9NVVNUX0lFUl9FR0RBSQkJMHgxMAorCisjZGVmaW5lIE1PWEFfTVVTVF9SRUNWX0lTUgkJKFVBUlRfSUVSX1JESSB8IE1PWEFfTVVTVF9JRVJfRUdEQUkpCisKKy8vIEdEQSBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX0dEQQkJMHgxQworI2RlZmluZSBNT1hBX01VU1RfSUlSX1JEQQkJMHgwNAorI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUTwkJMHgwQworI2RlZmluZSBNT1hBX01VU1RfSUlSX0xTUgkJMHgwNgorCisvLyByZWNpZXZlZCBYb24vWG9mZiBvciBzcGVjaWNhbCBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX1hTQwkJMHgxMAorCisvLyBSVFMvQ1RTIGNoYW5nZSBzdGF0ZSBpbnRlcnJ1cHQgcGVuZGluZworI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUU0NUUwkJMHgyMAorI2RlZmluZSBNT1hBX01VU1RfSUlSX01BU0sJCTB4M0UKKworI2RlZmluZSBNT1hBX01VU1RfTUNSX1hPTl9GTEFHCQkweDQwCisjZGVmaW5lIE1PWEFfTVVTVF9NQ1JfWE9OX0FOWQkJMHg4MAorI2RlZmluZSBNT1hBX01VU1RfTUNSX1RYX1hPTgkJMHgwOAorCisKKy8vIHNvZnR3YXJlIGZsb3cgY29udHJvbCBvbiBjaGlwIG1hc2sgdmFsdWUKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9NQVNLCQkweDBGCisvLyBzZW5kIFhvbjEvWG9mZjEKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDEJCTB4MDgKKy8vIHNlbmQgWG9uMi9Yb2ZmMgorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1RYMgkJMHgwNAorLy8gc2VuZCBYb24xLFhvbjIvWG9mZjEsWG9mZjIKKyNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDEyCQkweDBDCisvLyBkb24ndCBzZW5kIFhvbi9Yb2ZmCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFhfTk8JCTB4MDAKKy8vIFR4IHNvZnR3YXJlIGZsb3cgY29udHJvbCBtYXNrCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFhfTUFTSwkweDBDCisvLyBkb24ndCByZWNlaXZlIFhvbi9Yb2ZmCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlhfTk8JCTB4MDAKKy8vIHJlY2VpdmUgWG9uMS9Yb2ZmMQorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMQkJMHgwMgorLy8gcmVjZWl2ZSBYb24yL1hvZmYyCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlgyCQkweDAxCisvLyByZWNlaXZlIFhvbjEsWG9uMi9Yb2ZmMSxYb2ZmMgorI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMTIJCTB4MDMKKy8vIFJ4IHNvZnR3YXJlIGZsb3cgY29udHJvbCBtYXNrCisjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfUlhfTUFTSwkweDAzCisKKy8vI2RlZmluZSBNT1hBX01VU1RfTUlOX1hPRkZMSU1JVCAgICAgICAgICAgICAgIDY2CisvLyNkZWZpbmUgTU9YQV9NVVNUX01JTl9YT05MSU1JVCAgICAgICAgICAgICAgICAyMAorLy8jZGVmaW5lIElEMV9SWF9UUklHICAgICAgICAgICAgICAgICAgIDEyMAorCisKKyNkZWZpbmUgQ0hFQ0tfTU9YQV9NVVNUX1hPRkZMSU1JVChpbmZvKSB7IAlcCisJaWYgKCAoaW5mbyktPklzTW94YU11c3RDaGlwRmxhZyAmJiAJXAorCSAoaW5mbyktPkhhbmRGbG93LlhvZmZMaW1pdCA8IE1PWEFfTVVTVF9NSU5fWE9GRkxJTUlUICkgewlcCisJCShpbmZvKS0+SGFuZEZsb3cuWG9mZkxpbWl0ID0gTU9YQV9NVVNUX01JTl9YT0ZGTElNSVQ7CVwKKwkJKGluZm8pLT5IYW5kRmxvdy5Yb25MaW1pdCA9IE1PWEFfTVVTVF9NSU5fWE9OTElNSVQ7CVwKKwl9CVwKK30KKworI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoYmFzZWlvKSB7IFwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0VGUkJfRU5BQkxFOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEU7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIFNFVF9NT1hBX01VU1RfWE9OMV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9OMV9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX1hPTjJfVkFMVUUoYmFzZWlvLCBWYWx1ZSkgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMDsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKFZhbHVlKSwgKGJhc2VpbykrTU9YQV9NVVNUX1hPTjJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT0ZGMV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9GRjFfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT0ZGMl9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9GRjJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUTF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVExfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUSF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVEhfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9SQlJUSV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfUkJSVElfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9USFJUTF9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfVEhSVExfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKy8vI2RlZmluZSBNT1hBX01VU1RfUkJSTF9WQUxVRSAgNAorI2RlZmluZSBTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGluZm8pLT5pb2FkZHIrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChpbmZvKS0+aW9hZGRyK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChpbmZvKS0+aW9hZGRyK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMTsJXAorCW91dGIoX19lZnIsIChpbmZvKS0+aW9hZGRyK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YigodTgpKChpbmZvKS0+cnhfaGlnaF93YXRlciksIChpbmZvKS0+aW9hZGRyK01PWEFfTVVTVF9SQlJUSF9SRUdJU1RFUik7CVwKKwlvdXRiKCh1OCkoKGluZm8pLT5yeF90cmlnZ2VyKSwgKGluZm8pLT5pb2FkZHIrTU9YQV9NVVNUX1JCUlRJX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X2xvd193YXRlciksIChpbmZvKS0+aW9hZGRyK01PWEFfTVVTVF9SQlJUTF9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoaW5mbyktPmlvYWRkcitVQVJUX0xDUik7CVwKK30KKworCisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9FTlVNX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzI7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9FTlVNX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIEdFVF9NT1hBX01VU1RfSEFSRFdBUkVfSUQoYmFzZWlvLCBwSWQpIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzI7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCSpwSWQgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0hXSURfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9OT19TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9NQVNLOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBTRVRfTU9YQV9NVVNUX0pVU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfVFgxOwlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKK30KKworI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1RYX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX1NGX1RYMTsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRElTQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfVFhfTUFTSzsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9KVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX01BU0s7CVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX1NGX1JYMTsJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCit9CisKKyNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9SWF9NQVNLOwlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9TRl9SWDE7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1JYX01BU0s7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfVFhfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJXAorCV9fZWZyIHw9IChNT1hBX01VU1RfRUZSX1NGX1JYMXxNT1hBX01VU1RfRUZSX1NGX1RYMSk7CVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAorfQorCisjZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfWE9OX0FOWV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKKwl1OAlfX29sZG1jcjsJXAorCV9fb2xkbWNyID0gaW5iKChiYXNlaW8pK1VBUlRfTUNSKTsJXAorCV9fb2xkbWNyIHw9IE1PWEFfTVVTVF9NQ1JfWE9OX0FOWTsJXAorCW91dGIoX19vbGRtY3IsIChiYXNlaW8pK1VBUlRfTUNSKTsJXAorfQorCisjZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX1hPTl9BTllfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCisJdTgJX19vbGRtY3I7CVwKKwlfX29sZG1jciA9IGluYigoYmFzZWlvKStVQVJUX01DUik7CVwKKwlfX29sZG1jciAmPSB+TU9YQV9NVVNUX01DUl9YT05fQU5ZOwlcCisJb3V0YihfX29sZG1jciwgKGJhc2VpbykrVUFSVF9NQ1IpOwlcCit9CisKKyNkZWZpbmUgUkVBRF9NT1hBX01VU1RfR0RMKGJhc2VpbykJaW5iKChiYXNlaW8pK01PWEFfTVVTVF9HRExfUkVHSVNURVIpCisKKworI2lmbmRlZiBJTklUX1dPUksKKyNkZWZpbmUgSU5JVF9XT1JLKF93b3JrLCBfZnVuYywgX2RhdGEpewlcCisJX2RhdGEtPnRxdWV1ZS5yb3V0aW5lID0gX2Z1bmM7XAorCV9kYXRhLT50cXVldWUuZGF0YSA9IF9kYXRhO1wKKwl9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwppbmRleCAyMDNkYzJiLi5kYzZkNDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKQEAgLTEyNSw4ICsxMjUsOCBAQAogc3RhdGljIHZvaWQgcmVjZWl2ZV9jaGFyKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgY29uc3QgdW5zaWduZWQgY2hhciBjKTsKIHN0YXRpYyB2b2lkIHJlY2VpdmVfZXJyb3Ioc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBjb25zdCBjaGFyIGZsYWcpOwogc3RhdGljIHZvaWQgb25fdGltZW91dCh1bnNpZ25lZCBsb25nIHByaXYpOwotc3RhdGljIGludCBlbmFibGVfc2lnbmFscyhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIHBpZF90IHBpZCwgaW50IGFyZyk7Ci1zdGF0aWMgaW50IHJlYWRfdGVsZWdyYW0oc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBwaWRfdCBwaWQsIHVuc2lnbmVkIGNoYXIgX191c2VyICpidWYpOworc3RhdGljIGludCBlbmFibGVfc2lnbmFscyhzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIHN0cnVjdCBwaWQgKnBpZCwgaW50IGFyZyk7CitzdGF0aWMgaW50IHJlYWRfdGVsZWdyYW0oc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGNoYXIgX191c2VyICpidWYpOwogc3RhdGljIHZvaWQgYWRkX21zZyhzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQsIGludCBtc2dfaWQsIGludCBhcmcsCiAgICAgICAgICAgICAgaW50IGVycm9yX2NvZGUsIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBCbG9jayk7CiBzdGF0aWMgc3RydWN0IHIzOTY0X21lc3NhZ2UqIHJlbW92ZV9tc2coc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCAKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWYsIHNpemVfdCBucik7CiBzdGF0aWMgaW50IHIzOTY0X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyB2b2lkIHIzOTY0X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICogb2xkKTsKK3N0YXRpYyB2b2lkIHIzOTY0X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqIG9sZCk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHIzOTY0X3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKIAkJICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICAqd2FpdCk7CiBzdGF0aWMgdm9pZCByMzk2NF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwKQEAgLTgyOSw3ICs4MjksNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpmaW5kQ2xpZW50KAotICBzdHJ1Y3QgcjM5NjRfaW5mbyAqcEluZm8sIHBpZF90IHBpZCkKKyAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBzdHJ1Y3QgcGlkICpwaWQpCiB7CiAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CiAgICAKQEAgLTg0Myw3ICs4NDMsNyBAQAogICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgZW5hYmxlX3NpZ25hbHMoc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvLCBwaWRfdCBwaWQsIGludCBhcmcpCitzdGF0aWMgaW50IGVuYWJsZV9zaWduYWxzKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgc3RydWN0IHBpZCAqcGlkLCBpbnQgYXJnKQogewogICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICpwQ2xpZW50OwogICAgc3RydWN0IHIzOTY0X2NsaWVudF9pbmZvICoqcHBDbGllbnQ7CkBAIC04NTgsNyArODU4LDcgQEAKICAgICAgICAgIAogICAgICAgICAgaWYocENsaWVudC0+cGlkID09IHBpZCkKICAgICAgICAgIHsKLSAgICAgICAgICAgIFRSQUNFX1BTKCJyZW1vdmluZyBjbGllbnQgJWQgZnJvbSBjbGllbnQgbGlzdCIsIHBpZCk7CisgICAgICAgICAgICBUUkFDRV9QUygicmVtb3ZpbmcgY2xpZW50ICVkIGZyb20gY2xpZW50IGxpc3QiLCBwaWRfbnIocGlkKSk7CiAgICAgICAgICAgICAqcHBDbGllbnQgPSBwQ2xpZW50LT5uZXh0OwogICAgICAgICAgICAgd2hpbGUocENsaWVudC0+bXNnX2NvdW50KQogICAgICAgICAgICAgewpAQCAtODY5LDYgKzg2OSw3IEBACiAgICAgICAgICAgICAgICAgICBUUkFDRV9NKCJlbmFibGVfc2lnbmFscyAtIG1zZyBrZnJlZSAlcCIscE1zZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisJICAgIHB1dF9waWQocENsaWVudC0+cGlkKTsKICAgICAgICAgICAgIGtmcmVlKHBDbGllbnQpOwogICAgICAgICAgICAgVFJBQ0VfTSgiZW5hYmxlX3NpZ25hbHMgLSBrZnJlZSAlcCIscENsaWVudCk7CiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTg5MiwxMCArODkzLDEwIEBACiAgICAgICAgICBpZihwQ2xpZW50PT1OVUxMKQogICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAKLSAgICAgICAgIFRSQUNFX1BTKCJhZGQgY2xpZW50ICVkIHRvIGNsaWVudCBsaXN0IiwgcGlkKTsKKyAgICAgICAgIFRSQUNFX1BTKCJhZGQgY2xpZW50ICVkIHRvIGNsaWVudCBsaXN0IiwgcGlkX25yKHBpZCkpOwogCSBzcGluX2xvY2tfaW5pdCgmcENsaWVudC0+bG9jayk7CiAgICAgICAgICBwQ2xpZW50LT5zaWdfZmxhZ3M9YXJnOwotICAgICAgICAgcENsaWVudC0+cGlkID0gcGlkOworICAgICAgICAgcENsaWVudC0+cGlkID0gZ2V0X3BpZChwaWQpOwogICAgICAgICAgcENsaWVudC0+bmV4dD1wSW5mby0+Zmlyc3RDbGllbnQ7CiAgICAgICAgICBwQ2xpZW50LT5maXJzdF9tc2cgPSBOVUxMOwogICAgICAgICAgcENsaWVudC0+bGFzdF9tc2cgPSBOVUxMOwpAQCAtOTA4LDcgKzkwOSw3IEBACiAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWFkX3RlbGVncmFtKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgcGlkX3QgcGlkLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmKQorc3RhdGljIGludCByZWFkX3RlbGVncmFtKHN0cnVjdCByMzk2NF9pbmZvICpwSW5mbywgc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmKQogewogICAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKICAgICBzdHJ1Y3QgcjM5NjRfYmxvY2tfaGVhZGVyICpibG9jazsKQEAgLTEwMDUsNyArMTAwNiw3IEBACiAgICAvKiBTZW5kIFNJR0lPIHNpZ25hbCB0byBjbGllbnQgcHJvY2VzczogKi8KICAgIGlmKHBDbGllbnQtPnNpZ19mbGFncyAmIFIzOTY0X1VTRV9TSUdJTykKICAgIHsKLSAgICAgIGtpbGxfcHJvYyhwQ2xpZW50LT5waWQsIFNJR0lPLCAxKTsKKyAgICAgIGtpbGxfcGlkKHBDbGllbnQtPnBpZCwgU0lHSU8sIDEpOwogICAgfQogfQogCkBAIC0xMDQyLDcgKzEwNDMsNyBAQAogewogICAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKmJsb2NrOwogCi0gICAgVFJBQ0VfUFMoInJlbW92ZV9jbGllbnRfYmxvY2sgUElEICVkIiwgcENsaWVudC0+cGlkKTsKKyAgICBUUkFDRV9QUygicmVtb3ZlX2NsaWVudF9ibG9jayBQSUQgJWQiLCBwaWRfbnIocENsaWVudC0+cGlkKSk7CiAKICAgICBibG9jaz1wQ2xpZW50LT5uZXh0X2Jsb2NrX3RvX3JlYWQ7CiAgICAgaWYoYmxvY2spCkBAIC0xMTU3LDYgKzExNTgsNyBAQAogICAgICAgICAgICAgIFRSQUNFX00oInIzOTY0X2Nsb3NlIC0gbXNnIGtmcmVlICVwIixwTXNnKTsKICAgICAgICAgICB9CiAgICAgICAgfQorICAgICAgIHB1dF9waWQocENsaWVudC0+cGlkKTsKICAgICAgICBrZnJlZShwQ2xpZW50KTsKICAgICAgICBUUkFDRV9NKCJyMzk2NF9jbG9zZSAtIGNsaWVudCBrZnJlZSAlcCIscENsaWVudCk7CiAgICAgICAgcENsaWVudD1wTmV4dDsKQEAgLTExOTMsMTIgKzExOTUsMTEgQEAKICAgIHN0cnVjdCByMzk2NF9jbGllbnRfbWVzc2FnZSB0aGVNc2c7CiAgICBERUNMQVJFX1dBSVRRVUVVRSAod2FpdCwgY3VycmVudCk7CiAgICAKLSAgIGludCBwaWQgPSBjdXJyZW50LT5waWQ7CiAgICBpbnQgY291bnQ7CiAgICAKICAgIFRSQUNFX0woInJlYWQoKSIpOwogIAotICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLCBwaWQpOworICAgcENsaWVudD1maW5kQ2xpZW50KHBJbmZvLCB0YXNrX3BpZChjdXJyZW50KSk7CiAgICBpZihwQ2xpZW50KQogICAgewogICAgICAgcE1zZyA9IHJlbW92ZV9tc2cocEluZm8sIHBDbGllbnQpOwpAQCAtMTI1Miw3ICsxMjUzLDYgQEAKICAgIHN0cnVjdCByMzk2NF9ibG9ja19oZWFkZXIgKnBIZWFkZXI7CiAgICBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CiAgICB1bnNpZ25lZCBjaGFyICpuZXdfZGF0YTsKLSAgIGludCBwaWQ7CiAgICAKICAgIFRSQUNFX0woIndyaXRlIHJlcXVlc3QsICVkIGNoYXJhY3RlcnMiLCBjb3VudCk7CiAvKiAKQEAgLTEyOTUsOSArMTI5NSw3IEBACiAgICBwSGVhZGVyLT5sb2NrcyA9IDA7CiAgICBwSGVhZGVyLT5vd25lciA9IE5VTEw7CiAgICAKLSAgIHBpZD1jdXJyZW50LT5waWQ7Ci0gICAKLSAgIHBDbGllbnQ9ZmluZENsaWVudChwSW5mbywgcGlkKTsKKyAgIHBDbGllbnQ9ZmluZENsaWVudChwSW5mbywgdGFza19waWQoY3VycmVudCkpOwogICAgaWYocENsaWVudCkKICAgIHsKICAgICAgIHBIZWFkZXItPm93bmVyID0gcENsaWVudDsKQEAgLTEzMjgsNyArMTMyNiw3IEBACiAgICBzd2l0Y2goY21kKQogICAgewogICAgICAgY2FzZSBSMzk2NF9FTkFCTEVfU0lHTkFMUzoKLSAgICAgICAgIHJldHVybiBlbmFibGVfc2lnbmFscyhwSW5mbywgY3VycmVudC0+cGlkLCBhcmcpOworICAgICAgICAgcmV0dXJuIGVuYWJsZV9zaWduYWxzKHBJbmZvLCB0YXNrX3BpZChjdXJyZW50KSwgYXJnKTsKICAgICAgIGNhc2UgUjM5NjRfU0VUUFJJT1JJVFk6CiAgICAgICAgICBpZihhcmc8UjM5NjRfTUFTVEVSIHx8IGFyZz5SMzk2NF9TTEFWRSkKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTM0MSwxMyArMTMzOSwxMyBAQAogICAgICAgICAgICAgcEluZm8tPmZsYWdzICY9IH5SMzk2NF9CQ0M7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgIGNhc2UgUjM5NjRfUkVBRF9URUxFR1JBTToKLSAgICAgICAgIHJldHVybiByZWFkX3RlbGVncmFtKHBJbmZvLCBjdXJyZW50LT5waWQsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKWFyZyk7CisgICAgICAgICByZXR1cm4gcmVhZF90ZWxlZ3JhbShwSW5mbywgdGFza19waWQoY3VycmVudCksICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKWFyZyk7CiAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIC1FTk9JT0NUTENNRDsKICAgIH0KIH0KIAotc3RhdGljIHZvaWQgcjM5NjRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpCitzdGF0aWMgdm9pZCByMzk2NF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpCiB7CiAgICBUUkFDRV9MKCJzZXRfdGVybWlvcyIpOwogfQpAQCAtMTM1Nyw3ICsxMzU1LDYgQEAKIAkJICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQogewogICAgc3RydWN0IHIzOTY0X2luZm8gKnBJbmZvPShzdHJ1Y3QgcjM5NjRfaW5mbyopdHR5LT5kaXNjX2RhdGE7Ci0gICBpbnQgcGlkPWN1cnJlbnQtPnBpZDsKICAgIHN0cnVjdCByMzk2NF9jbGllbnRfaW5mbyAqcENsaWVudDsKICAgIHN0cnVjdCByMzk2NF9tZXNzYWdlICpwTXNnPU5VTEw7CiAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTM2NSw3ICsxMzYyLDcgQEAKIAogICAgVFJBQ0VfTCgiUE9MTCIpOwogCi0gICBwQ2xpZW50PWZpbmRDbGllbnQocEluZm8scGlkKTsKKyAgIHBDbGllbnQ9ZmluZENsaWVudChwSW5mbywgdGFza19waWQoY3VycmVudCkpOwogICAgaWYocENsaWVudCkKICAgICAgewogICAgICAgIHBvbGxfd2FpdChmaWxlLCAmcEluZm8tPnJlYWRfd2FpdCwgd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl90dHkuYyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCmluZGV4IDYwM2I5YWQuLjJiZGIwMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC05OTQsNyArOTk0LDcgQEAKICAqCXdoZW4gdGhlIGxkaXNjIGlzIGNsb3NlZC4KICAqLwogIAotc3RhdGljIHZvaWQgbl90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpCitzdGF0aWMgdm9pZCBuX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpCiB7CiAJaWYgKCF0dHkpCiAJCXJldHVybjsKQEAgLTExNTEsNyArMTE1MSw2IEBACiAJbiA9IG1pbigqbnIsIG4pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CiAJaWYgKG4pIHsKLQkJbWIoKTsKIAkJcmV0dmFsID0gY29weV90b191c2VyKCpiLCAmdHR5LT5yZWFkX2J1Zlt0dHktPnJlYWRfdGFpbF0sIG4pOwogCQluIC09IHJldHZhbDsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbnNjX2dwaW8uYyBiL2RyaXZlcnMvY2hhci9uc2NfZ3Bpby5jCmluZGV4IDRkNDdkNzkuLjgwOGQ0NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uc2NfZ3Bpby5jCisrKyBiL2RyaXZlcnMvY2hhci9uc2NfZ3Bpby5jCkBAIC00MSw3ICs0MSw3IEBACiBzc2l6ZV90IG5zY19ncGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKIAkJICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKIHsKLQl1bnNpZ25lZCBtID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwl1bnNpZ25lZCBtID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBuc2NfZ3Bpb19vcHMgKmFtcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhbXAtPmRldjsKIAlzaXplX3QgaTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogc3NpemVfdCBuc2NfZ3Bpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKIAkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICogcHBvcykKIHsKLQl1bnNpZ25lZCBtID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwl1bnNpZ25lZCBtID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWludCB2YWx1ZTsKIAlzdHJ1Y3QgbnNjX2dwaW9fb3BzICphbXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDAwX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDAwMF9jcy5jCmluZGV4IDUwZDIwYWEuLjIxMWM5M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDAwX2NzLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwMDBfY3MuYwpAQCAtMTc2NCwyOSArMTc2NCwxMSBAQAogCWludCByYzsKIAogCS8qIHJlYWQgdGhlIGNvbmZpZy10dXBsZXMgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwogCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwogCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKIAl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAKLQlpZiAoKGZhaWxfcmMgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpICE9IENTX1NVQ0NFU1MpIHsKLQkJZmFpbF9mbiA9IEdldEZpcnN0VHVwbGU7Ci0JCWdvdG8gY3NfZmFpbGVkOwotCX0KLQlpZiAoKGZhaWxfcmMgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSkgIT0gQ1NfU1VDQ0VTUykgewotCQlmYWlsX2ZuID0gR2V0VHVwbGVEYXRhOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JaWYgKChmYWlsX3JjID0KLQkgICAgIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpICE9IENTX1NVQ0NFU1MpIHsKLQkJZmFpbF9mbiA9IFBhcnNlVHVwbGU7Ci0JCWdvdG8gY3NfZmFpbGVkOwotCX0KLQotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQogCWxpbmstPmlvLkJhc2VQb3J0MiA9IDA7CiAJbGluay0+aW8uTnVtUG9ydHMyID0gMDsKIAlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IDA7CkBAIC0xODQxLDggKzE4MjMsNiBAQAogCiAJcmV0dXJuIDA7CiAKLWNzX2ZhaWxlZDoKLQljc19lcnJvcihsaW5rLCBmYWlsX2ZuLCBmYWlsX3JjKTsKIGNzX3JlbGVhc2U6CiAJY200MDAwX3JlbGVhc2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0xOTczLDE0ICsxOTUzLDE0IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOwogCiAJY21tX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiY2FyZG1hbl80MDAwIik7Ci0JaWYgKCFjbW1fY2xhc3MpCi0JCXJldHVybiAtMTsKKwlpZiAoSVNfRVJSKGNtbV9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKGNtbV9jbGFzcyk7CiAKIAltYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBERVZJQ0VfTkFNRSwgJmNtNDAwMF9mb3BzKTsKIAlpZiAobWFqb3IgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgTU9EVUxFX05BTUUKIAkJCSI6IGNvdWxkIG5vdCBnZXQgbWFqb3IgbnVtYmVyXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gbWFqb3I7CiAJfQogCiAJcmMgPSBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZjbTQwMDBfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDQwX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2NtNDA0MF9jcy5jCmluZGV4IDU1Y2Y0YmUuLjliMWZmN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvY200MDQwX2NzLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9jbTQwNDBfY3MuYwpAQCAtNTIzLDI5ICs1MjMsMTEgQEAKIAlpbnQgZmFpbF9mbiwgZmFpbF9yYzsKIAlpbnQgcmM7CiAKLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwogCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwogCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKIAl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKICAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCi0JaWYgKChmYWlsX3JjID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKSAhPSBDU19TVUNDRVNTKSB7Ci0JCWZhaWxfZm4gPSBHZXRGaXJzdFR1cGxlOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JaWYgKChmYWlsX3JjID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpICE9IENTX1NVQ0NFU1MpIHsKLQkJZmFpbF9mbiA9IEdldFR1cGxlRGF0YTsKLQkJZ290byBjc19mYWlsZWQ7Ci0JfQotCWlmICgoZmFpbF9yYyA9IHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpCi0JCQkJCQkJIT0gQ1NfU1VDQ0VTUykgewotCQlmYWlsX2ZuID0gUGFyc2VUdXBsZTsKLQkJZ290byBjc19mYWlsZWQ7Ci0JfQotCi0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotCiAJbGluay0+aW8uQmFzZVBvcnQyID0gMDsKIAlsaW5rLT5pby5OdW1Qb3J0czIgPSAwOwogCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gMDsKQEAgLTYwOSw4ICs1OTEsNiBAQAogCiAJcmV0dXJuIDA7CiAKLWNzX2ZhaWxlZDoKLQljc19lcnJvcihsaW5rLCBmYWlsX2ZuLCBmYWlsX3JjKTsKIGNzX3JlbGVhc2U6CiAJcmVhZGVyX3JlbGVhc2UobGluayk7CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC03MjEsMTQgKzcwMSwxNCBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOwogCWNteF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImNhcmRtYW5fNDA0MCIpOwotCWlmICghY214X2NsYXNzKQotCQlyZXR1cm4gLTE7CisJaWYgKElTX0VSUihjbXhfY2xhc3MpKQorCQlyZXR1cm4gUFRSX0VSUihjbXhfY2xhc3MpOwogCiAJbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwgREVWSUNFX05BTUUsICZyZWFkZXJfZm9wcyk7CiAJaWYgKG1ham9yIDwgMCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIE1PRFVMRV9OQU1FCiAJCQkiOiBjb3VsZCBub3QgZ2V0IG1ham9yIG51bWJlclxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIG1ham9yOwogCX0KIAogCXJjID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmcmVhZGVyX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKaW5kZXggMWEwYmMzMC4uZjEwOGMxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwpAQCAtNzUsOCArNzUsMTAgQEAKICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CiAKLSNpZmRlZiBDT05GSUdfSERMQ19NT0RVTEUKLSNkZWZpbmUgQ09ORklHX0hETEMgMQorI2lmIGRlZmluZWQoQ09ORklHX0hETEMpIHx8IChkZWZpbmVkKENPTkZJR19IRExDX01PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfU1lOQ0xJTktfQ1NfTU9EVUxFKSkKKyNkZWZpbmUgU1lOQ0xJTktfR0VORVJJQ19IRExDIDEKKyNlbHNlCisjZGVmaW5lIFNZTkNMSU5LX0dFTkVSSUNfSERMQyAwCiAjZW5kaWYKIAogI2RlZmluZSBHRVRfVVNFUihlcnJvcix2YWx1ZSxhZGRyKSBlcnJvciA9IGdldF91c2VyKHZhbHVlLGFkZHIpCkBAIC0yMzUsNyArMjM3LDcgQEAKIAlpbnQgZG9zeW5jcHBwOwogCXNwaW5sb2NrX3QgbmV0bG9jazsKIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKICNlbmRpZgogCkBAIC0zOTIsNyArMzk0LDcgQEAKIAogc3RhdGljIGludCBpb2N0bF9jb21tb24oTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAjZGVmaW5lIGRldl90b19wb3J0KEQpIChkZXZfdG9faGRsYyhEKS0+cHJpdikKIHN0YXRpYyB2b2lkIGhkbGNkZXZfdHhfZG9uZShNR1NMUENfSU5GTyAqaW5mbyk7CiBzdGF0aWMgdm9pZCBoZGxjZGV2X3J4KE1HU0xQQ19JTkZPICppbmZvLCBjaGFyICpidWYsIGludCBzaXplKTsKQEAgLTQyMSw3ICs0MjMsNyBAQAogLyoKICAqIEJvdHRvbSBoYWxmIGludGVycnVwdCBoYW5kbGVycwogICovCi1zdGF0aWMgdm9pZCBiaF9oYW5kbGVyKHZvaWQqIENvbnRleHQpOworc3RhdGljIHZvaWQgYmhfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgYmhfdHJhbnNtaXQoTUdTTFBDX0lORk8gKmluZm8pOwogc3RhdGljIHZvaWQgYmhfc3RhdHVzKE1HU0xQQ19JTkZPICppbmZvKTsKIApAQCAtNTM5LDcgKzU0MSw3IEBACiAgICAgaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lORk8pCiAJICAgIHByaW50aygibWdzbHBjX2F0dGFjaFxuIik7CiAKLSAgICBpbmZvID0gKE1HU0xQQ19JTkZPICopa21hbGxvYyhzaXplb2YoTUdTTFBDX0lORk8pLCBHRlBfS0VSTkVMKTsKKyAgICBpbmZvID0ga21hbGxvYyhzaXplb2YoTUdTTFBDX0lORk8pLCBHRlBfS0VSTkVMKTsKICAgICBpZiAoIWluZm8pIHsKIAkgICAgcHJpbnRrKCJFcnJvciBjYW4ndCBhbGxvY2F0ZSBkZXZpY2UgaW5zdGFuY2UgZGF0YVxuIik7CiAJICAgIHJldHVybiAtRU5PTUVNOwpAQCAtNTQ3LDcgKzU0OSw3IEBACiAKICAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKE1HU0xQQ19JTkZPKSk7CiAgICAgaW5mby0+bWFnaWMgPSBNR1NMUENfTUFHSUM7Ci0gICAgSU5JVF9XT1JLKCZpbmZvLT50YXNrLCBiaF9oYW5kbGVyLCBpbmZvKTsKKyAgICBJTklUX1dPUksoJmluZm8tPnRhc2ssIGJoX2hhbmRsZXIpOwogICAgIGluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKICAgICBpbmZvLT5jbG9zZV9kZWxheSA9IDUqSFovMTA7CiAgICAgaW5mby0+Y2xvc2luZ193YWl0ID0gMzAqSFo7CkBAIC02MDQsMTcgKzYwNiwxMCBAQAogICAgIGlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQogCSAgICBwcmludGsoIm1nc2xwY19jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgLyogcmVhZCBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwogICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwogICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CiAKICAgICAvKiBnZXQgQ0lTIGNvbmZpZ3VyYXRpb24gZW50cnkgKi8KIApAQCAtODQyLDkgKzgzNyw5IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBiaF9oYW5kbGVyKHZvaWQqIENvbnRleHQpCitzdGF0aWMgdm9pZCBiaF9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlNR1NMUENfSU5GTyAqaW5mbyA9IChNR1NMUENfSU5GTyopQ29udGV4dDsKKwlNR1NMUENfSU5GTyAqaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBNR1NMUENfSU5GTywgdGFzayk7CiAJaW50IGFjdGlvbjsKIAogCWlmICghaW5mbykKQEAgLTEwNjAsNyArMTA1NSw3IEBACiAJCWluZm8tPmRyb3BfcnRzX29uX3R4X2RvbmUgPSAwOwogCX0KIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJaWYgKGluZm8tPm5ldGNvdW50KQogCQloZGxjZGV2X3R4X2RvbmUoaW5mbyk7CiAJZWxzZSAKQEAgLTExNzEsNyArMTE2Niw3IEBACiAJfQogCWVsc2UKIAkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfZG93bisrOwotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJaWYgKGluZm8tPm5ldGNvdW50KSB7CiAJCWlmIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpCiAJCQluZXRpZl9jYXJyaWVyX29uKGluZm8tPm5ldGRldik7CkBAIC0yMzgwLDcgKzIzNzUsNyBAQAogICogCXR0eQkJcG9pbnRlciB0byB0dHkgc3RydWN0dXJlCiAgKiAJdGVybWlvcwkJcG9pbnRlciB0byBidWZmZXIgdG8gaG9sZCByZXR1cm5lZCBvbGQgdGVybWlvcwogICovCi1zdGF0aWMgdm9pZCBtZ3NscGNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgbWdzbHBjX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8gKil0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yOTYwLDcgKzI5NTUsNyBAQAogCXByaW50ayggIlN5bmNMaW5rIFBDIENhcmQgJXM6SU89JTA0WCBJUlE9JWRcbiIsCiAJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5pb19iYXNlLCBpbmZvLT5pcnFfbGV2ZWwpOwogCi0jaWZkZWYgQ09ORklHX0hETEMKKyNpZiBTWU5DTElOS19HRU5FUklDX0hETEMKIAloZGxjZGV2X2luaXQoaW5mbyk7CiAjZW5kaWYKIH0KQEAgLTI5NzYsNyArMjk3MSw3IEBACiAJCQkJbGFzdC0+bmV4dF9kZXZpY2UgPSBpbmZvLT5uZXh0X2RldmljZTsKIAkJCWVsc2UKIAkJCQltZ3NscGNfZGV2aWNlX2xpc3QgPSBpbmZvLT5uZXh0X2RldmljZTsKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCQkJaGRsY2Rldl9leGl0KGluZm8pOwogI2VuZGlmCiAJCQlyZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKQEAgLTM5MDgsNyArMzkwMyw3IEBACiAJCQkJcmV0dXJuX2ZyYW1lID0gMTsKIAkJfQogCQlmcmFtZXNpemUgPSAwOwotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJCXsKIAkJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoaW5mby0+bmV0ZGV2KTsKIAkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKQEAgLTM5NDIsNyArMzkzNyw3IEBACiAJCQkJKytmcmFtZXNpemU7CiAJCQl9CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCQkJaWYgKGluZm8tPm5ldGNvdW50KQogCQkJCWhkbGNkZXZfcngoaW5mbywgYnVmLT5kYXRhLCBmcmFtZXNpemUpOwogCQkJZWxzZQpAQCAtNDA5OCw3ICs0MDkzLDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOwogCQotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJaWYgKGluZm8tPm5ldGNvdW50KQogCQloZGxjZGV2X3R4X2RvbmUoaW5mbyk7CiAJZWxzZQpAQCAtNDEwNiw3ICs0MTAxLDcgQEAKIAkJYmhfdHJhbnNtaXQoaW5mbyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCiAvKioKICAqIGNhbGxlZCBieSBnZW5lcmljIEhETEMgbGF5ZXIgd2hlbiBwcm90b2NvbCBzZWxlY3RlZCAoUFBQLCBmcmFtZSByZWxheSwgZXRjLikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wcGRldi5jIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKaW5kZXggZWZjNDg1ZS4uNGFiZDFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BwZGV2LmMKKysrIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogc3RhdGljIHNzaXplX3QgcHBfcmVhZCAoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LAogCQkJbG9mZl90ICogcHBvcykKIHsKLQl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgcHBfc3RydWN0ICpwcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyICoga2J1ZmZlcjsKIAlzc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOwpAQCAtMTg5LDcgKzE4OSw3IEBACiBzdGF0aWMgc3NpemVfdCBwcF93cml0ZSAoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKIAkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0JdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IHBwX3N0cnVjdCAqcHAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJY2hhciAqIGtidWZmZXI7CiAJc3NpemVfdCBieXRlc193cml0dGVuID0gMDsKQEAgLTc1MiwxMyArNzUyLDEzIEBACiAKIHN0YXRpYyB2b2lkIHBwX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKIHsKLQljbGFzc19kZXZpY2VfY3JlYXRlKHBwZGV2X2NsYXNzLCBOVUxMLCBNS0RFVihQUF9NQUpPUiwgcG9ydC0+bnVtYmVyKSwKLQkJCU5VTEwsICJwYXJwb3J0JWQiLCBwb3J0LT5udW1iZXIpOworCWRldmljZV9jcmVhdGUocHBkZXZfY2xhc3MsIE5VTEwsIE1LREVWKFBQX01BSk9SLCBwb3J0LT5udW1iZXIpLAorCQkJInBhcnBvcnQlZCIsIHBvcnQtPm51bWJlcik7CiB9CiAKIHN0YXRpYyB2b2lkIHBwX2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKIHsKLQljbGFzc19kZXZpY2VfZGVzdHJveShwcGRldl9jbGFzcywgTUtERVYoUFBfTUFKT1IsIHBvcnQtPm51bWJlcikpOworCWRldmljZV9kZXN0cm95KHBwZGV2X2NsYXNzLCBNS0RFVihQUF9NQUpPUiwgcG9ydC0+bnVtYmVyKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFycG9ydF9kcml2ZXIgcHBfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3B0eS5jIGIvZHJpdmVycy9jaGFyL3B0eS5jCmluZGV4IDgwZDNlZWQuLmMwN2ExYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wdHkuYworKysgYi9kcml2ZXJzL2NoYXIvcHR5LmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHB0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCBwdHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKICAgICAgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH4oQ1NJWkUgfCBQQVJFTkIpOwogICAgICAgICB0dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gKENTOCB8IENSRUFEKTsKQEAgLTI3Miw2ICsyNzIsOCBAQAogCXB0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX29mbGFnID0gMDsKIAlwdHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEIzODQwMCB8IENTOCB8IENSRUFEOwogCXB0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2xmbGFnID0gMDsKKwlwdHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSAzODQwMDsKKwlwdHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSAzODQwMDsKIAlwdHlfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUyB8IFRUWV9EUklWRVJfUkVBTF9SQVc7CiAJcHR5X2RyaXZlci0+b3RoZXIgPSBwdHlfc2xhdmVfZHJpdmVyOwogCXR0eV9zZXRfb3BlcmF0aW9ucyhwdHlfZHJpdmVyLCAmcHR5X29wcyk7CkBAIC0yODYsNiArMjg4LDggQEAKIAlwdHlfc2xhdmVfZHJpdmVyLT5zdWJ0eXBlID0gUFRZX1RZUEVfU0xBVkU7CiAJcHR5X3NsYXZlX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwogCXB0eV9zbGF2ZV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQ7CisJcHR5X3NsYXZlX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfaXNwZWVkID0gMzg0MDA7CisJcHR5X3NsYXZlX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb3NwZWVkID0gMzg0MDA7CiAJcHR5X3NsYXZlX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MgfAogCQkJCQlUVFlfRFJJVkVSX1JFQUxfUkFXOwogCXB0eV9zbGF2ZV9kcml2ZXItPm90aGVyID0gcHR5X2RyaXZlcjsKQEAgLTM2Niw2ICszNzAsOCBAQAogCXB0bV9kcml2ZXItPmluaXRfdGVybWlvcy5jX29mbGFnID0gMDsKIAlwdG1fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEIzODQwMCB8IENTOCB8IENSRUFEOwogCXB0bV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2xmbGFnID0gMDsKKwlwdG1fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSAzODQwMDsKKwlwdG1fZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSAzODQwMDsKIAlwdG1fZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUyB8IFRUWV9EUklWRVJfUkVBTF9SQVcgfAogCQlUVFlfRFJJVkVSX0RZTkFNSUNfREVWIHwgVFRZX0RSSVZFUl9ERVZQVFNfTUVNOwogCXB0bV9kcml2ZXItPm90aGVyID0gcHRzX2RyaXZlcjsKQEAgLTM4MSw2ICszODcsOCBAQAogCXB0c19kcml2ZXItPnN1YnR5cGUgPSBQVFlfVFlQRV9TTEFWRTsKIAlwdHNfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJcHRzX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCMzg0MDAgfCBDUzggfCBDUkVBRDsKKwlwdHNfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSAzODQwMDsKKwlwdHNfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSAzODQwMDsKIAlwdHNfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUyB8IFRUWV9EUklWRVJfUkVBTF9SQVcgfAogCQlUVFlfRFJJVkVSX0RZTkFNSUNfREVWIHwgVFRZX0RSSVZFUl9ERVZQVFNfTUVNOwogCXB0c19kcml2ZXItPm90aGVyID0gcHRtX2RyaXZlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCAwN2Y0N2EwLi4xM2QwYjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC02NDUsNiArNjQ1LDcgQEAKIAlhZGRfdGltZXJfcmFuZG9tbmVzcygmaW5wdXRfdGltZXJfc3RhdGUsCiAJCQkgICAgICh0eXBlIDw8IDQpIF4gY29kZSBeIChjb2RlID4+IDQpIF4gdmFsdWUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRkX2lucHV0X3JhbmRvbW5lc3MpOwogCiB2b2lkIGFkZF9pbnRlcnJ1cHRfcmFuZG9tbmVzcyhpbnQgaXJxKQogewpAQCAtMTA0Nyw3ICsxMDQ4LDcgQEAKIAlpZiAocCA9PSBidWZmZXIpIHsKIAkJcmV0dXJuIChzc2l6ZV90KXJldDsKIAl9IGVsc2UgewotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCSAgICAgICAgaW5vZGUtPmlfbXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAkJcmV0dXJuIChzc2l6ZV90KShwIC0gYnVmZmVyKTsKQEAgLTEyMDIsNyArMTIwMyw3IEBACiAKIHN0YXRpYyBpbnQgdXVpZF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJCSB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAotCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJdW5zaWduZWQgY2hhciB0bXBfdXVpZFsxNl0sICp1dWlkOwogCXVuc2lnbmVkIGludCBsZW47CkBAIC0xNDIxLDkgKzE0MjIsOSBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwX2NudDsKIAotc3RhdGljIHZvaWQgcmVrZXlfc2VxX2dlbmVyYXRvcih2b2lkICpwcml2YXRlXyk7CitzdGF0aWMgdm9pZCByZWtleV9zZXFfZ2VuZXJhdG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKLXN0YXRpYyBERUNMQVJFX1dPUksocmVrZXlfd29yaywgcmVrZXlfc2VxX2dlbmVyYXRvciwgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksocmVrZXlfd29yaywgcmVrZXlfc2VxX2dlbmVyYXRvcik7CiAKIC8qCiAgKiBMb2NrIGF2b2lkYW5jZToKQEAgLTE0MzcsNyArMTQzOCw3IEBACiAgKiBoYXBwZW4sIGFuZCBldmVuIGlmIHRoYXQgaGFwcGVucyBvbmx5IGEgbm90IHBlcmZlY3RseSBjb21wbGlhbnQKICAqIElTTiBpcyBnZW5lcmF0ZWQsIG5vdGhpbmcgZmF0YWwuCiAgKi8KLXN0YXRpYyB2b2lkIHJla2V5X3NlcV9nZW5lcmF0b3Iodm9pZCAqcHJpdmF0ZV8pCitzdGF0aWMgdm9pZCByZWtleV9zZXFfZ2VuZXJhdG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyID0gJmlwX2tleWRhdGFbMSBeIChpcF9jbnQgJiAxKV07CiAKQEAgLTE0NjUsOCArMTQ2Niw4IEBACiBsYXRlX2luaXRjYWxsKHNlcWdlbl9pbml0KTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQotX191MzIgc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcihfX3UzMiAqc2FkZHIsIF9fdTMyICpkYWRkciwKLQkJCQkgICBfX3UxNiBzcG9ydCwgX191MTYgZHBvcnQpCitfX3UzMiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKF9fYmUzMiAqc2FkZHIsIF9fYmUzMiAqZGFkZHIsCisJCQkJICAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQpCiB7CiAJc3RydWN0IHRpbWV2YWwgdHY7CiAJX191MzIgc2VxOwpAQCAtMTQ3OCwxMCArMTQ3OSwxMCBAQAogCSAqLwogCiAJbWVtY3B5KGhhc2gsIHNhZGRyLCAxNik7Ci0JaGFzaFs0XT0oc3BvcnQgPDwgMTYpICsgZHBvcnQ7CisJaGFzaFs0XT0oKF9fZm9yY2UgdTE2KXNwb3J0IDw8IDE2KSArIChfX2ZvcmNlIHUxNilkcG9ydDsKIAltZW1jcHkoJmhhc2hbNV0sa2V5cHRyLT5zZWNyZXQsc2l6ZW9mKF9fdTMyKSAqIDcpOwogCi0Jc2VxID0gdHdvdGhpcmRzTUQ0VHJhbnNmb3JtKGRhZGRyLCBoYXNoKSAmIEhBU0hfTUFTSzsKKwlzZXEgPSB0d290aGlyZHNNRDRUcmFuc2Zvcm0oKGNvbnN0IF9fdTMyICopZGFkZHIsIGhhc2gpICYgSEFTSF9NQVNLOwogCXNlcSArPSBrZXlwdHItPmNvdW50OwogCiAJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CkBAIC0xNDk1LDcgKzE0OTYsNyBAQAogLyogIFRoZSBjb2RlIGJlbG93IGlzIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKCkuCiAgKiAgQWxsIGJsYW1lcyB0byBBbmRyZXkgVi4gU2F2b2Noa2luIDxzYXdAbXN1LnJ1Pi4KICAqLwotX191MzIgc2VjdXJlX2lwX2lkKF9fdTMyIGRhZGRyKQorX191MzIgc2VjdXJlX2lwX2lkKF9fYmUzMiBkYWRkcikKIHsKIAlzdHJ1Y3Qga2V5ZGF0YSAqa2V5cHRyOwogCV9fdTMyIGhhc2hbNF07CkBAIC0xNTA3LDcgKzE1MDgsNyBAQAogCSAqICBUaGUgZGVzdCBpcCBhZGRyZXNzIGlzIHBsYWNlZCBpbiB0aGUgc3RhcnRpbmcgdmVjdG9yLAogCSAqICB3aGljaCBpcyB0aGVuIGhhc2hlZCB3aXRoIHJhbmRvbSBkYXRhLgogCSAqLwotCWhhc2hbMF0gPSBkYWRkcjsKKwloYXNoWzBdID0gKF9fZm9yY2UgX191MzIpZGFkZHI7CiAJaGFzaFsxXSA9IGtleXB0ci0+c2VjcmV0WzldOwogCWhhc2hbMl0gPSBrZXlwdHItPnNlY3JldFsxMF07CiAJaGFzaFszXSA9IGtleXB0ci0+c2VjcmV0WzExXTsKQEAgLTE1MTcsOCArMTUxOCw4IEBACiAKICNpZmRlZiBDT05GSUdfSU5FVAogCi1fX3UzMiBzZWN1cmVfdGNwX3NlcXVlbmNlX251bWJlcihfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCi0JCQkJIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCkKK19fdTMyIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCSBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCkKIHsKIAlzdHJ1Y3QgdGltZXZhbCB0djsKIAlfX3UzMiBzZXE7CkBAIC0xNTMxLDkgKzE1MzIsOSBAQAogCSAqICBOb3RlIHRoYXQgdGhlIHdvcmRzIGFyZSBwbGFjZWQgaW50byB0aGUgc3RhcnRpbmcgdmVjdG9yLCB3aGljaCBpcwogCSAqICB0aGVuIG1peGVkIHdpdGggYSBwYXJ0aWFsIE1ENCBvdmVyIHJhbmRvbSBkYXRhLgogCSAqLwotCWhhc2hbMF09c2FkZHI7Ci0JaGFzaFsxXT1kYWRkcjsKLQloYXNoWzJdPShzcG9ydCA8PCAxNikgKyBkcG9ydDsKKwloYXNoWzBdPShfX2ZvcmNlIHUzMilzYWRkcjsKKwloYXNoWzFdPShfX2ZvcmNlIHUzMilkYWRkcjsKKwloYXNoWzJdPSgoX19mb3JjZSB1MTYpc3BvcnQgPDwgMTYpICsgKF9fZm9yY2UgdTE2KWRwb3J0OwogCWhhc2hbM109a2V5cHRyLT5zZWNyZXRbMTFdOwogCiAJc2VxID0gaGFsZl9tZDRfdHJhbnNmb3JtKGhhc2gsIGtleXB0ci0+c2VjcmV0KSAmIEhBU0hfTUFTSzsKQEAgLTE1NTgsNyArMTU1OSw3IEBACiBFWFBPUlRfU1lNQk9MKHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKTsKIAogLyogR2VuZXJhdGUgc2VjdXJlIHN0YXJ0aW5nIHBvaW50IGZvciBlcGhlbWVyYWwgSVBWNCB0cmFuc3BvcnQgcG9ydCBzZWFyY2ggKi8KLXUzMiBzZWN1cmVfaXB2NF9wb3J0X2VwaGVtZXJhbChfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsIF9fdTE2IGRwb3J0KQordTMyIHNlY3VyZV9pcHY0X3BvcnRfZXBoZW1lcmFsKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQpCiB7CiAJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9IGdldF9rZXlwdHIoKTsKIAl1MzIgaGFzaFs0XTsKQEAgLTE1NjcsMjUgKzE1NjgsMjUgQEAKIAkgKiAgUGljayBhIHVuaXF1ZSBzdGFydGluZyBvZmZzZXQgZm9yIGVhY2ggZXBoZW1lcmFsIHBvcnQgc2VhcmNoCiAJICogIChzYWRkciwgZGFkZHIsIGRwb3J0KSBhbmQgNDhiaXRzIG9mIHJhbmRvbSBkYXRhLgogCSAqLwotCWhhc2hbMF0gPSBzYWRkcjsKLQloYXNoWzFdID0gZGFkZHI7Ci0JaGFzaFsyXSA9IGRwb3J0IF4ga2V5cHRyLT5zZWNyZXRbMTBdOworCWhhc2hbMF0gPSAoX19mb3JjZSB1MzIpc2FkZHI7CisJaGFzaFsxXSA9IChfX2ZvcmNlIHUzMilkYWRkcjsKKwloYXNoWzJdID0gKF9fZm9yY2UgdTMyKWRwb3J0IF4ga2V5cHRyLT5zZWNyZXRbMTBdOwogCWhhc2hbM10gPSBrZXlwdHItPnNlY3JldFsxMV07CiAKIAlyZXR1cm4gaGFsZl9tZDRfdHJhbnNmb3JtKGhhc2gsIGtleXB0ci0+c2VjcmV0KTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQotdTMyIHNlY3VyZV9pcHY2X3BvcnRfZXBoZW1lcmFsKGNvbnN0IF9fdTMyICpzYWRkciwgY29uc3QgX191MzIgKmRhZGRyLCBfX3UxNiBkcG9ydCkKK3UzMiBzZWN1cmVfaXB2Nl9wb3J0X2VwaGVtZXJhbChjb25zdCBfX2JlMzIgKnNhZGRyLCBjb25zdCBfX2JlMzIgKmRhZGRyLCBfX2JlMTYgZHBvcnQpCiB7CiAJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9IGdldF9rZXlwdHIoKTsKIAl1MzIgaGFzaFsxMl07CiAKIAltZW1jcHkoaGFzaCwgc2FkZHIsIDE2KTsKLQloYXNoWzRdID0gZHBvcnQ7CisJaGFzaFs0XSA9IChfX2ZvcmNlIHUzMilkcG9ydDsKIAltZW1jcHkoJmhhc2hbNV0sa2V5cHRyLT5zZWNyZXQsc2l6ZW9mKF9fdTMyKSAqIDcpOwogCi0JcmV0dXJuIHR3b3RoaXJkc01ENFRyYW5zZm9ybShkYWRkciwgaGFzaCk7CisJcmV0dXJuIHR3b3RoaXJkc01ENFRyYW5zZm9ybSgoY29uc3QgX191MzIgKilkYWRkciwgaGFzaCk7CiB9CiAjZW5kaWYKIApAQCAtMTU5NCwxNyArMTU5NSwxNyBAQAogICogYml0J3MgMzItNDcgaW5jcmVhc2UgZXZlcnkga2V5IGV4Y2hhbmdlCiAgKiAgICAgICAwLTMxICBoYXNoKHNvdXJjZSwgZGVzdCkKICAqLwotdTY0IHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCi0JCQkJX191MTYgc3BvcnQsIF9fdTE2IGRwb3J0KQordTY0IHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQlfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCkKIHsKIAlzdHJ1Y3QgdGltZXZhbCB0djsKIAl1NjQgc2VxOwogCV9fdTMyIGhhc2hbNF07CiAJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9IGdldF9rZXlwdHIoKTsKIAotCWhhc2hbMF0gPSBzYWRkcjsKLQloYXNoWzFdID0gZGFkZHI7Ci0JaGFzaFsyXSA9IChzcG9ydCA8PCAxNikgKyBkcG9ydDsKKwloYXNoWzBdID0gKF9fZm9yY2UgdTMyKXNhZGRyOworCWhhc2hbMV0gPSAoX19mb3JjZSB1MzIpZGFkZHI7CisJaGFzaFsyXSA9ICgoX19mb3JjZSB1MTYpc3BvcnQgPDwgMTYpICsgKF9fZm9yY2UgdTE2KWRwb3J0OwogCWhhc2hbM10gPSBrZXlwdHItPnNlY3JldFsxMV07CiAKIAlzZXEgPSBoYWxmX21kNF90cmFuc2Zvcm0oaGFzaCwga2V5cHRyLT5zZWNyZXQpOwpAQCAtMTY0MCw3ICsxNjQxLDcgQEAKIAkgKiBkcmFpbiBvbiBpdCksIGFuZCB1c2VzIGhhbGZNRDRUcmFuc2Zvcm0gd2l0aGluIHRoZSBzZWNvbmQuIFdlCiAJICogYWxzbyBtaXggaXQgd2l0aCBqaWZmaWVzIGFuZCB0aGUgUElEOgogCSAqLwotCXJldHVybiBzZWN1cmVfaXBfaWQoY3VycmVudC0+cGlkICsgamlmZmllcyk7CisJcmV0dXJuIHNlY3VyZV9pcF9pZCgoX19mb3JjZSBfX2JlMzIpKGN1cnJlbnQtPnBpZCArIGppZmZpZXMpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYXcuYyBiL2RyaXZlcnMvY2hhci9yYXcuYwppbmRleCA4OWI3MThlLi42NDVlMjBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmF3LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jhdy5jCkBAIC03NSw3ICs3NSw3IEBACiAJZmlscC0+Zl9mbGFncyB8PSBPX0RJUkVDVDsKIAlmaWxwLT5mX21hcHBpbmcgPSBiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOwogCWlmICgrK3Jhd19kZXZpY2VzW21pbm9yXS5pbnVzZSA9PSAxKQotCQlmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nID0KKwkJZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nID0KIAkJCWJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gYmRldjsKIAltdXRleF91bmxvY2soJnJhd19tdXRleCk7CkBAIC0xMjcsOSArMTI3LDkgQEAKIAogc3RhdGljIHZvaWQgYmluZF9kZXZpY2Uoc3RydWN0IHJhd19jb25maWdfcmVxdWVzdCAqcnEpCiB7Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3kocmF3X2NsYXNzLCBNS0RFVihSQVdfTUFKT1IsIHJxLT5yYXdfbWlub3IpKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlKHJhd19jbGFzcywgTlVMTCwgTUtERVYoUkFXX01BSk9SLCBycS0+cmF3X21pbm9yKSwKLQkJCQkgICAgICBOVUxMLCAicmF3JWQiLCBycS0+cmF3X21pbm9yKTsKKwlkZXZpY2VfZGVzdHJveShyYXdfY2xhc3MsIE1LREVWKFJBV19NQUpPUiwgcnEtPnJhd19taW5vcikpOworCWRldmljZV9jcmVhdGUocmF3X2NsYXNzLCBOVUxMLCBNS0RFVihSQVdfTUFKT1IsIHJxLT5yYXdfbWlub3IpLAorCQkgICAgICAicmF3JWQiLCBycS0+cmF3X21pbm9yKTsKIH0KIAogLyoKQEAgLTIwMCw3ICsyMDAsNyBAQAogCQkJaWYgKHJxLmJsb2NrX21ham9yID09IDAgJiYgcnEuYmxvY2tfbWlub3IgPT0gMCkgewogCQkJCS8qIHVuYmluZCAqLwogCQkJCXJhd2Rldi0+YmluZGluZyA9IE5VTEw7Ci0JCQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3kocmF3X2NsYXNzLAorCQkJCWRldmljZV9kZXN0cm95KHJhd19jbGFzcywKIAkJCQkJCU1LREVWKFJBV19NQUpPUiwgcnEucmF3X21pbm9yKSk7CiAJCQl9IGVsc2UgewogCQkJCXJhd2Rldi0+YmluZGluZyA9IGJkZ2V0KGRldik7CkBAIC0yODMsNyArMjgzLDcgQEAKIAkJcmV0ID0gUFRSX0VSUihyYXdfY2xhc3MpOwogCQlnb3RvIGVycm9yX3JlZ2lvbjsKIAl9Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZShyYXdfY2xhc3MsIE5VTEwsIE1LREVWKFJBV19NQUpPUiwgMCksIE5VTEwsICJyYXdjdGwiKTsKKwlkZXZpY2VfY3JlYXRlKHJhd19jbGFzcywgTlVMTCwgTUtERVYoUkFXX01BSk9SLCAwKSwgInJhd2N0bCIpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI5NSw3ICsyOTUsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcmF3X2V4aXQodm9pZCkKIHsKLQljbGFzc19kZXZpY2VfZGVzdHJveShyYXdfY2xhc3MsIE1LREVWKFJBV19NQUpPUiwgMCkpOworCWRldmljZV9kZXN0cm95KHJhd19jbGFzcywgTUtERVYoUkFXX01BSk9SLCAwKSk7CiAJY2xhc3NfZGVzdHJveShyYXdfY2xhc3MpOwogCWNkZXZfZGVsKCZyYXdfY2Rldik7CiAJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFJBV19NQUpPUiwgMCksIE1BWF9SQVdfTUlOT1JTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vaG9zdC5oIGIvZHJpdmVycy9jaGFyL3Jpby9ob3N0LmgKaW5kZXggZWUyZGRlYS4uMjNkMDY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9ob3N0LmgKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9ob3N0LmgKQEAgLTQ0LDYgKzQ0LDcgQEAKICoqICAgIHRoZSBob3N0LgogKi8KIHN0cnVjdCBIb3N0IHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAl1bnNpZ25lZCBjaGFyIFR5cGU7CQkvKiBSSU9fRUlTQSwgUklPX01DQSwgLi4uICovCiAJdW5zaWduZWQgY2hhciBJdmVjOwkJLyogUE9MTEVEIG9yIGl2ZWMgbnVtYmVyICovCiAJdW5zaWduZWQgY2hhciBNb2RlOwkJLyogQ29udHJvbCBzdHVmZiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMKaW5kZXggYzM4MmRmMC4uZTc5YjJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCkBAIC0xMDE3LDExICsxMDE3LDE2IEBACiAJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCB1bmlxaWQgPSAleC5cbiIsIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOwogCiAJCQlmaXhfcmlvX3BjaShwZGV2KTsKKworCQkJcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLnBkZXYgPSBwZGV2OworCQkJcGNpX2Rldl9nZXQocGRldik7CisKIAkJCXAtPlJJT0xhc3RQQ0lTZWFyY2ggPSAwOwogCQkJcC0+UklPTnVtSG9zdHMrKzsKIAkJCWZvdW5kKys7CiAJCX0gZWxzZSB7CiAJCQlpb3VubWFwKHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkcik7CisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10uQ2FkZHIgPSBOVUxMOwogCQl9CiAJfQogCkBAIC0xMDY2LDExICsxMDcxLDE1IEBACiAJCQkgICAgKChyZWFkYigmcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVsxXSkgJiAweEZGKSA8PCA4KSB8ICgocmVhZGIoJnAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVbMl0pICYgMHhGRikgPDwgMTYpIHwgKChyZWFkYigmcC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLlVuaXF1ZVszXSkgJiAweEZGKSA8PCAyNCk7CiAJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfUFJPQkUsICJIbW0gVGVzdGVkIG9rLCB1bmlxaWQgPSAleC5cbiIsIHAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5VbmlxdWVOdW0pOwogCisJCQlwLT5SSU9Ib3N0c1twLT5SSU9OdW1Ib3N0c10ucGRldiA9IHBkZXY7CisJCQlwY2lfZGV2X2dldChwZGV2KTsKKwogCQkJcC0+UklPTGFzdFBDSVNlYXJjaCA9IDA7CiAJCQlwLT5SSU9OdW1Ib3N0cysrOwogCQkJZm91bmQrKzsKIAkJfSBlbHNlIHsKIAkJCWlvdW5tYXAocC0+UklPSG9zdHNbcC0+UklPTnVtSG9zdHNdLkNhZGRyKTsKKwkJCXAtPlJJT0hvc3RzW3AtPlJJT051bUhvc3RzXS5DYWRkciA9IE5VTEw7CiAJCX0KICNlbHNlCiAJCXByaW50ayhLRVJOX0VSUiAiRm91bmQgYW4gb2xkZXIgUklPIFBDSSBjYXJkLCBidXQgdGhlIGRyaXZlciBpcyBub3QgIiAiY29tcGlsZWQgdG8gc3VwcG9ydCBpdC5cbiIpOwpAQCAtMTExMCw4ICsxMTE5LDEwIEBACiAJCQkJfQogCQkJfQogCi0JCQlpZiAoIW9rYm9hcmQpCisJCQlpZiAoIW9rYm9hcmQpIHsKIAkJCQlpb3VubWFwKGhwLT5DYWRkcik7CisJCQkJaHAtPkNhZGRyID0gTlVMTDsKKwkJCX0KIAkJfQogCX0KIApAQCAtMTE4MSw2ICsxMTkyLDEwIEBACiAJCX0KIAkJLyogSXQgaXMgc2FmZS9hbGxvd2VkIHRvIGRlbF90aW1lciBhIG5vbi1hY3RpdmUgdGltZXIgKi8KIAkJZGVsX3RpbWVyKCZocC0+dGltZXIpOworCQlpZiAoaHAtPkNhZGRyKQorCQkJaW91bm1hcChocC0+Q2FkZHIpOworCQlpZiAoaHAtPlR5cGUgPT0gUklPX1BDSSkKKwkJCXBjaV9kZXZfcHV0KGhwLT5wZGV2KTsKIAl9CiAKIAlpZiAobWlzY19kZXJlZ2lzdGVyKCZyaW9fZndfZGV2aWNlKSA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvY21kLmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jCmluZGV4IDRkZjZhYjIuLjI0NWYwMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvY21kLmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYwpAQCAtNTU2LDcgKzU1Niw3IEBACiB7CiAJc3RydWN0IENtZEJsayAqQ21kQmxrUDsKIAotCUNtZEJsa1AgPSAoc3RydWN0IENtZEJsayAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBDbWRCbGspLCBHRlBfQVRPTUlDKTsKKwlDbWRCbGtQID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IENtZEJsayksIEdGUF9BVE9NSUMpOwogCWlmIChDbWRCbGtQKQogCQltZW1zZXQoQ21kQmxrUCwgMCwgc2l6ZW9mKHN0cnVjdCBDbWRCbGspKTsKIAlyZXR1cm4gQ21kQmxrUDsKQEAgLTkyMiw3ICs5MjIsNyBAQAogKiogCiAqKiBQYWNrZXQgaXMgYW4gYWN0dWFsIHBhY2tldCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGluIHdpdGggdGhlIHBhY2tldAogKiogaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21tYW5kLiBZb3UgbmVlZCB0byBmaWxsIGluIGV2ZXJ5dGhpbmcsCi0qKiBhcyB0aGUgY29tbWFuZCBwcm9jZXNzb3JlIGRvZXNuJ3QgcHJvY2VzcyB0aGUgY29tbWFuZCBwYWNrZXQgaW4gYW55IHdheS4KKyoqIGFzIHRoZSBjb21tYW5kIHByb2Nlc3NvciBkb2Vzbid0IHByb2Nlc3MgdGhlIGNvbW1hbmQgcGFja2V0IGluIGFueSB3YXkuCiAqKiAKICoqIFRoZSBQcmVGdW5jUCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwYWNrZXQgaXMgZW5xdWV1ZWQgb24gdGhlIGhvc3QgcnVwLgogKiogUHJlRnVuY1AgaXMgY2FsbGVkIGFzICgqUHJlRnVuY1ApKFByZUFyZywgQ21kQmxrUCk7LiBQcmVGdW5jUCBtdXN0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2N0cmwuYyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jCmluZGV4IDA1MmU4MTIuLjdjZTc3NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY3RybC5jCkBAIC02NjIsNyArNjYyLDcgQEAKIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gQ09QWUlOX0ZBSUxFRDsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9Ci0JCWlmIChwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMpIHsKKwkJaWYgKHBvcnRTdGF0cy5wb3J0IDwgMCB8fCBwb3J0U3RhdHMucG9ydCA+PSBSSU9fUE9SVFMpIHsKIAkJCXAtPlJJT0Vycm9yLkVycm9yID0gUE9SVF9OVU1CRVJfT1VUX09GX1JBTkdFOwogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQpAQCAtNzAyLDcgKzcwMiw3IEBACiAJCQlwLT5SSU9FcnJvci5FcnJvciA9IENPUFlJTl9GQUlMRUQ7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQotCQlpZiAocG9ydFN0YXRzLnBvcnQgPj0gUklPX1BPUlRTKSB7CisJCWlmIChwb3J0U3RhdHMucG9ydCA8IDAgfHwgcG9ydFN0YXRzLnBvcnQgPj0gUklPX1BPUlRTKSB7CiAJCQlwLT5SSU9FcnJvci5FcnJvciA9IFBPUlRfTlVNQkVSX09VVF9PRl9SQU5HRTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5pdC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMKaW5kZXggOTlmM2RmMC4uMDc5NDg0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogKiogd2hpY2ggdmFsdWUgd2lsbCBiZSB3cml0dGVuIGludG8gbWVtb3J5LgogKiogQ2FsbCB3aXRoIG9wIHNldCB0byB6ZXJvIG1lYW5zIHRoYXQgdGhlIFJBTSB3aWxsIG5vdCBiZSByZWFkIGFuZCBjaGVja2VkCiAqKiBiZWZvcmUgaXQgaXMgd3JpdHRlbi4KLSoqIENhbGwgd2l0aCBvcCBub3QgemVybywgYW5kIHRoZSBSQU0gd2lsbCBiZSByZWFkIGFuZCBjb21wYXRlZCB3aXRoIHZhbFtvcC0xXQorKiogQ2FsbCB3aXRoIG9wIG5vdCB6ZXJvIGFuZCB0aGUgUkFNIHdpbGwgYmUgcmVhZCBhbmQgY29tcGFyZWQgd2l0aCB2YWxbb3AtMV0KICoqIHRvIGNoZWNrIHRoYXQgdGhlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgcGhhc2Ugd2FzIHJldGFpbmVkLgogKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpby9yaW9wYXJhbS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9wYXJhbS5jCmluZGV4IDEwNjZkOTcuLmJiNDk4ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvcGFyYW0uYworKysgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb3BhcmFtLmMKQEAgLTg3LDggKzg3LDggQEAKICoqIGNvbW1hbmQgYml0IHNldCBvbnRvIHRoZSBwb3J0LiBUaGUgY29tbWFuZCBiaXQgaXMgaW4gdGhlIGxlbiBmaWVsZCwKICoqIGFuZCBnZXRzIE9SZWQgaW4gd2l0aCB0aGUgYWN0dWFsIGJ5dGUgY291bnQuCiAqKgotKiogV2hlbiB5b3Ugc2VuZCBhIHBhY2tldCB3aXRoIHRoZSBjb21tYW5kIGJpdCBzZXQsIHRoZW4gdGhlIGZpcnN0Ci0qKiBkYXRhIGJ5dGUgKCBkYXRhWzBdICkgaXMgaW50ZXJwcmV0dGVkIGFzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisqKiBXaGVuIHlvdSBzZW5kIGEgcGFja2V0IHdpdGggdGhlIGNvbW1hbmQgYml0IHNldCB0aGUgZmlyc3QKKyoqIGRhdGEgYnl0ZSAoZGF0YVswXSkgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4KICoqIEl0IGFsc28gZ292ZXJucyB3aGF0IGRhdGEgc3RydWN0dXJlIG92ZXJsYXkgc2hvdWxkIGFjY29tcGFueSB0aGUgcGFja2V0LgogKiogQ29tbWFuZHMgYXJlIGRlZmluZWQgaW4gY2lycnVzL2NpcnJ1cy5oCiAqKgpAQCAtMTAzLDcgKzEwMyw3IEBACiAqKgogKiogTW9zdCBjb21tYW5kcyBkbyBub3QgdXNlIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGRhdGEgYXJyYXkuIFRoZQogKiogZXhjZXB0aW9ucyBhcmUgT1BFTiBNT1BFTiBhbmQgQ09ORklHLiAoTkIuIEFzIHdpdGggdGhlIFNJIENPTkZJRyBhbmQKLSoqIE9QRU4gYXJlIGN1cnJlbnRseSBhbmFsYWdvdXMpLiBXaXRoIHRoZXNlIHRocmVlIGNvbW1hbmRzIHRoZSBmb2xsb3dpbmcKKyoqIE9QRU4gYXJlIGN1cnJlbnRseSBhbmFsb2dvdXMpLiBXaXRoIHRoZXNlIHRocmVlIGNvbW1hbmRzIHRoZSBmb2xsb3dpbmcKICoqIDExIGRhdGEgYnl0ZXMgYXJlIGFsbCB1c2VkIHRvIHBhc3MgY29uZmlnIGluZm9ybWF0aW9uIHN1Y2ggYXMgYmF1ZCByYXRlIGV0Yy4KICoqIFRoZSBmaWVsZHMgYXJlIGFsc28gZGVmaW5lZCBpbiBjaXJydXMuaC4gU29tZSBjb250YWluIHN0cmFpZ2h0Zm9yd2FyZAogKiogaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgdHJhbnNtaXQgWE9OIGNoYXJhY3Rlci4gVHdvIGNvbnRhaW4gdGhlIHRyYW5zbWl0IGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKaW5kZXggNWFiMzJiMy4uZTJhOTRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYworKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC04MiwxMSArODIsNiBAQAogc3RhdGljIHN0cnVjdCByaXNjb21fYm9hcmQgKiBJUlFfdG9fYm9hcmRbMTZdOwogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpyaXNjb21fZHJpdmVyOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBiYXVkX3RhYmxlW10gPSAgewotCTAsIDUwLCA3NSwgMTEwLCAxMzQsIDE1MCwgMjAwLCAzMDAsIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwKLQk5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCA3NjgwMCwgMCwgCi19OwotCiBzdGF0aWMgc3RydWN0IHJpc2NvbV9ib2FyZCByY19ib2FyZFtSQ19OQk9BUkRdID0gIHsKIAl7CiAJCS5iYXNlCT0gUkNfSU9CQVNFMSwKQEAgLTE1MTYsOSArMTUxMSw5IEBACiAgKiAJZG9fcmNfaGFuZ3VwKCkgLT4gdHR5LT5oYW5ndXAoKSAtPiByY19oYW5ndXAoKQogICogCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3JjX2hhbmd1cCh2b2lkICpwcml2YXRlXykKK3N0YXRpYyB2b2lkIGRvX3JjX2hhbmd1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVnbHlfYXBpKQogewotCXN0cnVjdCByaXNjb21fcG9ydAkqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKikgcHJpdmF0ZV87CisJc3RydWN0IHJpc2NvbV9wb3J0CSpwb3J0ID0gY29udGFpbmVyX29mKHVnbHlfYXBpLCBzdHJ1Y3QgcmlzY29tX3BvcnQsIHRxdWV1ZV9oYW5ndXApOwogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAJCiAJdHR5ID0gcG9ydC0+dHR5OwpAQCAtMTU0NCw3ICsxNTM5LDcgQEAKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm9wZW5fd2FpdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJjX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgcmNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBrdGVybWlvcyAqIG9sZF90ZXJtaW9zKQogewogCXN0cnVjdCByaXNjb21fcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlzY29tX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNTY3LDkgKzE1NjIsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK3N0YXRpYyB2b2lkIGRvX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp1Z2x5X2FwaSkKIHsKLQlzdHJ1Y3QgcmlzY29tX3BvcnQJKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopIHByaXZhdGVfOworCXN0cnVjdCByaXNjb21fcG9ydAkqcG9ydCA9IGNvbnRhaW5lcl9vZih1Z2x5X2FwaSwgc3RydWN0IHJpc2NvbV9wb3J0LCB0cXVldWUpOwogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAJCiAJaWYoISh0dHkgPSBwb3J0LT50dHkpKSAKQEAgLTE2MTksNiArMTYxNCw4IEBACiAJcmlzY29tX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwogCXJpc2NvbV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KIAkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXJpc2NvbV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7CisJcmlzY29tX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb3NwZWVkID0gOTYwMDsKIAlyaXNjb21fZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CiAJdHR5X3NldF9vcGVyYXRpb25zKHJpc2NvbV9kcml2ZXIsICZyaXNjb21fb3BzKTsKIAlpZiAoKGVycm9yID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihyaXNjb21fZHJpdmVyKSkpICB7CkBAIC0xNjMyLDggKzE2MjksOCBAQAogCW1lbXNldChyY19wb3J0LCAwLCBzaXplb2YocmNfcG9ydCkpOwogCWZvciAoaSA9IDA7IGkgPCBSQ19OUE9SVCAqIFJDX05CT0FSRDsgaSsrKSAgewogCQlyY19wb3J0W2ldLm1hZ2ljID0gUklTQ09NOF9NQUdJQzsKLQkJSU5JVF9XT1JLKCZyY19wb3J0W2ldLnRxdWV1ZSwgZG9fc29mdGludCwgJnJjX3BvcnRbaV0pOwotCQlJTklUX1dPUksoJnJjX3BvcnRbaV0udHF1ZXVlX2hhbmd1cCwgZG9fcmNfaGFuZ3VwLCAmcmNfcG9ydFtpXSk7CisJCUlOSVRfV09SSygmcmNfcG9ydFtpXS50cXVldWUsIGRvX3NvZnRpbnQpOworCQlJTklUX1dPUksoJnJjX3BvcnRbaV0udHF1ZXVlX2hhbmd1cCwgZG9fcmNfaGFuZ3VwKTsKIAkJcmNfcG9ydFtpXS5jbG9zZV9kZWxheSA9IDUwICogSFovMTAwOwogCQlyY19wb3J0W2ldLmNsb3Npbmdfd2FpdCA9IDMwMDAgKiBIWi8xMDA7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJjX3BvcnRbaV0ub3Blbl93YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuYyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwppbmRleCBiYWM4MDA1Li5lOTRhNjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCkBAIC03MTIsNyArNzEyLDcgQEAKICAqICB1c2VyIG1vZGUgaW50byB0aGUgZHJpdmVyIChleGNlcHRpb24gaGFuZGxlcikuICAqaW5mbyBDRCBtYW5pcHVsYXRpb24gaXMgc3BpbmxvY2sgcHJvdGVjdGVkLgogICovCiBzdGF0aWMgdm9pZCBjb25maWd1cmVfcl9wb3J0KHN0cnVjdCByX3BvcnQgKmluZm8sCi0JCQkgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKKwkJCSAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAl1bnNpZ25lZCBjZmxhZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTAxNyw3ICsxMDE3LDcgQEAKIAkvKgogCSAqIEluZm8tPmNvdW50IGlzIG5vdyAxOyBzbyBpdCdzIHNhZmUgdG8gc2xlZXAgbm93LgogCSAqLwotCWluZm8tPnNlc3Npb24gPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb247CisJaW5mby0+c2Vzc2lvbiA9IHByb2Nlc3Nfc2Vzc2lvbihjdXJyZW50KTsKIAlpbmZvLT5wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKIAogCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfSU5JVElBTElaRUQpID09IDApIHsKQEAgLTExOTQsNyArMTE5NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJwX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCQkgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCQkgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCByX3BvcnQgKmluZm8gPSAoc3RydWN0IHJfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOwogCUNIQU5ORUxfdCAqY3A7CkBAIC0yMjE0LDcgKzIyMTQsNyBAQAogCWludCBjb3VudCA9IDA7CiAKIAkvKiAgV29yayB0aHJvdWdoIHRoZSBQQ0kgZGV2aWNlIGxpc3QsIHB1bGxpbmcgb3V0IG91cnMgKi8KLQl3aGlsZSAoKGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1JQLCBQQ0lfQU5ZX0lELCBkZXYpKSkgeworCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9SUCwgUENJX0FOWV9JRCwgZGV2KSkpIHsKIAkJaWYgKHJlZ2lzdGVyX1BDSShjb3VudCArIGJvYXJkc19mb3VuZCwgZGV2KSkKIAkJCWNvdW50Kys7CiAJfQpAQCAtMjQzNiw2ICsyNDM2LDggQEAKIAlyb2NrZXRfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJcm9ja2V0X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQogCSAgICBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJcm9ja2V0X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfaXNwZWVkID0gOTYwMDsKKwlyb2NrZXRfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOwogI2lmZGVmIFJPQ0tFVF9TT0ZUX0ZMT1cKIAlyb2NrZXRfZHJpdmVyLT5mbGFncyB8PSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9EWU5BTUlDX0RFVjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3J0Yy5jIGIvZHJpdmVycy9jaGFyL3J0Yy5jCmluZGV4IDY2YTczODUuLmUxZDcwZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ydGMuYworKysgYi9kcml2ZXJzL2NoYXIvcnRjLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogI2RlZmluZSBocGV0X3NldF9ydGNfaXJxX2JpdChhcmcpIAkJMAogI2RlZmluZSBocGV0X3J0Y190aW1lcl9pbml0KCkgCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBocGV0X3J0Y19kcm9wcGVkX2lycSgpIAkJCTAKLXN0YXRpYyBpbmxpbmUgaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkge3JldHVybiAwO30KK3N0YXRpYyBpcnFyZXR1cm5fdCBocGV0X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKSB7cmV0dXJuIDA7fQogI2Vsc2UKIGV4dGVybiBpcnFyZXR1cm5fdCBocGV0X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKICNlbmRpZgpAQCAtMTY1LDcgKzE2NSw5IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IHJ0Y19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworI2VuZGlmCiAKIC8qCiAgKglCaXRzIGluIHJ0Y19zdGF0dXMuICg2IGJpdHMgb2Ygcm9vbSBmb3IgZnV0dXJlIGV4cGFuc2lvbikKQEAgLTkwNiw2ICs5MDgsNyBAQAogCS5mb3BzCQk9ICZydGNfZm9wcywKIH07CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX3Byb2NfZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiA9IHJ0Y19wcm9jX29wZW4sCkBAIC05MTMsMTQgKzkxNiwxMyBAQAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKIH07Ci0KLSNpZiBkZWZpbmVkKFJUQ19JUlEpICYmICFkZWZpbmVkKF9fc3BhcmNfXykKLXN0YXRpYyBpcnFfaGFuZGxlcl90IHJ0Y19pbnRfaGFuZGxlcl9wdHI7CiAjZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgcnRjX2luaXQodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworI2VuZGlmCiAjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19taXBzX18pCiAJdW5zaWduZWQgaW50IHllYXIsIGN0cmw7CiAJY2hhciAqZ3Vlc3MgPSBOVUxMOwpAQCAtOTMyLDkgKzkzNCwxMSBAQAogCXN0cnVjdCBzcGFyY19pc2FfYnJpZGdlICppc2FfYnI7CiAJc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmlzYV9kZXY7CiAjZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBfX3NwYXJjX18KKyNlbHNlCiAJdm9pZCAqcjsKKyNpZmRlZiBSVENfSVJRCisJaXJxX2hhbmRsZXJfdCBydGNfaW50X2hhbmRsZXJfcHRyOworI2VuZGlmCiAjZW5kaWYKIAogI2lmZGVmIF9fc3BhcmNfXwpAQCAtOTU4LDYgKzk2Miw3IEBACiAJCX0KIAl9CiAjZW5kaWYKKwlydGNfaGFzX2lycSA9IDA7CiAJcHJpbnRrKEtFUk5fRVJSICJydGNfaW5pdDogbm8gUEMgcnRjIGZvdW5kXG4iKTsKIAlyZXR1cm4gLUVJTzsKIApAQCAtOTcyLDYgKzk3Nyw3IEBACiAJICogUENJIFNsb3QgMiBJTlRBIyAoYW5kIHNvbWUgSU5UeCMgaW4gU2xvdCAxKS4KIAkgKi8KIAlpZiAocmVxdWVzdF9pcnEocnRjX2lycSwgcnRjX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJydGMiLCAodm9pZCAqKSZydGNfcG9ydCkpIHsKKwkJcnRjX2hhc19pcnEgPSAwOwogCQlwcmludGsoS0VSTl9FUlIgInJ0YzogY2Fubm90IHJlZ2lzdGVyIElSUSAlZFxuIiwgcnRjX2lycSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTk4Miw2ICs5ODgsOSBAQAogCWVsc2UKIAkJciA9IHJlcXVlc3RfbWVtX3JlZ2lvbihSVENfUE9SVCgwKSwgUlRDX0lPX0VYVEVOVCwgInJ0YyIpOwogCWlmICghcikgeworI2lmZGVmIFJUQ19JUlEKKwkJcnRjX2hhc19pcnEgPSAwOworI2VuZGlmCiAJCXByaW50ayhLRVJOX0VSUiAicnRjOiBJL08gcmVzb3VyY2UgJWx4IGlzIG5vdCBmcmVlLlxuIiwKIAkJICAgICAgIChsb25nKShSVENfUE9SVCgwKSkpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTk5Niw2ICsxMDA1LDcgQEAKIAogCWlmKHJlcXVlc3RfaXJxKFJUQ19JUlEsIHJ0Y19pbnRfaGFuZGxlcl9wdHIsIElSUUZfRElTQUJMRUQsICJydGMiLCBOVUxMKSkgewogCQkvKiBZZWFoIHJpZ2h0LCBzZWVpbmcgYXMgaXJxIDggZG9lc24ndCBldmVuIGhpdCB0aGUgYnVzLiAqLworCQlydGNfaGFzX2lycSA9IDA7CiAJCXByaW50ayhLRVJOX0VSUiAicnRjOiBJUlEgJWQgaXMgbm90IGZyZWUuXG4iLCBSVENfSVJRKTsKIAkJaWYgKFJUQ19JT01BUFBFRCkKIAkJCXJlbGVhc2VfcmVnaW9uKFJUQ19QT1JUKDApLCBSVENfSU9fRVhURU5UKTsKQEAgLTEwMTIsMjEgKzEwMjIsMTkgQEAKIAlpZiAobWlzY19yZWdpc3RlcigmcnRjX2RldikpIHsKICNpZmRlZiBSVENfSVJRCiAJCWZyZWVfaXJxKFJUQ19JUlEsIE5VTEwpOworCQlydGNfaGFzX2lycSA9IDA7CiAjZW5kaWYKIAkJcmVsZWFzZV9yZWdpb24oUlRDX1BPUlQoMCksIFJUQ19JT19FWFRFTlQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcnRjIiwgMCwgTlVMTCk7Ci0JaWYgKCFlbnQpIHsKLSNpZmRlZiBSVENfSVJRCi0JCWZyZWVfaXJxKFJUQ19JUlEsIE5VTEwpOworCWlmIChlbnQpCisJCWVudC0+cHJvY19mb3BzID0gJnJ0Y19wcm9jX2ZvcHM7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IEZhaWxlZCB0byByZWdpc3RlciB3aXRoIHByb2Nmcy5cbiIpOwogI2VuZGlmCi0JCXJlbGVhc2VfcmVnaW9uKFJUQ19QT1JUKDApLCBSVENfSU9fRVhURU5UKTsKLQkJbWlzY19kZXJlZ2lzdGVyKCZydGNfZGV2KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWVudC0+cHJvY19mb3BzID0gJnJ0Y19wcm9jX2ZvcHM7CiAKICNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX21pcHNfXykKIAlydGNfZnJlcSA9IEhaOwpAQCAtMTE1OSw2ICsxMTY3LDcgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BST0NfRlMKIC8qCiAgKglJbmZvIGV4cG9ydGVkIHZpYSAiL3Byb2MvZHJpdmVyL3J0YyIuCiAgKi8KQEAgLTEyNDMsNiArMTI1Miw3IEBACiB7CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHJ0Y19wcm9jX3Nob3csIE5VTEwpOwogfQorI2VuZGlmCiAKIHZvaWQgcnRjX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYyBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYwppbmRleCA0MjE3ZDM4Li43NWRlNWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmMKKysrIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jCkBAIC02OTUsNiArNjk1LDggQEAKIAlhMjIzMl9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKIAlhMjIzMl9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KIAkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCWEyMjMyX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfaXNwZWVkID0gOTYwMDsKKwlhMjIzMl9kcml2ZXItPmluaXRfdGVybWlvcy5jX29zcGVlZCA9IDk2MDA7CiAJYTIyMzJfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CiAJdHR5X3NldF9vcGVyYXRpb25zKGEyMjMyX2RyaXZlciwgJmEyMjMyX29wcyk7CiAJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYTIyMzJfZHJpdmVyKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYyBiL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYwppbmRleCA0NjFiZmUwLi5hZjUwZDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMKKysrIGIvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCkBAIC03MDYsOSArNzA2LDkgQEAKICAqIGhhZCB0byBwb2xsIGV2ZXJ5IHBvcnQgdG8gc2VlIGlmIHRoYXQgcG9ydCBuZWVkZWQgc2VydmljaW5nLgogICovCiBzdGF0aWMgdm9pZAotZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKK2RvX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp1Z2x5X2FwaSkKIHsKLSAgc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKikgcHJpdmF0ZV87CisgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvID0gY29udGFpbmVyX29mKHVnbHlfYXBpLCBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCwgdHF1ZXVlKTsKICAgc3RydWN0IHR0eV9zdHJ1Y3QgICAgKnR0eTsKIAogICAgIHR0eSA9IGluZm8tPnR0eTsKQEAgLTgzOSw3ICs4MzksNyBAQAogICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlpZiAoaW5mby0+eG1pdF9idWYpewogCSAgICBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnhtaXRfYnVmKTsKLQkgICAgaW5mby0+eG1pdF9idWYgPSAwOworCSAgICBpbmZvLT54bWl0X2J1ZiA9IE5VTEw7CiAJfQogCiAJYmFzZV9hZGRyW0N5Q0FSXSA9ICh1X2NoYXIpY2hhbm5lbDsKQEAgLTEzNTQsNyArMTM1NCw3IEBACiAKIHN0YXRpYyBpbnQKIGdldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqIHJldGluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiByZXRpbmZvKQogewogICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CiAKQEAgLTEzNzYsNyArMTM3Niw3IEBACiAKIHN0YXRpYyBpbnQKIHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqIG5ld19pbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICogbmV3X2luZm8pCiB7CiAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CiAgIHN0cnVjdCBjeWNsYWRlc19wb3J0IG9sZF9pbmZvOwpAQCAtMTUwMyw3ICsxNTAzLDcgQEAKIH0gLyogc2VuZF9icmVhayAqLwogCiBzdGF0aWMgaW50Ci1nZXRfbW9uX2luZm8oc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCBzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciAqIG1vbikKK2dldF9tb25faW5mbyhzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHN0cnVjdCBjeWNsYWRlc19tb25pdG9yIF9fdXNlciAqIG1vbikKIHsKIAogICAgaWYgKGNvcHlfdG9fdXNlcihtb24sICZpbmZvLT5tb24sIHNpemVvZihzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvcikpKQpAQCAtMTUxNiw3ICsxNTE2LDcgQEAKIH0KIAogc3RhdGljIGludAotc2V0X3RocmVzaG9sZChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKmFyZykKK3NldF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqYXJnKQogewogICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CkBAIC0xNTMzLDcgKzE1MzMsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1nZXRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqdmFsdWUpCitnZXRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnZhbHVlKQogewogICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYmFzZV9hZGRyID0gKHVfY2hhciAqKUJBU0VfQUREUjsKICAgIGludCBjaGFubmVsOwpAQCAtMTU0Niw3ICsxNTQ2LDcgQEAKIH0KIAogc3RhdGljIGludAotc2V0X2RlZmF1bHRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqYXJnKQorc2V0X2RlZmF1bHRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmFyZykKIHsKICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CiAKQEAgLTE1NTgsMTMgKzE1NTgsMTMgQEAKIH0KIAogc3RhdGljIGludAotZ2V0X2RlZmF1bHRfdGhyZXNob2xkKHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqdmFsdWUpCitnZXRfZGVmYXVsdF90aHJlc2hvbGQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCiB7CiAgICByZXR1cm4gcHV0X3VzZXIoaW5mby0+ZGVmYXVsdF90aHJlc2hvbGQsdmFsdWUpOwogfQogCiBzdGF0aWMgaW50Ci1zZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgKmFyZykKK3NldF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmFyZykKIHsKICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CiAgICBpbnQgY2hhbm5lbDsKQEAgLTE1ODEsNyArMTU4MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldF90aW1lb3V0KHN0cnVjdCBjeWNsYWRlc19wb3J0ICogaW5mbywgdW5zaWduZWQgbG9uZyAqdmFsdWUpCitnZXRfdGltZW91dChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8sIHVuc2lnbmVkIGxvbmcgX191c2VyICp2YWx1ZSkKIHsKICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmJhc2VfYWRkciA9ICh1X2NoYXIgKilCQVNFX0FERFI7CiAgICBpbnQgY2hhbm5lbDsKQEAgLTE2MDEsNyArMTYwMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldF9kZWZhdWx0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKK2dldF9kZWZhdWx0X3RpbWVvdXQoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKiBpbmZvLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqdmFsdWUpCiB7CiAgICByZXR1cm4gcHV0X3VzZXIoaW5mby0+ZGVmYXVsdF90aW1lb3V0LHZhbHVlKTsKIH0KQEAgLTE2MTMsNiArMTYxMyw3IEBACiAgIHVuc2lnbmVkIGxvbmcgdmFsOwogICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqIGluZm8gPSAoc3RydWN0IGN5Y2xhZGVzX3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwogICBpbnQgcmV0X3ZhbCA9IDA7CisgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAjaWZkZWYgU0VSSUFMX0RFQlVHX09USEVSCiAgICAgcHJpbnRrKCJjeV9pb2N0bCAlcywgY21kID0gJXggYXJnID0gJWx4XG4iLCB0dHktPm5hbWUsIGNtZCwgYXJnKTsgLyogKi8KQEAgLTE2MjAsMjggKzE2MjEsMjggQEAKIAogICAgIHN3aXRjaCAoY21kKSB7CiAgICAgICAgIGNhc2UgQ1lHRVRNT046Ci0gICAgICAgICAgICByZXRfdmFsID0gZ2V0X21vbl9pbmZvKGluZm8sIChzdHJ1Y3QgY3ljbGFkZXNfbW9uaXRvciAqKWFyZyk7CisgICAgICAgICAgICByZXRfdmFsID0gZ2V0X21vbl9pbmZvKGluZm8sIGFyZ3ApOwogCSAgICBicmVhazsKICAgICAgICAgY2FzZSBDWUdFVFRIUkVTSDoKLQkgICAgcmV0X3ZhbCA9IGdldF90aHJlc2hvbGQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCSAgICByZXRfdmFsID0gZ2V0X3RocmVzaG9sZChpbmZvLCBhcmdwKTsKICAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIENZU0VUVEhSRVNIOgotICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF90aHJlc2hvbGQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF90aHJlc2hvbGQoaW5mbywgYXJncCk7CiAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIENZR0VUREVGVEhSRVNIOgotCSAgICByZXRfdmFsID0gZ2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sICh1bnNpZ25lZCBsb25nICopYXJnKTsKKwkgICAgcmV0X3ZhbCA9IGdldF9kZWZhdWx0X3RocmVzaG9sZChpbmZvLCBhcmdwKTsKICAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIENZU0VUREVGVEhSRVNIOgotICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9kZWZhdWx0X3RocmVzaG9sZChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X2RlZmF1bHRfdGhyZXNob2xkKGluZm8sIGFyZ3ApOwogCSAgICBicmVhazsKICAgICAgICAgY2FzZSBDWUdFVFRJTUVPVVQ6Ci0JICAgIHJldF92YWwgPSBnZXRfdGltZW91dChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJICAgIHJldF92YWwgPSBnZXRfdGltZW91dChpbmZvLCBhcmdwKTsKICAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIENZU0VUVElNRU9VVDoKLSAgICAgICAgICAgIHJldF92YWwgPSBzZXRfdGltZW91dChpbmZvLCAodW5zaWduZWQgbG9uZyAqKWFyZyk7CisgICAgICAgICAgICByZXRfdmFsID0gc2V0X3RpbWVvdXQoaW5mbywgYXJncCk7CiAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIENZR0VUREVGVElNRU9VVDoKLQkgICAgcmV0X3ZhbCA9IGdldF9kZWZhdWx0X3RpbWVvdXQoaW5mbywgKHVuc2lnbmVkIGxvbmcgKilhcmcpOworCSAgICByZXRfdmFsID0gZ2V0X2RlZmF1bHRfdGltZW91dChpbmZvLCBhcmdwKTsKICAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIENZU0VUREVGVElNRU9VVDoKICAgICAgICAgICAgIHJldF92YWwgPSBzZXRfZGVmYXVsdF90aW1lb3V0KGluZm8sICh1bnNpZ25lZCBsb25nKWFyZyk7CkBAIC0xNjY0LDIxICsxNjY1LDIwIEBACiAKIC8qIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGluY29tcGxldGVseSBpbXBsZW1lbnRlZCEhISAqLwogICAgICAgICBjYXNlIFRJT0NHU09GVENBUjoKLSAgICAgICAgICAgIHJldF92YWwgPSBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsICh1bnNpZ25lZCBsb25nICopIGFyZyk7CisgICAgICAgICAgICByZXRfdmFsID0gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUSU9DU1NPRlRDQVI6Ci0gICAgICAgICAgICByZXRfdmFsID0gZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOwogCSAgICBpZiAocmV0X3ZhbCkKIAkJICAgIGJyZWFrOwogICAgICAgICAgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KICAgICAgICAgICAgICAgICAgICAgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8ICh2YWwgPyBDTE9DQUwgOiAwKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUSU9DR1NFUklBTDoKLSAgICAgICAgICAgIHJldF92YWwgPSBnZXRfc2VyaWFsX2luZm8oaW5mbywgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopIGFyZyk7CisgICAgICAgICAgICByZXRfdmFsID0gZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVElPQ1NTRVJJQUw6Ci0gICAgICAgICAgICByZXRfdmFsID0gc2V0X3NlcmlhbF9pbmZvKGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqKSBhcmcpOworICAgICAgICAgICAgcmV0X3ZhbCA9IHNldF9zZXJpYWxfaW5mbyhpbmZvLCBhcmdwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogCSAgICByZXRfdmFsID0gLUVOT0lPQ1RMQ01EOwpAQCAtMTY5NSw3ICsxNjk1LDcgQEAKIAogCiBzdGF0aWMgdm9pZAotY3lfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGRfdGVybWlvcykKK2N5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqIG9sZF90ZXJtaW9zKQogewogICBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9IChzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqKXR0eS0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE3NzMsNyArMTc3Myw3IEBACiAJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwogICAgIHR0eV9sZGlzY19mbHVzaCh0dHkpOwogICAgIGluZm8tPmV2ZW50ID0gMDsKLSAgICBpbmZvLT50dHkgPSAwOworICAgIGluZm8tPnR0eSA9IE5VTEw7CiAgICAgaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgewogCWlmIChpbmZvLT5jbG9zZV9kZWxheSkgewogCSAgICBtc2xlZXBfaW50ZXJydXB0aWJsZShqaWZmaWVzX3RvX21zZWNzKGluZm8tPmNsb3NlX2RlbGF5KSk7CkBAIC0yMjUwLDcgKzIyNTAsNyBAQAogCQlpbmZvLT5jYXJkID0gaW5kZXg7CiAJCWluZm8tPmxpbmUgPSBwb3J0X251bTsKIAkJaW5mby0+ZmxhZ3MgPSBTVERfQ09NX0ZMQUdTOwotCQlpbmZvLT50dHkgPSAwOworCQlpbmZvLT50dHkgPSBOVUxMOwogCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDEyOwogCQlpbmZvLT5jb3IxID0gQ3lQQVJJVFlfTk9ORXxDeV84X0JJVFM7CiAJCWluZm8tPmNvcjIgPSBDeUVUQzsKQEAgLTIyNzMsNyArMjI3Myw3IEBACiAJCWluZm8tPmJsb2NrZWRfb3BlbiA9IDA7CiAJCWluZm8tPmRlZmF1bHRfdGhyZXNob2xkID0gMDsKIAkJaW5mby0+ZGVmYXVsdF90aW1lb3V0ID0gMDsKLQkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWUsIGRvX3NvZnRpbnQsIGluZm8pOworCQlJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOwogCQkvKiBpbmZvLT5zZXNzaW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc29ueXBpLmMgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKaW5kZXggYzA4NDE0OS4uMTdkNTRlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9zb255cGkuYwpAQCAtNzY1LDcgKzc2NSw3IEBACiAJc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPSBzdGF0ZTsKIH0KIAotc3RhdGljIHZvaWQgaW5wdXRfa2V5cmVsZWFzZSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaW5wdXRfa2V5cmVsZWFzZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHNvbnlwaV9rZXlwcmVzcyBrcDsKIApAQCAtOTc5LDcgKzk3OSw3IEBACiAJfQogCiAJaWYgKHJldCA+IDApIHsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAkJaW5vZGUtPmlfYXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwogCX0KIApAQCAtMTQxMiw3ICsxNDEyLDcgQEAKIAkJCWdvdG8gZXJyX2lucGRldl91bnJlZ2lzdGVyOwogCQl9CiAKLQkJSU5JVF9XT1JLKCZzb255cGlfZGV2aWNlLmlucHV0X3dvcmssIGlucHV0X2tleXJlbGVhc2UsIE5VTEwpOworCQlJTklUX1dPUksoJnNvbnlwaV9kZXZpY2UuaW5wdXRfd29yaywgaW5wdXRfa2V5cmVsZWFzZSk7CiAJfQogCiAJc29ueXBpX2VuYWJsZSgwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwppbmRleCBkMGI4OGQwLi4yMDk0NmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKKysrIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCkBAIC0xODMsMTEgKzE4Myw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc3BlY2lhbGl4X2RyaXZlcjsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmF1ZF90YWJsZVtdID0gIHsKLQkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCi0JOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAwLAotfTsKLQogc3RhdGljIHN0cnVjdCBzcGVjaWFsaXhfYm9hcmQgc3hfYm9hcmRbU1hfTkJPQVJEXSA9ICB7CiAJeyAwLCBTWF9JT0JBU0UxLCAgOSwgfSwKIAl7IDAsIFNYX0lPQkFTRTIsIDExLCB9LApAQCAtMTA5MCw5ICsxMDg1LDkgQEAKIAogCWlmIChiYXVkID09IDM4NDAwKSB7CiAJCWlmICgocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX0hJKQotCQkJYmF1ZCArKzsKKwkJCWJhdWQgPSA1NzYwMDsKIAkJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfVkhJKQotCQkJYmF1ZCArPSAyOworCQkJYmF1ZCA9IDExNTIwMDsKIAl9CiAKIAlpZiAoIWJhdWQpIHsKQEAgLTExNTAsMTEgKzExNDUsOSBAQAogCXN4X291dChicCwgQ0QxODZ4X1JCUFJMLCB0bXAgJiAweGZmKTsKIAlzeF9vdXQoYnAsIENEMTg2eF9UQlBSTCwgdG1wICYgMHhmZik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKLQlpZiAocG9ydC0+Y3VzdG9tX2Rpdmlzb3IpIHsKKwlpZiAocG9ydC0+Y3VzdG9tX2Rpdmlzb3IpCiAJCWJhdWQgPSAoU1hfT1NDRlJFUSArIHBvcnQtPmN1c3RvbV9kaXZpc29yLzIpIC8gcG9ydC0+Y3VzdG9tX2Rpdmlzb3I7Ci0JCWJhdWQgPSAoIGJhdWQgKyA1ICkgLyAxMDsKLQl9IGVsc2UKLQkJYmF1ZCA9IChiYXVkX3RhYmxlW2JhdWRdICsgNSkgLyAxMDsgICAvKiBFc3RpbWF0ZWQgQ1BTICovCisJYmF1ZCA9IChiYXVkICsgNSkgLyAxMDsJCS8qIEVzdGltYXRlZCBDUFMgKi8KIAogCS8qIFR3byB0aW1lciB0aWNrcyBzZWVtcyBlbm91Z2ggdG8gd2FrZXVwIHNvbWV0aGluZyBsaWtlIFNMSVAgZHJpdmVyICovCiAJdG1wID0gKChiYXVkICsgSFovMikgLyBIWikgKiAyIC0gQ0QxODZ4X05GSUZPOwpAQCAtMjI2OCw5ICsyMjYxLDEwIEBACiAgKiAJZG9fc3hfaGFuZ3VwKCkgLT4gdHR5LT5oYW5ndXAoKSAtPiBzeF9oYW5ndXAoKQogICoKICAqLwotc3RhdGljIHZvaWQgZG9fc3hfaGFuZ3VwKHZvaWQgKnByaXZhdGVfKQorc3RhdGljIHZvaWQgZG9fc3hfaGFuZ3VwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQJKnBvcnQgPSAoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICopIHByaXZhdGVfOworCXN0cnVjdCBzcGVjaWFsaXhfcG9ydAkqcG9ydCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQsIHRxdWV1ZV9oYW5ndXApOwogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAKIAlmdW5jX2VudGVyKCk7CkBAIC0yMzE3LDcgKzIzMTEsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHN4X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgc3hfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBrdGVybWlvcyAqIG9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yMzQzLDkgKzIzMzcsMTAgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBkb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKQorc3RhdGljIHZvaWQgZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNwZWNpYWxpeF9wb3J0CSpwb3J0ID0gKHN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqKSBwcml2YXRlXzsKKwlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQJKnBvcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwZWNpYWxpeF9wb3J0LCB0cXVldWUpOwogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAKIAlmdW5jX2VudGVyKCk7CkBAIC0yNDA1LDYgKzI0MDAsOCBAQAogCXNwZWNpYWxpeF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKIAlzcGVjaWFsaXhfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CiAJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlzcGVjaWFsaXhfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSA5NjAwOworCXNwZWNpYWxpeF9kcml2ZXItPmluaXRfdGVybWlvcy5jX29zcGVlZCA9IDk2MDA7CiAJc3BlY2lhbGl4X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwogCXR0eV9zZXRfb3BlcmF0aW9ucyhzcGVjaWFsaXhfZHJpdmVyLCAmc3hfb3BzKTsKIApAQCAtMjQxOCw4ICsyNDE1LDggQEAKIAltZW1zZXQoc3hfcG9ydCwgMCwgc2l6ZW9mKHN4X3BvcnQpKTsKIAlmb3IgKGkgPSAwOyBpIDwgU1hfTlBPUlQgKiBTWF9OQk9BUkQ7IGkrKykgewogCQlzeF9wb3J0W2ldLm1hZ2ljID0gU1BFQ0lBTElYX01BR0lDOwotCQlJTklUX1dPUksoJnN4X3BvcnRbaV0udHF1ZXVlLCBkb19zb2Z0aW50LCAmc3hfcG9ydFtpXSk7Ci0JCUlOSVRfV09SSygmc3hfcG9ydFtpXS50cXVldWVfaGFuZ3VwLCBkb19zeF9oYW5ndXAsICZzeF9wb3J0W2ldKTsKKwkJSU5JVF9XT1JLKCZzeF9wb3J0W2ldLnRxdWV1ZSwgZG9fc29mdGludCk7CisJCUlOSVRfV09SSygmc3hfcG9ydFtpXS50cXVldWVfaGFuZ3VwLCBkb19zeF9oYW5ndXApOwogCQlzeF9wb3J0W2ldLmNsb3NlX2RlbGF5ID0gNTAgKiBIWi8xMDA7CiAJCXN4X3BvcnRbaV0uY2xvc2luZ193YWl0ID0gMzAwMCAqIEhaLzEwMDsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3hfcG9ydFtpXS5vcGVuX3dhaXQpOwpAQCAtMjQ4MCw3ICsyNDc3LDcgQEAKIAkJCQlpKys7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwKKwkJCXBkZXYgPSBwY2lfZ2V0X2RldmljZSAoUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsCiAJCQkgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9JTzgsCiAJCQkgICAgICAgICAgICAgICAgICAgICAgICBwZGV2KTsKIAkJCWlmICghcGRldikgYnJlYWs7CkBAIC0yNDk2LDYgKzI0OTMsOSBAQAogCQkJaWYgKCFzeF9wcm9iZSgmc3hfYm9hcmRbaV0pKQogCQkJCWZvdW5kICsrOwogCQl9CisJCS8qIE1heSBleGl0IHBjaV9nZXQgc2VxdWVuY2UgZWFybHkgd2l0aCBsb3RzIG9mIGJvYXJkcyAqLworCQlpZiAocGRldiAhPSBOVUxMKQorCQkJcGNpX2Rldl9wdXQocGRldik7CiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKaW5kZXggNTIyZTg4ZS4uZTQ1MTEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMKQEAgLTQxLDEzICs0MSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2lmZGVmIENPTkZJR19QQ0kKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTYzLDQ1ICs2MiwxNiBAQAogI2RlZmluZQlCUkRfRUNINjRQQ0kJMjcKICNkZWZpbmUJQlJEX0VBU1lJT1BDSQkyOAogCi0vKgotICoJRGVmaW5lIGEgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYm9hcmQgY29uZmlndXJhdGlvbi4KLSAqCU5lZWQgdG8gc2V0IHRoaXMgdXAgaW4gdGhlIGNvZGUgKGZvciBub3cpIHdpdGggdGhlIGJvYXJkcyB0aGF0IGFyZQotICoJdG8gYmUgY29uZmlndXJlZCBpbnRvIHRoZSBzeXN0ZW0uIFRoaXMgaXMgd2hhdCBuZWVkcyB0byBiZSBtb2RpZmllZAotICoJd2hlbiBhZGRpbmcvcmVtb3ZpbmcvbW9kaWZ5aW5nIGJvYXJkcy4gRWFjaCBsaW5lIGVudHJ5IGluIHRoZQotICoJc3RsX2JyZGNvbmZbXSBhcnJheSBpcyBhIGJvYXJkLiBFYWNoIGxpbmUgY29udGFpbnMgaW8vaXJxL21lbW9yeQotICoJcmFuZ2VzIGZvciB0aGF0IGJvYXJkIChhcyB3ZWxsIGFzIHdoYXQgdHlwZSBvZiBib2FyZCBpdCBpcykuCi0gKglTb21lIGV4YW1wbGVzOgotICoJCXsgQlJEX0VBU1lJTywgMHgyYTAsIDAsIDAsIDEwLCAwIH0sCi0gKglUaGlzIGxpbmUgd291bGQgY29uZmlndXJlIGFuIEVhc3lJTyBib2FyZCAoNCBvciA4LCBubyBkaWZmZXJlbmNlKSwKLSAqCWF0IGlvIGFkZHJlc3MgMmEwIGFuZCBpcnEgMTAuCi0gKglBbm90aGVyIGV4YW1wbGU6Ci0gKgkJeyBCUkRfRUNILCAweDJhOCwgMHgyODAsIDAsIDEyLCAwIH0sCi0gKglUaGlzIGxpbmUgd2lsbCBjb25maWd1cmUgYW4gRWFzeUNvbm5lY3Rpb24gOC8zMiBib2FyZCBhdCBwcmltYXJ5IGlvCi0gKglhZGRyZXNzIDJhOCwgc2Vjb25kYXJ5IGlvIGFkZHJlc3MgMjgwIGFuZCBpcnEgMTIuCi0gKglFbnRlciBhcyBtYW55IGxpbmVzIGludG8gdGhpcyBhcnJheSBhcyB5b3Ugd2FudCAob25seSB0aGUgZmlyc3QgNAotICoJd2lsbCBhY3R1YWxseSBiZSB1c2VkISkuIEFueSBjb21iaW5hdGlvbiBvZiBFYXN5SU8gYW5kIEVhc3lDb25uZWN0aW9uCi0gKglib2FyZHMgY2FuIGJlIHNwZWNpZmllZC4gRWFzeUNvbm5lY3Rpb24gOC8zMiBib2FyZHMgY2FuIHNoYXJlIHRoZWlyCi0gKglzZWNvbmRhcnkgaW8gYWRkcmVzc2VzIGJldHdlZW4gZWFjaCBvdGhlci4KLSAqCi0gKglOT1RFOiB0aGVyZSBpcyBubyBuZWVkIHRvIHB1dCBhbnkgZW50cmllcyBpbiB0aGlzIHRhYmxlIGZvciBQQ0kKLSAqCWJvYXJkcy4gVGhleSB3aWxsIGJlIGZvdW5kIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGRyaXZlciAtIHByb3ZpZGVkCi0gKglQQ0kgQklPUzMyIHN1cHBvcnQgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQJCWJyZHR5cGU7CitzdHJ1Y3Qgc3RsY29uZiB7CisJdW5zaWduZWQgaW50CWJyZHR5cGU7CiAJaW50CQlpb2FkZHIxOwogCWludAkJaW9hZGRyMjsKIAl1bnNpZ25lZCBsb25nCW1lbWFkZHI7CiAJaW50CQlpcnE7CiAJaW50CQlpcnF0eXBlOwotfSBzdGxjb25mX3Q7Ci0KLXN0YXRpYyBzdGxjb25mX3QJc3RsX2JyZGNvbmZbXSA9IHsKLQkvKnsgQlJEX0VBU1lJTywgMHgyYTAsIDAsIDAsIDEwLCAwIH0sKi8KIH07CiAKLXN0YXRpYyBpbnQJc3RsX25yYnJkcyA9IEFSUkFZX1NJWkUoc3RsX2JyZGNvbmYpOworc3RhdGljIHVuc2lnbmVkIGludCBzdGxfbnJicmRzOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE0MywzNCArMTEzLDMwIEBACiAgKgl3aXRoIHRoaXMgdGVybWlvcyBpbml0aWFsbHkuIEJhc2ljYWxseSBhbGwgaXQgZGVmaW5lcyBpcyBhIHJhdyBwb3J0CiAgKglhdCA5NjAwLCA4IGRhdGEgYml0cywgMSBzdG9wIGJpdC4KICAqLwotc3RhdGljIHN0cnVjdCB0ZXJtaW9zCQlzdGxfZGVmdGVybWlvcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qga3Rlcm1pb3MJCXN0bF9kZWZ0ZXJtaW9zID0gewogCS5jX2NmbGFnCT0gKEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTCksCiAJLmNfY2MJCT0gSU5JVF9DX0NDLAorCS5jX2lzcGVlZAk9IDk2MDAsCisJLmNfb3NwZWVkCT0gOTYwMCwKIH07CiAKIC8qCi0gKglEZWZpbmUgZ2xvYmFsIHN0YXRzIHN0cnVjdHVyZXMuIE5vdCB1c2VkIG9mdGVuLCBhbmQgY2FuIGJlCi0gKglyZS11c2VkIGZvciBlYWNoIHN0YXRzIGNhbGwuCi0gKi8KLXN0YXRpYyBjb21zdGF0c190CXN0bF9jb21zdGF0czsKLXN0YXRpYyBjb21icmRfdAkJc3RsX2JyZHN0YXRzOwotc3RhdGljIHN0bGJyZF90CQlzdGxfZHVtbXlicmQ7Ci1zdGF0aWMgc3RscG9ydF90CXN0bF9kdW1teXBvcnQ7Ci0KLS8qCiAgKglEZWZpbmUgZ2xvYmFsIHBsYWNlIHRvIHB1dCBidWZmZXIgb3ZlcmZsb3cgY2hhcmFjdGVycy4KICAqLwogc3RhdGljIGNoYXIJCXN0bF91bndhbnRlZFtTQzI2MTk4X1JYRklGT1NJWkVdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdGxicmRfdAkJKnN0bF9icmRzW1NUTF9NQVhCUkRTXTsKK3N0YXRpYyBERUZJTkVfTVVURVgoc3RsX2JyZHNsb2NrKTsKK3N0YXRpYyBzdHJ1Y3Qgc3RsYnJkCQkqc3RsX2JyZHNbU1RMX01BWEJSRFNdOwogCiAvKgogICoJUGVyIGJvYXJkIHN0YXRlIGZsYWdzLiBVc2VkIHdpdGggdGhlIHN0YXRlIGZpZWxkIG9mIHRoZSBib2FyZCBzdHJ1Y3QuCiAgKglOb3QgcmVhbGx5IG11Y2ggaGVyZSEKICAqLwogI2RlZmluZQlCUkRfRk9VTkQJMHgxCisjZGVmaW5lIFNUTF9QUk9CRUQJMHgyCisKIAogLyoKICAqCURlZmluZSB0aGUgcG9ydCBzdHJ1Y3R1cmUgaXN0YXRlIGZsYWdzLiBUaGVzZSBzZXQgb2YgZmxhZ3MgYXJlCkBAIC0xODcsMzIgKzE1MywzMiBAQAogICoJcmVmZXJlbmNpbmcgYm9hcmRzIHdoZW4gcHJpbnRpbmcgdHJhY2UgYW5kIHN0dWZmLgogICovCiBzdGF0aWMgY2hhcgkqc3RsX2JyZG5hbWVzW10gPSB7Ci0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKLQkoY2hhciAqKSBOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKIAkiRWFzeUlPIiwKIAkiRUM4LzMyLUFUIiwKIAkiRUM4LzMyLU1DIiwKLQkoY2hhciAqKSBOVUxMLAotCShjaGFyICopIE5VTEwsCi0JKGNoYXIgKikgTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKIAkiRUM4LzMyLVBDSSIsCiAJIkVDOC82NC1QQ0kiLAogCSJFYXN5SU8tUENJIiwKQEAgLTIyNSw3ICsxOTEsNyBAQAogICoJbG9hZCBsaW5lLiBUaGVzZSBhbGxvdyBmb3IgZWFzeSBib2FyZCBkZWZpbml0aW9ucywgYW5kIGVhc3kKICAqCW1vZGlmaWNhdGlvbiBvZiB0aGUgaW8sIG1lbW9yeSBhbmQgaXJxIHJlc291Y3Jlcy4KICAqLwotc3RhdGljIGludAlzdGxfbmFyZ3MgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBzdGxfbmFyZ3M7CiBzdGF0aWMgY2hhcgkqYm9hcmQwWzRdOwogc3RhdGljIGNoYXIJKmJvYXJkMVs0XTsKIHN0YXRpYyBjaGFyCSpib2FyZDJbNF07CkBAIC0yNDMsMTIgKzIwOSwxMCBAQAogICoJcGFyc2UgYW55IG1vZHVsZSBhcmd1bWVudHMuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3Qgc3RsYnJkdHlwZSB7CitzdGF0aWMgc3RydWN0IHsKIAljaGFyCSpuYW1lOwogCWludAl0eXBlOwotfSBzdGxicmR0eXBlX3Q7Ci0KLXN0YXRpYyBzdGxicmR0eXBlX3QJc3RsX2JyZHN0cltdID0geworfSBzdGxfYnJkc3RyW10gPSB7CiAJeyAiZWFzeWlvIiwgQlJEX0VBU1lJTyB9LAogCXsgImVpbyIsIEJSRF9FQVNZSU8gfSwKIAl7ICIyMCIsIEJSRF9FQVNZSU8gfSwKQEAgLTI4Miw5ICsyNDYsNiBAQAogLyoKICAqCURlZmluZSB0aGUgbW9kdWxlIGFncnVtZW50cy4KICAqLwotTU9EVUxFX0FVVEhPUigiR3JlZyBVbmdlcmVyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlN0YWxsaW9uIE11bHRpcG9ydCBTZXJpYWwgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9wYXJhbV9hcnJheShib2FyZDAsIGNoYXJwLCAmc3RsX25hcmdzLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoYm9hcmQwLCAiQm9hcmQgMCBjb25maWcgLT4gbmFtZVssaW9hZGRyWyxpb2FkZHIyXVssaXJxXV0iKTsKQEAgLTM4Niw4ICszNDcsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBDT05GSUdfUENJCi0KIC8qCiAgKglEZWZpbmUgdGhlIFN0YWxsaW9uIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuCiAgKi8KQEAgLTQwNywyMiArMzY2LDE5IEBACiAvKgogICoJRGVmaW5lIHN0cnVjdHVyZSB0byBob2xkIGFsbCBTdGFsbGlvbiBQQ0kgYm9hcmRzLgogICovCi10eXBlZGVmIHN0cnVjdCBzdGxwY2licmQgewotCXVuc2lnbmVkIHNob3J0CQl2ZW5kaWQ7Ci0JdW5zaWduZWQgc2hvcnQJCWRldmlkOwotCWludAkJCWJyZHR5cGU7Ci19IHN0bHBjaWJyZF90OwogCi1zdGF0aWMgc3RscGNpYnJkX3QJc3RsX3BjaWJyZHNbXSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfU1RBTExJT04sIFBDSV9ERVZJQ0VfSURfRUNIUENJODY0LCBCUkRfRUNINjRQQ0kgfSwKLQl7IFBDSV9WRU5ET1JfSURfU1RBTExJT04sIFBDSV9ERVZJQ0VfSURfRUlPUENJLCBCUkRfRUFTWUlPUENJIH0sCi0JeyBQQ0lfVkVORE9SX0lEX1NUQUxMSU9OLCBQQ0lfREVWSUNFX0lEX0VDSFBDSTgzMiwgQlJEX0VDSFBDSSB9LAotCXsgUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU184NzQxMCwgQlJEX0VDSFBDSSB9LAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN0bF9wY2licmRzW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1RBTExJT04sIFBDSV9ERVZJQ0VfSURfRUNIUENJODY0KSwKKwkJLmRyaXZlcl9kYXRhID0gQlJEX0VDSDY0UENJIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1RBTExJT04sIFBDSV9ERVZJQ0VfSURfRUlPUENJKSwKKwkJLmRyaXZlcl9kYXRhID0gQlJEX0VBU1lJT1BDSSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NUQUxMSU9OLCBQQ0lfREVWSUNFX0lEX0VDSFBDSTgzMiksCisJCS5kcml2ZXJfZGF0YSA9IEJSRF9FQ0hQQ0kgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU184NzQxMCksCisJCS5kcml2ZXJfZGF0YSA9IEJSRF9FQ0hQQ0kgfSwKKwl7IH0KIH07Ci0KLXN0YXRpYyBpbnQJc3RsX25ycGNpYnJkcyA9IEFSUkFZX1NJWkUoc3RsX3BjaWJyZHMpOwotCi0jZW5kaWYKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzdGxfcGNpYnJkcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDQyLDEzNCArMzk4LDc0IEBACiAJOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwCiB9OwogCi0vKgotICoJRGVmaW5lIHNvbWUgaGFuZHkgbG9jYWwgbWFjcm9zLi4uCi0gKi8KLSN1bmRlZglNSU4KLSNkZWZpbmUJTUlOKGEsYikJKCgoYSkgPD0gKGIpKSA/IChhKSA6IChiKSkKLQotI3VuZGVmCVRPTE9XRVIKLSNkZWZpbmUJVE9MT1dFUih4KQkoKCgoeCkgPj0gJ0EnKSAmJiAoKHgpIDw9ICdaJykpID8gKCh4KSArIDB4MjApIDogKHgpKQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCiAgKglEZWNsYXJlIGFsbCB0aG9zZSBmdW5jdGlvbnMgaW4gdGhpcyBkcml2ZXIhCiAgKi8KIAotc3RhdGljIHZvaWQJc3RsX2FyZ2JyZHModm9pZCk7Ci1zdGF0aWMgaW50CXN0bF9wYXJzZWJyZChzdGxjb25mX3QgKmNvbmZwLCBjaGFyICoqYXJncCk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0bF9hdG9sKGNoYXIgKnN0cik7Ci0KLXN0YXRpYyBpbnQJc3RsX2luaXQodm9pZCk7Ci1zdGF0aWMgaW50CXN0bF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkCXN0bF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgaW50CXN0bF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7Ci1zdGF0aWMgdm9pZAlzdGxfcHV0Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKTsKLXN0YXRpYyB2b2lkCXN0bF9mbHVzaGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludAlzdGxfd3JpdGVyb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIGludAlzdGxfY2hhcnNpbmJ1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyBpbnQJc3RsX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgdm9pZAlzdGxfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKLXN0YXRpYyB2b2lkCXN0bF90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkCXN0bF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQJc3RsX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZAlzdGxfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZAlzdGxfZmx1c2hidWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZAlzdGxfYnJlYWtjdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0YXRlKTsKLXN0YXRpYyB2b2lkCXN0bF93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKLXN0YXRpYyB2b2lkCXN0bF9zZW5keGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCk7Ci1zdGF0aWMgdm9pZAlzdGxfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogc3RhdGljIGludAlzdGxfbWVtaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgaW50CXN0bF9wb3J0aW5mbyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcG9ydG5yLCBjaGFyICpwb3MpOwotc3RhdGljIGludAlzdGxfcmVhZHByb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1zdGF0aWMgaW50CXN0bF9icmRpbml0KHN0bGJyZF90ICpicmRwKTsKLXN0YXRpYyBpbnQJc3RsX2luaXRwb3J0cyhzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwKTsKLXN0YXRpYyBpbnQJc3RsX2dldHNlcmlhbChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKLXN0YXRpYyBpbnQJc3RsX3NldHNlcmlhbChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKTsKLXN0YXRpYyBpbnQJc3RsX2dldGJyZHN0YXRzKGNvbWJyZF90IF9fdXNlciAqYnApOwotc3RhdGljIGludAlzdGxfZ2V0cG9ydHN0YXRzKHN0bHBvcnRfdCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7Ci1zdGF0aWMgaW50CXN0bF9jbHJwb3J0c3RhdHMoc3RscG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKTsKLXN0YXRpYyBpbnQJc3RsX2dldHBvcnRzdHJ1Y3Qoc3RscG9ydF90IF9fdXNlciAqYXJnKTsKLXN0YXRpYyBpbnQJc3RsX2dldGJyZHN0cnVjdChzdGxicmRfdCBfX3VzZXIgKmFyZyk7Ci1zdGF0aWMgaW50CXN0bF93YWl0Y2FycmllcihzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgaW50CXN0bF9laW9pbnRyKHN0bGJyZF90ICpicmRwKTsKLXN0YXRpYyBpbnQJc3RsX2VjaGF0aW50cihzdGxicmRfdCAqYnJkcCk7Ci1zdGF0aWMgaW50CXN0bF9lY2htY2FpbnRyKHN0bGJyZF90ICpicmRwKTsKLXN0YXRpYyBpbnQJc3RsX2VjaHBjaWludHIoc3RsYnJkX3QgKmJyZHApOwotc3RhdGljIGludAlzdGxfZWNocGNpNjRpbnRyKHN0bGJyZF90ICpicmRwKTsKLXN0YXRpYyB2b2lkCXN0bF9vZmZpbnRyKHZvaWQgKnByaXZhdGUpOwotc3RhdGljIHN0bGJyZF90ICpzdGxfYWxsb2NicmQodm9pZCk7Ci1zdGF0aWMgc3RscG9ydF90ICpzdGxfZ2V0cG9ydChpbnQgYnJkbnIsIGludCBwYW5lbG5yLCBpbnQgcG9ydG5yKTsKLQotc3RhdGljIGlubGluZSBpbnQJc3RsX2luaXRicmRzKHZvaWQpOwotc3RhdGljIGlubGluZSBpbnQJc3RsX2luaXRlaW8oc3RsYnJkX3QgKmJyZHApOwotc3RhdGljIGlubGluZSBpbnQJc3RsX2luaXRlY2goc3RsYnJkX3QgKmJyZHApOwotc3RhdGljIGlubGluZSBpbnQJc3RsX2dldGJyZG5yKHZvaWQpOwotCi0jaWZkZWYJQ09ORklHX1BDSQotc3RhdGljIGlubGluZSBpbnQJc3RsX2ZpbmRwY2licmRzKHZvaWQpOwotc3RhdGljIGlubGluZSBpbnQJc3RsX2luaXRwY2licmQoaW50IGJyZHR5cGUsIHN0cnVjdCBwY2lfZGV2ICpkZXZwKTsKLSNlbmRpZgorc3RhdGljIGludAlzdGxfYnJkaW5pdChzdHJ1Y3Qgc3RsYnJkICpicmRwKTsKK3N0YXRpYyBpbnQJc3RsX2dldHBvcnRzdGF0cyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGNvbXN0YXRzX3QgX191c2VyICpjcCk7CitzdGF0aWMgaW50CXN0bF9jbHJwb3J0c3RhdHMoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApOworc3RhdGljIGludAlzdGxfd2FpdGNhcnJpZXIoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKIC8qCiAgKglDRDE0MDAgdWFydCBzcGVjaWZpYyBoYW5kbGluZyBmdW5jdGlvbnMuCiAgKi8KLXN0YXRpYyB2b2lkCXN0bF9jZDE0MDBzZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpOwotc3RhdGljIGludAlzdGxfY2QxNDAwZ2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWducik7Ci1zdGF0aWMgaW50CXN0bF9jZDE0MDB1cGRhdGVyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpOwotc3RhdGljIGludAlzdGxfY2QxNDAwcGFuZWxpbml0KHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHApOwotc3RhdGljIHZvaWQJc3RsX2NkMTQwMHBvcnRpbml0KHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHAsIHN0bHBvcnRfdCAqcG9ydHApOwotc3RhdGljIHZvaWQJc3RsX2NkMTQwMHNldHBvcnQoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKTsKLXN0YXRpYyBpbnQJc3RsX2NkMTQwMGdldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCk7Ci1zdGF0aWMgdm9pZAlzdGxfY2QxNDAwc2V0c2lnbmFscyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgZHRyLCBpbnQgcnRzKTsKLXN0YXRpYyB2b2lkCXN0bF9jZDE0MDBjY3J3YWl0KHN0bHBvcnRfdCAqcG9ydHApOwotc3RhdGljIHZvaWQJc3RsX2NkMTQwMGVuYWJsZXJ4dHgoc3RscG9ydF90ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpOwotc3RhdGljIHZvaWQJc3RsX2NkMTQwMHN0YXJ0cnh0eChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7Ci1zdGF0aWMgdm9pZAlzdGxfY2QxNDAwZGlzYWJsZWludHJzKHN0bHBvcnRfdCAqcG9ydHApOwotc3RhdGljIHZvaWQJc3RsX2NkMTQwMHNlbmRicmVhayhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgbGVuKTsKLXN0YXRpYyB2b2lkCXN0bF9jZDE0MDBmbG93Y3RybChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpOwotc3RhdGljIHZvaWQJc3RsX2NkMTQwMHNlbmRmbG93KHN0bHBvcnRfdCAqcG9ydHAsIGludCBzdGF0ZSk7Ci1zdGF0aWMgdm9pZAlzdGxfY2QxNDAwZmx1c2goc3RscG9ydF90ICpwb3J0cCk7Ci1zdGF0aWMgaW50CXN0bF9jZDE0MDBkYXRhc3RhdGUoc3RscG9ydF90ICpwb3J0cCk7Ci1zdGF0aWMgdm9pZAlzdGxfY2QxNDAwZWlvaW50cihzdGxwYW5lbF90ICpwYW5lbHAsIHVuc2lnbmVkIGludCBpb2Jhc2UpOwotc3RhdGljIHZvaWQJc3RsX2NkMTQwMGVjaGludHIoc3RscGFuZWxfdCAqcGFuZWxwLCB1bnNpZ25lZCBpbnQgaW9iYXNlKTsKLXN0YXRpYyB2b2lkCXN0bF9jZDE0MDB0eGlzcihzdGxwYW5lbF90ICpwYW5lbHAsIGludCBpb2FkZHIpOwotc3RhdGljIHZvaWQJc3RsX2NkMTQwMHJ4aXNyKHN0bHBhbmVsX3QgKnBhbmVscCwgaW50IGlvYWRkcik7Ci1zdGF0aWMgdm9pZAlzdGxfY2QxNDAwbWRtaXNyKHN0bHBhbmVsX3QgKnBhbmVscCwgaW50IGlvYWRkcik7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwc2V0cmVnKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpOworc3RhdGljIGludAlzdGxfY2QxNDAwZ2V0cmVnKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHJlZ25yKTsKK3N0YXRpYyBpbnQJc3RsX2NkMTQwMHVwZGF0ZXJlZyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQJc3RsX2NkMTQwMHBhbmVsaW5pdChzdHJ1Y3Qgc3RsYnJkICpicmRwLCBzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwcG9ydGluaXQoc3RydWN0IHN0bGJyZCAqYnJkcCwgc3RydWN0IHN0bHBhbmVsICpwYW5lbHAsIHN0cnVjdCBzdGxwb3J0ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwc2V0cG9ydChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIHN0cnVjdCBrdGVybWlvcyAqdGlvc3ApOworc3RhdGljIGludAlzdGxfY2QxNDAwZ2V0c2lnbmFscyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMHNldHNpZ25hbHMoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgZHRyLCBpbnQgcnRzKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBjY3J3YWl0KHN0cnVjdCBzdGxwb3J0ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwZW5hYmxlcnh0eChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBzdGFydHJ4dHgoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwZGlzYWJsZWludHJzKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwc2VuZGJyZWFrKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IGxlbik7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwZmxvd2N0cmwoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgc3RhdGUpOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMHNlbmRmbG93KHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHN0YXRlKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBmbHVzaChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApOworc3RhdGljIGludAlzdGxfY2QxNDAwZGF0YXN0YXRlKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwZWlvaW50cihzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwZWNoaW50cihzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZAlzdGxfY2QxNDAwdHhpc3Ioc3RydWN0IHN0bHBhbmVsICpwYW5lbHAsIGludCBpb2FkZHIpOworc3RhdGljIHZvaWQJc3RsX2NkMTQwMHJ4aXNyKHN0cnVjdCBzdGxwYW5lbCAqcGFuZWxwLCBpbnQgaW9hZGRyKTsKK3N0YXRpYyB2b2lkCXN0bF9jZDE0MDBtZG1pc3Ioc3RydWN0IHN0bHBhbmVsICpwYW5lbHAsIGludCBpb2FkZHIpOwogCi1zdGF0aWMgaW5saW5lIGludAlzdGxfY2QxNDAwYnJlYWtpc3Ioc3RscG9ydF90ICpwb3J0cCwgaW50IGlvYWRkcik7CitzdGF0aWMgaW5saW5lIGludAlzdGxfY2QxNDAwYnJlYWtpc3Ioc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgaW9hZGRyKTsKIAogLyoKICAqCVNDMjYxOTggdWFydCBzcGVjaWZpYyBoYW5kbGluZyBmdW5jdGlvbnMuCiAgKi8KLXN0YXRpYyB2b2lkCXN0bF9zYzI2MTk4c2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKTsKLXN0YXRpYyBpbnQJc3RsX3NjMjYxOThnZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKTsKLXN0YXRpYyBpbnQJc3RsX3NjMjYxOTh1cGRhdGVyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpOwotc3RhdGljIGludAlzdGxfc2MyNjE5OGdldGdsb2JyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKTsKLXN0YXRpYyBpbnQJc3RsX3NjMjYxOThwYW5lbGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCk7Ci1zdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHBvcnRpbml0KHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHAsIHN0bHBvcnRfdCAqcG9ydHApOwotc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzZXRwb3J0KHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCB0ZXJtaW9zICp0aW9zcCk7Ci1zdGF0aWMgaW50CXN0bF9zYzI2MTk4Z2V0c2lnbmFscyhzdGxwb3J0X3QgKnBvcnRwKTsKLXN0YXRpYyB2b2lkCXN0bF9zYzI2MTk4c2V0c2lnbmFscyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgZHRyLCBpbnQgcnRzKTsKLXN0YXRpYyB2b2lkCXN0bF9zYzI2MTk4ZW5hYmxlcnh0eChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7Ci1zdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHN0YXJ0cnh0eChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7Ci1zdGF0aWMgdm9pZAlzdGxfc2MyNjE5OGRpc2FibGVpbnRycyhzdGxwb3J0X3QgKnBvcnRwKTsKLXN0YXRpYyB2b2lkCXN0bF9zYzI2MTk4c2VuZGJyZWFrKHN0bHBvcnRfdCAqcG9ydHAsIGludCBsZW4pOwotc3RhdGljIHZvaWQJc3RsX3NjMjYxOThmbG93Y3RybChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpOwotc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzZW5kZmxvdyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpOwotc3RhdGljIHZvaWQJc3RsX3NjMjYxOThmbHVzaChzdGxwb3J0X3QgKnBvcnRwKTsKLXN0YXRpYyBpbnQJc3RsX3NjMjYxOThkYXRhc3RhdGUoc3RscG9ydF90ICpwb3J0cCk7Ci1zdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHdhaXQoc3RscG9ydF90ICpwb3J0cCk7Ci1zdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHR4dW5mbG93KHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQJc3RsX3NjMjYxOThpbnRyKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7Ci1zdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHR4aXNyKHN0bHBvcnRfdCAqcG9ydCk7Ci1zdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHJ4aXNyKHN0bHBvcnRfdCAqcG9ydCwgdW5zaWduZWQgaW50IGlhY2spOwotc3RhdGljIHZvaWQJc3RsX3NjMjYxOThyeGJhZGNoKHN0bHBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGNoYXIgc3RhdHVzLCBjaGFyIGNoKTsKLXN0YXRpYyB2b2lkCXN0bF9zYzI2MTk4cnhiYWRjaGFycyhzdGxwb3J0X3QgKnBvcnRwKTsKLXN0YXRpYyB2b2lkCXN0bF9zYzI2MTk4b3RoZXJpc3Ioc3RscG9ydF90ICpwb3J0LCB1bnNpZ25lZCBpbnQgaWFjayk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHNldHJlZyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQJc3RsX3NjMjYxOThnZXRyZWcoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgcmVnbnIpOworc3RhdGljIGludAlzdGxfc2MyNjE5OHVwZGF0ZXJlZyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQJc3RsX3NjMjYxOThnZXRnbG9icmVnKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHJlZ25yKTsKK3N0YXRpYyBpbnQJc3RsX3NjMjYxOThwYW5lbGluaXQoc3RydWN0IHN0bGJyZCAqYnJkcCwgc3RydWN0IHN0bHBhbmVsICpwYW5lbHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThwb3J0aW5pdChzdHJ1Y3Qgc3RsYnJkICpicmRwLCBzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgc3RydWN0IHN0bHBvcnQgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4c2V0cG9ydChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIHN0cnVjdCBrdGVybWlvcyAqdGlvc3ApOworc3RhdGljIGludAlzdGxfc2MyNjE5OGdldHNpZ25hbHMoc3RydWN0IHN0bHBvcnQgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4c2V0c2lnbmFscyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCBkdHIsIGludCBydHMpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThlbmFibGVyeHR4KHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzdGFydHJ4dHgoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OGRpc2FibGVpbnRycyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzZW5kYnJlYWsoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4Zmxvd2N0cmwoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgc3RhdGUpOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThzZW5kZmxvdyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCBzdGF0ZSk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OGZsdXNoKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCk7CitzdGF0aWMgaW50CXN0bF9zYzI2MTk4ZGF0YXN0YXRlKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHdhaXQoc3RydWN0IHN0bHBvcnQgKnBvcnRwKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4dHh1bmZsb3coc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4aW50cihzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZAlzdGxfc2MyNjE5OHR4aXNyKHN0cnVjdCBzdGxwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4cnhpc3Ioc3RydWN0IHN0bHBvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBpYWNrKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4cnhiYWRjaChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIHVuc2lnbmVkIGNoYXIgc3RhdHVzLCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkCXN0bF9zYzI2MTk4cnhiYWRjaGFycyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApOworc3RhdGljIHZvaWQJc3RsX3NjMjYxOThvdGhlcmlzcihzdHJ1Y3Qgc3RscG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGlhY2spOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTU3NywyMCArNDczLDIwIEBACiAgKglHZW5lcmljIFVBUlQgc3VwcG9ydCBzdHJ1Y3R1cmUuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHVhcnQgewotCWludAkoKnBhbmVsaW5pdCkoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCk7Ci0Jdm9pZAkoKnBvcnRpbml0KShzdGxicmRfdCAqYnJkcCwgc3RscGFuZWxfdCAqcGFuZWxwLCBzdGxwb3J0X3QgKnBvcnRwKTsKLQl2b2lkCSgqc2V0cG9ydCkoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHRlcm1pb3MgKnRpb3NwKTsKLQlpbnQJKCpnZXRzaWduYWxzKShzdGxwb3J0X3QgKnBvcnRwKTsKLQl2b2lkCSgqc2V0c2lnbmFscykoc3RscG9ydF90ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cyk7Ci0Jdm9pZAkoKmVuYWJsZXJ4dHgpKHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKLQl2b2lkCSgqc3RhcnRyeHR4KShzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcngsIGludCB0eCk7Ci0Jdm9pZAkoKmRpc2FibGVpbnRycykoc3RscG9ydF90ICpwb3J0cCk7Ci0Jdm9pZAkoKnNlbmRicmVhaykoc3RscG9ydF90ICpwb3J0cCwgaW50IGxlbik7Ci0Jdm9pZAkoKmZsb3djdHJsKShzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpOwotCXZvaWQJKCpzZW5kZmxvdykoc3RscG9ydF90ICpwb3J0cCwgaW50IHN0YXRlKTsKLQl2b2lkCSgqZmx1c2gpKHN0bHBvcnRfdCAqcG9ydHApOwotCWludAkoKmRhdGFzdGF0ZSkoc3RscG9ydF90ICpwb3J0cCk7Ci0Jdm9pZAkoKmludHIpKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7CisJaW50CSgqcGFuZWxpbml0KShzdHJ1Y3Qgc3RsYnJkICpicmRwLCBzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCk7CisJdm9pZAkoKnBvcnRpbml0KShzdHJ1Y3Qgc3RsYnJkICpicmRwLCBzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgc3RydWN0IHN0bHBvcnQgKnBvcnRwKTsKKwl2b2lkCSgqc2V0cG9ydCkoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBzdHJ1Y3Qga3Rlcm1pb3MgKnRpb3NwKTsKKwlpbnQJKCpnZXRzaWduYWxzKShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApOworCXZvaWQJKCpzZXRzaWduYWxzKShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCBkdHIsIGludCBydHMpOworCXZvaWQJKCplbmFibGVyeHR4KShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKKwl2b2lkCSgqc3RhcnRyeHR4KShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByeCwgaW50IHR4KTsKKwl2b2lkCSgqZGlzYWJsZWludHJzKShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApOworCXZvaWQJKCpzZW5kYnJlYWspKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IGxlbik7CisJdm9pZAkoKmZsb3djdHJsKShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCBzdGF0ZSk7CisJdm9pZAkoKnNlbmRmbG93KShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCBzdGF0ZSk7CisJdm9pZAkoKmZsdXNoKShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApOworCWludAkoKmRhdGFzdGF0ZSkoc3RydWN0IHN0bHBvcnQgKnBvcnRwKTsKKwl2b2lkCSgqaW50cikoc3RydWN0IHN0bHBhbmVsICpwYW5lbHAsIHVuc2lnbmVkIGludCBpb2Jhc2UpOwogfSB1YXJ0X3Q7CiAKIC8qCkBAIC03MTIsMTg0ICs2MDgsMzUgQEAKIAkuaW9jdGwJCT0gc3RsX21lbWlvY3RsLAogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBzdGF0aWMgc3RydWN0IGNsYXNzICpzdGFsbGlvbl9jbGFzczsKIAogLyoKLSAqCUxvYWRhYmxlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBzdHVmZi4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBzdGFsbGlvbl9tb2R1bGVfaW5pdCh2b2lkKQotewotCXN0bF9pbml0KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgX19leGl0IHN0YWxsaW9uX21vZHVsZV9leGl0KHZvaWQpCi17Ci0Jc3RsYnJkX3QJKmJyZHA7Ci0Jc3RscGFuZWxfdAkqcGFuZWxwOwotCXN0bHBvcnRfdAkqcG9ydHA7Ci0JaW50CQlpLCBqLCBrOwotCi0jaWZkZWYgREVCVUcKLQlwcmludGsoImNsZWFudXBfbW9kdWxlKClcbiIpOwotI2VuZGlmCi0KLQlwcmludGsoS0VSTl9JTkZPICJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHN0bF9kcnZ0aXRsZSwKLQkJc3RsX2RydnZlcnNpb24pOwotCi0vKgotICoJRnJlZSB1cCBhbGwgYWxsb2NhdGVkIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBwb3J0cy4gVGhpcyBpbmNsdWRlcwotICoJbWVtb3J5IGFuZCBpbnRlcnJ1cHRzLiBBcyBwYXJ0IG9mIHRoaXMgcHJvY2VzcyB3ZSB3aWxsIGFsc28gZG8KLSAqCWEgaGFuZ3VwIG9uIGV2ZXJ5IG9wZW4gcG9ydCAtIHRvIHRyeSB0byBmbHVzaCBvdXQgYW55IHByb2Nlc3NlcwotICoJaGFuZ2luZyBvbnRvIHBvcnRzLgotICovCi0JaSA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzdGxfc2VyaWFsKTsKLQlwdXRfdHR5X2RyaXZlcihzdGxfc2VyaWFsKTsKLQlpZiAoaSkgewotCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgdHR5IGRyaXZlciwgIgotCQkJImVycm5vPSVkXG4iLCAtaSk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koc3RhbGxpb25fY2xhc3MsIE1LREVWKFNUTF9TSU9NRU1NQUpPUiwgaSkpOwotCWlmICgoaSA9IHVucmVnaXN0ZXJfY2hyZGV2KFNUTF9TSU9NRU1NQUpPUiwgInN0YWxpb21lbSIpKSkKLQkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHVuLXJlZ2lzdGVyIHNlcmlhbCBtZW1vcnkgZGV2aWNlLCAiCi0JCQkiZXJybm89JWRcbiIsIC1pKTsKLQljbGFzc19kZXN0cm95KHN0YWxsaW9uX2NsYXNzKTsKLQotCWZvciAoaSA9IDA7IChpIDwgc3RsX25yYnJkcyk7IGkrKykgewotCQlpZiAoKGJyZHAgPSBzdGxfYnJkc1tpXSkgPT0gKHN0bGJyZF90ICopIE5VTEwpCi0JCQljb250aW51ZTsKLQotCQlmcmVlX2lycShicmRwLT5pcnEsIGJyZHApOwotCi0JCWZvciAoaiA9IDA7IChqIDwgU1RMX01BWFBBTkVMUyk7IGorKykgewotCQkJcGFuZWxwID0gYnJkcC0+cGFuZWxzW2pdOwotCQkJaWYgKHBhbmVscCA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChrID0gMDsgKGsgPCBTVExfUE9SVFNQRVJQQU5FTCk7IGsrKykgewotCQkJCXBvcnRwID0gcGFuZWxwLT5wb3J0c1trXTsKLQkJCQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocG9ydHAtPnR0eSAhPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKLQkJCQkJc3RsX2hhbmd1cChwb3J0cC0+dHR5KTsKLQkJCQlrZnJlZShwb3J0cC0+dHguYnVmKTsKLQkJCQlrZnJlZShwb3J0cCk7Ci0JCQl9Ci0JCQlrZnJlZShwYW5lbHApOwotCQl9Ci0KLQkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9hZGRyMSwgYnJkcC0+aW9zaXplMSk7Ci0JCWlmIChicmRwLT5pb3NpemUyID4gMCkKLQkJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYWRkcjIsIGJyZHAtPmlvc2l6ZTIpOwotCi0JCWtmcmVlKGJyZHApOwotCQlzdGxfYnJkc1tpXSA9IChzdGxicmRfdCAqKSBOVUxMOwotCX0KLX0KLQotbW9kdWxlX2luaXQoc3RhbGxpb25fbW9kdWxlX2luaXQpOwotbW9kdWxlX2V4aXQoc3RhbGxpb25fbW9kdWxlX2V4aXQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCiAgKglDaGVjayBmb3IgYW55IGFyZ3VtZW50cyBwYXNzZWQgaW4gb24gdGhlIG1vZHVsZSBsb2FkIGNvbW1hbmQgbGluZS4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxfYXJnYnJkcyh2b2lkKQotewotCXN0bGNvbmZfdAljb25mOwotCXN0bGJyZF90CSpicmRwOwotCWludAkJaTsKLQotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfYXJnYnJkcygpXG4iKTsKLSNlbmRpZgotCi0JZm9yIChpID0gc3RsX25yYnJkczsgKGkgPCBzdGxfbmFyZ3MpOyBpKyspIHsKLQkJbWVtc2V0KCZjb25mLCAwLCBzaXplb2YoY29uZikpOwotCQlpZiAoc3RsX3BhcnNlYnJkKCZjb25mLCBzdGxfYnJkc3BbaV0pID09IDApCi0JCQljb250aW51ZTsKLQkJaWYgKChicmRwID0gc3RsX2FsbG9jYnJkKCkpID09IChzdGxicmRfdCAqKSBOVUxMKQotCQkJY29udGludWU7Ci0JCXN0bF9ucmJyZHMgPSBpICsgMTsKLQkJYnJkcC0+YnJkbnIgPSBpOwotCQlicmRwLT5icmR0eXBlID0gY29uZi5icmR0eXBlOwotCQlicmRwLT5pb2FkZHIxID0gY29uZi5pb2FkZHIxOwotCQlicmRwLT5pb2FkZHIyID0gY29uZi5pb2FkZHIyOwotCQlicmRwLT5pcnEgPSBjb25mLmlycTsKLQkJYnJkcC0+aXJxdHlwZSA9IGNvbmYuaXJxdHlwZTsKLQkJc3RsX2JyZGluaXQoYnJkcCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKglDb252ZXJ0IGFuIGFzY2lpIHN0cmluZyBudW1iZXIgaW50byBhbiB1bnNpZ25lZCBsb25nLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0bF9hdG9sKGNoYXIgKnN0cikKLXsKLQl1bnNpZ25lZCBsb25nCXZhbDsKLQlpbnQJCWJhc2UsIGM7Ci0JY2hhcgkJKnNwOwotCi0JdmFsID0gMDsKLQlzcCA9IHN0cjsKLQlpZiAoKCpzcCA9PSAnMCcpICYmICgqKHNwKzEpID09ICd4JykpIHsKLQkJYmFzZSA9IDE2OwotCQlzcCArPSAyOwotCX0gZWxzZSBpZiAoKnNwID09ICcwJykgewotCQliYXNlID0gODsKLQkJc3ArKzsKLQl9IGVsc2UgewotCQliYXNlID0gMTA7Ci0JfQotCi0JZm9yICg7ICgqc3AgIT0gMCk7IHNwKyspIHsKLQkJYyA9ICgqc3AgPiAnOScpID8gKFRPTE9XRVIoKnNwKSAtICdhJyArIDEwKSA6ICgqc3AgLSAnMCcpOwotCQlpZiAoKGMgPCAwKSB8fCAoYyA+PSBiYXNlKSkgewotCQkJcHJpbnRrKCJTVEFMTElPTjogaW52YWxpZCBhcmd1bWVudCAlc1xuIiwgc3RyKTsKLQkJCXZhbCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQl2YWwgPSAodmFsICogYmFzZSkgKyBjOwotCX0KLQlyZXR1cm4gdmFsOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCiAgKglQYXJzZSB0aGUgc3VwcGxpZWQgYXJndW1lbnQgc3RyaW5nLCBpbnRvIHRoZSBib2FyZCBjb25mIHN0cnVjdC4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9wYXJzZWJyZChzdGxjb25mX3QgKmNvbmZwLCBjaGFyICoqYXJncCkKK3N0YXRpYyBpbnQgX19pbml0IHN0bF9wYXJzZWJyZChzdHJ1Y3Qgc3RsY29uZiAqY29uZnAsIGNoYXIgKiphcmdwKQogewogCWNoYXIJKnNwOwotCWludAlpOworCXVuc2lnbmVkIGludCBpOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9wYXJzZWJyZChjb25mcD0leCxhcmdwPSV4KVxuIiwgKGludCkgY29uZnAsIChpbnQpIGFyZ3ApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9wYXJzZWJyZChjb25mcD0lcCxhcmdwPSVwKVxuIiwgY29uZnAsIGFyZ3ApOwogCi0JaWYgKChhcmdwWzBdID09IChjaGFyICopIE5VTEwpIHx8ICgqYXJncFswXSA9PSAwKSkKKwlpZiAoKGFyZ3BbMF0gPT0gTlVMTCkgfHwgKCphcmdwWzBdID09IDApKQogCQlyZXR1cm4gMDsKIAotCWZvciAoc3AgPSBhcmdwWzBdLCBpID0gMDsgKCgqc3AgIT0gMCkgJiYgKGkgPCAyNSkpOyBzcCsrLCBpKyspCi0JCSpzcCA9IFRPTE9XRVIoKnNwKTsKKwlmb3IgKHNwID0gYXJncFswXSwgaSA9IDA7ICgqc3AgIT0gMCkgJiYgKGkgPCAyNSk7IHNwKyssIGkrKykKKwkJKnNwID0gdG9sb3dlcigqc3ApOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RsX2JyZHN0cik7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0bF9icmRzdHIpOyBpKyspCiAJCWlmIChzdHJjbXAoc3RsX2JyZHN0cltpXS5uYW1lLCBhcmdwWzBdKSA9PSAwKQogCQkJYnJlYWs7Ci0JfQorCiAJaWYgKGkgPT0gQVJSQVlfU0laRShzdGxfYnJkc3RyKSkgewogCQlwcmludGsoIlNUQUxMSU9OOiB1bmtub3duIGJvYXJkIG5hbWUsICVzP1xuIiwgYXJncFswXSk7CiAJCXJldHVybiAwOwpAQCAtODk4LDE2ICs2NDUsMTYgQEAKIAljb25mcC0+YnJkdHlwZSA9IHN0bF9icmRzdHJbaV0udHlwZTsKIAogCWkgPSAxOwotCWlmICgoYXJncFtpXSAhPSAoY2hhciAqKSBOVUxMKSAmJiAoKmFyZ3BbaV0gIT0gMCkpCi0JCWNvbmZwLT5pb2FkZHIxID0gc3RsX2F0b2woYXJncFtpXSk7CisJaWYgKChhcmdwW2ldICE9IE5VTEwpICYmICgqYXJncFtpXSAhPSAwKSkKKwkJY29uZnAtPmlvYWRkcjEgPSBzaW1wbGVfc3RydG91bChhcmdwW2ldLCBOVUxMLCAwKTsKIAlpKys7CiAJaWYgKGNvbmZwLT5icmR0eXBlID09IEJSRF9FQ0gpIHsKLQkJaWYgKChhcmdwW2ldICE9IChjaGFyICopIE5VTEwpICYmICgqYXJncFtpXSAhPSAwKSkKLQkJCWNvbmZwLT5pb2FkZHIyID0gc3RsX2F0b2woYXJncFtpXSk7CisJCWlmICgoYXJncFtpXSAhPSBOVUxMKSAmJiAoKmFyZ3BbaV0gIT0gMCkpCisJCQljb25mcC0+aW9hZGRyMiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3BbaV0sIE5VTEwsIDApOwogCQlpKys7CiAJfQotCWlmICgoYXJncFtpXSAhPSAoY2hhciAqKSBOVUxMKSAmJiAoKmFyZ3BbaV0gIT0gMCkpCi0JCWNvbmZwLT5pcnEgPSBzdGxfYXRvbChhcmdwW2ldKTsKKwlpZiAoKGFyZ3BbaV0gIT0gTlVMTCkgJiYgKCphcmdwW2ldICE9IDApKQorCQljb25mcC0+aXJxID0gc2ltcGxlX3N0cnRvdWwoYXJncFtpXSwgTlVMTCwgMCk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTkxNywxNCArNjY0LDE0IEBACiAgKglBbGxvY2F0ZSBhIG5ldyBib2FyZCBzdHJ1Y3R1cmUuIEZpbGwgb3V0IHRoZSBiYXNpYyBpbmZvIGluIGl0LgogICovCiAKLXN0YXRpYyBzdGxicmRfdCAqc3RsX2FsbG9jYnJkKHZvaWQpCitzdGF0aWMgc3RydWN0IHN0bGJyZCAqc3RsX2FsbG9jYnJkKHZvaWQpCiB7Ci0Jc3RsYnJkX3QJKmJyZHA7CisJc3RydWN0IHN0bGJyZAkqYnJkcDsKIAotCWJyZHAgPSBremFsbG9jKHNpemVvZihzdGxicmRfdCksIEdGUF9LRVJORUwpOworCWJyZHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RsYnJkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFicmRwKSB7CiAJCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgKHNpemU9JVpkKVxuIiwKLQkJCXNpemVvZihzdGxicmRfdCkpOworCQkJc2l6ZW9mKHN0cnVjdCBzdGxicmQpKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC05MzYsMjYgKzY4MywyMyBAQAogCiBzdGF0aWMgaW50IHN0bF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0bHBvcnRfdAkqcG9ydHA7Ci0Jc3RsYnJkX3QJKmJyZHA7Ci0JdW5zaWduZWQgaW50CW1pbm9yZGV2OwotCWludAkJYnJkbnIsIHBhbmVsbnIsIHBvcnRuciwgcmM7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRwOworCXN0cnVjdCBzdGxicmQJKmJyZHA7CisJdW5zaWduZWQgaW50CW1pbm9yZGV2LCBicmRuciwgcGFuZWxucjsKKwlpbnQJCXBvcnRuciwgcmM7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX29wZW4odHR5PSV4LGZpbHA9JXgpOiBkZXZpY2U9JXNcbiIsIChpbnQpIHR0eSwKLQkJKGludCkgZmlscCwgdHR5LT5uYW1lKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfb3Blbih0dHk9JXAsZmlscD0lcCk6IGRldmljZT0lc1xuIiwgdHR5LCBmaWxwLCB0dHktPm5hbWUpOwogCiAJbWlub3JkZXYgPSB0dHktPmluZGV4OwogCWJyZG5yID0gTUlOT1IyQlJEKG1pbm9yZGV2KTsKIAlpZiAoYnJkbnIgPj0gc3RsX25yYnJkcykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJYnJkcCA9IHN0bF9icmRzW2JyZG5yXTsKLQlpZiAoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkKKwlpZiAoYnJkcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAltaW5vcmRldiA9IE1JTk9SMlBPUlQobWlub3JkZXYpOwotCWZvciAocG9ydG5yID0gLTEsIHBhbmVsbnIgPSAwOyAocGFuZWxuciA8IFNUTF9NQVhQQU5FTFMpOyBwYW5lbG5yKyspIHsKLQkJaWYgKGJyZHAtPnBhbmVsc1twYW5lbG5yXSA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKQorCWZvciAocG9ydG5yID0gLTEsIHBhbmVsbnIgPSAwOyBwYW5lbG5yIDwgU1RMX01BWFBBTkVMUzsgcGFuZWxucisrKSB7CisJCWlmIChicmRwLT5wYW5lbHNbcGFuZWxucl0gPT0gTlVMTCkKIAkJCWJyZWFrOwogCQlpZiAobWlub3JkZXYgPCBicmRwLT5wYW5lbHNbcGFuZWxucl0tPm5ycG9ydHMpIHsKIAkJCXBvcnRuciA9IG1pbm9yZGV2OwpAQCAtOTY3LDcgKzcxMSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJcG9ydHAgPSBicmRwLT5wYW5lbHNbcGFuZWxucl0tPnBvcnRzW3BvcnRucl07Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIC8qCkBAIC0xMDEzLDEwICs3NTcsMTAgQEAKICAqCXByZXZpb3VzIG9wZW5zIHN0aWxsIGluIGVmZmVjdC4gSWYgd2UgYXJlIGEgbm9ybWFsIHNlcmlhbCBkZXZpY2UKICAqCXRoZW4gYWxzbyB3ZSBtaWdodCBoYXZlIHRvIHdhaXQgZm9yIGNhcnJpZXIuCiAgKi8KLQlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCiAJCWlmICgocmMgPSBzdGxfd2FpdGNhcnJpZXIocG9ydHAsIGZpbHApKSAhPSAwKQogCQkJcmV0dXJuIHJjOwotCX0KKwogCXBvcnRwLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOwogCiAJcmV0dXJuIDA7CkBAIC0xMDI5LDE0ICs3NzMsMTIgQEAKICAqCW1heWJlIGJlY2F1c2UgaWYgd2UgYXJlIGNsb2NhbCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gd2FpdC4uLgogICovCiAKLXN0YXRpYyBpbnQgc3RsX3dhaXRjYXJyaWVyKHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBzdGxfd2FpdGNhcnJpZXIoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCWludAkJcmMsIGRvY2xvY2FsOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF93YWl0Y2Fycmllcihwb3J0cD0leCxmaWxwPSV4KVxuIiwgKGludCkgcG9ydHAsIChpbnQpIGZpbHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF93YWl0Y2Fycmllcihwb3J0cD0lcCxmaWxwPSVwKVxuIiwgcG9ydHAsIGZpbHApOwogCiAJcmMgPSAwOwogCWRvY2xvY2FsID0gMDsKQEAgLTEwNjIsOSArODA0LDggQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmICgoKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpID09IDApICYmCi0JCSAgICAoZG9jbG9jYWwgfHwgKHBvcnRwLT5zaWdzICYgVElPQ01fQ0QpKSkgeworCQkgICAgKGRvY2xvY2FsIHx8IChwb3J0cC0+c2lncyAmIFRJT0NNX0NEKSkpCiAJCQlicmVhazsKLQkJfQogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCXJjID0gLUVSRVNUQVJUU1lTOwogCQkJYnJlYWs7CkBAIC0xMDgzLDE3ICs4MjQsNjEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgdm9pZCBzdGxfZmx1c2hidWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CisKKwlwcl9kZWJ1Zygic3RsX2ZsdXNoYnVmZmVyKHR0eT0lcClcbiIsIHR0eSk7CisKKwlpZiAodHR5ID09IE5VTEwpCisJCXJldHVybjsKKwlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJaWYgKHBvcnRwID09IE5VTEwpCisJCXJldHVybjsKKworCXN0bF9mbHVzaChwb3J0cCk7CisJdHR5X3dha2V1cCh0dHkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHN0bF93YWl0dW50aWxzZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKKwl1bnNpZ25lZCBsb25nCXRlbmQ7CisKKwlwcl9kZWJ1Zygic3RsX3dhaXR1bnRpbHNlbnQodHR5PSVwLHRpbWVvdXQ9JWQpXG4iLCB0dHksIHRpbWVvdXQpOworCisJaWYgKHR0eSA9PSBOVUxMKQorCQlyZXR1cm47CisJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOworCWlmIChwb3J0cCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAodGltZW91dCA9PSAwKQorCQl0aW1lb3V0ID0gSFo7CisJdGVuZCA9IGppZmZpZXMgKyB0aW1lb3V0OworCisJd2hpbGUgKHN0bF9kYXRhc3RhdGUocG9ydHApKSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMCk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRlbmQpKQorCQkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHN0YXRpYyB2b2lkIHN0bF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlzdGxwb3J0X3QJKnBvcnRwOworCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9jbG9zZSh0dHk9JXgsZmlscD0leClcbiIsIChpbnQpIHR0eSwgKGludCkgZmlscCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2Nsb3NlKHR0eT0lcCxmaWxwPSVwKVxuIiwgdHR5LCBmaWxwKTsKIAogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhbGxpb25fbG9jaywgZmxhZ3MpOwpAQCAtMTEzNiwxNyArOTIxLDE3IEBACiAJc3RsX2VuYWJsZXJ4dHgocG9ydHAsIDAsIDApOwogCXN0bF9mbHVzaGJ1ZmZlcih0dHkpOwogCXBvcnRwLT5pc3RhdGUgPSAwOwotCWlmIChwb3J0cC0+dHguYnVmICE9IChjaGFyICopIE5VTEwpIHsKKwlpZiAocG9ydHAtPnR4LmJ1ZiAhPSBOVUxMKSB7CiAJCWtmcmVlKHBvcnRwLT50eC5idWYpOwotCQlwb3J0cC0+dHguYnVmID0gKGNoYXIgKikgTlVMTDsKLQkJcG9ydHAtPnR4LmhlYWQgPSAoY2hhciAqKSBOVUxMOwotCQlwb3J0cC0+dHgudGFpbCA9IChjaGFyICopIE5VTEw7CisJCXBvcnRwLT50eC5idWYgPSBOVUxMOworCQlwb3J0cC0+dHguaGVhZCA9IE5VTEw7CisJCXBvcnRwLT50eC50YWlsID0gTlVMTDsKIAl9CiAJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKIAl0dHlfbGRpc2NfZmx1c2godHR5KTsKIAogCXR0eS0+Y2xvc2luZyA9IDA7Ci0JcG9ydHAtPnR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMOworCXBvcnRwLT50dHkgPSBOVUxMOwogCiAJaWYgKHBvcnRwLT5vcGVud2FpdGNudCkgewogCQlpZiAocG9ydHAtPmNsb3NlX2RlbGF5KQpAQCAtMTE2NywyMCArOTUyLDE3IEBACiAKIHN0YXRpYyBpbnQgc3RsX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQogewotCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRwOwogCXVuc2lnbmVkIGludAlsZW4sIHN0bGVuOwogCXVuc2lnbmVkIGNoYXIJKmNoYnVmOwogCWNoYXIJCSpoZWFkLCAqdGFpbDsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfd3JpdGUodHR5PSV4LGJ1Zj0leCxjb3VudD0lZClcbiIsCi0JCShpbnQpIHR0eSwgKGludCkgYnVmLCBjb3VudCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3dyaXRlKHR0eT0lcCxidWY9JXAsY291bnQ9JWQpXG4iLCB0dHksIGJ1ZiwgY291bnQpOwogCiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAwOwotCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCisJaWYgKHBvcnRwLT50eC5idWYgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIC8qCkBAIC0xMjAxLDEwICs5ODMsMTAgQEAKIAkJc3RsZW4gPSBsZW47CiAJfQogCi0JbGVuID0gTUlOKGxlbiwgY291bnQpOworCWxlbiA9IG1pbihsZW4sICh1bnNpZ25lZCBpbnQpY291bnQpOwogCWNvdW50ID0gMDsKIAl3aGlsZSAobGVuID4gMCkgewotCQlzdGxlbiA9IE1JTihsZW4sIHN0bGVuKTsKKwkJc3RsZW4gPSBtaW4obGVuLCBzdGxlbik7CiAJCW1lbWNweShoZWFkLCBjaGJ1Ziwgc3RsZW4pOwogCQlsZW4gLT0gc3RsZW47CiAJCWNoYnVmICs9IHN0bGVuOwpAQCAtMTIyNywyMCArMTAwOSwxOCBAQAogCiBzdGF0aWMgdm9pZCBzdGxfcHV0Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQogewotCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRwOwogCXVuc2lnbmVkIGludAlsZW47CiAJY2hhcgkJKmhlYWQsICp0YWlsOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9wdXRjaGFyKHR0eT0leCxjaD0leClcbiIsIChpbnQpIHR0eSwgKGludCkgY2gpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9wdXRjaGFyKHR0eT0lcCxjaD0leClcbiIsIHR0eSwgY2gpOwogCi0JaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwotCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCisJaWYgKHBvcnRwLT50eC5idWYgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJaGVhZCA9IHBvcnRwLT50eC5oZWFkOwpAQCAtMTI2NywxOCArMTA0NywxNiBAQAogCiBzdGF0aWMgdm9pZCBzdGxfZmx1c2hjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRwOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9mbHVzaGNoYXJzKHR0eT0leClcbiIsIChpbnQpIHR0eSk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2ZsdXNoY2hhcnModHR5PSVwKVxuIiwgdHR5KTsKIAotCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJaWYgKHR0eSA9PSBOVUxMKQogCQlyZXR1cm47CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAocG9ydHAtPnR4LmJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCWlmIChwb3J0cC0+dHguYnVmID09IE5VTEwpCiAJCXJldHVybjsKIAogCXN0bF9zdGFydHJ4dHgocG9ydHAsIC0xLCAxKTsKQEAgLTEyODgsMjQgKzEwNjYsMjIgQEAKIAogc3RhdGljIGludCBzdGxfd3JpdGVyb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAJY2hhcgkJKmhlYWQsICp0YWlsOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF93cml0ZXJvb20odHR5PSV4KVxuIiwgKGludCkgdHR5KTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfd3JpdGVyb29tKHR0eT0lcClcbiIsIHR0eSk7CiAKLQlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAwOwotCWlmIChwb3J0cC0+dHguYnVmID09IChjaGFyICopIE5VTEwpCisJaWYgKHBvcnRwLT50eC5idWYgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAloZWFkID0gcG9ydHAtPnR4LmhlYWQ7CiAJdGFpbCA9IHBvcnRwLT50eC50YWlsOwotCXJldHVybiAoKGhlYWQgPj0gdGFpbCkgPyAoU1RMX1RYQlVGU0laRSAtIChoZWFkIC0gdGFpbCkgLSAxKSA6ICh0YWlsIC0gaGVhZCAtIDEpKTsKKwlyZXR1cm4gKGhlYWQgPj0gdGFpbCkgPyAoU1RMX1RYQlVGU0laRSAtIChoZWFkIC0gdGFpbCkgLSAxKSA6ICh0YWlsIC0gaGVhZCAtIDEpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzIxLDIwICsxMDk3LDE4IEBACiAKIHN0YXRpYyBpbnQgc3RsX2NoYXJzaW5idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdGxwb3J0X3QJKnBvcnRwOworCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKIAl1bnNpZ25lZCBpbnQJc2l6ZTsKIAljaGFyCQkqaGVhZCwgKnRhaWw7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX2NoYXJzaW5idWZmZXIodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfY2hhcnNpbmJ1ZmZlcih0dHk9JXApXG4iLCB0dHkpOwogCi0JaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybiAwOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQlpZiAocG9ydHAtPnR4LmJ1ZiA9PSAoY2hhciAqKSBOVUxMKQorCWlmIChwb3J0cC0+dHguYnVmID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJaGVhZCA9IHBvcnRwLT50eC5oZWFkOwpAQCAtMTM1MSwxNCArMTEyNSwxMiBAQAogICoJR2VuZXJhdGUgdGhlIHNlcmlhbCBzdHJ1Y3QgaW5mby4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9nZXRzZXJpYWwoc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKK3N0YXRpYyBpbnQgc3RsX2dldHNlcmlhbChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqc3ApCiB7CiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QJc2lvOwotCXN0bGJyZF90CQkqYnJkcDsKKwlzdHJ1Y3Qgc3RsYnJkCQkqYnJkcDsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfZ2V0c2VyaWFsKHBvcnRwPSV4LHNwPSV4KVxuIiwgKGludCkgcG9ydHAsIChpbnQpIHNwKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfZ2V0c2VyaWFsKHBvcnRwPSVwLHNwPSVwKVxuIiwgcG9ydHAsIHNwKTsKIAogCW1lbXNldCgmc2lvLCAwLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKTsKIAlzaW8ubGluZSA9IHBvcnRwLT5wb3J0bnI7CkBAIC0xMzc4LDcgKzExNTAsNyBAQAogCX0KIAogCWJyZHAgPSBzdGxfYnJkc1twb3J0cC0+YnJkbnJdOwotCWlmIChicmRwICE9IChzdGxicmRfdCAqKSBOVUxMKQorCWlmIChicmRwICE9IE5VTEwpCiAJCXNpby5pcnEgPSBicmRwLT5pcnE7CiAKIAlyZXR1cm4gY29weV90b191c2VyKHNwLCAmc2lvLCBzaXplb2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QpKSA/IC1FRkFVTFQgOiAwOwpAQCAtMTM5MiwxMyArMTE2NCwxMSBAQAogICoJanVzdCBxdWlldGx5IGlnbm9yZSBhbnkgcmVxdWVzdHMgdG8gY2hhbmdlIGlycSwgZXRjLgogICovCiAKLXN0YXRpYyBpbnQgc3RsX3NldHNlcmlhbChzdGxwb3J0X3QgKnBvcnRwLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNwKQorc3RhdGljIGludCBzdGxfc2V0c2VyaWFsKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCkKIHsKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdAlzaW87CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3NldHNlcmlhbChwb3J0cD0leCxzcD0leClcbiIsIChpbnQpIHBvcnRwLCAoaW50KSBzcCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3NldHNlcmlhbChwb3J0cD0lcCxzcD0lcClcbiIsIHBvcnRwLCBzcCk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnNpbywgc3AsIHNpemVvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE0MjQsMTIgKzExOTQsMTIgQEAKIAogc3RhdGljIGludCBzdGxfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAKLQlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKIAkJcmV0dXJuIC1FSU87CkBAIC0xNDQwLDEzICsxMjEwLDEzIEBACiBzdGF0aWMgaW50IHN0bF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKIHsKLQlzdGxwb3J0X3QJKnBvcnRwOworCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKIAlpbnQgcnRzID0gLTEsIGR0ciA9IC0xOwogCi0JaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCiAJCXJldHVybiAtRUlPOwpAQCAtMTQ2NiwyNyArMTIzNiwyNCBAQAogCiBzdGF0aWMgaW50IHN0bF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAJdW5zaWduZWQgaW50CWl2YWw7CiAJaW50CQlyYzsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfaW9jdGwodHR5PSV4LGZpbGU9JXgsY21kPSV4LGFyZz0leClcbiIsCi0JCShpbnQpIHR0eSwgKGludCkgZmlsZSwgY21kLCAoaW50KSBhcmcpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9pb2N0bCh0dHk9JXAsZmlsZT0lcCxjbWQ9JXgsYXJnPSVseClcbiIsIHR0eSwgZmlsZSwgY21kLAorCQkJYXJnKTsKIAotCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJaWYgKHR0eSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DU1NFUklBTCkgJiYKLSAJICAgIChjbWQgIT0gQ09NX0dFVFBPUlRTVEFUUykgJiYgKGNtZCAhPSBDT01fQ0xSUE9SVFNUQVRTKSkgeworIAkgICAgKGNtZCAhPSBDT01fR0VUUE9SVFNUQVRTKSAmJiAoY21kICE9IENPTV9DTFJQT1JUU1RBVFMpKQogCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCiAJCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAlyYyA9IDA7CiAKQEAgLTE1MzEsMTkgKzEyOTgsMzcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxfc2V0dGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorLyoKKyAqCVN0YXJ0IHRoZSB0cmFuc21pdHRlciBhZ2Fpbi4gSnVzdCB0dXJuIFRYIGludGVycnVwdHMgYmFjayBvbi4KKyAqLworCitzdGF0aWMgdm9pZCBzdGxfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdGxwb3J0X3QJKnBvcnRwOwotCXN0cnVjdCB0ZXJtaW9zCSp0aW9zcDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3NldHRlcm1pb3ModHR5PSV4LG9sZD0leClcbiIsIChpbnQpIHR0eSwgKGludCkgb2xkKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc3RhcnQodHR5PSVwKVxuIiwgdHR5KTsKIAotCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJaWYgKHR0eSA9PSBOVUxMKQogCQlyZXR1cm47CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJaWYgKHBvcnRwID09IE5VTEwpCisJCXJldHVybjsKKwlzdGxfc3RhcnRyeHR4KHBvcnRwLCAtMSwgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc3RsX3NldHRlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGQpCit7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRwOworCXN0cnVjdCBrdGVybWlvcwkqdGlvc3A7CisKKwlwcl9kZWJ1Zygic3RsX3NldHRlcm1pb3ModHR5PSVwLG9sZD0lcClcbiIsIHR0eSwgb2xkKTsKKworCWlmICh0dHkgPT0gTlVMTCkKKwkJcmV0dXJuOworCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJdGlvc3AgPSB0dHktPnRlcm1pb3M7CkBAIC0xNTcxLDE2ICsxMzU2LDE0IEBACiAKIHN0YXRpYyB2b2lkIHN0bF90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRwOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF90aHJvdHRsZSh0dHk9JXgpXG4iLCAoaW50KSB0dHkpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF90aHJvdHRsZSh0dHk9JXApXG4iLCB0dHkpOwogCi0JaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwogCXN0bF9mbG93Y3RybChwb3J0cCwgMCk7CiB9CkBAIC0xNTkzLDE2ICsxMzc2LDE0IEBACiAKIHN0YXRpYyB2b2lkIHN0bF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3VudGhyb3R0bGUodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfdW50aHJvdHRsZSh0dHk9JXApXG4iLCB0dHkpOwogCi0JaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwogCXN0bF9mbG93Y3RybChwb3J0cCwgMSk7CiB9CkBAIC0xNjE2LDE2ICsxMzk3LDE0IEBACiAKIHN0YXRpYyB2b2lkIHN0bF9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3N0b3AodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc3RvcCh0dHk9JXApXG4iLCB0dHkpOwogCi0JaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwogCXN0bF9zdGFydHJ4dHgocG9ydHAsIC0xLCAwKTsKIH0KQEAgLTE2MzMsMjggKzE0MTIsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICoJU3RhcnQgdGhlIHRyYW5zbWl0dGVyIGFnYWluLiBKdXN0IHR1cm4gVFggaW50ZXJydXB0cyBiYWNrIG9uLgotICovCi0KLXN0YXRpYyB2b2lkIHN0bF9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0bHBvcnRfdAkqcG9ydHA7Ci0KLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3N0YXJ0KHR0eT0leClcbiIsIChpbnQpIHR0eSk7Ci0jZW5kaWYKLQotCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCi0JCXJldHVybjsKLQlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKLQkJcmV0dXJuOwotCXN0bF9zdGFydHJ4dHgocG9ydHAsIC0xLCAxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgogICoJSGFuZ3VwIHRoaXMgcG9ydC4gVGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGNsb3NpbmcgdGhlIHBvcnQsIG9ubHkKICAqCWEgbGl0dGxlIG1vcmUgYnJ1dGFsLiBObyB3YWl0aW5nIGZvciBkYXRhIHRvIGRyYWluLiBTaHV0ZG93biB0aGUKICAqCXBvcnQgYW5kIG1heWJlIGRyb3Agc2lnbmFscy4KQEAgLTE2NjIsMTYgKzE0MTksMTQgQEAKIAogc3RhdGljIHZvaWQgc3RsX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRwOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9oYW5ndXAodHR5PSV4KVxuIiwgKGludCkgdHR5KTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfaGFuZ3VwKHR0eT0lcClcbiIsIHR0eSk7CiAKLQlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCXBvcnRwID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlwb3J0cC0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOwpAQCAtMTY4MiwxMyArMTQzNywxMyBAQAogCXN0bF9mbHVzaGJ1ZmZlcih0dHkpOwogCXBvcnRwLT5pc3RhdGUgPSAwOwogCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7Ci0JaWYgKHBvcnRwLT50eC5idWYgIT0gKGNoYXIgKikgTlVMTCkgeworCWlmIChwb3J0cC0+dHguYnVmICE9IE5VTEwpIHsKIAkJa2ZyZWUocG9ydHAtPnR4LmJ1Zik7Ci0JCXBvcnRwLT50eC5idWYgPSAoY2hhciAqKSBOVUxMOwotCQlwb3J0cC0+dHguaGVhZCA9IChjaGFyICopIE5VTEw7Ci0JCXBvcnRwLT50eC50YWlsID0gKGNoYXIgKikgTlVMTDsKKwkJcG9ydHAtPnR4LmJ1ZiA9IE5VTEw7CisJCXBvcnRwLT50eC5oZWFkID0gTlVMTDsKKwkJcG9ydHAtPnR4LnRhaWwgPSBOVUxMOwogCX0KLQlwb3J0cC0+dHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEw7CisJcG9ydHAtPnR0eSA9IE5VTEw7CiAJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwogCXBvcnRwLT5yZWZjb3VudCA9IDA7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKQEAgLTE2OTYsMzggKzE0NTEsMTYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxfZmx1c2hidWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdGxwb3J0X3QJKnBvcnRwOwotCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9mbHVzaGJ1ZmZlcih0dHk9JXgpXG4iLCAoaW50KSB0dHkpOwotI2VuZGlmCi0KLQlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQotCQlyZXR1cm47Ci0JcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCi0JCXJldHVybjsKLQotCXN0bF9mbHVzaChwb3J0cCk7Ci0JdHR5X3dha2V1cCh0dHkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIHN0YXRpYyB2b2lkIHN0bF9icmVha2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgc3RhdGUpCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX2JyZWFrY3RsKHR0eT0leCxzdGF0ZT0lZClcbiIsIChpbnQpIHR0eSwgc3RhdGUpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9icmVha2N0bCh0dHk9JXAsc3RhdGU9JWQpXG4iLCB0dHksIHN0YXRlKTsKIAotCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJaWYgKHR0eSA9PSBOVUxMKQogCQlyZXR1cm47CiAJcG9ydHAgPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKIAogCXN0bF9zZW5kYnJlYWsocG9ydHAsICgoc3RhdGUgPT0gLTEpID8gMSA6IDIpKTsKQEAgLTE3MzUsNDggKzE0NjgsMTYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxfd2FpdHVudGlsc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKLXsKLQlzdGxwb3J0X3QJKnBvcnRwOwotCXVuc2lnbmVkIGxvbmcJdGVuZDsKLQotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfd2FpdHVudGlsc2VudCh0dHk9JXgsdGltZW91dD0lZClcbiIsIChpbnQpIHR0eSwgdGltZW91dCk7Ci0jZW5kaWYKLQotCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCi0JCXJldHVybjsKLQlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKHRpbWVvdXQgPT0gMCkKLQkJdGltZW91dCA9IEhaOwotCXRlbmQgPSBqaWZmaWVzICsgdGltZW91dDsKLQotCXdoaWxlIChzdGxfZGF0YXN0YXRlKHBvcnRwKSkgewotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUoMjApOwotCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0ZW5kKSkKLQkJCWJyZWFrOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBzdGF0aWMgdm9pZCBzdGxfc2VuZHhjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3NlbmR4Y2hhcih0dHk9JXgsY2g9JXgpXG4iLCAoaW50KSB0dHksIGNoKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc2VuZHhjaGFyKHR0eT0lcCxjaD0leClcbiIsIHR0eSwgY2gpOwogCi0JaWYgKHR0eSA9PSAoc3RydWN0IHR0eV9zdHJ1Y3QgKikgTlVMTCkKKwlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybjsKIAlwb3J0cCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJaWYgKGNoID09IFNUT1BfQ0hBUih0dHkpKQpAQCAtMTc5Nyw3ICsxNDk4LDcgQEAKICAqCXNob3J0IHRoZW4gcGFkZGVkIHdpdGggc3BhY2VzKS4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9wb3J0aW5mbyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcG9ydG5yLCBjaGFyICpwb3MpCitzdGF0aWMgaW50IHN0bF9wb3J0aW5mbyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCBwb3J0bnIsIGNoYXIgKnBvcykKIHsKIAljaGFyCSpzcDsKIAlpbnQJc2lncywgY250OwpAQCAtMTgyNiw3ICsxNTI3LDcgQEAKIAkqc3AgPSAnICc7CiAJc3AgKz0gY250OwogCi0JZm9yIChjbnQgPSAoc3AgLSBwb3MpOyAoY250IDwgKE1BWExJTkUgLSAxKSk7IGNudCsrKQorCWZvciAoY250ID0gc3AgLSBwb3M7IGNudCA8IChNQVhMSU5FIC0gMSk7IGNudCsrKQogCQkqc3ArKyA9ICcgJzsKIAlpZiAoY250ID49IE1BWExJTkUpCiAJCXBvc1soTUFYTElORSAtIDIpXSA9ICcrJzsKQEAgLTE4NDMsMTggKzE1NDQsMTUgQEAKIAogc3RhdGljIGludCBzdGxfcmVhZHByb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RsYnJkX3QJKmJyZHA7Ci0Jc3RscGFuZWxfdAkqcGFuZWxwOwotCXN0bHBvcnRfdAkqcG9ydHA7Ci0JaW50CQlicmRuciwgcGFuZWxuciwgcG9ydG5yLCB0b3RhbHBvcnQ7Ci0JaW50CQljdXJvZmYsIG1heG9mZjsKKwlzdHJ1Y3Qgc3RsYnJkCSpicmRwOworCXN0cnVjdCBzdGxwYW5lbAkqcGFuZWxwOworCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKKwl1bnNpZ25lZCBpbnQJYnJkbnIsIHBhbmVsbnIsIHBvcnRucjsKKwlpbnQJCXRvdGFscG9ydCwgY3Vyb2ZmLCBtYXhvZmY7CiAJY2hhcgkJKnBvczsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfcmVhZHByb2MocGFnZT0leCxzdGFydD0leCxvZmY9JXgsY291bnQ9JWQsZW9mPSV4LCIKLQkJImRhdGE9JXhcbiIsIChpbnQpIHBhZ2UsIChpbnQpIHN0YXJ0LCAoaW50KSBvZmYsIGNvdW50LAotCQkoaW50KSBlb2YsIChpbnQpIGRhdGEpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9yZWFkcHJvYyhwYWdlPSVwLHN0YXJ0PSVwLG9mZj0lbHgsY291bnQ9JWQsZW9mPSVwLCIKKwkJImRhdGE9JXBcbiIsIHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGRhdGEpOwogCiAJcG9zID0gcGFnZTsKIAl0b3RhbHBvcnQgPSAwOwpAQCAtMTg3Myw5ICsxNTcxLDkgQEAKICAqCVdlIHNjYW4gdGhyb3VnaCBmb3IgZWFjaCBib2FyZCwgcGFuZWwgYW5kIHBvcnQuIFRoZSBvZmZzZXQgaXMKICAqCWNhbGN1bGF0ZWQgb24gdGhlIGZseSwgYW5kIGlycmVsZXZhbnQgcG9ydHMgYXJlIHNraXBwZWQuCiAgKi8KLQlmb3IgKGJyZG5yID0gMDsgKGJyZG5yIDwgc3RsX25yYnJkcyk7IGJyZG5yKyspIHsKKwlmb3IgKGJyZG5yID0gMDsgYnJkbnIgPCBzdGxfbnJicmRzOyBicmRucisrKSB7CiAJCWJyZHAgPSBzdGxfYnJkc1ticmRucl07Ci0JCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCQlpZiAoYnJkcCA9PSBOVUxMKQogCQkJY29udGludWU7CiAJCWlmIChicmRwLT5zdGF0ZSA9PSAwKQogCQkJY29udGludWU7CkBAIC0xODg3LDkgKzE1ODUsOSBAQAogCQl9CiAKIAkJdG90YWxwb3J0ID0gYnJkbnIgKiBTVExfTUFYUE9SVFM7Ci0JCWZvciAocGFuZWxuciA9IDA7IChwYW5lbG5yIDwgYnJkcC0+bnJwYW5lbHMpOyBwYW5lbG5yKyspIHsKKwkJZm9yIChwYW5lbG5yID0gMDsgcGFuZWxuciA8IGJyZHAtPm5ycGFuZWxzOyBwYW5lbG5yKyspIHsKIAkJCXBhbmVscCA9IGJyZHAtPnBhbmVsc1twYW5lbG5yXTsKLQkJCWlmIChwYW5lbHAgPT0gKHN0bHBhbmVsX3QgKikgTlVMTCkKKwkJCWlmIChwYW5lbHAgPT0gTlVMTCkKIAkJCQljb250aW51ZTsKIAogCQkJbWF4b2ZmID0gY3Vyb2ZmICsgKHBhbmVscC0+bnJwb3J0cyAqIE1BWExJTkUpOwpAQCAtMTg5OSwxMCArMTU5NywxMCBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlmb3IgKHBvcnRuciA9IDA7IChwb3J0bnIgPCBwYW5lbHAtPm5ycG9ydHMpOyBwb3J0bnIrKywKKwkJCWZvciAocG9ydG5yID0gMDsgcG9ydG5yIDwgcGFuZWxwLT5ucnBvcnRzOyBwb3J0bnIrKywKIAkJCSAgICB0b3RhbHBvcnQrKykgewogCQkJCXBvcnRwID0gcGFuZWxwLT5wb3J0c1twb3J0bnJdOwotCQkJCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJCQkJaWYgKHBvcnRwID09IE5VTEwpCiAJCQkJCWNvbnRpbnVlOwogCQkJCWlmIChvZmYgPj0gKGN1cm9mZiArPSBNQVhMSU5FKSkKIAkJCQkJY29udGludWU7CkBAIC0xOTE3LDcgKzE2MTUsNyBAQAogCiBzdGxfcmVhZGRvbmU6CiAJKnN0YXJ0ID0gcGFnZTsKLQlyZXR1cm4gKHBvcyAtIHBhZ2UpOworCXJldHVybiBwb3MgLSBwYWdlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xOTI5LDExICsxNjI3LDkgQEAKIAogc3RhdGljIGlycXJldHVybl90IHN0bF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdGxicmRfdAkqYnJkcCA9IChzdGxicmRfdCAqKSBkZXZfaWQ7CisJc3RydWN0IHN0bGJyZCAqYnJkcCA9IGRldl9pZDsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfaW50cihicmRwPSV4LGlycT0lZClcbiIsIChpbnQpIGJyZHAsIGlycSk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2ludHIoYnJkcD0lcCxpcnE9JWQpXG4iLCBicmRwLCBpcnEpOwogCiAJcmV0dXJuIElSUV9SRVRWQUwoKCogYnJkcC0+aXNyKShicmRwKSk7CiB9CkBAIC0xOTQ0LDkgKzE2NDAsOSBAQAogICoJSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgRWFzeUlPIGJvYXJkIHR5cGVzLgogICovCiAKLXN0YXRpYyBpbnQgc3RsX2Vpb2ludHIoc3RsYnJkX3QgKmJyZHApCitzdGF0aWMgaW50IHN0bF9laW9pbnRyKHN0cnVjdCBzdGxicmQgKmJyZHApCiB7Ci0Jc3RscGFuZWxfdAkqcGFuZWxwOworCXN0cnVjdCBzdGxwYW5lbAkqcGFuZWxwOwogCXVuc2lnbmVkIGludAlpb2Jhc2U7CiAJaW50CQloYW5kbGVkID0gMDsKIApAQCAtMTk2NywxOCArMTY2MywxNyBAQAogICoJSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgRUNILUFUIGJvYXJkIHR5cGVzLgogICovCiAKLXN0YXRpYyBpbnQgc3RsX2VjaGF0aW50cihzdGxicmRfdCAqYnJkcCkKK3N0YXRpYyBpbnQgc3RsX2VjaGF0aW50cihzdHJ1Y3Qgc3RsYnJkICpicmRwKQogewotCXN0bHBhbmVsX3QJKnBhbmVscDsKLQl1bnNpZ25lZCBpbnQJaW9hZGRyOwotCWludAkJYm5rbnI7CisJc3RydWN0IHN0bHBhbmVsCSpwYW5lbHA7CisJdW5zaWduZWQgaW50CWlvYWRkciwgYm5rbnI7CiAJaW50CQloYW5kbGVkID0gMDsKIAogCW91dGIoKGJyZHAtPmlvY3RybHZhbCB8IEVDSF9CUkRFTkFCTEUpLCBicmRwLT5pb2N0cmwpOwogCiAJd2hpbGUgKGluYihicmRwLT5pb3N0YXR1cykgJiBFQ0hfSU5UUlBFTkQpIHsKIAkJaGFuZGxlZCA9IDE7Ci0JCWZvciAoYm5rbnIgPSAwOyAoYm5rbnIgPCBicmRwLT5ucmJua3MpOyBibmtucisrKSB7CisJCWZvciAoYm5rbnIgPSAwOyBibmtuciA8IGJyZHAtPm5yYm5rczsgYm5rbnIrKykgewogCQkJaW9hZGRyID0gYnJkcC0+Ym5rc3RhdGFkZHJbYm5rbnJdOwogCQkJaWYgKGluYihpb2FkZHIpICYgRUNIX1BOTElOVFJQRU5EKSB7CiAJCQkJcGFuZWxwID0gYnJkcC0+Ym5rMnBhbmVsW2Jua25yXTsKQEAgLTE5OTgsMTYgKzE2OTMsMTUgQEAKICAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIEVDSC1NQ0EgYm9hcmQgdHlwZXMuCiAgKi8KIAotc3RhdGljIGludCBzdGxfZWNobWNhaW50cihzdGxicmRfdCAqYnJkcCkKK3N0YXRpYyBpbnQgc3RsX2VjaG1jYWludHIoc3RydWN0IHN0bGJyZCAqYnJkcCkKIHsKLQlzdGxwYW5lbF90CSpwYW5lbHA7Ci0JdW5zaWduZWQgaW50CWlvYWRkcjsKLQlpbnQJCWJua25yOworCXN0cnVjdCBzdGxwYW5lbAkqcGFuZWxwOworCXVuc2lnbmVkIGludAlpb2FkZHIsIGJua25yOwogCWludAkJaGFuZGxlZCA9IDA7CiAKIAl3aGlsZSAoaW5iKGJyZHAtPmlvc3RhdHVzKSAmIEVDSF9JTlRSUEVORCkgewogCQloYW5kbGVkID0gMTsKLQkJZm9yIChibmtuciA9IDA7IChibmtuciA8IGJyZHAtPm5yYm5rcyk7IGJua25yKyspIHsKKwkJZm9yIChibmtuciA9IDA7IGJua25yIDwgYnJkcC0+bnJibmtzOyBibmtucisrKSB7CiAJCQlpb2FkZHIgPSBicmRwLT5ibmtzdGF0YWRkcltibmtucl07CiAJCQlpZiAoaW5iKGlvYWRkcikgJiBFQ0hfUE5MSU5UUlBFTkQpIHsKIAkJCQlwYW5lbHAgPSBicmRwLT5ibmsycGFuZWxbYm5rbnJdOwpAQCAtMjAyNCwxNiArMTcxOCwxNSBAQAogICoJSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgRUNILVBDSSBib2FyZCB0eXBlcy4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9lY2hwY2lpbnRyKHN0bGJyZF90ICpicmRwKQorc3RhdGljIGludCBzdGxfZWNocGNpaW50cihzdHJ1Y3Qgc3RsYnJkICpicmRwKQogewotCXN0bHBhbmVsX3QJKnBhbmVscDsKLQl1bnNpZ25lZCBpbnQJaW9hZGRyOwotCWludAkJYm5rbnIsIHJlY2hlY2s7CisJc3RydWN0IHN0bHBhbmVsCSpwYW5lbHA7CisJdW5zaWduZWQgaW50CWlvYWRkciwgYm5rbnIsIHJlY2hlY2s7CiAJaW50CQloYW5kbGVkID0gMDsKIAogCXdoaWxlICgxKSB7CiAJCXJlY2hlY2sgPSAwOwotCQlmb3IgKGJua25yID0gMDsgKGJua25yIDwgYnJkcC0+bnJibmtzKTsgYm5rbnIrKykgeworCQlmb3IgKGJua25yID0gMDsgYm5rbnIgPCBicmRwLT5ucmJua3M7IGJua25yKyspIHsKIAkJCW91dGIoYnJkcC0+Ym5rcGFnZWFkZHJbYm5rbnJdLCBicmRwLT5pb2N0cmwpOwogCQkJaW9hZGRyID0gYnJkcC0+Ym5rc3RhdGFkZHJbYm5rbnJdOwogCQkJaWYgKGluYihpb2FkZHIpICYgRUNIX1BOTElOVFJQRU5EKSB7CkBAIC0yMDU1LDE2ICsxNzQ4LDE1IEBACiAgKglJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBFQ0gtOC82NC1QQ0kgYm9hcmQgdHlwZXMuCiAgKi8KIAotc3RhdGljIGludCBzdGxfZWNocGNpNjRpbnRyKHN0bGJyZF90ICpicmRwKQorc3RhdGljIGludCBzdGxfZWNocGNpNjRpbnRyKHN0cnVjdCBzdGxicmQgKmJyZHApCiB7Ci0Jc3RscGFuZWxfdAkqcGFuZWxwOwotCXVuc2lnbmVkIGludAlpb2FkZHI7Ci0JaW50CQlibmtucjsKKwlzdHJ1Y3Qgc3RscGFuZWwJKnBhbmVscDsKKwl1bnNpZ25lZCBpbnQJaW9hZGRyLCBibmtucjsKIAlpbnQJCWhhbmRsZWQgPSAwOwogCiAJd2hpbGUgKGluYihicmRwLT5pb2N0cmwpICYgMHgxKSB7CiAJCWhhbmRsZWQgPSAxOwotCQlmb3IgKGJua25yID0gMDsgKGJua25yIDwgYnJkcC0+bnJibmtzKTsgYm5rbnIrKykgeworCQlmb3IgKGJua25yID0gMDsgYm5rbnIgPCBicmRwLT5ucmJua3M7IGJua25yKyspIHsKIAkJCWlvYWRkciA9IGJyZHAtPmJua3N0YXRhZGRyW2Jua25yXTsKIAkJCWlmIChpbmIoaW9hZGRyKSAmIEVDSF9QTkxJTlRSUEVORCkgewogCQkJCXBhbmVscCA9IGJyZHAtPmJuazJwYW5lbFtibmtucl07CkBAIC0yMDgxLDM5ICsxNzczLDM0IEBACiAvKgogICoJU2VydmljZSBhbiBvZmYtbGV2ZWwgcmVxdWVzdCBmb3Igc29tZSBjaGFubmVsLgogICovCi1zdGF0aWMgdm9pZCBzdGxfb2ZmaW50cih2b2lkICpwcml2YXRlKQorc3RhdGljIHZvaWQgc3RsX29mZmludHIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0bHBvcnRfdAkJKnBvcnRwOworCXN0cnVjdCBzdGxwb3J0CQkqcG9ydHAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHN0bHBvcnQsIHRxdWV1ZSk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAl1bnNpZ25lZCBpbnQJCW9sZHNpZ3M7CiAKLQlwb3J0cCA9IHByaXZhdGU7CisJcHJfZGVidWcoInN0bF9vZmZpbnRyKHBvcnRwPSVwKVxuIiwgcG9ydHApOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9vZmZpbnRyKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOwotI2VuZGlmCi0KLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAl0dHkgPSBwb3J0cC0+dHR5OwotCWlmICh0dHkgPT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpCisJaWYgKHR0eSA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlsb2NrX2tlcm5lbCgpOwotCWlmICh0ZXN0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSkpIHsKKwlpZiAodGVzdF9iaXQoQVNZSV9UWExPVywgJnBvcnRwLT5pc3RhdGUpKQogCQl0dHlfd2FrZXVwKHR0eSk7Ci0JfQorCiAJaWYgKHRlc3RfYml0KEFTWUlfRENEQ0hBTkdFLCAmcG9ydHAtPmlzdGF0ZSkpIHsKIAkJY2xlYXJfYml0KEFTWUlfRENEQ0hBTkdFLCAmcG9ydHAtPmlzdGF0ZSk7CiAJCW9sZHNpZ3MgPSBwb3J0cC0+c2lnczsKIAkJcG9ydHAtPnNpZ3MgPSBzdGxfZ2V0c2lnbmFscyhwb3J0cCk7CiAJCWlmICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgJiYgKChvbGRzaWdzICYgVElPQ01fQ0QpID09IDApKQogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKLQkJaWYgKChvbGRzaWdzICYgVElPQ01fQ0QpICYmICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpIHsKKwkJaWYgKChvbGRzaWdzICYgVElPQ01fQ0QpICYmICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpCiAJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpCiAJCQkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBoZXJlIC0gQUtQTSAqLwotCQl9CiAJfQogCXVubG9ja19rZXJuZWwoKTsKIH0KQEAgLTIxMjQsMTQgKzE4MTEsMTMgQEAKICAqCUluaXRpYWxpemUgYWxsIHRoZSBwb3J0cyBvbiBhIHBhbmVsLgogICovCiAKLXN0YXRpYyBpbnQgX19pbml0IHN0bF9pbml0cG9ydHMoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN0bF9pbml0cG9ydHMoc3RydWN0IHN0bGJyZCAqYnJkcCwgc3RydWN0IHN0bHBhbmVsICpwYW5lbHApCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKLQlpbnQJCWNoaXBtYXNrLCBpOworCXN0cnVjdCBzdGxwb3J0ICpwb3J0cDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgY2hpcG1hc2s7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX2luaXRwb3J0cyhicmRwPSV4LHBhbmVscD0leClcbiIsIChpbnQpIGJyZHAsIChpbnQpIHBhbmVscCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2luaXRwb3J0cyhicmRwPSVwLHBhbmVscD0lcClcbiIsIGJyZHAsIHBhbmVscCk7CiAKIAljaGlwbWFzayA9IHN0bF9wYW5lbGluaXQoYnJkcCwgcGFuZWxwKTsKIApAQCAtMjEzOSwxMSArMTgyNSwxMSBAQAogICoJQWxsIFVBUlQncyBhcmUgaW5pdGlhbGl6ZWQgKGlmIGZvdW5kISkuIE5vdyBnbyB0aHJvdWdoIGFuZCBzZXR1cAogICoJZWFjaCBwb3J0cyBkYXRhIHN0cnVjdHVyZXMuCiAgKi8KLQlmb3IgKGkgPSAwOyAoaSA8IHBhbmVscC0+bnJwb3J0cyk7IGkrKykgewotCQlwb3J0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0bHBvcnRfdCksIEdGUF9LRVJORUwpOworCWZvciAoaSA9IDA7IGkgPCBwYW5lbHAtPm5ycG9ydHM7IGkrKykgeworCQlwb3J0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGxwb3J0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcG9ydHApIHsKIAkJCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgIgotCQkJCSIoc2l6ZT0lWmQpXG4iLCBzaXplb2Yoc3RscG9ydF90KSk7CisJCQkJIihzaXplPSVaZClcbiIsIHNpemVvZihzdHJ1Y3Qgc3RscG9ydCkpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjE1Niw3ICsxODQyLDcgQEAKIAkJcG9ydHAtPmJhdWRfYmFzZSA9IFNUTF9CQVVEQkFTRTsKIAkJcG9ydHAtPmNsb3NlX2RlbGF5ID0gU1RMX0NMT1NFREVMQVk7CiAJCXBvcnRwLT5jbG9zaW5nX3dhaXQgPSAzMCAqIEhaOwotCQlJTklUX1dPUksoJnBvcnRwLT50cXVldWUsIHN0bF9vZmZpbnRyLCBwb3J0cCk7CisJCUlOSVRfV09SSygmcG9ydHAtPnRxdWV1ZSwgc3RsX29mZmludHIpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0cC0+b3Blbl93YWl0KTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPmNsb3NlX3dhaXQpOwogCQlwb3J0cC0+c3RhdHMuYnJkID0gcG9ydHAtPmJyZG5yOwpAQCAtMjE2Niw3ICsxODUyLDMwIEBACiAJCXN0bF9wb3J0aW5pdChicmRwLCBwYW5lbHAsIHBvcnRwKTsKIAl9CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0bF9jbGVhbnVwX3BhbmVscyhzdHJ1Y3Qgc3RsYnJkICpicmRwKQoreworCXN0cnVjdCBzdGxwYW5lbCAqcGFuZWxwOworCXN0cnVjdCBzdGxwb3J0ICpwb3J0cDsKKwl1bnNpZ25lZCBpbnQgaiwgazsKKworCWZvciAoaiA9IDA7IGogPCBTVExfTUFYUEFORUxTOyBqKyspIHsKKwkJcGFuZWxwID0gYnJkcC0+cGFuZWxzW2pdOworCQlpZiAocGFuZWxwID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZm9yIChrID0gMDsgayA8IFNUTF9QT1JUU1BFUlBBTkVMOyBrKyspIHsKKwkJCXBvcnRwID0gcGFuZWxwLT5wb3J0c1trXTsKKwkJCWlmIChwb3J0cCA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBvcnRwLT50dHkgIT0gTlVMTCkKKwkJCQlzdGxfaGFuZ3VwKHBvcnRwLT50dHkpOworCQkJa2ZyZWUocG9ydHAtPnR4LmJ1Zik7CisJCQlrZnJlZShwb3J0cCk7CisJCX0KKwkJa2ZyZWUocGFuZWxwKTsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxNzUsMTYgKzE4ODQsMTQgQEAKICAqCVRyeSB0byBmaW5kIGFuZCBpbml0aWFsaXplIGFuIEVhc3lJTyBib2FyZC4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBzdGxfaW5pdGVpbyhzdGxicmRfdCAqYnJkcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN0bF9pbml0ZWlvKHN0cnVjdCBzdGxicmQgKmJyZHApCiB7Ci0Jc3RscGFuZWxfdAkqcGFuZWxwOworCXN0cnVjdCBzdGxwYW5lbAkqcGFuZWxwOwogCXVuc2lnbmVkIGludAlzdGF0dXM7CiAJY2hhcgkJKm5hbWU7Ci0JaW50CQlyYzsKKwlpbnQJCXJldHZhbDsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfaW5pdGVpbyhicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2luaXRlaW8oYnJkcD0lcClcbiIsIGJyZHApOwogCiAJYnJkcC0+aW9jdHJsID0gYnJkcC0+aW9hZGRyMSArIDE7CiAJYnJkcC0+aW9zdGF0dXMgPSBicmRwLT5pb2FkZHIxICsgMjsKQEAgLTIyMDksMTggKzE5MTYsMjAgQEAKIAkJICAgIChzdGxfdmVjbWFwW2JyZHAtPmlycV0gPT0gKHVuc2lnbmVkIGNoYXIpIDB4ZmYpKSB7CiAJCQlwcmludGsoIlNUQUxMSU9OOiBpbnZhbGlkIGlycT0lZCBmb3IgYnJkPSVkXG4iLAogCQkJCWJyZHAtPmlycSwgYnJkcC0+YnJkbnIpOwotCQkJcmV0dXJuKC1FSU5WQUwpOworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOwogCQl9CiAJCW91dGIoKHN0bF92ZWNtYXBbYnJkcC0+aXJxXSB8IEVJT18wV1MgfAogCQkJKChicmRwLT5pcnF0eXBlKSA/IEVJT19JTlRMRVZFTCA6IEVJT19JTlRFREdFKSksCiAJCQlicmRwLT5pb2N0cmwpOwogCX0KIAorCXJldHZhbCA9IC1FQlVTWTsKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZHAtPmlvYWRkcjEsIGJyZHAtPmlvc2l6ZTEsIG5hbWUpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNUQUxMSU9OOiBXYXJuaW5nLCBib2FyZCAlZCBJL08gYWRkcmVzcyAiCiAJCQkiJXggY29uZmxpY3RzIHdpdGggYW5vdGhlciBkZXZpY2VcbiIsIGJyZHAtPmJyZG5yLCAKIAkJCWJyZHAtPmlvYWRkcjEpOwotCQlyZXR1cm4oLUVCVVNZKTsKKwkJZ290byBlcnI7CiAJfQogCQogCWlmIChicmRwLT5pb3NpemUyID4gMCkKQEAgLTIyMzEsOCArMTk0MCw3IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTVEFMTElPTjogV2FybmluZywgYWxzbyAiCiAJCQkJInJlbGVhc2luZyBib2FyZCAlZCBJL08gYWRkcmVzcyAleCBcbiIsIAogCQkJCWJyZHAtPmJyZG5yLCBicmRwLT5pb2FkZHIxKTsKLQkJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYWRkcjEsIGJyZHAtPmlvc2l6ZTEpOwotICAgICAgICAJCXJldHVybigtRUJVU1kpOworCQkJZ290byBlcnJfcmVsMTsKIAkJfQogCiAvKgpAQCAtMjI0MSw2ICsxOTQ5LDcgQEAKIAlicmRwLT5jbGsgPSBDRDE0MDBfQ0xLOwogCWJyZHAtPmlzciA9IHN0bF9laW9pbnRyOwogCisJcmV0dmFsID0gLUVOT0RFVjsKIAlzd2l0Y2ggKHN0YXR1cyAmIEVJT19JREJJVE1BU0spIHsKIAljYXNlIEVJT184UE9SVE06CiAJCWJyZHAtPmNsayA9IENEMTQwMF9DTEs4TTsKQEAgLTIyNjQsMTEgKzE5NzMsMTEgQEAKIAkJCWJyZHAtPm5ycG9ydHMgPSAxNjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcmV0dXJuKC1FTk9ERVYpOworCQkJZ290byBlcnJfcmVsMjsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm4oLUVOT0RFVik7CisJCWdvdG8gZXJyX3JlbDI7CiAJfQogCiAvKgpAQCAtMjI3NiwxMSArMTk4NSwxMiBAQAogICoJY2FuIGNvbXBsZXRlIHRoZSBzZXR1cC4KICAqLwogCi0JcGFuZWxwID0ga3phbGxvYyhzaXplb2Yoc3RscGFuZWxfdCksIEdGUF9LRVJORUwpOworCXBhbmVscCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGxwYW5lbCksIEdGUF9LRVJORUwpOwogCWlmICghcGFuZWxwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKLQkJCSIoc2l6ZT0lWmQpXG4iLCBzaXplb2Yoc3RscGFuZWxfdCkpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJCSIoc2l6ZT0lWmQpXG4iLCBzaXplb2Yoc3RydWN0IHN0bHBhbmVsKSk7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbDI7CiAJfQogCiAJcGFuZWxwLT5tYWdpYyA9IFNUTF9QQU5FTE1BR0lDOwpAQCAtMjI5MCwxMCArMjAwMCwxMCBAQAogCXBhbmVscC0+aW9iYXNlID0gYnJkcC0+aW9hZGRyMTsKIAlwYW5lbHAtPmh3aWQgPSBzdGF0dXM7CiAJaWYgKChzdGF0dXMgJiBFSU9fSURCSVRNQVNLKSA9PSBFSU9fTUszKSB7Ci0JCXBhbmVscC0+dWFydHAgPSAodm9pZCAqKSAmc3RsX3NjMjYxOTh1YXJ0OworCQlwYW5lbHAtPnVhcnRwID0gJnN0bF9zYzI2MTk4dWFydDsKIAkJcGFuZWxwLT5pc3IgPSBzdGxfc2MyNjE5OGludHI7CiAJfSBlbHNlIHsKLQkJcGFuZWxwLT51YXJ0cCA9ICh2b2lkICopICZzdGxfY2QxNDAwdWFydDsKKwkJcGFuZWxwLT51YXJ0cCA9ICZzdGxfY2QxNDAwdWFydDsKIAkJcGFuZWxwLT5pc3IgPSBzdGxfY2QxNDAwZWlvaW50cjsKIAl9CiAKQEAgLTIzMDQsMTEgKzIwMTQsMjAgQEAKIAlpZiAocmVxdWVzdF9pcnEoYnJkcC0+aXJxLCBzdGxfaW50ciwgSVJRRl9TSEFSRUQsIG5hbWUsIGJyZHApICE9IDApIHsKIAkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHJlZ2lzdGVyIGludGVycnVwdCAiCiAJCSAgICAicm91dGluZSBmb3IgJXMgaXJxPSVkXG4iLCBuYW1lLCBicmRwLT5pcnEpOwotCQlyYyA9IC1FTk9ERVY7Ci0JfSBlbHNlIHsKLQkJcmMgPSAwOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcjsKIAl9Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CitlcnJfZnI6CisJc3RsX2NsZWFudXBfcGFuZWxzKGJyZHApOworZXJyX3JlbDI6CisJaWYgKGJyZHAtPmlvc2l6ZTIgPiAwKQorCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2FkZHIyLCBicmRwLT5pb3NpemUyKTsKK2Vycl9yZWwxOgorCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYWRkcjEsIGJyZHAtPmlvc2l6ZTEpOworZXJyOgorCXJldHVybiByZXR2YWw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzMTgsMTYgKzIwMzcsMTQgQEAKICAqCWRlYWxpbmcgd2l0aCBhbGwgdHlwZXMgb2YgRUNIIGJvYXJkLgogICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHN0bF9pbml0ZWNoKHN0bGJyZF90ICpicmRwKQorc3RhdGljIGludCBfX2RldmluaXQgc3RsX2luaXRlY2goc3RydWN0IHN0bGJyZCAqYnJkcCkKIHsKLQlzdGxwYW5lbF90CSpwYW5lbHA7Ci0JdW5zaWduZWQgaW50CXN0YXR1cywgbnh0aWQsIGlvYWRkciwgY29uZmxpY3Q7Ci0JaW50CQlwYW5lbG5yLCBiYW5rbnIsIGk7CisJc3RydWN0IHN0bHBhbmVsCSpwYW5lbHA7CisJdW5zaWduZWQgaW50CXN0YXR1cywgbnh0aWQsIGlvYWRkciwgY29uZmxpY3QsIHBhbmVsbnIsIGJhbmtuciwgaTsKKwlpbnQJCXJldHZhbDsKIAljaGFyCQkqbmFtZTsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfaW5pdGVjaChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2luaXRlY2goYnJkcD0lcClcbiIsIGJyZHApOwogCiAJc3RhdHVzID0gMDsKIAljb25mbGljdCA9IDA7CkBAIC0yMzQ0LDIwICsyMDYxLDIzIEBACiAJCWJyZHAtPmlvY3RybCA9IGJyZHAtPmlvYWRkcjEgKyAxOwogCQlicmRwLT5pb3N0YXR1cyA9IGJyZHAtPmlvYWRkcjEgKyAxOwogCQlzdGF0dXMgPSBpbmIoYnJkcC0+aW9zdGF0dXMpOwotCQlpZiAoKHN0YXR1cyAmIEVDSF9JREJJVE1BU0spICE9IEVDSF9JRCkKLQkJCXJldHVybigtRU5PREVWKTsKKwkJaWYgKChzdGF0dXMgJiBFQ0hfSURCSVRNQVNLKSAhPSBFQ0hfSUQpIHsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQogCQlpZiAoKGJyZHAtPmlycSA8IDApIHx8IChicmRwLT5pcnEgPiAxNSkgfHwKIAkJICAgIChzdGxfdmVjbWFwW2JyZHAtPmlycV0gPT0gKHVuc2lnbmVkIGNoYXIpIDB4ZmYpKSB7CiAJCQlwcmludGsoIlNUQUxMSU9OOiBpbnZhbGlkIGlycT0lZCBmb3IgYnJkPSVkXG4iLAogCQkJCWJyZHAtPmlycSwgYnJkcC0+YnJkbnIpOwotCQkJcmV0dXJuKC1FSU5WQUwpOworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOwogCQl9CiAJCXN0YXR1cyA9ICgoYnJkcC0+aW9hZGRyMiAmIEVDSF9BRERSMk1BU0spID4+IDEpOwogCQlzdGF0dXMgfD0gKHN0bF92ZWNtYXBbYnJkcC0+aXJxXSA8PCAxKTsKIAkJb3V0Yigoc3RhdHVzIHwgRUNIX0JSRFJFU0VUKSwgYnJkcC0+aW9hZGRyMSk7CiAJCWJyZHAtPmlvY3RybHZhbCA9IEVDSF9JTlRFTkFCTEUgfAogCQkJKChicmRwLT5pcnF0eXBlKSA/IEVDSF9JTlRMRVZFTCA6IEVDSF9JTlRFREdFKTsKLQkJZm9yIChpID0gMDsgKGkgPCAxMCk7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCiAJCQlvdXRiKChicmRwLT5pb2N0cmx2YWwgfCBFQ0hfQlJERU5BQkxFKSwgYnJkcC0+aW9jdHJsKTsKIAkJYnJkcC0+aW9zaXplMSA9IDI7CiAJCWJyZHAtPmlvc2l6ZTIgPSAzMjsKQEAgLTIzNzAsMTMgKzIwOTAsMTYgQEAKIAkJYnJkcC0+aW9jdHJsID0gYnJkcC0+aW9hZGRyMSArIDB4MjA7CiAJCWJyZHAtPmlvc3RhdHVzID0gYnJkcC0+aW9jdHJsOwogCQlzdGF0dXMgPSBpbmIoYnJkcC0+aW9zdGF0dXMpOwotCQlpZiAoKHN0YXR1cyAmIEVDSF9JREJJVE1BU0spICE9IEVDSF9JRCkKLQkJCXJldHVybigtRU5PREVWKTsKKwkJaWYgKChzdGF0dXMgJiBFQ0hfSURCSVRNQVNLKSAhPSBFQ0hfSUQpIHsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQogCQlpZiAoKGJyZHAtPmlycSA8IDApIHx8IChicmRwLT5pcnEgPiAxNSkgfHwKIAkJICAgIChzdGxfdmVjbWFwW2JyZHAtPmlycV0gPT0gKHVuc2lnbmVkIGNoYXIpIDB4ZmYpKSB7CiAJCQlwcmludGsoIlNUQUxMSU9OOiBpbnZhbGlkIGlycT0lZCBmb3IgYnJkPSVkXG4iLAogCQkJCWJyZHAtPmlycSwgYnJkcC0+YnJkbnIpOwotCQkJcmV0dXJuKC1FSU5WQUwpOworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOwogCQl9CiAJCW91dGIoRUNITUNfQlJEUkVTRVQsIGJyZHAtPmlvY3RybCk7CiAJCW91dGIoRUNITUNfSU5URU5BQkxFLCBicmRwLT5pb2N0cmwpOwpAQCAtMjQwMywxOSArMjEyNiwyMCBAQAogCiAJZGVmYXVsdDoKIAkJcHJpbnRrKCJTVEFMTElPTjogdW5rbm93biBib2FyZCB0eXBlPSVkXG4iLCBicmRwLT5icmR0eXBlKTsKLQkJcmV0dXJuKC1FSU5WQUwpOwotCQlicmVhazsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CiAJfQogCiAvKgogICoJQ2hlY2sgYm9hcmRzIGZvciBwb3NzaWJsZSBJTyBhZGRyZXNzIGNvbmZsaWN0cyBhbmQgcmV0dXJuIGZhaWwgc3RhdHVzIAogICogCWlmIGFuIElPIGNvbmZsaWN0IGZvdW5kLgogICovCisJcmV0dmFsID0gLUVCVVNZOwogCWlmICghcmVxdWVzdF9yZWdpb24oYnJkcC0+aW9hZGRyMSwgYnJkcC0+aW9zaXplMSwgbmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiU1RBTExJT046IFdhcm5pbmcsIGJvYXJkICVkIEkvTyBhZGRyZXNzICIKIAkJCSIleCBjb25mbGljdHMgd2l0aCBhbm90aGVyIGRldmljZVxuIiwgYnJkcC0+YnJkbnIsIAogCQkJYnJkcC0+aW9hZGRyMSk7Ci0JCXJldHVybigtRUJVU1kpOworCQlnb3RvIGVycjsKIAl9CiAJCiAJaWYgKGJyZHAtPmlvc2l6ZTIgPiAwKQpAQCAtMjQyNiw4ICsyMTUwLDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNUQUxMSU9OOiBXYXJuaW5nLCBhbHNvICIKIAkJCQkicmVsZWFzaW5nIGJvYXJkICVkIEkvTyBhZGRyZXNzICV4IFxuIiwgCiAJCQkJYnJkcC0+YnJkbnIsIGJyZHAtPmlvYWRkcjEpOwotCQkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9hZGRyMSwgYnJkcC0+aW9zaXplMSk7Ci0JCQlyZXR1cm4oLUVCVVNZKTsKKwkJCWdvdG8gZXJyX3JlbDE7CiAJCX0KIAogLyoKQEAgLTI0NDIsMTkgKzIxNjUsMTkgQEAKIAlwYW5lbG5yID0gMDsKIAlueHRpZCA9IDA7CiAKLQlmb3IgKGkgPSAwOyAoaSA8IFNUTF9NQVhQQU5FTFMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgU1RMX01BWFBBTkVMUzsgaSsrKSB7CiAJCWlmIChicmRwLT5icmR0eXBlID09IEJSRF9FQ0hQQ0kpIHsKIAkJCW91dGIobnh0aWQsIGJyZHAtPmlvY3RybCk7CiAJCQlpb2FkZHIgPSBicmRwLT5pb2FkZHIyOwogCQl9CiAJCXN0YXR1cyA9IGluYihpb2FkZHIgKyBFQ0hfUE5MU1RBVFVTKTsKIAkJaWYgKChzdGF0dXMgJiBFQ0hfUE5MSURNQVNLKSAhPSBueHRpZCkKLQkJCWJyZWFrOwotCQlwYW5lbHAgPSBremFsbG9jKHNpemVvZihzdGxwYW5lbF90KSwgR0ZQX0tFUk5FTCk7CisJCQlnb3RvIGVycl9mcjsKKwkJcGFuZWxwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0bHBhbmVsKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcGFuZWxwKSB7CiAJCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICIKLQkJCQkiKHNpemU9JVpkKVxuIiwgc2l6ZW9mKHN0bHBhbmVsX3QpKTsKLQkJCWJyZWFrOworCQkJCSIoc2l6ZT0lWmQpXG4iLCBzaXplb2Yoc3RydWN0IHN0bHBhbmVsKSk7CisJCQlnb3RvIGVycl9mcjsKIAkJfQogCQlwYW5lbHAtPm1hZ2ljID0gU1RMX1BBTkVMTUFHSUM7CiAJCXBhbmVscC0+YnJkbnIgPSBicmRwLT5icmRucjsKQEAgLTI0NjcsNyArMjE5MCw3IEBACiAJCWJyZHAtPmJua3N0YXRhZGRyW2JhbmtucisrXSA9IGlvYWRkciArIEVDSF9QTkxTVEFUVVM7CiAKIAkJaWYgKHN0YXR1cyAmIEVDSF9QTkxYUElEKSB7Ci0JCQlwYW5lbHAtPnVhcnRwID0gKHZvaWQgKikgJnN0bF9zYzI2MTk4dWFydDsKKwkJCXBhbmVscC0+dWFydHAgPSAmc3RsX3NjMjYxOTh1YXJ0OwogCQkJcGFuZWxwLT5pc3IgPSBzdGxfc2MyNjE5OGludHI7CiAJCQlpZiAoc3RhdHVzICYgRUNIX1BOTDE2UE9SVCkgewogCQkJCXBhbmVscC0+bnJwb3J0cyA9IDE2OwpAQCAtMjQ3NSwxMSArMjE5OCwxMCBAQAogCQkJCWJyZHAtPmJua3BhZ2VhZGRyW2Jhbmtucl0gPSBueHRpZDsKIAkJCQlicmRwLT5ibmtzdGF0YWRkcltiYW5rbnIrK10gPSBpb2FkZHIgKyA0ICsKIAkJCQkJRUNIX1BOTFNUQVRVUzsKLQkJCX0gZWxzZSB7CisJCQl9IGVsc2UKIAkJCQlwYW5lbHAtPm5ycG9ydHMgPSA4OwotCQkJfQogCQl9IGVsc2UgewotCQkJcGFuZWxwLT51YXJ0cCA9ICh2b2lkICopICZzdGxfY2QxNDAwdWFydDsKKwkJCXBhbmVscC0+dWFydHAgPSAmc3RsX2NkMTQwMHVhcnQ7CiAJCQlwYW5lbHAtPmlzciA9IHN0bF9jZDE0MDBlY2hpbnRyOwogCQkJaWYgKHN0YXR1cyAmIEVDSF9QTkwxNlBPUlQpIHsKIAkJCQlwYW5lbHAtPm5ycG9ydHMgPSAxNjsKQEAgLTI1MDIsNyArMjIyNCw3IEBACiAJCWJyZHAtPnBhbmVsc1twYW5lbG5yKytdID0gcGFuZWxwOwogCQlpZiAoKGJyZHAtPmJyZHR5cGUgIT0gQlJEX0VDSFBDSSkgJiYKIAkJICAgIChpb2FkZHIgPj0gKGJyZHAtPmlvYWRkcjIgKyBicmRwLT5pb3NpemUyKSkpCi0JCQlicmVhazsKKwkJCWdvdG8gZXJyX2ZyOwogCX0KIAogCWJyZHAtPm5ycGFuZWxzID0gcGFuZWxucjsKQEAgLTI1MTQsMTIgKzIyMzYsMTkgQEAKIAlpZiAocmVxdWVzdF9pcnEoYnJkcC0+aXJxLCBzdGxfaW50ciwgSVJRRl9TSEFSRUQsIG5hbWUsIGJyZHApICE9IDApIHsKIAkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHJlZ2lzdGVyIGludGVycnVwdCAiCiAJCSAgICAicm91dGluZSBmb3IgJXMgaXJxPSVkXG4iLCBuYW1lLCBicmRwLT5pcnEpOwotCQlpID0gLUVOT0RFVjsKLQl9IGVsc2UgewotCQlpID0gMDsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnI7CiAJfQogCi0JcmV0dXJuKGkpOworCXJldHVybiAwOworZXJyX2ZyOgorCXN0bF9jbGVhbnVwX3BhbmVscyhicmRwKTsKKwlpZiAoYnJkcC0+aW9zaXplMiA+IDApCisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYWRkcjIsIGJyZHAtPmlvc2l6ZTIpOworZXJyX3JlbDE6CisJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9hZGRyMSwgYnJkcC0+aW9zaXplMSk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjUzMSw0OCArMjI2MCw2MSBAQAogICoJc2luY2UgdGhlIGluaXRpYWwgc2VhcmNoIGFuZCBzZXR1cCBpcyB2ZXJ5IGRpZmZlcmVudC4KICAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBzdGxfYnJkaW5pdChzdGxicmRfdCAqYnJkcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN0bF9icmRpbml0KHN0cnVjdCBzdGxicmQgKmJyZHApCiB7Ci0JaW50CWk7CisJaW50IGksIHJldHZhbDsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfYnJkaW5pdChicmRwPSV4KVxuIiwgKGludCkgYnJkcCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2JyZGluaXQoYnJkcD0lcClcbiIsIGJyZHApOwogCiAJc3dpdGNoIChicmRwLT5icmR0eXBlKSB7CiAJY2FzZSBCUkRfRUFTWUlPOgogCWNhc2UgQlJEX0VBU1lJT1BDSToKLQkJc3RsX2luaXRlaW8oYnJkcCk7CisJCXJldHZhbCA9IHN0bF9pbml0ZWlvKGJyZHApOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnI7CiAJCWJyZWFrOwogCWNhc2UgQlJEX0VDSDoKIAljYXNlIEJSRF9FQ0hNQzoKIAljYXNlIEJSRF9FQ0hQQ0k6CiAJY2FzZSBCUkRfRUNINjRQQ0k6Ci0JCXN0bF9pbml0ZWNoKGJyZHApOworCQlyZXR2YWwgPSBzdGxfaW5pdGVjaChicmRwKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoIlNUQUxMSU9OOiBib2FyZD0lZCBpcyB1bmtub3duIGJvYXJkIHR5cGU9JWRcbiIsCiAJCQlicmRwLT5icmRuciwgYnJkcC0+YnJkdHlwZSk7Ci0JCXJldHVybihFTk9ERVYpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycjsKIAl9CiAKLQlzdGxfYnJkc1ticmRwLT5icmRucl0gPSBicmRwOwogCWlmICgoYnJkcC0+c3RhdGUgJiBCUkRfRk9VTkQpID09IDApIHsKIAkJcHJpbnRrKCJTVEFMTElPTjogJXMgYm9hcmQgbm90IGZvdW5kLCBib2FyZD0lZCBpbz0leCBpcnE9JWRcbiIsCiAJCQlzdGxfYnJkbmFtZXNbYnJkcC0+YnJkdHlwZV0sIGJyZHAtPmJyZG5yLAogCQkJYnJkcC0+aW9hZGRyMSwgYnJkcC0+aXJxKTsKLQkJcmV0dXJuKEVOT0RFVik7CisJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCi0JZm9yIChpID0gMDsgKGkgPCBTVExfTUFYUEFORUxTKTsgaSsrKQotCQlpZiAoYnJkcC0+cGFuZWxzW2ldICE9IChzdGxwYW5lbF90ICopIE5VTEwpCisJZm9yIChpID0gMDsgaSA8IFNUTF9NQVhQQU5FTFM7IGkrKykKKwkJaWYgKGJyZHAtPnBhbmVsc1tpXSAhPSBOVUxMKQogCQkJc3RsX2luaXRwb3J0cyhicmRwLCBicmRwLT5wYW5lbHNbaV0pOwogCiAJcHJpbnRrKCJTVEFMTElPTjogJXMgZm91bmQsIGJvYXJkPSVkIGlvPSV4IGlycT0lZCAiCiAJCSJucnBhbmVscz0lZCBucnBvcnRzPSVkXG4iLCBzdGxfYnJkbmFtZXNbYnJkcC0+YnJkdHlwZV0sCiAJCWJyZHAtPmJyZG5yLCBicmRwLT5pb2FkZHIxLCBicmRwLT5pcnEsIGJyZHAtPm5ycGFuZWxzLAogCQlicmRwLT5ucnBvcnRzKTsKLQlyZXR1cm4oMCk7CisKKwlyZXR1cm4gMDsKK2Vycl9mcmVlOgorCWZyZWVfaXJxKGJyZHAtPmlycSwgYnJkcCk7CisKKwlzdGxfY2xlYW51cF9wYW5lbHMoYnJkcCk7CisKKwlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2FkZHIxLCBicmRwLT5pb3NpemUxKTsKKwlpZiAoYnJkcC0+aW9zaXplMiA+IDApCisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYWRkcjIsIGJyZHAtPmlvc2l6ZTIpOworZXJyOgorCXJldHVybiByZXR2YWw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI1ODEsNTkgKzIzMjMsNjIgQEAKICAqCUZpbmQgdGhlIG5leHQgYXZhaWxhYmxlIGJvYXJkIG51bWJlciB0aGF0IGlzIGZyZWUuCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgc3RsX2dldGJyZG5yKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdGxfZ2V0YnJkbnIodm9pZCkKIHsKLQlpbnQJaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaSA9IDA7IChpIDwgU1RMX01BWEJSRFMpOyBpKyspIHsKLQkJaWYgKHN0bF9icmRzW2ldID09IChzdGxicmRfdCAqKSBOVUxMKSB7CisJZm9yIChpID0gMDsgaSA8IFNUTF9NQVhCUkRTOyBpKyspCisJCWlmIChzdGxfYnJkc1tpXSA9PSBOVUxMKSB7CiAJCQlpZiAoaSA+PSBzdGxfbnJicmRzKQogCQkJCXN0bF9ucmJyZHMgPSBpICsgMTsKLQkJCXJldHVybihpKTsKKwkJCXJldHVybiBpOwogCQl9Ci0JfQotCXJldHVybigtMSk7CisKKwlyZXR1cm4gLTE7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmCUNPTkZJR19QQ0kKLQogLyoKICAqCVdlIGhhdmUgYSBTdGFsbGlvbiBib2FyZC4gQWxsb2NhdGUgYSBib2FyZCBzdHJ1Y3R1cmUgYW5kCiAgKglpbml0aWFsaXplIGl0LiBSZWFkIGl0cyBJTyBhbmQgSVJRIHJlc291cmNlcyBmcm9tIFBDSQogICoJY29uZmlndXJhdGlvbiBzcGFjZS4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBzdGxfaW5pdHBjaWJyZChpbnQgYnJkdHlwZSwgc3RydWN0IHBjaV9kZXYgKmRldnApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdGxfcGNpcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RsYnJkX3QJKmJyZHA7CisJc3RydWN0IHN0bGJyZCAqYnJkcDsKKwl1bnNpZ25lZCBpbnQgaSwgYnJkdHlwZSA9IGVudC0+ZHJpdmVyX2RhdGE7CisJaW50IGJyZG5yLCByZXR2YWwgPSAtRU5PREVWOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9pbml0cGNpYnJkKGJyZHR5cGU9JWQsYnVzbnI9JXgsZGV2bnI9JXgpXG4iLCBicmR0eXBlLAotCQlkZXZwLT5idXMtPm51bWJlciwgZGV2cC0+ZGV2Zm4pOwotI2VuZGlmCisJaWYgKChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCisJCWdvdG8gZXJyOwogCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldnApKQotCQlyZXR1cm4oLUVJTyk7Ci0JaWYgKChicmRwID0gc3RsX2FsbG9jYnJkKCkpID09IChzdGxicmRfdCAqKSBOVUxMKQotCQlyZXR1cm4oLUVOT01FTSk7Ci0JaWYgKChicmRwLT5icmRuciA9IHN0bF9nZXRicmRucigpKSA8IDApIHsKLQkJcHJpbnRrKCJTVEFMTElPTjogdG9vIG1hbnkgYm9hcmRzIGZvdW5kLCAiCi0JCQkibWF4aW11bSBzdXBwb3J0ZWQgJWRcbiIsIFNUTF9NQVhCUkRTKTsKLQkJcmV0dXJuKDApOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwbGVhc2UsIHJlcG9ydCB0aGlzIHRvIExLTUw6ICV4LyV4LyV4XG4iLAorCQkJcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPmNsYXNzKTsKKworCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCWJyZHAgPSBzdGxfYWxsb2NicmQoKTsKKwlpZiAoYnJkcCA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOwogCX0KLQlicmRwLT5icmR0eXBlID0gYnJkdHlwZTsKKwltdXRleF9sb2NrKCZzdGxfYnJkc2xvY2spOworCWJyZG5yID0gc3RsX2dldGJyZG5yKCk7CisJaWYgKGJyZG5yIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ0b28gbWFueSBib2FyZHMgZm91bmQsICIKKwkJCSJtYXhpbXVtIHN1cHBvcnRlZCAlZFxuIiwgU1RMX01BWEJSRFMpOworCQltdXRleF91bmxvY2soJnN0bF9icmRzbG9jayk7CisJCWdvdG8gZXJyX2ZyOworCX0KKwlicmRwLT5icmRuciA9ICh1bnNpZ25lZCBpbnQpYnJkbnI7CisJc3RsX2JyZHNbYnJkcC0+YnJkbnJdID0gYnJkcDsKKwltdXRleF91bmxvY2soJnN0bF9icmRzbG9jayk7CiAKLS8qCi0gKglEaWZmZXJlbnQgU3RhbGxpb24gYm9hcmRzIHVzZSB0aGUgQkFSIHJlZ2lzdGVycyBpbiBkaWZmZXJlbnQgd2F5cywKLSAqCXNvIHNldCB1cCBpbyBhZGRyZXNzZXMgYmFzZWQgb24gYm9hcmQgdHlwZS4KLSAqLwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCIlcyglZCk6IEJBUltdPSV4LCV4LCV4LCV4IElSUT0leFxuIiwgX19GSUxFX18sIF9fTElORV9fLAotCQlwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMCksIHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAxKSwKLQkJcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDIpLCBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2cCwgMyksIGRldnAtPmlycSk7Ci0jZW5kaWYKKwlicmRwLT5icmR0eXBlID0gYnJkdHlwZTsKKwlicmRwLT5zdGF0ZSB8PSBTVExfUFJPQkVEOwogCiAvKgogICoJV2UgaGF2ZSBhbGwgcmVzb3VyY2VzIGZyb20gdGhlIGJvYXJkLCBzbyBsZXQncyBzZXR1cCB0aGUgYWN0dWFsCkBAIC0yNjQxLDExOSArMjM4Niw2OSBAQAogICovCiAJc3dpdGNoIChicmR0eXBlKSB7CiAJY2FzZSBCUkRfRUNIUENJOgotCQlicmRwLT5pb2FkZHIyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDApOwotCQlicmRwLT5pb2FkZHIxID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDEpOworCQlicmRwLT5pb2FkZHIyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQlicmRwLT5pb2FkZHIxID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwogCQlicmVhazsKIAljYXNlIEJSRF9FQ0g2NFBDSToKLQkJYnJkcC0+aW9hZGRyMiA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAyKTsKLQkJYnJkcC0+aW9hZGRyMSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwLCAxKTsKKwkJYnJkcC0+aW9hZGRyMiA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwkJYnJkcC0+aW9hZGRyMSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBCUkRfRUFTWUlPUENJOgotCQlicmRwLT5pb2FkZHIxID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDIpOwotCQlicmRwLT5pb2FkZHIyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnAsIDEpOworCQlicmRwLT5pb2FkZHIxID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCQlicmRwLT5pb2FkZHIyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIlNUQUxMSU9OOiB1bmtub3duIFBDSSBib2FyZCB0eXBlPSVkXG4iLCBicmR0eXBlKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5rbm93biBQQ0kgYm9hcmQgdHlwZT0ldVxuIiwgYnJkdHlwZSk7CiAJCWJyZWFrOwogCX0KIAotCWJyZHAtPmlycSA9IGRldnAtPmlycTsKLQlzdGxfYnJkaW5pdChicmRwKTsKKwlicmRwLT5pcnEgPSBwZGV2LT5pcnE7CisJcmV0dmFsID0gc3RsX2JyZGluaXQoYnJkcCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJfbnVsbDsKIAotCXJldHVybigwKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYnJkcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnJkcC0+bnJwb3J0czsgaSsrKQorCQl0dHlfcmVnaXN0ZXJfZGV2aWNlKHN0bF9zZXJpYWwsCisJCQkJYnJkcC0+YnJkbnIgKiBTVExfTUFYUE9SVFMgKyBpLCAmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworZXJyX251bGw6CisJc3RsX2JyZHNbYnJkcC0+YnJkbnJdID0gTlVMTDsKK2Vycl9mcjoKKwlrZnJlZShicmRwKTsKK2VycjoKKwlyZXR1cm4gcmV0dmFsOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKglGaW5kIGFsbCBTdGFsbGlvbiBQQ0kgYm9hcmRzIHRoYXQgbWlnaHQgYmUgaW5zdGFsbGVkLiBJbml0aWFsaXplIGVhY2gKLSAqCW9uZSBhcyBpdCBpcyBmb3VuZC4KLSAqLwotCi0KLXN0YXRpYyBpbmxpbmUgaW50IHN0bF9maW5kcGNpYnJkcyh2b2lkKQorc3RhdGljIHZvaWQgX19kZXZleGl0IHN0bF9wY2lyZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYJKmRldiA9IE5VTEw7Ci0JaW50CQlpLCByYzsKKwlzdHJ1Y3Qgc3RsYnJkICpicmRwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludCBpOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9maW5kcGNpYnJkcygpXG4iKTsKLSNlbmRpZgorCWZyZWVfaXJxKGJyZHAtPmlycSwgYnJkcCk7CiAKLQlmb3IgKGkgPSAwOyAoaSA8IHN0bF9ucnBjaWJyZHMpOyBpKyspCi0JCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKHN0bF9wY2licmRzW2ldLnZlbmRpZCwKLQkJICAgIHN0bF9wY2licmRzW2ldLmRldmlkLCBkZXYpKSkgeworCXN0bF9jbGVhbnVwX3BhbmVscyhicmRwKTsKIAotLyoKLSAqCQkJRm91bmQgYSBkZXZpY2Ugb24gdGhlIFBDSSBidXMgdGhhdCBoYXMgb3VyIHZlbmRvciBhbmQKLSAqCQkJZGV2aWNlIElELiBOZWVkIHRvIGNoZWNrIG5vdyB0aGF0IGl0IGlzIHJlYWxseSB1cy4KLSAqLwotCQkJaWYgKChkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKLQkJCQljb250aW51ZTsKKwlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2FkZHIxLCBicmRwLT5pb3NpemUxKTsKKwlpZiAoYnJkcC0+aW9zaXplMiA+IDApCisJCXJlbGVhc2VfcmVnaW9uKGJyZHAtPmlvYWRkcjIsIGJyZHAtPmlvc2l6ZTIpOwogCi0JCQlyYyA9IHN0bF9pbml0cGNpYnJkKHN0bF9wY2licmRzW2ldLmJyZHR5cGUsIGRldik7Ci0JCQlpZiAocmMpCi0JCQkJcmV0dXJuKHJjKTsKLQkJfQorCWZvciAoaSA9IDA7IGkgPCBicmRwLT5ucnBvcnRzOyBpKyspCisJCXR0eV91bnJlZ2lzdGVyX2RldmljZShzdGxfc2VyaWFsLAorCQkJCWJyZHAtPmJyZG5yICogU1RMX01BWFBPUlRTICsgaSk7CiAKLQlyZXR1cm4oMCk7CisJc3RsX2JyZHNbYnJkcC0+YnJkbnJdID0gTlVMTDsKKwlrZnJlZShicmRwKTsKIH0KIAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqCVNjYW4gdGhyb3VnaCBhbGwgdGhlIGJvYXJkcyBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2VlIHdoYXQgd2UKLSAqCWNhbiBmaW5kLiBIYW5kbGUgRUlPIGFuZCB0aGUgRUNIIGJvYXJkcyBhIGxpdHRsZSBkaWZmZXJlbnRseSBoZXJlCi0gKglzaW5jZSB0aGUgaW5pdGlhbCBzZWFyY2ggYW5kIHNldHVwIGlzIHRvbyBkaWZmZXJlbnQuCi0gKi8KLQotc3RhdGljIGlubGluZSBpbnQgc3RsX2luaXRicmRzKHZvaWQpCi17Ci0Jc3RsYnJkX3QJKmJyZHA7Ci0Jc3RsY29uZl90CSpjb25mcDsKLQlpbnQJCWk7Ci0KLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX2luaXRicmRzKClcbiIpOwotI2VuZGlmCi0KLQlpZiAoc3RsX25yYnJkcyA+IFNUTF9NQVhCUkRTKSB7Ci0JCXByaW50aygiU1RBTExJT046IHRvbyBtYW55IGJvYXJkcyBpbiBjb25maWd1cmF0aW9uIHRhYmxlLCAiCi0JCQkidHJ1bmNhdGluZyB0byAlZFxuIiwgU1RMX01BWEJSRFMpOwotCQlzdGxfbnJicmRzID0gU1RMX01BWEJSRFM7Ci0JfQotCi0vKgotICoJRmlyc3RseSBzY2FuIHRoZSBsaXN0IG9mIHN0YXRpYyBib2FyZHMgY29uZmlndXJlZC4gQWxsb2NhdGUKLSAqCXJlc291cmNlcyBhbmQgaW5pdGlhbGl6ZSB0aGUgYm9hcmRzIGFzIGZvdW5kLgotICovCi0JZm9yIChpID0gMDsgKGkgPCBzdGxfbnJicmRzKTsgaSsrKSB7Ci0JCWNvbmZwID0gJnN0bF9icmRjb25mW2ldOwotCQlzdGxfcGFyc2VicmQoY29uZnAsIHN0bF9icmRzcFtpXSk7Ci0JCWlmICgoYnJkcCA9IHN0bF9hbGxvY2JyZCgpKSA9PSAoc3RsYnJkX3QgKikgTlVMTCkKLQkJCXJldHVybigtRU5PTUVNKTsKLQkJYnJkcC0+YnJkbnIgPSBpOwotCQlicmRwLT5icmR0eXBlID0gY29uZnAtPmJyZHR5cGU7Ci0JCWJyZHAtPmlvYWRkcjEgPSBjb25mcC0+aW9hZGRyMTsKLQkJYnJkcC0+aW9hZGRyMiA9IGNvbmZwLT5pb2FkZHIyOwotCQlicmRwLT5pcnEgPSBjb25mcC0+aXJxOwotCQlicmRwLT5pcnF0eXBlID0gY29uZnAtPmlycXR5cGU7Ci0JCXN0bF9icmRpbml0KGJyZHApOwotCX0KLQotLyoKLSAqCUZpbmQgYW55IGR5bmFtaWNhbGx5IHN1cHBvcnRlZCBib2FyZHMuIFRoYXQgaXMgdmlhIG1vZHVsZSBsb2FkCi0gKglsaW5lIG9wdGlvbnMgb3IgYXV0by1kZXRlY3RlZCBvbiB0aGUgUENJIGJ1cy4KLSAqLwotCXN0bF9hcmdicmRzKCk7Ci0jaWZkZWYgQ09ORklHX1BDSQotCXN0bF9maW5kcGNpYnJkcygpOwotI2VuZGlmCi0KLQlyZXR1cm4oMCk7Ci19CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3RsX3BjaWRyaXZlciA9IHsKKwkubmFtZSA9ICJzdGFsbGlvbiIsCisJLmlkX3RhYmxlID0gc3RsX3BjaWJyZHMsCisJLnByb2JlID0gc3RsX3BjaXByb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzdGxfcGNpcmVtb3ZlKQorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNzYzLDE3ICsyNDU4LDE4IEBACiAKIHN0YXRpYyBpbnQgc3RsX2dldGJyZHN0YXRzKGNvbWJyZF90IF9fdXNlciAqYnApCiB7Ci0Jc3RsYnJkX3QJKmJyZHA7Ci0Jc3RscGFuZWxfdAkqcGFuZWxwOwotCWludAkJaTsKKwljb21icmRfdAlzdGxfYnJkc3RhdHM7CisJc3RydWN0IHN0bGJyZAkqYnJkcDsKKwlzdHJ1Y3Qgc3RscGFuZWwJKnBhbmVscDsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsX2JyZHN0YXRzLCBicCwgc2l6ZW9mKGNvbWJyZF90KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCWlmIChzdGxfYnJkc3RhdHMuYnJkID49IFNUTF9NQVhCUkRTKQotCQlyZXR1cm4oLUVOT0RFVik7CisJCXJldHVybiAtRU5PREVWOwogCWJyZHAgPSBzdGxfYnJkc1tzdGxfYnJkc3RhdHMuYnJkXTsKLQlpZiAoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkKLQkJcmV0dXJuKC1FTk9ERVYpOworCWlmIChicmRwID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOwogCiAJbWVtc2V0KCZzdGxfYnJkc3RhdHMsIDAsIHNpemVvZihjb21icmRfdCkpOwogCXN0bF9icmRzdGF0cy5icmQgPSBicmRwLT5icmRucjsKQEAgLTI3ODUsNyArMjQ4MSw3IEBACiAJc3RsX2JyZHN0YXRzLmlycSA9IGJyZHAtPmlycTsKIAlzdGxfYnJkc3RhdHMubnJwYW5lbHMgPSBicmRwLT5ucnBhbmVsczsKIAlzdGxfYnJkc3RhdHMubnJwb3J0cyA9IGJyZHAtPm5ycG9ydHM7Ci0JZm9yIChpID0gMDsgKGkgPCBicmRwLT5ucnBhbmVscyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBicmRwLT5ucnBhbmVsczsgaSsrKSB7CiAJCXBhbmVscCA9IGJyZHAtPnBhbmVsc1tpXTsKIAkJc3RsX2JyZHN0YXRzLnBhbmVsc1tpXS5wYW5lbCA9IGk7CiAJCXN0bF9icmRzdGF0cy5wYW5lbHNbaV0uaHdpZCA9IHBhbmVscC0+aHdpZDsKQEAgLTI4MDEsMjQgKzI0OTcsMjQgQEAKICAqCVJlc29sdmUgdGhlIHJlZmVyZW5jZWQgcG9ydCBudW1iZXIgaW50byBhIHBvcnQgc3RydWN0IHBvaW50ZXIuCiAgKi8KIAotc3RhdGljIHN0bHBvcnRfdCAqc3RsX2dldHBvcnQoaW50IGJyZG5yLCBpbnQgcGFuZWxuciwgaW50IHBvcnRucikKK3N0YXRpYyBzdHJ1Y3Qgc3RscG9ydCAqc3RsX2dldHBvcnQoaW50IGJyZG5yLCBpbnQgcGFuZWxuciwgaW50IHBvcnRucikKIHsKLQlzdGxicmRfdAkqYnJkcDsKLQlzdGxwYW5lbF90CSpwYW5lbHA7CisJc3RydWN0IHN0bGJyZAkqYnJkcDsKKwlzdHJ1Y3Qgc3RscGFuZWwJKnBhbmVscDsKIAotCWlmICgoYnJkbnIgPCAwKSB8fCAoYnJkbnIgPj0gU1RMX01BWEJSRFMpKQotCQlyZXR1cm4oKHN0bHBvcnRfdCAqKSBOVUxMKTsKKwlpZiAoYnJkbnIgPCAwIHx8IGJyZG5yID49IFNUTF9NQVhCUkRTKQorCQlyZXR1cm4gTlVMTDsKIAlicmRwID0gc3RsX2JyZHNbYnJkbnJdOwotCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQotCQlyZXR1cm4oKHN0bHBvcnRfdCAqKSBOVUxMKTsKLQlpZiAoKHBhbmVsbnIgPCAwKSB8fCAocGFuZWxuciA+PSBicmRwLT5ucnBhbmVscykpCi0JCXJldHVybigoc3RscG9ydF90ICopIE5VTEwpOworCWlmIChicmRwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWlmIChwYW5lbG5yIDwgMCB8fCAodW5zaWduZWQgaW50KXBhbmVsbnIgPj0gYnJkcC0+bnJwYW5lbHMpCisJCXJldHVybiBOVUxMOwogCXBhbmVscCA9IGJyZHAtPnBhbmVsc1twYW5lbG5yXTsKLQlpZiAocGFuZWxwID09IChzdGxwYW5lbF90ICopIE5VTEwpCi0JCXJldHVybigoc3RscG9ydF90ICopIE5VTEwpOwotCWlmICgocG9ydG5yIDwgMCkgfHwgKHBvcnRuciA+PSBwYW5lbHAtPm5ycG9ydHMpKQotCQlyZXR1cm4oKHN0bHBvcnRfdCAqKSBOVUxMKTsKLQlyZXR1cm4ocGFuZWxwLT5wb3J0c1twb3J0bnJdKTsKKwlpZiAocGFuZWxwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWlmIChwb3J0bnIgPCAwIHx8ICh1bnNpZ25lZCBpbnQpcG9ydG5yID49IHBhbmVscC0+bnJwb3J0cykKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHBhbmVscC0+cG9ydHNbcG9ydG5yXTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjgyOSw4ICsyNTI1LDkgQEAKICAqCXdoYXQgcG9ydCB0byBnZXQgc3RhdHMgZm9yICh1c2VkIHRocm91Z2ggYm9hcmQgY29udHJvbCBkZXZpY2UpLgogICovCiAKLXN0YXRpYyBpbnQgc3RsX2dldHBvcnRzdGF0cyhzdGxwb3J0X3QgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCitzdGF0aWMgaW50IHN0bF9nZXRwb3J0c3RhdHMoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBjb21zdGF0c190IF9fdXNlciAqY3ApCiB7CisJY29tc3RhdHNfdAlzdGxfY29tc3RhdHM7CiAJdW5zaWduZWQgY2hhcgkqaGVhZCwgKnRhaWw7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIApAQCAtMjgzOSw4ICsyNTM2LDggQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCQlwb3J0cCA9IHN0bF9nZXRwb3J0KHN0bF9jb21zdGF0cy5icmQsIHN0bF9jb21zdGF0cy5wYW5lbCwKIAkJCXN0bF9jb21zdGF0cy5wb3J0KTsKLQkJaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKLQkJCXJldHVybigtRU5PREVWKTsKKwkJaWYgKHBvcnRwID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlwb3J0cC0+c3RhdHMuc3RhdGUgPSBwb3J0cC0+aXN0YXRlOwpAQCAtMjg1NSwyNSArMjU1MiwyNCBAQAogCXBvcnRwLT5zdGF0cy5yeGJ1ZmZlcmVkID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzdGFsbGlvbl9sb2NrLCBmbGFncyk7Ci0JaWYgKHBvcnRwLT50dHkgIT0gKHN0cnVjdCB0dHlfc3RydWN0ICopIE5VTEwpIHsKKwlpZiAocG9ydHAtPnR0eSAhPSBOVUxMKQogCQlpZiAocG9ydHAtPnR0eS0+ZHJpdmVyX2RhdGEgPT0gcG9ydHApIHsKIAkJCXBvcnRwLT5zdGF0cy50dHlzdGF0ZSA9IHBvcnRwLT50dHktPmZsYWdzOwogCQkJLyogTm8gbG9uZ2VyIGF2YWlsYWJsZSBhcyBhIHN0YXRpc3RpYyAqLwogCQkJcG9ydHAtPnN0YXRzLnJ4YnVmZmVyZWQgPSAxOyAvKnBvcnRwLT50dHktPmZsaXAuY291bnQ7ICovCi0JCQlpZiAocG9ydHAtPnR0eS0+dGVybWlvcyAhPSAoc3RydWN0IHRlcm1pb3MgKikgTlVMTCkgeworCQkJaWYgKHBvcnRwLT50dHktPnRlcm1pb3MgIT0gTlVMTCkgewogCQkJCXBvcnRwLT5zdGF0cy5jZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwogCQkJCXBvcnRwLT5zdGF0cy5pZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2lmbGFnOwogCQkJCXBvcnRwLT5zdGF0cy5vZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX29mbGFnOwogCQkJCXBvcnRwLT5zdGF0cy5sZmxhZ3MgPSBwb3J0cC0+dHR5LT50ZXJtaW9zLT5jX2xmbGFnOwogCQkJfQogCQl9Ci0JfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YWxsaW9uX2xvY2ssIGZsYWdzKTsKIAogCWhlYWQgPSBwb3J0cC0+dHguaGVhZDsKIAl0YWlsID0gcG9ydHAtPnR4LnRhaWw7Ci0JcG9ydHAtPnN0YXRzLnR4YnVmZmVyZWQgPSAoKGhlYWQgPj0gdGFpbCkgPyAoaGVhZCAtIHRhaWwpIDoKLQkJKFNUTF9UWEJVRlNJWkUgLSAodGFpbCAtIGhlYWQpKSk7CisJcG9ydHAtPnN0YXRzLnR4YnVmZmVyZWQgPSAoaGVhZCA+PSB0YWlsKSA/IChoZWFkIC0gdGFpbCkgOgorCQkoU1RMX1RYQlVGU0laRSAtICh0YWlsIC0gaGVhZCkpOwogCiAJcG9ydHAtPnN0YXRzLnNpZ25hbHMgPSAodW5zaWduZWQgbG9uZykgc3RsX2dldHNpZ25hbHMocG9ydHApOwogCkBAIC0yODg3LDE1ICsyNTgzLDE3IEBACiAgKglDbGVhciB0aGUgcG9ydCBzdGF0cyBzdHJ1Y3R1cmUuIFdlIGFsc28gcmV0dXJuIGl0IHplcm9lZCBvdXQuLi4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9jbHJwb3J0c3RhdHMoc3RscG9ydF90ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKQorc3RhdGljIGludCBzdGxfY2xycG9ydHN0YXRzKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgY29tc3RhdHNfdCBfX3VzZXIgKmNwKQogeworCWNvbXN0YXRzX3QJc3RsX2NvbXN0YXRzOworCiAJaWYgKCFwb3J0cCkgewogCQlpZiAoY29weV9mcm9tX3VzZXIoJnN0bF9jb21zdGF0cywgY3AsIHNpemVvZihjb21zdGF0c190KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJcG9ydHAgPSBzdGxfZ2V0cG9ydChzdGxfY29tc3RhdHMuYnJkLCBzdGxfY29tc3RhdHMucGFuZWwsCiAJCQlzdGxfY29tc3RhdHMucG9ydCk7Ci0JCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCi0JCQlyZXR1cm4oLUVOT0RFVik7CisJCWlmIChwb3J0cCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJbWVtc2V0KCZwb3J0cC0+c3RhdHMsIDAsIHNpemVvZihjb21zdGF0c190KSk7CkBAIC0yOTEyLDE3ICsyNjEwLDE4IEBACiAgKglSZXR1cm4gdGhlIGVudGlyZSBkcml2ZXIgcG9ydHMgc3RydWN0dXJlIHRvIGEgdXNlciBhcHAuCiAgKi8KIAotc3RhdGljIGludCBzdGxfZ2V0cG9ydHN0cnVjdChzdGxwb3J0X3QgX191c2VyICphcmcpCitzdGF0aWMgaW50IHN0bF9nZXRwb3J0c3RydWN0KHN0cnVjdCBzdGxwb3J0IF9fdXNlciAqYXJnKQogewotCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHN0bHBvcnQJc3RsX2R1bW15cG9ydDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnN0bF9kdW1teXBvcnQsIGFyZywgc2l6ZW9mKHN0bHBvcnRfdCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmc3RsX2R1bW15cG9ydCwgYXJnLCBzaXplb2Yoc3RydWN0IHN0bHBvcnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcG9ydHAgPSBzdGxfZ2V0cG9ydChzdGxfZHVtbXlwb3J0LmJyZG5yLCBzdGxfZHVtbXlwb3J0LnBhbmVsbnIsCiAJCSBzdGxfZHVtbXlwb3J0LnBvcnRucik7CiAJaWYgKCFwb3J0cCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsIHBvcnRwLCBzaXplb2Yoc3RscG9ydF90KSkgPyAtRUZBVUxUIDogMDsKKwlyZXR1cm4gY29weV90b191c2VyKGFyZywgcG9ydHAsIHNpemVvZihzdHJ1Y3Qgc3RscG9ydCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI5MzEsMTggKzI2MzAsMTkgQEAKICAqCVJldHVybiB0aGUgZW50aXJlIGRyaXZlciBib2FyZCBzdHJ1Y3R1cmUgdG8gYSB1c2VyIGFwcC4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9nZXRicmRzdHJ1Y3Qoc3RsYnJkX3QgX191c2VyICphcmcpCitzdGF0aWMgaW50IHN0bF9nZXRicmRzdHJ1Y3Qoc3RydWN0IHN0bGJyZCBfX3VzZXIgKmFyZykKIHsKLQlzdGxicmRfdAkqYnJkcDsKKwlzdHJ1Y3Qgc3RsYnJkCXN0bF9kdW1teWJyZDsKKwlzdHJ1Y3Qgc3RsYnJkCSpicmRwOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxfZHVtbXlicmQsIGFyZywgc2l6ZW9mKHN0bGJyZF90KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGxfZHVtbXlicmQsIGFyZywgc2l6ZW9mKHN0cnVjdCBzdGxicmQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKChzdGxfZHVtbXlicmQuYnJkbnIgPCAwKSB8fCAoc3RsX2R1bW15YnJkLmJyZG5yID49IFNUTF9NQVhCUkRTKSkKKwlpZiAoc3RsX2R1bW15YnJkLmJyZG5yID49IFNUTF9NQVhCUkRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlicmRwID0gc3RsX2JyZHNbc3RsX2R1bW15YnJkLmJyZG5yXTsKIAlpZiAoIWJyZHApCi0JCXJldHVybigtRU5PREVWKTsKLQlyZXR1cm4gY29weV90b191c2VyKGFyZywgYnJkcCwgc2l6ZW9mKHN0bGJyZF90KSkgPyAtRUZBVUxUIDogMDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsIGJyZHAsIHNpemVvZihzdHJ1Y3Qgc3RsYnJkKSkgPyAtRUZBVUxUIDogMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjk1OCwxNCArMjY1OCwxMSBAQAogCWludAlicmRuciwgcmM7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX21lbWlvY3RsKGlwPSV4LGZwPSV4LGNtZD0leCxhcmc9JXgpXG4iLCAoaW50KSBpcCwKLQkJKGludCkgZnAsIGNtZCwgKGludCkgYXJnKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfbWVtaW9jdGwoaXA9JXAsZnA9JXAsY21kPSV4LGFyZz0lbHgpXG4iLCBpcCwgZnAsIGNtZCxhcmcpOwogCiAJYnJkbnIgPSBpbWlub3IoaXApOwogCWlmIChicmRuciA+PSBTVExfTUFYQlJEUykKLQkJcmV0dXJuKC1FTk9ERVYpOworCQlyZXR1cm4gLUVOT0RFVjsKIAlyYyA9IDA7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMjk4OSw3ICsyNjg2LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuKHJjKTsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgc3RsX29wcyA9IHsKQEAgLTMwMTcsNTUgKzI3MTQsNiBAQAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IF9faW5pdCBzdGxfaW5pdCh2b2lkKQotewotCWludCBpOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZXJzaW9uICVzXG4iLCBzdGxfZHJ2dGl0bGUsIHN0bF9kcnZ2ZXJzaW9uKTsKLQotCXNwaW5fbG9ja19pbml0KCZzdGFsbGlvbl9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYnJkX2xvY2spOwotCi0Jc3RsX2luaXRicmRzKCk7Ci0KLQlzdGxfc2VyaWFsID0gYWxsb2NfdHR5X2RyaXZlcihTVExfTUFYQlJEUyAqIFNUTF9NQVhQT1JUUyk7Ci0JaWYgKCFzdGxfc2VyaWFsKQotCQlyZXR1cm4gLTE7Ci0KLS8qCi0gKglTZXQgdXAgYSBjaGFyYWN0ZXIgZHJpdmVyIGZvciBwZXIgYm9hcmQgc3R1ZmYuIFRoaXMgaXMgbWFpbmx5IHVzZWQKLSAqCXRvIGRvIHN0YXRzIGlvY3RscyBvbiB0aGUgcG9ydHMuCi0gKi8KLQlpZiAocmVnaXN0ZXJfY2hyZGV2KFNUTF9TSU9NRU1NQUpPUiwgInN0YWxpb21lbSIsICZzdGxfZnNpb21lbSkpCi0JCXByaW50aygiU1RBTExJT046IGZhaWxlZCB0byByZWdpc3RlciBzZXJpYWwgYm9hcmQgZGV2aWNlXG4iKTsKLQotCXN0YWxsaW9uX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAic3RhbGlvbWVtIik7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZShzdGFsbGlvbl9jbGFzcywgTlVMTCwKLQkJCQkgICAgTUtERVYoU1RMX1NJT01FTU1BSk9SLCBpKSwgTlVMTCwKLQkJCQkgICAgInN0YWxpb21lbSVkIiwgaSk7Ci0KLQlzdGxfc2VyaWFsLT5vd25lciA9IFRISVNfTU9EVUxFOwotCXN0bF9zZXJpYWwtPmRyaXZlcl9uYW1lID0gc3RsX2Rydm5hbWU7Ci0Jc3RsX3NlcmlhbC0+bmFtZSA9ICJ0dHlFIjsKLQlzdGxfc2VyaWFsLT5tYWpvciA9IFNUTF9TRVJJQUxNQUpPUjsKLQlzdGxfc2VyaWFsLT5taW5vcl9zdGFydCA9IDA7Ci0Jc3RsX3NlcmlhbC0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7Ci0Jc3RsX3NlcmlhbC0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKLQlzdGxfc2VyaWFsLT5pbml0X3Rlcm1pb3MgPSBzdGxfZGVmdGVybWlvczsKLQlzdGxfc2VyaWFsLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7Ci0JdHR5X3NldF9vcGVyYXRpb25zKHN0bF9zZXJpYWwsICZzdGxfb3BzKTsKLQotCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHN0bF9zZXJpYWwpKSB7Ci0JCXB1dF90dHlfZHJpdmVyKHN0bF9zZXJpYWwpOwotCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgIENEMTQwMCBIQVJEV0FSRSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zMDc1LDIxICsyNzIzLDIxIEBACiAgKgkoTWF5YmUgc2hvdWxkIG1ha2UgdGhpcyBpbmxpbmUuLi4pCiAgKi8KIAotc3RhdGljIGludCBzdGxfY2QxNDAwZ2V0cmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWducikKK3N0YXRpYyBpbnQgc3RsX2NkMTQwMGdldHJlZyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByZWducikKIHsKIAlvdXRiKChyZWduciArIHBvcnRwLT51YXJ0YWRkciksIHBvcnRwLT5pb2FkZHIpOwogCXJldHVybiBpbmIocG9ydHAtPmlvYWRkciArIEVSRUdfREFUQSk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwc2V0cmVnKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpCiB7Ci0Jb3V0YigocmVnbnIgKyBwb3J0cC0+dWFydGFkZHIpLCBwb3J0cC0+aW9hZGRyKTsKKwlvdXRiKHJlZ25yICsgcG9ydHAtPnVhcnRhZGRyLCBwb3J0cC0+aW9hZGRyKTsKIAlvdXRiKHZhbHVlLCBwb3J0cC0+aW9hZGRyICsgRVJFR19EQVRBKTsKIH0KIAotc3RhdGljIGludCBzdGxfY2QxNDAwdXBkYXRlcmVnKHN0bHBvcnRfdCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKQorc3RhdGljIGludCBzdGxfY2QxNDAwdXBkYXRlcmVnKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpCiB7Ci0Jb3V0YigocmVnbnIgKyBwb3J0cC0+dWFydGFkZHIpLCBwb3J0cC0+aW9hZGRyKTsKKwlvdXRiKHJlZ25yICsgcG9ydHAtPnVhcnRhZGRyLCBwb3J0cC0+aW9hZGRyKTsKIAlpZiAoaW5iKHBvcnRwLT5pb2FkZHIgKyBFUkVHX0RBVEEpICE9IHZhbHVlKSB7CiAJCW91dGIodmFsdWUsIHBvcnRwLT5pb2FkZHIgKyBFUkVHX0RBVEEpOwogCQlyZXR1cm4gMTsKQEAgLTMxMDUsMTYgKzI3NTMsMTQgQEAKICAqCWlkZW50aWNhbCB3aGVuIGRlYWxpbmcgd2l0aCBwb3J0cy4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9jZDE0MDBwYW5lbGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCkKK3N0YXRpYyBpbnQgc3RsX2NkMTQwMHBhbmVsaW5pdChzdHJ1Y3Qgc3RsYnJkICpicmRwLCBzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCkKIHsKIAl1bnNpZ25lZCBpbnQJZ2ZyY3I7CiAJaW50CQljaGlwbWFzaywgaSwgajsKIAlpbnQJCW5yY2hpcHMsIHVhcnRhZGRyLCBpb2FkZHI7CiAJdW5zaWduZWQgbG9uZyAgIGZsYWdzOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9wYW5lbGluaXQoYnJkcD0leCxwYW5lbHA9JXgpXG4iLCAoaW50KSBicmRwLCAoaW50KSBwYW5lbHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9wYW5lbGluaXQoYnJkcD0lcCxwYW5lbHA9JXApXG4iLCBicmRwLCBwYW5lbHApOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CiAJQlJERU5BQkxFKHBhbmVscC0+YnJkbnIsIHBhbmVscC0+cGFnZW5yKTsKQEAgLTMxMjQsMTMgKzI3NzAsMTIgQEAKICAqLwogCWNoaXBtYXNrID0gMDsKIAlucmNoaXBzID0gcGFuZWxwLT5ucnBvcnRzIC8gQ0QxNDAwX1BPUlRTOwotCWZvciAoaSA9IDA7IChpIDwgbnJjaGlwcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBucmNoaXBzOyBpKyspIHsKIAkJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VDSFBDSSkgewogCQkJb3V0YigocGFuZWxwLT5wYWdlbnIgKyAoaSA+PiAxKSksIGJyZHAtPmlvY3RybCk7CiAJCQlpb2FkZHIgPSBwYW5lbHAtPmlvYmFzZTsKLQkJfSBlbHNlIHsKKwkJfSBlbHNlCiAJCQlpb2FkZHIgPSBwYW5lbHAtPmlvYmFzZSArIChFUkVHX0JBTktTSVpFICogKGkgPj4gMSkpOwotCQl9CiAJCXVhcnRhZGRyID0gKGkgJiAweDAxKSA/IDB4MDgwIDogMDsKIAkJb3V0YigoR0ZSQ1IgKyB1YXJ0YWRkciksIGlvYWRkcik7CiAJCW91dGIoMCwgKGlvYWRkciArIEVSRUdfREFUQSkpOwpAQCAtMzEzOCwxMCArMjc4MywxMCBAQAogCQlvdXRiKENDUl9SRVNFVEZVTEwsIChpb2FkZHIgKyBFUkVHX0RBVEEpKTsKIAkJb3V0YihDQ1JfUkVTRVRGVUxMLCAoaW9hZGRyICsgRVJFR19EQVRBKSk7CiAJCW91dGIoKEdGUkNSICsgdWFydGFkZHIpLCBpb2FkZHIpOwotCQlmb3IgKGogPSAwOyAoaiA8IENDUl9NQVhXQUlUKTsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCBDQ1JfTUFYV0FJVDsgaisrKQogCQkJaWYgKChnZnJjciA9IGluYihpb2FkZHIgKyBFUkVHX0RBVEEpKSAhPSAwKQogCQkJCWJyZWFrOwotCQl9CisKIAkJaWYgKChqID49IENDUl9NQVhXQUlUKSB8fCAoZ2ZyY3IgPCAweDQwKSB8fCAoZ2ZyY3IgPiAweDYwKSkgewogCQkJcHJpbnRrKCJTVEFMTElPTjogY2QxNDAwIG5vdCByZXNwb25kaW5nLCAiCiAJCQkJImJyZD0lZCBwYW5lbD0lZCBjaGlwPSVkXG4iLApAQCAtMzE2NCwxNiArMjgwOSwxNCBAQAogICoJSW5pdGlhbGl6ZSBoYXJkd2FyZSBzcGVjaWZpYyBwb3J0IHJlZ2lzdGVycy4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxfY2QxNDAwcG9ydGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCwgc3RscG9ydF90ICpwb3J0cCkKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBwb3J0aW5pdChzdHJ1Y3Qgc3RsYnJkICpicmRwLCBzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgc3RydWN0IHN0bHBvcnQgKnBvcnRwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9jZDE0MDBwb3J0aW5pdChicmRwPSV4LHBhbmVscD0leCxwb3J0cD0leClcbiIsCi0JCShpbnQpIGJyZHAsIChpbnQpIHBhbmVscCwgKGludCkgcG9ydHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBwb3J0aW5pdChicmRwPSVwLHBhbmVscD0lcCxwb3J0cD0lcClcbiIsIGJyZHAsCisJCQlwYW5lbHAsIHBvcnRwKTsKIAotCWlmICgoYnJkcCA9PSAoc3RsYnJkX3QgKikgTlVMTCkgfHwgKHBhbmVscCA9PSAoc3RscGFuZWxfdCAqKSBOVUxMKSB8fAotCSAgICAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKSkKKwlpZiAoKGJyZHAgPT0gTlVMTCkgfHwgKHBhbmVscCA9PSBOVUxMKSB8fAorCSAgICAocG9ydHAgPT0gTlVMTCkpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZicmRfbG9jaywgZmxhZ3MpOwpAQCAtMzE5NywxNSArMjg0MCwxMyBAQAogICoJc2luY2UgaXQgd29uJ3QgdXN1YWxseSB0YWtlIHRvbyBsb25nIHRvIGJlIHJlYWR5LgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBjY3J3YWl0KHN0bHBvcnRfdCAqcG9ydHApCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwY2Nyd2FpdChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApCiB7CiAJaW50CWk7CiAKLQlmb3IgKGkgPSAwOyAoaSA8IENDUl9NQVhXQUlUKTsgaSsrKSB7Ci0JCWlmIChzdGxfY2QxNDAwZ2V0cmVnKHBvcnRwLCBDQ1IpID09IDApIHsKKwlmb3IgKGkgPSAwOyBpIDwgQ0NSX01BWFdBSVQ7IGkrKykKKwkJaWYgKHN0bF9jZDE0MDBnZXRyZWcocG9ydHAsIENDUikgPT0gMCkKIAkJCXJldHVybjsKLQkJfQotCX0KIAogCXByaW50aygiU1RBTExJT046IGNkMTQwMCBub3QgcmVzcG9uZGluZywgcG9ydD0lZCBwYW5lbD0lZCBicmQ9JWRcbiIsCiAJCXBvcnRwLT5wb3J0bnIsIHBvcnRwLT5wYW5lbG5yLCBwb3J0cC0+YnJkbnIpOwpAQCAtMzIxOCw5ICsyODU5LDkgQEAKICAqCXNldHRpbmdzLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZXRwb3J0KHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCB0ZXJtaW9zICp0aW9zcCkKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZXRwb3J0KHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgc3RydWN0IGt0ZXJtaW9zICp0aW9zcCkKIHsKLQlzdGxicmRfdAkqYnJkcDsKKwlzdHJ1Y3Qgc3RsYnJkCSpicmRwOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJdW5zaWduZWQgaW50CWNsa2RpdiwgYmF1ZHJhdGU7CiAJdW5zaWduZWQgY2hhcgljb3IxLCBjb3IyLCBjb3IzOwpAQCAtMzI0NCw3ICsyODg1LDcgQEAKIAlzcmVyb2ZmID0gMDsKIAogCWJyZHAgPSBzdGxfYnJkc1twb3J0cC0+YnJkbnJdOwotCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCWlmIChicmRwID09IE5VTEwpCiAJCXJldHVybjsKIAogLyoKQEAgLTMzNDEsOCArMjk4Miw4IEBACiAJCWJhdWRyYXRlID0gU1RMX0NEMTQwME1BWEJBVUQ7CiAKIAlpZiAoYmF1ZHJhdGUgPiAwKSB7Ci0JCWZvciAoY2xrID0gMDsgKGNsayA8IENEMTQwMF9OVU1DTEtTKTsgY2xrKyspIHsKLQkJCWNsa2RpdiA9ICgocG9ydHAtPmNsayAvIHN0bF9jZDE0MDBjbGtkaXZzW2Nsa10pIC8gYmF1ZHJhdGUpOworCQlmb3IgKGNsayA9IDA7IGNsayA8IENEMTQwMF9OVU1DTEtTOyBjbGsrKykgeworCQkJY2xrZGl2ID0gKHBvcnRwLT5jbGsgLyBzdGxfY2QxNDAwY2xrZGl2c1tjbGtdKSAvIGJhdWRyYXRlOwogCQkJaWYgKGNsa2RpdiA8IDB4MTAwKQogCQkJCWJyZWFrOwogCQl9CkBAIC0zMzU3LDkgKzI5OTgsOCBAQAogCQltY29yMiB8PSBNQ09SMl9EQ0Q7CiAJCXNyZXJvbiB8PSBTUkVSX01PREVNOwogCQlwb3J0cC0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJcG9ydHAtPmZsYWdzICY9IH5BU1lOQ19DSEVDS19DRDsKLQl9CiAKIC8qCiAgKglTZXR1cCBjZDE0MDAgZW5oYW5jZWQgbW9kZXMgaWYgd2UgY2FuLiBJbiBwYXJ0aWN1bGFyIHdlIHdhbnQgdG8KQEAgLTMzODQsMTggKzMwMjQsMTYgQEAKICAqCXRoZW0gYWxsIHVwLgogICovCiAKLSNpZmRlZiBERUJVRwotCXByaW50aygiU0VUUE9SVDogcG9ydG5yPSVkIHBhbmVsbnI9JWQgYnJkbnI9JWRcbiIsCisJcHJfZGVidWcoIlNFVFBPUlQ6IHBvcnRucj0lZCBwYW5lbG5yPSVkIGJyZG5yPSVkXG4iLAogCQlwb3J0cC0+cG9ydG5yLCBwb3J0cC0+cGFuZWxuciwgcG9ydHAtPmJyZG5yKTsKLQlwcmludGsoIiAgICBjb3IxPSV4IGNvcjI9JXggY29yMz0leCBjb3I0PSV4IGNvcjU9JXhcbiIsCisJcHJfZGVidWcoIiAgICBjb3IxPSV4IGNvcjI9JXggY29yMz0leCBjb3I0PSV4IGNvcjU9JXhcbiIsCiAJCWNvcjEsIGNvcjIsIGNvcjMsIGNvcjQsIGNvcjUpOwotCXByaW50aygiICAgIG1jb3IxPSV4IG1jb3IyPSV4IHJ0cHI9JXggc3Jlcm9uPSV4IHNyZXJvZmY9JXhcbiIsCisJcHJfZGVidWcoIiAgICBtY29yMT0leCBtY29yMj0leCBydHByPSV4IHNyZXJvbj0leCBzcmVyb2ZmPSV4XG4iLAogCQltY29yMSwgbWNvcjIsIHJ0cHIsIHNyZXJvbiwgc3Jlcm9mZik7Ci0JcHJpbnRrKCIgICAgdGNvcj0leCB0YnByPSV4IHJjb3I9JXggcmJwcj0leFxuIiwgY2xrLCBkaXYsIGNsaywgZGl2KTsKLQlwcmludGsoIiAgICBzY2hyMT0leCBzY2hyMj0leCBzY2hyMz0leCBzY2hyND0leFxuIiwKKwlwcl9kZWJ1ZygiICAgIHRjb3I9JXggdGJwcj0leCByY29yPSV4IHJicHI9JXhcbiIsIGNsaywgZGl2LCBjbGssIGRpdik7CisJcHJfZGVidWcoIiAgICBzY2hyMT0leCBzY2hyMj0leCBzY2hyMz0leCBzY2hyND0leFxuIiwKIAkJdGlvc3AtPmNfY2NbVlNUQVJUXSwgdGlvc3AtPmNfY2NbVlNUT1BdLAogCQl0aW9zcC0+Y19jY1tWU1RBUlRdLCB0aW9zcC0+Y19jY1tWU1RPUF0pOwotI2VuZGlmCiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnJkX2xvY2ssIGZsYWdzKTsKIAlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKQEAgLTM0NDMsMTUgKzMwODEsMTMgQEAKICAqCVNldCB0aGUgc3RhdGUgb2YgdGhlIERUUiBhbmQgUlRTIHNpZ25hbHMuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsX2NkMTQwMHNldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cykKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZXRzaWduYWxzKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cykKIHsKIAl1bnNpZ25lZCBjaGFyCW1zdnIxLCBtc3ZyMjsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9jZDE0MDBzZXRzaWduYWxzKHBvcnRwPSV4LGR0cj0lZCxydHM9JWQpXG4iLAotCQkoaW50KSBwb3J0cCwgZHRyLCBydHMpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBzZXRzaWduYWxzKHBvcnRwPSVwLGR0cj0lZCxydHM9JWQpXG4iLAorCQkJcG9ydHAsIGR0ciwgcnRzKTsKIAogCW1zdnIxID0gMDsKIAltc3ZyMiA9IDA7CkBAIC0zNDc3LDE1ICszMTEzLDEzIEBACiAgKglSZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBzaWduYWxzLgogICovCiAKLXN0YXRpYyBpbnQgc3RsX2NkMTQwMGdldHNpZ25hbHMoc3RscG9ydF90ICpwb3J0cCkKK3N0YXRpYyBpbnQgc3RsX2NkMTQwMGdldHNpZ25hbHMoc3RydWN0IHN0bHBvcnQgKnBvcnRwKQogewogCXVuc2lnbmVkIGNoYXIJbXN2cjEsIG1zdnIyOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJaW50CQlzaWdzOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9jZDE0MDBnZXRzaWduYWxzKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBnZXRzaWduYWxzKHBvcnRwPSVwKVxuIiwgcG9ydHApOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CiAJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CkBAIC0zNTE1LDE1ICszMTQ5LDEzIEBACiAgKglFbmFibGUvRGlzYWJsZSB0aGUgVHJhbnNtaXR0ZXIgYW5kL29yIFJlY2VpdmVyLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBlbmFibGVyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KQorc3RhdGljIHZvaWQgc3RsX2NkMTQwMGVuYWJsZXJ4dHgoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgcngsIGludCB0eCkKIHsKIAl1bnNpZ25lZCBjaGFyCWNjcjsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9jZDE0MDBlbmFibGVyeHR4KHBvcnRwPSV4LHJ4PSVkLHR4PSVkKVxuIiwKLQkJKGludCkgcG9ydHAsIHJ4LCB0eCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2NkMTQwMGVuYWJsZXJ4dHgocG9ydHA9JXAscng9JWQsdHg9JWQpXG4iLCBwb3J0cCwgcngsIHR4KTsKKwogCWNjciA9IDA7CiAKIAlpZiAodHggPT0gMCkKQEAgLTM1NTEsMTUgKzMxODMsMTIgQEAKICAqCVN0YXJ0L3N0b3AgdGhlIFRyYW5zbWl0dGVyIGFuZC9vciBSZWNlaXZlci4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxfY2QxNDAwc3RhcnRyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KQorc3RhdGljIHZvaWQgc3RsX2NkMTQwMHN0YXJ0cnh0eChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByeCwgaW50IHR4KQogewogCXVuc2lnbmVkIGNoYXIJc3Jlcm9uLCBzcmVyb2ZmOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX2NkMTQwMHN0YXJ0cnh0eChwb3J0cD0leCxyeD0lZCx0eD0lZClcbiIsCi0JCShpbnQpIHBvcnRwLCByeCwgdHgpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBzdGFydHJ4dHgocG9ydHA9JXAscng9JWQsdHg9JWQpXG4iLCBwb3J0cCwgcngsIHR4KTsKIAogCXNyZXJvbiA9IDA7CiAJc3Jlcm9mZiA9IDA7CkBAIC0zNTkxLDEzICszMjIwLDEyIEBACiAgKglEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGZyb20gdGhpcyBwb3J0LgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBkaXNhYmxlaW50cnMoc3RscG9ydF90ICpwb3J0cCkKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBkaXNhYmxlaW50cnMoc3RydWN0IHN0bHBvcnQgKnBvcnRwKQogewogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX2NkMTQwMGRpc2FibGVpbnRycyhwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfY2QxNDAwZGlzYWJsZWludHJzKHBvcnRwPSVwKVxuIiwgcG9ydHApOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CiAJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CiAJc3RsX2NkMTQwMHNldHJlZyhwb3J0cCwgQ0FSLCAocG9ydHAtPnBvcnRuciAmIDB4MDMpKTsKQEAgLTM2MDgsMTMgKzMyMzYsMTEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBzdGxfY2QxNDAwc2VuZGJyZWFrKHN0bHBvcnRfdCAqcG9ydHAsIGludCBsZW4pCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwc2VuZGJyZWFrKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9jZDE0MDBzZW5kYnJlYWsocG9ydHA9JXgsbGVuPSVkKVxuIiwgKGludCkgcG9ydHAsIGxlbik7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2NkMTQwMHNlbmRicmVhayhwb3J0cD0lcCxsZW49JWQpXG4iLCBwb3J0cCwgbGVuKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZicmRfbG9jaywgZmxhZ3MpOwogCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOwpAQCAtMzYzNSwxOSArMzI2MSwxNyBAQAogICoJVGFrZSBmbG93IGNvbnRyb2wgYWN0aW9ucy4uLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBmbG93Y3RybChzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwZmxvd2N0cmwoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfY2QxNDAwZmxvd2N0cmwocG9ydHA9JXgsc3RhdGU9JXgpXG4iLCAoaW50KSBwb3J0cCwgc3RhdGUpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBmbG93Y3RybChwb3J0cD0lcCxzdGF0ZT0leClcbiIsIHBvcnRwLCBzdGF0ZSk7CiAKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CiAJdHR5ID0gcG9ydHAtPnR0eTsKLQlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CkBAIC0zNjk5LDE5ICszMzIzLDE3IEBACiAgKglTZW5kIGEgZmxvdyBjb250cm9sIGNoYXJhY3Rlci4uLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBzZW5kZmxvdyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgc3RhdGUpCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwc2VuZGZsb3coc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfY2QxNDAwc2VuZGZsb3cocG9ydHA9JXgsc3RhdGU9JXgpXG4iLCAoaW50KSBwb3J0cCwgc3RhdGUpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBzZW5kZmxvdyhwb3J0cD0lcCxzdGF0ZT0leClcbiIsIHBvcnRwLCBzdGF0ZSk7CiAKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CiAJdHR5ID0gcG9ydHAtPnR0eTsKLQlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CkBAIC0zNzM0LDE1ICszMzU2LDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsX2NkMTQwMGZsdXNoKHN0bHBvcnRfdCAqcG9ydHApCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwZmx1c2goc3RydWN0IHN0bHBvcnQgKnBvcnRwKQogewogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX2NkMTQwMGZsdXNoKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBmbHVzaChwb3J0cD0lcClcbiIsIHBvcnRwKTsKIAotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZicmRfbG9jaywgZmxhZ3MpOwpAQCAtMzc2NSwxMyArMzM4NSwxMSBAQAogICoJbWFpbnRhaW5zIHRoZSBidXN5IHBvcnQgZmxhZy4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9jZDE0MDBkYXRhc3RhdGUoc3RscG9ydF90ICpwb3J0cCkKK3N0YXRpYyBpbnQgc3RsX2NkMTQwMGRhdGFzdGF0ZShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApCiB7Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9jZDE0MDBkYXRhc3RhdGUocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX2NkMTQwMGRhdGFzdGF0ZShwb3J0cD0lcClcbiIsIHBvcnRwKTsKIAotCWlmIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpCisJaWYgKHBvcnRwID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIHRlc3RfYml0KEFTWUlfVFhCVVNZLCAmcG9ydHAtPmlzdGF0ZSkgPyAxIDogMDsKQEAgLTM3ODMsMTQgKzM0MDEsMTEgQEAKICAqCUludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGNkMTQwMCBFYXN5SU8gYm9hcmRzLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBlaW9pbnRyKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSkKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBlaW9pbnRyKHN0cnVjdCBzdGxwYW5lbCAqcGFuZWxwLCB1bnNpZ25lZCBpbnQgaW9iYXNlKQogewogCXVuc2lnbmVkIGNoYXIJc3ZydHlwZTsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfY2QxNDAwZWlvaW50cihwYW5lbHA9JXgsaW9iYXNlPSV4KVxuIiwKLQkJKGludCkgcGFuZWxwLCBpb2Jhc2UpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBlaW9pbnRyKHBhbmVscD0lcCxpb2Jhc2U9JXgpXG4iLCBwYW5lbHAsIGlvYmFzZSk7CiAKIAlzcGluX2xvY2soJmJyZF9sb2NrKTsKIAlvdXRiKFNWUlIsIGlvYmFzZSk7CkBAIC0zODE2LDE0ICszNDMxLDExIEBACiAgKglJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBjZDE0MDAgcGFuZWxzLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDBlY2hpbnRyKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSkKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDBlY2hpbnRyKHN0cnVjdCBzdGxwYW5lbCAqcGFuZWxwLCB1bnNpZ25lZCBpbnQgaW9iYXNlKQogewogCXVuc2lnbmVkIGNoYXIJc3ZydHlwZTsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfY2QxNDAwZWNoaW50cihwYW5lbHA9JXgsaW9iYXNlPSV4KVxuIiwgKGludCkgcGFuZWxwLAotCQlpb2Jhc2UpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBlY2hpbnRyKHBhbmVscD0lcCxpb2Jhc2U9JXgpXG4iLCBwYW5lbHAsIGlvYmFzZSk7CiAKIAlvdXRiKFNWUlIsIGlvYmFzZSk7CiAJc3ZydHlwZSA9IGluYihpb2Jhc2UgKyBFUkVHX0RBVEEpOwpAQCAtMzg0NSw3ICszNDU3LDcgQEAKICAqCXRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIGdlbmVyYXRlIHRoZW0gb24gdGhlIGNkMTQwMC4KICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBzdGxfY2QxNDAwYnJlYWtpc3Ioc3RscG9ydF90ICpwb3J0cCwgaW50IGlvYWRkcikKK3N0YXRpYyBpbnQgc3RsX2NkMTQwMGJyZWFraXNyKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IGlvYWRkcikKIHsKIAlpZiAocG9ydHAtPmJya2xlbiA9PSAxKSB7CiAJCW91dGIoKENPUjIgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOwpAQCAtMzg4NywxNiArMzQ5OSwxNCBAQAogICoJYmUgTlVMTCBpZiB0aGUgYnVmZmVyIGhhcyBiZWVuIGZyZWVkLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9jZDE0MDB0eGlzcihzdGxwYW5lbF90ICpwYW5lbHAsIGludCBpb2FkZHIpCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwdHhpc3Ioc3RydWN0IHN0bHBhbmVsICpwYW5lbHAsIGludCBpb2FkZHIpCiB7Ci0Jc3RscG9ydF90CSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkqcG9ydHA7CiAJaW50CQlsZW4sIHN0bGVuOwogCWNoYXIJCSpoZWFkLCAqdGFpbDsKIAl1bnNpZ25lZCBjaGFyCWlvYWNrLCBzcmVyOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9jZDE0MDB0eGlzcihwYW5lbHA9JXgsaW9hZGRyPSV4KVxuIiwgKGludCkgcGFuZWxwLCBpb2FkZHIpOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDB0eGlzcihwYW5lbHA9JXAsaW9hZGRyPSV4KVxuIiwgcGFuZWxwLCBpb2FkZHIpOwogCiAJaW9hY2sgPSBpbmIoaW9hZGRyICsgRVJFR19UWEFDSyk7CiAJaWYgKCgoaW9hY2sgJiBwYW5lbHAtPmFja21hc2spICE9IDApIHx8CkBAIC0zOTM1LDkgKzM1NDUsOSBAQAogCQl9CiAJCW91dGIoc3JlciwgKGlvYWRkciArIEVSRUdfREFUQSkpOwogCX0gZWxzZSB7Ci0JCWxlbiA9IE1JTihsZW4sIENEMTQwMF9UWEZJRk9TSVpFKTsKKwkJbGVuID0gbWluKGxlbiwgQ0QxNDAwX1RYRklGT1NJWkUpOwogCQlwb3J0cC0+c3RhdHMudHh0b3RhbCArPSBsZW47Ci0JCXN0bGVuID0gTUlOKGxlbiwgKChwb3J0cC0+dHguYnVmICsgU1RMX1RYQlVGU0laRSkgLSB0YWlsKSk7CisJCXN0bGVuID0gbWluKGxlbiwgKChwb3J0cC0+dHguYnVmICsgU1RMX1RYQlVGU0laRSkgLSB0YWlsKSk7CiAJCW91dGIoKFREUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CiAJCW91dHNiKChpb2FkZHIgKyBFUkVHX0RBVEEpLCB0YWlsLCBzdGxlbik7CiAJCWxlbiAtPSBzdGxlbjsKQEAgLTM5NjgsMTcgKzM1NzgsMTUgQEAKICAqCXNodXRkb3duIGEgcG9ydCBub3QgaW4gdXNlciBjb250ZXh0LiBOZWVkIHRvIGhhbmRsZSB0aGlzIGNhc2UuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsX2NkMTQwMHJ4aXNyKHN0bHBhbmVsX3QgKnBhbmVscCwgaW50IGlvYWRkcikKK3N0YXRpYyB2b2lkIHN0bF9jZDE0MDByeGlzcihzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgaW50IGlvYWRkcikKIHsKLQlzdGxwb3J0X3QJCSpwb3J0cDsKKwlzdHJ1Y3Qgc3RscG9ydAkJKnBvcnRwOwogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAJdW5zaWduZWQgaW50CQlpb2FjaywgbGVuLCBidWZsZW47CiAJdW5zaWduZWQgY2hhcgkJc3RhdHVzOwogCWNoYXIJCQljaDsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfY2QxNDAwcnhpc3IocGFuZWxwPSV4LGlvYWRkcj0leClcbiIsIChpbnQpIHBhbmVscCwgaW9hZGRyKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfY2QxNDAwcnhpc3IocGFuZWxwPSVwLGlvYWRkcj0leClcbiIsIHBhbmVscCwgaW9hZGRyKTsKIAogCWlvYWNrID0gaW5iKGlvYWRkciArIEVSRUdfUlhBQ0spOwogCWlmICgoaW9hY2sgJiBwYW5lbHAtPmFja21hc2spICE9IDApIHsKQEAgLTM5OTIsMTMgKzM2MDAsMTMgQEAKIAkJb3V0YigoUkRDUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CiAJCWxlbiA9IGluYihpb2FkZHIgKyBFUkVHX0RBVEEpOwogCQlpZiAodHR5ID09IE5VTEwgfHwgKGJ1ZmxlbiA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgbGVuKSkgPT0gMCkgewotCQkJbGVuID0gTUlOKGxlbiwgc2l6ZW9mKHN0bF91bndhbnRlZCkpOworCQkJbGVuID0gbWluKGxlbiwgc2l6ZW9mKHN0bF91bndhbnRlZCkpOwogCQkJb3V0YigoUkRTUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CiAJCQlpbnNiKChpb2FkZHIgKyBFUkVHX0RBVEEpLCAmc3RsX3Vud2FudGVkWzBdLCBsZW4pOwogCQkJcG9ydHAtPnN0YXRzLnJ4bG9zdCArPSBsZW47CiAJCQlwb3J0cC0+c3RhdHMucnh0b3RhbCArPSBsZW47CiAJCX0gZWxzZSB7Ci0JCQlsZW4gPSBNSU4obGVuLCBidWZsZW4pOworCQkJbGVuID0gbWluKGxlbiwgYnVmbGVuKTsKIAkJCWlmIChsZW4gPiAwKSB7CiAJCQkJdW5zaWduZWQgY2hhciAqcHRyOwogCQkJCW91dGIoKFJEU1IgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOwpAQCAtNDAzNSwxOCArMzY0MywxNiBAQAogCQkJCQkJZG9fU0FLKHR0eSk7CiAJCQkJCQlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKIAkJCQkJfQotCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU1RfUEFSSVRZKSB7CisJCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBTVF9QQVJJVFkpCiAJCQkJCXN0YXR1cyA9IFRUWV9QQVJJVFk7Ci0JCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBTVF9GUkFNSU5HKSB7CisJCQkJZWxzZSBpZiAoc3RhdHVzICYgU1RfRlJBTUlORykKIAkJCQkJc3RhdHVzID0gVFRZX0ZSQU1FOwotCQkJCX0gZWxzZSBpZihzdGF0dXMgJiBTVF9PVkVSUlVOKSB7CisJCQkJZWxzZSBpZihzdGF0dXMgJiBTVF9PVkVSUlVOKQogCQkJCQlzdGF0dXMgPSBUVFlfT1ZFUlJVTjsKLQkJCQl9IGVsc2UgeworCQkJCWVsc2UKIAkJCQkJc3RhdHVzID0gMDsKLQkJCQl9Ci0JCQl9IGVsc2UgeworCQkJfSBlbHNlCiAJCQkJc3RhdHVzID0gMDsKLQkJCX0KIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIHN0YXR1cyk7CiAJCQl0dHlfc2NoZWR1bGVfZmxpcCh0dHkpOwogCQl9CkBAIC00MDY4LDE1ICszNjc0LDEzIEBACiAgKglwcm9jZXNzaW5nIHJvdXRpbmUuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsX2NkMTQwMG1kbWlzcihzdGxwYW5lbF90ICpwYW5lbHAsIGludCBpb2FkZHIpCitzdGF0aWMgdm9pZCBzdGxfY2QxNDAwbWRtaXNyKHN0cnVjdCBzdGxwYW5lbCAqcGFuZWxwLCBpbnQgaW9hZGRyKQogewotCXN0bHBvcnRfdAkqcG9ydHA7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRwOwogCXVuc2lnbmVkIGludAlpb2FjazsKIAl1bnNpZ25lZCBjaGFyCW1pc3I7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX2NkMTQwMG1kbWlzcihwYW5lbHA9JXgpXG4iLCAoaW50KSBwYW5lbHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9jZDE0MDBtZG1pc3IocGFuZWxwPSVwKVxuIiwgcGFuZWxwKTsKIAogCWlvYWNrID0gaW5iKGlvYWRkciArIEVSRUdfTURBQ0spOwogCWlmICgoKGlvYWNrICYgcGFuZWxwLT5hY2ttYXNrKSAhPSAwKSB8fApAQCAtNDEwOCwxOSArMzcxMiwxOSBAQAogICoJKE1heWJlIHNob3VsZCBtYWtlIHRoaXMgaW5saW5lLi4uKQogICovCiAKLXN0YXRpYyBpbnQgc3RsX3NjMjYxOThnZXRyZWcoc3RscG9ydF90ICpwb3J0cCwgaW50IHJlZ25yKQorc3RhdGljIGludCBzdGxfc2MyNjE5OGdldHJlZyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByZWducikKIHsKIAlvdXRiKChyZWduciB8IHBvcnRwLT51YXJ0YWRkciksIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOwogCXJldHVybiBpbmIocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpOwogfQogCi1zdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHNldHJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2V0cmVnKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHJlZ25yLCBpbnQgdmFsdWUpCiB7CiAJb3V0YigocmVnbnIgfCBwb3J0cC0+dWFydGFkZHIpLCAocG9ydHAtPmlvYWRkciArIFhQX0FERFIpKTsKIAlvdXRiKHZhbHVlLCAocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpKTsKIH0KIAotc3RhdGljIGludCBzdGxfc2MyNjE5OHVwZGF0ZXJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKK3N0YXRpYyBpbnQgc3RsX3NjMjYxOTh1cGRhdGVyZWcoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKIHsKIAlvdXRiKChyZWduciB8IHBvcnRwLT51YXJ0YWRkciksIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOwogCWlmIChpbmIocG9ydHAtPmlvYWRkciArIFhQX0RBVEEpICE9IHZhbHVlKSB7CkBAIC00MTM2LDE0ICszNzQwLDE0IEBACiAgKglGdW5jdGlvbnMgdG8gZ2V0IGFuZCBzZXQgdGhlIHNjMjYxOTggZ2xvYmFsIHJlZ2lzdGVycy4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9zYzI2MTk4Z2V0Z2xvYnJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIpCitzdGF0aWMgaW50IHN0bF9zYzI2MTk4Z2V0Z2xvYnJlZyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByZWducikKIHsKIAlvdXRiKHJlZ25yLCAocG9ydHAtPmlvYWRkciArIFhQX0FERFIpKTsKIAlyZXR1cm4gaW5iKHBvcnRwLT5pb2FkZHIgKyBYUF9EQVRBKTsKIH0KIAogI2lmIDAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2V0Z2xvYnJlZyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgcmVnbnIsIGludCB2YWx1ZSkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2V0Z2xvYnJlZyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCByZWduciwgaW50IHZhbHVlKQogewogCW91dGIocmVnbnIsIChwb3J0cC0+aW9hZGRyICsgWFBfQUREUikpOwogCW91dGIodmFsdWUsIChwb3J0cC0+aW9hZGRyICsgWFBfREFUQSkpOwpAQCAtNDE1OCwxNSArMzc2MiwxMiBAQAogICoJaWRlbnRpY2FsIHdoZW4gZGVhbGluZyB3aXRoIHBvcnRzLgogICovCiAKLXN0YXRpYyBpbnQgc3RsX3NjMjYxOThwYW5lbGluaXQoc3RsYnJkX3QgKmJyZHAsIHN0bHBhbmVsX3QgKnBhbmVscCkKK3N0YXRpYyBpbnQgc3RsX3NjMjYxOThwYW5lbGluaXQoc3RydWN0IHN0bGJyZCAqYnJkcCwgc3RydWN0IHN0bHBhbmVsICpwYW5lbHApCiB7CiAJaW50CWNoaXBtYXNrLCBpOwogCWludAlucmNoaXBzLCBpb2FkZHI7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3NjMjYxOThwYW5lbGluaXQoYnJkcD0leCxwYW5lbHA9JXgpXG4iLAotCQkoaW50KSBicmRwLCAoaW50KSBwYW5lbHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9zYzI2MTk4cGFuZWxpbml0KGJyZHA9JXAscGFuZWxwPSVwKVxuIiwgYnJkcCwgcGFuZWxwKTsKIAogCUJSREVOQUJMRShwYW5lbHAtPmJyZG5yLCBwYW5lbHAtPnBhZ2Vucik7CiAKQEAgLTQxNzgsNyArMzc3OSw3IEBACiAJaWYgKGJyZHAtPmJyZHR5cGUgPT0gQlJEX0VDSFBDSSkKIAkJb3V0YihwYW5lbHAtPnBhZ2VuciwgYnJkcC0+aW9jdHJsKTsKIAotCWZvciAoaSA9IDA7IChpIDwgbnJjaGlwcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBucmNoaXBzOyBpKyspIHsKIAkJaW9hZGRyID0gcGFuZWxwLT5pb2Jhc2UgKyAoaSAqIDQpOyAKIAkJb3V0YihTQ0NSLCAoaW9hZGRyICsgWFBfQUREUikpOwogCQlvdXRiKENSX1JFU0VUQUxMLCAoaW9hZGRyICsgWFBfREFUQSkpOwpAQCAtNDIwNiwxNSArMzgwNywxMyBAQAogICoJSW5pdGlhbGl6ZSBoYXJkd2FyZSBzcGVjaWZpYyBwb3J0IHJlZ2lzdGVycy4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHBvcnRpbml0KHN0bGJyZF90ICpicmRwLCBzdGxwYW5lbF90ICpwYW5lbHAsIHN0bHBvcnRfdCAqcG9ydHApCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHBvcnRpbml0KHN0cnVjdCBzdGxicmQgKmJyZHAsIHN0cnVjdCBzdGxwYW5lbCAqcGFuZWxwLCBzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApCiB7Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9zYzI2MTk4cG9ydGluaXQoYnJkcD0leCxwYW5lbHA9JXgscG9ydHA9JXgpXG4iLAotCQkoaW50KSBicmRwLCAoaW50KSBwYW5lbHAsIChpbnQpIHBvcnRwKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc2MyNjE5OHBvcnRpbml0KGJyZHA9JXAscGFuZWxwPSVwLHBvcnRwPSVwKVxuIiwgYnJkcCwKKwkJCXBhbmVscCwgcG9ydHApOwogCi0JaWYgKChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKSB8fCAocGFuZWxwID09IChzdGxwYW5lbF90ICopIE5VTEwpIHx8Ci0JICAgIChwb3J0cCA9PSAoc3RscG9ydF90ICopIE5VTEwpKQorCWlmICgoYnJkcCA9PSBOVUxMKSB8fCAocGFuZWxwID09IE5VTEwpIHx8CisJICAgIChwb3J0cCA9PSBOVUxMKSkKIAkJcmV0dXJuOwogCiAJcG9ydHAtPmlvYWRkciA9IHBhbmVscC0+aW9iYXNlICsgKChwb3J0cC0+cG9ydG5yIDwgOCkgPyAwIDogNCk7CkBAIC00MjM0LDkgKzM4MzMsOSBAQAogICoJc2V0dGluZ3MuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsX3NjMjYxOThzZXRwb3J0KHN0bHBvcnRfdCAqcG9ydHAsIHN0cnVjdCB0ZXJtaW9zICp0aW9zcCkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2V0cG9ydChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIHN0cnVjdCBrdGVybWlvcyAqdGlvc3ApCiB7Ci0Jc3RsYnJkX3QJKmJyZHA7CisJc3RydWN0IHN0bGJyZAkqYnJkcDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXVuc2lnbmVkIGludAliYXVkcmF0ZTsKIAl1bnNpZ25lZCBjaGFyCW1yMCwgbXIxLCBtcjIsIGNsazsKQEAgLTQyNTEsNyArMzg1MCw3IEBACiAJaW1yb2ZmID0gMDsKIAogCWJyZHAgPSBzdGxfYnJkc1twb3J0cC0+YnJkbnJdOwotCWlmIChicmRwID09IChzdGxicmRfdCAqKSBOVUxMKQorCWlmIChicmRwID09IE5VTEwpCiAJCXJldHVybjsKIAogLyoKQEAgLTQzMDAsOSArMzg5OSw4IEBACiAJCQltcjEgfD0gKE1SMV9QQVJFTkIgfCBNUjFfUEFST0REKTsKIAkJZWxzZQogCQkJbXIxIHw9IChNUjFfUEFSRU5CIHwgTVIxX1BBUkVWRU4pOwotCX0gZWxzZSB7CisJfSBlbHNlCiAJCW1yMSB8PSBNUjFfUEFSTk9ORTsKLQl9CiAKIAltcjEgfD0gTVIxX0VSUkJMT0NLOwogCkBAIC00MzQyLDEyICszOTQwLDEwIEBACiAJaWYgKGJhdWRyYXRlID4gU1RMX1NDMjYxOThNQVhCQVVEKQogCQliYXVkcmF0ZSA9IFNUTF9TQzI2MTk4TUFYQkFVRDsKIAotCWlmIChiYXVkcmF0ZSA+IDApIHsKLQkJZm9yIChjbGsgPSAwOyAoY2xrIDwgU0MyNjE5OF9OUkJBVURTKTsgY2xrKyspIHsKKwlpZiAoYmF1ZHJhdGUgPiAwKQorCQlmb3IgKGNsayA9IDA7IGNsayA8IFNDMjYxOThfTlJCQVVEUzsgY2xrKyspCiAJCQlpZiAoYmF1ZHJhdGUgPD0gc2MyNjE5OF9iYXVkdGFibGVbY2xrXSkKIAkJCQlicmVhazsKLQkJfQotCX0KIAogLyoKICAqCUNoZWNrIHdoYXQgZm9ybSBvZiBtb2RlbSBzaWduYWxpbmcgaXMgcmVxdWlyZWQgYW5kIHNldCBpdCB1cC4KQEAgLTQzNjksOSArMzk2NSw5IEBACiAJaWYgKHRpb3NwLT5jX2lmbGFnICYgSVhPTikgewogCQltcjAgfD0gTVIwX1NXRlRYIHwgTVIwX1NXRlQ7CiAJCWltcm9uIHw9IElSX1hPTlhPRkY7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJaW1yb2ZmIHw9IElSX1hPTlhPRkY7Ci0JfQorCiAJaWYgKHRpb3NwLT5jX2lmbGFnICYgSVhPRkYpCiAJCW1yMCB8PSBNUjBfU1dGUlg7CiAKQEAgLTQzODUsMTUgKzM5ODEsMTMgQEAKICAqCXRoZW0gYWxsIHVwLgogICovCiAKLSNpZmRlZiBERUJVRwotCXByaW50aygiU0VUUE9SVDogcG9ydG5yPSVkIHBhbmVsbnI9JWQgYnJkbnI9JWRcbiIsCisJcHJfZGVidWcoIlNFVFBPUlQ6IHBvcnRucj0lZCBwYW5lbG5yPSVkIGJyZG5yPSVkXG4iLAogCQlwb3J0cC0+cG9ydG5yLCBwb3J0cC0+cGFuZWxuciwgcG9ydHAtPmJyZG5yKTsKLQlwcmludGsoIiAgICBtcjA9JXggbXIxPSV4IG1yMj0leCBjbGs9JXhcbiIsIG1yMCwgbXIxLCBtcjIsIGNsayk7Ci0JcHJpbnRrKCIgICAgaW9wcj0leCBpbXJvbj0leCBpbXJvZmY9JXhcbiIsIGlvcHIsIGltcm9uLCBpbXJvZmYpOwotCXByaW50aygiICAgIHNjaHIxPSV4IHNjaHIyPSV4IHNjaHIzPSV4IHNjaHI0PSV4XG4iLAorCXByX2RlYnVnKCIgICAgbXIwPSV4IG1yMT0leCBtcjI9JXggY2xrPSV4XG4iLCBtcjAsIG1yMSwgbXIyLCBjbGspOworCXByX2RlYnVnKCIgICAgaW9wcj0leCBpbXJvbj0leCBpbXJvZmY9JXhcbiIsIGlvcHIsIGltcm9uLCBpbXJvZmYpOworCXByX2RlYnVnKCIgICAgc2NocjE9JXggc2NocjI9JXggc2NocjM9JXggc2NocjQ9JXhcbiIsCiAJCXRpb3NwLT5jX2NjW1ZTVEFSVF0sIHRpb3NwLT5jX2NjW1ZTVE9QXSwKIAkJdGlvc3AtPmNfY2NbVlNUQVJUXSwgdGlvc3AtPmNfY2NbVlNUT1BdKTsKLSNlbmRpZgogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CiAJQlJERU5BQkxFKHBvcnRwLT5icmRuciwgcG9ydHAtPnBhZ2Vucik7CkBAIC00NDMxLDE1ICs0MDI1LDEzIEBACiAgKglTZXQgdGhlIHN0YXRlIG9mIHRoZSBEVFIgYW5kIFJUUyBzaWduYWxzLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2V0c2lnbmFscyhzdGxwb3J0X3QgKnBvcnRwLCBpbnQgZHRyLCBpbnQgcnRzKQorc3RhdGljIHZvaWQgc3RsX3NjMjYxOThzZXRzaWduYWxzKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IGR0ciwgaW50IHJ0cykKIHsKIAl1bnNpZ25lZCBjaGFyCWlvcGlvcm9uLCBpb3Bpb3JvZmY7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfc2MyNjE5OHNldHNpZ25hbHMocG9ydHA9JXgsZHRyPSVkLHJ0cz0lZClcbiIsCi0JCShpbnQpIHBvcnRwLCBkdHIsIHJ0cyk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3NjMjYxOThzZXRzaWduYWxzKHBvcnRwPSVwLGR0cj0lZCxydHM9JWQpXG4iLCBwb3J0cCwKKwkJCWR0ciwgcnRzKTsKIAogCWlvcGlvcm9uID0gMDsKIAlpb3Bpb3JvZmYgPSAwOwpAQCAtNDQ2NiwxNSArNDA1OCwxMyBAQAogICoJUmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgc2lnbmFscy4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9zYzI2MTk4Z2V0c2lnbmFscyhzdGxwb3J0X3QgKnBvcnRwKQorc3RhdGljIGludCBzdGxfc2MyNjE5OGdldHNpZ25hbHMoc3RydWN0IHN0bHBvcnQgKnBvcnRwKQogewogCXVuc2lnbmVkIGNoYXIJaXByOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJaW50CQlzaWdzOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9zYzI2MTk4Z2V0c2lnbmFscyhwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc2MyNjE5OGdldHNpZ25hbHMocG9ydHA9JXApXG4iLCBwb3J0cCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnJkX2xvY2ssIGZsYWdzKTsKIAlCUkRFTkFCTEUocG9ydHAtPmJyZG5yLCBwb3J0cC0+cGFnZW5yKTsKQEAgLTQ0OTcsMTUgKzQwODcsMTIgQEAKICAqCUVuYWJsZS9EaXNhYmxlIHRoZSBUcmFuc21pdHRlciBhbmQvb3IgUmVjZWl2ZXIuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsX3NjMjYxOThlbmFibGVyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KQorc3RhdGljIHZvaWQgc3RsX3NjMjYxOThlbmFibGVyeHR4KHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgaW50IHJ4LCBpbnQgdHgpCiB7CiAJdW5zaWduZWQgY2hhcgljY3I7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfc2MyNjE5OGVuYWJsZXJ4dHgocG9ydHA9JXgscng9JWQsdHg9JWQpXG4iLAotCQkoaW50KSBwb3J0cCwgcngsIHR4KTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc2MyNjE5OGVuYWJsZXJ4dHgocG9ydHA9JXAscng9JWQsdHg9JWQpXG4iLCBwb3J0cCwgcngsdHgpOwogCiAJY2NyID0gcG9ydHAtPmNyZW5hYmxlOwogCWlmICh0eCA9PSAwKQpAQCAtNDUzMSwxNSArNDExOCwxMiBAQAogICoJU3RhcnQvc3RvcCB0aGUgVHJhbnNtaXR0ZXIgYW5kL29yIFJlY2VpdmVyLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c3RhcnRyeHR4KHN0bHBvcnRfdCAqcG9ydHAsIGludCByeCwgaW50IHR4KQorc3RhdGljIHZvaWQgc3RsX3NjMjYxOThzdGFydHJ4dHgoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgcngsIGludCB0eCkKIHsKIAl1bnNpZ25lZCBjaGFyCWltcjsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9zYzI2MTk4c3RhcnRyeHR4KHBvcnRwPSV4LHJ4PSVkLHR4PSVkKVxuIiwKLQkJKGludCkgcG9ydHAsIHJ4LCB0eCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3NjMjYxOThzdGFydHJ4dHgocG9ydHA9JXAscng9JWQsdHg9JWQpXG4iLCBwb3J0cCwgcngsIHR4KTsKIAogCWltciA9IHBvcnRwLT5pbXI7CiAJaWYgKHR4ID09IDApCkBAIC00NTY3LDEzICs0MTUxLDExIEBACiAgKglEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGZyb20gdGhpcyBwb3J0LgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4ZGlzYWJsZWludHJzKHN0bHBvcnRfdCAqcG9ydHApCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OGRpc2FibGVpbnRycyhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfc2MyNjE5OGRpc2FibGVpbnRycyhwb3J0cD0leClcbiIsIChpbnQpIHBvcnRwKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc2MyNjE5OGRpc2FibGVpbnRycyhwb3J0cD0lcClcbiIsIHBvcnRwKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZicmRfbG9jaywgZmxhZ3MpOwogCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOwpAQCAtNDU4NSwyMiArNDE2NywyMCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2VuZGJyZWFrKHN0bHBvcnRfdCAqcG9ydHAsIGludCBsZW4pCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHNlbmRicmVhayhzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIGludCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfc2MyNjE5OHNlbmRicmVhayhwb3J0cD0leCxsZW49JWQpXG4iLCAoaW50KSBwb3J0cCwgbGVuKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc2MyNjE5OHNlbmRicmVhayhwb3J0cD0lcCxsZW49JWQpXG4iLCBwb3J0cCwgbGVuKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZicmRfbG9jaywgZmxhZ3MpOwogCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOwogCWlmIChsZW4gPT0gMSkgewogCQlzdGxfc2MyNjE5OHNldHJlZyhwb3J0cCwgU0NDUiwgQ1JfVFhTVEFSVEJSRUFLKTsKIAkJcG9ydHAtPnN0YXRzLnR4YnJlYWtzKys7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJc3RsX3NjMjYxOThzZXRyZWcocG9ydHAsIFNDQ1IsIENSX1RYU1RPUEJSRUFLKTsKLQl9CisKIAlCUkRESVNBQkxFKHBvcnRwLT5icmRucik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnJkX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTQ2MTEsMjAgKzQxOTEsMTggQEAKICAqCVRha2UgZmxvdyBjb250cm9sIGFjdGlvbnMuLi4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxfc2MyNjE5OGZsb3djdHJsKHN0bHBvcnRfdCAqcG9ydHAsIGludCBzdGF0ZSkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4Zmxvd2N0cmwoc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAl1bnNpZ25lZCBjaGFyCQltcjA7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3NjMjYxOThmbG93Y3RybChwb3J0cD0leCxzdGF0ZT0leClcbiIsIChpbnQpIHBvcnRwLCBzdGF0ZSk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3NjMjYxOThmbG93Y3RybChwb3J0cD0lcCxzdGF0ZT0leClcbiIsIHBvcnRwLCBzdGF0ZSk7CiAKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CiAJdHR5ID0gcG9ydHAtPnR0eTsKLQlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CkBAIC00NjgyLDIwICs0MjYwLDE4IEBACiAgKglTZW5kIGEgZmxvdyBjb250cm9sIGNoYXJhY3Rlci4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHNlbmRmbG93KHN0bHBvcnRfdCAqcG9ydHAsIGludCBzdGF0ZSkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4c2VuZGZsb3coc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAl1bnNpZ25lZCBjaGFyCQltcjA7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3NjMjYxOThzZW5kZmxvdyhwb3J0cD0leCxzdGF0ZT0leClcbiIsIChpbnQpIHBvcnRwLCBzdGF0ZSk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3NjMjYxOThzZW5kZmxvdyhwb3J0cD0lcCxzdGF0ZT0leClcbiIsIHBvcnRwLCBzdGF0ZSk7CiAKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CiAJdHR5ID0gcG9ydHAtPnR0eTsKLQlpZiAodHR5ID09IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKQorCWlmICh0dHkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZF9sb2NrLCBmbGFncyk7CkBAIC00NzIzLDE1ICs0Mjk5LDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgc3RsX3NjMjYxOThmbHVzaChzdGxwb3J0X3QgKnBvcnRwKQorc3RhdGljIHZvaWQgc3RsX3NjMjYxOThmbHVzaChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfc2MyNjE5OGZsdXNoKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9zYzI2MTk4Zmx1c2gocG9ydHA9JXApXG4iLCBwb3J0cCk7CiAKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnJkX2xvY2ssIGZsYWdzKTsKQEAgLTQ3NTMsMTYgKzQzMjcsMTQgQEAKICAqCWNoZWNrIHRoZSBwb3J0IHN0YXR1c3kgcmVnaXN0ZXIgdG8gYmUgc3VyZS4KICAqLwogCi1zdGF0aWMgaW50IHN0bF9zYzI2MTk4ZGF0YXN0YXRlKHN0bHBvcnRfdCAqcG9ydHApCitzdGF0aWMgaW50IHN0bF9zYzI2MTk4ZGF0YXN0YXRlKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCkKIHsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXVuc2lnbmVkIGNoYXIJc3I7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygic3RsX3NjMjYxOThkYXRhc3RhdGUocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3NjMjYxOThkYXRhc3RhdGUocG9ydHA9JXApXG4iLCBwb3J0cCk7CiAKLQlpZiAocG9ydHAgPT0gKHN0bHBvcnRfdCAqKSBOVUxMKQorCWlmIChwb3J0cCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAlpZiAodGVzdF9iaXQoQVNZSV9UWEJVU1ksICZwb3J0cC0+aXN0YXRlKSkKIAkJcmV0dXJuIDE7CkBAIC00NzgzLDE4ICs0MzU1LDE2IEBACiAgKgl0byBwcm9jZXNzIGEgY29tbWFuZC4uLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4d2FpdChzdGxwb3J0X3QgKnBvcnRwKQorc3RhdGljIHZvaWQgc3RsX3NjMjYxOTh3YWl0KHN0cnVjdCBzdGxwb3J0ICpwb3J0cCkKIHsKIAlpbnQJaTsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfc2MyNjE5OHdhaXQocG9ydHA9JXgpXG4iLCAoaW50KSBwb3J0cCk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3NjMjYxOTh3YWl0KHBvcnRwPSVwKVxuIiwgcG9ydHApOwogCi0JaWYgKHBvcnRwID09IChzdGxwb3J0X3QgKikgTlVMTCkKKwlpZiAocG9ydHAgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgKGkgPCAyMCk7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykKIAkJc3RsX3NjMjYxOThnZXRnbG9icmVnKHBvcnRwLCBUU1RSKTsKIH0KIApAQCAtNDgwNiw3ICs0Mzc2LDcgQEAKICAqCWF1dG9tYXRpYyBmbG93IGNvbnRyb2wgbW9kZXMgb2YgdGhlIHNjMjYxOTguCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHN0bF9zYzI2MTk4dHh1bmZsb3coc3RscG9ydF90ICpwb3J0cCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4dHh1bmZsb3coc3RydWN0IHN0bHBvcnQgKnBvcnRwLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXVuc2lnbmVkIGNoYXIJbXIwOwogCkBAIC00ODI0LDkgKzQzOTQsOSBAQAogICoJSW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3Igc2MyNjE5OCBwYW5lbHMuCiAgKi8KIAotc3RhdGljIHZvaWQgc3RsX3NjMjYxOThpbnRyKHN0bHBhbmVsX3QgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4aW50cihzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSkKIHsKLQlzdGxwb3J0X3QJKnBvcnRwOworCXN0cnVjdCBzdGxwb3J0CSpwb3J0cDsKIAl1bnNpZ25lZCBpbnQJaWFjazsKIAogCXNwaW5fbG9jaygmYnJkX2xvY2spOwpAQCAtNDg2MiwxNiArNDQzMiwxNCBAQAogICoJYmUgTlVMTCBpZiB0aGUgYnVmZmVyIGhhcyBiZWVuIGZyZWVkLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4dHhpc3Ioc3RscG9ydF90ICpwb3J0cCkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4dHhpc3Ioc3RydWN0IHN0bHBvcnQgKnBvcnRwKQogewogCXVuc2lnbmVkIGludAlpb2FkZHI7CiAJdW5zaWduZWQgY2hhcgltcjA7CiAJaW50CQlsZW4sIHN0bGVuOwogCWNoYXIJCSpoZWFkLCAqdGFpbDsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfc2MyNjE5OHR4aXNyKHBvcnRwPSV4KVxuIiwgKGludCkgcG9ydHApOwotI2VuZGlmCisJcHJfZGVidWcoInN0bF9zYzI2MTk4dHhpc3IocG9ydHA9JXApXG4iLCBwb3J0cCk7CiAKIAlpb2FkZHIgPSBwb3J0cC0+aW9hZGRyOwogCWhlYWQgPSBwb3J0cC0+dHguaGVhZDsKQEAgLTQ4OTYsOSArNDQ2NCw5IEBACiAJCQlvdXRiKG1yMCwgKGlvYWRkciArIFhQX0RBVEEpKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWxlbiA9IE1JTihsZW4sIFNDMjYxOThfVFhGSUZPU0laRSk7CisJCWxlbiA9IG1pbihsZW4sIFNDMjYxOThfVFhGSUZPU0laRSk7CiAJCXBvcnRwLT5zdGF0cy50eHRvdGFsICs9IGxlbjsKLQkJc3RsZW4gPSBNSU4obGVuLCAoKHBvcnRwLT50eC5idWYgKyBTVExfVFhCVUZTSVpFKSAtIHRhaWwpKTsKKwkJc3RsZW4gPSBtaW4obGVuLCAoKHBvcnRwLT50eC5idWYgKyBTVExfVFhCVUZTSVpFKSAtIHRhaWwpKTsKIAkJb3V0YihHVFhGSUZPLCAoaW9hZGRyICsgWFBfQUREUikpOwogCQlvdXRzYigoaW9hZGRyICsgWFBfREFUQSksIHRhaWwsIHN0bGVuKTsKIAkJbGVuIC09IHN0bGVuOwpAQCAtNDkyNSwxNCArNDQ5MywxMiBAQAogICoJc2h1dGRvd24gYSBwb3J0IG5vdCBpbiB1c2VyIGNvbnRleHQuIE5lZWQgdG8gaGFuZGxlIHRoaXMgY2FzZS4KICAqLwogCi1zdGF0aWMgdm9pZCBzdGxfc2MyNjE5OHJ4aXNyKHN0bHBvcnRfdCAqcG9ydHAsIHVuc2lnbmVkIGludCBpYWNrKQorc3RhdGljIHZvaWQgc3RsX3NjMjYxOThyeGlzcihzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIHVuc2lnbmVkIGludCBpYWNrKQogewogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAJdW5zaWduZWQgaW50CQlsZW4sIGJ1ZmxlbiwgaW9hZGRyOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoInN0bF9zYzI2MTk4cnhpc3IocG9ydHA9JXgsaWFjaz0leClcbiIsIChpbnQpIHBvcnRwLCBpYWNrKTsKLSNlbmRpZgorCXByX2RlYnVnKCJzdGxfc2MyNjE5OHJ4aXNyKHBvcnRwPSVwLGlhY2s9JXgpXG4iLCBwb3J0cCwgaWFjayk7CiAKIAl0dHkgPSBwb3J0cC0+dHR5OwogCWlvYWRkciA9IHBvcnRwLT5pb2FkZHI7CkBAIC00OTQxLDEzICs0NTA3LDEzIEBACiAKIAlpZiAoKGlhY2sgJiBJVlJfVFlQRU1BU0spID09IElWUl9SWERBVEEpIHsKIAkJaWYgKHR0eSA9PSBOVUxMIHx8IChidWZsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGxlbikpID09IDApIHsKLQkJCWxlbiA9IE1JTihsZW4sIHNpemVvZihzdGxfdW53YW50ZWQpKTsKKwkJCWxlbiA9IG1pbihsZW4sIHNpemVvZihzdGxfdW53YW50ZWQpKTsKIAkJCW91dGIoR1JYRklGTywgKGlvYWRkciArIFhQX0FERFIpKTsKIAkJCWluc2IoKGlvYWRkciArIFhQX0RBVEEpLCAmc3RsX3Vud2FudGVkWzBdLCBsZW4pOwogCQkJcG9ydHAtPnN0YXRzLnJ4bG9zdCArPSBsZW47CiAJCQlwb3J0cC0+c3RhdHMucnh0b3RhbCArPSBsZW47CiAJCX0gZWxzZSB7Ci0JCQlsZW4gPSBNSU4obGVuLCBidWZsZW4pOworCQkJbGVuID0gbWluKGxlbiwgYnVmbGVuKTsKIAkJCWlmIChsZW4gPiAwKSB7CiAJCQkJdW5zaWduZWQgY2hhciAqcHRyOwogCQkJCW91dGIoR1JYRklGTywgKGlvYWRkciArIFhQX0FERFIpKTsKQEAgLTQ5NjcsOCArNDUzMyw4IEBACiAgKglmbG93IGNvbnRyb2wgbW9kZXMgb2YgdGhlIHNjMjYxOTguCiAgKi8KIAlpZiAodGVzdF9iaXQoQVNZSV9UWEZMT1dFRCwgJnBvcnRwLT5pc3RhdGUpKSB7Ci0JCWlmICgodHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSAmJgotCQkgICAgKHR0eS0+dGVybWlvcyAhPSAoc3RydWN0IHRlcm1pb3MgKikgTlVMTCkgJiYKKwkJaWYgKCh0dHkgIT0gTlVMTCkgJiYKKwkJICAgICh0dHktPnRlcm1pb3MgIT0gTlVMTCkgJiYKIAkJICAgICh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWEFOWSkpIHsKIAkJCXN0bF9zYzI2MTk4dHh1bmZsb3cocG9ydHAsIHR0eSk7CiAJCX0KQEAgLTQ5ODEsNyArNDU0Nyw3IEBACiAgKglQcm9jZXNzIGFuIFJYIGJhZCBjaGFyYWN0ZXIuCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHN0bF9zYzI2MTk4cnhiYWRjaChzdGxwb3J0X3QgKnBvcnRwLCB1bnNpZ25lZCBjaGFyIHN0YXR1cywgY2hhciBjaCkKK3N0YXRpYyB2b2lkIHN0bF9zYzI2MTk4cnhiYWRjaChzdHJ1Y3Qgc3RscG9ydCAqcG9ydHAsIHVuc2lnbmVkIGNoYXIgc3RhdHVzLCBjaGFyIGNoKQogewogCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CiAJdW5zaWduZWQgaW50CQlpb2FkZHI7CkBAIC00OTk4LDcgKzQ1NjQsNyBAQAogCWlmIChzdGF0dXMgJiBTUl9SWEJSRUFLKQogCQlwb3J0cC0+c3RhdHMucnhicmVha3MrKzsKIAotCWlmICgodHR5ICE9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBOVUxMKSAmJgorCWlmICgodHR5ICE9IE5VTEwpICYmCiAJICAgICgocG9ydHAtPnJ4aWdub3JlbXNrICYgc3RhdHVzKSA9PSAwKSkgewogCQlpZiAocG9ydHAtPnJ4bWFya21zayAmIHN0YXR1cykgewogCQkJaWYgKHN0YXR1cyAmIFNSX1JYQlJFQUspIHsKQEAgLTUwMDcsMTggKzQ1NzMsMTYgQEAKIAkJCQkJZG9fU0FLKHR0eSk7CiAJCQkJCUJSREVOQUJMRShwb3J0cC0+YnJkbnIsIHBvcnRwLT5wYWdlbnIpOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU1JfUlhQQVJJVFkpIHsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU1JfUlhQQVJJVFkpCiAJCQkJc3RhdHVzID0gVFRZX1BBUklUWTsKLQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU1JfUlhGUkFNSU5HKSB7CisJCQllbHNlIGlmIChzdGF0dXMgJiBTUl9SWEZSQU1JTkcpCiAJCQkJc3RhdHVzID0gVFRZX0ZSQU1FOwotCQkJfSBlbHNlIGlmKHN0YXR1cyAmIFNSX1JYT1ZFUlJVTikgeworCQkJZWxzZSBpZihzdGF0dXMgJiBTUl9SWE9WRVJSVU4pCiAJCQkJc3RhdHVzID0gVFRZX09WRVJSVU47Ci0JCQl9IGVsc2UgeworCQkJZWxzZQogCQkJCXN0YXR1cyA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7CisJCX0gZWxzZQogCQkJc3RhdHVzID0gMDsKLQkJfQogCiAJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIHN0YXR1cyk7CiAJCXR0eV9zY2hlZHVsZV9mbGlwKHR0eSk7CkBAIC01MDM5LDcgKzQ2MDMsNyBAQAogICoJdGhlIEZJRk8pLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4cnhiYWRjaGFycyhzdGxwb3J0X3QgKnBvcnRwKQorc3RhdGljIHZvaWQgc3RsX3NjMjYxOThyeGJhZGNoYXJzKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCkKIHsKIAl1bnNpZ25lZCBjaGFyCXN0YXR1cywgbXIxOwogCWNoYXIJCWNoOwpAQCAtNTA3MiwxMyArNDYzNiwxMSBAQAogICoJcHJvY2Vzc2luZyB0aW1lLgogICovCiAKLXN0YXRpYyB2b2lkIHN0bF9zYzI2MTk4b3RoZXJpc3Ioc3RscG9ydF90ICpwb3J0cCwgdW5zaWduZWQgaW50IGlhY2spCitzdGF0aWMgdm9pZCBzdGxfc2MyNjE5OG90aGVyaXNyKHN0cnVjdCBzdGxwb3J0ICpwb3J0cCwgdW5zaWduZWQgaW50IGlhY2spCiB7CiAJdW5zaWduZWQgY2hhcgljaXIsIGlwciwgeGlzcjsKIAotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJzdGxfc2MyNjE5OG90aGVyaXNyKHBvcnRwPSV4LGlhY2s9JXgpXG4iLCAoaW50KSBwb3J0cCwgaWFjayk7Ci0jZW5kaWYKKwlwcl9kZWJ1Zygic3RsX3NjMjYxOThvdGhlcmlzcihwb3J0cD0lcCxpYWNrPSV4KVxuIiwgcG9ydHAsIGlhY2spOwogCiAJY2lyID0gc3RsX3NjMjYxOThnZXRnbG9icmVnKHBvcnRwLCBDSVIpOwogCkBAIC01MTExLDQgKzQ2NzMsMTcyIEBACiAJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzdGxfZnJlZV9pc2FicmRzKHZvaWQpCit7CisJc3RydWN0IHN0bGJyZCAqYnJkcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzdGxfbnJicmRzOyBpKyspIHsKKwkJaWYgKChicmRwID0gc3RsX2JyZHNbaV0pID09IE5VTEwgfHwgKGJyZHAtPnN0YXRlICYgU1RMX1BST0JFRCkpCisJCQljb250aW51ZTsKKworCQlmcmVlX2lycShicmRwLT5pcnEsIGJyZHApOworCisJCXN0bF9jbGVhbnVwX3BhbmVscyhicmRwKTsKKworCQlyZWxlYXNlX3JlZ2lvbihicmRwLT5pb2FkZHIxLCBicmRwLT5pb3NpemUxKTsKKwkJaWYgKGJyZHAtPmlvc2l6ZTIgPiAwKQorCQkJcmVsZWFzZV9yZWdpb24oYnJkcC0+aW9hZGRyMiwgYnJkcC0+aW9zaXplMik7CisKKwkJa2ZyZWUoYnJkcCk7CisJCXN0bF9icmRzW2ldID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKglMb2FkYWJsZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gc3R1ZmYuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHN0YWxsaW9uX21vZHVsZV9pbml0KHZvaWQpCit7CisJc3RydWN0IHN0bGJyZAkqYnJkcDsKKwlzdHJ1Y3Qgc3RsY29uZgljb25mOworCXVuc2lnbmVkIGludCBpLCBqOworCWludCByZXR2YWw7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogdmVyc2lvbiAlc1xuIiwgc3RsX2RydnRpdGxlLCBzdGxfZHJ2dmVyc2lvbik7CisKKwlzcGluX2xvY2tfaW5pdCgmc3RhbGxpb25fbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmJyZF9sb2NrKTsKKworLyoKKyAqCUZpbmQgYW55IGR5bmFtaWNhbGx5IHN1cHBvcnRlZCBib2FyZHMuIFRoYXQgaXMgdmlhIG1vZHVsZSBsb2FkCisgKglsaW5lIG9wdGlvbnMuCisgKi8KKwlmb3IgKGkgPSBzdGxfbnJicmRzOyBpIDwgc3RsX25hcmdzOyBpKyspIHsKKwkJbWVtc2V0KCZjb25mLCAwLCBzaXplb2YoY29uZikpOworCQlpZiAoc3RsX3BhcnNlYnJkKCZjb25mLCBzdGxfYnJkc3BbaV0pID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKChicmRwID0gc3RsX2FsbG9jYnJkKCkpID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJYnJkcC0+YnJkbnIgPSBpOworCQlicmRwLT5icmR0eXBlID0gY29uZi5icmR0eXBlOworCQlicmRwLT5pb2FkZHIxID0gY29uZi5pb2FkZHIxOworCQlicmRwLT5pb2FkZHIyID0gY29uZi5pb2FkZHIyOworCQlicmRwLT5pcnEgPSBjb25mLmlycTsKKwkJYnJkcC0+aXJxdHlwZSA9IGNvbmYuaXJxdHlwZTsKKwkJaWYgKHN0bF9icmRpbml0KGJyZHApKQorCQkJa2ZyZWUoYnJkcCk7CisJCWVsc2UgeworCQkJZm9yIChqID0gMDsgaiA8IGJyZHAtPm5ycG9ydHM7IGorKykKKwkJCQl0dHlfcmVnaXN0ZXJfZGV2aWNlKHN0bF9zZXJpYWwsCisJCQkJCWJyZHAtPmJyZG5yICogU1RMX01BWFBPUlRTICsgaiwgTlVMTCk7CisJCQlzdGxfYnJkc1ticmRwLT5icmRucl0gPSBicmRwOworCQkJc3RsX25yYnJkcyA9IGkgKyAxOworCQl9CisJfQorCisJLyogdGhpcyBoYXMgdG8gYmUgX2FmdGVyXyBpc2EgZmluZGluZyBiZWNhdXNlIG9mIGxvY2tpbmcgKi8KKwlyZXR2YWwgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzdGxfcGNpZHJpdmVyKTsKKwlpZiAocmV0dmFsICYmIHN0bF9ucmJyZHMgPT0gMCkKKwkJZ290byBlcnI7CisKKwlzdGxfc2VyaWFsID0gYWxsb2NfdHR5X2RyaXZlcihTVExfTUFYQlJEUyAqIFNUTF9NQVhQT1JUUyk7CisJaWYgKCFzdGxfc2VyaWFsKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3BjaWRyOworCX0KKworLyoKKyAqCVNldCB1cCBhIGNoYXJhY3RlciBkcml2ZXIgZm9yIHBlciBib2FyZCBzdHVmZi4gVGhpcyBpcyBtYWlubHkgdXNlZAorICoJdG8gZG8gc3RhdHMgaW9jdGxzIG9uIHRoZSBwb3J0cy4KKyAqLworCWlmIChyZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIiwgJnN0bF9mc2lvbWVtKSkKKwkJcHJpbnRrKCJTVEFMTElPTjogZmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBib2FyZCBkZXZpY2VcbiIpOworCisJc3RhbGxpb25fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJzdGFsaW9tZW0iKTsKKwlpZiAoSVNfRVJSKHN0YWxsaW9uX2NsYXNzKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKHN0YWxsaW9uX2NsYXNzKTsKKwkJZ290byBlcnJfcmVnOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQljbGFzc19kZXZpY2VfY3JlYXRlKHN0YWxsaW9uX2NsYXNzLCBOVUxMLAorCQkJCSAgICBNS0RFVihTVExfU0lPTUVNTUFKT1IsIGkpLCBOVUxMLAorCQkJCSAgICAic3RhbGlvbWVtJWQiLCBpKTsKKworCXN0bF9zZXJpYWwtPm93bmVyID0gVEhJU19NT0RVTEU7CisJc3RsX3NlcmlhbC0+ZHJpdmVyX25hbWUgPSBzdGxfZHJ2bmFtZTsKKwlzdGxfc2VyaWFsLT5uYW1lID0gInR0eUUiOworCXN0bF9zZXJpYWwtPm1ham9yID0gU1RMX1NFUklBTE1BSk9SOworCXN0bF9zZXJpYWwtPm1pbm9yX3N0YXJ0ID0gMDsKKwlzdGxfc2VyaWFsLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlzdGxfc2VyaWFsLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXN0bF9zZXJpYWwtPmluaXRfdGVybWlvcyA9IHN0bF9kZWZ0ZXJtaW9zOworCXN0bF9zZXJpYWwtPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CisJdHR5X3NldF9vcGVyYXRpb25zKHN0bF9zZXJpYWwsICZzdGxfb3BzKTsKKworCXJldHZhbCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc3RsX3NlcmlhbCk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gcmVnaXN0ZXIgc2VyaWFsIGRyaXZlclxuIik7CisJCWdvdG8gZXJyX2Nsc2RldjsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9jbHNkZXY6CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koc3RhbGxpb25fY2xhc3MsIE1LREVWKFNUTF9TSU9NRU1NQUpPUiwgaSkpOworCWNsYXNzX2Rlc3Ryb3koc3RhbGxpb25fY2xhc3MpOworZXJyX3JlZzoKKwl1bnJlZ2lzdGVyX2NocmRldihTVExfU0lPTUVNTUFKT1IsICJzdGFsaW9tZW0iKTsKKwlwdXRfdHR5X2RyaXZlcihzdGxfc2VyaWFsKTsKK2Vycl9wY2lkcjoKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN0bF9wY2lkcml2ZXIpOworCXN0bF9mcmVlX2lzYWJyZHMoKTsKK2VycjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3RhbGxpb25fbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3RsYnJkICpicmRwOworCXVuc2lnbmVkIGludCBpLCBqOworCWludCByZXR2YWw7CisKKwlwcl9kZWJ1ZygiY2xlYW51cF9tb2R1bGUoKVxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJVbmxvYWRpbmcgJXM6IHZlcnNpb24gJXNcbiIsIHN0bF9kcnZ0aXRsZSwKKwkJc3RsX2RydnZlcnNpb24pOworCisvKgorICoJRnJlZSB1cCBhbGwgYWxsb2NhdGVkIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBwb3J0cy4gVGhpcyBpbmNsdWRlcworICoJbWVtb3J5IGFuZCBpbnRlcnJ1cHRzLiBBcyBwYXJ0IG9mIHRoaXMgcHJvY2VzcyB3ZSB3aWxsIGFsc28gZG8KKyAqCWEgaGFuZ3VwIG9uIGV2ZXJ5IG9wZW4gcG9ydCAtIHRvIHRyeSB0byBmbHVzaCBvdXQgYW55IHByb2Nlc3NlcworICoJaGFuZ2luZyBvbnRvIHBvcnRzLgorICovCisJZm9yIChpID0gMDsgaSA8IHN0bF9ucmJyZHM7IGkrKykgeworCQlpZiAoKGJyZHAgPSBzdGxfYnJkc1tpXSkgPT0gTlVMTCB8fCAoYnJkcC0+c3RhdGUgJiBTVExfUFJPQkVEKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgYnJkcC0+bnJwb3J0czsgaisrKQorCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKHN0bF9zZXJpYWwsCisJCQkJYnJkcC0+YnJkbnIgKiBTVExfTUFYUE9SVFMgKyBqKTsKKwl9CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHN0bF9zZXJpYWwpOworCXB1dF90dHlfZHJpdmVyKHN0bF9zZXJpYWwpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koc3RhbGxpb25fY2xhc3MsIE1LREVWKFNUTF9TSU9NRU1NQUpPUiwgaSkpOworCWlmICgocmV0dmFsID0gdW5yZWdpc3Rlcl9jaHJkZXYoU1RMX1NJT01FTU1BSk9SLCAic3RhbGlvbWVtIikpKQorCQlwcmludGsoIlNUQUxMSU9OOiBmYWlsZWQgdG8gdW4tcmVnaXN0ZXIgc2VyaWFsIG1lbW9yeSBkZXZpY2UsICIKKwkJCSJlcnJubz0lZFxuIiwgLXJldHZhbCk7CisJY2xhc3NfZGVzdHJveShzdGFsbGlvbl9jbGFzcyk7CisKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN0bF9wY2lkcml2ZXIpOworCisJc3RsX2ZyZWVfaXNhYnJkcygpOworfQorCittb2R1bGVfaW5pdChzdGFsbGlvbl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChzdGFsbGlvbl9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkdyZWcgVW5nZXJlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdGFsbGlvbiBNdWx0aXBvcnQgU2VyaWFsIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N4LmMgYi9kcml2ZXJzL2NoYXIvc3guYwppbmRleCA1ZmVjNjI2Li4xZGE5MmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3guYworKysgYi9kcml2ZXJzL2NoYXIvc3guYwpAQCAtMzIsNyArMzIsNiBAQAogICogICAgICBVU0EuCiAgKgogICogUmV2aXNpb24gaGlzdG9yeToKLSAqICRMb2c6IHN4LmMsdiAkCiAgKiBSZXZpc2lvbiAxLjMzICAyMDAwLzAzLzA5IDEwOjAwOjAwICBwdmRsLHdvbGZmCiAgKiAtIEZpeGVkIG1vZHVsZSBhbmQgcG9ydCBjb3VudGluZwogICogLSBGaXhlZCBzaWduYWwgaGFuZGxpbmcKQEAgLTE5OSw5ICsxOTgsNyBAQAogICoKICAqICovCiAKLQotI2RlZmluZSBSQ1NfSUQgIiRJZDogc3guYyx2IDEuMzMgMjAwMC8wMy8wOCAxMDowMTowMiB3b2xmZiwgcHZkbCBFeHAgJCIKLSNkZWZpbmUgUkNTX1JFViAiJFJldmlzaW9uOiAxLjMzICQiCisjZGVmaW5lIFNYX1ZFUlNJT04JMS4zMwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CkBAIC0yMTcsNiArMjE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTI0MCw3ICsyMzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2dlbmVyaWNfc2VyaWFsLmg+CiAjaW5jbHVkZSAic3guaCIKIAotCiAvKiBJIGRvbid0IHRoaW5rIHRoYXQgdGhpcyBkcml2ZXIgY2FuIGhhbmRsZSBtb3JlIHRoYW4gMjU2IHBvcnRzIG9uCiAgICBvbmUgbWFjaGluZS4gWW91J2xsIGhhdmUgdG8gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBib2FyZHMgaW4gc3guaAogICAgaWYgeW91IHdhbnQgbW9yZSB0aGFuIDQgYm9hcmRzLiAgKi8KQEAgLTI0OSwyMSArMjQ2LDEyIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzggMHgyMDAwCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzeF9wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfU1hfWElPX0lPOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgMCB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN4X3BjaV90YmwpOwotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQogLyogQ29uZmlndXJhYmxlIG9wdGlvbnM6IAogICAgKERvbid0IGJlIHRvbyBzdXJlIHRoYXQgaXQnbGwgd29yayBpZiB5b3UgdG9nZ2xlIHRoZW0pICovCiAKIC8qIEFtIEkgcGFyYW5vaWQgb3Igbm90ID8gOy0pICovCiAjdW5kZWYgU1hfUEFSQU5PSUFfQ0hFQ0sKIAotCiAvKiAyMCAtPiAyMDAwIHBlciBzZWNvbmQuIFRoZSBjYXJkIHNob3VsZCByYXRlLWxpbWl0IGludGVycnVwdHMgYXQgMTAwCiAgICBIeiwgYnV0IGl0IGlzIHVzZXIgY29uZmlndXJhYmxlLiBJIGRvbid0IHJlY29tbWVuZCBnb2luZyBhYm92ZSAxMDAwCiAgICBIei4gVGhlIGludGVycnVwdCByYXRlbGltaXQgbWlnaHQgdHJpZ2dlciBpZiB0aGUgaW50ZXJydXB0IGlzCkBAIC0yNzcsNyArMjY1LDYgQEAKICAgIGludGVycnVwdC4gVXNlIHBvbGxpbmcuICovCiAjdW5kZWYgSVJRX1JBVEVfTElNSVQKIAotCiAjaWYgMAogLyogTm90IGltcGxlbWVudGVkICovCiAvKiAKQEAgLTI4NiwzNSArMjczLDMzIEBACiAgKi8KICNkZWZpbmUgU1hfUkVQT1JUX0ZJRk8KICNkZWZpbmUgU1hfUkVQT1JUX09WRVJSVU4KLSNlbmRpZiAKLQorI2VuZGlmCiAKIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIHN4X2Rpc2FibGVfdHhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAotc3RhdGljIHZvaWQgc3hfZW5hYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpOyAKLXN0YXRpYyB2b2lkIHN4X2Rpc2FibGVfcnhfaW50ZXJydXB0cyAodm9pZCAqIHB0cik7IAotc3RhdGljIHZvaWQgc3hfZW5hYmxlX3J4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpOyAKLXN0YXRpYyBpbnQgIHN4X2dldF9DRCAodm9pZCAqIHB0cik7IAotc3RhdGljIHZvaWQgc3hfc2h1dGRvd25fcG9ydCAodm9pZCAqIHB0cik7Ci1zdGF0aWMgaW50ICBzeF9zZXRfcmVhbF90ZXJtaW9zICh2b2lkICAqcHRyKTsKLXN0YXRpYyB2b2lkIHN4X2Nsb3NlICh2b2lkICAqcHRyKTsKLXN0YXRpYyBpbnQgc3hfY2hhcnNfaW5fYnVmZmVyICh2b2lkICogcHRyKTsKLXN0YXRpYyBpbnQgc3hfaW5pdF9ib2FyZCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCk7Ci1zdGF0aWMgaW50IHN4X2luaXRfcG9ydHN0cnVjdHMgKGludCBuYm9hcmRzLCBpbnQgbnBvcnRzKTsKLXN0YXRpYyBpbnQgc3hfZndfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgc3hfZGlzYWJsZV90eF9pbnRlcnJ1cHRzKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBzeF9lbmFibGVfdHhfaW50ZXJydXB0cyh2b2lkICpwdHIpOworc3RhdGljIHZvaWQgc3hfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzKHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBzeF9lbmFibGVfcnhfaW50ZXJydXB0cyh2b2lkICpwdHIpOworc3RhdGljIGludCBzeF9nZXRfQ0Qodm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkIHN4X3NodXRkb3duX3BvcnQodm9pZCAqcHRyKTsKK3N0YXRpYyBpbnQgc3hfc2V0X3JlYWxfdGVybWlvcyh2b2lkICpwdHIpOworc3RhdGljIHZvaWQgc3hfY2xvc2Uodm9pZCAqcHRyKTsKK3N0YXRpYyBpbnQgc3hfY2hhcnNfaW5fYnVmZmVyKHZvaWQgKnB0cik7CitzdGF0aWMgaW50IHN4X2luaXRfYm9hcmQoc3RydWN0IHN4X2JvYXJkICpib2FyZCk7CitzdGF0aWMgaW50IHN4X2luaXRfcG9ydHN0cnVjdHMoaW50IG5ib2FyZHMsIGludCBucG9ydHMpOworc3RhdGljIGludCBzeF9md19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludCBzeF9pbml0X2RyaXZlcnModm9pZCk7CiAKLQogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzeF9kcml2ZXI7CiAKK3N0YXRpYyBERUZJTkVfTVVURVgoc3hfYm9hcmRzX2xvY2spOwogc3RhdGljIHN0cnVjdCBzeF9ib2FyZCBib2FyZHNbU1hfTkJPQVJEU107CiBzdGF0aWMgc3RydWN0IHN4X3BvcnQgKnN4X3BvcnRzOwogc3RhdGljIGludCBzeF9pbml0aWFsaXplZDsKIHN0YXRpYyBpbnQgc3hfbnBvcnRzOwogc3RhdGljIGludCBzeF9kZWJ1ZzsKIAotCiAvKiBZb3UgY2FuIGhhdmUgdGhlIGRyaXZlciBwb2xsIHlvdXIgY2FyZC4gCiAgICAgLSBTZXQgc3hfcG9sbCB0byAxIHRvIHBvbGwgZXZlcnkgdGltZXIgdGljayAoMTBtcyBvbiBJbnRlbCkuIAogICAgICAgVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGNhcmQgY2Fubm90IHVzZSBhbiBpbnRlcnJ1cHQgZm9yIHNvbWUgcmVhc29uLgpAQCAtMzMzLDI3ICszMTgsMzYgQEAKIAogc3RhdGljIGludCBzeF9tYXhpbnRzID0gMTAwOwogCisjaWZkZWYgQ09ORklHX0lTQQorCiAvKiBUaGVzZSBhcmUgdGhlIG9ubHkgb3BlbiBzcGFjZXMgaW4gbXkgY29tcHV0ZXIuIFlvdXJzIG1heSBoYXZlIG1vcmUKICAgIG9yIGxlc3MuLi4uIC0tIFJFVyAKICAgIGR1aDogQ2FyZCBhdCAweGEwMDAwIGlzIHBvc3NpYmxlIG9uIEhQIE5ldHNlcnZlcj8/IC0tIHB2ZGwKICovCi1zdGF0aWMgaW50IHN4X3Byb2JlX2FkZHJzW109IHsweGMwMDAwLCAweGQwMDAwLCAweGUwMDAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzgwMDAsIDB4ZDgwMDAsIDB4ZTgwMDB9Owotc3RhdGljIGludCBzaV9wcm9iZV9hZGRyc1tdPSB7MHhjMDAwMCwgMHhkMDAwMCwgMHhlMDAwMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGM4MDAwLCAweGQ4MDAwLCAweGU4MDAwLCAweGEwMDAwfTsKLXN0YXRpYyBpbnQgc2kxX3Byb2JlX2FkZHJzW109IHsgMHhkMDAwMH07CitzdGF0aWMgaW50IHN4X3Byb2JlX2FkZHJzW10gPSB7CisJMHhjMDAwMCwgMHhkMDAwMCwgMHhlMDAwMCwKKwkweGM4MDAwLCAweGQ4MDAwLCAweGU4MDAwCit9Oworc3RhdGljIGludCBzaV9wcm9iZV9hZGRyc1tdID0geworCTB4YzAwMDAsIDB4ZDAwMDAsIDB4ZTAwMDAsCisJMHhjODAwMCwgMHhkODAwMCwgMHhlODAwMCwgMHhhMDAwMAorfTsKK3N0YXRpYyBpbnQgc2kxX3Byb2JlX2FkZHJzW10gPSB7CisJMHhkMDAwMAorfTsKIAogI2RlZmluZSBOUl9TWF9BRERSUyBBUlJBWV9TSVpFKHN4X3Byb2JlX2FkZHJzKQogI2RlZmluZSBOUl9TSV9BRERSUyBBUlJBWV9TSVpFKHNpX3Byb2JlX2FkZHJzKQogI2RlZmluZSBOUl9TSTFfQUREUlMgQVJSQVlfU0laRShzaTFfcHJvYmVfYWRkcnMpCiAKK21vZHVsZV9wYXJhbV9hcnJheShzeF9wcm9iZV9hZGRycywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShzaV9wcm9iZV9hZGRycywgaW50LCBOVUxMLCAwKTsKKyNlbmRpZgogCiAvKiBTZXQgdGhlIG1hc2sgdG8gYWxsLW9uZXMuIFRoaXMgYWxhcywgb25seSBzdXBwb3J0cyAzMiBpbnRlcnJ1cHRzLiAKICAgIFNvbWUgYXJjaGl0ZWN0dXJlcyBtYXkgbmVlZCBtb3JlLiAqLwogc3RhdGljIGludCBzeF9pcnFtYXNrID0gLTE7CiAKLW1vZHVsZV9wYXJhbV9hcnJheShzeF9wcm9iZV9hZGRycywgaW50LCBOVUxMLCAwKTsKLW1vZHVsZV9wYXJhbV9hcnJheShzaV9wcm9iZV9hZGRycywgaW50LCBOVUxMLCAwKTsKIG1vZHVsZV9wYXJhbShzeF9wb2xsLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHN4X3Nsb3dwb2xsLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHN4X21heGludHMsIGludCwgMCk7CkBAIC0zNjgsMTMgKzM2MiwxMiBAQAogCXN4X2Rpc2FibGVfcnhfaW50ZXJydXB0cywKIAlzeF9lbmFibGVfcnhfaW50ZXJydXB0cywKIAlzeF9nZXRfQ0QsCi0Jc3hfc2h1dGRvd25fcG9ydCwgCi0Jc3hfc2V0X3JlYWxfdGVybWlvcywgCisJc3hfc2h1dGRvd25fcG9ydCwKKwlzeF9zZXRfcmVhbF90ZXJtaW9zLAogCXN4X2NoYXJzX2luX2J1ZmZlciwKIAlzeF9jbG9zZSwKIH07CiAKLQogLyogCiAgICBUaGlzIGRyaXZlciBjYW4gc3BldyBhIHdob2xlIGxvdCBvZiBkZWJ1Z2dpbmcgb3V0cHV0IGF0IHlvdS4gSWYgeW91CiAgICBuZWVkIG1heGltdW0gcGVyZm9ybWFuY2UsIHlvdSBzaG91bGQgZGlzYWJsZSB0aGUgREVCVUcgZGVmaW5lLiBUbwpAQCAtMzg1LDIzICszNzgsMTcgQEAKICovCiAjZGVmaW5lIERFQlVHCiAKLQogI2lmZGVmIERFQlVHCi0jZGVmaW5lIHN4X2RwcmludGsoZiwgc3RyLi4uKSBpZiAoc3hfZGVidWcgJiBmKSBwcmludGsgKHN0cikKKyNkZWZpbmUgc3hfZHByaW50ayhmLCBzdHIuLi4pCWlmIChzeF9kZWJ1ZyAmIGYpIHByaW50ayAoc3RyKQogI2Vsc2UKLSNkZWZpbmUgc3hfZHByaW50ayhmLCBzdHIuLi4pIC8qIG5vdGhpbmcgKi8KKyNkZWZpbmUgc3hfZHByaW50ayhmLCBzdHIuLi4pCS8qIG5vdGhpbmcgKi8KICNlbmRpZgogCisjZGVmaW5lIGZ1bmNfZW50ZXIoKQlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZMT1csICJzeDogZW50ZXIgJXNcbiIsX19GVU5DVElPTl9fKQorI2RlZmluZSBmdW5jX2V4aXQoKQlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZMT1csICJzeDogZXhpdCAgJXNcbiIsX19GVU5DVElPTl9fKQogCi0KLSNkZWZpbmUgZnVuY19lbnRlcigpIHN4X2RwcmludGsgKFNYX0RFQlVHX0ZMT1csICJzeDogZW50ZXIgJXNcbiIsX19GVU5DVElPTl9fKQotI2RlZmluZSBmdW5jX2V4aXQoKSAgc3hfZHByaW50ayAoU1hfREVCVUdfRkxPVywgInN4OiBleGl0ICAlc1xuIiwgX19GVU5DVElPTl9fKQotCi0jZGVmaW5lIGZ1bmNfZW50ZXIyKCkgc3hfZHByaW50ayAoU1hfREVCVUdfRkxPVywgInN4OiBlbnRlciAlcyAocG9ydCAlZClcbiIsIFwKLQkJCQkJX19GVU5DVElPTl9fLCBwb3J0LT5saW5lKQotCi0KLQorI2RlZmluZSBmdW5jX2VudGVyMigpCXN4X2RwcmludGsoU1hfREVCVUdfRkxPVywgInN4OiBlbnRlciAlcyAocG9ydCAlZClcbiIsIFwKKwkJCQlfX0ZVTkNUSU9OX18sIHBvcnQtPmxpbmUpCiAKIC8qIAogICogIEZpcm13YXJlIGxvYWRlciBkcml2ZXIgc3BlY2lmaWMgcm91dGluZXMKQEAgLTQwOSwzMSArMzk2LDI2IEBACiAgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3hfZndfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmlvY3RsCQk9IHN4X2Z3X2lvY3RsLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5pb2N0bCA9IHN4X2Z3X2lvY3RsLAogfTsKIAogc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHN4X2Z3X2RldmljZSA9IHsKIAlTWENUTF9NSVNDX01JTk9SLCAic3hjdGwiLCAmc3hfZndfZm9wcwogfTsKIAotCi0KLQotCiAjaWZkZWYgU1hfUEFSQU5PSUFfQ0hFQ0sKIAogLyogVGhpcyBkb2Vzbid0IHdvcmsuIFdobydzIHBhcmFub2lkIGFyb3VuZCBoZXJlPyBOb3QgbWUhICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHN4X3BhcmFub2lhX2NoZWNrKHN0cnVjdCBzeF9wb3J0IGNvbnN0ICogcG9ydCwKK3N0YXRpYyBpbmxpbmUgaW50IHN4X3BhcmFub2lhX2NoZWNrKHN0cnVjdCBzeF9wb3J0IGNvbnN0ICpwb3J0LAogCQkJCSAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQogeworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRtYWdpYyA9IEtFUk5fRVJSICJzeDogV2FybmluZzogYmFkIHN4IHBvcnQgbWFnaWMgIgorCQkJIm51bWJlciBmb3IgZGV2aWNlICVzIGluICVzXG4iOworCXN0YXRpYyBjb25zdCBjaGFyICpiYWRpbmZvID0gS0VSTl9FUlIgInN4OiBXYXJuaW5nOiBudWxsIHN4IHBvcnQgZm9yICIKKwkJCSJkZXZpY2UgJXMgaW4gJXNcbiI7CiAKLQlzdGF0aWMgY29uc3QgY2hhciAqYmFkbWFnaWMgPQotCSAgS0VSTl9FUlIgInN4OiBXYXJuaW5nOiBiYWQgc3ggcG9ydCBtYWdpYyBudW1iZXIgZm9yIGRldmljZSAlcyBpbiAlc1xuIjsKLQlzdGF0aWMgY29uc3QgY2hhciAqYmFkaW5mbyA9Ci0JICBLRVJOX0VSUiAic3g6IFdhcm5pbmc6IG51bGwgc3ggcG9ydCBmb3IgZGV2aWNlICVzIGluICVzXG4iOwotIAogCWlmICghcG9ydCkgewogCQlwcmludGsoYmFkaW5mbywgbmFtZSwgcm91dGluZSk7CiAJCXJldHVybiAxOwpAQCAtNDU2LDIzICs0MzgsMjQgQEAKICNkZWZpbmUgVElNRU9VVF8xIDMwCiAjZGVmaW5lIFRJTUVPVVRfMiAxMDAwMDAwCiAKLQogI2lmZGVmIERFQlVHCiBzdGF0aWMgdm9pZCBteV9oZF9pbyh2b2lkIF9faW9tZW0gKnAsIGludCBsZW4pCiB7CiAJaW50IGksIGosIGNoOwogCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkciA9IHA7CiAKLQlmb3IgKGk9MDtpPGxlbjtpKz0xNikgewotCQlwcmludGsgKCIlcCAiLCBhZGRyK2kpOwotCQlmb3IgKGo9MDtqPDE2O2orKykgewotCQkJcHJpbnRrICgiJTAyeCAlcyIsIHJlYWRiKGFkZHIraitpKSwgKGo9PTcpPyIgIjoiIik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxNikgeworCQlwcmludGsoIiVwICIsIGFkZHIgKyBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCXByaW50aygiJTAyeCAlcyIsIHJlYWRiKGFkZHIgKyBqICsgaSksCisJCQkJCShqID09IDcpID8gIiAiIDogIiIpOwogCQl9Ci0JCWZvciAoaj0wO2o8MTY7aisrKSB7Ci0JCQljaCA9IHJlYWRiKGFkZHIraitpKTsKLQkJCXByaW50ayAoIiVjIiwgKGNoIDwgMHgyMCk/Jy4nOigoY2ggPiAweDdmKT8nLic6Y2gpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWNoID0gcmVhZGIoYWRkciArIGogKyBpKTsKKwkJCXByaW50aygiJWMiLCAoY2ggPCAweDIwKSA/ICcuJyA6CisJCQkJCSgoY2ggPiAweDdmKSA/ICcuJyA6IGNoKSk7CiAJCX0KLQkJcHJpbnRrICgiXG4iKTsKKwkJcHJpbnRrKCJcbiIpOwogCX0KIH0KIHN0YXRpYyB2b2lkIG15X2hkKHZvaWQgKnAsIGludCBsZW4pCkBAIC00ODAsNDE5ICs0NjMsNDY4IEBACiAJaW50IGksIGosIGNoOwogCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSBwOwogCi0JZm9yIChpPTA7aTxsZW47aSs9MTYpIHsKLQkJcHJpbnRrICgiJXAgIiwgYWRkcitpKTsKLQkJZm9yIChqPTA7ajwxNjtqKyspIHsKLQkJCXByaW50ayAoIiUwMnggJXMiLCBhZGRyW2oraV0sIChqPT03KT8iICI6IiIpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTYpIHsKKwkJcHJpbnRrKCIlcCAiLCBhZGRyICsgaSk7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlwcmludGsoIiUwMnggJXMiLCBhZGRyW2ogKyBpXSwgKGogPT0gNykgPyAiICIgOiAiIik7CiAJCX0KLQkJZm9yIChqPTA7ajwxNjtqKyspIHsKLQkJCWNoID0gYWRkcltqK2ldOwotCQkJcHJpbnRrICgiJWMiLCAoY2ggPCAweDIwKT8nLic6KChjaCA+IDB4N2YpPycuJzpjaCkpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJY2ggPSBhZGRyW2ogKyBpXTsKKwkJCXByaW50aygiJWMiLCAoY2ggPCAweDIwKSA/ICcuJyA6CisJCQkJCSgoY2ggPiAweDdmKSA/ICcuJyA6IGNoKSk7CiAJCX0KLQkJcHJpbnRrICgiXG4iKTsKKwkJcHJpbnRrKCJcbiIpOwogCX0KIH0KICNlbmRpZgogCi0KLQogLyogVGhpcyBuZWVkcyByZWRvaW5nIGZvciBBbHBoYSAtLSBSRVcgLS0gRG9uZS4gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3N4X2J5dGUgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIGludCBvZmZzZXQsIHU4IGJ5dGUpCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc3hfYnl0ZShzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCBpbnQgb2Zmc2V0LCB1OCBieXRlKQogewotCXdyaXRlYiAoYnl0ZSwgYm9hcmQtPmJhc2Urb2Zmc2V0KTsKKwl3cml0ZWIoYnl0ZSwgYm9hcmQtPmJhc2UgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IHJlYWRfc3hfYnl0ZSAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTggcmVhZF9zeF9ieXRlKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIGludCBvZmZzZXQpCiB7Ci0JcmV0dXJuIHJlYWRiIChib2FyZC0+YmFzZStvZmZzZXQpOworCXJldHVybiByZWFkYihib2FyZC0+YmFzZSArIG9mZnNldCk7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3N4X3dvcmQgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIGludCBvZmZzZXQsIHUxNiB3b3JkKQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3N4X3dvcmQoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG9mZnNldCwgdTE2IHdvcmQpCiB7Ci0Jd3JpdGV3ICh3b3JkLCBib2FyZC0+YmFzZStvZmZzZXQpOworCXdyaXRldyh3b3JkLCBib2FyZC0+YmFzZSArIG9mZnNldCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2IHJlYWRfc3hfd29yZCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTE2IHJlYWRfc3hfd29yZChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCBpbnQgb2Zmc2V0KQogewotCXJldHVybiByZWFkdyAoYm9hcmQtPmJhc2UgKyBvZmZzZXQpOworCXJldHVybiByZWFkdyhib2FyZC0+YmFzZSArIG9mZnNldCk7CiB9CiAKLQotc3RhdGljIGludCBzeF9idXN5X3dhaXRfZXEgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIAotICAgICAgICAgICAgICAgICAgICAgCSAgICBpbnQgb2Zmc2V0LCBpbnQgbWFzaywgaW50IGNvcnJlY3R2YWwpCitzdGF0aWMgaW50IHN4X2J1c3lfd2FpdF9lcShzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLAorCQlpbnQgb2Zmc2V0LCBpbnQgbWFzaywgaW50IGNvcnJlY3R2YWwpCiB7CiAJaW50IGk7CiAKLQlmdW5jX2VudGVyICgpOworCWZ1bmNfZW50ZXIoKTsKIAotCWZvciAoaT0wOyBpIDwgVElNRU9VVF8xIDtpKyspCi0JCWlmICgocmVhZF9zeF9ieXRlIChib2FyZCwgb2Zmc2V0KSAmIG1hc2spID09IGNvcnJlY3R2YWwpIHsKLQkJCWZ1bmNfZXhpdCAoKTsKKwlmb3IgKGkgPSAwOyBpIDwgVElNRU9VVF8xOyBpKyspCisJCWlmICgocmVhZF9zeF9ieXRlKGJvYXJkLCBvZmZzZXQpICYgbWFzaykgPT0gY29ycmVjdHZhbCkgeworCQkJZnVuY19leGl0KCk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCi0JZm9yIChpPTA7IGkgPCBUSU1FT1VUXzIgO2krKykgewotCQlpZiAoKHJlYWRfc3hfYnl0ZSAoYm9hcmQsIG9mZnNldCkgJiBtYXNrKSA9PSBjb3JyZWN0dmFsKSB7Ci0JCQlmdW5jX2V4aXQgKCk7CisJZm9yIChpID0gMDsgaSA8IFRJTUVPVVRfMjsgaSsrKSB7CisJCWlmICgocmVhZF9zeF9ieXRlKGJvYXJkLCBvZmZzZXQpICYgbWFzaykgPT0gY29ycmVjdHZhbCkgeworCQkJZnVuY19leGl0KCk7CiAJCQlyZXR1cm4gMTsKIAkJfQotCQl1ZGVsYXkgKDEpOworCQl1ZGVsYXkoMSk7CiAJfQogCi0JZnVuY19leGl0ICgpOworCWZ1bmNfZXhpdCgpOwogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgc3hfYnVzeV93YWl0X25lcSAoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgCi0gICAgICAgICAgICAgICAgICAgICAgCSAgICAgaW50IG9mZnNldCwgaW50IG1hc2ssIGludCBiYWR2YWwpCitzdGF0aWMgaW50IHN4X2J1c3lfd2FpdF9uZXEoc3RydWN0IHN4X2JvYXJkICpib2FyZCwKKwkJaW50IG9mZnNldCwgaW50IG1hc2ssIGludCBiYWR2YWwpCiB7CiAJaW50IGk7CiAKLQlmdW5jX2VudGVyICgpOworCWZ1bmNfZW50ZXIoKTsKIAotCWZvciAoaT0wOyBpIDwgVElNRU9VVF8xIDtpKyspCi0JCWlmICgocmVhZF9zeF9ieXRlIChib2FyZCwgb2Zmc2V0KSAmIG1hc2spICE9IGJhZHZhbCkgewotCQkJZnVuY19leGl0ICgpOworCWZvciAoaSA9IDA7IGkgPCBUSU1FT1VUXzE7IGkrKykKKwkJaWYgKChyZWFkX3N4X2J5dGUoYm9hcmQsIG9mZnNldCkgJiBtYXNrKSAhPSBiYWR2YWwpIHsKKwkJCWZ1bmNfZXhpdCgpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAotCWZvciAoaT0wOyBpIDwgVElNRU9VVF8yIDtpKyspIHsKLQkJaWYgKChyZWFkX3N4X2J5dGUgKGJvYXJkLCBvZmZzZXQpICYgbWFzaykgIT0gYmFkdmFsKSB7Ci0JCQlmdW5jX2V4aXQgKCk7CisJZm9yIChpID0gMDsgaSA8IFRJTUVPVVRfMjsgaSsrKSB7CisJCWlmICgocmVhZF9zeF9ieXRlKGJvYXJkLCBvZmZzZXQpICYgbWFzaykgIT0gYmFkdmFsKSB7CisJCQlmdW5jX2V4aXQoKTsKIAkJCXJldHVybiAxOwogCQl9Ci0JCXVkZWxheSAoMSk7CisJCXVkZWxheSgxKTsKIAl9CiAKLQlmdW5jX2V4aXQgKCk7CisJZnVuY19leGl0KCk7CiAJcmV0dXJuIDA7CiB9CiAKLQotCiAvKiA1LjYuNCBvZiA2MjEwMDI4IHIyLjMgKi8KLXN0YXRpYyBpbnQgc3hfcmVzZXQgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCitzdGF0aWMgaW50IHN4X3Jlc2V0KHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCiB7Ci0JZnVuY19lbnRlciAoKTsKKwlmdW5jX2VudGVyKCk7CiAKLQlpZiAoSVNfU1hfQk9BUkQgKGJvYXJkKSkgeworCWlmIChJU19TWF9CT0FSRChib2FyZCkpIHsKIAotCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU1hfQ09ORklHLCAwKTsKLQkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNYX1JFU0VULCAxKTsgLyogVmFsdWUgZG9lc24ndCBtYXR0ZXIgKi8KKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU1hfQ09ORklHLCAwKTsKKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU1hfUkVTRVQsIDEpOyAvKiBWYWx1ZSBkb2Vzbid0IG1hdHRlciAqLwogCi0JCWlmICghc3hfYnVzeV93YWl0X2VxIChib2FyZCwgU1hfUkVTRVRfU1RBVFVTLCAxLCAwKSkgewotCQkJcHJpbnRrIChLRVJOX0lORk8gInN4OiBDYXJkIGRvZXNuJ3QgcmVzcG9uZCB0byByZXNldC4uLi5cbiIpOworCQlpZiAoIXN4X2J1c3lfd2FpdF9lcShib2FyZCwgU1hfUkVTRVRfU1RBVFVTLCAxLCAwKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic3g6IENhcmQgZG9lc24ndCByZXNwb25kIHRvICIKKwkJCQkJInJlc2V0Li4uXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfSBlbHNlIGlmIChJU19FSVNBX0JPQVJEKGJvYXJkKSkgewotCQlvdXRiKGJvYXJkLT5pcnE8PDQsIGJvYXJkLT5laXNhX2Jhc2UrMHhjMDIpOworCQlvdXRiKGJvYXJkLT5pcnEgPDwgNCwgYm9hcmQtPmVpc2FfYmFzZSArIDB4YzAyKTsKIAl9IGVsc2UgaWYgKElTX1NJMV9CT0FSRChib2FyZCkpIHsKLQkgICAgICAgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTFfSVNBX1JFU0VULCAgIDApOyAvLyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIKKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kxX0lTQV9SRVNFVCwgMCk7CS8qdmFsdWUgZG9lc24ndCBtYXR0ZXIqLwogCX0gZWxzZSB7CiAJCS8qIEdvcnkgZGV0YWlscyBvZiB0aGUgU0kvSVNBIGJvYXJkICovCi0JCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX1JFU0VULCAgICBTSTJfSVNBX1JFU0VUX1NFVCk7Ci0JCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lSUTExLCAgICBTSTJfSVNBX0lSUTExX0NMRUFSKTsKLQkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSVJRMTIsICAgIFNJMl9JU0FfSVJRMTJfQ0xFQVIpOwotCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JUlExNSwgICAgU0kyX0lTQV9JUlExNV9DTEVBUik7Ci0JCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX0NMRUFSKTsKLQkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSVJRU0VULCAgIFNJMl9JU0FfSVJRU0VUX0NMRUFSKTsKKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kyX0lTQV9SRVNFVCwgU0kyX0lTQV9SRVNFVF9TRVQpOworCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBTSTJfSVNBX0lSUTExLCBTSTJfSVNBX0lSUTExX0NMRUFSKTsKKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kyX0lTQV9JUlExMiwgU0kyX0lTQV9JUlExMl9DTEVBUik7CisJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfSVJRMTUsIFNJMl9JU0FfSVJRMTVfQ0xFQVIpOworCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX0NMRUFSKTsKKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kyX0lTQV9JUlFTRVQsIFNJMl9JU0FfSVJRU0VUX0NMRUFSKTsKIAl9CiAKLQlmdW5jX2V4aXQgKCk7CisJZnVuY19leGl0KCk7CiAJcmV0dXJuIDE7CiB9CiAKLQogLyogVGhpcyBkb2Vzbid0IHdvcmsgb24gbWFjaGluZXMgd2hlcmUgIk5VTEwiIGlzbid0IDAgKi8KIC8qIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSwgc29tZW9uZSB3aWxsIG5lZWQgdG8gd3JpdGUgCiAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGlzLCB3aGljaCB3aWxsIGFtb3VudCB0byBhYm91dCAzIGxpbmVzLiBJIGRvbid0CiAgICB3YW50IHRvIGNvbXBsaWNhdGUgdGhpcyByaWdodCBub3cuIC0tIFJFVwogICAgKFNlZSwgSSBkbyB3cml0ZSBjb21tZW50cyBldmVyeSBub3cgYW5kIHRoZW4gOi0pICovCi0jZGVmaW5lIE9GRlNFVE9GKHN0cmN0LCBlbGVtKSAoKGxvbmcpJigoKHN0cnVjdCBzdHJjdCAqKU5VTEwpLT5lbGVtKSkKKyNkZWZpbmUgT0ZGU0VUT0Yoc3RyY3QsIGVsZW0pCSgobG9uZykmKCgoc3RydWN0IHN0cmN0ICopTlVMTCktPmVsZW0pKQogCi0KLSNkZWZpbmUgQ0hBTl9PRkZTRVQocG9ydCxlbGVtKSAocG9ydC0+Y2hfYmFzZSArIE9GRlNFVE9GIChfU1hDSEFOTkVMLCBlbGVtKSkKLSNkZWZpbmUgTU9EVV9PRkZTRVQoYm9hcmQsYWRkcixlbGVtKSAgICAoYWRkciArIE9GRlNFVE9GIChfU1hNT0RVTEUsIGVsZW0pKQotI2RlZmluZSAgQlJEX09GRlNFVChib2FyZCxlbGVtKSAgICAgICAgICAgICAgICAoT0ZGU0VUT0YgKF9TWENBUkQsIGVsZW0pKQotCisjZGVmaW5lIENIQU5fT0ZGU0VUKHBvcnQsZWxlbSkJKHBvcnQtPmNoX2Jhc2UgKyBPRkZTRVRPRiAoX1NYQ0hBTk5FTCwgZWxlbSkpCisjZGVmaW5lIE1PRFVfT0ZGU0VUKGJvYXJkLGFkZHIsZWxlbSkJKGFkZHIgKyBPRkZTRVRPRiAoX1NYTU9EVUxFLCBlbGVtKSkKKyNkZWZpbmUgIEJSRF9PRkZTRVQoYm9hcmQsZWxlbSkJKE9GRlNFVE9GIChfU1hDQVJELCBlbGVtKSkKIAogI2RlZmluZSBzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgZWxlbSwgdmFsKSBcCi0gICB3cml0ZV9zeF9ieXRlIChwb3J0LT5ib2FyZCwgQ0hBTl9PRkZTRVQgKHBvcnQsIGVsZW0pLCB2YWwpCisJd3JpdGVfc3hfYnl0ZSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBlbGVtKSwgdmFsKQogCiAjZGVmaW5lIHN4X3JlYWRfY2hhbm5lbF9ieXRlKHBvcnQsIGVsZW0pIFwKLSAgIHJlYWRfc3hfYnl0ZSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBlbGVtKSkKKwlyZWFkX3N4X2J5dGUgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgZWxlbSkpCiAKICNkZWZpbmUgc3hfd3JpdGVfY2hhbm5lbF93b3JkKHBvcnQsIGVsZW0sIHZhbCkgXAotICAgd3JpdGVfc3hfd29yZCAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBlbGVtKSwgdmFsKQorCXdyaXRlX3N4X3dvcmQgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgZWxlbSksIHZhbCkKIAogI2RlZmluZSBzeF9yZWFkX2NoYW5uZWxfd29yZChwb3J0LCBlbGVtKSBcCi0gICByZWFkX3N4X3dvcmQgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgZWxlbSkpCi0KKwlyZWFkX3N4X3dvcmQgKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVCAocG9ydCwgZWxlbSkpCiAKICNkZWZpbmUgc3hfd3JpdGVfbW9kdWxlX2J5dGUoYm9hcmQsIGFkZHIsIGVsZW0sIHZhbCkgXAotICAgd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIE1PRFVfT0ZGU0VUIChib2FyZCwgYWRkciwgZWxlbSksIHZhbCkKKwl3cml0ZV9zeF9ieXRlIChib2FyZCwgTU9EVV9PRkZTRVQgKGJvYXJkLCBhZGRyLCBlbGVtKSwgdmFsKQogCiAjZGVmaW5lIHN4X3JlYWRfbW9kdWxlX2J5dGUoYm9hcmQsIGFkZHIsIGVsZW0pIFwKLSAgIHJlYWRfc3hfYnl0ZSAoYm9hcmQsIE1PRFVfT0ZGU0VUIChib2FyZCwgYWRkciwgZWxlbSkpCisJcmVhZF9zeF9ieXRlIChib2FyZCwgTU9EVV9PRkZTRVQgKGJvYXJkLCBhZGRyLCBlbGVtKSkKIAogI2RlZmluZSBzeF93cml0ZV9tb2R1bGVfd29yZChib2FyZCwgYWRkciwgZWxlbSwgdmFsKSBcCi0gICB3cml0ZV9zeF93b3JkIChib2FyZCwgTU9EVV9PRkZTRVQgKGJvYXJkLCBhZGRyLCBlbGVtKSwgdmFsKQorCXdyaXRlX3N4X3dvcmQgKGJvYXJkLCBNT0RVX09GRlNFVCAoYm9hcmQsIGFkZHIsIGVsZW0pLCB2YWwpCiAKICNkZWZpbmUgc3hfcmVhZF9tb2R1bGVfd29yZChib2FyZCwgYWRkciwgZWxlbSkgXAotICAgcmVhZF9zeF93b3JkIChib2FyZCwgTU9EVV9PRkZTRVQgKGJvYXJkLCBhZGRyLCBlbGVtKSkKLQorCXJlYWRfc3hfd29yZCAoYm9hcmQsIE1PRFVfT0ZGU0VUIChib2FyZCwgYWRkciwgZWxlbSkpCiAKICNkZWZpbmUgc3hfd3JpdGVfYm9hcmRfYnl0ZShib2FyZCwgZWxlbSwgdmFsKSBcCi0gICB3cml0ZV9zeF9ieXRlIChib2FyZCwgQlJEX09GRlNFVCAoYm9hcmQsIGVsZW0pLCB2YWwpCisJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIEJSRF9PRkZTRVQgKGJvYXJkLCBlbGVtKSwgdmFsKQogCiAjZGVmaW5lIHN4X3JlYWRfYm9hcmRfYnl0ZShib2FyZCwgZWxlbSkgXAotICAgcmVhZF9zeF9ieXRlIChib2FyZCwgQlJEX09GRlNFVCAoYm9hcmQsIGVsZW0pKQorCXJlYWRfc3hfYnl0ZSAoYm9hcmQsIEJSRF9PRkZTRVQgKGJvYXJkLCBlbGVtKSkKIAogI2RlZmluZSBzeF93cml0ZV9ib2FyZF93b3JkKGJvYXJkLCBlbGVtLCB2YWwpIFwKLSAgIHdyaXRlX3N4X3dvcmQgKGJvYXJkLCBCUkRfT0ZGU0VUIChib2FyZCwgZWxlbSksIHZhbCkKKwl3cml0ZV9zeF93b3JkIChib2FyZCwgQlJEX09GRlNFVCAoYm9hcmQsIGVsZW0pLCB2YWwpCiAKICNkZWZpbmUgc3hfcmVhZF9ib2FyZF93b3JkKGJvYXJkLCBlbGVtKSBcCi0gICByZWFkX3N4X3dvcmQgKGJvYXJkLCBCUkRfT0ZGU0VUIChib2FyZCwgZWxlbSkpCisJcmVhZF9zeF93b3JkIChib2FyZCwgQlJEX09GRlNFVCAoYm9hcmQsIGVsZW0pKQogCi0KLXN0YXRpYyBpbnQgc3hfc3RhcnRfYm9hcmQgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCitzdGF0aWMgaW50IHN4X3N0YXJ0X2JvYXJkKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCiB7Ci0JaWYgKElTX1NYX0JPQVJEIChib2FyZCkpIHsKLQkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNYX0NPTkZJRywgU1hfQ09ORl9CVVNFTik7CisJaWYgKElTX1NYX0JPQVJEKGJvYXJkKSkgeworCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBTWF9DT05GSUcsIFNYX0NPTkZfQlVTRU4pOwogCX0gZWxzZSBpZiAoSVNfRUlTQV9CT0FSRChib2FyZCkpIHsKIAkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kyX0VJU0FfT0ZGLCBTSTJfRUlTQV9WQUwpOwotCQlvdXRiKChib2FyZC0+aXJxPDw0KXw0LCBib2FyZC0+ZWlzYV9iYXNlKzB4YzAyKTsKKwkJb3V0YigoYm9hcmQtPmlycSA8PCA0KSB8IDQsIGJvYXJkLT5laXNhX2Jhc2UgKyAweGMwMik7CiAJfSBlbHNlIGlmIChJU19TSTFfQk9BUkQoYm9hcmQpKSB7Ci0JCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTFfSVNBX1JFU0VUX0NMRUFSLCAwKTsKLQkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMV9JU0FfSU5UQ0wsIDApOworCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBTSTFfSVNBX1JFU0VUX0NMRUFSLCAwKTsKKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kxX0lTQV9JTlRDTCwgMCk7CiAJfSBlbHNlIHsKIAkJLyogRG9uJ3QgYnVnIG1lIGFib3V0IHRoZSBjbGVhcl9zZXQuIAogCQkgICBJIGhhdmVuJ3QgdGhlIGZvZ2dpZXN0IGlkZWEgd2hhdCBpdCdzIGFib3V0IC0tIFJFVyAqLwotCQl3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9SRVNFVCwgICAgU0kyX0lTQV9SRVNFVF9DTEVBUik7Ci0JCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX1NFVCk7CisJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfUkVTRVQsIFNJMl9JU0FfUkVTRVRfQ0xFQVIpOworCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX1NFVCk7CiAJfQogCXJldHVybiAxOwogfQogCiAjZGVmaW5lIFNYX0lSUV9SRUdfVkFMKGJvYXJkKSBcCi0gICAgICAgICgoYm9hcmQtPmZsYWdzICYgU1hfSVNBX0JPQVJEKT8oYm9hcmQtPmlycSA8PCA0KTowKQorCSgoYm9hcmQtPmZsYWdzICYgU1hfSVNBX0JPQVJEKSA/IChib2FyZC0+aXJxIDw8IDQpIDogMCkKIAogLyogTm90ZS4gVGhlIFNYIHJlZ2lzdGVyIGlzIHdyaXRlLW9ubHkuIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byBlbmFibGUgdGhlCiAgICBidXMgdG9vLiBUaGlzIGlzIGEgbm8tb3AsIGlmIHlvdSBkb24ndCBtZXNzIHdpdGggdGhpcyBkcml2ZXIuLi4gKi8KLXN0YXRpYyBpbnQgc3hfc3RhcnRfaW50ZXJydXB0cyAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3N0YXRpYyBpbnQgc3hfc3RhcnRfaW50ZXJydXB0cyhzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKQogewogCiAJLyogRG9uJ3QgY2FsbCB0aGlzIHdpdGggYm9hcmQtPmlycSA9PSAwICovCiAKIAlpZiAoSVNfU1hfQk9BUkQoYm9hcmQpKSB7Ci0JCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTWF9DT05GSUcsIFNYX0lSUV9SRUdfVkFMIChib2FyZCkgfCAKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1hfQ09ORl9CVVNFTiB8IAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWF9DT05GX0hPU1RJUlEpOworCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBTWF9DT05GSUcsIFNYX0lSUV9SRUdfVkFMKGJvYXJkKSB8CisJCQkJU1hfQ09ORl9CVVNFTiB8IFNYX0NPTkZfSE9TVElSUSk7CiAJfSBlbHNlIGlmIChJU19FSVNBX0JPQVJEKGJvYXJkKSkgewotCQlpbmIoYm9hcmQtPmVpc2FfYmFzZSsweGMwMyk7ICAKKwkJaW5iKGJvYXJkLT5laXNhX2Jhc2UgKyAweGMwMyk7CiAJfSBlbHNlIGlmIChJU19TSTFfQk9BUkQoYm9hcmQpKSB7Ci0JICAgICAgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTFfSVNBX0lOVENMLDApOwotCSAgICAgICB3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kxX0lTQV9JTlRDTF9DTEVBUiwwKTsKKwkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kxX0lTQV9JTlRDTCwgMCk7CisJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMV9JU0FfSU5UQ0xfQ0xFQVIsIDApOwogCX0gZWxzZSB7CiAJCXN3aXRjaCAoYm9hcmQtPmlycSkgewotCQljYXNlIDExOndyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lSUTExLCBTSTJfSVNBX0lSUTExX1NFVCk7YnJlYWs7Ci0JCWNhc2UgMTI6d3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSVJRMTIsIFNJMl9JU0FfSVJRMTJfU0VUKTticmVhazsKLQkJY2FzZSAxNTp3cml0ZV9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JUlExNSwgU0kyX0lTQV9JUlExNV9TRVQpO2JyZWFrOwotCQlkZWZhdWx0OnByaW50ayAoS0VSTl9JTkZPICJzeDogU0kvWElPIGNhcmQgZG9lc24ndCBzdXBwb3J0IGludGVycnVwdCAlZC5cbiIsIAotCQkgICAgICAgICAgICAgICAgYm9hcmQtPmlycSk7Ci0JCXJldHVybiAwOworCQljYXNlIDExOgorCQkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kyX0lTQV9JUlExMSwgU0kyX0lTQV9JUlExMV9TRVQpOworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBTSTJfSVNBX0lSUTEyLCBTSTJfSVNBX0lSUTEyX1NFVCk7CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfSVJRMTUsIFNJMl9JU0FfSVJRMTVfU0VUKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAic3g6IFNJL1hJTyBjYXJkIGRvZXNuJ3Qgc3VwcG9ydCAiCisJCQkJCSJpbnRlcnJ1cHQgJWQuXG4iLCBib2FyZC0+aXJxKTsKKwkJCXJldHVybiAwOwogCQl9Ci0JCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX1NFVCk7CisJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfSU5UQ0xFQVIsIFNJMl9JU0FfSU5UQ0xFQVJfU0VUKTsKIAl9CiAKIAlyZXR1cm4gMTsKIH0KIAotCi1zdGF0aWMgaW50IHN4X3NlbmRfY29tbWFuZCAoc3RydWN0IHN4X3BvcnQgKnBvcnQsIAotICAgICAgICAgICAgICAgICAgICAgCSAgICBpbnQgY29tbWFuZCwgaW50IG1hc2ssIGludCBuZXdzdGF0KQorc3RhdGljIGludCBzeF9zZW5kX2NvbW1hbmQoc3RydWN0IHN4X3BvcnQgKnBvcnQsCisJCWludCBjb21tYW5kLCBpbnQgbWFzaywgaW50IG5ld3N0YXQpCiB7Ci0JZnVuY19lbnRlcjIgKCk7Ci0Jd3JpdGVfc3hfYnl0ZSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBoaV9oc3RhdCksIGNvbW1hbmQpOwotCWZ1bmNfZXhpdCAoKTsKLQlyZXR1cm4gc3hfYnVzeV93YWl0X2VxIChwb3J0LT5ib2FyZCwgQ0hBTl9PRkZTRVQgKHBvcnQsIGhpX2hzdGF0KSwgbWFzaywgbmV3c3RhdCk7CisJZnVuY19lbnRlcjIoKTsKKwl3cml0ZV9zeF9ieXRlKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVChwb3J0LCBoaV9oc3RhdCksIGNvbW1hbmQpOworCWZ1bmNfZXhpdCgpOworCXJldHVybiBzeF9idXN5X3dhaXRfZXEocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUKHBvcnQsIGhpX2hzdGF0KSwgbWFzaywKKwkJCW5ld3N0YXQpOwogfQogCi0KLXN0YXRpYyBjaGFyICptb2RfdHlwZV9zIChpbnQgbW9kdWxlX3R5cGUpCitzdGF0aWMgY2hhciAqbW9kX3R5cGVfcyhpbnQgbW9kdWxlX3R5cGUpCiB7CiAJc3dpdGNoIChtb2R1bGVfdHlwZSkgewotCWNhc2UgVEE0OiAgICAgICByZXR1cm4gIlRBNCI7Ci0JY2FzZSBUQTg6ICAgICAgIHJldHVybiAiVEE4IjsKLQljYXNlIFRBNF9BU0lDOiAgcmV0dXJuICJUQTRfQVNJQyI7Ci0JY2FzZSBUQThfQVNJQzogIHJldHVybiAiVEE4X0FTSUMiOwotCWNhc2UgTVRBX0NEMTQwMDpyZXR1cm4gIk1UQV9DRDE0MDAiOwotCWNhc2UgU1hEQzogICAgICByZXR1cm4gIlNYREMiOwotCWRlZmF1bHQ6cmV0dXJuICJVbmtub3duL2ludmFsaWQiOworCWNhc2UgVEE0OgorCQlyZXR1cm4gIlRBNCI7CisJY2FzZSBUQTg6CisJCXJldHVybiAiVEE4IjsKKwljYXNlIFRBNF9BU0lDOgorCQlyZXR1cm4gIlRBNF9BU0lDIjsKKwljYXNlIFRBOF9BU0lDOgorCQlyZXR1cm4gIlRBOF9BU0lDIjsKKwljYXNlIE1UQV9DRDE0MDA6CisJCXJldHVybiAiTVRBX0NEMTQwMCI7CisJY2FzZSBTWERDOgorCQlyZXR1cm4gIlNYREMiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93bi9pbnZhbGlkIjsKIAl9CiB9CiAKLQotc3RhdGljIGNoYXIgKnBhbl90eXBlX3MgKGludCBwYW5fdHlwZSkKK3N0YXRpYyBjaGFyICpwYW5fdHlwZV9zKGludCBwYW5fdHlwZSkKIHsKIAlzd2l0Y2ggKHBhbl90eXBlKSB7Ci0JY2FzZSBNT0RfUlMyMzJEQjI1OiAgICAgcmV0dXJuICJNT0RfUlMyMzJEQjI1IjsKLQljYXNlIE1PRF9SUzIzMlJKNDU6ICAgICByZXR1cm4gIk1PRF9SUzIzMlJKNDUiOwotCWNhc2UgTU9EX1JTNDIyREIyNTogICAgIHJldHVybiAiTU9EX1JTNDIyREIyNSI7Ci0JY2FzZSBNT0RfUEFSQUxMRUw6ICAgICAgcmV0dXJuICJNT0RfUEFSQUxMRUwiOwotCWNhc2UgTU9EXzJfUlMyMzJEQjI1OiAgIHJldHVybiAiTU9EXzJfUlMyMzJEQjI1IjsKLQljYXNlIE1PRF8yX1JTMjMyUko0NTogICByZXR1cm4gIk1PRF8yX1JTMjMyUko0NSI7Ci0JY2FzZSBNT0RfMl9SUzQyMkRCMjU6ICAgcmV0dXJuICJNT0RfMl9SUzQyMkRCMjUiOwotCWNhc2UgTU9EX1JTMjMyREIyNU1BTEU6IHJldHVybiAiTU9EX1JTMjMyREIyNU1BTEUiOwotCWNhc2UgTU9EXzJfUEFSQUxMRUw6ICAgIHJldHVybiAiTU9EXzJfUEFSQUxMRUwiOwotCWNhc2UgTU9EX0JMQU5LOiAgICAgICAgIHJldHVybiAiZW1wdHkiOwotCWRlZmF1bHQ6cmV0dXJuICJpbnZhbGlkIjsKKwljYXNlIE1PRF9SUzIzMkRCMjU6CisJCXJldHVybiAiTU9EX1JTMjMyREIyNSI7CisJY2FzZSBNT0RfUlMyMzJSSjQ1OgorCQlyZXR1cm4gIk1PRF9SUzIzMlJKNDUiOworCWNhc2UgTU9EX1JTNDIyREIyNToKKwkJcmV0dXJuICJNT0RfUlM0MjJEQjI1IjsKKwljYXNlIE1PRF9QQVJBTExFTDoKKwkJcmV0dXJuICJNT0RfUEFSQUxMRUwiOworCWNhc2UgTU9EXzJfUlMyMzJEQjI1OgorCQlyZXR1cm4gIk1PRF8yX1JTMjMyREIyNSI7CisJY2FzZSBNT0RfMl9SUzIzMlJKNDU6CisJCXJldHVybiAiTU9EXzJfUlMyMzJSSjQ1IjsKKwljYXNlIE1PRF8yX1JTNDIyREIyNToKKwkJcmV0dXJuICJNT0RfMl9SUzQyMkRCMjUiOworCWNhc2UgTU9EX1JTMjMyREIyNU1BTEU6CisJCXJldHVybiAiTU9EX1JTMjMyREIyNU1BTEUiOworCWNhc2UgTU9EXzJfUEFSQUxMRUw6CisJCXJldHVybiAiTU9EXzJfUEFSQUxMRUwiOworCWNhc2UgTU9EX0JMQU5LOgorCQlyZXR1cm4gImVtcHR5IjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gImludmFsaWQiOwogCX0KIH0KIAotCi1zdGF0aWMgaW50IG1vZF9jb21wYXRfdHlwZSAoaW50IG1vZHVsZV90eXBlKQorc3RhdGljIGludCBtb2RfY29tcGF0X3R5cGUoaW50IG1vZHVsZV90eXBlKQogewogCXJldHVybiBtb2R1bGVfdHlwZSA+PiA0OwogfQogCiBzdGF0aWMgdm9pZCBzeF9yZWNvbmZpZ3VyZV9wb3J0KHN0cnVjdCBzeF9wb3J0ICpwb3J0KQogewotCWlmIChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaHN0YXQpID09IEhTX0lETEVfT1BFTikgewotCQlpZiAoc3hfc2VuZF9jb21tYW5kIChwb3J0LCBIU19DT05GSUcsIC0xLCBIU19JRExFX09QRU4pICE9IDEpIHsKLQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJzeDogU2VudCByZWNvbmZpZ3VyZSBjb21tYW5kLCBidXQgY2FyZCBkaWRuJ3QgcmVhY3QuXG4iKTsKKwlpZiAoc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfaHN0YXQpID09IEhTX0lETEVfT1BFTikgeworCQlpZiAoc3hfc2VuZF9jb21tYW5kKHBvcnQsIEhTX0NPTkZJRywgLTEsIEhTX0lETEVfT1BFTikgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3g6IFNlbnQgcmVjb25maWd1cmUgY29tbWFuZCwgYnV0ICIKKwkJCQkJImNhcmQgZGlkbid0IHJlYWN0LlxuIik7CiAJCX0KIAl9IGVsc2UgewotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19URVJNSU9TLCAKLQkJICAgICAgICAgICAgInN4OiBOb3Qgc2VuZGluZyByZWNvbmZpZ3VyZTogcG9ydCBpc24ndCBvcGVuICglMDJ4KS5cbiIsIAotCQkgICAgICAgICAgICBzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaHN0YXQpKTsKLQl9CQorCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1RFUk1JT1MsICJzeDogTm90IHNlbmRpbmcgcmVjb25maWd1cmU6ICIKKwkJCQkicG9ydCBpc24ndCBvcGVuICglMDJ4KS5cbiIsCisJCQkJc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfaHN0YXQpKTsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIHN4X3NldHNpZ25hbHMgKHN0cnVjdCBzeF9wb3J0ICpwb3J0LCBpbnQgZHRyLCBpbnQgcnRzKQorc3RhdGljIHZvaWQgc3hfc2V0c2lnbmFscyhzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCwgaW50IGR0ciwgaW50IHJ0cykKIHsKIAlpbnQgdDsKLQlmdW5jX2VudGVyMiAoKTsKKwlmdW5jX2VudGVyMigpOwogCi0JdCA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9vcCk7Ci0JaWYgKGR0ciA+PSAwKSB0ID0gZHRyPyAodCB8IE9QX0RUUik6ICh0ICYgfk9QX0RUUik7Ci0JaWYgKHJ0cyA+PSAwKSB0ID0gcnRzPyAodCB8IE9QX1JUUyk6ICh0ICYgfk9QX1JUUyk7Ci0Jc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9vcCwgdCk7Ci0Jc3hfZHByaW50ayAoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAic2V0c2lnbmFsczogJWQvJWRcbiIsIGR0ciwgcnRzKTsKKwl0ID0gc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfb3ApOworCWlmIChkdHIgPj0gMCkKKwkJdCA9IGR0ciA/ICh0IHwgT1BfRFRSKSA6ICh0ICYgfk9QX0RUUik7CisJaWYgKHJ0cyA+PSAwKQorCQl0ID0gcnRzID8gKHQgfCBPUF9SVFMpIDogKHQgJiB+T1BfUlRTKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfb3AsIHQpOworCXN4X2RwcmludGsoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAic2V0c2lnbmFsczogJWQvJWRcbiIsIGR0ciwgcnRzKTsKIAotCWZ1bmNfZXhpdCAoKTsKKwlmdW5jX2V4aXQoKTsKIH0KIAotCi0KLXN0YXRpYyBpbnQgc3hfZ2V0c2lnbmFscyAoc3RydWN0IHN4X3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IHN4X2dldHNpZ25hbHMoc3RydWN0IHN4X3BvcnQgKnBvcnQpCiB7Ci0JaW50IGlfc3RhdCxvX3N0YXQ7CisJaW50IGlfc3RhdCwgb19zdGF0OwogCi0Jb19zdGF0ID0gc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX29wKTsKLQlpX3N0YXQgPSBzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaXApOworCW9fc3RhdCA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX29wKTsKKwlpX3N0YXQgPSBzeF9yZWFkX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV9pcCk7CiAKLQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJnZXRzaWduYWxzOiAlZC8lZCAgKCVkLyVkKSAlMDJ4LyUwMnhcbiIsCi0JICAgICAgICAgICAgKG9fc3RhdCAmIE9QX0RUUikgIT0gMCwgKG9fc3RhdCAmIE9QX1JUUykgIT0gMCwKLQkgICAgICAgICAgICBwb3J0LT5jX2RjZCwgc3hfZ2V0X0NEIChwb3J0KSwKLQkgICAgICAgICAgICBzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaXApLAotCSAgICAgICAgICAgIHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9zdGF0ZSkpOworCXN4X2RwcmludGsoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiZ2V0c2lnbmFsczogJWQvJWQgICglZC8lZCkgIgorCQkJIiUwMngvJTAyeFxuIiwKKwkJCShvX3N0YXQgJiBPUF9EVFIpICE9IDAsIChvX3N0YXQgJiBPUF9SVFMpICE9IDAsCisJCQlwb3J0LT5jX2RjZCwgc3hfZ2V0X0NEKHBvcnQpLAorCQkJc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfaXApLAorCQkJc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfc3RhdGUpKTsKIAotCXJldHVybiAoKChvX3N0YXQgJiBPUF9EVFIpP1RJT0NNX0RUUjowKSB8Ci0JICAgICAgICAoKG9fc3RhdCAmIE9QX1JUUyk/VElPQ01fUlRTOjApIHwKLQkgICAgICAgICgoaV9zdGF0ICYgSVBfQ1RTKT9USU9DTV9DVFM6MCkgfAotCSAgICAgICAgKChpX3N0YXQgJiBJUF9EQ0QpP1RJT0NNX0NBUjowKSB8Ci0JICAgICAgICAoKGlfc3RhdCAmIElQX0RTUik/VElPQ01fRFNSOjApIHwKLQkgICAgICAgICgoaV9zdGF0ICYgSVBfUkkpP1RJT0NNX1JORzowKQotCSAgICAgICAgKTsKKwlyZXR1cm4gKCgob19zdGF0ICYgT1BfRFRSKSA/IFRJT0NNX0RUUiA6IDApIHwKKwkJKChvX3N0YXQgJiBPUF9SVFMpID8gVElPQ01fUlRTIDogMCkgfAorCQkoKGlfc3RhdCAmIElQX0NUUykgPyBUSU9DTV9DVFMgOiAwKSB8CisJCSgoaV9zdGF0ICYgSVBfRENEKSA/IFRJT0NNX0NBUiA6IDApIHwKKwkJKChpX3N0YXQgJiBJUF9EU1IpID8gVElPQ01fRFNSIDogMCkgfAorCQkoKGlfc3RhdCAmIElQX1JJKSA/IFRJT0NNX1JORyA6IDApKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBzeF9zZXRfYmF1ZCAoc3RydWN0IHN4X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBzeF9zZXRfYmF1ZChzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCkKIHsKIAlpbnQgdDsKIAogCWlmIChwb3J0LT5ib2FyZC0+dGFfdHlwZSA9PSBNT0RfU1hEQykgewogCQlzd2l0Y2ggKHBvcnQtPmdzLmJhdWQpIHsKLQkJICAvKiBTYXZlIHNvbWUgdHlwaW5nIHdvcmsuLi4gKi8KLSNkZWZpbmUgZSh4KSBjYXNlIHg6dD0gQkFVRF8gIyMgeCA7IGJyZWFrCi0JCQllKDUwKTtlKDc1KTtlKDExMCk7ZSgxNTApO2UoMjAwKTtlKDMwMCk7ZSg2MDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZSgxMjAwKTtlKDE4MDApO2UoMjAwMCk7ZSgyNDAwKTtlKDQ4MDApO2UoNzIwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlKDk2MDApO2UoMTQ0MDApO2UoMTkyMDApO2UoMjg4MDApO2UoMzg0MDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZSg1NjAwMCk7ZSg1NzYwMCk7ZSg2NDAwMCk7ZSg3NjgwMCk7ZSgxMTUyMDApOwotCQkJZSgxMjgwMDApO2UoMTUwMDAwKTtlKDIzMDQwMCk7ZSgyNTYwMDApO2UoNDYwODAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUoOTIxNjAwKTsKLQkJY2FzZSAxMzQgICAgOnQgPSBCQVVEXzEzNF81OyAgIGJyZWFrOwotCQljYXNlIDAgICAgICA6dCA9IC0xOwotCQkJCQkJCQkgYnJlYWs7CisJCQkvKiBTYXZlIHNvbWUgdHlwaW5nIHdvcmsuLi4gKi8KKyNkZWZpbmUgZSh4KSBjYXNlIHg6IHQgPSBCQVVEXyAjIyB4OyBicmVhaworCQkJZSg1MCk7CisJCQllKDc1KTsKKwkJCWUoMTEwKTsKKwkJCWUoMTUwKTsKKwkJCWUoMjAwKTsKKwkJCWUoMzAwKTsKKwkJCWUoNjAwKTsKKwkJCWUoMTIwMCk7CisJCQllKDE4MDApOworCQkJZSgyMDAwKTsKKwkJCWUoMjQwMCk7CisJCQllKDQ4MDApOworCQkJZSg3MjAwKTsKKwkJCWUoOTYwMCk7CisJCQllKDE0NDAwKTsKKwkJCWUoMTkyMDApOworCQkJZSgyODgwMCk7CisJCQllKDM4NDAwKTsKKwkJCWUoNTYwMDApOworCQkJZSg1NzYwMCk7CisJCQllKDY0MDAwKTsKKwkJCWUoNzY4MDApOworCQkJZSgxMTUyMDApOworCQkJZSgxMjgwMDApOworCQkJZSgxNTAwMDApOworCQkJZSgyMzA0MDApOworCQkJZSgyNTYwMDApOworCQkJZSg0NjA4MDApOworCQkJZSg5MjE2MDApOworCQljYXNlIDEzNDoKKwkJCXQgPSBCQVVEXzEzNF81OworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCXQgPSAtMTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogQ2FuIEkgcmV0dXJuICJpbnZhbGlkIj8gKi8KIAkJCXQgPSBCQVVEXzk2MDA7Ci0JCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IHVuc3VwcG9ydGVkIGJhdWQgcmF0ZTogJWQuXG4iLCBwb3J0LT5ncy5iYXVkKTsKKwkJCXByaW50ayhLRVJOX0lORk8gInN4OiB1bnN1cHBvcnRlZCBiYXVkIHJhdGU6ICVkLlxuIiwKKwkJCQkJcG9ydC0+Z3MuYmF1ZCk7CiAJCQlicmVhazsKIAkJfQogI3VuZGVmIGUKIAkJaWYgKHQgPiAwKSB7Ci0JCQkvKiBUaGUgYmF1ZCByYXRlIGlzIG5vdCBzZXQgdG8gMCwgc28gd2UncmUgZW5hYmVsaW5nIERUUi4uLiAtLSBSRVcgKi8KLQkJCXN4X3NldHNpZ25hbHMgKHBvcnQsIDEsIC0xKTsgCisvKiBUaGUgYmF1ZCByYXRlIGlzIG5vdCBzZXQgdG8gMCwgc28gd2UncmUgZW5hYmVsaW5nIERUUi4uLiAtLSBSRVcgKi8KKwkJCXN4X3NldHNpZ25hbHMocG9ydCwgMSwgLTEpOwogCQkJLyogWFhYIFRoaXMgaXMgbm90IFRBICYgTVRBIGNvbXBhdGlibGUgKi8KLQkJCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfY3NyLCAweGZmKTsKKwkJCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV9jc3IsIDB4ZmYpOwogCi0JCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4YmF1ZCwgdCk7Ci0JCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3J4YmF1ZCwgdCk7CisJCQlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfdHhiYXVkLCB0KTsKKwkJCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV9yeGJhdWQsIHQpOwogCQl9IGVsc2UgewotCQkJc3hfc2V0c2lnbmFscyAocG9ydCwgMCwgLTEpOworCQkJc3hfc2V0c2lnbmFscyhwb3J0LCAwLCAtMSk7CiAJCX0KIAl9IGVsc2UgewogCQlzd2l0Y2ggKHBvcnQtPmdzLmJhdWQpIHsKLSNkZWZpbmUgZSh4KSBjYXNlIHg6dD0gQ1NSXyAjIyB4IDsgYnJlYWsKLQkJCWUoNzUpO2UoMTUwKTtlKDMwMCk7ZSg2MDApO2UoMTIwMCk7ZSgyNDAwKTtlKDQ4MDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZSgxODAwKTtlKDk2MDApOwotCQkJZSgxOTIwMCk7ZSg1NzYwMCk7ZSgzODQwMCk7Ci0JCQkvKiBUQSBzdXBwb3J0cyAxMTAsIGJ1dCBub3QgMTE1MjAwLCBNVEEgc3VwcG9ydHMgMTE1MjAwLCBidXQgbm90IDExMCAqLwotCQljYXNlIDExMDogCisjZGVmaW5lIGUoeCkgY2FzZSB4OiB0ID0gQ1NSXyAjIyB4OyBicmVhaworCQkJZSg3NSk7CisJCQllKDE1MCk7CisJCQllKDMwMCk7CisJCQllKDYwMCk7CisJCQllKDEyMDApOworCQkJZSgyNDAwKTsKKwkJCWUoNDgwMCk7CisJCQllKDE4MDApOworCQkJZSg5NjAwKTsKKwkJCWUoMTkyMDApOworCQkJZSg1NzYwMCk7CisJCQllKDM4NDAwKTsKKy8qIFRBIHN1cHBvcnRzIDExMCwgYnV0IG5vdCAxMTUyMDAsIE1UQSBzdXBwb3J0cyAxMTUyMDAsIGJ1dCBub3QgMTEwICovCisJCWNhc2UgMTEwOgogCQkJaWYgKHBvcnQtPmJvYXJkLT50YV90eXBlID09IE1PRF9UQSkgewogCQkJCXQgPSBDU1JfMTEwOwogCQkJCWJyZWFrOwogCQkJfSBlbHNlIHsKIAkJCQl0ID0gQ1NSXzk2MDA7Ci0JCQkJcHJpbnRrIChLRVJOX0lORk8gInN4OiBVbnN1cHBvcnRlZCBiYXVkIHJhdGU6ICVkLlxuIiwgcG9ydC0+Z3MuYmF1ZCk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAic3g6IFVuc3VwcG9ydGVkIGJhdWQgcmF0ZTogIgorCQkJCQkJIiVkLlxuIiwgcG9ydC0+Z3MuYmF1ZCk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCWNhc2UgMTE1MjAwOiAKKwkJY2FzZSAxMTUyMDA6CiAJCQlpZiAocG9ydC0+Ym9hcmQtPnRhX3R5cGUgPT0gTU9EX1RBKSB7CiAJCQkJdCA9IENTUl85NjAwOwotCQkJCXByaW50ayAoS0VSTl9JTkZPICJzeDogVW5zdXBwb3J0ZWQgYmF1ZCByYXRlOiAlZC5cbiIsIHBvcnQtPmdzLmJhdWQpOworCQkJCXByaW50ayhLRVJOX0lORk8gInN4OiBVbnN1cHBvcnRlZCBiYXVkIHJhdGU6ICIKKwkJCQkJCSIlZC5cbiIsIHBvcnQtPmdzLmJhdWQpOwogCQkJCWJyZWFrOwogCQkJfSBlbHNlIHsKIAkJCQl0ID0gQ1NSXzExMDsKIAkJCQlicmVhazsKIAkJCX0KLQkJY2FzZSAwICAgICAgOnQgPSAtMTsKLQkJCQkJCQkJIGJyZWFrOworCQljYXNlIDA6CisJCQl0ID0gLTE7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXQgPSBDU1JfOTYwMDsKLQkJCXByaW50ayAoS0VSTl9JTkZPICJzeDogVW5zdXBwb3J0ZWQgYmF1ZCByYXRlOiAlZC5cbiIsIHBvcnQtPmdzLmJhdWQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAic3g6IFVuc3VwcG9ydGVkIGJhdWQgcmF0ZTogJWQuXG4iLAorCQkJCQlwb3J0LT5ncy5iYXVkKTsKIAkJCWJyZWFrOwogCQl9CiAjdW5kZWYgZQogCQlpZiAodCA+PSAwKSB7Ci0JCQlzeF9zZXRzaWduYWxzIChwb3J0LCAxLCAtMSk7Ci0JCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX2NzciwgdCAqIDB4MTEpOworCQkJc3hfc2V0c2lnbmFscyhwb3J0LCAxLCAtMSk7CisJCQlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfY3NyLCB0ICogMHgxMSk7CiAJCX0gZWxzZSB7Ci0JCQlzeF9zZXRzaWduYWxzIChwb3J0LCAwLCAtMSk7CisJCQlzeF9zZXRzaWduYWxzKHBvcnQsIDAsIC0xKTsKIAkJfQogCX0KIH0KIAotCiAvKiBTaW1vbiBBbGxlbidzIHZlcnNpb24gb2YgdGhpcyByb3V0aW5lIHdhcyAyMjUgbGluZXMgbG9uZy4gODUgaXMgYSBsb3QKICAgIGJldHRlci4gLS0gUkVXICovCiAKLXN0YXRpYyBpbnQgc3hfc2V0X3JlYWxfdGVybWlvcyAodm9pZCAqcHRyKQorc3RhdGljIGludCBzeF9zZXRfcmVhbF90ZXJtaW9zKHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHB0cjsKIApAQCAtOTA3LDgwICs5MzksODMgQEAKIAkgICBiZWxvbmdzIChuZXh0IHRvIHRoZSBkcm9wIGR0ciBpZiBiYXVkID09IDApIC0tIFJFVyAqLwogCS8qIHN4X3NldHNpZ25hbHMgKHBvcnQsIDEsIC0xKTsgKi8KIAotCXN4X3NldF9iYXVkIChwb3J0KTsKKwlzeF9zZXRfYmF1ZChwb3J0KTsKIAogI2RlZmluZSBDRkxBRyBwb3J0LT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcKLQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX21yMSwKLQkgICAgICAgICAgICAgICAgICAgICAgIChDX1BBUkVOQiAocG9ydC0+Z3MudHR5KT8gTVIxX1dJVEg6TVIxX05PTkUpIHwKLQkgICAgICAgICAgICAgICAgICAgICAgIChDX1BBUk9ERCAocG9ydC0+Z3MudHR5KT8gTVIxX09ERDpNUjFfRVZFTikgfAotCSAgICAgICAgICAgICAgICAgICAgICAgKENfQ1JUU0NUUyhwb3J0LT5ncy50dHkpPyBNUjFfUlRTX1JYRkxPVzowKSB8Ci0JICAgICAgICAgICAgICAgICAgICAgICAoKChDRkxBRyAmIENTSVpFKT09Q1M4KSA/IE1SMV84X0JJVFM6MCkgfAotCSAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0ZMQUcgJiBDU0laRSk9PUNTNykgPyBNUjFfN19CSVRTOjApIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICgoKENGTEFHICYgQ1NJWkUpPT1DUzYpID8gTVIxXzZfQklUUzowKSB8Ci0JICAgICAgICAgICAgICAgICAgICAgICAoKChDRkxBRyAmIENTSVpFKT09Q1M1KSA/IE1SMV81X0JJVFM6MCkgKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfbXIxLAorCQkJKENfUEFSRU5CKHBvcnQtPmdzLnR0eSkgPyBNUjFfV0lUSCA6IE1SMV9OT05FKSB8CisJCQkoQ19QQVJPREQocG9ydC0+Z3MudHR5KSA/IE1SMV9PREQgOiBNUjFfRVZFTikgfAorCQkJKENfQ1JUU0NUUyhwb3J0LT5ncy50dHkpID8gTVIxX1JUU19SWEZMT1cgOiAwKSB8CisJCQkoKChDRkxBRyAmIENTSVpFKSA9PSBDUzgpID8gTVIxXzhfQklUUyA6IDApIHwKKwkJCSgoKENGTEFHICYgQ1NJWkUpID09IENTNykgPyBNUjFfN19CSVRTIDogMCkgfAorCQkJKCgoQ0ZMQUcgJiBDU0laRSkgPT0gQ1M2KSA/IE1SMV82X0JJVFMgOiAwKSB8CisJCQkoKChDRkxBRyAmIENTSVpFKSA9PSBDUzUpID8gTVIxXzVfQklUUyA6IDApKTsKIAotCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfbXIyLAotCSAgICAgICAgICAgICAgICAgICAgICAgKENfQ1JUU0NUUyhwb3J0LT5ncy50dHkpP01SMl9DVFNfVFhGTE9XOjApIHwKLQkgICAgICAgICAgICAgICAgICAgICAgIChDX0NTVE9QQiAocG9ydC0+Z3MudHR5KT9NUjJfMl9TVE9QOk1SMl8xX1NUT1ApKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfbXIyLAorCQkJKENfQ1JUU0NUUyhwb3J0LT5ncy50dHkpID8gTVIyX0NUU19UWEZMT1cgOiAwKSB8CisJCQkoQ19DU1RPUEIocG9ydC0+Z3MudHR5KSA/IE1SMl8yX1NUT1AgOgorCQkJTVIyXzFfU1RPUCkpOwogCiAJc3dpdGNoIChDRkxBRyAmIENTSVpFKSB7Ci0JY2FzZSBDUzg6c3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9tYXNrLCAweGZmKTticmVhazsKLQljYXNlIENTNzpzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX21hc2ssIDB4N2YpO2JyZWFrOwotCWNhc2UgQ1M2OnN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfbWFzaywgMHgzZik7YnJlYWs7Ci0JY2FzZSBDUzU6c3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9tYXNrLCAweDFmKTticmVhazsKKwljYXNlIENTODoKKwkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX21hc2ssIDB4ZmYpOworCQlicmVhazsKKwljYXNlIENTNzoKKwkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX21hc2ssIDB4N2YpOworCQlicmVhazsKKwljYXNlIENTNjoKKwkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX21hc2ssIDB4M2YpOworCQlicmVhazsKKwljYXNlIENTNToKKwkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX21hc2ssIDB4MWYpOworCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IEludmFsaWQgd29yZHNpemU6ICV1XG4iLCBDRkxBRyAmIENTSVpFKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic3g6IEludmFsaWQgd29yZHNpemU6ICV1XG4iLCBDRkxBRyAmIENTSVpFKTsKIAkJYnJlYWs7CiAJfQogCi0Jc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9wcnRjbCwgCi0JICAgICAgICAgICAgICAgICAgICAgICAoSV9JWE9OICAgKHBvcnQtPmdzLnR0eSk/U1BfVFhFTjowKSB8Ci0JICAgICAgICAgICAgICAgICAgICAgICAoSV9JWE9GRiAgKHBvcnQtPmdzLnR0eSk/U1BfUlhFTjowKSB8Ci0JICAgICAgICAgICAgICAgICAgICAgICAoSV9JWEFOWSAgKHBvcnQtPmdzLnR0eSk/U1BfVEFOWTowKSB8Ci0JICAgICAgICAgICAgICAgICAgICAgICBTUF9EQ0VOKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfcHJ0Y2wsCisJCQkoSV9JWE9OKHBvcnQtPmdzLnR0eSkgPyBTUF9UWEVOIDogMCkgfAorCQkJKElfSVhPRkYocG9ydC0+Z3MudHR5KSA/IFNQX1JYRU4gOiAwKSB8CisJCQkoSV9JWEFOWShwb3J0LT5ncy50dHkpID8gU1BfVEFOWSA6IDApIHwgU1BfRENFTik7CiAKLQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX2JyZWFrLCAKLQkgICAgICAgICAgICAgICAgICAgICAgIChJX0lHTkJSSyhwb3J0LT5ncy50dHkpP0JSX0lHTjowIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJX0JSS0lOVChwb3J0LT5ncy50dHkpP0JSX0lOVDowKSk7CisJc3hfd3JpdGVfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX2JyZWFrLAorCQkJKElfSUdOQlJLKHBvcnQtPmdzLnR0eSkgPyBCUl9JR04gOiAwIHwKKwkJCUlfQlJLSU5UKHBvcnQtPmdzLnR0eSkgPyBCUl9JTlQgOiAwKSk7CiAKLQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4b24sICBTVEFSVF9DSEFSIChwb3J0LT5ncy50dHkpKTsKLQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3J4b24sICBTVEFSVF9DSEFSIChwb3J0LT5ncy50dHkpKTsKLQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4b2ZmLCBTVE9QX0NIQVIgIChwb3J0LT5ncy50dHkpKTsKLQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3J4b2ZmLCBTVE9QX0NIQVIgIChwb3J0LT5ncy50dHkpKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfdHhvbiwgU1RBUlRfQ0hBUihwb3J0LT5ncy50dHkpKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfcnhvbiwgU1RBUlRfQ0hBUihwb3J0LT5ncy50dHkpKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfdHhvZmYsIFNUT1BfQ0hBUihwb3J0LT5ncy50dHkpKTsKKwlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfcnhvZmYsIFNUT1BfQ0hBUihwb3J0LT5ncy50dHkpKTsKIAogCXN4X3JlY29uZmlndXJlX3BvcnQocG9ydCk7CiAKIAkvKiBUZWxsIGxpbmUgZGlzY2lwbGluZSB3aGV0aGVyIHdlIHdpbGwgZG8gaW5wdXQgY29va2luZyAqLwotCWlmKElfT1RIRVIocG9ydC0+Z3MudHR5KSkgeworCWlmIChJX09USEVSKHBvcnQtPmdzLnR0eSkpIHsKIAkJY2xlYXJfYml0KFRUWV9IV19DT09LX0lOLCAmcG9ydC0+Z3MudHR5LT5mbGFncyk7CiAJfSBlbHNlIHsKIAkJc2V0X2JpdChUVFlfSFdfQ09PS19JTiwgJnBvcnQtPmdzLnR0eS0+ZmxhZ3MpOwogCX0KLQlzeF9kcHJpbnRrIChTWF9ERUJVR19URVJNSU9TLCAiaWZsYWdzOiAleCglZCkgIiwKLQkgICAgICAgICAgICBwb3J0LT5ncy50dHktPnRlcm1pb3MtPmNfaWZsYWcsIAotCSAgICAgICAgICAgIElfT1RIRVIocG9ydC0+Z3MudHR5KSk7Ci0KKwlzeF9kcHJpbnRrKFNYX0RFQlVHX1RFUk1JT1MsICJpZmxhZ3M6ICV4KCVkKSAiLAorCQkJcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2lmbGFnLCBJX09USEVSKHBvcnQtPmdzLnR0eSkpOwogCiAvKiBUZWxsIGxpbmUgZGlzY2lwbGluZSB3aGV0aGVyIHdlIHdpbGwgZG8gb3V0cHV0IGNvb2tpbmcuCiAgKiBJZiBPUE9TVCBpcyBzZXQgYW5kIG5vIG90aGVyIG91dHB1dCBmbGFncyBhcmUgc2V0IHRoZW4gd2UgY2FuIGRvIG91dHB1dAogICogcHJvY2Vzc2luZy4gIEV2ZW4gaWYgb25seSAqb25lKiBvdGhlciBmbGFnIGluIHRoZSBPX09USEVSIGdyb3VwIGlzIHNldAogICogd2UgZG8gY29va2luZyBpbiBzb2Z0d2FyZS4KICAqLwotCWlmKE9fT1BPU1QocG9ydC0+Z3MudHR5KSAmJiAhT19PVEhFUihwb3J0LT5ncy50dHkpKSB7CisJaWYgKE9fT1BPU1QocG9ydC0+Z3MudHR5KSAmJiAhT19PVEhFUihwb3J0LT5ncy50dHkpKSB7CiAJCXNldF9iaXQoVFRZX0hXX0NPT0tfT1VULCAmcG9ydC0+Z3MudHR5LT5mbGFncyk7CiAJfSBlbHNlIHsKIAkJY2xlYXJfYml0KFRUWV9IV19DT09LX09VVCwgJnBvcnQtPmdzLnR0eS0+ZmxhZ3MpOwogCX0KLQlzeF9kcHJpbnRrIChTWF9ERUJVR19URVJNSU9TLCAib2ZsYWdzOiAleCglZClcbiIsCi0JICAgICAgICAgICAgcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX29mbGFnLCAKLQkgICAgICAgICAgICBPX09USEVSKHBvcnQtPmdzLnR0eSkpOworCXN4X2RwcmludGsoU1hfREVCVUdfVEVSTUlPUywgIm9mbGFnczogJXgoJWQpXG4iLAorCQkJcG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX29mbGFnLCBPX09USEVSKHBvcnQtPmdzLnR0eSkpOwogCS8qIHBvcnQtPmNfZGNkID0gc3hfZ2V0X0NEIChwb3J0KTsgKi8KLQlmdW5jX2V4aXQgKCk7CisJZnVuY19leGl0KCk7CiAJcmV0dXJuIDA7CiB9CiAKLQotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKICAqICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcnJ1cHQgcmVsYXRlZCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKgogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpAQCAtOTk2LDI0NSArMTAzMSwyNjAgQEAKICAgIGtub3cgSSdtIGRlYWQgYWdhaW5zdCB0aGF0LCBidXQgSSB0aGluayBpdCBpcyByZXF1aXJlZCBpbiB0aGlzCiAgICBjYXNlLiAgKi8KIAotCi1zdGF0aWMgdm9pZCBzeF90cmFuc21pdF9jaGFycyAoc3RydWN0IHN4X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBzeF90cmFuc21pdF9jaGFycyhzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCkKIHsKIAlpbnQgYzsKIAlpbnQgdHhfaXA7CiAJaW50IHR4cm9vbTsKIAotCWZ1bmNfZW50ZXIyICgpOwotCXN4X2RwcmludGsgKFNYX0RFQlVHX1RSQU5TTUlULCAiUG9ydCAlcDogdHJhbnNtaXQgJWQgY2hhcnNcbiIsIAotCSAgICAgICAgICAgIHBvcnQsIHBvcnQtPmdzLnhtaXRfY250KTsKKwlmdW5jX2VudGVyMigpOworCXN4X2RwcmludGsoU1hfREVCVUdfVFJBTlNNSVQsICJQb3J0ICVwOiB0cmFuc21pdCAlZCBjaGFyc1xuIiwKKwkJCXBvcnQsIHBvcnQtPmdzLnhtaXRfY250KTsKIAotCWlmICh0ZXN0X2FuZF9zZXRfYml0IChTWF9QT1JUX1RSQU5TTUlUX0xPQ0ssICZwb3J0LT5sb2NrcykpIHsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChTWF9QT1JUX1RSQU5TTUlUX0xPQ0ssICZwb3J0LT5sb2NrcykpIHsKIAkJcmV0dXJuOwogCX0KIAogCXdoaWxlICgxKSB7CiAJCWMgPSBwb3J0LT5ncy54bWl0X2NudDsKIAotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19UUkFOU01JVCwgIkNvcHlpbmcgJWQgIiwgYyk7Ci0JCXR4X2lwICA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eGlwb3MpOworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1RSQU5TTUlULCAiQ29weWluZyAlZCAiLCBjKTsKKwkJdHhfaXAgPSBzeF9yZWFkX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV90eGlwb3MpOwogCiAJCS8qIFRvb2sgbWUgNSBtaW51dGVzIHRvIGRlZHVjZSB0aGlzIGZvcm11bGEuIAogCQkgICBMdWNraWx5IGl0IGlzIGxpdGVyYWxseSBpbiB0aGUgbWFudWFsIGluIHNlY3Rpb24gNi41LjQuMy41ICovCi0JCXR4cm9vbSA9IChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhvcG9zKSAtIHR4X2lwIC0gMSkgJiAweGZmOworCQl0eHJvb20gPSAoc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfdHhvcG9zKSAtIHR4X2lwIC0gMSkgJgorCQkJCTB4ZmY7CiAKIAkJLyogRG9uJ3QgY29weSBtb3JlIGJ5dGVzIHRoYW4gdGhlcmUgaXMgcm9vbSBmb3IgaW4gdGhlIGJ1ZmZlciAqLwogCQlpZiAoYyA+IHR4cm9vbSkKIAkJCWMgPSB0eHJvb207Ci0JCXN4X2RwcmludGsgKFNYX0RFQlVHX1RSQU5TTUlULCAiICVkKCVkKSAiLCBjLCB0eHJvb20gKTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19UUkFOU01JVCwgIiAlZCglZCkgIiwgYywgdHhyb29tKTsKIAogCQkvKiBEb24ndCBjb3B5IHBhc3QgdGhlIGVuZCBvZiB0aGUgaGFyZHdhcmUgdHJhbnNtaXQgYnVmZmVyICovCi0JCWlmIChjID4gMHgxMDAgLSB0eF9pcCkgCisJCWlmIChjID4gMHgxMDAgLSB0eF9pcCkKIAkJCWMgPSAweDEwMCAtIHR4X2lwOwogCi0JCXN4X2RwcmludGsgKFNYX0RFQlVHX1RSQU5TTUlULCAiICVkKCVkKSAiLCBjLCAweDEwMC10eF9pcCApOworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1RSQU5TTUlULCAiICVkKCVkKSAiLCBjLCAweDEwMCAtIHR4X2lwKTsKIAogCQkvKiBEb24ndCBjb3B5IHBhcyB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYnVmZmVyICovCi0JCWlmIChjID4gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPmdzLnhtaXRfdGFpbCkgCisJCWlmIChjID4gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPmdzLnhtaXRfdGFpbCkKIAkJCWMgPSBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+Z3MueG1pdF90YWlsOwogCi0JCXN4X2RwcmludGsgKFNYX0RFQlVHX1RSQU5TTUlULCAiICVkKCVsZCkgXG4iLCAKLQkJICAgICAgICAgICAgYywgU0VSSUFMX1hNSVRfU0laRS0gcG9ydC0+Z3MueG1pdF90YWlsKTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19UUkFOU01JVCwgIiAlZCglbGQpIFxuIiwKKwkJCQljLCBTRVJJQUxfWE1JVF9TSVpFIC0gcG9ydC0+Z3MueG1pdF90YWlsKTsKIAotCQkvKiBJZiBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLCB3ZSBjYW4ndCBjb3B5IG1vcmUgZGF0YSwgd2UncmUgZG9uZSEgKi8KLQkJaWYgKGMgPT0gMCkgYnJlYWs7CisJCS8qIElmIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIsIHdlIGNhbid0IGNvcHkgbW9yZSBkYXRhLCB3ZSdyZQorCQkgICBkb25lISAqLworCQlpZiAoYyA9PSAwKQorCQkJYnJlYWs7CiAKLQotCQltZW1jcHlfdG9pbyAocG9ydC0+Ym9hcmQtPmJhc2UgKyBDSEFOX09GRlNFVChwb3J0LGhpX3R4YnVmKSArIHR4X2lwLCAKLQkJICAgICAgICAgICAgIHBvcnQtPmdzLnhtaXRfYnVmICsgcG9ydC0+Z3MueG1pdF90YWlsLCBjKTsKKwkJbWVtY3B5X3RvaW8ocG9ydC0+Ym9hcmQtPmJhc2UgKyBDSEFOX09GRlNFVChwb3J0LCBoaV90eGJ1ZikgKworCQkJdHhfaXAsIHBvcnQtPmdzLnhtaXRfYnVmICsgcG9ydC0+Z3MueG1pdF90YWlsLCBjKTsKIAogCQkvKiBVcGRhdGUgdGhlIHBvaW50ZXIgaW4gdGhlIGNhcmQgKi8KLQkJc3hfd3JpdGVfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eGlwb3MsICh0eF9pcCtjKSAmIDB4ZmYpOworCQlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfdHhpcG9zLCAodHhfaXAgKyBjKSAmIDB4ZmYpOwogCiAJCS8qIFVwZGF0ZSB0aGUga2VybmVsIGJ1ZmZlciBlbmQgKi8KLQkJcG9ydC0+Z3MueG1pdF90YWlsID0gKHBvcnQtPmdzLnhtaXRfdGFpbCArIGMpICYgKFNFUklBTF9YTUlUX1NJWkUtMSk7CisJCXBvcnQtPmdzLnhtaXRfdGFpbCA9IChwb3J0LT5ncy54bWl0X3RhaWwgKyBjKSAmCisJCQkJKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKIAogCQkvKiBUaGlzIG9uZSBsYXN0LiAodGhpcyBpcyBlc3NlbnRpYWwpCi0JCSAgIEl0IHdvdWxkIGFsbG93IG90aGVycyB0byBzdGFydCBwdXR0aW5nIG1vcmUgZGF0YSBpbnRvIHRoZSBidWZmZXIhICovCisJCSAgIEl0IHdvdWxkIGFsbG93IG90aGVycyB0byBzdGFydCBwdXR0aW5nIG1vcmUgZGF0YSBpbnRvIHRoZQorCQkgICBidWZmZXIhICovCiAJCXBvcnQtPmdzLnhtaXRfY250IC09IGM7CiAJfQogCiAJaWYgKHBvcnQtPmdzLnhtaXRfY250ID09IDApIHsKLQkJc3hfZGlzYWJsZV90eF9pbnRlcnJ1cHRzIChwb3J0KTsKKwkJc3hfZGlzYWJsZV90eF9pbnRlcnJ1cHRzKHBvcnQpOwogCX0KIAogCWlmICgocG9ydC0+Z3MueG1pdF9jbnQgPD0gcG9ydC0+Z3Mud2FrZXVwX2NoYXJzKSAmJiBwb3J0LT5ncy50dHkpIHsKIAkJdHR5X3dha2V1cChwb3J0LT5ncy50dHkpOwotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19UUkFOU01JVCwgIldha2luZyB1cC4uLi4gbGRpc2MgKCVkKS4uLi5cbiIsCi0JCSAgICAgICAgICAgIHBvcnQtPmdzLndha2V1cF9jaGFycyk7IAorCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1RSQU5TTUlULCAiV2FraW5nIHVwLi4uLiBsZGlzYyAoJWQpLi4uLlxuIiwKKwkJCQlwb3J0LT5ncy53YWtldXBfY2hhcnMpOwogCX0KIAotCWNsZWFyX2JpdCAoU1hfUE9SVF9UUkFOU01JVF9MT0NLLCAmcG9ydC0+bG9ja3MpOwotCWZ1bmNfZXhpdCAoKTsKKwljbGVhcl9iaXQoU1hfUE9SVF9UUkFOU01JVF9MT0NLLCAmcG9ydC0+bG9ja3MpOworCWZ1bmNfZXhpdCgpOwogfQogCi0KIC8qIE5vdGUgdGhlIHN5bW1ldHJ5IGJldHdlZW4gcmVjZWl2aW5nIGNoYXJzIGFuZCB0cmFuc21pdHRpbmcgdGhlbSEKICAgIE5vdGU6IFRoZSBrZXJuZWwgc2hvdWxkIGhhdmUgaW1wbGVtZW50ZWQgYm90aCBhIHJlY2VpdmUgYnVmZmVyIGFuZAogICAgYSB0cmFuc21pdCBidWZmZXIuICovCiAKIC8qIElubGluZWQ6IENhbGxlZCBvbmx5IG9uY2UuIFJlbW92ZSB0aGUgaW5saW5lIHdoZW4geW91IGFkZCBhbm90aGVyIGNhbGwgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzeF9yZWNlaXZlX2NoYXJzIChzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9yZWNlaXZlX2NoYXJzKHN0cnVjdCBzeF9wb3J0ICpwb3J0KQogewogCWludCBjOwogCWludCByeF9vcDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCWludCBjb3BpZWQ9MDsKKwlpbnQgY29waWVkID0gMDsKIAl1bnNpZ25lZCBjaGFyICpycDsKIAotCWZ1bmNfZW50ZXIyICgpOworCWZ1bmNfZW50ZXIyKCk7CiAJdHR5ID0gcG9ydC0+Z3MudHR5OwogCXdoaWxlICgxKSB7Ci0JCXJ4X29wID0gc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3J4b3Bvcyk7Ci0JCWMgPSAoc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3J4aXBvcykgLSByeF9vcCkgJiAweGZmOworCQlyeF9vcCA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX3J4b3Bvcyk7CisJCWMgPSAoc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfcnhpcG9zKSAtIHJ4X29wKSAmIDB4ZmY7CiAKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfUkVDRUlWRSwgInJ4b3A9JWQsIGMgPSAlZC5cbiIsIHJ4X29wLCBjKTsgCisJCXN4X2RwcmludGsoU1hfREVCVUdfUkVDRUlWRSwgInJ4b3A9JWQsIGMgPSAlZC5cbiIsIHJ4X29wLCBjKTsKIAogCQkvKiBEb24ndCBjb3B5IHBhc3QgdGhlIGVuZCBvZiB0aGUgaGFyZHdhcmUgcmVjZWl2ZSBidWZmZXIgKi8KLQkJaWYgKHJ4X29wICsgYyA+IDB4MTAwKSBjID0gMHgxMDAgLSByeF9vcDsKKwkJaWYgKHJ4X29wICsgYyA+IDB4MTAwKQorCQkJYyA9IDB4MTAwIC0gcnhfb3A7CiAKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfUkVDRUlWRSwgImMgPSAlZC5cbiIsIGMpOworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1JFQ0VJVkUsICJjID0gJWQuXG4iLCBjKTsKIAogCQkvKiBEb24ndCBjb3B5IG1vcmUgYnl0ZXMgdGhhbiB0aGVyZSBpcyByb29tIGZvciBpbiB0aGUgYnVmZmVyICovCiAKIAkJYyA9IHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nKHR0eSwgJnJwLCBjKTsKIAotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19SRUNFSVZFLCAiYyA9ICVkLlxuIiwgYyk7IAorCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1JFQ0VJVkUsICJjID0gJWQuXG4iLCBjKTsKIAogCQkvKiBJZiBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLCB3ZSBjYW4ndCBjb3B5IG1vcmUgZGF0YSwgd2UncmUgZG9uZSEgKi8KLQkJaWYgKGMgPT0gMCkgYnJlYWs7CisJCWlmIChjID09IDApCisJCQlicmVhazsKIAotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19SRUNFSVZFICwgIkNvcHlpbmcgb3ZlciAlZCBjaGFycy4gRmlyc3QgaXMgJWQgYXQgJWx4XG4iLCBjLCAKLQkJICAgICAgICAgICAgcmVhZF9zeF9ieXRlIChwb3J0LT5ib2FyZCwgQ0hBTl9PRkZTRVQocG9ydCxoaV9yeGJ1ZikgKyByeF9vcCksCi0JCSAgICAgICAgICAgIENIQU5fT0ZGU0VUKHBvcnQsIGhpX3J4YnVmKSk7IAotCQltZW1jcHlfZnJvbWlvIChycCwKLQkJICAgICAgICAgICAgICAgcG9ydC0+Ym9hcmQtPmJhc2UgKyBDSEFOX09GRlNFVChwb3J0LGhpX3J4YnVmKSArIHJ4X29wLCBjKTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19SRUNFSVZFLCAiQ29weWluZyBvdmVyICVkIGNoYXJzLiBGaXJzdCBpcyAiCisJCQkJIiVkIGF0ICVseFxuIiwgYywgcmVhZF9zeF9ieXRlKHBvcnQtPmJvYXJkLAorCQkJCQlDSEFOX09GRlNFVChwb3J0LCBoaV9yeGJ1ZikgKyByeF9vcCksCisJCQkJQ0hBTl9PRkZTRVQocG9ydCwgaGlfcnhidWYpKTsKKwkJbWVtY3B5X2Zyb21pbyhycCwgcG9ydC0+Ym9hcmQtPmJhc2UgKworCQkJCUNIQU5fT0ZGU0VUKHBvcnQsIGhpX3J4YnVmKSArIHJ4X29wLCBjKTsKIAogCQkvKiBUaGlzIG9uZSBsYXN0LiAoIE5vdCBlc3NlbnRpYWwuKQotCQkgICBJdCBhbGxvd3MgdGhlIGNhcmQgdG8gc3RhcnQgcHV0dGluZyBtb3JlIGRhdGEgaW50byB0aGUgYnVmZmVyISAKKwkJICAgSXQgYWxsb3dzIHRoZSBjYXJkIHRvIHN0YXJ0IHB1dHRpbmcgbW9yZSBkYXRhIGludG8gdGhlCisJCSAgIGJ1ZmZlciEKIAkJICAgVXBkYXRlIHRoZSBwb2ludGVyIGluIHRoZSBjYXJkICovCi0JCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfcnhvcG9zLCAocnhfb3AgKyBjKSAmIDB4ZmYpOworCQlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfcnhvcG9zLCAocnhfb3AgKyBjKSAmIDB4ZmYpOwogCiAJCWNvcGllZCArPSBjOwogCX0KIAlpZiAoY29waWVkKSB7CiAJCXN0cnVjdCB0aW1ldmFsIHR2OwogCi0JCWRvX2dldHRpbWVvZmRheSAoJnR2KTsKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfUkVDRUlWRSwgCi0JCSAgICAgICAgICAgICJwdXNoaW5nIGZsaXBxIHBvcnQgJWQgKCUzZCBjaGFycyk6ICVkLiUwNmQgICglZC8lZClcbiIsIAotCQkgICAgICAgICAgICBwb3J0LT5saW5lLCBjb3BpZWQsIAotCQkgICAgICAgICAgICAoaW50KSAodHYudHZfc2VjICUgNjApLCAoaW50KXR2LnR2X3VzZWMsIHR0eS0+cmF3LCB0dHktPnJlYWxfcmF3KTsKKwkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCXN4X2RwcmludGsoU1hfREVCVUdfUkVDRUlWRSwgInB1c2hpbmcgZmxpcHEgcG9ydCAlZCAoJTNkICIKKwkJCQkiY2hhcnMpOiAlZC4lMDZkICAoJWQvJWQpXG4iLCBwb3J0LT5saW5lLAorCQkJCWNvcGllZCwgKGludCkodHYudHZfc2VjICUgNjApLCAoaW50KXR2LnR2X3VzZWMsCisJCQkJdHR5LT5yYXcsIHR0eS0+cmVhbF9yYXcpOwogCi0JCS8qIFRlbGwgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSB0aGUgbmV3cy4gR3JlYXQgbmV3cy4gTmV3IGNoYXJhY3RlcnMhICovCi0JCXR0eV9mbGlwX2J1ZmZlcl9wdXNoICh0dHkpOworCQkvKiBUZWxsIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0gdGhlIG5ld3MuIEdyZWF0IG5ld3MuIE5ldworCQkgICBjaGFyYWN0ZXJzISAqLworCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCQkvKiAgICB0dHlfc2NoZWR1bGVfZmxpcCAodHR5KTsgKi8KIAl9CiAKLQlmdW5jX2V4aXQgKCk7CisJZnVuY19leGl0KCk7CiB9CiAKIC8qIElubGluZWQ6IGl0IGlzIGNhbGxlZCBvbmx5IG9uY2UuIFJlbW92ZSB0aGUgaW5saW5lIGlmIHlvdSBhZGQgYW5vdGhlciAKICAgIGNhbGwgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzeF9jaGVja19tb2RlbV9zaWduYWxzIChzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzeF9jaGVja19tb2RlbV9zaWduYWxzKHN0cnVjdCBzeF9wb3J0ICpwb3J0KQogewogCWludCBoaV9zdGF0ZTsKIAlpbnQgY19kY2Q7CiAKLQloaV9zdGF0ZSA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9zdGF0ZSk7Ci0Jc3hfZHByaW50ayAoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiQ2hlY2tpbmcgbW9kZW0gc2lnbmFscyAoJWQvJWQpXG4iLAotCSAgICAgICAgICAgIHBvcnQtPmNfZGNkLCBzeF9nZXRfQ0QgKHBvcnQpKTsKKwloaV9zdGF0ZSA9IHN4X3JlYWRfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX3N0YXRlKTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkNoZWNraW5nIG1vZGVtIHNpZ25hbHMgKCVkLyVkKVxuIiwKKwkJCXBvcnQtPmNfZGNkLCBzeF9nZXRfQ0QocG9ydCkpOwogCiAJaWYgKGhpX3N0YXRlICYgU1RfQlJFQUspIHsKIAkJaGlfc3RhdGUgJj0gflNUX0JSRUFLOwotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJnb3QgYSBicmVhay5cbiIpOwotCQlzeF93cml0ZV9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3N0YXRlLCBoaV9zdGF0ZSk7Ci0JCWdzX2dvdF9icmVhayAoJnBvcnQtPmdzKTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19NT0RFTVNJR05BTFMsICJnb3QgYSBicmVhay5cbiIpOworCQlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfc3RhdGUsIGhpX3N0YXRlKTsKKwkJZ3NfZ290X2JyZWFrKCZwb3J0LT5ncyk7CiAJfQogCWlmIChoaV9zdGF0ZSAmIFNUX0RDRCkgewogCQloaV9zdGF0ZSAmPSB+U1RfRENEOwotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJnb3QgYSBEQ0QgY2hhbmdlLlxuIik7Ci0JCXN4X3dyaXRlX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfc3RhdGUsIGhpX3N0YXRlKTsKLQkJY19kY2QgPSBzeF9nZXRfQ0QgKHBvcnQpOwotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJEQ0QgaXMgbm93ICVkXG4iLCBjX2RjZCk7CisJCXN4X2RwcmludGsoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiZ290IGEgRENEIGNoYW5nZS5cbiIpOworCQlzeF93cml0ZV9jaGFubmVsX2J5dGUocG9ydCwgaGlfc3RhdGUsIGhpX3N0YXRlKTsKKwkJY19kY2QgPSBzeF9nZXRfQ0QocG9ydCk7CisJCXN4X2RwcmludGsoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiRENEIGlzIG5vdyAlZFxuIiwgY19kY2QpOwogCQlpZiAoY19kY2QgIT0gcG9ydC0+Y19kY2QpIHsKIAkJCXBvcnQtPmNfZGNkID0gY19kY2Q7Ci0JCQlpZiAoc3hfZ2V0X0NEIChwb3J0KSkgeworCQkJaWYgKHN4X2dldF9DRChwb3J0KSkgewogCQkJCS8qIERDRCB3ZW50IFVQICovCi0JCQkJaWYgKChzeF9yZWFkX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV9oc3RhdCkgIT0gSFNfSURMRV9DTE9TRUQpICYmCi0JCQkJCQkhKHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgKSB7Ci0JCQkJCS8qIEFyZSB3ZSBibG9ja2luZyBpbiBvcGVuPyovCi0JCQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkRDRCBhY3RpdmUsIHVuYmxvY2tpbmcgb3BlblxuIik7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKKwkJCQlpZiAoKHN4X3JlYWRfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX2hzdGF0KSAhPQorCQkJCQkJSFNfSURMRV9DTE9TRUQpICYmCisJCQkJCQkhKHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+CisJCQkJCQkJY19jZmxhZyAmIENMT0NBTCkpIHsKKwkJCQkJLyogQXJlIHdlIGJsb2NraW5nIGluIG9wZW4/ICovCisJCQkJCXN4X2RwcmludGsoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiRENEICIKKwkJCQkJCSJhY3RpdmUsIHVuYmxvY2tpbmcgb3BlblxuIik7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+Z3MuCisJCQkJCQkJb3Blbl93YWl0KTsKIAkJCQl9IGVsc2UgewotCQkJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJEQ0QgcmFpc2VkLiBJZ25vcmluZy5cbiIpOworCQkJCQlzeF9kcHJpbnRrKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkRDRCAiCisJCQkJCQkicmFpc2VkLiBJZ25vcmluZy5cbiIpOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJLyogRENEIHdlbnQgZG93biEgKi8KLQkJCQlpZiAoIShwb3J0LT5ncy50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICkgewotCQkJCQlzeF9kcHJpbnRrIChTWF9ERUJVR19NT0RFTVNJR05BTFMsICJEQ0QgZHJvcHBlZC4gaGFuZ2luZyB1cC4uLi5cbiIpOwotCQkJCQl0dHlfaGFuZ3VwIChwb3J0LT5ncy50dHkpOworCQkJCWlmICghKHBvcnQtPmdzLnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkpeworCQkJCQlzeF9kcHJpbnRrKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkRDRCAiCisJCQkJCQkiZHJvcHBlZC4gaGFuZ2luZyB1cC4uLi5cbiIpOworCQkJCQl0dHlfaGFuZ3VwKHBvcnQtPmdzLnR0eSk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJc3hfZHByaW50ayAoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiRENEIGRyb3BwZWQuIGlnbm9yaW5nLlxuIik7CisJCQkJCXN4X2RwcmludGsoU1hfREVCVUdfTU9ERU1TSUdOQUxTLCAiRENEICIKKwkJCQkJCSJkcm9wcGVkLiBpZ25vcmluZy5cbiIpOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX01PREVNU0lHTkFMUywgIkhtbW0uIGNhcmQgdG9sZCB1cyBEQ0QgY2hhbmdlZCwgYnV0IGl0IGRpZG4ndC5cbiIpOworCQkJc3hfZHByaW50ayhTWF9ERUJVR19NT0RFTVNJR05BTFMsICJIbW1tLiBjYXJkIHRvbGQgdXMgIgorCQkJCSJEQ0QgY2hhbmdlZCwgYnV0IGl0IGRpZG4ndC5cbiIpOwogCQl9CiAJfQogfQogCi0KIC8qIFRoaXMgaXMgd2hhdCBhbiBpbnRlcnJ1cHQgcm91dGluZSBzaG91bGQgbG9vayBsaWtlLiAKICAqIFNtYWxsLCBlbGVnYW50LCBjbGVhci4KICAqLwogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc3hfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpwdHIpCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkID0gcHRyOwogCXN0cnVjdCBzeF9wb3J0ICpwb3J0OwogCWludCBpOwogCi0JZnVuY19lbnRlciAoKTsKLQlzeF9kcHJpbnRrIChTWF9ERUJVR19GTE9XLCAic3g6IGVudGVyIHN4X2ludGVycnVwdCAoJWQvJWQpXG4iLCBpcnEsIGJvYXJkLT5pcnEpOyAKKwlmdW5jX2VudGVyKCk7CisJc3hfZHByaW50ayhTWF9ERUJVR19GTE9XLCAic3g6IGVudGVyIHN4X2ludGVycnVwdCAoJWQvJWQpXG4iLCBpcnEsCisJCQlib2FyZC0+aXJxKTsKIAogCS8qIEFBYXJnaCEgVGhlIG9yZGVyIGluIHdoaWNoIHRvIGRvIHRoZXNlIHRoaW5ncyBpcyBlc3NlbnRpYWwgYW5kCiAJICAgbm90IHRyaXZpYWwuIAogCiAJICAgLSBSYXRlIGxpbWl0IGdvZXMgYmVmb3JlICJyZWN1cnNpdmUiLiBPdGhlcndpc2UgYSBzZXJpZXMgb2YKLQkgICAgIHJlY3Vyc2l2ZSBjYWxscyB3aWxsIGhhbmcgdGhlIG1hY2hpbmUgaW4gdGhlIGludGVycnVwdCByb3V0aW5lLiAKKwkgICByZWN1cnNpdmUgY2FsbHMgd2lsbCBoYW5nIHRoZSBtYWNoaW5lIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZS4KIAogCSAgIC0gaGFyZHdhcmUgdHdpZGRsaW5nIGdvZXMgYmVmb3JlICJyZWN1cnNpdmUiLiBPdGhlcndpc2Ugd2hlbiB3ZQotCSAgICAgcG9sbCB0aGUgY2FyZCwgYW5kIGEgcmVjdXJzaXZlIGludGVycnVwdCBoYXBwZW5zLCB3ZSB3b24ndAotCSAgICAgYWNrIHRoZSBjYXJkLCBzbyBpdCBtaWdodCBrZWVwIG9uIGludGVycnVwdGluZyB1cy4gKGVzcGVjaWFsbHkKLQkgICAgIGxldmVsIHNlbnNpdGl2ZSBpbnRlcnJ1cHQgc3lzdGVtcyBsaWtlIFBDSSkuCisJICAgcG9sbCB0aGUgY2FyZCwgYW5kIGEgcmVjdXJzaXZlIGludGVycnVwdCBoYXBwZW5zLCB3ZSB3b24ndAorCSAgIGFjayB0aGUgY2FyZCwgc28gaXQgbWlnaHQga2VlcCBvbiBpbnRlcnJ1cHRpbmcgdXMuIChlc3BlY2lhbGx5CisJICAgbGV2ZWwgc2Vuc2l0aXZlIGludGVycnVwdCBzeXN0ZW1zIGxpa2UgUENJKS4KIAogCSAgIC0gUmF0ZSBsaW1pdCBnb2VzIGJlZm9yZSBoYXJkd2FyZSB0d2lkZGxpbmcuIE90aGVyd2lzZSB3ZSB3b24ndAotCSAgICAgY2F0Y2ggYSBjYXJkIHRoYXQgaGFzIGdvbmUgYm9ua2Vycy4KKwkgICBjYXRjaCBhIGNhcmQgdGhhdCBoYXMgZ29uZSBib25rZXJzLgogCiAJICAgLSBUaGUgImluaXRpYWxpemVkIiB0ZXN0IGdvZXMgYWZ0ZXIgdGhlIGhhcmR3YXJlIHR3aWRkbGluZy4gT3RoZXJ3aXNlCi0JICAgICB0aGUgY2FyZCB3aWxsIHN0aWNrIHVzIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBhZ2Fpbi4KKwkgICB0aGUgY2FyZCB3aWxsIHN0aWNrIHVzIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBhZ2Fpbi4KIAogCSAgIC0gVGhlIGluaXRpYWxpemVkIHRlc3QgZ29lcyBiZWZvcmUgcmVjdXJzaXZlLiAKLQkqLwotCi0KKwkgKi8KIAogI2lmZGVmIElSUV9SQVRFX0xJTUlUCiAJLyogQWFhcmdoISBJJ20gYXNoYW1lZC4gVGhpcyBjb3N0cyBtb3JlIGxpbmVzLW9mLWNvZGUgdGhhbiB0aGUKLQkgICBhY3R1YWwgaW50ZXJydXB0IHJvdXRpbmUhLiAoV2VsbCwgdXNlZCB0byB3aGVuIEkgd3JvdGUgdGhhdCBjb21tZW50KSAqLworCSAgIGFjdHVhbCBpbnRlcnJ1cHQgcm91dGluZSEuIChXZWxsLCB1c2VkIHRvIHdoZW4gSSB3cm90ZSB0aGF0CisJICAgY29tbWVudCkgKi8KIAl7CiAJCXN0YXRpYyBpbnQgbGFzdGppZjsKLQkJc3RhdGljIGludCBuaW50cj0wOworCQlzdGF0aWMgaW50IG5pbnRyID0gMDsKIAogCQlpZiAobGFzdGppZiA9PSBqaWZmaWVzKSB7CiAJCQlpZiAoKytuaW50ciA+IElSUV9SQVRFX0xJTUlUKSB7Ci0JCQkJZnJlZV9pcnEgKGJvYXJkLT5pcnEsIGJvYXJkKTsKLQkJCQlwcmludGsgKEtFUk5fRVJSICJzeDogVG9vIG1hbnkgaW50ZXJydXB0cy4gVHVybmluZyBvZmYgaW50ZXJydXB0ICVkLlxuIiwgCi0JCQkJCSAgICAgIGJvYXJkLT5pcnEpOworCQkJCWZyZWVfaXJxKGJvYXJkLT5pcnEsIGJvYXJkKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgInN4OiBUb28gbWFueSBpbnRlcnJ1cHRzLiAiCisJCQkJCQkiVHVybmluZyBvZmYgaW50ZXJydXB0ICVkLlxuIiwKKwkJCQkJCWJvYXJkLT5pcnEpOwogCQkJfQogCQl9IGVsc2UgewogCQkJbGFzdGppZiA9IGppZmZpZXM7CkBAIC0xMjQzLDE5ICsxMjkzLDIwIEBACiAJfQogI2VuZGlmCiAKLQogCWlmIChib2FyZC0+aXJxID09IGlycSkgewogCQkvKiBUZWxsIHRoZSBjYXJkIHdlJ3ZlIG5vdGljZWQgdGhlIGludGVycnVwdC4gKi8KIAotCQlzeF93cml0ZV9ib2FyZF93b3JkIChib2FyZCwgY2NfaW50X3BlbmRpbmcsIDApOwotCQlpZiAoSVNfU1hfQk9BUkQgKGJvYXJkKSkgewotCQkJd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNYX1JFU0VUX0lSUSwgMSk7CisJCXN4X3dyaXRlX2JvYXJkX3dvcmQoYm9hcmQsIGNjX2ludF9wZW5kaW5nLCAwKTsKKwkJaWYgKElTX1NYX0JPQVJEKGJvYXJkKSkgeworCQkJd3JpdGVfc3hfYnl0ZShib2FyZCwgU1hfUkVTRVRfSVJRLCAxKTsKIAkJfSBlbHNlIGlmIChJU19FSVNBX0JPQVJEKGJvYXJkKSkgewotCQkJaW5iKGJvYXJkLT5laXNhX2Jhc2UrMHhjMDMpOwotCQkJd3JpdGVfc3hfd29yZChib2FyZCwgOCwgMCk7IAorCQkJaW5iKGJvYXJkLT5laXNhX2Jhc2UgKyAweGMwMyk7CisJCQl3cml0ZV9zeF93b3JkKGJvYXJkLCA4LCAwKTsKIAkJfSBlbHNlIHsKLQkJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX0NMRUFSKTsKLQkJCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLCBTSTJfSVNBX0lOVENMRUFSX1NFVCk7CisJCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBTSTJfSVNBX0lOVENMRUFSLAorCQkJCQlTSTJfSVNBX0lOVENMRUFSX0NMRUFSKTsKKwkJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfSU5UQ0xFQVIsCisJCQkJCVNJMl9JU0FfSU5UQ0xFQVJfU0VUKTsKIAkJfQogCX0KIApAQCAtMTI2NCw1MyArMTMxNSw0OCBAQAogCWlmICghKGJvYXJkLT5mbGFncyAmIFNYX0JPQVJEX0lOSVRJQUxJWkVEKSkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQgKFNYX0JPQVJEX0lOVFJfTE9DSywgJmJvYXJkLT5sb2NrcykpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiUmVjdXJzaXZlIGludGVycnVwdCEgKCVkKVxuIiwgYm9hcmQtPmlycSk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU1hfQk9BUkRfSU5UUl9MT0NLLCAmYm9hcmQtPmxvY2tzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlJlY3Vyc2l2ZSBpbnRlcnJ1cHQhICglZClcbiIsIGJvYXJkLT5pcnEpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCi0JIGZvciAoaT0wO2k8Ym9hcmQtPm5wb3J0cztpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYm9hcmQtPm5wb3J0czsgaSsrKSB7CiAJCXBvcnQgPSAmYm9hcmQtPnBvcnRzW2ldOwogCQlpZiAocG9ydC0+Z3MuZmxhZ3MgJiBHU19BQ1RJVkUpIHsKLQkJCWlmIChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfc3RhdGUpKSB7Ci0JCQkJc3hfZHByaW50ayAoU1hfREVCVUdfSU5URVJSVVBUUywgCi0JCQkJICAgICAgICAgICAgIlBvcnQgJWQ6IG1vZGVtIHNpZ25hbCBjaGFuZ2U/Li4uIFxuIiwgaSk7Ci0JCQkJc3hfY2hlY2tfbW9kZW1fc2lnbmFscyAocG9ydCk7IAorCQkJaWYgKHN4X3JlYWRfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX3N0YXRlKSkgeworCQkJCXN4X2RwcmludGsoU1hfREVCVUdfSU5URVJSVVBUUywgIlBvcnQgJWQ6ICIKKwkJCQkJCSJtb2RlbSBzaWduYWwgY2hhbmdlPy4uLiBcbiIsaSk7CisJCQkJc3hfY2hlY2tfbW9kZW1fc2lnbmFscyhwb3J0KTsKIAkJCX0KIAkJCWlmIChwb3J0LT5ncy54bWl0X2NudCkgewotCQkJCXN4X3RyYW5zbWl0X2NoYXJzIChwb3J0KTsKKwkJCQlzeF90cmFuc21pdF9jaGFycyhwb3J0KTsKIAkJCX0KIAkJCWlmICghKHBvcnQtPmdzLmZsYWdzICYgU1hfUlhfVEhST1RUTEUpKSB7Ci0JCQkJc3hfcmVjZWl2ZV9jaGFycyAocG9ydCk7CisJCQkJc3hfcmVjZWl2ZV9jaGFycyhwb3J0KTsKIAkJCX0KIAkJfQogCX0KIAotCWNsZWFyX2JpdCAoU1hfQk9BUkRfSU5UUl9MT0NLLCAmYm9hcmQtPmxvY2tzKTsKKwljbGVhcl9iaXQoU1hfQk9BUkRfSU5UUl9MT0NLLCAmYm9hcmQtPmxvY2tzKTsKIAotCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZMT1csICJzeDogZXhpdCBzeF9pbnRlcnJ1cHQgKCVkLyVkKVxuIiwgaXJxLCBib2FyZC0+aXJxKTsgCi0gICAgICAgIGZ1bmNfZXhpdCAoKTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZMT1csICJzeDogZXhpdCBzeF9pbnRlcnJ1cHQgKCVkLyVkKVxuIiwgaXJxLAorCQkJYm9hcmQtPmlycSk7CisJZnVuY19leGl0KCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0KLXN0YXRpYyB2b2lkIHN4X3BvbGxmdW5jICh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBzeF9wb2xsZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IHN4X2JvYXJkICpib2FyZCA9IChzdHJ1Y3Qgc3hfYm9hcmQgKikgZGF0YTsKKwlzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkID0gKHN0cnVjdCBzeF9ib2FyZCAqKWRhdGE7CiAKLQlmdW5jX2VudGVyICgpOworCWZ1bmNfZW50ZXIoKTsKIAotCXN4X2ludGVycnVwdCAoMCwgYm9hcmQpOworCXN4X2ludGVycnVwdCgwLCBib2FyZCk7CiAKLQlpbml0X3RpbWVyKCZib2FyZC0+dGltZXIpOwotCi0JYm9hcmQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgc3hfcG9sbDsKLQlhZGRfdGltZXIgKCZib2FyZC0+dGltZXIpOwotCWZ1bmNfZXhpdCAoKTsKKwltb2RfdGltZXIoJmJvYXJkLT50aW1lciwgamlmZmllcyArIHN4X3BvbGwpOworCWZ1bmNfZXhpdCgpOwogfQogCi0KLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCiAgKiAgICAgICAgICAgICAgICBIZXJlIGFyZSB0aGUgcm91dGluZXMgdGhhdCBhY3R1YWxseSAgICAgICAgICAgICAgICAgICAgICoKICAqICAgICAgICAgICAgICBpbnRlcmZhY2Ugd2l0aCB0aGUgZ2VuZXJpY19zZXJpYWwgZHJpdmVyICAgICAgICAgICAgICAgICAgKgpAQCAtMTMxOSw5ICsxMzY1LDkgQEAKIC8qIEVoaG0uIEkgZG9uJ3Qga25vdyBob3cgdG8gZmlkZGxlIHdpdGggaW50ZXJydXB0cyBvbiB0aGUgU1ggY2FyZC4gLS1SRVcgKi8KIC8qIEhtbS4gT2sgSSBmaWd1cmVkIGl0IG91dC4gWW91IGRvbid0LiAgKi8KIAotc3RhdGljIHZvaWQgc3hfZGlzYWJsZV90eF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKSAKK3N0YXRpYyB2b2lkIHN4X2Rpc2FibGVfdHhfaW50ZXJydXB0cyh2b2lkICpwdHIpCiB7Ci0Jc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7IAorCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOwogCWZ1bmNfZW50ZXIyKCk7CiAKIAlwb3J0LT5ncy5mbGFncyAmPSB+R1NfVFhfSU5URU47CkBAIC0xMzI5LDMwICsxMzc1LDI4IEBACiAJZnVuY19leGl0KCk7CiB9CiAKLQotc3RhdGljIHZvaWQgc3hfZW5hYmxlX3R4X2ludGVycnVwdHMgKHZvaWQgKiBwdHIpIAorc3RhdGljIHZvaWQgc3hfZW5hYmxlX3R4X2ludGVycnVwdHModm9pZCAqcHRyKQogewotCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOyAKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHB0cjsKIAlpbnQgZGF0YV9pbl9idWZmZXI7CiAJZnVuY19lbnRlcjIoKTsKIAogCS8qIEZpcnN0IHRyYW5zbWl0IHRoZSBjaGFyYWN0ZXJzIHRoYXQgd2UncmUgc3VwcG9zZWQgdG8gKi8KLQlzeF90cmFuc21pdF9jaGFycyAocG9ydCk7CisJc3hfdHJhbnNtaXRfY2hhcnMocG9ydCk7CiAKIAkvKiBUaGUgc3ggY2FyZCB3aWxsIG5ldmVyIGludGVycnVwdCB1cyBpZiB3ZSBkb24ndCBmaWxsIHRoZSBidWZmZXIKIAkgICBwYXN0IDI1JS4gU28gd2Uga2VlcCBjb25zaWRlcmluZyBpbnRlcnJ1cHRzIG9mZiBpZiB0aGF0J3MgdGhlIGNhc2UuICovCi0JZGF0YV9pbl9idWZmZXIgPSAoc3hfcmVhZF9jaGFubmVsX2J5dGUgKHBvcnQsIGhpX3R4aXBvcykgLSAKLQkgICAgICAgICAgICAgICAgICBzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhvcG9zKSkgJiAweGZmOworCWRhdGFfaW5fYnVmZmVyID0gKHN4X3JlYWRfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX3R4aXBvcykgLQorCQkJICBzeF9yZWFkX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV90eG9wb3MpKSAmIDB4ZmY7CiAKIAkvKiBYWFggTXVzdCBiZSAiSElHSF9XQVRFUiIgZm9yIFNJIGNhcmQgYWNjb3JkaW5nIHRvIGRvYy4gKi8KLQlpZiAoZGF0YV9pbl9idWZmZXIgPCBMT1dfV0FURVIpIAorCWlmIChkYXRhX2luX2J1ZmZlciA8IExPV19XQVRFUikKIAkJcG9ydC0+Z3MuZmxhZ3MgJj0gfkdTX1RYX0lOVEVOOwogCiAJZnVuY19leGl0KCk7CiB9CiAKLQotc3RhdGljIHZvaWQgc3hfZGlzYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKSAKK3N0YXRpYyB2b2lkIHN4X2Rpc2FibGVfcnhfaW50ZXJydXB0cyh2b2lkICpwdHIpCiB7CiAJLyogIHN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOyAqLwogCWZ1bmNfZW50ZXIoKTsKQEAgLTEzNjAsNyArMTQwNCw3IEBACiAJZnVuY19leGl0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIHN4X2VuYWJsZV9yeF9pbnRlcnJ1cHRzICh2b2lkICogcHRyKSAKK3N0YXRpYyB2b2lkIHN4X2VuYWJsZV9yeF9pbnRlcnJ1cHRzKHZvaWQgKnB0cikKIHsKIAkvKiAgc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7ICovCiAJZnVuY19lbnRlcigpOwpAQCAtMTM2OCw1NSArMTQxMiw0OCBAQAogCWZ1bmNfZXhpdCgpOwogfQogCi0KIC8qIEplZXouIElzbid0IHRoaXMgc2ltcGxlPyAqLwotc3RhdGljIGludCBzeF9nZXRfQ0QgKHZvaWQgKiBwdHIpIAorc3RhdGljIGludCBzeF9nZXRfQ0Qodm9pZCAqcHRyKQogewogCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOwogCWZ1bmNfZW50ZXIyKCk7CiAKIAlmdW5jX2V4aXQoKTsKLQlyZXR1cm4gKChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfaXApICYgSVBfRENEKSAhPSAwKTsKKwlyZXR1cm4gKChzeF9yZWFkX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV9pcCkgJiBJUF9EQ0QpICE9IDApOwogfQogCi0KIC8qIEplZXouIElzbid0IHRoaXMgc2ltcGxlPyAqLwotc3RhdGljIGludCBzeF9jaGFyc19pbl9idWZmZXIgKHZvaWQgKiBwdHIpIAorc3RhdGljIGludCBzeF9jaGFyc19pbl9idWZmZXIodm9pZCAqcHRyKQogewogCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOwogCWZ1bmNfZW50ZXIyKCk7CiAKIAlmdW5jX2V4aXQoKTsKLQlyZXR1cm4gKChzeF9yZWFkX2NoYW5uZWxfYnl0ZSAocG9ydCwgaGlfdHhpcG9zKSAtIAotCSAgICAgICAgIHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV90eG9wb3MpKSAmIDB4ZmYpOworCXJldHVybiAoKHN4X3JlYWRfY2hhbm5lbF9ieXRlKHBvcnQsIGhpX3R4aXBvcykgLQorCQkgc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfdHhvcG9zKSkgJiAweGZmKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBzeF9zaHV0ZG93bl9wb3J0ICh2b2lkICogcHRyKSAKK3N0YXRpYyB2b2lkIHN4X3NodXRkb3duX3BvcnQodm9pZCAqcHRyKQogewotCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOyAKKwlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHB0cjsKIAogCWZ1bmNfZW50ZXIoKTsKIAotCXBvcnQtPmdzLmZsYWdzICY9IH4gR1NfQUNUSVZFOworCXBvcnQtPmdzLmZsYWdzICY9IH5HU19BQ1RJVkU7CiAJaWYgKHBvcnQtPmdzLnR0eSAmJiAocG9ydC0+Z3MudHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpKSB7Ci0JCXN4X3NldHNpZ25hbHMgKHBvcnQsIDAsIDApOworCQlzeF9zZXRzaWduYWxzKHBvcnQsIDAsIDApOwogCQlzeF9yZWNvbmZpZ3VyZV9wb3J0KHBvcnQpOwogCX0KIAogCWZ1bmNfZXhpdCgpOwogfQogCi0KLQotCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgogICogICAgICAgICAgICAgICAgSGVyZSBhcmUgdGhlIHJvdXRpbmVzIHRoYXQgYWN0dWFsbHkgICAgICAgICAgICAgICAgICAgICAqCiAgKiAgICAgICAgICAgICAgIGludGVyZmFjZSB3aXRoIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICoKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotc3RhdGljIGludCBzeF9vcGVuICAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyBpbnQgc3hfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydDsKIAlpbnQgcmV0dmFsLCBsaW5lOwpAQCAtMTQyOSwxOCArMTQ2NiwxOCBAQAogCX0KIAogCWxpbmUgPSB0dHktPmluZGV4OwotCXN4X2RwcmludGsgKFNYX0RFQlVHX09QRU4sICIlZDogb3BlbmluZyBsaW5lICVkLiB0dHk9JXAgY3R0eT0lcCwgbnA9JWQpXG4iLCAKLQkgICAgICAgICAgICBjdXJyZW50LT5waWQsIGxpbmUsIHR0eSwgY3VycmVudC0+c2lnbmFsLT50dHksIHN4X25wb3J0cyk7CisJc3hfZHByaW50ayhTWF9ERUJVR19PUEVOLCAiJWQ6IG9wZW5pbmcgbGluZSAlZC4gdHR5PSVwIGN0dHk9JXAsICIKKwkJCSJucD0lZClcbiIsIGN1cnJlbnQtPnBpZCwgbGluZSwgdHR5LAorCQkJY3VycmVudC0+c2lnbmFsLT50dHksIHN4X25wb3J0cyk7CiAKIAlpZiAoKGxpbmUgPCAwKSB8fCAobGluZSA+PSBTWF9OUE9SVFMpIHx8IChsaW5lID49IHN4X25wb3J0cykpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcG9ydCA9ICYgc3hfcG9ydHNbbGluZV07CisJcG9ydCA9ICZzeF9wb3J0c1tsaW5lXTsKIAlwb3J0LT5jX2RjZCA9IDA7IC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBpbnRlcnJ1cHQgZG9lc24ndCBkZXRlY3QgYQotCSAgICAgICAgICAgICAgICAgICAgMSAtPiAwIHRyYW5zaXRpb24uICovCisJCQkgICAgMSAtPiAwIHRyYW5zaXRpb24uICovCiAKLQotCXN4X2RwcmludGsgKFNYX0RFQlVHX09QRU4sICJwb3J0ID0gJXAgY19kY2QgPSAlZFxuIiwgcG9ydCwgcG9ydC0+Y19kY2QpOworCXN4X2RwcmludGsoU1hfREVCVUdfT1BFTiwgInBvcnQgPSAlcCBjX2RjZCA9ICVkXG4iLCBwb3J0LCBwb3J0LT5jX2RjZCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+Z3MuZHJpdmVyX2xvY2ssIGZsYWdzKTsKIApAQCAtMTQ0OSwxMyArMTQ4NiwxMyBAQAogCXBvcnQtPmdzLmNvdW50Kys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+Z3MuZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAotCXN4X2RwcmludGsgKFNYX0RFQlVHX09QRU4sICJzdGFydGluZyBwb3J0XG4iKTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX09QRU4sICJzdGFydGluZyBwb3J0XG4iKTsKIAogCS8qCiAJICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKIAkgKi8KIAlyZXR2YWwgPSBnc19pbml0X3BvcnQoJnBvcnQtPmdzKTsKLQlzeF9kcHJpbnRrIChTWF9ERUJVR19PUEVOLCAiZG9uZSBnc19pbml0XG4iKTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX09QRU4sICJkb25lIGdzX2luaXRcbiIpOwogCWlmIChyZXR2YWwpIHsKIAkJcG9ydC0+Z3MuY291bnQtLTsKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTE0NjMsMTkgKzE1MDAsMjAgQEAKIAogCXBvcnQtPmdzLmZsYWdzIHw9IEdTX0FDVElWRTsKIAlpZiAocG9ydC0+Z3MuY291bnQgPD0gMSkKLQkJc3hfc2V0c2lnbmFscyAocG9ydCwgMSwxKTsKKwkJc3hfc2V0c2lnbmFscyhwb3J0LCAxLCAxKTsKIAogI2lmIDAKIAlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19PUEVOKQotCQlteV9oZCAocG9ydCwgc2l6ZW9mICgqcG9ydCkpOworCQlteV9oZChwb3J0LCBzaXplb2YoKnBvcnQpKTsKICNlbHNlCiAJaWYgKHN4X2RlYnVnICYgU1hfREVCVUdfT1BFTikKLQkJbXlfaGRfaW8gKHBvcnQtPmJvYXJkLT5iYXNlICsgcG9ydC0+Y2hfYmFzZSwgc2l6ZW9mICgqcG9ydCkpOworCQlteV9oZF9pbyhwb3J0LT5ib2FyZC0+YmFzZSArIHBvcnQtPmNoX2Jhc2UsIHNpemVvZigqcG9ydCkpOwogI2VuZGlmCiAKIAlpZiAocG9ydC0+Z3MuY291bnQgPD0gMSkgewotCQlpZiAoc3hfc2VuZF9jb21tYW5kIChwb3J0LCBIU19MT1BFTiwgLTEsIEhTX0lETEVfT1BFTikgIT0gMSkgewotCQkJcHJpbnRrIChLRVJOX0VSUiAic3g6IENhcmQgZGlkbid0IHJlc3BvbmQgdG8gTE9QRU4gY29tbWFuZC5cbiIpOworCQlpZiAoc3hfc2VuZF9jb21tYW5kKHBvcnQsIEhTX0xPUEVOLCAtMSwgSFNfSURMRV9PUEVOKSAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInN4OiBDYXJkIGRpZG4ndCByZXNwb25kIHRvIExPUEVOICIKKwkJCQkJImNvbW1hbmQuXG4iKTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5ncy5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCQkJcG9ydC0+Z3MuY291bnQtLTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmdzLmRyaXZlcl9sb2NrLCBmbGFncyk7CkBAIC0xNDg0LDc1ICsxNTIyLDc2IEBACiAJfQogCiAJcmV0dmFsID0gZ3NfYmxvY2tfdGlsX3JlYWR5KHBvcnQsIGZpbHApOwotCXN4X2RwcmludGsgKFNYX0RFQlVHX09QRU4sICJCbG9jayB0aWwgcmVhZHkgcmV0dXJuZWQgJWQuIENvdW50PSVkXG4iLCAKLQkgICAgICAgICAgICByZXR2YWwsIHBvcnQtPmdzLmNvdW50KTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX09QRU4sICJCbG9jayB0aWwgcmVhZHkgcmV0dXJuZWQgJWQuIENvdW50PSVkXG4iLAorCQkJcmV0dmFsLCBwb3J0LT5ncy5jb3VudCk7CiAKIAlpZiAocmV0dmFsKSB7Ci0JCS8qIAotCQkgKiBEb24ndCBsb3dlciBncy5jb3VudCBoZXJlIGJlY2F1c2Ugc3hfY2xvc2UoKSB3aWxsIGJlIGNhbGxlZCBsYXRlcgotCQkgKi8gCisvKgorICogRG9uJ3QgbG93ZXIgZ3MuY291bnQgaGVyZSBiZWNhdXNlIHN4X2Nsb3NlKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIKKyAqLwogCiAJCXJldHVybiByZXR2YWw7CiAJfQogCS8qIHR0eS0+bG93X2xhdGVuY3kgPSAxOyAqLwogCi0JcG9ydC0+Y19kY2QgPSBzeF9nZXRfQ0QgKHBvcnQpOwotCXN4X2RwcmludGsgKFNYX0RFQlVHX09QRU4sICJhdCBvcGVuOiBjZD0lZFxuIiwgcG9ydC0+Y19kY2QpOworCXBvcnQtPmNfZGNkID0gc3hfZ2V0X0NEKHBvcnQpOworCXN4X2RwcmludGsoU1hfREVCVUdfT1BFTiwgImF0IG9wZW46IGNkPSVkXG4iLCBwb3J0LT5jX2RjZCk7CiAKIAlmdW5jX2V4aXQoKTsKIAlyZXR1cm4gMDsKIAogfQogCi0KLXN0YXRpYyB2b2lkIHN4X2Nsb3NlICh2b2lkICpwdHIpCitzdGF0aWMgdm9pZCBzeF9jbG9zZSh2b2lkICpwdHIpCiB7Ci0Jc3RydWN0IHN4X3BvcnQgKnBvcnQgPSBwdHI7IAorCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gcHRyOwogCS8qIEdpdmUgdGhlIHBvcnQgNSBzZWNvbmRzIHRvIGNsb3NlIGRvd24uICovCi0JaW50IHRvID0gNSAqIEhaOyAKKwlpbnQgdG8gPSA1ICogSFo7CiAKLQlmdW5jX2VudGVyICgpOworCWZ1bmNfZW50ZXIoKTsKIAotCXN4X3NldHNpZ25hbHMgKHBvcnQsIDAsIDApOwotCXN4X3JlY29uZmlndXJlX3BvcnQocG9ydCk7CQotCXN4X3NlbmRfY29tbWFuZCAocG9ydCwgSFNfQ0xPU0UsIDAsIDApOworCXN4X3NldHNpZ25hbHMocG9ydCwgMCwgMCk7CisJc3hfcmVjb25maWd1cmVfcG9ydChwb3J0KTsKKwlzeF9zZW5kX2NvbW1hbmQocG9ydCwgSFNfQ0xPU0UsIDAsIDApOwogCi0Jd2hpbGUgKHRvLS0gJiYgKHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9oc3RhdCkgIT0gSFNfSURMRV9DTE9TRUQpKQorCXdoaWxlICh0by0tICYmIChzeF9yZWFkX2NoYW5uZWxfYnl0ZShwb3J0LCBoaV9oc3RhdCkgIT0gSFNfSURMRV9DTE9TRUQpKQogCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTApKQogCQkJYnJlYWs7Ci0JaWYgKHN4X3JlYWRfY2hhbm5lbF9ieXRlIChwb3J0LCBoaV9oc3RhdCkgIT0gSFNfSURMRV9DTE9TRUQpIHsKLQkJaWYgKHN4X3NlbmRfY29tbWFuZCAocG9ydCwgSFNfRk9SQ0VfQ0xPU0VELCAtMSwgSFNfSURMRV9DTE9TRUQpICE9IDEpIHsKLQkJCXByaW50ayAoS0VSTl9FUlIgCi0JCQkgICAgICAgICJzeDogc2VudCB0aGUgZm9yY2VfY2xvc2UgY29tbWFuZCwgYnV0IGNhcmQgZGlkbid0IHJlYWN0XG4iKTsKKwlpZiAoc3hfcmVhZF9jaGFubmVsX2J5dGUocG9ydCwgaGlfaHN0YXQpICE9IEhTX0lETEVfQ0xPU0VEKSB7CisJCWlmIChzeF9zZW5kX2NvbW1hbmQocG9ydCwgSFNfRk9SQ0VfQ0xPU0VELCAtMSwgSFNfSURMRV9DTE9TRUQpCisJCQkJIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzeDogc2VudCB0aGUgZm9yY2VfY2xvc2UgY29tbWFuZCwgYnV0ICIKKwkJCQkJImNhcmQgZGlkbid0IHJlYWN0XG4iKTsKIAkJfSBlbHNlCi0JCQlzeF9kcHJpbnRrIChTWF9ERUJVR19DTE9TRSwgInNlbnQgdGhlIGZvcmNlX2Nsb3NlIGNvbW1hbmQuXG4iKTsKKwkJCXN4X2RwcmludGsoU1hfREVCVUdfQ0xPU0UsICJzZW50IHRoZSBmb3JjZV9jbG9zZSAiCisJCQkJCSJjb21tYW5kLlxuIik7CiAJfQogCi0Jc3hfZHByaW50ayAoU1hfREVCVUdfQ0xPU0UsICJ3YWl0ZWQgJWQgamlmZmllcyBmb3IgY2xvc2UuIGNvdW50PSVkXG4iLCAKLQkgICAgICAgICAgICA1ICogSFogLSB0byAtIDEsIHBvcnQtPmdzLmNvdW50KTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX0NMT1NFLCAid2FpdGVkICVkIGppZmZpZXMgZm9yIGNsb3NlLiBjb3VudD0lZFxuIiwKKwkJCTUgKiBIWiAtIHRvIC0gMSwgcG9ydC0+Z3MuY291bnQpOwogCi0JaWYocG9ydC0+Z3MuY291bnQpIHsKLQkJc3hfZHByaW50ayhTWF9ERUJVR19DTE9TRSwgIldBUk5JTkcgcG9ydCBjb3VudDolZFxuIiwgcG9ydC0+Z3MuY291bnQpOwotCQkvL3ByaW50ayAoIiVzIFNFVFRJTkcgcG9ydCBjb3VudCB0byB6ZXJvOiAlcCBjb3VudDogJWRcbiIsIF9fRlVOQ1RJT05fXywgcG9ydCwgcG9ydC0+Z3MuY291bnQpOwotCQkvL3BvcnQtPmdzLmNvdW50ID0gMDsKKwlpZiAocG9ydC0+Z3MuY291bnQpIHsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19DTE9TRSwgIldBUk5JTkcgcG9ydCBjb3VudDolZFxuIiwKKwkJCQlwb3J0LT5ncy5jb3VudCk7CisJCS8qcHJpbnRrKCIlcyBTRVRUSU5HIHBvcnQgY291bnQgdG8gemVybzogJXAgY291bnQ6ICVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgcG9ydCwgcG9ydC0+Z3MuY291bnQpOworCQlwb3J0LT5ncy5jb3VudCA9IDA7Ki8KIAl9CiAKLQlmdW5jX2V4aXQgKCk7CisJZnVuY19leGl0KCk7CiB9CiAKLQotCiAvKiBUaGlzIGlzIHJlbGF0aXZlbHkgdGhvcm91Z2guIEJ1dCB0aGVuIGFnYWluIGl0IGlzIG9ubHkgMjAgbGluZXMuICovCi0jZGVmaW5lIE1BUkNIVVAgICAgZm9yIChpPW1pbjtpPG1heDtpKyspIAotI2RlZmluZSBNQVJDSERPV04gIGZvciAoaT1tYXgtMTtpPj1taW47aS0tKQotI2RlZmluZSBXMCAgICAgICAgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBpLCAweDU1KQotI2RlZmluZSBXMSAgICAgICAgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBpLCAweGFhKQotI2RlZmluZSBSMCAgICAgICAgIGlmIChyZWFkX3N4X2J5dGUgKGJvYXJkLCBpKSAhPSAweDU1KSByZXR1cm4gMQotI2RlZmluZSBSMSAgICAgICAgIGlmIChyZWFkX3N4X2J5dGUgKGJvYXJkLCBpKSAhPSAweGFhKSByZXR1cm4gMQorI2RlZmluZSBNQVJDSFVQCQlmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKKyNkZWZpbmUgTUFSQ0hET1dOCWZvciAoaSA9IG1heCAtIDE7IGkgPj0gbWluOyBpLS0pCisjZGVmaW5lIFcwCQl3cml0ZV9zeF9ieXRlKGJvYXJkLCBpLCAweDU1KQorI2RlZmluZSBXMQkJd3JpdGVfc3hfYnl0ZShib2FyZCwgaSwgMHhhYSkKKyNkZWZpbmUgUjAJCWlmIChyZWFkX3N4X2J5dGUoYm9hcmQsIGkpICE9IDB4NTUpIHJldHVybiAxCisjZGVmaW5lIFIxCQlpZiAocmVhZF9zeF9ieXRlKGJvYXJkLCBpKSAhPSAweGFhKSByZXR1cm4gMQogCiAvKiBUaGlzIG1lbXRlc3QgdGFrZXMgYSBodW1hbi1ub3RpY2FibGUgdGltZS4gWW91IG5vcm1hbGx5IG9ubHkgZG8gaXQKICAgIG9uY2UgYSBib290LCBzbyBJIGd1ZXNzIHRoYXQgaXQgaXMgd29ydGggaXQuICovCi1zdGF0aWMgaW50IGRvX21lbXRlc3QgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsIGludCBtaW4sIGludCBtYXgpCitzdGF0aWMgaW50IGRvX21lbXRlc3Qoc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG1pbiwgaW50IG1heCkKIHsKIAlpbnQgaTsKIApAQCAtMTU2MSwxNiArMTYwMCwzNyBAQAogCSAgIGludGVybWl0dGVudCBlcnJvcnMuIC0tIFJFVwogCSAgIChGb3IgdGhlIHRoZW9yeSBiZWhpbmQgbWVtb3J5IHRlc3Rpbmcgc2VlOiAKIAkgICBUZXN0aW5nIFNlbWljb25kdWN0b3IgTWVtb3JpZXMgYnkgQS5KLiB2YW4gZGUgR29vci4pICovCi0JTUFSQ0hVUAkge1cwO30KLQlNQVJDSFVQICAge1IwO1cxO1IxO1cwO1IwO1cxO30KLQlNQVJDSFVQICAge1IxO1cwO1cxO30KLQlNQVJDSERPV04ge1IxO1cwO1cxO1cwO30KLQlNQVJDSERPV04ge1IwO1cxO1cwO30KKwlNQVJDSFVQIHsKKwkJVzA7CisJfQorCU1BUkNIVVAgeworCQlSMDsKKwkJVzE7CisJCVIxOworCQlXMDsKKwkJUjA7CisJCVcxOworCX0KKwlNQVJDSFVQIHsKKwkJUjE7CisJCVcwOworCQlXMTsKKwl9CisJTUFSQ0hET1dOIHsKKwkJUjE7CisJCVcwOworCQlXMTsKKwkJVzA7CisJfQorCU1BUkNIRE9XTiB7CisJCVIwOworCQlXMTsKKwkJVzA7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLQogI3VuZGVmIE1BUkNIVVAKICN1bmRlZiBNQVJDSERPV04KICN1bmRlZiBXMApAQCAtMTU3OCwzMyArMTYzOCw1NCBAQAogI3VuZGVmIFIwCiAjdW5kZWYgUjEKIAotI2RlZmluZSBNQVJDSFVQICAgIGZvciAoaT1taW47aTxtYXg7aSs9MikgCi0jZGVmaW5lIE1BUkNIRE9XTiAgZm9yIChpPW1heC0xO2k+PW1pbjtpLT0yKQotI2RlZmluZSBXMCAgICAgICAgIHdyaXRlX3N4X3dvcmQgKGJvYXJkLCBpLCAweDU1YWEpCi0jZGVmaW5lIFcxICAgICAgICAgd3JpdGVfc3hfd29yZCAoYm9hcmQsIGksIDB4YWE1NSkKLSNkZWZpbmUgUjAgICAgICAgICBpZiAocmVhZF9zeF93b3JkIChib2FyZCwgaSkgIT0gMHg1NWFhKSByZXR1cm4gMQotI2RlZmluZSBSMSAgICAgICAgIGlmIChyZWFkX3N4X3dvcmQgKGJvYXJkLCBpKSAhPSAweGFhNTUpIHJldHVybiAxCisjZGVmaW5lIE1BUkNIVVAJCWZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSArPSAyKQorI2RlZmluZSBNQVJDSERPV04JZm9yIChpID0gbWF4IC0gMTsgaSA+PSBtaW47IGkgLT0gMikKKyNkZWZpbmUgVzAJCXdyaXRlX3N4X3dvcmQoYm9hcmQsIGksIDB4NTVhYSkKKyNkZWZpbmUgVzEJCXdyaXRlX3N4X3dvcmQoYm9hcmQsIGksIDB4YWE1NSkKKyNkZWZpbmUgUjAJCWlmIChyZWFkX3N4X3dvcmQoYm9hcmQsIGkpICE9IDB4NTVhYSkgcmV0dXJuIDEKKyNkZWZpbmUgUjEJCWlmIChyZWFkX3N4X3dvcmQoYm9hcmQsIGkpICE9IDB4YWE1NSkgcmV0dXJuIDEKIAogI2lmIDAKIC8qIFRoaXMgbWVtdGVzdCB0YWtlcyBhIGh1bWFuLW5vdGljYWJsZSB0aW1lLiBZb3Ugbm9ybWFsbHkgb25seSBkbyBpdAogICAgb25jZSBhIGJvb3QsIHNvIEkgZ3Vlc3MgdGhhdCBpdCBpcyB3b3J0aCBpdC4gKi8KLXN0YXRpYyBpbnQgZG9fbWVtdGVzdF93IChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkLCBpbnQgbWluLCBpbnQgbWF4KQorc3RhdGljIGludCBkb19tZW10ZXN0X3coc3RydWN0IHN4X2JvYXJkICpib2FyZCwgaW50IG1pbiwgaW50IG1heCkKIHsKIAlpbnQgaTsKIAotCU1BUkNIVVAgICB7VzA7fQotCU1BUkNIVVAgICB7UjA7VzE7UjE7VzA7UjA7VzE7fQotCU1BUkNIVVAgICB7UjE7VzA7VzE7fQotCU1BUkNIRE9XTiB7UjE7VzA7VzE7VzA7fQotCU1BUkNIRE9XTiB7UjA7VzE7VzA7fQorCU1BUkNIVVAgeworCQlXMDsKKwl9CisJTUFSQ0hVUCB7CisJCVIwOworCQlXMTsKKwkJUjE7CisJCVcwOworCQlSMDsKKwkJVzE7CisJfQorCU1BUkNIVVAgeworCQlSMTsKKwkJVzA7CisJCVcxOworCX0KKwlNQVJDSERPV04geworCQlSMTsKKwkJVzA7CisJCVcxOworCQlXMDsKKwl9CisJTUFSQ0hET1dOIHsKKwkJUjA7CisJCVcxOworCQlXMDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi0KLXN0YXRpYyBpbnQgc3hfZndfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IHN4X2Z3X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgcmMgPSAwOwogCWludCBfX3VzZXIgKmRlc2NyID0gKGludCBfX3VzZXIgKilhcmc7CkBAIC0xNjE2LDcgKzE2OTcsNyBAQAogCiAJZnVuY19lbnRlcigpOwogCi0jaWYgMCAKKyNpZiAwCiAJLyogUmVtb3ZlZCBzdXBlcnVzZXIgY2hlY2s6IFN5c29wcyBjYW4gdXNlIHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgZGV2aWNlCiAJICAgZmlsZSB0byByZXN0cmljdCBhY2Nlc3MuIFJlY29tbWVuZGF0aW9uOiBSb290IG9ubHkuIChyb290LnJvb3QgNjAwKSAqLwogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewpAQCAtMTYyNCwxMDMgKzE3MDUsMTE1IEBACiAJfQogI2VuZGlmCiAKLQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgIklPQ1RMICV4OiAlbHhcbiIsIGNtZCwgYXJnKTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZJUk1XQVJFLCAiSU9DVEwgJXg6ICVseFxuIiwgY21kLCBhcmcpOwogCi0JaWYgKCFib2FyZCkgYm9hcmQgPSAmYm9hcmRzWzBdOworCWlmICghYm9hcmQpCisJCWJvYXJkID0gJmJvYXJkc1swXTsKIAlpZiAoYm9hcmQtPmZsYWdzICYgU1hfQk9BUkRfUFJFU0VOVCkgewotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgIkJvYXJkIHByZXNlbnQhICgleClcbiIsIAotCQkgICAgICAgICAgICBib2FyZC0+ZmxhZ3MpOworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZJUk1XQVJFLCAiQm9hcmQgcHJlc2VudCEgKCV4KVxuIiwKKwkJCQlib2FyZC0+ZmxhZ3MpOwogCX0gZWxzZSB7Ci0JCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAiQm9hcmQgbm90IHByZXNlbnQhICgleCkgYWxsOiIsIAotCQkgICAgICAgICAgICBib2FyZC0+ZmxhZ3MpOwotCQlmb3IgKGk9MDtpPCBTWF9OQk9BUkRTO2krKykKLQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAiPCV4PiAiLCBib2FyZHNbaV0uZmxhZ3MpOwotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgIlxuIik7CisJCXN4X2RwcmludGsoU1hfREVCVUdfRklSTVdBUkUsICJCb2FyZCBub3QgcHJlc2VudCEgKCV4KSBhbGw6IiwKKwkJCQlib2FyZC0+ZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgU1hfTkJPQVJEUzsgaSsrKQorCQkJc3hfZHByaW50ayhTWF9ERUJVR19GSVJNV0FSRSwgIjwleD4gIiwgYm9hcmRzW2ldLmZsYWdzKTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19GSVJNV0FSRSwgIlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTWElPX1NFVF9CT0FSRDoKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJzZXQgYm9hcmQgdG8gJWxkXG4iLCBhcmcpOwotCQlpZiAoYXJnID49IFNYX05CT0FSRFMpIHJldHVybiAtRUlPOwotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19GSVJNV0FSRSwgIm5vdCBvdXQgb2YgcmFuZ2VcbiIpOwotCQlpZiAoIShib2FyZHNbYXJnXS5mbGFncwkmIFNYX0JPQVJEX1BSRVNFTlQpKSByZXR1cm4gLUVJTzsKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICIuLiBhbmQgcHJlc2VudCFcbiIpOworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZJUk1XQVJFLCAic2V0IGJvYXJkIHRvICVsZFxuIiwgYXJnKTsKKwkJaWYgKGFyZyA+PSBTWF9OQk9BUkRTKQorCQkJcmV0dXJuIC1FSU87CisJCXN4X2RwcmludGsoU1hfREVCVUdfRklSTVdBUkUsICJub3Qgb3V0IG9mIHJhbmdlXG4iKTsKKwkJaWYgKCEoYm9hcmRzW2FyZ10uZmxhZ3MgJiBTWF9CT0FSRF9QUkVTRU5UKSkKKwkJCXJldHVybiAtRUlPOworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZJUk1XQVJFLCAiLi4gYW5kIHByZXNlbnQhXG4iKTsKIAkJYm9hcmQgPSAmYm9hcmRzW2FyZ107CiAJCWJyZWFrOwogCWNhc2UgU1hJT19HRVRfVFlQRToKLQkJcmMgPSAtRU5PRU5UOyAvKiBJZiB3ZSBtYW5hZ2UgdG8gbWlzcyBvbmUsIHJldHVybiBlcnJvci4gKi8KLQkJaWYgKElTX1NYX0JPQVJEIChib2FyZCkpIHJjID0gU1hfVFlQRV9TWDsKLQkJaWYgKElTX0NGX0JPQVJEIChib2FyZCkpIHJjID0gU1hfVFlQRV9DRjsKLQkJaWYgKElTX1NJX0JPQVJEIChib2FyZCkpIHJjID0gU1hfVFlQRV9TSTsKLQkJaWYgKElTX1NJMV9CT0FSRCAoYm9hcmQpKSByYyA9IFNYX1RZUEVfU0k7Ci0JCWlmIChJU19FSVNBX0JPQVJEIChib2FyZCkpIHJjID0gU1hfVFlQRV9TSTsKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJyZXR1cm5pbmcgdHlwZT0gJWRcbiIsIHJjKTsKKwkJcmMgPSAtRU5PRU5UOwkvKiBJZiB3ZSBtYW5hZ2UgdG8gbWlzcyBvbmUsIHJldHVybiBlcnJvci4gKi8KKwkJaWYgKElTX1NYX0JPQVJEKGJvYXJkKSkKKwkJCXJjID0gU1hfVFlQRV9TWDsKKwkJaWYgKElTX0NGX0JPQVJEKGJvYXJkKSkKKwkJCXJjID0gU1hfVFlQRV9DRjsKKwkJaWYgKElTX1NJX0JPQVJEKGJvYXJkKSkKKwkJCXJjID0gU1hfVFlQRV9TSTsKKwkJaWYgKElTX1NJMV9CT0FSRChib2FyZCkpCisJCQlyYyA9IFNYX1RZUEVfU0k7CisJCWlmIChJU19FSVNBX0JPQVJEKGJvYXJkKSkKKwkJCXJjID0gU1hfVFlQRV9TSTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19GSVJNV0FSRSwgInJldHVybmluZyB0eXBlPSAlZFxuIiwgcmMpOwogCQlicmVhazsKIAljYXNlIFNYSU9fRE9fUkFNVEVTVDoKLQkJaWYgKHN4X2luaXRpYWxpemVkKSAvKiBBbHJlYWR5IGluaXRpYWxpemVkOiBiZXR0ZXIgbm90IHJhbXRlc3QgdGhlIGJvYXJkLiAgKi8KKwkJaWYgKHN4X2luaXRpYWxpemVkKQkvKiBBbHJlYWR5IGluaXRpYWxpemVkOiBiZXR0ZXIgbm90IHJhbXRlc3QgdGhlIGJvYXJkLiAgKi8KIAkJCXJldHVybiAtRVBFUk07Ci0JCWlmIChJU19TWF9CT0FSRCAoYm9hcmQpKSB7Ci0JCQlyYyAgICAgICAgICA9IGRvX21lbXRlc3QgICAoYm9hcmQsIDAsIDB4NzAwMCk7Ci0JCQlpZiAoIXJjKSByYyA9IGRvX21lbXRlc3QgICAoYm9hcmQsIDAsIDB4NzAwMCk7Ci0JCQkvKmlmICghcmMpIHJjID0gZG9fbWVtdGVzdF93IChib2FyZCwgMCwgMHg3MDAwKTsqLworCQlpZiAoSVNfU1hfQk9BUkQoYm9hcmQpKSB7CisJCQlyYyA9IGRvX21lbXRlc3QoYm9hcmQsIDAsIDB4NzAwMCk7CisJCQlpZiAoIXJjKQorCQkJCXJjID0gZG9fbWVtdGVzdChib2FyZCwgMCwgMHg3MDAwKTsKKwkJCS8qaWYgKCFyYykgcmMgPSBkb19tZW10ZXN0X3cgKGJvYXJkLCAwLCAweDcwMDApOyAqLwogCQl9IGVsc2UgewotCQkJcmMgICAgICAgICAgICAgPSBkb19tZW10ZXN0ICAgKGJvYXJkLCAwLCAweDdmZjgpOworCQkJcmMgPSBkb19tZW10ZXN0KGJvYXJkLCAwLCAweDdmZjgpOwogCQkJLyogaWYgKCFyYykgcmMgPSBkb19tZW10ZXN0X3cgKGJvYXJkLCAwLCAweDdmZjgpOyAqLwogCQl9Ci0JCXN4X2RwcmludGsgKFNYX0RFQlVHX0ZJUk1XQVJFLCAicmV0dXJuaW5nIG1lbXRlc3QgcmVzdWx0PSAlZFxuIiwgcmMpOworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZJUk1XQVJFLCAicmV0dXJuaW5nIG1lbXRlc3QgcmVzdWx0PSAlZFxuIiwKKwkJCSAgIHJjKTsKIAkJYnJlYWs7CiAJY2FzZSBTWElPX0RPV05MT0FEOgotCQlpZiAoc3hfaW5pdGlhbGl6ZWQpIC8qIEFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwkJaWYgKHN4X2luaXRpYWxpemVkKQkvKiBBbHJlYWR5IGluaXRpYWxpemVkICovCiAJCQlyZXR1cm4gLUVFWElTVDsKLQkJaWYgKCFzeF9yZXNldCAoYm9hcmQpKSAKKwkJaWYgKCFzeF9yZXNldChib2FyZCkpCiAJCQlyZXR1cm4gLUVJTzsKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgInJlc2V0IHRoZSBib2FyZC4uLlxuIik7CisJCXN4X2RwcmludGsoU1hfREVCVUdfSU5JVCwgInJlc2V0IHRoZSBib2FyZC4uLlxuIik7CiAKLQkJdG1wID0ga21hbGxvYyAoU1hfQ0hVTktfU0laRSwgR0ZQX1VTRVIpOwotCQlpZiAoIXRtcCkgcmV0dXJuIC1FTk9NRU07Ci0JCWdldF91c2VyIChuYnl0ZXMsIGRlc2NyKyspOwotCQlnZXRfdXNlciAob2Zmc2V0LCBkZXNjcisrKTsgCi0JCWdldF91c2VyIChkYXRhLAkgZGVzY3IrKyk7CisJCXRtcCA9IGttYWxsb2MoU1hfQ0hVTktfU0laRSwgR0ZQX1VTRVIpOworCQlpZiAoIXRtcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlnZXRfdXNlcihuYnl0ZXMsIGRlc2NyKyspOworCQlnZXRfdXNlcihvZmZzZXQsIGRlc2NyKyspOworCQlnZXRfdXNlcihkYXRhLCBkZXNjcisrKTsKIAkJd2hpbGUgKG5ieXRlcyAmJiBkYXRhKSB7Ci0JCQlmb3IgKGk9MDtpPG5ieXRlcztpICs9IFNYX0NIVU5LX1NJWkUpIHsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIodG1wLCAoY2hhciBfX3VzZXIgKilkYXRhK2ksIAotCQkJCQkJICAgKGkgKyBTWF9DSFVOS19TSVpFID4KLQkJCQkJCSAgICBuYnl0ZXMpID8gbmJ5dGVzIC0gaSA6Ci0JCQkJCQkgICAJICAgICAgU1hfQ0hVTktfU0laRSkpIHsKLQkJCQkJa2ZyZWUgKHRtcCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpICs9IFNYX0NIVU5LX1NJWkUpIHsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIodG1wLCAoY2hhciBfX3VzZXIgKilkYXRhICsgaSwKKwkJCQkJCShpICsgU1hfQ0hVTktfU0laRSA+IG5ieXRlcykgPworCQkJCQkJbmJ5dGVzIC0gaSA6IFNYX0NIVU5LX1NJWkUpKSB7CisJCQkJCWtmcmVlKHRtcCk7CiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCX0KLQkJCQltZW1jcHlfdG9pbyhib2FyZC0+YmFzZTIgKyBvZmZzZXQgKyBpLCB0bXAsIAotCQkJCSAgICAgICAgICAgICAgICAoaStTWF9DSFVOS19TSVpFPm5ieXRlcyk/bmJ5dGVzLWk6U1hfQ0hVTktfU0laRSk7CisJCQkJbWVtY3B5X3RvaW8oYm9hcmQtPmJhc2UyICsgb2Zmc2V0ICsgaSwgdG1wLAorCQkJCQkJKGkgKyBTWF9DSFVOS19TSVpFID4gbmJ5dGVzKSA/CisJCQkJCQluYnl0ZXMgLSBpIDogU1hfQ0hVTktfU0laRSk7CiAJCQl9CiAKLQkJCWdldF91c2VyIChuYnl0ZXMsIGRlc2NyKyspOwotCQkJZ2V0X3VzZXIgKG9mZnNldCwgZGVzY3IrKyk7IAotCQkJZ2V0X3VzZXIgKGRhdGEsICAgZGVzY3IrKyk7CisJCQlnZXRfdXNlcihuYnl0ZXMsIGRlc2NyKyspOworCQkJZ2V0X3VzZXIob2Zmc2V0LCBkZXNjcisrKTsKKwkJCWdldF91c2VyKGRhdGEsIGRlc2NyKyspOwogCQl9Ci0JCWtmcmVlICh0bXApOwotCQlzeF9ucG9ydHMgKz0gc3hfaW5pdF9ib2FyZCAoYm9hcmQpOworCQlrZnJlZSh0bXApOworCQlzeF9ucG9ydHMgKz0gc3hfaW5pdF9ib2FyZChib2FyZCk7CiAJCXJjID0gc3hfbnBvcnRzOwogCQlicmVhazsKIAljYXNlIFNYSU9fSU5JVDoKLQkJaWYgKHN4X2luaXRpYWxpemVkKSAvKiBBbHJlYWR5IGluaXRpYWxpemVkICovCisJCWlmIChzeF9pbml0aWFsaXplZCkJLyogQWxyZWFkeSBpbml0aWFsaXplZCAqLwogCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCS8qIFRoaXMgaXMgbm90IGFsbG93ZWQgdW50aWwgYWxsIGJvYXJkcyBhcmUgaW5pdGlhbGl6ZWQuLi4gKi8KLQkJZm9yIChpPTA7aTxTWF9OQk9BUkRTO2krKykgewotCQkJaWYgKCAoYm9hcmRzW2ldLmZsYWdzICYgU1hfQk9BUkRfUFJFU0VOVCkgJiYKLQkJCSAgICAgIShib2FyZHNbaV0uZmxhZ3MgJiBTWF9CT0FSRF9JTklUSUFMSVpFRCkpCisJCWZvciAoaSA9IDA7IGkgPCBTWF9OQk9BUkRTOyBpKyspIHsKKwkJCWlmICgoYm9hcmRzW2ldLmZsYWdzICYgU1hfQk9BUkRfUFJFU0VOVCkgJiYKKwkJCQkhKGJvYXJkc1tpXS5mbGFncyAmIFNYX0JPQVJEX0lOSVRJQUxJWkVEKSkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfQotCQlmb3IgKGk9MDtpPFNYX05CT0FSRFM7aSsrKQotCQkJaWYgKCEoYm9hcmRzW2ldLmZsYWdzICYgU1hfQk9BUkRfUFJFU0VOVCkpIGJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgU1hfTkJPQVJEUzsgaSsrKQorCQkJaWYgKCEoYm9hcmRzW2ldLmZsYWdzICYgU1hfQk9BUkRfUFJFU0VOVCkpCisJCQkJYnJlYWs7CiAKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfRklSTVdBUkUsICJpbml0aW5nIHBvcnRzdHJ1Y3RzLCAlZCBib2FyZHMsICIKLQkJICAgICAgICAgICAgIiVkIGNoYW5uZWxzLCBmaXJzdCBib2FyZDogJWQgcG9ydHNcbiIsIAotCQkgICAgICAgICAgICBpLCBzeF9ucG9ydHMsIGJvYXJkc1swXS5ucG9ydHMpOwotCQlyYyA9IHN4X2luaXRfcG9ydHN0cnVjdHMgKGksIHN4X25wb3J0cyk7Ci0JCXN4X2luaXRfZHJpdmVycyAoKTsKLQkJaWYgKHJjID49IDApIAorCQlzeF9kcHJpbnRrKFNYX0RFQlVHX0ZJUk1XQVJFLCAiaW5pdGluZyBwb3J0c3RydWN0cywgJWQgYm9hcmRzLCAiCisJCQkJIiVkIGNoYW5uZWxzLCBmaXJzdCBib2FyZDogJWQgcG9ydHNcbiIsCisJCQkJaSwgc3hfbnBvcnRzLCBib2FyZHNbMF0ubnBvcnRzKTsKKwkJcmMgPSBzeF9pbml0X3BvcnRzdHJ1Y3RzKGksIHN4X25wb3J0cyk7CisJCXN4X2luaXRfZHJpdmVycygpOworCQlpZiAocmMgPj0gMCkKIAkJCXN4X2luaXRpYWxpemVkKys7CiAJCWJyZWFrOwogCWNhc2UgU1hJT19TRVRERUJVRzoKQEAgLTE3MzcsMzIgKzE4MzAsMzIgQEAKIAkJcmMgPSBzeF9ucG9ydHM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICJVbmtub3duIGlvY3RsIG9uIGZpcm13YXJlIGRldmljZSAoJXgpLlxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5rbm93biBpb2N0bCBvbiBmaXJtd2FyZSBkZXZpY2UgKCV4KS5cbiIsCisJCQkJY21kKTsKIAkJYnJlYWs7CiAJfQotCWZ1bmNfZXhpdCAoKTsKKwlmdW5jX2V4aXQoKTsKIAlyZXR1cm4gcmM7CiB9CiAKLQotc3RhdGljIHZvaWQgc3hfYnJlYWsgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBpbnQgZmxhZykKK3N0YXRpYyB2b2lkIHN4X2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBmbGFnKQogewogCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcnY7CiAKLQlmdW5jX2VudGVyICgpOworCWZ1bmNfZW50ZXIoKTsKIAotCWlmIChmbGFnKSAKLQkJcnYgPSBzeF9zZW5kX2NvbW1hbmQgKHBvcnQsIEhTX1NUQVJULCAtMSwgSFNfSURMRV9CUkVBSyk7Ci0JZWxzZSAKLQkJcnYgPSBzeF9zZW5kX2NvbW1hbmQgKHBvcnQsIEhTX1NUT1AsIC0xLCBIU19JRExFX09QRU4pOwotCWlmIChydiAhPSAxKSBwcmludGsgKEtFUk5fRVJSICJzeDogY291bGRuJ3Qgc2VuZCBicmVhayAoJXgpLlxuIiwKLQkJCXJlYWRfc3hfYnl0ZSAocG9ydC0+Ym9hcmQsIENIQU5fT0ZGU0VUIChwb3J0LCBoaV9oc3RhdCkpKTsKKwlpZiAoZmxhZykKKwkJcnYgPSBzeF9zZW5kX2NvbW1hbmQocG9ydCwgSFNfU1RBUlQsIC0xLCBIU19JRExFX0JSRUFLKTsKKwllbHNlCisJCXJ2ID0gc3hfc2VuZF9jb21tYW5kKHBvcnQsIEhTX1NUT1AsIC0xLCBIU19JRExFX09QRU4pOworCWlmIChydiAhPSAxKQorCQlwcmludGsoS0VSTl9FUlIgInN4OiBjb3VsZG4ndCBzZW5kIGJyZWFrICgleCkuXG4iLAorCQkJcmVhZF9zeF9ieXRlKHBvcnQtPmJvYXJkLCBDSEFOX09GRlNFVChwb3J0LCBoaV9oc3RhdCkpKTsKIAotCWZ1bmNfZXhpdCAoKTsKKwlmdW5jX2V4aXQoKTsKIH0KIAotCiBzdGF0aWMgaW50IHN4X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBzeF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKQEAgLTE3NzAsNyArMTg2Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgc3hfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCisJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKIHsKIAlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJ0cyA9IC0xLCBkdHIgPSAtMTsKQEAgLTE3ODksOCArMTg4Miw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3hfaW9jdGwgKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IHN4X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgcmM7CiAJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwpAQCAtMTgwMywxMCArMTg5NiwxMCBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBUSU9DR1NPRlRDQVI6CiAJCXJjID0gcHV0X3VzZXIoKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpID8gMSA6IDApLAotCQkgICAgICAgICAgICAgICh1bnNpZ25lZCBfX3VzZXIgKikgYXJncCk7CisJCQkJKHVuc2lnbmVkIF9fdXNlciAqKWFyZ3ApOwogCQlicmVhazsKIAljYXNlIFRJT0NTU09GVENBUjoKLQkJaWYgKChyYyA9IGdldF91c2VyKGl2YWwsICh1bnNpZ25lZCBfX3VzZXIgKikgYXJncCkpID09IDApIHsKKwkJaWYgKChyYyA9IGdldF91c2VyKGl2YWwsICh1bnNpZ25lZCBfX3VzZXIgKilhcmdwKSkgPT0gMCkgewogCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KIAkJCQkodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfAogCQkJCShpdmFsID8gQ0xPQ0FMIDogMCk7CkBAIC0xODI3LDcgKzE5MjAsNiBAQAogCXJldHVybiByYzsKIH0KIAotCiAvKiBUaGUgdGhyb3R0bGUvdW50aHJvdHRsZSBzY2hlbWUgZm9yIHRoZSBTcGVjaWFsaXggY2FyZCBpcyBkaWZmZXJlbnQKICAqIGZyb20gb3RoZXIgZHJpdmVycyBhbmQgZGVzZXJ2ZXMgc29tZSBleHBsYW5hdGlvbi4gCiAgKiBUaGUgU3BlY2lhbGl4IGhhcmR3YXJlIHRha2VzIGNhcmUgb2YgWE9OL1hPRkYKQEAgLTE4NDQsNyArMTkzNiw3IEBACiAgKiBmbG93IGNvbnRyb2wgc2NoZW1lIGlzIGluIHVzZSBmb3IgdGhhdCBwb3J0LiAtLSBTaW1vbiBBbGxlbgogICovCiAKLXN0YXRpYyB2b2lkIHN4X3Rocm90dGxlIChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK3N0YXRpYyB2b2lkIHN4X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHN4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwogCkBAIC0xODUyLDE0ICsxOTQ0LDEzIEBACiAJLyogSWYgdGhlIHBvcnQgaXMgdXNpbmcgYW55IHR5cGUgb2YgaW5wdXQgZmxvdwogCSAqIGNvbnRyb2wgdGhlbiB0aHJvdHRsZSB0aGUgcG9ydC4KIAkgKi8KLQlpZigodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgfHwgKElfSVhPRkYodHR5KSkgKSB7CisJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB8fCAoSV9JWE9GRih0dHkpKSkgewogCQlwb3J0LT5ncy5mbGFncyB8PSBTWF9SWF9USFJPVFRMRTsKIAl9CiAJZnVuY19leGl0KCk7CiB9CiAKLQotc3RhdGljIHZvaWQgc3hfdW50aHJvdHRsZSAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCitzdGF0aWMgdm9pZCBzeF91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHN4X3BvcnQgKnBvcnQgPSAoc3RydWN0IHN4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwogCkBAIC0xODczLDE1ICsxOTY0LDExIEBACiAJcmV0dXJuOwogfQogCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgogICogICAgICAgICAgICAgICAgICAgIEhlcmUgYXJlIHRoZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAqCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLQotCi0KLXN0YXRpYyBpbnQgc3hfaW5pdF9ib2FyZCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3N0YXRpYyBpbnQgc3hfaW5pdF9ib2FyZChzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKQogewogCWludCBhZGRyOwogCWludCBjaGFuczsKQEAgLTE4OTMsMzYgKzE5ODAsMzggQEAKIAogCWJvYXJkLT5mbGFncyB8PSBTWF9CT0FSRF9JTklUSUFMSVpFRDsKIAotCWlmIChyZWFkX3N4X2J5dGUgKGJvYXJkLCAwKSkKKwlpZiAocmVhZF9zeF9ieXRlKGJvYXJkLCAwKSkKIAkJLyogQ0YgYm9hcmRzIG1heSBuZWVkIHRoaXMuICovCi0JCXdyaXRlX3N4X2J5dGUoYm9hcmQsMCwgMCk7CisJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIDAsIDApOwogCiAJLyogVGhpcyByZXNldHMgdGhlIHByb2Nlc3NvciBhZ2FpbiwgdG8gbWFrZSBzdXJlIGl0IGRpZG4ndCBkbyBhbnkKIAkgICBmb29saXNoIHRoaW5ncyB3aGlsZSB3ZSB3ZXJlIGRvd25sb2FkaW5nIHRoZSBpbWFnZSAqLwotCWlmICghc3hfcmVzZXQgKGJvYXJkKSkKKwlpZiAoIXN4X3Jlc2V0KGJvYXJkKSkKIAkJcmV0dXJuIDA7CiAKLQlzeF9zdGFydF9ib2FyZCAoYm9hcmQpOwotCXVkZWxheSAoMTApOwotCWlmICghc3hfYnVzeV93YWl0X25lcSAoYm9hcmQsIDAsIDB4ZmYsIDApKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgInN4OiBPb29wcy4gQm9hcmQgd29uJ3QgaW5pdGlhbGl6ZS5cbiIpOworCXN4X3N0YXJ0X2JvYXJkKGJvYXJkKTsKKwl1ZGVsYXkoMTApOworCWlmICghc3hfYnVzeV93YWl0X25lcShib2FyZCwgMCwgMHhmZiwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzeDogT29vcHMuIEJvYXJkIHdvbid0IGluaXRpYWxpemUuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJLyogT2suIFNvIG5vdyB0aGUgcHJvY2Vzc29yIG9uIHRoZSBjYXJkIGlzIHJ1bm5pbmcuIEl0IGdhdGhlcmVkCiAJICAgc29tZSBpbmZvIGZvciB1cy4uLiAqLwotCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJUaGUgc3hjYXJkIHN0cnVjdHVyZTpcbiIpOwotCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX0lOSVQpIG15X2hkX2lvIChib2FyZC0+YmFzZSwgMHgxMCk7Ci0Jc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgInRoZSBmaXJzdCBzeF9tb2R1bGUgc3RydWN0dXJlOlxuIik7Ci0JaWYgKHN4X2RlYnVnICYgU1hfREVCVUdfSU5JVCkgbXlfaGRfaW8gKGJvYXJkLT5iYXNlICsgMHg4MCwgMHgzMCk7CisJc3hfZHByaW50ayhTWF9ERUJVR19JTklULCAiVGhlIHN4Y2FyZCBzdHJ1Y3R1cmU6XG4iKTsKKwlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19JTklUKQorCQlteV9oZF9pbyhib2FyZC0+YmFzZSwgMHgxMCk7CisJc3hfZHByaW50ayhTWF9ERUJVR19JTklULCAidGhlIGZpcnN0IHN4X21vZHVsZSBzdHJ1Y3R1cmU6XG4iKTsKKwlpZiAoc3hfZGVidWcgJiBTWF9ERUJVR19JTklUKQorCQlteV9oZF9pbyhib2FyZC0+YmFzZSArIDB4ODAsIDB4MzApOwogCi0Jc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgCi0JICAgICAgICAgICAgImluaXRfc3RhdHVzOiAleCwgJWRrIG1lbW9yeSwgZmlybXdhcmUgViV4LiUwMngsXG4iLCAKLQkgICAgICAgICAgICByZWFkX3N4X2J5dGUgKGJvYXJkLCAwKSwgcmVhZF9zeF9ieXRlKGJvYXJkLCAxKSwgCi0JICAgICAgICAgICAgcmVhZF9zeF9ieXRlIChib2FyZCwgNSksIHJlYWRfc3hfYnl0ZShib2FyZCwgNCkpOworCXN4X2RwcmludGsoU1hfREVCVUdfSU5JVCwgImluaXRfc3RhdHVzOiAleCwgJWRrIG1lbW9yeSwgZmlybXdhcmUgIgorCQkJIlYleC4lMDJ4LFxuIiwKKwkJCXJlYWRfc3hfYnl0ZShib2FyZCwgMCksIHJlYWRfc3hfYnl0ZShib2FyZCwgMSksCisJCQlyZWFkX3N4X2J5dGUoYm9hcmQsIDUpLCByZWFkX3N4X2J5dGUoYm9hcmQsIDQpKTsKIAotCWlmIChyZWFkX3N4X2J5dGUgKGJvYXJkLCAwKSA9PSAweGZmKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJzeDogTm8gbW9kdWxlcyBmb3VuZC4gU29ycnkuXG4iKTsKKwlpZiAocmVhZF9zeF9ieXRlKGJvYXJkLCAwKSA9PSAweGZmKSB7CisJCXByaW50ayhLRVJOX0lORk8gInN4OiBObyBtb2R1bGVzIGZvdW5kLiBTb3JyeS5cbiIpOwogCQlib2FyZC0+bnBvcnRzID0gMDsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTkzMCw4MiArMjAxOSw5NyBAQAogCWNoYW5zID0gMDsKIAogCWlmIChJU19TWF9CT0FSRChib2FyZCkpIHsKLQkJc3hfd3JpdGVfYm9hcmRfd29yZCAoYm9hcmQsIGNjX2ludF9jb3VudCwgc3hfbWF4aW50cyk7CisJCXN4X3dyaXRlX2JvYXJkX3dvcmQoYm9hcmQsIGNjX2ludF9jb3VudCwgc3hfbWF4aW50cyk7CiAJfSBlbHNlIHsKIAkJaWYgKHN4X21heGludHMpCi0JCQlzeF93cml0ZV9ib2FyZF93b3JkIChib2FyZCwgY2NfaW50X2NvdW50LCBTSV9QUk9DRVNTT1JfQ0xPQ0svOC9zeF9tYXhpbnRzKTsKKwkJCXN4X3dyaXRlX2JvYXJkX3dvcmQoYm9hcmQsIGNjX2ludF9jb3VudCwKKwkJCQkJU0lfUFJPQ0VTU09SX0NMT0NLIC8gOCAvIHN4X21heGludHMpOwogCX0KIAogCS8qIGdyYWIgdGhlIGZpcnN0IG1vZHVsZSB0eXBlLi4uICovCi0JLyogIGJvYXJkLT50YV90eXBlID0gbW9kX2NvbXBhdF90eXBlIChyZWFkX3N4X2J5dGUgKGJvYXJkLCAweDgwICsgMHgwOCkpOyAqLwotCWJvYXJkLT50YV90eXBlID0gbW9kX2NvbXBhdF90eXBlIChzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgMHg4MCwgbWNfY2hpcCkpOworCS8qIGJvYXJkLT50YV90eXBlID0gbW9kX2NvbXBhdF90eXBlIChyZWFkX3N4X2J5dGUgKGJvYXJkLCAweDgwICsgMHgwOCkpOyAqLworCWJvYXJkLT50YV90eXBlID0gbW9kX2NvbXBhdF90eXBlKHN4X3JlYWRfbW9kdWxlX2J5dGUoYm9hcmQsIDB4ODAsCisJCQkJbWNfY2hpcCkpOwogCiAJLyogWFhYIGJ5dGVvcmRlciAqLwotCWZvciAoYWRkciA9IDB4ODA7YWRkciAhPSAwO2FkZHIgPSByZWFkX3N4X3dvcmQgKGJvYXJkLCBhZGRyKSAmIDB4N2ZmZikgewotCQl0eXBlID0gc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX2NoaXApOwotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiTW9kdWxlIGF0ICV4OiAlZCBjaGFubmVsc1xuIiwgCi0JCSAgICAgICAgICAgIGFkZHIsIHJlYWRfc3hfYnl0ZSAoYm9hcmQsIGFkZHIgKyAyKSk7CisJZm9yIChhZGRyID0gMHg4MDsgYWRkciAhPSAwOyBhZGRyID0gcmVhZF9zeF93b3JkKGJvYXJkLCBhZGRyKSAmIDB4N2ZmZil7CisJCXR5cGUgPSBzeF9yZWFkX21vZHVsZV9ieXRlKGJvYXJkLCBhZGRyLCBtY19jaGlwKTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19JTklULCAiTW9kdWxlIGF0ICV4OiAlZCBjaGFubmVsc1xuIiwKKwkJCQlhZGRyLCByZWFkX3N4X2J5dGUoYm9hcmQsIGFkZHIgKyAyKSk7CiAKLQkJY2hhbnMgKz0gc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX3R5cGUpOworCQljaGFucyArPSBzeF9yZWFkX21vZHVsZV9ieXRlKGJvYXJkLCBhZGRyLCBtY190eXBlKTsKIAotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAibW9kdWxlIGlzIGFuICVzLCB3aGljaCBoYXMgJXMvJXMgcGFuZWxzXG4iLCAKLQkJICAgICAgICAgICAgbW9kX3R5cGVfcyAodHlwZSksCi0JCSAgICAgICAgICAgIHBhbl90eXBlX3MgKHN4X3JlYWRfbW9kdWxlX2J5dGUgKGJvYXJkLCBhZGRyLCBtY19tb2RzKSAmIDB4ZiksCi0JCSAgICAgICAgICAgIHBhbl90eXBlX3MgKHN4X3JlYWRfbW9kdWxlX2J5dGUgKGJvYXJkLCBhZGRyLCBtY19tb2RzKSA+PiA0KSk7CisJCXN4X2RwcmludGsoU1hfREVCVUdfSU5JVCwgIm1vZHVsZSBpcyBhbiAlcywgd2hpY2ggaGFzICVzLyVzICIKKwkJCQkicGFuZWxzXG4iLAorCQkJCW1vZF90eXBlX3ModHlwZSksCisJCQkJcGFuX3R5cGVfcyhzeF9yZWFkX21vZHVsZV9ieXRlKGJvYXJkLCBhZGRyLAorCQkJCQkJbWNfbW9kcykgJiAweGYpLAorCQkJCXBhbl90eXBlX3Moc3hfcmVhZF9tb2R1bGVfYnl0ZShib2FyZCwgYWRkciwKKwkJCQkJCW1jX21vZHMpID4+IDQpKTsKIAotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiQ0QxNDAwIHZlcnNpb25zOiAleC8leCwgQVNJQyB2ZXJzaW9uOiAleFxuIiwgCi0JCSAgICAgICAgICAgIHN4X3JlYWRfbW9kdWxlX2J5dGUgKGJvYXJkLCBhZGRyLCBtY19yZXYxKSwKLQkJICAgICAgICAgICAgc3hfcmVhZF9tb2R1bGVfYnl0ZSAoYm9hcmQsIGFkZHIsIG1jX3JldjIpLAotCQkgICAgICAgICAgICBzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfbXRhYXNpY19yZXYpKTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19JTklULCAiQ0QxNDAwIHZlcnNpb25zOiAleC8leCwgQVNJQyAiCisJCQkidmVyc2lvbjogJXhcbiIsCisJCQlzeF9yZWFkX21vZHVsZV9ieXRlKGJvYXJkLCBhZGRyLCBtY19yZXYxKSwKKwkJCXN4X3JlYWRfbW9kdWxlX2J5dGUoYm9hcmQsIGFkZHIsIG1jX3JldjIpLAorCQkJc3hfcmVhZF9tb2R1bGVfYnl0ZShib2FyZCwgYWRkciwgbWNfbXRhYXNpY19yZXYpKTsKIAogCQkvKiBUaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBhcmUgaWxsZWdhbDogSXQgc2hvdWxkIHRoZW9yZXRpY2FsbHkKIAkJICAgd29yaywgYnV0IHRpbWluZyBwcm9ibGVtcyBtYWtlIHRoZSBidXMgSEFORy4gKi8KIAotCQlpZiAobW9kX2NvbXBhdF90eXBlICh0eXBlKSAhPSBib2FyZC0+dGFfdHlwZSkgewotCQkJcHJpbnRrIChLRVJOX0VSUiAic3g6IFRoaXMgaXMgYW4gaW52YWxpZCBjb25maWd1cmF0aW9uLlxuIgotCQkJICAgICAgICAiRG9uJ3QgbWl4IFRBL01UQS9TWERDIG9uIHRoZSBzYW1lIGhvc3RhZGFwdGVyLlxuIik7Ci0JCQljaGFucz0wOworCQlpZiAobW9kX2NvbXBhdF90eXBlKHR5cGUpICE9IGJvYXJkLT50YV90eXBlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInN4OiBUaGlzIGlzIGFuIGludmFsaWQgIgorCQkJCSJjb25maWd1cmF0aW9uLlxuRG9uJ3QgbWl4IFRBL01UQS9TWERDIG9uIHRoZSAiCisJCQkJInNhbWUgaG9zdGFkYXB0ZXIuXG4iKTsKKwkJCWNoYW5zID0gMDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICgoSVNfRUlTQV9CT0FSRChib2FyZCkgfHwgCi0JCSAgICAgSVNfU0lfQk9BUkQoYm9hcmQpKSAmJiAobW9kX2NvbXBhdF90eXBlKHR5cGUpID09IDQpKSB7Ci0JCQlwcmludGsgKEtFUk5fRVJSICJzeDogVGhpcyBpcyBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24uXG4iCi0JCQkgICAgICAgICJEb24ndCB1c2UgU1hEQ3Mgb24gYW4gU0kvWElPIGFkYXB0ZXIuXG4iKTsKLQkJCWNoYW5zPTA7CisJCWlmICgoSVNfRUlTQV9CT0FSRChib2FyZCkgfHwKKwkJCQlJU19TSV9CT0FSRChib2FyZCkpICYmCisJCQkJKG1vZF9jb21wYXRfdHlwZSh0eXBlKSA9PSA0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCSJzeDogVGhpcyBpcyBhbiBpbnZhbGlkICIKKwkJCQkiY29uZmlndXJhdGlvbi5cbkRvbid0IHVzZSBTWERDcyBvbiBhbiBTSS9YSU8gIgorCQkJCSJhZGFwdGVyLlxuIik7CisJCQljaGFucyA9IDA7CiAJCQlicmVhazsKIAkJfQotI2lmIDAgLyogUHJvYmxlbSBmaXhlZDogZmlybXdhcmUgMy4wNSAqLworI2lmIDAJCQkJLyogUHJvYmxlbSBmaXhlZDogZmlybXdhcmUgMy4wNSAqLwogCQlpZiAoSVNfU1hfQk9BUkQoYm9hcmQpICYmICh0eXBlID09IFRBOCkpIHsKIAkJCS8qIFRoZXJlIGFyZSBzb21lIGlzc3VlcyB3aXRoIHRoZSBmaXJtd2FyZSBhbmQgdGhlIERDRC9SVFMKIAkJCSAgIGxpbmVzLiBJdCBtaWdodCB3b3JrIGlmIHlvdSB0aWUgdGhlbSB0b2dldGhlciBvciBzb21ldGhpbmcuCi0JCQkgICBJdCBtaWdodCBhbHNvIHdvcmsgaWYgeW91IGdldCBhIG5ld2VyIHN4X2Zpcm13YXJlLglUaGVyZWZvcmUKKwkJCSAgIEl0IG1pZ2h0IGFsc28gd29yayBpZiB5b3UgZ2V0IGEgbmV3ZXIgc3hfZmlybXdhcmUuICAgVGhlcmVmb3JlCiAJCQkgICB0aGlzIGlzIGp1c3QgYSB3YXJuaW5nLiAqLwotCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgInN4OiBUaGUgU1ggaG9zdCBkb2Vzbid0IHdvcmsgdG9vIHdlbGwgIgotCQkJICAgICAgICAid2l0aCB0aGUgVEE4IGFkYXB0ZXJzLlxuU3BlY2lhbGl4IGlzIHdvcmtpbmcgb24gaXQuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAic3g6IFRoZSBTWCBob3N0IGRvZXNuJ3Qgd29yayB0b28gd2VsbCAiCisJCQkgICAgICAgIndpdGggdGhlIFRBOCBhZGFwdGVycy5cblNwZWNpYWxpeCBpcyB3b3JraW5nIG9uIGl0LlxuIik7CiAJCX0KICNlbmRpZgogCX0KIAogCWlmIChjaGFucykgewotCQkvKiBib2FyZC0+ZmxhZ3MgfD0gU1hfQk9BUkRfUFJFU0VOVDsgKi8KLQkJaWYoYm9hcmQtPmlycSA+IDApIHsKKwkJaWYgKGJvYXJkLT5pcnEgPiAwKSB7CiAJCQkvKiBmaXhlZCBpcnEsIHByb2JhYmx5IFBDSSAqLwotCQkJaWYoc3hfaXJxbWFzayAmICgxIDw8IGJvYXJkLT5pcnEpKSB7IC8qIG1heSB3ZSB1c2UgdGhpcyBpcnE/ICovCi0JCQkJaWYocmVxdWVzdF9pcnEoYm9hcmQtPmlycSwgc3hfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsICJzeCIsIGJvYXJkKSkgewotCQkJCQlwcmludGsoS0VSTl9FUlIgInN4OiBDYW5ub3QgYWxsb2NhdGUgaXJxICVkLlxuIiwgYm9hcmQtPmlycSk7CisJCQlpZiAoc3hfaXJxbWFzayAmICgxIDw8IGJvYXJkLT5pcnEpKSB7CS8qIG1heSB3ZSB1c2UgdGhpcyBpcnE/ICovCisJCQkJaWYgKHJlcXVlc3RfaXJxKGJvYXJkLT5pcnEsIHN4X2ludGVycnVwdCwKKwkJCQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwKKwkJCQkJCSJzeCIsIGJvYXJkKSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgInN4OiBDYW5ub3QgYWxsb2NhdGUgIgorCQkJCQkJImlycSAlZC5cbiIsIGJvYXJkLT5pcnEpOwogCQkJCQlib2FyZC0+aXJxID0gMDsKIAkJCQl9CiAJCQl9IGVsc2UKIAkJCQlib2FyZC0+aXJxID0gMDsKLQkJfSBlbHNlIGlmKGJvYXJkLT5pcnEgPCAwICYmIHN4X2lycW1hc2spIHsKKwkJfSBlbHNlIGlmIChib2FyZC0+aXJxIDwgMCAmJiBzeF9pcnFtYXNrKSB7CiAJCQkvKiBhdXRvLWFsbG9jYXRlIGlycSAqLwogCQkJaW50IGlycW5yOwotCQkJaW50IGlycW1hc2sgPSBzeF9pcnFtYXNrICYgKElTX1NYX0JPQVJEKGJvYXJkKSA/IFNYX0lTQV9JUlFfTUFTSyA6IFNJMl9JU0FfSVJRX01BU0spOwotCQkJZm9yKGlycW5yID0gMTU7IGlycW5yID4gMDsgaXJxbnItLSkKLQkJCQlpZihpcnFtYXNrICYgKDEgPDwgaXJxbnIpKQotCQkJCQlpZighIHJlcXVlc3RfaXJxKGlycW5yLCBzeF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgInN4IiwgYm9hcmQpKQorCQkJaW50IGlycW1hc2sgPSBzeF9pcnFtYXNrICYgKElTX1NYX0JPQVJEKGJvYXJkKSA/CisJCQkJCVNYX0lTQV9JUlFfTUFTSyA6IFNJMl9JU0FfSVJRX01BU0spOworCQkJZm9yIChpcnFuciA9IDE1OyBpcnFuciA+IDA7IGlycW5yLS0pCisJCQkJaWYgKGlycW1hc2sgJiAoMSA8PCBpcnFucikpCisJCQkJCWlmICghcmVxdWVzdF9pcnEoaXJxbnIsIHN4X2ludGVycnVwdCwKKwkJCQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwKKwkJCQkJCSJzeCIsIGJvYXJkKSkKIAkJCQkJCWJyZWFrOwotCQkJaWYoISBpcnFucikKKwkJCWlmICghaXJxbnIpCiAJCQkJcHJpbnRrKEtFUk5fRVJSICJzeDogQ2Fubm90IGFsbG9jYXRlIElSUS5cbiIpOwogCQkJYm9hcmQtPmlycSA9IGlycW5yOwogCQl9IGVsc2UKQEAgLTIwMTMsNTIgKzIxMTcsNDggQEAKIAogCQlpZiAoYm9hcmQtPmlycSkgewogCQkJLyogRm91bmQgYSB2YWxpZCBpbnRlcnJ1cHQsIHN0YXJ0IHVwIGludGVycnVwdHMhICovCi0JCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiVXNpbmcgaXJxICVkLlxuIiwgYm9hcmQtPmlycSk7Ci0JCQlzeF9zdGFydF9pbnRlcnJ1cHRzIChib2FyZCk7CisJCQlzeF9kcHJpbnRrKFNYX0RFQlVHX0lOSVQsICJVc2luZyBpcnEgJWQuXG4iLAorCQkJCQlib2FyZC0+aXJxKTsKKwkJCXN4X3N0YXJ0X2ludGVycnVwdHMoYm9hcmQpOwogCQkJYm9hcmQtPnBvbGwgPSBzeF9zbG93cG9sbDsKIAkJCWJvYXJkLT5mbGFncyB8PSBTWF9JUlFfQUxMT0NBVEVEOwogCQl9IGVsc2UgewogCQkJLyogbm8gaXJxOiBzZXR1cCBib2FyZCBmb3IgcG9sbGVkIG9wZXJhdGlvbiAqLwogCQkJYm9hcmQtPnBvbGwgPSBzeF9wb2xsOwotCQkJc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgIlVzaW5nIHBvbGwtaW50ZXJ2YWwgJWQuXG4iLCBib2FyZC0+cG9sbCk7CisJCQlzeF9kcHJpbnRrKFNYX0RFQlVHX0lOSVQsICJVc2luZyBwb2xsLWludGVydmFsICVkLlxuIiwKKwkJCQkJYm9hcmQtPnBvbGwpOwogCQl9CiAKLQkJLyogVGhlIHRpbWVyIHNob3VsZCBiZSBpbml0aWFsaXplZCBhbnl3YXk6IFRoYXQgd2F5IHdlIGNhbiBzYWZlbHkKLQkJCSBkZWxfdGltZXIgaXQgd2hlbiB0aGUgbW9kdWxlIGlzIHVubG9hZGVkLiAqLwotCQlpbml0X3RpbWVyICgmYm9hcmQtPnRpbWVyKTsKKwkJLyogVGhlIHRpbWVyIHNob3VsZCBiZSBpbml0aWFsaXplZCBhbnl3YXk6IFRoYXQgd2F5IHdlIGNhbgorCQkgICBzYWZlbHkgZGVsX3RpbWVyIGl0IHdoZW4gdGhlIG1vZHVsZSBpcyB1bmxvYWRlZC4gKi8KKwkJc2V0dXBfdGltZXIoJmJvYXJkLT50aW1lciwgc3hfcG9sbGZ1bmMsICh1bnNpZ25lZCBsb25nKWJvYXJkKTsKIAotCQlpZiAoYm9hcmQtPnBvbGwpIHsKLQkJCWJvYXJkLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGJvYXJkOwotCQkJYm9hcmQtPnRpbWVyLmZ1bmN0aW9uID0gc3hfcG9sbGZ1bmM7Ci0JCQlib2FyZC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBib2FyZC0+cG9sbDsKLQkJCWFkZF90aW1lciAoJmJvYXJkLT50aW1lcik7Ci0JCX0KKwkJaWYgKGJvYXJkLT5wb2xsKQorCQkJbW9kX3RpbWVyKCZib2FyZC0+dGltZXIsIGppZmZpZXMgKyBib2FyZC0+cG9sbCk7CiAJfSBlbHNlIHsKIAkJYm9hcmQtPmlycSA9IDA7CiAJfQogCiAJYm9hcmQtPm5wb3J0cyA9IGNoYW5zOwotCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJyZXR1cm5pbmcgJWQgcG9ydHMuIiwgYm9hcmQtPm5wb3J0cyk7CisJc3hfZHByaW50ayhTWF9ERUJVR19JTklULCAicmV0dXJuaW5nICVkIHBvcnRzLiIsIGJvYXJkLT5ucG9ydHMpOwogCiAJZnVuY19leGl0KCk7CiAJcmV0dXJuIGNoYW5zOwogfQogCi0KLXN0YXRpYyB2b2lkIHByaW50aGVhZGVyKHZvaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcHJpbnRoZWFkZXIodm9pZCkKIHsKIAlzdGF0aWMgaW50IGhlYWRlcl9wcmludGVkOwogCiAJaWYgKCFoZWFkZXJfcHJpbnRlZCkgewotCQlwcmludGsgKEtFUk5fSU5GTyAiU3BlY2lhbGl4IFNYIGRyaXZlciAiCi0JCSAgICAgICAgIihDKSAxOTk4LzE5OTkgUi5FLldvbGZmQEJpdFdpemFyZC5ubCBcbiIpOwotCQlwcmludGsgKEtFUk5fSU5GTyAic3g6IHZlcnNpb24gJXNcbiIsIFJDU19JRCk7CisJCXByaW50ayhLRVJOX0lORk8gIlNwZWNpYWxpeCBTWCBkcml2ZXIgIgorCQkJIihDKSAxOTk4LzE5OTkgUi5FLldvbGZmQEJpdFdpemFyZC5ubFxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInN4OiB2ZXJzaW9uICIgX19zdHJpbmdpZnkoU1hfVkVSU0lPTikgIlxuIik7CiAJCWhlYWRlcl9wcmludGVkID0gMTsKIAl9CiB9CiAKLQotc3RhdGljIGludCBwcm9iZV9zeCAoc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHByb2JlX3N4KHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCiB7CiAJc3RydWN0IHZwZF9wcm9tIHZwZHA7CiAJY2hhciAqcDsKQEAgLTIwNjYsNTEgKzIxNjYsNTcgQEAKIAogCWZ1bmNfZW50ZXIoKTsKIAotCWlmICghSVNfQ0ZfQk9BUkQgKGJvYXJkKSkgeyAgICAKLQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJHb2luZyB0byB2ZXJpZnkgdnBkIHByb20gYXQgJXAuXG4iLCAKLQkJICAgICAgICAgICAgYm9hcmQtPmJhc2UgKyBTWF9WUERfUk9NKTsKKwlpZiAoIUlTX0NGX0JPQVJEKGJvYXJkKSkgeworCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1BST0JFLCAiR29pbmcgdG8gdmVyaWZ5IHZwZCBwcm9tIGF0ICVwLlxuIiwKKwkJCQlib2FyZC0+YmFzZSArIFNYX1ZQRF9ST00pOwogCiAJCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX1BST0JFKQogCQkJbXlfaGRfaW8oYm9hcmQtPmJhc2UgKyBTWF9WUERfUk9NLCAweDQwKTsKIAotCQlwID0gKGNoYXIgKikgJnZwZHA7Ci0JCWZvciAoaT0wO2k8IHNpemVvZiAoc3RydWN0IHZwZF9wcm9tKTtpKyspCi0JCQkqcCsrID0gcmVhZF9zeF9ieXRlIChib2FyZCwgU1hfVlBEX1JPTSArIGkqMik7CisJCXAgPSAoY2hhciAqKSZ2cGRwOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCB2cGRfcHJvbSk7IGkrKykKKwkJCSpwKysgPSByZWFkX3N4X2J5dGUoYm9hcmQsIFNYX1ZQRF9ST00gKyBpICogMik7CiAKIAkJaWYgKHN4X2RlYnVnICYgU1hfREVCVUdfUFJPQkUpCi0JCQlteV9oZCAoJnZwZHAsIDB4MjApOworCQkJbXlfaGQoJnZwZHAsIDB4MjApOwogCi0JCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiY2hlY2tpbmcgaWRlbnRpZmllci4uLlxuIik7CisJCXN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICJjaGVja2luZyBpZGVudGlmaWVyLi4uXG4iKTsKIAotCQlpZiAoc3RybmNtcCAodnBkcC5pZGVudGlmaWVyLCBTWF9WUERfSURFTlRfU1RSSU5HLCAxNikgIT0gMCkgewotCQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJHb3Qgbm9uLVNYIGlkZW50aWZpZXI6ICclcydcbiIsIAotCQkJICAgICAgICAgICAgdnBkcC5pZGVudGlmaWVyKTsgCisJCWlmIChzdHJuY21wKHZwZHAuaWRlbnRpZmllciwgU1hfVlBEX0lERU5UX1NUUklORywgMTYpICE9IDApIHsKKwkJCXN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICJHb3Qgbm9uLVNYIGlkZW50aWZpZXI6ICIKKwkJCQkJIiclcydcbiIsIHZwZHAuaWRlbnRpZmllcik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXByaW50aGVhZGVyICgpOworCXByaW50aGVhZGVyKCk7CiAKLQlpZiAoIUlTX0NGX0JPQVJEIChib2FyZCkpIHsKLQkJcHJpbnRrIChLRVJOX0RFQlVHICJzeDogRm91bmQgYW4gU1ggYm9hcmQgYXQgJWx4XG4iLCBib2FyZC0+aHdfYmFzZSk7Ci0JCXByaW50ayAoS0VSTl9ERUJVRyAic3g6IGh3X3JldjogJWQsIGFzc2VtYmx5IGxldmVsOiAlZCwgdW5pcSBJRDolMDh4LCAiLCAKLQkJICAgICAgICB2cGRwLmh3cmV2LCB2cGRwLmh3YXNzLCB2cGRwLnVuaXFpZCk7Ci0JCXByaW50ayAoICAgICAgICAgICAiTWFudWZhY3R1cmVkOiAlZC8lZFxuIiwgCi0JCSAgICAgICAgMTk3MCArIHZwZHAubXllYXIsIHZwZHAubXdlZWspOworCWlmICghSVNfQ0ZfQk9BUkQoYm9hcmQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJzeDogRm91bmQgYW4gU1ggYm9hcmQgYXQgJWx4XG4iLAorCQkJYm9hcmQtPmh3X2Jhc2UpOworCQlwcmludGsoS0VSTl9ERUJVRyAic3g6IGh3X3JldjogJWQsIGFzc2VtYmx5IGxldmVsOiAlZCwgIgorCQkJCSJ1bmlxIElEOiUwOHgsICIsCisJCQkJdnBkcC5od3JldiwgdnBkcC5od2FzcywgdnBkcC51bmlxaWQpOworCQlwcmludGsoIk1hbnVmYWN0dXJlZDogJWQvJWRcbiIsIDE5NzAgKyB2cGRwLm15ZWFyLCB2cGRwLm13ZWVrKTsKIAotCi0JCWlmICgoKCh2cGRwLnVuaXFpZCA+PiAyNCkgJiBTWF9VTklRVUVJRF9NQVNLKSAhPSBTWF9QQ0lfVU5JUVVFSUQxKSAmJgotCQkgICAgKCgodnBkcC51bmlxaWQgPj4gMjQpICYgU1hfVU5JUVVFSURfTUFTSykgIT0gU1hfSVNBX1VOSVFVRUlEMSkpIHsKLQkJCS8qIFRoaXMgbWlnaHQgYmUgYSBiaXQgaGFyc2guIFRoaXMgd2FzIHRoZSBwcmltYXJ5IHJlYXNvbiB0aGUKLQkJCSAgIFNYL0lTQSBjYXJkIGRpZG4ndCB3b3JrIGF0IGZpcnN0Li4uICovCi0JCQlwcmludGsgKEtFUk5fRVJSICJzeDogSG1tLiBOb3QgYW4gU1gvUENJIG9yIFNYL0lTQSBjYXJkLiBTb3JyeTogZ2l2aW5nIHVwLlxuIik7CisJCWlmICgoKCh2cGRwLnVuaXFpZCA+PiAyNCkgJiBTWF9VTklRVUVJRF9NQVNLKSAhPQorCQkJCVNYX1BDSV9VTklRVUVJRDEpICYmICgoKHZwZHAudW5pcWlkID4+IDI0KSAmCisJCQkJU1hfVU5JUVVFSURfTUFTSykgIT0gU1hfSVNBX1VOSVFVRUlEMSkpIHsKKwkJCS8qIFRoaXMgbWlnaHQgYmUgYSBiaXQgaGFyc2guIFRoaXMgd2FzIHRoZSBwcmltYXJ5CisJCQkgICByZWFzb24gdGhlIFNYL0lTQSBjYXJkIGRpZG4ndCB3b3JrIGF0IGZpcnN0Li4uICovCisJCQlwcmludGsoS0VSTl9FUlIgInN4OiBIbW0uIE5vdCBhbiBTWC9QQ0kgb3IgU1gvSVNBICIKKwkJCQkJImNhcmQuIFNvcnJ5OiBnaXZpbmcgdXAuXG4iKTsKIAkJCXJldHVybiAoMCk7CiAJCX0KIAotCQlpZiAoKCh2cGRwLnVuaXFpZCA+PiAyNCkgJiBTWF9VTklRVUVJRF9NQVNLKSA9PSBTWF9JU0FfVU5JUVVFSUQxKSB7CisJCWlmICgoKHZwZHAudW5pcWlkID4+IDI0KSAmIFNYX1VOSVFVRUlEX01BU0spID09CisJCQkJU1hfSVNBX1VOSVFVRUlEMSkgewogCQkJaWYgKCgodW5zaWduZWQgbG9uZylib2FyZC0+aHdfYmFzZSkgJiAweDgwMDApIHsKLQkJCQlwcmludGsgKEtFUk5fV0FSTklORyAic3g6IFdhcm5pbmc6IFRoZXJlIG1heSBiZSBoYXJkd2FyZSBwcm9ibGVtcyB3aXRoIHRoZSBjYXJkIGF0ICVseC5cbiIsIGJvYXJkLT5od19iYXNlKTsKLQkJCQlwcmludGsgKEtFUk5fV0FSTklORyAic3g6IFJlYWQgc3gudHh0IGZvciBtb3JlIGluZm8uXG4iKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeDogV2FybmluZzogVGhlcmUgbWF5IGJlICIKKwkJCQkJImhhcmR3YXJlIHByb2JsZW1zIHdpdGggdGhlIGNhcmQgYXQgIgorCQkJCQkiJWx4LlxuIiwgYm9hcmQtPmh3X2Jhc2UpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInN4OiBSZWFkIHN4LnR4dCBmb3IgbW9yZSAiCisJCQkJCQkiaW5mby5cbiIpOwogCQkJfQogCQl9CiAJfQpAQCAtMjExOCwxNyArMjIyNCwxNSBAQAogCWJvYXJkLT5ucG9ydHMgPSAtMTsKIAogCS8qIFRoaXMgcmVzZXRzIHRoZSBwcm9jZXNzb3IsIGFuZCBrZWVwcyBpdCBvZmYgdGhlIGJ1cy4gKi8KLQlpZiAoIXN4X3Jlc2V0IChib2FyZCkpIAorCWlmICghc3hfcmVzZXQoYm9hcmQpKQogCQlyZXR1cm4gMDsKLQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAicmVzZXQgdGhlIGJvYXJkLi4uXG4iKTsKLQotCWJvYXJkLT5mbGFncyB8PSBTWF9CT0FSRF9QUkVTRU5UOworCXN4X2RwcmludGsoU1hfREVCVUdfSU5JVCwgInJlc2V0IHRoZSBib2FyZC4uLlxuIik7CiAKIAlmdW5jX2V4aXQoKTsKIAlyZXR1cm4gMTsKIH0KIAotCisjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCBkZWZpbmVkKENPTkZJR19FSVNBKQogCiAvKiBTcGVjaWFsaXggcHJvYmVzIGZvciB0aGlzIGNhcmQgYXQgMzJrIGluY3JlbWVudHMgZnJvbSA2NDBrIHRvIDE2TS4KICAgIEkgY29uc2lkZXIgbWFjaGluZXMgd2l0aCBsZXNzIHRoYW4gMTZNIHVubGlrZWx5IG5vd2FkYXlzLCBzbyBJJ20KQEAgLTIxMzYsMjggKzIyNDAsMjcgQEAKICAgIGNhcmQuIDB4ZTAwMDAgYW5kIDB4ZjAwMDAgYXJlIHRha2VuIGJ5IHRoZSBCSU9TLiBUaGF0IG9ubHkgbGVhdmVzIAogICAgMHhjMDAwMCwgMHhjODAwMCwgMHhkMDAwMCBhbmQgMHhkODAwMCAuICovCiAKLXN0YXRpYyBpbnQgcHJvYmVfc2kgKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwcm9iZV9zaShzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKQogewogCWludCBpOwogCiAJZnVuY19lbnRlcigpOwotCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiR29pbmcgdG8gdmVyaWZ5IFNJIHNpZ25hdHVyZSBodyAlbHggYXQgJXAuXG4iLCBib2FyZC0+aHdfYmFzZSwKLQkgICAgICAgICAgICBib2FyZC0+YmFzZSArIFNJMl9JU0FfSURfQkFTRSk7CisJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIkdvaW5nIHRvIHZlcmlmeSBTSSBzaWduYXR1cmUgaHcgJWx4IGF0ICIKKwkJIiVwLlxuIiwgYm9hcmQtPmh3X2Jhc2UsIGJvYXJkLT5iYXNlICsgU0kyX0lTQV9JRF9CQVNFKTsKIAogCWlmIChzeF9kZWJ1ZyAmIFNYX0RFQlVHX1BST0JFKQogCQlteV9oZF9pbyhib2FyZC0+YmFzZSArIFNJMl9JU0FfSURfQkFTRSwgMHg4KTsKIAogCWlmICghSVNfRUlTQV9CT0FSRChib2FyZCkpIHsKLQkgIGlmKCBJU19TSTFfQk9BUkQoYm9hcmQpICkgCi0JICAgIHsKLQkJZm9yIChpPTA7aTw4O2krKykgewotCQkgIHdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lEX0JBU0UrNy1pLGkpOyAKLQorCQlpZiAoSVNfU0kxX0JPQVJEKGJvYXJkKSkgeworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSArIDcgLSBpLGkpOworCQkJfQogCQl9Ci0JICAgIH0KLQkJZm9yIChpPTA7aTw4O2krKykgewotCQkJaWYgKChyZWFkX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lEX0JBU0UrNy1pKSAmIDcpICE9IGkpIHsKLQkJCQlmdW5jX2V4aXQgKCk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmICgocmVhZF9zeF9ieXRlKGJvYXJkLCBTSTJfSVNBX0lEX0JBU0UgKyA3IC0gaSkgJiA3KQorCQkJCQkhPSBpKSB7CisJCQkJZnVuY19leGl0KCk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTIxNjcsMjAgKzIyNzAsMjAgQEAKIAkgICBidXQgdG8gcHJldmVudCB0cm91YmxlLCB3ZSdkIGJldHRlciBkb3VibGUgY2hlY2sgdGhhdCB3ZSBkb24ndAogCSAgIGhhdmUgYW4gU0kxIGJvYXJkIHdoZW4gd2UncmUgcHJvYmluZyBmb3IgYW4gU0kyIGJvYXJkLi4uLiAqLwogCi0Jd3JpdGVfc3hfYnl0ZSAoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSwweDEwKTsgCi0JaWYgKCBJU19TSTFfQk9BUkQoYm9hcmQpKSB7CisJd3JpdGVfc3hfYnl0ZShib2FyZCwgU0kyX0lTQV9JRF9CQVNFLCAweDEwKTsKKwlpZiAoSVNfU0kxX0JPQVJEKGJvYXJkKSkgewogCQkvKiBUaGlzIHNob3VsZCBiZSBhbiBTSTEgYm9hcmQsIHdoaWNoIGhhcyB0aGlzCiAJCSAgIGxvY2F0aW9uIHdyaXRhYmxlLi4uICovCi0JCWlmIChyZWFkX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lEX0JBU0UpICE9IDB4MTApIHsKLQkJCWZ1bmNfZXhpdCAoKTsKLQkJCXJldHVybiAwOyAKKwkJaWYgKHJlYWRfc3hfYnl0ZShib2FyZCwgU0kyX0lTQV9JRF9CQVNFKSAhPSAweDEwKSB7CisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiAwOwogCQl9CiAJfSBlbHNlIHsKIAkJLyogVGhpcyBzaG91bGQgYmUgYW4gU0kyIGJvYXJkLCB3aGljaCBoYXMgdGhlIGJvdHRvbQogCQkgICAzIGJpdHMgbm9uLXdyaXRhYmxlLi4uICovCi0JCWlmIChyZWFkX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lEX0JBU0UpID09IDB4MTApIHsKLQkJCWZ1bmNfZXhpdCAoKTsKLQkJCXJldHVybiAwOyAKKwkJaWYgKHJlYWRfc3hfYnl0ZShib2FyZCwgU0kyX0lTQV9JRF9CQVNFKSA9PSAweDEwKSB7CisJCQlmdW5jX2V4aXQoKTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCkBAIC0yMTg4LDQ1ICsyMjkxLDQ0IEBACiAJICAgYnV0IHRvIHByZXZlbnQgdHJvdWJsZSwgd2UnZCBiZXR0ZXIgZG91YmxlIGNoZWNrIHRoYXQgd2UgZG9uJ3QKIAkgICBoYXZlIGFuIFNJMSBib2FyZCB3aGVuIHdlJ3JlIHByb2JpbmcgZm9yIGFuIFNJMiBib2FyZC4uLi4gKi8KIAotCXdyaXRlX3N4X2J5dGUgKGJvYXJkLCBTSTJfSVNBX0lEX0JBU0UsMHgxMCk7IAotCWlmICggSVNfU0kxX0JPQVJEKGJvYXJkKSkgeworCXdyaXRlX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSwgMHgxMCk7CisJaWYgKElTX1NJMV9CT0FSRChib2FyZCkpIHsKIAkJLyogVGhpcyBzaG91bGQgYmUgYW4gU0kxIGJvYXJkLCB3aGljaCBoYXMgdGhpcwogCQkgICBsb2NhdGlvbiB3cml0YWJsZS4uLiAqLwotCQlpZiAocmVhZF9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JRF9CQVNFKSAhPSAweDEwKSB7CisJCWlmIChyZWFkX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSkgIT0gMHgxMCkgewogCQkJZnVuY19leGl0KCk7Ci0JCQlyZXR1cm4gMDsgCisJCQlyZXR1cm4gMDsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIFRoaXMgc2hvdWxkIGJlIGFuIFNJMiBib2FyZCwgd2hpY2ggaGFzIHRoZSBib3R0b20KIAkJICAgMyBiaXRzIG5vbi13cml0YWJsZS4uLiAqLwotCQlpZiAocmVhZF9zeF9ieXRlIChib2FyZCwgU0kyX0lTQV9JRF9CQVNFKSA9PSAweDEwKSB7Ci0JCQlmdW5jX2V4aXQgKCk7Ci0JCQlyZXR1cm4gMDsgCisJCWlmIChyZWFkX3N4X2J5dGUoYm9hcmQsIFNJMl9JU0FfSURfQkFTRSkgPT0gMHgxMCkgeworCQkJZnVuY19leGl0KCk7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXByaW50aGVhZGVyICgpOworCXByaW50aGVhZGVyKCk7CiAKLQlwcmludGsgKEtFUk5fREVCVUcgInN4OiBGb3VuZCBhbiBTSSBib2FyZCBhdCAlbHhcbiIsIGJvYXJkLT5od19iYXNlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAic3g6IEZvdW5kIGFuIFNJIGJvYXJkIGF0ICVseFxuIiwgYm9hcmQtPmh3X2Jhc2UpOwogCS8qIENvbXBhcmVkIHRvIHRoZSBTWCBib2FyZHMsIGl0IGlzIGEgY29tcGxldGUgZ3Vlc3MgYXMgdG8gd2hhdAotCQkgdGhpcyBjYXJkIGlzIHVwIHRvLi4uICovCisJICAgdGhpcyBjYXJkIGlzIHVwIHRvLi4uICovCiAKIAlib2FyZC0+bnBvcnRzID0gLTE7CiAKIAkvKiBUaGlzIHJlc2V0cyB0aGUgcHJvY2Vzc29yLCBhbmQga2VlcHMgaXQgb2ZmIHRoZSBidXMuICovCi0JaWYgKCFzeF9yZXNldCAoYm9hcmQpKSAKKwlpZiAoIXN4X3Jlc2V0KGJvYXJkKSkKIAkJcmV0dXJuIDA7Ci0Jc3hfZHByaW50ayAoU1hfREVCVUdfSU5JVCwgInJlc2V0IHRoZSBib2FyZC4uLlxuIik7Ci0KLQlib2FyZC0+ZmxhZ3MgfD0gU1hfQk9BUkRfUFJFU0VOVDsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX0lOSVQsICJyZXNldCB0aGUgYm9hcmQuLi5cbiIpOwogCiAJZnVuY19leGl0KCk7CiAJcmV0dXJuIDE7CiB9CisjZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzeF9vcHMgPSB7CiAJLmJyZWFrX2N0bCA9IHN4X2JyZWFrLAotCS5vcGVuCT0gc3hfb3BlbiwKKwkub3BlbiA9IHN4X29wZW4sCiAJLmNsb3NlID0gZ3NfY2xvc2UsCiAJLndyaXRlID0gZ3Nfd3JpdGUsCiAJLnB1dF9jaGFyID0gZ3NfcHV0X2NoYXIsCkBAIC0yMjYxLDM0ICsyMzYzLDIzIEBACiAJc3hfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKIAlzeF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CiAJc3hfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7Ci0Jc3hfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9Ci0JICBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJc3hfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlzeF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7CisJc3hfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOwogCXN4X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwogCXR0eV9zZXRfb3BlcmF0aW9ucyhzeF9kcml2ZXIsICZzeF9vcHMpOwogCiAJaWYgKChlcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc3hfZHJpdmVyKSkpIHsKIAkJcHV0X3R0eV9kcml2ZXIoc3hfZHJpdmVyKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJzeDogQ291bGRuJ3QgcmVnaXN0ZXIgc3ggZHJpdmVyLCBlcnJvciA9ICVkXG4iLAotCQkgICAgICAgZXJyb3IpOworCQkJZXJyb3IpOwogCQlyZXR1cm4gMTsKIAl9CiAJZnVuY19leGl0KCk7CiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgKiBja21hbGxvYyAoaW50IHNpemUpCi17Ci0Jdm9pZCAqcDsKLQotCXAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmIChwKSAKLQkJbWVtc2V0KHAsIDAsIHNpemUpOwotCXJldHVybiBwOwotfQotCi0KLXN0YXRpYyBpbnQgc3hfaW5pdF9wb3J0c3RydWN0cyAoaW50IG5ib2FyZHMsIGludCBucG9ydHMpCitzdGF0aWMgaW50IHN4X2luaXRfcG9ydHN0cnVjdHMoaW50IG5ib2FyZHMsIGludCBucG9ydHMpCiB7CiAJc3RydWN0IHN4X2JvYXJkICpib2FyZDsKIAlzdHJ1Y3Qgc3hfcG9ydCAqcG9ydDsKQEAgLTIyOTksOCArMjM5MCw5IEBACiAJZnVuY19lbnRlcigpOwogCiAJLyogTWFueSBkcml2ZXJzIHN0YXRpY2FsbHkgYWxsb2NhdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBvcnRzCi0JICAgVGhlcmUgaXMgbm8gcmVhc29uIG5vdCB0byBhbGxvY2F0ZSB0aGVtIGR5bmFtaWNhbGx5LiBJcyB0aGVyZT8gLS0gUkVXICovCi0Jc3hfcG9ydHMgICAgICAgICAgPSBja21hbGxvYyhucG9ydHMgKiBzaXplb2YgKHN0cnVjdCBzeF9wb3J0KSk7CisJICAgVGhlcmUgaXMgbm8gcmVhc29uIG5vdCB0byBhbGxvY2F0ZSB0aGVtIGR5bmFtaWNhbGx5LgorCSAgIElzIHRoZXJlPyAtLSBSRVcgKi8KKwlzeF9wb3J0cyA9IGtjYWxsb2MobnBvcnRzLCBzaXplb2Yoc3RydWN0IHN4X3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN4X3BvcnRzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMjMwOCwxMCArMjQwMCwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBuYm9hcmRzOyBpKyspIHsKIAkJYm9hcmQgPSAmYm9hcmRzW2ldOwogCQlib2FyZC0+cG9ydHMgPSBwb3J0OwotCQlmb3IgKGo9MDsgaiA8IGJvYXJkc1tpXS5ucG9ydHM7aisrKSB7Ci0JCQlzeF9kcHJpbnRrIChTWF9ERUJVR19JTklULCAiaW5pdGluZyBwb3J0ICVkXG4iLCBqKTsKKwkJZm9yIChqID0gMDsgaiA8IGJvYXJkc1tpXS5ucG9ydHM7IGorKykgeworCQkJc3hfZHByaW50ayhTWF9ERUJVR19JTklULCAiaW5pdGluZyBwb3J0ICVkXG4iLCBqKTsKIAkJCXBvcnQtPmdzLm1hZ2ljID0gU1hfTUFHSUM7Ci0JCQlwb3J0LT5ncy5jbG9zZV9kZWxheSA9IEhaLzI7CisJCQlwb3J0LT5ncy5jbG9zZV9kZWxheSA9IEhaIC8gMjsKIAkJCXBvcnQtPmdzLmNsb3Npbmdfd2FpdCA9IDMwICogSFo7CiAJCQlwb3J0LT5ib2FyZCA9IGJvYXJkOwogCQkJcG9ydC0+Z3MucmQgPSAmc3hfcmVhbF9kcml2ZXI7CkBAIC0yMzIzLDggKzI0MTUsOCBAQAogCQkJICogSW5pdGlhbGl6aW5nIHdhaXQgcXVldWUKIAkJCSAqLwogCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+Z3Mub3Blbl93YWl0KTsKLQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnQtPmdzLmNsb3NlX3dhaXQpOyAJCQotCQkJCisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5ncy5jbG9zZV93YWl0KTsKKwogCQkJcG9ydCsrOwogCQl9CiAJfQpAQCAtMjMzNSwyOCArMjQyNywzNiBAQAogCQlib2FyZCA9ICZib2FyZHNbaV07CiAJCWJvYXJkLT5wb3J0X2Jhc2UgPSBwb3J0bm87CiAJCS8qIFBvc3NpYmx5IHRoZSBjb25maWd1cmF0aW9uIHdhcyByZWplY3RlZC4gKi8KLQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJCb2FyZCBoYXMgJWQgY2hhbm5lbHNcbiIsIGJvYXJkLT5ucG9ydHMpOwotCQlpZiAoYm9hcmQtPm5wb3J0cyA8PSAwKSBjb250aW51ZTsKKwkJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIkJvYXJkIGhhcyAlZCBjaGFubmVsc1xuIiwKKwkJCQlib2FyZC0+bnBvcnRzKTsKKwkJaWYgKGJvYXJkLT5ucG9ydHMgPD0gMCkKKwkJCWNvbnRpbnVlOwogCQkvKiBYWFggYnl0ZW9yZGVyID8/ICovCi0JCWZvciAoYWRkciA9IDB4ODA7YWRkciAhPSAwO2FkZHIgPSByZWFkX3N4X3dvcmQgKGJvYXJkLCBhZGRyKSAmIDB4N2ZmZikgewotCQkJY2hhbnMgPSBzeF9yZWFkX21vZHVsZV9ieXRlIChib2FyZCwgYWRkciwgbWNfdHlwZSk7IAotCQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJNb2R1bGUgYXQgJXg6ICVkIGNoYW5uZWxzXG4iLCBhZGRyLCBjaGFucyk7Ci0JCQlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgIlBvcnQgYXQiKTsKLQkJCWZvciAoaj0wO2o8Y2hhbnM7aisrKSB7Ci0JCQkJLyogVGhlICJzeC13YXkiIGlzIHRoZSB3YXkgaXQgU0hPVUxEIGJlIGRvbmUuIFRoYXQgd2F5IGluIHRoZSAKLQkJCQkgICBmdXR1cmUsIHRoZSBmaXJtd2FyZSBtYXkgZm9yIGV4YW1wbGUgcGFjayB0aGUgc3RydWN0dXJlcyBhIGJpdAotCQkJCSAgIG1vcmUgZWZmaWNpZW50LiBOZWlsIHRlbGxzIG1lIGl0IGlzbid0IGdvaW5nIHRvIGhhcHBlbiBhbnl0aW1lCi0JCQkJICAgc29vbiB0aG91Z2guICovCisJCWZvciAoYWRkciA9IDB4ODA7IGFkZHIgIT0gMDsKKwkJCQlhZGRyID0gcmVhZF9zeF93b3JkKGJvYXJkLCBhZGRyKSAmIDB4N2ZmZikgeworCQkJY2hhbnMgPSBzeF9yZWFkX21vZHVsZV9ieXRlKGJvYXJkLCBhZGRyLCBtY190eXBlKTsKKwkJCXN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICJNb2R1bGUgYXQgJXg6ICVkICIKKwkJCQkJImNoYW5uZWxzXG4iLCBhZGRyLCBjaGFucyk7CisJCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1BST0JFLCAiUG9ydCBhdCIpOworCQkJZm9yIChqID0gMDsgaiA8IGNoYW5zOyBqKyspIHsKKwkJCQkvKiBUaGUgInN4LXdheSIgaXMgdGhlIHdheSBpdCBTSE9VTEQgYmUgZG9uZS4KKwkJCQkgICBUaGF0IHdheSBpbiB0aGUgZnV0dXJlLCB0aGUgZmlybXdhcmUgbWF5IGZvcgorCQkJCSAgIGV4YW1wbGUgcGFjayB0aGUgc3RydWN0dXJlcyBhIGJpdCBtb3JlCisJCQkJICAgZWZmaWNpZW50LiBOZWlsIHRlbGxzIG1lIGl0IGlzbid0IGdvaW5nIHRvCisJCQkJICAgaGFwcGVuIGFueXRpbWUgc29vbiB0aG91Z2guICovCiAJCQkJaWYgKElTX1NYX0JPQVJEKGJvYXJkKSkKLQkJCQkJcG9ydC0+Y2hfYmFzZSA9IHN4X3JlYWRfbW9kdWxlX3dvcmQgKGJvYXJkLCBhZGRyK2oqMiwgbWNfY2hhbl9wb2ludGVyKTsKKwkJCQkJcG9ydC0+Y2hfYmFzZSA9IHN4X3JlYWRfbW9kdWxlX3dvcmQoCisJCQkJCQkJYm9hcmQsIGFkZHIgKyBqICogMiwKKwkJCQkJCQltY19jaGFuX3BvaW50ZXIpOwogCQkJCWVsc2UKLQkJCQkJcG9ydC0+Y2hfYmFzZSA9IGFkZHIgKyAweDEwMCArIDB4MzAwKmo7CisJCQkJCXBvcnQtPmNoX2Jhc2UgPSBhZGRyICsgMHgxMDAgKyAweDMwMCAqajsKIAotCQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiICV4IiwgcG9ydC0+Y2hfYmFzZSk7CisJCQkJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIiAleCIsCisJCQkJCQlwb3J0LT5jaF9iYXNlKTsKIAkJCQlwb3J0LT5saW5lID0gcG9ydG5vKys7CiAJCQkJcG9ydCsrOwogCQkJfQotCQkJc3hfZHByaW50ayAoU1hfREVCVUdfUFJPQkUsICJcbiIpOworCQkJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIlxuIik7CiAJCX0KIAkJLyogVGhpcyBoYXMgdG8gYmUgZG9uZSBlYXJsaWVyLiAqLwogCQkvKiBib2FyZC0+ZmxhZ3MgfD0gU1hfQk9BUkRfSU5JVElBTElaRUQ7ICovCkBAIC0yMzY2LDYgKzI0NjYsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBzeF9maW5kX2ZyZWVfYm9hcmQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTWF9OQk9BUkRTOyBpKyspCisJCWlmICghKGJvYXJkc1tpXS5mbGFncyAmIFNYX0JPQVJEX1BSRVNFTlQpKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gaTsKK30KKwogc3RhdGljIHZvaWQgX19leGl0IHN4X3JlbGVhc2VfZHJpdmVycyh2b2lkKQogewogCWZ1bmNfZW50ZXIoKTsKQEAgLTIzNzQsNiArMjQ4NSwxMjQgQEAKIAlmdW5jX2V4aXQoKTsKIH0KIAorc3RhdGljIHZvaWQgX19kZXZleGl0IHN4X3JlbW92ZV9jYXJkKHN0cnVjdCBzeF9ib2FyZCAqYm9hcmQsCisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWlmIChib2FyZC0+ZmxhZ3MgJiBTWF9CT0FSRF9JTklUSUFMSVpFRCkgeworCQkvKiBUaGUgYm9hcmQgc2hvdWxkIHN0b3AgbWVzc2luZyB3aXRoIHVzLiAoYWN0dWFsbHkgSSBtZWFuIHRoZQorCQkgICBpbnRlcnJ1cHQpICovCisJCXN4X3Jlc2V0KGJvYXJkKTsKKwkJaWYgKChib2FyZC0+aXJxKSAmJiAoYm9hcmQtPmZsYWdzICYgU1hfSVJRX0FMTE9DQVRFRCkpCisJCQlmcmVlX2lycShib2FyZC0+aXJxLCBib2FyZCk7CisKKwkJLyogSXQgaXMgc2FmZS9hbGxvd2VkIHRvIGRlbF90aW1lciBhIG5vbi1hY3RpdmUgdGltZXIgKi8KKwkJZGVsX3RpbWVyKCZib2FyZC0+dGltZXIpOworCQlpZiAocGRldikgeworI2lmZGVmIENPTkZJR19QQ0kKKwkJCXBjaV9pb3VubWFwKHBkZXYsIGJvYXJkLT5iYXNlKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBJU19DRl9CT0FSRChib2FyZCkgPyAzIDogMik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWlvdW5tYXAoYm9hcmQtPmJhc2UpOworCQkJcmVsZWFzZV9yZWdpb24oYm9hcmQtPmh3X2Jhc2UsIGJvYXJkLT5od19sZW4pOworCQl9CisKKwkJYm9hcmQtPmZsYWdzICY9IH4oU1hfQk9BUkRfSU5JVElBTElaRUQgfCBTWF9CT0FSRF9QUkVTRU5UKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzeF9laXNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXYgPSB0b19laXNhX2RldmljZShkZXYpOworCXN0cnVjdCBzeF9ib2FyZCAqYm9hcmQ7CisJdW5zaWduZWQgbG9uZyBlaXNhX3Nsb3QgPSBlZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldHZhbCA9IC1FSU87CisKKwltdXRleF9sb2NrKCZzeF9ib2FyZHNfbG9jayk7CisJaSA9IHN4X2ZpbmRfZnJlZV9ib2FyZCgpOworCWlmIChpID09IFNYX05CT0FSRFMpIHsKKwkJbXV0ZXhfdW5sb2NrKCZzeF9ib2FyZHNfbG9jayk7CisJCWdvdG8gZXJyOworCX0KKwlib2FyZCA9ICZib2FyZHNbaV07CisJYm9hcmQtPmZsYWdzIHw9IFNYX0JPQVJEX1BSRVNFTlQ7CisJbXV0ZXhfdW5sb2NrKCZzeF9ib2FyZHNfbG9jayk7CisKKwlkZXZfaW5mbyhkZXYsICJYSU8gOiBTaWduYXR1cmUgZm91bmQgaW4gRUlTQSBzbG90ICVsdSwgIgorCQkgIlByb2R1Y3QgJWQgUmV2ICVkIChSRVBPUlQgVEhJUyBUTyBMS0xNKVxuIiwKKwkJIGVpc2Ffc2xvdCA+PiAxMiwKKwkJIGluYihlaXNhX3Nsb3QgKyBFSVNBX1ZFTkRPUl9JRF9PRkZTRVQgKyAyKSwKKwkJIGluYihlaXNhX3Nsb3QgKyBFSVNBX1ZFTkRPUl9JRF9PRkZTRVQgKyAzKSk7CisKKwlib2FyZC0+ZWlzYV9iYXNlID0gZWlzYV9zbG90OworCWJvYXJkLT5mbGFncyAmPSB+U1hfQk9BUkRfVFlQRTsKKwlib2FyZC0+ZmxhZ3MgfD0gU0lfRUlTQV9CT0FSRDsKKworCWJvYXJkLT5od19iYXNlID0gKChpbmIoZWlzYV9zbG90ICsgMHhjMDEpIDw8IDgpICsKKwkJCSAgaW5iKGVpc2Ffc2xvdCArIDB4YzAwKSkgPDwgMTY7CisJYm9hcmQtPmh3X2xlbiA9IFNJMl9FSVNBX1dJTkRPV19MRU47CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihib2FyZC0+aHdfYmFzZSwgYm9hcmQtPmh3X2xlbiwgInN4IikpIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCByZXF1ZXN0IHJlZ2lvblxuIik7CisJCWdvdG8gZXJyX2ZsYWc7CisJfQorCWJvYXJkLT5iYXNlMiA9CisJYm9hcmQtPmJhc2UgPSBpb3JlbWFwKGJvYXJkLT5od19iYXNlLCBTSTJfRUlTQV9XSU5ET1dfTEVOKTsKKwlpZiAoIWJvYXJkLT5iYXNlKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgcmVtYXAgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJfcmVnOworCX0KKworCXN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICJJTyBod19iYXNlIGFkZHJlc3M6ICVseFxuIiwgYm9hcmQtPmh3X2Jhc2UpOworCXN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICJiYXNlOiAlcFxuIiwgYm9hcmQtPmJhc2UpOworCWJvYXJkLT5pcnEgPSBpbmIoZWlzYV9zbG90ICsgMHhjMDIpID4+IDQ7CisJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIklSUTogJWRcbiIsIGJvYXJkLT5pcnEpOworCisJaWYgKCFwcm9iZV9zaShib2FyZCkpCisJCWdvdG8gZXJyX3VubWFwOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgYm9hcmQpOworCisJcmV0dXJuIDA7CitlcnJfdW5tYXA6CisJaW91bm1hcChib2FyZC0+YmFzZSk7CitlcnJfcmVnOgorCXJlbGVhc2VfcmVnaW9uKGJvYXJkLT5od19iYXNlLCBib2FyZC0+aHdfbGVuKTsKK2Vycl9mbGFnOgorCWJvYXJkLT5mbGFncyAmPSB+U1hfQk9BUkRfUFJFU0VOVDsKK2VycjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzeF9laXNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN4X2JvYXJkICpib2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3hfcmVtb3ZlX2NhcmQoYm9hcmQsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgc3hfZWlzYV90YmxbXSA9IHsKKwl7ICJTTFgiIH0sCisJeyAiIiB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIHN4X2Vpc2FfdGJsKTsKKworc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBzeF9laXNhZHJpdmVyID0geworCS5pZF90YWJsZSA9IHN4X2Vpc2FfdGJsLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInN4IiwKKwkJLnByb2JlID0gc3hfZWlzYV9wcm9iZSwKKwkJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHN4X2Vpc2FfcmVtb3ZlKSwKKwl9Cit9OworCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19QQ0kKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCiAgKiBTZXR0aW5nIGJpdCAxNyBpbiB0aGUgQ05UUkwgcmVnaXN0ZXIgb2YgdGhlIFBMWCA5MDUwICAqIApAQCAtMjM4NiwyMzMgKzI2MTUsMjcwIEBACiAgICBFRXByb20uICBBcyB0aGUgYml0IGlzIHJlYWQvd3JpdGUgZm9yIHRoZSBDUFUsIHdlIGNhbiBmaXggaXQgaGVyZSwKICAgIGlmIHdlIGRldGVjdCB0aGF0IGl0IGlzbid0IHNldCBjb3JyZWN0bHkuIC0tIFJFVyAqLwogCi1zdGF0aWMgdm9pZCBmaXhfc3hfcGNpIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHN4X2JvYXJkICpib2FyZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBmaXhfc3hfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkKQogewogCXVuc2lnbmVkIGludCBod2Jhc2U7CiAJdm9pZCBfX2lvbWVtICpyZWJhc2U7CiAJdW5zaWduZWQgaW50IHQ7CiAKLSNkZWZpbmUgQ05UUkxfUkVHX09GRlNFVCAgICAgICAgMHg1MAotI2RlZmluZSBDTlRSTF9SRUdfR09PRFZBTFVFICAgICAweDE4MjYwMDAwCisjZGVmaW5lIENOVFJMX1JFR19PRkZTRVQJMHg1MAorI2RlZmluZSBDTlRSTF9SRUdfR09PRFZBTFVFCTB4MTgyNjAwMDAKIAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsICZod2Jhc2UpOwogCWh3YmFzZSAmPSBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwogCXJlYmFzZSA9IGlvcmVtYXAoaHdiYXNlLCAweDgwKTsKLQl0ID0gcmVhZGwgKHJlYmFzZSArIENOVFJMX1JFR19PRkZTRVQpOworCXQgPSByZWFkbChyZWJhc2UgKyBDTlRSTF9SRUdfT0ZGU0VUKTsKIAlpZiAodCAhPSBDTlRSTF9SRUdfR09PRFZBTFVFKSB7Ci0JCXByaW50ayAoS0VSTl9ERUJVRyAic3g6IHBlcmZvcm1pbmcgY250cmwgcmVnIGZpeDogJTA4eCAtPiAlMDh4XG4iLCB0LCBDTlRSTF9SRUdfR09PRFZBTFVFKTsgCi0JCXdyaXRlbCAoQ05UUkxfUkVHX0dPT0RWQUxVRSwgcmViYXNlICsgQ05UUkxfUkVHX09GRlNFVCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJzeDogcGVyZm9ybWluZyBjbnRybCByZWcgZml4OiAlMDh4IC0+ICIKKwkJCSIlMDh4XG4iLCB0LCBDTlRSTF9SRUdfR09PRFZBTFVFKTsKKwkJd3JpdGVsKENOVFJMX1JFR19HT09EVkFMVUUsIHJlYmFzZSArIENOVFJMX1JFR19PRkZTRVQpOwogCX0KIAlpb3VubWFwKHJlYmFzZSk7CiB9CiAjZW5kaWYKIAotCi1zdGF0aWMgaW50IF9faW5pdCBzeF9pbml0KHZvaWQpIAorc3RhdGljIGludCBfX2RldmluaXQgc3hfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlpbnQgaTsKLQlpbnQgZm91bmQgPSAwOwotCWludCBlaXNhX3Nsb3Q7Ci0Jc3RydWN0IHN4X2JvYXJkICpib2FyZDsKLQogI2lmZGVmIENPTkZJR19QQ0kKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IHRpbnQ7Ci0JdW5zaWduZWQgc2hvcnQgdHNob3J0OworCXN0cnVjdCBzeF9ib2FyZCAqYm9hcmQ7CisJdW5zaWduZWQgaW50IGksIHJlZzsKKwlpbnQgcmV0dmFsID0gLUVJTzsKKworCW11dGV4X2xvY2soJnN4X2JvYXJkc19sb2NrKTsKKwlpID0gc3hfZmluZF9mcmVlX2JvYXJkKCk7CisJaWYgKGkgPT0gU1hfTkJPQVJEUykgeworCQltdXRleF91bmxvY2soJnN4X2JvYXJkc19sb2NrKTsKKwkJZ290byBlcnI7CisJfQorCWJvYXJkID0gJmJvYXJkc1tpXTsKKwlib2FyZC0+ZmxhZ3MgfD0gU1hfQk9BUkRfUFJFU0VOVDsKKwltdXRleF91bmxvY2soJnN4X2JvYXJkc19sb2NrKTsKKworCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2ZsYWc7CisKKwlib2FyZC0+ZmxhZ3MgJj0gflNYX0JPQVJEX1RZUEU7CisJYm9hcmQtPmZsYWdzIHw9IChwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MjAwKSA/IFNYX1BDSV9CT0FSRCA6CisJCVNYX0NGUENJX0JPQVJEOworCisJLyogQ0YgYm9hcmRzIHVzZSBiYXNlIGFkZHJlc3MgMy4uLi4gKi8KKwlyZWcgPSBJU19DRl9CT0FSRChib2FyZCkgPyAzIDogMjsKKwlyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgcmVnLCAic3giKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgcmVnaW9uXG4iKTsKKwkJZ290byBlcnJfZmxhZzsKKwl9CisJYm9hcmQtPmh3X2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcmVnKTsKKwlib2FyZC0+YmFzZTIgPQorCWJvYXJkLT5iYXNlID0gcGNpX2lvbWFwKHBkZXYsIHJlZywgV0lORE9XX0xFTihib2FyZCkpOworCWlmICghYm9hcmQtPmJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9yZWc7CisJfQorCisJLyogTW9zdCBvZiB0aGUgc3R1ZmYgb24gdGhlIENGIGJvYXJkIGlzIG9mZnNldCBieSAweDE4MDAwIC4uLi4gICovCisJaWYgKElTX0NGX0JPQVJEKGJvYXJkKSkKKwkJYm9hcmQtPmJhc2UgKz0gMHgxODAwMDsKKworCWJvYXJkLT5pcnEgPSBwZGV2LT5pcnE7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiR290IGEgc3BlY2lhbGl4IGNhcmQ6ICVwKCVkKSAleC5cbiIsIGJvYXJkLT5iYXNlLAorCQkgYm9hcmQtPmlycSwgYm9hcmQtPmZsYWdzKTsKKworCWlmICghcHJvYmVfc3goYm9hcmQpKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZXJyX3VubWFwOworCX0KKworCWZpeF9zeF9wY2kocGRldiwgYm9hcmQpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJvYXJkKTsKKworCXJldHVybiAwOworZXJyX3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIGJvYXJkLT5iYXNlKTsKK2Vycl9yZWc6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIHJlZyk7CitlcnJfZmxhZzoKKwlib2FyZC0+ZmxhZ3MgJj0gflNYX0JPQVJEX1BSRVNFTlQ7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKKyNlbHNlCisJcmV0dXJuIC1FTk9ERVY7CiAjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHN4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHN4X2JvYXJkICpib2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXN4X3JlbW92ZV9jYXJkKGJvYXJkLCBwZGV2KTsKK30KKworLyogU3BlY2lhbGl4IGhhcyBhIHdob2xlIGJ1bmNoIG9mIGNhcmRzIHdpdGggMHgyMDAwIGFzIHRoZSBkZXZpY2UgSUQuIFRoZXkgc2F5CisgICBpdHMgYmVjYXVzZSB0aGUgc3RhbmRhcmQgcmVxdWlyZXMgaXQuIFNvIGNoZWNrIGZvciBTVUJWRU5ET1JfSUQuICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3hfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIFBDSV9ERVZJQ0VfSURfU1BFQ0lBTElYX1NYX1hJT19JTzgsCisJCS5zdWJ2ZW5kb3IgPSAweDAyMDAsLnN1YmRldmljZSA9IFBDSV9BTllfSUQgfSwKKwl7IFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLCBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9TWF9YSU9fSU84LAorCQkuc3VidmVuZG9yID0gMHgwMzAwLC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lEIH0sCisJeyAwIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzeF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHN4X3BjaWRyaXZlciA9IHsKKwkubmFtZSA9ICJzeCIsCisJLmlkX3RhYmxlID0gc3hfcGNpX3RibCwKKwkucHJvYmUgPSBzeF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHN4X3BjaV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzeF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0VJU0EKKwlpbnQgcmV0dmFsMTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JU0EKKwlzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkOworCXVuc2lnbmVkIGludCBpOworI2VuZGlmCisJdW5zaWduZWQgaW50IGZvdW5kID0gMDsKKwlpbnQgcmV0dmFsOwogCiAJZnVuY19lbnRlcigpOwotCXN4X2RwcmludGsgKFNYX0RFQlVHX0lOSVQsICJJbml0aW5nIHN4IG1vZHVsZS4uLiAoc3hfZGVidWc9JWQpXG4iLCBzeF9kZWJ1Zyk7Ci0JaWYgKGFicyAoKGxvbmcpICgmc3hfZGVidWcpIC0gc3hfZGVidWcpIDwgMHgxMDAwMCkgewotCQlwcmludGsgKEtFUk5fV0FSTklORyAic3g6IHN4X2RlYnVnIGlzIGFuIGFkZHJlc3MsIGluc3RlYWQgb2YgYSB2YWx1ZS4gIgotCQkgICAgICAgICJBc3N1bWluZyAtMS5cbiIpOwotCQlwcmludGsgKCIoJXApXG4iLCAmc3hfZGVidWcpOwotCQlzeF9kZWJ1Zz0tMTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX0lOSVQsICJJbml0aW5nIHN4IG1vZHVsZS4uLiAoc3hfZGVidWc9JWQpXG4iLAorCQkJc3hfZGVidWcpOworCWlmIChhYnMoKGxvbmcpKCZzeF9kZWJ1ZykgLSBzeF9kZWJ1ZykgPCAweDEwMDAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN4OiBzeF9kZWJ1ZyBpcyBhbiBhZGRyZXNzLCBpbnN0ZWFkIG9mIGEgIgorCQkJCSJ2YWx1ZS4gQXNzdW1pbmcgLTEuXG4oJXApXG4iLCAmc3hfZGVidWcpOworCQlzeF9kZWJ1ZyA9IC0xOwogCX0KIAogCWlmIChtaXNjX3JlZ2lzdGVyKCZzeF9md19kZXZpY2UpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlNYOiBVbmFibGUgdG8gcmVnaXN0ZXIgZmlybXdhcmUgbG9hZGVyIGRyaXZlci5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgIlNYOiBVbmFibGUgdG8gcmVnaXN0ZXIgZmlybXdhcmUgbG9hZGVyICIKKwkJCQkiZHJpdmVyLlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KLQotI2lmZGVmIENPTkZJR19QQ0kKLQl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLCAKLQkJCQkJUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfU1hfWElPX0lPOCwgCi0JCQkJCSAgICAgIHBkZXYpKSkgewotCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCi0JCQljb250aW51ZTsKLQotCQkvKiBTcGVjaWFsaXggaGFzIGEgd2hvbGUgYnVuY2ggb2YgY2FyZHMgd2l0aAotCQkgICAweDIwMDAgYXMgdGhlIGRldmljZSBJRC4gVGhleSBzYXkgaXRzIGJlY2F1c2UKLQkJICAgdGhlIHN0YW5kYXJkIHJlcXVpcmVzIGl0LiBTdHVwaWQgc3RhbmRhcmQuICovCi0JCS8qIEl0IHNlZW1zIHRoYXQgcmVhZGluZyBhIHdvcmQgZG9lc24ndCB3b3JrIHJlbGlhYmx5IG9uIDIuMC4KLQkJICAgQWxzbywgcmVhZGluZyBhIG5vbi1hbGlnbmVkIGR3b3JkIGRvZXNuJ3Qgd29yay4gU28gd2UgcmVhZCB0aGUKLQkJICAgd2hvbGUgZHdvcmQgYXQgMHgyYyBhbmQgZXh0cmFjdCB0aGUgd29yZCBhdCAweDJlIChTVUJTWVNURU1fSUQpCi0JCSAgIG91cnNlbHZlcyAqLwotCQkvKiBJIGRvbid0IGtub3cgd2h5IHRoZSBkZWZpbmUgZG9lc24ndCB3b3JrLCBjb25zdGFudCAweDJjIGRvZXMgLS1SRVcgKi8gCi0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAocGRldiwgMHgyYywgJnRpbnQpOwotCQl0c2hvcnQgPSAodGludCA+PiAxNikgJiAweGZmZmY7Ci0JCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiR290IGEgc3BlY2lhbGl4IGNhcmQ6ICV4LlxuIiwgdGludCk7Ci0JCS8qIHN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAicGRldiA9ICVkLyVkCSgleClcbiIsIHBkZXYsIHRpbnQpOyAqLyAKLQkJaWYgKCh0c2hvcnQgIT0gMHgwMjAwKSAmJiAodHNob3J0ICE9IDB4MDMwMCkpIHsKLQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX1BST0JFLCAiQnV0IGl0J3Mgbm90IGFuIFNYIGNhcmQgKCVkKS4uLlxuIiwgCi0JCQkJICAgIHRzaG9ydCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlib2FyZCA9ICZib2FyZHNbZm91bmRdOwotCi0JCWJvYXJkLT5mbGFncyAmPSB+U1hfQk9BUkRfVFlQRTsKLQkJYm9hcmQtPmZsYWdzIHw9ICh0c2hvcnQgPT0gMHgyMDApP1NYX1BDSV9CT0FSRDoKLQkJCQkJCSAgU1hfQ0ZQQ0lfQk9BUkQ7Ci0KLQkJLyogQ0YgYm9hcmRzIHVzZSBiYXNlIGFkZHJlc3MgMy4uLi4gKi8KLQkJaWYgKElTX0NGX0JPQVJEIChib2FyZCkpCi0JCQlib2FyZC0+aHdfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMyk7Ci0JCWVsc2UKLQkJCWJvYXJkLT5od19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAyKTsKLQkJYm9hcmQtPmJhc2UyID0gCi0JCWJvYXJkLT5iYXNlID0gaW9yZW1hcChib2FyZC0+aHdfYmFzZSwgV0lORE9XX0xFTiAoYm9hcmQpKTsKLQkJaWYgKCFib2FyZC0+YmFzZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpb3JlbWFwIGZhaWxlZFxuIik7Ci0JCQkvKiBYWFggaGFuZGxlIGVycm9yICovCi0JCX0KLQotCQkvKiBNb3N0IG9mIHRoZSBzdHVmZiBvbiB0aGUgQ0YgYm9hcmQgaXMgb2Zmc2V0IGJ5Ci0JCSAgIDB4MTgwMDAgLi4uLiAgKi8KLQkJaWYgKElTX0NGX0JPQVJEIChib2FyZCkpIGJvYXJkLT5iYXNlICs9IDB4MTgwMDA7Ci0KLQkJYm9hcmQtPmlycSA9IHBkZXYtPmlycTsKLQotCQlzeF9kcHJpbnRrIChTWF9ERUJVR19QUk9CRSwgIkdvdCBhIHNwZWNpYWxpeCBjYXJkOiAleC8lcCglZCkgJXguXG4iLCAKLQkJCSAgICB0aW50LCBib2FyZHNbZm91bmRdLmJhc2UsIGJvYXJkLT5pcnEsIGJvYXJkLT5mbGFncyk7Ci0KLQkJaWYgKHByb2JlX3N4IChib2FyZCkpIHsKLQkJCWZvdW5kKys7Ci0JCQlmaXhfc3hfcGNpIChwZGV2LCBib2FyZCk7Ci0JCX0gZWxzZSAKLQkJCWlvdW5tYXAoYm9hcmQtPmJhc2UyKTsKLQl9Ci0jZW5kaWYKLQotCWZvciAoaT0wO2k8TlJfU1hfQUREUlM7aSsrKSB7CisjaWZkZWYgQ09ORklHX0lTQQorCWZvciAoaSA9IDA7IGkgPCBOUl9TWF9BRERSUzsgaSsrKSB7CiAJCWJvYXJkID0gJmJvYXJkc1tmb3VuZF07CiAJCWJvYXJkLT5od19iYXNlID0gc3hfcHJvYmVfYWRkcnNbaV07CisJCWJvYXJkLT5od19sZW4gPSBTWF9XSU5ET1dfTEVOOworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJvYXJkLT5od19iYXNlLCBib2FyZC0+aHdfbGVuLCAic3giKSkKKwkJCWNvbnRpbnVlOwogCQlib2FyZC0+YmFzZTIgPQotCQlib2FyZC0+YmFzZSA9IGlvcmVtYXAoYm9hcmQtPmh3X2Jhc2UsIFNYX1dJTkRPV19MRU4pOworCQlib2FyZC0+YmFzZSA9IGlvcmVtYXAoYm9hcmQtPmh3X2Jhc2UsIGJvYXJkLT5od19sZW4pOworCQlpZiAoIWJvYXJkLT5iYXNlKQorCQkJZ290byBlcnJfc3hfcmVnOwogCQlib2FyZC0+ZmxhZ3MgJj0gflNYX0JPQVJEX1RZUEU7Ci0JCWJvYXJkLT5mbGFncyB8PQlTWF9JU0FfQk9BUkQ7Ci0JCWJvYXJkLT5pcnEgPSBzeF9pcnFtYXNrPy0xOjA7CisJCWJvYXJkLT5mbGFncyB8PSBTWF9JU0FfQk9BUkQ7CisJCWJvYXJkLT5pcnEgPSBzeF9pcnFtYXNrID8gLTEgOiAwOwogCi0JCWlmIChwcm9iZV9zeCAoYm9hcmQpKSB7CisJCWlmIChwcm9iZV9zeChib2FyZCkpIHsKKwkJCWJvYXJkLT5mbGFncyB8PSBTWF9CT0FSRF9QUkVTRU5UOwogCQkJZm91bmQrKzsKIAkJfSBlbHNlIHsKIAkJCWlvdW5tYXAoYm9hcmQtPmJhc2UpOworZXJyX3N4X3JlZzoKKwkJCXJlbGVhc2VfcmVnaW9uKGJvYXJkLT5od19iYXNlLCBib2FyZC0+aHdfbGVuKTsKIAkJfQogCX0KIAotCWZvciAoaT0wO2k8TlJfU0lfQUREUlM7aSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE5SX1NJX0FERFJTOyBpKyspIHsKIAkJYm9hcmQgPSAmYm9hcmRzW2ZvdW5kXTsKIAkJYm9hcmQtPmh3X2Jhc2UgPSBzaV9wcm9iZV9hZGRyc1tpXTsKKwkJYm9hcmQtPmh3X2xlbiA9IFNJMl9JU0FfV0lORE9XX0xFTjsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihib2FyZC0+aHdfYmFzZSwgYm9hcmQtPmh3X2xlbiwgInN4IikpCisJCQljb250aW51ZTsKIAkJYm9hcmQtPmJhc2UyID0KLQkJYm9hcmQtPmJhc2UgPSBpb3JlbWFwKGJvYXJkLT5od19iYXNlLCBTSTJfSVNBX1dJTkRPV19MRU4pOworCQlib2FyZC0+YmFzZSA9IGlvcmVtYXAoYm9hcmQtPmh3X2Jhc2UsIGJvYXJkLT5od19sZW4pOworCQlpZiAoIWJvYXJkLT5iYXNlKQorCQkJZ290byBlcnJfc2lfcmVnOwogCQlib2FyZC0+ZmxhZ3MgJj0gflNYX0JPQVJEX1RZUEU7Ci0JCWJvYXJkLT5mbGFncyB8PSAgU0lfSVNBX0JPQVJEOwotCQlib2FyZC0+aXJxID0gc3hfaXJxbWFzayA/LTE6MDsKKwkJYm9hcmQtPmZsYWdzIHw9IFNJX0lTQV9CT0FSRDsKKwkJYm9hcmQtPmlycSA9IHN4X2lycW1hc2sgPyAtMSA6IDA7CiAKLQkJaWYgKHByb2JlX3NpIChib2FyZCkpIHsKKwkJaWYgKHByb2JlX3NpKGJvYXJkKSkgeworCQkJYm9hcmQtPmZsYWdzIHw9IFNYX0JPQVJEX1BSRVNFTlQ7CiAJCQlmb3VuZCsrOwogCQl9IGVsc2UgewotCQkJaW91bm1hcCAoYm9hcmQtPmJhc2UpOworCQkJaW91bm1hcChib2FyZC0+YmFzZSk7CitlcnJfc2lfcmVnOgorCQkJcmVsZWFzZV9yZWdpb24oYm9hcmQtPmh3X2Jhc2UsIGJvYXJkLT5od19sZW4pOwogCQl9CiAJfQotCWZvciAoaT0wO2k8TlJfU0kxX0FERFJTO2krKykgeworCWZvciAoaSA9IDA7IGkgPCBOUl9TSTFfQUREUlM7IGkrKykgewogCQlib2FyZCA9ICZib2FyZHNbZm91bmRdOwogCQlib2FyZC0+aHdfYmFzZSA9IHNpMV9wcm9iZV9hZGRyc1tpXTsKKwkJYm9hcmQtPmh3X2xlbiA9IFNJMV9JU0FfV0lORE9XX0xFTjsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihib2FyZC0+aHdfYmFzZSwgYm9hcmQtPmh3X2xlbiwgInN4IikpCisJCQljb250aW51ZTsKIAkJYm9hcmQtPmJhc2UyID0KLQkJYm9hcmQtPmJhc2UgPSBpb3JlbWFwKGJvYXJkLT5od19iYXNlLCBTSTFfSVNBX1dJTkRPV19MRU4pOworCQlib2FyZC0+YmFzZSA9IGlvcmVtYXAoYm9hcmQtPmh3X2Jhc2UsIGJvYXJkLT5od19sZW4pOworCQlpZiAoIWJvYXJkLT5iYXNlKQorCQkJZ290byBlcnJfc2kxX3JlZzsKIAkJYm9hcmQtPmZsYWdzICY9IH5TWF9CT0FSRF9UWVBFOwotCQlib2FyZC0+ZmxhZ3MgfD0gIFNJMV9JU0FfQk9BUkQ7Ci0JCWJvYXJkLT5pcnEgPSBzeF9pcnFtYXNrID8tMTowOworCQlib2FyZC0+ZmxhZ3MgfD0gU0kxX0lTQV9CT0FSRDsKKwkJYm9hcmQtPmlycSA9IHN4X2lycW1hc2sgPyAtMSA6IDA7CiAKLQkJaWYgKHByb2JlX3NpIChib2FyZCkpIHsKKwkJaWYgKHByb2JlX3NpKGJvYXJkKSkgeworCQkJYm9hcmQtPmZsYWdzIHw9IFNYX0JPQVJEX1BSRVNFTlQ7CiAJCQlmb3VuZCsrOwogCQl9IGVsc2UgewotCQkJaW91bm1hcCAoYm9hcmQtPmJhc2UpOworCQkJaW91bm1hcChib2FyZC0+YmFzZSk7CitlcnJfc2kxX3JlZzoKKwkJCXJlbGVhc2VfcmVnaW9uKGJvYXJkLT5od19iYXNlLCBib2FyZC0+aHdfbGVuKTsKIAkJfQogCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19FSVNBCisJcmV0dmFsMSA9IGVpc2FfZHJpdmVyX3JlZ2lzdGVyKCZzeF9laXNhZHJpdmVyKTsKKyNlbmRpZgorCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnN4X3BjaWRyaXZlcik7CiAKLSAgICAgICAgc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIlByb2JpbmcgZm9yIEVJU0EgY2FyZHNcbiIpOwotICAgICAgICBmb3IoZWlzYV9zbG90PTB4MTAwMDsgZWlzYV9zbG90PDB4MTAwMDA7IGVpc2Ffc2xvdCs9MHgxMDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKGluYihlaXNhX3Nsb3QrMHhjODApPT0weDRkKSAmJgotICAgICAgICAgICAgICAgICAgIChpbmIoZWlzYV9zbG90KzB4YzgxKT09MHg5OCkpCi0gICAgICAgICAgICAgICAgewotCQkJc3hfZHByaW50ayhTWF9ERUJVR19QUk9CRSwgIiVzIDogU2lnbmF0dXJlIGZvdW5kIGluIEVJU0Egc2xvdCAlZCwgUHJvZHVjdCAlZCBSZXYgJWRcbiIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAiWElPIiwgKGVpc2Ffc2xvdD4+MTIpLCBpbmIoZWlzYV9zbG90KzB4YzgyKSwgaW5iKGVpc2Ffc2xvdCsweGM4MykpOwotCi0JCQlib2FyZCA9ICZib2FyZHNbZm91bmRdOwotCQkJYm9hcmQtPmVpc2FfYmFzZSA9IGVpc2Ffc2xvdDsKLQkJCWJvYXJkLT5mbGFncyAmPSB+U1hfQk9BUkRfVFlQRTsKLQkJCWJvYXJkLT5mbGFncyB8PSBTSV9FSVNBX0JPQVJEOwotCi0JCQlib2FyZC0+aHdfYmFzZSA9ICgoKGluYigweGMwMStlaXNhX3Nsb3QpIDw8IDgpICsgaW5iKDB4YzAwK2Vpc2Ffc2xvdCkpIDw8IDE2KTsKLQkJCWJvYXJkLT5iYXNlMiA9Ci0JCQlib2FyZC0+YmFzZSA9IGlvcmVtYXAoYm9hcmQtPmh3X2Jhc2UsIFNJMl9FSVNBX1dJTkRPV19MRU4pOwotCi0JCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1BST0JFLCAiSU8gaHdfYmFzZSBhZGRyZXNzOiAlbHhcbiIsIGJvYXJkLT5od19iYXNlKTsKLQkJCXN4X2RwcmludGsoU1hfREVCVUdfUFJPQkUsICJiYXNlOiAlcFxuIiwgYm9hcmQtPmJhc2UpOwotCQkJYm9hcmQtPmlycSA9IGluYihib2FyZC0+ZWlzYV9iYXNlKzB4YzAyKT4+NDsgCi0JCQlzeF9kcHJpbnRrKFNYX0RFQlVHX1BST0JFLCAiSVJROiAlZFxuIiwgYm9hcmQtPmlycSk7Ci0JCQkKLQkJCXByb2JlX3NpKGJvYXJkKTsKLQotCQkJZm91bmQrKzsKLQkJfQotCX0KIAlpZiAoZm91bmQpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gInN4OiB0b3RhbCBvZiAlZCBib2FyZHMgZGV0ZWN0ZWQuXG4iLCBmb3VuZCk7Ci0JfSBlbHNlIHsKLQkJbWlzY19kZXJlZ2lzdGVyKCZzeF9md19kZXZpY2UpOworCQlwcmludGsoS0VSTl9JTkZPICJzeDogdG90YWwgb2YgJWQgYm9hcmRzIGRldGVjdGVkLlxuIiwgZm91bmQpOworCQlyZXR2YWwgPSAwOworCX0gZWxzZSBpZiAocmV0dmFsKSB7CisjaWZkZWYgQ09ORklHX0VJU0EKKwkJcmV0dmFsID0gcmV0dmFsMTsKKwkJaWYgKHJldHZhbDEpCisjZW5kaWYKKwkJCW1pc2NfZGVyZWdpc3Rlcigmc3hfZndfZGV2aWNlKTsKIAl9CiAKIAlmdW5jX2V4aXQoKTsKLQlyZXR1cm4gZm91bmQ/MDotRUlPOworCXJldHVybiByZXR2YWw7CiB9CiAKLQotc3RhdGljIHZvaWQgX19leGl0IHN4X2V4aXQgKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgc3hfZXhpdCh2b2lkKQogewotCWludCBpOyAKLQlzdHJ1Y3Qgc3hfYm9hcmQgKmJvYXJkOworCWludCBpOwogCiAJZnVuY19lbnRlcigpOwotCWZvciAoaSA9IDA7IGkgPCBTWF9OQk9BUkRTOyBpKyspIHsKLQkJYm9hcmQgPSAmYm9hcmRzW2ldOwotCQlpZiAoYm9hcmQtPmZsYWdzICYgU1hfQk9BUkRfSU5JVElBTElaRUQpIHsKLQkJCXN4X2RwcmludGsgKFNYX0RFQlVHX0NMRUFOVVAsICJDbGVhbmluZyB1cCBib2FyZCBhdCAlcFxuIiwgYm9hcmQtPmJhc2UpOwotCQkJLyogVGhlIGJvYXJkIHNob3VsZCBzdG9wIG1lc3Npbmcgd2l0aCB1cy4KLQkJCSAgIChhY3R1YWxseSBJIG1lYW4gdGhlIGludGVycnVwdCkgKi8KLQkJCXN4X3Jlc2V0IChib2FyZCk7Ci0JCQlpZiAoKGJvYXJkLT5pcnEpICYmIChib2FyZC0+ZmxhZ3MgJiBTWF9JUlFfQUxMT0NBVEVEKSkKLQkJCQlmcmVlX2lycSAoYm9hcmQtPmlycSwgYm9hcmQpOworI2lmZGVmIENPTkZJR19FSVNBCisJZWlzYV9kcml2ZXJfdW5yZWdpc3Rlcigmc3hfZWlzYWRyaXZlcik7CisjZW5kaWYKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN4X3BjaWRyaXZlcik7CiAKLQkJCS8qIEl0IGlzIHNhZmUvYWxsb3dlZCB0byBkZWxfdGltZXIgYSBub24tYWN0aXZlIHRpbWVyICovCi0JCQlkZWxfdGltZXIgKCYgYm9hcmQtPnRpbWVyKTsKLQkJCWlvdW5tYXAoYm9hcmQtPmJhc2UpOwotCQl9Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBTWF9OQk9BUkRTOyBpKyspCisJCXN4X3JlbW92ZV9jYXJkKCZib2FyZHNbaV0sIE5VTEwpOworCiAJaWYgKG1pc2NfZGVyZWdpc3Rlcigmc3hfZndfZGV2aWNlKSA8IDApIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gInN4OiBjb3VsZG4ndCBkZXJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciBkZXZpY1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gInN4OiBjb3VsZG4ndCBkZXJlZ2lzdGVyIGZpcm13YXJlIGxvYWRlciAiCisJCQkJImRldmljZVxuIik7CiAJfQotCXN4X2RwcmludGsgKFNYX0RFQlVHX0NMRUFOVVAsICJDbGVhbmluZyB1cCBkcml2ZXJzICglZClcbiIsIHN4X2luaXRpYWxpemVkKTsKKwlzeF9kcHJpbnRrKFNYX0RFQlVHX0NMRUFOVVAsICJDbGVhbmluZyB1cCBkcml2ZXJzICglZClcbiIsCisJCQlzeF9pbml0aWFsaXplZCk7CiAJaWYgKHN4X2luaXRpYWxpemVkKQotCQlzeF9yZWxlYXNlX2RyaXZlcnMgKCk7CisJCXN4X3JlbGVhc2VfZHJpdmVycygpOwogCi0Ja2ZyZWUgKHN4X3BvcnRzKTsKKwlrZnJlZShzeF9wb3J0cyk7CiAJZnVuY19leGl0KCk7CiB9CiAKIG1vZHVsZV9pbml0KHN4X2luaXQpOwogbW9kdWxlX2V4aXQoc3hfZXhpdCk7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N4LmggYi9kcml2ZXJzL2NoYXIvc3guaAppbmRleCBlMDFmODNjLi40MzJhYWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3guaAorKysgYi9kcml2ZXJzL2NoYXIvc3guaApAQCAtMzUsNiArMzUsNyBAQAogICB2b2lkIF9faW9tZW0gKmJhc2U7CiAgIHZvaWQgX19pb21lbSAqYmFzZTI7CiAgIHVuc2lnbmVkIGxvbmcgaHdfYmFzZTsKKyAgcmVzb3VyY2Vfc2l6ZV90IGh3X2xlbjsKICAgaW50IGVpc2FfYmFzZTsKICAgaW50IHBvcnRfYmFzZTsgLyogTnVtYmVyIG9mIHRoZSBmaXJzdCBwb3J0ICovCiAgIHN0cnVjdCBzeF9wb3J0ICpwb3J0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGluay5jIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMKaW5kZXggZjI4NjRjYy4uM2ZhNjI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMKQEAgLTEwMSw4ICsxMDEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAotI2lmZGVmIENPTkZJR19IRExDX01PRFVMRQotI2RlZmluZSBDT05GSUdfSERMQyAxCisjaWYgZGVmaW5lZChDT05GSUdfSERMQykgfHwgKGRlZmluZWQoQ09ORklHX0hETENfTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19TWU5DTElOS19NT0RVTEUpKQorI2RlZmluZSBTWU5DTElOS19HRU5FUklDX0hETEMgMQorI2Vsc2UKKyNkZWZpbmUgU1lOQ0xJTktfR0VORVJJQ19IRExDIDAKICNlbmRpZgogCiAjZGVmaW5lIEdFVF9VU0VSKGVycm9yLHZhbHVlLGFkZHIpIGVycm9yID0gZ2V0X3VzZXIodmFsdWUsYWRkcikKQEAgLTEzMyw4ICsxMzUsOCBAQAogfTsKIAogI2RlZmluZSBTSEFSRURfTUVNX0FERFJFU1NfU0laRSAweDQwMDAwCi0jZGVmaW5lIEJVRkZFUkxJU1RTSVpFIChQQUdFX1NJWkUpCi0jZGVmaW5lIERNQUJVRkZFUlNJWkUgKFBBR0VfU0laRSkKKyNkZWZpbmUgQlVGRkVSTElTVFNJWkUgNDA5NgorI2RlZmluZSBETUFCVUZGRVJTSVpFIDQwOTYKICNkZWZpbmUgTUFYUlhGUkFNRVMgNwogCiB0eXBlZGVmIHN0cnVjdCBfRE1BQlVGRkVSRU5UUlkKQEAgLTMyMCw3ICszMjIsNyBAQAogCWludCBkb3N5bmNwcHA7CiAJc3BpbmxvY2tfdCBuZXRsb2NrOwogCi0jaWZkZWYgQ09ORklHX0hETEMKKyNpZiBTWU5DTElOS19HRU5FUklDX0hETEMKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogI2VuZGlmCiB9OwpAQCAtNzI4LDcgKzczMCw3IEBACiAKIHN0YXRpYyBpbnQgbWdzbF9pb2N0bF9jb21tb24oc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogI2RlZmluZSBkZXZfdG9fcG9ydChEKSAoZGV2X3RvX2hkbGMoRCktPnByaXYpCiBzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKIHN0YXRpYyB2b2lkIGhkbGNkZXZfcngoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvLCBjaGFyICpidWYsIGludCBzaXplKTsKQEAgLTgwMiw3ICs4MDQsNyBAQAogLyoKICAqIEJvdHRvbSBoYWxmIGludGVycnVwdCBoYW5kbGVycwogICovCi1zdGF0aWMgdm9pZCBtZ3NsX2JoX2hhbmRsZXIodm9pZCogQ29udGV4dCk7CitzdGF0aWMgdm9pZCBtZ3NsX2JoX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIG1nc2xfYmhfcmVjZWl2ZShzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOwogc3RhdGljIHZvaWQgbWdzbF9iaF90cmFuc21pdChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8pOwogc3RhdGljIHZvaWQgbWdzbF9iaF9zdGF0dXMoc3RydWN0IG1nc2xfc3RydWN0ICppbmZvKTsKQEAgLTEwNzEsOSArMTA3MywxMCBAQAogLyoKICAqIAlQZXJmb3JtIGJvdHRvbSBoYWxmIHByb2Nlc3Npbmcgb2Ygd29yayBpdGVtcyBxdWV1ZWQgYnkgSVNSLgogICovCi1zdGF0aWMgdm9pZCBtZ3NsX2JoX2hhbmRsZXIodm9pZCogQ29udGV4dCkKK3N0YXRpYyB2b2lkIG1nc2xfYmhfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG1nc2xfc3RydWN0ICppbmZvID0gKHN0cnVjdCBtZ3NsX3N0cnVjdCopQ29udGV4dDsKKwlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1nc2xfc3RydWN0LCB0YXNrKTsKIAlpbnQgYWN0aW9uOwogCiAJaWYgKCFpbmZvKQpAQCAtMTI3Niw3ICsxMjc5LDcgQEAKIAkJaW5mby0+ZHJvcF9ydHNfb25fdHhfZG9uZSA9IDA7CiAJfQogCi0jaWZkZWYgQ09ORklHX0hETEMKKyNpZiBTWU5DTElOS19HRU5FUklDX0hETEMKIAlpZiAoaW5mby0+bmV0Y291bnQpCiAJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKIAllbHNlIApAQCAtMTM0MSw3ICsxMzQ0LDcgQEAKIAkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRjZF91cCsrOwogCQkJfSBlbHNlCiAJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfZG93bisrOwotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJCQlpZiAoaW5mby0+bmV0Y291bnQpIHsKIAkJCQlpZiAoc3RhdHVzICYgTUlTQ1NUQVRVU19EQ0QpCiAJCQkJCW5ldGlmX2NhcnJpZXJfb24oaW5mby0+bmV0ZGV2KTsKQEAgLTMwNTcsNyArMzA2MCw3IEBACiAgKiAJCiAgKiBSZXR1cm4gVmFsdWU6CQlOb25lCiAgKi8KLXN0YXRpYyB2b2lkIG1nc2xfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgbWdzbF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBtZ3NsX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00MzEyLDcgKzQzMTUsNyBAQAogCQkgICAgIAlpbmZvLT5tYXhfZnJhbWVfc2l6ZSApOwogCX0KIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJaGRsY2Rldl9pbml0KGluZm8pOwogI2VuZGlmCiAKQEAgLTQzMjksNyArNDMzMiw3IEBACiB7CiAJc3RydWN0IG1nc2xfc3RydWN0ICppbmZvOwogCQotCWluZm8gPSAoc3RydWN0IG1nc2xfc3RydWN0ICopa21hbGxvYyhzaXplb2Yoc3RydWN0IG1nc2xfc3RydWN0KSwKKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1nc2xfc3RydWN0KSwKIAkJIEdGUF9LRVJORUwpOwogCQkgCiAJaWYgKCFpbmZvKSB7CkBAIC00MzM3LDcgKzQzNDAsNyBAQAogCX0gZWxzZSB7CiAJCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IG1nc2xfc3RydWN0KSk7CiAJCWluZm8tPm1hZ2ljID0gTUdTTF9NQUdJQzsKLQkJSU5JVF9XT1JLKCZpbmZvLT50YXNrLCBtZ3NsX2JoX2hhbmRsZXIsIGluZm8pOworCQlJTklUX1dPUksoJmluZm8tPnRhc2ssIG1nc2xfYmhfaGFuZGxlcik7CiAJCWluZm8tPm1heF9mcmFtZV9zaXplID0gNDA5NjsKIAkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOwogCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKQEAgLTQ0MDIsNiArNDQwNSw4IEBACiAJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwogCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KIAkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7CisJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb3NwZWVkID0gOTYwMDsKIAlzZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CiAJdHR5X3NldF9vcGVyYXRpb25zKHNlcmlhbF9kcml2ZXIsICZtZ3NsX29wcyk7CiAJaWYgKChyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpIDwgMCkgewpAQCAtNDQ3MCw3ICs0NDc1LDcgQEAKIAogCWluZm8gPSBtZ3NsX2RldmljZV9saXN0OwogCXdoaWxlKGluZm8pIHsKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCQloZGxjZGV2X2V4aXQoaW5mbyk7CiAjZW5kaWYKIAkJbWdzbF9yZWxlYXNlX3Jlc291cmNlcyhpbmZvKTsKQEAgLTY2NDQsNyArNjY0OSw3IEBACiAJCQkJcmV0dXJuX2ZyYW1lID0gMTsKIAkJfQogCQlmcmFtZXNpemUgPSAwOwotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJCXsKIAkJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoaW5mby0+bmV0ZGV2KTsKIAkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKQEAgLTY3MjAsNyArNjcyNSw3IEBACiAJCQkJCQkqcHRtcCk7CiAJCQl9CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCQkJaWYgKGluZm8tPm5ldGNvdW50KQogCQkJCWhkbGNkZXZfcngoaW5mbyxpbmZvLT5pbnRlcm1lZGlhdGVfcnhidWZmZXIsZnJhbWVzaXplKTsKIAkJCWVsc2UKQEAgLTc2MjQsNyArNzYyOSw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5pcnFfc3BpbmxvY2ssZmxhZ3MpOwogCQotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJaWYgKGluZm8tPm5ldGNvdW50KQogCQloZGxjZGV2X3R4X2RvbmUoaW5mbyk7CiAJZWxzZQpAQCAtNzcwMCw3ICs3NzA1LDcgQEAKICAJcmV0dXJuIHVzY19JblJlZyggaW5mbywgQ0NTUiApICYgQklUNyA/IDEgOiAwIDsKIH0KIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAKIC8qKgogICogY2FsbGVkIGJ5IGdlbmVyaWMgSERMQyBsYXllciB3aGVuIHByb3RvY29sIHNlbGVjdGVkIChQUFAsIGZyYW1lIHJlbGF5LCBldGMuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwppbmRleCBkNDMzNGM3Li43OTJjNzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwpAQCAtODMsOCArODMsMTAgQEAKIAogI2luY2x1ZGUgImxpbnV4L3N5bmNsaW5rLmgiCiAKLSNpZmRlZiBDT05GSUdfSERMQ19NT0RVTEUKLSNkZWZpbmUgQ09ORklHX0hETEMgMQorI2lmIGRlZmluZWQoQ09ORklHX0hETEMpIHx8IChkZWZpbmVkKENPTkZJR19IRExDX01PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfU1lOQ0xJTktfR1RfTU9EVUxFKSkKKyNkZWZpbmUgU1lOQ0xJTktfR0VORVJJQ19IRExDIDEKKyNlbHNlCisjZGVmaW5lIFNZTkNMSU5LX0dFTkVSSUNfSERMQyAwCiAjZW5kaWYKIAogLyoKQEAgLTE0OSw3ICsxNTEsNyBAQAogc3RhdGljIGludCAgb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogc3RhdGljIHZvaWQgY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKIHN0YXRpYyB2b2lkIGhhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLXN0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgdm9pZCBzZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKTsKIAogc3RhdGljIGludCAgd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwogc3RhdGljIHZvaWQgcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCk7CkBAIC0xNzEsNyArMTczLDcgQEAKIC8qCiAgKiBnZW5lcmljIEhETEMgc3VwcG9ydCBhbmQgY2FsbGJhY2tzCiAgKi8KLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogI2RlZmluZSBkZXZfdG9fcG9ydChEKSAoZGV2X3RvX2hkbGMoRCktPnByaXYpCiBzdGF0aWMgdm9pZCBoZGxjZGV2X3R4X2RvbmUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CiBzdGF0aWMgdm9pZCBoZGxjZGV2X3J4KHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpOwpAQCAtMzU5LDcgKzM2MSw3IEBACiAJaW50IG5ldGNvdW50OwogCWludCBkb3N5bmNwcHA7CiAJc3BpbmxvY2tfdCBuZXRsb2NrOwotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKICNlbmRpZgogCkBAIC00ODUsNyArNDg3LDcgQEAKIHN0YXRpYyB2b2lkIHNldF9yYXRlKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHUzMiBkYXRhX3JhdGUpOwogCiBzdGF0aWMgaW50ICBiaF9hY3Rpb24oc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgdm9pZCBiaF9oYW5kbGVyKHZvaWQqIGNvbnRleHQpOworc3RhdGljIHZvaWQgYmhfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgYmhfdHJhbnNtaXQoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CiBzdGF0aWMgdm9pZCBpc3Jfc2VyaWFsKHN0cnVjdCBzbGd0X2luZm8gKmluZm8pOwogc3RhdGljIHZvaWQgaXNyX3JkbWEoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyk7CkBAIC04MTQsNyArODE2LDcgQEAKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHNsZ3RfaW5mbyAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEzNTQsNyArMTM1Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCiAvKioKICAqIGNhbGxlZCBieSBnZW5lcmljIEhETEMgbGF5ZXIgd2hlbiBwcm90b2NvbCBzZWxlY3RlZCAoUFBQLCBmcmFtZSByZWxheSwgZXRjLikKQEAgLTE4NzgsOSArMTg4MCw5IEBACiAvKgogICogcGVyZm9ybSBib3R0b20gaGFsZiBwcm9jZXNzaW5nCiAgKi8KLXN0YXRpYyB2b2lkIGJoX2hhbmRsZXIodm9pZCogY29udGV4dCkKK3N0YXRpYyB2b2lkIGJoX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSBjb250ZXh0OworCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNsZ3RfaW5mbywgdGFzayk7CiAJaW50IGFjdGlvbjsKIAogCWlmICghaW5mbykKQEAgLTIwMDIsNyArMjAwNCw3IEBACiAJfSBlbHNlIHsKIAkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfZG93bisrOwogCX0KLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCWlmIChpbmZvLT5uZXRjb3VudCkgewogCQlpZiAoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpCiAJCQluZXRpZl9jYXJyaWVyX29uKGluZm8tPm5ldGRldik7CkBAIC0yMTgwLDcgKzIxODIsNyBAQAogCQkJc2V0X3NpZ25hbHMoaW5mbyk7CiAJCX0KIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJCWlmIChpbmZvLT5uZXRjb3VudCkKIAkJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKIAkJZWxzZQpAQCAtMzMwNiw3ICszMzA4LDcgQEAKIAkJZGV2c3RyLCBpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+cGh5c19yZWdfYWRkciwKIAkJaW5mby0+aXJxX2xldmVsLCBpbmZvLT5tYXhfZnJhbWVfc2l6ZSk7CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCWhkbGNkZXZfaW5pdChpbmZvKTsKICNlbmRpZgogfQpAQCAtMzMyNiw3ICszMzI4LDcgQEAKIAl9IGVsc2UgewogCQltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBzbGd0X2luZm8pKTsKIAkJaW5mby0+bWFnaWMgPSBNR1NMX01BR0lDOwotCQlJTklUX1dPUksoJmluZm8tPnRhc2ssIGJoX2hhbmRsZXIsIGluZm8pOworCQlJTklUX1dPUksoJmluZm8tPnRhc2ssIGJoX2hhbmRsZXIpOwogCQlpbmZvLT5tYXhfZnJhbWVfc2l6ZSA9IDQwOTY7CiAJCWluZm8tPnJhd19yeF9zaXplID0gRE1BQlVGU0laRTsKIAkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOwpAQCAtMzQ4OCw3ICszNDkwLDcgQEAKIAkvKiByZWxlYXNlIGRldmljZXMgKi8KIAlpbmZvID0gc2xndF9kZXZpY2VfbGlzdDsKIAl3aGlsZShpbmZvKSB7Ci0jaWZkZWYgQ09ORklHX0hETEMKKyNpZiBTWU5DTElOS19HRU5FUklDX0hETEMKIAkJaGRsY2Rldl9leGl0KGluZm8pOwogI2VuZGlmCiAJCWZyZWVfZG1hX2J1ZnMoaW5mbyk7CkBAIC0zNTIyLDYgKzM1MjQsNyBAQAogCiAJaWYgKCFzbGd0X2RldmljZV9saXN0KSB7CiAJCXByaW50aygiJXMgbm8gZGV2aWNlcyBmb3VuZFxuIixkcml2ZXJfbmFtZSk7CisJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGNpX2RyaXZlcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMzU0Myw2ICszNTQ2LDggQEAKIAlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQogCQlCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfaXNwZWVkID0gOTYwMDsKKwlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOwogCXNlcmlhbF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKIAl0dHlfc2V0X29wZXJhdGlvbnMoc2VyaWFsX2RyaXZlciwgJm9wcyk7CiAJaWYgKChyYyA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpIDwgMCkgewpAQCAtNDQzMyw3ICs0NDM4LDcgQEAKIAkJCWZyYW1lc2l6ZSA9IDA7CiAJfQogCi0jaWZkZWYgQ09ORklHX0hETEMKKyNpZiBTWU5DTElOS19HRU5FUklDX0hETEMKIAlpZiAoZnJhbWVzaXplID09IDApIHsKIAkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhpbmZvLT5uZXRkZXYpOwogCQlzdGF0cy0+cnhfZXJyb3JzKys7CkBAIC00NDc2LDcgKzQ0ODEsNyBAQAogCQkJCWZyYW1lc2l6ZSsrOwogCQkJfQogCi0jaWZkZWYgQ09ORklHX0hETEMKKyNpZiBTWU5DTElOS19HRU5FUklDX0hETEMKIAkJCWlmIChpbmZvLT5uZXRjb3VudCkKIAkJCQloZGxjZGV2X3J4KGluZm8saW5mby0+dG1wX3JidWYsIGZyYW1lc2l6ZSk7CiAJCQllbHNlCkBAIC00Nzc5LDcgKzQ3ODQsNyBAQAogCWluZm8tPnR4X2NvdW50ID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJaWYgKGluZm8tPm5ldGNvdW50KQogCQloZGxjZGV2X3R4X2RvbmUoaW5mbyk7CiAJZWxzZQpAQCAtNDc5OSw2ICs0ODA0LDYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwogCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfUkVDRUlWRTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JYmhfaGFuZGxlcihpbmZvKTsKKwliaF9oYW5kbGVyKCZpbmZvLT50YXNrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKaW5kZXggM2U5MzJiNi4uOGY0ZDY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCkBAIC02Nyw4ICs2NywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KIAotI2lmZGVmIENPTkZJR19IRExDX01PRFVMRQotI2RlZmluZSBDT05GSUdfSERMQyAxCisjaWYgZGVmaW5lZChDT05GSUdfSERMQykgfHwgKGRlZmluZWQoQ09ORklHX0hETENfTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19TWU5DTElOS01QX01PRFVMRSkpCisjZGVmaW5lIFNZTkNMSU5LX0dFTkVSSUNfSERMQyAxCisjZWxzZQorI2RlZmluZSBTWU5DTElOS19HRU5FUklDX0hETEMgMAogI2VuZGlmCiAKICNkZWZpbmUgR0VUX1VTRVIoZXJyb3IsdmFsdWUsYWRkcikgZXJyb3IgPSBnZXRfdXNlcih2YWx1ZSxhZGRyKQpAQCAtMjgwLDcgKzI4Miw3IEBACiAJaW50IGRvc3luY3BwcDsKIAlzcGlubG9ja190IG5ldGxvY2s7CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAjZW5kaWYKIApAQCAtNTE3LDcgKzUxOSw3IEBACiBzdGF0aWMgaW50ICBvcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCk7CiBzdGF0aWMgdm9pZCBjbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogc3RhdGljIHZvaWQgaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKTsKK3N0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpOwogCiBzdGF0aWMgaW50ICB3cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiBzdGF0aWMgdm9pZCBwdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKTsKQEAgLTUzNiw3ICs1MzgsNyBAQAogc3RhdGljIHZvaWQgdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CiBzdGF0aWMgdm9pZCBzZXRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKTsKIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAjZGVmaW5lIGRldl90b19wb3J0KEQpIChkZXZfdG9faGRsYyhEKS0+cHJpdikKIHN0YXRpYyB2b2lkIGhkbGNkZXZfdHhfZG9uZShTTE1QX0lORk8gKmluZm8pOwogc3RhdGljIHZvaWQgaGRsY2Rldl9yeChTTE1QX0lORk8gKmluZm8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpOwpAQCAtNjAyLDcgKzYwNCw3IEBACiBzdGF0aWMgdm9pZCBzZXRfcmF0ZShTTE1QX0lORk8gKmluZm8sIHUzMiBkYXRhX3JhdGUpOwogCiBzdGF0aWMgaW50ICBiaF9hY3Rpb24oU0xNUF9JTkZPICppbmZvKTsKLXN0YXRpYyB2b2lkIGJoX2hhbmRsZXIodm9pZCogQ29udGV4dCk7CitzdGF0aWMgdm9pZCBiaF9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgdm9pZCBiaF9yZWNlaXZlKFNMTVBfSU5GTyAqaW5mbyk7CiBzdGF0aWMgdm9pZCBiaF90cmFuc21pdChTTE1QX0lORk8gKmluZm8pOwogc3RhdGljIHZvaWQgYmhfc3RhdHVzKFNMTVBfSU5GTyAqaW5mbyk7CkBAIC05MTYsNyArOTE4LDcgQEAKIAogLyogU2V0IG5ldyB0ZXJtaW9zIHNldHRpbmdzCiAgKi8KLXN0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJU0xNUF9JTkZPICppbmZvID0gKFNMTVBfSU5GTyAqKXR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE2MDcsNyArMTYwOSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCiAvKioKICAqIGNhbGxlZCBieSBnZW5lcmljIEhETEMgbGF5ZXIgd2hlbiBwcm90b2NvbCBzZWxlY3RlZCAoUFBQLCBmcmFtZSByZWxheSwgZXRjLikKQEAgLTIwNjMsOSArMjA2NSw5IEBACiAKIC8qIFBlcmZvcm0gYm90dG9tIGhhbGYgcHJvY2Vzc2luZyBvZiB3b3JrIGl0ZW1zIHF1ZXVlZCBieSBJU1IuCiAgKi8KLXZvaWQgYmhfaGFuZGxlcih2b2lkKiBDb250ZXh0KQordm9pZCBiaF9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlTTE1QX0lORk8gKmluZm8gPSAoU0xNUF9JTkZPKilDb250ZXh0OworCVNMTVBfSU5GTyAqaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBTTE1QX0lORk8sIHRhc2spOwogCWludCBhY3Rpb247CiAKIAlpZiAoIWluZm8pCkBAIC0yMzM5LDcgKzIzNDEsNyBAQAogCQkJc2V0X3NpZ25hbHMoaW5mbyk7CiAJCX0KIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJCWlmIChpbmZvLT5uZXRjb3VudCkKIAkJCWhkbGNkZXZfdHhfZG9uZShpbmZvKTsKIAkJZWxzZQpAQCAtMjUyMyw3ICsyNTI1LDcgQEAKIAkJCQlpbmZvLT5pbnB1dF9zaWduYWxfZXZlbnRzLmRjZF91cCsrOwogCQkJfSBlbHNlCiAJCQkJaW5mby0+aW5wdXRfc2lnbmFsX2V2ZW50cy5kY2RfZG93bisrOwotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJCQlpZiAoaW5mby0+bmV0Y291bnQpIHsKIAkJCQlpZiAoc3RhdHVzICYgU2VyaWFsU2lnbmFsX0RDRCkKIAkJCQkJbmV0aWZfY2Fycmllcl9vbihpbmZvLT5uZXRkZXYpOwpAQCAtMjcyOCw3ICsyNzMwLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIWluZm8tPnR4X2J1ZikgewotCQlpbmZvLT50eF9idWYgPSAodW5zaWduZWQgY2hhciAqKWttYWxsb2MoaW5mby0+bWF4X2ZyYW1lX3NpemUsIEdGUF9LRVJORUwpOworCQlpbmZvLT50eF9idWYgPSBrbWFsbG9jKGluZm8tPm1heF9mcmFtZV9zaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpbmZvLT50eF9idWYpIHsKIAkJCXByaW50ayhLRVJOX0VSUiIlcyglZCk6JXMgY2FuJ3QgYWxsb2NhdGUgdHJhbnNtaXQgYnVmZmVyXG4iLAogCQkJCV9fRklMRV9fLF9fTElORV9fLGluZm8tPmRldmljZV9uYW1lKTsKQEAgLTM3ODMsNyArMzc4NSw3IEBACiAJCWluZm8tPmlycV9sZXZlbCwKIAkJaW5mby0+bWF4X2ZyYW1lX3NpemUgKTsKIAotI2lmZGVmIENPTkZJR19IRExDCisjaWYgU1lOQ0xJTktfR0VORVJJQ19IRExDCiAJaGRsY2Rldl9pbml0KGluZm8pOwogI2VuZGlmCiB9CkBAIC0zNzk2LDcgKzM3OTgsNyBAQAogewogCVNMTVBfSU5GTyAqaW5mbzsKIAotCWluZm8gPSAoU0xNUF9JTkZPICopa21hbGxvYyhzaXplb2YoU0xNUF9JTkZPKSwKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoU0xNUF9JTkZPKSwKIAkJIEdGUF9LRVJORUwpOwogCiAJaWYgKCFpbmZvKSB7CkBAIC0zODA1LDcgKzM4MDcsNyBAQAogCX0gZWxzZSB7CiAJCW1lbXNldChpbmZvLCAwLCBzaXplb2YoU0xNUF9JTkZPKSk7CiAJCWluZm8tPm1hZ2ljID0gTUdTTF9NQUdJQzsKLQkJSU5JVF9XT1JLKCZpbmZvLT50YXNrLCBiaF9oYW5kbGVyLCBpbmZvKTsKKwkJSU5JVF9XT1JLKCZpbmZvLT50YXNrLCBiaF9oYW5kbGVyKTsKIAkJaW5mby0+bWF4X2ZyYW1lX3NpemUgPSA0MDk2OwogCQlpbmZvLT5jbG9zZV9kZWxheSA9IDUqSFovMTA7CiAJCWluZm8tPmNsb3Npbmdfd2FpdCA9IDMwKkhaOwpAQCAtMzk3Nyw3ICszOTc5LDcgQEAKIAkvKiByZWxlYXNlIGRldmljZXMgKi8KIAlpbmZvID0gc3luY2xpbmttcF9kZXZpY2VfbGlzdDsKIAl3aGlsZShpbmZvKSB7Ci0jaWZkZWYgQ09ORklHX0hETEMKKyNpZiBTWU5DTElOS19HRU5FUklDX0hETEMKIAkJaGRsY2Rldl9leGl0KGluZm8pOwogI2VuZGlmCiAJCWZyZWVfZG1hX2J1ZnMoaW5mbyk7CkBAIC00MDMyLDYgKzQwMzQsOCBAQAogCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKIAlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CiAJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSA5NjAwOworCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX29zcGVlZCA9IDk2MDA7CiAJc2VyaWFsX2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwogCXR0eV9zZXRfb3BlcmF0aW9ucyhzZXJpYWxfZHJpdmVyLCAmb3BzKTsKIAlpZiAoKHJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihzZXJpYWxfZHJpdmVyKSkgPCAwKSB7CkBAIC00OTc5LDcgKzQ5ODMsNyBAQAogCQkJaW5mby0+aWNvdW50LnJ4Y3JjKys7CiAKIAkJZnJhbWVzaXplID0gMDsKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCQl7CiAJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7CiAJCQlzdGF0cy0+cnhfZXJyb3JzKys7CkBAIC01MDIwLDcgKzUwMjQsNyBAQAogCQkJCQlpbmRleCA9IDA7CiAJCQl9CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCQkJaWYgKGluZm8tPm5ldGNvdW50KQogCQkJCWhkbGNkZXZfcngoaW5mbyxpbmZvLT50bXBfcnhfYnVmLGZyYW1lc2l6ZSk7CiAJCQllbHNlCkBAIC01NTMxLDcgKzU1MzUsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CiAKLSNpZmRlZiBDT05GSUdfSERMQworI2lmIFNZTkNMSU5LX0dFTkVSSUNfSERMQwogCWlmIChpbmZvLT5uZXRjb3VudCkKIAkJaGRsY2Rldl90eF9kb25lKGluZm8pOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeXNycS5jIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKaW5kZXggNWY0OTI4MC4uMTM5MzUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5c3JxLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKQEAgLTQxLDcgKzQxLDM0IEBACiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAKIC8qIFdoZXRoZXIgd2UgcmVhY3Qgb24gc3lzcnEga2V5cyBvciBqdXN0IGlnbm9yZSB0aGVtICovCi1pbnQgc3lzcnFfZW5hYmxlZCA9IDE7CitpbnQgX19yZWFkX21vc3RseSBfX3N5c3JxX2VuYWJsZWQgPSAxOworCitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgc3lzcnFfYWx3YXlzX2VuYWJsZWQ7CisKK2ludCBzeXNycV9vbih2b2lkKQoreworCXJldHVybiBfX3N5c3JxX2VuYWJsZWQgfHwgc3lzcnFfYWx3YXlzX2VuYWJsZWQ7Cit9CisKKy8qCisgKiBBIHZhbHVlIG9mIDEgbWVhbnMgJ2FsbCcsIG90aGVyIG5vbnplcm8gdmFsdWVzIGFyZSBhbiBvcCBtYXNrOgorICovCitzdGF0aWMgaW5saW5lIGludCBzeXNycV9vbl9tYXNrKGludCBtYXNrKQoreworCXJldHVybiBzeXNycV9hbHdheXNfZW5hYmxlZCB8fCBfX3N5c3JxX2VuYWJsZWQgPT0gMSB8fAorCQkJCQkJKF9fc3lzcnFfZW5hYmxlZCAmIG1hc2spOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzeXNycV9hbHdheXNfZW5hYmxlZF9zZXR1cChjaGFyICpzdHIpCit7CisJc3lzcnFfYWx3YXlzX2VuYWJsZWQgPSAxOworCXByaW50ayhLRVJOX0lORk8gImRlYnVnOiBzeXNycSBhbHdheXMgZW5hYmxlZC5cbiIpOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInN5c3JxX2Fsd2F5c19lbmFibGVkIiwgc3lzcnFfYWx3YXlzX2VuYWJsZWRfc2V0dXApOworCiAKIHN0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9sb2dsZXZlbChpbnQga2V5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewpAQCAtMTgyLDYgKzIwOSwxOCBAQAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAogfTsKIAorc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3Nob3dzdGF0ZV9ibG9ja2VkKGludCBrZXksIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc2hvd19zdGF0ZV9maWx0ZXIoVEFTS19VTklOVEVSUlVQVElCTEUpOworfQorc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd3N0YXRlX2Jsb2NrZWRfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd3N0YXRlX2Jsb2NrZWQsCisJLmhlbHBfbXNnCT0gInNob3dCbG9ja2VkVGFza3MiLAorCS5hY3Rpb25fbXNnCT0gIlNob3cgQmxvY2tlZCBTdGF0ZSIsCisJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCit9OworCisKIHN0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9zaG93bWVtKGludCBrZXksIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc2hvd19tZW0oKTsKQEAgLTIxOSwxMyArMjU4LDEzIEBACiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NJR05BTCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vb21fY2FsbGJhY2sodm9pZCAqaWdub3JlZCkKK3N0YXRpYyB2b2lkIG1vb21fY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKQogewogCW91dF9vZl9tZW1vcnkoJk5PREVfREFUQSgwKS0+bm9kZV96b25lbGlzdHNbWk9ORV9OT1JNQUxdLAogCQkJR0ZQX0tFUk5FTCwgMCk7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1dPUksobW9vbV93b3JrLCBtb29tX2NhbGxiYWNrLCBOVUxMKTsKK3N0YXRpYyBERUNMQVJFX1dPUksobW9vbV93b3JrLCBtb29tX2NhbGxiYWNrKTsKIAogc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX21vb20oaW50IGtleSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKQEAgLTMwNCw3ICszNDMsNyBAQAogCS8qIE1heSBiZSBhc3NpZ25lZCBhdCBpbml0IHRpbWUgYnkgU01QIFZPWUFHRVIgKi8KIAlOVUxMLAkJCQkvKiB2ICovCiAJTlVMTCwJCQkJLyogdyAqLwotCU5VTEwsCQkJCS8qIHggKi8KKwkmc3lzcnFfc2hvd3N0YXRlX2Jsb2NrZWRfb3AsCS8qIHggKi8KIAlOVUxMLAkJCQkvKiB5ICovCiAJTlVMTAkJCQkvKiB6ICovCiB9OwpAQCAtMzY3LDggKzQwNiw3IEBACiAJCSAqIFNob3VsZCB3ZSBjaGVjayBmb3IgZW5hYmxlZCBvcGVyYXRpb25zICgvcHJvYy9zeXNycS10cmlnZ2VyCiAJCSAqIHNob3VsZCBub3QpIGFuZCBpcyB0aGUgaW52b2tlZCBvcGVyYXRpb24gZW5hYmxlZD8KIAkJICovCi0JCWlmICghY2hlY2tfbWFzayB8fCBzeXNycV9lbmFibGVkID09IDEgfHwKLQkJICAgIChzeXNycV9lbmFibGVkICYgb3BfcC0+ZW5hYmxlX21hc2spKSB7CisJCWlmICghY2hlY2tfbWFzayB8fCBzeXNycV9vbl9tYXNrKG9wX3AtPmVuYWJsZV9tYXNrKSkgewogCQkJcHJpbnRrKCIlc1xuIiwgb3BfcC0+YWN0aW9uX21zZyk7CiAJCQljb25zb2xlX2xvZ2xldmVsID0gb3JpZ19sb2dfbGV2ZWw7CiAJCQlvcF9wLT5oYW5kbGVyKGtleSwgdHR5KTsKQEAgLTQwMiw5ICs0NDAsOCBAQAogICovCiB2b2lkIGhhbmRsZV9zeXNycShpbnQga2V5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCWlmICghc3lzcnFfZW5hYmxlZCkKLQkJcmV0dXJuOwotCV9faGFuZGxlX3N5c3JxKGtleSwgdHR5LCAxKTsKKwlpZiAoc3lzcnFfb24oKSkKKwkJX19oYW5kbGVfc3lzcnEoa2V5LCB0dHksIDEpOwogfQogRVhQT1JUX1NZTUJPTChoYW5kbGVfc3lzcnEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGIwMjE5LmMgYi9kcml2ZXJzL2NoYXIvdGIwMjE5LmMKaW5kZXggYmIxYmFkNC4uNGM0MzFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RiMDIxOS5jCisrKyBiL2RyaXZlcnMvY2hhci90YjAyMTkuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJdW5zaWduZWQgaW50IG1pbm9yOwogCWNoYXIgdmFsdWU7CiAKLQltaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3dpdGNoIChtaW5vcikgewogCWNhc2UgMDoKIAkJdmFsdWUgPSBnZXRfbGVkKCk7CkBAIC0yMDAsNyArMjAwLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAljaGFyIGM7CiAKLQltaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3dpdGNoIChtaW5vcikgewogCWNhc2UgMDoKIAkJdHlwZSA9IFRZUEVfTEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RpcGFyLmMgYi9kcml2ZXJzL2NoYXIvdGlwYXIuYwppbmRleCA5ZGYwY2ExLi40N2ZiMjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdGlwYXIuYworKysgYi9kcml2ZXJzL2NoYXIvdGlwYXIuYwpAQCAtMjg1LDcgKzI4NSw3IEBACiB0aXBhcl93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKIAkJbG9mZl90ICogcHBvcykKIHsKLQl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpIC0gVElQQVJfTUlOT1I7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpIC0gVElQQVJfTUlOT1I7CiAJc3NpemVfdCBuOwogCiAJcGFycG9ydF9jbGFpbV9vcl9ibG9jayh0YWJsZVttaW5vcl0uZGV2KTsKQEAgLTMxMyw3ICszMTMsNyBAQAogdGlwYXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewogCWludCBiID0gMDsKLQl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpIC0gVElQQVJfTUlOT1I7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpIC0gVElQQVJfTUlOT1I7CiAJc3NpemVfdCByZXR2YWwgPSAwOwogCXNzaXplX3QgbiA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90bGNsay5jIGIvZHJpdmVycy9jaGFyL3RsY2xrLmMKaW5kZXggMjQ0NGEwZS4uMjQ0ZDMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RsY2xrLmMKKysrIGIvZHJpdmVycy9jaGFyL3RsY2xrLmMKQEAgLTc5MiwxNSArNzkyLDE0IEBACiAJcmV0ID0gbWlzY19yZWdpc3RlcigmdGxjbGtfbWlzY2Rldik7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ0bGNsazogbWlzY19yZWdpc3RlciByZXR1cm5zICVkLlxuIiwgcmV0KTsKLQkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDM7CiAJfQogCiAJdGxjbGtfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgidGVsY29fY2xvY2siLAogCQkJCS0xLCBOVUxMLCAwKTsKLQlpZiAoIXRsY2xrX2RldmljZSkgeworCWlmIChJU19FUlIodGxjbGtfZGV2aWNlKSkgewogCQlwcmludGsoS0VSTl9FUlIgInRsY2xrOiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkLlxuIik7Ci0JCXJldCA9IC1FQlVTWTsKKwkJcmV0ID0gUFRSX0VSUih0bGNsa19kZXZpY2UpOwogCQlnb3RvIG91dDQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdG9zaGliYS5jIGIvZHJpdmVycy9jaGFyL3Rvc2hpYmEuYwppbmRleCBkZDM2ZmQwLi4wNzA2N2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdG9zaGliYS5jCisrKyBiL2RyaXZlcnMvY2hhci90b3NoaWJhLmMKQEAgLTI0OSw2ICsyNDksNyBAQAogCiAJcmV0dXJuIGVheDsKIH0KK0VYUE9SVF9TWU1CT0wodG9zaF9zbW0pOwogCiAKIHN0YXRpYyBpbnQgdG9zaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uYwppbmRleCA2YWQyZDNiLi4zM2UxZjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKQEAgLTMyNSw5ICszMjUsOSBAQAogCXNjaGVkdWxlX3dvcmsoJmNoaXAtPndvcmspOwogfQogCi1zdGF0aWMgdm9pZCB0aW1lb3V0X3dvcmsodm9pZCAqcHRyKQorc3RhdGljIHZvaWQgdGltZW91dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBwdHI7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0cG1fY2hpcCwgd29yayk7CiAKIAlkb3duKCZjaGlwLT5idWZmZXJfbXV0ZXgpOwogCWF0b21pY19zZXQoJmNoaXAtPmRhdGFfcGVuZGluZywgMCk7CkBAIC0xMTA1LDcgKzExMDUsNyBAQAogCWluaXRfTVVURVgoJmNoaXAtPnRwbV9tdXRleCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNoaXAtPmxpc3QpOwogCi0JSU5JVF9XT1JLKCZjaGlwLT53b3JrLCB0aW1lb3V0X3dvcmssIGNoaXApOworCUlOSVRfV09SSygmY2hpcC0+d29yaywgdGltZW91dF93b3JrKTsKIAogCWluaXRfdGltZXIoJmNoaXAtPnVzZXJfcmVhZF90aW1lcik7CiAJY2hpcC0+dXNlcl9yZWFkX3RpbWVyLmZ1bmN0aW9uID0gdXNlcl9yZWFkZXJfdGltZW91dDsKQEAgLTExMzAsNyArMTEzMCw3IEBACiAJc2NucHJpbnRmKGRldm5hbWUsIERFVk5BTUVfU0laRSwgIiVzJWQiLCAidHBtIiwgY2hpcC0+ZGV2X251bSk7CiAJY2hpcC0+dmVuZG9yLm1pc2NkZXYubmFtZSA9IGRldm5hbWU7CiAKLQljaGlwLT52ZW5kb3IubWlzY2Rldi5kZXYgPSBkZXY7CisJY2hpcC0+dmVuZG9yLm1pc2NkZXYucGFyZW50ID0gZGV2OwogCWNoaXAtPmRldiA9IGdldF9kZXZpY2UoZGV2KTsKIAogCWlmIChtaXNjX3JlZ2lzdGVyKCZjaGlwLT52ZW5kb3IubWlzY2RldikpIHsKQEAgLTExNTUsNiArMTE1NSw3IEBACiAKIAlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosIGNoaXAtPnZlbmRvci5hdHRyX2dyb3VwKSkgewogCQlsaXN0X2RlbCgmY2hpcC0+bGlzdCk7CisJCW1pc2NfZGVyZWdpc3RlcigmY2hpcC0+dmVuZG9yLm1pc2NkZXYpOwogCQlwdXRfZGV2aWNlKGRldik7CiAJCWNsZWFyX2JpdChjaGlwLT5kZXZfbnVtLCBkZXZfbWFzayk7CiAJCWtmcmVlKGNoaXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaCBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKaW5kZXggMDUwY2VkMi4uYmI5YTQzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKaW5kZXggZTkwZWEzOS4uNDdhNmVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pby5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwpAQCAtMTA5LDEzICsxMDksMTUgQEAKICNkZWZpbmUgVFRZX1BBUkFOT0lBX0NIRUNLIDEKICNkZWZpbmUgQ0hFQ0tfVFRZX0NPVU5UIDEKIAotc3RydWN0IHRlcm1pb3MgdHR5X3N0ZF90ZXJtaW9zID0gewkvKiBmb3IgdGhlIGJlbmVmaXQgb2YgdHR5IGRyaXZlcnMgICovCitzdHJ1Y3Qga3Rlcm1pb3MgdHR5X3N0ZF90ZXJtaW9zID0gewkvKiBmb3IgdGhlIGJlbmVmaXQgb2YgdHR5IGRyaXZlcnMgICovCiAJLmNfaWZsYWcgPSBJQ1JOTCB8IElYT04sCiAJLmNfb2ZsYWcgPSBPUE9TVCB8IE9OTENSLAogCS5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCwKIAkuY19sZmxhZyA9IElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8CiAJCSAgIEVDSE9DVEwgfCBFQ0hPS0UgfCBJRVhURU4sCi0JLmNfY2MgPSBJTklUX0NfQ0MKKwkuY19jYyA9IElOSVRfQ19DQywKKwkuY19pc3BlZWQgPSAzODQwMCwKKwkuY19vc3BlZWQgPSAzODQwMAogfTsKIAogRVhQT1JUX1NZTUJPTCh0dHlfc3RkX3Rlcm1pb3MpOwpAQCAtMTI2LDcgKzEyOCw3IEBACiAgICAKIExJU1RfSEVBRCh0dHlfZHJpdmVycyk7CQkJLyogbGlua2VkIGxpc3Qgb2YgdHR5IGRyaXZlcnMgKi8KIAotLyogU2VtYXBob3JlIHRvIHByb3RlY3QgY3JlYXRpbmcgYW5kIHJlbGVhc2luZyBhIHR0eS4gVGhpcyBpcyBzaGFyZWQgd2l0aAorLyogTXV0ZXggdG8gcHJvdGVjdCBjcmVhdGluZyBhbmQgcmVsZWFzaW5nIGEgdHR5LiBUaGlzIGlzIHNoYXJlZCB3aXRoCiAgICB2dC5jIGZvciBkZWVwbHkgZGlzZ3VzdGluZyBoYWNrIHJlYXNvbnMgKi8KIERFRklORV9NVVRFWCh0dHlfbXV0ZXgpOwogRVhQT1JUX1NZTUJPTCh0dHlfbXV0ZXgpOwpAQCAtMjUwLDcgKzI1Miw3IEBACiAJCQkJICAgICIhPSAjZmQncyglZCkgaW4gJXNcbiIsCiAJCSAgICAgICB0dHktPm5hbWUsIHR0eS0+Y291bnQsIGNvdW50LCByb3V0aW5lKTsKIAkJcmV0dXJuIGNvdW50OwotICAgICAgIH0JCisJfQogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CkBAIC0yNTksMTggKzI2MSw2IEBACiAgKiBUdHkgYnVmZmVyIGFsbG9jYXRpb24gbWFuYWdlbWVudAogICovCiAKLQotLyoqCi0gKgl0dHlfYnVmZmVyX2ZyZWVfYWxsCQktCWZyZWUgYnVmZmVycyB1c2VkIGJ5IGEgdHR5Ci0gKglAdHR5OiB0dHkgdG8gZnJlZSBmcm9tCi0gKgotICoJUmVtb3ZlIGFsbCB0aGUgYnVmZmVycyBwZW5kaW5nIG9uIGEgdHR5IHdoZXRoZXIgcXVldWVkIHdpdGggZGF0YQotICoJb3IgaW4gdGhlIGZyZWUgcmluZy4gTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgdHR5IGlzIG5vIGxvbmdlciBpbiB1c2UKLSAqCi0gKglMb2NraW5nOiBub25lCi0gKi8KLQotCiAvKioKICAqCXR0eV9idWZmZXJfZnJlZV9hbGwJCS0JZnJlZSBidWZmZXJzIHVzZWQgYnkgYSB0dHkKICAqCUB0dHk6IHR0eSB0byBmcmVlIGZyb20KQEAgLTYxNCw3ICs2MDQsNyBAQAogICoJdGhleSBhcmUgbm90IG9uIGhvdCBwYXRocyBzbyBhIGxpdHRsZSBkaXNjaXBsaW5lIHdvbid0IGRvIAogICoJYW55IGhhcm0uCiAgKgotICoJTG9ja2luZzogdGFrZXMgdGVybWlvc19zZW0KKyAqCUxvY2tpbmc6IHRha2VzIHRlcm1pb3NfbXV0ZXgKICAqLwogIAogc3RhdGljIHZvaWQgdHR5X3NldF90ZXJtaW9zX2xkaXNjKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBudW0pCkBAIC05MTUsNyArOTA1LDcgQEAKICAqCWNvbnRleHQuCiAgKgogICoJTG9ja2luZzogdGFrZXMgdHR5X2xkaXNjX2xvY2suCi0gKgkJY2FsbGVkIGZ1bmN0aW9ucyB0YWtlIHRlcm1pb3Nfc2VtCisgKgkJIGNhbGxlZCBmdW5jdGlvbnMgdGFrZSB0ZXJtaW9zX211dGV4CiAgKi8KICAKIHN0YXRpYyBpbnQgdHR5X3NldF9sZGlzYyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbGRpc2MpCkBAIC0xMjUxLDEwICsxMjQxLDI2IEBACiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHR0eV9sZGlzY19mbHVzaCk7CisKKy8qKgorICoJdHR5X3Jlc2V0X3Rlcm1pb3MJLQlyZXNldCB0ZXJtaW5hbCBzdGF0ZQorICoJQHR0eTogdHR5IHRvIHJlc2V0CisgKgorICoJUmVzdG9yZSBhIHRlcm1pbmFsIHRvIHRoZSBkcml2ZXIgZGVmYXVsdCBzdGF0ZQorICovCisKK3N0YXRpYyB2b2lkIHR0eV9yZXNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJbXV0ZXhfbG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKKwkqdHR5LT50ZXJtaW9zID0gdHR5LT5kcml2ZXItPmluaXRfdGVybWlvczsKKwl0dHktPnRlcm1pb3MtPmNfaXNwZWVkID0gdHR5X3Rlcm1pb3NfaW5wdXRfYmF1ZF9yYXRlKHR0eS0+dGVybWlvcyk7CisJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSh0dHktPnRlcm1pb3MpOworCW11dGV4X3VubG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKK30KIAkKIC8qKgogICoJZG9fdHR5X2hhbmd1cAkJLQlhY3R1YWwgaGFuZGxlciBmb3IgaGFuZ3VwIGV2ZW50cwotICoJQGRhdGE6IHR0eSBkZXZpY2UKKyAqCUB3b3JrOiB0dHkgZGV2aWNlCiAgKgogICoJVGhpcyBjYW4gYmUgY2FsbGVkIGJ5IHRoZSAiZXZlbnRkIiBrZXJuZWwgdGhyZWFkLiAgVGhhdCBpcyBwcm9jZXNzCiAgKglzeW5jaHJvbm91cyBidXQgZG9lc24ndCBob2xkIGFueSBsb2Nrcywgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UKQEAgLTEyNjcsMTYgKzEyNzMsMTcgQEAKICAqCiAgKglMb2NraW5nOgogICoJCUJLTAotICoJCXJlZGlyZWN0IGxvY2sgZm9yIHVuZG9pbmcgcmVkaXJlY3Rpb24KLSAqCQlmaWxlIGxpc3QgbG9jayBmb3IgbWFuaXB1bGF0aW5nIGxpc3Qgb2YgdHR5cwotICoJCXR0eV9sZGlzY19sb2NrIGZyb20gY2FsbGVkIGZ1bmN0aW9ucwotICoJCXRlcm1pb3Nfc2VtIHJlc2V0dGluZyB0ZXJtaW9zIGRhdGEKLSAqCQl0YXNrbGlzdF9sb2NrIHRvIHdhbGsgdGFzayBsaXN0IGZvciBoYW5ndXAgZXZlbnQKLSAqCisgKgkJICByZWRpcmVjdCBsb2NrIGZvciB1bmRvaW5nIHJlZGlyZWN0aW9uCisgKgkJICBmaWxlIGxpc3QgbG9jayBmb3IgbWFuaXB1bGF0aW5nIGxpc3Qgb2YgdHR5cworICoJCSAgdHR5X2xkaXNjX2xvY2sgZnJvbSBjYWxsZWQgZnVuY3Rpb25zCisgKgkJICB0ZXJtaW9zX211dGV4IHJlc2V0dGluZyB0ZXJtaW9zIGRhdGEKKyAqCQkgIHRhc2tsaXN0X2xvY2sgdG8gd2FsayB0YXNrIGxpc3QgZm9yIGhhbmd1cCBldmVudAorICoJCSAgICAtPnNpZ2xvY2sgdG8gcHJvdGVjdCAtPnNpZ25hbC8tPnNpZ2hhbmQKICAqLwotc3RhdGljIHZvaWQgZG9fdHR5X2hhbmd1cCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZG9fdHR5X2hhbmd1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKSBkYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHR0eV9zdHJ1Y3QsIGhhbmd1cF93b3JrKTsKIAlzdHJ1Y3QgZmlsZSAqIGNvbnNfZmlscCA9IE5VTEw7CiAJc3RydWN0IGZpbGUgKmZpbHAsICpmID0gTlVMTDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CkBAIC0xMzM4LDExICsxMzQ1LDcgQEAKIAkgKiBOX1RUWS4KIAkgKi8KIAlpZiAodHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TKQotCXsKLQkJbXV0ZXhfbG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKLQkJKnR0eS0+dGVybWlvcyA9IHR0eS0+ZHJpdmVyLT5pbml0X3Rlcm1pb3M7Ci0JCW11dGV4X3VubG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKLQl9CisJCXR0eV9yZXNldF90ZXJtaW9zKHR0eSk7CiAJCiAJLyogRGVmZXIgbGRpc2Mgc3dpdGNoICovCiAJLyogdHR5X2RlZmVycmVkX2xkaXNjX3N3aXRjaChOX1RUWSk7CkBAIC0xMzUzLDE0ICsxMzU2LDE4IEBACiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlpZiAodHR5LT5zZXNzaW9uID4gMCkgewogCQlkb19lYWNoX3Rhc2tfcGlkKHR0eS0+c2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApIHsKKwkJCXNwaW5fbG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQkJaWYgKHAtPnNpZ25hbC0+dHR5ID09IHR0eSkKIAkJCQlwLT5zaWduYWwtPnR0eSA9IE5VTEw7Ci0JCQlpZiAoIXAtPnNpZ25hbC0+bGVhZGVyKQorCQkJaWYgKCFwLT5zaWduYWwtPmxlYWRlcikgeworCQkJCXNwaW5fdW5sb2NrX2lycSgmcC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCQkJY29udGludWU7Ci0JCQlncm91cF9zZW5kX3NpZ19pbmZvKFNJR0hVUCwgU0VORF9TSUdfUFJJViwgcCk7Ci0JCQlncm91cF9zZW5kX3NpZ19pbmZvKFNJR0NPTlQsIFNFTkRfU0lHX1BSSVYsIHApOworCQkJfQorCQkJX19ncm91cF9zZW5kX3NpZ19pbmZvKFNJR0hVUCwgU0VORF9TSUdfUFJJViwgcCk7CisJCQlfX2dyb3VwX3NlbmRfc2lnX2luZm8oU0lHQ09OVCwgU0VORF9TSUdfUFJJViwgcCk7CiAJCQlpZiAodHR5LT5wZ3JwID4gMCkKIAkJCQlwLT5zaWduYWwtPnR0eV9vbGRfcGdycCA9IHR0eS0+cGdycDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCX0gd2hpbGVfZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKIAl9CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwpAQCAtMTQzMyw3ICsxNDQwLDcgQEAKIAogCXByaW50ayhLRVJOX0RFQlVHICIlcyB2aGFuZ3VwLi4uXG4iLCB0dHlfbmFtZSh0dHksIGJ1ZikpOwogI2VuZGlmCi0JZG9fdHR5X2hhbmd1cCgodm9pZCAqKSB0dHkpOworCWRvX3R0eV9oYW5ndXAoJnR0eS0+aGFuZ3VwX3dvcmspOwogfQogRVhQT1JUX1NZTUJPTCh0dHlfdmhhbmd1cCk7CiAKQEAgLTE0NTIsNiArMTQ1OSwxNCBAQAogCiBFWFBPUlRfU1lNQk9MKHR0eV9odW5nX3VwX3ApOwogCitzdGF0aWMgdm9pZCBzZXNzaW9uX2NsZWFyX3R0eShwaWRfdCBzZXNzaW9uKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlkb19lYWNoX3Rhc2tfcGlkKHNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7CisJCXByb2NfY2xlYXJfdHR5KHApOworCX0gd2hpbGVfZWFjaF90YXNrX3BpZChzZXNzaW9uLCBQSURUWVBFX1NJRCwgcCk7Cit9CisKIC8qKgogICoJZGlzYXNzb2NpYXRlX2N0dHkJLQlkaXNjb25uZWN0IGNvbnRyb2xsaW5nIHR0eQogICoJQG9uX2V4aXQ6IHRydWUgaWYgZXhpdGluZyBzbyBuZWVkIHRvICJoYW5nIHVwIiB0aGUgc2Vzc2lvbgpAQCAtMTQ2OCwzMSArMTQ4MywzNSBAQAogICoJVGhlIGFyZ3VtZW50IG9uX2V4aXQgaXMgc2V0IHRvIDEgaWYgY2FsbGVkIHdoZW4gYSBwcm9jZXNzIGlzCiAgKglleGl0aW5nOyBpdCBpcyAwIGlmIGNhbGxlZCBieSB0aGUgaW9jdGwgVElPQ05PVFRZLgogICoKLSAqCUxvY2tpbmc6IHR0eV9tdXRleCBpcyB0YWtlbiB0byBwcm90ZWN0IGN1cnJlbnQtPnNpZ25hbC0+dHR5CisgKglMb2NraW5nOgogICoJCUJLTCBpcyB0YWtlbiBmb3IgaHlzdGVyaWNhbCByYWlzaW5zCi0gKgkJVGFza2xpc3QgbG9jayBpcyB0YWtlbiAodW5kZXIgdHR5X211dGV4KSB0byB3YWxrIHByb2Nlc3MKLSAqCQlsaXN0cyBmb3IgdGhlIHNlc3Npb24uCisgKgkJICB0dHlfbXV0ZXggaXMgdGFrZW4gdG8gcHJvdGVjdCB0dHkKKyAqCQkgIC0+c2lnbG9jayBpcyB0YWtlbiB0byBwcm90ZWN0IC0+c2lnbmFsLy0+c2lnaGFuZAorICoJCSAgdGFza2xpc3RfbG9jayBpcyB0YWtlbiB0byB3YWxrIHByb2Nlc3MgbGlzdCBmb3Igc2Vzc2lvbnMKKyAqCQkgICAgLT5zaWdsb2NrIGlzIHRha2VuIHRvIHByb3RlY3QgLT5zaWduYWwvLT5zaWdoYW5kCiAgKi8KIAogdm9pZCBkaXNhc3NvY2lhdGVfY3R0eShpbnQgb25fZXhpdCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAlpbnQgdHR5X3BncnAgPSAtMTsKKwlpbnQgc2Vzc2lvbjsKIAogCWxvY2tfa2VybmVsKCk7CiAKIAltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwotCXR0eSA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5OworCXR0eSA9IGdldF9jdXJyZW50X3R0eSgpOwogCWlmICh0dHkpIHsKIAkJdHR5X3BncnAgPSB0dHktPnBncnA7CiAJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKKwkJLyogWFhYOiBoZXJlIHdlIHJhY2UsIHRoZXJlIGlzIG5vdGhpbmcgcHJvdGVjdGluZyB0dHkgKi8KIAkJaWYgKG9uX2V4aXQgJiYgdHR5LT5kcml2ZXItPnR5cGUgIT0gVFRZX0RSSVZFUl9UWVBFX1BUWSkKIAkJCXR0eV92aGFuZ3VwKHR0eSk7CiAJfSBlbHNlIHsKLQkJaWYgKGN1cnJlbnQtPnNpZ25hbC0+dHR5X29sZF9wZ3JwKSB7Ci0JCQlraWxsX3BnKGN1cnJlbnQtPnNpZ25hbC0+dHR5X29sZF9wZ3JwLCBTSUdIVVAsIG9uX2V4aXQpOwotCQkJa2lsbF9wZyhjdXJyZW50LT5zaWduYWwtPnR0eV9vbGRfcGdycCwgU0lHQ09OVCwgb25fZXhpdCk7CisJCXBpZF90IG9sZF9wZ3JwID0gY3VycmVudC0+c2lnbmFsLT50dHlfb2xkX3BncnA7CisJCWlmIChvbGRfcGdycCkgeworCQkJa2lsbF9wZyhvbGRfcGdycCwgU0lHSFVQLCBvbl9leGl0KTsKKwkJCWtpbGxfcGcob2xkX3BncnAsIFNJR0NPTlQsIG9uX2V4aXQpOwogCQl9CiAJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJdW5sb2NrX2tlcm5lbCgpOwkKQEAgLTE1MDQsMTkgKzE1MjMsMjkgQEAKIAkJCWtpbGxfcGcodHR5X3BncnAsIFNJR0NPTlQsIG9uX2V4aXQpOwogCX0KIAotCS8qIE11c3QgbG9jayBjaGFuZ2VzIHRvIHR0eV9vbGRfcGdycCAqLwotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJY3VycmVudC0+c2lnbmFsLT50dHlfb2xkX3BncnAgPSAwOwotCXR0eS0+c2Vzc2lvbiA9IDA7Ci0JdHR5LT5wZ3JwID0gLTE7CisJc2Vzc2lvbiA9IHByb2Nlc3Nfc2Vzc2lvbihjdXJyZW50KTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKKwkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGRvX3R0eV9oYW5ndXAgaGFzIGZyZWUnZCB0aGlzIHR0eSAqLworCXR0eSA9IGdldF9jdXJyZW50X3R0eSgpOworCWlmICh0dHkpIHsKKwkJdHR5LT5zZXNzaW9uID0gMDsKKwkJdHR5LT5wZ3JwID0gMDsKKwl9IGVsc2UgeworI2lmZGVmIFRUWV9ERUJVR19IQU5HVVAKKwkJcHJpbnRrKEtFUk5fREVCVUcgImVycm9yIGF0dGVtcHRlZCB0byB3cml0ZSB0byB0dHkgWzB4JXBdIgorCQkgICAgICAgIiA9IE5VTEwiLCB0dHkpOworI2VuZGlmCisJfQorCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAogCS8qIE5vdyBjbGVhciBzaWduYWwtPnR0eSB1bmRlciB0aGUgbG9jayAqLwogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JZG9fZWFjaF90YXNrX3BpZChjdXJyZW50LT5zaWduYWwtPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7Ci0JCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKLQl9IHdoaWxlX2VhY2hfdGFza19waWQoY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCk7CisJc2Vzc2lvbl9jbGVhcl90dHkoc2Vzc2lvbik7CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAl1bmxvY2tfa2VybmVsKCk7CiB9CiAKQEAgLTE2MTQsNyArMTY0Myw3IEBACiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAKIAl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGlub2RlLCAidHR5X3JlYWQiKSkKIAkJcmV0dXJuIC1FSU87CiAJaWYgKCF0dHkgfHwgKHRlc3RfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpKSkKQEAgLTE3MTcsNyArMTc0Niw3IEBACiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAlpZiAod3JpdHRlbikgewotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCQlpbm9kZS0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CiAJCXJldCA9IHdyaXR0ZW47CiAJfQpAQCAtMTc0OCw3ICsxNzc3LDcgQEAKIAkJCSBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHk7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNzaXplX3QgcmV0OwogCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwogCQpAQCAtMTg1NSw4ICsxODg0LDggQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqKnJldF90dHkpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgKm9fdHR5OwotCXN0cnVjdCB0ZXJtaW9zICp0cCwgKip0cF9sb2MsICpvX3RwLCAqKm9fdHBfbG9jOwotCXN0cnVjdCB0ZXJtaW9zICpsdHAsICoqbHRwX2xvYywgKm9fbHRwLCAqKm9fbHRwX2xvYzsKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRwLCAqKnRwX2xvYywgKm9fdHAsICoqb190cF9sb2M7CisJc3RydWN0IGt0ZXJtaW9zICpsdHAsICoqbHRwX2xvYywgKm9fbHRwLCAqKm9fbHRwX2xvYzsKIAlpbnQgcmV0dmFsID0gMDsKIAogCS8qIGNoZWNrIHdoZXRoZXIgd2UncmUgcmVvcGVuaW5nIGFuIGV4aXN0aW5nIHR0eSAqLwpAQCAtMTkwMyw3ICsxOTMyLDcgQEAKIAl9CiAKIAlpZiAoISp0cF9sb2MpIHsKLQkJdHAgPSAoc3RydWN0IHRlcm1pb3MgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHRlcm1pb3MpLAorCQl0cCA9IChzdHJ1Y3Qga3Rlcm1pb3MgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSwKIAkJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoIXRwKQogCQkJZ290byBmcmVlX21lbV9vdXQ7CkBAIC0xOTExLDExICsxOTQwLDExIEBACiAJfQogCiAJaWYgKCEqbHRwX2xvYykgewotCQlsdHAgPSAoc3RydWN0IHRlcm1pb3MgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHRlcm1pb3MpLAorCQlsdHAgPSAoc3RydWN0IGt0ZXJtaW9zICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksCiAJCQkJCQkgR0ZQX0tFUk5FTCk7CiAJCWlmICghbHRwKQogCQkJZ290byBmcmVlX21lbV9vdXQ7Ci0JCW1lbXNldChsdHAsIDAsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpOworCQltZW1zZXQobHRwLCAwLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CiAJfQogCiAJaWYgKGRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZKSB7CkBAIC0xOTM2LDE5ICsxOTY1LDE5IEBACiAJCX0KIAogCQlpZiAoISpvX3RwX2xvYykgewotCQkJb190cCA9IChzdHJ1Y3QgdGVybWlvcyAqKQotCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSwgR0ZQX0tFUk5FTCk7CisJCQlvX3RwID0gKHN0cnVjdCBrdGVybWlvcyAqKQorCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFvX3RwKQogCQkJCWdvdG8gZnJlZV9tZW1fb3V0OwogCQkJKm9fdHAgPSBkcml2ZXItPm90aGVyLT5pbml0X3Rlcm1pb3M7CiAJCX0KIAogCQlpZiAoISpvX2x0cF9sb2MpIHsKLQkJCW9fbHRwID0gKHN0cnVjdCB0ZXJtaW9zICopCi0JCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHRlcm1pb3MpLCBHRlBfS0VSTkVMKTsKKwkJCW9fbHRwID0gKHN0cnVjdCBrdGVybWlvcyAqKQorCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFvX2x0cCkKIAkJCQlnb3RvIGZyZWVfbWVtX291dDsKLQkJCW1lbXNldChvX2x0cCwgMCwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7CisJCQltZW1zZXQob19sdHAsIDAsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKTsKIAkJfQogCiAJCS8qCkBAIC0xOTg3LDYgKzIwMTYsOSBAQAogCQkqbHRwX2xvYyA9IGx0cDsKIAl0dHktPnRlcm1pb3MgPSAqdHBfbG9jOwogCXR0eS0+dGVybWlvc19sb2NrZWQgPSAqbHRwX2xvYzsKKwkvKiBDb21wYXRpYmlsaXR5IHVudGlsIGRyaXZlcnMgYWx3YXlzIHNldCB0aGlzICovCisJdHR5LT50ZXJtaW9zLT5jX2lzcGVlZCA9IHR0eV90ZXJtaW9zX2lucHV0X2JhdWRfcmF0ZSh0dHktPnRlcm1pb3MpOworCXR0eS0+dGVybWlvcy0+Y19vc3BlZWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodHR5LT50ZXJtaW9zKTsKIAlkcml2ZXItPnJlZmNvdW50Kys7CiAJdHR5LT5jb3VudCsrOwogCkBAIC0yMDg5LDcgKzIxMjEsNyBAQAogc3RhdGljIHZvaWQgcmVsZWFzZV9tZW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlkeCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqb190dHk7Ci0Jc3RydWN0IHRlcm1pb3MgKnRwOworCXN0cnVjdCBrdGVybWlvcyAqdHA7CiAJaW50IGRldnB0cyA9IHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTTsKIAogCWlmICgob190dHkgPSB0dHktPmxpbmspICE9IE5VTEwpIHsKQEAgLTIxNTUsNyArMjE4Nyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKIAl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCAicmVsZWFzZV9kZXYiKSkKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgInJlbGVhc2VfZGV2IikpCiAJCXJldHVybjsKIAogCWNoZWNrX3R0eV9jb3VudCh0dHksICJyZWxlYXNlX2RldiIpOwpAQCAtMjMzNiwxNiArMjM2OCwxMCBAQAogCSAqIHR0eS4KIAkgKi8KIAlpZiAodHR5X2Nsb3NpbmcgfHwgb190dHlfY2xvc2luZykgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0KIAkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJZG9fZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKSB7Ci0JCQlwLT5zaWduYWwtPnR0eSA9IE5VTEw7Ci0JCX0gd2hpbGVfZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKKwkJc2Vzc2lvbl9jbGVhcl90dHkodHR5LT5zZXNzaW9uKTsKIAkJaWYgKG9fdHR5KQotCQkJZG9fZWFjaF90YXNrX3BpZChvX3R0eS0+c2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApIHsKLQkJCQlwLT5zaWduYWwtPnR0eSA9IE5VTEw7Ci0JCQl9IHdoaWxlX2VhY2hfdGFza19waWQob190dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKKwkJCXNlc3Npb25fY2xlYXJfdHR5KG9fdHR5LT5zZXNzaW9uKTsKIAkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCX0KIApAQCAtMjQ0Miw5ICsyNDY4LDkgQEAKICAqCVRoZSB0ZXJtaW9zIHN0YXRlIG9mIGEgcHR5IGlzIHJlc2V0IG9uIGZpcnN0IG9wZW4gc28gdGhhdAogICoJc2V0dGluZ3MgZG9uJ3QgcGVyc2lzdCBhY3Jvc3MgcmV1c2UuCiAgKgotICoJTG9ja2luZzogdHR5X211dGV4IHByb3RlY3RzIGN1cnJlbnQtPnNpZ25hbC0+dHR5LCBnZXRfdHR5X2RyaXZlciBhbmQKLSAqCQlpbml0X2RldiB3b3JrLiB0dHktPmNvdW50IHNob3VsZCBwcm90ZWN0IHRoZSByZXN0LgotICoJCXRhc2tfbG9jayBpcyBoZWxkIHRvIHVwZGF0ZSB0YXNrIGRldGFpbHMgZm9yIHNlc3Npb25zCisgKglMb2NraW5nOiB0dHlfbXV0ZXggcHJvdGVjdHMgdHR5LCBnZXRfdHR5X2RyaXZlciBhbmQgaW5pdF9kZXYgd29yay4KKyAqCQkgdHR5LT5jb3VudCBzaG91bGQgcHJvdGVjdCB0aGUgcmVzdC4KKyAqCQkgLT5zaWdsb2NrIHByb3RlY3RzIC0+c2lnbmFsLy0+c2lnaGFuZAogICovCiAKIHN0YXRpYyBpbnQgdHR5X29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKQEAgLTI0NjYsMTIgKzI0OTIsMTMgQEAKIAltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwogCiAJaWYgKGRldmljZSA9PSBNS0RFVihUVFlBVVhfTUFKT1IsMCkpIHsKLQkJaWYgKCFjdXJyZW50LT5zaWduYWwtPnR0eSkgeworCQl0dHkgPSBnZXRfY3VycmVudF90dHkoKTsKKwkJaWYgKCF0dHkpIHsKIAkJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KLQkJZHJpdmVyID0gY3VycmVudC0+c2lnbmFsLT50dHktPmRyaXZlcjsKLQkJaW5kZXggPSBjdXJyZW50LT5zaWduYWwtPnR0eS0+aW5kZXg7CisJCWRyaXZlciA9IHR0eS0+ZHJpdmVyOworCQlpbmRleCA9IHR0eS0+aW5kZXg7CiAJCWZpbHAtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsgLyogRG9uJ3QgbGV0IC9kZXYvdHR5IGJsb2NrICovCiAJCS8qIG5vY3R0eSA9IDE7ICovCiAJCWdvdG8gZ290X2RyaXZlcjsKQEAgLTI1NDYsMTcgKzI1NzMsMTYgQEAKIAkJCWZpbHAtPmZfb3AgPSAmdHR5X2ZvcHM7CiAJCWdvdG8gcmV0cnlfb3BlbjsKIAl9CisKKwltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCWlmICghbm9jdHR5ICYmCiAJICAgIGN1cnJlbnQtPnNpZ25hbC0+bGVhZGVyICYmCiAJICAgICFjdXJyZW50LT5zaWduYWwtPnR0eSAmJgotCSAgICB0dHktPnNlc3Npb24gPT0gMCkgewotCSAgICAJdGFza19sb2NrKGN1cnJlbnQpOwotCQljdXJyZW50LT5zaWduYWwtPnR0eSA9IHR0eTsKLQkJdGFza191bmxvY2soY3VycmVudCk7Ci0JCWN1cnJlbnQtPnNpZ25hbC0+dHR5X29sZF9wZ3JwID0gMDsKLQkJdHR5LT5zZXNzaW9uID0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uOwotCQl0dHktPnBncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOwotCX0KKwkgICAgdHR5LT5zZXNzaW9uID09IDApCisJCV9fcHJvY19zZXRfdHR5KGN1cnJlbnQsIHR0eSk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2NzEsNyArMjY5Nyw3IEBACiAJaW50IHJldCA9IDA7CiAKIAl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCAidHR5X3BvbGwiKSkKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgInR0eV9wb2xsIikpCiAJCXJldHVybiAwOwogCQkKIAlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwpAQCAtMjY4Nyw3ICsyNzEzLDcgQEAKIAlpbnQgcmV0dmFsOwogCiAJdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopZmlscC0+cHJpdmF0ZV9kYXRhOwotCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgInR0eV9mYXN5bmMiKSkKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgInR0eV9mYXN5bmMiKSkKIAkJcmV0dXJuIDA7CiAJCiAJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZ0dHktPmZhc3luYyk7CkBAIC0yNzQ2LDcgKzI3NzIsNyBAQAogICoKICAqCUNvcGllcyB0aGUga2VybmVsIGlkZWEgb2YgdGhlIHdpbmRvdyBzaXplIGludG8gdGhlIHVzZXIgYnVmZmVyLgogICoKLSAqCUxvY2tpbmc6IHR0eS0+dGVybWlvc19zZW0gaXMgdGFrZW4gdG8gZW5zdXJlIHRoZSB3aW5zaXplIGRhdGEKKyAqCUxvY2tpbmc6IHR0eS0+dGVybWlvc19tdXRleCBpcyB0YWtlbiB0byBlbnN1cmUgdGhlIHdpbnNpemUgZGF0YQogICoJCWlzIGNvbnNpc3RlbnQuCiAgKi8KIApAQCAtMjc3Myw4ICsyNzk5LDggQEAKICAqCUxvY2tpbmc6CiAgKgkJQ2FsbGVkIGZ1bmN0aW9uIHVzZSB0aGUgY29uc29sZV9zZW0gaXMgdXNlZCB0byBlbnN1cmUgd2UgZG8KICAqCW5vdCB0cnkgYW5kIHJlc2l6ZSB0aGUgY29uc29sZSB0d2ljZSBhdCBvbmNlLgotICoJCVRoZSB0dHktPnRlcm1pb3Nfc2VtIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGRvdWJsZQotICoJcmVzaXplIGFuZCBnZXQgY29uZnVzZWQuIExvY2sgb3JkZXIgLSB0dHktPnRlcm1pb3Muc2VtIGJlZm9yZQorICoJCVRoZSB0dHktPnRlcm1pb3NfbXV0ZXggaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgZG91YmxlCisgKglyZXNpemUgYW5kIGdldCBjb25mdXNlZC4gTG9jayBvcmRlciAtIHR0eS0+dGVybWlvc19tdXRleCBiZWZvcmUKICAqCWNvbnNvbGUgc2VtCiAgKi8KIApAQCAtMjg3OSwyNSArMjkwNSwyOCBAQAogICoJbGVhZGVyIHRvIHNldCB0aGlzIHR0eSBhcyB0aGUgY29udHJvbGxpbmcgdHR5IGZvciB0aGUgc2Vzc2lvbi4KICAqCiAgKglMb2NraW5nOgotICoJCVRha2VzIHRhc2tsaXN0IGxvY2sgaW50ZXJuYWxseSB0byB3YWxrIHNlc3Npb25zCi0gKgkJVGFrZXMgdGFza19sb2NrKCkgd2hlbiB1cGRhdGluZyBzaWduYWwtPnR0eQogICoJCVRha2VzIHR0eV9tdXRleCgpIHRvIHByb3RlY3QgdHR5IGluc3RhbmNlCi0gKgorICoJCVRha2VzIHRhc2tsaXN0X2xvY2sgaW50ZXJuYWxseSB0byB3YWxrIHNlc3Npb25zCisgKgkJVGFrZXMgLT5zaWdsb2NrKCkgd2hlbiB1cGRhdGluZyBzaWduYWwtPnR0eQogICovCiAKIHN0YXRpYyBpbnQgdGlvY3NjdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBhcmcpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCisJaW50IHJldCA9IDA7CiAJaWYgKGN1cnJlbnQtPnNpZ25hbC0+bGVhZGVyICYmCi0JICAgIChjdXJyZW50LT5zaWduYWwtPnNlc3Npb24gPT0gdHR5LT5zZXNzaW9uKSkKLQkJcmV0dXJuIDA7CisJCQkocHJvY2Vzc19zZXNzaW9uKGN1cnJlbnQpID09IHR0eS0+c2Vzc2lvbikpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwogCS8qCiAJICogVGhlIHByb2Nlc3MgbXVzdCBiZSBhIHNlc3Npb24gbGVhZGVyIGFuZAogCSAqIG5vdCBoYXZlIGEgY29udHJvbGxpbmcgdHR5IGFscmVhZHkuCiAJICovCi0JaWYgKCFjdXJyZW50LT5zaWduYWwtPmxlYWRlciB8fCBjdXJyZW50LT5zaWduYWwtPnR0eSkKLQkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoIWN1cnJlbnQtPnNpZ25hbC0+bGVhZGVyIHx8IGN1cnJlbnQtPnNpZ25hbC0+dHR5KSB7CisJCXJldCA9IC1FUEVSTTsKKwkJZ290byB1bmxvY2s7CisJfQorCiAJaWYgKHR0eS0+c2Vzc2lvbiA+IDApIHsKIAkJLyoKIAkJICogVGhpcyB0dHkgaXMgYWxyZWFkeSB0aGUgY29udHJvbGxpbmcKQEAgLTI5MDcsMjQgKzI5MzYsMTggQEAKIAkJCS8qCiAJCQkgKiBTdGVhbCBpdCBhd2F5CiAJCQkgKi8KLQogCQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJCWRvX2VhY2hfdGFza19waWQodHR5LT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgewotCQkJCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKLQkJCX0gd2hpbGVfZWFjaF90YXNrX3BpZCh0dHktPnNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKKwkJCXNlc3Npb25fY2xlYXJfdHR5KHR0eS0+c2Vzc2lvbik7CiAJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FUEVSTTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CiAJfQotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JdGFza19sb2NrKGN1cnJlbnQpOwotCWN1cnJlbnQtPnNpZ25hbC0+dHR5ID0gdHR5OwotCXRhc2tfdW5sb2NrKGN1cnJlbnQpOworCXByb2Nfc2V0X3R0eShjdXJyZW50LCB0dHkpOwordW5sb2NrOgogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQljdXJyZW50LT5zaWduYWwtPnR0eV9vbGRfcGdycCA9IDA7Ci0JdHR5LT5zZXNzaW9uID0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uOwotCXR0eS0+cGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0yOTM2LDcgKzI5NTksNyBAQAogICoJT2J0YWluIHRoZSBwcm9jZXNzIGdyb3VwIG9mIHRoZSB0dHkuIElmIHRoZXJlIGlzIG5vIHByb2Nlc3MgZ3JvdXAKICAqCXJldHVybiBhbiBlcnJvci4KICAqCi0gKglMb2NraW5nOiBub25lLiBSZWZlcmVuY2UgdG8gLT5zaWduYWwtPnR0eSBpcyBzYWZlLgorICoJTG9ja2luZzogbm9uZS4gUmVmZXJlbmNlIHRvIGN1cnJlbnQtPnNpZ25hbC0+dHR5IGlzIHNhZmUuCiAgKi8KIAogc3RhdGljIGludCB0aW9jZ3BncnAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnJlYWxfdHR5LCBwaWRfdCBfX3VzZXIgKnApCkBAIC0yOTczLDEzICsyOTk2LDEzIEBACiAJCXJldHVybiByZXR2YWw7CiAJaWYgKCFjdXJyZW50LT5zaWduYWwtPnR0eSB8fAogCSAgICAoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gcmVhbF90dHkpIHx8Ci0JICAgIChyZWFsX3R0eS0+c2Vzc2lvbiAhPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb24pKQorCSAgICAocmVhbF90dHktPnNlc3Npb24gIT0gcHJvY2Vzc19zZXNzaW9uKGN1cnJlbnQpKSkKIAkJcmV0dXJuIC1FTk9UVFk7CiAJaWYgKGdldF91c2VyKHBncnAsIHApKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAocGdycCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChzZXNzaW9uX29mX3BncnAocGdycCkgIT0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uKQorCWlmIChzZXNzaW9uX29mX3BncnAocGdycCkgIT0gcHJvY2Vzc19zZXNzaW9uKGN1cnJlbnQpKQogCQlyZXR1cm4gLUVQRVJNOwogCXJlYWxfdHR5LT5wZ3JwID0gcGdycDsKIAlyZXR1cm4gMDsKQEAgLTI5OTQsNyArMzAxNyw3IEBACiAgKglPYnRhaW4gdGhlIHNlc3Npb24gaWQgb2YgdGhlIHR0eS4gSWYgdGhlcmUgaXMgbm8gc2Vzc2lvbgogICoJcmV0dXJuIGFuIGVycm9yLgogICoKLSAqCUxvY2tpbmc6IG5vbmUuIFJlZmVyZW5jZSB0byAtPnNpZ25hbC0+dHR5IGlzIHNhZmUuCisgKglMb2NraW5nOiBub25lLiBSZWZlcmVuY2UgdG8gY3VycmVudC0+c2lnbmFsLT50dHkgaXMgc2FmZS4KICAqLwogCiBzdGF0aWMgaW50IHRpb2Nnc2lkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfc3RydWN0ICpyZWFsX3R0eSwgcGlkX3QgX191c2VyICpwKQpAQCAtMzIxMywxNCArMzIzNiwxMSBAQAogCQkJY2xlYXJfYml0KFRUWV9FWENMVVNJVkUsICZ0dHktPmZsYWdzKTsKIAkJCXJldHVybiAwOwogCQljYXNlIFRJT0NOT1RUWToKLQkJCS8qIEZJWE1FOiB0YWtzIGxvY2sgb3IgdHR5X211dGV4ID8gKi8KIAkJCWlmIChjdXJyZW50LT5zaWduYWwtPnR0eSAhPSB0dHkpCiAJCQkJcmV0dXJuIC1FTk9UVFk7CiAJCQlpZiAoY3VycmVudC0+c2lnbmFsLT5sZWFkZXIpCiAJCQkJZGlzYXNzb2NpYXRlX2N0dHkoMCk7Ci0JCQl0YXNrX2xvY2soY3VycmVudCk7Ci0JCQljdXJyZW50LT5zaWduYWwtPnR0eSA9IE5VTEw7Ci0JCQl0YXNrX3VubG9jayhjdXJyZW50KTsKKwkJCXByb2NfY2xlYXJfdHR5KGN1cnJlbnQpOwogCQkJcmV0dXJuIDA7CiAJCWNhc2UgVElPQ1NDVFRZOgogCQkJcmV0dXJuIHRpb2NzY3R0eSh0dHksIGFyZyk7CkBAIC0zMzA0LDI4ICszMzI0LDI0IEBACiAgKiBOYXN0eSBidWc6IGRvX1NBSyBpcyBiZWluZyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuICBUaGlzIGNhbgogICogZGVhZGxvY2suICBXZSBwdW50IGl0IHVwIHRvIHByb2Nlc3MgY29udGV4dC4gIEFLUE0gLSAxNk1hcjIwMDEKICAqLwotc3RhdGljIHZvaWQgX19kb19TQUsodm9pZCAqYXJnKQorc3RhdGljIHZvaWQgX19kb19TQUsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHR0eV9zdHJ1Y3QsIFNBS193b3JrKTsKICNpZmRlZiBUVFlfU09GVF9TQUsKIAl0dHlfaGFuZ3VwKHR0eSk7CiAjZWxzZQotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBhcmc7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKIAlpbnQgc2Vzc2lvbjsKIAlpbnQJCWk7CiAJc3RydWN0IGZpbGUJKmZpbHA7Ci0Jc3RydWN0IHR0eV9sZGlzYyAqZGlzYzsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCQogCWlmICghdHR5KQogCQlyZXR1cm47Ci0Jc2Vzc2lvbiAgPSB0dHktPnNlc3Npb247CisJc2Vzc2lvbiA9IHR0eS0+c2Vzc2lvbjsKIAkKLQkvKiBXZSBkb24ndCB3YW50IGFuIGxkaXNjIHN3aXRjaCBkdXJpbmcgdGhpcyAqLwotCWRpc2MgPSB0dHlfbGRpc2NfcmVmKHR0eSk7Ci0JaWYgKGRpc2MgJiYgZGlzYy0+Zmx1c2hfYnVmZmVyKQotCQlkaXNjLT5mbHVzaF9idWZmZXIodHR5KTsKLQl0dHlfbGRpc2NfZGVyZWYoZGlzYyk7CisJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CiAKIAlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKIAkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwpAQCAtMzMzNCw3ICszMzUwLDcgQEAKIAkvKiBLaWxsIHRoZSBlbnRpcmUgc2Vzc2lvbiAqLwogCWRvX2VhY2hfdGFza19waWQoc2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJTQUs6IGtpbGxlZCBwcm9jZXNzICVkIgotCQkJIiAoJXMpOiBwLT5zaWduYWwtPnNlc3Npb249PXR0eS0+c2Vzc2lvblxuIiwKKwkJCSIgKCVzKTogcHJvY2Vzc19zZXNzaW9uKHApPT10dHktPnNlc3Npb25cbiIsCiAJCQlwLT5waWQsIHAtPmNvbW0pOwogCQlzZW5kX3NpZyhTSUdLSUxMLCBwLCAxKTsKIAl9IHdoaWxlX2VhY2hfdGFza19waWQoc2Vzc2lvbiwgUElEVFlQRV9TSUQsIHApOwpAQCAtMzM0NCw3ICszMzYwLDcgQEAKIAlkb19lYWNoX3RocmVhZChnLCBwKSB7CiAJCWlmIChwLT5zaWduYWwtPnR0eSA9PSB0dHkpIHsKIAkJCXByaW50ayhLRVJOX05PVElDRSAiU0FLOiBraWxsZWQgcHJvY2VzcyAlZCIKLQkJCSAgICAiICglcyk6IHAtPnNpZ25hbC0+c2Vzc2lvbj09dHR5LT5zZXNzaW9uXG4iLAorCQkJICAgICIgKCVzKTogcHJvY2Vzc19zZXNzaW9uKHApPT10dHktPnNlc3Npb25cbiIsCiAJCQkgICAgcC0+cGlkLCBwLT5jb21tKTsKIAkJCXNlbmRfc2lnKFNJR0tJTEwsIHAsIDEpOwogCQkJY29udGludWU7CkBAIC0zMzg4LDcgKzM0MDQsNyBAQAogewogCWlmICghdHR5KQogCQlyZXR1cm47Ci0JUFJFUEFSRV9XT1JLKCZ0dHktPlNBS193b3JrLCBfX2RvX1NBSywgdHR5KTsKKwlQUkVQQVJFX1dPUksoJnR0eS0+U0FLX3dvcmssIF9fZG9fU0FLKTsKIAlzY2hlZHVsZV93b3JrKCZ0dHktPlNBS193b3JrKTsKIH0KIApAQCAtMzM5Niw3ICszNDEyLDcgQEAKIAogLyoqCiAgKglmbHVzaF90b19sZGlzYwotICoJQHByaXZhdGVfOiB0dHkgc3RydWN0dXJlIHBhc3NlZCBmcm9tIHdvcmsgcXVldWUuCisgKglAd29yazogdHR5IHN0cnVjdHVyZSBwYXNzZWQgZnJvbSB3b3JrIHF1ZXVlLgogICoKICAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgb3V0IG9mIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gZmx1c2ggZGF0YQogICoJZnJvbSB0aGUgYnVmZmVyIGNoYWluIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUuCkBAIC0zNDA2LDkgKzM0MjIsMTAgQEAKICAqCXJlY2VpdmVfYnVmIG1ldGhvZCBpcyBzaW5nbGUgdGhyZWFkZWQgZm9yIGVhY2ggdHR5IGluc3RhbmNlLgogICovCiAgCi1zdGF0aWMgdm9pZCBmbHVzaF90b19sZGlzYyh2b2lkICpwcml2YXRlXykKK3N0YXRpYyB2b2lkIGZsdXNoX3RvX2xkaXNjKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopIHByaXZhdGVfOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHR0eV9zdHJ1Y3QsIGJ1Zi53b3JrLndvcmspOwogCXVuc2lnbmVkIGxvbmcgCWZsYWdzOwogCXN0cnVjdCB0dHlfbGRpc2MgKmRpc2M7CiAJc3RydWN0IHR0eV9idWZmZXIgKnRidWYsICpoZWFkOwpAQCAtMzQ1Myw4NCArMzQ3MCw2IEBACiAJdHR5X2xkaXNjX2RlcmVmKGRpc2MpOwogfQogCi0vKgotICogUm91dGluZSB3aGljaCByZXR1cm5zIHRoZSBiYXVkIHJhdGUgb2YgdGhlIHR0eQotICoKLSAqIE5vdGUgdGhhdCB0aGUgYmF1ZF90YWJsZSBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUKLSAqIGluY2x1ZGUvYXNtL3Rlcm1iaXRzLmggZmlsZS4KLSAqLwotc3RhdGljIGludCBiYXVkX3RhYmxlW10gPSB7Ci0JMCwgNTAsIDc1LCAxMTAsIDEzNCwgMTUwLCAyMDAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAyNDAwLCA0ODAwLAotCTk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsCi0jaWZkZWYgX19zcGFyY19fCi0JNzY4MDAsIDE1MzYwMCwgMzA3MjAwLCA2MTQ0MDAsIDkyMTYwMAotI2Vsc2UKLQk1MDAwMDAsIDU3NjAwMCwgOTIxNjAwLCAxMDAwMDAwLCAxMTUyMDAwLCAxNTAwMDAwLCAyMDAwMDAwLAotCTI1MDAwMDAsIDMwMDAwMDAsIDM1MDAwMDAsIDQwMDAwMDAKLSNlbmRpZgotfTsKLQotc3RhdGljIGludCBuX2JhdWRfdGFibGUgPSBBUlJBWV9TSVpFKGJhdWRfdGFibGUpOwotCi0vKioKLSAqCXR0eV90ZXJtaW9zX2JhdWRfcmF0ZQotICoJQHRlcm1pb3M6IHRlcm1pb3Mgc3RydWN0dXJlCi0gKgotICoJQ29udmVydCB0ZXJtaW9zIGJhdWQgcmF0ZSBkYXRhIGludG8gYSBzcGVlZC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkCi0gKgl3aXRoIHRoZSB0ZXJtaW9zIGxvY2sgaGVsZCBpZiB0aGlzIHRlcm1pb3MgaXMgYSB0ZXJtaW5hbCB0ZXJtaW9zCi0gKglzdHJ1Y3R1cmUuIE1heSBjaGFuZ2UgdGhlIHRlcm1pb3MgZGF0YS4KLSAqCi0gKglMb2NraW5nOiBub25lCi0gKi8KLSAKLWludCB0dHlfdGVybWlvc19iYXVkX3JhdGUoc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MpCi17Ci0JdW5zaWduZWQgaW50IGNiYXVkOwotCQotCWNiYXVkID0gdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEOwotCi0JaWYgKGNiYXVkICYgQ0JBVURFWCkgewotCQljYmF1ZCAmPSB+Q0JBVURFWDsKLQotCQlpZiAoY2JhdWQgPCAxIHx8IGNiYXVkICsgMTUgPiBuX2JhdWRfdGFibGUpCi0JCQl0ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVREVYOwotCQllbHNlCi0JCQljYmF1ZCArPSAxNTsKLQl9Ci0JcmV0dXJuIGJhdWRfdGFibGVbY2JhdWRdOwotfQotCi1FWFBPUlRfU1lNQk9MKHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSk7Ci0KLS8qKgotICoJdHR5X2dldF9iYXVkX3JhdGUJLQlnZXQgdHR5IGJpdCByYXRlcwotICoJQHR0eTogdHR5IHRvIHF1ZXJ5Ci0gKgotICoJUmV0dXJucyB0aGUgYmF1ZCByYXRlIGFzIGFuIGludGVnZXIgZm9yIHRoaXMgdGVybWluYWwuIFRoZQotICoJdGVybWlvcyBsb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyIGFuZCB0aGUgdGVybWluYWwgYml0Ci0gKglmbGFncyBtYXkgYmUgdXBkYXRlZC4KLSAqCi0gKglMb2NraW5nOiBub25lCi0gKi8KLSAKLWludCB0dHlfZ2V0X2JhdWRfcmF0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCWludCBiYXVkID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHR0eS0+dGVybWlvcyk7Ci0KLQlpZiAoYmF1ZCA9PSAzODQwMCAmJiB0dHktPmFsdF9zcGVlZCkgewotCQlpZiAoIXR0eS0+d2FybmVkKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJVc2Ugb2Ygc2V0c2VyaWFsL3NldHJvY2tldCB0byAiCi0JCQkJCSAgICAic2V0IFNQRF8qIGZsYWdzIGlzIGRlcHJlY2F0ZWRcbiIpOwotCQkJdHR5LT53YXJuZWQgPSAxOwotCQl9Ci0JCWJhdWQgPSB0dHktPmFsdF9zcGVlZDsKLQl9Ci0JCi0JcmV0dXJuIGJhdWQ7Ci19Ci0KLUVYUE9SVF9TWU1CT0wodHR5X2dldF9iYXVkX3JhdGUpOwotCiAvKioKICAqCXR0eV9mbGlwX2J1ZmZlcl9wdXNoCS0JdGVybWluYWwKICAqCUB0dHk6IHR0eSB0byBwdXNoCkBAIC0zNTUzLDcgKzM0OTIsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKIAogCWlmICh0dHktPmxvd19sYXRlbmN5KQotCQlmbHVzaF90b19sZGlzYygodm9pZCAqKSB0dHkpOworCQlmbHVzaF90b19sZGlzYygmdHR5LT5idWYud29yay53b3JrKTsKIAllbHNlCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yaywgMSk7CiB9CkBAIC0zNTgwLDE3ICszNTE5LDE3IEBACiAJdHR5LT5vdmVycnVuX3RpbWUgPSBqaWZmaWVzOwogCXR0eS0+YnVmLmhlYWQgPSB0dHktPmJ1Zi50YWlsID0gTlVMTDsKIAl0dHlfYnVmZmVyX2luaXQodHR5KTsKLQlJTklUX1dPUksoJnR0eS0+YnVmLndvcmssIGZsdXNoX3RvX2xkaXNjLCB0dHkpOworCUlOSVRfREVMQVlFRF9XT1JLKCZ0dHktPmJ1Zi53b3JrLCBmbHVzaF90b19sZGlzYyk7CiAJaW5pdF9NVVRFWCgmdHR5LT5idWYucHR5X3NlbSk7CiAJbXV0ZXhfaW5pdCgmdHR5LT50ZXJtaW9zX211dGV4KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0dHktPndyaXRlX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR0eS0+cmVhZF93YWl0KTsKLQlJTklUX1dPUksoJnR0eS0+aGFuZ3VwX3dvcmssIGRvX3R0eV9oYW5ndXAsIHR0eSk7CisJSU5JVF9XT1JLKCZ0dHktPmhhbmd1cF93b3JrLCBkb190dHlfaGFuZ3VwKTsKIAltdXRleF9pbml0KCZ0dHktPmF0b21pY19yZWFkX2xvY2spOwogCW11dGV4X2luaXQoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZ0dHktPnJlYWRfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnR0eS0+dHR5X2ZpbGVzKTsKLQlJTklUX1dPUksoJnR0eS0+U0FLX3dvcmssIE5VTEwsIE5VTEwpOworCUlOSVRfV09SSygmdHR5LT5TQUtfd29yaywgTlVMTCk7CiB9CiAKIC8qCkBAIC0zNjEyLDcgKzM1NTEsOCBAQAogICoJCVRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGlmIHRoZXJlIGlzIG5vIGtub3duIHN0cnVjdCBkZXZpY2UKICAqCQlmb3IgdGhpcyB0dHkgZGV2aWNlIGl0IGNhbiBiZSBzZXQgdG8gTlVMTCBzYWZlbHkuCiAgKgotICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzIGRldmljZSAob3IgRVJSX1BUUigtRUZPTykgb24gZXJyb3IpLgorICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkZXZpY2UgZm9yIHRoaXMgdHR5IGRldmljZQorICoJKG9yIEVSUl9QVFIoLUVGT08pIG9uIGVycm9yKS4KICAqCiAgKglUaGlzIGNhbGwgaXMgcmVxdWlyZWQgdG8gYmUgbWFkZSB0byByZWdpc3RlciBhbiBpbmRpdmlkdWFsIHR0eSBkZXZpY2UKICAqCWlmIHRoZSB0dHkgZHJpdmVyJ3MgZmxhZ3MgaGF2ZSB0aGUgVFRZX0RSSVZFUl9EWU5BTUlDX0RFViBiaXQgc2V0LiAgSWYKQEAgLTM2MjIsOCArMzU2Miw4IEBACiAgKglMb2NraW5nOiA/PwogICovCiAKLXN0cnVjdCBjbGFzc19kZXZpY2UgKnR0eV9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwKLQkJCQkJIHVuc2lnbmVkIGluZGV4LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdHJ1Y3QgZGV2aWNlICp0dHlfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHVuc2lnbmVkIGluZGV4LAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAljaGFyIG5hbWVbNjRdOwogCWRldl90IGRldiA9IE1LREVWKGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3Jfc3RhcnQpICsgaW5kZXg7CkBAIC0zNjM5LDcgKzM1NzksNyBAQAogCWVsc2UKIAkJdHR5X2xpbmVfbmFtZShkcml2ZXIsIGluZGV4LCBuYW1lKTsKIAotCXJldHVybiBjbGFzc19kZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgZGV2LCBkZXZpY2UsICIlcyIsIG5hbWUpOworCXJldHVybiBkZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgZGV2aWNlLCBkZXYsIG5hbWUpOwogfQogCiAvKioKQEAgLTM2NTUsNyArMzU5NSw3IEBACiAKIHZvaWQgdHR5X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHVuc2lnbmVkIGluZGV4KQogewotCWNsYXNzX2RldmljZV9kZXN0cm95KHR0eV9jbGFzcywgTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCkgKyBpbmRleCk7CisJZGV2aWNlX2Rlc3Ryb3kodHR5X2NsYXNzLCBNS0RFVihkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yX3N0YXJ0KSArIGluZGV4KTsKIH0KIAogRVhQT1JUX1NZTUJPTCh0dHlfcmVnaXN0ZXJfZGV2aWNlKTsKQEAgLTM3NTIsOCArMzY5Miw4IEBACiAKIAlpZiAocCkgewogCQlkcml2ZXItPnR0eXMgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKiopcDsKLQkJZHJpdmVyLT50ZXJtaW9zID0gKHN0cnVjdCB0ZXJtaW9zICoqKShwICsgZHJpdmVyLT5udW0pOwotCQlkcml2ZXItPnRlcm1pb3NfbG9ja2VkID0gKHN0cnVjdCB0ZXJtaW9zICoqKShwICsgZHJpdmVyLT5udW0gKiAyKTsKKwkJZHJpdmVyLT50ZXJtaW9zID0gKHN0cnVjdCBrdGVybWlvcyAqKikocCArIGRyaXZlci0+bnVtKTsKKwkJZHJpdmVyLT50ZXJtaW9zX2xvY2tlZCA9IChzdHJ1Y3Qga3Rlcm1pb3MgKiopKHAgKyBkcml2ZXItPm51bSAqIDIpOwogCX0gZWxzZSB7CiAJCWRyaXZlci0+dHR5cyA9IE5VTEw7CiAJCWRyaXZlci0+dGVybWlvcyA9IE5VTEw7CkBAIC0zNzkyLDcgKzM3MzIsNyBAQAogaW50IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyKQogewogCWludCBpOwotCXN0cnVjdCB0ZXJtaW9zICp0cDsKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRwOwogCXZvaWQgKnA7CiAKIAlpZiAoZHJpdmVyLT5yZWZjb3VudCkKQEAgLTM4MzAsOSArMzc3MCw1MyBAQAogCWNkZXZfZGVsKCZkcml2ZXItPmNkZXYpOwogCXJldHVybiAwOwogfQotCiBFWFBPUlRfU1lNQk9MKHR0eV91bnJlZ2lzdGVyX2RyaXZlcik7CiAKK2Rldl90IHR0eV9kZXZudW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gTUtERVYodHR5LT5kcml2ZXItPm1ham9yLCB0dHktPmRyaXZlci0+bWlub3Jfc3RhcnQpICsgdHR5LT5pbmRleDsKK30KK0VYUE9SVF9TWU1CT0wodHR5X2Rldm51bSk7CisKK3ZvaWQgcHJvY19jbGVhcl90dHkoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXNwaW5fbG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXAtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQorRVhQT1JUX1NZTUJPTChwcm9jX2NsZWFyX3R0eSk7CisKK3ZvaWQgX19wcm9jX3NldF90dHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaWYgKHR0eSkgeworCQl0dHktPnNlc3Npb24gPSBwcm9jZXNzX3Nlc3Npb24odHNrKTsKKwkJdHR5LT5wZ3JwID0gcHJvY2Vzc19ncm91cCh0c2spOworCX0KKwl0c2stPnNpZ25hbC0+dHR5ID0gdHR5OworCXRzay0+c2lnbmFsLT50dHlfb2xkX3BncnAgPSAwOworfQorCit2b2lkIHByb2Nfc2V0X3R0eShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCV9fcHJvY19zZXRfdHR5KHRzaywgdHR5KTsKKwlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7Cit9CisKK3N0cnVjdCB0dHlfc3RydWN0ICpnZXRfY3VycmVudF90dHkodm9pZCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCVdBUk5fT05fT05DRSghbXV0ZXhfaXNfbG9ja2VkKCZ0dHlfbXV0ZXgpKTsKKwl0dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsKKwkvKgorCSAqIHNlc3Npb24tPnR0eSBjYW4gYmUgY2hhbmdlZC9jbGVhcmVkIGZyb20gdW5kZXIgdXMsIG1ha2Ugc3VyZSB3ZQorCSAqIGlzc3VlIHRoZSBsb2FkLiBUaGUgb2J0YWluZWQgcG9pbnRlciwgd2hlbiBub3QgTlVMTCwgaXMgdmFsaWQgYXMKKwkgKiBsb25nIGFzIHdlIGhvbGQgdHR5X211dGV4LgorCSAqLworCWJhcnJpZXIoKTsKKwlyZXR1cm4gdHR5OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2N1cnJlbnRfdHR5KTsKIAogLyoKICAqIEluaXRpYWxpemUgdGhlIGNvbnNvbGUgZGV2aWNlLiBUaGlzIGlzIGNhbGxlZCAqZWFybHkqLCBzbwpAQCAtMzg5NSwyMCArMzg3OSwyMCBAQAogCWlmIChjZGV2X2FkZCgmdHR5X2NkZXYsIE1LREVWKFRUWUFVWF9NQUpPUiwgMCksIDEpIHx8CiAJICAgIHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgMSwgIi9kZXYvdHR5IikgPCAwKQogCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgL2Rldi90dHkgZHJpdmVyXG4iKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgTlVMTCwgInR0eSIpOworCWRldmljZV9jcmVhdGUodHR5X2NsYXNzLCBOVUxMLCBNS0RFVihUVFlBVVhfTUFKT1IsIDApLCAidHR5Iik7CiAKIAljZGV2X2luaXQoJmNvbnNvbGVfY2RldiwgJmNvbnNvbGVfZm9wcyk7CiAJaWYgKGNkZXZfYWRkKCZjb25zb2xlX2NkZXYsIE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIDEpIHx8CiAJICAgIHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoVFRZQVVYX01BSk9SLCAxKSwgMSwgIi9kZXYvY29uc29sZSIpIDwgMCkKIAkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIC9kZXYvY29uc29sZSBkcml2ZXJcbiIpOwotCWNsYXNzX2RldmljZV9jcmVhdGUodHR5X2NsYXNzLCBOVUxMLCBNS0RFVihUVFlBVVhfTUFKT1IsIDEpLCBOVUxMLCAiY29uc29sZSIpOworCWRldmljZV9jcmVhdGUodHR5X2NsYXNzLCBOVUxMLCBNS0RFVihUVFlBVVhfTUFKT1IsIDEpLCAiY29uc29sZSIpOwogCiAjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCiAJY2Rldl9pbml0KCZwdG14X2NkZXYsICZwdG14X2ZvcHMpOwogCWlmIChjZGV2X2FkZCgmcHRteF9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDIpLCAxKSB8fAogCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWUFVWF9NQUpPUiwgMiksIDEsICIvZGV2L3B0bXgiKSA8IDApCiAJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L3B0bXggZHJpdmVyXG4iKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZQVVYX01BSk9SLCAyKSwgTlVMTCwgInB0bXgiKTsKKwlkZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZQVVYX01BSk9SLCAyKSwgInB0bXgiKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1ZUCkBAIC0zOTE2LDcgKzM5MDAsNyBAQAogCWlmIChjZGV2X2FkZCgmdmMwX2NkZXYsIE1LREVWKFRUWV9NQUpPUiwgMCksIDEpIHx8CiAJICAgIHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoVFRZX01BSk9SLCAwKSwgMSwgIi9kZXYvdmMvMCIpIDwgMCkKIAkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIC9kZXYvdHR5MCBkcml2ZXJcbiIpOwotCWNsYXNzX2RldmljZV9jcmVhdGUodHR5X2NsYXNzLCBOVUxMLCBNS0RFVihUVFlfTUFKT1IsIDApLCBOVUxMLCAidHR5MCIpOworCWRldmljZV9jcmVhdGUodHR5X2NsYXNzLCBOVUxMLCBNS0RFVihUVFlfTUFKT1IsIDApLCAidHR5MCIpOwogCiAJdnR5X2luaXQoKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCmluZGV4IDNiNmZhN2IuLmRlZTQ3ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNkZWZpbmUgVEVSTUlPU19GTFVTSAkxCiAjZGVmaW5lIFRFUk1JT1NfV0FJVAkyCiAjZGVmaW5lIFRFUk1JT1NfVEVSTUlPCTQKKyNkZWZpbmUgVEVSTUlPU19PTEQJOAogCiAKIC8qKgpAQCAtODQsOSArODUsOSBAQAogCiBFWFBPUlRfU1lNQk9MKHR0eV93YWl0X3VudGlsX3NlbnQpOwogCi1zdGF0aWMgdm9pZCB1bnNldF9sb2NrZWRfdGVybWlvcyhzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJCQkgc3RydWN0IHRlcm1pb3MgKm9sZCwKLQkJCQkgc3RydWN0IHRlcm1pb3MgKmxvY2tlZCkKK3N0YXRpYyB2b2lkIHVuc2V0X2xvY2tlZF90ZXJtaW9zKHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCQkgc3RydWN0IGt0ZXJtaW9zICpvbGQsCisJCQkJIHN0cnVjdCBrdGVybWlvcyAqbG9ja2VkKQogewogCWludAlpOwogCQpAQCAtMTA1LDggKzEwNiwyMDQgQEAKIAlmb3IgKGk9MDsgaSA8IE5DQ1M7IGkrKykKIAkJdGVybWlvcy0+Y19jY1tpXSA9IGxvY2tlZC0+Y19jY1tpXSA/CiAJCQlvbGQtPmNfY2NbaV0gOiB0ZXJtaW9zLT5jX2NjW2ldOworCS8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbyBmb3IgaS9vc3BlZWQgKi8KIH0KIAorLyoKKyAqIFJvdXRpbmUgd2hpY2ggcmV0dXJucyB0aGUgYmF1ZCByYXRlIG9mIHRoZSB0dHkKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGJhdWRfdGFibGUgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlCisgKiBpbmNsdWRlL2FzbS90ZXJtYml0cy5oIGZpbGUuCisgKi8KK3N0YXRpYyBjb25zdCBzcGVlZF90IGJhdWRfdGFibGVbXSA9IHsKKwkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsIDQ4MDAsCisJOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwKKyNpZmRlZiBfX3NwYXJjX18KKwk3NjgwMCwgMTUzNjAwLCAzMDcyMDAsIDYxNDQwMCwgOTIxNjAwCisjZWxzZQorCTUwMDAwMCwgNTc2MDAwLCA5MjE2MDAsIDEwMDAwMDAsIDExNTIwMDAsIDE1MDAwMDAsIDIwMDAwMDAsCisJMjUwMDAwMCwgMzAwMDAwMCwgMzUwMDAwMCwgNDAwMDAwMAorI2VuZGlmCit9OworCisjaWZuZGVmIF9fc3BhcmNfXworc3RhdGljIGNvbnN0IHRjZmxhZ190IGJhdWRfYml0c1tdID0geworCUIwLCBCNTAsIEI3NSwgQjExMCwgQjEzNCwgQjE1MCwgQjIwMCwgQjMwMCwgQjYwMCwKKwlCMTIwMCwgQjE4MDAsIEIyNDAwLCBCNDgwMCwgQjk2MDAsIEIxOTIwMCwgQjM4NDAwLAorCUI1NzYwMCwgQjExNTIwMCwgQjIzMDQwMCwgQjQ2MDgwMCwgQjUwMDAwMCwgQjU3NjAwMCwKKwlCOTIxNjAwLCBCMTAwMDAwMCwgQjExNTIwMDAsIEIxNTAwMDAwLCBCMjAwMDAwMCwgQjI1MDAwMDAsCisJQjMwMDAwMDAsIEIzNTAwMDAwLCBCNDAwMDAwMAorfTsKKyNlbHNlCitzdGF0aWMgY29uc3QgdGNmbGFnX3QgYmF1ZF9iaXRzW10gPSB7CisJQjAsIEI1MCwgQjc1LCBCMTEwLCBCMTM0LCBCMTUwLCBCMjAwLCBCMzAwLCBCNjAwLAorCUIxMjAwLCBCMTgwMCwgQjI0MDAsIEI0ODAwLCBCOTYwMCwgQjE5MjAwLCBCMzg0MDAsCisJQjU3NjAwLCBCMTE1MjAwLCBCMjMwNDAwLCBCNDYwODAwLCBCNzY4MDAsIEIxNTM2MDAsCisJQjMwNzIwMCwgQjYxNDQwMCwgQjkyMTYwMAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IG5fYmF1ZF90YWJsZSA9IEFSUkFZX1NJWkUoYmF1ZF90YWJsZSk7CisKKy8qKgorICoJdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlCisgKglAdGVybWlvczogdGVybWlvcyBzdHJ1Y3R1cmUKKyAqCisgKglDb252ZXJ0IHRlcm1pb3MgYmF1ZCByYXRlIGRhdGEgaW50byBhIHNwZWVkLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQKKyAqCXdpdGggdGhlIHRlcm1pb3MgbG9jayBoZWxkIGlmIHRoaXMgdGVybWlvcyBpcyBhIHRlcm1pbmFsIHRlcm1pb3MKKyAqCXN0cnVjdHVyZS4gTWF5IGNoYW5nZSB0aGUgdGVybWlvcyBkYXRhLiBEZXZpY2UgZHJpdmVycyBjYW4gY2FsbCB0aGlzCisgKglmdW5jdGlvbiBidXQgc2hvdWxkIHVzZSAtPmNfW2lvXXNwZWVkIGRpcmVjdGx5IGFzIHRoZXkgYXJlIHVwZGF0ZWQuCisgKgorICoJTG9ja2luZzogbm9uZQorICovCisKK3NwZWVkX3QgdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcykKK3sKKwl1bnNpZ25lZCBpbnQgY2JhdWQ7CisKKwljYmF1ZCA9IHRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRDsKKworI2lmZGVmIEJPVEhFUgorCS8qIE1hZ2ljIHRva2VuIGZvciBhcmJpdGFyeSBzcGVlZCB2aWEgY19pc3BlZWQvY19vc3BlZWQgKi8KKwlpZiAoY2JhdWQgPT0gQk9USEVSKQorCQlyZXR1cm4gdGVybWlvcy0+Y19vc3BlZWQ7CisjZW5kaWYKKwlpZiAoY2JhdWQgJiBDQkFVREVYKSB7CisJCWNiYXVkICY9IH5DQkFVREVYOworCisJCWlmIChjYmF1ZCA8IDEgfHwgY2JhdWQgKyAxNSA+IG5fYmF1ZF90YWJsZSkKKwkJCXRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVERVg7CisJCWVsc2UKKwkJCWNiYXVkICs9IDE1OworCX0KKwlyZXR1cm4gYmF1ZF90YWJsZVtjYmF1ZF07Cit9CisKK0VYUE9SVF9TWU1CT0wodHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKTsKKworLyoqCisgKgl0dHlfdGVybWlvc19pbnB1dF9iYXVkX3JhdGUKKyAqCUB0ZXJtaW9zOiB0ZXJtaW9zIHN0cnVjdHVyZQorICoKKyAqCUNvbnZlcnQgdGVybWlvcyBiYXVkIHJhdGUgZGF0YSBpbnRvIGEgc3BlZWQuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZAorICoJd2l0aCB0aGUgdGVybWlvcyBsb2NrIGhlbGQgaWYgdGhpcyB0ZXJtaW9zIGlzIGEgdGVybWluYWwgdGVybWlvcworICoJc3RydWN0dXJlLiBNYXkgY2hhbmdlIHRoZSB0ZXJtaW9zIGRhdGEuIERldmljZSBkcml2ZXJzIGNhbiBjYWxsIHRoaXMKKyAqCWZ1bmN0aW9uIGJ1dCBzaG91bGQgdXNlIC0+Y19baW9dc3BlZWQgZGlyZWN0bHkgYXMgdGhleSBhcmUgdXBkYXRlZC4KKyAqCisgKglMb2NraW5nOiBub25lCisgKi8KKworc3BlZWRfdCB0dHlfdGVybWlvc19pbnB1dF9iYXVkX3JhdGUoc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zKQoreworI2lmZGVmIElCU0hJRlQKKwl1bnNpZ25lZCBpbnQgY2JhdWQgPSAodGVybWlvcy0+Y19jZmxhZyA+PiBJQlNISUZUKSAmIENCQVVEOworCisJaWYgKGNiYXVkID09IEIwKQorCQlyZXR1cm4gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHRlcm1pb3MpOworCisJLyogTWFnaWMgdG9rZW4gZm9yIGFyYml0YXJ5IHNwZWVkIHZpYSBjX2lzcGVlZCovCisJaWYgKGNiYXVkID09IEJPVEhFUikKKwkJcmV0dXJuIHRlcm1pb3MtPmNfaXNwZWVkOworCisJaWYgKGNiYXVkICYgQ0JBVURFWCkgeworCQljYmF1ZCAmPSB+Q0JBVURFWDsKKworCQlpZiAoY2JhdWQgPCAxIHx8IGNiYXVkICsgMTUgPiBuX2JhdWRfdGFibGUpCisJCQl0ZXJtaW9zLT5jX2NmbGFnICY9IH4oQ0JBVURFWCA8PCBJQlNISUZUKTsKKwkJZWxzZQorCQkJY2JhdWQgKz0gMTU7CisJfQorCXJldHVybiBiYXVkX3RhYmxlW2NiYXVkXTsKKyNlbHNlCisJcmV0dXJuIHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSh0ZXJtaW9zKTsKKyNlbmRpZgorfQorCitFWFBPUlRfU1lNQk9MKHR0eV90ZXJtaW9zX2lucHV0X2JhdWRfcmF0ZSk7CisKKyNpZmRlZiBCT1RIRVIKKworLyoqCisgKgl0dHlfdGVybWlvc19lbmNvZGVfYmF1ZF9yYXRlCisgKglAdGVybWlvczogdGVybWlvcyBzdHJ1Y3R1cmUKKyAqCUBpc3BlZWQ6IGlucHV0IHNwZWVkCisgKglAb3NwZWVkOiBvdXRwdXQgc3BlZWQKKyAqCisgKglFbmNvZGUgdGhlIHNwZWVkcyBzZXQgaW50byB0aGUgcGFzc2VkIHRlcm1pb3Mgc3RydWN0dXJlLiBUaGlzIGlzCisgKgl1c2VkIGFzIGEgbGlicmFyeSBoZWxwZXIgZm9yIGRyaXZlcnMgb3MgdGhhdCB0aGV5IGNhbiByZXBvcnQgYmFjaworICoJdGhlIGFjdHVhbCBzcGVlZCBzZWxlY3RlZCB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgc3BlZWQgcmVxdWVzdGVkCisgKgorICoJRm9yIG5vdyBpbnB1dCBhbmQgb3V0cHV0IHNwZWVkIG11c3QgYWdyZWUuCisgKgorICoJTG9ja2luZzogQ2FsbGVyIHNob3VsZCBob2xkIHRlcm1pb3MgbG9jay4gVGhpcyBpcyBhbHJlYWR5IGhlbGQKKyAqCXdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGRyaXZlciB0ZXJtaW9zIGhhbmRsZXIuCisgKi8KKwordm9pZCB0dHlfdGVybWlvc19lbmNvZGVfYmF1ZF9yYXRlKHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywgc3BlZWRfdCBpYmF1ZCwgc3BlZWRfdCBvYmF1ZCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IGlmb3VuZCA9IDAsIG9mb3VuZCA9IDA7CisKKwl0ZXJtaW9zLT5jX2lzcGVlZCA9IGliYXVkOworCXRlcm1pb3MtPmNfb3NwZWVkID0gb2JhdWQ7CisKKwl0ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKKwkvKiBJZGVudGljYWwgc3BlZWQgbWVhbnMgbm8gaW5wdXQgZW5jb2RpbmcgKGllIEIwIDw8IElCU0hJRlQpKi8KKwlpZiAodGVybWlvcy0+Y19pc3BlZWQgPT0gdGVybWlvcy0+Y19vc3BlZWQpCisJCWlmb3VuZCA9IDE7CisKKwlkbyB7CisJCWlmIChvYmF1ZCA9PSBiYXVkX3RhYmxlW2ldKSB7CisJCQl0ZXJtaW9zLT5jX2NmbGFnIHw9IGJhdWRfYml0c1tpXTsKKwkJCW9mb3VuZCA9IDE7CisJCQkvKiBTbyB0aGF0IGlmIGliYXVkID09IG9iYXVkIHdlIGRvbid0IHNldCBpdCAqLworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGliYXVkID09IGJhdWRfdGFibGVbaV0pIHsKKwkJCXRlcm1pb3MtPmNfY2ZsYWcgfD0gKGJhdWRfYml0c1tpXSA8PCBJQlNISUZUKTsKKwkJCWlmb3VuZCA9IDE7CisJCX0KKwl9CisJd2hpbGUoKytpIDwgbl9iYXVkX3RhYmxlKTsKKwlpZiAoIW9mb3VuZCkKKwkJdGVybWlvcy0+Y19jZmxhZyB8PSBCT1RIRVI7CisJaWYgKCFpZm91bmQpCisJCXRlcm1pb3MtPmNfY2ZsYWcgfD0gKEJPVEhFUiA8PCBJQlNISUZUKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwodHR5X3Rlcm1pb3NfZW5jb2RlX2JhdWRfcmF0ZSk7CisKKyNlbmRpZgorCisvKioKKyAqCXR0eV9nZXRfYmF1ZF9yYXRlCS0JZ2V0IHR0eSBiaXQgcmF0ZXMKKyAqCUB0dHk6IHR0eSB0byBxdWVyeQorICoKKyAqCVJldHVybnMgdGhlIGJhdWQgcmF0ZSBhcyBhbiBpbnRlZ2VyIGZvciB0aGlzIHRlcm1pbmFsLiBUaGUKKyAqCXRlcm1pb3MgbG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlciBhbmQgdGhlIHRlcm1pbmFsIGJpdAorICoJZmxhZ3MgbWF5IGJlIHVwZGF0ZWQuCisgKgorICoJTG9ja2luZzogbm9uZQorICovCisKK3NwZWVkX3QgdHR5X2dldF9iYXVkX3JhdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzcGVlZF90IGJhdWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodHR5LT50ZXJtaW9zKTsKKworCWlmIChiYXVkID09IDM4NDAwICYmIHR0eS0+YWx0X3NwZWVkKSB7CisJCWlmICghdHR5LT53YXJuZWQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVzZSBvZiBzZXRzZXJpYWwvc2V0cm9ja2V0IHRvICIKKwkJCQkJICAgICJzZXQgU1BEXyogZmxhZ3MgaXMgZGVwcmVjYXRlZFxuIik7CisJCQl0dHktPndhcm5lZCA9IDE7CisJCX0KKwkJYmF1ZCA9IHR0eS0+YWx0X3NwZWVkOworCX0KKworCXJldHVybiBiYXVkOworfQorCitFWFBPUlRfU1lNQk9MKHR0eV9nZXRfYmF1ZF9yYXRlKTsKKwogLyoqCiAgKgljaGFuZ2VfdGVybWlvcwkJLQl1cGRhdGUgdGVybWlvcyB2YWx1ZXMKICAqCUB0dHk6IHR0eSB0byB1cGRhdGUKQEAgLTExOSwxMCArMzE2LDEwIEBACiAgKglMb2NraW5nOiB0ZXJtaW9zX3NlbQogICovCiAKLXN0YXRpYyB2b2lkIGNoYW5nZV90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG5ld190ZXJtaW9zKQorc3RhdGljIHZvaWQgY2hhbmdlX3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBrdGVybWlvcyAqIG5ld190ZXJtaW9zKQogewogCWludCBjYW5vbl9jaGFuZ2U7Ci0Jc3RydWN0IHRlcm1pb3Mgb2xkX3Rlcm1pb3MgPSAqdHR5LT50ZXJtaW9zOworCXN0cnVjdCBrdGVybWlvcyBvbGRfdGVybWlvcyA9ICp0dHktPnRlcm1pb3M7CiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAJCiAJLyoKQEAgLTE5NSwyMyArMzkyLDM5IEBACiAKIHN0YXRpYyBpbnQgc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHZvaWQgX191c2VyICphcmcsIGludCBvcHQpCiB7Ci0Jc3RydWN0IHRlcm1pb3MgdG1wX3Rlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zIHRtcF90ZXJtaW9zOwogCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwogCWludCByZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CiAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCisJbWVtY3B5KCZ0bXBfdGVybWlvcywgdHR5LT50ZXJtaW9zLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CisKIAlpZiAob3B0ICYgVEVSTUlPU19URVJNSU8pIHsKLQkJbWVtY3B5KCZ0bXBfdGVybWlvcywgdHR5LT50ZXJtaW9zLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKTsKIAkJaWYgKHVzZXJfdGVybWlvX3RvX2tlcm5lbF90ZXJtaW9zKCZ0bXBfdGVybWlvcywKIAkJCQkJCShzdHJ1Y3QgdGVybWlvIF9fdXNlciAqKWFyZykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQl9IGVsc2UgewotCQlpZiAodXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKCZ0bXBfdGVybWlvcywKKyNpZmRlZiBUQ0dFVFMyCisJfSBlbHNlIGlmIChvcHQgJiBURVJNSU9TX09MRCkgeworCQlpZiAodXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEoJnRtcF90ZXJtaW9zLAogCQkJCQkJKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlpZiAodXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKCZ0bXBfdGVybWlvcywKKwkJCQkJCShzdHJ1Y3QgdGVybWlvczIgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCX0KKyNlbHNlCisJfSBlbHNlIGlmICh1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoJnRtcF90ZXJtaW9zLAorCQkJCQkoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisjZW5kaWYKKworCS8qIElmIG9sZCBzdHlsZSBCZm9vIHZhbHVlcyBhcmUgdXNlZCB0aGVuIGxvYWQgY19pc3BlZWQvY19vc3BlZWQgd2l0aCB0aGUgcmVhbCBzcGVlZAorCSAgIHNvIGl0cyB1bmNvbmRpdGlvbmFsbHkgdXNhYmxlICovCisJdG1wX3Rlcm1pb3MuY19pc3BlZWQgPSB0dHlfdGVybWlvc19pbnB1dF9iYXVkX3JhdGUoJnRtcF90ZXJtaW9zKTsKKwl0bXBfdGVybWlvcy5jX29zcGVlZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSgmdG1wX3Rlcm1pb3MpOwogCiAJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CiAJCkBAIC0yODYsOCArNDk5LDggQEAKIAlzdHJ1Y3Qgc2d0dHliIHRtcDsKIAogCW11dGV4X2xvY2soJnR0eS0+dGVybWlvc19tdXRleCk7Ci0JdG1wLnNnX2lzcGVlZCA9IDA7Ci0JdG1wLnNnX29zcGVlZCA9IDA7CisJdG1wLnNnX2lzcGVlZCA9IHR0eS0+dGVybWlvcy0+Y19pc3BlZWQ7CisJdG1wLnNnX29zcGVlZCA9IHR0eS0+dGVybWlvcy0+Y19vc3BlZWQ7CiAJdG1wLnNnX2VyYXNlID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZFUkFTRV07CiAJdG1wLnNnX2tpbGwgPSB0dHktPnRlcm1pb3MtPmNfY2NbVktJTExdOwogCXRtcC5zZ19mbGFncyA9IGdldF9zZ2ZsYWdzKHR0eSk7CkBAIC0yOTYsNyArNTA5LDcgQEAKIAlyZXR1cm4gY29weV90b191c2VyKHNndHR5YiwgJnRtcCwgc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9zZ2ZsYWdzKHN0cnVjdCB0ZXJtaW9zICogdGVybWlvcywgaW50IGZsYWdzKQorc3RhdGljIHZvaWQgc2V0X3NnZmxhZ3Moc3RydWN0IGt0ZXJtaW9zICogdGVybWlvcywgaW50IGZsYWdzKQogewogCXRlcm1pb3MtPmNfaWZsYWcgPSBJQ1JOTCB8IElYT047CiAJdGVybWlvcy0+Y19vZmxhZyA9IDA7CkBAIC0zMzcsNyArNTUwLDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBzZ3R0eWIgdG1wOwotCXN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zIHRlcm1pb3M7CiAKIAlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CiAJaWYgKHJldHZhbCkKQEAgLTM1MSw2ICs1NjQsMTAgQEAKIAl0ZXJtaW9zLmNfY2NbVkVSQVNFXSA9IHRtcC5zZ19lcmFzZTsKIAl0ZXJtaW9zLmNfY2NbVktJTExdID0gdG1wLnNnX2tpbGw7CiAJc2V0X3NnZmxhZ3MoJnRlcm1pb3MsIHRtcC5zZ19mbGFncyk7CisJLyogVHJ5IGFuZCBlbmNvZGUgaW50byBCZm9vIGZvcm1hdCAqLworI2lmZGVmIEJPVEhFUgorCXR0eV90ZXJtaW9zX2VuY29kZV9iYXVkX3JhdGUoJnRlcm1pb3MsIHRlcm1pb3MuY19pc3BlZWQsIHRlcm1pb3MuY19vc3BlZWQpOworI2VuZGlmCiAJbXV0ZXhfdW5sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOwogCWNoYW5nZV90ZXJtaW9zKHR0eSwgJnRlcm1pb3MpOwogCXJldHVybiAwOwpAQCAtNDgxLDE2ICs2OTgsMzMgQEAKIAkJY2FzZSBUSU9DU0xUQzoKIAkJCXJldHVybiBzZXRfbHRjaGFycyhyZWFsX3R0eSwgcCk7CiAjZW5kaWYKKwkJY2FzZSBUQ1NFVFNGOgorCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCAgVEVSTUlPU19GTFVTSCB8IFRFUk1JT1NfV0FJVCB8IFRFUk1JT1NfT0xEKTsKKwkJY2FzZSBUQ1NFVFNXOgorCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX1dBSVQgfCBURVJNSU9TX09MRCk7CisJCWNhc2UgVENTRVRTOgorCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX09MRCk7CisjaWZuZGVmIFRDR0VUUzIKIAkJY2FzZSBUQ0dFVFM6CiAJCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsIHJlYWxfdHR5LT50ZXJtaW9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAwOwotCQljYXNlIFRDU0VUU0Y6CisjZWxzZQorCQljYXNlIFRDR0VUUzoKKwkJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSgoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUQ0dFVFMyOgorCQkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MyIF9fdXNlciAqKWFyZywgcmVhbF90dHktPnRlcm1pb3MpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVENTRVRTRjI6CiAJCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsICBURVJNSU9TX0ZMVVNIIHwgVEVSTUlPU19XQUlUKTsKLQkJY2FzZSBUQ1NFVFNXOgorCQljYXNlIFRDU0VUU1cyOgogCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX1dBSVQpOwotCQljYXNlIFRDU0VUUzoKKwkJY2FzZSBUQ1NFVFMyOgogCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCAwKTsKKyNlbmRpZgogCQljYXNlIFRDR0VUQToKIAkJCXJldHVybiBnZXRfdGVybWlvKHJlYWxfdHR5LCBwKTsKIAkJY2FzZSBUQ1NFVEFGOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZjX3NjcmVlbi5jIGIvZHJpdmVycy9jaGFyL3ZjX3NjcmVlbi5jCmluZGV4IGJkN2E5OGMuLjI2Nzc2NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92Y19zY3JlZW4uYworKysgYi9kcml2ZXJzL2NoYXIvdmNfc2NyZWVuLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAlpbnQgc2l6ZTsKIAogCWRvd24oJmNvbl9idWZfc2VtKTsKLQlzaXplID0gdmNzX3NpemUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXNpemUgPSB2Y3Nfc2l6ZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzd2l0Y2ggKG9yaWcpIHsKIAkJZGVmYXVsdDoKIAkJCXVwKCZjb25fYnVmX3NlbSk7CkBAIC05OCw3ICs5OCw3IEBACiBzdGF0aWMgc3NpemVfdAogdmNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAl1bnNpZ25lZCBpbnQgY3VycmNvbnMgPSBpbWlub3IoaW5vZGUpOwogCXN0cnVjdCB2Y19kYXRhICp2YzsKIAlsb25nIHBvczsKQEAgLTI3MSw3ICsyNzEsNyBAQAogc3RhdGljIHNzaXplX3QKIHZjc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXVuc2lnbmVkIGludCBjdXJyY29ucyA9IGltaW5vcihpbm9kZSk7CiAJc3RydWN0IHZjX2RhdGEgKnZjOwogCWxvbmcgcG9zOwpAQCAtNDc2LDE2ICs0NzYsMTYgQEAKIAogdm9pZCB2Y3NfbWFrZV9zeXNmcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCWNsYXNzX2RldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEpLAotCQkJTlVMTCwgInZjcyV1IiwgdHR5LT5pbmRleCArIDEpOwotCWNsYXNzX2RldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEyOSksCi0JCQlOVUxMLCAidmNzYSV1IiwgdHR5LT5pbmRleCArIDEpOworCWRldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEpLAorCQkJInZjcyV1IiwgdHR5LT5pbmRleCArIDEpOworCWRldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgdHR5LT5pbmRleCArIDEyOSksCisJCQkidmNzYSV1IiwgdHR5LT5pbmRleCArIDEpOwogfQogCiB2b2lkIHZjc19yZW1vdmVfc3lzZnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQljbGFzc19kZXZpY2VfZGVzdHJveSh2Y19jbGFzcywgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMSkpOwotCWNsYXNzX2RldmljZV9kZXN0cm95KHZjX2NsYXNzLCBNS0RFVihWQ1NfTUFKT1IsIHR0eS0+aW5kZXggKyAxMjkpKTsKKwlkZXZpY2VfZGVzdHJveSh2Y19jbGFzcywgTUtERVYoVkNTX01BSk9SLCB0dHktPmluZGV4ICsgMSkpOworCWRldmljZV9kZXN0cm95KHZjX2NsYXNzLCBNS0RFVihWQ1NfTUFKT1IsIHR0eS0+aW5kZXggKyAxMjkpKTsKIH0KIAogaW50IF9faW5pdCB2Y3NfaW5pdCh2b2lkKQpAQCAtNDk0LDcgKzQ5NCw3IEBACiAJCXBhbmljKCJ1bmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciB2Y3MgZGV2aWNlIiwgVkNTX01BSk9SKTsKIAl2Y19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInZjIik7CiAKLQljbGFzc19kZXZpY2VfY3JlYXRlKHZjX2NsYXNzLCBOVUxMLCBNS0RFVihWQ1NfTUFKT1IsIDApLCBOVUxMLCAidmNzIik7Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZSh2Y19jbGFzcywgTlVMTCwgTUtERVYoVkNTX01BSk9SLCAxMjgpLCBOVUxMLCAidmNzYSIpOworCWRldmljZV9jcmVhdGUodmNfY2xhc3MsIE5VTEwsIE1LREVWKFZDU19NQUpPUiwgMCksICJ2Y3MiKTsKKwlkZXZpY2VfY3JlYXRlKHZjX2NsYXNzLCBOVUxMLCBNS0RFVihWQ1NfTUFKT1IsIDEyOCksICJ2Y3NhIik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmlvY29ucy5jIGIvZHJpdmVycy9jaGFyL3Zpb2NvbnMuYwppbmRleCA2ZDJlMzE0Li4wZTBkYTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlvY29ucy5jCisrKyBiL2RyaXZlcnMvY2hhci92aW9jb25zLmMKQEAgLTYxLDEwICs2MSw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbnNvbGVsb2NrKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY29uc29sZWxvZ2xvY2spOwogCi0jaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCiBzdGF0aWMgaW50IHZpb19zeXNycV9wcmVzc2VkOwotZXh0ZXJuIGludCBzeXNycV9lbmFibGVkOwotI2VuZGlmCiAKICNkZWZpbmUgVklPQ0hBUl9OVU1fQlVGCQkxNgogCkBAIC05MzYsOCArOTMzLDEwIEBACiAJICovCiAJbnVtX3B1c2hlZCA9IDA7CiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY2V2ZW50LT5sZW47IGluZGV4KyspIHsKLSNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKLQkJaWYgKHN5c3JxX2VuYWJsZWQpIHsKKwkJLyoKKwkJICogV2lsbCBiZSBvcHRpbWl6ZWQgYXdheSBpZiAhQ09ORklHX01BR0lDX1NZU1JROgorCQkgKi8KKwkJaWYgKHN5c3JxX29uKCkpIHsKIAkJCS8qIDB4MGYgaXMgdGhlIGFzY2lpIGNoYXJhY3RlciBmb3IgXk8gKi8KIAkJCWlmIChjZXZlbnQtPmRhdGFbaW5kZXhdID09ICdceDBmJykgewogCQkJCXZpb19zeXNycV9wcmVzc2VkID0gMTsKQEAgLTk1Niw3ICs5NTUsNiBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9Ci0jZW5kaWYKIAkJLyoKIAkJICogVGhlIHN5c3JxIHNlcXVlbmNlIGlzbid0IGluY2x1ZGVkIGluIHRoaXMgY2hlY2sgaWYKIAkJICogc3lzcnEgaXMgZW5hYmxlZCBhbmQgY29tcGlsZWQgaW50byB0aGUga2VybmVsIGJlY2F1c2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92aW90YXBlLmMgYi9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCmluZGV4IDczYzc4YmYuLjk0ZDc5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92aW90YXBlLmMKKysrIGIvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAJaWYgKG9wID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZ2V0X2Rldl9pbmZvKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCAmZGV2aSk7CisJZ2V0X2Rldl9pbmZvKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsICZkZXZpKTsKIAogCS8qCiAJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgY2FuIHNlbmQgYSByZXF1ZXN0LiAgV2UgdXNlCkBAIC01MzIsNyArNTMyLDcgQEAKIAlpZiAob3AgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlnZXRfZGV2X2luZm8oZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZkZXZpKTsKKwlnZXRfZGV2X2luZm8oZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgJmRldmkpOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gc2VuZCBhIHJlcXVlc3QuICBXZSB1c2UKQEAgLTYxMiw3ICs2MTIsNyBAQAogCWlmIChvcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWdldF9kZXZfaW5mbyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmRldmkpOworCWdldF9kZXZfaW5mbyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCAmZGV2aSk7CiAKIAlkb3duKCZyZXFTZW0pOwogCkBAIC03NzcsNyArNzc3LDcgQEAKIAlpZiAob3AgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlnZXRfZGV2X2luZm8oZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZkZXZpKTsKKwlnZXRfZGV2X2luZm8oZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgJmRldmkpOwogCiAJLyogTm90ZTogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBvbmUgbW9kZSEgKi8KIAlpZiAoKGRldmkuZGV2bm8gPj0gdmlvdGFwZV9udW1kZXYpIHx8IChkZXZpLm1vZGUpKSB7CkBAIC04MjIsNyArODIyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJaW5pdF9jb21wbGV0aW9uKCZvcC0+Y29tKTsKIAotCWdldF9kZXZfaW5mbyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmRldmkpOworCWdldF9kZXZfaW5mbyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCAmZGV2aSk7CiAKIAlpZiAoZGV2aS5kZXZubyA+PSB2aW90YXBlX251bWRldikgewogCQlyZXQgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZtZV9zY2MuYyBiL2RyaXZlcnMvY2hhci92bWVfc2NjLmMKaW5kZXggZDBiOTRkZC4uZTAxMzE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3ZtZV9zY2MuYworKysgYi9kcml2ZXJzL2NoYXIvdm1lX3NjYy5jCkBAIC0xNTMsNiArMTUzLDggQEAKIAlzY2NfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CiAJc2NjX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQogCSAgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCXNjY19kcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDk2MDA7CisJc2NjX2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfb3NwZWVkID0gOTYwMDsKIAlzY2NfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CiAJdHR5X3NldF9vcGVyYXRpb25zKHNjY19kcml2ZXIsICZzY2Nfb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZyNDF4eF9naXUuYyBiL2RyaXZlcnMvY2hhci92cjQxeHhfZ2l1LmMKaW5kZXggOGU3OTQ5My4uYTc0NGRhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3ZyNDF4eF9naXUuYworKysgYi9kcml2ZXJzL2NoYXIvdnI0MXh4X2dpdS5jCkBAIC01MDYsNyArNTA2LDcgQEAKIAl1bnNpZ25lZCBpbnQgcGluOwogCWNoYXIgdmFsdWUgPSAnMCc7CiAKLQlwaW4gPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXBpbiA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAocGluID49IGdpdV9ucl9waW5zKQogCQlyZXR1cm4gLUVCQURGOwogCkBAIC01MzAsNyArNTMwLDcgQEAKIAljaGFyIGM7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlwaW4gPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXBpbiA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAocGluID49IGdpdV9ucl9waW5zKQogCQlyZXR1cm4gLUVCQURGOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCmluZGV4IDhlNDQxM2YuLjA2YzMyYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dC5jCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIHN0cnVjdCBjb25fZHJpdmVyIHsKIAljb25zdCBzdHJ1Y3QgY29uc3cgKmNvbjsKIAljb25zdCBjaGFyICpkZXNjOwotCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IG5vZGU7CiAJaW50IGZpcnN0OwogCWludCBsYXN0OwpAQCAtMTUyLDEwICsxNTIsMTAgQEAKIHN0YXRpYyB2b2lkIHNhdmVfY3VyKHN0cnVjdCB2Y19kYXRhICp2Yyk7CiBzdGF0aWMgdm9pZCByZXNldF90ZXJtaW5hbChzdHJ1Y3QgdmNfZGF0YSAqdmMsIGludCBkb19jbGVhcik7CiBzdGF0aWMgdm9pZCBjb25fZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBzZXRfdmVzYV9ibGFua2luZyhjaGFyIF9fdXNlciAqcCk7CitzdGF0aWMgaW50IHNldF92ZXNhX2JsYW5raW5nKGNoYXIgX191c2VyICpwKTsKIHN0YXRpYyB2b2lkIHNldF9jdXJzb3Ioc3RydWN0IHZjX2RhdGEgKnZjKTsKIHN0YXRpYyB2b2lkIGhpZGVfY3Vyc29yKHN0cnVjdCB2Y19kYXRhICp2Yyk7Ci1zdGF0aWMgdm9pZCBjb25zb2xlX2NhbGxiYWNrKHZvaWQgKmlnbm9yZWQpOworc3RhdGljIHZvaWQgY29uc29sZV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpOwogc3RhdGljIHZvaWQgYmxhbmtfc2NyZWVuX3QodW5zaWduZWQgbG9uZyBkdW1teSk7CiBzdGF0aWMgdm9pZCBzZXRfcGFsZXR0ZShzdHJ1Y3QgdmNfZGF0YSAqdmMpOwogCkBAIC0xNzQsNyArMTc0LDcgQEAKIHN0YXRpYyBpbnQgYmxhbmtpbnRlcnZhbCA9IDEwKjYwKkhaOwogc3RhdGljIGludCB2ZXNhX29mZl9pbnRlcnZhbDsKIAotc3RhdGljIERFQ0xBUkVfV09SSyhjb25zb2xlX3dvcmssIGNvbnNvbGVfY2FsbGJhY2ssIE5VTEwpOworc3RhdGljIERFQ0xBUkVfV09SSyhjb25zb2xlX3dvcmssIGNvbnNvbGVfY2FsbGJhY2spOwogCiAvKgogICogZmdfY29uc29sZSBpcyB0aGUgY3VycmVudCB2aXJ0dWFsIGNvbnNvbGUsCkBAIC03ODQsNyArNzg0LDcgQEAKIAlpZiAobmV3X2NvbHMgPT0gdmMtPnZjX2NvbHMgJiYgbmV3X3Jvd3MgPT0gdmMtPnZjX3Jvd3MpCiAJCXJldHVybiAwOwogCi0JbmV3c2NyZWVuID0gKHVuc2lnbmVkIHNob3J0ICopIGttYWxsb2MobmV3X3NjcmVlbl9zaXplLCBHRlBfVVNFUik7CisJbmV3c2NyZWVuID0ga21hbGxvYyhuZXdfc2NyZWVuX3NpemUsIEdGUF9VU0VSKTsKIAlpZiAoIW5ld3NjcmVlbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIxNTQsNyArMjE1NCw3IEBACiAgKiB3aXRoIG90aGVyIGNvbnNvbGUgY29kZSBhbmQgcHJldmVudGlvbiBvZiByZS1lbnRyYW5jeSBpcwogICogZW5zdXJlZCB3aXRoIGNvbnNvbGVfc2VtLgogICovCi1zdGF0aWMgdm9pZCBjb25zb2xlX2NhbGxiYWNrKHZvaWQgKmlnbm9yZWQpCitzdGF0aWMgdm9pZCBjb25zb2xlX2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCkKIHsKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAKQEAgLTIzNjksNyArMjM2OSw3IEBACiAJCQlyZXQgPSBfX3B1dF91c2VyKGRhdGEsIHApOwogCQkJYnJlYWs7CiAJCWNhc2UgVElPQ0xfU0VUVkVTQUJMQU5LOgotCQkJc2V0X3Zlc2FfYmxhbmtpbmcocCk7CisJCQlyZXQgPSBzZXRfdmVzYV9ibGFua2luZyhwKTsKIAkJCWJyZWFrOwogCQljYXNlIFRJT0NMX0dFVEtNU0dSRURJUkVDVDoKIAkJCWRhdGEgPSBrbXNnX3JlZGlyZWN0OwpAQCAtMzAyMywxMCArMzAyMywxMCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgKi8KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfYmluZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCitzdGF0aWMgc3NpemVfdCBzdG9yZV9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBjb25fZHJpdmVyICpjb24gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBjb25fZHJpdmVyICpjb24gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgYmluZCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CiAKIAlpZiAoYmluZCkKQEAgLTMwMzcsMTcgKzMwMzcsMTkgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfYmluZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgY29uX2RyaXZlciAqY29uID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgY29uX2RyaXZlciAqY29uID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGJpbmQgPSBjb25faXNfYm91bmQoY29uLT5jb24pOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIGJpbmQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGNvbl9kcml2ZXIgKmNvbiA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGNvbl9kcml2ZXIgKmNvbiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMgJXNcbiIsCiAJCQkoY29uLT5mbGFnICYgQ09OX0RSSVZFUl9GTEFHX01PRFVMRSkgPyAiKE0pIiA6ICIoUykiLApAQCAtMzA1NSw0MyArMzA1Nyw0MCBAQAogCiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19kZXZpY2VfYXR0cnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZpY2VfYXR0cnNbXSA9IHsKIAlfX0FUVFIoYmluZCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2JpbmQsIHN0b3JlX2JpbmQpLAogCV9fQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpLAogfTsKIAotc3RhdGljIGludCB2dGNvbnNvbGVfaW5pdF9jbGFzc19kZXZpY2Uoc3RydWN0IGNvbl9kcml2ZXIgKmNvbikKK3N0YXRpYyBpbnQgdnRjb25zb2xlX2luaXRfZGV2aWNlKHN0cnVjdCBjb25fZHJpdmVyICpjb24pCiB7CiAJaW50IGk7CiAJaW50IGVycm9yID0gMDsKIAogCWNvbi0+ZmxhZyB8PSBDT05fRFJJVkVSX0ZMQUdfQVRUUjsKLQljbGFzc19zZXRfZGV2ZGF0YShjb24tPmNsYXNzX2RldiwgY29uKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspIHsKLQkJZXJyb3IgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY29uLT5jbGFzc19kZXYsCi0JCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwlkZXZfc2V0X2RydmRhdGEoY29uLT5kZXYsIGNvbik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlX2F0dHJzKTsgaSsrKSB7CisJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGNvbi0+ZGV2LCAmZGV2aWNlX2F0dHJzW2ldKTsKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CiAJfQogCiAJaWYgKGVycm9yKSB7CiAJCXdoaWxlICgtLWkgPj0gMCkKLQkJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjb24tPmNsYXNzX2RldiwKLQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCQkJZGV2aWNlX3JlbW92ZV9maWxlKGNvbi0+ZGV2LCAmZGV2aWNlX2F0dHJzW2ldKTsKIAkJY29uLT5mbGFnICY9IH5DT05fRFJJVkVSX0ZMQUdfQVRUUjsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyB2b2lkIHZ0Y29uc29sZV9kZWluaXRfY2xhc3NfZGV2aWNlKHN0cnVjdCBjb25fZHJpdmVyICpjb24pCitzdGF0aWMgdm9pZCB2dGNvbnNvbGVfZGVpbml0X2RldmljZShzdHJ1Y3QgY29uX2RyaXZlciAqY29uKQogewogCWludCBpOwogCiAJaWYgKGNvbi0+ZmxhZyAmIENPTl9EUklWRVJfRkxBR19BVFRSKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykKLQkJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjb24tPmNsYXNzX2RldiwKLQkJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlX2F0dHJzKTsgaSsrKQorCQkJZGV2aWNlX3JlbW92ZV9maWxlKGNvbi0+ZGV2LCAmZGV2aWNlX2F0dHJzW2ldKTsKIAkJY29uLT5mbGFnICY9IH5DT05fRFJJVkVSX0ZMQUdfQVRUUjsKIAl9CiB9CkBAIC0zMTc5LDE4ICszMTc4LDE3IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnI7CiAKLQljb25fZHJpdmVyLT5jbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKHZ0Y29uc29sZV9jbGFzcywgTlVMTCwKLQkJCQkJCSAgICBNS0RFVigwLCBjb25fZHJpdmVyLT5ub2RlKSwKLQkJCQkJCSAgICBOVUxMLCAidnRjb24laSIsCi0JCQkJCQkgICAgY29uX2RyaXZlci0+bm9kZSk7CisJY29uX2RyaXZlci0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh2dGNvbnNvbGVfY2xhc3MsIE5VTEwsCisJCQkJCU1LREVWKDAsIGNvbl9kcml2ZXItPm5vZGUpLAorCQkJCQkidnRjb24laSIsIGNvbl9kcml2ZXItPm5vZGUpOwogCi0JaWYgKElTX0VSUihjb25fZHJpdmVyLT5jbGFzc19kZXYpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgY2xhc3NfZGV2aWNlIGZvciAlczsgIgorCWlmIChJU19FUlIoY29uX2RyaXZlci0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gY3JlYXRlIGRldmljZSBmb3IgJXM7ICIKIAkJICAgICAgICJlcnJubyA9ICVsZFxuIiwgY29uX2RyaXZlci0+ZGVzYywKLQkJICAgICAgIFBUUl9FUlIoY29uX2RyaXZlci0+Y2xhc3NfZGV2KSk7Ci0JCWNvbl9kcml2ZXItPmNsYXNzX2RldiA9IE5VTEw7CisJCSAgICAgICBQVFJfRVJSKGNvbl9kcml2ZXItPmRldikpOworCQljb25fZHJpdmVyLT5kZXYgPSBOVUxMOwogCX0gZWxzZSB7Ci0JCXZ0Y29uc29sZV9pbml0X2NsYXNzX2RldmljZShjb25fZHJpdmVyKTsKKwkJdnRjb25zb2xlX2luaXRfZGV2aWNlKGNvbl9kcml2ZXIpOwogCX0KIAogZXJyOgpAQCAtMzIyNiwxMiArMzIyNCwxMiBAQAogCiAJCWlmIChjb25fZHJpdmVyLT5jb24gPT0gY3N3ICYmCiAJCSAgICBjb25fZHJpdmVyLT5mbGFnICYgQ09OX0RSSVZFUl9GTEFHX01PRFVMRSkgewotCQkJdnRjb25zb2xlX2RlaW5pdF9jbGFzc19kZXZpY2UoY29uX2RyaXZlcik7Ci0JCQljbGFzc19kZXZpY2VfZGVzdHJveSh2dGNvbnNvbGVfY2xhc3MsCi0JCQkJCSAgICAgTUtERVYoMCwgY29uX2RyaXZlci0+bm9kZSkpOworCQkJdnRjb25zb2xlX2RlaW5pdF9kZXZpY2UoY29uX2RyaXZlcik7CisJCQlkZXZpY2VfZGVzdHJveSh2dGNvbnNvbGVfY2xhc3MsCisJCQkJICAgICAgIE1LREVWKDAsIGNvbl9kcml2ZXItPm5vZGUpKTsKIAkJCWNvbl9kcml2ZXItPmNvbiA9IE5VTEw7CiAJCQljb25fZHJpdmVyLT5kZXNjID0gTlVMTDsKLQkJCWNvbl9kcml2ZXItPmNsYXNzX2RldiA9IE5VTEw7CisJCQljb25fZHJpdmVyLT5kZXYgPSBOVUxMOwogCQkJY29uX2RyaXZlci0+bm9kZSA9IDA7CiAJCQljb25fZHJpdmVyLT5mbGFnID0gMDsKIAkJCWNvbl9kcml2ZXItPmZpcnN0ID0gMDsKQEAgLTMyODksMTkgKzMyODcsMTggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX0NPTl9EUklWRVI7IGkrKykgewogCQlzdHJ1Y3QgY29uX2RyaXZlciAqY29uID0gJnJlZ2lzdGVyZWRfY29uX2RyaXZlcltpXTsKIAotCQlpZiAoY29uLT5jb24gJiYgIWNvbi0+Y2xhc3NfZGV2KSB7Ci0JCQljb24tPmNsYXNzX2RldiA9Ci0JCQkJY2xhc3NfZGV2aWNlX2NyZWF0ZSh2dGNvbnNvbGVfY2xhc3MsIE5VTEwsCi0JCQkJCQkgICAgTUtERVYoMCwgY29uLT5ub2RlKSwgTlVMTCwKLQkJCQkJCSAgICAidnRjb24laSIsIGNvbi0+bm9kZSk7CisJCWlmIChjb24tPmNvbiAmJiAhY29uLT5kZXYpIHsKKwkJCWNvbi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh2dGNvbnNvbGVfY2xhc3MsIE5VTEwsCisJCQkJCQkgTUtERVYoMCwgY29uLT5ub2RlKSwKKwkJCQkJCSAidnRjb24laSIsIGNvbi0+bm9kZSk7CiAKLQkJCWlmIChJU19FUlIoY29uLT5jbGFzc19kZXYpKSB7CisJCQlpZiAoSVNfRVJSKGNvbi0+ZGV2KSkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgIgotCQkJCSAgICAgICAiY2xhc3NfZGV2aWNlIGZvciAlczsgZXJybm8gPSAlbGRcbiIsCi0JCQkJICAgICAgIGNvbi0+ZGVzYywgUFRSX0VSUihjb24tPmNsYXNzX2RldikpOwotCQkJCWNvbi0+Y2xhc3NfZGV2ID0gTlVMTDsKKwkJCQkgICAgICAgImRldmljZSBmb3IgJXM7IGVycm5vID0gJWxkXG4iLAorCQkJCSAgICAgICBjb24tPmRlc2MsIFBUUl9FUlIoY29uLT5kZXYpKTsKKwkJCQljb24tPmRldiA9IE5VTEw7CiAJCQl9IGVsc2UgewotCQkJCXZ0Y29uc29sZV9pbml0X2NsYXNzX2RldmljZShjb24pOworCQkJCXZ0Y29uc29sZV9pbml0X2RldmljZShjb24pOwogCQkJfQogCQl9CiAJfQpAQCAtMzMxNiwxMSArMzMxMywxNSBAQAogICoJU2NyZWVuIGJsYW5raW5nCiAgKi8KIAotc3RhdGljIHZvaWQgc2V0X3Zlc2FfYmxhbmtpbmcoY2hhciBfX3VzZXIgKnApCitzdGF0aWMgaW50IHNldF92ZXNhX2JsYW5raW5nKGNoYXIgX191c2VyICpwKQogewotICAgIHVuc2lnbmVkIGludCBtb2RlOwotICAgIGdldF91c2VyKG1vZGUsIHAgKyAxKTsKLSAgICB2ZXNhX2JsYW5rX21vZGUgPSAobW9kZSA8IDQpID8gbW9kZSA6IDA7CisJdW5zaWduZWQgaW50IG1vZGU7CisKKwlpZiAoZ2V0X3VzZXIobW9kZSwgcCArIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXZlc2FfYmxhbmtfbW9kZSA9IChtb2RlIDwgNCkgPyBtb2RlIDogMDsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBkb19ibGFua19zY3JlZW4oaW50IGVudGVyaW5nX2dmeCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKaW5kZXggYWM1ZDYwZS4uZGM4MzY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkJICAgICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQogCQkJCXJldHVybiAtRVBFUk07CiAKLQkJCWtleV9tYXAgPSAodXNob3J0ICopIGttYWxsb2Moc2l6ZW9mKHBsYWluX21hcCksCisJCQlrZXlfbWFwID0ga21hbGxvYyhzaXplb2YocGxhaW5fbWFwKSwKIAkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWtleV9tYXApCiAJCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0yNTksNyArMjU5LDcgQEAKIAkJICAgIHN6ID0gMjU2OwogCQkgICAgd2hpbGUgKHN6IDwgZnVuY2J1ZnNpemUgLSBmdW5jYnVmbGVmdCArIGRlbHRhKQogCQkgICAgICBzeiA8PD0gMTsKLQkJICAgIGZudyA9IChjaGFyICopIGttYWxsb2Moc3osIEdGUF9LRVJORUwpOworCQkgICAgZm53ID0ga21hbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CiAJCSAgICBpZighZm53KSB7CiAJCSAgICAgIHJldCA9IC1FTk9NRU07CiAJCSAgICAgIGdvdG8gcmV0ZXJyOwpAQCAtMTA4Nyw3ICsxMDg3LDcgQEAKIAlzd2l0Y2hfc2NyZWVuKHZjKTsKIAogCS8qCi0JICogVGhpcyBjYW4ndCBhcHBlYXIgYmVsb3cgYSBzdWNjZXNzZnVsIGtpbGxfcHJvYygpLiAgSWYgaXQgZGlkLAorCSAqIFRoaXMgY2FuJ3QgYXBwZWFyIGJlbG93IGEgc3VjY2Vzc2Z1bCBraWxsX3BpZCgpLiAgSWYgaXQgZGlkLAogCSAqIHRoZW4gdGhlICpibGFua19zY3JlZW4gb3BlcmF0aW9uIGNvdWxkIG9jY3VyIHdoaWxlIFgsIGhhdmluZwogCSAqIHJlY2VpdmVkIGFjcXNpZywgaXMgd2FraW5nIHVwIG9uIGFub3RoZXIgcHJvY2Vzc29yLiAgVGhpcwogCSAqIGNvbmRpdGlvbiBjYW4gbGVhZCB0byBvdmVybGFwcGluZyBhY2Nlc3NlcyB0byB0aGUgVkdBIHJhbmdlCkBAIC0xMTEwLDcgKzExMTAsNyBAQAogCSAqLwogCWlmICh2Yy0+dnRfbW9kZS5tb2RlID09IFZUX1BST0NFU1MpIHsKIAkJLyoKLQkJICogU2VuZCB0aGUgc2lnbmFsIGFzIHByaXZpbGVnZWQgLSBraWxsX3Byb2MoKSB3aWxsCisJCSAqIFNlbmQgdGhlIHNpZ25hbCBhcyBwcml2aWxlZ2VkIC0ga2lsbF9waWQoKSB3aWxsCiAJCSAqIHRlbGwgdXMgaWYgdGhlIHByb2Nlc3MgaGFzIGdvbmUgb3Igc29tZXRoaW5nIGVsc2UKIAkJICogaXMgYXdyeQogCQkgKi8KQEAgLTExNzAsNyArMTE3MCw3IEBACiAJdmMgPSB2Y19jb25zW2ZnX2NvbnNvbGVdLmQ7CiAJaWYgKHZjLT52dF9tb2RlLm1vZGUgPT0gVlRfUFJPQ0VTUykgewogCQkvKgotCQkgKiBTZW5kIHRoZSBzaWduYWwgYXMgcHJpdmlsZWdlZCAtIGtpbGxfcHJvYygpIHdpbGwKKwkJICogU2VuZCB0aGUgc2lnbmFsIGFzIHByaXZpbGVnZWQgLSBraWxsX3BpZCgpIHdpbGwKIAkJICogdGVsbCB1cyBpZiB0aGUgcHJvY2VzcyBoYXMgZ29uZSBvciBzb21ldGhpbmcgZWxzZQogCQkgKiBpcyBhd3J5CiAJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZwppbmRleCA4OWU0NmQ2ZC4uZWEwOWQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcKQEAgLTEzLDcgKzEzLDcgQEAKIAkgIHN1YnNlcXVlbnRseSBvcGVuaW5nIHRoZSBmaWxlIGFuZCB0aGVuIGZhaWxpbmcgdG8gd3JpdGUgdG8gaXQgZm9yCiAJICBsb25nZXIgdGhhbiAxIG1pbnV0ZSB3aWxsIHJlc3VsdCBpbiByZWJvb3RpbmcgdGhlIG1hY2hpbmUuIFRoaXMKIAkgIGNvdWxkIGJlIHVzZWZ1bCBmb3IgYSBuZXR3b3JrZWQgbWFjaGluZSB0aGF0IG5lZWRzIHRvIGNvbWUgYmFjawotCSAgb25saW5lIGFzIGZhc3QgYXMgcG9zc2libGUgYWZ0ZXIgYSBsb2NrLXVwLiBUaGVyZSdzIGJvdGggYSB3YXRjaGRvZworCSAgb24tbGluZSBhcyBmYXN0IGFzIHBvc3NpYmxlIGFmdGVyIGEgbG9jay11cC4gVGhlcmUncyBib3RoIGEgd2F0Y2hkb2cKIAkgIGltcGxlbWVudGF0aW9uIGVudGlyZWx5IGluIHNvZnR3YXJlICh3aGljaCBjYW4gc29tZXRpbWVzIGZhaWwgdG8KIAkgIHJlYm9vdCB0aGUgbWFjaGluZSkgYW5kIGEgZHJpdmVyIGZvciBoYXJkd2FyZSB3YXRjaGRvZyBib2FyZHMsIHdoaWNoCiAJICBhcmUgbW9yZSByb2J1c3QgYW5kIGNhbiBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIHRlbXBlcmF0dXJlIGluc2lkZQpAQCAtNjAsNyArNjAsNyBAQAogCiAjIEFSTSBBcmNoaXRlY3R1cmUKIAotY29uZmlnIEFUOTFfV0FUQ0hET0cKK2NvbmZpZyBBVDkxUk05MjAwX1dBVENIRE9HCiAJdHJpc3RhdGUgIkFUOTFSTTkyMDAgd2F0Y2hkb2ciCiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBBUkNIX0FUOTFSTTkyMDAKIAloZWxwCkBAIC03MSw3ICs3MSw3IEBACiAJdHJpc3RhdGUgIkRDMjEyODUgd2F0Y2hkb2ciCiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBGT09UQlJJREdFCiAJaGVscAotCSAgVGhlIEludGVsIEZvb3RicmlkZ2UgY2hpcCBjb250YWlucyBhIGJ1aWx0aW4gd2F0Y2hkb2cgY2lyY3VpdC4gU2F5IFkKKwkgIFRoZSBJbnRlbCBGb290YnJpZGdlIGNoaXAgY29udGFpbnMgYSBidWlsdC1pbiB3YXRjaGRvZyBjaXJjdWl0LiBTYXkgWQogCSAgaGVyZSBpZiB5b3Ugd2lzaCB0byB1c2UgdGhpcy4gQWx0ZXJuYXRpdmVseSBzYXkgTSB0byBjb21waWxlIHRoZQogCSAgZHJpdmVyIGFzIGEgbW9kdWxlLCB3aGljaCB3aWxsIGJlIGNhbGxlZCB3ZHQyODUuCiAKQEAgLTI2OSwxMSArMjY5LDExIEBACiAJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgogCiBjb25maWcgSUJNQVNSCi0gICAgICAgIHRyaXN0YXRlICJJQk0gQXV0b21hdGljIFNlcnZlciBSZXN0YXJ0IgotICAgICAgICBkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgotICAgICAgICBoZWxwCisJdHJpc3RhdGUgIklCTSBBdXRvbWF0aWMgU2VydmVyIFJlc3RhcnQiCisJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBYODYKKwloZWxwCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBJQk0gQXV0b21hdGljIFNlcnZlciBSZXN0YXJ0IHdhdGNoZG9nCi0JICB0aW1lciBidWlsdGluIGludG8gc29tZSBlU2VydmVyIHhTZXJpZXMgbWFjaGluZXMuCisJICB0aW1lciBidWlsdC1pbiBpbnRvIHNvbWUgZVNlcnZlciB4U2VyaWVzIG1hY2hpbmVzLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpYm1hc3IuCkBAIC0zMTYsMTMgKzMxNiwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTh4eF90Y28uCiAKKwkgIE5vdGU6IFRoaXMgZHJpdmVyIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuIFBsZWFzZQorCSAgdXNlIHRoZSBJbnRlbCBUQ08gVGltZXIvV2F0Y2hkb2cgZHJpdmVyLgorCiBjb25maWcgSVRDT19XRFQKLQl0cmlzdGF0ZSAiSW50ZWwgVENPIFRpbWVyL1dhdGNoZG9nIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgKFg4NiB8fCBJQTY0KSAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIkludGVsIFRDTyBUaW1lci9XYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIChYODYgfHwgSUE2NCkgJiYgUENJCiAJLS0taGVscC0tLQogCSAgSGFyZHdhcmUgZHJpdmVyIGZvciB0aGUgaW50ZWwgVENPIHRpbWVyIGJhc2VkIHdhdGNoZG9nIGRldmljZXMuCiAJICBUaGVzZSBkcml2ZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgODI4MDEgSS9PIENvbnRyb2xsZXIKLQkgIEh1YiBmYW1pbHkgJ2Zyb20gSUNIMCB1cCB0byBJQ0g3KSBhbmQgaW4gdGhlIEludGVsIDYzMDBFU0IKKwkgIEh1YiBmYW1pbHkgKGZyb20gSUNIMCB1cCB0byBJQ0g4KSBhbmQgaW4gdGhlIEludGVsIDYzMDBFU0IKIAkgIGNvbnRyb2xsZXIgaHViLgogCiAJICBUaGUgVENPIChUb3RhbCBDb3N0IG9mIE93bmVyc2hpcCkgdGltZXIgaXMgYSB3YXRjaGRvZyB0aW1lcgpAQCAtMzM3LDYgKzM0MCwxNCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaVRDT193ZHQuCiAKK2NvbmZpZyBJVENPX1ZFTkRPUl9TVVBQT1JUCisJYm9vbCAiSW50ZWwgVENPIFRpbWVyL1dhdGNoZG9nIFNwZWNpZmljIFZlbmRvciBTdXBwb3J0IgorCWRlcGVuZHMgb24gSVRDT19XRFQKKwktLS1oZWxwLS0tCisJICBBZGQgdmVuZG9yIHNwZWNpZmljIHN1cHBvcnQgdG8gdGhlIGludGVsIFRDTyB0aW1lciBiYXNlZCB3YXRjaGRvZworCSAgZGV2aWNlcy4gQXQgdGhpcyBtb21lbnQgd2Ugb25seSBoYXZlIGFkZGl0aW9uYWwgc3VwcG9ydCBmb3Igc29tZQorCSAgU3VwZXJNaWNybyBJbmMuIG1vdGhlcmJvYXJkcy4KKwogY29uZmlnIFNDMTIwMF9XRFQKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzA3L1BDOTczMDcgKGFsYSBTQzEyMDApIFdhdGNoZG9nIgogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CkBAIC0zNjAsNiArMzcxLDIwIEBACiAKIAkgIElmIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZCBzY3gyMDBfd2R0LgogCitjb25maWcgUEM4NzQxM19XRFQKKwl0cmlzdGF0ZSAiTlMgUEM4NzQxMyB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIG9uIHRoZSBQQzg3NDEzIGNoaXBzZXQKKwkgIFRoaXMgd2F0Y2hkb2cgc2ltcGx5IHdhdGNoZXMgeW91ciBrZXJuZWwgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QKKwkgIGZyZWV6ZSwgYW5kIGlmIGl0IGRvZXMsIGl0IHJlYm9vdHMgeW91ciBjb21wdXRlciBhZnRlciBhIGNlcnRhaW4KKwkgIGFtb3VudCBvZiB0aW1lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwYzg3NDEzX3dkdC4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KKyAKIGNvbmZpZyA2MFhYX1dEVAogCXRyaXN0YXRlICJTQkMtNjBYWCBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgpAQCAtMzk1LDYgKzQyMCwyNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3B1NXdkdC4KIAorY29uZmlnIFNNU0MzN0I3ODdfV0RUCisJdHJpc3RhdGUgIldpbmJvbmQgU01zQzM3Qjc4NyBXYXRjaGRvZyBUaW1lciIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIGNvbXBvbmVudCBvbiB0aGUKKwkgIFdpbmJvbmQgU01zQzM3Qjc4NyBjaGlwc2V0IGFzIHVzZWQgb24gdGhlIE5ldFJ1bm5lciBNYWluYm9hcmQKKwkgIGZyb20gVmlzaW9uIFN5c3RlbXMgYW5kIG1heWJlIG90aGVycy4KKworCSAgVGhpcyB3YXRjaGRvZyBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndAorCSAgZnJlZXplLCBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbgorCSAgYW1vdW50IG9mIHRpbWUuCisKKwkgIFVzdWFsbHkgYSB1c2Vyc3BhY2UgZGFlbW9uIHdpbGwgbm90aWZ5IHRoZSBrZXJuZWwgV0RUIGRyaXZlciB0aGF0CisJICB1c2Vyc3BhY2UgaXMgc3RpbGwgYWxpdmUsIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzbXNjMzdiNzg3X3dkdC4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KKwogY29uZmlnIFc4MzYyN0hGX1dEVAogCXRyaXN0YXRlICJXODM2MjdIRiBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgpAQCAtNDEwLDYgKzQ1NSwyMSBAQAogCiAJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgogCitjb25maWcgVzgzNjk3SEZfV0RUCisJdHJpc3RhdGUgIlc4MzY5N0hGL1c4MzY5N0hHIFdhdGNoZG9nIFRpbWVyIgorCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cgb24gdGhlIFc4MzY5N0hGL0hHCisJICBjaGlwc2V0IGFzIHVzZWQgaW4gRGVkaWJveC9WSUEgbW90aGVyYm9hcmRzIChhbmQgbGlrZWx5IG90aGVycykuCisJICBUaGlzIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzIHlvdXIga2VybmVsIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0CisJICBmcmVlemUsIGFuZCBpZiBpdCBkb2VzLCBpdCByZWJvb3RzIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgYSBjZXJ0YWluCisJICBhbW91bnQgb2YgdGltZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdzgzNjk3aGZfd2R0LgorCisJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgorCiBjb25maWcgVzgzODc3Rl9XRFQKIAl0cmlzdGF0ZSAiVzgzODc3RiAoRU1BQ1MpIFdhdGNoZG9nIFRpbWVyIgogCWRlcGVuZHMgb24gV0FUQ0hET0cgJiYgWDg2CkBAIC00NDMsNyArNTAzLDcgQEAKIAlkZXBlbmRzIG9uIFdBVENIRE9HICYmIFg4NgogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBhcmUgdXNpbmcgYSBaRiBNaWNybyBNYWNoWiBwcm9jZXNzb3IsIHNheSBZIGhlcmUsIG90aGVyd2lzZQotCSAgTi4gIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyIGJ1aWx0aW4gb24gdGhhdAorCSAgTi4gIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIHdhdGNoZG9nIHRpbWVyIGJ1aWx0LWluIG9uIHRoYXQKIAkgIHByb2Nlc3NvciB1c2luZyBaRi1Mb2dpYyBpbnRlcmZhY2UuICBUaGlzIHdhdGNoZG9nIHNpbXBseSB3YXRjaGVzCiAJICB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBmcmVlemUsIGFuZCBpZiBpdCBkb2VzLCBpdAogCSAgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4KQEAgLTQ3Miw3ICs1MzIsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2JjX2VweF9jMy4KIAotCiAjIFBvd2VyUEMgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyA4eHhfV0RUCkBAIC01MDIsNyArNTYxLDcgQEAKIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIHdhdGNoZG9nIHN1cHBvcnQgZm9yIHRoZSBSVEFTIHdhdGNoZG9nLgogCi0gICAgICAgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgd2RydGFzLgogCiAjIE1JUFMgQXJjaGl0ZWN0dXJlCkBAIC01MTYsNiArNTc1LDE2IEBACiAJICB0aW1lciBleHBpcmVkIGFuZCBubyBwcm9jZXNzIGhhcyB3cml0dGVuIHRvIC9kZXYvd2F0Y2hkb2cgZHVyaW5nCiAJICB0aGF0IHRpbWUuCiAKK2NvbmZpZyBXRFRfUk05S19HUEkKKwl0cmlzdGF0ZSAiUk05MDAwL0dQSSBoYXJkd2FyZSB3YXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBVENIRE9HICYmIENQVV9STTkwMDAKKwloZWxwCisJICBXYXRjaGRvZyBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgR1BJIGhhcmR3YXJlIGZvdW5kIG9uCisJICBQTUMtU2llcnJhIFJNOXh4eCBDUFVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBybTlrX3dkdC4KKwogIyBTMzkwIEFyY2hpdGVjdHVyZQogCiBjb25maWcgWlZNX1dBVENIRE9HCkBAIC01NTYsNyArNjI1LDcgQEAKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdXNlciBhcHBsaWNhdGlvbnMgd2lsbCBiZSBhYmxlIHRvIG1tYXAgdGhlCiAJICBXRFQvQ1BHIHJlZ2lzdGVycy4KLSMKKwogIyBTUEFSQzY0IEFyY2hpdGVjdHVyZQogCiBjb25maWcgV0FUQ0hET0dfQ1AxWFhYCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggN2Y3MGFiYS4uMmNkOGZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9NYWtlZmlsZQpAQCAtMjMsNyArMjMsNyBAQAogb2JqLSQoQ09ORklHX1VTQlBDV0FUQ0hET0cpICs9IHBjd2RfdXNiLm8KIAogIyBBUk0gQXJjaGl0ZWN0dXJlCi1vYmotJChDT05GSUdfQVQ5MV9XQVRDSERPRykgKz0gYXQ5MV93ZHQubworb2JqLSQoQ09ORklHX0FUOTFSTTkyMDBfV0FUQ0hET0cpICs9IGF0OTFybTkyMDBfd2R0Lm8KIG9iai0kKENPTkZJR19PTUFQX1dBVENIRE9HKSArPSBvbWFwX3dkdC5vCiBvYmotJChDT05GSUdfMjEyODVfV0FUQ0hET0cpICs9IHdkdDI4NS5vCiBvYmotJChDT05GSUdfOTc3X1dBVENIRE9HKSArPSB3ZHQ5NzcubwpAQCAtNDcsMTMgKzQ3LDE2IEBACiBvYmotJChDT05GSUdfV0FGRVJfV0RUKSArPSB3YWZlcjU4MjN3ZHQubwogb2JqLSQoQ09ORklHX0k2MzAwRVNCX1dEVCkgKz0gaTYzMDBlc2Iubwogb2JqLSQoQ09ORklHX0k4WFhfVENPKSArPSBpOHh4X3Rjby5vCi1vYmotJChDT05GSUdfSVRDT19XRFQpICs9IGlUQ09fd2R0Lm8KK29iai0kKENPTkZJR19JVENPX1dEVCkgKz0gaVRDT193ZHQubyBpVENPX3ZlbmRvcl9zdXBwb3J0Lm8KIG9iai0kKENPTkZJR19TQzEyMDBfV0RUKSArPSBzYzEyMDB3ZHQubwogb2JqLSQoQ09ORklHX1NDeDIwMF9XRFQpICs9IHNjeDIwMF93ZHQubworb2JqLSQoQ09ORklHX1BDODc0MTNfV0RUKSArPSBwYzg3NDEzX3dkdC5vCiBvYmotJChDT05GSUdfNjBYWF9XRFQpICs9IHNiYzYweHh3ZHQubwogb2JqLSQoQ09ORklHX1NCQzgzNjBfV0RUKSArPSBzYmM4MzYwLm8KIG9iai0kKENPTkZJR19DUFU1X1dEVCkgKz0gY3B1NXdkdC5vCitvYmotJChDT05GSUdfU01TQzM3Qjc4N19XRFQpICs9IHNtc2MzN2I3ODdfd2R0Lm8KIG9iai0kKENPTkZJR19XODM2MjdIRl9XRFQpICs9IHc4MzYyN2hmX3dkdC5vCitvYmotJChDT05GSUdfVzgzNjk3SEZfV0RUKSArPSB3ODM2OTdoZl93ZHQubwogb2JqLSQoQ09ORklHX1c4Mzg3N0ZfV0RUKSArPSB3ODM4NzdmX3dkdC5vCiBvYmotJChDT05GSUdfVzgzOTc3Rl9XRFQpICs9IHc4Mzk3N2Zfd2R0Lm8KIG9iai0kKENPTkZJR19NQUNIWl9XRFQpICs9IG1hY2h6d2QubwpAQCAtNzAsNiArNzMsNyBAQAogCiAjIE1JUFMgQXJjaGl0ZWN0dXJlCiBvYmotJChDT05GSUdfSU5EWURPRykgKz0gaW5keWRvZy5vCitvYmotJChDT05GSUdfV0RUX1JNOUtfR1BJKSArPSBybTlrX3dkdC5vCiAKICMgUzM5MCBBcmNoaXRlY3R1cmUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FsaW03MTAxX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2FsaW03MTAxX3dkdC5jCmluZGV4IDU5NDg4NjMuLmJmMjVkMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hbGltNzEwMV93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYWxpbTcxMDFfd2R0LmMKQEAgLTc3LDcgKzc3LDggQEAKIAogc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwogbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKKwkJIF9fc3RyaW5naWZ5KENPTkZJR19XQVRDSERPR19OT1dBWU9VVCkgIikiKTsKIAogLyoKICAqCVdoYWNrIHRoZSBkb2cKQEAgLTQxNSw2ICs0MTYsMTYgQEAKIG1vZHVsZV9pbml0KGFsaW03MTAxX3dkdF9pbml0KTsKIG1vZHVsZV9leGl0KGFsaW03MTAxX3dkdF91bmxvYWQpOwogCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWxpbTcxMDFfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX003MTAxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWxpbTcxMDFfcGNpX3RibCk7CisKIE1PRFVMRV9BVVRIT1IoIlN0ZXZlIEhpbGwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQUxpIE03MTAxIFBNVSBDb21wdXRlciBXYXRjaGRvZyBUaW1lciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hdDkxX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2F0OTFfd2R0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlN2ExMTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2F0OTFfd2R0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoKLSAqIFdhdGNoZG9nIGRyaXZlciBmb3IgQXRtZWwgQVQ5MVJNOTIwMCAoVGh1bmRlcikKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzIFNBTiBQZW9wbGUgKFB0eSkgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+Ci0jaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLQotI2RlZmluZSBXRFRfREVGQVVMVF9USU1FCTUJLyogc2Vjb25kcyAqLwotI2RlZmluZSBXRFRfTUFYX1RJTUUJCTI1NgkvKiBzZWNvbmRzICovCi0KLXN0YXRpYyBpbnQgd2R0X3RpbWUgPSBXRFRfREVGQVVMVF9USU1FOwotc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwotCi1tb2R1bGVfcGFyYW0od2R0X3RpbWUsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdkdF90aW1lLCAiV2F0Y2hkb2cgdGltZSBpbiBzZWNvbmRzLiAoZGVmYXVsdD0iX19NT0RVTEVfU1RSSU5HKFdEVF9ERUZBVUxUX1RJTUUpICIpIik7Ci0KLSNpZmRlZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQKLW1vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7Ci0jZW5kaWYKLQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBhdDkxd2R0X2J1c3k7Ci0KLS8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KLQotLyoKLSAqIERpc2FibGUgdGhlIHdhdGNoZG9nLgotICovCi1zdGF0aWMgdm9pZCBpbmxpbmUgYXQ5MV93ZHRfc3RvcCh2b2lkKQotewotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfV0RNUiwgQVQ5MV9TVF9FWFRFTik7Ci19Ci0KLS8qCi0gKiBFbmFibGUgYW5kIHJlc2V0IHRoZSB3YXRjaGRvZy4KLSAqLwotc3RhdGljIHZvaWQgaW5saW5lIGF0OTFfd2R0X3N0YXJ0KHZvaWQpCi17Ci0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TVF9XRE1SLCBBVDkxX1NUX0VYVEVOIHwgQVQ5MV9TVF9SU1RFTiB8ICgoKDY1NTM2ICogd2R0X3RpbWUpID4+IDgpICYgQVQ5MV9TVF9XRFYpKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX1NUX0NSLCBBVDkxX1NUX1dEUlNUKTsKLX0KLQotLyoKLSAqIFJlbG9hZCB0aGUgd2F0Y2hkb2cgdGltZXIuICAoaWUsIHBhdCB0aGUgd2F0Y2hkb2cpCi0gKi8KLXN0YXRpYyB2b2lkIGlubGluZSBhdDkxX3dkdF9yZWxvYWQodm9pZCkKLXsKLQlhdDkxX3N5c193cml0ZShBVDkxX1NUX0NSLCBBVDkxX1NUX1dEUlNUKTsKLX0KLQotLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLwotCi0vKgotICogV2F0Y2hkb2cgZGV2aWNlIGlzIG9wZW5lZCwgYW5kIHdhdGNoZG9nIHN0YXJ0cyBydW5uaW5nLgotICovCi1zdGF0aWMgaW50IGF0OTFfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmF0OTF3ZHRfYnVzeSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlhdDkxX3dkdF9zdGFydCgpOwotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotLyoKLSAqIENsb3NlIHRoZSB3YXRjaGRvZyBkZXZpY2UuCi0gKiBJZiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgTk9UIGRlZmluZWQgdGhlbiB0aGUgd2F0Y2hkb2cgaXMgYWxzbwotICogIGRpc2FibGVkLgotICovCi1zdGF0aWMgaW50IGF0OTFfd2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWlmICghbm93YXlvdXQpCi0JCWF0OTFfd2R0X3N0b3AoKTsJLyogRGlzYWJsZSB0aGUgd2F0Y2hkb2cgd2hlbiBmaWxlIGlzIGNsb3NlZCAqLwotCi0JY2xlYXJfYml0KDAsICZhdDkxd2R0X2J1c3kpOwotCXJldHVybiAwOwotfQotCi0vKgotICogQ2hhbmdlIHRoZSB3YXRjaGRvZyB0aW1lIGludGVydmFsLgotICovCi1zdGF0aWMgaW50IGF0OTFfd2R0X3NldHRpbWVvdXQoaW50IG5ld190aW1lKQotewotCS8qCi0JICogQWxsIGNvdW50aW5nIG9jY3VycyBhdCBTTE9XX0NMT0NLIC8gMTI4ID0gMC4yNTYgSHoKLQkgKgotCSAqIFNpbmNlIFdEViBpcyBhIDE2LWJpdCBjb3VudGVyLCB0aGUgbWF4aW11bSBwZXJpb2QgaXMKLQkgKiA2NTUzNiAvIDAuMjU2ID0gMjU2IHNlY29uZHMuCi0JICovCi0JaWYgKChuZXdfdGltZSA8PSAwKSB8fCAobmV3X3RpbWUgPiBXRFRfTUFYX1RJTUUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFNldCBuZXcgd2F0Y2hkb2cgdGltZS4gSXQgd2lsbCBiZSB1c2VkIHdoZW4gYXQ5MV93ZHRfc3RhcnQoKSBpcyBjYWxsZWQuICovCi0Jd2R0X3RpbWUgPSBuZXdfdGltZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGF0OTFfd2R0X2luZm8gPSB7Ci0JLmlkZW50aXR5CT0gImF0OTEgd2F0Y2hkb2ciLAotCS5vcHRpb25zCT0gV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX0tFRVBBTElWRVBJTkcsCi19OwotCi0vKgotICogSGFuZGxlIGNvbW1hbmRzIGZyb20gdXNlci1zcGFjZS4KLSAqLwotc3RhdGljIGludCBhdDkxX3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IF9fdXNlciAqcCA9IGFyZ3A7Ci0JaW50IG5ld192YWx1ZTsKLQotCXN3aXRjaChjbWQpIHsKLQkJY2FzZSBXRElPQ19LRUVQQUxJVkU6Ci0JCQlhdDkxX3dkdF9yZWxvYWQoKTsJLyogcGF0IHRoZSB3YXRjaGRvZyAqLwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgotCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYXQ5MV93ZHRfaW5mbywgc2l6ZW9mKGF0OTFfd2R0X2luZm8pKSA/IC1FRkFVTFQgOiAwOwotCi0JCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKLQkJCWlmIChnZXRfdXNlcihuZXdfdmFsdWUsIHApKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlpZiAoYXQ5MV93ZHRfc2V0dGltZW91dChuZXdfdmFsdWUpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQkvKiBFbmFibGUgbmV3IHRpbWUgdmFsdWUgKi8KLQkJCWF0OTFfd2R0X3N0YXJ0KCk7Ci0KLQkJCS8qIFJldHVybiBjdXJyZW50IHZhbHVlICovCi0JCQlyZXR1cm4gcHV0X3VzZXIod2R0X3RpbWUsIHApOwotCi0JCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKLQkJCXJldHVybiBwdXRfdXNlcih3ZHRfdGltZSwgcCk7Ci0KLQkJY2FzZSBXRElPQ19HRVRTVEFUVVM6Ci0JCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKLQkJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQotCQljYXNlIFdESU9DX1NFVE9QVElPTlM6Ci0JCQlpZiAoZ2V0X3VzZXIobmV3X3ZhbHVlLCBwKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJaWYgKG5ld192YWx1ZSAmIFdESU9TX0RJU0FCTEVDQVJEKQotCQkJCWF0OTFfd2R0X3N0b3AoKTsKLQkJCWlmIChuZXdfdmFsdWUgJiBXRElPU19FTkFCTEVDQVJEKQotCQkJCWF0OTFfd2R0X3N0YXJ0KCk7Ci0JCQlyZXR1cm4gMDsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FTk9UVFk7Ci0JfQotfQotCi0vKgotICogUGF0IHRoZSB3YXRjaGRvZyB3aGVuZXZlciBkZXZpY2UgaXMgd3JpdHRlbiB0by4KLSAqLwotc3RhdGljIHNzaXplX3QgYXQ5MV93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKLXsKLQlhdDkxX3dkdF9yZWxvYWQoKTsJCS8qIHBhdCB0aGUgd2F0Y2hkb2cgKi8KLQlyZXR1cm4gbGVuOwotfQotCi0vKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF0OTF3ZHRfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLmlvY3RsCQk9IGF0OTFfd2R0X2lvY3RsLAotCS5vcGVuCQk9IGF0OTFfd2R0X29wZW4sCi0JLnJlbGVhc2UJPSBhdDkxX3dkdF9jbG9zZSwKLQkud3JpdGUJCT0gYXQ5MV93ZHRfd3JpdGUsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXQ5MXdkdF9taXNjZGV2ID0gewotCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKLQkubmFtZQkJPSAid2F0Y2hkb2ciLAotCS5mb3BzCQk9ICZhdDkxd2R0X2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdDkxd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJlczsKLQotCWlmIChhdDkxd2R0X21pc2NkZXYuZGV2KQotCQlyZXR1cm4gLUVCVVNZOwotCWF0OTF3ZHRfbWlzY2Rldi5kZXYgPSAmcGRldi0+ZGV2OwotCi0JcmVzID0gbWlzY19yZWdpc3RlcigmYXQ5MXdkdF9taXNjZGV2KTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCi0JcHJpbnRrKCJBVDkxIFdhdGNoZG9nIFRpbWVyIGVuYWJsZWQgKCVkIHNlY29uZHMlcylcbiIsIHdkdF90aW1lLCBub3dheW91dCA/ICIsIG5vd2F5b3V0IiA6ICIiKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgYXQ5MXdkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmVzOwotCi0JcmVzID0gbWlzY19kZXJlZ2lzdGVyKCZhdDkxd2R0X21pc2NkZXYpOwotCWlmICghcmVzKQotCQlhdDkxd2R0X21pc2NkZXYuZGV2ID0gTlVMTDsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0OTF3ZHRfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlhdDkxX3dkdF9zdG9wKCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQotc3RhdGljIGludCBhdDkxd2R0X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCi17Ci0JYXQ5MV93ZHRfc3RvcCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0OTF3ZHRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaWYgKGF0OTF3ZHRfYnVzeSkKLQkJYXQ5MV93ZHRfc3RhcnQoKTsKLQkJcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIGF0OTF3ZHRfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGF0OTF3ZHRfcmVzdW1lCU5VTEwKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdDkxd2R0X2RyaXZlciA9IHsKLQkucHJvYmUJCT0gYXQ5MXdkdF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZXhpdF9wKGF0OTF3ZHRfcmVtb3ZlKSwKLQkuc2h1dGRvd24JPSBhdDkxd2R0X3NodXRkb3duLAotCS5zdXNwZW5kCT0gYXQ5MXdkdF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gYXQ5MXdkdF9yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gImF0OTFfd2R0IiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF0OTFfd2R0X2luaXQodm9pZCkKLXsKLQkvKiBDaGVjayB0aGF0IHRoZSBoZWFydGJlYXQgdmFsdWUgaXMgd2l0aGluIHJhbmdlOyBpZiBub3QgcmVzZXQgdG8gdGhlIGRlZmF1bHQgKi8KLQlpZiAoYXQ5MV93ZHRfc2V0dGltZW91dCh3ZHRfdGltZSkpIHsKLQkJYXQ5MV93ZHRfc2V0dGltZW91dChXRFRfREVGQVVMVF9USU1FKTsKLQkJcHJfaW5mbygiYXQ5MV93ZHQ6IHdkdF90aW1lIHZhbHVlIG11c3QgYmUgMSA8PSB3ZHRfdGltZSA8PSAyNTYsIHVzaW5nICVkXG4iLCB3ZHRfdGltZSk7Ci0JfQotCi0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXQ5MXdkdF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXQ5MV93ZHRfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdDkxd2R0X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGF0OTFfd2R0X2luaXQpOwotbW9kdWxlX2V4aXQoYXQ5MV93ZHRfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkFuZHJldyBWaWN0b3IiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiV2F0Y2hkb2cgZHJpdmVyIGZvciBBdG1lbCBBVDkxUk05MjAwIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYXQ5MXJtOTIwMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9hdDkxcm05MjAwX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmQzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvYXQ5MXJtOTIwMF93ZHQuYwpAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIFdhdGNoZG9nIGRyaXZlciBmb3IgQXRtZWwgQVQ5MVJNOTIwMCAoVGh1bmRlcikKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFNBTiBQZW9wbGUgKFB0eSkgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9zdC5oPgorCisKKyNkZWZpbmUgV0RUX0RFRkFVTFRfVElNRQk1CS8qIHNlY29uZHMgKi8KKyNkZWZpbmUgV0RUX01BWF9USU1FCQkyNTYJLyogc2Vjb25kcyAqLworCitzdGF0aWMgaW50IHdkdF90aW1lID0gV0RUX0RFRkFVTFRfVElNRTsKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKKworbW9kdWxlX3BhcmFtKHdkdF90aW1lLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZHRfdGltZSwgIldhdGNoZG9nIHRpbWUgaW4gc2Vjb25kcy4gKGRlZmF1bHQ9Il9fTU9EVUxFX1NUUklORyhXRFRfREVGQVVMVF9USU1FKSAiKSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOworI2VuZGlmCisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYXQ5MXdkdF9idXN5OworCisvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCisKKy8qCisgKiBEaXNhYmxlIHRoZSB3YXRjaGRvZy4KKyAqLworc3RhdGljIHZvaWQgaW5saW5lIGF0OTFfd2R0X3N0b3Aodm9pZCkKK3sKKwlhdDkxX3N5c193cml0ZShBVDkxX1NUX1dETVIsIEFUOTFfU1RfRVhURU4pOworfQorCisvKgorICogRW5hYmxlIGFuZCByZXNldCB0aGUgd2F0Y2hkb2cuCisgKi8KK3N0YXRpYyB2b2lkIGlubGluZSBhdDkxX3dkdF9zdGFydCh2b2lkKQoreworCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfV0RNUiwgQVQ5MV9TVF9FWFRFTiB8IEFUOTFfU1RfUlNURU4gfCAoKCg2NTUzNiAqIHdkdF90aW1lKSA+PiA4KSAmIEFUOTFfU1RfV0RWKSk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TVF9DUiwgQVQ5MV9TVF9XRFJTVCk7Cit9CisKKy8qCisgKiBSZWxvYWQgdGhlIHdhdGNoZG9nIHRpbWVyLiAgKGllLCBwYXQgdGhlIHdhdGNoZG9nKQorICovCitzdGF0aWMgdm9pZCBpbmxpbmUgYXQ5MV93ZHRfcmVsb2FkKHZvaWQpCit7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TVF9DUiwgQVQ5MV9TVF9XRFJTVCk7Cit9CisKKy8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KKworLyoKKyAqIFdhdGNoZG9nIGRldmljZSBpcyBvcGVuZWQsIGFuZCB3YXRjaGRvZyBzdGFydHMgcnVubmluZy4KKyAqLworc3RhdGljIGludCBhdDkxX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZhdDkxd2R0X2J1c3kpKQorCQlyZXR1cm4gLUVCVVNZOworCisJYXQ5MV93ZHRfc3RhcnQoKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qCisgKiBDbG9zZSB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICogSWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIE5PVCBkZWZpbmVkIHRoZW4gdGhlIHdhdGNoZG9nIGlzIGFsc28KKyAqICBkaXNhYmxlZC4KKyAqLworc3RhdGljIGludCBhdDkxX3dkdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoIW5vd2F5b3V0KQorCQlhdDkxX3dkdF9zdG9wKCk7CS8qIERpc2FibGUgdGhlIHdhdGNoZG9nIHdoZW4gZmlsZSBpcyBjbG9zZWQgKi8KKworCWNsZWFyX2JpdCgwLCAmYXQ5MXdkdF9idXN5KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgd2F0Y2hkb2cgdGltZSBpbnRlcnZhbC4KKyAqLworc3RhdGljIGludCBhdDkxX3dkdF9zZXR0aW1lb3V0KGludCBuZXdfdGltZSkKK3sKKwkvKgorCSAqIEFsbCBjb3VudGluZyBvY2N1cnMgYXQgU0xPV19DTE9DSyAvIDEyOCA9IDAuMjU2IEh6CisJICoKKwkgKiBTaW5jZSBXRFYgaXMgYSAxNi1iaXQgY291bnRlciwgdGhlIG1heGltdW0gcGVyaW9kIGlzCisJICogNjU1MzYgLyAwLjI1NiA9IDI1NiBzZWNvbmRzLgorCSAqLworCWlmICgobmV3X3RpbWUgPD0gMCkgfHwgKG5ld190aW1lID4gV0RUX01BWF9USU1FKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTZXQgbmV3IHdhdGNoZG9nIHRpbWUuIEl0IHdpbGwgYmUgdXNlZCB3aGVuIGF0OTFfd2R0X3N0YXJ0KCkgaXMgY2FsbGVkLiAqLworCXdkdF90aW1lID0gbmV3X3RpbWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBhdDkxX3dkdF9pbmZvID0geworCS5pZGVudGl0eQk9ICJhdDkxIHdhdGNoZG9nIiwKKwkub3B0aW9ucwk9IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9LRUVQQUxJVkVQSU5HLAorfTsKKworLyoKKyAqIEhhbmRsZSBjb21tYW5kcyBmcm9tIHVzZXItc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV93ZHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCWludCBuZXdfdmFsdWU7CisKKwlzd2l0Y2goY21kKSB7CisJCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQkJYXQ5MV93ZHRfcmVsb2FkKCk7CS8qIHBhdCB0aGUgd2F0Y2hkb2cgKi8KKwkJCXJldHVybiAwOworCisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmF0OTFfd2R0X2luZm8sIHNpemVvZihhdDkxX3dkdF9pbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCQlpZiAoZ2V0X3VzZXIobmV3X3ZhbHVlLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKGF0OTFfd2R0X3NldHRpbWVvdXQobmV3X3ZhbHVlKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogRW5hYmxlIG5ldyB0aW1lIHZhbHVlICovCisJCQlhdDkxX3dkdF9zdGFydCgpOworCisJCQkvKiBSZXR1cm4gY3VycmVudCB2YWx1ZSAqLworCQkJcmV0dXJuIHB1dF91c2VyKHdkdF90aW1lLCBwKTsKKworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIod2R0X3RpbWUsIHApOworCisJCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwkJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQkJaWYgKGdldF91c2VyKG5ld192YWx1ZSwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChuZXdfdmFsdWUgJiBXRElPU19ESVNBQkxFQ0FSRCkKKwkJCQlhdDkxX3dkdF9zdG9wKCk7CisJCQlpZiAobmV3X3ZhbHVlICYgV0RJT1NfRU5BQkxFQ0FSRCkKKwkJCQlhdDkxX3dkdF9zdGFydCgpOworCQkJcmV0dXJuIDA7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworLyoKKyAqIFBhdCB0aGUgd2F0Y2hkb2cgd2hlbmV2ZXIgZGV2aWNlIGlzIHdyaXR0ZW4gdG8uCisgKi8KK3N0YXRpYyBzc2l6ZV90IGF0OTFfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJYXQ5MV93ZHRfcmVsb2FkKCk7CQkvKiBwYXQgdGhlIHdhdGNoZG9nICovCisJcmV0dXJuIGxlbjsKK30KKworLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdDkxd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBhdDkxX3dkdF9pb2N0bCwKKwkub3BlbgkJPSBhdDkxX3dkdF9vcGVuLAorCS5yZWxlYXNlCT0gYXQ5MV93ZHRfY2xvc2UsCisJLndyaXRlCQk9IGF0OTFfd2R0X3dyaXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF0OTF3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmYXQ5MXdkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQ5MXdkdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXM7CisKKwlpZiAoYXQ5MXdkdF9taXNjZGV2LnBhcmVudCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlhdDkxd2R0X21pc2NkZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKworCXJlcyA9IG1pc2NfcmVnaXN0ZXIoJmF0OTF3ZHRfbWlzY2Rldik7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCXByaW50aygiQVQ5MSBXYXRjaGRvZyBUaW1lciBlbmFibGVkICglZCBzZWNvbmRzJXMpXG4iLCB3ZHRfdGltZSwgbm93YXlvdXQgPyAiLCBub3dheW91dCIgOiAiIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGF0OTF3ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJlczsKKworCXJlcyA9IG1pc2NfZGVyZWdpc3RlcigmYXQ5MXdkdF9taXNjZGV2KTsKKwlpZiAoIXJlcykKKwkJYXQ5MXdkdF9taXNjZGV2LnBhcmVudCA9IE5VTEw7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBhdDkxd2R0X3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJYXQ5MV93ZHRfc3RvcCgpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgYXQ5MXdkdF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCWF0OTFfd2R0X3N0b3AoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDkxd2R0X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWlmIChhdDkxd2R0X2J1c3kpCisJCWF0OTFfd2R0X3N0YXJ0KCk7CisJCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBhdDkxd2R0X3N1c3BlbmQgTlVMTAorI2RlZmluZSBhdDkxd2R0X3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXQ5MXdkdF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGF0OTF3ZHRfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChhdDkxd2R0X3JlbW92ZSksCisJLnNodXRkb3duCT0gYXQ5MXdkdF9zaHV0ZG93biwKKwkuc3VzcGVuZAk9IGF0OTF3ZHRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGF0OTF3ZHRfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhdDkxX3dkdCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX3dkdF9pbml0KHZvaWQpCit7CisJLyogQ2hlY2sgdGhhdCB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIHdpdGhpbiByYW5nZTsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCisJaWYgKGF0OTFfd2R0X3NldHRpbWVvdXQod2R0X3RpbWUpKSB7CisJCWF0OTFfd2R0X3NldHRpbWVvdXQoV0RUX0RFRkFVTFRfVElNRSk7CisJCXByX2luZm8oImF0OTFfd2R0OiB3ZHRfdGltZSB2YWx1ZSBtdXN0IGJlIDEgPD0gd2R0X3RpbWUgPD0gMjU2LCB1c2luZyAlZFxuIiwgd2R0X3RpbWUpOworCX0KKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF0OTF3ZHRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0OTFfd2R0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXQ5MXdkdF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhdDkxX3dkdF9pbml0KTsKK21vZHVsZV9leGl0KGF0OTFfd2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbmRyZXcgVmljdG9yIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldhdGNoZG9nIGRyaXZlciBmb3IgQXRtZWwgQVQ5MVJNOTIwMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2lUQ09fdmVuZG9yX3N1cHBvcnQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3ZlbmRvcl9zdXBwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1MDgzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3ZlbmRvcl9zdXBwb3J0LmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKglpbnRlbCBUQ08gdmVuZG9yIHNwZWNpZmljIHdhdGNoZG9nIGRyaXZlciBzdXBwb3J0CisgKgorICoJKGMpIENvcHlyaWdodCAyMDA2IFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+LgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBXaW0gVmFuIFNlYnJvZWNrIG5vciBJZ3VhbmEgdnp3LiBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKglwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICoJcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICovCisKKy8qCisgKglJbmNsdWRlcywgZGVmaW5lcywgdmFyaWFibGVzLCBtb2R1bGUgcGFyYW1ldGVycywgLi4uCisgKi8KKworLyogTW9kdWxlIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIERSVl9OQU1FICAgICAgICAiaVRDT192ZW5kb3Jfc3VwcG9ydCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gICAgICIxLjAxIgorI2RlZmluZSBEUlZfUkVMREFURSAgICAgIjExLU5vdi0yMDA2IgorI2RlZmluZSBQRlgJCURSVl9OQU1FICI6ICIKKworLyogSW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JCS8qIEZvciBtb2R1bGUgc3BlY2lmaWMgaXRlbXMgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgkJLyogRm9yIG5ldyBtb2R1bGVwYXJhbSdzICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIEZvciBzdGFuZGFyZCB0eXBlcyAobGlrZSBzaXplX3QpICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JCS8qIEZvciB0aGUgLUVOT0RFVi8uLi4gdmFsdWVzICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CQkvKiBGb3IgcHJpbnRrL3BhbmljLy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCQkvKiBGb3IgX19pbml0L19fZXhpdC8uLi4gKi8KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JCS8qIEZvciBpby1wb3J0IGFjY2VzcyAqLworCisjaW5jbHVkZSA8YXNtL2lvLmg+CQkJLyogRm9yIGluYi9vdXRiLy4uLiAqLworCisvKiBpVENPIGRlZmluZXMgKi8KKyNkZWZpbmUJU01JX0VOCQlhY3BpYmFzZSArIDB4MzAJLyogU01JIENvbnRyb2wgYW5kIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlUQ09CQVNFCQlhY3BpYmFzZSArIDB4NjAJLyogVENPIGJhc2UgYWRkcmVzcwkJKi8KKyNkZWZpbmUJVENPMV9TVFMJVENPQkFTRSArIDB4MDQJLyogVENPMSBTdGF0dXMgUmVnaXN0ZXIJCSovCisKKy8qIExpc3Qgb2YgdmVuZG9yIHN1cHBvcnQgbW9kZXMgKi8KKyNkZWZpbmUgU1VQRVJNSUNST19PTERfQk9BUkQJMQkvKiBTdXBlck1pY3JvIFBlbnRpdW0gMyBFcmEgMzcwU1NFKy1PRU0xL1AzVFNTRSAqLworI2RlZmluZSBTVVBFUk1JQ1JPX05FV19CT0FSRAkyCS8qIFN1cGVyTWljcm8gUGVudGl1bSA0IC8gWGVvbiA0IC8gRU1UNjRUIEVyYSBTeXN0ZW1zICovCisKK3N0YXRpYyBpbnQgdmVuZG9yc3VwcG9ydCA9IDA7Cittb2R1bGVfcGFyYW0odmVuZG9yc3VwcG9ydCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmVuZG9yc3VwcG9ydCwgImlUQ08gdmVuZG9yIHNwZWNpZmljIHN1cHBvcnQgbW9kZSwgZGVmYXVsdD0wIChub25lKSwgMT1TdXBlck1pY3JvIFBlbnQzLCAyPVN1cGVyTWljcm8gUGVudDQrIik7CisKKy8qCisgKglWZW5kb3IgU3BlY2lmaWMgU3VwcG9ydAorICovCisKKy8qCisgKglWZW5kb3IgU3VwcG9ydDogMQorICoJQm9hcmQ6IFN1cGVyIE1pY3JvIENvbXB1dGVyIEluYy4gMzcwU1NFKy1PRU0xL1AzVFNTRQorICoJaVRDTyBjaGlwc2V0OiBJQ0gyCisgKgorICoJQ29kZSBjb250cmlidXRlZCBieTogUi4gU2VyZXRueSA8bGtwYXRjaGVzQHBheXBjLmNvbT4KKyAqCURvY3VtZW50YXRpb24gb2J0YWluZWQgYnkgUi4gU2VyZXRueSBmcm9tIFN1cGVyTWljcm8gVGVjaG5pY2FsIFN1cHBvcnQKKyAqCisgKglUbyBlbmFibGUgV2F0Y2hkb2cgZnVuY3Rpb246CisgKgkgICAgQklPUyBzZXR1cCAtPiBQb3dlciAtPiBUQ08gTG9naWMgU01JIEVuYWJsZSAtPiBXaXRoaW41TWludXRlcworICoJICAgIFRoaXMgc2V0dGluZyBlbmFibGVzIFNNSSB0byBjbGVhciB0aGUgd2F0Y2hkb2cgZXhwaXJlZCBmbGFnLgorICoJICAgIElmIEJJT1Mgb3IgQ1BVIGZhaWwgd2hpY2ggbWF5IGNhdXNlIFNNSSBoYW5nLCB0aGVuIHN5c3RlbSB3aWxsCisgKgkgICAgcmVib290LiBXaGVuIGFwcGxpY2F0aW9uIHN0YXJ0cyB0byB1c2Ugd2F0Y2hkb2cgZnVuY3Rpb24sCisgKgkgICAgYXBwbGljYXRpb24gaGFzIHRvIHRha2Ugb3ZlciB0aGUgY29udHJvbCBmcm9tIFNNSS4KKyAqCisgKgkgICAgRm9yIFAzVFNTRSwgSjM2IGp1bXBlciBuZWVkcyB0byBiZSByZW1vdmVkIHRvIGVuYWJsZSB0aGUgV2F0Y2hkb2cKKyAqCSAgICBmdW5jdGlvbi4KKyAqCisgKgkgICAgTm90ZTogVGhlIHN5c3RlbSB3aWxsIHJlYm9vdCB3aGVuIEV4cGlyZSBGbGFnIGlzIHNldCBUV0lDRS4KKyAqCSAgICBTbywgaWYgdGhlIHdhdGNoZG9nIHRpbWVyIGlzIDIwIHNlY29uZHMsIHRoZW4gdGhlIG1heGltdW0gaGFuZworICoJICAgIHRpbWUgaXMgYWJvdXQgNDAgc2Vjb25kcywgYW5kIHRoZSBtaW5pbXVtIGhhbmcgdGltZSBpcyBhYm91dAorICoJICAgIDIwLjYgc2Vjb25kcy4KKyAqLworCitzdGF0aWMgdm9pZCBzdXBlcm1pY3JvX29sZF9wcmVfc3RhcnQodW5zaWduZWQgbG9uZyBhY3BpYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDMyOworCisJdmFsMzIgPSBpbmwoU01JX0VOKTsKKwl2YWwzMiAmPSAweGZmZmZkZmZmOwkvKiBUdXJuIG9mZiBTTUkgY2xlYXJpbmcgd2F0Y2hkb2cgKi8KKwlvdXRsKHZhbDMyLCBTTUlfRU4pOwkvKiBOZWVkZWQgdG8gYWN0aXZhdGUgd2F0Y2hkb2cgKi8KK30KKworc3RhdGljIHZvaWQgc3VwZXJtaWNyb19vbGRfcHJlX3N0b3AodW5zaWduZWQgbG9uZyBhY3BpYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDMyOworCisJdmFsMzIgPSBpbmwoU01JX0VOKTsKKwl2YWwzMiAmPSAweDAwMDAyMDAwOwkvKiBUdXJuIG9uIFNNSSBjbGVhcmluZyB3YXRjaGRvZyAqLworCW91dGwodmFsMzIsIFNNSV9FTik7CS8qIE5lZWRlZCB0byBkZWFjdGl2YXRlIHdhdGNoZG9nICovCit9CisKK3N0YXRpYyB2b2lkIHN1cGVybWljcm9fb2xkX3ByZV9rZWVwYWxpdmUodW5zaWduZWQgbG9uZyBhY3BpYmFzZSkKK3sKKwkvKiBSZWxvYWQgVENPIFRpbWVyIChkb25lIGluIGlUQ09fd2R0X2tlZXBhbGl2ZSkgKyAqLworCS8qIENsZWFyICJFeHBpcmUgRmxhZyIgKEJpdCAzIG9mIFRDMDFfU1RTIHJlZ2lzdGVyKSAqLworCW91dGIoMHgwOCwgVENPMV9TVFMpOworfQorCisvKgorICoJVmVuZG9yIFN1cHBvcnQ6IDIKKyAqCUJvYXJkOiBTdXBlciBNaWNybyBDb21wdXRlciBJbmMuIFA0U0J4LCBQNERQeAorICoJaVRDTyBjaGlwc2V0OiBJQ0g0CisgKgorICoJQ29kZSBjb250cmlidXRlZCBieTogUi4gU2VyZXRueSA8bGtwYXRjaGVzQHBheXBjLmNvbT4KKyAqCURvY3VtZW50YXRpb24gb2J0YWluZWQgYnkgUi4gU2VyZXRueSBmcm9tIFN1cGVyTWljcm8gVGVjaG5pY2FsIFN1cHBvcnQKKyAqCisgKglUbyBlbmFibGUgV2F0Y2hkb2cgZnVuY3Rpb246CisgKgkgMS4gQklPUworICoJICBGb3IgUDRTQng6CisgKgkgIEJJT1Mgc2V0dXAgLT4gQWR2YW5jZWQgLT4gSW50ZWdyYXRlZCBQZXJpcGhlcmFscyAtPiBXYXRjaCBEb2cgRmVhdHVyZQorICoJICBGb3IgUDREUHg6CisgKgkgIEJJT1Mgc2V0dXAgLT4gQWR2YW5jZWQgLT4gSS9PIERldmljZSBDb25maWd1cmF0aW9uIC0+IFdhdGNoIERvZworICoJIFRoaXMgc2V0dGluZyBlbmFibGVzIG9yIGRpc2FibGVzIFdhdGNoZG9nIGZ1bmN0aW9uLiBXaGVuIGVuYWJsZWQsIHRoZQorICoJIGRlZmF1bHQgd2F0Y2hkb2cgdGltZXIgaXMgc2V0IHRvIGJlIDUgbWludXRlcyAoYWJvdXQgNOKAmTM14oCdKS4gSXQgaXMKKyAqCSBlbm91Z2ggdG8gbG9hZCBhbmQgcnVuIHRoZSBPUy4gVGhlIGFwcGxpY2F0aW9uIChzZXJ2aWNlIG9yIGRyaXZlcikgaGFzCisgKgkgdG8gdGFrZSBvdmVyIHRoZSBjb250cm9sIG9uY2UgT1MgaXMgcnVubmluZyB1cCBhbmQgYmVmb3JlIHdhdGNoZG9nCisgKgkgZXhwaXJlcy4KKyAqCisgKgkgMi4gSlVNUEVSCisgKgkgIEZvciBQNFNCeDogSlAzOQorICoJICBGb3IgUDREUHg6IEpQMzcKKyAqCSAgVGhpcyBqdW1wZXIgaXMgdXNlZCBmb3Igc2FmZXR5LiAgQ2xvc2VkIGlzIGVuYWJsZWQuIFRoaXMganVtcGVyCisgKgkgIHByZXZlbnRzIHVzZXIgZW5hYmxlcyB3YXRjaGRvZyBpbiBCSU9TIGJ5IGFjY2lkZW50LgorICoKKyAqCSBUbyBlbmFibGUgV2F0Y2ggRG9nIGZ1bmN0aW9uLCBib3RoIEJJT1MgYW5kIEpVTVBFUiBtdXN0IGJlIGVuYWJsZWQuCisgKgorICoJVGhlIGRvY3VtZW50YXRpb24gbGlzdHMgbW90aGVyYm9hcmRzIFA0U0J4IGFuZCBQNERQeCBzZXJpZXMgYXMgb2YKKyAqCTIwLU1hcmNoLTIwMDIuIEhvd2V2ZXIsIHRoaXMgY29kZSB3b3JrcyBmbGF3bGVzc2x5IHdpdGggbXVjaCBuZXdlcgorICoJbW90aGVyYm9hcmRzLCBzdWNoIGFzIG15IFg2REhSLThHMiAoU3VwZXJTZXJ2ZXIgNjAxNEgtODIpLgorICoKKyAqCVRoZSBvcmlnaW5hbCBpVENPIGRyaXZlciBhcyB3cml0dGVuIGRvZXMgbm90IGFjdHVhbGx5IHJlc2V0IHRoZQorICoJd2F0Y2hkb2cgdGltZXIgb24gdGhlc2UgbWFjaGluZXMsIGFzIGEgcmVzdWx0IHRoZXkgcmVib290IGFmdGVyIGZpdmUKKyAqCW1pbnV0ZXMuCisgKgorICoJTk9URTogWW91IG1heSBsZWF2ZSB0aGUgV2F0Y2hkb2cgZnVuY3Rpb24gZGlzYWJsZWQgaW4gdGhlIFN1cGVyTWljcm8KKyAqCUJJT1MgdG8gYXZvaWQgYSAiYm9vdC1yYWNlIi4uLiBUaGlzIGRyaXZlciB3aWxsIGVuYWJsZSB3YXRjaGRvZworICoJZnVuY3Rpb25hbGl0eSBldmVuIGlmIGl0J3MgZGlzYWJsZWQgaW4gdGhlIEJJT1Mgb25jZSB0aGUgL2Rldi93YXRjaGRvZworICoJZmlsZSBpcyBvcGVuZWQuCisgKi8KKworLyogSS9PIFBvcnQncyAqLworI2RlZmluZSBTTV9SRUdJTkRFWAkweDJlCQkvKiBTdXBlck1pY3JvIElDSDQrIFJlZ2lzdGVyIEluZGV4ICovCisjZGVmaW5lIFNNX0RBVEFJTwkweDJmCQkvKiBTdXBlck1pY3JvIElDSDQrIFJlZ2lzdGVyIERhdGEgSS9PICovCisKKy8qIENvbnRyb2wgUmVnaXN0ZXIncyAqLworI2RlZmluZSBTTV9DVExQQUdFU1cJMHgwNwkJLyogU3VwZXJNaWNybyBJQ0g0KyBDb250cm9sIFBhZ2UgU3dpdGNoICovCisjZGVmaW5lIFNNX0NUTFBBR0UJCTB4MDgJLyogU3VwZXJNaWNybyBJQ0g0KyBDb250cm9sIFBhZ2UgTnVtICovCisKKyNkZWZpbmUgU01fV0FUQ0hFTkFCTEUJMHgzMAkJLyogV2F0Y2hkb2cgZW5hYmxlOiBCaXQgMDogMD1vZmYsIDE9b24gKi8KKworI2RlZmluZSBTTV9XQVRDSFBBR0UJMHg4NwkJLyogV2F0Y2hkb2cgdW5sb2NrIGNvbnRyb2wgcGFnZSAqLworCisjZGVmaW5lIFNNX0VORFdBVENICTB4QUEJCS8qIFdhdGNoZG9nIGxvY2sgY29udHJvbCBwYWdlICovCisKKyNkZWZpbmUgU01fQ09VTlRNT0RFCTB4ZjUJCS8qIFdhdGNoZG9nIGNvdW50IG1vZGUgc2VsZWN0ICovCisJCQkJCS8qIChCaXQgMzogMCA9IHNlY29uZHMsIDEgPSBtaW51dGVzICovCisKKyNkZWZpbmUgU01fV0FUQ0hUSU1FUgkweGY2CQkvKiA4LWJpdHMsIFdhdGNoZG9nIHRpbWVyIGNvdW50ZXIgKFJXKSAqLworCisjZGVmaW5lIFNNX1JFU0VUQ09OVFJPTAkweGY3CQkvKiBXYXRjaGRvZyByZXNldCBjb250cm9sICovCisJCQkJCS8qIEJpdCA2OiB0aW1lciBpcyByZXNldCBieSBrYmQgaW50ZXJydXB0ICovCisJCQkJCS8qIEJpdCA3OiB0aW1lciBpcyByZXNldCBieSBtb3VzZSBpbnRlcnJ1cHQgKi8KKworc3RhdGljIHZvaWQgc3VwZXJtaWNyb19uZXdfdW5sb2NrX3dhdGNoZG9nKHZvaWQpCit7CisJb3V0YihTTV9XQVRDSFBBR0UsIFNNX1JFR0lOREVYKTsJLyogV3JpdGUgMHg4NyB0byBwb3J0IDB4MmUgdHdpY2UgKi8KKwlvdXRiKFNNX1dBVENIUEFHRSwgU01fUkVHSU5ERVgpOworCisJb3V0YihTTV9DVExQQUdFU1csIFNNX1JFR0lOREVYKTsJLyogU3dpdGNoIHRvIHdhdGNoZG9nIGNvbnRyb2wgcGFnZSAqLworCW91dGIoU01fQ1RMUEFHRSwgU01fREFUQUlPKTsKK30KKworc3RhdGljIHZvaWQgc3VwZXJtaWNyb19uZXdfbG9ja193YXRjaGRvZyh2b2lkKQoreworCW91dGIoU01fRU5EV0FUQ0gsIFNNX1JFR0lOREVYKTsKK30KKworc3RhdGljIHZvaWQgc3VwZXJtaWNyb19uZXdfcHJlX3N0YXJ0KHVuc2lnbmVkIGludCBoZWFydGJlYXQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXN1cGVybWljcm9fbmV3X3VubG9ja193YXRjaGRvZygpOworCisJLyogV2F0Y2hkb2cgdGltZXIgc2V0dGluZyBuZWVkcyB0byBiZSBpbiBzZWNvbmRzKi8KKwlvdXRiKFNNX0NPVU5UTU9ERSwgU01fUkVHSU5ERVgpOworCXZhbCA9IGluYihTTV9EQVRBSU8pOworCXZhbCAmPSAweEY3OworCW91dGIodmFsLCBTTV9EQVRBSU8pOworCisJLyogV3JpdGUgaGVhcnRiZWF0IGludGVydmFsIHRvIFdET0cgKi8KKwlvdXRiIChTTV9XQVRDSFRJTUVSLCBTTV9SRUdJTkRFWCk7CisJb3V0YigoaGVhcnRiZWF0ICYgMjU1KSwgU01fREFUQUlPKTsKKworCS8qIE1ha2Ugc3VyZSBrZXlib2FyZC9tb3VzZSBpbnRlcnJ1cHRzIGRvbid0IGludGVyZmVyZSAqLworCW91dGIoU01fUkVTRVRDT05UUk9MLCBTTV9SRUdJTkRFWCk7CisJdmFsID0gaW5iKFNNX0RBVEFJTyk7CisJdmFsICY9IDB4M2Y7CisJb3V0Yih2YWwsIFNNX0RBVEFJTyk7CisKKwkvKiBlbmFibGUgd2F0Y2hkb2cgYnkgc2V0dGluZyBiaXQgMCBvZiBXYXRjaGRvZyBFbmFibGUgdG8gMSAqLworCW91dGIoU01fV0FUQ0hFTkFCTEUsIFNNX1JFR0lOREVYKTsKKwl2YWwgPSBpbmIoU01fREFUQUlPKTsKKwl2YWwgfD0gMHgwMTsKKwlvdXRiKHZhbCwgU01fREFUQUlPKTsKKworCXN1cGVybWljcm9fbmV3X2xvY2tfd2F0Y2hkb2coKTsKK30KKworc3RhdGljIHZvaWQgc3VwZXJtaWNyb19uZXdfcHJlX3N0b3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3VwZXJtaWNyb19uZXdfdW5sb2NrX3dhdGNoZG9nKCk7CisKKwkvKiBkaXNhYmxlIHdhdGNoZG9nIGJ5IHNldHRpbmcgYml0IDAgb2YgV2F0Y2hkb2cgRW5hYmxlIHRvIDAgKi8KKwlvdXRiKFNNX1dBVENIRU5BQkxFLCBTTV9SRUdJTkRFWCk7CisJdmFsID0gaW5iKFNNX0RBVEFJTyk7CisJdmFsICY9IDB4RkU7CisJb3V0Yih2YWwsIFNNX0RBVEFJTyk7CisKKwlzdXBlcm1pY3JvX25ld19sb2NrX3dhdGNoZG9nKCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1cGVybWljcm9fbmV3X3ByZV9zZXRfaGVhcnRiZWF0KHVuc2lnbmVkIGludCBoZWFydGJlYXQpCit7CisJc3VwZXJtaWNyb19uZXdfdW5sb2NrX3dhdGNoZG9nKCk7CisKKwkvKiByZXNldCB3YXRjaGRvZyB0aW1lb3V0IHRvIGhlYXJ0dmVhdCB2YWx1ZSAqLworCW91dGIoU01fV0FUQ0hUSU1FUiwgU01fUkVHSU5ERVgpOworCW91dGIoKGhlYXJ0YmVhdCAmIDI1NSksIFNNX0RBVEFJTyk7CisKKwlzdXBlcm1pY3JvX25ld19sb2NrX3dhdGNoZG9nKCk7Cit9CisKKy8qCisgKglHZW5lcmljIFN1cHBvcnQgRnVuY3Rpb25zCisgKi8KKwordm9pZCBpVENPX3ZlbmRvcl9wcmVfc3RhcnQodW5zaWduZWQgbG9uZyBhY3BpYmFzZSwKKwkJCSAgIHVuc2lnbmVkIGludCBoZWFydGJlYXQpCit7CisJaWYgKHZlbmRvcnN1cHBvcnQgPT0gU1VQRVJNSUNST19PTERfQk9BUkQpCisJCXN1cGVybWljcm9fb2xkX3ByZV9zdGFydChhY3BpYmFzZSk7CisJZWxzZSBpZiAodmVuZG9yc3VwcG9ydCA9PSBTVVBFUk1JQ1JPX05FV19CT0FSRCkKKwkJc3VwZXJtaWNyb19uZXdfcHJlX3N0YXJ0KGhlYXJ0YmVhdCk7Cit9CitFWFBPUlRfU1lNQk9MKGlUQ09fdmVuZG9yX3ByZV9zdGFydCk7CisKK3ZvaWQgaVRDT192ZW5kb3JfcHJlX3N0b3AodW5zaWduZWQgbG9uZyBhY3BpYmFzZSkKK3sKKwlpZiAodmVuZG9yc3VwcG9ydCA9PSBTVVBFUk1JQ1JPX09MRF9CT0FSRCkKKwkJc3VwZXJtaWNyb19vbGRfcHJlX3N0b3AoYWNwaWJhc2UpOworCWVsc2UgaWYgKHZlbmRvcnN1cHBvcnQgPT0gU1VQRVJNSUNST19ORVdfQk9BUkQpCisJCXN1cGVybWljcm9fbmV3X3ByZV9zdG9wKCk7Cit9CitFWFBPUlRfU1lNQk9MKGlUQ09fdmVuZG9yX3ByZV9zdG9wKTsKKwordm9pZCBpVENPX3ZlbmRvcl9wcmVfa2VlcGFsaXZlKHVuc2lnbmVkIGxvbmcgYWNwaWJhc2UsIHVuc2lnbmVkIGludCBoZWFydGJlYXQpCit7CisJaWYgKHZlbmRvcnN1cHBvcnQgPT0gU1VQRVJNSUNST19PTERfQk9BUkQpCisJCXN1cGVybWljcm9fb2xkX3ByZV9rZWVwYWxpdmUoYWNwaWJhc2UpOworCWVsc2UgaWYgKHZlbmRvcnN1cHBvcnQgPT0gU1VQRVJNSUNST19ORVdfQk9BUkQpCisJCXN1cGVybWljcm9fbmV3X3ByZV9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCk7Cit9CitFWFBPUlRfU1lNQk9MKGlUQ09fdmVuZG9yX3ByZV9rZWVwYWxpdmUpOworCit2b2lkIGlUQ09fdmVuZG9yX3ByZV9zZXRfaGVhcnRiZWF0KHVuc2lnbmVkIGludCBoZWFydGJlYXQpCit7CisJaWYgKHZlbmRvcnN1cHBvcnQgPT0gU1VQRVJNSUNST19ORVdfQk9BUkQpCisJCXN1cGVybWljcm9fbmV3X3ByZV9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCk7Cit9CitFWFBPUlRfU1lNQk9MKGlUQ09fdmVuZG9yX3ByZV9zZXRfaGVhcnRiZWF0KTsKKworaW50IGlUQ09fdmVuZG9yX2NoZWNrX25vcmVib290X29uKHZvaWQpCit7CisJc3dpdGNoKHZlbmRvcnN1cHBvcnQpIHsKKwljYXNlIFNVUEVSTUlDUk9fT0xEX0JPQVJEOgorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlUQ09fdmVuZG9yX2NoZWNrX25vcmVib290X29uKTsKKworc3RhdGljIGludCBfX2luaXQgaVRDT192ZW5kb3JfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggInZlbmRvci1zdXBwb3J0PSVkXG4iLCB2ZW5kb3JzdXBwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlUQ09fdmVuZG9yX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJNb2R1bGUgVW5sb2FkZWRcbiIpOworfQorCittb2R1bGVfaW5pdChpVENPX3ZlbmRvcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChpVENPX3ZlbmRvcl9leGl0X21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIldpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+LCBSLiBTZXJldG55IDxsa3BhdGNoZXNAcGF5cGMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBUQ08gVmVuZG9yIFNwZWNpZmljIFdhdGNoRG9nIFRpbWVyIERyaXZlciBTdXBwb3J0Iik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2lUQ09fd2R0LmMKaW5kZXggYWFhYzk0ZC4uN2VhYzkyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2lUQ09fd2R0LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2lUQ09fd2R0LmMKQEAgLTM1LDYgKzM1LDEwIEBACiAgKgk4MjgwMUdESCAoSUNIN0RIKSAgICA6IGRvY3VtZW50IG51bWJlciAzMDcwMTMtMDAyLCAzMDcwMTQtMDA5LAogICoJODI4MDFHQk0gKElDSDctTSkgICAgOiBkb2N1bWVudCBudW1iZXIgMzA3MDEzLTAwMiwgMzA3MDE0LTAwOSwKICAqCTgyODAxR0hNIChJQ0g3LU0gREgpIDogZG9jdW1lbnQgbnVtYmVyIDMwNzAxMy0wMDIsIDMwNzAxNC0wMDksCisgKgk4MjgwMUhCICAoSUNIOCkgICAgICA6IGRvY3VtZW50IG51bWJlciAzMTMwNTYtMDAyLCAzMTMwNTctMDA0LAorICoJODI4MDFIUiAgKElDSDhSKSAgICAgOiBkb2N1bWVudCBudW1iZXIgMzEzMDU2LTAwMiwgMzEzMDU3LTAwNCwKKyAqCTgyODAxSEggIChJQ0g4REgpICAgIDogZG9jdW1lbnQgbnVtYmVyIDMxMzA1Ni0wMDIsIDMxMzA1Ny0wMDQsCisgKgk4MjgwMUhPICAoSUNIOERPKSAgICA6IGRvY3VtZW50IG51bWJlciAzMTMwNTYtMDAyLCAzMTMwNTctMDA0LAogICoJNjMwMEVTQiAgKDYzMDBFU0IpICAgOiBkb2N1bWVudCBudW1iZXIgMzAwNjQxLTAwMwogICovCiAKQEAgLTQ0LDggKzQ4LDggQEAKIAogLyogTW9kdWxlIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiAjZGVmaW5lIERSVl9OQU1FICAgICAgICAiaVRDT193ZHQiCi0jZGVmaW5lIERSVl9WRVJTSU9OICAgICAiMS4wMCIKLSNkZWZpbmUgRFJWX1JFTERBVEUgICAgICIzMC1KdWwtMjAwNiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gICAgICIxLjAxIgorI2RlZmluZSBEUlZfUkVMREFURSAgICAgIjExLU5vdi0yMDA2IgogI2RlZmluZSBQRlgJCURSVl9OQU1FICI6ICIKIAogLyogSW5jbHVkZXMgKi8KQEAgLTg1LDYgKzg5LDkgQEAKIAlUQ09fSUNINywJLyogSUNINyAmIElDSDdSICovCiAJVENPX0lDSDdNLAkvKiBJQ0g3LU0gKi8KIAlUQ09fSUNIN01ESCwJLyogSUNINy1NIERIICovCisJVENPX0lDSDgsCS8qIElDSDggJiBJQ0g4UiAqLworCVRDT19JQ0g4REgsCS8qIElDSDhESCAqLworCVRDT19JQ0g4RE8sCS8qIElDSDhETyAqLwogfTsKIAogc3RhdGljIHN0cnVjdCB7CkBAIC0xMDgsNiArMTE1LDkgQEAKIAl7IklDSDcgb3IgSUNIN1IiLCAyfSwKIAl7IklDSDctTSIsIDJ9LAogCXsiSUNINy1NIERIIiwgMn0sCisJeyJJQ0g4IG9yIElDSDhSIiwgMn0sCisJeyJJQ0g4REgiLCAyfSwKKwl7IklDSDhETyIsIDJ9LAogCXtOVUxMLDB9CiB9OwogCkBAIC0xMzUsNiArMTQ1LDkgQEAKIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUQ09fSUNINyAgICB9LAogCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRDT19JQ0g3TSAgIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzEsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRDT19JQ0g3TURIIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMCwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVENPX0lDSDggICAgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8yLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUQ09fSUNIOERIICB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzMsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRDT19JQ0g4RE8gIH0sCiAJeyAwLCB9LAkJCS8qIEVuZCBvZiBsaXN0ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBpVENPX3dkdF9wY2lfdGJsKTsKQEAgLTE3Niw2ICsxODksMjEgQEAKIG1vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOwogCisvKiBpVENPIFZlbmRvciBTcGVjaWZpYyBTdXBwb3J0IGhvb2tzICovCisjaWZkZWYgQ09ORklHX0lUQ09fVkVORE9SX1NVUFBPUlQKK2V4dGVybiB2b2lkIGlUQ09fdmVuZG9yX3ByZV9zdGFydCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgaVRDT192ZW5kb3JfcHJlX3N0b3AodW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBpVENPX3ZlbmRvcl9wcmVfa2VlcGFsaXZlKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBpVENPX3ZlbmRvcl9wcmVfc2V0X2hlYXJ0YmVhdCh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBpVENPX3ZlbmRvcl9jaGVja19ub3JlYm9vdF9vbih2b2lkKTsKKyNlbHNlCisjZGVmaW5lIGlUQ09fdmVuZG9yX3ByZV9zdGFydChhY3BpYmFzZSwgaGVhcnRiZWF0KQl7fQorI2RlZmluZSBpVENPX3ZlbmRvcl9wcmVfc3RvcChhY3BpYmFzZSkJCQl7fQorI2RlZmluZSBpVENPX3ZlbmRvcl9wcmVfa2VlcGFsaXZlKGFjcGliYXNlLGhlYXJ0YmVhdCkJe30KKyNkZWZpbmUgaVRDT192ZW5kb3JfcHJlX3NldF9oZWFydGJlYXQoaGVhcnRiZWF0KQl7fQorI2RlZmluZSBpVENPX3ZlbmRvcl9jaGVja19ub3JlYm9vdF9vbigpCQkJMQkvKiAxPWNoZWNrIG5vcmVib290OyAwPWRvbid0IGNoZWNrICovCisjZW5kaWYKKwogLyoKICAqIFNvbWUgVENPIHNwZWNpZmljIGZ1bmN0aW9ucwogICovCkBAIC0yMzYsNiArMjY0LDggQEAKIAogCXNwaW5fbG9jaygmaVRDT193ZHRfcHJpdmF0ZS5pb19sb2NrKTsKIAorCWlUQ09fdmVuZG9yX3ByZV9zdGFydChpVENPX3dkdF9wcml2YXRlLkFDUElCQVNFLCBoZWFydGJlYXQpOworCiAJLyogZGlzYWJsZSBjaGlwc2V0J3MgTk9fUkVCT09UIGJpdCAqLwogCWlmIChpVENPX3dkdF91bnNldF9OT19SRUJPT1RfYml0KCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIHJlc2V0IE5PX1JFQk9PVCBmbGFnLCByZWJvb3QgZGlzYWJsZWQgYnkgaGFyZHdhcmVcbiIpOwpAQCAtMjYwLDYgKzI5MCw4IEBACiAKIAlzcGluX2xvY2soJmlUQ09fd2R0X3ByaXZhdGUuaW9fbG9jayk7CiAKKwlpVENPX3ZlbmRvcl9wcmVfc3RvcChpVENPX3dkdF9wcml2YXRlLkFDUElCQVNFKTsKKwogCS8qIEJpdCAxMTogVENPIFRpbWVyIEhhbHQgLT4gMSA9IFRoZSBUQ08gdGltZXIgaXMgZGlzYWJsZWQgKi8KIAl2YWwgPSBpbncoVENPMV9DTlQpOwogCXZhbCB8PSAweDA4MDA7CkBAIC0yODAsNiArMzEyLDggQEAKIHsKIAlzcGluX2xvY2soJmlUQ09fd2R0X3ByaXZhdGUuaW9fbG9jayk7CiAKKwlpVENPX3ZlbmRvcl9wcmVfa2VlcGFsaXZlKGlUQ09fd2R0X3ByaXZhdGUuQUNQSUJBU0UsIGhlYXJ0YmVhdCk7CisKIAkvKiBSZWxvYWQgdGhlIHRpbWVyIGJ5IHdyaXRpbmcgdG8gdGhlIFRDTyBUaW1lciBDb3VudGVyIHJlZ2lzdGVyICovCiAJaWYgKGlUQ09fd2R0X3ByaXZhdGUuaVRDT192ZXJzaW9uID09IDIpIHsKIAkJb3V0dygweDAxLCBUQ09fUkxEKTsKQEAgLTMwNiw2ICszNDAsOCBAQAogCSAgICAoKGlUQ09fd2R0X3ByaXZhdGUuaVRDT192ZXJzaW9uID09IDEpICYmICh0bXJ2YWwgPiAweDAzZikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlUQ09fdmVuZG9yX3ByZV9zZXRfaGVhcnRiZWF0KHRtcnZhbCk7CisKIAkvKiBXcml0ZSBuZXcgaGVhcnRiZWF0IHRvIHdhdGNoZG9nICovCiAJaWYgKGlUQ09fd2R0X3ByaXZhdGUuaVRDT192ZXJzaW9uID09IDIpIHsKIAkJc3Bpbl9sb2NrKCZpVENPX3dkdF9wcml2YXRlLmlvX2xvY2spOwpAQCAtMzU1LDcgKzM5MSw4IEBACiAJCXNwaW5fdW5sb2NrKCZpVENPX3dkdF9wcml2YXRlLmlvX2xvY2spOwogCiAJCSp0aW1lX2xlZnQgPSAodmFsOCAqIDYpIC8gMTA7Ci0JfQorCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDI2LDcgKzQ2Myw2IEBACiB7CiAJaW50IG5ld19vcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOwogCWludCBuZXdfaGVhcnRiZWF0OwotCWludCB0aW1lX2xlZnQ7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IF9fdXNlciAqcCA9IGFyZ3A7CiAJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0gewpAQCAtNDg2LDYgKzUyMiw4IEBACiAKIAkJY2FzZSBXRElPQ19HRVRUSU1FTEVGVDoKIAkJeworCQkJaW50IHRpbWVfbGVmdDsKKwogCQkJaWYgKGlUQ09fd2R0X2dldF90aW1lbGVmdCgmdGltZV9sZWZ0KSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNTU0LDcgKzU5Miw3IEBACiAJfQogCiAJLyogQ2hlY2sgY2hpcHNldCdzIE5PX1JFQk9PVCBiaXQgKi8KLQlpZiAoaVRDT193ZHRfdW5zZXRfTk9fUkVCT09UX2JpdCgpKSB7CisJaWYgKGlUQ09fd2R0X3Vuc2V0X05PX1JFQk9PVF9iaXQoKSAmJiBpVENPX3ZlbmRvcl9jaGVja19ub3JlYm9vdF9vbigpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byByZXNldCBOT19SRUJPT1QgZmxhZywgcmVib290IGRpc2FibGVkIGJ5IGhhcmR3YXJlXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsJLyogQ2Fubm90IHJlc2V0IE5PX1JFQk9PVCBiaXQgKi8KIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL21wY29yZV93ZHQuYwppbmRleCAzNDA0YTljLi5lODg5NDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9tcGNvcmVfd2R0LmMKQEAgLTM0Nyw3ICszNDcsNyBAQAogCQlnb3RvIGVycl9mcmVlOwogCX0KIAotCW1wY29yZV93ZHRfbWlzY2Rldi5kZXYgPSAmZGV2LT5kZXY7CisJbXBjb3JlX3dkdF9taXNjZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZtcGNvcmVfd2R0X21pc2NkZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgX2RldiwgImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL29tYXBfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvb21hcF93ZHQuYwppbmRleCA1ZGJkN2RjLi42YzZmOTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvb21hcF93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvb21hcF93ZHQuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJb21hcF93ZHRfZGlzYWJsZSgpOwogCW9tYXBfd2R0X2FkanVzdF90aW1lb3V0KHRpbWVyX21hcmdpbik7CiAKLQlvbWFwX3dkdF9taXNjZGV2LmRldiA9ICZwZGV2LT5kZXY7CisJb21hcF93ZHRfbWlzY2Rldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJm9tYXBfd2R0X21pc2NkZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wYzg3NDEzX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NDdlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvcGM4NzQxM193ZHQuYwpAQCAtMCwwICsxLDYzNSBAQAorLyoKKyAqICAgICAgTlMgcGM4NzQxMy13ZHQgV2F0Y2hkb2cgVGltZXIgZHJpdmVyIGZvciBMaW51eCAyLjYueC54CisgKgorICogICAgICBUaGlzIGNvZGUgaXMgYmFzZWQgb24gd2R0LmMgd2l0aCBvcmlnaW5hbCBjb3B5cmlnaHQuCisgKgorICogICAgICAoQykgQ29weXJpZ2h0IDIwMDYgU3ZlbiBBbmRlcnMsIDxhbmRlcnNAYW5kdXJhcy5kZT4KKyAqICAgICAgICAgICAgICAgICAgICAgYW5kIE1hcmN1cyBKdW5rZXIsIDxqdW5rZXJAYW5kdXJhcy5kZT4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBOZWl0aGVyIFN2ZW4gQW5kZXJzLCBNYXJjdXMgSnVua2VyIG5vciBBTkRVUkFTIEFHCisgKiAgICAgIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuCisgKiAgICAgIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqICAgICAgUmVsZWFzZSAxLjEKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiAjZGVmaW5lIERFQlVHIDEgKi8KKworI2RlZmluZSBERUZBVUxUX1RJTUVPVVQgICAgIDEgICAgICAgICAgICAvKiAxIG1pbnV0ZSAqLworI2RlZmluZSBNQVhfVElNRU9VVCAgICAgICAgIDI1NQorCisjZGVmaW5lIFZFUlNJT04gICAgICAgICAgICAgIjEuMSIKKyNkZWZpbmUgTU9ETkFNRSAgICAgICAgICAgICAicGM4NzQxMyBXRFQiCisjZGVmaW5lIFBGWCAgICAgICAgICAgICAgICAgTU9ETkFNRSAiOiAiCisjZGVmaW5lIERQRlggICAgICAgICAgICAgICAgTU9ETkFNRSAiIC0gREVCVUc6ICIKKworI2RlZmluZSBXRFRfSU5ERVhfSU9fUE9SVCAgIChpbyswKSAgICAgICAvKiBJL08gcG9ydCBiYXNlIChpbmRleCByZWdpc3RlcikgKi8KKyNkZWZpbmUgV0RUX0RBVEFfSU9fUE9SVCAgICAoV0RUX0lOREVYX0lPX1BPUlQrMSkKKyNkZWZpbmUgU1dDX0xETiAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFNJT0NGRzIgICAgICAgICAgICAgMHgyMiAgICAgICAgIC8qIFNlcmlhbCBJTyByZWdpc3RlciAqLworI2RlZmluZSBXRENUTCAgICAgICAgICAgICAgIDB4MTAgICAgICAgICAvKiBXYXRjaGRvZy1UaW1lci1Db250cm9sbC1SZWdpc3RlciAqLworI2RlZmluZSBXRFRPICAgICAgICAgICAgICAgIDB4MTEgICAgICAgICAvKiBXYXRjaGRvZyB0aW1lb3V0IHJlZ2lzdGVyICovCisjZGVmaW5lIFdEQ0ZHICAgICAgICAgICAgICAgMHgxMiAgICAgICAgIC8qIFdhdGNoZG9nIGNvbmZpZyByZWdpc3RlciAqLworCitzdGF0aWMgaW50IGlvID0gMHgyRTsJCSAgICAgICAgIC8qIEFkZHJlc3MgdXNlZCBvbiBQb3J0d2VsbCBCb2FyZHMgKi8KKworc3RhdGljIGludCB0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUOyAgICAvKiB0aW1lb3V0IHZhbHVlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcl9lbmFibGVkID0gMDsgIC8qIGlzIHRoZSB0aW1lciBlbmFibGVkPyAqLworCitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7ICAgICAgICAgICAgICAgIC8qIGlzIHRoZSBjbG9zZSBleHBlY3RlZD8gKi8KKworc3RhdGljIHNwaW5sb2NrX3QgaW9fbG9jazsgICAgICAgICAgICAgICAvKiB0byBndWFyZCB0aGUgd2F0Y2hkb2cgZnJvbSBpbyByYWNlcyAqLworCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7CisKKy8qIC0tIExvdyBsZXZlbCBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2VsZWN0IHBpbnMgZm9yIFdhdGNoZG9nIG91dHB1dCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19zZWxlY3Rfd2R0X291dCAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3JfZGF0YSA9IDA7CisKKwkvKiBTdGVwIDE6IFNlbGVjdCBtdWx0aXBsZSBwaW4scGluNTUsYXMgV0RUIG91dHB1dCAqLworCisJb3V0Yl9wKFNJT0NGRzIsIFdEVF9JTkRFWF9JT19QT1JUKTsKKworCWNyX2RhdGEgPSBpbmIgKFdEVF9EQVRBX0lPX1BPUlQpOworCisJY3JfZGF0YSB8PSAweDgwOyAvKiBTZXQgQml0NyB0byAxKi8KKwlvdXRiX3AoU0lPQ0ZHMiwgV0RUX0lOREVYX0lPX1BPUlQpOworCisJb3V0Yl9wKGNyX2RhdGEsIFdEVF9EQVRBX0lPX1BPUlQpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9JTkZPIERQRlggIlNlbGVjdCBtdWx0aXBsZSBwaW4scGluNTUsYXMgV0RUIG91dHB1dDoiCisJICAgICAgICAgICAgICAgICAgICAgICIgQml0NyB0byAxOiAlZFxuIiwgY3JfZGF0YSk7CisjZW5kaWYKK30KKworLyogRW5hYmxlIFNXQyBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZW5hYmxlX3N3Yyh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcl9kYXRhPTA7CisKKwkvKiBTdGVwIDI6IEVuYWJsZSBTV0MgZnVuY3Rpb25zICovCisKKwlvdXRiX3AoMHgwNywgV0RUX0lOREVYX0lPX1BPUlQpOyAgICAgICAgLyogUG9pbnQgU1dDX0xETiAoTEROPTQpICovCisJb3V0Yl9wKFNXQ19MRE4sIFdEVF9EQVRBX0lPX1BPUlQpOworCisJb3V0Yl9wKDB4MzAsIFdEVF9JTkRFWF9JT19QT1JUKTsgICAgICAgIC8qIFJlYWQgSW5kZXggMHgzMCBGaXJzdCAqLworCWNyX2RhdGEgPSBpbmIoV0RUX0RBVEFfSU9fUE9SVCk7CisJY3JfZGF0YSB8PSAweDAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBCaXQwIHRvIDEgKi8KKwlvdXRiX3AoMHgzMCwgV0RUX0lOREVYX0lPX1BPUlQpOworCW91dGJfcChjcl9kYXRhLCBXRFRfREFUQV9JT19QT1JUKTsgICAgICAvKiBJbmRleDB4MzBfYml0MFAxICovCisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0lORk8gRFBGWCAicGM4NzQxMyAtIEVuYWJsZSBTV0MgZnVuY3Rpb25zXG4iKTsKKyNlbmRpZgorfQorCisvKiBSZWFkIFNXQyBJL08gYmFzZSBhZGRyZXNzICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBjODc0MTNfZ2V0X3N3Y19iYXNlKHZvaWQpCit7CisJdW5zaWduZWQgaW50ICBzd2NfYmFzZV9hZGRyID0gMDsKKwl1bnNpZ25lZCBjaGFyIGFkZHJfbCwgYWRkcl9oID0gMDsKKworCS8qIFN0ZXAgMzogUmVhZCBTV0MgSS9PIEJhc2UgQWRkcmVzcyAqLworCisJb3V0Yl9wKDB4NjAsIFdEVF9JTkRFWF9JT19QT1JUKTsgICAgICAgIC8qIFJlYWQgSW5kZXggMHg2MCAqLworCWFkZHJfaCA9IGluYihXRFRfREFUQV9JT19QT1JUKTsKKworCW91dGJfcCgweDYxLCBXRFRfSU5ERVhfSU9fUE9SVCk7ICAgICAgICAvKiBSZWFkIEluZGV4IDB4NjEgKi8KKworCWFkZHJfbCA9IGluYihXRFRfREFUQV9JT19QT1JUKTsKKworCXN3Y19iYXNlX2FkZHIgPSAoYWRkcl9oIDw8IDgpICsgYWRkcl9sOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9JTkZPIERQRlggIlJlYWQgU1dDIEkvTyBCYXNlIEFkZHJlc3M6IGxvdyAlZCwgaGlnaCAlZCwiCisJICAgICAgICAgICAgICAgICAgICAgICIgcmVzICVkXG4iLCBhZGRyX2wsIGFkZHJfaCwgc3djX2Jhc2VfYWRkcik7CisjZW5kaWYKKworCXJldHVybiBzd2NfYmFzZV9hZGRyOworfQorCisvKiBTZWxlY3QgQmFuayAzIG9mIFNXQyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19zd2NfYmFuazModW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCit7CisJLyogU3RlcCA0OiBTZWxlY3QgQmFuazMgb2YgU1dDICovCisKKwlvdXRiX3AoaW5iKHN3Y19iYXNlX2FkZHIgKyAweDBmKSB8IDB4MDMsIHN3Y19iYXNlX2FkZHIgKyAweDBmKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyBEUEZYICJTZWxlY3QgQmFuazMgb2YgU1dDXG4iKTsKKyNlbmRpZgorfQorCisvKiBTZXQgd2F0Y2hkb2cgdGltZW91dCB0byB4IG1pbnV0ZXMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfcHJvZ3JhbW1fd2R0byh1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkciwKKwkJCQkJIGNoYXIgcGM4NzQxM190aW1lKQoreworCS8qIFN0ZXAgNTogUHJvZ3JhbW0gV0RUTywgVHdkLiAqLworCisJb3V0Yl9wKHBjODc0MTNfdGltZSwgc3djX2Jhc2VfYWRkciArIFdEVE8pOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoS0VSTl9JTkZPIERQRlggIlNldCBXRFRPIHRvICVkIG1pbnV0ZXNcbiIsIHBjODc0MTNfdGltZSk7CisjZW5kaWYKK30KKworLyogRW5hYmxlIFdERU4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZW5hYmxlX3dkZW4odW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCit7CisJLyogU3RlcCA2OiBFbmFibGUgV0RFTiAqLworCisJb3V0Yl9wKGluYiAoc3djX2Jhc2VfYWRkciArIFdEQ1RMKSB8IDB4MDEsIHN3Y19iYXNlX2FkZHIgKyBXRENUTCk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0lORk8gRFBGWCAiRW5hYmxlIFdERU5cbiIpOworI2VuZGlmCit9CisKKy8qIEVuYWJsZSBTV19XRF9UUkVOICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19lbmFibGVfc3dfd2RfdHJlbih1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcikKK3sKKwkvKiBFbmFibGUgU1dfV0RfVFJFTiAqLworCisJb3V0Yl9wKGluYiAoc3djX2Jhc2VfYWRkciArIFdEQ0ZHKSB8IDB4ODAsIHN3Y19iYXNlX2FkZHIgKyBXRENGRyk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0lORk8gRFBGWCAiRW5hYmxlIFNXX1dEX1RSRU5cbiIpOworI2VuZGlmCit9CisKKy8qIERpc2FibGUgU1dfV0RfVFJFTiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZW4odW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCit7CisJLyogRGlzYWJsZSBTV19XRF9UUkVOICovCisKKwlvdXRiX3AoaW5iIChzd2NfYmFzZV9hZGRyICsgV0RDRkcpICYgMHg3Ziwgc3djX2Jhc2VfYWRkciArIFdEQ0ZHKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyBEUEZYICJwYzg3NDEzIC0gRGlzYWJsZSBTV19XRF9UUkVOXG4iKTsKKyNlbmRpZgorfQorCisvKiBFbmFibGUgU1dfV0RfVFJHICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2VuYWJsZV9zd193ZF90cmcodW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCit7CisJLyogRW5hYmxlIFNXX1dEX1RSRyAqLworCisJb3V0Yl9wKGluYiAoc3djX2Jhc2VfYWRkciArIFdEQ1RMKSB8IDB4ODAsIHN3Y19iYXNlX2FkZHIgKyBXRENUTCk7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0lORk8gRFBGWCAicGM4NzQxMyAtIEVuYWJsZSBTV19XRF9UUkdcbiIpOworI2VuZGlmCit9CisKKy8qIERpc2FibGUgU1dfV0RfVFJHICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJnKHVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyKQoreworCS8qIERpc2FibGUgU1dfV0RfVFJHICovCisKKwlvdXRiX3AoaW5iIChzd2NfYmFzZV9hZGRyICsgV0RDVEwpICYgMHg3Ziwgc3djX2Jhc2VfYWRkciArIFdEQ1RMKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyBEUEZYICJEaXNhYmxlIFNXX1dEX1RSR1xuIik7CisjZW5kaWYKK30KKworLyogLS0gSGlnaGVyIGxldmVsIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFbmFibGUgdGhlIHdhdGNoZG9nICovCisKK3N0YXRpYyB2b2lkIHBjODc0MTNfZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHI7CisKKwlzcGluX2xvY2soJmlvX2xvY2spOworCisJcGM4NzQxM19zZWxlY3Rfd2R0X291dCgpOworCXBjODc0MTNfZW5hYmxlX3N3YygpOworCXN3Y19iYXNlX2FkZHIgPSBwYzg3NDEzX2dldF9zd2NfYmFzZSgpOworCXBjODc0MTNfc3djX2JhbmszKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfcHJvZ3JhbW1fd2R0byhzd2NfYmFzZV9hZGRyLCB0aW1lb3V0KTsKKwlwYzg3NDEzX2VuYWJsZV93ZGVuKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZW4oc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19lbmFibGVfc3dfd2RfdHJnKHN3Y19iYXNlX2FkZHIpOworCisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworfQorCisvKiBEaXNhYmxlIHRoZSB3YXRjaGRvZyAqLworCitzdGF0aWMgdm9pZCBwYzg3NDEzX2Rpc2FibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcjsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisKKwlwYzg3NDEzX3NlbGVjdF93ZHRfb3V0KCk7CisJcGM4NzQxM19lbmFibGVfc3djKCk7CisJc3djX2Jhc2VfYWRkciA9IHBjODc0MTNfZ2V0X3N3Y19iYXNlKCk7CisJcGM4NzQxM19zd2NfYmFuazMoc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZW4oc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZyhzd2NfYmFzZV9hZGRyKTsKKwlwYzg3NDEzX3Byb2dyYW1tX3dkdG8oc3djX2Jhc2VfYWRkciwgMCk7CisKKwlzcGluX3VubG9jaygmaW9fbG9jayk7Cit9CisKKy8qIFJlZnJlc2ggdGhlIHdhdGNoZG9nICovCisKK3N0YXRpYyB2b2lkIHBjODc0MTNfcmVmcmVzaCh2b2lkKQoreworCXVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyOworCisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKworCXBjODc0MTNfc2VsZWN0X3dkdF9vdXQoKTsKKwlwYzg3NDEzX2VuYWJsZV9zd2MoKTsKKwlzd2NfYmFzZV9hZGRyID0gcGM4NzQxM19nZXRfc3djX2Jhc2UoKTsKKwlwYzg3NDEzX3N3Y19iYW5rMyhzd2NfYmFzZV9hZGRyKTsKKwlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJlbihzd2NfYmFzZV9hZGRyKTsKKwlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJnKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfcHJvZ3JhbW1fd2R0byhzd2NfYmFzZV9hZGRyLCB0aW1lb3V0KTsKKwlwYzg3NDEzX2VuYWJsZV93ZGVuKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZW4oc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19lbmFibGVfc3dfd2RfdHJnKHN3Y19iYXNlX2FkZHIpOworCisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworfQorCisvKiAtLSBGaWxlIG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICoJcGM4NzQxM19vcGVuOgorICoJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBkZXZpY2UKKyAqCisgKi8KKworc3RhdGljIGludCBwYzg3NDEzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogL2Rldi93YXRjaGRvZyBjYW4gb25seSBiZSBvcGVuZWQgb25jZSAqLworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnRpbWVyX2VuYWJsZWQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKG5vd2F5b3V0KQorCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJLyogUmVsb2FkIGFuZCBhY3RpdmF0ZSB0aW1lciAqLworCXBjODc0MTNfcmVmcmVzaCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyBNT0ROQU1FICJXYXRjaGRvZyBlbmFibGVkLiBUaW1lb3V0IHNldCB0byIKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCBtaW51dGUocykuXG4iLCB0aW1lb3V0KTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworLyoqCisgKglwYzg3NDEzX3JlbGVhc2U6CisgKglAaW5vZGU6IGlub2RlIHRvIGJvYXJkCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gYm9hcmQKKyAqCisgKglUaGUgd2F0Y2hkb2cgaGFzIGEgY29uZmlndXJhYmxlIEFQSS4gVGhlcmUgaXMgYSByZWxpZ2lvdXMgZGlzcHV0ZQorICoJYmV0d2VlbiBwZW9wbGUgd2hvIHdhbnQgdGhlaXIgd2F0Y2hkb2cgdG8gYmUgYWJsZSB0byBzaHV0IGRvd24gYW5kCisgKgl0aG9zZSB3aG8gd2FudCB0byBiZSBzdXJlIGlmIHRoZSB3YXRjaGRvZyBtYW5hZ2VyIGRpZXMgdGhlIG1hY2hpbmUKKyAqCXJlYm9vdHMuIEluIHRoZSBmb3JtZXIgY2FzZSB3ZSBkaXNhYmxlIHRoZSBjb3VudGVycywgaW4gdGhlIGxhdHRlcgorICoJY2FzZSB5b3UgaGF2ZSB0byBvcGVuIGl0IGFnYWluIHZlcnkgc29vbi4KKyAqLworCitzdGF0aWMgaW50IHBjODc0MTNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBTaHV0IG9mZiB0aGUgdGltZXIuICovCisKKwlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCXBjODc0MTNfZGlzYWJsZSgpOworCQlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGRpc2FibGVkLCIKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICIgc2xlZXBpbmcgYWdhaW4uLi5cbiIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgTU9ETkFNRSAiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgIiB3YXRjaGRvZyFcbiIpOworCQlwYzg3NDEzX3JlZnJlc2goKTsKKwl9CisKKwljbGVhcl9iaXQoMCwgJnRpbWVyX2VuYWJsZWQpOworCWV4cGVjdF9jbG9zZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglwYzg3NDEzX3N0YXR1czoKKyAqCisgKiAgICAgIHJldHVybiwgaWYgdGhlIHdhdGNoZG9nIGlzIGVuYWJsZWQgKHRpbWVvdXQgaXMgc2V0Li4uKQorICovCisKKworc3RhdGljIGludCBwYzg3NDEzX3N0YXR1cyh2b2lkKQoreworCSAgcmV0dXJuIDA7IC8qIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkICovCit9CisKKy8qKgorICoJcGM4NzQxM193cml0ZToKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKKyAqCUBkYXRhOiBkYXRhIGJ1ZmZlciB0byB3cml0ZQorICoJQGxlbjogbGVuZ3RoIGluIGJ5dGVzCisgKglAcHBvczogcG9pbnRlciB0byB0aGUgcG9zaXRpb24gdG8gd3JpdGUuIE5vIHNlZWtzIGFsbG93ZWQKKyAqCisgKglBIHdyaXRlIHRvIGEgd2F0Y2hkb2cgZGV2aWNlIGlzIGRlZmluZWQgYXMgYSBrZWVwYWxpdmUgc2lnbmFsLiBBbnkKKyAqCXdyaXRlIG9mIGRhdGEgd2lsbCBkbywgYXMgd2Ugd2UgZG9uJ3QgZGVmaW5lIGNvbnRlbnQgbWVhbmluZy4KKyAqLworCitzdGF0aWMgc3NpemVfdCBwYzg3NDEzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCS8qIFNlZSBpZiB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAnVicgYW5kIHJlbG9hZCB0aGUgdGltZXIgKi8KKwlpZiAobGVuKSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiByZXNldCBleHBlY3QgZmxhZyAqLworCQkJZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJLyogc2NhbiB0byBzZWUgd2hldGhlciBvciBub3Qgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgKi8KKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGRhdGEraSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVsb2FkIHRoZSB0aW1lciAqLworCQlwYzg3NDEzX3JlZnJlc2goKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKglwYzg3NDEzX2lvY3RsOgorICoJQGlub2RlOiBpbm9kZSBvZiB0aGUgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIGRldmljZQorICoJQGNtZDogd2F0Y2hkb2cgY29tbWFuZAorICoJQGFyZzogYXJndW1lbnQgcG9pbnRlcgorICoKKyAqCVRoZSB3YXRjaGRvZyBBUEkgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgZnVuY3Rpb25zIGZvciBhbGwgd2F0Y2hkb2dzCisgKglhY2NvcmRpbmcgdG8gdGhlaXIgYXZhaWxhYmxlIGZlYXR1cmVzLiBXZSBvbmx5IGFjdHVhbGx5IHVzZWZ1bGx5IHN1cHBvcnQKKyAqCXF1ZXJ5aW5nIGNhcGFiaWxpdGllcyBhbmQgY3VycmVudCBzdGF0dXMuCisgKi8KKworc3RhdGljIGludCBwYzg3NDEzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBuZXdfdGltZW91dDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHdhdGNoZG9nX2luZm8gX191c2VyICppZGVudDsKKwkJaW50IF9fdXNlciAqaTsKKwl9IHVhcmc7CisKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zICAgICAgICAgID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8CisJCSAgICAgICAgICAgICAgICAgICAgV0RJT0ZfU0VUVElNRU9VVCB8CisJCSAgICAgICAgICAgICAgICAgICAgV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPSAxLAorCQkuaWRlbnRpdHkgICAgICAgICA9ICJQQzg3NDEzKEhGL0YpIHdhdGNoZG9nIgorCX07CisKKwl1YXJnLmkgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCXN3aXRjaChjbWQpIHsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PVFRZOworCisJCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIodWFyZy5pZGVudCwgJmlkZW50LAorCQkJCXNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwkJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIocGM4NzQxM19zdGF0dXMoKSwgdWFyZy5pKTsKKworCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgdWFyZy5pKTsKKworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXBjODc0MTNfcmVmcmVzaCgpOworI2lmZGVmIERFQlVHCisJICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gRFBGWCAia2VlcGFsaXZlXG4iKTsKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQkJaWYgKGdldF91c2VyKG5ld190aW1lb3V0LCB1YXJnLmkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkvLyB0aGUgQVBJIHN0YXRlcyB0aGlzIGlzIGdpdmVuIGluIHNlY3MKKwkJCW5ld190aW1lb3V0IC89IDYwOworCisJCQlpZiAobmV3X3RpbWVvdXQgPCAwIHx8IG5ld190aW1lb3V0ID4gTUFYX1RJTUVPVVQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXRpbWVvdXQgPSBuZXdfdGltZW91dDsKKwkJCXBjODc0MTNfcmVmcmVzaCgpOworCisJCQkvLyBmYWxsIHRocm91Z2ggYW5kIHJldHVybiB0aGUgbmV3IHRpbWVvdXQuLi4KKworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisKKwkJICAgICAgICBuZXdfdGltZW91dCA9IHRpbWVvdXQgKiA2MDsKKworCQkJcmV0dXJuIHB1dF91c2VyKG5ld190aW1lb3V0LCB1YXJnLmkpOworCisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmIChnZXRfdXNlcihvcHRpb25zLCB1YXJnLmkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkgICAgICAgIHBjODc0MTNfZGlzYWJsZSgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCXBjODc0MTNfZW5hYmxlKCk7CisJCQkJcmV0dmFsID0gMDsKKwkJCX0KKworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KK30KKworLyogLS0gTm90aWZpZXIgZnVudGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqCW5vdGlmeV9zeXM6CisgKglAdGhpczogb3VyIG5vdGlmaWVyIGJsb2NrCisgKglAY29kZTogdGhlIGV2ZW50IGJlaW5nIHJlcG9ydGVkCisgKglAdW51c2VkOiB1bnVzZWQKKyAqCisgKglPdXIgbm90aWZpZXIgaXMgY2FsbGVkIG9uIHN5c3RlbSBzaHV0ZG93bnMuIFdlIHdhbnQgdG8gdHVybiB0aGUgY2FyZAorICoJb2ZmIGF0IHJlYm9vdCBvdGhlcndpc2UgdGhlIG1hY2hpbmUgd2lsbCByZWJvb3QgYWdhaW4gZHVyaW5nIG1lbW9yeQorICoJdGVzdCBvciB3b3JzZSB5ZXQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgZnNjay4gVGhpcyB3b3VsZCBzdWNrLCBpbiBmYWN0CisgKgl0cnVzdCBtZSAtIGlmIGl0IGhhcHBlbnMgaXQgZG9lcyBzdWNrLgorICovCisKK3N0YXRpYyBpbnQgcGM4NzQxM19ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29kZSwKKwkJCSAgICAgIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCXsKKwkJLyogVHVybiB0aGUgY2FyZCBvZmYgKi8KKwkJcGM4NzQxM19kaXNhYmxlKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyogLS0gTW9kdWxlJ3Mgc3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwYzg3NDEzX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBwYzg3NDEzX3dyaXRlLAorCS5pb2N0bAkJPSBwYzg3NDEzX2lvY3RsLAorCS5vcGVuCQk9IHBjODc0MTNfb3BlbiwKKwkucmVsZWFzZQk9IHBjODc0MTNfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGM4NzQxM19ub3RpZmllciA9Cit7CisJLm5vdGlmaWVyX2NhbGwgID0gcGM4NzQxM19ub3RpZnlfc3lzLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHBjODc0MTNfbWlzY2Rldj0KK3sKKwkubWlub3IgICAgICAgICAgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSAgICAgICAgICAgPSAid2F0Y2hkb2ciLAorCS5mb3BzICAgICAgICAgICA9ICZwYzg3NDEzX2ZvcHMKK307CisKKy8qIC0tIE1vZHVsZSBpbml0IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiAJcGM4NzQxM19pbml0OiBtb2R1bGUncyAiY29uc3RydWN0b3IiCisgKgorICoJU2V0IHVwIHRoZSBXRFQgd2F0Y2hkb2cgYm9hcmQuIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIGdyYWIgdGhlCisgKglyZXNvdXJjZXMgd2UgcmVxdWlyZSBhbmQgYml0Y2ggaWYgYW55b25lIGJlYXQgdXMgdG8gdGhlbS4KKyAqCVRoZSBvcGVuKCkgZnVuY3Rpb24gd2lsbCBhY3R1YWxseSBraWNrIHRoZSBib2FyZCBvZmYuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcGM4NzQxM19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pbml0KCZpb19sb2NrKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJWZXJzaW9uICIgVkVSU0lPTiAiIGF0IGlvIDB4JVhcbiIsIFdEVF9JTkRFWF9JT19QT1JUKTsKKworCS8qIHJlcXVlc3RfcmVnaW9uKGlvLCAyLCAicGM4NzQxMyIpOyAqLworCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYzg3NDEzX25vdGlmaWVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJfQorCisJcmV0ID0gbWlzY19yZWdpc3RlcigmcGM4NzQxM19taXNjZGV2KTsKKworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGM4NzQxM19ub3RpZmllcik7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiB0aW1lb3V0PSVkIG1pbiBcbiIsIHRpbWVvdXQpOworCisJcGM4NzQxM19lbmFibGUoKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXBjODc0MTNfZXhpdDogbW9kdWxlJ3MgImRlc3RydWN0b3IiCisgKgorICoJVW5sb2FkIHRoZSB3YXRjaGRvZy4gWW91IGNhbm5vdCBkbyB0aGlzIHdpdGggYW55IGZpbGUgaGFuZGxlcyBvcGVuLgorICoJSWYgeW91ciB3YXRjaGRvZyBpcyBzZXQgdG8gY29udGludWUgdGlja2luZyBvbiBjbG9zZSBhbmQgeW91IHVubG9hZAorICoJaXQsIHdlbGwgaXQga2VlcHMgdGlja2luZy4gV2Ugd29uJ3QgZ2V0IHRoZSBpbnRlcnJ1cHQgYnV0IHRoZSBib2FyZAorICoJd2lsbCBub3QgdG91Y2ggUEMgbWVtb3J5IHNvIGFsbCBpcyBmaW5lLiBZb3UganVzdCBoYXZlIHRvIGxvYWQgYSBuZXcKKyAqCW1vZHVsZSBpbiA2MCBzZWNvbmRzIG9yIHJlYm9vdC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGM4NzQxM19leGl0KHZvaWQpCit7CisJLyogU3RvcCB0aGUgdGltZXIgYmVmb3JlIHdlIGxlYXZlICovCisJaWYgKCFub3dheW91dCkKKwl7CisJCXBjODc0MTNfZGlzYWJsZSgpOworCQlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGRpc2FibGVkLlxuIik7CisJfQorCisJbWlzY19kZXJlZ2lzdGVyKCZwYzg3NDEzX21pc2NkZXYpOworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYzg3NDEzX25vdGlmaWVyKTsKKwkvKiByZWxlYXNlX3JlZ2lvbihpbywyKTsgKi8KKworCXByaW50ayhNT0ROQU1FICIgd2F0Y2hkb2cgY29tcG9uZW50IGRyaXZlciByZW1vdmVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KHBjODc0MTNfaW5pdCk7Cittb2R1bGVfZXhpdChwYzg3NDEzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+LCBNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4sIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDODc0MTMgV0RUIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sIE1PRE5BTUUgIiBJL08gcG9ydCAoZGVmYXVsdDogIiBfX01PRFVMRV9TVFJJTkcoaW8pICIpLiIpOworCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gbWludXRlcyAoZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyh0aW1lb3V0KSAiKS4iKTsKKworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9wY3dkX3VzYi5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Bjd2RfdXNiLmMKaW5kZXggYmRhNDUzMy4uMmRhNWFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Bjd2RfdXNiLmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Bjd2RfdXNiLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CQkvKiBGb3IgSElEX1JFUV9TRVRfUkVQT1JUICYgSElEX0RUX1JFUE9SVCAqLwogCiAKICNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCkBAIC0xMDksMTAgKzExMCw2IEBACiAjZGVmaW5lIENNRF9FTkFCTEVfV0FUQ0hET0cJCTB4MzAJLyogRW5hYmxlIC8gRGlzYWJsZSBXYXRjaGRvZyAqLwogI2RlZmluZSBDTURfRElTQUJMRV9XQVRDSERPRwkJQ01EX0VOQUJMRV9XQVRDSERPRwogCi0vKiBTb21lIGRlZmluZXMgdGhhdCBJIGxpa2UgdG8gYmUgc29tZXdoZXJlIGVsc2UgbGlrZSBpbmNsdWRlL2xpbnV4L3VzYl9oaWQuaCAqLwotI2RlZmluZSBISURfUkVRX1NFVF9SRVBPUlQJCTB4MDkKLSNkZWZpbmUgSElEX0RUX1JFUE9SVAkJCShVU0JfVFlQRV9DTEFTUyB8IDB4MDIpCi0KIC8qIFdlIGNhbiBvbmx5IHVzZSAxIGNhcmQgZHVlIHRvIHRoZSAvZGV2L3dhdGNoZG9nIHJlc3RyaWN0aW9uICovCiBzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOwogCkBAIC01NjEsOCArNTU4LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIHVzYl9wY3dkX2RlbGV0ZSAoc3RydWN0IHVzYl9wY3dkX3ByaXZhdGUgKnVzYl9wY3dkKQogewotCWlmICh1c2JfcGN3ZC0+aW50cl91cmIgIT0gTlVMTCkKLQkJdXNiX2ZyZWVfdXJiICh1c2JfcGN3ZC0+aW50cl91cmIpOworCXVzYl9mcmVlX3VyYih1c2JfcGN3ZC0+aW50cl91cmIpOwogCWlmICh1c2JfcGN3ZC0+aW50cl9idWZmZXIgIT0gTlVMTCkKIAkJdXNiX2J1ZmZlcl9mcmVlKHVzYl9wY3dkLT51ZGV2LCB1c2JfcGN3ZC0+aW50cl9zaXplLAogCQkJCXVzYl9wY3dkLT5pbnRyX2J1ZmZlciwgdXNiX3Bjd2QtPmludHJfZG1hKTsKQEAgLTYzNSw3ICs2MzEsNyBAQAogCXVzYl9wY3dkLT5pbnRyX3NpemUgPSAobGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA+IDggPyBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpIDogOCk7CiAKIAkvKiBzZXQgdXAgdGhlIG1lbW9yeSBidWZmZXIncyAqLwotCWlmICghKHVzYl9wY3dkLT5pbnRyX2J1ZmZlciA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgdXNiX3Bjd2QtPmludHJfc2l6ZSwgU0xBQl9BVE9NSUMsICZ1c2JfcGN3ZC0+aW50cl9kbWEpKSkgeworCWlmICghKHVzYl9wY3dkLT5pbnRyX2J1ZmZlciA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgdXNiX3Bjd2QtPmludHJfc2l6ZSwgR0ZQX0FUT01JQywgJnVzYl9wY3dkLT5pbnRyX2RtYSkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIk91dCBvZiBtZW1vcnlcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9ybTlrX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3JtOWtfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3NmExMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9ybTlrX3dkdC5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogIFdhdGNoZG9nIGltcGxlbWVudGF0aW9uIGZvciBHUEkgaC93IGZvdW5kIG9uIFBNQy1TaWVycmEgUk05eHh4CisgKiAgY2hpcHMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBCYXNsZXIgVmlzaW9uIFRlY2hub2xvZ2llcyBBRworICogIEF1dGhvcjogVGhvbWFzIEtvZWxsZXIgPHRob21hcy5rb2VsbGVyQGJhc2xlcndlYi5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3JtOWstb2NkLmg+CisKKyNpbmNsdWRlIDxybTlrX3dkdC5oPgorCisKKyNkZWZpbmUgQ0xPQ0sgICAgICAgICAgICAgICAgICAxMjUwMDAwMDAKKyNkZWZpbmUgTUFYX1RJTUVPVVRfU0VDT05EUyAgICAzMgorI2RlZmluZSBDUENDUiAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBDUEdJRzFTUiAgICAgICAgICAgICAgIDB4MDA0NAorI2RlZmluZSBDUEdJRzFFUiAgICAgICAgICAgICAgIDB4MDA1NAorCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB3ZHRfZ3BpX2lycWhkbChpbnQsIHZvaWQgKik7CitzdGF0aWMgdm9pZCB3ZHRfZ3BpX3N0YXJ0KHZvaWQpOworc3RhdGljIHZvaWQgd2R0X2dwaV9zdG9wKHZvaWQpOworc3RhdGljIHZvaWQgd2R0X2dwaV9zZXRfdGltZW91dCh1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCB3ZHRfZ3BpX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCB3ZHRfZ3BpX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIHNzaXplX3Qgd2R0X2dwaV93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBsb25nIHdkdF9ncGlfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbnQgd2R0X2dwaV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlICp3ZHRfZ3BpX2dldF9yZXNvdXJjZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgX19pbml0IHdkdF9ncGlfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKK3N0YXRpYyBpbnQgX19leGl0IHdkdF9ncGlfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKik7CisKKworc3RhdGljIGNvbnN0IGNoYXIgd2R0X2dwaV9uYW1lW10gPSAid2R0X2dwaSI7CitzdGF0aWMgYXRvbWljX3Qgb3BlbmNudDsKK3N0YXRpYyBpbnQgZXhwZWN0X2Nsb3NlOworc3RhdGljIGludCBsb2NrZWQ7CisKKworLyogVGhlc2UgYXJlIHNldCBmcm9tIGRldmljZSByZXNvdXJjZXMgKi8KK3N0YXRpYyB2b2lkIF9faW9tZW0gKiB3ZF9yZWdzOworc3RhdGljIHVuc2lnbmVkIGludCB3ZF9pcnEsIHdkX2N0cjsKKworCisvKiBNb2R1bGUgYXJndW1lbnRzICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSBNQVhfVElNRU9VVF9TRUNPTkRTOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMiKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzZXRhZGRyID0gMHhiZmZkYzIwMDsKK21vZHVsZV9wYXJhbShyZXNldGFkZHIsIHVsb25nLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVzZXRhZGRyLCAiQWRkcmVzcyB0byB3cml0ZSB0byB0byBmb3JjZSBhIHJlc2V0Iik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZsYWdhZGRyID0gMHhiZmZkYzEwNDsKK21vZHVsZV9wYXJhbShmbGFnYWRkciwgdWxvbmcsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhmbGFnYWRkciwgIkFkZHJlc3MgdG8gd3JpdGUgdG8gYm9vdCBmbGFncyB0byIpOworCitzdGF0aWMgaW50IHBvd2VyY3ljbGU7Cittb2R1bGVfcGFyYW0ocG93ZXJjeWNsZSwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvd2VyY3ljbGUsICJDeWNsZSBwb3dlciBpZiB3YXRjaGRvZyBleHBpcmVzIik7CisKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK21vZHVsZV9wYXJhbShub3dheW91dCwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIGRpc2FibGVkIG9uY2Ugc3RhcnRlZCIpOworCisKKy8qIEtlcm5lbCBpbnRlcmZhY2VzICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB3ZHRfZ3BpX29wZW4sCisJLnJlbGVhc2UJPSB3ZHRfZ3BpX3JlbGVhc2UsCisJLndyaXRlCQk9IHdkdF9ncGlfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsCT0gd2R0X2dwaV9pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2ID0geworCS5taW5vcgkJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQkJPSB3ZHRfZ3BpX25hbWUsCisJLmZvcHMJCT0gJmZvcHMsCit9OworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHdkdF9ncGlfc2h1dGRvd24gPSB7CisJLm5vdGlmaWVyX2NhbGwJPSB3ZHRfZ3BpX25vdGlmeSwKK307CisKKworLyogSW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB3ZHRfZ3BpX2lycWhkbChpbnQgaXJxLCB2b2lkICpjdHh0KQoreworCWlmICghdW5saWtlbHkoX19yYXdfcmVhZGwod2RfcmVncyArIDB4MDAwOCkgJiAweDEpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJX19yYXdfd3JpdGVsKDB4MSwgd2RfcmVncyArIDB4MDAwOCk7CisKKworCXByaW50ayhLRVJOX0NSSVQgIiVzOiB3YXRjaGRvZyBleHBpcmVkIC0gcmVzZXR0aW5nIHN5c3RlbVxuIiwKKwkJd2R0X2dwaV9uYW1lKTsKKworCSoodm9sYXRpbGUgY2hhciAqKSBmbGFnYWRkciB8PSAweDAxOworCSoodm9sYXRpbGUgY2hhciAqKSByZXNldGFkZHIgPSBwb3dlcmN5Y2xlID8gMHgwMSA6IDB4MjsKKwlpb2IoKTsKKwl3aGlsZSAoMSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKKworLyogV2F0Y2hkb2cgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCB3ZHRfZ3BpX3N0YXJ0KHZvaWQpCit7CisJdTMyIHJlZzsKKworCWxvY2tfdGl0YW5fcmVncygpOworCXJlZyA9IHRpdGFuX3JlYWRsKENQR0lHMUVSKTsKKwl0aXRhbl93cml0ZWwocmVnIHwgKDB4MTAwIDw8IHdkX2N0ciksIENQR0lHMUVSKTsKKwlpb2IoKTsKKwl1bmxvY2tfdGl0YW5fcmVncygpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfZ3BpX3N0b3Aodm9pZCkKK3sKKwl1MzIgcmVnOworCisJbG9ja190aXRhbl9yZWdzKCk7CisJcmVnID0gdGl0YW5fcmVhZGwoQ1BDQ1IpICYgfigweGYgPDwgKHdkX2N0ciAqIDQpKTsKKwl0aXRhbl93cml0ZWwocmVnLCBDUENDUik7CisJcmVnID0gdGl0YW5fcmVhZGwoQ1BHSUcxRVIpOworCXRpdGFuX3dyaXRlbChyZWcgJiB+KDB4MTAwIDw8IHdkX2N0ciksIENQR0lHMUVSKTsKKwlpb2IoKTsKKwl1bmxvY2tfdGl0YW5fcmVncygpOworfQorCitzdGF0aWMgdm9pZCB3ZHRfZ3BpX3NldF90aW1lb3V0KHVuc2lnbmVkIGludCB0bykKK3sKKwl1MzIgcmVnOworCWNvbnN0IHUzMiB3ZHZhbCA9ICh0byAqIENMT0NLKSAmIH4weDAwMDAwMDBmOworCisJbG9ja190aXRhbl9yZWdzKCk7CisJcmVnID0gdGl0YW5fcmVhZGwoQ1BDQ1IpICYgfigweGYgPDwgKHdkX2N0ciAqIDQpKTsKKwl0aXRhbl93cml0ZWwocmVnLCBDUENDUik7CisJd21iKCk7CisJX19yYXdfd3JpdGVsKHdkdmFsLCB3ZF9yZWdzICsgMHgwMDAwKTsKKwl3bWIoKTsKKwl0aXRhbl93cml0ZWwocmVnIHwgKDB4MiA8PCAod2RfY3RyICogNCkpLCBDUENDUik7CisJd21iKCk7CisJdGl0YW5fd3JpdGVsKHJlZyB8ICgweDUgPDwgKHdkX2N0ciAqIDQpKSwgQ1BDQ1IpOworCWlvYigpOworCXVubG9ja190aXRhbl9yZWdzKCk7Cit9CisKKworLyogL2Rldi93YXRjaGRvZyBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IHdkdF9ncGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmVzOworCisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfaWZfcG9zaXRpdmUoJm9wZW5jbnQpIDwgMCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlleHBlY3RfY2xvc2UgPSAwOworCWlmIChsb2NrZWQpIHsKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCWZyZWVfaXJxKHdkX2lycSwgJm1pc2NkZXYpOworCQlsb2NrZWQgPSAwOworCX0KKworCXJlcyA9IHJlcXVlc3RfaXJxKHdkX2lycSwgd2R0X2dwaV9pcnFoZGwsIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULAorCQkJICB3ZHRfZ3BpX25hbWUsICZtaXNjZGV2KTsKKwlpZiAodW5saWtlbHkocmVzKSkKKwkJcmV0dXJuIHJlczsKKworCXdkdF9ncGlfc2V0X3RpbWVvdXQodGltZW91dCk7CisJd2R0X2dwaV9zdGFydCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdhdGNoZG9nIHN0YXJ0ZWQsIHRpbWVvdXQgPSAldSBzZWNvbmRzXG4iLAorCQl3ZHRfZ3BpX25hbWUsIHRpbWVvdXQpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCB3ZHRfZ3BpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKG5vd2F5b3V0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyB3YXkgb3V0IC0gd2F0Y2hkb2cgbGVmdCBydW5uaW5nXG4iLAorCQkJd2R0X2dwaV9uYW1lKTsKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwkJbG9ja2VkID0gMTsKKwl9IGVsc2UgeworCQlpZiAoZXhwZWN0X2Nsb3NlKSB7CisJCQl3ZHRfZ3BpX3N0b3AoKTsKKwkJCWZyZWVfaXJxKHdkX2lycSwgJm1pc2NkZXYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdhdGNoZG9nIHN0b3BwZWRcbiIsIHdkdF9ncGlfbmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9DUklUICIlczogdW5leHBlY3RlZCBjbG9zZSgpIC0iCisJCQkJIiB3YXRjaGRvZyBsZWZ0IHJ1bm5pbmdcbiIsCisJCQkJd2R0X2dwaV9uYW1lKTsKKwkJCXdkdF9ncGlfc2V0X3RpbWVvdXQodGltZW91dCk7CisJCQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCQkJbG9ja2VkID0gMTsKKwkJfQorCX0KKworCWF0b21pY19pbmMoJm9wZW5jbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAord2R0X2dwaV93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciBfX3VzZXIgKmQsIHNpemVfdCBzLCBsb2ZmX3QgKm8pCit7CisJY2hhciB2YWw7CisKKwl3ZHRfZ3BpX3NldF90aW1lb3V0KHRpbWVvdXQpOworCWV4cGVjdF9jbG9zZSA9IChzID4gMCkgJiYgIWdldF91c2VyKHZhbCwgZCkgJiYgKHZhbCA9PSAnVicpOworCXJldHVybiBzID8gMSA6IDA7Cit9CisKK3N0YXRpYyBsb25nCit3ZHRfZ3BpX2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlsb25nIHJlcyA9IC1FTk9UVFk7CisJY29uc3QgbG9uZyBzaXplID0gX0lPQ19TSVpFKGNtZCk7CisJaW50IHN0YXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIHdkaW5mbyA9IHsKKwkJLmlkZW50aXR5ICAgICAgICAgICAgICAgPSAiUk05eHh4L0dQSSB3YXRjaGRvZyIsCisJCS5maXJtd2FyZV92ZXJzaW9uICAgICAgID0gMCwKKwkJLm9wdGlvbnMgICAgICAgICAgICAgICAgPSBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORworCX07CisKKwlpZiAodW5saWtlbHkoX0lPQ19UWVBFKGNtZCkgIT0gV0FUQ0hET0dfSU9DVExfQkFTRSkpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQorCSAgICAmJiAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJnLCBzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKF9JT0NfRElSKGNtZCkgJiBfSU9DX1dSSVRFKQorCSAgICAmJiAhYWNjZXNzX29rKFZFUklGWV9SRUFELCBhcmcsIHNpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWV4cGVjdF9jbG9zZSA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJd2RpbmZvLm9wdGlvbnMgPSBub3dheW91dCA/CisJCQlXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyA6CisJCQlXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0U7CisJCXJlcyA9IF9fY29weV90b191c2VyKGFyZ3AsICZ3ZGluZm8sIHNpemUpID8gIC1FRkFVTFQgOiBzaXplOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJc3RhdCA9ICgqKHZvbGF0aWxlIGNoYXIgKikgZmxhZ2FkZHIgJiAweDAxKQorCQkJPyBXRElPRl9DQVJEUkVTRVQgOiAwOworCQlyZXMgPSBfX2NvcHlfdG9fdXNlcihhcmdwLCAmc3RhdCwgc2l6ZSkgPworCQkJLUVGQVVMVCA6IHNpemU7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfZ3BpX3NldF90aW1lb3V0KHRpbWVvdXQpOworCQlyZXMgPSBzaXplOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJeworCQkJaW50IHZhbDsKKwkJCWlmICh1bmxpa2VseShfX2NvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemUpKSkgeworCQkJCXJlcyA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh2YWwgPiBNQVhfVElNRU9VVF9TRUNPTkRTKQorCQkJCXZhbCA9IE1BWF9USU1FT1VUX1NFQ09ORFM7CisJCQl0aW1lb3V0ID0gdmFsOworCQkJd2R0X2dwaV9zZXRfdGltZW91dCh2YWwpOworCQkJcmVzID0gc2l6ZTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0aW1lb3V0IHNldCB0byAldSBzZWNvbmRzXG4iLAorCQkJCXdkdF9ncGlfbmFtZSwgdGltZW91dCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJlcyA9IF9fY29weV90b191c2VyKGFyZ3AsICZ0aW1lb3V0LCBzaXplKSA/CisJCQktRUZBVUxUIDogc2l6ZTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworCisvKiBTaHV0ZG93biBub3RpZmllciAqLworc3RhdGljIGludAord2R0X2dwaV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQorCQl3ZHRfZ3BpX3N0b3AoKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworCisvKiBJbml0ICYgZXhpdCBwcm9jZWR1cmVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlICoKK3dkdF9ncGlfZ2V0X3Jlc291cmNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkdiwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgdW5zaWduZWQgaW50IHR5cGUpCit7CisJY2hhciBidWZbODBdOworCWlmIChzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlc18wIiwgbmFtZSkgPj0gc2l6ZW9mIGJ1ZikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGR2LCB0eXBlLCBidWYpOworfQorCisvKiBObyBob3RwbHVnZ2luZyBvbiB0aGUgcGxhdGZvcm0gYnVzIC0gdXNlIF9faW5pdCAqLworc3RhdGljIGludCBfX2luaXQgd2R0X2dwaV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJlczsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICogY29uc3QgcGR2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJY29uc3Qgc3RydWN0IHJlc291cmNlCisJCSogY29uc3QgcnIgPSB3ZHRfZ3BpX2dldF9yZXNvdXJjZShwZHYsIFdEVF9SRVNPVVJDRV9SRUdTLAorCQkJCQkJICBJT1JFU09VUkNFX01FTSksCisJCSogY29uc3QgcmkgPSB3ZHRfZ3BpX2dldF9yZXNvdXJjZShwZHYsIFdEVF9SRVNPVVJDRV9JUlEsCisJCQkJCQkgIElPUkVTT1VSQ0VfSVJRKSwKKwkJKiBjb25zdCByYyA9IHdkdF9ncGlfZ2V0X3Jlc291cmNlKHBkdiwgV0RUX1JFU09VUkNFX0NPVU5URVIsCisJCQkJCQkgIDApOworCisJaWYgKHVubGlrZWx5KCFyciB8fCAhcmkgfHwgIXJjKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXdkX3JlZ3MgPSBpb3JlbWFwX25vY2FjaGUocnItPnN0YXJ0LCByci0+ZW5kICsgMSAtIHJyLT5zdGFydCk7CisJaWYgKHVubGlrZWx5KCF3ZF9yZWdzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJd2RfaXJxID0gcmktPnN0YXJ0OworCXdkX2N0ciA9IHJjLT5zdGFydDsKKwlyZXMgPSBtaXNjX3JlZ2lzdGVyKCZtaXNjZGV2KTsKKwlpZiAocmVzKQorCQlpb3VubWFwKHdkX3JlZ3MpOworCWVsc2UKKwkJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfZ3BpX3NodXRkb3duKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCB3ZHRfZ3BpX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJlczsKKworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfZ3BpX3NodXRkb3duKTsKKwlyZXMgPSBtaXNjX2RlcmVnaXN0ZXIoJm1pc2NkZXYpOworCWlvdW5tYXAod2RfcmVncyk7CisJd2RfcmVncyA9IE5VTEw7CisJcmV0dXJuIHJlczsKK30KKworCisvKiBEZXZpY2UgZHJpdmVyIGluaXQgJiBleGl0ICovCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgd2R0X2dwaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gKGNoYXIgKikgd2R0X2dwaV9uYW1lLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucHJvYmUJCT0gd2R0X2dwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHdkdF9ncGlfcmVtb3ZlKSwKKwkuc2h1dGRvd24JPSBOVUxMLAorCS5zdXNwZW5kCT0gTlVMTCwKKwkucmVzdW1lCQk9IE5VTEwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3ZHRfZ3BpX2luaXRfbW9kdWxlKHZvaWQpCit7CisJYXRvbWljX3NldCgmb3BlbmNudCwgMSk7CisJaWYgKHRpbWVvdXQgPiBNQVhfVElNRU9VVF9TRUNPTkRTKQorCQl0aW1lb3V0ID0gTUFYX1RJTUVPVVRfU0VDT05EUzsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZ3ZHRfZ3BpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3ZHRfZ3BpX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJndkdF9ncGlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQod2R0X2dwaV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh3ZHRfZ3BpX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIEtvZWxsZXIgPHRob21hcy5rb2VsbGVyQGJhc2xlcndlYi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJhc2xlciBlWGNpdGUgd2F0Y2hkb2cgZHJpdmVyIGZvciBncGkgZGV2aWNlcyIpOworTU9EVUxFX1ZFUlNJT04oIjAuMSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCmluZGV4IDY4YjFjYTk3Ni4uMThjYjA1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKQEAgLTM4MCwxOCArMzgwLDIxIEBACiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKIAlpZiAocmVzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhaWxlZCB0byBnZXQgaXJxIHJlc291cmNlXG4iKTsKKwkJaW91bm1hcCh3ZHRfYmFzZSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKHJlcy0+c3RhcnQsIHMzYzI0MTB3ZHRfaXJxLCAwLCBwZGV2LT5uYW1lLCBwZGV2KTsKIAlpZiAocmV0ICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLCByZXQpOworCQlpb3VubWFwKHdkdF9iYXNlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAl3ZHRfY2xvY2sgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ3YXRjaGRvZyIpOwogCWlmICh3ZHRfY2xvY2sgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZmFpbGVkIHRvIGZpbmQgd2F0Y2hkb2cgY2xvY2sgc291cmNlXG4iKTsKKwkJaW91bm1hcCh3ZHRfYmFzZSk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIApAQCAtNDE1LDYgKzQxOCw3IEBACiAJaWYgKHJldCkgewogCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKCVkKVxuIiwKIAkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlpb3VubWFwKHdkdF9iYXNlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQ1MSw2ICs0NTUsNyBAQAogCQl3ZHRfY2xvY2sgPSBOVUxMOwogCX0KIAorCWlvdW5tYXAod2R0X2Jhc2UpOwogCW1pc2NfZGVyZWdpc3RlcigmczNjMjQxMHdkdF9taXNjZGV2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYzEyMDB3ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zYzEyMDB3ZHQuYwppbmRleCBkOGQwZjI4Li5lMzIzOTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2MxMjAwd2R0LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3NjMTIwMHdkdC5jCkBAIC0zOTIsNyArMzkyLDcgQEAKIAlpZiAoaW8gPT0gLTEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW8gcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfY2xlYW47CisJCWdvdG8gb3V0X3BucDsKIAl9CiAKICNpZiBkZWZpbmVkIENPTkZJR19QTlAKQEAgLTQwNSw3ICs0MDUsNyBAQAogCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIGlvX2xlbiwgU0MxMjAwX01PRFVMRV9OQU1FKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgSU8gcG9ydCAlI3hcbiIsIGlvKTsKIAkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dF9jbGVhbjsKKwkJZ290byBvdXRfcG5wOwogCX0KIAogCXJldCA9IHNjMTIwMHdkdF9wcm9iZSgpOwpAQCAtNDM1LDYgKzQzNSwxMSBAQAogb3V0X2lvOgogCXJlbGVhc2VfcmVnaW9uKGlvLCBpb19sZW4pOwogCitvdXRfcG5wOgorI2lmIGRlZmluZWQgQ09ORklHX1BOUAorCWlmIChpc2FwbnApCisJCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmc2NsMjAwd2R0X3BucF9kcml2ZXIpOworI2VuZGlmCiAJZ290byBvdXRfY2xlYW47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zbXNjMzdiNzg3X3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Ntc2MzN2I3ODdfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1NjkxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9zbXNjMzdiNzg3X3dkdC5jCkBAIC0wLDAgKzEsNjI3IEBACisvKgorICoJU01zQyAzN0I3ODcgV2F0Y2hkb2cgVGltZXIgZHJpdmVyIGZvciBMaW51eCAyLjYueC54CisgKgorICogICAgICBCYXNlZCBvbiBhY3F1aXJld2R0LmMgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqICAgICAgIGFuZCBzb21lIG90aGVyIGV4aXN0aW5nIGRyaXZlcnMKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBhdXRob3JzIGRvIE5PVCBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUgd2FycmFudHkgZm9yCisgKglhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiQVMtSVMiIGluCisgKiAgICAgIHRoZSBob3BlIHRoYXQgaXQgbWF5IGJlIHVzZWZ1bCBmb3Igb3RoZXJzLgorICoKKyAqCShDKSBDb3B5cmlnaHQgMjAwMy0yMDA2ICBTdmVuIEFuZGVycyA8YW5kZXJzQGFuZHVyYXMuZGU+CisgKgorICogIEhpc3Rvcnk6CisgKgkyMDAzIC0gQ3JlYXRlZCB2ZXJzaW9uIDEuMCBmb3IgTGludXggMi40LnguCisgKgkyMDA2IC0gUG9ydGVkIHRvIExpbnV4IDIuNiwgYWRkZWQgbm93YXlvdXQgYW5kIE1BR0lDQ0xPU0UKKyAqICAgICAgICAgICAgIGZlYXR1cmVzLiBSZWxlYXNlZCB2ZXJzaW9uIDEuMQorICoKKyAqICBUaGVvcnkgb2Ygb3BlcmF0aW9uOgorICoKKyAqICAgICAgQSBXYXRjaGRvZyBUaW1lciAoV0RUKSBpcyBhIGhhcmR3YXJlIGNpcmN1aXQgdGhhdCBjYW4KKyAqICAgICAgcmVzZXQgdGhlIGNvbXB1dGVyIHN5c3RlbSBpbiBjYXNlIG9mIGEgc29mdHdhcmUgZmF1bHQuCisgKiAgICAgIFlvdSBwcm9iYWJseSBrbmV3IHRoYXQgYWxyZWFkeS4KKyAqCisgKiAgICAgIFVzdWFsbHkgYSB1c2Vyc3BhY2UgZGFlbW9uIHdpbGwgbm90aWZ5IHRoZSBrZXJuZWwgV0RUIGRyaXZlcgorICogICAgICB2aWEgdGhlIC9kZXYvd2F0Y2hkb2cgc3BlY2lhbCBkZXZpY2UgZmlsZSB0aGF0IHVzZXJzcGFjZSBpcworICogICAgICBzdGlsbCBhbGl2ZSwgYXQgcmVndWxhciBpbnRlcnZhbHMuICBXaGVuIHN1Y2ggYSBub3RpZmljYXRpb24KKyAqICAgICAgb2NjdXJzLCB0aGUgZHJpdmVyIHdpbGwgdXN1YWxseSB0ZWxsIHRoZSBoYXJkd2FyZSB3YXRjaGRvZworICogICAgICB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4gb3JkZXIsIGFuZCB0aGF0IHRoZSB3YXRjaGRvZyBzaG91bGQgd2FpdAorICogICAgICBmb3IgeWV0IGFub3RoZXIgbGl0dGxlIHdoaWxlIHRvIHJlc2V0IHRoZSBzeXN0ZW0uCisgKiAgICAgIElmIHVzZXJzcGFjZSBmYWlscyAoUkFNIGVycm9yLCBrZXJuZWwgYnVnLCB3aGF0ZXZlciksIHRoZQorICogICAgICBub3RpZmljYXRpb25zIGNlYXNlIHRvIG9jY3VyLCBhbmQgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIHdpbGwKKyAqICAgICAgcmVzZXQgdGhlIHN5c3RlbSAoY2F1c2luZyBhIHJlYm9vdCkgYWZ0ZXIgdGhlIHRpbWVvdXQgb2NjdXJzLgorICoKKyAqIENyZWF0ZSBkZXZpY2Ugd2l0aDoKKyAqICBta25vZCAvZGV2L3dhdGNoZG9nIGMgMTAgMTMwCisgKgorICogRm9yIGFuIGV4YW1wbGUgdXNlcnNwYWNlIGtlZXAtYWxpdmUgZGFlbW9uLCBzZWU6CisgKiAgIERvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2cudHh0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiBlbmFibGUgc3VwcG9ydCBmb3IgbWludXRlcyBhcyB1bml0cz8gKi8KKy8qIChkb2VzIG5vdCBhbHdheXMgd29yayBjb3JyZWN0bHksIHNvIGRpc2FibGVkIGJ5IGRlZmF1bHQhKSAqLworI2RlZmluZSBTTVNDX1NVUFBPUlRfTUlOVVRFUworI3VuZGVmIFNNU0NfU1VQUE9SVF9NSU5VVEVTCisKKyNkZWZpbmUgTUFYX1RJTUVPVVQgICAgIDI1NQorCisjZGVmaW5lIFVOSVRfU0VDT05EICAgICAwCisjZGVmaW5lIFVOSVRfTUlOVVRFICAgICAxCisKKyNkZWZpbmUgTU9ETkFNRQkJInNtc2MzN2I3ODdfd2R0OiAiCisjZGVmaW5lIFZFUlNJT04gICAgICAgICAiMS4xIgorCisjZGVmaW5lIElPUE9SVCAgICAgICAgICAweDNGMAorI2RlZmluZSBJT1BPUlRfU0laRSAgICAgMgorI2RlZmluZSBJT0RFVl9OTyAgICAgICAgOAorCitzdGF0aWMgaW50IHVuaXQgPSBVTklUX1NFQ09ORDsgIC8qIHRpbWVyJ3MgdW5pdCAqLworc3RhdGljIGludCB0aW1lb3V0ID0gNjA7ICAgICAgICAvKiB0aW1lb3V0IHZhbHVlOiBkZWZhdWx0IGlzIDYwICJ1bml0cyIgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2VuYWJsZWQgPSAwOyAgIC8qIGlzIHRoZSB0aW1lciBlbmFibGVkPyAqLworCitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7ICAgICAgIC8qIGlzIHRoZSBjbG9zZSBleHBlY3RlZD8gKi8KKworc3RhdGljIHNwaW5sb2NrX3QgaW9fbG9jazsJLyogdG8gZ3VhcmQgdGhlIHdhdGNoZG9nIGZyb20gaW8gcmFjZXMgKi8KKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworCisvKiAtLSBMb3cgbGV2ZWwgZnVuY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHVubG9jayB0aGUgSU8gY2hpcCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgb3Blbl9pb19jb25maWcodm9pZCkKK3sKKyAgICAgICAgb3V0YigweDU1LCBJT1BPUlQpOworCW1kZWxheSgxKTsKKyAgICAgICAgb3V0YigweDU1LCBJT1BPUlQpOworfQorCisvKiBsb2NrIHRoZSBJTyBjaGlwICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvc2VfaW9fY29uZmlnKHZvaWQpCit7CisgICAgICAgIG91dGIoMHhBQSwgSU9QT1JUKTsKK30KKworLyogc2VsZWN0IHRoZSBJTyBkZXZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWxlY3RfaW9fZGV2aWNlKHVuc2lnbmVkIGNoYXIgZGV2bm8pCit7CisgICAgICAgIG91dGIoMHgwNywgSU9QT1JUKTsKKyAgICAgICAgb3V0YihkZXZubywgSU9QT1JUKzEpOworfQorCisvKiB3cml0ZSB0byB0aGUgY29udHJvbCByZWdpc3RlciAqLworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2lvX2NyKHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisgICAgICAgIG91dGIocmVnLCBJT1BPUlQpOworICAgICAgICBvdXRiKGRhdGEsIElPUE9SVCsxKTsKK30KKworLyogcmVhZCBmcm9tIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIGNoYXIgcmVhZF9pb19jcih1bnNpZ25lZCBjaGFyIHJlZykKK3sKKyAgICAgICAgb3V0YihyZWcsIElPUE9SVCk7CisgICAgICAgIHJldHVybiBpbmIoSU9QT1JUKzEpOworfQorCisvKiAtLSBNZWRpdW0gbGV2ZWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2JpdDEyKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCS8vIC0tIEdlbmVyYWwgUHVycG9zZSBJL08gQml0IDEuMiAtLQorCS8vIEJpdCAwLCAgIEluL091dDogMCA9IE91dHB1dCwgMSA9IElucHV0CisJLy8gQml0IDEsICAgUG9sYXJpdHk6IDAgPSBObyBJbnZlcnQsIDEgPSBJbnZlcnQKKwkvLyBCaXQgMiwgICBHcm91cCBFbmFibGUgSW50ci46IDAgPSBEaXNhYmxlLCAxID0gRW5hYmxlCisJLy8gQml0IDMvNCwgRnVuY3Rpb24gc2VsZWN0OiAwMCA9IEdQSS9PLCAwMSA9IFdEVCwgMTAgPSBQMTcsCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAxMSA9IEVpdGhlciBFZGdlIFRyaWdnZXJlZCBJbnRyLiAyCisgICAgICAgIC8vIEJpdCA1LzYgIChSZXNlcnZlZCkKKwkvLyBCaXQgNywgICBPdXRwdXQgVHlwZTogMCA9IFB1c2ggUHVsbCBCaXQsIDEgPSBPcGVuIERyYWluCisgICAgICAgIHdyaXRlX2lvX2NyKDB4RTIsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2JpdDEzKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCS8vIC0tIEdlbmVyYWwgUHVycG9zZSBJL08gQml0IDEuMyAtLQorCS8vIEJpdCAwLCAgSW4vT3V0OiAwID0gT3V0cHV0LCAxID0gSW5wdXQKKwkvLyBCaXQgMSwgIFBvbGFyaXR5OiAwID0gTm8gSW52ZXJ0LCAxID0gSW52ZXJ0CisJLy8gQml0IDIsICBHcm91cCBFbmFibGUgSW50ci46IDAgPSBEaXNhYmxlLCAxID0gRW5hYmxlCisJLy8gQml0IDMsICBGdW5jdGlvbiBzZWxlY3Q6IDAgPSBHUEkvTywgMSA9IExFRAorICAgICAgICAvLyBCaXQgNC02IChSZXNlcnZlZCkKKwkvLyBCaXQgNywgIE91dHB1dCBUeXBlOiAwID0gUHVzaCBQdWxsIEJpdCwgMSA9IE9wZW4gRHJhaW4KKyAgICAgICAgd3JpdGVfaW9fY3IoMHhFMywgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdkdF90aW1lcl91bml0cyh1bnNpZ25lZCBjaGFyIG5ld191bml0cykKK3sKKwkvLyAtLSBXYXRjaGRvZyB0aW1lciB1bml0cyAtLQorCS8vIEJpdCAwLTYgKFJlc2VydmVkKQorCS8vIEJpdCA3LCAgV0RUIFRpbWUtb3V0IFZhbHVlIFVuaXRzIFNlbGVjdAorCS8vICAgICAgICAgKDAgPSBNaW51dGVzLCAxID0gU2Vjb25kcykKKyAgICAgICAgd3JpdGVfaW9fY3IoMHhGMSwgbmV3X3VuaXRzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdkdF90aW1lb3V0X3ZhbHVlKHVuc2lnbmVkIGNoYXIgbmV3X3RpbWVvdXQpCit7CisJLy8gLS0gV2F0Y2hkb2cgVGltZXIgVGltZS1vdXQgVmFsdWUgLS0KKwkvLyBCaXQgMC03IEJpbmFyeSBjb2RlZCB1bml0cyAoMD1EaXNhYmxlZCwgMS4uMjU1KQorICAgICAgICB3cml0ZV9pb19jcigweEYyLCBuZXdfdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3ZHRfdGltZXJfY29uZih1bnNpZ25lZCBjaGFyIGNvbmYpCit7CisJLy8gLS0gV2F0Y2hkb2cgdGltZXIgY29uZmlndXJhdGlvbiAtLQorCS8vIEJpdCAwICAgSm95c3RpY2sgZW5hYmxlOiAwKiA9IE5vIFJlc2V0LCAxID0gUmVzZXQgV0RUIHVwb24gR2FtZXBvcnQgSS9PCisJLy8gQml0IDEgICBLZXlib2FyZCBlbmFibGU6IDAqID0gTm8gUmVzZXQsIDEgPSBSZXNldCBXRFQgdXBvbiBLQkQgSW50ci4KKwkvLyBCaXQgMiAgIE1vdXNlIGVuYWJsZTogMCogPSBObyBSZXNldCwgMSA9IFJlc2V0IFdEVCB1cG9uIE1vdXNlIEludHIuCisgICAgICAgIC8vIEJpdCAzICAgUmVzZXQgdGhlIHRpbWVyCisgICAgICAgIC8vICAgICAgICAgKFdyb25nIGluIFNNc0MgZG9jdW1lbnRhdGlvbj8gR2l2ZW4gYXM6IFBvd2VyTEVEIFRpbW91dCBFbmFibGVkKQorCS8vIEJpdCA0LTcgV0RUIEludGVycnVwdCBNYXBwaW5nOiAoMDAwMCogPSBEaXNhYmxlZCwKKwkvLyAgICAgICAgICAgIDAwMDE9SVJRMSwgMDAxMD0oSW52YWxpZCksIDAwMTE9SVJRMyB0byAxMTExPUlSUTE1KQorICAgICAgICB3cml0ZV9pb19jcigweEYzLCBjb25mKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdkdF90aW1lcl9jdHJsKHVuc2lnbmVkIGNoYXIgcmVnKQoreworCS8vIC0tIFdhdGNoZG9nIHRpbWVyIGNvbnRyb2wgLS0KKwkvLyBCaXQgMCAgIFN0YXR1cyBCaXQ6IDAgPSBUaW1lciBjb3VudGluZywgMSA9IFRpbWVvdXQgb2NjdXJlZAorCS8vIEJpdCAxICAgUG93ZXIgTEVEIFRvZ2dsZTogMCA9IERpc2FibGUgVG9nZ2xlLCAxID0gVG9nZ2xlIGF0IDEgSHoKKwkvLyBCaXQgMiAgIEZvcmNlIFRpbWVvdXQ6IDEgPSBGb3JjZXMgV0QgdGltZW91dCBldmVudCAoc2VsZi1jbGVhbmluZykKKwkvLyBCaXQgMyAgIFAyMCBGb3JjZSBUaW1lb3V0IGVuYWJsZWQ6CisJLy8gICAgICAgICAgMCA9IFAyMCBhY3Rpdml0eSBkb2VzIG5vdCBnZW5lcmF0ZSB0aGUgV0QgdGltZW91dCBldmVudAorCS8vICAgICAgICAgIDEgPSBQMjAgQWxsb3dzIHJpc2luZyBlZGdlIG9mIFAyMCwgZnJvbSB0aGUga2V5Ym9hcmQKKwkvLyAgICAgICAgICAgICAgY29udHJvbGxlciwgdG8gZm9yY2UgdGhlIFdEIHRpbWVvdXQgZXZlbnQuCisJLy8gQml0IDQgICAoUmVzZXJ2ZWQpCisJLy8gLS0gU29mdCBwb3dlciBtYW5hZ2VtZW50IC0tCisJLy8gQml0IDUgICBTdG9wIENvdW50ZXI6IDEgPSBTdG9wIHNvZnR3YXJlIHBvd2VyIGRvd24gY291bnRlcgorCS8vICAgICAgICAgICAgc2V0IHZpYSByZWdpc3RlciAweEI4LCAoc2VsZi1jbGVhbmluZykKKwkvLyAgICAgICAgICAgIChVcG9uIHJlYWQ6IDAgPSBDb3VudGVyIHJ1bm5pbmcsIDEgPSBDb3VudGVyIHN0b3BwZWQpCisJLy8gQml0IDYgICBSZXN0YXJ0IENvdW50ZXI6IDEgPSBSZXN0YXJ0IHNvZnR3YXJlIHBvd2VyIGRvd24gY291bnRlcgorCS8vICAgICAgICAgICAgc2V0IHZpYSByZWdpc3RlciAweEI4LCAoc2VsZi1jbGVhbmluZykKKwkvLyBCaXQgNyAgIFNQT0ZGOiAxID0gRm9yY2Ugc29mdHdhcmUgcG93ZXIgZG93biAoc2VsZi1jbGVhbmluZykKKworICAgICAgICB3cml0ZV9pb19jcigweEY0LCByZWcpOworfQorCisvKiAtLSBIaWdoZXIgbGV2ZWwgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGluaXRpYWxpemUgd2F0Y2hkb2cgKi8KKworc3RhdGljIHZvaWQgd2Jfc21zY193ZHRfaW5pdGlhbGl6ZSh2b2lkKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIG9sZDsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisgICAgICAgIG9wZW5faW9fY29uZmlnKCk7CisgICAgICAgIHNlbGVjdF9pb19kZXZpY2UoSU9ERVZfTk8pOworCisJLy8gZW5hYmxlIHRoZSB3YXRjaGRvZworCWdwaW9fYml0MTMoMHgwOCk7ICAvLyBTZWxlY3QgcGluIDgwID0gTEVEIG5vdCBHUElPCisJZ3Bpb19iaXQxMigweDBBKTsgIC8vIFNldCBwaW4gNzkgPSBXRFQgbm90IEdQSU8vT3V0cHV0L1BvbGFyaXR5PUludmVydAorCisJLy8gZGlzYWJsZSB0aGUgdGltZW91dAorICAgICAgICB3ZHRfdGltZW91dF92YWx1ZSgwKTsKKworCS8vIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKyAgICAgICAgd2R0X3RpbWVyX2N0cmwoMHgwMCk7CisKKwkvLyByZXNldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisJd2R0X3RpbWVyX2NvbmYoMHgwMCk7CisKKwkvLyByZWFkIG9sZCAodGltZXIgdW5pdHMpIHJlZ2lzdGVyCisgICAgICAgIG9sZCA9IHJlYWRfaW9fY3IoMHhGMSkgJiAweDdGOworICAgICAgICBpZiAodW5pdCA9PSBVTklUX1NFQ09ORCkgb2xkIHw9IDB4ODA7IC8vIHNldCB0byBzZWNvbmRzCisKKwkvLyBzZXQgdGhlIHdhdGNoZG9nIHRpbWVyIHVuaXRzCisgICAgICAgIHdkdF90aW1lcl91bml0cyhvbGQpOworCisgICAgICAgIGNsb3NlX2lvX2NvbmZpZygpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKK30KKworLyogc2h1dGRvd24gdGhlIHdhdGNoZG9nICovCisKK3N0YXRpYyB2b2lkIHdiX3Ntc2Nfd2R0X3NodXRkb3duKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKyAgICAgICAgb3Blbl9pb19jb25maWcoKTsKKyAgICAgICAgc2VsZWN0X2lvX2RldmljZShJT0RFVl9OTyk7CisKKwkvLyBkaXNhYmxlIHRoZSB3YXRjaGRvZworICAgICAgICBncGlvX2JpdDEzKDB4MDkpOworICAgICAgICBncGlvX2JpdDEyKDB4MDkpOworCisJLy8gcmVzZXQgd2F0Y2hkb2cgY29uZmlnIHJlZ2lzdGVyCisJd2R0X3RpbWVyX2NvbmYoMHgwMCk7CisKKwkvLyByZXNldCB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyCisgICAgICAgIHdkdF90aW1lcl9jdHJsKDB4MDApOworCisJLy8gZGlzYWJsZSB0aW1lb3V0CisgICAgICAgIHdkdF90aW1lb3V0X3ZhbHVlKDB4MDApOworCisgICAgICAgIGNsb3NlX2lvX2NvbmZpZygpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKK30KKworLyogc2V0IHRpbWVvdXQgPT4gZW5hYmxlIHdhdGNoZG9nICovCisKK3N0YXRpYyB2b2lkIHdiX3Ntc2Nfd2R0X3NldF90aW1lb3V0KHVuc2lnbmVkIGNoYXIgbmV3X3RpbWVvdXQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKyAgICAgICAgb3Blbl9pb19jb25maWcoKTsKKyAgICAgICAgc2VsZWN0X2lvX2RldmljZShJT0RFVl9OTyk7CisKKwkvLyBzZXQgUG93ZXIgTEVEIHRvIGJsaW5rLCBpZiB3ZSBlbmFibGUgdGhlIHRpbWVvdXQKKyAgICAgICAgd2R0X3RpbWVyX2N0cmwoKG5ld190aW1lb3V0ID09IDApID8gMHgwMCA6IDB4MDIpOworCisJLy8gc2V0IHRpbWVvdXQgdmFsdWUKKyAgICAgICAgd2R0X3RpbWVvdXRfdmFsdWUobmV3X3RpbWVvdXQpOworCisgICAgICAgIGNsb3NlX2lvX2NvbmZpZygpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKK30KKworLyogZ2V0IHRpbWVvdXQgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgd2Jfc21zY193ZHRfZ2V0X3RpbWVvdXQodm9pZCkKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBzZXRfdGltZW91dDsKKworCXNwaW5fbG9jaygmaW9fbG9jayk7CisgICAgICAgIG9wZW5faW9fY29uZmlnKCk7CisgICAgICAgIHNlbGVjdF9pb19kZXZpY2UoSU9ERVZfTk8pOworICAgICAgICBzZXRfdGltZW91dCA9IHJlYWRfaW9fY3IoMHhGMik7CisgICAgICAgIGNsb3NlX2lvX2NvbmZpZygpOworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKworICAgICAgICByZXR1cm4gc2V0X3RpbWVvdXQ7Cit9CisKKy8qIGRpc2FibGUgd2F0Y2hkb2cgKi8KKworc3RhdGljIHZvaWQgd2Jfc21zY193ZHRfZGlzYWJsZSh2b2lkKQoreworICAgICAgICAvLyBzZXQgdGhlIHRpbWVvdXQgdG8gMCB0byBkaXNhYmxlIHRoZSB3YXRjaGRvZworICAgICAgICB3Yl9zbXNjX3dkdF9zZXRfdGltZW91dCgwKTsKK30KKworLyogZW5hYmxlIHdhdGNoZG9nIGJ5IHNldHRpbmcgdGhlIGN1cnJlbnQgdGltZW91dCAqLworCitzdGF0aWMgdm9pZCB3Yl9zbXNjX3dkdF9lbmFibGUodm9pZCkKK3sKKyAgICAgICAgLy8gc2V0IHRoZSBjdXJyZW50IHRpbWVvdXQuLi4KKyAgICAgICAgd2Jfc21zY193ZHRfc2V0X3RpbWVvdXQodGltZW91dCk7Cit9CisKKy8qIHJlc2V0IHRoZSB0aW1lciAqLworCitzdGF0aWMgdm9pZCB3Yl9zbXNjX3dkdF9yZXNldF90aW1lcih2b2lkKQoreworCXNwaW5fbG9jaygmaW9fbG9jayk7CisgICAgICAgIG9wZW5faW9fY29uZmlnKCk7CisgICAgICAgIHNlbGVjdF9pb19kZXZpY2UoSU9ERVZfTk8pOworCisJLy8gcmVzZXQgdGhlIHRpbWVyCisJd2R0X3RpbWVvdXRfdmFsdWUodGltZW91dCk7CisJd2R0X3RpbWVyX2NvbmYoMHgwOCk7CisKKyAgICAgICAgY2xvc2VfaW9fY29uZmlnKCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworfQorCisvKiByZXR1cm4sIGlmIHRoZSB3YXRjaGRvZyBpcyBlbmFibGVkICh0aW1lb3V0IGlzIHNldC4uLikgKi8KKworc3RhdGljIGludCB3Yl9zbXNjX3dkdF9zdGF0dXModm9pZCkKK3sKKwlyZXR1cm4gKHdiX3Ntc2Nfd2R0X2dldF90aW1lb3V0KCkgPT0gMCkgPyAwIDogV0RJT0ZfS0VFUEFMSVZFUElORzsKK30KKworCisvKiAtLSBGaWxlIG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG9wZW4gPT4gZW5hYmxlIHdhdGNoZG9nIGFuZCBzZXQgaW5pdGlhbCB0aW1lb3V0ICovCisKK3N0YXRpYyBpbnQgd2Jfc21zY193ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiAvZGV2L3dhdGNoZG9nIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlICovCisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmdGltZXJfZW5hYmxlZCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiBSZWxvYWQgYW5kIGFjdGl2YXRlIHRpbWVyICovCisJd2Jfc21zY193ZHRfZW5hYmxlKCk7CisKKwlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGVuYWJsZWQuIFRpbWVvdXQgc2V0IHRvICVkICVzLlxuIiwgdGltZW91dCwgKHVuaXQgPT0gVU5JVF9TRUNPTkQpID8gInNlY29uZChzKSIgOiAibWludXRlKHMpIik7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKy8qIGNsb3NlID0+IHNodXQgb2ZmIHRoZSB0aW1lciAqLworCitzdGF0aWMgaW50IHdiX3Ntc2Nfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogU2h1dCBvZmYgdGhlIHRpbWVyLiAqLworCisJaWYgKGV4cGVjdF9jbG9zZSA9PSA0MikgeworCSAgICAgICAgd2Jfc21zY193ZHRfZGlzYWJsZSgpOworCQlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGRpc2FibGVkLCBzbGVlcGluZyBhZ2Fpbi4uLlxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBNT0ROQU1FICJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJd2Jfc21zY193ZHRfcmVzZXRfdGltZXIoKTsKKwl9CisKKwljbGVhcl9iaXQoMCwgJnRpbWVyX2VuYWJsZWQpOworCWV4cGVjdF9jbG9zZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIHdyaXRlID0+IHVwZGF0ZSB0aGUgdGltZXIgdG8ga2VlcCB0aGUgbWFjaGluZSBhbGl2ZSAqLworCitzdGF0aWMgc3NpemVfdCB3Yl9zbXNjX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwkvKiBTZWUgaWYgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgJ1YnIGFuZCByZWxvYWQgdGhlIHRpbWVyICovCisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogcmVzZXQgZXhwZWN0IGZsYWcgKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICovCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhK2kpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisKKwkJLyogc29tZW9uZSB3cm90ZSB0byB1cywgd2Ugc2hvdWxkIHJlbG9hZCB0aGUgdGltZXIgKi8KKwkJd2Jfc21zY193ZHRfcmVzZXRfdGltZXIoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogaW9jdGwgPT4gY29udHJvbCBpbnRlcmZhY2UgKi8KKworc3RhdGljIGludCB3Yl9zbXNjX3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG5ld190aW1lb3V0OworCisJdW5pb24geworCQlzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKmlkZW50OworCQlpbnQgX191c2VyICppOworCX0gdWFyZzsKKworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSAJCVdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkgICAgICAgICAgICAgICAgICAgICAgICBXRElPRl9TRVRUSU1FT1VUIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkwLAorCQkuaWRlbnRpdHkgPSAJCSJTTXNDIDM3Qjc4NyBXYXRjaGRvZyIKKwl9OworCisJdWFyZy5pID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9UVFk7CisKKwkJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQkJcmV0dXJuIGNvcHlfdG9fdXNlcih1YXJnLmlkZW50LCAmaWRlbnQsCisJCQkJc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCQljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJCXJldHVybiBwdXRfdXNlcih3Yl9zbXNjX3dkdF9zdGF0dXMoKSwgdWFyZy5pKTsKKworCQljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgdWFyZy5pKTsKKworCQljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJCXdiX3Ntc2Nfd2R0X3Jlc2V0X3RpbWVyKCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCQlpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHVhcmcuaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8vIHRoZSBBUEkgc3RhdGVzIHRoaXMgaXMgZ2l2ZW4gaW4gc2VjcworCQkJaWYgKHVuaXQgPT0gVU5JVF9NSU5VVEUpCisJCQkgIG5ld190aW1lb3V0IC89IDYwOworCisJCQlpZiAobmV3X3RpbWVvdXQgPCAwIHx8IG5ld190aW1lb3V0ID4gTUFYX1RJTUVPVVQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXRpbWVvdXQgPSBuZXdfdGltZW91dDsKKwkJCXdiX3Ntc2Nfd2R0X3NldF90aW1lb3V0KHRpbWVvdXQpOworCisJCQkvLyBmYWxsIHRocm91Z2ggYW5kIHJldHVybiB0aGUgbmV3IHRpbWVvdXQuLi4KKworCQljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisKKwkJICAgICAgICBuZXdfdGltZW91dCA9IHRpbWVvdXQ7CisKKwkJCWlmICh1bml0ID09IFVOSVRfTUlOVVRFKQorCQkJICBuZXdfdGltZW91dCAqPSA2MDsKKworCQkJcmV0dXJuIHB1dF91c2VyKG5ld190aW1lb3V0LCB1YXJnLmkpOworCisJCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJeworCQkJaW50IG9wdGlvbnMsIHJldHZhbCA9IC1FSU5WQUw7CisKKwkJCWlmIChnZXRfdXNlcihvcHRpb25zLCB1YXJnLmkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQkJd2Jfc21zY193ZHRfZGlzYWJsZSgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJCXdiX3Ntc2Nfd2R0X2VuYWJsZSgpOworCQkJCXJldHZhbCA9IDA7CisJCQl9CisKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9Cit9CisKKy8qIC0tIE5vdGlmaWVyIGZ1bnRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCB3Yl9zbXNjX3dkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkKKwl7CisgICAgICAgICAgICAgICAgLy8gc2V0IHRpbWVvdXQgdG8gMCwgdG8gYXZvaWQgcG9zc2libGUgcmFjZS1jb25kaXRpb24KKwkgICAgICAgIHRpbWVvdXQgPSAwOworCQl3Yl9zbXNjX3dkdF9kaXNhYmxlKCk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyogLS0gTW9kdWxlJ3Mgc3RydWN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3Yl9zbXNjX3dkdF9mb3BzID0KK3sKKwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2Jfc21zY193ZHRfd3JpdGUsCisJLmlvY3RsCQk9IHdiX3Ntc2Nfd2R0X2lvY3RsLAorCS5vcGVuCQk9IHdiX3Ntc2Nfd2R0X29wZW4sCisJLnJlbGVhc2UJPSB3Yl9zbXNjX3dkdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3Yl9zbXNjX3dkdF9ub3RpZmllciA9Cit7CisJLm5vdGlmaWVyX2NhbGwgID0gd2Jfc21zY193ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3Yl9zbXNjX3dkdF9taXNjZGV2ID0KK3sKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmd2Jfc21zY193ZHRfZm9wcywKK307CisKKy8qIC0tIE1vZHVsZSBpbml0IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbW9kdWxlJ3MgImNvbnN0cnVjdG9yIiAqLworCitzdGF0aWMgaW50IF9faW5pdCB3Yl9zbXNjX3dkdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pbml0KCZpb19sb2NrKTsKKworCXByaW50aygiU01zQyAzN0I3ODcgd2F0Y2hkb2cgY29tcG9uZW50IGRyaXZlciAiIFZFUlNJT04gIiBpbml0aWFsaXNpbmcuLi5cbiIpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJT1BPUlQsIElPUE9SVF9TSVpFLCAiU01zQyAzN0I3ODcgd2F0Y2hkb2ciKSkgeworCQlwcmludGsoS0VSTl9FUlIgTU9ETkFNRSAiVW5hYmxlIHRvIHJlZ2lzdGVyIElPIHBvcnQgJSN4XG4iLCBJT1BPUlQpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3BucDsKKwl9CisKKyAgICAgICAgLy8gc2V0IG5ldyBtYXhpbXVtLCBpZiBpdCdzIHRvbyBiaWcKKyAgICAgICAgaWYgKHRpbWVvdXQgPiBNQVhfVElNRU9VVCkKKyAgICAgICAgICAgICAgIHRpbWVvdXQgPSBNQVhfVElNRU9VVDsKKworICAgICAgICAvLyBpbml0IHRoZSB3YXRjaGRvZyB0aW1lcgorICAgICAgICB3Yl9zbXNjX3dkdF9pbml0aWFsaXplKCk7CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndiX3Ntc2Nfd2R0X25vdGlmaWVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0ROQU1FICJVbmFibGUgdG8gcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIGVyciA9ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9pbzsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ3Yl9zbXNjX3dkdF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0ROQU1FICJVbmFibGUgdG8gcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vciAlZFxuIiwgV0FUQ0hET0dfTUlOT1IpOworCQlnb3RvIG91dF9yYnQ7CisJfQorCisJLy8gb3V0cHV0IGluZm8KKwlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIlRpbWVvdXQgc2V0IHRvICVkICVzLlxuIiwgdGltZW91dCwgKHVuaXQgPT0gVU5JVF9TRUNPTkQpID8gInNlY29uZChzKSIgOiAibWludXRlKHMpIik7CisJcHJpbnRrKEtFUk5fSU5GTyBNT0ROQU1FICJXYXRjaGRvZyBpbml0aWFsaXplZCBhbmQgc2xlZXBpbmcgKG5vd2F5b3V0PSVkKS4uLlxuIiwgbm93YXlvdXQpOworCisJLy8gcmV0ID0gMAorCitvdXRfY2xlYW46CisJcmV0dXJuIHJldDsKKworb3V0X3JidDoKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2Jfc21zY193ZHRfbm90aWZpZXIpOworCitvdXRfaW86CisJcmVsZWFzZV9yZWdpb24oSU9QT1JULCBJT1BPUlRfU0laRSk7CisKK291dF9wbnA6CisJZ290byBvdXRfY2xlYW47Cit9CisKKy8qIG1vZHVsZSdzICJkZXN0cnVjdG9yIiAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgd2Jfc21zY193ZHRfZXhpdCh2b2lkKQoreworCS8qIFN0b3AgdGhlIHRpbWVyIGJlZm9yZSB3ZSBsZWF2ZSAqLworCWlmICghbm93YXlvdXQpCisJeworCQl3Yl9zbXNjX3dkdF9zaHV0ZG93bigpOworCQlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIldhdGNoZG9nIGRpc2FibGVkLlxuIik7CisJfQorCisJbWlzY19kZXJlZ2lzdGVyKCZ3Yl9zbXNjX3dkdF9taXNjZGV2KTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2Jfc21zY193ZHRfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKElPUE9SVCwgSU9QT1JUX1NJWkUpOworCisJcHJpbnRrKCJTTXNDIDM3Qjc4NyB3YXRjaGRvZyBjb21wb25lbnQgZHJpdmVyIHJlbW92ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQod2Jfc21zY193ZHRfaW5pdCk7Cittb2R1bGVfZXhpdCh3Yl9zbXNjX3dkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU3ZlbiBBbmRlcnMgPGFuZGVyc0BhbmR1cmFzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFNNc0MgMzdCNzg3IHdhdGNoZG9nIGNvbXBvbmVudCAoVmVyc2lvbiAiIFZFUlNJT04gIikiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworCisjaWZkZWYgU01TQ19TVVBQT1JUX01JTlVURVMKK21vZHVsZV9wYXJhbSh1bml0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh1bml0LCAic2V0IHVuaXQgdG8gdXNlLCAwPXNlY29uZHMgb3IgMT1taW51dGVzLCBkZWZhdWx0IGlzIDAiKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInJhbmdlIGlzIDEtMjU1IHVuaXRzLCBkZWZhdWx0IGlzIDYwIik7CisKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCmluZGV4IGI0YWRjNTIuLjA3ZDRiZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy93ODM2MjdoZl93ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ0LDYgKzQ1LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CiBzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CitzdGF0aWMgc3BpbmxvY2tfdCBpb19sb2NrOwogCiAvKiBZb3UgbXVzdCBzZXQgdGhpcyAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLiAqLwogc3RhdGljIGludCB3ZHRfaW8gPSAweDJFOwpAQCAtMTEwLDEyICsxMTIsMTYgQEAKIHN0YXRpYyB2b2lkCiB3ZHRfY3RybChpbnQgdGltZW91dCkKIHsKKwlzcGluX2xvY2soJmlvX2xvY2spOworCQogCXc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOwogCiAJb3V0Yl9wKDB4RjYsIFdEVF9FRkVSKTsgICAgLyogU2VsZWN0IENSRjYgKi8KIAlvdXRiX3AodGltZW91dCwgV0RUX0VGRFIpOyAvKiBXcml0ZSBUaW1lb3V0IGNvdW50ZXIgdG8gQ1JGNiAqLwogCiAJdzgzNjI3aGZfdW5zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKKworCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKIH0KIAogc3RhdGljIGludApAQCAtMzAzLDYgKzMwOSw4IEBACiB7CiAJaW50IHJldDsKIAorCXNwaW5fbG9ja19pbml0KCZpb19sb2NrKTsKKwogCXByaW50ayhLRVJOX0lORk8gIldEVCBkcml2ZXIgZm9yIHRoZSBXaW5ib25kKFRNKSBXODM2MjdIRiBTdXBlciBJL08gY2hpcCBpbml0aWFsaXNpbmcuXG4iKTsKIAogCWlmICh3ZHRfc2V0X2hlYXJ0YmVhdCh0aW1lb3V0KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzY5N2hmX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3c4MzY5N2hmX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjhiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvdzgzNjk3aGZfd2R0LmMKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKgl3ODM2OTdoZi9oZyBXRFQgZHJpdmVyCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA2IFNhbXVlbCBUYXJkaWV1IDxzYW1AcmZjMTE0OS5uZXQ+CisgKgkoYykgQ29weXJpZ2h0IDIwMDYgTWFyY3VzIEp1bmtlciA8anVua2VyQGFuZHVyYXMuZGU+CisgKgorICoJQmFzZWQgb24gdzgzNjI3aGZfd2R0LmMgd2hpY2ggaXMgYmFzZWQgb24gYWR2YW50ZWNod2R0LmMKKyAqCXdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgorICoJT3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2VzOgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMyBQ4WRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CisgKgorICoJKGMpIENvcHlyaWdodCAxOTk2IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5yZWRoYXQuY29tCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIE1hcmN1cyBKdW5rZXIgbm9yIEFORFVSQVMgQUcgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzY5N2hmL2hnIFdEVCIKKyNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgorI2RlZmluZSBXQVRDSERPR19USU1FT1VUIDYwCQkvKiA2MCBzZWMgZGVmYXVsdCB0aW1lb3V0ICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworc3RhdGljIHNwaW5sb2NrX3QgaW9fbG9jazsKKworLyogWW91IG11c3Qgc2V0IHRoaXMgLSB0aGVyZSBpcyBubyBzYW5lIHdheSB0byBwcm9iZSBmb3IgdGhpcyBib2FyZC4gKi8KK3N0YXRpYyBpbnQgd2R0X2lvID0gMHgyZTsKK21vZHVsZV9wYXJhbSh3ZHRfaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdkdF9pbywgInc4MzY5N2hmL2hnIFdEVCBpbyBwb3J0IChkZWZhdWx0IDB4MmUsIDAgPSBhdXRvZGV0ZWN0KSIpOworCitzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOwkvKiBpbiBzZWNvbmRzICovCittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gMTw9IHRpbWVvdXQgPD0yNTUsIGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIi4iKTsKKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD1DT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQpIik7CisKKy8qCisgKglLZXJuZWwgbWV0aG9kcy4KKyAqLworCisjZGVmaW5lIFc4MzY5N0hGX0VGRVIgKHdkdF9pbyswKQkvKiBFeHRlbmRlZCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVzgzNjk3SEZfRUZJUiAod2R0X2lvKzApCS8qIEV4dGVuZGVkIEZ1bmN0aW9uIEluZGV4IFJlZ2lzdGVyIChzYW1lIGFzIEVGRVIpICovCisjZGVmaW5lIFc4MzY5N0hGX0VGRFIgKHdkdF9pbysxKQkvKiBFeHRlbmRlZCBGdW5jdGlvbiBEYXRhIFJlZ2lzdGVyICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAordzgzNjk3aGZfdW5sb2NrKHZvaWQpCit7CisJb3V0Yl9wKDB4ODcsIFc4MzY5N0hGX0VGRVIpOwkvKiBFbnRlciBleHRlbmRlZCBmdW5jdGlvbiBtb2RlICovCisJb3V0Yl9wKDB4ODcsIFc4MzY5N0hGX0VGRVIpOwkvKiBBZ2FpbiBhY2NvcmRpbmcgdG8gbWFudWFsICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordzgzNjk3aGZfbG9jayh2b2lkKQoreworCW91dGJfcCgweEFBLCBXODM2OTdIRl9FRkVSKTsJLyogTGVhdmUgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZSAqLworfQorCisvKgorICoJVGhlIHRocmVlIGZ1bmN0aW9ucyB3ODM2OTdoZl9nZXRfcmVnKCksIHc4MzY5N2hmX3NldF9yZWcoKSBhbmQKKyAqCXc4MzY5N2hmX3dyaXRlX3RpbWVvdXQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBkZXZpY2UgdW5sb2NrZWQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3c4MzY5N2hmX2dldF9yZWcodW5zaWduZWQgY2hhciByZWcpCit7CisJb3V0Yl9wKHJlZywgVzgzNjk3SEZfRUZJUik7CisJcmV0dXJuIGluYl9wKFc4MzY5N0hGX0VGRFIpOworfQorCitzdGF0aWMgdm9pZAordzgzNjk3aGZfc2V0X3JlZyh1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCW91dGJfcChyZWcsIFc4MzY5N0hGX0VGSVIpOworCW91dGJfcChkYXRhLCBXODM2OTdIRl9FRkRSKTsKK30KKworc3RhdGljIHZvaWQKK3c4MzY5N2hmX3dyaXRlX3RpbWVvdXQoaW50IHRpbWVvdXQpCit7CisJdzgzNjk3aGZfc2V0X3JlZygweEY0LCB0aW1lb3V0KTsJLyogV3JpdGUgVGltZW91dCBjb3VudGVyIHRvIENSRjQgKi8KK30KKworc3RhdGljIHZvaWQKK3c4MzY5N2hmX3NlbGVjdF93ZHQodm9pZCkKK3sKKwl3ODM2OTdoZl91bmxvY2soKTsKKwl3ODM2OTdoZl9zZXRfcmVnKDB4MDcsIDB4MDgpOwkvKiBTd2l0Y2ggdG8gbG9naWMgZGV2aWNlIDggKEdQSU8yKSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3c4MzY5N2hmX2Rlc2VsZWN0X3dkdCh2b2lkKQoreworCXc4MzY5N2hmX2xvY2soKTsKK30KKworc3RhdGljIHZvaWQKK3c4MzY5N2hmX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJidWY7CisKKwl3ODM2OTdoZl9zZWxlY3Rfd2R0KCk7CisKKwliYnVmID0gdzgzNjk3aGZfZ2V0X3JlZygweDI5KTsKKwliYnVmICY9IH4weDYwOworCWJidWYgfD0gMHgyMDsKKwl3ODM2OTdoZl9zZXRfcmVnKDB4MjksIGJidWYpOwkvKiBTZXQgcGluIDExOSB0byBXRFRPIyBtb2RlICg9IENSMjksIFdEVDApICovCisKKwliYnVmID0gdzgzNjk3aGZfZ2V0X3JlZygweEYzKTsKKwliYnVmICY9IH4weDA0OworCXc4MzY5N2hmX3NldF9yZWcoMHhGMywgYmJ1Zik7CS8qIENvdW50IG1vZGUgaXMgc2Vjb25kcyAqLworCisJdzgzNjk3aGZfZGVzZWxlY3Rfd2R0KCk7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9waW5nKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwl3ODM2OTdoZl9zZWxlY3Rfd2R0KCk7CisKKwl3ODM2OTdoZl93cml0ZV90aW1lb3V0KHRpbWVvdXQpOworCisJdzgzNjk3aGZfZGVzZWxlY3Rfd2R0KCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3ZHRfZW5hYmxlKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwl3ODM2OTdoZl9zZWxlY3Rfd2R0KCk7CisKKwl3ODM2OTdoZl93cml0ZV90aW1lb3V0KHRpbWVvdXQpOworCXc4MzY5N2hmX3NldF9yZWcoMHgzMCwgMSk7CS8qIEVuYWJsZSB0aW1lciAqLworCisJdzgzNjk3aGZfZGVzZWxlY3Rfd2R0KCk7CisJc3Bpbl91bmxvY2soJmlvX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3ZHRfZGlzYWJsZSh2b2lkKQoreworCXNwaW5fbG9jaygmaW9fbG9jayk7CisJdzgzNjk3aGZfc2VsZWN0X3dkdCgpOworCisJdzgzNjk3aGZfc2V0X3JlZygweDMwLCAwKTsJLyogRGlzYWJsZSB0aW1lciAqLworCXc4MzY5N2hmX3dyaXRlX3RpbWVvdXQoMCk7CisKKwl3ODM2OTdoZl9kZXNlbGVjdF93ZHQoKTsKKwlzcGluX3VubG9jaygmaW9fbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWlmICgodCA8IDEpIHx8ICh0ID4gMjU1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0aW1lb3V0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KSB7CisJCWlmICghbm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZitpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQl3ZHRfcGluZygpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCWludCBuZXdfdGltZW91dDsKKwlzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJCS5pZGVudGl0eSA9ICJXODM2OTdIRiBXRFQiLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJd2R0X3BpbmcoKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfdGltZW91dCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KG5ld190aW1lb3V0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl3ZHRfcGluZygpOworCQkvKiBGYWxsICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0LCBwKTsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwl7CisJCWludCBvcHRpb25zLCByZXR2YWwgPSAtRUlOVkFMOworCisJCWlmIChnZXRfdXNlcihvcHRpb25zLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChvcHRpb25zICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCXdkdF9kaXNhYmxlKCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisKKwkJaWYgKG9wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQl3ZHRfZW5hYmxlKCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCisJCXJldHVybiAtRUJVU1k7CisJLyoKKwkgKglBY3RpdmF0ZQorCSAqLworCisJd2R0X2VuYWJsZSgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAord2R0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJd2R0X2Rpc2FibGUoKTsKKwl9IGVsc2UgeworCQlwcmludGsgKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQl3ZHRfcGluZygpOworCX0KKwlleHBlY3RfY2xvc2UgPSAwOworCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOworCXJldHVybiAwOworfQorCisvKgorICoJTm90aWZpZXIgZm9yIHN5c3RlbSBkb3duCisgKi8KKworc3RhdGljIGludAord2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCisJdm9pZCAqdW51c2VkKQoreworCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpIHsKKwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCQl3ZHRfZGlzYWJsZSgpOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qCisgKglLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkud3JpdGUJCT0gd2R0X3dyaXRlLAorCS5pb2N0bAkJPSB3ZHRfaW9jdGwsCisJLm9wZW4JCT0gd2R0X29wZW4sCisJLnJlbGVhc2UJPSB3ZHRfY2xvc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJndkdF9mb3BzLAorfTsKKworLyoKKyAqCVRoZSBXRFQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB3ZHRfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKK307CisKK3N0YXRpYyBpbnQKK3c4MzY5N2hmX2NoZWNrX3dkdCh2b2lkKQoreworCWlmICghcmVxdWVzdF9yZWdpb24od2R0X2lvLCAyLCBXQVRDSERPR19OQU1FKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgd2R0X2lvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcHJpbnRrIChLRVJOX0RFQlVHIFBGWCAiTG9va2luZyBmb3Igd2F0Y2hkb2cgYXQgYWRkcmVzcyAweCV4XG4iLCB3ZHRfaW8pOworCXc4MzY5N2hmX3VubG9jaygpOworCWlmICh3ODM2OTdoZl9nZXRfcmVnKDB4MjApID09IDB4NjApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJ3YXRjaGRvZyBmb3VuZCBhdCBhZGRyZXNzIDB4JXhcbiIsIHdkdF9pbyk7CisJCXc4MzY5N2hmX2xvY2soKTsKKwkJcmV0dXJuIDA7CisJfQorCXc4MzY5N2hmX2xvY2soKTsJLyogUmVwcm90ZWN0IGluIGNhc2UgaXQgd2FzIGEgY29tcGF0aWJsZSBkZXZpY2UgKi8KKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAid2F0Y2hkb2cgbm90IGZvdW5kIGF0IGFkZHJlc3MgMHgleFxuIiwgd2R0X2lvKTsKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHc4MzY5N2hmX2lvcG9ydHNbXSA9IHsgMHgyZSwgMHg0ZSwgMHgwMCB9OworCitzdGF0aWMgaW50IF9faW5pdAord2R0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBpLCBmb3VuZCA9IDA7CisKKwlzcGluX2xvY2tfaW5pdCgmaW9fbG9jayk7CisKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggIldEVCBkcml2ZXIgZm9yIFc4MzY5N0hGL0hHIGluaXRpYWxpemluZ1xuIik7CisKKwlpZiAod2R0X2lvID09IDApIHsKKwkJLyogd2Ugd2lsbCBhdXRvZGV0ZWN0IHRoZSBXODM2OTdIRi9IRyB3YXRjaGRvZyAqLworCQlmb3IgKGkgPSAwOyAoKCFmb3VuZCkgJiYgKHc4MzY5N2hmX2lvcG9ydHNbaV0gIT0gMCkpOyBpKyspIHsKKwkJCXdkdF9pbyA9IHc4MzY5N2hmX2lvcG9ydHNbaV07CisJCQlpZiAoIXc4MzY5N2hmX2NoZWNrX3dkdCgpKQorCQkJCWZvdW5kKys7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIXc4MzY5N2hmX2NoZWNrX3dkdCgpKQorCQkJZm91bmQrKzsKKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJObyBXODM2OTdIRi9IRyBjb3VsZCBiZSBmb3VuZFxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXc4MzY5N2hmX2luaXQoKTsKKwl3ZHRfZGlzYWJsZSgpOwkvKiBEaXNhYmxlIHdhdGNoZG9nIHVudGlsIGZpcnN0IHVzZSAqLworCisJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CisJCXdkdF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX1RJTUVPVVQpOworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxPD10aW1lb3V0PD0yNTUsIHVzaW5nICVkXG4iLAorCQkJV0FUQ0hET0dfVElNRU9VVCk7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIHJlYm9vdCBub3RpZmllciAoZXJyPSVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gdW5yZWdfcmVnaW9uczsKKwl9CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCVdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIHVucmVnX3JlYm9vdDsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiB0aW1lb3V0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQl0aW1lb3V0LCBub3dheW91dCk7CisKK291dDoKKwlyZXR1cm4gcmV0OwordW5yZWdfcmVib290OgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwordW5yZWdfcmVnaW9uczoKKwlyZWxlYXNlX3JlZ2lvbih3ZHRfaW8sIDIpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3dkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CisJcmVsZWFzZV9yZWdpb24od2R0X2lvLCAyKTsKK30KKworbW9kdWxlX2luaXQod2R0X2luaXQpOworbW9kdWxlX2V4aXQod2R0X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjdXMgSnVua2VyIDxqdW5rZXJAYW5kdXJhcy5kZT4sIFNhbXVlbCBUYXJkaWV1IDxzYW1AcmZjMTE0OS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInc4MzY5N2hmL2hnIFdEVCBkcml2ZXIiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYWNwaV9wbS5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKaW5kZXggN2FkM2JlOC4uYjZiY2RiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMKQEAgLTU0LDggKzU0LDggQEAKIAkJdjEgPSByZWFkX3BtdG1yKCk7CiAJCXYyID0gcmVhZF9wbXRtcigpOwogCQl2MyA9IHJlYWRfcG10bXIoKTsKLQl9IHdoaWxlICgodjEgPiB2MiAmJiB2MSA8IHYzKSB8fCAodjIgPiB2MyAmJiB2MiA8IHYxKQotCQkJfHwgKHYzID4gdjEgJiYgdjMgPCB2MikpOworCX0gd2hpbGUgKHVubGlrZWx5KCh2MSA+IHYyICYmIHYxIDwgdjMpIHx8ICh2MiA+IHYzICYmIHYyIDwgdjEpCisJCQkgIHx8ICh2MyA+IHYxICYmIHYzIDwgdjIpKSk7CiAKIAlyZXR1cm4gKGN5Y2xlX3QpdjI7CiB9CkBAIC03NywxMSArNzcsMTEgQEAKIAogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBhY3BpX3BtX2dvb2Q7CitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgYWNwaV9wbV9nb29kOwogc3RhdGljIGludCBfX2luaXQgYWNwaV9wbV9nb29kX3NldHVwKGNoYXIgKl9fc3RyKQogewotICAgICAgIGFjcGlfcG1fZ29vZCA9IDE7Ci0gICAgICAgcmV0dXJuIDE7CisJYWNwaV9wbV9nb29kID0gMTsKKwlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoImFjcGlfcG1fZ29vZCIsIGFjcGlfcG1fZ29vZF9zZXR1cCk7CiAKQEAgLTEzOCw4ICsxMzgsNDMgQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8wLAogCQkJYWNwaV9wbV9jaGVja19ncmF5bGlzdCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0xFLAorCQkJYWNwaV9wbV9jaGVja19ncmF5bGlzdCk7CiAjZW5kaWYKIAorI2lmbmRlZiBDT05GSUdfWDg2XzY0CisjaW5jbHVkZSAibWFjaF90aW1lci5oIgorI2RlZmluZSBQTVRNUl9FWFBFQ1RFRF9SQVRFIFwKKyAgKChDQUxJQlJBVEVfTEFUQ0ggKiAoUE1UTVJfVElDS1NfUEVSX1NFQyA+PiAxMCkpIC8gKENMT0NLX1RJQ0tfUkFURT4+MTApKQorLyoKKyAqIFNvbWUgYm9hcmRzIGhhdmUgdGhlIFBNVE1SIHJ1bm5pbmcgd2F5IHRvbyBmYXN0LiBXZSBjaGVjaworICogdGhlIFBNVE1SIHJhdGUgYWdhaW5zdCBQSVQgY2hhbm5lbCAyIHRvIGNhdGNoIHRoZXNlIGNhc2VzLgorICovCitzdGF0aWMgaW50IHZlcmlmeV9wbXRtcl9yYXRlKHZvaWQpCit7CisJdTMyIHZhbHVlMSwgdmFsdWUyOworCXVuc2lnbmVkIGxvbmcgY291bnQsIGRlbHRhOworCisJbWFjaF9wcmVwYXJlX2NvdW50ZXIoKTsKKwl2YWx1ZTEgPSByZWFkX3BtdG1yKCk7CisJbWFjaF9jb3VudHVwKCZjb3VudCk7CisJdmFsdWUyID0gcmVhZF9wbXRtcigpOworCWRlbHRhID0gKHZhbHVlMiAtIHZhbHVlMSkgJiBBQ1BJX1BNX01BU0s7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBQTVRNUiBkZWx0YSBpcyB3aXRoaW4gNSUgb2Ygd2hhdCB3ZSBleHBlY3QgKi8KKwlpZiAoZGVsdGEgPCAoUE1UTVJfRVhQRUNURURfUkFURSAqIDE5KSAvIDIwIHx8CisJICAgIGRlbHRhID4gKFBNVE1SX0VYUEVDVEVEX1JBVEUgKiAyMSkgLyAyMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJQTS1UaW1lciBydW5uaW5nIGF0IGludmFsaWQgcmF0ZTogJWx1JSUgIgorCQkJIm9mIG5vcm1hbCAtIGFib3J0aW5nLlxuIiwKKwkJCTEwMFVMICogZGVsdGEgLyBQTVRNUl9FWFBFQ1RFRF9SQVRFKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgdmVyaWZ5X3BtdG1yX3JhdGUoKSAoMCkKKyNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2FjcGlfcG1fY2xvY2tzb3VyY2Uodm9pZCkKIHsKQEAgLTE3MSw2ICsyMDYsOSBAQAogCXJldHVybiAtRU5PREVWOwogCiBwbV9nb29kOgorCWlmICh2ZXJpZnlfcG10bXJfcmF0ZSgpICE9IDApCisJCXJldHVybiAtRU5PREVWOworCiAJcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9hY3BpX3BtKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvY25fcXVldWUuYyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3F1ZXVlLmMKaW5kZXggMDVmOGNlMi4uYjQxOGIxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY25fcXVldWUuYworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9xdWV1ZS5jCkBAIC0zMSw5ICszMSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nvbm5lY3Rvci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLXZvaWQgY25fcXVldWVfd3JhcHBlcih2b2lkICpkYXRhKQordm9pZCBjbl9xdWV1ZV93cmFwcGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgY25fY2FsbGJhY2tfZGF0YSAqZCA9IGRhdGE7CisJc3RydWN0IGNuX2NhbGxiYWNrX2VudHJ5ICpjYnEgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNuX2NhbGxiYWNrX2VudHJ5LCB3b3JrLndvcmspOworCXN0cnVjdCBjbl9jYWxsYmFja19kYXRhICpkID0gJmNicS0+ZGF0YTsKIAogCWQtPmNhbGxiYWNrKGQtPmNhbGxiYWNrX3ByaXYpOwogCkBAIC01Nyw3ICs1OSw3IEBACiAJbWVtY3B5KCZjYnEtPmlkLmlkLCBpZCwgc2l6ZW9mKHN0cnVjdCBjYl9pZCkpOwogCWNicS0+ZGF0YS5jYWxsYmFjayA9IGNhbGxiYWNrOwogCQotCUlOSVRfV09SSygmY2JxLT53b3JrLCAmY25fcXVldWVfd3JhcHBlciwgJmNicS0+ZGF0YSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmNicS0+d29yaywgJmNuX3F1ZXVlX3dyYXBwZXIpOwogCXJldHVybiBjYnE7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKaW5kZXggYjQ5YmFjZi4uNWU3Y2Q0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKQEAgLTEzNSw0MCArMTM1LDM5IEBACiAJc3Bpbl9sb2NrX2JoKCZkZXYtPmNiZGV2LT5xdWV1ZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9fY2JxLCAmZGV2LT5jYmRldi0+cXVldWVfbGlzdCwgY2FsbGJhY2tfZW50cnkpIHsKIAkJaWYgKGNuX2NiX2VxdWFsKCZfX2NicS0+aWQuaWQsICZtc2ctPmlkKSkgewotCQkJaWYgKGxpa2VseSghdGVzdF9iaXQoMCwgJl9fY2JxLT53b3JrLnBlbmRpbmcpICYmCisJCQlpZiAobGlrZWx5KCF0ZXN0X2JpdChXT1JLX1NUUlVDVF9QRU5ESU5HLAorCQkJCQkgICAgICZfX2NicS0+d29yay53b3JrLm1hbmFnZW1lbnQpICYmCiAJCQkJCV9fY2JxLT5kYXRhLmRkYXRhID09IE5VTEwpKSB7CiAJCQkJX19jYnEtPmRhdGEuY2FsbGJhY2tfcHJpdiA9IG1zZzsKIAogCQkJCV9fY2JxLT5kYXRhLmRkYXRhID0gZGF0YTsKIAkJCQlfX2NicS0+ZGF0YS5kZXN0cnVjdF9kYXRhID0gZGVzdHJ1Y3RfZGF0YTsKIAotCQkJCWlmIChxdWV1ZV93b3JrKGRldi0+Y2JkZXYtPmNuX3F1ZXVlLAotCQkJCQkJJl9fY2JxLT53b3JrKSkKKwkJCQlpZiAocXVldWVfZGVsYXllZF93b3JrKAorCQkJCQkgICAgZGV2LT5jYmRldi0+Y25fcXVldWUsCisJCQkJCSAgICAmX19jYnEtPndvcmssIDApKQogCQkJCQllcnIgPSAwOwogCQkJfSBlbHNlIHsKLQkJCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnc7CiAJCQkJc3RydWN0IGNuX2NhbGxiYWNrX2RhdGEgKmQ7CiAJCQkJCi0JCQkJdyA9IGt6YWxsb2Moc2l6ZW9mKCp3KSArIHNpemVvZigqZCksIEdGUF9BVE9NSUMpOwotCQkJCWlmICh3KSB7Ci0JCQkJCWQgPSAoc3RydWN0IGNuX2NhbGxiYWNrX2RhdGEgKikodysxKTsKLQorCQkJCV9fY2JxID0ga3phbGxvYyhzaXplb2YoKl9fY2JxKSwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKF9fY2JxKSB7CisJCQkJCWQgPSAmX19jYnEtPmRhdGE7CiAJCQkJCWQtPmNhbGxiYWNrX3ByaXYgPSBtc2c7CiAJCQkJCWQtPmNhbGxiYWNrID0gX19jYnEtPmRhdGEuY2FsbGJhY2s7CiAJCQkJCWQtPmRkYXRhID0gZGF0YTsKIAkJCQkJZC0+ZGVzdHJ1Y3RfZGF0YSA9IGRlc3RydWN0X2RhdGE7Ci0JCQkJCWQtPmZyZWUgPSB3OworCQkJCQlkLT5mcmVlID0gX19jYnE7CiAKLQkJCQkJSU5JVF9MSVNUX0hFQUQoJnctPmVudHJ5KTsKLQkJCQkJdy0+cGVuZGluZyA9IDA7Ci0JCQkJCXctPmZ1bmMgPSAmY25fcXVldWVfd3JhcHBlcjsKLQkJCQkJdy0+ZGF0YSA9IGQ7Ci0JCQkJCWluaXRfdGltZXIoJnctPnRpbWVyKTsKKwkJCQkJSU5JVF9ERUxBWUVEX1dPUksoJl9fY2JxLT53b3JrLAorCQkJCQkJCSAgJmNuX3F1ZXVlX3dyYXBwZXIpOwogCQkJCQkKLQkJCQkJaWYgKHF1ZXVlX3dvcmsoZGV2LT5jYmRldi0+Y25fcXVldWUsIHcpKQorCQkJCQlpZiAocXVldWVfZGVsYXllZF93b3JrKAorCQkJCQkJICAgIGRldi0+Y2JkZXYtPmNuX3F1ZXVlLAorCQkJCQkJICAgICZfX2NicS0+d29yaywgMCkpCiAJCQkJCQllcnIgPSAwOwogCQkJCQllbHNlIHsKLQkJCQkJCWtmcmVlKHcpOworCQkJCQkJa2ZyZWUoX19jYnEpOwogCQkJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQkJfQogCQkJCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwppbmRleCAyY2M3MWI2Li40OTE3NzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZworKysgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwpAQCAtMTA3LDYgKzEwNyw3IEBACiAKIGNvbmZpZyBDUFVfRlJFUV9HT1ZfT05ERU1BTkQKIAl0cmlzdGF0ZSAiJ29uZGVtYW5kJyBjcHVmcmVxIHBvbGljeSBnb3Zlcm5vciIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKIAloZWxwCiAJICAnb25kZW1hbmQnIC0gVGhpcyBkcml2ZXIgYWRkcyBhIGR5bmFtaWMgY3B1ZnJlcSBwb2xpY3kgZ292ZXJub3IuCiAJICBUaGUgZ292ZXJub3IgZG9lcyBhIHBlcmlvZGljIHBvbGxpbmcgYW5kIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggODZlNjliNy4uOWZiMmVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC0yOSw3ICsyOSw4IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfQ09SRSwgImNwdWZyZXEtY29yZSIsIG1zZykKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfQ09SRSwgXAorCQkJCQkJImNwdWZyZXEtY29yZSIsIG1zZykKIAogLyoqCiAgKiBUaGUgImNwdWZyZXEgZHJpdmVyIiAtIHRoZSBhcmNoLSBvciBoYXJkd2FyZS1kZXBlbmRlbnQgbG93CkBAIC00Miw3ICs0Myw3IEBACiAKIC8qIGludGVybmFsIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBpbnQgX19jcHVmcmVxX2dvdmVybm9yKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCB1bnNpZ25lZCBpbnQgZXZlbnQpOwotc3RhdGljIHZvaWQgaGFuZGxlX3VwZGF0ZSh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV91cGRhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyoqCiAgKiBUd28gbm90aWZpZXIgbGlzdHM6IHRoZSAicG9saWN5IiBsaXN0IGlzIGludm9sdmVkIGluIHRoZQpAQCAtNTksNyArNjAsNyBAQAogCXNyY3VfaW5pdF9ub3RpZmllcl9oZWFkKCZjcHVmcmVxX3RyYW5zaXRpb25fbm90aWZpZXJfbGlzdCk7CiAJcmV0dXJuIDA7CiB9Ci1jb3JlX2luaXRjYWxsKGluaXRfY3B1ZnJlcV90cmFuc2l0aW9uX25vdGlmaWVyX2xpc3QpOworcHVyZV9pbml0Y2FsbChpbml0X2NwdWZyZXFfdHJhbnNpdGlvbl9ub3RpZmllcl9saXN0KTsKIAogc3RhdGljIExJU1RfSEVBRChjcHVmcmVxX2dvdmVybm9yX2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWCAoY3B1ZnJlcV9nb3Zlcm5vcl9tdXRleCk7CkBAIC0xNTEsNyArMTUyLDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaXNhYmxlX3JhdGVsaW1pdF9sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQgY3B1ZnJlcV9kZWJ1Z19wcmludGsodW5zaWduZWQgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit2b2lkIGNwdWZyZXFfZGVidWdfcHJpbnRrKHVuc2lnbmVkIGludCB0eXBlLCBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJCQkJY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJY2hhciBzWzI1Nl07CiAJdmFfbGlzdCBhcmdzOwpAQCAtMTYxLDcgKzE2Myw4IEBACiAJV0FSTl9PTighcHJlZml4KTsKIAlpZiAodHlwZSAmIGRlYnVnKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNhYmxlX3JhdGVsaW1pdF9sb2NrLCBmbGFncyk7Ci0JCWlmICghZGlzYWJsZV9yYXRlbGltaXQgJiYgZGVidWdfcmF0ZWxpbWl0ICYmICFwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJaWYgKCFkaXNhYmxlX3JhdGVsaW1pdCAmJiBkZWJ1Z19yYXRlbGltaXQKKwkJCQkJJiYgIXByaW50a19yYXRlbGltaXQoKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzYWJsZV9yYXRlbGltaXRfbG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xODIsMTAgKzE4NSwxMiBAQAogCiAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiQ1BVZnJlcSBkZWJ1Z2dpbmc6IGFkZCAxIHRvIGRlYnVnIGNvcmUsIDIgdG8gZGVidWcgZHJpdmVycywgYW5kIDQgdG8gZGVidWcgZ292ZXJub3JzLiIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkNQVWZyZXEgZGVidWdnaW5nOiBhZGQgMSB0byBkZWJ1ZyBjb3JlLCIKKwkJCSIgMiB0byBkZWJ1ZyBkcml2ZXJzLCBhbmQgNCB0byBkZWJ1ZyBnb3Zlcm5vcnMuIik7CiAKIG1vZHVsZV9wYXJhbShkZWJ1Z19yYXRlbGltaXQsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19yYXRlbGltaXQsICJDUFVmcmVxIGRlYnVnZ2luZzogc2V0IHRvIDAgdG8gZGlzYWJsZSByYXRlbGltaXRpbmcuIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX3JhdGVsaW1pdCwgIkNQVWZyZXEgZGVidWdnaW5nOiIKKwkJCQkJIiBzZXQgdG8gMCB0byBkaXNhYmxlIHJhdGVsaW1pdGluZy4iKTsKIAogI2Vsc2UgLyogIUNPTkZJR19DUFVfRlJFUV9ERUJVRyAqLwogCkBAIC0yMTksMTcgKzIyNCwyMyBAQAogCWlmICghbF9wX2pfcmVmX2ZyZXEpIHsKIAkJbF9wX2pfcmVmID0gbG9vcHNfcGVyX2ppZmZ5OwogCQlsX3Bfal9yZWZfZnJlcSA9IGNpLT5vbGQ7Ci0JCWRwcmludGsoInNhdmluZyAlbHUgYXMgcmVmZXJlbmNlIHZhbHVlIGZvciBsb29wc19wZXJfamlmZnk7IGZyZXEgaXMgJXUga0h6XG4iLCBsX3Bfal9yZWYsIGxfcF9qX3JlZl9mcmVxKTsKKwkJZHByaW50aygic2F2aW5nICVsdSBhcyByZWZlcmVuY2UgdmFsdWUgZm9yIGxvb3BzX3Blcl9qaWZmeTsiCisJCQkiZnJlcSBpcyAldSBrSHpcbiIsIGxfcF9qX3JlZiwgbF9wX2pfcmVmX2ZyZXEpOwogCX0KIAlpZiAoKHZhbCA9PSBDUFVGUkVRX1BSRUNIQU5HRSAgJiYgY2ktPm9sZCA8IGNpLT5uZXcpIHx8CiAJICAgICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFICYmIGNpLT5vbGQgPiBjaS0+bmV3KSB8fAogCSAgICAodmFsID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFIHx8IHZhbCA9PSBDUFVGUkVRX1NVU1BFTkRDSEFOR0UpKSB7Ci0JCWxvb3BzX3Blcl9qaWZmeSA9IGNwdWZyZXFfc2NhbGUobF9wX2pfcmVmLCBsX3Bfal9yZWZfZnJlcSwgY2ktPm5ldyk7Ci0JCWRwcmludGsoInNjYWxpbmcgbG9vcHNfcGVyX2ppZmZ5IHRvICVsdSBmb3IgZnJlcXVlbmN5ICV1IGtIelxuIiwgbG9vcHNfcGVyX2ppZmZ5LCBjaS0+bmV3KTsKKwkJbG9vcHNfcGVyX2ppZmZ5ID0gY3B1ZnJlcV9zY2FsZShsX3Bfal9yZWYsIGxfcF9qX3JlZl9mcmVxLAorCQkJCQkJCQljaS0+bmV3KTsKKwkJZHByaW50aygic2NhbGluZyBsb29wc19wZXJfamlmZnkgdG8gJWx1IgorCQkJImZvciBmcmVxdWVuY3kgJXUga0h6XG4iLCBsb29wc19wZXJfamlmZnksIGNpLT5uZXcpOwogCX0KIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRqdXN0X2ppZmZpZXModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBjcHVmcmVxX2ZyZXFzICpjaSkgeyByZXR1cm47IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGp1c3RfamlmZmllcyh1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IGNwdWZyZXFfZnJlcXMgKmNpKQoreworCXJldHVybjsKK30KICNlbmRpZgogCiAKQEAgLTMxNiw3ICszMjcsOCBAQAogCQlpZiAoIXN0cm5pY21wKHN0cl9nb3Zlcm5vciwgInBlcmZvcm1hbmNlIiwgQ1BVRlJFUV9OQU1FX0xFTikpIHsKIAkJCSpwb2xpY3kgPSBDUFVGUkVRX1BPTElDWV9QRVJGT1JNQU5DRTsKIAkJCWVyciA9IDA7Ci0JCX0gZWxzZSBpZiAoIXN0cm5pY21wKHN0cl9nb3Zlcm5vciwgInBvd2Vyc2F2ZSIsIENQVUZSRVFfTkFNRV9MRU4pKSB7CisJCX0gZWxzZSBpZiAoIXN0cm5pY21wKHN0cl9nb3Zlcm5vciwgInBvd2Vyc2F2ZSIsCisJCQkJCQlDUFVGUkVRX05BTUVfTEVOKSkgewogCQkJKnBvbGljeSA9IENQVUZSRVFfUE9MSUNZX1BPV0VSU0FWRTsKIAkJCWVyciA9IDA7CiAJCX0KQEAgLTMyOCw3ICszNDAsOCBAQAogCQl0ID0gX19maW5kX2dvdmVybm9yKHN0cl9nb3Zlcm5vcik7CiAKIAkJaWYgKHQgPT0gTlVMTCkgewotCQkJY2hhciAqbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiY3B1ZnJlcV8lcyIsIHN0cl9nb3Zlcm5vcik7CisJCQljaGFyICpuYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJjcHVmcmVxXyVzIiwKKwkJCQkJCQkJc3RyX2dvdmVybm9yKTsKIAogCQkJaWYgKG5hbWUpIHsKIAkJCQlpbnQgcmV0OwpAQCAtMzYxLDcgKzM3NCw4IEBACiAKIAogLyoqCi0gKiBjcHVmcmVxX3Blcl9jcHVfYXR0cl9yZWFkKCkgLyBzaG93XyMjZmlsZV9uYW1lKCkgLSBwcmludCBvdXQgY3B1ZnJlcSBpbmZvcm1hdGlvbgorICogY3B1ZnJlcV9wZXJfY3B1X2F0dHJfcmVhZCgpIC8gc2hvd18jI2ZpbGVfbmFtZSgpIC0KKyAqIHByaW50IG91dCBjcHVmcmVxIGluZm9ybWF0aW9uCiAgKgogICogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZyb20gY3B1ZnJlcV9kcml2ZXItPnBvbGljeVtjcHVdOyBvYmplY3QgbXVzdCBiZQogICogInVuc2lnbmVkIGludCIuCkBAIC0zODAsNyArMzk0LDggQEAKIHNob3dfb25lKHNjYWxpbmdfbWF4X2ZyZXEsIG1heCk7CiBzaG93X29uZShzY2FsaW5nX2N1cl9mcmVxLCBjdXIpOwogCi1zdGF0aWMgaW50IF9fY3B1ZnJlcV9zZXRfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqZGF0YSwgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOworc3RhdGljIGludCBfX2NwdWZyZXFfc2V0X3BvbGljeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmRhdGEsCisJCQkJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCiAvKioKICAqIGNwdWZyZXFfcGVyX2NwdV9hdHRyX3dyaXRlKCkgLyBzdG9yZV8jI2ZpbGVfbmFtZSgpIC0gc3lzZnMgd3JpdGUgYWNjZXNzCkBAIC00MTYsNyArNDMxLDggQEAKIC8qKgogICogc2hvd19jcHVpbmZvX2N1cl9mcmVxIC0gY3VycmVudCBDUFUgZnJlcXVlbmN5IGFzIGRldGVjdGVkIGJ5IGhhcmR3YXJlCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfY3B1aW5mb19jdXJfZnJlcSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICogcG9saWN5LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2NwdWluZm9fY3VyX2ZyZXEgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqIHBvbGljeSwKKwkJCQkJCQljaGFyICpidWYpCiB7CiAJdW5zaWduZWQgaW50IGN1cl9mcmVxID0gY3B1ZnJlcV9nZXQocG9saWN5LT5jcHUpOwogCWlmICghY3VyX2ZyZXEpCkBAIC00MjgsNyArNDQ0LDggQEAKIC8qKgogICogc2hvd19zY2FsaW5nX2dvdmVybm9yIC0gc2hvdyB0aGUgY3VycmVudCBwb2xpY3kgZm9yIHRoZSBzcGVjaWZpZWQgQ1BVCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfc2NhbGluZ19nb3Zlcm5vciAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICogcG9saWN5LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3NjYWxpbmdfZ292ZXJub3IgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqIHBvbGljeSwKKwkJCQkJCQljaGFyICpidWYpCiB7CiAJaWYocG9saWN5LT5wb2xpY3kgPT0gQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJwb3dlcnNhdmVcbiIpOwpAQCAtNDU4LDcgKzQ3NSw4IEBACiAJaWYgKHJldCAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjcHVmcmVxX3BhcnNlX2dvdmVybm9yKHN0cl9nb3Zlcm5vciwgJm5ld19wb2xpY3kucG9saWN5LCAmbmV3X3BvbGljeS5nb3Zlcm5vcikpCisJaWYgKGNwdWZyZXFfcGFyc2VfZ292ZXJub3Ioc3RyX2dvdmVybm9yLCAmbmV3X3BvbGljeS5wb2xpY3ksCisJCQkJCQkmbmV3X3BvbGljeS5nb3Zlcm5vcikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbG9ja19jcHVfaG90cGx1ZygpOwpAQCAtNDc0LDcgKzQ5MiwxMCBAQAogCiAJdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAKLQlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiBjb3VudDsKIH0KIAogLyoqCkBAIC00ODgsNyArNTA5LDcgQEAKIC8qKgogICogc2hvd19zY2FsaW5nX2F2YWlsYWJsZV9nb3Zlcm5vcnMgLSBzaG93IHRoZSBhdmFpbGFibGUgQ1BVZnJlcSBnb3Zlcm5vcnMKICAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19zY2FsaW5nX2F2YWlsYWJsZV9nb3Zlcm5vcnMgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqIHBvbGljeSwKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2NhbGluZ19hdmFpbGFibGVfZ292ZXJub3JzIChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQljaGFyICpidWYpCiB7CiAJc3NpemVfdCBpID0gMDsKQEAgLTU3NCw3ICs1OTUsMTEgQEAKIAlwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQocG9saWN5LT5jcHUpOwogCWlmICghcG9saWN5KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXQgPSBmYXR0ci0+c2hvdyA/IGZhdHRyLT5zaG93KHBvbGljeSxidWYpIDogLUVJTzsKKwlpZiAoZmF0dHItPnNob3cpCisJCXJldCA9IGZhdHRyLT5zaG93KHBvbGljeSwgYnVmKTsKKwllbHNlCisJCXJldCA9IC1FSU87CisKIAljcHVmcmVxX2NwdV9wdXQocG9saWN5KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTg4LDcgKzYxMywxMSBAQAogCXBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChwb2xpY3ktPmNwdSk7CiAJaWYgKCFwb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOwotCXJldCA9IGZhdHRyLT5zdG9yZSA/IGZhdHRyLT5zdG9yZShwb2xpY3ksYnVmLGNvdW50KSA6IC1FSU87CisJaWYgKGZhdHRyLT5zdG9yZSkKKwkJcmV0ID0gZmF0dHItPnN0b3JlKHBvbGljeSwgYnVmLCBjb3VudCk7CisJZWxzZQorCQlyZXQgPSAtRUlPOworCiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY2NSw3ICs2OTQsNyBAQAogCW11dGV4X2luaXQoJnBvbGljeS0+bG9jayk7CiAJbXV0ZXhfbG9jaygmcG9saWN5LT5sb2NrKTsKIAlpbml0X2NvbXBsZXRpb24oJnBvbGljeS0+a29ial91bnJlZ2lzdGVyKTsKLQlJTklUX1dPUksoJnBvbGljeS0+dXBkYXRlLCBoYW5kbGVfdXBkYXRlLCAodm9pZCAqKShsb25nKWNwdSk7CisJSU5JVF9XT1JLKCZwb2xpY3ktPnVwZGF0ZSwgaGFuZGxlX3VwZGF0ZSk7CiAKIAkvKiBjYWxsIGRyaXZlci4gRnJvbSB0aGVuIG9uIHRoZSBjcHVmcmVxIG11c3QgYmUgYWJsZQogCSAqIHRvIGFjY2VwdCBhbGwgY2FsbHMgdG8gLT52ZXJpZnkgYW5kIC0+c2V0cG9saWN5IGZvciB0aGlzIENQVQpAQCAtODk1LDkgKzkyNCwxMSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGhhbmRsZV91cGRhdGUodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGhhbmRsZV91cGRhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgaW50KShsb25nKWRhdGE7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNwdWZyZXFfcG9saWN5LCB1cGRhdGUpOworCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKIAlkcHJpbnRrKCJoYW5kbGVfdXBkYXRlIGZvciBjcHUgJXUgY2FsbGVkXG4iLCBjcHUpOwogCWNwdWZyZXFfdXBkYXRlX3BvbGljeShjcHUpOwogfQpAQCAtOTExLDcgKzk0Miw4IEBACiAgKglXZSBhZGp1c3QgdG8gY3VycmVudCBmcmVxdWVuY3kgZmlyc3QsIGFuZCBuZWVkIHRvIGNsZWFuIHVwIGxhdGVyLiBTbyBlaXRoZXIgY2FsbAogICoJdG8gY3B1ZnJlcV91cGRhdGVfcG9saWN5KCkgb3Igc2NoZWR1bGUgaGFuZGxlX3VwZGF0ZSgpKS4KICAqLwotc3RhdGljIHZvaWQgY3B1ZnJlcV9vdXRfb2Zfc3luYyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgb2xkX2ZyZXEsIHVuc2lnbmVkIGludCBuZXdfZnJlcSkKK3N0YXRpYyB2b2lkIGNwdWZyZXFfb3V0X29mX3N5bmModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG9sZF9mcmVxLAorCQkJCXVuc2lnbmVkIGludCBuZXdfZnJlcSkKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKIApAQCAtOTM2LDE2ICs5NjgsMTYgQEAKIHVuc2lnbmVkIGludCBjcHVmcmVxX3F1aWNrX2dldCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdSk7Ci0JdW5zaWduZWQgaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IHJldF9mcmVxID0gMDsKIAogCWlmIChwb2xpY3kpIHsKIAkJbXV0ZXhfbG9jaygmcG9saWN5LT5sb2NrKTsKLQkJcmV0ID0gcG9saWN5LT5jdXI7CisJCXJldF9mcmVxID0gcG9saWN5LT5jdXI7CiAJCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKIAkJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJfQogCi0JcmV0dXJuIChyZXQpOworCXJldHVybiAocmV0X2ZyZXEpOwogfQogRVhQT1JUX1NZTUJPTChjcHVmcmVxX3F1aWNrX2dldCk7CiAKQEAgLTk1OSw3ICs5OTEsNyBAQAogdW5zaWduZWQgaW50IGNwdWZyZXFfZ2V0KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQoY3B1KTsKLQl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmV0X2ZyZXEgPSAwOwogCiAJaWYgKCFwb2xpY3kpCiAJCXJldHVybiAwOwpAQCAtOTY5LDEyICsxMDAxLDE0IEBACiAKIAltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOwogCi0JcmV0ID0gY3B1ZnJlcV9kcml2ZXItPmdldChjcHUpOworCXJldF9mcmVxID0gY3B1ZnJlcV9kcml2ZXItPmdldChjcHUpOwogCi0JaWYgKHJldCAmJiBwb2xpY3ktPmN1ciAmJiAhKGNwdWZyZXFfZHJpdmVyLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKSB7Ci0JCS8qIHZlcmlmeSBubyBkaXNjcmVwYW5jeSBiZXR3ZWVuIGFjdHVhbCBhbmQgc2F2ZWQgdmFsdWUgZXhpc3RzICovCi0JCWlmICh1bmxpa2VseShyZXQgIT0gcG9saWN5LT5jdXIpKSB7Ci0JCQljcHVmcmVxX291dF9vZl9zeW5jKGNwdSwgcG9saWN5LT5jdXIsIHJldCk7CisJaWYgKHJldF9mcmVxICYmIHBvbGljeS0+Y3VyICYmCisJCSEoY3B1ZnJlcV9kcml2ZXItPmZsYWdzICYgQ1BVRlJFUV9DT05TVF9MT09QUykpIHsKKwkJLyogdmVyaWZ5IG5vIGRpc2NyZXBhbmN5IGJldHdlZW4gYWN0dWFsIGFuZAorCQkJCQlzYXZlZCB2YWx1ZSBleGlzdHMgKi8KKwkJaWYgKHVubGlrZWx5KHJldF9mcmVxICE9IHBvbGljeS0+Y3VyKSkgeworCQkJY3B1ZnJlcV9vdXRfb2Zfc3luYyhjcHUsIHBvbGljeS0+Y3VyLCByZXRfZnJlcSk7CiAJCQlzY2hlZHVsZV93b3JrKCZwb2xpY3ktPnVwZGF0ZSk7CiAJCX0KIAl9CkBAIC05ODQsNyArMTAxOCw3IEBACiBvdXQ6CiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAKLQlyZXR1cm4gKHJldCk7CisJcmV0dXJuIChyZXRfZnJlcSk7CiB9CiBFWFBPUlRfU1lNQk9MKGNwdWZyZXFfZ2V0KTsKIApAQCAtOTk2LDcgKzEwMzAsNyBAQAogc3RhdGljIGludCBjcHVmcmVxX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNkZXYsIHBtX21lc3NhZ2VfdCBwbXNnKQogewogCWludCBjcHUgPSBzeXNkZXYtPmlkOwotCXVuc2lnbmVkIGludCByZXQgPSAwOworCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGludCBjdXJfZnJlcSA9IDA7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjcHVfcG9saWN5OwogCkBAIC0xMDc4LDcgKzExMTIsNyBAQAogc3RhdGljIGludCBjcHVmcmVxX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c2RldikKIHsKIAlpbnQgY3B1ID0gc3lzZGV2LT5pZDsKLQl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmNwdV9wb2xpY3k7CiAKIAlkcHJpbnRrKCJyZXN1bWluZyBjcHUgJXVcbiIsIGNwdSk7CkBAIC0xMjc0LDIyICsxMzA4LDQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVmcmVxX2RyaXZlcl90YXJnZXQpOwogCitpbnQgY3B1ZnJlcV9kcml2ZXJfZ2V0YXZnKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWludCByZXQgPSAwOworCisJcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KHBvbGljeS0+Y3B1KTsKKwlpZiAoIXBvbGljeSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOworCisJaWYgKGNwdV9vbmxpbmUocG9saWN5LT5jcHUpICYmIGNwdWZyZXFfZHJpdmVyLT5nZXRhdmcpCisJCXJldCA9IGNwdWZyZXFfZHJpdmVyLT5nZXRhdmcocG9saWN5LT5jcHUpOworCisJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCisJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZHJpdmVyX2dldGF2Zyk7CisKIC8qCiAgKiBMb2NraW5nOiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrX2NwdV9ob3RwbHVnKCkgbG9jayBoZWxkCiAgKiB3aGVuICJldmVudCIgaXMgQ1BVRlJFUV9HT1ZfTElNSVRTCiAgKi8KIAotc3RhdGljIGludCBfX2NwdWZyZXFfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIGludCBldmVudCkKK3N0YXRpYyBpbnQgX19jcHVmcmVxX2dvdmVybm9yKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJCQl1bnNpZ25lZCBpbnQgZXZlbnQpCiB7CiAJaW50IHJldDsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQocG9saWN5LT5nb3Zlcm5vci0+b3duZXIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRwcmludGsoIl9fY3B1ZnJlcV9nb3Zlcm5vciBmb3IgQ1BVICV1LCBldmVudCAldVxuIiwgcG9saWN5LT5jcHUsIGV2ZW50KTsKKwlkcHJpbnRrKCJfX2NwdWZyZXFfZ292ZXJub3IgZm9yIENQVSAldSwgZXZlbnQgJXVcbiIsCisJCQkJCQlwb2xpY3ktPmNwdSwgZXZlbnQpOwogCXJldCA9IHBvbGljeS0+Z292ZXJub3ItPmdvdmVybm9yKHBvbGljeSwgZXZlbnQpOwogCi0JLyogd2Uga2VlcCBvbmUgbW9kdWxlIHJlZmVyZW5jZSBhbGl2ZSBmb3IgZWFjaCBDUFUgZ292ZXJuZWQgYnkgdGhpcyBDUFUgKi8KKwkvKiB3ZSBrZWVwIG9uZSBtb2R1bGUgcmVmZXJlbmNlIGFsaXZlIGZvcgorCQkJZWFjaCBDUFUgZ292ZXJuZWQgYnkgdGhpcyBDUFUgKi8KIAlpZiAoKGV2ZW50ICE9IENQVUZSRVFfR09WX1NUQVJUKSB8fCByZXQpCiAJCW1vZHVsZV9wdXQocG9saWN5LT5nb3Zlcm5vci0+b3duZXIpOwogCWlmICgoZXZlbnQgPT0gQ1BVRlJFUV9HT1ZfU1RPUCkgJiYgIXJldCkKQEAgLTEzNjUsOSArMTQyMiwxMiBAQAogCiAKIC8qCisgKiBkYXRhICAgOiBjdXJyZW50IHBvbGljeS4KKyAqIHBvbGljeSA6IHBvbGljeSB0byBiZSBzZXQuCiAgKiBMb2NraW5nOiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrX2NwdV9ob3RwbHVnKCkgbG9jayBoZWxkCiAgKi8KLXN0YXRpYyBpbnQgX19jcHVmcmVxX3NldF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpkYXRhLCBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3N0YXRpYyBpbnQgX19jcHVmcmVxX3NldF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpkYXRhLAorCQkJCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCWludCByZXQgPSAwOwogCkBAIC0xMzc1LDcgKzE0MzUsOCBAQAogCWRwcmludGsoInNldHRpbmcgbmV3IHBvbGljeSBmb3IgQ1BVICV1OiAldSAtICV1IGtIelxuIiwgcG9saWN5LT5jcHUsCiAJCXBvbGljeS0+bWluLCBwb2xpY3ktPm1heCk7CiAKLQltZW1jcHkoJnBvbGljeS0+Y3B1aW5mbywgJmRhdGEtPmNwdWluZm8sIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9jcHVpbmZvKSk7CisJbWVtY3B5KCZwb2xpY3ktPmNwdWluZm8sICZkYXRhLT5jcHVpbmZvLAorCQkJCXNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9jcHVpbmZvKSk7CiAKIAlpZiAocG9saWN5LT5taW4gPiBkYXRhLT5taW4gJiYgcG9saWN5LT5taW4gPiBwb2xpY3ktPm1heCkgewogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTQwOCw3ICsxNDY5LDggQEAKIAlkYXRhLT5taW4gPSBwb2xpY3ktPm1pbjsKIAlkYXRhLT5tYXggPSBwb2xpY3ktPm1heDsKIAotCWRwcmludGsoIm5ldyBtaW4gYW5kIG1heCBmcmVxcyBhcmUgJXUgLSAldSBrSHpcbiIsIGRhdGEtPm1pbiwgZGF0YS0+bWF4KTsKKwlkcHJpbnRrKCJuZXcgbWluIGFuZCBtYXggZnJlcXMgYXJlICV1IC0gJXUga0h6XG4iLAorCQkJCQlkYXRhLT5taW4sIGRhdGEtPm1heCk7CiAKIAlpZiAoY3B1ZnJlcV9kcml2ZXItPnNldHBvbGljeSkgewogCQlkYXRhLT5wb2xpY3kgPSBwb2xpY3ktPnBvbGljeTsKQEAgLTE0MjksMTAgKzE0OTEsMTIgQEAKIAkJCWRhdGEtPmdvdmVybm9yID0gcG9saWN5LT5nb3Zlcm5vcjsKIAkJCWlmIChfX2NwdWZyZXFfZ292ZXJub3IoZGF0YSwgQ1BVRlJFUV9HT1ZfU1RBUlQpKSB7CiAJCQkJLyogbmV3IGdvdmVybm9yIGZhaWxlZCwgc28gcmUtc3RhcnQgb2xkIG9uZSAqLwotCQkJCWRwcmludGsoInN0YXJ0aW5nIGdvdmVybm9yICVzIGZhaWxlZFxuIiwgZGF0YS0+Z292ZXJub3ItPm5hbWUpOworCQkJCWRwcmludGsoInN0YXJ0aW5nIGdvdmVybm9yICVzIGZhaWxlZFxuIiwKKwkJCQkJCQlkYXRhLT5nb3Zlcm5vci0+bmFtZSk7CiAJCQkJaWYgKG9sZF9nb3YpIHsKIAkJCQkJZGF0YS0+Z292ZXJub3IgPSBvbGRfZ292OwotCQkJCQlfX2NwdWZyZXFfZ292ZXJub3IoZGF0YSwgQ1BVRlJFUV9HT1ZfU1RBUlQpOworCQkJCQlfX2NwdWZyZXFfZ292ZXJub3IoZGF0YSwKKwkJCQkJCQkgICBDUFVGUkVRX0dPVl9TVEFSVCk7CiAJCQkJfQogCQkJCXJldCA9IC1FSU5WQUw7CiAJCQkJZ290byBlcnJvcl9vdXQ7CkBAIC0xNTIyLDcgKzE1ODYsOCBAQAogCQkJZGF0YS0+Y3VyID0gcG9saWN5LmN1cjsKIAkJfSBlbHNlIHsKIAkJCWlmIChkYXRhLT5jdXIgIT0gcG9saWN5LmN1cikKLQkJCQljcHVmcmVxX291dF9vZl9zeW5jKGNwdSwgZGF0YS0+Y3VyLCBwb2xpY3kuY3VyKTsKKwkJCQljcHVmcmVxX291dF9vZl9zeW5jKGNwdSwgZGF0YS0+Y3VyLAorCQkJCQkJCQlwb2xpY3kuY3VyKTsKIAkJfQogCX0KIApAQCAtMTUzNSw3ICsxNjAwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woY3B1ZnJlcV91cGRhdGVfcG9saWN5KTsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIGludCBjcHVmcmVxX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKIAkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CkBAIC0xNTc1LDcgKzE2MzksNiBAQAogewogICAgIC5ub3RpZmllcl9jYWxsID0gY3B1ZnJlcV9jcHVfY2FsbGJhY2ssCiB9OwotI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgIFJFR0lTVEVSIC8gVU5SRUdJU1RFUiBDUFVGUkVRIERSSVZFUiAgICAgICAgICAgICAgICAqCkBAIC0xNjI2LDggKzE2ODksMTAgQEAKIAogCQkvKiBpZiBhbGwgLT5pbml0KCkgY2FsbHMgZmFpbGVkLCB1bnJlZ2lzdGVyICovCiAJCWlmIChyZXQpIHsKLQkJCWRwcmludGsoIm5vIENQVSBpbml0aWFsaXplZCBmb3IgZHJpdmVyICVzXG4iLCBkcml2ZXJfZGF0YS0+bmFtZSk7Ci0JCQlzeXNkZXZfZHJpdmVyX3VucmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZjcHVmcmVxX3N5c2Rldl9kcml2ZXIpOworCQkJZHByaW50aygibm8gQ1BVIGluaXRpYWxpemVkIGZvciBkcml2ZXIgJXNcbiIsCisJCQkJCQkJZHJpdmVyX2RhdGEtPm5hbWUpOworCQkJc3lzZGV2X2RyaXZlcl91bnJlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLAorCQkJCQkJJmNwdWZyZXFfc3lzZGV2X2RyaXZlcik7CiAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAJCQljcHVmcmVxX2RyaXZlciA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jCmluZGV4IGM0YzU3OGQuLmVlZjAyNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jCkBAIC00NCwyMiArNDQsMjQgQEAKICAqIGxhdGVuY3kgb2YgdGhlIHByb2Nlc3Nvci4gVGhlIGdvdmVybm9yIHdpbGwgd29yayBvbiBhbnkgcHJvY2Vzc29yIHdpdGggCiAgKiB0cmFuc2l0aW9uIGxhdGVuY3kgPD0gMTBtUywgdXNpbmcgYXBwcm9wcmlhdGUgc2FtcGxpbmcgCiAgKiByYXRlLgotICogRm9yIENQVXMgd2l0aCB0cmFuc2l0aW9uIGxhdGVuY3kgPiAxMG1TIChtb3N0bHkgZHJpdmVycyB3aXRoIENQVUZSRVFfRVRFUk5BTCkKLSAqIHRoaXMgZ292ZXJub3Igd2lsbCBub3Qgd29yay4KKyAqIEZvciBDUFVzIHdpdGggdHJhbnNpdGlvbiBsYXRlbmN5ID4gMTBtUyAobW9zdGx5IGRyaXZlcnMKKyAqIHdpdGggQ1BVRlJFUV9FVEVSTkFMKSwgdGhpcyBnb3Zlcm5vciB3aWxsIG5vdCB3b3JrLgogICogQWxsIHRpbWVzIGhlcmUgYXJlIGluIHVTLgogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IAkJCQlkZWZfc2FtcGxpbmdfcmF0ZTsKICNkZWZpbmUgTUlOX1NBTVBMSU5HX1JBVEVfUkFUSU8JCQkoMikKIC8qIGZvciBjb3JyZWN0IHN0YXRpc3RpY3MsIHdlIG5lZWQgYXQgbGVhc3QgMTAgdGlja3MgYmV0d2VlbiBlYWNoIG1lYXN1cmUgKi8KLSNkZWZpbmUgTUlOX1NUQVRfU0FNUExJTkdfUkFURQkJCShNSU5fU0FNUExJTkdfUkFURV9SQVRJTyAqIGppZmZpZXNfdG9fdXNlY3MoMTApKQotI2RlZmluZSBNSU5fU0FNUExJTkdfUkFURQkJCShkZWZfc2FtcGxpbmdfcmF0ZSAvIE1JTl9TQU1QTElOR19SQVRFX1JBVElPKQorI2RlZmluZSBNSU5fU1RBVF9TQU1QTElOR19SQVRFCQkJXAorCQkJKE1JTl9TQU1QTElOR19SQVRFX1JBVElPICogamlmZmllc190b191c2VjcygxMCkpCisjZGVmaW5lIE1JTl9TQU1QTElOR19SQVRFCQkJXAorCQkJKGRlZl9zYW1wbGluZ19yYXRlIC8gTUlOX1NBTVBMSU5HX1JBVEVfUkFUSU8pCiAjZGVmaW5lIE1BWF9TQU1QTElOR19SQVRFCQkJKDUwMCAqIGRlZl9zYW1wbGluZ19yYXRlKQogI2RlZmluZSBERUZfU0FNUExJTkdfUkFURV9MQVRFTkNZX01VTFRJUExJRVIJKDEwMDApCiAjZGVmaW5lIERFRl9TQU1QTElOR19ET1dOX0ZBQ1RPUgkJKDEpCiAjZGVmaW5lIE1BWF9TQU1QTElOR19ET1dOX0ZBQ1RPUgkJKDEwKQogI2RlZmluZSBUUkFOU0lUSU9OX0xBVEVOQ1lfTElNSVQJCSgxMCAqIDEwMDApCiAKLXN0YXRpYyB2b2lkIGRvX2Ric190aW1lcih2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGRvX2Ric190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgewogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAJKmN1cl9wb2xpY3k7CkBAIC04Miw3ICs4NCw3IEBACiAgKiBpcyByZWN1cnNpdmUgZm9yIHRoZSBzYW1lIHByb2Nlc3MuIC1WZW5raQogICovCiBzdGF0aWMgREVGSU5FX01VVEVYIAkoZGJzX211dGV4KTsKLXN0YXRpYyBERUNMQVJFX1dPUksJKGRic193b3JrLCBkb19kYnNfdGltZXIsIE5VTEwpOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGRic193b3JrLCBkb19kYnNfdGltZXIpOwogCiBzdHJ1Y3QgZGJzX3R1bmVycyB7CiAJdW5zaWduZWQgaW50IAkJc2FtcGxpbmdfcmF0ZTsKQEAgLTEwMywxMSArMTA1LDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9jcHVfaWRsZV90aW1lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JcmV0dXJuCWtzdGF0X2NwdShjcHUpLmNwdXN0YXQuaWRsZSArCisJdW5zaWduZWQgaW50IGFkZF9uaWNlID0gMCwgcmV0OworCisJaWYgKGRic190dW5lcnNfaW5zLmlnbm9yZV9uaWNlKQorCQlhZGRfbmljZSA9IGtzdGF0X2NwdShjcHUpLmNwdXN0YXQubmljZTsKKworCXJldCA9IAlrc3RhdF9jcHUoY3B1KS5jcHVzdGF0LmlkbGUgKwogCQlrc3RhdF9jcHUoY3B1KS5jcHVzdGF0Lmlvd2FpdCArCi0JCSggZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UgPwotCQkgIGtzdGF0X2NwdShjcHUpLmNwdXN0YXQubmljZSA6Ci0JCSAgMCk7CisJCWFkZF9uaWNlOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIHN5c2ZzIGludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MjAsNyArNDI3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRvX2Ric190aW1lcih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZG9fZGJzX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsgCiAJaW50IGk7CiAJbG9ja19jcHVfaG90cGx1ZygpOwpAQCAtNDM1LDcgKzQ0Miw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfaW5pdCh2b2lkKQogewotCUlOSVRfV09SSygmZGJzX3dvcmssIGRvX2Ric190aW1lciwgTlVMTCk7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkYnNfd29yaywKIAkJCXVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSkpOwogCXJldHVybjsKQEAgLTQ1Myw2ICs0NTksNyBAQAogCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKIAlzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKnRoaXNfZGJzX2luZm87CiAJdW5zaWduZWQgaW50IGo7CisJaW50IHJjOwogCiAJdGhpc19kYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgY3B1KTsKIApAQCAtNDY5LDYgKzQ3NiwxMyBAQAogCQkJYnJlYWs7CiAJCSAKIAkJbXV0ZXhfbG9jaygmZGJzX211dGV4KTsKKworCQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmZGJzX2F0dHJfZ3JvdXApOworCQlpZiAocmMpIHsKKwkJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKKwkJCXJldHVybiByYzsKKwkJfQorCiAJCWZvcl9lYWNoX2NwdV9tYXNrKGosIHBvbGljeS0+Y3B1cykgewogCQkJc3RydWN0IGNwdV9kYnNfaW5mb19zICpqX2Ric19pbmZvOwogCQkJal9kYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgaik7CkBAIC00ODEsNyArNDk1LDcgQEAKIAkJdGhpc19kYnNfaW5mby0+ZW5hYmxlID0gMTsKIAkJdGhpc19kYnNfaW5mby0+ZG93bl9za2lwID0gMDsKIAkJdGhpc19kYnNfaW5mby0+cmVxdWVzdGVkX2ZyZXEgPSBwb2xpY3ktPmN1cjsKLQkJc3lzZnNfY3JlYXRlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cCk7CisKIAkJZGJzX2VuYWJsZSsrOwogCQkvKgogCQkgKiBTdGFydCB0aGUgdGltZXJzY2hlZHVsZSB3b3JrLCB3aGVuIHRoaXMgZ292ZXJub3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCmluZGV4IGJmOGFhNDUuLmY2OTc0NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYwpAQCAtNDEsMTkgKzQxLDI1IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGRlZl9zYW1wbGluZ19yYXRlOwogI2RlZmluZSBNSU5fU0FNUExJTkdfUkFURV9SQVRJTwkJCSgyKQogLyogZm9yIGNvcnJlY3Qgc3RhdGlzdGljcywgd2UgbmVlZCBhdCBsZWFzdCAxMCB0aWNrcyBiZXR3ZWVuIGVhY2ggbWVhc3VyZSAqLwotI2RlZmluZSBNSU5fU1RBVF9TQU1QTElOR19SQVRFCQkJKE1JTl9TQU1QTElOR19SQVRFX1JBVElPICogamlmZmllc190b191c2VjcygxMCkpCi0jZGVmaW5lIE1JTl9TQU1QTElOR19SQVRFCQkJKGRlZl9zYW1wbGluZ19yYXRlIC8gTUlOX1NBTVBMSU5HX1JBVEVfUkFUSU8pCisjZGVmaW5lIE1JTl9TVEFUX1NBTVBMSU5HX1JBVEUgCQkJXAorCQkJKE1JTl9TQU1QTElOR19SQVRFX1JBVElPICogamlmZmllc190b191c2VjcygxMCkpCisjZGVmaW5lIE1JTl9TQU1QTElOR19SQVRFCQkJXAorCQkJKGRlZl9zYW1wbGluZ19yYXRlIC8gTUlOX1NBTVBMSU5HX1JBVEVfUkFUSU8pCiAjZGVmaW5lIE1BWF9TQU1QTElOR19SQVRFCQkJKDUwMCAqIGRlZl9zYW1wbGluZ19yYXRlKQogI2RlZmluZSBERUZfU0FNUExJTkdfUkFURV9MQVRFTkNZX01VTFRJUExJRVIJKDEwMDApCiAjZGVmaW5lIFRSQU5TSVRJT05fTEFURU5DWV9MSU1JVAkJKDEwICogMTAwMCkKIAotc3RhdGljIHZvaWQgZG9fZGJzX3RpbWVyKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgZG9fZGJzX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKKy8qIFNhbXBsaW5nIHR5cGVzICovCitlbnVtIGRic19zYW1wbGUge0RCU19OT1JNQUxfU0FNUExFLCBEQlNfU1VCX1NBTVBMRX07CiAKIHN0cnVjdCBjcHVfZGJzX2luZm9fcyB7CiAJY3B1dGltZTY0X3QgcHJldl9jcHVfaWRsZTsKIAljcHV0aW1lNjRfdCBwcmV2X2NwdV93YWxsOwogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3VyX3BvbGljeTsKLSAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisgCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKwllbnVtIGRic19zYW1wbGUgc2FtcGxlX3R5cGU7CiAJdW5zaWduZWQgaW50IGVuYWJsZTsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXFfdGFibGU7CiAJdW5zaWduZWQgaW50IGZyZXFfbG87CkBAIC0yMDIsNyArMjA4LDggQEAKIAlyZXQgPSBzc2NhbmYoYnVmLCAiJXUiLCAmaW5wdXQpOwogCiAJbXV0ZXhfbG9jaygmZGJzX211dGV4KTsKLQlpZiAocmV0ICE9IDEgfHwgaW5wdXQgPiBNQVhfU0FNUExJTkdfUkFURSB8fCBpbnB1dCA8IE1JTl9TQU1QTElOR19SQVRFKSB7CisJaWYgKHJldCAhPSAxIHx8IGlucHV0ID4gTUFYX1NBTVBMSU5HX1JBVEUKKwkJICAgICB8fCBpbnB1dCA8IE1JTl9TQU1QTElOR19SQVRFKSB7CiAJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzkzLDggKzQwMCwxNSBAQAogCSAqIHBvbGljeS4gVG8gYmUgc2FmZSwgd2UgZm9jdXMgMTAgcG9pbnRzIHVuZGVyIHRoZSB0aHJlc2hvbGQuCiAJICovCiAJaWYgKGxvYWQgPCAoZGJzX3R1bmVyc19pbnMudXBfdGhyZXNob2xkIC0gMTApKSB7Ci0JCXVuc2lnbmVkIGludCBmcmVxX25leHQgPSAocG9saWN5LT5jdXIgKiBsb2FkKSAvCisJCXVuc2lnbmVkIGludCBmcmVxX25leHQsIGZyZXFfY3VyOworCisJCWZyZXFfY3VyID0gY3B1ZnJlcV9kcml2ZXJfZ2V0YXZnKHBvbGljeSk7CisJCWlmICghZnJlcV9jdXIpCisJCQlmcmVxX2N1ciA9IHBvbGljeS0+Y3VyOworCisJCWZyZXFfbmV4dCA9IChmcmVxX2N1ciAqIGxvYWQpIC8KIAkJCShkYnNfdHVuZXJzX2lucy51cF90aHJlc2hvbGQgLSAxMCk7CisKIAkJaWYgKCFkYnNfdHVuZXJzX2lucy5wb3dlcnNhdmVfYmlhcykgewogCQkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCBmcmVxX25leHQsCiAJCQkJCUNQVUZSRVFfUkVMQVRJT05fTCk7CkBAIC00MDcsMzAgKzQyMSwzMSBAQAogCX0KIH0KIAotLyogU2FtcGxpbmcgdHlwZXMgKi8KLWVudW0ge0RCU19OT1JNQUxfU0FNUExFLCBEQlNfU1VCX1NBTVBMRX07Ci0KLXN0YXRpYyB2b2lkIGRvX2Ric190aW1lcih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZG9fZGJzX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGNwdSk7CisJZW51bSBkYnNfc2FtcGxlIHNhbXBsZV90eXBlID0gZGJzX2luZm8tPnNhbXBsZV90eXBlOwogCS8qIFdlIHdhbnQgYWxsIENQVXMgdG8gZG8gc2FtcGxpbmcgbmVhcmx5IG9uIHNhbWUgamlmZnkgKi8KIAlpbnQgZGVsYXkgPSB1c2Vjc190b19qaWZmaWVzKGRic190dW5lcnNfaW5zLnNhbXBsaW5nX3JhdGUpOworCisJLyogUGVybWl0IHJlc2NoZWR1bGluZyBvZiB0aGlzIHdvcmsgaXRlbSAqLworCXdvcmtfcmVsZWFzZSh3b3JrKTsKKwogCWRlbGF5IC09IGppZmZpZXMgJSBkZWxheTsKIAogCWlmICghZGJzX2luZm8tPmVuYWJsZSkKIAkJcmV0dXJuOwogCS8qIENvbW1vbiBOT1JNQUxfU0FNUExFIHNldHVwICovCi0JSU5JVF9XT1JLKCZkYnNfaW5mby0+d29yaywgZG9fZGJzX3RpbWVyLCAodm9pZCAqKURCU19OT1JNQUxfU0FNUExFKTsKKwlkYnNfaW5mby0+c2FtcGxlX3R5cGUgPSBEQlNfTk9STUFMX1NBTVBMRTsKIAlpZiAoIWRic190dW5lcnNfaW5zLnBvd2Vyc2F2ZV9iaWFzIHx8Ci0JICAgICh1bnNpZ25lZCBsb25nKSBkYXRhID09IERCU19OT1JNQUxfU0FNUExFKSB7CisJICAgIHNhbXBsZV90eXBlID09IERCU19OT1JNQUxfU0FNUExFKSB7CiAJCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAkJZGJzX2NoZWNrX2NwdShkYnNfaW5mbyk7CiAJCXVubG9ja19jcHVfaG90cGx1ZygpOwogCQlpZiAoZGJzX2luZm8tPmZyZXFfbG8pIHsKIAkJCS8qIFNldHVwIHRpbWVyIGZvciBTVUJfU0FNUExFICovCi0JCQlJTklUX1dPUksoJmRic19pbmZvLT53b3JrLCBkb19kYnNfdGltZXIsCi0JCQkJCSh2b2lkICopREJTX1NVQl9TQU1QTEUpOworCQkJZGJzX2luZm8tPnNhbXBsZV90eXBlID0gREJTX1NVQl9TQU1QTEU7CiAJCQlkZWxheSA9IGRic19pbmZvLT5mcmVxX2hpX2ppZmZpZXM7CiAJCX0KIAl9IGVsc2UgewpAQCAtNDQ5LDcgKzQ2NCw4IEBACiAJZGVsYXkgLT0gamlmZmllcyAlIGRlbGF5OwogCiAJb25kZW1hbmRfcG93ZXJzYXZlX2JpYXNfaW5pdCgpOwotCUlOSVRfV09SSygmZGJzX2luZm8tPndvcmssIGRvX2Ric190aW1lciwgTlVMTCk7CisJSU5JVF9ERUxBWUVEX1dPUktfTkFSKCZkYnNfaW5mby0+d29yaywgZG9fZGJzX3RpbWVyKTsKKwlkYnNfaW5mby0+c2FtcGxlX3R5cGUgPSBEQlNfTk9STUFMX1NBTVBMRTsKIAlxdWV1ZV9kZWxheWVkX3dvcmtfb24oY3B1LCBrb25kZW1hbmRfd3EsICZkYnNfaW5mby0+d29yaywgZGVsYXkpOwogfQogCkBAIC00NjYsNiArNDgyLDcgQEAKIAl1bnNpZ25lZCBpbnQgY3B1ID0gcG9saWN5LT5jcHU7CiAJc3RydWN0IGNwdV9kYnNfaW5mb19zICp0aGlzX2Ric19pbmZvOwogCXVuc2lnbmVkIGludCBqOworCWludCByYzsKIAogCXRoaXNfZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGNwdSk7CiAKQEAgLTQ4OCwxMiArNTA1LDIzIEBACiAJCWlmIChkYnNfZW5hYmxlID09IDEpIHsKIAkJCWtvbmRlbWFuZF93cSA9IGNyZWF0ZV93b3JrcXVldWUoImtvbmRlbWFuZCIpOwogCQkJaWYgKCFrb25kZW1hbmRfd3EpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkNyZWF0aW9uIG9mIGtvbmRlbWFuZCBmYWlsZWRcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkgIkNyZWF0aW9uIG9mIGtvbmRlbWFuZCBmYWlsZWRcbiIpOwogCQkJCWRic19lbmFibGUtLTsKIAkJCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CiAJCQkJcmV0dXJuIC1FTk9TUEM7CiAJCQl9CiAJCX0KKworCQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmZGJzX2F0dHJfZ3JvdXApOworCQlpZiAocmMpIHsKKwkJCWlmIChkYnNfZW5hYmxlID09IDEpCisJCQkJZGVzdHJveV93b3JrcXVldWUoa29uZGVtYW5kX3dxKTsKKwkJCWRic19lbmFibGUtLTsKKwkJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKKwkJCXJldHVybiByYzsKKwkJfQorCiAJCWZvcl9lYWNoX2NwdV9tYXNrKGosIHBvbGljeS0+Y3B1cykgewogCQkJc3RydWN0IGNwdV9kYnNfaW5mb19zICpqX2Ric19pbmZvOwogCQkJal9kYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgaik7CkBAIC01MDMsNyArNTMxLDYgQEAKIAkJCWpfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwgPSBnZXRfamlmZmllc182NCgpOwogCQl9CiAJCXRoaXNfZGJzX2luZm8tPmVuYWJsZSA9IDE7Ci0JCXN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9saWN5LT5rb2JqLCAmZGJzX2F0dHJfZ3JvdXApOwogCQkvKgogCQkgKiBTdGFydCB0aGUgdGltZXJzY2hlZHVsZSB3b3JrLCB3aGVuIHRoaXMgZ292ZXJub3IKIAkJICogaXMgdXNlZCBmb3IgZmlyc3QgdGltZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcGVyZm9ybWFuY2UuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3BlcmZvcm1hbmNlLmMKaW5kZXggZGU5MWUzMy4uZThlMTQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcGVyZm9ybWFuY2UuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9wZXJmb3JtYW5jZS5jCkBAIC0xNSw3ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAotI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19HT1ZFUk5PUiwgInBlcmZvcm1hbmNlIiwgbXNnKQorI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgXAorCWNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfR09WRVJOT1IsICJwZXJmb3JtYW5jZSIsIG1zZykKIAogCiBzdGF0aWMgaW50IGNwdWZyZXFfZ292ZXJub3JfcGVyZm9ybWFuY2Uoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCkBAIC0yNCw4ICsyNSwxMCBAQAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIENQVUZSRVFfR09WX1NUQVJUOgogCWNhc2UgQ1BVRlJFUV9HT1ZfTElNSVRTOgotCQlkcHJpbnRrKCJzZXR0aW5nIHRvICV1IGtIeiBiZWNhdXNlIG9mIGV2ZW50ICV1XG4iLCBwb2xpY3ktPm1heCwgZXZlbnQpOwotCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChwb2xpY3ksIHBvbGljeS0+bWF4LCBDUFVGUkVRX1JFTEFUSU9OX0gpOworCQlkcHJpbnRrKCJzZXR0aW5nIHRvICV1IGtIeiBiZWNhdXNlIG9mIGV2ZW50ICV1XG4iLAorCQkJCQkJcG9saWN5LT5tYXgsIGV2ZW50KTsKKwkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCBwb2xpY3ktPm1heCwKKwkJCQkJCUNQVUZSRVFfUkVMQVRJT05fSCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfcG93ZXJzYXZlLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9wb3dlcnNhdmUuYwppbmRleCAwYTI1OTYwLi4xM2ZlMDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9wb3dlcnNhdmUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9wb3dlcnNhdmUuYwpAQCAtMTUsNyArMTUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfR09WRVJOT1IsICJwb3dlcnNhdmUiLCBtc2cpCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBcCisJY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19HT1ZFUk5PUiwgInBvd2Vyc2F2ZSIsIG1zZykKIAogc3RhdGljIGludCBjcHVmcmVxX2dvdmVybm9yX3Bvd2Vyc2F2ZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQkJdW5zaWduZWQgaW50IGV2ZW50KQpAQCAtMjMsOCArMjQsMTAgQEAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBDUFVGUkVRX0dPVl9TVEFSVDoKIAljYXNlIENQVUZSRVFfR09WX0xJTUlUUzoKLQkJZHByaW50aygic2V0dGluZyB0byAldSBrSHogYmVjYXVzZSBvZiBldmVudCAldVxuIiwgcG9saWN5LT5taW4sIGV2ZW50KTsKLQkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCBwb2xpY3ktPm1pbiwgQ1BVRlJFUV9SRUxBVElPTl9MKTsKKwkJZHByaW50aygic2V0dGluZyB0byAldSBrSHogYmVjYXVzZSBvZiBldmVudCAldVxuIiwKKwkJCQkJCQlwb2xpY3ktPm1pbiwgZXZlbnQpOworCQlfX2NwdWZyZXFfZHJpdmVyX3RhcmdldChwb2xpY3ksIHBvbGljeS0+bWluLAorCQkJCQkJQ1BVRlJFUV9SRUxBVElPTl9MKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwppbmRleCBjMmVjYzU5Li42NzQyYjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKQEAgLTM1MSw4ICszNTEsOCBAQAogCiAJcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjcHVmcmVxX3N0YXRfY3B1X25vdGlmaWVyKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQljcHVmcmVxX3N0YXRfY3B1X2NhbGxiYWNrKCZjcHVmcmVxX3N0YXRfY3B1X25vdGlmaWVyLCBDUFVfT05MSU5FLAotCQkJKHZvaWQgKikobG9uZyljcHUpOworCQljcHVmcmVxX3N0YXRfY3B1X2NhbGxiYWNrKCZjcHVmcmVxX3N0YXRfY3B1X25vdGlmaWVyLAorCQkJCUNQVV9PTkxJTkUsICh2b2lkICopKGxvbmcpY3B1KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zNjgsMTQgKzM2OCwxNSBAQAogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjcHVmcmVxX3N0YXRfY3B1X25vdGlmaWVyKTsKIAlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJY3B1ZnJlcV9zdGF0X2NwdV9jYWxsYmFjaygmY3B1ZnJlcV9zdGF0X2NwdV9ub3RpZmllciwgQ1BVX0RFQUQsCi0JCQkodm9pZCAqKShsb25nKWNwdSk7CisJCWNwdWZyZXFfc3RhdF9jcHVfY2FsbGJhY2soJmNwdWZyZXFfc3RhdF9jcHVfbm90aWZpZXIsCisJCQkJCQlDUFVfREVBRCwgKHZvaWQgKikobG9uZyljcHUpOwogCX0KIAl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0KIAogTU9EVUxFX0FVVEhPUiAoIlpvdSBOYW4gaGFpIDxuYW5oYWkuem91QGludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTiAoIidjcHVmcmVxX3N0YXRzJyAtIEEgZHJpdmVyIHRvIGV4cG9ydCBjcHVmcmVxIHN0YXRzIHRocm91Z2ggc3lzZnMgZmlsZXN5c3RlbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiJ2NwdWZyZXFfc3RhdHMnIC0gQSBkcml2ZXIgdG8gZXhwb3J0IGNwdWZyZXEgc3RhdHMiCisJCQkJInRocm91Z2ggc3lzZnMgZmlsZXN5c3RlbSIpOwogTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKIAogbW9kdWxlX2luaXQoY3B1ZnJlcV9zdGF0c19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKaW5kZXggYTA2YzIwNC4uMmE0ZWIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKQEAgLTEzMSwxOSArMTMxLDI2IEBACiAJCQkJICAgdW5zaWduZWQgaW50IGV2ZW50KQogewogCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKwlpbnQgcmMgPSAwOworCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgQ1BVRlJFUV9HT1ZfU1RBUlQ6CiAJCWlmICghY3B1X29ubGluZShjcHUpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCUJVR19PTighcG9saWN5LT5jdXIpOwogCQltdXRleF9sb2NrKCZ1c2Vyc3BhY2VfbXV0ZXgpOworCQlyYyA9IHN5c2ZzX2NyZWF0ZV9maWxlICgmcG9saWN5LT5rb2JqLAorCQkJCQkmZnJlcV9hdHRyX3NjYWxpbmdfc2V0c3BlZWQuYXR0cik7CisJCWlmIChyYykKKwkJCWdvdG8gc3RhcnRfb3V0OworCiAJCWNwdV9pc19tYW5hZ2VkW2NwdV0gPSAxOwogCQljcHVfbWluX2ZyZXFbY3B1XSA9IHBvbGljeS0+bWluOwogCQljcHVfbWF4X2ZyZXFbY3B1XSA9IHBvbGljeS0+bWF4OwogCQljcHVfY3VyX2ZyZXFbY3B1XSA9IHBvbGljeS0+Y3VyOwogCQljcHVfc2V0X2ZyZXFbY3B1XSA9IHBvbGljeS0+Y3VyOwotCQlzeXNmc19jcmVhdGVfZmlsZSAoJnBvbGljeS0+a29iaiwgJmZyZXFfYXR0cl9zY2FsaW5nX3NldHNwZWVkLmF0dHIpOwogCQlkcHJpbnRrKCJtYW5hZ2luZyBjcHUgJXUgc3RhcnRlZCAoJXUgLSAldSBrSHosIGN1cnJlbnRseSAldSBrSHopXG4iLCBjcHUsIGNwdV9taW5fZnJlcVtjcHVdLCBjcHVfbWF4X2ZyZXFbY3B1XSwgY3B1X2N1cl9mcmVxW2NwdV0pOworc3RhcnRfb3V0OgogCQltdXRleF91bmxvY2soJnVzZXJzcGFjZV9tdXRleCk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVRlJFUV9HT1ZfU1RPUDoKQEAgLTE4MCw3ICsxODcsNyBAQAogCQltdXRleF91bmxvY2soJnVzZXJzcGFjZV9tdXRleCk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9mcmVxX3RhYmxlLmMKaW5kZXggNTUxZjRjYy4uZTc0OTA5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvZnJlcV90YWJsZS5jCkBAIC05LDcgKzksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAKLSNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfQ09SRSwgImZyZXEtdGFibGUiLCBtc2cpCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBcCisJY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19DT1JFLCAiZnJlcS10YWJsZSIsIG1zZykKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICBGUkVRVUVOQ1kgVEFCTEUgSEVMUEVSUyAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtMjksNyArMzAsOCBAQAogCiAJCQljb250aW51ZTsKIAkJfQotCQlkcHJpbnRrKCJ0YWJsZSBlbnRyeSAldTogJXUga0h6LCAldSBpbmRleFxuIiwgaSwgZnJlcSwgdGFibGVbaV0uaW5kZXgpOworCQlkcHJpbnRrKCJ0YWJsZSBlbnRyeSAldTogJXUga0h6LCAldSBpbmRleFxuIiwKKwkJCQkJaSwgZnJlcSwgdGFibGVbaV0uaW5kZXgpOwogCQlpZiAoZnJlcSA8IG1pbl9mcmVxKQogCQkJbWluX2ZyZXEgPSBmcmVxOwogCQlpZiAoZnJlcSA+IG1heF9mcmVxKQpAQCAtNTQsMTMgKzU2LDE0IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAotCWRwcmludGsoInJlcXVlc3QgZm9yIHZlcmlmaWNhdGlvbiBvZiBwb2xpY3kgKCV1IC0gJXUga0h6KSBmb3IgY3B1ICV1XG4iLCBwb2xpY3ktPm1pbiwgcG9saWN5LT5tYXgsIHBvbGljeS0+Y3B1KTsKKwlkcHJpbnRrKCJyZXF1ZXN0IGZvciB2ZXJpZmljYXRpb24gb2YgcG9saWN5ICgldSAtICV1IGtIeikgZm9yIGNwdSAldVxuIiwKKwkJCQkJcG9saWN5LT5taW4sIHBvbGljeS0+bWF4LCBwb2xpY3ktPmNwdSk7CiAKIAlpZiAoIWNwdV9vbmxpbmUocG9saWN5LT5jcHUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LAotCQkJCSAgICAgcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxLCBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsCisJCQkJICAgICBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOwogCiAJZm9yIChpPTA7ICh0YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQpOyBpKyspIHsKIAkJdW5zaWduZWQgaW50IGZyZXEgPSB0YWJsZVtpXS5mcmVxdWVuY3k7CkBAIC03NSwxMCArNzgsMTEgQEAKIAlpZiAoIWNvdW50KQogCQlwb2xpY3ktPm1heCA9IG5leHRfbGFyZ2VyOwogCi0JY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksCi0JCQkJICAgICBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7CisJY3B1ZnJlcV92ZXJpZnlfd2l0aGluX2xpbWl0cyhwb2xpY3ksIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwKKwkJCQkgICAgIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcSk7CiAKLQlkcHJpbnRrKCJ2ZXJpZmljYXRpb24gbGVhZCB0byAoJXUgLSAldSBrSHopIGZvciBjcHUgJXVcbiIsIHBvbGljeS0+bWluLCBwb2xpY3ktPm1heCwgcG9saWN5LT5jcHUpOworCWRwcmludGsoInZlcmlmaWNhdGlvbiBsZWFkIHRvICgldSAtICV1IGtIeikgZm9yIGNwdSAldVxuIiwKKwkJCQlwb2xpY3ktPm1pbiwgcG9saWN5LT5tYXgsIHBvbGljeS0+Y3B1KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTAxLDcgKzEwNSw4IEBACiAJfTsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWRwcmludGsoInJlcXVlc3QgZm9yIHRhcmdldCAldSBrSHogKHJlbGF0aW9uOiAldSkgZm9yIGNwdSAldVxuIiwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCBwb2xpY3ktPmNwdSk7CisJZHByaW50aygicmVxdWVzdCBmb3IgdGFyZ2V0ICV1IGtIeiAocmVsYXRpb246ICV1KSBmb3IgY3B1ICV1XG4iLAorCQkJCQl0YXJnZXRfZnJlcSwgcmVsYXRpb24sIHBvbGljeS0+Y3B1KTsKIAogCXN3aXRjaCAocmVsYXRpb24pIHsKIAljYXNlIENQVUZSRVFfUkVMQVRJT05fSDoKQEAgLTE5Miw3ICsxOTcsMTAgQEAKIH0KIAogc3RydWN0IGZyZXFfYXR0ciBjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcyA9IHsKLQkuYXR0ciA9IHsgLm5hbWUgPSAic2NhbGluZ19hdmFpbGFibGVfZnJlcXVlbmNpZXMiLCAubW9kZSA9IDA0NDQsIC5vd25lcj1USElTX01PRFVMRSB9LAorCS5hdHRyID0geyAubmFtZSA9ICJzY2FsaW5nX2F2YWlsYWJsZV9mcmVxdWVuY2llcyIsCisJCSAgLm1vZGUgPSAwNDQ0LAorCQkgIC5vd25lcj1USElTX01PRFVMRQorCQl9LAogCS5zaG93ID0gc2hvd19hdmFpbGFibGVfZnJlcXMsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZyBiL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKaW5kZXggYWRiNTU0MS4uODc5MjUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZworKysgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCkBAIC01MSw0ICs1MSwxNyBAQAogCSAgSWYgdW5zdXJlIHNheSBNLiBUaGUgY29tcGlsZWQgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBwYWRsb2NrLXNoYS5rbwogCitjb25maWcgQ1JZUFRPX0RFVl9HRU9ERQorCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgR2VvZGUgTFggQUVTIGVuZ2luZSIKKwlkZXBlbmRzIG9uIENSWVBUTyAmJiBYODZfMzIgJiYgUENJCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwlzZWxlY3QgQ1JZUFRPX0JMS0NJUEhFUgorCWRlZmF1bHQgbQorCWhlbHAKKwkgIFNheSAnWScgaGVyZSB0byB1c2UgdGhlIEFNRCBHZW9kZSBMWCBwcm9jZXNzb3Igb24tYm9hcmQgQUVTCisJICBlbmdpbmUgZm9yIHRoZSBDcnlwdG9BUEkgQUVTIGFsb2dyaXRobS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2VvZGUtYWVzLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9NYWtlZmlsZSBiL2RyaXZlcnMvY3J5cHRvL01ha2VmaWxlCmluZGV4IDRjM2QwZWMuLjYwNTljZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY3J5cHRvL01ha2VmaWxlCkBAIC0xLDMgKzEsNCBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfUEFETE9DSykgKz0gcGFkbG9jay5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9QQURMT0NLX0FFUykgKz0gcGFkbG9jay1hZXMubwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfUEFETE9DS19TSEEpICs9IHBhZGxvY2stc2hhLm8KK29iai0kKENPTkZJR19DUllQVE9fREVWX0dFT0RFKSArPSBnZW9kZS1hZXMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vZ2VvZGUtYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9nZW9kZS1hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2E2ODM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vZ2VvZGUtYWVzLmMKQEAgLTAsMCArMSw0NzQgQEAKKyAvKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiwgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2FsZ2FwaS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpbmNsdWRlICJnZW9kZS1hZXMuaCIKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBBRVNfQ1RSTEFfUkVHICAweDAwMDAKKworI2RlZmluZSBBRVNfQ1RSTF9TVEFSVCAgICAgMHgwMQorI2RlZmluZSBBRVNfQ1RSTF9ERUNSWVBUICAgMHgwMAorI2RlZmluZSBBRVNfQ1RSTF9FTkNSWVBUICAgMHgwMgorI2RlZmluZSBBRVNfQ1RSTF9XUktFWSAgICAgMHgwNAorI2RlZmluZSBBRVNfQ1RSTF9EQ0EgICAgICAgMHgwOAorI2RlZmluZSBBRVNfQ1RSTF9TQ0EgICAgICAgMHgxMAorI2RlZmluZSBBRVNfQ1RSTF9DQkMgICAgICAgMHgyMAorCisjZGVmaW5lIEFFU19JTlRSX1JFRyAgMHgwMDA4CisKKyNkZWZpbmUgQUVTX0lOVFJBX1BFTkRJTkcgKDEgPDwgMTYpCisjZGVmaW5lIEFFU19JTlRSQl9QRU5ESU5HICgxIDw8IDE3KQorCisjZGVmaW5lIEFFU19JTlRSX1BFTkRJTkcgIChBRVNfSU5UUkFfUEVORElORyB8IEFFU19JTlRSQl9QRU5ESU5HKQorI2RlZmluZSBBRVNfSU5UUl9NQVNLICAgICAweDA3CisKKyNkZWZpbmUgQUVTX1NPVVJDRUFfUkVHICAgMHgwMDEwCisjZGVmaW5lIEFFU19EU1RBX1JFRyAgICAgIDB4MDAxNAorI2RlZmluZSBBRVNfTEVOQV9SRUcgICAgICAweDAwMTgKKyNkZWZpbmUgQUVTX1dSSVRFS0VZMF9SRUcgMHgwMDMwCisjZGVmaW5lIEFFU19XUklURUlWMF9SRUcgIDB4MDA0MAorCisvKiAgQSB2ZXJ5IGxhcmdlIGNvdW50ZXIgdGhhdCBpcyB1c2VkIHRvIGdyYWNlZnVsbHkgYmFpbCBvdXQgb2YgYW4KKyAqICBvcGVyYXRpb24gaW4gY2FzZSBvZiB0cm91YmxlCisgKi8KKworI2RlZmluZSBBRVNfT1BfVElNRU9VVCAgICAweDUwMDAwCisKKy8qIFN0YXRpYyBzdHJ1Y3R1cmVzICovCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBfaW9iYXNlOworc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKKworLyogV3JpdGUgYSAxMjggYml0IGZpZWxkIChlaXRoZXIgYSB3cml0YWJsZSBrZXkgb3IgSVYpICovCitzdGF0aWMgaW5saW5lIHZvaWQKK193cml0ZWZpZWxkKHUzMiBvZmZzZXQsIHZvaWQgKnZhbHVlKQoreworCWludCBpOworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwkJaW93cml0ZTMyKCgodTMyICopIHZhbHVlKVtpXSwgX2lvYmFzZSArIG9mZnNldCArIChpICogNCkpOworfQorCisvKiBSZWFkIGEgMTI4IGJpdCBmaWVsZCAoZWl0aGVyIGEgd3JpdGFibGUga2V5IG9yIElWKSAqLworc3RhdGljIGlubGluZSB2b2lkCitfcmVhZGZpZWxkKHUzMiBvZmZzZXQsIHZvaWQgKnZhbHVlKQoreworCWludCBpOworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwkJKCh1MzIgKikgdmFsdWUpW2ldID0gaW9yZWFkMzIoX2lvYmFzZSArIG9mZnNldCArIChpICogNCkpOworfQorCitzdGF0aWMgaW50Citkb19jcnlwdCh2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgdTMyIGZsYWdzKQoreworCXUzMiBzdGF0dXM7CisJdTMyIGNvdW50ZXIgPSBBRVNfT1BfVElNRU9VVDsKKworCWlvd3JpdGUzMih2aXJ0X3RvX3BoeXMoc3JjKSwgX2lvYmFzZSArIEFFU19TT1VSQ0VBX1JFRyk7CisJaW93cml0ZTMyKHZpcnRfdG9fcGh5cyhkc3QpLCBfaW9iYXNlICsgQUVTX0RTVEFfUkVHKTsKKwlpb3dyaXRlMzIobGVuLCAgX2lvYmFzZSArIEFFU19MRU5BX1JFRyk7CisKKwkvKiBTdGFydCB0aGUgb3BlcmF0aW9uICovCisJaW93cml0ZTMyKEFFU19DVFJMX1NUQVJUIHwgZmxhZ3MsIF9pb2Jhc2UgKyBBRVNfQ1RSTEFfUkVHKTsKKworCWRvCisJCXN0YXR1cyA9IGlvcmVhZDMyKF9pb2Jhc2UgKyBBRVNfSU5UUl9SRUcpOworCXdoaWxlKCEoc3RhdHVzICYgQUVTX0lOVFJBX1BFTkRJTkcpICYmIC0tY291bnRlcik7CisKKwkvKiBDbGVhciB0aGUgZXZlbnQgKi8KKwlpb3dyaXRlMzIoKHN0YXR1cyAmIDB4RkYpIHwgQUVTX0lOVFJBX1BFTkRJTkcsIF9pb2Jhc2UgKyBBRVNfSU5UUl9SRUcpOworCXJldHVybiBjb3VudGVyID8gMCA6IDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2dlb2RlX2Flc19jcnlwdChzdHJ1Y3QgZ2VvZGVfYWVzX29wICpvcCkKK3sKKworCXUzMiBmbGFncyA9IDA7CisJaW50IGlmbGFnczsKKworCWlmIChvcC0+bGVuID09IDAgfHwgb3AtPnNyYyA9PSBvcC0+ZHN0KQorCQlyZXR1cm4gMDsKKworCWlmIChvcC0+ZmxhZ3MgJiBBRVNfRkxBR1NfQ09IRVJFTlQpCisJCWZsYWdzIHw9IChBRVNfQ1RSTF9EQ0EgfCBBRVNfQ1RSTF9TQ0EpOworCisJaWYgKG9wLT5kaXIgPT0gQUVTX0RJUl9FTkNSWVBUKQorCQlmbGFncyB8PSBBRVNfQ1RSTF9FTkNSWVBUOworCisJLyogU3RhcnQgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBpZmxhZ3MpOworCisJaWYgKG9wLT5tb2RlID09IEFFU19NT0RFX0NCQykgeworCQlmbGFncyB8PSBBRVNfQ1RSTF9DQkM7CisJCV93cml0ZWZpZWxkKEFFU19XUklURUlWMF9SRUcsIG9wLT5pdik7CisJfQorCisJaWYgKG9wLT5mbGFncyAmIEFFU19GTEFHU19VU1JLRVkpIHsKKwkJZmxhZ3MgfD0gQUVTX0NUUkxfV1JLRVk7CisJCV93cml0ZWZpZWxkKEFFU19XUklURUtFWTBfUkVHLCBvcC0+a2V5KTsKKwl9CisKKwlkb19jcnlwdChvcC0+c3JjLCBvcC0+ZHN0LCBvcC0+bGVuLCBmbGFncyk7CisKKwlpZiAob3AtPm1vZGUgPT0gQUVTX01PREVfQ0JDKQorCQlfcmVhZGZpZWxkKEFFU19XUklURUlWMF9SRUcsIG9wLT5pdik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBpZmxhZ3MpOworCisJcmV0dXJuIG9wLT5sZW47Cit9CisKKy8qIENSWVBUTy1BUEkgRnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQKK2dlb2RlX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBnZW9kZV9hZXNfb3AgKm9wID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKworCWlmIChsZW4gIT0gQUVTX0tFWV9MRU5HVEgpIHsKKwkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbWNweShvcC0+a2V5LCBrZXksIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitnZW9kZV9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3sKKwlzdHJ1Y3QgZ2VvZGVfYWVzX29wICpvcCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKwlpZiAoKG91dCA9PSBOVUxMKSB8fCAoaW4gPT0gTlVMTCkpCisJCXJldHVybjsKKworCW9wLT5zcmMgPSAodm9pZCAqKSBpbjsKKwlvcC0+ZHN0ID0gKHZvaWQgKikgb3V0OworCW9wLT5tb2RlID0gQUVTX01PREVfRUNCOworCW9wLT5mbGFncyA9IDA7CisJb3AtPmxlbiA9IEFFU19NSU5fQkxPQ0tfU0laRTsKKwlvcC0+ZGlyID0gQUVTX0RJUl9FTkNSWVBUOworCisJZ2VvZGVfYWVzX2NyeXB0KG9wKTsKK30KKworCitzdGF0aWMgdm9pZAorZ2VvZGVfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCit7CisJc3RydWN0IGdlb2RlX2Flc19vcCAqb3AgPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisJaWYgKChvdXQgPT0gTlVMTCkgfHwgKGluID09IE5VTEwpKQorCQlyZXR1cm47CisKKwlvcC0+c3JjID0gKHZvaWQgKikgaW47CisJb3AtPmRzdCA9ICh2b2lkICopIG91dDsKKwlvcC0+bW9kZSA9IEFFU19NT0RFX0VDQjsKKwlvcC0+ZmxhZ3MgPSAwOworCW9wLT5sZW4gPSBBRVNfTUlOX0JMT0NLX1NJWkU7CisJb3AtPmRpciA9IEFFU19ESVJfREVDUllQVDsKKworCWdlb2RlX2Flc19jcnlwdChvcCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGdlb2RlX2FsZyA9IHsKKwkuY3JhX25hbWUgICAgICAgICAgICAgICA9ICAgICAgICJhZXMiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAgICAgICAiZ2VvZGUtYWVzLTEyOCIsCisJLmNyYV9wcmlvcml0eSAgICAgICAgICAgPSAgICAgICAzMDAsCisJLmNyYV9hbGlnbm1hc2sgICAgICAgICAgPSAgICAgICAxNSwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JQUVTX01JTl9CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGdlb2RlX2Flc19vcCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGdlb2RlX2FsZy5jcmFfbGlzdCksCisJLmNyYV91CQkJPQl7CisJCS5jaXBoZXIgPSB7CisJCQkuY2lhX21pbl9rZXlzaXplCT0gIEFFU19LRVlfTEVOR1RILAorCQkJLmNpYV9tYXhfa2V5c2l6ZQk9ICBBRVNfS0VZX0xFTkdUSCwKKwkJCS5jaWFfc2V0a2V5CQk9ICBnZW9kZV9zZXRrZXksCisJCQkuY2lhX2VuY3J5cHQJCT0gIGdlb2RlX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJCT0gIGdlb2RlX2RlY3J5cHQKKwkJfQorCX0KK307CisKK3N0YXRpYyBpbnQKK2dlb2RlX2NiY19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgZ2VvZGVfYWVzX29wICpvcCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJaW50IGVyciwgcmV0OworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwl3aGlsZSgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW9wLT5zcmMgPSB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCW9wLT5kc3QgPSB3YWxrLmRzdC52aXJ0LmFkZHI7CisJCW9wLT5tb2RlID0gQUVTX01PREVfQ0JDOworCQlvcC0+bGVuID0gbmJ5dGVzIC0gKG5ieXRlcyAlIEFFU19NSU5fQkxPQ0tfU0laRSk7CisJCW9wLT5kaXIgPSBBRVNfRElSX0RFQ1JZUFQ7CisKKwkJbWVtY3B5KG9wLT5pdiwgd2Fsay5pdiwgQUVTX0lWX0xFTkdUSCk7CisKKwkJcmV0ID0gZ2VvZGVfYWVzX2NyeXB0KG9wKTsKKworCQltZW1jcHkod2Fsay5pdiwgb3AtPml2LCBBRVNfSVZfTEVOR1RIKTsKKwkJbmJ5dGVzIC09IHJldDsKKworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK2dlb2RlX2NiY19lbmNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgZ2VvZGVfYWVzX29wICpvcCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJaW50IGVyciwgcmV0OworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwl3aGlsZSgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW9wLT5zcmMgPSB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCW9wLT5kc3QgPSB3YWxrLmRzdC52aXJ0LmFkZHI7CisJCW9wLT5tb2RlID0gQUVTX01PREVfQ0JDOworCQlvcC0+bGVuID0gbmJ5dGVzIC0gKG5ieXRlcyAlIEFFU19NSU5fQkxPQ0tfU0laRSk7CisJCW9wLT5kaXIgPSBBRVNfRElSX0VOQ1JZUFQ7CisKKwkJbWVtY3B5KG9wLT5pdiwgd2Fsay5pdiwgQUVTX0lWX0xFTkdUSCk7CisKKwkJcmV0ID0gZ2VvZGVfYWVzX2NyeXB0KG9wKTsKKwkJbmJ5dGVzIC09IHJldDsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgZ2VvZGVfY2JjX2FsZyA9IHsKKwkuY3JhX25hbWUJCT0JImNiYyhhZXMpIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0JImNiYy1hZXMtZ2VvZGUtMTI4IiwKKwkuY3JhX3ByaW9yaXR5CQk9CTQwMCwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JQUVTX01JTl9CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGdlb2RlX2Flc19vcCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMTUsCisJLmNyYV90eXBlCQk9CSZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGdlb2RlX2NiY19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeworCQkuYmxrY2lwaGVyID0geworCQkJLm1pbl9rZXlzaXplCQk9CUFFU19LRVlfTEVOR1RILAorCQkJLm1heF9rZXlzaXplCQk9CUFFU19LRVlfTEVOR1RILAorCQkJLnNldGtleQkJCT0JZ2VvZGVfc2V0a2V5LAorCQkJLmVuY3J5cHQJCT0JZ2VvZGVfY2JjX2VuY3J5cHQsCisJCQkuZGVjcnlwdAkJPQlnZW9kZV9jYmNfZGVjcnlwdCwKKwkJfQorCX0KK307CisKK3N0YXRpYyBpbnQKK2dlb2RlX2VjYl9kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKwkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgZ2VvZGVfYWVzX29wICpvcCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJaW50IGVyciwgcmV0OworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwl3aGlsZSgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCW9wLT5zcmMgPSB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCW9wLT5kc3QgPSB3YWxrLmRzdC52aXJ0LmFkZHI7CisJCW9wLT5tb2RlID0gQUVTX01PREVfRUNCOworCQlvcC0+bGVuID0gbmJ5dGVzIC0gKG5ieXRlcyAlIEFFU19NSU5fQkxPQ0tfU0laRSk7CisJCW9wLT5kaXIgPSBBRVNfRElSX0RFQ1JZUFQ7CisKKwkJcmV0ID0gZ2VvZGVfYWVzX2NyeXB0KG9wKTsKKwkJbmJ5dGVzIC09IHJldDsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgbmJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitnZW9kZV9lY2JfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGdlb2RlX2Flc19vcCAqb3AgPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCWludCBlcnIsIHJldDsKKworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgJndhbGspOworCisJd2hpbGUoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQlvcC0+c3JjID0gd2Fsay5zcmMudmlydC5hZGRyLAorCQlvcC0+ZHN0ID0gd2Fsay5kc3QudmlydC5hZGRyOworCQlvcC0+bW9kZSA9IEFFU19NT0RFX0VDQjsKKwkJb3AtPmxlbiA9IG5ieXRlcyAtIChuYnl0ZXMgJSBBRVNfTUlOX0JMT0NLX1NJWkUpOworCQlvcC0+ZGlyID0gQUVTX0RJUl9FTkNSWVBUOworCisJCXJldCA9IGdlb2RlX2Flc19jcnlwdChvcCk7CisJCW5ieXRlcyAtPSByZXQ7CisJCXJldCA9ICBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBnZW9kZV9lY2JfYWxnID0geworCS5jcmFfbmFtZQkJPQkiZWNiKGFlcykiLAorCS5jcmFfZHJpdmVyX25hbWUJPQkiZWNiLWFlcy1nZW9kZS0xMjgiLAorCS5jcmFfcHJpb3JpdHkJCT0JNDAwLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfTUlOX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgZ2VvZGVfYWVzX29wKSwKKwkuY3JhX2FsaWdubWFzawkJPQkxNSwKKwkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoZ2VvZGVfZWNiX2FsZy5jcmFfbGlzdCksCisJLmNyYV91CQkJPQl7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJCT0JQUVTX0tFWV9MRU5HVEgsCisJCQkubWF4X2tleXNpemUJCT0JQUVTX0tFWV9MRU5HVEgsCisJCQkuc2V0a2V5CQkJPQlnZW9kZV9zZXRrZXksCisJCQkuZW5jcnlwdAkJPQlnZW9kZV9lY2JfZW5jcnlwdCwKKwkJCS5kZWNyeXB0CQk9CWdlb2RlX2VjYl9kZWNyeXB0LAorCQl9CisJfQorfTsKKworc3RhdGljIHZvaWQKK2dlb2RlX2Flc19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmdlb2RlX2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZnZW9kZV9lY2JfYWxnKTsKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmdlb2RlX2NiY19hbGcpOworCisJcGNpX2lvdW5tYXAoZGV2LCBfaW9iYXNlKTsKKwlfaW9iYXNlID0gTlVMTDsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKK30KKworCitzdGF0aWMgaW50CitnZW9kZV9hZXNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisKKwlpZiAoKHJldCA9IHBjaV9lbmFibGVfZGV2aWNlKGRldikpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKChyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgImdlb2RlLWFlcy0xMjgiKSkpCisJCWdvdG8gZWVuYWJsZTsKKworCV9pb2Jhc2UgPSBwY2lfaW9tYXAoZGV2LCAwLCAwKTsKKworCWlmIChfaW9iYXNlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcmVxdWVzdDsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmbG9jayk7CisKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBhY3Rpdml0eSAqLworCWlvd3JpdGUzMihBRVNfSU5UUl9QRU5ESU5HIHwgQUVTX0lOVFJfTUFTSywgX2lvYmFzZSArIEFFU19JTlRSX1JFRyk7CisKKwlpZiAoKHJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmdlb2RlX2FsZykpKQorCQlnb3RvIGVpb21hcDsKKworCWlmICgocmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZ2VvZGVfZWNiX2FsZykpKQorCQlnb3RvIGVhbGc7CisKKwlpZiAoKHJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmdlb2RlX2NiY19hbGcpKSkKKwkJZ290byBlZWNiOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJnZW9kZS1hZXM6IEdFT0RFIEFFUyBlbmdpbmUgZW5hYmxlZC5cbiIpOworCXJldHVybiAwOworCisgZWVjYjoKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmdlb2RlX2VjYl9hbGcpOworCisgZWFsZzoKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmdlb2RlX2FsZyk7CisKKyBlaW9tYXA6CisJcGNpX2lvdW5tYXAoZGV2LCBfaW9iYXNlKTsKKworIGVyZXF1ZXN0OgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKworIGVlbmFibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisKKwlwcmludGsoS0VSTl9FUlIgImdlb2RlLWFlczogIEdFT0RFIEFFUyBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ2VvZGVfYWVzX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0xYX0FFUywgUENJX0FOWV9JRCwgUENJX0FOWV9JRH0gLAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGdlb2RlX2Flc190YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZ2VvZGVfYWVzX2RyaXZlciA9IHsKKwkubmFtZSA9ICJHZW9kZSBMWCBBRVMiLAorCS5pZF90YWJsZSA9IGdlb2RlX2Flc190YmwsCisJLnByb2JlID0gZ2VvZGVfYWVzX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChnZW9kZV9hZXNfcmVtb3ZlKQorfTsKKworc3RhdGljIGludCBfX2luaXQKK2dlb2RlX2Flc19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZ2VvZGVfYWVzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZ2VvZGVfYWVzX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmdlb2RlX2Flc19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdlb2RlIExYIEhhcmR3YXJlIEFFUyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoZ2VvZGVfYWVzX2luaXQpOworbW9kdWxlX2V4aXQoZ2VvZGVfYWVzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vZ2VvZGUtYWVzLmggYi9kcml2ZXJzL2NyeXB0by9nZW9kZS1hZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDAzYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vZ2VvZGUtYWVzLmgKQEAgLTAsMCArMSw0MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYsIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0dFT0RFX0FFU19IXworI2RlZmluZSBfR0VPREVfQUVTX0hfCisKKyNkZWZpbmUgQUVTX0tFWV9MRU5HVEggMTYKKyNkZWZpbmUgQUVTX0lWX0xFTkdUSCAgMTYKKworI2RlZmluZSBBRVNfTUlOX0JMT0NLX1NJWkUgMTYKKworI2RlZmluZSBBRVNfTU9ERV9FQ0IgMAorI2RlZmluZSBBRVNfTU9ERV9DQkMgMQorCisjZGVmaW5lIEFFU19ESVJfREVDUllQVCAwCisjZGVmaW5lIEFFU19ESVJfRU5DUllQVCAxCisKKyNkZWZpbmUgQUVTX0ZMQUdTX1VTUktFWSAgICgxIDw8IDApCisjZGVmaW5lIEFFU19GTEFHU19DT0hFUkVOVCAoMSA8PCAxKQorCitzdHJ1Y3QgZ2VvZGVfYWVzX29wIHsKKworCXZvaWQgKnNyYzsKKwl2b2lkICpkc3Q7CisKKwl1MzIgbW9kZTsKKwl1MzIgZGlyOworCXUzMiBmbGFnczsKKwlpbnQgbGVuOworCisJdTgga2V5W0FFU19LRVlfTEVOR1RIXTsKKwl1OCBpdltBRVNfSVZfTEVOR1RIXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdGRtYS5jIGIvZHJpdmVycy9kbWEvaW9hdGRtYS5jCmluZGV4IDAzNTg0MTkuLjhlODcyNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvYXRkbWEuYworKysgYi9kcml2ZXJzL2RtYS9pb2F0ZG1hLmMKQEAgLTYzNiwxMCArNjM2LDEwIEBACiAJZG1hX2Nvb2tpZV90IGNvb2tpZTsKIAlpbnQgZXJyID0gMDsKIAotCXNyYyA9IGt6YWxsb2Moc2l6ZW9mKHU4KSAqIElPQVRfVEVTVF9TSVpFLCBTTEFCX0tFUk5FTCk7CisJc3JjID0ga3phbGxvYyhzaXplb2YodTgpICogSU9BVF9URVNUX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghc3JjKQogCQlyZXR1cm4gLUVOT01FTTsKLQlkZXN0ID0ga3phbGxvYyhzaXplb2YodTgpICogSU9BVF9URVNUX1NJWkUsIFNMQUJfS0VSTkVMKTsKKwlkZXN0ID0ga3phbGxvYyhzaXplb2YodTgpICogSU9BVF9URVNUX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghZGVzdCkgewogCQlrZnJlZShzcmMpOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCmluZGV4IDRiZGUzMGIuLjFiNGZjOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWMuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2VkYWMuaD4KQEAgLTIzMCwzNCArMjMxLDQzIEBACiAgKi8KIHN0YXRpYyBpbnQgZWRhY19zeXNmc19tZW1jdHJsX3NldHVwKHZvaWQpCiB7Ci0JaW50IGVycj0wOworCWludCBlcnIgPSAwOwogCiAJZGVidWdmMSgiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJLyogY3JlYXRlIHRoZSAvc3lzL2RldmljZXMvc3lzdGVtL2VkYWMgZGlyZWN0b3J5ICovCiAJZXJyID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZlZGFjX2NsYXNzKTsKIAotCWlmICghZXJyKSB7Ci0JCS8qIEluaXQgdGhlIE1DJ3Mga29iamVjdCAqLwotCQltZW1zZXQoJmVkYWNfbWVtY3RybF9rb2JqLCAwLCBzaXplb2YgKGVkYWNfbWVtY3RybF9rb2JqKSk7Ci0JCWVkYWNfbWVtY3RybF9rb2JqLnBhcmVudCA9ICZlZGFjX2NsYXNzLmtzZXQua29iajsKLQkJZWRhY19tZW1jdHJsX2tvYmoua3R5cGUgPSAma3R5cGVfbWVtY3RybDsKLQotCQkvKiBnZW5lcmF0ZSBzeXNmcyAiLi4uLi9lZGFjL21jIiAgICovCi0JCWVyciA9IGtvYmplY3Rfc2V0X25hbWUoJmVkYWNfbWVtY3RybF9rb2JqLCJtYyIpOwotCi0JCWlmICghZXJyKSB7Ci0JCQkvKiBGSVhNRTogbWF5YmUgbmV3IHN5c2Rldl9jcmVhdGVfc3ViZGlyKCkgKi8KLQkJCWVyciA9IGtvYmplY3RfcmVnaXN0ZXIoJmVkYWNfbWVtY3RybF9rb2JqKTsKLQotCQkJaWYgKGVycikKLQkJCQlkZWJ1Z2YxKCJGYWlsZWQgdG8gcmVnaXN0ZXIgJy4uLi9lZGFjL21jJ1xuIik7Ci0JCQllbHNlCi0JCQkJZGVidWdmMSgiUmVnaXN0ZXJlZCAnLi4uL2VkYWMvbWMnIGtvYmplY3RcbiIpOwotCQl9Ci0JfSBlbHNlCisJaWYgKGVycikgewogCQlkZWJ1Z2YxKCIlcygpIGVycm9yPSVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKKwkvKiBJbml0IHRoZSBNQydzIGtvYmplY3QgKi8KKwltZW1zZXQoJmVkYWNfbWVtY3RybF9rb2JqLCAwLCBzaXplb2YgKGVkYWNfbWVtY3RybF9rb2JqKSk7CisJZWRhY19tZW1jdHJsX2tvYmoucGFyZW50ID0gJmVkYWNfY2xhc3Mua3NldC5rb2JqOworCWVkYWNfbWVtY3RybF9rb2JqLmt0eXBlID0gJmt0eXBlX21lbWN0cmw7CisKKwkvKiBnZW5lcmF0ZSBzeXNmcyAiLi4uLi9lZGFjL21jIiAgICovCisJZXJyID0ga29iamVjdF9zZXRfbmFtZSgmZWRhY19tZW1jdHJsX2tvYmosIm1jIik7CisKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisKKwkvKiBGSVhNRTogbWF5YmUgbmV3IHN5c2Rldl9jcmVhdGVfc3ViZGlyKCkgKi8KKwllcnIgPSBrb2JqZWN0X3JlZ2lzdGVyKCZlZGFjX21lbWN0cmxfa29iaik7CisKKwlpZiAoZXJyKSB7CisJCWRlYnVnZjEoIkZhaWxlZCB0byByZWdpc3RlciAnLi4uL2VkYWMvbWMnXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCWRlYnVnZjEoIlJlZ2lzdGVyZWQgJy4uLi9lZGFjL21jJyBrb2JqZWN0XG4iKTsKKworCXJldHVybiAwOworCitmYWlsOgorCXN5c2Rldl9jbGFzc191bnJlZ2lzdGVyKCZlZGFjX2NsYXNzKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZjNC9mYy5jIGIvZHJpdmVycy9mYzQvZmMuYwppbmRleCAyMmQxNzQ3Li4yMmI2MmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZjNC9mYy5jCisrKyBiL2RyaXZlcnMvZmM0L2ZjLmMKQEAgLTcwLDkgKzcwLDkgQEAKIAogI2RlZmluZSBGQ1BfQ01ORChTQ3BudCkgKChmY3BfY21uZCAqKSYoU0NwbnQtPlNDcCkpCiAjZGVmaW5lIEZDX1NDTU5EKFNDcG50KSAoKGZjX2NoYW5uZWwgKikoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF0pKQotI2RlZmluZSBTQ19GQ01ORChmY21uZCkgKChTY3NpX0NtbmQgKikoKGxvbmcpZmNtbmQgLSAobG9uZykmKCgoU2NzaV9DbW5kICopMCktPlNDcCkpKQorI2RlZmluZSBTQ19GQ01ORChmY21uZCkJKChzdHJ1Y3Qgc2NzaV9jbW5kICopKChsb25nKWZjbW5kIC0gKGxvbmcpJigoKHN0cnVjdCBzY3NpX2NtbmQgKikwKS0+U0NwKSkpCiAKLXN0YXRpYyBpbnQgZmNwX3Njc2lfcXVldWVfaXQoZmNfY2hhbm5lbCAqLCBTY3NpX0NtbmQgKiwgZmNwX2NtbmQgKiwgaW50KTsKK3N0YXRpYyBpbnQgZmNwX3Njc2lfcXVldWVfaXQoZmNfY2hhbm5lbCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosIGZjcF9jbW5kICosIGludCk7CiB2b2lkIGZjcF9xdWV1ZV9lbXB0eShmY19jaGFubmVsICopOwogCiBzdGF0aWMgdm9pZCBmY3Bfc2NzaV9pbnNlcnRfcXVldWUgKGZjX2NoYW5uZWwgKmZjLCBmY3BfY21uZCAqZmNtZCkKQEAgLTI2Niw3ICsyNjYsNyBAQAogCQkJcHJpbnRrICgiRkM6IEJhZCBtYWdpYyBmcm9tIFJFUE9SVF9BTF9NQVAgb24gJXMgLSAlMDh4XG4iLCBmYy0+bmFtZSwgcC0+bWFnaWMpOwogCQkJZmMtPnN0YXRlID0gRkNfU1RBVEVfT0ZGTElORTsKIAkJfSBlbHNlIHsKLQkJCWZjLT5wb3NtYXAgPSAoZmNwX3Bvc21hcCAqKWt6YWxsb2Moc2l6ZW9mKGZjcF9wb3NtYXApK3AtPmxlbiwgR0ZQX0tFUk5FTCk7CisJCQlmYy0+cG9zbWFwID0ga3phbGxvYyhzaXplb2YoZmNwX3Bvc21hcCkrcC0+bGVuLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghZmMtPnBvc21hcCkgewogCQkJCXByaW50aygiRkM6IE5vdCBlbm91Z2ggbWVtb3J5LCBvZmZsaW5pbmcgY2hhbm5lbFxuIik7CiAJCQkJZmMtPnN0YXRlID0gRkNfU1RBVEVfT0ZGTElORTsKQEAgLTM1NSw3ICszNTUsNyBAQAogCQkJZm9yIChpID0gZmMtPmNhbl9xdWV1ZTsgaSA8IGZjLT5zY3NpX2JpdG1hcF9lbmQ7IGkrKykKIAkJCQlzZXRfYml0IChpLCBmYy0+c2NzaV9iaXRtYXApOwogCQkJZmMtPnNjc2lfZnJlZSA9IGZjLT5jYW5fcXVldWU7Ci0JCQlmYy0+Y21kX3Nsb3RzID0gKGZjcF9jbW5kICoqKWt6YWxsb2Moc2xvdHMgKiBzaXplb2YoZmNwX2NtbmQqKSwgR0ZQX0tFUk5FTCk7CisJCQlmYy0+Y21kX3Nsb3RzID0ga3phbGxvYyhzbG90cyAqIHNpemVvZihmY3BfY21uZCopLCBHRlBfS0VSTkVMKTsKIAkJCWZjLT5hYm9ydF9jb3VudCA9IDA7CiAJCX0gZWxzZSB7CiAJCQlmYy0+c2NzaV9uYW1lWzBdID0gMDsKQEAgLTM3OCwxNCArMzc4LDE0IEBACiAJCXByaW50ayAoIkZDOiAlc2VnaXN0ZXJpbmcgdW5rbm93biB0eXBlICUwMnhcbiIsIHVucmVnaXN0ZXIgPyAiVW5yIiA6ICJSIiwgdHlwZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZjcF9zY3NpX2RvbmUoU2NzaV9DbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBmY3Bfc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKIAogc3RhdGljIGlubGluZSB2b2lkIGZjcF9zY3NpX3JlY2VpdmUoZmNfY2hhbm5lbCAqZmMsIGludCB0b2tlbiwgaW50IHN0YXR1cywgZmNfaGRyICpmY2gpCiB7CiAJZmNwX2NtbmQgKmZjbWQ7CiAJZmNwX3JzcCAgKnJzcDsKIAlpbnQgaG9zdF9zdGF0dXM7Ci0JU2NzaV9DbW5kICpTQ3BudDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKIAlpbnQgc2Vuc2VfbGVuOwogCWludCByc3Bfc3RhdHVzOwogCkBAIC03NTcsMTMgKzc1NywxNCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGZjcF9zY3NpX2RvbmUgKFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgdm9pZCBmY3Bfc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCWlmIChGQ1BfQ01ORChTQ3BudCktPmRvbmUpCiAJCUZDUF9DTU5EKFNDcG50KS0+ZG9uZShTQ3BudCk7CiB9CiAKLXN0YXRpYyBpbnQgZmNwX3Njc2lfcXVldWVfaXQoZmNfY2hhbm5lbCAqZmMsIFNjc2lfQ21uZCAqU0NwbnQsIGZjcF9jbW5kICpmY21kLCBpbnQgcHJlcGFyZSkKK3N0YXRpYyBpbnQgZmNwX3Njc2lfcXVldWVfaXQoZmNfY2hhbm5lbCAqZmMsIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJICAgICBmY3BfY21uZCAqZmNtZCwgaW50IHByZXBhcmUpCiB7CiAJbG9uZyBpOwogCWZjcF9jbWQgKmNtZDsKQEAgLTgzNyw3ICs4MzgsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZmNwX3Njc2lfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqU0NwbnQsIHZvaWQgKCogZG9uZSkoU2NzaV9DbW5kICopKQoraW50IGZjcF9zY3NpX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCSAgdm9pZCAoKiBkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogCWZjcF9jbW5kICpmY21kID0gRkNQX0NNTkQoU0NwbnQpOwogCWZjX2NoYW5uZWwgKmZjID0gRkNfU0NNTkQoU0NwbnQpOwpAQCAtODczLDcgKzg3NSw3IEBACiAJfQogfQogCi1pbnQgZmNwX3Njc2lfYWJvcnQoU2NzaV9DbW5kICpTQ3BudCkKK2ludCBmY3Bfc2NzaV9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAkvKiBJbnRlcm5hbCBib29ra2VlcGluZyBvbmx5LiBMb3NlIDEgY21kX3Nsb3RzIHNsb3QuICovCiAJZmNwX2NtbmQgKmZjbWQgPSBGQ1BfQ01ORChTQ3BudCk7CkBAIC05MTAsNyArOTEyLDcgQEAKIH0KIAogI2lmIDAKLXZvaWQgZmNwX3Njc2lfcmVzZXRfZG9uZShTY3NpX0NtbmQgKlNDcG50KQordm9pZCBmY3Bfc2NzaV9yZXNldF9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCWZjX2NoYW5uZWwgKmZjID0gRkNfU0NNTkQoU0NwbnQpOwogCkBAIC05MjEsNyArOTIzLDcgQEAKIAogI2RlZmluZSBGQ1BfUkVTRVRfVElNRU9VVCAoMipIWikKIAotaW50IGZjcF9zY3NpX2Rldl9yZXNldChTY3NpX0NtbmQgKlNDcG50KQoraW50IGZjcF9zY3NpX2Rldl9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKICNpZiAwIC8qIGJyb2tlbiBqdW5rLCBidXQgaWYgZGF2ZW0gd2FudHMgdG8gY29tcGlsZSB0aGlzIGRyaXZlciwgbGV0IGhpbS4uICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTkzMSw3ICs5MzMsNyBAQAogICAgICAgICBERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOwogCiAJaWYgKCFmYy0+cnN0X3BrdCkgewotCQlmYy0+cnN0X3BrdCA9IChTY3NpX0NtbmQgKikga21hbGxvYyhzaXplb2YoU0NwbnQpLCBHRlBfS0VSTkVMKTsKKwkJZmMtPnJzdF9wa3QgPSBrbWFsbG9jKHNpemVvZihTQ3BudCksIEdGUF9LRVJORUwpOwogCQlpZiAoIWZjLT5yc3RfcGt0KSByZXR1cm4gRkFJTEVEOwogCQkKIAkJZmNtZCA9IEZDUF9DTU5EKGZjLT5yc3RfcGt0KTsKQEAgLTk5OSw3ICsxMDAxLDcgQEAKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KIAotc3RhdGljIGludCBfX2ZjcF9zY3NpX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgX19mY3Bfc2NzaV9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCWZjX2NoYW5uZWwgKmZjID0gRkNfU0NNTkQoU0NwbnQpOwogCWZjcF9jbW5kICpmY21kID0gRkNQX0NNTkQoU0NwbnQpOwpAQCAtMTAyMCw3ICsxMDIyLDcgQEAKIAllbHNlIHJldHVybiBGQUlMRUQ7CiB9CiAKLWludCBmY3Bfc2NzaV9ob3N0X3Jlc2V0KFNjc2lfQ21uZCAqU0NwbnQpCitpbnQgZmNwX3Njc2lfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKQEAgLTExMDUsNyArMTEwNyw3IEBACiAJbG9naSAqbDsKIAlpbnQgc3RhdHVzOwogCi0JbCA9IChsb2dpICopa3phbGxvYygyICogc2l6ZW9mKGxvZ2kpLCBHRlBfS0VSTkVMKTsKKwlsID0ga3phbGxvYygyICogc2l6ZW9mKGxvZ2kpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWwpIHJldHVybiAtRU5PTUVNOwogCWwtPmNvZGUgPSBMU19QTE9HSTsKIAltZW1jcHkgKCZsLT5ucG9ydF93d24sICZmYy0+d3duX25wb3J0LCBzaXplb2YoZmNfd3duKSk7CkBAIC0xMTM5LDcgKzExNDEsNyBAQAogCXBybGkgKnA7CiAJaW50IHN0YXR1czsKIAotCXAgPSAocHJsaSAqKWt6YWxsb2MoMiAqIHNpemVvZihwcmxpKSwgR0ZQX0tFUk5FTCk7CisJcCA9IGt6YWxsb2MoMiAqIHNpemVvZihwcmxpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwKSByZXR1cm4gLUVOT01FTTsKIAlwLT5jb2RlID0gTFNfUFJMSTsKIAlwLT5wYXJhbXNbMF0gPSAweDA4MDAyMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mYzQvZmNwX2ltcGwuaCBiL2RyaXZlcnMvZmM0L2ZjcF9pbXBsLmgKaW5kZXggYzM5N2M4NC4uMWFjNjEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9mYzQvZmNwX2ltcGwuaAorKysgYi9kcml2ZXJzL2ZjNC9mY3BfaW1wbC5oCkBAIC0zOSw3ICszOSw3IEBACiB0eXBlZGVmIHN0cnVjdCBmY3BfY21uZCB7CiAJc3RydWN0IGZjcF9jbW5kCQkqbmV4dDsKIAlzdHJ1Y3QgZmNwX2NtbmQJCSpwcmV2OwotCXZvaWQJCQkoKmRvbmUpKFNjc2lfQ21uZCAqKTsKKwl2b2lkCQkJKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCXVuc2lnbmVkIHNob3J0CQlwcm90bzsKIAl1bnNpZ25lZCBzaG9ydAkJdG9rZW47CiAJdW5zaWduZWQgaW50CQlkaWQ7CkBAIC05NCwxNCArOTQsMTQgQEAKIAlsb25nCQkJKnNjc2lfYml0bWFwOwogCWxvbmcJCQlzY3NpX2JpdG1hcF9lbmQ7CiAJaW50CQkJc2NzaV9mcmVlOwotCWludAkJCSgqZW5jb2RlX2FkZHIpKFNjc2lfQ21uZCAqLCB1MTYgKiwgc3RydWN0IF9mY19jaGFubmVsICosIGZjcF9jbW5kICopOworCWludAkJCSgqZW5jb2RlX2FkZHIpKHN0cnVjdCBzY3NpX2NtbmQgKiwgdTE2ICosIHN0cnVjdCBfZmNfY2hhbm5lbCAqLCBmY3BfY21uZCAqKTsKIAlmY3BfY21uZAkJKnNjc2lfcXVlOwogCWNoYXIJCQlzY3NpX25hbWVbNF07CiAJZmNwX2NtbmQJCSoqY21kX3Nsb3RzOwogCWludAkJCWNoYW5uZWxzOwogCWludAkJCXRhcmdldHM7CiAJbG9uZwkJCSphZ2VzOwotCVNjc2lfQ21uZAkJKnJzdF9wa3Q7CisJc3RydWN0IHNjc2lfY21uZAkqcnN0X3BrdDsKIAlmY3BfcG9zbWFwCQkqcG9zbWFwOwogCS8qIExPR0lOIHN0dWZmICovCiAJZmNwX2NtbmQJCSpsb2dpbjsKQEAgLTE1NSw5ICsxNTUsMTAgQEAKIAlmb3JfZWFjaF9mY19jaGFubmVsKGZjKQkJCQlcCiAJCWlmIChmYy0+c3RhdGUgPT0gRkNfU1RBVEVfT05MSU5FKQogCi1pbnQgZmNwX3Njc2lfcXVldWVjb21tYW5kKFNjc2lfQ21uZCAqLCB2b2lkICgqIGRvbmUpKFNjc2lfQ21uZCAqKSk7Ci1pbnQgZmNwX3Njc2lfYWJvcnQoU2NzaV9DbW5kICopOwotaW50IGZjcF9zY3NpX2Rldl9yZXNldChTY3NpX0NtbmQgKik7Ci1pbnQgZmNwX3Njc2lfaG9zdF9yZXNldChTY3NpX0NtbmQgKik7CitpbnQgZmNwX3Njc2lfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwKKwkJCSAgdm9pZCAoKiBkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSk7CitpbnQgZmNwX3Njc2lfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqKTsKK2ludCBmY3Bfc2NzaV9kZXZfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqKTsKK2ludCBmY3Bfc2NzaV9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKik7CiAKICNlbmRpZiAvKiAhKF9GQ1BfU0NTSV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKaW5kZXggOGJjYjU4Yy4uMTg2NWI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCkBAIC04LDcgKzgsNyBAQAogICoKICAqICBTZWUgRG9jdW1lbnRhdGlvbi9kY2RiYXMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBEZWxsIEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiBEZWxsIEluYy4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgYXMgcHVibGlzaGVkIGJ5CkBAIC00MCw3ICs0MCw3IEBACiAjaW5jbHVkZSAiZGNkYmFzLmgiCiAKICNkZWZpbmUgRFJJVkVSX05BTUUJCSJkY2RiYXMiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiNS42LjAtMiIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSI1LjYuMC0zLjIiCiAjZGVmaW5lIERSSVZFUl9ERVNDUklQVElPTgkiRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIiCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkY2RiYXNfcGRldjsKQEAgLTE3NSw2ICsxNzUsOSBAQAogewogCXNzaXplX3QgcmV0OwogCisJaWYgKChwb3MgKyBjb3VudCkgPiBNQVhfU01JX0RBVEFfQlVGX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCiAJbXV0ZXhfbG9jaygmc21pX2RhdGFfbG9jayk7CiAKIAlyZXQgPSBzbWlfZGF0YV9idWZfcmVhbGxvYyhwb3MgKyBjb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMKaW5kZXggMDhiMTYxNy4uZmM3MDJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYwpAQCAtNzA1LDE3ICs3MDUsMTYgQEAKIAogc3RhdGljIGludCBfX2luaXQgZGNkcmJ1X2luaXQodm9pZCkKIHsKLQlpbnQgcmMgPSAwOworCWludCByYzsKIAlzcGluX2xvY2tfaW5pdCgmcmJ1X2RhdGEubG9jayk7CiAKIAlpbml0X3BhY2tldF9oZWFkKCk7Ci0JcmJ1X2RldmljZSA9Ci0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImRlbGxfcmJ1IiwgLTEsIE5VTEwsIDApOwotCWlmICghcmJ1X2RldmljZSkgeworCXJidV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJkZWxsX3JidSIsIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHJidV9kZXZpY2UpKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkJImRlbGxfcmJ1OiVzOnBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUgIgogCQkJImZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiBQVFJfRVJSKHJidV9kZXZpY2UpOwogCX0KIAogCXJjID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZyYnVfZGV2aWNlLT5kZXYua29iaiwgJnJidV9kYXRhX2F0dHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jIGIvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCmluZGV4IGI4YjU5NmQuLjM3ZGVlZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKQEAgLTMyNiw2ICszMjYsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1pX2dldF9zeXN0ZW1faW5mbyk7CiAKKworLyoqCisgKglkbWlfbmFtZV9pbl92ZW5kb3JzIC0gQ2hlY2sgaWYgc3RyaW5nIGlzIGFueXdoZXJlIGluIHRoZSBETUkgdmVuZG9yIGluZm9ybWF0aW9uLgorICoJQHN0cjogCUNhc2Ugc2Vuc2l0aXZlIE5hbWUKKyAqLworaW50IGRtaV9uYW1lX2luX3ZlbmRvcnMoY2hhciAqc3RyKQoreworCXN0YXRpYyBpbnQgZmllbGRzW10gPSB7IERNSV9CSU9TX1ZFTkRPUiwgRE1JX0JJT1NfVkVSU0lPTiwgRE1JX1NZU19WRU5ET1IsCisJCQkJRE1JX1BST0RVQ1RfTkFNRSwgRE1JX1BST0RVQ1RfVkVSU0lPTiwgRE1JX0JPQVJEX1ZFTkRPUiwKKwkJCQlETUlfQk9BUkRfTkFNRSwgRE1JX0JPQVJEX1ZFUlNJT04sIERNSV9OT05FIH07CisJaW50IGk7CisJZm9yIChpID0gMDsgZmllbGRzW2ldICE9IERNSV9OT05FOyBpKyspIHsKKwkJaW50IGYgPSBmaWVsZHNbaV07CisJCWlmIChkbWlfaWRlbnRbZl0gJiYgc3Ryc3RyKGRtaV9pZGVudFtmXSwgc3RyKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZG1pX25hbWVfaW5fdmVuZG9ycyk7CisKIC8qKgogICoJZG1pX2ZpbmRfZGV2aWNlIC0gZmluZCBvbmJvYXJkIGRldmljZSBieSB0eXBlL25hbWUKICAqCUB0eXBlOiBkZXZpY2UgdHlwZSBvciAlRE1JX0RFVl9UWVBFX0FOWSB0byBtYXRjaCBhbGwgZGV2aWNlIHR5cGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9LY29uZmlnIGIvZHJpdmVycy9oaWQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQ0YTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvS2NvbmZpZwpAQCAtMCwwICsxLDE4IEBACisjCisjIEhJRCBkcml2ZXIgY29uZmlndXJhdGlvbgorIworbWVudSAiSElEIERldmljZXMiCisJZGVwZW5kcyBvbiBJTlBVVAorCitjb25maWcgSElECisJdHJpc3RhdGUgIkdlbmVyaWMgSElEIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBnZW5lcmljIEhJRCBzdXBwb3J0IHRvIGNvbm5lY3Qga2V5Ym9hcmRzLAorCSAgbWljZSwgam95c3RpY2tzLCBncmFwaGljIHRhYmxldHMsIG9yIGFueSBvdGhlciBISUQgYmFzZWQgZGV2aWNlcworCSAgdG8geW91ciBjb21wdXRlci4gWW91IGFsc28gbmVlZCB0byBzZWxlY3QgcGFydGljdWxhciB0eXBlcyBvZgorCSAgSElEIGRldmljZXMgeW91IHdhbnQgdG8gY29tcGlsZSBzdXBwb3J0IGZvciwgaW4gdGhlIHBhcnRpY3VsYXIKKwkgIGRyaXZlciBtZW51IChVU0IsIEJsdWV0b290aCkKKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9NYWtlZmlsZSBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzIzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgSElEIGRyaXZlcgorIworCisjIE11bHRpcGFydCBvYmplY3RzLgoraGlkLW9ianMJOj0gaGlkLWNvcmUubyBoaWQtaW5wdXQubworCisjIE9wdGlvbmFsIHBhcnRzIG9mIG11bHRpcGFydCBvYmplY3RzLgorCitvYmotJChDT05GSUdfSElEKQkJKz0gaGlkLm8KKworaWZlcSAoJChDT05GSUdfSU5QVVRfREVCVUcpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjMmIzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKQEAgLTAsMCArMSwxMDAzIEBACisvKgorICogIEhJRCBzdXBwb3J0IGZvciBMaW51eAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNiBKaXJpIEtvc2luYQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyN1bmRlZiBERUJVRworI3VuZGVmIERFQlVHX0RBVEEKKworI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZGRldi5oPgorCisvKgorICogVmVyc2lvbiBJbmZvcm1hdGlvbgorICovCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjYiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkFuZHJlYXMgR2FsLCBWb2p0ZWNoIFBhdmxpayIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBISUQgY29yZSBkcml2ZXIiCisjZGVmaW5lIERSSVZFUl9MSUNFTlNFICJHUEwiCisKKy8qCisgKiBNb2R1bGUgcGFyYW1ldGVycy4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWw7Cittb2R1bGVfcGFyYW1fbmFtZWQobW91c2Vwb2xsLCBoaWRfbW91c2Vwb2xsX2ludGVydmFsLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobW91c2Vwb2xsLCAiUG9sbGluZyBpbnRlcnZhbCBvZiBtaWNlIik7CisKKy8qCisgKiBSZWdpc3RlciBhIG5ldyByZXBvcnQgZm9yIGEgZGV2aWNlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgaGlkX3JlcG9ydCAqaGlkX3JlZ2lzdGVyX3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBpZCkKK3sKKwlzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtICpyZXBvcnRfZW51bSA9IGRldmljZS0+cmVwb3J0X2VudW0gKyB0eXBlOworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisKKwlpZiAocmVwb3J0X2VudW0tPnJlcG9ydF9pZF9oYXNoW2lkXSkKKwkJcmV0dXJuIHJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtpZF07CisKKwlpZiAoIShyZXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX3JlcG9ydCksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoaWQgIT0gMCkKKwkJcmVwb3J0X2VudW0tPm51bWJlcmVkID0gMTsKKworCXJlcG9ydC0+aWQgPSBpZDsKKwlyZXBvcnQtPnR5cGUgPSB0eXBlOworCXJlcG9ydC0+c2l6ZSA9IDA7CisJcmVwb3J0LT5kZXZpY2UgPSBkZXZpY2U7CisJcmVwb3J0X2VudW0tPnJlcG9ydF9pZF9oYXNoW2lkXSA9IHJlcG9ydDsKKworCWxpc3RfYWRkX3RhaWwoJnJlcG9ydC0+bGlzdCwgJnJlcG9ydF9lbnVtLT5yZXBvcnRfbGlzdCk7CisKKwlyZXR1cm4gcmVwb3J0OworfQorCisvKgorICogUmVnaXN0ZXIgYSBuZXcgZmllbGQgZm9yIHRoaXMgcmVwb3J0LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2ZpZWxkICpoaWRfcmVnaXN0ZXJfZmllbGQoc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwgdW5zaWduZWQgdXNhZ2VzLCB1bnNpZ25lZCB2YWx1ZXMpCit7CisJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CisKKwlpZiAocmVwb3J0LT5tYXhmaWVsZCA9PSBISURfTUFYX0ZJRUxEUykgeworCQlkYmcoInRvbyBtYW55IGZpZWxkcyBpbiByZXBvcnQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEoZmllbGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2ZpZWxkKSArIHVzYWdlcyAqIHNpemVvZihzdHJ1Y3QgaGlkX3VzYWdlKQorCQkrIHZhbHVlcyAqIHNpemVvZih1bnNpZ25lZCksIEdGUF9LRVJORUwpKSkgcmV0dXJuIE5VTEw7CisKKwlmaWVsZC0+aW5kZXggPSByZXBvcnQtPm1heGZpZWxkKys7CisJcmVwb3J0LT5maWVsZFtmaWVsZC0+aW5kZXhdID0gZmllbGQ7CisJZmllbGQtPnVzYWdlID0gKHN0cnVjdCBoaWRfdXNhZ2UgKikoZmllbGQgKyAxKTsKKwlmaWVsZC0+dmFsdWUgPSAodW5zaWduZWQgKikoZmllbGQtPnVzYWdlICsgdXNhZ2VzKTsKKwlmaWVsZC0+cmVwb3J0ID0gcmVwb3J0OworCisJcmV0dXJuIGZpZWxkOworfQorCisvKgorICogT3BlbiBhIGNvbGxlY3Rpb24uIFRoZSB0eXBlL3VzYWdlIGlzIHB1c2hlZCBvbiB0aGUgc3RhY2suCisgKi8KKworc3RhdGljIGludCBvcGVuX2NvbGxlY3Rpb24oc3RydWN0IGhpZF9wYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgdHlwZSkKK3sKKwlzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24gKmNvbGxlY3Rpb247CisJdW5zaWduZWQgdXNhZ2U7CisKKwl1c2FnZSA9IHBhcnNlci0+bG9jYWwudXNhZ2VbMF07CisKKwlpZiAocGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0ciA9PSBISURfQ09MTEVDVElPTl9TVEFDS19TSVpFKSB7CisJCWRiZygiY29sbGVjdGlvbiBzdGFjayBvdmVyZmxvdyIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHBhcnNlci0+ZGV2aWNlLT5tYXhjb2xsZWN0aW9uID09IHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uX3NpemUpIHsKKwkJY29sbGVjdGlvbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfY29sbGVjdGlvbikgKgorCQkJCXBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uX3NpemUgKiAyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGNvbGxlY3Rpb24gPT0gTlVMTCkgeworCQkJZGJnKCJmYWlsZWQgdG8gcmVhbGxvY2F0ZSBjb2xsZWN0aW9uIGFycmF5Iik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWVtY3B5KGNvbGxlY3Rpb24sIHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uLAorCQkJc2l6ZW9mKHN0cnVjdCBoaWRfY29sbGVjdGlvbikgKgorCQkJcGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb25fc2l6ZSk7CisJCW1lbXNldChjb2xsZWN0aW9uICsgcGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb25fc2l6ZSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24pICoKKwkJCXBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uX3NpemUpOworCQlrZnJlZShwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbik7CisJCXBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKKwkJcGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb25fc2l6ZSAqPSAyOworCX0KKworCXBhcnNlci0+Y29sbGVjdGlvbl9zdGFja1twYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tfcHRyKytdID0KKwkJcGFyc2VyLT5kZXZpY2UtPm1heGNvbGxlY3Rpb247CisKKwljb2xsZWN0aW9uID0gcGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb24gKworCQlwYXJzZXItPmRldmljZS0+bWF4Y29sbGVjdGlvbisrOworCWNvbGxlY3Rpb24tPnR5cGUgPSB0eXBlOworCWNvbGxlY3Rpb24tPnVzYWdlID0gdXNhZ2U7CisJY29sbGVjdGlvbi0+bGV2ZWwgPSBwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tfcHRyIC0gMTsKKworCWlmICh0eXBlID09IEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OKQorCQlwYXJzZXItPmRldmljZS0+bWF4YXBwbGljYXRpb24rKzsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2xvc2UgYSBjb2xsZWN0aW9uLgorICovCisKK3N0YXRpYyBpbnQgY2xvc2VfY29sbGVjdGlvbihzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyKQoreworCWlmICghcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0cikgeworCQlkYmcoImNvbGxlY3Rpb24gc3RhY2sgdW5kZXJmbG93Iik7CisJCXJldHVybiAtMTsKKwl9CisJcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0ci0tOworCXJldHVybiAwOworfQorCisvKgorICogQ2xpbWIgdXAgdGhlIHN0YWNrLCBzZWFyY2ggZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0eXBlCisgKiBhbmQgcmV0dXJuIHRoZSB1c2FnZS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaGlkX2xvb2t1cF9jb2xsZWN0aW9uKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHR5cGUpCit7CisJaW50IG47CisJZm9yIChuID0gcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0ciAtIDE7IG4gPj0gMDsgbi0tKQorCQlpZiAocGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb25bcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrW25dXS50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gcGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb25bcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrW25dXS51c2FnZTsKKwlyZXR1cm4gMDsgLyogd2Uga25vdyBub3RoaW5nIGFib3V0IHRoaXMgdXNhZ2UgdHlwZSAqLworfQorCisvKgorICogQWRkIGEgdXNhZ2UgdG8gdGhlIHRlbXBvcmFyeSBwYXJzZXIgdGFibGUuCisgKi8KKworc3RhdGljIGludCBoaWRfYWRkX3VzYWdlKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHVzYWdlKQoreworCWlmIChwYXJzZXItPmxvY2FsLnVzYWdlX2luZGV4ID49IEhJRF9NQVhfVVNBR0VTKSB7CisJCWRiZygidXNhZ2UgaW5kZXggZXhjZWVkZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwYXJzZXItPmxvY2FsLnVzYWdlW3BhcnNlci0+bG9jYWwudXNhZ2VfaW5kZXhdID0gdXNhZ2U7CisJcGFyc2VyLT5sb2NhbC5jb2xsZWN0aW9uX2luZGV4W3BhcnNlci0+bG9jYWwudXNhZ2VfaW5kZXhdID0KKwkJcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0ciA/CisJCXBhcnNlci0+Y29sbGVjdGlvbl9zdGFja1twYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tfcHRyIC0gMV0gOiAwOworCXBhcnNlci0+bG9jYWwudXNhZ2VfaW5kZXgrKzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlZ2lzdGVyIGEgbmV3IGZpZWxkIGZvciB0aGlzIHJlcG9ydC4KKyAqLworCitzdGF0aWMgaW50IGhpZF9hZGRfZmllbGQoc3RydWN0IGhpZF9wYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcmVwb3J0X3R5cGUsIHVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CisJaW50IHVzYWdlczsKKwl1bnNpZ25lZCBvZmZzZXQ7CisJaW50IGk7CisKKwlpZiAoIShyZXBvcnQgPSBoaWRfcmVnaXN0ZXJfcmVwb3J0KHBhcnNlci0+ZGV2aWNlLCByZXBvcnRfdHlwZSwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2lkKSkpIHsKKwkJZGJnKCJoaWRfcmVnaXN0ZXJfcmVwb3J0IGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWF4aW11bSA8IHBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWluaW11bSkgeworCQlkYmcoImxvZ2ljYWwgcmFuZ2UgaW52YWxpZCAlZCAlZCIsIHBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWluaW11bSwgcGFyc2VyLT5nbG9iYWwubG9naWNhbF9tYXhpbXVtKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW9mZnNldCA9IHJlcG9ydC0+c2l6ZTsKKwlyZXBvcnQtPnNpemUgKz0gcGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemUgKiBwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQ7CisKKwlpZiAoIXBhcnNlci0+bG9jYWwudXNhZ2VfaW5kZXgpIC8qIElnbm9yZSBwYWRkaW5nIGZpZWxkcyAqLworCQlyZXR1cm4gMDsKKworCXVzYWdlcyA9IG1heF90KGludCwgcGFyc2VyLT5sb2NhbC51c2FnZV9pbmRleCwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50KTsKKworCWlmICgoZmllbGQgPSBoaWRfcmVnaXN0ZXJfZmllbGQocmVwb3J0LCB1c2FnZXMsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCkpID09IE5VTEwpCisJCXJldHVybiAwOworCisJZmllbGQtPnBoeXNpY2FsID0gaGlkX2xvb2t1cF9jb2xsZWN0aW9uKHBhcnNlciwgSElEX0NPTExFQ1RJT05fUEhZU0lDQUwpOworCWZpZWxkLT5sb2dpY2FsID0gaGlkX2xvb2t1cF9jb2xsZWN0aW9uKHBhcnNlciwgSElEX0NPTExFQ1RJT05fTE9HSUNBTCk7CisJZmllbGQtPmFwcGxpY2F0aW9uID0gaGlkX2xvb2t1cF9jb2xsZWN0aW9uKHBhcnNlciwgSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04pOworCisJZm9yIChpID0gMDsgaSA8IHVzYWdlczsgaSsrKSB7CisJCWludCBqID0gaTsKKwkJLyogRHVwbGljYXRlIHRoZSBsYXN0IHVzYWdlIHdlIHBhcnNlZCBpZiB3ZSBoYXZlIGV4Y2VzcyB2YWx1ZXMgKi8KKwkJaWYgKGkgPj0gcGFyc2VyLT5sb2NhbC51c2FnZV9pbmRleCkKKwkJCWogPSBwYXJzZXItPmxvY2FsLnVzYWdlX2luZGV4IC0gMTsKKwkJZmllbGQtPnVzYWdlW2ldLmhpZCA9IHBhcnNlci0+bG9jYWwudXNhZ2Vbal07CisJCWZpZWxkLT51c2FnZVtpXS5jb2xsZWN0aW9uX2luZGV4ID0KKwkJCXBhcnNlci0+bG9jYWwuY29sbGVjdGlvbl9pbmRleFtqXTsKKwl9CisKKwlmaWVsZC0+bWF4dXNhZ2UgPSB1c2FnZXM7CisJZmllbGQtPmZsYWdzID0gZmxhZ3M7CisJZmllbGQtPnJlcG9ydF9vZmZzZXQgPSBvZmZzZXQ7CisJZmllbGQtPnJlcG9ydF90eXBlID0gcmVwb3J0X3R5cGU7CisJZmllbGQtPnJlcG9ydF9zaXplID0gcGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemU7CisJZmllbGQtPnJlcG9ydF9jb3VudCA9IHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudDsKKwlmaWVsZC0+bG9naWNhbF9taW5pbXVtID0gcGFyc2VyLT5nbG9iYWwubG9naWNhbF9taW5pbXVtOworCWZpZWxkLT5sb2dpY2FsX21heGltdW0gPSBwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21heGltdW07CisJZmllbGQtPnBoeXNpY2FsX21pbmltdW0gPSBwYXJzZXItPmdsb2JhbC5waHlzaWNhbF9taW5pbXVtOworCWZpZWxkLT5waHlzaWNhbF9tYXhpbXVtID0gcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWF4aW11bTsKKwlmaWVsZC0+dW5pdF9leHBvbmVudCA9IHBhcnNlci0+Z2xvYmFsLnVuaXRfZXhwb25lbnQ7CisJZmllbGQtPnVuaXQgPSBwYXJzZXItPmdsb2JhbC51bml0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGRhdGEgdmFsdWUgZnJvbSBpdGVtLgorICovCisKK3N0YXRpYyB1MzIgaXRlbV91ZGF0YShzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCit7CisJc3dpdGNoIChpdGVtLT5zaXplKSB7CisJCWNhc2UgMTogcmV0dXJuIGl0ZW0tPmRhdGEudTg7CisJCWNhc2UgMjogcmV0dXJuIGl0ZW0tPmRhdGEudTE2OworCQljYXNlIDQ6IHJldHVybiBpdGVtLT5kYXRhLnUzMjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzMzIgaXRlbV9zZGF0YShzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCit7CisJc3dpdGNoIChpdGVtLT5zaXplKSB7CisJCWNhc2UgMTogcmV0dXJuIGl0ZW0tPmRhdGEuczg7CisJCWNhc2UgMjogcmV0dXJuIGl0ZW0tPmRhdGEuczE2OworCQljYXNlIDQ6IHJldHVybiBpdGVtLT5kYXRhLnMzMjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgZ2xvYmFsIGl0ZW0uCisgKi8KKworc3RhdGljIGludCBoaWRfcGFyc2VyX2dsb2JhbChzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyLCBzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCit7CisJc3dpdGNoIChpdGVtLT50YWcpIHsKKworCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUFVTSDoKKworCQkJaWYgKHBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0ciA9PSBISURfR0xPQkFMX1NUQUNLX1NJWkUpIHsKKwkJCQlkYmcoImdsb2JhbCBlbnZpcm9tZW50IHN0YWNrIG92ZXJmbG93Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQltZW1jcHkocGFyc2VyLT5nbG9iYWxfc3RhY2sgKyBwYXJzZXItPmdsb2JhbF9zdGFja19wdHIrKywKKwkJCQkmcGFyc2VyLT5nbG9iYWwsIHNpemVvZihzdHJ1Y3QgaGlkX2dsb2JhbCkpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BPUDoKKworCQkJaWYgKCFwYXJzZXItPmdsb2JhbF9zdGFja19wdHIpIHsKKwkJCQlkYmcoImdsb2JhbCBlbnZpcm9tZW50IHN0YWNrIHVuZGVyZmxvdyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJbWVtY3B5KCZwYXJzZXItPmdsb2JhbCwgcGFyc2VyLT5nbG9iYWxfc3RhY2sgKyAtLXBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0ciwKKwkJCQlzaXplb2Yoc3RydWN0IGhpZF9nbG9iYWwpKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19VU0FHRV9QQUdFOgorCQkJcGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA9IGl0ZW1fdWRhdGEoaXRlbSk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfTE9HSUNBTF9NSU5JTVVNOgorCQkJcGFyc2VyLT5nbG9iYWwubG9naWNhbF9taW5pbXVtID0gaXRlbV9zZGF0YShpdGVtKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19MT0dJQ0FMX01BWElNVU06CisJCQlpZiAocGFyc2VyLT5nbG9iYWwubG9naWNhbF9taW5pbXVtIDwgMCkKKwkJCQlwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21heGltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOworCQkJZWxzZQorCQkJCXBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWF4aW11bSA9IGl0ZW1fdWRhdGEoaXRlbSk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUEhZU0lDQUxfTUlOSU1VTToKKwkJCXBhcnNlci0+Z2xvYmFsLnBoeXNpY2FsX21pbmltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BIWVNJQ0FMX01BWElNVU06CisJCQlpZiAocGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWluaW11bSA8IDApCisJCQkJcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWF4aW11bSA9IGl0ZW1fc2RhdGEoaXRlbSk7CisJCQllbHNlCisJCQkJcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWF4aW11bSA9IGl0ZW1fdWRhdGEoaXRlbSk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfVU5JVF9FWFBPTkVOVDoKKwkJCXBhcnNlci0+Z2xvYmFsLnVuaXRfZXhwb25lbnQgPSBpdGVtX3NkYXRhKGl0ZW0pOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1VOSVQ6CisJCQlwYXJzZXItPmdsb2JhbC51bml0ID0gaXRlbV91ZGF0YShpdGVtKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfU0laRToKKwkJCWlmICgocGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemUgPSBpdGVtX3VkYXRhKGl0ZW0pKSA+IDMyKSB7CisJCQkJZGJnKCJpbnZhbGlkIHJlcG9ydF9zaXplICVkIiwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJldHVybiAwOworCisJCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfQ09VTlQ6CisJCQlpZiAoKHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCA9IGl0ZW1fdWRhdGEoaXRlbSkpID4gSElEX01BWF9VU0FHRVMpIHsKKwkJCQlkYmcoImludmFsaWQgcmVwb3J0X2NvdW50ICVkIiwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUkVQT1JUX0lEOgorCQkJaWYgKChwYXJzZXItPmdsb2JhbC5yZXBvcnRfaWQgPSBpdGVtX3VkYXRhKGl0ZW0pKSA9PSAwKSB7CisJCQkJZGJnKCJyZXBvcnRfaWQgMCBpcyBpbnZhbGlkIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcmV0dXJuIDA7CisKKwkJZGVmYXVsdDoKKwkJCWRiZygidW5rbm93biBnbG9iYWwgdGFnIDB4JXgiLCBpdGVtLT50YWcpOworCQkJcmV0dXJuIC0xOworCX0KK30KKworLyoKKyAqIFByb2Nlc3MgYSBsb2NhbCBpdGVtLgorICovCisKK3N0YXRpYyBpbnQgaGlkX3BhcnNlcl9sb2NhbChzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyLCBzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCit7CisJX191MzIgZGF0YTsKKwl1bnNpZ25lZCBuOworCisJaWYgKGl0ZW0tPnNpemUgPT0gMCkgeworCQlkYmcoIml0ZW0gZGF0YSBleHBlY3RlZCBmb3IgbG9jYWwgaXRlbSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGF0YSA9IGl0ZW1fdWRhdGEoaXRlbSk7CisKKwlzd2l0Y2ggKGl0ZW0tPnRhZykgeworCisJCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX0RFTElNSVRFUjoKKworCQkJaWYgKGRhdGEpIHsKKwkJCQkvKgorCQkJCSAqIFdlIHRyZWF0IGl0ZW1zIGJlZm9yZSB0aGUgZmlyc3QgZGVsaW1pdGVyCisJCQkJICogYXMgZ2xvYmFsIHRvIGFsbCB1c2FnZSBzZXRzIChicmFuY2ggMCkuCisJCQkJICogSW4gdGhlIG1vbWVudCB3ZSBwcm9jZXNzIG9ubHkgdGhlc2UgZ2xvYmFsCisJCQkJICogaXRlbXMgYW5kIHRoZSBmaXJzdCBkZWxpbWl0ZXIgc2V0LgorCQkJCSAqLworCQkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCAhPSAwKSB7CisJCQkJCWRiZygibmVzdGVkIGRlbGltaXRlcnMiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCsrOworCQkJCXBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2JyYW5jaCsrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGggPCAxKSB7CisJCQkJCWRiZygiYm9ndXMgY2xvc2UgZGVsaW1pdGVyIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGgtLTsKKwkJCX0KKwkJCXJldHVybiAxOworCisJCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFOgorCisJCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgeworCQkJCWRiZygiYWx0ZXJuYXRpdmUgdXNhZ2UgaWdub3JlZCIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAoaXRlbS0+c2l6ZSA8PSAyKQorCQkJCWRhdGEgPSAocGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA8PCAxNikgKyBkYXRhOworCisJCQlyZXR1cm4gaGlkX2FkZF91c2FnZShwYXJzZXIsIGRhdGEpOworCisJCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFX01JTklNVU06CisKKwkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9icmFuY2ggPiAxKSB7CisJCQkJZGJnKCJhbHRlcm5hdGl2ZSB1c2FnZSBpZ25vcmVkIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWlmIChpdGVtLT5zaXplIDw9IDIpCisJCQkJZGF0YSA9IChwYXJzZXItPmdsb2JhbC51c2FnZV9wYWdlIDw8IDE2KSArIGRhdGE7CisKKwkJCXBhcnNlci0+bG9jYWwudXNhZ2VfbWluaW11bSA9IGRhdGE7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIEhJRF9MT0NBTF9JVEVNX1RBR19VU0FHRV9NQVhJTVVNOgorCisJCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgeworCQkJCWRiZygiYWx0ZXJuYXRpdmUgdXNhZ2UgaWdub3JlZCIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAoaXRlbS0+c2l6ZSA8PSAyKQorCQkJCWRhdGEgPSAocGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA8PCAxNikgKyBkYXRhOworCisJCQlmb3IgKG4gPSBwYXJzZXItPmxvY2FsLnVzYWdlX21pbmltdW07IG4gPD0gZGF0YTsgbisrKQorCQkJCWlmIChoaWRfYWRkX3VzYWdlKHBhcnNlciwgbikpIHsKKwkJCQkJZGJnKCJoaWRfYWRkX3VzYWdlIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCisJCQlkYmcoInVua25vd24gbG9jYWwgaXRlbSB0YWcgMHgleCIsIGl0ZW0tPnRhZyk7CisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbWFpbiBpdGVtLgorICovCisKK3N0YXRpYyBpbnQgaGlkX3BhcnNlcl9tYWluKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKK3sKKwlfX3UzMiBkYXRhOworCWludCByZXQ7CisKKwlkYXRhID0gaXRlbV91ZGF0YShpdGVtKTsKKworCXN3aXRjaCAoaXRlbS0+dGFnKSB7CisJCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfQkVHSU5fQ09MTEVDVElPTjoKKwkJCXJldCA9IG9wZW5fY29sbGVjdGlvbihwYXJzZXIsIGRhdGEgJiAweGZmKTsKKwkJCWJyZWFrOworCQljYXNlIEhJRF9NQUlOX0lURU1fVEFHX0VORF9DT0xMRUNUSU9OOgorCQkJcmV0ID0gY2xvc2VfY29sbGVjdGlvbihwYXJzZXIpOworCQkJYnJlYWs7CisJCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfSU5QVVQ6CisJCQlyZXQgPSBoaWRfYWRkX2ZpZWxkKHBhcnNlciwgSElEX0lOUFVUX1JFUE9SVCwgZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBISURfTUFJTl9JVEVNX1RBR19PVVRQVVQ6CisJCQlyZXQgPSBoaWRfYWRkX2ZpZWxkKHBhcnNlciwgSElEX09VVFBVVF9SRVBPUlQsIGRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfRkVBVFVSRToKKwkJCXJldCA9IGhpZF9hZGRfZmllbGQocGFyc2VyLCBISURfRkVBVFVSRV9SRVBPUlQsIGRhdGEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkYmcoInVua25vd24gbWFpbiBpdGVtIHRhZyAweCV4IiwgaXRlbS0+dGFnKTsKKwkJCXJldCA9IDA7CisJfQorCisJbWVtc2V0KCZwYXJzZXItPmxvY2FsLCAwLCBzaXplb2YocGFyc2VyLT5sb2NhbCkpOwkvKiBSZXNldCB0aGUgbG9jYWwgcGFyc2VyIGVudmlyb25tZW50ICovCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUHJvY2VzcyBhIHJlc2VydmVkIGl0ZW0uCisgKi8KKworc3RhdGljIGludCBoaWRfcGFyc2VyX3Jlc2VydmVkKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKK3sKKwlkYmcoInJlc2VydmVkIGl0ZW0gdHlwZSwgdGFnIDB4JXgiLCBpdGVtLT50YWcpOworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBhIHJlcG9ydCBhbmQgYWxsIHJlZ2lzdGVyZWQgZmllbGRzLiBUaGUgZmllbGQtPnVzYWdlIGFuZAorICogZmllbGQtPnZhbHVlIHRhYmxlJ3MgYXJlIGFsbG9jYXRlZCBiZWhpbmQgdGhlIGZpZWxkLCBzbyB3ZSBuZWVkCisgKiBvbmx5IHRvIGZyZWUoZmllbGQpIGl0c2VsZi4KKyAqLworCitzdGF0aWMgdm9pZCBoaWRfZnJlZV9yZXBvcnQoc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCkKK3sKKwl1bnNpZ25lZCBuOworCisJZm9yIChuID0gMDsgbiA8IHJlcG9ydC0+bWF4ZmllbGQ7IG4rKykKKwkJa2ZyZWUocmVwb3J0LT5maWVsZFtuXSk7CisJa2ZyZWUocmVwb3J0KTsKK30KKworLyoKKyAqIEZyZWUgYSBkZXZpY2Ugc3RydWN0dXJlLCBhbGwgcmVwb3J0cywgYW5kIGFsbCBmaWVsZHMuCisgKi8KKwordm9pZCBoaWRfZnJlZV9kZXZpY2Uoc3RydWN0IGhpZF9kZXZpY2UgKmRldmljZSkKK3sKKwl1bnNpZ25lZCBpLGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgSElEX1JFUE9SVF9UWVBFUzsgaSsrKSB7CisJCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gKnJlcG9ydF9lbnVtID0gZGV2aWNlLT5yZXBvcnRfZW51bSArIGk7CisKKwkJZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisJCQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0ID0gcmVwb3J0X2VudW0tPnJlcG9ydF9pZF9oYXNoW2pdOworCQkJaWYgKHJlcG9ydCkKKwkJCQloaWRfZnJlZV9yZXBvcnQocmVwb3J0KTsKKwkJfQorCX0KKworCWtmcmVlKGRldmljZS0+cmRlc2MpOworCWtmcmVlKGRldmljZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChoaWRfZnJlZV9kZXZpY2UpOworCisvKgorICogRmV0Y2ggYSByZXBvcnQgZGVzY3JpcHRpb24gaXRlbSBmcm9tIHRoZSBkYXRhIHN0cmVhbS4gV2Ugc3VwcG9ydCBsb25nCisgKiBpdGVtcywgdGhvdWdoIHRoZXkgYXJlIG5vdCB1c2VkIHlldC4KKyAqLworCitzdGF0aWMgdTggKmZldGNoX2l0ZW0oX191OCAqc3RhcnQsIF9fdTggKmVuZCwgc3RydWN0IGhpZF9pdGVtICppdGVtKQoreworCXU4IGI7CisKKwlpZiAoKGVuZCAtIHN0YXJ0KSA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWIgPSAqc3RhcnQrKzsKKworCWl0ZW0tPnR5cGUgPSAoYiA+PiAyKSAmIDM7CisJaXRlbS0+dGFnICA9IChiID4+IDQpICYgMTU7CisKKwlpZiAoaXRlbS0+dGFnID09IEhJRF9JVEVNX1RBR19MT05HKSB7CisKKwkJaXRlbS0+Zm9ybWF0ID0gSElEX0lURU1fRk9STUFUX0xPTkc7CisKKwkJaWYgKChlbmQgLSBzdGFydCkgPCAyKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaXRlbS0+c2l6ZSA9ICpzdGFydCsrOworCQlpdGVtLT50YWcgID0gKnN0YXJ0Kys7CisKKwkJaWYgKChlbmQgLSBzdGFydCkgPCBpdGVtLT5zaXplKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaXRlbS0+ZGF0YS5sb25nZGF0YSA9IHN0YXJ0OworCQlzdGFydCArPSBpdGVtLT5zaXplOworCQlyZXR1cm4gc3RhcnQ7CisJfQorCisJaXRlbS0+Zm9ybWF0ID0gSElEX0lURU1fRk9STUFUX1NIT1JUOworCWl0ZW0tPnNpemUgPSBiICYgMzsKKworCXN3aXRjaCAoaXRlbS0+c2l6ZSkgeworCisJCWNhc2UgMDoKKwkJCXJldHVybiBzdGFydDsKKworCQljYXNlIDE6CisJCQlpZiAoKGVuZCAtIHN0YXJ0KSA8IDEpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlpdGVtLT5kYXRhLnU4ID0gKnN0YXJ0Kys7CisJCQlyZXR1cm4gc3RhcnQ7CisKKwkJY2FzZSAyOgorCQkJaWYgKChlbmQgLSBzdGFydCkgPCAyKQorCQkJCXJldHVybiBOVUxMOworCQkJaXRlbS0+ZGF0YS51MTYgPSBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlMTYqKXN0YXJ0KSk7CisJCQlzdGFydCA9IChfX3U4ICopKChfX2xlMTYgKilzdGFydCArIDEpOworCQkJcmV0dXJuIHN0YXJ0OworCisJCWNhc2UgMzoKKwkJCWl0ZW0tPnNpemUrKzsKKwkJCWlmICgoZW5kIC0gc3RhcnQpIDwgNCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWl0ZW0tPmRhdGEudTMyID0gbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19sZTMyKilzdGFydCkpOworCQkJc3RhcnQgPSAoX191OCAqKSgoX19sZTMyICopc3RhcnQgKyAxKTsKKwkJCXJldHVybiBzdGFydDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFBhcnNlIGEgcmVwb3J0IGRlc2NyaXB0aW9uIGludG8gYSBoaWRfZGV2aWNlIHN0cnVjdHVyZS4gUmVwb3J0cyBhcmUKKyAqIGVudW1lcmF0ZWQsIGZpZWxkcyBhcmUgYXR0YWNoZWQgdG8gdGhlc2UgcmVwb3J0cy4KKyAqLworCitzdHJ1Y3QgaGlkX2RldmljZSAqaGlkX3BhcnNlX3JlcG9ydChfX3U4ICpzdGFydCwgdW5zaWduZWQgc2l6ZSkKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXI7CisJc3RydWN0IGhpZF9pdGVtIGl0ZW07CisJX191OCAqZW5kOworCXVuc2lnbmVkIGk7CisJc3RhdGljIGludCAoKmRpc3BhdGNoX3R5cGVbXSkoc3RydWN0IGhpZF9wYXJzZXIgKnBhcnNlciwKKwkJCQkgICAgICBzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pID0geworCQloaWRfcGFyc2VyX21haW4sCisJCWhpZF9wYXJzZXJfZ2xvYmFsLAorCQloaWRfcGFyc2VyX2xvY2FsLAorCQloaWRfcGFyc2VyX3Jlc2VydmVkCisJfTsKKworCWlmICghKGRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKGRldmljZS0+Y29sbGVjdGlvbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfY29sbGVjdGlvbikgKgorCQkJCSAgIEhJRF9ERUZBVUxUX05VTV9DT0xMRUNUSU9OUywgR0ZQX0tFUk5FTCkpKSB7CisJCWtmcmVlKGRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlkZXZpY2UtPmNvbGxlY3Rpb25fc2l6ZSA9IEhJRF9ERUZBVUxUX05VTV9DT0xMRUNUSU9OUzsKKworCWZvciAoaSA9IDA7IGkgPCBISURfUkVQT1JUX1RZUEVTOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnJlcG9ydF9lbnVtW2ldLnJlcG9ydF9saXN0KTsKKworCWlmICghKGRldmljZS0+cmRlc2MgPSAoX191OCAqKWttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7CisJCWtmcmVlKGRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1jcHkoZGV2aWNlLT5yZGVzYywgc3RhcnQsIHNpemUpOworCWRldmljZS0+cnNpemUgPSBzaXplOworCisJaWYgKCEocGFyc2VyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9wYXJzZXIpLCBHRlBfS0VSTkVMKSkpIHsKKwkJa2ZyZWUoZGV2aWNlLT5yZGVzYyk7CisJCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7CisJCWtmcmVlKGRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlwYXJzZXItPmRldmljZSA9IGRldmljZTsKKworCWVuZCA9IHN0YXJ0ICsgc2l6ZTsKKwl3aGlsZSAoKHN0YXJ0ID0gZmV0Y2hfaXRlbShzdGFydCwgZW5kLCAmaXRlbSkpICE9IE5VTEwpIHsKKworCQlpZiAoaXRlbS5mb3JtYXQgIT0gSElEX0lURU1fRk9STUFUX1NIT1JUKSB7CisJCQlkYmcoInVuZXhwZWN0ZWQgbG9uZyBnbG9iYWwgaXRlbSIpOworCQkJa2ZyZWUoZGV2aWNlLT5jb2xsZWN0aW9uKTsKKwkJCWhpZF9mcmVlX2RldmljZShkZXZpY2UpOworCQkJa2ZyZWUocGFyc2VyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKGRpc3BhdGNoX3R5cGVbaXRlbS50eXBlXShwYXJzZXIsICZpdGVtKSkgeworCQkJZGJnKCJpdGVtICV1ICV1ICV1ICV1IHBhcnNpbmcgZmFpbGVkXG4iLAorCQkJCWl0ZW0uZm9ybWF0LCAodW5zaWduZWQpaXRlbS5zaXplLCAodW5zaWduZWQpaXRlbS50eXBlLCAodW5zaWduZWQpaXRlbS50YWcpOworCQkJa2ZyZWUoZGV2aWNlLT5jb2xsZWN0aW9uKTsKKwkJCWhpZF9mcmVlX2RldmljZShkZXZpY2UpOworCQkJa2ZyZWUocGFyc2VyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKHN0YXJ0ID09IGVuZCkgeworCQkJaWYgKHBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHIpIHsKKwkJCQlkYmcoInVuYmFsYW5jZWQgY29sbGVjdGlvbiBhdCBlbmQgb2YgcmVwb3J0IGRlc2NyaXB0aW9uIik7CisJCQkJa2ZyZWUoZGV2aWNlLT5jb2xsZWN0aW9uKTsKKwkJCQloaWRfZnJlZV9kZXZpY2UoZGV2aWNlKTsKKwkJCQlrZnJlZShwYXJzZXIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKHBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2RlcHRoKSB7CisJCQkJZGJnKCJ1bmJhbGFuY2VkIGRlbGltaXRlciBhdCBlbmQgb2YgcmVwb3J0IGRlc2NyaXB0aW9uIik7CisJCQkJa2ZyZWUoZGV2aWNlLT5jb2xsZWN0aW9uKTsKKwkJCQloaWRfZnJlZV9kZXZpY2UoZGV2aWNlKTsKKwkJCQlrZnJlZShwYXJzZXIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJa2ZyZWUocGFyc2VyKTsKKwkJCXJldHVybiBkZXZpY2U7CisJCX0KKwl9CisKKwlkYmcoIml0ZW0gZmV0Y2hpbmcgZmFpbGVkIGF0IG9mZnNldCAlZFxuIiwgKGludCkoZW5kIC0gc3RhcnQpKTsKKwlrZnJlZShkZXZpY2UtPmNvbGxlY3Rpb24pOworCWhpZF9mcmVlX2RldmljZShkZXZpY2UpOworCWtmcmVlKHBhcnNlcik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChoaWRfcGFyc2VfcmVwb3J0KTsKKworLyoKKyAqIENvbnZlcnQgYSBzaWduZWQgbi1iaXQgaW50ZWdlciB0byBzaWduZWQgMzItYml0IGludGVnZXIuIENvbW1vbgorICogY2FzZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgY29tcGlsZXIsIHRoZSBzY3Jld2VkIHRoaW5ncyBoYXMgdG8gYmUKKyAqIGRvbmUgYnkgaGFuZC4KKyAqLworCitzdGF0aWMgczMyIHNudG8zMihfX3UzMiB2YWx1ZSwgdW5zaWduZWQgbikKK3sKKwlzd2l0Y2ggKG4pIHsKKwkJY2FzZSA4OiAgcmV0dXJuICgoX19zOCl2YWx1ZSk7CisJCWNhc2UgMTY6IHJldHVybiAoKF9fczE2KXZhbHVlKTsKKwkJY2FzZSAzMjogcmV0dXJuICgoX19zMzIpdmFsdWUpOworCX0KKwlyZXR1cm4gdmFsdWUgJiAoMSA8PCAobiAtIDEpKSA/IHZhbHVlIHwgKC0xIDw8IG4pIDogdmFsdWU7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHRvIGEgc2lnbmVkIG4tYml0IGludGVnZXIuCisgKi8KKworc3RhdGljIHUzMiBzMzJ0b24oX19zMzIgdmFsdWUsIHVuc2lnbmVkIG4pCit7CisJczMyIGEgPSB2YWx1ZSA+PiAobiAtIDEpOworCWlmIChhICYmIGEgIT0gLTEpCisJCXJldHVybiB2YWx1ZSA8IDAgPyAxIDw8IChuIC0gMSkgOiAoMSA8PCAobiAtIDEpKSAtIDE7CisJcmV0dXJuIHZhbHVlICYgKCgxIDw8IG4pIC0gMSk7Cit9CisKKy8qCisgKiBFeHRyYWN0L2ltcGxlbWVudCBhIGRhdGEgZmllbGQgZnJvbS90byBhIGxpdHRsZSBlbmRpYW4gcmVwb3J0IChiaXQgYXJyYXkpLgorICoKKyAqIENvZGUgc29ydC1vZiBmb2xsb3dzIEhJRCBzcGVjOgorICogICAgIGh0dHA6Ly93d3cudXNiLm9yZy9kZXZlbG9wZXJzL2RldmNsYXNzX2RvY3MvSElEMV8xMS5wZGYKKyAqCisgKiBXaGlsZSB0aGUgVVNCIEhJRCBzcGVjIGFsbG93cyB1bmxpbWl0ZWQgbGVuZ3RoIGJpdCBmaWVsZHMgaW4gInJlcG9ydAorICogZGVzY3JpcHRvcnMiLCBtb3N0IGRldmljZXMgbmV2ZXIgdXNlIG1vcmUgdGhhbiAxNiBiaXRzLgorICogT25lIG1vZGVsIG9mIFVQUyBpcyBjbGFpbWVkIHRvIHJlcG9ydCAiTElORVYiIGFzIGEgMzItYml0IGZpZWxkLgorICogU2VhcmNoIGxpbnV4LWtlcm5lbCBhbmQgbGludXgtdXNiLWRldmVsIGFyY2hpdmVzIGZvciAiaGlkLWNvcmUgZXh0cmFjdCIuCisgKi8KKworc3RhdGljIF9faW5saW5lX18gX191MzIgZXh0cmFjdChfX3U4ICpyZXBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbikKK3sKKwl1NjQgeDsKKworCVdBUk5fT04obiA+IDMyKTsKKworCXJlcG9ydCArPSBvZmZzZXQgPj4gMzsgIC8qIGFkanVzdCBieXRlIGluZGV4ICovCisJb2Zmc2V0ICY9IDc7ICAgICAgICAgICAgLyogbm93IG9ubHkgbmVlZCBiaXQgb2Zmc2V0IGludG8gb25lIGJ5dGUgKi8KKwl4ID0gZ2V0X3VuYWxpZ25lZCgodTY0ICopIHJlcG9ydCk7CisJeCA9IGxlNjRfdG9fY3B1KHgpOworCXggPSAoeCA+PiBvZmZzZXQpICYgKCgxVUxMIDw8IG4pIC0gMSk7ICAvKiBleHRyYWN0IGJpdCBmaWVsZCAqLworCXJldHVybiAodTMyKSB4OworfQorCisvKgorICogImltcGxlbWVudCIgOiBzZXQgYml0cyBpbiBhIGxpdHRsZSBlbmRpYW4gYml0IHN0cmVhbS4KKyAqIFNhbWUgY29uY2VwdHMgYXMgImV4dHJhY3QiIChzZWUgY29tbWVudHMgYWJvdmUpLgorICogVGhlIGRhdGEgbWFuZ2xlZCBpbiB0aGUgYml0IHN0cmVhbSByZW1haW5zIGluIGxpdHRsZSBlbmRpYW4KKyAqIG9yZGVyIHRoZSB3aG9sZSB0aW1lLiBJdCBtYWtlIG1vcmUgc2Vuc2UgdG8gdGFsayBhYm91dAorICogZW5kaWFubmVzcyBvZiByZWdpc3RlciB2YWx1ZXMgYnkgY29uc2lkZXJpbmcgYSByZWdpc3RlcgorICogYSAiY2FjaGVkIiBjb3B5IG9mIHRoZSBsaXR0bGUgZW5kaWFkIGJpdCBzdHJlYW0uCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW1wbGVtZW50KF9fdTggKnJlcG9ydCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuLCBfX3UzMiB2YWx1ZSkKK3sKKwl1NjQgeDsKKwl1NjQgbSA9ICgxVUxMIDw8IG4pIC0gMTsKKworCVdBUk5fT04obiA+IDMyKTsKKworCVdBUk5fT04odmFsdWUgPiBtKTsKKwl2YWx1ZSAmPSBtOworCisJcmVwb3J0ICs9IG9mZnNldCA+PiAzOworCW9mZnNldCAmPSA3OworCisJeCA9IGdldF91bmFsaWduZWQoKHU2NCAqKXJlcG9ydCk7CisJeCAmPSBjcHVfdG9fbGU2NCh+KG0gPDwgb2Zmc2V0KSk7CisJeCB8PSBjcHVfdG9fbGU2NCgoKHU2NCkgdmFsdWUpIDw8IG9mZnNldCk7CisJcHV0X3VuYWxpZ25lZCh4LCAodTY0ICopIHJlcG9ydCk7Cit9CisKKy8qCisgKiBTZWFyY2ggYW4gYXJyYXkgZm9yIGEgdmFsdWUuCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IHNlYXJjaChfX3MzMiAqYXJyYXksIF9fczMyIHZhbHVlLCB1bnNpZ25lZCBuKQoreworCXdoaWxlIChuLS0pIHsKKwkJaWYgKCphcnJheSsrID09IHZhbHVlKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgaGlkX3Byb2Nlc3NfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSwgaW50IGludGVycnVwdCkKK3sKKwloaWRfZHVtcF9pbnB1dCh1c2FnZSwgdmFsdWUpOworCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkKKwkJaGlkaW5wdXRfaGlkX2V2ZW50KGhpZCwgZmllbGQsIHVzYWdlLCB2YWx1ZSk7CisJaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0hJRERFViAmJiBpbnRlcnJ1cHQgJiYgaGlkLT5oaWRkZXZfaGlkX2V2ZW50KQorCQloaWQtPmhpZGRldl9oaWRfZXZlbnQoaGlkLCBmaWVsZCwgdXNhZ2UsIHZhbHVlKTsKK30KKworLyoKKyAqIEFuYWx5c2UgYSByZWNlaXZlZCBmaWVsZCwgYW5kIGZldGNoIHRoZSBkYXRhIGZyb20gaXQuIFRoZSBmaWVsZAorICogY29udGVudCBpcyBzdG9yZWQgZm9yIG5leHQgcmVwb3J0IHByb2Nlc3NpbmcgKHdlIGRvIGRpZmZlcmVudGlhbAorICogcmVwb3J0aW5nIHRvIHRoZSBsYXllcikuCisgKi8KKwordm9pZCBoaWRfaW5wdXRfZmllbGQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIF9fdTggKmRhdGEsIGludCBpbnRlcnJ1cHQpCit7CisJdW5zaWduZWQgbjsKKwl1bnNpZ25lZCBjb3VudCA9IGZpZWxkLT5yZXBvcnRfY291bnQ7CisJdW5zaWduZWQgb2Zmc2V0ID0gZmllbGQtPnJlcG9ydF9vZmZzZXQ7CisJdW5zaWduZWQgc2l6ZSA9IGZpZWxkLT5yZXBvcnRfc2l6ZTsKKwlfX3MzMiBtaW4gPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtOworCV9fczMyIG1heCA9IGZpZWxkLT5sb2dpY2FsX21heGltdW07CisJX19zMzIgKnZhbHVlOworCisJaWYgKCEodmFsdWUgPSBrbWFsbG9jKHNpemVvZihfX3MzMikgKiBjb3VudCwgR0ZQX0FUT01JQykpKQorCQlyZXR1cm47CisKKwlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCisJCQl2YWx1ZVtuXSA9IG1pbiA8IDAgPyBzbnRvMzIoZXh0cmFjdChkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSksIHNpemUpIDoKKwkJCQkJCSAgICBleHRyYWN0KGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplKTsKKworCQkJaWYgKCEoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9WQVJJQUJMRSkgLyogSWdub3JlIHJlcG9ydCBpZiBFcnJvclJvbGxPdmVyICovCisJCQkgICAgJiYgdmFsdWVbbl0gPj0gbWluICYmIHZhbHVlW25dIDw9IG1heAorCQkJICAgICYmIGZpZWxkLT51c2FnZVt2YWx1ZVtuXSAtIG1pbl0uaGlkID09IEhJRF9VUF9LRVlCT0FSRCArIDEpCisJCQkJZ290byBleGl0OworCX0KKworCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisKKwkJaWYgKEhJRF9NQUlOX0lURU1fVkFSSUFCTEUgJiBmaWVsZC0+ZmxhZ3MpIHsKKwkJCWhpZF9wcm9jZXNzX2V2ZW50KGhpZCwgZmllbGQsICZmaWVsZC0+dXNhZ2Vbbl0sIHZhbHVlW25dLCBpbnRlcnJ1cHQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZmllbGQtPnZhbHVlW25dID49IG1pbiAmJiBmaWVsZC0+dmFsdWVbbl0gPD0gbWF4CisJCQkmJiBmaWVsZC0+dXNhZ2VbZmllbGQtPnZhbHVlW25dIC0gbWluXS5oaWQKKwkJCSYmIHNlYXJjaCh2YWx1ZSwgZmllbGQtPnZhbHVlW25dLCBjb3VudCkpCisJCQkJaGlkX3Byb2Nlc3NfZXZlbnQoaGlkLCBmaWVsZCwgJmZpZWxkLT51c2FnZVtmaWVsZC0+dmFsdWVbbl0gLSBtaW5dLCAwLCBpbnRlcnJ1cHQpOworCisJCWlmICh2YWx1ZVtuXSA+PSBtaW4gJiYgdmFsdWVbbl0gPD0gbWF4CisJCQkmJiBmaWVsZC0+dXNhZ2VbdmFsdWVbbl0gLSBtaW5dLmhpZAorCQkJJiYgc2VhcmNoKGZpZWxkLT52YWx1ZSwgdmFsdWVbbl0sIGNvdW50KSkKKwkJCQloaWRfcHJvY2Vzc19ldmVudChoaWQsIGZpZWxkLCAmZmllbGQtPnVzYWdlW3ZhbHVlW25dIC0gbWluXSwgMSwgaW50ZXJydXB0KTsKKwl9CisKKwltZW1jcHkoZmllbGQtPnZhbHVlLCB2YWx1ZSwgY291bnQgKiBzaXplb2YoX19zMzIpKTsKK2V4aXQ6CisJa2ZyZWUodmFsdWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkX2lucHV0X2ZpZWxkKTsKKworLyoKKyAqIE91dHB1dCB0aGUgZmllbGQgaW50byB0aGUgcmVwb3J0LgorICovCisKK3N0YXRpYyB2b2lkIGhpZF9vdXRwdXRfZmllbGQoc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIF9fdTggKmRhdGEpCit7CisJdW5zaWduZWQgY291bnQgPSBmaWVsZC0+cmVwb3J0X2NvdW50OworCXVuc2lnbmVkIG9mZnNldCA9IGZpZWxkLT5yZXBvcnRfb2Zmc2V0OworCXVuc2lnbmVkIHNpemUgPSBmaWVsZC0+cmVwb3J0X3NpemU7CisJdW5zaWduZWQgbjsKKworCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisJCWlmIChmaWVsZC0+bG9naWNhbF9taW5pbXVtIDwgMCkJLyogc2lnbmVkIHZhbHVlcyAqLworCQkJaW1wbGVtZW50KGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplLCBzMzJ0b24oZmllbGQtPnZhbHVlW25dLCBzaXplKSk7CisJCWVsc2UJCQkJLyogdW5zaWduZWQgdmFsdWVzICovCisJCQlpbXBsZW1lbnQoZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUsIGZpZWxkLT52YWx1ZVtuXSk7CisJfQorfQorCisvKgorICogQ3JlYXRlIGEgcmVwb3J0LgorICovCisKK3ZvaWQgaGlkX291dHB1dF9yZXBvcnQoc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwgX191OCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBuOworCisJaWYgKHJlcG9ydC0+aWQgPiAwKQorCQkqZGF0YSsrID0gcmVwb3J0LT5pZDsKKworCWZvciAobiA9IDA7IG4gPCByZXBvcnQtPm1heGZpZWxkOyBuKyspCisJCWhpZF9vdXRwdXRfZmllbGQocmVwb3J0LT5maWVsZFtuXSwgZGF0YSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChoaWRfb3V0cHV0X3JlcG9ydCk7CisKKy8qCisgKiBTZXQgYSBmaWVsZCB2YWx1ZS4gVGhlIHJlcG9ydCB0aGlzIGZpZWxkIGJlbG9uZ3MgdG8gaGFzIHRvIGJlCisgKiBjcmVhdGVkIGFuZCB0cmFuc2ZlcnJlZCB0byB0aGUgZGV2aWNlLCB0byBzZXQgdGhpcyB2YWx1ZSBpbiB0aGUKKyAqIGRldmljZS4KKyAqLworCitpbnQgaGlkX3NldF9maWVsZChzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgdW5zaWduZWQgb2Zmc2V0LCBfX3MzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBzaXplID0gZmllbGQtPnJlcG9ydF9zaXplOworCisJaGlkX2R1bXBfaW5wdXQoZmllbGQtPnVzYWdlICsgb2Zmc2V0LCB2YWx1ZSk7CisKKwlpZiAob2Zmc2V0ID49IGZpZWxkLT5yZXBvcnRfY291bnQpIHsKKwkJZGJnKCJvZmZzZXQgKCVkKSBleGNlZWRzIHJlcG9ydF9jb3VudCAoJWQpIiwgb2Zmc2V0LCBmaWVsZC0+cmVwb3J0X2NvdW50KTsKKwkJaGlkX2R1bXBfZmllbGQoZmllbGQsIDgpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChmaWVsZC0+bG9naWNhbF9taW5pbXVtIDwgMCkgeworCQlpZiAodmFsdWUgIT0gc250bzMyKHMzMnRvbih2YWx1ZSwgc2l6ZSksIHNpemUpKSB7CisJCQlkYmcoInZhbHVlICVkIGlzIG91dCBvZiByYW5nZSIsIHZhbHVlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlmaWVsZC0+dmFsdWVbb2Zmc2V0XSA9IHZhbHVlOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkX3NldF9maWVsZCk7CisKK2ludCBoaWRfaW5wdXRfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIGludCB0eXBlLCB1OCAqZGF0YSwgaW50IHNpemUsIGludCBpbnRlcnJ1cHQpCit7CisJc3RydWN0IGhpZF9yZXBvcnRfZW51bSAqcmVwb3J0X2VudW0gPSBoaWQtPnJlcG9ydF9lbnVtICsgdHlwZTsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCWludCBuLCByc2l6ZTsKKworCWlmICghaGlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghc2l6ZSkgeworCQlkYmcoImVtcHR5IHJlcG9ydCIpOworCQlyZXR1cm4gLTE7CisJfQorCisjaWZkZWYgREVCVUdfREFUQQorCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IHJlcG9ydCAoc2l6ZSAldSkgKCVzbnVtYmVyZWQpXG4iLCBsZW4sIHJlcG9ydF9lbnVtLT5udW1iZXJlZCA/ICIiIDogInVuIik7CisjZW5kaWYKKworCW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9ybWFsbHkgcmVwb3J0IG51bWJlciBpcyAwICovCisJaWYgKHJlcG9ydF9lbnVtLT5udW1iZXJlZCkgeyAgICAvKiBEZXZpY2UgdXNlcyBudW1iZXJlZCByZXBvcnRzLCBkYXRhWzBdIGlzIHJlcG9ydCBudW1iZXIgKi8KKwkJbiA9ICpkYXRhKys7CisJCXNpemUtLTsKKwl9CisKKyNpZmRlZiBERUJVR19EQVRBCisJeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjogcmVwb3J0ICVkIChzaXplICV1KSA9ICIsIG4sIHNpemUpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsIGRhdGFbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisKKwlpZiAoIShyZXBvcnQgPSByZXBvcnRfZW51bS0+cmVwb3J0X2lkX2hhc2hbbl0pKSB7CisJCWRiZygidW5kZWZpbmVkIHJlcG9ydF9pZCAlZCByZWNlaXZlZCIsIG4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcnNpemUgPSAoKHJlcG9ydC0+c2l6ZSAtIDEpID4+IDMpICsgMTsKKworCWlmIChzaXplIDwgcnNpemUpIHsKKwkJZGJnKCJyZXBvcnQgJWQgaXMgdG9vIHNob3J0LCAoJWQgPCAlZCkiLCByZXBvcnQtPmlkLCBzaXplLCByc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0hJRERFVikgJiYgaGlkLT5oaWRkZXZfcmVwb3J0X2V2ZW50KQorCQloaWQtPmhpZGRldl9yZXBvcnRfZXZlbnQoaGlkLCByZXBvcnQpOworCisJZm9yIChuID0gMDsgbiA8IHJlcG9ydC0+bWF4ZmllbGQ7IG4rKykKKwkJaGlkX2lucHV0X2ZpZWxkKGhpZCwgcmVwb3J0LT5maWVsZFtuXSwgZGF0YSwgaW50ZXJydXB0KTsKKworCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkKKwkJaGlkaW5wdXRfcmVwb3J0X2V2ZW50KGhpZCwgcmVwb3J0KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkX2lucHV0X3JlcG9ydCk7CisKK01PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMgYi9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNkZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisgKiAkSWQ6IGhpZC1pbnB1dC5jLHYgMS4yIDIwMDIvMDQvMjMgMDA6NTk6MjUgcmRhbWF6aW8gRXhwICQKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVm9qdGVjaCBQYXZsaWsKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYgSmlyaSBLb3NpbmEKKyAqCisgKiAgSElEIHRvIExpbnV4IElucHV0IG1hcHBpbmcKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKKyAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CisgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgorCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorCisjZGVmaW5lIHVuawlLRVlfVU5LTk9XTgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBoaWRfa2V5Ym9hcmRbMjU2XSA9IHsKKwkgIDAsICAwLCAgMCwgIDAsIDMwLCA0OCwgNDYsIDMyLCAxOCwgMzMsIDM0LCAzNSwgMjMsIDM2LCAzNywgMzgsCisJIDUwLCA0OSwgMjQsIDI1LCAxNiwgMTksIDMxLCAyMCwgMjIsIDQ3LCAxNywgNDUsIDIxLCA0NCwgIDIsICAzLAorCSAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDI4LCAgMSwgMTQsIDE1LCA1NywgMTIsIDEzLCAyNiwKKwkgMjcsIDQzLCA0MywgMzksIDQwLCA0MSwgNTEsIDUyLCA1MywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsCisJIDY1LCA2NiwgNjcsIDY4LCA4NywgODgsIDk5LCA3MCwxMTksMTEwLDEwMiwxMDQsMTExLDEwNywxMDksMTA2LAorCTEwNSwxMDgsMTAzLCA2OSwgOTgsIDU1LCA3NCwgNzgsIDk2LCA3OSwgODAsIDgxLCA3NSwgNzYsIDc3LCA3MSwKKwkgNzIsIDczLCA4MiwgODMsIDg2LDEyNywxMTYsMTE3LDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsCisJMTkxLDE5MiwxOTMsMTk0LDEzNCwxMzgsMTMwLDEzMiwxMjgsMTI5LDEzMSwxMzcsMTMzLDEzNSwxMzYsMTEzLAorCTExNSwxMTQsdW5rLHVuayx1bmssMTIxLHVuaywgODksIDkzLDEyNCwgOTIsIDk0LCA5NSx1bmssdW5rLHVuaywKKwkxMjIsMTIzLCA5MCwgOTEsIDg1LHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssCisJdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLAorCXVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuaywKKwl1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssCisJdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLAorCSAyOSwgNDIsIDU2LDEyNSwgOTcsIDU0LDEwMCwxMjYsMTY0LDE2NiwxNjUsMTYzLDE2MSwxMTUsMTE0LDExMywKKwkxNTAsMTU4LDE1OSwxMjgsMTM2LDE3NywxNzgsMTc2LDE0MiwxNTIsMTczLDE0MCx1bmssdW5rLHVuayx1bmsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCV9fczMyIHg7CisJX19zMzIgeTsKK30gIGhpZF9oYXRfdG9fYXhpc1tdID0ge3sgMCwgMH0sIHsgMCwtMX0sIHsgMSwtMX0sIHsgMSwgMH0sIHsgMSwgMX0sIHsgMCwgMX0sIHstMSwgMX0sIHstMSwgMH0sIHstMSwtMX19OworCisjZGVmaW5lIG1hcF9hYnMoYykJZG8geyB1c2FnZS0+Y29kZSA9IGM7IHVzYWdlLT50eXBlID0gRVZfQUJTOyBiaXQgPSBpbnB1dC0+YWJzYml0OyBtYXggPSBBQlNfTUFYOyB9IHdoaWxlICgwKQorI2RlZmluZSBtYXBfcmVsKGMpCWRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX1JFTDsgYml0ID0gaW5wdXQtPnJlbGJpdDsgbWF4ID0gUkVMX01BWDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbWFwX2tleShjKQlkbyB7IHVzYWdlLT5jb2RlID0gYzsgdXNhZ2UtPnR5cGUgPSBFVl9LRVk7IGJpdCA9IGlucHV0LT5rZXliaXQ7IG1heCA9IEtFWV9NQVg7IH0gd2hpbGUgKDApCisjZGVmaW5lIG1hcF9sZWQoYykJZG8geyB1c2FnZS0+Y29kZSA9IGM7IHVzYWdlLT50eXBlID0gRVZfTEVEOyBiaXQgPSBpbnB1dC0+bGVkYml0OyBtYXggPSBMRURfTUFYOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIG1hcF9hYnNfY2xlYXIoYykJZG8geyBtYXBfYWJzKGMpOyBjbGVhcl9iaXQoYywgYml0KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbWFwX2tleV9jbGVhcihjKQlkbyB7IG1hcF9rZXkoYyk7IGNsZWFyX2JpdChjLCBiaXQpOyB9IHdoaWxlICgwKQorCisjaWZkZWYgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sKKworc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiB7CisJdTE2IGZyb207CisJdTE2IHRvOworCXU4IGZsYWdzOworfTsKKworI2RlZmluZSBQT1dFUkJPT0tfRkxBR19GS0VZIDB4MDEKKworc3RhdGljIHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gcG93ZXJib29rX2ZuX2tleXNbXSA9IHsKKwl7IEtFWV9CQUNLU1BBQ0UsIEtFWV9ERUxFVEUgfSwKKwl7IEtFWV9GMSwgICAgICAgS0VZX0JSSUdIVE5FU1NET1dOLCAgICAgUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YyLCAgICAgICBLRVlfQlJJR0hUTkVTU1VQLCAgICAgICBQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjMsICAgICAgIEtFWV9NVVRFLCAgICAgICAgICAgICAgIFBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNCwgICAgICAgS0VZX1ZPTFVNRURPV04sICAgICAgICAgUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y1LCAgICAgICBLRVlfVk9MVU1FVVAsICAgICAgICAgICBQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjYsICAgICAgIEtFWV9OVU1MT0NLLCAgICAgICAgICAgIFBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNywgICAgICAgS0VZX1NXSVRDSFZJREVPTU9ERSwgICAgUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y4LCAgICAgICBLRVlfS0JESUxMVU1UT0dHTEUsICAgICBQT1dFUkJPT0tfRkxBR19GS0VZIH0sCisJeyBLRVlfRjksICAgICAgIEtFWV9LQkRJTExVTURPV04sICAgICAgIFBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMTAsICAgICAgS0VZX0tCRElMTFVNVVAsICAgICAgICAgUE9XRVJCT09LX0ZMQUdfRktFWSB9LAorCXsgS0VZX1VQLCAgICAgICBLRVlfUEFHRVVQIH0sCisJeyBLRVlfRE9XTiwgICAgIEtFWV9QQUdFRE9XTiB9LAorCXsgS0VZX0xFRlQsICAgICBLRVlfSE9NRSB9LAorCXsgS0VZX1JJR0hULCAgICBLRVlfRU5EIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfbnVtbG9ja19rZXlzW10gPSB7CisJeyBLRVlfSiwgICAgICAgIEtFWV9LUDEgfSwKKwl7IEtFWV9LLCAgICAgICAgS0VZX0tQMiB9LAorCXsgS0VZX0wsICAgICAgICBLRVlfS1AzIH0sCisJeyBLRVlfVSwgICAgICAgIEtFWV9LUDQgfSwKKwl7IEtFWV9JLCAgICAgICAgS0VZX0tQNSB9LAorCXsgS0VZX08sICAgICAgICBLRVlfS1A2IH0sCisJeyBLRVlfNywgICAgICAgIEtFWV9LUDcgfSwKKwl7IEtFWV84LCAgICAgICAgS0VZX0tQOCB9LAorCXsgS0VZXzksICAgICAgICBLRVlfS1A5IH0sCisJeyBLRVlfTSwgICAgICAgIEtFWV9LUDAgfSwKKwl7IEtFWV9ET1QsICAgICAgS0VZX0tQRE9UIH0sCisJeyBLRVlfU0xBU0gsICAgIEtFWV9LUFBMVVMgfSwKKwl7IEtFWV9TRU1JQ09MT04sIEtFWV9LUE1JTlVTIH0sCisJeyBLRVlfUCwgICAgICAgIEtFWV9LUEFTVEVSSVNLIH0sCisJeyBLRVlfTUlOVVMsICAgIEtFWV9LUEVRVUFMIH0sCisJeyBLRVlfMCwgICAgICAgIEtFWV9LUFNMQVNIIH0sCisJeyBLRVlfRjYsICAgICAgIEtFWV9OVU1MT0NLIH0sCisJeyBLRVlfS1BFTlRFUiwgIEtFWV9LUEVOVEVSIH0sCisJeyBLRVlfQkFDS1NQQUNFLCBLRVlfQkFDS1NQQUNFIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfaXNvX2tleWJvYXJkW10gPSB7CisJeyBLRVlfR1JBVkUsICAgIEtFWV8xMDJORCB9LAorCXsgS0VZXzEwMk5ELCAgICBLRVlfR1JBVkUgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICpmaW5kX3RyYW5zbGF0aW9uKHN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gKnRhYmxlLCB1MTYgZnJvbSkKK3sKKwlzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKworCS8qIExvb2sgZm9yIHRoZSB0cmFuc2xhdGlvbiAqLworCWZvciAodHJhbnMgPSB0YWJsZTsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCWlmICh0cmFucy0+ZnJvbSA9PSBmcm9tKQorCQkJcmV0dXJuIHRyYW5zOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaGlkaW5wdXRfcGJfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQsCisJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKworCWlmICh1c2FnZS0+Y29kZSA9PSBLRVlfRk4pIHsKKwkJaWYgKHZhbHVlKSBoaWQtPnF1aXJrcyB8PSAgSElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTjsKKwkJZWxzZSAgICAgICBoaWQtPnF1aXJrcyAmPSB+SElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTjsKKworCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCB2YWx1ZSk7CisKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGhpZC0+cGJfZm5tb2RlKSB7CisJCWludCBkb190cmFuc2xhdGU7CisKKwkJdHJhbnMgPSBmaW5kX3RyYW5zbGF0aW9uKHBvd2VyYm9va19mbl9rZXlzLCB1c2FnZS0+Y29kZSk7CisJCWlmICh0cmFucykgeworCQkJaWYgKHRlc3RfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfZm4pKQorCQkJCWRvX3RyYW5zbGF0ZSA9IDE7CisJCQllbHNlIGlmICh0cmFucy0+ZmxhZ3MgJiBQT1dFUkJPT0tfRkxBR19GS0VZKQorCQkJCWRvX3RyYW5zbGF0ZSA9CisJCQkJCShoaWQtPnBiX2ZubW9kZSA9PSAyICYmICAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OKSkgfHwKKwkJCQkJKGhpZC0+cGJfZm5tb2RlID09IDEgJiYgIShoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT04pKTsKKwkJCWVsc2UKKwkJCQlkb190cmFuc2xhdGUgPSAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OKTsKKworCQkJaWYgKGRvX3RyYW5zbGF0ZSkgeworCQkJCWlmICh2YWx1ZSkKKwkJCQkJc2V0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX2ZuKTsKKwkJCQllbHNlCisJCQkJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX2ZuKTsKKworCQkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLCB2YWx1ZSk7CisKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJCWlmICh0ZXN0X2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX251bWxvY2spIHx8CisJCQkJdGVzdF9iaXQoTEVEX05VTUwsIGlucHV0LT5sZWQpKSB7CisJCQl0cmFucyA9IGZpbmRfdHJhbnNsYXRpb24ocG93ZXJib29rX251bWxvY2tfa2V5cywgdXNhZ2UtPmNvZGUpOworCisJCQlpZiAodHJhbnMpIHsKKwkJCQlpZiAodmFsdWUpCisJCQkJCXNldF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9udW1sb2NrKTsKKwkJCQllbHNlCisJCQkJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX251bWxvY2spOworCisJCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB0cmFucy0+dG8sIHZhbHVlKTsKKwkJCX0KKworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRCkgeworCQl0cmFucyA9IGZpbmRfdHJhbnNsYXRpb24ocG93ZXJib29rX2lzb19rZXlib2FyZCwgdXNhZ2UtPmNvZGUpOworCQlpZiAodHJhbnMpIHsKKwkJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdHJhbnMtPnRvLCB2YWx1ZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoaWRpbnB1dF9wYl9zZXR1cChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKworCXNldF9iaXQoS0VZX05VTUxPQ0ssIGlucHV0LT5rZXliaXQpOworCisJLyogRW5hYmxlIGFsbCBuZWVkZWQga2V5cyAqLworCWZvciAodHJhbnMgPSBwb3dlcmJvb2tfZm5fa2V5czsgdHJhbnMtPmZyb207IHRyYW5zKyspCisJCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKKworCWZvciAodHJhbnMgPSBwb3dlcmJvb2tfbnVtbG9ja19rZXlzOyB0cmFucy0+ZnJvbTsgdHJhbnMrKykKKwkJc2V0X2JpdCh0cmFucy0+dG8sIGlucHV0LT5rZXliaXQpOworCisJZm9yICh0cmFucyA9IHBvd2VyYm9va19pc29fa2V5Ym9hcmQ7IHRyYW5zLT5mcm9tOyB0cmFucysrKQorCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7CisKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBoaWRpbnB1dF9wYl9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKKwkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkaW5wdXRfcGJfc2V0dXAoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCit7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaGlkaW5wdXRfY29uZmlndXJlX3VzYWdlKHN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJCQkgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gaGlkaW5wdXQtPmlucHV0OworCXN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UgPSBpbnB1dC0+cHJpdmF0ZTsKKwlpbnQgbWF4ID0gMCwgY29kZTsKKwl1bnNpZ25lZCBsb25nICpiaXQgPSBOVUxMOworCisJZmllbGQtPmhpZGlucHV0ID0gaGlkaW5wdXQ7CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJNYXBwaW5nOiAiKTsKKwlyZXNvbHZfdXNhZ2UodXNhZ2UtPmhpZCk7CisJcHJpbnRrKCIgLS0tPiAiKTsKKyNlbmRpZgorCisJaWYgKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fQ09OU1RBTlQpCisJCWdvdG8gaWdub3JlOworCisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpIHsKKworCQljYXNlIEhJRF9VUF9VTkRFRklORUQ6CisJCQlnb3RvIGlnbm9yZTsKKworCQljYXNlIEhJRF9VUF9LRVlCT0FSRDoKKworCQkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7CisKKwkJCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgPCAyNTYpIHsKKwkJCQlpZiAoIWhpZF9rZXlib2FyZFt1c2FnZS0+aGlkICYgSElEX1VTQUdFXSkgZ290byBpZ25vcmU7CisJCQkJbWFwX2tleV9jbGVhcihoaWRfa2V5Ym9hcmRbdXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV0pOworCQkJfSBlbHNlCisJCQkJbWFwX2tleShLRVlfVU5LTk9XTik7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSElEX1VQX0JVVFRPTjoKKworCQkJY29kZSA9ICgodXNhZ2UtPmhpZCAtIDEpICYgMHhmKTsKKworCQkJc3dpdGNoIChmaWVsZC0+YXBwbGljYXRpb24pIHsKKwkJCQljYXNlIEhJRF9HRF9NT1VTRToKKwkJCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSAweDExMDsgYnJlYWs7CisJCQkJY2FzZSBISURfR0RfSk9ZU1RJQ0s6IGNvZGUgKz0gMHgxMjA7IGJyZWFrOworCQkJCWNhc2UgSElEX0dEX0dBTUVQQUQ6ICBjb2RlICs9IDB4MTMwOyBicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzd2l0Y2ggKGZpZWxkLT5waHlzaWNhbCkgeworCQkJCQkJY2FzZSBISURfR0RfTU9VU0U6CisJCQkJCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSAweDExMDsgYnJlYWs7CisJCQkJCQljYXNlIEhJRF9HRF9KT1lTVElDSzogY29kZSArPSAweDEyMDsgYnJlYWs7CisJCQkJCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSAweDEzMDsgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAgICAgICAgICAgICAgY29kZSArPSAweDEwMDsKKwkJCQkJfQorCQkJfQorCisJCQltYXBfa2V5KGNvZGUpOworCQkJYnJlYWs7CisKKworCQljYXNlIEhJRF9VUF9TSU1VTEFUSU9OOgorCisJCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmZmYpIHsKKwkJCQljYXNlIDB4YmE6IG1hcF9hYnMoQUJTX1JVRERFUik7ICAgYnJlYWs7CisJCQkJY2FzZSAweGJiOiBtYXBfYWJzKEFCU19USFJPVFRMRSk7IGJyZWFrOworCQkJCWNhc2UgMHhjNDogbWFwX2FicyhBQlNfR0FTKTsgICAgICBicmVhazsKKwkJCQljYXNlIDB4YzU6IG1hcF9hYnMoQUJTX0JSQUtFKTsgICAgYnJlYWs7CisJCQkJY2FzZSAweGM4OiBtYXBfYWJzKEFCU19XSEVFTCk7ICAgIGJyZWFrOworCQkJCWRlZmF1bHQ6ICAgZ290byBpZ25vcmU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEhJRF9VUF9HRU5ERVNLOgorCisJCQlpZiAoKHVzYWdlLT5oaWQgJiAweGYwKSA9PSAweDgwKSB7CS8qIFN5c3RlbUNvbnRyb2wgKi8KKwkJCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGYpIHsKKwkJCQkJY2FzZSAweDE6IG1hcF9rZXlfY2xlYXIoS0VZX1BPV0VSKTsgIGJyZWFrOworCQkJCQljYXNlIDB4MjogbWFwX2tleV9jbGVhcihLRVlfU0xFRVApOyAgYnJlYWs7CisJCQkJCWNhc2UgMHgzOiBtYXBfa2V5X2NsZWFyKEtFWV9XQUtFVVApOyBicmVhazsKKwkJCQkJZGVmYXVsdDogZ290byB1bmtub3duOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCh1c2FnZS0+aGlkICYgMHhmMCkgPT0gMHg5MCkgewkvKiBELXBhZCAqLworCQkJCXN3aXRjaCAodXNhZ2UtPmhpZCkgeworCQkJCQljYXNlIEhJRF9HRF9VUDoJICAgdXNhZ2UtPmhhdF9kaXIgPSAxOyBicmVhazsKKwkJCQkJY2FzZSBISURfR0RfRE9XTjogIHVzYWdlLT5oYXRfZGlyID0gNTsgYnJlYWs7CisJCQkJCWNhc2UgSElEX0dEX1JJR0hUOiB1c2FnZS0+aGF0X2RpciA9IDM7IGJyZWFrOworCQkJCQljYXNlIEhJRF9HRF9MRUZUOiAgdXNhZ2UtPmhhdF9kaXIgPSA3OyBicmVhazsKKwkJCQkJZGVmYXVsdDogZ290byB1bmtub3duOworCQkJCX0KKwkJCQlpZiAoZmllbGQtPmRwYWQpIHsKKwkJCQkJbWFwX2FicyhmaWVsZC0+ZHBhZCk7CisJCQkJCWdvdG8gaWdub3JlOworCQkJCX0KKwkJCQltYXBfYWJzKEFCU19IQVQwWCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXN3aXRjaCAodXNhZ2UtPmhpZCkgeworCisJCQkJLyogVGhlc2UgdXNhZ2UgSURzIG1hcCBkaXJlY3RseSB0byB0aGUgdXNhZ2UgY29kZXMuICovCisJCQkJY2FzZSBISURfR0RfWDogY2FzZSBISURfR0RfWTogY2FzZSBISURfR0RfWjoKKwkJCQljYXNlIEhJRF9HRF9SWDogY2FzZSBISURfR0RfUlk6IGNhc2UgSElEX0dEX1JaOgorCQkJCWNhc2UgSElEX0dEX1NMSURFUjogY2FzZSBISURfR0RfRElBTDogY2FzZSBISURfR0RfV0hFRUw6CisJCQkJCWlmIChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKQorCQkJCQkJbWFwX3JlbCh1c2FnZS0+aGlkICYgMHhmKTsKKwkJCQkJZWxzZQorCQkJCQkJbWFwX2Ficyh1c2FnZS0+aGlkICYgMHhmKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEhJRF9HRF9IQVRTV0lUQ0g6CisJCQkJCXVzYWdlLT5oYXRfbWluID0gZmllbGQtPmxvZ2ljYWxfbWluaW11bTsKKwkJCQkJdXNhZ2UtPmhhdF9tYXggPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtOworCQkJCQltYXBfYWJzKEFCU19IQVQwWCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBISURfR0RfU1RBUlQ6CW1hcF9rZXlfY2xlYXIoQlROX1NUQVJUKTsJYnJlYWs7CisJCQkJY2FzZSBISURfR0RfU0VMRUNUOgltYXBfa2V5X2NsZWFyKEJUTl9TRUxFQ1QpOwlicmVhazsKKworCQkJCWRlZmF1bHQ6IGdvdG8gdW5rbm93bjsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBISURfVVBfTEVEOgorCQkJaWYgKCgodXNhZ2UtPmhpZCAtIDEpICYgMHhmZmZmKSA+PSBMRURfTUFYKQorCQkJCWdvdG8gaWdub3JlOworCQkJbWFwX2xlZCgodXNhZ2UtPmhpZCAtIDEpICYgMHhmZmZmKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSElEX1VQX0RJR0lUSVpFUjoKKworCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgMHhmZikgeworCisJCQkJY2FzZSAweDMwOiAvKiBUaXBQcmVzc3VyZSAqLworCQkJCQlpZiAoIXRlc3RfYml0KEJUTl9UT1VDSCwgaW5wdXQtPmtleWJpdCkpIHsKKwkJCQkJCWRldmljZS0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT1RPVUNIOworCQkJCQkJc2V0X2JpdChFVl9LRVksIGlucHV0LT5ldmJpdCk7CisJCQkJCQlzZXRfYml0KEJUTl9UT1VDSCwgaW5wdXQtPmtleWJpdCk7CisJCQkJCX0KKworCQkJCQltYXBfYWJzX2NsZWFyKEFCU19QUkVTU1VSRSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweDMyOiAvKiBJblJhbmdlICovCisJCQkJCXN3aXRjaCAoZmllbGQtPnBoeXNpY2FsICYgMHhmZikgeworCQkJCQkJY2FzZSAweDIxOiBtYXBfa2V5KEJUTl9UT09MX01PVVNFKTsgYnJlYWs7CisJCQkJCQljYXNlIDB4MjI6IG1hcF9rZXkoQlROX1RPT0xfRklOR0VSKTsgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiBtYXBfa2V5KEJUTl9UT09MX1BFTik7IGJyZWFrOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweDNjOiAvKiBJbnZlcnQgKi8KKwkJCQkJbWFwX2tleV9jbGVhcihCVE5fVE9PTF9SVUJCRVIpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHgzMzogLyogVG91Y2ggKi8KKwkJCQljYXNlIDB4NDI6IC8qIFRpcFN3aXRjaCAqLworCQkJCWNhc2UgMHg0MzogLyogVGlwU3dpdGNoMiAqLworCQkJCQlkZXZpY2UtPnF1aXJrcyAmPSB+SElEX1FVSVJLX05PVE9VQ0g7CisJCQkJCW1hcF9rZXlfY2xlYXIoQlROX1RPVUNIKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4NDQ6IC8qIEJhcnJlbFN3aXRjaCAqLworCQkJCQltYXBfa2V5X2NsZWFyKEJUTl9TVFlMVVMpOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6ICBnb3RvIHVua25vd247CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEhJRF9VUF9DT05TVU1FUjoJLyogVVNCIEhVVCB2MS4xLCBwYWdlcyA1Ni02MiAqLworCisJCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJCQljYXNlIDB4MDAwOiBnb3RvIGlnbm9yZTsKKwkJCQljYXNlIDB4MDM0OiBtYXBfa2V5X2NsZWFyKEtFWV9TTEVFUCk7CQlicmVhazsKKwkJCQljYXNlIDB4MDM2OiBtYXBfa2V5X2NsZWFyKEJUTl9NSVNDKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwNDU6IG1hcF9rZXlfY2xlYXIoS0VZX1JBRElPKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwOGE6IG1hcF9rZXlfY2xlYXIoS0VZX1dXVyk7CQlicmVhazsKKwkJCQljYXNlIDB4MDhkOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HUkFNKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwOTU6IG1hcF9rZXlfY2xlYXIoS0VZX0hFTFApOwkJYnJlYWs7CisJCQkJY2FzZSAweDA5YzogbWFwX2tleV9jbGVhcihLRVlfQ0hBTk5FTFVQKTsJYnJlYWs7CisJCQkJY2FzZSAweDA5ZDogbWFwX2tleV9jbGVhcihLRVlfQ0hBTk5FTERPV04pOwlicmVhazsKKwkJCQljYXNlIDB4MGIwOiBtYXBfa2V5X2NsZWFyKEtFWV9QTEFZKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwYjE6IG1hcF9rZXlfY2xlYXIoS0VZX1BBVVNFKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwYjI6IG1hcF9rZXlfY2xlYXIoS0VZX1JFQ09SRCk7CQlicmVhazsKKwkJCQljYXNlIDB4MGIzOiBtYXBfa2V5X2NsZWFyKEtFWV9GQVNURk9SV0FSRCk7CWJyZWFrOworCQkJCWNhc2UgMHgwYjQ6IG1hcF9rZXlfY2xlYXIoS0VZX1JFV0lORCk7CQlicmVhazsKKwkJCQljYXNlIDB4MGI1OiBtYXBfa2V5X2NsZWFyKEtFWV9ORVhUU09ORyk7CWJyZWFrOworCQkJCWNhc2UgMHgwYjY6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVZJT1VTU09ORyk7CWJyZWFrOworCQkJCWNhc2UgMHgwYjc6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1BDRCk7CQlicmVhazsKKwkJCQljYXNlIDB4MGI4OiBtYXBfa2V5X2NsZWFyKEtFWV9FSkVDVENEKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwY2Q6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVlQQVVTRSk7CWJyZWFrOworCQkJICAgICAgICBjYXNlIDB4MGUwOiBtYXBfYWJzX2NsZWFyKEFCU19WT0xVTUUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDBlMjogbWFwX2tleV9jbGVhcihLRVlfTVVURSk7CQlicmVhazsKKwkJCQljYXNlIDB4MGU1OiBtYXBfa2V5X2NsZWFyKEtFWV9CQVNTQk9PU1QpOwlicmVhazsKKwkJCQljYXNlIDB4MGU5OiBtYXBfa2V5X2NsZWFyKEtFWV9WT0xVTUVVUCk7CWJyZWFrOworCQkJCWNhc2UgMHgwZWE6IG1hcF9rZXlfY2xlYXIoS0VZX1ZPTFVNRURPV04pOwlicmVhazsKKwkJCQljYXNlIDB4MTgzOiBtYXBfa2V5X2NsZWFyKEtFWV9DT05GSUcpOwkJYnJlYWs7CisJCQkJY2FzZSAweDE4YTogbWFwX2tleV9jbGVhcihLRVlfTUFJTCk7CQlicmVhazsKKwkJCQljYXNlIDB4MTkyOiBtYXBfa2V5X2NsZWFyKEtFWV9DQUxDKTsJCWJyZWFrOworCQkJCWNhc2UgMHgxOTQ6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTEUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDFhNzogbWFwX2tleV9jbGVhcihLRVlfRE9DVU1FTlRTKTsJYnJlYWs7CisJCQkJY2FzZSAweDIwMTogbWFwX2tleV9jbGVhcihLRVlfTkVXKTsJCWJyZWFrOworCQkJCWNhc2UgMHgyMDc6IG1hcF9rZXlfY2xlYXIoS0VZX1NBVkUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDIwODogbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOwkJYnJlYWs7CisJCQkJY2FzZSAweDIwOTogbWFwX2tleV9jbGVhcihLRVlfUFJPUFMpOwkJYnJlYWs7CisJCQkJY2FzZSAweDIxYTogbWFwX2tleV9jbGVhcihLRVlfVU5ETyk7CQlicmVhazsKKwkJCQljYXNlIDB4MjFiOiBtYXBfa2V5X2NsZWFyKEtFWV9DT1BZKTsJCWJyZWFrOworCQkJCWNhc2UgMHgyMWM6IG1hcF9rZXlfY2xlYXIoS0VZX0NVVCk7CQlicmVhazsKKwkJCQljYXNlIDB4MjFkOiBtYXBfa2V5X2NsZWFyKEtFWV9QQVNURSk7CQlicmVhazsKKwkJCQljYXNlIDB4MjIxOiBtYXBfa2V5X2NsZWFyKEtFWV9GSU5EKTsJCWJyZWFrOworCQkJCWNhc2UgMHgyMjM6IG1hcF9rZXlfY2xlYXIoS0VZX0hPTUVQQUdFKTsJYnJlYWs7CisJCQkJY2FzZSAweDIyNDogbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CQlicmVhazsKKwkJCQljYXNlIDB4MjI1OiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJEKTsJCWJyZWFrOworCQkJCWNhc2UgMHgyMjY6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOwkJYnJlYWs7CisJCQkJY2FzZSAweDIyNzogbWFwX2tleV9jbGVhcihLRVlfUkVGUkVTSCk7CQlicmVhazsKKwkJCQljYXNlIDB4MjJhOiBtYXBfa2V5X2NsZWFyKEtFWV9CT09LTUFSS1MpOwlicmVhazsKKwkJCQljYXNlIDB4MjMzOiBtYXBfa2V5X2NsZWFyKEtFWV9TQ1JPTExVUCk7CWJyZWFrOworCQkJCWNhc2UgMHgyMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NDUk9MTERPV04pOwlicmVhazsKKwkJCQljYXNlIDB4MjM4OiBtYXBfcmVsKFJFTF9IV0hFRUwpOwkJYnJlYWs7CisJCQkJY2FzZSAweDI3OTogbWFwX2tleV9jbGVhcihLRVlfUkVETyk7CQlicmVhazsKKwkJCQljYXNlIDB4Mjg5OiBtYXBfa2V5X2NsZWFyKEtFWV9SRVBMWSk7CQlicmVhazsKKwkJCQljYXNlIDB4MjhiOiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJETUFJTCk7CWJyZWFrOworCQkJCWNhc2UgMHgyOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1NFTkQpOwkJYnJlYWs7CisKKwkJCQkvKiBSZXBvcnRlZCBvbiBhIENoZXJyeSBDeW1vdGlvbiBrZXlib2FyZCAqLworCQkJCWNhc2UgMHgzMDE6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cxKTsJCWJyZWFrOworCQkJCWNhc2UgMHgzMDI6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJCWJyZWFrOworCQkJCWNhc2UgMHgzMDM6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0czKTsJCWJyZWFrOworCisJCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEhJRF9VUF9IUFZFTkRPUjoJLyogUmVwb3J0ZWQgb24gYSBEdXRjaCBsYXlvdXQgSFA1MzA4ICovCisKKwkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJCQkgICAgICAgIGNhc2UgMHgwMjE6IG1hcF9rZXlfY2xlYXIoS0VZX1BSSU5UKTsgICAgICAgICAgIGJyZWFrOworCQkJCWNhc2UgMHgwNzA6IG1hcF9rZXlfY2xlYXIoS0VZX0hQKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwNzE6IG1hcF9rZXlfY2xlYXIoS0VZX0NBTUVSQSk7CQlicmVhazsKKwkJCQljYXNlIDB4MDcyOiBtYXBfa2V5X2NsZWFyKEtFWV9TT1VORCk7CQlicmVhazsKKwkJCQljYXNlIDB4MDczOiBtYXBfa2V5X2NsZWFyKEtFWV9RVUVTVElPTik7CWJyZWFrOworCQkJCWNhc2UgMHgwODA6IG1hcF9rZXlfY2xlYXIoS0VZX0VNQUlMKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwODE6IG1hcF9rZXlfY2xlYXIoS0VZX0NIQVQpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA4MjogbWFwX2tleV9jbGVhcihLRVlfU0VBUkNIKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwODM6IG1hcF9rZXlfY2xlYXIoS0VZX0NPTk5FQ1QpOwkgICAgICAgIGJyZWFrOworCQkJCWNhc2UgMHgwODQ6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTkFOQ0UpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA4NTogbWFwX2tleV9jbGVhcihLRVlfU1BPUlQpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA4NjogbWFwX2tleV9jbGVhcihLRVlfU0hPUCk7CSAgICAgICAgYnJlYWs7CisJCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEhJRF9VUF9NU1ZFTkRPUjoKKwkJCWdvdG8gaWdub3JlOworCisJCWNhc2UgSElEX1VQX0NVU1RPTTogLyogUmVwb3J0ZWQgb24gTG9naXRlY2ggYW5kIFBvd2VyYm9vayBVU0Iga2V5Ym9hcmRzICovCisKKwkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJCQljYXNlIDB4MDAzOgorCQkJCQkvKiBUaGUgZm4ga2V5IG9uIEFwcGxlIFBvd2VyQm9va3MgKi8KKwkJCQkJbWFwX2tleV9jbGVhcihLRVlfRk4pOworCQkJCQloaWRpbnB1dF9wYl9zZXR1cChpbnB1dCk7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEhJRF9VUF9MT0dJVkVORE9SOiAvKiBSZXBvcnRlZCBvbiBMb2dpdGVjaCBVbHRyYSBYIE1lZGlhIFJlbW90ZSAqLworCisJCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKwkJCXN3aXRjaCh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisJCQkJY2FzZSAweDAwNDogbWFwX2tleV9jbGVhcihLRVlfQUdBSU4pOwkJYnJlYWs7CisJCQkJY2FzZSAweDAwZDogbWFwX2tleV9jbGVhcihLRVlfSE9NRSk7CQlicmVhazsKKwkJCQljYXNlIDB4MDI0OiBtYXBfa2V5X2NsZWFyKEtFWV9TSFVGRkxFKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwMjU6IG1hcF9rZXlfY2xlYXIoS0VZX1RWKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwMjY6IG1hcF9rZXlfY2xlYXIoS0VZX01FTlUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDAzMTogbWFwX2tleV9jbGVhcihLRVlfQVVESU8pOwkJYnJlYWs7CisJCQkJY2FzZSAweDAzMjogbWFwX2tleV9jbGVhcihLRVlfVEVYVCk7CQlicmVhazsKKwkJCQljYXNlIDB4MDMzOiBtYXBfa2V5X2NsZWFyKEtFWV9MQVNUKTsJCWJyZWFrOworCQkJCWNhc2UgMHgwNDc6IG1hcF9rZXlfY2xlYXIoS0VZX01QMyk7CQlicmVhazsKKwkJCQljYXNlIDB4MDQ4OiBtYXBfa2V5X2NsZWFyKEtFWV9EVkQpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0OTogbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0YTogbWFwX2tleV9jbGVhcihLRVlfVklERU8pOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0YjogbWFwX2tleV9jbGVhcihLRVlfQU5HTEUpOwkJYnJlYWs7CisJCQkJY2FzZSAweDA0YzogbWFwX2tleV9jbGVhcihLRVlfTEFOR1VBR0UpOwlicmVhazsKKwkJCQljYXNlIDB4MDRkOiBtYXBfa2V5X2NsZWFyKEtFWV9TVUJUSVRMRSk7CWJyZWFrOworCQkJCWNhc2UgMHgwNTE6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRCk7CQlicmVhazsKKwkJCQljYXNlIDB4MDUyOiBtYXBfa2V5X2NsZWFyKEtFWV9DTE9TRSk7CQlicmVhazsKKwkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSElEX1VQX1BJRDoKKworCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJCQljYXNlIDB4YTQ6IG1hcF9rZXlfY2xlYXIoQlROX0RFQUQpOwlicmVhazsKKwkJCQlkZWZhdWx0OiBnb3RvIGlnbm9yZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCXVua25vd246CisJCQlpZiAoZmllbGQtPnJlcG9ydF9zaXplID09IDEpIHsKKwkJCQlpZiAoZmllbGQtPnJlcG9ydC0+dHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkgeworCQkJCQltYXBfbGVkKExFRF9NSVNDKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1hcF9rZXkoQlROX01JU0MpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUpIHsKKwkJCQltYXBfcmVsKFJFTF9NSVNDKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1hcF9hYnMoQUJTX01JU0MpOworCQkJYnJlYWs7CisJfQorCisJaWYgKGRldmljZS0+cXVpcmtzICYgSElEX1FVSVJLX01JR0hUWU1PVVNFKSB7CisJCWlmICh1c2FnZS0+aGlkID09IEhJRF9HRF9aKQorCQkJbWFwX3JlbChSRUxfSFdIRUVMKTsKKwkJZWxzZSBpZiAodXNhZ2UtPmNvZGUgPT0gQlROXzEpCisJCQltYXBfa2V5KEJUTl8yKTsKKwkJZWxzZSBpZiAodXNhZ2UtPmNvZGUgPT0gQlROXzIpCisJCQltYXBfa2V5KEJUTl8xKTsKKwl9CisKKwlpZiAoKGRldmljZS0+cXVpcmtzICYgKEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183IHwgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzUpKSAmJgorCQkgKHVzYWdlLT50eXBlID09IEVWX1JFTCkgJiYgKHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkpCisJCQlzZXRfYml0KFJFTF9IV0hFRUwsIGJpdCk7CisKKwlpZiAoKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA1KSkKKwkJfHwgKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA3KSkpCisJCWdvdG8gaWdub3JlOworCisJaWYgKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS19CQURfUkVMQVRJVkVfS0VZUykgJiYKKwkJdXNhZ2UtPnR5cGUgPT0gRVZfS0VZICYmIChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKSkKKwkJZmllbGQtPmZsYWdzICY9IH5ISURfTUFJTl9JVEVNX1JFTEFUSVZFOworCisJc2V0X2JpdCh1c2FnZS0+dHlwZSwgaW5wdXQtPmV2Yml0KTsKKworCXdoaWxlICh1c2FnZS0+Y29kZSA8PSBtYXggJiYgdGVzdF9hbmRfc2V0X2JpdCh1c2FnZS0+Y29kZSwgYml0KSkKKwkJdXNhZ2UtPmNvZGUgPSBmaW5kX25leHRfemVyb19iaXQoYml0LCBtYXggKyAxLCB1c2FnZS0+Y29kZSk7CisKKwlpZiAodXNhZ2UtPmNvZGUgPiBtYXgpCisJCWdvdG8gaWdub3JlOworCisKKwlpZiAodXNhZ2UtPnR5cGUgPT0gRVZfQUJTKSB7CisKKwkJaW50IGEgPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtOworCQlpbnQgYiA9IGZpZWxkLT5sb2dpY2FsX21heGltdW07CisKKwkJaWYgKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS19CQURQQUQpICYmICh1c2FnZS0+Y29kZSA9PSBBQlNfWCB8fCB1c2FnZS0+Y29kZSA9PSBBQlNfWSkpIHsKKwkJCWEgPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtID0gMDsKKwkJCWIgPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtID0gMjU1OworCQl9CisKKwkJaWYgKGZpZWxkLT5hcHBsaWNhdGlvbiA9PSBISURfR0RfR0FNRVBBRCB8fCBmaWVsZC0+YXBwbGljYXRpb24gPT0gSElEX0dEX0pPWVNUSUNLKQorCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIHVzYWdlLT5jb2RlLCBhLCBiLCAoYiAtIGEpID4+IDgsIChiIC0gYSkgPj4gNCk7CisJCWVsc2UJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIHVzYWdlLT5jb2RlLCBhLCBiLCAwLCAwKTsKKworCX0KKworCWlmICh1c2FnZS0+dHlwZSA9PSBFVl9BQlMgJiYKKwkgICAgKHVzYWdlLT5oYXRfbWluIDwgdXNhZ2UtPmhhdF9tYXggfHwgdXNhZ2UtPmhhdF9kaXIpKSB7CisJCWludCBpOworCQlmb3IgKGkgPSB1c2FnZS0+Y29kZTsgaSA8IHVzYWdlLT5jb2RlICsgMiAmJiBpIDw9IG1heDsgaSsrKSB7CisJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgaSwgLTEsIDEsIDAsIDApOworCQkJc2V0X2JpdChpLCBpbnB1dC0+YWJzYml0KTsKKwkJfQorCQlpZiAodXNhZ2UtPmhhdF9kaXIgJiYgIWZpZWxkLT5kcGFkKQorCQkJZmllbGQtPmRwYWQgPSB1c2FnZS0+Y29kZTsKKwl9CisKKyNpZmRlZiBERUJVRworCXJlc29sdl9ldmVudCh1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUpOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCXJldHVybjsKKworaWdub3JlOgorI2lmZGVmIERFQlVHCisJcHJpbnRrKCJJR05PUkVEXG4iKTsKKyNlbmRpZgorCXJldHVybjsKK30KKwordm9pZCBoaWRpbnB1dF9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwlpbnQgKnF1aXJrcyA9ICZoaWQtPnF1aXJrczsKKworCWlmICghZmllbGQtPmhpZGlucHV0KQorCQlyZXR1cm47CisKKwlpbnB1dCA9IGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQ7CisKKwlpZiAoIXVzYWdlLT50eXBlKQorCQlyZXR1cm47CisKKwlpZiAoKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA1KSkKKwkJfHwgKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA3KSkpIHsKKwkJaWYgKHZhbHVlKSBoaWQtPnF1aXJrcyB8PSAgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX09OOworCQllbHNlICAgICAgIGhpZC0+cXVpcmtzICY9IH5ISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT047CisJCXJldHVybjsKKwl9CisKKwlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0lOVkVSVF9IV0hFRUwpICYmICh1c2FnZS0+Y29kZSA9PSBSRUxfSFdIRUVMKSkgeworCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCAtdmFsdWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS19PTikgJiYgKHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkpIHsKKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCBSRUxfSFdIRUVMLCB2YWx1ZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4pICYmIGhpZGlucHV0X3BiX2V2ZW50KGhpZCwgaW5wdXQsIHVzYWdlLCB2YWx1ZSkpCisJCXJldHVybjsKKworCWlmICh1c2FnZS0+aGF0X21pbiA8IHVzYWdlLT5oYXRfbWF4IHx8IHVzYWdlLT5oYXRfZGlyKSB7CisJCWludCBoYXRfZGlyID0gdXNhZ2UtPmhhdF9kaXI7CisJCWlmICghaGF0X2RpcikKKwkJCWhhdF9kaXIgPSAodmFsdWUgLSB1c2FnZS0+aGF0X21pbikgKiA4IC8gKHVzYWdlLT5oYXRfbWF4IC0gdXNhZ2UtPmhhdF9taW4gKyAxKSArIDE7CisJCWlmIChoYXRfZGlyIDwgMCB8fCBoYXRfZGlyID4gOCkgaGF0X2RpciA9IDA7CisJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUgICAgLCBoaWRfaGF0X3RvX2F4aXNbaGF0X2Rpcl0ueCk7CisgICAgICAgICAgICAgICAgaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSArIDEsIGhpZF9oYXRfdG9fYXhpc1toYXRfZGlyXS55KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCWlmICh1c2FnZS0+aGlkID09IChISURfVVBfRElHSVRJWkVSIHwgMHgwMDNjKSkgeyAvKiBJbnZlcnQgKi8KKwkJKnF1aXJrcyA9IHZhbHVlID8gKCpxdWlya3MgfCBISURfUVVJUktfSU5WRVJUKSA6ICgqcXVpcmtzICYgfkhJRF9RVUlSS19JTlZFUlQpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVzYWdlLT5oaWQgPT0gKEhJRF9VUF9ESUdJVElaRVIgfCAweDAwMzIpKSB7IC8qIEluUmFuZ2UgKi8KKwkJaWYgKHZhbHVlKSB7CisJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsICgqcXVpcmtzICYgSElEX1FVSVJLX0lOVkVSVCkgPyBCVE5fVE9PTF9SVUJCRVIgOiB1c2FnZS0+Y29kZSwgMSk7CisJCQlyZXR1cm47CisJCX0KKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgMCk7CisJCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgQlROX1RPT0xfUlVCQkVSLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1c2FnZS0+aGlkID09IChISURfVVBfRElHSVRJWkVSIHwgMHgwMDMwKSAmJiAoKnF1aXJrcyAmIEhJRF9RVUlSS19OT1RPVUNIKSkgeyAvKiBQcmVzc3VyZSAqLworCQlpbnQgYSA9IGZpZWxkLT5sb2dpY2FsX21pbmltdW07CisJCWludCBiID0gZmllbGQtPmxvZ2ljYWxfbWF4aW11bTsKKwkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX0tFWSwgQlROX1RPVUNILCB2YWx1ZSA+IGEgKyAoKGIgLSBhKSA+PiAzKSk7CisJfQorCisJaWYgKHVzYWdlLT5oaWQgPT0gKEhJRF9VUF9QSUQgfCAweDgzVUwpKSB7IC8qIFNpbXVsdGFuZW91cyBFZmZlY3RzIE1heCAqLworCQlkYmcoIk1heGltdW0gRWZmZWN0cyAtICVkIix2YWx1ZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodXNhZ2UtPmhpZCA9PSAoSElEX1VQX1BJRCB8IDB4N2ZVTCkpIHsKKwkJZGJnKCJQSUQgUG9vbCBSZXBvcnRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCh1c2FnZS0+dHlwZSA9PSBFVl9LRVkpICYmICh1c2FnZS0+Y29kZSA9PSAwKSkgLyogS2V5IDAgaXMgInVuYXNzaWduZWQiLCBub3QgS0VZX1VOS05PV04gKi8KKwkJcmV0dXJuOworCisJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgdmFsdWUpOworCisJaWYgKChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKSAmJiAodXNhZ2UtPnR5cGUgPT0gRVZfS0VZKSkKKwkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgMCk7Cit9CisKK3ZvaWQgaGlkaW5wdXRfcmVwb3J0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpCit7CisJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhpZGlucHV0LCAmaGlkLT5pbnB1dHMsIGxpc3QpCisJCWlucHV0X3N5bmMoaGlkaW5wdXQtPmlucHV0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGhpZGlucHV0X3JlcG9ydF9ldmVudCk7CisKK2ludCBoaWRpbnB1dF9maW5kX2ZpZWxkKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgc3RydWN0IGhpZF9maWVsZCAqKmZpZWxkKQoreworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJaW50IGksIGo7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0LCBsaXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCByZXBvcnQtPm1heGZpZWxkOyBpKyspIHsKKwkJCSpmaWVsZCA9IHJlcG9ydC0+ZmllbGRbaV07CisJCQlmb3IgKGogPSAwOyBqIDwgKCpmaWVsZCktPm1heHVzYWdlOyBqKyspCisJCQkJaWYgKCgqZmllbGQpLT51c2FnZVtqXS50eXBlID09IHR5cGUgJiYgKCpmaWVsZCktPnVzYWdlW2pdLmNvZGUgPT0gY29kZSkKKwkJCQkJcmV0dXJuIGo7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkaW5wdXRfZmluZF9maWVsZCk7CisKKy8qCisgKiBSZWdpc3RlciB0aGUgaW5wdXQgZGV2aWNlOyBwcmludCBhIG1lc3NhZ2UuCisgKiBDb25maWd1cmUgdGhlIGlucHV0IGxheWVyIGludGVyZmFjZQorICogUmVhZCBhbGwgcmVwb3J0cyBhbmQgaW5pdGlhbGl6ZSB0aGUgYWJzb2x1dGUgZmllbGQgdmFsdWVzLgorICovCisKK2ludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IE5VTEw7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBpLCBqLCBrOworCisJSU5JVF9MSVNUX0hFQUQoJmhpZC0+aW5wdXRzKTsKKworCWZvciAoaSA9IDA7IGkgPCBoaWQtPm1heGNvbGxlY3Rpb247IGkrKykKKwkJaWYgKGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09IEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OIHx8CisJCSAgICBoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PSBISURfQ09MTEVDVElPTl9QSFlTSUNBTCkKKwkJCWlmIChJU19JTlBVVF9BUFBMSUNBVElPTihoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UpKQorCQkJCWJyZWFrOworCisJaWYgKGkgPT0gaGlkLT5tYXhjb2xsZWN0aW9uKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGsgPSBISURfSU5QVVRfUkVQT1JUOyBrIDw9IEhJRF9PVVRQVVRfUkVQT1JUOyBrKyspCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVtrXS5yZXBvcnRfbGlzdCwgbGlzdCkgeworCisJCQlpZiAoIXJlcG9ydC0+bWF4ZmllbGQpCisJCQkJY29udGludWU7CisKKwkJCWlmICghaGlkaW5wdXQpIHsKKwkJCQloaWRpbnB1dCA9IGt6YWxsb2Moc2l6ZW9mKCpoaWRpbnB1dCksIEdGUF9LRVJORUwpOworCQkJCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCQkJCWlmICghaGlkaW5wdXQgfHwgIWlucHV0X2RldikgeworCQkJCQlrZnJlZShoaWRpbnB1dCk7CisJCQkJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJCQkJCWVycigiT3V0IG9mIG1lbW9yeSBkdXJpbmcgaGlkIGlucHV0IHByb2JlIik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCQlpbnB1dF9kZXYtPnByaXZhdGUgPSBoaWQ7CisJCQkJaW5wdXRfZGV2LT5ldmVudCA9IGhpZC0+aGlkaW5wdXRfaW5wdXRfZXZlbnQ7CisJCQkJaW5wdXRfZGV2LT5vcGVuID0gaGlkLT5oaWRpbnB1dF9vcGVuOworCQkJCWlucHV0X2Rldi0+Y2xvc2UgPSBoaWQtPmhpZGlucHV0X2Nsb3NlOworCisJCQkJaW5wdXRfZGV2LT5uYW1lID0gaGlkLT5uYW1lOworCQkJCWlucHV0X2Rldi0+cGh5cyA9IGhpZC0+cGh5czsKKwkJCQlpbnB1dF9kZXYtPnVuaXEgPSBoaWQtPnVuaXE7CisJCQkJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gaGlkLT5idXM7CisJCQkJaW5wdXRfZGV2LT5pZC52ZW5kb3IgID0gaGlkLT52ZW5kb3I7CisJCQkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gaGlkLT5wcm9kdWN0OworCQkJCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IGhpZC0+dmVyc2lvbjsKKwkJCQlpbnB1dF9kZXYtPmNkZXYuZGV2ID0gaGlkLT5kZXY7CisJCQkJaGlkaW5wdXQtPmlucHV0ID0gaW5wdXRfZGV2OworCQkJCWxpc3RfYWRkX3RhaWwoJmhpZGlucHV0LT5saXN0LCAmaGlkLT5pbnB1dHMpOworCQkJfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgcmVwb3J0LT5tYXhmaWVsZDsgaSsrKQorCQkJCWZvciAoaiA9IDA7IGogPCByZXBvcnQtPmZpZWxkW2ldLT5tYXh1c2FnZTsgaisrKQorCQkJCQloaWRpbnB1dF9jb25maWd1cmVfdXNhZ2UoaGlkaW5wdXQsIHJlcG9ydC0+ZmllbGRbaV0sCisJCQkJCQkJCSByZXBvcnQtPmZpZWxkW2ldLT51c2FnZSArIGopOworCisJCQlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfTVVMVElfSU5QVVQpIHsKKwkJCQkvKiBUaGlzIHdpbGwgbGVhdmUgaGlkaW5wdXQgTlVMTCwgc28gdGhhdCBpdAorCQkJCSAqIGFsbG9jYXRlcyBhbm90aGVyIG9uZSBpZiB3ZSBoYXZlIG1vcmUgaW5wdXRzIG9uCisJCQkJICogdGhlIHNhbWUgaW50ZXJmYWNlLiBTb21lIGRldmljZXMgKGUuZy4gSGFwcCdzCisJCQkJICogVUdDSSkgY3JhbSBhIGxvdCBvZiB1bnJlbGF0ZWQgaW5wdXRzIGludG8gdGhlCisJCQkJICogc2FtZSBpbnRlcmZhY2UuICovCisJCQkJaGlkaW5wdXQtPnJlcG9ydCA9IHJlcG9ydDsKKwkJCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaGlkaW5wdXQtPmlucHV0KTsKKwkJCQloaWRpbnB1dCA9IE5VTEw7CisJCQl9CisJCX0KKworCWlmIChoaWRpbnB1dCkKKwkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGhpZGlucHV0LT5pbnB1dCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGhpZGlucHV0X2Nvbm5lY3QpOworCit2b2lkIGhpZGlucHV0X2Rpc2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGlkaW5wdXQsIG5leHQsICZoaWQtPmlucHV0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmaGlkaW5wdXQtPmxpc3QpOworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShoaWRpbnB1dC0+aW5wdXQpOworCQlrZnJlZShoaWRpbnB1dCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkaW5wdXRfZGlzY29ubmVjdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCA5Yjg4YjI1Li44OTFlZjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC05NSwxNSArOTUsNDIgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGFkbTkyNDAuCiAKIGNvbmZpZyBTRU5TT1JTX0s4VEVNUAotCXRyaXN0YXRlICJBTUQgSzggcHJvY2Vzc29yIHNlbnNvciIKKwl0cmlzdGF0ZSAiQU1EIEF0aGxvbjY0L0ZYIG9yIE9wdGVyb24gdGVtcGVyYXR1cmUgc2Vuc29yIgogCWRlcGVuZHMgb24gSFdNT04gJiYgWDg2ICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIHRlbXBlcmF0dXJlCi0JICBzZW5zb3IocykgaW5zaWRlIHlvdXIgQU1EIEs4IENQVS4KKwkgIHNlbnNvcihzKSBpbnNpZGUgeW91ciBDUFUuIFN1cHBvcnRlZCBpcyB3aG9sZSBBTUQgSzgKKwkgIG1pY3JvYXJjaGl0ZWN0dXJlLiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSB3aWxsIG5lZWQgYXQgbGVhc3QKKwkgIGxtLXNlbnNvcnMgMi4xMC4xIGZvciBwcm9wZXIgdXNlcnNwYWNlIHN1cHBvcnQuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGs4dGVtcC4KIAorY29uZmlnIFNFTlNPUlNfQU1TCisJdHJpc3RhdGUgIkFwcGxlIE1vdGlvbiBTZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSFdNT04gJiYgUFBDX1BNQUMgJiYgIVBQQzY0ICYmIElOUFVUICYmICgoQURCX1BNVSAmJiBJMkMgPSB5KSB8fCAoQURCX1BNVSAmJiAhSTJDKSB8fCBJMkMpICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBtb3Rpb24gc2Vuc29yIGluY2x1ZGVkIGluIFBvd2VyQm9va3MuIEluY2x1ZGVzCisJICBpbXBsZW1lbnRhdGlvbnMgZm9yIFBNVSBhbmQgSTJDLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFtcy4KKworY29uZmlnIFNFTlNPUlNfQU1TX1BNVQorCWJvb2wgIlBNVSB2YXJpYW50IgorCWRlcGVuZHMgb24gU0VOU09SU19BTVMgJiYgQURCX1BNVQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFBNVSB2YXJpYW50IG9mIG1vdGlvbiBzZW5zb3IsIGZvdW5kIGluIGxhdGUgMjAwNSBQb3dlckJvb2tzLgorCitjb25maWcgU0VOU09SU19BTVNfSTJDCisJYm9vbCAiSTJDIHZhcmlhbnQiCisJZGVwZW5kcyBvbiBTRU5TT1JTX0FNUyAmJiBJMkMKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJMkMgdmFyaWFudCBvZiBtb3Rpb24gc2Vuc29yLCBmb3VuZCBpbiBlYXJseSAyMDA1IFBvd2VyQm9va3MgYW5kCisJICBpQm9va3MuCisKIGNvbmZpZyBTRU5TT1JTX0FTQjEwMAogCXRyaXN0YXRlICJBc3VzIEFTQjEwMCBCYWNoIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTApAQCAtMTQwLDExICsxNjcsMTIgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGRzMTYyMS4KIAogY29uZmlnIFNFTlNPUlNfRjcxODA1RgotCXRyaXN0YXRlICJGaW50ZWsgRjcxODA1Ri9GRyIKKwl0cmlzdGF0ZSAiRmludGVrIEY3MTgwNUYvRkcgYW5kIEY3MTg3MkYvRkciCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwotCSAgZmVhdHVyZXMgb2YgdGhlIEZpbnRlayBGNzE4MDVGL0ZHIGNoaXBzLgorCSAgZmVhdHVyZXMgb2YgdGhlIEZpbnRlayBGNzE4MDVGL0ZHIGFuZCBGNzE4NzJGL0ZHIFN1cGVyLUkvTworCSAgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGY3MTgwNWYuCkBAIC0zNTEsNiArMzc5LDE5IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBwYzg3MzYwLgogCitjb25maWcgU0VOU09SU19QQzg3NDI3CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzQyNyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKKwkgIGZ1bmN0aW9ucyBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3NDI3IFN1cGVyLUkvTyBjaGlwLgorCSAgVGhlIGNoaXAgaGFzIHR3byBkaXN0aW5jdCBsb2dpY2FsIGRldmljZXMsIG9uZSBmb3IgZmFuIHNwZWVkCisJICBtb25pdG9yaW5nIGFuZCBjb250cm9sLCBhbmQgb25lIGZvciB2b2x0YWdlIGFuZCB0ZW1wZXJhdHVyZQorCSAgbW9uaXRvcmluZy4gT25seSBmYW4gc3BlZWQgbW9uaXRvcmluZyBpcyBzdXBwb3J0ZWQgcmlnaHQgbm93LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBwYzg3NDI3LgorCiBjb25maWcgU0VOU09SU19TSVM1NTk1CiAJdHJpc3RhdGUgIlNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAuIFNpUzU1OTUiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgUENJICYmIEVYUEVSSU1FTlRBTApAQCAtMzY5LDggKzQxMCw4IEBACiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgogCSAgbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlIFNNU0MgTFBDNDdCMjd4LAotCSAgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4LCBMUEM0N00xOTIgYW5kCi0JICBMUEM0N005OTcgY2hpcHMuCisJICBMUEM0N00xMHgsIExQQzQ3TTExMiwgTFBDNDdNMTN4LCBMUEM0N00xNHgsIExQQzQ3TTE1eCwKKwkgIExQQzQ3TTE5MiBhbmQgTFBDNDdNOTk3IGNoaXBzLgogCiAJICBUaGUgdGVtcGVyYXR1cmUgYW5kIHZvbHRhZ2Ugc2Vuc29yIGZlYXR1cmVzIG9mIHRoZSBMUEM0N00xOTIKIAkgIGFuZCBMUEM0N005OTcgYXJlIHN1cHBvcnRlZCBieSBhbm90aGVyIGRyaXZlciwgc2VsZWN0IGFsc28KQEAgLTQ3Miw2ICs1MTMsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHc4Mzc5MmQuCiAKK2NvbmZpZyBTRU5TT1JTX1c4Mzc5MworCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc5MyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzNzkzCisJICBoYXJkd2FyZSBtb25pdG9yaW5nIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHc4Mzc5My4KKwogY29uZmlnIFNFTlNPUlNfVzgzTDc4NVRTCiAJdHJpc3RhdGUgIldpbmJvbmQgVzgzTDc4NVRTLVMiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCkBAIC01MjUsNiArNTc2LDkgQEAKIAkgIFRoaXMgZHJpdmVyIGFsc28gcHJvdmlkZXMgYW4gYWJzb2x1dGUgaW5wdXQgY2xhc3MgZGV2aWNlLCBhbGxvd2luZwogCSAgdGhlIGxhcHRvcCB0byBhY3QgYXMgYSBwaW5iYWxsIG1hY2hpbmUtZXNxdWUgam95c3RpY2suCiAKKwkgIElmIHlvdXIgVGhpbmtQYWQgaXMgbm90IHJlY29nbml6ZWQgYnkgdGhlIGRyaXZlciwgcGxlYXNlIHVwZGF0ZSB0byBsYXRlc3QKKwkgIEJJT1MuIFRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZSBmb3Igc29tZSBSNTIgVGhpbmtQYWRzLgorCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIGFwcGxpY2FibGUgbGFwdG9wIGFuZCB3YW50IHRvIGV4cGVyaWVuY2UKIAkgIHRoZSBhd2Vzb21lIHBvd2VyIG9mIGhkYXBzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQppbmRleCBhZjAxY2M2Li4zMTY2MTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTksNiArOSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19BU0IxMDApCSs9IGFzYjEwMC5vCiBvYmotJChDT05GSUdfU0VOU09SU19XODM2MjdIRikJKz0gdzgzNjI3aGYubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNzkyRCkJKz0gdzgzNzkyZC5vCitvYmotJChDT05GSUdfU0VOU09SU19XODM3OTMpCSs9IHc4Mzc5My5vCiBvYmotJChDT05GSUdfU0VOU09SU19XODM3ODFEKQkrPSB3ODM3ODFkLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1c4Mzc5MUQpCSs9IHc4Mzc5MWQubwogCkBAIC0xOCw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDI2KQkrPSBhZG0xMDI2Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMzEpCSs9IGFkbTEwMzEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNOTI0MCkJKz0gYWRtOTI0MC5vCitvYmotJChDT05GSUdfU0VOU09SU19BTVMpCSs9IGFtcy8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FUWFAxKQkrPSBhdHhwMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19EUzE2MjEpCSs9IGRzMTYyMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19GNzE4MDVGKQkrPSBmNzE4MDVmLm8KQEAgLTQxLDYgKzQzLDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTIpCSs9IGxtOTIubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQzg3MzYwKQkrPSBwYzg3MzYwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1BDODc0MjcpCSs9IHBjODc0Mjcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfU0lTNTU5NSkJKz0gc2lzNTU5NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3KSs9IHNtc2M0N2IzOTcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEpCSs9IHNtc2M0N20xLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMgYi9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydS5jCmluZGV4IGU1Y2IwZmQuLmIxZGM2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMKKysrIGIvZHJpdmVycy9od21vbi9hYml0dWd1cnUuYwpAQCAtMjEsNiArMjEsNyBAQAogICAgIGV0YyB2b2x0YWdlICYgZnJlcXVlbmN5IGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZCEKICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWRtOTI0MC5jIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKaW5kZXggMzc3OTYxYy4uYWFkNTk0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZG05MjQwLmMKKysrIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKQEAgLTUsNyArNSw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkJRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgogICoJCQlQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMJTWljaGllbCBSb29rIDxtaWNoaWVsQGdyZW5kZWxwcm9qZWN0Lm5sPgotICogQ29weXJpZ2h0IChDKSAyMDA1CUdyYW50IENvYWR5IDxnY29hZHlAZ21haWwuY29tPiB3aXRoIHZhbHVhYmxlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUJR3JhbnQgQ29hZHkgPGdjb2FkeS5sa0BnbWFpbC5jb20+IHdpdGggdmFsdWFibGUKICAqIAkJCQlndWlkYW5jZSBmcm9tIEplYW4gRGVsdmFyZQogICoKICAqIERyaXZlciBzdXBwb3J0cwlBbmFsb2cgRGV2aWNlcwkJQURNOTI0MApAQCAtNzc0LDcgKzc3NCw3IEBACiB9CiAKIE1PRFVMRV9BVVRIT1IoIk1pY2hpZWwgUm9vayA8bWljaGllbEBncmVuZGVscHJvamVjdC5ubD4sICIKLQkJIkdyYW50IENvYWR5IDxnY29hZHlAZ21haWwuY29tPiBhbmQgb3RoZXJzIik7CisJCSJHcmFudCBDb2FkeSA8Z2NvYWR5LmxrQGdtYWlsLmNvbT4gYW5kIG90aGVycyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBRE05MjQwL0RTMTc4MC9MTTgxIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Ftcy9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vYW1zL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzk1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2Ftcy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEFwcGxlIE1vdGlvbiBTZW5zb3IgZHJpdmVyCisjCisKK2Ftcy15CQkJCQk6PSBhbXMtY29yZS5vIGFtcy1pbnB1dC5vCithbXMtJChDT05GSUdfU0VOU09SU19BTVNfUE1VKQkJKz0gYW1zLXBtdS5vCithbXMtJChDT05GSUdfU0VOU09SU19BTVNfSTJDKQkJKz0gYW1zLWkyYy5vCitvYmotJChDT05GSUdfU0VOU09SU19BTVMpCQkrPSBhbXMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hbXMvYW1zLWNvcmUuYyBiL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmMGY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1jb3JlLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBBcHBsZSBNb3Rpb24gU2Vuc29yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBTdGVsaWFuIFBvcCAoc3RlbGlhbkBwb3BpZXMubmV0KQorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgSGFuc2VsbWFubiAobGludXgta2VybmVsQGhhbnNtaS5jaCkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX3BmdW5jLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlICJhbXMuaCIKKworLyogVGhlcmUgaXMgb25seSBvbmUgbW90aW9uIHNlbnNvciBwZXIgbWFjaGluZSAqLworc3RydWN0IGFtcyBhbXNfaW5mbzsKKworc3RhdGljIHVuc2lnbmVkIGludCB2ZXJib3NlOworbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLCAiU2hvdyBmcmVlIGZhbGxzIGFuZCBzaG9ja3MgaW4ga2VybmVsIG91dHB1dCIpOworCisvKiBDYWxsIHdpdGggYW1zX2luZm8ubG9jayBoZWxkISAqLwordm9pZCBhbXNfc2Vuc29ycyhzOCAqeCwgczggKnksIHM4ICp6KQoreworCXUzMiBvcmllbnQgPSBhbXNfaW5mby52ZmxhZz8gYW1zX2luZm8ub3JpZW50MSA6IGFtc19pbmZvLm9yaWVudDI7CisKKwlpZiAob3JpZW50ICYgMHg4MCkKKwkJLyogWCBhbmQgWSBzd2FwcGVkICovCisJCWFtc19pbmZvLmdldF94eXooeSwgeCwgeik7CisJZWxzZQorCQlhbXNfaW5mby5nZXRfeHl6KHgsIHksIHopOworCisJaWYgKG9yaWVudCAmIDB4MDQpCisJCSp6ID0gfigqeik7CisJaWYgKG9yaWVudCAmIDB4MDIpCisJCSp5ID0gfigqeSk7CisJaWYgKG9yaWVudCAmIDB4MDEpCisJCSp4ID0gfigqeCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFtc19zaG93X2N1cnJlbnQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJczggeCwgeSwgejsKKworCW11dGV4X2xvY2soJmFtc19pbmZvLmxvY2spOworCWFtc19zZW5zb3JzKCZ4LCAmeSwgJnopOworCW11dGV4X3VubG9jaygmYW1zX2luZm8ubG9jayk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZCAlZCAlZFxuIiwgeCwgeSwgeik7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjdXJyZW50LCBTX0lSVUdPLCBhbXNfc2hvd19jdXJyZW50LCBOVUxMKTsKKworc3RhdGljIHZvaWQgYW1zX2hhbmRsZV9pcnEodm9pZCAqZGF0YSkKK3sKKwllbnVtIGFtc19pcnEgaXJxID0gKigoZW51bSBhbXNfaXJxICopZGF0YSk7CisKKwlzcGluX2xvY2soJmFtc19pbmZvLmlycV9sb2NrKTsKKworCWFtc19pbmZvLndvcmtlcl9pcnFzIHw9IGlycTsKKwlzY2hlZHVsZV93b3JrKCZhbXNfaW5mby53b3JrZXIpOworCisJc3Bpbl91bmxvY2soJmFtc19pbmZvLmlycV9sb2NrKTsKK30KKworc3RhdGljIGVudW0gYW1zX2lycSBhbXNfZnJlZWZhbGxfaXJxX2RhdGEgPSBBTVNfSVJRX0ZSRUVGQUxMOworc3RhdGljIHN0cnVjdCBwbWZfaXJxX2NsaWVudCBhbXNfZnJlZWZhbGxfY2xpZW50ID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5oYW5kbGVyID0gYW1zX2hhbmRsZV9pcnEsCisJLmRhdGEgPSAmYW1zX2ZyZWVmYWxsX2lycV9kYXRhLAorfTsKKworc3RhdGljIGVudW0gYW1zX2lycSBhbXNfc2hvY2tfaXJxX2RhdGEgPSBBTVNfSVJRX1NIT0NLOworc3RhdGljIHN0cnVjdCBwbWZfaXJxX2NsaWVudCBhbXNfc2hvY2tfY2xpZW50ID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5oYW5kbGVyID0gYW1zX2hhbmRsZV9pcnEsCisJLmRhdGEgPSAmYW1zX3Nob2NrX2lycV9kYXRhLAorfTsKKworLyogT25jZSBoYXJkIGRpc2sgcGFya2luZyBpcyBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLCB0aGlzIGZ1bmN0aW9uIGNhbgorICogdHJpZ2dlciBpdC4KKyAqLworc3RhdGljIHZvaWQgYW1zX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJbXV0ZXhfbG9jaygmYW1zX2luZm8ubG9jayk7CisKKwlpZiAoYW1zX2luZm8uaGFzX2RldmljZSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhbXNfaW5mby5pcnFfbG9jaywgZmxhZ3MpOworCisJCWlmIChhbXNfaW5mby53b3JrZXJfaXJxcyAmIEFNU19JUlFfRlJFRUZBTEwpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ayhLRVJOX0lORk8gImFtczogZnJlZWZhbGwgZGV0ZWN0ZWQhXG4iKTsKKworCQkJYW1zX2luZm8ud29ya2VyX2lycXMgJj0gfkFNU19JUlFfRlJFRUZBTEw7CisKKwkJCS8qIHdlIG11c3QgY2FsbCB0aGlzIHdpdGggaW50ZXJydXB0cyBlbmFibGVkICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbXNfaW5mby5pcnFfbG9jaywgZmxhZ3MpOworCQkJYW1zX2luZm8uY2xlYXJfaXJxKEFNU19JUlFfRlJFRUZBTEwpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFtc19pbmZvLmlycV9sb2NrLCBmbGFncyk7CisJCX0KKworCQlpZiAoYW1zX2luZm8ud29ya2VyX2lycXMgJiBBTVNfSVJRX1NIT0NLKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJhbXM6IHNob2NrIGRldGVjdGVkIVxuIik7CisKKwkJCWFtc19pbmZvLndvcmtlcl9pcnFzICY9IH5BTVNfSVJRX1NIT0NLOworCisJCQkvKiB3ZSBtdXN0IGNhbGwgdGhpcyB3aXRoIGludGVycnVwdHMgZW5hYmxlZCAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1zX2luZm8uaXJxX2xvY2ssIGZsYWdzKTsKKwkJCWFtc19pbmZvLmNsZWFyX2lycShBTVNfSVJRX1NIT0NLKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZhbXNfaW5mby5pcnFfbG9jaywgZmxhZ3MpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW1zX2luZm8uaXJxX2xvY2ssIGZsYWdzKTsKKwl9CisKKwltdXRleF91bmxvY2soJmFtc19pbmZvLmxvY2spOworfQorCisvKiBDYWxsIHdpdGggYW1zX2luZm8ubG9jayBoZWxkISAqLworaW50IGFtc19zZW5zb3JfYXR0YWNoKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwl1MzIgKnByb3A7CisKKwkvKiBHZXQgb3JpZW50YXRpb24gKi8KKwlwcm9wID0gKHUzMiopZ2V0X3Byb3BlcnR5KGFtc19pbmZvLm9mX25vZGUsICJvcmllbnRhdGlvbiIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYW1zX2luZm8ub3JpZW50MSA9ICpwcm9wOworCWFtc19pbmZvLm9yaWVudDIgPSAqKHByb3AgKyAxKTsKKworCS8qIFJlZ2lzdGVyIGZyZWVmYWxsIGludGVycnVwdCBoYW5kbGVyICovCisJcmVzdWx0ID0gcG1mX3JlZ2lzdGVyX2lycV9jbGllbnQoYW1zX2luZm8ub2Zfbm9kZSwKKwkJCSJhY2NlbC1pbnQtMSIsCisJCQkmYW1zX2ZyZWVmYWxsX2NsaWVudCk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogUmVzZXQgc2F2ZWQgaXJxcyAqLworCWFtc19pbmZvLndvcmtlcl9pcnFzID0gMDsKKworCS8qIFJlZ2lzdGVyIHNob2NrIGludGVycnVwdCBoYW5kbGVyICovCisJcmVzdWx0ID0gcG1mX3JlZ2lzdGVyX2lycV9jbGllbnQoYW1zX2luZm8ub2Zfbm9kZSwKKwkJCSJhY2NlbC1pbnQtMiIsCisJCQkmYW1zX3Nob2NrX2NsaWVudCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gcmVsZWFzZV9mcmVlZmFsbDsKKworCS8qIENyZWF0ZSBkZXZpY2UgKi8KKwlhbXNfaW5mby5vZl9kZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGFtc19pbmZvLm9mX25vZGUsICJhbXMiLCBOVUxMKTsKKwlpZiAoIWFtc19pbmZvLm9mX2RldikgeworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIHJlbGVhc2Vfc2hvY2s7CisJfQorCisJLyogQ3JlYXRlIGF0dHJpYnV0ZXMgKi8KKwlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmFtc19pbmZvLm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfY3VycmVudCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byByZWxlYXNlX29mOworCisJYW1zX2luZm8udmZsYWcgPSAhIShhbXNfaW5mby5nZXRfdmVuZG9yKCkgJiAweDEwKTsKKworCS8qIEluaXQgaW5wdXQgZGV2aWNlICovCisJcmVzdWx0ID0gYW1zX2lucHV0X2luaXQoKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIHJlbGVhc2VfZGV2aWNlX2ZpbGU7CisKKwlyZXR1cm4gcmVzdWx0OworcmVsZWFzZV9kZXZpY2VfZmlsZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmFtc19pbmZvLm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfY3VycmVudCk7CityZWxlYXNlX29mOgorCW9mX2RldmljZV91bnJlZ2lzdGVyKGFtc19pbmZvLm9mX2Rldik7CityZWxlYXNlX3Nob2NrOgorCXBtZl91bnJlZ2lzdGVyX2lycV9jbGllbnQoJmFtc19zaG9ja19jbGllbnQpOworcmVsZWFzZV9mcmVlZmFsbDoKKwlwbWZfdW5yZWdpc3Rlcl9pcnFfY2xpZW50KCZhbXNfZnJlZWZhbGxfY2xpZW50KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgX19pbml0IGFtc19pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCXNwaW5fbG9ja19pbml0KCZhbXNfaW5mby5pcnFfbG9jayk7CisJbXV0ZXhfaW5pdCgmYW1zX2luZm8ubG9jayk7CisJSU5JVF9XT1JLKCZhbXNfaW5mby53b3JrZXIsIGFtc193b3JrZXIpOworCisjaWZkZWYgQ09ORklHX1NFTlNPUlNfQU1TX0kyQworCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImFjY2VsZXJvbWV0ZXIiKTsKKwlpZiAobnAgJiYgZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJBQVBMLGFjY2VsZXJvbWV0ZXJfMSIpKQorCQkvKiBGb3VuZCBJMkMgbW90aW9uIHNlbnNvciAqLworCQlyZXR1cm4gYW1zX2kyY19pbml0KG5wKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NFTlNPUlNfQU1TX1BNVQorCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInNtcyIpOworCWlmIChucCAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInNtcyIpKQorCQkvKiBGb3VuZCBQTVUgbW90aW9uIHNlbnNvciAqLworCQlyZXR1cm4gYW1zX3BtdV9pbml0KG5wKTsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fRVJSICJhbXM6IE5vIG1vdGlvbiBzZW5zb3IgZm91bmQuXG4iKTsKKworCXJldHVybiAtRU5PREVWOworfQorCit2b2lkIGFtc19leGl0KHZvaWQpCit7CisJbXV0ZXhfbG9jaygmYW1zX2luZm8ubG9jayk7CisKKwlpZiAoYW1zX2luZm8uaGFzX2RldmljZSkgeworCQkvKiBSZW1vdmUgaW5wdXQgZGV2aWNlICovCisJCWFtc19pbnB1dF9leGl0KCk7CisKKwkJLyogU2h1dCBkb3duIGltcGxlbWVudGF0aW9uICovCisJCWFtc19pbmZvLmV4aXQoKTsKKworCQkvKiBGbHVzaCBpbnRlcnJ1cHQgd29ya2VyCisJCSAqCisJCSAqIFdlIGRvIHRoaXMgYWZ0ZXIgYW1zX2luZm8uZXhpdCgpLCBiZWNhdXNlIGFuIGludGVycnVwdCBtaWdodAorCQkgKiBoYXZlIGFycml2ZWQgYmVmb3JlIGRpc2FibGluZyB0aGVtLgorCQkgKi8KKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCQkvKiBSZW1vdmUgYXR0cmlidXRlcyAqLworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmFtc19pbmZvLm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfY3VycmVudCk7CisKKwkJLyogUmVtb3ZlIGRldmljZSAqLworCQlvZl9kZXZpY2VfdW5yZWdpc3RlcihhbXNfaW5mby5vZl9kZXYpOworCisJCS8qIFJlbW92ZSBoYW5kbGVyICovCisJCXBtZl91bnJlZ2lzdGVyX2lycV9jbGllbnQoJmFtc19zaG9ja19jbGllbnQpOworCQlwbWZfdW5yZWdpc3Rlcl9pcnFfY2xpZW50KCZhbXNfZnJlZWZhbGxfY2xpZW50KTsKKwl9CisKKwltdXRleF91bmxvY2soJmFtc19pbmZvLmxvY2spOworfQorCitNT0RVTEVfQVVUSE9SKCJTdGVsaWFuIFBvcCwgTWljaGFlbCBIYW5zZWxtYW5uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFwcGxlIE1vdGlvbiBTZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGFtc19pbml0KTsKK21vZHVsZV9leGl0KGFtc19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1pMmMuYyBiL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI0YmRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9hbXMvYW1zLWkyYy5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQXBwbGUgTW90aW9uIFNlbnNvciBkcml2ZXIgKEkyQyB2YXJpYW50KQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBTdGVsaWFuIFBvcCAoc3RlbGlhbkBwb3BpZXMubmV0KQorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgSGFuc2VsbWFubiAobGludXgta2VybmVsQGhhbnNtaS5jaCkKKyAqCisgKiBDbGVhbiByb29tIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIHRoZSByZXZlcnNlIGVuZ2luZWVyZWQgTWFjIE9TIFggZHJpdmVyIGJ5CisgKiBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PiwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly9qb2hhbm5lcy5zaXBzb2x1dGlvbnMubmV0L1Bvd2VyQm9vay9BcHBsZV9Nb3Rpb25fU2Vuc29yX1NwZWNpZmljYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJhbXMuaCIKKworLyogQU1TIHJlZ2lzdGVycyAqLworI2RlZmluZSBBTVNfQ09NTUFORAkweDAwCS8qIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQU1TX1NUQVRVUwkweDAxCS8qIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBTVNfQ1RSTDEJMHgwMgkvKiByZWFkIGNvbnRyb2wgMSAobnVtYmVyIG9mIHZhbHVlcykgKi8KKyNkZWZpbmUgQU1TX0NUUkwyCTB4MDMJLyogcmVhZCBjb250cm9sIDIgKG9mZnNldD8pICovCisjZGVmaW5lIEFNU19DVFJMMwkweDA0CS8qIHJlYWQgY29udHJvbCAzIChzaXplIG9mIGVhY2ggdmFsdWU/KSAqLworI2RlZmluZSBBTVNfREFUQTEJMHgwNQkvKiByZWFkIGRhdGEgMSAqLworI2RlZmluZSBBTVNfREFUQTIJMHgwNgkvKiByZWFkIGRhdGEgMiAqLworI2RlZmluZSBBTVNfREFUQTMJMHgwNwkvKiByZWFkIGRhdGEgMyAqLworI2RlZmluZSBBTVNfREFUQTQJMHgwOAkvKiByZWFkIGRhdGEgNCAqLworI2RlZmluZSBBTVNfREFUQVgJMHgyMAkvKiBkYXRhIFggKi8KKyNkZWZpbmUgQU1TX0RBVEFZCTB4MjEJLyogZGF0YSBZICovCisjZGVmaW5lIEFNU19EQVRBWgkweDIyCS8qIGRhdGEgWiAqLworI2RlZmluZSBBTVNfRlJFRUZBTEwJMHgyNAkvKiBmcmVlZmFsbCBpbnQgY29udHJvbCAqLworI2RlZmluZSBBTVNfU0hPQ0sJMHgyNQkvKiBzaG9jayBpbnQgY29udHJvbCAqLworI2RlZmluZSBBTVNfU0VOU0xPVwkweDI2CS8qIHNlbnNpdGl2aXR5IGxvdyBsaW1pdCAqLworI2RlZmluZSBBTVNfU0VOU0hJR0gJMHgyNwkvKiBzZW5zaXRpdml0eSBoaWdoIGxpbWl0ICovCisjZGVmaW5lIEFNU19DVFJMWAkweDI4CS8qIGNvbnRyb2wgWCAqLworI2RlZmluZSBBTVNfQ1RSTFkJMHgyOQkvKiBjb250cm9sIFkgKi8KKyNkZWZpbmUgQU1TX0NUUkxaCTB4MkEJLyogY29udHJvbCBaICovCisjZGVmaW5lIEFNU19VTktOT1dOMQkweDJCCS8qIHVua25vd24gMSAqLworI2RlZmluZSBBTVNfVU5LTk9XTjIJMHgyQwkvKiB1bmtub3duIDIgKi8KKyNkZWZpbmUgQU1TX1VOS05PV04zCTB4MkQJLyogdW5rbm93biAzICovCisjZGVmaW5lIEFNU19WRU5ET1IJMHgyRQkvKiB2ZW5kb3IgKi8KKworLyogQU1TIGNvbW1hbmRzIC0gdXNlIHdpdGggdGhlIEFNU19DT01NQU5EIHJlZ2lzdGVyICovCitlbnVtIGFtc19pMmNfY21kIHsKKwlBTVNfQ01EX05PT1AgPSAwLAorCUFNU19DTURfVkVSU0lPTiwKKwlBTVNfQ01EX1JFQURNRU0sCisJQU1TX0NNRF9XUklURU1FTSwKKwlBTVNfQ01EX0VSQVNFTUVNLAorCUFNU19DTURfUkVBREVFLAorCUFNU19DTURfV1JJVEVFRSwKKwlBTVNfQ01EX1JFU0VULAorCUFNU19DTURfU1RBUlQsCit9OworCitzdGF0aWMgaW50IGFtc19pMmNfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IGFtc19pMmNfZGV0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhbXNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSAgID0gImFtcyIsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwl9LAorCS5hdHRhY2hfYWRhcHRlciA9IGFtc19pMmNfYXR0YWNoLAorCS5kZXRhY2hfYWRhcHRlciA9IGFtc19pMmNfZGV0YWNoLAorfTsKKworc3RhdGljIHMzMiBhbXNfaTJjX3JlYWQodTggcmVnKQoreworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJmFtc19pbmZvLmkyY19jbGllbnQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgYW1zX2kyY193cml0ZSh1OCByZWcsIHU4IHZhbHVlKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCZhbXNfaW5mby5pMmNfY2xpZW50LCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBhbXNfaTJjX2NtZChlbnVtIGFtc19pMmNfY21kIGNtZCkKK3sKKwlzMzIgcmVzdWx0OworCWludCByZW1haW5pbmcgPSBIWiAvIDIwOworCisJYW1zX2kyY193cml0ZShBTVNfQ09NTUFORCwgY21kKTsKKwltZGVsYXkoNSk7CisKKwl3aGlsZSAocmVtYWluaW5nKSB7CisJCXJlc3VsdCA9IGFtc19pMmNfcmVhZChBTVNfQ09NTUFORCk7CisJCWlmIChyZXN1bHQgPT0gMCB8fCByZXN1bHQgJiAweDgwKQorCQkJcmV0dXJuIDA7CisKKwkJcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dChyZW1haW5pbmcpOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgYW1zX2kyY19zZXRfaXJxKGVudW0gYW1zX2lycSByZWcsIGNoYXIgZW5hYmxlKQoreworCWlmIChyZWcgJiBBTVNfSVJRX0ZSRUVGQUxMKSB7CisJCXU4IHZhbCA9IGFtc19pMmNfcmVhZChBTVNfQ1RSTFgpOworCQlpZiAoZW5hYmxlKQorCQkJdmFsIHw9IDB4ODA7CisJCWVsc2UKKwkJCXZhbCAmPSB+MHg4MDsKKwkJYW1zX2kyY193cml0ZShBTVNfQ1RSTFgsIHZhbCk7CisJfQorCisJaWYgKHJlZyAmIEFNU19JUlFfU0hPQ0spIHsKKwkJdTggdmFsID0gYW1zX2kyY19yZWFkKEFNU19DVFJMWSk7CisJCWlmIChlbmFibGUpCisJCQl2YWwgfD0gMHg4MDsKKwkJZWxzZQorCQkJdmFsICY9IH4weDgwOworCQlhbXNfaTJjX3dyaXRlKEFNU19DVFJMWSwgdmFsKTsKKwl9CisKKwlpZiAocmVnICYgQU1TX0lSUV9HTE9CQUwpIHsKKwkJdTggdmFsID0gYW1zX2kyY19yZWFkKEFNU19DVFJMWik7CisJCWlmIChlbmFibGUpCisJCQl2YWwgfD0gMHg4MDsKKwkJZWxzZQorCQkJdmFsICY9IH4weDgwOworCQlhbXNfaTJjX3dyaXRlKEFNU19DVFJMWiwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFtc19pMmNfY2xlYXJfaXJxKGVudW0gYW1zX2lycSByZWcpCit7CisJaWYgKHJlZyAmIEFNU19JUlFfRlJFRUZBTEwpCisJCWFtc19pMmNfd3JpdGUoQU1TX0ZSRUVGQUxMLCAwKTsKKworCWlmIChyZWcgJiBBTVNfSVJRX1NIT0NLKQorCQlhbXNfaTJjX3dyaXRlKEFNU19TSE9DSywgMCk7Cit9CisKK3N0YXRpYyB1OCBhbXNfaTJjX2dldF92ZW5kb3Iodm9pZCkKK3sKKwlyZXR1cm4gYW1zX2kyY19yZWFkKEFNU19WRU5ET1IpOworfQorCitzdGF0aWMgdm9pZCBhbXNfaTJjX2dldF94eXooczggKngsIHM4ICp5LCBzOCAqeikKK3sKKwkqeCA9IGFtc19pMmNfcmVhZChBTVNfREFUQVgpOworCSp5ID0gYW1zX2kyY19yZWFkKEFNU19EQVRBWSk7CisJKnogPSBhbXNfaTJjX3JlYWQoQU1TX0RBVEFaKTsKK30KKworc3RhdGljIGludCBhbXNfaTJjX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBidXM7CisJaW50IHZtYWosIHZtaW47CisJaW50IHJlc3VsdDsKKworCS8qIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSAqLworCWlmICh1bmxpa2VseShhbXNfaW5mby5oYXNfZGV2aWNlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc3RybmNtcChhZGFwdGVyLT5uYW1lLCAidW5pLW4iLCA1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlidXMgPSBzaW1wbGVfc3RydG91bChhZGFwdGVyLT5uYW1lICsgNiwgTlVMTCwgMTApOworCWlmIChidXMgIT0gYW1zX2luZm8uaTJjX2J1cykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhbXNfaW5mby5pMmNfY2xpZW50LmFkZHIgPSBhbXNfaW5mby5pMmNfYWRkcmVzczsKKwlhbXNfaW5mby5pMmNfY2xpZW50LmFkYXB0ZXIgPSBhZGFwdGVyOworCWFtc19pbmZvLmkyY19jbGllbnQuZHJpdmVyID0gJmFtc19pMmNfZHJpdmVyOworCXN0cmNweShhbXNfaW5mby5pMmNfY2xpZW50Lm5hbWUsICJBcHBsZSBNb3Rpb24gU2Vuc29yIik7CisKKwlpZiAoYW1zX2kyY19jbWQoQU1TX0NNRF9SRVNFVCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW1zOiBGYWlsZWQgdG8gcmVzZXQgdGhlIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhbXNfaTJjX2NtZChBTVNfQ01EX1NUQVJUKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJhbXM6IEZhaWxlZCB0byBzdGFydCB0aGUgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZ2V0IHZlcnNpb24vdmVuZG9yIGluZm9ybWF0aW9uICovCisJYW1zX2kyY193cml0ZShBTVNfQ1RSTDEsIDB4MDIpOworCWFtc19pMmNfd3JpdGUoQU1TX0NUUkwyLCAweDg1KTsKKwlhbXNfaTJjX3dyaXRlKEFNU19DVFJMMywgMHgwMSk7CisKKwlhbXNfaTJjX2NtZChBTVNfQ01EX1JFQURNRU0pOworCisJdm1haiA9IGFtc19pMmNfcmVhZChBTVNfREFUQTEpOworCXZtaW4gPSBhbXNfaTJjX3JlYWQoQU1TX0RBVEEyKTsKKwlpZiAodm1haiAhPSAxIHx8IHZtaW4gIT0gNTIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW1zOiBJbmNvcnJlY3QgZGV2aWNlIHZlcnNpb24gKCVkLiVkKVxuIiwKKwkJCXZtYWosIHZtaW4pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhbXNfaTJjX2NtZChBTVNfQ01EX1ZFUlNJT04pOworCisJdm1haiA9IGFtc19pMmNfcmVhZChBTVNfREFUQTEpOworCXZtaW4gPSBhbXNfaTJjX3JlYWQoQU1TX0RBVEEyKTsKKwlpZiAodm1haiAhPSAwIHx8IHZtaW4gIT0gMSkgeworCQlwcmludGsoS0VSTl9JTkZPICJhbXM6IEluY29ycmVjdCBmaXJtd2FyZSB2ZXJzaW9uICglZC4lZClcbiIsCisJCQl2bWFqLCB2bWluKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJYW1zX2kyY19zZXRfaXJxKEFNU19JUlFfQUxMLCAwKTsKKworCXJlc3VsdCA9IGFtc19zZW5zb3JfYXR0YWNoKCk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CisKKwkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgKi8KKwlhbXNfaTJjX3dyaXRlKEFNU19TRU5TTE9XLCAweDE1KTsKKwlhbXNfaTJjX3dyaXRlKEFNU19TRU5TSElHSCwgMHg2MCk7CisJYW1zX2kyY193cml0ZShBTVNfQ1RSTFgsIDB4MDgpOworCWFtc19pMmNfd3JpdGUoQU1TX0NUUkxZLCAweDBGKTsKKwlhbXNfaTJjX3dyaXRlKEFNU19DVFJMWiwgMHg0Rik7CisJYW1zX2kyY193cml0ZShBTVNfVU5LTk9XTjEsIDB4MTQpOworCisJLyogQ2xlYXIgaW50ZXJydXB0cyAqLworCWFtc19pMmNfY2xlYXJfaXJxKEFNU19JUlFfQUxMKTsKKworCWFtc19pbmZvLmhhc19kZXZpY2UgPSAxOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlhbXNfaTJjX3NldF9pcnEoQU1TX0lSUV9BTEwsIDEpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiYW1zOiBGb3VuZCBJMkMgYmFzZWQgbW90aW9uIHNlbnNvclxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXNfaTJjX2RldGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKGFtc19pbmZvLmhhc19kZXZpY2UpIHsKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCWFtc19pMmNfc2V0X2lycShBTVNfSVJRX0FMTCwgMCk7CisKKwkJLyogQ2xlYXIgaW50ZXJydXB0cyAqLworCQlhbXNfaTJjX2NsZWFyX2lycShBTVNfSVJRX0FMTCk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW1zOiBVbmxvYWRpbmdcbiIpOworCisJCWFtc19pbmZvLmhhc19kZXZpY2UgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbXNfaTJjX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYW1zX2kyY19kcml2ZXIpOworfQorCitpbnQgX19pbml0IGFtc19pMmNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWNoYXIgKnRtcF9idXM7CisJaW50IHJlc3VsdDsKKwl1MzIgKnByb3A7CisKKwltdXRleF9sb2NrKCZhbXNfaW5mby5sb2NrKTsKKworCS8qIFNldCBpbXBsZW1lbnRhdGlvbiBzdHVmZiAqLworCWFtc19pbmZvLm9mX25vZGUgPSBucDsKKwlhbXNfaW5mby5leGl0ID0gYW1zX2kyY19leGl0OworCWFtc19pbmZvLmdldF92ZW5kb3IgPSBhbXNfaTJjX2dldF92ZW5kb3I7CisJYW1zX2luZm8uZ2V0X3h5eiA9IGFtc19pMmNfZ2V0X3h5ejsKKwlhbXNfaW5mby5jbGVhcl9pcnEgPSBhbXNfaTJjX2NsZWFyX2lycTsKKwlhbXNfaW5mby5idXN0eXBlID0gQlVTX0kyQzsKKworCS8qIGxvb2sgZm9yIGJ1cyBlaXRoZXIgdXNpbmcgInJlZyIgb3IgYnkgcGF0aCAqLworCXByb3AgPSAodTMyKilnZXRfcHJvcGVydHkoYW1zX2luZm8ub2Zfbm9kZSwgInJlZyIsIE5VTEwpOworCWlmICghcHJvcCkgeworCQlyZXN1bHQgPSAtRU5PREVWOworCisJCWdvdG8gZXhpdDsKKwl9CisKKwl0bXBfYnVzID0gc3Ryc3RyKGFtc19pbmZvLm9mX25vZGUtPmZ1bGxfbmFtZSwgIi9pMmMtYnVzQCIpOworCWlmICh0bXBfYnVzKQorCQlhbXNfaW5mby5pMmNfYnVzID0gKih0bXBfYnVzICsgOSkgLSAnMCc7CisJZWxzZQorCQlhbXNfaW5mby5pMmNfYnVzID0gKCgqcHJvcCkgPj4gOCkgJiAweDBmOworCWFtc19pbmZvLmkyY19hZGRyZXNzID0gKCgqcHJvcCkgJiAweGZmKSA+PiAxOworCisJcmVzdWx0ID0gaTJjX2FkZF9kcml2ZXIoJmFtc19pMmNfZHJpdmVyKTsKKworZXhpdDoKKwltdXRleF91bmxvY2soJmFtc19pbmZvLmxvY2spOworCisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1pbnB1dC5jIGIvZHJpdmVycy9od21vbi9hbXMvYW1zLWlucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyNmFhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1pbnB1dC5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQXBwbGUgTW90aW9uIFNlbnNvciBkcml2ZXIgKGpveXN0aWNrIGVtdWxhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgU3RlbGlhbiBQb3AgKHN0ZWxpYW5AcG9waWVzLm5ldCkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEhhbnNlbG1hbm4gKGxpbnV4LWtlcm5lbEBoYW5zbWkuY2gpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJhbXMuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBqb3lzdGljazsKK21vZHVsZV9wYXJhbShqb3lzdGljaywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGpveXN0aWNrLCAiRW5hYmxlIHRoZSBpbnB1dCBjbGFzcyBkZXZpY2Ugb24gbW9kdWxlIGxvYWQiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBpbnZlcnQ7Cittb2R1bGVfcGFyYW0oaW52ZXJ0LCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW52ZXJ0LCAiSW52ZXJ0IGlucHV0IGRhdGEgb24gWCBhbmQgWSBheGlzIik7CisKK3N0YXRpYyBpbnQgYW1zX2lucHV0X2t0aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzOCB4LCB5LCB6OworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJbXV0ZXhfbG9jaygmYW1zX2luZm8ubG9jayk7CisKKwkJYW1zX3NlbnNvcnMoJngsICZ5LCAmeik7CisKKwkJeCAtPSBhbXNfaW5mby54Y2FsaWI7CisJCXkgLT0gYW1zX2luZm8ueWNhbGliOworCQl6IC09IGFtc19pbmZvLnpjYWxpYjsKKworCQlpbnB1dF9yZXBvcnRfYWJzKGFtc19pbmZvLmlkZXYsIEFCU19YLCBpbnZlcnQgPyAteCA6IHgpOworCQlpbnB1dF9yZXBvcnRfYWJzKGFtc19pbmZvLmlkZXYsIEFCU19ZLCBpbnZlcnQgPyAteSA6IHkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGFtc19pbmZvLmlkZXYsIEFCU19aLCB6KTsKKworCQlpbnB1dF9zeW5jKGFtc19pbmZvLmlkZXYpOworCisJCW11dGV4X3VubG9jaygmYW1zX2luZm8ubG9jayk7CisKKwkJbXNsZWVwKDI1KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXNfaW5wdXRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJYW1zX2luZm8ua3RocmVhZCA9IGt0aHJlYWRfcnVuKGFtc19pbnB1dF9rdGhyZWFkLCBOVUxMLCAia2FtcyIpOworCXJldHVybiBJU19FUlIoYW1zX2luZm8ua3RocmVhZCkgPyBQVFJfRVJSKGFtc19pbmZvLmt0aHJlYWQpIDogMDsKK30KKworc3RhdGljIHZvaWQgYW1zX2lucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlrdGhyZWFkX3N0b3AoYW1zX2luZm8ua3RocmVhZCk7Cit9CisKKy8qIENhbGwgd2l0aCBhbXNfaW5mby5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZCBhbXNfaW5wdXRfZW5hYmxlKHZvaWQpCit7CisJczggeCwgeSwgejsKKworCWlmIChhbXNfaW5mby5pZGV2KQorCQlyZXR1cm47CisKKwlhbXNfc2Vuc29ycygmeCwgJnksICZ6KTsKKwlhbXNfaW5mby54Y2FsaWIgPSB4OworCWFtc19pbmZvLnljYWxpYiA9IHk7CisJYW1zX2luZm8uemNhbGliID0gejsKKworCWFtc19pbmZvLmlkZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWFtc19pbmZvLmlkZXYpCisJCXJldHVybjsKKworCWFtc19pbmZvLmlkZXYtPm5hbWUgPSAiQXBwbGUgTW90aW9uIFNlbnNvciI7CisJYW1zX2luZm8uaWRldi0+aWQuYnVzdHlwZSA9IGFtc19pbmZvLmJ1c3R5cGU7CisJYW1zX2luZm8uaWRldi0+aWQudmVuZG9yID0gMDsKKwlhbXNfaW5mby5pZGV2LT5vcGVuID0gYW1zX2lucHV0X29wZW47CisJYW1zX2luZm8uaWRldi0+Y2xvc2UgPSBhbXNfaW5wdXRfY2xvc2U7CisJYW1zX2luZm8uaWRldi0+Y2Rldi5kZXYgPSAmYW1zX2luZm8ub2ZfZGV2LT5kZXY7CisKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhhbXNfaW5mby5pZGV2LCBBQlNfWCwgLTUwLCA1MCwgMywgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoYW1zX2luZm8uaWRldiwgQUJTX1ksIC01MCwgNTAsIDMsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGFtc19pbmZvLmlkZXYsIEFCU19aLCAtNTAsIDUwLCAzLCAwKTsKKworCXNldF9iaXQoRVZfQUJTLCBhbXNfaW5mby5pZGV2LT5ldmJpdCk7CisJc2V0X2JpdChFVl9LRVksIGFtc19pbmZvLmlkZXYtPmV2Yml0KTsKKwlzZXRfYml0KEJUTl9UT1VDSCwgYW1zX2luZm8uaWRldi0+a2V5Yml0KTsKKworCWlmIChpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYW1zX2luZm8uaWRldikpIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoYW1zX2luZm8uaWRldik7CisJCWFtc19pbmZvLmlkZXYgPSBOVUxMOworCQlyZXR1cm47CisJfQorfQorCisvKiBDYWxsIHdpdGggYW1zX2luZm8ubG9jayBoZWxkISAqLworc3RhdGljIHZvaWQgYW1zX2lucHV0X2Rpc2FibGUodm9pZCkKK3sKKwlpZiAoYW1zX2luZm8uaWRldikgeworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShhbXNfaW5mby5pZGV2KTsKKwkJYW1zX2luZm8uaWRldiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBhbXNfaW5wdXRfc2hvd19qb3lzdGljayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgam95c3RpY2spOworfQorCitzdGF0aWMgc3NpemVfdCBhbXNfaW5wdXRfc3RvcmVfam95c3RpY2soc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkXG4iLCAmam95c3RpY2spICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmYW1zX2luZm8ubG9jayk7CisKKwlpZiAoam95c3RpY2spCisJCWFtc19pbnB1dF9lbmFibGUoKTsKKwllbHNlCisJCWFtc19pbnB1dF9kaXNhYmxlKCk7CisKKwltdXRleF91bmxvY2soJmFtc19pbmZvLmxvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoam95c3RpY2ssIFNfSVJVR08gfCBTX0lXVVNSLAorCWFtc19pbnB1dF9zaG93X2pveXN0aWNrLCBhbXNfaW5wdXRfc3RvcmVfam95c3RpY2spOworCisvKiBDYWxsIHdpdGggYW1zX2luZm8ubG9jayBoZWxkISAqLworaW50IGFtc19pbnB1dF9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmYW1zX2luZm8ub2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9qb3lzdGljayk7CisKKwlpZiAoIXJlc3VsdCAmJiBqb3lzdGljaykKKwkJYW1zX2lucHV0X2VuYWJsZSgpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIENhbGwgd2l0aCBhbXNfaW5mby5sb2NrIGhlbGQhICovCit2b2lkIGFtc19pbnB1dF9leGl0KCkKK3sKKwlhbXNfaW5wdXRfZGlzYWJsZSgpOworCWRldmljZV9yZW1vdmVfZmlsZSgmYW1zX2luZm8ub2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9qb3lzdGljayk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMtcG11LmMgYi9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMtcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzNmFlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1wbXUuYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIEFwcGxlIE1vdGlvbiBTZW5zb3IgZHJpdmVyIChQTVUgdmFyaWFudCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBIYW5zZWxtYW5uIChsaW51eC1rZXJuZWxAaGFuc21pLmNoKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWRiLmg+CisjaW5jbHVkZSA8bGludXgvcG11Lmg+CisKKyNpbmNsdWRlICJhbXMuaCIKKworLyogQXR0aXR1ZGUgKi8KKyNkZWZpbmUgQU1TX1gJCQkweDAwCisjZGVmaW5lIEFNU19ZCQkJMHgwMQorI2RlZmluZSBBTVNfWgkJCTB4MDIKKworLyogTm90IGV4YWN0bHkga25vd24sIG1heWJlIGNoaXAgdmVuZG9yICovCisjZGVmaW5lIEFNU19WRU5ET1IJCTB4MDMKKworLyogRnJlZWZhbGwgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFNU19GRl9DTEVBUgkJMHgwNAorI2RlZmluZSBBTVNfRkZfRU5BQkxFCQkweDA1CisjZGVmaW5lIEFNU19GRl9MT1dfTElNSVQJMHgwNgorI2RlZmluZSBBTVNfRkZfREVCT1VOQ0UJCTB4MDcKKworLyogU2hvY2sgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFNU19TSE9DS19DTEVBUgkJMHgwOAorI2RlZmluZSBBTVNfU0hPQ0tfRU5BQkxFCTB4MDkKKyNkZWZpbmUgQU1TX1NIT0NLX0hJR0hfTElNSVQJMHgwYQorI2RlZmluZSBBTVNfU0hPQ0tfREVCT1VOQ0UJMHgwYgorCisvKiBHbG9iYWwgaW50ZXJydXB0IGFuZCBwb3dlciBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEFNU19DT05UUk9MCQkweDBjCisKK3N0YXRpYyB1OCBhbXNfcG11X2NtZDsKKworc3RhdGljIHZvaWQgYW1zX3BtdV9yZXFfY29tcGxldGUoc3RydWN0IGFkYl9yZXF1ZXN0ICpyZXEpCit7CisJY29tcGxldGUoKHN0cnVjdCBjb21wbGV0aW9uICopcmVxLT5hcmcpOworfQorCisvKiBPbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIHRhc2sgY29udGV4dCAqLworc3RhdGljIHZvaWQgYW1zX3BtdV9zZXRfcmVnaXN0ZXIodTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlzdGF0aWMgc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlERUNMQVJFX0NPTVBMRVRJT04ocmVxX2NvbXBsZXRlKTsKKworCXJlcS5hcmcgPSAmcmVxX2NvbXBsZXRlOworCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBhbXNfcG11X3JlcV9jb21wbGV0ZSwgNCwgYW1zX3BtdV9jbWQsIDB4MDAsIHJlZywgdmFsdWUpKQorCQlyZXR1cm47CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyZXFfY29tcGxldGUpOworfQorCisvKiBPbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIHRhc2sgY29udGV4dCAqLworc3RhdGljIHU4IGFtc19wbXVfZ2V0X3JlZ2lzdGVyKHU4IHJlZykKK3sKKwlzdGF0aWMgc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlERUNMQVJFX0NPTVBMRVRJT04ocmVxX2NvbXBsZXRlKTsKKworCXJlcS5hcmcgPSAmcmVxX2NvbXBsZXRlOworCWlmIChwbXVfcmVxdWVzdCgmcmVxLCBhbXNfcG11X3JlcV9jb21wbGV0ZSwgMywgYW1zX3BtdV9jbWQsIDB4MDEsIHJlZykpCisJCXJldHVybiAwOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmcmVxX2NvbXBsZXRlKTsKKworCWlmIChyZXEucmVwbHlfbGVuID4gMCkKKwkJcmV0dXJuIHJlcS5yZXBseVswXTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQgYW1zX3BtdV9zZXRfaXJxKGVudW0gYW1zX2lycSByZWcsIGNoYXIgZW5hYmxlKQoreworCWlmIChyZWcgJiBBTVNfSVJRX0ZSRUVGQUxMKSB7CisJCXU4IHZhbCA9IGFtc19wbXVfZ2V0X3JlZ2lzdGVyKEFNU19GRl9FTkFCTEUpOworCQlpZiAoZW5hYmxlKQorCQkJdmFsIHw9IDB4ODA7CisJCWVsc2UKKwkJCXZhbCAmPSB+MHg4MDsKKwkJYW1zX3BtdV9zZXRfcmVnaXN0ZXIoQU1TX0ZGX0VOQUJMRSwgdmFsKTsKKwl9CisKKwlpZiAocmVnICYgQU1TX0lSUV9TSE9DSykgeworCQl1OCB2YWwgPSBhbXNfcG11X2dldF9yZWdpc3RlcihBTVNfU0hPQ0tfRU5BQkxFKTsKKwkJaWYgKGVuYWJsZSkKKwkJCXZhbCB8PSAweDgwOworCQllbHNlCisJCQl2YWwgJj0gfjB4ODA7CisJCWFtc19wbXVfc2V0X3JlZ2lzdGVyKEFNU19TSE9DS19FTkFCTEUsIHZhbCk7CisJfQorCisJaWYgKHJlZyAmIEFNU19JUlFfR0xPQkFMKSB7CisJCXU4IHZhbCA9IGFtc19wbXVfZ2V0X3JlZ2lzdGVyKEFNU19DT05UUk9MKTsKKwkJaWYgKGVuYWJsZSkKKwkJCXZhbCB8PSAweDgwOworCQllbHNlCisJCQl2YWwgJj0gfjB4ODA7CisJCWFtc19wbXVfc2V0X3JlZ2lzdGVyKEFNU19DT05UUk9MLCB2YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgYW1zX3BtdV9jbGVhcl9pcnEoZW51bSBhbXNfaXJxIHJlZykKK3sKKwlpZiAocmVnICYgQU1TX0lSUV9GUkVFRkFMTCkKKwkJYW1zX3BtdV9zZXRfcmVnaXN0ZXIoQU1TX0ZGX0NMRUFSLCAweDAwKTsKKworCWlmIChyZWcgJiBBTVNfSVJRX1NIT0NLKQorCQlhbXNfcG11X3NldF9yZWdpc3RlcihBTVNfU0hPQ0tfQ0xFQVIsIDB4MDApOworfQorCitzdGF0aWMgdTggYW1zX3BtdV9nZXRfdmVuZG9yKHZvaWQpCit7CisJcmV0dXJuIGFtc19wbXVfZ2V0X3JlZ2lzdGVyKEFNU19WRU5ET1IpOworfQorCitzdGF0aWMgdm9pZCBhbXNfcG11X2dldF94eXooczggKngsIHM4ICp5LCBzOCAqeikKK3sKKwkqeCA9IGFtc19wbXVfZ2V0X3JlZ2lzdGVyKEFNU19YKTsKKwkqeSA9IGFtc19wbXVfZ2V0X3JlZ2lzdGVyKEFNU19ZKTsKKwkqeiA9IGFtc19wbXVfZ2V0X3JlZ2lzdGVyKEFNU19aKTsKK30KKworc3RhdGljIHZvaWQgYW1zX3BtdV9leGl0KHZvaWQpCit7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJYW1zX3BtdV9zZXRfaXJxKEFNU19JUlFfQUxMLCAwKTsKKworCS8qIENsZWFyIGludGVycnVwdHMgKi8KKwlhbXNfcG11X2NsZWFyX2lycShBTVNfSVJRX0FMTCk7CisKKwlhbXNfaW5mby5oYXNfZGV2aWNlID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImFtczogVW5sb2FkaW5nXG4iKTsKK30KKworaW50IF9faW5pdCBhbXNfcG11X2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl1MzIgKnByb3A7CisJaW50IHJlc3VsdDsKKworCW11dGV4X2xvY2soJmFtc19pbmZvLmxvY2spOworCisJLyogU2V0IGltcGxlbWVudGF0aW9uIHN0dWZmICovCisJYW1zX2luZm8ub2Zfbm9kZSA9IG5wOworCWFtc19pbmZvLmV4aXQgPSBhbXNfcG11X2V4aXQ7CisJYW1zX2luZm8uZ2V0X3ZlbmRvciA9IGFtc19wbXVfZ2V0X3ZlbmRvcjsKKwlhbXNfaW5mby5nZXRfeHl6ID0gYW1zX3BtdV9nZXRfeHl6OworCWFtc19pbmZvLmNsZWFyX2lycSA9IGFtc19wbXVfY2xlYXJfaXJxOworCWFtc19pbmZvLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKworCS8qIEdldCBQTVUgY29tbWFuZCwgc2hvdWxkIGJlIDB4NGUsIGJ1dCB3ZSBjYW4gbmV2ZXIga25vdyAqLworCXByb3AgPSAodTMyKilnZXRfcHJvcGVydHkoYW1zX2luZm8ub2Zfbm9kZSwgInJlZyIsIE5VTEwpOworCWlmICghcHJvcCkgeworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCWFtc19wbXVfY21kID0gKCgqcHJvcCkgPj4gOCkgJiAweGZmOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJYW1zX3BtdV9zZXRfaXJxKEFNU19JUlFfQUxMLCAwKTsKKworCS8qIENsZWFyIGludGVycnVwdHMgKi8KKwlhbXNfcG11X2NsZWFyX2lycShBTVNfSVJRX0FMTCk7CisKKwlyZXN1bHQgPSBhbXNfc2Vuc29yX2F0dGFjaCgpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgKi8KKwlhbXNfcG11X3NldF9yZWdpc3RlcihBTVNfRkZfTE9XX0xJTUlULCAweDE1KTsKKwlhbXNfcG11X3NldF9yZWdpc3RlcihBTVNfRkZfRU5BQkxFLCAweDA4KTsKKwlhbXNfcG11X3NldF9yZWdpc3RlcihBTVNfRkZfREVCT1VOQ0UsIDB4MTQpOworCisJYW1zX3BtdV9zZXRfcmVnaXN0ZXIoQU1TX1NIT0NLX0hJR0hfTElNSVQsIDB4NjApOworCWFtc19wbXVfc2V0X3JlZ2lzdGVyKEFNU19TSE9DS19FTkFCTEUsIDB4MGYpOworCWFtc19wbXVfc2V0X3JlZ2lzdGVyKEFNU19TSE9DS19ERUJPVU5DRSwgMHgxNCk7CisKKwlhbXNfcG11X3NldF9yZWdpc3RlcihBTVNfQ09OVFJPTCwgMHg0Zik7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHRzICovCisJYW1zX3BtdV9jbGVhcl9pcnEoQU1TX0lSUV9BTEwpOworCisJYW1zX2luZm8uaGFzX2RldmljZSA9IDE7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCWFtc19wbXVfc2V0X2lycShBTVNfSVJRX0FMTCwgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJhbXM6IEZvdW5kIFBNVSBiYXNlZCBtb3Rpb24gc2Vuc29yXG4iKTsKKworCXJlc3VsdCA9IDA7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZhbXNfaW5mby5sb2NrKTsKKworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMuaCBiL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDczMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMuaApAQCAtMCwwICsxLDcyIEBACisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorCitlbnVtIGFtc19pcnEgeworCUFNU19JUlFfRlJFRUZBTEwgPSAweDAxLAorCUFNU19JUlFfU0hPQ0sgPSAweDAyLAorCUFNU19JUlFfR0xPQkFMID0gMHgwNCwKKwlBTVNfSVJRX0FMTCA9CisJCUFNU19JUlFfRlJFRUZBTEwgfAorCQlBTVNfSVJRX1NIT0NLIHwKKwkJQU1TX0lSUV9HTE9CQUwsCit9OworCitzdHJ1Y3QgYW1zIHsKKwkvKiBMb2NrcyAqLworCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisJc3RydWN0IG11dGV4IGxvY2s7CisKKwkvKiBHZW5lcmFsIHByb3BlcnRpZXMgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisJc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2OworCWNoYXIgaGFzX2RldmljZTsKKwljaGFyIHZmbGFnOworCXUzMiBvcmllbnQxOworCXUzMiBvcmllbnQyOworCisJLyogSW50ZXJydXB0IHdvcmtlciAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrZXI7CisJdTggd29ya2VyX2lycXM7CisKKwkvKiBJbXBsZW1lbnRhdGlvbgorCSAqCisJICogT25seSBjYWxsIHRoZXNlIGZ1bmN0aW9ucyB3aXRoIHRoZSBtYWluIGxvY2sgaGVsZC4KKwkgKi8KKwl2b2lkICgqZXhpdCkodm9pZCk7CisKKwl2b2lkICgqZ2V0X3h5eikoczggKngsIHM4ICp5LCBzOCAqeik7CisJdTggKCpnZXRfdmVuZG9yKSh2b2lkKTsKKworCXZvaWQgKCpjbGVhcl9pcnEpKGVudW0gYW1zX2lycSByZWcpOworCisjaWZkZWYgQ09ORklHX1NFTlNPUlNfQU1TX0kyQworCS8qIEkyQyBwcm9wZXJ0aWVzICovCisJaW50IGkyY19idXM7CisJaW50IGkyY19hZGRyZXNzOworCXN0cnVjdCBpMmNfY2xpZW50IGkyY19jbGllbnQ7CisjZW5kaWYKKworCS8qIEpveXN0aWNrIGVtdWxhdGlvbiAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCV9fdTE2IGJ1c3R5cGU7CisKKwkvKiBjYWxpYnJhdGVkIG51bGwgdmFsdWVzICovCisJaW50IHhjYWxpYiwgeWNhbGliLCB6Y2FsaWI7Cit9OworCitleHRlcm4gc3RydWN0IGFtcyBhbXNfaW5mbzsKKworZXh0ZXJuIHZvaWQgYW1zX3NlbnNvcnMoczggKngsIHM4ICp5LCBzOCAqeik7CitleHRlcm4gaW50IGFtc19zZW5zb3JfYXR0YWNoKHZvaWQpOworCitleHRlcm4gaW50IGFtc19wbXVfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBpbnQgYW1zX2kyY19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworCitleHRlcm4gaW50IGFtc19pbnB1dF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYW1zX2lucHV0X2V4aXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCmluZGV4IGRlMTdhNzIuLmEyNzJjYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCisrKyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCkBAIC0xLDEyICsxLDE1IEBACiAvKgotICogZjcxODA1Zi5jIC0gZHJpdmVyIGZvciB0aGUgRmludGVrIEY3MTgwNUYvRkcgU3VwZXItSS9PIGNoaXAgaW50ZWdyYXRlZAotICogICAgICAgICAgICAgaGFyZHdhcmUgbW9uaXRvcmluZyBmZWF0dXJlcworICogZjcxODA1Zi5jIC0gZHJpdmVyIGZvciB0aGUgRmludGVrIEY3MTgwNUYvRkcgYW5kIEY3MTg3MkYvRkcgU3VwZXItSS9PCisgKiAgICAgICAgICAgICBjaGlwcyBpbnRlZ3JhdGVkIGhhcmR3YXJlIG1vbml0b3JpbmcgZmVhdHVyZXMKICAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2ICBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KICAqCiAgKiBUaGUgRjcxODA1Ri9GRyBpcyBhIExQQyBTdXBlci1JL08gY2hpcCBtYWRlIGJ5IEZpbnRlay4gSXQgaW50ZWdyYXRlcwogICogY29tcGxldGUgaGFyZHdhcmUgbW9uaXRvcmluZyBmZWF0dXJlczogdm9sdGFnZSwgZmFuIGFuZCB0ZW1wZXJhdHVyZQogICogc2Vuc29ycywgYW5kIG1hbnVhbCBhbmQgYXV0b21hdGljIGZhbiBzcGVlZCBjb250cm9sLgogICoKKyAqIFRoZSBGNzE4NzJGL0ZHIGlzIGFsbW9zdCB0aGUgc2FtZSwgd2l0aCB0d28gbW9yZSB2b2x0YWdlcyBtb25pdG9yZWQsCisgKiBhbmQgNiBWSUQgaW5wdXRzLgorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKQEAgLTM3LDYgKzQwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCiAjZGVmaW5lIERSVk5BTUUgImY3MTgwNWYiCitlbnVtIGtpbmRzIHsgZjcxODA1ZiwgZjcxODcyZiB9OwogCiAvKgogICogU3VwZXItSS9PIGNvbnN0YW50cyBhbmQgZnVuY3Rpb25zCkBAIC00OCwxMSArNTIsMTMgQEAKICNkZWZpbmUgU0lPX1JFR19ERVZJRAkJMHgyMAkvKiBEZXZpY2UgSUQgKDIgYnl0ZXMpICovCiAjZGVmaW5lIFNJT19SRUdfREVWUkVWCQkweDIyCS8qIERldmljZSByZXZpc2lvbiAqLwogI2RlZmluZSBTSU9fUkVHX01BTklECQkweDIzCS8qIEZpbnRlayBJRCAoMiBieXRlcykgKi8KKyNkZWZpbmUgU0lPX1JFR19GTlNFTDEJCTB4MjkJLyogTXVsdGkgRnVuY3Rpb24gU2VsZWN0IDEgKEY3MTg3MkYpICovCiAjZGVmaW5lIFNJT19SRUdfRU5BQkxFCQkweDMwCS8qIExvZ2ljYWwgZGV2aWNlIGVuYWJsZSAqLwogI2RlZmluZSBTSU9fUkVHX0FERFIJCTB4NjAJLyogTG9naWNhbCBkZXZpY2UgYWRkcmVzcyAoMiBieXRlcykgKi8KIAogI2RlZmluZSBTSU9fRklOVEVLX0lECQkweDE5MzQKICNkZWZpbmUgU0lPX0Y3MTgwNUZfSUQJCTB4MDQwNgorI2RlZmluZSBTSU9fRjcxODcyRl9JRAkJMHgwMzQxCiAKIHN0YXRpYyBpbmxpbmUgaW50CiBzdXBlcmlvX2luYihpbnQgYmFzZSwgaW50IHJlZykKQEAgLTk2LDIyICsxMDIsMjUgQEAKICAqIElTQSBjb25zdGFudHMKICAqLwogCi0jZGVmaW5lIFJFR0lPTl9MRU5HVEgJCTIKLSNkZWZpbmUgQUREUl9SRUdfT0ZGU0VUCQkwCi0jZGVmaW5lIERBVEFfUkVHX09GRlNFVAkJMQorI2RlZmluZSBSRUdJT05fTEVOR1RICQk4CisjZGVmaW5lIEFERFJfUkVHX09GRlNFVAkJNQorI2RlZmluZSBEQVRBX1JFR19PRkZTRVQJCTYKIAogLyoKICAqIFJlZ2lzdGVycwogICovCiAKLS8qIGluIG5yIGZyb20gMCB0byA4ICg4LWJpdCB2YWx1ZXMpICovCisvKiBpbiBuciBmcm9tIDAgdG8gMTAgKDgtYml0IHZhbHVlcykgKi8KICNkZWZpbmUgRjcxODA1Rl9SRUdfSU4obnIpCQkoMHgxMCArIChucikpCi0jZGVmaW5lIEY3MTgwNUZfUkVHX0lOX0hJR0gobnIpCQkoMHg0MCArIDIgKiAobnIpKQotI2RlZmluZSBGNzE4MDVGX1JFR19JTl9MT1cobnIpCQkoMHg0MSArIDIgKiAobnIpKQorI2RlZmluZSBGNzE4MDVGX1JFR19JTl9ISUdIKG5yKQkJKChucikgPCAxMCA/IDB4NDAgKyAyICogKG5yKSA6IDB4MkUpCisjZGVmaW5lIEY3MTgwNUZfUkVHX0lOX0xPVyhucikJCSgobnIpIDwgMTAgPyAweDQxICsgMiAqIChucikgOiAweDJGKQogLyogZmFuIG5yIGZyb20gMCB0byAyICgxMi1iaXQgdmFsdWVzLCB0d28gcmVnaXN0ZXJzKSAqLwogI2RlZmluZSBGNzE4MDVGX1JFR19GQU4obnIpCQkoMHgyMCArIDIgKiAobnIpKQogI2RlZmluZSBGNzE4MDVGX1JFR19GQU5fTE9XKG5yKQkJKDB4MjggKyAyICogKG5yKSkKKyNkZWZpbmUgRjcxODA1Rl9SRUdfRkFOX1RBUkdFVChucikJKDB4NjkgKyAxNiAqIChucikpCiAjZGVmaW5lIEY3MTgwNUZfUkVHX0ZBTl9DVFJMKG5yKQkoMHg2MCArIDE2ICogKG5yKSkKKyNkZWZpbmUgRjcxODA1Rl9SRUdfUFdNX0ZSRVEobnIpCSgweDYzICsgMTYgKiAobnIpKQorI2RlZmluZSBGNzE4MDVGX1JFR19QV01fRFVUWShucikJKDB4NkIgKyAxNiAqIChucikpCiAvKiB0ZW1wIG5yIGZyb20gMCB0byAyICg4LWJpdCB2YWx1ZXMpICovCiAjZGVmaW5lIEY3MTgwNUZfUkVHX1RFTVAobnIpCQkoMHgxQiArIChucikpCiAjZGVmaW5lIEY3MTgwNUZfUkVHX1RFTVBfSElHSChucikJKDB4NTQgKyAyICogKG5yKSkKQEAgLTEyMiw2ICsxMzEsMTQgQEAKIC8qIHN0YXR1cyBuciBmcm9tIDAgdG8gMiAqLwogI2RlZmluZSBGNzE4MDVGX1JFR19TVEFUVVMobnIpCQkoMHgzNiArIChucikpCiAKKy8qIGluZGl2aWR1YWwgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBGQU5fQ1RSTF9EQ19NT0RFCQkweDEwCisjZGVmaW5lIEZBTl9DVFJMX0xBVENIX0ZVTEwJCTB4MDgKKyNkZWZpbmUgRkFOX0NUUkxfTU9ERV9NQVNLCQkweDAzCisjZGVmaW5lIEZBTl9DVFJMX01PREVfU1BFRUQJCTB4MDAKKyNkZWZpbmUgRkFOX0NUUkxfTU9ERV9URU1QRVJBVFVSRQkweDAxCisjZGVmaW5lIEZBTl9DVFJMX01PREVfTUFOVUFMCQkweDAyCisKIC8qCiAgKiBEYXRhIHN0cnVjdHVyZXMgYW5kIG1hbmlwdWxhdGlvbiB0aGVyZW9mCiAgKi8KQEAgLTEzOCwxMiArMTU1LDE2IEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X2xpbWl0czsJLyogSW4gamlmZmllcyAqLwogCiAJLyogUmVnaXN0ZXIgdmFsdWVzICovCi0JdTggaW5bOV07Ci0JdTggaW5faGlnaFs5XTsKLQl1OCBpbl9sb3dbOV07CisJdTggaW5bMTFdOworCXU4IGluX2hpZ2hbMTFdOworCXU4IGluX2xvd1sxMV07CisJdTE2IGhhc19pbjsKIAl1MTYgZmFuWzNdOwogCXUxNiBmYW5fbG93WzNdOwotCXU4IGZhbl9lbmFibGVkOwkJLyogUmVhZCBvbmNlIGF0IGluaXQgdGltZSAqLworCXUxNiBmYW5fdGFyZ2V0WzNdOworCXU4IGZhbl9jdHJsWzNdOworCXU4IHB3bVszXTsKKwl1OCBwd21fZnJlcVszXTsKIAl1OCB0ZW1wWzNdOwogCXU4IHRlbXBfaGlnaFszXTsKIAl1OCB0ZW1wX2h5c3RbM107CkBAIC0xNTEsNiArMTcyLDExIEBACiAJdW5zaWduZWQgbG9uZyBhbGFybXM7CiB9OwogCitzdHJ1Y3QgZjcxODA1Zl9zaW9fZGF0YSB7CisJZW51bSBraW5kcyBraW5kOworCXU4IGZuc2VsMTsKK307CisKIHN0YXRpYyBpbmxpbmUgbG9uZyBpbl9mcm9tX3JlZyh1OCByZWcpCiB7CiAJcmV0dXJuIChyZWcgKiA4KTsKQEAgLTIwMCw2ICsyMjYsMzMgQEAKIAlyZXR1cm4gKDE1MDAwMDAgLyBycG0pOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHdtX2ZyZXFfZnJvbV9yZWcodTggcmVnKQoreworCXVuc2lnbmVkIGxvbmcgY2xvY2sgPSAocmVnICYgMHg4MCkgPyA0ODAwMDAwMFVMIDogMTAwMDAwMFVMOworCisJcmVnICY9IDB4N2Y7CisJaWYgKHJlZyA9PSAwKQorCQlyZWcrKzsKKwlyZXR1cm4gY2xvY2sgLyAocmVnIDw8IDgpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHB3bV9mcmVxX3RvX3JlZyh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlpZiAodmFsID49IDE4NzUwMCkJLyogVGhlIGhpZ2hlc3Qgd2UgY2FuIGRvICovCisJCXJldHVybiAweDgwOworCWlmICh2YWwgPj0gMTQ3NSkJLyogVXNlIDQ4IE1IeiBjbG9jayAqLworCQlyZXR1cm4gMHg4MCB8ICg0ODAwMDAwMFVMIC8gKHZhbCA8PCA4KSk7CisJaWYgKHZhbCA8IDMxKQkJLyogVGhlIGxvd2VzdCB3ZSBjYW4gZG8gKi8KKwkJcmV0dXJuIDB4N2Y7CisJZWxzZQkJCS8qIFVzZSAxIE1IeiBjbG9jayAqLworCQlyZXR1cm4gMTAwMDAwMFVMIC8gKHZhbCA8PCA4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHdtX21vZGVfZnJvbV9yZWcodTggcmVnKQoreworCXJldHVybiAhKHJlZyAmIEZBTl9DVFJMX0RDX01PREUpOworfQorCiBzdGF0aWMgaW5saW5lIGxvbmcgdGVtcF9mcm9tX3JlZyh1OCByZWcpCiB7CiAJcmV0dXJuIChyZWcgKiAxMDAwKTsKQEAgLTI3NCwxNiArMzI3LDIxIEBACiAJLyogTGltaXQgcmVnaXN0ZXJzIGNhY2hlIGlzIHJlZnJlc2hlZCBhZnRlciA2MCBzZWNvbmRzICovCiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgNjAgKiBIWikKIAkgfHwgIWRhdGEtPnZhbGlkKSB7Ci0JCWZvciAobnIgPSAwOyBuciA8IDk7IG5yKyspIHsKKwkJZm9yIChuciA9IDA7IG5yIDwgMTE7IG5yKyspIHsKKwkJCWlmICghKGRhdGEtPmhhc19pbiAmICgxIDw8IG5yKSkpCisJCQkJY29udGludWU7CiAJCQlkYXRhLT5pbl9oaWdoW25yXSA9IGY3MTgwNWZfcmVhZDgoZGF0YSwKIAkJCQkJICAgIEY3MTgwNUZfUkVHX0lOX0hJR0gobnIpKTsKIAkJCWRhdGEtPmluX2xvd1tucl0gPSBmNzE4MDVmX3JlYWQ4KGRhdGEsCiAJCQkJCSAgIEY3MTgwNUZfUkVHX0lOX0xPVyhucikpOwogCQl9CiAJCWZvciAobnIgPSAwOyBuciA8IDM7IG5yKyspIHsKLQkJCWlmIChkYXRhLT5mYW5fZW5hYmxlZCAmICgxIDw8IG5yKSkKLQkJCQlkYXRhLT5mYW5fbG93W25yXSA9IGY3MTgwNWZfcmVhZDE2KGRhdGEsCi0JCQkJCQkgICAgRjcxODA1Rl9SRUdfRkFOX0xPVyhucikpOworCQkJZGF0YS0+ZmFuX2xvd1tucl0gPSBmNzE4MDVmX3JlYWQxNihkYXRhLAorCQkJCQkgICAgRjcxODA1Rl9SRUdfRkFOX0xPVyhucikpOworCQkJZGF0YS0+ZmFuX3RhcmdldFtucl0gPSBmNzE4MDVmX3JlYWQxNihkYXRhLAorCQkJCQkgICAgICAgRjcxODA1Rl9SRUdfRkFOX1RBUkdFVChucikpOworCQkJZGF0YS0+cHdtX2ZyZXFbbnJdID0gZjcxODA1Zl9yZWFkOChkYXRhLAorCQkJCQkgICAgIEY3MTgwNUZfUkVHX1BXTV9GUkVRKG5yKSk7CiAJCX0KIAkJZm9yIChuciA9IDA7IG5yIDwgMzsgbnIrKykgewogCQkJZGF0YS0+dGVtcF9oaWdoW25yXSA9IGY3MTgwNWZfcmVhZDgoZGF0YSwKQEAgLTI5OSwxNCArMzU3LDE5IEBACiAJLyogTWVhc3VyZW1lbnQgcmVnaXN0ZXJzIGNhY2hlIGlzIHJlZnJlc2hlZCBhZnRlciAxIHNlY29uZCAqLwogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKQogCSB8fCAhZGF0YS0+dmFsaWQpIHsKLQkJZm9yIChuciA9IDA7IG5yIDwgOTsgbnIrKykgeworCQlmb3IgKG5yID0gMDsgbnIgPCAxMTsgbnIrKykgeworCQkJaWYgKCEoZGF0YS0+aGFzX2luICYgKDEgPDwgbnIpKSkKKwkJCQljb250aW51ZTsKIAkJCWRhdGEtPmluW25yXSA9IGY3MTgwNWZfcmVhZDgoZGF0YSwKIAkJCQkgICAgICAgRjcxODA1Rl9SRUdfSU4obnIpKTsKIAkJfQogCQlmb3IgKG5yID0gMDsgbnIgPCAzOyBucisrKSB7Ci0JCQlpZiAoZGF0YS0+ZmFuX2VuYWJsZWQgJiAoMSA8PCBucikpCi0JCQkJZGF0YS0+ZmFuW25yXSA9IGY3MTgwNWZfcmVhZDE2KGRhdGEsCi0JCQkJCQlGNzE4MDVGX1JFR19GQU4obnIpKTsKKwkJCWRhdGEtPmZhbltucl0gPSBmNzE4MDVmX3JlYWQxNihkYXRhLAorCQkJCQlGNzE4MDVGX1JFR19GQU4obnIpKTsKKwkJCWRhdGEtPmZhbl9jdHJsW25yXSA9IGY3MTgwNWZfcmVhZDgoZGF0YSwKKwkJCQkJICAgICBGNzE4MDVGX1JFR19GQU5fQ1RSTChucikpOworCQkJZGF0YS0+cHdtW25yXSA9IGY3MTgwNWZfcmVhZDgoZGF0YSwKKwkJCQkJRjcxODA1Rl9SRUdfUFdNX0RVVFkobnIpKTsKIAkJfQogCQlmb3IgKG5yID0gMDsgbnIgPCAzOyBucisrKSB7CiAJCQlkYXRhLT50ZW1wW25yXSA9IGY3MTgwNWZfcmVhZDgoZGF0YSwKQEAgLTMzMywzNSArMzk2LDQzIEBACiAJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGY3MTgwNWZfZGF0YSAqZGF0YSA9IGY3MTgwNWZfdXBkYXRlX2RldmljZShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlpbnQgbnIgPSBhdHRyLT5pbmRleDsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgaW4wX2Zyb21fcmVnKGRhdGEtPmluWzBdKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBpbjBfZnJvbV9yZWcoZGF0YS0+aW5bbnJdKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfaW4wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJCQkgICAgKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODA1Zl9kYXRhICpkYXRhID0gZjcxODA1Zl91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCWludCBuciA9IGF0dHItPmluZGV4OwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBpbjBfZnJvbV9yZWcoZGF0YS0+aW5faGlnaFswXSkpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgaW4wX2Zyb21fcmVnKGRhdGEtPmluX2hpZ2hbbnJdKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfaW4wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJCQkgICAgKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODA1Zl9kYXRhICpkYXRhID0gZjcxODA1Zl91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCWludCBuciA9IGF0dHItPmluZGV4OwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBpbjBfZnJvbV9yZWcoZGF0YS0+aW5fbG93WzBdKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBpbjBfZnJvbV9yZWcoZGF0YS0+aW5fbG93W25yXSkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZXRfaW4wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJCQkgICAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGY3MTgwNWZfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlpbnQgbnIgPSBhdHRyLT5pbmRleDsKIAlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+aW5faGlnaFswXSA9IGluMF90b19yZWcodmFsKTsKLQlmNzE4MDVmX3dyaXRlOChkYXRhLCBGNzE4MDVGX1JFR19JTl9ISUdIKDApLCBkYXRhLT5pbl9oaWdoWzBdKTsKKwlkYXRhLT5pbl9oaWdoW25yXSA9IGluMF90b19yZWcodmFsKTsKKwlmNzE4MDVmX3dyaXRlOChkYXRhLCBGNzE4MDVGX1JFR19JTl9ISUdIKG5yKSwgZGF0YS0+aW5faGlnaFtucl0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMzcxLDExICs0NDIsMTMgQEAKIAkJCSAgICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODA1Zl9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCWludCBuciA9IGF0dHItPmluZGV4OwogCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT5pbl9sb3dbMF0gPSBpbjBfdG9fcmVnKHZhbCk7Ci0JZjcxODA1Zl93cml0ZTgoZGF0YSwgRjcxODA1Rl9SRUdfSU5fTE9XKDApLCBkYXRhLT5pbl9sb3dbMF0pOworCWRhdGEtPmluX2xvd1tucl0gPSBpbjBfdG9fcmVnKHZhbCk7CisJZjcxODA1Zl93cml0ZTgoZGF0YSwgRjcxODA1Rl9SRUdfSU5fTE9XKG5yKSwgZGF0YS0+aW5fbG93W25yXSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC00NjMsNiArNTM2LDE2IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBmYW5fZnJvbV9yZWcoZGF0YS0+ZmFuX2xvd1tucl0pKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCSAgICAgICAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmNzE4MDVmX2RhdGEgKmRhdGEgPSBmNzE4MDVmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJaW50IG5yID0gYXR0ci0+aW5kZXg7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGZhbl9mcm9tX3JlZyhkYXRhLT5mYW5fdGFyZ2V0W25yXSkpOworfQorCiBzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJCQkgICAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CkBAIC00NzksNiArNTYyLDE1NyBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl90YXJnZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJICAgICAgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4MDVmX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJaW50IG5yID0gYXR0ci0+aW5kZXg7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl90YXJnZXRbbnJdID0gZmFuX3RvX3JlZyh2YWwpOworCWY3MTgwNWZfd3JpdGUxNihkYXRhLCBGNzE4MDVGX1JFR19GQU5fVEFSR0VUKG5yKSwKKwkJCWRhdGEtPmZhbl90YXJnZXRbbnJdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZjcxODA1Zl9kYXRhICpkYXRhID0gZjcxODA1Zl91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCWludCBuciA9IGF0dHItPmluZGV4OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChpbnQpZGF0YS0+cHdtW25yXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJCQkgICAgICAgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZjcxODA1Zl9kYXRhICpkYXRhID0gZjcxODA1Zl91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCWludCBuciA9IGF0dHItPmluZGV4OworCWludCBtb2RlOworCisJc3dpdGNoIChkYXRhLT5mYW5fY3RybFtucl0gJiBGQU5fQ1RSTF9NT0RFX01BU0spIHsKKwljYXNlIEZBTl9DVFJMX01PREVfU1BFRUQ6CisJCW1vZGUgPSAzOworCQlicmVhazsKKwljYXNlIEZBTl9DVFJMX01PREVfVEVNUEVSQVRVUkU6CisJCW1vZGUgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBNQU5VQUwgKi8KKwkJbW9kZSA9IDE7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIG1vZGUpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9mcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCSAgICAgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZjcxODA1Zl9kYXRhICpkYXRhID0gZjcxODA1Zl91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCWludCBuciA9IGF0dHItPmluZGV4OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBwd21fZnJlcV9mcm9tX3JlZyhkYXRhLT5wd21fZnJlcVtucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd21fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJCQkgICAgICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGY3MTgwNWZfZGF0YSAqZGF0YSA9IGY3MTgwNWZfdXBkYXRlX2RldmljZShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlpbnQgbnIgPSBhdHRyLT5pbmRleDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwd21fbW9kZV9mcm9tX3JlZyhkYXRhLT5mYW5fY3RybFtucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGY3MTgwNWZfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlpbnQgbnIgPSBhdHRyLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJaWYgKHZhbCA+IDI1NSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtW25yXSA9IHZhbDsKKwlmNzE4MDVmX3dyaXRlOChkYXRhLCBGNzE4MDVGX1JFR19QV01fRFVUWShuciksIGRhdGEtPnB3bVtucl0pOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZjcxODA1Zl9hdHRyX3B3bVtdOworCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJCQkgICAgICAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGY3MTgwNWZfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlpbnQgbnIgPSBhdHRyLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXU4IHJlZzsKKworCWlmICh2YWwgPCAxIHx8IHZhbCA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhbCA+IDEpIHsgLyogQXV0b21hdGljIG1vZGUsIHVzZXIgY2FuJ3Qgc2V0IFBXTSB2YWx1ZSAqLworCQlpZiAoc3lzZnNfY2htb2RfZmlsZSgmZGV2LT5rb2JqLCBmNzE4MDVmX2F0dHJfcHdtW25yXSwKKwkJCQkgICAgIFNfSVJVR08pKQorCQkJZGV2X2RiZyhkZXYsICJjaG1vZCAtdyBwd20lZCBmYWlsZWRcbiIsIG5yICsgMSk7CisJfQorCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJlZyA9IGY3MTgwNWZfcmVhZDgoZGF0YSwgRjcxODA1Rl9SRUdfRkFOX0NUUkwobnIpKQorCSAgICAmIH5GQU5fQ1RSTF9NT0RFX01BU0s7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6CisJCXJlZyB8PSBGQU5fQ1RSTF9NT0RFX01BTlVBTDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZWcgfD0gRkFOX0NUUkxfTU9ERV9URU1QRVJBVFVSRTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlyZWcgfD0gRkFOX0NUUkxfTU9ERV9TUEVFRDsKKwkJYnJlYWs7CisJfQorCWRhdGEtPmZhbl9jdHJsW25yXSA9IHJlZzsKKwlmNzE4MDVmX3dyaXRlOChkYXRhLCBGNzE4MDVGX1JFR19GQU5fQ1RSTChuciksIHJlZyk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodmFsID09IDEpIHsgLyogTWFudWFsIG1vZGUsIHVzZXIgY2FuIHNldCBQV00gdmFsdWUgKi8KKwkJaWYgKHN5c2ZzX2NobW9kX2ZpbGUoJmRldi0+a29iaiwgZjcxODA1Zl9hdHRyX3B3bVtucl0sCisJCQkJICAgICBTX0lSVUdPIHwgU19JV1VTUikpCisJCQlkZXZfZGJnKGRldiwgImNobW9kICt3IHB3bSVkIGZhaWxlZFxuIiwgbnIgKyAxKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9wd21fZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJCQkgICAgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4MDVmX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJaW50IG5yID0gYXR0ci0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21fZnJlcVtucl0gPSBwd21fZnJlcV90b19yZWcodmFsKTsKKwlmNzE4MDVmX3dyaXRlOChkYXRhLCBGNzE4MDVGX1JFR19QV01fRlJFUShuciksIGRhdGEtPnB3bV9mcmVxW25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCQkJIGNoYXIgKmJ1ZikKIHsKQEAgLTU1Nyw3ICs3OTEsNyBAQAogewogCXN0cnVjdCBmNzE4MDVmX2RhdGEgKmRhdGEgPSBmNzE4MDVmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgZGF0YS0+YWxhcm1zICYgMHgxZmYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgZGF0YS0+YWxhcm1zICYgMHg3ZmYpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtc19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQpAQCAtNTk0LDkgKzgyOCwxMSBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBkYXRhLT5uYW1lKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbjAsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGluMF9tYXgsIFNfSVJVR098IFNfSVdVU1IsIHNob3dfaW4wX21heCwgc2V0X2luMF9tYXgpOwotc3RhdGljIERFVklDRV9BVFRSKGluMF9taW4sIFNfSVJVR098IFNfSVdVU1IsIHNob3dfaW4wX21pbiwgc2V0X2luMF9taW4pOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4wLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX21heCwgU19JUlVHT3wgU19JV1VTUiwKKwkJCSAgc2hvd19pbjBfbWF4LCBzZXRfaW4wX21heCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMF9taW4sIFNfSVJVR098IFNfSVdVU1IsCisJCQkgIHNob3dfaW4wX21pbiwgc2V0X2luMF9taW4sIDApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDEpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJCSAgc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDEpOwpAQCAtNjM3LDE2ICs4NzMsMzIgQEAKIAkJCSAgc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDgpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjhfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJCSAgc2hvd19pbl9taW4sIHNldF9pbl9taW4sIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjlfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4wLCBOVUxMLCA5KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW45X21heCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgIHNob3dfaW4wX21heCwgc2V0X2luMF9tYXgsIDkpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjlfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgc2hvd19pbjBfbWluLCBzZXRfaW4wX21pbiwgOSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4wLCBOVUxMLCAxMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTBfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgc2hvd19pbjBfbWF4LCBzZXRfaW4wX21heCwgMTApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjEwX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgIHNob3dfaW4wX21pbiwgc2V0X2luMF9taW4sIDEwKTsKIAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJCSAgc2hvd19mYW5fbWluLCBzZXRfZmFuX21pbiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfdGFyZ2V0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgc2hvd19mYW5fdGFyZ2V0LCBzZXRfZmFuX3RhcmdldCwgMCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAxKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9taW4sIFNfSVJVR08gfCBTX0lXVVNSLAogCQkJICBzaG93X2Zhbl9taW4sIHNldF9mYW5fbWluLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl90YXJnZXQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICBzaG93X2Zhbl90YXJnZXQsIHNldF9mYW5fdGFyZ2V0LCAxKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX3RhcmdldCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgIHNob3dfZmFuX3RhcmdldCwgc2V0X2Zhbl90YXJnZXQsIDIpOwogCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLApAQCAtNjY3LDYgKzkxOSwyNyBAQAogCQkgICAgc2hvd190ZW1wX2h5c3QsIHNldF90ZW1wX2h5c3QsIDIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM190eXBlLCBTX0lSVUdPLCBzaG93X3RlbXBfdHlwZSwgTlVMTCwgMik7CiAKKy8qIHB3bSAodmFsdWUpIGZpbGVzIGFyZSBjcmVhdGVkIHJlYWQtb25seSwgd3JpdGUgcGVybWlzc2lvbiBpcworICAgdGhlbiBhZGRlZCBvciByZW1vdmVkIGR5bmFtaWNhbGx5IGFzIG5lZWRlZCAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdPLCBzaG93X3B3bSwgc2V0X3B3bSwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTFfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgc2hvd19wd21fZW5hYmxlLCBzZXRfcHdtX2VuYWJsZSwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTFfZnJlcSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgIHNob3dfcHdtX2ZyZXEsIHNldF9wd21fZnJlcSwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTFfbW9kZSwgU19JUlVHTywgc2hvd19wd21fbW9kZSwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTIsIFNfSVJVR08sIHNob3dfcHdtLCBzZXRfcHdtLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICBzaG93X3B3bV9lbmFibGUsIHNldF9wd21fZW5hYmxlLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9mcmVxLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgc2hvd19wd21fZnJlcSwgc2V0X3B3bV9mcmVxLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9tb2RlLCBTX0lSVUdPLCBzaG93X3B3bV9tb2RlLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMywgU19JUlVHTywgc2hvd19wd20sIHNldF9wd20sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20zX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgIHNob3dfcHdtX2VuYWJsZSwgc2V0X3B3bV9lbmFibGUsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20zX2ZyZXEsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICBzaG93X3B3bV9mcmVxLCBzZXRfcHdtX2ZyZXEsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20zX21vZGUsIFNfSVJVR08sIHNob3dfcHdtX21vZGUsIE5VTEwsIDIpOworCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMSk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMik7CkBAIC02NzYsNiArOTQ5LDggQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW42X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA2KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW43X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA3KTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW44X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW45X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA5KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTMpOwpAQCAtNjg5LDkgKzk2NCw5IEBACiBzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19uYW1lLCBOVUxMKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmY3MTgwNWZfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9pbjBfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW4wX21heC5hdHRyLAotCSZkZXZfYXR0cl9pbjBfbWluLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9taW4uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21pbi5kZXZfYXR0ci5hdHRyLApAQCAtNzAxLDkgKzk3Niw2IEBACiAJJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luM19tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luM19taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW40X21heC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW40X21pbi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWluLmRldl9hdHRyLmF0dHIsCkBAIC03MTMsOSArOTg1LDI5IEBACiAJJnNlbnNvcl9kZXZfYXR0cl9pbjdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luN19tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luN19taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X21heC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X21pbi5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV90YXJnZXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX3RhcmdldC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfdGFyZ2V0LmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTFfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20xX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTIuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTJfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20yX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTMuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20zX21vZGUuZGV2X2F0dHIuYXR0ciwKIAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLApAQCAtNzM0LDExICsxMDI2LDkgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2luMV9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW41X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjZfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luN19hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJmRldl9hdHRyX2FsYXJtc19pbi5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2FsYXJtLmRldl9hdHRyLmF0dHIsCkBAIC03NTQsMjkgKzEwNDQsNTkgQEAKIAkuYXR0cnMgPSBmNzE4MDVmX2F0dHJpYnV0ZXMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZjcxODA1Zl9hdHRyaWJ1dGVzX2ZhblszXVs0XSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmNzE4MDVmX2F0dHJpYnV0ZXNfb3B0aW5bNF1bNV0gPSB7CiAJewotCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX21pbi5kZXZfYXR0ci5hdHRyLAotCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9pbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWF4LmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfaW40X21pbi5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2luNF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCQlOVUxMCiAJfSwgewotCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX21pbi5kZXZfYXR0ci5hdHRyLAotCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9pbjhfbWF4LmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfaW44X21pbi5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2luOF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCQlOVUxMCiAJfSwgewotCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX21pbi5kZXZfYXR0ci5hdHRyLAotCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9pbjlfbWF4LmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfaW45X21pbi5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2luOV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCQlOVUxMCisJfSwgeworCQkmc2Vuc29yX2Rldl9hdHRyX2luMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9pbjEwX21heC5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2luMTBfbWluLmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfaW4xMF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCQlOVUxMCiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZjcxODA1Zl9ncm91cF9mYW5bM10gPSB7Ci0JeyAuYXR0cnMgPSBmNzE4MDVmX2F0dHJpYnV0ZXNfZmFuWzBdIH0sCi0JeyAuYXR0cnMgPSBmNzE4MDVmX2F0dHJpYnV0ZXNfZmFuWzFdIH0sCi0JeyAuYXR0cnMgPSBmNzE4MDVmX2F0dHJpYnV0ZXNfZmFuWzJdIH0sCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmNzE4MDVmX2dyb3VwX29wdGluWzRdID0geworCXsgLmF0dHJzID0gZjcxODA1Zl9hdHRyaWJ1dGVzX29wdGluWzBdIH0sCisJeyAuYXR0cnMgPSBmNzE4MDVmX2F0dHJpYnV0ZXNfb3B0aW5bMV0gfSwKKwl7IC5hdHRycyA9IGY3MTgwNWZfYXR0cmlidXRlc19vcHRpblsyXSB9LAorCXsgLmF0dHJzID0gZjcxODA1Zl9hdHRyaWJ1dGVzX29wdGluWzNdIH0sCit9OworCisvKiBXZSBkb24ndCBpbmNsdWRlIHB3bV9mcmVxIGZpbGVzIGluIHRoZSBhcnJheXMgYWJvdmUsIGJlY2F1c2UgdGhleSBtdXN0IGJlCisgICBjcmVhdGVkIGNvbmRpdGlvbmFsbHkgKG9ubHkgaWYgcHdtX21vZGUgaXMgMSA9PSBQV00pICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZjcxODA1Zl9hdHRyaWJ1dGVzX3B3bV9mcmVxW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9wd20xX2ZyZXEuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTJfZnJlcS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtM19mcmVxLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZjcxODA1Zl9ncm91cF9wd21fZnJlcSA9IHsKKwkuYXR0cnMgPSBmNzE4MDVmX2F0dHJpYnV0ZXNfcHdtX2ZyZXEsCit9OworCisvKiBXZSBhbHNvIG5lZWQgYW4gaW5kZXhlZCBhY2Nlc3MgdG8gcHdtTiBmaWxlcyB0byB0b2dnbGUgd3JpdGFiaWxpdHkgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmNzE4MDVmX2F0dHJfcHdtW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20zLmRldl9hdHRyLmF0dHIsCiB9OwogCiAvKgpAQCAtNzk4LDE4ICsxMTE4LDMwIEBACiAJLyogRmFuIG1vbml0b3JpbmcgY2FuIGJlIGRpc2FibGVkLiBJZiBpdCBpcywgd2Ugd29uJ3QgYmUgcG9sbGluZwogCSAgIHRoZSByZWdpc3RlciB2YWx1ZXMsIGFuZCB3b24ndCBjcmVhdGUgdGhlIHJlbGF0ZWQgc3lzZnMgZmlsZXMuICovCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlyZWcgPSBmNzE4MDVmX3JlYWQ4KGRhdGEsIEY3MTgwNUZfUkVHX0ZBTl9DVFJMKGkpKTsKLQkJaWYgKCEocmVnICYgMHg4MCkpCi0JCQlkYXRhLT5mYW5fZW5hYmxlZCB8PSAoMSA8PCBpKTsKKwkJZGF0YS0+ZmFuX2N0cmxbaV0gPSBmNzE4MDVmX3JlYWQ4KGRhdGEsCisJCQkJCQkgIEY3MTgwNUZfUkVHX0ZBTl9DVFJMKGkpKTsKKwkJLyogQ2xlYXIgbGF0Y2ggZnVsbCBiaXQsIGVsc2UgInNwZWVkIG1vZGUiIGZhbiBzcGVlZCBjb250cm9sCisJCSAgIGRvZXNuJ3Qgd29yayAqLworCQlpZiAoZGF0YS0+ZmFuX2N0cmxbaV0gJiBGQU5fQ1RSTF9MQVRDSF9GVUxMKSB7CisJCQlkYXRhLT5mYW5fY3RybFtpXSAmPSB+RkFOX0NUUkxfTEFUQ0hfRlVMTDsKKwkJCWY3MTgwNWZfd3JpdGU4KGRhdGEsIEY3MTgwNUZfUkVHX0ZBTl9DVFJMKGkpLAorCQkJCSAgICAgICBkYXRhLT5mYW5fY3RybFtpXSk7CisJCX0KIAl9CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGY3MTgwNWZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgZjcxODA1Zl9zaW9fZGF0YSAqc2lvX2RhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgZjcxODA1Zl9kYXRhICpkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCBpLCBlcnI7CiAKKwlzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsKKwkJImY3MTgwNWYiLAorCQkiZjcxODcyZiIsCisJfTsKKwogCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZjcxODA1Zl9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IE91dCBvZiBtZW1vcnlcbiIpOwpAQCAtODE5LDI0ICsxMTUxLDY5IEBACiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwogCWRhdGEtPmFkZHIgPSByZXMtPnN0YXJ0OwogCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOwotCWRhdGEtPm5hbWUgPSAiZjcxODA1ZiI7CisJZGF0YS0+bmFtZSA9IG5hbWVzW3Npb19kYXRhLT5raW5kXTsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKIAorCS8qIFNvbWUgdm9sdGFnZSBpbnB1dHMgZGVwZW5kIG9uIGNoaXAgbW9kZWwgYW5kIGNvbmZpZ3VyYXRpb24gKi8KKwlzd2l0Y2ggKHNpb19kYXRhLT5raW5kKSB7CisJY2FzZSBmNzE4MDVmOgorCQlkYXRhLT5oYXNfaW4gPSAweDFmZjsKKwkJYnJlYWs7CisJY2FzZSBmNzE4NzJmOgorCQlkYXRhLT5oYXNfaW4gPSAweDZlZjsKKwkJaWYgKHNpb19kYXRhLT5mbnNlbDEgJiAweDAxKQorCQkJZGF0YS0+aGFzX2luIHw9ICgxIDw8IDQpOyAvKiBpbjQgKi8KKwkJaWYgKHNpb19kYXRhLT5mbnNlbDEgJiAweDAyKQorCQkJZGF0YS0+aGFzX2luIHw9ICgxIDw8IDgpOyAvKiBpbjggKi8KKwkJYnJlYWs7CisJfQorCiAJLyogSW5pdGlhbGl6ZSB0aGUgRjcxODA1RiBjaGlwICovCiAJZjcxODA1Zl9pbml0X2RldmljZShkYXRhKTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGludGVyZmFjZSBmaWxlcyAqLwogCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmY3MTgwNWZfZ3JvdXApKSkKIAkJZ290byBleGl0X2ZyZWU7Ci0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpZiAoIShkYXRhLT5mYW5fZW5hYmxlZCAmICgxIDw8IGkpKSkKLQkJCWNvbnRpbnVlOworCWlmIChkYXRhLT5oYXNfaW4gJiAoMSA8PCA0KSkgeyAvKiBpbjQgKi8KIAkJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLAotCQkJCQkgICAgICAmZjcxODA1Zl9ncm91cF9mYW5baV0pKSkKKwkJCQkJICAgICAgJmY3MTgwNWZfZ3JvdXBfb3B0aW5bMF0pKSkKIAkJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CiAJfQorCWlmIChkYXRhLT5oYXNfaW4gJiAoMSA8PCA4KSkgeyAvKiBpbjggKi8KKwkJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLAorCQkJCQkgICAgICAmZjcxODA1Zl9ncm91cF9vcHRpblsxXSkpKQorCQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKKwl9CisJaWYgKGRhdGEtPmhhc19pbiAmICgxIDw8IDkpKSB7IC8qIGluOSAoRjcxODcyRi9GRyBvbmx5KSAqLworCQlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCisJCQkJCSAgICAgICZmNzE4MDVmX2dyb3VwX29wdGluWzJdKSkpCisJCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOworCX0KKwlpZiAoZGF0YS0+aGFzX2luICYgKDEgPDwgMTApKSB7IC8qIGluOSAoRjcxODcyRi9GRyBvbmx5KSAqLworCQlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCisJCQkJCSAgICAgICZmNzE4MDVmX2dyb3VwX29wdGluWzNdKSkpCisJCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCS8qIElmIGNvbnRyb2wgbW9kZSBpcyBQV00sIGNyZWF0ZSBwd21fZnJlcSBmaWxlICovCisJCWlmICghKGRhdGEtPmZhbl9jdHJsW2ldICYgRkFOX0NUUkxfRENfTU9ERSkpIHsKKwkJCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLAorCQkJCQlmNzE4MDVmX2F0dHJpYnV0ZXNfcHdtX2ZyZXFbaV0pKSkKKwkJCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOworCQl9CisJCS8qIElmIFBXTSBpcyBpbiBtYW51YWwgbW9kZSwgYWRkIHdyaXRlIHBlcm1pc3Npb24gKi8KKwkJaWYgKGRhdGEtPmZhbl9jdHJsW2ldICYgRkFOX0NUUkxfTU9ERV9NQU5VQUwpIHsKKwkJCWlmICgoZXJyID0gc3lzZnNfY2htb2RfZmlsZSgmcGRldi0+ZGV2LmtvYmosCisJCQkJCQkgICAgZjcxODA1Zl9hdHRyX3B3bVtpXSwKKwkJCQkJCSAgICBTX0lSVUdPIHwgU19JV1VTUikpKSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2htb2QgK3cgcHdtJWQgZmFpbGVkXG4iLAorCQkJCQlpICsgMSk7CisJCQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKKwkJCX0KKwkJfQorCX0KIAogCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2KTsKIAlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKQEAgLTg0OSw4ICsxMjI2LDkgQEAKIAogZXhpdF9yZW1vdmVfZmlsZXM6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmY3MTgwNWZfZ3JvdXApOwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZmNzE4MDVmX2dyb3VwX2ZhbltpXSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmY3MTgwNWZfZ3JvdXBfb3B0aW5baV0pOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZmNzE4MDVmX2dyb3VwX3B3bV9mcmVxKTsKIGV4aXRfZnJlZToKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlrZnJlZShkYXRhKTsKQEAgLTg2Niw4ICsxMjQ0LDkgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZmNzE4MDVmX2dyb3VwKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmZjcxODA1Zl9ncm91cF9mYW5baV0pOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZmNzE4MDVmX2dyb3VwX29wdGluW2ldKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmZjcxODA1Zl9ncm91cF9wd21fZnJlcSk7CiAJa2ZyZWUoZGF0YSk7CiAKIAlyZXR1cm4gMDsKQEAgLTg4Miw3ICsxMjYxLDggQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGY3MTgwNWZfcmVtb3ZlKSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGY3MTgwNWZfZGV2aWNlX2FkZCh1bnNpZ25lZCBzaG9ydCBhZGRyZXNzKQorc3RhdGljIGludCBfX2luaXQgZjcxODA1Zl9kZXZpY2VfYWRkKHVuc2lnbmVkIHNob3J0IGFkZHJlc3MsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZjcxODA1Zl9zaW9fZGF0YSAqc2lvX2RhdGEpCiB7CiAJc3RydWN0IHJlc291cmNlIHJlcyA9IHsKIAkJLnN0YXJ0CT0gYWRkcmVzcywKQEAgLTkwNiwyNiArMTI4Niw0NSBAQAogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKKwlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmNzE4MDVmX3Npb19kYXRhKSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CisJCWVyciA9IC1FTk9NRU07CisJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IFBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKKwl9CisJbWVtY3B5KHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhLCBzaW9fZGF0YSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBmNzE4MDVmX3Npb19kYXRhKSk7CisKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAogCQkgICAgICAgZXJyKTsKLQkJZ290byBleGl0X2RldmljZV9wdXQ7CisJCWdvdG8gZXhpdF9rZnJlZV9kYXRhOwogCX0KIAogCXJldHVybiAwOwogCitleGl0X2tmcmVlX2RhdGE6CisJa2ZyZWUocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKIGV4aXRfZGV2aWNlX3B1dDoKIAlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwogZXhpdDoKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBmNzE4MDVmX2ZpbmQoaW50IHNpb2FkZHIsIHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQorc3RhdGljIGludCBfX2luaXQgZjcxODA1Zl9maW5kKGludCBzaW9hZGRyLCB1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcywKKwkJCSAgICAgICBzdHJ1Y3QgZjcxODA1Zl9zaW9fZGF0YSAqc2lvX2RhdGEpCiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAJdTE2IGRldmlkOwogCisJc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzW10gPSB7CisJCSJGNzE4MDVGL0ZHIiwKKwkJIkY3MTg3MkYvRkciLAorCX07CisKIAlzdXBlcmlvX2VudGVyKHNpb2FkZHIpOwogCiAJZGV2aWQgPSBzdXBlcmlvX2ludyhzaW9hZGRyLCBTSU9fUkVHX01BTklEKTsKQEAgLTkzMyw3ICsxMzMyLDE1IEBACiAJCWdvdG8gZXhpdDsKIAogCWRldmlkID0gc3VwZXJpb19pbncoc2lvYWRkciwgU0lPX1JFR19ERVZJRCk7Ci0JaWYgKGRldmlkICE9IFNJT19GNzE4MDVGX0lEKSB7CisJc3dpdGNoIChkZXZpZCkgeworCWNhc2UgU0lPX0Y3MTgwNUZfSUQ6CisJCXNpb19kYXRhLT5raW5kID0gZjcxODA1ZjsKKwkJYnJlYWs7CisJY2FzZSBTSU9fRjcxODcyRl9JRDoKKwkJc2lvX2RhdGEtPmtpbmQgPSBmNzE4NzJmOworCQlzaW9fZGF0YS0+Zm5zZWwxID0gc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19GTlNFTDEpOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogVW5zdXBwb3J0ZWQgRmludGVrIGRldmljZSwgIgogCQkgICAgICAgInNraXBwaW5nXG4iKTsKIAkJZ290byBleGl0OwpAQCAtOTUyLDEwICsxMzU5LDEyIEBACiAJCSAgICAgICAic2tpcHBpbmdcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQorCSphZGRyZXNzICY9IH4oUkVHSU9OX0xFTkdUSCAtIDEpOwkvKiBJZ25vcmUgMyBMU0IgKi8KIAogCWVyciA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IEZvdW5kIEY3MTgwNUYgY2hpcCBhdCAlI3gsIHJldmlzaW9uICV1XG4iLAotCSAgICAgICAqYWRkcmVzcywgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZSRVYpKTsKKwlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgJXMgY2hpcCBhdCAlI3gsIHJldmlzaW9uICV1XG4iLAorCSAgICAgICBuYW1lc1tzaW9fZGF0YS0+a2luZF0sICphZGRyZXNzLAorCSAgICAgICBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVlJFVikpOwogCiBleGl0OgogCXN1cGVyaW9fZXhpdChzaW9hZGRyKTsKQEAgLTk2Niw5ICsxMzc1LDEwIEBACiB7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzOworCXN0cnVjdCBmNzE4MDVmX3Npb19kYXRhIHNpb19kYXRhOwogCi0JaWYgKGY3MTgwNWZfZmluZCgweDJlLCAmYWRkcmVzcykKLQkgJiYgZjcxODA1Zl9maW5kKDB4NGUsICZhZGRyZXNzKSkKKwlpZiAoZjcxODA1Zl9maW5kKDB4MmUsICZhZGRyZXNzLCAmc2lvX2RhdGEpCisJICYmIGY3MTgwNWZfZmluZCgweDRlLCAmYWRkcmVzcywgJnNpb19kYXRhKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmY3MTgwNWZfZHJpdmVyKTsKQEAgLTk3Niw3ICsxMzg2LDcgQEAKIAkJZ290byBleGl0OwogCiAJLyogU2V0cyBnbG9iYWwgcGRldiBhcyBhIHNpZGUgZWZmZWN0ICovCi0JZXJyID0gZjcxODA1Zl9kZXZpY2VfYWRkKGFkZHJlc3MpOworCWVyciA9IGY3MTgwNWZfZGV2aWNlX2FkZChhZGRyZXNzLCAmc2lvX2RhdGEpOwogCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9kcml2ZXI7CiAKQEAgLTk5MCwxMyArMTQwMCwxNiBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZjcxODA1Zl9leGl0KHZvaWQpCiB7CisJa2ZyZWUocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOworCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmNzE4MDVmX2RyaXZlcik7CiB9CiAKIE1PRFVMRV9BVVRIT1IoIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnI+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkY3MTgwNUYgaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRjcxODA1Ri9GNzE4NzJGIGhhcmR3YXJlIG1vbml0b3JpbmcgZHJpdmVyIik7CiAKIG1vZHVsZV9pbml0KGY3MTgwNWZfaW5pdCk7CiBtb2R1bGVfZXhpdChmNzE4MDVmX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9oZGFwcy5jIGIvZHJpdmVycy9od21vbi9oZGFwcy5jCmluZGV4IDI2YmU0ZWEuLmJmNzU5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaGRhcHMuYworKysgYi9kcml2ZXJzL2h3bW9uL2hkYXBzLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBIREFQU19MT1dfUE9SVAkJMHgxNjAwCS8qIGZpcnN0IHBvcnQgdXNlZCBieSBoZGFwcyAqLwpAQCAtNDc3LDc0ICs0NzgsNjQgQEAKIC8qIE1vZHVsZSBzdHVmZiAqLwogCiAvKiBoZGFwc19kbWlfbWF0Y2ggLSBmb3VuZCBhIG1hdGNoLiAgcmV0dXJuIG9uZSwgc2hvcnQtY2lyY3VpdGluZyB0aGUgaHVudC4gKi8KLXN0YXRpYyBpbnQgaGRhcHNfZG1pX21hdGNoKHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3N0YXRpYyBpbnQgX19pbml0IGhkYXBzX2RtaV9tYXRjaChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiaGRhcHM6ICVzIGRldGVjdGVkLlxuIiwgaWQtPmlkZW50KTsKIAlyZXR1cm4gMTsKIH0KIAogLyogaGRhcHNfZG1pX21hdGNoX2ludmVydCAtIGZvdW5kIGFuIGludmVydGVkIG1hdGNoLiAqLwotc3RhdGljIGludCBoZGFwc19kbWlfbWF0Y2hfaW52ZXJ0KHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3N0YXRpYyBpbnQgX19pbml0IGhkYXBzX2RtaV9tYXRjaF9pbnZlcnQoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQogewogCWhkYXBzX2ludmVydCA9IDE7CiAJcHJpbnRrKEtFUk5fSU5GTyAiaGRhcHM6IGludmVydGluZyBheGlzIHJlYWRpbmdzLlxuIik7CiAJcmV0dXJuIGhkYXBzX2RtaV9tYXRjaChpZCk7CiB9CiAKLSNkZWZpbmUgSERBUFNfRE1JX01BVENIX05PUk1BTChtb2RlbCkJewkJXAotCS5pZGVudCA9ICJJQk0gIiBtb2RlbCwJCQkJXAorI2RlZmluZSBIREFQU19ETUlfTUFUQ0hfTk9STUFMKHZlbmRvciwgbW9kZWwpIHsJCVwKKwkuaWRlbnQgPSB2ZW5kb3IgIiAiIG1vZGVsLAkJCVwKIAkuY2FsbGJhY2sgPSBoZGFwc19kbWlfbWF0Y2gsCQkJXAogCS5tYXRjaGVzID0gewkJCQkJXAotCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAlcCisJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCB2ZW5kb3IpLAlcCiAJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCBtb2RlbCkJXAogCX0JCQkJCQlcCiB9CiAKLSNkZWZpbmUgSERBUFNfRE1JX01BVENIX0lOVkVSVChtb2RlbCkJewkJXAotCS5pZGVudCA9ICJJQk0gIiBtb2RlbCwJCQkJXAorI2RlZmluZSBIREFQU19ETUlfTUFUQ0hfSU5WRVJUKHZlbmRvciwgbW9kZWwpIHsJCVwKKwkuaWRlbnQgPSB2ZW5kb3IgIiAiIG1vZGVsLAkJCVwKIAkuY2FsbGJhY2sgPSBoZGFwc19kbWlfbWF0Y2hfaW52ZXJ0LAkJXAogCS5tYXRjaGVzID0gewkJCQkJXAotCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAlcCisJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCB2ZW5kb3IpLAlcCiAJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCBtb2RlbCkJXAogCX0JCQkJCQlcCiB9CiAKLSNkZWZpbmUgSERBUFNfRE1JX01BVENIX0xFTk9WTyhtb2RlbCkgICB7ICAgICAgICAgICAgICAgXAotICAgICAgICAuaWRlbnQgPSAiTGVub3ZvICIgbW9kZWwsICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC5jYWxsYmFjayA9IGhkYXBzX2RtaV9tYXRjaF9pbnZlcnQsICAgICAgICAgICAgIFwKLSAgICAgICAgLm1hdGNoZXMgPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiTEVOT1ZPIiksICBcCi0gICAgICAgICAgICAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sIG1vZGVsKSAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorLyogTm90ZSB0aGF0IEhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIFQ0MiIpIHdvdWxkIG1hdGNoCisgICAiVGhpbmtQYWQgVDQycCIsIHNvIHRoZSBvcmRlciBvZiB0aGUgZW50cmllcyBtYXR0ZXJzLgorICAgSWYgeW91ciBUaGlua1BhZCBpcyBub3QgcmVjb2duaXplZCwgcGxlYXNlIHVwZGF0ZSB0byBsYXRlc3QKKyAgIEJJT1MuIFRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZSBmb3Igc29tZSBSNTIgVGhpbmtQYWRzLiAqLworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgaGRhcHNfd2hpdGVsaXN0W10gPSB7CisJSERBUFNfRE1JX01BVENIX0lOVkVSVCgiSUJNIiwgIlRoaW5rUGFkIFI1MHAiKSwKKwlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJJQk0iLCAiVGhpbmtQYWQgUjUwIiksCisJSERBUFNfRE1JX01BVENIX05PUk1BTCgiSUJNIiwgIlRoaW5rUGFkIFI1MSIpLAorCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIklCTSIsICJUaGlua1BhZCBSNTIiKSwKKwlIREFQU19ETUlfTUFUQ0hfSU5WRVJUKCJJQk0iLCAiVGhpbmtQYWQgVDQxcCIpLAorCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIklCTSIsICJUaGlua1BhZCBUNDEiKSwKKwlIREFQU19ETUlfTUFUQ0hfSU5WRVJUKCJJQk0iLCAiVGhpbmtQYWQgVDQycCIpLAorCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIklCTSIsICJUaGlua1BhZCBUNDIiKSwKKwlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJJQk0iLCAiVGhpbmtQYWQgVDQzIiksCisJSERBUFNfRE1JX01BVENIX0lOVkVSVCgiTEVOT1ZPIiwgIlRoaW5rUGFkIFQ2MCIpLAorCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIklCTSIsICJUaGlua1BhZCBYNDAiKSwKKwlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJJQk0iLCAiVGhpbmtQYWQgWDQxIiksCisJSERBUFNfRE1JX01BVENIX0lOVkVSVCgiTEVOT1ZPIiwgIlRoaW5rUGFkIFg2MCIpLAorCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIklCTSIsICJUaGlua1BhZCBaNjBtIiksCisJeyAuaWRlbnQgPSBOVUxMIH0KK307CiAKIHN0YXRpYyBpbnQgX19pbml0IGhkYXBzX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCi0JLyogTm90ZSB0aGF0IEhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIFQ0MiIpIHdvdWxkIG1hdGNoCi0JICAiVGhpbmtQYWQgVDQycCIsIHNvIHRoZSBvcmRlciBvZiB0aGUgZW50cmllcyBtYXR0ZXJzICovCi0Jc3RydWN0IGRtaV9zeXN0ZW1faWQgaGRhcHNfd2hpdGVsaXN0W10gPSB7Ci0JCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIEgiKSwKLQkJSERBUFNfRE1JX01BVENIX0lOVkVSVCgiVGhpbmtQYWQgUjUwcCIpLAotCQlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJUaGlua1BhZCBSNTAiKSwKLQkJSERBUFNfRE1JX01BVENIX05PUk1BTCgiVGhpbmtQYWQgUjUxIiksCi0JCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIFI1MiIpLAotCQlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJUaGlua1BhZCBIIiksCSAvKiBSNTIgKDE4NDZBUUcpICovCi0JCUhEQVBTX0RNSV9NQVRDSF9JTlZFUlQoIlRoaW5rUGFkIFQ0MXAiKSwKLQkJSERBUFNfRE1JX01BVENIX05PUk1BTCgiVGhpbmtQYWQgVDQxIiksCi0JCUhEQVBTX0RNSV9NQVRDSF9JTlZFUlQoIlRoaW5rUGFkIFQ0MnAiKSwKLQkJSERBUFNfRE1JX01BVENIX05PUk1BTCgiVGhpbmtQYWQgVDQyIiksCi0JCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIFQ0MyIpLAotCQlIREFQU19ETUlfTUFUQ0hfTEVOT1ZPKCJUaGlua1BhZCBUNjBwIiksCi0JCUhEQVBTX0RNSV9NQVRDSF9MRU5PVk8oIlRoaW5rUGFkIFQ2MCIpLAotCQlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJUaGlua1BhZCBYNDAiKSwKLQkJSERBUFNfRE1JX01BVENIX05PUk1BTCgiVGhpbmtQYWQgWDQxIiksCi0JCUhEQVBTX0RNSV9NQVRDSF9MRU5PVk8oIlRoaW5rUGFkIFg2MCIpLAotCQlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJUaGlua1BhZCBaNjBtIiksCi0JCXsgLmlkZW50ID0gTlVMTCB9Ci0JfTsKLQogCWlmICghZG1pX2NoZWNrX3N5c3RlbShoZGFwc193aGl0ZWxpc3QpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImhkYXBzOiBzdXBwb3J0ZWQgbGFwdG9wIG5vdCBmb3VuZCFcbiIpOwogCQlyZXQgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9od21vbi12aWQuYyBiL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKaW5kZXggOWQ2NzMyMC4uMzFjNDIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9od21vbi12aWQuYworKysgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAgICBod21vbi12aWQuYyAtIFZJRC9WUk0vVlJEIHZvbHRhZ2UgY29udmVyc2lvbnMKIAotICAgIENvcHlyaWdodCAoYykgMjAwNCBSdWRvbGYgTWFyZWsgPHIubWFyZWtAc2guY3Z1dC5jej4KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDQgUnVkb2xmIE1hcmVrIDxyLm1hcmVrQGFzc2VtYmxlci5jej4KIAogICAgIFBhcnRseSBpbXBvcnRlZCBmcm9tIGkyYy12aWQuaCBvZiB0aGUgbG1fc2Vuc29ycyBwcm9qZWN0CiAgICAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KQEAgLTIzMiw3ICsyMzIsNyBAQAogRVhQT1JUX1NZTUJPTCh2aWRfZnJvbV9yZWcpOwogRVhQT1JUX1NZTUJPTCh2aWRfd2hpY2hfdnJtKTsKIAotTU9EVUxFX0FVVEhPUigiUnVkb2xmIE1hcmVrIDxyLm1hcmVrQHNoLmN2dXQuY3o+Iik7CitNT0RVTEVfQVVUSE9SKCJSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PiIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oImh3bW9uLXZpZCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggMzIzZWYwNi4uMWVkOGI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTMsNyArMyw3IEBACiAgICAgICAgICAgICAgbW9uaXRvcmluZy4KIAogICAgIFN1cHBvcnRzOiBJVDg3MDVGICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgSVQ4NzEyRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlICYgU01CdXMKKyAgICAgICAgICAgICAgSVQ4NzEyRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgICAgICAgICAgICAgIElUODcxNkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICAgICAgICAgICAgICBJVDg3MThGICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKICAgICAgICAgICAgICAgU2lzOTUwICAgQSBjbG9uZSBvZiB0aGUgSVQ4NzA1RgpAQCAtNDEsMTIgKzQxLDggQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogCi0vKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyZCwgSTJDX0NMSUVOVF9FTkQgfTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpc2FfYWRkcmVzczsKLQotLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLUkyQ19DTElFTlRfSU5TTU9EXzQoaXQ4NywgaXQ4NzEyLCBpdDg3MTYsIGl0ODcxOCk7CitlbnVtIGNoaXBzIHsgaXQ4NywgaXQ4NzEyLCBpdDg3MTYsIGl0ODcxOCB9OwogCiAjZGVmaW5lCVJFRwkweDJlCS8qIFRoZSByZWdpc3RlciB0byByZWFkL3dyaXRlICovCiAjZGVmaW5lCURFVgkweDA3CS8qIFJlZ2lzdGVyOiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KQEAgLTE2Miw4ICsxNTgsNiBAQAogI2RlZmluZSBJVDg3X1JFR19URU1QX0hJR0gobnIpICgweDQwICsgKG5yKSAqIDIpCiAjZGVmaW5lIElUODdfUkVHX1RFTVBfTE9XKG5yKSAgKDB4NDEgKyAobnIpICogMikKIAotI2RlZmluZSBJVDg3X1JFR19JMkNfQUREUiAgICAgIDB4NDgKLQogI2RlZmluZSBJVDg3X1JFR19WSU5fRU5BQkxFICAgIDB4NTAKICNkZWZpbmUgSVQ4N19SRUdfVEVNUF9FTkFCTEUgICAweDUxCiAKQEAgLTI0MiwzMyArMjM2LDIyIEBACiB9OwogCiAKLXN0YXRpYyBpbnQgaXQ4N19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIGludCBpdDg3X2lzYV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIGludCBpdDg3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IGl0ODdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CiBzdGF0aWMgaW50IGl0ODdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKIAogc3RhdGljIGludCBpdDg3X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKLXN0YXRpYyBpbnQgaXQ4N193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKTsKK3N0YXRpYyB2b2lkIGl0ODdfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSk7CiBzdGF0aWMgc3RydWN0IGl0ODdfZGF0YSAqaXQ4N191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGl0ODdfY2hlY2tfcHdtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogc3RhdGljIHZvaWQgaXQ4N19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhKTsKIAogCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXQ4N19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiaXQ4NyIsCi0JfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0lUODcsCi0JLmF0dGFjaF9hZGFwdGVyCT0gaXQ4N19hdHRhY2hfYWRhcHRlciwKLQkuZGV0YWNoX2NsaWVudAk9IGl0ODdfZGV0YWNoX2NsaWVudCwKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpdDg3X2lzYV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gIml0ODctaXNhIiwKIAl9LAotCS5hdHRhY2hfYWRhcHRlcgk9IGl0ODdfaXNhX2F0dGFjaF9hZGFwdGVyLAorCS5hdHRhY2hfYWRhcHRlcgk9IGl0ODdfZGV0ZWN0LAogCS5kZXRhY2hfY2xpZW50CT0gaXQ4N19kZXRhY2hfY2xpZW50LAogfTsKIApAQCAtODUwLDIyICs4MzMsNiBAQAogCS5hdHRycyA9IGl0ODdfYXR0cmlidXRlc19vcHQsCiB9OwogCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuOgotICAgICAqIGl0ODdfZHJpdmVyIGlzIGluc2VydGVkICh3aGVuIHRoaXMgbW9kdWxlIGlzIGxvYWRlZCksIGZvciBlYWNoCi0gICAgICAgYXZhaWxhYmxlIGFkYXB0ZXIKLSAgICAgKiB3aGVuIGEgbmV3IGFkYXB0ZXIgaXMgaW5zZXJ0ZWQgKGFuZCBpdDg3X2RyaXZlciBpcyBzdGlsbCBwcmVzZW50KSAqLwotc3RhdGljIGludCBpdDg3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCi0JCXJldHVybiAwOwotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgaXQ4N19kZXRlY3QpOwotfQotCi1zdGF0aWMgaW50IGl0ODdfaXNhX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gaXQ4N19kZXRlY3QoYWRhcHRlciwgaXNhX2FkZHJlc3MsIC0xKTsKLX0KLQogLyogU3VwZXJJTyBkZXRlY3Rpb24gLSB3aWxsIGNoYW5nZSBpc2FfYWRkcmVzcyBpZiBhIGNoaXAgaXMgZm91bmQgKi8KIHN0YXRpYyBpbnQgX19pbml0IGl0ODdfZmluZCh1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcykKIHsKQEAgLTkxNiwyOSArODgzLDIwIEBACiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19wcm9iZSAqLwotc3RhdGljIGludCBpdDg3X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgaXQ4N19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewotCWludCBpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwogCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7Ci0JY29uc3QgY2hhciAqbmFtZSA9ICIiOwotCWludCBpc19pc2EgPSBpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcik7CisJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgZW5hYmxlX3B3bV9pbnRlcmZhY2U7CiAKLQlpZiAoIWlzX2lzYSAmJiAKLQkgICAgIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCi0JCWdvdG8gRVJST1IwOwotCiAJLyogUmVzZXJ2ZSB0aGUgSVNBIHJlZ2lvbiAqLwotCWlmIChpc19pc2EpCi0JCWlmICghcmVxdWVzdF9yZWdpb24oYWRkcmVzcywgSVQ4N19FWFRFTlQsCi0JCQkJICAgIGl0ODdfaXNhX2RyaXZlci5kcml2ZXIubmFtZSkpCi0JCQlnb3RvIEVSUk9SMDsKLQotCS8qIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2UgY3JlYXRlIHRoZQotCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgotCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGl0ODdfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaXNhX2FkZHJlc3MsIElUODdfRVhURU5ULAorCQkJICAgIGl0ODdfaXNhX2RyaXZlci5kcml2ZXIubmFtZSkpeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gRVJST1IwOworCX0KIAogCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXQ4N19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC05NDYsODAgKzkwNCw0NiBAQAogCX0KIAogCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OwotCWlmIChpc19pc2EpCi0JCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOworCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOwogCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKLQluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGRyID0gaXNhX2FkZHJlc3M7CiAJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JbmV3X2NsaWVudC0+ZHJpdmVyID0gaXNfaXNhID8gJml0ODdfaXNhX2RyaXZlciA6ICZpdDg3X2RyaXZlcjsKLQluZXdfY2xpZW50LT5mbGFncyA9IDA7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJml0ODdfaXNhX2RyaXZlcjsKIAogCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCi0KLQlpZiAoa2luZCA8IDApIHsKLQkJaWYgKChpdDg3X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgSVQ4N19SRUdfQ09ORklHKSAmIDB4ODApCi0JCSAgfHwgKCFpc19pc2EKLQkJICAgJiYgaXQ4N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIElUODdfUkVHX0kyQ19BRERSKSAhPSBhZGRyZXNzKSkgewotCQkgICAJZXJyID0gLUVOT0RFVjsKLQkJCWdvdG8gRVJST1IyOwotCQl9CisJaWYgKChpdDg3X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgSVQ4N19SRUdfQ09ORklHKSAmIDB4ODApCisJIHx8IGl0ODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBJVDg3X1JFR19DSElQSUQpICE9IDB4OTApIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBFUlJPUjI7CiAJfQogCiAJLyogRGV0ZXJtaW5lIHRoZSBjaGlwIHR5cGUuICovCi0JaWYgKGtpbmQgPD0gMCkgewotCQlpID0gaXQ4N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIElUODdfUkVHX0NISVBJRCk7Ci0JCWlmIChpID09IDB4OTApIHsKLQkJCWtpbmQgPSBpdDg3OwotCQkJaWYgKGlzX2lzYSkgewotCQkJCXN3aXRjaCAoY2hpcF90eXBlKSB7Ci0JCQkJY2FzZSBJVDg3MTJGX0RFVklEOgotCQkJCQlraW5kID0gaXQ4NzEyOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElUODcxNkZfREVWSUQ6Ci0JCQkJCWtpbmQgPSBpdDg3MTY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVQ4NzE4Rl9ERVZJRDoKLQkJCQkJa2luZCA9IGl0ODcxODsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGtpbmQgPT0gMCkKLQkJCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAKLQkJCQkJIklnbm9yaW5nICdmb3JjZScgcGFyYW1ldGVyIGZvciB1bmtub3duIGNoaXAgYXQgIgotCQkJCQkiYWRhcHRlciAlZCwgYWRkcmVzcyAweCUwMnhcbiIsCi0JCQkJCWkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKLQkJCWVyciA9IC1FTk9ERVY7Ci0JCQlnb3RvIEVSUk9SMjsKLQkJfQotCX0KLQotCWlmIChraW5kID09IGl0ODcpIHsKLQkJbmFtZSA9ICJpdDg3IjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gaXQ4NzEyKSB7CisJc3dpdGNoIChjaGlwX3R5cGUpIHsKKwljYXNlIElUODcxMkZfREVWSUQ6CisJCWRhdGEtPnR5cGUgPSBpdDg3MTI7CiAJCW5hbWUgPSAiaXQ4NzEyIjsKLQl9IGVsc2UgaWYgKGtpbmQgPT0gaXQ4NzE2KSB7CisJCWJyZWFrOworCWNhc2UgSVQ4NzE2Rl9ERVZJRDoKKwkJZGF0YS0+dHlwZSA9IGl0ODcxNjsKIAkJbmFtZSA9ICJpdDg3MTYiOwotCX0gZWxzZSBpZiAoa2luZCA9PSBpdDg3MTgpIHsKKwkJYnJlYWs7CisJY2FzZSBJVDg3MThGX0RFVklEOgorCQlkYXRhLT50eXBlID0gaXQ4NzE4OwogCQluYW1lID0gIml0ODcxOCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRhdGEtPnR5cGUgPSBpdDg3OworCQluYW1lID0gIml0ODciOwogCX0KIAogCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KIAlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWUsIEkyQ19OQU1FX1NJWkUpOwotCWRhdGEtPnR5cGUgPSBraW5kOwotCWRhdGEtPnZhbGlkID0gMDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCiAJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCiAJCWdvdG8gRVJST1IyOwogCi0JaWYgKCFpc19pc2EpCi0JCWRldl9pbmZvKCZuZXdfY2xpZW50LT5kZXYsICJUaGUgSTJDIGludGVyZmFjZSB0byBJVDg3eHhGICIKLQkJCSAiaGFyZHdhcmUgbW9uaXRvcmluZyBjaGlwcyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgIgotCQkJICJyZXBvcnQgaWYgeW91IHN0aWxsIHJlbHkgb24gaXQuXG4iKTsKLQogCS8qIENoZWNrIFBXTSBjb25maWd1cmF0aW9uICovCiAJZW5hYmxlX3B3bV9pbnRlcmZhY2UgPSBpdDg3X2NoZWNrX3B3bShuZXdfY2xpZW50KTsKIApAQCAtMTEyOSw4ICsxMDUzLDcgQEAKIEVSUk9SMjoKIAlrZnJlZShkYXRhKTsKIEVSUk9SMToKLQlpZiAoaXNfaXNhKQotCQlyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBJVDg3X0VYVEVOVCk7CisJcmVsZWFzZV9yZWdpb24oaXNhX2FkZHJlc3MsIElUODdfRVhURU5UKTsKIEVSUk9SMDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTE0Nyw1MCArMTA3MCwzOSBAQAogCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCXJldHVybiBlcnI7CiAKLQlpZihpMmNfaXNfaXNhX2NsaWVudChjbGllbnQpKQotCQlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIElUODdfRVhURU5UKTsKKwlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIElUODdfRVhURU5UKTsKIAlrZnJlZShkYXRhKTsKIAogCXJldHVybiAwOwogfQogCi0vKiBUaGUgU01CdXMgbG9ja3MgaXRzZWxmLCBidXQgSVNBIGFjY2VzcyBtdXN0IGJlIGxvY2tlZCBleHBsaWNpdGx5ISAKLSAgIFdlIGRvbid0IHdhbnQgdG8gbG9jayB0aGUgd2hvbGUgSVNBIGJ1cywgc28gd2UgbG9jayBlYWNoIGNsaWVudAotICAgc2VwYXJhdGVseS4KKy8qIElTQSBhY2Nlc3MgbXVzdCBiZSBsb2NrZWQgZXhwbGljaXRseSEKICAgIFdlIGlnbm9yZSB0aGUgSVQ4NyBCVVNZIGZsYWcgYXQgdGhpcyBtb21lbnQgLSBpdCBjb3VsZCBsZWFkIHRvIGRlYWRsb2NrcywKICAgIHdvdWxkIHNsb3cgZG93biB0aGUgSVQ4NyBhY2Nlc3MgYW5kIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LiAqLwogc3RhdGljIGludCBpdDg3X3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQogewogCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQogCWludCByZXM7Ci0JaWYgKGkyY19pc19pc2FfY2xpZW50KGNsaWVudCkpIHsKLQkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7Ci0JCW91dGJfcChyZWcsIGNsaWVudC0+YWRkciArIElUODdfQUREUl9SRUdfT0ZGU0VUKTsKLQkJcmVzID0gaW5iX3AoY2xpZW50LT5hZGRyICsgSVQ4N19EQVRBX1JFR19PRkZTRVQpOwotCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwotCQlyZXR1cm4gcmVzOwotCX0gZWxzZQotCQlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCW91dGJfcChyZWcsIGNsaWVudC0+YWRkciArIElUODdfQUREUl9SRUdfT0ZGU0VUKTsKKwlyZXMgPSBpbmJfcChjbGllbnQtPmFkZHIgKyBJVDg3X0RBVEFfUkVHX09GRlNFVCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiByZXM7CiB9CiAKLS8qIFRoZSBTTUJ1cyBsb2NrcyBpdHNlbGYsIGJ1dCBJU0EgYWNjZXNzIG11c2UgYmUgbG9ja2VkIGV4cGxpY2l0bHkhIAotICAgV2UgZG9uJ3Qgd2FudCB0byBsb2NrIHRoZSB3aG9sZSBJU0EgYnVzLCBzbyB3ZSBsb2NrIGVhY2ggY2xpZW50Ci0gICBzZXBhcmF0ZWx5LgorLyogSVNBIGFjY2VzcyBtdXN0IGJlIGxvY2tlZCBleHBsaWNpdGx5IQogICAgV2UgaWdub3JlIHRoZSBJVDg3IEJVU1kgZmxhZyBhdCB0aGlzIG1vbWVudCAtIGl0IGNvdWxkIGxlYWQgdG8gZGVhZGxvY2tzLAogICAgd291bGQgc2xvdyBkb3duIHRoZSBJVDg3IGFjY2VzcyBhbmQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuICovCi1zdGF0aWMgaW50IGl0ODdfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3N0YXRpYyB2b2lkIGl0ODdfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKIHsKIAlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlpZiAoaTJjX2lzX2lzYV9jbGllbnQoY2xpZW50KSkgewotCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKLQkJb3V0Yl9wKHJlZywgY2xpZW50LT5hZGRyICsgSVQ4N19BRERSX1JFR19PRkZTRVQpOwotCQlvdXRiX3AodmFsdWUsIGNsaWVudC0+YWRkciArIElUODdfREFUQV9SRUdfT0ZGU0VUKTsKLQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJb3V0Yl9wKHJlZywgY2xpZW50LT5hZGRyICsgSVQ4N19BRERSX1JFR19PRkZTRVQpOworCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgSVQ4N19EQVRBX1JFR19PRkZTRVQpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiB9CiAKIC8qIFJldHVybiAxIGlmIGFuZCBvbmx5IGlmIHRoZSBQV00gaW50ZXJmYWNlIGlzIHNhZmUgdG8gdXNlICovCkBAIC0xNDI2LDI2ICsxMzM4LDE0IEBACiB7CiAJaW50IHJlczsKIAotCXJlcyA9IGkyY19hZGRfZHJpdmVyKCZpdDg3X2RyaXZlcik7Ci0JaWYgKHJlcykKKwlpZiAoKHJlcyA9IGl0ODdfZmluZCgmaXNhX2FkZHJlc3MpKSkKIAkJcmV0dXJuIHJlczsKLQotCWlmICghaXQ4N19maW5kKCZpc2FfYWRkcmVzcykpIHsKLQkJcmVzID0gaTJjX2lzYV9hZGRfZHJpdmVyKCZpdDg3X2lzYV9kcml2ZXIpOwotCQlpZiAocmVzKSB7Ci0JCQlpMmNfZGVsX2RyaXZlcigmaXQ4N19kcml2ZXIpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCX0KLQotCXJldHVybiAwOworCXJldHVybiBpMmNfaXNhX2FkZF9kcml2ZXIoJml0ODdfaXNhX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzbV9pdDg3X2V4aXQodm9pZCkKIHsKLQlpZiAoaXNhX2FkZHJlc3MpCi0JCWkyY19pc2FfZGVsX2RyaXZlcigmaXQ4N19pc2FfZHJpdmVyKTsKLQlpMmNfZGVsX2RyaXZlcigmaXQ4N19kcml2ZXIpOworCWkyY19pc2FfZGVsX2RyaXZlcigmaXQ4N19pc2FfZHJpdmVyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2s4dGVtcC5jIGIvZHJpdmVycy9od21vbi9rOHRlbXAuYwppbmRleCBmNThiNjRlLi41ZDhkMGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2s4dGVtcC5jCisrKyBiL2RyaXZlcnMvaHdtb24vazh0ZW1wLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogazh0ZW1wLmMgLSBMaW51eCBrZXJuZWwgbW9kdWxlIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJ1ZG9sZiBNYXJlayA8ci5tYXJla0Bhc3NlbWJsZXIuY3o+CiAgKgogICogSW5zcGlyZWQgZnJvbSB0aGUgdzgzNzg1IGFuZCBhbWQ3NTYgZHJpdmVycy4KICAqCkBAIC0yODYsNyArMjg2LDcgQEAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJms4dGVtcF9kcml2ZXIpOwogfQogCi1NT0RVTEVfQVVUSE9SKCJSdWRvbGYgTWFyZWsgPHIubWFyZWtAc2guY3Z1dC5jej4iKTsKK01PRFVMRV9BVVRIT1IoIlJ1ZG9sZiBNYXJlayA8ci5tYXJla0Bhc3NlbWJsZXIuY3o+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFNRCBLOCBjb3JlIHRlbXBlcmF0dXJlIG1vbml0b3IiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTc4LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwppbmRleCBhYzFiNzQ2Li43M2JjMmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzguYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwpAQCAtODE1LDE4ICs4MTUsMTggQEAKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCi0JcmVzID0gaTJjX2lzYV9hZGRfZHJpdmVyKCZsbTc4X2lzYV9kcml2ZXIpOwotCWlmIChyZXMpIHsKLQkJaTJjX2RlbF9kcml2ZXIoJmxtNzhfZHJpdmVyKTsKLQkJcmV0dXJuIHJlczsKLQl9CisJLyogRG9uJ3QgZXhpdCBpZiB0aGlzIG9uZSBmYWlscywgd2Ugc3RpbGwgd2FudCB0aGUgSTJDIHZhcmlhbnRzCisJICAgdG8gd29yayEgKi8KKwlpZiAoaTJjX2lzYV9hZGRfZHJpdmVyKCZsbTc4X2lzYV9kcml2ZXIpKQorCQlpc2FfYWRkcmVzcyA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNtX2xtNzhfZXhpdCh2b2lkKQogewotCWkyY19pc2FfZGVsX2RyaXZlcigmbG03OF9pc2FfZHJpdmVyKTsKKwlpZiAoaXNhX2FkZHJlc3MpCisJCWkyY19pc2FfZGVsX2RyaXZlcigmbG03OF9pc2FfZHJpdmVyKTsKIAlpMmNfZGVsX2RyaXZlcigmbG03OF9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BjODczNjAuYyBiL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jCmluZGV4IDNiOGI4MTkuLmM4YTIxYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jCkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogCQkJKGkmMHgwMikgPyAiZXh0ZXJuYWwiIDogImludGVybmFsIik7CiAKIAkJZGF0YS0+dmlkX2NvbmYgPSBjb25mcmVnWzNdOwotCQlkYXRhLT52cm0gPSA5MDsKKwkJZGF0YS0+dnJtID0gdmlkX3doaWNoX3ZybSgpOwogCX0KIAogCS8qIEZhbiBjbG9jayBkaXZpZGVycyBtYXkgYmUgbmVlZGVkIGJlZm9yZSBhbnkgZGF0YSBpcyByZWFkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYyBiL2RyaXZlcnMvaHdtb24vcGM4NzQyNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZmEyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYwpAQCAtMCwwICsxLDYyNyBAQAorLyoKKyAqICBwYzg3NDI3LmMgLSBoYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlciBmb3IgdGhlCisgKiAgICAgICAgICAgICAgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3NDI3IFN1cGVyLUkvTyBjaGlwCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2hpcHM6CisgKgorICogIENoaXAgICAgICAgICN2aW4gICAgI2ZhbiAgICAjcHdtICAgICN0ZW1wICAgZGV2aWQKKyAqICBQQzg3NDI3ICAgICAtICAgICAgIDggICAgICAgLSAgICAgICAtICAgICAgIDB4RjIKKyAqCisgKiAgVGhpcyBkcml2ZXIgYXNzdW1lcyB0aGF0IG5vIG1vcmUgdGhhbiBvbmUgY2hpcCBpcyBwcmVzZW50LgorICogIE9ubHkgZmFuIGlucHV0cyBhcmUgc3VwcG9ydGVkIHNvIGZhciwgYWx0aG91Z2ggdGhlIGNoaXAgY2FuIGRvIG11Y2ggbW9yZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKyNkZWZpbmUgRFJWTkFNRSAicGM4NzQyNyIKKworLyogVGhlIGxvY2sgbXV0ZXggcHJvdGVjdHMgYm90aCB0aGUgSS9PIGFjY2Vzc2VzIChuZWVkZWQgYmVjYXVzZSB0aGUKKyAgIGRldmljZSBpcyB1c2luZyBiYW5rZWQgcmVnaXN0ZXJzKSBhbmQgdGhlIHJlZ2lzdGVyIGNhY2hlIChuZWVkZWQgdG8ga2VlcAorICAgdGhlIGRhdGEgaW4gdGhlIHJlZ2lzdGVycyBhbmQgdGhlIGNhY2hlIGluIHN5bmMgYXQgYW55IHRpbWUpLiAqLworc3RydWN0IHBjODc0MjdfZGF0YSB7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBtdXRleCBsb2NrOworCWludCBhZGRyZXNzWzJdOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogaW4gamlmZmllcyAqLworCXU4IGZhbl9lbmFibGVkOwkJCS8qIGJpdCB2ZWN0b3IgKi8KKwl1MTYgZmFuWzhdOwkJCS8qIHJlZ2lzdGVyIHZhbHVlcyAqLworCXUxNiBmYW5fbWluWzhdOwkJCS8qIHJlZ2lzdGVyIHZhbHVlcyAqLworCXU4IGZhbl9zdGF0dXNbOF07CQkvKiByZWdpc3RlciB2YWx1ZXMgKi8KK307CisKKy8qCisgKiBTdXBlci1JL08gcmVnaXN0ZXJzIGFuZCBvcGVyYXRpb25zCisgKi8KKworI2RlZmluZSBTSU9SRUdfTERTRUwJMHgwNwkvKiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KKyNkZWZpbmUgU0lPUkVHX0RFVklECTB4MjAJLyogRGV2aWNlIElEICovCisjZGVmaW5lIFNJT1JFR19BQ1QJMHgzMAkvKiBEZXZpY2UgYWN0aXZhdGlvbiAqLworI2RlZmluZSBTSU9SRUdfTUFQCTB4NTAJLyogSS9PIG9yIG1lbW9yeSBtYXBwaW5nICovCisjZGVmaW5lIFNJT1JFR19JT0JBU0UJMHg2MAkvKiBJL08gYmFzZSBhZGRyZXNzICovCisKK3N0YXRpYyBjb25zdCB1OCBsb2dkZXZbMl0gPSB7IDB4MDksIDB4MTQgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpsb2dkZXZfc3RyWzJdID0geyBEUlZOQU1FICIgRk1DIiwgRFJWTkFNRSAiIEhNQyIgfTsKKyNkZWZpbmUgTERfRkFOCQkwCisjZGVmaW5lIExEX0lOCQkxCisjZGVmaW5lIExEX1RFTVAJCTEKKworc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fb3V0YihpbnQgc2lvYWRkciwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlvdXRiKHJlZywgc2lvYWRkcik7CisJb3V0Yih2YWwsIHNpb2FkZHIgKyAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3VwZXJpb19pbmIoaW50IHNpb2FkZHIsIGludCByZWcpCit7CisJb3V0YihyZWcsIHNpb2FkZHIpOworCXJldHVybiBpbmIoc2lvYWRkciArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19leGl0KGludCBzaW9hZGRyKQoreworCW91dGIoMHgwMiwgc2lvYWRkcik7CisJb3V0YigweDAyLCBzaW9hZGRyICsgMSk7Cit9CisKKy8qCisgKiBMb2dpY2FsIGRldmljZXMKKyAqLworCisjZGVmaW5lIFJFR0lPTl9MRU5HVEgJCTMyCisjZGVmaW5lIFBDODc0MjdfUkVHX0JBTksJMHgwZgorI2RlZmluZSBCQU5LX0ZNKG5yKQkJKG5yKQorI2RlZmluZSBCQU5LX0ZUKG5yKQkJKDB4MDggKyAobnIpKQorI2RlZmluZSBCQU5LX0ZDKG5yKQkJKDB4MTAgKyAobnIpICogMikKKworLyoKKyAqIEkvTyBhY2Nlc3MgZnVuY3Rpb25zCisgKi8KKworLyogbGRpIGlzIHRoZSBsb2dpY2FsIGRldmljZSBpbmRleCAqLworc3RhdGljIGlubGluZSBpbnQgcGM4NzQyN19yZWFkOChzdHJ1Y3QgcGM4NzQyN19kYXRhICpkYXRhLCB1OCBsZGksIHU4IHJlZykKK3sKKwlyZXR1cm4gaW5iKGRhdGEtPmFkZHJlc3NbbGRpXSArIHJlZyk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggZGF0YS0+bG9jayBoZWxkLCBleGNlcHQgZHVyaW5nIGluaXQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBjODc0MjdfcmVhZDhfYmFuayhzdHJ1Y3QgcGM4NzQyN19kYXRhICpkYXRhLCB1OCBsZGksCisJCQkJICAgICB1OCBiYW5rLCB1OCByZWcpCit7CisJb3V0YihiYW5rLCBkYXRhLT5hZGRyZXNzW2xkaV0gKyBQQzg3NDI3X1JFR19CQU5LKTsKKwlyZXR1cm4gaW5iKGRhdGEtPmFkZHJlc3NbbGRpXSArIHJlZyk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggZGF0YS0+bG9jayBoZWxkLCBleGNlcHQgZHVyaW5nIGluaXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDI3X3dyaXRlOF9iYW5rKHN0cnVjdCBwYzg3NDI3X2RhdGEgKmRhdGEsIHU4IGxkaSwKKwkJCQkgICAgICAgdTggYmFuaywgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlvdXRiKGJhbmssIGRhdGEtPmFkZHJlc3NbbGRpXSArIFBDODc0MjdfUkVHX0JBTkspOworCW91dGIodmFsdWUsIGRhdGEtPmFkZHJlc3NbbGRpXSArIHJlZyk7Cit9CisKKy8qCisgKiBGYW4gcmVnaXN0ZXJzIGFuZCBjb252ZXJzaW9ucworICovCisKKy8qIGZhbiBkYXRhIHJlZ2lzdGVycyBhcmUgMTYtYml0IHdpZGUgKi8KKyNkZWZpbmUgUEM4NzQyN19SRUdfRkFOCQkJMHgxMgorI2RlZmluZSBQQzg3NDI3X1JFR19GQU5fTUlOCQkweDE0CisjZGVmaW5lIFBDODc0MjdfUkVHX0ZBTl9TVEFUVVMJCTB4MTAKKworI2RlZmluZSBGQU5fU1RBVFVTX1NUQUxMCQkoMSA8PCAzKQorI2RlZmluZSBGQU5fU1RBVFVTX0xPU1BECQkoMSA8PCAxKQorI2RlZmluZSBGQU5fU1RBVFVTX01PTkVOCQkoMSA8PCAwKQorCisvKiBEZWRpY2F0ZWQgZnVuY3Rpb24gdG8gcmVhZCBhbGwgcmVnaXN0ZXJzIHJlbGF0ZWQgdG8gYSBnaXZlbiBmYW4gaW5wdXQuCisgICBUaGlzIHNhdmVzIHVzIHF1aXRlIGEgZmV3IGxvY2tzIGFuZCBiYW5rIHNlbGVjdGlvbnMuCisgICBNdXN0IGJlIGNhbGxlZCB3aXRoIGRhdGEtPmxvY2sgaGVsZC4KKyAgIG5yIGlzIGZyb20gMCB0byA3ICovCitzdGF0aWMgdm9pZCBwYzg3NDI3X3JlYWRhbGxfZmFuKHN0cnVjdCBwYzg3NDI3X2RhdGEgKmRhdGEsIHU4IG5yKQoreworCWludCBpb2Jhc2UgPSBkYXRhLT5hZGRyZXNzW0xEX0ZBTl07CisKKwlvdXRiKEJBTktfRk0obnIpLCBpb2Jhc2UgKyBQQzg3NDI3X1JFR19CQU5LKTsKKwlkYXRhLT5mYW5bbnJdID0gaW53KGlvYmFzZSArIFBDODc0MjdfUkVHX0ZBTik7CisJZGF0YS0+ZmFuX21pbltucl0gPSBpbncoaW9iYXNlICsgUEM4NzQyN19SRUdfRkFOX01JTik7CisJZGF0YS0+ZmFuX3N0YXR1c1tucl0gPSBpbmIoaW9iYXNlICsgUEM4NzQyN19SRUdfRkFOX1NUQVRVUyk7CisJLyogQ2xlYXIgZmFuIGFsYXJtIGJpdHMgKi8KKwlvdXRiKGRhdGEtPmZhbl9zdGF0dXNbbnJdLCBpb2Jhc2UgKyBQQzg3NDI3X1JFR19GQU5fU1RBVFVTKTsKK30KKworLyogVGhlIDIgTFNCIG9mIGZhbiBzcGVlZCByZWdpc3RlcnMgYXJlIHVzZWQgZm9yIHNvbWV0aGluZyBkaWZmZXJlbnQuCisgICBUaGUgYWN0dWFsIDIgTFNCIG9mIHRoZSBtZWFzdXJlbWVudHMgYXJlIG5vdCBhdmFpbGFibGUuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZmFuX2Zyb21fcmVnKHUxNiByZWcpCit7CisJcmVnICY9IDB4ZmZmYzsKKwlpZiAocmVnID09IDB4MDAwMCB8fCByZWcgPT0gMHhmZmZjKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gNTQwMDAwMFVMIC8gcmVnOworfQorCisvKiBUaGUgMiBMU0Igb2YgdGhlIGZhbiBzcGVlZCBsaW1pdCByZWdpc3RlcnMgYXJlIG5vdCBzaWduaWZpY2FudC4gKi8KK3N0YXRpYyBpbmxpbmUgdTE2IGZhbl90b19yZWcodW5zaWduZWQgbG9uZyB2YWwpCit7CisJaWYgKHZhbCA8IDgzVUwpCisJCXJldHVybiAweGZmZmY7CisJaWYgKHZhbCA+PSAxMzUwMDAwVUwpCisJCXJldHVybiAweDAwMDQ7CisJcmV0dXJuICgoMTM1MDAwMFVMICsgdmFsIC8gMikgLyB2YWwpIDw8IDI7Cit9CisKKy8qCisgKiBEYXRhIGludGVyZmFjZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGM4NzQyN19kYXRhICpwYzg3NDI3X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwYzg3NDI3X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWlmICghdGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikKKwkgJiYgZGF0YS0+bGFzdF91cGRhdGVkKQorCQlnb3RvIGRvbmU7CisKKwkvKiBGYW5zICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoIShkYXRhLT5mYW5fZW5hYmxlZCAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlwYzg3NDI3X3JlYWRhbGxfZmFuKGRhdGEsIGkpOworCX0KKwlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCitkb25lOgorCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCSAgICAgICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwYzg3NDI3X2RhdGEgKmRhdGEgPSBwYzg3NDI3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSBhdHRyLT5pbmRleDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgZmFuX2Zyb21fcmVnKGRhdGEtPmZhbltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCSAgICAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzQyN19kYXRhICpkYXRhID0gcGM4NzQyN191cGRhdGVfZGV2aWNlKGRldik7CisJaW50IG5yID0gYXR0ci0+aW5kZXg7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIGZhbl9mcm9tX3JlZyhkYXRhLT5mYW5fbWluW25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJCQkgICAgICAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGM4NzQyN19kYXRhICpkYXRhID0gcGM4NzQyN191cGRhdGVfZGV2aWNlKGRldik7CisJaW50IG5yID0gYXR0ci0+aW5kZXg7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoZGF0YS0+ZmFuX3N0YXR1c1tucl0KKwkJCQkgICAgICAgJiBGQU5fU1RBVFVTX0xPU1BEKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCSAgICAgICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBwYzg3NDI3X2RhdGEgKmRhdGEgPSBwYzg3NDI3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSBhdHRyLT5pbmRleDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShkYXRhLT5mYW5fc3RhdHVzW25yXQorCQkJCSAgICAgICAmIEZBTl9TVEFUVVNfU1RBTEwpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJICAgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwYzg3NDI3X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJaW50IG5yID0gYXR0ci0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpbnQgaW9iYXNlID0gZGF0YS0+YWRkcmVzc1tMRF9GQU5dOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJb3V0YihCQU5LX0ZNKG5yKSwgaW9iYXNlICsgUEM4NzQyN19SRUdfQkFOSyk7CisJLyogVGhlIGxvdyBzcGVlZCBsaW1pdCByZWdpc3RlcnMgYXJlIHJlYWQtb25seSB3aGlsZSBtb25pdG9yaW5nCisJICAgaXMgZW5hYmxlZCwgc28gd2UgaGF2ZSB0byBkaXNhYmxlIG1vbml0b3JpbmcsIHRoZW4gY2hhbmdlIHRoZQorCSAgIGxpbWl0LCBhbmQgZmluYWxseSBlbmFibGUgbW9uaXRvcmluZyBhZ2Fpbi4gKi8KKwlvdXRiKDAsIGlvYmFzZSArIFBDODc0MjdfUkVHX0ZBTl9TVEFUVVMpOworCWRhdGEtPmZhbl9taW5bbnJdID0gZmFuX3RvX3JlZyh2YWwpOworCW91dHcoZGF0YS0+ZmFuX21pbltucl0sIGlvYmFzZSArIFBDODc0MjdfUkVHX0ZBTl9NSU4pOworCW91dGIoRkFOX1NUQVRVU19NT05FTiwgaW9iYXNlICsgUEM4NzQyN19SRUdfRkFOX1NUQVRVUyk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuX2lucHV0LCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5faW5wdXQsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dCwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuX2lucHV0LCBOVUxMLCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW5faW5wdXQsIE5VTEwsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW43X2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dCwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjhfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuX2lucHV0LCBOVUxMLCA3KTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW41X21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW43X21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW44X21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQkgIHNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDcpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjRfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNV9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgNSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjdfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuOF9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDcpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfZmF1bHQsIFNfSVJVR08sIHNob3dfZmFuX2ZhdWx0LCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9mYXVsdCwgU19JUlVHTywgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2Zhbl9mYXVsdCwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjRfZmF1bHQsIFNfSVJVR08sIHNob3dfZmFuX2ZhdWx0LCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNV9mYXVsdCwgU19JUlVHTywgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X2ZhdWx0LCBTX0lSVUdPLCBzaG93X2Zhbl9mYXVsdCwgTlVMTCwgNSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjdfZmF1bHQsIFNfSVJVR08sIHNob3dfZmFuX2ZhdWx0LCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuOF9mYXVsdCwgU19JUlVHTywgc2hvd19mYW5fZmF1bHQsIE5VTEwsIDcpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGM4NzQyN19hdHRyaWJ1dGVzX2Zhbls4XVs1XSA9IHsKKwl7CisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWluLmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwkJTlVMTAorCX0sIHsKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCQlOVUxMCisJfSwgeworCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX21pbi5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJCU5VTEwKKwl9LCB7CisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfbWluLmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwkJTlVMTAorCX0sIHsKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW41X2lucHV0LmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW41X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCQlOVUxMCisJfSwgeworCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW42X21pbi5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW42X2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJCU5VTEwKKwl9LCB7CisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuN19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjdfbWluLmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuN19hbGFybS5kZXZfYXR0ci5hdHRyLAorCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjdfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwkJTlVMTAorCX0sIHsKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW44X2lucHV0LmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuOF9taW4uZGV2X2F0dHIuYXR0ciwKKwkJJnNlbnNvcl9kZXZfYXR0cl9mYW44X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJCSZzZW5zb3JfZGV2X2F0dHJfZmFuOF9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCQlOVUxMCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcGM4NzQyN19ncm91cF9mYW5bOF0gPSB7CisJeyAuYXR0cnMgPSBwYzg3NDI3X2F0dHJpYnV0ZXNfZmFuWzBdIH0sCisJeyAuYXR0cnMgPSBwYzg3NDI3X2F0dHJpYnV0ZXNfZmFuWzFdIH0sCisJeyAuYXR0cnMgPSBwYzg3NDI3X2F0dHJpYnV0ZXNfZmFuWzJdIH0sCisJeyAuYXR0cnMgPSBwYzg3NDI3X2F0dHJpYnV0ZXNfZmFuWzNdIH0sCisJeyAuYXR0cnMgPSBwYzg3NDI3X2F0dHJpYnV0ZXNfZmFuWzRdIH0sCisJeyAuYXR0cnMgPSBwYzg3NDI3X2F0dHJpYnV0ZXNfZmFuWzVdIH0sCisJeyAuYXR0cnMgPSBwYzg3NDI3X2F0dHJpYnV0ZXNfZmFuWzZdIH0sCisJeyAuYXR0cnMgPSBwYzg3NDI3X2F0dHJpYnV0ZXNfZmFuWzddIH0sCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjODc0MjdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGRhdGEtPm5hbWUpOworfQorc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCk7CisKKworLyoKKyAqIERldmljZSBkZXRlY3Rpb24sIGF0dGFjaCBhbmQgZGV0YWNoCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjODc0MjdfaW5pdF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwYzg3NDI3X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaTsKKwl1OCByZWc7CisKKwkvKiBUaGUgRk1DIG1vZHVsZSBzaG91bGQgYmUgcmVhZHkgKi8KKwlyZWcgPSBwYzg3NDI3X3JlYWQ4KGRhdGEsIExEX0ZBTiwgUEM4NzQyN19SRUdfQkFOSyk7CisJaWYgKCEocmVnICYgMHg4MCkpCisJCWRldl93YXJuKGRldiwgIkZNQyBtb2R1bGUgbm90IHJlYWR5IVxuIik7CisKKwkvKiBDaGVjayB3aGljaCBmYW5zIGFyZSBlbmFibGVkICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlyZWcgPSBwYzg3NDI3X3JlYWQ4X2JhbmsoZGF0YSwgTERfRkFOLCBCQU5LX0ZNKGkpLAorCQkJCQkgUEM4NzQyN19SRUdfRkFOX1NUQVRVUyk7CisJCWlmIChyZWcgJiBGQU5fU1RBVFVTX01PTkVOKQorCQkJZGF0YS0+ZmFuX2VuYWJsZWQgfD0gKDEgPDwgaSk7CisJfQorCisJaWYgKCFkYXRhLT5mYW5fZW5hYmxlZCkgeworCQlkZXZfZGJnKGRldiwgIkVuYWJsaW5nIGFsbCBmYW4gaW5wdXRzXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCXBjODc0Mjdfd3JpdGU4X2JhbmsoZGF0YSwgTERfRkFOLCBCQU5LX0ZNKGkpLAorCQkJCQkgICAgUEM4NzQyN19SRUdfRkFOX1NUQVRVUywKKwkJCQkJICAgIEZBTl9TVEFUVVNfTU9ORU4pOworCQlkYXRhLT5mYW5fZW5hYmxlZCA9IDB4ZmY7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYzg3NDI3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBjODc0MjdfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgZXJyOworCisJaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwYzg3NDI3X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBUaGlzIHdpbGwgbmVlZCB0byBiZSByZXZpc2l0ZWQgd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3IKKwkgICB0ZW1wZXJhdHVyZSBhbmQgdm9sdGFnZSBtb25pdG9yaW5nLiAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwlkYXRhLT5hZGRyZXNzWzBdID0gcmVzLT5zdGFydDsKKworCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOworCWRhdGEtPm5hbWUgPSAicGM4NzQyNyI7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CisJcGM4NzQyN19pbml0X2RldmljZSgmcGRldi0+ZGV2KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX25hbWUpKSkKKwkJZ290byBleGl0X2tmcmVlOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKCEoZGF0YS0+ZmFuX2VuYWJsZWQgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLAorCQkJCQkgICAgICAmcGM4NzQyN19ncm91cF9mYW5baV0pKSkKKwkJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CisJfQorCisJZGF0YS0+Y2xhc3NfZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNsYXNzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJZ290byBleGl0X3JlbW92ZV9maWxlczsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9yZW1vdmVfZmlsZXM6CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoIShkYXRhLT5mYW5fZW5hYmxlZCAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmcGM4NzQyN19ncm91cF9mYW5baV0pOworCX0KK2V4aXRfa2ZyZWU6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBjODc0MjdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBjODc0MjdfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKCEoZGF0YS0+ZmFuX2VuYWJsZWQgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJnBjODc0MjdfZ3JvdXBfZmFuW2ldKTsKKwl9CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwYzg3NDI3X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSBEUlZOQU1FLAorCX0sCisJLnByb2JlCQk9IHBjODc0MjdfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwYzg3NDI3X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwYzg3NDI3X2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzID0geworCQkuc3RhcnQJPSBhZGRyZXNzLAorCQkuZW5kCT0gYWRkcmVzcyArIFJFR0lPTl9MRU5HVEggLSAxLAorCQkubmFtZQk9IGxvZ2Rldl9zdHJbMF0sCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCisJfTsKKwlpbnQgZXJyOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKKwlpZiAoIXBkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCisJCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisJfQorCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKKwkJICAgICAgIGVycik7CisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OworCX0KKworCXJldHVybiAwOworCitleGl0X2RldmljZV9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgcGM4NzQyN19maW5kKGludCBzaW9hZGRyLCB1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcykKK3sKKwl1MTYgdmFsOworCWludCBpLCBlcnIgPSAwOworCisJLyogSWRlbnRpZnkgZGV2aWNlICovCisJdmFsID0gc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPUkVHX0RFVklEKTsKKwlpZiAodmFsICE9IDB4ZjIpIHsJLyogUEM4NzQyNyAqLworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlhZGRyZXNzW2ldID0gMDsKKwkJLyogU2VsZWN0IGxvZ2ljYWwgZGV2aWNlICovCisJCXN1cGVyaW9fb3V0YihzaW9hZGRyLCBTSU9SRUdfTERTRUwsIGxvZ2RldltpXSk7CisKKwkJdmFsID0gc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPUkVHX0FDVCk7CisJCWlmICghKHZhbCAmIDB4MDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogTG9naWNhbCBkZXZpY2UgMHglMDJ4ICIKKwkJCSAgICAgICAibm90IGFjdGl2YXRlZFxuIiwgbG9nZGV2W2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdmFsID0gc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPUkVHX01BUCk7CisJCWlmICh2YWwgJiAweDAxKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogTG9naWNhbCBkZXZpY2UgMHglMDJ4ICIKKwkJCSAgICAgICAiaXMgbWVtb3J5LW1hcHBlZCwgY2FuJ3QgdXNlXG4iLCBsb2dkZXZbaV0pOworCQkJY29udGludWU7CisJCX0KKworCQl2YWwgPSAoc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPUkVHX0lPQkFTRSkgPDwgOCkKKwkJICAgIHwgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPUkVHX0lPQkFTRSArIDEpOworCQlpZiAoIXZhbCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IEkvTyBiYXNlIGFkZHJlc3Mgbm90IHNldCAiCisJCQkgICAgICAgImZvciBsb2dpY2FsIGRldmljZSAweCUwMnhcbiIsIGxvZ2RldltpXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlhZGRyZXNzW2ldID0gdmFsOworCX0KKworZXhpdDoKKwlzdXBlcmlvX2V4aXQoc2lvYWRkcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgcGM4NzQyN19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzWzJdOworCisJaWYgKHBjODc0MjdfZmluZCgweDJlLCBhZGRyZXNzKQorCSAmJiBwYzg3NDI3X2ZpbmQoMHg0ZSwgYWRkcmVzcykpCisJCXJldHVybiAtRU5PREVWOworCisJLyogRm9yIG5vdyB0aGUgZHJpdmVyIG9ubHkgaGFuZGxlcyBmYW5zIHNvIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUKKwkgICBmaXJzdCBhZGRyZXNzLiAqLworCWlmICghYWRkcmVzc1swXSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBjODc0MjdfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBTZXRzIGdsb2JhbCBwZGV2IGFzIGEgc2lkZSBlZmZlY3QgKi8KKwllcnIgPSBwYzg3NDI3X2RldmljZV9hZGQoYWRkcmVzc1swXSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2RyaXZlcjsKKworCXJldHVybiAwOworCitleGl0X2RyaXZlcjoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGM4NzQyN19kcml2ZXIpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGM4NzQyN19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjODc0MjdfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDODc0MjcgaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQocGM4NzQyN19pbml0KTsKK21vZHVsZV9leGl0KHBjODc0MjdfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKaW5kZXggNDcxMzJmZC4uYmViODgxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpAQCAtMiw4ICsyLDggQEAKICAgICBzbXNjNDdtMS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcwogICAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwogCi0gICAgU3VwcG9ydHMgdGhlIFNNU0MgTFBDNDdCMjd4LCBMUEM0N00xMHgsIExQQzQ3TTEzeCwgTFBDNDdNMTR4LAotICAgIExQQzQ3TTE1eCwgTFBDNDdNMTkyIGFuZCBMUEM0N005OTcgU3VwZXItSS9PIGNoaXBzLgorICAgIFN1cHBvcnRzIHRoZSBTTVNDIExQQzQ3QjI3eCwgTFBDNDdNMTB4LCBMUEM0N00xMTIsIExQQzQ3TTEzeCwKKyAgICBMUEM0N00xNHgsIExQQzQ3TTE1eCwgTFBDNDdNMTkyIGFuZCBMUEM0N005OTcgU3VwZXItSS9PIGNoaXBzLgogCiAgICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcmsgRC4gU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4KICAgICBDb3B5cmlnaHQgKEMpIDIwMDQgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CkBAIC0zODAsOCArMzgwLDggQEAKIAl2YWwgPSBzdXBlcmlvX2luYihTVVBFUklPX1JFR19ERVZJRCk7CiAKIAkvKgotCSAqIFNNU0MgTFBDNDdNMTB4L0xQQzQ3TTEzeCAoZGV2aWNlIGlkIDB4NTkpLCBMUEM0N00xNHggKGRldmljZSBpZAotCSAqIDB4NUYpIGFuZCBMUEM0N0IyN3ggKGRldmljZSBpZCAweDUxKSBoYXZlIGZhbiBjb250cm9sLgorCSAqIFNNU0MgTFBDNDdNMTB4L0xQQzQ3TTExMi9MUEM0N00xM3ggKGRldmljZSBpZCAweDU5KSwgTFBDNDdNMTR4CisJICogKGRldmljZSBpZCAweDVGKSBhbmQgTFBDNDdCMjd4IChkZXZpY2UgaWQgMHg1MSkgaGF2ZSBmYW4gY29udHJvbC4KIAkgKiBUaGUgTFBDNDdNMTV4IGFuZCBMUEM0N00xOTIgY2hpcHMgIndpdGggaGFyZHdhcmUgbW9uaXRvcmluZyBibG9jayIKIAkgKiBjYW4gZG8gbXVjaCBtb3JlIGJlc2lkZXMgKGRldmljZSBpZCAweDYwKS4KIAkgKiBUaGUgTFBDNDdNOTk3IGlzIHVuZG9jdW1lbnRlZCwgYnV0IHNlZW1zIHRvIGJlIGNvbXBhdGlibGUgd2l0aApAQCAtMzkwLDcgKzM5MCw4IEBACiAJaWYgKHZhbCA9PSAweDUxKQogCQlwcmludGsoS0VSTl9JTkZPICJzbXNjNDdtMTogRm91bmQgU01TQyBMUEM0N0IyN3hcbiIpOwogCWVsc2UgaWYgKHZhbCA9PSAweDU5KQotCQlwcmludGsoS0VSTl9JTkZPICJzbXNjNDdtMTogRm91bmQgU01TQyBMUEM0N00xMHgvTFBDNDdNMTN4XG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic21zYzQ3bTE6IEZvdW5kIFNNU0MgIgorCQkgICAgICAgIkxQQzQ3TTEweC9MUEM0N00xMTIvTFBDNDdNMTN4XG4iKTsKIAllbHNlIGlmICh2YWwgPT0gMHg1RikKIAkJcHJpbnRrKEtFUk5fSU5GTyAic21zYzQ3bTE6IEZvdW5kIFNNU0MgTFBDNDdNMTR4XG4iKTsKIAllbHNlIGlmICh2YWwgPT0gMHg2MCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCmluZGV4IDgzM2ZhYTIuLjIxMmExNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwpAQCAtMyw3ICszLDcgQEAKICAgICAgICAgICAgICAgICB0aGUgV2luYm9uZCBXODM2MjdFSEYgU3VwZXItSS9PIGNoaXAKICAgICBDb3B5cmlnaHQgKEMpIDIwMDUgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgogICAgIENvcHlyaWdodCAoQykgMjAwNiAgWXVhbiBNdSAoV2luYm9uZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSdWRvbGYgTWFyZWsgPHIubWFyZWtAc2guY3Z1dC5jej4KKyAgICAgICAgICAgICAgICAgICAgICAgIFJ1ZG9sZiBNYXJlayA8ci5tYXJla0Bhc3NlbWJsZXIuY3o+CiAgICAgICAgICAgICAgICAgICAgICAgICBEYXZpZCBIdWJiYXJkIDxkYXZpZC5jLmh1YmJhcmRAZ21haWwuY29tPgogCiAgICAgU2hhbWVsZXNzbHkgcmlwcGVkIGZyb20gdGhlIHc4MzYyN2hmIGRyaXZlcgpAQCAtMzU0LDYgKzM1NCw4IEBACiAJY2FzZSAwOgogCQlyZWcgPSAodzgzNjI3ZWhmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM2MjdFSEZfUkVHX0ZBTkRJVjEpICYgMHhjZikKIAkJICAgIHwgKChkYXRhLT5mYW5fZGl2WzBdICYgMHgwMykgPDwgNCk7CisJCS8qIGZhbjUgaW5wdXQgY29udHJvbCBiaXQgaXMgd3JpdGUgb25seSwgY29tcHV0ZSB0aGUgdmFsdWUgKi8KKwkJcmVnIHw9IChkYXRhLT5oYXNfZmFuICYgKDEgPDwgNCkpID8gMSA6IDA7CiAJCXc4MzYyN2VoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4MzYyN0VIRl9SRUdfRkFORElWMSwgcmVnKTsKIAkJcmVnID0gKHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNjI3RUhGX1JFR19WQkFUKSAmIDB4ZGYpCiAJCSAgICB8ICgoZGF0YS0+ZmFuX2RpdlswXSAmIDB4MDQpIDw8IDMpOwpAQCAtMzYyLDYgKzM2NCw4IEBACiAJY2FzZSAxOgogCQlyZWcgPSAodzgzNjI3ZWhmX3JlYWRfdmFsdWUoY2xpZW50LCBXODM2MjdFSEZfUkVHX0ZBTkRJVjEpICYgMHgzZikKIAkJICAgIHwgKChkYXRhLT5mYW5fZGl2WzFdICYgMHgwMykgPDwgNik7CisJCS8qIGZhbjUgaW5wdXQgY29udHJvbCBiaXQgaXMgd3JpdGUgb25seSwgY29tcHV0ZSB0aGUgdmFsdWUgKi8KKwkJcmVnIHw9IChkYXRhLT5oYXNfZmFuICYgKDEgPDwgNCkpID8gMSA6IDA7CiAJCXc4MzYyN2VoZl93cml0ZV92YWx1ZShjbGllbnQsIFc4MzYyN0VIRl9SRUdfRkFORElWMSwgcmVnKTsKIAkJcmVnID0gKHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNjI3RUhGX1JFR19WQkFUKSAmIDB4YmYpCiAJCSAgICB8ICgoZGF0YS0+ZmFuX2RpdlsxXSAmIDB4MDQpIDw8IDQpOwpAQCAtMTIxNiwxMyArMTIyMCwxNiBAQAogCXN1cGVyaW9fZXhpdCgpOwogCiAJLyogSXQgbG9va3MgbGlrZSBmYW40IGFuZCBmYW41IHBpbnMgY2FuIGJlIGFsdGVybmF0aXZlbHkgdXNlZAotCSAgIGFzIGZhbiBvbi9vZmYgc3dpdGNoZXMgKi8KKwkgICBhcyBmYW4gb24vb2ZmIHN3aXRjaGVzLCBidXQgZmFuNSBjb250cm9sIGlzIHdyaXRlIG9ubHkgOi8KKwkgICBXZSBhc3N1bWUgdGhhdCBpZiB0aGUgc2VyaWFsIGludGVyZmFjZSBpcyBkaXNhYmxlZCwgZGVzaWduZXJzCisJICAgY29ubmVjdGVkIGZhbjUgYXMgaW5wdXQgdW5sZXNzIHRoZXkgYXJlIGVtaXR0aW5nIGxvZyAxLCB3aGljaAorCSAgIGlzIG5vdCB0aGUgZGVmYXVsdC4gKi8KIAogCWRhdGEtPmhhc19mYW4gPSAweDA3OyAvKiBmYW4xLCBmYW4yIGFuZCBmYW4zICovCiAJaSA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNjI3RUhGX1JFR19GQU5ESVYxKTsKIAlpZiAoKGkgJiAoMSA8PCAyKSkgJiYgKCFmYW40cGluKSkKIAkJZGF0YS0+aGFzX2ZhbiB8PSAoMSA8PCAzKTsKLQlpZiAoKGkgJiAoMSA8PCAwKSkgJiYgKCFmYW41cGluKSkKKwlpZiAoIShpICYgKDEgPDwgMSkpICYmICghZmFuNXBpbikpCiAJCWRhdGEtPmhhc19mYW4gfD0gKDEgPDwgNCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM3ODFkLmMgYi9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYwppbmRleCBhNDU4NGVjLi4xMjMyMTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYwpAQCAtMTA5OSw3ICsxMDk5LDggQEAKIAkgICBiYW5rLiAqLwogCWlmIChraW5kIDwgMCkgewogCQlpZiAodzgzNzgxZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzgxRF9SRUdfQ09ORklHKSAmIDB4ODApIHsKLQkJCWRldl9kYmcoZGV2LCAiRGV0ZWN0aW9uIGZhaWxlZCBhdCBzdGVwIDNcbiIpOworCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV0ZWN0aW9uIG9mIHc4Mzc4MWQgY2hpcCAiCisJCQkJImZhaWxlZCBhdCBzdGVwIDNcbiIpOwogCQkJZXJyID0gLUVOT0RFVjsKIAkJCWdvdG8gRVJST1IyOwogCQl9CkBAIC0xMTA5LDcgKzExMTAsOCBAQAogCQlpZiAoKCEodmFsMSAmIDB4MDcpKSAmJgogCQkgICAgKCgoISh2YWwxICYgMHg4MCkpICYmICh2YWwyICE9IDB4YTMpICYmICh2YWwyICE9IDB4YzMpKQogCQkgICAgIHx8ICgodmFsMSAmIDB4ODApICYmICh2YWwyICE9IDB4NWMpICYmICh2YWwyICE9IDB4MTIpKSkpIHsKLQkJCWRldl9kYmcoZGV2LCAiRGV0ZWN0aW9uIGZhaWxlZCBhdCBzdGVwIDRcbiIpOworCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV0ZWN0aW9uIG9mIHc4Mzc4MWQgY2hpcCAiCisJCQkJImZhaWxlZCBhdCBzdGVwIDRcbiIpOwogCQkJZXJyID0gLUVOT0RFVjsKIAkJCWdvdG8gRVJST1IyOwogCQl9CkBAIC0xMTE5LDcgKzExMjEsOCBAQAogCQkJCSAgKCh2YWwxICYgMHg4MCkgJiYgKHZhbDIgPT0gMHg1YykpKSkgewogCQkJaWYgKHc4Mzc4MWRfcmVhZF92YWx1ZQogCQkJICAgIChjbGllbnQsIFc4Mzc4MURfUkVHX0kyQ19BRERSKSAhPSBhZGRyZXNzKSB7Ci0JCQkJZGV2X2RiZyhkZXYsICJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgNVxuIik7CisJCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiRGV0ZWN0aW9uIG9mIHc4Mzc4MWQgIgorCQkJCQkiY2hpcCBmYWlsZWQgYXQgc3RlcCA1XG4iKTsKIAkJCQllcnIgPSAtRU5PREVWOwogCQkJCWdvdG8gRVJST1IyOwogCQkJfQpAQCAtMTE0MSw4ICsxMTQ0LDggQEAKIAkJZWxzZSBpZiAodmFsMiA9PSAweDEyKQogCQkJdmVuZGlkID0gYXN1czsKIAkJZWxzZSB7Ci0JCQlkZXZfZGJnKGRldiwgIkNoaXAgd2FzIG1hZGUgYnkgbmVpdGhlciAiCi0JCQkJIldpbmJvbmQgbm9yIEFzdXM/XG4iKTsKKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgInc4Mzc4MWQgY2hpcCB2ZW5kb3IgaXMgIgorCQkJCSJuZWl0aGVyIFdpbmJvbmQgbm9yIEFzdXNcbiIpOwogCQkJZXJyID0gLUVOT0RFVjsKIAkJCWdvdG8gRVJST1IyOwogCQl9CkBAIC0xMTYxLDEwICsxMTY0LDkgQEAKIAkJCWtpbmQgPSBhczk5MTI3ZjsKIAkJZWxzZSB7CiAJCQlpZiAoa2luZCA9PSAwKQotCQkJCWRldl93YXJuKGRldiwgIklnbm9yaW5nICdmb3JjZScgIgorCQkJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJJZ25vcmluZyAnZm9yY2UnICIKIAkJCQkJICJwYXJhbWV0ZXIgZm9yIHVua25vd24gY2hpcCBhdCAiCi0JCQkJCSAiYWRhcHRlciAlZCwgYWRkcmVzcyAweCUwMnhcbiIsCi0JCQkJCSBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgYWRkcmVzcyk7CisJCQkJCSAiYWRkcmVzcyAweCUwMnhcbiIsIGFkZHJlc3MpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gRVJST1IyOwogCQl9CkBAIC0xNjg1LDExICsxNjg3LDEwIEBACiAJaWYgKHJlcykKIAkJcmV0dXJuIHJlczsKIAotCXJlcyA9IGkyY19pc2FfYWRkX2RyaXZlcigmdzgzNzgxZF9pc2FfZHJpdmVyKTsKLQlpZiAocmVzKSB7Ci0JCWkyY19kZWxfZHJpdmVyKCZ3ODM3ODFkX2RyaXZlcik7Ci0JCXJldHVybiByZXM7Ci0JfQorCS8qIERvbid0IGV4aXQgaWYgdGhpcyBvbmUgZmFpbHMsIHdlIHN0aWxsIHdhbnQgdGhlIEkyQyB2YXJpYW50cworCSAgIHRvIHdvcmshICovCisJaWYgKGkyY19pc2FfYWRkX2RyaXZlcigmdzgzNzgxZF9pc2FfZHJpdmVyKSkKKwkJaXNhX2FkZHJlc3MgPSAwOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjk3LDcgKzE2OTgsOCBAQAogc3RhdGljIHZvaWQgX19leGl0CiBzZW5zb3JzX3c4Mzc4MWRfZXhpdCh2b2lkKQogewotCWkyY19pc2FfZGVsX2RyaXZlcigmdzgzNzgxZF9pc2FfZHJpdmVyKTsKKwlpZiAoaXNhX2FkZHJlc3MpCisJCWkyY19pc2FfZGVsX2RyaXZlcigmdzgzNzgxZF9pc2FfZHJpdmVyKTsKIAlpMmNfZGVsX2RyaXZlcigmdzgzNzgxZF9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCmluZGV4IDM3MWVkNGYuLjllNWY4ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCkBAIC03NDYsNiArNzQ2LDUyIEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybV9yZWcsIHN0b3JlX3ZybV9yZWcpOwogCisjZGVmaW5lIElOX1VOSVRfQVRUUlMoWCkgXAorCSZzZGFfaW5faW5wdXRbWF0uZGV2X2F0dHIuYXR0ciwgXAorCSZzZGFfaW5fbWluW1hdLmRldl9hdHRyLmF0dHIsICAgXAorCSZzZGFfaW5fbWF4W1hdLmRldl9hdHRyLmF0dHIKKworI2RlZmluZSBGQU5fVU5JVF9BVFRSUyhYKSBcCisJJnNkYV9mYW5faW5wdXRbWF0uZGV2X2F0dHIuYXR0ciwgICAgICAgIFwKKwkmc2RhX2Zhbl9taW5bWF0uZGV2X2F0dHIuYXR0ciwgICAgICAgICAgXAorCSZzZGFfZmFuX2RpdltYXS5kZXZfYXR0ci5hdHRyCisKKyNkZWZpbmUgVEVNUF9VTklUX0FUVFJTKFgpIFwKKwkmc2RhX3RlbXBfaW5wdXRbWF0uZGV2X2F0dHIuYXR0ciwgICAgICAgXAorCSZzZGFfdGVtcF9tYXhbWF0uZGV2X2F0dHIuYXR0ciwgICAgICAgICBcCisJJnNkYV90ZW1wX21heF9oeXN0W1hdLmRldl9hdHRyLmF0dHIKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnc4Mzc5MWRfYXR0cmlidXRlc1tdID0geworCUlOX1VOSVRfQVRUUlMoMCksCisJSU5fVU5JVF9BVFRSUygxKSwKKwlJTl9VTklUX0FUVFJTKDIpLAorCUlOX1VOSVRfQVRUUlMoMyksCisJSU5fVU5JVF9BVFRSUyg0KSwKKwlJTl9VTklUX0FUVFJTKDUpLAorCUlOX1VOSVRfQVRUUlMoNiksCisJSU5fVU5JVF9BVFRSUyg3KSwKKwlJTl9VTklUX0FUVFJTKDgpLAorCUlOX1VOSVRfQVRUUlMoOSksCisJRkFOX1VOSVRfQVRUUlMoMCksCisJRkFOX1VOSVRfQVRUUlMoMSksCisJRkFOX1VOSVRfQVRUUlMoMiksCisJRkFOX1VOSVRfQVRUUlMoMyksCisJRkFOX1VOSVRfQVRUUlMoNCksCisJVEVNUF9VTklUX0FUVFJTKDApLAorCVRFTVBfVU5JVF9BVFRSUygxKSwKKwlURU1QX1VOSVRfQVRUUlMoMiksCisJJmRldl9hdHRyX2FsYXJtcy5hdHRyLAorCSZzZGFfYmVlcF9jdHJsWzBdLmRldl9hdHRyLmF0dHIsCisJJnNkYV9iZWVwX2N0cmxbMV0uZGV2X2F0dHIuYXR0ciwKKwkmZGV2X2F0dHJfY3B1MF92aWQuYXR0ciwKKwkmZGV2X2F0dHJfdnJtLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdzgzNzkxZF9ncm91cCA9IHsKKwkuYXR0cnMgPSB3ODM3OTFkX2F0dHJpYnV0ZXMsCit9OworCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuOgogICAgICAqIHc4Mzc5MWRfZHJpdmVyIGlzIGluc2VydGVkICh3aGVuIHRoaXMgbW9kdWxlIGlzIGxvYWRlZCksIGZvciBlYWNoCiAgICAgICAgYXZhaWxhYmxlIGFkYXB0ZXIKQEAgLTk2Nyw0MSArMTAxMywyMCBAQAogCX0KIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZ3ODM3OTFkX2dyb3VwKSkpCisJCWdvdG8gZXJyb3IzOworCisJLyogRXZlcnl0aGluZyBpcyByZWFkeSwgbm93IHJlZ2lzdGVyIHRoZSB3b3JraW5nIGRldmljZSAqLwogCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcihkZXYpOwogCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7Ci0JCWdvdG8gZXJyb3IzOworCQlnb3RvIGVycm9yNDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1ZJTjsgaSsrKSB7Ci0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfaW5faW5wdXRbaV0uZGV2X2F0dHIpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2luX21pbltpXS5kZXZfYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfaW5fbWF4W2ldLmRldl9hdHRyKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX0ZBTklOOyBpKyspIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9mYW5faW5wdXRbaV0uZGV2X2F0dHIpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2Zhbl9kaXZbaV0uZGV2X2F0dHIpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2Zhbl9taW5baV0uZGV2X2F0dHIpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfVEVNUElOOyBpKyspIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV90ZW1wX2lucHV0W2ldLmRldl9hdHRyKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV90ZW1wX21heFtpXS5kZXZfYXR0cik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfdGVtcF9tYXhfaHlzdFtpXS5kZXZfYXR0cik7Ci0JfQotCi0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2FsYXJtcyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZGFfYmVlcF9jdHJsKTsgaSsrKSB7Ci0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfYmVlcF9jdHJsW2ldLmRldl9hdHRyKTsKLQl9Ci0KLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOwotCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92cm0pOwotCiAJcmV0dXJuIDA7CiAKK2Vycm9yNDoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZ3ODM3OTFkX2dyb3VwKTsKIGVycm9yMzoKIAlpZiAoZGF0YS0+bG03NVswXSAhPSBOVUxMKSB7CiAJCWkyY19kZXRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMF0pOwpAQCAtMTAyNSw4ICsxMDUwLDEwIEBACiAJaW50IGVycjsKIAogCS8qIG1haW4gY2xpZW50ICovCi0JaWYgKGRhdGEpCisJaWYgKGRhdGEpIHsKIAkJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmdzgzNzkxZF9ncm91cCk7CisJfQogCiAJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jIGIvZHJpdmVycy9od21vbi93ODM3OTJkLmMKaW5kZXggNGUxMDgyNi4uYjBmYTI5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3OTJkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3OTJkLmMKQEAgLTMsNyArMyw3IEBACiAgICAgICAgICAgICAgICAgbW9uaXRvcmluZwogICAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBXaW5ib25kIEVsZWN0cm9uaWNzIENvcnAuCiAgICAgICAgICAgICAgICAgICAgICAgICBDaHVuaGFvIEh1YW5nIDxEWlNoZW5AV2luYm9uZC5jb20udHc+LAotICAgICAgICAgICAgICAgICAgICAgICAgUnVkb2xmIE1hcmVrIDxyLm1hcmVrQHNoLmN2dXQuY3o+CisgICAgICAgICAgICAgICAgICAgICAgICBSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PgogCiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM3OTMuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyYWM1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMKQEAgLTAsMCArMSwxNjA5IEBACisvKgorICAgIHc4Mzc5My5jIC0gTGludXgga2VybmVsIGRyaXZlciBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZworICAgIENvcHlyaWdodCAoQykgMjAwNiBXaW5ib25kIEVsZWN0cm9uaWNzIENvcnAuCisgICAgICAgICAgICAgICAgICBZdWFuIE11CisgICAgICAgICAgICAgICAgICBSdWRvbGYgTWFyZWsgPHIubWFyZWtAYXNzZW1ibGVyLmN6PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gLSB2ZXJzaW9uIDIuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAgICAwMjExMC0xMzAxIFVTQS4KKyovCisKKy8qCisgICAgU3VwcG9ydHMgZm9sbG93aW5nIGNoaXBzOgorCisgICAgQ2hpcAkjdmluCSNmYW5pbgkjcHdtCSN0ZW1wCXdjaGlwaWQJdmVuZGlkCWkyYwlJU0EKKyAgICB3ODM3OTMJMTAJMTIJOAk2CTB4N2IJMHg1Y2EzCXllcwlubworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODM3OTMpOworSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCisJCSAgICAgICAie2J1cywgY2xpZW50YWRkciwgc3ViY2xpZW50YWRkcjEsIHN1YmNsaWVudGFkZHIyfSIpOworCitzdGF0aWMgaW50IHJlc2V0OworbW9kdWxlX3BhcmFtKHJlc2V0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVzZXQsICJTZXQgdG8gMSB0byByZXNldCBjaGlwLCBub3QgcmVjb21tZW5kZWQiKTsKKworLyoKKyAgIEFkZHJlc3MgMHgwMCwgMHgwZCwgMHgwZSwgMHgwZiBpbiBhbGwgdGhyZWUgYmFua3MgYXJlIHJlc2VydmVkCisgICBhcyBJRCwgQmFuayBTZWxlY3QgcmVnaXN0ZXJzCisqLworI2RlZmluZSBXODM3OTNfUkVHX0JBTktTRUwJCTB4MDAKKyNkZWZpbmUgVzgzNzkzX1JFR19WRU5ET1JJRAkJMHgwZAorI2RlZmluZSBXODM3OTNfUkVHX0NISVBJRAkJMHgwZQorI2RlZmluZSBXODM3OTNfUkVHX0RFVklDRUlECQkweDBmCisKKyNkZWZpbmUgVzgzNzkzX1JFR19DT05GSUcJCTB4NDAKKyNkZWZpbmUgVzgzNzkzX1JFR19NRkMJCQkweDU4CisjZGVmaW5lIFc4Mzc5M19SRUdfRkFOSU5fQ1RSTAkJMHg1YworI2RlZmluZSBXODM3OTNfUkVHX0ZBTklOX1NFTAkJMHg1ZAorI2RlZmluZSBXODM3OTNfUkVHX0kyQ19BRERSCQkweDBiCisjZGVmaW5lIFc4Mzc5M19SRUdfSTJDX1NVQkFERFIJCTB4MGMKKyNkZWZpbmUgVzgzNzkzX1JFR19WSURfSU5BCQkweDA1CisjZGVmaW5lIFc4Mzc5M19SRUdfVklEX0lOQgkJMHgwNgorI2RlZmluZSBXODM3OTNfUkVHX1ZJRF9MQVRDSEEJCTB4MDcKKyNkZWZpbmUgVzgzNzkzX1JFR19WSURfTEFUQ0hCCQkweDA4CisjZGVmaW5lIFc4Mzc5M19SRUdfVklEX0NUUkwJCTB4NTkKKworc3RhdGljIHUxNiBXODM3OTNfUkVHX1RFTVBfTU9ERVsyXSA9IHsgMHg1ZSwgMHg1ZiB9OworCisjZGVmaW5lIFRFTVBfUkVBRAkwCisjZGVmaW5lIFRFTVBfQ1JJVAkxCisjZGVmaW5lIFRFTVBfQ1JJVF9IWVNUCTIKKyNkZWZpbmUgVEVNUF9XQVJOCTMKKyNkZWZpbmUgVEVNUF9XQVJOX0hZU1QJNAorLyogb25seSBjcml0IGFuZCBjcml0X2h5c3QgYWZmZWN0IHJlYWwtdGltZSBhbGFybSBzdGF0dXMKKyAgIGN1cnJlbnQgY3JpdCBjcml0X2h5c3Qgd2FybiB3YXJuX2h5c3QgKi8KK3N0YXRpYyB1MTYgVzgzNzkzX1JFR19URU1QW11bNV0gPSB7CisJezB4MWMsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2J9LAorCXsweDFkLCAweDdjLCAweDdkLCAweDdlLCAweDdmfSwKKwl7MHgxZSwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4M30sCisJezB4MWYsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODd9LAorCXsweDIwLCAweDg4LCAweDg5LCAweDhhLCAweDhifSwKKwl7MHgyMSwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4Zn0sCit9OworCisjZGVmaW5lIFc4Mzc5M19SRUdfVEVNUF9MT1dfQklUUwkweDIyCisKKyNkZWZpbmUgVzgzNzkzX1JFR19CRUVQKGluZGV4KQkJKDB4NTMgKyAoaW5kZXgpKQorI2RlZmluZSBXODM3OTNfUkVHX0FMQVJNKGluZGV4KQkJKDB4NGIgKyAoaW5kZXgpKQorCisjZGVmaW5lIFc4Mzc5M19SRUdfQ0xSX0NIQVNTSVMJCTB4NGEJLyogU01JIE1BU0s0ICovCisjZGVmaW5lIFc4Mzc5M19SRUdfSVJRX0NUUkwJCTB4NTAKKyNkZWZpbmUgVzgzNzkzX1JFR19PVlRfQ1RSTAkJMHg1MQorI2RlZmluZSBXODM3OTNfUkVHX09WVF9CRUVQCQkweDUyCisKKyNkZWZpbmUgSU5fUkVBRAkJCQkwCisjZGVmaW5lIElOX01BWAkJCQkxCisjZGVmaW5lIElOX0xPVwkJCQkyCitzdGF0aWMgY29uc3QgdTE2IFc4Mzc5M19SRUdfSU5bXVszXSA9IHsKKwkvKiBDdXJyZW50LCBIaWdoLCBMb3cgKi8KKwl7MHgxMCwgMHg2MCwgMHg2MX0sCS8qIFZjb3JlIEEJKi8KKwl7MHgxMSwgMHg2MiwgMHg2M30sCS8qIFZjb3JlIEIJKi8KKwl7MHgxMiwgMHg2NCwgMHg2NX0sCS8qIFZ0dAkJKi8KKwl7MHgxNCwgMHg2YSwgMHg2Yn0sCS8qIFZTRU4xCSovCisJezB4MTUsIDB4NmMsIDB4NmR9LAkvKiBWU0VOMgkqLworCXsweDE2LCAweDZlLCAweDZmfSwJLyogKzNWU0VOCSovCisJezB4MTcsIDB4NzAsIDB4NzF9LAkvKiArMTJWU0VOCSovCisJezB4MTgsIDB4NzIsIDB4NzN9LAkvKiA1VkRECQkqLworCXsweDE5LCAweDc0LCAweDc1fSwJLyogNVZTQgkJKi8KKwl7MHgxYSwgMHg3NiwgMHg3N30sCS8qIFZCQVQJCSovCit9OworCisvKiBMb3cgQml0cyBvZiBWY29yZSBBL0IgVnR0IFJlYWQvSGlnaC9Mb3cgKi8KK3N0YXRpYyBjb25zdCB1MTYgVzgzNzkzX1JFR19JTl9MT1dfQklUU1tdID0geyAweDFiLCAweDY4LCAweDY5IH07CitzdGF0aWMgdTggc2NhbGVfaW5bXSA9IHsgMiwgMiwgMiwgMTYsIDE2LCAxNiwgOCwgMjQsIDI0LCAxNiB9OworCisjZGVmaW5lIFc4Mzc5M19SRUdfRkFOKGluZGV4KQkJKDB4MjMgKyAyICogKGluZGV4KSkJLyogSGlnaCBieXRlICovCisjZGVmaW5lIFc4Mzc5M19SRUdfRkFOX01JTihpbmRleCkJKDB4OTAgKyAyICogKGluZGV4KSkJLyogSGlnaCBieXRlICovCisKKyNkZWZpbmUgVzgzNzkzX1JFR19QV01fREVGQVVMVAkJMHhiMgorI2RlZmluZSBXODM3OTNfUkVHX1BXTV9FTkFCTEUJCTB4MjA3CisjZGVmaW5lIFc4Mzc5M19SRUdfUFdNX1VQVElNRQkJMHhjMwkvKiBVbml0IGluIDAuMSBzZWNvbmQgKi8KKyNkZWZpbmUgVzgzNzkzX1JFR19QV01fRE9XTlRJTUUJCTB4YzQJLyogVW5pdCBpbiAwLjEgc2Vjb25kICovCisjZGVmaW5lIFc4Mzc5M19SRUdfVEVNUF9DUklUSUNBTAkweGM1CisKKyNkZWZpbmUgUFdNX0RVVFkJCQkwCisjZGVmaW5lIFBXTV9TVEFSVAkJCTEKKyNkZWZpbmUgUFdNX05PTlNUT1AJCQkyCisjZGVmaW5lIFc4Mzc5M19SRUdfUFdNKGluZGV4LCBucikJKCgobnIpID09IDAgPyAweGIzIDogXAorCQkJCQkgKG5yKSA9PSAxID8gMHgyMjAgOiAweDIxOCkgKyAoaW5kZXgpKQorCisvKiBiaXQgZmllbGQsIGZhbjEgaXMgYml0MCwgZmFuMiBpcyBiaXQxIC4uLiAqLworI2RlZmluZSBXODM3OTNfUkVHX1RFTVBfRkFOX01BUChpbmRleCkJKDB4MjAxICsgKGluZGV4KSkKKyNkZWZpbmUgVzgzNzkzX1JFR19URU1QX1RPTChpbmRleCkJKDB4MjA4ICsgKGluZGV4KSkKKyNkZWZpbmUgVzgzNzkzX1JFR19URU1QX0NSVUlTRShpbmRleCkJKDB4MjEwICsgKGluZGV4KSkKKyNkZWZpbmUgVzgzNzkzX1JFR19QV01fU1RPUF9USU1FKGluZGV4KQkoMHgyMjggKyAoaW5kZXgpKQorI2RlZmluZSBXODM3OTNfUkVHX1NGMl9URU1QKGluZGV4LCBucikJKDB4MjMwICsgKChpbmRleCkgPDwgNCkgKyAobnIpKQorI2RlZmluZSBXODM3OTNfUkVHX1NGMl9QV00oaW5kZXgsIG5yKQkoMHgyMzggKyAoKGluZGV4KSA8PCA0KSArIChucikpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBGQU5fRlJPTV9SRUcodTE2IHZhbCkKK3sKKwlpZiAoKHZhbCA+PSAweGZmZikgfHwgKHZhbCA9PSAwKSkKKwkJcmV0dXJuCTA7CisJcmV0dXJuICgxMzUwMDAwVUwgLyB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBGQU5fVE9fUkVHKGxvbmcgcnBtKQoreworCWlmIChycG0gPD0gMCkKKwkJcmV0dXJuIDB4MGZmZjsKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIChycG0gPj4gMSkpIC8gcnBtLCAxLCAweGZmZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBUSU1FX0ZST01fUkVHKHU4IHJlZykKK3sKKwlyZXR1cm4gKHJlZyAqIDEwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggVElNRV9UT19SRUcodW5zaWduZWQgbG9uZyB2YWwpCit7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKHZhbCArIDUwKSAvIDEwMCwgMCwgMHhmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBURU1QX0ZST01fUkVHKHM4IHJlZykKK3sKKwlyZXR1cm4gKHJlZyAqIDEwMDApOworfQorCitzdGF0aWMgaW5saW5lIHM4IFRFTVBfVE9fUkVHKGxvbmcgdmFsLCBzOCBtaW4sIHM4IG1heCkKK3sKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgodmFsICsgKHZhbCA8IDAgPyAtNTAwIDogNTAwKSkgLyAxMDAwLCBtaW4sIG1heCk7Cit9CisKK3N0cnVjdCB3ODM3OTNfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBpMmNfY2xpZW50ICpsbTc1WzJdOworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKKwlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9ub252b2xhdGlsZTsJLyogSW4gamlmZmllcywgbGFzdCB0aW1lIHdlIHVwZGF0ZSB0aGUKKwkJCQkJICAgbm9udm9sYXRpbGUgcmVnaXN0ZXJzICovCisKKwl1OCBiYW5rOworCXU4IHZybTsKKwl1OCB2aWRbMl07CisJdTggaW5bMTBdWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUsIHJlYWQvaGlnaC9sb3cgKi8KKwl1OCBpbl9sb3dfYml0c1szXTsJLyogQWRkaXRpb25hbCByZXNvbHV0aW9uIGZvciBWQ29yZSBBL0IgVnR0ICovCisKKwl1MTYgaGFzX2ZhbjsJCS8qIE9ubHkgZmFuMS0gZmFuNSBoYXMgb3duIHBpbnMgKi8KKwl1MTYgZmFuWzEyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlIGNvbWJpbmUgKi8KKwl1MTYgZmFuX21pblsxMl07CS8qIFJlZ2lzdGVyIHZhbHVlIGNvbWJpbmUgKi8KKworCXM4IHRlbXBbNl1bNV07CQkvKiBjdXJyZW50LCBjcml0LCBjcml0X2h5c3Qsd2Fybiwgd2Fybl9oeXN0ICovCisJdTggdGVtcF9sb3dfYml0czsJLyogQWRkaXRpb25hbCByZXNvbHV0aW9uIFREMS1URDQgKi8KKwl1OCB0ZW1wX21vZGVbMl07CS8qIGJ5dGUgMDogVGVtcCBEMS1ENCBtb2RlIGVhY2ggaGFzIDIgYml0cworCQkJCSAgIGJ5dGUgMTogVGVtcCBSMSxSMiBtb2RlLCBlYWNoIGhhcyAxIGJpdCAqLworCXU4IHRlbXBfY3JpdGljYWw7CS8qIElmIHJlYWNoZWQgYWxsIGZhbiB3aWxsIGJlIGF0IGZ1bGwgc3BlZWQgKi8KKwl1OCB0ZW1wX2Zhbl9tYXBbNl07CS8qIFRlbXAgY29udHJvbHMgd2hpY2ggcHdtIGZhbiwgYml0IGZpZWxkICovCisKKwl1OCBoYXNfcHdtOworCXU4IHB3bV9lbmFibGU7CQkvKiBSZWdpc3RlciB2YWx1ZSwgZWFjaCBUZW1wIGhhcyAxIGJpdCAqLworCXU4IHB3bV91cHRpbWU7CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IHB3bV9kb3dudGltZTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBwd21fZGVmYXVsdDsJCS8qIEFsbCBmYW4gZGVmYXVsdCBwd20sIG5leHQgcG93ZXJvbiB2YWxpZCAqLworCXU4IHB3bVs4XVszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggcHdtX3N0b3BfdGltZVs4XTsKKwl1OCB0ZW1wX2NydWlzZVs2XTsKKworCXU4IGFsYXJtc1s1XTsJCS8qIHJlYWx0aW1lIHN0YXR1cyByZWdpc3RlcnMgKi8KKwl1OCBiZWVwc1s1XTsKKwl1OCBiZWVwX2VuYWJsZTsKKwl1OCB0b2xlcmFuY2VbM107CS8qIFRlbXAgdG9sZXJhbmNlKFNtYXJ0IEZhbiBJL0lJKSAqLworCXU4IHNmMl9wd21bNl1bN107CS8qIFNtYXJ0IEZhbklJOiBGYW4gZHV0eSBjeWNsZSAqLworCXU4IHNmMl90ZW1wWzZdWzddOwkvKiBTbWFydCBGYW5JSTogVGVtcCBsZXZlbCBwb2ludCAqLworfTsKKworc3RhdGljIHU4IHc4Mzc5M19yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcpOworc3RhdGljIGludCB3ODM3OTNfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZywgdTggdmFsdWUpOworc3RhdGljIGludCB3ODM3OTNfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgdzgzNzkzX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IHc4Mzc5M19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgdzgzNzkzX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgdzgzNzkzX3VwZGF0ZV9ub252b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCB3ODM3OTNfZGF0YSAqdzgzNzkzX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHc4Mzc5M19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAidzgzNzkzIiwKKwl9LAorCS5hdHRhY2hfYWRhcHRlciA9IHc4Mzc5M19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IHc4Mzc5M19kZXRhY2hfY2xpZW50LAorfTsKKworc3RhdGljIHNzaXplX3QKK3Nob3dfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnZybSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3ZpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gdzgzNzkzX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPQorCSAgICB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgaW5kZXggPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZFtpbmRleF0sIGRhdGEtPnZybSkpOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZGF0YS0+dnJtID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIEFMQVJNX1NUQVRVUwkJCTAKKyNkZWZpbmUgQkVFUF9FTkFCTEUJCQkxCitzdGF0aWMgc3NpemVfdAorc2hvd19hbGFybV9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNzkzX2RhdGEgKmRhdGEgPSB3ODM3OTNfdXBkYXRlX2RldmljZShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9CisJICAgIHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5ucjsKKwlpbnQgaW5kZXggPSBzZW5zb3JfYXR0ci0+aW5kZXggPj4gMzsKKwlpbnQgYml0ID0gc2Vuc29yX2F0dHItPmluZGV4ICYgMHgwNzsKKwl1OCB2YWw7CisKKwlpZiAoQUxBUk1fU1RBVFVTID09IG5yKSB7CisJCXZhbCA9IChkYXRhLT5hbGFybXNbaW5kZXhdID4+IChiaXQpKSAmIDE7CisJfSBlbHNlIHsJCS8qIEJFRVBfRU5BQkxFICovCisJCXZhbCA9IChkYXRhLT5iZWVwc1tpbmRleF0gPj4gKGJpdCkpICYgMTsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX2JlZXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9CisJICAgIHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleCA+PiAzOworCWludCBzaGlmdCA9IHNlbnNvcl9hdHRyLT5pbmRleCAmIDB4MDc7CisJdTggYmVlcF9iaXQgPSAxIDw8IHNoaWZ0OworCXU4IHZhbDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWlmICh2YWwgIT0gMCAmJiB2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YmVlcHNbaW5kZXhdID0gdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX0JFRVAoaW5kZXgpKTsKKwlkYXRhLT5iZWVwc1tpbmRleF0gJj0gfmJlZXBfYml0OworCWRhdGEtPmJlZXBzW2luZGV4XSB8PSB2YWwgPDwgc2hpZnQ7CisJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19CRUVQKGluZGV4KSwgZGF0YS0+YmVlcHNbaW5kZXhdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3Nob3dfYmVlcF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IHc4Mzc5M191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIChkYXRhLT5iZWVwX2VuYWJsZSA+PiAxKSAmIDB4MDEpOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfYmVlcF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5iZWVwX2VuYWJsZSA9IHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19PVlRfQkVFUCkKKwkJCSAgICAmIDB4ZmQ7CisJZGF0YS0+YmVlcF9lbmFibGUgfD0gdmFsIDw8IDE7CisJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19PVlRfQkVFUCwgZGF0YS0+YmVlcF9lbmFibGUpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisvKiBXcml0ZSBhbnkgdmFsdWUgdG8gY2xlYXIgY2hhc3NpcyBhbGFybSAqLworc3RhdGljIHNzaXplX3QKK3N0b3JlX2NoYXNzaXNfY2xlYXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IHZhbDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwl2YWwgPSB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfQ0xSX0NIQVNTSVMpOworCXZhbCB8PSAweDgwOworCXc4Mzc5M193cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfQ0xSX0NIQVNTSVMsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIEZBTl9JTlBVVAkJCTAKKyNkZWZpbmUgRkFOX01JTgkJCQkxCitzdGF0aWMgc3NpemVfdAorc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9CisJICAgIHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5ucjsKKwlpbnQgaW5kZXggPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gdzgzNzkzX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwl1MTYgdmFsOworCisJaWYgKEZBTl9JTlBVVCA9PSBucikgeworCQl2YWwgPSBkYXRhLT5mYW5baW5kZXhdICYgMHgwZmZmOworCX0gZWxzZSB7CisJCXZhbCA9IGRhdGEtPmZhbl9taW5baW5kZXhdICYgMHgwZmZmOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgRkFOX0ZST01fUkVHKHZhbCkpOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9CisJICAgIHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUxNiB2YWwgPSBGQU5fVE9fUkVHKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW2luZGV4XSA9IHZhbDsKKwl3ODM3OTNfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX0ZBTl9NSU4oaW5kZXgpLAorCQkJICAgKHZhbCA+PiA4KSAmIDB4ZmYpOworCXc4Mzc5M193cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfRkFOX01JTihpbmRleCkgKyAxLCB2YWwgJiAweGZmKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBQV01fRFVUWQkJCTAKKyNkZWZpbmUgUFdNX1NUQVJUCQkJMQorI2RlZmluZSBQV01fTk9OU1RPUAkJCTIKKyNkZWZpbmUgUFdNX1NUT1BfVElNRQkJCTMKK3N0YXRpYyBzc2l6ZV90CitzaG93X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gdzgzNzkzX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwl1MTYgdmFsOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5ucjsKKwlpbnQgaW5kZXggPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisKKwlpZiAoUFdNX1NUT1BfVElNRSA9PSBucikKKwkJdmFsID0gVElNRV9GUk9NX1JFRyhkYXRhLT5wd21fc3RvcF90aW1lW2luZGV4XSk7CisJZWxzZQorCQl2YWwgPSAoZGF0YS0+cHdtW2luZGV4XVtucl0gJiAweDNmKSA8PCAyOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwl1OCB2YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKFBXTV9TVE9QX1RJTUUgPT0gbnIpIHsKKwkJdmFsID0gVElNRV9UT19SRUcoc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkpOworCQlkYXRhLT5wd21fc3RvcF90aW1lW2luZGV4XSA9IHZhbDsKKwkJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19QV01fU1RPUF9USU1FKGluZGV4KSwKKwkJCQkgICB2YWwpOworCX0gZWxzZSB7CisJCXZhbCA9IFNFTlNPUlNfTElNSVQoc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCksIDAsIDB4ZmYpCisJCSAgICAgID4+IDI7CisJCWRhdGEtPnB3bVtpbmRleF1bbnJdID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19QV00oaW5kZXgsIG5yKSkgJiAweGMwOworCQlkYXRhLT5wd21baW5kZXhdW25yXSB8PSB2YWw7CisJCXc4Mzc5M193cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfUFdNKGluZGV4LCBuciksCisJCQkJCQkJZGF0YS0+cHdtW2luZGV4XVtucl0pOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3Nob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgdzgzNzkzX2RhdGEgKmRhdGEgPSB3ODM3OTNfdXBkYXRlX2RldmljZShkZXYpOworCWxvbmcgdGVtcCA9IFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcFtpbmRleF1bbnJdKTsKKworCWlmIChURU1QX1JFQUQgPT0gbnIgJiYgaW5kZXggPCA0KSB7CS8qIE9ubHkgVEQxLVRENCBoYXZlIGxvdyBiaXRzICovCisJCWludCBsb3cgPSAoKGRhdGEtPnRlbXBfbG93X2JpdHMgPj4gKGluZGV4ICogMikpICYgMHgwMykgKiAyNTA7CisJCXRlbXAgKz0gdGVtcCA+IDAgPyBsb3cgOiAtbG93OworCX0KKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIHRlbXApOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9CisJICAgIHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5ucjsKKwlpbnQgaW5kZXggPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzNzkzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHRtcCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcFtpbmRleF1bbnJdID0gVEVNUF9UT19SRUcodG1wLCAtMTI4LCAxMjcpOworCXc4Mzc5M193cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfVEVNUFtpbmRleF1bbnJdLAorCQkJICAgZGF0YS0+dGVtcFtpbmRleF1bbnJdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisJVEQxLVRENAorCWVhY2ggaGFzIDQgbW9kZTooMiBiaXRzKQorCTA6CVN0b3AgbW9uaXRvcgorCTE6CVVzZSBpbnRlcm5hbCB0ZW1wIHNlbnNvcihkZWZhdWx0KQorCTI6CVVzZSBzZW5zb3IgaW4gQU1EIENQVSBhbmQgZ2V0IHJlc3VsdCBieSBBTURTSQorCTM6CVVzZSBzZW5zb3IgaW4gSW50ZWwgQ1BVIGFuZCBnZXQgcmVzdWx0IGJ5IFBFQ0kKKworCVRSMS1UUjIKKwllYWNoIGhhcyAyIG1vZGU6KDEgYml0KQorCTA6CURpc2FibGUgdGVtcCBzZW5zb3IgbW9uaXRvcgorCTE6CVRvIGVuYWJsZSB0ZW1wIHNlbnNvcnMgbW9uaXRvcgorKi8KKworLyogMCBkaXNhYmxlLCA1IEFNRFNJLCA2IFBFQ0kgKi8KK3N0YXRpYyB1OCBUT19URU1QX01PREVbXSA9IHsgMCwgMCwgNSwgNiB9OworCitzdGF0aWMgc3NpemVfdAorc2hvd190ZW1wX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IHc4Mzc5M191cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IGluZGV4ID0gc2Vuc29yX2F0dHItPmluZGV4OworCXU4IG1hc2sgPSAoaW5kZXggPCA0KSA/IDB4MDMgOiAweDAxOworCXU4IHNoaWZ0ID0gKGluZGV4IDwgNCkgPyAoMiAqIGluZGV4KSA6IChpbmRleCAtIDQpOworCXU4IHRtcDsKKwlpbmRleCA9IChpbmRleCA8IDQpID8gMCA6IDE7CisKKwl0bXAgPSAoZGF0YS0+dGVtcF9tb2RlW2luZGV4XSA+PiBzaGlmdCkgJiBtYXNrOworCisJLyogZm9yIHRoZSBpbnRlcm5hbCBzZW5zb3IsIGZvdW5kIG91dCBpZiBkaW9kZSBvciB0aGVybWlzdG9yICovCisJaWYgKHRtcCA9PSAxKSB7CisJCXRtcCA9IGluZGV4ID09IDAgPyAzIDogNDsKKwl9IGVsc2UgeworCQl0bXAgPSBUT19URU1QX01PREVbdG1wXTsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG1wKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX3RlbXBfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9CisJICAgIHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwl1OCBtYXNrID0gKGluZGV4IDwgNCkgPyAweDAzIDogMHgwMTsKKwl1OCBzaGlmdCA9IChpbmRleCA8IDQpID8gKDIgKiBpbmRleCkgOiAoaW5kZXggLSA0KTsKKwl1OCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCS8qIHRyYW5zZm9ybSB0aGUgc3lzZnMgaW50ZXJmYWNlIHZhbHVlcyBpbnRvIHRhYmxlIGFib3ZlICovCisJaWYgKCh2YWwgPT0gNSB8fCB2YWwgPT0gNikgJiYgKGluZGV4IDwgNCkpIHsKKwkJdmFsIC09IDM7CisJfSBlbHNlIGlmICgodmFsID09IDMgJiYgaW5kZXggPCA0KQorCQl8fCAodmFsID09IDQgJiYgaW5kZXggPj0gNCkKKwkJfHwgdmFsID09IDApIHsKKwkJLyogdHJhbnNmb3JtIGRpb2RlIG9yIHRoZXJtaXN0b3IgaW50byBpbnRlcm5hbCBlbmFibGUgKi8KKwkJdmFsID0gISF2YWw7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5kZXggPSAoaW5kZXggPCA0KSA/IDAgOiAxOworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21vZGVbaW5kZXhdID0KKwkgICAgdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1RFTVBfTU9ERVtpbmRleF0pOworCWRhdGEtPnRlbXBfbW9kZVtpbmRleF0gJj0gfihtYXNrIDw8IHNoaWZ0KTsKKwlkYXRhLT50ZW1wX21vZGVbaW5kZXhdIHw9IHZhbCA8PCBzaGlmdDsKKwl3ODM3OTNfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1RFTVBfTU9ERVtpbmRleF0sCisJCQkJCQkJZGF0YS0+dGVtcF9tb2RlW2luZGV4XSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgU0VUVVBfUFdNX0RFRkFVTFQJCTAKKyNkZWZpbmUgU0VUVVBfUFdNX1VQVElNRQkJMQkvKiBVbml0IGluIDAuMXMgKi8KKyNkZWZpbmUgU0VUVVBfUFdNX0RPV05USU1FCQkyCS8qIFVuaXQgaW4gMC4xcyAqLworI2RlZmluZSBTRVRVUF9URU1QX0NSSVRJQ0FMCQkzCitzdGF0aWMgc3NpemVfdAorc2hvd19zZl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IHc4Mzc5M191cGRhdGVfZGV2aWNlKGRldik7CisJdTMyIHZhbCA9IDA7CisKKwlpZiAoU0VUVVBfUFdNX0RFRkFVTFQgPT0gbnIpIHsKKwkJdmFsID0gKGRhdGEtPnB3bV9kZWZhdWx0ICYgMHgzZikgPDwgMjsKKwl9IGVsc2UgaWYgKFNFVFVQX1BXTV9VUFRJTUUgPT0gbnIpIHsKKwkJdmFsID0gVElNRV9GUk9NX1JFRyhkYXRhLT5wd21fdXB0aW1lKTsKKwl9IGVsc2UgaWYgKFNFVFVQX1BXTV9ET1dOVElNRSA9PSBucikgeworCQl2YWwgPSBUSU1FX0ZST01fUkVHKGRhdGEtPnB3bV9kb3dudGltZSk7CisJfSBlbHNlIGlmIChTRVRVUF9URU1QX0NSSVRJQ0FMID09IG5yKSB7CisJCXZhbCA9IFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9jcml0aWNhbCAmIDB4N2YpOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfc2Zfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKFNFVFVQX1BXTV9ERUZBVUxUID09IG5yKSB7CisJCWRhdGEtPnB3bV9kZWZhdWx0ID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19QV01fREVGQVVMVCkgJiAweGMwOworCQlkYXRhLT5wd21fZGVmYXVsdCB8PSBTRU5TT1JTX0xJTUlUKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwKKwkJCQkJCQkJICAxMCksCisJCQkJCQkgICAwLCAweGZmKSA+PiAyOworCQl3ODM3OTNfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1BXTV9ERUZBVUxULAorCQkJCQkJCWRhdGEtPnB3bV9kZWZhdWx0KTsKKwl9IGVsc2UgaWYgKFNFVFVQX1BXTV9VUFRJTUUgPT0gbnIpIHsKKwkJZGF0YS0+cHdtX3VwdGltZSA9IFRJTUVfVE9fUkVHKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApKTsKKwkJZGF0YS0+cHdtX3VwdGltZSArPSBkYXRhLT5wd21fdXB0aW1lID09IDAgPyAxIDogMDsKKwkJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19QV01fVVBUSU1FLAorCQkJCQkJCWRhdGEtPnB3bV91cHRpbWUpOworCX0gZWxzZSBpZiAoU0VUVVBfUFdNX0RPV05USU1FID09IG5yKSB7CisJCWRhdGEtPnB3bV9kb3dudGltZSA9IFRJTUVfVE9fUkVHKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApKTsKKwkJZGF0YS0+cHdtX2Rvd250aW1lICs9IGRhdGEtPnB3bV9kb3dudGltZSA9PSAwID8gMSA6IDA7CisJCXc4Mzc5M193cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfUFdNX0RPV05USU1FLAorCQkJCQkJCWRhdGEtPnB3bV9kb3dudGltZSk7CisJfSBlbHNlIHsJCS8qIFNFVFVQX1RFTVBfQ1JJVElDQUwgKi8KKwkJZGF0YS0+dGVtcF9jcml0aWNhbCA9CisJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfVEVNUF9DUklUSUNBTCkgJiAweDgwOworCQlkYXRhLT50ZW1wX2NyaXRpY2FsIHw9IFRFTVBfVE9fUkVHKHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCksCisJCQkJCQkgICAwLCAweDdmKTsKKwkJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19URU1QX0NSSVRJQ0FMLAorCQkJCQkJCWRhdGEtPnRlbXBfY3JpdGljYWwpOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworLyoKKwlUZW1wIFNtYXJ0RmFuIGNvbnRyb2wKKwlURU1QX0ZBTl9NQVAKKwlUZW1wIGNoYW5uZWwgY29udHJvbCB3aGljaCBwd20gZmFuLCBiaXRmaWVsZCwgYml0IDAgaW5kaWNhdGUgcHdtMS4uLgorCUl0J3MgcG9zc2libGUgdHdvIG9yIG1vcmUgdGVtcCBjaGFubmVscyBjb250cm9sIHRoZSBzYW1lIGZhbiwgdzgzNzkzCisJYWx3YXlzIHByZWZlcnMgdG8gcGljayB0aGUgbW9zdCBjcml0aWNhbCByZXF1ZXN0IGFuZCBhcHBsaWVzIGl0IHRvCisJdGhlIHJlbGF0ZWQgRmFuLgorCUl0J3MgcG9zc2libGUgb25lIGZhbiBpcyBub3QgaW4gYW55IG1hcHBpbmcgb2YgNiB0ZW1wIGNoYW5uZWxzLCB0aGlzCisJbWVhbnMgdGhlIGZhbiBpcyBtYW51YWwgbW9kZQorCisJVEVNUF9QV01fRU5BQkxFCisJRWFjaCB0ZW1wIGNoYW5uZWwgaGFzIGl0cyBvd24gU21hcnRGYW4gbW9kZSwgYW5kIHRlbXAgY2hhbm5lbAorCWNvbnRyb2wJZmFucyB0aGF0IGFyZSBzZXQgYnkgVEVNUF9GQU5fTUFQCisJMDoJU21hcnRGYW5JSSBtb2RlCisJMToJVGhlcm1hbCBDcnVpc2UgTW9kZQorCisJVEVNUF9DUlVJU0UKKwlUYXJnZXQgdGVtcGVyYXR1cmUgaW4gdGhlcm1hbCBjcnVpc2UgbW9kZSwgdzgzNzkzIHdpbGwgdHJ5IHRvIHR1cm4KKwlmYW4gc3BlZWQgdG8ga2VlcCB0aGUgdGVtcGVyYXR1cmUgb2YgdGFyZ2V0IGRldmljZSBhcm91bmQgdGhpcworCXRlbXBlcmF0dXJlLgorCisJVEVNUF9UT0xFUkFOQ0UKKwlJZiBUZW1wIGhpZ2hlciBvciBsb3dlciB0aGFuIHRhcmdldCB3aXRoIHRoaXMgdG9sZXJhbmNlLCB3ODM3OTMKKwl3aWxsIHRha2UgYWN0aW9ucyB0byBzcGVlZCB1cCBvciBzbG93IGRvd24gdGhlIGZhbiB0byBrZWVwIHRoZQorCXRlbXBlcmF0dXJlIHdpdGhpbiB0aGUgdG9sZXJhbmNlIHJhbmdlLgorKi8KKworI2RlZmluZSBURU1QX0ZBTl9NQVAJCQkwCisjZGVmaW5lIFRFTVBfUFdNX0VOQUJMRQkJCTEKKyNkZWZpbmUgVEVNUF9DUlVJU0UJCQkyCisjZGVmaW5lIFRFTVBfVE9MRVJBTkNFCQkJMworc3RhdGljIHNzaXplX3QKK3Nob3dfc2ZfY3RybChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgdzgzNzkzX2RhdGEgKmRhdGEgPSB3ODM3OTNfdXBkYXRlX2RldmljZShkZXYpOworCXUzMiB2YWw7CisKKwlpZiAoVEVNUF9GQU5fTUFQID09IG5yKSB7CisJCXZhbCA9IGRhdGEtPnRlbXBfZmFuX21hcFtpbmRleF07CisJfSBlbHNlIGlmIChURU1QX1BXTV9FTkFCTEUgPT0gbnIpIHsKKwkJLyogKzIgdG8gdHJhbnNmcm9tIGludG8gMiBhbmQgMyB0byBjb25mb3JtIHdpdGggc3lzZnMgaW50ZiAqLworCQl2YWwgPSAoKGRhdGEtPnB3bV9lbmFibGUgPj4gaW5kZXgpICYgMHgwMSkgKyAyOworCX0gZWxzZSBpZiAoVEVNUF9DUlVJU0UgPT0gbnIpIHsKKwkJdmFsID0gVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2NydWlzZVtpbmRleF0gJiAweDdmKTsKKwl9IGVsc2UgewkJLyogVEVNUF9UT0xFUkFOQ0UgKi8KKwkJdmFsID0gZGF0YS0+dG9sZXJhbmNlW2luZGV4ID4+IDFdID4+ICgoaW5kZXggJiAweDAxKSA/IDQgOiAwKTsKKwkJdmFsID0gVEVNUF9GUk9NX1JFRyh2YWwgJiAweDBmKTsKKwl9CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9zZl9jdHJsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKFRFTVBfRkFOX01BUCA9PSBucikgeworCQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAmIDB4ZmY7CisJCXc4Mzc5M193cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfVEVNUF9GQU5fTUFQKGluZGV4KSwgdmFsKTsKKwkJZGF0YS0+dGVtcF9mYW5fbWFwW2luZGV4XSA9IHZhbDsKKwl9IGVsc2UgaWYgKFRFTVBfUFdNX0VOQUJMRSA9PSBucikgeworCQl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwkJaWYgKDIgPT0gdmFsIHx8IDMgPT0gdmFsKSB7CisJCQlkYXRhLT5wd21fZW5hYmxlID0KKwkJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfUFdNX0VOQUJMRSk7CisJCQlpZiAodmFsIC0gMikKKwkJCQlkYXRhLT5wd21fZW5hYmxlIHw9IDEgPDwgaW5kZXg7CisJCQllbHNlCisJCQkJZGF0YS0+cHdtX2VuYWJsZSAmPSB+KDEgPDwgaW5kZXgpOworCQkJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19QV01fRU5BQkxFLAorCQkJCQkJCWRhdGEtPnB3bV9lbmFibGUpOworCQl9IGVsc2UgeworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoVEVNUF9DUlVJU0UgPT0gbnIpIHsKKwkJZGF0YS0+dGVtcF9jcnVpc2VbaW5kZXhdID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19URU1QX0NSVUlTRShpbmRleCkpOworCQl2YWwgPSBURU1QX1RPX1JFRyhzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApLCAwLCAweDdmKTsKKwkJZGF0YS0+dGVtcF9jcnVpc2VbaW5kZXhdICY9IDB4ODA7CisJCWRhdGEtPnRlbXBfY3J1aXNlW2luZGV4XSB8PSB2YWw7CisKKwkJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19URU1QX0NSVUlTRShpbmRleCksCisJCQkJCQlkYXRhLT50ZW1wX2NydWlzZVtpbmRleF0pOworCX0gZWxzZSB7CQkvKiBURU1QX1RPTEVSQU5DRSAqLworCQlpbnQgaSA9IGluZGV4ID4+IDE7CisJCXU4IHNoaWZ0ID0gKGluZGV4ICYgMHgwMSkgPyA0IDogMDsKKwkJZGF0YS0+dG9sZXJhbmNlW2ldID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19URU1QX1RPTChpKSk7CisKKwkJdmFsID0gVEVNUF9UT19SRUcoc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKSwgMCwgMHgwZik7CisJCWRhdGEtPnRvbGVyYW5jZVtpXSAmPSB+KDB4MGYgPDwgc2hpZnQpOworCQlkYXRhLT50b2xlcmFuY2VbaV0gfD0gdmFsIDw8IHNoaWZ0OworCQl3ODM3OTNfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1RFTVBfVE9MKGkpLAorCQkJCQkJCWRhdGEtPnRvbGVyYW5jZVtpXSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc2hvd19zZjJfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPQorCSAgICB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+bnI7CisJaW50IGluZGV4ID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IHc4Mzc5M191cGRhdGVfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGRhdGEtPnNmMl9wd21baW5kZXhdW25yXSAmIDB4M2YpIDw8IDIpOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfc2YyX3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwl1OCB2YWwgPSBTRU5TT1JTX0xJTUlUKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApLCAwLCAweGZmKSA+PiAyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnNmMl9wd21baW5kZXhdW25yXSA9CisJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19TRjJfUFdNKGluZGV4LCBucikpICYgMHhjMDsKKwlkYXRhLT5zZjJfcHdtW2luZGV4XVtucl0gfD0gdmFsOworCXc4Mzc5M193cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfU0YyX1BXTShpbmRleCwgbnIpLAorCQkJCQkJZGF0YS0+c2YyX3B3bVtpbmRleF1bbnJdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3NmMl90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPQorCSAgICB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+bnI7CisJaW50IGluZGV4ID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IHc4Mzc5M191cGRhdGVfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsCisJCSAgICAgICBURU1QX0ZST01fUkVHKGRhdGEtPnNmMl90ZW1wW2luZGV4XVtucl0gJiAweDdmKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9zZjJfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9CisJICAgIHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5ucjsKKwlpbnQgaW5kZXggPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJdTggdmFsID0gVEVNUF9UT19SRUcoc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKSwgMCwgMHg3Zik7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+c2YyX3RlbXBbaW5kZXhdW25yXSA9CisJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19TRjJfVEVNUChpbmRleCwgbnIpKSAmIDB4ODA7CisJZGF0YS0+c2YyX3RlbXBbaW5kZXhdW25yXSB8PSB2YWw7CisJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19TRjJfVEVNUChpbmRleCwgbnIpLAorCQkJCQkgICAgIGRhdGEtPnNmMl90ZW1wW2luZGV4XVtucl0pOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworLyogb25seSBWY29yZSBBL0IgYW5kIFZ0dCBoYXZlIGFkZGl0aW9uYWwgMiBiaXRzIHByZWNpc2lvbiAqLworc3RhdGljIHNzaXplX3QKK3Nob3dfaW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9CisJICAgIHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5ucjsKKwlpbnQgaW5kZXggPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gdzgzNzkzX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwl1MTYgdmFsID0gZGF0YS0+aW5baW5kZXhdW25yXTsKKworCWlmIChpbmRleCA8IDMpIHsKKwkJdmFsIDw8PSAyOworCQl2YWwgKz0gKGRhdGEtPmluX2xvd19iaXRzW25yXSA+PiAoaW5kZXggKiAyKSkgJiAweDM7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwgKiBzY2FsZV9pbltpbmRleF0pOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfaW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWw7CisKKwl2YWwgPQorCSAgICAoc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgKworCSAgICAgc2NhbGVfaW5baW5kZXhdIC8gMikgLyBzY2FsZV9pbltpbmRleF07CisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmIChpbmRleCA+IDIpIHsKKwkJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7CisJfSBlbHNlIHsKKwkJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDB4M0ZGKTsKKwkJZGF0YS0+aW5fbG93X2JpdHNbbnJdID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19JTl9MT1dfQklUU1tucl0pOworCQlkYXRhLT5pbl9sb3dfYml0c1tucl0gJj0gfigweDAzIDw8ICgyICogaW5kZXgpKTsKKwkJZGF0YS0+aW5fbG93X2JpdHNbbnJdIHw9ICh2YWwgJiAweDAzKSA8PCAoMiAqIGluZGV4KTsKKwkJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19JTl9MT1dfQklUU1tucl0sCisJCQkJCQkgICAgIGRhdGEtPmluX2xvd19iaXRzW25yXSk7CisJCXZhbCA+Pj0gMjsKKwl9CisJZGF0YS0+aW5baW5kZXhdW25yXSA9IHZhbDsKKwl3ODM3OTNfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX0lOW2luZGV4XVtucl0sCisJCQkJCQkJZGF0YS0+aW5baW5kZXhdW25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIE5PVF9VU0VECQkJLTEKKworI2RlZmluZSBTRU5TT1JfQVRUUl9JTihpbmRleCkJCQkJCQlcCisJU0VOU09SX0FUVFJfMihpbiMjaW5kZXgjI19pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwJXAorCQlJTl9SRUFELCBpbmRleCksCQkJCQlcCisJU0VOU09SX0FUVFJfMihpbiMjaW5kZXgjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2luLAlcCisJCXN0b3JlX2luLCBJTl9NQVgsIGluZGV4KSwJCQkJXAorCVNFTlNPUl9BVFRSXzIoaW4jI2luZGV4IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19pbiwJXAorCQlzdG9yZV9pbiwgSU5fTE9XLCBpbmRleCksCQkJCVwKKwlTRU5TT1JfQVRUUl8yKGluIyNpbmRleCMjX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtX2JlZXAsCVwKKwkJTlVMTCwgQUxBUk1fU1RBVFVTLCBpbmRleCArICgoaW5kZXggPiAyKSA/IDEgOiAwKSksCVwKKwlTRU5TT1JfQVRUUl8yKGluIyNpbmRleCMjX2JlZXAsIFNfSVdVU1IgfCBTX0lSVUdPLAkJXAorCQlzaG93X2FsYXJtX2JlZXAsIHN0b3JlX2JlZXAsIEJFRVBfRU5BQkxFLAkJXAorCQlpbmRleCArICgoaW5kZXggPiAyKSA/IDEgOiAwKSkKKworI2RlZmluZSBTRU5TT1JfQVRUUl9GQU4oaW5kZXgpCQkJCQkJXAorCVNFTlNPUl9BVFRSXzIoZmFuIyNpbmRleCMjX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtX2JlZXAsCVwKKwkJTlVMTCwgQUxBUk1fU1RBVFVTLCBpbmRleCArIDE3KSwJCQlcCisJU0VOU09SX0FUVFJfMihmYW4jI2luZGV4IyNfYmVlcCwgU19JV1VTUiB8IFNfSVJVR08sCQlcCisJCXNob3dfYWxhcm1fYmVlcCwgc3RvcmVfYmVlcCwgQkVFUF9FTkFCTEUsIGluZGV4ICsgMTcpLAlcCisJU0VOU09SX0FUVFJfMihmYW4jI2luZGV4IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLAkJXAorCQlOVUxMLCBGQU5fSU5QVVQsIGluZGV4IC0gMSksCQkJCVwKKwlTRU5TT1JfQVRUUl8yKGZhbiMjaW5kZXgjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAkJXAorCQlzaG93X2Zhbiwgc3RvcmVfZmFuX21pbiwgRkFOX01JTiwgaW5kZXggLSAxKQorCisjZGVmaW5lIFNFTlNPUl9BVFRSX1BXTShpbmRleCkJCQkJCQlcCisJU0VOU09SX0FUVFJfMihwd20jI2luZGV4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd20sCQlcCisJCXN0b3JlX3B3bSwgUFdNX0RVVFksIGluZGV4IC0gMSksCQkJXAorCVNFTlNPUl9BVFRSXzIocHdtIyNpbmRleCMjX25vbnN0b3AsIFNfSVdVU1IgfCBTX0lSVUdPLAkJXAorCQlzaG93X3B3bSwgc3RvcmVfcHdtLCBQV01fTk9OU1RPUCwgaW5kZXggLSAxKSwJCVwKKwlTRU5TT1JfQVRUUl8yKHB3bSMjaW5kZXgjI19zdGFydCwgU19JV1VTUiB8IFNfSVJVR08sCQlcCisJCXNob3dfcHdtLCBzdG9yZV9wd20sIFBXTV9TVEFSVCwgaW5kZXggLSAxKSwJCVwKKwlTRU5TT1JfQVRUUl8yKHB3bSMjaW5kZXgjI19zdG9wX3RpbWUsIFNfSVdVU1IgfCBTX0lSVUdPLAlcCisJCXNob3dfcHdtLCBzdG9yZV9wd20sIFBXTV9TVE9QX1RJTUUsIGluZGV4IC0gMSkKKworI2RlZmluZSBTRU5TT1JfQVRUUl9URU1QKGluZGV4KQkJCQkJCVwKKwlTRU5TT1JfQVRUUl8yKHRlbXAjI2luZGV4IyNfdHlwZSwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCXNob3dfdGVtcF9tb2RlLCBzdG9yZV90ZW1wX21vZGUsIE5PVF9VU0VELCBpbmRleCAtIDEpLAlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsCQlcCisJCU5VTEwsIFRFTVBfUkVBRCwgaW5kZXggLSAxKSwJCQkJXAorCVNFTlNPUl9BVFRSXzIodGVtcCMjaW5kZXgjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3RlbXAsCVwKKwkJc3RvcmVfdGVtcCwgVEVNUF9DUklULCBpbmRleCAtIDEpLAkJCVwKKwlTRU5TT1JfQVRUUl8yKHRlbXAjI2luZGV4IyNfbWF4X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfdGVtcCwgc3RvcmVfdGVtcCwgVEVNUF9DUklUX0hZU1QsIGluZGV4IC0gMSksCVwKKwlTRU5TT1JfQVRUUl8yKHRlbXAjI2luZGV4IyNfd2FybiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcCwJXAorCQlzdG9yZV90ZW1wLCBURU1QX1dBUk4sIGluZGV4IC0gMSksCQkJXAorCVNFTlNPUl9BVFRSXzIodGVtcCMjaW5kZXgjI193YXJuX2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfdGVtcCwgc3RvcmVfdGVtcCwgVEVNUF9XQVJOX0hZU1QsIGluZGV4IC0gMSksCVwKKwlTRU5TT1JfQVRUUl8yKHRlbXAjI2luZGV4IyNfYWxhcm0sIFNfSVJVR08sCQkJXAorCQlzaG93X2FsYXJtX2JlZXAsIE5VTEwsIEFMQVJNX1NUQVRVUywgaW5kZXggKyAxMSksCVwKKwlTRU5TT1JfQVRUUl8yKHRlbXAjI2luZGV4IyNfYmVlcCwgU19JV1VTUiB8IFNfSVJVR08sCQlcCisJCXNob3dfYWxhcm1fYmVlcCwgc3RvcmVfYmVlcCwgQkVFUF9FTkFCTEUsIGluZGV4ICsgMTEpLAlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fY2hhbm5lbHNfcHdtLAkJCVwKKwkJU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfc2ZfY3RybCwgc3RvcmVfc2ZfY3RybCwJCVwKKwkJVEVNUF9GQU5fTUFQLCBpbmRleCAtIDEpLAkJCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX3B3bV9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAlcCisJCXNob3dfc2ZfY3RybCwgc3RvcmVfc2ZfY3RybCwgVEVNUF9QV01fRU5BQkxFLAkJXAorCQlpbmRleCAtIDEpLAkJCQkJCVwKKwlTRU5TT1JfQVRUUl8yKHRoZXJtYWxfY3J1aXNlIyNpbmRleCwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCXNob3dfc2ZfY3RybCwgc3RvcmVfc2ZfY3RybCwgVEVNUF9DUlVJU0UsIGluZGV4IC0gMSksCVwKKwlTRU5TT1JfQVRUUl8yKHRvbGVyYW5jZSMjaW5kZXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3NmX2N0cmwsXAorCQlzdG9yZV9zZl9jdHJsLCBURU1QX1RPTEVSQU5DRSwgaW5kZXggLSAxKSwJCVwKKwlTRU5TT1JfQVRUUl8yKHRlbXAjI2luZGV4IyNfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X3NmMl9wd20sIHN0b3JlX3NmMl9wd20sIDAsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19zZjJfcHdtLCBzdG9yZV9zZjJfcHdtLCAxLCBpbmRleCAtIDEpLAkJXAorCVNFTlNPUl9BVFRSXzIodGVtcCMjaW5kZXgjI19hdXRvX3BvaW50M19wd20sIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfc2YyX3B3bSwgc3RvcmVfc2YyX3B3bSwgMiwgaW5kZXggLSAxKSwJCVwKKwlTRU5TT1JfQVRUUl8yKHRlbXAjI2luZGV4IyNfYXV0b19wb2ludDRfcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X3NmMl9wd20sIHN0b3JlX3NmMl9wd20sIDMsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19zZjJfcHdtLCBzdG9yZV9zZjJfcHdtLCA0LCBpbmRleCAtIDEpLAkJXAorCVNFTlNPUl9BVFRSXzIodGVtcCMjaW5kZXgjI19hdXRvX3BvaW50Nl9wd20sIFNfSVJVR08gfCBTX0lXVVNSLCBcCisJCXNob3dfc2YyX3B3bSwgc3RvcmVfc2YyX3B3bSwgNSwgaW5kZXggLSAxKSwJCVwKKwlTRU5TT1JfQVRUUl8yKHRlbXAjI2luZGV4IyNfYXV0b19wb2ludDdfcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X3NmMl9wd20sIHN0b3JlX3NmMl9wd20sIDYsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQxX3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLFwKKwkJc2hvd19zZjJfdGVtcCwgc3RvcmVfc2YyX3RlbXAsIDAsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLFwKKwkJc2hvd19zZjJfdGVtcCwgc3RvcmVfc2YyX3RlbXAsIDEsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLFwKKwkJc2hvd19zZjJfdGVtcCwgc3RvcmVfc2YyX3RlbXAsIDIsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQ0X3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLFwKKwkJc2hvd19zZjJfdGVtcCwgc3RvcmVfc2YyX3RlbXAsIDMsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQ1X3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLFwKKwkJc2hvd19zZjJfdGVtcCwgc3RvcmVfc2YyX3RlbXAsIDQsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQ2X3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLFwKKwkJc2hvd19zZjJfdGVtcCwgc3RvcmVfc2YyX3RlbXAsIDUsIGluZGV4IC0gMSksCQlcCisJU0VOU09SX0FUVFJfMih0ZW1wIyNpbmRleCMjX2F1dG9fcG9pbnQ3X3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLFwKKwkJc2hvd19zZjJfdGVtcCwgc3RvcmVfc2YyX3RlbXAsIDYsIGluZGV4IC0gMSkKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIHc4Mzc5M19zZW5zb3JfYXR0cl8yW10gPSB7CisJU0VOU09SX0FUVFJfSU4oMCksCisJU0VOU09SX0FUVFJfSU4oMSksCisJU0VOU09SX0FUVFJfSU4oMiksCisJU0VOU09SX0FUVFJfSU4oMyksCisJU0VOU09SX0FUVFJfSU4oNCksCisJU0VOU09SX0FUVFJfSU4oNSksCisJU0VOU09SX0FUVFJfSU4oNiksCisJU0VOU09SX0FUVFJfSU4oNyksCisJU0VOU09SX0FUVFJfSU4oOCksCisJU0VOU09SX0FUVFJfSU4oOSksCisJU0VOU09SX0FUVFJfVEVNUCgxKSwKKwlTRU5TT1JfQVRUUl9URU1QKDIpLAorCVNFTlNPUl9BVFRSX1RFTVAoMyksCisJU0VOU09SX0FUVFJfVEVNUCg0KSwKKwlTRU5TT1JfQVRUUl9URU1QKDUpLAorCVNFTlNPUl9BVFRSX1RFTVAoNiksCisJU0VOU09SX0FUVFJfRkFOKDEpLAorCVNFTlNPUl9BVFRSX0ZBTigyKSwKKwlTRU5TT1JfQVRUUl9GQU4oMyksCisJU0VOU09SX0FUVFJfRkFOKDQpLAorCVNFTlNPUl9BVFRSX0ZBTig1KSwKKwlTRU5TT1JfQVRUUl9QV00oMSksCisJU0VOU09SX0FUVFJfUFdNKDIpLAorCVNFTlNPUl9BVFRSX1BXTSgzKSwKK307CisKKy8qIEZhbjYtRmFuMTIgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiB3ODM3OTNfbGVmdF9mYW5bXSA9IHsKKwlTRU5TT1JfQVRUUl9GQU4oNiksCisJU0VOU09SX0FUVFJfRkFOKDcpLAorCVNFTlNPUl9BVFRSX0ZBTig4KSwKKwlTRU5TT1JfQVRUUl9GQU4oOSksCisJU0VOU09SX0FUVFJfRkFOKDEwKSwKKwlTRU5TT1JfQVRUUl9GQU4oMTEpLAorCVNFTlNPUl9BVFRSX0ZBTigxMiksCit9OworCisvKiBQd200LVB3bTggKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiB3ODM3OTNfbGVmdF9wd21bXSA9IHsKKwlTRU5TT1JfQVRUUl9QV00oNCksCisJU0VOU09SX0FUVFJfUFdNKDUpLAorCVNFTlNPUl9BVFRSX1BXTSg2KSwKKwlTRU5TT1JfQVRUUl9QV00oNyksCisJU0VOU09SX0FUVFJfUFdNKDgpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIHNkYV9zaW5nbGVfZmlsZXNbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGNwdTBfdmlkLCBTX0lSVUdPLCBzaG93X3ZpZCwgTlVMTCwgTk9UX1VTRUQsIDApLAorCVNFTlNPUl9BVFRSXzIoY3B1MV92aWQsIFNfSVJVR08sIHNob3dfdmlkLCBOVUxMLCBOT1RfVVNFRCwgMSksCisJU0VOU09SX0FUVFJfMih2cm0sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3ZybSwgc3RvcmVfdnJtLAorCQkgICAgICBOT1RfVVNFRCwgTk9UX1VTRUQpLAorCVNFTlNPUl9BVFRSXzIoY2hhc3NpcywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfYWxhcm1fYmVlcCwKKwkJICAgICAgc3RvcmVfY2hhc3Npc19jbGVhciwgQUxBUk1fU1RBVFVTLCAzMCksCisJU0VOU09SX0FUVFJfMihiZWVwX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfYmVlcF9lbmFibGUsCisJCSAgICAgIHN0b3JlX2JlZXBfZW5hYmxlLCBOT1RfVVNFRCwgTk9UX1VTRUQpLAorCVNFTlNPUl9BVFRSXzIocHdtX2RlZmF1bHQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3NmX3NldHVwLAorCQkgICAgICBzdG9yZV9zZl9zZXR1cCwgU0VUVVBfUFdNX0RFRkFVTFQsIE5PVF9VU0VEKSwKKwlTRU5TT1JfQVRUUl8yKHB3bV91cHRpbWUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3NmX3NldHVwLAorCQkgICAgICBzdG9yZV9zZl9zZXR1cCwgU0VUVVBfUFdNX1VQVElNRSwgTk9UX1VTRUQpLAorCVNFTlNPUl9BVFRSXzIocHdtX2Rvd250aW1lLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19zZl9zZXR1cCwKKwkJICAgICAgc3RvcmVfc2Zfc2V0dXAsIFNFVFVQX1BXTV9ET1dOVElNRSwgTk9UX1VTRUQpLAorCVNFTlNPUl9BVFRSXzIodGVtcF9jcml0aWNhbCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfc2Zfc2V0dXAsCisJCSAgICAgIHN0b3JlX3NmX3NldHVwLCBTRVRVUF9URU1QX0NSSVRJQ0FMLCBOT1RfVVNFRCksCit9OworCitzdGF0aWMgdm9pZCB3ODM3OTNfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpZiAocmVzZXQpIHsKKwkJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19DT05GSUcsIDB4ODApOworCX0KKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwl3ODM3OTNfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX0NPTkZJRywKKwkJCSAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19DT05GSUcpIHwgMHgwMSk7CisKK30KKworc3RhdGljIGludCB3ODM3OTNfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCB3ODM3OTNfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCB3ODM3OTNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwlpbnQgZXJyLCBpOworCisJLyogbWFpbiBjbGllbnQgKi8KKwlpZiAoZGF0YSkgeworCQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHc4Mzc5M19zZW5zb3JfYXR0cl8yKTsgaSsrKQorCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwKKwkJCQkJICAgJnc4Mzc5M19zZW5zb3JfYXR0cl8yW2ldLmRldl9hdHRyKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZGFfc2luZ2xlX2ZpbGVzKTsgaSsrKQorCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNkYV9zaW5nbGVfZmlsZXNbaV0uZGV2X2F0dHIpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHc4Mzc5M19sZWZ0X2Zhbik7IGkrKykKKwkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZ3ODM3OTNfbGVmdF9mYW5baV0uZGV2X2F0dHIpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHc4Mzc5M19sZWZ0X3B3bSk7IGkrKykKKwkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZ3ODM3OTNfbGVmdF9wd21baV0uZGV2X2F0dHIpOworCX0KKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisKKwkvKiBtYWluIGNsaWVudCAqLworCWlmIChkYXRhKQorCQlrZnJlZShkYXRhKTsKKwkvKiBzdWJjbGllbnQgKi8KKwllbHNlCisJCWtmcmVlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordzgzNzkzX2NyZWF0ZV9zdWJjbGllbnQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGFkZHIsCisJCQlzdHJ1Y3QgaTJjX2NsaWVudCAqKnN1Yl9jbGkpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGkyY19jbGllbnQgKnN1Yl9jbGllbnQ7CisKKwkoKnN1Yl9jbGkpID0gc3ViX2NsaWVudCA9CisJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEoc3ViX2NsaWVudCkpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXN1Yl9jbGllbnQtPmFkZHIgPSAweDQ4ICsgYWRkcjsKKwlpMmNfc2V0X2NsaWVudGRhdGEoc3ViX2NsaWVudCwgTlVMTCk7CisJc3ViX2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJc3ViX2NsaWVudC0+ZHJpdmVyID0gJnc4Mzc5M19kcml2ZXI7CisJc3RybGNweShzdWJfY2xpZW50LT5uYW1lLCAidzgzNzkzIHN1YmNsaWVudCIsIEkyQ19OQU1FX1NJWkUpOworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoc3ViX2NsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAic3ViY2xpZW50IHJlZ2lzdHJhdGlvbiAiCisJCQkiYXQgYWRkcmVzcyAweCV4IGZhaWxlZFxuIiwgc3ViX2NsaWVudC0+YWRkcik7CisJCWtmcmVlKHN1Yl9jbGllbnQpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit3ODM3OTNfZGV0ZWN0X3N1YmNsaWVudHMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJCSBpbnQga2luZCwgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgaSwgaWQsIGVycjsKKwl1OCB0bXA7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZCA9IGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpOworCWlmIChmb3JjZV9zdWJjbGllbnRzWzBdID09IGlkICYmIGZvcmNlX3N1YmNsaWVudHNbMV0gPT0gYWRkcmVzcykgeworCQlmb3IgKGkgPSAyOyBpIDw9IDM7IGkrKykgeworCQkJaWYgKGZvcmNlX3N1YmNsaWVudHNbaV0gPCAweDQ4CisJCQkgICAgfHwgZm9yY2Vfc3ViY2xpZW50c1tpXSA+IDB4NGYpIHsKKwkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkJImludmFsaWQgc3ViY2xpZW50ICIKKwkJCQkJImFkZHJlc3MgJWQ7IG11c3QgYmUgMHg0OC0weDRmXG4iLAorCQkJCQlmb3JjZV9zdWJjbGllbnRzW2ldKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gRVJST1JfU0NfMDsKKwkJCX0KKwkJfQorCQl3ODM3OTNfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX0kyQ19TVUJBRERSLAorCQkJCSAgIChmb3JjZV9zdWJjbGllbnRzWzJdICYgMHgwNykgfAorCQkJCSAgICgoZm9yY2Vfc3ViY2xpZW50c1szXSAmIDB4MDcpIDw8IDQpKTsKKwl9CisKKwl0bXAgPSB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfSTJDX1NVQkFERFIpOworCWlmICghKHRtcCAmIDB4MDgpKSB7CisJCWVyciA9CisJCSAgICB3ODM3OTNfY3JlYXRlX3N1YmNsaWVudChhZGFwdGVyLCBjbGllbnQsIHRtcCAmIDB4NywKKwkJCQkJICAgICZkYXRhLT5sbTc1WzBdKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIEVSUk9SX1NDXzA7CisJfQorCWlmICghKHRtcCAmIDB4ODApKSB7CisJCWlmICgoZGF0YS0+bG03NVswXSAhPSBOVUxMKQorCQkgICAgJiYgKCh0bXAgJiAweDcpID09ICgodG1wID4+IDQpICYgMHg3KSkpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJkdXBsaWNhdGUgYWRkcmVzc2VzIDB4JXgsICIKKwkJCQkidXNlIGZvcmNlX3N1YmNsaWVudHNcbiIsIGRhdGEtPmxtNzVbMF0tPmFkZHIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gRVJST1JfU0NfMTsKKwkJfQorCQllcnIgPSB3ODM3OTNfY3JlYXRlX3N1YmNsaWVudChhZGFwdGVyLCBjbGllbnQsCisJCQkJCSAgICAgICh0bXAgPj4gNCkgJiAweDcsICZkYXRhLT5sbTc1WzFdKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIEVSUk9SX1NDXzE7CisJfQorCisJcmV0dXJuIDA7CisKKwkvKiBVbmRvIGluaXRzIGluIGNhc2Ugb2YgZXJyb3JzICovCisKK0VSUk9SX1NDXzE6CisJaWYgKGRhdGEtPmxtNzVbMF0gIT0gTlVMTCkgeworCQlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzBdKTsKKwkJa2ZyZWUoZGF0YS0+bG03NVswXSk7CisJfQorRVJST1JfU0NfMDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHc4Mzc5M19kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJaW50IGk7CisJdTggdG1wLCB2YWw7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhOworCWludCBmaWxlc19mYW4gPSBBUlJBWV9TSVpFKHc4Mzc5M19sZWZ0X2ZhbikgLyA3OworCWludCBmaWxlc19wd20gPSBBUlJBWV9TSVpFKHc4Mzc5M19sZWZ0X3B3bSkgLyA1OworCWludCBlcnIgPSAwOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQorCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgorCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIHc4Mzc5M197cmVhZCx3cml0ZX1fdmFsdWUuICovCisKKwlpZiAoIShkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHc4Mzc5M19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwljbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWRldiA9ICZjbGllbnQtPmRldjsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKwljbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJY2xpZW50LT5kcml2ZXIgPSAmdzgzNzkzX2RyaXZlcjsKKworCWRhdGEtPmJhbmsgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3OTNfUkVHX0JBTktTRUwpOworCisJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJdG1wID0gZGF0YS0+YmFuayAmIDB4ODAgPyAweDVjIDogMHhhMzsKKwkJLyogQ2hlY2sgV2luYm9uZCB2ZW5kb3IgSUQgKi8KKwkJaWYgKHRtcCAhPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJCVc4Mzc5M19SRUdfVkVORE9SSUQpKSB7CisJCQlwcl9kZWJ1ZygidzgzNzkzOiBEZXRlY3Rpb24gZmFpbGVkIGF0IGNoZWNrICIKKwkJCQkgInZlbmRvciBpZFxuIik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBmcmVlX21lbTsKKwkJfQorCisJCS8qIElmIFdpbmJvbmQgY2hpcCwgYWRkcmVzcyBvZiBjaGlwIGFuZCBXODM3OTNfUkVHX0kyQ19BRERSCisJCSAgIHNob3VsZCBtYXRjaCAqLworCQlpZiAoKGRhdGEtPmJhbmsgJiAweDA3KSA9PSAwCisJCSAmJiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBXODM3OTNfUkVHX0kyQ19BRERSKSAhPQorCQkgICAgKGFkZHJlc3MgPDwgMSkpIHsKKwkJCXByX2RlYnVnKCJ3ODM3OTM6IERldGVjdGlvbiBmYWlsZWQgYXQgY2hlY2sgIgorCQkJCSAiaTJjIGFkZHJcbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZnJlZV9tZW07CisJCX0KKworCX0KKworCS8qIFdlIGhhdmUgZWl0aGVyIGhhZCBhIGZvcmNlIHBhcmFtZXRlciwgb3Igd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIHRoZQorCSAgIFdpbmJvbmQuIERldGVybWluZSB0aGUgY2hpcCB0eXBlIG5vdyAqLworCisJaWYgKGtpbmQgPD0gMCkgeworCQlpZiAoMHg3YiA9PSB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfQ0hJUElEKSkgeworCQkJa2luZCA9IHc4Mzc5MzsKKwkJfSBlbHNlIHsKKwkJCWlmIChraW5kID09IDApCisJCQkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgInc4Mzc5MzogSWdub3JpbmcgIgorCQkJCQkgIidmb3JjZScgcGFyYW1ldGVyIGZvciB1bmtub3duIGNoaXAgIgorCQkJCQkgImF0IGFkZHJlc3MgMHglMDJ4XG4iLCBhZGRyZXNzKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIGZyZWVfbWVtOworCQl9CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAidzgzNzkzIiwgSTJDX05BTUVfU0laRSk7CisKKwltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJZ290byBmcmVlX21lbTsKKworCWlmICgoZXJyID0gdzgzNzkzX2RldGVjdF9zdWJjbGllbnRzKGFkYXB0ZXIsIGFkZHJlc3MsIGtpbmQsIGNsaWVudCkpKQorCQlnb3RvIGRldGFjaF9jbGllbnQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCisJdzgzNzkzX2luaXRfY2xpZW50KGNsaWVudCk7CisKKwlkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CisJLyoKKwkgICBPbmx5IGZhbiAxLTUgaGFzIHRoZWlyIG93biBpbnB1dCBwaW5zLAorCSAgIFB3bSAxLTMgaGFzIHRoZWlyIG93biBwaW5zCisJICovCisJZGF0YS0+aGFzX2ZhbiA9IDB4MWY7CisJZGF0YS0+aGFzX3B3bSA9IDB4MDc7CisJdG1wID0gdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX01GQyk7CisJdmFsID0gdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX0ZBTklOX0NUUkwpOworCisJLyogY2hlY2sgdGhlIGZ1bmN0aW9uIG9mIHBpbnMgNDktNTYgKi8KKwlpZiAoISh0bXAgJiAweDgwKSkgeworCQlkYXRhLT5oYXNfcHdtIHw9IDB4MTg7CS8qIHB3bSA0LDUgKi8KKwkJaWYgKHZhbCAmIDB4MDEpIHsJLyogZmFuIDYgKi8KKwkJCWRhdGEtPmhhc19mYW4gfD0gMHgyMDsKKwkJCWRhdGEtPmhhc19wd20gfD0gMHgyMDsKKwkJfQorCQlpZiAodmFsICYgMHgwMikgewkvKiBmYW4gNyAqLworCQkJZGF0YS0+aGFzX2ZhbiB8PSAweDQwOworCQkJZGF0YS0+aGFzX3B3bSB8PSAweDQwOworCQl9CisJCWlmICghKHRtcCAmIDB4NDApICYmICh2YWwgJiAweDA0KSkgewkvKiBmYW4gOCAqLworCQkJZGF0YS0+aGFzX2ZhbiB8PSAweDgwOworCQkJZGF0YS0+aGFzX3B3bSB8PSAweDgwOworCQl9CisJfQorCisJaWYgKDB4MDggPT0gKHRtcCAmIDB4MGMpKSB7CisJCWlmICh2YWwgJiAweDA4KQkvKiBmYW4gOSAqLworCQkJZGF0YS0+aGFzX2ZhbiB8PSAweDEwMDsKKwkJaWYgKHZhbCAmIDB4MTApCS8qIGZhbiAxMCAqLworCQkJZGF0YS0+aGFzX2ZhbiB8PSAweDIwMDsKKwl9CisKKwlpZiAoMHgyMCA9PSAodG1wICYgMHgzMCkpIHsKKwkJaWYgKHZhbCAmIDB4MjApCS8qIGZhbiAxMSAqLworCQkJZGF0YS0+aGFzX2ZhbiB8PSAweDQwMDsKKwkJaWYgKHZhbCAmIDB4NDApCS8qIGZhbiAxMiAqLworCQkJZGF0YS0+aGFzX2ZhbiB8PSAweDgwMDsKKwl9CisKKwlpZiAoKHRtcCAmIDB4MDEpICYmICh2YWwgJiAweDA0KSkgewkvKiBmYW4gOCwgc2Vjb25kIGxvY2F0aW9uICovCisJCWRhdGEtPmhhc19mYW4gfD0gMHg4MDsKKwkJZGF0YS0+aGFzX3B3bSB8PSAweDgwOworCX0KKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodzgzNzkzX3NlbnNvcl9hdHRyXzIpOyBpKyspIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkJICZ3ODM3OTNfc2Vuc29yX2F0dHJfMltpXS5kZXZfYXR0cik7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfcmVtb3ZlOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNkYV9zaW5nbGVfZmlsZXMpOyBpKyspIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9zaW5nbGVfZmlsZXNbaV0uZGV2X2F0dHIpOworCQlpZiAoZXJyKQorCQkJZ290byBleGl0X3JlbW92ZTsKKworCX0KKworCWZvciAoaSA9IDU7IGkgPCAxMjsgaSsrKSB7CisJCWludCBqOworCQlpZiAoIShkYXRhLT5oYXNfZmFuICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IGogPCBmaWxlc19mYW47IGorKykgeworCQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkJICAgJnc4Mzc5M19sZWZ0X2ZhblsoaSAtIDUpICogZmlsZXNfZmFuCisJCQkJCQkJCSsgal0uZGV2X2F0dHIpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGV4aXRfcmVtb3ZlOworCQl9CisJfQorCisJZm9yIChpID0gMzsgaSA8IDg7IGkrKykgeworCQlpbnQgajsKKwkJaWYgKCEoZGF0YS0+aGFzX3B3bSAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgZmlsZXNfcHdtOyBqKyspIHsKKwkJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJCSAgICZ3ODM3OTNfbGVmdF9wd21bKGkgLSAzKSAqIGZpbGVzX3B3bQorCQkJCQkJCQkrIGpdLmRldl9hdHRyKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBleGl0X3JlbW92ZTsKKwkJfQorCX0KKworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcihkZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9yZW1vdmU7CisJfQorCisJcmV0dXJuIDA7CisKKwkvKiBVbnJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisKK2V4aXRfcmVtb3ZlOgorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHc4Mzc5M19zZW5zb3JfYXR0cl8yKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmdzgzNzkzX3NlbnNvcl9hdHRyXzJbaV0uZGV2X2F0dHIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2RhX3NpbmdsZV9maWxlcyk7IGkrKykKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnNkYV9zaW5nbGVfZmlsZXNbaV0uZGV2X2F0dHIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodzgzNzkzX2xlZnRfZmFuKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmdzgzNzkzX2xlZnRfZmFuW2ldLmRldl9hdHRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHc4Mzc5M19sZWZ0X3B3bSk7IGkrKykKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnc4Mzc5M19sZWZ0X3B3bVtpXS5kZXZfYXR0cik7CisKKwlpZiAoZGF0YS0+bG03NVswXSAhPSBOVUxMKSB7CisJCWkyY19kZXRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMF0pOworCQlrZnJlZShkYXRhLT5sbTc1WzBdKTsKKwl9CisJaWYgKGRhdGEtPmxtNzVbMV0gIT0gTlVMTCkgeworCQlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzFdKTsKKwkJa2ZyZWUoZGF0YS0+bG03NVsxXSk7CisJfQorZGV0YWNoX2NsaWVudDoKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworZnJlZV9tZW06CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHc4Mzc5M191cGRhdGVfbm9udm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGksIGo7CisJLyoKKwkgICBUaGV5IGFyZSBzb21ld2hhdCAic3RhYmxlIiByZWdpc3RlcnMsIGFuZCB0byB1cGRhdGUgdGhlbSBldmVyeXRpbWUKKwkgICB0YWtlcyBzbyBtdWNoIHRpbWUsIGl0J3MganVzdCBub3Qgd29ydGh5LiBVcGRhdGUgdGhlbSBpbiBhIGxvbmcKKwkgICBpbnRlcnZhbCB0byBhdm9pZCBleGNlcHRpb24uCisJICovCisJaWYgKCEodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X25vbnZvbGF0aWxlICsgSFogKiAzMDApCisJICAgICAgfHwgIWRhdGEtPnZhbGlkKSkKKwkJcmV0dXJuOworCS8qIHVwZGF0ZSB2b2x0YWdlIGxpbWl0cyAqLworCWZvciAoaSA9IDE7IGkgPCAzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoZGF0YS0+aW4pOyBqKyspIHsKKwkJCWRhdGEtPmluW2pdW2ldID0KKwkJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfSU5bal1baV0pOworCQl9CisJCWRhdGEtPmluX2xvd19iaXRzW2ldID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19JTl9MT1dfQklUU1tpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+ZmFuX21pbik7IGkrKykgeworCQkvKiBVcGRhdGUgdGhlIEZhbiBtZWFzdXJlZCB2YWx1ZSBhbmQgbGltaXRzICovCisJCWlmICghKGRhdGEtPmhhc19mYW4gJiAoMSA8PCBpKSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRhdGEtPmZhbl9taW5baV0gPQorCQkgICAgdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX0ZBTl9NSU4oaSkpIDw8IDg7CisJCWRhdGEtPmZhbl9taW5baV0gfD0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19GQU5fTUlOKGkpICsgMSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+dGVtcF9mYW5fbWFwKTsgaSsrKSB7CisJCWRhdGEtPnRlbXBfZmFuX21hcFtpXSA9CisJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfVEVNUF9GQU5fTUFQKGkpKTsKKwkJZm9yIChqID0gMTsgaiA8IDU7IGorKykgeworCQkJZGF0YS0+dGVtcFtpXVtqXSA9CisJCQkgICAgdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1RFTVBbaV1bal0pOworCQl9CisJCWRhdGEtPnRlbXBfY3J1aXNlW2ldID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19URU1QX0NSVUlTRShpKSk7CisJCWZvciAoaiA9IDA7IGogPCA3OyBqKyspIHsKKwkJCWRhdGEtPnNmMl9wd21baV1bal0gPQorCQkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19TRjJfUFdNKGksIGopKTsKKwkJCWRhdGEtPnNmMl90ZW1wW2ldW2pdID0KKwkJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgIFc4Mzc5M19SRUdfU0YyX1RFTVAoaSwgaikpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+dGVtcF9tb2RlKTsgaSsrKQorCQlkYXRhLT50ZW1wX21vZGVbaV0gPQorCQkgICAgdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1RFTVBfTU9ERVtpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT50b2xlcmFuY2UpOyBpKyspIHsKKwkJZGF0YS0+dG9sZXJhbmNlW2ldID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19URU1QX1RPTChpKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+cHdtKTsgaSsrKSB7CisJCWlmICghKGRhdGEtPmhhc19wd20gJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJZGF0YS0+cHdtW2ldW1BXTV9OT05TVE9QXSA9CisJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfUFdNKGksIFBXTV9OT05TVE9QKSk7CisJCWRhdGEtPnB3bVtpXVtQV01fU1RBUlRdID0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19QV00oaSwgUFdNX1NUQVJUKSk7CisJCWRhdGEtPnB3bV9zdG9wX3RpbWVbaV0gPQorCQkgICAgdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1BXTV9TVE9QX1RJTUUoaSkpOworCX0KKworCWRhdGEtPnB3bV9kZWZhdWx0ID0gdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1BXTV9ERUZBVUxUKTsKKwlkYXRhLT5wd21fZW5hYmxlID0gdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1BXTV9FTkFCTEUpOworCWRhdGEtPnB3bV91cHRpbWUgPSB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfUFdNX1VQVElNRSk7CisJZGF0YS0+cHdtX2Rvd250aW1lID0gdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1BXTV9ET1dOVElNRSk7CisJZGF0YS0+dGVtcF9jcml0aWNhbCA9CisJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19URU1QX0NSSVRJQ0FMKTsKKwlkYXRhLT5iZWVwX2VuYWJsZSA9IHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19PVlRfQkVFUCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT5iZWVwcyk7IGkrKykgeworCQlkYXRhLT5iZWVwc1tpXSA9IHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19CRUVQKGkpKTsKKwl9CisKKwlkYXRhLT5sYXN0X25vbnZvbGF0aWxlID0gamlmZmllczsKK30KKworc3RhdGljIHN0cnVjdCB3ODM3OTNfZGF0YSAqdzgzNzkzX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoISh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICogMikKKwkgICAgICB8fCAhZGF0YS0+dmFsaWQpKQorCQlnb3RvIEVORDsKKworCS8qIFVwZGF0ZSB0aGUgdm9sdGFnZXMgbWVhc3VyZWQgdmFsdWUgYW5kIGxpbWl0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPmluKTsgaSsrKQorCQlkYXRhLT5pbltpXVtJTl9SRUFEXSA9CisJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfSU5baV1bSU5fUkVBRF0pOworCisJZGF0YS0+aW5fbG93X2JpdHNbSU5fUkVBRF0gPQorCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfSU5fTE9XX0JJVFNbSU5fUkVBRF0pOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+ZmFuKTsgaSsrKSB7CisJCWlmICghKGRhdGEtPmhhc19mYW4gJiAoMSA8PCBpKSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRhdGEtPmZhbltpXSA9CisJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfRkFOKGkpKSA8PCA4OworCQlkYXRhLT5mYW5baV0gfD0KKwkJICAgIHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19GQU4oaSkgKyAxKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT50ZW1wKTsgaSsrKQorCQlkYXRhLT50ZW1wW2ldW1RFTVBfUkVBRF0gPQorCQkgICAgdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1RFTVBbaV1bVEVNUF9SRUFEXSk7CisKKwlkYXRhLT50ZW1wX2xvd19iaXRzID0KKwkgICAgdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1RFTVBfTE9XX0JJVFMpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+cHdtKTsgaSsrKSB7CisJCWlmIChkYXRhLT5oYXNfcHdtICYgKDEgPDwgaSkpCisJCQlkYXRhLT5wd21baV1bUFdNX0RVVFldID0KKwkJCSAgICB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgIFc4Mzc5M19SRUdfUFdNKGksIFBXTV9EVVRZKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+YWxhcm1zKTsgaSsrKQorCQlkYXRhLT5hbGFybXNbaV0gPQorCQkgICAgdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX0FMQVJNKGkpKTsKKwlkYXRhLT52aWRbMF0gPSB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfVklEX0lOQSk7CisJZGF0YS0+dmlkWzFdID0gdzgzNzkzX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTNfUkVHX1ZJRF9JTkIpOworCXc4Mzc5M191cGRhdGVfbm9udm9sYXRpbGUoZGV2KTsKKwlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCWRhdGEtPnZhbGlkID0gMTsKKworRU5EOgorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBkYXRhOworfQorCisvKiBJZ25vcmUgdGhlIHBvc3NpYmlsaXR5IHRoYXQgc29tZWJvZHkgY2hhbmdlIGJhbmsgb3V0c2lkZSB0aGUgZHJpdmVyCisgICBNdXN0IGJlIGNhbGxlZCB3aXRoIGRhdGEtPnVwZGF0ZV9sb2NrIGhlbGQsIGV4Y2VwdCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyB1OCB3ODM3OTNfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnKQoreworCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXU4IHJlcyA9IDB4ZmY7CisJdTggbmV3X2JhbmsgPSByZWcgPj4gODsKKworCW5ld19iYW5rIHw9IGRhdGEtPmJhbmsgJiAweGZjOworCWlmIChkYXRhLT5iYW5rICE9IG5ld19iYW5rKSB7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhCisJCSAgICAoY2xpZW50LCBXODM3OTNfUkVHX0JBTktTRUwsIG5ld19iYW5rKSA+PSAwKQorCQkJZGF0YS0+YmFuayA9IG5ld19iYW5rOworCQllbHNlIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJzZXQgYmFuayB0byAlZCBmYWlsZWQsIGZhbGwgYmFjayAiCisJCQkJInRvIGJhbmsgJWQsIHJlYWQgcmVnIDB4JXggZXJyb3JcbiIsCisJCQkJbmV3X2JhbmssIGRhdGEtPmJhbmssIHJlZyk7CisJCQlyZXMgPSAweDA7CS8qIHJlYWQgMHgwIGZyb20gdGhlIGNoaXAgKi8KKwkJCWdvdG8gRU5EOworCQl9CisJfQorCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyAmIDB4ZmYpOworRU5EOgorCXJldHVybiByZXM7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggZGF0YS0+dXBkYXRlX2xvY2sgaGVsZCwgZXhjZXB0IGR1cmluZyBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIGludCB3ODM3OTNfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZywgdTggdmFsdWUpCit7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJlczsKKwl1OCBuZXdfYmFuayA9IHJlZyA+PiA4OworCisJbmV3X2JhbmsgfD0gZGF0YS0+YmFuayAmIDB4ZmM7CisJaWYgKGRhdGEtPmJhbmsgIT0gbmV3X2JhbmspIHsKKwkJaWYgKChyZXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhCisJCSAgICAoY2xpZW50LCBXODM3OTNfUkVHX0JBTktTRUwsIG5ld19iYW5rKSkgPj0gMCkKKwkJCWRhdGEtPmJhbmsgPSBuZXdfYmFuazsKKwkJZWxzZSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkic2V0IGJhbmsgdG8gJWQgZmFpbGVkLCBmYWxsIGJhY2sgIgorCQkJCSJ0byBiYW5rICVkLCB3cml0ZSByZWcgMHgleCBlcnJvclxuIiwKKwkJCQluZXdfYmFuaywgZGF0YS0+YmFuaywgcmVnKTsKKwkJCWdvdG8gRU5EOworCQl9CisJfQorCisJcmVzID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZyAmIDB4ZmYsIHZhbHVlKTsKK0VORDoKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX3c4Mzc5M19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ3ODM3OTNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfdzgzNzkzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdzgzNzkzX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIll1YW4gTXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigidzgzNzkzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX3c4Mzc5M19pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfdzgzNzkzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2FsZ29zL0tjb25maWcKaW5kZXggYzAzNDgyMC4uYWYwMjAzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvS2NvbmZpZworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9LY29uZmlnCkBAIC0zOCwxNyArMzgsNiBAQAogCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtYWxnby1wY2EuCiAKLWNvbmZpZyBJMkNfQUxHT0lURQotCXRyaXN0YXRlICJJVEUgSTJDIEFsZ29yaXRobSIKLQlkZXBlbmRzIG9uIE1JUFNfSVRFODE3MiAmJiBJMkMKLQloZWxwCi0JICBUaGlzIHN1cHBvcnRzIHRoZSB1c2Ugb2YgdGhlIElURTgxNzIgSTJDIGludGVyZmFjZSBmb3VuZCBvbiBzb21lIE1JUFMKLQkgIHN5c3RlbXMuIFNheSBZIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZS4gWW91IHNob3VsZCBhbHNvIHNheSBZIGZvcgotCSAgdGhlIElURSBJMkMgcGVyaXBoZXJhbCBkcml2ZXIgc3VwcG9ydCBiZWxvdy4KLQotCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCi0JICB3aWxsIGJlIGNhbGxlZCBpMmMtYWxnby1pdGUuCi0KIGNvbmZpZyBJMkNfQUxHTzhYWAogCXRyaXN0YXRlICJNUEM4eHggQ1BNIEkyQyBpbnRlcmZhY2UiCiAJZGVwZW5kcyBvbiA4eHggJiYgSTJDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2FsZ29zL01ha2VmaWxlCmluZGV4IDIwOGJlMDQuLmNhYzEwNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL01ha2VmaWxlCkBAIC01LDcgKzUsNiBAQAogb2JqLSQoQ09ORklHX0kyQ19BTEdPQklUKQkrPSBpMmMtYWxnby1iaXQubwogb2JqLSQoQ09ORklHX0kyQ19BTEdPUENGKQkrPSBpMmMtYWxnby1wY2Yubwogb2JqLSQoQ09ORklHX0kyQ19BTEdPUENBKQkrPSBpMmMtYWxnby1wY2Eubwotb2JqLSQoQ09ORklHX0kyQ19BTEdPSVRFKQkrPSBpMmMtYWxnby1pdGUubwogb2JqLSQoQ09ORklHX0kyQ19BTEdPX1NHSSkJKz0gaTJjLWFsZ28tc2dpLm8KIAogaWZlcSAoJChDT05GSUdfSTJDX0RFQlVHX0FMR08pLHkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCmluZGV4IDIxYzM2YmYuLjk1YWE1MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCkBAIC01NDAsMTUgKzU0MCw3IEBACiAKIAlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKGFkYXApOwogfQotCi0KLWludCBpMmNfYml0X2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXJldHVybiBpMmNfZGVsX2FkYXB0ZXIoYWRhcCk7Ci19Ci0KIEVYUE9SVF9TWU1CT0woaTJjX2JpdF9hZGRfYnVzKTsKLUVYUE9SVF9TWU1CT0woaTJjX2JpdF9kZWxfYnVzKTsKIAogTU9EVUxFX0FVVEhPUigiU2ltb24gRy4gVm9nbCA8c2ltb25AdGsudW5pLWxpbnouYWMuYXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkkyQy1CdXMgYml0LWJhbmdpbmcgYWxnb3JpdGhtIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1pdGUuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQ4ZWVmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODA2ICswLDAgQEAKLS8qCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBpMmMtYWxnby1pdGUuYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIElURSBhZGFwdGVycwkgICAgCi0gICAKLSAgIEhhaS1QYW8gRmFuLCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gICBocGZhbkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCi0KLSAgIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIFRoaXMgZmlsZSB3YXMgaGlnaGx5IGxldmVyYWdlZCBmcm9tIGkyYy1hbGdvLXBjZi5jLCB3aGljaCB3YXMgY3JlYXRlZAotICAgYnkgU2ltb24gRy4gVm9nbCBhbmQgSGFucyBCZXJnbHVuZDoKLQotCi0gICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IFNpbW9uIEcuIFZvZ2wKLSAgICAgICAgICAgICAgICAgICAxOTk4LTIwMDAgSGFucyBCZXJnbHVuZAotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCAKLSAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gLGFuZCBhbHNvIGZyb20gTWFydGluIEJhaWxleQotICAgPG1iYWlsZXlAbGl0dGxlZmVldC1pbmMuY29tPiAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLWFsZ28taXRlLmg+Ci0jaW5jbHVkZSAiaTJjLWFsZ28taXRlLmgiCi0KLSNkZWZpbmUJUE1fRFNSCQlJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9QTV9EU1IKLSNkZWZpbmUJUE1fSUJTUgkJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfUE1fRFNSICsgMHgwNCAKLSNkZWZpbmUgR1BJT19DQ1IJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfR1BDQ1IKLQotI2RlZmluZSBERUIyKHgpIGlmIChpMmNfZGVidWc+PTIpIHgKLSNkZWZpbmUgREVCMyh4KSBpZiAoaTJjX2RlYnVnPj0zKSB4IC8qIHByaW50IHNldmVyYWwgc3RhdGlzdGljYWwgdmFsdWVzKi8KLSNkZWZpbmUgREVGX1RJTUVPVVQgMTYKLQotCi0vKiBtb2R1bGUgcGFyYW1ldGVyczoKLSAqLwotc3RhdGljIGludCBpMmNfZGVidWc7Ci1zdGF0aWMgaW50IGlpY190ZXN0OwkvKiBzZWUgaWYgdGhlIGxpbmUtc2V0dGluZyBmdW5jdGlvbnMgd29yawkqLwotCi0vKiAtLS0gc2V0dGluZyBzdGF0ZXMgb24gdGhlIGJ1cyB3aXRoIHRoZSByaWdodCB0aW1pbmc6IC0tLS0tLS0tLS0tLS0tLQkqLwotCi0jZGVmaW5lIGdldF9jbG9jayhhZGFwKSBhZGFwLT5nZXRjbG9jayhhZGFwLT5kYXRhKQotI2RlZmluZSBpaWNfb3V0dyhhZGFwLCByZWcsIHZhbCkgYWRhcC0+c2V0aWljKGFkYXAtPmRhdGEsIHJlZywgdmFsKQotI2RlZmluZSBpaWNfaW53KGFkYXAsIHJlZykgYWRhcC0+Z2V0aWljKGFkYXAtPmRhdGEsIHJlZykKLQotCi0vKiAtLS0gb3RoZXIgYXV4aWxpYXJ5IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwotCi1zdGF0aWMgdm9pZCBpaWNfc3RhcnQoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwKQotewotCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0hDUixJVEVfQ01EKTsKLX0KLQotc3RhdGljIHZvaWQgaWljX3N0b3Aoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwKQotewotCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0hDUiwwKTsKLQlpaWNfb3V0dyhhZGFwLElURV9JMkNIU1IsSVRFX0kyQ0hTUl9UREkpOwotfQotCi1zdGF0aWMgdm9pZCBpaWNfcmVzZXQoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwKQotewotCWlpY19vdXR3KGFkYXAsIFBNX0lCU1IsIGlpY19pbncoYWRhcCwgUE1fSUJTUikgfCAweDgwKTsKLX0KLQotCi1zdGF0aWMgaW50IHdhaXRfZm9yX2JiKHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCkKLXsKLQlpbnQgdGltZW91dCA9IERFRl9USU1FT1VUOwotCXNob3J0IHN0YXR1czsKLQotCXN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7Ci0jaWZuZGVmIFNUVUJfSTJDCi0Jd2hpbGUgKHRpbWVvdXQtLSAmJiAoc3RhdHVzICYgSVRFX0kyQ0hTUl9IQikpIHsKLQkJdWRlbGF5KDEwMDApOyAvKiBIb3cgbXVjaCBpcyB0aGlzPyAqLwotCQlzdGF0dXMgPSBpaWNfaW53KGFkYXAsIElURV9JMkNIU1IpOwotCX0KLSNlbmRpZgotCWlmICh0aW1lb3V0PD0wKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVGltZW91dCwgaG9zdCBpcyBidXN5XG4iKTsKLQkJaWljX3Jlc2V0KGFkYXApOwotCX0KLQlyZXR1cm4odGltZW91dDw9MCk7Ci19Ci0KLS8qIEFmdGVyIHdlIGlzc3VlIGEgdHJhbnNhY3Rpb24gb24gdGhlIElJQyBidXMsIHRoaXMgZnVuY3Rpb24KLSAqIGlzIGNhbGxlZC4gIEl0IHB1dHMgdGhpcyBwcm9jZXNzIHRvIHNsZWVwIHVudGlsIHdlIGdldCBhbiBpbnRlcnJ1cHQgZnJvbQotICogZnJvbSB0aGUgY29udHJvbGxlciB0ZWxsaW5nIHVzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdlIHJlcXVlc3RlZCBpbiBjb21wbGV0ZS4KLSAqLwotc3RhdGljIGludCB3YWl0X2Zvcl9waW4oc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLCBzaG9ydCAqc3RhdHVzKSB7Ci0KLQlpbnQgdGltZW91dCA9IERFRl9USU1FT1VUOwotCQotCXRpbWVvdXQgPSB3YWl0X2Zvcl9iYihhZGFwKTsKLQlpZiAodGltZW91dCkgewotICAJCURFQjIocHJpbnRrKCJUaW1lb3V0IHdhaXRpbmcgZm9yIGhvc3Qgbm90IGJ1c3lcbiIpOykKLSAgCQlyZXR1cm4gLUVJTzsKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JdGltZW91dCA9IERFRl9USU1FT1VUOwotCi0JKnN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7Ci0jaWZuZGVmIFNUVUJfSTJDCi0Jd2hpbGUgKHRpbWVvdXQtLSAmJiAhKCpzdGF0dXMgJiBJVEVfSTJDSFNSX1RESSkpIHsKLQkgICBhZGFwLT53YWl0Zm9ycGluKCk7Ci0JICAgKnN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7Ci0JfQotI2VuZGlmCi0JaWYgKHRpbWVvdXQgPD0gMCkKLQkJcmV0dXJuKC0xKTsKLQllbHNlCi0JCXJldHVybigwKTsKLX0KLQotc3RhdGljIGludCB3YWl0X2Zvcl9mZShzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAsIHNob3J0ICpzdGF0dXMpCi17Ci0JaW50IHRpbWVvdXQgPSBERUZfVElNRU9VVDsKLQotCSpzdGF0dXMgPSBpaWNfaW53KGFkYXAsIElURV9JMkNGU1IpOwotI2lmbmRlZiBTVFVCX0kyQyAKLQl3aGlsZSAodGltZW91dC0tICYmICgqc3RhdHVzICYgSVRFX0kyQ0ZTUl9GRSkpIHsKLQkJdWRlbGF5KDEwMDApOwotCQlpaWNfaW53KGFkYXAsIElURV9JMkNGU1IpOwotCX0KLSNlbmRpZgotCWlmICh0aW1lb3V0IDw9IDApIAotCQlyZXR1cm4oLTEpOwotCWVsc2UKLQkJcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IGlpY19pbml0IChzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXApCi17Ci0Jc2hvcnQgaTsKLQotCS8qIENsZWFyIGJpdCA3IHRvIHNldCBJMkMgdG8gbm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCi0JaT1paWNfaW53KGFkYXAsIFBNX0RTUikmIDB4ZmY3ZjsKLQlpaWNfb3V0dyhhZGFwLCBQTV9EU1IsIGkpOwotCi0JLyogc2V0IElUX0dQQ0NSIHBvcnQgQyBiaXQgMiYzIGFzIGZ1bmN0aW9uIDIgKi8KLQlpID0gaWljX2ludyhhZGFwLCBHUElPX0NDUikgJiAweGZjMGY7Ci0JaWljX291dHcoYWRhcCxHUElPX0NDUixpKTsKLQotCS8qIENsZWFyIHNsYXZlIGFkZHJlc3Mvc3ViLWFkZHJlc3MgKi8KLQlpaWNfb3V0dyhhZGFwLElURV9JMkNTQVIsIDApOwotCWlpY19vdXR3KGFkYXAsSVRFX0kyQ1NTQVIsIDApOwotCi0JLyogU2V0IGNsb2NrIGNvdW50ZXIgcmVnaXN0ZXIgKi8KLQlpaWNfb3V0dyhhZGFwLElURV9JMkNDS0NOVCwgZ2V0X2Nsb2NrKGFkYXApKTsKLQotCS8qIFNldCBTVEFSVC9yZVNUQVJUL1NUT1AgdGltZSByZWdpc3RlcnMgKi8KLQlpaWNfb3V0dyhhZGFwLElURV9JMkNTSERSLCAweDBhKTsKLQlpaWNfb3V0dyhhZGFwLElURV9JMkNSU1VSLCAweDBhKTsKLQlpaWNfb3V0dyhhZGFwLElURV9JMkNQU1VSLCAweDBhKTsKLQotCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIGNvbXBsZXRpbmcgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KLQlpaWNfb3V0dyhhZGFwLElURV9JMkNIQ1IsIElURV9JMkNIQ1JfSUUgfCBJVEVfSTJDSENSX0hDRSk7Ci0KLQkvKiBDbGVhciB0cmFuc2ZlciBjb3VudCAqLwotCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0ZCQ1IsIDB4MCk7Ci0KLQlERUIyKHByaW50aygiaWljX2luaXQ6IEluaXRpYWxpemVkIElJQyBvbiBJVEUgMHgleFxuIiwKLQkJaWljX2ludyhhZGFwLCBJVEVfSTJDSFNSKSkpOwotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBTYW5pdHkgY2hlY2sgZm9yIHRoZSBhZGFwdGVyIGhhcmR3YXJlIC0gY2hlY2sgdGhlIHJlYWN0aW9uIG9mCi0gKiB0aGUgYnVzIGxpbmVzIG9ubHkgaWYgaXQgc2VlbXMgdG8gYmUgaWRsZS4KLSAqLwotc3RhdGljIGludCB0ZXN0X2J1cyhzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAsIGNoYXIgKm5hbWUpIHsKLSNpZiAwCi0JaW50IHNjbCxzZGE7Ci0Jc2RhPWdldHNkYShhZGFwKTsKLQlpZiAoYWRhcC0+Z2V0c2NsPT1OVUxMKSB7Ci0JCXByaW50aygidGVzdF9idXM6IFdhcm5pbmc6IEFkYXB0ZXIgY2FuJ3QgcmVhZCBmcm9tIGNsb2NrIGxpbmUgLSBza2lwcGluZyB0ZXN0LlxuIik7Ci0JCXJldHVybiAwOwkJCi0JfQotCXNjbD1nZXRzY2woYWRhcCk7Ci0JcHJpbnRrKCJ0ZXN0X2J1czogQWRhcHRlcjogJXMgc2NsOiAlZCAgc2RhOiAlZCAtLSB0ZXN0aW5nLi4uXG4iLAotCW5hbWUsZ2V0c2NsKGFkYXApLGdldHNkYShhZGFwKSk7Ci0JaWYgKCFzY2wgfHwgIXNkYSApIHsKLQkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgc2VlbXMgdG8gYmUgYnVzeS5cbiIsYWRhcC0+bmFtZSk7Ci0JCWdvdG8gYmFpbG91dDsKLQl9Ci0Jc2RhbG8oYWRhcCk7Ci0JcHJpbnRrKCJ0ZXN0X2J1czoxIHNjbDogJWQgIHNkYTogJWRcbiIsIGdldHNjbChhZGFwKSwKLQkgICAgICAgZ2V0c2RhKGFkYXApKTsKLQlpZiAoIDAgIT0gZ2V0c2RhKGFkYXApICkgewotCQlwcmludGsoInRlc3RfYnVzOiAlcyBTREEgc3R1Y2sgaGlnaCFcbiIsbmFtZSk7Ci0JCXNkYWhpKGFkYXApOwotCQlnb3RvIGJhaWxvdXQ7Ci0JfQotCWlmICggMCA9PSBnZXRzY2woYWRhcCkgKSB7Ci0JCXByaW50aygidGVzdF9idXM6ICVzIFNDTCB1bmV4cGVjdGVkIGxvdyB3aGlsZSBwdWxsaW5nIFNEQSBsb3chXG4iLAotCQkJbmFtZSk7Ci0JCWdvdG8gYmFpbG91dDsKLQl9CQkKLQlzZGFoaShhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjIgc2NsOiAlZCAgc2RhOiAlZFxuIiwgZ2V0c2NsKGFkYXApLAotCSAgICAgICBnZXRzZGEoYWRhcCkpOwotCWlmICggMCA9PSBnZXRzZGEoYWRhcCkgKSB7Ci0JCXByaW50aygidGVzdF9idXM6ICVzIFNEQSBzdHVjayBsb3chXG4iLG5hbWUpOwotCQlzZGFoaShhZGFwKTsKLQkJZ290byBiYWlsb3V0OwotCX0KLQlpZiAoIDAgPT0gZ2V0c2NsKGFkYXApICkgewotCQlwcmludGsoInRlc3RfYnVzOiAlcyBTQ0wgdW5leHBlY3RlZCBsb3cgd2hpbGUgU0RBIGhpZ2ghXG4iLAotCQkgICAgICAgYWRhcC0+bmFtZSk7Ci0JZ290byBiYWlsb3V0OwotCX0KLQlzY2xsbyhhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjMgc2NsOiAlZCAgc2RhOiAlZFxuIiwgZ2V0c2NsKGFkYXApLAotCSAgICAgICBnZXRzZGEoYWRhcCkpOwotCWlmICggMCAhPSBnZXRzY2woYWRhcCkgKSB7Ci0KLQkJc2NsaGkoYWRhcCk7Ci0JCWdvdG8gYmFpbG91dDsKLQl9Ci0JaWYgKCAwID09IGdldHNkYShhZGFwKSApIHsKLQkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0RBIHVuZXhwZWN0ZWQgbG93IHdoaWxlIHB1bGxpbmcgU0NMIGxvdyFcbiIsCi0JCQluYW1lKTsKLQkJZ290byBiYWlsb3V0OwotCX0KLQlzY2xoaShhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjQgc2NsOiAlZCAgc2RhOiAlZFxuIiwgZ2V0c2NsKGFkYXApLAotCSAgICAgICBnZXRzZGEoYWRhcCkpOwotCWlmICggMCA9PSBnZXRzY2woYWRhcCkgKSB7Ci0JCXByaW50aygidGVzdF9idXM6ICVzIFNDTCBzdHVjayBsb3chXG4iLG5hbWUpOwotCQlzY2xoaShhZGFwKTsKLQkJZ290byBiYWlsb3V0OwotCX0KLQlpZiAoIDAgPT0gZ2V0c2RhKGFkYXApICkgewotCQlwcmludGsoInRlc3RfYnVzOiAlcyBTREEgdW5leHBlY3RlZCBsb3cgd2hpbGUgU0NMIGhpZ2ghXG4iLAotCQkJbmFtZSk7Ci0JCWdvdG8gYmFpbG91dDsKLQl9Ci0JcHJpbnRrKCJ0ZXN0X2J1czogJXMgcGFzc2VkIHRlc3QuXG4iLG5hbWUpOwotCXJldHVybiAwOwotYmFpbG91dDoKLQlzZGFoaShhZGFwKTsKLQlzY2xoaShhZGFwKTsKLQlyZXR1cm4gLUVOT0RFVjsKLSNlbmRpZgotCXJldHVybiAoMCk7Ci19Ci0KLS8qIC0tLS0tIFV0aWxpdHkgZnVuY3Rpb25zCi0gKi8KLQotCi0vKiBWZXJpZnkgdGhlIGRldmljZSB3ZSB3YW50IHRvIHRhbGsgdG8gb24gdGhlIElJQyBidXMgcmVhbGx5IGV4aXN0cy4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyeV9hZGRyZXNzKHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCwKLQkJICAgICAgIHVuc2lnbmVkIGludCBhZGRyLCBpbnQgcmV0cmllcykKLXsKLQlpbnQgaSwgcmV0ID0gLTE7Ci0Jc2hvcnQgc3RhdHVzOwotCi0JZm9yIChpPTA7aTxyZXRyaWVzO2krKykgewotCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDU0FSLCBhZGRyKTsKLQkJaWljX3N0YXJ0KGFkYXApOwotCQlpZiAod2FpdF9mb3JfcGluKGFkYXAsICZzdGF0dXMpID09IDApIHsKLQkJCWlmICgoc3RhdHVzICYgSVRFX0kyQ0hTUl9ETkUpID09IDApIHsgCi0JCQkJaWljX3N0b3AoYWRhcCk7Ci0JCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0ZDUiwgSVRFX0kyQ0ZDUl9GTFVTSCk7Ci0JCQkJcmV0PTE7Ci0JCQkJYnJlYWs7CS8qIHN1Y2Nlc3MhICovCi0JCQl9Ci0JCX0KLQkJaWljX3N0b3AoYWRhcCk7Ci0JCXVkZWxheShhZGFwLT51ZGVsYXkpOwotCX0KLQlERUIyKGlmIChpKSBwcmludGsoInRyeV9hZGRyZXNzOiBuZWVkZWQgJWQgcmV0cmllcyBmb3IgMHgleFxuIixpLAotCSAgICAgICAgICAgICAgICAgICBhZGRyKSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGlpY19zZW5kYnl0ZXMoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCxjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KQotewotCXN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7Ci0JaW50IHdyY291bnQ9MCwgdGltZW91dDsKLQlzaG9ydCBzdGF0dXM7Ci0JaW50IGxvb3BzLCByZW1haW5kZXIsIGksIGo7Ci0JdW5pb24gewotCQljaGFyIGJ5dGVbMl07Ci0JCXVuc2lnbmVkIHNob3J0IHdvcmQ7Ci0JfSB0bXA7Ci0gICAKLQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDU1NBUiwgKHVuc2lnbmVkIHNob3J0KWJ1Zlt3cmNvdW50KytdKTsKLQljb3VudC0tOwotCWlmIChjb3VudCA9PSAwKQotCQlyZXR1cm4gLUVJTzsKLQotCWxvb3BzID0gIGNvdW50IC8gMzI7CQkvKiAzMi1ieXRlIEZJRk8gKi8KLQlyZW1haW5kZXIgPSBjb3VudCAlIDMyOwotCi0JaWYobG9vcHMpIHsKLQkJZm9yKGk9MDsgaTxsb29wczsgaSsrKSB7Ci0KLQkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQkNSLCAzMik7Ci0JCQlmb3Ioaj0wOyBqPDMyLzI7IGorKykgewotCQkJCXRtcC5ieXRlWzFdID0gYnVmW3dyY291bnQrK107Ci0JCQkJdG1wLmJ5dGVbMF0gPSBidWZbd3Jjb3VudCsrXTsKLQkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkRSLCB0bXAud29yZCk7IAotCQkJfQotCi0JCQkvKiBzdGF0dXMgRklGTyBvdmVycnVuICovCi0JCQlpaWNfaW53KGFkYXAsIElURV9JMkNGU1IpOwotCQkJaWljX2ludyhhZGFwLCBJVEVfSTJDRkJDUik7Ci0KLQkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNIQ1IsIElURV9XUklURSk7CS8qIElzc3VlIFdSSVRFIGNvbW1hbmQgKi8KLQotCQkJLyogV2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlICovCi0JCQl0aW1lb3V0ID0gd2FpdF9mb3JfcGluKGFkYXAsICZzdGF0dXMpOwotCQkJaWYodGltZW91dCkgewotCQkJCWlpY19zdG9wKGFkYXApOwotCQkJCXByaW50aygiaWljX3NlbmRieXRlczogJXMgd3JpdGUgdGltZW91dC5cbiIsIGkyY19hZGFwLT5uYW1lKTsKLQkJCQlyZXR1cm4gLUVSRU1PVEVJTzsgLyogZ290IGEgYmV0dGVyIG9uZSA/PyAqLwotICAgICAJfQotCQkJaWYgKHN0YXR1cyAmIElURV9JMkNIU1JfREIpIHsKLQkJCQlpaWNfc3RvcChhZGFwKTsKLQkJCQlwcmludGsoImlpY19zZW5kYnl0ZXM6ICVzIHdyaXRlIGVycm9yIC0gbm8gYWNrLlxuIiwgaTJjX2FkYXAtPm5hbWUpOwotCQkJCXJldHVybiAtRVJFTU9URUlPOyAvKiBnb3QgYSBiZXR0ZXIgb25lID8/ICovCi0JCQl9Ci0JCX0KLQl9Ci0JaWYocmVtYWluZGVyKSB7Ci0JCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQkNSLCByZW1haW5kZXIpOwotCQlmb3IoaT0wOyBpPHJlbWFpbmRlci8yOyBpKyspIHsKLQkJCXRtcC5ieXRlWzFdID0gYnVmW3dyY291bnQrK107Ci0JCQl0bXAuYnl0ZVswXSA9IGJ1Zlt3cmNvdW50KytdOwotCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0ZEUiwgdG1wLndvcmQpOwotCQl9Ci0KLQkJLyogc3RhdHVzIEZJRk8gb3ZlcnJ1biAqLwotCQlpaWNfaW53KGFkYXAsIElURV9JMkNGU1IpOwotCQlpaWNfaW53KGFkYXAsIElURV9JMkNGQkNSKTsKLQotCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfV1JJVEUpOyAgLyogSXNzdWUgV1JJVEUgY29tbWFuZCAqLwotCi0JCXRpbWVvdXQgPSB3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cyk7Ci0JCWlmKHRpbWVvdXQpIHsKLQkJCWlpY19zdG9wKGFkYXApOwotCQkJcHJpbnRrKCJpaWNfc2VuZGJ5dGVzOiAlcyB3cml0ZSB0aW1lb3V0LlxuIiwgaTJjX2FkYXAtPm5hbWUpOwotCQkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIGdvdCBhIGJldHRlciBvbmUgPz8gKi8KLQkJfQotI2lmbmRlZiBTVFVCX0kyQwotCQlpZiAoc3RhdHVzICYgSVRFX0kyQ0hTUl9EQikgeyAKLQkJCWlpY19zdG9wKGFkYXApOwotCQkJcHJpbnRrKCJpaWNfc2VuZGJ5dGVzOiAlcyB3cml0ZSBlcnJvciAtIG5vIGFjay5cbiIsIGkyY19hZGFwLT5uYW1lKTsKLQkJCXJldHVybiAtRVJFTU9URUlPOyAvKiBnb3QgYSBiZXR0ZXIgb25lID8/ICovCi0JCX0KLSNlbmRpZgotCX0KLQlpaWNfc3RvcChhZGFwKTsKLQlyZXR1cm4gd3Jjb3VudDsKLX0KLQotCi1zdGF0aWMgaW50IGlpY19yZWFkYnl0ZXMoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgY2hhciAqYnVmLCBpbnQgY291bnQsCi0JaW50IHNyZWFkKQotewotCWludCByZGNvdW50PTAsIGksIHRpbWVvdXQ7Ci0Jc2hvcnQgc3RhdHVzOwotCXN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7Ci0JaW50IGxvb3BzLCByZW1haW5kZXIsIGo7Ci0JdW5pb24gewotCQljaGFyIGJ5dGVbMl07Ci0JCXVuc2lnbmVkIHNob3J0IHdvcmQ7Ci0JfSB0bXA7Ci0JCQotCWxvb3BzID0gY291bnQgLyAzMjsJCQkJLyogMzItYnl0ZSBGSUZPICovCi0JcmVtYWluZGVyID0gY291bnQgJSAzMjsKLQotCWlmKGxvb3BzKSB7Ci0JCWZvcihpPTA7IGk8bG9vcHM7IGkrKykgewotCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0ZCQ1IsIDMyKTsKLQkJCWlmIChzcmVhZCkKLQkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfU1JFQUQpOwotCQkJZWxzZQotCQkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNIQ1IsIElURV9SRUFEKTsJCS8qIElzc3VlIFJFQUQgY29tbWFuZCAqLwotCi0JCQl0aW1lb3V0ID0gd2FpdF9mb3JfcGluKGFkYXAsICZzdGF0dXMpOwotCQkJaWYodGltZW91dCkgewotCQkJCWlpY19zdG9wKGFkYXApOwotCQkJCXByaW50aygiaWljX3JlYWRieXRlczogICVzIHJlYWQgdGltZW91dC5cbiIsIGkyY19hZGFwLT5uYW1lKTsKLQkJCQlyZXR1cm4gKC0xKTsKLQkJCX0KLSNpZm5kZWYgU1RVQl9JMkMKLQkJCWlmIChzdGF0dXMgJiBJVEVfSTJDSFNSX0RCKSB7Ci0JCQkJaWljX3N0b3AoYWRhcCk7Ci0JCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAlcyByZWFkIGVycm9yIC0gbm8gYWNrLlxuIiwgaTJjX2FkYXAtPm5hbWUpOwotCQkJCXJldHVybiAoLTEpOwotCQkJfQotI2VuZGlmCi0KLQkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9mZShhZGFwLCAmc3RhdHVzKTsKLQkJCWlmKHRpbWVvdXQpIHsKLQkJCQlpaWNfc3RvcChhZGFwKTsKLQkJCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICAlcyBGSUZPIGlzIGVtcHR5XG4iLCBpMmNfYWRhcC0+bmFtZSk7Ci0JCQkJcmV0dXJuICgtMSk7IAotCQkJfQotCi0JCQlmb3Ioaj0wOyBqPDMyLzI7IGorKykgewotCQkJCXRtcC53b3JkID0gaWljX2ludyhhZGFwLCBJVEVfSTJDRkRSKTsKLQkJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzFdOwotCQkJCWJ1ZltyZGNvdW50KytdID0gdG1wLmJ5dGVbMF07Ci0JCQl9Ci0KLQkJCS8qIHN0YXR1cyBGSUZPIHVuZGVycnVuICovCi0JCQlpaWNfaW53KGFkYXAsIElURV9JMkNGU1IpOwotCi0JCX0KLQl9Ci0KLQotCWlmKHJlbWFpbmRlcikgewotCQlyZW1haW5kZXI9KHJlbWFpbmRlcisxKS8yICogMjsKLQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0ZCQ1IsIHJlbWFpbmRlcik7Ci0JCWlmIChzcmVhZCkKLQkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNIQ1IsIElURV9TUkVBRCk7Ci0JCWVsc2UKLQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0hDUiwgSVRFX1JFQUQpOwkJLyogSXNzdWUgUkVBRCBjb21tYW5kICovCi0KLQkJdGltZW91dCA9IHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKTsKLQkJaWYodGltZW91dCkgewotCQkJaWljX3N0b3AoYWRhcCk7Ci0JCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICAlcyByZWFkIHRpbWVvdXQuXG4iLCBpMmNfYWRhcC0+bmFtZSk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotI2lmbmRlZiBTVFVCX0kyQwotCQlpZiAoc3RhdHVzICYgSVRFX0kyQ0hTUl9EQikgewotCQkJaWljX3N0b3AoYWRhcCk7Ci0JCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICVzIHJlYWQgZXJyb3IgLSBubyBhY2suXG4iLCBpMmNfYWRhcC0+bmFtZSk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfQotI2VuZGlmCi0JCXRpbWVvdXQgPSB3YWl0X2Zvcl9mZShhZGFwLCAmc3RhdHVzKTsKLQkJaWYodGltZW91dCkgewotCQkJaWljX3N0b3AoYWRhcCk7Ci0JCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICAlcyBGSUZPIGlzIGVtcHR5XG4iLCBpMmNfYWRhcC0+bmFtZSk7Ci0JCQlyZXR1cm4gKC0xKTsKLQkJfSAgICAgICAgIAotCi0JCWZvcihpPTA7IGk8KHJlbWFpbmRlcisxKS8yOyBpKyspIHsKLQkJCXRtcC53b3JkID0gaWljX2ludyhhZGFwLCBJVEVfSTJDRkRSKTsKLQkJCWJ1ZltyZGNvdW50KytdID0gdG1wLmJ5dGVbMV07Ci0JCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzBdOwotCQl9Ci0KLQkJLyogc3RhdHVzIEZJRk8gdW5kZXJydW4gKi8KLQkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKLQotCX0KLQotCWlpY19zdG9wKGFkYXApOwotCXJldHVybiByZGNvdW50OwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBjb21iaW5lZCB0cmFuc2FjdGlvbnMuICBDb21iaW5lZAotICogdHJhbnNhY3Rpb25zIGNvbnNpc3Qgb2YgY29tYmluYXRpb25zIG9mIHJlYWRpbmcgYW5kIHdyaXRpbmcgYmxvY2tzIG9mIGRhdGEuCi0gKiBFYWNoIHRyYW5zZmVyIChpLmUuIGEgcmVhZCBvciBhIHdyaXRlKSBpcyBzZXBhcmF0ZWQgYnkgYSByZXBlYXRlZCBzdGFydAotICogY29uZGl0aW9uLgotICovCi0jaWYgMAotc3RhdGljIGludCBpaWNfY29tYmluZWRfdHJhbnNhY3Rpb24oc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pIAotewotICAgaW50IGk7Ci0gICBzdHJ1Y3QgaTJjX21zZyAqcG1zZzsKLSAgIGludCByZXQ7Ci0KLSAgIERFQjIocHJpbnRrKCJCZWdpbm5pbmcgY29tYmluZWQgdHJhbnNhY3Rpb25cbiIpKTsKLQotICAgZm9yKGk9MDsgaTwobnVtLTEpOyBpKyspIHsKLSAgICAgIHBtc2cgPSAmbXNnc1tpXTsKLSAgICAgIGlmKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpIHsKLSAgICAgICAgIERFQjIocHJpbnRrKCIgIFRoaXMgb25lIGlzIGEgcmVhZFxuIikpOwotICAgICAgICAgcmV0ID0gaWljX3JlYWRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4sIElJQ19DT01CSU5FRF9YRkVSKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgewotICAgICAgICAgREVCMihwcmludGsoIlRoaXMgb25lIGlzIGEgd3JpdGVcbiIpKTsKLSAgICAgICAgIHJldCA9IGlpY19zZW5kYnl0ZXMoaTJjX2FkYXAsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuLCBJSUNfQ09NQklORURfWEZFUik7Ci0gICAgICB9Ci0gICB9Ci0gICAvKiBMYXN0IHJlYWQgb3Igd3JpdGUgc2VnbWVudCBuZWVkcyB0byBiZSB0ZXJtaW5hdGVkIHdpdGggYSBzdG9wICovCi0gICBwbXNnID0gJm1zZ3NbaV07Ci0KLSAgIGlmKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpIHsKLSAgICAgIERFQjIocHJpbnRrKCJEb2luZyB0aGUgbGFzdCByZWFkXG4iKSk7Ci0gICAgICByZXQgPSBpaWNfcmVhZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgSUlDX1NJTkdMRV9YRkVSKTsKLSAgIH0KLSAgIGVsc2UgaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgewotICAgICAgREVCMihwcmludGsoIkRvaW5nIHRoZSBsYXN0IHdyaXRlXG4iKSk7Ci0gICAgICByZXQgPSBpaWNfc2VuZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgSUlDX1NJTkdMRV9YRkVSKTsKLSAgIH0KLQotICAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0KLS8qIFdoZW5ldmVyIHdlIGluaXRpYXRlIGEgdHJhbnNhY3Rpb24sIHRoZSBmaXJzdCBieXRlIGNsb2NrZWQKLSAqIG9udG8gdGhlIGJ1cyBhZnRlciB0aGUgc3RhcnQgY29uZGl0aW9uIGlzIHRoZSBhZGRyZXNzICg3IGJpdCkgb2YgdGhlCi0gKiBkZXZpY2Ugd2Ugd2FudCB0byB0YWxrIHRvLiAgVGhpcyBmdW5jdGlvbiBtYW5pcHVsYXRlcyB0aGUgYWRkcmVzcyBzcGVjaWZpZWQKLSAqIHNvIHRoYXQgaXQgbWFrZXMgc2Vuc2UgdG8gdGhlIGhhcmR3YXJlIHdoZW4gd3JpdHRlbiB0byB0aGUgSUlDIHBlcmlwaGVyYWwuCi0gKgotICogTm90ZTogMTAgYml0IGFkZHJlc3NlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGRyaXZlciwgYWx0aG91Z2ggdGhleSBhcmUKLSAqIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuICBUaGlzIGZ1bmN0aW9uYWxpdHkgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGlpY19kb0FkZHJlc3Moc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnLCBpbnQgcmV0cmllcykgCi17Ci0JdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSBtc2ctPmZsYWdzOwotCXVuc2lnbmVkIGludCBhZGRyOwotCWludCByZXQ7Ci0KLS8qIFRlbiBiaXQgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQgcmlnaHQgbm93ICovCi0JaWYgKCAoZmxhZ3MgJiBJMkNfTV9URU4pICApIHsgCi0jaWYgMAotCQlhZGRyID0gMHhmMCB8ICgoIG1zZy0+YWRkciA+PiA3KSAmIDB4MDMpOwotCQlERUIyKHByaW50aygiYWRkcjA6ICVkXG4iLGFkZHIpKTsKLQkJcmV0ID0gdHJ5X2FkZHJlc3MoYWRhcCwgYWRkciwgcmV0cmllcyk7Ci0JCWlmIChyZXQhPTEpIHsKLQkJCXByaW50aygiaWljX2RvQWRkcmVzczogZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUuXG4iKTsKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCQl9Ci0JCWlpY19vdXR3KGFkYXAsbXNnLT5hZGRyICYgMHg3Zik7Ci0JCWlmIChyZXQgIT0gMSkgewotCQkJcHJpbnRrKCJpaWNfZG9BZGRyZXNzOiBkaWVkIGF0IDJuZCBhZGRyZXNzIGNvZGUuXG4iKTsKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCQl9Ci0JCWlmICggZmxhZ3MgJiBJMkNfTV9SRCApIHsKLQkJCWkyY19yZXBzdGFydChhZGFwKTsKLQkJCWFkZHIgfD0gMHgwMTsKLQkJCXJldCA9IHRyeV9hZGRyZXNzKGFkYXAsIGFkZHIsIHJldHJpZXMpOwotCQkJaWYgKHJldCE9MSkgewotCQkJCXByaW50aygiaWljX2RvQWRkcmVzczogZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUuXG4iKTsKLQkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQkJCX0KLQkJfQotI2VuZGlmCi0JfSBlbHNlIHsKLQotCQlhZGRyID0gKCBtc2ctPmFkZHIgPDwgMSApOwotCi0jaWYgMAotCQlpZiAoZmxhZ3MgJiBJMkNfTV9SRCApCi0JCQlhZGRyIHw9IDE7Ci0JCWlmIChmbGFncyAmIEkyQ19NX1JFVl9ESVJfQUREUiApCi0JCQlhZGRyIF49IDE7Ci0jZW5kaWYKLQotCQlpZiAoaWljX2ludyhhZGFwLCBJVEVfSTJDU0FSKSAhPSBhZGRyKSB7Ci0JCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDU0FSLCBhZGRyKTsKLQkJCXJldCA9IHRyeV9hZGRyZXNzKGFkYXAsIGFkZHIsIHJldHJpZXMpOwotCQkJaWYgKHJldCE9MSkgewotCQkJCXByaW50aygiaWljX2RvQWRkcmVzczogZGllZCBhdCBhZGRyZXNzIGNvZGUuXG4iKTsKLQkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQkJCX0KLQkJfQotCi0gIH0KLQotCXJldHVybiAwOwotfQotCi0KLS8qIERlc2NyaXB0aW9uOiBQcmVwYXJlcyB0aGUgY29udHJvbGxlciBmb3IgYSB0cmFuc2FjdGlvbiAoY2xlYXJpbmcgc3RhdHVzCi0gKiByZWdpc3RlcnMsIGRhdGEgYnVmZmVycywgZXRjKSwgYW5kIHRoZW4gY2FsbHMgZWl0aGVyIGlpY19yZWFkYnl0ZXMgb3IKLSAqIGlpY19zZW5kYnl0ZXMgdG8gZG8gdGhlIGFjdHVhbCB0cmFuc2FjdGlvbi4KLSAqCi0gKiBzdGlsbCB0byBiZSBkb25lOiBCZWZvcmUgd2UgaXNzdWUgYSB0cmFuc2FjdGlvbiwgd2Ugc2hvdWxkCi0gKiB2ZXJpZnkgdGhhdCB0aGUgYnVzIGlzIG5vdCBidXN5IG9yIGluIHNvbWUgdW5rbm93biBzdGF0ZS4KLSAqLwotc3RhdGljIGludCBpaWNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAotCQkgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsIAotCQkgICAgaW50IG51bSkKLXsKLQlzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOwotCXN0cnVjdCBpMmNfbXNnICpwbXNnOwotCWludCBpID0gMDsKLQlpbnQgcmV0LCB0aW1lb3V0OwotICAgIAotCXBtc2cgPSAmbXNnc1tpXTsKLQotCWlmKCFwbXNnLT5sZW4pIHsKLQkJREVCMihwcmludGsoImlpY194ZmVyOiByZWFkL3dyaXRlIGxlbmd0aCBpcyAwXG4iKTspCi0JCXJldHVybiAtRUlPOwotCX0KLQlpZighKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpICYmICghKHBtc2ctPmxlbiklMikgKSB7Ci0JCURFQjIocHJpbnRrKCJpaWNfeGZlcjogd3JpdGUgYnVmZmVyIGxlbmd0aCBpcyBub3Qgb2RkXG4iKTspCi0JCXJldHVybiAtRUlPOyAKLQl9Ci0KLQkvKiBXYWl0IGZvciBhbnkgcGVuZGluZyB0cmFuc2ZlcnMgdG8gY29tcGxldGUgKi8KLQl0aW1lb3V0ID0gd2FpdF9mb3JfYmIoYWRhcCk7Ci0JaWYgKHRpbWVvdXQpIHsKLQkJREVCMihwcmludGsoImlpY194ZmVyOiBUaW1lb3V0IHdhaXRpbmcgZm9yIGhvc3Qgbm90IGJ1c3lcbiIpOykKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogRmx1c2ggRklGTyAqLwotCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQ1IsIElURV9JMkNGQ1JfRkxVU0gpOwotCi0JLyogTG9hZCBhZGRyZXNzICovCi0JcmV0ID0gaWljX2RvQWRkcmVzcyhhZGFwLCBwbXNnLCBpMmNfYWRhcC0+cmV0cmllcyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLSNpZiAwCi0JLyogQ29tYmluZWQgdHJhbnNhY3Rpb24gKHJlYWQgYW5kIHdyaXRlKSAqLwotCWlmKG51bSA+IDEpIHsKLSAgICAgICAgICAgREVCMihwcmludGsoImlpY194ZmVyOiBDYWxsIGNvbWJpbmVkIHRyYW5zYWN0aW9uXG4iKSk7Ci0gICAgICAgICAgIHJldCA9IGlpY19jb21iaW5lZF90cmFuc2FjdGlvbihpMmNfYWRhcCwgbXNncywgbnVtKTsKLSAgfQotI2VuZGlmCi0KLQlERUIzKHByaW50aygiaWljX3hmZXI6IE1zZyAlZCwgYWRkcj0weCV4LCBmbGFncz0weCV4LCBsZW49JWRcbiIsCi0JCWksIG1zZ3NbaV0uYWRkciwgbXNnc1tpXS5mbGFncywgbXNnc1tpXS5sZW4pOykKLQotCWlmKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpIAkJLyogUmVhZCAqLwotCQlyZXQgPSBpaWNfcmVhZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgMCk7Ci0JZWxzZSB7CQkJCQkJCQkJCQkJCS8qIFdyaXRlICovIAotCQl1ZGVsYXkoMTAwMCk7Ci0JCXJldCA9IGlpY19zZW5kYnl0ZXMoaTJjX2FkYXAsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuKTsKLQl9Ci0KLQlpZiAocmV0ICE9IHBtc2ctPmxlbikKLQkJREVCMyhwcmludGsoImlpY194ZmVyOiBlcnJvciBvciBmYWlsIG9uIHJlYWQvd3JpdGUgJWQgYnl0ZXMuXG4iLHJldCkpOyAKLQllbHNlCi0JCURFQjMocHJpbnRrKCJpaWNfeGZlcjogcmVhZC93cml0ZSAlZCBieXRlcy5cbiIscmV0KSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qIEltcGxlbWVudHMgZGV2aWNlIHNwZWNpZmljIGlvY3Rscy4gIEhpZ2hlciBsZXZlbCBpb2N0bHMgY2FuCi0gKiBiZSBmb3VuZCBpbiBpMmMtY29yZS5jIGFuZCBhcmUgdHlwaWNhbCBvZiBhbnkgaTJjIGNvbnRyb2xsZXIgKHNwZWNpZnlpbmcKLSAqIHNsYXZlIGFkZHJlc3MsIHRpbWVvdXRzLCBldGMpLiAgVGhlc2UgaW9jdGxzIHRha2UgYWR2YW50YWdlIG9mIGFueSBoYXJkd2FyZQotICogZmVhdHVyZXMgYnVpbHQgaW50byB0aGUgY29udHJvbGxlciBmb3Igd2hpY2ggdGhpcyBhbGdvcml0aG0tYWRhcHRlciBzZXQKLSAqIHdhcyB3cml0dGVuLiAgVGhlc2UgaW9jdGxzIGFsbG93IHlvdSB0byB0YWtlIGNvbnRyb2wgb2YgdGhlIGRhdGEgYW5kIGNsb2NrCi0gKiBsaW5lcyBhbmQgc2V0IHRoZSBlaXRoZXIgaGlnaCBvciBsb3csCi0gKiBzaW1pbGFyIHRvIGEgR1BJTyBwaW4uCi0gKi8KLXN0YXRpYyBpbnQgYWxnb19jb250cm9sKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0KLSAgc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwID0gYWRhcHRlci0+YWxnb19kYXRhOwotICBzdHJ1Y3QgaTJjX2lpY19tc2cgc19tc2c7Ci0gIGNoYXIgKmJ1ZjsKLQlpbnQgcmV0OwotCi0gIGlmIChjbWQgPT0gSTJDX1NSRUFEKSB7Ci0JCWlmKGNvcHlfZnJvbV91c2VyKCZzX21zZywgKHN0cnVjdCBpMmNfaWljX21zZyAqKWFyZywgCi0JCQkJc2l6ZW9mKHN0cnVjdCBpMmNfaWljX21zZykpKSAKLQkJCXJldHVybiAtRUZBVUxUOwotCQlidWYgPSBrbWFsbG9jKHNfbXNnLmxlbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWY9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJLyogRmx1c2ggRklGTyAqLwotCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkNSLCBJVEVfSTJDRkNSX0ZMVVNIKTsKLQotCQkvKiBMb2FkIGFkZHJlc3MgKi8KLQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUixzX21zZy5hZGRyPDwxKTsKLQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NTQVIsc19tc2cud2FkZHIgJiAweGZmKTsKLQotCQlyZXQgPSBpaWNfcmVhZGJ5dGVzKGFkYXB0ZXIsIGJ1Ziwgc19tc2cubGVuLCAxKTsKLQkJaWYgKHJldD49MCkgewotCQkJaWYoY29weV90b191c2VyKCBzX21zZy5idWYsIGJ1Ziwgc19tc2cubGVuKSApIAotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCX0KLQkJa2ZyZWUoYnVmKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHUzMiBpaWNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JcmV0dXJuIEkyQ19GVU5DX1NNQlVTX0VNVUwgfCBJMkNfRlVOQ18xMEJJVF9BRERSIHwgCi0JICAgICAgIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HOyAKLX0KLQotLyogLS0tLS1leHBvcnRlZCBhbGdvcml0aG0gZGF0YTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwotCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaWljX2FsZ28gPSB7Ci0JLm1hc3Rlcl94ZmVyCT0gaWljX3hmZXIsCi0JLmFsZ29fY29udHJvbAk9IGFsZ29fY29udHJvbCwgLyogaW9jdGwgKi8KLQkuZnVuY3Rpb25hbGl0eQk9IGlpY19mdW5jLAotfTsKLQotCi0vKiAKLSAqIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyB0byBsb2FkIGFsZ29yaXRobXMgYXQgcnVudGltZSAKLSAqLwotaW50IGkyY19paWNfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0Jc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICppaWNfYWRhcCA9IGFkYXAtPmFsZ29fZGF0YTsKLQotCWlmIChpaWNfdGVzdCkgewotCQlpbnQgcmV0ID0gdGVzdF9idXMoaWljX2FkYXAsIGFkYXAtPm5hbWUpOwotCQlpZiAocmV0PDApCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlERUIyKHByaW50aygiaTJjLWFsZ28taXRlOiBodyByb3V0aW5lcyBmb3IgJXMgcmVnaXN0ZXJlZC5cbiIsCi0JICAgICAgICAgICAgYWRhcC0+bmFtZSkpOwotCi0JLyogcmVnaXN0ZXIgbmV3IGFkYXB0ZXIgdG8gaTJjIG1vZHVsZS4uLiAqLwotCWFkYXAtPmFsZ28gPSAmaWljX2FsZ287Ci0KLQlhZGFwLT50aW1lb3V0ID0gMTAwOwkvKiBkZWZhdWx0IHZhbHVlcywgc2hvdWxkCSovCi0JYWRhcC0+cmV0cmllcyA9IDM7CQkvKiBiZSByZXBsYWNlZCBieSBkZWZpbmVzCSovCi0JYWRhcC0+ZmxhZ3MgPSAwOwotCi0JaWljX2luaXQoaWljX2FkYXApOwotCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7Ci19Ci0KLQotaW50IGkyY19paWNfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JaW50IHJlczsKLQlpZiAoKHJlcyA9IGkyY19kZWxfYWRhcHRlcihhZGFwKSkgPCAwKQotCQlyZXR1cm4gcmVzOwotCURFQjIocHJpbnRrKCJpMmMtYWxnby1pdGU6IGFkYXB0ZXIgdW5yZWdpc3RlcmVkOiAlc1xuIixhZGFwLT5uYW1lKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgX19pbml0IGkyY19hbGdvX2lpY19pbml0ICh2b2lkKQotewotCXByaW50ayhLRVJOX0lORk8gIklURSBpaWMgKGkyYykgYWxnb3JpdGhtIG1vZHVsZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBpMmNfYWxnb19paWNfZXhpdCh2b2lkKQotewotCXJldHVybjsKLX0KLQotCi1FWFBPUlRfU1lNQk9MKGkyY19paWNfYWRkX2J1cyk7Ci1FWFBPUlRfU1lNQk9MKGkyY19paWNfZGVsX2J1cyk7Ci0KLS8qIFRoZSBNT0RVTEVfKiBtYWNyb3MgcmVzb2x2ZSB0byBub3RoaW5nIGlmIE1PRFVMRVMgaXMgbm90IGRlZmluZWQKLSAqIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLgotICovCi1NT0RVTEVfQVVUSE9SKCJNb250YVZpc3RhIFNvZnR3YXJlIDx3d3cubXZpc3RhLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSVRFIGlpYyBhbGdvcml0aG0iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotbW9kdWxlX3BhcmFtKGlpY190ZXN0LCBib29sLCAwKTsKLW1vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotCi1NT0RVTEVfUEFSTV9ERVNDKGlpY190ZXN0LCAiVGVzdCBpZiB0aGUgSTJDIGJ1cyBpcyBhdmFpbGFibGUiKTsKLU1PRFVMRV9QQVJNX0RFU0MoaTJjX2RlYnVnLAotICAgICAgICAiZGVidWcgbGV2ZWwgLSAwIG9mZjsgMSBub3JtYWw7IDIsMyBtb3JlIHZlcmJvc2U7IDkgaWljLXByb3RvY29sIik7Ci0KLQotLyogVGhpcyBmdW5jdGlvbiByZXNvbHZlcyB0byBpbml0X21vZHVsZSAodGhlIGZ1bmN0aW9uIGludm9rZWQgd2hlbiBhIG1vZHVsZQotICogaXMgbG9hZGVkIHZpYSBpbnNtb2QpIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggTU9EVUxFUyBkZWZpbmVkLgotICogT3RoZXJ3aXNlIChpLmUuIGlmIHlvdSB3YW50IHRoaXMgZHJpdmVyIHN0YXRpY2FsbHkgbGlua2VkIHRvIHRoZSBrZXJuZWwpLAotICogYSBwb2ludGVyIHRvIHRoaXMgZnVuY3Rpb24gaXMgc3RvcmVkIGluIGEgdGFibGUgYW5kIGNhbGxlZAotICogZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUga2VybmVsIChpbiBkb19iYXNpY19zZXR1cCBpbiAvaW5pdC9tYWluLmMpIAotICoKLSAqIEFsbCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgY29tcGxlbWVudHMgb2YgdGhlIG1hY3JvcyBkZWZpbmVkIGluIGxpbnV4L2luaXQuaAotICovCi1tb2R1bGVfaW5pdChpMmNfYWxnb19paWNfaW5pdCk7Ci0KLQotLyogSWYgTU9EVUxFUyBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbAotICogcmVzb2x2ZWQgdG8gY2xlYW51cF9tb2R1bGUuCi0gKi8KLW1vZHVsZV9leGl0KGkyY19hbGdvX2lpY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWl0ZS5oIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Y2EzYzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBpMmMtaXRlLmg6IEdsb2JhbCBkZWZpbmVzIGZvciB0aGUgSTJDIGNvbnRyb2xsZXIgb24gYm9hcmQgdGhlICAgIAotICAgICAgICAgICAgICAgICBJVEUgTUlQUyBwcm9jZXNzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBIYWktUGFvIEZhbiwgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICAgaHBmYW5AbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQotCi0gICBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLQotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKi8KLQotI2lmbmRlZiBJMkNfSVRFX0gKLSNkZWZpbmUgSTJDX0lURV9IIDEKLQotI2luY2x1ZGUgPGFzbS9pdDgxNzIvaXQ4MTcyLmg+Ci0KLS8qIEkyQyBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgSVRFX0kyQ0hDUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4MzAKLSNkZWZpbmUgSVRFX0kyQ0hTUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4MzQKLSNkZWZpbmUgSVRFX0kyQ1NBUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4MzgKLSNkZWZpbmUgSVRFX0kyQ1NTQVIJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDNjCi0jZGVmaW5lIElURV9JMkNDS0NOVAlJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4NDgKLSNkZWZpbmUgSVRFX0kyQ1NIRFIJSVQ4MTcyX1BDSV9JT19CQVNFICsgSVRfSTJDX0JBU0UgKyAweDRjCi0jZGVmaW5lIElURV9JMkNSU1VSCUlUODE3Ml9QQ0lfSU9fQkFTRSArIElUX0kyQ19CQVNFICsgMHg1MAotI2RlZmluZSBJVEVfSTJDUFNVUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4NTQKLQotI2RlZmluZSBJVEVfSTJDRkRSCUlUODE3Ml9QQ0lfSU9fQkFTRSArIElUX0kyQ19CQVNFICsgMHg3MAotI2RlZmluZSBJVEVfSTJDRkJDUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4NzQKLSNkZWZpbmUgSVRFX0kyQ0ZDUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4NzgKLSNkZWZpbmUgSVRFX0kyQ0ZTUglJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9JMkNfQkFTRSArIDB4N2MKLQotCi0vKiBIb3N0IENvbnRyb2wgUmVnaXN0ZXIgSVRFX0kyQ0hDUiAqLwotI2RlZmluZQlJVEVfSTJDSENSX0hDRQkweDAxCS8qIEVuYWJsZSBJMkMgSG9zdCBDb250cm9sbGVyICovCi0jZGVmaW5lCUlURV9JMkNIQ1JfSUUJMHgwMgkvKiBFbmFibGUgdGhlIGludGVycnVwdCBhZnRlciBjb21wbGV0aW5nCi0JCQkJICAgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KLSNkZWZpbmUgSVRFX0kyQ0hDUl9DUF9XCTB4MDAJLyogYml0Mi00IDAwMCAtIFdyaXRlICovCi0jZGVmaW5lCUlURV9JMkNIQ1JfQ1BfUgkweDA4CS8qCSAgMDEwIC0gQ3VycmVudCBhZGRyZXNzIHJlYWQgKi8KLSNkZWZpbmUJSVRFX0kyQ0hDUl9DUF9TCTB4MTAJLyoJICAxMDAgLSBTZXF1ZW50aWFsIHJlYWQgKi8KLSNkZWZpbmUgSVRFX0kyQ0hDUl9TVAkweDIwCS8qIEluaXRpYXRlcyB0aGUgSTJDIGhvc3QgY29udHJvbGxlciB0byBleGVjdXRlCi0JCQkJICAgdGhlIGNvbW1hbmQgYW5kIHNlbmQgdGhlIGRhdGEgcHJvZ3JhbW1lZCBpbgotCQkJCSAgIGFsbCByZXF1aXJlZCByZWdpc3RlcnMgdG8gSTJDIGJ1cyAqLwotI2RlZmluZSBJVEVfQ01ECQlJVEVfSTJDSENSX0hDRSB8IElURV9JMkNIQ1JfSUUgfCBJVEVfSTJDSENSX1NUCi0jZGVmaW5lIElURV9XUklURQlJVEVfQ01EIHwgSVRFX0kyQ0hDUl9DUF9XCi0jZGVmaW5lIElURV9SRUFECUlURV9DTUQgfCBJVEVfSTJDSENSX0NQX1IKLSNkZWZpbmUgSVRFX1NSRUFECUlURV9DTUQgfCBJVEVfSTJDSENSX0NQX1MKLQotLyogSG9zdCBTdGF0dXMgUmVnaXN0ZXIgSVRFX0kyQ0hTUiAqLwotI2RlZmluZQlJVEVfSTJDSFNSX0RCCTB4MDEJLyogRGV2aWNlIGlzIGJ1c3ksIHJlY2VpdmVzIE5BQ0sgcmVzcG9uc2UgZXhjZXB0Ci0JCQkJICAgaW4gdGhlIGZpcnN0IGFuZCBsYXN0IGJ5dGVzICovCi0jZGVmaW5lCUlURV9JMkNIU1JfRE5FCTB4MDIJLyogVGFyZ2V0IGFkZHJlc3Mgb24gSTJDIGJ1cyBkb2VzIG5vdCBleGlzdCAqLwotI2RlZmluZQlJVEVfSTJDSFNSX1RESQkweDA0CS8qIFIvVyBUcmFuc2FjdGlvbiBvbiBJMkMgYnVzIHdhcyBjb21wbGV0ZWQgKi8KLSNkZWZpbmUJSVRFX0kyQ0hTUl9IQgkweDA4CS8qIEhvc3QgY29udHJvbGxlciBpcyBwcm9jZXNzaW5nIHRyYW5zYWN0aW9ucyAqLwotI2RlZmluZQlJVEVfSTJDSFNSX0ZFUgkweDEwCS8qIEVycm9yIG9jY3VycyBpbiB0aGUgRklGTyAqLwotCi0vKiBTbGF2ZSBBZGRyZXNzIFJlZ2lzdGVyIElURV9JMkNTQVIgKi8KLSNkZWZpbmUJSVRFX0kyQ1NBUl9TQV9NQVNLCTB4ZmUJLyogVGFyZ2V0IEkyQyBkZXZpY2UgYWRkcmVzcyAqLwotI2RlZmluZQlJVEVfSTJDU0FSX0FTTwkJMHgwMTAwCS8qIE91dHB1dCAxLzAgdG8gSTJDQVMgcG9ydCB3aGVuIHRoZQotCQkJCQkgICBuZXh0IHNsYXZlIGFkZHJlc3MgaXMgYWRkcmVzc2VkICovCi0KLS8qIFNsYXZlIFN1Yi1hZGRyZXNzIFJlZ2lzdGVyIElURV9JMkNTU0FSICovCi0jZGVmaW5lCUlURV9JMkNTU0FSX1NVQkFfTUFTSwkweGZmCS8qIFRhcmdldCBJMkMgZGV2aWNlIHN1Yi1hZGRyZXNzICovCi0KLS8qIENsb2NrIENvdW50ZXIgUmVnaXN0ZXIgSVRFX0kyQ0NLQ05UICovCi0jZGVmaW5lCUlURV9JMkNDS0NOVF9TVE9QCTB4MDAJLyogc3RvcCBJMkMgY2xvY2sgKi8KLSNkZWZpbmUJSVRFX0kyQ0NLQ05UX0hQQ0NfTUFTSwkweDdmCS8qIFNDTCBoaWdoIHBlcmlvZCBjb3VudGVyICovCi0jZGVmaW5lCUlURV9JMkNDS0NOVF9MUENDX01BU0sJMHg3ZjAwCS8qIFNDTCBsb3cgcGVyaW9kIGNvdW50ZXIgKi8KLQotLyogU1RBUlQgSG9sZCBUaW1lIFJlZ2lzdGVyIElURV9JMkNTSERSICovCi0vKiB2YWx1ZSBpcyBjb3VudGVkIGJhc2VkIG9uIDE2IE1IeiBpbnRlcm5hbCBjbG9jayAqLwotI2RlZmluZSBJVEVfSTJDU0hEUl9GTQkweDBhCS8qIFNUQVJUIGNvbmRpdGlvbiBhdCBmYXN0IG1vZGUgKi8KLSNkZWZpbmUJSVRFX0kyQ1NIRFJfU00JMHg0NwkvKiBTVEFSVCBjb250aXRpb24gYXQgc3RhbmRhcmQgbW9kZSAqLwotCi0vKiAoUmVwZWF0ZWQpIFNUQVJUIFNldHVwIFRpbWUgUmVnaXN0ZXIgSVRFX0kyQ1JTVVIgKi8KLS8qIHZhbHVlIGlzIGNvdW50ZWQgYmFzZWQgb24gMTYgTUh6IGludGVybmFsIGNsb2NrICovCi0jZGVmaW5lCUlURV9JMkNSU1VSX0ZNCTB4MGEJLyogcmVwZWF0ZWQgU1RBUlQgY29uZGl0aW9uIGF0IGZhc3QgbW9kZSAqLwotI2RlZmluZQlJVEVfSTJDUlNVUl9TTQkweDUwCS8qIHJlcGVhdGVkIFNUQVJUIGNvbmRpdGlvbiBhdCBzdGFuZGFyZCBtb2RlICovCi0KLS8qIFNUT1Agc2V0dXAgVGltZSBSZWdpc3RlciBJVEVfSTJDUFNVUiAqLwotCi0vKiBGSUZPIERhdGEgUmVnaXN0ZXIgSVRFX0kyQ0ZEUiAqLwotI2RlZmluZQlJVEVfSTJDRkRSX01BU0sJCTB4ZmYKLQotLyogRklGTyBCeXRlIENvdW50IFJlZ2lzdGVyIElURV9JMkNGQkNSICovCi0jZGVmaW5lIElURV9JMkNGQkNSX01BU0sJMHgzZgotCi0vKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgSVRFX0kyQ0ZDUiAqLwotI2RlZmluZQlJVEVfSTJDRkNSX0ZMVVNICTB4MDEJLyogRmx1c2ggRklGTyBhbmQgcmVzZXQgdGhlIEZJRk8gcG9pbnQKLQkJCQkJICAgYW5kIEkyQ0ZTUiAqLwotLyogRklGTyBTdGF0dXMgUmVnaXN0ZXIgSVRFX0kyQ0ZTUiAqLwotI2RlZmluZQlJVEVfSTJDRlNSX0ZPCTB4MDEJLyogRklGTyBpcyBvdmVycnVuIHdoZW4gd3JpdGUgKi8KLSNkZWZpbmUJSVRFX0kyQ0ZTUl9GVQkweDAyCS8qIEZJRk8gaXMgdW5kZXJydW4gd2hlbiByZWFkICovCi0jZGVmaW5lCUlURV9JMkNGU1JfRkYJMHgwNAkvKiBGSUZPIGlzIGZ1bGwgd2hlbiB3cml0ZSAqLwotI2RlZmluZQlJVEVfSTJDRlNSX0ZFCTB4MDgJLyogRklGTyBpcyBlbXB0eSB3aGVuIHJlYWQgKi8KLQotI2VuZGlmICAvKiBJMkNfSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKaW5kZXggOTA4MWM5Zi4uMzZmZGY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKQEAgLTM4MSwxNCArMzgxLDcgQEAKIAogCXJldHVybiBydmFsOwogfQotCi1pbnQgaTJjX3BjYV9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlyZXR1cm4gaTJjX2RlbF9hZGFwdGVyKGFkYXApOwotfQotCiBFWFBPUlRfU1lNQk9MKGkyY19wY2FfYWRkX2J1cyk7Ci1FWFBPUlRfU1lNQk9MKGkyY19wY2FfZGVsX2J1cyk7CiAKIE1PRFVMRV9BVVRIT1IoIklhbiBDYW1wYmVsbCA8aWNhbXBiZWxsQGFyY29tLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBQQ0E5NTY0IGFsZ29yaXRobSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuYwppbmRleCAzYjIwMDMzLi5lY2IyYzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuYworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2YuYwpAQCAtNDg2LDE1ICs0ODYsNyBAQAogCiAJcmV0dXJuIHJ2YWw7CiB9Ci0KLQotaW50IGkyY19wY2ZfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JcmV0dXJuIGkyY19kZWxfYWRhcHRlcihhZGFwKTsKLX0KLQogRVhQT1JUX1NZTUJPTChpMmNfcGNmX2FkZF9idXMpOwotRVhQT1JUX1NZTUJPTChpMmNfcGNmX2RlbF9idXMpOwogCiBNT0RVTEVfQVVUSE9SKCJIYW5zIEJlcmdsdW5kIDxoYkBzcGFjZXRlYy5ubz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBQQ0Y4NTg0IGFsZ29yaXRobSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tc2dpLmMgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zZ2kuYwppbmRleCA0OTBkOTk5Li5hYzJkNTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zZ2kuYworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zZ2kuYwpAQCAtMTcxLDE1ICsxNzEsNyBAQAogCiAJcmV0dXJuIGkyY19hZGRfYWRhcHRlcihhZGFwKTsKIH0KLQotCi1pbnQgaTJjX3NnaV9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlyZXR1cm4gaTJjX2RlbF9hZGFwdGVyKGFkYXApOwotfQotCiBFWFBPUlRfU1lNQk9MKGkyY19zZ2lfYWRkX2J1cyk7Ci1FWFBPUlRfU1lNQk9MKGkyY19zZ2lfZGVsX2J1cyk7CiAKIE1PRFVMRV9BVVRIT1IoIkxhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBTR0kgYWxnb3JpdGhtIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCmluZGV4IDUxMDgxNmMuLmUxOTg5ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCkBAIC03NCw2ICs3NCwxMyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWFtZDgxMTEuCiAKK2NvbmZpZyBJMkNfQVQ5MQorCXRyaXN0YXRlICJBdG1lbCBBVDkxIEkyQyBUd28tV2lyZSBpbnRlcmZhY2UgKFRXSSkiCisJZGVwZW5kcyBvbiBJMkMgJiYgQVJDSF9BVDkxICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgc3VwcG9ydHMgdGhlIHVzZSBvZiB0aGUgSTJDIGludGVyZmFjZSBvbiBBdG1lbCBBVDkxCisJICBwcm9jZXNzb3JzLgorCiBjb25maWcgSTJDX0FVMTU1MAogCXRyaXN0YXRlICJBdTE1NTAvQXUxMjAwIFNNQnVzIGludGVyZmFjZSIKIAlkZXBlbmRzIG9uIEkyQyAmJiAoU09DX0FVMTU1MCB8fCBTT0NfQVUxMjAwKQpAQCAtMTI1LDYgKzEzMiw3IEBACiAJICAgIElDSDcKIAkgICAgRVNCMgogCSAgICBJQ0g4CisJICAgIElDSDkKIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWk4MDEuCkBAIC0xOTUsMTEgKzIwMywxMSBAQAogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWlibV9paWMuCiAKIGNvbmZpZyBJMkNfSU9QM1hYCi0JdHJpc3RhdGUgIkludGVsIElPUDN4eCBhbmQgSVhQNHh4IG9uLWNoaXAgSTJDIGludGVyZmFjZSIKLQlkZXBlbmRzIG9uIChBUkNIX0lPUDMyWCB8fCBBUkNIX0lPUDMzWCB8fCBBUkNIX0lYUDRYWCkgJiYgSTJDCisJdHJpc3RhdGUgIkludGVsIElPUHgzeHggYW5kIElYUDR4eCBvbi1jaGlwIEkyQyBpbnRlcmZhY2UiCisJZGVwZW5kcyBvbiAoQVJDSF9JT1AzMlggfHwgQVJDSF9JT1AzM1ggfHwgQVJDSF9JWFA0WFggfHwgQVJDSF9JT1AxM1hYKSAmJiBJMkMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgSUlDIGJ1cyBjb250cm9sbGVyIG9uCi0JICB0aGUgSW50ZWwgSU9QM3h4IEkvTyBQcm9jZXNzb3JzIG9yIElYUDR4eCBOZXR3b3JrIFByb2Nlc3NvcnMuCisJICB0aGUgSW50ZWwgSU9QeDN4eCBJL08gUHJvY2Vzc29ycyBvciBJWFA0eHggTmV0d29yayBQcm9jZXNzb3JzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtaW9wM3h4LgpAQCAtMjA4LDE4ICsyMTYsNiBAQAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJMkMKIAotY29uZmlnIEkyQ19JVEUKLQl0cmlzdGF0ZSAiSVRFIEkyQyBBZGFwdGVyIgotCWRlcGVuZHMgb24gSTJDICYmIE1JUFNfSVRFODE3MgotCXNlbGVjdCBJMkNfQUxHT0lURQotCWhlbHAKLQkgIFRoaXMgc3VwcG9ydHMgdGhlIElURTgxNzIgSTJDIHBlcmlwaGVyYWwgZm91bmQgb24gc29tZSBNSVBTCi0JICBzeXN0ZW1zLiBTYXkgWSBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2UuIFlvdSBzaG91bGQgYWxzbyBzYXkgWSBmb3IKLQkgIHRoZSBJVEUgSTJDIGRyaXZlciBhbGdvcml0aG0gc3VwcG9ydCBhYm92ZS4KLQotCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUgCi0JICB3aWxsIGJlIGNhbGxlZCBpMmMtaXRlLgotCiBjb25maWcgSTJDX0lYUDRYWAogCXRyaXN0YXRlICJJWFA0eHggR1BJTy1CYXNlZCBJMkMgSW50ZXJmYWNlIgogCWRlcGVuZHMgb24gSTJDICYmIEFSQ0hfSVhQNFhYCkBAIC00ODAsNiArNDc2LDE3IEBACiAKIAkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgZGVmaW5pdGVseSBzYXkgTi4KIAorY29uZmlnIEkyQ19WRVJTQVRJTEUKKwl0cmlzdGF0ZSAiQVJNIFZlcnNhdGlsZS9SZWFsdmlldyBJMkMgYnVzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgKEFSQ0hfVkVSU0FUSUxFIHx8IEFSQ0hfUkVBTFZJRVcpCisJc2VsZWN0IEkyQ19BTEdPQklUCisJaGVscAorCSAgU2F5IHllcyBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoZSBJMkMgc2VyaWFsIGJ1cyBvbiBBUk1zIFZlcnNhdGlsZQorCSAgcmFuZ2Ugb2YgcGxhdGZvcm1zLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtdmVyc2F0aWxlLgorCiBjb25maWcgSTJDX1ZJQQogCXRyaXN0YXRlICJWSUEgODJDNTg2QiIKIAlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCkBAIC01NDcsNCArNTU0LDIzIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtbXY2NHh4eC4KIAorY29uZmlnIEkyQ19QTlgKKwl0cmlzdGF0ZSAiSTJDIGJ1cyBzdXBwb3J0IGZvciBQaGlsaXBzIFBOWCB0YXJnZXRzIgorCWRlcGVuZHMgb24gQVJDSF9QTlg0MDA4ICYmIEkyQworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBQaGlsaXBzIElQMzIwNCBJMkMgSVAgYmxvY2sgbWFzdGVyIGFuZC9vcgorCSAgc2xhdmUgY29udHJvbGxlcgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpMmMtcG54LgorCitjb25maWcgSTJDX1BOWF9FQVJMWQorCWJvb2wgIkVhcmx5IGluaXRpYWxpemF0aW9uIGZvciBJMkMgb24gUE5YeHh4eCIKKwlkZXBlbmRzIG9uIEkyQ19QTlg9eQorCWhlbHAKKwkgIFVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyBvbmUgbWF5IG5lZWQgdG8gbWFrZSBzdXJlIEkyQyBvbiBQTlh4eHh4CisJICBpcyBpbml0aWFsaXplZCBlYXJsaWVyIHRoYW4gc29tZSBvdGhlciBkcml2ZXIgdGhhdCBkZXBlbmRzIG9uIGl0CisJICAoZm9yIGluc3RhbmNlLCB0aGF0IG1pZ2h0IGJlIFVTQiBpbiBjYXNlIG9mIFBOWDQwMDgpLiBXaXRoIHRoaXMKKwkgIG9wdGlvbiB0dXJuZWQgb24geW91IGNhbiBndWFyYW50ZWUgdGhhdC4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCmluZGV4IDQ5M2M4NzIuLjM3MTk2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKQEAgLTgsNiArOCw3IEBACiBvYmotJChDT05GSUdfSTJDX0FNRDc1NikJKz0gaTJjLWFtZDc1Ni5vCiBvYmotJChDT05GSUdfSTJDX0FNRDc1Nl9TNDg4MikJKz0gaTJjLWFtZDc1Ni1zNDg4Mi5vCiBvYmotJChDT05GSUdfSTJDX0FNRDgxMTEpCSs9IGkyYy1hbWQ4MTExLm8KK29iai0kKENPTkZJR19JMkNfQVQ5MSkJCSs9IGkyYy1hdDkxLm8KIG9iai0kKENPTkZJR19JMkNfQVUxNTUwKQkrPSBpMmMtYXUxNTUwLm8KIG9iai0kKENPTkZJR19JMkNfRUxFS1RPUikJKz0gaTJjLWVsZWt0b3Iubwogb2JqLSQoQ09ORklHX0kyQ19IWURSQSkJCSs9IGkyYy1oeWRyYS5vCkBAIC0xNiw3ICsxNyw2IEBACiBvYmotJChDT05GSUdfSTJDX0lCTV9JSUMpCSs9IGkyYy1pYm1faWljLm8KIG9iai0kKENPTkZJR19JMkNfSU9QM1hYKQkrPSBpMmMtaW9wM3h4Lm8KIG9iai0kKENPTkZJR19JMkNfSVNBKQkJKz0gaTJjLWlzYS5vCi1vYmotJChDT05GSUdfSTJDX0lURSkJCSs9IGkyYy1pdGUubwogb2JqLSQoQ09ORklHX0kyQ19JWFAyMDAwKQkrPSBpMmMtaXhwMjAwMC5vCiBvYmotJChDT05GSUdfSTJDX0lYUDRYWCkJKz0gaTJjLWl4cDR4eC5vCiBvYmotJChDT05GSUdfSTJDX1BPV0VSTUFDKQkrPSBpMmMtcG93ZXJtYWMubwpAQCAtMjksNiArMjksNyBAQAogb2JqLSQoQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUKQkrPSBpMmMtcGFycG9ydC1saWdodC5vCiBvYmotJChDT05GSUdfSTJDX1BDQV9JU0EpCSs9IGkyYy1wY2EtaXNhLm8KIG9iai0kKENPTkZJR19JMkNfUElJWDQpCQkrPSBpMmMtcGlpeDQubworb2JqLSQoQ09ORklHX0kyQ19QTlgpCQkrPSBpMmMtcG54Lm8KIG9iai0kKENPTkZJR19JMkNfUFJPU0FWQUdFKQkrPSBpMmMtcHJvc2F2YWdlLm8KIG9iai0kKENPTkZJR19JMkNfUFhBKQkJKz0gaTJjLXB4YS5vCiBvYmotJChDT05GSUdfSTJDX1JQWExJVEUpCSs9IGkyYy1ycHgubwpAQCAtMzksNiArNDAsNyBAQAogb2JqLSQoQ09ORklHX0kyQ19TSVM2MzApCSs9IGkyYy1zaXM2MzAubwogb2JqLSQoQ09ORklHX0kyQ19TSVM5NlgpCSs9IGkyYy1zaXM5Nngubwogb2JqLSQoQ09ORklHX0kyQ19TVFVCKQkJKz0gaTJjLXN0dWIubworb2JqLSQoQ09ORklHX0kyQ19WRVJTQVRJTEUpCSs9IGkyYy12ZXJzYXRpbGUubwogb2JqLSQoQ09ORklHX0kyQ19WSUEpCQkrPSBpMmMtdmlhLm8KIG9iai0kKENPTkZJR19JMkNfVklBUFJPKQkrPSBpMmMtdmlhcHJvLm8KIG9iai0kKENPTkZJR19JMkNfVk9PRE9PMykJKz0gaTJjLXZvb2RvbzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNTYzLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMuYwppbmRleCAzM2ZiYjQ3Li44ZTFlM2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMuYwpAQCAtMiw3ICsyLDcgQEAKICAqCWkyYy1hbGkxNTYzLmMgLSBpMmMgZHJpdmVyIGZvciB0aGUgQUxpIDE1NjMgU291dGhicmlkZ2UKICAqCiAgKglDb3B5cmlnaHQgKEMpIDIwMDQgUGF0cmljayBNb2NoZWwKLSAqCQkgICAgICAyMDA1IFJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PgorICoJCSAgICAgIDIwMDUgUnVkb2xmIE1hcmVrIDxyLm1hcmVrQGFzc2VtYmxlci5jej4KICAqCiAgKglUaGUgMTU2MyBzb3V0aGJyaWRnZSBpcyBkZWNlcHRpdmVseSBzaW1pbGFyIHRvIHRoZSAxNTMzLCB3aXRoIGEKICAqCWZldyBub3RhYmxlIGV4Y2VwdGlvbnMuIE9uZSBvZiB0aG9zZSBoYXBwZW5zIHRvIGJlIHRoZSBmYWN0IHRoZXkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXQ5MS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmOTFiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXQ5MS5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICAgIGkyYyBTdXBwb3J0IGZvciBBdG1lbCdzIEFUOTEgVHdvLVdpcmUgSW50ZXJmYWNlIChUV0kpCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgUmljayBCcm9uc29uCisgICAgQ29udmVydGVkIHRvIDIuNiBieSBBbmRyZXcgVmljdG9yIDxhbmRyZXdAc2FucGVvcGxlLmNvbT4KKworICAgIEJvcnJvd2VkIGhlYXZpbHkgZnJvbSBvcmlnaW5hbCB3b3JrIGJ5OgorICAgIENvcHlyaWdodCAoQykgMjAwMCBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQHN0aW1weS5uZXRyb2VkZ2UuY29tPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfdHdpLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKworI2RlZmluZSBUV0lfQ0xPQ0sJCTEwMDAwMAkJLyogSHouIG1heCA0MDAgS2JpdHMvc2VjICovCisKKworc3RhdGljIHN0cnVjdCBjbGsgKnR3aV9jbGs7CitzdGF0aWMgdm9pZCBfX2lvbWVtICp0d2lfYmFzZTsKKworI2RlZmluZSBhdDkxX3R3aV9yZWFkKHJlZykJCV9fcmF3X3JlYWRsKHR3aV9iYXNlICsgKHJlZykpCisjZGVmaW5lIGF0OTFfdHdpX3dyaXRlKHJlZywgdmFsKQlfX3Jhd193cml0ZWwoKHZhbCksIHR3aV9iYXNlICsgKHJlZykpCisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFRXSSBoYXJkd2FyZSByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdDkxX3R3aV9od2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNkaXYsIGNrZGl2OworCisJYXQ5MV90d2lfd3JpdGUoQVQ5MV9UV0lfSURSLCAweGZmZmZmZmZmKTsJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWF0OTFfdHdpX3dyaXRlKEFUOTFfVFdJX0NSLCBBVDkxX1RXSV9TV1JTVCk7CS8qIFJlc2V0IHBlcmlwaGVyYWwgKi8KKwlhdDkxX3R3aV93cml0ZShBVDkxX1RXSV9DUiwgQVQ5MV9UV0lfTVNFTik7CS8qIFNldCBNYXN0ZXIgbW9kZSAqLworCisJLyogQ2FsY3VhdGUgY2xvY2sgZGl2aWRlcnMgKi8KKwljZGl2ID0gKGNsa19nZXRfcmF0ZSh0d2lfY2xrKSAvICgyICogVFdJX0NMT0NLKSkgLSAzOworCWNkaXYgPSBjZGl2ICsgMTsJLyogcm91bmQgdXAgKi8KKwlja2RpdiA9IDA7CisJd2hpbGUgKGNkaXYgPiAyNTUpIHsKKwkJY2tkaXYrKzsKKwkJY2RpdiA9IGNkaXYgPj4gMTsKKwl9CisKKwlpZiAoY3B1X2lzX2F0OTFybTkyMDAoKSkgewkJCS8qIEFUOTFSTTkyMDAgRXJyYXRhICMyMiAqLworCQlpZiAoY2tkaXYgPiA1KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkFUOTEgSTJDOiBJbnZhbGlkIFRXSV9DTE9DSyB2YWx1ZSFcbiIpOworCQkJY2tkaXYgPSA1OworCQl9CisJfQorCisJYXQ5MV90d2lfd3JpdGUoQVQ5MV9UV0lfQ1dHUiwgKGNrZGl2IDw8IDE2KSB8IChjZGl2IDw8IDgpIHwgY2Rpdik7Cit9CisKKy8qCisgKiBQb2xsIHRoZSBpMmMgc3RhdHVzIHJlZ2lzdGVyIHVudGlsIHRoZSBzcGVjaWZpZWQgYml0IGlzIHNldC4KKyAqIFJldHVybnMgMCBpZiB0aW1lZCBvdXQgKDEwMCBtc2VjKS4KKyAqLworc3RhdGljIHNob3J0IGF0OTFfcG9sbF9zdGF0dXModW5zaWduZWQgbG9uZyBiaXQpCit7CisJaW50IGxvb3BfY250ciA9IDEwMDAwOworCisJZG8geworCQl1ZGVsYXkoMTApOworCX0gd2hpbGUgKCEoYXQ5MV90d2lfcmVhZChBVDkxX1RXSV9TUikgJiBiaXQpICYmICgtLWxvb3BfY250ciA+IDApKTsKKworCXJldHVybiAobG9vcF9jbnRyID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgeGZlcl9yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQoreworCS8qIFNlbmQgU3RhcnQgKi8KKwlhdDkxX3R3aV93cml0ZShBVDkxX1RXSV9DUiwgQVQ5MV9UV0lfU1RBUlQpOworCisJLyogUmVhZCBkYXRhICovCisJd2hpbGUgKGxlbmd0aC0tKSB7CisJCWlmICghbGVuZ3RoKQkvKiBuZWVkIHRvIHNlbmQgU3RvcCBiZWZvcmUgcmVhZGluZyBsYXN0IGJ5dGUgKi8KKwkJCWF0OTFfdHdpX3dyaXRlKEFUOTFfVFdJX0NSLCBBVDkxX1RXSV9TVE9QKTsKKwkJaWYgKCFhdDkxX3BvbGxfc3RhdHVzKEFUOTFfVFdJX1JYUkRZKSkgeworCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiUlhSRFkgdGltZW91dFxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQkqYnVmKysgPSAoYXQ5MV90d2lfcmVhZChBVDkxX1RXSV9SSFIpICYgMHhmZik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGZlcl93cml0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKwkvKiBMb2FkIGZpcnN0IGJ5dGUgaW50byB0cmFuc21pdHRlciAqLworCWF0OTFfdHdpX3dyaXRlKEFUOTFfVFdJX1RIUiwgKmJ1ZisrKTsKKworCS8qIFNlbmQgU3RhcnQgKi8KKwlhdDkxX3R3aV93cml0ZShBVDkxX1RXSV9DUiwgQVQ5MV9UV0lfU1RBUlQpOworCisJZG8geworCQlpZiAoIWF0OTFfcG9sbF9zdGF0dXMoQVQ5MV9UV0lfVFhSRFkpKSB7CisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJUWFJEWSB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJbGVuZ3RoLS07CS8qIGJ5dGUgd2FzIHRyYW5zbWl0dGVkICovCisKKwkJaWYgKGxlbmd0aCA+IDApCQkvKiBtb3JlIGRhdGEgdG8gc2VuZD8gKi8KKwkJCWF0OTFfdHdpX3dyaXRlKEFUOTFfVFdJX1RIUiwgKmJ1ZisrKTsKKwl9IHdoaWxlIChsZW5ndGgpOworCisJLyogU2VuZCBTdG9wICovCisJYXQ5MV90d2lfd3JpdGUoQVQ5MV9UV0lfQ1IsIEFUOTFfVFdJX1NUT1ApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZW5lcmljIGkyYyBtYXN0ZXIgdHJhbnNmZXIgZW50cnlwb2ludC4KKyAqCisgKiBOb3RlOiBXZSBkbyBub3QgdXNlIEF0bWVsJ3MgZmVhdHVyZSBvZiBzdG9yaW5nIHRoZSAiaW50ZXJuYWwgZGV2aWNlIGFkZHJlc3MiLgorICogSW5zdGVhZCB0aGUgImludGVybmFsIGRldmljZSBhZGRyZXNzIiBoYXMgdG8gYmUgd3JpdHRlbiB1c2luZyBhIHNlcGVyYXRlCisgKiBpMmMgbWVzc2FnZS4KKyAqIGh0dHA6Ly9saXN0cy5hcm0ubGludXgub3JnLnVrL3BpcGVybWFpbC9saW51eC1hcm0ta2VybmVsLzIwMDQtU2VwdGVtYmVyLzAyNDQxMS5odG1sCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKnBtc2csIGludCBudW0pCit7CisJaW50IGksIHJldDsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgImF0OTFfeGZlcjogcHJvY2Vzc2luZyAlZCBtZXNzYWdlczpcbiIsIG51bSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiICMlZDogJXNpbmcgJWQgYnl0ZSVzICVzIDB4JTAyeFxuIiwgaSwKKwkJCXBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAicmVhZCIgOiAid3JpdCIsCisJCQlwbXNnLT5sZW4sIHBtc2ctPmxlbiA+IDEgPyAicyIgOiAiIiwKKwkJCXBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAiZnJvbSIgOiAidG8iLAlwbXNnLT5hZGRyKTsKKworCQlhdDkxX3R3aV93cml0ZShBVDkxX1RXSV9NTVIsIChwbXNnLT5hZGRyIDw8IDE2KQorCQkJfCAoKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpID8gQVQ5MV9UV0lfTVJFQUQgOiAwKSk7CisKKwkJaWYgKHBtc2ctPmxlbiAmJiBwbXNnLT5idWYpIHsJLyogc2FuaXR5IGNoZWNrICovCisJCQlpZiAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkKKwkJCQlyZXQgPSB4ZmVyX3JlYWQoYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4pOworCQkJZWxzZQorCQkJCXJldCA9IHhmZXJfd3JpdGUoYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4pOworCisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCS8qIFdhaXQgdW50aWwgdHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKwkJCWlmICghYXQ5MV9wb2xsX3N0YXR1cyhBVDkxX1RXSV9UWENPTVApKSB7CisJCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiVFhDT01QIHRpbWVvdXRcbiIpOworCQkJCXJldHVybiAtRVRJTUVET1VUOworCQkJfQorCQl9CisJCWRldl9kYmcoJmFkYXAtPmRldiwgInRyYW5zZmVyIGNvbXBsZXRlXG4iKTsKKwkJcG1zZysrOwkJLyogbmV4dCBtZXNzYWdlICovCisJfQorCXJldHVybiBpOworfQorCisvKgorICogUmV0dXJuIGxpc3Qgb2Ygc3VwcG9ydGVkIGZ1bmN0aW9uYWxpdHkuCisgKi8KK3N0YXRpYyB1MzIgYXQ5MV9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGF0OTFfYWxnb3JpdGhtID0geworCS5tYXN0ZXJfeGZlcgk9IGF0OTFfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQk9IGF0OTFfZnVuYywKK307CisKKy8qCisgKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0OTFfaTJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByYzsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxLCAiYXQ5MV9pMmMiKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXR3aV9iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlpZiAoIXR3aV9iYXNlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsMDsKKwl9CisKKwl0d2lfY2xrID0gY2xrX2dldChOVUxMLCAidHdpX2NsayIpOworCWlmIChJU19FUlIodHdpX2NsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gY2xvY2sgZGVmaW5lZFxuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlhZGFwdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19hZGFwdGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXB0ZXIgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBpbnRlZmFjZSFcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDI7CisJfQorCXNwcmludGYoYWRhcHRlci0+bmFtZSwgIkFUOTEiKTsKKwlhZGFwdGVyLT5hbGdvID0gJmF0OTFfYWxnb3JpdGhtOworCWFkYXB0ZXItPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOworCWFkYXB0ZXItPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWRhcHRlcik7CisKKwljbGtfZW5hYmxlKHR3aV9jbGspOwkJLyogZW5hYmxlIHBlcmlwaGVyYWwgY2xvY2sgKi8KKwlhdDkxX3R3aV9od2luaXQoKTsJCS8qIGluaXRpYWxpemUgVFdJIGNvbnRyb2xsZXIgKi8KKworCXJjID0gaTJjX2FkZF9hZGFwdGVyKGFkYXB0ZXIpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJBZGFwdGVyICVzIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsCisJCQkJYWRhcHRlci0+bmFtZSk7CisJCWdvdG8gZmFpbDM7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkFUOTEgaTJjIGJ1cyBkcml2ZXIuXG4iKTsKKwlyZXR1cm4gMDsKKworZmFpbDM6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoYWRhcHRlcik7CisJY2xrX2Rpc2FibGUodHdpX2Nsayk7CitmYWlsMjoKKwljbGtfcHV0KHR3aV9jbGspOworZmFpbDE6CisJaW91bm1hcCh0d2lfYmFzZSk7CitmYWlsMDoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGF0OTFfaTJjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByYzsKKworCXJjID0gaTJjX2RlbF9hZGFwdGVyKGFkYXB0ZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpb3VubWFwKHR3aV9iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisKKwljbGtfZGlzYWJsZSh0d2lfY2xrKTsJCS8qIGRpc2FibGUgcGVyaXBoZXJhbCBjbG9jayAqLworCWNsa19wdXQodHdpX2Nsayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyogTk9URTogY291bGQgc2F2ZSBhIGZldyBtQSBieSBrZWVwaW5nIGNsb2NrIG9mZiBvdXRzaWRlIG9mIGF0OTFfeGZlci4uLiAqLworCitzdGF0aWMgaW50IGF0OTFfaTJjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJY2xrX2Rpc2FibGUodHdpX2Nsayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MV9pMmNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGNsa19lbmFibGUodHdpX2Nsayk7Cit9CisKKyNlbHNlCisjZGVmaW5lIGF0OTFfaTJjX3N1c3BlbmQJTlVMTAorI2RlZmluZSBhdDkxX2kyY19yZXN1bWUJCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdDkxX2kyY19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGF0OTFfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXQ5MV9pMmNfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGF0OTFfaTJjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhdDkxX2kyY19yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImF0OTFfaTJjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0OTFfaTJjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdDkxX2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXQ5MV9pMmNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdDkxX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhdDkxX2kyY19pbml0KTsKK21vZHVsZV9leGl0KGF0OTFfaTJjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSaWNrIEJyb25zb24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIChUV0kpIGRyaXZlciBmb3IgQXRtZWwgQVQ5MSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lbGVrdG9yLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVsZWt0b3IuYwppbmRleCBhNTkxZmU2Li44MzQ5Njc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVsZWt0b3IuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVsZWt0b3IuYwpAQCAtMjkzLDcgKzI5Myw3IEBACiAKIHN0YXRpYyB2b2lkIGkyY19wY2Zpc2FfZXhpdCh2b2lkKQogewotCWkyY19wY2ZfZGVsX2J1cygmcGNmX2lzYV9vcHMpOworCWkyY19kZWxfYWRhcHRlcigmcGNmX2lzYV9vcHMpOwogCiAJaWYgKGlycSA+IDApIHsKIAkJZGlzYWJsZV9pcnEoaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaHlkcmEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaHlkcmEuYwppbmRleCA0NTdkNDhhLi45ODMyZjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWh5ZHJhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oeWRyYS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBoeWRyYV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlwZHJlZ3coaHlkcmFfYml0X2RhdGEuZGF0YSwgMCk7CQkvKiBjbGVhciBTQ0xLX09FIGFuZCBTREFUX09FICovCi0JaTJjX2JpdF9kZWxfYnVzKCZoeWRyYV9hZGFwKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJmh5ZHJhX2FkYXApOwogCWlvdW5tYXAoaHlkcmFfYml0X2RhdGEuZGF0YSk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApKwogCQkJICAgb2Zmc2V0b2Yoc3RydWN0IEh5ZHJhLCBDYWNoZVBEKSwgNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IGJiYjJmYmUuLmFlNjI1YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCkBAIC0zMyw2ICszMyw3IEBACiAgICAgSUNINwkJMjdEQQogICAgIEVTQjIJCTI2OUIKICAgICBJQ0g4CQkyODNFCisgICAgSUNIOQkJMjkzMAogICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHNldmVyYWwgdmVyc2lvbnMgb2YgSW50ZWwncyBJL08gQ29udHJvbGxlciBIdWJzIChJQ0gpLgogICAgIEZvciBTTUJ1cyBzdXBwb3J0LCB0aGV5IGFyZSBzaW1pbGFyIHRvIHRoZSBQSUlYNCBhbmQgYXJlIHBhcnQKICAgICBvZiBJbnRlbCdzICc4MTAnIGFuZCBvdGhlciBjaGlwc2V0cy4KQEAgLTQ1Nyw2ICs0NTgsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMTcpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCMl8xNykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzUpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV82KSB9LAogCXsgMCwgfQogfTsKIApAQCAtNDY4LDEyICs0NzAsMjAgQEAKIAlpbnQgZXJyOwogCiAJSTgwMV9kZXYgPSBkZXY7Ci0JaWYgKChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMykgfHwKLQkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl8zKSB8fAotCSAgICAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfNCkpCisJc3dpdGNoIChkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzQ6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMTY6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMTc6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQjJfMTc6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNToKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV82OgogCQlpc2ljaDQgPSAxOwotCWVsc2UKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJaXNpY2g0ID0gMDsKKwl9CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODEwLmMKaW5kZXggYjY2ZmI2Yi4uMTBjOThiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODEwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODEwLmMKQEAgLTIxOSwxNCArMjE5LDE0IEBACiAJCXJldHVybiByZXR2YWw7CiAJcmV0dmFsID0gaTJjX2JpdF9hZGRfYnVzKCZpODEwX2RkY19hZGFwdGVyKTsKIAlpZiAocmV0dmFsKQotCQlpMmNfYml0X2RlbF9idXMoJmk4MTBfaTJjX2FkYXB0ZXIpOworCQlpMmNfZGVsX2FkYXB0ZXIoJmk4MTBfaTJjX2FkYXB0ZXIpOwogCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpODEwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWkyY19iaXRfZGVsX2J1cygmaTgxMF9kZGNfYWRhcHRlcik7Ci0JaTJjX2JpdF9kZWxfYnVzKCZpODEwX2kyY19hZGFwdGVyKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJmk4MTBfZGRjX2FkYXB0ZXIpOworCWkyY19kZWxfYWRhcHRlcigmaTgxMF9pMmNfYWRhcHRlcik7CiAJaW91bm1hcChpb2FkZHIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaWJtX2lpYy5jCmluZGV4IDc4MWE5OWMuLjE4OThlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaWJtX2lpYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaWJtX2lpYy5jCkBAIC02ODAsNiArNjgwLDEyIEBACiAJZGV2LT5pZHggPSBvY3AtPmRlZi0+aW5kZXg7CiAJb2NwX3NldF9kcnZkYXRhKG9jcCwgZGV2KTsKIAkKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihvY3AtPmRlZi0+cGFkZHIsIHNpemVvZihzdHJ1Y3QgaWljX3JlZ3MpLAorCQkJCSJpYm1faWljIikpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGZhaWwxOworCX0KKwogCWlmICghKGRldi0+dmFkZHIgPSBpb3JlbWFwKG9jcC0+ZGVmLT5wYWRkciwgc2l6ZW9mKHN0cnVjdCBpaWNfcmVncykpKSl7CiAJCXByaW50ayhLRVJOX0NSSVQgImlibS1paWMlZDogZmFpbGVkIHRvIGlvcmVtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIiwKIAkJCWRldi0+aWR4KTsKQEAgLTc1MCw2ICs3NTYsOCBAQAogCiAJaW91bm1hcChkZXYtPnZhZGRyKTsKIGZhaWwyOgkKKwlyZWxlYXNlX21lbV9yZWdpb24ob2NwLT5kZWYtPnBhZGRyLCBzaXplb2Yoc3RydWN0IGlpY19yZWdzKSk7CitmYWlsMToKIAlvY3Bfc2V0X2RydmRhdGEob2NwLCBOVUxMKTsKIAlrZnJlZShkZXYpOwkKIAlyZXR1cm4gcmV0OwpAQCAtNzc3LDYgKzc4NSw3IEBACiAJCSAgICBmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAkJfQogCQlpb3VubWFwKGRldi0+dmFkZHIpOworCQlyZWxlYXNlX21lbV9yZWdpb24ob2NwLT5kZWYtPnBhZGRyLCBzaXplb2Yoc3RydWN0IGlpY19yZWdzKSk7CiAJCWtmcmVlKGRldik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2EuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNhLmMKaW5kZXggNDM4MDY1My4uOGVkNTlhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2EuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzYS5jCkBAIC05MSw3ICs5MSw3IEBACiAJLyogTm93IGxvb2sgZm9yIGNsaWVudHMgKi8KIAlyZXMgPSBkcml2ZXItPmF0dGFjaF9hZGFwdGVyKCZpc2FfYWRhcHRlcik7CiAJaWYgKHJlcykgewotCQlkZXZfZXJyKCZpc2FfYWRhcHRlci5kZXYsCisJCWRldl9kYmcoJmlzYV9hZGFwdGVyLmRldiwKIAkJCSJEcml2ZXIgJXMgZmFpbGVkIHRvIGF0dGFjaCBhZGFwdGVyLCB1bnJlZ2lzdGVyaW5nXG4iLAogCQkJZHJpdmVyLT5kcml2ZXIubmFtZSk7CiAJCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl0ZS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkNzE4Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBpMmMtYWRhcC1pdGUuYyBpMmMtaHcgYWNjZXNzIGZvciB0aGUgSUlDIHBlcmlwaGVyYWwgb24gdGhlIElURSBNSVBTIHN5c3RlbQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgSGFpLVBhbyBGYW4sIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAgIGhwZmFuQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KLQotICAgQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIFRoaXMgZmlsZSB3YXMgaGlnaGx5IGxldmVyYWdlZCBmcm9tIGkyYy1lbGVrdG9yLmMsIHdoaWNoIHdhcyBjcmVhdGVkCi0gICBieSBTaW1vbiBHLiBWb2dsIGFuZCBIYW5zIEJlcmdsdW5kOgotCi0gCi0gICAgIENvcHlyaWdodCAoQykgMTk5NS05NyBTaW1vbiBHLiBWb2dsCi0gICAgICAgICAgICAgICAgICAgMTk5OC05OSBIYW5zIEJlcmdsdW5kCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4JCSAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogV2l0aCBzb21lIGNoYW5nZXMgZnJvbSBLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kIGV2ZW4KLSAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLWFsZ28taXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLWFkYXAtaXRlLmg+Ci0jaW5jbHVkZSAiLi4vaTJjLWl0ZS5oIgotCi0jZGVmaW5lIERFRkFVTFRfQkFTRSAgMHgxNDAxNDAzMAotI2RlZmluZSBJVEVfSUlDX0lPX1NJWkUJMHg0MAotI2RlZmluZSBERUZBVUxUX0lSUSAgIDAKLSNkZWZpbmUgREVGQVVMVF9DTE9DSyAweDFiMGUJLyogZGVmYXVsdCAxNk1Iei8oMjcrMTQpID0gNDAwS0h6ICovCi0jZGVmaW5lIERFRkFVTFRfT1dOICAgMHg1NQotCi1zdGF0aWMgaW50IGJhc2U7Ci1zdGF0aWMgaW50IGlycTsKLXN0YXRpYyBpbnQgY2xvY2s7Ci1zdGF0aWMgaW50IG93bjsKLQotc3RhdGljIHN0cnVjdCBpaWNfaXRlIGdwaTsKLXN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBpaWNfd2FpdDsKLXN0YXRpYyBpbnQgaWljX3BlbmRpbmc7Ci1zdGF0aWMgc3BpbmxvY2tfdCBsb2NrOwotCi0vKiAtLS0tLSBsb2NhbCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwotCi1zdGF0aWMgdm9pZCBpaWNfaXRlX3NldGlpYyh2b2lkICpkYXRhLCBpbnQgY3RsLCBzaG9ydCB2YWwpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaiA9IGppZmZpZXMgKyAxMDsKLQotCXByX2RlYnVnKCIgV3JpdGUgMHglMDJ4IHRvIDB4JXhcbiIsKHVuc2lnbmVkIHNob3J0KXZhbCwgY3RsJjB4ZmYpOwotI2lmZGVmIERFQlVHCi0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGopKQotCQlzY2hlZHVsZSgpOwotI2VuZGlmCi0Jb3V0dyh2YWwsY3RsKTsKLX0KLQotc3RhdGljIHNob3J0IGlpY19pdGVfZ2V0aWljKHZvaWQgKmRhdGEsIGludCBjdGwpCi17Ci0Jc2hvcnQgdmFsOwotCi0JdmFsID0gaW53KGN0bCk7Ci0JcHJfZGVidWcoIlJlYWQgMHglMDJ4IGZyb20gMHgleFxuIiwodW5zaWduZWQgc2hvcnQpdmFsLCBjdGwmMHhmZik7Ci0JcmV0dXJuICh2YWwpOwotfQotCi0vKiBSZXR1cm4gb3VyIHNsYXZlIGFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzCi0gKiBwdXQgb24gdGhlIEkyQyBidXMgd2hlbiBhbm90aGVyIG1hc3RlciBvbiB0aGUgYnVzIHdhbnRzIHRvIGFkZHJlc3MgdXMKLSAqIGFzIGEgc2xhdmUKLSAqLwotc3RhdGljIGludCBpaWNfaXRlX2dldG93bih2b2lkICpkYXRhKQotewotCXJldHVybiAoZ3BpLmlpY19vd24pOwotfQotCi0KLXN0YXRpYyBpbnQgaWljX2l0ZV9nZXRjbG9jayh2b2lkICpkYXRhKQotewotCXJldHVybiAoZ3BpLmlpY19jbG9jayk7Ci19Ci0KLQotLyogUHV0IHRoaXMgcHJvY2VzcyB0byBzbGVlcC4gIFdlIHdpbGwgd2FrZSB1cCB3aGVuIHRoZQotICogSUlDIGNvbnRyb2xsZXIgaW50ZXJydXB0cy4KLSAqLwotc3RhdGljIHZvaWQgaWljX2l0ZV93YWl0Zm9ycGluKHZvaWQpIHsKLSAgIERFRklORV9XQUlUKHdhaXQpOwotICAgaW50IHRpbWVvdXQgPSAyOwotICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgLyogSWYgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCAod2hpY2ggdGhleSBhcmUpLCB0aGVuIHB1dCB0aGUgcHJvY2VzcyB0bwotICAgICogc2xlZXAuICBUaGlzIHByb2Nlc3Mgd2lsbCBiZSBhd2FrZW5lZCBieSB0d28gZXZlbnRzIC0tIGVpdGhlciB0aGUKLSAgICAqIHRoZSBJSUMgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuIAotICAgICogSWYgaW50ZXJydXB0cyBhcmUgbm90IGVuYWJsZWQgdGhlbiBkZWxheSBmb3IgYSByZWFzb25hYmxlIGFtb3VudCAKLSAgICAqIG9mIHRpbWUgYW5kIHJldHVybi4KLSAgICAqLwotICAgaWYgKGdwaS5paWNfaXJxID4gMCkgewotCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7Ci0JaWYgKGlpY19wZW5kaW5nID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOwotCQlwcmVwYXJlX3RvX3dhaXQoJmlpY193YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCpIWikpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7Ci0JCQlpZiAoaWljX3BlbmRpbmcgPT0gMSkgewotCQkJCWlpY19wZW5kaW5nID0gMDsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKLQkJfQotCQlmaW5pc2hfd2FpdCgmaWljX3dhaXQsICZ3YWl0KTsKLQl9IGVsc2UgewotCQlpaWNfcGVuZGluZyA9IDA7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKLQl9Ci0gICB9IGVsc2UgewotICAgICAgdWRlbGF5KDEwMCk7Ci0gICB9Ci19Ci0KLQotc3RhdGljIGlycXJldHVybl90IGlpY19pdGVfaGFuZGxlcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzcGluX2xvY2soJmxvY2spOwotCWlpY19wZW5kaW5nID0gMTsKLQlzcGluX3VubG9jaygmbG9jayk7Ci0KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlpY193YWl0KTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi0vKiBMb2NrIHRoZSByZWdpb24gb2YgbWVtb3J5IHdoZXJlIEkvTyByZWdpc3RlcnMgZXhpc3QuICBSZXF1ZXN0IG91cgotICogaW50ZXJydXB0IGxpbmUgYW5kIHJlZ2lzdGVyIGl0cyBhc3NvY2lhdGVkIGhhbmRsZXIuCi0gKi8KLXN0YXRpYyBpbnQgaWljX2h3X3Jlc3JjX2luaXQodm9pZCkKLXsKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGdwaS5paWNfYmFzZSwgSVRFX0lJQ19JT19TSVpFLCAiaTJjIikpCi0JCXJldHVybiAtRU5PREVWOwotICAKLQlpZiAoZ3BpLmlpY19pcnEgPD0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocmVxdWVzdF9pcnEoZ3BpLmlpY19pcnEsIGlpY19pdGVfaGFuZGxlciwgMCwgIklURSBJSUMiLCAwKSA8IDApCi0JCWdwaS5paWNfaXJxID0gMDsKLQllbHNlCi0JCWVuYWJsZV9pcnEoZ3BpLmlpY19pcnEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgaWljX2l0ZV9yZWxlYXNlKHZvaWQpCi17Ci0JaWYgKGdwaS5paWNfaXJxID4gMCkgewotCQlkaXNhYmxlX2lycShncGkuaWljX2lycSk7Ci0JCWZyZWVfaXJxKGdwaS5paWNfaXJxLCAwKTsKLQl9Ci0JcmVsZWFzZV9yZWdpb24oZ3BpLmlpY19iYXNlICwgMik7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRW5jYXBzdWxhdGUgdGhlIGFib3ZlIGZ1bmN0aW9ucyBpbiB0aGUgY29ycmVjdCBvcGVyYXRpb25zIHN0cnVjdHVyZS4KLSAqIFRoaXMgaXMgb25seSBkb25lIHdoZW4gbW9yZSB0aGFuIG9uZSBoYXJkd2FyZSBhZGFwdGVyIGlzIHN1cHBvcnRlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSBpaWNfaXRlX2RhdGEgPSB7Ci0JTlVMTCwKLQlpaWNfaXRlX3NldGlpYywKLQlpaWNfaXRlX2dldGlpYywKLQlpaWNfaXRlX2dldG93biwKLQlpaWNfaXRlX2dldGNsb2NrLAotCWlpY19pdGVfd2FpdGZvcnBpbiwKLQk4MCwgODAsIDEwMCwJCS8qCXdhaXRzLCB0aW1lb3V0ICovCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGlpY19pdGVfb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkuaWQJCT0gSTJDX0hXX0lfSUlDLAotCS5hbGdvX2RhdGEJPSAmaWljX2l0ZV9kYXRhLAotCS5uYW1lCQk9ICJJVEUgSUlDIGFkYXB0ZXIiLAotfTsKLQotLyogQ2FsbGVkIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQuICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUKLSAqIGNhc2NhZGUgb2YgY2FsbHMgdXAgdGhyb3VnaCB0aGUgaGllcmFyY2h5IG9mIGkyYyBtb2R1bGVzIChpLmUuIHVwIHRvIHRoZQotICogIGFsZ29yaXRobSBsYXllciBhbmQgaW50byB0byB0aGUgY29yZSBsYXllcikKLSAqLwotc3RhdGljIGludCBfX2luaXQgaWljX2l0ZV9pbml0KHZvaWQpIAotewotCi0Jc3RydWN0IGlpY19pdGUgKnBpaWMgPSAmZ3BpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6ZSBJVEUgSUlDIGFkYXB0ZXIgbW9kdWxlXG4iKTsKLQlpZiAoYmFzZSA9PSAwKQotCQlwaWljLT5paWNfYmFzZSA9IERFRkFVTFRfQkFTRTsKLQllbHNlCi0JCXBpaWMtPmlpY19iYXNlID0gYmFzZTsKLQotCWlmIChpcnEgPT0gMCkKLQkJcGlpYy0+aWljX2lycSA9IERFRkFVTFRfSVJROwotCWVsc2UKLQkJcGlpYy0+aWljX2lycSA9IGlycTsKLQotCWlmIChjbG9jayA9PSAwKQotCQlwaWljLT5paWNfY2xvY2sgPSBERUZBVUxUX0NMT0NLOwotCWVsc2UKLQkJcGlpYy0+aWljX2Nsb2NrID0gY2xvY2s7Ci0KLQlpZiAob3duID09IDApCi0JCXBpaWMtPmlpY19vd24gPSBERUZBVUxUX09XTjsKLQllbHNlCi0JCXBpaWMtPmlpY19vd24gPSBvd247Ci0KLQlpaWNfaXRlX2RhdGEuZGF0YSA9ICh2b2lkICopcGlpYzsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpaWNfd2FpdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmxvY2spOwotCWlmIChpaWNfaHdfcmVzcmNfaW5pdCgpID09IDApIHsKLQkJaWYgKGkyY19paWNfYWRkX2J1cygmaWljX2l0ZV9vcHMpIDwgMCkKLQkJCXJldHVybiAtRU5PREVWOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlwcmludGsoS0VSTl9JTkZPICIgZm91bmQgZGV2aWNlIGF0ICUjeCBpcnEgJWQuXG4iLCAKLQkJcGlpYy0+aWljX2Jhc2UsIHBpaWMtPmlpY19pcnEpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGlpY19pdGVfZXhpdCh2b2lkKQotewotCWkyY19paWNfZGVsX2J1cygmaWljX2l0ZV9vcHMpOwotICAgICAgICBpaWNfaXRlX3JlbGVhc2UoKTsKLX0KLQotLyogSWYgbW9kdWxlcyBpcyBOT1QgZGVmaW5lZCB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZCwgdGhlbiB0aGUgTU9EVUxFXyoKLSAqIG1hY3JvcyB3aWxsIHJlc29sdmUgdG8gbm90aGluZwotICovCi1NT0RVTEVfQVVUSE9SKCJNb250YVZpc3RhIFNvZnR3YXJlIDx3d3cubXZpc3RhLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBhZGFwdGVyIHJvdXRpbmVzIGZvciBJVEUgSUlDIGJ1cyBhZGFwdGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLW1vZHVsZV9wYXJhbShiYXNlLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShjbG9jaywgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShvd24sIGludCwgMCk7Ci0KLQotLyogQ2FsbGVkIHdoZW4gbW9kdWxlIGlzIGxvYWRlZCBvciB3aGVuIGtlcm5lbCBpcyBpbml0aWFsaXplZC4KLSAqIElmIE1PRFVMRVMgaXMgZGVmaW5lZCB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwKLSAqIHJlc29sdmUgdG8gaW5pdF9tb2R1bGUgKHRoZSBmdW5jdGlvbiBjYWxsZWQgd2hlbiBpbnNtb2QgaXMgaW52b2tlZCBmb3IgYQotICogbW9kdWxlKS4gIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZWFybHkgaW4gdGhlIGJvb3QsIHdoZW4gdGhlCi0gKiBrZXJuZWwgaXMgaW50aWFsaXplZC4gIENoZWNrIG91dCAvaW5jbHVkZS9pbml0LmggdG8gc2VlIGhvdyB0aGlzIHdvcmtzLgotICovCi1tb2R1bGVfaW5pdChpaWNfaXRlX2luaXQpOwotCi0vKiBSZXNvbHZlcyB0byBtb2R1bGVfY2xlYW51cCB3aGVuIE1PRFVMRVMgaXMgZGVmaW5lZC4gKi8KLW1vZHVsZV9leGl0KGlpY19pdGVfZXhpdCk7IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYwppbmRleCBkZDNmNGNkLi5lZmEzZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYwpAQCAtOTAsNyArOTAsNyBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdF9kZXYsIE5VTEwpOwogCi0JaTJjX2JpdF9kZWxfYnVzKCZkcnZfZGF0YS0+YWRhcHRlcik7CisJaTJjX2RlbF9hZGFwdGVyKCZkcnZfZGF0YS0+YWRhcHRlcik7CiAKIAlrZnJlZShkcnZfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXhwNHh4LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDR4eC5jCmluZGV4IDFjZTAxZmIuLjA4ZTg5YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXhwNHh4LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHA0eHguYwpAQCAtOTEsNyArOTEsNyBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdF9kZXYsIE5VTEwpOwogCi0JaTJjX2JpdF9kZWxfYnVzKCZkcnZfZGF0YS0+YWRhcHRlcik7CisJaTJjX2RlbF9hZGFwdGVyKCZkcnZfZGF0YS0+YWRhcHRlcik7CiAKIAlrZnJlZShkcnZfZGF0YSk7CiAKQEAgLTEzNyw3ICsxMzcsOCBAQAogCWdwaW9fbGluZV9zZXQoZ3Bpby0+c2NsX3BpbiwgMCk7CiAJZ3Bpb19saW5lX3NldChncGlvLT5zZGFfcGluLCAwKTsKIAotCWlmICgoZXJyID0gaTJjX2JpdF9hZGRfYnVzKCZkcnZfZGF0YS0+YWRhcHRlcikgIT0gMCkpIHsKKwllcnIgPSBpMmNfYml0X2FkZF9idXMoJmRydl9kYXRhLT5hZGFwdGVyKTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IENvdWxkIG5vdCBpbnN0YWxsICVzXG4iLCBwbGF0X2Rldi0+ZGV2LmJ1c19pZCk7CiAKIAkJa2ZyZWUoZHJ2X2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwppbmRleCBlMDI5MmU0Li5hZDM3YzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwpAQCAtMzUsNyArMzUsNyBAQAogICAgIG5Gb3JjZTQgTUNQNTUJCTAzNjgKIAogICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAyIFNNQnVzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIE1DUCBvZiB0aGUKLSAgICBuRm9yY2UyLzMvNCBjaGlwc2V0cy4KKyAgICBuRm9yY2UyLzMvNC81eHggY2hpcHNldHMuCiAqLwogCiAvKiBOb3RlOiB3ZSBhc3N1bWUgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG5Gb3JjZTIsIHdpdGggdHdvIFNNQnVzIGludGVyZmFjZXMgKi8KQEAgLTUyLDggKzUyLDggQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUiAoIkhhbnMtRnJpZWRlciBWb2d0IDxoZnZvZ3RAYXJjb3IuZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIm5Gb3JjZTIgU01CdXMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SICgiSGFucy1GcmllZGVyIFZvZ3QgPGhmdm9ndEBnbXgubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJuRm9yY2UyLzMvNC81eHggU01CdXMgZHJpdmVyIik7CiAKIAogc3RydWN0IG5mb3JjZTJfc21idXMgewpAQCAtODAsOSArODAsNiBAQAogI2RlZmluZSBOVklESUFfU01CX0FERFIJCShzbWJ1cy0+YmFzZSArIDB4MDIpCS8qIGFkZHJlc3MgKi8KICNkZWZpbmUgTlZJRElBX1NNQl9DTUQJCShzbWJ1cy0+YmFzZSArIDB4MDMpCS8qIGNvbW1hbmQgKi8KICNkZWZpbmUgTlZJRElBX1NNQl9EQVRBCQkoc21idXMtPmJhc2UgKyAweDA0KQkvKiAzMiBkYXRhIHJlZ2lzdGVycyAqLwotI2RlZmluZSBOVklESUFfU01CX0JDTlQJCShzbWJ1cy0+YmFzZSArIDB4MjQpCS8qIG51bWJlciBvZiBkYXRhIGJ5dGVzICovCi0jZGVmaW5lIE5WSURJQV9TTUJfQUxSTV9BCShzbWJ1cy0+YmFzZSArIDB4MjUpCS8qIGFsYXJtIGFkZHJlc3MgKi8KLSNkZWZpbmUgTlZJRElBX1NNQl9BTFJNX0QJKHNtYnVzLT5iYXNlICsgMHgyNikJLyogMiBieXRlcyBhbGFybSBkYXRhICovCiAKICNkZWZpbmUgTlZJRElBX1NNQl9TVFNfRE9ORQkweDgwCiAjZGVmaW5lIE5WSURJQV9TTUJfU1RTX0FMUk0JMHg0MApAQCAtOTUsNDAgKzkyLDE3IEBACiAjZGVmaW5lIE5WSURJQV9TTUJfUFJUQ0xfQllURQkJCTB4MDQKICNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTF9CWVRFX0RBVEEJCTB4MDYKICNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTF9XT1JEX0RBVEEJCTB4MDgKLSNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTF9CTE9DS19EQVRBCQkweDBhCi0jZGVmaW5lIE5WSURJQV9TTUJfUFJUQ0xfUFJPQ19DQUxMCQkweDBjCi0jZGVmaW5lIE5WSURJQV9TTUJfUFJUQ0xfQkxPQ0tfUFJPQ19DQUxMCTB4MGQKLSNkZWZpbmUgTlZJRElBX1NNQl9QUlRDTF9JMkNfQkxPQ0tfREFUQQkJMHg0YQogI2RlZmluZSBOVklESUFfU01CX1BSVENMX1BFQwkJCTB4ODAKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5mb3JjZTJfZHJpdmVyOwogCi1zdGF0aWMgczMyIG5mb3JjZTJfYWNjZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdTE2IGFkZHIsCi0JCSAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAotCQkgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKTsKLXN0YXRpYyB1MzIgbmZvcmNlMl9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKLQkuc21idXNfeGZlciA9IG5mb3JjZTJfYWNjZXNzLAotCS5mdW5jdGlvbmFsaXR5ID0gbmZvcmNlMl9mdW5jLAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBuZm9yY2UyX2FkYXB0ZXIgPSB7Ci0JLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLmNsYXNzICAgICAgICAgID0gSTJDX0NMQVNTX0hXTU9OLAotCS5hbGdvICAgICAgICAgICA9ICZzbWJ1c19hbGdvcml0aG0sCi19OwotCi0vKiBSZXR1cm4gLTEgb24gZXJyb3IuIFNlZSBzbWJ1cy5oIGZvciBtb3JlIGluZm9ybWF0aW9uICovCisvKiBSZXR1cm4gLTEgb24gZXJyb3IgKi8KIHN0YXRpYyBzMzIgbmZvcmNlMl9hY2Nlc3Moc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCiAJCXVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCiAJCXU4IGNvbW1hbmQsIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCiB7CiAJc3RydWN0IG5mb3JjZTJfc21idXMgKnNtYnVzID0gYWRhcC0+YWxnb19kYXRhOwogCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2wsIHBlYywgdGVtcDsKLQl1bnNpZ25lZCBjaGFyIGxlbiA9IDA7IC8qIHRvIGtlZXAgdGhlIGNvbXBpbGVyIHF1aWV0ICovCi0JaW50IGk7CiAKIAlwcm90b2NvbCA9IChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSA/IE5WSURJQV9TTUJfUFJUQ0xfUkVBRCA6CiAJCU5WSURJQV9TTUJfUFJUQ0xfV1JJVEU7CkBAIC0xNjMsMzUgKzEzNyw2IEBACiAJCQlwcm90b2NvbCB8PSBOVklESUFfU01CX1BSVENMX1dPUkRfREFUQSB8IHBlYzsKIAkJCWJyZWFrOwogCi0JCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6Ci0JCQlvdXRiX3AoY29tbWFuZCwgTlZJRElBX1NNQl9DTUQpOwotCQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7Ci0JCQkJbGVuID0gbWluX3QodTgsIGRhdGEtPmJsb2NrWzBdLCAzMik7Ci0JCQkJb3V0Yl9wKGxlbiwgTlZJRElBX1NNQl9CQ05UKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJCW91dGJfcChkYXRhLT5ibG9ja1tpICsgMV0sIE5WSURJQV9TTUJfREFUQStpKTsKLQkJCX0KLQkJCXByb3RvY29sIHw9IE5WSURJQV9TTUJfUFJUQ0xfQkxPQ0tfREFUQSB8IHBlYzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgotCQkJbGVuID0gbWluX3QodTgsIGRhdGEtPmJsb2NrWzBdLCAzMik7Ci0JCQlvdXRiX3AoY29tbWFuZCwgTlZJRElBX1NNQl9DTUQpOwotCQkJb3V0Yl9wKGxlbiwgTlZJRElBX1NNQl9CQ05UKTsKLQkJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJCW91dGJfcChkYXRhLT5ibG9ja1tpICsgMV0sIE5WSURJQV9TTUJfREFUQStpKTsKLQkJCXByb3RvY29sIHw9IE5WSURJQV9TTUJfUFJUQ0xfSTJDX0JMT0NLX0RBVEE7Ci0JCQlicmVhazsKLQotCQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6Ci0JCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJJMkNfU01CVVNfUFJPQ19DQUxMIG5vdCBzdXBwb3J0ZWQhXG4iKTsKLQkJCXJldHVybiAtMTsKLQotCQljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEw6Ci0JCQlkZXZfZXJyKCZhZGFwLT5kZXYsICJJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMIG5vdCBzdXBwb3J0ZWQhXG4iKTsKLQkJCXJldHVybiAtMTsKLQogCQlkZWZhdWx0OgogCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiVW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gJWRcbiIsIHNpemUpOwogCQkJcmV0dXJuIC0xOwpAQCAtMjI3LDE5ICsxNzIsOCBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgotCQkvKiBjYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6IG5vdCBzdXBwb3J0ZWQgKi8KIAkJCWRhdGEtPndvcmQgPSBpbmJfcChOVklESUFfU01CX0RBVEEpIHwgKGluYl9wKE5WSURJQV9TTUJfREFUQSsxKSA8PCA4KTsKIAkJCWJyZWFrOwotCi0JCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6Ci0JCS8qIGNhc2UgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTDogbm90IHN1cHBvcnRlZCAqLwotCQkJbGVuID0gaW5iX3AoTlZJRElBX1NNQl9CQ05UKTsKLQkJCWxlbiA9IG1pbl90KHU4LCBsZW4sIDMyKTsKLQkJY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJZGF0YS0+YmxvY2tbaSsxXSA9IGluYl9wKE5WSURJQV9TTUJfREFUQSArIGkpOwotCQkJZGF0YS0+YmxvY2tbMF0gPSBsZW47Ci0JCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTI1MCwxMCArMTg0LDE0IEBACiB7CiAJLyogb3RoZXIgZnVuY3Rpb25hbGl0eSBtaWdodCBiZSBwb3NzaWJsZSwgYnV0IGlzIG5vdCB0ZXN0ZWQgKi8KIAlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBJMkNfRlVOQ19TTUJVU19CWVRFIHwKLQkgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIC8qIHwKLQkgICAgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQSAqLzsKKwkgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBOwogfQogCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0geworCS5zbWJ1c194ZmVyCT0gbmZvcmNlMl9hY2Nlc3MsCisJLmZ1bmN0aW9uYWxpdHkJPSBuZm9yY2UyX2Z1bmMsCit9OworCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuZm9yY2UyX2lkc1tdID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFMl9TTUJVUykgfSwKQEAgLTI2Nyw3ICsyMDUsNiBAQAogCXsgMCB9CiB9OwogCi0KIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgbmZvcmNlMl9pZHMpOwogCiAKQEAgLTI5MSw3ICsyMjgsNyBAQAogCQl9CiAKIAkJc21idXMtPmJhc2UgPSBpb2Jhc2UgJiBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCXNtYnVzLT5zaXplID0gODsKKwkJc21idXMtPnNpemUgPSA2NDsKIAl9CiAJc21idXMtPmRldiA9IGRldjsKIApAQCAtMzAwLDcgKzIzNyw5IEBACiAJCQlzbWJ1cy0+YmFzZSwgc21idXMtPmJhc2Urc21idXMtPnNpemUtMSwgbmFtZSk7CiAJCXJldHVybiAtMTsKIAl9Ci0Jc21idXMtPmFkYXB0ZXIgPSBuZm9yY2UyX2FkYXB0ZXI7CisJc21idXMtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKKwlzbWJ1cy0+YWRhcHRlci5jbGFzcyA9IEkyQ19DTEFTU19IV01PTjsKKwlzbWJ1cy0+YWRhcHRlci5hbGdvID0gJnNtYnVzX2FsZ29yaXRobTsKIAlzbWJ1cy0+YWRhcHRlci5hbGdvX2RhdGEgPSBzbWJ1czsKIAlzbWJ1cy0+YWRhcHRlci5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwogCXNucHJpbnRmKHNtYnVzLT5hZGFwdGVyLm5hbWUsIEkyQ19OQU1FX1NJWkUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCmluZGV4IGRlYzA0ZGEuLmJjZDgzNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCkBAIC0yMzEsOCArMjMxLDggQEAKIAkJICogMTMJCTIJCTEKIAkJICogMTkuMgkJMgkJMQogCQkgKi8KLQkJaWYgKGZjbGtfcmF0ZSA+IDE2MDAwMDAwKQotCQkJcHNjID0gKGZjbGtfcmF0ZSArIDgwMDAwMDApIC8gMTIwMDAwMDA7CisJCWlmIChmY2xrX3JhdGUgPiAxMjAwMDAwMCkKKwkJCXBzYyA9IGZjbGtfcmF0ZSAvIDEyMDAwMDAwOwogCX0KIAogCS8qIFNldHVwIGNsb2NrIHByZXNjYWxlciB0byBvYnRhaW4gYXBwcm94IDEyTUh6IEkyQyBtb2R1bGUgY2xvY2s6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQtbGlnaHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCmluZGV4IDVlYjJiZDIuLjRiYzQyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAlpZiAoYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQudmFsKQogCQlsaW5lX3NldCgwLCAmYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQpOwogCi0JaTJjX2JpdF9kZWxfYnVzKCZwYXJwb3J0X2FkYXB0ZXIpOworCWkyY19kZWxfYWRhcHRlcigmcGFycG9ydF9hZGFwdGVyKTsKIAlyZWxlYXNlX3JlZ2lvbihiYXNlLCAzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuYwppbmRleCA0OGE4Mjk0Li42NjY5NmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCQlpZiAoYWRhcHRlcl9wYXJtW3R5cGVdLmluaXQudmFsKQogCQkJCWxpbmVfc2V0KHBvcnQsIDAsICZhZGFwdGVyX3Bhcm1bdHlwZV0uaW5pdCk7CiAJCQkJCi0JCQlpMmNfYml0X2RlbF9idXMoJmFkYXB0ZXItPmFkYXB0ZXIpOworCQkJaTJjX2RlbF9hZGFwdGVyKCZhZGFwdGVyLT5hZGFwdGVyKTsKIAkJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoYWRhcHRlci0+cGRldik7CiAJCQlpZiAocHJldikKIAkJCQlwcmV2LT5uZXh0ID0gYWRhcHRlci0+bmV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGNhLWlzYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtaXNhLmMKaW5kZXggNDA3ODQwYi4uY2M2NTM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtaXNhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wY2EtaXNhLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiBzdGF0aWMgdm9pZCBwY2FfaXNhX2V4aXQodm9pZCkKIHsKLQlpMmNfcGNhX2RlbF9idXMoJnBjYV9pc2Ffb3BzKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJnBjYV9pc2Ffb3BzKTsKIAogCWlmIChpcnEgPiAwKSB7CiAJCWRpc2FibGVfaXJxKGlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBueC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBiY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbnguYwpAQCAtMCwwICsxLDcwOCBAQAorLyoKKyAqIFByb3ZpZGVzIEkyQyBzdXBwb3J0IGZvciBQaGlsaXBzIFBOWDAxMHgvUE5YNDAwOCBib2FyZHMuCisgKgorICogQXV0aG9yczogRGVubmlzIEtvdmFsZXYgPGRrb3ZhbGV2QHJ1Lm12aXN0YS5jb20+CisgKgkgICAgVml0YWx5IFdvb2wgPHZ3b29sQHJ1Lm12aXN0YS5jb20+CisgKgorICogMjAwNC0yMDA2IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1wbnguaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBJMkNfUE5YX1RJTUVPVVQJCTEwIC8qIG1zZWMgKi8KKyNkZWZpbmUgSTJDX1BOWF9TUEVFRF9LSFoJMTAwCisjZGVmaW5lIEkyQ19QTlhfUkVHSU9OX1NJWkUJMHgxMDAKKyNkZWZpbmUgUE5YX0RFRkFVTFRfRlJFUQkxMyAvKiBNSHogKi8KKworc3RhdGljIGlubGluZSBpbnQgd2FpdF90aW1lb3V0KGxvbmcgdGltZW91dCwgc3RydWN0IGkyY19wbnhfYWxnb19kYXRhICpkYXRhKQoreworCXdoaWxlICh0aW1lb3V0ID4gMCAmJgorCQkJKGlvcmVhZDMyKEkyQ19SRUdfU1RTKGRhdGEpKSAmIG1zdGF0dXNfYWN0aXZlKSkgeworCQltZGVsYXkoMSk7CisJCXRpbWVvdXQtLTsKKwl9CisJcmV0dXJuICh0aW1lb3V0IDw9IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCB3YWl0X3Jlc2V0KGxvbmcgdGltZW91dCwgc3RydWN0IGkyY19wbnhfYWxnb19kYXRhICpkYXRhKQoreworCXdoaWxlICh0aW1lb3V0ID4gMCAmJgorCQkJKGlvcmVhZDMyKEkyQ19SRUdfQ1RMKGRhdGEpKSAmIG1jbnRybF9yZXNldCkpIHsKKwkJbWRlbGF5KDEpOworCQl0aW1lb3V0LS07CisJfQorCXJldHVybiAodGltZW91dCA8PSAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGkyY19wbnhfYXJtX3RpbWVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX3BueF9hbGdvX2RhdGEgKmRhdGEgPSBhZGFwLT5hbGdvX2RhdGE7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJmRhdGEtPm1pZi50aW1lcjsKKwlpbnQgZXhwaXJlcyA9IEkyQ19QTlhfVElNRU9VVCAvICgxMDAwIC8gSFopOworCisJZGVsX3RpbWVyX3N5bmModGltZXIpOworCisJZGV2X2RiZygmYWRhcC0+ZGV2LCAiVGltZXIgYXJtZWQgYXQgJWx1IHBsdXMgJXUgamlmZmllcy5cbiIsCisJCWppZmZpZXMsIGV4cGlyZXMpOworCisJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgZXhwaXJlczsKKwl0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXA7CisKKwlhZGRfdGltZXIodGltZXIpOworfQorCisvKioKKyAqIGkyY19wbnhfc3RhcnQgLSBzdGFydCBhIGRldmljZQorICogQHNsYXZlX2FkZHI6CQlzbGF2ZSBhZGRyZXNzCisgKiBAYWRhcDoJCXBvaW50ZXIgdG8gYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBHZW5lcmF0ZSBhIFNUQVJUIHNpZ25hbCBpbiB0aGUgZGVzaXJlZCBtb2RlLgorICovCitzdGF0aWMgaW50IGkyY19wbnhfc3RhcnQodW5zaWduZWQgY2hhciBzbGF2ZV9hZGRyLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGkyY19wbnhfYWxnb19kYXRhICphbGdfZGF0YSA9IGFkYXAtPmFsZ29fZGF0YTsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIiVzKCk6IGFkZHIgMHgleCBtb2RlICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCXNsYXZlX2FkZHIsIGFsZ19kYXRhLT5taWYubW9kZSk7CisKKwkvKiBDaGVjayBmb3IgNyBiaXQgc2xhdmUgYWRkcmVzc2VzIG9ubHkgKi8KKwlpZiAoc2xhdmVfYWRkciAmIH4weDdmKSB7CisJCWRldl9lcnIoJmFkYXAtPmRldiwgIiVzOiBJbnZhbGlkIHNsYXZlIGFkZHJlc3MgJXguICIKKwkJICAgICAgICJPbmx5IDctYml0IGFkZHJlc3NlcyBhcmUgc3VwcG9ydGVkXG4iLAorCQkgICAgICAgYWRhcC0+bmFtZSwgc2xhdmVfYWRkcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpcnN0LCBtYWtlIHN1cmUgYnVzIGlzIGlkbGUgKi8KKwlpZiAod2FpdF90aW1lb3V0KEkyQ19QTlhfVElNRU9VVCwgYWxnX2RhdGEpKSB7CisJCS8qIFNvbWVib2R5IGVsc2UgaXMgbW9ub3BvbGl6aW5nIHRoZSBidXMgKi8KKwkJZGV2X2VycigmYWRhcC0+ZGV2LCAiJXM6IEJ1cyBidXN5LiBTbGF2ZSBhZGRyID0gJTAyeCwgIgorCQkgICAgICAgImNudHJsID0gJXgsIHN0YXQgPSAleFxuIiwKKwkJICAgICAgIGFkYXAtPm5hbWUsIHNsYXZlX2FkZHIsCisJCSAgICAgICBpb3JlYWQzMihJMkNfUkVHX0NUTChhbGdfZGF0YSkpLAorCQkgICAgICAgaW9yZWFkMzIoSTJDX1JFR19TVFMoYWxnX2RhdGEpKSk7CisJCXJldHVybiAtRUJVU1k7CisJfSBlbHNlIGlmIChpb3JlYWQzMihJMkNfUkVHX1NUUyhhbGdfZGF0YSkpICYgbXN0YXR1c19hZmkpIHsKKwkJLyogU29ycnksIHdlIGxvc3QgdGhlIGJ1cyAqLworCQlkZXZfZXJyKCZhZGFwLT5kZXYsICIlczogQXJiaXRyYXRpb24gZmFpbHVyZS4gIgorCQkgICAgICAgIlNsYXZlIGFkZHIgPSAlMDJ4XG4iLCBhZGFwLT5uYW1lLCBzbGF2ZV9hZGRyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBPSywgSTJDIGlzIGVuYWJsZWQgYW5kIHdlIGhhdmUgdGhlIGJ1cy4KKwkgKiBDbGVhciB0aGUgY3VycmVudCBUREkgYW5kIEFGSSBzdGF0dXMgZmxhZ3MuCisJICovCisJaW93cml0ZTMyKGlvcmVhZDMyKEkyQ19SRUdfU1RTKGFsZ19kYXRhKSkgfCBtc3RhdHVzX3RkaSB8IG1zdGF0dXNfYWZpLAorCQkgIEkyQ19SRUdfU1RTKGFsZ19kYXRhKSk7CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICIlcygpOiBzZW5kaW5nICUjeFxuIiwgX19GVU5DVElPTl9fLAorCQkoc2xhdmVfYWRkciA8PCAxKSB8IHN0YXJ0X2JpdCB8IGFsZ19kYXRhLT5taWYubW9kZSk7CisKKwkvKiBXcml0ZSB0aGUgc2xhdmUgYWRkcmVzcywgU1RBUlQgYml0IGFuZCBSL1cgYml0ICovCisJaW93cml0ZTMyKChzbGF2ZV9hZGRyIDw8IDEpIHwgc3RhcnRfYml0IHwgYWxnX2RhdGEtPm1pZi5tb2RlLAorCQkgIEkyQ19SRUdfVFgoYWxnX2RhdGEpKTsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIiVzKCk6IGV4aXRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpMmNfcG54X3N0b3AgLSBzdG9wIGEgZGV2aWNlCisgKiBAYWRhcDoJCXBvaW50ZXIgdG8gSTJDIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogR2VuZXJhdGUgYSBTVE9QIHNpZ25hbCB0byB0ZXJtaW5hdGUgdGhlIG1hc3RlciB0cmFuc2FjdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaTJjX3BueF9zdG9wKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX3BueF9hbGdvX2RhdGEgKmFsZ19kYXRhID0gYWRhcC0+YWxnb19kYXRhOworCS8qIE9ubHkgMSBtc2VjIG1heCB0aW1lb3V0IGR1ZSB0byBpbnRlcnJ1cHQgY29udGV4dCAqLworCWxvbmcgdGltZW91dCA9IDEwMDA7CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICIlcygpOiBlbnRlcmluZzogc3RhdCA9ICUwNHguXG4iLAorCQlfX0ZVTkNUSU9OX18sIGlvcmVhZDMyKEkyQ19SRUdfU1RTKGFsZ19kYXRhKSkpOworCisJLyogV3JpdGUgYSBTVE9QIGJpdCB0byBUWCBGSUZPICovCisJaW93cml0ZTMyKDB4ZmYgfCBzdG9wX2JpdCwgSTJDX1JFR19UWChhbGdfZGF0YSkpOworCisJLyogV2FpdCB1bnRpbCB0aGUgU1RPUCBpcyBzZWVuLiAqLworCXdoaWxlICh0aW1lb3V0ID4gMCAmJgorCSAgICAgICAoaW9yZWFkMzIoSTJDX1JFR19TVFMoYWxnX2RhdGEpKSAmIG1zdGF0dXNfYWN0aXZlKSkgeworCQkvKiBtYXkgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgKi8KKwkJdWRlbGF5KDEpOworCQl0aW1lb3V0LS07CisJfQorCisJZGV2X2RiZygmYWRhcC0+ZGV2LCAiJXMoKTogZXhpdGluZzogc3RhdCA9ICUwNHguXG4iLAorCQlfX0ZVTkNUSU9OX18sIGlvcmVhZDMyKEkyQ19SRUdfU1RTKGFsZ19kYXRhKSkpOworfQorCisvKioKKyAqIGkyY19wbnhfbWFzdGVyX3htaXQgLSB0cmFuc21pdCBkYXRhIHRvIHNsYXZlCisgKiBAYWRhcDoJCXBvaW50ZXIgdG8gSTJDIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogU2VuZHMgb25lIGJ5dGUgb2YgZGF0YSB0byB0aGUgc2xhdmUKKyAqLworc3RhdGljIGludCBpMmNfcG54X21hc3Rlcl94bWl0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX3BueF9hbGdvX2RhdGEgKmFsZ19kYXRhID0gYWRhcC0+YWxnb19kYXRhOworCXUzMiB2YWw7CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICIlcygpOiBlbnRlcmluZzogc3RhdCA9ICUwNHguXG4iLAorCQlfX0ZVTkNUSU9OX18sIGlvcmVhZDMyKEkyQ19SRUdfU1RTKGFsZ19kYXRhKSkpOworCisJaWYgKGFsZ19kYXRhLT5taWYubGVuID4gMCkgeworCQkvKiBXZSBzdGlsbCBoYXZlIHNvbWV0aGluZyB0byB0YWxrIGFib3V0Li4uICovCisJCXZhbCA9ICphbGdfZGF0YS0+bWlmLmJ1ZisrOworCisJCWlmIChhbGdfZGF0YS0+bWlmLmxlbiA9PSAxKSB7CisJCQl2YWwgfD0gc3RvcF9iaXQ7CisJCQlpZiAoIWFsZ19kYXRhLT5sYXN0KQorCQkJCXZhbCB8PSBzdGFydF9iaXQ7CisJCX0KKworCQlhbGdfZGF0YS0+bWlmLmxlbi0tOworCQlpb3dyaXRlMzIodmFsLCBJMkNfUkVHX1RYKGFsZ19kYXRhKSk7CisKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiJXMoKTogeG1pdCAlI3ggWyVkXVxuIiwgX19GVU5DVElPTl9fLAorCQkJdmFsLCBhbGdfZGF0YS0+bWlmLmxlbiArIDEpOworCisJCWlmIChhbGdfZGF0YS0+bWlmLmxlbiA9PSAwKSB7CisJCQlpZiAoYWxnX2RhdGEtPmxhc3QpIHsKKwkJCQkvKiBXYWl0IHVudGlsIHRoZSBTVE9QIGlzIHNlZW4uICovCisJCQkJaWYgKHdhaXRfdGltZW91dChJMkNfUE5YX1RJTUVPVVQsIGFsZ19kYXRhKSkKKwkJCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiVGhlIGJ1cyBpcyBzdGlsbCAiCisJCQkJCQkiYWN0aXZlIGFmdGVyIHRpbWVvdXRcbiIpOworCQkJfQorCQkJLyogRGlzYWJsZSBtYXN0ZXIgaW50ZXJydXB0cyAqLworCQkJaW93cml0ZTMyKGlvcmVhZDMyKEkyQ19SRUdfQ1RMKGFsZ19kYXRhKSkgJgorCQkJCX4obWNudHJsX2FmaWUgfCBtY250cmxfbmFpZSB8IG1jbnRybF9kcm1pZSksCisJCQkJICBJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCisJCQlkZWxfdGltZXJfc3luYygmYWxnX2RhdGEtPm1pZi50aW1lcik7CisKKwkJCWRldl9kYmcoJmFkYXAtPmRldiwgIiVzKCk6IFdha2luZyB1cCB4ZmVyIHJvdXRpbmUuXG4iLAorCQkJCV9fRlVOQ1RJT05fXyk7CisKKwkJCWNvbXBsZXRlKCZhbGdfZGF0YS0+bWlmLmNvbXBsZXRlKTsKKwkJfQorCX0gZWxzZSBpZiAoYWxnX2RhdGEtPm1pZi5sZW4gPT0gMCkgeworCQkvKiB6ZXJvLXNpemVkIHRyYW5zZmVyICovCisJCWkyY19wbnhfc3RvcChhZGFwKTsKKworCQkvKiBEaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHRzLiAqLworCQlpb3dyaXRlMzIoaW9yZWFkMzIoSTJDX1JFR19DVEwoYWxnX2RhdGEpKSAmCisJCQl+KG1jbnRybF9hZmllIHwgbWNudHJsX25haWUgfCBtY250cmxfZHJtaWUpLAorCQkJICBJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCisJCS8qIFN0b3AgdGltZXIuICovCisJCWRlbF90aW1lcl9zeW5jKCZhbGdfZGF0YS0+bWlmLnRpbWVyKTsKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiJXMoKTogV2FraW5nIHVwIHhmZXIgcm91dGluZSBhZnRlciAiCisJCQkiemVyby14ZmVyLlxuIiwgX19GVU5DVElPTl9fKTsKKworCQljb21wbGV0ZSgmYWxnX2RhdGEtPm1pZi5jb21wbGV0ZSk7CisJfQorCisJZGV2X2RiZygmYWRhcC0+ZGV2LCAiJXMoKTogZXhpdGluZzogc3RhdCA9ICUwNHguXG4iLAorCQlfX0ZVTkNUSU9OX18sIGlvcmVhZDMyKEkyQ19SRUdfU1RTKGFsZ19kYXRhKSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaTJjX3BueF9tYXN0ZXJfcmN2IC0gcmVjZWl2ZSBkYXRhIGZyb20gc2xhdmUKKyAqIEBhZGFwOgkJcG9pbnRlciB0byBJMkMgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZWFkcyBvbmUgYnl0ZSBkYXRhIGZyb20gdGhlIHNsYXZlCisgKi8KK3N0YXRpYyBpbnQgaTJjX3BueF9tYXN0ZXJfcmN2KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX3BueF9hbGdvX2RhdGEgKmFsZ19kYXRhID0gYWRhcC0+YWxnb19kYXRhOworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCXUzMiBjdGwgPSAwOworCisJZGV2X2RiZygmYWRhcC0+ZGV2LCAiJXMoKTogZW50ZXJpbmc6IHN0YXQgPSAlMDR4LlxuIiwKKwkJX19GVU5DVElPTl9fLCBpb3JlYWQzMihJMkNfUkVHX1NUUyhhbGdfZGF0YSkpKTsKKworCS8qIENoZWNrLCB3aGV0aGVyIHRoZXJlIGlzIGFscmVhZHkgZGF0YSwKKwkgKiBvciB3ZSBkaWRuJ3QgJ2FzaycgZm9yIGl0IHlldC4KKwkgKi8KKwlpZiAoaW9yZWFkMzIoSTJDX1JFR19TVFMoYWxnX2RhdGEpKSAmIG1zdGF0dXNfcmZlKSB7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIiVzKCk6IFdyaXRlIGR1bW15IGRhdGEgdG8gZmlsbCAiCisJCQkiUngtZmlmby4uLlxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAoYWxnX2RhdGEtPm1pZi5sZW4gPT0gMSkgeworCQkJLyogTGFzdCBieXRlLCBkbyBub3QgYWNrbm93bGVkZ2UgbmV4dCByY3YuICovCisJCQl2YWwgfD0gc3RvcF9iaXQ7CisJCQlpZiAoIWFsZ19kYXRhLT5sYXN0KQorCQkJCXZhbCB8PSBzdGFydF9iaXQ7CisKKwkJCS8qCisJCQkgKiBFbmFibGUgaW50ZXJydXB0IFJGREFJRSAoZGF0YSBpbiBSeCBmaWZvKSwKKwkJCSAqIGFuZCBkaXNhYmxlIERSTUlFIChuZWVkIGRhdGEgZm9yIFR4KQorCQkJICovCisJCQljdGwgPSBpb3JlYWQzMihJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCQkJY3RsIHw9IG1jbnRybF9yZmZpZSB8IG1jbnRybF9kYWllOworCQkJY3RsICY9IH5tY250cmxfZHJtaWU7CisJCQlpb3dyaXRlMzIoY3RsLCBJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCQl9CisKKwkJLyoKKwkJICogTm93IHdlJ2xsICdhc2snIGZvciBkYXRhOgorCQkgKiBGb3IgZWFjaCBieXRlIHdlIHdhbnQgdG8gcmVjZWl2ZSwgd2UgbXVzdAorCQkgKiB3cml0ZSBhIChkdW1teSkgYnl0ZSB0byB0aGUgVHgtRklGTy4KKwkJICovCisJCWlvd3JpdGUzMih2YWwsIEkyQ19SRUdfVFgoYWxnX2RhdGEpKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBIYW5kbGUgZGF0YS4gKi8KKwlpZiAoYWxnX2RhdGEtPm1pZi5sZW4gPiAwKSB7CisJCXZhbCA9IGlvcmVhZDMyKEkyQ19SRUdfUlgoYWxnX2RhdGEpKTsKKwkJKmFsZ19kYXRhLT5taWYuYnVmKysgPSAodTgpICh2YWwgJiAweGZmKTsKKwkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiJXMoKTogcmN2IDB4JXggWyVkXVxuIiwgX19GVU5DVElPTl9fLCB2YWwsCisJCQlhbGdfZGF0YS0+bWlmLmxlbik7CisKKwkJYWxnX2RhdGEtPm1pZi5sZW4tLTsKKwkJaWYgKGFsZ19kYXRhLT5taWYubGVuID09IDApIHsKKwkJCWlmIChhbGdfZGF0YS0+bGFzdCkKKwkJCQkvKiBXYWl0IHVudGlsIHRoZSBTVE9QIGlzIHNlZW4uICovCisJCQkJaWYgKHdhaXRfdGltZW91dChJMkNfUE5YX1RJTUVPVVQsIGFsZ19kYXRhKSkKKwkJCQkJZGV2X2VycigmYWRhcC0+ZGV2LCAiVGhlIGJ1cyBpcyBzdGlsbCAiCisJCQkJCQkiYWN0aXZlIGFmdGVyIHRpbWVvdXRcbiIpOworCisJCQkvKiBEaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHRzICovCisJCQljdGwgPSBpb3JlYWQzMihJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCQkJY3RsICY9IH4obWNudHJsX2FmaWUgfCBtY250cmxfbmFpZSB8IG1jbnRybF9yZmZpZSB8CisJCQkJIG1jbnRybF9kcm1pZSB8IG1jbnRybF9kYWllKTsKKwkJCWlvd3JpdGUzMihjdGwsIEkyQ19SRUdfQ1RMKGFsZ19kYXRhKSk7CisKKwkJCS8qIEtpbGwgdGltZXIuICovCisJCQlkZWxfdGltZXJfc3luYygmYWxnX2RhdGEtPm1pZi50aW1lcik7CisJCQljb21wbGV0ZSgmYWxnX2RhdGEtPm1pZi5jb21wbGV0ZSk7CisJCX0KKwl9CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICIlcygpOiBleGl0aW5nOiBzdGF0ID0gJTA0eC5cbiIsCisJCV9fRlVOQ1RJT05fXywgaW9yZWFkMzIoSTJDX1JFR19TVFMoYWxnX2RhdGEpKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90CitpMmNfcG54X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBzdGF0LCBjdGw7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gZGV2X2lkOworCXN0cnVjdCBpMmNfcG54X2FsZ29fZGF0YSAqYWxnX2RhdGEgPSBhZGFwLT5hbGdvX2RhdGE7CisKKwlkZXZfZGJnKCZhZGFwLT5kZXYsICIlcygpOiBtc3RhdCA9ICV4IG1jdHJsID0gJXgsIG1vZGUgPSAlZFxuIiwKKwkJX19GVU5DVElPTl9fLAorCQlpb3JlYWQzMihJMkNfUkVHX1NUUyhhbGdfZGF0YSkpLAorCQlpb3JlYWQzMihJMkNfUkVHX0NUTChhbGdfZGF0YSkpLAorCQlhbGdfZGF0YS0+bWlmLm1vZGUpOworCXN0YXQgPSBpb3JlYWQzMihJMkNfUkVHX1NUUyhhbGdfZGF0YSkpOworCisJLyogbGV0J3Mgc2VlIHdoYXQga2luZCBvZiBldmVudCB0aGlzIGlzICovCisJaWYgKHN0YXQgJiBtc3RhdHVzX2FmaSkgeworCQkvKiBXZSBsb3N0IGFyYml0cmF0aW9uIGluIHRoZSBtaWRzdCBvZiBhIHRyYW5zZmVyICovCisJCWFsZ19kYXRhLT5taWYucmV0ID0gLUVJTzsKKworCQkvKiBEaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHRzLiAqLworCQljdGwgPSBpb3JlYWQzMihJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCQljdGwgJj0gfihtY250cmxfYWZpZSB8IG1jbnRybF9uYWllIHwgbWNudHJsX3JmZmllIHwKKwkJCSBtY250cmxfZHJtaWUpOworCQlpb3dyaXRlMzIoY3RsLCBJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCisJCS8qIFN0b3AgdGltZXIsIHRvIHByZXZlbnQgdGltZW91dC4gKi8KKwkJZGVsX3RpbWVyX3N5bmMoJmFsZ19kYXRhLT5taWYudGltZXIpOworCQljb21wbGV0ZSgmYWxnX2RhdGEtPm1pZi5jb21wbGV0ZSk7CisJfSBlbHNlIGlmIChzdGF0ICYgbXN0YXR1c19uYWkpIHsKKwkJLyogU2xhdmUgZGlkIG5vdCBhY2tub3dsZWRnZSwgZ2VuZXJhdGUgYSBTVE9QICovCisJCWRldl9kYmcoJmFkYXAtPmRldiwgIiVzKCk6ICIKKwkJCSJTbGF2ZSBkaWQgbm90IGFja25vd2xlZGdlLCBnZW5lcmF0aW5nIGEgU1RPUC5cbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQlpMmNfcG54X3N0b3AoYWRhcCk7CisKKwkJLyogRGlzYWJsZSBtYXN0ZXIgaW50ZXJydXB0cy4gKi8KKwkJY3RsID0gaW9yZWFkMzIoSTJDX1JFR19DVEwoYWxnX2RhdGEpKTsKKwkJY3RsICY9IH4obWNudHJsX2FmaWUgfCBtY250cmxfbmFpZSB8IG1jbnRybF9yZmZpZSB8CisJCQkgbWNudHJsX2RybWllKTsKKwkJaW93cml0ZTMyKGN0bCwgSTJDX1JFR19DVEwoYWxnX2RhdGEpKTsKKworCQkvKiBPdXIgcmV0dXJuIHZhbHVlLiAqLworCQlhbGdfZGF0YS0+bWlmLnJldCA9IC1FSU87CisKKwkJLyogU3RvcCB0aW1lciwgdG8gcHJldmVudCB0aW1lb3V0LiAqLworCQlkZWxfdGltZXJfc3luYygmYWxnX2RhdGEtPm1pZi50aW1lcik7CisJCWNvbXBsZXRlKCZhbGdfZGF0YS0+bWlmLmNvbXBsZXRlKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUd28gb3B0aW9uczoKKwkJICogLSBNYXN0ZXIgVHggbmVlZHMgZGF0YS4KKwkJICogLSBUaGVyZSBpcyBkYXRhIGluIHRoZSBSeC1maWZvCisJCSAqIFRoZSBsYXR0ZXIgaXMgb25seSB0aGUgY2FzZSBpZiB3ZSBoYXZlIHJlcXVlc3RlZCBmb3IgZGF0YSwKKwkJICogdmlhIGEgZHVtbXkgd3JpdGUuIChTZWUgJ2kyY19wbnhfbWFzdGVyX3JjdicuKQorCQkgKiBXZSB0aGVyZWZvcmUgY2hlY2ssIGFzIGEgc2FuaXR5IGNoZWNrLCB3aGV0aGVyIHRoYXQgaW50ZXJydXB0CisJCSAqIGhhcyBiZWVuIGVuYWJsZWQuCisJCSAqLworCQlpZiAoKHN0YXQgJiBtc3RhdHVzX2RybWkpIHx8ICEoc3RhdCAmIG1zdGF0dXNfcmZlKSkgeworCQkJaWYgKGFsZ19kYXRhLT5taWYubW9kZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKKwkJCQlpMmNfcG54X21hc3Rlcl94bWl0KGFkYXApOworCQkJfSBlbHNlIGlmIChhbGdfZGF0YS0+bWlmLm1vZGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKKwkJCQlpMmNfcG54X21hc3Rlcl9yY3YoYWRhcCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDbGVhciBUREkgYW5kIEFGSSBiaXRzICovCisJc3RhdCA9IGlvcmVhZDMyKEkyQ19SRUdfU1RTKGFsZ19kYXRhKSk7CisJaW93cml0ZTMyKHN0YXQgfCBtc3RhdHVzX3RkaSB8IG1zdGF0dXNfYWZpLCBJMkNfUkVHX1NUUyhhbGdfZGF0YSkpOworCisJZGV2X2RiZygmYWRhcC0+ZGV2LCAiJXMoKTogZXhpdGluZywgc3RhdCA9ICV4IGN0cmwgPSAleC5cbiIsCisJCSBfX0ZVTkNUSU9OX18sIGlvcmVhZDMyKEkyQ19SRUdfU1RTKGFsZ19kYXRhKSksCisJCSBpb3JlYWQzMihJMkNfUkVHX0NUTChhbGdfZGF0YSkpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgaTJjX3BueF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSAoc3RydWN0IGkyY19hZGFwdGVyICopZGF0YTsKKwlzdHJ1Y3QgaTJjX3BueF9hbGdvX2RhdGEgKmFsZ19kYXRhID0gYWRhcC0+YWxnb19kYXRhOworCXUzMiBjdGw7CisKKwlkZXZfZXJyKCZhZGFwLT5kZXYsICJNYXN0ZXIgdGltZWQgb3V0LiBzdGF0ID0gJTA0eCwgY250cmwgPSAlMDR4LiAiCisJICAgICAgICJSZXNldHRpbmcgbWFzdGVyLi4uXG4iLAorCSAgICAgICBpb3JlYWQzMihJMkNfUkVHX1NUUyhhbGdfZGF0YSkpLAorCSAgICAgICBpb3JlYWQzMihJMkNfUkVHX0NUTChhbGdfZGF0YSkpKTsKKworCS8qIFJlc2V0IG1hc3RlciBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJY3RsID0gaW9yZWFkMzIoSTJDX1JFR19DVEwoYWxnX2RhdGEpKTsKKwljdGwgJj0gfihtY250cmxfYWZpZSB8IG1jbnRybF9uYWllIHwgbWNudHJsX3JmZmllIHwgbWNudHJsX2RybWllKTsKKwlpb3dyaXRlMzIoY3RsLCBJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCisJY3RsIHw9IG1jbnRybF9yZXNldDsKKwlpb3dyaXRlMzIoY3RsLCBJMkNfUkVHX0NUTChhbGdfZGF0YSkpOworCXdhaXRfcmVzZXQoSTJDX1BOWF9USU1FT1VULCBhbGdfZGF0YSk7CisJYWxnX2RhdGEtPm1pZi5yZXQgPSAtRUlPOworCWNvbXBsZXRlKCZhbGdfZGF0YS0+bWlmLmNvbXBsZXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ1c19yZXNldF9pZl9hY3RpdmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBpMmNfcG54X2FsZ29fZGF0YSAqYWxnX2RhdGEgPSBhZGFwLT5hbGdvX2RhdGE7CisJdTMyIHN0YXQ7CisKKwlpZiAoKHN0YXQgPSBpb3JlYWQzMihJMkNfUkVHX1NUUyhhbGdfZGF0YSkpKSAmIG1zdGF0dXNfYWN0aXZlKSB7CisJCWRldl9lcnIoJmFkYXAtPmRldiwKKwkJCSIlczogQnVzIGlzIHN0aWxsIGFjdGl2ZSBhZnRlciB4ZmVyLiBSZXNldCBpdC4uLlxuIiwKKwkJICAgICAgIGFkYXAtPm5hbWUpOworCQlpb3dyaXRlMzIoaW9yZWFkMzIoSTJDX1JFR19DVEwoYWxnX2RhdGEpKSB8IG1jbnRybF9yZXNldCwKKwkJCSAgSTJDX1JFR19DVEwoYWxnX2RhdGEpKTsKKwkJd2FpdF9yZXNldChJMkNfUE5YX1RJTUVPVVQsIGFsZ19kYXRhKTsKKwl9IGVsc2UgaWYgKCEoc3RhdCAmIG1zdGF0dXNfcmZlKSB8fCAhKHN0YXQgJiBtc3RhdHVzX3RmZSkpIHsKKwkJLyogSWYgdGhlcmUgaXMgZGF0YSBpbiB0aGUgZmlmbydzIGFmdGVyIHRyYW5zZmVyLAorCQkgKiBmbHVzaCBmaWZvJ3MgYnkgcmVzZXQuCisJCSAqLworCQlpb3dyaXRlMzIoaW9yZWFkMzIoSTJDX1JFR19DVEwoYWxnX2RhdGEpKSB8IG1jbnRybF9yZXNldCwKKwkJCSAgSTJDX1JFR19DVEwoYWxnX2RhdGEpKTsKKwkJd2FpdF9yZXNldChJMkNfUE5YX1RJTUVPVVQsIGFsZ19kYXRhKTsKKwl9IGVsc2UgaWYgKHN0YXQgJiBtc3RhdHVzX25haSkgeworCQlpb3dyaXRlMzIoaW9yZWFkMzIoSTJDX1JFR19DVEwoYWxnX2RhdGEpKSB8IG1jbnRybF9yZXNldCwKKwkJCSAgSTJDX1JFR19DVEwoYWxnX2RhdGEpKTsKKwkJd2FpdF9yZXNldChJMkNfUE5YX1RJTUVPVVQsIGFsZ19kYXRhKTsKKwl9Cit9CisKKy8qKgorICogaTJjX3BueF94ZmVyIC0gZ2VuZXJpYyB0cmFuc2ZlciBlbnRyeSBwb2ludAorICogQGFkYXA6CQlwb2ludGVyIHRvIEkyQyBhZGFwdGVyIHN0cnVjdHVyZQorICogQG1zZ3M6CQlhcnJheSBvZiBtZXNzYWdlcworICogQG51bToJCW51bWJlciBvZiBtZXNzYWdlcworICoKKyAqIEluaXRpYXRlcyB0aGUgdHJhbnNmZXIKKyAqLworc3RhdGljIGludAoraTJjX3BueF94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJc3RydWN0IGkyY19tc2cgKnBtc2c7CisJaW50IHJjID0gMCwgY29tcGxldGVkID0gMCwgaTsKKwlzdHJ1Y3QgaTJjX3BueF9hbGdvX2RhdGEgKmFsZ19kYXRhID0gYWRhcC0+YWxnb19kYXRhOworCXUzMiBzdGF0ID0gaW9yZWFkMzIoSTJDX1JFR19TVFMoYWxnX2RhdGEpKTsKKworCWRldl9kYmcoJmFkYXAtPmRldiwgIiVzKCk6IGVudGVyaW5nOiAlZCBtZXNzYWdlcywgc3RhdCA9ICUwNHguXG4iLAorCQlfX0ZVTkNUSU9OX18sIG51bSwgaW9yZWFkMzIoSTJDX1JFR19TVFMoYWxnX2RhdGEpKSk7CisKKwlidXNfcmVzZXRfaWZfYWN0aXZlKGFkYXApOworCisJLyogUHJvY2VzcyB0cmFuc2FjdGlvbnMgaW4gYSBsb29wLiAqLworCWZvciAoaSA9IDA7IHJjID49IDAgJiYgaSA8IG51bTsgaSsrKSB7CisJCXU4IGFkZHI7CisKKwkJcG1zZyA9ICZtc2dzW2ldOworCQlhZGRyID0gcG1zZy0+YWRkcjsKKworCQlpZiAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9URU4pIHsKKwkJCWRldl9lcnIoJmFkYXAtPmRldiwKKwkJCQkiJXM6IDEwIGJpdHMgYWRkciBub3Qgc3VwcG9ydGVkIVxuIiwKKwkJCQlhZGFwLT5uYW1lKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJYWxnX2RhdGEtPm1pZi5idWYgPSBwbXNnLT5idWY7CisJCWFsZ19kYXRhLT5taWYubGVuID0gcG1zZy0+bGVuOworCQlhbGdfZGF0YS0+bWlmLm1vZGUgPSAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgPworCQkJSTJDX1NNQlVTX1JFQUQgOiBJMkNfU01CVVNfV1JJVEU7CisJCWFsZ19kYXRhLT5taWYucmV0ID0gMDsKKwkJYWxnX2RhdGEtPmxhc3QgPSAoaSA9PSBudW0gLSAxKTsKKworCQlkZXZfZGJnKCZhZGFwLT5kZXYsICIlcygpOiBtb2RlICVkLCAlZCBieXRlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJYWxnX2RhdGEtPm1pZi5tb2RlLAorCQkJYWxnX2RhdGEtPm1pZi5sZW4pOworCisJCWkyY19wbnhfYXJtX3RpbWVyKGFkYXApOworCisJCS8qIGluaXRpYWxpemUgdGhlIGNvbXBsZXRpb24gdmFyICovCisJCWluaXRfY29tcGxldGlvbigmYWxnX2RhdGEtPm1pZi5jb21wbGV0ZSk7CisKKwkJLyogRW5hYmxlIG1hc3RlciBpbnRlcnJ1cHQgKi8KKwkJaW93cml0ZTMyKGlvcmVhZDMyKEkyQ19SRUdfQ1RMKGFsZ19kYXRhKSkgfCBtY250cmxfYWZpZSB8CisJCQkJbWNudHJsX25haWUgfCBtY250cmxfZHJtaWUsCisJCQkgIEkyQ19SRUdfQ1RMKGFsZ19kYXRhKSk7CisKKwkJLyogUHV0IHN0YXJ0LWNvZGUgYW5kIHNsYXZlLWFkZHJlc3Mgb24gdGhlIGJ1cy4gKi8KKwkJcmMgPSBpMmNfcG54X3N0YXJ0KGFkZHIsIGFkYXApOworCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogV2FpdCBmb3IgY29tcGxldGlvbiAqLworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhbGdfZGF0YS0+bWlmLmNvbXBsZXRlKTsKKworCQlpZiAoIShyYyA9IGFsZ19kYXRhLT5taWYucmV0KSkKKwkJCWNvbXBsZXRlZCsrOworCQlkZXZfZGJnKCZhZGFwLT5kZXYsICIlcygpOiBDb21wbGV0ZSwgcmV0dXJuIGNvZGUgPSAlZC5cbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJjKTsKKworCQkvKiBDbGVhciBUREkgYW5kIEFGSSBiaXRzIGluIGNhc2UgdGhleSBhcmUgc2V0LiAqLworCQlpZiAoKHN0YXQgPSBpb3JlYWQzMihJMkNfUkVHX1NUUyhhbGdfZGF0YSkpKSAmIG1zdGF0dXNfdGRpKSB7CisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsCisJCQkJIiVzOiBUREkgc3RpbGwgc2V0Li4uIGNsZWFyaW5nIG5vdy5cbiIsCisJCQkgICAgICAgYWRhcC0+bmFtZSk7CisJCQlpb3dyaXRlMzIoc3RhdCwgSTJDX1JFR19TVFMoYWxnX2RhdGEpKTsKKwkJfQorCQlpZiAoKHN0YXQgPSBpb3JlYWQzMihJMkNfUkVHX1NUUyhhbGdfZGF0YSkpKSAmIG1zdGF0dXNfYWZpKSB7CisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsCisJCQkJIiVzOiBBRkkgc3RpbGwgc2V0Li4uIGNsZWFyaW5nIG5vdy5cbiIsCisJCQkgICAgICAgYWRhcC0+bmFtZSk7CisJCQlpb3dyaXRlMzIoc3RhdCwgSTJDX1JFR19TVFMoYWxnX2RhdGEpKTsKKwkJfQorCX0KKworCWJ1c19yZXNldF9pZl9hY3RpdmUoYWRhcCk7CisKKwkvKiBDbGVhbnVwIHRvIGJlIHN1cmUuLi4gKi8KKwlhbGdfZGF0YS0+bWlmLmJ1ZiA9IE5VTEw7CisJYWxnX2RhdGEtPm1pZi5sZW4gPSAwOworCisJZGV2X2RiZygmYWRhcC0+ZGV2LCAiJXMoKTogZXhpdGluZywgc3RhdCA9ICV4XG4iLAorCQlfX0ZVTkNUSU9OX18sIGlvcmVhZDMyKEkyQ19SRUdfU1RTKGFsZ19kYXRhKSkpOworCisJaWYgKGNvbXBsZXRlZCAhPSBudW0pCisJCXJldHVybiAoKHJjIDwgMCkgPyByYyA6IC1FUkVNT1RFSU8pOworCisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIHUzMiBpMmNfcG54X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gcG54X2FsZ29yaXRobSA9IHsKKwkubWFzdGVyX3hmZXIgPSBpMmNfcG54X3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBpMmNfcG54X2Z1bmMsCit9OworCitzdGF0aWMgaW50IGkyY19wbnhfY29udHJvbGxlcl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICAgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBpMmNfcG54X2RhdGEgKmkyY19wbnggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlyZXR1cm4gaTJjX3BueC0+c3VzcGVuZChwZGV2LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3BueF9jb250cm9sbGVyX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpMmNfcG54X2RhdGEgKmkyY19wbnggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlyZXR1cm4gaTJjX3BueC0+cmVzdW1lKHBkZXYpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpMmNfcG54X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGkyY19wbnhfYWxnb19kYXRhICphbGdfZGF0YTsKKwlpbnQgZnJlcV9taHo7CisJc3RydWN0IGkyY19wbnhfZGF0YSAqaTJjX3BueCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCFpMmNfcG54IHx8ICFpMmNfcG54LT5hZGFwdGVyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBubyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjX3BueCk7CisKKwlpZiAoaTJjX3BueC0+Y2FsY3VsYXRlX2lucHV0X2ZyZXEpCisJCWZyZXFfbWh6ID0gaTJjX3BueC0+Y2FsY3VsYXRlX2lucHV0X2ZyZXEocGRldik7CisJZWxzZSB7CisJCWZyZXFfbWh6ID0gUE5YX0RFRkFVTFRfRlJFUTsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIlNldHRpbmcgYnVzIGZyZXF1ZW5jeSB0byBkZWZhdWx0IHZhbHVlOiAiCisJCSAgICAgICAiJWQgTUh6IiwgZnJlcV9taHopOworCX0KKworCWkyY19wbngtPmFkYXB0ZXItPmFsZ28gPSAmcG54X2FsZ29yaXRobTsKKworCWFsZ19kYXRhID0gaTJjX3BueC0+YWRhcHRlci0+YWxnb19kYXRhOworCWluaXRfdGltZXIoJmFsZ19kYXRhLT5taWYudGltZXIpOworCWFsZ19kYXRhLT5taWYudGltZXIuZnVuY3Rpb24gPSBpMmNfcG54X3RpbWVvdXQ7CisJYWxnX2RhdGEtPm1pZi50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaTJjX3BueC0+YWRhcHRlcjsKKworCS8qIFJlZ2lzdGVyIEkvTyByZXNvdXJjZSAqLworCWlmICghcmVxdWVzdF9yZWdpb24oYWxnX2RhdGEtPmJhc2UsIEkyQ19QTlhfUkVHSU9OX1NJWkUsIHBkZXYtPm5hbWUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJICAgICAgICJJL08gcmVnaW9uIDB4JTA4eCBmb3IgSTJDIGFscmVhZHkgaW4gdXNlLlxuIiwKKwkJICAgICAgIGFsZ19kYXRhLT5iYXNlKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZHJ2ZGF0YTsKKwl9CisKKwlpZiAoIShhbGdfZGF0YS0+aW9hZGRyID0KKwkJCSh1MzIpaW9yZW1hcChhbGdfZGF0YS0+YmFzZSwgSTJDX1BOWF9SRUdJT05fU0laRSkpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGlvcmVtYXAgSTJDIEkvTyByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWkyY19wbngtPnNldF9jbG9ja19ydW4ocGRldik7CisKKwkvKgorCSAqIENsb2NrIERpdmlzb3IgSGlnaCBUaGlzIHZhbHVlIGlzIHRoZSBudW1iZXIgb2Ygc3lzdGVtIGNsb2NrcworCSAqIHRoZSBzZXJpYWwgY2xvY2sgKFNDTCkgd2lsbCBiZSBoaWdoLgorCSAqIEZvciBleGFtcGxlLCBpZiB0aGUgc3lzdGVtIGNsb2NrIHBlcmlvZCBpcyA1MCBucyBhbmQgdGhlIG1heGltdW0KKwkgKiBkZXNpcmVkIHNlcmlhbCBwZXJpb2QgaXMgMTAwMDAgbnMgKDEwMCBrSHopLCB0aGVuIENMS0hJIHdvdWxkIGJlCisJICogc2V0IHRvIDAuNSooZl9zeXMvZl9pMmMpLTI9MC41KigyMGU2LzEwMGUzKS0yPTk4LiBUaGUgYWN0dWFsIHZhbHVlCisJICogcHJvZ3JhbW1lZCBpbnRvIENMS0hJIHdpbGwgdmFyeSBmcm9tIHRoaXMgc2xpZ2h0bHkgZHVlIHRvCisJICogdmFyaWF0aW9ucyBpbiB0aGUgb3V0cHV0IHBhZCdzIHJpc2UgYW5kIGZhbGwgdGltZXMgYXMgd2VsbCBhcworCSAqIHRoZSBkZWdsaXRjaGluZyBmaWx0ZXIgbGVuZ3RoLgorCSAqLworCisJdG1wID0gKChmcmVxX21oeiAqIDEwMDApIC8gSTJDX1BOWF9TUEVFRF9LSFopIC8gMiAtIDI7CisJaW93cml0ZTMyKHRtcCwgSTJDX1JFR19DS0goYWxnX2RhdGEpKTsKKwlpb3dyaXRlMzIodG1wLCBJMkNfUkVHX0NLTChhbGdfZGF0YSkpOworCisJaW93cml0ZTMyKG1jbnRybF9yZXNldCwgSTJDX1JFR19DVEwoYWxnX2RhdGEpKTsKKwlpZiAod2FpdF9yZXNldChJMkNfUE5YX1RJTUVPVVQsIGFsZ19kYXRhKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisJaW5pdF9jb21wbGV0aW9uKCZhbGdfZGF0YS0+bWlmLmNvbXBsZXRlKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGFsZ19kYXRhLT5pcnEsIGkyY19wbnhfaW50ZXJydXB0LAorCQkJMCwgcGRldi0+bmFtZSwgaTJjX3BueC0+YWRhcHRlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfY2xvY2s7CisKKwkvKiBSZWdpc3RlciB0aGlzIGFkYXB0ZXIgd2l0aCB0aGUgSTJDIHN1YnN5c3RlbSAqLworCWkyY19wbngtPmFkYXB0ZXItPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXJldCA9IGkyY19hZGRfYWRhcHRlcihpMmNfcG54LT5hZGFwdGVyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJMkM6IEZhaWxlZCB0byBhZGQgYnVzXG4iKTsKKwkJZ290byBvdXRfaXJxOworCX0KKworCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBNYXN0ZXIgYXQgJSM4eCwgaXJxICVkLlxuIiwKKwkgICAgICAgaTJjX3BueC0+YWRhcHRlci0+bmFtZSwgYWxnX2RhdGEtPmJhc2UsIGFsZ19kYXRhLT5pcnEpOworCisJcmV0dXJuIDA7CisKK291dF9pcnE6CisJZnJlZV9pcnEoYWxnX2RhdGEtPmlycSwgYWxnX2RhdGEpOworb3V0X2Nsb2NrOgorCWkyY19wbngtPnNldF9jbG9ja19zdG9wKHBkZXYpOworb3V0X3VubWFwOgorCWlvdW5tYXAoKHZvaWQgKilhbGdfZGF0YS0+aW9hZGRyKTsKK291dF9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uKGFsZ19kYXRhLT5iYXNlLCBJMkNfUE5YX1JFR0lPTl9TSVpFKTsKK291dF9kcnZkYXRhOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGkyY19wbnhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGkyY19wbnhfZGF0YSAqaTJjX3BueCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9IGkyY19wbngtPmFkYXB0ZXI7CisJc3RydWN0IGkyY19wbnhfYWxnb19kYXRhICphbGdfZGF0YSA9IGFkYXAtPmFsZ29fZGF0YTsKKworCWZyZWVfaXJxKGFsZ19kYXRhLT5pcnEsIGFsZ19kYXRhKTsKKwlpMmNfZGVsX2FkYXB0ZXIoYWRhcCk7CisJaTJjX3BueC0+c2V0X2Nsb2NrX3N0b3AocGRldik7CisJaW91bm1hcCgodm9pZCAqKWFsZ19kYXRhLT5pb2FkZHIpOworCXJlbGVhc2VfcmVnaW9uKGFsZ19kYXRhLT5iYXNlLCBJMkNfUE5YX1JFR0lPTl9TSVpFKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpMmNfcG54X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJwbngtaTJjIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBpMmNfcG54X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpMmNfcG54X3JlbW92ZSksCisJLnN1c3BlbmQgPSBpMmNfcG54X2NvbnRyb2xsZXJfc3VzcGVuZCwKKwkucmVzdW1lID0gaTJjX3BueF9jb250cm9sbGVyX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY19hZGFwX3BueF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaTJjX3BueF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJjX2FkYXBfcG54X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaTJjX3BueF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJWaXRhbHkgV29vbCwgRGVubmlzIEtvdmFsZXYgPHNvdXJjZUBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMgZHJpdmVyIGZvciBQaGlsaXBzIElQMzIwNC1iYXNlZCBJMkMgYnVzc2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBDT05GSUdfSTJDX1BOWF9FQVJMWQorLyogV2UgbmVlZCB0byBtYWtlIHN1cmUgSTJDIGlzIGluaXRpYWxpemVkIGJlZm9yZSBVU0IgKi8KK3N1YnN5c19pbml0Y2FsbChpMmNfYWRhcF9wbnhfaW5pdCk7CisjZWxzZQorbXVkdWxlX2luaXQoaTJjX2FkYXBfcG54X2luaXQpOworI2VuZGlmCittb2R1bGVfZXhpdChpMmNfYWRhcF9wbnhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXByb3NhdmFnZS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wcm9zYXZhZ2UuYwppbmRleCA3NzQ1ZTIxLi4wN2MxZjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXByb3NhdmFnZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHJvc2F2YWdlLmMKQEAgLTIxMiw3ICsyMTIsNyBAQAogCQlpZiAoY2hpcC0+aTJjX2J1c1tpXS5hZGFwX29rID09IDApCiAJCQljb250aW51ZTsKIAotCQlyZXQgPSBpMmNfYml0X2RlbF9idXMoJmNoaXAtPmkyY19idXNbaV0uYWRhcCk7CisJCXJldCA9IGkyY19kZWxfYWRhcHRlcigmY2hpcC0+aTJjX2J1c1tpXS5hZGFwKTsKIAkgICAgICAgIGlmIChyZXQpIHsKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgbm90IHJlbW92ZWRcbiIsCiAJCQkJY2hpcC0+aTJjX2J1c1tpXS5hZGFwLm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKaW5kZXggODEwNTBkMy4uYzNiMTU2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCkBAIC0yNzIsNyArMjcyLDggQEAKIAkJCWRldl9kYmcoJmkyYy0+YWRhcC5kZXYsICIlczogJWxkOiBJU1I9JTA4eCwgSUNSPSUwOHgsIElCTVI9JTAyeFxuIiwKIAkJCQlfX2Z1bmNfXywgKGxvbmcpamlmZmllcywgSVNSLCBJQ1IsIElCTVIpOwogCi0JCWlmICgoSVNSICYgKElTUl9VQnxJU1JfSUJCfElTUl9TQUQpKSA9PSBJU1JfU0FEIHx8CisJCWlmICgoSVNSICYgKElTUl9VQnxJU1JfSUJCKSkgPT0gMCB8fAorCQkgICAgKElTUiAmIElTUl9TQUQpICE9IDAgfHwKIAkJICAgIChJQ1IgJiBJQ1JfU0NMRSkgPT0gMCkgewogCQkJaWYgKGkyY19kZWJ1ZyA+IDEpCiAJCQkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CkBAIC0zNTcsMTMzICszNTgsNiBAQAogCiAjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKIC8qCi0gKiBJMkMgRUVQUk9NIGVtdWxhdGlvbi4KLSAqLwotc3RhdGljIHN0cnVjdCBpMmNfZWVwcm9tX2VtdSBlZXByb20gPSB7Ci0JLnNpemUgPSBJMkNfRUVQUk9NX0VNVV9TSVpFLAotCS53YXRjaCA9IExJU1RfSEVBRF9JTklUKGVlcHJvbS53YXRjaCksCi19OwotCi1zdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgKmkyY19weGFfZ2V0X2VlcHJvbSh2b2lkKQotewotCXJldHVybiAmZWVwcm9tOwotfQotCi1pbnQgaTJjX2VlcHJvbV9lbXVfYWRkd2F0Y2hlcihzdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgKmVtdSwgdm9pZCAqZGF0YSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCSAgICAgIHN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyICp3YXRjaGVyKQotewotCXN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaCAqd2F0Y2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChhZGRyICsgc2l6ZSA+IGVtdS0+c2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3YXRjaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaCksIEdGUF9LRVJORUwpOwotCWlmICh3YXRjaCkgewotCQl3YXRjaC0+c3RhcnQgPSBhZGRyOwotCQl3YXRjaC0+ZW5kID0gYWRkciArIHNpemUgLSAxOwotCQl3YXRjaC0+b3BzID0gd2F0Y2hlcjsKLQkJd2F0Y2gtPmRhdGEgPSBkYXRhOwotCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJbGlzdF9hZGQoJndhdGNoLT5ub2RlLCAmZW11LT53YXRjaCk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gd2F0Y2ggPyAwIDogLUVOT01FTTsKLX0KLQotdm9pZCBpMmNfZWVwcm9tX2VtdV9kZWx3YXRjaGVyKHN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqZW11LCB2b2lkICpkYXRhLAotCQkJICAgICAgIHN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyICp3YXRjaGVyKQotewotCXN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaCAqd2F0Y2gsICpuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIG4sICZlbXUtPndhdGNoLCBub2RlKSB7Ci0JCWlmICh3YXRjaC0+b3BzID09IHdhdGNoZXIgJiYgd2F0Y2gtPmRhdGEgPT0gZGF0YSkgewotCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkJbGlzdF9kZWwoJndhdGNoLT5ub2RlKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCWtmcmVlKHdhdGNoKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgaTJjX2VlcHJvbV9lbXVfZXZlbnQodm9pZCAqcHRyLCBpMmNfc2xhdmVfZXZlbnRfdCBldmVudCkKLXsKLQlzdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgKmVtdSA9IHB0cjsKLQotCWVlZGJnKDMsICJpMmNfZWVwcm9tX2VtdV9ldmVudDogJWRcbiIsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEkyQ19TTEFWRV9FVkVOVF9TVEFSVF9XUklURToKLQkJZW11LT5zZWVuX3N0YXJ0ID0gMTsKLQkJZWVkYmcoMiwgImkyY19lZXByb206IHdyaXRlIGluaXRpYXRlZFxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJMkNfU0xBVkVfRVZFTlRfU1RBUlRfUkVBRDoKLQkJZW11LT5zZWVuX3N0YXJ0ID0gMDsKLQkJZWVkYmcoMiwgImkyY19lZXByb206IHJlYWQgaW5pdGlhdGVkXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEkyQ19TTEFWRV9FVkVOVF9TVE9QOgotCQllbXUtPnNlZW5fc3RhcnQgPSAwOwotCQllZWRiZygyLCAiaTJjX2VlcHJvbTogcmVjZWl2ZWQgc3RvcFxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZWVkYmcoMCwgImkyY19lZXByb206IHVuaGFuZGxlZCBldmVudFxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBpMmNfZWVwcm9tX2VtdV9yZWFkKHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgKmVtdSA9IHB0cjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZW11LT5ieXRlc1tlbXUtPnB0cl07Ci0JZW11LT5wdHIgPSAoZW11LT5wdHIgKyAxKSAlIGVtdS0+c2l6ZTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGkyY19lZXByb21fZW11X3dyaXRlKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgKmVtdSA9IHB0cjsKLQlzdHJ1Y3QgaTJjX2VlcHJvbV9lbXVfd2F0Y2ggKndhdGNoOwotCi0JaWYgKGVtdS0+c2Vlbl9zdGFydCAhPSAwKSB7Ci0JCWVlZGJnKDIsICJpMmNfZWVwcm9tX2VtdV93cml0ZTogc2V0dGluZyBwdHIgJTAyeFxuIiwgdmFsKTsKLQkJZW11LT5wdHIgPSB2YWw7Ci0JCWVtdS0+c2Vlbl9zdGFydCA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQllbXUtPmJ5dGVzW2VtdS0+cHRyXSA9IHZhbDsKLQotCWVlZGJnKDEsICJpMmNfZWVwcm9tX2VtdV93cml0ZTogcHRyPTB4JTAyeCwgdmFsPTB4JTAyeFxuIiwKLQkgICAgICBlbXUtPnB0ciwgdmFsKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkod2F0Y2gsICZlbXUtPndhdGNoLCBub2RlKSB7Ci0JCWlmICghd2F0Y2gtPm9wcyB8fCAhd2F0Y2gtPm9wcy0+d3JpdGUpCi0JCQljb250aW51ZTsKLQkJaWYgKHdhdGNoLT5zdGFydCA8PSBlbXUtPnB0ciAmJiB3YXRjaC0+ZW5kID49IGVtdS0+cHRyKQotCQkJd2F0Y2gtPm9wcy0+d3JpdGUod2F0Y2gtPmRhdGEsIGVtdS0+cHRyLCB2YWwpOwotCX0KLQotCWVtdS0+cHRyID0gKGVtdS0+cHRyICsgMSkgJSBlbXUtPnNpemU7Ci19Ci0KLXN0cnVjdCBpMmNfc2xhdmVfY2xpZW50IGVlcHJvbV9jbGllbnQgPSB7Ci0JLmRhdGEJPSAmZWVwcm9tLAotCS5ldmVudAk9IGkyY19lZXByb21fZW11X2V2ZW50LAotCS5yZWFkCT0gaTJjX2VlcHJvbV9lbXVfcmVhZCwKLQkud3JpdGUJPSBpMmNfZWVwcm9tX2VtdV93cml0ZQotfTsKLQotLyoKICAqIFBYQSBJMkMgU2xhdmUgbW9kZQogICovCiAKQEAgLTQ5Miw3ICszNjYsMTAgQEAKIAlpZiAoaXNyICYgSVNSX0JFRCkgewogCQkvKiB3aGF0IHNob3VsZCB3ZSBkbyBoZXJlPyAqLwogCX0gZWxzZSB7Ci0JCWludCByZXQgPSBpMmMtPnNsYXZlLT5yZWFkKGkyYy0+c2xhdmUtPmRhdGEpOworCQlpbnQgcmV0ID0gMDsKKworCQlpZiAoaTJjLT5zbGF2ZSAhPSBOVUxMKQorCQkJcmV0ID0gaTJjLT5zbGF2ZS0+cmVhZChpMmMtPnNsYXZlLT5kYXRhKTsKIAogCQlJREJSID0gcmV0OwogCQlJQ1IgfD0gSUNSX1RCOyAgIC8qIGFsbG93IG5leHQgYnl0ZSAqLwpAQCAtOTU5LDExICs4MzYsOSBAQAogCWkyYy0+c2xhdmVfYWRkciA9IEkyQ19QWEFfU0xBVkVfQUREUjsKIAogI2lmZGVmIENPTkZJR19JMkNfUFhBX1NMQVZFCi0JaTJjLT5zbGF2ZSA9ICZlZXByb21fY2xpZW50OwogCWlmIChwbGF0KSB7CiAJCWkyYy0+c2xhdmVfYWRkciA9IHBsYXQtPnNsYXZlX2FkZHI7Ci0JCWlmIChwbGF0LT5zbGF2ZSkKLQkJCWkyYy0+c2xhdmUgPSBwbGF0LT5zbGF2ZTsKKwkJaTJjLT5zbGF2ZSA9IHBsYXQtPnNsYXZlOwogCX0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNhdmFnZTQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2F2YWdlNC5jCmluZGV4IDIwOWY0N2UuLjg0NGI0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2F2YWdlNC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2F2YWdlNC5jCkBAIC0xNzMsNyArMTczLDcgQEAKIAogc3RhdGljIHZvaWQgX19kZXZleGl0IHNhdmFnZTRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaTJjX2JpdF9kZWxfYnVzKCZzYXZhZ2U0X2kyY19hZGFwdGVyKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJnNhdmFnZTRfaTJjX2FkYXB0ZXIpOwogCWlvdW5tYXAoaW9hZGRyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12ZXJzYXRpbGUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmVyc2F0aWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxZDk1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmVyc2F0aWxlLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiAgaTJjLXZlcnNhdGlsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBBUk0gTHRkLgorICogIHdyaXR0ZW4gYnkgUnVzc2VsbCBLaW5nLCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgSTJDX0NPTlRST0wJMHgwMAorI2RlZmluZSBJMkNfQ09OVFJPTFMJMHgwMAorI2RlZmluZSBJMkNfQ09OVFJPTEMJMHgwNAorI2RlZmluZSBTQ0wJCSgxIDw8IDApCisjZGVmaW5lIFNEQQkJKDEgPDwgMSkKKworc3RydWN0IGkyY192ZXJzYXRpbGUgeworCXN0cnVjdCBpMmNfYWRhcHRlcgkgYWRhcDsKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgYWxnbzsKKwl2b2lkIF9faW9tZW0JCSAqYmFzZTsKK307CisKK3N0YXRpYyB2b2lkIGkyY192ZXJzYXRpbGVfc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaTJjX3ZlcnNhdGlsZSAqaTJjID0gZGF0YTsKKworCXdyaXRlbChTREEsIGkyYy0+YmFzZSArIChzdGF0ZSA/IEkyQ19DT05UUk9MUyA6IEkyQ19DT05UUk9MQykpOworfQorCitzdGF0aWMgdm9pZCBpMmNfdmVyc2F0aWxlX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGkyY192ZXJzYXRpbGUgKmkyYyA9IGRhdGE7CisKKwl3cml0ZWwoU0NMLCBpMmMtPmJhc2UgKyAoc3RhdGUgPyBJMkNfQ09OVFJPTFMgOiBJMkNfQ09OVFJPTEMpKTsKK30KKworc3RhdGljIGludCBpMmNfdmVyc2F0aWxlX2dldHNkYSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBpMmNfdmVyc2F0aWxlICppMmMgPSBkYXRhOworCXJldHVybiAhIShyZWFkbChpMmMtPmJhc2UgKyBJMkNfQ09OVFJPTCkgJiBTREEpOworfQorCitzdGF0aWMgaW50IGkyY192ZXJzYXRpbGVfZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGkyY192ZXJzYXRpbGUgKmkyYyA9IGRhdGE7CisJcmV0dXJuICEhKHJlYWRsKGkyYy0+YmFzZSArIEkyQ19DT05UUk9MKSAmIFNDTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgaTJjX3ZlcnNhdGlsZV9hbGdvID0geworCS5zZXRzZGEJPSBpMmNfdmVyc2F0aWxlX3NldHNkYSwKKwkuc2V0c2NsID0gaTJjX3ZlcnNhdGlsZV9zZXRzY2wsCisJLmdldHNkYQk9IGkyY192ZXJzYXRpbGVfZ2V0c2RhLAorCS5nZXRzY2wgPSBpMmNfdmVyc2F0aWxlX2dldHNjbCwKKwkudWRlbGF5CT0gMzAsCisJLnRpbWVvdXQgPSBIWiwKK307CisKK3N0YXRpYyBpbnQgaTJjX3ZlcnNhdGlsZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY192ZXJzYXRpbGUgKmkyYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IHJldDsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQgKyAxLCAidmVyc2F0aWxlLWkyYyIpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWkyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfdmVyc2F0aWxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpMmMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisKKwlpMmMtPmJhc2UgPSBpb3JlbWFwKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEpOworCWlmICghaTJjLT5iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJd3JpdGVsKFNDTCB8IFNEQSwgaTJjLT5iYXNlICsgSTJDX0NPTlRST0xTKTsKKworCWkyYy0+YWRhcC5vd25lciA9IFRISVNfTU9EVUxFOworCXN0cmxjcHkoaTJjLT5hZGFwLm5hbWUsICJWZXJzYXRpbGUgSTJDIGFkYXB0ZXIiLCBzaXplb2YoaTJjLT5hZGFwLm5hbWUpKTsKKwlpMmMtPmFkYXAuYWxnb19kYXRhID0gJmkyYy0+YWxnbzsKKwlpMmMtPmFkYXAuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKwlpMmMtPmFsZ28gPSBpMmNfdmVyc2F0aWxlX2FsZ287CisJaTJjLT5hbGdvLmRhdGEgPSBpMmM7CisKKwlyZXQgPSBpMmNfYml0X2FkZF9idXMoJmkyYy0+YWRhcCk7CisJaWYgKHJldCA+PSAwKSB7CisJCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaTJjKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW91bm1hcChpMmMtPmJhc2UpOworIGVycl9mcmVlOgorCWtmcmVlKGkyYyk7CisgZXJyX3JlbGVhc2U6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCByLT5lbmQgLSByLT5zdGFydCArIDEpOworIGVycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpMmNfdmVyc2F0aWxlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY192ZXJzYXRpbGUgKmkyYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCisJaTJjX2RlbF9hZGFwdGVyKCZpMmMtPmFkYXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpMmNfdmVyc2F0aWxlX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaTJjX3ZlcnNhdGlsZV9wcm9iZSwKKwkucmVtb3ZlCQk9IGkyY192ZXJzYXRpbGVfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2ZXJzYXRpbGUtaTJjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGkyY192ZXJzYXRpbGVfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmkyY192ZXJzYXRpbGVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGkyY192ZXJzYXRpbGVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpMmNfdmVyc2F0aWxlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGkyY192ZXJzYXRpbGVfaW5pdCk7Cittb2R1bGVfZXhpdChpMmNfdmVyc2F0aWxlX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFSTSBWZXJzYXRpbGUgSTJDIGJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYS5jCmluZGV4IDkxMGUyMDAuLjE1ZDdlMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWEuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2dDU4NmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaTJjX2JpdF9kZWxfYnVzKCZ2dDU4NmJfYWRhcHRlcik7CisJaTJjX2RlbF9hZGFwdGVyKCZ2dDU4NmJfYWRhcHRlcik7CiAJcmVsZWFzZV9yZWdpb24oSTJDX0RJUiwgSU9TUEFDRSk7CiAJcG1faW9fYmFzZSA9IDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZvb2RvbzMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdm9vZG9vMy5jCmluZGV4IDZjOGQyNTEuLmIwMzc3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdm9vZG9vMy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdm9vZG9vMy5jCkBAIC0yMTEsMTQgKzIxMSwxNCBAQAogCQlyZXR1cm4gcmV0dmFsOwogCXJldHZhbCA9IGkyY19iaXRfYWRkX2J1cygmdm9vZG9vM19kZGNfYWRhcHRlcik7CiAJaWYgKHJldHZhbCkKLQkJaTJjX2JpdF9kZWxfYnVzKCZ2b29kb28zX2kyY19hZGFwdGVyKTsKKwkJaTJjX2RlbF9hZGFwdGVyKCZ2b29kb28zX2kyY19hZGFwdGVyKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgdm9vZG9vM19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpMmNfYml0X2RlbF9idXMoJnZvb2RvbzNfaTJjX2FkYXB0ZXIpOwotIAlpMmNfYml0X2RlbF9idXMoJnZvb2RvbzNfZGRjX2FkYXB0ZXIpOworCWkyY19kZWxfYWRhcHRlcigmdm9vZG9vM19pMmNfYWRhcHRlcik7CisJaTJjX2RlbF9hZGFwdGVyKCZ2b29kb28zX2RkY19hZGFwdGVyKTsKIAlpb3VubWFwKGlvYWRkcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jCmluZGV4IDMyYWFiMGQuLjcxNGJhZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYwpAQCAtNDk0LDExICs0OTQsMTIgQEAKIAlpZmFjZS0+cGRldiA9IHBkZXY7CiAJaWZhY2UtPmJhciA9IGJhcjsKIAotCXBjaV9lbmFibGVfZGV2aWNlX2JhcnMoaWZhY2UtPnBkZXYsIDEgPDwgaWZhY2UtPmJhcik7CisJcmMgPSBwY2lfZW5hYmxlX2RldmljZV9iYXJzKGlmYWNlLT5wZGV2LCAxIDw8IGlmYWNlLT5iYXIpOworCWlmIChyYykKKwkJZ290byBlcnJvdXRfZnJlZTsKIAogCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9uKGlmYWNlLT5wZGV2LCBpZmFjZS0+YmFyLCBpZmFjZS0+YWRhcHRlci5uYW1lKTsKLQotCWlmIChyYyAhPSAwKSB7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IGNhbid0IGFsbG9jYXRlIFBDSSBCQVIgJWRcbiIsCiAJCQkJaWZhY2UtPmJhcik7CiAJCWdvdG8gZXJyb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2kyYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9pMmMuYwppbmRleCA4ZGRiYWU0Li42Y2Q5NmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2kyYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfaTJjLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCiBzdGF0aWMgdm9pZCBzY3gyMDBfaTJjX2NsZWFudXAodm9pZCkKIHsKLQlpMmNfYml0X2RlbF9idXMoJnNjeDIwMF9pMmNfb3BzKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJnNjeDIwMF9pMmNfb3BzKTsKIH0KIAogbW9kdWxlX2luaXQoc2N4MjAwX2kyY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTMzNy5jIGIvZHJpdmVycy9pMmMvY2hpcHMvZHMxMzM3LmMKaW5kZXggOTNkNDgzYi4uZWMxN2Q2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvZHMxMzM3LmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvZHMxMzM3LmMKQEAgLTM0NywxMyArMzQ3LDE5IEBACiAKIAlpZiAoKHN0YXR1cyAmIDB4ODApIHx8IChjb250cm9sICYgMHg4MCkpIHsKIAkJLyogUlRDIG5vdCBydW5uaW5nICovCi0JCXU4IGJ1ZlsxNl07CisJCXU4IGJ1ZlsxKzE2XTsJLyogRmlyc3QgYnl0ZSBpcyBpbnRlcnByZXRlZCBhcyBhZGRyZXNzICovCiAJCXN0cnVjdCBpMmNfbXNnIG1zZ1sxXTsKIAogCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiBSVEMgbm90IHJ1bm5pbmchXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJCS8qIEluaXRpYWxpemUgYWxsLCBpbmNsdWRpbmcgU1RBVFVTIGFuZCBDT05UUk9MIHRvIHplcm8gKi8KIAkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJCS8qIFdyaXRlIHZhbGlkIHZhbHVlcyBpbiB0aGUgZGF0ZS90aW1lIHJlZ2lzdGVycyAqLworCQlidWZbMStEUzEzMzdfUkVHX0RBWV0gPSAxOworCQlidWZbMStEUzEzMzdfUkVHX0RBVEVdID0gMTsKKwkJYnVmWzErRFMxMzM3X1JFR19NT05USF0gPSAxOworCiAJCW1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOwogCQltc2dbMF0uZmxhZ3MgPSAwOwogCQltc2dbMF0ubGVuID0gc2l6ZW9mKGJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9kczEzNzQuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTM3NC5jCmluZGV4IDQ2MzBmMTkuLjE1ZWRmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTM3NC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTM3NC5jCkBAIC0xNDAsMTIgKzE0MCwxNCBAQAogCXJldHVybiB0MTsKIH0KIAotc3RhdGljIHZvaWQgZHMxMzc0X3NldF93b3JrKHZvaWQgKmFyZykKK3N0YXRpYyB1bG9uZyBuZXdfdGltZTsKKworc3RhdGljIHZvaWQgZHMxMzc0X3NldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bG9uZyB0MSwgdDI7CiAJaW50IGxpbWl0ID0gMTA7CQkvKiBhcmJpdHJhcnkgcmV0cnkgbGltaXQgKi8KIAotCXQxID0gKih1bG9uZyAqKSBhcmc7CisJdDEgPSBuZXdfdGltZTsKIAogCW11dGV4X2xvY2soJmRzMTM3NF9tdXRleCk7CiAKQEAgLTE2NywxMSArMTY5LDkgQEAKIAkJCSAiY2FuJ3QgY29uZmlybSB0aW1lIHNldCBmcm9tIHJ0YyBjaGlwXG4iKTsKIH0KIAotc3RhdGljIHVsb25nIG5ld190aW1lOwotCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmRzMTM3NF93b3JrcXVldWU7CiAKLXN0YXRpYyBERUNMQVJFX1dPUksoZHMxMzc0X3dvcmssIGRzMTM3NF9zZXRfd29yaywgJm5ld190aW1lKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoZHMxMzc0X3dvcmssIGRzMTM3NF9zZXRfd29yayk7CiAKIGludCBkczEzNzRfc2V0X3J0Y190aW1lKHVsb25nIG5vd3RpbWUpCiB7CkBAIC0xODAsNyArMTgwLDcgQEAKIAlpZiAoaW5faW50ZXJydXB0KCkpCiAJCXF1ZXVlX3dvcmsoZHMxMzc0X3dvcmtxdWV1ZSwgJmRzMTM3NF93b3JrKTsKIAllbHNlCi0JCWRzMTM3NF9zZXRfd29yaygmbmV3X3RpbWUpOworCQlkczEzNzRfc2V0X3dvcmsoTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKaW5kZXggMmRkMGEzNC4uNDIwMzc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKQEAgLTIxNSw4ICsyMTUsMTUgQEAKIH0KIAogc3RhdGljIHVsb25nIG5ld190aW1lOworLyogd2VsbCwgaXNuJ3QgdGhpcyBBUEkganVzdCBfbG92ZWx5Xz8gKi8KK3N0YXRpYyB2b2lkCittNDF0MDBfYmFyZihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNhYmxlKQoreworCW00MXQwMF9zZXQoJm5ld190aW1lKTsKK30KKwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptNDF0MDBfd3E7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKG00MXQwMF93b3JrLCBtNDF0MDBfc2V0LCAmbmV3X3RpbWUpOworc3RhdGljIERFQ0xBUkVfV09SSyhtNDF0MDBfd29yaywgbTQxdDAwX2JhcmYpOwogCiBpbnQKIG00MXQwMF9zZXRfcnRjX3RpbWUodWxvbmcgbm93dGltZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCmluZGV4IDYwYmVmOTQuLjRlZTU2ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYwpAQCAtODIsNyArODIsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50CWNsaWVudDsKIAlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CiAJaW50CQkJaXJxOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsJd29yazsKIAlzdHJ1Y3QgZGVudHJ5CQkqZmlsZTsKIAl1bnNpZ25lZAkJY2hhcmdpbmc6MTsKIAl1bnNpZ25lZAkJcG9yOjE7CkBAIC0zMjgsNyArMzI4LDcgQEAKIHsKIAl1OCB0bXAgPSAwLCBtYXNrLCBwb2xsOwogCi0JLyogSVJRcyB3b24ndCB0cmlnZ2VyIGlycXMgZm9yIGNlcnRhaW4gZXZlbnRzLCBidXQgd2UgY2FuIGdldAorCS8qIElSUXMgd29uJ3QgdHJpZ2dlciBmb3IgY2VydGFpbiBldmVudHMsIGJ1dCB3ZSBjYW4gZ2V0CiAJICogb3RoZXJzIGJ5IHBvbGxpbmcgKG5vcm1hbGx5LCB3aXRoIGV4dGVybmFsIHBvd2VyIGFwcGxpZWQpLgogCSAqLwogCXBvbGwgPSAwOwpAQCAtNDExLDEwICs0MTEsMTEgQEAKIH0KIAogLyogaGFuZGxlIElSUXMgYW5kIHBvbGxpbmcgdXNpbmcga2V2ZW50ZCBmb3Igbm93ICovCi1zdGF0aWMgdm9pZCB0cHM2NTAxMF93b3JrKHZvaWQgKl90cHMpCitzdGF0aWMgdm9pZCB0cHM2NTAxMF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgdHBzNjUwMTAJCSp0cHMgPSBfdHBzOworCXN0cnVjdCB0cHM2NTAxMAkJKnRwczsKIAorCXRwcyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHBzNjUwMTAsIHdvcmsud29yayk7CiAJbXV0ZXhfbG9jaygmdHBzLT5sb2NrKTsKIAogCXRwczY1MDEwX2ludGVycnVwdCh0cHMpOwpAQCAtNDUyLDcgKzQ1Myw3IEBACiAKIAlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKIAlzZXRfYml0KEZMQUdfSVJRX0VOQUJMRSwgJnRwcy0+ZmxhZ3MpOwotCSh2b2lkKSBzY2hlZHVsZV93b3JrKCZ0cHMtPndvcmspOworCSh2b2lkKSBzY2hlZHVsZV93b3JrKCZ0cHMtPndvcmsud29yayk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC00NjUsMTMgKzQ2NiwxNSBAQAogCXN0cnVjdCB0cHM2NTAxMAkJKnRwczsKIAogCXRwcyA9IGNvbnRhaW5lcl9vZihjbGllbnQsIHN0cnVjdCB0cHM2NTAxMCwgY2xpZW50KTsKKwlmcmVlX2lycSh0cHMtPmlycSwgdHBzKTsKICNpZmRlZglDT05GSUdfQVJNCiAJaWYgKG1hY2hpbmVfaXNfb21hcF9oMigpKQogCQlvbWFwX2ZyZWVfZ3Bpbyg1OCk7CiAJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkKIAkJb21hcF9mcmVlX2dwaW8oT01BUF9NUFVJTygxKSk7CiAjZW5kaWYKLQlmcmVlX2lycSh0cHMtPmlycSwgdHBzKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZ0cHMtPndvcmspOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAJZGVidWdmc19yZW1vdmUodHBzLT5maWxlKTsKIAlpZiAoaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSA9PSAwKQogCQlrZnJlZSh0cHMpOwpAQCAtNTA1LDcgKzUwOCw3IEBACiAJCXJldHVybiAwOwogCiAJbXV0ZXhfaW5pdCgmdHBzLT5sb2NrKTsKLQlJTklUX1dPUksoJnRwcy0+d29yaywgdHBzNjUwMTBfd29yaywgdHBzKTsKKwlJTklUX0RFTEFZRURfV09SSygmdHBzLT53b3JrLCB0cHM2NTAxMF93b3JrKTsKIAl0cHMtPmlycSA9IC0xOwogCXRwcy0+Y2xpZW50LmFkZHIgPSBhZGRyZXNzOwogCXRwcy0+Y2xpZW50LmFkYXB0ZXIgPSBidXM7CkBAIC02MjAsNyArNjIzLDcgQEAKIAkodm9pZCkgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSgmdHBzLT5jbGllbnQsIFRQU19NQVNLMywgMHgwZgogCQl8IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdHBzLT5jbGllbnQsIFRQU19NQVNLMykpOwogCi0JdHBzNjUwMTBfd29yayh0cHMpOworCXRwczY1MDEwX3dvcmsoJnRwcy0+d29yay53b3JrKTsKIAogCXRwcy0+ZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoRFJJVkVSX05BTUUsIFNfSVJVR08sIE5VTEwsCiAJCQkJdHBzLCBERUJVR19GT1BTKTsKQEAgLTY3Miw3ICs2NzUsNyBAQAogCQkJJiYgdGVzdF9hbmRfc2V0X2JpdCgKIAkJCQlGTEFHX1ZCVVNfQ0hBTkdFRCwgJnRoZV90cHMtPmZsYWdzKSkgewogCQkvKiBnYWRnZXQgZHJpdmVycyBjYWxsIHRoaXMgaW5faXJxKCkgKi8KLQkJKHZvaWQpIHNjaGVkdWxlX3dvcmsoJnRoZV90cHMtPndvcmspOworCQkodm9pZCkgc2NoZWR1bGVfd29yaygmdGhlX3Rwcy0+d29yay53b3JrKTsKIAl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwppbmRleCA3Y2E4MWY0Li4zZTMxZjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCisrKyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKQEAgLTEyNywyMCArMTI3LDE3IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNsaWVudC0+bmFtZSk7CiB9CiAKLS8qIAotICogV2UgY2FuJ3QgdXNlIHRoZSBERVZJQ0VfQVRUUigpIG1hY3JvIGhlcmUgYXMgd2Ugd2FudCB0aGUgc2FtZSBmaWxlbmFtZSBmb3IgYQotICogZGlmZmVyZW50IHR5cGUgb2YgYSBkZXZpY2UuICBTbyBiZXdhcmUgaWYgdGhlIERFVklDRV9BVFRSKCkgbWFjcm8gZXZlcgotICogY2hhbmdlcywgdGhpcyBkZWZpbml0aW9uIHdpbGwgYWxzbyBoYXZlIHRvIGNoYW5nZS4KKy8qCisgKiBXZSBjYW4ndCB1c2UgdGhlIERFVklDRV9BVFRSKCkgbWFjcm8gaGVyZSwgYXMgd2UgdXNlZCB0aGUgc2FtZSBuYW1lIGZvcgorICogYW4gaTJjIGFkYXB0ZXIgYXR0cmlidXRlIChhYm92ZSkuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9jbGllbnRfbmFtZSA9IHsKLQkuYXR0cgk9IHsubmFtZSA9ICJuYW1lIiwgLm1vZGUgPSBTX0lSVUdPLCAub3duZXIgPSBUSElTX01PRFVMRSB9LAotCS5zaG93CT0gJnNob3dfY2xpZW50X25hbWUsCi19Oworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2NsaWVudF9uYW1lID0KKwlfX0FUVFIobmFtZSwgU19JUlVHTywgJnNob3dfY2xpZW50X25hbWUsIE5VTEwpOwogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCiAvKiAtLS0tLQpAQCAtMzE0LDcgKzMxMSw3IEBACiAJcmVzID0gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CiAJaWYgKHJlcykKIAkJcmV0dXJuIHJlczsKLQkKKwogCW11dGV4X2xvY2soJmNvcmVfbGlzdHMpOwogCiAJbGlzdF9hZGRfdGFpbCgmZHJpdmVyLT5saXN0LCZkcml2ZXJzKTsKQEAgLTMzOCwxMyArMzM1LDEzIEBACiAJc3RydWN0IGxpc3RfaGVhZCAgICppdGVtMSwgKml0ZW0yLCAqX247CiAJc3RydWN0IGkyY19jbGllbnQgICpjbGllbnQ7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOwotCQorCiAJaW50IHJlcyA9IDA7CiAKIAltdXRleF9sb2NrKCZjb3JlX2xpc3RzKTsKIAogCS8qIEhhdmUgYSBsb29rIGF0IGVhY2ggYWRhcHRlciwgaWYgY2xpZW50cyBvZiB0aGlzIGRyaXZlciBhcmUgc3RpbGwKLQkgKiBhdHRhY2hlZC4gSWYgc28sIGRldGFjaCB0aGVtIHRvIGJlIGFibGUgdG8ga2lsbCB0aGUgZHJpdmVyIAorCSAqIGF0dGFjaGVkLiBJZiBzbywgZGV0YWNoIHRoZW0gdG8gYmUgYWJsZSB0byBraWxsIHRoZSBkcml2ZXIKIAkgKiBhZnRlcndhcmRzLgogCSAqLwogCWxpc3RfZm9yX2VhY2goaXRlbTEsJmFkYXB0ZXJzKSB7CkBAIC00MTksMTQgKzQxNiwxNCBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+bGlzdCwmYWRhcHRlci0+Y2xpZW50cyk7Ci0JCisKIAljbGllbnQtPnVzYWdlX2NvdW50ID0gMDsKIAogCWNsaWVudC0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmFkYXB0ZXItPmRldjsKIAljbGllbnQtPmRldi5kcml2ZXIgPSAmY2xpZW50LT5kcml2ZXItPmRyaXZlcjsKIAljbGllbnQtPmRldi5idXMgPSAmaTJjX2J1c190eXBlOwogCWNsaWVudC0+ZGV2LnJlbGVhc2UgPSAmaTJjX2NsaWVudF9yZWxlYXNlOwotCQorCiAJc25wcmludGYoJmNsaWVudC0+ZGV2LmJ1c19pZFswXSwgc2l6ZW9mKGNsaWVudC0+ZGV2LmJ1c19pZCksCiAJCSIlZC0lMDR4IiwgaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGNsaWVudC0+YWRkcik7CiAJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiY2xpZW50IFslc10gcmVnaXN0ZXJlZCB3aXRoIGJ1cyBpZCAlc1xuIiwKQEAgLTQ2Nyw3ICs0NjQsNyBAQAogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKIAlpbnQgcmVzID0gMDsKLQkKKwogCWlmIChjbGllbnQtPnVzYWdlX2NvdW50ID4gMCkgewogCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJDbGllbnQgWyVzXSBzdGlsbCBidXN5LCAiCiAJCQkgImNhbid0IGRldGFjaFxuIiwgY2xpZW50LT5uYW1lKTsKQEAgLTUzNSwxMCArNTMyLDEwIEBACiAJCQkgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9Ci0JCisKIAljbGllbnQtPnVzYWdlX2NvdW50LS07CiAJaTJjX2RlY191c2VfY2xpZW50KGNsaWVudCk7Ci0JCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjAzLDcgKzYwMCw3IEBACiAJCX0KICNlbmRpZgogCi0JCW11dGV4X2xvY2soJmFkYXAtPmJ1c19sb2NrKTsKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmFkYXAtPmJ1c19sb2NrLCBhZGFwLT5sZXZlbCk7CiAJCXJldCA9IGFkYXAtPmFsZ28tPm1hc3Rlcl94ZmVyKGFkYXAsbXNncyxudW0pOwogCQltdXRleF91bmxvY2soJmFkYXAtPmJ1c19sb2NrKTsKIApAQCAtNjI0LDcgKzYyMSw3IEBACiAJbXNnLmZsYWdzID0gY2xpZW50LT5mbGFncyAmIEkyQ19NX1RFTjsKIAltc2cubGVuID0gY291bnQ7CiAJbXNnLmJ1ZiA9IChjaGFyICopYnVmOwotCQorCiAJcmV0ID0gaTJjX3RyYW5zZmVyKGFkYXAsICZtc2csIDEpOwogCiAJLyogSWYgZXZlcnl0aGluZyB3ZW50IG9rIChpLmUuIDEgbXNnIHRyYW5zbWl0dGVkKSwgcmV0dXJuICNieXRlcwpAQCAtNzU3LDcgKzc1NCw3IEBACiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19RVUlDSykpIHsKIAkJaWYgKGFkZHJlc3NfZGF0YS0+cHJvYmVbMF0gPT0gSTJDX0NMSUVOVF9FTkQKIAkJICYmIGFkZHJlc3NfZGF0YS0+bm9ybWFsX2kyY1swXSA9PSBJMkNfQ0xJRU5UX0VORCkKLQkJIAlyZXR1cm4gMDsKKwkJCXJldHVybiAwOwogCiAJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJTTUJ1cyBRdWljayBjb21tYW5kIG5vdCBzdXBwb3J0ZWQsICIKIAkJCSAiY2FuJ3QgcHJvYmUgZm9yIGNoaXBzXG4iKTsKQEAgLTgxNyw3ICs4MTQsNyBAQAogc3RydWN0IGkyY19hZGFwdGVyKiBpMmNfZ2V0X2FkYXB0ZXIoaW50IGlkKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKLQkKKwogCW11dGV4X2xvY2soJmNvcmVfbGlzdHMpOwogCWFkYXB0ZXIgPSAoc3RydWN0IGkyY19hZGFwdGVyICopaWRyX2ZpbmQoJmkyY19hZGFwdGVyX2lkciwgaWQpOwogCWlmIChhZGFwdGVyICYmICF0cnlfbW9kdWxlX2dldChhZGFwdGVyLT5vd25lcikpCkBAIC04MzQsMTQgKzgzMSwxNCBAQAogCiAvKiBUaGUgU01CdXMgcGFydHMgKi8KIAotI2RlZmluZSBQT0xZICAgICgweDEwNzBVIDw8IDMpIAorI2RlZmluZSBQT0xZICAgICgweDEwNzBVIDw8IDMpCiBzdGF0aWMgdTgKIGNyYzgodTE2IGRhdGEpCiB7CiAJaW50IGk7Ci0gIAorCiAJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmIChkYXRhICYgMHg4MDAwKSAKKwkJaWYgKGRhdGEgJiAweDgwMDApCiAJCQlkYXRhID0gZGF0YSBeIFBPTFk7CiAJCWRhdGEgPSBkYXRhIDw8IDE7CiAJfQpAQCAtODkxLDEzICs4ODgsMTMgQEAKIAkJCXJwZWMsIGNwZWMpOwogCQlyZXR1cm4gLTE7CiAJfQotCXJldHVybiAwOwkKKwlyZXR1cm4gMDsKIH0KIAogczMyIGkyY19zbWJ1c193cml0ZV9xdWljayhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCB2YWx1ZSkKIHsKIAlyZXR1cm4gaTJjX3NtYnVzX3hmZXIoY2xpZW50LT5hZGFwdGVyLGNsaWVudC0+YWRkcixjbGllbnQtPmZsYWdzLAotIAkgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsMCxJMkNfU01CVVNfUVVJQ0ssTlVMTCk7CisJICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLDAsSTJDX1NNQlVTX1FVSUNLLE5VTEwpOwogfQogCiBzMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpAQCAtOTk2LDExICs5OTMsMTEgQEAKIAkJCSAgICAgIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQSwgJmRhdGEpOwogfQogCi0vKiBTaW11bGF0ZSBhIFNNQnVzIGNvbW1hbmQgdXNpbmcgdGhlIGkyYyBwcm90b2NvbCAKKy8qIFNpbXVsYXRlIGEgU01CdXMgY29tbWFuZCB1c2luZyB0aGUgaTJjIHByb3RvY29sCiAgICBObyBjaGVja2luZyBvZiBwYXJhbWV0ZXJzIGlzIGRvbmUhICAqLwotc3RhdGljIHMzMiBpMmNfc21idXNfeGZlcl9lbXVsYXRlZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyLCB1MTYgYWRkciwgCitzdGF0aWMgczMyIGkyY19zbWJ1c194ZmVyX2VtdWxhdGVkKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFkYXB0ZXIsIHUxNiBhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKIHsKIAkvKiBTbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgc2VyaWVzIG9mIG1zZ3MuIEluIHRoZSBjYXNlIG9mIHdyaXRpbmcsIHdlCkBAIC0xMDEwLDcgKzEwMDcsNyBAQAogCXVuc2lnbmVkIGNoYXIgbXNnYnVmMFtJMkNfU01CVVNfQkxPQ0tfTUFYKzNdOwogCXVuc2lnbmVkIGNoYXIgbXNnYnVmMVtJMkNfU01CVVNfQkxPQ0tfTUFYKzJdOwogCWludCBudW0gPSByZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEPzI6MTsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7IHsgYWRkciwgZmxhZ3MsIDEsIG1zZ2J1ZjAgfSwgCisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geyB7IGFkZHIsIGZsYWdzLCAxLCBtc2didWYwIH0sCiAJICAgICAgICAgICAgICAgICAgICAgICAgICB7IGFkZHIsIGZsYWdzIHwgSTJDX01fUkQsIDAsIG1zZ2J1ZjEgfQogCSAgICAgICAgICAgICAgICAgICAgICAgIH07CiAJaW50IGk7CkBAIC0xMTAzLDE0ICsxMTAwLDE0IEBACiAJaWYgKGkpIHsKIAkJLyogQ29tcHV0ZSBQRUMgaWYgZmlyc3QgbWVzc2FnZSBpcyBhIHdyaXRlICovCiAJCWlmICghKG1zZ1swXS5mbGFncyAmIEkyQ19NX1JEKSkgewotCQkgCWlmIChudW0gPT0gMSkgLyogV3JpdGUgb25seSAqLworCQkJaWYgKG51bSA9PSAxKSAvKiBXcml0ZSBvbmx5ICovCiAJCQkJaTJjX3NtYnVzX2FkZF9wZWMoJm1zZ1swXSk7CiAJCQllbHNlIC8qIFdyaXRlIGZvbGxvd2VkIGJ5IHJlYWQgKi8KIAkJCQlwYXJ0aWFsX3BlYyA9IGkyY19zbWJ1c19tc2dfcGVjKDAsICZtc2dbMF0pOwogCQl9CiAJCS8qIEFzayBmb3IgUEVDIGlmIGxhc3QgbWVzc2FnZSBpcyBhIHJlYWQgKi8KIAkJaWYgKG1zZ1tudW0tMV0uZmxhZ3MgJiBJMkNfTV9SRCkKLQkJIAltc2dbbnVtLTFdLmxlbisrOworCQkJbXNnW251bS0xXS5sZW4rKzsKIAl9CiAKIAlpZiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZywgbnVtKSA8IDApCkBAIC0xMTMwLDcgKzExMjcsNyBAQAogCQkJY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgogCQkJCWRhdGEtPmJ5dGUgPSBtc2didWYxWzBdOwogCQkJCWJyZWFrOwotCQkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOiAKKwkJCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKIAkJCWNhc2UgSTJDX1NNQlVTX1BST0NfQ0FMTDoKIAkJCQlkYXRhLT53b3JkID0gbXNnYnVmMVswXSB8IChtc2didWYxWzFdIDw8IDgpOwogCQkJCWJyZWFrOwpAQCAtMTE0Niw3ICsxMTQzLDcgQEAKIAogCiBzMzIgaTJjX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcHRlciwgdTE2IGFkZHIsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAotICAgICAgICAgICAgICAgICAgIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwgaW50IHNpemUsIAorICAgICAgICAgICAgICAgICAgIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQogewogCXMzMiByZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtZGV2LmMgYi9kcml2ZXJzL2kyYy9pMmMtZGV2LmMKaW5kZXggM2Y4NjkwMy4uYWM1YmQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWRldi5jCisrKyBiL2RyaXZlcnMvaTJjL2kyYy1kZXYuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgaTJjLWRldi5jIC0gaTJjLWJ1cyBkcml2ZXIsIGNoYXIgZGV2aWNlIGludGVyZmFjZSAgCisgICAgaTJjLWRldi5jIC0gaTJjLWJ1cyBkcml2ZXIsIGNoYXIgZGV2aWNlIGludGVyZmFjZQogCiAgICAgQ29weXJpZ2h0IChDKSAxOTk1LTk3IFNpbW9uIEcuIFZvZ2wKICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtOTkgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPgpAQCAtNDIsNyArNDIsNyBAQAogc3RydWN0IGkyY19kZXYgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKIH07CiAKICNkZWZpbmUgSTJDX01JTk9SUwkyNTYKQEAgLTkwLDE3ICs5MCwxOSBAQAogCXNwaW5fbG9jaygmaTJjX2Rldl9saXN0X2xvY2spOwogCWxpc3RfZGVsKCZpMmNfZGV2LT5saXN0KTsKIAlzcGluX3VubG9jaygmaTJjX2Rldl9saXN0X2xvY2spOworCWtmcmVlKGkyY19kZXYpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2FkYXB0ZXJfbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWRhcHRlcl9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2RldiAqaTJjX2RldiA9IGkyY19kZXZfZ2V0X2J5X21pbm9yKE1JTk9SKGNsYXNzX2Rldi0+ZGV2dCkpOworCXN0cnVjdCBpMmNfZGV2ICppMmNfZGV2ID0gaTJjX2Rldl9nZXRfYnlfbWlub3IoTUlOT1IoZGV2LT5kZXZ0KSk7CiAKIAlpZiAoIWkyY19kZXYpCiAJCXJldHVybiAtRU5PREVWOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBpMmNfZGV2LT5hZGFwLT5uYW1lKTsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X2FkYXB0ZXJfbmFtZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19hZGFwdGVyX25hbWUsIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCBpMmNkZXZfcmVhZCAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgKm9mZnNldCkKQEAgLTExOCw3ICsxMjAsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXByX2RlYnVnKCJpMmMtZGV2OiBpMmMtJWQgcmVhZGluZyAlemQgYnl0ZXMuXG4iLAotCQlpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLCBjb3VudCk7CisJCWltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSwgY291bnQpOwogCiAJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCx0bXAsY291bnQpOwogCWlmIChyZXQgPj0gMCkKQEAgLTE0Niw3ICsxNDgsNyBAQAogCX0KIAogCXByX2RlYnVnKCJpMmMtZGV2OiBpMmMtJWQgd3JpdGluZyAlemQgYnl0ZXMuXG4iLAotCQlpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLCBjb3VudCk7CisJCWltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSwgY291bnQpOwogCiAJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCx0bXAsY291bnQpOwogCWtmcmVlKHRtcCk7CkBAIC0xNzEsNyArMTczLDcgQEAKIAlzd2l0Y2ggKCBjbWQgKSB7CiAJY2FzZSBJMkNfU0xBVkU6CiAJY2FzZSBJMkNfU0xBVkVfRk9SQ0U6Ci0JCWlmICgoYXJnID4gMHgzZmYpIHx8IAorCQlpZiAoKGFyZyA+IDB4M2ZmKSB8fAogCQkgICAgKCgoY2xpZW50LT5mbGFncyAmIEkyQ19NX1RFTikgPT0gMCkgJiYgYXJnID4gMHg3ZikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKChjbWQgPT0gSTJDX1NMQVZFKSAmJiBpMmNfY2hlY2tfYWRkcihjbGllbnQtPmFkYXB0ZXIsYXJnKSkKQEAgLTE5MiwxMiArMTk0LDExIEBACiAJCXJldHVybiAwOwogCWNhc2UgSTJDX0ZVTkNTOgogCQlmdW5jcyA9IGkyY19nZXRfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIpOwotCQlyZXR1cm4gKGNvcHlfdG9fdXNlcigodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcsICZmdW5jcywKLQkJICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSk/LUVGQVVMVDowOworCQlyZXR1cm4gcHV0X3VzZXIoZnVuY3MsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZyk7CiAKIAljYXNlIEkyQ19SRFdSOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnJkd3JfYXJnLCAKLQkJCQkgICAoc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgX191c2VyICopYXJnLCAKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZHdyX2FyZywKKwkJCQkgICAoc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgX191c2VyICopYXJnLAogCQkJCSAgIHNpemVvZihyZHdyX2FyZykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTIwNSw5ICsyMDYsOSBAQAogCQkgKiBiZSBzZW50IGF0IG9uY2UgKi8KIAkJaWYgKHJkd3JfYXJnLm5tc2dzID4gSTJDX1JEUldfSU9DVExfTUFYX01TR1MpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCisKIAkJcmR3cl9wYSA9IChzdHJ1Y3QgaTJjX21zZyAqKQotCQkJa21hbGxvYyhyZHdyX2FyZy5ubXNncyAqIHNpemVvZihzdHJ1Y3QgaTJjX21zZyksIAorCQkJa21hbGxvYyhyZHdyX2FyZy5ubXNncyAqIHNpemVvZihzdHJ1Y3QgaTJjX21zZyksCiAJCQlHRlBfS0VSTkVMKTsKIAogCQlpZiAocmR3cl9wYSA9PSBOVUxMKSByZXR1cm4gLUVOT01FTTsKQEAgLTI3Nyw5ICsyNzgsOSBAQAogCQkgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBpMmNfc21idXNfaW9jdGxfZGF0YSBfX3VzZXIgKikgYXJnLAogCQkgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpMmNfc21idXNfaW9jdGxfZGF0YSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICgoZGF0YV9hcmcuc2l6ZSAhPSBJMkNfU01CVVNfQllURSkgJiYgCisJCWlmICgoZGF0YV9hcmcuc2l6ZSAhPSBJMkNfU01CVVNfQllURSkgJiYKIAkJICAgIChkYXRhX2FyZy5zaXplICE9IEkyQ19TTUJVU19RVUlDSykgJiYKLQkJICAgIChkYXRhX2FyZy5zaXplICE9IEkyQ19TTUJVU19CWVRFX0RBVEEpICYmIAorCQkgICAgKGRhdGFfYXJnLnNpemUgIT0gSTJDX1NNQlVTX0JZVEVfREFUQSkgJiYKIAkJICAgIChkYXRhX2FyZy5zaXplICE9IEkyQ19TTUJVU19XT1JEX0RBVEEpICYmCiAJCSAgICAoZGF0YV9hcmcuc2l6ZSAhPSBJMkNfU01CVVNfUFJPQ19DQUxMKSAmJgogCQkgICAgKGRhdGFfYXJnLnNpemUgIT0gSTJDX1NNQlVTX0JMT0NLX0RBVEEpICYmCkBAIC0yOTAsMTEgKzI5MSwxMSBAQAogCQkJCWRhdGFfYXJnLnNpemUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJLyogTm90ZSB0aGF0IEkyQ19TTUJVU19SRUFEIGFuZCBJMkNfU01CVVNfV1JJVEUgYXJlIDAgYW5kIDEsIAorCQkvKiBOb3RlIHRoYXQgSTJDX1NNQlVTX1JFQUQgYW5kIEkyQ19TTUJVU19XUklURSBhcmUgMCBhbmQgMSwKIAkJICAgc28gdGhlIGNoZWNrIGlzIHZhbGlkIGlmIHNpemU9PUkyQ19TTUJVU19RVUlDSyB0b28uICovCi0JCWlmICgoZGF0YV9hcmcucmVhZF93cml0ZSAhPSBJMkNfU01CVVNfUkVBRCkgJiYgCisJCWlmICgoZGF0YV9hcmcucmVhZF93cml0ZSAhPSBJMkNfU01CVVNfUkVBRCkgJiYKIAkJICAgIChkYXRhX2FyZy5yZWFkX3dyaXRlICE9IEkyQ19TTUJVU19XUklURSkpIHsKLQkJCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LCAKKwkJCWRldl9kYmcoJmNsaWVudC0+YWRhcHRlci0+ZGV2LAogCQkJCSJyZWFkX3dyaXRlIG91dCBvZiByYW5nZSAoJXgpIGluIGlvY3RsIEkyQ19TTUJVUy5cbiIsCiAJCQkJZGF0YV9hcmcucmVhZF93cml0ZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwMyw3ICszMDQsNyBAQAogCQkvKiBOb3RlIHRoYXQgY29tbWFuZCB2YWx1ZXMgYXJlIGFsd2F5cyB2YWxpZCEgKi8KIAogCQlpZiAoKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX1FVSUNLKSB8fAotCQkgICAgKChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19CWVRFKSAmJiAKKwkJICAgICgoZGF0YV9hcmcuc2l6ZSA9PSBJMkNfU01CVVNfQllURSkgJiYKIAkJICAgIChkYXRhX2FyZy5yZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkpKQogCQkJLyogVGhlc2UgYXJlIHNwZWNpYWw6IHdlIGRvIG5vdCB1c2UgZGF0YSAqLwogCQkJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlciwgY2xpZW50LT5hZGRyLApAQCAtMzIxLDE0ICszMjIsMTQgQEAKIAkJaWYgKChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19CWVRFX0RBVEEpIHx8CiAJCSAgICAoZGF0YV9hcmcuc2l6ZSA9PSBJMkNfU01CVVNfQllURSkpCiAJCQlkYXRhc2l6ZSA9IHNpemVvZihkYXRhX2FyZy5kYXRhLT5ieXRlKTsKLQkJZWxzZSBpZiAoKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX1dPUkRfREFUQSkgfHwgCisJCWVsc2UgaWYgKChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19XT1JEX0RBVEEpIHx8CiAJCSAgICAgICAgIChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19QUk9DX0NBTEwpKQogCQkJZGF0YXNpemUgPSBzaXplb2YoZGF0YV9hcmcuZGF0YS0+d29yZCk7CiAJCWVsc2UgLyogc2l6ZSA9PSBzbWJ1cyBibG9jaywgaTJjIGJsb2NrLCBvciBibG9jayBwcm9jLiBjYWxsICovCiAJCQlkYXRhc2l6ZSA9IHNpemVvZihkYXRhX2FyZy5kYXRhLT5ibG9jayk7CiAKLQkJaWYgKChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19QUk9DX0NBTEwpIHx8IAotCQkgICAgKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCkgfHwgCisJCWlmICgoZGF0YV9hcmcuc2l6ZSA9PSBJMkNfU01CVVNfUFJPQ19DQUxMKSB8fAorCQkgICAgKGRhdGFfYXJnLnNpemUgPT0gSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCkgfHwKIAkJICAgIChkYXRhX2FyZy5yZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkpIHsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmdGVtcCwgZGF0YV9hcmcuZGF0YSwgZGF0YXNpemUpKQogCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMzM2LDggKzMzNyw4IEBACiAJCXJlcyA9IGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlcixjbGllbnQtPmFkZHIsY2xpZW50LT5mbGFncywKIAkJICAgICAgZGF0YV9hcmcucmVhZF93cml0ZSwKIAkJICAgICAgZGF0YV9hcmcuY29tbWFuZCxkYXRhX2FyZy5zaXplLCZ0ZW1wKTsKLQkJaWYgKCEgcmVzICYmICgoZGF0YV9hcmcuc2l6ZSA9PSBJMkNfU01CVVNfUFJPQ19DQUxMKSB8fCAKLQkJICAgICAgICAgICAgICAoZGF0YV9hcmcuc2l6ZSA9PSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMKSB8fCAKKwkJaWYgKCEgcmVzICYmICgoZGF0YV9hcmcuc2l6ZSA9PSBJMkNfU01CVVNfUFJPQ19DQUxMKSB8fAorCQkgICAgICAgICAgICAgIChkYXRhX2FyZy5zaXplID09IEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEwpIHx8CiAJCQkgICAgICAoZGF0YV9hcmcucmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkpKSB7CiAJCQlpZiAoY29weV90b191c2VyKGRhdGFfYXJnLmRhdGEsICZ0ZW1wLCBkYXRhc2l6ZSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00MTMsMTUgKzQxNCwxNCBAQAogCQlyZXR1cm4gUFRSX0VSUihpMmNfZGV2KTsKIAogCS8qIHJlZ2lzdGVyIHRoaXMgaTJjIGRldmljZSB3aXRoIHRoZSBkcml2ZXIgY29yZSAqLwotCWkyY19kZXYtPmNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9jcmVhdGUoaTJjX2Rldl9jbGFzcywgTlVMTCwKLQkJCQkJCSBNS0RFVihJMkNfTUFKT1IsIGFkYXAtPm5yKSwKLQkJCQkJCSAmYWRhcC0+ZGV2LCAiaTJjLSVkIiwKLQkJCQkJCSBhZGFwLT5ucik7Ci0JaWYgKCFpMmNfZGV2LT5jbGFzc19kZXYpIHsKLQkJcmVzID0gLUVOT0RFVjsKKwlpMmNfZGV2LT5kZXYgPSBkZXZpY2VfY3JlYXRlKGkyY19kZXZfY2xhc3MsICZhZGFwLT5kZXYsCisJCQkJICAgICBNS0RFVihJMkNfTUFKT1IsIGFkYXAtPm5yKSwKKwkJCQkgICAgICJpMmMtJWQiLCBhZGFwLT5ucik7CisJaWYgKElTX0VSUihpMmNfZGV2LT5kZXYpKSB7CisJCXJlcyA9IFBUUl9FUlIoaTJjX2Rldi0+ZGV2KTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JcmVzID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGkyY19kZXYtPmNsYXNzX2RldiwgJmNsYXNzX2RldmljZV9hdHRyX25hbWUpOworCXJlcyA9IGRldmljZV9jcmVhdGVfZmlsZShpMmNfZGV2LT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKIAlpZiAocmVzKQogCQlnb3RvIGVycm9yX2Rlc3Ryb3k7CiAKQEAgLTQyOSwxMCArNDI5LDkgQEAKIAkJIGFkYXAtPm5hbWUsIGFkYXAtPm5yKTsKIAlyZXR1cm4gMDsKIGVycm9yX2Rlc3Ryb3k6Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3koaTJjX2Rldl9jbGFzcywgTUtERVYoSTJDX01BSk9SLCBhZGFwLT5ucikpOworCWRldmljZV9kZXN0cm95KGkyY19kZXZfY2xhc3MsIE1LREVWKEkyQ19NQUpPUiwgYWRhcC0+bnIpKTsKIGVycm9yOgogCXJldHVybl9pMmNfZGV2KGkyY19kZXYpOwotCWtmcmVlKGkyY19kZXYpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTQ0NCwxMCArNDQzLDkgQEAKIAlpZiAoIWkyY19kZXYpIC8qIGF0dGFjaF9hZGFwdGVyIG11c3QgaGF2ZSBmYWlsZWQgKi8KIAkJcmV0dXJuIDA7CiAKLQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoaTJjX2Rldi0+Y2xhc3NfZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfbmFtZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGkyY19kZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOwogCXJldHVybl9pMmNfZGV2KGkyY19kZXYpOwotCWNsYXNzX2RldmljZV9kZXN0cm95KGkyY19kZXZfY2xhc3MsIE1LREVWKEkyQ19NQUpPUiwgYWRhcC0+bnIpKTsKLQlrZnJlZShpMmNfZGV2KTsKKwlkZXZpY2VfZGVzdHJveShpMmNfZGV2X2NsYXNzLCBNS0RFVihJMkNfTUFKT1IsIGFkYXAtPm5yKSk7CiAKIAlwcl9kZWJ1ZygiaTJjLWRldjogYWRhcHRlciBbJXNdIHVucmVnaXN0ZXJlZFxuIiwgYWRhcC0+bmFtZSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9LY29uZmlnIGIvZHJpdmVycy9pZGUvS2NvbmZpZwppbmRleCAwYzY4ZDBmLi4zZjgyODA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWRlL0tjb25maWcKQEAgLTM4OSwxNCArMzg5LDYgQEAKIAkgIExpbnV4LiBUaGlzIG1heSBzbG93IGRpc2sgdGhyb3VnaHB1dCBieSBhIGZldyBwZXJjZW50LCBidXQgYXQgbGVhc3QKIAkgIHRoaW5ncyB3aWxsIG9wZXJhdGUgMTAwJSByZWxpYWJseS4KIAotY29uZmlnIEJMS19ERVZfU0w4MkMxMDUKLQl0cmlzdGF0ZSAiV2luYm9uZCBTTDgyYzEwNSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJICYmIChQUEMgfHwgQVJNKSAmJiBCTEtfREVWX0lERVBDSQotCWhlbHAKLQkgIElmIHlvdSBoYXZlIGEgV2luYm9uZCBTTDgyYzEwNSBJREUgY29udHJvbGxlciwgc2F5IFkgaGVyZSB0byBlbmFibGUKLQkgIHNwZWNpYWwgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjaGlwLiBUaGlzIGlzIGNvbW1vbiBvbiB2YXJpb3VzIENIUlAKLQkgIG1vdGhlcmJvYXJkcywgYnV0IGNvdWxkIGJlIHVzZWQgZWxzZXdoZXJlLiBJZiBpbiBkb3VidCwgc2F5IFkuCi0KIGNvbmZpZyBCTEtfREVWX0lERURNQV9QQ0kKIAlib29sICJHZW5lcmljIFBDSSBidXMtbWFzdGVyIERNQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIEJMS19ERVZfSURFUENJCkBAIC03MTIsNiArNzA0LDE0IEBACiAKIAkgIFBsZWFzZSByZWFkIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mIDxmaWxlOmRyaXZlcnMvaWRlL3BjaS9zaXM1NTEzLmM+LgogCitjb25maWcgQkxLX0RFVl9TTDgyQzEwNQorCXRyaXN0YXRlICJXaW5ib25kIFNMODJjMTA1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoUFBDIHx8IEFSTSkKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIFdpbmJvbmQgU0w4MmMxMDUgSURFIGNvbnRyb2xsZXIsIHNheSBZIGhlcmUgdG8gZW5hYmxlCisJICBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgY2hpcC4gVGhpcyBpcyBjb21tb24gb24gdmFyaW91cyBDSFJQCisJICBtb3RoZXJib2FyZHMsIGJ1dCBjb3VsZCBiZSB1c2VkIGVsc2V3aGVyZS4gSWYgaW4gZG91YnQsIHNheSBZLgorCiBjb25maWcgQkxLX0RFVl9TTEM5MEU2NgogCXRyaXN0YXRlICJTTEM5MEU2NiBjaGlwc2V0IHN1cHBvcnQiCiAJaGVscApAQCAtNzk2LDcgKzc5Niw3IEBACiBjb25maWcgQkxLX0RFVl9JREVfQVUxWFhYX1NFUVRTX1BFUl9SUQogICAgICAgIGludCAiTWF4aW11bSB0cmFuc2ZlciBzaXplIChLQikgcGVyIHJlcXVlc3QgKHVwIHRvIDEyOCkiCiAgICAgICAgZGVmYXVsdCAiMTI4IgotICAgICAgIGRlcGVuZHMgQkxLX0RFVl9JREVfQVUxWFhYCisgICAgICAgZGVwZW5kcyBvbiBCTEtfREVWX0lERV9BVTFYWFgKIAogY29uZmlnIElERV9BUk0KIAlkZWZfYm9vbCBBUk0gJiYgKEFSQ0hfQTVLIHx8IEFSQ0hfQ0xQUzc1MDAgfHwgQVJDSF9SUEMgfHwgQVJDSF9TSEFSSykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKaW5kZXggYmRkZmViZC4uNTk2OWNlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKQEAgLTY4Nyw4ICs2ODcsMTUgQEAKIHN0YXRpYyBpbnQgY2Ryb21fZGVjb2RlX3N0YXR1cyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBnb29kX3N0YXQsIGludCAqc3RhdF9yZXQpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKIAlpbnQgc3RhdCwgZXJyLCBzZW5zZV9rZXk7CiAJCisJLyogV2UgbWF5IGhhdmUgYm9ndXMgRE1BIGludGVycnVwdHMgaW4gUElPIHN0YXRlIGhlcmUgKi8KKwlpZiAoSFdJRihkcml2ZSktPmRtYV9zdGF0dXMgJiYgaHdpZi0+YXRhcGlfaXJxX2JvZ29uKSB7CisJCXN0YXQgPSBod2lmLT5JTkIoaHdpZi0+ZG1hX3N0YXR1cyk7CisJCS8qIFNob3VsZCB3ZSBmb3JjZSB0aGUgYml0IGFzIHdlbGwgPyAqLworCQlod2lmLT5PVVRCKHN0YXQsIGh3aWYtPmRtYV9zdGF0dXMpOworCX0KIAkvKiBDaGVjayBmb3IgZXJyb3JzLiAqLwogCXN0YXQgPSBIV0lGKGRyaXZlKS0+SU5CKElERV9TVEFUVVNfUkVHKTsKIAlpZiAoc3RhdF9yZXQpCkBAIC03MjQsNyArNzMxLDcgQEAKIAkJICogaWYgd2UgaGF2ZSBhbiBlcnJvciwgcGFzcyBiYWNrIENIRUNLX0NPTkRJVElPTiBhcyB0aGUKIAkJICogc2NzaSBzdGF0dXMgYnl0ZQogCQkgKi8KLQkJaWYgKCFycS0+ZXJyb3JzKQorCQlpZiAoYmxrX3BjX3JlcXVlc3QocnEpICYmICFycS0+ZXJyb3JzKQogCQkJcnEtPmVycm9ycyA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKIAogCQkvKiBDaGVjayBmb3IgdHJheSBvcGVuLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCmluZGV4IDhjY2VlOWMuLmQzMzcxN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKQEAgLTE2MzUsNyArMTYzNSw3IEBACiAvKgogKiogR2V0IEFUQVBJX0ZPUk1BVF9VTklUIHByb2dyZXNzIGluZGljYXRpb24uCiAqKgotKiogVXNlcmxhbmQgZ2l2ZXMgYSBwb2ludGVyIHRvIGFuIGludC4gIFRoZSBpbnQgaXMgc2V0IHRvIGEgcHJvZ3Jlc3NzCisqKiBVc2VybGFuZCBnaXZlcyBhIHBvaW50ZXIgdG8gYW4gaW50LiAgVGhlIGludCBpcyBzZXQgdG8gYSBwcm9ncmVzcwogKiogaW5kaWNhdG9yIDAtNjU1MzYsIHdpdGggNjU1MzY9MTAwJS4KICoqCiAqKiBJZiB0aGUgZHJpdmUgZG9lcyBub3Qgc3VwcG9ydCBmb3JtYXQgcHJvZ3Jlc3MgaW5kaWNhdGlvbiwgd2UganVzdCBjaGVjawpAQCAtMjE0Nyw3ICsyMTQ3LDcgQEAKIAkJcHJpbnRrKCJpZGUtZmxvcHB5OiBwYXNzaW5nIGRyaXZlICVzIHRvIGlkZS1zY3NpIGVtdWxhdGlvbi5cbiIsIGRyaXZlLT5uYW1lKTsKIAkJZ290byBmYWlsZWQ7CiAJfQotCWlmICgoZmxvcHB5ID0gKGlkZWZsb3BweV9mbG9wcHlfdCAqKSBremFsbG9jIChzaXplb2YgKGlkZWZsb3BweV9mbG9wcHlfdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJaWYgKChmbG9wcHkgPSBremFsbG9jKHNpemVvZiAoaWRlZmxvcHB5X2Zsb3BweV90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKIAkJcHJpbnRrIChLRVJOX0VSUiAiaWRlLWZsb3BweTogJXM6IENhbid0IGFsbG9jYXRlIGEgZmxvcHB5IHN0cnVjdHVyZVxuIiwgZHJpdmUtPm5hbWUpOwogCQlnb3RvIGZhaWxlZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCmluZGV4IGRhZDljNDcuLjVhNWM1NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCkBAIC0xMDAwLDEwICsxMDAwLDYgQEAKIAkvKiBuZWVkcyBkcml2ZS0+cXVldWUgdG8gYmUgc2V0ICovCiAJaWRlX3RvZ2dsZV9ib3VuY2UoZHJpdmUsIDEpOwogCi0JLyogZW5hYmxlIGxlZCBhY3Rpdml0eSBmb3IgZGlzayBkcml2ZXMgb25seSAqLwotCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2sgJiYgaHdpZi0+bGVkX2FjdCkKLQkJYmxrX3F1ZXVlX2FjdGl2aXR5X2ZuKHEsIGh3aWYtPmxlZF9hY3QsIGRyaXZlKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwppbmRleCBlMmY0YmI1Li5iM2JjZDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKQEAgLTI1NzMsMTEgKzI1NzMsMTEgQEAKIAlpbnQgcGFnZXMgPSB0YXBlLT5wYWdlc19wZXJfc3RhZ2U7CiAJY2hhciAqYl9kYXRhID0gTlVMTDsKIAotCWlmICgoc3RhZ2UgPSAoaWRldGFwZV9zdGFnZV90ICopIGttYWxsb2MgKHNpemVvZiAoaWRldGFwZV9zdGFnZV90KSxHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlpZiAoKHN0YWdlID0ga21hbGxvYyhzaXplb2YgKGlkZXRhcGVfc3RhZ2VfdCksR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXN0YWdlLT5uZXh0ID0gTlVMTDsKIAotCWJoID0gc3RhZ2UtPmJoID0gKHN0cnVjdCBpZGV0YXBlX2JoICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGlkZXRhcGVfYmgpLCBHRlBfS0VSTkVMKTsKKwliaCA9IHN0YWdlLT5iaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZGV0YXBlX2JoKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJoID09IE5VTEwpCiAJCWdvdG8gYWJvcnQ7CiAJYmgtPmJfcmVxbmV4dCA9IE5VTEw7CkBAIC0yNjA3LDcgKzI2MDcsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAkJcHJldl9iaCA9IGJoOwotCQlpZiAoKGJoID0gKHN0cnVjdCBpZGV0YXBlX2JoICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGlkZXRhcGVfYmgpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlpZiAoKGJoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlkZXRhcGVfYmgpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewogCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBiX2RhdGEpOwogCQkJZ290byBhYm9ydDsKIAkJfQpAQCAtNDg2MCw3ICs0ODYwLDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlLXRhcGU6IFVzZSBkcml2ZSAlcyB3aXRoIGlkZS1zY3NpIGVtdWxhdGlvbiBhbmQgb3NzdC5cbiIsIGRyaXZlLT5uYW1lKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWRlLXRhcGU6IE9uU3RyZWFtIHN1cHBvcnQgd2lsbCBiZSByZW1vdmVkIHNvb24gZnJvbSBpZGUtdGFwZSFcbiIpOwogCX0KLQl0YXBlID0gKGlkZXRhcGVfdGFwZV90ICopIGt6YWxsb2MgKHNpemVvZiAoaWRldGFwZV90YXBlX3QpLCBHRlBfS0VSTkVMKTsKKwl0YXBlID0ga3phbGxvYyhzaXplb2YgKGlkZXRhcGVfdGFwZV90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRhcGUgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiAlczogQ2FuJ3QgYWxsb2NhdGUgYSB0YXBlIHN0cnVjdHVyZVxuIiwgZHJpdmUtPm5hbWUpOwogCQlnb3RvIGZhaWxlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKaW5kZXggMWQwNDcwYy4uMzAxNzVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKQEAgLTUyNCw4ICs1MjQsOCBAQAogCXRhc2tfaW9yZWdfdCAqaG9ic3B0cgk9IGFyZ3MuaG9iUmVnaXN0ZXI7CiAJaW50IGVycgkJCT0gMDsKIAlpbnQgdGFza3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBpZGVfdGFza19yZXF1ZXN0X3MpOwotCWludCB0YXNraW4JCT0gMDsKLQlpbnQgdGFza291dAkJPSAwOworCXVuc2lnbmVkIGludCB0YXNraW4JPSAwOworCXVuc2lnbmVkIGludCB0YXNrb3V0CT0gMDsKIAl1OCBpb18zMmJpdAkJPSBkcml2ZS0+aW9fMzJiaXQ7CiAJY2hhciBfX3VzZXIgKmJ1ZiA9IChjaGFyIF9fdXNlciAqKWFyZzsKIApAQCAtNTM4LDggKzUzOCwxMyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQl0YXNrb3V0ID0gKGludCkgcmVxX3Rhc2stPm91dF9zaXplOwotCXRhc2tpbiAgPSAoaW50KSByZXFfdGFzay0+aW5fc2l6ZTsKKwl0YXNrb3V0ID0gcmVxX3Rhc2stPm91dF9zaXplOworCXRhc2tpbiAgPSByZXFfdGFzay0+aW5fc2l6ZTsKKwkKKwlpZiAodGFza2luID4gNjU1MzYgfHwgdGFza291dCA+IDY1NTM2KSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gYWJvcnQ7CisJfQogCiAJaWYgKHRhc2tvdXQpIHsKIAkJaW50IG91dHRvdGFsID0gdGFza3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUuYyBiL2RyaXZlcnMvaWRlL2lkZS5jCmluZGV4IDI4N2E2NjIuLjE2ODkwNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS5jCkBAIC05NzMsOCArOTczLDggQEAKICAqCUBkcml2ZTogZHJpdmUKICAqCiAgKglBdXRvbWF0aWNhbGx5IHJlbW92ZSBhbGwgdGhlIGRyaXZlciBzcGVjaWZpYyBzZXR0aW5ncyBmb3IgdGhpcwotICoJZHJpdmUuIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBJUlEKLSAqCWNvbnRleHQuIFRoZSBjYWxsZXIgbXVzdCBob2xkIGlkZV9zZXR0aW5nX3NlbS4KKyAqCWRyaXZlLiBUaGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgY2FsbGVkIGZyb20gSVJRIGNvbnRleHQuIFRoZQorICoJY2FsbGVyIG11c3QgaG9sZCBpZGVfc2V0dGluZ19zZW0uCiAgKi8KICAKIHN0YXRpYyB2b2lkIGF1dG9fcmVtb3ZlX3NldHRpbmdzIChpZGVfZHJpdmVfdCAqZHJpdmUpCkBAIC0xODc0LDExICsxODc0LDIyIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKLQlkb3duKCZpZGVfc2V0dGluZ19zZW0pOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJaWRlX3JlbW92ZV9wcm9jX2VudHJpZXMoZHJpdmUtPnByb2MsIGRyaXZlci0+cHJvYyk7CiAjZW5kaWYKKwlkb3duKCZpZGVfc2V0dGluZ19zZW0pOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOworCS8qCisJICogaWRlX3NldHRpbmdfc2VtIHByb3RlY3RzIHRoZSBzZXR0aW5ncyBsaXN0CisJICogaWRlX2xvY2sgcHJvdGVjdHMgdGhlIHVzZSBvZiBzZXR0aW5ncworCSAqCisJICogc28gd2UgbmVlZCB0byBob2xkIGJvdGgsIGlkZV9zZXR0aW5nc19zZW0gYmVjYXVzZSB3ZSB3YW50IHRvCisJICogbW9kaWZ5IHRoZSBzZXR0aW5ncyBsaXN0LCBhbmQgaWRlX2xvY2sgYmVjYXVzZSB3ZSBjYW5ub3QgdGFrZQorCSAqIGEgc2V0dGluZyBvdXQgdGhhdCBpcyBiZWluZyB1c2VkLgorCSAqCisJICogT1RPSCBib3RoIGlkZV97cmVhZCx3cml0ZX1fc2V0dGluZyBhcmUgb25seSBldmVyIHVzZWQgdW5kZXIKKwkgKiBpZGVfc2V0dGluZ19zZW0uCisJICovCiAJYXV0b19yZW1vdmVfc2V0dGluZ3MoZHJpdmUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CiAJdXAoJmlkZV9zZXR0aW5nX3NlbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvaGQuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jCmluZGV4IGIxZDUyOTEuLjQ1ZWQwMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9oZC5jCkBAIC00NTksNyArNDU5LDcgQEAKICNpZmRlZiBERUJVRwogCXByaW50aygiJXM6IHJlYWQ6IHNlY3RvciAlbGQsIHJlbWFpbmluZyA9ICVsZCwgYnVmZmVyPSVwXG4iLAogCQlyZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgcmVxLT5zZWN0b3IsIHJlcS0+bnJfc2VjdG9ycywKLQkJcmVxLT5idWZmZXIrNTEyKSk7CisJCXJlcS0+YnVmZmVyKzUxMik7CiAjZW5kaWYKIAlpZiAocmVxLT5jdXJyZW50X25yX3NlY3RvcnMgPD0gMCkKIAkJZW5kX3JlcXVlc3QocmVxLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYwppbmRleCBiZWY0NzU5Li43ZWZkMjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCkBAIC0xOTIsMjAgKzE5MiwxMCBAQAogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZzdGstPnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gc3RrLT5wYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBzdGstPnBhcnNlLmNvbmZpZy5ybWFza1swXTsKIAotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0gICAgaWYgKCFwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkgJiYKLQkhcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgJiYKLQkhcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnN0ay0+cGFyc2UpKQotCWlzX2ttZSA9ICgoc3RrLT5wYXJzZS5tYW5maWQubWFuZiA9PSBNQU5GSURfS01FKSAmJgotCQkgICgoc3RrLT5wYXJzZS5tYW5maWQuY2FyZCA9PSBQUk9ESURfS01FX0tYTEMwMDVfQSkgfHwKLQkJICAgKHN0ay0+cGFyc2UubWFuZmlkLmNhcmQgPT0gUFJPRElEX0tNRV9LWExDMDA1X0IpKSk7CisgICAgaXNfa21lID0gKChsaW5rLT5tYW5mX2lkID09IE1BTkZJRF9LTUUpICYmCisJICAgICAgKChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9LTUVfS1hMQzAwNV9BKSB8fAorCSAgICAgICAobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfS01FX0tYTEMwMDVfQikpKTsKIAogICAgIC8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQuLi4gbG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KICAgICBDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJnN0ay0+Y29uZikpOwpAQCAtNDA4LDggKzM5OCwxMCBAQAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTTUkgVkVORE9SIiwgIlNNSSBQUk9EVUNUIiwgMHgzMDg5NmM5MiwgMHg3MDNjYzVmNiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRPU0hJQkEiLCAiTUsyMDAxTVBMIiwgMHhiNDU4NWExYSwgMHgzNDg5ZTAwMyksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiVFJBTlNDRU5EICAgIDUxMk0gICAiLCAweGQwOTA5NDQzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVFJBTlNDRU5EIiwgIlRTMUdDRjgwIiwgMHg3MDliMWJmMSwgMHgyYTU0ZDRiMSksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRSQU5TQ0VORCIsICJUUzRHQ0YxMjAiLCAweDcwOWIxYmYxLCAweGY1NGE5MWM4KSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiV0lUIiwgIklERTE2IiwgMHgyNDRlNTk5NCwgMHgzZTIzMjg1MiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIldFSURBIiwgIlRXVFRJIiwgMHhjYzdjZjY5YywgMHgyMTJiYjkxOCksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiU1RJIEZsYXNoIiwgMHhlNGExMzIwOSksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNUSSIsICJGbGFzaCA1LjAiLCAweGJmMmRmMThkLCAweDhjYjU3YTBlKSwKIAlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIlNhbkRpc2siLCAiQ29ubmVjdFBsdXMiLCAweDdhOTU0YmQ5LCAweDc0YmUwMGM2KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9hbGltMTV4My5jIGIvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKaW5kZXggZDQxOWU0Yi4uODkxMDliZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKQEAgLTU4NiwxMSArNTg2LDExIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCB0bXBieXRlOwotCXN0cnVjdCBwY2lfZGV2ICpub3J0aCA9IHBjaV9maW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsMCkpOworCXN0cnVjdCBwY2lfZGV2ICpub3J0aCA9IHBjaV9nZXRfc2xvdChkZXYtPmJ1cywgUENJX0RFVkZOKDAsMCkpOwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZtNTIyOV9yZXZpc2lvbik7CiAKLQlpc2FfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIE5VTEwpOworCWlzYV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCBOVUxMKTsKIAogI2lmIGRlZmluZWQoRElTUExBWV9BTElfVElNSU5HUykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKIAlpZiAoIWFsaV9wcm9jKSB7CkBAIC02MTMsOCArNjEzLDcgQEAKIAkJICogY2xlYXIgYml0IDcKIAkJICovCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGIsIHRtcGJ5dGUgJiAweDdGKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyoKQEAgLTYzNywxMCArNjM2LDggQEAKIAkgKiBib3ggd2l0aG91dCBhIGRldmljZSBhdCAwOjAuMC4gVGhlIEFMaSBicmlkZ2Ugd2lsbCBiZSBhdAogCSAqIDA6MC4wIHNvIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSB3ZSBrbm93IHdoYXQgaXMgY29va2luZy4KIAkgKi8KLQlpZiAobm9ydGggJiYgbm9ydGgtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0FMKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkgICAgICAgIHJldHVybiAwOwotCX0KKwlpZiAobm9ydGggJiYgbm9ydGgtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0FMKQorCQlnb3RvIG91dDsKIAogCWlmIChtNTIyOV9yZXZpc2lvbiA8IDB4QzUgJiYgaXNhX2RldikKIAl7CQpAQCAtNjYxLDYgKzY1OCw5IEBACiAJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2RldiwgMHg3OSwgdG1wYnl0ZSB8IDB4MDIpOwogCQl9CiAJfQorb3V0OgorCXBjaV9kZXZfcHV0KG5vcnRoKTsKKwlwY2lfZGV2X3B1dChpc2FfZGV2KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jIGIvZHJpdmVycy9pZGUvcGNpL2FtZDc0eHguYwppbmRleCAyYjBlYThiLi43NTNmZTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9hbWQ3NHh4LmMKQEAgLTc1LDYgKzc1LDcgQEAKIAl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAogCXsgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDYxX0lERSwJMHg1MCwgQU1EX1VETUFfMTMzIH0sCiAJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjVfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2N19JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAogCXsgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0lERSwJCQkweDQwLCBBTURfVURNQV8xMDAgfSwKIAl7IDAgfQogfTsKQEAgLTQ5MSw3ICs0OTIsOCBAQAogCS8qIDE2ICovIERFQ0xBUkVfTlZfREVWKCJORk9SQ0UtTUNQNTUiKSwKIAkvKiAxNyAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFLU1DUDYxIiksCiAJLyogMTggKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRS1NQ1A2NSIpLAotCS8qIDE5ICovIERFQ0xBUkVfQU1EX0RFVigiQU1ENTUzNiIpLAorCS8qIDE5ICovIERFQ0xBUkVfTlZfREVWKCJORk9SQ0UtTUNQNjciKSwKKwkvKiAyMCAqLyBERUNMQVJFX0FNRF9ERVYoIkFNRDU1MzYiKSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFtZDc0eHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQpAQCAtNTMwLDcgKzUzMiw4IEBACiAJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDU1X0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTYgfSwKIAl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjFfSURFLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxNyB9LAogCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2NV9JREUsICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxOCB9LAotCXsgUENJX1ZFTkRPUl9JRF9BTUQsCVBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JREUsCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxOSB9LAorCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2N19JREUsICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxOSB9LAorCXsgUENJX1ZFTkRPUl9JRF9BTUQsCVBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JREUsCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyMCB9LAogCXsgMCwgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYW1kNzR4eF9wY2lfdGJsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMgYi9kcml2ZXJzL2lkZS9wY2kvZ2VuZXJpYy5jCmluZGV4IDViNzdhNWIuLjlmMzA2ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2dlbmVyaWMuYwpAQCAtNDAsNiArNDAsMTkgQEAKIAogc3RhdGljIGludCBpZGVfZ2VuZXJpY19hbGw7CQkvKiBTZXQgdG8gY2xhaW0gYWxsIGRldmljZXMgKi8KIAorLyoKKyAqIHRoZSBtb2R1bGVfcGFyYW1fbmFtZWQoKSB3YXMgYWRkZWQgZm9yIHRoZSBtb2R1bGFyIGNhc2UKKyAqIHRoZSBfX3NldHVwKCkgaXMgbGVmdCBhcyBjb21wYXRpYmlsaXR5IGZvciBleGlzdGluZyBzZXR1cHMKKyAqLworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGlkZV9nZW5lcmljX2FsbF9vbihjaGFyICp1bnVzZWQpCit7CisJaWRlX2dlbmVyaWNfYWxsID0gMTsKKwlwcmludGsoS0VSTl9JTkZPICJJREUgZ2VuZXJpYyB3aWxsIGNsYWltIGFsbCB1bmtub3duIFBDSSBJREUgc3RvcmFnZSBjb250cm9sbGVycy5cbiIpOworCXJldHVybiAxOworfQorX19zZXR1cCgiYWxsLWdlbmVyaWMtaWRlIiwgaWRlX2dlbmVyaWNfYWxsX29uKTsKKyNlbmRpZgogbW9kdWxlX3BhcmFtX25hbWVkKGFsbF9nZW5lcmljX2lkZSwgaWRlX2dlbmVyaWNfYWxsLCBib29sLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYWxsX2dlbmVyaWNfaWRlLCAiSURFIGdlbmVyaWMgd2lsbCBjbGFpbSBhbGwgdW5rbm93biBQQ0kgSURFIHN0b3JhZ2UgY29udHJvbGxlcnMuIik7CiAKQEAgLTIzNCw4ICsyNDcsMTAgQEAKIAkgICAgKCEoUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSkpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfSk1JQ1JPTiAmJiBQQ0lfRlVOQyhkZXYtPmRldmZuKSAhPSAxKQotCQlnb3RvIG91dDsKKwlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9KTUlDUk9OKSB7CisJCWlmIChkZXYtPmRldmljZSAhPSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY4ICYmIFBDSV9GVU5DKGRldi0+ZGV2Zm4pICE9IDEpCisJCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAoZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9KTUlDUk9OKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYyBiL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYwppbmRleCBlOTkzYTUxLi4wODExOWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2hwdDM2Ni5jCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMJCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEJICAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDMJCVJlZCBIYXQgSW5jCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNglNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgogICogVGhhbmtzIHRvIEhpZ2hQb2ludCBUZWNobm9sb2dpZXMgZm9yIHRoZWlyIGFzc2lzdGFuY2UsIGFuZCBoYXJkd2FyZS4KICAqIFNwZWNpYWwgVGhhbmtzIHRvIEpvbiBCdXJjaG1vcmUgaW4gU2FuRGllZ28gZm9yIHRoZSBkZWVwIHBvY2tldHMsIGhpcwpAQCAtMTEsOSArMTIsMTEgQEAKICAqIGRldmVsb3BtZW50IGFuZCBzdXBwb3J0LgogICoKICAqCi0gKiBIaWdocG9pbnQgaGF2ZSB0aGVpciBvd24gZHJpdmVyIChzb3VyY2UgZXhjZXB0IGZvciB0aGUgcmFpZCBwYXJ0KQotICogYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5oaWdocG9pbnQtdGVjaC5jb20vaHB0M3h4LW9wZW5zb3VyY2UtdjEzMS50Z3oKLSAqIFRoaXMgbWF5IGJlIHVzZWZ1bCB0byBhbnlvbmUgd2FudGluZyB0byB3b3JrIG9uIHRoZSBtYWluc3RyZWFtIGhwdCBJREUuCisgKiBIaWdoUG9pbnQgaGFzIGl0cyBvd24gZHJpdmVycyAob3BlbiBzb3VyY2UgZXhjZXB0IGZvciB0aGUgUkFJRCBwYXJ0KQorICogYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5oaWdocG9pbnQtdGVjaC5jb20vQklPUyUyMCslMjBEcml2ZXIvLgorICogVGhpcyBtYXkgYmUgdXNlZnVsIHRvIGFueW9uZSB3YW50aW5nIHRvIHdvcmsgb24gdGhpcyBkcml2ZXIsIGhvd2V2ZXIgIGRvIG5vdAorICogdHJ1c3QgIHRoZW0gdG9vIG11Y2ggc2luY2UgdGhlIGNvZGUgdGVuZHMgdG8gYmVjb21lIGxlc3MgYW5kIGxlc3MgbWVhbmluZ2Z1bAorICogYXMgdGhlIHRpbWUgcGFzc2VzLi4uIDotLwogICoKICAqIE5vdGUgdGhhdCBmaW5hbCBIUFQzNzAgc3VwcG9ydCB3YXMgZG9uZSBieSBmb3JjZSBleHRyYWN0aW9uIG9mIEdQTC4KICAqCkBAIC01Miw2ICs1NSwyOSBAQAogICoga2VlcGluZyBtZSBzYW5lLiAKICAqCQlBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgogICoKKyAqIC0gZml4IHRoZSBjbG9jayB0dXJuYXJvdW5kIGNvZGU6IGl0IHdhcyB3cml0aW5nIHRvIHRoZSB3cm9uZyBwb3J0cyB3aGVuCisgKiAgIGNhbGxlZCBmb3IgdGhlIHNlY29uZGFyeSBjaGFubmVsLCBjYWNoaW5nIHRoZSBjdXJyZW50IGNsb2NrIG1vZGUgcGVyLQorICogICBjaGFubmVsIGNhdXNlZCB0aGUgY2FjaGVkIHJlZ2lzdGVyIHZhbHVlIHRvIGdldCBvdXQgb2Ygc3luYyB3aXRoIHRoZQorICogICBhY3R1YWwgb25lLCB0aGUgY2hhbm5lbHMgd2VyZW4ndCBzZXJpYWxpemVkLCB0aGUgdHVybmFyb3VuZCBzaG91bGRuJ3QKKyAqICAgYmUgZG9uZSBvbiA2NiBNSHogUENJIGJ1cworICogLSBhdm9pZCBjYWxpYnJhdGluZyBQTEwgdHdpY2UgYXMgdGhlIHNlY29uZCB0aW1lIHJlc3VsdHMgaW4gYSB3cm9uZyBQQ0kKKyAqICAgZnJlcXVlbmN5IGFuZCB0aHVzIGluIHRoZSB3cm9uZyB0aW1pbmdzIGZvciB0aGUgc2Vjb25kYXJ5IGNoYW5uZWwKKyAqIC0gZGlzYWJsZSBVbHRyYUFUQS8xMzMgZm9yIEhQVDM3MiBieSBkZWZhdWx0ICg1MCBNSHogRFBMTCBjbG9jayBkbyBub3QKKyAqICAgYWxsb3cgZm9yIHRoaXMgc3BlZWQgYW55d2F5KQorICogLSBhZGQgc3VwcG9ydCBmb3IgSFBUMzAyTiBhbmQgSFBUMzcxTiBjbG9ja2luZyAodGhlIHNhbWUgYXMgZm9yIEhQVDM3Mk4pCisgKiAtIEhQVDM3MS9OIGFyZSBzaW5nbGUgY2hhbm5lbCBjaGlwcywgc28gYXZvaWQgdG91Y2hpbmcgdGhlIHByaW1hcnkgY2hhbm5lbAorICogICB3aGljaCBleGlzdHMgb25seSB2aXJ0dWFsbHkgKHRoZXJlJ3Mgbm8gcGlucyBmb3IgaXQpCisgKiAtIGZpeC9yZW1vdmUgYmFkL3VudXNlZCB0aW1pbmcgdGFibGVzIGFuZCB1c2Ugb25lIHNldCBvZiB0YWJsZXMgZm9yIHRoZSB3aG9sZQorICogICBIUFQzN3ggY2hpcCBmYW1pbHk7IHNhdmUgc3BhY2UgYnkgaW50cm9kdWNpbmcgdGhlIHNlcGFyYXRlIHRyYW5zZmVyIG1vZGUKKyAqICAgdGFibGUgaW4gd2hpY2ggdGhlIG1vZGUgbG9va3VwIGlzIGRvbmUKKyAqIC0gdXNlIGZfQ05UIHZhbHVlIHNhdmVkIGJ5ICB0aGUgSGlnaFBvaW50IEJJT1MgYXMgcmVhZGluZyBpdCBkaXJlY3RseSBnaXZlcworICogICB0aGUgd3JvbmcgUENJIGZyZXF1ZW5jeSBzaW5jZSBEUExMIGhhcyBhbHJlYWR5IGJlZW4gY2FsaWJyYXRlZCBieSBCSU9TCisgKiAtIGZpeCB0aGUgaG90c3dhcCBjb2RlOiAgaXQgY2F1c2VkIFJFU0VULSB0byBnbGl0Y2ggd2hlbiB0cmlzdGF0aW5nIHRoZSBidXMsCisgKiAgIGFuZCBmb3IgSFBUMzZ4IHRoZSBvYnNvbGV0ZSBIRElPX1RSSVNUQVRFX0hXSUYgaGFuZGxlciB3YXMgY2FsbGVkIGluc3RlYWQKKyAqIC0gcGFzcyB0byBpbml0X2NoaXBzZXQoKSBoYW5kbGVycyBhIGNvcHkgb2YgdGhlIElERSBQQ0kgZGV2aWNlIHN0cnVjdHVyZSBhcworICogICB0aGV5IHRhbXBlciB3aXRoIGl0cyBmaWVsZHMKKyAqCQk8c291cmNlQG12aXN0YS5jb20+CisgKgogICovCiAKIApAQCAtNzYsOCArMTAyLDggQEAKIAogLyogdmFyaW91cyB0dW5pbmcgcGFyYW1ldGVycyAqLwogI2RlZmluZSBIUFRfUkVTRVRfU1RBVEVfRU5HSU5FCi0jdW5kZWYgSFBUX0RFTEFZX0lOVEVSUlVQVAotI3VuZGVmIEhQVF9TRVJJQUxJWkVfSU8KKyN1bmRlZglIUFRfREVMQVlfSU5URVJSVVBUCisjZGVmaW5lIEhQVF9TRVJJQUxJWkVfSU8JMAogCiBzdGF0aWMgY29uc3QgY2hhciAqcXVpcmtfZHJpdmVzW10gPSB7CiAJIlFVQU5UVU0gRklSRUJBTExsY3QwOCAwOCIsCkBAIC0xNDEsMzA1ICsxNjcsMTc1IEBACiAJTlVMTAogfTsKIAotc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgewotCXU4CQl4ZmVyX3NwZWVkOwotCXVuc2lnbmVkIGludAljaGlwc2V0X3NldHRpbmdzOworc3RhdGljIHU4IHhmZXJfc3BlZWRzW10gPSB7CisJWEZFUl9VRE1BXzYsCisJWEZFUl9VRE1BXzUsCisJWEZFUl9VRE1BXzQsCisJWEZFUl9VRE1BXzMsCisJWEZFUl9VRE1BXzIsCisJWEZFUl9VRE1BXzEsCisJWEZFUl9VRE1BXzAsCisKKwlYRkVSX01XX0RNQV8yLAorCVhGRVJfTVdfRE1BXzEsCisJWEZFUl9NV19ETUFfMCwKKworCVhGRVJfUElPXzQsCisJWEZFUl9QSU9fMywKKwlYRkVSX1BJT18yLAorCVhGRVJfUElPXzEsCisJWEZFUl9QSU9fMAogfTsKIAotLyoga2V5IGZvciBidXMgY2xvY2sgdGltaW5ncwotICogYml0Ci0gKiAwOjMgICAgZGF0YV9oaWdoX3RpbWUuIGluYWN0aXZlIHRpbWUgb2YgRElPV18vRElPUl8gZm9yIFBJTyBhbmQgTVcKLSAqICAgICAgICBETUEuIGN5Y2xlcyA9IHZhbHVlICsgMQotICogNDo4ICAgIGRhdGFfbG93X3RpbWUuIGFjdGl2ZSB0aW1lIG9mIERJT1dfL0RJT1JfIGZvciBQSU8gYW5kIE1XCi0gKiAgICAgICAgRE1BLiBjeWNsZXMgPSB2YWx1ZSArIDEKLSAqIDk6MTIgICBjbWRfaGlnaF90aW1lLiBpbmFjdGl2ZSB0aW1lIG9mIERJT1dfL0RJT1JfIGR1cmluZyB0YXNrIGZpbGUKLSAqICAgICAgICByZWdpc3RlciBhY2Nlc3MuCi0gKiAxMzoxNyAgY21kX2xvd190aW1lLiBhY3RpdmUgdGltZSBvZiBESU9XXy9ESU9SXyBkdXJpbmcgdGFzayBmaWxlCi0gKiAgICAgICAgcmVnaXN0ZXIgYWNjZXNzLgotICogMTg6MjEgIHVkbWFfY3ljbGVfdGltZS4gY2xvY2sgZnJlcSBhbmQgY2xvY2sgY3ljbGVzIGZvciBVRE1BIHhmZXIuCi0gKiAgICAgICAgZHVyaW5nIHRhc2sgZmlsZSByZWdpc3RlciBhY2Nlc3MuCi0gKiAyMjoyNCAgcHJlX2hpZ2hfdGltZS4gdGltZSB0byBpbml0aWFsaXplIDFzdCBjeWNsZSBmb3IgUElPIGFuZCBNVyBETUEKLSAqICAgICAgICB4ZmVyLgotICogMjU6MjcgIGNtZF9wcmVfaGlnaF90aW1lLiB0aW1lIHRvIGluaXRpYWxpemUgMXN0IFBJTyBjeWNsZSBmb3IgdGFzawotICogICAgICAgIHJlZ2lzdGVyIGFjY2Vzcy4KLSAqIDI4ICAgICBVRE1BIGVuYWJsZQotICogMjkgICAgIERNQSBlbmFibGUKLSAqIDMwICAgICBQSU9fTVNUIGVuYWJsZS4gaWYgc2V0LCB0aGUgY2hpcCBpcyBpbiBidXMgbWFzdGVyIG1vZGUgZHVyaW5nCi0gKiAgICAgICAgUElPLgotICogMzEgICAgIEZJRk8gZW5hYmxlLgorLyogS2V5IGZvciBidXMgY2xvY2sgdGltaW5ncworICogMzZ4ICAgMzd4CisgKiBiaXRzICBiaXRzCisgKiAwOjMJIDA6MwlkYXRhX2hpZ2hfdGltZS4gSW5hY3RpdmUgdGltZSBvZiBESU9XXy9ESU9SXyBmb3IgUElPIGFuZCBNVyBETUEuCisgKgkJY3ljbGVzID0gdmFsdWUgKyAxCisgKiA0OjcJIDQ6OAlkYXRhX2xvd190aW1lLiBBY3RpdmUgdGltZSBvZiBESU9XXy9ESU9SXyBmb3IgUElPIGFuZCBNVyBETUEuCisgKgkJY3ljbGVzID0gdmFsdWUgKyAxCisgKiA4OjExICA5OjEyCWNtZF9oaWdoX3RpbWUuIEluYWN0aXZlIHRpbWUgb2YgRElPV18vRElPUl8gZHVyaW5nIHRhc2sgZmlsZQorICoJCXJlZ2lzdGVyIGFjY2Vzcy4KKyAqIDEyOjE1IDEzOjE3CWNtZF9sb3dfdGltZS4gQWN0aXZlIHRpbWUgb2YgRElPV18vRElPUl8gZHVyaW5nIHRhc2sgZmlsZQorICoJCXJlZ2lzdGVyIGFjY2Vzcy4KKyAqIDE2OjE4IDE4OjIwCXVkbWFfY3ljbGVfdGltZS4gQ2xvY2sgY3ljbGVzIGZvciBVRE1BIHhmZXIuCisgKiAtCSAyMQlDTEsgZnJlcXVlbmN5OiAwPUFUQSBjbG9jaywgMT1kdWFsIEFUQSBjbG9jay4KKyAqIDE5OjIxIDIyOjI0CXByZV9oaWdoX3RpbWUuIFRpbWUgdG8gaW5pdGlhbGl6ZSB0aGUgMXN0IGN5Y2xlIGZvciBQSU8gYW5kCisgKgkJTVcgRE1BIHhmZXIuCisgKiAyMjoyNCAyNToyNwljbWRfcHJlX2hpZ2hfdGltZS4gVGltZSB0byBpbml0aWFsaXplIHRoZSAxc3QgUElPIGN5Y2xlIGZvcgorICoJCXRhc2sgZmlsZSByZWdpc3RlciBhY2Nlc3MuCisgKiAyOAkgMjgJVURNQSBlbmFibGUuCisgKiAyOQkgMjkJRE1BICBlbmFibGUuCisgKiAzMAkgMzAJUElPIE1TVCBlbmFibGUuIElmIHNldCwgdGhlIGNoaXAgaXMgaW4gYnVzIG1hc3RlciBtb2RlIGR1cmluZworICoJCVBJTyB4ZmVyLgorICogMzEJIDMxCUZJRk8gZW5hYmxlLgogICovCi1zdGF0aWMgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgZm9ydHlfYmFzZV9ocHQzNjZbXSA9IHsKLQl7CVhGRVJfVURNQV80LAkweDkwMGZkOTQzCX0sCi0JewlYRkVSX1VETUFfMywJMHg5MDBhZDk0Mwl9LAotCXsJWEZFUl9VRE1BXzIsCTB4OTAwYmQ5NDMJfSwKLQl7CVhGRVJfVURNQV8xLAkweDkwMDhkOTQzCX0sCi0JewlYRkVSX1VETUFfMCwJMHg5MDA4ZDk0Mwl9LAogCi0JewlYRkVSX01XX0RNQV8yLAkweGEwMDhkOTQzCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweGEwMTBkOTU1CX0sCi0JewlYRkVSX01XX0RNQV8wLAkweGEwMTBkOWZjCX0sCitzdGF0aWMgdTMyIGZvcnR5X2Jhc2VfaHB0MzZ4W10gPSB7CisJLyogWEZFUl9VRE1BXzYgKi8JMHg5MDBmZDk0MywKKwkvKiBYRkVSX1VETUFfNSAqLwkweDkwMGZkOTQzLAorCS8qIFhGRVJfVURNQV80ICovCTB4OTAwZmQ5NDMsCisJLyogWEZFUl9VRE1BXzMgKi8JMHg5MDBhZDk0MywKKwkvKiBYRkVSX1VETUFfMiAqLwkweDkwMGJkOTQzLAorCS8qIFhGRVJfVURNQV8xICovCTB4OTAwOGQ5NDMsCisJLyogWEZFUl9VRE1BXzAgKi8JMHg5MDA4ZDk0MywKIAotCXsJWEZFUl9QSU9fNCwJMHhjMDA4ZDk2Mwl9LAotCXsJWEZFUl9QSU9fMywJMHhjMDEwZDk3NAl9LAotCXsJWEZFUl9QSU9fMiwJMHhjMDEwZDk5Nwl9LAotCXsJWEZFUl9QSU9fMSwJMHhjMDEwZDljNwl9LAotCXsJWEZFUl9QSU9fMCwJMHhjMDE4ZDlkOQl9LAotCXsJMCwJCTB4MDEyMGQ5ZDkJfQorCS8qIFhGRVJfTVdfRE1BXzIgKi8JMHhhMDA4ZDk0MywKKwkvKiBYRkVSX01XX0RNQV8xICovCTB4YTAxMGQ5NTUsCisJLyogWEZFUl9NV19ETUFfMCAqLwkweGEwMTBkOWZjLAorCisJLyogWEZFUl9QSU9fNCAqLwkweGMwMDhkOTYzLAorCS8qIFhGRVJfUElPXzMgKi8JMHhjMDEwZDk3NCwKKwkvKiBYRkVSX1BJT18yICovCTB4YzAxMGQ5OTcsCisJLyogWEZFUl9QSU9fMSAqLwkweGMwMTBkOWM3LAorCS8qIFhGRVJfUElPXzAgKi8JMHhjMDE4ZDlkOQogfTsKIAotc3RhdGljIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5IHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM2NltdID0gewotCXsJWEZFUl9VRE1BXzQsCTB4OTBjOWE3MzEJfSwKLQl7CVhGRVJfVURNQV8zLAkweDkwY2ZhNzMxCX0sCi0JewlYRkVSX1VETUFfMiwJMHg5MGNhYTczMQl9LAotCXsJWEZFUl9VRE1BXzEsCTB4OTBjYmE3MzEJfSwKLQl7CVhGRVJfVURNQV8wLAkweDkwYzhhNzMxCX0sCitzdGF0aWMgdTMyIHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM2eFtdID0geworCS8qIFhGRVJfVURNQV82ICovCTB4OTBjOWE3MzEsCisJLyogWEZFUl9VRE1BXzUgKi8JMHg5MGM5YTczMSwKKwkvKiBYRkVSX1VETUFfNCAqLwkweDkwYzlhNzMxLAorCS8qIFhGRVJfVURNQV8zICovCTB4OTBjZmE3MzEsCisJLyogWEZFUl9VRE1BXzIgKi8JMHg5MGNhYTczMSwKKwkvKiBYRkVSX1VETUFfMSAqLwkweDkwY2JhNzMxLAorCS8qIFhGRVJfVURNQV8wICovCTB4OTBjOGE3MzEsCiAKLQl7CVhGRVJfTVdfRE1BXzIsCTB4YTBjOGE3MzEJfSwKLQl7CVhGRVJfTVdfRE1BXzEsCTB4YTBjOGE3MzIJfSwJLyogMHhhMGM4YTczMyAqLwotCXsJWEZFUl9NV19ETUFfMCwJMHhhMGM4YTc5Nwl9LAorCS8qIFhGRVJfTVdfRE1BXzIgKi8JMHhhMGM4YTczMSwKKwkvKiBYRkVSX01XX0RNQV8xICovCTB4YTBjOGE3MzIsCS8qIDB4YTBjOGE3MzMgKi8KKwkvKiBYRkVSX01XX0RNQV8wICovCTB4YTBjOGE3OTcsCiAKLQl7CVhGRVJfUElPXzQsCTB4YzBjOGE3MzEJfSwKLQl7CVhGRVJfUElPXzMsCTB4YzBjOGE3NDIJfSwKLQl7CVhGRVJfUElPXzIsCTB4YzBkMGE3NTMJfSwKLQl7CVhGRVJfUElPXzEsCTB4YzBkMGE3YTMJfSwJLyogMHhjMGQwYTc5MyAqLwotCXsJWEZFUl9QSU9fMCwJMHhjMGQwYTdhYQl9LAkvKiAweGMwZDBhN2E3ICovCi0JewkwLAkJMHgwMTIwYTdhNwl9CisJLyogWEZFUl9QSU9fNCAqLwkweGMwYzhhNzMxLAorCS8qIFhGRVJfUElPXzMgKi8JMHhjMGM4YTc0MiwKKwkvKiBYRkVSX1BJT18yICovCTB4YzBkMGE3NTMsCisJLyogWEZFUl9QSU9fMSAqLwkweGMwZDBhN2EzLAkvKiAweGMwZDBhNzkzICovCisJLyogWEZFUl9QSU9fMCAqLwkweGMwZDBhN2FhCS8qIDB4YzBkMGE3YTcgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSB0d2VudHlfZml2ZV9iYXNlX2hwdDM2NltdID0gewotCXsJWEZFUl9VRE1BXzQsCTB4OTBjOTg1MjEJfSwKLQl7CVhGRVJfVURNQV8zLAkweDkwY2Y4NTIxCX0sCi0JewlYRkVSX1VETUFfMiwJMHg5MGNmODUyMQl9LAotCXsJWEZFUl9VRE1BXzEsCTB4OTBjYjg1MjEJfSwKLQl7CVhGRVJfVURNQV8wLAkweDkwY2I4NTIxCX0sCitzdGF0aWMgdTMyIHR3ZW50eV9maXZlX2Jhc2VfaHB0MzZ4W10gPSB7CisJLyogWEZFUl9VRE1BXzYgKi8JMHg5MGM5ODUyMSwKKwkvKiBYRkVSX1VETUFfNSAqLwkweDkwYzk4NTIxLAorCS8qIFhGRVJfVURNQV80ICovCTB4OTBjOTg1MjEsCisJLyogWEZFUl9VRE1BXzMgKi8JMHg5MGNmODUyMSwKKwkvKiBYRkVSX1VETUFfMiAqLwkweDkwY2Y4NTIxLAorCS8qIFhGRVJfVURNQV8xICovCTB4OTBjYjg1MjEsCisJLyogWEZFUl9VRE1BXzAgKi8JMHg5MGNiODUyMSwKIAotCXsJWEZFUl9NV19ETUFfMiwJMHhhMGNhODUyMQl9LAotCXsJWEZFUl9NV19ETUFfMSwJMHhhMGNhODUzMgl9LAotCXsJWEZFUl9NV19ETUFfMCwJMHhhMGNhODU3NQl9LAorCS8qIFhGRVJfTVdfRE1BXzIgKi8JMHhhMGNhODUyMSwKKwkvKiBYRkVSX01XX0RNQV8xICovCTB4YTBjYTg1MzIsCisJLyogWEZFUl9NV19ETUFfMCAqLwkweGEwY2E4NTc1LAogCi0JewlYRkVSX1BJT180LAkweGMwY2E4NTIxCX0sCi0JewlYRkVSX1BJT18zLAkweGMwY2E4NTMyCX0sCi0JewlYRkVSX1BJT18yLAkweGMwY2E4NTQyCX0sCi0JewlYRkVSX1BJT18xLAkweGMwZDA4NTcyCX0sCi0JewlYRkVSX1BJT18wLAkweGMwZDA4NTg1CX0sCi0JewkwLAkJMHgwMTIwODU4NQl9CisJLyogWEZFUl9QSU9fNCAqLwkweGMwY2E4NTIxLAorCS8qIFhGRVJfUElPXzMgKi8JMHhjMGNhODUzMiwKKwkvKiBYRkVSX1BJT18yICovCTB4YzBjYTg1NDIsCisJLyogWEZFUl9QSU9fMSAqLwkweGMwZDA4NTcyLAorCS8qIFhGRVJfUElPXzAgKi8JMHhjMGQwODU4NQogfTsKIAotLyogZnJvbSBoaWdocG9pbnQgZG9jdW1lbnRhdGlvbi4gdGhlc2UgYXJlIG9sZCB2YWx1ZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzBbXSA9IHsKLS8qCXsJWEZFUl9VRE1BXzUsCTB4MUE4NUY0NDIsCTB4MTY0NTRlMzEJfSwgKi8KLQl7CVhGRVJfVURNQV81LAkweDE2NDU0ZTMxCX0sCi0JewlYRkVSX1VETUFfNCwJMHgxNjQ1NGUzMQl9LAotCXsJWEZFUl9VRE1BXzMsCTB4MTY2ZDRlMzEJfSwKLQl7CVhGRVJfVURNQV8yLAkweDE2NDk0ZTMxCX0sCi0JewlYRkVSX1VETUFfMSwJMHgxNjRkNGUzMQl9LAotCXsJWEZFUl9VRE1BXzAsCTB4MTY1MTRlMzEJfSwKK3N0YXRpYyB1MzIgdGhpcnR5X3RocmVlX2Jhc2VfaHB0Mzd4W10gPSB7CisJLyogWEZFUl9VRE1BXzYgKi8JMHgxMjQ0NjIzMSwJLyogMHgxMjY0NjIzMSA/PyAqLworCS8qIFhGRVJfVURNQV81ICovCTB4MTI0NDYyMzEsCisJLyogWEZFUl9VRE1BXzQgKi8JMHgxMjQ0NjIzMSwKKwkvKiBYRkVSX1VETUFfMyAqLwkweDEyNmM2MjMxLAorCS8qIFhGRVJfVURNQV8yICovCTB4MTI0ODYyMzEsCisJLyogWEZFUl9VRE1BXzEgKi8JMHgxMjRjNjIzMywKKwkvKiBYRkVSX1VETUFfMCAqLwkweDEyNTA2Mjk3LAogCi0JewlYRkVSX01XX0RNQV8yLAkweDI2NTE0ZTIxCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDI2NTE0ZTMzCX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDI2NTE0ZTk3CX0sCisJLyogWEZFUl9NV19ETUFfMiAqLwkweDIyNDA2YzMxLAorCS8qIFhGRVJfTVdfRE1BXzEgKi8JMHgyMjQwNmMzMywKKwkvKiBYRkVSX01XX0RNQV8wICovCTB4MjI0MDZjOTcsCiAKLQl7CVhGRVJfUElPXzQsCTB4MDY1MTRlMjEJfSwKLQl7CVhGRVJfUElPXzMsCTB4MDY1MTRlMjIJfSwKLQl7CVhGRVJfUElPXzIsCTB4MDY1MTRlMzMJfSwKLQl7CVhGRVJfUElPXzEsCTB4MDY5MTRlNDMJfSwKLQl7CVhGRVJfUElPXzAsCTB4MDY5MTRlNTcJfSwKLQl7CTAsCQkweDA2NTE0ZTU3CX0KKwkvKiBYRkVSX1BJT180ICovCTB4MDY0MTRlMzEsCisJLyogWEZFUl9QSU9fMyAqLwkweDA2NDE0ZTQyLAorCS8qIFhGRVJfUElPXzIgKi8JMHgwNjQxNGU1MywKKwkvKiBYRkVSX1BJT18xICovCTB4MDY4MTRlOTMsCisJLyogWEZFUl9QSU9fMCAqLwkweDA2ODE0ZWE3CiB9OwogCi1zdGF0aWMgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgc2l4dHlfc2l4X2Jhc2VfaHB0MzcwW10gPSB7Ci0JewlYRkVSX1VETUFfNSwJMHgxNDg0NjIzMQl9LAotCXsJWEZFUl9VRE1BXzQsCTB4MTQ4ODYyMzEJfSwKLQl7CVhGRVJfVURNQV8zLAkweDE0OGM2MjMxCX0sCi0JewlYRkVSX1VETUFfMiwJMHgxNDhjNjIzMQl9LAotCXsJWEZFUl9VRE1BXzEsCTB4MTQ5MDYyMzEJfSwKLQl7CVhGRVJfVURNQV8wLAkweDE0OTg2MjMxCX0sCitzdGF0aWMgdTMyIGZpZnR5X2Jhc2VfaHB0Mzd4W10gPSB7CisJLyogWEZFUl9VRE1BXzYgKi8JMHgxMjg0ODI0MiwKKwkvKiBYRkVSX1VETUFfNSAqLwkweDEyODQ4MjQyLAorCS8qIFhGRVJfVURNQV80ICovCTB4MTJhYzgyNDIsCisJLyogWEZFUl9VRE1BXzMgKi8JMHgxMjhjODI0MiwKKwkvKiBYRkVSX1VETUFfMiAqLwkweDEyMGM4MjQyLAorCS8qIFhGRVJfVURNQV8xICovCTB4MTIxNDgyNTQsCisJLyogWEZFUl9VRE1BXzAgKi8JMHgxMjE4ODJlYSwKIAotCXsJWEZFUl9NV19ETUFfMiwJMHgyNjUxNGUyMQl9LAotCXsJWEZFUl9NV19ETUFfMSwJMHgyNjUxNGUzMwl9LAotCXsJWEZFUl9NV19ETUFfMCwJMHgyNjUxNGU5Nwl9LAorCS8qIFhGRVJfTVdfRE1BXzIgKi8JMHgyMjgwODI0MiwKKwkvKiBYRkVSX01XX0RNQV8xICovCTB4MjI4MDgyNTQsCisJLyogWEZFUl9NV19ETUFfMCAqLwkweDIyODA4MmVhLAogCi0JewlYRkVSX1BJT180LAkweDA2NTE0ZTIxCX0sCi0JewlYRkVSX1BJT18zLAkweDA2NTE0ZTIyCX0sCi0JewlYRkVSX1BJT18yLAkweDA2NTE0ZTMzCX0sCi0JewlYRkVSX1BJT18xLAkweDA2OTE0ZTQzCX0sCi0JewlYRkVSX1BJT18wLAkweDA2OTE0ZTU3CX0sCi0JewkwLAkJMHgwNjUxNGU1Nwl9CisJLyogWEZFUl9QSU9fNCAqLwkweDBhODFmNDQyLAorCS8qIFhGRVJfUElPXzMgKi8JMHgwYTgxZjQ0MywKKwkvKiBYRkVSX1BJT18yICovCTB4MGE4MWY0NTQsCisJLyogWEZFUl9QSU9fMSAqLwkweDBhYzFmNDY1LAorCS8qIFhGRVJfUElPXzAgKi8JMHgwYWMxZjQ4YQogfTsKIAotLyogdGhlc2UgYXJlIHRoZSBjdXJyZW50ICg0IHNlcCAyMDAxKSB0aW1pbmdzIGZyb20gaGlnaHBvaW50ICovCi1zdGF0aWMgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzcwYVtdID0gewotCXsJWEZFUl9VRE1BXzUsCTB4MTI0NDYyMzEJfSwKLQl7CVhGRVJfVURNQV80LAkweDEyNDQ2MjMxCX0sCi0JewlYRkVSX1VETUFfMywJMHgxMjZjNjIzMQl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MTI0ODYyMzEJfSwKLQl7CVhGRVJfVURNQV8xLAkweDEyNGM2MjMzCX0sCi0JewlYRkVSX1VETUFfMCwJMHgxMjUwNjI5Nwl9LAorc3RhdGljIHUzMiBzaXh0eV9zaXhfYmFzZV9ocHQzN3hbXSA9IHsKKwkvKiBYRkVSX1VETUFfNiAqLwkweDFjODY5YzYyLAorCS8qIFhGRVJfVURNQV81ICovCTB4MWNhZTljNjIsCS8qIDB4MWM4YTljNjIgKi8KKwkvKiBYRkVSX1VETUFfNCAqLwkweDFjOGE5YzYyLAorCS8qIFhGRVJfVURNQV8zICovCTB4MWM4ZTljNjIsCisJLyogWEZFUl9VRE1BXzIgKi8JMHgxYzkyOWM2MiwKKwkvKiBYRkVSX1VETUFfMSAqLwkweDFjOWE5YzYyLAorCS8qIFhGRVJfVURNQV8wICovCTB4MWM4MjljNjIsCiAKLQl7CVhGRVJfTVdfRE1BXzIsCTB4MjI0MDZjMzEJfSwKLQl7CVhGRVJfTVdfRE1BXzEsCTB4MjI0MDZjMzMJfSwKLQl7CVhGRVJfTVdfRE1BXzAsCTB4MjI0MDZjOTcJfSwKKwkvKiBYRkVSX01XX0RNQV8yICovCTB4MmM4MjljNjIsCisJLyogWEZFUl9NV19ETUFfMSAqLwkweDJjODI5YzY2LAorCS8qIFhGRVJfTVdfRE1BXzAgKi8JMHgyYzgyOWQyZSwKIAotCXsJWEZFUl9QSU9fNCwJMHgwNjQxNGUzMQl9LAotCXsJWEZFUl9QSU9fMywJMHgwNjQxNGU0Mgl9LAotCXsJWEZFUl9QSU9fMiwJMHgwNjQxNGU1Mwl9LAotCXsJWEZFUl9QSU9fMSwJMHgwNjgxNGU5Mwl9LAotCXsJWEZFUl9QSU9fMCwJMHgwNjgxNGVhNwl9LAotCXsJMCwJCTB4MDY4MTRlYTcJfQorCS8qIFhGRVJfUElPXzQgKi8JMHgwYzgyOWM2MiwKKwkvKiBYRkVSX1BJT18zICovCTB4MGM4MjljODQsCisJLyogWEZFUl9QSU9fMiAqLwkweDBjODI5Y2E2LAorCS8qIFhGRVJfUElPXzEgKi8JMHgwZDAyOWQyNiwKKwkvKiBYRkVSX1BJT18wICovCTB4MGQwMjlkNWUKIH07CiAKLS8qIDJ4IDMzTUh6IHRpbWluZ3MgKi8KLXN0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSBzaXh0eV9zaXhfYmFzZV9ocHQzNzBhW10gPSB7Ci0JewlYRkVSX1VETUFfNSwJMHgxNDg4ZTY3Mwl9LAotCXsJWEZFUl9VRE1BXzQsCTB4MTQ4OGU2NzMJfSwKLQl7CVhGRVJfVURNQV8zLAkweDE0OThlNjczCX0sCi0JewlYRkVSX1VETUFfMiwJMHgxNDkwZTY3Mwl9LAotCXsJWEZFUl9VRE1BXzEsCTB4MTQ5OGU2NzcJfSwKLQl7CVhGRVJfVURNQV8wLAkweDE0YTBlNzNmCX0sCi0KLQl7CVhGRVJfTVdfRE1BXzIsCTB4MjQ4MGZhNzMJfSwKLQl7CVhGRVJfTVdfRE1BXzEsCTB4MjQ4MGZhNzcJfSwgCi0JewlYRkVSX01XX0RNQV8wLAkweDI0ODBmYjNmCX0sCi0KLQl7CVhGRVJfUElPXzQsCTB4MGM4MmJlNzMJfSwKLQl7CVhGRVJfUElPXzMsCTB4MGM4MmJlOTUJfSwKLQl7CVhGRVJfUElPXzIsCTB4MGM4MmJlYjcJfSwKLQl7CVhGRVJfUElPXzEsCTB4MGQwMmJmMzcJfSwKLQl7CVhGRVJfUElPXzAsCTB4MGQwMmJmNWYJfSwKLQl7CTAsCQkweDBkMDJiZjVmCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSBmaWZ0eV9iYXNlX2hwdDM3MGFbXSA9IHsKLQl7CVhGRVJfVURNQV81LAkweDEyODQ4MjQyCX0sCi0JewlYRkVSX1VETUFfNCwJMHgxMmFjODI0Mgl9LAotCXsJWEZFUl9VRE1BXzMsCTB4MTI4YzgyNDIJfSwKLQl7CVhGRVJfVURNQV8yLAkweDEyMGM4MjQyCX0sCi0JewlYRkVSX1VETUFfMSwJMHgxMjE0ODI1NAl9LAotCXsJWEZFUl9VRE1BXzAsCTB4MTIxODgyZWEJfSwKLQotCXsJWEZFUl9NV19ETUFfMiwJMHgyMjgwODI0Mgl9LAotCXsJWEZFUl9NV19ETUFfMSwJMHgyMjgwODI1NAl9LAotCXsJWEZFUl9NV19ETUFfMCwJMHgyMjgwODJlYQl9LAotCi0JewlYRkVSX1BJT180LAkweDBhODFmNDQyCX0sCi0JewlYRkVSX1BJT18zLAkweDBhODFmNDQzCX0sCi0JewlYRkVSX1BJT18yLAkweDBhODFmNDU0CX0sCi0JewlYRkVSX1BJT18xLAkweDBhYzFmNDY1CX0sCi0JewlYRkVSX1BJT18wLAkweDBhYzFmNDhhCX0sCi0JewkwLAkJMHgwYWMxZjQ4YQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzcyW10gPSB7Ci0JewlYRkVSX1VETUFfNiwJMHgxYzgxZGM2Mgl9LAotCXsJWEZFUl9VRE1BXzUsCTB4MWM2ZGRjNjIJfSwKLQl7CVhGRVJfVURNQV80LAkweDFjOGRkYzYyCX0sCi0JewlYRkVSX1VETUFfMywJMHgxYzhlZGM2Mgl9LAkvKiBjaGVja21lICovCi0JewlYRkVSX1VETUFfMiwJMHgxYzkxZGM2Mgl9LAotCXsJWEZFUl9VRE1BXzEsCTB4MWM5YWRjNjIJfSwJLyogY2hlY2ttZSAqLwotCXsJWEZFUl9VRE1BXzAsCTB4MWM4MmRjNjIJfSwJLyogY2hlY2ttZSAqLwotCi0JewlYRkVSX01XX0RNQV8yLAkweDJjODI5MjYyCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDJjODI5MjY2CX0sCS8qIGNoZWNrbWUgKi8KLQl7CVhGRVJfTVdfRE1BXzAsCTB4MmM4MjkyMmUJfSwJLyogY2hlY2ttZSAqLwotCi0JewlYRkVSX1BJT180LAkweDBjODI5YzYyCX0sCi0JewlYRkVSX1BJT18zLAkweDBjODI5Yzg0CX0sCi0JewlYRkVSX1BJT18yLAkweDBjODI5Y2E2CX0sCi0JewlYRkVSX1BJT18xLAkweDBkMDI5ZDI2CX0sCi0JewlYRkVSX1BJT18wLAkweDBkMDI5ZDVlCX0sCi0JewkwLAkJMHgwZDAyOWQ1ZQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgZmlmdHlfYmFzZV9ocHQzNzJbXSA9IHsKLQl7CVhGRVJfVURNQV81LAkweDEyODQ4MjQyCX0sCi0JewlYRkVSX1VETUFfNCwJMHgxMmFjODI0Mgl9LAotCXsJWEZFUl9VRE1BXzMsCTB4MTI4YzgyNDIJfSwKLQl7CVhGRVJfVURNQV8yLAkweDEyMGM4MjQyCX0sCi0JewlYRkVSX1VETUFfMSwJMHgxMjE0ODI1NAl9LAotCXsJWEZFUl9VRE1BXzAsCTB4MTIxODgyZWEJfSwKLQotCXsJWEZFUl9NV19ETUFfMiwJMHgyMjgwODI0Mgl9LAotCXsJWEZFUl9NV19ETUFfMSwJMHgyMjgwODI1NAl9LAotCXsJWEZFUl9NV19ETUFfMCwJMHgyMjgwODJlYQl9LAotCi0JewlYRkVSX1BJT180LAkweDBhODFmNDQyCX0sCi0JewlYRkVSX1BJT18zLAkweDBhODFmNDQzCX0sCi0JewlYRkVSX1BJT18yLAkweDBhODFmNDU0CX0sCi0JewlYRkVSX1BJT18xLAkweDBhYzFmNDY1CX0sCi0JewlYRkVSX1BJT18wLAkweDBhYzFmNDhhCX0sCi0JewkwLAkJMHgwYTgxZjQ0Mwl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgc2l4dHlfc2l4X2Jhc2VfaHB0MzcyW10gPSB7Ci0JewlYRkVSX1VETUFfNiwJMHgxYzg2OWM2Mgl9LAotCXsJWEZFUl9VRE1BXzUsCTB4MWNhZTljNjIJfSwKLQl7CVhGRVJfVURNQV80LAkweDFjOGE5YzYyCX0sCi0JewlYRkVSX1VETUFfMywJMHgxYzhlOWM2Mgl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MWM5MjljNjIJfSwKLQl7CVhGRVJfVURNQV8xLAkweDFjOWE5YzYyCX0sCi0JewlYRkVSX1VETUFfMCwJMHgxYzgyOWM2Mgl9LAotCi0JewlYRkVSX01XX0RNQV8yLAkweDJjODI5YzYyCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDJjODI5YzY2CX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDJjODI5ZDJlCX0sCi0KLQl7CVhGRVJfUElPXzQsCTB4MGM4MjljNjIJfSwKLQl7CVhGRVJfUElPXzMsCTB4MGM4MjljODQJfSwKLQl7CVhGRVJfUElPXzIsCTB4MGM4MjljYTYJfSwKLQl7CVhGRVJfUElPXzEsCTB4MGQwMjlkMjYJfSwKLQl7CVhGRVJfUElPXzAsCTB4MGQwMjlkNWUJfSwKLQl7CTAsCQkweDBkMDI5ZDI2CX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzRbXSA9IHsKLQl7CVhGRVJfVURNQV82LAkweDEyODA4MjQyCX0sCi0JewlYRkVSX1VETUFfNSwJMHgxMjg0ODI0Mgl9LAotCXsJWEZFUl9VRE1BXzQsCTB4MTJhYzgyNDIJfSwKLQl7CVhGRVJfVURNQV8zLAkweDEyOGM4MjQyCX0sCi0JewlYRkVSX1VETUFfMiwJMHgxMjBjODI0Mgl9LAotCXsJWEZFUl9VRE1BXzEsCTB4MTIxNDgyNTQJfSwKLQl7CVhGRVJfVURNQV8wLAkweDEyMTg4MmVhCX0sCi0KLQl7CVhGRVJfTVdfRE1BXzIsCTB4MjI4MDgyNDIJfSwKLQl7CVhGRVJfTVdfRE1BXzEsCTB4MjI4MDgyNTQJfSwKLQl7CVhGRVJfTVdfRE1BXzAsCTB4MjI4MDgyZWEJfSwKLQotCXsJWEZFUl9QSU9fNCwJMHgwYTgxZjQ0Mgl9LAotCXsJWEZFUl9QSU9fMywJMHgwYTgxZjQ0Mwl9LAotCXsJWEZFUl9QSU9fMiwJMHgwYTgxZjQ1NAl9LAotCXsJWEZFUl9QSU9fMSwJMHgwYWMxZjQ2NQl9LAotCXsJWEZFUl9QSU9fMCwJMHgwYWMxZjQ4YQl9LAotCXsJMCwJCTB4MDY4MTRlOTMJfQotfTsKLQotLyogRklYTUU6IDUwTUh6IHRpbWluZ3MgZm9yIEhQVDM3NCAqLwotCi0jaWYgMAotc3RhdGljIHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5IHNpeHR5X3NpeF9iYXNlX2hwdDM3NFtdID0gewotCXsJWEZFUl9VRE1BXzYsCTB4MTI0MDYyMzEJfSwJLyogY2hlY2ttZSAqLwotCXsJWEZFUl9VRE1BXzUsCTB4MTI0NDYyMzEJfSwJLyogMHgxNDg0NjIzMSAqLwotCXsJWEZFUl9VRE1BXzQsCTB4MTY4MTRlYTcJfSwJLyogMHgxNDg4NjIzMSAqLwotCXsJWEZFUl9VRE1BXzMsCTB4MTY4MTRlYTcJfSwJLyogMHgxNDhjNjIzMSAqLwotCXsJWEZFUl9VRE1BXzIsCTB4MTY4MTRlYTcJfSwJLyogMHgxNDhjNjIzMSAqLwotCXsJWEZFUl9VRE1BXzEsCTB4MTY4MTRlYTcJfSwJLyogMHgxNDkwNjIzMSAqLwotCXsJWEZFUl9VRE1BXzAsCTB4MTY4MTRlYTcJfSwJLyogMHgxNDk4NjIzMSAqLwotCXsJWEZFUl9NV19ETUFfMiwJMHgxNjgxNGVhNwl9LAkvKiAweDI2NTE0ZTIxICovCi0JewlYRkVSX01XX0RNQV8xLAkweDE2ODE0ZWE3CX0sCS8qIDB4MjY1MTRlOTcgKi8KLQl7CVhGRVJfTVdfRE1BXzAsCTB4MTY4MTRlYTcJfSwJLyogMHgyNjUxNGU5NyAqLwotCXsJWEZFUl9QSU9fNCwJMHgwNjgxNGVhNwl9LAkvKiAweDA2NTE0ZTIxICovCi0JewlYRkVSX1BJT18zLAkweDA2ODE0ZWE3CX0sCS8qIDB4MDY1MTRlMjIgKi8KLQl7CVhGRVJfUElPXzIsCTB4MDY4MTRlYTcJfSwJLyogMHgwNjUxNGUzMyAqLwotCXsJWEZFUl9QSU9fMSwJMHgwNjgxNGVhNwl9LAkvKiAweDA2OTE0ZTQzICovCi0JewlYRkVSX1BJT18wLAkweDA2ODE0ZWE3CX0sCS8qIDB4MDY5MTRlNTcgKi8KLQl7CTAsCQkweDA2ODE0ZWE3CX0KLX07Ci0jZW5kaWYKLQogI2RlZmluZSBIUFQzNjZfREVCVUdfRFJJVkVfSU5GTwkJMAogI2RlZmluZSBIUFQzNzRfQUxMT1dfQVRBMTMzXzYJCTAKICNkZWZpbmUgSFBUMzcxX0FMTE9XX0FUQTEzM182CQkwCiAjZGVmaW5lIEhQVDMwMl9BTExPV19BVEExMzNfNgkJMAotI2RlZmluZSBIUFQzNzJfQUxMT1dfQVRBMTMzXzYJCTEKKyNkZWZpbmUgSFBUMzcyX0FMTE9XX0FUQTEzM182CQkwCiAjZGVmaW5lIEhQVDM3MF9BTExPV19BVEExMDBfNQkJMQogI2RlZmluZSBIUFQzNjZfQUxMT1dfQVRBNjZfNAkJMQogI2RlZmluZSBIUFQzNjZfQUxMT1dfQVRBNjZfMwkJMQpAQCAtNDYxLDkgKzM1NywxMCBAQAogCWludCByZXZpc2lvbjsJCS8qIENoaXBzZXQgcmV2aXNpb24gKi8KIAlpbnQgZmxhZ3M7CQkvKiBDaGlwc2V0IHByb3BlcnRpZXMgKi8KICNkZWZpbmUgUExMX01PREUJMQotI2RlZmluZSBJU18zNzJOCQkyCisjZGVmaW5lIElTXzN4eE4gCTIKKyNkZWZpbmUgUENJXzY2TUhaCTQKIAkJCQkvKiBTcGVlZCB0YWJsZSAqLwotCXN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5ICpzcGVlZDsKKwl1MzIgKnNwZWVkOwogfTsKIAogLyoKQEAgLTYwMCwxMiArNDk3LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGNpX2J1c19jbG9ja19saXN0ICh1OCBzcGVlZCwgc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKiBjaGlwc2V0X3RhYmxlKQorc3RhdGljIHUzMiBwY2lfYnVzX2Nsb2NrX2xpc3QodTggc3BlZWQsIHUzMiAqY2hpcHNldF90YWJsZSkKIHsKLQlmb3IgKCA7IGNoaXBzZXRfdGFibGUtPnhmZXJfc3BlZWQgOyBjaGlwc2V0X3RhYmxlKyspCi0JCWlmIChjaGlwc2V0X3RhYmxlLT54ZmVyX3NwZWVkID09IHNwZWVkKQotCQkJcmV0dXJuIGNoaXBzZXRfdGFibGUtPmNoaXBzZXRfc2V0dGluZ3M7Ci0JcmV0dXJuIGNoaXBzZXRfdGFibGUtPmNoaXBzZXRfc2V0dGluZ3M7CisJaW50IGk7CisKKwkvKgorCSAqIExvb2t1cCB0aGUgdHJhbnNmZXIgbW9kZSB0YWJsZSB0byBnZXQgdGhlIGluZGV4IGludG8KKwkgKiB0aGUgdGltaW5nIHRhYmxlLgorCSAqCisJICogTk9URTogRm9yIFhGRVJfUElPX1NMT1csIFBJTyBtb2RlIDAgdGltaW5ncyB3aWxsIGJlIHVzZWQuCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeGZlcl9zcGVlZHMpIC0gMTsgaSsrKQorCQlpZiAoeGZlcl9zcGVlZHNbaV0gPT0gc3BlZWQpCisJCQlicmVhazsKKwlyZXR1cm4gY2hpcHNldF90YWJsZVtpXTsKIH0KIAogc3RhdGljIGludCBocHQzNnhfdHVuZV9jaGlwc2V0KGlkZV9kcml2ZV90ICpkcml2ZSwgdTggeGZlcnNwZWVkKQpAQCAtOTU2LDE1NiArODYxLDEyNyBAQAogfQogCiAvKioKLSAqCWhwdDM3Mm5fc2V0X2Nsb2NrCS0JcGVyZm9ybSBjbG9jayBzd2l0Y2hpbmcgZGFuY2UKLSAqCUBkcml2ZTogRHJpdmUgdG8gc3dpdGNoCi0gKglAbW9kZTogU3dpdGNoaW5nIG1vZGUgKDB4MjEgZm9yIHdyaXRlLCAweDIzIG90aGVyd2lzZSkKKyAqCWhwdDN4eG5fc2V0X2Nsb2NrCS0JcGVyZm9ybSBjbG9jayBzd2l0Y2hpbmcgZGFuY2UKKyAqCUBod2lmOiBod2lmIHRvIHN3aXRjaAorICoJQG1vZGU6IGNsb2NraW5nIG1vZGUgKDB4MjEgZm9yIHdyaXRlLCAweDIzIG90aGVyd2lzZSkKICAqCi0gKglTd2l0Y2ggdGhlIERQTEwgY2xvY2sgb24gdGhlIEhQVDM3Mk4gZGV2aWNlcy4gVGhpcyBpcyBhCi0gKglyaWdodCBtZXNzLgorICoJU3dpdGNoIHRoZSBEUExMIGNsb2NrIG9uIHRoZSBIUFQzeHhOIGRldmljZXMuIFRoaXMgaXMgYQlyaWdodCBtZXNzLgorICoJTk9URTogYXZvaWQgdG91Y2hpbmcgdGhlIGRpc2FibGVkIHByaW1hcnkgY2hhbm5lbCBvbiBIUFQzNzFOIC0tIGl0CisgKglkb2Vzbid0IHBoeXNpY2FsbHkgZXhpc3QgYW55d2F5Li4uCiAgKi8KLSAKLXN0YXRpYyB2b2lkIGhwdDM3Mm5fc2V0X2Nsb2NrKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IG1vZGUpCisKK3N0YXRpYyB2b2lkIGhwdDN4eG5fc2V0X2Nsb2NrKGlkZV9od2lmX3QgKmh3aWYsIHU4IG1vZGUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOwotCQotCS8qIEZJWE1FOiBzaG91bGQgd2UgY2hlY2sgZm9yIERNQSBhY3RpdmUgYW5kIEJVRygpICovCisJdTggbWNyMSwgc2NyMiA9IGh3aWYtPklOQihod2lmLT5kbWFfbWFzdGVyICsgMHg3Yik7CisKKwlpZiAoKHNjcjIgJiAweDdmKSA9PSBtb2RlKQorCQlyZXR1cm47CisKKwkvKiBNSVNDLiBjb250cm9sIHJlZ2lzdGVyIDEgaGFzIHRoZSBjaGFubmVsIGVuYWJsZSBiaXQuLi4gKi8KKwltY3IxID0gaHdpZi0+SU5CKGh3aWYtPmRtYV9tYXN0ZXIgKyAweDcwKTsKKwogCS8qIFRyaXN0YXRlIHRoZSBidXMgKi8KLQlvdXRiKDB4ODAsIGh3aWYtPmRtYV9iYXNlKzB4NzMpOwotCW91dGIoMHg4MCwgaHdpZi0+ZG1hX2Jhc2UrMHg3Nyk7Ci0JCisJaWYgKG1jcjEgJiAweDA0KQorCQlod2lmLT5PVVRCKDB4ODAsIGh3aWYtPmRtYV9tYXN0ZXIgKyAweDczKTsKKwlod2lmLT5PVVRCKDB4ODAsIGh3aWYtPmRtYV9tYXN0ZXIgKyAweDc3KTsKKwogCS8qIFN3aXRjaCBjbG9jayBhbmQgcmVzZXQgY2hhbm5lbHMgKi8KLQlvdXRiKG1vZGUsIGh3aWYtPmRtYV9iYXNlKzB4N0IpOwotCW91dGIoMHhDMCwgaHdpZi0+ZG1hX2Jhc2UrMHg3OSk7Ci0JCisJaHdpZi0+T1VUQihtb2RlLCBod2lmLT5kbWFfbWFzdGVyICsgMHg3Yik7CisJaHdpZi0+T1VUQigweGMwLCBod2lmLT5kbWFfbWFzdGVyICsgMHg3OSk7CisKIAkvKiBSZXNldCBzdGF0ZSBtYWNoaW5lcyAqLwotCW91dGIoMHgzNywgaHdpZi0+ZG1hX2Jhc2UrMHg3MCk7Ci0Jb3V0YigweDM3LCBod2lmLT5kbWFfYmFzZSsweDc0KTsKLQkKKwlpZiAobWNyMSAmIDB4MDQpCisJCWh3aWYtPk9VVEIoMHgzNywgaHdpZi0+ZG1hX21hc3RlciArIDB4NzApOworCWh3aWYtPk9VVEIoMHgzNywgaHdpZi0+ZG1hX21hc3RlciArIDB4NzQpOworCiAJLyogQ29tcGxldGUgcmVzZXQgKi8KLQlvdXRiKDB4MDAsIGh3aWYtPmRtYV9iYXNlKzB4NzkpOwotCQorCWh3aWYtPk9VVEIoMHgwMCwgaHdpZi0+ZG1hX21hc3RlciArIDB4NzkpOworCiAJLyogUmVjb25uZWN0IGNoYW5uZWxzIHRvIGJ1cyAqLwotCW91dGIoMHgwMCwgaHdpZi0+ZG1hX2Jhc2UrMHg3Myk7Ci0Jb3V0YigweDAwLCBod2lmLT5kbWFfYmFzZSsweDc3KTsKKwlpZiAobWNyMSAmIDB4MDQpCisJCWh3aWYtPk9VVEIoMHgwMCwgaHdpZi0+ZG1hX21hc3RlciArIDB4NzMpOworCWh3aWYtPk9VVEIoMHgwMCwgaHdpZi0+ZG1hX21hc3RlciArIDB4NzcpOwogfQogCiAvKioKLSAqCWhwdDM3Mm5fcndfZGlzawkJLQlwcmVwYXJlIGZvciBJL08KKyAqCWhwdDN4eG5fcndfZGlzawkJLQlwcmVwYXJlIGZvciBJL08KICAqCUBkcml2ZTogZHJpdmUgZm9yIGNvbW1hbmQKICAqCUBycTogYmxvY2sgcmVxdWVzdCBzdHJ1Y3R1cmUKICAqCi0gKglUaGlzIGlzIGNhbGxlZCB3aGVuIGEgZGlzayBJL08gaXMgaXNzdWVkIHRvIHRoZSAzNzJOLgorICoJVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGRpc2sgSS9PIGlzIGlzc3VlZCB0byBIUFQzeHhOLgogICoJV2UgbmVlZCBpdCBiZWNhdXNlIG9mIHRoZSBjbG9jayBzd2l0Y2hpbmcuCiAgKi8KIAotc3RhdGljIHZvaWQgaHB0Mzcybl9yd19kaXNrKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQotewotCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpbnQgd2FudGNsb2NrOwotCi0Jd2FudGNsb2NrID0gcnFfZGF0YV9kaXIocnEpID8gMHgyMyA6IDB4MjE7Ci0KLQlpZiAoaHdpZi0+Y29uZmlnX2RhdGEgIT0gd2FudGNsb2NrKSB7Ci0JCWhwdDM3Mm5fc2V0X2Nsb2NrKGRyaXZlLCB3YW50Y2xvY2spOwotCQlod2lmLT5jb25maWdfZGF0YSA9IHdhbnRjbG9jazsKLQl9Ci19Ci0KLS8qCi0gKiBTaW5jZSBTVU4gQ29iYWx0IGlzIGF0dGVtcHRpbmcgdG8gZG8gdGhpcyBvcGVyYXRpb24sIEkgc2hvdWxkIGRpc2Nsb3NlCi0gKiB0aGlzIGhhcyBiZWVuIGEgbG9uZyB0aW1lIGFnbyBUaHUgSnVsIDI3IDE2OjQwOjU3IDIwMDAgd2FzIHRoZSBwYXRjaCBkYXRlCi0gKiBIT1RTV0FQIEFUQSBJbmZyYXN0cnVjdHVyZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBocHQzeHhfcmVzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLX0KLQotc3RhdGljIGludCBocHQzeHhfdHJpc3RhdGUgKGlkZV9kcml2ZV90ICogZHJpdmUsIGludCBzdGF0ZSkKK3N0YXRpYyB2b2lkIGhwdDN4eG5fcndfZGlzayhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7Ci0JdTggcmVnNTloID0gMCwgcmVzZXQJPSAoaHdpZi0+Y2hhbm5lbCkgPyAweDgwIDogMHg0MDsKLQl1OCByZWdYWGggPSAwLCBzdGF0ZV9yZWc9IChod2lmLT5jaGFubmVsKSA/IDB4NTcgOiAweDUzOworCXU4IHdhbnRjbG9jawkJPSBycV9kYXRhX2RpcihycSkgPyAweDIzIDogMHgyMTsKIAotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1OSwgJnJlZzU5aCk7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBzdGF0ZV9yZWcsICZyZWdYWGgpOwotCi0JaWYgKHN0YXRlKSB7Ci0JCSh2b2lkKSBpZGVfZG9fcmVzZXQoZHJpdmUpOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBzdGF0ZV9yZWcsIHJlZ1hYaHwweDgwKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1OSwgcmVnNTlofHJlc2V0KTsKLQl9IGVsc2UgewotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU5LCByZWc1OWggJiB+KHJlc2V0KSk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIHN0YXRlX3JlZywgcmVnWFhoICYgfigweDgwKSk7Ci0JCSh2b2lkKSBpZGVfZG9fcmVzZXQoZHJpdmUpOwotCX0KLQlyZXR1cm4gMDsKKwlocHQzeHhuX3NldF9jbG9jayhod2lmLCB3YW50Y2xvY2spOwogfQogCiAvKiAKLSAqIHNldC9nZXQgcG93ZXIgc3RhdGUgZm9yIGEgZHJpdmUuCi0gKiB0dXJuaW5nIHRoZSBwb3dlciBvZmYgZG9lcyB0aGUgZm9sbG93aW5nIHRoaW5nczoKLSAqICAgMSkgc29mdC1yZXNldCB0aGUgZHJpdmUKLSAqICAgMikgdHJpLXN0YXRlcyB0aGUgaWRlIGJ1cworICogU2V0L2dldCBwb3dlciBzdGF0ZSBmb3IgYSBkcml2ZS4KICAqCi0gKiB3aGVuIHdlIHR1cm4gdGhpbmdzIGJhY2sgb24sIHdlIG5lZWQgdG8gcmUtaW5pdGlhbGl6ZSB0aGluZ3MuCisgKiBXaGVuIHdlIHR1cm4gdGhlIHBvd2VyIGJhY2sgb24sIHdlIG5lZWQgdG8gcmUtaW5pdGlhbGl6ZSB0aGluZ3MuCiAgKi8KICNkZWZpbmUgVFJJU1RBVEVfQklUICAweDgwMDAKLXN0YXRpYyBpbnQgaHB0MzcwX2J1c3Byb2MoaWRlX2RyaXZlX3QgKiBkcml2ZSwgaW50IHN0YXRlKQorCitzdGF0aWMgaW50IGhwdDN4eF9idXNwcm9jKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHN0YXRlKQogewogCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gaHdpZi0+cGNpX2RldjsKLQl1OCB0cmlzdGF0ZSA9IDAsIHJlc2V0bWFzayA9IDAsIGJ1c19yZWcgPSAwOwotCXUxNiB0cmlfcmVnOworCXU4ICB0cmlzdGF0ZSwgcmVzZXRtYXNrLCBidXNfcmVnID0gMDsKKwl1MTYgdHJpX3JlZyA9IDA7CiAKIAlod2lmLT5idXNfc3RhdGUgPSBzdGF0ZTsKIAogCWlmIChod2lmLT5jaGFubmVsKSB7IAogCQkvKiBzZWNvbmRhcnkgY2hhbm5lbCAqLwotCQl0cmlzdGF0ZSA9IDB4NTY7Ci0JCXJlc2V0bWFzayA9IDB4ODA7IAorCQl0cmlzdGF0ZSAgPSAweDU2OworCQlyZXNldG1hc2sgPSAweDgwOwogCX0gZWxzZSB7IAogCQkvKiBwcmltYXJ5IGNoYW5uZWwgKi8KLQkJdHJpc3RhdGUgPSAweDUyOworCQl0cmlzdGF0ZSAgPSAweDUyOwogCQlyZXNldG1hc2sgPSAweDQwOwogCX0KIAotCS8qIGdyYWIgc3RhdHVzICovCisJLyogR3JhYiB0aGUgc3RhdHVzLiAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgdHJpc3RhdGUsICZ0cmlfcmVnKTsKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTksICZidXNfcmVnKTsKIAotCS8qIHNldCB0aGUgc3RhdGUuIHdlIGRvbid0IHNldCBpdCBpZiB3ZSBkb24ndCBuZWVkIHRvIGRvIHNvLgotCSAqIG1ha2Ugc3VyZSB0aGF0IHRoZSBkcml2ZSBrbm93cyB0aGF0IGl0IGhhcyBmYWlsZWQgaWYgaXQncyBvZmYgKi8KKwkvKgorCSAqIFNldCB0aGUgc3RhdGUuIFdlIGRvbid0IHNldCBpdCBpZiB3ZSBkb24ndCBuZWVkIHRvIGRvIHNvLgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcml2ZSBrbm93cyB0aGF0IGl0IGhhcyBmYWlsZWQgaWYgaXQncyBvZmYuCisJICovCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgQlVTU1RBVEVfT046Ci0JCWh3aWYtPmRyaXZlc1swXS5mYWlsdXJlcyA9IDA7Ci0JCWh3aWYtPmRyaXZlc1sxXS5mYWlsdXJlcyA9IDA7Ci0JCWlmICgoYnVzX3JlZyAmIHJlc2V0bWFzaykgPT0gMCkKKwkJaWYgKCEoYnVzX3JlZyAmIHJlc2V0bWFzaykpCiAJCQlyZXR1cm4gMDsKLQkJdHJpX3JlZyAmPSB+VFJJU1RBVEVfQklUOwotCQlidXNfcmVnICY9IH5yZXNldG1hc2s7Ci0JCWJyZWFrOworCQlod2lmLT5kcml2ZXNbMF0uZmFpbHVyZXMgPSBod2lmLT5kcml2ZXNbMV0uZmFpbHVyZXMgPSAwOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTksIGJ1c19yZWcgJiB+cmVzZXRtYXNrKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgdHJpc3RhdGUsIHRyaV9yZWcgJiB+VFJJU1RBVEVfQklUKTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBCVVNTVEFURV9PRkY6Ci0JCWh3aWYtPmRyaXZlc1swXS5mYWlsdXJlcyA9IGh3aWYtPmRyaXZlc1swXS5tYXhfZmFpbHVyZXMgKyAxOwotCQlod2lmLT5kcml2ZXNbMV0uZmFpbHVyZXMgPSBod2lmLT5kcml2ZXNbMV0ubWF4X2ZhaWx1cmVzICsgMTsKLQkJaWYgKCh0cmlfcmVnICYgVFJJU1RBVEVfQklUKSA9PSAwICYmIChidXNfcmVnICYgcmVzZXRtYXNrKSkKKwkJaWYgKChidXNfcmVnICYgcmVzZXRtYXNrKSAmJiAhKHRyaV9yZWcgJiBUUklTVEFURV9CSVQpKQogCQkJcmV0dXJuIDA7CiAJCXRyaV9yZWcgJj0gflRSSVNUQVRFX0JJVDsKLQkJYnVzX3JlZyB8PSByZXNldG1hc2s7CiAJCWJyZWFrOwogCWNhc2UgQlVTU1RBVEVfVFJJU1RBVEU6Ci0JCWh3aWYtPmRyaXZlc1swXS5mYWlsdXJlcyA9IGh3aWYtPmRyaXZlc1swXS5tYXhfZmFpbHVyZXMgKyAxOwotCQlod2lmLT5kcml2ZXNbMV0uZmFpbHVyZXMgPSBod2lmLT5kcml2ZXNbMV0ubWF4X2ZhaWx1cmVzICsgMTsKLQkJaWYgKCh0cmlfcmVnICYgVFJJU1RBVEVfQklUKSAmJiAoYnVzX3JlZyAmIHJlc2V0bWFzaykpCisJCWlmICgoYnVzX3JlZyAmIHJlc2V0bWFzaykgJiYgICh0cmlfcmVnICYgVFJJU1RBVEVfQklUKSkKIAkJCXJldHVybiAwOwogCQl0cmlfcmVnIHw9IFRSSVNUQVRFX0JJVDsKLQkJYnVzX3JlZyB8PSByZXNldG1hc2s7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU5LCBidXNfcmVnKTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCB0cmlzdGF0ZSwgdHJpX3JlZyk7CiAKKwlod2lmLT5kcml2ZXNbMF0uZmFpbHVyZXMgPSBod2lmLT5kcml2ZXNbMF0ubWF4X2ZhaWx1cmVzICsgMTsKKwlod2lmLT5kcml2ZXNbMV0uZmFpbHVyZXMgPSBod2lmLT5kcml2ZXNbMV0ubWF4X2ZhaWx1cmVzICsgMTsKKworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHRyaXN0YXRlLCB0cmlfcmVnKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU5LCBidXNfcmVnIHwgcmVzZXRtYXNrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExOSwxNCArOTk1LDE0IEBACiAJLyogZGV0ZWN0IGJ1cyBzcGVlZCBieSBsb29raW5nIGF0IGNvbnRyb2wgcmVnIHRpbWluZzogKi8KIAlzd2l0Y2goKHJlZzEgPj4gOCkgJiA3KSB7CiAJCWNhc2UgNToKLQkJCWluZm8tPnNwZWVkID0gZm9ydHlfYmFzZV9ocHQzNjY7CisJCQlpbmZvLT5zcGVlZCA9IGZvcnR5X2Jhc2VfaHB0MzZ4OwogCQkJYnJlYWs7CiAJCWNhc2UgOToKLQkJCWluZm8tPnNwZWVkID0gdHdlbnR5X2ZpdmVfYmFzZV9ocHQzNjY7CisJCQlpbmZvLT5zcGVlZCA9IHR3ZW50eV9maXZlX2Jhc2VfaHB0MzZ4OwogCQkJYnJlYWs7CiAJCWNhc2UgNzoKIAkJZGVmYXVsdDoKLQkJCWluZm8tPnNwZWVkID0gdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzY2OworCQkJaW5mby0+c3BlZWQgPSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNng7CiAJCQlicmVhazsKIAl9CiB9CkBAIC0xMTM2LDkgKzEwMTIsOSBAQAogCXN0cnVjdCBocHRfaW5mbyAqaW5mbyA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CiAJaW50IGFkanVzdCwgaTsKLQl1MTYgZnJlcTsKLQl1MzIgcGxsOwotCXU4IHJlZzViaDsKKwl1MTYgZnJlcSA9IDA7CisJdTMyIHBsbCwgdGVtcCA9IDA7CisJdTggcmVnNWJoID0gMCwgbWNyMSA9IDA7CiAJCiAJLyoKIAkgKiBkZWZhdWx0IHRvIHBjaSBjbG9jay4gbWFrZSBzdXJlIE1BMTUvMTYgYXJlIHNldCB0byBvdXRwdXQKQEAgLTExNTEsMjcgKzEwMjcsNDAgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDViLCAweDIzKTsKIAogCS8qCi0JICogc2V0IHVwIHRoZSBQTEwuIHdlIG5lZWQgdG8gYWRqdXN0IGl0IHNvIHRoYXQgaXQncyBzdGFibGUuIAotCSAqIGZyZXEgPSBUcGxsICogMTkyIC8gVHBjaQorCSAqIFdlJ2xsIGhhdmUgdG8gcmVhZCBmX0NOVCB2YWx1ZSBpbiBvcmRlciB0byBkZXRlcm1pbmUKKwkgKiB0aGUgUENJIGNsb2NrIGZyZXF1ZW5jeSBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyByYXRpbzoKIAkgKgotCSAqIFRvZG8uIEZvciBub24geDg2IHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgZHdvcmQgaXMKLQkgKiBzZXQgdG8gMHhBQkNERXh4eCBpbmRpY2F0aW5nIHRoZSBCSU9TIHNhdmVkIGZfQ05UCisJICogZl9DTlQgPSBGcGNpICogMTkyIC8gRmRwbGwKKwkgKgorCSAqIEZpcnN0IHRyeSByZWFkaW5nIHRoZSByZWdpc3RlciBpbiB3aGljaCB0aGUgSGlnaFBvaW50IEJJT1MKKwkgKiBzYXZlcyBmX0NOVCB2YWx1ZSBiZWZvcmUgIHJlcHJvZ3JhbW1pbmcgdGhlIERQTEwgZnJvbSBpdHMKKwkgKiBkZWZhdWx0IHNldHRpbmcgKHdoaWNoIGRpZmZlcnMgZm9yIHRoZSB2YXJpb3VzIGNoaXBzKS4KKwkgKiBOT1RFOiBUaGlzIHJlZ2lzdGVyIGlzIG9ubHkgYWNjZXNzaWJsZSB2aWEgSS9PIHNwYWNlLgorCSAqCisJICogSW4gY2FzZSB0aGUgc2lnbmF0dXJlIGNoZWNrIGZhaWxzLCB3ZSdsbCBoYXZlIHRvIHJlc29ydCB0bworCSAqIHJlYWRpbmcgdGhlIGZfQ05UIHJlZ2lzdGVyIGl0c2VsZiBpbiBob3BlcyB0aGF0IG5vYm9keSBoYXMKKwkgKiB0b3VjaGVkIHRoZSBEUExMIHlldC4uLgogCSAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg3OCwgJmZyZXEpOwotCWZyZXEgJj0gMHgxRkY7Ci0JCisJdGVtcCA9IGlubChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KSArIDB4OTApOworCWlmICgodGVtcCAmIDB4RkZGRkYwMDApICE9IDB4QUJDREUwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSFBUMzdYOiBubyBjbG9jayBkYXRhIHNhdmVkIGJ5IEJJT1NcbiIpOworCisJCS8qIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSB2YWx1ZSBvZiBmX0NOVCAqLworCQlmb3IgKHRlbXAgPSBpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NzgsICZmcmVxKTsKKwkJCXRlbXAgKz0gZnJlcSAmIDB4MWZmOworCQkJbWRlbGF5KDEpOworCQl9CisJCWZyZXEgPSB0ZW1wIC8gMTI4OworCX0gZWxzZQorCQlmcmVxID0gdGVtcCAmIDB4MWZmOworCiAJLyoKLQkgKiBUaGUgMzcyTiB1c2VzIGRpZmZlcmVudCBQQ0kgY2xvY2sgaW5mb3JtYXRpb24gYW5kIGhhcwotCSAqIHNvbWUgb3RoZXIgY29tcGxpY2F0aW9ucwotCSAqCU9uIFBDSTMzIHRpbWluZyB3ZSBtdXN0IGNsb2NrIHN3aXRjaAotCSAqCU9uIFBDSTY2IHRpbWluZyB3ZSBtdXN0IE5PVCB1c2UgdGhlIFBDSSBjbG9jawotCSAqCi0JICogQ3VycmVudGx5IHdlIGFsd2F5cyBzZXQgdXAgdGhlIFBMTCBmb3IgdGhlIDM3Mk4KKwkgKiBIUFQzeHhOIGNoaXBzIHVzZSBkaWZmZXJlbnQgUENJIGNsb2NrIGluZm9ybWF0aW9uLgorCSAqIEN1cnJlbnRseSB3ZSBhbHdheXMgc2V0IHVwIHRoZSBQTEwgZm9yIHRoZW0uCiAJICovCi0JIAotCWlmKGluZm8tPmZsYWdzICYgSVNfMzcyTikKLQl7Ci0JCXByaW50ayhLRVJOX0lORk8gImhwdDogSFBUMzcyTiBkZXRlY3RlZCwgdXNpbmcgMzcyTiB0aW1pbmcuXG4iKTsKKworCWlmIChpbmZvLT5mbGFncyAmIElTXzN4eE4pIHsKIAkJaWYoZnJlcSA8IDB4NTUpCiAJCQlwbGwgPSBGX0xPV19QQ0lfMzM7CiAJCWVsc2UgaWYoZnJlcSA8IDB4NzApCkBAIC0xMTgwLDEwICsxMDY5LDggQEAKIAkJCXBsbCA9IEZfTE9XX1BDSV81MDsKIAkJZWxzZQogCQkJcGxsID0gRl9MT1dfUENJXzY2OwotCQkJCi0JCXByaW50ayhLRVJOX0lORk8gIkZSRVE6ICVkIFBMTDogJWRcbiIsIGZyZXEsIHBsbCk7Ci0JCQkKLQkJLyogV2UgYWx3YXlzIHVzZSB0aGUgcGxsIG5vdCB0aGUgUENJIGNsb2NrIG9uIDM3Mk4gKi8KKworCQlwcmludGsoS0VSTl9JTkZPICJIUFQzeHhOIGRldGVjdGVkLCBGUkVROiAlZCwgUExMOiAlZFxuIiwgZnJlcSwgcGxsKTsKIAl9CiAJZWxzZQogCXsKQEAgLTExOTcsNDEgKzEwODQsMjIgQEAKIAkJCXBsbCA9IEZfTE9XX1BDSV82NjsKIAkKIAkJaWYgKHBsbCA9PSBGX0xPV19QQ0lfMzMpIHsKLQkJCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4KQotCQkJCWluZm8tPnNwZWVkID0gdGhpcnR5X3RocmVlX2Jhc2VfaHB0Mzc0OwotCQkJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNSkKLQkJCQlpbmZvLT5zcGVlZCA9IHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3MjsKLQkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDQpCi0JCQkJaW5mby0+c3BlZWQgPSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzBhOwotCQkJZWxzZQotCQkJCWluZm8tPnNwZWVkID0gdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzcwOworCQkJaW5mby0+c3BlZWQgPSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzN3g7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiSFBUMzdYOiB1c2luZyAzM01IeiBQQ0kgY2xvY2tcbiIpOwogCQl9IGVsc2UgaWYgKHBsbCA9PSBGX0xPV19QQ0lfNDApIHsKIAkJCS8qIFVuc3VwcG9ydGVkICovCiAJCX0gZWxzZSBpZiAocGxsID09IEZfTE9XX1BDSV81MCkgewotCQkJaWYgKGluZm8tPnJldmlzaW9uID49IDgpCi0JCQkJaW5mby0+c3BlZWQgPSBmaWZ0eV9iYXNlX2hwdDM3MGE7Ci0JCQllbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA1KQotCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzI7Ci0JCQllbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA0KQotCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzBhOwotCQkJZWxzZQotCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzBhOworCQkJaW5mby0+c3BlZWQgPSBmaWZ0eV9iYXNlX2hwdDM3eDsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJIUFQzN1g6IHVzaW5nIDUwTUh6IFBDSSBjbG9ja1xuIik7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoaW5mby0+cmV2aXNpb24gPj0gOCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiSFBUMzd4OiA2Nk1IeiB0aW1pbmdzIGFyZSBub3Qgc3VwcG9ydGVkLlxuIik7Ci0JCQl9Ci0JCQllbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA1KQotCQkJCWluZm8tPnNwZWVkID0gc2l4dHlfc2l4X2Jhc2VfaHB0MzcyOwotCQkJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNCkKLQkJCQlpbmZvLT5zcGVlZCA9IHNpeHR5X3NpeF9iYXNlX2hwdDM3MGE7Ci0JCQllbHNlCi0JCQkJaW5mby0+c3BlZWQgPSBzaXh0eV9zaXhfYmFzZV9ocHQzNzA7CisJCQlpbmZvLT5zcGVlZCA9IHNpeHR5X3NpeF9iYXNlX2hwdDM3eDsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJIUFQzN1g6IHVzaW5nIDY2TUh6IFBDSSBjbG9ja1xuIik7CiAJCX0KIAl9Ci0JCisKKwlpZiAocGxsID09IEZfTE9XX1BDSV82NikKKwkJaW5mby0+ZmxhZ3MgfD0gUENJXzY2TUhaOworCiAJLyoKIAkgKiBvbmx5IHRyeSB0aGUgcGxsIGlmIHdlIGRvbid0IGhhdmUgYSB0YWJsZSBmb3IgdGhlIGNsb2NrCiAJICogc3BlZWQgdGhhdCB3ZSdyZSBydW5uaW5nIGF0LiBOT1RFOiB0aGUgaW50ZXJuYWwgUExMIHdpbGwKQEAgLTEyNDgsMTEgKzExMTYsOCBAQAogCWluZm8tPmZsYWdzIHw9IFBMTF9NT0RFOwogCQogCS8qCi0JICogRklYTUU6IG1ha2UgdGhpcyB3b3JrIGNvcnJlY3RseSwgZXNwIHdpdGggMzcyTiBhcyBwZXIKLQkgKiByZWZlcmVuY2UgZHJpdmVyIGNvZGUuCi0JICoKLQkgKiBhZGp1c3QgUExMIGJhc2VkIHVwb24gUENJIGNsb2NrLCBlbmFibGUgaXQsIGFuZCB3YWl0IGZvcgotCSAqIHN0YWJpbGl6YXRpb24uCisJICogQWRqdXN0IHRoZSBQTEwgYmFzZWQgdXBvbiB0aGUgUENJIGNsb2NrLCBlbmFibGUgaXQsIGFuZAorCSAqIHdhaXQgZm9yIHN0YWJpbGl6YXRpb24uLi4KIAkgKi8KIAlhZGp1c3QgPSAwOwogCWZyZXEgPSAocGxsIDwgRl9MT1dfUENJXzUwKSA/IDIgOiA0OwpAQCAtMTI3NSwyMiArMTE0MCwxMiBAQAogCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVjLCAKIAkJCQkJCSAgICAgICBwbGwgJiB+MHgxMDApOwogCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWIsIDB4MjEpOwotCQkJCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4KQotCQkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0MzcwYTsKLQkJCQllbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA1KQotCQkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0MzcyOwotCQkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDQpCi0JCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzBhOwotCQkJCWVsc2UKLQkJCQkJaW5mby0+c3BlZWQgPSBmaWZ0eV9iYXNlX2hwdDM3MGE7CisKKwkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0Mzd4OwogCQkJCXByaW50aygiSFBUMzdYOiB1c2luZyA1ME1IeiBpbnRlcm5hbCBQTExcbiIpOwogCQkJCWdvdG8gaW5pdF9ocHQzN1hfZG9uZTsKIAkJCX0KIAkJfQotCQlpZiAoIXBjaV9nZXRfZHJ2ZGF0YShkZXYpKSB7Ci0JCQlwcmludGsoIk5vIENsb2NrIFN0YWJpbGl6YXRpb24hISFcbiIpOwotCQkJcmV0dXJuOwotCQl9CiBwbGxfcmVjYWw6CiAJCWlmIChhZGp1c3QgJiAxKQogCQkJcGxsIC09IChhZGp1c3QgPj4gMSk7CkBAIC0xMzAwLDExICsxMTU1LDE2IEBACiAKIGluaXRfaHB0MzdYX2RvbmU6CiAJaWYgKCFpbmZvLT5zcGVlZCkKLQkJcHJpbnRrKEtFUk5fRVJSICJIUFQzN1glczogdW5rbm93biBidXMgdGltaW5nIFslZCAlZF0uXG4iLAotCQkJKGluZm8tPmZsYWdzICYgSVNfMzcyTik/Ik4iOiIiLCBwbGwsIGZyZXEpOwotCS8qIHJlc2V0IHN0YXRlIGVuZ2luZSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTAsIDB4MzcpOyAKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU0LCAweDM3KTsgCisJCXByaW50ayhLRVJOX0VSUiAiSFBUMzd4JXM6IHVua25vd24gYnVzIHRpbWluZyBbJWQgJWRdLlxuIiwKKwkJICAgICAgIChpbmZvLT5mbGFncyAmIElTXzN4eE4pID8gIk4iIDogIiIsIHBsbCwgZnJlcSk7CisJLyoKKwkgKiBSZXNldCB0aGUgc3RhdGUgZW5naW5lcy4KKwkgKiBOT1RFOiBhdm9pZCBhY2NpZGVudGFsbHkgZW5hYmxpbmcgdGhlIHByaW1hcnkgY2hhbm5lbCBvbiBIUFQzNzFOLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgJm1jcjEpOworCWlmIChtY3IxICYgMHgwNCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgMHgzNyk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1NCwgMHgzNyk7CiAJdWRlbGF5KDEwMCk7CiB9CiAKQEAgLTEzNjcsNiArMTIyNyw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldgkJPSBod2lmLT5wY2lfZGV2OwogCXN0cnVjdCBocHRfaW5mbyAqaW5mbwkJPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCXU4IGF0YTY2ID0gMCwgcmVnbWFzawkJPSAoaHdpZi0+Y2hhbm5lbCkgPyAweDAxIDogMHgwMjsKKwlpbnQgc2VyaWFsaXplCQkJPSBIUFRfU0VSSUFMSVpFX0lPOwogCQogCWh3aWYtPnR1bmVwcm9jCQkJPSAmaHB0M3h4X3R1bmVfZHJpdmU7CiAJaHdpZi0+c3BlZWRwcm9jCQkJPSAmaHB0M3h4X3R1bmVfY2hpcHNldDsKQEAgLTEzNzQsOCArMTIzNSwyMCBAQAogCWh3aWYtPmludHJwcm9jCQkJPSAmaHB0M3h4X2ludHJwcm9jOwogCWh3aWYtPm1hc2twcm9jCQkJPSAmaHB0M3h4X21hc2twcm9jOwogCQotCWlmKGluZm8tPmZsYWdzICYgSVNfMzcyTikKLQkJaHdpZi0+cndfZGlzayA9ICZocHQzNzJuX3J3X2Rpc2s7CisJLyoKKwkgKiBIUFQzeHhOIGNoaXBzIGhhdmUgc29tZSBjb21wbGljYXRpb25zOgorCSAqCisJICogLSBvbiAzMyBNSHogUENJIHdlIG11c3QgY2xvY2sgc3dpdGNoCisJICogLSBvbiA2NiBNSHogUENJIHdlIG11c3QgTk9UIHVzZSB0aGUgUENJIGNsb2NrCisJICovCisJaWYgKChpbmZvLT5mbGFncyAmIChJU18zeHhOIHwgUENJXzY2TUhaKSkgPT0gSVNfM3h4TikgeworCQkvKgorCQkgKiBDbG9jayBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgY2hhbm5lbHMsCisJCSAqIHNvIHdlJ2xsIGhhdmUgdG8gc2VyaWFsaXplIHRoZW0uLi4gOi0oCisJCSAqLworCQlzZXJpYWxpemUgPSAxOworCQlod2lmLT5yd19kaXNrID0gJmhwdDN4eG5fcndfZGlzazsKKwl9CiAKIAkvKgogCSAqIFRoZSBIUFQzN3ggdXNlcyB0aGUgQ0JMSUQgcGlucyBhcyBvdXRwdXRzIGZvciBNQTE1L01BMTYKQEAgLTE0MTgsMjkgKzEyOTEsMTUgQEAKIAkJUENJX0ZVTkMoaHdpZi0+cGNpX2Rldi0+ZGV2Zm4pKTsKICNlbmRpZiAvKiBERUJVRyAqLwogCi0jaWZkZWYgSFBUX1NFUklBTElaRV9JTwotCS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhpcyBkZXZpY2UgKi8KLQlpZiAoaHdpZi0+bWF0ZSkKKwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoaXMgZGV2aWNlICovCisJaWYgKHNlcmlhbGl6ZSAmJiBod2lmLT5tYXRlKQogCQlod2lmLT5zZXJpYWxpemVkID0gaHdpZi0+bWF0ZS0+c2VyaWFsaXplZCA9IDE7Ci0jZW5kaWYKIAotCWlmIChpbmZvLT5yZXZpc2lvbiA+PSAzKSB7Ci0JCXU4IHJlZzVhaCA9IDA7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVhLCByZWc1YWggJiB+MHgxMCk7Ci0JCS8qCi0JCSAqIHNldCB1cCBpb2N0bCBmb3IgcG93ZXIgc3RhdHVzLgotCQkgKiBub3RlOiBwb3dlciBhZmZlY3RzIGJvdGgKLQkJICogZHJpdmVzIG9uIGVhY2ggY2hhbm5lbAotCQkgKi8KLQkJaHdpZi0+cmVzZXRwcm9jCT0gJmhwdDN4eF9yZXNldDsKLQkJaHdpZi0+YnVzcHJvYwk9ICZocHQzNzBfYnVzcHJvYzsKLQl9IGVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDIpIHsKLQkJaHdpZi0+cmVzZXRwcm9jCT0gJmhwdDN4eF9yZXNldDsKLQkJaHdpZi0+YnVzcHJvYwk9ICZocHQzeHhfdHJpc3RhdGU7Ci0JfSBlbHNlIHsKLQkJaHdpZi0+cmVzZXRwcm9jID0gJmhwdDN4eF9yZXNldDsKLQkJaHdpZi0+YnVzcHJvYyAgID0gJmhwdDN4eF90cmlzdGF0ZTsKLQl9CisJLyoKKwkgKiBTZXQgdXAgaW9jdGwgZm9yIHBvd2VyIHN0YXR1cy4KKwkgKiBOT1RFOiAgcG93ZXIgYWZmZWN0cyBib3RoIGRyaXZlcyBvbiBlYWNoIGNoYW5uZWwuCisJICovCisJaHdpZi0+YnVzcHJvYyA9ICZocHQzeHhfYnVzcHJvYzsKIAogCWlmICghaHdpZi0+ZG1hX2Jhc2UpIHsKIAkJaHdpZi0+ZHJpdmVzWzBdLmF1dG90dW5lID0gMTsKQEAgLTE0OTAsNyArMTM0OSw3IEBACiAJCXJldHVybjsKIAkJCiAJaWYoaW5mby0+c3BlZWQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJocHQ6IG5vIGtub3duIElERSB0aW1pbmdzLCBkaXNhYmxpbmcgRE1BLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwdDM2Njogbm8ga25vd24gSURFIHRpbWluZ3MsIGRpc2FibGluZyBETUEuXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTUxOSw5ICsxMzc4LDEwIEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2lvcHNfaHB0MzY2KGlkZV9od2lmX3QgKmh3aWYpCiB7Ci0Jc3RydWN0IGhwdF9pbmZvICppbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhwdF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JdW5zaWduZWQgbG9uZyBkbWFiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGh3aWYtPnBjaV9kZXYsIDQpOwotCXU4IGRpZCwgcmlkOworCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBocHRfaW5mbyksIEdGUF9LRVJORUwpOworCXN0cnVjdCBwY2lfZGV2ICAqZGV2CT0gaHdpZi0+cGNpX2RldjsKKwl1MTYgZGlkCQkJPSBkZXYtPmRldmljZTsKKwl1OCAgcmlkCQkJPSAwOwogCiAJaWYoaW5mbyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwdDM2Njogb3V0IG9mIG1lbW9yeS5cbiIpOwpAQCAtMTUyOSwxNSArMTM4OSwyMiBAQAogCX0KIAlpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGluZm8pOwogCi0JaWYoZG1hYmFzZSkgewotCQlkaWQgPSBpbmIoZG1hYmFzZSArIDB4MjIpOwotCQlyaWQgPSBpbmIoZG1hYmFzZSArIDB4MjgpOwotCi0JCWlmKChkaWQgPT0gNCAmJiByaWQgPT0gNikgfHwgKGRpZCA9PSA1ICYmIHJpZCA+IDEpKQotCQkJaW5mby0+ZmxhZ3MgfD0gSVNfMzcyTjsKKwkvKiBBdm9pZCBkb2luZyB0aGUgc2FtZSB0aGluZyB0d2ljZS4gKi8KKwlpZiAoaHdpZi0+Y2hhbm5lbCAmJiBod2lmLT5tYXRlKSB7CisJCW1lbWNweShpbmZvLCBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYtPm1hdGUpLCBzaXplb2Yoc3RydWN0IGhwdF9pbmZvKSk7CisJCXJldHVybjsKIAl9CiAKLQlpbmZvLT5yZXZpc2lvbiA9IGhwdF9yZXZpc2lvbihod2lmLT5wY2lfZGV2KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJpZCk7CisKKwlpZiAoKCBkaWQgPT0gUENJX0RFVklDRV9JRF9UVElfSFBUMzY2ICAmJiByaWQgPT0gNikgfHwKKwkgICAgKChkaWQgPT0gUENJX0RFVklDRV9JRF9UVElfSFBUMzcyICB8fAorCSAgICAgIGRpZCA9PSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzMDIgIHx8CisJICAgICAgZGlkID09IFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MSkgJiYgcmlkID4gMSkgfHwKKwkgICAgICBkaWQgPT0gUENJX0RFVklDRV9JRF9UVElfSFBUMzcyTikKKwkJaW5mby0+ZmxhZ3MgfD0gSVNfM3h4TjsKKworCWluZm8tPnJldmlzaW9uID0gaHB0X3JldmlzaW9uKGRldik7CiAKIAlpZiAoaW5mby0+cmV2aXNpb24gPj0gMykKIAkJaHB0Mzd4X2Nsb2NraW5nKGh3aWYpOwpAQCAtMTU3NCw2ICsxNDQxLDIzIEBACiAJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgZCk7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfc2V0dXBfaHB0MzcxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlkZV9wY2lfZGV2aWNlX3QgKmQpCit7CisJdTggbWNyMSA9IDA7CisKKwkvKgorCSAqIEhQVDM3MSBjaGlwcyBwaHlzaWNhbGx5IGhhdmUgb25seSBvbmUgY2hhbm5lbCwgdGhlIHNlY29uZGFyeSBvbmUsCisJICogYnV0IHRoZSBwcmltYXJ5IGNoYW5uZWwgcmVnaXN0ZXJzIGRvIGV4aXN0ISAgR28gZmlndXJlLi4uCisJICogU28sICB3ZSBtYW51YWxseSBkaXNhYmxlIHRoZSBub24tZXhpc3RpbmcgY2hhbm5lbCBoZXJlCisJICogKGlmIHRoZSBCSU9TIGhhc24ndCBkb25lIHRoaXMgYWxyZWFkeSkuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUwLCAmbWNyMSk7CisJaWYgKG1jcjEgJiAweDA0KQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUwLCAobWNyMSAmIH4weDA0KSk7CisKKwlyZXR1cm4gaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCBkKTsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9zZXR1cF9ocHQzNjYoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZmluZGV2ID0gTlVMTDsKQEAgLTE2NjEsMTMgKzE1NDUsMTQgQEAKIAkJLmJvb3RhYmxlCT0gT0ZGX0JPQVJELAogCX0sewkvKiAzICovCiAJCS5uYW1lCQk9ICJIUFQzNzEiLAotCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfaHB0Mzd4LAorCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfaHB0MzcxLAogCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2hwdDM2NiwKIAkJLmluaXRfaW9wcwk9IGluaXRfaW9wc19ocHQzNjYsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfaHB0MzY2LAogCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9ocHQzNjYsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gQVVUT0RNQSwKKwkJLmVuYWJsZWJpdHMJPSB7ezB4NTAsMHgwNCwweDA0fSwgezB4NTQsMHgwNCwweDA0fX0sCiAJCS5ib290YWJsZQk9IE9GRl9CT0FSRCwKIAl9LHsJLyogNCAqLwogCQkubmFtZQkJPSAiSFBUMzc0IiwKQEAgLTE2OTksMTMgKzE1ODQsMTYgQEAKICAqCiAgKglDYWxsZWQgd2hlbiB0aGUgUENJIHJlZ2lzdHJhdGlvbiBsYXllciAob3IgdGhlIElERSBpbml0aWFsaXphdGlvbikKICAqCWZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nIG91ciBJREUgZGV2aWNlIHRhYmxlcy4KKyAqCisgKglOT1RFOiBzaW5jZSB3ZSdsbCBoYXZlIHRvIG1vZGlmeSBzb21lIGZpZWxkcyBvZiB0aGUgaWRlX3BjaV9kZXZpY2VfdAorICoJc3RydWN0dXJlIGRlcGVuZGluZyBvbiB0aGUgY2hpcCdzIHJldmlzaW9uLCB3ZSdkIGJldHRlciBwYXNzIGEgbG9jYWwKKyAqCWNvcHkgZG93biB0aGUgY2FsbCBjaGFpbi4uLgogICovCi0gCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBocHQzNjZfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCWlkZV9wY2lfZGV2aWNlX3QgKmQgPSAmaHB0MzY2X2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV07CisJaWRlX3BjaV9kZXZpY2VfdCBkID0gaHB0MzY2X2NoaXBzZXRzW2lkLT5kcml2ZXJfZGF0YV07CiAKLQlyZXR1cm4gZC0+aW5pdF9zZXR1cChkZXYsIGQpOworCXJldHVybiBkLmluaXRfc2V0dXAoZGV2LCAmZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBocHQzNjZfcGNpX3RibFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X25ldy5jIGIvZHJpdmVycy9pZGUvcGNpL3BkYzIwMnh4X25ldy5jCmluZGV4IDZjMDk3ZTguLjdjYjQ4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9wZGMyMDJ4eF9uZXcuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvcGRjMjAyeHhfbmV3LmMKQEAgLTksNiArOSw3IEBACiAgKiAgU3BsaXQgZnJvbToKICAqICBsaW51eC9kcml2ZXJzL2lkZS9wZGMyMDJ4eC5jCVZlcnNpb24gMC4zNQlNYXIuIDMwLCAyMDAyCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDIJCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYJCU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDE5OTkgUHJvbWlzZSBUZWNobm9sb2d5LCBJbmMuCiAgKiAgQXV0aG9yOiBGcmFuayBUaWVybmFuIChmcmFua3RAcHJvbWlzZS5jb20pCiAgKiAgUmVsZWFzZWQgdW5kZXIgdGVybXMgb2YgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMzgsNiArMzksMTQgQEAKIAogI2RlZmluZSBQREMyMDJfREVCVUdfQ0FCTEUJMAogCisjdW5kZWYgREVCVUcKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pIHByaW50aygiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBjaGFyICpwZGNfcXVpcmtfZHJpdmVzW10gPSB7CiAJIlFVQU5UVU0gRklSRUJBTExsY3QwOCAwOCIsCiAJIlFVQU5UVU0gRklSRUJBTExQIEtBNi40IiwKQEAgLTUwLDM3ICs1OSwxMSBAQAogCU5VTEwKIH07CiAKLSNkZWZpbmUgc2V0XzJyZWdzKGEsIGIpCQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJaHdpZi0+T1VUQigoYSArIGFkaiksIGluZGV4cmVnKTsJXAotCQlod2lmLT5PVVRCKGIsIGRhdGFyZWcpOwkJCVwKLQl9IHdoaWxlKDApCi0KLSNkZWZpbmUgc2V0X3VsdHJhKGEsIGIsIGMpCQkJCVwKLQlkbyB7CQkJCQkJXAotCQlzZXRfMnJlZ3MoMHgxMCwoYSkpOwkJCVwKLQkJc2V0XzJyZWdzKDB4MTEsKGIpKTsJCQlcCi0JCXNldF8ycmVncygweDEyLChjKSk7CQkJXAotCX0gd2hpbGUoMCkKLQotI2RlZmluZSBzZXRfYXRhMihhLCBiKQkJCQkJXAotCWRvIHsJCQkJCQlcCi0JCXNldF8ycmVncygweDBlLChhKSk7CQkJXAotCQlzZXRfMnJlZ3MoMHgwZiwoYikpOwkJCVwKLQl9IHdoaWxlKDApCi0KLSNkZWZpbmUgc2V0X3BpbyhhLCBiLCBjKQkJCQlcCi0JZG8geyAJCQkJCQlcCi0JCXNldF8ycmVncygweDBjLChhKSk7CQkJXAotCQlzZXRfMnJlZ3MoMHgwZCwoYikpOwkJCVwKLQkJc2V0XzJyZWdzKDB4MTMsKGMpKTsJCQlcCi0JfSB3aGlsZSgwKQotCi1zdGF0aWMgdTggcGRjbmV3X3JhdGVtYXNrIChpZGVfZHJpdmVfdCAqZHJpdmUpCitzdGF0aWMgdTggbWF4X2RtYV9yYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXU4IG1vZGU7CiAKLQlzd2l0Y2goSFdJRihkcml2ZSktPnBjaV9kZXYtPmRldmljZSkgeworCXN3aXRjaChwZGV2LT5kZXZpY2UpIHsKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX1BST01JU0VfMjAyNzc6CiAJCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjc2OgogCQljYXNlIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3NToKQEAgLTk1LDEyICs3OCwyMSBAQAogCQlkZWZhdWx0OgogCQkJcmV0dXJuIDA7CiAJfQotCWlmICghZWlnaHR5X25pbnR5X3RocmVlKGRyaXZlKSkKLQkJbW9kZSA9IG1pbihtb2RlLCAodTgpMSk7CisKIAlyZXR1cm4gbW9kZTsKIH0KIAotc3RhdGljIGludCBjaGVja19pbl9kcml2ZV9saXN0cyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICoqbGlzdCkKK3N0YXRpYyB1OCBwZGNuZXdfcmF0ZW1hc2soaWRlX2RyaXZlX3QgKmRyaXZlKQoreworCXU4IG1vZGUgPSBtYXhfZG1hX3JhdGUoSFdJRihkcml2ZSktPnBjaV9kZXYpOworCisJaWYgKCFlaWdodHlfbmludHlfdGhyZWUoZHJpdmUpKQorCQltb2RlID0gbWluX3QodTgsIG1vZGUsIDEpOworCisJcmV0dXJuCW1vZGU7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaW5fZHJpdmVfbGlzdHMoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCBjaGFyICoqbGlzdCkKIHsKIAlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQgPSBkcml2ZS0+aWQ7CiAKQEAgLTEyMCw0MyArMTEyLDE0MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBkY25ld19uZXdfdHVuZV9jaGlwc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKKy8qKgorICogZ2V0X2luZGV4ZWRfcmVnIC0gR2V0IGluZGV4ZWQgcmVnaXN0ZXIKKyAqIEBod2lmOiBmb3IgdGhlIHBvcnQgYWRkcmVzcworICogQGluZGV4OiBpbmRleCBvZiB0aGUgaW5kZXhlZCByZWdpc3RlcgorICovCitzdGF0aWMgdTggZ2V0X2luZGV4ZWRfcmVnKGlkZV9od2lmX3QgKmh3aWYsIHU4IGluZGV4KQoreworCXU4IHZhbHVlOworCisJaHdpZi0+T1VUQihpbmRleCwgaHdpZi0+ZG1hX3ZlbmRvcjEpOworCXZhbHVlID0gaHdpZi0+SU5CKGh3aWYtPmRtYV92ZW5kb3IzKTsKKworCURCRygiaW5kZXhbJTAyWF0gdmFsdWVbJTAyWF1cbiIsIGluZGV4LCB2YWx1ZSk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIHNldF9pbmRleGVkX3JlZyAtIFNldCBpbmRleGVkIHJlZ2lzdGVyCisgKiBAaHdpZjogZm9yIHRoZSBwb3J0IGFkZHJlc3MKKyAqIEBpbmRleDogaW5kZXggb2YgdGhlIGluZGV4ZWQgcmVnaXN0ZXIKKyAqLworc3RhdGljIHZvaWQgc2V0X2luZGV4ZWRfcmVnKGlkZV9od2lmX3QgKmh3aWYsIHU4IGluZGV4LCB1OCB2YWx1ZSkKK3sKKwlod2lmLT5PVVRCKGluZGV4LCBod2lmLT5kbWFfdmVuZG9yMSk7CisJaHdpZi0+T1VUQih2YWx1ZSwgaHdpZi0+ZG1hX3ZlbmRvcjMpOworCURCRygiaW5kZXhbJTAyWF0gdmFsdWVbJTAyWF1cbiIsIGluZGV4LCB2YWx1ZSk7Cit9CisKKy8qCisgKiBBVEEgVGltaW5nIFRhYmxlcyBiYXNlZCBvbiAxMzMgTUh6IFBMTCBvdXRwdXQgY2xvY2suCisgKgorICogSWYgdGhlIFBMTCBvdXRwdXRzIDEwMCBNSHogY2xvY2ssIHRoZSBBU0lDIGhhcmR3YXJlIHdpbGwgc2V0CisgKiB0aGUgdGltaW5nIHJlZ2lzdGVycyBhdXRvbWF0aWNhbGx5IHdoZW4gInNldCBmZWF0dXJlcyIgY29tbWFuZCBpcworICogaXNzdWVkIHRvIHRoZSBkZXZpY2UuIEhvd2V2ZXIsIGlmIHRoZSBQTEwgb3V0cHV0IGNsb2NrIGlzIDEzMyBNSHosCisgKiB0aGUgZm9sbG93aW5nIHRhYmxlcyBtdXN0IGJlIHVzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGlvX3RpbWluZyB7CisJdTggcmVnMGMsIHJlZzBkLCByZWcxMzsKK30gcGlvX3RpbWluZ3MgW10gPSB7CisJeyAweGZiLCAweDJiLCAweGFjIH0sCS8qIFBJTyBtb2RlIDAsIElPUkRZIG9mZiwgUHJlZmV0Y2ggb2ZmICovCisJeyAweDQ2LCAweDI5LCAweGE0IH0sCS8qIFBJTyBtb2RlIDEsIElPUkRZIG9mZiwgUHJlZmV0Y2ggb2ZmICovCisJeyAweDIzLCAweDI2LCAweDY0IH0sCS8qIFBJTyBtb2RlIDIsIElPUkRZIG9mZiwgUHJlZmV0Y2ggb2ZmICovCisJeyAweDI3LCAweDBkLCAweDM1IH0sCS8qIFBJTyBtb2RlIDMsIElPUkRZIG9uLCAgUHJlZmV0Y2ggb2ZmICovCisJeyAweDIzLCAweDA5LCAweDI1IH0sCS8qIFBJTyBtb2RlIDQsIElPUkRZIG9uLCAgUHJlZmV0Y2ggb2ZmICovCit9OworCitzdGF0aWMgc3RydWN0IG13ZG1hX3RpbWluZyB7CisJdTggcmVnMGUsIHJlZzBmOworfSBtd2RtYV90aW1pbmdzIFtdID0geworCXsgMHhkZiwgMHg1ZiB9LCAJLyogTVdETUEgbW9kZSAwICovCisJeyAweDZiLCAweDI3IH0sIAkvKiBNV0RNQSBtb2RlIDEgKi8KKwl7IDB4NjksIDB4MjUgfSwgCS8qIE1XRE1BIG1vZGUgMiAqLworfTsKKworc3RhdGljIHN0cnVjdCB1ZG1hX3RpbWluZyB7CisJdTggcmVnMTAsIHJlZzExLCByZWcxMjsKK30gdWRtYV90aW1pbmdzIFtdID0geworCXsgMHg0YSwgMHgwZiwgMHhkNSB9LAkvKiBVRE1BIG1vZGUgMCAqLworCXsgMHgzYSwgMHgwYSwgMHhkMCB9LAkvKiBVRE1BIG1vZGUgMSAqLworCXsgMHgyYSwgMHgwNywgMHhjZCB9LAkvKiBVRE1BIG1vZGUgMiAqLworCXsgMHgxYSwgMHgwNSwgMHhjZCB9LAkvKiBVRE1BIG1vZGUgMyAqLworCXsgMHgxYSwgMHgwMywgMHhjZCB9LAkvKiBVRE1BIG1vZGUgNCAqLworCXsgMHgxYSwgMHgwMiwgMHhjYiB9LAkvKiBVRE1BIG1vZGUgNSAqLworCXsgMHgxYSwgMHgwMSwgMHhjYiB9LAkvKiBVRE1BIG1vZGUgNiAqLworfTsKKworc3RhdGljIGludCBwZGNuZXdfdHVuZV9jaGlwc2V0KGlkZV9kcml2ZV90ICpkcml2ZSwgdTggc3BlZWQpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOwotCXVuc2lnbmVkIGxvbmcgaW5kZXhyZWcJPSBod2lmLT5kbWFfdmVuZG9yMTsKLQl1bnNpZ25lZCBsb25nIGRhdGFyZWcJPSBod2lmLT5kbWFfdmVuZG9yMzsKLQl1OCB0aG9sZAkJPSAweDEwOwotCXU4IGFkagkJCT0gKGRyaXZlLT5kbiUyKSA/IDB4MDggOiAweDAwOwotCXU4IHNwZWVkCQk9IGlkZV9yYXRlX2ZpbHRlcihwZGNuZXdfcmF0ZW1hc2soZHJpdmUpLCB4ZmVyc3BlZWQpOworCXU4IGFkagkJCT0gKGRyaXZlLT5kbiAmIDEpID8gMHgwOCA6IDB4MDA7CisJaW50CQkJZXJyOwogCi0JaWYgKHNwZWVkID09IFhGRVJfVURNQV8yKSB7Ci0JCWh3aWYtPk9VVEIoKHRob2xkICsgYWRqKSwgaW5kZXhyZWcpOwotCQlod2lmLT5PVVRCKChod2lmLT5JTkIoZGF0YXJlZykgJiAweDdmKSwgZGF0YXJlZyk7Ci0JfQorCXNwZWVkID0gaWRlX3JhdGVfZmlsdGVyKHBkY25ld19yYXRlbWFzayhkcml2ZSksIHNwZWVkKTsKIAotCXN3aXRjaCAoc3BlZWQpIHsKLQkJY2FzZSBYRkVSX1VETUFfNzoKLQkJCXNwZWVkID0gWEZFUl9VRE1BXzY7Ci0JCWNhc2UgWEZFUl9VRE1BXzY6CXNldF91bHRyYSgweDFhLCAweDAxLCAweGNiKTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9VRE1BXzU6CXNldF91bHRyYSgweDFhLCAweDAyLCAweGNiKTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9VRE1BXzQ6CXNldF91bHRyYSgweDFhLCAweDAzLCAweGNkKTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9VRE1BXzM6CXNldF91bHRyYSgweDFhLCAweDA1LCAweGNkKTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9VRE1BXzI6CXNldF91bHRyYSgweDJhLCAweDA3LCAweGNkKTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9VRE1BXzE6CXNldF91bHRyYSgweDNhLCAweDBhLCAweGQwKTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9VRE1BXzA6CXNldF91bHRyYSgweDRhLCAweDBmLCAweGQ1KTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9NV19ETUFfMjoJc2V0X2F0YTIoMHg2OSwgMHgyNSk7IGJyZWFrOwotCQljYXNlIFhGRVJfTVdfRE1BXzE6CXNldF9hdGEyKDB4NmIsIDB4MjcpOyBicmVhazsKLQkJY2FzZSBYRkVSX01XX0RNQV8wOglzZXRfYXRhMigweGRmLCAweDVmKTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9QSU9fNDoJc2V0X3BpbygweDIzLCAweDA5LCAweDI1KTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9QSU9fMzoJc2V0X3BpbygweDI3LCAweDBkLCAweDM1KTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9QSU9fMjoJc2V0X3BpbygweDIzLCAweDI2LCAweDY0KTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9QSU9fMToJc2V0X3BpbygweDQ2LCAweDI5LCAweGE0KTsgYnJlYWs7Ci0JCWNhc2UgWEZFUl9QSU9fMDoJc2V0X3BpbygweGZiLCAweDJiLCAweGFjKTsgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQk7Ci0JfQorCS8qCisJICogSXNzdWUgU0VURkVBVFVSRVNfWEZFUiB0byB0aGUgZHJpdmUgZmlyc3QuIFBEQzIwMnh4IGhhcmR3YXJlIHdpbGwKKwkgKiBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdGltaW5nIHJlZ2lzdGVycyBiYXNlZCBvbiAxMDAgTUh6IFBMTCBvdXRwdXQuCisJICovCisgCWVyciA9IGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHNwZWVkKTsKIAotCXJldHVybiAoaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpKTsKKwkvKgorCSAqIEFzIHdlIHNldCB1cCB0aGUgUExMIHRvIG91dHB1dCAxMzMgTUh6IGZvciBVbHRyYURNQS8xMzMgY2FwYWJsZQorCSAqIGNoaXBzLCB3ZSBtdXN0IG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlZ2lzdGVyIHNldHRpbmdzLi4uCisJICovCisJaWYgKG1heF9kbWFfcmF0ZShod2lmLT5wY2lfZGV2KSA9PSA0KSB7CisJCXU4IG1vZGUgPSBzcGVlZCAmIDB4MDc7CisKKwkJc3dpdGNoIChzcGVlZCkgeworCQkJY2FzZSBYRkVSX1VETUFfNjoKKwkJCWNhc2UgWEZFUl9VRE1BXzU6CisJCQljYXNlIFhGRVJfVURNQV80OgorCQkJY2FzZSBYRkVSX1VETUFfMzoKKwkJCWNhc2UgWEZFUl9VRE1BXzI6CisJCQljYXNlIFhGRVJfVURNQV8xOgorCQkJY2FzZSBYRkVSX1VETUFfMDoKKwkJCQlzZXRfaW5kZXhlZF9yZWcoaHdpZiwgMHgxMCArIGFkaiwKKwkJCQkJCXVkbWFfdGltaW5nc1ttb2RlXS5yZWcxMCk7CisJCQkJc2V0X2luZGV4ZWRfcmVnKGh3aWYsIDB4MTEgKyBhZGosCisJCQkJCQl1ZG1hX3RpbWluZ3NbbW9kZV0ucmVnMTEpOworCQkJCXNldF9pbmRleGVkX3JlZyhod2lmLCAweDEyICsgYWRqLAorCQkJCQkJdWRtYV90aW1pbmdzW21vZGVdLnJlZzEyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBYRkVSX01XX0RNQV8yOgorCQkJY2FzZSBYRkVSX01XX0RNQV8xOgorCQkJY2FzZSBYRkVSX01XX0RNQV8wOgorCQkJCXNldF9pbmRleGVkX3JlZyhod2lmLCAweDBlICsgYWRqLAorCQkJCQkJbXdkbWFfdGltaW5nc1ttb2RlXS5yZWcwZSk7CisJCQkJc2V0X2luZGV4ZWRfcmVnKGh3aWYsIDB4MGYgKyBhZGosCisJCQkJCQltd2RtYV90aW1pbmdzW21vZGVdLnJlZzBmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgWEZFUl9QSU9fNDoKKwkJCWNhc2UgWEZFUl9QSU9fMzoKKwkJCWNhc2UgWEZFUl9QSU9fMjoKKwkJCWNhc2UgWEZFUl9QSU9fMToKKwkJCWNhc2UgWEZFUl9QSU9fMDoKKwkJCQlzZXRfaW5kZXhlZF9yZWcoaHdpZiwgMHgwYyArIGFkaiwKKwkJCQkJCXBpb190aW1pbmdzW21vZGVdLnJlZzBjKTsKKwkJCQlzZXRfaW5kZXhlZF9yZWcoaHdpZiwgMHgwZCArIGFkaiwKKwkJCQkJCXBpb190aW1pbmdzW21vZGVdLnJlZzBkKTsKKwkJCQlzZXRfaW5kZXhlZF9yZWcoaHdpZiwgMHgxMyArIGFkaiwKKwkJCQkJCXBpb190aW1pbmdzW21vZGVdLnJlZzEzKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJwZGMyMDJ4eF9uZXc6ICIKKwkJCQkgICAgICAgIlVua25vd24gc3BlZWQgJWQgaWdub3JlZFxuIiwgc3BlZWQpOworCQl9CisJfSBlbHNlIGlmIChzcGVlZCA9PSBYRkVSX1VETUFfMikgeworCQkvKiBTZXQgdEhPTEQgYml0IHRvIDAgaWYgdXNpbmcgVURNQSBtb2RlIDIgKi8KKwkJdTggdG1wID0gZ2V0X2luZGV4ZWRfcmVnKGh3aWYsIDB4MTAgKyBhZGopOworCisJCXNldF9pbmRleGVkX3JlZyhod2lmLCAweDEwICsgYWRqLCB0bXAgJiAweDdmKTsKKyAJfQorCisJcmV0dXJuIGVycjsKIH0KIAogLyogICAwICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgNyAgIDgKQEAgLTE2OCw1NSArMjU4LDU1IEBACiAgKi8KIHN0YXRpYyB2b2lkIHBkY25ld190dW5lX2RyaXZlKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggcGlvKQogewotCXU4IHNwZWVkOwotCi0JaWYgKHBpbyA9PSA1KSBwaW8gPSA0OwotCXNwZWVkID0gWEZFUl9QSU9fMCArIGlkZV9nZXRfYmVzdF9waW9fbW9kZShkcml2ZSwgMjU1LCBwaW8sIE5VTEwpOwotCi0JKHZvaWQpcGRjbmV3X25ld190dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKKwlwaW8gPSBpZGVfZ2V0X2Jlc3RfcGlvX21vZGUoZHJpdmUsIHBpbywgNCwgTlVMTCk7CisJKHZvaWQpcGRjbmV3X3R1bmVfY2hpcHNldChkcml2ZSwgWEZFUl9QSU9fMCArIHBpbyk7CiB9CiAKLXN0YXRpYyB1OCBwZGNuZXdfbmV3X2NhYmxlX2RldGVjdCAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1OCBwZGNuZXdfY2FibGVfZGV0ZWN0KGlkZV9od2lmX3QgKmh3aWYpCiB7Ci0JaHdpZi0+T1VUQigweDBiLCBod2lmLT5kbWFfdmVuZG9yMSk7Ci0JcmV0dXJuICgodTgpKChod2lmLT5JTkIoaHdpZi0+ZG1hX3ZlbmRvcjMpICYgMHgwNCkpKTsKKwlyZXR1cm4gZ2V0X2luZGV4ZWRfcmVnKGh3aWYsIDB4MGIpICYgMHgwNDsKIH0KLXN0YXRpYyBpbnQgY29uZmlnX2NoaXBzZXRfZm9yX2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlKQorCitzdGF0aWMgaW50IGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCXN0cnVjdCBoZF9kcml2ZWlkICppZAk9IGRyaXZlLT5pZDsKIAlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0JdTggc3BlZWQJCT0gLTE7Ci0JdTggY2FibGU7Ci0KLQl1OCB1bHRyYV82NgkJPSAoKGlkLT5kbWFfdWx0cmEgJiAweDAwMTApIHx8Ci0JCQkJICAgKGlkLT5kbWFfdWx0cmEgJiAweDAwMDgpKSA/IDEgOiAwOwotCi0JY2FibGUgPSBwZGNuZXdfbmV3X2NhYmxlX2RldGVjdChod2lmKTsKKwl1OCB1bHRyYV82NgkJPSAoaWQtPmRtYV91bHRyYSAmIDB4MDA3OCkgPyAxIDogMDsKKwl1OCBjYWJsZQkJPSBwZGNuZXdfY2FibGVfZGV0ZWN0KGh3aWYpOworCXU4IHNwZWVkOwogCiAJaWYgKHVsdHJhXzY2ICYmIGNhYmxlKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6ICVzIGNoYW5uZWwgcmVxdWlyZXMgYW4gODAtcGluIGNhYmxlIGZvciBvcGVyYXRpb24uXG4iLCBod2lmLT5jaGFubmVsID8gIlNlY29uZGFyeSI6IlByaW1hcnkiKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogJXMgY2hhbm5lbCAiCisJCSAgICAgICAicmVxdWlyZXMgYW4gODAtcGluIGNhYmxlIGZvciBvcGVyYXRpb24uXG4iLAorCQkgICAgICAgaHdpZi0+Y2hhbm5lbCA/ICJTZWNvbmRhcnkiIDogIlByaW1hcnkiKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgcmVkdWNlZCB0byBVbHRyYTMzIG1vZGUuXG4iLCBkcml2ZS0+bmFtZSk7CiAJfQogCiAJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKIAkJcmV0dXJuIDA7Ci0JaWYgKGlkLT5jYXBhYmlsaXR5ICYgNCkgewkvKiBJT1JEWV9FTiAmIFBSRUZFVENIX0VOICovCi0JCWh3aWYtPk9VVEIoKDB4MTMgKyAoKGRyaXZlLT5kbiUyKSA/IDB4MDggOiAweDAwKSksIGh3aWYtPmRtYV92ZW5kb3IxKTsKLQkJaHdpZi0+T1VUQigoaHdpZi0+SU5CKGh3aWYtPmRtYV92ZW5kb3IzKXwweDAzKSwgaHdpZi0+ZG1hX3ZlbmRvcjMpOworCisJaWYgKGlkLT5jYXBhYmlsaXR5ICYgNCkgeworCQkvKgorCQkgKiBTZXQgSU9SRFlfRU4gJiBQUkVGRVRDSF9FTiAodGhpcyBzZWVtcyB0byBoYXZlCisJCSAqIE5PIHJlYWwgZWZmZWN0IHNpbmNlIHRoaXMgcmVnaXN0ZXIgaXMgcmVsb2FkZWQKKwkJICogYnkgaGFyZHdhcmUgd2hlbiB0aGUgdHJhbnNmZXIgbW9kZSBpcyBzZWxlY3RlZCkKKwkJICovCisJCXU4IHRtcCwgYWRqID0gKGRyaXZlLT5kbiAmIDEpID8gMHgwOCA6IDB4MDA7CisKKwkJdG1wID0gZ2V0X2luZGV4ZWRfcmVnKGh3aWYsIDB4MTMgKyBhZGopOworCQlzZXRfaW5kZXhlZF9yZWcoaHdpZiwgMHgxMyArIGFkaiwgdG1wIHwgMHgwMyk7CiAJfQogCiAJc3BlZWQgPSBpZGVfZG1hX3NwZWVkKGRyaXZlLCBwZGNuZXdfcmF0ZW1hc2soZHJpdmUpKTsKIAotCWlmICghKHNwZWVkKSkgewotCQlod2lmLT50dW5lcHJvYyhkcml2ZSwgNSk7CisJaWYgKCFzcGVlZCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJKHZvaWQpIGh3aWYtPnNwZWVkcHJvYyhkcml2ZSwgc3BlZWQpOwogCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7CiB9CiAKLXN0YXRpYyBpbnQgcGRjbmV3X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3N0YXRpYyBpbnQgcGRjbmV3X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKIAlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CkBAIC0yMzQsMTYgKzMyNCwxNiBAQAogCiAJfSBlbHNlIGlmICgoaWQtPmNhcGFiaWxpdHkgJiA4KSB8fCAoaWQtPmZpZWxkX3ZhbGlkICYgMikpIHsKIGZhc3RfYXRhX3BpbzoKLQkJaHdpZi0+dHVuZXByb2MoZHJpdmUsIDUpOworCQlod2lmLT50dW5lcHJvYyhkcml2ZSwgMjU1KTsKIAkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOwogCX0KIAkvKiBJT1JEWSBub3Qgc3VwcG9ydGVkICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGRjbmV3X3F1aXJrcHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZlKQorc3RhdGljIGludCBwZGNuZXdfcXVpcmtwcm9jKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlyZXR1cm4gKChpbnQpIGNoZWNrX2luX2RyaXZlX2xpc3RzKGRyaXZlLCBwZGNfcXVpcmtfZHJpdmVzKSk7CisJcmV0dXJuIGNoZWNrX2luX2RyaXZlX2xpc3RzKGRyaXZlLCBwZGNfcXVpcmtfZHJpdmVzKTsKIH0KIAogc3RhdGljIGludCBwZGNuZXdfaWRlX2RtYV9sb3N0aXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKQEAgLTI2MCwyMSArMzUwLDEwMCBAQAogCXJldHVybiBfX2lkZV9kbWFfdGltZW91dChkcml2ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBkY25ld19uZXdfcmVzZXQgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3N0YXRpYyB2b2lkIHBkY25ld19yZXNldChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJLyoKIAkgKiBEZWxldGVkIHRoaXMgYmVjYXVzZSBpdCBpcyByZWR1bmRhbnQgZnJvbSB0aGUgY2FsbGVyLgogCSAqLwotCXByaW50ayhLRVJOX1dBUk5JTkcgIlBEQzIwMlhYOiAlcyBjaGFubmVsIHJlc2V0LlxuIiwKKwlwcmludGsoS0VSTl9XQVJOSU5HICJwZGMyMDJ4eF9uZXc6ICVzIGNoYW5uZWwgcmVzZXQuXG4iLAogCQlIV0lGKGRyaXZlKS0+Y2hhbm5lbCA/ICJTZWNvbmRhcnkiIDogIlByaW1hcnkiKTsKIH0KIAorLyoqCisgKiByZWFkX2NvdW50ZXIgLSBSZWFkIHRoZSBieXRlIGNvdW50IHJlZ2lzdGVycworICogQGRtYV9iYXNlOiBmb3IgdGhlIHBvcnQgYWRkcmVzcworICovCitzdGF0aWMgbG9uZyBfX2RldmluaXQgcmVhZF9jb3VudGVyKHUzMiBkbWFfYmFzZSkKK3sKKwl1MzIgIHByaV9kbWFfYmFzZSA9IGRtYV9iYXNlLCBzZWNfZG1hX2Jhc2UgPSBkbWFfYmFzZSArIDB4MDg7CisJdTggICBjbnQwLCBjbnQxLCBjbnQyLCBjbnQzOworCWxvbmcgY291bnQgPSAwLCBsYXN0OworCWludCAgcmV0cnkgPSAzOworCisJZG8geworCQlsYXN0ID0gY291bnQ7CisKKwkJLyogUmVhZCB0aGUgY3VycmVudCBjb3VudCAqLworCQlvdXRiKDB4MjAsIHByaV9kbWFfYmFzZSArIDB4MDEpOworCQljbnQwID0gaW5iKHByaV9kbWFfYmFzZSArIDB4MDMpOworCQlvdXRiKDB4MjEsIHByaV9kbWFfYmFzZSArIDB4MDEpOworCQljbnQxID0gaW5iKHByaV9kbWFfYmFzZSArIDB4MDMpOworCQlvdXRiKDB4MjAsIHNlY19kbWFfYmFzZSArIDB4MDEpOworCQljbnQyID0gaW5iKHNlY19kbWFfYmFzZSArIDB4MDMpOworCQlvdXRiKDB4MjEsIHNlY19kbWFfYmFzZSArIDB4MDEpOworCQljbnQzID0gaW5iKHNlY19kbWFfYmFzZSArIDB4MDMpOworCisJCWNvdW50ID0gKGNudDMgPDwgMjMpIHwgKGNudDIgPDwgMTUpIHwgKGNudDEgPDwgOCkgfCBjbnQwOworCisJCS8qCisJCSAqIFRoZSAzMC1iaXQgZGVjcmVtZW50aW5nIGNvdW50ZXIgaXMgcmVhZCBpbiA0IHBpZWNlcy4KKwkJICogSW5jb3JyZWN0IHZhbHVlIG1heSBiZSByZWFkIHdoZW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZXMKKwkJICogYXJlIGNoYW5naW5nLi4uCisJCSAqLworCX0gd2hpbGUgKHJldHJ5LS0gJiYgKCgobGFzdCBeIGNvdW50KSAmIDB4M2ZmZjgwMDApIHx8IGxhc3QgPCBjb3VudCkpOworCisJREJHKCJjbnQwWyUwMlhdIGNudDFbJTAyWF0gY250MlslMDJYXSBjbnQzWyUwMlhdXG4iLAorCQkgIGNudDAsIGNudDEsIGNudDIsIGNudDMpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIGRldGVjdF9wbGxfaW5wdXRfY2xvY2sgLSBEZXRlY3QgdGhlIFBMTCBpbnB1dCBjbG9jayBpbiBIei4KKyAqIEBkbWFfYmFzZTogZm9yIHRoZSBwb3J0IGFkZHJlc3MKKyAqIEUuZy4gMTY5NDkwMDAgb24gMzMgTUh6IFBDSSBidXMsIGkuZS4gaGFsZiBvZiB0aGUgUENJIGNsb2NrLgorICovCitzdGF0aWMgbG9uZyBfX2RldmluaXQgZGV0ZWN0X3BsbF9pbnB1dF9jbG9jayh1bnNpZ25lZCBsb25nIGRtYV9iYXNlKQoreworCWxvbmcgc3RhcnRfY291bnQsIGVuZF9jb3VudDsKKwlsb25nIHBsbF9pbnB1dDsKKwl1OCBzY3IxOworCisJc3RhcnRfY291bnQgPSByZWFkX2NvdW50ZXIoZG1hX2Jhc2UpOworCisJLyogU3RhcnQgdGhlIHRlc3QgbW9kZSAqLworCW91dGIoMHgwMSwgZG1hX2Jhc2UgKyAweDAxKTsKKwlzY3IxID0gaW5iKGRtYV9iYXNlICsgMHgwMyk7CisJREJHKCJzY3IxWyUwMlhdXG4iLCBzY3IxKTsKKwlvdXRiKHNjcjEgfCAweDQwLCBkbWFfYmFzZSArIDB4MDMpOworCisJLyogTGV0IHRoZSBjb3VudGVyIHJ1biBmb3IgMTAgbXMuICovCisJbWRlbGF5KDEwKTsKKworCWVuZF9jb3VudCA9IHJlYWRfY291bnRlcihkbWFfYmFzZSk7CisKKwkvKiBTdG9wIHRoZSB0ZXN0IG1vZGUgKi8KKwlvdXRiKDB4MDEsIGRtYV9iYXNlICsgMHgwMSk7CisJc2NyMSA9IGluYihkbWFfYmFzZSArIDB4MDMpOworCURCRygic2NyMVslMDJYXVxuIiwgc2NyMSk7CisJb3V0YihzY3IxICYgfjB4NDAsIGRtYV9iYXNlICsgMHgwMyk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgaW5wdXQgY2xvY2sgaW4gSHoKKwkgKiAodGhlIGNsb2NrIGNvdW50ZXIgaXMgMzAgYml0IHdpZGUgYW5kIGNvdW50cyBkb3duKQorCSAqLworCXBsbF9pbnB1dCA9ICgoc3RhcnRfY291bnQgLSBlbmRfY291bnQpICYgMHgzZmZmZmZmKSAqIDEwMDsKKworCURCRygic3RhcnRbJWxkXSBlbmRbJWxkXVxuIiwgc3RhcnRfY291bnQsIGVuZF9jb3VudCk7CisKKwlyZXR1cm4gcGxsX2lucHV0OworfQorCiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgYXBwbGVfa2l3aV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CiAJdW5zaWduZWQgaW50IGNsYXNzX3JldiA9IDA7Ci0Jdm9pZCBfX2lvbWVtICptbWlvOwogCXU4IGNvbmY7CiAKIAlpZiAobnAgPT0gTlVMTCB8fCAhZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJraXdpLXJvb3QiKSkKQEAgLTI4NSwzMCArNDU0LDIwIEBACiAKIAlpZiAoY2xhc3NfcmV2ID49IDB4MDMpIHsKIAkJLyogU2V0dXAgY2hpcCBtYWdpYyBjb25maWcgc3R1ZmYgKGZyb20gZGFyd2luKSAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQwLCAmY29uZik7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQwLCBjb25mIHwgMHgwMSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChwZGV2LCAweDQwLCAmY29uZik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQwLCAoY29uZiB8IDB4MDEpKTsKIAl9Ci0JbW1pbyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDUpLAotCQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNSkpOwotCi0JLyogU2V0dXAgc29tZSBQTEwgc3R1ZmZzICovCi0Jc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKLQljYXNlIFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI3MDoKLQkJd3JpdGV3KDB4MGQyYiwgbW1pbyArIDB4MTIwMik7Ci0JCW1kZWxheSgzMCk7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0RFVklDRV9JRF9QUk9NSVNFXzIwMjcxOgotCQl3cml0ZXcoMHgwODI2LCBtbWlvICsgMHgxMjAyKTsKLQkJbWRlbGF5KDMwKTsKLQkJYnJlYWs7Ci0JfQotCi0JaW91bm1hcChtbWlvKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAogc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X3BkY25ldyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogeworCXVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KTsKKwl1bnNpZ25lZCBsb25nIHNlY19kbWFfYmFzZSA9IGRtYV9iYXNlICsgMHgwODsKKwlsb25nIHBsbF9pbnB1dCwgcGxsX291dHB1dCwgcmF0aW87CisJaW50IGYsIHI7CisJdTggcGxsX2N0bDAsIHBsbF9jdGwxOworCiAJaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpIHsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywKIAkJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKQEAgLTMyMCw2ICs0NzksMTA2IEBACiAJYXBwbGVfa2l3aV9pbml0KGRldik7CiAjZW5kaWYKIAorCS8qIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgUExMIG91dHB1dCBmcmVxdWVuY3kgKi8KKwlzd2l0Y2gobWF4X2RtYV9yYXRlKGRldikpIHsKKwkJY2FzZSA0OiAvKiBpdCdzIDEzMyBNSHogZm9yIFVsdHJhMTMzIGNoaXBzICovCisJCQlwbGxfb3V0cHV0ID0gMTMzMzMzMzMzOworCQkJYnJlYWs7CisJCWNhc2UgMzogLyogYW5kICAxMDAgTUh6IGZvciBVbHRyYTEwMCBjaGlwcyAqLworCQlkZWZhdWx0OgorCQkJcGxsX291dHB1dCA9IDEwMDAwMDAwMDsKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogRGV0ZWN0IFBMTCBpbnB1dCBjbG9jay4KKwkgKiBPbiBzb21lIHN5c3RlbXMsIHdoZXJlIFBDSSBidXMgaXMgcnVubmluZyBhdCBub24tc3RhbmRhcmQgY2xvY2sgcmF0ZQorCSAqIChlLmcuIDI1IG9yIDQwIE1IeiksIHdlIGhhdmUgdG8gYWRqdXN0IHRoZSBjeWNsZSB0aW1lLgorCSAqIFBEQzIwMjY4IGFuZCBuZXdlciBjaGlwcyBlbXBsb3kgUExMIGNpcmN1aXQgdG8gaGVscCBjb3JyZWN0IHRpbWluZworCSAqIHJlZ2lzdGVycyBzZXR0aW5nLgorCSAqLworCXBsbF9pbnB1dCA9IGRldGVjdF9wbGxfaW5wdXRfY2xvY2soZG1hX2Jhc2UpOworCXByaW50aygiJXM6IFBMTCBpbnB1dCBjbG9jayBpcyAlbGQga0h6XG4iLCBuYW1lLCBwbGxfaW5wdXQgLyAxMDAwKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICh1bmxpa2VseShwbGxfaW5wdXQgPCA1MDAwMDAwTCB8fCBwbGxfaW5wdXQgPiA3MDAwMDAwMEwpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJhZCBQTEwgaW5wdXQgY2xvY2sgJWxkIEh6LCBnaXZpbmcgdXAhXG4iLAorCQkgICAgICAgbmFtZSwgcGxsX2lucHV0KTsKKwkJZ290byBvdXQ7CisJfQorCisjaWZkZWYgREVCVUcKKwlEQkcoInBsbF9vdXRwdXQgaXMgJWxkIEh6XG4iLCBwbGxfb3V0cHV0KTsKKworCS8qIFNob3cgdGhlIGN1cnJlbnQgY2xvY2sgdmFsdWUgb2YgUExMIGNvbnRyb2wgcmVnaXN0ZXIKKwkgKiAobWF5YmUgYWxyZWFkeSBjb25maWd1cmVkIGJ5IHRoZSBCSU9TKQorCSAqLworCW91dGIoMHgwMiwgc2VjX2RtYV9iYXNlICsgMHgwMSk7CisJcGxsX2N0bDAgPSBpbmIoc2VjX2RtYV9iYXNlICsgMHgwMyk7CisJb3V0YigweDAzLCBzZWNfZG1hX2Jhc2UgKyAweDAxKTsKKwlwbGxfY3RsMSA9IGluYihzZWNfZG1hX2Jhc2UgKyAweDAzKTsKKworCURCRygicGxsX2N0bFslMDJYXVslMDJYXVxuIiwgcGxsX2N0bDAsIHBsbF9jdGwxKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHJhdGlvIG9mIEYsIFIgYW5kIE5PCisJICogUE9VVCA9IChGICsgMikgLyAoKCBSICsgMikgKiBOTykKKwkgKi8KKwlyYXRpbyA9IHBsbF9vdXRwdXQgLyAocGxsX2lucHV0IC8gMTAwMCk7CisJaWYgKHJhdGlvIDwgODYwMEwpIHsgLyogOC42eCAqLworCQkvKiBVc2luZyBOTyA9IDB4MDEsIFIgPSAweDBkICovCisJCXIgPSAweDBkOworCX0gZWxzZSBpZiAocmF0aW8gPCAxMjkwMEwpIHsgLyogMTIuOXggKi8KKwkJLyogVXNpbmcgTk8gPSAweDAxLCBSID0gMHgwOCAqLworCQlyID0gMHgwODsKKwl9IGVsc2UgaWYgKHJhdGlvIDwgMTYxMDBMKSB7IC8qIDE2LjF4ICovCisJCS8qIFVzaW5nIE5PID0gMHgwMSwgUiA9IDB4MDYgKi8KKwkJciA9IDB4MDY7CisJfSBlbHNlIGlmIChyYXRpbyA8IDY0MDAwTCkgeyAvKiA2NHggKi8KKwkJciA9IDB4MDA7CisJfSBlbHNlIHsKKwkJLyogSW52YWxpZCByYXRpbyAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCYWQgcmF0aW8gJWxkLCBnaXZpbmcgdXAhXG4iLCBuYW1lLCByYXRpbyk7CisJCWdvdG8gb3V0OworCX0KKworCWYgPSAocmF0aW8gKiAociArIDIpKSAvIDEwMDAgLSAyOworCisJREJHKCJGWyVkXSBSWyVkXSByYXRpbyoxMDAwWyVsZF1cbiIsIGYsIHIsIHJhdGlvKTsKKworCWlmICh1bmxpa2VseShmIDwgMCB8fCBmID4gMTI3KSkgeworCQkvKiBJbnZhbGlkIEYgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRlslZF0gaW52YWxpZCFcbiIsIG5hbWUsIGYpOworCQlnb3RvIG91dDsKKwl9CisKKwlwbGxfY3RsMCA9ICh1OCkgZjsKKwlwbGxfY3RsMSA9ICh1OCkgcjsKKworCURCRygiV3JpdGluZyBwbGxfY3RsWyUwMlhdWyUwMlhdXG4iLCBwbGxfY3RsMCwgcGxsX2N0bDEpOworCisJb3V0YigweDAyLCAgICAgc2VjX2RtYV9iYXNlICsgMHgwMSk7CisJb3V0YihwbGxfY3RsMCwgc2VjX2RtYV9iYXNlICsgMHgwMyk7CisJb3V0YigweDAzLCAgICAgc2VjX2RtYV9iYXNlICsgMHgwMSk7CisJb3V0YihwbGxfY3RsMSwgc2VjX2RtYV9iYXNlICsgMHgwMyk7CisKKwkvKiBXYWl0IHRoZSBQTEwgY2lyY3VpdCB0byBiZSBzdGFibGUgKi8KKwltZGVsYXkoMzApOworCisjaWZkZWYgREVCVUcKKwkvKgorCSAqICBTaG93IHRoZSBjdXJyZW50IGNsb2NrIHZhbHVlIG9mIFBMTCBjb250cm9sIHJlZ2lzdGVyCisJICovCisJb3V0YigweDAyLCBzZWNfZG1hX2Jhc2UgKyAweDAxKTsKKwlwbGxfY3RsMCA9IGluYihzZWNfZG1hX2Jhc2UgKyAweDAzKTsKKwlvdXRiKDB4MDMsIHNlY19kbWFfYmFzZSArIDB4MDEpOworCXBsbF9jdGwxID0gaW5iKHNlY19kbWFfYmFzZSArIDB4MDMpOworCisJREJHKCJwbGxfY3RsWyUwMlhdWyUwMlhdXG4iLCBwbGxfY3RsMCwgcGxsX2N0bDEpOworI2VuZGlmCisKKyBvdXQ6CiAJcmV0dXJuIGRldi0+aXJxOwogfQogCkBAIC0zMjksOCArNTg4LDggQEAKIAogCWh3aWYtPnR1bmVwcm9jICA9ICZwZGNuZXdfdHVuZV9kcml2ZTsKIAlod2lmLT5xdWlya3Byb2MgPSAmcGRjbmV3X3F1aXJrcHJvYzsKLQlod2lmLT5zcGVlZHByb2MgPSAmcGRjbmV3X25ld190dW5lX2NoaXBzZXQ7Ci0JaHdpZi0+cmVzZXRwcm9jID0gJnBkY25ld19uZXdfcmVzZXQ7CisJaHdpZi0+c3BlZWRwcm9jID0gJnBkY25ld190dW5lX2NoaXBzZXQ7CisJaHdpZi0+cmVzZXRwcm9jID0gJnBkY25ld19yZXNldDsKIAogCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IGh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CiAKQEAgLTM0MiwxMSArNjAxLDE0IEBACiAJaHdpZi0+aWRlX2RtYV9jaGVjayA9ICZwZGNuZXdfY29uZmlnX2RyaXZlX3hmZXJfcmF0ZTsKIAlod2lmLT5pZGVfZG1hX2xvc3RpcnEgPSAmcGRjbmV3X2lkZV9kbWFfbG9zdGlycTsKIAlod2lmLT5pZGVfZG1hX3RpbWVvdXQgPSAmcGRjbmV3X2lkZV9kbWFfdGltZW91dDsKLQlpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQotCQlod2lmLT51ZG1hX2ZvdXIgPSAocGRjbmV3X25ld19jYWJsZV9kZXRlY3QoaHdpZikpID8gMCA6IDE7CisKKwlpZiAoIWh3aWYtPnVkbWFfZm91cikKKwkJaHdpZi0+dWRtYV9mb3VyID0gcGRjbmV3X2NhYmxlX2RldGVjdChod2lmKSA/IDAgOiAxOworCiAJaWYgKCFub2F1dG9kbWEpCiAJCWh3aWYtPmF1dG9kbWEgPSAxOwogCWh3aWYtPmRyaXZlc1swXS5hdXRvZG1hID0gaHdpZi0+ZHJpdmVzWzFdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCiAjaWYgUERDMjAyX0RFQlVHX0NBQkxFCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcy1waW4gY2FibGVcbiIsCiAJCWh3aWYtPm5hbWUsIGh3aWYtPnVkbWFfZm91ciA/ICI4MCIgOiAiNDAiKTsKQEAgLTM2Miw2ICs2MjQsNyBAQAogCQkJCQkgaWRlX3BjaV9kZXZpY2VfdCAqZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZmluZGV2ID0gTlVMTDsKKwlpbnQgcmV0OwogCiAJaWYgKChkZXYtPmJ1cy0+c2VsZiAmJgogCSAgICAgZGV2LT5idXMtPnNlbGYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RFQykgJiYKQEAgLTM2OSwxNCArNjMyLDE2IEBACiAJCWlmIChQQ0lfU0xPVChkZXYtPmRldmZuKSAmIDIpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJZC0+ZXh0cmEgPSAwOwotCQl3aGlsZSAoKGZpbmRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBmaW5kZXYpKSAhPSBOVUxMKSB7CisJCXdoaWxlICgoZmluZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZmluZGV2KSkgIT0gTlVMTCkgewogCQkJaWYgKChmaW5kZXYtPnZlbmRvciA9PSBkZXYtPnZlbmRvcikgJiYKIAkJCSAgICAoZmluZGV2LT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UpICYmCiAJCQkgICAgKFBDSV9TTE9UKGZpbmRldi0+ZGV2Zm4pICYgMikpIHsKIAkJCQlpZiAoZmluZGV2LT5pcnEgIT0gZGV2LT5pcnEpIHsKIAkJCQkJZmluZGV2LT5pcnEgPSBkZXYtPmlycTsKIAkJCQl9Ci0JCQkJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlcyhkZXYsIGZpbmRldiwgZCk7CisJCQkJcmV0ID0gaWRlX3NldHVwX3BjaV9kZXZpY2VzKGRldiwgZmluZGV2LCBkKTsKKwkJCQlwY2lfZGV2X3B1dChmaW5kZXYpOworCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvcGlpeC5jIGIvZHJpdmVycy9pZGUvcGNpL3BpaXguYwppbmRleCBjZGMzYWFiLi5iMWU5YThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvcGlpeC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9waWl4LmMKQEAgLTUwNSw2ICs1MDUsMTAgQEAKIAkJLyogVGhpcyBpcyBhIHBhaW5mdWwgc3lzdGVtIGJlc3QgdG8gbGV0IGl0IHNlbGYgdHVuZSBmb3Igbm93ICovCiAJCXJldHVybjsKIAl9CisJLyogRVNCMiBhcHBlYXJzIHRvIGdlbmVyYXRlIHNwdXJpb3VzIERNQSBpbnRlcnJ1cHRzIGluIFBJTyBtb2RlCisJICAgd2hlbiBpbiBuYXRpdmUgbW9kZSAqLworCWlmIChod2lmLT5wY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9FU0IyXzE4KQorCQlod2lmLT5hdGFwaV9pcnFfYm9nb24gPSAxOwogCiAJaHdpZi0+YXV0b2RtYSA9IDA7CiAJaHdpZi0+dHVuZXByb2MgPSAmcGlpeF90dW5lX2RyaXZlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NnaWlvYzQuYyBiL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMKaW5kZXggZjNmZTI4Ny4uY2ZhZDA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3NnaWlvYzQuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2dpaW9jNC5jCkBAIC03NjgsMTQgKzc2OCw3IEBACiAJcmV0dXJuIGlvYzRfcmVnaXN0ZXJfc3VibW9kdWxlKCZpb2M0X2lkZV9zdWJtb2R1bGUpOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQKLWlvYzRfaWRlX2V4aXQodm9pZCkKLXsKLQlpb2M0X3VucmVnaXN0ZXJfc3VibW9kdWxlKCZpb2M0X2lkZV9zdWJtb2R1bGUpOwotfQotCi1tb2R1bGVfaW5pdChpb2M0X2lkZV9pbml0KTsKLW1vZHVsZV9leGl0KGlvYzRfaWRlX2V4aXQpOworbGF0ZV9pbml0Y2FsbChpb2M0X2lkZV9pbml0KTsgLyogQ2FsbCBvbmx5IGFmdGVyIElERSBpbml0IGlzIGRvbmUgKi8KIAogTU9EVUxFX0FVVEhPUigiQW5pa2V0IE1hbGF0cHVyZS9KZXJlbXkgSGlnZG9uIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklERSBQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgU0dJIElPQzQgQmFzZS1JTyBDYXJkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2lzNTUxMy5jIGIvZHJpdmVycy9pZGUvcGNpL3NpczU1MTMuYwppbmRleCA5MmVkZjc2Li42YjMxMzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2lzNTUxMy5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zaXM1NTEzLmMKQEAgLTgwMCw5ICs4MDAsMTAgQEAKIAogCQkJaWYgKHRydWVpZCA9PSAweDU1MTcpIHsgLyogU2lTIDk2MS85NjFCICovCiAKLQkJCQlscGNfYnJpZGdlID0gcGNpX2ZpbmRfc2xvdCgweDAwLCAweDEwKTsgLyogQnVzIDAsIERldiAyLCBGbiAwICovCisJCQkJbHBjX2JyaWRnZSA9IHBjaV9nZXRfc2xvdChkZXYtPmJ1cywgMHgxMCk7IC8qIEJ1cyAwLCBEZXYgMiwgRm4gMCAqLwogCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGxwY19icmlkZ2UsIFBDSV9SRVZJU0lPTl9JRCwgJnNicmV2KTsKIAkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDksICZwcmVmY3RsKTsKKwkJCQlwY2lfZGV2X3B1dChscGNfYnJpZGdlKTsKIAogCQkJCWlmIChzYnJldiA9PSAweDEwICYmIChwcmVmY3RsICYgMHg4MCkpIHsKIAkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiU0lTNTUxMzogU2lTIDk2MUIgTXVUSU9MIElERSBVRE1BMTMzIGNvbnRyb2xsZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NsODJjMTA1LmMgYi9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYwppbmRleCAwYjRiNjA0Li41YWZlZmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYwpAQCAtMjk5LDE0ICsyOTksMTQgQEAKIAkvL0RCRygoInNsODJjMTA1X3NlbGVjdHByb2MoZHJpdmU6JXMpXG4iLCBkcml2ZS0+bmFtZSkpOwogCiAJbWFzayA9IGh3aWYtPmNoYW5uZWwgPyBDVFJMX1AxRjE2IDogQ1RSTF9QMEYxNjsKLQlvbGQgPSB2YWwgPSAqKCh1MzIgKikmaHdpZi0+aHdpZl9kYXRhKTsKKwlvbGQgPSB2YWwgPSAodTMyKXBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCWlmIChkcml2ZS0+dXNpbmdfZG1hKQogCQl2YWwgJj0gfm1hc2s7CiAJZWxzZQogCQl2YWwgfD0gbWFzazsKIAlpZiAob2xkICE9IHZhbCkgewogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgdmFsKTsJCi0JCSooKHUzMiAqKSZod2lmLT5od2lmX2RhdGEpID0gdmFsOworCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKXZhbCk7CiAJfQogfQogCkBAIC0zMTYsMTQgKzMxNiwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBzbDgyYzEwNV9yZXNldHByb2MoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gSFdJRihkcml2ZSktPnBjaV9kZXY7CiAJdTMyIHZhbDsKIAogCURCRygoInNsODJjMTA1X3Jlc2V0cHJvYyhkcml2ZTolcylcbiIsIGRyaXZlLT5uYW1lKSk7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAmdmFsKTsKLQkqKCh1MzIgKikmaHdpZi0+aHdpZl9kYXRhKSA9IHZhbDsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKXZhbCk7CiB9CiAJCiAvKgpAQCAtMzk0LDYgKzM5Myw3IEBACiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0MCwgJnZhbCk7CiAJdmFsIHw9IENUUkxfUDBFTiB8IENUUkxfUDBGMTYgfCBDVFJMX1AxRjE2OwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQwLCB2YWwpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopdmFsKTsKIAogCXJldHVybiBkZXYtPmlycTsKIH0KQEAgLTQwNCwzMCArNDA0LDI1IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfc2w4MmMxMDUoaWRlX2h3aWZfdCAqaHdpZikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKIAl1bnNpZ25lZCBpbnQgcmV2OwogCXU4IGRtYV9zdGF0ZTsKLQl1MzIgdmFsOwotCQorCiAJREJHKCgiaW5pdF9od2lmX3NsODJjMTA1KGh3aWY6IGlkZSVkKVxuIiwgaHdpZi0+aW5kZXgpKTsKIAogCWh3aWYtPnR1bmVwcm9jID0gdHVuZV9zbDgyYzEwNTsKIAlod2lmLT5zZWxlY3Rwcm9jID0gc2w4MmMxMDVfc2VsZWN0cHJvYzsKIAlod2lmLT5yZXNldHByb2MgPSBzbDgyYzEwNV9yZXNldHByb2M7Ci0JCi0JLyogRGVmYXVsdCB0byBQSU8gMCBmb3IgZmFsbGJhY2sgdW5sZXNzIHR1bmVkIG90aGVyd2lzZSwKLQkgKiB3ZSBhbHdheXMgYXV0b3R1bmUgUElPLCB0aGlzIGlzIGRvbmUgYmVmb3JlIERNQSBpcwotCSAqIGNoZWNrZWQsIHNvIHRoZXJlIGlzIG5vIHJpc2sgb2YgYWNjaWRlbnRhbGx5IGRpc2FibGluZwotCSAqIERNQQotCSAgKi8KKworCS8qCisJICogRGVmYXVsdCB0byBQSU8gMCBmb3IgZmFsbGJhY2sgdW5sZXNzIHR1bmVkIG90aGVyd2lzZS4KKwkgKiBXZSBhbHdheXMgYXV0b3R1bmUgUElPLCAgdGhpcyBpcyBkb25lIGJlZm9yZSBETUEgaXMgY2hlY2tlZCwKKwkgKiBzbyB0aGVyZSdzIG5vIHJpc2sgb2YgYWNjaWRlbnRhbGx5IGRpc2FibGluZyBETUEKKwkgKi8KIAlod2lmLT5kcml2ZXNbMF0ucGlvX3NwZWVkID0gWEZFUl9QSU9fMDsKIAlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSAxOwotCWh3aWYtPmRyaXZlc1sxXS5waW9fc3BlZWQgPSBYRkVSX1BJT18xOworCWh3aWYtPmRyaXZlc1sxXS5waW9fc3BlZWQgPSBYRkVSX1BJT18wOwogCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAmdmFsKTsKLQkqKCh1MzIgKikmaHdpZi0+aHdpZl9kYXRhKSA9IHZhbDsKLQkKIAlod2lmLT5hdGFwaV9kbWEgPSAwOwogCWh3aWYtPm13ZG1hX21hc2sgPSAwOwogCWh3aWYtPnN3ZG1hX21hc2sgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jIGIvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jCmluZGV4IDJhZjYzNGQuLjYxZjFhOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYworKysgYi9kcml2ZXJzL2lkZS9wY2kvdmlhODJjeHh4LmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQorI2lmZGVmIENPTkZJR19QUENfQ0hSUAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNlbmRpZgogCkBAIC0yODIsMTEgKzI4MiwxMSBAQAogCSAqIEZpbmQgdGhlIElTQSBicmlkZ2UgdG8gc2VlIGhvdyBnb29kIHRoZSBJREUgaXMuCiAJICovCiAJdmlhX2NvbmZpZyA9IHZpYV9jb25maWdfZmluZCgmaXNhKTsKLQlpZiAoIXZpYV9jb25maWctPmlkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlZQX0lERTogVW5rbm93biBWSUEgU291dGhCcmlkZ2UsIGRpc2FibGluZyBETUEuXG4iKTsKLQkJcGNpX2Rldl9wdXQoaXNhKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCisJLyogV2UgY2hlY2tlZCB0aGlzIGVhcmxpZXIgc28gaWYgaXQgZmFpbHMgaGVyZSBkZWVlcCBiYWRuZXNzCisJICAgaXMgaW52b2x2ZWQgKi8KKworCUJVR19PTighdmlhX2NvbmZpZy0+aWQpOwogCiAJLyoKIAkgKiBTZXR1cCBvciBkaXNhYmxlIENsazY2IGlmIGFwcHJvcHJpYXRlCkBAIC00NDIsNyArNDQyLDcgQEAKIAlod2lmLT5zcGVlZHByb2MgPSAmdmlhX3NldF9kcml2ZTsKIAogCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX0NIUlApICYmIGRlZmluZWQoQ09ORklHX1BQQzMyKQorI2lmZGVmIENPTkZJR19QUENfQ0hSUAogCWlmKG1hY2hpbmVfaXMoY2hycCkgJiYgX2NocnBfdHlwZSA9PSBfQ0hSUF9QZWdhc29zKSB7CiAJCWh3aWYtPmlycSA9IGh3aWYtPmNoYW5uZWwgPyAxNSA6IDE0OwogCX0KQEAgLTQ5NCw2ICs0OTQsMTcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgdmlhX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqaXNhID0gTlVMTDsKKwlzdHJ1Y3QgdmlhX2lzYV9icmlkZ2UgKnZpYV9jb25maWc7CisJLyoKKwkgKiBGaW5kIHRoZSBJU0EgYnJpZGdlIGFuZCBjaGVjayB3ZSBrbm93IHdoYXQgaXQgaXMuCisJICovCisJdmlhX2NvbmZpZyA9IHZpYV9jb25maWdfZmluZCgmaXNhKTsKKwlwY2lfZGV2X3B1dChpc2EpOworCWlmICghdmlhX2NvbmZpZy0+aWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVlBfSURFOiBVbmtub3duIFZJQSBTb3V0aEJyaWRnZSwgZGlzYWJsaW5nIERNQS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgJnZpYTgyY3h4eF9jaGlwc2V0c1tpZC0+ZHJpdmVyX2RhdGFdKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMgYi9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYwppbmRleCAwNzE5YjY0Li42OTVlMjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYworKysgYi9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYwpAQCAtODQ0LDExICs4NDQsMTEgQEAKIAogCXByZV9pbml0ID0gMDsKIAlpZiAoIXNjYW5fZGlyZWN0aW9uKSB7Ci0JCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKKwkJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CiAJCQlpZGVfc2Nhbl9wY2lkZXYoZGV2KTsKIAkJfQogCX0gZWxzZSB7Ci0JCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfZGV2aWNlX3JldmVyc2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCQl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlX3JldmVyc2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgewogCQkJaWRlX3NjYW5fcGNpZGV2KGRldik7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcgYi9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcKaW5kZXggNjcyYjkyZS4uZTdkNTY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZwpAQCAtMzYsNyArMzYsNyBAQAogCSAgZWxzZSBzYXlzIE4uCiAKIGNvbmZpZyBJRUVFMTM5NF9PVUlfREIKLQlib29sICJPVUkgRGF0YWJhc2UgYnVpbHQtaW4iCisJYm9vbCAiT1VJIERhdGFiYXNlIGJ1aWx0LWluIChkZXByZWNhdGVkKSIKIAlkZXBlbmRzIG9uIElFRUUxMzk0CiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZW4gYW4gT1VJIGxpc3QgKHZlbmRvciB1bmlxdWUgSUQncykgd2lsbCBiZQpAQCAtNjcsMTYgKzY3LDExIEBACiAJICBldGgxMzk0IG9wdGlvbiBiZWxvdy4KIAogY29uZmlnIElFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSQotCWJvb2wgIkV4cG9ydCBhbGwgc3ltYm9scyBvZiBpZWVlMTM5NCdzIEFQSSIKKwlib29sICJFeHBvcnQgYWxsIHN5bWJvbHMgb2YgaWVlZTEzOTQncyBBUEkgKGRlcHJlY2F0ZWQpIgogCWRlcGVuZHMgb24gSUVFRTEzOTQKIAlkZWZhdWx0IG4KIAloZWxwCi0JICBFeHBvcnQgYWxsIHN5bWJvbHMgb2YgaWVlZTEzOTQncyBkcml2ZXIgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLCBldmVuCi0JICB0aG9zZSB0aGF0IGFyZSBub3QgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0YW5kYXJkIElFRUUgMTM5NCBkcml2ZXJzLgotCi0JICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIGludGVyZmFjZSB0byB1c2Vyc3BhY2UgYXBwbGljYXRpb25zLgotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb21waWxlIGV4dGVybmFsbHkgZGV2ZWxvcGVkIGRyaXZlcnMgdGhhdAotCSAgbWFrZSBleHRlbmRlZCB1c2Ugb2YgaWVlZTEzOTQncyBBUEkuIEl0IGlzIG90aGVyd2lzZSBzYWZlIHRvIHNheSBOLgorCSAgVGhpcyBvcHRpb24gd2lsbCBiZSByZW1vdmVkIHNvb24uICBEb24ndCB3b3JyeSwgc2F5IE4uCiAKIGNvbW1lbnQgIkRldmljZSBEcml2ZXJzIgogCWRlcGVuZHMgb24gSUVFRTEzOTQKQEAgLTEyNSw3ICsxMjAsNyBAQAogCiBjb25maWcgSUVFRTEzOTRfU0JQMgogCXRyaXN0YXRlICJTQlAtMiBzdXBwb3J0IChIYXJkZGlza3MgZXRjLikiCi0JZGVwZW5kcyBvbiBJRUVFMTM5NCAmJiBTQ1NJICYmIChQQ0kgfHwgQlJPS0VOKQorCWRlcGVuZHMgb24gSUVFRTEzOTQgJiYgU0NTSQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgeW91IHRvIHVzZSBTQlAtMiBkZXZpY2VzIGNvbm5lY3RlZCB0byBhbiBJRUVFCiAJICAxMzk0IGJ1cy4gIFNCUC0yIGRldmljZXMgaW5jbHVkZSBzdG9yYWdlIGRldmljZXMgbGlrZSBoYXJkZGlza3MgYW5kCkBAIC0xNjEsMTcgKzE1NiwxMiBAQAogCSAgTUNBUCwgdGhlcmVmb3JlIG11bHRpY2FzdCBzdXBwb3J0IGlzIHNpZ25pZmljYW50bHkgbGltaXRlZC4KIAogY29uZmlnIElFRUUxMzk0X0RWMTM5NAotCXRyaXN0YXRlICJPSENJLURWIEkvTyBzdXBwb3J0IgorCXRyaXN0YXRlICJPSENJLURWIEkvTyBzdXBwb3J0IChkZXByZWNhdGVkKSIKIAlkZXBlbmRzIG9uIElFRUUxMzk0ICYmIElFRUUxMzk0X09IQ0kxMzk0CiAJaGVscAotCSAgVGhpcyBkcml2ZXIgYWxsb3dzIHlvdSB0byB0cmFuc21pdCBhbmQgcmVjZWl2ZSBEViAoZGlnaXRhbCB2aWRlbykKLQkgIHN0cmVhbXMgb24gYW4gT0hDSS0xMzk0IGNhcmQgdXNpbmcgYSBzaW1wbGUgZnJhbWUtb3JpZW50ZWQKLQkgIGludGVyZmFjZS4KLQotCSAgVGhlIHVzZXItc3BhY2UgQVBJIGZvciBkdjEzOTQgaXMgZG9jdW1lbnRlZCBpbiBkdjEzOTQuaC4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHYxMzk0LgorCSAgVGhlIGR2MTM5NCBkcml2ZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gTGludXggaW4gYSBmdXR1cmUgcmVsZWFzZS4KKwkgIEl0cyBmdW5jdGlvbmFsaXR5IGlzIG5vdyBwcm92aWRlZCBieSByYXcxMzk0IHRvZ2V0aGVyIHdpdGggbGlicmFyaWVzCisJICBzdWNoIGFzIGxpYmllYzYxODgzLgogCiBjb25maWcgSUVFRTEzOTRfUkFXSU8KIAl0cmlzdGF0ZSAiUmF3IElFRUUxMzk0IEkvTyBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9NYWtlZmlsZSBiL2RyaXZlcnMvaWVlZTEzOTQvTWFrZWZpbGUKaW5kZXggNmY1MzYxMS4uZDk2NTBkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2llZWUxMzk0L01ha2VmaWxlCkBAIC0zLDggKzMsMTEgQEAKICMKIAogaWVlZTEzOTQtb2JqcyA6PSBpZWVlMTM5NF9jb3JlLm8gaWVlZTEzOTRfdHJhbnNhY3Rpb25zLm8gaG9zdHMubyBcCi0JCSBoaWdobGV2ZWwubyBjc3IubyBub2RlbWdyLm8gb3VpLm8gZG1hLm8gaXNvLm8gXAorCQkgaGlnaGxldmVsLm8gY3NyLm8gbm9kZW1nci5vIGRtYS5vIGlzby5vIFwKIAkJIGNzcjEyMTIubyBjb25maWdfcm9tcy5vCitpZmRlZiBDT05GSUdfSUVFRTEzOTRfT1VJX0RCCitpZWVlMTM5NC1vYmpzICs9IG91aS5vCitlbmRpZgogCiBvYmotJChDT05GSUdfSUVFRTEzOTQpICs9IGllZWUxMzk0Lm8KIG9iai0kKENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YKSArPSBwY2lseW54Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMgYi9kcml2ZXJzL2llZWUxMzk0L2Nzci5jCmluZGV4IGFiMGM4MGYuLjUyYWM4M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuYwpAQCAtMTU4LDEyICsxNTgsMTAgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGNhbGN1bGF0ZV9leHBpcmUoc3RydWN0IGNzcl9jb250cm9sICpjc3IpCiB7Ci0JdW5zaWduZWQgbG9uZyB1c2VjcyA9Ci0JCShjc3ItPnNwbGl0X3RpbWVvdXRfaGkgJiAweDA3KSAqIFVTRUNfUEVSX1NFQyArCi0JCShjc3ItPnNwbGl0X3RpbWVvdXRfbG8gPj4gMTkpICogMTI1TDsKKwl1bnNpZ25lZCBpbnQgdXNlY3MgPSAoY3NyLT5zcGxpdF90aW1lb3V0X2hpICYgNykgKiAxMDAwMDAwICsKKwkJCSAgICAgKGNzci0+c3BsaXRfdGltZW91dF9sbyA+PiAxOSkgKiAxMjU7CiAKLQljc3ItPmV4cGlyZSA9IHVzZWNzX3RvX2ppZmZpZXModXNlY3MgPiAxMDAwMDBMID8gdXNlY3MgOiAxMDAwMDBMKTsKLQorCWNzci0+ZXhwaXJlID0gdXNlY3NfdG9famlmZmllcyh1c2VjcyA+IDEwMDAwMCA/IHVzZWNzIDogMTAwMDAwKTsKIAlIUFNCX1ZFUkJPU0UoIkNTUjogc2V0dGluZyBleHBpcmUgdG8gJWx1LCBIWj0ldSIsIGNzci0+ZXhwaXJlLCBIWik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jCmluZGV4IDZjNzJmMDQuLjEwODRkYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYwpAQCAtMTUzNiwyNyArMTUzNiwyMCBAQAogCiBzdGF0aWMgbG9uZyBkdjEzOTRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCB2aWRlb19jYXJkICp2aWRlbzsKKwlzdHJ1Y3QgdmlkZW9fY2FyZCAqdmlkZW8gPSBmaWxlX3RvX3ZpZGVvX2NhcmQoZmlsZSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCi0JbG9ja19rZXJuZWwoKTsKLQl2aWRlbyA9IGZpbGVfdG9fdmlkZW9fY2FyZChmaWxlKTsKLQogCS8qIHNlcmlhbGl6ZSB0aGlzIHRvIHByZXZlbnQgbXVsdGktdGhyZWFkZWQgbWF5aGVtICovCiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCWlmICghbXV0ZXhfdHJ5bG9jaygmdmlkZW8tPm10eCkpIHsKLQkJCXVubG9ja19rZXJuZWwoKTsKKwkJaWYgKCFtdXRleF90cnlsb2NrKCZ2aWRlby0+bXR4KSkKIAkJCXJldHVybiAtRUFHQUlOOwotCQl9CiAJfSBlbHNlIHsKLQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdmlkZW8tPm10eCkpIHsKLQkJCXVubG9ja19rZXJuZWwoKTsKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdmlkZW8tPm10eCkpCiAJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQl9CiAJfQogCiAJc3dpdGNoKGNtZCkKQEAgLTE3ODAsNyArMTc3Myw2IEBACiAKICBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ2aWRlby0+bXR4KTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjE4OCwxMiArMjE4MCw4IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKGllZWUxMzk0LCBkdjEzOTRfaWRfdGFibGUpOwogCiBzdGF0aWMgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyIGR2MTM5NF9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gIkRWLzEzOTQgRHJpdmVyIiwKKwkubmFtZQkJPSAiZHYxMzk0IiwKIAkuaWRfdGFibGUJPSBkdjEzOTRfaWRfdGFibGUsCi0JLmRyaXZlciAgICAgICAgID0gewotCQkubmFtZQk9ICJkdjEzOTQiLAotCQkuYnVzCT0gJmllZWUxMzk0X2J1c190eXBlLAotCX0sCiB9OwogCiAKQEAgLTI1ODcsNiArMjU3NSwxMCBAQAogewogCWludCByZXQ7CiAKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgICAgICJXQVJOSU5HOiBUaGUgZHYxMzk0IGRyaXZlciBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKKwkgICAgICAgImZyb20gTGludXggc29vbi4gVXNlIHJhdzEzOTQgaW5zdGVhZC5cbiIpOworCiAJY2Rldl9pbml0KCZkdjEzOTRfY2RldiwgJmR2MTM5NF9mb3BzKTsKIAlkdjEzOTRfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwogCWtvYmplY3Rfc2V0X25hbWUoJmR2MTM5NF9jZGV2LmtvYmosICJkdjEzOTQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKaW5kZXggOGE3YjhmYS4uOTdlNWMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKQEAgLTY0LDYgKzY0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8bmV0L2FycC5oPgogCiAjaW5jbHVkZSAiY29uZmlnX3JvbXMuaCIKQEAgLTEzMiw3ICsxMzMsNyBAQAogI2RlZmluZSBFVEgxMzk0X0RSSVZFUl9OQU1FICJldGgxMzk0Igogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9IEVUSDEzOTRfRFJJVkVSX05BTUU7CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnBhY2tldF90YXNrX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwYWNrZXRfdGFza19jYWNoZTsKIAogc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCBldGgxMzk0X2hpZ2hsZXZlbDsKIApAQCAtNDczLDEyICs0NzQsMTAgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaWVlZTEzOTQsIGV0aDEzOTRfaWRfdGFibGUpOwogCiBzdGF0aWMgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyIGV0aDEzOTRfcHJvdG9fZHJpdmVyID0gewotCS5uYW1lCQk9ICJJUHY0IG92ZXIgMTM5NCBEcml2ZXIiLAorCS5uYW1lCQk9IEVUSDEzOTRfRFJJVkVSX05BTUUsCiAJLmlkX3RhYmxlCT0gZXRoMTM5NF9pZF90YWJsZSwKIAkudXBkYXRlCQk9IGV0aDEzOTRfdXBkYXRlLAogCS5kcml2ZXIJCT0gewotCQkubmFtZQkJPSBFVEgxMzk0X0RSSVZFUl9OQU1FLAotCQkuYnVzCQk9ICZpZWVlMTM5NF9idXNfdHlwZSwKIAkJLnByb2JlCQk9IGV0aDEzOTRfcHJvYmUsCiAJCS5yZW1vdmUJCT0gZXRoMTM5NF9yZW1vdmUsCiAJfSwKQEAgLTQ5MSw3ICs0OTAsNyBAQAogCWludCBpOwogCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBwcml2LT5ob3N0OwotCXU2NCBndWlkID0gKigodTY0KikmKGhvc3QtPmNzci5yb20tPmJ1c19pbmZvX2RhdGFbM10pKTsKKwl1NjQgZ3VpZCA9IGdldF91bmFsaWduZWQoKHU2NCopJihob3N0LT5jc3Iucm9tLT5idXNfaW5mb19kYXRhWzNdKSk7CiAJdTE2IG1heHBheWxvYWQgPSAxIDw8IChob3N0LT5jc3IubWF4X3JlYyArIDEpOwogCWludCBtYXhfc3BlZWQgPSBJRUVFMTM5NF9TUEVFRF9NQVg7CiAKQEAgLTUxNCw4ICs1MTMsOCBAQAogCQkJCSAgICAgIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEKSkpOwogCiAJCS8qIFNldCBvdXIgaGFyZHdhcmUgYWRkcmVzcyB3aGlsZSB3ZSdyZSBhdCBpdCAqLwotCQkqKHU2NCopZGV2LT5kZXZfYWRkciA9IGd1aWQ7Ci0JCSoodTY0KilkZXYtPmJyb2FkY2FzdCA9IH4weDBVTEw7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCAmZ3VpZCwgc2l6ZW9mKHU2NCkpOworCQltZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4ZmYsIHNpemVvZih1NjQpKTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtODk0LDYgKzg5Myw3IEBACiAJCXUxNiBtYXhwYXlsb2FkOwogCQlzdHJ1Y3QgZXRoMTM5NF9ub2RlX3JlZiAqbm9kZTsKIAkJc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICpub2RlX2luZm87CisJCV9fYmU2NCBndWlkOwogCiAJCS8qIFNhbml0eSBjaGVjay4gTWFjT1NYIHNlZW1zIHRvIGJlIHNlbmRpbmcgdXMgMTMxIGluIHRoaXMKIAkJICogZmllbGQgKGF0bGVhc3Qgb24gbXkgUGFudGhlciBHNSkuIE5vdCBzdXJlIHdoeS4gKi8KQEAgLTkwMiw4ICs5MDIsOSBAQAogCiAJCW1heHBheWxvYWQgPSBtaW4oZXRoMTM5NF9zcGVlZHRvX21heHBheWxvYWRbc3NwZF0sICh1MTYpKDEgPDwgKG1heF9yZWMgKyAxKSkpOwogCisJCWd1aWQgPSBnZXRfdW5hbGlnbmVkKCZhcnAxMzk0LT5zX3VuaXFfaWQpOwogCQlub2RlID0gZXRoMTM5NF9maW5kX25vZGVfZ3VpZCgmcHJpdi0+aXBfbm9kZV9saXN0LAotCQkJCQkgICAgICBiZTY0X3RvX2NwdShhcnAxMzk0LT5zX3VuaXFfaWQpKTsKKwkJCQkJICAgICAgYmU2NF90b19jcHUoZ3VpZCkpOwogCQlpZiAoIW5vZGUpIHsKIAkJCXJldHVybiAwOwogCQl9CkBAIC05MzEsMTAgKzkzMiw5IEBACiAJCWFycF9wdHIgKz0gYXJwLT5hcl9wbG47CQkvKiBza2lwIG92ZXIgc2VuZGVyIElQIGFkZHIgKi8KIAogCQlpZiAoYXJwLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVFVRVNUKSkKLQkJCS8qIGp1c3Qgc2V0IEFSUCByZXEgdGFyZ2V0IHVuaXF1ZSBJRCB0byAwICovCi0JCQkqKCh1NjQqKWFycF9wdHIpID0gMDsKKwkJCW1lbXNldChhcnBfcHRyLCAwLCBzaXplb2YodTY0KSk7CiAJCWVsc2UKLQkJCSooKHU2NCopYXJwX3B0cikgPSAqKCh1NjQqKWRldi0+ZGV2X2FkZHIpOworCQkJbWVtY3B5KGFycF9wdHIsIGRldi0+ZGV2X2FkZHIsIHNpemVvZih1NjQpKTsKIAl9CiAKIAkvKiBOb3cgYWRkIHRoZSBldGhlcm5ldCBoZWFkZXIuICovCkBAIC0xNjc1LDggKzE2NzUsMTAgQEAKIAkJaWYgKG1heF9wYXlsb2FkIDwgZGdfc2l6ZSArIGhkcl90eXBlX2xlbltFVEgxMzk0X0hEUl9MRl9VRl0pCiAJCQlwcml2LT5iY19kZ2wrKzsKIAl9IGVsc2UgeworCQlfX2JlNjQgZ3VpZCA9IGdldF91bmFsaWduZWQoKHU2NCAqKWV0aC0+aF9kZXN0KTsKKwogCQlub2RlID0gZXRoMTM5NF9maW5kX25vZGVfZ3VpZCgmcHJpdi0+aXBfbm9kZV9saXN0LAotCQkJCQkgICAgICBiZTY0X3RvX2NwdSgqKHU2NCopZXRoLT5oX2Rlc3QpKTsKKwkJCQkJICAgICAgYmU2NF90b19jcHUoZ3VpZCkpOwogCQlpZiAoIW5vZGUpIHsKIAkJCXJldCA9IC1FQUdBSU47CiAJCQlnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oIGIvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuaAppbmRleCA1MGYyZGQyLi40YjMzMDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmgKQEAgLTI0LDcgKzI0LDYgQEAKIC8qIE9ubHkgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIGFyZSBvZiBpbnRlcmVzdCB0byBhY3R1YWwgaGlnaGxldmVsIGRyaXZlcnMuICovCiAKIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCB7Ci0Jc3RydWN0IG1vZHVsZSAqb3duZXI7CiAJY29uc3QgY2hhciAqbmFtZTsKIAogCS8qIEFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGNhbiBsZWdhbGx5IGJlIE5VTEwsIGV4Y2VwdCBmb3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYwppbmRleCBkOTBhM2ExLi5lZTgyYTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5jCkBAIC0zMSw5ICszMSwxMCBAQAogI2luY2x1ZGUgImNvbmZpZ19yb21zLmgiCiAKIAotc3RhdGljIHZvaWQgZGVsYXllZF9yZXNldF9idXModm9pZCAqIF9fcmVzZXRfaW5mbykKK3N0YXRpYyB2b2lkIGRlbGF5ZWRfcmVzZXRfYnVzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gKHN0cnVjdCBocHNiX2hvc3QqKV9fcmVzZXRfaW5mbzsKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBocHNiX2hvc3QsIGRlbGF5ZWRfcmVzZXQud29yayk7CiAJaW50IGdlbmVyYXRpb24gPSBob3N0LT5jc3IuZ2VuZXJhdGlvbiArIDE7CiAKIAkvKiBUaGUgZ2VuZXJhdGlvbiBmaWVsZCByb2xscyBvdmVyIHRvIDIgcmF0aGVyIHRoYW4gMCBwZXIgSUVFRQpAQCAtNDMsOSArNDQsMTAgQEAKIAogCUNTUl9TRVRfQlVTX0lORk9fR0VORVJBVElPTihob3N0LT5jc3Iucm9tLCBnZW5lcmF0aW9uKTsKIAlpZiAoY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2UoaG9zdC0+Y3NyLnJvbSkgIT0gQ1NSMTIxMl9TVUNDRVNTKSB7Ci0JCS8qIENTUiBpbWFnZSBjcmVhdGlvbiBmYWlsZWQsIHJlc2V0IGdlbmVyYXRpb24gZmllbGQgYW5kIGRvIG5vdAotCQkgKiBpc3N1ZSBhIGJ1cyByZXNldC4gKi8KLQkJQ1NSX1NFVF9CVVNfSU5GT19HRU5FUkFUSU9OKGhvc3QtPmNzci5yb20sIGhvc3QtPmNzci5nZW5lcmF0aW9uKTsKKwkJLyogQ1NSIGltYWdlIGNyZWF0aW9uIGZhaWxlZC4KKwkJICogUmVzZXQgZ2VuZXJhdGlvbiBmaWVsZCBhbmQgZG8gbm90IGlzc3VlIGEgYnVzIHJlc2V0LiAqLworCQlDU1JfU0VUX0JVU19JTkZPX0dFTkVSQVRJT04oaG9zdC0+Y3NyLnJvbSwKKwkJCQkJICAgIGhvc3QtPmNzci5nZW5lcmF0aW9uKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTMsNyArNTUsOCBAQAogCiAJaG9zdC0+dXBkYXRlX2NvbmZpZ19yb20gPSAwOwogCWlmIChob3N0LT5kcml2ZXItPnNldF9od19jb25maWdfcm9tKQotCQlob3N0LT5kcml2ZXItPnNldF9od19jb25maWdfcm9tKGhvc3QsIGhvc3QtPmNzci5yb20tPmJ1c19pbmZvX2RhdGEpOworCQlob3N0LT5kcml2ZXItPnNldF9od19jb25maWdfcm9tKGhvc3QsCisJCQkJCQlob3N0LT5jc3Iucm9tLT5idXNfaW5mb19kYXRhKTsKIAogCWhvc3QtPmNzci5nZW5fdGltZXN0YW1wW2hvc3QtPmNzci5nZW5lcmF0aW9uXSA9IGppZmZpZXM7CiAJaHBzYl9yZXNldF9idXMoaG9zdCwgU0hPUlRfUkVTRVQpOwpAQCAtNjksNyArNzIsOCBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBkdW1teV9pc29jdGwoc3RydWN0IGhwc2JfaXNvICppc28sIGVudW0gaXNvY3RsX2NtZCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgZHVtbXlfaXNvY3RsKHN0cnVjdCBocHNiX2lzbyAqaXNvLCBlbnVtIGlzb2N0bF9jbWQgY29tbWFuZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCXJldHVybiAtMTsKIH0KQEAgLTEyMiwxNSArMTI2LDEzIEBACiAJaW50IGk7CiAJaW50IGhvc3RudW0gPSAwOwogCi0JaCA9IGt6YWxsb2Moc2l6ZW9mKCpoKSArIGV4dHJhLCBTTEFCX0tFUk5FTCk7CisJaCA9IGt6YWxsb2Moc2l6ZW9mKCpoKSArIGV4dHJhLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWgpCiAJCXJldHVybiBOVUxMOwogCiAJaC0+Y3NyLnJvbSA9IGNzcjEyMTJfY3JlYXRlX2NzcigmY3NyX2J1c19vcHMsIENTUl9CVVNfSU5GT19TSVpFLCBoKTsKLQlpZiAoIWgtPmNzci5yb20pIHsKLQkJa2ZyZWUoaCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKwlpZiAoIWgtPmNzci5yb20pCisJCWdvdG8gZmFpbDsKIAogCWgtPmhvc3RkYXRhID0gaCArIDE7CiAJaC0+ZHJpdmVyID0gZHJ2OwpAQCAtMTQ1LDIxICsxNDcsMjAgQEAKIAogCWF0b21pY19zZXQoJmgtPmdlbmVyYXRpb24sIDApOwogCi0JSU5JVF9XT1JLKCZoLT5kZWxheWVkX3Jlc2V0LCBkZWxheWVkX3Jlc2V0X2J1cywgaCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmgtPmRlbGF5ZWRfcmVzZXQsIGRlbGF5ZWRfcmVzZXRfYnVzKTsKIAkKIAlpbml0X3RpbWVyKCZoLT50aW1lb3V0KTsKIAloLT50aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZykgaDsKIAloLT50aW1lb3V0LmZ1bmN0aW9uID0gYWJvcnRfdGltZWRvdXRzOwotCWgtPnRpbWVvdXRfaW50ZXJ2YWwgPSBIWiAvIDIwOyAvLyA1MG1zIGJ5IGRlZmF1bHQKKwloLT50aW1lb3V0X2ludGVydmFsID0gSFogLyAyMDsgLyogNTBtcywgaGFsZiBvZiBtaW5pbXVtIFNQTElUX1RJTUVPVVQgKi8KIAogCWgtPnRvcG9sb2d5X21hcCA9IGgtPmNzci50b3BvbG9neV9tYXAgKyAzOwogCWgtPnNwZWVkX21hcCA9ICh1OCAqKShoLT5jc3Iuc3BlZWRfbWFwICsgMik7CiAKIAltdXRleF9sb2NrKCZob3N0X251bV9hbGxvYyk7Ci0KIAl3aGlsZSAobm9kZW1ncl9mb3JfZWFjaF9ob3N0KCZob3N0bnVtLCBhbGxvY19ob3N0bnVtX2NiKSkKIAkJaG9zdG51bSsrOwotCisJbXV0ZXhfdW5sb2NrKCZob3N0X251bV9hbGxvYyk7CiAJaC0+aWQgPSBob3N0bnVtOwogCiAJbWVtY3B5KCZoLT5kZXZpY2UsICZub2RlbWdyX2Rldl90ZW1wbGF0ZV9ob3N0LCBzaXplb2YoaC0+ZGV2aWNlKSk7CkBAIC0xNzAsMTMgKzE3MSwxOSBAQAogCWgtPmNsYXNzX2Rldi5jbGFzcyA9ICZocHNiX2hvc3RfY2xhc3M7CiAJc25wcmludGYoaC0+Y2xhc3NfZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgImZ3LWhvc3QlZCIsIGgtPmlkKTsKIAotCWRldmljZV9yZWdpc3RlcigmaC0+ZGV2aWNlKTsKLQljbGFzc19kZXZpY2VfcmVnaXN0ZXIoJmgtPmNsYXNzX2Rldik7CisJaWYgKGRldmljZV9yZWdpc3RlcigmaC0+ZGV2aWNlKSkKKwkJZ290byBmYWlsOworCWlmIChjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJmgtPmNsYXNzX2RldikpIHsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmgtPmRldmljZSk7CisJCWdvdG8gZmFpbDsKKwl9CiAJZ2V0X2RldmljZSgmaC0+ZGV2aWNlKTsKIAotCW11dGV4X3VubG9jaygmaG9zdF9udW1fYWxsb2MpOwotCiAJcmV0dXJuIGg7CisKK2ZhaWw6CisJa2ZyZWUoaCk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIGludCBocHNiX2FkZF9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCkBAIC0yMjgsMTMgKzIzNSwxNCBAQAogCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBob3N0LT5jc3IuZ2VuX3RpbWVzdGFtcFtuZXh0X2dlbl0gKyA2MCAqIEhaKSkKIAkJLyogV2FpdCA2MCBzZWNvbmRzIGZyb20gdGhlIGxhc3QgdGltZSB0aGlzIGdlbmVyYXRpb24gbnVtYmVyIHdhcwogCQkgKiB1c2VkLiAqLwotCQlyZXNldF9kZWxheSA9ICg2MCAqIEhaKSArIGhvc3QtPmNzci5nZW5fdGltZXN0YW1wW25leHRfZ2VuXSAtIGppZmZpZXM7CisJCXJlc2V0X2RlbGF5ID0KKwkJCSg2MCAqIEhaKSArIGhvc3QtPmNzci5nZW5fdGltZXN0YW1wW25leHRfZ2VuXSAtIGppZmZpZXM7CiAJZWxzZQogCQkvKiBXYWl0IDEgc2Vjb25kIGluIGNhc2Ugc29tZSBvdGhlciBjb2RlIHdhbnRzIHRvIGNoYW5nZSB0aGUKIAkJICogQ29uZmlnIFJPTSBpbiB0aGUgbmVhciBmdXR1cmUuICovCiAJCXJlc2V0X2RlbGF5ID0gSFo7CiAKLQlQUkVQQVJFX1dPUksoJmhvc3QtPmRlbGF5ZWRfcmVzZXQsIGRlbGF5ZWRfcmVzZXRfYnVzLCBob3N0KTsKKwlQUkVQQVJFX0RFTEFZRURfV09SSygmaG9zdC0+ZGVsYXllZF9yZXNldCwgZGVsYXllZF9yZXNldF9idXMpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaG9zdC0+ZGVsYXllZF9yZXNldCwgcmVzZXRfZGVsYXkpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmggYi9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmgKaW5kZXggYmM2ZGJmYS4uZDU1M2UzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuaApAQCAtNjIsNyArNjIsNyBAQAogCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OwogCiAJaW50IHVwZGF0ZV9jb25maWdfcm9tOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBkZWxheWVkX3Jlc2V0OworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF9yZXNldDsKIAl1bnNpZ25lZCBpbnQgY29uZmlnX3JvbXM7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFkZHJfc3BhY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCmluZGV4IDVmY2NmOWYuLjlhNDhjYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCkBAIC0xMjM3LDEwICsxMjM3LDEwIEBACiAvKiogbm9kZW1nci5jICoqLwogRVhQT1JUX1NZTUJPTChocHNiX25vZGVfZmlsbF9wYWNrZXQpOwogRVhQT1JUX1NZTUJPTChocHNiX25vZGVfd3JpdGUpOwotRVhQT1JUX1NZTUJPTChocHNiX3JlZ2lzdGVyX3Byb3RvY29sKTsKK0VYUE9SVF9TWU1CT0woX19ocHNiX3JlZ2lzdGVyX3Byb3RvY29sKTsKIEVYUE9SVF9TWU1CT0woaHBzYl91bnJlZ2lzdGVyX3Byb3RvY29sKTsKLUVYUE9SVF9TWU1CT0woaWVlZTEzOTRfYnVzX3R5cGUpOwogI2lmZGVmIENPTkZJR19JRUVFMTM5NF9FWFBPUlRfRlVMTF9BUEkKK0VYUE9SVF9TWU1CT0woaWVlZTEzOTRfYnVzX3R5cGUpOwogRVhQT1JUX1NZTUJPTChub2RlbWdyX2Zvcl9lYWNoX2hvc3QpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmgKaW5kZXggYWY0YTc4YS4uNTM2YmEzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmgKQEAgLTIxNyw3ICsyMTcsNyBAQAogLyogcmV0dXJuIHRoZSBpbmRleCAod2l0aGluIGEgbWlub3IgbnVtYmVyIGJsb2NrKSBvZiBhIGZpbGUgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBpZWVlMTM5NF9maWxlX3RvX2luc3RhbmNlKHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9jaW5kZXg7CisJcmV0dXJuIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfY2luZGV4OwogfQogCiBleHRlcm4gaW50IGhwc2JfZGlzYWJsZV9pcm07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCmluZGV4IDhlN2I4M2YuLjYxMzA3Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCkBAIC0xNCw3ICsxNCw5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogI2luY2x1ZGUgImNzci5oIgpAQCAtNjYsNyArNjgsNyBAQAogewogCXF1YWRsZXRfdCBxOwogCXU4IGksICpzcGVlZCwgb2xkX3NwZWVkLCBnb29kX3NwZWVkOwotCWludCByZXQ7CisJaW50IGVycm9yOwogCiAJc3BlZWQgPSAmKGNpLT5ob3N0LT5zcGVlZFtOT0RFSURfVE9fTk9ERShjaS0+bm9kZWlkKV0pOwogCW9sZF9zcGVlZCA9ICpzcGVlZDsKQEAgLTc4LDkgKzgwLDkgQEAKIAkgKiBqdXN0IGZpbmlzaGVkIGl0cyBpbml0aWFsaXphdGlvbi4gKi8KIAlmb3IgKGkgPSBJRUVFMTM5NF9TUEVFRF8xMDA7IGkgPD0gb2xkX3NwZWVkOyBpKyspIHsKIAkJKnNwZWVkID0gaTsKLQkJcmV0ID0gaHBzYl9yZWFkKGNpLT5ob3N0LCBjaS0+bm9kZWlkLCBjaS0+Z2VuZXJhdGlvbiwgYWRkciwKLQkJCQkmcSwgc2l6ZW9mKHF1YWRsZXRfdCkpOwotCQlpZiAocmV0KQorCQllcnJvciA9IGhwc2JfcmVhZChjaS0+aG9zdCwgY2ktPm5vZGVpZCwgY2ktPmdlbmVyYXRpb24sIGFkZHIsCisJCQkJICAmcSwgc2l6ZW9mKHF1YWRsZXRfdCkpOworCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKIAkJKmJ1ZmZlciA9IHE7CiAJCWdvb2Rfc3BlZWQgPSBpOwpAQCAtOTQsMTkgKzk2LDE5IEBACiAJCXJldHVybiAwOwogCX0KIAkqc3BlZWQgPSBvbGRfc3BlZWQ7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgbm9kZW1ncl9idXNfcmVhZChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgdTY0IGFkZHIsIHUxNiBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLCB2b2lkICpfX2NpKQorCQkJICAgIHZvaWQgKmJ1ZmZlciwgdm9pZCAqX19jaSkKIHsKIAlzdHJ1Y3Qgbm9kZW1ncl9jc3JfaW5mbyAqY2kgPSAoc3RydWN0IG5vZGVtZ3JfY3NyX2luZm8qKV9fY2k7Ci0JaW50IGksIHJldDsKKwlpbnQgaSwgZXJyb3I7CiAKIAlmb3IgKGkgPSAxOyA7IGkrKykgewotCQlyZXQgPSBocHNiX3JlYWQoY2ktPmhvc3QsIGNpLT5ub2RlaWQsIGNpLT5nZW5lcmF0aW9uLCBhZGRyLAotCQkJCWJ1ZmZlciwgbGVuZ3RoKTsKLQkJaWYgKCFyZXQpIHsKKwkJZXJyb3IgPSBocHNiX3JlYWQoY2ktPmhvc3QsIGNpLT5ub2RlaWQsIGNpLT5nZW5lcmF0aW9uLCBhZGRyLAorCQkJCSAgYnVmZmVyLCBsZW5ndGgpOworCQlpZiAoIWVycm9yKSB7CiAJCQljaS0+c3BlZWRfdW52ZXJpZmllZCA9IDA7CiAJCQlicmVhazsKIAkJfQpAQCAtMTE3LDE0ICsxMTksMTQgQEAKIAkJLyogVGhlIGllZWUxMzk0X2NvcmUgZ3Vlc3NlZCB0aGUgbm9kZSdzIHNwZWVkIGNhcGFiaWxpdHkgZnJvbQogCQkgKiB0aGUgc2VsZiBJRC4gIENoZWNrIHdoZXRoZXIgYSBsb3dlciBzcGVlZCB3b3Jrcy4gKi8KIAkJaWYgKGNpLT5zcGVlZF91bnZlcmlmaWVkICYmIGxlbmd0aCA9PSBzaXplb2YocXVhZGxldF90KSkgewotCQkJcmV0ID0gbm9kZW1ncl9jaGVja19zcGVlZChjaSwgYWRkciwgYnVmZmVyKTsKLQkJCWlmICghcmV0KQorCQkJZXJyb3IgPSBub2RlbWdyX2NoZWNrX3NwZWVkKGNpLCBhZGRyLCBidWZmZXIpOworCQkJaWYgKCFlcnJvcikKIAkJCQlicmVhazsKIAkJfQogCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMzM0KSkKIAkJCXJldHVybiAtRUlOVFI7CiAJfQotCXJldHVybiByZXQ7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IG5vZGVtZ3JfZ2V0X21heF9yb20ocXVhZGxldF90ICpidXNfaW5mb19kYXRhLCB2b2lkICpfX2NpKQpAQCAtMjU5LDkgKzI2MSwyMCBAQAogCS5yZWxlYXNlCT0gbm9kZW1ncl9yZWxlYXNlX25lLAogfTsKIAorLyogVGhpcyBkdW1teSBkcml2ZXIgcHJldmVudHMgdGhlIGhvc3QgZGV2aWNlcyBmcm9tIGJlaW5nIHNjYW5uZWQuIFdlIGhhdmUgbm8KKyAqIHVzZWZ1bCBkcml2ZXJzIGZvciB0aGVtIHlldCwgYW5kIHRoZXJlIHdvdWxkIGJlIGEgZGVhZGxvY2sgcG9zc2libGUgaWYgdGhlCisgKiBkcml2ZXIgY29yZSBzY2FucyB0aGUgaG9zdCBkZXZpY2Ugd2hpbGUgdGhlIGhvc3QncyBsb3ctbGV2ZWwgZHJpdmVyIChpLmUuCisgKiB0aGUgaG9zdCdzIHBhcmVudCBkZXZpY2UpIGlzIGJlaW5nIHJlbW92ZWQuICovCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgbm9kZW1ncl9taWRfbGF5ZXJfZHJpdmVyID0geworCS5idXMJCT0gJmllZWUxMzk0X2J1c190eXBlLAorCS5uYW1lCQk9ICJub2RlbWdyIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCiBzdHJ1Y3QgZGV2aWNlIG5vZGVtZ3JfZGV2X3RlbXBsYXRlX2hvc3QgPSB7CiAJLmJ1cwkJPSAmaWVlZTEzOTRfYnVzX3R5cGUsCiAJLnJlbGVhc2UJPSBub2RlbWdyX3JlbGVhc2VfaG9zdCwKKwkuZHJpdmVyCQk9ICZub2RlbWdyX21pZF9sYXllcl9kcml2ZXIsCiB9OwogCiAKQEAgLTMwNiw4ICszMTksOCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0X3N0cmluZywgKHR5cGUpZHJpdmVyLT5maWVsZCk7XAogfQkJCQkJCQkJXAogc3RhdGljIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlIGRyaXZlcl9hdHRyX2Rydl8jI2ZpZWxkID0gewlcCi0gICAgICAgIC5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoZmllbGQpLCAubW9kZSA9IFNfSVJVR08gfSwJXAotICAgICAgICAuc2hvdyAgID0gZndfZHJ2X3Nob3dfIyNmaWVsZCwJCQkJXAorCS5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoZmllbGQpLCAubW9kZSA9IFNfSVJVR08gfSwJXAorCS5zaG93ICAgPSBmd19kcnZfc2hvd18jI2ZpZWxkLAkJCQlcCiB9OwogCiAKQEAgLTM2MSw3ICszNzQsNyBAQAogI2VuZGlmCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHBzYl90bGFiZWxfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDE2bGx4XG4iLCB0bSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDE2bGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXRtKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUih0bGFiZWxzX21hc2ssIFNfSVJVR08sIGZ3X3Nob3dfbmVfdGxhYmVsc19tYXNrLCBOVUxMKTsKICNlbmRpZiAvKiBIUFNCX0RFQlVHX1RMQUJFTFMgKi8KQEAgLTM3MywxMSArMzg2LDExIEBACiAJaW50IHN0YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAKIAlpZiAoc3RhdGUgPT0gMSkgewotCQlkb3duX3dyaXRlKCZkZXYtPmJ1cy0+c3Vic3lzLnJ3c2VtKTsKLQkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7CiAJCXVkLT5pZ25vcmVfZHJpdmVyID0gMTsKLQkJdXBfd3JpdGUoJmRldi0+YnVzLT5zdWJzeXMucndzZW0pOwotCX0gZWxzZSBpZiAoIXN0YXRlKQorCQlkb3duX3dyaXRlKCZpZWVlMTM5NF9idXNfdHlwZS5zdWJzeXMucndzZW0pOworCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoZGV2KTsKKwkJdXBfd3JpdGUoJmllZWUxMzk0X2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CisJfSBlbHNlIGlmIChzdGF0ZSA9PSAwKQogCQl1ZC0+aWdub3JlX2RyaXZlciA9IDA7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC00MTIsMTEgKzQyNSwxNCBAQAogc3RhdGljIEJVU19BVFRSKGRlc3Ryb3lfbm9kZSwgU19JV1VTUiB8IFNfSVJVR08sIGZ3X2dldF9kZXN0cm95X25vZGUsIGZ3X3NldF9kZXN0cm95X25vZGUpOwogCiAKLXN0YXRpYyBzc2l6ZV90IGZ3X3NldF9yZXNjYW4oc3RydWN0IGJ1c190eXBlICpidXMsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgZndfc2V0X3Jlc2NhbihzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICBzaXplX3QgY291bnQpCiB7CisJaW50IGVycm9yID0gMDsKKwogCWlmIChzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSA9PSAxKQotCQlidXNfcmVzY2FuX2RldmljZXMoJmllZWUxMzk0X2J1c190eXBlKTsKLQlyZXR1cm4gY291bnQ7CisJCWVycm9yID0gYnVzX3Jlc2Nhbl9kZXZpY2VzKCZpZWVlMTM5NF9idXNfdHlwZSk7CisJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBjb3VudDsKIH0KIHN0YXRpYyBzc2l6ZV90IGZ3X2dldF9yZXNjYW4oc3RydWN0IGJ1c190eXBlICpidXMsIGNoYXIgKmJ1ZikKIHsKQEAgLTQzMiw3ICs0NDgsNyBAQAogCiAJaWYgKHN0YXRlID09IDEpCiAJCWlnbm9yZV9kcml2ZXJzID0gMTsKLQllbHNlIGlmICghc3RhdGUpCisJZWxzZSBpZiAoc3RhdGUgPT0gMCkKIAkJaWdub3JlX2RyaXZlcnMgPSAwOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtNTI1LDcgKzU0MSw3IEBACiAJaW50IGxlbmd0aCA9IDA7CiAJY2hhciAqc2NyYXRjaCA9IGJ1ZjsKIAotICAgICAgICBkcml2ZXIgPSBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIsIGRyaXZlcik7CisJZHJpdmVyID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyLCBkcml2ZXIpOwogCiAJZm9yIChpZCA9IGRyaXZlci0+aWRfdGFibGU7IGlkLT5tYXRjaF9mbGFncyAhPSAwOyBpZCsrKSB7CiAJCWludCBuZWVkX2NvbWEgPSAwOwpAQCAtNTgyLDcgKzU5OCwxMSBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZndfZHJ2X2F0dHJzKTsgaSsrKQotCQlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJ2LCBmd19kcnZfYXR0cnNbaV0pOworCQlpZiAoZHJpdmVyX2NyZWF0ZV9maWxlKGRydiwgZndfZHJ2X2F0dHJzW2ldKSkKKwkJCWdvdG8gZmFpbDsKKwlyZXR1cm47CitmYWlsOgorCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWRkIHN5c2ZzIGF0dHJpYnV0ZSBmb3IgZHJpdmVyICVzIiwgZHJpdmVyLT5uYW1lKTsKIH0KIAogCkBAIC02MDIsNyArNjIyLDEyIEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmd19uZV9hdHRycyk7IGkrKykKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgZndfbmVfYXR0cnNbaV0pOworCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgZndfbmVfYXR0cnNbaV0pKQorCQkJZ290byBmYWlsOworCXJldHVybjsKK2ZhaWw6CisJSFBTQl9FUlIoIkZhaWxlZCB0byBhZGQgc3lzZnMgYXR0cmlidXRlIGZvciBub2RlICUwMTZMeCIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKW5lLT5ndWlkKTsKIH0KIAogCkBAIC02MTIsMTEgKzYzNywxNiBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZndfaG9zdF9hdHRycyk7IGkrKykKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgZndfaG9zdF9hdHRyc1tpXSk7CisJCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCBmd19ob3N0X2F0dHJzW2ldKSkKKwkJCWdvdG8gZmFpbDsKKwlyZXR1cm47CitmYWlsOgorCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWRkIHN5c2ZzIGF0dHJpYnV0ZSBmb3IgaG9zdCAlZCIsIGhvc3QtPmlkKTsKIH0KIAogCi1zdGF0aWMgc3RydWN0IG5vZGVfZW50cnkgKmZpbmRfZW50cnlfYnlfbm9kZWlkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGVpZCk7CitzdGF0aWMgc3RydWN0IG5vZGVfZW50cnkgKmZpbmRfZW50cnlfYnlfbm9kZWlkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisJCQkJCSAgICAgICBub2RlaWRfdCBub2RlaWQpOwogCiBzdGF0aWMgdm9pZCBub2RlbWdyX3VwZGF0ZV9ob3N0X2Rldl9saW5rcyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQogewpAQCAtNjI3LDEyICs2NTcsMTggQEAKIAlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiYnVzbWdyX2lkIik7CiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImhvc3RfaWQiKTsKIAotCWlmICgobmUgPSBmaW5kX2VudHJ5X2J5X25vZGVpZChob3N0LCBob3N0LT5pcm1faWQpKSkKLQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJm5lLT5kZXZpY2Uua29iaiwgImlybV9pZCIpOwotCWlmICgobmUgPSBmaW5kX2VudHJ5X2J5X25vZGVpZChob3N0LCBob3N0LT5idXNtZ3JfaWQpKSkKLQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJm5lLT5kZXZpY2Uua29iaiwgImJ1c21ncl9pZCIpOwotCWlmICgobmUgPSBmaW5kX2VudHJ5X2J5X25vZGVpZChob3N0LCBob3N0LT5ub2RlX2lkKSkpCi0JCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZuZS0+ZGV2aWNlLmtvYmosICJob3N0X2lkIik7CisJaWYgKChuZSA9IGZpbmRfZW50cnlfYnlfbm9kZWlkKGhvc3QsIGhvc3QtPmlybV9pZCkpICYmCisJICAgIHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZuZS0+ZGV2aWNlLmtvYmosICJpcm1faWQiKSkKKwkJZ290byBmYWlsOworCWlmICgobmUgPSBmaW5kX2VudHJ5X2J5X25vZGVpZChob3N0LCBob3N0LT5idXNtZ3JfaWQpKSAmJgorCSAgICBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLCAmbmUtPmRldmljZS5rb2JqLCAiYnVzbWdyX2lkIikpCisJCWdvdG8gZmFpbDsKKwlpZiAoKG5lID0gZmluZF9lbnRyeV9ieV9ub2RlaWQoaG9zdCwgaG9zdC0+bm9kZV9pZCkpICYmCisJICAgIHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZuZS0+ZGV2aWNlLmtvYmosICJob3N0X2lkIikpCisJCWdvdG8gZmFpbDsKKwlyZXR1cm47CitmYWlsOgorCUhQU0JfRVJSKCJGYWlsZWQgdG8gdXBkYXRlIHN5c2ZzIGF0dHJpYnV0ZXMgZm9yIGhvc3QgJWQiLCBob3N0LT5pZCk7CiB9CiAKIHN0YXRpYyB2b2lkIG5vZGVtZ3JfY3JlYXRlX3VkX2Rldl9maWxlcyhzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKQpAQCAtNjQxLDMyICs2NzcsMzkgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ3X3VkX2F0dHJzKTsgaSsrKQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCBmd191ZF9hdHRyc1tpXSk7Ci0KKwkJaWYgKGRldmljZV9jcmVhdGVfZmlsZShkZXYsIGZ3X3VkX2F0dHJzW2ldKSkKKwkJCWdvdG8gZmFpbDsKIAlpZiAodWQtPmZsYWdzICYgVU5JVF9ESVJFQ1RPUllfU1BFQ0lGSUVSX0lEKQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdWRfc3BlY2lmaWVyX2lkKTsKLQorCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3VkX3NwZWNpZmllcl9pZCkpCisJCQlnb3RvIGZhaWw7CiAJaWYgKHVkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX1ZFUlNJT04pCi0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl91ZF92ZXJzaW9uKTsKLQorCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3VkX3ZlcnNpb24pKQorCQkJZ290byBmYWlsOwogCWlmICh1ZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9WRU5ET1JfSUQpIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3VkX3ZlbmRvcl9pZCk7Ci0JCWlmICh1ZC0+dmVuZG9yX25hbWVfa3YpCi0JCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdWRfdmVuZG9yX25hbWVfa3YpOworCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3VkX3ZlbmRvcl9pZCkpCisJCQlnb3RvIGZhaWw7CisJCWlmICh1ZC0+dmVuZG9yX25hbWVfa3YgJiYKKwkJICAgIGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl91ZF92ZW5kb3JfbmFtZV9rdikpCisJCQlnb3RvIGZhaWw7CiAJfQotCiAJaWYgKHVkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX01PREVMX0lEKSB7Ci0JCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl91ZF9tb2RlbF9pZCk7Ci0JCWlmICh1ZC0+bW9kZWxfbmFtZV9rdikKLQkJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl91ZF9tb2RlbF9uYW1lX2t2KTsKKwkJaWYgKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl91ZF9tb2RlbF9pZCkpCisJCQlnb3RvIGZhaWw7CisJCWlmICh1ZC0+bW9kZWxfbmFtZV9rdiAmJgorCQkgICAgZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3VkX21vZGVsX25hbWVfa3YpKQorCQkJZ290byBmYWlsOwogCX0KKwlyZXR1cm47CitmYWlsOgorCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWRkIHN5c2ZzIGF0dHJpYnV0ZXMgZm9yIHVuaXQgJXMiLAorCQkgdWQtPmRldmljZS5idXNfaWQpOwogfQogCiAKIHN0YXRpYyBpbnQgbm9kZW1ncl9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpCiB7Ci0gICAgICAgIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJpdmVyOwotICAgICAgICBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOworCXN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJpdmVyOworCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CiAJc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCAqaWQ7CiAKIAkvKiBXZSBvbmx5IG1hdGNoIHVuaXQgZGlyZWN0b3JpZXMgKi8KQEAgLTY3NCw1NSArNzE3LDc3IEBACiAJCXJldHVybiAwOwogCiAJdWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGRldmljZSk7Ci0JZHJpdmVyID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyLCBkcml2ZXIpOwotCiAJaWYgKHVkLT5uZS0+aW5fbGltYm8gfHwgdWQtPmlnbm9yZV9kcml2ZXIpCiAJCXJldHVybiAwOwogCi0gICAgICAgIGZvciAoaWQgPSBkcml2ZXItPmlkX3RhYmxlOyBpZC0+bWF0Y2hfZmxhZ3MgIT0gMDsgaWQrKykgewotICAgICAgICAgICAgICAgIGlmICgoaWQtPm1hdGNoX2ZsYWdzICYgSUVFRTEzOTRfTUFUQ0hfVkVORE9SX0lEKSAmJgotICAgICAgICAgICAgICAgICAgICBpZC0+dmVuZG9yX2lkICE9IHVkLT52ZW5kb3JfaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwkvKiBXZSBvbmx5IG1hdGNoIGRyaXZlcnMgb2YgdHlwZSBocHNiX3Byb3RvY29sX2RyaXZlciAqLworCWlmIChkcnYgPT0gJm5vZGVtZ3JfbWlkX2xheWVyX2RyaXZlcikKKwkJcmV0dXJuIDA7CiAKLSAgICAgICAgICAgICAgICBpZiAoKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX01PREVMX0lEKSAmJgotICAgICAgICAgICAgICAgICAgICBpZC0+bW9kZWxfaWQgIT0gdWQtPm1vZGVsX2lkKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisJZHJpdmVyID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyLCBkcml2ZXIpOworCWZvciAoaWQgPSBkcml2ZXItPmlkX3RhYmxlOyBpZC0+bWF0Y2hfZmxhZ3MgIT0gMDsgaWQrKykgeworCQlpZiAoKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX1ZFTkRPUl9JRCkgJiYKKwkJICAgIGlkLT52ZW5kb3JfaWQgIT0gdWQtPnZlbmRvcl9pZCkKKwkJCWNvbnRpbnVlOwogCi0gICAgICAgICAgICAgICAgaWYgKChpZC0+bWF0Y2hfZmxhZ3MgJiBJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQpICYmCi0gICAgICAgICAgICAgICAgICAgIGlkLT5zcGVjaWZpZXJfaWQgIT0gdWQtPnNwZWNpZmllcl9pZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCQlpZiAoKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX01PREVMX0lEKSAmJgorCQkgICAgaWQtPm1vZGVsX2lkICE9IHVkLT5tb2RlbF9pZCkKKwkJCWNvbnRpbnVlOwogCi0gICAgICAgICAgICAgICAgaWYgKChpZC0+bWF0Y2hfZmxhZ3MgJiBJRUVFMTM5NF9NQVRDSF9WRVJTSU9OKSAmJgotICAgICAgICAgICAgICAgICAgICBpZC0+dmVyc2lvbiAhPSB1ZC0+dmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCQlpZiAoKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCkgJiYKKwkJICAgIGlkLT5zcGVjaWZpZXJfaWQgIT0gdWQtPnNwZWNpZmllcl9pZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoaWQtPm1hdGNoX2ZsYWdzICYgSUVFRTEzOTRfTUFUQ0hfVkVSU0lPTikgJiYKKwkJICAgIGlkLT52ZXJzaW9uICE9IHVkLT52ZXJzaW9uKQorCQkJY29udGludWU7CiAKIAkJcmV0dXJuIDE7Ci0gICAgICAgIH0KKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAogCitzdGF0aWMgREVGSU5FX01VVEVYKG5vZGVtZ3Jfc2VyaWFsaXplX3JlbW92ZV91ZHMpOworCiBzdGF0aWMgdm9pZCBub2RlbWdyX3JlbW92ZV91ZHMoc3RydWN0IG5vZGVfZW50cnkgKm5lKQogewotCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsICpuZXh0OwotCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldjsKKwlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnRtcCwgKnVkOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNkZXYsIG5leHQsICZub2RlbWdyX3VkX2NsYXNzLmNoaWxkcmVuLCBub2RlKSB7Ci0JCXVkID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgY2xhc3NfZGV2KTsKLQotCQlpZiAodWQtPm5lICE9IG5lKQotCQkJY29udGludWU7Ci0KKwkvKiBJdGVyYXRpb24gb3ZlciBub2RlbWdyX3VkX2NsYXNzLmNoaWxkcmVuIGhhcyB0byBiZSBwcm90ZWN0ZWQgYnkKKwkgKiBub2RlbWdyX3VkX2NsYXNzLnNlbSwgYnV0IGNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCkgd2lsbCBldmVudHVhbGx5CisJICogdGFrZSBub2RlbWdyX3VkX2NsYXNzLnNlbSB0b28uIFRoZXJlZm9yZSBwaWNrIG91dCBvbmUgdWQgYXQgYSB0aW1lLAorCSAqIHJlbGVhc2UgdGhlIHNlbWFwaG9yZSwgYW5kIHRoZW4gdW5yZWdpc3RlciB0aGUgdWQuIFNpbmNlIHRoaXMgY29kZQorCSAqIG1heSBiZSBjYWxsZWQgZnJvbSBvdGhlciBjb250ZXh0cyBiZXNpZGVzIHRoZSBrbm9kZW1ncmRzLCBwcm90ZWN0IHRoZQorCSAqIGdhcCBhZnRlciByZWxlYXNlIG9mIHRoZSBzZW1hcGhvcmUgYnkgbm9kZW1ncl9zZXJpYWxpemVfcmVtb3ZlX3Vkcy4KKwkgKi8KKwltdXRleF9sb2NrKCZub2RlbWdyX3NlcmlhbGl6ZV9yZW1vdmVfdWRzKTsKKwlmb3IgKDs7KSB7CisJCXVkID0gTlVMTDsKKwkJZG93bigmbm9kZW1ncl91ZF9jbGFzcy5zZW0pOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNkZXYsICZub2RlbWdyX3VkX2NsYXNzLmNoaWxkcmVuLCBub2RlKSB7CisJCQl0bXAgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LAorCQkJCQkgICBjbGFzc19kZXYpOworCQkJaWYgKHRtcC0+bmUgPT0gbmUpIHsKKwkJCQl1ZCA9IHRtcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQl1cCgmbm9kZW1ncl91ZF9jbGFzcy5zZW0pOworCQlpZiAodWQgPT0gTlVMTCkKKwkJCWJyZWFrOwogCQljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmdWQtPmNsYXNzX2Rldik7CiAJCWRldmljZV91bnJlZ2lzdGVyKCZ1ZC0+ZGV2aWNlKTsKIAl9CisJbXV0ZXhfdW5sb2NrKCZub2RlbWdyX3NlcmlhbGl6ZV9yZW1vdmVfdWRzKTsKIH0KIAogCiBzdGF0aWMgdm9pZCBub2RlbWdyX3JlbW92ZV9uZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJm5lLT5kZXZpY2U7CisJc3RydWN0IGRldmljZSAqZGV2OwogCiAJZGV2ID0gZ2V0X2RldmljZSgmbmUtPmRldmljZSk7CiAJaWYgKCFkZXYpCkBAIC03NDcsNyArODEyLDcgQEAKIAogc3RhdGljIHZvaWQgbm9kZW1ncl9yZW1vdmVfaG9zdF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldmljZV9mb3JfZWFjaF9jaGlsZChkZXYsIE5VTEwsIF9fbm9kZW1ncl9yZW1vdmVfaG9zdF9kZXYpOworCVdBUk5fT04oZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGRldiwgTlVMTCwgX19ub2RlbWdyX3JlbW92ZV9ob3N0X2RldikpOwogCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJpcm1faWQiKTsKIAlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiYnVzbWdyX2lkIik7CiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImhvc3RfaWQiKTsKQEAgLTc2MSwxNiArODI2LDE2IEBACiAjZW5kaWYKIAlxdWFkbGV0X3QgYnVzb3B0aW9ucyA9IGJlMzJfdG9fY3B1KG5lLT5jc3ItPmJ1c19pbmZvX2RhdGFbMl0pOwogCi0JbmUtPmJ1c29wdC5pcm1jICAgICAgICAgPSAoYnVzb3B0aW9ucyA+PiAzMSkgJiAxOwotCW5lLT5idXNvcHQuY21jICAgICAgICAgID0gKGJ1c29wdGlvbnMgPj4gMzApICYgMTsKLQluZS0+YnVzb3B0LmlzYyAgICAgICAgICA9IChidXNvcHRpb25zID4+IDI5KSAmIDE7Ci0JbmUtPmJ1c29wdC5ibWMgICAgICAgICAgPSAoYnVzb3B0aW9ucyA+PiAyOCkgJiAxOwotCW5lLT5idXNvcHQucG1jICAgICAgICAgID0gKGJ1c29wdGlvbnMgPj4gMjcpICYgMTsKLQluZS0+YnVzb3B0LmN5Y19jbGtfYWNjICA9IChidXNvcHRpb25zID4+IDE2KSAmIDB4ZmY7Ci0JbmUtPmJ1c29wdC5tYXhfcmVjICAgICAgPSAxIDw8ICgoKGJ1c29wdGlvbnMgPj4gMTIpICYgMHhmKSArIDEpOworCW5lLT5idXNvcHQuaXJtYwkJPSAoYnVzb3B0aW9ucyA+PiAzMSkgJiAxOworCW5lLT5idXNvcHQuY21jCQk9IChidXNvcHRpb25zID4+IDMwKSAmIDE7CisJbmUtPmJ1c29wdC5pc2MJCT0gKGJ1c29wdGlvbnMgPj4gMjkpICYgMTsKKwluZS0+YnVzb3B0LmJtYwkJPSAoYnVzb3B0aW9ucyA+PiAyOCkgJiAxOworCW5lLT5idXNvcHQucG1jCQk9IChidXNvcHRpb25zID4+IDI3KSAmIDE7CisJbmUtPmJ1c29wdC5jeWNfY2xrX2FjYwk9IChidXNvcHRpb25zID4+IDE2KSAmIDB4ZmY7CisJbmUtPmJ1c29wdC5tYXhfcmVjCT0gMSA8PCAoKChidXNvcHRpb25zID4+IDEyKSAmIDB4ZikgKyAxKTsKIAluZS0+YnVzb3B0Lm1heF9yb20JPSAoYnVzb3B0aW9ucyA+PiA4KSAmIDB4MzsKLQluZS0+YnVzb3B0LmdlbmVyYXRpb24gICA9IChidXNvcHRpb25zID4+IDQpICYgMHhmOwotCW5lLT5idXNvcHQubG5rc3BkICAgICAgID0gYnVzb3B0aW9ucyAmIDB4NzsKKwluZS0+YnVzb3B0LmdlbmVyYXRpb24JPSAoYnVzb3B0aW9ucyA+PiA0KSAmIDB4ZjsKKwluZS0+YnVzb3B0Lmxua3NwZAk9IGJ1c29wdGlvbnMgJiAweDc7CiAKIAlIUFNCX1ZFUkJPU0UoIk5vZGVNZ3I6IHJhdz0weCUwOHggaXJtYz0lZCBjbWM9JWQgaXNjPSVkIGJtYz0lZCBwbWM9JWQgIgogCQkgICAgICJjeWNfY2xrX2FjYz0lZCBtYXhfcmVjPSVkIG1heF9yb209JWQgZ2VuPSVkIGxzcGQ9JWQiLApAQCAtNzkxLDcgKzg1Niw3IEBACiAKIAluZSA9IGt6YWxsb2Moc2l6ZW9mKCpuZSksIEdGUF9LRVJORUwpOwogCWlmICghbmUpCi0JCXJldHVybiBOVUxMOworCQlnb3RvIGZhaWxfYWxsb2M7CiAKIAluZS0+aG9zdCA9IGhvc3Q7CiAJbmUtPm5vZGVpZCA9IG5vZGVpZDsKQEAgLTgxNCwxMiArODc5LDE1IEBACiAJc25wcmludGYobmUtPmNsYXNzX2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICIlMDE2THgiLAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykobmUtPmd1aWQpKTsKIAotCWRldmljZV9yZWdpc3RlcigmbmUtPmRldmljZSk7Ci0JY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZuZS0+Y2xhc3NfZGV2KTsKKwlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZuZS0+ZGV2aWNlKSkKKwkJZ290byBmYWlsX2RldnJlZzsKKwlpZiAoY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZuZS0+Y2xhc3NfZGV2KSkKKwkJZ290byBmYWlsX2NsYXNzZGV2cmVnOwogCWdldF9kZXZpY2UoJm5lLT5kZXZpY2UpOwogCi0JaWYgKG5lLT5ndWlkX3ZlbmRvcl9vdWkpCi0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX2d1aWRfdmVuZG9yX291aSk7CisJaWYgKG5lLT5ndWlkX3ZlbmRvcl9vdWkgJiYKKwkgICAgZGV2aWNlX2NyZWF0ZV9maWxlKCZuZS0+ZGV2aWNlLCAmZGV2X2F0dHJfbmVfZ3VpZF92ZW5kb3Jfb3VpKSkKKwkJZ290byBmYWlsX2FkZG9pdTsKIAlub2RlbWdyX2NyZWF0ZV9uZV9kZXZfZmlsZXMobmUpOwogCiAJbm9kZW1ncl91cGRhdGVfYnVzX29wdGlvbnMobmUpOwpAQCAtODI5LDE3ICs4OTcsMjggQEAKIAkJICAgTk9ERV9CVVNfQVJHUyhob3N0LCBub2RlaWQpLCAodW5zaWduZWQgbG9uZyBsb25nKWd1aWQpOwogCiAJcmV0dXJuIG5lOworCitmYWlsX2FkZG9pdToKKwlwdXRfZGV2aWNlKCZuZS0+ZGV2aWNlKTsKK2ZhaWxfY2xhc3NkZXZyZWc6CisJZGV2aWNlX3VucmVnaXN0ZXIoJm5lLT5kZXZpY2UpOworZmFpbF9kZXZyZWc6CisJa2ZyZWUobmUpOworZmFpbF9hbGxvYzoKKwlIUFNCX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBub2RlIElEOkJVU1siIE5PREVfQlVTX0ZNVCAiXSAgR1VJRFslMDE2THhdIiwKKwkJIE5PREVfQlVTX0FSR1MoaG9zdCwgbm9kZWlkKSwgKHVuc2lnbmVkIGxvbmcgbG9uZylndWlkKTsKKworCXJldHVybiBOVUxMOwogfQogCiAKIHN0YXRpYyBzdHJ1Y3Qgbm9kZV9lbnRyeSAqZmluZF9lbnRyeV9ieV9ndWlkKHU2NCBndWlkKQogewotCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSAmbm9kZW1ncl9uZV9jbGFzczsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBub2RlX2VudHJ5ICpuZSwgKnJldF9uZSA9IE5VTEw7CiAKLQlkb3duX3JlYWQoJmNsYXNzLT5zdWJzeXMucndzZW0pOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJmNsYXNzLT5jaGlsZHJlbiwgbm9kZSkgeworCWRvd24oJm5vZGVtZ3JfbmVfY2xhc3Muc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNkZXYsICZub2RlbWdyX25lX2NsYXNzLmNoaWxkcmVuLCBub2RlKSB7CiAJCW5lID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBub2RlX2VudHJ5LCBjbGFzc19kZXYpOwogCiAJCWlmIChuZS0+Z3VpZCA9PSBndWlkKSB7CkBAIC04NDcsMjAgKzkyNiwyMCBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JdXBfcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisJdXAoJm5vZGVtZ3JfbmVfY2xhc3Muc2VtKTsKIAotICAgICAgICByZXR1cm4gcmV0X25lOworCXJldHVybiByZXRfbmU7CiB9CiAKIAotc3RhdGljIHN0cnVjdCBub2RlX2VudHJ5ICpmaW5kX2VudHJ5X2J5X25vZGVpZChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBub2RlaWRfdCBub2RlaWQpCitzdGF0aWMgc3RydWN0IG5vZGVfZW50cnkgKmZpbmRfZW50cnlfYnlfbm9kZWlkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisJCQkJCSAgICAgICBub2RlaWRfdCBub2RlaWQpCiB7Ci0Jc3RydWN0IGNsYXNzICpjbGFzcyA9ICZub2RlbWdyX25lX2NsYXNzOwogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXY7CiAJc3RydWN0IG5vZGVfZW50cnkgKm5lLCAqcmV0X25lID0gTlVMTDsKIAotCWRvd25fcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmY2xhc3MtPmNoaWxkcmVuLCBub2RlKSB7CisJZG93bigmbm9kZW1ncl9uZV9jbGFzcy5zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJm5vZGVtZ3JfbmVfY2xhc3MuY2hpbGRyZW4sIG5vZGUpIHsKIAkJbmUgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IG5vZGVfZW50cnksIGNsYXNzX2Rldik7CiAKIAkJaWYgKG5lLT5ob3N0ID09IGhvc3QgJiYgbmUtPm5vZGVpZCA9PSBub2RlaWQpIHsKQEAgLTg2OCw3ICs5NDcsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JdXBfcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisJdXAoJm5vZGVtZ3JfbmVfY2xhc3Muc2VtKTsKIAogCXJldHVybiByZXRfbmU7CiB9CkBAIC04OTAsMTMgKzk2OSwyNSBAQAogCXNucHJpbnRmKHVkLT5jbGFzc19kZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLCAiJXMtJXUiLAogCQkgbmUtPmRldmljZS5idXNfaWQsIHVkLT5pZCk7CiAKLQlkZXZpY2VfcmVnaXN0ZXIoJnVkLT5kZXZpY2UpOwotCWNsYXNzX2RldmljZV9yZWdpc3RlcigmdWQtPmNsYXNzX2Rldik7CisJaWYgKGRldmljZV9yZWdpc3RlcigmdWQtPmRldmljZSkpCisJCWdvdG8gZmFpbF9kZXZyZWc7CisJaWYgKGNsYXNzX2RldmljZV9yZWdpc3RlcigmdWQtPmNsYXNzX2RldikpCisJCWdvdG8gZmFpbF9jbGFzc2RldnJlZzsKIAlnZXRfZGV2aWNlKCZ1ZC0+ZGV2aWNlKTsKIAotCWlmICh1ZC0+dmVuZG9yX291aSkKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZ1ZC0+ZGV2aWNlLCAmZGV2X2F0dHJfdWRfdmVuZG9yX291aSk7CisJaWYgKHVkLT52ZW5kb3Jfb3VpICYmCisJICAgIGRldmljZV9jcmVhdGVfZmlsZSgmdWQtPmRldmljZSwgJmRldl9hdHRyX3VkX3ZlbmRvcl9vdWkpKQorCQlnb3RvIGZhaWxfYWRkb3VpOwogCW5vZGVtZ3JfY3JlYXRlX3VkX2Rldl9maWxlcyh1ZCk7CisKKwlyZXR1cm47CisKK2ZhaWxfYWRkb3VpOgorCXB1dF9kZXZpY2UoJnVkLT5kZXZpY2UpOworZmFpbF9jbGFzc2RldnJlZzoKKwlkZXZpY2VfdW5yZWdpc3RlcigmdWQtPmRldmljZSk7CitmYWlsX2RldnJlZzoKKwlIUFNCX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSB1bml0ICVzIiwgdWQtPmRldmljZS5idXNfaWQpOwogfQkKIAogCkBAIC05NzYsMTAgKzEwNjcsOSBAQAogCQkJLyogTG9naWNhbCBVbml0IE51bWJlciAqLwogCQkJaWYgKGt2LT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfSU1NRURJQVRFKSB7CiAJCQkJaWYgKHVkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX0hBU19MVU4pIHsKLQkJCQkJdWRfY2hpbGQgPSBrbWFsbG9jKHNpemVvZigqdWRfY2hpbGQpLCBHRlBfS0VSTkVMKTsKKwkJCQkJdWRfY2hpbGQgPSBrbWVtZHVwKHVkLCBzaXplb2YoKnVkX2NoaWxkKSwgR0ZQX0tFUk5FTCk7CiAJCQkJCWlmICghdWRfY2hpbGQpCiAJCQkJCQlnb3RvIHVuaXRfZGlyZWN0b3J5X2Vycm9yOwotCQkJCQltZW1jcHkodWRfY2hpbGQsIHVkLCBzaXplb2YoKnVkX2NoaWxkKSk7CiAJCQkJCW5vZGVtZ3JfcmVnaXN0ZXJfZGV2aWNlKG5lLCB1ZF9jaGlsZCwgJm5lLT5kZXZpY2UpOwogCQkJCQl1ZF9jaGlsZCA9IE5VTEw7CiAJCQkJCQpAQCAtMTA5MywxMCArMTE4MywxNiBAQAogCQlsYXN0X2tleV9pZCA9IGt2LT5rZXkuaWQ7CiAJfQogCi0JaWYgKG5lLT52ZW5kb3Jfb3VpKQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5lLT5kZXZpY2UsICZkZXZfYXR0cl9uZV92ZW5kb3Jfb3VpKTsKLQlpZiAobmUtPnZlbmRvcl9uYW1lX2t2KQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5lLT5kZXZpY2UsICZkZXZfYXR0cl9uZV92ZW5kb3JfbmFtZV9rdik7CisJaWYgKG5lLT52ZW5kb3Jfb3VpICYmCisJICAgIGRldmljZV9jcmVhdGVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX3ZlbmRvcl9vdWkpKQorCQlnb3RvIGZhaWw7CisJaWYgKG5lLT52ZW5kb3JfbmFtZV9rdiAmJgorCSAgICBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5lLT5kZXZpY2UsICZkZXZfYXR0cl9uZV92ZW5kb3JfbmFtZV9rdikpCisJCWdvdG8gZmFpbDsKKwlyZXR1cm47CitmYWlsOgorCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWRkIHN5c2ZzIGF0dHJpYnV0ZSBmb3Igbm9kZSAlMDE2THgiLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyluZS0+Z3VpZCk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVRwpAQCAtMTE2MCwxNiArMTI1NiwyMCBAQAogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHICovCiAKIAotaW50IGhwc2JfcmVnaXN0ZXJfcHJvdG9jb2woc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyICpkcml2ZXIpCitpbnQgX19ocHNiX3JlZ2lzdGVyX3Byb3RvY29sKHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJ2LAorCQkJICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lcikKIHsKLQlpbnQgcmV0OworCWludCBlcnJvcjsKKworCWRydi0+ZHJpdmVyLmJ1cyA9ICZpZWVlMTM5NF9idXNfdHlwZTsKKwlkcnYtPmRyaXZlci5vd25lciA9IG93bmVyOworCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CiAKIAkvKiBUaGlzIHdpbGwgY2F1c2UgYSBwcm9iZSBmb3IgZGV2aWNlcyAqLwotCXJldCA9IGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOwotCWlmICghcmV0KQotCQlub2RlbWdyX2NyZWF0ZV9kcnZfZmlsZXMoZHJpdmVyKTsKLQotCXJldHVybiByZXQ7CisJZXJyb3IgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKKwlpZiAoIWVycm9yKQorCQlub2RlbWdyX2NyZWF0ZV9kcnZfZmlsZXMoZHJ2KTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHZvaWQgaHBzYl91bnJlZ2lzdGVyX3Byb3RvY29sKHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJpdmVyKQpAQCAtMTI5NywyNiArMTM5NywyNSBAQAogCiBzdGF0aWMgdm9pZCBub2RlbWdyX25vZGVfc2NhbihzdHJ1Y3QgaG9zdF9pbmZvICpoaSwgaW50IGdlbmVyYXRpb24pCiB7Ci0gICAgICAgIGludCBjb3VudDsKLSAgICAgICAgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCA9IGhpLT5ob3N0OwotICAgICAgICBzdHJ1Y3Qgc2VsZmlkICpzaWQgPSAoc3RydWN0IHNlbGZpZCAqKWhvc3QtPnRvcG9sb2d5X21hcDsKLSAgICAgICAgbm9kZWlkX3Qgbm9kZWlkID0gTE9DQUxfQlVTOworCWludCBjb3VudDsKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gaGktPmhvc3Q7CisJc3RydWN0IHNlbGZpZCAqc2lkID0gKHN0cnVjdCBzZWxmaWQgKilob3N0LT50b3BvbG9neV9tYXA7CisJbm9kZWlkX3Qgbm9kZWlkID0gTE9DQUxfQlVTOwogCi0gICAgICAgIC8qIFNjYW4gZWFjaCBub2RlIG9uIHRoZSBidXMgKi8KLSAgICAgICAgZm9yIChjb3VudCA9IGhvc3QtPnNlbGZpZF9jb3VudDsgY291bnQ7IGNvdW50LS0sIHNpZCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpZC0+ZXh0ZW5kZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwkvKiBTY2FuIGVhY2ggbm9kZSBvbiB0aGUgYnVzICovCisJZm9yIChjb3VudCA9IGhvc3QtPnNlbGZpZF9jb3VudDsgY291bnQ7IGNvdW50LS0sIHNpZCsrKSB7CisJCWlmIChzaWQtPmV4dGVuZGVkKQorCQkJY29udGludWU7CiAKLSAgICAgICAgICAgICAgICBpZiAoIXNpZC0+bGlua19hY3RpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVpZCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5vZGVtZ3Jfbm9kZV9zY2FuX29uZShoaSwgbm9kZWlkKyssIGdlbmVyYXRpb24pOwotICAgICAgICB9CisJCWlmICghc2lkLT5saW5rX2FjdGl2ZSkgeworCQkJbm9kZWlkKys7CisJCQljb250aW51ZTsKKwkJfQorCQlub2RlbWdyX25vZGVfc2Nhbl9vbmUoaGksIG5vZGVpZCsrLCBnZW5lcmF0aW9uKTsKKwl9CiB9CiAKIAotLyogQ2FsbGVyIG5lZWRzIHRvIGhvbGQgbm9kZW1ncl91ZF9jbGFzcy5zdWJzeXMucndzZW0gYXMgcmVhZGVyLiAqLwogc3RhdGljIHZvaWQgbm9kZW1ncl9zdXNwZW5kX25lKHN0cnVjdCBub2RlX2VudHJ5ICpuZSkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OwpAQCAtMTMyNiwyMSArMTQyNSwyMiBAQAogCQkgICBOT0RFX0JVU19BUkdTKG5lLT5ob3N0LCBuZS0+bm9kZWlkKSwgKHVuc2lnbmVkIGxvbmcgbG9uZyluZS0+Z3VpZCk7CiAKIAluZS0+aW5fbGltYm8gPSAxOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX2luX2xpbWJvKTsKKwlXQVJOX09OKGRldmljZV9jcmVhdGVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX2luX2xpbWJvKSk7CiAKLQlkb3duX3dyaXRlKCZuZS0+ZGV2aWNlLmJ1cy0+c3Vic3lzLnJ3c2VtKTsKKwlkb3duKCZub2RlbWdyX3VkX2NsYXNzLnNlbSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmbm9kZW1ncl91ZF9jbGFzcy5jaGlsZHJlbiwgbm9kZSkgewogCQl1ZCA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGNsYXNzX2Rldik7Ci0KIAkJaWYgKHVkLT5uZSAhPSBuZSkKIAkJCWNvbnRpbnVlOwogCisJCWRvd25fd3JpdGUoJmllZWUxMzk0X2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJCWlmICh1ZC0+ZGV2aWNlLmRyaXZlciAmJgogCQkgICAgKCF1ZC0+ZGV2aWNlLmRyaXZlci0+c3VzcGVuZCB8fAogCQkgICAgICB1ZC0+ZGV2aWNlLmRyaXZlci0+c3VzcGVuZCgmdWQtPmRldmljZSwgUE1TR19TVVNQRU5EKSkpCiAJCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoJnVkLT5kZXZpY2UpOworCQl1cF93cml0ZSgmaWVlZTEzOTRfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAl9Ci0JdXBfd3JpdGUoJm5lLT5kZXZpY2UuYnVzLT5zdWJzeXMucndzZW0pOworCXVwKCZub2RlbWdyX3VkX2NsYXNzLnNlbSk7CiB9CiAKIApAQCAtMTM1Miw0NSArMTQ1Miw0NyBAQAogCW5lLT5pbl9saW1ibyA9IDA7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZuZS0+ZGV2aWNlLCAmZGV2X2F0dHJfbmVfaW5fbGltYm8pOwogCi0JZG93bl9yZWFkKCZub2RlbWdyX3VkX2NsYXNzLnN1YnN5cy5yd3NlbSk7Ci0JZG93bl9yZWFkKCZuZS0+ZGV2aWNlLmJ1cy0+c3Vic3lzLnJ3c2VtKTsKKwlkb3duKCZub2RlbWdyX3VkX2NsYXNzLnNlbSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmbm9kZW1ncl91ZF9jbGFzcy5jaGlsZHJlbiwgbm9kZSkgewogCQl1ZCA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGNsYXNzX2Rldik7Ci0KIAkJaWYgKHVkLT5uZSAhPSBuZSkKIAkJCWNvbnRpbnVlOwogCisJCWRvd25fcmVhZCgmaWVlZTEzOTRfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAkJaWYgKHVkLT5kZXZpY2UuZHJpdmVyICYmIHVkLT5kZXZpY2UuZHJpdmVyLT5yZXN1bWUpCiAJCQl1ZC0+ZGV2aWNlLmRyaXZlci0+cmVzdW1lKCZ1ZC0+ZGV2aWNlKTsKKwkJdXBfcmVhZCgmaWVlZTEzOTRfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAl9Ci0JdXBfcmVhZCgmbmUtPmRldmljZS5idXMtPnN1YnN5cy5yd3NlbSk7Ci0JdXBfcmVhZCgmbm9kZW1ncl91ZF9jbGFzcy5zdWJzeXMucndzZW0pOworCXVwKCZub2RlbWdyX3VkX2NsYXNzLnNlbSk7CiAKIAlIUFNCX0RFQlVHKCJOb2RlIHJlc3VtZWQ6IElEOkJVU1siIE5PREVfQlVTX0ZNVCAiXSAgR1VJRFslMDE2THhdIiwKIAkJICAgTk9ERV9CVVNfQVJHUyhuZS0+aG9zdCwgbmUtPm5vZGVpZCksICh1bnNpZ25lZCBsb25nIGxvbmcpbmUtPmd1aWQpOwogfQogCiAKLS8qIENhbGxlciBuZWVkcyB0byBob2xkIG5vZGVtZ3JfdWRfY2xhc3Muc3Vic3lzLnJ3c2VtIGFzIHJlYWRlci4gKi8KIHN0YXRpYyB2b2lkIG5vZGVtZ3JfdXBkYXRlX3BkcnYoc3RydWN0IG5vZGVfZW50cnkgKm5lKQogewogCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CiAJc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyICpwZHJ2OwogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXY7CiAKKwlkb3duKCZub2RlbWdyX3VkX2NsYXNzLnNlbSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmbm9kZW1ncl91ZF9jbGFzcy5jaGlsZHJlbiwgbm9kZSkgewogCQl1ZCA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGNsYXNzX2Rldik7Ci0JCWlmICh1ZC0+bmUgIT0gbmUgfHwgIXVkLT5kZXZpY2UuZHJpdmVyKQorCQlpZiAodWQtPm5lICE9IG5lKQogCQkJY29udGludWU7CiAKLQkJcGRydiA9IGNvbnRhaW5lcl9vZih1ZC0+ZGV2aWNlLmRyaXZlciwgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyLCBkcml2ZXIpOwotCi0JCWlmIChwZHJ2LT51cGRhdGUgJiYgcGRydi0+dXBkYXRlKHVkKSkgewotCQkJZG93bl93cml0ZSgmdWQtPmRldmljZS5idXMtPnN1YnN5cy5yd3NlbSk7Ci0JCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoJnVkLT5kZXZpY2UpOwotCQkJdXBfd3JpdGUoJnVkLT5kZXZpY2UuYnVzLT5zdWJzeXMucndzZW0pOworCQlkb3duX3dyaXRlKCZpZWVlMTM5NF9idXNfdHlwZS5zdWJzeXMucndzZW0pOworCQlpZiAodWQtPmRldmljZS5kcml2ZXIpIHsKKwkJCXBkcnYgPSBjb250YWluZXJfb2YodWQtPmRldmljZS5kcml2ZXIsCisJCQkJCSAgICBzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIsCisJCQkJCSAgICBkcml2ZXIpOworCQkJaWYgKHBkcnYtPnVwZGF0ZSAmJiBwZHJ2LT51cGRhdGUodWQpKQorCQkJCWRldmljZV9yZWxlYXNlX2RyaXZlcigmdWQtPmRldmljZSk7CiAJCX0KKwkJdXBfd3JpdGUoJmllZWUxMzk0X2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJfQorCXVwKCZub2RlbWdyX3VkX2NsYXNzLnNlbSk7CiB9CiAKIApAQCAtMTQwNCw3ICsxNTA2LDcgQEAKIHsKIAljb25zdCB1NjQgYmNfYWRkciA9IChDU1JfUkVHSVNURVJfQkFTRSB8IENTUl9CUk9BRENBU1RfQ0hBTk5FTCk7CiAJcXVhZGxldF90IGJjX3JlbW90ZSwgYmNfbG9jYWw7Ci0JaW50IHJldDsKKwlpbnQgZXJyb3I7CiAKIAlpZiAoIW5lLT5ob3N0LT5pc19pcm0gfHwgbmUtPmdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbiB8fAogCSAgICBuZS0+bm9kZWlkID09IG5lLT5ob3N0LT5ub2RlX2lkKQpAQCAtMTQxMywxNiArMTUxNSwxNCBAQAogCWJjX2xvY2FsID0gY3B1X3RvX2JlMzIobmUtPmhvc3QtPmNzci5icm9hZGNhc3RfY2hhbm5lbCk7CiAKIAkvKiBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgaW1wbGVtZW50ZWQgYW5kIDEzOTRhIGNvbXBsaWFudC4gKi8KLQlyZXQgPSBocHNiX3JlYWQobmUtPmhvc3QsIG5lLT5ub2RlaWQsIGdlbmVyYXRpb24sIGJjX2FkZHIsICZiY19yZW1vdGUsCi0JCQlzaXplb2YoYmNfcmVtb3RlKSk7Ci0JaWYgKCFyZXQgJiYgYmNfcmVtb3RlICYgY3B1X3RvX2JlMzIoMHg4MDAwMDAwMCkgJiYKKwllcnJvciA9IGhwc2JfcmVhZChuZS0+aG9zdCwgbmUtPm5vZGVpZCwgZ2VuZXJhdGlvbiwgYmNfYWRkciwgJmJjX3JlbW90ZSwKKwkJCSAgc2l6ZW9mKGJjX3JlbW90ZSkpOworCWlmICghZXJyb3IgJiYgYmNfcmVtb3RlICYgY3B1X3RvX2JlMzIoMHg4MDAwMDAwMCkgJiYKIAkgICAgYmNfcmVtb3RlICE9IGJjX2xvY2FsKQogCQlocHNiX25vZGVfd3JpdGUobmUsIGJjX2FkZHIsICZiY19sb2NhbCwgc2l6ZW9mKGJjX2xvY2FsKSk7CiB9CiAKIAotLyogQ2FsbGVyIG5lZWRzIHRvIGhvbGQgbm9kZW1ncl91ZF9jbGFzcy5zdWJzeXMucndzZW0gYXMgcmVhZGVyIGJlY2F1c2UgdGhlCi0gKiBjYWxscyB0byBub2RlbWdyX3VwZGF0ZV9wZHJ2KCkgYW5kIG5vZGVtZ3Jfc3VzcGVuZF9uZSgpIGhlcmUgcmVxdWlyZSBpdC4gKi8KIHN0YXRpYyB2b2lkIG5vZGVtZ3JfcHJvYmVfbmUoc3RydWN0IGhvc3RfaW5mbyAqaGksIHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgaW50IGdlbmVyYXRpb24pCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtMTQ1NSw3ICsxNTU1LDYgQEAKIHN0YXRpYyB2b2lkIG5vZGVtZ3Jfbm9kZV9wcm9iZShzdHJ1Y3QgaG9zdF9pbmZvICpoaSwgaW50IGdlbmVyYXRpb24pCiB7CiAJc3RydWN0IGhwc2JfaG9zdCAqaG9zdCA9IGhpLT5ob3N0OwotCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSAmbm9kZW1ncl9uZV9jbGFzczsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBub2RlX2VudHJ5ICpuZTsKIApAQCAtMTQ2OCwxOCArMTU2NywxOCBAQAogCSAqIHdoaWxlIHByb2JlcyBhcmUgdGltZS1jb25zdW1pbmcuIChXZWxsLCB0aG9zZSBwcm9iZXMgbmVlZCBzb21lCiAJICogaW1wcm92ZW1lbnQuLi4pICovCiAKLQlkb3duX3JlYWQoJmNsYXNzLT5zdWJzeXMucndzZW0pOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJmNsYXNzLT5jaGlsZHJlbiwgbm9kZSkgeworCWRvd24oJm5vZGVtZ3JfbmVfY2xhc3Muc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNkZXYsICZub2RlbWdyX25lX2NsYXNzLmNoaWxkcmVuLCBub2RlKSB7CiAJCW5lID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBub2RlX2VudHJ5LCBjbGFzc19kZXYpOwogCQlpZiAoIW5lLT5uZWVkc19wcm9iZSkKIAkJCW5vZGVtZ3JfcHJvYmVfbmUoaGksIG5lLCBnZW5lcmF0aW9uKTsKIAl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmY2xhc3MtPmNoaWxkcmVuLCBub2RlKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmbm9kZW1ncl9uZV9jbGFzcy5jaGlsZHJlbiwgbm9kZSkgewogCQluZSA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgY2xhc3NfZGV2KTsKIAkJaWYgKG5lLT5uZWVkc19wcm9iZSkKIAkJCW5vZGVtZ3JfcHJvYmVfbmUoaGksIG5lLCBnZW5lcmF0aW9uKTsKIAl9Ci0gICAgICAgIHVwX3JlYWQoJmNsYXNzLT5zdWJzeXMucndzZW0pOworCXVwKCZub2RlbWdyX25lX2NsYXNzLnNlbSk7CiAKIAogCS8qIElmIHdlIGhhZCBhIGJ1cyByZXNldCB3aGlsZSB3ZSB3ZXJlIHNjYW5uaW5nIHRoZSBidXMsIGl0IGlzCkBAIC0xNDk3LDE1ICsxNTk2LDE0IEBACiAJICoganVzdCByZW1vdmVkLiAgKi8KIAogCWlmIChnZW5lcmF0aW9uID09IGdldF9ocHNiX2dlbmVyYXRpb24oaG9zdCkpCi0JCWJ1c19yZXNjYW5fZGV2aWNlcygmaWVlZTEzOTRfYnVzX3R5cGUpOwotCi0JcmV0dXJuOworCQlpZiAoYnVzX3Jlc2Nhbl9kZXZpY2VzKCZpZWVlMTM5NF9idXNfdHlwZSkpCisJCQlIUFNCX0RFQlVHKCJidXNfcmVzY2FuX2RldmljZXMgaGFkIGFuIGVycm9yIik7CiB9CiAKIHN0YXRpYyBpbnQgbm9kZW1ncl9zZW5kX3Jlc3VtZV9wYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKIHsKIAlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKLQlpbnQgcmV0ID0gMTsKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOwogCiAJcGFja2V0ID0gaHBzYl9tYWtlX3BoeXBhY2tldChob3N0LAogCQkJRVhUUEhZUEFDS0VUX1RZUEVfUkVTVU1FIHwKQEAgLTE1MTMsMTIgKzE2MTEsMTIgQEAKIAlpZiAocGFja2V0KSB7CiAJCXBhY2tldC0+bm9fd2FpdGVyID0gMTsKIAkJcGFja2V0LT5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKLQkJcmV0ID0gaHBzYl9zZW5kX3BhY2tldChwYWNrZXQpOworCQllcnJvciA9IGhwc2Jfc2VuZF9wYWNrZXQocGFja2V0KTsKIAl9Ci0JaWYgKHJldCkKKwlpZiAoZXJyb3IpCiAJCUhQU0JfV0FSTigiZnctaG9zdCVkOiBGYWlsZWQgdG8gYnJvYWRjYXN0IHJlc3VtZSBwYWNrZXQiLAogCQkJICBob3N0LT5pZCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qIFBlcmZvcm0gYSBmZXcgaGlnaC1sZXZlbCBJUk0gcmVzcG9uc2liaWxpdGllcy4gKi8KQEAgLTE2OTEsMTkgKzE3ODksMTggQEAKIAogaW50IG5vZGVtZ3JfZm9yX2VhY2hfaG9zdCh2b2lkICpfX2RhdGEsIGludCAoKmNiKShzdHJ1Y3QgaHBzYl9ob3N0ICosIHZvaWQgKikpCiB7Ci0Jc3RydWN0IGNsYXNzICpjbGFzcyA9ICZocHNiX2hvc3RfY2xhc3M7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldjsKIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OwogCWludCBlcnJvciA9IDA7CiAKLQlkb3duX3JlYWQoJmNsYXNzLT5zdWJzeXMucndzZW0pOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJmNsYXNzLT5jaGlsZHJlbiwgbm9kZSkgeworCWRvd24oJmhwc2JfaG9zdF9jbGFzcy5zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJmhwc2JfaG9zdF9jbGFzcy5jaGlsZHJlbiwgbm9kZSkgewogCQlob3N0ID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBocHNiX2hvc3QsIGNsYXNzX2Rldik7CiAKIAkJaWYgKChlcnJvciA9IGNiKGhvc3QsIF9fZGF0YSkpKQogCQkJYnJlYWs7CiAJfQotCXVwX3JlYWQoJmNsYXNzLT5zdWJzeXMucndzZW0pOworCXVwKCZocHNiX2hvc3RfY2xhc3Muc2VtKTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTE3MjUsMTAgKzE4MjIsMTAgQEAKIAogdm9pZCBocHNiX25vZGVfZmlsbF9wYWNrZXQoc3RydWN0IG5vZGVfZW50cnkgKm5lLCBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBrdCkKIHsKLSAgICAgICAgcGt0LT5ob3N0ID0gbmUtPmhvc3Q7Ci0gICAgICAgIHBrdC0+Z2VuZXJhdGlvbiA9IG5lLT5nZW5lcmF0aW9uOworCXBrdC0+aG9zdCA9IG5lLT5ob3N0OworCXBrdC0+Z2VuZXJhdGlvbiA9IG5lLT5nZW5lcmF0aW9uOwogCWJhcnJpZXIoKTsKLSAgICAgICAgcGt0LT5ub2RlX2lkID0gbmUtPm5vZGVpZDsKKwlwa3QtPm5vZGVfaWQgPSBuZS0+bm9kZWlkOwogfQogCiBpbnQgaHBzYl9ub2RlX3dyaXRlKHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgdTY0IGFkZHIsCkBAIC0xNzg4LDI2ICsxODg1LDI1IEBACiAKIGludCBpbml0X2llZWUxMzk0X25vZGVtZ3Iodm9pZCkKIHsKLQlpbnQgcmV0OworCWludCBlcnJvcjsKIAotCXJldCA9IGNsYXNzX3JlZ2lzdGVyKCZub2RlbWdyX25lX2NsYXNzKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnJvciA9IGNsYXNzX3JlZ2lzdGVyKCZub2RlbWdyX25lX2NsYXNzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotCXJldCA9IGNsYXNzX3JlZ2lzdGVyKCZub2RlbWdyX3VkX2NsYXNzKTsKLQlpZiAocmV0IDwgMCkgeworCWVycm9yID0gY2xhc3NfcmVnaXN0ZXIoJm5vZGVtZ3JfdWRfY2xhc3MpOworCWlmIChlcnJvcikgewogCQljbGFzc191bnJlZ2lzdGVyKCZub2RlbWdyX25lX2NsYXNzKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIGVycm9yOwogCX0KLQorCWVycm9yID0gZHJpdmVyX3JlZ2lzdGVyKCZub2RlbWdyX21pZF9sYXllcl9kcml2ZXIpOwogCWhwc2JfcmVnaXN0ZXJfaGlnaGxldmVsKCZub2RlbWdyX2hpZ2hsZXZlbCk7Ci0KIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBjbGVhbnVwX2llZWUxMzk0X25vZGVtZ3Iodm9pZCkKIHsKLSAgICAgICAgaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCgmbm9kZW1ncl9oaWdobGV2ZWwpOworCWhwc2JfdW5yZWdpc3Rlcl9oaWdobGV2ZWwoJm5vZGVtZ3JfaGlnaGxldmVsKTsKIAogCWNsYXNzX3VucmVnaXN0ZXIoJm5vZGVtZ3JfdWRfY2xhc3MpOwogCWNsYXNzX3VucmVnaXN0ZXIoJm5vZGVtZ3JfbmVfY2xhc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmggYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaAppbmRleCAwZTFlN2Q5Li5lMjVjYmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaApAQCAtMTQ0LDcgKzE0NCwxMiBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKIH07CiAKLWludCBocHNiX3JlZ2lzdGVyX3Byb3RvY29sKHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJpdmVyKTsKK2ludCBfX2hwc2JfcmVnaXN0ZXJfcHJvdG9jb2woc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyICosIHN0cnVjdCBtb2R1bGUgKik7CitzdGF0aWMgaW5saW5lIGludCBocHNiX3JlZ2lzdGVyX3Byb3RvY29sKHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJpdmVyKQoreworCXJldHVybiBfX2hwc2JfcmVnaXN0ZXJfcHJvdG9jb2woZHJpdmVyLCBUSElTX01PRFVMRSk7Cit9CisKIHZvaWQgaHBzYl91bnJlZ2lzdGVyX3Byb3RvY29sKHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJpdmVyKTsKIAogc3RhdGljIGlubGluZSBpbnQgaHBzYl9ub2RlX2VudHJ5X3ZhbGlkKHN0cnVjdCBub2RlX2VudHJ5ICpuZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwppbmRleCBkZWExMzUyLi42MjgxMzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCkBAIC00NjgsNyArNDY4LDYgQEAKIC8qIEdsb2JhbCBpbml0aWFsaXphdGlvbiAqLwogc3RhdGljIHZvaWQgb2hjaV9pbml0aWFsaXplKHN0cnVjdCB0aV9vaGNpICpvaGNpKQogewotCWNoYXIgaXJxX2J1ZlsxNl07CiAJcXVhZGxldF90IGJ1ZjsKIAlpbnQgbnVtX3BvcnRzLCBpOwogCkBAIC01ODYsMTEgKzU4NSwxMCBAQAogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9IQ0NvbnRyb2xTZXQsIE9IQ0kxMzk0X0hDQ29udHJvbF9saW5rRW5hYmxlKTsKIAogCWJ1ZiA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1ZlcnNpb24pOwotCXNwcmludGYgKGlycV9idWYsICIlZCIsIG9oY2ktPmRldi0+aXJxKTsKLQlQUklOVChLRVJOX0lORk8sICJPSENJLTEzOTQgJWQuJWQgKFBDSSk6IElSUT1bJXNdICAiCisJUFJJTlQoS0VSTl9JTkZPLCAiT0hDSS0xMzk0ICVkLiVkIChQQ0kpOiBJUlE9WyVkXSAgIgogCSAgICAgICJNTUlPPVslbGx4LSVsbHhdICBNYXggUGFja2V0PVslZF0gIElSL0lUIGNvbnRleHRzPVslZC8lZF0iLAogCSAgICAgICgoKChidWYpID4+IDE2KSAmIDB4ZikgKyAoKChidWYpID4+IDIwKSAmIDB4ZikgKiAxMCksCi0JICAgICAgKCgoKGJ1ZikgPj4gNCkgJiAweGYpICsgKChidWYpICYgMHhmKSAqIDEwKSwgaXJxX2J1ZiwKKwkgICAgICAoKCgoYnVmKSA+PiA0KSAmIDB4ZikgKyAoKGJ1ZikgJiAweGYpICogMTApLCBvaGNpLT5kZXYtPmlycSwKIAkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChvaGNpLT5kZXYsIDApLAogCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KG9oY2ktPmRldiwgMCkgKyBPSENJMTM5NF9SRUdJU1RFUl9TSVpFIC0gMSwKIAkgICAgICBvaGNpLT5tYXhfcGFja2V0X3NpemUsCkBAIC0xMjI1LDcgKzEyMjMsNyBAQAogCWludCBjdHg7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKLQlyZWN2ID0ga21hbGxvYyhzaXplb2YoKnJlY3YpLCBTTEFCX0tFUk5FTCk7CisJcmVjdiA9IGttYWxsb2Moc2l6ZW9mKCpyZWN2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZWN2KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTkxOCw3ICsxOTE2LDcgQEAKIAlpbnQgY3R4OwogCWludCByZXQgPSAtRU5PTUVNOwogCi0JeG1pdCA9IGttYWxsb2Moc2l6ZW9mKCp4bWl0KSwgU0xBQl9LRVJORUwpOworCXhtaXQgPSBrbWFsbG9jKHNpemVvZigqeG1pdCksIEdGUF9LRVJORUwpOwogCWlmICgheG1pdCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTMwMjEsNyArMzAxOSw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCWQtPnByZ19jcHVbaV0gPSBwY2lfcG9vbF9hbGxvYyhkLT5wcmdfcG9vbCwgU0xBQl9LRVJORUwsIGQtPnByZ19idXMraSk7CisJCWQtPnByZ19jcHVbaV0gPSBwY2lfcG9vbF9hbGxvYyhkLT5wcmdfcG9vbCwgR0ZQX0tFUk5FTCwgZC0+cHJnX2J1cytpKTsKIAkJT0hDSV9ETUFfQUxMT0MoInBvb2wgZG1hX3JjdiBwcmdbJWRdIiwgaSk7CiAKICAgICAgICAgICAgICAgICBpZiAoZC0+cHJnX2NwdVtpXSAhPSBOVUxMKSB7CkBAIC0zMTE3LDcgKzMxMTUsNyBAQAogCU9IQ0lfRE1BX0FMTE9DKCJkbWFfcmN2IHByZyBwb29sIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZC0+bnVtX2Rlc2M7IGkrKykgewotCQlkLT5wcmdfY3B1W2ldID0gcGNpX3Bvb2xfYWxsb2MoZC0+cHJnX3Bvb2wsIFNMQUJfS0VSTkVMLCBkLT5wcmdfYnVzK2kpOworCQlkLT5wcmdfY3B1W2ldID0gcGNpX3Bvb2xfYWxsb2MoZC0+cHJnX3Bvb2wsIEdGUF9LRVJORUwsIGQtPnByZ19idXMraSk7CiAJCU9IQ0lfRE1BX0FMTE9DKCJwb29sIGRtYV90cm0gcHJnWyVkXSIsIGkpOwogCiAgICAgICAgICAgICAgICAgaWYgKGQtPnByZ19jcHVbaV0gIT0gTlVMTCkgewpAQCAtMzIxNyw2ICszMjE1LDE4IEBACiAJc3RydWN0IHRpX29oY2kgKm9oY2k7CS8qIHNob3J0Y3V0IHRvIGN1cnJlbnRseSBoYW5kbGVkIGRldmljZSAqLwogCXJlc291cmNlX3NpemVfdCBvaGNpX2Jhc2U7CiAKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwkvKiBOZWNlc3Nhcnkgb24gc29tZSBtYWNoaW5lcyBpZiBvaGNpMTM5NCB3YXMgbG9hZGVkLyB1bmxvYWRlZCBiZWZvcmUgKi8KKwlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpvZm4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKKworCQlpZiAob2ZuKSB7CisJCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl8xMzk0X0NBQkxFX1BPV0VSLCBvZm4sIDAsIDEpOworCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9FTkFCTEUsIG9mbiwgMCwgMSk7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCisKICAgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCiAJCUZBSUwoLUVOWElPLCAiRmFpbGVkIHRvIGVuYWJsZSBPSENJIGhhcmR3YXJlIik7CiAgICAgICAgIHBjaV9zZXRfbWFzdGVyKGRldik7CkBAIC0zNTA1LDE3ICszNTE1LDE0IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUENfUE1BQwotCS8qIE9uIFVuaU5vcnRoLCBwb3dlciBkb3duIHRoZSBjYWJsZSBhbmQgdHVybiBvZmYgdGhlIGNoaXAKLQkgKiBjbG9jayB3aGVuIHRoZSBtb2R1bGUgaXMgcmVtb3ZlZCB0byBzYXZlIHBvd2VyIG9uCi0JICogbGFwdG9wcy4gVHVybmluZyBpdCBiYWNrIE9OIGlzIGRvbmUgYnkgdGhlIGFyY2ggY29kZSB3aGVuCi0JICogcGNpX2VuYWJsZV9kZXZpY2UoKSBpcyBjYWxsZWQgKi8KLQl7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSogb2Zfbm9kZTsKKwkvKiBPbiBVbmlOb3J0aCwgcG93ZXIgZG93biB0aGUgY2FibGUgYW5kIHR1cm4gb2ZmIHRoZSBjaGlwIGNsb2NrCisJICogdG8gc2F2ZSBwb3dlciBvbiBsYXB0b3BzICovCisJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSogb2ZuID0gcGNpX2RldmljZV90b19PRl9ub2RlKG9oY2ktPmRldik7CiAKLQkJb2Zfbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShvaGNpLT5kZXYpOwotCQlpZiAob2Zfbm9kZSkgewotCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9FTkFCTEUsIG9mX25vZGUsIDAsIDApOwotCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9DQUJMRV9QT1dFUiwgb2Zfbm9kZSwgMCwgMCk7CisJCWlmIChvZm4pIHsKKwkJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSXzEzOTRfRU5BQkxFLCBvZm4sIDAsIDApOworCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9DQUJMRV9QT1dFUiwgb2ZuLCAwLCAwKTsKIAkJfQogCX0KICNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KQEAgLTM1MjksNDkgKzM1MzYsMTAxIEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgb2hjaTEzOTRfcGNpX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IG9oY2kxMzk0X3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CisJaW50IGVycjsKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgc3VzcGVuZCBhbmQgcmVzdW1lIHlldFxuIiwKKwkgICAgICAgT0hDSTEzOTRfRFJJVkVSX05BTUUpOworCisJaWYgKCFvaGNpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyaWVkIHRvIHN1c3BlbmQgbm9uZXhpc3RpbmcgaG9zdFxuIiwKKwkJICAgICAgIE9IQ0kxMzk0X0RSSVZFUl9OQU1FKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJREJHTVNHKCJzdXNwZW5kIGNhbGxlZCIpOworCisJLyogQ2xlYXIgdGhlIGFzeW5jIERNQSBjb250ZXh0cyBhbmQgc3RvcCB1c2luZyB0aGUgY29udHJvbGxlciAqLworCWhwc2JfYnVzX3Jlc2V0KG9oY2ktPmhvc3QpOworCisJLyogU2VlIG9oY2kxMzk0X3BjaV9yZW1vdmUoKSBmb3IgY29tbWVudHMgb24gdGhpcyBzZXF1ZW5jZSAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Db25maWdST01oZHIsIDApOworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zLAorCQkgIChyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zKSAmIDB4MDAwMGYwMDcpIHwKKwkJICAweDAwZmYwMDAwKTsKKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50TWFza0NsZWFyLCAweGZmZmZmZmZmKTsKKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwgMHhmZmZmZmZmZik7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrQ2xlYXIsIDB4ZmZmZmZmZmYpOworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50RXZlbnRDbGVhciwgMHhmZmZmZmZmZik7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrQ2xlYXIsIDB4ZmZmZmZmZmYpOworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRDbGVhciwgMHhmZmZmZmZmZik7CisJc2V0X3BoeV9yZWcob2hjaSwgNCwgfjB4YzAgJiBnZXRfcGh5X3JlZyhvaGNpLCA0KSk7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0xpbmtDb250cm9sQ2xlYXIsIDB4ZmZmZmZmZmYpOworCW9oY2lfZGV2Y3RsKG9oY2ktPmhvc3QsIFJFU0VUX0JVUywgTE9OR19SRVNFVF9OT19GT1JDRV9ST09UKTsKKwlvaGNpX3NvZnRfcmVzZXQob2hjaSk7CisKKwllcnIgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCVBSSU5UKEtFUk5fRVJSLCAicGNpX3NhdmVfc3RhdGUgZmFpbGVkIHdpdGggJWQiLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKwlpZiAoZXJyKQorCQlEQkdNU0coInBjaV9zZXRfcG93ZXJfc3RhdGUgZmFpbGVkIHdpdGggJWQiLCBlcnIpOworCisvKiBQb3dlck1hYyBzdXNwZW5kIGNvZGUgY29tZXMgbGFzdCAqLworI2lmZGVmIENPTkZJR19QUENfUE1BQworCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKworCQlpZiAob2ZuKQorCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9FTkFCTEUsIG9mbiwgMCwgMCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2hjaTEzOTRfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFvaGNpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyaWVkIHRvIHJlc3VtZSBub25leGlzdGluZyBob3N0XG4iLAorCQkgICAgICAgT0hDSTEzOTRfRFJJVkVSX05BTUUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlEQkdNU0coInJlc3VtZSBjYWxsZWQiKTsKKwogLyogUG93ZXJNYWMgcmVzdW1lIGNvZGUgY29tZXMgZmlyc3QgKi8KICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKIAotCQkvKiBSZS1lbmFibGUgMTM5NCAqLwotCQlvZl9ub2RlID0gcGNpX2RldmljZV90b19PRl9ub2RlIChwZGV2KTsKLQkJaWYgKG9mX25vZGUpCi0JCQlwbWFjX2NhbGxfZmVhdHVyZSAoUE1BQ19GVFJfMTM5NF9FTkFCTEUsIG9mX25vZGUsIDAsIDEpOworCQlpZiAob2ZuKQorCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9FTkFCTEUsIG9mbiwgMCwgMSk7CiAJfQogI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCXJldHVybiBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLX0KLQotc3RhdGljIGludCBvaGNpMTM5NF9wY2lfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0JZXJyID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLS8qIFBvd2VyTWFjIHN1c3BlbmQgY29kZSBjb21lcyBsYXN0ICovCi0jaWZkZWYgQ09ORklHX1BQQ19QTUFDCi0JaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKLQotCQkvKiBEaXNhYmxlIDEzOTQgKi8KLQkJb2Zfbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSAocGRldik7Ci0JCWlmIChvZl9ub2RlKQotCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9FTkFCTEUsIG9mX25vZGUsIDAsIDApOworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJUFJJTlQoS0VSTl9FUlIsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQgd2l0aCAlZCIsIGVycik7CisJCXJldHVybiBlcnI7CiAJfQotI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwotb3V0OgotCXJldHVybiBlcnI7CisKKwkvKiBTZWUgb2hjaTEzOTRfcGNpX3Byb2JlKCkgZm9yIGNvbW1lbnRzIG9uIHRoaXMgc2VxdWVuY2UgKi8KKwlvaGNpX3NvZnRfcmVzZXQob2hjaSk7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0hDQ29udHJvbFNldCwgT0hDSTEzOTRfSENDb250cm9sX0xQUyk7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50Q2xlYXIsIDB4ZmZmZmZmZmYpOworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRNYXNrQ2xlYXIsIDB4ZmZmZmZmZmYpOworCW1kZWxheSg1MCk7CisJb2hjaV9pbml0aWFsaXplKG9oY2kpOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jIGIvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKaW5kZXggMGE3NDEyZS4uZmJiN2YxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKQEAgLTE0MjgsMTAgKzE0MjgsOSBAQAogICAgICAgICAJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGkyY19hZGFwdGVyX2RhdGE7CiAKICAgICAgICAgCWVycm9yID0gLUVOT01FTTsKLQkJaTJjX2FkID0ga21hbGxvYyhzaXplb2YoKmkyY19hZCksIFNMQUJfS0VSTkVMKTsKKwkJaTJjX2FkID0ga21lbWR1cCgmYml0X29wcywgc2l6ZW9mKCppMmNfYWQpLCBHRlBfS0VSTkVMKTsKICAgICAgICAgCWlmICghaTJjX2FkKSBGQUlMKCJmYWlsZWQgdG8gYWxsb2NhdGUgSTJDIGFkYXB0ZXIgbWVtb3J5Iik7CiAKLQkJbWVtY3B5KGkyY19hZCwgJmJpdF9vcHMsIHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpKTsKICAgICAgICAgICAgICAgICBpMmNfYWRhcHRlcl9kYXRhID0gYml0X2RhdGE7CiAgICAgICAgICAgICAgICAgaTJjX2FkLT5hbGdvX2RhdGEgPSAmaTJjX2FkYXB0ZXJfZGF0YTsKICAgICAgICAgICAgICAgICBpMmNfYWRhcHRlcl9kYXRhLmRhdGEgPSBseW54OwpAQCAtMTQ4Niw3ICsxNDg1LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpMmNfYml0X2RlbF9idXMoaTJjX2FkKTsKKwkJCWkyY19kZWxfYWRhcHRlcihpMmNfYWQpOwogCQkJa2ZyZWUoaTJjX2FkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC1wcml2YXRlLmggYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQtcHJpdmF0ZS5oCmluZGV4IGM3NzMxZDEuLjUwZGFhYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC1wcml2YXRlLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LXByaXZhdGUuaApAQCAtMjcsMTIgKzI3LDEyIEBACiAKICAgICAgICAgc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKIAotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHJlcV9wZW5kaW5nOwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHJlcV9jb21wbGV0ZTsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCByZXFfcGVuZGluZzsJLyogcHJvdGVjdGVkIGJ5IHJlcWxpc3RzX2xvY2sgKi8KKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCByZXFfY29tcGxldGU7CS8qIHByb3RlY3RlZCBieSByZXFsaXN0c19sb2NrICovCiAgICAgICAgIHNwaW5sb2NrX3QgcmVxbGlzdHNfbG9jazsKICAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9jb21wbGV0ZTsKIAotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGFkZHJfbGlzdDsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBhZGRyX2xpc3Q7CS8qIHByb3RlY3RlZCBieSBob3N0X2luZm9fbG9jayAqLwogCiAgICAgICAgIHU4IF9fdXNlciAqZmNwX2J1ZmZlcjsKIApAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICB1OCAgICAgY2xpZW50X3RyYW5zYWN0aW9uczsKICAgICAgICAgdTY0ICAgIHJlY3ZiOwogICAgICAgICB1MTYgICAgcmVjX2xlbmd0aDsKLSAgICAgICAgdTggICAgICphZGRyX3NwYWNlX2J1ZmZlcjsgLyogYWNjZXNzZWQgYnkgcmVhZC93cml0ZS9sb2NrICovCisgICAgICAgIHU4ICAgICAqYWRkcl9zcGFjZV9idWZmZXI7IC8qIGFjY2Vzc2VkIGJ5IHJlYWQvd3JpdGUvbG9jayByZXF1ZXN0cyAqLwogfTsKIAogc3RydWN0IHBlbmRpbmdfcmVxdWVzdCB7CkBAIC03OSw3ICs3OSw3IEBACiBzdHJ1Y3QgaG9zdF9pbmZvIHsKICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogICAgICAgICBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OwotICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVfaW5mb19saXN0OworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVfaW5mb19saXN0OyAgLyogcHJvdGVjdGVkIGJ5IGhvc3RfaW5mb19sb2NrICovCiB9OwogCiAjZW5kaWYgIC8qIElFRUUxMzk0X1JBVzEzOTRfUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCmluZGV4IDVlYzRmNWUuLmFkMjEwOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCkBAIC05OSw2ICs5OSwyMSBAQAogCiBzdGF0aWMgdm9pZCBxdWV1ZV9jb21wbGV0ZV9jYihzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEpOwogCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KK3N0YXRpYyB2b2lkIHByaW50X29sZF9pc29fZGVwcmVjYXRpb24odm9pZCkKK3sKKwlzdGF0aWMgcGlkX3QgcDsKKworCWlmIChwID09IGN1cnJlbnQtPnBpZCkKKwkJcmV0dXJuOworCXAgPSBjdXJyZW50LT5waWQ7CisJcHJpbnRrKEtFUk5fV0FSTklORyAicmF3MTM5NDogV0FSTklORyAtIFByb2dyYW0gXCIlc1wiIHVzZXMgdW5zdXBwb3J0ZWQiCisJICAgICAgICIgaXNvY2hyb25vdXMgcmVxdWVzdCB0eXBlcyB3aGljaCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBuZXh0IgorCSAgICAgICAiIGtlcm5lbCByZWxlYXNlXG4iLCBjdXJyZW50LT5jb21tKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJyYXcxMzk0OiBVcGRhdGUgeW91ciBzb2Z0d2FyZSB0byB1c2UgbGlicmF3MTM5NCdzIgorCSAgICAgICAiIG5ld2VyIGludGVyZmFjZVxuIik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChnZnBfdCBmbGFncykKIHsKIAlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXE7CkBAIC0xMTIsNyArMTI3LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICphbGxvY19wZW5kaW5nX3JlcXVlc3Qodm9pZCkKIHsKLQlyZXR1cm4gX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoU0xBQl9LRVJORUwpOworCXJldHVybiBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChHRlBfS0VSTkVMKTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9wZW5kaW5nX3JlcXVlc3Qoc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQpAQCAtMjU5LDcgKzI3NCw3IEBACiAJaWYgKGhpICE9IE5VTEwpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShmaSwgJmhpLT5maWxlX2luZm9fbGlzdCwgbGlzdCkgewogCQkJaWYgKGZpLT5ub3RpZmljYXRpb24gPT0gUkFXMTM5NF9OT1RJRllfT04pIHsKLQkJCQlyZXEgPSBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChTTEFCX0FUT01JQyk7CisJCQkJcmVxID0gX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoR0ZQX0FUT01JQyk7CiAKIAkJCQlpZiAocmVxICE9IE5VTEwpIHsKIAkJCQkJcmVxLT5maWxlX2luZm8gPSBmaTsKQEAgLTMwNiwxMyArMzIxLDEzIEBACiAJCQlpZiAoIShmaS0+bGlzdGVuX2NoYW5uZWxzICYgKDFVTEwgPDwgY2hhbm5lbCkpKQogCQkJCWNvbnRpbnVlOwogCi0JCQlyZXEgPSBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChTTEFCX0FUT01JQyk7CisJCQlyZXEgPSBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChHRlBfQVRPTUlDKTsKIAkJCWlmICghcmVxKQogCQkJCWJyZWFrOwogCiAJCQlpZiAoIWlicykgewogCQkJCWlicyA9IGttYWxsb2Moc2l6ZW9mKCppYnMpICsgbGVuZ3RoLAotCQkJCQkgICAgICBTTEFCX0FUT01JQyk7CisJCQkJCSAgICAgIEdGUF9BVE9NSUMpOwogCQkJCWlmICghaWJzKSB7CiAJCQkJCWtmcmVlKHJlcSk7CiAJCQkJCWJyZWFrOwpAQCAtMzY3LDEzICszODIsMTMgQEAKIAkJCWlmICghZmktPmZjcF9idWZmZXIpCiAJCQkJY29udGludWU7CiAKLQkJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KFNMQUJfQVRPTUlDKTsKKwkJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KEdGUF9BVE9NSUMpOwogCQkJaWYgKCFyZXEpCiAJCQkJYnJlYWs7CiAKIAkJCWlmICghaWJzKSB7CiAJCQkJaWJzID0ga21hbGxvYyhzaXplb2YoKmlicykgKyBsZW5ndGgsCi0JCQkJCSAgICAgIFNMQUJfQVRPTUlDKTsKKwkJCQkJICAgICAgR0ZQX0FUT01JQyk7CiAJCQkJaWYgKCFpYnMpIHsKIAkJCQkJa2ZyZWUocmVxKTsKIAkJCQkJYnJlYWs7CkBAIC01OTMsNyArNjA4LDcgQEAKIAlzd2l0Y2ggKHJlcS0+cmVxLnR5cGUpIHsKIAljYXNlIFJBVzEzOTRfUkVRX0xJU1RfQ0FSRFM6CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOwotCQlraGwgPSBrbWFsbG9jKHNpemVvZigqa2hsKSAqIGhvc3RfY291bnQsIFNMQUJfQVRPTUlDKTsKKwkJa2hsID0ga21hbGxvYyhzaXplb2YoKmtobCkgKiBob3N0X2NvdW50LCBHRlBfQVRPTUlDKTsKIAogCQlpZiAoa2hsKSB7CiAJCQlyZXEtPnJlcS5taXNjID0gaG9zdF9jb3VudDsKQEAgLTEwNDUsNyArMTA2MCw3IEBACiAJfQogCWlmIChhcm1fYWRkci0+bm90aWZpY2F0aW9uX29wdGlvbnMgJiBBUk1fUkVBRCkgewogCQlEQkdNU0coImFybV9yZWFkIC0+IGVudGVyaW5nIG5vdGlmaWNhdGlvbi1zZWN0aW9uIik7Ci0JCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KFNMQUJfQVRPTUlDKTsKKwkJcmVxID0gX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoR0ZQX0FUT01JQyk7CiAJCWlmICghcmVxKSB7CiAJCQlEQkdNU0coImFybV9yZWFkIC0+IHJjb2RlX2NvbmZsaWN0X2Vycm9yIik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X2luZm9fbG9jaywgaXJxZmxhZ3MpOwpAQCAtMTA2NCw3ICsxMDc5LDcgQEAKIAkJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXNwb25zZSkgKwogCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UpOwogCQl9Ci0JCXJlcS0+ZGF0YSA9IGttYWxsb2Moc2l6ZSwgU0xBQl9BVE9NSUMpOworCQlyZXEtPmRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwogCQlpZiAoIShyZXEtPmRhdGEpKSB7CiAJCQlmcmVlX3BlbmRpbmdfcmVxdWVzdChyZXEpOwogCQkJREJHTVNHKCJhcm1fcmVhZCAtPiByY29kZV9jb25mbGljdF9lcnJvciIpOwpAQCAtMTE5OCw3ICsxMjEzLDcgQEAKIAl9CiAJaWYgKGFybV9hZGRyLT5ub3RpZmljYXRpb25fb3B0aW9ucyAmIEFSTV9XUklURSkgewogCQlEQkdNU0coImFybV93cml0ZSAtPiBlbnRlcmluZyBub3RpZmljYXRpb24tc2VjdGlvbiIpOwotCQlyZXEgPSBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChTTEFCX0FUT01JQyk7CisJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KEdGUF9BVE9NSUMpOwogCQlpZiAoIXJlcSkgewogCQkJREJHTVNHKCJhcm1fd3JpdGUgLT4gcmNvZGVfY29uZmxpY3RfZXJyb3IiKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBpcnFmbGFncyk7CkBAIC0xMjA5LDcgKzEyMjQsNyBAQAogCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkgKyBzaXplb2Yoc3RydWN0IGFybV9yZXNwb25zZSkgKwogCQkgICAgKGxlbmd0aCkgKiBzaXplb2YoYnl0ZV90KSArCiAJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlKTsKLQkJcmVxLT5kYXRhID0ga21hbGxvYyhzaXplLCBTTEFCX0FUT01JQyk7CisJCXJlcS0+ZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJCWlmICghKHJlcS0+ZGF0YSkpIHsKIAkJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CiAJCQlEQkdNU0coImFybV93cml0ZSAtPiByY29kZV9jb25mbGljdF9lcnJvciIpOwpAQCAtMTQwMCw3ICsxNDE1LDcgQEAKIAlpZiAoYXJtX2FkZHItPm5vdGlmaWNhdGlvbl9vcHRpb25zICYgQVJNX0xPQ0spIHsKIAkJYnl0ZV90ICpidWYxLCAqYnVmMjsKIAkJREJHTVNHKCJhcm1fbG9jayAtPiBlbnRlcmluZyBub3RpZmljYXRpb24tc2VjdGlvbiIpOwotCQlyZXEgPSBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChTTEFCX0FUT01JQyk7CisJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KEdGUF9BVE9NSUMpOwogCQlpZiAoIXJlcSkgewogCQkJREJHTVNHKCJhcm1fbG9jayAtPiByY29kZV9jb25mbGljdF9lcnJvciIpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGlycWZsYWdzKTsKQEAgLTE0MDgsNyArMTQyMyw3IEBACiAJCQkJCQkJICAgVGhlIHJlcXVlc3QgbWF5IGJlIHJldHJpZWQgKi8KIAkJfQogCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkgKyBzaXplb2Yoc3RydWN0IGFybV9yZXNwb25zZSkgKyAzICogc2l6ZW9mKCpzdG9yZSkgKyBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlKTsJLyogbWF4aW11bSAqLwotCQlyZXEtPmRhdGEgPSBrbWFsbG9jKHNpemUsIFNMQUJfQVRPTUlDKTsKKwkJcmVxLT5kYXRhID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCEocmVxLT5kYXRhKSkgewogCQkJZnJlZV9wZW5kaW5nX3JlcXVlc3QocmVxKTsKIAkJCURCR01TRygiYXJtX2xvY2sgLT4gcmNvZGVfY29uZmxpY3RfZXJyb3IiKTsKQEAgLTE2MjgsNyArMTY0Myw3IEBACiAJaWYgKGFybV9hZGRyLT5ub3RpZmljYXRpb25fb3B0aW9ucyAmIEFSTV9MT0NLKSB7CiAJCWJ5dGVfdCAqYnVmMSwgKmJ1ZjI7CiAJCURCR01TRygiYXJtX2xvY2s2NCAtPiBlbnRlcmluZyBub3RpZmljYXRpb24tc2VjdGlvbiIpOwotCQlyZXEgPSBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChTTEFCX0FUT01JQyk7CisJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KEdGUF9BVE9NSUMpOwogCQlpZiAoIXJlcSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGlycWZsYWdzKTsKIAkJCURCR01TRygiYXJtX2xvY2s2NCAtPiByY29kZV9jb25mbGljdF9lcnJvciIpOwpAQCAtMTYzNiw3ICsxNjUxLDcgQEAKIAkJCQkJCQkgICBUaGUgcmVxdWVzdCBtYXkgYmUgcmV0cmllZCAqLwogCQl9CiAJCXNpemUgPSBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0KSArIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKSArIDMgKiBzaXplb2YoKnN0b3JlKSArIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UpOwkvKiBtYXhpbXVtICovCi0JCXJlcS0+ZGF0YSA9IGttYWxsb2Moc2l6ZSwgU0xBQl9BVE9NSUMpOworCQlyZXEtPmRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwogCQlpZiAoIShyZXEtPmRhdGEpKSB7CiAJCQlmcmVlX3BlbmRpbmdfcmVxdWVzdChyZXEpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGlycWZsYWdzKTsKQEAgLTE3MzcsNyArMTc1Miw3IEBACiAJCXJldHVybiAoLUVJTlZBTCk7CiAJfQogCS8qIGFkZHItbGlzdC1lbnRyeSBmb3IgZmlsZWluZm8gKi8KLQlhZGRyID0ga21hbGxvYyhzaXplb2YoKmFkZHIpLCBTTEFCX0tFUk5FTCk7CisJYWRkciA9IGttYWxsb2Moc2l6ZW9mKCphZGRyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhZGRyKSB7CiAJCXJlcS0+cmVxLmxlbmd0aCA9IDA7CiAJCXJldHVybiAoLUVOT01FTSk7CkBAIC0yMTAzLDcgKzIxMTgsNyBAQAogc3RhdGljIGludCBnZXRfY29uZmlnX3JvbShzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQogewogCWludCByZXQgPSBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7Ci0JcXVhZGxldF90ICpkYXRhID0ga21hbGxvYyhyZXEtPnJlcS5sZW5ndGgsIFNMQUJfS0VSTkVMKTsKKwlxdWFkbGV0X3QgKmRhdGEgPSBrbWFsbG9jKHJlcS0+cmVxLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJaW50IHN0YXR1czsKIAogCWlmICghZGF0YSkKQEAgLTIxMzMsNyArMjE0OCw3IEBACiBzdGF0aWMgaW50IHVwZGF0ZV9jb25maWdfcm9tKHN0cnVjdCBmaWxlX2luZm8gKmZpLCBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEpCiB7CiAJaW50IHJldCA9IHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKLQlxdWFkbGV0X3QgKmRhdGEgPSBrbWFsbG9jKHJlcS0+cmVxLmxlbmd0aCwgU0xBQl9LRVJORUwpOworCXF1YWRsZXRfdCAqZGF0YSA9IGttYWxsb2MocmVxLT5yZXEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBpbnQycHRyKHJlcS0+cmVxLnNlbmRiKSwgcmVxLT5yZXEubGVuZ3RoKSkgewpAQCAtMjI5Miw2ICsyMzA3LDcgQEAKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKIAogCWNhc2UgUkFXMTM5NF9SRVFfSVNPX1NFTkQ6CisJCXByaW50X29sZF9pc29fZGVwcmVjYXRpb24oKTsKIAkJcmV0dXJuIGhhbmRsZV9pc29fc2VuZChmaSwgcmVxLCBub2RlKTsKIAogCWNhc2UgUkFXMTM5NF9SRVFfQVJNX1JFR0lTVEVSOgpAQCAtMjMxMCw2ICsyMzI2LDcgQEAKIAkJcmV0dXJuIHJlc2V0X25vdGlmaWNhdGlvbihmaSwgcmVxKTsKIAogCWNhc2UgUkFXMTM5NF9SRVFfSVNPX0xJU1RFTjoKKwkJcHJpbnRfb2xkX2lzb19kZXByZWNhdGlvbigpOwogCQloYW5kbGVfaXNvX2xpc3RlbihmaSwgcmVxKTsKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKIApAQCAtMjQ0Myw3ICsyNDYwLDcgQEAKIAkvKiBvbmx5IG9uZSBJU08gYWN0aXZpdHkgZXZlbnQgbWF5IGJlIGluIHRoZSBxdWV1ZSAqLwogCWlmICghX19yYXdpc29fZXZlbnRfaW5fcXVldWUoZmkpKSB7CiAJCXN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSA9Ci0JCSAgICBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChTTEFCX0FUT01JQyk7CisJCSAgICBfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChHRlBfQVRPTUlDKTsKIAogCQlpZiAocmVxKSB7CiAJCQlyZXEtPmZpbGVfaW5mbyA9IGZpOwpAQCAtMjc3OSw3ICsyNzk2LDcgQEAKIHsKIAlzdHJ1Y3QgZmlsZV9pbmZvICpmaTsKIAotCWZpID0ga3phbGxvYyhzaXplb2YoKmZpKSwgU0xBQl9LRVJORUwpOworCWZpID0ga3phbGxvYyhzaXplb2YoKmZpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTI5NzAsMTIgKzI5ODcsOCBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShpZWVlMTM5NCwgcmF3MTM5NF9pZF90YWJsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIgcmF3MTM5NF9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAicmF3MTM5NCBEcml2ZXIiLAorCS5uYW1lID0gInJhdzEzOTQiLAogCS5pZF90YWJsZSA9IHJhdzEzOTRfaWRfdGFibGUsCi0JLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSAicmF3MTM5NCIsCi0JCSAgIC5idXMgPSAmaWVlZTEzOTRfYnVzX3R5cGUsCi0JCSAgIH0sCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwppbmRleCA2OTg2YWMxLi5lNjhiODBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3NicDIuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwpAQCAtMjksMTMgKzI5LDI2IEBACiAgKiBkcml2ZXIuIEl0IGFsc28gcmVnaXN0ZXJzIGFzIGEgU0NTSSBsb3dlci1sZXZlbCBkcml2ZXIgaW4gb3JkZXIgdG8gYWNjZXB0CiAgKiBTQ1NJIGNvbW1hbmRzIGZvciB0cmFuc3BvcnQgdXNpbmcgU0JQLTIuCiAgKgotICogWW91IG1heSBhY2Nlc3MgYW55IGF0dGFjaGVkIFNCUC0yIHN0b3JhZ2UgZGV2aWNlcyBhcyBpZiB0aGV5IHdlcmUgU0NTSQotICogZGV2aWNlcyAoZS5nLiBtb3VudCAvZGV2L3NkYTEsICBmZGlzaywgbWtmcywgZXRjLikuCisgKiBZb3UgbWF5IGFjY2VzcyBhbnkgYXR0YWNoZWQgU0JQLTIgKHVzdWFsbHkgc3RvcmFnZSBkZXZpY2VzKSBhcyByZWd1bGFyCisgKiBTQ1NJIGRldmljZXMuIEUuZy4gbW91bnQgL2Rldi9zZGExLCBmZGlzaywgbWtmcywgZXRjLi4KICAqCi0gKiBDdXJyZW50IElzc3VlczoKKyAqIFNlZSBodHRwOi8vd3d3LnQxMC5vcmcvZHJhZnRzLmh0bSNzYnAyIGZvciB0aGUgZmluYWwgZHJhZnQgb2YgdGhlIFNCUC0yCisgKiBzcGVjaWZpY2F0aW9uIGFuZCBmb3Igd2hlcmUgdG8gcHVyY2hhc2UgdGhlIG9mZmljaWFsIHN0YW5kYXJkLgogICoKLSAqCS0gRXJyb3IgSGFuZGxpbmc6IFNDU0kgYWJvcnRzIGFuZCBidXMgcmVzZXQgcmVxdWVzdHMgYXJlIGhhbmRsZWQgc29tZXdoYXQKLSAqCSAgYnV0IHRoZSBjb2RlIG5lZWRzIGFkZGl0aW9uYWwgZGVidWdnaW5nLgorICogVE9ETzoKKyAqICAgLSBsb29rIGludG8gcG9zc2libGUgaW1wcm92ZW1lbnRzIG9mIHRoZSBTQ1NJIGVycm9yIGhhbmRsZXJzCisgKiAgIC0gaGFuZGxlIFVuaXRfQ2hhcmFjdGVyaXN0aWNzLm1ndF9PUkJfdGltZW91dCBhbmQgLk9SQl9zaXplCisgKiAgIC0gaGFuZGxlIExvZ2ljYWxfVW5pdF9OdW1iZXIub3JkZXJlZAorICogICAtIGhhbmRsZSBzcmMgPT0gMSBpbiBzdGF0dXMgYmxvY2tzCisgKiAgIC0gcmVpbXBsZW1lbnQgdGhlIERNQSBtYXBwaW5nIGluIGFic2VuY2Ugb2YgcGh5c2ljYWwgRE1BIHNvIHRoYXQKKyAqICAgICBidXNfdG9fdmlydCBpcyBubyBsb25nZXIgcmVxdWlyZWQKKyAqICAgLSBkZWJ1ZyB0aGUgaGFuZGxpbmcgb2YgYWJzZW50IHBoeXNpY2FsIERNQQorICogICAtIHJlcGxhY2UgQ09ORklHX0lFRUUxMzk0X1NCUDJfUEhZU19ETUEgYnkgYXV0b21hdGljIGRldGVjdGlvbgorICogICAgICh0aGlzIGlzIGVhc3kgYnV0IGRlcGVuZHMgb24gdGhlIHByZXZpb3VzIHR3byBUT0RPIGl0ZW1zKQorICogICAtIG1ha2UgdGhlIHBhcmFtZXRlciBzZXJpYWxpemVfaW8gY29uZmlndXJhYmxlIHBlciBkZXZpY2UKKyAqICAgLSBtb3ZlIGFsbCByZXF1ZXN0cyB0byBmZXRjaCBhZ2VudCByZWdpc3RlcnMgaW50byBub24tYXRvbWljIGNvbnRleHQsCisgKiAgICAgcmVwbGFjZSBhbGwgdXNhZ2VzIG9mIHNicDJ1dGlsX25vZGVfd3JpdGVfbm9fd2FpdCBieSB0cnVlIHRyYW5zYWN0aW9ucworICogR3JlcCBmb3IgaW5saW5lIEZJWE1FIGNvbW1lbnRzIGJlbG93LgogICovCiAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTQ5LDcgKzYyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CkBAIC05OCwyMCArMTEwLDIwIEBACiAgKiAocHJvYmFibHkgZHVlIHRvIFBDSSBsYXRlbmN5L3Rocm91Z2hwdXQgaXNzdWVzIHdpdGggdGhlIHBhcnQpLiBZb3UgY2FuCiAgKiBidW1wIGRvd24gdGhlIHNwZWVkIGlmIHlvdSBhcmUgcnVubmluZyBpbnRvIHByb2JsZW1zLgogICovCi1zdGF0aWMgaW50IG1heF9zcGVlZCA9IElFRUUxMzk0X1NQRUVEX01BWDsKLW1vZHVsZV9wYXJhbShtYXhfc3BlZWQsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1heF9zcGVlZCwgIkZvcmNlIG1heCBzcGVlZCAoMyA9IDgwMG1iLCAyID0gNDAwbWIsIDEgPSAyMDBtYiwgMCA9IDEwMG1iKSIpOworc3RhdGljIGludCBzYnAyX21heF9zcGVlZCA9IElFRUUxMzk0X1NQRUVEX01BWDsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfc3BlZWQsIHNicDJfbWF4X3NwZWVkLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc3BlZWQsICJGb3JjZSBtYXggc3BlZWQgIgorCQkgIigzID0gODAwTWIvcywgMiA9IDQwME1iL3MsIDEgPSAyMDBNYi9zLCAwID0gMTAwTWIvcykiKTsKIAogLyoKICAqIFNldCBzZXJpYWxpemVfaW8gdG8gMSBpZiB5b3UnZCBsaWtlIG9ubHkgb25lIHNjc2kgY29tbWFuZCBzZW50CiAgKiBkb3duIHRvIHVzIGF0IGEgdGltZSAoZGVidWdnaW5nKS4gVGhpcyBtaWdodCBiZSBuZWNlc3NhcnkgZm9yIHZlcnkKICAqIGJhZGx5IGJlaGF2ZWQgc2JwMiBkZXZpY2VzLgotICoKLSAqIFRPRE86IE1ha2UgdGhpcyBjb25maWd1cmFibGUgcGVyIGRldmljZS4KICAqLwotc3RhdGljIGludCBzZXJpYWxpemVfaW8gPSAxOwotbW9kdWxlX3BhcmFtKHNlcmlhbGl6ZV9pbywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc2VyaWFsaXplX2lvLCAiU2VyaWFsaXplIEkvTyBjb21pbmcgZnJvbSBzY3NpIGRyaXZlcnMgKGRlZmF1bHQgPSAxLCBmYXN0ZXIgPSAwKSIpOworc3RhdGljIGludCBzYnAyX3NlcmlhbGl6ZV9pbyA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoc2VyaWFsaXplX2lvLCBzYnAyX3NlcmlhbGl6ZV9pbywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2VyaWFsaXplX2lvLCAiU2VyaWFsaXplIEkvTyBjb21pbmcgZnJvbSBzY3NpIGRyaXZlcnMgIgorCQkgIihkZWZhdWx0ID0gMSwgZmFzdGVyID0gMCkiKTsKIAogLyoKICAqIEJ1bXAgdXAgbWF4X3NlY3RvcnMgaWYgeW91J2QgbGlrZSB0byBzdXBwb3J0IHZlcnkgbGFyZ2Ugc2l6ZWQKQEAgLTEyMSwxMCArMTMzLDEwIEBACiAgKiB0aGUgT3hzZW1pIHNicDIgY2hpcHNldHMgaGF2ZSBubyBwcm9ibGVtcyBzdXBwb3J0aW5nIHZlcnkgbGFyZ2UKICAqIHRyYW5zZmVyIHNpemVzLgogICovCi1zdGF0aWMgaW50IG1heF9zZWN0b3JzID0gU0JQMl9NQVhfU0VDVE9SUzsKLW1vZHVsZV9wYXJhbShtYXhfc2VjdG9ycywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobWF4X3NlY3RvcnMsICJDaGFuZ2UgbWF4IHNlY3RvcnMgcGVyIEkvTyBzdXBwb3J0ZWQgKGRlZmF1bHQgPSAiCi0JCSBfX3N0cmluZ2lmeShTQlAyX01BWF9TRUNUT1JTKSAiKSIpOworc3RhdGljIGludCBzYnAyX21heF9zZWN0b3JzID0gU0JQMl9NQVhfU0VDVE9SUzsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfc2VjdG9ycywgc2JwMl9tYXhfc2VjdG9ycywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3NlY3RvcnMsICJDaGFuZ2UgbWF4IHNlY3RvcnMgcGVyIEkvTyBzdXBwb3J0ZWQgIgorCQkgIihkZWZhdWx0ID0gIiBfX3N0cmluZ2lmeShTQlAyX01BWF9TRUNUT1JTKSAiKSIpOwogCiAvKgogICogRXhjbHVzaXZlIGxvZ2luIHRvIHNicDIgZGV2aWNlPyBJbiBtb3N0IGNhc2VzLCB0aGUgc2JwMiBkcml2ZXIgc2hvdWxkCkBAIC0xMzksOSArMTUxLDEwIEBACiAgKiBjb25jdXJyZW50IGxvZ2lucy4gRGVwZW5kaW5nIG9uIGZpcm13YXJlLCBmb3VyIG9yIHR3byBjb25jdXJyZW50IGxvZ2lucwogICogYXJlIHBvc3NpYmxlIG9uIE9YRlc5MTEgYW5kIG5ld2VyIE94c2VtaSBicmlkZ2VzLgogICovCi1zdGF0aWMgaW50IGV4Y2x1c2l2ZV9sb2dpbiA9IDE7Ci1tb2R1bGVfcGFyYW0oZXhjbHVzaXZlX2xvZ2luLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhleGNsdXNpdmVfbG9naW4sICJFeGNsdXNpdmUgbG9naW4gdG8gc2JwMiBkZXZpY2UgKGRlZmF1bHQgPSAxKSIpOworc3RhdGljIGludCBzYnAyX2V4Y2x1c2l2ZV9sb2dpbiA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoZXhjbHVzaXZlX2xvZ2luLCBzYnAyX2V4Y2x1c2l2ZV9sb2dpbiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXhjbHVzaXZlX2xvZ2luLCAiRXhjbHVzaXZlIGxvZ2luIHRvIHNicDIgZGV2aWNlICIKKwkJICIoZGVmYXVsdCA9IDEpIik7CiAKIC8qCiAgKiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kcyBpcyByZXF1aXJlZCBmb3IgeW91ciBkZXZpY2UgdG8gd29yaywKQEAgLTE3OSwxMjMgKzE5MiwxMjMgQEAKIAkiLCBvdmVycmlkZSBpbnRlcm5hbCBibGFja2xpc3QgPSAiIF9fc3RyaW5naWZ5KFNCUDJfV09SS0FST1VORF9PVkVSUklERSkKIAkiLCBvciBhIGNvbWJpbmF0aW9uKSIpOwogCi0vKgotICogRXhwb3J0IGluZm9ybWF0aW9uIGFib3V0IHByb3RvY29scy9kZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KLSAqLwotc3RhdGljIHN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQgc2JwMl9pZF90YWJsZVtdID0gewotCXsKLQkgLm1hdGNoX2ZsYWdzID0gSUVFRTEzOTRfTUFUQ0hfU1BFQ0lGSUVSX0lEIHwgSUVFRTEzOTRfTUFUQ0hfVkVSU0lPTiwKLQkgLnNwZWNpZmllcl9pZCA9IFNCUDJfVU5JVF9TUEVDX0lEX0VOVFJZICYgMHhmZmZmZmYsCi0JIC52ZXJzaW9uID0gU0JQMl9TV19WRVJTSU9OX0VOVFJZICYgMHhmZmZmZmZ9LAotCXt9Ci19OwogCi1NT0RVTEVfREVWSUNFX1RBQkxFKGllZWUxMzk0LCBzYnAyX2lkX3RhYmxlKTsKLQotLyoKLSAqIERlYnVnIGxldmVscywgY29uZmlndXJlZCB2aWEga2VybmVsIGNvbmZpZywgb3IgZW5hYmxlIGhlcmUuCi0gKi8KLQotI2RlZmluZSBDT05GSUdfSUVFRTEzOTRfU0JQMl9ERUJVRyAwCi0vKiAjZGVmaW5lIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHX09SQlMgKi8KLS8qICNkZWZpbmUgQ09ORklHX0lFRUUxMzk0X1NCUDJfREVCVUdfRE1BICovCi0vKiAjZGVmaW5lIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHIDEgKi8KLS8qICNkZWZpbmUgQ09ORklHX0lFRUUxMzk0X1NCUDJfREVCVUcgMiAqLwotLyogI2RlZmluZSBDT05GSUdfSUVFRTEzOTRfU0JQMl9QQUNLRVRfRFVNUCAqLwotCi0jaWZkZWYgQ09ORklHX0lFRUUxMzk0X1NCUDJfREVCVUdfT1JCUwotI2RlZmluZSBTQlAyX09SQl9ERUJVRyhmbXQsIGFyZ3MuLi4pCUhQU0JfRVJSKCJzYnAyKCVzKTogImZtdCwgX19GVU5DVElPTl9fLCAjIyBhcmdzKQotc3RhdGljIHUzMiBnbG9iYWxfb3V0c3RhbmRpbmdfY29tbWFuZF9vcmJzID0gMDsKLSNkZWZpbmUgb3V0c3RhbmRpbmdfb3JiX2luY3IgZ2xvYmFsX291dHN0YW5kaW5nX2NvbW1hbmRfb3JicysrCi0jZGVmaW5lIG91dHN0YW5kaW5nX29yYl9kZWNyIGdsb2JhbF9vdXRzdGFuZGluZ19jb21tYW5kX29yYnMtLQotI2Vsc2UKLSNkZWZpbmUgU0JQMl9PUkJfREVCVUcoZm10LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgb3V0c3RhbmRpbmdfb3JiX2luY3IJCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBvdXRzdGFuZGluZ19vcmJfZGVjcgkJZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHX0RNQQotI2RlZmluZSBTQlAyX0RNQV9BTExPQyhmbXQsIGFyZ3MuLi4pIFwKLQlIUFNCX0VSUigic2JwMiglcylhbGxvYyglZCk6ICJmbXQsIF9fRlVOQ1RJT05fXywgXAotCQkgKytnbG9iYWxfb3V0c3RhbmRpbmdfZG1hcywgIyMgYXJncykKLSNkZWZpbmUgU0JQMl9ETUFfRlJFRShmbXQsIGFyZ3MuLi4pIFwKLQlIUFNCX0VSUigic2JwMiglcylmcmVlKCVkKTogImZtdCwgX19GVU5DVElPTl9fLCBcCi0JCSAtLWdsb2JhbF9vdXRzdGFuZGluZ19kbWFzLCAjIyBhcmdzKQotc3RhdGljIHUzMiBnbG9iYWxfb3V0c3RhbmRpbmdfZG1hcyA9IDA7Ci0jZWxzZQotI2RlZmluZSBTQlAyX0RNQV9BTExPQyhmbXQsIGFyZ3MuLi4pCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBTQlAyX0RNQV9GUkVFKGZtdCwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHID49IDIKLSNkZWZpbmUgU0JQMl9ERUJVRyhmbXQsIGFyZ3MuLi4pCUhQU0JfRVJSKCJzYnAyOiAiZm10LCAjIyBhcmdzKQotI2RlZmluZSBTQlAyX0lORk8oZm10LCBhcmdzLi4uKQkJSFBTQl9FUlIoInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIFNCUDJfTk9USUNFKGZtdCwgYXJncy4uLikJSFBTQl9FUlIoInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIFNCUDJfV0FSTihmbXQsIGFyZ3MuLi4pCQlIUFNCX0VSUigic2JwMjogImZtdCwgIyMgYXJncykKLSNlbGlmIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHID09IDEKLSNkZWZpbmUgU0JQMl9ERUJVRyhmbXQsIGFyZ3MuLi4pCUhQU0JfREVCVUcoInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIFNCUDJfSU5GTyhmbXQsIGFyZ3MuLi4pCQlIUFNCX0lORk8oInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIFNCUDJfTk9USUNFKGZtdCwgYXJncy4uLikJSFBTQl9OT1RJQ0UoInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIFNCUDJfV0FSTihmbXQsIGFyZ3MuLi4pCQlIUFNCX1dBUk4oInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBTQlAyX0RFQlVHKGZtdCwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIFNCUDJfSU5GTyhmbXQsIGFyZ3MuLi4pCQlIUFNCX0lORk8oInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIFNCUDJfTk9USUNFKGZtdCwgYXJncy4uLikgICAgICAgSFBTQl9OT1RJQ0UoInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIFNCUDJfV0FSTihmbXQsIGFyZ3MuLi4pICAgICAgICAgSFBTQl9XQVJOKCJzYnAyOiAiZm10LCAjIyBhcmdzKQotI2VuZGlmCi0KLSNkZWZpbmUgU0JQMl9FUlIoZm10LCBhcmdzLi4uKQkJSFBTQl9FUlIoInNicDI6ICJmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIFNCUDJfREVCVUdfRU5URVIoKQkJU0JQMl9ERUJVRygiJXMiLCBfX0ZVTkNUSU9OX18pCisjZGVmaW5lIFNCUDJfSU5GTyhmbXQsIGFyZ3MuLi4pCUhQU0JfSU5GTygic2JwMjogImZtdCwgIyMgYXJncykKKyNkZWZpbmUgU0JQMl9FUlIoZm10LCBhcmdzLi4uKQlIUFNCX0VSUigic2JwMjogImZtdCwgIyMgYXJncykKIAogLyoKICAqIEdsb2JhbHMKICAqLworc3RhdGljIHZvaWQgc2JwMnNjc2lfY29tcGxldGVfYWxsX2NvbW1hbmRzKHN0cnVjdCBzYnAyX2x1ICosIHUzMik7CitzdGF0aWMgdm9pZCBzYnAyc2NzaV9jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCBzYnAyX2x1ICosIHUzMiwgc3RydWN0IHNjc2lfY21uZCAqLAorCQkJCSAgICAgIHZvaWQgKCopKHN0cnVjdCBzY3NpX2NtbmQgKikpOworc3RhdGljIHN0cnVjdCBzYnAyX2x1ICpzYnAyX2FsbG9jX2RldmljZShzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKik7CitzdGF0aWMgaW50IHNicDJfc3RhcnRfZGV2aWNlKHN0cnVjdCBzYnAyX2x1ICopOworc3RhdGljIHZvaWQgc2JwMl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzYnAyX2x1ICopOworc3RhdGljIGludCBzYnAyX2xvZ2luX2RldmljZShzdHJ1Y3Qgc2JwMl9sdSAqKTsKK3N0YXRpYyBpbnQgc2JwMl9yZWNvbm5lY3RfZGV2aWNlKHN0cnVjdCBzYnAyX2x1ICopOworc3RhdGljIGludCBzYnAyX2xvZ291dF9kZXZpY2Uoc3RydWN0IHNicDJfbHUgKik7CitzdGF0aWMgdm9pZCBzYnAyX2hvc3RfcmVzZXQoc3RydWN0IGhwc2JfaG9zdCAqKTsKK3N0YXRpYyBpbnQgc2JwMl9oYW5kbGVfc3RhdHVzX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKiwgaW50LCBpbnQsIHF1YWRsZXRfdCAqLAorCQkJCSAgICB1NjQsIHNpemVfdCwgdTE2KTsKK3N0YXRpYyBpbnQgc2JwMl9hZ2VudF9yZXNldChzdHJ1Y3Qgc2JwMl9sdSAqLCBpbnQpOworc3RhdGljIHZvaWQgc2JwMl9wYXJzZV91bml0X2RpcmVjdG9yeShzdHJ1Y3Qgc2JwMl9sdSAqLAorCQkJCSAgICAgIHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqKTsKK3N0YXRpYyBpbnQgc2JwMl9zZXRfYnVzeV90aW1lb3V0KHN0cnVjdCBzYnAyX2x1ICopOworc3RhdGljIGludCBzYnAyX21heF9zcGVlZF9hbmRfc2l6ZShzdHJ1Y3Qgc2JwMl9sdSAqKTsKIAotc3RhdGljIHZvaWQgc2JwMnNjc2lfY29tcGxldGVfYWxsX2NvbW1hbmRzKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCi0JCQkJCSAgIHUzMiBzdGF0dXMpOwotCi1zdGF0aWMgdm9pZCBzYnAyc2NzaV9jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCi0JCQkJICAgICAgdTMyIHNjc2lfc3RhdHVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKLQkJCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHNjc2lfZHJpdmVyX3RlbXBsYXRlOwogCiBzdGF0aWMgY29uc3QgdTggc2JwMl9zcGVlZHRvX21heF9wYXlsb2FkW10gPSB7IDB4NywgMHg4LCAweDksIDB4QSwgMHhCLCAweEMgfTsKIAotc3RhdGljIHZvaWQgc2JwMl9ob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwotCi1zdGF0aWMgaW50IHNicDJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgc2JwMl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgc2JwMl91cGRhdGUoc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZCk7Ci0KIHN0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgc2JwMl9oaWdobGV2ZWwgPSB7Ci0JLm5hbWUgPQkJU0JQMl9ERVZJQ0VfTkFNRSwKLQkuaG9zdF9yZXNldCA9CXNicDJfaG9zdF9yZXNldCwKKwkubmFtZQkJPSBTQlAyX0RFVklDRV9OQU1FLAorCS5ob3N0X3Jlc2V0CT0gc2JwMl9ob3N0X3Jlc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIHNicDJfb3BzID0gewotCS53cml0ZSA9IHNicDJfaGFuZGxlX3N0YXR1c193cml0ZQorCS53cml0ZQkJPSBzYnAyX2hhbmRsZV9zdGF0dXNfd3JpdGUKIH07CiAKICNpZmRlZiBDT05GSUdfSUVFRTEzOTRfU0JQMl9QSFlTX0RNQQorc3RhdGljIGludCBzYnAyX2hhbmRsZV9waHlzZG1hX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKiwgaW50LCBpbnQsIHF1YWRsZXRfdCAqLAorCQkJCSAgICAgdTY0LCBzaXplX3QsIHUxNik7CitzdGF0aWMgaW50IHNicDJfaGFuZGxlX3BoeXNkbWFfcmVhZChzdHJ1Y3QgaHBzYl9ob3N0ICosIGludCwgcXVhZGxldF90ICosIHU2NCwKKwkJCQkgICAgc2l6ZV90LCB1MTYpOworCiBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgc2JwMl9waHlzZG1hX29wcyA9IHsKLQkucmVhZCA9IHNicDJfaGFuZGxlX3BoeXNkbWFfcmVhZCwKLQkud3JpdGUgPSBzYnAyX2hhbmRsZV9waHlzZG1hX3dyaXRlLAorCS5yZWFkCQk9IHNicDJfaGFuZGxlX3BoeXNkbWFfcmVhZCwKKwkud3JpdGUJCT0gc2JwMl9oYW5kbGVfcGh5c2RtYV93cml0ZSwKIH07CiAjZW5kaWYKIAorCisvKgorICogSW50ZXJmYWNlIHRvIGRyaXZlciBjb3JlIGFuZCBJRUVFIDEzOTQgY29yZQorICovCitzdGF0aWMgc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCBzYnAyX2lkX3RhYmxlW10gPSB7CisJeworCSAubWF0Y2hfZmxhZ3MJPSBJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQgfCBJRUVFMTM5NF9NQVRDSF9WRVJTSU9OLAorCSAuc3BlY2lmaWVyX2lkCT0gU0JQMl9VTklUX1NQRUNfSURfRU5UUlkgJiAweGZmZmZmZiwKKwkgLnZlcnNpb24JPSBTQlAyX1NXX1ZFUlNJT05fRU5UUlkgJiAweGZmZmZmZn0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGllZWUxMzk0LCBzYnAyX2lkX3RhYmxlKTsKKworc3RhdGljIGludCBzYnAyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IHNicDJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKik7CitzdGF0aWMgaW50IHNicDJfdXBkYXRlKHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqKTsKKwogc3RhdGljIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciBzYnAyX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiU0JQMiBEcml2ZXIiLAorCS5uYW1lCQk9IFNCUDJfREVWSUNFX05BTUUsCiAJLmlkX3RhYmxlCT0gc2JwMl9pZF90YWJsZSwKIAkudXBkYXRlCQk9IHNicDJfdXBkYXRlLAogCS5kcml2ZXIJCT0gewotCQkubmFtZQkJPSBTQlAyX0RFVklDRV9OQU1FLAotCQkuYnVzCQk9ICZpZWVlMTM5NF9idXNfdHlwZSwKIAkJLnByb2JlCQk9IHNicDJfcHJvYmUsCiAJCS5yZW1vdmUJCT0gc2JwMl9yZW1vdmUsCiAJfSwKIH07CiAKKworLyoKKyAqIEludGVyZmFjZSB0byBTQ1NJIGNvcmUKKyAqLworc3RhdGljIGludCBzYnAyc2NzaV9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqLAorCQkJCSB2b2lkICgqKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBpbnQgc2JwMnNjc2lfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgc2JwMnNjc2lfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqKTsKK3N0YXRpYyBpbnQgc2JwMnNjc2lfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICopOworc3RhdGljIGludCBzYnAyc2NzaV9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICopOworc3RhdGljIHZvaWQgc2JwMnNjc2lfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CitzdGF0aWMgc3NpemVfdCBzYnAyX3N5c2ZzX2llZWUxMzk0X2lkX3Nob3coc3RydWN0IGRldmljZSAqLAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqLCBjaGFyICopOworCitzdGF0aWMgREVWSUNFX0FUVFIoaWVlZTEzOTRfaWQsIFNfSVJVR08sIHNicDJfc3lzZnNfaWVlZTEzOTRfaWRfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqc2JwMl9zeXNmc19zZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2llZWUxMzk0X2lkLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHNicDJfc2hvc3RfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCSA9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJID0gIlNCUC0yIElFRUUtMTM5NCIsCisJLnByb2NfbmFtZQkJID0gU0JQMl9ERVZJQ0VfTkFNRSwKKwkucXVldWVjb21tYW5kCQkgPSBzYnAyc2NzaV9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIJID0gc2JwMnNjc2lfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gc2JwMnNjc2lfcmVzZXQsCisJLnNsYXZlX2FsbG9jCQkgPSBzYnAyc2NzaV9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCSA9IHNicDJzY3NpX3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveQkJID0gc2JwMnNjc2lfc2xhdmVfZGVzdHJveSwKKwkudGhpc19pZAkJID0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJID0gU0dfQUxMLAorCS51c2VfY2x1c3RlcmluZwkJID0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmNtZF9wZXJfbHVuCQkgPSBTQlAyX01BWF9DTURTLAorCS5jYW5fcXVldWUJCSA9IFNCUDJfTUFYX0NNRFMsCisJLmVtdWxhdGVkCQkgPSAxLAorCS5zZGV2X2F0dHJzCQkgPSBzYnAyX3N5c2ZzX3NkZXZfYXR0cnMsCit9OworCisKIC8qCiAgKiBMaXN0IG9mIGRldmljZXMgd2l0aCBrbm93biBidWdzLgogICoKQEAgLTM2Myw4ICszNzYsNiBAQAogCiAJZm9yIChsZW5ndGggPSAobGVuZ3RoID4+IDIpOyBsZW5ndGgtLTsgKQogCQl0ZW1wW2xlbmd0aF0gPSBiZTMyX3RvX2NwdSh0ZW1wW2xlbmd0aF0pOwotCi0JcmV0dXJuOwogfQogCiAvKgpAQCAtMzc2LDggKzM4Nyw2IEBACiAKIAlmb3IgKGxlbmd0aCA9IChsZW5ndGggPj4gMik7IGxlbmd0aC0tOyApCiAJCXRlbXBbbGVuZ3RoXSA9IGNwdV90b19iZTMyKHRlbXBbbGVuZ3RoXSk7Ci0KLQlyZXR1cm47CiB9CiAjZWxzZSAvKiBCSUdfRU5ESUFOICovCiAvKiBXaHkgd2FzdGUgdGhlIGNwdSBjeWNsZXM/ICovCkBAIC0zODUsMzM5ICszOTQsMjQ2IEBACiAjZGVmaW5lIHNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcih4LHkpIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfSUVFRTEzOTRfU0JQMl9QQUNLRVRfRFVNUAotLyoKLSAqIERlYnVnIHBhY2tldCBkdW1wIHJvdXRpbmUuIExlbmd0aCBpcyBpbiBieXRlcy4KLSAqLwotc3RhdGljIHZvaWQgc2JwMnV0aWxfcGFja2V0X2R1bXAodm9pZCAqYnVmZmVyLCBpbnQgbGVuZ3RoLCBjaGFyICpkdW1wX25hbWUsCi0JCQkJIHUzMiBkdW1wX3BoeXNfYWRkcikKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyICpkdW1wID0gYnVmZmVyOwotCi0JaWYgKCFkdW1wIHx8ICFsZW5ndGggfHwgIWR1bXBfbmFtZSkKLQkJcmV0dXJuOwotCi0JaWYgKGR1bXBfcGh5c19hZGRyKQotCQlwcmludGsoIlslcywgMHgleF0iLCBkdW1wX25hbWUsIGR1bXBfcGh5c19hZGRyKTsKLQllbHNlCi0JCXByaW50aygiWyVzXSIsIGR1bXBfbmFtZSk7Ci0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpID4gMHgzZikgewotCQkJcHJpbnRrKCJcbiAgIC4uLiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKChpICYgMHgzKSA9PSAwKQotCQkJcHJpbnRrKCIgICIpOwotCQlpZiAoKGkgJiAweGYpID09IDApCi0JCQlwcmludGsoIlxuICAgIik7Ci0JCXByaW50aygiJTAyeCAiLCAoaW50KWR1bXBbaV0pOwotCX0KLQlwcmludGsoIlxuIik7Ci0KLQlyZXR1cm47Ci19Ci0jZWxzZQotI2RlZmluZSBzYnAydXRpbF9wYWNrZXRfZHVtcCh3LHgseSx6KSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYWNjZXNzX3dxKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChzYnAyX2FjY2Vzc193cSk7CiAKIC8qCiAgKiBXYWl0cyBmb3IgY29tcGxldGlvbiBvZiBhbiBTQlAtMiBhY2Nlc3MgcmVxdWVzdC4KICAqIFJldHVybnMgbm9uemVybyBpZiB0aW1lZCBvdXQgb3IgcHJlbWF0dXJlbHkgaW50ZXJydXB0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgc2JwMnV0aWxfYWNjZXNzX3RpbWVvdXQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwKLQkJCQkgICBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQgc2JwMnV0aWxfYWNjZXNzX3RpbWVvdXQoc3RydWN0IHNicDJfbHUgKmx1LCBpbnQgdGltZW91dCkKIHsKLQlsb25nIGxlZnRvdmVyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQkJYWNjZXNzX3dxLCBzY3NpX2lkLT5hY2Nlc3NfY29tcGxldGUsIHRpbWVvdXQpOworCWxvbmcgbGVmdG92ZXI7CiAKLQlzY3NpX2lkLT5hY2Nlc3NfY29tcGxldGUgPSAwOworCWxlZnRvdmVyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQlzYnAyX2FjY2Vzc193cSwgbHUtPmFjY2Vzc19jb21wbGV0ZSwgdGltZW91dCk7CisJbHUtPmFjY2Vzc19jb21wbGV0ZSA9IDA7CiAJcmV0dXJuIGxlZnRvdmVyIDw9IDA7CiB9CiAKLS8qIEZyZWVzIGFuIGFsbG9jYXRlZCBwYWNrZXQgKi8KLXN0YXRpYyB2b2lkIHNicDJfZnJlZV9wYWNrZXQoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpCitzdGF0aWMgdm9pZCBzYnAyX2ZyZWVfcGFja2V0KHZvaWQgKnBhY2tldCkKIHsKIAlocHNiX2ZyZWVfdGxhYmVsKHBhY2tldCk7CiAJaHBzYl9mcmVlX3BhY2tldChwYWNrZXQpOwogfQogCi0vKiBUaGlzIGlzIG11Y2ggbGlrZSBocHNiX25vZGVfd3JpdGUoKSwgZXhjZXB0IGl0IGlnbm9yZXMgdGhlIHJlc3BvbnNlCi0gKiBzdWJhY3Rpb24gYW5kIHJldHVybnMgaW1tZWRpYXRlbHkuIENhbiBiZSB1c2VkIGZyb20gaW50ZXJydXB0cy4KKy8qCisgKiBUaGlzIGlzIG11Y2ggbGlrZSBocHNiX25vZGVfd3JpdGUoKSwgZXhjZXB0IGl0IGlnbm9yZXMgdGhlIHJlc3BvbnNlCisgKiBzdWJhY3Rpb24gYW5kIHJldHVybnMgaW1tZWRpYXRlbHkuIENhbiBiZSB1c2VkIGZyb20gYXRvbWljIGNvbnRleHQuCiAgKi8KIHN0YXRpYyBpbnQgc2JwMnV0aWxfbm9kZV93cml0ZV9ub193YWl0KHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgdTY0IGFkZHIsCi0JCQkJICAgICAgIHF1YWRsZXRfdCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQorCQkJCSAgICAgICBxdWFkbGV0X3QgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKIAotCXBhY2tldCA9IGhwc2JfbWFrZV93cml0ZXBhY2tldChuZS0+aG9zdCwgbmUtPm5vZGVpZCwKLQkJCQkgICAgICAgYWRkciwgYnVmZmVyLCBsZW5ndGgpOworCXBhY2tldCA9IGhwc2JfbWFrZV93cml0ZXBhY2tldChuZS0+aG9zdCwgbmUtPm5vZGVpZCwgYWRkciwgYnVmLCBsZW4pOwogCWlmICghcGFja2V0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWhwc2Jfc2V0X3BhY2tldF9jb21wbGV0ZV90YXNrKHBhY2tldCwKLQkJCQkgICAgICAodm9pZCAoKikodm9pZCAqKSlzYnAyX2ZyZWVfcGFja2V0LAotCQkJCSAgICAgIHBhY2tldCk7Ci0KKwlocHNiX3NldF9wYWNrZXRfY29tcGxldGVfdGFzayhwYWNrZXQsIHNicDJfZnJlZV9wYWNrZXQsIHBhY2tldCk7CiAJaHBzYl9ub2RlX2ZpbGxfcGFja2V0KG5lLCBwYWNrZXQpOwotCiAJaWYgKGhwc2Jfc2VuZF9wYWNrZXQocGFja2V0KSA8IDApIHsKIAkJc2JwMl9mcmVlX3BhY2tldChwYWNrZXQpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2JwMnV0aWxfbm90aWZ5X2ZldGNoX2FnZW50KHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCi0JCQkJCXU2NCBvZmZzZXQsIHF1YWRsZXRfdCAqZGF0YSwgc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIHNicDJ1dGlsX25vdGlmeV9mZXRjaF9hZ2VudChzdHJ1Y3Qgc2JwMl9sdSAqbHUsIHU2NCBvZmZzZXQsCisJCQkJCXF1YWRsZXRfdCAqZGF0YSwgc2l6ZV90IGxlbikKIHsKLQkvKgotCSAqIFRoZXJlIGlzIGEgc21hbGwgd2luZG93IGFmdGVyIGEgYnVzIHJlc2V0IHdpdGhpbiB3aGljaCB0aGUgbm9kZQotCSAqIGVudHJ5J3MgZ2VuZXJhdGlvbiBpcyBjdXJyZW50IGJ1dCB0aGUgcmVjb25uZWN0IHdhc24ndCBjb21wbGV0ZWQuCi0JICovCi0JaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZzY3NpX2lkLT5zdGF0ZSkgPT0gU0JQMkxVX1NUQVRFX0lOX1JFU0VUKSkKKwkvKiBUaGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBhZnRlciBhIGJ1cyByZXNldCB3aXRoaW4gd2hpY2ggdGhlIG5vZGUKKwkgKiBlbnRyeSdzIGdlbmVyYXRpb24gaXMgY3VycmVudCBidXQgdGhlIHJlY29ubmVjdCB3YXNuJ3QgY29tcGxldGVkLiAqLworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmbHUtPnN0YXRlKSA9PSBTQlAyTFVfU1RBVEVfSU5fUkVTRVQpKQogCQlyZXR1cm47CiAKLQlpZiAoaHBzYl9ub2RlX3dyaXRlKHNjc2lfaWQtPm5lLAotCQkJICAgIHNjc2lfaWQtPnNicDJfY29tbWFuZF9ibG9ja19hZ2VudF9hZGRyICsgb2Zmc2V0LAorCWlmIChocHNiX25vZGVfd3JpdGUobHUtPm5lLCBsdS0+Y29tbWFuZF9ibG9ja19hZ2VudF9hZGRyICsgb2Zmc2V0LAogCQkJICAgIGRhdGEsIGxlbikpCiAJCVNCUDJfRVJSKCJzYnAydXRpbF9ub3RpZnlfZmV0Y2hfYWdlbnQgZmFpbGVkLiIpOwotCS8qCi0JICogTm93IGFjY2VwdCBuZXcgU0NTSSBjb21tYW5kcywgdW5sZXNzIGEgYnVzIHJlc2V0IGhhcHBlbmRlZCBkdXJpbmcKLQkgKiBocHNiX25vZGVfd3JpdGUuCi0JICovCi0JaWYgKGxpa2VseShhdG9taWNfcmVhZCgmc2NzaV9pZC0+c3RhdGUpICE9IFNCUDJMVV9TVEFURV9JTl9SRVNFVCkpCi0JCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhzY3NpX2lkLT5zY3NpX2hvc3QpOworCisJLyogTm93IGFjY2VwdCBuZXcgU0NTSSBjb21tYW5kcywgdW5sZXNzIGEgYnVzIHJlc2V0IGhhcHBlbmRlZCBkdXJpbmcKKwkgKiBocHNiX25vZGVfd3JpdGUuICovCisJaWYgKGxpa2VseShhdG9taWNfcmVhZCgmbHUtPnN0YXRlKSAhPSBTQlAyTFVfU1RBVEVfSU5fUkVTRVQpKQorCQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMobHUtPnNob3N0KTsKIH0KIAotc3RhdGljIHZvaWQgc2JwMnV0aWxfd3JpdGVfb3JiX3BvaW50ZXIodm9pZCAqcCkKK3N0YXRpYyB2b2lkIHNicDJ1dGlsX3dyaXRlX29yYl9wb2ludGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3Qgc2JwMl9sdSAqbHUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNicDJfbHUsIHByb3RvY29sX3dvcmspOwogCXF1YWRsZXRfdCBkYXRhWzJdOwogCi0JZGF0YVswXSA9IE9SQl9TRVRfTk9ERV9JRCgKLQkJCSgoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqKXApLT5oaS0+aG9zdC0+bm9kZV9pZCk7Ci0JZGF0YVsxXSA9ICgoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqKXApLT5sYXN0X29yYl9kbWE7CisJZGF0YVswXSA9IE9SQl9TRVRfTk9ERV9JRChsdS0+aGktPmhvc3QtPm5vZGVfaWQpOworCWRhdGFbMV0gPSBsdS0+bGFzdF9vcmJfZG1hOwogCXNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcihkYXRhLCA4KTsKLQlzYnAydXRpbF9ub3RpZnlfZmV0Y2hfYWdlbnQocCwgU0JQMl9PUkJfUE9JTlRFUl9PRkZTRVQsIGRhdGEsIDgpOworCXNicDJ1dGlsX25vdGlmeV9mZXRjaF9hZ2VudChsdSwgU0JQMl9PUkJfUE9JTlRFUl9PRkZTRVQsIGRhdGEsIDgpOwogfQogCi1zdGF0aWMgdm9pZCBzYnAydXRpbF93cml0ZV9kb29yYmVsbCh2b2lkICpwKQorc3RhdGljIHZvaWQgc2JwMnV0aWxfd3JpdGVfZG9vcmJlbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXNicDJ1dGlsX25vdGlmeV9mZXRjaF9hZ2VudChwLCBTQlAyX0RPT1JCRUxMX09GRlNFVCwgTlVMTCwgNCk7CisJc3RydWN0IHNicDJfbHUgKmx1ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzYnAyX2x1LCBwcm90b2NvbF93b3JrKTsKKworCXNicDJ1dGlsX25vdGlmeV9mZXRjaF9hZ2VudChsdSwgU0JQMl9ET09SQkVMTF9PRkZTRVQsIE5VTEwsIDQpOwogfQogCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY3JlYXRlIGEgcG9vbCBvZiBjb21tYW5kIG9yYnMgdXNlZCBmb3IKLSAqIGNvbW1hbmQgcHJvY2Vzc2luZy4gSXQgaXMgY2FsbGVkIHdoZW4gYSBuZXcgc2JwMiBkZXZpY2UgaXMgZGV0ZWN0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgc2JwMnV0aWxfY3JlYXRlX2NvbW1hbmRfb3JiX3Bvb2woc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCkKK3N0YXRpYyBpbnQgc2JwMnV0aWxfY3JlYXRlX2NvbW1hbmRfb3JiX3Bvb2woc3RydWN0IHNicDJfbHUgKmx1KQogewotCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7CisJc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpID0gbHUtPmhpOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9yYnM7Ci0Jc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kOworCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY21kOwogCi0Jb3JicyA9IHNlcmlhbGl6ZV9pbyA/IDIgOiBTQlAyX01BWF9DTURTOworCW9yYnMgPSBzYnAyX3NlcmlhbGl6ZV9pbyA/IDIgOiBTQlAyX01BWF9DTURTOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IG9yYnM7IGkrKykgewotCQljb21tYW5kID0ga3phbGxvYyhzaXplb2YoKmNvbW1hbmQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjb21tYW5kKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7CisJCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFjbWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx1LT5jbWRfb3JiX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCWNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSA9Ci0JCSAgICBwY2lfbWFwX3NpbmdsZShoaS0+aG9zdC0+cGRldiwgJmNvbW1hbmQtPmNvbW1hbmRfb3JiLAotCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCi0JCQkJICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JCVNCUDJfRE1BX0FMTE9DKCJzaW5nbGUgY29tbWFuZCBvcmIgRE1BIik7Ci0JCWNvbW1hbmQtPnNnZV9kbWEgPQotCQkgICAgcGNpX21hcF9zaW5nbGUoaGktPmhvc3QtPnBkZXYsCi0JCQkJICAgJmNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQsCi0JCQkJICAgc2l6ZW9mKGNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAotCQkJCSAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JCVNCUDJfRE1BX0FMTE9DKCJzY2F0dGVyX2dhdGhlcl9lbGVtZW50Iik7Ci0JCUlOSVRfTElTVF9IRUFEKCZjb21tYW5kLT5saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmY29tbWFuZC0+bGlzdCwgJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfY29tcGxldGVkKTsKKwkJY21kLT5jb21tYW5kX29yYl9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmaGktPmhvc3QtPmRldmljZSwKKwkJCQkJCSZjbWQtPmNvbW1hbmRfb3JiLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKKwkJCQkJCURNQV9UT19ERVZJQ0UpOworCQljbWQtPnNnZV9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmaGktPmhvc3QtPmRldmljZSwKKwkJCQkJJmNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCwKKwkJCQkJc2l6ZW9mKGNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCisJCQkJCURNQV9CSURJUkVDVElPTkFMKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNtZC0+bGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmNtZC0+bGlzdCwgJmx1LT5jbWRfb3JiX2NvbXBsZXRlZCk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx1LT5jbWRfb3JiX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhIHBvb2wgb2YgY29tbWFuZCBvcmJzLgotICovCi1zdGF0aWMgdm9pZCBzYnAydXRpbF9yZW1vdmVfY29tbWFuZF9vcmJfcG9vbChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQorc3RhdGljIHZvaWQgc2JwMnV0aWxfcmVtb3ZlX2NvbW1hbmRfb3JiX3Bvb2woc3RydWN0IHNicDJfbHUgKmx1KQogewotCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBzY3NpX2lkLT5oaS0+aG9zdDsKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gbHUtPmhpLT5ob3N0OwogCXN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbmV4dDsKLQlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQ7CisJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjbWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfY29tcGxldGVkKSkgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIG5leHQsICZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2NvbXBsZXRlZCkgewotCQkJY29tbWFuZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbywgbGlzdCk7Ci0KLQkJCS8qIFJlbGVhc2Ugb3VyIGdlbmVyaWMgRE1BJ3MgKi8KLQkJCXBjaV91bm1hcF9zaW5nbGUoaG9zdC0+cGRldiwgY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hLAorCXNwaW5fbG9ja19pcnFzYXZlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CisJaWYgKCFsaXN0X2VtcHR5KCZsdS0+Y21kX29yYl9jb21wbGV0ZWQpKQorCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIG5leHQsICZsdS0+Y21kX29yYl9jb21wbGV0ZWQpIHsKKwkJCWNtZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbywgbGlzdCk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZob3N0LT5kZXZpY2UsIGNtZC0+Y29tbWFuZF9vcmJfZG1hLAogCQkJCQkgc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKLQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJU0JQMl9ETUFfRlJFRSgic2luZ2xlIGNvbW1hbmQgb3JiIERNQSIpOwotCQkJcGNpX3VubWFwX3NpbmdsZShob3N0LT5wZGV2LCBjb21tYW5kLT5zZ2VfZG1hLAotCQkJCQkgc2l6ZW9mKGNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAotCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJCVNCUDJfRE1BX0ZSRUUoInNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQiKTsKLQotCQkJa2ZyZWUoY29tbWFuZCk7CisJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmhvc3QtPmRldmljZSwgY21kLT5zZ2VfZG1hLAorCQkJCQkgc2l6ZW9mKGNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCisJCQkJCSBETUFfQklESVJFQ1RJT05BTCk7CisJCQlrZnJlZShjbWQpOwogCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx1LT5jbWRfb3JiX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm47CiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBzYnAyX2NvbW1hbmQgZm9yIGEgZ2l2ZW4gb3V0c3RhbmRpbmcgY29tbWFuZAotICogb3JiLk9ubHkgbG9va3MgYXQgdGhlIGludXNlIGxpc3QuCisgKiBGaW5kcyB0aGUgc2JwMl9jb21tYW5kIGZvciBhIGdpdmVuIG91dHN0YW5kaW5nIGNvbW1hbmQgT1JCLgorICogT25seSBsb29rcyBhdCB0aGUgaW4tdXNlIGxpc3QuCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKnNicDJ1dGlsX2ZpbmRfY29tbWFuZF9mb3Jfb3JiKAotCQlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLCBkbWFfYWRkcl90IG9yYikKKwkJCQlzdHJ1Y3Qgc2JwMl9sdSAqbHUsIGRtYV9hZGRyX3Qgb3JiKQogewotCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZDsKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9pbnVzZSkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb21tYW5kLCAmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9pbnVzZSwgbGlzdCkgewotCQkJaWYgKGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSA9PSBvcmIpIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm4gY29tbWFuZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmbHUtPmNtZF9vcmJfaW51c2UpKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtZCwgJmx1LT5jbWRfb3JiX2ludXNlLCBsaXN0KQorCQkJaWYgKGNtZC0+Y29tbWFuZF9vcmJfZG1hID09IG9yYikgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkJCQkmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOworCQkJCXJldHVybiBjbWQ7CiAJCQl9Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7Ci0KLQlTQlAyX09SQl9ERUJVRygiY291bGQgbm90IG1hdGNoIGNvbW1hbmQgb3JiICV4IiwgKHVuc2lnbmVkIGludClvcmIpOwotCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOwogCXJldHVybiBOVUxMOwogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgc2JwMl9jb21tYW5kIGZvciBhIGdpdmVuIG91dHN0YW5kaW5nIFNDcG50LgotICogT25seSBsb29rcyBhdCB0aGUgaW51c2UgbGlzdC4KLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrIGhlbGQuCisgKiBGaW5kcyB0aGUgc2JwMl9jb21tYW5kIGZvciBhIGdpdmVuIG91dHN0YW5kaW5nIFNDcG50LgorICogT25seSBsb29rcyBhdCB0aGUgaW4tdXNlIGxpc3QuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGx1LT5jbWRfb3JiX2xvY2sgaGVsZC4KICAqLwogc3RhdGljIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqc2JwMnV0aWxfZmluZF9jb21tYW5kX2Zvcl9TQ3BudCgKLQkJc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwgdm9pZCAqU0NwbnQpCisJCQkJc3RydWN0IHNicDJfbHUgKmx1LCB2b2lkICpTQ3BudCkKIHsKLQlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQ7CisJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjbWQ7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfaW51c2UpKQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbW1hbmQsICZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2ludXNlLCBsaXN0KQotCQkJaWYgKGNvbW1hbmQtPkN1cnJlbnRfU0NwbnQgPT0gU0NwbnQpCi0JCQkJcmV0dXJuIGNvbW1hbmQ7CisJaWYgKCFsaXN0X2VtcHR5KCZsdS0+Y21kX29yYl9pbnVzZSkpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY21kLCAmbHUtPmNtZF9vcmJfaW51c2UsIGxpc3QpCisJCQlpZiAoY21kLT5DdXJyZW50X1NDcG50ID09IFNDcG50KQorCQkJCXJldHVybiBjbWQ7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIGNvbW1hbmQgb3JiIHVzZWQgdG8gc2VuZCBhIHNjc2kgY29tbWFuZC4KLSAqLwogc3RhdGljIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqc2JwMnV0aWxfYWxsb2NhdGVfY29tbWFuZF9vcmIoCi0JCXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCi0JCXN0cnVjdCBzY3NpX2NtbmQgKkN1cnJlbnRfU0NwbnQsCi0JCXZvaWQgKCpDdXJyZW50X2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCisJCQkJc3RydWN0IHNicDJfbHUgKmx1LAorCQkJCXN0cnVjdCBzY3NpX2NtbmQgKkN1cnJlbnRfU0NwbnQsCisJCQkJdm9pZCAoKkN1cnJlbnRfZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKLQlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQgPSBOVUxMOworCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY21kID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQpKSB7Ci0JCWxoID0gc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQubmV4dDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmbHUtPmNtZF9vcmJfY29tcGxldGVkKSkgeworCQlsaCA9IGx1LT5jbWRfb3JiX2NvbXBsZXRlZC5uZXh0OwogCQlsaXN0X2RlbChsaCk7Ci0JCWNvbW1hbmQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8sIGxpc3QpOwotCQljb21tYW5kLT5DdXJyZW50X2RvbmUgPSBDdXJyZW50X2RvbmU7Ci0JCWNvbW1hbmQtPkN1cnJlbnRfU0NwbnQgPSBDdXJyZW50X1NDcG50OwotCQlsaXN0X2FkZF90YWlsKCZjb21tYW5kLT5saXN0LCAmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9pbnVzZSk7Ci0JfSBlbHNlIHsKKwkJY21kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvLCBsaXN0KTsKKwkJY21kLT5DdXJyZW50X2RvbmUgPSBDdXJyZW50X2RvbmU7CisJCWNtZC0+Q3VycmVudF9TQ3BudCA9IEN1cnJlbnRfU0NwbnQ7CisJCWxpc3RfYWRkX3RhaWwoJmNtZC0+bGlzdCwgJmx1LT5jbWRfb3JiX2ludXNlKTsKKwl9IGVsc2UKIAkJU0JQMl9FUlIoIiVzOiBubyBvcmJzIGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOwotCXJldHVybiBjb21tYW5kOwotfQotCi0vKiBGcmVlIG91ciBETUEncyAqLwotc3RhdGljIHZvaWQgc2JwMnV0aWxfZnJlZV9jb21tYW5kX2RtYShzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQpCi17Ci0Jc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCA9Ci0JCShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICopY29tbWFuZC0+Q3VycmVudF9TQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKLQlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OwotCi0JaWYgKCFzY3NpX2lkKSB7Ci0JCVNCUDJfRVJSKCIlczogc2NzaV9pZCA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwotCX0KLQotCWhvc3QgPSBzY3NpX2lkLT51ZC0+bmUtPmhvc3Q7Ci0KLQlpZiAoY29tbWFuZC0+Y21kX2RtYSkgewotCQlpZiAoY29tbWFuZC0+ZG1hX3R5cGUgPT0gQ01EX0RNQV9TSU5HTEUpIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUoaG9zdC0+cGRldiwgY29tbWFuZC0+Y21kX2RtYSwKLQkJCQkJIGNvbW1hbmQtPmRtYV9zaXplLCBjb21tYW5kLT5kbWFfZGlyKTsKLQkJCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSBidWxrIik7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZC0+ZG1hX3R5cGUgPT0gQ01EX0RNQV9QQUdFKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShob3N0LT5wZGV2LCBjb21tYW5kLT5jbWRfZG1hLAotCQkJCSAgICAgICBjb21tYW5kLT5kbWFfc2l6ZSwgY29tbWFuZC0+ZG1hX2Rpcik7Ci0JCQlTQlAyX0RNQV9GUkVFKCJzaW5nbGUgcGFnZSIpOwotCQl9IC8qIFhYWDogQ2hlY2sgZm9yIENNRF9ETUFfTk9ORSBidWcgKi8KLQkJY29tbWFuZC0+ZG1hX3R5cGUgPSBDTURfRE1BX05PTkU7Ci0JCWNvbW1hbmQtPmNtZF9kbWEgPSAwOwotCX0KLQotCWlmIChjb21tYW5kLT5zZ2VfYnVmZmVyKSB7Ci0JCXBjaV91bm1hcF9zZyhob3N0LT5wZGV2LCBjb21tYW5kLT5zZ2VfYnVmZmVyLAotCQkJICAgICBjb21tYW5kLT5kbWFfc2l6ZSwgY29tbWFuZC0+ZG1hX2Rpcik7Ci0JCVNCUDJfRE1BX0ZSRUUoInNjYXR0ZXIgbGlzdCIpOwotCQljb21tYW5kLT5zZ2VfYnVmZmVyID0gTlVMTDsKLQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOworCXJldHVybiBjbWQ7CiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIG1vdmVzIGEgY29tbWFuZCB0byB0aGUgY29tcGxldGVkIG9yYiBsaXN0LgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2sgaGVsZC4KKyAqIFVubWFwcyB0aGUgRE1BcyBvZiBhIGNvbW1hbmQgYW5kIG1vdmVzIHRoZSBjb21tYW5kIHRvIHRoZSBjb21wbGV0ZWQgT1JCIGxpc3QuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGx1LT5jbWRfb3JiX2xvY2sgaGVsZC4KICAqLwotc3RhdGljIHZvaWQgc2JwMnV0aWxfbWFya19jb21tYW5kX2NvbXBsZXRlZCgKLQkJc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwKLQkJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kKQorc3RhdGljIHZvaWQgc2JwMnV0aWxfbWFya19jb21tYW5kX2NvbXBsZXRlZChzdHJ1Y3Qgc2JwMl9sdSAqbHUsCisJCQkJCSAgICBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZCkKIHsKLQlsaXN0X2RlbCgmY29tbWFuZC0+bGlzdCk7Ci0Jc2JwMnV0aWxfZnJlZV9jb21tYW5kX2RtYShjb21tYW5kKTsKLQlsaXN0X2FkZF90YWlsKCZjb21tYW5kLT5saXN0LCAmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQpOworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBsdS0+dWQtPm5lLT5ob3N0OworCisJaWYgKGNtZC0+Y21kX2RtYSkgeworCQlpZiAoY21kLT5kbWFfdHlwZSA9PSBDTURfRE1BX1NJTkdMRSkKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmhvc3QtPmRldmljZSwgY21kLT5jbWRfZG1hLAorCQkJCQkgY21kLT5kbWFfc2l6ZSwgY21kLT5kbWFfZGlyKTsKKwkJZWxzZSBpZiAoY21kLT5kbWFfdHlwZSA9PSBDTURfRE1BX1BBR0UpCisJCQlkbWFfdW5tYXBfcGFnZSgmaG9zdC0+ZGV2aWNlLCBjbWQtPmNtZF9kbWEsCisJCQkJICAgICAgIGNtZC0+ZG1hX3NpemUsIGNtZC0+ZG1hX2Rpcik7CisJCS8qIFhYWDogQ2hlY2sgZm9yIENNRF9ETUFfTk9ORSBidWcgKi8KKwkJY21kLT5kbWFfdHlwZSA9IENNRF9ETUFfTk9ORTsKKwkJY21kLT5jbWRfZG1hID0gMDsKKwl9CisJaWYgKGNtZC0+c2dlX2J1ZmZlcikgeworCQlkbWFfdW5tYXBfc2coJmhvc3QtPmRldmljZSwgY21kLT5zZ2VfYnVmZmVyLAorCQkJICAgICBjbWQtPmRtYV9zaXplLCBjbWQtPmRtYV9kaXIpOworCQljbWQtPnNnZV9idWZmZXIgPSBOVUxMOworCX0KKwlsaXN0X21vdmVfdGFpbCgmY21kLT5saXN0LCAmbHUtPmNtZF9vcmJfY29tcGxldGVkKTsKIH0KIAogLyoKLSAqIElzIHNjc2lfaWQgdmFsaWQ/IElzIHRoZSAxMzk0IG5vZGUgc3RpbGwgcHJlc2VudD8KKyAqIElzIGx1IHZhbGlkPyBJcyB0aGUgMTM5NCBub2RlIHN0aWxsIHByZXNlbnQ/CiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNicDJ1dGlsX25vZGVfaXNfYXZhaWxhYmxlKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpCitzdGF0aWMgaW5saW5lIGludCBzYnAydXRpbF9ub2RlX2lzX2F2YWlsYWJsZShzdHJ1Y3Qgc2JwMl9sdSAqbHUpCiB7Ci0JcmV0dXJuIHNjc2lfaWQgJiYgc2NzaV9pZC0+bmUgJiYgIXNjc2lfaWQtPm5lLT5pbl9saW1ibzsKKwlyZXR1cm4gbHUgJiYgbHUtPm5lICYmICFsdS0+bmUtPmluX2xpbWJvOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJRUVFLTEzOTQgY29yZSBkcml2ZXIgc3RhY2sgcmVsYXRlZCBzZWN0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNicDJfYWxsb2NfZGV2aWNlKHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQpOwogCiBzdGF0aWMgaW50IHNicDJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7Ci0Jc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZDsKLQotCVNCUDJfREVCVUdfRU5URVIoKTsKKwlzdHJ1Y3Qgc2JwMl9sdSAqbHU7CiAKIAl1ZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgZGV2aWNlKTsKIApAQCAtNzI2LDY3ICs2NDIsNTggQEAKIAlpZiAodWQtPmZsYWdzICYgVU5JVF9ESVJFQ1RPUllfSEFTX0xVTl9ESVJFQ1RPUlkpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc2NzaV9pZCA9IHNicDJfYWxsb2NfZGV2aWNlKHVkKTsKLQotCWlmICghc2NzaV9pZCkKKwlsdSA9IHNicDJfYWxsb2NfZGV2aWNlKHVkKTsKKwlpZiAoIWx1KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNicDJfcGFyc2VfdW5pdF9kaXJlY3Rvcnkoc2NzaV9pZCwgdWQpOwotCi0JcmV0dXJuIHNicDJfc3RhcnRfZGV2aWNlKHNjc2lfaWQpOworCXNicDJfcGFyc2VfdW5pdF9kaXJlY3RvcnkobHUsIHVkKTsKKwlyZXR1cm4gc2JwMl9zdGFydF9kZXZpY2UobHUpOwogfQogCiBzdGF0aWMgaW50IHNicDJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOwotCXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQ7CisJc3RydWN0IHNicDJfbHUgKmx1OwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKIAotCVNCUDJfREVCVUdfRU5URVIoKTsKLQogCXVkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCBkZXZpY2UpOwotCXNjc2lfaWQgPSB1ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhOwotCWlmICghc2NzaV9pZCkKKwlsdSA9IHVkLT5kZXZpY2UuZHJpdmVyX2RhdGE7CisJaWYgKCFsdSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc2NzaV9pZC0+c2NzaV9ob3N0KSB7CisJaWYgKGx1LT5zaG9zdCkgewogCQkvKiBHZXQgcmlkIG9mIGVucXVldWVkIGNvbW1hbmRzIGlmIHRoZXJlIGlzIG5vIGNoYW5jZSB0bwogCQkgKiBzZW5kIHRoZW0uICovCi0JCWlmICghc2JwMnV0aWxfbm9kZV9pc19hdmFpbGFibGUoc2NzaV9pZCkpCi0JCQlzYnAyc2NzaV9jb21wbGV0ZV9hbGxfY29tbWFuZHMoc2NzaV9pZCwgRElEX05PX0NPTk5FQ1QpOwotCQkvKiBzY3NpX3JlbW92ZV9kZXZpY2UoKSB3aWxsIHRyaWdnZXIgc2h1dGRvd24gZnVuY3Rpb25zIG9mIFNDU0kKKwkJaWYgKCFzYnAydXRpbF9ub2RlX2lzX2F2YWlsYWJsZShsdSkpCisJCQlzYnAyc2NzaV9jb21wbGV0ZV9hbGxfY29tbWFuZHMobHUsIERJRF9OT19DT05ORUNUKTsKKwkJLyogc2NzaV9yZW1vdmVfZGV2aWNlKCkgbWF5IHRyaWdnZXIgc2h1dGRvd24gZnVuY3Rpb25zIG9mIFNDU0kKIAkJICogaGlnaGxldmVsIGRyaXZlcnMgd2hpY2ggd291bGQgZGVhZGxvY2sgaWYgYmxvY2tlZC4gKi8KLQkJYXRvbWljX3NldCgmc2NzaV9pZC0+c3RhdGUsIFNCUDJMVV9TVEFURV9JTl9TSFVURE9XTik7Ci0JCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhzY3NpX2lkLT5zY3NpX2hvc3QpOworCQlhdG9taWNfc2V0KCZsdS0+c3RhdGUsIFNCUDJMVV9TVEFURV9JTl9TSFVURE9XTik7CisJCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhsdS0+c2hvc3QpOwogCX0KLQlzZGV2ID0gc2NzaV9pZC0+c2RldjsKKwlzZGV2ID0gbHUtPnNkZXY7CiAJaWYgKHNkZXYpIHsKLQkJc2NzaV9pZC0+c2RldiA9IE5VTEw7CisJCWx1LT5zZGV2ID0gTlVMTDsKIAkJc2NzaV9yZW1vdmVfZGV2aWNlKHNkZXYpOwogCX0KIAotCXNicDJfbG9nb3V0X2RldmljZShzY3NpX2lkKTsKLQlzYnAyX3JlbW92ZV9kZXZpY2Uoc2NzaV9pZCk7CisJc2JwMl9sb2dvdXRfZGV2aWNlKGx1KTsKKwlzYnAyX3JlbW92ZV9kZXZpY2UobHUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2JwMl91cGRhdGUoc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZCkKIHsKLQlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkID0gdWQtPmRldmljZS5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgc2JwMl9sdSAqbHUgPSB1ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhOwogCi0JU0JQMl9ERUJVR19FTlRFUigpOworCWlmIChzYnAyX3JlY29ubmVjdF9kZXZpY2UobHUpKSB7CisJCS8qIFJlY29ubmVjdCBoYXMgZmFpbGVkLiBQZXJoYXBzIHdlIGRpZG4ndCByZWNvbm5lY3QgZmFzdAorCQkgKiBlbm91Z2guIFRyeSBhIHJlZ3VsYXIgbG9naW4sIGJ1dCBmaXJzdCBsb2cgb3V0IGp1c3QgaW4KKwkJICogY2FzZSBvZiBhbnkgd2VpcmRuZXNzLiAqLworCQlzYnAyX2xvZ291dF9kZXZpY2UobHUpOwogCi0JaWYgKHNicDJfcmVjb25uZWN0X2RldmljZShzY3NpX2lkKSkgewotCi0JCS8qCi0JCSAqIE9rLCByZWNvbm5lY3QgaGFzIGZhaWxlZC4gUGVyaGFwcyB3ZSBkaWRuJ3QKLQkJICogcmVjb25uZWN0IGZhc3QgZW5vdWdoLiBUcnkgZG9pbmcgYSByZWd1bGFyIGxvZ2luLCBidXQKLQkJICogZmlyc3QgZG8gYSBsb2dvdXQganVzdCBpbiBjYXNlIG9mIGFueSB3ZWlyZG5lc3MuCi0JCSAqLwotCQlzYnAyX2xvZ291dF9kZXZpY2Uoc2NzaV9pZCk7Ci0KLQkJaWYgKHNicDJfbG9naW5fZGV2aWNlKHNjc2lfaWQpKSB7CisJCWlmIChzYnAyX2xvZ2luX2RldmljZShsdSkpIHsKIAkJCS8qIExvZ2luIGZhaWxlZCB0b28sIGp1c3QgZmFpbCwgYW5kIHRoZSBiYWNrZW5kCiAJCQkgKiB3aWxsIGNhbGwgb3VyIHNicDJfcmVtb3ZlIGZvciB1cyAqLwogCQkJU0JQMl9FUlIoIkZhaWxlZCB0byByZWNvbm5lY3QgdG8gc2JwMiBkZXZpY2UhIik7CkBAIC03OTQsNjkgKzcwMSw1OSBAQAogCQl9CiAJfQogCi0JLyogU2V0IG1heCByZXRyaWVzIHRvIHNvbWV0aGluZyBsYXJnZSBvbiB0aGUgZGV2aWNlLiAqLwotCXNicDJfc2V0X2J1c3lfdGltZW91dChzY3NpX2lkKTsKKwlzYnAyX3NldF9idXN5X3RpbWVvdXQobHUpOworCXNicDJfYWdlbnRfcmVzZXQobHUsIDEpOworCXNicDJfbWF4X3NwZWVkX2FuZF9zaXplKGx1KTsKIAotCS8qIERvIGEgU0JQLTIgZmV0Y2ggYWdlbnQgcmVzZXQuICovCi0Jc2JwMl9hZ2VudF9yZXNldChzY3NpX2lkLCAxKTsKLQotCS8qIEdldCB0aGUgbWF4IHNwZWVkIGFuZCBwYWNrZXQgc2l6ZSB0aGF0IHdlIGNhbiB1c2UuICovCi0Jc2JwMl9tYXhfc3BlZWRfYW5kX3NpemUoc2NzaV9pZCk7Ci0KLQkvKiBDb21wbGV0ZSBhbnkgcGVuZGluZyBjb21tYW5kcyB3aXRoIGJ1c3kgKHNvIHRoZXkgZ2V0Ci0JICogcmV0cmllZCkgYW5kIHJlbW92ZSB0aGVtIGZyb20gb3VyIHF1ZXVlCi0JICovCi0Jc2JwMnNjc2lfY29tcGxldGVfYWxsX2NvbW1hbmRzKHNjc2lfaWQsIERJRF9CVVNfQlVTWSk7CisJLyogQ29tcGxldGUgYW55IHBlbmRpbmcgY29tbWFuZHMgd2l0aCBidXN5IChzbyB0aGV5IGdldCByZXRyaWVkKQorCSAqIGFuZCByZW1vdmUgdGhlbSBmcm9tIG91ciBxdWV1ZS4gKi8KKwlzYnAyc2NzaV9jb21wbGV0ZV9hbGxfY29tbWFuZHMobHUsIERJRF9CVVNfQlVTWSk7CiAKIAkvKiBBY2NlcHQgbmV3IGNvbW1hbmRzIHVubGVzcyB0aGVyZSB3YXMgYW5vdGhlciBidXMgcmVzZXQgaW4gdGhlCiAJICogbWVhbnRpbWUuICovCi0JaWYgKGhwc2Jfbm9kZV9lbnRyeV92YWxpZChzY3NpX2lkLT5uZSkpIHsKLQkJYXRvbWljX3NldCgmc2NzaV9pZC0+c3RhdGUsIFNCUDJMVV9TVEFURV9SVU5OSU5HKTsKLQkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHNjc2lfaWQtPnNjc2lfaG9zdCk7CisJaWYgKGhwc2Jfbm9kZV9lbnRyeV92YWxpZChsdS0+bmUpKSB7CisJCWF0b21pY19zZXQoJmx1LT5zdGF0ZSwgU0JQMkxVX1NUQVRFX1JVTk5JTkcpOworCQlzY3NpX3VuYmxvY2tfcmVxdWVzdHMobHUtPnNob3N0KTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgZnVuY3Rpb25zIGlzIGNhbGxlZCBieSB0aGUgc2JwMl9wcm9iZSwgZm9yIGVhY2ggbmV3IGRldmljZS4gV2Ugbm93Ci0gKiBhbGxvY2F0ZSBvbmUgc2NzaSBob3N0IGZvciBlYWNoIHNjc2lfaWQgKHVuaXQgZGlyZWN0b3J5KS4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzYnAyX2FsbG9jX2RldmljZShzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKQorc3RhdGljIHN0cnVjdCBzYnAyX2x1ICpzYnAyX2FsbG9jX2RldmljZShzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKQogewotCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpOwotCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdCA9IE5VTEw7Ci0Jc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCA9IE5VTEw7CisJc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2JwMl9sdSAqbHUgPSBOVUxMOwogCi0JU0JQMl9ERUJVR19FTlRFUigpOwotCi0Jc2NzaV9pZCA9IGt6YWxsb2Moc2l6ZW9mKCpzY3NpX2lkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzY3NpX2lkKSB7Ci0JCVNCUDJfRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHNjc2lfaWQiKTsKKwlsdSA9IGt6YWxsb2Moc2l6ZW9mKCpsdSksIEdGUF9LRVJORUwpOworCWlmICghbHUpIHsKKwkJU0JQMl9FUlIoImZhaWxlZCB0byBjcmVhdGUgbHUiKTsKIAkJZ290byBmYWlsZWRfYWxsb2M7CiAJfQogCi0Jc2NzaV9pZC0+bmUgPSB1ZC0+bmU7Ci0Jc2NzaV9pZC0+dWQgPSB1ZDsKLQlzY3NpX2lkLT5zcGVlZF9jb2RlID0gSUVFRTEzOTRfU1BFRURfMTAwOwotCXNjc2lfaWQtPm1heF9wYXlsb2FkX3NpemUgPSBzYnAyX3NwZWVkdG9fbWF4X3BheWxvYWRbSUVFRTEzOTRfU1BFRURfMTAwXTsKLQlzY3NpX2lkLT5zdGF0dXNfZmlmb19hZGRyID0gQ1NSMTIxMl9JTlZBTElEX0FERFJfU1BBQ0U7Ci0JSU5JVF9MSVNUX0hFQUQoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfaW51c2UpOwotCUlOSVRfTElTVF9IRUFEKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2NvbXBsZXRlZCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNjc2lfaWQtPnNjc2lfbGlzdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jayk7Ci0JYXRvbWljX3NldCgmc2NzaV9pZC0+c3RhdGUsIFNCUDJMVV9TVEFURV9SVU5OSU5HKTsKLQlJTklUX1dPUksoJnNjc2lfaWQtPnByb3RvY29sX3dvcmssIE5VTEwsIE5VTEwpOworCWx1LT5uZSA9IHVkLT5uZTsKKwlsdS0+dWQgPSB1ZDsKKwlsdS0+c3BlZWRfY29kZSA9IElFRUUxMzk0X1NQRUVEXzEwMDsKKwlsdS0+bWF4X3BheWxvYWRfc2l6ZSA9IHNicDJfc3BlZWR0b19tYXhfcGF5bG9hZFtJRUVFMTM5NF9TUEVFRF8xMDBdOworCWx1LT5zdGF0dXNfZmlmb19hZGRyID0gQ1NSMTIxMl9JTlZBTElEX0FERFJfU1BBQ0U7CisJSU5JVF9MSVNUX0hFQUQoJmx1LT5jbWRfb3JiX2ludXNlKTsKKwlJTklUX0xJU1RfSEVBRCgmbHUtPmNtZF9vcmJfY29tcGxldGVkKTsKKwlJTklUX0xJU1RfSEVBRCgmbHUtPmx1X2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZsdS0+Y21kX29yYl9sb2NrKTsKKwlhdG9taWNfc2V0KCZsdS0+c3RhdGUsIFNCUDJMVV9TVEFURV9SVU5OSU5HKTsKKwlJTklUX1dPUksoJmx1LT5wcm90b2NvbF93b3JrLCBOVUxMKTsKIAotCXVkLT5kZXZpY2UuZHJpdmVyX2RhdGEgPSBzY3NpX2lkOworCXVkLT5kZXZpY2UuZHJpdmVyX2RhdGEgPSBsdTsKIAogCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJnNicDJfaGlnaGxldmVsLCB1ZC0+bmUtPmhvc3QpOwogCWlmICghaGkpIHsKLQkJaGkgPSBocHNiX2NyZWF0ZV9ob3N0aW5mbygmc2JwMl9oaWdobGV2ZWwsIHVkLT5uZS0+aG9zdCwgc2l6ZW9mKCpoaSkpOworCQloaSA9IGhwc2JfY3JlYXRlX2hvc3RpbmZvKCZzYnAyX2hpZ2hsZXZlbCwgdWQtPm5lLT5ob3N0LAorCQkJCQkgIHNpemVvZigqaGkpKTsKIAkJaWYgKCFoaSkgewogCQkJU0JQMl9FUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBob3N0aW5mbyIpOwogCQkJZ290byBmYWlsZWRfYWxsb2M7CiAJCX0KLQkJU0JQMl9ERUJVRygic2JwMl9hbGxvY19kZXZpY2U6IGFsbG9jYXRlZCBob3N0aW5mbyIpOwogCQloaS0+aG9zdCA9IHVkLT5uZS0+aG9zdDsKLQkJSU5JVF9MSVNUX0hFQUQoJmhpLT5zY3NpX2lkcyk7CisJCUlOSVRfTElTVF9IRUFEKCZoaS0+bG9naWNhbF91bml0cyk7CiAKICNpZmRlZiBDT05GSUdfSUVFRTEzOTRfU0JQMl9QSFlTX0RNQQogCQkvKiBIYW5kbGUgZGF0YSBtb3ZlbWVudCBpZiBwaHlzaWNhbCBkbWEgaXMgbm90CkBAIC04NzYsOSArNzczLDkgQEAKIAkJZ290byBmYWlsZWRfYWxsb2M7CiAJfQogCi0Jc2NzaV9pZC0+aGkgPSBoaTsKKwlsdS0+aGkgPSBoaTsKIAotCWxpc3RfYWRkX3RhaWwoJnNjc2lfaWQtPnNjc2lfbGlzdCwgJmhpLT5zY3NpX2lkcyk7CisJbGlzdF9hZGRfdGFpbCgmbHUtPmx1X2xpc3QsICZoaS0+bG9naWNhbF91bml0cyk7CiAKIAkvKiBSZWdpc3RlciB0aGUgc3RhdHVzIEZJRk8gYWRkcmVzcyByYW5nZS4gV2UgY291bGQgdXNlIHRoZSBzYW1lIEZJRk8KIAkgKiBmb3IgdGFyZ2V0cyBhdCBkaWZmZXJlbnQgbm9kZXMuIEhvd2V2ZXIgd2UgbmVlZCBkaWZmZXJlbnQgRklGT3MgcGVyCkBAIC04ODgsMzAyICs3ODUsMjE0IEBACiAJICogdGhlbiBiZSBwZXJmb3JtZWQgYXMgdW5pZmllZCB0cmFuc2FjdGlvbnMuIFRoaXMgc2xpZ2h0bHkgcmVkdWNlcwogCSAqIGJhbmR3aWR0aCB1c2FnZSwgYW5kIHNvbWUgUHJvbGlmaWMgYmFzZWQgZGV2aWNlcyBzZWVtIHRvIHJlcXVpcmUgaXQuCiAJICovCi0Jc2NzaV9pZC0+c3RhdHVzX2ZpZm9fYWRkciA9IGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZSgKKwlsdS0+c3RhdHVzX2ZpZm9fYWRkciA9IGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZSgKIAkJCSZzYnAyX2hpZ2hsZXZlbCwgdWQtPm5lLT5ob3N0LCAmc2JwMl9vcHMsCiAJCQlzaXplb2Yoc3RydWN0IHNicDJfc3RhdHVzX2Jsb2NrKSwgc2l6ZW9mKHF1YWRsZXRfdCksCiAJCQl1ZC0+bmUtPmhvc3QtPmxvd19hZGRyX3NwYWNlLCBDU1IxMjEyX0FMTF9TUEFDRV9FTkQpOwotCWlmIChzY3NpX2lkLT5zdGF0dXNfZmlmb19hZGRyID09IENTUjEyMTJfSU5WQUxJRF9BRERSX1NQQUNFKSB7CisJaWYgKGx1LT5zdGF0dXNfZmlmb19hZGRyID09IENTUjEyMTJfSU5WQUxJRF9BRERSX1NQQUNFKSB7CiAJCVNCUDJfRVJSKCJmYWlsZWQgdG8gYWxsb2NhdGUgc3RhdHVzIEZJRk8gYWRkcmVzcyByYW5nZSIpOwogCQlnb3RvIGZhaWxlZF9hbGxvYzsKIAl9CiAKLQkvKiBSZWdpc3RlciBvdXIgaG9zdCB3aXRoIHRoZSBTQ1NJIHN0YWNrLiAqLwotCXNjc2lfaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmc2NzaV9kcml2ZXJfdGVtcGxhdGUsCi0JCQkJICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JaWYgKCFzY3NpX2hvc3QpIHsKKwlzaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmc2JwMl9zaG9zdF90ZW1wbGF0ZSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpZiAoIXNob3N0KSB7CiAJCVNCUDJfRVJSKCJmYWlsZWQgdG8gcmVnaXN0ZXIgc2NzaSBob3N0Iik7CiAJCWdvdG8gZmFpbGVkX2FsbG9jOwogCX0KIAotCXNjc2lfaG9zdC0+aG9zdGRhdGFbMF0gPSAodW5zaWduZWQgbG9uZylzY3NpX2lkOworCXNob3N0LT5ob3N0ZGF0YVswXSA9ICh1bnNpZ25lZCBsb25nKWx1OwogCi0JaWYgKCFzY3NpX2FkZF9ob3N0KHNjc2lfaG9zdCwgJnVkLT5kZXZpY2UpKSB7Ci0JCXNjc2lfaWQtPnNjc2lfaG9zdCA9IHNjc2lfaG9zdDsKLQkJcmV0dXJuIHNjc2lfaWQ7CisJaWYgKCFzY3NpX2FkZF9ob3N0KHNob3N0LCAmdWQtPmRldmljZSkpIHsKKwkJbHUtPnNob3N0ID0gc2hvc3Q7CisJCXJldHVybiBsdTsKIAl9CiAKIAlTQlAyX0VSUigiZmFpbGVkIHRvIGFkZCBzY3NpIGhvc3QiKTsKLQlzY3NpX2hvc3RfcHV0KHNjc2lfaG9zdCk7CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CiAKIGZhaWxlZF9hbGxvYzoKLQlzYnAyX3JlbW92ZV9kZXZpY2Uoc2NzaV9pZCk7CisJc2JwMl9yZW1vdmVfZGV2aWNlKGx1KTsKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgc2JwMl9ob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCiB7Ci0Jc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGk7Ci0Jc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZDsKKwlzdHJ1Y3Qgc2JwMl9md2hvc3RfaW5mbyAqaGk7CisJc3RydWN0IHNicDJfbHUgKmx1OwogCiAJaGkgPSBocHNiX2dldF9ob3N0aW5mbygmc2JwMl9oaWdobGV2ZWwsIGhvc3QpOwogCWlmICghaGkpCiAJCXJldHVybjsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjc2lfaWQsICZoaS0+c2NzaV9pZHMsIHNjc2lfbGlzdCkKLQkJaWYgKGxpa2VseShhdG9taWNfcmVhZCgmc2NzaV9pZC0+c3RhdGUpICE9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsdSwgJmhpLT5sb2dpY2FsX3VuaXRzLCBsdV9saXN0KQorCQlpZiAobGlrZWx5KGF0b21pY19yZWFkKCZsdS0+c3RhdGUpICE9CiAJCQkgICBTQlAyTFVfU1RBVEVfSU5fU0hVVERPV04pKSB7Ci0JCQlhdG9taWNfc2V0KCZzY3NpX2lkLT5zdGF0ZSwgU0JQMkxVX1NUQVRFX0lOX1JFU0VUKTsKLQkJCXNjc2lfYmxvY2tfcmVxdWVzdHMoc2NzaV9pZC0+c2NzaV9ob3N0KTsKKwkJCWF0b21pY19zZXQoJmx1LT5zdGF0ZSwgU0JQMkxVX1NUQVRFX0lOX1JFU0VUKTsKKwkJCXNjc2lfYmxvY2tfcmVxdWVzdHMobHUtPnNob3N0KTsKIAkJfQogfQogCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyB3aGVyZSB3ZSBmaXJzdCBwdWxsIHRoZSBub2RlIHVuaXF1ZSBpZHMsIGFuZCB0aGVuCi0gKiBhbGxvY2F0ZSBtZW1vcnkgYW5kIHJlZ2lzdGVyIGEgU0JQLTIgZGV2aWNlLgotICovCi1zdGF0aWMgaW50IHNicDJfc3RhcnRfZGV2aWNlKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpCitzdGF0aWMgaW50IHNicDJfc3RhcnRfZGV2aWNlKHN0cnVjdCBzYnAyX2x1ICpsdSkKIHsKLQlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOworCXN0cnVjdCBzYnAyX2Z3aG9zdF9pbmZvICpoaSA9IGx1LT5oaTsKIAlpbnQgZXJyb3I7CiAKLQlTQlAyX0RFQlVHX0VOVEVSKCk7Ci0KLQkvKiBMb2dpbiBGSUZPIERNQSAqLwotCXNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlID0KLQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGktPmhvc3QtPnBkZXYsCisJbHUtPmxvZ2luX3Jlc3BvbnNlID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoaS0+aG9zdC0+ZGV2aWNlLAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX3Jlc3BvbnNlKSwKLQkJCQkgICAgICZzY3NpX2lkLT5sb2dpbl9yZXNwb25zZV9kbWEpOwotCWlmICghc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UpCisJCQkJICAgICAmbHUtPmxvZ2luX3Jlc3BvbnNlX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsdS0+bG9naW5fcmVzcG9uc2UpCiAJCWdvdG8gYWxsb2NfZmFpbDsKLQlTQlAyX0RNQV9BTExPQygiY29uc2lzdGVudCBETUEgcmVnaW9uIGZvciBsb2dpbiBGSUZPIik7CiAKLQkvKiBRdWVyeSBsb2dpbnMgT1JCIERNQSAqLwotCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmIgPQotCQlwY2lfYWxsb2NfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwlsdS0+cXVlcnlfbG9naW5zX29yYiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGktPmhvc3QtPmRldmljZSwKIAkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfb3JiKSwKLQkJCQkgICAgICZzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiX2RtYSk7Ci0JaWYgKCFzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiKQorCQkJCSAgICAgJmx1LT5xdWVyeV9sb2dpbnNfb3JiX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsdS0+cXVlcnlfbG9naW5zX29yYikKIAkJZ290byBhbGxvY19mYWlsOwotCVNCUDJfRE1BX0FMTE9DKCJjb25zaXN0ZW50IERNQSByZWdpb24gZm9yIHF1ZXJ5IGxvZ2lucyBPUkIiKTsKIAotCS8qIFF1ZXJ5IGxvZ2lucyByZXNwb25zZSBETUEgKi8KLQlzY3NpX2lkLT5xdWVyeV9sb2dpbnNfcmVzcG9uc2UgPQotCQlwY2lfYWxsb2NfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwlsdS0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoaS0+aG9zdC0+ZGV2aWNlLAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19yZXNwb25zZSksCi0JCQkJICAgICAmc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlX2RtYSk7Ci0JaWYgKCFzY3NpX2lkLT5xdWVyeV9sb2dpbnNfcmVzcG9uc2UpCisJCQkJICAgICAmbHUtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZV9kbWEsIEdGUF9LRVJORUwpOworCWlmICghbHUtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZSkKIAkJZ290byBhbGxvY19mYWlsOwotCVNCUDJfRE1BX0FMTE9DKCJjb25zaXN0ZW50IERNQSByZWdpb24gZm9yIHF1ZXJ5IGxvZ2lucyByZXNwb25zZSIpOwogCi0JLyogUmVjb25uZWN0IE9SQiBETUEgKi8KLQlzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiID0KLQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGktPmhvc3QtPnBkZXYsCisJbHUtPnJlY29ubmVjdF9vcmIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhpLT5ob3N0LT5kZXZpY2UsCiAJCQkJICAgICBzaXplb2Yoc3RydWN0IHNicDJfcmVjb25uZWN0X29yYiksCi0JCQkJICAgICAmc2NzaV9pZC0+cmVjb25uZWN0X29yYl9kbWEpOwotCWlmICghc2NzaV9pZC0+cmVjb25uZWN0X29yYikKKwkJCQkgICAgICZsdS0+cmVjb25uZWN0X29yYl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghbHUtPnJlY29ubmVjdF9vcmIpCiAJCWdvdG8gYWxsb2NfZmFpbDsKLQlTQlAyX0RNQV9BTExPQygiY29uc2lzdGVudCBETUEgcmVnaW9uIGZvciByZWNvbm5lY3QgT1JCIik7CiAKLQkvKiBMb2dvdXQgT1JCIERNQSAqLwotCXNjc2lfaWQtPmxvZ291dF9vcmIgPQotCQlwY2lfYWxsb2NfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwlsdS0+bG9nb3V0X29yYiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGktPmhvc3QtPmRldmljZSwKIAkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dvdXRfb3JiKSwKLQkJCQkgICAgICZzY3NpX2lkLT5sb2dvdXRfb3JiX2RtYSk7Ci0JaWYgKCFzY3NpX2lkLT5sb2dvdXRfb3JiKQorCQkJCSAgICAgJmx1LT5sb2dvdXRfb3JiX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsdS0+bG9nb3V0X29yYikKIAkJZ290byBhbGxvY19mYWlsOwotCVNCUDJfRE1BX0FMTE9DKCJjb25zaXN0ZW50IERNQSByZWdpb24gZm9yIGxvZ291dCBPUkIiKTsKIAotCS8qIExvZ2luIE9SQiBETUEgKi8KLQlzY3NpX2lkLT5sb2dpbl9vcmIgPQotCQlwY2lfYWxsb2NfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwlsdS0+bG9naW5fb3JiID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoaS0+aG9zdC0+ZGV2aWNlLAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX29yYiksCi0JCQkJICAgICAmc2NzaV9pZC0+bG9naW5fb3JiX2RtYSk7Ci0JaWYgKCFzY3NpX2lkLT5sb2dpbl9vcmIpCisJCQkJICAgICAmbHUtPmxvZ2luX29yYl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghbHUtPmxvZ2luX29yYikKIAkJZ290byBhbGxvY19mYWlsOwotCVNCUDJfRE1BX0FMTE9DKCJjb25zaXN0ZW50IERNQSByZWdpb24gZm9yIGxvZ2luIE9SQiIpOwogCi0JU0JQMl9ERUJVRygiTmV3IFNCUC0yIGRldmljZSBpbnNlcnRlZCwgU0NTSSBJRCA9ICV4Iiwgc2NzaV9pZC0+dWQtPmlkKTsKLQotCS8qCi0JICogQ3JlYXRlIG91ciBjb21tYW5kIG9yYiBwb29sCi0JICovCi0JaWYgKHNicDJ1dGlsX2NyZWF0ZV9jb21tYW5kX29yYl9wb29sKHNjc2lfaWQpKSB7CisJaWYgKHNicDJ1dGlsX2NyZWF0ZV9jb21tYW5kX29yYl9wb29sKGx1KSkgewogCQlTQlAyX0VSUigic2JwMnV0aWxfY3JlYXRlX2NvbW1hbmRfb3JiX3Bvb2wgZmFpbGVkISIpOwotCQlzYnAyX3JlbW92ZV9kZXZpY2Uoc2NzaV9pZCk7CisJCXNicDJfcmVtb3ZlX2RldmljZShsdSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIFNjaGVkdWxlIGEgdGltZW91dCBoZXJlLiBUaGUgcmVhc29uIGlzIHRoYXQgd2UgbWF5IGJlIHNvIGNsb3NlCi0JICogdG8gYSBidXMgcmVzZXQsIHRoYXQgdGhlIGRldmljZSBpcyBub3QgYXZhaWxhYmxlIGZvciBsb2dpbnMuCi0JICogVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGJ1cyByZXNldCBpcyBjYXVzZWQgYnkgdGhlIGhvc3QKLQkgKiBjb25uZWN0ZWQgdG8gdGhlIHNicDIgZGV2aWNlIGJlaW5nIHJlbW92ZWQuIFRoYXQgaG9zdCB3b3VsZAotCSAqIGhhdmUgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lIHRvIHJlbG9naW4gYmVmb3JlIHRoZSBzYnAyIGRldmljZQotCSAqIGFsbG93cyBzb21lb25lIGVsc2UgdG8gbG9naW4gaW5zdGVhZC4gT25lIHNlY29uZCBtYWtlcyBzZW5zZS4gKi8KKwkvKiBXYWl0IGEgc2Vjb25kIGJlZm9yZSB0cnlpbmcgdG8gbG9nIGluLiBQcmV2aW91c2x5IGxvZ2dlZCBpbgorCSAqIGluaXRpYXRvcnMgbmVlZCBhIGNoYW5jZSB0byByZWNvbm5lY3QuICovCiAJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApKSB7Ci0JCXNicDJfcmVtb3ZlX2RldmljZShzY3NpX2lkKTsKKwkJc2JwMl9yZW1vdmVfZGV2aWNlKGx1KTsKIAkJcmV0dXJuIC1FSU5UUjsKIAl9CiAKLQkvKgotCSAqIExvZ2luIHRvIHRoZSBzYnAtMiBkZXZpY2UKLQkgKi8KLQlpZiAoc2JwMl9sb2dpbl9kZXZpY2Uoc2NzaV9pZCkpIHsKLQkJLyogTG9naW4gZmFpbGVkLCBqdXN0IHJlbW92ZSB0aGUgZGV2aWNlLiAqLwotCQlzYnAyX3JlbW92ZV9kZXZpY2Uoc2NzaV9pZCk7CisJaWYgKHNicDJfbG9naW5fZGV2aWNlKGx1KSkgeworCQlzYnAyX3JlbW92ZV9kZXZpY2UobHUpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCS8qCi0JICogU2V0IG1heCByZXRyaWVzIHRvIHNvbWV0aGluZyBsYXJnZSBvbiB0aGUgZGV2aWNlCi0JICovCi0Jc2JwMl9zZXRfYnVzeV90aW1lb3V0KHNjc2lfaWQpOworCXNicDJfc2V0X2J1c3lfdGltZW91dChsdSk7CisJc2JwMl9hZ2VudF9yZXNldChsdSwgMSk7CisJc2JwMl9tYXhfc3BlZWRfYW5kX3NpemUobHUpOwogCi0JLyoKLQkgKiBEbyBhIFNCUC0yIGZldGNoIGFnZW50IHJlc2V0Ci0JICovCi0Jc2JwMl9hZ2VudF9yZXNldChzY3NpX2lkLCAxKTsKLQotCS8qCi0JICogR2V0IHRoZSBtYXggc3BlZWQgYW5kIHBhY2tldCBzaXplIHRoYXQgd2UgY2FuIHVzZQotCSAqLwotCXNicDJfbWF4X3NwZWVkX2FuZF9zaXplKHNjc2lfaWQpOwotCi0JLyogQWRkIHRoaXMgZGV2aWNlIHRvIHRoZSBzY3NpIGxheWVyIG5vdyAqLwotCWVycm9yID0gc2NzaV9hZGRfZGV2aWNlKHNjc2lfaWQtPnNjc2lfaG9zdCwgMCwgc2NzaV9pZC0+dWQtPmlkLCAwKTsKKwllcnJvciA9IHNjc2lfYWRkX2RldmljZShsdS0+c2hvc3QsIDAsIGx1LT51ZC0+aWQsIDApOwogCWlmIChlcnJvcikgewogCQlTQlAyX0VSUigic2NzaV9hZGRfZGV2aWNlIGZhaWxlZCIpOwotCQlzYnAyX2xvZ291dF9kZXZpY2Uoc2NzaV9pZCk7Ci0JCXNicDJfcmVtb3ZlX2RldmljZShzY3NpX2lkKTsKKwkJc2JwMl9sb2dvdXRfZGV2aWNlKGx1KTsKKwkJc2JwMl9yZW1vdmVfZGV2aWNlKGx1KTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIAogCXJldHVybiAwOwogCiBhbGxvY19mYWlsOgotCVNCUDJfRVJSKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzY3NpX2lkIik7Ci0Jc2JwMl9yZW1vdmVfZGV2aWNlKHNjc2lfaWQpOworCVNCUDJfRVJSKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBsdSIpOworCXNicDJfcmVtb3ZlX2RldmljZShsdSk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYW4gc2JwMiBkZXZpY2UgZnJvbSB0aGUgc2JwMnNjc2lfaG9zdF9pbmZvIHN0cnVjdC4KLSAqLwotc3RhdGljIHZvaWQgc2JwMl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpCitzdGF0aWMgdm9pZCBzYnAyX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNicDJfbHUgKmx1KQogewotCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpOworCXN0cnVjdCBzYnAyX2Z3aG9zdF9pbmZvICpoaTsKIAotCVNCUDJfREVCVUdfRU5URVIoKTsKLQotCWlmICghc2NzaV9pZCkKKwlpZiAoIWx1KQogCQlyZXR1cm47CiAKLQloaSA9IHNjc2lfaWQtPmhpOworCWhpID0gbHUtPmhpOwogCi0JLyogVGhpcyB3aWxsIHJlbW92ZSBvdXIgc2NzaSBkZXZpY2UgYXN3ZWxsICovCi0JaWYgKHNjc2lfaWQtPnNjc2lfaG9zdCkgewotCQlzY3NpX3JlbW92ZV9ob3N0KHNjc2lfaWQtPnNjc2lfaG9zdCk7Ci0JCXNjc2lfaG9zdF9wdXQoc2NzaV9pZC0+c2NzaV9ob3N0KTsKKwlpZiAobHUtPnNob3N0KSB7CisJCXNjc2lfcmVtb3ZlX2hvc3QobHUtPnNob3N0KTsKKwkJc2NzaV9ob3N0X3B1dChsdS0+c2hvc3QpOwogCX0KIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCXNicDJ1dGlsX3JlbW92ZV9jb21tYW5kX29yYl9wb29sKHNjc2lfaWQpOworCXNicDJ1dGlsX3JlbW92ZV9jb21tYW5kX29yYl9wb29sKGx1KTsKIAotCWxpc3RfZGVsKCZzY3NpX2lkLT5zY3NpX2xpc3QpOworCWxpc3RfZGVsKCZsdS0+bHVfbGlzdCk7CiAKLQlpZiAoc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UpIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwlpZiAobHUtPmxvZ2luX3Jlc3BvbnNlKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGktPmhvc3QtPmRldmljZSwKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX3Jlc3BvbnNlKSwKLQkJCQkgICAgc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UsCi0JCQkJICAgIHNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlX2RtYSk7Ci0JCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSBsb2dpbiBGSUZPIik7Ci0JfQotCi0JaWYgKHNjc2lfaWQtPmxvZ2luX29yYikgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhpLT5ob3N0LT5wZGV2LAorCQkJCSAgICBsdS0+bG9naW5fcmVzcG9uc2UsCisJCQkJICAgIGx1LT5sb2dpbl9yZXNwb25zZV9kbWEpOworCWlmIChsdS0+bG9naW5fb3JiKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGktPmhvc3QtPmRldmljZSwKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX29yYiksCi0JCQkJICAgIHNjc2lfaWQtPmxvZ2luX29yYiwKLQkJCQkgICAgc2NzaV9pZC0+bG9naW5fb3JiX2RtYSk7Ci0JCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSBsb2dpbiBPUkIiKTsKLQl9Ci0KLQlpZiAoc2NzaV9pZC0+cmVjb25uZWN0X29yYikgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhpLT5ob3N0LT5wZGV2LAorCQkJCSAgICBsdS0+bG9naW5fb3JiLAorCQkJCSAgICBsdS0+bG9naW5fb3JiX2RtYSk7CisJaWYgKGx1LT5yZWNvbm5lY3Rfb3JiKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGktPmhvc3QtPmRldmljZSwKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX3JlY29ubmVjdF9vcmIpLAotCQkJCSAgICBzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiLAotCQkJCSAgICBzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiX2RtYSk7Ci0JCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSByZWNvbm5lY3Qgb3JiIik7Ci0JfQotCi0JaWYgKHNjc2lfaWQtPmxvZ291dF9vcmIpIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwkJCQkgICAgbHUtPnJlY29ubmVjdF9vcmIsCisJCQkJICAgIGx1LT5yZWNvbm5lY3Rfb3JiX2RtYSk7CisJaWYgKGx1LT5sb2dvdXRfb3JiKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGktPmhvc3QtPmRldmljZSwKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ291dF9vcmIpLAotCQkJCSAgICBzY3NpX2lkLT5sb2dvdXRfb3JiLAotCQkJCSAgICBzY3NpX2lkLT5sb2dvdXRfb3JiX2RtYSk7Ci0JCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSBsb2dvdXQgb3JiIik7Ci0JfQotCi0JaWYgKHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmIpIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwkJCQkgICAgbHUtPmxvZ291dF9vcmIsCisJCQkJICAgIGx1LT5sb2dvdXRfb3JiX2RtYSk7CisJaWYgKGx1LT5xdWVyeV9sb2dpbnNfb3JiKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGktPmhvc3QtPmRldmljZSwKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19vcmIpLAotCQkJCSAgICBzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLAotCQkJCSAgICBzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiX2RtYSk7Ci0JCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSBxdWVyeSBsb2dpbnMgb3JiIik7Ci0JfQotCi0JaWYgKHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZSkgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhpLT5ob3N0LT5wZGV2LAorCQkJCSAgICBsdS0+cXVlcnlfbG9naW5zX29yYiwKKwkJCQkgICAgbHUtPnF1ZXJ5X2xvZ2luc19vcmJfZG1hKTsKKwlpZiAobHUtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmhpLT5ob3N0LT5kZXZpY2UsCiAJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfcmVzcG9uc2UpLAotCQkJCSAgICBzY3NpX2lkLT5xdWVyeV9sb2dpbnNfcmVzcG9uc2UsCi0JCQkJICAgIHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZV9kbWEpOwotCQlTQlAyX0RNQV9GUkVFKCJzaW5nbGUgcXVlcnkgbG9naW5zIGRhdGEiKTsKLQl9CisJCQkJICAgIGx1LT5xdWVyeV9sb2dpbnNfcmVzcG9uc2UsCisJCQkJICAgIGx1LT5xdWVyeV9sb2dpbnNfcmVzcG9uc2VfZG1hKTsKIAotCWlmIChzY3NpX2lkLT5zdGF0dXNfZmlmb19hZGRyICE9IENTUjEyMTJfSU5WQUxJRF9BRERSX1NQQUNFKQorCWlmIChsdS0+c3RhdHVzX2ZpZm9fYWRkciAhPSBDU1IxMjEyX0lOVkFMSURfQUREUl9TUEFDRSkKIAkJaHBzYl91bnJlZ2lzdGVyX2FkZHJzcGFjZSgmc2JwMl9oaWdobGV2ZWwsIGhpLT5ob3N0LAotCQkJCQkgIHNjc2lfaWQtPnN0YXR1c19maWZvX2FkZHIpOworCQkJCQkgIGx1LT5zdGF0dXNfZmlmb19hZGRyKTsKIAotCXNjc2lfaWQtPnVkLT5kZXZpY2UuZHJpdmVyX2RhdGEgPSBOVUxMOworCWx1LT51ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhID0gTlVMTDsKIAogCWlmIChoaSkKIAkJbW9kdWxlX3B1dChoaS0+aG9zdC0+ZHJpdmVyLT5vd25lcik7CiAKLQlTQlAyX0RFQlVHKCJTQlAtMiBkZXZpY2UgcmVtb3ZlZCwgU0NTSSBJRCA9ICVkIiwgc2NzaV9pZC0+dWQtPmlkKTsKLQotCWtmcmVlKHNjc2lfaWQpOworCWtmcmVlKGx1KTsKIH0KIAogI2lmZGVmIENPTkZJR19JRUVFMTM5NF9TQlAyX1BIWVNfRE1BCiAvKgotICogVGhpcyBmdW5jdGlvbiBkZWFscyB3aXRoIHBoeXNpY2FsIGRtYSB3cml0ZSByZXF1ZXN0cyAoZm9yIGFkYXB0ZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQKLSAqIHBoeXNpY2FsIGRtYSBpbiBoYXJkd2FyZSkuIE1vc3RseSBqdXN0IGhlcmUgZm9yIGRlYnVnZ2luZy4uLgorICogRGVhbCB3aXRoIHdyaXRlIHJlcXVlc3RzIG9uIGFkYXB0ZXJzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHBoeXNpY2FsIERNQSBvcgorICogaGF2ZSBpdCBzd2l0Y2hlZCBvZmYuCiAgKi8KIHN0YXRpYyBpbnQgc2JwMl9oYW5kbGVfcGh5c2RtYV93cml0ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLAogCQkJCSAgICAgaW50IGRlc3RpZCwgcXVhZGxldF90ICpkYXRhLCB1NjQgYWRkciwKIAkJCQkgICAgIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncykKIHsKLQotCS8qCi0JICogTWFudWFsbHkgcHV0IHRoZSBkYXRhIGluIHRoZSByaWdodCBwbGFjZS4KLQkgKi8KIAltZW1jcHkoYnVzX3RvX3ZpcnQoKHUzMikgYWRkciksIGRhdGEsIGxlbmd0aCk7Ci0Jc2JwMnV0aWxfcGFja2V0X2R1bXAoZGF0YSwgbGVuZ3RoLCAic2JwMiBwaHlzIGRtYSB3cml0ZSBieSBkZXZpY2UiLAotCQkJICAgICAodTMyKSBhZGRyKTsKIAlyZXR1cm4gUkNPREVfQ09NUExFVEU7CiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGRlYWxzIHdpdGggcGh5c2ljYWwgZG1hIHJlYWQgcmVxdWVzdHMgKGZvciBhZGFwdGVycyB0aGF0IGRvIG5vdCBzdXBwb3J0Ci0gKiBwaHlzaWNhbCBkbWEgaW4gaGFyZHdhcmUpLiBNb3N0bHkganVzdCBoZXJlIGZvciBkZWJ1Z2dpbmcuLi4KKyAqIERlYWwgd2l0aCByZWFkIHJlcXVlc3RzIG9uIGFkYXB0ZXJzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHBoeXNpY2FsIERNQSBvcgorICogaGF2ZSBpdCBzd2l0Y2hlZCBvZmYuCiAgKi8KIHN0YXRpYyBpbnQgc2JwMl9oYW5kbGVfcGh5c2RtYV9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsCiAJCQkJICAgIHF1YWRsZXRfdCAqZGF0YSwgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsCiAJCQkJICAgIHUxNiBmbGFncykKIHsKLQotCS8qCi0JICogR3JhYiBkYXRhIGZyb20gbWVtb3J5IGFuZCBzZW5kIGEgcmVhZCByZXNwb25zZS4KLQkgKi8KIAltZW1jcHkoZGF0YSwgYnVzX3RvX3ZpcnQoKHUzMikgYWRkciksIGxlbmd0aCk7Ci0Jc2JwMnV0aWxfcGFja2V0X2R1bXAoZGF0YSwgbGVuZ3RoLCAic2JwMiBwaHlzIGRtYSByZWFkIGJ5IGRldmljZSIsCi0JCQkgICAgICh1MzIpIGFkZHIpOwogCXJldHVybiBSQ09ERV9DT01QTEVURTsKIH0KICNlbmRpZgpAQCAtMTE5Miw3NCArMTAwMSw2OSBAQAogICogU0JQLTIgcHJvdG9jb2wgcmVsYXRlZCBzZWN0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHF1ZXJpZXMgdGhlIGRldmljZSBmb3IgdGhlIG1heGltdW0gY29uY3VycmVudCBsb2dpbnMgaXQKLSAqIHN1cHBvcnRzLgotICovCi1zdGF0aWMgaW50IHNicDJfcXVlcnlfbG9naW5zKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpCitzdGF0aWMgaW50IHNicDJfcXVlcnlfbG9naW5zKHN0cnVjdCBzYnAyX2x1ICpsdSkKIHsKLQlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOworCXN0cnVjdCBzYnAyX2Z3aG9zdF9pbmZvICpoaSA9IGx1LT5oaTsKIAlxdWFkbGV0X3QgZGF0YVsyXTsKIAlpbnQgbWF4X2xvZ2luczsKIAlpbnQgYWN0aXZlX2xvZ2luczsKIAotCVNCUDJfREVCVUdfRU5URVIoKTsKKwlsdS0+cXVlcnlfbG9naW5zX29yYi0+cmVzZXJ2ZWQxID0gMHgwOworCWx1LT5xdWVyeV9sb2dpbnNfb3JiLT5yZXNlcnZlZDIgPSAweDA7CiAKLQlzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLT5yZXNlcnZlZDEgPSAweDA7Ci0Jc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYi0+cmVzZXJ2ZWQyID0gMHgwOworCWx1LT5xdWVyeV9sb2dpbnNfb3JiLT5xdWVyeV9yZXNwb25zZV9sbyA9IGx1LT5xdWVyeV9sb2dpbnNfcmVzcG9uc2VfZG1hOworCWx1LT5xdWVyeV9sb2dpbnNfb3JiLT5xdWVyeV9yZXNwb25zZV9oaSA9CisJCQlPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpOworCWx1LT5xdWVyeV9sb2dpbnNfb3JiLT5sdW5fbWlzYyA9CisJCQlPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfUVVFUllfTE9HSU5TX1JFUVVFU1QpOworCWx1LT5xdWVyeV9sb2dpbnNfb3JiLT5sdW5fbWlzYyB8PSBPUkJfU0VUX05PVElGWSgxKTsKKwlsdS0+cXVlcnlfbG9naW5zX29yYi0+bHVuX21pc2MgfD0gT1JCX1NFVF9MVU4obHUtPmx1bik7CiAKLQlzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLT5xdWVyeV9yZXNwb25zZV9sbyA9IHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZV9kbWE7Ci0Jc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYi0+cXVlcnlfcmVzcG9uc2VfaGkgPSBPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpOworCWx1LT5xdWVyeV9sb2dpbnNfb3JiLT5yZXNlcnZlZF9yZXNwX2xlbmd0aCA9CisJCU9SQl9TRVRfUVVFUllfTE9HSU5TX1JFU1BfTEVOR1RIKAorCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19yZXNwb25zZSkpOwogCi0Jc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYi0+bHVuX21pc2MgPSBPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfUVVFUllfTE9HSU5TX1JFUVVFU1QpOwotCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmItPmx1bl9taXNjIHw9IE9SQl9TRVRfTk9USUZZKDEpOwotCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmItPmx1bl9taXNjIHw9IE9SQl9TRVRfTFVOKHNjc2lfaWQtPnNicDJfbHVuKTsKKwlsdS0+cXVlcnlfbG9naW5zX29yYi0+c3RhdHVzX2ZpZm9faGkgPQorCQlPUkJfU0VUX1NUQVRVU19GSUZPX0hJKGx1LT5zdGF0dXNfZmlmb19hZGRyLCBoaS0+aG9zdC0+bm9kZV9pZCk7CisJbHUtPnF1ZXJ5X2xvZ2luc19vcmItPnN0YXR1c19maWZvX2xvID0KKwkJT1JCX1NFVF9TVEFUVVNfRklGT19MTyhsdS0+c3RhdHVzX2ZpZm9fYWRkcik7CiAKLQlzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLT5yZXNlcnZlZF9yZXNwX2xlbmd0aCA9Ci0JCU9SQl9TRVRfUVVFUllfTE9HSU5TX1JFU1BfTEVOR1RIKHNpemVvZihzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfcmVzcG9uc2UpKTsKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIobHUtPnF1ZXJ5X2xvZ2luc19vcmIsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfb3JiKSk7CiAKLQlzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLT5zdGF0dXNfZmlmb19oaSA9Ci0JCU9SQl9TRVRfU1RBVFVTX0ZJRk9fSEkoc2NzaV9pZC0+c3RhdHVzX2ZpZm9fYWRkciwgaGktPmhvc3QtPm5vZGVfaWQpOwotCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmItPnN0YXR1c19maWZvX2xvID0KLQkJT1JCX1NFVF9TVEFUVVNfRklGT19MTyhzY3NpX2lkLT5zdGF0dXNfZmlmb19hZGRyKTsKLQotCXNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcihzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfcXVlcnlfbG9naW5zX29yYikpOwotCi0Jc2JwMnV0aWxfcGFja2V0X2R1bXAoc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYiwgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19vcmIpLAotCQkJICAgICAic2JwMiBxdWVyeSBsb2dpbnMgb3JiIiwgc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYl9kbWEpOwotCi0JbWVtc2V0KHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZSwgMCwgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19yZXNwb25zZSkpOworCW1lbXNldChsdS0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNicDJfcXVlcnlfbG9naW5zX3Jlc3BvbnNlKSk7CiAKIAlkYXRhWzBdID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKLQlkYXRhWzFdID0gc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYl9kbWE7CisJZGF0YVsxXSA9IGx1LT5xdWVyeV9sb2dpbnNfb3JiX2RtYTsKIAlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoZGF0YSwgOCk7CiAKLQlocHNiX25vZGVfd3JpdGUoc2NzaV9pZC0+bmUsIHNjc2lfaWQtPnNicDJfbWFuYWdlbWVudF9hZ2VudF9hZGRyLCBkYXRhLCA4KTsKKwlocHNiX25vZGVfd3JpdGUobHUtPm5lLCBsdS0+bWFuYWdlbWVudF9hZ2VudF9hZGRyLCBkYXRhLCA4KTsKIAotCWlmIChzYnAydXRpbF9hY2Nlc3NfdGltZW91dChzY3NpX2lkLCAyKkhaKSkgeworCWlmIChzYnAydXRpbF9hY2Nlc3NfdGltZW91dChsdSwgMipIWikpIHsKIAkJU0JQMl9JTkZPKCJFcnJvciBxdWVyeWluZyBsb2dpbnMgdG8gU0JQLTIgZGV2aWNlIC0gdGltZWQgb3V0Iik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmIChzY3NpX2lkLT5zdGF0dXNfYmxvY2suT1JCX29mZnNldF9sbyAhPSBzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiX2RtYSkgeworCWlmIChsdS0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfbG8gIT0gbHUtPnF1ZXJ5X2xvZ2luc19vcmJfZG1hKSB7CiAJCVNCUDJfSU5GTygiRXJyb3IgcXVlcnlpbmcgbG9naW5zIHRvIFNCUC0yIGRldmljZSAtIHRpbWVkIG91dCIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAoU1RBVFVTX1RFU1RfUkRTKHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2hpX21pc2MpKSB7CisJaWYgKFNUQVRVU19URVNUX1JEUyhsdS0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfaGlfbWlzYykpIHsKIAkJU0JQMl9JTkZPKCJFcnJvciBxdWVyeWluZyBsb2dpbnMgdG8gU0JQLTIgZGV2aWNlIC0gZmFpbGVkIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCXNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcihzY3NpX2lkLT5xdWVyeV9sb2dpbnNfcmVzcG9uc2UsIHNpemVvZihzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfcmVzcG9uc2UpKTsKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIobHUtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19yZXNwb25zZSkpOwogCi0JU0JQMl9ERUJVRygibGVuZ3RoX21heF9sb2dpbnMgPSAleCIsCi0JCSAgICh1bnNpZ25lZCBpbnQpc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlLT5sZW5ndGhfbWF4X2xvZ2lucyk7Ci0KLQltYXhfbG9naW5zID0gUkVTUE9OU0VfR0VUX01BWF9MT0dJTlMoc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlLT5sZW5ndGhfbWF4X2xvZ2lucyk7CisJbWF4X2xvZ2lucyA9IFJFU1BPTlNFX0dFVF9NQVhfTE9HSU5TKAorCQkJbHUtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZS0+bGVuZ3RoX21heF9sb2dpbnMpOwogCVNCUDJfSU5GTygiTWF4aW11bSBjb25jdXJyZW50IGxvZ2lucyBzdXBwb3J0ZWQ6ICVkIiwgbWF4X2xvZ2lucyk7CiAKLQlhY3RpdmVfbG9naW5zID0gUkVTUE9OU0VfR0VUX0FDVElWRV9MT0dJTlMoc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlLT5sZW5ndGhfbWF4X2xvZ2lucyk7CisJYWN0aXZlX2xvZ2lucyA9IFJFU1BPTlNFX0dFVF9BQ1RJVkVfTE9HSU5TKAorCQkJbHUtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZS0+bGVuZ3RoX21heF9sb2dpbnMpOwogCVNCUDJfSU5GTygiTnVtYmVyIG9mIGFjdGl2ZSBsb2dpbnM6ICVkIiwgYWN0aXZlX2xvZ2lucyk7CiAKIAlpZiAoYWN0aXZlX2xvZ2lucyA+PSBtYXhfbG9naW5zKSB7CkBAIC0xMjY5LDMzMiArMTA3MywyMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIGxvZ2luIHRvIGEgcGFydGljdWxhciBTQlAtMiBkZXZpY2UsCi0gKiBhZnRlciBhIGJ1cyByZXNldC4KLSAqLwotc3RhdGljIGludCBzYnAyX2xvZ2luX2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQorc3RhdGljIGludCBzYnAyX2xvZ2luX2RldmljZShzdHJ1Y3Qgc2JwMl9sdSAqbHUpCiB7Ci0Jc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGkgPSBzY3NpX2lkLT5oaTsKKwlzdHJ1Y3Qgc2JwMl9md2hvc3RfaW5mbyAqaGkgPSBsdS0+aGk7CiAJcXVhZGxldF90IGRhdGFbMl07CiAKLQlTQlAyX0RFQlVHX0VOVEVSKCk7CisJaWYgKCFsdS0+bG9naW5fb3JiKQorCQlyZXR1cm4gLUVJTzsKIAotCWlmICghc2NzaV9pZC0+bG9naW5fb3JiKSB7Ci0JCVNCUDJfREVCVUcoIiVzOiBsb2dpbl9vcmIgbm90IGFsbG9jJ2QhIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoIXNicDJfZXhjbHVzaXZlX2xvZ2luICYmIHNicDJfcXVlcnlfbG9naW5zKGx1KSkgeworCQlTQlAyX0lORk8oIkRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGFueSBtb3JlIGNvbmN1cnJlbnQgbG9naW5zIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmICghZXhjbHVzaXZlX2xvZ2luKSB7Ci0JCWlmIChzYnAyX3F1ZXJ5X2xvZ2lucyhzY3NpX2lkKSkgewotCQkJU0JQMl9JTkZPKCJEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbW9yZSBjb25jdXJyZW50IGxvZ2lucyIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9CisJLyogYXNzdW1lIG5vIHBhc3N3b3JkICovCisJbHUtPmxvZ2luX29yYi0+cGFzc3dvcmRfaGkgPSAwOworCWx1LT5sb2dpbl9vcmItPnBhc3N3b3JkX2xvID0gMDsKIAotCS8qIFNldC11cCBsb2dpbiBPUkIsIGFzc3VtZSBubyBwYXNzd29yZCAqLwotCXNjc2lfaWQtPmxvZ2luX29yYi0+cGFzc3dvcmRfaGkgPSAwOwotCXNjc2lfaWQtPmxvZ2luX29yYi0+cGFzc3dvcmRfbG8gPSAwOworCWx1LT5sb2dpbl9vcmItPmxvZ2luX3Jlc3BvbnNlX2xvID0gbHUtPmxvZ2luX3Jlc3BvbnNlX2RtYTsKKwlsdS0+bG9naW5fb3JiLT5sb2dpbl9yZXNwb25zZV9oaSA9IE9SQl9TRVRfTk9ERV9JRChoaS0+aG9zdC0+bm9kZV9pZCk7CisJbHUtPmxvZ2luX29yYi0+bHVuX21pc2MgPSBPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfTE9HSU5fUkVRVUVTVCk7CiAKLQlzY3NpX2lkLT5sb2dpbl9vcmItPmxvZ2luX3Jlc3BvbnNlX2xvID0gc2NzaV9pZC0+bG9naW5fcmVzcG9uc2VfZG1hOwotCXNjc2lfaWQtPmxvZ2luX29yYi0+bG9naW5fcmVzcG9uc2VfaGkgPSBPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpOworCS8qIG9uZSBzZWNvbmQgcmVjb25uZWN0IHRpbWUgKi8KKwlsdS0+bG9naW5fb3JiLT5sdW5fbWlzYyB8PSBPUkJfU0VUX1JFQ09OTkVDVCgwKTsKKwlsdS0+bG9naW5fb3JiLT5sdW5fbWlzYyB8PSBPUkJfU0VUX0VYQ0xVU0lWRShzYnAyX2V4Y2x1c2l2ZV9sb2dpbik7CisJbHUtPmxvZ2luX29yYi0+bHVuX21pc2MgfD0gT1JCX1NFVF9OT1RJRlkoMSk7CisJbHUtPmxvZ2luX29yYi0+bHVuX21pc2MgfD0gT1JCX1NFVF9MVU4obHUtPmx1bik7CiAKLQlzY3NpX2lkLT5sb2dpbl9vcmItPmx1bl9taXNjID0gT1JCX1NFVF9GVU5DVElPTihTQlAyX0xPR0lOX1JFUVVFU1QpOwotCXNjc2lfaWQtPmxvZ2luX29yYi0+bHVuX21pc2MgfD0gT1JCX1NFVF9SRUNPTk5FQ1QoMCk7CS8qIE9uZSBzZWNvbmQgcmVjb25uZWN0IHRpbWUgKi8KLQlzY3NpX2lkLT5sb2dpbl9vcmItPmx1bl9taXNjIHw9IE9SQl9TRVRfRVhDTFVTSVZFKGV4Y2x1c2l2ZV9sb2dpbik7CS8qIEV4Y2x1c2l2ZSBhY2Nlc3MgdG8gZGV2aWNlICovCi0Jc2NzaV9pZC0+bG9naW5fb3JiLT5sdW5fbWlzYyB8PSBPUkJfU0VUX05PVElGWSgxKTsJLyogTm90aWZ5IHVzIG9mIGxvZ2luIGNvbXBsZXRlICovCi0Jc2NzaV9pZC0+bG9naW5fb3JiLT5sdW5fbWlzYyB8PSBPUkJfU0VUX0xVTihzY3NpX2lkLT5zYnAyX2x1bik7Ci0KLQlzY3NpX2lkLT5sb2dpbl9vcmItPnBhc3N3ZF9yZXNwX2xlbmd0aHMgPQorCWx1LT5sb2dpbl9vcmItPnBhc3N3ZF9yZXNwX2xlbmd0aHMgPQogCQlPUkJfU0VUX0xPR0lOX1JFU1BfTEVOR1RIKHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dpbl9yZXNwb25zZSkpOwogCi0Jc2NzaV9pZC0+bG9naW5fb3JiLT5zdGF0dXNfZmlmb19oaSA9Ci0JCU9SQl9TRVRfU1RBVFVTX0ZJRk9fSEkoc2NzaV9pZC0+c3RhdHVzX2ZpZm9fYWRkciwgaGktPmhvc3QtPm5vZGVfaWQpOwotCXNjc2lfaWQtPmxvZ2luX29yYi0+c3RhdHVzX2ZpZm9fbG8gPQotCQlPUkJfU0VUX1NUQVRVU19GSUZPX0xPKHNjc2lfaWQtPnN0YXR1c19maWZvX2FkZHIpOworCWx1LT5sb2dpbl9vcmItPnN0YXR1c19maWZvX2hpID0KKwkJT1JCX1NFVF9TVEFUVVNfRklGT19ISShsdS0+c3RhdHVzX2ZpZm9fYWRkciwgaGktPmhvc3QtPm5vZGVfaWQpOworCWx1LT5sb2dpbl9vcmItPnN0YXR1c19maWZvX2xvID0KKwkJT1JCX1NFVF9TVEFUVVNfRklGT19MTyhsdS0+c3RhdHVzX2ZpZm9fYWRkcik7CiAKLQlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NzaV9pZC0+bG9naW5fb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfbG9naW5fb3JiKSk7CisJc2JwMnV0aWxfY3B1X3RvX2JlMzJfYnVmZmVyKGx1LT5sb2dpbl9vcmIsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dpbl9vcmIpKTsKIAotCXNicDJ1dGlsX3BhY2tldF9kdW1wKHNjc2lfaWQtPmxvZ2luX29yYiwgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX29yYiksCi0JCQkgICAgICJzYnAyIGxvZ2luIG9yYiIsIHNjc2lfaWQtPmxvZ2luX29yYl9kbWEpOwotCi0JbWVtc2V0KHNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IHNicDJfbG9naW5fcmVzcG9uc2UpKTsKKwltZW1zZXQobHUtPmxvZ2luX3Jlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IHNicDJfbG9naW5fcmVzcG9uc2UpKTsKIAogCWRhdGFbMF0gPSBPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpOwotCWRhdGFbMV0gPSBzY3NpX2lkLT5sb2dpbl9vcmJfZG1hOworCWRhdGFbMV0gPSBsdS0+bG9naW5fb3JiX2RtYTsKIAlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoZGF0YSwgOCk7CiAKLQlocHNiX25vZGVfd3JpdGUoc2NzaV9pZC0+bmUsIHNjc2lfaWQtPnNicDJfbWFuYWdlbWVudF9hZ2VudF9hZGRyLCBkYXRhLCA4KTsKKwlocHNiX25vZGVfd3JpdGUobHUtPm5lLCBsdS0+bWFuYWdlbWVudF9hZ2VudF9hZGRyLCBkYXRhLCA4KTsKIAotCS8qCi0JICogV2FpdCBmb3IgbG9naW4gc3RhdHVzICh1cCB0byAyMCBzZWNvbmRzKS4uLgotCSAqLwotCWlmIChzYnAydXRpbF9hY2Nlc3NfdGltZW91dChzY3NpX2lkLCAyMCpIWikpIHsKKwkvKiB3YWl0IHVwIHRvIDIwIHNlY29uZHMgZm9yIGxvZ2luIHN0YXR1cyAqLworCWlmIChzYnAydXRpbF9hY2Nlc3NfdGltZW91dChsdSwgMjAqSFopKSB7CiAJCVNCUDJfRVJSKCJFcnJvciBsb2dnaW5nIGludG8gU0JQLTIgZGV2aWNlIC0gdGltZWQgb3V0Iik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCS8qCi0JICogU2FuaXR5LiBNYWtlIHN1cmUgc3RhdHVzIHJldHVybmVkIG1hdGNoZXMgbG9naW4gb3JiLgotCSAqLwotCWlmIChzY3NpX2lkLT5zdGF0dXNfYmxvY2suT1JCX29mZnNldF9sbyAhPSBzY3NpX2lkLT5sb2dpbl9vcmJfZG1hKSB7CisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIHJldHVybmVkIHN0YXR1cyBtYXRjaGVzIHRoZSBsb2dpbiBPUkIgKi8KKwlpZiAobHUtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2xvICE9IGx1LT5sb2dpbl9vcmJfZG1hKSB7CiAJCVNCUDJfRVJSKCJFcnJvciBsb2dnaW5nIGludG8gU0JQLTIgZGV2aWNlIC0gdGltZWQgb3V0Iik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmIChTVEFUVVNfVEVTVF9SRFMoc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfaGlfbWlzYykpIHsKKwlpZiAoU1RBVFVTX1RFU1RfUkRTKGx1LT5zdGF0dXNfYmxvY2suT1JCX29mZnNldF9oaV9taXNjKSkgewogCQlTQlAyX0VSUigiRXJyb3IgbG9nZ2luZyBpbnRvIFNCUC0yIGRldmljZSAtIGZhaWxlZCIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvKgotCSAqIEJ5dGUgc3dhcCB0aGUgbG9naW4gcmVzcG9uc2UsIGZvciB1c2Ugd2hlbiByZWNvbm5lY3Rpbmcgb3IKLQkgKiBsb2dnaW5nIG91dC4KLQkgKi8KLQlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UsIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dpbl9yZXNwb25zZSkpOwotCi0JLyoKLQkgKiBHcmFiIG91ciBjb21tYW5kIGJsb2NrIGFnZW50IGFkZHJlc3MgZnJvbSB0aGUgbG9naW4gcmVzcG9uc2UuCi0JICovCi0JU0JQMl9ERUJVRygiY29tbWFuZF9ibG9ja19hZ2VudF9oaSA9ICV4IiwKLQkJICAgKHVuc2lnbmVkIGludClzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+Y29tbWFuZF9ibG9ja19hZ2VudF9oaSk7Ci0JU0JQMl9ERUJVRygiY29tbWFuZF9ibG9ja19hZ2VudF9sbyA9ICV4IiwKLQkJICAgKHVuc2lnbmVkIGludClzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+Y29tbWFuZF9ibG9ja19hZ2VudF9sbyk7Ci0KLQlzY3NpX2lkLT5zYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkciA9Ci0JCSgodTY0KXNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlLT5jb21tYW5kX2Jsb2NrX2FnZW50X2hpKSA8PCAzMjsKLQlzY3NpX2lkLT5zYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkciB8PSAoKHU2NClzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+Y29tbWFuZF9ibG9ja19hZ2VudF9sbyk7Ci0Jc2NzaV9pZC0+c2JwMl9jb21tYW5kX2Jsb2NrX2FnZW50X2FkZHIgJj0gMHgwMDAwZmZmZmZmZmZmZmZmVUxMOworCXNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcihsdS0+bG9naW5fcmVzcG9uc2UsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dpbl9yZXNwb25zZSkpOworCWx1LT5jb21tYW5kX2Jsb2NrX2FnZW50X2FkZHIgPQorCQkJKCh1NjQpbHUtPmxvZ2luX3Jlc3BvbnNlLT5jb21tYW5kX2Jsb2NrX2FnZW50X2hpKSA8PCAzMjsKKwlsdS0+Y29tbWFuZF9ibG9ja19hZ2VudF9hZGRyIHw9CisJCQkoKHU2NClsdS0+bG9naW5fcmVzcG9uc2UtPmNvbW1hbmRfYmxvY2tfYWdlbnRfbG8pOworCWx1LT5jb21tYW5kX2Jsb2NrX2FnZW50X2FkZHIgJj0gMHgwMDAwZmZmZmZmZmZmZmZmVUxMOwogCiAJU0JQMl9JTkZPKCJMb2dnZWQgaW50byBTQlAtMiBkZXZpY2UiKTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIGxvZ291dCBmcm9tIGEgcGFydGljdWxhciBTQlAtMgotICogZGV2aWNlLCB1c3VhbGx5IGNhbGxlZCBkdXJpbmcgZHJpdmVyIHVubG9hZC4KLSAqLwotc3RhdGljIGludCBzYnAyX2xvZ291dF9kZXZpY2Uoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCkKK3N0YXRpYyBpbnQgc2JwMl9sb2dvdXRfZGV2aWNlKHN0cnVjdCBzYnAyX2x1ICpsdSkKIHsKLQlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOworCXN0cnVjdCBzYnAyX2Z3aG9zdF9pbmZvICpoaSA9IGx1LT5oaTsKIAlxdWFkbGV0X3QgZGF0YVsyXTsKIAlpbnQgZXJyb3I7CiAKLQlTQlAyX0RFQlVHX0VOVEVSKCk7CisJbHUtPmxvZ291dF9vcmItPnJlc2VydmVkMSA9IDB4MDsKKwlsdS0+bG9nb3V0X29yYi0+cmVzZXJ2ZWQyID0gMHgwOworCWx1LT5sb2dvdXRfb3JiLT5yZXNlcnZlZDMgPSAweDA7CisJbHUtPmxvZ291dF9vcmItPnJlc2VydmVkNCA9IDB4MDsKIAotCS8qCi0JICogU2V0LXVwIGxvZ291dCBPUkIKLQkgKi8KLQlzY3NpX2lkLT5sb2dvdXRfb3JiLT5yZXNlcnZlZDEgPSAweDA7Ci0Jc2NzaV9pZC0+bG9nb3V0X29yYi0+cmVzZXJ2ZWQyID0gMHgwOwotCXNjc2lfaWQtPmxvZ291dF9vcmItPnJlc2VydmVkMyA9IDB4MDsKLQlzY3NpX2lkLT5sb2dvdXRfb3JiLT5yZXNlcnZlZDQgPSAweDA7CisJbHUtPmxvZ291dF9vcmItPmxvZ2luX0lEX21pc2MgPSBPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfTE9HT1VUX1JFUVVFU1QpOworCWx1LT5sb2dvdXRfb3JiLT5sb2dpbl9JRF9taXNjIHw9CisJCQlPUkJfU0VUX0xPR0lOX0lEKGx1LT5sb2dpbl9yZXNwb25zZS0+bGVuZ3RoX2xvZ2luX0lEKTsKKwlsdS0+bG9nb3V0X29yYi0+bG9naW5fSURfbWlzYyB8PSBPUkJfU0VUX05PVElGWSgxKTsKIAotCXNjc2lfaWQtPmxvZ291dF9vcmItPmxvZ2luX0lEX21pc2MgPSBPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfTE9HT1VUX1JFUVVFU1QpOwotCXNjc2lfaWQtPmxvZ291dF9vcmItPmxvZ2luX0lEX21pc2MgfD0gT1JCX1NFVF9MT0dJTl9JRChzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+bGVuZ3RoX2xvZ2luX0lEKTsKKwlsdS0+bG9nb3V0X29yYi0+cmVzZXJ2ZWQ1ID0gMHgwOworCWx1LT5sb2dvdXRfb3JiLT5zdGF0dXNfZmlmb19oaSA9CisJCU9SQl9TRVRfU1RBVFVTX0ZJRk9fSEkobHUtPnN0YXR1c19maWZvX2FkZHIsIGhpLT5ob3N0LT5ub2RlX2lkKTsKKwlsdS0+bG9nb3V0X29yYi0+c3RhdHVzX2ZpZm9fbG8gPQorCQlPUkJfU0VUX1NUQVRVU19GSUZPX0xPKGx1LT5zdGF0dXNfZmlmb19hZGRyKTsKIAotCS8qIE5vdGlmeSB1cyB3aGVuIGNvbXBsZXRlICovCi0Jc2NzaV9pZC0+bG9nb3V0X29yYi0+bG9naW5fSURfbWlzYyB8PSBPUkJfU0VUX05PVElGWSgxKTsKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIobHUtPmxvZ291dF9vcmIsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dvdXRfb3JiKSk7CiAKLQlzY3NpX2lkLT5sb2dvdXRfb3JiLT5yZXNlcnZlZDUgPSAweDA7Ci0Jc2NzaV9pZC0+bG9nb3V0X29yYi0+c3RhdHVzX2ZpZm9faGkgPQotCQlPUkJfU0VUX1NUQVRVU19GSUZPX0hJKHNjc2lfaWQtPnN0YXR1c19maWZvX2FkZHIsIGhpLT5ob3N0LT5ub2RlX2lkKTsKLQlzY3NpX2lkLT5sb2dvdXRfb3JiLT5zdGF0dXNfZmlmb19sbyA9Ci0JCU9SQl9TRVRfU1RBVFVTX0ZJRk9fTE8oc2NzaV9pZC0+c3RhdHVzX2ZpZm9fYWRkcik7Ci0KLQkvKgotCSAqIEJ5dGUgc3dhcCBPUkIgaWYgbmVjZXNzYXJ5Ci0JICovCi0Jc2JwMnV0aWxfY3B1X3RvX2JlMzJfYnVmZmVyKHNjc2lfaWQtPmxvZ291dF9vcmIsIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dvdXRfb3JiKSk7Ci0KLQlzYnAydXRpbF9wYWNrZXRfZHVtcChzY3NpX2lkLT5sb2dvdXRfb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfbG9nb3V0X29yYiksCi0JCQkgICAgICJzYnAyIGxvZ291dCBvcmIiLCBzY3NpX2lkLT5sb2dvdXRfb3JiX2RtYSk7Ci0KLQkvKgotCSAqIE9rLCBsZXQncyB3cml0ZSB0byB0aGUgdGFyZ2V0J3MgbWFuYWdlbWVudCBhZ2VudCByZWdpc3RlcgotCSAqLwogCWRhdGFbMF0gPSBPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpOwotCWRhdGFbMV0gPSBzY3NpX2lkLT5sb2dvdXRfb3JiX2RtYTsKKwlkYXRhWzFdID0gbHUtPmxvZ291dF9vcmJfZG1hOwogCXNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcihkYXRhLCA4KTsKIAotCWVycm9yID0gaHBzYl9ub2RlX3dyaXRlKHNjc2lfaWQtPm5lLAotCQkJCXNjc2lfaWQtPnNicDJfbWFuYWdlbWVudF9hZ2VudF9hZGRyLCBkYXRhLCA4KTsKKwllcnJvciA9IGhwc2Jfbm9kZV93cml0ZShsdS0+bmUsIGx1LT5tYW5hZ2VtZW50X2FnZW50X2FkZHIsIGRhdGEsIDgpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JLyogV2FpdCBmb3IgZGV2aWNlIHRvIGxvZ291dC4uLjEgc2Vjb25kLiAqLwotCWlmIChzYnAydXRpbF9hY2Nlc3NfdGltZW91dChzY3NpX2lkLCBIWikpCisJLyogd2FpdCB1cCB0byAxIHNlY29uZCBmb3IgdGhlIGRldmljZSB0byBjb21wbGV0ZSBsb2dvdXQgKi8KKwlpZiAoc2JwMnV0aWxfYWNjZXNzX3RpbWVvdXQobHUsIEhaKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlTQlAyX0lORk8oIkxvZ2dlZCBvdXQgb2YgU0JQLTIgZGV2aWNlIik7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byByZWNvbm5lY3QgdG8gYSBwYXJ0aWN1bGFyIFNCUC0yCi0gKiBkZXZpY2UsIGFmdGVyIGEgYnVzIHJlc2V0LgotICovCi1zdGF0aWMgaW50IHNicDJfcmVjb25uZWN0X2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQorc3RhdGljIGludCBzYnAyX3JlY29ubmVjdF9kZXZpY2Uoc3RydWN0IHNicDJfbHUgKmx1KQogewotCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7CisJc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpID0gbHUtPmhpOwogCXF1YWRsZXRfdCBkYXRhWzJdOwogCWludCBlcnJvcjsKIAotCVNCUDJfREVCVUdfRU5URVIoKTsKKwlsdS0+cmVjb25uZWN0X29yYi0+cmVzZXJ2ZWQxID0gMHgwOworCWx1LT5yZWNvbm5lY3Rfb3JiLT5yZXNlcnZlZDIgPSAweDA7CisJbHUtPnJlY29ubmVjdF9vcmItPnJlc2VydmVkMyA9IDB4MDsKKwlsdS0+cmVjb25uZWN0X29yYi0+cmVzZXJ2ZWQ0ID0gMHgwOwogCi0JLyoKLQkgKiBTZXQtdXAgcmVjb25uZWN0IE9SQgotCSAqLwotCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPnJlc2VydmVkMSA9IDB4MDsKLQlzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiLT5yZXNlcnZlZDIgPSAweDA7Ci0Jc2NzaV9pZC0+cmVjb25uZWN0X29yYi0+cmVzZXJ2ZWQzID0gMHgwOwotCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPnJlc2VydmVkNCA9IDB4MDsKKwlsdS0+cmVjb25uZWN0X29yYi0+bG9naW5fSURfbWlzYyA9CisJCQlPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfUkVDT05ORUNUX1JFUVVFU1QpOworCWx1LT5yZWNvbm5lY3Rfb3JiLT5sb2dpbl9JRF9taXNjIHw9CisJCQlPUkJfU0VUX0xPR0lOX0lEKGx1LT5sb2dpbl9yZXNwb25zZS0+bGVuZ3RoX2xvZ2luX0lEKTsKKwlsdS0+cmVjb25uZWN0X29yYi0+bG9naW5fSURfbWlzYyB8PSBPUkJfU0VUX05PVElGWSgxKTsKIAotCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPmxvZ2luX0lEX21pc2MgPSBPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfUkVDT05ORUNUX1JFUVVFU1QpOwotCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPmxvZ2luX0lEX21pc2MgfD0KLQkJT1JCX1NFVF9MT0dJTl9JRChzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+bGVuZ3RoX2xvZ2luX0lEKTsKKwlsdS0+cmVjb25uZWN0X29yYi0+cmVzZXJ2ZWQ1ID0gMHgwOworCWx1LT5yZWNvbm5lY3Rfb3JiLT5zdGF0dXNfZmlmb19oaSA9CisJCU9SQl9TRVRfU1RBVFVTX0ZJRk9fSEkobHUtPnN0YXR1c19maWZvX2FkZHIsIGhpLT5ob3N0LT5ub2RlX2lkKTsKKwlsdS0+cmVjb25uZWN0X29yYi0+c3RhdHVzX2ZpZm9fbG8gPQorCQlPUkJfU0VUX1NUQVRVU19GSUZPX0xPKGx1LT5zdGF0dXNfZmlmb19hZGRyKTsKIAotCS8qIE5vdGlmeSB1cyB3aGVuIGNvbXBsZXRlICovCi0Jc2NzaV9pZC0+cmVjb25uZWN0X29yYi0+bG9naW5fSURfbWlzYyB8PSBPUkJfU0VUX05PVElGWSgxKTsKLQotCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPnJlc2VydmVkNSA9IDB4MDsKLQlzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiLT5zdGF0dXNfZmlmb19oaSA9Ci0JCU9SQl9TRVRfU1RBVFVTX0ZJRk9fSEkoc2NzaV9pZC0+c3RhdHVzX2ZpZm9fYWRkciwgaGktPmhvc3QtPm5vZGVfaWQpOwotCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPnN0YXR1c19maWZvX2xvID0KLQkJT1JCX1NFVF9TVEFUVVNfRklGT19MTyhzY3NpX2lkLT5zdGF0dXNfZmlmb19hZGRyKTsKLQotCS8qCi0JICogQnl0ZSBzd2FwIE9SQiBpZiBuZWNlc3NhcnkKLQkgKi8KLQlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NzaV9pZC0+cmVjb25uZWN0X29yYiwgc2l6ZW9mKHN0cnVjdCBzYnAyX3JlY29ubmVjdF9vcmIpKTsKLQotCXNicDJ1dGlsX3BhY2tldF9kdW1wKHNjc2lfaWQtPnJlY29ubmVjdF9vcmIsIHNpemVvZihzdHJ1Y3Qgc2JwMl9yZWNvbm5lY3Rfb3JiKSwKLQkJCSAgICAgInNicDIgcmVjb25uZWN0IG9yYiIsIHNjc2lfaWQtPnJlY29ubmVjdF9vcmJfZG1hKTsKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIobHUtPnJlY29ubmVjdF9vcmIsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9yZWNvbm5lY3Rfb3JiKSk7CiAKIAlkYXRhWzBdID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKLQlkYXRhWzFdID0gc2NzaV9pZC0+cmVjb25uZWN0X29yYl9kbWE7CisJZGF0YVsxXSA9IGx1LT5yZWNvbm5lY3Rfb3JiX2RtYTsKIAlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoZGF0YSwgOCk7CiAKLQllcnJvciA9IGhwc2Jfbm9kZV93cml0ZShzY3NpX2lkLT5uZSwKLQkJCQlzY3NpX2lkLT5zYnAyX21hbmFnZW1lbnRfYWdlbnRfYWRkciwgZGF0YSwgOCk7CisJZXJyb3IgPSBocHNiX25vZGVfd3JpdGUobHUtPm5lLCBsdS0+bWFuYWdlbWVudF9hZ2VudF9hZGRyLCBkYXRhLCA4KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCS8qCi0JICogV2FpdCBmb3IgcmVjb25uZWN0IHN0YXR1cyAodXAgdG8gMSBzZWNvbmQpLi4uCi0JICovCi0JaWYgKHNicDJ1dGlsX2FjY2Vzc190aW1lb3V0KHNjc2lfaWQsIEhaKSkgeworCS8qIHdhaXQgdXAgdG8gMSBzZWNvbmQgZm9yIHJlY29ubmVjdCBzdGF0dXMgKi8KKwlpZiAoc2JwMnV0aWxfYWNjZXNzX3RpbWVvdXQobHUsIEhaKSkgewogCQlTQlAyX0VSUigiRXJyb3IgcmVjb25uZWN0aW5nIHRvIFNCUC0yIGRldmljZSAtIHRpbWVkIG91dCIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvKgotCSAqIFNhbml0eS4gTWFrZSBzdXJlIHN0YXR1cyByZXR1cm5lZCBtYXRjaGVzIHJlY29ubmVjdCBvcmIuCi0JICovCi0JaWYgKHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2xvICE9IHNjc2lfaWQtPnJlY29ubmVjdF9vcmJfZG1hKSB7CisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIHJldHVybmVkIHN0YXR1cyBtYXRjaGVzIHRoZSByZWNvbm5lY3QgT1JCICovCisJaWYgKGx1LT5zdGF0dXNfYmxvY2suT1JCX29mZnNldF9sbyAhPSBsdS0+cmVjb25uZWN0X29yYl9kbWEpIHsKIAkJU0JQMl9FUlIoIkVycm9yIHJlY29ubmVjdGluZyB0byBTQlAtMiBkZXZpY2UgLSB0aW1lZCBvdXQiKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKFNUQVRVU19URVNUX1JEUyhzY3NpX2lkLT5zdGF0dXNfYmxvY2suT1JCX29mZnNldF9oaV9taXNjKSkgeworCWlmIChTVEFUVVNfVEVTVF9SRFMobHUtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2hpX21pc2MpKSB7CiAJCVNCUDJfRVJSKCJFcnJvciByZWNvbm5lY3RpbmcgdG8gU0JQLTIgZGV2aWNlIC0gZmFpbGVkIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCUhQU0JfREVCVUcoIlJlY29ubmVjdGVkIHRvIFNCUC0yIGRldmljZSIpOworCVNCUDJfSU5GTygiUmVjb25uZWN0ZWQgdG8gU0JQLTIgZGV2aWNlIik7CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBzZXQgdGhlIGJ1c3kgdGltZW91dCAobnVtYmVyIG9mCi0gKiByZXRyaWVzIHRvIGF0dGVtcHQpIG9uIHRoZSBzYnAyIGRldmljZS4KKyAqIFNldCB0aGUgdGFyZ2V0IG5vZGUncyBTaW5nbGUgUGhhc2UgUmV0cnkgbGltaXQuIEFmZmVjdHMgdGhlIHRhcmdldCdzIHJldHJ5CisgKiBiZWhhdmlvdXIgaWYgb3VyIG5vZGUgaXMgdG9vIGJ1c3kgdG8gYWNjZXB0IHJlcXVlc3RzLgogICovCi1zdGF0aWMgaW50IHNicDJfc2V0X2J1c3lfdGltZW91dChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQorc3RhdGljIGludCBzYnAyX3NldF9idXN5X3RpbWVvdXQoc3RydWN0IHNicDJfbHUgKmx1KQogewogCXF1YWRsZXRfdCBkYXRhOwogCi0JU0JQMl9ERUJVR19FTlRFUigpOwotCiAJZGF0YSA9IGNwdV90b19iZTMyKFNCUDJfQlVTWV9USU1FT1VUX1ZBTFVFKTsKLQlpZiAoaHBzYl9ub2RlX3dyaXRlKHNjc2lfaWQtPm5lLCBTQlAyX0JVU1lfVElNRU9VVF9BRERSRVNTLCAmZGF0YSwgNCkpCisJaWYgKGhwc2Jfbm9kZV93cml0ZShsdS0+bmUsIFNCUDJfQlVTWV9USU1FT1VUX0FERFJFU1MsICZkYXRhLCA0KSkKIAkJU0JQMl9FUlIoIiVzIGVycm9yIiwgX19GVU5DVElPTl9fKTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHBhcnNlIHNicDIgZGV2aWNlJ3MgY29uZmlnIHJvbSB1bml0Ci0gKiBkaXJlY3RvcnkuIFVzZWQgdG8gZGV0ZXJtaW5lIHRoaW5ncyBsaWtlIHNicDIgbWFuYWdlbWVudCBhZ2VudCBvZmZzZXQsCi0gKiBhbmQgY29tbWFuZCBzZXQgdXNlZCAoU0NTSSBvciBSQkMpLgotICovCi1zdGF0aWMgdm9pZCBzYnAyX3BhcnNlX3VuaXRfZGlyZWN0b3J5KHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCitzdGF0aWMgdm9pZCBzYnAyX3BhcnNlX3VuaXRfZGlyZWN0b3J5KHN0cnVjdCBzYnAyX2x1ICpsdSwKIAkJCQkgICAgICBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKQogewogCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3Y7CiAJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cnk7CiAJdTY0IG1hbmFnZW1lbnRfYWdlbnRfYWRkcjsKLQl1MzIgY29tbWFuZF9zZXRfc3BlY19pZCwgY29tbWFuZF9zZXQsIHVuaXRfY2hhcmFjdGVyaXN0aWNzLAotCSAgICBmaXJtd2FyZV9yZXZpc2lvbjsKKwl1MzIgdW5pdF9jaGFyYWN0ZXJpc3RpY3MsIGZpcm13YXJlX3JldmlzaW9uOwogCXVuc2lnbmVkIHdvcmthcm91bmRzOwogCWludCBpOwogCi0JU0JQMl9ERUJVR19FTlRFUigpOworCW1hbmFnZW1lbnRfYWdlbnRfYWRkciA9IDA7CisJdW5pdF9jaGFyYWN0ZXJpc3RpY3MgPSAwOworCWZpcm13YXJlX3JldmlzaW9uID0gMDsKIAotCW1hbmFnZW1lbnRfYWdlbnRfYWRkciA9IDB4MDsKLQljb21tYW5kX3NldF9zcGVjX2lkID0gMHgwOwotCWNvbW1hbmRfc2V0ID0gMHgwOwotCXVuaXRfY2hhcmFjdGVyaXN0aWNzID0gMHgwOwotCWZpcm13YXJlX3JldmlzaW9uID0gMHgwOwotCi0JLyogSGFuZGxlIGRpZmZlcmVudCBmaWVsZHMgaW4gdGhlIHVuaXQgZGlyZWN0b3J5LCBiYXNlZCBvbiBrZXlzICovCiAJY3NyMTIxMl9mb3JfZWFjaF9kaXJfZW50cnkodWQtPm5lLT5jc3IsIGt2LCB1ZC0+dWRfa3YsIGRlbnRyeSkgewogCQlzd2l0Y2ggKGt2LT5rZXkuaWQpIHsKIAkJY2FzZSBDU1IxMjEyX0tWX0lEX0RFUEVOREVOVF9JTkZPOgotCQkJaWYgKGt2LT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfQ1NSX09GRlNFVCkgewotCQkJCS8qIFNhdmUgb2ZmIHRoZSBtYW5hZ2VtZW50IGFnZW50IGFkZHJlc3MgKi8KKwkJCWlmIChrdi0+a2V5LnR5cGUgPT0gQ1NSMTIxMl9LVl9UWVBFX0NTUl9PRkZTRVQpCiAJCQkJbWFuYWdlbWVudF9hZ2VudF9hZGRyID0KIAkJCQkgICAgQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9CQVNFICsKIAkJCQkgICAgKGt2LT52YWx1ZS5jc3Jfb2Zmc2V0IDw8IDIpOwogCi0JCQkJU0JQMl9ERUJVRygic2JwMl9tYW5hZ2VtZW50X2FnZW50X2FkZHIgPSAleCIsCi0JCQkJCSAgICh1bnNpZ25lZCBpbnQpbWFuYWdlbWVudF9hZ2VudF9hZGRyKTsKLQkJCX0gZWxzZSBpZiAoa3YtPmtleS50eXBlID09IENTUjEyMTJfS1ZfVFlQRV9JTU1FRElBVEUpIHsKLQkJCQlzY3NpX2lkLT5zYnAyX2x1biA9Ci0JCQkJICAgIE9SQl9TRVRfTFVOKGt2LT52YWx1ZS5pbW1lZGlhdGUpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTQlAyX0NPTU1BTkRfU0VUX1NQRUNfSURfS0VZOgotCQkJLyogQ29tbWFuZCBzcGVjIG9yZ2FuaXphdGlvbiAqLwotCQkJY29tbWFuZF9zZXRfc3BlY19pZCA9IGt2LT52YWx1ZS5pbW1lZGlhdGU7Ci0JCQlTQlAyX0RFQlVHKCJzYnAyX2NvbW1hbmRfc2V0X3NwZWNfaWQgPSAleCIsCi0JCQkJICAgKHVuc2lnbmVkIGludCljb21tYW5kX3NldF9zcGVjX2lkKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU0JQMl9DT01NQU5EX1NFVF9LRVk6Ci0JCQkvKiBDb21tYW5kIHNldCB1c2VkIGJ5IHNicDIgZGV2aWNlICovCi0JCQljb21tYW5kX3NldCA9IGt2LT52YWx1ZS5pbW1lZGlhdGU7Ci0JCQlTQlAyX0RFQlVHKCJzYnAyX2NvbW1hbmRfc2V0ID0gJXgiLAotCQkJCSAgICh1bnNpZ25lZCBpbnQpY29tbWFuZF9zZXQpOworCQkJZWxzZSBpZiAoa3YtPmtleS50eXBlID09IENTUjEyMTJfS1ZfVFlQRV9JTU1FRElBVEUpCisJCQkJbHUtPmx1biA9IE9SQl9TRVRfTFVOKGt2LT52YWx1ZS5pbW1lZGlhdGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQlAyX1VOSVRfQ0hBUkFDVEVSSVNUSUNTX0tFWToKLQkJCS8qCi0JCQkgKiBVbml0IGNoYXJhY3RlcmlzaXRjcyAob3JiIHJlbGF0ZWQgc3R1ZmYKLQkJCSAqIHRoYXQgSSdtIG5vdCB5ZXQgcGF5aW5nIGF0dGVudGlvbiB0bykKLQkJCSAqLworCQkJLyogRklYTUU6IFRoaXMgaXMgaWdub3JlZCBzbyBmYXIuCisJCQkgKiBTZWUgU0JQLTIgY2xhdXNlIDcuNC44LiAqLwogCQkJdW5pdF9jaGFyYWN0ZXJpc3RpY3MgPSBrdi0+dmFsdWUuaW1tZWRpYXRlOwotCQkJU0JQMl9ERUJVRygic2JwMl91bml0X2NoYXJhY3RlcmlzdGljcyA9ICV4IiwKLQkJCQkgICAodW5zaWduZWQgaW50KXVuaXRfY2hhcmFjdGVyaXN0aWNzKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0JQMl9GSVJNV0FSRV9SRVZJU0lPTl9LRVk6Ci0JCQkvKiBGaXJtd2FyZSByZXZpc2lvbiAqLwogCQkJZmlybXdhcmVfcmV2aXNpb24gPSBrdi0+dmFsdWUuaW1tZWRpYXRlOwotCQkJU0JQMl9ERUJVRygic2JwMl9maXJtd2FyZV9yZXZpc2lvbiA9ICV4IiwKLQkJCQkgICAodW5zaWduZWQgaW50KWZpcm13YXJlX3JldmlzaW9uKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CisJCQkvKiBGSVhNRTogQ2hlY2sgZm9yIFNCUDJfREVWSUNFX1RZUEVfQU5EX0xVTl9LRVkuCisJCQkgKiBJdHMgIm9yZGVyZWQiIGJpdCBoYXMgY29uc2VxdWVuY2VzIGZvciBjb21tYW5kIE9SQgorCQkJICogbGlzdCBoYW5kbGluZy4gU2VlIFNCUC0yIGNsYXVzZXMgNC42LCA3LjQuMTEsIDEwLjIgKi8KIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTYyNiwyOCArMTMyOSwyNCBAQAogCS8qIFdlIHdvdWxkIG5lZWQgb25lIFNDU0kgaG9zdCB0ZW1wbGF0ZSBmb3IgZWFjaCB0YXJnZXQgdG8gYWRqdXN0CiAJICogbWF4X3NlY3RvcnMgb24gdGhlIGZseSwgdGhlcmVmb3JlIHdhcm4gb25seS4gKi8KIAlpZiAod29ya2Fyb3VuZHMgJiBTQlAyX1dPUktBUk9VTkRfMTI4S19NQVhfVFJBTlMgJiYKLQkgICAgKG1heF9zZWN0b3JzICogNTEyKSA+ICgxMjggKiAxMDI0KSkKLQkJU0JQMl9XQVJOKCJOb2RlICIgTk9ERV9CVVNfRk1UICI6IEJyaWRnZSBvbmx5IHN1cHBvcnRzIDEyOEtCICIKKwkgICAgKHNicDJfbWF4X3NlY3RvcnMgKiA1MTIpID4gKDEyOCAqIDEwMjQpKQorCQlTQlAyX0lORk8oIk5vZGUgIiBOT0RFX0JVU19GTVQgIjogQnJpZGdlIG9ubHkgc3VwcG9ydHMgMTI4S0IgIgogCQkJICAibWF4IHRyYW5zZmVyIHNpemUuIFdBUk5JTkc6IEN1cnJlbnQgbWF4X3NlY3RvcnMgIgogCQkJICAic2V0dGluZyBpcyBsYXJnZXIgdGhhbiAxMjhLQiAoJWQgc2VjdG9ycykiLAogCQkJICBOT0RFX0JVU19BUkdTKHVkLT5uZS0+aG9zdCwgdWQtPm5lLT5ub2RlaWQpLAotCQkJICBtYXhfc2VjdG9ycyk7CisJCQkgIHNicDJfbWF4X3NlY3RvcnMpOwogCiAJLyogSWYgdGhpcyBpcyBhIGxvZ2ljYWwgdW5pdCBkaXJlY3RvcnkgZW50cnksIHByb2Nlc3MgdGhlIHBhcmVudAogCSAqIHRvIGdldCB0aGUgdmFsdWVzLiAqLwogCWlmICh1ZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9MVU5fRElSRUNUT1JZKSB7Ci0JCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqcGFyZW50X3VkID0KLQkJCWNvbnRhaW5lcl9vZih1ZC0+ZGV2aWNlLnBhcmVudCwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCBkZXZpY2UpOwotCQlzYnAyX3BhcnNlX3VuaXRfZGlyZWN0b3J5KHNjc2lfaWQsIHBhcmVudF91ZCk7CisJCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqcGFyZW50X3VkID0gY29udGFpbmVyX29mKAorCQkJdWQtPmRldmljZS5wYXJlbnQsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgZGV2aWNlKTsKKwkJc2JwMl9wYXJzZV91bml0X2RpcmVjdG9yeShsdSwgcGFyZW50X3VkKTsKIAl9IGVsc2UgewotCQlzY3NpX2lkLT5zYnAyX21hbmFnZW1lbnRfYWdlbnRfYWRkciA9IG1hbmFnZW1lbnRfYWdlbnRfYWRkcjsKLQkJc2NzaV9pZC0+c2JwMl9jb21tYW5kX3NldF9zcGVjX2lkID0gY29tbWFuZF9zZXRfc3BlY19pZDsKLQkJc2NzaV9pZC0+c2JwMl9jb21tYW5kX3NldCA9IGNvbW1hbmRfc2V0OwotCQlzY3NpX2lkLT5zYnAyX3VuaXRfY2hhcmFjdGVyaXN0aWNzID0gdW5pdF9jaGFyYWN0ZXJpc3RpY3M7Ci0JCXNjc2lfaWQtPnNicDJfZmlybXdhcmVfcmV2aXNpb24gPSBmaXJtd2FyZV9yZXZpc2lvbjsKLQkJc2NzaV9pZC0+d29ya2Fyb3VuZHMgPSB3b3JrYXJvdW5kczsKKwkJbHUtPm1hbmFnZW1lbnRfYWdlbnRfYWRkciA9IG1hbmFnZW1lbnRfYWdlbnRfYWRkcjsKKwkJbHUtPndvcmthcm91bmRzID0gd29ya2Fyb3VuZHM7CiAJCWlmICh1ZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9IQVNfTFVOKQotCQkJc2NzaV9pZC0+c2JwMl9sdW4gPSBPUkJfU0VUX0xVTih1ZC0+bHVuKTsKKwkJCWx1LT5sdW4gPSBPUkJfU0VUX0xVTih1ZC0+bHVuKTsKIAl9CiB9CiAKQEAgLTE2NjIsMTMzICsxMzYxLDExNCBAQAogICogdGhlIHNwZWVkIHRoYXQgaXQgbmVlZHMgdG8gdXNlLCBhbmQgdGhlIG1heF9yZWMgdGhlIGhvc3Qgc3VwcG9ydHMsIGFuZAogICogaXQgdGFrZXMgY2FyZSBvZiB0aGUgcmVzdC4KICAqLwotc3RhdGljIGludCBzYnAyX21heF9zcGVlZF9hbmRfc2l6ZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQorc3RhdGljIGludCBzYnAyX21heF9zcGVlZF9hbmRfc2l6ZShzdHJ1Y3Qgc2JwMl9sdSAqbHUpCiB7Ci0Jc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGkgPSBzY3NpX2lkLT5oaTsKKwlzdHJ1Y3Qgc2JwMl9md2hvc3RfaW5mbyAqaGkgPSBsdS0+aGk7CiAJdTggcGF5bG9hZDsKIAotCVNCUDJfREVCVUdfRU5URVIoKTsKKwlsdS0+c3BlZWRfY29kZSA9IGhpLT5ob3N0LT5zcGVlZFtOT0RFSURfVE9fTk9ERShsdS0+bmUtPm5vZGVpZCldOwogCi0Jc2NzaV9pZC0+c3BlZWRfY29kZSA9Ci0JICAgIGhpLT5ob3N0LT5zcGVlZFtOT0RFSURfVE9fTk9ERShzY3NpX2lkLT5uZS0+bm9kZWlkKV07Ci0KLQkvKiBCdW1wIGRvd24gb3VyIHNwZWVkIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpdCAqLwotCWlmIChzY3NpX2lkLT5zcGVlZF9jb2RlID4gbWF4X3NwZWVkKSB7Ci0JCXNjc2lfaWQtPnNwZWVkX2NvZGUgPSBtYXhfc3BlZWQ7Ci0JCVNCUDJfRVJSKCJGb3JjaW5nIFNCUC0yIG1heCBzcGVlZCBkb3duIHRvICVzIiwKLQkJCSBocHNiX3NwZWVkdG9fc3RyW3Njc2lfaWQtPnNwZWVkX2NvZGVdKTsKKwlpZiAobHUtPnNwZWVkX2NvZGUgPiBzYnAyX21heF9zcGVlZCkgeworCQlsdS0+c3BlZWRfY29kZSA9IHNicDJfbWF4X3NwZWVkOworCQlTQlAyX0lORk8oIlJlZHVjaW5nIHNwZWVkIHRvICVzIiwKKwkJCSAgaHBzYl9zcGVlZHRvX3N0cltzYnAyX21heF9zcGVlZF0pOwogCX0KIAogCS8qIFBheWxvYWQgc2l6ZSBpcyB0aGUgbGVzc2VyIG9mIHdoYXQgb3VyIHNwZWVkIHN1cHBvcnRzIGFuZCB3aGF0CiAJICogb3VyIGhvc3Qgc3VwcG9ydHMuICAqLwotCXBheWxvYWQgPSBtaW4oc2JwMl9zcGVlZHRvX21heF9wYXlsb2FkW3Njc2lfaWQtPnNwZWVkX2NvZGVdLAorCXBheWxvYWQgPSBtaW4oc2JwMl9zcGVlZHRvX21heF9wYXlsb2FkW2x1LT5zcGVlZF9jb2RlXSwKIAkJICAgICAgKHU4KSAoaGktPmhvc3QtPmNzci5tYXhfcmVjIC0gMSkpOwogCiAJLyogSWYgcGh5c2ljYWwgRE1BIGlzIG9mZiwgd29yayBhcm91bmQgbGltaXRhdGlvbiBpbiBvaGNpMTM5NDoKIAkgKiBwYWNrZXQgc2l6ZSBtdXN0IG5vdCBleGNlZWQgUEFHRV9TSVpFICovCi0JaWYgKHNjc2lfaWQtPm5lLT5ob3N0LT5sb3dfYWRkcl9zcGFjZSA8ICgxVUxMIDw8IDMyKSkKKwlpZiAobHUtPm5lLT5ob3N0LT5sb3dfYWRkcl9zcGFjZSA8ICgxVUxMIDw8IDMyKSkKIAkJd2hpbGUgKFNCUDJfUEFZTE9BRF9UT19CWVRFUyhwYXlsb2FkKSArIDI0ID4gUEFHRV9TSVpFICYmCiAJCSAgICAgICBwYXlsb2FkKQogCQkJcGF5bG9hZC0tOwogCi0JSFBTQl9ERUJVRygiTm9kZSAiIE5PREVfQlVTX0ZNVCAiOiBNYXggc3BlZWQgWyVzXSAtIE1heCBwYXlsb2FkIFsldV0iLAotCQkgICBOT0RFX0JVU19BUkdTKGhpLT5ob3N0LCBzY3NpX2lkLT5uZS0+bm9kZWlkKSwKLQkJICAgaHBzYl9zcGVlZHRvX3N0cltzY3NpX2lkLT5zcGVlZF9jb2RlXSwKLQkJICAgU0JQMl9QQVlMT0FEX1RPX0JZVEVTKHBheWxvYWQpKTsKKwlTQlAyX0lORk8oIk5vZGUgIiBOT0RFX0JVU19GTVQgIjogTWF4IHNwZWVkIFslc10gLSBNYXggcGF5bG9hZCBbJXVdIiwKKwkJICBOT0RFX0JVU19BUkdTKGhpLT5ob3N0LCBsdS0+bmUtPm5vZGVpZCksCisJCSAgaHBzYl9zcGVlZHRvX3N0cltsdS0+c3BlZWRfY29kZV0sCisJCSAgU0JQMl9QQVlMT0FEX1RPX0JZVEVTKHBheWxvYWQpKTsKIAotCXNjc2lfaWQtPm1heF9wYXlsb2FkX3NpemUgPSBwYXlsb2FkOworCWx1LT5tYXhfcGF5bG9hZF9zaXplID0gcGF5bG9hZDsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIHBlcmZvcm0gYSBTQlAtMiBhZ2VudCByZXNldC4KLSAqLwotc3RhdGljIGludCBzYnAyX2FnZW50X3Jlc2V0KHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsIGludCB3YWl0KQorc3RhdGljIGludCBzYnAyX2FnZW50X3Jlc2V0KHN0cnVjdCBzYnAyX2x1ICpsdSwgaW50IHdhaXQpCiB7CiAJcXVhZGxldF90IGRhdGE7CiAJdTY0IGFkZHI7CiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JU0JQMl9ERUJVR19FTlRFUigpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmc2NzaV9pZC0+cHJvdG9jb2xfd29yayk7CisJLyogZmx1c2ggbHUtPnByb3RvY29sX3dvcmsgKi8KIAlpZiAod2FpdCkKIAkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCWRhdGEgPSBudG9obChTQlAyX0FHRU5UX1JFU0VUX0RBVEEpOwotCWFkZHIgPSBzY3NpX2lkLT5zYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkciArIFNCUDJfQUdFTlRfUkVTRVRfT0ZGU0VUOworCWFkZHIgPSBsdS0+Y29tbWFuZF9ibG9ja19hZ2VudF9hZGRyICsgU0JQMl9BR0VOVF9SRVNFVF9PRkZTRVQ7CiAKIAlpZiAod2FpdCkKLQkJcmV0dmFsID0gaHBzYl9ub2RlX3dyaXRlKHNjc2lfaWQtPm5lLCBhZGRyLCAmZGF0YSwgNCk7CisJCXJldHZhbCA9IGhwc2Jfbm9kZV93cml0ZShsdS0+bmUsIGFkZHIsICZkYXRhLCA0KTsKIAllbHNlCi0JCXJldHZhbCA9IHNicDJ1dGlsX25vZGVfd3JpdGVfbm9fd2FpdChzY3NpX2lkLT5uZSwgYWRkciwgJmRhdGEsIDQpOworCQlyZXR2YWwgPSBzYnAydXRpbF9ub2RlX3dyaXRlX25vX3dhaXQobHUtPm5lLCBhZGRyLCAmZGF0YSwgNCk7CiAKIAlpZiAocmV0dmFsIDwgMCkgewogCQlTQlAyX0VSUigiaHBzYl9ub2RlX3dyaXRlIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvKgotCSAqIE5lZWQgdG8gbWFrZSBzdXJlIG9yYiBwb2ludGVyIGlzIHdyaXR0ZW4gb24gbmV4dCBjb21tYW5kCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOwotCXNjc2lfaWQtPmxhc3Rfb3JiID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKKwkvKiBtYWtlIHN1cmUgdGhhdCB0aGUgT1JCX1BPSU5URVIgaXMgd3JpdHRlbiBvbiBuZXh0IGNvbW1hbmQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOworCWx1LT5sYXN0X29yYiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNicDJfcHJlcF9jb21tYW5kX29yYl9zZyhzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiAqb3JiLAotCQkJCSAgICAgc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGksCi0JCQkJICAgICBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQsCisJCQkJICAgICBzdHJ1Y3Qgc2JwMl9md2hvc3RfaW5mbyAqaGksCisJCQkJICAgICBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZCwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBzY3NpX3VzZV9zZywKIAkJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dwbnQsCiAJCQkJICAgICB1MzIgb3JiX2RpcmVjdGlvbiwKIAkJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYV9kaXIpCiB7Ci0JY29tbWFuZC0+ZG1hX2RpciA9IGRtYV9kaXI7CisJY21kLT5kbWFfZGlyID0gZG1hX2RpcjsKIAlvcmItPmRhdGFfZGVzY3JpcHRvcl9oaSA9IE9SQl9TRVRfTk9ERV9JRChoaS0+aG9zdC0+bm9kZV9pZCk7CiAJb3JiLT5taXNjIHw9IE9SQl9TRVRfRElSRUNUSU9OKG9yYl9kaXJlY3Rpb24pOwogCi0JLyogU3BlY2lhbCBjYXNlIGlmIG9ubHkgb25lIGVsZW1lbnQgKGFuZCBsZXNzIHRoYW4gNjRLQiBpbiBzaXplKSAqLworCS8qIHNwZWNpYWwgY2FzZSBpZiBvbmx5IG9uZSBlbGVtZW50IChhbmQgbGVzcyB0aGFuIDY0S0IgaW4gc2l6ZSkgKi8KIAlpZiAoKHNjc2lfdXNlX3NnID09IDEpICYmCiAJICAgIChzZ3BudFswXS5sZW5ndGggPD0gU0JQMl9NQVhfU0dfRUxFTUVOVF9MRU5HVEgpKSB7CiAKLQkJU0JQMl9ERUJVRygiT25seSBvbmUgcy9nIGVsZW1lbnQiKTsKLQkJY29tbWFuZC0+ZG1hX3NpemUgPSBzZ3BudFswXS5sZW5ndGg7Ci0JCWNvbW1hbmQtPmRtYV90eXBlID0gQ01EX0RNQV9QQUdFOwotCQljb21tYW5kLT5jbWRfZG1hID0gcGNpX21hcF9wYWdlKGhpLT5ob3N0LT5wZGV2LAotCQkJCQkJc2dwbnRbMF0ucGFnZSwKLQkJCQkJCXNncG50WzBdLm9mZnNldCwKLQkJCQkJCWNvbW1hbmQtPmRtYV9zaXplLAotCQkJCQkJY29tbWFuZC0+ZG1hX2Rpcik7Ci0JCVNCUDJfRE1BX0FMTE9DKCJzaW5nbGUgcGFnZSBzY2F0dGVyIGVsZW1lbnQiKTsKKwkJY21kLT5kbWFfc2l6ZSA9IHNncG50WzBdLmxlbmd0aDsKKwkJY21kLT5kbWFfdHlwZSA9IENNRF9ETUFfUEFHRTsKKwkJY21kLT5jbWRfZG1hID0gZG1hX21hcF9wYWdlKCZoaS0+aG9zdC0+ZGV2aWNlLAorCQkJCQkgICAgc2dwbnRbMF0ucGFnZSwgc2dwbnRbMF0ub2Zmc2V0LAorCQkJCQkgICAgY21kLT5kbWFfc2l6ZSwgY21kLT5kbWFfZGlyKTsKIAotCQlvcmItPmRhdGFfZGVzY3JpcHRvcl9sbyA9IGNvbW1hbmQtPmNtZF9kbWE7Ci0JCW9yYi0+bWlzYyB8PSBPUkJfU0VUX0RBVEFfU0laRShjb21tYW5kLT5kbWFfc2l6ZSk7CisJCW9yYi0+ZGF0YV9kZXNjcmlwdG9yX2xvID0gY21kLT5jbWRfZG1hOworCQlvcmItPm1pc2MgfD0gT1JCX1NFVF9EQVRBX1NJWkUoY21kLT5kbWFfc2l6ZSk7CiAKIAl9IGVsc2UgewogCQlzdHJ1Y3Qgc2JwMl91bnJlc3RyaWN0ZWRfcGFnZV90YWJsZSAqc2dfZWxlbWVudCA9Ci0JCQkJCSZjb21tYW5kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50WzBdOworCQkJCQkJJmNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudFswXTsKIAkJdTMyIHNnX2NvdW50LCBzZ19sZW47CiAJCWRtYV9hZGRyX3Qgc2dfYWRkcjsKLQkJaW50IGksIGNvdW50ID0gcGNpX21hcF9zZyhoaS0+aG9zdC0+cGRldiwgc2dwbnQsIHNjc2lfdXNlX3NnLAorCQlpbnQgaSwgY291bnQgPSBkbWFfbWFwX3NnKCZoaS0+aG9zdC0+ZGV2aWNlLCBzZ3BudCwgc2NzaV91c2Vfc2csCiAJCQkJCSAgZG1hX2Rpcik7CiAKLQkJU0JQMl9ETUFfQUxMT0MoInNjYXR0ZXIgbGlzdCIpOwotCi0JCWNvbW1hbmQtPmRtYV9zaXplID0gc2NzaV91c2Vfc2c7Ci0JCWNvbW1hbmQtPnNnZV9idWZmZXIgPSBzZ3BudDsKKwkJY21kLT5kbWFfc2l6ZSA9IHNjc2lfdXNlX3NnOworCQljbWQtPnNnZV9idWZmZXIgPSBzZ3BudDsKIAogCQkvKiB1c2UgcGFnZSB0YWJsZXMgKHMvZykgKi8KIAkJb3JiLT5taXNjIHw9IE9SQl9TRVRfUEFHRV9UQUJMRV9QUkVTRU5UKDB4MSk7Ci0JCW9yYi0+ZGF0YV9kZXNjcmlwdG9yX2xvID0gY29tbWFuZC0+c2dlX2RtYTsKKwkJb3JiLT5kYXRhX2Rlc2NyaXB0b3JfbG8gPSBjbWQtPnNnZV9kbWE7CiAKLQkJLyoKLQkJICogTG9vcCB0aHJvdWdoIGFuZCBmaWxsIG91dCBvdXIgc2JwLTIgcGFnZSB0YWJsZXMKLQkJICogKGFuZCBzcGxpdCB1cCBhbnl0aGluZyB0b28gbGFyZ2UpCi0JCSAqLworCQkvKiBsb29wIHRocm91Z2ggYW5kIGZpbGwgb3V0IG91ciBTQlAtMiBwYWdlIHRhYmxlcworCQkgKiAoYW5kIHNwbGl0IHVwIGFueXRoaW5nIHRvbyBsYXJnZSkgKi8KIAkJZm9yIChpID0gMCwgc2dfY291bnQgPSAwIDsgaSA8IGNvdW50OyBpKyssIHNncG50KyspIHsKIAkJCXNnX2xlbiA9IHNnX2RtYV9sZW4oc2dwbnQpOwogCQkJc2dfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNncG50KTsKQEAgLTE4MDgsNzAgKzE0ODgsNTMgQEAKIAkJCX0KIAkJfQogCi0JCS8qIE51bWJlciBvZiBwYWdlIHRhYmxlIChzL2cpIGVsZW1lbnRzICovCiAJCW9yYi0+bWlzYyB8PSBPUkJfU0VUX0RBVEFfU0laRShzZ19jb3VudCk7CiAKLQkJc2JwMnV0aWxfcGFja2V0X2R1bXAoc2dfZWxlbWVudCwKLQkJCQkgICAgIChzaXplb2Yoc3RydWN0IHNicDJfdW5yZXN0cmljdGVkX3BhZ2VfdGFibGUpKSAqIHNnX2NvdW50LAotCQkJCSAgICAgInNicDIgcy9nIGxpc3QiLCBjb21tYW5kLT5zZ2VfZG1hKTsKLQotCQkvKiBCeXRlIHN3YXAgcGFnZSB0YWJsZXMgaWYgbmVjZXNzYXJ5ICovCiAJCXNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcihzZ19lbGVtZW50LAotCQkJCQkgICAgKHNpemVvZihzdHJ1Y3Qgc2JwMl91bnJlc3RyaWN0ZWRfcGFnZV90YWJsZSkpICoKLQkJCQkJICAgIHNnX2NvdW50KTsKKwkJCQkoc2l6ZW9mKHN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlKSkgKgorCQkJCXNnX2NvdW50KTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHNicDJfcHJlcF9jb21tYW5kX29yYl9ub19zZyhzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiAqb3JiLAotCQkJCQlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSwKLQkJCQkJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kLAorCQkJCQlzdHJ1Y3Qgc2JwMl9md2hvc3RfaW5mbyAqaGksCisJCQkJCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY21kLAogCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncG50LAogCQkJCQl1MzIgb3JiX2RpcmVjdGlvbiwKIAkJCQkJdW5zaWduZWQgaW50IHNjc2lfcmVxdWVzdF9idWZmbGVuLAogCQkJCQl2b2lkICpzY3NpX3JlcXVlc3RfYnVmZmVyLAogCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkbWFfZGlyKQogewotCWNvbW1hbmQtPmRtYV9kaXIgPSBkbWFfZGlyOwotCWNvbW1hbmQtPmRtYV9zaXplID0gc2NzaV9yZXF1ZXN0X2J1ZmZsZW47Ci0JY29tbWFuZC0+ZG1hX3R5cGUgPSBDTURfRE1BX1NJTkdMRTsKLQljb21tYW5kLT5jbWRfZG1hID0gcGNpX21hcF9zaW5nbGUoaGktPmhvc3QtPnBkZXYsIHNjc2lfcmVxdWVzdF9idWZmZXIsCi0JCQkJCSAgY29tbWFuZC0+ZG1hX3NpemUsIGNvbW1hbmQtPmRtYV9kaXIpOworCWNtZC0+ZG1hX2RpciA9IGRtYV9kaXI7CisJY21kLT5kbWFfc2l6ZSA9IHNjc2lfcmVxdWVzdF9idWZmbGVuOworCWNtZC0+ZG1hX3R5cGUgPSBDTURfRE1BX1NJTkdMRTsKKwljbWQtPmNtZF9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmaGktPmhvc3QtPmRldmljZSwgc2NzaV9yZXF1ZXN0X2J1ZmZlciwKKwkJCQkgICAgICBjbWQtPmRtYV9zaXplLCBjbWQtPmRtYV9kaXIpOwogCW9yYi0+ZGF0YV9kZXNjcmlwdG9yX2hpID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKIAlvcmItPm1pc2MgfD0gT1JCX1NFVF9ESVJFQ1RJT04ob3JiX2RpcmVjdGlvbik7CiAKLQlTQlAyX0RNQV9BTExPQygic2luZ2xlIGJ1bGsiKTsKLQotCS8qCi0JICogSGFuZGxlIGNhc2Ugd2hlcmUgd2UgZ2V0IGEgY29tbWFuZCB3L28gcy9nIGVuYWJsZWQgKGJ1dAotCSAqIGNoZWNrIGZvciB0cmFuc2ZlcnMgbGFyZ2VyIHRoYW4gNjRLKQotCSAqLworCS8qIGhhbmRsZSBjYXNlIHdoZXJlIHdlIGdldCBhIGNvbW1hbmQgdy9vIHMvZyBlbmFibGVkCisJICogKGJ1dCBjaGVjayBmb3IgdHJhbnNmZXJzIGxhcmdlciB0aGFuIDY0SykgKi8KIAlpZiAoc2NzaV9yZXF1ZXN0X2J1ZmZsZW4gPD0gU0JQMl9NQVhfU0dfRUxFTUVOVF9MRU5HVEgpIHsKIAotCQlvcmItPmRhdGFfZGVzY3JpcHRvcl9sbyA9IGNvbW1hbmQtPmNtZF9kbWE7CisJCW9yYi0+ZGF0YV9kZXNjcmlwdG9yX2xvID0gY21kLT5jbWRfZG1hOwogCQlvcmItPm1pc2MgfD0gT1JCX1NFVF9EQVRBX1NJWkUoc2NzaV9yZXF1ZXN0X2J1ZmZsZW4pOwogCiAJfSBlbHNlIHsKKwkJLyogVGhlIGJ1ZmZlciBpcyB0b28gbGFyZ2UuIFR1cm4gdGhpcyBpbnRvIHBhZ2UgdGFibGVzLiAqLworCiAJCXN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlICpzZ19lbGVtZW50ID0KLQkJCSZjb21tYW5kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50WzBdOworCQkJCQkJJmNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudFswXTsKIAkJdTMyIHNnX2NvdW50LCBzZ19sZW47CiAJCWRtYV9hZGRyX3Qgc2dfYWRkcjsKIAotCQkvKgotCQkgKiBOZWVkIHRvIHR1cm4gdGhpcyBpbnRvIHBhZ2UgdGFibGVzLCBzaW5jZSB0aGUKLQkJICogYnVmZmVyIGlzIHRvbyBsYXJnZS4KLQkJICovCi0JCW9yYi0+ZGF0YV9kZXNjcmlwdG9yX2xvID0gY29tbWFuZC0+c2dlX2RtYTsKLQotCQkvKiBVc2UgcGFnZSB0YWJsZXMgKHMvZykgKi8KKwkJb3JiLT5kYXRhX2Rlc2NyaXB0b3JfbG8gPSBjbWQtPnNnZV9kbWE7CiAJCW9yYi0+bWlzYyB8PSBPUkJfU0VUX1BBR0VfVEFCTEVfUFJFU0VOVCgweDEpOwogCi0JCS8qCi0JCSAqIGZpbGwgb3V0IG91ciBzYnAtMiBwYWdlIHRhYmxlcyAoYW5kIHNwbGl0IHVwCi0JCSAqIHRoZSBsYXJnZSBidWZmZXIpCi0JCSAqLworCQkvKiBmaWxsIG91dCBvdXIgU0JQLTIgcGFnZSB0YWJsZXM7IHNwbGl0IHVwIHRoZSBsYXJnZSBidWZmZXIgKi8KIAkJc2dfY291bnQgPSAwOwogCQlzZ19sZW4gPSBzY3NpX3JlcXVlc3RfYnVmZmxlbjsKLQkJc2dfYWRkciA9IGNvbW1hbmQtPmNtZF9kbWE7CisJCXNnX2FkZHIgPSBjbWQtPmNtZF9kbWE7CiAJCXdoaWxlIChzZ19sZW4pIHsKIAkJCXNnX2VsZW1lbnRbc2dfY291bnRdLnNlZ21lbnRfYmFzZV9sbyA9IHNnX2FkZHI7CiAJCQlpZiAoc2dfbGVuID4gU0JQMl9NQVhfU0dfRUxFTUVOVF9MRU5HVEgpIHsKQEAgLTE4ODcsNTAgKzE1NTAsNDAgQEAKIAkJCXNnX2NvdW50Kys7CiAJCX0KIAotCQkvKiBOdW1iZXIgb2YgcGFnZSB0YWJsZSAocy9nKSBlbGVtZW50cyAqLwogCQlvcmItPm1pc2MgfD0gT1JCX1NFVF9EQVRBX1NJWkUoc2dfY291bnQpOwogCi0JCXNicDJ1dGlsX3BhY2tldF9kdW1wKHNnX2VsZW1lbnQsCi0JCQkJICAgICAoc2l6ZW9mKHN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlKSkgKiBzZ19jb3VudCwKLQkJCQkgICAgICJzYnAyIHMvZyBsaXN0IiwgY29tbWFuZC0+c2dlX2RtYSk7Ci0KLQkJLyogQnl0ZSBzd2FwIHBhZ2UgdGFibGVzIGlmIG5lY2Vzc2FyeSAqLwogCQlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2dfZWxlbWVudCwKLQkJCQkJICAgIChzaXplb2Yoc3RydWN0IHNicDJfdW5yZXN0cmljdGVkX3BhZ2VfdGFibGUpKSAqCi0JCQkJCSAgICAgc2dfY291bnQpOworCQkJCShzaXplb2Yoc3RydWN0IHNicDJfdW5yZXN0cmljdGVkX3BhZ2VfdGFibGUpKSAqCisJCQkJc2dfY291bnQpOwogCX0KIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgYWN0dWFsIGNvbW1hbmQgb3JiIGFuZCBzL2cgbGlzdAotICogb3V0IG9mIHRoZSBzY3NpIGNvbW1hbmQgaXRzZWxmLgotICovCi1zdGF0aWMgdm9pZCBzYnAyX2NyZWF0ZV9jb21tYW5kX29yYihzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAotCQkJCSAgICBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQsCitzdGF0aWMgdm9pZCBzYnAyX2NyZWF0ZV9jb21tYW5kX29yYihzdHJ1Y3Qgc2JwMl9sdSAqbHUsCisJCQkJICAgIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY21kLAogCQkJCSAgICB1bmNoYXIgKnNjc2lfY21kLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgc2NzaV91c2Vfc2csCiAJCQkJICAgIHVuc2lnbmVkIGludCBzY3NpX3JlcXVlc3RfYnVmZmxlbiwKIAkJCQkgICAgdm9pZCAqc2NzaV9yZXF1ZXN0X2J1ZmZlciwKIAkJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpcikKIHsKLQlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOworCXN0cnVjdCBzYnAyX2Z3aG9zdF9pbmZvICpoaSA9IGx1LT5oaTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNncG50ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjc2lfcmVxdWVzdF9idWZmZXI7Ci0Jc3RydWN0IHNicDJfY29tbWFuZF9vcmIgKmNvbW1hbmRfb3JiID0gJmNvbW1hbmQtPmNvbW1hbmRfb3JiOworCXN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiICpvcmIgPSAmY21kLT5jb21tYW5kX29yYjsKIAl1MzIgb3JiX2RpcmVjdGlvbjsKIAogCS8qCi0JICogU2V0LXVwIG91ciBjb21tYW5kIE9SQi4uCisJICogU2V0LXVwIG91ciBjb21tYW5kIE9SQi4KIAkgKgogCSAqIE5PVEU6IFdlJ3JlIGRvaW5nIHVucmVzdHJpY3RlZCBwYWdlIHRhYmxlcyAocy9nKSwgYXMgdGhpcyBpcwogCSAqIGJlc3QgcGVyZm9ybWFuY2UgKGF0IGxlYXN0IHdpdGggdGhlIGRldmljZXMgSSBoYXZlKS4gVGhpcyBtZWFucwogCSAqIHRoYXQgZGF0YV9zaXplIGJlY29tZXMgdGhlIG51bWJlciBvZiBzL2cgZWxlbWVudHMsIGFuZAogCSAqIHBhZ2Vfc2l6ZSBzaG91bGQgYmUgemVybyAoZm9yIHVucmVzdHJpY3RlZCkuCiAJICovCi0JY29tbWFuZF9vcmItPm5leHRfT1JCX2hpID0gT1JCX1NFVF9OVUxMX1BUUigxKTsKLQljb21tYW5kX29yYi0+bmV4dF9PUkJfbG8gPSAweDA7Ci0JY29tbWFuZF9vcmItPm1pc2MgPSBPUkJfU0VUX01BWF9QQVlMT0FEKHNjc2lfaWQtPm1heF9wYXlsb2FkX3NpemUpOwotCWNvbW1hbmRfb3JiLT5taXNjIHw9IE9SQl9TRVRfU1BFRUQoc2NzaV9pZC0+c3BlZWRfY29kZSk7Ci0JY29tbWFuZF9vcmItPm1pc2MgfD0gT1JCX1NFVF9OT1RJRlkoMSk7CS8qIE5vdGlmeSB1cyB3aGVuIGNvbXBsZXRlICovCisJb3JiLT5uZXh0X09SQl9oaSA9IE9SQl9TRVRfTlVMTF9QVFIoMSk7CisJb3JiLT5uZXh0X09SQl9sbyA9IDB4MDsKKwlvcmItPm1pc2MgPSBPUkJfU0VUX01BWF9QQVlMT0FEKGx1LT5tYXhfcGF5bG9hZF9zaXplKTsKKwlvcmItPm1pc2MgfD0gT1JCX1NFVF9TUEVFRChsdS0+c3BlZWRfY29kZSk7CisJb3JiLT5taXNjIHw9IE9SQl9TRVRfTk9USUZZKDEpOwogCiAJaWYgKGRtYV9kaXIgPT0gRE1BX05PTkUpCiAJCW9yYl9kaXJlY3Rpb24gPSBPUkJfRElSRUNUSU9OX05PX0RBVEFfVFJBTlNGRVI7CkBAIC0xOTM5LDY2ICsxNTkyLDUxIEBACiAJZWxzZSBpZiAoZG1hX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UgJiYgc2NzaV9yZXF1ZXN0X2J1ZmZsZW4pCiAJCW9yYl9kaXJlY3Rpb24gPSBPUkJfRElSRUNUSU9OX1JFQURfRlJPTV9NRURJQTsKIAllbHNlIHsKLQkJU0JQMl9XQVJOKCJGYWxsaW5nIGJhY2sgdG8gRE1BX05PTkUiKTsKKwkJU0JQMl9JTkZPKCJGYWxsaW5nIGJhY2sgdG8gRE1BX05PTkUiKTsKIAkJb3JiX2RpcmVjdGlvbiA9IE9SQl9ESVJFQ1RJT05fTk9fREFUQV9UUkFOU0ZFUjsKIAl9CiAKLQkvKiBTZXQtdXAgb3VyIHBhZ2V0YWJsZSBzdHVmZiAqLworCS8qIHNldCB1cCBvdXIgcGFnZSB0YWJsZSBzdHVmZiAqLwogCWlmIChvcmJfZGlyZWN0aW9uID09IE9SQl9ESVJFQ1RJT05fTk9fREFUQV9UUkFOU0ZFUikgewotCQlTQlAyX0RFQlVHKCJObyBkYXRhIHRyYW5zZmVyIik7Ci0JCWNvbW1hbmRfb3JiLT5kYXRhX2Rlc2NyaXB0b3JfaGkgPSAweDA7Ci0JCWNvbW1hbmRfb3JiLT5kYXRhX2Rlc2NyaXB0b3JfbG8gPSAweDA7Ci0JCWNvbW1hbmRfb3JiLT5taXNjIHw9IE9SQl9TRVRfRElSRUNUSU9OKDEpOwotCX0gZWxzZSBpZiAoc2NzaV91c2Vfc2cpIHsKLQkJU0JQMl9ERUJVRygiVXNlIHNjYXR0ZXIvZ2F0aGVyIik7Ci0JCXNicDJfcHJlcF9jb21tYW5kX29yYl9zZyhjb21tYW5kX29yYiwgaGksIGNvbW1hbmQsIHNjc2lfdXNlX3NnLAotCQkJCQkgc2dwbnQsIG9yYl9kaXJlY3Rpb24sIGRtYV9kaXIpOwotCX0gZWxzZSB7Ci0JCVNCUDJfREVCVUcoIk5vIHNjYXR0ZXIvZ2F0aGVyIik7Ci0JCXNicDJfcHJlcF9jb21tYW5kX29yYl9ub19zZyhjb21tYW5kX29yYiwgaGksIGNvbW1hbmQsIHNncG50LAotCQkJCQkgICAgb3JiX2RpcmVjdGlvbiwgc2NzaV9yZXF1ZXN0X2J1ZmZsZW4sCisJCW9yYi0+ZGF0YV9kZXNjcmlwdG9yX2hpID0gMHgwOworCQlvcmItPmRhdGFfZGVzY3JpcHRvcl9sbyA9IDB4MDsKKwkJb3JiLT5taXNjIHw9IE9SQl9TRVRfRElSRUNUSU9OKDEpOworCX0gZWxzZSBpZiAoc2NzaV91c2Vfc2cpCisJCXNicDJfcHJlcF9jb21tYW5kX29yYl9zZyhvcmIsIGhpLCBjbWQsIHNjc2lfdXNlX3NnLCBzZ3BudCwKKwkJCQkJIG9yYl9kaXJlY3Rpb24sIGRtYV9kaXIpOworCWVsc2UKKwkJc2JwMl9wcmVwX2NvbW1hbmRfb3JiX25vX3NnKG9yYiwgaGksIGNtZCwgc2dwbnQsIG9yYl9kaXJlY3Rpb24sCisJCQkJCSAgICBzY3NpX3JlcXVlc3RfYnVmZmxlbiwKIAkJCQkJICAgIHNjc2lfcmVxdWVzdF9idWZmZXIsIGRtYV9kaXIpOwotCX0KIAotCS8qIEJ5dGUgc3dhcCBjb21tYW5kIE9SQiBpZiBuZWNlc3NhcnkgKi8KLQlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoY29tbWFuZF9vcmIsIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYikpOworCXNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcihvcmIsIHNpemVvZigqb3JiKSk7CiAKLQkvKiBQdXQgb3VyIHNjc2kgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBPUkIgKi8KLQltZW1zZXQoY29tbWFuZF9vcmItPmNkYiwgMCwgMTIpOwotCW1lbWNweShjb21tYW5kX29yYi0+Y2RiLCBzY3NpX2NtZCwgQ09NTUFORF9TSVpFKCpzY3NpX2NtZCkpOworCW1lbXNldChvcmItPmNkYiwgMCwgMTIpOworCW1lbWNweShvcmItPmNkYiwgc2NzaV9jbWQsIENPTU1BTkRfU0laRSgqc2NzaV9jbWQpKTsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIGJlZ2luIGEgcmVndWxhciBTQlAtMiBjb21tYW5kLgotICovCi1zdGF0aWMgdm9pZCBzYnAyX2xpbmtfb3JiX2NvbW1hbmQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwKLQkJCQkgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kKQorc3RhdGljIHZvaWQgc2JwMl9saW5rX29yYl9jb21tYW5kKHN0cnVjdCBzYnAyX2x1ICpsdSwKKwkJCQkgIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY21kKQogewotCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7Ci0Jc3RydWN0IHNicDJfY29tbWFuZF9vcmIgKmNvbW1hbmRfb3JiID0gJmNvbW1hbmQtPmNvbW1hbmRfb3JiOworCXN0cnVjdCBzYnAyX2Z3aG9zdF9pbmZvICpoaSA9IGx1LT5oaTsKIAlzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiAqbGFzdF9vcmI7CiAJZG1hX2FkZHJfdCBsYXN0X29yYl9kbWE7Ci0JdTY0IGFkZHIgPSBzY3NpX2lkLT5zYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkcjsKKwl1NjQgYWRkciA9IGx1LT5jb21tYW5kX2Jsb2NrX2FnZW50X2FkZHI7CiAJcXVhZGxldF90IGRhdGFbMl07CiAJc2l6ZV90IGxlbmd0aDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jb3V0c3RhbmRpbmdfb3JiX2luY3I7Ci0JU0JQMl9PUkJfREVCVUcoInNlbmRpbmcgY29tbWFuZCBvcmIgJXAsIHRvdGFsIG9yYnMgPSAleCIsCi0JCSAgICAgICBjb21tYW5kX29yYiwgZ2xvYmFsX291dHN0YW5kaW5nX2NvbW1hbmRfb3Jicyk7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoJmhpLT5ob3N0LT5kZXZpY2UsIGNtZC0+Y29tbWFuZF9vcmJfZG1hLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCisJCQkJICAgRE1BX1RPX0RFVklDRSk7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoJmhpLT5ob3N0LT5kZXZpY2UsIGNtZC0+c2dlX2RtYSwKKwkJCQkgICBzaXplb2YoY21kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKKwkJCQkgICBETUFfQklESVJFQ1RJT05BTCk7CiAKLQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoaGktPmhvc3QtPnBkZXYsIGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKLQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhpLT5ob3N0LT5wZGV2LCBjb21tYW5kLT5zZ2VfZG1hLAotCQkJCSAgICAgICBzaXplb2YoY29tbWFuZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCi0JCQkJICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBwcmV2aW91cyBvcmJzIHRvIHVzZQotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKLQlsYXN0X29yYiA9IHNjc2lfaWQtPmxhc3Rfb3JiOwotCWxhc3Rfb3JiX2RtYSA9IHNjc2lfaWQtPmxhc3Rfb3JiX2RtYTsKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBwcmV2aW91cyBvcmJzIHRvIHVzZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CisJbGFzdF9vcmIgPSBsdS0+bGFzdF9vcmI7CisJbGFzdF9vcmJfZG1hID0gbHUtPmxhc3Rfb3JiX2RtYTsKIAlpZiAoIWxhc3Rfb3JiKSB7CiAJCS8qCiAJCSAqIGxhc3Rfb3JiID09IE5VTEwgbWVhbnM6IFdlIGtub3cgdGhhdCB0aGUgdGFyZ2V0J3MgZmV0Y2ggYWdlbnQKQEAgLTIwMDYsNyArMTY0NCw3IEBACiAJCSAqLwogCQlhZGRyICs9IFNCUDJfT1JCX1BPSU5URVJfT0ZGU0VUOwogCQlkYXRhWzBdID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKLQkJZGF0YVsxXSA9IGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYTsKKwkJZGF0YVsxXSA9IGNtZC0+Y29tbWFuZF9vcmJfZG1hOwogCQlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoZGF0YSwgOCk7CiAJCWxlbmd0aCA9IDg7CiAJfSBlbHNlIHsKQEAgLTIwMTcsMjcgKzE2NTUsMjUgQEAKIAkJICogVGhlIHRhcmdldCdzIGZldGNoIGFnZW50IG1heSBvciBtYXkgbm90IGhhdmUgcmVhZCB0aGlzCiAJCSAqIHByZXZpb3VzIE9SQiB5ZXQuCiAJCSAqLwotCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPnBkZXYsIGxhc3Rfb3JiX2RtYSwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCi0JCQkJCSAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJbGFzdF9vcmItPm5leHRfT1JCX2xvID0gY3B1X3RvX2JlMzIoY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hKTsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmhpLT5ob3N0LT5kZXZpY2UsIGxhc3Rfb3JiX2RtYSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCWxhc3Rfb3JiLT5uZXh0X09SQl9sbyA9IGNwdV90b19iZTMyKGNtZC0+Y29tbWFuZF9vcmJfZG1hKTsKIAkJd21iKCk7CiAJCS8qIFRlbGxzIGhhcmR3YXJlIHRoYXQgdGhpcyBwb2ludGVyIGlzIHZhbGlkICovCiAJCWxhc3Rfb3JiLT5uZXh0X09SQl9oaSA9IDA7Ci0JCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShoaS0+aG9zdC0+cGRldiwgbGFzdF9vcmJfZG1hLAotCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKLQkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSgmaGktPmhvc3QtPmRldmljZSwgbGFzdF9vcmJfZG1hLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAorCQkJCQkgICBETUFfVE9fREVWSUNFKTsKIAkJYWRkciArPSBTQlAyX0RPT1JCRUxMX09GRlNFVDsKIAkJZGF0YVswXSA9IDA7CiAJCWxlbmd0aCA9IDQ7CiAJfQotCXNjc2lfaWQtPmxhc3Rfb3JiID0gY29tbWFuZF9vcmI7Ci0Jc2NzaV9pZC0+bGFzdF9vcmJfZG1hID0gY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOworCWx1LT5sYXN0X29yYiA9ICZjbWQtPmNvbW1hbmRfb3JiOworCWx1LT5sYXN0X29yYl9kbWEgPSBjbWQtPmNvbW1hbmRfb3JiX2RtYTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CiAKLQlTQlAyX09SQl9ERUJVRygid3JpdGUgdG8gJXMgcmVnaXN0ZXIsIGNvbW1hbmQgb3JiICVwIiwKLQkJCWxhc3Rfb3JiID8gIkRPT1JCRUxMIiA6ICJPUkJfUE9JTlRFUiIsIGNvbW1hbmRfb3JiKTsKLQlpZiAoc2JwMnV0aWxfbm9kZV93cml0ZV9ub193YWl0KHNjc2lfaWQtPm5lLCBhZGRyLCBkYXRhLCBsZW5ndGgpKSB7CisJaWYgKHNicDJ1dGlsX25vZGVfd3JpdGVfbm9fd2FpdChsdS0+bmUsIGFkZHIsIGRhdGEsIGxlbmd0aCkpIHsKIAkJLyoKIAkJICogc2JwMnV0aWxfbm9kZV93cml0ZV9ub193YWl0IGZhaWxlZC4gV2UgY2VydGFpbmx5IHJhbiBvdXQKIAkJICogb2YgdHJhbnNhY3Rpb24gbGFiZWxzLCBwZXJoYXBzIGp1c3QgYmVjYXVzZSB0aGVyZSB3ZXJlIG5vCkBAIC0yMDQ2LDUyICsxNjgyLDI5IEBACiAJCSAqIHRoZSB3b3JrcXVldWUgam9iIHdpbGwgc2xlZXAgdG8gZ3VhcmFudGVlZGx5IGdldCBhIHRsYWJlbC4KIAkJICogV2UgZG8gbm90IGFjY2VwdCBuZXcgY29tbWFuZHMgdW50aWwgdGhlIGpvYiBpcyBvdmVyLgogCQkgKi8KLQkJc2NzaV9ibG9ja19yZXF1ZXN0cyhzY3NpX2lkLT5zY3NpX2hvc3QpOwotCQlQUkVQQVJFX1dPUksoJnNjc2lfaWQtPnByb3RvY29sX3dvcmssCisJCXNjc2lfYmxvY2tfcmVxdWVzdHMobHUtPnNob3N0KTsKKwkJUFJFUEFSRV9XT1JLKCZsdS0+cHJvdG9jb2xfd29yaywKIAkJCSAgICAgbGFzdF9vcmIgPyBzYnAydXRpbF93cml0ZV9kb29yYmVsbDoKLQkJCQkJc2JwMnV0aWxfd3JpdGVfb3JiX3BvaW50ZXIsCi0JCQkgICAgIHNjc2lfaWQpOwotCQlzY2hlZHVsZV93b3JrKCZzY3NpX2lkLT5wcm90b2NvbF93b3JrKTsKKwkJCQkJc2JwMnV0aWxfd3JpdGVfb3JiX3BvaW50ZXIpOworCQlzY2hlZHVsZV93b3JrKCZsdS0+cHJvdG9jb2xfd29yayk7CiAJfQogfQogCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gYmVnaW4gYSByZWd1bGFyIFNCUC0yIGNvbW1hbmQuCi0gKi8KLXN0YXRpYyBpbnQgc2JwMl9zZW5kX2NvbW1hbmQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwKLQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCitzdGF0aWMgaW50IHNicDJfc2VuZF9jb21tYW5kKHN0cnVjdCBzYnAyX2x1ICpsdSwgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCiAJCQkgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewotCXVuY2hhciAqY21kID0gKHVuY2hhciAqKSBTQ3BudC0+Y21uZDsKKwl1bmNoYXIgKnNjc2lfY21kID0gKHVuY2hhciAqKVNDcG50LT5jbW5kOwogCXVuc2lnbmVkIGludCByZXF1ZXN0X2J1ZmZsZW4gPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOwotCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZDsKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZDsKIAotCVNCUDJfREVCVUdfRU5URVIoKTsKLQlTQlAyX0RFQlVHKCJTQ1NJIHRyYW5zZmVyIHNpemUgPSAleCIsIHJlcXVlc3RfYnVmZmxlbik7Ci0JU0JQMl9ERUJVRygiU0NTSSBzL2cgZWxlbWVudHMgPSAleCIsICh1bnNpZ25lZCBpbnQpU0NwbnQtPnVzZV9zZyk7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIGEgY29tbWFuZCBvcmIgYW5kIHMvZyBzdHJ1Y3R1cmUKLQkgKi8KLQljb21tYW5kID0gc2JwMnV0aWxfYWxsb2NhdGVfY29tbWFuZF9vcmIoc2NzaV9pZCwgU0NwbnQsIGRvbmUpOwotCWlmICghY29tbWFuZCkgeworCWNtZCA9IHNicDJ1dGlsX2FsbG9jYXRlX2NvbW1hbmRfb3JiKGx1LCBTQ3BudCwgZG9uZSk7CisJaWYgKCFjbWQpCiAJCXJldHVybiAtRUlPOwotCX0KIAotCS8qCi0JICogTm93IGFjdHVhbGx5IGZpbGwgaW4gdGhlIGNvbWFtbmQgb3JiIGFuZCBzYnAyIHMvZyBsaXN0Ci0JICovCi0Jc2JwMl9jcmVhdGVfY29tbWFuZF9vcmIoc2NzaV9pZCwgY29tbWFuZCwgY21kLCBTQ3BudC0+dXNlX3NnLAorCXNicDJfY3JlYXRlX2NvbW1hbmRfb3JiKGx1LCBjbWQsIHNjc2lfY21kLCBTQ3BudC0+dXNlX3NnLAogCQkJCXJlcXVlc3RfYnVmZmxlbiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLAogCQkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7Ci0KLQlzYnAydXRpbF9wYWNrZXRfZHVtcCgmY29tbWFuZC0+Y29tbWFuZF9vcmIsIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCi0JCQkgICAgICJzYnAyIGNvbW1hbmQgb3JiIiwgY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hKTsKLQotCS8qCi0JICogTGluayB1cCB0aGUgb3JiLCBhbmQgcmluZyB0aGUgZG9vcmJlbGwgaWYgbmVlZGVkCi0JICovCi0Jc2JwMl9saW5rX29yYl9jb21tYW5kKHNjc2lfaWQsIGNvbW1hbmQpOworCXNicDJfbGlua19vcmJfY29tbWFuZChsdSwgY21kKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA5OSwxMyArMTcxMiwxMCBAQAogLyoKICAqIFRyYW5zbGF0ZXMgU0JQLTIgc3RhdHVzIGludG8gU0NTSSBzZW5zZSBkYXRhIGZvciBjaGVjayBjb25kaXRpb25zCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2JwMl9zdGF0dXNfdG9fc2Vuc2VfZGF0YSh1bmNoYXIgKnNicDJfc3RhdHVzLCB1bmNoYXIgKnNlbnNlX2RhdGEpCitzdGF0aWMgdW5zaWduZWQgaW50IHNicDJfc3RhdHVzX3RvX3NlbnNlX2RhdGEodW5jaGFyICpzYnAyX3N0YXR1cywKKwkJCQkJICAgICAgdW5jaGFyICpzZW5zZV9kYXRhKQogewotCVNCUDJfREVCVUdfRU5URVIoKTsKLQotCS8qCi0JICogT2ssIGl0J3MgcHJldHR5IHVnbHkuLi4gICA7LSkKLQkgKi8KKwkvKiBPSywgaXQncyBwcmV0dHkgdWdseS4uLiA7LSkgKi8KIAlzZW5zZV9kYXRhWzBdID0gMHg3MDsKIAlzZW5zZV9kYXRhWzFdID0gMHgwOwogCXNlbnNlX2RhdGFbMl0gPSBzYnAyX3N0YXR1c1s5XTsKQEAgLTIxMjMsMjggKzE3MzMsMjEgQEAKIAlzZW5zZV9kYXRhWzE0XSA9IHNicDJfc3RhdHVzWzIwXTsKIAlzZW5zZV9kYXRhWzE1XSA9IHNicDJfc3RhdHVzWzIxXTsKIAotCXJldHVybiBzYnAyX3N0YXR1c1s4XSAmIDB4M2Y7CS8qIHJldHVybiBzY3NpIHN0YXR1cyAqLworCXJldHVybiBzYnAyX3N0YXR1c1s4XSAmIDB4M2Y7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGRlYWxzIHdpdGggc3RhdHVzIHdyaXRlcyBmcm9tIHRoZSBTQlAtMiBkZXZpY2UKLSAqLwogc3RhdGljIGludCBzYnAyX2hhbmRsZV9zdGF0dXNfd3JpdGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwKIAkJCQkgICAgaW50IGRlc3RpZCwgcXVhZGxldF90ICpkYXRhLCB1NjQgYWRkciwKIAkJCQkgICAgc2l6ZV90IGxlbmd0aCwgdTE2IGZsKQogewotCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpOwotCXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQgPSBOVUxMLCAqc2NzaV9pZF90bXA7CisJc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpOworCXN0cnVjdCBzYnAyX2x1ICpsdSA9IE5VTEwsICpsdV90bXA7CiAJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQgPSBOVUxMOwogCXN0cnVjdCBzYnAyX3N0YXR1c19ibG9jayAqc2I7CiAJdTMyIHNjc2lfc3RhdHVzID0gU0JQMl9TQ1NJX1NUQVRVU19HT09EOwotCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZDsKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JU0JQMl9ERUJVR19FTlRFUigpOwotCi0Jc2JwMnV0aWxfcGFja2V0X2R1bXAoZGF0YSwgbGVuZ3RoLCAic2JwMiBzdGF0dXMgd3JpdGUgYnkgZGV2aWNlIiwgKHUzMilhZGRyKTsKLQogCWlmICh1bmxpa2VseShsZW5ndGggPCA4IHx8IGxlbmd0aCA+IHNpemVvZihzdHJ1Y3Qgc2JwMl9zdGF0dXNfYmxvY2spKSkgewogCQlTQlAyX0VSUigiV3Jvbmcgc2l6ZSBvZiBzdGF0dXMgYmxvY2siKTsKIAkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CkBAIC0yMTU4LDEzMSArMTc2MSw5NyBAQAogCQlTQlAyX0VSUigiaG9zdCBpbmZvIGlzIE5VTEwgLSB0aGlzIGlzIGJhZCEiKTsKIAkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CiAJfQotCS8qCi0JICogRmluZCBvdXIgc2NzaV9pZCBzdHJ1Y3R1cmUgYnkgbG9va2luZyBhdCB0aGUgc3RhdHVzIGZpZm8gYWRkcmVzcwotCSAqIHdyaXR0ZW4gdG8gYnkgdGhlIHNicDIgZGV2aWNlLgotCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2NzaV9pZF90bXAsICZoaS0+c2NzaV9pZHMsIHNjc2lfbGlzdCkgewotCQlpZiAoc2NzaV9pZF90bXAtPm5lLT5ub2RlaWQgPT0gbm9kZWlkICYmCi0JCSAgICBzY3NpX2lkX3RtcC0+c3RhdHVzX2ZpZm9fYWRkciA9PSBhZGRyKSB7Ci0JCQlzY3NpX2lkID0gc2NzaV9pZF90bXA7CisKKwkvKiBGaW5kIHRoZSB1bml0IHdoaWNoIHdyb3RlIHRoZSBzdGF0dXMuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsdV90bXAsICZoaS0+bG9naWNhbF91bml0cywgbHVfbGlzdCkgeworCQlpZiAobHVfdG1wLT5uZS0+bm9kZWlkID09IG5vZGVpZCAmJgorCQkgICAgbHVfdG1wLT5zdGF0dXNfZmlmb19hZGRyID09IGFkZHIpIHsKKwkJCWx1ID0gbHVfdG1wOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JaWYgKHVubGlrZWx5KCFzY3NpX2lkKSkgewotCQlTQlAyX0VSUigic2NzaV9pZCBpcyBOVUxMIC0gZGV2aWNlIGlzIGdvbmU/Iik7CisJaWYgKHVubGlrZWx5KCFsdSkpIHsKKwkJU0JQMl9FUlIoImx1IGlzIE5VTEwgLSBkZXZpY2UgaXMgZ29uZT8iKTsKIAkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CiAJfQogCi0JLyoKLQkgKiBQdXQgcmVzcG9uc2UgaW50byBzY3NpX2lkIHN0YXR1cyBmaWZvIGJ1ZmZlci4gVGhlIGZpcnN0IHR3byBieXRlcworCS8qIFB1dCByZXNwb25zZSBpbnRvIGx1IHN0YXR1cyBmaWZvIGJ1ZmZlci4gVGhlIGZpcnN0IHR3byBieXRlcwogCSAqIGNvbWUgaW4gYmlnIGVuZGlhbiBiaXQgb3JkZXIuIE9mdGVuIHRoZSB0YXJnZXQgd3JpdGVzIG9ubHkgYQogCSAqIHRydW5jYXRlZCBzdGF0dXMgYmxvY2ssIG1pbmltYWxseSB0aGUgZmlyc3QgdHdvIHF1YWRsZXRzLiBUaGUgcmVzdAotCSAqIGlzIGltcGxpZWQgdG8gYmUgemVyb3MuCi0JICovCi0Jc2IgPSAmc2NzaV9pZC0+c3RhdHVzX2Jsb2NrOworCSAqIGlzIGltcGxpZWQgdG8gYmUgemVyb3MuICovCisJc2IgPSAmbHUtPnN0YXR1c19ibG9jazsKIAltZW1zZXQoc2ItPmNvbW1hbmRfc2V0X2RlcGVuZGVudCwgMCwgc2l6ZW9mKHNiLT5jb21tYW5kX3NldF9kZXBlbmRlbnQpKTsKIAltZW1jcHkoc2IsIGRhdGEsIGxlbmd0aCk7CiAJc2JwMnV0aWxfYmUzMl90b19jcHVfYnVmZmVyKHNiLCA4KTsKIAotCS8qCi0JICogSWdub3JlIHVuc29saWNpdGVkIHN0YXR1cy4gSGFuZGxlIGNvbW1hbmQgT1JCIHN0YXR1cy4KLQkgKi8KKwkvKiBJZ25vcmUgdW5zb2xpY2l0ZWQgc3RhdHVzLiBIYW5kbGUgY29tbWFuZCBPUkIgc3RhdHVzLiAqLwogCWlmICh1bmxpa2VseShTVEFUVVNfR0VUX1NSQyhzYi0+T1JCX29mZnNldF9oaV9taXNjKSA9PSAyKSkKLQkJY29tbWFuZCA9IE5VTEw7CisJCWNtZCA9IE5VTEw7CiAJZWxzZQotCQljb21tYW5kID0gc2JwMnV0aWxfZmluZF9jb21tYW5kX2Zvcl9vcmIoc2NzaV9pZCwKLQkJCQkJCQlzYi0+T1JCX29mZnNldF9sbyk7Ci0JaWYgKGNvbW1hbmQpIHsKLQkJU0JQMl9ERUJVRygiRm91bmQgc3RhdHVzIGZvciBjb21tYW5kIE9SQiIpOwotCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPnBkZXYsIGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCi0JCQkJCSAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhpLT5ob3N0LT5wZGV2LCBjb21tYW5kLT5zZ2VfZG1hLAotCQkJCQkgICAgc2l6ZW9mKGNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAotCQkJCQkgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQotCQlTQlAyX09SQl9ERUJVRygibWF0Y2hlZCBjb21tYW5kIG9yYiAlcCIsICZjb21tYW5kLT5jb21tYW5kX29yYik7Ci0JCW91dHN0YW5kaW5nX29yYl9kZWNyOwotCi0JCS8qCi0JCSAqIE1hdGNoZWQgc3RhdHVzIHdpdGggY29tbWFuZCwgbm93IGdyYWIgc2NzaSBjb21tYW5kIHBvaW50ZXJzCi0JCSAqIGFuZCBjaGVjayBzdGF0dXMuCi0JCSAqLworCQljbWQgPSBzYnAydXRpbF9maW5kX2NvbW1hbmRfZm9yX29yYihsdSwgc2ItPk9SQl9vZmZzZXRfbG8pOworCWlmIChjbWQpIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmhpLT5ob3N0LT5kZXZpY2UsIGNtZC0+Y29tbWFuZF9vcmJfZG1hLAorCQkJCQlzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAorCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmhpLT5ob3N0LT5kZXZpY2UsIGNtZC0+c2dlX2RtYSwKKwkJCQkJc2l6ZW9mKGNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCisJCQkJCURNQV9CSURJUkVDVElPTkFMKTsKKwkJLyogR3JhYiBTQ1NJIGNvbW1hbmQgcG9pbnRlcnMgYW5kIGNoZWNrIHN0YXR1cy4gKi8KIAkJLyoKIAkJICogRklYTUU6IElmIHRoZSBzcmMgZmllbGQgaW4gdGhlIHN0YXR1cyBpcyAxLCB0aGUgT1JCIERNQSBtdXN0CiAJCSAqIG5vdCBiZSByZXVzZWQgdW50aWwgc3RhdHVzIGZvciBhIHN1YnNlcXVlbnQgT1JCIGlzIHJlY2VpdmVkLgogCQkgKi8KLQkJU0NwbnQgPSBjb21tYW5kLT5DdXJyZW50X1NDcG50OwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7Ci0JCXNicDJ1dGlsX21hcmtfY29tbWFuZF9jb21wbGV0ZWQoc2NzaV9pZCwgY29tbWFuZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOworCQlTQ3BudCA9IGNtZC0+Q3VycmVudF9TQ3BudDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmx1LT5jbWRfb3JiX2xvY2ssIGZsYWdzKTsKKwkJc2JwMnV0aWxfbWFya19jb21tYW5kX2NvbXBsZXRlZChsdSwgY21kKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOwogCiAJCWlmIChTQ3BudCkgewogCQkJdTMyIGggPSBzYi0+T1JCX29mZnNldF9oaV9taXNjOwogCQkJdTMyIHIgPSBTVEFUVVNfR0VUX1JFU1AoaCk7CiAKIAkJCWlmIChyICE9IFJFU1BfU1RBVFVTX1JFUVVFU1RfQ09NUExFVEUpIHsKLQkJCQlTQlAyX1dBUk4oInJlc3AgMHgleCwgc2JwX3N0YXR1cyAweCV4IiwKKwkJCQlTQlAyX0lORk8oInJlc3AgMHgleCwgc2JwX3N0YXR1cyAweCV4IiwKIAkJCQkJICByLCBTVEFUVVNfR0VUX1NCUF9TVEFUVVMoaCkpOwogCQkJCXNjc2lfc3RhdHVzID0KIAkJCQkJciA9PSBSRVNQX1NUQVRVU19UUkFOU1BPUlRfRkFJTFVSRSA/CiAJCQkJCVNCUDJfU0NTSV9TVEFUVVNfQlVTWSA6CiAJCQkJCVNCUDJfU0NTSV9TVEFUVVNfQ09NTUFORF9URVJNSU5BVEVEOwogCQkJfQotCQkJLyoKLQkJCSAqIFNlZSBpZiB0aGUgdGFyZ2V0IHN0b3JlZCBhbnkgc2NzaSBzdGF0dXMgaW5mb3JtYXRpb24uCi0JCQkgKi8KLQkJCWlmIChTVEFUVVNfR0VUX0xFTihoKSA+IDEpIHsKLQkJCQlTQlAyX0RFQlVHKCJDSEVDSyBDT05ESVRJT04iKTsKKworCQkJaWYgKFNUQVRVU19HRVRfTEVOKGgpID4gMSkKIAkJCQlzY3NpX3N0YXR1cyA9IHNicDJfc3RhdHVzX3RvX3NlbnNlX2RhdGEoCiAJCQkJCSh1bmNoYXIgKilzYiwgU0NwbnQtPnNlbnNlX2J1ZmZlcik7Ci0JCQl9Ci0JCQkvKgotCQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBkZWFkIGJpdCBpcyBzZXQuIElmIHNvLCB3ZSdsbAotCQkJICogaGF2ZSB0byBpbml0aWF0ZSBhIGZldGNoIGFnZW50IHJlc2V0LgotCQkJICovCi0JCQlpZiAoU1RBVFVTX1RFU1RfREVBRChoKSkgewotCQkJCVNCUDJfREVCVUcoIkRlYWQgYml0IHNldCAtICIKLQkJCQkJICAgImluaXRpYXRpbmcgZmV0Y2ggYWdlbnQgcmVzZXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JwMl9hZ2VudF9yZXNldChzY3NpX2lkLCAwKTsKLQkJCX0KLQkJCVNCUDJfT1JCX0RFQlVHKCJjb21wbGV0aW5nIGNvbW1hbmQgb3JiICVwIiwgJmNvbW1hbmQtPmNvbW1hbmRfb3JiKTsKKworCQkJaWYgKFNUQVRVU19URVNUX0RFQUQoaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicDJfYWdlbnRfcmVzZXQobHUsIDApOwogCQl9CiAKLQkJLyoKLQkJICogQ2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIGluLXVzZS4gSWYgdGhlcmUKKwkJLyogQ2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIGluLXVzZS4gSWYgdGhlcmUKIAkJICogYXJlIG5vbmUsIHdlIGtub3cgdGhhdCB0aGUgZmV0Y2ggYWdlbnQgbGVmdCB0aGUgYWN0aXZlIHN0YXRlCiAJCSAqIF9hbmRfIHRoYXQgd2UgZGlkIG5vdCByZWFjdGl2YXRlIGl0IHlldC4gVGhlcmVmb3JlIGNsZWFyCiAJCSAqIGxhc3Rfb3JiIHNvIHRoYXQgbmV4dCB0aW1lIHdlIHdyaXRlIGRpcmVjdGx5IHRvIHRoZQogCQkgKiBPUkJfUE9JTlRFUiByZWdpc3Rlci4gVGhhdCB3YXkgdGhlIGZldGNoIGFnZW50IGRvZXMgbm90IG5lZWQKLQkJICogdG8gcmVmZXRjaCB0aGUgbmV4dF9PUkIuCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7Ci0JCWlmIChsaXN0X2VtcHR5KCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2ludXNlKSkKLQkJCXNjc2lfaWQtPmxhc3Rfb3JiID0gTlVMTDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisJCSAqIHRvIHJlZmV0Y2ggdGhlIG5leHRfT1JCLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOworCQlpZiAobGlzdF9lbXB0eSgmbHUtPmNtZF9vcmJfaW51c2UpKQorCQkJbHUtPmxhc3Rfb3JiID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOwogCiAJfSBlbHNlIHsKLQkJLyoKLQkJICogSXQncyBwcm9iYWJseSBhIGxvZ2luL2xvZ291dC9yZWNvbm5lY3Qgc3RhdHVzLgotCQkgKi8KLQkJaWYgKChzYi0+T1JCX29mZnNldF9sbyA9PSBzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiX2RtYSkgfHwKLQkJICAgIChzYi0+T1JCX29mZnNldF9sbyA9PSBzY3NpX2lkLT5sb2dpbl9vcmJfZG1hKSB8fAotCQkgICAgKHNiLT5PUkJfb2Zmc2V0X2xvID09IHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmJfZG1hKSB8fAotCQkgICAgKHNiLT5PUkJfb2Zmc2V0X2xvID09IHNjc2lfaWQtPmxvZ291dF9vcmJfZG1hKSkgewotCQkJc2NzaV9pZC0+YWNjZXNzX2NvbXBsZXRlID0gMTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYWNjZXNzX3dxKTsKKwkJLyogSXQncyBwcm9iYWJseSBzdGF0dXMgYWZ0ZXIgYSBtYW5hZ2VtZW50IHJlcXVlc3QuICovCisJCWlmICgoc2ItPk9SQl9vZmZzZXRfbG8gPT0gbHUtPnJlY29ubmVjdF9vcmJfZG1hKSB8fAorCQkgICAgKHNiLT5PUkJfb2Zmc2V0X2xvID09IGx1LT5sb2dpbl9vcmJfZG1hKSB8fAorCQkgICAgKHNiLT5PUkJfb2Zmc2V0X2xvID09IGx1LT5xdWVyeV9sb2dpbnNfb3JiX2RtYSkgfHwKKwkJICAgIChzYi0+T1JCX29mZnNldF9sbyA9PSBsdS0+bG9nb3V0X29yYl9kbWEpKSB7CisJCQlsdS0+YWNjZXNzX2NvbXBsZXRlID0gMTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2JwMl9hY2Nlc3Nfd3EpOwogCQl9CiAJfQogCi0JaWYgKFNDcG50KSB7Ci0JCVNCUDJfREVCVUcoIkNvbXBsZXRpbmcgU0NTSSBjb21tYW5kIik7Ci0JCXNicDJzY3NpX2NvbXBsZXRlX2NvbW1hbmQoc2NzaV9pZCwgc2NzaV9zdGF0dXMsIFNDcG50LAotCQkJCQkgIGNvbW1hbmQtPkN1cnJlbnRfZG9uZSk7Ci0JCVNCUDJfT1JCX0RFQlVHKCJjb21tYW5kIG9yYiBjb21wbGV0ZWQiKTsKLQl9Ci0KKwlpZiAoU0NwbnQpCisJCXNicDJzY3NpX2NvbXBsZXRlX2NvbW1hbmQobHUsIHNjc2lfc3RhdHVzLCBTQ3BudCwKKwkJCQkJICBjbWQtPkN1cnJlbnRfZG9uZSk7CiAJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwogfQogCkBAIC0yMjkwLDc3ICsxODU5LDU3IEBACiAgKiBTQ1NJIGludGVyZmFjZSByZWxhdGVkIHNlY3Rpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFRoaXMgcm91dGluZSBpcyB0aGUgbWFpbiByZXF1ZXN0IGVudHJ5IHJvdXRpbmUgZm9yIGRvaW5nIEkvTy4gSXQgaXMKLSAqIGNhbGxlZCBmcm9tIHRoZSBzY3NpIHN0YWNrIGRpcmVjdGx5LgotICovCiBzdGF0aWMgaW50IHNicDJzY3NpX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKIAkJCQkgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7Ci0Jc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCA9Ci0JCShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07Ci0Jc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGk7CisJc3RydWN0IHNicDJfbHUgKmx1ID0gKHN0cnVjdCBzYnAyX2x1ICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpOwogCWludCByZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKIAotCVNCUDJfREVCVUdfRU5URVIoKTsKLSNpZiAoQ09ORklHX0lFRUUxMzk0X1NCUDJfREVCVUcgPj0gMikgfHwgZGVmaW5lZChDT05GSUdfSUVFRTEzOTRfU0JQMl9QQUNLRVRfRFVNUCkKLQlzY3NpX3ByaW50X2NvbW1hbmQoU0NwbnQpOwotI2VuZGlmCi0KLQlpZiAoIXNicDJ1dGlsX25vZGVfaXNfYXZhaWxhYmxlKHNjc2lfaWQpKQorCWlmICh1bmxpa2VseSghc2JwMnV0aWxfbm9kZV9pc19hdmFpbGFibGUobHUpKSkKIAkJZ290byBkb25lOwogCi0JaGkgPSBzY3NpX2lkLT5oaTsKKwloaSA9IGx1LT5oaTsKIAotCWlmICghaGkpIHsKLQkJU0JQMl9FUlIoInNicDJzY3NpX2hvc3RfaW5mbyBpcyBOVUxMIC0gdGhpcyBpcyBiYWQhIik7CisJaWYgKHVubGlrZWx5KCFoaSkpIHsKKwkJU0JQMl9FUlIoInNicDJfZndob3N0X2luZm8gaXMgTlVMTCAtIHRoaXMgaXMgYmFkISIpOwogCQlnb3RvIGRvbmU7CiAJfQogCi0JLyoKLQkgKiBVbnRpbCB3ZSBoYW5kbGUgbXVsdGlwbGUgbHVucywganVzdCByZXR1cm4gc2VsZWN0aW9uIHRpbWUtb3V0Ci0JICogdG8gYW55IElPIGRpcmVjdGVkIGF0IG5vbi16ZXJvIExVTnMKLQkgKi8KLQlpZiAoU0NwbnQtPmRldmljZS0+bHVuKQorCS8qIE11bHRpcGxlIHVuaXRzIGFyZSBjdXJyZW50bHkgcmVwcmVzZW50ZWQgdG8gdGhlIFNDU0kgY29yZSBhcyBzZXBhcmF0ZQorCSAqIHRhcmdldHMsIG5vdCBhcyBvbmUgdGFyZ2V0IHdpdGggbXVsdGlwbGUgTFVzLiBUaGVyZWZvcmUgcmV0dXJuCisJICogc2VsZWN0aW9uIHRpbWUtb3V0IHRvIGFueSBJTyBkaXJlY3RlZCBhdCBub24temVybyBMVU5zLiAqLworCWlmICh1bmxpa2VseShTQ3BudC0+ZGV2aWNlLT5sdW4pKQogCQlnb3RvIGRvbmU7CiAKLQkvKgotCSAqIENoZWNrIGZvciByZXF1ZXN0IHNlbnNlIGNvbW1hbmQsIGFuZCBoYW5kbGUgaXQgaGVyZQotCSAqIChhdXRvcmVxdWVzdCBzZW5zZSkKLQkgKi8KKwkvKiBoYW5kbGUgdGhlIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCBoZXJlIChhdXRvLXJlcXVlc3Qgc2Vuc2UpICovCiAJaWYgKFNDcG50LT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpIHsKLQkJU0JQMl9ERUJVRygiUkVRVUVTVF9TRU5TRSIpOwotCQltZW1jcHkoU0NwbnQtPnJlcXVlc3RfYnVmZmVyLCBTQ3BudC0+c2Vuc2VfYnVmZmVyLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJbWVtY3B5KFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwgU0NwbnQtPnNlbnNlX2J1ZmZlciwKKwkJICAgICAgIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pOwogCQltZW1zZXQoU0NwbnQtPnNlbnNlX2J1ZmZlciwgMCwgc2l6ZW9mKFNDcG50LT5zZW5zZV9idWZmZXIpKTsKLQkJc2JwMnNjc2lfY29tcGxldGVfY29tbWFuZChzY3NpX2lkLCBTQlAyX1NDU0lfU1RBVFVTX0dPT0QsIFNDcG50LCBkb25lKTsKKwkJc2JwMnNjc2lfY29tcGxldGVfY29tbWFuZChsdSwgU0JQMl9TQ1NJX1NUQVRVU19HT09ELCBTQ3BudCwKKwkJCQkJICBkb25lKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBidXMgcmVzZXQuCi0JICovCi0JaWYgKCFocHNiX25vZGVfZW50cnlfdmFsaWQoc2NzaV9pZC0+bmUpKSB7CisJaWYgKHVubGlrZWx5KCFocHNiX25vZGVfZW50cnlfdmFsaWQobHUtPm5lKSkpIHsKIAkJU0JQMl9FUlIoIkJ1cyByZXNldCBpbiBwcm9ncmVzcyAtIHJlamVjdGluZyBjb21tYW5kIik7CiAJCXJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKIAkJZ290byBkb25lOwogCX0KIAotCS8qCi0JICogQmlkaXJlY3Rpb25hbCBjb21tYW5kcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCwKLQkgKiBhbmQgdW5rbm93biB0cmFuc2ZlciBkaXJlY3Rpb24gbm90IGhhbmRsZWQuCi0JICovCi0JaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfQklESVJFQ1RJT05BTCkgeworCS8qIEJpZGlyZWN0aW9uYWwgY29tbWFuZHMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQsCisJICogYW5kIHVua25vd24gdHJhbnNmZXIgZGlyZWN0aW9uIG5vdCBoYW5kbGVkLiAqLworCWlmICh1bmxpa2VseShTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0JJRElSRUNUSU9OQUwpKSB7CiAJCVNCUDJfRVJSKCJDYW5ub3QgaGFuZGxlIERNQV9CSURJUkVDVElPTkFMIC0gcmVqZWN0aW5nIGNvbW1hbmQiKTsKIAkJcmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwogCQlnb3RvIGRvbmU7CiAJfQogCi0JLyoKLQkgKiBUcnkgYW5kIHNlbmQgb3VyIFNDU0kgY29tbWFuZAotCSAqLwotCWlmIChzYnAyX3NlbmRfY29tbWFuZChzY3NpX2lkLCBTQ3BudCwgZG9uZSkpIHsKKwlpZiAoc2JwMl9zZW5kX2NvbW1hbmQobHUsIFNDcG50LCBkb25lKSkgewogCQlTQlAyX0VSUigiRXJyb3Igc2VuZGluZyBTQ1NJIGNvbW1hbmQiKTsKLQkJc2JwMnNjc2lfY29tcGxldGVfY29tbWFuZChzY3NpX2lkLCBTQlAyX1NDU0lfU1RBVFVTX1NFTEVDVElPTl9USU1FT1VULAorCQlzYnAyc2NzaV9jb21wbGV0ZV9jb21tYW5kKGx1LAorCQkJCQkgIFNCUDJfU0NTSV9TVEFUVVNfU0VMRUNUSU9OX1RJTUVPVVQsCiAJCQkJCSAgU0NwbnQsIGRvbmUpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTIzNzEsNzUgKzE5MjAsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIGNvbXBsZXRlIGFsbCBvdXRzdGFuZGluZyBTQlAtMgotICogY29tbWFuZHMgKGluIGNhc2Ugb2YgcmVzZXRzLCBldGMuKS4KLSAqLwotc3RhdGljIHZvaWQgc2JwMnNjc2lfY29tcGxldGVfYWxsX2NvbW1hbmRzKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCi0JCQkJCSAgIHUzMiBzdGF0dXMpCitzdGF0aWMgdm9pZCBzYnAyc2NzaV9jb21wbGV0ZV9hbGxfY29tbWFuZHMoc3RydWN0IHNicDJfbHUgKmx1LCB1MzIgc3RhdHVzKQogewotCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7CisJc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpID0gbHUtPmhpOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxoOwotCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZDsKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNtZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JU0JQMl9ERUJVR19FTlRFUigpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9pbnVzZSkpIHsKLQkJU0JQMl9ERUJVRygiRm91bmQgcGVuZGluZyBjb21tYW5kIHRvIGNvbXBsZXRlIik7Ci0JCWxoID0gc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9pbnVzZS5uZXh0OwotCQljb21tYW5kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvLCBsaXN0KTsKLQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhpLT5ob3N0LT5wZGV2LCBjb21tYW5kLT5jb21tYW5kX29yYl9kbWEsCi0JCQkJCSAgICBzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAotCQkJCQkgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShoaS0+aG9zdC0+cGRldiwgY29tbWFuZC0+c2dlX2RtYSwKLQkJCQkJICAgIHNpemVvZihjb21tYW5kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKLQkJCQkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JCXNicDJ1dGlsX21hcmtfY29tbWFuZF9jb21wbGV0ZWQoc2NzaV9pZCwgY29tbWFuZCk7Ci0JCWlmIChjb21tYW5kLT5DdXJyZW50X1NDcG50KSB7Ci0JCQljb21tYW5kLT5DdXJyZW50X1NDcG50LT5yZXN1bHQgPSBzdGF0dXMgPDwgMTY7Ci0JCQljb21tYW5kLT5DdXJyZW50X2RvbmUoY29tbWFuZC0+Q3VycmVudF9TQ3BudCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmx1LT5jbWRfb3JiX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmx1LT5jbWRfb3JiX2ludXNlKSkgeworCQlsaCA9IGx1LT5jbWRfb3JiX2ludXNlLm5leHQ7CisJCWNtZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbywgbGlzdCk7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZoaS0+aG9zdC0+ZGV2aWNlLCBjbWQtPmNvbW1hbmRfb3JiX2RtYSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZoaS0+aG9zdC0+ZGV2aWNlLCBjbWQtPnNnZV9kbWEsCisJCQkJCXNpemVvZihjbWQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAorCQkJCQlETUFfQklESVJFQ1RJT05BTCk7CisJCXNicDJ1dGlsX21hcmtfY29tbWFuZF9jb21wbGV0ZWQobHUsIGNtZCk7CisJCWlmIChjbWQtPkN1cnJlbnRfU0NwbnQpIHsKKwkJCWNtZC0+Q3VycmVudF9TQ3BudC0+cmVzdWx0ID0gc3RhdHVzIDw8IDE2OworCQkJY21kLT5DdXJyZW50X2RvbmUoY21kLT5DdXJyZW50X1NDcG50KTsKIAkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm47CiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBjb21wbGV0ZSBhIHJlZ3VsYXIgU0JQLTIgY29tbWFuZC4KLSAqCi0gKiBUaGlzIGNhbiBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCisgKiBDb21wbGV0ZSBhIHJlZ3VsYXIgU0NTSSBjb21tYW5kLiBDYW4gYmUgY2FsbGVkIGluIGF0b21pYyBjb250ZXh0LgogICovCi1zdGF0aWMgdm9pZCBzYnAyc2NzaV9jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCi0JCQkJICAgICAgdTMyIHNjc2lfc3RhdHVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKK3N0YXRpYyB2b2lkIHNicDJzY3NpX2NvbXBsZXRlX2NvbW1hbmQoc3RydWN0IHNicDJfbHUgKmx1LCB1MzIgc2NzaV9zdGF0dXMsCisJCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCiAJCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7Ci0JU0JQMl9ERUJVR19FTlRFUigpOwotCi0JLyoKLQkgKiBTYW5pdHkKLQkgKi8KIAlpZiAoIVNDcG50KSB7CiAJCVNCUDJfRVJSKCJTQ3BudCBpcyBOVUxMIik7CiAJCXJldHVybjsKIAl9CiAKLQkvKgotCSAqIElmIGEgYnVzIHJlc2V0IGlzIGluIHByb2dyZXNzIGFuZCB0aGVyZSB3YXMgYW4gZXJyb3IsIGRvbid0Ci0JICogY29tcGxldGUgdGhlIGNvbW1hbmQsIGp1c3QgbGV0IGl0IGdldCByZXRyaWVkIGF0IHRoZSBlbmQgb2YgdGhlCi0JICogYnVzIHJlc2V0LgotCSAqLwotCWlmICghaHBzYl9ub2RlX2VudHJ5X3ZhbGlkKHNjc2lfaWQtPm5lKQotCSAgICAmJiAoc2NzaV9zdGF0dXMgIT0gU0JQMl9TQ1NJX1NUQVRVU19HT09EKSkgewotCQlTQlAyX0VSUigiQnVzIHJlc2V0IGluIHByb2dyZXNzIC0gcmV0cnkgY29tbWFuZCBsYXRlciIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBTd2l0Y2ggb24gc2NzaSBzdGF0dXMKLQkgKi8KIAlzd2l0Y2ggKHNjc2lfc3RhdHVzKSB7CiAJY2FzZSBTQlAyX1NDU0lfU1RBVFVTX0dPT0Q6CiAJCVNDcG50LT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CkBAIC0yNDUxLDEyICsxOTcxLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNCUDJfU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OOgotCQlTQlAyX0RFQlVHKCJTQlAyX1NDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTiIpOwogCQlTQ3BudC0+cmVzdWx0ID0gQ0hFQ0tfQ09ORElUSU9OIDw8IDEgfCBESURfT0sgPDwgMTY7Ci0jaWYgQ09ORklHX0lFRUUxMzk0X1NCUDJfREVCVUcgPj0gMQotCQlzY3NpX3ByaW50X2NvbW1hbmQoU0NwbnQpOwotCQlzY3NpX3ByaW50X3NlbnNlKFNCUDJfREVWSUNFX05BTUUsIFNDcG50KTsKLSNlbmRpZgogCQlicmVhazsKIAogCWNhc2UgU0JQMl9TQ1NJX1NUQVRVU19TRUxFQ1RJT05fVElNRU9VVDoKQEAgLTI0NzgsMTE4ICsxOTkzLDg4IEBACiAJCVNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CiAJfQogCi0JLyoKLQkgKiBJZiBhIGJ1cyByZXNldCBpcyBpbiBwcm9ncmVzcyBhbmQgdGhlcmUgd2FzIGFuIGVycm9yLCBjb21wbGV0ZQotCSAqIHRoZSBjb21tYW5kIGFzIGJ1c3kgc28gdGhhdCBpdCB3aWxsIGdldCByZXRyaWVkLgotCSAqLwotCWlmICghaHBzYl9ub2RlX2VudHJ5X3ZhbGlkKHNjc2lfaWQtPm5lKQorCS8qIElmIGEgYnVzIHJlc2V0IGlzIGluIHByb2dyZXNzIGFuZCB0aGVyZSB3YXMgYW4gZXJyb3IsIGNvbXBsZXRlCisJICogdGhlIGNvbW1hbmQgYXMgYnVzeSBzbyB0aGF0IGl0IHdpbGwgZ2V0IHJldHJpZWQuICovCisJaWYgKCFocHNiX25vZGVfZW50cnlfdmFsaWQobHUtPm5lKQogCSAgICAmJiAoc2NzaV9zdGF0dXMgIT0gU0JQMl9TQ1NJX1NUQVRVU19HT09EKSkgewogCQlTQlAyX0VSUigiQ29tcGxldGluZyBjb21tYW5kIHdpdGggYnVzeSAoYnVzIHJlc2V0KSIpOwogCQlTQ3BudC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OwogCX0KIAotCS8qCi0JICogSWYgYSB1bml0IGF0dGVudGlvbiBvY2N1cnMsIHJldHVybiBidXN5IHN0YXR1cyBzbyBpdCBnZXRzCi0JICogcmV0cmllZC4uLiBpdCBjb3VsZCBoYXZlIGhhcHBlbmVkIGJlY2F1c2Ugb2YgYSAxMzk0IGJ1cyByZXNldAotCSAqIG9yIGhvdC1wbHVnLi4uCi0JICogWFhYICBESURfQlVTX0JVU1kgaXMgYWN0dWFsbHkgYSBiYWQgaWRlYSBiZWNhdXNlIGl0IHdpbGwgZGVmeQotCSAqIHRoZSBzY3NpIGxheWVyJ3MgcmV0cnkgbG9naWMuCi0JICovCi0jaWYgMAotCWlmICgoc2NzaV9zdGF0dXMgPT0gU0JQMl9TQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT04pICYmCi0JICAgIChTQ3BudC0+c2Vuc2VfYnVmZmVyWzJdID09IFVOSVRfQVRURU5USU9OKSkgewotCQlTQlAyX0RFQlVHKCJVTklUIEFUVEVOVElPTiAtIHJldHVybiBidXN5Iik7Ci0JCVNDcG50LT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIFRlbGwgc2NzaSBzdGFjayB0aGF0IHdlJ3JlIGRvbmUgd2l0aCB0aGlzIGNvbW1hbmQKLQkgKi8KKwkvKiBUZWxsIHRoZSBTQ1NJIHN0YWNrIHRoYXQgd2UncmUgZG9uZSB3aXRoIHRoaXMgY29tbWFuZC4gKi8KIAlkb25lKFNDcG50KTsKIH0KIAogc3RhdGljIGludCBzYnAyc2NzaV9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7Ci0Jc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCA9Ci0JCShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICopc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF07CisJc3RydWN0IHNicDJfbHUgKmx1ID0gKHN0cnVjdCBzYnAyX2x1ICopc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF07CiAKLQlzY3NpX2lkLT5zZGV2ID0gc2RldjsKKwlsdS0+c2RldiA9IHNkZXY7CiAJc2Rldi0+YWxsb3dfcmVzdGFydCA9IDE7CiAKLQlpZiAoc2NzaV9pZC0+d29ya2Fyb3VuZHMgJiBTQlAyX1dPUktBUk9VTkRfSU5RVUlSWV8zNikKKwlpZiAobHUtPndvcmthcm91bmRzICYgU0JQMl9XT1JLQVJPVU5EX0lOUVVJUllfMzYpCiAJCXNkZXYtPmlucXVpcnlfbGVuID0gMzY7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2JwMnNjc2lfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKLQlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkID0KLQkJKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3Qgc2JwMl9sdSAqbHUgPSAoc3RydWN0IHNicDJfbHUgKilzZGV2LT5ob3N0LT5ob3N0ZGF0YVswXTsKIAogCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsICg1MTIgLSAxKSk7CiAJc2Rldi0+dXNlXzEwX2Zvcl9ydyA9IDE7CiAKIAlpZiAoc2Rldi0+dHlwZSA9PSBUWVBFX0RJU0sgJiYKLQkgICAgc2NzaV9pZC0+d29ya2Fyb3VuZHMgJiBTQlAyX1dPUktBUk9VTkRfTU9ERV9TRU5TRV84KQorCSAgICBsdS0+d29ya2Fyb3VuZHMgJiBTQlAyX1dPUktBUk9VTkRfTU9ERV9TRU5TRV84KQogCQlzZGV2LT5za2lwX21zX3BhZ2VfOCA9IDE7Ci0JaWYgKHNjc2lfaWQtPndvcmthcm91bmRzICYgU0JQMl9XT1JLQVJPVU5EX0ZJWF9DQVBBQ0lUWSkKKwlpZiAobHUtPndvcmthcm91bmRzICYgU0JQMl9XT1JLQVJPVU5EX0ZJWF9DQVBBQ0lUWSkKIAkJc2Rldi0+Zml4X2NhcGFjaXR5ID0gMTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2JwMnNjc2lfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7Ci0JKChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICopc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF0pLT5zZGV2ID0gTlVMTDsKKwkoKHN0cnVjdCBzYnAyX2x1ICopc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF0pLT5zZGV2ID0gTlVMTDsKIAlyZXR1cm47CiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgc2NzaSBzdGFjayB3aGVuIHNvbWV0aGluZyBoYXMgcmVhbGx5IGdvbmUgd3JvbmcuICBVc3VhbGx5Ci0gKiBjYWxsZWQgd2hlbiBhIGNvbW1hbmQgaGFzIHRpbWVkLW91dCBmb3Igc29tZSByZWFzb24uCisgKiBDYWxsZWQgYnkgc2NzaSBzdGFjayB3aGVuIHNvbWV0aGluZyBoYXMgcmVhbGx5IGdvbmUgd3JvbmcuCisgKiBVc3VhbGx5IGNhbGxlZCB3aGVuIGEgY29tbWFuZCBoYXMgdGltZWQtb3V0IGZvciBzb21lIHJlYXNvbi4KICAqLwogc3RhdGljIGludCBzYnAyc2NzaV9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKLQlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkID0KLQkJKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKLQlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOwotCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZDsKKwlzdHJ1Y3Qgc2JwMl9sdSAqbHUgPSAoc3RydWN0IHNicDJfbHUgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3Qgc2JwMl9md2hvc3RfaW5mbyAqaGkgPSBsdS0+aGk7CisJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjbWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCVNCUDJfRVJSKCJhYm9ydGluZyBzYnAyIGNvbW1hbmQiKTsKKwlTQlAyX0lORk8oImFib3J0aW5nIHNicDIgY29tbWFuZCIpOwogCXNjc2lfcHJpbnRfY29tbWFuZChTQ3BudCk7CiAKLQlpZiAoc2JwMnV0aWxfbm9kZV9pc19hdmFpbGFibGUoc2NzaV9pZCkpIHsKKwlpZiAoc2JwMnV0aWxfbm9kZV9pc19hdmFpbGFibGUobHUpKSB7CisJCXNicDJfYWdlbnRfcmVzZXQobHUsIDEpOwogCi0JCS8qCi0JCSAqIFJpZ2h0IG5vdywganVzdCByZXR1cm4gYW55IG1hdGNoaW5nIGNvbW1hbmQgc3RydWN0dXJlcwotCQkgKiB0byB0aGUgZnJlZSBwb29sLgotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOwotCQljb21tYW5kID0gc2JwMnV0aWxfZmluZF9jb21tYW5kX2Zvcl9TQ3BudChzY3NpX2lkLCBTQ3BudCk7Ci0JCWlmIChjb21tYW5kKSB7Ci0JCQlTQlAyX0RFQlVHKCJGb3VuZCBjb21tYW5kIHRvIGFib3J0Iik7Ci0JCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPnBkZXYsCi0JCQkJCQkgICAgY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hLAotCQkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCi0JCQkJCQkgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPnBkZXYsCi0JCQkJCQkgICAgY29tbWFuZC0+c2dlX2RtYSwKLQkJCQkJCSAgICBzaXplb2YoY29tbWFuZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCi0JCQkJCQkgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJCXNicDJ1dGlsX21hcmtfY29tbWFuZF9jb21wbGV0ZWQoc2NzaV9pZCwgY29tbWFuZCk7Ci0JCQlpZiAoY29tbWFuZC0+Q3VycmVudF9TQ3BudCkgewotCQkJCWNvbW1hbmQtPkN1cnJlbnRfU0NwbnQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKLQkJCQljb21tYW5kLT5DdXJyZW50X2RvbmUoY29tbWFuZC0+Q3VycmVudF9TQ3BudCk7CisJCS8qIFJldHVybiBhIG1hdGNoaW5nIGNvbW1hbmQgc3RydWN0dXJlIHRvIHRoZSBmcmVlIHBvb2wuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CisJCWNtZCA9IHNicDJ1dGlsX2ZpbmRfY29tbWFuZF9mb3JfU0NwbnQobHUsIFNDcG50KTsKKwkJaWYgKGNtZCkgeworCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmhpLT5ob3N0LT5kZXZpY2UsCisJCQkJCWNtZC0+Y29tbWFuZF9vcmJfZG1hLAorCQkJCQlzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAorCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZoaS0+aG9zdC0+ZGV2aWNlLCBjbWQtPnNnZV9kbWEsCisJCQkJCXNpemVvZihjbWQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAorCQkJCQlETUFfQklESVJFQ1RJT05BTCk7CisJCQlzYnAydXRpbF9tYXJrX2NvbW1hbmRfY29tcGxldGVkKGx1LCBjbWQpOworCQkJaWYgKGNtZC0+Q3VycmVudF9TQ3BudCkgeworCQkJCWNtZC0+Q3VycmVudF9TQ3BudC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQkJCWNtZC0+Q3VycmVudF9kb25lKGNtZC0+Q3VycmVudF9TQ3BudCk7CiAJCQl9CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx1LT5jbWRfb3JiX2xvY2ssIGZsYWdzKTsKIAotCQkvKgotCQkgKiBJbml0aWF0ZSBhIGZldGNoIGFnZW50IHJlc2V0LgotCQkgKi8KLQkJc2JwMl9hZ2VudF9yZXNldChzY3NpX2lkLCAxKTsKLQkJc2JwMnNjc2lfY29tcGxldGVfYWxsX2NvbW1hbmRzKHNjc2lfaWQsIERJRF9CVVNfQlVTWSk7CisJCXNicDJzY3NpX2NvbXBsZXRlX2FsbF9jb21tYW5kcyhsdSwgRElEX0JVU19CVVNZKTsKIAl9CiAKIAlyZXR1cm4gU1VDQ0VTUzsKQEAgLTI2MDAsMTQgKzIwODUsMTMgQEAKICAqLwogc3RhdGljIGludCBzYnAyc2NzaV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKLQlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkID0KLQkJKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3Qgc2JwMl9sdSAqbHUgPSAoc3RydWN0IHNicDJfbHUgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKIAotCVNCUDJfRVJSKCJyZXNldCByZXF1ZXN0ZWQiKTsKKwlTQlAyX0lORk8oInJlc2V0IHJlcXVlc3RlZCIpOwogCi0JaWYgKHNicDJ1dGlsX25vZGVfaXNfYXZhaWxhYmxlKHNjc2lfaWQpKSB7Ci0JCVNCUDJfRVJSKCJHZW5lcmF0aW5nIHNicDIgZmV0Y2ggYWdlbnQgcmVzZXQiKTsKLQkJc2JwMl9hZ2VudF9yZXNldChzY3NpX2lkLCAxKTsKKwlpZiAoc2JwMnV0aWxfbm9kZV9pc19hdmFpbGFibGUobHUpKSB7CisJCVNCUDJfSU5GTygiZ2VuZXJhdGluZyBzYnAyIGZldGNoIGFnZW50IHJlc2V0Iik7CisJCXNicDJfYWdlbnRfcmVzZXQobHUsIDEpOwogCX0KIAogCXJldHVybiBTVUNDRVNTOwpAQCAtMjYxOCw5MCArMjEwMiw1MCBAQAogCQkJCQkgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwotCXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQ7Ci0JaW50IGx1bjsKKwlzdHJ1Y3Qgc2JwMl9sdSAqbHU7CiAKIAlpZiAoIShzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KSkpCiAJCXJldHVybiAwOwogCi0JaWYgKCEoc2NzaV9pZCA9IChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICopc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF0pKQorCWlmICghKGx1ID0gKHN0cnVjdCBzYnAyX2x1ICopc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF0pKQogCQlyZXR1cm4gMDsKIAotCWx1biA9IE9SQl9TRVRfTFVOKHNjc2lfaWQtPnNicDJfbHVuKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwMTZMeDolZDolZFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzY3NpX2lkLT5uZS0+Z3VpZCwKLQkJICAgICAgIHNjc2lfaWQtPnVkLT5pZCwgbHVuKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlMDE2THg6JWQ6JWRcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpbHUtPm5lLT5ndWlkLAorCQkgICAgICAgbHUtPnVkLT5pZCwgT1JCX1NFVF9MVU4obHUtPmx1bikpOwogfQotc3RhdGljIERFVklDRV9BVFRSKGllZWUxMzk0X2lkLCBTX0lSVUdPLCBzYnAyX3N5c2ZzX2llZWUxMzk0X2lkX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnNicDJfc3lzZnNfc2Rldl9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9pZWVlMTM5NF9pZCwKLQlOVUxMCi19OwogCiBNT0RVTEVfQVVUSE9SKCJCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSUVFRS0xMzk0IFNCUC0yIHByb3RvY29sIGRyaXZlciIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoU0JQMl9ERVZJQ0VfTkFNRSk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLS8qIFNDU0kgaG9zdCB0ZW1wbGF0ZSAqLwotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgc2NzaV9kcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLm1vZHVsZSA9CQkJVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJCQkiU0JQLTIgSUVFRS0xMzk0IiwKLQkucHJvY19uYW1lID0JCQlTQlAyX0RFVklDRV9OQU1FLAotCS5xdWV1ZWNvbW1hbmQgPQkJCXNicDJzY3NpX3F1ZXVlY29tbWFuZCwKLQkuZWhfYWJvcnRfaGFuZGxlciA9CQlzYnAyc2NzaV9hYm9ydCwKLQkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPQlzYnAyc2NzaV9yZXNldCwKLQkuc2xhdmVfYWxsb2MgPQkJCXNicDJzY3NpX3NsYXZlX2FsbG9jLAotCS5zbGF2ZV9jb25maWd1cmUgPQkJc2JwMnNjc2lfc2xhdmVfY29uZmlndXJlLAotCS5zbGF2ZV9kZXN0cm95ID0JCXNicDJzY3NpX3NsYXZlX2Rlc3Ryb3ksCi0JLnRoaXNfaWQgPQkJCS0xLAotCS5zZ190YWJsZXNpemUgPQkJCVNHX0FMTCwKLQkudXNlX2NsdXN0ZXJpbmcgPQkJRU5BQkxFX0NMVVNURVJJTkcsCi0JLmNtZF9wZXJfbHVuID0JCQlTQlAyX01BWF9DTURTLAotCS5jYW5fcXVldWUgPSAJCQlTQlAyX01BWF9DTURTLAotCS5lbXVsYXRlZCA9CQkJMSwKLQkuc2Rldl9hdHRycyA9CQkJc2JwMl9zeXNmc19zZGV2X2F0dHJzLAotfTsKLQogc3RhdGljIGludCBzYnAyX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAotCVNCUDJfREVCVUdfRU5URVIoKTsKLQotCS8qIE1vZHVsZSBsb2FkIGRlYnVnIG9wdGlvbiB0byBmb3JjZSBvbmUgY29tbWFuZCBhdCBhIHRpbWUgKHNlcmlhbGl6aW5nIEkvTykgKi8KLQlpZiAoc2VyaWFsaXplX2lvKSB7Ci0JCVNCUDJfSU5GTygiRHJpdmVyIGZvcmNlZCB0byBzZXJpYWxpemUgSS9PIChzZXJpYWxpemVfaW89MSkiKTsKLQkJU0JQMl9JTkZPKCJUcnkgc2VyaWFsaXplX2lvPTAgZm9yIGJldHRlciBwZXJmb3JtYW5jZSIpOwotCQlzY3NpX2RyaXZlcl90ZW1wbGF0ZS5jYW5fcXVldWUgPSAxOwotCQlzY3NpX2RyaXZlcl90ZW1wbGF0ZS5jbWRfcGVyX2x1biA9IDE7CisJaWYgKHNicDJfc2VyaWFsaXplX2lvKSB7CisJCXNicDJfc2hvc3RfdGVtcGxhdGUuY2FuX3F1ZXVlID0gMTsKKwkJc2JwMl9zaG9zdF90ZW1wbGF0ZS5jbWRfcGVyX2x1biA9IDE7CiAJfQogCiAJaWYgKHNicDJfZGVmYXVsdF93b3JrYXJvdW5kcyAmIFNCUDJfV09SS0FST1VORF8xMjhLX01BWF9UUkFOUyAmJgotCSAgICAobWF4X3NlY3RvcnMgKiA1MTIpID4gKDEyOCAqIDEwMjQpKQotCQltYXhfc2VjdG9ycyA9IDEyOCAqIDEwMjQgLyA1MTI7Ci0Jc2NzaV9kcml2ZXJfdGVtcGxhdGUubWF4X3NlY3RvcnMgPSBtYXhfc2VjdG9yczsKKwkgICAgKHNicDJfbWF4X3NlY3RvcnMgKiA1MTIpID4gKDEyOCAqIDEwMjQpKQorCQlzYnAyX21heF9zZWN0b3JzID0gMTI4ICogMTAyNCAvIDUxMjsKKwlzYnAyX3Nob3N0X3RlbXBsYXRlLm1heF9zZWN0b3JzID0gc2JwMl9tYXhfc2VjdG9yczsKIAotCS8qIFJlZ2lzdGVyIG91ciBoaWdoIGxldmVsIGRyaXZlciB3aXRoIDEzOTQgc3RhY2sgKi8KIAlocHNiX3JlZ2lzdGVyX2hpZ2hsZXZlbCgmc2JwMl9oaWdobGV2ZWwpOwotCiAJcmV0ID0gaHBzYl9yZWdpc3Rlcl9wcm90b2NvbCgmc2JwMl9kcml2ZXIpOwogCWlmIChyZXQpIHsKIAkJU0JQMl9FUlIoIkZhaWxlZCB0byByZWdpc3RlciBwcm90b2NvbCIpOwogCQlocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZzYnAyX2hpZ2hsZXZlbCk7CiAJCXJldHVybiByZXQ7CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzYnAyX21vZHVsZV9leGl0KHZvaWQpCiB7Ci0JU0JQMl9ERUJVR19FTlRFUigpOwotCiAJaHBzYl91bnJlZ2lzdGVyX3Byb3RvY29sKCZzYnAyX2RyaXZlcik7Ci0KIAlocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZzYnAyX2hpZ2hsZXZlbCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5oIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmgKaW5kZXggYWJiZTQ4ZS4uOWFlODQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmgKQEAgLTI1LDI1ICsyNSwyNSBAQAogI2RlZmluZSBTQlAyX0RFVklDRV9OQU1FCQkic2JwMiIKIAogLyoKLSAqIFNCUDIgc3BlY2lmaWMgc3RydWN0dXJlcyBhbmQgZGVmaW5lcworICogU0JQLTIgc3BlY2lmaWMgZGVmaW5pdGlvbnMKICAqLwogCi0jZGVmaW5lIE9SQl9ESVJFQ1RJT05fV1JJVEVfVE9fTUVESUEgICAgMHgwCi0jZGVmaW5lIE9SQl9ESVJFQ1RJT05fUkVBRF9GUk9NX01FRElBICAgMHgxCi0jZGVmaW5lIE9SQl9ESVJFQ1RJT05fTk9fREFUQV9UUkFOU0ZFUiAgMHgyCisjZGVmaW5lIE9SQl9ESVJFQ1RJT05fV1JJVEVfVE9fTUVESUEJMHgwCisjZGVmaW5lIE9SQl9ESVJFQ1RJT05fUkVBRF9GUk9NX01FRElBCTB4MQorI2RlZmluZSBPUkJfRElSRUNUSU9OX05PX0RBVEFfVFJBTlNGRVIJMHgyCiAKLSNkZWZpbmUgT1JCX1NFVF9OVUxMX1BUUih2YWx1ZSkJCQkoKHZhbHVlICYgMHgxKSA8PCAzMSkKLSNkZWZpbmUgT1JCX1NFVF9OT1RJRlkodmFsdWUpCQkJKCh2YWx1ZSAmIDB4MSkgPDwgMzEpCi0jZGVmaW5lIE9SQl9TRVRfUlFfRk1UKHZhbHVlKQkJCSgodmFsdWUgJiAweDMpIDw8IDI5KQkvKiB1bnVzZWQgPyAqLwotI2RlZmluZSBPUkJfU0VUX05PREVfSUQodmFsdWUpCQkJKCh2YWx1ZSAmIDB4ZmZmZikgPDwgMTYpCi0jZGVmaW5lIE9SQl9TRVRfU1RBVFVTX0ZJRk9fSEkodmFsdWUsIGlkKQkodmFsdWUgPj4gMzIgfCBPUkJfU0VUX05PREVfSUQoaWQpKQotI2RlZmluZSBPUkJfU0VUX1NUQVRVU19GSUZPX0xPKHZhbHVlKQkJKHZhbHVlICYgMHhmZmZmZmZmZikKLSNkZWZpbmUgT1JCX1NFVF9EQVRBX1NJWkUodmFsdWUpCQkodmFsdWUgJiAweGZmZmYpCi0jZGVmaW5lIE9SQl9TRVRfUEFHRV9TSVpFKHZhbHVlKQkJKCh2YWx1ZSAmIDB4NykgPDwgMTYpCi0jZGVmaW5lIE9SQl9TRVRfUEFHRV9UQUJMRV9QUkVTRU5UKHZhbHVlKQkoKHZhbHVlICYgMHgxKSA8PCAxOSkKLSNkZWZpbmUgT1JCX1NFVF9NQVhfUEFZTE9BRCh2YWx1ZSkJCSgodmFsdWUgJiAweGYpIDw8IDIwKQotI2RlZmluZSBPUkJfU0VUX1NQRUVEKHZhbHVlKQkJCSgodmFsdWUgJiAweDcpIDw8IDI0KQotI2RlZmluZSBPUkJfU0VUX0RJUkVDVElPTih2YWx1ZSkJCSgodmFsdWUgJiAweDEpIDw8IDI3KQorI2RlZmluZSBPUkJfU0VUX05VTExfUFRSKHYpCQkoKCh2KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lIE9SQl9TRVRfTk9USUZZKHYpCQkoKCh2KSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lIE9SQl9TRVRfUlFfRk1UKHYpCQkoKCh2KSAmIDB4MykgPDwgMjkpCisjZGVmaW5lIE9SQl9TRVRfTk9ERV9JRCh2KQkJKCgodikgJiAweGZmZmYpIDw8IDE2KQorI2RlZmluZSBPUkJfU0VUX1NUQVRVU19GSUZPX0hJKHYsIGlkKQkoKHYpID4+IDMyIHwgT1JCX1NFVF9OT0RFX0lEKGlkKSkKKyNkZWZpbmUgT1JCX1NFVF9TVEFUVVNfRklGT19MTyh2KQkoKHYpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgT1JCX1NFVF9EQVRBX1NJWkUodikJCSgodikgJiAweGZmZmYpCisjZGVmaW5lIE9SQl9TRVRfUEFHRV9TSVpFKHYpCQkoKCh2KSAmIDB4NykgPDwgMTYpCisjZGVmaW5lIE9SQl9TRVRfUEFHRV9UQUJMRV9QUkVTRU5UKHYpCSgoKHYpICYgMHgxKSA8PCAxOSkKKyNkZWZpbmUgT1JCX1NFVF9NQVhfUEFZTE9BRCh2KQkJKCgodikgJiAweGYpIDw8IDIwKQorI2RlZmluZSBPUkJfU0VUX1NQRUVEKHYpCQkoKCh2KSAmIDB4NykgPDwgMjQpCisjZGVmaW5lIE9SQl9TRVRfRElSRUNUSU9OKHYpCQkoKCh2KSAmIDB4MSkgPDwgMjcpCiAKIHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiIHsKIAl1MzIgbmV4dF9PUkJfaGk7CkBAIC02NCwxMiArNjQsMTIgQEAKICNkZWZpbmUgU0JQMl9MT0dJQ0FMX1VOSVRfUkVTRVQJCTB4ZQogI2RlZmluZSBTQlAyX1RBUkdFVF9SRVNFVF9SRVFVRVNUCTB4ZgogCi0jZGVmaW5lIE9SQl9TRVRfTFVOKHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgJiAweGZmZmYpCi0jZGVmaW5lIE9SQl9TRVRfRlVOQ1RJT04odmFsdWUpICAgICAgICAgICAgICAgICAoKHZhbHVlICYgMHhmKSA8PCAxNikKLSNkZWZpbmUgT1JCX1NFVF9SRUNPTk5FQ1QodmFsdWUpICAgICAgICAgICAgICAgICgodmFsdWUgJiAweGYpIDw8IDIwKQotI2RlZmluZSBPUkJfU0VUX0VYQ0xVU0lWRSh2YWx1ZSkgICAgICAgICAgICAgICAgKCh2YWx1ZSAmIDB4MSkgPDwgMjgpCi0jZGVmaW5lIE9SQl9TRVRfTE9HSU5fUkVTUF9MRU5HVEgodmFsdWUpICAgICAgICAodmFsdWUgJiAweGZmZmYpCi0jZGVmaW5lIE9SQl9TRVRfUEFTU1dEX0xFTkdUSCh2YWx1ZSkgICAgICAgICAgICAoKHZhbHVlICYgMHhmZmZmKSA8PCAxNikKKyNkZWZpbmUgT1JCX1NFVF9MVU4odikJCQkoKHYpICYgMHhmZmZmKQorI2RlZmluZSBPUkJfU0VUX0ZVTkNUSU9OKHYpCQkoKCh2KSAmIDB4ZikgPDwgMTYpCisjZGVmaW5lIE9SQl9TRVRfUkVDT05ORUNUKHYpCQkoKCh2KSAmIDB4ZikgPDwgMjApCisjZGVmaW5lIE9SQl9TRVRfRVhDTFVTSVZFKHYpCQkoKCh2KSAmIDB4MSkgPDwgMjgpCisjZGVmaW5lIE9SQl9TRVRfTE9HSU5fUkVTUF9MRU5HVEgodikJKCh2KSAmIDB4ZmZmZikKKyNkZWZpbmUgT1JCX1NFVF9QQVNTV0RfTEVOR1RIKHYpCSgoKHYpICYgMHhmZmZmKSA8PCAxNikKIAogc3RydWN0IHNicDJfbG9naW5fb3JiIHsKIAl1MzIgcGFzc3dvcmRfaGk7CkBAIC04Miw5ICs4Miw5IEBACiAJdTMyIHN0YXR1c19maWZvX2xvOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotI2RlZmluZSBSRVNQT05TRV9HRVRfTE9HSU5fSUQodmFsdWUpICAgICAgICAgICAgKHZhbHVlICYgMHhmZmZmKQotI2RlZmluZSBSRVNQT05TRV9HRVRfTEVOR1RIKHZhbHVlKSAgICAgICAgICAgICAgKCh2YWx1ZSA+PiAxNikgJiAweGZmZmYpCi0jZGVmaW5lIFJFU1BPTlNFX0dFVF9SRUNPTk5FQ1RfSE9MRCh2YWx1ZSkgICAgICAodmFsdWUgJiAweGZmZmYpCisjZGVmaW5lIFJFU1BPTlNFX0dFVF9MT0dJTl9JRCh2KQkoKHYpICYgMHhmZmZmKQorI2RlZmluZSBSRVNQT05TRV9HRVRfTEVOR1RIKHYpCQkoKCh2KSA+PiAxNikgJiAweGZmZmYpCisjZGVmaW5lIFJFU1BPTlNFX0dFVF9SRUNPTk5FQ1RfSE9MRCh2KQkoKHYpICYgMHhmZmZmKQogCiBzdHJ1Y3Qgc2JwMl9sb2dpbl9yZXNwb25zZSB7CiAJdTMyIGxlbmd0aF9sb2dpbl9JRDsKQEAgLTkzLDkgKzkzLDggQEAKIAl1MzIgcmVjb25uZWN0X2hvbGQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCi0jZGVmaW5lIE9SQl9TRVRfTE9HSU5fSUQodmFsdWUpICAgICAgICAgICAgICAgICAodmFsdWUgJiAweGZmZmYpCi0KLSNkZWZpbmUgT1JCX1NFVF9RVUVSWV9MT0dJTlNfUkVTUF9MRU5HVEgodmFsdWUpICh2YWx1ZSAmIDB4ZmZmZikKKyNkZWZpbmUgT1JCX1NFVF9MT0dJTl9JRCh2KSAgICAgICAgICAgICAgICAgKCh2KSAmIDB4ZmZmZikKKyNkZWZpbmUgT1JCX1NFVF9RVUVSWV9MT0dJTlNfUkVTUF9MRU5HVEgodikgKCh2KSAmIDB4ZmZmZikKIAogc3RydWN0IHNicDJfcXVlcnlfbG9naW5zX29yYiB7CiAJdTMyIHJlc2VydmVkMTsKQEAgLTEwOCw4ICsxMDcsOCBAQAogCXUzMiBzdGF0dXNfZmlmb19sbzsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKLSNkZWZpbmUgUkVTUE9OU0VfR0VUX01BWF9MT0dJTlModmFsdWUpICAgICAgICAgICh2YWx1ZSAmIDB4ZmZmZikKLSNkZWZpbmUgUkVTUE9OU0VfR0VUX0FDVElWRV9MT0dJTlModmFsdWUpICAgICAgICgoUkVTUE9OU0VfR0VUX0xFTkdUSCh2YWx1ZSkgLSA0KSAvIDEyKQorI2RlZmluZSBSRVNQT05TRV9HRVRfTUFYX0xPR0lOUyh2KQkoKHYpICYgMHhmZmZmKQorI2RlZmluZSBSRVNQT05TRV9HRVRfQUNUSVZFX0xPR0lOUyh2KQkoKFJFU1BPTlNFX0dFVF9MRU5HVEgoKHYpKSAtIDQpIC8gMTIpCiAKIHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19yZXNwb25zZSB7CiAJdTMyIGxlbmd0aF9tYXhfbG9naW5zOwpAQCAtMTQwLDggKzEzOSw4IEBACiAJdTMyIHN0YXR1c19maWZvX2xvOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotI2RlZmluZSBQQUdFX1RBQkxFX1NFVF9TRUdNRU5UX0JBU0VfSEkodmFsdWUpICAgKHZhbHVlICYgMHhmZmZmKQotI2RlZmluZSBQQUdFX1RBQkxFX1NFVF9TRUdNRU5UX0xFTkdUSCh2YWx1ZSkgICAgKCh2YWx1ZSAmIDB4ZmZmZikgPDwgMTYpCisjZGVmaW5lIFBBR0VfVEFCTEVfU0VUX1NFR01FTlRfQkFTRV9ISSh2KQkoKHYpICYgMHhmZmZmKQorI2RlZmluZSBQQUdFX1RBQkxFX1NFVF9TRUdNRU5UX0xFTkdUSCh2KQkoKCh2KSAmIDB4ZmZmZikgPDwgMTYpCiAKIHN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlIHsKIAl1MzIgbGVuZ3RoX3NlZ21lbnRfYmFzZV9oaTsKQEAgLTE3MSwyMyArMTcwLDE0IEBACiAjZGVmaW5lIFNGTVRfREVGRVJSRURfRVJST1IJCQkweDEKICNkZWZpbmUgU0ZNVF9WRU5ET1JfREVQRU5ERU5UX1NUQVRVUwkJMHgzCiAKLSNkZWZpbmUgU0JQMl9TQ1NJX1NUQVRVU19HT09ECQkJMHgwCi0jZGVmaW5lIFNCUDJfU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OCTB4MgotI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX0NPTkRJVElPTl9NRVQJCTB4NAotI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX0JVU1kJCQkweDgKLSNkZWZpbmUgU0JQMl9TQ1NJX1NUQVRVU19SRVNFUlZBVElPTl9DT05GTElDVAkweDE4Ci0jZGVmaW5lIFNCUDJfU0NTSV9TVEFUVVNfQ09NTUFORF9URVJNSU5BVEVECTB4MjIKLQotI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX1NFTEVDVElPTl9USU1FT1VUCTB4ZmYKLQotI2RlZmluZSBTVEFUVVNfR0VUX1NSQyh2YWx1ZSkJCQkoKCh2YWx1ZSkgPj4gMzApICYgMHgzKQotI2RlZmluZSBTVEFUVVNfR0VUX1JFU1AodmFsdWUpCQkJKCgodmFsdWUpID4+IDI4KSAmIDB4MykKLSNkZWZpbmUgU1RBVFVTX0dFVF9MRU4odmFsdWUpCQkJKCgodmFsdWUpID4+IDI0KSAmIDB4NykKLSNkZWZpbmUgU1RBVFVTX0dFVF9TQlBfU1RBVFVTKHZhbHVlKQkJKCgodmFsdWUpID4+IDE2KSAmIDB4ZmYpCi0jZGVmaW5lIFNUQVRVU19HRVRfT1JCX09GRlNFVF9ISSh2YWx1ZSkJCSgodmFsdWUpICYgMHgwMDAwZmZmZikKLSNkZWZpbmUgU1RBVFVTX1RFU1RfREVBRCh2YWx1ZSkJCQkoKHZhbHVlKSAmIDB4MDgwMDAwMDApCisjZGVmaW5lIFNUQVRVU19HRVRfU1JDKHYpCQkJKCgodikgPj4gMzApICYgMHgzKQorI2RlZmluZSBTVEFUVVNfR0VUX1JFU1AodikJCQkoKCh2KSA+PiAyOCkgJiAweDMpCisjZGVmaW5lIFNUQVRVU19HRVRfTEVOKHYpCQkJKCgodikgPj4gMjQpICYgMHg3KQorI2RlZmluZSBTVEFUVVNfR0VUX1NCUF9TVEFUVVModikJCSgoKHYpID4+IDE2KSAmIDB4ZmYpCisjZGVmaW5lIFNUQVRVU19HRVRfT1JCX09GRlNFVF9ISSh2KQkJKCh2KSAmIDB4MDAwMGZmZmYpCisjZGVmaW5lIFNUQVRVU19URVNUX0RFQUQodikJCQkoKHYpICYgMHgwODAwMDAwMCkKIC8qIHRlc3QgJ3Jlc3AnIHwgJ2RlYWQnIHwgJ3NicDJfc3RhdHVzJyAqLwotI2RlZmluZSBTVEFUVVNfVEVTVF9SRFModmFsdWUpCQkJKCh2YWx1ZSkgJiAweDM4ZmYwMDAwKQorI2RlZmluZSBTVEFUVVNfVEVTVF9SRFModikJCQkoKHYpICYgMHgzOGZmMDAwMCkKIAogc3RydWN0IHNicDJfc3RhdHVzX2Jsb2NrIHsKIAl1MzIgT1JCX29mZnNldF9oaV9taXNjOwpAQCAtMTk1LDY2ICsxODUsNzAgQEAKIAl1OCBjb21tYW5kX3NldF9kZXBlbmRlbnRbMjRdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotLyoKLSAqIE1pc2NlbGxhbmVvdXMgU0JQMiByZWxhdGVkIGNvbmZpZyByb20gZGVmaW5lcwotICovCi0KLSNkZWZpbmUgU0JQMl9VTklUX0RJUkVDVE9SWV9PRkZTRVRfS0VZCQkJCTB4ZDEKLSNkZWZpbmUgU0JQMl9DU1JfT0ZGU0VUX0tFWQkJCQkJMHg1NAotI2RlZmluZSBTQlAyX1VOSVRfU1BFQ19JRF9LRVkJCQkJCTB4MTIKLSNkZWZpbmUgU0JQMl9VTklUX1NXX1ZFUlNJT05fS0VZCQkJCTB4MTMKLSNkZWZpbmUgU0JQMl9DT01NQU5EX1NFVF9TUEVDX0lEX0tFWQkJCQkweDM4Ci0jZGVmaW5lIFNCUDJfQ09NTUFORF9TRVRfS0VZCQkJCQkweDM5Ci0jZGVmaW5lIFNCUDJfVU5JVF9DSEFSQUNURVJJU1RJQ1NfS0VZCQkJCTB4M2EKLSNkZWZpbmUgU0JQMl9ERVZJQ0VfVFlQRV9BTkRfTFVOX0tFWQkJCQkweDE0Ci0jZGVmaW5lIFNCUDJfRklSTVdBUkVfUkVWSVNJT05fS0VZCQkJCTB4M2MKLQotI2RlZmluZSBTQlAyX0FHRU5UX1NUQVRFX09GRlNFVAkJCQkJMHgwMFVMTAotI2RlZmluZSBTQlAyX0FHRU5UX1JFU0VUX09GRlNFVAkJCQkJMHgwNFVMTAotI2RlZmluZSBTQlAyX09SQl9QT0lOVEVSX09GRlNFVAkJCQkJMHgwOFVMTAotI2RlZmluZSBTQlAyX0RPT1JCRUxMX09GRlNFVAkJCQkJMHgxMFVMTAotI2RlZmluZSBTQlAyX1VOU09MSUNJVEVEX1NUQVRVU19FTkFCTEVfT0ZGU0VUCQkJMHgxNFVMTAotI2RlZmluZSBTQlAyX1VOU09MSUNJVEVEX1NUQVRVU19WQUxVRQkJCQkweGYKLQotI2RlZmluZSBTQlAyX0JVU1lfVElNRU9VVF9BRERSRVNTCQkJCTB4ZmZmZmYwMDAwMjEwVUxMCi0jZGVmaW5lIFNCUDJfQlVTWV9USU1FT1VUX1ZBTFVFCQkJCQkweGYKLQotI2RlZmluZSBTQlAyX0FHRU5UX1JFU0VUX0RBVEEJCQkJCTB4ZgogCiAvKgotICogVW5pdCBzcGVjIGlkIGFuZCBzdyB2ZXJzaW9uIGVudHJ5IGZvciBTQlAtMiBkZXZpY2VzCisgKiBTQlAyIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBST00gZGVmaW5pdGlvbnMKICAqLwogCi0jZGVmaW5lIFNCUDJfVU5JVF9TUEVDX0lEX0VOVFJZCQkJCQkweDAwMDA2MDllCi0jZGVmaW5lIFNCUDJfU1dfVkVSU0lPTl9FTlRSWQkJCQkJMHgwMDAxMDQ4MworI2RlZmluZSBTQlAyX1VOSVRfRElSRUNUT1JZX09GRlNFVF9LRVkJCTB4ZDEKKyNkZWZpbmUgU0JQMl9DU1JfT0ZGU0VUX0tFWQkJCTB4NTQKKyNkZWZpbmUgU0JQMl9VTklUX1NQRUNfSURfS0VZCQkJMHgxMgorI2RlZmluZSBTQlAyX1VOSVRfU1dfVkVSU0lPTl9LRVkJCTB4MTMKKyNkZWZpbmUgU0JQMl9DT01NQU5EX1NFVF9TUEVDX0lEX0tFWQkJMHgzOAorI2RlZmluZSBTQlAyX0NPTU1BTkRfU0VUX0tFWQkJCTB4MzkKKyNkZWZpbmUgU0JQMl9VTklUX0NIQVJBQ1RFUklTVElDU19LRVkJCTB4M2EKKyNkZWZpbmUgU0JQMl9ERVZJQ0VfVFlQRV9BTkRfTFVOX0tFWQkJMHgxNAorI2RlZmluZSBTQlAyX0ZJUk1XQVJFX1JFVklTSU9OX0tFWQkJMHgzYworCisjZGVmaW5lIFNCUDJfQUdFTlRfU1RBVEVfT0ZGU0VUCQkJMHgwMFVMTAorI2RlZmluZSBTQlAyX0FHRU5UX1JFU0VUX09GRlNFVAkJCTB4MDRVTEwKKyNkZWZpbmUgU0JQMl9PUkJfUE9JTlRFUl9PRkZTRVQJCQkweDA4VUxMCisjZGVmaW5lIFNCUDJfRE9PUkJFTExfT0ZGU0VUCQkJMHgxMFVMTAorI2RlZmluZSBTQlAyX1VOU09MSUNJVEVEX1NUQVRVU19FTkFCTEVfT0ZGU0VUCTB4MTRVTEwKKyNkZWZpbmUgU0JQMl9VTlNPTElDSVRFRF9TVEFUVVNfVkFMVUUJCTB4ZgorCisjZGVmaW5lIFNCUDJfQlVTWV9USU1FT1VUX0FERFJFU1MJCTB4ZmZmZmYwMDAwMjEwVUxMCisvKiBiaWdnZXN0IHBvc3NpYmxlIHZhbHVlIGZvciBTaW5nbGUgUGhhc2UgUmV0cnkgY291bnQgaXMgMHhmICovCisjZGVmaW5lIFNCUDJfQlVTWV9USU1FT1VUX1ZBTFVFCQkJMHhmCisKKyNkZWZpbmUgU0JQMl9BR0VOVF9SRVNFVF9EQVRBCQkJMHhmCisKKyNkZWZpbmUgU0JQMl9VTklUX1NQRUNfSURfRU5UUlkJCQkweDAwMDA2MDllCisjZGVmaW5lIFNCUDJfU1dfVkVSU0lPTl9FTlRSWQkJCTB4MDAwMTA0ODMKKwogCiAvKgotICogU0NTSSBzcGVjaWZpYyBzdHVmZgorICogU0NTSSBzcGVjaWZpYyBkZWZpbml0aW9ucwogICovCiAKLSNkZWZpbmUgU0JQMl9NQVhfU0dfRUxFTUVOVF9MRU5HVEgJMHhmMDAwCi0jZGVmaW5lIFNCUDJfTUFYX1NFQ1RPUlMJCTI1NQkvKiBNYXggc2VjdG9ycyBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgU0JQMl9NQVhfQ01EUwkJCTgJLyogVGhpcyBzaG91bGQgYmUgc2FmZSAqLworI2RlZmluZSBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSAkJMHhmMDAwCisjZGVmaW5lIFNCUDJfTUFYX1NFQ1RPUlMJCQkyNTUKKy8qIFRoZXJlIGlzIG5vIHJlYWwgbGltaXRhdGlvbiBvZiB0aGUgcXVldWUgZGVwdGggKGkuZS4gbGVuZ3RoIG9mIHRoZSBsaW5rZWQKKyAqIGxpc3Qgb2YgY29tbWFuZCBPUkJzKSBhdCB0aGUgdGFyZ2V0LiBUaGUgY2hvc2VuIGRlcHRoIGlzIG1lcmVseSBhbgorICogaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBzYnAyIGRyaXZlci4gKi8KKyNkZWZpbmUgU0JQMl9NQVhfQ01EUwkJCQk4CiAKLS8qIEZsYWdzIGZvciBkZXRlY3RlZCBvZGRpdGllcyBhbmQgYnJva2VuZXNzICovCi0jZGVmaW5lIFNCUDJfV09SS0FST1VORF8xMjhLX01BWF9UUkFOUwkweDEKLSNkZWZpbmUgU0JQMl9XT1JLQVJPVU5EX0lOUVVJUllfMzYJMHgyCi0jZGVmaW5lIFNCUDJfV09SS0FST1VORF9NT0RFX1NFTlNFXzgJMHg0Ci0jZGVmaW5lIFNCUDJfV09SS0FST1VORF9GSVhfQ0FQQUNJVFkJMHg4Ci0jZGVmaW5lIFNCUDJfV09SS0FST1VORF9PVkVSUklERQkweDEwMAorI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX0dPT0QJCQkweDAKKyNkZWZpbmUgU0JQMl9TQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT04JMHgyCisjZGVmaW5lIFNCUDJfU0NTSV9TVEFUVVNfQ09ORElUSU9OX01FVAkJMHg0CisjZGVmaW5lIFNCUDJfU0NTSV9TVEFUVVNfQlVTWQkJCTB4OAorI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX1JFU0VSVkFUSU9OX0NPTkZMSUNUCTB4MTgKKyNkZWZpbmUgU0JQMl9TQ1NJX1NUQVRVU19DT01NQU5EX1RFUk1JTkFURUQJMHgyMgorI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX1NFTEVDVElPTl9USU1FT1VUCTB4ZmYKIAotLyogVGhpcyBpcyB0aGUgdHdvIGRtYSB0eXBlcyB3ZSB1c2UgZm9yIGNtZF9kbWEgYmVsb3cgKi8KLWVudW0gY21kX2RtYV90eXBlcyB7CisKKy8qCisgKiBSZXByZXNlbnRhdGlvbnMgb2YgY29tbWFuZHMgYW5kIGRldmljZXMKKyAqLworCitlbnVtIHNicDJfZG1hX3R5cGVzIHsKIAlDTURfRE1BX05PTkUsCiAJQ01EX0RNQV9QQUdFLAogCUNNRF9ETUFfU0lOR0xFCiB9OwogCi0vKgotICogRW5jYXBzdWxhdGVzIGFsbCB0aGUgaW5mbyBuZWNlc3NhcnkgZm9yIGFuIG91dHN0YW5kaW5nIGNvbW1hbmQuCi0gKi8KKy8qIFBlciBTQ1NJIGNvbW1hbmQgKi8KIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyB7Ci0KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IHNicDJfY29tbWFuZF9vcmIgY29tbWFuZF9vcmIgX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCWRtYV9hZGRyX3QgY29tbWFuZF9vcmJfZG1hIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKQEAgLTI2MiwyNSArMjU2LDI1IEBACiAJdm9pZCAoKkN1cnJlbnRfZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKTsKIAogCS8qIEFsc28gbmVlZCBzL2cgc3RydWN0dXJlIGZvciBlYWNoIHNicDIgY29tbWFuZCAqLwotCXN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlIHNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnRbU0dfQUxMXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IHNicDJfdW5yZXN0cmljdGVkX3BhZ2VfdGFibGUKKwkJCXNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnRbU0dfQUxMXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAJZG1hX2FkZHJfdCBzZ2VfZG1hIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAl2b2lkICpzZ2VfYnVmZmVyOwogCWRtYV9hZGRyX3QgY21kX2RtYTsKLQllbnVtIGNtZF9kbWFfdHlwZXMgZG1hX3R5cGU7CisJZW51bSBzYnAyX2RtYV90eXBlcyBkbWFfdHlwZTsKIAl1bnNpZ25lZCBsb25nIGRtYV9zaXplOwotCWludCBkbWFfZGlyOwotCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpcjsKIH07CiAKLXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm87CisvKiBQZXIgRmlyZVdpcmUgaG9zdCAqLworc3RydWN0IHNicDJfZndob3N0X2luZm8geworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBsb2dpY2FsX3VuaXRzOworfTsKIAotLyoKLSAqIEluZm9ybWF0aW9uIG5lZWRlZCBvbiBhIHBlciBzY3NpIGlkIGJhc2lzIChvbmUgZm9yIGVhY2ggc2JwMiBkZXZpY2UpCi0gKi8KLXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgewotCS8qCi0JICogVmFyaW91cyBzYnAyIHNwZWNpZmljIHN0cnVjdHVyZXMKLQkgKi8KKy8qIFBlciBsb2dpY2FsIHVuaXQgKi8KK3N0cnVjdCBzYnAyX2x1IHsKKwkvKiBPcGVyYXRpb24gcmVxdWVzdCBibG9ja3MgKi8KIAlzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiAqbGFzdF9vcmI7CiAJZG1hX2FkZHJfdCBsYXN0X29yYl9kbWE7CiAJc3RydWN0IHNicDJfbG9naW5fb3JiICpsb2dpbl9vcmI7CkBAIC0yOTcsMTE2ICsyOTEsNTkgQEAKIAlkbWFfYWRkcl90IGxvZ291dF9vcmJfZG1hOwogCXN0cnVjdCBzYnAyX3N0YXR1c19ibG9jayBzdGF0dXNfYmxvY2s7CiAKLQkvKgotCSAqIFN0dWZmIHdlIG5lZWQgdG8ga25vdyBhYm91dCB0aGUgc2JwMiBkZXZpY2UgaXRzZWxmCi0JICovCi0JdTY0IHNicDJfbWFuYWdlbWVudF9hZ2VudF9hZGRyOwotCXU2NCBzYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkcjsKKwkvKiBIb3cgdG8gdGFsayB0byB0aGUgdW5pdCAqLworCXU2NCBtYW5hZ2VtZW50X2FnZW50X2FkZHI7CisJdTY0IGNvbW1hbmRfYmxvY2tfYWdlbnRfYWRkcjsKIAl1MzIgc3BlZWRfY29kZTsKIAl1MzIgbWF4X3BheWxvYWRfc2l6ZTsKKwl1MTYgbHVuOwogCi0JLyoKLQkgKiBWYWx1ZXMgcHVsbGVkIGZyb20gdGhlIGRldmljZSdzIHVuaXQgZGlyZWN0b3J5Ci0JICovCi0JdTMyIHNicDJfY29tbWFuZF9zZXRfc3BlY19pZDsKLQl1MzIgc2JwMl9jb21tYW5kX3NldDsKLQl1MzIgc2JwMl91bml0X2NoYXJhY3RlcmlzdGljczsKLQl1MzIgc2JwMl9sdW47Ci0JdTMyIHNicDJfZmlybXdhcmVfcmV2aXNpb247Ci0KLQkvKgotCSAqIEFkZHJlc3MgZm9yIHRoZSBkZXZpY2UgdG8gd3JpdGUgc3RhdHVzIGJsb2NrcyB0bwotCSAqLworCS8qIEFkZHJlc3MgZm9yIHRoZSB1bml0IHRvIHdyaXRlIHN0YXR1cyBibG9ja3MgdG8gKi8KIAl1NjQgc3RhdHVzX2ZpZm9fYWRkcjsKIAotCS8qCi0JICogV2FpdHF1ZXVlIGZsYWcgZm9yIGxvZ2lucywgcmVjb25uZWN0cywgbG9nb3V0cywgcXVlcnkgbG9naW5zCi0JICovCi0JaW50IGFjY2Vzc19jb21wbGV0ZToxOworCS8qIFdhaXRxdWV1ZSBmbGFnIGZvciBsb2dpbnMsIHJlY29ubmVjdHMsIGxvZ291dHMsIHF1ZXJ5IGxvZ2lucyAqLworCXVuc2lnbmVkIGludCBhY2Nlc3NfY29tcGxldGU6MTsKIAotCS8qCi0JICogUG9vbCBvZiBjb21tYW5kIG9yYnMsIHNvIHdlIGNhbiBoYXZlIG1vcmUgdGhhbiBvdmVybGFwcGVkIGNvbW1hbmQgcGVyIGlkCi0JICovCi0Jc3BpbmxvY2tfdCBzYnAyX2NvbW1hbmRfb3JiX2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzYnAyX2NvbW1hbmRfb3JiX2ludXNlOwotCXN0cnVjdCBsaXN0X2hlYWQgc2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQ7CisJLyogUG9vbCBvZiBjb21tYW5kIE9SQnMgZm9yIHRoaXMgbG9naWNhbCB1bml0ICovCisJc3BpbmxvY2tfdCBjbWRfb3JiX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBjbWRfb3JiX2ludXNlOworCXN0cnVjdCBsaXN0X2hlYWQgY21kX29yYl9jb21wbGV0ZWQ7CiAKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNjc2lfbGlzdDsKKwkvKiBCYWNrbGluayB0byBGaXJlV2lyZSBob3N0OyBsaXN0IG9mIHVuaXRzIGF0dGFjaGVkIHRvIHRoZSBob3N0ICovCisJc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpOworCXN0cnVjdCBsaXN0X2hlYWQgbHVfbGlzdDsKIAotCS8qIE5vZGUgZW50cnksIGFzIHJldHJpZXZlZCBmcm9tIE5vZGVNZ3IgZW50cmllcyAqLworCS8qIElFRUUgMTM5NCBjb3JlJ3MgZGV2aWNlIHJlcHJlc2VudGF0aW9ucyAqLwogCXN0cnVjdCBub2RlX2VudHJ5ICpuZTsKIAlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOwogCi0JLyogQSBiYWNrbGluayB0byBvdXIgaG9zdF9pbmZvICovCi0Jc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGk7Ci0KLQkvKiBTQ1NJIHJlbGF0ZWQgcG9pbnRlcnMgKi8KKwkvKiBTQ1NJIGNvcmUncyBkZXZpY2UgcmVwcmVzZW50YXRpb25zICovCiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwotCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKIAogCS8qIERldmljZSBzcGVjaWZpYyB3b3JrYXJvdW5kcy9icm9rZW5lc3MgKi8KIAl1bnNpZ25lZCB3b3JrYXJvdW5kczsKIAorCS8qIENvbm5lY3Rpb24gc3RhdGUgKi8KIAlhdG9taWNfdCBzdGF0ZTsKKworCS8qIEZvciBkZWZlcnJlZCByZXF1ZXN0cyB0byB0aGUgZmV0Y2ggYWdlbnQgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHJvdG9jb2xfd29yazsKIH07CiAKLS8qIEZvciB1c2UgaW4gc2NzaV9pZF9pbnN0YW5jZV9kYXRhLnN0YXRlICovCisvKiBGb3IgdXNlIGluIHNicDJfbHUuc3RhdGUgKi8KIGVudW0gc2JwMmx1X3N0YXRlX3R5cGVzIHsKIAlTQlAyTFVfU1RBVEVfUlVOTklORywJCS8qIGFsbCBub3JtYWwgKi8KIAlTQlAyTFVfU1RBVEVfSU5fUkVTRVQsCQkvKiBiZXR3ZWVuIGJ1cyByZXNldCBhbmQgcmVjb25uZWN0ICovCiAJU0JQMkxVX1NUQVRFX0lOX1NIVVRET1dOCS8qIHdoZW4gc2JwMl9yZW1vdmUgd2FzIGNhbGxlZCAqLwogfTsKIAotLyogU2JwMiBob3N0IGRhdGEgc3RydWN0dXJlIChvbmUgcGVyIElFRUUxMzk0IGhvc3QpICovCi1zdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvIHsKLQlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OwkJLyogSUVFRTEzOTQgaG9zdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2NzaV9pZHM7CS8qIExpc3Qgb2Ygc2NzaSBpZHMgb24gdGhpcyBob3N0ICovCi19OwotCi0vKgotICogRnVuY3Rpb24gcHJvdG90eXBlcwotICovCi0KLS8qCi0gKiBWYXJpb3VzIHV0aWxpdHkgcHJvdG90eXBlcwotICovCi1zdGF0aWMgaW50IHNicDJ1dGlsX2NyZWF0ZV9jb21tYW5kX29yYl9wb29sKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpOwotc3RhdGljIHZvaWQgc2JwMnV0aWxfcmVtb3ZlX2NvbW1hbmRfb3JiX3Bvb2woc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCk7Ci1zdGF0aWMgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpzYnAydXRpbF9maW5kX2NvbW1hbmRfZm9yX29yYihzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLCBkbWFfYWRkcl90IG9yYik7Ci1zdGF0aWMgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpzYnAydXRpbF9maW5kX2NvbW1hbmRfZm9yX1NDcG50KHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsIHZvaWQgKlNDcG50KTsKLXN0YXRpYyBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKnNicDJ1dGlsX2FsbG9jYXRlX2NvbW1hbmRfb3JiKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCi0JCQkJCQkJICBzdHJ1Y3Qgc2NzaV9jbW5kICpDdXJyZW50X1NDcG50LAotCQkJCQkJCSAgdm9pZCAoKkN1cnJlbnRfZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7Ci1zdGF0aWMgdm9pZCBzYnAydXRpbF9tYXJrX2NvbW1hbmRfY29tcGxldGVkKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCi0JCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZCk7Ci0KLQotc3RhdGljIGludCBzYnAyX3N0YXJ0X2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKTsKLXN0YXRpYyB2b2lkIHNicDJfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKTsKLQotI2lmZGVmIENPTkZJR19JRUVFMTM5NF9TQlAyX1BIWVNfRE1BCi1zdGF0aWMgaW50IHNicDJfaGFuZGxlX3BoeXNkbWFfd3JpdGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgaW50IGRlc3RpZCwgcXVhZGxldF90ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmxhZ3MpOwotc3RhdGljIGludCBzYnAyX2hhbmRsZV9waHlzZG1hX3JlYWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncyk7Ci0jZW5kaWYKLQotLyoKLSAqIFNCUC0yIHByb3RvY29sIHJlbGF0ZWQgcHJvdG90eXBlcwotICovCi1zdGF0aWMgaW50IHNicDJfcXVlcnlfbG9naW5zKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpOwotc3RhdGljIGludCBzYnAyX2xvZ2luX2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKTsKLXN0YXRpYyBpbnQgc2JwMl9yZWNvbm5lY3RfZGV2aWNlKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpOwotc3RhdGljIGludCBzYnAyX2xvZ291dF9kZXZpY2Uoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCk7Ci1zdGF0aWMgaW50IHNicDJfaGFuZGxlX3N0YXR1c193cml0ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBpbnQgZGVzdGlkLAotCQkJCSAgICBxdWFkbGV0X3QgKmRhdGEsIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmxhZ3MpOwotc3RhdGljIGludCBzYnAyX2FnZW50X3Jlc2V0KHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsIGludCB3YWl0KTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2JwMl9zdGF0dXNfdG9fc2Vuc2VfZGF0YSh1bmNoYXIgKnNicDJfc3RhdHVzLAotCQkJCQkgICAgICB1bmNoYXIgKnNlbnNlX2RhdGEpOwotc3RhdGljIHZvaWQgc2JwMl9wYXJzZV91bml0X2RpcmVjdG9yeShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAotCQkJCSAgICAgIHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQpOwotc3RhdGljIGludCBzYnAyX3NldF9idXN5X3RpbWVvdXQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCk7Ci1zdGF0aWMgaW50IHNicDJfbWF4X3NwZWVkX2FuZF9zaXplKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpOworLyogRm9yIHVzZSBpbiBzYnAyX2x1Lndvcmthcm91bmRzIGFuZCBpbiB0aGUgY29ycmVzcG9uZGluZworICogbW9kdWxlIGxvYWQgcGFyYW1ldGVyICovCisjZGVmaW5lIFNCUDJfV09SS0FST1VORF8xMjhLX01BWF9UUkFOUwkweDEKKyNkZWZpbmUgU0JQMl9XT1JLQVJPVU5EX0lOUVVJUllfMzYJMHgyCisjZGVmaW5lIFNCUDJfV09SS0FST1VORF9NT0RFX1NFTlNFXzgJMHg0CisjZGVmaW5lIFNCUDJfV09SS0FST1VORF9GSVhfQ0FQQUNJVFkJMHg4CisjZGVmaW5lIFNCUDJfV09SS0FST1VORF9PVkVSUklERQkweDEwMAogCiAjZW5kaWYgLyogU0JQMl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuYwppbmRleCA5YmM2NTA1Li41OThiMTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMKQEAgLTcxNCw4ICs3MTQsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX192aWRlbzEzOTRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgdmlkZW8xMzk0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBmaWxlX2N0eCAqY3R4ID0gKHN0cnVjdCBmaWxlX2N0eCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IGN0eC0+b2hjaTsKQEAgLTg4NCwxMyArODg0LDE0IEBACiAJCXN0cnVjdCBkbWFfaXNvX2N0eCAqZDsKIAkJaW50IG5leHRfcHJnOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJncCwgc2l6ZW9mKHYpKSkKKwkJaWYgKHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKCZ2LCBhcmdwLCBzaXplb2YodikpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWQgPSBmaW5kX2N0eCgmY3R4LT5jb250ZXh0X2xpc3QsIE9IQ0lfSVNPX1JFQ0VJVkUsIHYuY2hhbm5lbCk7Ci0JCWlmIChkID09IE5VTEwpIHJldHVybiAtRUZBVUxUOworCQlpZiAodW5saWtlbHkoZCA9PSBOVUxMKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCi0JCWlmICgodi5idWZmZXI8MCkgfHwgKHYuYnVmZmVyPj1kLT5udW1fZGVzYyAtIDEpKSB7CisJCWlmICh1bmxpa2VseSgodi5idWZmZXI8MCkgfHwgKHYuYnVmZmVyPj1kLT5udW1fZGVzYyAtIDEpKSkgewogCQkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLAogCQkJICAgICAgIkJ1ZmZlciAlZCBvdXQgb2YgcmFuZ2UiLHYuYnVmZmVyKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtODk4LDcgKzg5OSw3IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssZmxhZ3MpOwogCi0JCWlmIChkLT5idWZmZXJfc3RhdHVzW3YuYnVmZmVyXT09VklERU8xMzk0X0JVRkZFUl9RVUVVRUQpIHsKKwkJaWYgKHVubGlrZWx5KGQtPmJ1ZmZlcl9zdGF0dXNbdi5idWZmZXJdPT1WSURFTzEzOTRfQlVGRkVSX1FVRVVFRCkpIHsKIAkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKIAkJCSAgICAgICJCdWZmZXIgJWQgaXMgYWxyZWFkeSB1c2VkIix2LmJ1ZmZlcik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLGZsYWdzKTsKQEAgLTk0OSwxMyArOTUwLDE0IEBACiAJCXN0cnVjdCBkbWFfaXNvX2N0eCAqZDsKIAkJaW50IGkgPSAwOwogCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJncCwgc2l6ZW9mKHYpKSkKKwkJaWYgKHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKCZ2LCBhcmdwLCBzaXplb2YodikpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWQgPSBmaW5kX2N0eCgmY3R4LT5jb250ZXh0X2xpc3QsIE9IQ0lfSVNPX1JFQ0VJVkUsIHYuY2hhbm5lbCk7Ci0JCWlmIChkID09IE5VTEwpIHJldHVybiAtRUZBVUxUOworCQlpZiAodW5saWtlbHkoZCA9PSBOVUxMKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCi0JCWlmICgodi5idWZmZXI8MCkgfHwgKHYuYnVmZmVyPmQtPm51bV9kZXNjIC0gMSkpIHsKKwkJaWYgKHVubGlrZWx5KCh2LmJ1ZmZlcjwwKSB8fCAodi5idWZmZXI+ZC0+bnVtX2Rlc2MgLSAxKSkpIHsKIAkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKIAkJCSAgICAgICJCdWZmZXIgJWQgb3V0IG9mIHJhbmdlIix2LmJ1ZmZlcik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwMDgsNyArMTAxMCw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAogCQl2LmJ1ZmZlcj1pOwotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2LCBzaXplb2YodikpKQorCQlpZiAodW5saWtlbHkoY29weV90b191c2VyKGFyZ3AsICZ2LCBzaXplb2YodikpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCXJldHVybiAwOwpAQCAtMTE1NiwxNSArMTE1OCw2IEBACiAJfQogfQogCi1zdGF0aWMgbG9uZyB2aWRlbzEzOTRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCBlcnI7Ci0JbG9ja19rZXJuZWwoKTsKLQllcnIgPSBfX3ZpZGVvMTM5NF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCXJldHVybiBlcnI7Ci19Ci0KIC8qCiAgKglUaGlzIG1hcHMgdGhlIHZtYWxsb2NlZCBhbmQgcmVzZXJ2ZWQgYnVmZmVyIHRvIHVzZXIgc3BhY2UuCiAgKgpAQCAtMTE3NywxNyArMTE3MCwxNCBAQAogc3RhdGljIGludCB2aWRlbzEzOTRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGZpbGVfY3R4ICpjdHggPSAoc3RydWN0IGZpbGVfY3R4ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXMgPSAtRUlOVkFMOwogCi0JbG9ja19rZXJuZWwoKTsKIAlpZiAoY3R4LT5jdXJyZW50X2N0eCA9PSBOVUxMKSB7CiAJCVBSSU5UKEtFUk5fRVJSLCBjdHgtPm9oY2ktPmhvc3QtPmlkLAogCQkJCSJDdXJyZW50IGlzbyBjb250ZXh0IG5vdCBzZXQiKTsKLQl9IGVsc2UKLQkJcmVzID0gZG1hX3JlZ2lvbl9tbWFwKCZjdHgtPmN1cnJlbnRfY3R4LT5kbWEsIGZpbGUsIHZtYSk7Ci0JdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQlyZXR1cm4gcmVzOworCXJldHVybiBkbWFfcmVnaW9uX21tYXAoJmN0eC0+Y3VycmVudF9jdHgtPmRtYSwgZmlsZSwgdm1hKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCB2aWRlbzEzOTRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqcHQpCkBAIC0xMTk4LDE0ICsxMTg4LDEyIEBACiAJc3RydWN0IGRtYV9pc29fY3R4ICpkOwogCWludCBpOwogCi0JbG9ja19rZXJuZWwoKTsKIAljdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJZCA9IGN0eC0+Y3VycmVudF9jdHg7CiAJaWYgKGQgPT0gTlVMTCkgewogCQlQUklOVChLRVJOX0VSUiwgY3R4LT5vaGNpLT5ob3N0LT5pZCwKIAkJCQkiQ3VycmVudCBpc28gY29udGV4dCBub3Qgc2V0Iik7Ci0JCW1hc2sgPSBQT0xMRVJSOwotCQlnb3RvIGRvbmU7CisJCXJldHVybiBQT0xMRVJSOwogCX0KIAogCXBvbGxfd2FpdChmaWxlLCAmZC0+d2FpdHEsIHB0KTsKQEAgLTEyMTgsOCArMTIwNiw2IEBACiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwotZG9uZToKLQl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gbWFzazsKIH0KQEAgLTEyNTUsNyArMTI0MSw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpuZXh0OwogCXU2NCBtYXNrOwogCi0JbG9ja19rZXJuZWwoKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIG5leHQsICZjdHgtPmNvbnRleHRfbGlzdCkgewogCQlzdHJ1Y3QgZG1hX2lzb19jdHggKmQ7CiAJCWQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgZG1hX2lzb19jdHgsIGxpbmspOwpAQCAtMTI3Niw3ICsxMjYxLDYgQEAKIAlrZnJlZShjdHgpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CiAKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMjQsMTIgKzEzMDgsOCBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShpZWVlMTM5NCwgdmlkZW8xMzk0X2lkX3RhYmxlKTsKIAogc3RhdGljIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciB2aWRlbzEzOTRfZHJpdmVyID0gewotCS5uYW1lCQk9ICIxMzk0IERpZ2l0YWwgQ2FtZXJhIERyaXZlciIsCisJLm5hbWUJCT0gVklERU8xMzk0X0RSSVZFUl9OQU1FLAogCS5pZF90YWJsZQk9IHZpZGVvMTM5NF9pZF90YWJsZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSBWSURFTzEzOTRfRFJJVkVSX05BTUUsCi0JCS5idXMJPSAmaWVlZTEzOTRfYnVzX3R5cGUsCi0JfSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9NYWtlZmlsZQppbmRleCAxNjNkOTkxLi41MGZiMWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9NYWtlZmlsZQpAQCAtMSw5ICsxLDExIEBACiBpbmZpbmliYW5kLSQoQ09ORklHX0lORklOSUJBTkRfQUREUl9UUkFOUykJOj0gaWJfYWRkci5vIHJkbWFfY20ubwordXNlcl9hY2Nlc3MtJChDT05GSUdfSU5GSU5JQkFORF9BRERSX1RSQU5TKQk6PSByZG1hX3VjbS5vCiAKIG9iai0kKENPTkZJR19JTkZJTklCQU5EKSArPQkJaWJfY29yZS5vIGliX21hZC5vIGliX3NhLm8gXAogCQkJCQlpYl9jbS5vIGl3X2NtLm8gJChpbmZpbmliYW5kLXkpCiBvYmotJChDT05GSUdfSU5GSU5JQkFORF9VU0VSX01BRCkgKz0JaWJfdW1hZC5vCi1vYmotJChDT05GSUdfSU5GSU5JQkFORF9VU0VSX0FDQ0VTUykgKz0JaWJfdXZlcmJzLm8gaWJfdWNtLm8KK29iai0kKENPTkZJR19JTkZJTklCQU5EX1VTRVJfQUNDRVNTKSArPQlpYl91dmVyYnMubyBpYl91Y20ubyBcCisJCQkJCSQodXNlcl9hY2Nlc3MteSkKIAogaWJfY29yZS15IDo9CQkJcGFja2VyLm8gdWRfaGVhZGVyLm8gdmVyYnMubyBzeXNmcy5vIFwKIAkJCQlkZXZpY2UubyBmbXJfcG9vbC5vIGNhY2hlLm8KQEAgLTE4LDYgKzIwLDggQEAKIAogcmRtYV9jbS15IDo9CQkJY21hLm8KIAorcmRtYV91Y20teSA6PQkJCXVjbWEubworCiBpYl9hZGRyLXkgOj0JCQlhZGRyLm8KIAogaWJfdW1hZC15IDo9CQkJdXNlcl9tYWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCmluZGV4IDYwZDNmYmQuLmFmOTM5NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIAlzdHJ1Y3Qgc29ja2FkZHIgc3JjX2FkZHI7CiAJc3RydWN0IHNvY2thZGRyIGRzdF9hZGRyOwogCXN0cnVjdCByZG1hX2Rldl9hZGRyICphZGRyOworCXN0cnVjdCByZG1hX2FkZHJfY2xpZW50ICpjbGllbnQ7CiAJdm9pZCAqY29udGV4dDsKIAl2b2lkICgqY2FsbGJhY2spKGludCBzdGF0dXMsIHN0cnVjdCBzb2NrYWRkciAqc3JjX2FkZHIsCiAJCQkgc3RydWN0IHJkbWFfZGV2X2FkZHIgKmFkZHIsIHZvaWQgKmNvbnRleHQpOwpAQCAtNTQsMTMgKzU1LDMzIEBACiAJaW50IHN0YXR1czsKIH07CiAKLXN0YXRpYyB2b2lkIHByb2Nlc3NfcmVxKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgcHJvY2Vzc19yZXEoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RhdGljIERFRklORV9NVVRFWChsb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQocmVxX2xpc3QpOwotc3RhdGljIERFQ0xBUkVfV09SSyh3b3JrLCBwcm9jZXNzX3JlcSwgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksod29yaywgcHJvY2Vzc19yZXEpOwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZGRyX3dxOwogCit2b2lkIHJkbWFfYWRkcl9yZWdpc3Rlcl9jbGllbnQoc3RydWN0IHJkbWFfYWRkcl9jbGllbnQgKmNsaWVudCkKK3sKKwlhdG9taWNfc2V0KCZjbGllbnQtPnJlZmNvdW50LCAxKTsKKwlpbml0X2NvbXBsZXRpb24oJmNsaWVudC0+Y29tcCk7Cit9CitFWFBPUlRfU1lNQk9MKHJkbWFfYWRkcl9yZWdpc3Rlcl9jbGllbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2NsaWVudChzdHJ1Y3QgcmRtYV9hZGRyX2NsaWVudCAqY2xpZW50KQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjbGllbnQtPnJlZmNvdW50KSkKKwkJY29tcGxldGUoJmNsaWVudC0+Y29tcCk7Cit9CisKK3ZvaWQgcmRtYV9hZGRyX3VucmVnaXN0ZXJfY2xpZW50KHN0cnVjdCByZG1hX2FkZHJfY2xpZW50ICpjbGllbnQpCit7CisJcHV0X2NsaWVudChjbGllbnQpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNsaWVudC0+Y29tcCk7Cit9CitFWFBPUlRfU1lNQk9MKHJkbWFfYWRkcl91bnJlZ2lzdGVyX2NsaWVudCk7CisKIGludCByZG1hX2NvcHlfYWRkcihzdHJ1Y3QgcmRtYV9kZXZfYWRkciAqZGV2X2FkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0X2Rldl9hZGRyKQogewpAQCAtMTE4LDcgKzEzOSw3IEBACiAKIAltdXRleF9sb2NrKCZsb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UodGVtcF9yZXEsICZyZXFfbGlzdCwgbGlzdCkgewotCQlpZiAodGltZV9hZnRlcihyZXEtPnRpbWVvdXQsIHRlbXBfcmVxLT50aW1lb3V0KSkKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEocmVxLT50aW1lb3V0LCB0ZW1wX3JlcS0+dGltZW91dCkpCiAJCQlicmVhazsKIAl9CiAKQEAgLTE5NCw3ICsyMTUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHByb2Nlc3NfcmVxKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwcm9jZXNzX3JlcShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGFkZHJfcmVxICpyZXEsICp0ZW1wX3JlcTsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNyY19pbiwgKmRzdF9pbjsKQEAgLTIwNCwxOSArMjI1LDE3IEBACiAKIAltdXRleF9sb2NrKCZsb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0ZW1wX3JlcSwgJnJlcV9saXN0LCBsaXN0KSB7Ci0JCWlmIChyZXEtPnN0YXR1cykgeworCQlpZiAocmVxLT5zdGF0dXMgPT0gLUVOT0RBVEEpIHsKIAkJCXNyY19pbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnJlcS0+c3JjX2FkZHI7CiAJCQlkc3RfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZyZXEtPmRzdF9hZGRyOwogCQkJcmVxLT5zdGF0dXMgPSBhZGRyX3Jlc29sdmVfcmVtb3RlKHNyY19pbiwgZHN0X2luLAogCQkJCQkJCSAgcmVxLT5hZGRyKTsKKwkJCWlmIChyZXEtPnN0YXR1cyAmJiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJlcS0+dGltZW91dCkpCisJCQkJcmVxLT5zdGF0dXMgPSAtRVRJTUVET1VUOworCQkJZWxzZSBpZiAocmVxLT5zdGF0dXMgPT0gLUVOT0RBVEEpCisJCQkJY29udGludWU7CiAJCX0KLQkJaWYgKHJlcS0+c3RhdHVzICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgcmVxLT50aW1lb3V0KSkKLQkJCXJlcS0+c3RhdHVzID0gLUVUSU1FRE9VVDsKLQkJZWxzZSBpZiAocmVxLT5zdGF0dXMgPT0gLUVOT0RBVEEpCi0JCQljb250aW51ZTsKLQotCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZG9uZV9saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnJlcS0+bGlzdCwgJmRvbmVfbGlzdCk7CiAJfQogCiAJaWYgKCFsaXN0X2VtcHR5KCZyZXFfbGlzdCkpIHsKQEAgLTIyOSw2ICsyNDgsNyBAQAogCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKIAkJcmVxLT5jYWxsYmFjayhyZXEtPnN0YXR1cywgJnJlcS0+c3JjX2FkZHIsIHJlcS0+YWRkciwKIAkJCSAgICAgIHJlcS0+Y29udGV4dCk7CisJCXB1dF9jbGllbnQocmVxLT5jbGllbnQpOwogCQlrZnJlZShyZXEpOwogCX0KIH0KQEAgLTI2NCw3ICsyODQsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCByZG1hX3Jlc29sdmVfaXAoc3RydWN0IHNvY2thZGRyICpzcmNfYWRkciwgc3RydWN0IHNvY2thZGRyICpkc3RfYWRkciwKK2ludCByZG1hX3Jlc29sdmVfaXAoc3RydWN0IHJkbWFfYWRkcl9jbGllbnQgKmNsaWVudCwKKwkJICAgIHN0cnVjdCBzb2NrYWRkciAqc3JjX2FkZHIsIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIsCiAJCSAgICBzdHJ1Y3QgcmRtYV9kZXZfYWRkciAqYWRkciwgaW50IHRpbWVvdXRfbXMsCiAJCSAgICB2b2lkICgqY2FsbGJhY2spKGludCBzdGF0dXMsIHN0cnVjdCBzb2NrYWRkciAqc3JjX2FkZHIsCiAJCQkJICAgICBzdHJ1Y3QgcmRtYV9kZXZfYWRkciAqYWRkciwgdm9pZCAqY29udGV4dCksCkBAIC0yODUsNiArMzA2LDggQEAKIAlyZXEtPmFkZHIgPSBhZGRyOwogCXJlcS0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKIAlyZXEtPmNvbnRleHQgPSBjb250ZXh0OworCXJlcS0+Y2xpZW50ID0gY2xpZW50OworCWF0b21pY19pbmMoJmNsaWVudC0+cmVmY291bnQpOwogCiAJc3JjX2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcmVxLT5zcmNfYWRkcjsKIAlkc3RfaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZyZXEtPmRzdF9hZGRyOwpAQCAtMzA1LDYgKzMyOCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IHJlcS0+c3RhdHVzOworCQlhdG9taWNfZGVjKCZjbGllbnQtPnJlZmNvdW50KTsKIAkJa2ZyZWUocmVxKTsKIAkJYnJlYWs7CiAJfQpAQCAtMzIxLDggKzM0NSw3IEBACiAJCWlmIChyZXEtPmFkZHIgPT0gYWRkcikgewogCQkJcmVxLT5zdGF0dXMgPSAtRUNBTkNFTEVEOwogCQkJcmVxLT50aW1lb3V0ID0gamlmZmllczsKLQkJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOwotCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJnJlcV9saXN0KTsKKwkJCWxpc3RfbW92ZSgmcmVxLT5saXN0LCAmcmVxX2xpc3QpOwogCQkJc2V0X3RpbWVvdXQocmVxLT50aW1lb3V0KTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jYWNoZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY2FjaGUuYwppbmRleCAyMGU5ZjY0Li45ODI3MmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jYWNoZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NhY2hlLmMKQEAgLTI4NSw5ICsyODUsMTAgQEAKIAlrZnJlZSh0cHJvcHMpOwogfQogCi1zdGF0aWMgdm9pZCBpYl9jYWNoZV90YXNrKHZvaWQgKndvcmtfcHRyKQorc3RhdGljIHZvaWQgaWJfY2FjaGVfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl93b3JrKQogewotCXN0cnVjdCBpYl91cGRhdGVfd29yayAqd29yayA9IHdvcmtfcHRyOworCXN0cnVjdCBpYl91cGRhdGVfd29yayAqd29yayA9CisJCWNvbnRhaW5lcl9vZihfd29yaywgc3RydWN0IGliX3VwZGF0ZV93b3JrLCB3b3JrKTsKIAogCWliX2NhY2hlX3VwZGF0ZSh3b3JrLT5kZXZpY2UsIHdvcmstPnBvcnRfbnVtKTsKIAlrZnJlZSh3b3JrKTsKQEAgLTMwNiw3ICszMDcsNyBAQAogCSAgICBldmVudC0+ZXZlbnQgPT0gSUJfRVZFTlRfQ0xJRU5UX1JFUkVHSVNURVIpIHsKIAkJd29yayA9IGttYWxsb2Moc2l6ZW9mICp3b3JrLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHdvcmspIHsKLQkJCUlOSVRfV09SSygmd29yay0+d29yaywgaWJfY2FjaGVfdGFzaywgd29yayk7CisJCQlJTklUX1dPUksoJndvcmstPndvcmssIGliX2NhY2hlX3Rhc2spOwogCQkJd29yay0+ZGV2aWNlICAgPSBldmVudC0+ZGV2aWNlOwogCQkJd29yay0+cG9ydF9udW0gPSBldmVudC0+ZWxlbWVudC5wb3J0X251bTsKIAkJCXNjaGVkdWxlX3dvcmsoJndvcmstPndvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtLmMKaW5kZXggMjViMTAxOC4uZDQ0Njk5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIH07CiAKIHN0cnVjdCBjbV93b3JrIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBjbV9wb3J0ICpwb3J0OwogCXN0cnVjdCBpYl9tYWRfcmVjdl93YyAqbWFkX3JlY3Zfd2M7CS8qIFJlY2VpdmVkIE1BRHMgKi8KQEAgLTE0NywxMiArMTQ3LDEyIEBACiAJX19iZTMyIHJxX3BzbjsKIAlpbnQgdGltZW91dF9tczsKIAllbnVtIGliX210dSBwYXRoX210dTsKKwlfX2JlMTYgcGtleTsKIAl1OCBwcml2YXRlX2RhdGFfbGVuOwogCXU4IG1heF9jbV9yZXRyaWVzOwogCXU4IHBlZXJfdG9fcGVlcjsKIAl1OCByZXNwb25kZXJfcmVzb3VyY2VzOwogCXU4IGluaXRpYXRvcl9kZXB0aDsKLQl1OCBsb2NhbF9hY2tfdGltZW91dDsKIAl1OCByZXRyeV9jb3VudDsKIAl1OCBybnJfcmV0cnlfY291bnQ7CiAJdTggc2VydmljZV90aW1lb3V0OwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJYXRvbWljX3Qgd29ya19jb3VudDsKIH07CiAKLXN0YXRpYyB2b2lkIGNtX3dvcmtfaGFuZGxlcih2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGNtX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgY21fZGVyZWZfaWQoc3RydWN0IGNtX2lkX3ByaXZhdGUgKmNtX2lkX3ByaXYpCiB7CkBAIC0yNDAsMTEgKzI0MCwxMCBAQAogCWlmICghcHJpdmF0ZV9kYXRhIHx8ICFwcml2YXRlX2RhdGFfbGVuKQogCQlyZXR1cm4gTlVMTDsKIAotCWRhdGEgPSBrbWFsbG9jKHByaXZhdGVfZGF0YV9sZW4sIEdGUF9LRVJORUwpOworCWRhdGEgPSBrbWVtZHVwKHByaXZhdGVfZGF0YSwgcHJpdmF0ZV9kYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCW1lbWNweShkYXRhLCBwcml2YXRlX2RhdGEsIHByaXZhdGVfZGF0YV9sZW4pOwogCXJldHVybiBkYXRhOwogfQogCkBAIC02NjksOCArNjY4LDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAl0aW1ld2FpdF9pbmZvLT53b3JrLmxvY2FsX2lkID0gbG9jYWxfaWQ7Ci0JSU5JVF9XT1JLKCZ0aW1ld2FpdF9pbmZvLT53b3JrLndvcmssIGNtX3dvcmtfaGFuZGxlciwKLQkJICAmdGltZXdhaXRfaW5mby0+d29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnRpbWV3YWl0X2luZm8tPndvcmsud29yaywgY21fd29ya19oYW5kbGVyKTsKIAl0aW1ld2FpdF9pbmZvLT53b3JrLmNtX2V2ZW50LmV2ZW50ID0gSUJfQ01fVElNRVdBSVRfRVhJVDsKIAlyZXR1cm4gdGltZXdhaXRfaW5mbzsKIH0KQEAgLTY5MSw3ICs2ODksNyBAQAogCSAqIHRpbWV3YWl0IGJlZm9yZSBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB3ZSd2ZSBleGl0ZWQgdGltZXdhaXQuCiAJICovCiAJY21faWRfcHJpdi0+aWQuc3RhdGUgPSBJQl9DTV9USU1FV0FJVDsKLQl3YWl0X3RpbWUgPSBjbV9jb252ZXJ0X3RvX21zKGNtX2lkX3ByaXYtPmxvY2FsX2Fja190aW1lb3V0KTsKKwl3YWl0X3RpbWUgPSBjbV9jb252ZXJ0X3RvX21zKGNtX2lkX3ByaXYtPmF2LnBhY2tldF9saWZlX3RpbWUgKyAxKTsKIAlxdWV1ZV9kZWxheWVkX3dvcmsoY20ud3EsICZjbV9pZF9wcml2LT50aW1ld2FpdF9pbmZvLT53b3JrLndvcmssCiAJCQkgICBtc2Vjc190b19qaWZmaWVzKHdhaXRfdGltZSkpOwogCWNtX2lkX3ByaXYtPnRpbWV3YWl0X2luZm8gPSBOVUxMOwpAQCAtMTAxMCw2ICsxMDA4LDcgQEAKIAljbV9pZF9wcml2LT5yZXNwb25kZXJfcmVzb3VyY2VzID0gcGFyYW0tPnJlc3BvbmRlcl9yZXNvdXJjZXM7CiAJY21faWRfcHJpdi0+cmV0cnlfY291bnQgPSBwYXJhbS0+cmV0cnlfY291bnQ7CiAJY21faWRfcHJpdi0+cGF0aF9tdHUgPSBwYXJhbS0+cHJpbWFyeV9wYXRoLT5tdHU7CisJY21faWRfcHJpdi0+cGtleSA9IHBhcmFtLT5wcmltYXJ5X3BhdGgtPnBrZXk7CiAJY21faWRfcHJpdi0+cXBfdHlwZSA9IHBhcmFtLT5xcF90eXBlOwogCiAJcmV0ID0gY21fYWxsb2NfbXNnKGNtX2lkX3ByaXYsICZjbV9pZF9wcml2LT5tc2cpOwpAQCAtMTAyNCw4ICsxMDIzLDYgQEAKIAogCWNtX2lkX3ByaXYtPmxvY2FsX3FwbiA9IGNtX3JlcV9nZXRfbG9jYWxfcXBuKHJlcV9tc2cpOwogCWNtX2lkX3ByaXYtPnJxX3BzbiA9IGNtX3JlcV9nZXRfc3RhcnRpbmdfcHNuKHJlcV9tc2cpOwotCWNtX2lkX3ByaXYtPmxvY2FsX2Fja190aW1lb3V0ID0KLQkJCQljbV9yZXFfZ2V0X3ByaW1hcnlfbG9jYWxfYWNrX3RpbWVvdXQocmVxX21zZyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCXJldCA9IGliX3Bvc3Rfc2VuZF9tYWQoY21faWRfcHJpdi0+bXNnLCBOVUxMKTsKQEAgLTE0MTAsOSArMTQwNyw4IEBACiAJY21faWRfcHJpdi0+aW5pdGlhdG9yX2RlcHRoID0gY21fcmVxX2dldF9yZXNwX3JlcyhyZXFfbXNnKTsKIAljbV9pZF9wcml2LT5yZXNwb25kZXJfcmVzb3VyY2VzID0gY21fcmVxX2dldF9pbml0X2RlcHRoKHJlcV9tc2cpOwogCWNtX2lkX3ByaXYtPnBhdGhfbXR1ID0gY21fcmVxX2dldF9wYXRoX210dShyZXFfbXNnKTsKKwljbV9pZF9wcml2LT5wa2V5ID0gcmVxX21zZy0+cGtleTsKIAljbV9pZF9wcml2LT5zcV9wc24gPSBjbV9yZXFfZ2V0X3N0YXJ0aW5nX3BzbihyZXFfbXNnKTsKLQljbV9pZF9wcml2LT5sb2NhbF9hY2tfdGltZW91dCA9Ci0JCQkJY21fcmVxX2dldF9wcmltYXJ5X2xvY2FsX2Fja190aW1lb3V0KHJlcV9tc2cpOwogCWNtX2lkX3ByaXYtPnJldHJ5X2NvdW50ID0gY21fcmVxX2dldF9yZXRyeV9jb3VudChyZXFfbXNnKTsKIAljbV9pZF9wcml2LT5ybnJfcmV0cnlfY291bnQgPSBjbV9yZXFfZ2V0X3Jucl9yZXRyeV9jb3VudChyZXFfbXNnKTsKIAljbV9pZF9wcml2LT5xcF90eXBlID0gY21fcmVxX2dldF9xcF90eXBlKHJlcV9tc2cpOwpAQCAtMTcxNiw3ICsxNzEyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKLQkvKiBTZWUgY29tbWVudCBpbiBpYl9jbV9lc3RhYmxpc2ggYWJvdXQgbG9va3VwLiAqLworCS8qIFNlZSBjb21tZW50IGluIGNtX2VzdGFibGlzaCBhYm91dCBsb29rdXAuICovCiAJY21faWRfcHJpdiA9IGNtX2FjcXVpcmVfaWQod29yay0+bG9jYWxfaWQsIHdvcmstPnJlbW90ZV9pZCk7CiAJaWYgKCFjbV9pZF9wcml2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0MDIsMTEgKzIzOTgsMTYgQEAKIAljbV9pZF9wcml2ID0gY29udGFpbmVyX29mKGNtX2lkLCBzdHJ1Y3QgY21faWRfcHJpdmF0ZSwgaWQpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9pZF9wcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKGNtX2lkLT5zdGF0ZSAhPSBJQl9DTV9FU1RBQkxJU0hFRCB8fAotCSAgICBjbV9pZC0+bGFwX3N0YXRlICE9IElCX0NNX0xBUF9JRExFKSB7CisJICAgIChjbV9pZC0+bGFwX3N0YXRlICE9IElCX0NNX0xBUF9VTklOSVQgJiYKKwkgICAgIGNtX2lkLT5sYXBfc3RhdGUgIT0gSUJfQ01fTEFQX0lETEUpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAorCXJldCA9IGNtX2luaXRfYXZfYnlfcGF0aChhbHRlcm5hdGVfcGF0aCwgJmNtX2lkX3ByaXYtPmFsdF9hdik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKIAlyZXQgPSBjbV9hbGxvY19tc2coY21faWRfcHJpdiwgJm1zZyk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CkBAIC0yNDMxLDcgKzI0MzIsOCBAQAogfQogRVhQT1JUX1NZTUJPTChpYl9zZW5kX2NtX2xhcCk7CiAKLXN0YXRpYyB2b2lkIGNtX2Zvcm1hdF9wYXRoX2Zyb21fbGFwKHN0cnVjdCBpYl9zYV9wYXRoX3JlYyAqcGF0aCwKK3N0YXRpYyB2b2lkIGNtX2Zvcm1hdF9wYXRoX2Zyb21fbGFwKHN0cnVjdCBjbV9pZF9wcml2YXRlICpjbV9pZF9wcml2LAorCQkJCSAgICBzdHJ1Y3QgaWJfc2FfcGF0aF9yZWMgKnBhdGgsCiAJCQkJICAgIHN0cnVjdCBjbV9sYXBfbXNnICpsYXBfbXNnKQogewogCW1lbXNldChwYXRoLCAwLCBzaXplb2YgKnBhdGgpOwpAQCAtMjQ0MywxMCArMjQ0NSwxMCBAQAogCXBhdGgtPmhvcF9saW1pdCA9IGxhcF9tc2ctPmFsdF9ob3BfbGltaXQ7CiAJcGF0aC0+dHJhZmZpY19jbGFzcyA9IGNtX2xhcF9nZXRfdHJhZmZpY19jbGFzcyhsYXBfbXNnKTsKIAlwYXRoLT5yZXZlcnNpYmxlID0gMTsKLQkvKiBwa2V5IGlzIHNhbWUgYXMgaW4gUkVRICovCisJcGF0aC0+cGtleSA9IGNtX2lkX3ByaXYtPnBrZXk7CiAJcGF0aC0+c2wgPSBjbV9sYXBfZ2V0X3NsKGxhcF9tc2cpOwogCXBhdGgtPm10dV9zZWxlY3RvciA9IElCX1NBX0VROwotCS8qIG10dSBpcyBzYW1lIGFzIGluIFJFUSAqLworCXBhdGgtPm10dSA9IGNtX2lkX3ByaXYtPnBhdGhfbXR1OwogCXBhdGgtPnJhdGVfc2VsZWN0b3IgPSBJQl9TQV9FUTsKIAlwYXRoLT5yYXRlID0gY21fbGFwX2dldF9wYWNrZXRfcmF0ZShsYXBfbXNnKTsKIAlwYXRoLT5wYWNrZXRfbGlmZV90aW1lX3NlbGVjdG9yID0gSUJfU0FfRVE7CkBAIC0yNDcyLDcgKzI0NzQsNyBAQAogCiAJcGFyYW0gPSAmd29yay0+Y21fZXZlbnQucGFyYW0ubGFwX3JjdmQ7CiAJcGFyYW0tPmFsdGVybmF0ZV9wYXRoID0gJndvcmstPnBhdGhbMF07Ci0JY21fZm9ybWF0X3BhdGhfZnJvbV9sYXAocGFyYW0tPmFsdGVybmF0ZV9wYXRoLCBsYXBfbXNnKTsKKwljbV9mb3JtYXRfcGF0aF9mcm9tX2xhcChjbV9pZF9wcml2LCBwYXJhbS0+YWx0ZXJuYXRlX3BhdGgsIGxhcF9tc2cpOwogCXdvcmstPmNtX2V2ZW50LnByaXZhdGVfZGF0YSA9ICZsYXBfbXNnLT5wcml2YXRlX2RhdGE7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMjQ4MCw2ICsyNDgyLDcgQEAKIAkJZ290byB1bmxvY2s7CiAKIAlzd2l0Y2ggKGNtX2lkX3ByaXYtPmlkLmxhcF9zdGF0ZSkgeworCWNhc2UgSUJfQ01fTEFQX1VOSU5JVDoKIAljYXNlIElCX0NNX0xBUF9JRExFOgogCQlicmVhazsKIAljYXNlIElCX0NNX01SQV9MQVBfU0VOVDoKQEAgLTI1MDIsNiArMjUwNSwxMCBAQAogCiAJY21faWRfcHJpdi0+aWQubGFwX3N0YXRlID0gSUJfQ01fTEFQX1JDVkQ7CiAJY21faWRfcHJpdi0+dGlkID0gbGFwX21zZy0+aGRyLnRpZDsKKwljbV9pbml0X2F2X2Zvcl9yZXNwb25zZSh3b3JrLT5wb3J0LCB3b3JrLT5tYWRfcmVjdl93Yy0+d2MsCisJCQkJd29yay0+bWFkX3JlY3Zfd2MtPnJlY3ZfYnVmLmdyaCwKKwkJCQkmY21faWRfcHJpdi0+YXYpOworCWNtX2luaXRfYXZfYnlfcGF0aChwYXJhbS0+YWx0ZXJuYXRlX3BhdGgsICZjbV9pZF9wcml2LT5hbHRfYXYpOwogCXJldCA9IGF0b21pY19pbmNfYW5kX3Rlc3QoJmNtX2lkX3ByaXYtPndvcmtfY291bnQpOwogCWlmICghcmV0KQogCQlsaXN0X2FkZF90YWlsKCZ3b3JrLT5saXN0LCAmY21faWRfcHJpdi0+d29ya19saXN0KTsKQEAgLTI5ODcsOSArMjk5NCw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBjbV93b3JrX2hhbmRsZXIodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGNtX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl93b3JrKQogewotCXN0cnVjdCBjbV93b3JrICp3b3JrID0gZGF0YTsKKwlzdHJ1Y3QgY21fd29yayAqd29yayA9IGNvbnRhaW5lcl9vZihfd29yaywgc3RydWN0IGNtX3dvcmssIHdvcmsud29yayk7CiAJaW50IHJldDsKIAogCXN3aXRjaCAod29yay0+Y21fZXZlbnQuZXZlbnQpIHsKQEAgLTMwNDAsNyArMzA0Nyw3IEBACiAJCWNtX2ZyZWVfd29yayh3b3JrKTsKIH0KIAotaW50IGliX2NtX2VzdGFibGlzaChzdHJ1Y3QgaWJfY21faWQgKmNtX2lkKQorc3RhdGljIGludCBjbV9lc3RhYmxpc2goc3RydWN0IGliX2NtX2lkICpjbV9pZCkKIHsKIAlzdHJ1Y3QgY21faWRfcHJpdmF0ZSAqY21faWRfcHJpdjsKIAlzdHJ1Y3QgY21fd29yayAqd29yazsKQEAgLTMwNzksMTYgKzMwODYsNTMgQEAKIAkgKiB3ZSBuZWVkIHRvIGZpbmQgdGhlIGNtX2lkIG9uY2Ugd2UncmUgaW4gdGhlIGNvbnRleHQgb2YgdGhlCiAJICogd29ya2VyIHRocmVhZCwgcmF0aGVyIHRoYW4gaG9sZGluZyBhIHJlZmVyZW5jZSBvbiBpdC4KIAkgKi8KLQlJTklUX1dPUksoJndvcmstPndvcmssIGNtX3dvcmtfaGFuZGxlciwgd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJndvcmstPndvcmssIGNtX3dvcmtfaGFuZGxlcik7CiAJd29yay0+bG9jYWxfaWQgPSBjbV9pZC0+bG9jYWxfaWQ7CiAJd29yay0+cmVtb3RlX2lkID0gY21faWQtPnJlbW90ZV9pZDsKIAl3b3JrLT5tYWRfcmVjdl93YyA9IE5VTEw7CiAJd29yay0+Y21fZXZlbnQuZXZlbnQgPSBJQl9DTV9VU0VSX0VTVEFCTElTSEVEOwotCXF1ZXVlX3dvcmsoY20ud3EsICZ3b3JrLT53b3JrKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoY20ud3EsICZ3b3JrLT53b3JrLCAwKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChpYl9jbV9lc3RhYmxpc2gpOworCitzdGF0aWMgaW50IGNtX21pZ3JhdGUoc3RydWN0IGliX2NtX2lkICpjbV9pZCkKK3sKKwlzdHJ1Y3QgY21faWRfcHJpdmF0ZSAqY21faWRfcHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJY21faWRfcHJpdiA9IGNvbnRhaW5lcl9vZihjbV9pZCwgc3RydWN0IGNtX2lkX3ByaXZhdGUsIGlkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmIChjbV9pZC0+c3RhdGUgPT0gSUJfQ01fRVNUQUJMSVNIRUQgJiYKKwkgICAgKGNtX2lkLT5sYXBfc3RhdGUgPT0gSUJfQ01fTEFQX1VOSU5JVCB8fAorCSAgICAgY21faWQtPmxhcF9zdGF0ZSA9PSBJQl9DTV9MQVBfSURMRSkpIHsKKwkJY21faWQtPmxhcF9zdGF0ZSA9IElCX0NNX0xBUF9JRExFOworCQljbV9pZF9wcml2LT5hdiA9IGNtX2lkX3ByaXYtPmFsdF9hdjsKKwl9IGVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbV9pZF9wcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaWJfY21fbm90aWZ5KHN0cnVjdCBpYl9jbV9pZCAqY21faWQsIGVudW0gaWJfZXZlbnRfdHlwZSBldmVudCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSUJfRVZFTlRfQ09NTV9FU1Q6CisJCXJldCA9IGNtX2VzdGFibGlzaChjbV9pZCk7CisJCWJyZWFrOworCWNhc2UgSUJfRVZFTlRfUEFUSF9NSUc6CisJCXJldCA9IGNtX21pZ3JhdGUoY21faWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpYl9jbV9ub3RpZnkpOwogCiBzdGF0aWMgdm9pZCBjbV9yZWN2X2hhbmRsZXIoc3RydWN0IGliX21hZF9hZ2VudCAqbWFkX2FnZW50LAogCQkJICAgIHN0cnVjdCBpYl9tYWRfcmVjdl93YyAqbWFkX3JlY3Zfd2MpCkBAIC0zMTQ2LDExICszMTkwLDExIEBACiAJCXJldHVybjsKIAl9CiAKLQlJTklUX1dPUksoJndvcmstPndvcmssIGNtX3dvcmtfaGFuZGxlciwgd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJndvcmstPndvcmssIGNtX3dvcmtfaGFuZGxlcik7CiAJd29yay0+Y21fZXZlbnQuZXZlbnQgPSBldmVudDsKIAl3b3JrLT5tYWRfcmVjdl93YyA9IG1hZF9yZWN2X3djOwogCXdvcmstPnBvcnQgPSAoc3RydWN0IGNtX3BvcnQgKiltYWRfYWdlbnQtPmNvbnRleHQ7Ci0JcXVldWVfd29yayhjbS53cSwgJndvcmstPndvcmspOworCXF1ZXVlX2RlbGF5ZWRfd29yayhjbS53cSwgJndvcmstPndvcmssIDApOwogfQogCiBzdGF0aWMgaW50IGNtX2luaXRfcXBfaW5pdF9hdHRyKHN0cnVjdCBjbV9pZF9wcml2YXRlICpjbV9pZF9wcml2LApAQCAtMzE3Myw4ICszMjE3LDcgQEAKIAljYXNlIElCX0NNX0VTVEFCTElTSEVEOgogCQkqcXBfYXR0cl9tYXNrID0gSUJfUVBfU1RBVEUgfCBJQl9RUF9BQ0NFU1NfRkxBR1MgfAogCQkJCUlCX1FQX1BLRVlfSU5ERVggfCBJQl9RUF9QT1JUOwotCQlxcF9hdHRyLT5xcF9hY2Nlc3NfZmxhZ3MgPSBJQl9BQ0NFU1NfTE9DQUxfV1JJVEUgfAotCQkJCQkgICBJQl9BQ0NFU1NfUkVNT1RFX1dSSVRFOworCQlxcF9hdHRyLT5xcF9hY2Nlc3NfZmxhZ3MgPSBJQl9BQ0NFU1NfUkVNT1RFX1dSSVRFOwogCQlpZiAoY21faWRfcHJpdi0+cmVzcG9uZGVyX3Jlc291cmNlcykKIAkJCXFwX2F0dHItPnFwX2FjY2Vzc19mbGFncyB8PSBJQl9BQ0NFU1NfUkVNT1RFX1JFQUQgfAogCQkJCQkJICAgIElCX0FDQ0VTU19SRU1PVEVfQVRPTUlDOwpAQCAtMzIyMiw2ICszMjY1LDkgQEAKIAkJaWYgKGNtX2lkX3ByaXYtPmFsdF9hdi5haF9hdHRyLmRsaWQpIHsKIAkJCSpxcF9hdHRyX21hc2sgfD0gSUJfUVBfQUxUX1BBVEg7CiAJCQlxcF9hdHRyLT5hbHRfcG9ydF9udW0gPSBjbV9pZF9wcml2LT5hbHRfYXYucG9ydC0+cG9ydF9udW07CisJCQlxcF9hdHRyLT5hbHRfcGtleV9pbmRleCA9IGNtX2lkX3ByaXYtPmFsdF9hdi5wa2V5X2luZGV4OworCQkJcXBfYXR0ci0+YWx0X3RpbWVvdXQgPQorCQkJCQljbV9pZF9wcml2LT5hbHRfYXYucGFja2V0X2xpZmVfdGltZSArIDE7CiAJCQlxcF9hdHRyLT5hbHRfYWhfYXR0ciA9IGNtX2lkX3ByaXYtPmFsdF9hdi5haF9hdHRyOwogCQl9CiAJCXJldCA9IDA7CkBAIC0zMjQzLDI0ICszMjg5LDQwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCXN3aXRjaCAoY21faWRfcHJpdi0+aWQuc3RhdGUpIHsKKwkvKiBBbGxvdyB0cmFuc2l0aW9uIHRvIFJUUyBiZWZvcmUgc2VuZGluZyBSRVAgKi8KKwljYXNlIElCX0NNX1JFUV9SQ1ZEOgorCWNhc2UgSUJfQ01fTVJBX1JFUV9TRU5UOgorCiAJY2FzZSBJQl9DTV9SRVBfUkNWRDoKIAljYXNlIElCX0NNX01SQV9SRVBfU0VOVDoKIAljYXNlIElCX0NNX1JFUF9TRU5UOgogCWNhc2UgSUJfQ01fTVJBX1JFUF9SQ1ZEOgogCWNhc2UgSUJfQ01fRVNUQUJMSVNIRUQ6Ci0JCSpxcF9hdHRyX21hc2sgPSBJQl9RUF9TVEFURSB8IElCX1FQX1NRX1BTTjsKLQkJcXBfYXR0ci0+c3FfcHNuID0gYmUzMl90b19jcHUoY21faWRfcHJpdi0+c3FfcHNuKTsKLQkJaWYgKGNtX2lkX3ByaXYtPnFwX3R5cGUgPT0gSUJfUVBUX1JDKSB7Ci0JCQkqcXBfYXR0cl9tYXNrIHw9IElCX1FQX1RJTUVPVVQgfCBJQl9RUF9SRVRSWV9DTlQgfAotCQkJCQkgSUJfUVBfUk5SX1JFVFJZIHwKLQkJCQkJIElCX1FQX01BWF9RUF9SRF9BVE9NSUM7Ci0JCQlxcF9hdHRyLT50aW1lb3V0ID0gY21faWRfcHJpdi0+bG9jYWxfYWNrX3RpbWVvdXQ7Ci0JCQlxcF9hdHRyLT5yZXRyeV9jbnQgPSBjbV9pZF9wcml2LT5yZXRyeV9jb3VudDsKLQkJCXFwX2F0dHItPnJucl9yZXRyeSA9IGNtX2lkX3ByaXYtPnJucl9yZXRyeV9jb3VudDsKLQkJCXFwX2F0dHItPm1heF9yZF9hdG9taWMgPSBjbV9pZF9wcml2LT5pbml0aWF0b3JfZGVwdGg7Ci0JCX0KLQkJaWYgKGNtX2lkX3ByaXYtPmFsdF9hdi5haF9hdHRyLmRsaWQpIHsKLQkJCSpxcF9hdHRyX21hc2sgfD0gSUJfUVBfUEFUSF9NSUdfU1RBVEU7CisJCWlmIChjbV9pZF9wcml2LT5pZC5sYXBfc3RhdGUgPT0gSUJfQ01fTEFQX1VOSU5JVCkgeworCQkJKnFwX2F0dHJfbWFzayA9IElCX1FQX1NUQVRFIHwgSUJfUVBfU1FfUFNOOworCQkJcXBfYXR0ci0+c3FfcHNuID0gYmUzMl90b19jcHUoY21faWRfcHJpdi0+c3FfcHNuKTsKKwkJCWlmIChjbV9pZF9wcml2LT5xcF90eXBlID09IElCX1FQVF9SQykgeworCQkJCSpxcF9hdHRyX21hc2sgfD0gSUJfUVBfVElNRU9VVCB8IElCX1FQX1JFVFJZX0NOVCB8CisJCQkJCQkgSUJfUVBfUk5SX1JFVFJZIHwKKwkJCQkJCSBJQl9RUF9NQVhfUVBfUkRfQVRPTUlDOworCQkJCXFwX2F0dHItPnRpbWVvdXQgPQorCQkJCQljbV9pZF9wcml2LT5hdi5wYWNrZXRfbGlmZV90aW1lICsgMTsKKwkJCQlxcF9hdHRyLT5yZXRyeV9jbnQgPSBjbV9pZF9wcml2LT5yZXRyeV9jb3VudDsKKwkJCQlxcF9hdHRyLT5ybnJfcmV0cnkgPSBjbV9pZF9wcml2LT5ybnJfcmV0cnlfY291bnQ7CisJCQkJcXBfYXR0ci0+bWF4X3JkX2F0b21pYyA9CisJCQkJCWNtX2lkX3ByaXYtPmluaXRpYXRvcl9kZXB0aDsKKwkJCX0KKwkJCWlmIChjbV9pZF9wcml2LT5hbHRfYXYuYWhfYXR0ci5kbGlkKSB7CisJCQkJKnFwX2F0dHJfbWFzayB8PSBJQl9RUF9QQVRIX01JR19TVEFURTsKKwkJCQlxcF9hdHRyLT5wYXRoX21pZ19zdGF0ZSA9IElCX01JR19SRUFSTTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSpxcF9hdHRyX21hc2sgPSBJQl9RUF9BTFRfUEFUSCB8IElCX1FQX1BBVEhfTUlHX1NUQVRFOworCQkJcXBfYXR0ci0+YWx0X3BvcnRfbnVtID0gY21faWRfcHJpdi0+YWx0X2F2LnBvcnQtPnBvcnRfbnVtOworCQkJcXBfYXR0ci0+YWx0X3BrZXlfaW5kZXggPSBjbV9pZF9wcml2LT5hbHRfYXYucGtleV9pbmRleDsKKwkJCXFwX2F0dHItPmFsdF90aW1lb3V0ID0KKwkJCQljbV9pZF9wcml2LT5hbHRfYXYucGFja2V0X2xpZmVfdGltZSArIDE7CisJCQlxcF9hdHRyLT5hbHRfYWhfYXR0ciA9IGNtX2lkX3ByaXYtPmFsdF9hdi5haF9hdHRyOwogCQkJcXBfYXR0ci0+cGF0aF9taWdfc3RhdGUgPSBJQl9NSUdfUkVBUk07CiAJCX0KIAkJcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKaW5kZXggOWFlNGYzYS4uNTMzMTkzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMKQEAgLTYzLDEyICs2MywxNCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpYl9zYV9jbGllbnQgc2FfY2xpZW50Oworc3RhdGljIHN0cnVjdCByZG1hX2FkZHJfY2xpZW50IGFkZHJfY2xpZW50Owogc3RhdGljIExJU1RfSEVBRChkZXZfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKGxpc3Rlbl9hbnlfbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKGxvY2spOwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjbWFfd3E7CiBzdGF0aWMgREVGSU5FX0lEUihzZHBfcHMpOwogc3RhdGljIERFRklORV9JRFIodGNwX3BzKTsKK3N0YXRpYyBERUZJTkVfSURSKHVkcF9wcyk7CiAKIHN0cnVjdCBjbWFfZGV2aWNlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CkBAIC0xMzIsNyArMTM0LDYgQEAKIAogCXUzMgkJCXNlcV9udW07CiAJdTMyCQkJcXBfbnVtOwotCWVudW0gaWJfcXBfdHlwZQkJcXBfdHlwZTsKIAl1OAkJCXNycTsKIH07CiAKQEAgLTM0Myw3ICszNDQsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJcXBfYXR0ci5xcF9zdGF0ZSA9IElCX1FQU19JTklUOwotCXFwX2F0dHIucXBfYWNjZXNzX2ZsYWdzID0gSUJfQUNDRVNTX0xPQ0FMX1dSSVRFOworCXFwX2F0dHIucXBfYWNjZXNzX2ZsYWdzID0gMDsKIAlxcF9hdHRyLnBvcnRfbnVtID0gaWRfcHJpdi0+aWQucG9ydF9udW07CiAJcmV0dXJuIGliX21vZGlmeV9xcChxcCwgJnFwX2F0dHIsIElCX1FQX1NUQVRFIHwgSUJfUVBfQUNDRVNTX0ZMQUdTIHwKIAkJCQkJICBJQl9RUF9QS0VZX0lOREVYIHwgSUJfUVBfUE9SVCk7CkBAIC0zOTEsNyArMzkyLDYgQEAKIAogCWlkLT5xcCA9IHFwOwogCWlkX3ByaXYtPnFwX251bSA9IHFwLT5xcF9udW07Ci0JaWRfcHJpdi0+cXBfdHlwZSA9IHFwLT5xcF90eXBlOwogCWlkX3ByaXYtPnNycSA9IChxcC0+c3JxICE9IE5VTEwpOwogCXJldHVybiAwOwogZXJyOgpAQCAtNTA5LDkgKzUwOSwxNyBAQAogCXJldHVybiBjbWFfemVyb19hZGRyKGFkZHIpIHx8IGNtYV9sb29wYmFja19hZGRyKGFkZHIpOwogfQogCitzdGF0aWMgaW5saW5lIF9fYmUxNiBjbWFfcG9ydChzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpCit7CisJaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlyZXR1cm4gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgYWRkciktPnNpbl9wb3J0OworCWVsc2UKKwkJcmV0dXJuICgoc3RydWN0IHNvY2thZGRyX2luNiAqKSBhZGRyKS0+c2luNl9wb3J0OworfQorCiBzdGF0aWMgaW5saW5lIGludCBjbWFfYW55X3BvcnQoc3RydWN0IHNvY2thZGRyICphZGRyKQogewotCXJldHVybiAhKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgYWRkciktPnNpbl9wb3J0OworCXJldHVybiAhY21hX3BvcnQoYWRkcik7CiB9CiAKIHN0YXRpYyBpbnQgY21hX2dldF9uZXRfaW5mbyh2b2lkICpoZHIsIGVudW0gcmRtYV9wb3J0X3NwYWNlIHBzLApAQCAtNTkzLDIwICs2MDEsNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBjbWFfbm90aWZ5X3VzZXIoc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdiwKLQkJCSAgIGVudW0gcmRtYV9jbV9ldmVudF90eXBlIHR5cGUsIGludCBzdGF0dXMsCi0JCQkgICB2b2lkICpkYXRhLCB1OCBkYXRhX2xlbikKLXsKLQlzdHJ1Y3QgcmRtYV9jbV9ldmVudCBldmVudDsKLQotCWV2ZW50LmV2ZW50ID0gdHlwZTsKLQlldmVudC5zdGF0dXMgPSBzdGF0dXM7Ci0JZXZlbnQucHJpdmF0ZV9kYXRhID0gZGF0YTsKLQlldmVudC5wcml2YXRlX2RhdGFfbGVuID0gZGF0YV9sZW47Ci0KLQlyZXR1cm4gaWRfcHJpdi0+aWQuZXZlbnRfaGFuZGxlcigmaWRfcHJpdi0+aWQsICZldmVudCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGNtYV9jYW5jZWxfcm91dGUoc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdikKIHsKIAlzd2l0Y2ggKHJkbWFfbm9kZV9nZXRfdHJhbnNwb3J0KGlkX3ByaXYtPmlkLmRldmljZS0+bm9kZV90eXBlKSkgewpAQCAtNzc1LDYzICs3NjksNjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjbWFfcnR1X3JlY3Yoc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdikKK3N0YXRpYyB2b2lkIGNtYV9zZXRfcmVwX2V2ZW50X2RhdGEoc3RydWN0IHJkbWFfY21fZXZlbnQgKmV2ZW50LAorCQkJCSAgIHN0cnVjdCBpYl9jbV9yZXBfZXZlbnRfcGFyYW0gKnJlcF9kYXRhLAorCQkJCSAgIHZvaWQgKnByaXZhdGVfZGF0YSkKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY21hX21vZGlmeV9xcF9ydHMoJmlkX3ByaXYtPmlkKTsKLQlpZiAocmV0KQotCQlnb3RvIHJlamVjdDsKLQotCXJldHVybiAwOwotcmVqZWN0OgotCWNtYV9tb2RpZnlfcXBfZXJyKCZpZF9wcml2LT5pZCk7Ci0JaWJfc2VuZF9jbV9yZWooaWRfcHJpdi0+Y21faWQuaWIsIElCX0NNX1JFSl9DT05TVU1FUl9ERUZJTkVELAotCQkgICAgICAgTlVMTCwgMCwgTlVMTCwgMCk7Ci0JcmV0dXJuIHJldDsKKwlldmVudC0+cGFyYW0uY29ubi5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7CisJZXZlbnQtPnBhcmFtLmNvbm4ucHJpdmF0ZV9kYXRhX2xlbiA9IElCX0NNX1JFUF9QUklWQVRFX0RBVEFfU0laRTsKKwlldmVudC0+cGFyYW0uY29ubi5yZXNwb25kZXJfcmVzb3VyY2VzID0gcmVwX2RhdGEtPnJlc3BvbmRlcl9yZXNvdXJjZXM7CisJZXZlbnQtPnBhcmFtLmNvbm4uaW5pdGlhdG9yX2RlcHRoID0gcmVwX2RhdGEtPmluaXRpYXRvcl9kZXB0aDsKKwlldmVudC0+cGFyYW0uY29ubi5mbG93X2NvbnRyb2wgPSByZXBfZGF0YS0+Zmxvd19jb250cm9sOworCWV2ZW50LT5wYXJhbS5jb25uLnJucl9yZXRyeV9jb3VudCA9IHJlcF9kYXRhLT5ybnJfcmV0cnlfY291bnQ7CisJZXZlbnQtPnBhcmFtLmNvbm4uc3JxID0gcmVwX2RhdGEtPnNycTsKKwlldmVudC0+cGFyYW0uY29ubi5xcF9udW0gPSByZXBfZGF0YS0+cmVtb3RlX3FwbjsKIH0KIAogc3RhdGljIGludCBjbWFfaWJfaGFuZGxlcihzdHJ1Y3QgaWJfY21faWQgKmNtX2lkLCBzdHJ1Y3QgaWJfY21fZXZlbnQgKmliX2V2ZW50KQogewogCXN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXYgPSBjbV9pZC0+Y29udGV4dDsKLQllbnVtIHJkbWFfY21fZXZlbnRfdHlwZSBldmVudDsKLQl1OCBwcml2YXRlX2RhdGFfbGVuID0gMDsKLQlpbnQgcmV0ID0gMCwgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcmRtYV9jbV9ldmVudCBldmVudDsKKwlpbnQgcmV0ID0gMDsKIAogCWF0b21pY19pbmMoJmlkX3ByaXYtPmRldl9yZW1vdmUpOwogCWlmICghY21hX2NvbXAoaWRfcHJpdiwgQ01BX0NPTk5FQ1QpKQogCQlnb3RvIG91dDsKIAorCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZiBldmVudCk7CiAJc3dpdGNoIChpYl9ldmVudC0+ZXZlbnQpIHsKIAljYXNlIElCX0NNX1JFUV9FUlJPUjoKIAljYXNlIElCX0NNX1JFUF9FUlJPUjoKLQkJZXZlbnQgPSBSRE1BX0NNX0VWRU5UX1VOUkVBQ0hBQkxFOwotCQlzdGF0dXMgPSAtRVRJTUVET1VUOworCQlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfVU5SRUFDSEFCTEU7CisJCWV2ZW50LnN0YXR1cyA9IC1FVElNRURPVVQ7CiAJCWJyZWFrOwogCWNhc2UgSUJfQ01fUkVQX1JFQ0VJVkVEOgotCQlzdGF0dXMgPSBjbWFfdmVyaWZ5X3JlcChpZF9wcml2LCBpYl9ldmVudC0+cHJpdmF0ZV9kYXRhKTsKLQkJaWYgKHN0YXR1cykKLQkJCWV2ZW50ID0gUkRNQV9DTV9FVkVOVF9DT05ORUNUX0VSUk9SOworCQlldmVudC5zdGF0dXMgPSBjbWFfdmVyaWZ5X3JlcChpZF9wcml2LCBpYl9ldmVudC0+cHJpdmF0ZV9kYXRhKTsKKwkJaWYgKGV2ZW50LnN0YXR1cykKKwkJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9DT05ORUNUX0VSUk9SOwogCQllbHNlIGlmIChpZF9wcml2LT5pZC5xcCAmJiBpZF9wcml2LT5pZC5wcyAhPSBSRE1BX1BTX1NEUCkgewotCQkJc3RhdHVzID0gY21hX3JlcF9yZWN2KGlkX3ByaXYpOwotCQkJZXZlbnQgPSBzdGF0dXMgPyBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfRVJST1IgOgotCQkJCQkgUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDsKKwkJCWV2ZW50LnN0YXR1cyA9IGNtYV9yZXBfcmVjdihpZF9wcml2KTsKKwkJCWV2ZW50LmV2ZW50ID0gZXZlbnQuc3RhdHVzID8gUkRNQV9DTV9FVkVOVF9DT05ORUNUX0VSUk9SIDoKKwkJCQkJCSAgICAgUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDsKIAkJfSBlbHNlCi0JCQlldmVudCA9IFJETUFfQ01fRVZFTlRfQ09OTkVDVF9SRVNQT05TRTsKLQkJcHJpdmF0ZV9kYXRhX2xlbiA9IElCX0NNX1JFUF9QUklWQVRFX0RBVEFfU0laRTsKKwkJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9DT05ORUNUX1JFU1BPTlNFOworCQljbWFfc2V0X3JlcF9ldmVudF9kYXRhKCZldmVudCwgJmliX2V2ZW50LT5wYXJhbS5yZXBfcmN2ZCwKKwkJCQkgICAgICAgaWJfZXZlbnQtPnByaXZhdGVfZGF0YSk7CiAJCWJyZWFrOwogCWNhc2UgSUJfQ01fUlRVX1JFQ0VJVkVEOgotCQlzdGF0dXMgPSBjbWFfcnR1X3JlY3YoaWRfcHJpdik7Ci0JCWV2ZW50ID0gc3RhdHVzID8gUkRNQV9DTV9FVkVOVF9DT05ORUNUX0VSUk9SIDoKLQkJCQkgUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDsKKwljYXNlIElCX0NNX1VTRVJfRVNUQUJMSVNIRUQ6CisJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDsKIAkJYnJlYWs7CiAJY2FzZSBJQl9DTV9EUkVRX0VSUk9SOgotCQlzdGF0dXMgPSAtRVRJTUVET1VUOyAvKiBmYWxsIHRocm91Z2ggKi8KKwkJZXZlbnQuc3RhdHVzID0gLUVUSU1FRE9VVDsgLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBJQl9DTV9EUkVRX1JFQ0VJVkVEOgogCWNhc2UgSUJfQ01fRFJFUF9SRUNFSVZFRDoKIAkJaWYgKCFjbWFfY29tcF9leGNoKGlkX3ByaXYsIENNQV9DT05ORUNULCBDTUFfRElTQ09OTkVDVCkpCiAJCQlnb3RvIG91dDsKLQkJZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0RJU0NPTk5FQ1RFRDsKKwkJZXZlbnQuZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0RJU0NPTk5FQ1RFRDsKIAkJYnJlYWs7CiAJY2FzZSBJQl9DTV9USU1FV0FJVF9FWElUOgogCWNhc2UgSUJfQ01fTVJBX1JFQ0VJVkVEOgpAQCAtODM5LDkgKzgzMSwxMCBAQAogCQlnb3RvIG91dDsKIAljYXNlIElCX0NNX1JFSl9SRUNFSVZFRDoKIAkJY21hX21vZGlmeV9xcF9lcnIoJmlkX3ByaXYtPmlkKTsKLQkJc3RhdHVzID0gaWJfZXZlbnQtPnBhcmFtLnJlal9yY3ZkLnJlYXNvbjsKLQkJZXZlbnQgPSBSRE1BX0NNX0VWRU5UX1JFSkVDVEVEOwotCQlwcml2YXRlX2RhdGFfbGVuID0gSUJfQ01fUkVKX1BSSVZBVEVfREFUQV9TSVpFOworCQlldmVudC5zdGF0dXMgPSBpYl9ldmVudC0+cGFyYW0ucmVqX3JjdmQucmVhc29uOworCQlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfUkVKRUNURUQ7CisJCWV2ZW50LnBhcmFtLmNvbm4ucHJpdmF0ZV9kYXRhID0gaWJfZXZlbnQtPnByaXZhdGVfZGF0YTsKKwkJZXZlbnQucGFyYW0uY29ubi5wcml2YXRlX2RhdGFfbGVuID0gSUJfQ01fUkVKX1BSSVZBVEVfREFUQV9TSVpFOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIlJETUEgQ01BOiB1bmV4cGVjdGVkIElCIENNIGV2ZW50OiAlZCIsCkBAIC04NDksOCArODQyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gY21hX25vdGlmeV91c2VyKGlkX3ByaXYsIGV2ZW50LCBzdGF0dXMsIGliX2V2ZW50LT5wcml2YXRlX2RhdGEsCi0JCQkgICAgICBwcml2YXRlX2RhdGFfbGVuKTsKKwlyZXQgPSBpZF9wcml2LT5pZC5ldmVudF9oYW5kbGVyKCZpZF9wcml2LT5pZCwgJmV2ZW50KTsKIAlpZiAocmV0KSB7CiAJCS8qIERlc3Ryb3kgdGhlIENNIElEIGJ5IHJldHVybmluZyBhIG5vbi16ZXJvIHZhbHVlLiAqLwogCQlpZF9wcml2LT5jbV9pZC5pYiA9IE5VTEw7CkBAIC04NjQsOCArODU2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqY21hX25ld19pZChzdHJ1Y3QgcmRtYV9jbV9pZCAqbGlzdGVuX2lkLAotCQkJCQkgIHN0cnVjdCBpYl9jbV9ldmVudCAqaWJfZXZlbnQpCitzdGF0aWMgc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqY21hX25ld19jb25uX2lkKHN0cnVjdCByZG1hX2NtX2lkICpsaXN0ZW5faWQsCisJCQkJCSAgICAgICBzdHJ1Y3QgaWJfY21fZXZlbnQgKmliX2V2ZW50KQogewogCXN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXY7CiAJc3RydWN0IHJkbWFfY21faWQgKmlkOwpAQCAtOTEyLDkgKzkwNCw2MSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqY21hX25ld191ZHBfaWQoc3RydWN0IHJkbWFfY21faWQgKmxpc3Rlbl9pZCwKKwkJCQkJICAgICAgc3RydWN0IGliX2NtX2V2ZW50ICppYl9ldmVudCkKK3sKKwlzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICppZF9wcml2OworCXN0cnVjdCByZG1hX2NtX2lkICppZDsKKwl1bmlvbiBjbWFfaXBfYWRkciAqc3JjLCAqZHN0OworCV9fdTE2IHBvcnQ7CisJdTggaXBfdmVyOworCWludCByZXQ7CisKKwlpZCA9IHJkbWFfY3JlYXRlX2lkKGxpc3Rlbl9pZC0+ZXZlbnRfaGFuZGxlciwgbGlzdGVuX2lkLT5jb250ZXh0LAorCQkJICAgIGxpc3Rlbl9pZC0+cHMpOworCWlmIChJU19FUlIoaWQpKQorCQlyZXR1cm4gTlVMTDsKKworCisJaWYgKGNtYV9nZXRfbmV0X2luZm8oaWJfZXZlbnQtPnByaXZhdGVfZGF0YSwgbGlzdGVuX2lkLT5wcywKKwkJCSAgICAgJmlwX3ZlciwgJnBvcnQsICZzcmMsICZkc3QpKQorCQlnb3RvIGVycjsKKworCWNtYV9zYXZlX25ldF9pbmZvKCZpZC0+cm91dGUuYWRkciwgJmxpc3Rlbl9pZC0+cm91dGUuYWRkciwKKwkJCSAgaXBfdmVyLCBwb3J0LCBzcmMsIGRzdCk7CisKKwlyZXQgPSByZG1hX3RyYW5zbGF0ZV9pcCgmaWQtPnJvdXRlLmFkZHIuc3JjX2FkZHIsCisJCQkJJmlkLT5yb3V0ZS5hZGRyLmRldl9hZGRyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWlkX3ByaXYgPSBjb250YWluZXJfb2YoaWQsIHN0cnVjdCByZG1hX2lkX3ByaXZhdGUsIGlkKTsKKwlpZF9wcml2LT5zdGF0ZSA9IENNQV9DT05ORUNUOworCXJldHVybiBpZF9wcml2OworZXJyOgorCXJkbWFfZGVzdHJveV9pZChpZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNtYV9zZXRfcmVxX2V2ZW50X2RhdGEoc3RydWN0IHJkbWFfY21fZXZlbnQgKmV2ZW50LAorCQkJCSAgIHN0cnVjdCBpYl9jbV9yZXFfZXZlbnRfcGFyYW0gKnJlcV9kYXRhLAorCQkJCSAgIHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IG9mZnNldCkKK3sKKwlldmVudC0+cGFyYW0uY29ubi5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGEgKyBvZmZzZXQ7CisJZXZlbnQtPnBhcmFtLmNvbm4ucHJpdmF0ZV9kYXRhX2xlbiA9IElCX0NNX1JFUV9QUklWQVRFX0RBVEFfU0laRSAtIG9mZnNldDsKKwlldmVudC0+cGFyYW0uY29ubi5yZXNwb25kZXJfcmVzb3VyY2VzID0gcmVxX2RhdGEtPnJlc3BvbmRlcl9yZXNvdXJjZXM7CisJZXZlbnQtPnBhcmFtLmNvbm4uaW5pdGlhdG9yX2RlcHRoID0gcmVxX2RhdGEtPmluaXRpYXRvcl9kZXB0aDsKKwlldmVudC0+cGFyYW0uY29ubi5mbG93X2NvbnRyb2wgPSByZXFfZGF0YS0+Zmxvd19jb250cm9sOworCWV2ZW50LT5wYXJhbS5jb25uLnJldHJ5X2NvdW50ID0gcmVxX2RhdGEtPnJldHJ5X2NvdW50OworCWV2ZW50LT5wYXJhbS5jb25uLnJucl9yZXRyeV9jb3VudCA9IHJlcV9kYXRhLT5ybnJfcmV0cnlfY291bnQ7CisJZXZlbnQtPnBhcmFtLmNvbm4uc3JxID0gcmVxX2RhdGEtPnNycTsKKwlldmVudC0+cGFyYW0uY29ubi5xcF9udW0gPSByZXFfZGF0YS0+cmVtb3RlX3FwbjsKK30KKwogc3RhdGljIGludCBjbWFfcmVxX2hhbmRsZXIoc3RydWN0IGliX2NtX2lkICpjbV9pZCwgc3RydWN0IGliX2NtX2V2ZW50ICppYl9ldmVudCkKIHsKIAlzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICpsaXN0ZW5faWQsICpjb25uX2lkOworCXN0cnVjdCByZG1hX2NtX2V2ZW50IGV2ZW50OwogCWludCBvZmZzZXQsIHJldDsKIAogCWxpc3Rlbl9pZCA9IGNtX2lkLT5jb250ZXh0OwpAQCAtOTI0LDcgKzk2OCwxOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQljb25uX2lkID0gY21hX25ld19pZCgmbGlzdGVuX2lkLT5pZCwgaWJfZXZlbnQpOworCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZiBldmVudCk7CisJb2Zmc2V0ID0gY21hX3VzZXJfZGF0YV9vZmZzZXQobGlzdGVuX2lkLT5pZC5wcyk7CisJZXZlbnQuZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVDsKKwlpZiAobGlzdGVuX2lkLT5pZC5wcyA9PSBSRE1BX1BTX1VEUCkgeworCQljb25uX2lkID0gY21hX25ld191ZHBfaWQoJmxpc3Rlbl9pZC0+aWQsIGliX2V2ZW50KTsKKwkJZXZlbnQucGFyYW0udWQucHJpdmF0ZV9kYXRhID0gaWJfZXZlbnQtPnByaXZhdGVfZGF0YSArIG9mZnNldDsKKwkJZXZlbnQucGFyYW0udWQucHJpdmF0ZV9kYXRhX2xlbiA9CisJCQkJSUJfQ01fU0lEUl9SRVFfUFJJVkFURV9EQVRBX1NJWkUgLSBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJY29ubl9pZCA9IGNtYV9uZXdfY29ubl9pZCgmbGlzdGVuX2lkLT5pZCwgaWJfZXZlbnQpOworCQljbWFfc2V0X3JlcV9ldmVudF9kYXRhKCZldmVudCwgJmliX2V2ZW50LT5wYXJhbS5yZXFfcmN2ZCwKKwkJCQkgICAgICAgaWJfZXZlbnQtPnByaXZhdGVfZGF0YSwgb2Zmc2V0KTsKKwl9CiAJaWYgKCFjb25uX2lkKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtOTM0LDI5ICs5OTAsMjUgQEAKIAltdXRleF9sb2NrKCZsb2NrKTsKIAlyZXQgPSBjbWFfYWNxdWlyZV9kZXYoY29ubl9pZCk7CiAJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWNtYV9leGNoKGNvbm5faWQsIENNQV9ERVNUUk9ZSU5HKTsKLQkJY21hX3JlbGVhc2VfcmVtb3ZlKGNvbm5faWQpOwotCQlyZG1hX2Rlc3Ryb3lfaWQoJmNvbm5faWQtPmlkKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChyZXQpCisJCWdvdG8gcmVsZWFzZV9jb25uX2lkOwogCiAJY29ubl9pZC0+Y21faWQuaWIgPSBjbV9pZDsKIAljbV9pZC0+Y29udGV4dCA9IGNvbm5faWQ7CiAJY21faWQtPmNtX2hhbmRsZXIgPSBjbWFfaWJfaGFuZGxlcjsKIAotCW9mZnNldCA9IGNtYV91c2VyX2RhdGFfb2Zmc2V0KGxpc3Rlbl9pZC0+aWQucHMpOwotCXJldCA9IGNtYV9ub3RpZnlfdXNlcihjb25uX2lkLCBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVCwgMCwKLQkJCSAgICAgIGliX2V2ZW50LT5wcml2YXRlX2RhdGEgKyBvZmZzZXQsCi0JCQkgICAgICBJQl9DTV9SRVFfUFJJVkFURV9EQVRBX1NJWkUgLSBvZmZzZXQpOwotCWlmIChyZXQpIHsKLQkJLyogRGVzdHJveSB0aGUgQ00gSUQgYnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUuICovCi0JCWNvbm5faWQtPmNtX2lkLmliID0gTlVMTDsKLQkJY21hX2V4Y2goY29ubl9pZCwgQ01BX0RFU1RST1lJTkcpOwotCQljbWFfcmVsZWFzZV9yZW1vdmUoY29ubl9pZCk7Ci0JCXJkbWFfZGVzdHJveV9pZCgmY29ubl9pZC0+aWQpOwotCX0KKwlyZXQgPSBjb25uX2lkLT5pZC5ldmVudF9oYW5kbGVyKCZjb25uX2lkLT5pZCwgJmV2ZW50KTsKKwlpZiAoIXJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBEZXN0cm95IHRoZSBDTSBJRCBieSByZXR1cm5pbmcgYSBub24temVybyB2YWx1ZS4gKi8KKwljb25uX2lkLT5jbV9pZC5pYiA9IE5VTEw7CisKK3JlbGVhc2VfY29ubl9pZDoKKwljbWFfZXhjaChjb25uX2lkLCBDTUFfREVTVFJPWUlORyk7CisJY21hX3JlbGVhc2VfcmVtb3ZlKGNvbm5faWQpOworCXJkbWFfZGVzdHJveV9pZCgmY29ubl9pZC0+aWQpOworCiBvdXQ6CiAJY21hX3JlbGVhc2VfcmVtb3ZlKGxpc3Rlbl9pZCk7CiAJcmV0dXJuIHJldDsKQEAgLTk2NCw4ICsxMDE2LDcgQEAKIAogc3RhdGljIF9fYmU2NCBjbWFfZ2V0X3NlcnZpY2VfaWQoZW51bSByZG1hX3BvcnRfc3BhY2UgcHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkcikKIHsKLQlyZXR1cm4gY3B1X3RvX2JlNjQoKCh1NjQpcHMgPDwgMTYpICsKLQkgICAgICAgYmUxNl90b19jcHUoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgYWRkciktPnNpbl9wb3J0KSk7CisJcmV0dXJuIGNwdV90b19iZTY0KCgodTY0KXBzIDw8IDE2KSArIGJlMTZfdG9fY3B1KGNtYV9wb3J0KGFkZHIpKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNtYV9zZXRfY29tcGFyZV9kYXRhKGVudW0gcmRtYV9wb3J0X3NwYWNlIHBzLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCkBAIC0xMDIxLDE1ICsxMDcyLDE2IEBACiBzdGF0aWMgaW50IGNtYV9pd19oYW5kbGVyKHN0cnVjdCBpd19jbV9pZCAqaXdfaWQsIHN0cnVjdCBpd19jbV9ldmVudCAqaXdfZXZlbnQpCiB7CiAJc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdiA9IGl3X2lkLT5jb250ZXh0OwotCWVudW0gcmRtYV9jbV9ldmVudF90eXBlIGV2ZW50ID0gMDsKKwlzdHJ1Y3QgcmRtYV9jbV9ldmVudCBldmVudDsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKIAlpbnQgcmV0ID0gMDsKIAorCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZiBldmVudCk7CiAJYXRvbWljX2luYygmaWRfcHJpdi0+ZGV2X3JlbW92ZSk7CiAKIAlzd2l0Y2ggKGl3X2V2ZW50LT5ldmVudCkgewogCWNhc2UgSVdfQ01fRVZFTlRfQ0xPU0U6Ci0JCWV2ZW50ID0gUkRNQV9DTV9FVkVOVF9ESVNDT05ORUNURUQ7CisJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9ESVNDT05ORUNURUQ7CiAJCWJyZWFrOwogCWNhc2UgSVdfQ01fRVZFTlRfQ09OTkVDVF9SRVBMWToKIAkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmaWRfcHJpdi0+aWQucm91dGUuYWRkci5zcmNfYWRkcjsKQEAgLTEwMzcsMjAgKzEwODksMjEgQEAKIAkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmaWRfcHJpdi0+aWQucm91dGUuYWRkci5kc3RfYWRkcjsKIAkJKnNpbiA9IGl3X2V2ZW50LT5yZW1vdGVfYWRkcjsKIAkJaWYgKGl3X2V2ZW50LT5zdGF0dXMpCi0JCQlldmVudCA9IFJETUFfQ01fRVZFTlRfUkVKRUNURUQ7CisJCQlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfUkVKRUNURUQ7CiAJCWVsc2UKLQkJCWV2ZW50ID0gUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDsKKwkJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9FU1RBQkxJU0hFRDsKIAkJYnJlYWs7CiAJY2FzZSBJV19DTV9FVkVOVF9FU1RBQkxJU0hFRDoKLQkJZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0VTVEFCTElTSEVEOworCQlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfRVNUQUJMSVNIRUQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVR19PTigxKTsKIAl9CiAKLQlyZXQgPSBjbWFfbm90aWZ5X3VzZXIoaWRfcHJpdiwgZXZlbnQsIGl3X2V2ZW50LT5zdGF0dXMsCi0JCQkgICAgICBpd19ldmVudC0+cHJpdmF0ZV9kYXRhLAotCQkJICAgICAgaXdfZXZlbnQtPnByaXZhdGVfZGF0YV9sZW4pOworCWV2ZW50LnN0YXR1cyA9IGl3X2V2ZW50LT5zdGF0dXM7CisJZXZlbnQucGFyYW0uY29ubi5wcml2YXRlX2RhdGEgPSBpd19ldmVudC0+cHJpdmF0ZV9kYXRhOworCWV2ZW50LnBhcmFtLmNvbm4ucHJpdmF0ZV9kYXRhX2xlbiA9IGl3X2V2ZW50LT5wcml2YXRlX2RhdGFfbGVuOworCXJldCA9IGlkX3ByaXYtPmlkLmV2ZW50X2hhbmRsZXIoJmlkX3ByaXYtPmlkLCAmZXZlbnQpOwogCWlmIChyZXQpIHsKIAkJLyogRGVzdHJveSB0aGUgQ00gSUQgYnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUuICovCiAJCWlkX3ByaXYtPmNtX2lkLml3ID0gTlVMTDsKQEAgLTEwNzEsNiArMTEyNCw3IEBACiAJc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqbGlzdGVuX2lkLCAqY29ubl9pZDsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcmRtYV9jbV9ldmVudCBldmVudDsKIAlpbnQgcmV0OwogCiAJbGlzdGVuX2lkID0gY21faWQtPmNvbnRleHQ7CkBAIC0xMTI0LDkgKzExNzgsMTEgQEAKIAlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZuZXdfY21faWQtPnJvdXRlLmFkZHIuZHN0X2FkZHI7CiAJKnNpbiA9IGl3X2V2ZW50LT5yZW1vdGVfYWRkcjsKIAotCXJldCA9IGNtYV9ub3RpZnlfdXNlcihjb25uX2lkLCBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVCwgMCwKLQkJCSAgICAgIGl3X2V2ZW50LT5wcml2YXRlX2RhdGEsCi0JCQkgICAgICBpd19ldmVudC0+cHJpdmF0ZV9kYXRhX2xlbik7CisJbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mIGV2ZW50KTsKKwlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfQ09OTkVDVF9SRVFVRVNUOworCWV2ZW50LnBhcmFtLmNvbm4ucHJpdmF0ZV9kYXRhID0gaXdfZXZlbnQtPnByaXZhdGVfZGF0YTsKKwlldmVudC5wYXJhbS5jb25uLnByaXZhdGVfZGF0YV9sZW4gPSBpd19ldmVudC0+cHJpdmF0ZV9kYXRhX2xlbjsKKwlyZXQgPSBjb25uX2lkLT5pZC5ldmVudF9oYW5kbGVyKCZjb25uX2lkLT5pZCwgJmV2ZW50KTsKIAlpZiAocmV0KSB7CiAJCS8qIFVzZXIgd2FudHMgdG8gZGVzdHJveSB0aGUgQ00gSUQgKi8KIAkJY29ubl9pZC0+Y21faWQuaXcgPSBOVUxMOwpAQCAtMTM0MCw5ICsxMzk2LDkgQEAKIAlyZXR1cm4gKGlkX3ByaXYtPnF1ZXJ5X2lkIDwgMCkgPyBpZF9wcml2LT5xdWVyeV9pZCA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNtYV93b3JrX2hhbmRsZXIodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGNtYV93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICpfd29yaykKIHsKLQlzdHJ1Y3QgY21hX3dvcmsgKndvcmsgPSBkYXRhOworCXN0cnVjdCBjbWFfd29yayAqd29yayA9IGNvbnRhaW5lcl9vZihfd29yaywgc3RydWN0IGNtYV93b3JrLCB3b3JrKTsKIAlzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICppZF9wcml2ID0gd29yay0+aWQ7CiAJaW50IGRlc3Ryb3kgPSAwOwogCkBAIC0xMzczLDcgKzE0MjksNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXdvcmstPmlkID0gaWRfcHJpdjsKLQlJTklUX1dPUksoJndvcmstPndvcmssIGNtYV93b3JrX2hhbmRsZXIsIHdvcmspOworCUlOSVRfV09SSygmd29yay0+d29yaywgY21hX3dvcmtfaGFuZGxlcik7CiAJd29yay0+b2xkX3N0YXRlID0gQ01BX1JPVVRFX1FVRVJZOwogCXdvcmstPm5ld19zdGF0ZSA9IENNQV9ST1VURV9SRVNPTFZFRDsKIAl3b3JrLT5ldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfUk9VVEVfUkVTT0xWRUQ7CkBAIC0xNDMwLDcgKzE0ODYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXdvcmstPmlkID0gaWRfcHJpdjsKLQlJTklUX1dPUksoJndvcmstPndvcmssIGNtYV93b3JrX2hhbmRsZXIsIHdvcmspOworCUlOSVRfV09SSygmd29yay0+d29yaywgY21hX3dvcmtfaGFuZGxlcik7CiAJd29yay0+b2xkX3N0YXRlID0gQ01BX1JPVVRFX1FVRVJZOwogCXdvcmstPm5ld19zdGF0ZSA9IENNQV9ST1VURV9SRVNPTFZFRDsKIAl3b3JrLT5ldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfUk9VVEVfUkVTT0xWRUQ7CkBAIC0xNDgwLDE5ICsxNTM2LDE4IEBACiAJdTggcDsKIAogCW11dGV4X2xvY2soJmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY21hX2RldiwgJmRldl9saXN0LCBsaXN0KQotCQlmb3IgKHAgPSAxOyBwIDw9IGNtYV9kZXYtPmRldmljZS0+cGh5c19wb3J0X2NudDsgKytwKQotCQkJaWYgKCFpYl9xdWVyeV9wb3J0IChjbWFfZGV2LT5kZXZpY2UsIHAsICZwb3J0X2F0dHIpICYmCi0JCQkgICAgcG9ydF9hdHRyLnN0YXRlID09IElCX1BPUlRfQUNUSVZFKQotCQkJCWdvdG8gcG9ydF9mb3VuZDsKLQotCWlmICghbGlzdF9lbXB0eSgmZGV2X2xpc3QpKSB7Ci0JCXAgPSAxOwotCQljbWFfZGV2ID0gbGlzdF9lbnRyeShkZXZfbGlzdC5uZXh0LCBzdHJ1Y3QgY21hX2RldmljZSwgbGlzdCk7Ci0JfSBlbHNlIHsKKwlpZiAobGlzdF9lbXB0eSgmZGV2X2xpc3QpKSB7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtYV9kZXYsICZkZXZfbGlzdCwgbGlzdCkKKwkJZm9yIChwID0gMTsgcCA8PSBjbWFfZGV2LT5kZXZpY2UtPnBoeXNfcG9ydF9jbnQ7ICsrcCkKKwkJCWlmICghaWJfcXVlcnlfcG9ydChjbWFfZGV2LT5kZXZpY2UsIHAsICZwb3J0X2F0dHIpICYmCisJCQkgICAgcG9ydF9hdHRyLnN0YXRlID09IElCX1BPUlRfQUNUSVZFKQorCQkJCWdvdG8gcG9ydF9mb3VuZDsKKworCXAgPSAxOworCWNtYV9kZXYgPSBsaXN0X2VudHJ5KGRldl9saXN0Lm5leHQsIHN0cnVjdCBjbWFfZGV2aWNlLCBsaXN0KTsKIAogcG9ydF9mb3VuZDoKIAlyZXQgPSBpYl9nZXRfY2FjaGVkX2dpZChjbWFfZGV2LT5kZXZpY2UsIHAsIDAsICZnaWQpOwpAQCAtMTUxNiw4ICsxNTcxLDkgQEAKIAkJCSBzdHJ1Y3QgcmRtYV9kZXZfYWRkciAqZGV2X2FkZHIsIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdiA9IGNvbnRleHQ7Ci0JZW51bSByZG1hX2NtX2V2ZW50X3R5cGUgZXZlbnQ7CisJc3RydWN0IHJkbWFfY21fZXZlbnQgZXZlbnQ7CiAKKwltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YgZXZlbnQpOwogCWF0b21pY19pbmMoJmlkX3ByaXYtPmRldl9yZW1vdmUpOwogCiAJLyoKQEAgLTE1MzcsMTQgKzE1OTMsMTUgQEAKIAlpZiAoc3RhdHVzKSB7CiAJCWlmICghY21hX2NvbXBfZXhjaChpZF9wcml2LCBDTUFfQUREUl9SRVNPTFZFRCwgQ01BX0FERFJfQk9VTkQpKQogCQkJZ290byBvdXQ7Ci0JCWV2ZW50ID0gUkRNQV9DTV9FVkVOVF9BRERSX0VSUk9SOworCQlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfQUREUl9FUlJPUjsKKwkJZXZlbnQuc3RhdHVzID0gc3RhdHVzOwogCX0gZWxzZSB7CiAJCW1lbWNweSgmaWRfcHJpdi0+aWQucm91dGUuYWRkci5zcmNfYWRkciwgc3JjX2FkZHIsCiAJCSAgICAgICBpcF9hZGRyX3NpemUoc3JjX2FkZHIpKTsKLQkJZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0FERFJfUkVTT0xWRUQ7CisJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9BRERSX1JFU09MVkVEOwogCX0KIAotCWlmIChjbWFfbm90aWZ5X3VzZXIoaWRfcHJpdiwgZXZlbnQsIHN0YXR1cywgTlVMTCwgMCkpIHsKKwlpZiAoaWRfcHJpdi0+aWQuZXZlbnRfaGFuZGxlcigmaWRfcHJpdi0+aWQsICZldmVudCkpIHsKIAkJY21hX2V4Y2goaWRfcHJpdiwgQ01BX0RFU1RST1lJTkcpOwogCQljbWFfcmVsZWFzZV9yZW1vdmUoaWRfcHJpdik7CiAJCWNtYV9kZXJlZl9pZChpZF9wcml2KTsKQEAgLTE1ODQsNyArMTY0MSw3IEBACiAJfQogCiAJd29yay0+aWQgPSBpZF9wcml2OwotCUlOSVRfV09SSygmd29yay0+d29yaywgY21hX3dvcmtfaGFuZGxlciwgd29yayk7CisJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBjbWFfd29ya19oYW5kbGVyKTsKIAl3b3JrLT5vbGRfc3RhdGUgPSBDTUFfQUREUl9RVUVSWTsKIAl3b3JrLT5uZXdfc3RhdGUgPSBDTUFfQUREUl9SRVNPTFZFRDsKIAl3b3JrLT5ldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfQUREUl9SRVNPTFZFRDsKQEAgLTE2MjUsOCArMTY4Miw4IEBACiAJaWYgKGNtYV9hbnlfYWRkcihkc3RfYWRkcikpCiAJCXJldCA9IGNtYV9yZXNvbHZlX2xvb3BiYWNrKGlkX3ByaXYpOwogCWVsc2UKLQkJcmV0ID0gcmRtYV9yZXNvbHZlX2lwKCZpZC0+cm91dGUuYWRkci5zcmNfYWRkciwgZHN0X2FkZHIsCi0JCQkJICAgICAgJmlkLT5yb3V0ZS5hZGRyLmRldl9hZGRyLAorCQlyZXQgPSByZG1hX3Jlc29sdmVfaXAoJmFkZHJfY2xpZW50LCAmaWQtPnJvdXRlLmFkZHIuc3JjX2FkZHIsCisJCQkJICAgICAgZHN0X2FkZHIsICZpZC0+cm91dGUuYWRkci5kZXZfYWRkciwKIAkJCQkgICAgICB0aW1lb3V0X21zLCBhZGRyX2hhbmRsZXIsIGlkX3ByaXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwpAQCAtMTczNCw2ICsxNzkxLDkgQEAKIAljYXNlIFJETUFfUFNfVENQOgogCQlwcyA9ICZ0Y3BfcHM7CiAJCWJyZWFrOworCWNhc2UgUkRNQV9QU19VRFA6CisJCXBzID0gJnVkcF9wczsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiAJfQpAQCAtMTc2MiwyMiArMTgyMiwyOSBAQAogCiAJaWYgKCFjbWFfYW55X2FkZHIoYWRkcikpIHsKIAkJcmV0ID0gcmRtYV90cmFuc2xhdGVfaXAoYWRkciwgJmlkLT5yb3V0ZS5hZGRyLmRldl9hZGRyKTsKLQkJaWYgKCFyZXQpIHsKLQkJCW11dGV4X2xvY2soJmxvY2spOwotCQkJcmV0ID0gY21hX2FjcXVpcmVfZGV2KGlkX3ByaXYpOwotCQkJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKLQkJfQogCQlpZiAocmV0KQotCQkJZ290byBlcnI7CisJCQlnb3RvIGVycjE7CisKKwkJbXV0ZXhfbG9jaygmbG9jayk7CisJCXJldCA9IGNtYV9hY3F1aXJlX2RldihpZF9wcml2KTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyMTsKIAl9CiAKIAltZW1jcHkoJmlkLT5yb3V0ZS5hZGRyLnNyY19hZGRyLCBhZGRyLCBpcF9hZGRyX3NpemUoYWRkcikpOwogCXJldCA9IGNtYV9nZXRfcG9ydChpZF9wcml2KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycjsKKwkJZ290byBlcnIyOwogCiAJcmV0dXJuIDA7Ci1lcnI6CitlcnIyOgorCWlmICghY21hX2FueV9hZGRyKGFkZHIpKSB7CisJCW11dGV4X2xvY2soJmxvY2spOworCQljbWFfZGV0YWNoX2Zyb21fZGV2KGlkX3ByaXYpOworCQltdXRleF91bmxvY2soJmxvY2spOworCX0KK2VycjE6CiAJY21hX2NvbXBfZXhjaChpZF9wcml2LCBDTUFfQUREUl9CT1VORCwgQ01BX0lETEUpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xODE1LDYgKzE4ODIsMTEwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY21hX3NpZHJfcmVwX2hhbmRsZXIoc3RydWN0IGliX2NtX2lkICpjbV9pZCwKKwkJCQlzdHJ1Y3QgaWJfY21fZXZlbnQgKmliX2V2ZW50KQoreworCXN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXYgPSBjbV9pZC0+Y29udGV4dDsKKwlzdHJ1Y3QgcmRtYV9jbV9ldmVudCBldmVudDsKKwlzdHJ1Y3QgaWJfY21fc2lkcl9yZXBfZXZlbnRfcGFyYW0gKnJlcCA9ICZpYl9ldmVudC0+cGFyYW0uc2lkcl9yZXBfcmN2ZDsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZiBldmVudCk7CisJYXRvbWljX2luYygmaWRfcHJpdi0+ZGV2X3JlbW92ZSk7CisJaWYgKCFjbWFfY29tcChpZF9wcml2LCBDTUFfQ09OTkVDVCkpCisJCWdvdG8gb3V0OworCisJc3dpdGNoIChpYl9ldmVudC0+ZXZlbnQpIHsKKwljYXNlIElCX0NNX1NJRFJfUkVRX0VSUk9SOgorCQlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfVU5SRUFDSEFCTEU7CisJCWV2ZW50LnN0YXR1cyA9IC1FVElNRURPVVQ7CisJCWJyZWFrOworCWNhc2UgSUJfQ01fU0lEUl9SRVBfUkVDRUlWRUQ6CisJCWV2ZW50LnBhcmFtLnVkLnByaXZhdGVfZGF0YSA9IGliX2V2ZW50LT5wcml2YXRlX2RhdGE7CisJCWV2ZW50LnBhcmFtLnVkLnByaXZhdGVfZGF0YV9sZW4gPSBJQl9DTV9TSURSX1JFUF9QUklWQVRFX0RBVEFfU0laRTsKKwkJaWYgKHJlcC0+c3RhdHVzICE9IElCX1NJRFJfU1VDQ0VTUykgeworCQkJZXZlbnQuZXZlbnQgPSBSRE1BX0NNX0VWRU5UX1VOUkVBQ0hBQkxFOworCQkJZXZlbnQuc3RhdHVzID0gaWJfZXZlbnQtPnBhcmFtLnNpZHJfcmVwX3JjdmQuc3RhdHVzOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlcC0+cWtleSAhPSBSRE1BX1VEX1FLRVkpIHsKKwkJCWV2ZW50LmV2ZW50ID0gUkRNQV9DTV9FVkVOVF9VTlJFQUNIQUJMRTsKKwkJCWV2ZW50LnN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpYl9pbml0X2FoX2Zyb21fcGF0aChpZF9wcml2LT5pZC5kZXZpY2UsIGlkX3ByaXYtPmlkLnBvcnRfbnVtLAorCQkJCSAgICAgaWRfcHJpdi0+aWQucm91dGUucGF0aF9yZWMsCisJCQkJICAgICAmZXZlbnQucGFyYW0udWQuYWhfYXR0cik7CisJCWV2ZW50LnBhcmFtLnVkLnFwX251bSA9IHJlcC0+cXBuOworCQlldmVudC5wYXJhbS51ZC5xa2V5ID0gcmVwLT5xa2V5OworCQlldmVudC5ldmVudCA9IFJETUFfQ01fRVZFTlRfRVNUQUJMSVNIRUQ7CisJCWV2ZW50LnN0YXR1cyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiUkRNQSBDTUE6IHVuZXhwZWN0ZWQgSUIgQ00gZXZlbnQ6ICVkIiwKKwkJICAgICAgIGliX2V2ZW50LT5ldmVudCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGlkX3ByaXYtPmlkLmV2ZW50X2hhbmRsZXIoJmlkX3ByaXYtPmlkLCAmZXZlbnQpOworCWlmIChyZXQpIHsKKwkJLyogRGVzdHJveSB0aGUgQ00gSUQgYnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUuICovCisJCWlkX3ByaXYtPmNtX2lkLmliID0gTlVMTDsKKwkJY21hX2V4Y2goaWRfcHJpdiwgQ01BX0RFU1RST1lJTkcpOworCQljbWFfcmVsZWFzZV9yZW1vdmUoaWRfcHJpdik7CisJCXJkbWFfZGVzdHJveV9pZCgmaWRfcHJpdi0+aWQpOworCQlyZXR1cm4gcmV0OworCX0KK291dDoKKwljbWFfcmVsZWFzZV9yZW1vdmUoaWRfcHJpdik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjbWFfcmVzb2x2ZV9pYl91ZHAoc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdiwKKwkJCSAgICAgIHN0cnVjdCByZG1hX2Nvbm5fcGFyYW0gKmNvbm5fcGFyYW0pCit7CisJc3RydWN0IGliX2NtX3NpZHJfcmVxX3BhcmFtIHJlcTsKKwlzdHJ1Y3QgcmRtYV9yb3V0ZSAqcm91dGU7CisJaW50IHJldDsKKworCXJlcS5wcml2YXRlX2RhdGFfbGVuID0gc2l6ZW9mKHN0cnVjdCBjbWFfaGRyKSArCisJCQkgICAgICAgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbjsKKwlyZXEucHJpdmF0ZV9kYXRhID0ga3phbGxvYyhyZXEucHJpdmF0ZV9kYXRhX2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFyZXEucHJpdmF0ZV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb25uX3BhcmFtLT5wcml2YXRlX2RhdGEgJiYgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbikKKwkJbWVtY3B5KCh2b2lkICopIHJlcS5wcml2YXRlX2RhdGEgKyBzaXplb2Yoc3RydWN0IGNtYV9oZHIpLAorCQkgICAgICAgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhLCBjb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKKworCXJvdXRlID0gJmlkX3ByaXYtPmlkLnJvdXRlOworCXJldCA9IGNtYV9mb3JtYXRfaGRyKCh2b2lkICopIHJlcS5wcml2YXRlX2RhdGEsIGlkX3ByaXYtPmlkLnBzLCByb3V0ZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZF9wcml2LT5jbV9pZC5pYiA9IGliX2NyZWF0ZV9jbV9pZChpZF9wcml2LT5pZC5kZXZpY2UsCisJCQkJCSAgICBjbWFfc2lkcl9yZXBfaGFuZGxlciwgaWRfcHJpdik7CisJaWYgKElTX0VSUihpZF9wcml2LT5jbV9pZC5pYikpIHsKKwkJcmV0ID0gUFRSX0VSUihpZF9wcml2LT5jbV9pZC5pYik7CisJCWdvdG8gb3V0OworCX0KKworCXJlcS5wYXRoID0gcm91dGUtPnBhdGhfcmVjOworCXJlcS5zZXJ2aWNlX2lkID0gY21hX2dldF9zZXJ2aWNlX2lkKGlkX3ByaXYtPmlkLnBzLAorCQkJCQkgICAgJnJvdXRlLT5hZGRyLmRzdF9hZGRyKTsKKwlyZXEudGltZW91dF9tcyA9IDEgPDwgKENNQV9DTV9SRVNQT05TRV9USU1FT1VUIC0gOCk7CisJcmVxLm1heF9jbV9yZXRyaWVzID0gQ01BX01BWF9DTV9SRVRSSUVTOworCisJcmV0ID0gaWJfc2VuZF9jbV9zaWRyX3JlcShpZF9wcml2LT5jbV9pZC5pYiwgJnJlcSk7CisJaWYgKHJldCkgeworCQlpYl9kZXN0cm95X2NtX2lkKGlkX3ByaXYtPmNtX2lkLmliKTsKKwkJaWRfcHJpdi0+Y21faWQuaWIgPSBOVUxMOworCX0KK291dDoKKwlrZnJlZShyZXEucHJpdmF0ZV9kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGNtYV9jb25uZWN0X2liKHN0cnVjdCByZG1hX2lkX3ByaXZhdGUgKmlkX3ByaXYsCiAJCQkgIHN0cnVjdCByZG1hX2Nvbm5fcGFyYW0gKmNvbm5fcGFyYW0pCiB7CkBAIC0xODU0LDcgKzIwMjUsNyBAQAogCXJlcS5zZXJ2aWNlX2lkID0gY21hX2dldF9zZXJ2aWNlX2lkKGlkX3ByaXYtPmlkLnBzLAogCQkJCQkgICAgJnJvdXRlLT5hZGRyLmRzdF9hZGRyKTsKIAlyZXEucXBfbnVtID0gaWRfcHJpdi0+cXBfbnVtOwotCXJlcS5xcF90eXBlID0gaWRfcHJpdi0+cXBfdHlwZTsKKwlyZXEucXBfdHlwZSA9IElCX1FQVF9SQzsKIAlyZXEuc3RhcnRpbmdfcHNuID0gaWRfcHJpdi0+c2VxX251bTsKIAlyZXEucmVzcG9uZGVyX3Jlc291cmNlcyA9IGNvbm5fcGFyYW0tPnJlc3BvbmRlcl9yZXNvdXJjZXM7CiAJcmVxLmluaXRpYXRvcl9kZXB0aCA9IGNvbm5fcGFyYW0tPmluaXRpYXRvcl9kZXB0aDsKQEAgLTE5MzEsMTMgKzIxMDIsMTUgQEAKIAogCWlmICghaWQtPnFwKSB7CiAJCWlkX3ByaXYtPnFwX251bSA9IGNvbm5fcGFyYW0tPnFwX251bTsKLQkJaWRfcHJpdi0+cXBfdHlwZSA9IGNvbm5fcGFyYW0tPnFwX3R5cGU7CiAJCWlkX3ByaXYtPnNycSA9IGNvbm5fcGFyYW0tPnNycTsKIAl9CiAKIAlzd2l0Y2ggKHJkbWFfbm9kZV9nZXRfdHJhbnNwb3J0KGlkLT5kZXZpY2UtPm5vZGVfdHlwZSkpIHsKIAljYXNlIFJETUFfVFJBTlNQT1JUX0lCOgotCQlyZXQgPSBjbWFfY29ubmVjdF9pYihpZF9wcml2LCBjb25uX3BhcmFtKTsKKwkJaWYgKGlkLT5wcyA9PSBSRE1BX1BTX1VEUCkKKwkJCXJldCA9IGNtYV9yZXNvbHZlX2liX3VkcChpZF9wcml2LCBjb25uX3BhcmFtKTsKKwkJZWxzZQorCQkJcmV0ID0gY21hX2Nvbm5lY3RfaWIoaWRfcHJpdiwgY29ubl9wYXJhbSk7CiAJCWJyZWFrOwogCWNhc2UgUkRNQV9UUkFOU1BPUlRfSVdBUlA6CiAJCXJldCA9IGNtYV9jb25uZWN0X2l3KGlkX3ByaXYsIGNvbm5fcGFyYW0pOwpAQCAtMTk2MCwxMSArMjEzMywyNSBAQAogCQkJIHN0cnVjdCByZG1hX2Nvbm5fcGFyYW0gKmNvbm5fcGFyYW0pCiB7CiAJc3RydWN0IGliX2NtX3JlcF9wYXJhbSByZXA7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgaWJfcXBfYXR0ciBxcF9hdHRyOworCWludCBxcF9hdHRyX21hc2ssIHJldDsKIAotCXJldCA9IGNtYV9tb2RpZnlfcXBfcnRyKCZpZF9wcml2LT5pZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAoaWRfcHJpdi0+aWQucXApIHsKKwkJcmV0ID0gY21hX21vZGlmeV9xcF9ydHIoJmlkX3ByaXYtPmlkKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXFwX2F0dHIucXBfc3RhdGUgPSBJQl9RUFNfUlRTOworCQlyZXQgPSBpYl9jbV9pbml0X3FwX2F0dHIoaWRfcHJpdi0+Y21faWQuaWIsICZxcF9hdHRyLAorCQkJCQkgJnFwX2F0dHJfbWFzayk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQlxcF9hdHRyLm1heF9yZF9hdG9taWMgPSBjb25uX3BhcmFtLT5pbml0aWF0b3JfZGVwdGg7CisJCXJldCA9IGliX21vZGlmeV9xcChpZF9wcml2LT5pZC5xcCwgJnFwX2F0dHIsIHFwX2F0dHJfbWFzayk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CiAKIAltZW1zZXQoJnJlcCwgMCwgc2l6ZW9mIHJlcCk7CiAJcmVwLnFwX251bSA9IGlkX3ByaXYtPnFwX251bTsKQEAgLTE5NzksNyArMjE2Niw5IEBACiAJcmVwLnJucl9yZXRyeV9jb3VudCA9IGNvbm5fcGFyYW0tPnJucl9yZXRyeV9jb3VudDsKIAlyZXAuc3JxID0gaWRfcHJpdi0+c3JxID8gMSA6IDA7CiAKLQlyZXR1cm4gaWJfc2VuZF9jbV9yZXAoaWRfcHJpdi0+Y21faWQuaWIsICZyZXApOworCXJldCA9IGliX3NlbmRfY21fcmVwKGlkX3ByaXYtPmNtX2lkLmliLCAmcmVwKTsKK291dDoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGNtYV9hY2NlcHRfaXcoc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdiwKQEAgLTIwMDQsNiArMjE5MywyNCBAQAogCXJldHVybiBpd19jbV9hY2NlcHQoaWRfcHJpdi0+Y21faWQuaXcsICZpd19wYXJhbSk7CiB9CiAKK3N0YXRpYyBpbnQgY21hX3NlbmRfc2lkcl9yZXAoc3RydWN0IHJkbWFfaWRfcHJpdmF0ZSAqaWRfcHJpdiwKKwkJCSAgICAgZW51bSBpYl9jbV9zaWRyX3N0YXR1cyBzdGF0dXMsCisJCQkgICAgIGNvbnN0IHZvaWQgKnByaXZhdGVfZGF0YSwgaW50IHByaXZhdGVfZGF0YV9sZW4pCit7CisJc3RydWN0IGliX2NtX3NpZHJfcmVwX3BhcmFtIHJlcDsKKworCW1lbXNldCgmcmVwLCAwLCBzaXplb2YgcmVwKTsKKwlyZXAuc3RhdHVzID0gc3RhdHVzOworCWlmIChzdGF0dXMgPT0gSUJfU0lEUl9TVUNDRVNTKSB7CisJCXJlcC5xcF9udW0gPSBpZF9wcml2LT5xcF9udW07CisJCXJlcC5xa2V5ID0gUkRNQV9VRF9RS0VZOworCX0KKwlyZXAucHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOworCXJlcC5wcml2YXRlX2RhdGFfbGVuID0gcHJpdmF0ZV9kYXRhX2xlbjsKKworCXJldHVybiBpYl9zZW5kX2NtX3NpZHJfcmVwKGlkX3ByaXYtPmNtX2lkLmliLCAmcmVwKTsKK30KKwogaW50IHJkbWFfYWNjZXB0KHN0cnVjdCByZG1hX2NtX2lkICppZCwgc3RydWN0IHJkbWFfY29ubl9wYXJhbSAqY29ubl9wYXJhbSkKIHsKIAlzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICppZF9wcml2OwpAQCAtMjAxNSwxMyArMjIyMiwxNiBAQAogCiAJaWYgKCFpZC0+cXAgJiYgY29ubl9wYXJhbSkgewogCQlpZF9wcml2LT5xcF9udW0gPSBjb25uX3BhcmFtLT5xcF9udW07Ci0JCWlkX3ByaXYtPnFwX3R5cGUgPSBjb25uX3BhcmFtLT5xcF90eXBlOwogCQlpZF9wcml2LT5zcnEgPSBjb25uX3BhcmFtLT5zcnE7CiAJfQogCiAJc3dpdGNoIChyZG1hX25vZGVfZ2V0X3RyYW5zcG9ydChpZC0+ZGV2aWNlLT5ub2RlX3R5cGUpKSB7CiAJY2FzZSBSRE1BX1RSQU5TUE9SVF9JQjoKLQkJaWYgKGNvbm5fcGFyYW0pCisJCWlmIChpZC0+cHMgPT0gUkRNQV9QU19VRFApCisJCQlyZXQgPSBjbWFfc2VuZF9zaWRyX3JlcChpZF9wcml2LCBJQl9TSURSX1NVQ0NFU1MsCisJCQkJCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGEsCisJCQkJCQljb25uX3BhcmFtLT5wcml2YXRlX2RhdGFfbGVuKTsKKwkJZWxzZSBpZiAoY29ubl9wYXJhbSkKIAkJCXJldCA9IGNtYV9hY2NlcHRfaWIoaWRfcHJpdiwgY29ubl9wYXJhbSk7CiAJCWVsc2UKIAkJCXJldCA9IGNtYV9yZXBfcmVjdihpZF9wcml2KTsKQEAgLTIwNDUsNiArMjI1NSwyNyBAQAogfQogRVhQT1JUX1NZTUJPTChyZG1hX2FjY2VwdCk7CiAKK2ludCByZG1hX25vdGlmeShzdHJ1Y3QgcmRtYV9jbV9pZCAqaWQsIGVudW0gaWJfZXZlbnRfdHlwZSBldmVudCkKK3sKKwlzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICppZF9wcml2OworCWludCByZXQ7CisKKwlpZF9wcml2ID0gY29udGFpbmVyX29mKGlkLCBzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlLCBpZCk7CisJaWYgKCFjbWFfY29tcChpZF9wcml2LCBDTUFfQ09OTkVDVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChpZC0+ZGV2aWNlLT5ub2RlX3R5cGUpIHsKKwljYXNlIFJETUFfTk9ERV9JQl9DQToKKwkJcmV0ID0gaWJfY21fbm90aWZ5KGlkX3ByaXYtPmNtX2lkLmliLCBldmVudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChyZG1hX25vdGlmeSk7CisKIGludCByZG1hX3JlamVjdChzdHJ1Y3QgcmRtYV9jbV9pZCAqaWQsIGNvbnN0IHZvaWQgKnByaXZhdGVfZGF0YSwKIAkJdTggcHJpdmF0ZV9kYXRhX2xlbikKIHsKQEAgLTIwNTcsOSArMjI4OCwxMyBAQAogCiAJc3dpdGNoIChyZG1hX25vZGVfZ2V0X3RyYW5zcG9ydChpZC0+ZGV2aWNlLT5ub2RlX3R5cGUpKSB7CiAJY2FzZSBSRE1BX1RSQU5TUE9SVF9JQjoKLQkJcmV0ID0gaWJfc2VuZF9jbV9yZWooaWRfcHJpdi0+Y21faWQuaWIsCi0JCQkJICAgICBJQl9DTV9SRUpfQ09OU1VNRVJfREVGSU5FRCwgTlVMTCwgMCwKLQkJCQkgICAgIHByaXZhdGVfZGF0YSwgcHJpdmF0ZV9kYXRhX2xlbik7CisJCWlmIChpZC0+cHMgPT0gUkRNQV9QU19VRFApCisJCQlyZXQgPSBjbWFfc2VuZF9zaWRyX3JlcChpZF9wcml2LCBJQl9TSURSX1JFSkVDVCwKKwkJCQkJCXByaXZhdGVfZGF0YSwgcHJpdmF0ZV9kYXRhX2xlbik7CisJCWVsc2UKKwkJCXJldCA9IGliX3NlbmRfY21fcmVqKGlkX3ByaXYtPmNtX2lkLmliLAorCQkJCQkgICAgIElCX0NNX1JFSl9DT05TVU1FUl9ERUZJTkVELCBOVUxMLAorCQkJCQkgICAgIDAsIHByaXZhdGVfZGF0YSwgcHJpdmF0ZV9kYXRhX2xlbik7CiAJCWJyZWFrOwogCWNhc2UgUkRNQV9UUkFOU1BPUlRfSVdBUlA6CiAJCXJldCA9IGl3X2NtX3JlamVjdChpZF9wcml2LT5jbV9pZC5pdywKQEAgLTIxMTUsOCArMjM1MCw2IEBACiAKIAljbWFfZGV2LT5kZXZpY2UgPSBkZXZpY2U7CiAJY21hX2Rldi0+bm9kZV9ndWlkID0gZGV2aWNlLT5ub2RlX2d1aWQ7Ci0JaWYgKCFjbWFfZGV2LT5ub2RlX2d1aWQpCi0JCWdvdG8gZXJyOwogCiAJaW5pdF9jb21wbGV0aW9uKCZjbWFfZGV2LT5jb21wKTsKIAlhdG9taWNfc2V0KCZjbWFfZGV2LT5yZWZjb3VudCwgMSk7CkBAIC0yMTI4LDEzICsyMzYxLDExIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpZF9wcml2LCAmbGlzdGVuX2FueV9saXN0LCBsaXN0KQogCQljbWFfbGlzdGVuX29uX2RldihpZF9wcml2LCBjbWFfZGV2KTsKIAltdXRleF91bmxvY2soJmxvY2spOwotCXJldHVybjsKLWVycjoKLQlrZnJlZShjbWFfZGV2KTsKIH0KIAogc3RhdGljIGludCBjbWFfcmVtb3ZlX2lkX2RldihzdHJ1Y3QgcmRtYV9pZF9wcml2YXRlICppZF9wcml2KQogeworCXN0cnVjdCByZG1hX2NtX2V2ZW50IGV2ZW50OwogCWVudW0gY21hX3N0YXRlIHN0YXRlOwogCiAJLyogUmVjb3JkIHRoYXQgd2Ugd2FudCB0byByZW1vdmUgdGhlIGRldmljZSAqLwpAQCAtMjE0OSw4ICsyMzgwLDkgQEAKIAlpZiAoIWNtYV9jb21wKGlkX3ByaXYsIENNQV9ERVZJQ0VfUkVNT1ZBTCkpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIGNtYV9ub3RpZnlfdXNlcihpZF9wcml2LCBSRE1BX0NNX0VWRU5UX0RFVklDRV9SRU1PVkFMLAotCQkJICAgICAgIDAsIE5VTEwsIDApOworCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZiBldmVudCk7CisJZXZlbnQuZXZlbnQgPSBSRE1BX0NNX0VWRU5UX0RFVklDRV9SRU1PVkFMOworCXJldHVybiBpZF9wcml2LT5pZC5ldmVudF9oYW5kbGVyKCZpZF9wcml2LT5pZCwgJmV2ZW50KTsKIH0KIAogc3RhdGljIHZvaWQgY21hX3Byb2Nlc3NfcmVtb3ZlKHN0cnVjdCBjbWFfZGV2aWNlICpjbWFfZGV2KQpAQCAtMjIxMCw2ICsyNDQyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpYl9zYV9yZWdpc3Rlcl9jbGllbnQoJnNhX2NsaWVudCk7CisJcmRtYV9hZGRyX3JlZ2lzdGVyX2NsaWVudCgmYWRkcl9jbGllbnQpOwogCiAJcmV0ID0gaWJfcmVnaXN0ZXJfY2xpZW50KCZjbWFfY2xpZW50KTsKIAlpZiAocmV0KQpAQCAtMjIxNyw2ICsyNDUwLDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyOgorCXJkbWFfYWRkcl91bnJlZ2lzdGVyX2NsaWVudCgmYWRkcl9jbGllbnQpOwogCWliX3NhX3VucmVnaXN0ZXJfY2xpZW50KCZzYV9jbGllbnQpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGNtYV93cSk7CiAJcmV0dXJuIHJldDsKQEAgLTIyMjUsMTAgKzI0NTksMTIgQEAKIHN0YXRpYyB2b2lkIGNtYV9jbGVhbnVwKHZvaWQpCiB7CiAJaWJfdW5yZWdpc3Rlcl9jbGllbnQoJmNtYV9jbGllbnQpOworCXJkbWFfYWRkcl91bnJlZ2lzdGVyX2NsaWVudCgmYWRkcl9jbGllbnQpOwogCWliX3NhX3VucmVnaXN0ZXJfY2xpZW50KCZzYV9jbGllbnQpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGNtYV93cSk7CiAJaWRyX2Rlc3Ryb3koJnNkcF9wcyk7CiAJaWRyX2Rlc3Ryb3koJnRjcF9wcyk7CisJaWRyX2Rlc3Ryb3koJnVkcF9wcyk7CiB9CiAKIG1vZHVsZV9pbml0KGNtYV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2Ztcl9wb29sLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9mbXJfcG9vbC5jCmluZGV4IDg2YTNiMmQuLjg5MjZhMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2Ztcl9wb29sLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvZm1yX3Bvb2wuYwpAQCAtMzk0LDIwICszOTQsMTIgQEAKICAqLwogaW50IGliX2ZsdXNoX2Ztcl9wb29sKHN0cnVjdCBpYl9mbXJfcG9vbCAqcG9vbCkKIHsKLQlpbnQgc2VyaWFsOwotCi0JYXRvbWljX2luYygmcG9vbC0+cmVxX3Nlcik7Ci0JLyoKLQkgKiBJdCdzIE9LIGlmIHNvbWVvbmUgZWxzZSBidW1wcyByZXFfc2VyIGFnYWluIGhlcmUgLS0gd2UnbGwKLQkgKiBqdXN0IHdhaXQgYSBsaXR0bGUgbG9uZ2VyLgotCSAqLwotCXNlcmlhbCA9IGF0b21pY19yZWFkKCZwb29sLT5yZXFfc2VyKTsKKwlpbnQgc2VyaWFsID0gYXRvbWljX2luY19yZXR1cm4oJnBvb2wtPnJlcV9zZXIpOwogCiAJd2FrZV91cF9wcm9jZXNzKHBvb2wtPnRocmVhZCk7CiAKIAlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBvb2wtPmZvcmNlX3dhaXQsCi0JCQkJICAgICBhdG9taWNfcmVhZCgmcG9vbC0+Zmx1c2hfc2VyKSAtCi0JCQkJICAgICBhdG9taWNfcmVhZCgmcG9vbC0+cmVxX3NlcikgPj0gMCkpCisJCQkJICAgICBhdG9taWNfcmVhZCgmcG9vbC0+Zmx1c2hfc2VyKSAtIHNlcmlhbCA+PSAwKSkKIAkJcmV0dXJuIC1FSU5UUjsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvaXdjbS5jCmluZGV4IGMzZmIzMDQuLjEwMzlhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2l3Y20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9pd2NtLmMKQEAgLTgwLDcgKzgwLDcgQEAKICAqIDEpIGluIHRoZSBldmVudCB1cGNhbGwsIGNtX2V2ZW50X2hhbmRsZXIoKSwgZm9yIGEgbGlzdGVuaW5nIGNtX2lkLiAgSWYKICAqICAgIHRoZSBiYWNrbG9nIGlzIGV4Y2VlZGVkLCB0aGVuIG5vIG1vcmUgY29ubmVjdGlvbiByZXF1ZXN0IGV2ZW50cyB3aWxsCiAgKiAgICBiZSBwcm9jZXNzZWQuICBjbV9ldmVudF9oYW5kbGVyKCkgcmV0dXJucyAtRU5PTUVNIGluIHRoaXMgY2FzZS4gIEl0cyB1cAotICogICAgdG8gdGhlIHByb3ZpZGVyIHRvIHJlamVjdCB0aGUgY29ubmVjdGlubyByZXF1ZXN0LgorICogICAgdG8gdGhlIHByb3ZpZGVyIHRvIHJlamVjdCB0aGUgY29ubmVjdGlvbiByZXF1ZXN0LgogICogMikgaW4gdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCB3b3JrcXVldWUgaGFuZGxlciwgY21fY29ubl9yZXFfaGFuZGxlcigpLgogICogICAgSWYgd29yayBlbGVtZW50cyBjYW5ub3QgYmUgYWxsb2NhdGVkIGZvciB0aGUgbmV3IGNvbm5lY3QgcmVxdWVzdCBjbV9pZCwKICAqICAgIHRoZW4gSVdDTSB3aWxsIGNhbGwgdGhlIHByb3ZpZGVyIHJlamVjdCBtZXRob2QuICBUaGlzIGlzIG9rIHNpbmNlCkBAIC0xMzEsMjYgKzEzMSwyNSBAQAogfQogCiAvKgotICogU2F2ZSBwcml2YXRlIGRhdGEgZnJvbSBpbmNvbWluZyBjb25uZWN0aW9uIHJlcXVlc3RzIGluIHRoZQotICogY21faWRfcHJpdiBzbyB0aGUgbG93IGxldmVsIGRyaXZlciBkb2Vzbid0IGhhdmUgdG8uICBBZGp1c3QKKyAqIFNhdmUgcHJpdmF0ZSBkYXRhIGZyb20gaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0cyB0bworICogaXdfY21fZXZlbnQsIHNvIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIGRvZXNuJ3QgaGF2ZSB0by4gQWRqdXN0CiAgKiB0aGUgZXZlbnQgcHRyIHRvIHBvaW50IHRvIHRoZSBsb2NhbCBjb3B5LgogICovCi1zdGF0aWMgaW50IGNvcHlfcHJpdmF0ZV9kYXRhKHN0cnVjdCBpd2NtX2lkX3ByaXZhdGUgKmNtX2lkX3ByaXYsCi0JCSAgICAgICBzdHJ1Y3QgaXdfY21fZXZlbnQgKmV2ZW50KQorc3RhdGljIGludCBjb3B5X3ByaXZhdGVfZGF0YShzdHJ1Y3QgaXdfY21fZXZlbnQgKmV2ZW50KQogewogCXZvaWQgKnA7CiAKLQlwID0ga21hbGxvYyhldmVudC0+cHJpdmF0ZV9kYXRhX2xlbiwgR0ZQX0FUT01JQyk7CisJcCA9IGttZW1kdXAoZXZlbnQtPnByaXZhdGVfZGF0YSwgZXZlbnQtPnByaXZhdGVfZGF0YV9sZW4sIEdGUF9BVE9NSUMpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KHAsIGV2ZW50LT5wcml2YXRlX2RhdGEsIGV2ZW50LT5wcml2YXRlX2RhdGFfbGVuKTsKIAlldmVudC0+cHJpdmF0ZV9kYXRhID0gcDsKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIFJlbGVhc2UgYSByZWZlcmVuY2Ugb24gY21faWQuIElmIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyBiZWluZyByZW1vdmVkCi0gKiBhbmQgaXdfZGVzdHJveV9jbV9pZCBpcyB3YWl0aW5nLCB3YWtlIHVwIHRoZSB3YWl0aW5nIHRocmVhZC4KKyAqIFJlbGVhc2UgYSByZWZlcmVuY2Ugb24gY21faWQuIElmIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyBiZWluZworICogcmVsZWFzZWQsIGVuYWJsZSB0aGUgd2FpdGluZyB0aHJlYWQgKGluIGl3X2Rlc3Ryb3lfY21faWQpIHRvCisgKiBnZXQgd29rZW4gdXAsIGFuZCByZXR1cm4gMSBpZiBhIHRocmVhZCBpcyBhbHJlYWR5IHdhaXRpbmcuCiAgKi8KIHN0YXRpYyBpbnQgaXdjbV9kZXJlZl9pZChzdHJ1Y3QgaXdjbV9pZF9wcml2YXRlICpjbV9pZF9wcml2KQogewpAQCAtMjQzLDcgKzI0Miw3IEBACiAvKgogICogQ01fSUQgPC0tIENMT1NJTkcKICAqCi0gKiBCbG9jayBpZiBhIHBhc3NpdmUgb3IgYWN0aXZlIGNvbm5lY3Rpb24gaXMgY3VycmVubHR5IGJlaW5nIHByb2Nlc3NlZC4gVGhlbgorICogQmxvY2sgaWYgYSBwYXNzaXZlIG9yIGFjdGl2ZSBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZW4KICAqIHByb2Nlc3MgdGhlIGV2ZW50IGFzIGZvbGxvd3M6CiAgKiAtIElmIHdlIGFyZSBFU1RBQkxJU0hFRCwgbW92ZSB0byBDTE9TSU5HIGFuZCBtb2RpZnkgdGhlIFFQIHN0YXRlCiAgKiAgIGJhc2VkIG9uIHRoZSBhYnJ1cHQgZmxhZwpAQCAtNDA4LDcgKzQwNyw3IEBACiB7CiAJc3RydWN0IGl3Y21faWRfcHJpdmF0ZSAqY21faWRfcHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAljbV9pZF9wcml2ID0gY29udGFpbmVyX29mKGNtX2lkLCBzdHJ1Y3QgaXdjbV9pZF9wcml2YXRlLCBpZCk7CiAKQEAgLTUzNSw3ICs1MzQsNyBAQAogaW50IGl3X2NtX2Nvbm5lY3Qoc3RydWN0IGl3X2NtX2lkICpjbV9pZCwgc3RydWN0IGl3X2NtX2Nvbm5fcGFyYW0gKml3X3BhcmFtKQogewogCXN0cnVjdCBpd2NtX2lkX3ByaXZhdGUgKmNtX2lkX3ByaXY7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpYl9xcCAqcXA7CiAKQEAgLTYyMCw3ICs2MTksNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0ZW5faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmIChsaXN0ZW5faWRfcHJpdi0+c3RhdGUgIT0gSVdfQ01fU1RBVEVfTElTVEVOKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3Rlbl9pZF9wcml2LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3Rlbl9pZF9wcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTYyOSw3ICs2MjgsNyBAQAogCQkJCWxpc3Rlbl9pZF9wcml2LT5pZC5jb250ZXh0KTsKIAkvKiBJZiB0aGUgY21faWQgY291bGQgbm90IGJlIGNyZWF0ZWQsIGlnbm9yZSB0aGUgcmVxdWVzdCAqLwogCWlmIChJU19FUlIoY21faWQpKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJY21faWQtPnByb3ZpZGVyX2RhdGEgPSBpd19ldmVudC0+cHJvdmlkZXJfZGF0YTsKIAljbV9pZC0+bG9jYWxfYWRkciA9IGl3X2V2ZW50LT5sb2NhbF9hZGRyOwpAQCAtNjQyLDcgKzY0MSw3IEBACiAJaWYgKHJldCkgewogCQlpd19jbV9yZWplY3QoY21faWQsIE5VTEwsIDApOwogCQlpd19kZXN0cm95X2NtX2lkKGNtX2lkKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBDYWxsIHRoZSBjbGllbnQgQ00gaGFuZGxlciAqLwpAQCAtNjU0LDYgKzY1Myw3IEBACiAJCQlrZnJlZShjbV9pZCk7CiAJfQogCitvdXQ6CiAJaWYgKGl3X2V2ZW50LT5wcml2YXRlX2RhdGFfbGVuKQogCQlrZnJlZShpd19ldmVudC0+cHJpdmF0ZV9kYXRhKTsKIH0KQEAgLTY3NCw3ICs2NzQsNyBAQAogCQkJICAgICAgIHN0cnVjdCBpd19jbV9ldmVudCAqaXdfZXZlbnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNtX2lkX3ByaXYtPmxvY2ssIGZsYWdzKTsKIApAQCAtNzA0LDcgKzcwNCw3IEBACiAJCQkgICAgICAgc3RydWN0IGl3X2NtX2V2ZW50ICppd19ldmVudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21faWRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCS8qCkBAIC04MjgsOSArODI4LDEwIEBACiAgKiB0aHJlYWQgYXNsZWVwIG9uIHRoZSBkZXN0cm95X2NvbXAgbGlzdCB2cy4gYW4gb2JqZWN0IGRlc3Ryb3llZAogICogaGVyZSBzeW5jaHJvbm91c2x5IHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGlzIHJlbW92ZWQuCiAgKi8KLXN0YXRpYyB2b2lkIGNtX3dvcmtfaGFuZGxlcih2b2lkICphcmcpCitzdGF0aWMgdm9pZCBjbV93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICpfd29yaykKIHsKLQlzdHJ1Y3QgaXdjbV93b3JrICp3b3JrID0gYXJnLCBsd29yazsKKwlzdHJ1Y3QgaXdjbV93b3JrICp3b3JrID0gY29udGFpbmVyX29mKF93b3JrLCBzdHJ1Y3QgaXdjbV93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgaXdfY21fZXZlbnQgbGV2ZW50OwogCXN0cnVjdCBpd2NtX2lkX3ByaXZhdGUgKmNtX2lkX3ByaXYgPSB3b3JrLT5jbV9pZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlbXB0eTsKQEAgLTg0MywxMSArODQ0LDExIEBACiAJCQkJICBzdHJ1Y3QgaXdjbV93b3JrLCBsaXN0KTsKIAkJbGlzdF9kZWxfaW5pdCgmd29yay0+bGlzdCk7CiAJCWVtcHR5ID0gbGlzdF9lbXB0eSgmY21faWRfcHJpdi0+d29ya19saXN0KTsKLQkJbHdvcmsgPSAqd29yazsKKwkJbGV2ZW50ID0gd29yay0+ZXZlbnQ7CiAJCXB1dF93b3JrKHdvcmspOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbV9pZF9wcml2LT5sb2NrLCBmbGFncyk7CiAKLQkJcmV0ID0gcHJvY2Vzc19ldmVudChjbV9pZF9wcml2LCAmd29yay0+ZXZlbnQpOworCQlyZXQgPSBwcm9jZXNzX2V2ZW50KGNtX2lkX3ByaXYsICZsZXZlbnQpOwogCQlpZiAocmV0KSB7CiAJCQlzZXRfYml0KElXQ01fRl9DQUxMQkFDS19ERVNUUk9ZLCAmY21faWRfcHJpdi0+ZmxhZ3MpOwogCQkJZGVzdHJveV9jbV9pZCgmY21faWRfcHJpdi0+aWQpOwpAQCAtODk5LDE0ICs5MDAsMTQgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBjbV93b3JrX2hhbmRsZXIsIHdvcmspOworCUlOSVRfV09SSygmd29yay0+d29yaywgY21fd29ya19oYW5kbGVyKTsKIAl3b3JrLT5jbV9pZCA9IGNtX2lkX3ByaXY7CiAJd29yay0+ZXZlbnQgPSAqaXdfZXZlbnQ7CiAKIAlpZiAoKHdvcmstPmV2ZW50LmV2ZW50ID09IElXX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVCB8fAogCSAgICAgd29yay0+ZXZlbnQuZXZlbnQgPT0gSVdfQ01fRVZFTlRfQ09OTkVDVF9SRVBMWSkgJiYKIAkgICAgd29yay0+ZXZlbnQucHJpdmF0ZV9kYXRhX2xlbikgewotCQlyZXQgPSBjb3B5X3ByaXZhdGVfZGF0YShjbV9pZF9wcml2LCAmd29yay0+ZXZlbnQpOworCQlyZXQgPSBjb3B5X3ByaXZhdGVfZGF0YSgmd29yay0+ZXZlbnQpOwogCQlpZiAocmV0KSB7CiAJCQlwdXRfd29yayh3b3JrKTsKIAkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYwppbmRleCA0OTNmNGM2Li41ZWQxNDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYwpAQCAtNDYsNyArNDYsNyBAQAogTU9EVUxFX0FVVEhPUigiSGFsIFJvc2Vuc3RvY2siKTsKIE1PRFVMRV9BVVRIT1IoIlNlYW4gSGVmdHkiKTsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqaWJfbWFkX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppYl9tYWRfY2FjaGU7CiAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGliX21hZF9wb3J0X2xpc3Q7CiBzdGF0aWMgdTMyIGliX21hZF9jbGllbnRfaWQgPSAwOwpAQCAtNjUsOCArNjUsOCBAQAogc3RhdGljIGludCBpYl9tYWRfcG9zdF9yZWNlaXZlX21hZHMoc3RydWN0IGliX21hZF9xcF9pbmZvICpxcF9pbmZvLAogCQkJCSAgICBzdHJ1Y3QgaWJfbWFkX3ByaXZhdGUgKm1hZCk7CiBzdGF0aWMgdm9pZCBjYW5jZWxfbWFkcyhzdHJ1Y3QgaWJfbWFkX2FnZW50X3ByaXZhdGUgKm1hZF9hZ2VudF9wcml2KTsKLXN0YXRpYyB2b2lkIHRpbWVvdXRfc2VuZHModm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCBsb2NhbF9jb21wbGV0aW9ucyh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHRpbWVvdXRfc2VuZHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIGxvY2FsX2NvbXBsZXRpb25zKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgaW50IGFkZF9ub25vdWlfcmVnX3JlcShzdHJ1Y3QgaWJfbWFkX3JlZ19yZXEgKm1hZF9yZWdfcmVxLAogCQkJICAgICAgc3RydWN0IGliX21hZF9hZ2VudF9wcml2YXRlICphZ2VudF9wcml2LAogCQkJICAgICAgdTggbWdtdF9jbGFzcyk7CkBAIC0zNTYsMTAgKzM1Niw5IEBACiAJSU5JVF9MSVNUX0hFQUQoJm1hZF9hZ2VudF9wcml2LT53YWl0X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZtYWRfYWdlbnRfcHJpdi0+ZG9uZV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmbWFkX2FnZW50X3ByaXYtPnJtcHBfbGlzdCk7Ci0JSU5JVF9XT1JLKCZtYWRfYWdlbnRfcHJpdi0+dGltZWRfd29yaywgdGltZW91dF9zZW5kcywgbWFkX2FnZW50X3ByaXYpOworCUlOSVRfREVMQVlFRF9XT1JLKCZtYWRfYWdlbnRfcHJpdi0+dGltZWRfd29yaywgdGltZW91dF9zZW5kcyk7CiAJSU5JVF9MSVNUX0hFQUQoJm1hZF9hZ2VudF9wcml2LT5sb2NhbF9saXN0KTsKLQlJTklUX1dPUksoJm1hZF9hZ2VudF9wcml2LT5sb2NhbF93b3JrLCBsb2NhbF9jb21wbGV0aW9ucywKLQkJICAgbWFkX2FnZW50X3ByaXYpOworCUlOSVRfV09SSygmbWFkX2FnZW50X3ByaXYtPmxvY2FsX3dvcmssIGxvY2FsX2NvbXBsZXRpb25zKTsKIAlhdG9taWNfc2V0KCZtYWRfYWdlbnRfcHJpdi0+cmVmY291bnQsIDEpOwogCWluaXRfY29tcGxldGlvbigmbWFkX2FnZW50X3ByaXYtPmNvbXApOwogCkBAIC05OTksMTcgKzk5OCwxNyBAQAogCiAJbWFkX2FnZW50ID0gbWFkX3NlbmRfd3ItPnNlbmRfYnVmLm1hZF9hZ2VudDsKIAlzZ2UgPSBtYWRfc2VuZF93ci0+c2dfbGlzdDsKLQlzZ2VbMF0uYWRkciA9IGRtYV9tYXBfc2luZ2xlKG1hZF9hZ2VudC0+ZGV2aWNlLT5kbWFfZGV2aWNlLAotCQkJCSAgICAgbWFkX3NlbmRfd3ItPnNlbmRfYnVmLm1hZCwKLQkJCQkgICAgIHNnZVswXS5sZW5ndGgsCi0JCQkJICAgICBETUFfVE9fREVWSUNFKTsKLQlwY2lfdW5tYXBfYWRkcl9zZXQobWFkX3NlbmRfd3IsIGhlYWRlcl9tYXBwaW5nLCBzZ2VbMF0uYWRkcik7CisJc2dlWzBdLmFkZHIgPSBpYl9kbWFfbWFwX3NpbmdsZShtYWRfYWdlbnQtPmRldmljZSwKKwkJCQkJbWFkX3NlbmRfd3ItPnNlbmRfYnVmLm1hZCwKKwkJCQkJc2dlWzBdLmxlbmd0aCwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJbWFkX3NlbmRfd3ItPmhlYWRlcl9tYXBwaW5nID0gc2dlWzBdLmFkZHI7CiAKLQlzZ2VbMV0uYWRkciA9IGRtYV9tYXBfc2luZ2xlKG1hZF9hZ2VudC0+ZGV2aWNlLT5kbWFfZGV2aWNlLAotCQkJCSAgICAgaWJfZ2V0X3BheWxvYWQobWFkX3NlbmRfd3IpLAotCQkJCSAgICAgc2dlWzFdLmxlbmd0aCwKLQkJCQkgICAgIERNQV9UT19ERVZJQ0UpOwotCXBjaV91bm1hcF9hZGRyX3NldChtYWRfc2VuZF93ciwgcGF5bG9hZF9tYXBwaW5nLCBzZ2VbMV0uYWRkcik7CisJc2dlWzFdLmFkZHIgPSBpYl9kbWFfbWFwX3NpbmdsZShtYWRfYWdlbnQtPmRldmljZSwKKwkJCQkJaWJfZ2V0X3BheWxvYWQobWFkX3NlbmRfd3IpLAorCQkJCQlzZ2VbMV0ubGVuZ3RoLAorCQkJCQlETUFfVE9fREVWSUNFKTsKKwltYWRfc2VuZF93ci0+cGF5bG9hZF9tYXBwaW5nID0gc2dlWzFdLmFkZHI7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXBfaW5mby0+c2VuZF9xdWV1ZS5sb2NrLCBmbGFncyk7CiAJaWYgKHFwX2luZm8tPnNlbmRfcXVldWUuY291bnQgPCBxcF9pbmZvLT5zZW5kX3F1ZXVlLm1heF9hY3RpdmUpIHsKQEAgLTEwMjcsMTIgKzEwMjYsMTIgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXBfaW5mby0+c2VuZF9xdWV1ZS5sb2NrLCBmbGFncyk7CiAJaWYgKHJldCkgewotCQlkbWFfdW5tYXBfc2luZ2xlKG1hZF9hZ2VudC0+ZGV2aWNlLT5kbWFfZGV2aWNlLAotCQkJCSBwY2lfdW5tYXBfYWRkcihtYWRfc2VuZF93ciwgaGVhZGVyX21hcHBpbmcpLAotCQkJCSBzZ2VbMF0ubGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKLQkJZG1hX3VubWFwX3NpbmdsZShtYWRfYWdlbnQtPmRldmljZS0+ZG1hX2RldmljZSwKLQkJCQkgcGNpX3VubWFwX2FkZHIobWFkX3NlbmRfd3IsIHBheWxvYWRfbWFwcGluZyksCi0JCQkJIHNnZVsxXS5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCQlpYl9kbWFfdW5tYXBfc2luZ2xlKG1hZF9hZ2VudC0+ZGV2aWNlLAorCQkJCSAgICBtYWRfc2VuZF93ci0+aGVhZGVyX21hcHBpbmcsCisJCQkJICAgIHNnZVswXS5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCQlpYl9kbWFfdW5tYXBfc2luZ2xlKG1hZF9hZ2VudC0+ZGV2aWNlLAorCQkJCSAgICBtYWRfc2VuZF93ci0+cGF5bG9hZF9tYXBwaW5nLAorCQkJCSAgICBzZ2VbMV0ubGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE3NTAsNyArMTc0OSw3IEBACiAJCSAgICAgKi8KIAkJICAgIChpc19kaXJlY3Qod2MtPnJlY3ZfYnVmLm1hZC0+bWFkX2hkci5tZ210X2NsYXNzKSB8fAogCQkgICAgIHJjdl9oYXNfc2FtZV9naWQobWFkX2FnZW50X3ByaXYsIHdyLCB3YykpKQotCQkJcmV0dXJuIHdyOworCQkJcmV0dXJuICh3ci0+c3RhdHVzID09IElCX1dDX1NVQ0NFU1MpID8gd3IgOiBOVUxMOwogCX0KIAogCS8qCkBAIC0xODUxLDExICsxODUwLDExIEBACiAJbWFkX3ByaXZfaGRyID0gY29udGFpbmVyX29mKG1hZF9saXN0LCBzdHJ1Y3QgaWJfbWFkX3ByaXZhdGVfaGVhZGVyLAogCQkJCSAgICBtYWRfbGlzdCk7CiAJcmVjdiA9IGNvbnRhaW5lcl9vZihtYWRfcHJpdl9oZHIsIHN0cnVjdCBpYl9tYWRfcHJpdmF0ZSwgaGVhZGVyKTsKLQlkbWFfdW5tYXBfc2luZ2xlKHBvcnRfcHJpdi0+ZGV2aWNlLT5kbWFfZGV2aWNlLAotCQkJIHBjaV91bm1hcF9hZGRyKCZyZWN2LT5oZWFkZXIsIG1hcHBpbmcpLAotCQkJIHNpemVvZihzdHJ1Y3QgaWJfbWFkX3ByaXZhdGUpIC0KLQkJCSBzaXplb2Yoc3RydWN0IGliX21hZF9wcml2YXRlX2hlYWRlciksCi0JCQkgRE1BX0ZST01fREVWSUNFKTsKKwlpYl9kbWFfdW5tYXBfc2luZ2xlKHBvcnRfcHJpdi0+ZGV2aWNlLAorCQkJICAgIHJlY3YtPmhlYWRlci5tYXBwaW5nLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgaWJfbWFkX3ByaXZhdGUpIC0KKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaWJfbWFkX3ByaXZhdGVfaGVhZGVyKSwKKwkJCSAgICBETUFfRlJPTV9ERVZJQ0UpOwogCiAJLyogU2V0dXAgTUFEIHJlY2VpdmUgd29yayBjb21wbGV0aW9uIGZyb20gIm5vcm1hbCIgd29yayBjb21wbGV0aW9uICovCiAJcmVjdi0+aGVhZGVyLndjID0gKndjOwpAQCAtMjA4MSwxMiArMjA4MCwxMiBAQAogCXFwX2luZm8gPSBzZW5kX3F1ZXVlLT5xcF9pbmZvOwogCiByZXRyeToKLQlkbWFfdW5tYXBfc2luZ2xlKG1hZF9zZW5kX3dyLT5zZW5kX2J1Zi5tYWRfYWdlbnQtPmRldmljZS0+ZG1hX2RldmljZSwKLQkJCSBwY2lfdW5tYXBfYWRkcihtYWRfc2VuZF93ciwgaGVhZGVyX21hcHBpbmcpLAotCQkJIG1hZF9zZW5kX3dyLT5zZ19saXN0WzBdLmxlbmd0aCwgRE1BX1RPX0RFVklDRSk7Ci0JZG1hX3VubWFwX3NpbmdsZShtYWRfc2VuZF93ci0+c2VuZF9idWYubWFkX2FnZW50LT5kZXZpY2UtPmRtYV9kZXZpY2UsCi0JCQkgcGNpX3VubWFwX2FkZHIobWFkX3NlbmRfd3IsIHBheWxvYWRfbWFwcGluZyksCi0JCQkgbWFkX3NlbmRfd3ItPnNnX2xpc3RbMV0ubGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwlpYl9kbWFfdW5tYXBfc2luZ2xlKG1hZF9zZW5kX3dyLT5zZW5kX2J1Zi5tYWRfYWdlbnQtPmRldmljZSwKKwkJCSAgICBtYWRfc2VuZF93ci0+aGVhZGVyX21hcHBpbmcsCisJCQkgICAgbWFkX3NlbmRfd3ItPnNnX2xpc3RbMF0ubGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwlpYl9kbWFfdW5tYXBfc2luZ2xlKG1hZF9zZW5kX3dyLT5zZW5kX2J1Zi5tYWRfYWdlbnQtPmRldmljZSwKKwkJCSAgICBtYWRfc2VuZF93ci0+cGF5bG9hZF9tYXBwaW5nLAorCQkJICAgIG1hZF9zZW5kX3dyLT5zZ19saXN0WzFdLmxlbmd0aCwgRE1BX1RPX0RFVklDRSk7CiAJcXVldWVkX3NlbmRfd3IgPSBOVUxMOwogCXNwaW5fbG9ja19pcnFzYXZlKCZzZW5kX3F1ZXVlLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9kZWwoJm1hZF9saXN0LT5saXN0KTsKQEAgLTIxOTgsMTIgKzIxOTcsMTIgQEAKIC8qCiAgKiBJQiBNQUQgY29tcGxldGlvbiBjYWxsYmFjawogICovCi1zdGF0aWMgdm9pZCBpYl9tYWRfY29tcGxldGlvbl9oYW5kbGVyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpYl9tYWRfY29tcGxldGlvbl9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaWJfbWFkX3BvcnRfcHJpdmF0ZSAqcG9ydF9wcml2OwogCXN0cnVjdCBpYl93YyB3YzsKIAotCXBvcnRfcHJpdiA9IChzdHJ1Y3QgaWJfbWFkX3BvcnRfcHJpdmF0ZSAqKWRhdGE7CisJcG9ydF9wcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpYl9tYWRfcG9ydF9wcml2YXRlLCB3b3JrKTsKIAlpYl9yZXFfbm90aWZ5X2NxKHBvcnRfcHJpdi0+Y3EsIElCX0NRX05FWFRfQ09NUCk7CiAKIAl3aGlsZSAoaWJfcG9sbF9jcShwb3J0X3ByaXYtPmNxLCAxLCAmd2MpID09IDEpIHsKQEAgLTIzMjQsNyArMjMyMyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGliX2NhbmNlbF9tYWQpOwogCi1zdGF0aWMgdm9pZCBsb2NhbF9jb21wbGV0aW9ucyh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgbG9jYWxfY29tcGxldGlvbnMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBpYl9tYWRfYWdlbnRfcHJpdmF0ZSAqbWFkX2FnZW50X3ByaXY7CiAJc3RydWN0IGliX21hZF9sb2NhbF9wcml2YXRlICpsb2NhbDsKQEAgLTIzMzQsNyArMjMzMyw4IEBACiAJc3RydWN0IGliX3djIHdjOwogCXN0cnVjdCBpYl9tYWRfc2VuZF93YyBtYWRfc2VuZF93YzsKIAotCW1hZF9hZ2VudF9wcml2ID0gKHN0cnVjdCBpYl9tYWRfYWdlbnRfcHJpdmF0ZSAqKWRhdGE7CisJbWFkX2FnZW50X3ByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGliX21hZF9hZ2VudF9wcml2YXRlLCBsb2NhbF93b3JrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWRfYWdlbnRfcHJpdi0+bG9jaywgZmxhZ3MpOwogCXdoaWxlICghbGlzdF9lbXB0eSgmbWFkX2FnZW50X3ByaXYtPmxvY2FsX2xpc3QpKSB7CkBAIC0yNDM0LDE0ICsyNDM0LDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgdGltZW91dF9zZW5kcyh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgdGltZW91dF9zZW5kcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGliX21hZF9hZ2VudF9wcml2YXRlICptYWRfYWdlbnRfcHJpdjsKIAlzdHJ1Y3QgaWJfbWFkX3NlbmRfd3JfcHJpdmF0ZSAqbWFkX3NlbmRfd3I7CiAJc3RydWN0IGliX21hZF9zZW5kX3djIG1hZF9zZW5kX3djOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGRlbGF5OwogCi0JbWFkX2FnZW50X3ByaXYgPSAoc3RydWN0IGliX21hZF9hZ2VudF9wcml2YXRlICopZGF0YTsKKwltYWRfYWdlbnRfcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWJfbWFkX2FnZW50X3ByaXZhdGUsCisJCQkJICAgICAgdGltZWRfd29yay53b3JrKTsKIAltYWRfc2VuZF93Yy52ZW5kb3JfZXJyID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWRfYWdlbnRfcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMjUyNywxMyArMjUyOCwxMiBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCXNnX2xpc3QuYWRkciA9IGRtYV9tYXBfc2luZ2xlKHFwX2luZm8tPnBvcnRfcHJpdi0+Ci0JCQkJCSAgICAgICAgZGV2aWNlLT5kbWFfZGV2aWNlLAotCQkJCQkgICAgICAmbWFkX3ByaXYtPmdyaCwKLQkJCQkJICAgICAgc2l6ZW9mICptYWRfcHJpdiAtCi0JCQkJCSAgICAgICAgc2l6ZW9mIG1hZF9wcml2LT5oZWFkZXIsCi0JCQkJCSAgICAgIERNQV9GUk9NX0RFVklDRSk7Ci0JCXBjaV91bm1hcF9hZGRyX3NldCgmbWFkX3ByaXYtPmhlYWRlciwgbWFwcGluZywgc2dfbGlzdC5hZGRyKTsKKwkJc2dfbGlzdC5hZGRyID0gaWJfZG1hX21hcF9zaW5nbGUocXBfaW5mby0+cG9ydF9wcml2LT5kZXZpY2UsCisJCQkJCQkgJm1hZF9wcml2LT5ncmgsCisJCQkJCQkgc2l6ZW9mICptYWRfcHJpdiAtCisJCQkJCQkgICBzaXplb2YgbWFkX3ByaXYtPmhlYWRlciwKKwkJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQltYWRfcHJpdi0+aGVhZGVyLm1hcHBpbmcgPSBzZ19saXN0LmFkZHI7CiAJCXJlY3Zfd3Iud3JfaWQgPSAodW5zaWduZWQgbG9uZykmbWFkX3ByaXYtPmhlYWRlci5tYWRfbGlzdDsKIAkJbWFkX3ByaXYtPmhlYWRlci5tYWRfbGlzdC5tYWRfcXVldWUgPSByZWN2X3F1ZXVlOwogCkBAIC0yNTQ4LDEyICsyNTQ4LDExIEBACiAJCQlsaXN0X2RlbCgmbWFkX3ByaXYtPmhlYWRlci5tYWRfbGlzdC5saXN0KTsKIAkJCXJlY3ZfcXVldWUtPmNvdW50LS07CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZWN2X3F1ZXVlLT5sb2NrLCBmbGFncyk7Ci0JCQlkbWFfdW5tYXBfc2luZ2xlKHFwX2luZm8tPnBvcnRfcHJpdi0+ZGV2aWNlLT5kbWFfZGV2aWNlLAotCQkJCQkgcGNpX3VubWFwX2FkZHIoJm1hZF9wcml2LT5oZWFkZXIsCi0JCQkJCQkJbWFwcGluZyksCi0JCQkJCSBzaXplb2YgKm1hZF9wcml2IC0KLQkJCQkJICAgc2l6ZW9mIG1hZF9wcml2LT5oZWFkZXIsCi0JCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQkJaWJfZG1hX3VubWFwX3NpbmdsZShxcF9pbmZvLT5wb3J0X3ByaXYtPmRldmljZSwKKwkJCQkJICAgIG1hZF9wcml2LT5oZWFkZXIubWFwcGluZywKKwkJCQkJICAgIHNpemVvZiAqbWFkX3ByaXYgLQorCQkJCQkgICAgICBzaXplb2YgbWFkX3ByaXYtPmhlYWRlciwKKwkJCQkJICAgIERNQV9GUk9NX0RFVklDRSk7CiAJCQlrbWVtX2NhY2hlX2ZyZWUoaWJfbWFkX2NhY2hlLCBtYWRfcHJpdik7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJpYl9wb3N0X3JlY3YgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJCWJyZWFrOwpAQCAtMjU4NSwxMSArMjU4NCwxMSBAQAogCQkvKiBSZW1vdmUgZnJvbSBwb3N0ZWQgcmVjZWl2ZSBNQUQgbGlzdCAqLwogCQlsaXN0X2RlbCgmbWFkX2xpc3QtPmxpc3QpOwogCi0JCWRtYV91bm1hcF9zaW5nbGUocXBfaW5mby0+cG9ydF9wcml2LT5kZXZpY2UtPmRtYV9kZXZpY2UsCi0JCQkJIHBjaV91bm1hcF9hZGRyKCZyZWN2LT5oZWFkZXIsIG1hcHBpbmcpLAotCQkJCSBzaXplb2Yoc3RydWN0IGliX21hZF9wcml2YXRlKSAtCi0JCQkJIHNpemVvZihzdHJ1Y3QgaWJfbWFkX3ByaXZhdGVfaGVhZGVyKSwKLQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJaWJfZG1hX3VubWFwX3NpbmdsZShxcF9pbmZvLT5wb3J0X3ByaXYtPmRldmljZSwKKwkJCQkgICAgcmVjdi0+aGVhZGVyLm1hcHBpbmcsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaWJfbWFkX3ByaXZhdGUpIC0KKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGliX21hZF9wcml2YXRlX2hlYWRlciksCisJCQkJICAgIERNQV9GUk9NX0RFVklDRSk7CiAJCWttZW1fY2FjaGVfZnJlZShpYl9tYWRfY2FjaGUsIHJlY3YpOwogCX0KIApAQCAtMjc5OSw3ICsyNzk4LDcgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjg7CiAJfQotCUlOSVRfV09SSygmcG9ydF9wcml2LT53b3JrLCBpYl9tYWRfY29tcGxldGlvbl9oYW5kbGVyLCBwb3J0X3ByaXYpOworCUlOSVRfV09SSygmcG9ydF9wcml2LT53b3JrLCBpYl9tYWRfY29tcGxldGlvbl9oYW5kbGVyKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpYl9tYWRfcG9ydF9saXN0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZF90YWlsKCZwb3J0X3ByaXYtPnBvcnRfbGlzdCwgJmliX21hZF9wb3J0X2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkX3ByaXYuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZF9wcml2LmgKaW5kZXggZDA2YjU5MC4uZGU4OTcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkX3ByaXYuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWRfcHJpdi5oCkBAIC03Myw3ICs3Myw3IEBACiAJc3RydWN0IGliX21hZF9saXN0X2hlYWQgbWFkX2xpc3Q7CiAJc3RydWN0IGliX21hZF9yZWN2X3djIHJlY3Zfd2M7CiAJc3RydWN0IGliX3djIHdjOwotCURFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwcGluZykKKwl1NjQgbWFwcGluZzsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaWJfbWFkX3ByaXZhdGUgewpAQCAtMTAyLDcgKzEwMiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBzZW5kX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCB3YWl0X2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBkb25lX2xpc3Q7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHRpbWVkX3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0aW1lZF93b3JrOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxvY2FsX2xpc3Q7CiAJc3RydWN0IHdvcmtfc3RydWN0IGxvY2FsX3dvcms7CkBAIC0xMjYsOCArMTI2LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFnZW50X2xpc3Q7CiAJc3RydWN0IGliX21hZF9hZ2VudF9wcml2YXRlICptYWRfYWdlbnRfcHJpdjsKIAlzdHJ1Y3QgaWJfbWFkX3NlbmRfYnVmIHNlbmRfYnVmOwotCURFQ0xBUkVfUENJX1VOTUFQX0FERFIoaGVhZGVyX21hcHBpbmcpCi0JREVDTEFSRV9QQ0lfVU5NQVBfQUREUihwYXlsb2FkX21hcHBpbmcpCisJdTY0IGhlYWRlcl9tYXBwaW5nOworCXU2NCBwYXlsb2FkX21hcHBpbmc7CiAJc3RydWN0IGliX3NlbmRfd3Igc2VuZF93cjsKIAlzdHJ1Y3QgaWJfc2dlIHNnX2xpc3RbSUJfTUFEX1NFTkRfUkVRX01BWF9TR107CiAJX19iZTY0IHRpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZF9ybXBwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWRfcm1wcC5jCmluZGV4IDFlZjc5ZDAuLjM2NjNmZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL21hZF9ybXBwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkX3JtcHAuYwpAQCAtNDUsOCArNDUsOCBAQAogc3RydWN0IG1hZF9ybXBwX3JlY3YgewogCXN0cnVjdCBpYl9tYWRfYWdlbnRfcHJpdmF0ZSAqYWdlbnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCB3b3JrX3N0cnVjdCB0aW1lb3V0X3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGNsZWFudXBfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRpbWVvdXRfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGNsZWFudXBfd29yazsKIAlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOwogCWVudW0gcm1wcF9zdGF0ZSBzdGF0ZTsKIAlzcGlubG9ja190IGxvY2s7CkBAIC0yMzMsOSArMjMzLDEwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCByZWN2X3RpbWVvdXRfaGFuZGxlcih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgcmVjdl90aW1lb3V0X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBtYWRfcm1wcF9yZWN2ICpybXBwX3JlY3YgPSBkYXRhOworCXN0cnVjdCBtYWRfcm1wcF9yZWN2ICpybXBwX3JlY3YgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1hZF9ybXBwX3JlY3YsIHRpbWVvdXRfd29yay53b3JrKTsKIAlzdHJ1Y3QgaWJfbWFkX3JlY3Zfd2MgKnJtcHBfd2M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjU0LDkgKzI1NSwxMCBAQAogCWliX2ZyZWVfcmVjdl9tYWQocm1wcF93Yyk7CiB9CiAKLXN0YXRpYyB2b2lkIHJlY3ZfY2xlYW51cF9oYW5kbGVyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCByZWN2X2NsZWFudXBfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG1hZF9ybXBwX3JlY3YgKnJtcHBfcmVjdiA9IGRhdGE7CisJc3RydWN0IG1hZF9ybXBwX3JlY3YgKnJtcHBfcmVjdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWFkX3JtcHBfcmVjdiwgY2xlYW51cF93b3JrLndvcmspOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcm1wcF9yZWN2LT5hZ2VudC0+bG9jaywgZmxhZ3MpOwpAQCAtMjg1LDggKzI4Nyw4IEBACiAKIAlybXBwX3JlY3YtPmFnZW50ID0gYWdlbnQ7CiAJaW5pdF9jb21wbGV0aW9uKCZybXBwX3JlY3YtPmNvbXApOwotCUlOSVRfV09SSygmcm1wcF9yZWN2LT50aW1lb3V0X3dvcmssIHJlY3ZfdGltZW91dF9oYW5kbGVyLCBybXBwX3JlY3YpOwotCUlOSVRfV09SSygmcm1wcF9yZWN2LT5jbGVhbnVwX3dvcmssIHJlY3ZfY2xlYW51cF9oYW5kbGVyLCBybXBwX3JlY3YpOworCUlOSVRfREVMQVlFRF9XT1JLKCZybXBwX3JlY3YtPnRpbWVvdXRfd29yaywgcmVjdl90aW1lb3V0X2hhbmRsZXIpOworCUlOSVRfREVMQVlFRF9XT1JLKCZybXBwX3JlY3YtPmNsZWFudXBfd29yaywgcmVjdl9jbGVhbnVwX2hhbmRsZXIpOwogCXNwaW5fbG9ja19pbml0KCZybXBwX3JlY3YtPmxvY2spOwogCXJtcHBfcmVjdi0+c3RhdGUgPSBSTVBQX1NUQVRFX0FDVElWRTsKIAlhdG9taWNfc2V0KCZybXBwX3JlY3YtPnJlZmNvdW50LCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zYV9xdWVyeS5jCmluZGV4IDE3MDZkM2MuLmU0NWFmYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc2FfcXVlcnkuYwpAQCAtMzYwLDkgKzM2MCwxMCBAQAogCWtmcmVlKHNtX2FoKTsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX3NtX2FoKHZvaWQgKnBvcnRfcHRyKQorc3RhdGljIHZvaWQgdXBkYXRlX3NtX2FoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaWJfc2FfcG9ydCAqcG9ydCA9IHBvcnRfcHRyOworCXN0cnVjdCBpYl9zYV9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpYl9zYV9wb3J0LCB1cGRhdGVfdGFzayk7CiAJc3RydWN0IGliX3NhX3NtX2FoICpuZXdfYWgsICpvbGRfYWg7CiAJc3RydWN0IGliX3BvcnRfYXR0ciBwb3J0X2F0dHI7CiAJc3RydWN0IGliX2FoX2F0dHIgICBhaF9hdHRyOwpAQCAtOTkyLDggKzk5Myw3IEBACiAJCWlmIChJU19FUlIoc2FfZGV2LT5wb3J0W2ldLmFnZW50KSkKIAkJCWdvdG8gZXJyOwogCi0JCUlOSVRfV09SSygmc2FfZGV2LT5wb3J0W2ldLnVwZGF0ZV90YXNrLAotCQkJICB1cGRhdGVfc21fYWgsICZzYV9kZXYtPnBvcnRbaV0pOworCQlJTklUX1dPUksoJnNhX2Rldi0+cG9ydFtpXS51cGRhdGVfdGFzaywgdXBkYXRlX3NtX2FoKTsKIAl9CiAKIAlpYl9zZXRfY2xpZW50X2RhdGEoZGV2aWNlLCAmc2FfY2xpZW50LCBzYV9kZXYpOwpAQCAtMTAxMCw3ICsxMDEwLDcgQEAKIAkJZ290byBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDw9IGUgLSBzOyArK2kpCi0JCXVwZGF0ZV9zbV9haCgmc2FfZGV2LT5wb3J0W2ldKTsKKwkJdXBkYXRlX3NtX2FoKCZzYV9kZXYtPnBvcnRbaV0udXBkYXRlX3Rhc2spOwogCiAJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCmluZGV4IGFkNGY0ZDUuLmYxNTIyMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jCkBAIC0xNjEsMTIgKzE2MSwxNCBAQAogCQkJCSAgICBzdHJ1Y3QgaWJfdWNtX2V2ZW50LCBjdHhfbGlzdCk7CiAJCWxpc3RfZGVsKCZ1ZXZlbnQtPmZpbGVfbGlzdCk7CiAJCWxpc3RfZGVsKCZ1ZXZlbnQtPmN0eF9saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPmZpbGUtPmZpbGVfbXV0ZXgpOwogCiAJCS8qIGNsZWFyIGluY29taW5nIGNvbm5lY3Rpb25zLiAqLwogCQlpZiAoaWJfdWNtX25ld19jbV9pZCh1ZXZlbnQtPnJlc3AuZXZlbnQpKQogCQkJaWJfZGVzdHJveV9jbV9pZCh1ZXZlbnQtPmNtX2lkKTsKIAogCQlrZnJlZSh1ZXZlbnQpOworCQltdXRleF9sb2NrKCZjdHgtPmZpbGUtPmZpbGVfbXV0ZXgpOwogCX0KIAltdXRleF91bmxvY2soJmN0eC0+ZmlsZS0+ZmlsZV9tdXRleCk7CiB9CkBAIC0zMjgsMjAgKzMzMCwxOCBAQAogCX0KIAogCWlmICh1dnQtPmRhdGFfbGVuKSB7Ci0JCXV2dC0+ZGF0YSA9IGttYWxsb2ModXZ0LT5kYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CisJCXV2dC0+ZGF0YSA9IGttZW1kdXAoZXZ0LT5wcml2YXRlX2RhdGEsIHV2dC0+ZGF0YV9sZW4sIEdGUF9LRVJORUwpOwogCQlpZiAoIXV2dC0+ZGF0YSkKIAkJCWdvdG8gZXJyMTsKIAotCQltZW1jcHkodXZ0LT5kYXRhLCBldnQtPnByaXZhdGVfZGF0YSwgdXZ0LT5kYXRhX2xlbik7CiAJCXV2dC0+cmVzcC5wcmVzZW50IHw9IElCX1VDTV9QUkVTX0RBVEE7CiAJfQogCiAJaWYgKHV2dC0+aW5mb19sZW4pIHsKLQkJdXZ0LT5pbmZvID0ga21hbGxvYyh1dnQtPmluZm9fbGVuLCBHRlBfS0VSTkVMKTsKKwkJdXZ0LT5pbmZvID0ga21lbWR1cChpbmZvLCB1dnQtPmluZm9fbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1dnQtPmluZm8pCiAJCQlnb3RvIGVycjI7CiAKLQkJbWVtY3B5KHV2dC0+aW5mbywgaW5mbywgdXZ0LT5pbmZvX2xlbik7CiAJCXV2dC0+cmVzcC5wcmVzZW50IHw9IElCX1VDTV9QUkVTX0lORk87CiAJfQogCXJldHVybiAwOwpAQCAtNjg1LDExICs2ODUsMTEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgc3NpemVfdCBpYl91Y21fZXN0YWJsaXNoKHN0cnVjdCBpYl91Y21fZmlsZSAqZmlsZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqaW5idWYsCi0JCQkJaW50IGluX2xlbiwgaW50IG91dF9sZW4pCitzdGF0aWMgc3NpemVfdCBpYl91Y21fbm90aWZ5KHN0cnVjdCBpYl91Y21fZmlsZSAqZmlsZSwKKwkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKIHsKLQlzdHJ1Y3QgaWJfdWNtX2VzdGFibGlzaCBjbWQ7CisJc3RydWN0IGliX3VjbV9ub3RpZnkgY21kOwogCXN0cnVjdCBpYl91Y21fY29udGV4dCAqY3R4OwogCWludCByZXN1bHQ7CiAKQEAgLTcwMCw3ICs3MDAsNyBAQAogCWlmIChJU19FUlIoY3R4KSkKIAkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKIAotCXJlc3VsdCA9IGliX2NtX2VzdGFibGlzaChjdHgtPmNtX2lkKTsKKwlyZXN1bHQgPSBpYl9jbV9ub3RpZnkoY3R4LT5jbV9pZCwgKGVudW0gaWJfZXZlbnRfdHlwZSkgY21kLmV2ZW50KTsKIAlpYl91Y21fY3R4X3B1dChjdHgpOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMTA3LDcgKzExMDcsNyBAQAogCVtJQl9VU0VSX0NNX0NNRF9ERVNUUk9ZX0lEXSAgICA9IGliX3VjbV9kZXN0cm95X2lkLAogCVtJQl9VU0VSX0NNX0NNRF9BVFRSX0lEXSAgICAgICA9IGliX3VjbV9hdHRyX2lkLAogCVtJQl9VU0VSX0NNX0NNRF9MSVNURU5dICAgICAgICA9IGliX3VjbV9saXN0ZW4sCi0JW0lCX1VTRVJfQ01fQ01EX0VTVEFCTElTSF0gICAgID0gaWJfdWNtX2VzdGFibGlzaCwKKwlbSUJfVVNFUl9DTV9DTURfTk9USUZZXSAgICAgICAgPSBpYl91Y21fbm90aWZ5LAogCVtJQl9VU0VSX0NNX0NNRF9TRU5EX1JFUV0gICAgICA9IGliX3VjbV9zZW5kX3JlcSwKIAlbSUJfVVNFUl9DTV9DTURfU0VORF9SRVBdICAgICAgPSBpYl91Y21fc2VuZF9yZXAsCiAJW0lCX1VTRVJfQ01fQ01EX1NFTkRfUlRVXSAgICAgID0gaWJfdWNtX3NlbmRfcnR1LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTVjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y21hLmMKQEAgLTAsMCArMSw4NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKgljb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICoJZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICoJY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCWRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICoJcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKworI2luY2x1ZGUgPHJkbWEvcmRtYV91c2VyX2NtLmg+CisjaW5jbHVkZSA8cmRtYS9pYl9tYXJzaGFsbC5oPgorI2luY2x1ZGUgPHJkbWEvcmRtYV9jbS5oPgorCitNT0RVTEVfQVVUSE9SKCJTZWFuIEhlZnR5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJETUEgVXNlcnNwYWNlIENvbm5lY3Rpb24gTWFuYWdlciBBY2Nlc3MiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworZW51bSB7CisJVUNNQV9NQVhfQkFDS0xPRwk9IDEyOAorfTsKKworc3RydWN0IHVjbWFfZmlsZSB7CisJc3RydWN0IG11dGV4CQltdXQ7CisJc3RydWN0IGZpbGUJCSpmaWxwOworCXN0cnVjdCBsaXN0X2hlYWQJY3R4X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlldmVudF9saXN0OworCXdhaXRfcXVldWVfaGVhZF90CXBvbGxfd2FpdDsKK307CisKK3N0cnVjdCB1Y21hX2NvbnRleHQgeworCWludAkJCWlkOworCXN0cnVjdCBjb21wbGV0aW9uCWNvbXA7CisJYXRvbWljX3QJCXJlZjsKKwlpbnQJCQlldmVudHNfcmVwb3J0ZWQ7CisJaW50CQkJYmFja2xvZzsKKworCXN0cnVjdCB1Y21hX2ZpbGUJKmZpbGU7CisJc3RydWN0IHJkbWFfY21faWQJKmNtX2lkOworCXU2NAkJCXVpZDsKKworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKK307CisKK3N0cnVjdCB1Y21hX2V2ZW50IHsKKwlzdHJ1Y3QgdWNtYV9jb250ZXh0CSpjdHg7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCByZG1hX2NtX2lkCSpjbV9pZDsKKwlzdHJ1Y3QgcmRtYV91Y21fZXZlbnRfcmVzcCByZXNwOworfTsKKworc3RhdGljIERFRklORV9NVVRFWChtdXQpOworc3RhdGljIERFRklORV9JRFIoY3R4X2lkcik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVjbWFfY29udGV4dCAqX3VjbWFfZmluZF9jb250ZXh0KGludCBpZCwKKwkJCQkJCSAgICAgIHN0cnVjdCB1Y21hX2ZpbGUgKmZpbGUpCit7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCisJY3R4ID0gaWRyX2ZpbmQoJmN0eF9pZHIsIGlkKTsKKwlpZiAoIWN0eCkKKwkJY3R4ID0gRVJSX1BUUigtRU5PRU5UKTsKKwllbHNlIGlmIChjdHgtPmZpbGUgIT0gZmlsZSkKKwkJY3R4ID0gRVJSX1BUUigtRUlOVkFMKTsKKwlyZXR1cm4gY3R4OworfQorCitzdGF0aWMgc3RydWN0IHVjbWFfY29udGV4dCAqdWNtYV9nZXRfY3R4KHN0cnVjdCB1Y21hX2ZpbGUgKmZpbGUsIGludCBpZCkKK3sKKwlzdHJ1Y3QgdWNtYV9jb250ZXh0ICpjdHg7CisKKwltdXRleF9sb2NrKCZtdXQpOworCWN0eCA9IF91Y21hX2ZpbmRfY29udGV4dChpZCwgZmlsZSk7CisJaWYgKCFJU19FUlIoY3R4KSkKKwkJYXRvbWljX2luYygmY3R4LT5yZWYpOworCW11dGV4X3VubG9jaygmbXV0KTsKKwlyZXR1cm4gY3R4OworfQorCitzdGF0aWMgdm9pZCB1Y21hX3B1dF9jdHgoc3RydWN0IHVjbWFfY29udGV4dCAqY3R4KQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjdHgtPnJlZikpCisJCWNvbXBsZXRlKCZjdHgtPmNvbXApOworfQorCitzdGF0aWMgc3RydWN0IHVjbWFfY29udGV4dCAqdWNtYV9hbGxvY19jdHgoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdWNtYV9jb250ZXh0ICpjdHg7CisJaW50IHJldDsKKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhdG9taWNfc2V0KCZjdHgtPnJlZiwgMSk7CisJaW5pdF9jb21wbGV0aW9uKCZjdHgtPmNvbXApOworCWN0eC0+ZmlsZSA9IGZpbGU7CisKKwlkbyB7CisJCXJldCA9IGlkcl9wcmVfZ2V0KCZjdHhfaWRyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZXQpCisJCQlnb3RvIGVycm9yOworCisJCW11dGV4X2xvY2soJm11dCk7CisJCXJldCA9IGlkcl9nZXRfbmV3KCZjdHhfaWRyLCBjdHgsICZjdHgtPmlkKTsKKwkJbXV0ZXhfdW5sb2NrKCZtdXQpOworCX0gd2hpbGUgKHJldCA9PSAtRUFHQUlOKTsKKworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlsaXN0X2FkZF90YWlsKCZjdHgtPmxpc3QsICZmaWxlLT5jdHhfbGlzdCk7CisJcmV0dXJuIGN0eDsKKworZXJyb3I6CisJa2ZyZWUoY3R4KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdWNtYV9jb3B5X2Nvbm5fZXZlbnQoc3RydWN0IHJkbWFfdWNtX2Nvbm5fcGFyYW0gKmRzdCwKKwkJCQkgc3RydWN0IHJkbWFfY29ubl9wYXJhbSAqc3JjKQoreworCWlmIChzcmMtPnByaXZhdGVfZGF0YV9sZW4pCisJCW1lbWNweShkc3QtPnByaXZhdGVfZGF0YSwgc3JjLT5wcml2YXRlX2RhdGEsCisJCSAgICAgICBzcmMtPnByaXZhdGVfZGF0YV9sZW4pOworCWRzdC0+cHJpdmF0ZV9kYXRhX2xlbiA9IHNyYy0+cHJpdmF0ZV9kYXRhX2xlbjsKKwlkc3QtPnJlc3BvbmRlcl9yZXNvdXJjZXMgPXNyYy0+cmVzcG9uZGVyX3Jlc291cmNlczsKKwlkc3QtPmluaXRpYXRvcl9kZXB0aCA9IHNyYy0+aW5pdGlhdG9yX2RlcHRoOworCWRzdC0+Zmxvd19jb250cm9sID0gc3JjLT5mbG93X2NvbnRyb2w7CisJZHN0LT5yZXRyeV9jb3VudCA9IHNyYy0+cmV0cnlfY291bnQ7CisJZHN0LT5ybnJfcmV0cnlfY291bnQgPSBzcmMtPnJucl9yZXRyeV9jb3VudDsKKwlkc3QtPnNycSA9IHNyYy0+c3JxOworCWRzdC0+cXBfbnVtID0gc3JjLT5xcF9udW07Cit9CisKK3N0YXRpYyB2b2lkIHVjbWFfY29weV91ZF9ldmVudChzdHJ1Y3QgcmRtYV91Y21fdWRfcGFyYW0gKmRzdCwKKwkJCSAgICAgICBzdHJ1Y3QgcmRtYV91ZF9wYXJhbSAqc3JjKQoreworCWlmIChzcmMtPnByaXZhdGVfZGF0YV9sZW4pCisJCW1lbWNweShkc3QtPnByaXZhdGVfZGF0YSwgc3JjLT5wcml2YXRlX2RhdGEsCisJCSAgICAgICBzcmMtPnByaXZhdGVfZGF0YV9sZW4pOworCWRzdC0+cHJpdmF0ZV9kYXRhX2xlbiA9IHNyYy0+cHJpdmF0ZV9kYXRhX2xlbjsKKwlpYl9jb3B5X2FoX2F0dHJfdG9fdXNlcigmZHN0LT5haF9hdHRyLCAmc3JjLT5haF9hdHRyKTsKKwlkc3QtPnFwX251bSA9IHNyYy0+cXBfbnVtOworCWRzdC0+cWtleSA9IHNyYy0+cWtleTsKK30KKworc3RhdGljIHZvaWQgdWNtYV9zZXRfZXZlbnRfY29udGV4dChzdHJ1Y3QgdWNtYV9jb250ZXh0ICpjdHgsCisJCQkJICAgc3RydWN0IHJkbWFfY21fZXZlbnQgKmV2ZW50LAorCQkJCSAgIHN0cnVjdCB1Y21hX2V2ZW50ICp1ZXZlbnQpCit7CisJdWV2ZW50LT5jdHggPSBjdHg7CisJdWV2ZW50LT5yZXNwLnVpZCA9IGN0eC0+dWlkOworCXVldmVudC0+cmVzcC5pZCA9IGN0eC0+aWQ7Cit9CisKK3N0YXRpYyBpbnQgdWNtYV9ldmVudF9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbV9pZCwKKwkJCSAgICAgIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgdWNtYV9ldmVudCAqdWV2ZW50OworCXN0cnVjdCB1Y21hX2NvbnRleHQgKmN0eCA9IGNtX2lkLT5jb250ZXh0OworCWludCByZXQgPSAwOworCisJdWV2ZW50ID0ga3phbGxvYyhzaXplb2YoKnVldmVudCksIEdGUF9LRVJORUwpOworCWlmICghdWV2ZW50KQorCQlyZXR1cm4gZXZlbnQtPmV2ZW50ID09IFJETUFfQ01fRVZFTlRfQ09OTkVDVF9SRVFVRVNUOworCisJdWV2ZW50LT5jbV9pZCA9IGNtX2lkOworCXVjbWFfc2V0X2V2ZW50X2NvbnRleHQoY3R4LCBldmVudCwgdWV2ZW50KTsKKwl1ZXZlbnQtPnJlc3AuZXZlbnQgPSBldmVudC0+ZXZlbnQ7CisJdWV2ZW50LT5yZXNwLnN0YXR1cyA9IGV2ZW50LT5zdGF0dXM7CisJaWYgKGNtX2lkLT5wcyA9PSBSRE1BX1BTX1VEUCkKKwkJdWNtYV9jb3B5X3VkX2V2ZW50KCZ1ZXZlbnQtPnJlc3AucGFyYW0udWQsICZldmVudC0+cGFyYW0udWQpOworCWVsc2UKKwkJdWNtYV9jb3B5X2Nvbm5fZXZlbnQoJnVldmVudC0+cmVzcC5wYXJhbS5jb25uLAorCQkJCSAgICAgJmV2ZW50LT5wYXJhbS5jb25uKTsKKworCW11dGV4X2xvY2soJmN0eC0+ZmlsZS0+bXV0KTsKKwlpZiAoZXZlbnQtPmV2ZW50ID09IFJETUFfQ01fRVZFTlRfQ09OTkVDVF9SRVFVRVNUKSB7CisJCWlmICghY3R4LT5iYWNrbG9nKSB7CisJCQlyZXQgPSAtRURRVU9UOworCQkJZ290byBvdXQ7CisJCX0KKwkJY3R4LT5iYWNrbG9nLS07CisJfQorCWxpc3RfYWRkX3RhaWwoJnVldmVudC0+bGlzdCwgJmN0eC0+ZmlsZS0+ZXZlbnRfbGlzdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHgtPmZpbGUtPnBvbGxfd2FpdCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjdHgtPmZpbGUtPm11dCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9nZXRfZXZlbnQoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJICAgICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCXN0cnVjdCByZG1hX3VjbV9nZXRfZXZlbnQgY21kOworCXN0cnVjdCB1Y21hX2V2ZW50ICp1ZXZlbnQ7CisJaW50IHJldCA9IDA7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiB1ZXZlbnQtPnJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGluYnVmLCBzaXplb2YoY21kKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbXV0ZXhfbG9jaygmZmlsZS0+bXV0KTsKKwl3aGlsZSAobGlzdF9lbXB0eSgmZmlsZS0+ZXZlbnRfbGlzdCkpIHsKKwkJaWYgKGZpbGUtPmZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJlcGFyZV90b193YWl0KCZmaWxlLT5wb2xsX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQltdXRleF91bmxvY2soJmZpbGUtPm11dCk7CisJCXNjaGVkdWxlKCk7CisJCW11dGV4X2xvY2soJmZpbGUtPm11dCk7CisJCWZpbmlzaF93YWl0KCZmaWxlLT5wb2xsX3dhaXQsICZ3YWl0KTsKKwl9CisKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwl1ZXZlbnQgPSBsaXN0X2VudHJ5KGZpbGUtPmV2ZW50X2xpc3QubmV4dCwgc3RydWN0IHVjbWFfZXZlbnQsIGxpc3QpOworCisJaWYgKHVldmVudC0+cmVzcC5ldmVudCA9PSBSRE1BX0NNX0VWRU5UX0NPTk5FQ1RfUkVRVUVTVCkgeworCQljdHggPSB1Y21hX2FsbG9jX2N0eChmaWxlKTsKKwkJaWYgKCFjdHgpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJdWV2ZW50LT5jdHgtPmJhY2tsb2crKzsKKwkJY3R4LT5jbV9pZCA9IHVldmVudC0+Y21faWQ7CisJCWN0eC0+Y21faWQtPmNvbnRleHQgPSBjdHg7CisJCXVldmVudC0+cmVzcC5pZCA9IGN0eC0+aWQ7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljbWQucmVzcG9uc2UsCisJCQkgJnVldmVudC0+cmVzcCwgc2l6ZW9mIHVldmVudC0+cmVzcCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBkb25lOworCX0KKworCWxpc3RfZGVsKCZ1ZXZlbnQtPmxpc3QpOworCXVldmVudC0+Y3R4LT5ldmVudHNfcmVwb3J0ZWQrKzsKKwlrZnJlZSh1ZXZlbnQpOworZG9uZToKKwltdXRleF91bmxvY2soJmZpbGUtPm11dCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9jcmVhdGVfaWQoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwKKwkJCQljb25zdCBjaGFyIF9fdXNlciAqaW5idWYsCisJCQkJaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IHJkbWFfdWNtX2NyZWF0ZV9pZCBjbWQ7CisJc3RydWN0IHJkbWFfdWNtX2NyZWF0ZV9pZF9yZXNwIHJlc3A7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZihyZXNwKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgaW5idWYsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltdXRleF9sb2NrKCZmaWxlLT5tdXQpOworCWN0eCA9IHVjbWFfYWxsb2NfY3R4KGZpbGUpOworCW11dGV4X3VubG9jaygmZmlsZS0+bXV0KTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljdHgtPnVpZCA9IGNtZC51aWQ7CisJY3R4LT5jbV9pZCA9IHJkbWFfY3JlYXRlX2lkKHVjbWFfZXZlbnRfaGFuZGxlciwgY3R4LCBjbWQucHMpOworCWlmIChJU19FUlIoY3R4LT5jbV9pZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihjdHgtPmNtX2lkKTsKKwkJZ290byBlcnIxOworCX0KKworCXJlc3AuaWQgPSBjdHgtPmlkOworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YocmVzcCkpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyMjsKKwl9CisJcmV0dXJuIDA7CisKK2VycjI6CisJcmRtYV9kZXN0cm95X2lkKGN0eC0+Y21faWQpOworZXJyMToKKwltdXRleF9sb2NrKCZtdXQpOworCWlkcl9yZW1vdmUoJmN0eF9pZHIsIGN0eC0+aWQpOworCW11dGV4X3VubG9jaygmbXV0KTsKKwlrZnJlZShjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVjbWFfY2xlYW51cF9ldmVudHMoc3RydWN0IHVjbWFfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCB1Y21hX2V2ZW50ICp1ZXZlbnQsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodWV2ZW50LCB0bXAsICZjdHgtPmZpbGUtPmV2ZW50X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHVldmVudC0+Y3R4ICE9IGN0eCkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKCZ1ZXZlbnQtPmxpc3QpOworCisJCS8qIGNsZWFyIGluY29taW5nIGNvbm5lY3Rpb25zLiAqLworCQlpZiAodWV2ZW50LT5yZXNwLmV2ZW50ID09IFJETUFfQ01fRVZFTlRfQ09OTkVDVF9SRVFVRVNUKQorCQkJcmRtYV9kZXN0cm95X2lkKHVldmVudC0+Y21faWQpOworCisJCWtmcmVlKHVldmVudCk7CisJfQorfQorCitzdGF0aWMgaW50IHVjbWFfZnJlZV9jdHgoc3RydWN0IHVjbWFfY29udGV4dCAqY3R4KQoreworCWludCBldmVudHNfcmVwb3J0ZWQ7CisKKwkvKiBObyBuZXcgZXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkIGFmdGVyIGRlc3Ryb3lpbmcgdGhlIGlkLiAqLworCXJkbWFfZGVzdHJveV9pZChjdHgtPmNtX2lkKTsKKworCS8qIENsZWFudXAgZXZlbnRzIG5vdCB5ZXQgcmVwb3J0ZWQgdG8gdGhlIHVzZXIuICovCisJbXV0ZXhfbG9jaygmY3R4LT5maWxlLT5tdXQpOworCXVjbWFfY2xlYW51cF9ldmVudHMoY3R4KTsKKwlsaXN0X2RlbCgmY3R4LT5saXN0KTsKKwltdXRleF91bmxvY2soJmN0eC0+ZmlsZS0+bXV0KTsKKworCWV2ZW50c19yZXBvcnRlZCA9IGN0eC0+ZXZlbnRzX3JlcG9ydGVkOworCWtmcmVlKGN0eCk7CisJcmV0dXJuIGV2ZW50c19yZXBvcnRlZDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9kZXN0cm95X2lkKHN0cnVjdCB1Y21hX2ZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICppbmJ1ZiwKKwkJCSAgICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgcmRtYV91Y21fZGVzdHJveV9pZCBjbWQ7CisJc3RydWN0IHJkbWFfdWNtX2Rlc3Ryb3lfaWRfcmVzcCByZXNwOworCXN0cnVjdCB1Y21hX2NvbnRleHQgKmN0eDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mKHJlc3ApKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBpbmJ1Ziwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW11dGV4X2xvY2soJm11dCk7CisJY3R4ID0gX3VjbWFfZmluZF9jb250ZXh0KGNtZC5pZCwgZmlsZSk7CisJaWYgKCFJU19FUlIoY3R4KSkKKwkJaWRyX3JlbW92ZSgmY3R4X2lkciwgY3R4LT5pZCk7CisJbXV0ZXhfdW5sb2NrKCZtdXQpOworCisJaWYgKElTX0VSUihjdHgpKQorCQlyZXR1cm4gUFRSX0VSUihjdHgpOworCisJdWNtYV9wdXRfY3R4KGN0eCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY3R4LT5jb21wKTsKKwlyZXNwLmV2ZW50c19yZXBvcnRlZCA9IHVjbWFfZnJlZV9jdHgoY3R4KTsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YocmVzcCkpKQorCQlyZXQgPSAtRUZBVUxUOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9iaW5kX2FkZHIoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJICAgICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IHJkbWFfdWNtX2JpbmRfYWRkciBjbWQ7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgaW5idWYsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljdHggPSB1Y21hX2dldF9jdHgoZmlsZSwgY21kLmlkKTsKKwlpZiAoSVNfRVJSKGN0eCkpCisJCXJldHVybiBQVFJfRVJSKGN0eCk7CisKKwlyZXQgPSByZG1hX2JpbmRfYWRkcihjdHgtPmNtX2lkLCAoc3RydWN0IHNvY2thZGRyICopICZjbWQuYWRkcik7CisJdWNtYV9wdXRfY3R4KGN0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9yZXNvbHZlX2FkZHIoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJCSBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgcmRtYV91Y21fcmVzb2x2ZV9hZGRyIGNtZDsKKwlzdHJ1Y3QgdWNtYV9jb250ZXh0ICpjdHg7CisJaW50IHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBpbmJ1Ziwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWN0eCA9IHVjbWFfZ2V0X2N0eChmaWxlLCBjbWQuaWQpOworCWlmIChJU19FUlIoY3R4KSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKKworCXJldCA9IHJkbWFfcmVzb2x2ZV9hZGRyKGN0eC0+Y21faWQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNtZC5zcmNfYWRkciwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopICZjbWQuZHN0X2FkZHIsCisJCQkJY21kLnRpbWVvdXRfbXMpOworCXVjbWFfcHV0X2N0eChjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHVjbWFfcmVzb2x2ZV9yb3V0ZShzdHJ1Y3QgdWNtYV9maWxlICpmaWxlLAorCQkJCSAgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJCSAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IHJkbWFfdWNtX3Jlc29sdmVfcm91dGUgY21kOworCXN0cnVjdCB1Y21hX2NvbnRleHQgKmN0eDsKKwlpbnQgcmV0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGluYnVmLCBzaXplb2YoY21kKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJY3R4ID0gdWNtYV9nZXRfY3R4KGZpbGUsIGNtZC5pZCk7CisJaWYgKElTX0VSUihjdHgpKQorCQlyZXR1cm4gUFRSX0VSUihjdHgpOworCisJcmV0ID0gcmRtYV9yZXNvbHZlX3JvdXRlKGN0eC0+Y21faWQsIGNtZC50aW1lb3V0X21zKTsKKwl1Y21hX3B1dF9jdHgoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1Y21hX2NvcHlfaWJfcm91dGUoc3RydWN0IHJkbWFfdWNtX3F1ZXJ5X3JvdXRlX3Jlc3AgKnJlc3AsCisJCQkgICAgICAgc3RydWN0IHJkbWFfcm91dGUgKnJvdXRlKQoreworCXN0cnVjdCByZG1hX2Rldl9hZGRyICpkZXZfYWRkcjsKKworCXJlc3AtPm51bV9wYXRocyA9IHJvdXRlLT5udW1fcGF0aHM7CisJc3dpdGNoIChyb3V0ZS0+bnVtX3BhdGhzKSB7CisJY2FzZSAwOgorCQlkZXZfYWRkciA9ICZyb3V0ZS0+YWRkci5kZXZfYWRkcjsKKwkJaWJfYWRkcl9nZXRfZGdpZChkZXZfYWRkciwKKwkJCQkgKHVuaW9uIGliX2dpZCAqKSAmcmVzcC0+aWJfcm91dGVbMF0uZGdpZCk7CisJCWliX2FkZHJfZ2V0X3NnaWQoZGV2X2FkZHIsCisJCQkJICh1bmlvbiBpYl9naWQgKikgJnJlc3AtPmliX3JvdXRlWzBdLnNnaWQpOworCQlyZXNwLT5pYl9yb3V0ZVswXS5wa2V5ID0gY3B1X3RvX2JlMTYoaWJfYWRkcl9nZXRfcGtleShkZXZfYWRkcikpOworCQlicmVhazsKKwljYXNlIDI6CisJCWliX2NvcHlfcGF0aF9yZWNfdG9fdXNlcigmcmVzcC0+aWJfcm91dGVbMV0sCisJCQkJCSAmcm91dGUtPnBhdGhfcmVjWzFdKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQlpYl9jb3B5X3BhdGhfcmVjX3RvX3VzZXIoJnJlc3AtPmliX3JvdXRlWzBdLAorCQkJCQkgJnJvdXRlLT5wYXRoX3JlY1swXSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9xdWVyeV9yb3V0ZShzdHJ1Y3QgdWNtYV9maWxlICpmaWxlLAorCQkJCWNvbnN0IGNoYXIgX191c2VyICppbmJ1ZiwKKwkJCQlpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgcmRtYV91Y21fcXVlcnlfcm91dGUgY21kOworCXN0cnVjdCByZG1hX3VjbV9xdWVyeV9yb3V0ZV9yZXNwIHJlc3A7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCXN0cnVjdCBzb2NrYWRkciAqYWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mKHJlc3ApKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBpbmJ1Ziwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWN0eCA9IHVjbWFfZ2V0X2N0eChmaWxlLCBjbWQuaWQpOworCWlmIChJU19FUlIoY3R4KSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCWFkZHIgPSAmY3R4LT5jbV9pZC0+cm91dGUuYWRkci5zcmNfYWRkcjsKKwltZW1jcHkoJnJlc3Auc3JjX2FkZHIsIGFkZHIsIGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUID8KKwkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIDoKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJYWRkciA9ICZjdHgtPmNtX2lkLT5yb3V0ZS5hZGRyLmRzdF9hZGRyOworCW1lbWNweSgmcmVzcC5kc3RfYWRkciwgYWRkciwgYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQgPworCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgOgorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKKwlpZiAoIWN0eC0+Y21faWQtPmRldmljZSkKKwkJZ290byBvdXQ7CisKKwlyZXNwLm5vZGVfZ3VpZCA9IGN0eC0+Y21faWQtPmRldmljZS0+bm9kZV9ndWlkOworCXJlc3AucG9ydF9udW0gPSBjdHgtPmNtX2lkLT5wb3J0X251bTsKKwlzd2l0Y2ggKHJkbWFfbm9kZV9nZXRfdHJhbnNwb3J0KGN0eC0+Y21faWQtPmRldmljZS0+bm9kZV90eXBlKSkgeworCWNhc2UgUkRNQV9UUkFOU1BPUlRfSUI6CisJCXVjbWFfY29weV9pYl9yb3V0ZSgmcmVzcCwgJmN0eC0+Y21faWQtPnJvdXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZihyZXNwKSkpCisJCXJldCA9IC1FRkFVTFQ7CisKKwl1Y21hX3B1dF9jdHgoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1Y21hX2NvcHlfY29ubl9wYXJhbShzdHJ1Y3QgcmRtYV9jb25uX3BhcmFtICpkc3QsCisJCQkJIHN0cnVjdCByZG1hX3VjbV9jb25uX3BhcmFtICpzcmMpCit7CisJZHN0LT5wcml2YXRlX2RhdGEgPSBzcmMtPnByaXZhdGVfZGF0YTsKKwlkc3QtPnByaXZhdGVfZGF0YV9sZW4gPSBzcmMtPnByaXZhdGVfZGF0YV9sZW47CisJZHN0LT5yZXNwb25kZXJfcmVzb3VyY2VzID1zcmMtPnJlc3BvbmRlcl9yZXNvdXJjZXM7CisJZHN0LT5pbml0aWF0b3JfZGVwdGggPSBzcmMtPmluaXRpYXRvcl9kZXB0aDsKKwlkc3QtPmZsb3dfY29udHJvbCA9IHNyYy0+Zmxvd19jb250cm9sOworCWRzdC0+cmV0cnlfY291bnQgPSBzcmMtPnJldHJ5X2NvdW50OworCWRzdC0+cm5yX3JldHJ5X2NvdW50ID0gc3JjLT5ybnJfcmV0cnlfY291bnQ7CisJZHN0LT5zcnEgPSBzcmMtPnNycTsKKwlkc3QtPnFwX251bSA9IHNyYy0+cXBfbnVtOworfQorCitzdGF0aWMgc3NpemVfdCB1Y21hX2Nvbm5lY3Qoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCByZG1hX3VjbV9jb25uZWN0IGNtZDsKKwlzdHJ1Y3QgcmRtYV9jb25uX3BhcmFtIGNvbm5fcGFyYW07CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgaW5idWYsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWNtZC5jb25uX3BhcmFtLnZhbGlkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0eCA9IHVjbWFfZ2V0X2N0eChmaWxlLCBjbWQuaWQpOworCWlmIChJU19FUlIoY3R4KSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKKworCXVjbWFfY29weV9jb25uX3BhcmFtKCZjb25uX3BhcmFtLCAmY21kLmNvbm5fcGFyYW0pOworCXJldCA9IHJkbWFfY29ubmVjdChjdHgtPmNtX2lkLCAmY29ubl9wYXJhbSk7CisJdWNtYV9wdXRfY3R4KGN0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9saXN0ZW4oc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IHJkbWFfdWNtX2xpc3RlbiBjbWQ7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgaW5idWYsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljdHggPSB1Y21hX2dldF9jdHgoZmlsZSwgY21kLmlkKTsKKwlpZiAoSVNfRVJSKGN0eCkpCisJCXJldHVybiBQVFJfRVJSKGN0eCk7CisKKwljdHgtPmJhY2tsb2cgPSBjbWQuYmFja2xvZyA+IDAgJiYgY21kLmJhY2tsb2cgPCBVQ01BX01BWF9CQUNLTE9HID8KKwkJICAgICAgIGNtZC5iYWNrbG9nIDogVUNNQV9NQVhfQkFDS0xPRzsKKwlyZXQgPSByZG1hX2xpc3RlbihjdHgtPmNtX2lkLCBjdHgtPmJhY2tsb2cpOworCXVjbWFfcHV0X2N0eChjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHVjbWFfYWNjZXB0KHN0cnVjdCB1Y21hX2ZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICppbmJ1ZiwKKwkJCSAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCByZG1hX3VjbV9hY2NlcHQgY21kOworCXN0cnVjdCByZG1hX2Nvbm5fcGFyYW0gY29ubl9wYXJhbTsKKwlzdHJ1Y3QgdWNtYV9jb250ZXh0ICpjdHg7CisJaW50IHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBpbmJ1Ziwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWN0eCA9IHVjbWFfZ2V0X2N0eChmaWxlLCBjbWQuaWQpOworCWlmIChJU19FUlIoY3R4KSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4KTsKKworCWlmIChjbWQuY29ubl9wYXJhbS52YWxpZCkgeworCQljdHgtPnVpZCA9IGNtZC51aWQ7CisJCXVjbWFfY29weV9jb25uX3BhcmFtKCZjb25uX3BhcmFtLCAmY21kLmNvbm5fcGFyYW0pOworCQlyZXQgPSByZG1hX2FjY2VwdChjdHgtPmNtX2lkLCAmY29ubl9wYXJhbSk7CisJfSBlbHNlCisJCXJldCA9IHJkbWFfYWNjZXB0KGN0eC0+Y21faWQsIE5VTEwpOworCisJdWNtYV9wdXRfY3R4KGN0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9yZWplY3Qoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IHJkbWFfdWNtX3JlamVjdCBjbWQ7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgaW5idWYsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljdHggPSB1Y21hX2dldF9jdHgoZmlsZSwgY21kLmlkKTsKKwlpZiAoSVNfRVJSKGN0eCkpCisJCXJldHVybiBQVFJfRVJSKGN0eCk7CisKKwlyZXQgPSByZG1hX3JlamVjdChjdHgtPmNtX2lkLCBjbWQucHJpdmF0ZV9kYXRhLCBjbWQucHJpdmF0ZV9kYXRhX2xlbik7CisJdWNtYV9wdXRfY3R4KGN0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9kaXNjb25uZWN0KHN0cnVjdCB1Y21hX2ZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICppbmJ1ZiwKKwkJCSAgICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgcmRtYV91Y21fZGlzY29ubmVjdCBjbWQ7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgaW5idWYsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljdHggPSB1Y21hX2dldF9jdHgoZmlsZSwgY21kLmlkKTsKKwlpZiAoSVNfRVJSKGN0eCkpCisJCXJldHVybiBQVFJfRVJSKGN0eCk7CisKKwlyZXQgPSByZG1hX2Rpc2Nvbm5lY3QoY3R4LT5jbV9pZCk7CisJdWNtYV9wdXRfY3R4KGN0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9pbml0X3FwX2F0dHIoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJCSBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgcmRtYV91Y21faW5pdF9xcF9hdHRyIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3FwX2F0dHIgcmVzcDsKKwlzdHJ1Y3QgdWNtYV9jb250ZXh0ICpjdHg7CisJc3RydWN0IGliX3FwX2F0dHIgcXBfYXR0cjsKKwlpbnQgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YocmVzcCkpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGluYnVmLCBzaXplb2YoY21kKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJY3R4ID0gdWNtYV9nZXRfY3R4KGZpbGUsIGNtZC5pZCk7CisJaWYgKElTX0VSUihjdHgpKQorCQlyZXR1cm4gUFRSX0VSUihjdHgpOworCisJcmVzcC5xcF9hdHRyX21hc2sgPSAwOworCW1lbXNldCgmcXBfYXR0ciwgMCwgc2l6ZW9mIHFwX2F0dHIpOworCXFwX2F0dHIucXBfc3RhdGUgPSBjbWQucXBfc3RhdGU7CisJcmV0ID0gcmRtYV9pbml0X3FwX2F0dHIoY3R4LT5jbV9pZCwgJnFwX2F0dHIsICZyZXNwLnFwX2F0dHJfbWFzayk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpYl9jb3B5X3FwX2F0dHJfdG9fdXNlcigmcmVzcCwgJnFwX2F0dHIpOworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YocmVzcCkpKQorCQlyZXQgPSAtRUZBVUxUOworCitvdXQ6CisJdWNtYV9wdXRfY3R4KGN0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdWNtYV9ub3RpZnkoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmluYnVmLAorCQkJICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IHJkbWFfdWNtX25vdGlmeSBjbWQ7CisJc3RydWN0IHVjbWFfY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgaW5idWYsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljdHggPSB1Y21hX2dldF9jdHgoZmlsZSwgY21kLmlkKTsKKwlpZiAoSVNfRVJSKGN0eCkpCisJCXJldHVybiBQVFJfRVJSKGN0eCk7CisKKwlyZXQgPSByZG1hX25vdGlmeShjdHgtPmNtX2lkLCAoZW51bSBpYl9ldmVudF90eXBlKSBjbWQuZXZlbnQpOworCXVjbWFfcHV0X2N0eChjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90ICgqdWNtYV9jbWRfdGFibGVbXSkoc3RydWN0IHVjbWFfZmlsZSAqZmlsZSwKKwkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqaW5idWYsCisJCQkJICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pID0geworCVtSRE1BX1VTRVJfQ01fQ01EX0NSRUFURV9JRF0JPSB1Y21hX2NyZWF0ZV9pZCwKKwlbUkRNQV9VU0VSX0NNX0NNRF9ERVNUUk9ZX0lEXQk9IHVjbWFfZGVzdHJveV9pZCwKKwlbUkRNQV9VU0VSX0NNX0NNRF9CSU5EX0FERFJdCT0gdWNtYV9iaW5kX2FkZHIsCisJW1JETUFfVVNFUl9DTV9DTURfUkVTT0xWRV9BRERSXQk9IHVjbWFfcmVzb2x2ZV9hZGRyLAorCVtSRE1BX1VTRVJfQ01fQ01EX1JFU09MVkVfUk9VVEVdPSB1Y21hX3Jlc29sdmVfcm91dGUsCisJW1JETUFfVVNFUl9DTV9DTURfUVVFUllfUk9VVEVdCT0gdWNtYV9xdWVyeV9yb3V0ZSwKKwlbUkRNQV9VU0VSX0NNX0NNRF9DT05ORUNUXQk9IHVjbWFfY29ubmVjdCwKKwlbUkRNQV9VU0VSX0NNX0NNRF9MSVNURU5dCT0gdWNtYV9saXN0ZW4sCisJW1JETUFfVVNFUl9DTV9DTURfQUNDRVBUXQk9IHVjbWFfYWNjZXB0LAorCVtSRE1BX1VTRVJfQ01fQ01EX1JFSkVDVF0JPSB1Y21hX3JlamVjdCwKKwlbUkRNQV9VU0VSX0NNX0NNRF9ESVNDT05ORUNUXQk9IHVjbWFfZGlzY29ubmVjdCwKKwlbUkRNQV9VU0VSX0NNX0NNRF9JTklUX1FQX0FUVFJdCT0gdWNtYV9pbml0X3FwX2F0dHIsCisJW1JETUFfVVNFUl9DTV9DTURfR0VUX0VWRU5UXQk9IHVjbWFfZ2V0X2V2ZW50LAorCVtSRE1BX1VTRVJfQ01fQ01EX0dFVF9PUFRJT05dCT0gTlVMTCwKKwlbUkRNQV9VU0VSX0NNX0NNRF9TRVRfT1BUSU9OXQk9IE5VTEwsCisJW1JETUFfVVNFUl9DTV9DTURfTk9USUZZXQk9IHVjbWFfbm90aWZ5LAorfTsKKworc3RhdGljIHNzaXplX3QgdWNtYV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHVjbWFfZmlsZSAqZmlsZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcmRtYV91Y21fY21kX2hkciBoZHI7CisJc3NpemVfdCByZXQ7CisKKwlpZiAobGVuIDwgc2l6ZW9mKGhkcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsIGJ1Ziwgc2l6ZW9mKGhkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChoZHIuY21kIDwgMCB8fCBoZHIuY21kID49IEFSUkFZX1NJWkUodWNtYV9jbWRfdGFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChoZHIuaW4gKyBzaXplb2YoaGRyKSA+IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXVjbWFfY21kX3RhYmxlW2hkci5jbWRdKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXJldCA9IHVjbWFfY21kX3RhYmxlW2hkci5jbWRdKGZpbGUsIGJ1ZiArIHNpemVvZihoZHIpLCBoZHIuaW4sIGhkci5vdXQpOworCWlmICghcmV0KQorCQlyZXQgPSBsZW47CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHVjbWFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCB1Y21hX2ZpbGUgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJcG9sbF93YWl0KGZpbHAsICZmaWxlLT5wb2xsX3dhaXQsIHdhaXQpOworCisJaWYgKCFsaXN0X2VtcHR5KCZmaWxlLT5ldmVudF9saXN0KSkKKwkJbWFzayA9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCB1Y21hX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHVjbWFfZmlsZSAqZmlsZTsKKworCWZpbGUgPSBrbWFsbG9jKHNpemVvZiAqZmlsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT5ldmVudF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZmlsZS0+Y3R4X2xpc3QpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZpbGUtPnBvbGxfd2FpdCk7CisJbXV0ZXhfaW5pdCgmZmlsZS0+bXV0KTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGZpbGU7CisJZmlsZS0+ZmlscCA9IGZpbHA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWNtYV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdWNtYV9maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1Y21hX2NvbnRleHQgKmN0eCwgKnRtcDsKKworCW11dGV4X2xvY2soJmZpbGUtPm11dCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN0eCwgdG1wLCAmZmlsZS0+Y3R4X2xpc3QsIGxpc3QpIHsKKwkJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXQpOworCisJCW11dGV4X2xvY2soJm11dCk7CisJCWlkcl9yZW1vdmUoJmN0eF9pZHIsIGN0eC0+aWQpOworCQltdXRleF91bmxvY2soJm11dCk7CisKKwkJdWNtYV9mcmVlX2N0eChjdHgpOworCQltdXRleF9sb2NrKCZmaWxlLT5tdXQpOworCX0KKwltdXRleF91bmxvY2soJmZpbGUtPm11dCk7CisJa2ZyZWUoZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVjbWFfZm9wcyA9IHsKKwkub3duZXIgCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuIAkgPSB1Y21hX29wZW4sCisJLnJlbGVhc2UgPSB1Y21hX2Nsb3NlLAorCS53cml0ZQkgPSB1Y21hX3dyaXRlLAorCS5wb2xsICAgID0gdWNtYV9wb2xsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHVjbWFfbWlzYyA9IHsKKwkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUJPSAicmRtYV9jbSIsCisJLmZvcHMJPSAmdWNtYV9mb3BzLAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hYmlfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBSRE1BX1VTRVJfQ01fQUJJX1ZFUlNJT04pOworfQorc3RhdGljIERFVklDRV9BVFRSKGFiaV92ZXJzaW9uLCBTX0lSVUdPLCBzaG93X2FiaV92ZXJzaW9uLCBOVUxMKTsKKworc3RhdGljIGludCBfX2luaXQgdWNtYV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnVjbWFfbWlzYyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSh1Y21hX21pc2MudGhpc19kZXZpY2UsICZkZXZfYXR0cl9hYmlfdmVyc2lvbik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgInJkbWFfdWNtOiBjb3VsZG4ndCBjcmVhdGUgYWJpX3ZlcnNpb24gYXR0clxuIik7CisJCWdvdG8gZXJyOworCX0KKwlyZXR1cm4gMDsKK2VycjoKKwltaXNjX2RlcmVnaXN0ZXIoJnVjbWFfbWlzYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVjbWFfY2xlYW51cCh2b2lkKQoreworCWRldmljZV9yZW1vdmVfZmlsZSh1Y21hX21pc2MudGhpc19kZXZpY2UsICZkZXZfYXR0cl9hYmlfdmVyc2lvbik7CisJbWlzY19kZXJlZ2lzdGVyKCZ1Y21hX21pc2MpOworCWlkcl9kZXN0cm95KCZjdHhfaWRyKTsKK30KKworbW9kdWxlX2luaXQodWNtYV9pbml0KTsKK21vZHVsZV9leGl0KHVjbWFfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKaW5kZXggYjcyYzdmNi4uNzQzMjQ3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwpAQCAtMTIxNCw3ICsxMjE0LDcgQEAKIAlyZXNwLnFwX2FjY2Vzc19mbGFncyAgICAgICAgPSBhdHRyLT5xcF9hY2Nlc3NfZmxhZ3M7CiAJcmVzcC5wa2V5X2luZGV4ICAgICAgICAgICAgID0gYXR0ci0+cGtleV9pbmRleDsKIAlyZXNwLmFsdF9wa2V5X2luZGV4ICAgICAgICAgPSBhdHRyLT5hbHRfcGtleV9pbmRleDsKLQlyZXNwLmVuX3NxZF9hc3luY19ub3RpZnkgICAgPSBhdHRyLT5lbl9zcWRfYXN5bmNfbm90aWZ5OworCXJlc3Auc3FfZHJhaW5pbmcgICAgICAgICAgICA9IGF0dHItPnNxX2RyYWluaW5nOwogCXJlc3AubWF4X3JkX2F0b21pYyAgICAgICAgICA9IGF0dHItPm1heF9yZF9hdG9taWM7CiAJcmVzcC5tYXhfZGVzdF9yZF9hdG9taWMgICAgID0gYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljOwogCXJlc3AubWluX3Jucl90aW1lciAgICAgICAgICA9IGF0dHItPm1pbl9ybnJfdGltZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYwppbmRleCA0ZTE2MzE0Li5hNjE3Y2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKQEAgLTUzNCw5ICs1MzQsOSBAQAogCSAqIG1vZHVsZSByZWZlcmVuY2UuCiAJICovCiAJZmlscC0+Zl9vcCAJICAgPSBmb3BzX2dldCgmdXZlcmJzX2V2ZW50X2ZvcHMpOwotCWZpbHAtPmZfdmZzbW50IAkgICA9IG1udGdldCh1dmVyYnNfZXZlbnRfbW50KTsKLQlmaWxwLT5mX2RlbnRyeSAJICAgPSBkZ2V0KHV2ZXJic19ldmVudF9tbnQtPm1udF9yb290KTsKLQlmaWxwLT5mX21hcHBpbmcgICAgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWZpbHAtPmZfcGF0aC5tbnQgCSAgID0gbW50Z2V0KHV2ZXJic19ldmVudF9tbnQpOworCWZpbHAtPmZfcGF0aC5kZW50cnkgCSAgID0gZGdldCh1dmVyYnNfZXZlbnRfbW50LT5tbnRfcm9vdCk7CisJZmlscC0+Zl9tYXBwaW5nICAgID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOwogCWZpbHAtPmZfZmxhZ3MgICAgICA9IE9fUkRPTkxZOwogCWZpbHAtPmZfbW9kZSAgICAgICA9IEZNT0RFX1JFQUQ7CiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gZXZfZmlsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYXJzaGFsbC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21hcnNoYWxsLmMKaW5kZXggY2U0NmIxMy4uNTQ0MGRhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21hcnNoYWxsLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21hcnNoYWxsLmMKQEAgLTMyLDggKzMyLDggQEAKIAogI2luY2x1ZGUgPHJkbWEvaWJfbWFyc2hhbGwuaD4KIAotc3RhdGljIHZvaWQgaWJfY29weV9haF9hdHRyX3RvX3VzZXIoc3RydWN0IGliX3V2ZXJic19haF9hdHRyICpkc3QsCi0JCQkJICAgIHN0cnVjdCBpYl9haF9hdHRyICpzcmMpCit2b2lkIGliX2NvcHlfYWhfYXR0cl90b191c2VyKHN0cnVjdCBpYl91dmVyYnNfYWhfYXR0ciAqZHN0LAorCQkJICAgICBzdHJ1Y3QgaWJfYWhfYXR0ciAqc3JjKQogewogCW1lbWNweShkc3QtPmdyaC5kZ2lkLCBzcmMtPmdyaC5kZ2lkLnJhdywgc2l6ZW9mIHNyYy0+Z3JoLmRnaWQpOwogCWRzdC0+Z3JoLmZsb3dfbGFiZWwgICAgICAgID0gc3JjLT5ncmguZmxvd19sYWJlbDsKQEAgLTQ3LDYgKzQ3LDcgQEAKIAlkc3QtPmlzX2dsb2JhbCAgICAgICAgICAgICA9IHNyYy0+YWhfZmxhZ3MgJiBJQl9BSF9HUkggPyAxIDogMDsKIAlkc3QtPnBvcnRfbnVtIAkgICAgCSAgID0gc3JjLT5wb3J0X251bTsKIH0KK0VYUE9SVF9TWU1CT0woaWJfY29weV9haF9hdHRyX3RvX3VzZXIpOwogCiB2b2lkIGliX2NvcHlfcXBfYXR0cl90b191c2VyKHN0cnVjdCBpYl91dmVyYnNfcXBfYXR0ciAqZHN0LAogCQkJICAgICBzdHJ1Y3QgaWJfcXBfYXR0ciAqc3JjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21lbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21lbS5jCmluZGV4IGVmZTE0N2QuLmM5NWZlOTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWVtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21lbS5jCkBAIC01Miw4ICs1Miw4IEBACiAJaW50IGk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2h1bmssIHRtcCwgJnVtZW0tPmNodW5rX2xpc3QsIGxpc3QpIHsKLQkJZG1hX3VubWFwX3NnKGRldi0+ZG1hX2RldmljZSwgY2h1bmstPnBhZ2VfbGlzdCwKLQkJCSAgICAgY2h1bmstPm5lbnRzLCBETUFfQklESVJFQ1RJT05BTCk7CisJCWliX2RtYV91bm1hcF9zZyhkZXYsIGNodW5rLT5wYWdlX2xpc3QsCisJCQkJY2h1bmstPm5lbnRzLCBETUFfQklESVJFQ1RJT05BTCk7CiAJCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bmVudHM7ICsraSkgewogCQkJaWYgKHVtZW0tPndyaXRhYmxlICYmIGRpcnR5KQogCQkJCXNldF9wYWdlX2RpcnR5X2xvY2soY2h1bmstPnBhZ2VfbGlzdFtpXS5wYWdlKTsKQEAgLTEzNiwxMCArMTM2LDEwIEBACiAJCQkJY2h1bmstPnBhZ2VfbGlzdFtpXS5sZW5ndGggPSBQQUdFX1NJWkU7CiAJCQl9CiAKLQkJCWNodW5rLT5ubWFwID0gZG1hX21hcF9zZyhkZXYtPmRtYV9kZXZpY2UsCi0JCQkJCQkgJmNodW5rLT5wYWdlX2xpc3RbMF0sCi0JCQkJCQkgY2h1bmstPm5lbnRzLAotCQkJCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKwkJCWNodW5rLT5ubWFwID0gaWJfZG1hX21hcF9zZyhkZXYsCisJCQkJCQkgICAgJmNodW5rLT5wYWdlX2xpc3RbMF0sCisJCQkJCQkgICAgY2h1bmstPm5lbnRzLAorCQkJCQkJICAgIERNQV9CSURJUkVDVElPTkFMKTsKIAkJCWlmIChjaHVuay0+bm1hcCA8PSAwKSB7CiAJCQkJZm9yIChpID0gMDsgaSA8IGNodW5rLT5uZW50czsgKytpKQogCQkJCQlwdXRfcGFnZShjaHVuay0+cGFnZV9saXN0W2ldLnBhZ2UpOwpAQCAtMTc5LDkgKzE3OSwxMCBAQAogCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogfQogCi1zdGF0aWMgdm9pZCBpYl91bWVtX2FjY291bnQodm9pZCAqd29ya19wdHIpCitzdGF0aWMgdm9pZCBpYl91bWVtX2FjY291bnQoc3RydWN0IHdvcmtfc3RydWN0ICpfd29yaykKIHsKLQlzdHJ1Y3QgaWJfdW1lbV9hY2NvdW50X3dvcmsgKndvcmsgPSB3b3JrX3B0cjsKKwlzdHJ1Y3QgaWJfdW1lbV9hY2NvdW50X3dvcmsgKndvcmsgPQorCQljb250YWluZXJfb2YoX3dvcmssIHN0cnVjdCBpYl91bWVtX2FjY291bnRfd29yaywgd29yayk7CiAKIAlkb3duX3dyaXRlKCZ3b3JrLT5tbS0+bW1hcF9zZW0pOwogCXdvcmstPm1tLT5sb2NrZWRfdm0gLT0gd29yay0+ZGlmZjsKQEAgLTIxNiw3ICsyMTcsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBpYl91bWVtX2FjY291bnQsIHdvcmspOworCUlOSVRfV09SSygmd29yay0+d29yaywgaWJfdW1lbV9hY2NvdW50KTsKIAl3b3JrLT5tbSAgID0gbW07CiAJd29yay0+ZGlmZiA9IFBBR0VfQUxJR04odW1lbS0+bGVuZ3RoICsgdW1lbS0+b2Zmc2V0KSA+PiBQQUdFX1NISUZUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMi5jCmluZGV4IGRjMWViZWEuLjI3ZmUyNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMi5jCkBAIC0xMTU1LDcgKzExNTUsOCBAQAogCQlnb3RvIGJhaWwxMDsKIAl9CiAKLQljMl9yZWdpc3Rlcl9kZXZpY2UoYzJkZXYpOworCWlmIChjMl9yZWdpc3Rlcl9kZXZpY2UoYzJkZXYpKQorCQlnb3RvIGJhaWwxMDsKIAogCXJldHVybiAwOwogCkBAIC0xMjQzLDcgKzEyNDQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjMl9pbml0X21vZHVsZSh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmMyX3BjaV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjMl9wY2lfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGMyX2V4aXRfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMi5oCmluZGV4IDFiMTdkY2QuLjA0YTlkYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMi5oCkBAIC0zMDIsNyArMzAyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHBhOwkvKiBQQSBkZXZpY2UgbWVtb3J5ICovCiAJdm9pZCAqKnFwdHJfYXJyYXk7CiAKLQlrbWVtX2NhY2hlX3QgKmhvc3RfbXNnX2NhY2hlOworCXN0cnVjdCBrbWVtX2NhY2hlICpob3N0X21zZ19jYWNoZTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgY2NhX2xpbms7CQkvKiBhZGFwdGVyIGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGVoX3dha2V1cF9saXN0OwkvKiBldmVudCB3YWtldXAgbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX2FsbG9jLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWxsb2MuYwppbmRleCAwMjhhNjBiLi4wMzE1Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWxsb2MuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfYWxsb2MuYwpAQCAtNDIsMTMgKzQyLDE0IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IHNwX2NodW5rICpuZXdfaGVhZDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOwogCi0JbmV3X2hlYWQgPSAoc3RydWN0IHNwX2NodW5rICopIF9fZ2V0X2ZyZWVfcGFnZShnZnBfbWFzayk7CisJbmV3X2hlYWQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmMyZGV2LT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLAorCQkJCSAgICAgICZkbWFfYWRkciwgZ2ZwX21hc2spOwogCWlmIChuZXdfaGVhZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW5ld19oZWFkLT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLCBuZXdfaGVhZCwKLQkJCQkJICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwluZXdfaGVhZC0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKIAlwY2lfdW5tYXBfYWRkcl9zZXQobmV3X2hlYWQsIG1hcHBpbmcsIG5ld19oZWFkLT5kbWFfYWRkcik7CiAKIAluZXdfaGVhZC0+bmV4dCA9IE5VTEw7CkBAIC04MCwxMCArODEsOCBAQAogCiAJd2hpbGUgKHJvb3QpIHsKIAkJbmV4dCA9IHJvb3QtPm5leHQ7Ci0JCWRtYV91bm1hcF9zaW5nbGUoYzJkZXYtPmliZGV2LmRtYV9kZXZpY2UsCi0JCQkJIHBjaV91bm1hcF9hZGRyKHJvb3QsIG1hcHBpbmcpLCBQQUdFX1NJWkUsCi0JCQkgICAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwotCQlfX2ZyZWVfcGFnZSgoc3RydWN0IHBhZ2UgKikgcm9vdCk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZjMmRldi0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwgcm9vdCwKKwkJCQkgIHBjaV91bm1hcF9hZGRyKHJvb3QsIG1hcHBpbmcpKTsKIAkJcm9vdCA9IG5leHQ7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfY3EuYwppbmRleCA5ZDdiY2M1Li4wNWM5MTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfY3EuYwpAQCAtMjQ2LDIwICsyNDYsMTcgQEAKIAogc3RhdGljIHZvaWQgYzJfZnJlZV9jcV9idWYoc3RydWN0IGMyX2RldiAqYzJkZXYsIHN0cnVjdCBjMl9tcSAqbXEpCiB7Ci0KLQlkbWFfdW5tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLCBwY2lfdW5tYXBfYWRkcihtcSwgbWFwcGluZyksCi0JCQkgbXEtPnFfc2l6ZSAqIG1xLT5tc2dfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBtcS0+bXNnX3Bvb2wuaG9zdCwKLQkJICAgZ2V0X29yZGVyKG1xLT5xX3NpemUgKiBtcS0+bXNnX3NpemUpKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmYzJkZXYtPnBjaWRldi0+ZGV2LCBtcS0+cV9zaXplICogbXEtPm1zZ19zaXplLAorCQkJICBtcS0+bXNnX3Bvb2wuaG9zdCwgcGNpX3VubWFwX2FkZHIobXEsIG1hcHBpbmcpKTsKIH0KIAogc3RhdGljIGludCBjMl9hbGxvY19jcV9idWYoc3RydWN0IGMyX2RldiAqYzJkZXYsIHN0cnVjdCBjMl9tcSAqbXEsIGludCBxX3NpemUsCiAJCQkgICBpbnQgbXNnX3NpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBwb29sX3N0YXJ0OworCXU4ICpwb29sX3N0YXJ0OwogCi0JcG9vbF9zdGFydCA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKLQkJCQkgICAgICBnZXRfb3JkZXIocV9zaXplICogbXNnX3NpemUpKTsKKwlwb29sX3N0YXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjMmRldi0+cGNpZGV2LT5kZXYsIHFfc2l6ZSAqIG1zZ19zaXplLAorCQkJCQkmbXEtPmhvc3RfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvb2xfc3RhcnQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yNjcsMTMgKzI2NCwxMCBAQAogCQkgICAgICAgMCwJCS8qIGluZGV4IChjdXJyZW50bHkgdW5rbm93bikgKi8KIAkJICAgICAgIHFfc2l6ZSwKIAkJICAgICAgIG1zZ19zaXplLAotCQkgICAgICAgKHU4ICopIHBvb2xfc3RhcnQsCisJCSAgICAgICBwb29sX3N0YXJ0LAogCQkgICAgICAgTlVMTCwJLyogcGVlciAoY3VycmVudGx5IHVua25vd24pICovCiAJCSAgICAgICBDMl9NUV9IT1NUX1RBUkdFVCk7CiAKLQltcS0+aG9zdF9kbWEgPSBkbWFfbWFwX3NpbmdsZShjMmRldi0+aWJkZXYuZG1hX2RldmljZSwKLQkJCQkgICAgICAodm9pZCAqKXBvb2xfc3RhcnQsCi0JCQkJICAgICAgcV9zaXplICogbXNnX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CiAJcGNpX3VubWFwX2FkZHJfc2V0KG1xLCBtYXBwaW5nLCBtcS0+aG9zdF9kbWEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCmluZGV4IGRhOThkOWYuLmZlZjk3MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jCkBAIC03NTcsMjAgKzc1NywxNyBAQAogCiBpbnQgYzJfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBjMl9kZXYgKmRldikKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAtRU5PTUVNOwogCWludCBpOwogCiAJLyogUmVnaXN0ZXIgcHNldWRvIG5ldHdvcmsgZGV2aWNlICovCiAJZGV2LT5wc2V1ZG9fbmV0ZGV2ID0gYzJfcHNldWRvX25ldGRldl9pbml0KGRldik7Ci0JaWYgKGRldi0+cHNldWRvX25ldGRldikgewotCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2LT5wc2V1ZG9fbmV0ZGV2KTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAotCQkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgbmV0ZGV2LCByZXQgPSAlZFxuIiwgcmV0KTsKLQkJCWZyZWVfbmV0ZGV2KGRldi0+cHNldWRvX25ldGRldik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQorCWlmICghZGV2LT5wc2V1ZG9fbmV0ZGV2KQorCQlnb3RvIG91dDM7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2LT5wc2V1ZG9fbmV0ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDI7CiAKIAlwcl9kZWJ1ZygiJXM6JXVcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwogCXN0cmxjcHkoZGV2LT5pYmRldi5uYW1lLCAiYW1zbyVkIiwgSUJfREVWSUNFX05BTUVfTUFYKTsKQEAgLTg0OCwyMSArODQ1LDI1IEBACiAKIAlyZXQgPSBpYl9yZWdpc3Rlcl9kZXZpY2UoJmRldi0+aWJkZXYpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0MTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGMyX2NsYXNzX2F0dHJpYnV0ZXMpOyArK2kpIHsKIAkJcmV0ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmliZGV2LmNsYXNzX2RldiwKIAkJCQkJICAgICAgIGMyX2NsYXNzX2F0dHJpYnV0ZXNbaV0pOwotCQlpZiAocmV0KSB7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldihkZXYtPnBzZXVkb19uZXRkZXYpOwotCQkJZnJlZV9uZXRkZXYoZGV2LT5wc2V1ZG9fbmV0ZGV2KTsKLQkJCWliX3VucmVnaXN0ZXJfZGV2aWNlKCZkZXYtPmliZGV2KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0MDsKIAl9CisJZ290byBvdXQzOwogCi0JcHJfZGVidWcoIiVzOiV1XG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQlyZXR1cm4gMDsKK291dDA6CisJaWJfdW5yZWdpc3Rlcl9kZXZpY2UoJmRldi0+aWJkZXYpOworb3V0MToKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYtPnBzZXVkb19uZXRkZXYpOworb3V0MjoKKwlmcmVlX25ldGRldihkZXYtPnBzZXVkb19uZXRkZXYpOworb3V0MzoKKwlwcl9kZWJ1ZygiJXM6JXUgcmV0PSVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgYzJfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGMyX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcXAuYwppbmRleCA1YmNmNjk3Li40MjBjMTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcXAuYwpAQCAtMTYxLDggKzE2MSwxMCBAQAogCiAJaWYgKGF0dHJfbWFzayAmIElCX1FQX1NUQVRFKSB7CiAJCS8qIEVuc3VyZSB0aGUgc3RhdGUgaXMgdmFsaWQgKi8KLQkJaWYgKGF0dHItPnFwX3N0YXRlIDwgMCB8fCBhdHRyLT5xcF9zdGF0ZSA+IElCX1FQU19FUlIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGF0dHItPnFwX3N0YXRlIDwgMCB8fCBhdHRyLT5xcF9zdGF0ZSA+IElCX1FQU19FUlIpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGJhaWwwOworCQl9CiAKIAkJd3IubmV4dF9xcF9zdGF0ZSA9IGNwdV90b19iZTMyKHRvX2MyX3N0YXRlKGF0dHItPnFwX3N0YXRlKSk7CiAKQEAgLTE4NCw5ICsxODYsMTAgQEAKIAkJaWYgKGF0dHItPmN1cl9xcF9zdGF0ZSAhPSBJQl9RUFNfUlRSICYmCiAJCSAgICBhdHRyLT5jdXJfcXBfc3RhdGUgIT0gSUJfUVBTX1JUUyAmJgogCQkgICAgYXR0ci0+Y3VyX3FwX3N0YXRlICE9IElCX1FQU19TUUQgJiYKLQkJICAgIGF0dHItPmN1cl9xcF9zdGF0ZSAhPSBJQl9RUFNfU1FFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVsc2UKKwkJICAgIGF0dHItPmN1cl9xcF9zdGF0ZSAhPSBJQl9RUFNfU1FFKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBiYWlsMDsKKwkJfSBlbHNlCiAJCQl3ci5uZXh0X3FwX3N0YXRlID0KIAkJCSAgICBjcHVfdG9fYmUzMih0b19jMl9zdGF0ZShhdHRyLT5jdXJfcXBfc3RhdGUpKTsKIApAQCAtNTY0LDYgKzU2NywzMiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjMl9sb2NrX2NxcyhzdHJ1Y3QgYzJfY3EgKnNlbmRfY3EsIHN0cnVjdCBjMl9jcSAqcmVjdl9jcSkKK3sKKwlpZiAoc2VuZF9jcSA9PSByZWN2X2NxKQorCQlzcGluX2xvY2tfaXJxKCZzZW5kX2NxLT5sb2NrKTsKKwllbHNlIGlmIChzZW5kX2NxID4gcmVjdl9jcSkgeworCQlzcGluX2xvY2tfaXJxKCZzZW5kX2NxLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX25lc3RlZCgmcmVjdl9jcS0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnEoJnJlY3ZfY3EtPmxvY2spOworCQlzcGluX2xvY2tfbmVzdGVkKCZzZW5kX2NxLT5sb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYzJfdW5sb2NrX2NxcyhzdHJ1Y3QgYzJfY3EgKnNlbmRfY3EsIHN0cnVjdCBjMl9jcSAqcmVjdl9jcSkKK3sKKwlpZiAoc2VuZF9jcSA9PSByZWN2X2NxKQorCQlzcGluX3VubG9ja19pcnEoJnNlbmRfY3EtPmxvY2spOworCWVsc2UgaWYgKHNlbmRfY3EgPiByZWN2X2NxKSB7CisJCXNwaW5fdW5sb2NrKCZyZWN2X2NxLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZzZW5kX2NxLT5sb2NrKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmc2VuZF9jcS0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmcmVjdl9jcS0+bG9jayk7CisJfQorfQorCiB2b2lkIGMyX2ZyZWVfcXAoc3RydWN0IGMyX2RldiAqYzJkZXYsIHN0cnVjdCBjMl9xcCAqcXApCiB7CiAJc3RydWN0IGMyX2NxICpzZW5kX2NxOwpAQCAtNTc2LDE1ICs2MDUsOSBAQAogCSAqIExvY2sgQ1FzIGhlcmUsIHNvIHRoYXQgQ1EgcG9sbGluZyBjb2RlIGNhbiBkbyBRUCBsb29rdXAKIAkgKiB3aXRob3V0IHRha2luZyBhIGxvY2suCiAJICovCi0Jc3Bpbl9sb2NrX2lycSgmc2VuZF9jcS0+bG9jayk7Ci0JaWYgKHNlbmRfY3EgIT0gcmVjdl9jcSkKLQkJc3Bpbl9sb2NrKCZyZWN2X2NxLT5sb2NrKTsKLQorCWMyX2xvY2tfY3FzKHNlbmRfY3EsIHJlY3ZfY3EpOwogCWMyX2ZyZWVfcXBuKGMyZGV2LCBxcC0+cXBuKTsKLQotCWlmIChzZW5kX2NxICE9IHJlY3ZfY3EpCi0JCXNwaW5fdW5sb2NrKCZyZWN2X2NxLT5sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnNlbmRfY3EtPmxvY2spOworCWMyX3VubG9ja19jcXMoc2VuZF9jcSwgcmVjdl9jcSk7CiAKIAkvKgogCSAqIERlc3RvcnkgcXAgaW4gdGhlIHJuaWMuLi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9ybmljLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzJfcm5pYy5jCmluZGV4IGUzN2M1NjguLjE2ODdjNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9ybmljLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3JuaWMuYwpAQCAtMTUwLDE1ICsxNTAsMTUgQEAKIAkgICAgKHN0cnVjdCBjMndyX3JuaWNfcXVlcnlfcmVwICopICh1bnNpZ25lZCBsb25nKSAodnFfcmVxLT5yZXBseV9tc2cpOwogCWlmICghcmVwbHkpCiAJCWVyciA9IC1FTk9NRU07Ci0KLQllcnIgPSBjMl9lcnJubyhyZXBseSk7CisJZWxzZQorCQllcnIgPSBjMl9lcnJubyhyZXBseSk7CiAJaWYgKGVycikKIAkJZ290byBiYWlsMjsKIAogCXByb3BzLT5md192ZXIgPQogCQkoKHU2NCliZTMyX3RvX2NwdShyZXBseS0+ZndfdmVyX21ham9yKSA8PCAzMikgfAotCQkoKGJlMzJfdG9fY3B1KHJlcGx5LT5md192ZXJfbWlub3IpICYmIDB4RkZGRikgPDwgMTYpIHwKLQkJKGJlMzJfdG9fY3B1KHJlcGx5LT5md192ZXJfcGF0Y2gpICYmIDB4RkZGRik7CisJCSgoYmUzMl90b19jcHUocmVwbHktPmZ3X3Zlcl9taW5vcikgJiAweEZGRkYpIDw8IDE2KSB8CisJCShiZTMyX3RvX2NwdShyZXBseS0+ZndfdmVyX3BhdGNoKSAmIDB4RkZGRik7CiAJbWVtY3B5KCZwcm9wcy0+c3lzX2ltYWdlX2d1aWQsIGMyZGV2LT5uZXRkZXYtPmRldl9hZGRyLCA2KTsKIAlwcm9wcy0+bWF4X21yX3NpemUgICAgICAgICA9IDB4RkZGRkZGRkY7CiAJcHJvcHMtPnBhZ2Vfc2l6ZV9jYXAgICAgICAgPSB+KEMyX01JTl9QQUdFU0laRS0xKTsKQEAgLTQ0MSw3ICs0NDEsNyBAQAogICogaW52b2x2ZXMgaW5pdGFsaXppbmcgdGhlIHZhcmlvdXMgbGltaXRzIGFuZCByZXNvdWNlIHBvb2xzIHRoYXQKICAqIGNvbXByaXNlIHRoZSBSTklDIGluc3RhbmNlLgogICovCi1pbnQgYzJfcm5pY19pbml0KHN0cnVjdCBjMl9kZXYgKmMyZGV2KQoraW50IF9fZGV2aW5pdCBjMl9ybmljX2luaXQoc3RydWN0IGMyX2RldiAqYzJkZXYpCiB7CiAJaW50IGVycjsKIAl1MzIgcXNpemUsIG1zZ3NpemU7CkBAIC01MTcsMTQgKzUxNywxMiBAQAogCS8qIEluaXRpYWxpemUgdGhlIFZlcmJzIFJlcGx5IFF1ZXVlICovCiAJcXNpemUgPSBiZTMyX3RvX2NwdShyZWFkbChtbWlvX3JlZ3MgKyBDMl9SRUdTX1ExX1FTSVpFKSk7CiAJbXNnc2l6ZSA9IGJlMzJfdG9fY3B1KHJlYWRsKG1taW9fcmVncyArIEMyX1JFR1NfUTFfTVNHU0laRSkpOwotCXExX3BhZ2VzID0ga21hbGxvYyhxc2l6ZSAqIG1zZ3NpemUsIEdGUF9LRVJORUwpOworCXExX3BhZ2VzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjMmRldi0+cGNpZGV2LT5kZXYsIHFzaXplICogbXNnc2l6ZSwKKwkJCQkgICAgICAmYzJkZXYtPnJlcF92cS5ob3N0X2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFxMV9wYWdlcykgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGJhaWwxOwogCX0KLQljMmRldi0+cmVwX3ZxLmhvc3RfZG1hID0gZG1hX21hcF9zaW5nbGUoYzJkZXYtPmliZGV2LmRtYV9kZXZpY2UsCi0JCQkJCSAgICAgICAgKHZvaWQgKilxMV9wYWdlcywgcXNpemUgKiBtc2dzaXplLAotCQkJCSAgICAgIAkJRE1BX0ZST01fREVWSUNFKTsKIAlwY2lfdW5tYXBfYWRkcl9zZXQoJmMyZGV2LT5yZXBfdnEsIG1hcHBpbmcsIGMyZGV2LT5yZXBfdnEuaG9zdF9kbWEpOwogCXByX2RlYnVnKCIlcyByZXBfdnEgdmEgJXAgZG1hICVsbHhcbiIsIF9fRlVOQ1RJT05fXywgcTFfcGFnZXMsCiAJCSAodW5zaWduZWQgbG9uZyBsb25nKSBjMmRldi0+cmVwX3ZxLmhvc3RfZG1hKTsKQEAgLTU0MCwxNyArNTM4LDE1IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgQXN5bmNocm9udXMgRXZlbnQgUXVldWUgKi8KIAlxc2l6ZSA9IGJlMzJfdG9fY3B1KHJlYWRsKG1taW9fcmVncyArIEMyX1JFR1NfUTJfUVNJWkUpKTsKIAltc2dzaXplID0gYmUzMl90b19jcHUocmVhZGwobW1pb19yZWdzICsgQzJfUkVHU19RMl9NU0dTSVpFKSk7Ci0JcTJfcGFnZXMgPSBrbWFsbG9jKHFzaXplICogbXNnc2l6ZSwgR0ZQX0tFUk5FTCk7CisJcTJfcGFnZXMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmMyZGV2LT5wY2lkZXYtPmRldiwgcXNpemUgKiBtc2dzaXplLAorCQkJCSAgICAgICZjMmRldi0+YWVxLmhvc3RfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXEyX3BhZ2VzKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gYmFpbDI7CiAJfQotCWMyZGV2LT5hZXEuaG9zdF9kbWEgPSBkbWFfbWFwX3NpbmdsZShjMmRldi0+aWJkZXYuZG1hX2RldmljZSwKLQkJCQkJICAgICAgICAodm9pZCAqKXEyX3BhZ2VzLCBxc2l6ZSAqIG1zZ3NpemUsCi0JCQkJICAgICAgCQlETUFfRlJPTV9ERVZJQ0UpOwogCXBjaV91bm1hcF9hZGRyX3NldCgmYzJkZXYtPmFlcSwgbWFwcGluZywgYzJkZXYtPmFlcS5ob3N0X2RtYSk7Ci0JcHJfZGVidWcoIiVzIGFlcSB2YSAlcCBkbWEgJWxseFxuIiwgX19GVU5DVElPTl9fLCBxMV9wYWdlcywKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGMyZGV2LT5yZXBfdnEuaG9zdF9kbWEpOworCXByX2RlYnVnKCIlcyBhZXEgdmEgJXAgZG1hICVsbHhcbiIsIF9fRlVOQ1RJT05fXywgcTJfcGFnZXMsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKSBjMmRldi0+YWVxLmhvc3RfZG1hKTsKIAljMl9tcV9yZXBfaW5pdCgmYzJkZXYtPmFlcSwKIAkJICAgICAgIDIsCiAJCSAgICAgICBxc2l6ZSwKQEAgLTU5NywxNyArNTkzLDEzIEBACiAgICAgICBiYWlsNDoKIAl2cV90ZXJtKGMyZGV2KTsKICAgICAgIGJhaWwzOgotCWRtYV91bm1hcF9zaW5nbGUoYzJkZXYtPmliZGV2LmRtYV9kZXZpY2UsCi0JCQkgcGNpX3VubWFwX2FkZHIoJmMyZGV2LT5hZXEsIG1hcHBpbmcpLAotCQkJIGMyZGV2LT5hZXEucV9zaXplICogYzJkZXYtPmFlcS5tc2dfc2l6ZSwKLQkJICAJIERNQV9GUk9NX0RFVklDRSk7Ci0Ja2ZyZWUocTJfcGFnZXMpOworCWRtYV9mcmVlX2NvaGVyZW50KCZjMmRldi0+cGNpZGV2LT5kZXYsCisJCQkgIGMyZGV2LT5hZXEucV9zaXplICogYzJkZXYtPmFlcS5tc2dfc2l6ZSwKKwkJCSAgcTJfcGFnZXMsIHBjaV91bm1hcF9hZGRyKCZjMmRldi0+YWVxLCBtYXBwaW5nKSk7CiAgICAgICBiYWlsMjoKLQlkbWFfdW5tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLAotCQkJIHBjaV91bm1hcF9hZGRyKCZjMmRldi0+cmVwX3ZxLCBtYXBwaW5nKSwKLQkJCSBjMmRldi0+cmVwX3ZxLnFfc2l6ZSAqIGMyZGV2LT5yZXBfdnEubXNnX3NpemUsCi0JCSAgCSBETUFfRlJPTV9ERVZJQ0UpOwotCWtmcmVlKHExX3BhZ2VzKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmYzJkZXYtPnBjaWRldi0+ZGV2LAorCQkJICBjMmRldi0+cmVwX3ZxLnFfc2l6ZSAqIGMyZGV2LT5yZXBfdnEubXNnX3NpemUsCisJCQkgIHExX3BhZ2VzLCBwY2lfdW5tYXBfYWRkcigmYzJkZXYtPnJlcF92cSwgbWFwcGluZykpOwogICAgICAgYmFpbDE6CiAJYzJfZnJlZV9tcXNwX3Bvb2woYzJkZXYsIGMyZGV2LT5rZXJuX21xc3BfcG9vbCk7CiAgICAgICBiYWlsMDoKQEAgLTYxOSw3ICs2MTEsNyBAQAogLyoKICAqIENhbGxlZCBieSBjMl9yZW1vdmUgdG8gY2xlYW51cCB0aGUgUk5JQyByZXNvdXJjZXMuCiAgKi8KLXZvaWQgYzJfcm5pY190ZXJtKHN0cnVjdCBjMl9kZXYgKmMyZGV2KQordm9pZCBfX2RldmV4aXQgYzJfcm5pY190ZXJtKHN0cnVjdCBjMl9kZXYgKmMyZGV2KQogewogCiAJLyogQ2xvc2UgdGhlIG9wZW4gYWRhcHRlciBpbnN0YW5jZSAqLwpAQCAtNjQwLDE5ICs2MzIsMTcgQEAKIAkvKiBGcmVlIHRoZSB2ZXJicyByZXF1ZXN0IGFsbG9jYXRvciAqLwogCXZxX3Rlcm0oYzJkZXYpOwogCi0JLyogVW5tYXAgYW5kIGZyZWUgdGhlIGFzeW5jaHJvbnVzIGV2ZW50IHF1ZXVlICovCi0JZG1hX3VubWFwX3NpbmdsZShjMmRldi0+aWJkZXYuZG1hX2RldmljZSwKLQkJCSBwY2lfdW5tYXBfYWRkcigmYzJkZXYtPmFlcSwgbWFwcGluZyksCi0JCQkgYzJkZXYtPmFlcS5xX3NpemUgKiBjMmRldi0+YWVxLm1zZ19zaXplLAotCQkgIAkgRE1BX0ZST01fREVWSUNFKTsKLQlrZnJlZShjMmRldi0+YWVxLm1zZ19wb29sLmhvc3QpOworCS8qIEZyZWUgdGhlIGFzeW5jaHJvbnVzIGV2ZW50IHF1ZXVlICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJmMyZGV2LT5wY2lkZXYtPmRldiwKKwkJCSAgYzJkZXYtPmFlcS5xX3NpemUgKiBjMmRldi0+YWVxLm1zZ19zaXplLAorCQkJICBjMmRldi0+YWVxLm1zZ19wb29sLmhvc3QsCisJCQkgIHBjaV91bm1hcF9hZGRyKCZjMmRldi0+YWVxLCBtYXBwaW5nKSk7CiAKLQkvKiBVbm1hcCBhbmQgZnJlZSB0aGUgdmVyYnMgcmVwbHkgcXVldWUgKi8KLQlkbWFfdW5tYXBfc2luZ2xlKGMyZGV2LT5pYmRldi5kbWFfZGV2aWNlLAotCQkJIHBjaV91bm1hcF9hZGRyKCZjMmRldi0+cmVwX3ZxLCBtYXBwaW5nKSwKLQkJCSBjMmRldi0+cmVwX3ZxLnFfc2l6ZSAqIGMyZGV2LT5yZXBfdnEubXNnX3NpemUsCi0JCSAgCSBETUFfRlJPTV9ERVZJQ0UpOwotCWtmcmVlKGMyZGV2LT5yZXBfdnEubXNnX3Bvb2wuaG9zdCk7CisJLyogRnJlZSB0aGUgdmVyYnMgcmVwbHkgcXVldWUgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmYzJkZXYtPnBjaWRldi0+ZGV2LAorCQkJICBjMmRldi0+cmVwX3ZxLnFfc2l6ZSAqIGMyZGV2LT5yZXBfdnEubXNnX3NpemUsCisJCQkgIGMyZGV2LT5yZXBfdnEubXNnX3Bvb2wuaG9zdCwKKwkJCSAgcGNpX3VubWFwX2FkZHIoJmMyZGV2LT5yZXBfdnEsIG1hcHBpbmcpKTsKIAogCS8qIEZyZWUgdGhlIE1RIHNoYXJlZCBwb2ludGVyIHBvb2wgKi8KIAljMl9mcmVlX21xc3BfcG9vbChjMmRldiwgYzJkZXYtPmtlcm5fbXFzcF9wb29sKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl92cS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3ZxLmMKaW5kZXggNDBjYWViNS4uMzY2MjBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3ZxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3ZxLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogICovCiB2b2lkICp2cV9yZXBidWZfYWxsb2Moc3RydWN0IGMyX2RldiAqYzJkZXYpCiB7Ci0JcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoYzJkZXYtPmhvc3RfbXNnX2NhY2hlLCBTTEFCX0FUT01JQyk7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoYzJkZXYtPmhvc3RfbXNnX2NhY2hlLCBHRlBfQVRPTUlDKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL0tjb25maWcgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9LY29uZmlnCmluZGV4IDkyMjM4OWIuLjcyN2IxMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL0tjb25maWcKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvS2NvbmZpZwpAQCAtMTAsNiArMTAsNyBAQAogY29uZmlnIElORklOSUJBTkRfRUhDQV9TQ0FMSU5HCiAJYm9vbCAiU2NhbGluZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSUJNRUJVUyAmJiBJTkZJTklCQU5EX0VIQ0EgJiYgSE9UUExVR19DUFUgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCWVIQ0Egc2NhbGluZyBzdXBwb3J0IHNjaGVkdWxlcyB0aGUgQ1EgY2FsbGJhY2tzIHRvIGRpZmZlcmVudCBDUFVzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2F2LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2F2LmMKaW5kZXggM2JhYzE5Ny4uMGQ2ZTJjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9hdi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfYXYuYwpAQCAtNTcsNyArNTcsNyBAQAogCXN0cnVjdCBlaGNhX3NoY2EgKnNoY2EgPSBjb250YWluZXJfb2YocGQtPmRldmljZSwgc3RydWN0IGVoY2Ffc2hjYSwKIAkJCQkJICAgICAgaWJfZGV2aWNlKTsKIAotCWF2ID0ga21lbV9jYWNoZV9hbGxvYyhhdl9jYWNoZSwgU0xBQl9LRVJORUwpOworCWF2ID0ga21lbV9jYWNoZV9hbGxvYyhhdl9jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhdikgewogCQllaGNhX2VycihwZC0+ZGV2aWNlLCAiT3V0IG9mIG1lbW9yeSBwZD0lcCBhaF9hdHRyPSVwIiwKIAkJCSBwZCwgYWhfYXR0cik7CkBAIC0xMTgsOCArMTE4LDcgQEAKIAkJfQogCQltZW1jcHkoJmF2LT5hdi5ncmgud29yZF8xLCAmZ2lkLCBzaXplb2YoZ2lkKSk7CiAJfQotCS8qIGZvciB0aGUgdGltZSBiZWluZyB3ZSB1c2UgYSBoYXJkIGNvZGVkIFBNVFUgb2YgMjA0OCBCeXRlcyAqLwotCWF2LT5hdi5wbXR1ID0gNDsKKwlhdi0+YXYucG10dSA9IEVIQ0FfTUFYX01UVTsKIAogCS8qIGRnaWQgY29tZXMgaW4gZ3JoLndvcmRfMyAqLwogCW1lbWNweSgmYXYtPmF2LmdyaC53b3JkXzMsICZhaF9hdHRyLT5ncmguZGdpZCwKQEAgLTE5Myw3ICsxOTIsNyBAQAogCQltZW1jcHkoJm5ld19laGNhX2F2LmdyaC53b3JkXzEsICZnaWQsIHNpemVvZihnaWQpKTsKIAl9CiAKLQluZXdfZWhjYV9hdi5wbXR1ID0gNDsgLyogc2VlIGFsc28gY29tbWVudCBpbiBjcmVhdGVfYWgoKSAqLworCW5ld19laGNhX2F2LnBtdHUgPSBFSENBX01BWF9NVFU7CiAKIAltZW1jcHkoJm5ld19laGNhX2F2LmdyaC53b3JkXzMsICZhaF9hdHRyLT5ncmguZGdpZCwKIAkgICAgICAgc2l6ZW9mKGFoX2F0dHItPmdyaC5kZ2lkKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2NxLmMKaW5kZXggNDU4ZmUxOS4uOTM5OTViNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY3EuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJaWYgKGNxZSA+PSAweEZGRkZGRkZGIC0gNjQgLSBhZGRpdGlvbmFsX2NxZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQlteV9jcSA9IGttZW1fY2FjaGVfYWxsb2MoY3FfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwlteV9jcSA9IGttZW1fY2FjaGVfYWxsb2MoY3FfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghbXlfY3EpIHsKIAkJZWhjYV9lcnIoZGV2aWNlLCAiT3V0IG9mIG1lbW9yeSBmb3IgZWhjYV9jcSBzdHJ1Y3QgZGV2aWNlPSVwIiwKIAkJCSBkZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9oY2EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaGNhLmMKaW5kZXggNWVhZTZhYy4uZTFiNjE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9oY2EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2hjYS5jCkBAIC00MCw2ICs0MCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImVoY2FfdG9vbHMuaCIKKyNpbmNsdWRlICJlaGNhX2l2ZXJicy5oIgogI2luY2x1ZGUgImhjcF9pZi5oIgogCiBpbnQgZWhjYV9xdWVyeV9kZXZpY2Uoc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHN0cnVjdCBpYl9kZXZpY2VfYXR0ciAqcHJvcHMpCkBAIC00OSw3ICs1MCw3IEBACiAJCQkJCSAgICAgIGliX2RldmljZSk7CiAJc3RydWN0IGhpcHpfcXVlcnlfaGNhICpyYmxvY2s7CiAKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwlyYmxvY2sgPSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpOwogCWlmICghcmJsb2NrKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJDYW4ndCBhbGxvY2F0ZSByYmxvY2sgbWVtb3J5LiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTk2LDcgKzk3LDcgQEAKIAkJPSBtaW5fdChpbnQsIHJibG9jay0+bWF4X3RvdGFsX21jYXN0X3FwX2F0dGFjaCwgSU5UX01BWCk7CiAKIHF1ZXJ5X2RldmljZTE6Ci0Ja2ZyZWUocmJsb2NrKTsKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHJibG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA5LDcgKzExMCw3IEBACiAJCQkJCSAgICAgIGliX2RldmljZSk7CiAJc3RydWN0IGhpcHpfcXVlcnlfcG9ydCAqcmJsb2NrOwogCi0JcmJsb2NrID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJcmJsb2NrID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIXJibG9jaykgewogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiQ2FuJ3QgYWxsb2NhdGUgcmJsb2NrIG1lbW9yeS4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNjIsNyArMTYzLDcgQEAKIAlwcm9wcy0+YWN0aXZlX3NwZWVkICAgID0gMHgxOwogCiBxdWVyeV9wb3J0MToKLQlrZnJlZShyYmxvY2spOworCWVoY2FfZnJlZV9md19jdHJsYmxvY2socmJsb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNzgsNyArMTc5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmJsb2NrID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJcmJsb2NrID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIXJibG9jaykgewogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAgIkNhbid0IGFsbG9jYXRlIHJibG9jayBtZW1vcnkuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTkzLDcgKzE5NCw3IEBACiAJbWVtY3B5KHBrZXksICZyYmxvY2stPnBrZXlfZW50cmllcyArIGluZGV4LCBzaXplb2YodTE2KSk7CiAKIHF1ZXJ5X3BrZXkxOgotCWtmcmVlKHJibG9jayk7CisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhyYmxvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIxMSw3ICsyMTIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwlyYmxvY2sgPSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpOwogCWlmICghcmJsb2NrKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJDYW4ndCBhbGxvY2F0ZSByYmxvY2sgbWVtb3J5LiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIyNyw3ICsyMjgsNyBAQAogCW1lbWNweSgmZ2lkLT5yYXdbOF0sICZyYmxvY2stPmd1aWRfZW50cmllc1tpbmRleF0sIHNpemVvZih1NjQpKTsKIAogcXVlcnlfZ2lkMToKLQlrZnJlZShyYmxvY2spOworCWVoY2FfZnJlZV9md19jdHJsYmxvY2socmJsb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2lycS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9pcnEuYwppbmRleCAwNDhjYzQ0Li5jM2VhNzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2lycS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXJxLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICJlaGNhX3Rvb2xzLmgiCiAjaW5jbHVkZSAiaGNwX2lmLmgiCiAjaW5jbHVkZSAiaGlwel9mbnMuaCIKKyNpbmNsdWRlICJpcHpfcHRfZm4uaCIKIAogI2RlZmluZSBFUUVfQ09NUExFVElPTl9FVkVOVCAgIEVIQ0FfQk1BU0tfSUJNKDEsMSkKICNkZWZpbmUgRVFFX0NRX1FQX05VTUJFUiAgICAgICBFSENBX0JNQVNLX0lCTSg4LDMxKQpAQCAtMTM3LDM4ICsxMzgsMzYgQEAKIAl1NjQgKnJibG9jazsKIAl1bnNpZ25lZCBsb25nIGJsb2NrX2NvdW50OwogCi0JcmJsb2NrID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJcmJsb2NrID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIXJibG9jaykgewogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiQ2Fubm90IGFsbG9jYXRlIHJibG9jayBtZW1vcnkuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZGF0YTE7CiAJfQogCisJLyogcmJsb2NrIG11c3QgYmUgNEsgYWxpZ25lZCBhbmQgc2hvdWxkIGJlIDRLIGxhcmdlICovCiAJcmV0ID0gaGlwel9oX2Vycm9yX2RhdGEoc2hjYS0+aXB6X2hjYV9oYW5kbGUsCiAJCQkJcmVzb3VyY2UsCiAJCQkJcmJsb2NrLAogCQkJCSZibG9ja19jb3VudCk7CiAKLQlpZiAocmV0ID09IEhfUl9TVEFURSkgeworCWlmIChyZXQgPT0gSF9SX1NUQVRFKQogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLAogCQkJICJObyBlcnJvciBkYXRhIGlzIGF2YWlsYWJsZTogJWx4LiIsIHJlc291cmNlKTsKLQl9CiAJZWxzZSBpZiAocmV0ID09IEhfU1VDQ0VTUykgewogCQlpbnQgbGVuZ3RoOwogCiAJCWxlbmd0aCA9IEVIQ0FfQk1BU0tfR0VUKEVSUk9SX0RBVEFfTEVOR1RILCByYmxvY2tbMF0pOwogCi0JCWlmIChsZW5ndGggPiBQQUdFX1NJWkUpCi0JCQlsZW5ndGggPSBQQUdFX1NJWkU7CisJCWlmIChsZW5ndGggPiBFSENBX1BBR0VTSVpFKQorCQkJbGVuZ3RoID0gRUhDQV9QQUdFU0laRTsKIAogCQlwcmludF9lcnJvcl9kYXRhKHNoY2EsIGRhdGEsIHJibG9jaywgbGVuZ3RoKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlCiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsCiAJCQkgIkVycm9yIGRhdGEgY291bGQgbm90IGJlIGZldGNoZWQ6ICVseCIsIHJlc291cmNlKTsKLQl9CiAKLQlrZnJlZShyYmxvY2spOworCWVoY2FfZnJlZV9md19jdHJsYmxvY2socmJsb2NrKTsKIAogZXJyb3JfZGF0YTE6CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2l2ZXJicy5oCmluZGV4IDMxOWMzOWQuLjM3MjBlMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9pdmVyYnMuaApAQCAtMTc5LDQgKzE3OSwxMiBAQAogCiBpbnQgZWhjYV9tdW5tYXAodW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgbGVuKTsKIAorI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCit2b2lkICplaGNhX2FsbG9jX2Z3X2N0cmxibG9jayh2b2lkKTsKK3ZvaWQgZWhjYV9mcmVlX2Z3X2N0cmxibG9jayh2b2lkICpwdHIpOworI2Vsc2UKKyNkZWZpbmUgZWhjYV9hbGxvY19md19jdHJsYmxvY2soKSAoKHZvaWQgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKQorI2RlZmluZSBlaGNhX2ZyZWVfZndfY3RybGJsb2NrKHB0cikgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKShwdHIpKQorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21haW4uYwppbmRleCAwMjRkNTExLi5jYzQ3ZTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21haW4uYwpAQCAtNDAsNiArNDAsOSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAorI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2VuZGlmCiAjaW5jbHVkZSAiZWhjYV9jbGFzc2VzLmgiCiAjaW5jbHVkZSAiZWhjYV9pdmVyYnMuaCIKICNpbmNsdWRlICJlaGNhX21ybXcuaCIKQEAgLTQ5LDcgKzUyLDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkNocmlzdG9waCBSYWlzY2ggPHJhaXNjaEBkZS5pYm0uY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJQk0gZVNlcnZlciBIQ0EgSW5maW5pQmFuZCBEZXZpY2UgRHJpdmVyIik7Ci1NT0RVTEVfVkVSU0lPTigiU1ZORUhDQV8wMDE3Iik7CitNT0RVTEVfVkVSU0lPTigiU1ZORUhDQV8wMDE5Iik7CiAKIGludCBlaGNhX29wZW5fYXFwMSAgICAgPSAwOwogaW50IGVoY2FfZGVidWdfbGV2ZWwgICA9IDA7CkBAIC05NCwxMSArOTcsMzEgQEAKIERFRklORV9JRFIoZWhjYV9xcF9pZHIpOwogREVGSU5FX0lEUihlaGNhX2NxX2lkcik7CiAKKwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc2hjYV9saXN0OyAvKiBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGVoY2FzICovCiBzdGF0aWMgc3BpbmxvY2tfdCBzaGNhX2xpc3RfbG9jazsKIAogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHBvbGxfZXFzX3RpbWVyOwogCisjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY3RibGtfY2FjaGUgPSBOVUxMOworCit2b2lkICplaGNhX2FsbG9jX2Z3X2N0cmxibG9jayh2b2lkKQoreworCXZvaWQgKnJldCA9IGttZW1fY2FjaGVfemFsbG9jKGN0YmxrX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJldCkKKwkJZWhjYV9nZW5fZXJyKCJPdXQgb2YgbWVtb3J5IGZvciBjdGJsayIpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZWhjYV9mcmVlX2Z3X2N0cmxibG9jayh2b2lkICpwdHIpCit7CisJaWYgKHB0cikKKwkJa21lbV9jYWNoZV9mcmVlKGN0YmxrX2NhY2hlLCBwdHIpOworCit9CisjZW5kaWYKKwogc3RhdGljIGludCBlaGNhX2NyZWF0ZV9zbGFiX2NhY2hlcyh2b2lkKQogewogCWludCByZXQ7CkBAIC0xMzMsNiArMTU2LDE3IEBACiAJCWdvdG8gY3JlYXRlX3NsYWJfY2FjaGVzNTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUworCWN0YmxrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImVoY2FfY2FjaGVfY3RibGsiLAorCQkJCQlFSENBX1BBR0VTSVpFLCBIX0NCX0FMSUdOTUVOVCwKKwkJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQlOVUxMLCBOVUxMKTsKKwlpZiAoIWN0YmxrX2NhY2hlKSB7CisJCWVoY2FfZ2VuX2VycigiQ2Fubm90IGNyZWF0ZSBjdGJsayBTTEFCIGNhY2hlLiIpOworCQllaGNhX2NsZWFudXBfbXJtd19jYWNoZSgpOworCQlnb3RvIGNyZWF0ZV9zbGFiX2NhY2hlczU7CisJfQorI2VuZGlmCiAJcmV0dXJuIDA7CiAKIGNyZWF0ZV9zbGFiX2NhY2hlczU6CkBAIC0xNTcsNiArMTkxLDEwIEBACiAJZWhjYV9jbGVhbnVwX3FwX2NhY2hlKCk7CiAJZWhjYV9jbGVhbnVwX2NxX2NhY2hlKCk7CiAJZWhjYV9jbGVhbnVwX3BkX2NhY2hlKCk7CisjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKKwlpZiAoY3RibGtfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShjdGJsa19jYWNoZSk7CisjZW5kaWYKIH0KIAogI2RlZmluZSBFSENBX0hDQUFWRVIgIEVIQ0FfQk1BU0tfSUJNKDMyLDM5KQpAQCAtMTY4LDcgKzIwNiw3IEBACiAJdTY0IGhfcmV0OwogCXN0cnVjdCBoaXB6X3F1ZXJ5X2hjYSAqcmJsb2NrOwogCi0JcmJsb2NrID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJcmJsb2NrID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIXJibG9jaykgewogCQllaGNhX2dlbl9lcnIoIkNhbm5vdCBhbGxvY2F0ZSByYmxvY2sgbWVtb3J5LiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIxMSw3ICsyNDksNyBAQAogCXNoY2EtPnNwb3J0WzFdLnJhdGUgPSBJQl9SQVRFXzMwX0dCUFM7CiAKIG51bV9wb3J0czE6Ci0Ja2ZyZWUocmJsb2NrKTsKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHJibG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjIwLDcgKzI1OCw3IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGhpcHpfcXVlcnlfaGNhICpyYmxvY2s7CiAKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwlyYmxvY2sgPSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpOwogCWlmICghcmJsb2NrKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJDYW4ndCBhbGxvY2F0ZSByYmxvY2sgbWVtb3J5LiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIzNSw3ICsyNzMsNyBAQAogCW1lbWNweSgmc2hjYS0+aWJfZGV2aWNlLm5vZGVfZ3VpZCwgJnJibG9jay0+bm9kZV9ndWlkLCBzaXplb2YodTY0KSk7CiAKIGluaXRfbm9kZV9ndWlkMToKLQlrZnJlZShyYmxvY2spOworCWVoY2FfZnJlZV9md19jdHJsYmxvY2socmJsb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MzEsNyArNDY5LDcgQEAKIAkJCQkJCQkJCSAgIFwKIAlzaGNhID0gZGV2LT5kcml2ZXJfZGF0YTsJCQkJCSAgIFwKIAkJCQkJCQkJCSAgIFwKLQlyYmxvY2sgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsJCQkgICBcCisJcmJsb2NrID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsJCQkJICAgXAogCWlmICghcmJsb2NrKSB7CQkJCQkJICAgICAgICAgICBcCiAJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgcmJsb2NrIG1lbW9yeS4iKTsJCSAgIFwKIAkJcmV0dXJuIDA7CQkJCQkJICAgXApAQCAtNDM5LDEyICs0NzcsMTIgQEAKIAkJCQkJCQkJCSAgIFwKIAlpZiAoaGlwel9oX3F1ZXJ5X2hjYShzaGNhLT5pcHpfaGNhX2hhbmRsZSwgcmJsb2NrKSAhPSBIX1NVQ0NFU1MpIHsgXAogCQlkZXZfZXJyKGRldiwgIkNhbid0IHF1ZXJ5IGRldmljZSBwcm9wZXJ0aWVzIik7CSAgIAkgICBcCi0JCWtmcmVlKHJibG9jayk7CQkJCQkgICAJICAgXAorCQllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHJibG9jayk7CQkJICAgCSAgIFwKIAkJcmV0dXJuIDA7CQkJCQkgICAJICAgXAogCX0JCQkJCQkJCSAgIFwKIAkJCQkJCQkJCSAgIFwKIAlkYXRhID0gcmJsb2NrLT5uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWtmcmVlKHJibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhyYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCQkJCQkJCSAgIFwKIAlpZiAoKHN0cmNtcCgjbmFtZSwgIm51bV9wb3J0cyIpID09IDApICYmIChlaGNhX25yX3BvcnRzID09IDEpKQkgICBcCiAJCXJldHVybiBzbnByaW50ZihidWYsIDI1NiwgIjFcbiIpOwkJCSAgIFwKQEAgLTc1Miw3ICs3OTAsNyBAQAogCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJlSENBIEluZmluaWJhbmQgRGV2aWNlIERyaXZlciAiCi0JICAgICAgICAgICAgICAgICAiKFJlbC46IFNWTkVIQ0FfMDAxNylcbiIpOworCSAgICAgICAgICAgICAgICAgIihSZWwuOiBTVk5FSENBXzAwMTkpXG4iKTsKIAlpZHJfaW5pdCgmZWhjYV9xcF9pZHIpOwogCWlkcl9pbml0KCZlaGNhX2NxX2lkcik7CiAJc3Bpbl9sb2NrX2luaXQoJmVoY2FfcXBfaWRyX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tcm13LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYwppbmRleCA1Y2E2NTQ0Li4wYTVlMjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYwpAQCAtNTMsNyArNTMsNyBAQAogewogCXN0cnVjdCBlaGNhX21yICptZTsKIAotCW1lID0ga21lbV9jYWNoZV9hbGxvYyhtcl9jYWNoZSwgU0xBQl9LRVJORUwpOworCW1lID0ga21lbV9jYWNoZV9hbGxvYyhtcl9jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1lKSB7CiAJCW1lbXNldChtZSwgMCwgc2l6ZW9mKHN0cnVjdCBlaGNhX21yKSk7CiAJCXNwaW5fbG9ja19pbml0KCZtZS0+bXJsb2NrKTsKQEAgLTcyLDcgKzcyLDcgQEAKIHsKIAlzdHJ1Y3QgZWhjYV9tdyAqbWU7CiAKLQltZSA9IGttZW1fY2FjaGVfYWxsb2MobXdfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwltZSA9IGttZW1fY2FjaGVfYWxsb2MobXdfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmIChtZSkgewogCQltZW1zZXQobWUsIDAsIHNpemVvZihzdHJ1Y3QgZWhjYV9tdykpOwogCQlzcGluX2xvY2tfaW5pdCgmbWUtPm13bG9jayk7CkBAIC0xMDEzLDcgKzEwMTMsNyBAQAogCXUzMiBpOwogCXU2NCAqa3BhZ2U7CiAKLQlrcGFnZSA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWtwYWdlID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIWtwYWdlKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJrcGFnZSBhbGxvYyBmYWlsZWQiKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTEwOTIsNyArMTA5Miw3IEBACiAKIAogZWhjYV9yZWdfbXJfcnBhZ2VzX2V4aXQxOgotCWtmcmVlKGtwYWdlKTsKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKGtwYWdlKTsKIGVoY2FfcmVnX21yX3JwYWdlc19leGl0MDoKIAlpZiAocmV0KQogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAicmV0PSV4IHNoY2E9JXAgZV9tcj0lcCBwZ2luZm89JXAgIgpAQCAtMTEyNCw3ICsxMTI0LDcgQEAKIAllaGNhX21ybXdfbWFwX2FjbChhY2wsICZoaXB6X2FjbCk7CiAJZWhjYV9tcm13X3NldF9wZ3NpemVfaGlwel9hY2woJmhpcHpfYWNsKTsKIAotCWtwYWdlID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJa3BhZ2UgPSBlaGNhX2FsbG9jX2Z3X2N0cmxibG9jaygpOwogCWlmICgha3BhZ2UpIHsKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgImtwYWdlIGFsbG9jIGZhaWxlZCIpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTE4MSw3ICsxMTgxLDcgQEAKIAl9CiAKIGVoY2FfcmVyZWdfbXJfcmVyZWcxX2V4aXQxOgotCWtmcmVlKGtwYWdlKTsKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKGtwYWdlKTsKIGVoY2FfcmVyZWdfbXJfcmVyZWcxX2V4aXQwOgogCWlmICggcmV0ICYmIChyZXQgIT0gLUVBR0FJTikgKQogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAicmV0PSV4IGxrZXk9JXggcmtleT0leCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3BkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3BkLmMKaW5kZXggMmMzY2RjNi4uZDUzNDVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9wZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcGQuYwpAQCAtNTAsNyArNTAsNyBAQAogewogCXN0cnVjdCBlaGNhX3BkICpwZDsKIAotCXBkID0ga21lbV9jYWNoZV9hbGxvYyhwZF9jYWNoZSwgU0xBQl9LRVJORUwpOworCXBkID0ga21lbV9jYWNoZV9hbGxvYyhwZF9jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZCkgewogCQllaGNhX2VycihkZXZpY2UsICJkZXZpY2U9JXAgY29udGV4dD0lcCBvdXQgb2YgbWVtb3J5IiwKIAkJCSBkZXZpY2UsIGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jCmluZGV4IDQzOTQxMjMuLmM2YzljZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCWlmIChwZC0+dW9iamVjdCAmJiB1ZGF0YSkKIAkJY29udGV4dCA9IHBkLT51b2JqZWN0LT5jb250ZXh0OwogCi0JbXlfcXAgPSBrbWVtX2NhY2hlX2FsbG9jKHFwX2NhY2hlLCBTTEFCX0tFUk5FTCk7CisJbXlfcXAgPSBrbWVtX2NhY2hlX2FsbG9jKHFwX2NhY2hlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW15X3FwKSB7CiAJCWVoY2FfZXJyKHBkLT5kZXZpY2UsICJwZD0lcCBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvYyBxcCIsIHBkKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC03MzIsOCArNzMyLDcgQEAKIAl1NjQgaF9yZXQ7CiAJc3RydWN0IGlwel9xdWV1ZSAqc3F1ZXVlOwogCXZvaWQgKmJhZF9zZW5kX3dxZV9wLCAqYmFkX3NlbmRfd3FlX3Y7Ci0Jdm9pZCAqc3F1ZXVlX3N0YXJ0X3AsICpzcXVldWVfZW5kX3A7Ci0Jdm9pZCAqc3F1ZXVlX3N0YXJ0X3YsICpzcXVldWVfZW5kX3Y7CisJdTY0IHFfb2ZzOwogCXN0cnVjdCBlaGNhX3dxZSAqd3FlOwogCWludCBxcF9udW0gPSBteV9xcC0+aWJfcXAucXBfbnVtOwogCkBAIC03NTUsMjYgKzc1NCwyMyBAQAogCWlmIChlaGNhX2RlYnVnX2xldmVsKQogCQllaGNhX2RtcChiYWRfc2VuZF93cWVfdiwgMzIsICJxcF9udW09JXggYmFkX3dxZSIsIHFwX251bSk7CiAJc3F1ZXVlID0gJm15X3FwLT5pcHpfc3F1ZXVlOwotCXNxdWV1ZV9zdGFydF9wID0gKHZvaWQqKXZpcnRfdG9fYWJzKGlwel9xZWl0X2NhbGMoc3F1ZXVlLCAwTCkpOwotCXNxdWV1ZV9lbmRfcCA9IHNxdWV1ZV9zdGFydF9wK3NxdWV1ZS0+cXVldWVfbGVuZ3RoOwotCXNxdWV1ZV9zdGFydF92ID0gYWJzX3RvX3ZpcnQoKHU2NClzcXVldWVfc3RhcnRfcCk7Ci0Jc3F1ZXVlX2VuZF92ID0gYWJzX3RvX3ZpcnQoKHU2NClzcXVldWVfZW5kX3ApOwotCWVoY2FfZGJnKCZzaGNhLT5pYl9kZXZpY2UsICJxcF9udW09JXggc3F1ZXVlX3N0YXJ0X3Y9JXAgc3F1ZXVlX2VuZF92PSVwIiwKLQkJIHFwX251bSwgc3F1ZXVlX3N0YXJ0X3YsIHNxdWV1ZV9lbmRfdik7CisJaWYgKGlwel9xdWV1ZV9hYnNfdG9fb2Zmc2V0KHNxdWV1ZSwgKHU2NCliYWRfc2VuZF93cWVfcCwgJnFfb2ZzKSkgeworCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiZmFpbGVkIHRvIGdldCB3cWUgb2Zmc2V0IHFwX251bT0leCIKKwkJCSAiIGJhZF9zZW5kX3dxZV9wPSVwIiwgcXBfbnVtLCBiYWRfc2VuZF93cWVfcCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAogCS8qIGxvb3Agc2V0cyB3cWUncyBwdXJnZSBiaXQgKi8KLQl3cWUgPSAoc3RydWN0IGVoY2Ffd3FlKiliYWRfc2VuZF93cWVfdjsKKwl3cWUgPSAoc3RydWN0IGVoY2Ffd3FlKilpcHpfcWVpdF9jYWxjKHNxdWV1ZSwgcV9vZnMpOwogCSpiYWRfd3FlX2NudCA9IDA7CiAJd2hpbGUgKHdxZS0+b3B0eXBlICE9IDB4ZmYgJiYgd3FlLT53cWVmICE9IDB4ZmYpIHsKIAkJaWYgKGVoY2FfZGVidWdfbGV2ZWwpCiAJCQllaGNhX2RtcCh3cWUsIDMyLCAicXBfbnVtPSV4IHdxZSIsIHFwX251bSk7CiAJCXdxZS0+bnJfb2ZfZGF0YV9zZWcgPSAwOyAvKiBzdXBwcmVzcyBkYXRhIGFjY2VzcyAqLwogCQl3cWUtPndxZWYgPSBXUUVGX1BVUkdFOyAvKiBXUUUgdG8gYmUgcHVyZ2VkICovCi0JCXdxZSA9IChzdHJ1Y3QgZWhjYV93cWUqKSgodTgqKXdxZStzcXVldWUtPnFlX3NpemUpOworCQlxX29mcyA9IGlwel9xdWV1ZV9hZHZhbmNlX29mZnNldChzcXVldWUsIHFfb2ZzKTsKKwkJd3FlID0gKHN0cnVjdCBlaGNhX3dxZSopaXB6X3FlaXRfY2FsYyhzcXVldWUsIHFfb2ZzKTsKIAkJKmJhZF93cWVfY250ID0gKCpiYWRfd3FlX2NudCkrMTsKLQkJaWYgKCh2b2lkKil3cWUgPj0gc3F1ZXVlX2VuZF92KSB7Ci0JCQl3cWUgPSBzcXVldWVfc3RhcnRfdjsKLQkJfQogCX0KIAkvKgogCSAqIGJhZCB3cWUgd2lsbCBiZSByZXByb2Nlc3NlZCBhbmQgaWdub3JlZCB3aGVuIHBvbF9jcSgpIGlzIGNhbGxlZCwKQEAgLTgxMSw4ICs4MDcsOCBAQAogCXVuc2lnbmVkIGxvbmcgc3BsX2ZsYWdzID0gMDsKIAogCS8qIGRvIHF1ZXJ5X3FwIHRvIG9idGFpbiBjdXJyZW50IGF0dHIgdmFsdWVzICovCi0JbXFwY2IgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKLQlpZiAobXFwY2IgPT0gTlVMTCkgeworCW1xcGNiID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKKwlpZiAoIW1xcGNiKSB7CiAJCWVoY2FfZXJyKGlicXAtPmRldmljZSwgIkNvdWxkIG5vdCBnZXQgemVyb2VkIHBhZ2UgZm9yIG1xcGNiICIKIAkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXggIiwgbXlfcXAsIGlicXAtPnFwX251bSk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTIyNSw3ICsxMjIxLDcgQEAKIAl9CiAKIG1vZGlmeV9xcF9leGl0MToKLQlrZnJlZShtcXBjYik7CisJZWhjYV9mcmVlX2Z3X2N0cmxibG9jayhtcXBjYik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTI3Nyw3ICsxMjczLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcXBjYiA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwgKTsKKwlxcGNiID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soKTsKIAlpZiAoIXFwY2IpIHsKIAkJZWhjYV9lcnIocXAtPmRldmljZSwiT3V0IG9mIG1lbW9yeSBmb3IgcXBjYiAiCiAJCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IiwgbXlfcXAsIHFwLT5xcF9udW0pOwpAQCAtMTQwMSw3ICsxMzk3LDcgQEAKIAkJZWhjYV9kbXAocXBjYiwgNCo3MCwgInFwX251bT0leCIsIHFwLT5xcF9udW0pOwogCiBxdWVyeV9xcF9leGl0MToKLQlrZnJlZShxcGNiKTsKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHFwY2IpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfdG9vbHMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfdG9vbHMuaAppbmRleCA4MDlkYTNlLi45NzNjNGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3Rvb2xzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV90b29scy5oCkBAIC02Myw2ICs2Myw3IEBACiAjaW5jbHVkZSA8YXNtL2libWVidXMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KIAogZXh0ZXJuIGludCBlaGNhX2RlYnVnX2xldmVsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oaXB6X2h3LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oaXB6X2h3LmgKaW5kZXggM2ZjOTJiMC4uZmFkOTEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaGlwel9ody5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hpcHpfaHcuaApAQCAtNDUsNiArNDUsOCBAQAogCiAjaW5jbHVkZSAiZWhjYV90b29scy5oIgogCisjZGVmaW5lIEVIQ0FfTUFYX01UVSA0CisKIC8qIFFQIFRhYmxlIEVudHJ5IE1lbW9yeSBNYXAgKi8KIHN0cnVjdCBoaXB6X3FwdGVtbSB7CiAJdTY0IHFweF9oY3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9pcHpfcHRfZm4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5jCmluZGV4IGUwMjhmZjEuLmJmN2E0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5jCkBAIC03MCw2ICs3MCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBpcHpfcXVldWVfYWJzX3RvX29mZnNldChzdHJ1Y3QgaXB6X3F1ZXVlICpxdWV1ZSwgdTY0IGFkZHIsIHU2NCAqcV9vZmZzZXQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHF1ZXVlLT5xdWV1ZV9sZW5ndGggLyBxdWV1ZS0+cGFnZXNpemU7IGkrKykgeworCQl1NjQgcGFnZSA9ICh1NjQpdmlydF90b19hYnMocXVldWUtPnF1ZXVlX3BhZ2VzW2ldKTsKKwkJaWYgKGFkZHIgPj0gcGFnZSAmJiBhZGRyIDwgcGFnZSArIHF1ZXVlLT5wYWdlc2l6ZSkgeworCQkJKnFfb2Zmc2V0ID0gYWRkciAtIHBhZ2UgKyBpICogcXVldWUtPnBhZ2VzaXplOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIGludCBpcHpfcXVldWVfY3RvcihzdHJ1Y3QgaXB6X3F1ZXVlICpxdWV1ZSwKIAkJICAgY29uc3QgdTMyIG5yX29mX3BhZ2VzLAogCQkgICBjb25zdCB1MzIgcGFnZXNpemUsIGNvbnN0IHUzMiBxZV9zaXplLCBjb25zdCB1MzIgbnJfb2Zfc2cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9pcHpfcHRfZm4uaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5oCmluZGV4IDJmMTM1MDkuLmRjM2JkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2lwel9wdF9mbi5oCkBAIC0xNTAsNiArMTUwLDIxIEBACiAJcmV0dXJuIGlwel9xZWl0X2dldChxdWV1ZSk7CiB9CiAKKy8qCisgKiByZXR1cm4gdGhlIHFfb2Zmc2V0IGNvcnJlc3BvbmRpbmcgdG8gYW4gYWJzb2x1dGUgYWRkcmVzcworICovCitpbnQgaXB6X3F1ZXVlX2Fic190b19vZmZzZXQoc3RydWN0IGlwel9xdWV1ZSAqcXVldWUsIHU2NCBhZGRyLCB1NjQgKnFfb2Zmc2V0KTsKKworLyoKKyAqIHJldHVybiB0aGUgbmV4dCBxdWV1ZSBvZmZzZXQuIGRvbid0IG1vZGlmeSB0aGUgcXVldWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IGlwel9xdWV1ZV9hZHZhbmNlX29mZnNldChzdHJ1Y3QgaXB6X3F1ZXVlICpxdWV1ZSwgdTY0IG9mZnNldCkKK3sKKwlvZmZzZXQgKz0gcXVldWUtPnFlX3NpemU7CisJaWYgKG9mZnNldCA+PSBxdWV1ZS0+cXVldWVfbGVuZ3RoKSBvZmZzZXQgPSAwOworCXJldHVybiBvZmZzZXQ7Cit9CisKIC8qIHN0cnVjdCBnZW5lcmljIHBhZ2UgdGFibGUgKi8KIHN0cnVjdCBpcHpfcHQgewogCXU2NCBlbnRyaWVzW0VIQ0FfUFRfRU5UUklFU107CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9LY29uZmlnCmluZGV4IDU3NGE2NzguLjkwYzE0NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIElORklOSUJBTkRfSVBBVEgKIAl0cmlzdGF0ZSAiUUxvZ2ljIEluZmluaVBhdGggRHJpdmVyIgotCWRlcGVuZHMgb24gUENJX01TSSAmJiA2NEJJVCAmJiBJTkZJTklCQU5ECisJZGVwZW5kcyBvbiAoUENJX01TSSB8fCBIVF9JUlEpICYmIDY0QklUICYmIElORklOSUJBTkQgJiYgTkVUCiAJLS0taGVscC0tLQogCVRoaXMgaXMgYSBkcml2ZXIgZm9yIFFMb2dpYyBJbmZpbmlQYXRoIGhvc3QgY2hhbm5lbCBhZGFwdGVycywKIAlpbmNsdWRpbmcgSW5maW5pQmFuZCB2ZXJicyBzdXBwb3J0LiAgVGhpcyBkcml2ZXIgYWxsb3dzIHRoZXNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvTWFrZWZpbGUgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvTWFrZWZpbGUKaW5kZXggNWUyOWNiMC4uZWMyZTYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9NYWtlZmlsZQpAQCAtNiwxMiArNiwxMSBAQAogaWJfaXBhdGgteSA6PSBcCiAJaXBhdGhfY3EubyBcCiAJaXBhdGhfZGlhZy5vIFwKKwlpcGF0aF9kbWEubyBcCiAJaXBhdGhfZHJpdmVyLm8gXAogCWlwYXRoX2VlcHJvbS5vIFwKIAlpcGF0aF9maWxlX29wcy5vIFwKIAlpcGF0aF9mcy5vIFwKLQlpcGF0aF9pYmE2MTEwLm8gXAotCWlwYXRoX2liYTYxMjAubyBcCiAJaXBhdGhfaW5pdF9jaGlwLm8gXAogCWlwYXRoX2ludHIubyBcCiAJaXBhdGhfa2V5cy5vIFwKQEAgLTMxLDUgKzMwLDggQEAKIAlpcGF0aF92ZXJic19tY2FzdC5vIFwKIAlpcGF0aF92ZXJicy5vCiAKK2liX2lwYXRoLSQoQ09ORklHX0hUX0lSUSkgKz0gaXBhdGhfaWJhNjExMC5vCitpYl9pcGF0aC0kKENPTkZJR19QQ0lfTVNJKSArPSBpcGF0aF9pYmE2MTIwLm8KKwogaWJfaXBhdGgtJChDT05GSUdfWDg2XzY0KSArPSBpcGF0aF93Y194ODZfNjQubwogaWJfaXBhdGgtJChDT05GSUdfUFBDNjQpICs9IGlwYXRoX3djX3BwYzY0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGlhZy5jCmluZGV4IDI5OTU4YjYuLjI4YzA4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RpYWcuYwpAQCAtNjcsMTkgKzY3LDU0IEBACiAJLnJlbGVhc2UgPSBpcGF0aF9kaWFnX3JlbGVhc2UKIH07CiAKK3N0YXRpYyBzc2l6ZV90IGlwYXRoX2RpYWdwa3Rfd3JpdGUoc3RydWN0IGZpbGUgKmZwLAorCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkaWFncGt0X2ZpbGVfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS53cml0ZSA9IGlwYXRoX2RpYWdwa3Rfd3JpdGUsCit9OworCitzdGF0aWMgYXRvbWljX3QgZGlhZ3BrdF9jb3VudCA9IEFUT01JQ19JTklUKDApOworc3RhdGljIHN0cnVjdCBjZGV2ICpkaWFncGt0X2NkZXY7CitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZSAqZGlhZ3BrdF9jbGFzc19kZXY7CisKIGludCBpcGF0aF9kaWFnX2FkZChzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQpCiB7CiAJY2hhciBuYW1lWzE2XTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhdG9taWNfaW5jX3JldHVybigmZGlhZ3BrdF9jb3VudCkgPT0gMSkgeworCQlyZXQgPSBpcGF0aF9jZGV2X2luaXQoSVBBVEhfRElBR1BLVF9NSU5PUiwKKwkJCQkgICAgICAiaXBhdGhfZGlhZ3BrdCIsICZkaWFncGt0X2ZpbGVfb3BzLAorCQkJCSAgICAgICZkaWFncGt0X2NkZXYsICZkaWFncGt0X2NsYXNzX2Rldik7CisKKwkJaWYgKHJldCkgeworCQkJaXBhdGhfZGV2X2VycihkZCwgIkNvdWxkbid0IGNyZWF0ZSBpcGF0aF9kaWFncGt0ICIKKwkJCQkgICAgICAiZGV2aWNlOiAlZCIsIHJldCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CiAKIAlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJpcGF0aF9kaWFnJWQiLCBkZC0+aXBhdGhfdW5pdCk7CiAKLQlyZXR1cm4gaXBhdGhfY2Rldl9pbml0KElQQVRIX0RJQUdfTUlOT1JfQkFTRSArIGRkLT5pcGF0aF91bml0LCBuYW1lLAotCQkJICAgICAgICZkaWFnX2ZpbGVfb3BzLCAmZGQtPmRpYWdfY2RldiwKLQkJCSAgICAgICAmZGQtPmRpYWdfY2xhc3NfZGV2KTsKKwlyZXQgPSBpcGF0aF9jZGV2X2luaXQoSVBBVEhfRElBR19NSU5PUl9CQVNFICsgZGQtPmlwYXRoX3VuaXQsIG5hbWUsCisJCQkgICAgICAmZGlhZ19maWxlX29wcywgJmRkLT5kaWFnX2NkZXYsCisJCQkgICAgICAmZGQtPmRpYWdfY2xhc3NfZGV2KTsKKwlpZiAocmV0KQorCQlpcGF0aF9kZXZfZXJyKGRkLCAiQ291bGRuJ3QgY3JlYXRlICVzIGRldmljZTogJWQiLAorCQkJICAgICAgbmFtZSwgcmV0KTsKKworZG9uZToKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGlwYXRoX2RpYWdfcmVtb3ZlKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKIHsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGlhZ3BrdF9jb3VudCkpCisJCWlwYXRoX2NkZXZfY2xlYW51cCgmZGlhZ3BrdF9jZGV2LCAmZGlhZ3BrdF9jbGFzc19kZXYpOworCiAJaXBhdGhfY2Rldl9jbGVhbnVwKCZkZC0+ZGlhZ19jZGV2LCAmZGQtPmRpYWdfY2xhc3NfZGV2KTsKIH0KIApAQCAtMjc1LDMwICszMTAsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGlwYXRoX2RpYWdwa3Rfd3JpdGUoc3RydWN0IGZpbGUgKmZwLAotCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAotCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOwotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkaWFncGt0X2ZpbGVfb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS53cml0ZSA9IGlwYXRoX2RpYWdwa3Rfd3JpdGUsCi19OwotCi1zdGF0aWMgc3RydWN0IGNkZXYgKmRpYWdwa3RfY2RldjsKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkaWFncGt0X2NsYXNzX2RldjsKLQotaW50IF9faW5pdCBpcGF0aF9kaWFncGt0X2FkZCh2b2lkKQotewotCXJldHVybiBpcGF0aF9jZGV2X2luaXQoSVBBVEhfRElBR1BLVF9NSU5PUiwKLQkJCSAgICAgICAiaXBhdGhfZGlhZ3BrdCIsICZkaWFncGt0X2ZpbGVfb3BzLAotCQkJICAgICAgICZkaWFncGt0X2NkZXYsICZkaWFncGt0X2NsYXNzX2Rldik7Ci19Ci0KLXZvaWQgX19leGl0IGlwYXRoX2RpYWdwa3RfcmVtb3ZlKHZvaWQpCi17Ci0JaXBhdGhfY2Rldl9jbGVhbnVwKCZkaWFncGt0X2NkZXYsICZkaWFncGt0X2NsYXNzX2Rldik7Ci19Ci0KIC8qKgogICogaXBhdGhfZGlhZ3BrdF93cml0ZSAtIHdyaXRlIGFuIElCIHBhY2tldAogICogQGZwOiB0aGUgZGlhZyBkYXRhIGRldmljZSBmaWxlIHBvaW50ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kbWEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBmMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RtYS5jCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFFMb2dpYywgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgorCisjaW5jbHVkZSAiaXBhdGhfdmVyYnMuaCIKKworI2RlZmluZSBCQURfRE1BX0FERFJFU1MgKCh1NjQpIDApCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBpbXBsZW1lbnQgZHJpdmVyIHNwZWNpZmljIHJlcGxhY2VtZW50cworICogZm9yIHRoZSBpYl9kbWFfKigpIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3NlcyBpbnN0ZWFkIG9mCisgKiBkZXZpY2UgYnVzIGFkZHJlc3NlcyBzaW5jZSB0aGUgZHJpdmVyIHVzZXMgdGhlIENQVSB0byBjb3B5CisgKiBkYXRhIGluc3RlYWQgb2YgdXNpbmcgaGFyZHdhcmUgRE1BLgorICovCisKK3N0YXRpYyBpbnQgaXBhdGhfbWFwcGluZ19lcnJvcihzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsIHU2NCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gZG1hX2FkZHIgPT0gQkFEX0RNQV9BRERSRVNTOworfQorCitzdGF0aWMgdTY0IGlwYXRoX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCSAgICAgICAgdm9pZCAqY3B1X2FkZHIsIHNpemVfdCBzaXplLAorCQkJICAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcmVjdGlvbikpOworCXJldHVybiAodTY0KSBjcHVfYWRkcjsKK30KKworc3RhdGljIHZvaWQgaXBhdGhfZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJICAgdTY0IGFkZHIsIHNpemVfdCBzaXplLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlCVUdfT04oIXZhbGlkX2RtYV9kaXJlY3Rpb24oZGlyZWN0aW9uKSk7Cit9CisKK3N0YXRpYyB1NjQgaXBhdGhfZG1hX21hcF9wYWdlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwl1NjQgYWRkcjsKKworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXJlY3Rpb24pKTsKKworCWlmIChvZmZzZXQgKyBzaXplID4gUEFHRV9TSVpFKSB7CisJCWFkZHIgPSBCQURfRE1BX0FERFJFU1M7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlhZGRyID0gKHU2NCkgcGFnZV9hZGRyZXNzKHBhZ2UpOworCWlmIChhZGRyKQorCQlhZGRyICs9IG9mZnNldDsKKwkvKiBUT0RPOiBoYW5kbGUgaGlnaG1lbSBwYWdlcyAqLworCitkb25lOgorCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgdm9pZCBpcGF0aF9kbWFfdW5tYXBfcGFnZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJIHU2NCBhZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXJlY3Rpb24pKTsKK30KKworaW50IGlwYXRoX21hcF9zZyhzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwl1NjQgYWRkcjsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gbmVudHM7CisKKwlCVUdfT04oIXZhbGlkX2RtYV9kaXJlY3Rpb24oZGlyZWN0aW9uKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKykgeworCQlhZGRyID0gKHU2NCkgcGFnZV9hZGRyZXNzKHNnW2ldLnBhZ2UpOworCQkvKiBUT0RPOiBoYW5kbGUgaGlnaG1lbSBwYWdlcyAqLworCQlpZiAoIWFkZHIpIHsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpcGF0aF91bm1hcF9zZyhzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcmVjdGlvbikpOworfQorCitzdGF0aWMgdTY0IGlwYXRoX3NnX2RtYV9hZGRyZXNzKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwl1NjQgYWRkciA9ICh1NjQpIHBhZ2VfYWRkcmVzcyhzZy0+cGFnZSk7CisKKwlpZiAoYWRkcikKKwkJYWRkciArPSBzZy0+b2Zmc2V0OworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwYXRoX3NnX2RtYV9sZW4oc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwlyZXR1cm4gc2ctPmxlbmd0aDsKK30KKworc3RhdGljIHZvaWQgaXBhdGhfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJICAgICAgdTY0IGFkZHIsCisJCQkJICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworfQorCitzdGF0aWMgdm9pZCBpcGF0aF9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkJIHU2NCBhZGRyLAorCQkJCQkgc2l6ZV90IHNpemUsCisJCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7Cit9CisKK3N0YXRpYyB2b2lkICppcGF0aF9kbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGliX2RldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICB1NjQgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCit7CisJc3RydWN0IHBhZ2UgKnA7CisJdm9pZCAqYWRkciA9IE5VTEw7CisKKwlwID0gYWxsb2NfcGFnZXMoZmxhZywgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAocCkKKwkJYWRkciA9IHBhZ2VfYWRkcmVzcyhwKTsKKwlpZiAoZG1hX2hhbmRsZSkKKwkJKmRtYV9oYW5kbGUgPSAodTY0KSBhZGRyOworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgdm9pZCBpcGF0aF9kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGNwdV9hZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOworfQorCitzdHJ1Y3QgaWJfZG1hX21hcHBpbmdfb3BzIGlwYXRoX2RtYV9tYXBwaW5nX29wcyA9IHsKKwlpcGF0aF9tYXBwaW5nX2Vycm9yLAorCWlwYXRoX2RtYV9tYXBfc2luZ2xlLAorCWlwYXRoX2RtYV91bm1hcF9zaW5nbGUsCisJaXBhdGhfZG1hX21hcF9wYWdlLAorCWlwYXRoX2RtYV91bm1hcF9wYWdlLAorCWlwYXRoX21hcF9zZywKKwlpcGF0aF91bm1hcF9zZywKKwlpcGF0aF9zZ19kbWFfYWRkcmVzcywKKwlpcGF0aF9zZ19kbWFfbGVuLAorCWlwYXRoX3N5bmNfc2luZ2xlX2Zvcl9jcHUsCisJaXBhdGhfc3luY19zaW5nbGVfZm9yX2RldmljZSwKKwlpcGF0aF9kbWFfYWxsb2NfY29oZXJlbnQsCisJaXBhdGhfZG1hX2ZyZWVfY29oZXJlbnQKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKaW5kZXggMTJjZWZhNi4uYWU3ZjIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYwpAQCAtMzA0LDcgKzMwNCw3IEBACiAJfQogCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAJbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKLQlpcGF0aF9jZGJnKFZFUkJPU0UsICJyZWdiYXNlICgwKSAlbGx4IGxlbiAlZCBpcnEgJXgsIHZlbmQgJXgvJXggIgorCWlwYXRoX2NkYmcoVkVSQk9TRSwgInJlZ2Jhc2UgKDApICVsbHggbGVuICVkIHBkZXYtPmlycSAlZCwgdmVuZCAleC8leCAiCiAJCSAgICJkcml2ZXJfZGF0YSAlbHhcbiIsIGFkZHIsIGxlbiwgcGRldi0+aXJxLCBlbnQtPnZlbmRvciwKIAkJICAgZW50LT5kZXZpY2UsIGVudC0+ZHJpdmVyX2RhdGEpOwogCkBAIC0zOTAsMTIgKzM5MCwxNiBAQAogCiAJLyogc2V0dXAgdGhlIGNoaXAtc3BlY2lmaWMgZnVuY3Rpb25zLCBhcyBlYXJseSBhcyBwb3NzaWJsZS4gKi8KIAlzd2l0Y2ggKGVudC0+ZGV2aWNlKSB7CisjaWZkZWYgQ09ORklHX0hUX0lSUQogCWNhc2UgUENJX0RFVklDRV9JRF9JTkZJTklQQVRIX0hUOgogCQlpcGF0aF9pbml0X2liYTYxMTBfZnVuY3MoZGQpOwogCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lORklOSVBBVEhfUEU4MDA6CiAJCWlwYXRoX2luaXRfaWJhNjEyMF9mdW5jcyhkZCk7CiAJCWJyZWFrOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJaXBhdGhfZGV2X2VycihkZCwgIkZvdW5kIHVua25vd24gUUxvZ2ljIGRldmljZWlkIDB4JXgsICIKIAkJCSAgICAgICJmYWlsaW5nXG4iLCBlbnQtPmRldmljZSk7CkBAIC00NjcsMTUgKzQ3MSwxNSBAQAogCSAqIGNoZWNrIDAgaXJxIGFmdGVyIHdlIHJldHVybiBmcm9tIGNoaXAtc3BlY2lmaWMgYnVzIHNldHVwLCBzaW5jZQogCSAqIHRoYXQgY2FuIGFmZmVjdCB0aGlzIGR1ZSB0byBzZXR1cAogCSAqLwotCWlmICghcGRldi0+aXJxKQorCWlmICghZGQtPmlwYXRoX2lycSkKIAkJaXBhdGhfZGV2X2VycihkZCwgImlycSBpcyAwLCBCSU9TIGVycm9yPyAgSW50ZXJydXB0cyB3b24ndCAiCiAJCQkgICAgICAid29ya1xuIik7CiAJZWxzZSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaXBhdGhfaW50ciwgSVJRRl9TSEFSRUQsCisJCXJldCA9IHJlcXVlc3RfaXJxKGRkLT5pcGF0aF9pcnEsIGlwYXRoX2ludHIsIElSUUZfU0hBUkVELAogCQkJCSAgSVBBVEhfRFJWX05BTUUsIGRkKTsKIAkJaWYgKHJldCkgewogCQkJaXBhdGhfZGV2X2VycihkZCwgIkNvdWxkbid0IHNldHVwIGlycSBoYW5kbGVyLCAiCi0JCQkJICAgICAgImlycT0ldTogJWRcbiIsIHBkZXYtPmlycSwgcmV0KTsKKwkJCQkgICAgICAiaXJxPSVkOiAlZFxuIiwgZGQtPmlwYXRoX2lycSwgcmV0KTsKIAkJCWdvdG8gYmFpbF9pb3VubWFwOwogCQl9CiAJfQpAQCAtNjM3LDExICs2NDEsMTAgQEAKIAkgKiBmcmVlIHVwIHBvcnQgMCAoa2VybmVsKSByY3ZoZHIsIGVnciBidWZzLCBhbmQgZXZlbnR1YWxseSB0aWQgYnVmcwogCSAqIGZvciBhbGwgdmVyc2lvbnMgb2YgdGhlIGRyaXZlciwgaWYgdGhleSB3ZXJlIGFsbG9jYXRlZAogCSAqLwotCWlmIChwZGV2LT5pcnEpIHsKLQkJaXBhdGhfY2RiZyhWRVJCT1NFLAotCQkJICAgInVuaXQgJXUgZnJlZV9pcnEgb2YgaXJxICV4XG4iLAotCQkJICAgZGQtPmlwYXRoX3VuaXQsIHBkZXYtPmlycSk7Ci0JCWZyZWVfaXJxKHBkZXYtPmlycSwgZGQpOworCWlmIChkZC0+aXBhdGhfaXJxKSB7CisJCWlwYXRoX2NkYmcoVkVSQk9TRSwgInVuaXQgJXUgZnJlZSBpcnEgJWRcbiIsCisJCQkgICBkZC0+aXBhdGhfdW5pdCwgZGQtPmlwYXRoX2lycSk7CisJCWRkLT5pcGF0aF9mX2ZyZWVfaXJxKGRkKTsKIAl9IGVsc2UKIAkJaXBhdGhfZGJnKCJpcnEgaXMgMCwgbm90IGRvaW5nIGZyZWVfaXJxICIKIAkJCSAgImZvciB1bml0ICV1XG4iLCBkZC0+aXBhdGhfdW5pdCk7CkBAIC0xODIyLDggKzE4MjUsNiBAQAogICovCiB2b2lkIGlwYXRoX3NodXRkb3duX2RldmljZShzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQpCiB7Ci0JdTY0IHZhbDsKLQogCWlwYXRoX2RiZygiU2h1dHRpbmcgZG93biB0aGUgZGV2aWNlXG4iKTsKIAogCWRkLT5pcGF0aF9mbGFncyB8PSBJUEFUSF9MSU5LVU5LOwpAQCAtMTg0Niw3ICsxODQ3LDcgQEAKIAkgKi8KIAlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NlbmRjdHJsLCAwVUxMKTsKIAkvKiBmbHVzaCBpdCAqLwotCXZhbCA9IGlwYXRoX3JlYWRfa3JlZzY0KGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NjcmF0Y2gpOworCWlwYXRoX3JlYWRfa3JlZzY0KGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NjcmF0Y2gpOwogCS8qCiAJICogZW5vdWdoIGZvciBhbnl0aGluZyB0aGF0J3MgZ29pbmcgdG8gdHJpY2tsZSBvdXQgdG8gaGF2ZSBhY3R1YWxseQogCSAqIGRvbmUgc28uCkBAIC0yMDA1LDE4ICsyMDA2LDggQEAKIAkJZ290byBiYWlsX2dyb3VwOwogCX0KIAotCXJldCA9IGlwYXRoX2RpYWdwa3RfYWRkKCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIElQQVRIX0RSVl9OQU1FICI6IFVuYWJsZSB0byBjcmVhdGUgIgotCQkgICAgICAgImRpYWcgZGF0YSBkZXZpY2U6IGVycm9yICVkXG4iLCAtcmV0KTsKLQkJZ290byBiYWlsX2lwYXRoZnM7Ci0JfQotCiAJZ290byBiYWlsOwogCi1iYWlsX2lwYXRoZnM6Ci0JaXBhdGhfZXhpdF9pcGF0aGZzKCk7Ci0KIGJhaWxfZ3JvdXA6CiAJaXBhdGhfZHJpdmVyX3JlbW92ZV9ncm91cCgmaXBhdGhfZHJpdmVyLmRyaXZlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKaW5kZXggYTlkZGM2OS4uYjkzMmJjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKQEAgLTY5OSw3ICs2OTksNiBAQAogCQkJICAgICBpbnQgc3RhcnRfc3RvcCkKIHsKIAlzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQgPSBwZC0+cG9ydF9kZDsKLQl1NjQgdHZhbDsKIAogCWlwYXRoX2NkYmcoUFJPQywgIiVzYWJsaW5nIHJjdiBmb3IgdW5pdCAldSBwb3J0ICV1OiV1XG4iLAogCQkgICBzdGFydF9zdG9wID8gImVuIiA6ICJkaXMiLCBkZC0+aXBhdGhfdW5pdCwKQEAgLTcyOSw3ICs3MjgsNyBAQAogCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfcmN2Y3RybCwKIAkJCSBkZC0+aXBhdGhfcmN2Y3RybCk7CiAJLyogbm93IGJlIHN1cmUgY2hpcCBzYXcgaXQgYmVmb3JlIHdlIHJldHVybiAqLwotCXR2YWwgPSBpcGF0aF9yZWFkX2tyZWc2NChkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zY3JhdGNoKTsKKwlpcGF0aF9yZWFkX2tyZWc2NChkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zY3JhdGNoKTsKIAlpZiAoc3RhcnRfc3RvcCkgewogCQkvKgogCQkgKiBBbmQgdHJ5IHRvIGJlIHN1cmUgdGhhdCB0YWlsIHJlZyB1cGRhdGUgaGFzIGhhcHBlbmVkIHRvby4KQEAgLTczOCw3ICs3MzcsNyBAQAogCQkgKiBpbiBtZW1vcnkgY29weSwgc2luY2Ugd2UgY291bGQgb3ZlcndyaXRlIGFuIHVwZGF0ZSBieSB0aGUKIAkJICogY2hpcCBpZiB3ZSBkaWQuCiAJCSAqLwotCQl0dmFsID0gaXBhdGhfcmVhZF91cmVnMzIoZGQsIHVyX3JjdmhkcnRhaWwsIHBkLT5wb3J0X3BvcnQpOworCQlpcGF0aF9yZWFkX3VyZWczMihkZCwgdXJfcmN2aGRydGFpbCwgcGQtPnBvcnRfcG9ydCk7CiAJfQogCS8qIGFsd2F5czsgbmV3IGhlYWQgc2hvdWxkIGJlIGVxdWFsIHRvIG5ldyB0YWlsOyBzZWUgYWJvdmUgKi8KIGJhaWw6CkBAIC0xNzQ1LDkgKzE3NDQsOSBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JaV9taW5vciA9IGltaW5vcihmcC0+Zl9kZW50cnktPmRfaW5vZGUpIC0gSVBBVEhfVVNFUl9NSU5PUl9CQVNFOworCWlfbWlub3IgPSBpbWlub3IoZnAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpIC0gSVBBVEhfVVNFUl9NSU5PUl9CQVNFOwogCWlwYXRoX2NkYmcoVkVSQk9TRSwgIm9wZW4gb24gZGV2ICVseCAobWlub3IgJWQpXG4iLAotCQkgICAobG9uZylmcC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcmRldiwgaV9taW5vcik7CisJCSAgIChsb25nKWZwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3JkZXYsIGlfbWlub3IpOwogCiAJaWYgKGlfbWlub3IpCiAJCXJldCA9IGZpbmRfZnJlZV9wb3J0KGlfbWlub3IgLSAxLCBmcCwgdWluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYwppbmRleCBkOWZmMjgzLi43OWE2MGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYwpAQCAtMTE4LDcgKzExOCw3IEBACiAJdTE2IGk7CiAJc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkOwogCi0JZGQgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOworCWRkID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9DT1VOVEVSUzsgaSsrKQogCQljb3VudGVyc1tpXSA9IGlwYXRoX3NuYXBfY250cihkZCwgaSk7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAlzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQ7CiAJdTY0IGd1aWQ7CiAKLQlkZCA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CisJZGQgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAKIAlndWlkID0gYmU2NF90b19jcHUoZGQtPmlwYXRoX2d1aWQpOwogCkBAIC0xNzcsNyArMTc3LDcgQEAKIAl1MzIgdG1wLCB0bXAyOwogCXN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZDsKIAotCWRkID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZTsKKwlkZCA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZTsKIAogCS8qIHNvIHdlIG9ubHkgaW5pdGlhbGl6ZSBub24temVybyBmaWVsZHMuICovCiAJbWVtc2V0KHBvcnRpbmZvLCAwLCBzaXplb2YgcG9ydGluZm8pOwpAQCAtMzI0LDcgKzMyNCw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlkZCA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CisJZGQgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAJaWYgKGlwYXRoX2VlcHJvbV9yZWFkKGRkLCBwb3MsIHRtcCwgY291bnQpKSB7CiAJCWlwYXRoX2Rldl9lcnIoZGQsICJmYWlsZWQgdG8gcmVhZCBmcm9tIGZsYXNoXG4iKTsKIAkJcmV0ID0gLUVOWElPOwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJCWdvdG8gYmFpbF90bXA7CiAJfQogCi0JZGQgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOworCWRkID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCWlmIChpcGF0aF9lZXByb21fd3JpdGUoZGQsIHBvcywgdG1wLCBjb3VudCkpIHsKIAkJcmV0ID0gLUVOWElPOwogCQlpcGF0aF9kZXZfZXJyKGRkLCAiZmFpbGVkIHRvIHdyaXRlIHRvIGZsYXNoXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTEwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjExMC5jCmluZGV4IDllNGU4ZDQuLjc0Njg0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTEwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMTAuYwpAQCAtMzgsNiArMzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9odGlycS5oPgogCiAjaW5jbHVkZSAiaXBhdGhfa2VybmVsLmgiCiAjaW5jbHVkZSAiaXBhdGhfcmVnaXN0ZXJzLmgiCkBAIC05MTMsNDkgKzkxNCw0MCBAQAogCX0KIH0KIAotc3RhdGljIGludCBzZXRfaW50X2hhbmRsZXIoc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCSAgICBpbnQgcG9zKQorc3RhdGljIGludCBpcGF0aF9odF9pbnRjb25maWcoc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkKQogewotCXUzMiBpbnRfaGFuZGxlcl9hZGRyX2xvd2VyOwotCXUzMiBpbnRfaGFuZGxlcl9hZGRyX3VwcGVyOwotCXU2NCBpaGFuZGxlcjsKLQl1MzIgaW50dmVjOworCWludCByZXQ7CiAKLQkvKiB1c2UgaW5kaXJlY3Rpb24gcmVnaXN0ZXIgdG8gZ2V0IHRoZSBpbnRyIGhhbmRsZXIgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgcG9zICsgSFRfSU5UUl9SRUdfSU5ERVgsIDB4MTApOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3MgKyA0LCAmaW50X2hhbmRsZXJfYWRkcl9sb3dlcik7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIHBvcyArIEhUX0lOVFJfUkVHX0lOREVYLCAweDExKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9zICsgNCwgJmludF9oYW5kbGVyX2FkZHJfdXBwZXIpOworCWlmIChkZC0+aXBhdGhfaW50Y29uZmlnKSB7CisJCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfaW50ZXJydXB0Y29uZmlnLAorCQkJCSBkZC0+aXBhdGhfaW50Y29uZmlnKTsJLyogaW50ZXJydXB0IGFkZHJlc3MgKi8KKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlpcGF0aF9kZXZfZXJyKGRkLCAiTm8gaW50ZXJydXB0cyBlbmFibGVkLCBjb3VsZG4ndCBzZXR1cCAiCisJCQkgICAgICAiaW50ZXJydXB0IGFkZHJlc3NcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KIAotCWloYW5kbGVyID0gKHU2NCkgaW50X2hhbmRsZXJfYWRkcl9sb3dlciB8Ci0JCSgodTY0KSBpbnRfaGFuZGxlcl9hZGRyX3VwcGVyIDw8IDMyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpcGF0aF9odF9pcnFfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpcnEsCisJCQkJc3RydWN0IGh0X2lycV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwl1NjQgcHJldl9pbnRjb25maWcgPSBkZC0+aXBhdGhfaW50Y29uZmlnOworCisJZGQtPmlwYXRoX2ludGNvbmZpZyA9IG1zZy0+YWRkcmVzc19sbzsKKwlkZC0+aXBhdGhfaW50Y29uZmlnIHw9ICgodTY0KSBtc2ctPmFkZHJlc3NfaGkpIDw8IDMyOwogCiAJLyoKLQkgKiBrZXJuZWxzIHdpdGggQ09ORklHX1BDSV9NU0kgc2V0IHRoZSB2ZWN0b3IgaW4gdGhlIGlycSBmaWVsZCBvZgotCSAqIHN0cnVjdCBwY2lfZGV2aWNlLCBzbyB3ZSB1c2UgdGhhdCB0byBwcm9ncmFtIHRoZSBpbnRlcm5hbAotCSAqIGludGVycnVwdCByZWdpc3RlciAobm90IGNvbmZpZyBzcGFjZSkgd2l0aCB0aGF0IHZhbHVlLiBUaGUgQklPUwotCSAqIG11c3Qgc3RpbGwgaGF2ZSBkb25lIHRoZSBiYXNpYyBNU0kgc2V0dXAuCisJICogSWYgdGhlIHByZXZpb3VzIHZhbHVlIG9mIGRkLT5pcGF0aF9pbnRjb25maWcgaXMgemVybywgd2UncmUKKwkgKiBnZXR0aW5nIGNvbmZpZ3VyZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbmQgbXVzdCBub3QgcHJvZ3JhbSB0aGUKKwkgKiBpbnRjb25maWcgcmVnaXN0ZXIgaGVyZSAoaXQgd2lsbCBiZSBwcm9ncmFtbWVkIGxhdGVyLCB3aGVuIHRoZQorCSAqIGhhcmR3YXJlIGlzIHJlYWR5KS4gIE90aGVyd2lzZSwgd2Ugc2hvdWxkLgogCSAqLwotCWludHZlYyA9IHBkZXYtPmlycTsKLQkvKgotCSAqIGNsZWFyIGFueSB2ZWN0b3IgYml0cyB0aGVyZTsgbm9ybWFsbHkgbm90IHNldCBidXQgd2UnbGwgb3ZlcmxvYWQKLQkgKiB0aGlzIGZvciBzb21lIGRlYnVnIHB1cnBvc2VzIChzZXR0aW5nIHRoZSBIVEMgZGVidWcgcmVnaXN0ZXIKLQkgKiB2YWx1ZSBmcm9tIHNvZnR3YXJlLCByYXRoZXIgdGhhbiBHUElPcyksIHNvIGl0IG1pZ2h0IGJlIHNldCBvbiBhCi0JICogZHJpdmVyIHJlbG9hZC4KLQkgKi8KLQlpaGFuZGxlciAmPSB+MHhmZjAwMDA7Ci0JLyogeDg2IHZlY3RvciBnb2VzIGluIGludHJpbmZvWzIzOjE2XSAqLwotCWloYW5kbGVyIHw9IGludHZlYyA8PCAxNjsKLQlpcGF0aF9jZGJnKFZFUkJPU0UsICJpaGFuZGxlciBsb3dlciAleCwgdXBwZXIgJXgsIGludHZlYyAleCwgIgotCQkgICAiaW50ZXJydXB0Y29uZmlnICVsbHhcbiIsIGludF9oYW5kbGVyX2FkZHJfbG93ZXIsCi0JCSAgIGludF9oYW5kbGVyX2FkZHJfdXBwZXIsIGludHZlYywKLQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaWhhbmRsZXIpOwotCi0JLyogY2FuJ3QgcHJvZ3JhbSB5ZXQsIHNvIHNhdmUgZm9yIGludGVycnVwdCBzZXR1cCAqLwotCWRkLT5pcGF0aF9pbnRjb25maWcgPSBpaGFuZGxlcjsKLQkvKiBrZWVwIGdvaW5nLCBzbyB3ZSBmaW5kIGxpbmsgY29udHJvbCBzdHVmZiBhbHNvICovCi0KLQlyZXR1cm4gaWhhbmRsZXIgIT0gMDsKKwlpZiAocHJldl9pbnRjb25maWcpCisJCWlwYXRoX2h0X2ludGNvbmZpZyhkZCk7CiB9CiAKIC8qKgpAQCAtOTcxLDEyICs5NjMsMTkgQEAKIHN0YXRpYyBpbnQgaXBhdGhfc2V0dXBfaHRfY29uZmlnKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCwKIAkJCQkgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JaW50IHBvcywgcmV0ID0gMDsKLQlpbnQgaWhhbmRsZXIgPSAwOworCWludCBwb3MsIHJldDsKKworCXJldCA9IF9faHRfY3JlYXRlX2lycShwZGV2LCAwLCBpcGF0aF9odF9pcnFfdXBkYXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlpcGF0aF9kZXZfZXJyKGRkLCAiQ291bGRuJ3QgY3JlYXRlIGludGVycnVwdCBoYW5kbGVyOiAiCisJCQkgICAgICAiZXJyICVkXG4iLCByZXQpOworCQlnb3RvIGJhaWw7CisJfQorCWRkLT5pcGF0aF9pcnEgPSByZXQ7CisJcmV0ID0gMDsKIAogCS8qCi0JICogUmVhZCB0aGUgY2FwYWJpbGl0eSBpbmZvIHRvIGZpbmQgdGhlIGludGVycnVwdCBpbmZvLCBhbmQgYWxzbwotCSAqIGhhbmRsZSBjbGVhcmluZyBDUkMgZXJyb3JzIGluIGxpbmtjdHJsIHJlZ2lzdGVyIGlmIG5lY2Vzc2FyeS4gIFdlCisJICogSGFuZGxlIGNsZWFyaW5nIENSQyBlcnJvcnMgaW4gbGlua2N0cmwgcmVnaXN0ZXIgaWYgbmVjZXNzYXJ5LiAgV2UKIAkgKiBkbyB0aGlzIGVhcmx5LCBiZWZvcmUgd2UgZXZlciBlbmFibGUgZXJyb3JzIG9yIGhhcmR3YXJlIGVycm9ycywKIAkgKiBtb3N0bHkgdG8gYXZvaWQgY2F1c2luZyB0aGUgY2hpcCB0byBlbnRlciBmcmVlemUgbW9kZS4KIAkgKi8KQEAgLTEwMDAsMTcgKzk5OSw5IEBACiAJCX0KIAkJaWYgKCEoY2FwX3R5cGUgJiAweEUwKSkKIAkJCXNsYXZlX29yX3ByaV9ibGsoZGQsIHBkZXYsIHBvcywgY2FwX3R5cGUpOwotCQllbHNlIGlmIChjYXBfdHlwZSA9PSBIVF9JTlRSX0RJU0NfQ09ORklHKQotCQkJaWhhbmRsZXIgPSBzZXRfaW50X2hhbmRsZXIoZGQsIHBkZXYsIHBvcyk7CiAJfSB3aGlsZSAoKHBvcyA9IHBjaV9maW5kX25leHRfY2FwYWJpbGl0eShwZGV2LCBwb3MsCiAJCQkJCQkgUENJX0NBUF9JRF9IVCkpKTsKIAotCWlmICghaWhhbmRsZXIpIHsKLQkJaXBhdGhfZGV2X2VycihkZCwgIkNvdWxkbid0IGZpbmQgaW50ZXJydXB0IGhhbmRsZXIgaW4gIgotCQkJICAgICAgImNvbmZpZyBzcGFjZVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JfQotCiBiYWlsOgogCXJldHVybiByZXQ7CiB9CkBAIC0xMzYwLDI1ICsxMzUxLDYgQEAKIAlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NlcmRlc2NvbmZpZzAsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgaXBhdGhfaHRfaW50Y29uZmlnKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKCFkZC0+aXBhdGhfaW50Y29uZmlnKSB7Ci0JCWlwYXRoX2Rldl9lcnIoZGQsICJObyBpbnRlcnJ1cHRzIGVuYWJsZWQsIGNvdWxkbid0IHNldHVwICIKLQkJCSAgICAgICJpbnRlcnJ1cHQgYWRkcmVzc1xuIik7Ci0JCXJldCA9IDE7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2ludGVycnVwdGNvbmZpZywKLQkJCSBkZC0+aXBhdGhfaW50Y29uZmlnKTsJLyogaW50ZXJydXB0IGFkZHJlc3MgKi8KLQlyZXQgPSAwOwotCi1iYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KIC8qKgogICogaXBhdGhfcGVfcHV0X3RpZCAtIHdyaXRlIGEgVElEIGluIGNoaXAKICAqIEBkZDogdGhlIGluZmluaXBhdGggZGV2aWNlCkBAIC0xNDc1LDcgKzE0NDcsNyBAQAogc3RhdGljIGludCBpcGF0aF9odF9lYXJseV9pbml0KHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKIHsKIAl1MzIgX19pb21lbSAqcGlvYnVmOwotCXUzMiBwaW9pbmNyLCB2YWwzMiwgZWdyc2l6ZTsKKwl1MzIgcGlvaW5jciwgdmFsMzI7CiAJaW50IGk7CiAKIAkvKgpAQCAtMTQ5NSw3ICsxNDY3LDYgQEAKIAkgKiBlcnJvcnMgaW50ZXJydXB0cyBpZiB3ZSBldmVyIHNlZSBvbmUpLgogCSAqLwogCWRkLT5pcGF0aF9yY3ZlZ3JidWZzaXplID0gZGQtPmlwYXRoX3Bpb3NpemUyazsKLQllZ3JzaXplID0gZGQtPmlwYXRoX3JjdmVncmJ1ZnNpemU7CiAKIAkvKgogCSAqIHRoZSBtaW4oKSBjaGVjayBoZXJlIGlzIGN1cnJlbnRseSBhIG5vcCwgYnV0IGl0IG1heSBub3QKQEAgLTE1NzUsNiArMTU0NiwxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpcGF0aF9odF9mcmVlX2lycShzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQpCit7CisJZnJlZV9pcnEoZGQtPmlwYXRoX2lycSwgZGQpOworCWh0X2Rlc3Ryb3lfaXJxKGRkLT5pcGF0aF9pcnEpOworCWRkLT5pcGF0aF9pcnEgPSAwOworCWRkLT5pcGF0aF9pbnRjb25maWcgPSAwOworfQorCiAvKioKICAqIGlwYXRoX2luaXRfaWJhNjExMF9mdW5jcyAtIHNldCB1cCB0aGUgY2hpcC1zcGVjaWZpYyBmdW5jdGlvbiBwb2ludGVycwogICogQGRkOiB0aGUgaW5maW5pcGF0aCBkZXZpY2UKQEAgLTE1OTgsNiArMTU3Nyw3IEBACiAJZGQtPmlwYXRoX2ZfY2xlYW51cCA9IGlwYXRoX3NldHVwX2h0X2NsZWFudXA7CiAJZGQtPmlwYXRoX2Zfc2V0ZXh0bGVkID0gaXBhdGhfc2V0dXBfaHRfc2V0ZXh0bGVkOwogCWRkLT5pcGF0aF9mX2dldF9iYXNlX2luZm8gPSBpcGF0aF9odF9nZXRfYmFzZV9pbmZvOworCWRkLT5pcGF0aF9mX2ZyZWVfaXJxID0gaXBhdGhfaHRfZnJlZV9pcnE7CiAKIAkvKgogCSAqIGluaXRpYWxpemUgY2hpcC1zcGVjaWZpYyB2YXJpYWJsZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTIwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjEyMC5jCmluZGV4IGE3MmFiOWQuLmFlOGJmOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTIwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMjAuYwpAQCAtNjAyLDcgKzYwMiw3IEBACiAgKi8KIHN0YXRpYyBpbnQgaXBhdGhfcGVfYnJpbmd1cF9zZXJkZXMoc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkKQogewotCXU2NCB2YWwsIHRtcCwgY29uZmlnMSwgcHJldl92YWw7CisJdTY0IHZhbCwgY29uZmlnMSwgcHJldl92YWw7CiAJaW50IHJldCA9IDA7CiAKIAlpcGF0aF9kYmcoIlRyeWluZyB0byBicmluZ3VwIHNlcmRlc1xuIik7CkBAIC02MzMsNyArNjMzLDcgQEAKIAkJfCBJTkZJTklQQVRIX1NFUkRDMF9MMVBXUl9ETjsKIAlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NlcmRlc2NvbmZpZzAsIHZhbCk7CiAJLyogYmUgc3VyZSBjaGlwIHNhdyBpdCAqLwotCXRtcCA9IGlwYXRoX3JlYWRfa3JlZzY0KGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NjcmF0Y2gpOworCWlwYXRoX3JlYWRfa3JlZzY0KGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NjcmF0Y2gpOwogCXVkZWxheSg1KTsJCS8qIG5lZWQgcGxsIHJlc2V0IHNldCBhdCBsZWFzdCBmb3IgYSBiaXQgKi8KIAkvKgogCSAqIGFmdGVyIFBMTCBpcyByZXNldCwgc2V0IHRoZSBwZXItbGFuZSBSZXNldHMgYW5kIFR4SWRsZSBhbmQKQEAgLTY0Nyw3ICs2NDcsNyBAQAogCQkgICAiYW5kIHR4aWRsZSAoJWxseClcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIHZhbCk7CiAJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zZXJkZXNjb25maWcwLCB2YWwpOwogCS8qIGJlIHN1cmUgY2hpcCBzYXcgaXQgKi8KLQl0bXAgPSBpcGF0aF9yZWFkX2tyZWc2NChkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zY3JhdGNoKTsKKwlpcGF0aF9yZWFkX2tyZWc2NChkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9zY3JhdGNoKTsKIAkvKiBuZWVkIFBMTCByZXNldCBjbGVhciBmb3IgYXQgbGVhc3QgMTEgdXNlYyBiZWZvcmUgbGFuZQogCSAqIHJlc2V0cyBjbGVhcmVkOyBnaXZlIGl0IGEgZmV3IG1vcmUgdG8gYmUgc3VyZSAqLwogCXVkZWxheSgxNSk7CkBAIC04NTYsNiArODU2LDcgQEAKIAkJaXBhdGhfZGV2X2VycihkZCwgInBjaV9lbmFibGVfbXNpIGZhaWxlZDogJWQsICIKIAkJCSAgICAgICJpbnRlcnJ1cHRzIG1heSBub3Qgd29ya1xuIiwgcmV0KTsKIAkvKiBjb250aW51ZSBldmVuIGlmIGl0IGZhaWxzLCB3ZSBtYXkgc3RpbGwgYmUgT0suLi4gKi8KKwlkZC0+aXBhdGhfaXJxID0gcGRldi0+aXJxOwogCiAJaWYgKChwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRkLT5wY2lkZXYsIFBDSV9DQVBfSURfTVNJKSkpIHsKIAkJdTE2IGNvbnRyb2w7CkBAIC0xMzIzLDYgKzEzMjQsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaXBhdGhfcGVfZnJlZV9pcnEoc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkKQoreworCWZyZWVfaXJxKGRkLT5pcGF0aF9pcnEsIGRkKTsKKwlkZC0+aXBhdGhfaXJxID0gMDsKK30KKwogLyoqCiAgKiBpcGF0aF9pbml0X2liYTYxMjBfZnVuY3MgLSBzZXQgdXAgdGhlIGNoaXAtc3BlY2lmaWMgZnVuY3Rpb24gcG9pbnRlcnMKICAqIEBkZDogdGhlIGluZmluaXBhdGggZGV2aWNlCkBAIC0xMzQ5LDYgKzEzNTYsNyBAQAogCWRkLT5pcGF0aF9mX2NsZWFudXAgPSBpcGF0aF9zZXR1cF9wZV9jbGVhbnVwOwogCWRkLT5pcGF0aF9mX3NldGV4dGxlZCA9IGlwYXRoX3NldHVwX3BlX3NldGV4dGxlZDsKIAlkZC0+aXBhdGhfZl9nZXRfYmFzZV9pbmZvID0gaXBhdGhfcGVfZ2V0X2Jhc2VfaW5mbzsKKwlkZC0+aXBhdGhfZl9mcmVlX2lycSA9IGlwYXRoX3BlX2ZyZWVfaXJxOwogCiAJLyogaW5pdGlhbGl6ZSBjaGlwLXNwZWNpZmljIHZhcmlhYmxlcyAqLwogCWRkLT5pcGF0aF9mX3RpZHRlbXBsYXRlID0gaXBhdGhfcGVfdGlkdGVtcGxhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMKaW5kZXggZDgxOWNjYS4uZDRmNmI1MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbml0X2NoaXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMKQEAgLTM0NywxMCArMzQ3LDkgQEAKIHN0YXRpYyBpbnQgaW5pdF9jaGlwX3Jlc2V0KHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCwKIAkJCSAgIHN0cnVjdCBpcGF0aF9wb3J0ZGF0YSAqKnBkcCkKIHsKLQlzdHJ1Y3QgaXBhdGhfcG9ydGRhdGEgKnBkOwogCXUzMiBydG1wOwogCi0JKnBkcCA9IHBkID0gZGQtPmlwYXRoX3BkWzBdOworCSpwZHAgPSBkZC0+aXBhdGhfcGRbMF07CiAJLyogZW5zdXJlIGNoaXAgZG9lcyBubyBzZW5kcyBvciByZWNlaXZlcyB3aGlsZSB3ZSByZS1pbml0aWFsaXplICovCiAJZGQtPmlwYXRoX2NvbnRyb2wgPSBkZC0+aXBhdGhfc2VuZGN0cmwgPSBkZC0+aXBhdGhfcmN2Y3RybCA9IDBVOwogCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfcmN2Y3RybCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW50ci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ludHIuYwppbmRleCBkOTA3OWVlLi43MmI5ZTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW50ci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbnRyLmMKQEAgLTU5OCwxMCArNTk4LDkgQEAKIAkgKiBvbiBjbG9zZQogCSAqLwogCWlmIChlcnJzICYgSU5GSU5JUEFUSF9FX1JSQ1ZIRFJGVUxMKSB7Ci0JCWludCBhbnk7CiAJCXUzMiBoZCwgdGw7CiAJCWlwYXRoX3N0YXRzLnNwc19oZHJxZnVsbCsrOwotCQlmb3IgKGFueSA9IGkgPSAwOyBpIDwgZGQtPmlwYXRoX2NmZ3BvcnRzOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IGRkLT5pcGF0aF9jZmdwb3J0czsgaSsrKSB7CiAJCQlzdHJ1Y3QgaXBhdGhfcG9ydGRhdGEgKnBkID0gZGQtPmlwYXRoX3BkW2ldOwogCQkJaWYgKGkgPT0gMCkgewogCQkJCWhkID0gZGQtPmlwYXRoX3BvcnQwaGVhZDsKQEAgLTcxMCwxNCArNzA5LDE0IEBACiAJCQkgKiBsaW51eGJpb3MgZGV2ZWxvcG1lbnQgd29yaywgYW5kIGl0IG1heSBoYXBwZW4gaW4KIAkJCSAqIHRoZSBmdXR1cmUgYWdhaW4uCiAJCQkgKi8KLQkJCWlmIChkZC0+cGNpZGV2ICYmIGRkLT5wY2lkZXYtPmlycSkgeworCQkJaWYgKGRkLT5wY2lkZXYgJiYgZGQtPmlwYXRoX2lycSkgewogCQkJCWlwYXRoX2Rldl9lcnIoZGQsICJOb3cgJXUgdW5leHBlY3RlZCAiCiAJCQkJCSAgICAgICJpbnRlcnJ1cHRzLCB1bnJlZ2lzdGVyaW5nICIKIAkJCQkJICAgICAgImludGVycnVwdCBoYW5kbGVyXG4iLAogCQkJCQkgICAgICAqdW5leHBlY3RwKTsKLQkJCQlpcGF0aF9kYmcoImZyZWVfaXJxIG9mIGlycSAleFxuIiwKLQkJCQkJICBkZC0+cGNpZGV2LT5pcnEpOwotCQkJCWZyZWVfaXJxKGRkLT5wY2lkZXYtPmlycSwgZGQpOworCQkJCWlwYXRoX2RiZygiZnJlZV9pcnEgb2YgaXJxICVkXG4iLAorCQkJCQkgIGRkLT5pcGF0aF9pcnEpOworCQkJCWRkLT5pcGF0aF9mX2ZyZWVfaXJxKGRkKTsKIAkJCX0KIAkJfQogCQlpZiAoaXBhdGhfcmVhZF9rcmVnMzIoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfaW50bWFzaykpIHsKQEAgLTc1Myw3ICs3NTIsNyBAQAogCQlpZiAoYWxsYml0cyA9PSAyKSB7CiAJCQlpcGF0aF9kZXZfZXJyKGRkLCAiU3RpbGwgYmFkIGludGVycnVwdCBzdGF0dXMsICIKIAkJCQkgICAgICAidW5yZWdpc3RlcmluZyBpbnRlcnJ1cHRcbiIpOwotCQkJZnJlZV9pcnEoZGQtPnBjaWRldi0+aXJxLCBkZCk7CisJCQlkZC0+aXBhdGhfZl9mcmVlX2lycShkZCk7CiAJCX0gZWxzZSBpZiAoYWxsYml0cyA+IDIpIHsKIAkJCWlmICgoYWxsYml0cyAlIDEwMDAwKSA9PSAwKQogCQkJCXByaW50aygiLiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tlcm5lbC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tlcm5lbC5oCmluZGV4IDdjNDM2NjkuLjk4NmIyMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9rZXJuZWwuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfa2VybmVsLmgKQEAgLTIxMyw2ICsyMTMsOCBAQAogCXZvaWQgKCppcGF0aF9mX3NldGV4dGxlZCkoc3RydWN0IGlwYXRoX2RldmRhdGEgKiwgdTY0LCB1NjQpOwogCS8qIGZpbGwgb3V0IGNoaXAtc3BlY2lmaWMgZmllbGRzICovCiAJaW50ICgqaXBhdGhfZl9nZXRfYmFzZV9pbmZvKShzdHJ1Y3QgaXBhdGhfcG9ydGRhdGEgKiwgdm9pZCAqKTsKKwkvKiBmcmVlIGlycSAqLworCXZvaWQgKCppcGF0aF9mX2ZyZWVfaXJxKShzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqKTsKIAlzdHJ1Y3QgaXBhdGhfaWJkZXYgKnZlcmJzX2RldjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB2ZXJic190aW1lcjsKIAkvKiB0b3RhbCBkd29yZHMgc2VudCAoc3VtbWVkIGZyb20gY291bnRlcikgKi8KQEAgLTMyOCw2ICszMzAsOCBAQAogCS8qIHNvIHdlIGNhbiByZXdyaXRlIGl0IGFmdGVyIGEgY2hpcCByZXNldCAqLwogCXUzMiBpcGF0aF9wY2liYXIxOwogCisJLyogaW50ZXJydXB0IG51bWJlciAqLworCWludCBpcGF0aF9pcnE7CiAJLyogSFQvUENJIFZlbmRvciBJRCAoaGVyZSBmb3IgTm9kZUluZm8pICovCiAJdTE2IGlwYXRoX3ZlbmRvcmlkOwogCS8qIEhUL1BDSSBEZXZpY2UgSUQgKGhlcmUgZm9yIE5vZGVJbmZvKSAqLwpAQCAtODY5LDkgKzg3Myw2IEBACiB2b2lkIGlwYXRoX2RldmljZV9yZW1vdmVfZ3JvdXAoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqKTsKIGludCBpcGF0aF9leHBvc2VfcmVzZXQoc3RydWN0IGRldmljZSAqKTsKIAotaW50IGlwYXRoX2RpYWdwa3RfYWRkKHZvaWQpOwotdm9pZCBpcGF0aF9kaWFncGt0X3JlbW92ZSh2b2lkKTsKLQogaW50IGlwYXRoX2luaXRfaXBhdGhmcyh2b2lkKTsKIHZvaWQgaXBhdGhfZXhpdF9pcGF0aGZzKHZvaWQpOwogaW50IGlwYXRoZnNfYWRkX2RldmljZShzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9rZXlzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfa2V5cy5jCmluZGV4IDlhNmNiZDAuLjg1MTc2M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9rZXlzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tleXMuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJICovCiAJaWYgKHNnZS0+bGtleSA9PSAwKSB7CiAJCWlzZ2UtPm1yID0gTlVMTDsKLQkJaXNnZS0+dmFkZHIgPSBidXNfdG9fdmlydChzZ2UtPmFkZHIpOworCQlpc2dlLT52YWRkciA9ICh2b2lkICopIHNnZS0+YWRkcjsKIAkJaXNnZS0+bGVuZ3RoID0gc2dlLT5sZW5ndGg7CiAJCWlzZ2UtPnNnZV9sZW5ndGggPSBzZ2UtPmxlbmd0aDsKIAkJcmV0ID0gMTsKQEAgLTIwMiwxMiArMjAyLDEyIEBACiAJaW50IHJldDsKIAogCS8qCi0JICogV2UgdXNlIFJLRVkgPT0gemVybyBmb3IgcGh5c2ljYWwgYWRkcmVzc2VzCi0JICogKHNlZSBpcGF0aF9nZXRfZG1hX21yKS4KKwkgKiBXZSB1c2UgUktFWSA9PSB6ZXJvIGZvciBrZXJuZWwgdmlydHVhbCBhZGRyZXNzZXMKKwkgKiAoc2VlIGlwYXRoX2dldF9kbWFfbXIgYW5kIGlwYXRoX2RtYS5jKS4KIAkgKi8KIAlpZiAocmtleSA9PSAwKSB7CiAJCXNnZS0+bXIgPSBOVUxMOwotCQlzZ2UtPnZhZGRyID0gcGh5c190b192aXJ0KHZhZGRyKTsKKwkJc2dlLT52YWRkciA9ICh2b2lkICopIHZhZGRyOwogCQlzZ2UtPmxlbmd0aCA9IGxlbjsKIAkJc2dlLT5zZ2VfbGVuZ3RoID0gbGVuOwogCQlzcy0+c2dfbGlzdCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9tci5jCmluZGV4IGEwNjczYzFlLi44Y2M4NTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbXIuYwpAQCAtNTQsNiArNTQsOCBAQAogICogQGFjYzogYWNjZXNzIGZsYWdzCiAgKgogICogUmV0dXJucyB0aGUgbWVtb3J5IHJlZ2lvbiBvbiBzdWNjZXNzLCBvdGhlcndpc2UgcmV0dXJucyBhbiBlcnJuby4KKyAqIE5vdGUgdGhhdCBhbGwgRE1BIGFkZHJlc3NlcyBzaG91bGQgYmUgY3JlYXRlZCB2aWEgdGhlCisgKiBzdHJ1Y3QgaWJfZG1hX21hcHBpbmdfb3BzIGZ1bmN0aW9ucyAoc2VlIGlwYXRoX2RtYS5jKS4KICAqLwogc3RydWN0IGliX21yICppcGF0aF9nZXRfZG1hX21yKHN0cnVjdCBpYl9wZCAqcGQsIGludCBhY2MpCiB7CkBAIC0xNDksOCArMTUxLDcgQEAKIAltID0gMDsKIAluID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BoeXNfYnVmOyBpKyspIHsKLQkJbXItPm1yLm1hcFttXS0+c2Vnc1tuXS52YWRkciA9Ci0JCQlwaHlzX3RvX3ZpcnQoYnVmZmVyX2xpc3RbaV0uYWRkcik7CisJCW1yLT5tci5tYXBbbV0tPnNlZ3Nbbl0udmFkZHIgPSAodm9pZCAqKSBidWZmZXJfbGlzdFtpXS5hZGRyOwogCQltci0+bXIubWFwW21dLT5zZWdzW25dLmxlbmd0aCA9IGJ1ZmZlcl9saXN0W2ldLnNpemU7CiAJCW1yLT5tci5sZW5ndGggKz0gYnVmZmVyX2xpc3RbaV0uc2l6ZTsKIAkJbisrOwpAQCAtMzQ3LDcgKzM0OCw3IEBACiAJbiA9IDA7CiAJcHMgPSAxIDw8IGZtci0+cGFnZV9zaGlmdDsKIAlmb3IgKGkgPSAwOyBpIDwgbGlzdF9sZW47IGkrKykgewotCQlmbXItPm1yLm1hcFttXS0+c2Vnc1tuXS52YWRkciA9IHBoeXNfdG9fdmlydChwYWdlX2xpc3RbaV0pOworCQlmbXItPm1yLm1hcFttXS0+c2Vnc1tuXS52YWRkciA9ICh2b2lkICopIHBhZ2VfbGlzdFtpXTsKIAkJZm1yLT5tci5tYXBbbV0tPnNlZ3Nbbl0ubGVuZ3RoID0gcHM7CiAJCWlmICgrK24gPT0gSVBBVEhfU0VHU1opIHsKIAkJCW0rKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zeXNmcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3N5c2ZzLmMKaW5kZXggMTgyZGUzNC4uZmZhNjMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3N5c2ZzLmMKQEAgLTIxNSw3ICsyMTUsNiBAQAogCQkJICBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHVuaXQ7CiAJdTE2IG1saWQ7CiAJaW50IHJldDsKIApAQCAtMjIzLDggKzIyMiw2IEBACiAJaWYgKHJldCA8IDAgfHwgbWxpZCA8IElQQVRIX01VTFRJQ0FTVF9MSURfQkFTRSkKIAkJZ290byBpbnZhbGlkOwogCi0JdW5pdCA9IGRkLT5pcGF0aF91bml0OwotCiAJZGQtPmlwYXRoX21saWQgPSBtbGlkOwogCiAJZ290byBiYWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfcGFnZXMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91c2VyX3BhZ2VzLmMKaW5kZXggNDEzNzU0Yi4uODUzNmFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VzZXJfcGFnZXMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdXNlcl9wYWdlcy5jCkBAIC0yMTQsOSArMjE0LDEwIEBACiAJdW5zaWduZWQgbG9uZyBudW1fcGFnZXM7CiB9OwogCi1zdGF0aWMgdm9pZCB1c2VyX3BhZ2VzX2FjY291bnQodm9pZCAqcHRyKQorc3RhdGljIHZvaWQgdXNlcl9wYWdlc19hY2NvdW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqX3dvcmspCiB7Ci0Jc3RydWN0IGlwYXRoX3VzZXJfcGFnZXNfd29yayAqd29yayA9IHB0cjsKKwlzdHJ1Y3QgaXBhdGhfdXNlcl9wYWdlc193b3JrICp3b3JrID0KKwkJY29udGFpbmVyX29mKF93b3JrLCBzdHJ1Y3QgaXBhdGhfdXNlcl9wYWdlc193b3JrLCB3b3JrKTsKIAogCWRvd25fd3JpdGUoJndvcmstPm1tLT5tbWFwX3NlbSk7CiAJd29yay0+bW0tPmxvY2tlZF92bSAtPSB3b3JrLT5udW1fcGFnZXM7CkBAIC0yNDIsNyArMjQzLDcgQEAKIAogCWdvdG8gYmFpbDsKIAotCUlOSVRfV09SSygmd29yay0+d29yaywgdXNlcl9wYWdlc19hY2NvdW50LCB3b3JrKTsKKwlJTklUX1dPUksoJndvcmstPndvcmssIHVzZXJfcGFnZXNfYWNjb3VudCk7CiAJd29yay0+bW0gPSBtbTsKIAl3b3JrLT5udW1fcGFnZXMgPSBudW1fcGFnZXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKaW5kZXggYTU0NTYxMC4uMmFhYWNkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKQEAgLTE0ODcsNyArMTQ4Nyw3IEBACiAJaWRldi0+cG1hX2NvdW50ZXJfc2VsZWN0WzFdID0gSUJfUE1BX1BPUlRfUkNWX0RBVEE7CiAJaWRldi0+cG1hX2NvdW50ZXJfc2VsZWN0WzJdID0gSUJfUE1BX1BPUlRfWE1JVF9QS1RTOwogCWlkZXYtPnBtYV9jb3VudGVyX3NlbGVjdFszXSA9IElCX1BNQV9QT1JUX1JDVl9QS1RTOwotCWlkZXYtPnBtYV9jb3VudGVyX3NlbGVjdFs1XSA9IElCX1BNQV9QT1JUX1hNSVRfV0FJVDsKKwlpZGV2LT5wbWFfY291bnRlcl9zZWxlY3RbNF0gPSBJQl9QTUFfUE9SVF9YTUlUX1dBSVQ7CiAJaWRldi0+bGlua193aWR0aF9lbmFibGVkID0gMzsJLyogMXggb3IgNHggKi8KIAogCS8qIFNuYXBzaG90IGN1cnJlbnQgSFcgY291bnRlcnMgdG8gImNsZWFyIiB0aGVtLiAqLwpAQCAtMTU5OSw2ICsxNTk5LDcgQEAKIAlkZXYtPmRldGFjaF9tY2FzdCA9IGlwYXRoX211bHRpY2FzdF9kZXRhY2g7CiAJZGV2LT5wcm9jZXNzX21hZCA9IGlwYXRoX3Byb2Nlc3NfbWFkOwogCWRldi0+bW1hcCA9IGlwYXRoX21tYXA7CisJZGV2LT5kbWFfb3BzID0gJmlwYXRoX2RtYV9tYXBwaW5nX29wczsKIAogCXNucHJpbnRmKGRldi0+bm9kZV9kZXNjLCBzaXplb2YoZGV2LT5ub2RlX2Rlc2MpLAogCQkgSVBBVEhfSURTVFIgIiAlcyIsIGluaXRfdXRzbmFtZSgpLT5ub2RlbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5oCmluZGV4IDgwMzlmNmUuLmMwYzhkNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5oCkBAIC04MTIsNCArODEyLDYgQEAKIAogZXh0ZXJuIGNvbnN0IHUzMiBpYl9pcGF0aF9ybnJfdGFibGVbXTsKIAorZXh0ZXJuIHN0cnVjdCBpYl9kbWFfbWFwcGluZ19vcHMgaXBhdGhfZG1hX21hcHBpbmdfb3BzOworCiAjZW5kaWYJCQkJLyogSVBBVEhfVkVSQlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYwppbmRleCA2OTU5OTQ1Li4yN2NhZjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYwpAQCAtMzMsNyArMzMsNiBAQAogICogJElkOiBtdGhjYV9hdi5jIDEzNDkgMjAwNC0xMi0xNiAyMTowOTo0M1ogcm9sYW5kICQKICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtMTkwLDcgKzE4OSw3IEBACiBvbl9oY2FfZmFpbDoKIAlpZiAoYWgtPnR5cGUgPT0gTVRIQ0FfQUhfUENJX1BPT0wpIHsKIAkJYWgtPmF2ID0gcGNpX3Bvb2xfYWxsb2MoZGV2LT5hdl90YWJsZS5wb29sLAotCQkJCQlTTEFCX0FUT01JQywgJmFoLT5hdmRtYSk7CisJCQkJCUdGUF9BVE9NSUMsICZhaC0+YXZkbWEpOwogCQlpZiAoIWFoLT5hdikKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zMjMsNyArMzIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X2F2X3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK2ludCBtdGhjYV9pbml0X2F2X3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY2F0YXMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jYXRhcy5jCmluZGV4IGNkMDQ0ZWEuLmU5NDgxNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jYXRhcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jYXRhcy5jCkBAIC01Nyw3ICs1Nyw3IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoY2F0YXNfcmVzZXRfZGlzYWJsZSwgY2F0YXNfcmVzZXRfZGlzYWJsZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoY2F0YXNfcmVzZXRfZGlzYWJsZSwgImRpc2FibGUgcmVzZXQgb24gY2F0YXN0cm9waGljIGV2ZW50IGlmIG5vbnplcm8iKTsKIAotc3RhdGljIHZvaWQgY2F0YXNfcmVzZXQodm9pZCAqd29ya19wdHIpCitzdGF0aWMgdm9pZCBjYXRhc19yZXNldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG10aGNhX2RldiAqZGV2LCAqdG1wZGV2OwogCUxJU1RfSEVBRCh0bGlzdCk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAogaW50IF9faW5pdCBtdGhjYV9jYXRhc19pbml0KHZvaWQpCiB7Ci0JSU5JVF9XT1JLKCZjYXRhc193b3JrLCBjYXRhc19yZXNldCwgTlVMTCk7CisJSU5JVF9XT1JLKCZjYXRhc193b3JrLCBjYXRhc19yZXNldCk7CiAKIAljYXRhc193cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJtdGhjYV9jYXRhcyIpOwogCWlmICghY2F0YXNfd3EpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKaW5kZXggOTlhOTRkNy4uNzY4ZGY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYwpAQCAtMTgyMCwxMSArMTgyMCwxMSBAQAogCiAjZGVmaW5lIE1BRF9JRkNfQk9YX1NJWkUgICAgICAweDQwMAogI2RlZmluZSBNQURfSUZDX01ZX1FQTl9PRkZTRVQgMHgxMDAKLSNkZWZpbmUgTUFEX0lGQ19SUVBOX09GRlNFVCAgIDB4MTA0Ci0jZGVmaW5lIE1BRF9JRkNfU0xfT0ZGU0VUICAgICAweDEwOAotI2RlZmluZSBNQURfSUZDX0dfUEFUSF9PRkZTRVQgMHgxMDkKLSNkZWZpbmUgTUFEX0lGQ19STElEX09GRlNFVCAgIDB4MTBhCi0jZGVmaW5lIE1BRF9JRkNfUEtFWV9PRkZTRVQgICAweDEwZQorI2RlZmluZSBNQURfSUZDX1JRUE5fT0ZGU0VUICAgMHgxMDgKKyNkZWZpbmUgTUFEX0lGQ19TTF9PRkZTRVQgICAgIDB4MTBjCisjZGVmaW5lIE1BRF9JRkNfR19QQVRIX09GRlNFVCAweDEwZAorI2RlZmluZSBNQURfSUZDX1JMSURfT0ZGU0VUICAgMHgxMGUKKyNkZWZpbmUgTUFEX0lGQ19QS0VZX09GRlNFVCAgIDB4MTEyCiAjZGVmaW5lIE1BRF9JRkNfR1JIX09GRlNFVCAgICAweDE0MAogCiAJaW5tYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOwpAQCAtMTg2Miw3ICsxODYyLDcgQEAKIAogCQl2YWwgPSBpbl93Yy0+ZGxpZF9wYXRoX2JpdHMgfAogCQkJKGluX3djLT53Y19mbGFncyAmIElCX1dDX0dSSCA/IDB4ODAgOiAwKTsKLQkJTVRIQ0FfUFVUKGluYm94LCB2YWwsICAgICAgICAgICAgICAgTUFEX0lGQ19HUkhfT0ZGU0VUKTsKKwkJTVRIQ0FfUFVUKGluYm94LCB2YWwsICAgICAgICAgICAgICAgTUFEX0lGQ19HX1BBVEhfT0ZGU0VUKTsKIAogCQlNVEhDQV9QVVQoaW5ib3gsIGluX3djLT5zbGlkLCAgICAgICBNQURfSUZDX1JMSURfT0ZGU0VUKTsKIAkJTVRIQ0FfUFVUKGluYm94LCBpbl93Yy0+cGtleV9pbmRleCwgTUFEX0lGQ19QS0VZX09GRlNFVCk7CkBAIC0xODcwLDcgKzE4NzAsNyBAQAogCQlpZiAoaW5fZ3JoKQogCQkJbWVtY3B5KGluYm94ICsgTUFEX0lGQ19HUkhfT0ZGU0VULCBpbl9ncmgsIDQwKTsKIAotCQlvcF9tb2RpZmllciB8PSAweDEwOworCQlvcF9tb2RpZmllciB8PSAweDQ7CiAKIAkJaW5fbW9kaWZpZXIgfD0gaW5fd2MtPnNsaWQgPDwgMTY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwppbmRleCBlMzkzNjgxLi4yODNkNTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwpAQCAtMzYsOSArMzYsMTAgQEAKICAqICRJZDogbXRoY2FfY3EuYyAxMzY5IDIwMDQtMTItMjAgMTY6MTc6MDdaIHJvbGFuZCAkCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KKwogI2luY2x1ZGUgPHJkbWEvaWJfcGFjay5oPgogCiAjaW5jbHVkZSAibXRoY2FfZGV2LmgiCkBAIC0yMTAsNiArMjExLDExIEBACiAJCW10aGNhX3dyaXRlNjQoZG9vcmJlbGwsCiAJCQkgICAgICBkZXYtPmthciArIE1USENBX0NRX0RPT1JCRUxMLAogCQkJICAgICAgTVRIQ0FfR0VUX0RPT1JCRUxMX0xPQ0soJmRldi0+ZG9vcmJlbGxfbG9jaykpOworCQkvKgorCQkgKiBNYWtlIHN1cmUgZG9vcmJlbGxzIGRvbid0IGxlYWsgb3V0IG9mIENRIHNwaW5sb2NrCisJCSAqIGFuZCByZWFjaCB0aGUgSENBIG91dCBvZiBvcmRlcjoKKwkJICovCisJCW1taW93YigpOwogCX0KIH0KIApAQCAtOTYzLDcgKzk2OSw3IEBACiAJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiB9CiAKLWludCBfX2RldmluaXQgbXRoY2FfaW5pdF9jcV90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCitpbnQgbXRoY2FfaW5pdF9jcV90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaW50IGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYwppbmRleCBlMjg0ZTA2Li44ZWM5ZmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZXEuYwpAQCAtMzMsNyArMzMsNiBAQAogICogJElkOiBtdGhjYV9lcS5jIDEzODIgMjAwNC0xMi0yNCAwMjoyMTowMlogcm9sYW5kICQKICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC00NzksMTAgKzQ3OCwxMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfY3JlYXRlX2VxKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKLQkJCQkgICAgIGludCBuZW50LAotCQkJCSAgICAgdTggaW50ciwKLQkJCQkgICAgIHN0cnVjdCBtdGhjYV9lcSAqZXEpCitzdGF0aWMgaW50IG10aGNhX2NyZWF0ZV9lcShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCisJCQkgICBpbnQgbmVudCwKKwkJCSAgIHU4IGludHIsCisJCQkgICBzdHJ1Y3QgbXRoY2FfZXEgKmVxKQogewogCWludCBucGFnZXM7CiAJdTY0ICpkbWFfbGlzdCA9IE5VTEw7CkBAIC02NjQsOSArNjYzLDkgQEAKIAkJCQkgZGV2LT5lcV90YWJsZS5lcSArIGkpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9tYXBfcmVnKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKLQkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCSAgIHZvaWQgX19pb21lbSAqKm1hcCkKK3N0YXRpYyBpbnQgbXRoY2FfbWFwX3JlZyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCisJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSB2b2lkIF9faW9tZW0gKiptYXApCiB7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCk7CiAKQEAgLTY5MSw3ICs2OTAsNyBAQAogCWlvdW5tYXAobWFwKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfbWFwX2VxX3JlZ3Moc3RydWN0IG10aGNhX2RldiAqZGV2KQorc3RhdGljIGludCBtdGhjYV9tYXBfZXFfcmVncyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewogCQkvKgpAQCAtNzgxLDcgKzc4MCw3IEBACiAJfQogfQogCi1pbnQgX19kZXZpbml0IG10aGNhX21hcF9lcV9pY20oc3RydWN0IG10aGNhX2RldiAqZGV2LCB1NjQgaWNtX3ZpcnQpCitpbnQgbXRoY2FfbWFwX2VxX2ljbShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCBpY21fdmlydCkKIHsKIAlpbnQgcmV0OwogCXU4IHN0YXR1czsKQEAgLTgyNSw3ICs4MjQsNyBAQAogCV9fZnJlZV9wYWdlKGRldi0+ZXFfdGFibGUuaWNtX3BhZ2UpOwogfQogCi1pbnQgX19kZXZpbml0IG10aGNhX2luaXRfZXFfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQoraW50IG10aGNhX2luaXRfZXFfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCWludCBlcnI7CiAJdTggc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jCmluZGV4IDQ1ZTEwNmYuLmFjZmE0MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFkLmMKQEAgLTMxNyw3ICszMTcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgX19kZXZleGl0IG10aGNhX2ZyZWVfYWdlbnRzKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK3ZvaWQgbXRoY2FfZnJlZV9hZ2VudHMoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCXN0cnVjdCBpYl9tYWRfYWdlbnQgKmFnZW50OwogCWludCBwLCBxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKaW5kZXggNDdlYTAyMS4uMDQ5MWVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCkBAIC05OCw3ICs5OCw3IEBACiAJLnVhcmNfc2l6ZQkgICA9IDEgPDwgMTgsCS8qIEFyYmVsIG9ubHkgKi8KIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG10aGNhX3R1bmVfcGNpKHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCitzdGF0aWMgaW50IG10aGNhX3R1bmVfcGNpKHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCiB7CiAJaW50IGNhcDsKIAl1MTYgdmFsOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG10aGNhX2Rldl9saW0oc3RydWN0IG10aGNhX2RldiAqbWRldiwgc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0pCitzdGF0aWMgaW50IG10aGNhX2Rldl9saW0oc3RydWN0IG10aGNhX2RldiAqbWRldiwgc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0pCiB7CiAJaW50IGVycjsKIAl1OCBzdGF0dXM7CkBAIC0yNTUsNyArMjU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfaW5pdF90YXZvcihzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQorc3RhdGljIGludCBtdGhjYV9pbml0X3Rhdm9yKHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCiB7CiAJdTggc3RhdHVzOwogCWludCBlcnI7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9sb2FkX2Z3KHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCitzdGF0aWMgaW50IG10aGNhX2xvYWRfZncoc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKIAl1OCBzdGF0dXM7CiAJaW50IGVycjsKQEAgLTM3OSwxMCArMzc5LDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfaW5pdF9pY20oc3RydWN0IG10aGNhX2RldiAqbWRldiwKLQkJCQkgICAgc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0sCi0JCQkJICAgIHN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSAqaW5pdF9oY2EsCi0JCQkJICAgIHU2NCBpY21fc2l6ZSkKK3N0YXRpYyBpbnQgbXRoY2FfaW5pdF9pY20oc3RydWN0IG10aGNhX2RldiAqbWRldiwKKwkJCSAgc3RydWN0IG10aGNhX2Rldl9saW0gKmRldl9saW0sCisJCQkgIHN0cnVjdCBtdGhjYV9pbml0X2hjYV9wYXJhbSAqaW5pdF9oY2EsCisJCQkgIHU2NCBpY21fc2l6ZSkKIHsKIAl1NjQgYXV4X3BhZ2VzOwogCXU4IHN0YXR1czsKQEAgLTU3NSw3ICs1NzUsNyBAQAogCW10aGNhX2ZyZWVfaWNtKG1kZXYsIG1kZXYtPmZ3LmFyYmVsLmF1eF9pY20pOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X2FyYmVsKHN0cnVjdCBtdGhjYV9kZXYgKm1kZXYpCitzdGF0aWMgaW50IG10aGNhX2luaXRfYXJiZWwoc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKIAlzdHJ1Y3QgbXRoY2FfZGV2X2xpbSAgICAgICAgZGV2X2xpbTsKIAlzdHJ1Y3QgbXRoY2FfcHJvZmlsZSAgICAgICAgcHJvZmlsZTsKQEAgLTY4Myw3ICs2ODMsNyBAQAogCQltdGhjYV9TWVNfRElTKG1kZXYsICZzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X2hjYShzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQorc3RhdGljIGludCBtdGhjYV9pbml0X2hjYShzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQogewogCXU4IHN0YXR1czsKIAlpbnQgZXJyOwpAQCAtNzIwLDcgKzcyMCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2Ffc2V0dXBfaGNhKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK3N0YXRpYyBpbnQgbXRoY2Ffc2V0dXBfaGNhKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwogCXU4IHN0YXR1czsKQEAgLTg3NSw4ICs4NzUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG10aGNhX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJICAgaW50IGRkcl9oaWRkZW4pCitzdGF0aWMgaW50IG10aGNhX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGRkcl9oaWRkZW4pCiB7CiAJaW50IGVycjsKIApAQCAtOTI4LDcgKzkyNyw3IEBACiAJCQkgICBNVEhDQV9IQ1JfU0laRSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG10aGNhX2VuYWJsZV9tc2lfeChzdHJ1Y3QgbXRoY2FfZGV2ICptZGV2KQorc3RhdGljIGludCBtdGhjYV9lbmFibGVfbXNpX3goc3RydWN0IG10aGNhX2RldiAqbWRldikKIHsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSBlbnRyaWVzWzNdOwogCWludCBlcnI7CkBAIC0xMjEzLDcgKzEyMTIsNyBAQAogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RhdGljIGludCBtdGhjYV92ZXJzaW9uX3ByaW50ZWQgPSAwOwogCWludCByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWNnLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWNnLmMKaW5kZXggNDdjYThhOS4uYThhZDA3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21jZy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYwpAQCAtMzIsNyArMzIsNiBAQAogICogJElkOiBtdGhjYV9tY2cuYyAxMzQ5IDIwMDQtMTItMTYgMjE6MDk6NDNaIHJvbGFuZCAkCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKQEAgLTM3MSw3ICszNzAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBfX2RldmluaXQgbXRoY2FfaW5pdF9tY2dfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQoraW50IG10aGNhX2luaXRfbWNnX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwogCWludCB0YWJsZV9zaXplID0gZGV2LT5saW1pdHMubnVtX21nbXMgKyBkZXYtPmxpbWl0cy5udW1fYW1nbXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCmluZGV4IGE0ODZkZWMuLmY3MWZmYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCkBAIC0zNCw3ICszNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAogI2luY2x1ZGUgIm10aGNhX2Rldi5oIgpAQCAtMTM1LDcgKzEzNCw3IEBACiAJc3Bpbl91bmxvY2soJmJ1ZGR5LT5sb2NrKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbXRoY2FfYnVkZHlfaW5pdChzdHJ1Y3QgbXRoY2FfYnVkZHkgKmJ1ZGR5LCBpbnQgbWF4X29yZGVyKQorc3RhdGljIGludCBtdGhjYV9idWRkeV9pbml0KHN0cnVjdCBtdGhjYV9idWRkeSAqYnVkZHksIGludCBtYXhfb3JkZXIpCiB7CiAJaW50IGksIHM7CiAKQEAgLTc1OSw3ICs3NTgsNyBAQAogCSoodTggKikgZm1yLT5tZW0uYXJiZWwubXB0ID0gTVRIQ0FfTVBUX1NUQVRVU19TVzsKIH0KIAotaW50IF9fZGV2aW5pdCBtdGhjYV9pbml0X21yX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK2ludCBtdGhjYV9pbml0X21yX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJaW50IGVyciwgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKaW5kZXggNTlkZjUxNi4uYzFlOTUwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMKQEAgLTM0LDcgKzM0LDYgQEAKICAqICRJZDogbXRoY2FfcGQuYyAxMzQ5IDIwMDQtMTItMTYgMjE6MDk6NDNaIHJvbGFuZCAkCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCiAjaW5jbHVkZSAibXRoY2FfZGV2LmgiCkBAIC02OSw3ICs2OCw3IEBACiAJbXRoY2FfZnJlZSgmZGV2LT5wZF90YWJsZS5hbGxvYywgcGQtPnBkX251bSk7CiB9CiAKLWludCBfX2RldmluaXQgbXRoY2FfaW5pdF9wZF90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCitpbnQgbXRoY2FfaW5pdF9wZF90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCiB7CiAJcmV0dXJuIG10aGNhX2FsbG9jX2luaXQoJmRldi0+cGRfdGFibGUuYWxsb2MsCiAJCQkJZGV2LT5saW1pdHMubnVtX3BkcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKaW5kZXggZmM2N2Y3OC4uN2VjN2M0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQlwcm9wcy0+bWF4X21hcF9wZXJfZm1yID0gMjU1OwogCWVsc2UKIAkJcHJvcHMtPm1heF9tYXBfcGVyX2ZtciA9Ci0JCQkoMSA8PCAoMzIgLSBsb25nX2xvZzIobWRldi0+bGltaXRzLm51bV9tcHRzKSkpIC0gMTsKKwkJCSgxIDw8ICgzMiAtIGlsb2cyKG1kZXYtPmxpbWl0cy5udW1fbXB0cykpKSAtIDE7CiAKIAllcnIgPSAwOwogIG91dDoKQEAgLTgxNiw3ICs4MTYsNyBAQAogCQlsa2V5ID0gdWNtZC5sa2V5OwogCX0KIAotCXJldCA9IG10aGNhX1JFU0laRV9DUShkZXYsIGNxLT5jcW4sIGxrZXksIGxvbmdfbG9nMihlbnRyaWVzKSwgJnN0YXR1cyk7CisJcmV0ID0gbXRoY2FfUkVTSVpFX0NRKGRldiwgY3EtPmNxbiwgbGtleSwgaWxvZzIoZW50cmllcyksICZzdGF0dXMpOwogCWlmIChzdGF0dXMpCiAJCXJldCA9IC1FSU5WQUw7CiAKQEAgLTExMDAsMTEgKzExMDAsMTAgQEAKIAlzdHJ1Y3QgbXRoY2FfZm1yICpmbXI7CiAJaW50IGVycjsKIAotCWZtciA9IGttYWxsb2Moc2l6ZW9mICpmbXIsIEdGUF9LRVJORUwpOworCWZtciA9IGttZW1kdXAoZm1yX2F0dHIsIHNpemVvZiAqZm1yLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZtcikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQltZW1jcHkoJmZtci0+YXR0ciwgZm1yX2F0dHIsIHNpemVvZiAqZm1yX2F0dHIpOwogCWVyciA9IG10aGNhX2Ztcl9hbGxvYyh0b19tZGV2KHBkLT5kZXZpY2UpLCB0b19tcGQocGQpLT5wZF9udW0sCiAJCQkgICAgIGNvbnZlcnRfYWNjZXNzKG1yX2FjY2Vzc19mbGFncyksIGZtcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKaW5kZXggNWU1YzU4Yi4uZDg0NGEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKQEAgLTM1LDEwICszNSwxMSBAQAogICogJElkOiBtdGhjYV9xcC5jIDEzNTUgMjAwNC0xMi0xNyAxNToyMzo0M1ogcm9sYW5kICQKICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorI2luY2x1ZGUgPGFzbS9pby5oPgorCiAjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgogI2luY2x1ZGUgPHJkbWEvaWJfY2FjaGUuaD4KICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KQEAgLTYzNSwxMSArNjM2LDExIEBACiAKIAlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7CiAJCWlmIChxcC0+cnEubWF4KQotCQkJcXBfY29udGV4dC0+cnFfc2l6ZV9zdHJpZGUgPSBsb25nX2xvZzIocXAtPnJxLm1heCkgPDwgMzsKKwkJCXFwX2NvbnRleHQtPnJxX3NpemVfc3RyaWRlID0gaWxvZzIocXAtPnJxLm1heCkgPDwgMzsKIAkJcXBfY29udGV4dC0+cnFfc2l6ZV9zdHJpZGUgfD0gcXAtPnJxLndxZV9zaGlmdCAtIDQ7CiAKIAkJaWYgKHFwLT5zcS5tYXgpCi0JCQlxcF9jb250ZXh0LT5zcV9zaXplX3N0cmlkZSA9IGxvbmdfbG9nMihxcC0+c3EubWF4KSA8PCAzOworCQkJcXBfY29udGV4dC0+c3Ffc2l6ZV9zdHJpZGUgPSBpbG9nMihxcC0+c3EubWF4KSA8PCAzOwogCQlxcF9jb250ZXh0LT5zcV9zaXplX3N0cmlkZSB8PSBxcC0+c3Eud3FlX3NoaWZ0IC0gNDsKIAl9CiAKQEAgLTE3MzIsNiArMTczMywxMSBAQAogCQltdGhjYV93cml0ZTY0KGRvb3JiZWxsLAogCQkJICAgICAgZGV2LT5rYXIgKyBNVEhDQV9TRU5EX0RPT1JCRUxMLAogCQkJICAgICAgTVRIQ0FfR0VUX0RPT1JCRUxMX0xPQ0soJmRldi0+ZG9vcmJlbGxfbG9jaykpOworCQkvKgorCQkgKiBNYWtlIHN1cmUgZG9vcmJlbGxzIGRvbid0IGxlYWsgb3V0IG9mIFNRIHNwaW5sb2NrCisJCSAqIGFuZCByZWFjaCB0aGUgSENBIG91dCBvZiBvcmRlcjoKKwkJICovCisJCW1taW93YigpOwogCX0KIAogCXFwLT5zcS5uZXh0X2luZCA9IGluZDsKQEAgLTE4NTEsNiArMTg1NywxMiBAQAogCXFwLT5ycS5uZXh0X2luZCA9IGluZDsKIAlxcC0+cnEuaGVhZCAgICArPSBucmVxOwogCisJLyoKKwkgKiBNYWtlIHN1cmUgZG9vcmJlbGxzIGRvbid0IGxlYWsgb3V0IG9mIFJRIHNwaW5sb2NrIGFuZCByZWFjaAorCSAqIHRoZSBIQ0Egb3V0IG9mIG9yZGVyOgorCSAqLworCW1taW93YigpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnJxLmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjExMiw2ICsyMTI0LDEyIEBACiAJCQkgICAgICBNVEhDQV9HRVRfRE9PUkJFTExfTE9DSygmZGV2LT5kb29yYmVsbF9sb2NrKSk7CiAJfQogCisJLyoKKwkgKiBNYWtlIHN1cmUgZG9vcmJlbGxzIGRvbid0IGxlYWsgb3V0IG9mIFNRIHNwaW5sb2NrIGFuZCByZWFjaAorCSAqIHRoZSBIQ0Egb3V0IG9mIG9yZGVyOgorCSAqLworCW1taW93YigpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNxLmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjIyMiw3ICsyMjQwLDcgQEAKIAkJKm5ld193cWUgPSAwOwogfQogCi1pbnQgX19kZXZpbml0IG10aGNhX2luaXRfcXBfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQoraW50IG10aGNhX2luaXRfcXBfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQogewogCWludCBlcnI7CiAJdTggc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3NycS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3NycS5jCmluZGV4IDkyYTcyZjUuLjEwNjg0ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9zcnEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2Ffc3JxLmMKQEAgLTM1LDYgKzM1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KKwogI2luY2x1ZGUgIm10aGNhX2Rldi5oIgogI2luY2x1ZGUgIm10aGNhX2NtZC5oIgogI2luY2x1ZGUgIm10aGNhX21lbWZyZWUuaCIKQEAgLTExOCw3ICsxMjAsNyBAQAogCiAJbWVtc2V0KGNvbnRleHQsIDAsIHNpemVvZiAqY29udGV4dCk7CiAKLQlsb2dzaXplID0gbG9uZ19sb2cyKHNycS0+bWF4KSArIHNycS0+d3FlX3NoaWZ0OworCWxvZ3NpemUgPSBpbG9nMihzcnEtPm1heCk7CiAJY29udGV4dC0+c3RhdGVfbG9nc2l6ZV9zcnFuID0gY3B1X3RvX2JlMzIobG9nc2l6ZSA8PCAyNCB8IHNycS0+c3Jxbik7CiAJY29udGV4dC0+bGtleSA9IGNwdV90b19iZTMyKHNycS0+bXIuaWJtci5sa2V5KTsKIAljb250ZXh0LT5kYl9pbmRleCA9IGNwdV90b19iZTMyKHNycS0+ZGJfaW5kZXgpOwpAQCAtMjExLDcgKzIxMyw3IEBACiAJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikgJiYgKGRzID4gZGV2LT5saW1pdHMubWF4X2Rlc2Nfc3opKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNycS0+d3FlX3NoaWZ0ID0gbG9uZ19sb2cyKGRzKTsKKwlzcnEtPndxZV9zaGlmdCA9IGlsb2cyKGRzKTsKIAogCXNycS0+c3JxbiA9IG10aGNhX2FsbG9jKCZkZXYtPnNycV90YWJsZS5hbGxvYyk7CiAJaWYgKHNycS0+c3JxbiA9PSAtMSkKQEAgLTU5NSw2ICs1OTcsMTIgQEAKIAkJCSAgICAgIE1USENBX0dFVF9ET09SQkVMTF9MT0NLKCZkZXYtPmRvb3JiZWxsX2xvY2spKTsKIAl9CiAKKwkvKgorCSAqIE1ha2Ugc3VyZSBkb29yYmVsbHMgZG9uJ3QgbGVhayBvdXQgb2YgU1JRIHNwaW5sb2NrIGFuZAorCSAqIHJlYWNoIHRoZSBIQ0Egb3V0IG9mIG9yZGVyOgorCSAqLworCW1taW93YigpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3JxLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTcwNyw3ICs3MTUsNyBAQAogCQkgICAgIHNpemVvZiAoc3RydWN0IG10aGNhX2RhdGFfc2VnKSk7CiB9CiAKLWludCBfX2RldmluaXQgbXRoY2FfaW5pdF9zcnFfdGFibGUoc3RydWN0IG10aGNhX2RldiAqZGV2KQoraW50IG10aGNhX2luaXRfc3JxX3RhYmxlKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKaW5kZXggMGI4YTc5ZC4uMDdkZWVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaApAQCAtMTA1LDEyICsxMDUsMTIgQEAKIAogc3RydWN0IGlwb2liX3J4X2J1ZiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlkbWFfYWRkcl90CW1hcHBpbmc7CisJdTY0CQltYXBwaW5nOwogfTsKIAogc3RydWN0IGlwb2liX3R4X2J1ZiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCisJdTY0CQltYXBwaW5nOwogfTsKIAogLyoKQEAgLTEzNiwxMSArMTM2LDExIEBACiAJc3RydWN0IGxpc3RfaGVhZCBtdWx0aWNhc3RfbGlzdDsKIAlzdHJ1Y3QgcmJfcm9vdCBtdWx0aWNhc3RfdHJlZTsKIAotCXN0cnVjdCB3b3JrX3N0cnVjdCBwa2V5X3Rhc2s7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IG1jYXN0X3Rhc2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayBwa2V5X3Rhc2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayBtY2FzdF90YXNrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBmbHVzaF90YXNrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZXN0YXJ0X3Rhc2s7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGFoX3JlYXBfdGFzazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFoX3JlYXBfdGFzazsKIAogCXN0cnVjdCBpYl9kZXZpY2UgKmNhOwogCXU4ICAgICAgICAgICAgCSAgcG9ydDsKQEAgLTIzMyw3ICsyMzMsNyBAQAogfQogCiBzdHJ1Y3QgaXBvaWJfbmVpZ2ggKmlwb2liX25laWdoX2FsbG9jKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKTsKLXZvaWQgaXBvaWJfbmVpZ2hfZnJlZShzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoKTsKK3ZvaWQgaXBvaWJfbmVpZ2hfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoKTsKIAogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICppcG9pYl93b3JrcXVldWU7CiAKQEAgLTI1NCwxMyArMjU0LDEzIEBACiAKIHZvaWQgaXBvaWJfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQlzdHJ1Y3QgaXBvaWJfYWggKmFkZHJlc3MsIHUzMiBxcG4pOwotdm9pZCBpcG9pYl9yZWFwX2FoKHZvaWQgKmRldl9wdHIpOwordm9pZCBpcG9pYl9yZWFwX2FoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIHZvaWQgaXBvaWJfZmx1c2hfcGF0aHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKmlwb2liX2ludGZfYWxsb2MoY29uc3QgY2hhciAqZm9ybWF0KTsKIAogaW50IGlwb2liX2liX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpYl9kZXZpY2UgKmNhLCBpbnQgcG9ydCk7Ci12b2lkIGlwb2liX2liX2Rldl9mbHVzaCh2b2lkICpkZXYpOwordm9pZCBpcG9pYl9pYl9kZXZfZmx1c2goc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgaXBvaWJfaWJfZGV2X2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIGludCBpcG9pYl9pYl9kZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTI3MSwxMCArMjcxLDEwIEBACiBpbnQgaXBvaWJfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGliX2RldmljZSAqY2EsIGludCBwb3J0KTsKIHZvaWQgaXBvaWJfZGV2X2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLXZvaWQgaXBvaWJfbWNhc3Rfam9pbl90YXNrKHZvaWQgKmRldl9wdHIpOwordm9pZCBpcG9pYl9tY2FzdF9qb2luX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgaXBvaWJfbWNhc3Rfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICptZ2lkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotdm9pZCBpcG9pYl9tY2FzdF9yZXN0YXJ0X3Rhc2sodm9pZCAqZGV2X3B0cik7Cit2b2lkIGlwb2liX21jYXN0X3Jlc3RhcnRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogaW50IGlwb2liX21jYXN0X3N0YXJ0X3RocmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBpcG9pYl9tY2FzdF9zdG9wX3RocmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmx1c2gpOwogCkBAIC0zMTIsNyArMzEyLDcgQEAKIGludCBpcG9pYl92bGFuX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqcGRldiwgdW5zaWduZWQgc2hvcnQgcGtleSk7CiBpbnQgaXBvaWJfdmxhbl9kZWxldGUoc3RydWN0IG5ldF9kZXZpY2UgKnBkZXYsIHVuc2lnbmVkIHNob3J0IHBrZXkpOwogCi12b2lkIGlwb2liX3BrZXlfcG9sbCh2b2lkICpkZXYpOwordm9pZCBpcG9pYl9wa2V5X3BvbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIGludCBpcG9pYl9wa2V5X2Rldl9kZWxheV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAjaWZkZWYgQ09ORklHX0lORklOSUJBTkRfSVBPSUJfREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwppbmRleCA4YmY1ZTllLi41OWQ5NTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCkBAIC0xMDksOSArMTA5LDggQEAKIAlyZXQgPSBpYl9wb3N0X3JlY3YocHJpdi0+cXAsICZwYXJhbSwgJmJhZF93cik7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJaXBvaWJfd2Fybihwcml2LCAicmVjZWl2ZSBmYWlsZWQgZm9yIGJ1ZiAlZCAoJWQpXG4iLCBpZCwgcmV0KTsKLQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYS0+ZG1hX2RldmljZSwKLQkJCQkgcHJpdi0+cnhfcmluZ1tpZF0ubWFwcGluZywKLQkJCQkgSVBPSUJfQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWliX2RtYV91bm1hcF9zaW5nbGUocHJpdi0+Y2EsIHByaXYtPnJ4X3JpbmdbaWRdLm1hcHBpbmcsCisJCQkJICAgIElQT0lCX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT5yeF9yaW5nW2lkXS5za2IpOwogCQlwcml2LT5yeF9yaW5nW2lkXS5za2IgPSBOVUxMOwogCX0KQEAgLTEyMyw3ICsxMjIsNyBAQAogewogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlkbWFfYWRkcl90IGFkZHI7CisJdTY0IGFkZHI7CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKElQT0lCX0JVRl9TSVpFICsgNCk7CiAJaWYgKCFza2IpCkBAIC0xMzYsMTAgKzEzNSw5IEBACiAJICovCiAJc2tiX3Jlc2VydmUoc2tiLCA0KTsKIAotCWFkZHIgPSBkbWFfbWFwX3NpbmdsZShwcml2LT5jYS0+ZG1hX2RldmljZSwKLQkJCSAgICAgIHNrYi0+ZGF0YSwgSVBPSUJfQlVGX1NJWkUsCi0JCQkgICAgICBETUFfRlJPTV9ERVZJQ0UpOwotCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihhZGRyKSkpIHsKKwlhZGRyID0gaWJfZG1hX21hcF9zaW5nbGUocHJpdi0+Y2EsIHNrYi0+ZGF0YSwgSVBPSUJfQlVGX1NJWkUsCisJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJaWYgKHVubGlrZWx5KGliX2RtYV9tYXBwaW5nX2Vycm9yKHByaXYtPmNhLCBhZGRyKSkpIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTc0LDcgKzE3Miw3IEBACiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgd3JfaWQgPSB3Yy0+d3JfaWQgJiB+SVBPSUJfT1BfUkVDVjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWRtYV9hZGRyX3QgYWRkcjsKKwl1NjQgYWRkcjsKIAogCWlwb2liX2RiZ19kYXRhKHByaXYsICJyZWN2IGNvbXBsZXRpb246IGlkICVkLCBvcCAlZCwgc3RhdHVzOiAlZFxuIiwKIAkJICAgICAgIHdyX2lkLCB3Yy0+b3Bjb2RlLCB3Yy0+c3RhdHVzKTsKQEAgLTE5Myw4ICsxOTEsOCBAQAogCQkJaXBvaWJfd2Fybihwcml2LCAiZmFpbGVkIHJlY3YgZXZlbnQgIgogCQkJCSAgICIoc3RhdHVzPSVkLCB3cmlkPSVkIHZlbmRfZXJyICV4KVxuIiwKIAkJCQkgICB3Yy0+c3RhdHVzLCB3cl9pZCwgd2MtPnZlbmRvcl9lcnIpOwotCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmNhLT5kbWFfZGV2aWNlLCBhZGRyLAotCQkJCSBJUE9JQl9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgYWRkciwKKwkJCQkgICAgSVBPSUJfQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXByaXYtPnJ4X3Jpbmdbd3JfaWRdLnNrYiA9IE5VTEw7CiAJCXJldHVybjsKQEAgLTIxMiw4ICsyMTAsNyBAQAogCWlwb2liX2RiZ19kYXRhKHByaXYsICJyZWNlaXZlZCAlZCBieXRlcywgU0xJRCAweCUwNHhcbiIsCiAJCSAgICAgICB3Yy0+Ynl0ZV9sZW4sIHdjLT5zbGlkKTsKIAotCWRtYV91bm1hcF9zaW5nbGUocHJpdi0+Y2EtPmRtYV9kZXZpY2UsIGFkZHIsCi0JCQkgSVBPSUJfQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgYWRkciwgSVBPSUJfQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAKIAlza2JfcHV0KHNrYiwgd2MtPmJ5dGVfbGVuKTsKIAlza2JfcHVsbChza2IsIElCX0dSSF9CWVRFUyk7CkBAIC0yNjEsMTAgKzI1OCw4IEBACiAKIAl0eF9yZXEgPSAmcHJpdi0+dHhfcmluZ1t3cl9pZF07CiAKLQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmNhLT5kbWFfZGV2aWNlLAotCQkJIHBjaV91bm1hcF9hZGRyKHR4X3JlcSwgbWFwcGluZyksCi0JCQkgdHhfcmVxLT5za2ItPmxlbiwKLQkJCSBETUFfVE9fREVWSUNFKTsKKwlpYl9kbWFfdW5tYXBfc2luZ2xlKHByaXYtPmNhLCB0eF9yZXEtPm1hcHBpbmcsCisJCQkgICAgdHhfcmVxLT5za2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAKIAkrK3ByaXYtPnN0YXRzLnR4X3BhY2tldHM7CiAJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gdHhfcmVxLT5za2ItPmxlbjsKQEAgLTMxMSw3ICszMDYsNyBAQAogc3RhdGljIGlubGluZSBpbnQgcG9zdF9zZW5kKHN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiwKIAkJCSAgICB1bnNpZ25lZCBpbnQgd3JfaWQsCiAJCQkgICAgc3RydWN0IGliX2FoICphZGRyZXNzLCB1MzIgcXBuLAotCQkJICAgIGRtYV9hZGRyX3QgYWRkciwgaW50IGxlbikKKwkJCSAgICB1NjQgYWRkciwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgaWJfc2VuZF93ciAqYmFkX3dyOwogCkBAIC0zMzAsNyArMzI1LDcgQEAKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpcG9pYl90eF9idWYgKnR4X3JlcTsKLQlkbWFfYWRkcl90IGFkZHI7CisJdTY0IGFkZHI7CiAKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPiBkZXYtPm10dSArIElORklOSUJBTkRfQUxFTikpIHsKIAkJaXBvaWJfd2Fybihwcml2LCAicGFja2V0IGxlbiAlZCAoPiAlZCkgdG9vIGxvbmcgdG8gc2VuZCwgZHJvcHBpbmdcbiIsCkBAIC0zNTMsMjEgKzM0OCwyMCBAQAogCSAqLwogCXR4X3JlcSA9ICZwcml2LT50eF9yaW5nW3ByaXYtPnR4X2hlYWQgJiAoaXBvaWJfc2VuZHFfc2l6ZSAtIDEpXTsKIAl0eF9yZXEtPnNrYiA9IHNrYjsKLQlhZGRyID0gZG1hX21hcF9zaW5nbGUocHJpdi0+Y2EtPmRtYV9kZXZpY2UsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCi0JCQkgICAgICBETUFfVE9fREVWSUNFKTsKLQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoYWRkcikpKSB7CisJYWRkciA9IGliX2RtYV9tYXBfc2luZ2xlKHByaXYtPmNhLCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSBETUFfVE9fREVWSUNFKTsKKwlpZiAodW5saWtlbHkoaWJfZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+Y2EsIGFkZHIpKSkgewogCQkrK3ByaXYtPnN0YXRzLnR4X2Vycm9yczsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0dXJuOwogCX0KLQlwY2lfdW5tYXBfYWRkcl9zZXQodHhfcmVxLCBtYXBwaW5nLCBhZGRyKTsKKwl0eF9yZXEtPm1hcHBpbmcgPSBhZGRyOwogCiAJaWYgKHVubGlrZWx5KHBvc3Rfc2VuZChwcml2LCBwcml2LT50eF9oZWFkICYgKGlwb2liX3NlbmRxX3NpemUgLSAxKSwKIAkJCSAgICAgICBhZGRyZXNzLT5haCwgcXBuLCBhZGRyLCBza2ItPmxlbikpKSB7CiAJCWlwb2liX3dhcm4ocHJpdiwgInBvc3Rfc2VuZCBmYWlsZWRcbiIpOwogCQkrK3ByaXYtPnN0YXRzLnR4X2Vycm9yczsKLQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYS0+ZG1hX2RldmljZSwgYWRkciwgc2tiLT5sZW4sCi0JCQkJIERNQV9UT19ERVZJQ0UpOworCQlpYl9kbWFfdW5tYXBfc2luZ2xlKHByaXYtPmNhLCBhZGRyLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfSBlbHNlIHsKIAkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CkBAIC00MDAsMTAgKzM5NCwxMSBAQAogCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CiB9CiAKLXZvaWQgaXBvaWJfcmVhcF9haCh2b2lkICpkZXZfcHRyKQordm9pZCBpcG9pYl9yZWFwX2FoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X3B0cjsKLQlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYsIGFoX3JlYXBfdGFzay53b3JrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+ZGV2OwogCiAJX19pcG9pYl9yZWFwX2FoKGRldik7CiAKQEAgLTUzNywyNCArNTMyLDI3IEBACiAJCQl3aGlsZSAoKGludCkgcHJpdi0+dHhfdGFpbCAtIChpbnQpIHByaXYtPnR4X2hlYWQgPCAwKSB7CiAJCQkJdHhfcmVxID0gJnByaXYtPnR4X3JpbmdbcHJpdi0+dHhfdGFpbCAmCiAJCQkJCQkJKGlwb2liX3NlbmRxX3NpemUgLSAxKV07Ci0JCQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYS0+ZG1hX2RldmljZSwKLQkJCQkJCSBwY2lfdW5tYXBfYWRkcih0eF9yZXEsIG1hcHBpbmcpLAotCQkJCQkJIHR4X3JlcS0+c2tiLT5sZW4sCi0JCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCQkJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwKKwkJCQkJCSAgICB0eF9yZXEtPm1hcHBpbmcsCisJCQkJCQkgICAgdHhfcmVxLT5za2ItPmxlbiwKKwkJCQkJCSAgICBETUFfVE9fREVWSUNFKTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9yZXEtPnNrYik7CiAJCQkJKytwcml2LT50eF90YWlsOwogCQkJfQogCi0JCQlmb3IgKGkgPSAwOyBpIDwgaXBvaWJfcmVjdnFfc2l6ZTsgKytpKQotCQkJCWlmIChwcml2LT5yeF9yaW5nW2ldLnNrYikgewotCQkJCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmNhLT5kbWFfZGV2aWNlLAotCQkJCQkJCSBwY2lfdW5tYXBfYWRkcigmcHJpdi0+cnhfcmluZ1tpXSwKLQkJCQkJCQkJCW1hcHBpbmcpLAotCQkJCQkJCSBJUE9JQl9CVUZfU0laRSwKLQkJCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKLQkJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfcmluZ1tpXS5za2IpOwotCQkJCQlwcml2LT5yeF9yaW5nW2ldLnNrYiA9IE5VTEw7Ci0JCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IGlwb2liX3JlY3ZxX3NpemU7ICsraSkgeworCQkJCXN0cnVjdCBpcG9pYl9yeF9idWYgKnJ4X3JlcTsKKworCQkJCXJ4X3JlcSA9ICZwcml2LT5yeF9yaW5nW2ldOworCQkJCWlmICghcnhfcmVxLT5za2IpCisJCQkJCWNvbnRpbnVlOworCQkJCWliX2RtYV91bm1hcF9zaW5nbGUocHJpdi0+Y2EsCisJCQkJCQkgICAgcnhfcmVxLT5tYXBwaW5nLAorCQkJCQkJICAgIElQT0lCX0JVRl9TSVpFLAorCQkJCQkJICAgIERNQV9GUk9NX0RFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocnhfcmVxLT5za2IpOworCQkJCXJ4X3JlcS0+c2tiID0gTlVMTDsKKwkJCX0KIAogCQkJZ290byB0aW1lb3V0OwogCQl9CkBAIC02MTMsMTAgKzYxMSwxMSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGlwb2liX2liX2Rldl9mbHVzaCh2b2lkICpfZGV2KQordm9pZCBpcG9pYl9pYl9kZXZfZmx1c2goc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilfZGV2OwotCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldiksICpjcHJpdjsKKwlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKmNwcml2LCAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYsIGZsdXNoX3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CiAKIAlpZiAoIXRlc3RfYml0KElQT0lCX0ZMQUdfSU5JVElBTElaRUQsICZwcml2LT5mbGFncykgKSB7CiAJCWlwb2liX2RiZyhwcml2LCAiTm90IGZsdXNoaW5nIC0gSVBPSUJfRkxBR19JTklUSUFMSVpFRCBub3Qgc2V0LlxuIik7CkBAIC02MzgsMTQgKzYzNywxNCBAQAogCSAqLwogCWlmICh0ZXN0X2JpdChJUE9JQl9GTEFHX0FETUlOX1VQLCAmcHJpdi0+ZmxhZ3MpKSB7CiAJCWlwb2liX2liX2Rldl91cChkZXYpOwotCQlpcG9pYl9tY2FzdF9yZXN0YXJ0X3Rhc2soZGV2KTsKKwkJaXBvaWJfbWNhc3RfcmVzdGFydF90YXNrKCZwcml2LT5yZXN0YXJ0X3Rhc2spOwogCX0KIAogCW11dGV4X2xvY2soJnByaXYtPnZsYW5fbXV0ZXgpOwogCiAJLyogRmx1c2ggYW55IGNoaWxkIGludGVyZmFjZXMgdG9vICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjcHJpdiwgJnByaXYtPmNoaWxkX2ludGZzLCBsaXN0KQotCQlpcG9pYl9pYl9kZXZfZmx1c2goY3ByaXYtPmRldik7CisJCWlwb2liX2liX2Rldl9mbHVzaCgmY3ByaXYtPmZsdXNoX3Rhc2spOwogCiAJbXV0ZXhfdW5sb2NrKCZwcml2LT52bGFuX211dGV4KTsKIH0KQEAgLTY3MiwxMCArNjcxLDExIEBACiAgKiBjaGFuZ2UgYXN5bmMgbm90aWZpY2F0aW9uIGlzIGF2YWlsYWJsZS4KICAqLwogCi12b2lkIGlwb2liX3BrZXlfcG9sbCh2b2lkICpkZXZfcHRyKQordm9pZCBpcG9pYl9wa2V5X3BvbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfcHRyOwotCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiwgcGtleV90YXNrLndvcmspOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CiAKIAlpcG9pYl9wa2V5X2Rldl9jaGVja19wcmVzZW5jZShkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCmluZGV4IDFlYWYwMGUuLjcwNWViMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCkBAIC00OSw2ICs0OSw4IEBACiAKICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAKKyNkZWZpbmUgSVBPSUJfUVBOKGhhKSAoYmUzMl90b19jcHVwKChfX2JlMzIgKikgaGEpICYgMHhmZmZmZmYpCisKIE1PRFVMRV9BVVRIT1IoIlJvbGFuZCBEcmVpZXIiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSVAtb3Zlci1JbmZpbmlCYW5kIG5ldCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKQEAgLTI2Miw3ICsyNjQsNyBAQAogCQlpZiAobmVpZ2gtPmFoKQogCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7CiAKLQkJaXBvaWJfbmVpZ2hfZnJlZShuZWlnaCk7CisJCWlwb2liX25laWdoX2ZyZWUoZGV2LCBuZWlnaCk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtNDk1LDggKzQ5Nyw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlza2JfcXVldWVfaGVhZF9pbml0KCZuZWlnaC0+cXVldWUpOwotCiAJLyoKIAkgKiBXZSBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBpcG9pYl9zdGFydF94bWl0LCBzbyB3ZSdyZQogCSAqIGluc2lkZSB0eF9sb2NrIC0tIG5vIG5lZWQgdG8gc2F2ZS9yZXN0b3JlIGZsYWdzLgpAQCAtNTIwLDE0ICs1MjAsMTQgQEAKIAkJbWVtY3B5KCZuZWlnaC0+ZGdpZC5yYXcsICZwYXRoLT5wYXRocmVjLmRnaWQucmF3LAogCQkgICAgICAgc2l6ZW9mKHVuaW9uIGliX2dpZCkpOwogCi0JCWlwb2liX3NlbmQoZGV2LCBza2IsIHBhdGgtPmFoLAotCQkJICAgYmUzMl90b19jcHVwKChfX2JlMzIgKikgc2tiLT5kc3QtPm5laWdoYm91ci0+aGEpKTsKKwkJaXBvaWJfc2VuZChkZXYsIHNrYiwgcGF0aC0+YWgsIElQT0lCX1FQTihza2ItPmRzdC0+bmVpZ2hib3VyLT5oYSkpOwogCX0gZWxzZSB7CiAJCW5laWdoLT5haCAgPSBOVUxMOwotCQlfX3NrYl9xdWV1ZV90YWlsKCZuZWlnaC0+cXVldWUsIHNrYik7CiAKIAkJaWYgKCFwYXRoLT5xdWVyeSAmJiBwYXRoX3JlY19zdGFydChkZXYsIHBhdGgpKQogCQkJZ290byBlcnJfbGlzdDsKKworCQlfX3NrYl9xdWV1ZV90YWlsKCZuZWlnaC0+cXVldWUsIHNrYik7CiAJfQogCiAJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwpAQCAtNTM3LDcgKzUzNyw3IEBACiAJbGlzdF9kZWwoJm5laWdoLT5saXN0KTsKIAogZXJyX3BhdGg6Ci0JaXBvaWJfbmVpZ2hfZnJlZShuZWlnaCk7CisJaXBvaWJfbmVpZ2hfZnJlZShkZXYsIG5laWdoKTsKIAkrK3ByaXYtPnN0YXRzLnR4X2Ryb3BwZWQ7CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIApAQCAtNTk5LDggKzU5OSw3IEBACiAJCWlwb2liX2RiZyhwcml2LCAiU2VuZCB1bmljYXN0IEFSUCB0byAlMDR4XG4iLAogCQkJICBiZTE2X3RvX2NwdShwYXRoLT5wYXRocmVjLmRsaWQpKTsKIAotCQlpcG9pYl9zZW5kKGRldiwgc2tiLCBwYXRoLT5haCwKLQkJCSAgIGJlMzJfdG9fY3B1cCgoX19iZTMyICopIHBoZHItPmh3YWRkcikpOworCQlpcG9pYl9zZW5kKGRldiwgc2tiLCBwYXRoLT5haCwgSVBPSUJfUVBOKHBoZHItPmh3YWRkcikpOwogCX0gZWxzZSBpZiAoKHBhdGgtPnF1ZXJ5IHx8ICFwYXRoX3JlY19zdGFydChkZXYsIHBhdGgpKSAmJgogCQkgICBza2JfcXVldWVfbGVuKCZwYXRoLT5xdWV1ZSkgPCBJUE9JQl9NQVhfUEFUSF9SRUNfUVVFVUUpIHsKIAkJLyogcHV0IHBzZXVkb2hlYWRlciBiYWNrIG9uIGZvciBuZXh0IHRpbWUgKi8KQEAgLTY1NSwxNCArNjU0LDEzIEBACiAJCQkJICovCiAJCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7CiAJCQkJbGlzdF9kZWwoJm5laWdoLT5saXN0KTsKLQkJCQlpcG9pYl9uZWlnaF9mcmVlKG5laWdoKTsKKwkJCQlpcG9pYl9uZWlnaF9mcmVlKGRldiwgbmVpZ2gpOwogCQkJCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKIAkJCQlpcG9pYl9wYXRoX2xvb2t1cChza2IsIGRldik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCWlwb2liX3NlbmQoZGV2LCBza2IsIG5laWdoLT5haCwKLQkJCQkgICBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSBza2ItPmRzdC0+bmVpZ2hib3VyLT5oYSkpOworCQkJaXBvaWJfc2VuZChkZXYsIHNrYiwgbmVpZ2gtPmFoLCBJUE9JQl9RUE4oc2tiLT5kc3QtPm5laWdoYm91ci0+aGEpKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTY5NCw3ICs2OTIsNyBAQAogCQkJCQkgICBJUE9JQl9HSURfRk1UICJcbiIsCiAJCQkJCSAgIHNrYi0+ZHN0ID8gIm5laWdoIiA6ICJkc3QiLAogCQkJCQkgICBiZTE2X3RvX2NwdXAoKF9fYmUxNiAqKSBza2ItPmRhdGEpLAotCQkJCQkgICBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSBwaGRyLT5od2FkZHIpLAorCQkJCQkgICBJUE9JQl9RUE4ocGhkci0+aHdhZGRyKSwKIAkJCQkJICAgSVBPSUJfR0lEX1JBV19BUkcocGhkci0+aHdhZGRyICsgNCkpOwogCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQkJKytwcml2LT5zdGF0cy50eF9kcm9wcGVkOwpAQCAtNzc3LDcgKzc3NSw3IEBACiAKIAlpcG9pYl9kYmcocHJpdiwKIAkJICAibmVpZ2hfZGVzdHJ1Y3RvciBmb3IgJTA2eCAiIElQT0lCX0dJRF9GTVQgIlxuIiwKLQkJICBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSBuLT5oYSksCisJCSAgSVBPSUJfUVBOKG4tPmhhKSwKIAkJICBJUE9JQl9HSURfUkFXX0FSRyhuLT5oYSArIDQpKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC03ODcsNyArNzg1LDcgQEAKIAkJaWYgKG5laWdoLT5haCkKIAkJCWFoID0gbmVpZ2gtPmFoOwogCQlsaXN0X2RlbCgmbmVpZ2gtPmxpc3QpOwotCQlpcG9pYl9uZWlnaF9mcmVlKG5laWdoKTsKKwkJaXBvaWJfbmVpZ2hfZnJlZShuLT5kZXYsIG5laWdoKTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC04MDYsMTMgKzgwNCwyMCBAQAogCiAJbmVpZ2gtPm5laWdoYm91ciA9IG5laWdoYm91cjsKIAkqdG9faXBvaWJfbmVpZ2gobmVpZ2hib3VyKSA9IG5laWdoOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5laWdoLT5xdWV1ZSk7CiAKIAlyZXR1cm4gbmVpZ2g7CiB9CiAKLXZvaWQgaXBvaWJfbmVpZ2hfZnJlZShzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoKQordm9pZCBpcG9pYl9uZWlnaF9mcmVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpcG9pYl9uZWlnaCAqbmVpZ2gpCiB7CisJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCSp0b19pcG9pYl9uZWlnaChuZWlnaC0+bmVpZ2hib3VyKSA9IE5VTEw7CisJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZuZWlnaC0+cXVldWUpKSkgeworCQkrK3ByaXYtPnN0YXRzLnR4X2Ryb3BwZWQ7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQogCWtmcmVlKG5laWdoKTsKIH0KIApAQCAtOTM0LDExICs5MzksMTEgQEAKIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+ZGVhZF9haHMpOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5tdWx0aWNhc3RfbGlzdCk7CiAKLQlJTklUX1dPUksoJnByaXYtPnBrZXlfdGFzaywgICAgaXBvaWJfcGtleV9wb2xsLCAgICAgICAgICBwcml2LT5kZXYpOwotCUlOSVRfV09SSygmcHJpdi0+bWNhc3RfdGFzaywgICBpcG9pYl9tY2FzdF9qb2luX3Rhc2ssICAgIHByaXYtPmRldik7Ci0JSU5JVF9XT1JLKCZwcml2LT5mbHVzaF90YXNrLCAgIGlwb2liX2liX2Rldl9mbHVzaCwgICAgICAgcHJpdi0+ZGV2KTsKLQlJTklUX1dPUksoJnByaXYtPnJlc3RhcnRfdGFzaywgaXBvaWJfbWNhc3RfcmVzdGFydF90YXNrLCBwcml2LT5kZXYpOwotCUlOSVRfV09SSygmcHJpdi0+YWhfcmVhcF90YXNrLCBpcG9pYl9yZWFwX2FoLCAgICAgICAgICAgIHByaXYtPmRldik7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnBrZXlfdGFzaywgICAgaXBvaWJfcGtleV9wb2xsKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+bWNhc3RfdGFzaywgICBpcG9pYl9tY2FzdF9qb2luX3Rhc2spOworCUlOSVRfV09SSygmcHJpdi0+Zmx1c2hfdGFzaywgICBpcG9pYl9pYl9kZXZfZmx1c2gpOworCUlOSVRfV09SSygmcHJpdi0+cmVzdGFydF90YXNrLCBpcG9pYl9tY2FzdF9yZXN0YXJ0X3Rhc2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5haF9yZWFwX3Rhc2ssIGlwb2liX3JlYXBfYWgpOwogfQogCiBzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKmlwb2liX2ludGZfYWxsb2MoY29uc3QgY2hhciAqbmFtZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCmluZGV4IDNmYWExODIuLmIwNGI3MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAJCSAqLwogCQlpZiAobmVpZ2gtPmFoKQogCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7Ci0JCWlwb2liX25laWdoX2ZyZWUobmVpZ2gpOworCQlpcG9pYl9uZWlnaF9mcmVlKGRldiwgbmVpZ2gpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTM5OSw3ICszOTksOCBAQAogCQltY2FzdC0+YmFja29mZiA9IDE7CiAJCW11dGV4X2xvY2soJm1jYXN0X211dGV4KTsKIAkJaWYgKHRlc3RfYml0KElQT0lCX01DQVNUX1JVTiwgJnByaXYtPmZsYWdzKSkKLQkJCXF1ZXVlX3dvcmsoaXBvaWJfd29ya3F1ZXVlLCAmcHJpdi0+bWNhc3RfdGFzayk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoaXBvaWJfd29ya3F1ZXVlLAorCQkJCQkgICAmcHJpdi0+bWNhc3RfdGFzaywgMCk7CiAJCW11dGV4X3VubG9jaygmbWNhc3RfbXV0ZXgpOwogCQljb21wbGV0ZSgmbWNhc3QtPmRvbmUpOwogCQlyZXR1cm47CkBAIC00MzUsNyArNDM2LDggQEAKIAogCWlmICh0ZXN0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpIHsKIAkJaWYgKHN0YXR1cyA9PSAtRVRJTUVET1VUKQotCQkJcXVldWVfd29yayhpcG9pYl93b3JrcXVldWUsICZwcml2LT5tY2FzdF90YXNrKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpcG9pYl93b3JrcXVldWUsICZwcml2LT5tY2FzdF90YXNrLAorCQkJCQkgICAwKTsKIAkJZWxzZQogCQkJcXVldWVfZGVsYXllZF93b3JrKGlwb2liX3dvcmtxdWV1ZSwgJnByaXYtPm1jYXN0X3Rhc2ssCiAJCQkJCSAgIG1jYXN0LT5iYWNrb2ZmICogSFopOwpAQCAtNTE3LDEwICs1MTksMTEgQEAKIAkJbWNhc3QtPnF1ZXJ5X2lkID0gcmV0OwogfQogCi12b2lkIGlwb2liX21jYXN0X2pvaW5fdGFzayh2b2lkICpkZXZfcHRyKQordm9pZCBpcG9pYl9tY2FzdF9qb2luX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfcHRyOwotCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiwgbWNhc3RfdGFzay53b3JrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+ZGV2OwogCiAJaWYgKCF0ZXN0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpCiAJCXJldHVybjsKQEAgLTYxMCw3ICs2MTMsNyBAQAogCiAJbXV0ZXhfbG9jaygmbWNhc3RfbXV0ZXgpOwogCWlmICghdGVzdF9hbmRfc2V0X2JpdChJUE9JQl9NQ0FTVF9SVU4sICZwcml2LT5mbGFncykpCi0JCXF1ZXVlX3dvcmsoaXBvaWJfd29ya3F1ZXVlLCAmcHJpdi0+bWNhc3RfdGFzayk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhpcG9pYl93b3JrcXVldWUsICZwcml2LT5tY2FzdF90YXNrLCAwKTsKIAltdXRleF91bmxvY2soJm1jYXN0X211dGV4KTsKIAogCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwpAQCAtODE4LDEwICs4MjEsMTEgQEAKIAl9CiB9CiAKLXZvaWQgaXBvaWJfbWNhc3RfcmVzdGFydF90YXNrKHZvaWQgKmRldl9wdHIpCit2b2lkIGlwb2liX21jYXN0X3Jlc3RhcnRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9wdHI7Ci0Jc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwb2liX2Rldl9wcml2LCByZXN0YXJ0X3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CiAJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CiAJc3RydWN0IGlwb2liX21jYXN0ICptY2FzdCwgKnRtY2FzdDsKIAlMSVNUX0hFQUQocmVtb3ZlX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmMKaW5kZXggZWI2Zjk4ZC4uOWIyMDQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5jCkBAIC0zNjMsMTEgKzM2MywxMSBAQAogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAJaW50IGVycjsKIAotCWVyciA9IGlzY3NpX2Nvbm5fc3RhcnQoY2xzX2Nvbm4pOworCWVyciA9IGlzZXJfY29ubl9zZXRfZnVsbF9mZWF0dXJlZF9tb2RlKGNvbm4pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gaXNlcl9jb25uX3NldF9mdWxsX2ZlYXR1cmVkX21vZGUoY29ubik7CisJcmV0dXJuIGlzY3NpX2Nvbm5fc3RhcnQoY2xzX2Nvbm4pOwogfQogCiBzdGF0aWMgc3RydWN0IGlzY3NpX3RyYW5zcG9ydCBpc2NzaV9pc2VyX3RyYW5zcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNjc2lfaXNlci5oCmluZGV4IDljNTM5MTYuLmNhZThjOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2NzaV9pc2VyLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzY3NpX2lzZXIuaApAQCAtMTgyLDcgKzE4Miw3IEBACiAJc3RydWN0IGlzZXJfbWVtX3JlZyAgICAgcmVnOyAgICAgICAgLyogbWVtb3J5IHJlZ2lzdHJhdGlvbiBpbmZvICAgICAgICAqLwogCXZvaWQgICAgICAgICAgICAgICAgICAgICp2aXJ0X2FkZHI7CiAJc3RydWN0IGlzZXJfZGV2aWNlICAgICAgKmRldmljZTsgICAgLyogZGV2aWNlLT5kZXZpY2UgZm9yIGRtYV91bm1hcCAgICAqLwotCWRtYV9hZGRyX3QgICAgICAgICAgICAgIGRtYV9hZGRyOyAgIC8qIGlmIG5vbiB6ZXJvLCBhZGRyIGZvciBkbWFfdW5tYXAgKi8KKwl1NjQgICAgICAgICAgICAgICAgICAgICBkbWFfYWRkcjsgICAvKiBpZiBub24gemVybywgYWRkciBmb3IgZG1hX3VubWFwICovCiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uOyAgLyogZGlyZWN0aW9uIGZvciBkbWFfdW5tYXAJICAgICAgICovCiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgZGF0YV9zaXplOwogCWF0b21pY190ICAgICAgICAgICAgICAgIHJlZl9jb3VudDsgIC8qIHJlZmNvdW50LCBmcmVlZCB3aGVuIGRlYyB0byAwICAgKi8KQEAgLTI4Myw3ICsyODMsNyBAQAogCXN0cnVjdCBtdXRleCAgICAgIGNvbm5saXN0X211dGV4OwogCXN0cnVjdCBsaXN0X2hlYWQgIGNvbm5saXN0OwkJLyogYWxsIGlTRVIgSUIgY29ubmVjdGlvbnMgKi8KIAotCWttZW1fY2FjaGVfdCAqZGVzY19jYWNoZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqZGVzY19jYWNoZTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgaXNlcl9nbG9iYWwgaWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl9pbml0aWF0b3IuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCmluZGV4IDliM2Q3OWMuLmU3M2M4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX2luaXRpYXRvci5jCkBAIC00ODcsMTAgKzQ4Nyw4IEBACiAJc3RydWN0IGlzY3NpX2lzZXJfY29ubiAqaXNlcl9jb25uID0gY29ubi0+ZGRfZGF0YTsKIAlzdHJ1Y3QgaXNlcl9kZXNjICptZGVzYyA9IG10YXNrLT5kZF9kYXRhOwogCXN0cnVjdCBpc2VyX2R0byAqc2VuZF9kdG8gPSBOVUxMOwotCXVuc2lnbmVkIGludCBpdHQ7CiAJdW5zaWduZWQgbG9uZyBkYXRhX3NlZ19sZW47CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgY2hhciBvcGNvZGU7CiAJc3RydWN0IGlzZXJfcmVnZF9idWYgKnJlZ2RfYnVmOwogCXN0cnVjdCBpc2VyX2RldmljZSAqZGV2aWNlOwogCkBAIC01MTIsOCArNTEwLDYgQEAKIAogCWlzZXJfcmVnX3NpbmdsZShkZXZpY2UsIHNlbmRfZHRvLT5yZWdkWzBdLCBETUFfVE9fREVWSUNFKTsKIAotCWl0dCA9IG50b2hsKG10YXNrLT5oZHItPml0dCk7Ci0Jb3Bjb2RlID0gbXRhc2stPmhkci0+b3Bjb2RlICYgSVNDU0lfT1BDT0RFX01BU0s7CiAJZGF0YV9zZWdfbGVuID0gbnRvaDI0KG10YXNrLT5oZHItPmRsZW5ndGgpOwogCiAJaWYgKGRhdGFfc2VnX2xlbiA+IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX21lbW9yeS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfbWVtb3J5LmMKaW5kZXggMDYwNjc0NC4uZmM5ZjFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfbWVtb3J5LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfbWVtb3J5LmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KQEAgLTUxLDcgKzUyLDcgQEAKICAqLwogaW50IGlzZXJfcmVnZF9idWZmX3JlbGVhc2Uoc3RydWN0IGlzZXJfcmVnZF9idWYgKnJlZ2RfYnVmKQogewotCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXZpY2U7CisJc3RydWN0IGliX2RldmljZSAqZGV2OwogCiAJaWYgKChhdG9taWNfcmVhZCgmcmVnZF9idWYtPnJlZl9jb3VudCkgPT0gMCkgfHwKIAkgICAgYXRvbWljX2RlY19hbmRfdGVzdCgmcmVnZF9idWYtPnJlZl9jb3VudCkpIHsKQEAgLTYwLDggKzYxLDggQEAKIAkJCWlzZXJfdW5yZWdfbWVtKCZyZWdkX2J1Zi0+cmVnKTsKIAogCQlpZiAocmVnZF9idWYtPmRtYV9hZGRyKSB7Ci0JCQlkbWFfZGV2aWNlID0gcmVnZF9idWYtPmRldmljZS0+aWJfZGV2aWNlLT5kbWFfZGV2aWNlOwotCQkJZG1hX3VubWFwX3NpbmdsZShkbWFfZGV2aWNlLAorCQkJZGV2ID0gcmVnZF9idWYtPmRldmljZS0+aWJfZGV2aWNlOworCQkJaWJfZG1hX3VubWFwX3NpbmdsZShkZXYsCiAJCQkJCSByZWdkX2J1Zi0+ZG1hX2FkZHIsCiAJCQkJCSByZWdkX2J1Zi0+ZGF0YV9zaXplLAogCQkJCQkgcmVnZF9idWYtPmRpcmVjdGlvbik7CkBAIC04MywxMiArODQsMTIgQEAKIAkJICAgICBzdHJ1Y3QgaXNlcl9yZWdkX2J1ZiAqcmVnZF9idWYsCiAJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTY0IGRtYV9hZGRyOwogCi0JZG1hX2FkZHIgID0gZG1hX21hcF9zaW5nbGUoZGV2aWNlLT5pYl9kZXZpY2UtPmRtYV9kZXZpY2UsCi0JCQkJICAgcmVnZF9idWYtPnZpcnRfYWRkciwKLQkJCQkgICByZWdkX2J1Zi0+ZGF0YV9zaXplLCBkaXJlY3Rpb24pOwotCUJVR19PTihkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcikpOworCWRtYV9hZGRyID0gaWJfZG1hX21hcF9zaW5nbGUoZGV2aWNlLT5pYl9kZXZpY2UsCisJCQkJICAgICByZWdkX2J1Zi0+dmlydF9hZGRyLAorCQkJCSAgICAgcmVnZF9idWYtPmRhdGFfc2l6ZSwgZGlyZWN0aW9uKTsKKwlCVUdfT04oaWJfZG1hX21hcHBpbmdfZXJyb3IoZGV2aWNlLT5pYl9kZXZpY2UsIGRtYV9hZGRyKSk7CiAKIAlyZWdkX2J1Zi0+cmVnLmxrZXkgPSBkZXZpY2UtPm1yLT5sa2V5OwogCXJlZ2RfYnVmLT5yZWcubGVuICA9IHJlZ2RfYnVmLT5kYXRhX3NpemU7CkBAIC0xMDYsMTQgKzEwNywxNCBAQAogCQkJCSBlbnVtIGlzZXJfZGF0YV9kaXIgY21kX2RpcikKIHsKIAlpbnQgZG1hX25lbnRzOwotCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXZpY2U7CisJc3RydWN0IGliX2RldmljZSAqZGV2OwogCWNoYXIgKm1lbSA9IE5VTEw7CiAJc3RydWN0IGlzZXJfZGF0YV9idWYgKmRhdGEgPSAmaXNlcl9jdGFzay0+ZGF0YVtjbWRfZGlyXTsKIAl1bnNpZ25lZCBsb25nICBjbWRfZGF0YV9sZW4gPSBkYXRhLT5kYXRhX2xlbjsKIAogCWlmIChjbWRfZGF0YV9sZW4gPiBJU0VSX0tNQUxMT0NfVEhSRVNIT0xEKQogCQltZW0gPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX05PSU8sCi0JCSAgICAgIGxvbmdfbG9nMihyb3VuZHVwX3Bvd19vZl90d28oY21kX2RhdGFfbGVuKSkgLSBQQUdFX1NISUZUKTsKKwkJICAgICAgaWxvZzIocm91bmR1cF9wb3dfb2ZfdHdvKGNtZF9kYXRhX2xlbikpIC0gUEFHRV9TSElGVCk7CiAJZWxzZQogCQltZW0gPSBrbWFsbG9jKGNtZF9kYXRhX2xlbiwgR0ZQX05PSU8pOwogCkBAIC0xNDYsMTcgKzE0NywxMiBAQAogCiAJaXNlcl9jdGFzay0+ZGF0YV9jb3B5W2NtZF9kaXJdLmNvcHlfYnVmICA9IG1lbTsKIAotCWRtYV9kZXZpY2UgPSBpc2VyX2N0YXNrLT5pc2VyX2Nvbm4tPmliX2Nvbm4tPmRldmljZS0+aWJfZGV2aWNlLT5kbWFfZGV2aWNlOwotCi0JaWYgKGNtZF9kaXIgPT0gSVNFUl9ESVJfT1VUKQotCQlkbWFfbmVudHMgPSBkbWFfbWFwX3NnKGRtYV9kZXZpY2UsCi0JCQkJICAgICAgICZpc2VyX2N0YXNrLT5kYXRhX2NvcHlbY21kX2Rpcl0uc2dfc2luZ2xlLAotCQkJCSAgICAgICAxLCBETUFfVE9fREVWSUNFKTsKLQllbHNlCi0JCWRtYV9uZW50cyA9IGRtYV9tYXBfc2coZG1hX2RldmljZSwKLQkJCQkgICAgICAgJmlzZXJfY3Rhc2stPmRhdGFfY29weVtjbWRfZGlyXS5zZ19zaW5nbGUsCi0JCQkJICAgICAgIDEsIERNQV9GUk9NX0RFVklDRSk7Ci0KKwlkZXYgPSBpc2VyX2N0YXNrLT5pc2VyX2Nvbm4tPmliX2Nvbm4tPmRldmljZS0+aWJfZGV2aWNlOworCWRtYV9uZW50cyA9IGliX2RtYV9tYXBfc2coZGV2LAorCQkJCSAgJmlzZXJfY3Rhc2stPmRhdGFfY29weVtjbWRfZGlyXS5zZ19zaW5nbGUsCisJCQkJICAxLAorCQkJCSAgKGNtZF9kaXIgPT0gSVNFUl9ESVJfT1VUKSA/CisJCQkJICBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKIAlCVUdfT04oZG1hX25lbnRzID09IDApOwogCiAJaXNlcl9jdGFzay0+ZGF0YV9jb3B5W2NtZF9kaXJdLmRtYV9uZW50cyA9IGRtYV9uZW50czsKQEAgLTE2OSwxOSArMTY1LDE2IEBACiB2b2lkIGlzZXJfZmluYWxpemVfcmRtYV91bmFsaWduZWRfc2coc3RydWN0IGlzY3NpX2lzZXJfY21kX3Rhc2sgKmlzZXJfY3Rhc2ssCiAJCQkJICAgICBlbnVtIGlzZXJfZGF0YV9kaXIgICAgICAgICBjbWRfZGlyKQogewotCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXZpY2U7CisJc3RydWN0IGliX2RldmljZSAqZGV2OwogCXN0cnVjdCBpc2VyX2RhdGFfYnVmICptZW1fY29weTsKIAl1bnNpZ25lZCBsb25nICBjbWRfZGF0YV9sZW47CiAKLQlkbWFfZGV2aWNlID0gaXNlcl9jdGFzay0+aXNlcl9jb25uLT5pYl9jb25uLT5kZXZpY2UtPmliX2RldmljZS0+ZG1hX2RldmljZTsKLQltZW1fY29weSAgID0gJmlzZXJfY3Rhc2stPmRhdGFfY29weVtjbWRfZGlyXTsKKwlkZXYgPSBpc2VyX2N0YXNrLT5pc2VyX2Nvbm4tPmliX2Nvbm4tPmRldmljZS0+aWJfZGV2aWNlOworCW1lbV9jb3B5ID0gJmlzZXJfY3Rhc2stPmRhdGFfY29weVtjbWRfZGlyXTsKIAotCWlmIChjbWRfZGlyID09IElTRVJfRElSX09VVCkKLQkJZG1hX3VubWFwX3NnKGRtYV9kZXZpY2UsICZtZW1fY29weS0+c2dfc2luZ2xlLCAxLAotCQkJICAgICBETUFfVE9fREVWSUNFKTsKLQllbHNlCi0JCWRtYV91bm1hcF9zZyhkbWFfZGV2aWNlLCAmbWVtX2NvcHktPnNnX3NpbmdsZSwgMSwKLQkJCSAgICAgRE1BX0ZST01fREVWSUNFKTsKKwlpYl9kbWFfdW5tYXBfc2coZGV2LCAmbWVtX2NvcHktPnNnX3NpbmdsZSwgMSwKKwkJCShjbWRfZGlyID09IElTRVJfRElSX09VVCkgPworCQkJRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CiAKIAlpZiAoY21kX2RpciA9PSBJU0VSX0RJUl9JTikgewogCQljaGFyICptZW07CkBAIC0yMTAsNyArMjAzLDcgQEAKIAogCWlmIChjbWRfZGF0YV9sZW4gPiBJU0VSX0tNQUxMT0NfVEhSRVNIT0xEKQogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW1lbV9jb3B5LT5jb3B5X2J1ZiwKLQkJCSAgIGxvbmdfbG9nMihyb3VuZHVwX3Bvd19vZl90d28oY21kX2RhdGFfbGVuKSkgLSBQQUdFX1NISUZUKTsKKwkJCSAgIGlsb2cyKHJvdW5kdXBfcG93X29mX3R3byhjbWRfZGF0YV9sZW4pKSAtIFBBR0VfU0hJRlQpOwogCWVsc2UKIAkJa2ZyZWUobWVtX2NvcHktPmNvcHlfYnVmKTsKIApAQCAtMjMwLDExICsyMjMsMTIgQEAKICAqIGNvbnNlY3V0aXZlIGVsZW1lbnRzLiBBbHNvLCBpdCBoYW5kbGVzIG9uZSBlbnRyeSBTRy4KICAqLwogc3RhdGljIGludCBpc2VyX3NnX3RvX3BhZ2VfdmVjKHN0cnVjdCBpc2VyX2RhdGFfYnVmICpkYXRhLAotCQkJICAgICAgIHN0cnVjdCBpc2VyX3BhZ2VfdmVjICpwYWdlX3ZlYykKKwkJCSAgICAgICBzdHJ1Y3QgaXNlcl9wYWdlX3ZlYyAqcGFnZV92ZWMsCisJCQkgICAgICAgc3RydWN0IGliX2RldmljZSAqaWJkZXYpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilkYXRhLT5idWY7Ci0JZG1hX2FkZHJfdCBmaXJzdF9hZGRyLCBsYXN0X2FkZHIsIHBhZ2U7Ci0JaW50IHN0YXJ0X2FsaWduZWQsIGVuZF9hbGlnbmVkOworCXU2NCBmaXJzdF9hZGRyLCBsYXN0X2FkZHIsIHBhZ2U7CisJaW50IGVuZF9hbGlnbmVkOwogCXVuc2lnbmVkIGludCBjdXJfcGFnZSA9IDA7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9zeiA9IDA7CiAJaW50IGk7CkBAIC0yNDMsMTkgKzIzNywyMSBAQAogCXBhZ2VfdmVjLT5vZmZzZXQgPSAodTY0KSBzZ1swXS5vZmZzZXQgJiB+TUFTS180SzsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5kbWFfbmVudHM7IGkrKykgewotCQl0b3RhbF9zeiArPSBzZ19kbWFfbGVuKCZzZ1tpXSk7CisJCXVuc2lnbmVkIGludCBkbWFfbGVuID0gaWJfc2dfZG1hX2xlbihpYmRldiwgJnNnW2ldKTsKIAotCQlmaXJzdF9hZGRyID0gc2dfZG1hX2FkZHJlc3MoJnNnW2ldKTsKLQkJbGFzdF9hZGRyICA9IGZpcnN0X2FkZHIgKyBzZ19kbWFfbGVuKCZzZ1tpXSk7CisJCXRvdGFsX3N6ICs9IGRtYV9sZW47CiAKLQkJc3RhcnRfYWxpZ25lZCA9ICEoZmlyc3RfYWRkciAmIH5NQVNLXzRLKTsKKwkJZmlyc3RfYWRkciA9IGliX3NnX2RtYV9hZGRyZXNzKGliZGV2LCAmc2dbaV0pOworCQlsYXN0X2FkZHIgID0gZmlyc3RfYWRkciArIGRtYV9sZW47CisKIAkJZW5kX2FsaWduZWQgICA9ICEobGFzdF9hZGRyICAmIH5NQVNLXzRLKTsKIAogCQkvKiBjb250aW51ZSB0byBjb2xsZWN0IHBhZ2UgZnJhZ21lbnRzIHRpbGwgYWxpZ25lZCBvciBTRyBlbmRzICovCiAJCXdoaWxlICghZW5kX2FsaWduZWQgJiYgKGkgKyAxIDwgZGF0YS0+ZG1hX25lbnRzKSkgewogCQkJaSsrOwotCQkJdG90YWxfc3ogKz0gc2dfZG1hX2xlbigmc2dbaV0pOwotCQkJbGFzdF9hZGRyID0gc2dfZG1hX2FkZHJlc3MoJnNnW2ldKSArIHNnX2RtYV9sZW4oJnNnW2ldKTsKKwkJCWRtYV9sZW4gPSBpYl9zZ19kbWFfbGVuKGliZGV2LCAmc2dbaV0pOworCQkJdG90YWxfc3ogKz0gZG1hX2xlbjsKKwkJCWxhc3RfYWRkciA9IGliX3NnX2RtYV9hZGRyZXNzKGliZGV2LCAmc2dbaV0pICsgZG1hX2xlbjsKIAkJCWVuZF9hbGlnbmVkID0gIShsYXN0X2FkZHIgICYgfk1BU0tfNEspOwogCQl9CiAKQEAgLTI4NywxMCArMjgzLDExIEBACiAgKiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2hpY2ggYXJlIGFsaWduZWQgY29ycmVjdGx5LiBTdXBwb3J0cyB0aGUgY2FzZSB3aGVyZQogICogY29uc2VjdXRpdmUgU0cgZWxlbWVudHMgYXJlIGFjdHVhbGx5IGZyYWdtZW50cyBvZiB0aGUgc2FtZSBwaHlzY2lhbCBwYWdlLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlzZXJfZGF0YV9idWZfYWxpZ25lZF9sZW4oc3RydWN0IGlzZXJfZGF0YV9idWYgKmRhdGEpCitzdGF0aWMgdW5zaWduZWQgaW50IGlzZXJfZGF0YV9idWZfYWxpZ25lZF9sZW4oc3RydWN0IGlzZXJfZGF0YV9idWYgKmRhdGEsCisJCQkJCSAgICAgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2KQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0JZG1hX2FkZHJfdCBlbmRfYWRkciwgbmV4dF9hZGRyOworCXU2NCBlbmRfYWRkciwgbmV4dF9hZGRyOwogCWludCBpLCBjbnQ7CiAJdW5zaWduZWQgaW50IHJldF9sZW4gPSAwOwogCkBAIC0zMDIsMTIgKzI5OSwxMiBAQAogCQkgICAodW5zaWduZWQgbG9uZylwYWdlX3RvX3BoeXMoc2dbaV0ucGFnZSksCiAJCSAgICh1bnNpZ25lZCBsb25nKXNnW2ldLm9mZnNldCwKIAkJICAgKHVuc2lnbmVkIGxvbmcpc2dbaV0ubGVuZ3RoKTsgKi8KLQkJZW5kX2FkZHIgPSBzZ19kbWFfYWRkcmVzcygmc2dbaV0pICsKLQkJCSAgIHNnX2RtYV9sZW4oJnNnW2ldKTsKKwkJZW5kX2FkZHIgPSBpYl9zZ19kbWFfYWRkcmVzcyhpYmRldiwgJnNnW2ldKSArCisJCQkgICBpYl9zZ19kbWFfbGVuKGliZGV2LCAmc2dbaV0pOwogCQkvKiBpc2VyX2RiZygiQ2hlY2tpbmcgc2cgaW9idWYgZW5kIGFkZHJlc3MgIgogCQkgICAgICAgIjB4JTA4bFhcbiIsIGVuZF9hZGRyKTsgKi8KIAkJaWYgKGkgKyAxIDwgZGF0YS0+ZG1hX25lbnRzKSB7Ci0JCQluZXh0X2FkZHIgPSBzZ19kbWFfYWRkcmVzcygmc2dbaSsxXSk7CisJCQluZXh0X2FkZHIgPSBpYl9zZ19kbWFfYWRkcmVzcyhpYmRldiwgJnNnW2krMV0pOwogCQkJLyogYXJlIGksIGkrMSBmcmFnbWVudHMgb2YgdGhlIHNhbWUgcGFnZT8gKi8KIAkJCWlmIChlbmRfYWRkciA9PSBuZXh0X2FkZHIpCiAJCQkJY29udGludWU7CkBAIC0zMjQsNyArMzIxLDggQEAKIAlyZXR1cm4gcmV0X2xlbjsKIH0KIAotc3RhdGljIHZvaWQgaXNlcl9kYXRhX2J1Zl9kdW1wKHN0cnVjdCBpc2VyX2RhdGFfYnVmICpkYXRhKQorc3RhdGljIHZvaWQgaXNlcl9kYXRhX2J1Zl9kdW1wKHN0cnVjdCBpc2VyX2RhdGFfYnVmICpkYXRhLAorCQkJICAgICAgIHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2KQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopZGF0YS0+YnVmOwogCWludCBpOwpAQCAtMzMyLDkgKzMzMCw5IEBACiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPmRtYV9uZW50czsgaSsrKQogCQlpc2VyX2Vycigic2dbJWRdIGRtYV9hZGRyOjB4JWxYIHBhZ2U6MHglcCAiCiAJCQkgIm9mZjoweCV4IHN6OjB4JXggZG1hX2xlbjoweCV4XG4iLAotCQkJIGksICh1bnNpZ25lZCBsb25nKXNnX2RtYV9hZGRyZXNzKCZzZ1tpXSksCisJCQkgaSwgKHVuc2lnbmVkIGxvbmcpaWJfc2dfZG1hX2FkZHJlc3MoaWJkZXYsICZzZ1tpXSksCiAJCQkgc2dbaV0ucGFnZSwgc2dbaV0ub2Zmc2V0LAotCQkJIHNnW2ldLmxlbmd0aCxzZ19kbWFfbGVuKCZzZ1tpXSkpOworCQkJIHNnW2ldLmxlbmd0aCwgaWJfc2dfZG1hX2xlbihpYmRldiwgJnNnW2ldKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzZXJfZHVtcF9wYWdlX3ZlYyhzdHJ1Y3QgaXNlcl9wYWdlX3ZlYyAqcGFnZV92ZWMpCkBAIC0zNDgsNyArMzQ2LDggQEAKIH0KIAogc3RhdGljIHZvaWQgaXNlcl9wYWdlX3ZlY19idWlsZChzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiAqZGF0YSwKLQkJCQlzdHJ1Y3QgaXNlcl9wYWdlX3ZlYyAqcGFnZV92ZWMpCisJCQkJc3RydWN0IGlzZXJfcGFnZV92ZWMgKnBhZ2VfdmVjLAorCQkJCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2KQogewogCWludCBwYWdlX3ZlY19sZW4gPSAwOwogCkBAIC0zNTYsMTQgKzM1NSwxNCBAQAogCXBhZ2VfdmVjLT5vZmZzZXQgPSAwOwogCiAJaXNlcl9kYmcoIlRyYW5zbGF0aW5nIHNnIHN6OiAlZFxuIiwgZGF0YS0+ZG1hX25lbnRzKTsKLQlwYWdlX3ZlY19sZW4gPSBpc2VyX3NnX3RvX3BhZ2VfdmVjKGRhdGEscGFnZV92ZWMpOworCXBhZ2VfdmVjX2xlbiA9IGlzZXJfc2dfdG9fcGFnZV92ZWMoZGF0YSwgcGFnZV92ZWMsIGliZGV2KTsKIAlpc2VyX2RiZygic2cgbGVuICVkIHBhZ2VfdmVjX2xlbiAlZFxuIiwgZGF0YS0+ZG1hX25lbnRzLHBhZ2VfdmVjX2xlbik7CiAKIAlwYWdlX3ZlYy0+bGVuZ3RoID0gcGFnZV92ZWNfbGVuOwogCiAJaWYgKHBhZ2VfdmVjX2xlbiAqIFNJWkVfNEsgPCBwYWdlX3ZlYy0+ZGF0YV9zaXplKSB7CiAJCWlzZXJfZXJyKCJwYWdlX3ZlYyB0b28gc2hvcnQgdG8gaG9sZCB0aGlzIFNHXG4iKTsKLQkJaXNlcl9kYXRhX2J1Zl9kdW1wKGRhdGEpOworCQlpc2VyX2RhdGFfYnVmX2R1bXAoZGF0YSwgaWJkZXYpOwogCQlpc2VyX2R1bXBfcGFnZV92ZWMocGFnZV92ZWMpOwogCQlCVUcoKTsKIAl9CkBAIC0zNzQsMTMgKzM3MywxMiBAQAogCQkJICAgIGVudW0gICBpc2VyX2RhdGFfZGlyICAgICAgIGlzZXJfZGlyLAogCQkJICAgIGVudW0gICBkbWFfZGF0YV9kaXJlY3Rpb24gIGRtYV9kaXIpCiB7Ci0Jc3RydWN0IGRldmljZSAqZG1hX2RldmljZTsKKwlzdHJ1Y3QgaWJfZGV2aWNlICpkZXY7CiAKIAlpc2VyX2N0YXNrLT5kaXJbaXNlcl9kaXJdID0gMTsKLQlkbWFfZGV2aWNlID0KLQkJaXNlcl9jdGFzay0+aXNlcl9jb25uLT5pYl9jb25uLT5kZXZpY2UtPmliX2RldmljZS0+ZG1hX2RldmljZTsKKwlkZXYgPSBpc2VyX2N0YXNrLT5pc2VyX2Nvbm4tPmliX2Nvbm4tPmRldmljZS0+aWJfZGV2aWNlOwogCi0JZGF0YS0+ZG1hX25lbnRzID0gZG1hX21hcF9zZyhkbWFfZGV2aWNlLCBkYXRhLT5idWYsIGRhdGEtPnNpemUsIGRtYV9kaXIpOworCWRhdGEtPmRtYV9uZW50cyA9IGliX2RtYV9tYXBfc2coZGV2LCBkYXRhLT5idWYsIGRhdGEtPnNpemUsIGRtYV9kaXIpOwogCWlmIChkYXRhLT5kbWFfbmVudHMgPT0gMCkgewogCQlpc2VyX2VycigiZG1hX21hcF9zZyBmYWlsZWQhISFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM5MCwyMCArMzg4LDE5IEBACiAKIHZvaWQgaXNlcl9kbWFfdW5tYXBfdGFza19kYXRhKHN0cnVjdCBpc2NzaV9pc2VyX2NtZF90YXNrICppc2VyX2N0YXNrKQogewotCXN0cnVjdCBkZXZpY2UgICpkbWFfZGV2aWNlOworCXN0cnVjdCBpYl9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaXNlcl9kYXRhX2J1ZiAqZGF0YTsKIAotCWRtYV9kZXZpY2UgPQotCQlpc2VyX2N0YXNrLT5pc2VyX2Nvbm4tPmliX2Nvbm4tPmRldmljZS0+aWJfZGV2aWNlLT5kbWFfZGV2aWNlOworCWRldiA9IGlzZXJfY3Rhc2stPmlzZXJfY29ubi0+aWJfY29ubi0+ZGV2aWNlLT5pYl9kZXZpY2U7CiAKIAlpZiAoaXNlcl9jdGFzay0+ZGlyW0lTRVJfRElSX0lOXSkgewogCQlkYXRhID0gJmlzZXJfY3Rhc2stPmRhdGFbSVNFUl9ESVJfSU5dOwotCQlkbWFfdW5tYXBfc2coZG1hX2RldmljZSwgZGF0YS0+YnVmLCBkYXRhLT5zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpYl9kbWFfdW5tYXBfc2coZGV2LCBkYXRhLT5idWYsIGRhdGEtPnNpemUsIERNQV9GUk9NX0RFVklDRSk7CiAJfQogCiAJaWYgKGlzZXJfY3Rhc2stPmRpcltJU0VSX0RJUl9PVVRdKSB7CiAJCWRhdGEgPSAmaXNlcl9jdGFzay0+ZGF0YVtJU0VSX0RJUl9PVVRdOwotCQlkbWFfdW5tYXBfc2coZG1hX2RldmljZSwgZGF0YS0+YnVmLCBkYXRhLT5zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJaWJfZG1hX3VubWFwX3NnKGRldiwgZGF0YS0+YnVmLCBkYXRhLT5zaXplLCBETUFfVE9fREVWSUNFKTsKIAl9CiB9CiAKQEAgLTQxOCw2ICs0MTUsNyBAQAogewogCXN0cnVjdCBpc2VyX2Nvbm4gICAgICppYl9jb25uID0gaXNlcl9jdGFzay0+aXNlcl9jb25uLT5pYl9jb25uOwogCXN0cnVjdCBpc2VyX2RldmljZSAgICpkZXZpY2UgPSBpYl9jb25uLT5kZXZpY2U7CisJc3RydWN0IGliX2RldmljZSAgICAgKmliZGV2ID0gZGV2aWNlLT5pYl9kZXZpY2U7CiAJc3RydWN0IGlzZXJfZGF0YV9idWYgKm1lbSA9ICZpc2VyX2N0YXNrLT5kYXRhW2NtZF9kaXJdOwogCXN0cnVjdCBpc2VyX3JlZ2RfYnVmICpyZWdkX2J1ZjsKIAlpbnQgYWxpZ25lZF9sZW47CkBAIC00MjcsMTEgKzQyNSwxMSBAQAogCiAJcmVnZF9idWYgPSAmaXNlcl9jdGFzay0+cmRtYV9yZWdkW2NtZF9kaXJdOwogCi0JYWxpZ25lZF9sZW4gPSBpc2VyX2RhdGFfYnVmX2FsaWduZWRfbGVuKG1lbSk7CisJYWxpZ25lZF9sZW4gPSBpc2VyX2RhdGFfYnVmX2FsaWduZWRfbGVuKG1lbSwgaWJkZXYpOwogCWlmIChhbGlnbmVkX2xlbiAhPSBtZW0tPmRtYV9uZW50cykgewogCQlpc2VyX2VycigicmRtYSBhbGlnbm1lbnQgdmlvbGF0aW9uICVkLyVkIGFsaWduZWRcbiIsCiAJCQkgYWxpZ25lZF9sZW4sIG1lbS0+c2l6ZSk7Ci0JCWlzZXJfZGF0YV9idWZfZHVtcChtZW0pOworCQlpc2VyX2RhdGFfYnVmX2R1bXAobWVtLCBpYmRldik7CiAKIAkJLyogdW5tYXAgdGhlIGNvbW1hbmQgZGF0YSBiZWZvcmUgYWNjZXNzaW5nIGl0ICovCiAJCWlzZXJfZG1hX3VubWFwX3Rhc2tfZGF0YShpc2VyX2N0YXNrKTsKQEAgLTQ0OSw4ICs0NDcsOCBAQAogCiAJCXJlZ2RfYnVmLT5yZWcubGtleSA9IGRldmljZS0+bXItPmxrZXk7CiAJCXJlZ2RfYnVmLT5yZWcucmtleSA9IGRldmljZS0+bXItPnJrZXk7Ci0JCXJlZ2RfYnVmLT5yZWcubGVuICA9IHNnX2RtYV9sZW4oJnNnWzBdKTsKLQkJcmVnZF9idWYtPnJlZy52YSAgID0gc2dfZG1hX2FkZHJlc3MoJnNnWzBdKTsKKwkJcmVnZF9idWYtPnJlZy5sZW4gID0gaWJfc2dfZG1hX2xlbihpYmRldiwgJnNnWzBdKTsKKwkJcmVnZF9idWYtPnJlZy52YSAgID0gaWJfc2dfZG1hX2FkZHJlc3MoaWJkZXYsICZzZ1swXSk7CiAJCXJlZ2RfYnVmLT5yZWcuaXNfZm1yID0gMDsKIAogCQlpc2VyX2RiZygiUEhZU0lDQUwgTWVtLnJlZ2lzdGVyOiBsa2V5OiAweCUwOFggcmtleTogMHglMDhYICAiCkBAIC00NjAsMTAgKzQ1OCwxMCBAQAogCQkJICh1bnNpZ25lZCBsb25nKXJlZ2RfYnVmLT5yZWcudmEsCiAJCQkgKHVuc2lnbmVkIGxvbmcpcmVnZF9idWYtPnJlZy5sZW4pOwogCX0gZWxzZSB7IC8qIHVzZSBGTVIgZm9yIG11bHRpcGxlIGRtYSBlbnRyaWVzICovCi0JCWlzZXJfcGFnZV92ZWNfYnVpbGQobWVtLCBpYl9jb25uLT5wYWdlX3ZlYyk7CisJCWlzZXJfcGFnZV92ZWNfYnVpbGQobWVtLCBpYl9jb25uLT5wYWdlX3ZlYywgaWJkZXYpOwogCQllcnIgPSBpc2VyX3JlZ19wYWdlX3ZlYyhpYl9jb25uLCBpYl9jb25uLT5wYWdlX3ZlYywgJnJlZ2RfYnVmLT5yZWcpOwogCQlpZiAoZXJyKSB7Ci0JCQlpc2VyX2RhdGFfYnVmX2R1bXAobWVtKTsKKwkJCWlzZXJfZGF0YV9idWZfZHVtcChtZW0sIGliZGV2KTsKIAkJCWlzZXJfZXJyKCJtZW0tPmRtYV9uZW50cyA9ICVkIChkbGVuZ3RoID0gMHgleClcbiIsIG1lbS0+ZG1hX25lbnRzLAogCQkJCSBudG9oMjQoaXNlcl9jdGFzay0+ZGVzYy5pc2NzaV9oZWFkZXIuZGxlbmd0aCkpOwogCQkJaXNlcl9lcnIoInBhZ2VfdmVjOiBkYXRhX3NpemUgPSAweCV4LCBsZW5ndGggPSAlZCwgb2Zmc2V0ID0gMHgleFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXIvaXNlcl92ZXJicy5jCmluZGV4IDE4YTAwMDAuLjY5M2I3NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9pc2VyX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL2lzZXJfdmVyYnMuYwpAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0aWMgdm9pZCBpc2VyX2NxX3Rhc2tsZXRfZm4odW5zaWduZWQgbG9uZyBkYXRhKTsKIHN0YXRpYyB2b2lkIGlzZXJfY3FfY2FsbGJhY2soc3RydWN0IGliX2NxICpjcSwgdm9pZCAqY3FfY29udGV4dCk7Ci1zdGF0aWMgdm9pZCBpc2VyX2NvbXBfZXJyb3Jfd29ya2VyKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgaXNlcl9jb21wX2Vycm9yX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdGF0aWMgdm9pZCBpc2VyX2NxX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBpYl9ldmVudCAqY2F1c2UsIHZvaWQgKmNvbnRleHQpCiB7CkBAIC00ODAsOCArNDgwLDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpYl9jb25uLT53YWl0KTsKIAlhdG9taWNfc2V0KCZpYl9jb25uLT5wb3N0X3JlY3ZfYnVmX2NvdW50LCAwKTsKIAlhdG9taWNfc2V0KCZpYl9jb25uLT5wb3N0X3NlbmRfYnVmX2NvdW50LCAwKTsKLQlJTklUX1dPUksoJmliX2Nvbm4tPmNvbXBlcnJvcl93b3JrLCBpc2VyX2NvbXBfZXJyb3Jfd29ya2VyLAotCQkgIGliX2Nvbm4pOworCUlOSVRfV09SSygmaWJfY29ubi0+Y29tcGVycm9yX3dvcmssIGlzZXJfY29tcF9lcnJvcl93b3JrZXIpOwogCUlOSVRfTElTVF9IRUFEKCZpYl9jb25uLT5jb25uX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZpYl9jb25uLT5sb2NrKTsKIApAQCAtNzU0LDkgKzc1MywxMCBAQAogCXJldHVybiByZXRfdmFsOwogfQogCi1zdGF0aWMgdm9pZCBpc2VyX2NvbXBfZXJyb3Jfd29ya2VyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpc2VyX2NvbXBfZXJyb3Jfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uID0gZGF0YTsKKwlzdHJ1Y3QgaXNlcl9jb25uICppYl9jb25uID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpc2VyX2Nvbm4sIGNvbXBlcnJvcl93b3JrKTsKIAogCS8qIGdldHRpbmcgaGVyZSB3aGVuIHRoZSBzdGF0ZSBpcyBVUCBtZWFucyB0aGF0IHRoZSBjb25uIGlzIGJlaW5nICoKIAkgKiB0ZXJtaW5hdGVkIGFzeW5jaHJvbm91c2x5IGZyb20gdGhlIGlTQ1NJIGxheWVyJ3MgcGVyc3BlY3RpdmUuICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwppbmRleCA0YjA5MTQ3Li5lOWI2YTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwpAQCAtMTIyLDkgKzEyMiw4IEBACiAJaWYgKCFpdS0+YnVmKQogCQlnb3RvIG91dF9mcmVlX2l1OwogCi0JaXUtPmRtYSA9IGRtYV9tYXBfc2luZ2xlKGhvc3QtPmRldi0+ZGV2LT5kbWFfZGV2aWNlLAotCQkJCSBpdS0+YnVmLCBzaXplLCBkaXJlY3Rpb24pOwotCWlmIChkbWFfbWFwcGluZ19lcnJvcihpdS0+ZG1hKSkKKwlpdS0+ZG1hID0gaWJfZG1hX21hcF9zaW5nbGUoaG9zdC0+ZGV2LT5kZXYsIGl1LT5idWYsIHNpemUsIGRpcmVjdGlvbik7CisJaWYgKGliX2RtYV9tYXBwaW5nX2Vycm9yKGhvc3QtPmRldi0+ZGV2LCBpdS0+ZG1hKSkKIAkJZ290byBvdXRfZnJlZV9idWY7CiAKIAlpdS0+c2l6ZSAgICAgID0gc2l6ZTsKQEAgLTE0NSw4ICsxNDQsNyBAQAogCWlmICghaXUpCiAJCXJldHVybjsKIAotCWRtYV91bm1hcF9zaW5nbGUoaG9zdC0+ZGV2LT5kZXYtPmRtYV9kZXZpY2UsCi0JCQkgaXUtPmRtYSwgaXUtPnNpemUsIGl1LT5kaXJlY3Rpb24pOworCWliX2RtYV91bm1hcF9zaW5nbGUoaG9zdC0+ZGV2LT5kZXYsIGl1LT5kbWEsIGl1LT5zaXplLCBpdS0+ZGlyZWN0aW9uKTsKIAlrZnJlZShpdS0+YnVmKTsKIAlrZnJlZShpdSk7CiB9CkBAIC0zOTAsOSArMzg4LDEwIEBACiAJd2FpdF9mb3JfY29tcGxldGlvbigmdGFyZ2V0LT5kb25lKTsKIH0KIAotc3RhdGljIHZvaWQgc3JwX3JlbW92ZV93b3JrKHZvaWQgKnRhcmdldF9wdHIpCitzdGF0aWMgdm9pZCBzcnBfcmVtb3ZlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCA9IHRhcmdldF9wdHI7CisJc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQsIHdvcmspOwogCiAJc3Bpbl9sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKIAlpZiAodGFyZ2V0LT5zdGF0ZSAhPSBTUlBfVEFSR0VUX0RFQUQpIHsKQEAgLTQ4MSw4ICs0ODAsOCBAQAogCQlzY2F0ICA9ICZyZXEtPmZha2Vfc2c7CiAJfQogCi0JZG1hX3VubWFwX3NnKHRhcmdldC0+c3JwX2hvc3QtPmRldi0+ZGV2LT5kbWFfZGV2aWNlLCBzY2F0LCBuZW50cywKLQkJICAgICBzY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCWliX2RtYV91bm1hcF9zZyh0YXJnZXQtPnNycF9ob3N0LT5kZXYtPmRldiwgc2NhdCwgbmVudHMsCisJCQlzY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOwogfQogCiBzdGF0aWMgdm9pZCBzcnBfcmVtb3ZlX3JlcShzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQsIHN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxKQpAQCAtNTc1LDcgKzU3NCw3IEBACiAJc3Bpbl9sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKIAlpZiAodGFyZ2V0LT5zdGF0ZSA9PSBTUlBfVEFSR0VUX0NPTk5FQ1RJTkcpIHsKIAkJdGFyZ2V0LT5zdGF0ZSA9IFNSUF9UQVJHRVRfREVBRDsKLQkJSU5JVF9XT1JLKCZ0YXJnZXQtPndvcmssIHNycF9yZW1vdmVfd29yaywgdGFyZ2V0KTsKKwkJSU5JVF9XT1JLKCZ0YXJnZXQtPndvcmssIHNycF9yZW1vdmVfd29yayk7CiAJCXNjaGVkdWxlX3dvcmsoJnRhcmdldC0+d29yayk7CiAJfQogCXNwaW5fdW5sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKQEAgLTU5NCwyMyArNTkzLDI2IEBACiAJaW50IGksIGo7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc3JwX2RldmljZSAqZGV2ID0gdGFyZ2V0LT5zcnBfaG9zdC0+ZGV2OworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ID0gZGV2LT5kZXY7CiAKIAlpZiAoIWRldi0+Zm1yX3Bvb2wpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKChzZ19kbWFfYWRkcmVzcygmc2NhdFswXSkgJiB+ZGV2LT5mbXJfcGFnZV9tYXNrKSAmJgorCWlmICgoaWJfc2dfZG1hX2FkZHJlc3MoaWJkZXYsICZzY2F0WzBdKSAmIH5kZXYtPmZtcl9wYWdlX21hc2spICYmCiAJICAgIG1lbGxhbm94X3dvcmthcm91bmRzICYmICFtZW1jbXAoJnRhcmdldC0+aW9jX2d1aWQsIG1lbGxhbm94X291aSwgMykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbGVuID0gcGFnZV9jbnQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBzZ19jbnQ7ICsraSkgewotCQlpZiAoc2dfZG1hX2FkZHJlc3MoJnNjYXRbaV0pICYgfmRldi0+Zm1yX3BhZ2VfbWFzaykgeworCQl1bnNpZ25lZCBpbnQgZG1hX2xlbiA9IGliX3NnX2RtYV9sZW4oaWJkZXYsICZzY2F0W2ldKTsKKworCQlpZiAoaWJfc2dfZG1hX2FkZHJlc3MoaWJkZXYsICZzY2F0W2ldKSAmIH5kZXYtPmZtcl9wYWdlX21hc2spIHsKIAkJCWlmIChpID4gMCkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWVsc2UKIAkJCQkrK3BhZ2VfY250OwogCQl9Ci0JCWlmICgoc2dfZG1hX2FkZHJlc3MoJnNjYXRbaV0pICsgc2dfZG1hX2xlbigmc2NhdFtpXSkpICYKKwkJaWYgKChpYl9zZ19kbWFfYWRkcmVzcyhpYmRldiwgJnNjYXRbaV0pICsgZG1hX2xlbikgJgogCQkgICAgfmRldi0+Zm1yX3BhZ2VfbWFzaykgewogCQkJaWYgKGkgPCBzZ19jbnQgLSAxKQogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtNjE4LDcgKzYyMCw3IEBACiAJCQkJKytwYWdlX2NudDsKIAkJfQogCi0JCWxlbiArPSBzZ19kbWFfbGVuKCZzY2F0W2ldKTsKKwkJbGVuICs9IGRtYV9sZW47CiAJfQogCiAJcGFnZV9jbnQgKz0gbGVuID4+IGRldi0+Zm1yX3BhZ2Vfc2hpZnQ7CkBAIC02MzAsMTAgKzYzMiwxNCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBhZ2VfY250ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgc2dfY250OyArK2kpCi0JCWZvciAoaiA9IDA7IGogPCBzZ19kbWFfbGVuKCZzY2F0W2ldKTsgaiArPSBkZXYtPmZtcl9wYWdlX3NpemUpCisJZm9yIChpID0gMDsgaSA8IHNnX2NudDsgKytpKSB7CisJCXVuc2lnbmVkIGludCBkbWFfbGVuID0gaWJfc2dfZG1hX2xlbihpYmRldiwgJnNjYXRbaV0pOworCisJCWZvciAoaiA9IDA7IGogPCBkbWFfbGVuOyBqICs9IGRldi0+Zm1yX3BhZ2Vfc2l6ZSkKIAkJCWRtYV9wYWdlc1twYWdlX2NudCsrXSA9Ci0JCQkJKHNnX2RtYV9hZGRyZXNzKCZzY2F0W2ldKSAmIGRldi0+Zm1yX3BhZ2VfbWFzaykgKyBqOworCQkJCShpYl9zZ19kbWFfYWRkcmVzcyhpYmRldiwgJnNjYXRbaV0pICYKKwkJCQkgZGV2LT5mbXJfcGFnZV9tYXNrKSArIGo7CisJfQogCiAJcmVxLT5mbXIgPSBpYl9mbXJfcG9vbF9tYXBfcGh5cyhkZXYtPmZtcl9wb29sLAogCQkJCQlkbWFfcGFnZXMsIHBhZ2VfY250LCBpb19hZGRyKTsKQEAgLTY0Myw3ICs2NDksOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlidWYtPnZhICA9IGNwdV90b19iZTY0KHNnX2RtYV9hZGRyZXNzKCZzY2F0WzBdKSAmIH5kZXYtPmZtcl9wYWdlX21hc2spOworCWJ1Zi0+dmEgID0gY3B1X3RvX2JlNjQoaWJfc2dfZG1hX2FkZHJlc3MoaWJkZXYsICZzY2F0WzBdKSAmCisJCQkgICAgICAgfmRldi0+Zm1yX3BhZ2VfbWFzayk7CiAJYnVmLT5rZXkgPSBjcHVfdG9fYmUzMihyZXEtPmZtci0+Zm1yLT5ya2V5KTsKIAlidWYtPmxlbiA9IGNwdV90b19iZTMyKGxlbik7CiAKQEAgLTY2Miw2ICs2NjksOCBAQAogCXN0cnVjdCBzcnBfY21kICpjbWQgPSByZXEtPmNtZC0+YnVmOwogCWludCBsZW4sIG5lbnRzLCBjb3VudDsKIAl1OCBmbXQgPSBTUlBfREFUQV9ERVNDX0RJUkVDVDsKKwlzdHJ1Y3Qgc3JwX2RldmljZSAqZGV2OworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OwogCiAJaWYgKCFzY21uZC0+cmVxdWVzdF9idWZmZXIgfHwgc2NtbmQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKQogCQlyZXR1cm4gc2l6ZW9mIChzdHJ1Y3Qgc3JwX2NtZCk7CkBAIC02ODYsOCArNjk1LDEwIEBACiAJCXNnX2luaXRfb25lKHNjYXQsIHNjbW5kLT5yZXF1ZXN0X2J1ZmZlciwgc2NtbmQtPnJlcXVlc3RfYnVmZmxlbik7CiAJfQogCi0JY291bnQgPSBkbWFfbWFwX3NnKHRhcmdldC0+c3JwX2hvc3QtPmRldi0+ZGV2LT5kbWFfZGV2aWNlLAotCQkJICAgc2NhdCwgbmVudHMsIHNjbW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJZGV2ID0gdGFyZ2V0LT5zcnBfaG9zdC0+ZGV2OworCWliZGV2ID0gZGV2LT5kZXY7CisKKwljb3VudCA9IGliX2RtYV9tYXBfc2coaWJkZXYsIHNjYXQsIG5lbnRzLCBzY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pOwogCiAJZm10ID0gU1JQX0RBVEFfREVTQ19ESVJFQ1Q7CiAJbGVuID0gc2l6ZW9mIChzdHJ1Y3Qgc3JwX2NtZCkgKwlzaXplb2YgKHN0cnVjdCBzcnBfZGlyZWN0X2J1Zik7CkBAIC03MDEsOSArNzEyLDkgQEAKIAkJICovCiAJCXN0cnVjdCBzcnBfZGlyZWN0X2J1ZiAqYnVmID0gKHZvaWQgKikgY21kLT5hZGRfZGF0YTsKIAotCQlidWYtPnZhICA9IGNwdV90b19iZTY0KHNnX2RtYV9hZGRyZXNzKHNjYXQpKTsKLQkJYnVmLT5rZXkgPSBjcHVfdG9fYmUzMih0YXJnZXQtPnNycF9ob3N0LT5kZXYtPm1yLT5ya2V5KTsKLQkJYnVmLT5sZW4gPSBjcHVfdG9fYmUzMihzZ19kbWFfbGVuKHNjYXQpKTsKKwkJYnVmLT52YSAgPSBjcHVfdG9fYmU2NChpYl9zZ19kbWFfYWRkcmVzcyhpYmRldiwgc2NhdCkpOworCQlidWYtPmtleSA9IGNwdV90b19iZTMyKGRldi0+bXItPnJrZXkpOworCQlidWYtPmxlbiA9IGNwdV90b19iZTMyKGliX3NnX2RtYV9sZW4oaWJkZXYsIHNjYXQpKTsKIAl9IGVsc2UgaWYgKHNycF9tYXBfZm1yKHRhcmdldCwgc2NhdCwgY291bnQsIHJlcSwKIAkJCSAgICAgICAodm9pZCAqKSBjbWQtPmFkZF9kYXRhKSkgewogCQkvKgpAQCAtNzIxLDEzICs3MzIsMTQgQEAKIAkJCWNvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc3JwX2RpcmVjdF9idWYpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQl1bnNpZ25lZCBpbnQgZG1hX2xlbiA9IGliX3NnX2RtYV9sZW4oaWJkZXYsICZzY2F0W2ldKTsKKwogCQkJYnVmLT5kZXNjX2xpc3RbaV0udmEgID0KLQkJCQljcHVfdG9fYmU2NChzZ19kbWFfYWRkcmVzcygmc2NhdFtpXSkpOworCQkJCWNwdV90b19iZTY0KGliX3NnX2RtYV9hZGRyZXNzKGliZGV2LCAmc2NhdFtpXSkpOwogCQkJYnVmLT5kZXNjX2xpc3RbaV0ua2V5ID0KLQkJCQljcHVfdG9fYmUzMih0YXJnZXQtPnNycF9ob3N0LT5kZXYtPm1yLT5ya2V5KTsKLQkJCWJ1Zi0+ZGVzY19saXN0W2ldLmxlbiA9Ci0JCQkJY3B1X3RvX2JlMzIoc2dfZG1hX2xlbigmc2NhdFtpXSkpOwotCQkJZGF0YWxlbiArPSBzZ19kbWFfbGVuKCZzY2F0W2ldKTsKKwkJCQljcHVfdG9fYmUzMihkZXYtPm1yLT5ya2V5KTsKKwkJCWJ1Zi0+ZGVzY19saXN0W2ldLmxlbiA9IGNwdV90b19iZTMyKGRtYV9sZW4pOworCQkJZGF0YWxlbiArPSBkbWFfbGVuOwogCQl9CiAKIAkJaWYgKHNjbW5kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQpAQCAtODA3LDEzICs4MTksMTUgQEAKIAogc3RhdGljIHZvaWQgc3JwX2hhbmRsZV9yZWN2KHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwgc3RydWN0IGliX3djICp3YykKIHsKKwlzdHJ1Y3QgaWJfZGV2aWNlICpkZXY7CiAJc3RydWN0IHNycF9pdSAqaXU7CiAJdTggb3Bjb2RlOwogCiAJaXUgPSB0YXJnZXQtPnJ4X3Jpbmdbd2MtPndyX2lkICYgflNSUF9PUF9SRUNWXTsKIAotCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRhcmdldC0+c3JwX2hvc3QtPmRldi0+ZGV2LT5kbWFfZGV2aWNlLCBpdS0+ZG1hLAotCQkJCXRhcmdldC0+bWF4X3RpX2l1X2xlbiwgRE1BX0ZST01fREVWSUNFKTsKKwlkZXYgPSB0YXJnZXQtPnNycF9ob3N0LT5kZXYtPmRldjsKKwlpYl9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGl1LT5kbWEsIHRhcmdldC0+bWF4X3RpX2l1X2xlbiwKKwkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwogCiAJb3Bjb2RlID0gKih1OCAqKSBpdS0+YnVmOwogCkBAIC04NDksOCArODYzLDggQEAKIAkJYnJlYWs7CiAJfQogCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodGFyZ2V0LT5zcnBfaG9zdC0+ZGV2LT5kZXYtPmRtYV9kZXZpY2UsIGl1LT5kbWEsCi0JCQkJICAgdGFyZ2V0LT5tYXhfdGlfaXVfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgaXUtPmRtYSwgdGFyZ2V0LT5tYXhfdGlfaXVfbGVuLAorCQkJCSAgICAgIERNQV9GUk9NX0RFVklDRSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNycF9jb21wbGV0aW9uKHN0cnVjdCBpYl9jcSAqY3EsIHZvaWQgKnRhcmdldF9wdHIpCkBAIC05NjgsNiArOTgyLDcgQEAKIAlzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3Qgc3JwX2l1ICppdTsKIAlzdHJ1Y3Qgc3JwX2NtZCAqY21kOworCXN0cnVjdCBpYl9kZXZpY2UgKmRldjsKIAlpbnQgbGVuOwogCiAJaWYgKHRhcmdldC0+c3RhdGUgPT0gU1JQX1RBUkdFVF9DT05ORUNUSU5HKQpAQCAtOTg0LDggKzk5OSw5IEBACiAJaWYgKCFpdSkKIAkJZ290byBlcnI7CiAKLQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdSh0YXJnZXQtPnNycF9ob3N0LT5kZXYtPmRldi0+ZG1hX2RldmljZSwgaXUtPmRtYSwKLQkJCQlzcnBfbWF4X2l1X2xlbiwgRE1BX1RPX0RFVklDRSk7CisJZGV2ID0gdGFyZ2V0LT5zcnBfaG9zdC0+ZGV2LT5kZXY7CisJaWJfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBpdS0+ZG1hLCBzcnBfbWF4X2l1X2xlbiwKKwkJCQkgICBETUFfVE9fREVWSUNFKTsKIAogCXJlcSA9IGxpc3RfZW50cnkodGFyZ2V0LT5mcmVlX3JlcXMubmV4dCwgc3RydWN0IHNycF9yZXF1ZXN0LCBsaXN0KTsKIApAQCAtMTAxNyw4ICsxMDMzLDggQEAKIAkJZ290byBlcnJfdW5tYXA7CiAJfQogCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodGFyZ2V0LT5zcnBfaG9zdC0+ZGV2LT5kZXYtPmRtYV9kZXZpY2UsIGl1LT5kbWEsCi0JCQkJICAgc3JwX21heF9pdV9sZW4sIERNQV9UT19ERVZJQ0UpOworCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgaXUtPmRtYSwgc3JwX21heF9pdV9sZW4sCisJCQkJICAgICAgRE1BX1RPX0RFVklDRSk7CiAKIAlpZiAoX19zcnBfcG9zdF9zZW5kKHRhcmdldCwgaXUsIGxlbikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU2VuZCBmYWlsZWRcbiIpOwpAQCAtMTE3Niw5ICsxMTkyLDExIEBACiAJCQlicmVhazsKIAkJfQogCi0JCXRhcmdldC0+c3RhdHVzID0gc3JwX2FsbG9jX2l1X2J1ZnModGFyZ2V0KTsKLQkJaWYgKHRhcmdldC0+c3RhdHVzKQotCQkJYnJlYWs7CisJCWlmICghdGFyZ2V0LT5yeF9yaW5nWzBdKSB7CisJCQl0YXJnZXQtPnN0YXR1cyA9IHNycF9hbGxvY19pdV9idWZzKHRhcmdldCk7CisJCQlpZiAodGFyZ2V0LT5zdGF0dXMpCisJCQkJYnJlYWs7CisJCX0KIAogCQlxcF9hdHRyID0ga21hbGxvYyhzaXplb2YgKnFwX2F0dHIsIEdGUF9LRVJORUwpOwogCQlpZiAoIXFwX2F0dHIpIHsKQEAgLTE3MTYsNyArMTczNCw4IEBACiAJaWYgKCF0YXJnZXRfaG9zdCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQl0YXJnZXRfaG9zdC0+bWF4X2x1biA9IFNSUF9NQVhfTFVOOworCXRhcmdldF9ob3N0LT5tYXhfbHVuICAgICA9IFNSUF9NQVhfTFVOOworCXRhcmdldF9ob3N0LT5tYXhfY21kX2xlbiA9IHNpemVvZiAoKHN0cnVjdCBzcnBfY21kICopICh2b2lkICopIDBMKS0+Y2RiOwogCiAJdGFyZ2V0ID0gaG9zdF90b190YXJnZXQodGFyZ2V0X2hvc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5oCmluZGV4IGQ0ZTM1ZWYuLjg2OGE1NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5oCkBAIC0xNjEsNyArMTYxLDcgQEAKIH07CiAKIHN0cnVjdCBzcnBfaXUgewotCWRtYV9hZGRyX3QJCWRtYTsKKwl1NjQJCQlkbWE7CiAJdm9pZAkJICAgICAgICpidWY7CiAJc2l6ZV90CQkJc2l6ZTsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbglkaXJlY3Rpb247CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9NYWtlZmlsZQppbmRleCBhMDA1YjFkLi5kYTU3NWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvTWFrZWZpbGUKQEAgLTIxLDMgKzIxLDQgQEAKIG9iai0kKENPTkZJR19JTlBVVF9KT1lTVElDSykJKz0gam95c3RpY2svCiBvYmotJChDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4pCSs9IHRvdWNoc2NyZWVuLwogb2JqLSQoQ09ORklHX0lOUFVUX01JU0MpCSs9IG1pc2MvCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZmYtY29yZS5jIGIvZHJpdmVycy9pbnB1dC9mZi1jb3JlLmMKaW5kZXggMzU2NTZjYS4uNzgzYjM0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9mZi1jb3JlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9mZi1jb3JlLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogfQogCiAvKioKLSAqIGlucHV0X2ZmX2VyYXNlIC0gZXJhc2UgYW4gZWZmZWN0IGZyb20gZGV2aWNlCisgKiBpbnB1dF9mZl9lcmFzZSAtIGVyYXNlIGEgZm9yY2UtZmVlZGJhY2sgZWZmZWN0IGZyb20gZGV2aWNlCiAgKiBAZGV2OiBpbnB1dCBkZXZpY2UgdG8gZXJhc2UgZWZmZWN0IGZyb20KICAqIEBlZmZlY3RfaWQ6IGlkIG9mIHRoZSBmZmVjdCB0byBiZSBlcmFzZWQKICAqIEBmaWxlOiBwdXJwb3J0ZWQgb3duZXIgb2YgdGhlIHJlcXVlc3QKQEAgLTM0Nyw3ICszNDcsNyBAQAogCiAvKioKICAqIGlucHV0X2ZmX2ZyZWUoKSAtIGZyZWVzIGZvcmNlIGZlZWRiYWNrIHBvcnRpb24gb2YgaW5wdXQgZGV2aWNlCi0gKiBAZGV2OiBpbnB1dCBkZXZpY2Ugc3VwcG9yaW50ZyBmb3JjZSBmZWVkYmFjaworICogQGRldjogaW5wdXQgZGV2aWNlIHN1cHBvcnRpbmcgZm9yY2UgZmVlZGJhY2sKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIGluIGVycm9yIHBhdGggYXMgaW5wdXQgY29yZSB3aWxsCiAgKiBhdXRvbWF0aWNhbGx5IGZyZWUgZm9yY2UgZmVlZGJhY2sgc3RydWN0dXJlcyB3aGVuIGRldmljZSBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9mZi1tZW1sZXNzLmMgYi9kcml2ZXJzL2lucHV0L2ZmLW1lbWxlc3MuYwppbmRleCBjZDhiNzI5Li5lYmExOGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2ZmLW1lbWxlc3MuYworKysgYi9kcml2ZXJzL2lucHV0L2ZmLW1lbWxlc3MuYwpAQCAtNDYwLDcgKzQ2MCw3IEBACiB9CiAKIC8qKgotICogaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoKSAtIGNyZWF0ZSBtZW1vcnlsZXNzIEZGIGRldmljZQorICogaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoKSAtIGNyZWF0ZSBtZW1vcnlsZXNzIGZvcmNlLWZlZWRiYWNrIGRldmljZQogICogQGRldjogaW5wdXQgZGV2aWNlIHN1cHBvcnRpbmcgZm9yY2UtZmVlZGJhY2sKICAqIEBkYXRhOiBkcml2ZXItc3BlY2lmaWMgZGF0YSB0byBiZSBwYXNzZWQgaW50byBAcGxheV9lZmZlY3QKICAqIEBwbGF5X2VmZmVjdDogZHJpdmVyLXNwZWNpZmljIG1ldGhvZCBmb3IgcGxheWluZyBGRiBlZmZlY3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZm04MDEtZ3AuYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZm04MDEtZ3AuYwppbmRleCA5MGRlNWFmLi4xZGVjMDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2ZtODAxLWdwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9mbTgwMS1ncC5jCkBAIC04MiwxNyArODIsMTkgQEAKIHsKIAlzdHJ1Y3QgZm04MDFfZ3AgKmdwOwogCXN0cnVjdCBnYW1lcG9ydCAqcG9ydDsKKwlpbnQgZXJyb3I7CiAKIAlncCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmbTgwMV9ncCksIEdGUF9LRVJORUwpOwogCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CiAJaWYgKCFncCB8fCAhcG9ydCkgewogCQlwcmludGsoS0VSTl9FUlIgImZtODAxLWdwOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQlrZnJlZShncCk7Ci0JCWdhbWVwb3J0X2ZyZWVfcG9ydChwb3J0KTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CiAJfQogCi0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwllcnJvciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKIAogCXBvcnQtPm9wZW4gPSBmbTgwMV9ncF9vcGVuOwogI2lmZGVmIEhBVkVfQ09PS0VECkBAIC0xMDgsOSArMTEwLDggQEAKIAlpZiAoIWdwLT5yZXNfcG9ydCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiZm04MDEtZ3A6IHVuYWJsZSB0byBncmFiIHJlZ2lvbiAweCV4LTB4JXhcbiIsCiAJCQlwb3J0LT5pbywgcG9ydC0+aW8gKyAweDBmKTsKLQkJZ2FtZXBvcnRfZnJlZV9wb3J0KHBvcnQpOwotCQlrZnJlZShncCk7Ci0JCXJldHVybiAtRUJVU1k7CisJCWVycm9yID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9kZXY7CiAJfQogCiAJcGNpX3NldF9kcnZkYXRhKHBjaSwgZ3ApOwpAQCAtMTE5LDYgKzEyMCwxMyBAQAogCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQocG9ydCk7CiAKIAlyZXR1cm4gMDsKKworIGVycl9vdXRfZGlzYWJsZV9kZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CisgZXJyX291dF9mcmVlOgorCWdhbWVwb3J0X2ZyZWVfcG9ydChwb3J0KTsKKwlrZnJlZShncCk7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgZm04MDFfZ3BfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKaW5kZXggM2Y0N2FlNS4uYTAwZmU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBIWiAqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAvKiNpbmNsdWRlIDxhc20vaW8uaD4qLwogCkBAIC0xOTEsNiArMTkyLDggQEAKIAogc3RhdGljIHZvaWQgZ2FtZXBvcnRfYmluZF9kcml2ZXIoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgc3RydWN0IGdhbWVwb3J0X2RyaXZlciAqZHJ2KQogeworCWludCBlcnJvcjsKKwogCWRvd25fd3JpdGUoJmdhbWVwb3J0X2J1cy5zdWJzeXMucndzZW0pOwogCiAJZ2FtZXBvcnQtPmRldi5kcml2ZXIgPSAmZHJ2LT5kcml2ZXI7CkBAIC0xOTgsOCArMjAxLDIwIEBACiAJCWdhbWVwb3J0LT5kZXYuZHJpdmVyID0gTlVMTDsKIAkJZ290byBvdXQ7CiAJfQotCWRldmljZV9iaW5kX2RyaXZlcigmZ2FtZXBvcnQtPmRldik7Ci1vdXQ6CisKKwllcnJvciA9IGRldmljZV9iaW5kX2RyaXZlcigmZ2FtZXBvcnQtPmRldik7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJnYW1lcG9ydDogZGV2aWNlX2JpbmRfZHJpdmVyKCkgZmFpbGVkICIKKwkJCSJmb3IgJXMgKCVzKSBhbmQgJXMsIGVycm9yOiAlZFxuIiwKKwkJCWdhbWVwb3J0LT5waHlzLCBnYW1lcG9ydC0+bmFtZSwKKwkJCWRydi0+ZGVzY3JpcHRpb24sIGVycm9yKTsKKwkJZHJ2LT5kaXNjb25uZWN0KGdhbWVwb3J0KTsKKwkJZ2FtZXBvcnQtPmRldi5kcml2ZXIgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKyBvdXQ6CiAJdXBfd3JpdGUoJmdhbWVwb3J0X2J1cy5zdWJzeXMucndzZW0pOwogfQogCkBAIC03MTYsMTIgKzczMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgZ2FtZXBvcnRfYnVzID0gewotCS5uYW1lCT0gImdhbWVwb3J0IiwKLQkucHJvYmUJPSBnYW1lcG9ydF9kcml2ZXJfcHJvYmUsCi0JLnJlbW92ZQk9IGdhbWVwb3J0X2RyaXZlcl9yZW1vdmUsCi19OwotCiBzdGF0aWMgdm9pZCBnYW1lcG9ydF9hZGRfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydikKIHsKIAlpbnQgZXJyb3I7CkBAIC03NjcsNiArNzc2LDE1IEBACiAJcmV0dXJuICFnYW1lcG9ydF9kcnYtPmlnbm9yZTsKIH0KIAorc3RhdGljIHN0cnVjdCBidXNfdHlwZSBnYW1lcG9ydF9idXMgPSB7CisJLm5hbWUJCT0gImdhbWVwb3J0IiwKKwkuZGV2X2F0dHJzCT0gZ2FtZXBvcnRfZGV2aWNlX2F0dHJzLAorCS5kcnZfYXR0cnMJPSBnYW1lcG9ydF9kcml2ZXJfYXR0cnMsCisJLm1hdGNoCQk9IGdhbWVwb3J0X2J1c19tYXRjaCwKKwkucHJvYmUJCT0gZ2FtZXBvcnRfZHJpdmVyX3Byb2JlLAorCS5yZW1vdmUJCT0gZ2FtZXBvcnRfZHJpdmVyX3JlbW92ZSwKK307CisKIHN0YXRpYyB2b2lkIGdhbWVwb3J0X3NldF9kcnYoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgc3RydWN0IGdhbWVwb3J0X2RyaXZlciAqZHJ2KQogewogCW11dGV4X2xvY2soJmdhbWVwb3J0LT5kcnZfbXV0ZXgpOwpAQCAtNzc2LDcgKzc5NCw2IEBACiAKIGludCBnYW1lcG9ydF9vcGVuKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydiwgaW50IG1vZGUpCiB7Ci0KIAlpZiAoZ2FtZXBvcnQtPm9wZW4pIHsKIAkJaWYgKGdhbWVwb3J0LT5vcGVuKGdhbWVwb3J0LCBtb2RlKSkgewogCQkJcmV0dXJuIC0xOwpAQCAtODA0LDkgKzgyMSw2IEBACiB7CiAJaW50IGVycm9yOwogCi0JZ2FtZXBvcnRfYnVzLmRldl9hdHRycyA9IGdhbWVwb3J0X2RldmljZV9hdHRyczsKLQlnYW1lcG9ydF9idXMuZHJ2X2F0dHJzID0gZ2FtZXBvcnRfZHJpdmVyX2F0dHJzOwotCWdhbWVwb3J0X2J1cy5tYXRjaCA9IGdhbWVwb3J0X2J1c19tYXRjaDsKIAllcnJvciA9IGJ1c19yZWdpc3RlcigmZ2FtZXBvcnRfYnVzKTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJnYW1lcG9ydDogZmFpbGVkIHRvIHJlZ2lzdGVyIGdhbWVwb3J0IGJ1cywgZXJyb3I6ICVkXG4iLCBlcnJvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2xpZ2h0bmluZy5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9saWdodG5pbmcuYwppbmRleCBkNjVkODEwLi42YjRkNDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2xpZ2h0bmluZy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbGlnaHRuaW5nLmMKQEAgLTMwOSw3ICszMDksNyBAQAogCWludCBpLCBjYXJkcyA9IDA7CiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKEw0X1BPUlQsIDEsICJsaWdodG5pbmciKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVCVVNZOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKIAkJaWYgKGw0X2FkZF9jYXJkKGkpID09IDApCkBAIC0zMTksNyArMzE5LDcgQEAKIAogCWlmICghY2FyZHMpIHsKIAkJcmVsZWFzZV9yZWdpb24oTDRfUE9SVCwgMSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKaW5kZXggMWM4YzhhNS4uN2NmMmI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwpAQCAtMzcsNyArMzcsNyBAQAogCiAvKioKICAqIGlucHV0X2V2ZW50KCkgLSByZXBvcnQgbmV3IGlucHV0IGV2ZW50Ci0gKiBAaGFuZGxlOiBkZXZpY2UgdGhhdCBnZW5lcmF0ZWQgdGhlIGV2ZW50CisgKiBAZGV2OiBkZXZpY2UgdGhhdCBnZW5lcmF0ZWQgdGhlIGV2ZW50CiAgKiBAdHlwZTogdHlwZSBvZiB0aGUgZXZlbnQKICAqIEBjb2RlOiBldmVudCBjb2RlCiAgKiBAdmFsdWU6IHZhbHVlIG9mIHRoZSBldmVudApAQCAtOTAwLDYgKzkwMCwxNSBAQAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlucHV0X2NsYXNzKTsKIAorLyoqCisgKiBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBpbnB1dCBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIHByZXBhcmVkIHN0cnVjdCBpbnB1dF9kZXYgb3IgTlVMTC4KKyAqCisgKiBOT1RFOiBVc2UgaW5wdXRfZnJlZV9kZXZpY2UoKSB0byBmcmVlIGRldmljZXMgdGhhdCBoYXZlIG5vdCBiZWVuCisgKiByZWdpc3RlcmVkOyBpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgpIHNob3VsZCBiZSB1c2VkIGZvciBhbHJlYWR5CisgKiByZWdpc3RlcmVkIGRldmljZXMuCisgKi8KIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2FsbG9jYXRlX2RldmljZSh2b2lkKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKQEAgLTkxOSw2ICs5MjgsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0woaW5wdXRfYWxsb2NhdGVfZGV2aWNlKTsKIAorLyoqCisgKiBpbnB1dF9mcmVlX2RldmljZSAtIGZyZWUgbWVtb3J5IG9jY3VwaWVkIGJ5IGlucHV0X2RldiBzdHJ1Y3R1cmUKKyAqIEBkZXY6IGlucHV0IGRldmljZSB0byBmcmVlCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGlmIGlucHV0X3JlZ2lzdGVyX2RldmljZSgpCisgKiB3YXMgbm90IGNhbGxlZCB5ZXQgb3IgaWYgaXQgZmFpbGVkLiBPbmNlIGRldmljZSB3YXMgcmVnaXN0ZXJlZAorICogdXNlIGlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCkgYW5kIG1lbW9yeSB3aWxsIGJlIGZyZWVkIG9uY2UgbGFzdAorICogcmVmcmVuY2UgdG8gdGhlIGRldmljZSBpcyBkcm9wcGVkLgorICoKKyAqIERldmljZSBzaG91bGQgYmUgYWxsb2NhdGVkIGJ5IGlucHV0X2FsbG9jYXRlX2RldmljZSgpLgorICoKKyAqIE5PVEU6IElmIHRoZXJlIGFyZSByZWZlcmVuY2VzIHRvIHRoZSBpbnB1dCBkZXZpY2UgdGhlbiBtZW1vcnkKKyAqIHdpbGwgbm90IGJlIGZyZWVkIHVudGlsIGxhc3QgcmVmZXJlbmNlIGlzIGRyb3BwZWQuCisgKi8KIHZvaWQgaW5wdXRfZnJlZV9kZXZpY2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewogCWlmIChkZXYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYWRpLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FkaS5jCmluZGV4IDcwNGJmNzAuLjYyNzljZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYWRpLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hZGkuYwpAQCAtNTIxLDExICs1MjEsMTkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQogCQlpZiAocG9ydC0+YWRpW2ldLmxlbmd0aCA+IDApIHsKIAkJCWFkaV9pbml0X2NlbnRlcihwb3J0LT5hZGkgKyBpKTsKLQkJCWlucHV0X3JlZ2lzdGVyX2RldmljZShwb3J0LT5hZGlbaV0uZGV2KTsKKwkJCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShwb3J0LT5hZGlbaV0uZGV2KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmYWlsMzsKIAkJfQogCiAJcmV0dXJuIDA7CiAKKyBmYWlsMzogd2hpbGUgKC0taSA+PSAwKSB7CisJCWlmIChwb3J0LT5hZGlbaV0ubGVuZ3RoID4gMCkgeworCQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocG9ydC0+YWRpW2ldLmRldik7CisJCQlwb3J0LT5hZGlbaV0uZGV2ID0gTlVMTDsKKwkJfQorCX0KICBmYWlsMjoJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKIAkJaWYgKHBvcnQtPmFkaVtpXS5kZXYpCiAJCQlpbnB1dF9mcmVlX2RldmljZShwb3J0LT5hZGlbaV0uZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FtaWpveS5jCmluZGV4IDY1MGFjZjMuLmU2MDg2OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYwpAQCAtMTQ3LDcgKzE0NywxMSBAQAogCQkJYW1pam95X2RldltpXS0+YWJzbWF4W0FCU19YICsgal0gPSAxOwogCQl9CiAKLQkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGFtaWpveV9kZXZbaV0pOworCQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYW1pam95X2RldltpXSk7CisJCWlmIChlcnIpIHsKKwkJCWlucHV0X2ZyZWVfZGV2aWNlKGFtaWpveV9kZXZbaV0pOworCQkJZ290byBmYWlsOworCQl9CiAJfQogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYwppbmRleCBlOWEwMmRiLi43ZWY2ODQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKQEAgLTQzNCw2ICs0MzQsNyBAQAogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgaSwgaiwgdCwgdiwgdywgeCwgeSwgejsKKwlpbnQgZXJyb3I7CiAKIAlhbmFsb2dfbmFtZShhbmFsb2cpOwogCXNucHJpbnRmKGFuYWxvZy0+cGh5cywgc2l6ZW9mKGFuYWxvZy0+cGh5cyksCkBAIC01MDUsNyArNTA2LDExIEBACiAKIAlhbmFsb2dfZGVjb2RlKGFuYWxvZywgcG9ydC0+YXhlcywgcG9ydC0+aW5pdGlhbCwgcG9ydC0+YnV0dG9ucyk7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYW5hbG9nLT5kZXYpOworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGFuYWxvZy0+ZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoYW5hbG9nLT5kZXYpOworCQlyZXR1cm4gZXJyb3I7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC02NjgsNyArNjczLDggQEAKIAlyZXR1cm4gMDsKIAogIGZhaWwzOiB3aGlsZSAoLS1pID49IDApCi0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBvcnQtPmFuYWxvZ1tpXS5kZXYpOworCQlpZiAocG9ydC0+YW5hbG9nW2ldLm1hc2spCisJCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwb3J0LT5hbmFsb2dbaV0uZGV2KTsKICBmYWlsMjoJZ2FtZXBvcnRfY2xvc2UoZ2FtZXBvcnQpOwogIGZhaWwxOglnYW1lcG9ydF9zZXRfZHJ2ZGF0YShnYW1lcG9ydCwgTlVMTCk7CiAJa2ZyZWUocG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2NvYnJhLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2NvYnJhLmMKaW5kZXggZDVlNDJlYi4uMDM0ZWMzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9jb2JyYS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svY29icmEuYwpAQCAtMjIzLDEyICsyMjMsMTUgQEAKIAkJZm9yIChqID0gMDsgY29icmFfYnRuW2pdOyBqKyspCiAJCQlzZXRfYml0KGNvYnJhX2J0bltqXSwgaW5wdXRfZGV2LT5rZXliaXQpOwogCi0JCWlucHV0X3JlZ2lzdGVyX2RldmljZShjb2JyYS0+ZGV2W2ldKTsKKwkJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNvYnJhLT5kZXZbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsNDsKIAl9CiAKIAlyZXR1cm4gMDsKIAotIGZhaWwzOglmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorIGZhaWw0OglpbnB1dF9mcmVlX2RldmljZShjb2JyYS0+ZGV2W2ldKTsKKyBmYWlsMzoJd2hpbGUgKC0taSA+PSAwKQogCQlpZiAoY29icmEtPmRldltpXSkKIAkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGNvYnJhLT5kZXZbaV0pOwogIGZhaWwyOglnYW1lcG9ydF9jbG9zZShnYW1lcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dmMmsuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jCmluZGV4IGU0YTY5OWYuLmJhY2JhYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2Yyay5jCkBAIC0zNDEsNyArMzQxLDkgQEAKIAkJaW5wdXRfZGV2LT5hYnNmbGF0W2dmMmtfYWJzW2ldXSA9IChpIDwgMikgPyAyNCA6IDA7CiAJfQogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGdmMmstPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGdmMmstPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMjsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCmluZGV4IDYyNDM4OTQuLjgxMjBhOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCkBAIC00MjMsNyArNDIzLDEwIEBACiAKIAkJaWYgKCFwb3J0LT5yZWdpc3RlcmVkKSB7CiAJCQlkYmcoIk5ldyBHcmlwIHBhZCBpbiBtdWx0aXBvcnQgc2xvdCAlZC5cbiIsIHNsb3QpOwotCQkJcmVnaXN0ZXJfc2xvdChzbG90LCBncmlwKTsKKwkJCWlmIChyZWdpc3Rlcl9zbG90KHNsb3QsIGdyaXApKSB7CisJCQkJcG9ydC0+bW9kZSA9IEdSSVBfTU9ERV9SRVNFVDsKKwkJCQlwb3J0LT5kaXJ0eSA9IDA7CisJCQl9CiAJCX0KIAkJcmV0dXJuIGZsYWdzOwogCX0KQEAgLTU4NSw2ICs1ODgsNyBAQAogCXN0cnVjdCBncmlwX3BvcnQgKnBvcnQgPSBncmlwLT5wb3J0W3Nsb3RdOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgaiwgdDsKKwlpbnQgZXJyOwogCiAJcG9ydC0+ZGV2ID0gaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpbnB1dF9kZXYpCkBAIC02MTAsNyArNjE0LDEyIEBACiAJCWlmICh0ID4gMCkKIAkJCXNldF9iaXQodCwgaW5wdXRfZGV2LT5rZXliaXQpOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQtPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQtPmRldik7CisJaWYgKGVycikgeworCQlpbnB1dF9mcmVlX2RldmljZShwb3J0LT5kZXYpOworCQlyZXR1cm4gZXJyOworCX0KKwogCXBvcnQtPnJlZ2lzdGVyZWQgPSAxOwogCiAJaWYgKHBvcnQtPmRpcnR5KQkgICAgICAgICAgICAvKiByZXBvcnQgaW5pdGlhbCBzdGF0ZSwgaWYgYW55ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2d1aWxsZW1vdC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9ndWlsbGVtb3QuYwppbmRleCA4NDBlZDliLi5kYmM1ZDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2d1aWxsZW1vdC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3VpbGxlbW90LmMKQEAgLTI1MCw3ICsyNTAsOSBAQAogCWZvciAoaSA9IDA7ICh0ID0gZ3VpbGxlbW90LT50eXBlLT5idG5baV0pID49IDA7IGkrKykKIAkJc2V0X2JpdCh0LCBpbnB1dF9kZXYtPmtleWJpdCk7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZ3VpbGxlbW90LT5kZXYpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShndWlsbGVtb3QtPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMjsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLW1haW4uYwppbmRleCAyNGM2ODRiLi4zMzkzYTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1tYWluLmMKQEAgLTMyNSw4ICszMjUsOCBAQAogCiAJaWYgKGkgPT0gMjApIHsgLyogNSBzZWNvbmRzICovCiAJCXByaW50ayhLRVJOX0VSUiAiaWZvcmNlLW1haW4uYzogVGltZW91dCB3YWl0aW5nIGZvciByZXNwb25zZSBmcm9tIGRldmljZS5cbiIpOwotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGZhaWw7CiAJfQogCiAvKgpAQCAtNDM5LDEwICs0MzksOCBAQAogCQkJc2V0X2JpdChpZm9yY2UtPnR5cGUtPmZmW2ldLCBpbnB1dF9kZXYtPmZmYml0KTsKIAogCQllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZShpbnB1dF9kZXYsIGZmX2VmZmVjdHMpOwotCQlpZiAoZXJyb3IpIHsKLQkJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KKwkJaWYgKGVycm9yKQorCQkJZ290byBmYWlsOwogCiAJCWZmID0gaW5wdXRfZGV2LT5mZjsKIAkJZmYtPnVwbG9hZCA9IGlmb3JjZV91cGxvYWRfZWZmZWN0OwpAQCAtNDU1LDIyICs0NTMsMzUgQEAKICAqIFJlZ2lzdGVyIGlucHV0IGRldmljZS4KICAqLwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlmb3JjZS0+ZGV2KTsKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpZm9yY2UtPmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiaWZvcmNlLT5kZXYtPm9wZW4gPSAlcFxuIiwgaWZvcmNlLT5kZXYtPm9wZW4pOwogCiAJcmV0dXJuIDA7CisKKyBmYWlsOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaWZvcmNlX2luaXQodm9pZCkKIHsKKwlpbnQgZXJyID0gMDsKKwogI2lmZGVmIENPTkZJR19KT1lTVElDS19JRk9SQ0VfVVNCCi0JdXNiX3JlZ2lzdGVyKCZpZm9yY2VfdXNiX2RyaXZlcik7CisJZXJyID0gdXNiX3JlZ2lzdGVyKCZpZm9yY2VfdXNiX2RyaXZlcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKICNlbmRpZgogI2lmZGVmIENPTkZJR19KT1lTVElDS19JRk9SQ0VfMjMyCi0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZpZm9yY2Vfc2VyaW9fZHJ2KTsKKwllcnIgPSBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJmlmb3JjZV9zZXJpb19kcnYpOworI2lmZGVmIENPTkZJR19KT1lTVElDS19JRk9SQ0VfVVNCCisJaWYgKGVycikKKwkJdXNiX2RlcmVnaXN0ZXIoJmlmb3JjZV91c2JfZHJpdmVyKTsKICNlbmRpZgotCXJldHVybiAwOworI2VuZGlmCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlmb3JjZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2Utc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1zZXJpby5jCmluZGV4IGNhMDhmNDUuLmVjNGJlNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1zZXJpby5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1zZXJpby5jCkBAIC0xNDEsMjEgKzE0MSwxOSBAQAogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBpZm9yY2UpOwogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKLQlpZiAoZXJyKSB7Ci0JCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQkJa2ZyZWUoaWZvcmNlKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaWYgKGVycikKKwkJZ290byBmYWlsMTsKIAogCWVyciA9IGlmb3JjZV9pbml0X2RldmljZShpZm9yY2UpOwotCWlmIChlcnIpIHsKLQkJc2VyaW9fY2xvc2Uoc2VyaW8pOwotCQlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7Ci0JCWtmcmVlKGlmb3JjZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwyOwogCiAJcmV0dXJuIDA7CisKKyBmYWlsMjoJc2VyaW9fY2xvc2Uoc2VyaW8pOworIGZhaWwxOglzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CisJa2ZyZWUoaWZvcmNlKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBpZm9yY2Vfc2VyaW9fZGlzY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXVzYi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXVzYi5jCmluZGV4IDEwNTExMmYuLjgwY2RlYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS11c2IuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMKQEAgLTE3OCw5ICsxNzgsOSBAQAogCiBmYWlsOgogCWlmIChpZm9yY2UpIHsKLQkJaWYgKGlmb3JjZS0+aXJxKSB1c2JfZnJlZV91cmIoaWZvcmNlLT5pcnEpOwotCQlpZiAoaWZvcmNlLT5vdXQpIHVzYl9mcmVlX3VyYihpZm9yY2UtPm91dCk7Ci0JCWlmIChpZm9yY2UtPmN0cmwpIHVzYl9mcmVlX3VyYihpZm9yY2UtPmN0cmwpOworCQl1c2JfZnJlZV91cmIoaWZvcmNlLT5pcnEpOworCQl1c2JfZnJlZV91cmIoaWZvcmNlLT5vdXQpOworCQl1c2JfZnJlZV91cmIoaWZvcmNlLT5jdHJsKTsKIAkJa2ZyZWUoaWZvcmNlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaW50ZXJhY3QuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaW50ZXJhY3QuYwppbmRleCBiYmZlYjljLi5mZWM4YjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2ludGVyYWN0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pbnRlcmFjdC5jCkBAIC0yODMsNyArMjgzLDkgQEAKIAlmb3IgKGkgPSAwOyAodCA9IGludGVyYWN0X3R5cGVbaW50ZXJhY3QtPnR5cGVdLmJ0bltpXSkgPj0gMDsgaSsrKQogCQlzZXRfYml0KHQsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZShpbnRlcmFjdC0+ZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW50ZXJhY3QtPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMjsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL21hZ2VsbGFuLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL21hZ2VsbGFuLmMKaW5kZXggZTNkMTk0NC4uNDExMjc4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9tYWdlbGxhbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svbWFnZWxsYW4uYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJbWFnZWxsYW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWFnZWxsYW4pLCBHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIW1hZ2VsbGFuIHx8ICFpbnB1dF9kZXYpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAogCW1hZ2VsbGFuLT5kZXYgPSBpbnB1dF9kZXY7CiAJc25wcmludGYobWFnZWxsYW4tPnBoeXMsIHNpemVvZihtYWdlbGxhbi0+cGh5cyksICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CkBAIC0xODMsMTMgKzE4MywxNyBAQAogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDI7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobWFnZWxsYW4tPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG1hZ2VsbGFuLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKIAlyZXR1cm4gMDsKIAotIGZhaWw6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWwzOglzZXJpb19jbG9zZShzZXJpbyk7CisgZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShtYWdlbGxhbik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIyNyw4ICsyMzEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtYWdlbGxhbl9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZtYWdlbGxhbl9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJm1hZ2VsbGFuX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtYWdlbGxhbl9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlYmFsbC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZWJhbGwuYwppbmRleCAyYTk4MDhjLi4wOGJmMTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlYmFsbC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2ViYWxsLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCXNwYWNlYmFsbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcGFjZWJhbGwpLCBHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIXNwYWNlYmFsbCB8fCAhaW5wdXRfZGV2KQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDE7CiAKIAlzcGFjZWJhbGwtPmRldiA9IGlucHV0X2RldjsKIAlzbnByaW50ZihzcGFjZWJhbGwtPnBoeXMsIHNpemVvZihzcGFjZWJhbGwtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwpAQCAtMjUyLDEzICsyNTIsMTcgQEAKIAogCWVyciA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7CiAJaWYgKGVycikKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwyOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHNwYWNlYmFsbC0+ZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoc3BhY2ViYWxsLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKIAlyZXR1cm4gMDsKIAotIGZhaWw6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWwzOglzZXJpb19jbG9zZShzZXJpbyk7CisgZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShzcGFjZWJhbGwpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yOTYsOCArMzAwLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3BhY2ViYWxsX2luaXQodm9pZCkKIHsKLQlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnNwYWNlYmFsbF9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnNwYWNlYmFsbF9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3BhY2ViYWxsX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2VvcmIuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2VvcmIuYwppbmRleCBjNGRiMDI0Li5jOWM3OTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlb3JiLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZW9yYi5jCkBAIC0xNzIsNyArMTcyLDcgQEAKIAlzcGFjZW9yYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzcGFjZW9yYiksIEdGUF9LRVJORUwpOwogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghc3BhY2VvcmIgfHwgIWlucHV0X2RldikKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwxOwogCiAJc3BhY2VvcmItPmRldiA9IGlucHV0X2RldjsKIAlzbnByaW50ZihzcGFjZW9yYi0+cGh5cywgc2l6ZW9mKHNwYWNlb3JiLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKQEAgLTE5OCwxMyArMTk4LDE3IEBACiAKIAllcnIgPSBzZXJpb19vcGVuKHNlcmlvLCBkcnYpOwogCWlmIChlcnIpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMjsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZShzcGFjZW9yYi0+ZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoc3BhY2VvcmItPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMzsKKwogCXJldHVybiAwOwogCi0gZmFpbDoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwotCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisgZmFpbDM6CXNlcmlvX2Nsb3NlKHNlcmlvKTsKKyBmYWlsMjoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworIGZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCWtmcmVlKHNwYWNlb3JiKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjQyLDggKzI0Niw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNwYWNlb3JiX2luaXQodm9pZCkKIHsKLQlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnNwYWNlb3JiX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmc3BhY2VvcmJfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNwYWNlb3JiX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3Rpbmdlci5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zdGluZ2VyLmMKaW5kZXggMWZmYjAzMi4uZWNiMDkxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zdGluZ2VyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zdGluZ2VyLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCXN0aW5nZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RpbmdlciksIEdGUF9LRVJORUwpOwogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghc3RpbmdlciB8fCAhaW5wdXRfZGV2KQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDE7CiAKIAlzdGluZ2VyLT5kZXYgPSBpbnB1dF9kZXY7CiAJc25wcmludGYoc3Rpbmdlci0+cGh5cywgc2l6ZW9mKHN0aW5nZXItPnBoeXMpLCAiJXMvc2VyaW8wIiwgc2VyaW8tPnBoeXMpOwpAQCAtMTY4LDEzICsxNjgsMTcgQEAKIAogCWVyciA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7CiAJaWYgKGVycikKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwyOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHN0aW5nZXItPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHN0aW5nZXItPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMzsKKwogCXJldHVybiAwOwogCi0gZmFpbDoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwotCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisgZmFpbDM6CXNlcmlvX2Nsb3NlKHNlcmlvKTsKKyBmYWlsMjoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworIGZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCWtmcmVlKHN0aW5nZXIpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yMTIsOCArMjE2LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3Rpbmdlcl9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZzdGluZ2VyX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmc3Rpbmdlcl9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3Rpbmdlcl9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3R3aWRqb3kuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHdpZGpveS5jCmluZGV4IDQ5MDg1ZGYuLjljZjE3ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHdpZGpveS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHdpZGpveS5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAl0d2lkam95ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHR3aWRqb3kpLCBHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIXR3aWRqb3kgfHwgIWlucHV0X2RldikKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwxOwogCiAJdHdpZGpveS0+ZGV2ID0gaW5wdXRfZGV2OwogCXNucHJpbnRmKHR3aWRqb3ktPnBoeXMsIHNpemVvZih0d2lkam95LT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKQEAgLTIyMSwxMyArMjIxLDE3IEBACiAKIAllcnIgPSBzZXJpb19vcGVuKHNlcmlvLCBkcnYpOwogCWlmIChlcnIpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMjsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZSh0d2lkam95LT5kZXYpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh0d2lkam95LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKIAlyZXR1cm4gMDsKIAotIGZhaWw6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWwzOglzZXJpb19jbG9zZShzZXJpbyk7CisgZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZSh0d2lkam95KTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjY1LDggKzI2OSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHR3aWRqb3lfaW5pdCh2b2lkKQogewotCXNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmdHdpZGpveV9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnR3aWRqb3lfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHR3aWRqb3lfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay93YXJyaW9yLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3dhcnJpb3IuYwppbmRleCAzNWVkZWExLi4yOWQzMzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3dhcnJpb3IuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3dhcnJpb3IuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJd2FycmlvciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3YXJyaW9yKSwgR0ZQX0tFUk5FTCk7CiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCF3YXJyaW9yIHx8ICFpbnB1dF9kZXYpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAogCXdhcnJpb3ItPmRldiA9IGlucHV0X2RldjsKIAlzbnByaW50Zih3YXJyaW9yLT5waHlzLCBzaXplb2Yod2Fycmlvci0+cGh5cyksICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CkBAIC0xNzYsMTMgKzE3NiwxNyBAQAogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDI7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uod2Fycmlvci0+ZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uod2Fycmlvci0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwzOworCiAJcmV0dXJuIDA7CiAKLSBmYWlsOglzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7Ci0JaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKyBmYWlsMzoJc2VyaW9fY2xvc2Uoc2VyaW8pOworIGZhaWwyOglzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CisgZmFpbDE6CWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CiAJa2ZyZWUod2Fycmlvcik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIyMCw4ICsyMjQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB3YXJyaW9yX2luaXQodm9pZCkKIHsKLQlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJndhcnJpb3JfZHJ2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZ3YXJyaW9yX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB3YXJyaW9yX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwppbmRleCA4MWEzMzNmLi4wNDlmMmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCkBAIC0yMDMsNCArMjAzLDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvbWFwLWtleXBhZC4KIAorY29uZmlnIEtFWUJPQVJEX0FBRUQyMDAwCisJdHJpc3RhdGUgIkFBRUQtMjAwMCBrZXlib2FyZCIKKwlkZXBlbmRzIG9uIE1BQ0hfQUFFRDIwMDAKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUga2V5Ym9hcmQgb24gdGhlIEFnaWxlbnQgQUFFRC0yMDAwCisJICBkZXZlbG9wbWVudCBib2FyZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWFlZDIwMDBfa2JkLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKaW5kZXggNGM3OWU3Yi4uNTY4Nzk3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCkBAIC0xNyw0ICsxNyw1IEBACiBvYmotJChDT05GSUdfS0VZQk9BUkRfSElMKQkJKz0gaGlsX2tiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfSElMX09MRCkJCSs9IGhpbGtiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfT01BUCkgICAgICAgICAgICAgKz0gb21hcC1rZXlwYWQubworb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FBRUQyMDAwKSAgICAgICAgICs9IGFhZWQyMDAwX2tiZC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWFlZDIwMDBfa2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FhZWQyMDAwX2tiZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZmNiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FhZWQyMDAwX2tiZC5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogIEtleWJvYXJkIGRyaXZlciBmb3IgdGhlIEFBRUQtMjAwMCBkZXYgYm9hcmQKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2IE5pY29sYXMgQmVsbGlkbyBZIE9ydGVnYQorICoKKyAqICBCYXNlZCBvbiBjb3JnaWtiZC5jCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYWFlZDIwMDAuaD4KKworI2RlZmluZSBLQl9ST1dTCQkJMTIKKyNkZWZpbmUgS0JfQ09MUwkJCTgKKyNkZWZpbmUgS0JfUk9XTUFTSyhyKQkJKDEgPDwgKHIpKQorI2RlZmluZSBTQ0FOQ09ERShyLGMpCQkoKChjKSAqIEtCX1JPV1MpICsgKHIpKQorI2RlZmluZSBOUl9TQ0FOQ09ERVMJCShLQl9DT0xTICogS0JfUk9XUykKKworI2RlZmluZSBTQ0FOX0lOVEVSVkFMCQkoNTApIC8qIG1zICovCisjZGVmaW5lIEtCX0FDVElWQVRFX0RFTEFZCSgyMCkgLyogdXMgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWFlZGtiZF9rZXljb2RlW05SX1NDQU5DT0RFU10gPSB7CisJS0VZXzksIEtFWV8wLCBLRVlfTUlOVVMsIEtFWV9FUVVBTCwgS0VZX0JBQ0tTUEFDRSwgMCwgS0VZX1NQQUNFLCBLRVlfS1A2LCAwLCBLRVlfS1BET1QsIDAsIDAsCisJS0VZX0ssIEtFWV9NLCBLRVlfTywgS0VZX0RPVCwgS0VZX1NMQVNILCAwLCBLRVlfRiwgMCwgMCwgMCwgS0VZX0xFRlRTSElGVCwgMCwKKwlLRVlfSSwgS0VZX1AsIEtFWV9MRUZUQlJBQ0UsIEtFWV9SSUdIVEJSQUNFLCBLRVlfQkFDS1NMQVNILCAwLCAwLCAwLCAwLCAwLCBLRVlfUklHSFRTSElGVCwgMCwKKwlLRVlfOCwgS0VZX0wsIEtFWV9TRU1JQ09MT04sIEtFWV9BUE9TVFJPUEhFLCBLRVlfRU5URVIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJS0VZX0osIEtFWV9ILCBLRVlfQiwgS0VZX0tQOCwgS0VZX0tQNCwgMCwgS0VZX0MsIEtFWV9ELCBLRVlfUywgS0VZX0EsIDAsIEtFWV9DQVBTTE9DSywKKwlLRVlfWSwgS0VZX1UsIEtFWV9OLCBLRVlfVCwgMCwgMCwgS0VZX1IsIEtFWV9FLCBLRVlfVywgS0VZX1EsIDAsIEtFWV9UQUIsCisJS0VZXzcsIEtFWV82LCBLRVlfRywgMCwgS0VZXzUsIDAsIEtFWV80LCBLRVlfMywgS0VZXzIsIEtFWV8xLCAwLCBLRVlfR1JBVkUsCisJMCwgMCwgS0VZX0NPTU1BLCAwLCBLRVlfS1AyLCAwLCBLRVlfViwgS0VZX0xFRlRBTFQsIEtFWV9YLCBLRVlfWiwgMCwgS0VZX0xFRlRDVFJMCit9OworCitzdHJ1Y3QgYWFlZGtiZCB7CisJdW5zaWduZWQgY2hhciBrZXljb2RlW0FSUkFZX1NJWkUoYWFlZGtiZF9rZXljb2RlKV07CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtxOworCWludCBrYmRzY2FuX3N0YXRlW0tCX0NPTFNdOworCWludCBrYmRzY2FuX2NvdW50W0tCX0NPTFNdOworfTsKKworI2RlZmluZSBLQkRTQ0FOX1NUQUJMRV9DT1VOVCAyCisKK3N0YXRpYyB2b2lkIGFhZWRrYmRfcmVwb3J0X2NvbChzdHJ1Y3QgYWFlZGtiZCAqYWFlZGtiZCwKKwkJCQl1bnNpZ25lZCBpbnQgY29sLCB1bnNpZ25lZCBpbnQgcm93ZCkKK3sKKwl1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHByZXNzZWQ7CisJdW5zaWduZWQgaW50IHJvdzsKKworCWZvciAocm93ID0gMDsgcm93IDwgS0JfUk9XUzsgcm93KyspIHsKKwkJc2NhbmNvZGUgPSBTQ0FOQ09ERShyb3csIGNvbCk7CisJCXByZXNzZWQgPSByb3dkICYgS0JfUk9XTUFTSyhyb3cpOworCisJCWlucHV0X3JlcG9ydF9rZXkoYWFlZGtiZC0+aW5wdXQsIGFhZWRrYmQtPmtleWNvZGVbc2NhbmNvZGVdLCBwcmVzc2VkKTsKKwl9Cit9CisKKy8qIFNjYW4gdGhlIGhhcmR3YXJlIGtleWJvYXJkIGFuZCBwdXNoIGFueSBjaGFuZ2VzIHVwIHRocm91Z2ggdGhlIGlucHV0IGxheWVyICovCitzdGF0aWMgdm9pZCBhYWVka2JkX3dvcmsodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWFlZGtiZCAqYWFlZGtiZCA9IGRhdGE7CisJdW5zaWduZWQgaW50IGNvbCwgcm93ZDsKKworCWNvbCA9IDA7CisJZG8geworCQlBQUVDX0dQSU9fS1NDQU4gPSBjb2wgKyA4OworCQl1ZGVsYXkoS0JfQUNUSVZBVEVfREVMQVkpOworCQlyb3dkID0gQUFFRF9FWFRfR1BJTyAmIEFBRURfRUdQSU9fS0JEX1NDQU47CisKKwkJaWYgKHJvd2QgIT0gYWFlZGtiZC0+a2Jkc2Nhbl9zdGF0ZVtjb2xdKSB7CisJCQlhYWVka2JkLT5rYmRzY2FuX2NvdW50W2NvbF0gPSAwOworCQkJYWFlZGtiZC0+a2Jkc2Nhbl9zdGF0ZVtjb2xdID0gcm93ZDsKKwkJfSBlbHNlIGlmICgrK2FhZWRrYmQtPmtiZHNjYW5fY291bnRbY29sXSA+PSBLQkRTQ0FOX1NUQUJMRV9DT1VOVCkgeworCQkJYWFlZGtiZF9yZXBvcnRfY29sKGFhZWRrYmQsIGNvbCwgcm93ZCk7CisJCQljb2wrKzsKKwkJfQorCX0gd2hpbGUgKGNvbCA8IEtCX0NPTFMpOworCisJQUFFQ19HUElPX0tTQ0FOID0gMHgwNzsKKwlpbnB1dF9zeW5jKGFhZWRrYmQtPmlucHV0KTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWFlZGtiZC0+d29ya3EsIG1zZWNzX3RvX2ppZmZpZXMoU0NBTl9JTlRFUlZBTCkpOworfQorCitzdGF0aWMgaW50IGFhZWRrYmRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbmRldikKK3sKKwlzdHJ1Y3QgYWFlZGtiZCAqYWFlZGtiZCA9IGluZGV2LT5wcml2YXRlOworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhYWVka2JkLT53b3JrcSwgbXNlY3NfdG9famlmZmllcyhTQ0FOX0lOVEVSVkFMKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWFlZGtiZF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppbmRldikKK3sKKwlzdHJ1Y3QgYWFlZGtiZCAqYWFlZGtiZCA9IGluZGV2LT5wcml2YXRlOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWFlZGtiZC0+d29ya3EpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFhZWRrYmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWFlZGtiZCAqYWFlZGtiZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJaW50IGk7CisJaW50IGVycm9yOworCisJYWFlZGtiZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhYWVka2JkKSwgR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFhYWVka2JkIHx8ICFpbnB1dF9kZXYpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWFlZGtiZCk7CisKKwlhYWVka2JkLT5pbnB1dCA9IGlucHV0X2RldjsKKworCS8qIEluaXQga2V5Ym9hcmQgcmVzY2FuIHdvcmtxdWV1ZSAqLworCUlOSVRfV09SSygmYWFlZGtiZC0+d29ya3EsIGFhZWRrYmRfd29yaywgYWFlZGtiZCk7CisKKwltZW1jcHkoYWFlZGtiZC0+a2V5Y29kZSwgYWFlZGtiZF9rZXljb2RlLCBzaXplb2YoYWFlZGtiZC0+a2V5Y29kZSkpOworCisJaW5wdXRfZGV2LT5uYW1lID0gIkFBRUQtMjAwMCBLZXlib2FyZCI7CisJaW5wdXRfZGV2LT5waHlzID0gImFhZWRrYmQvaW5wdXQwIjsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IDB4MDAwMTsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSAweDAwMDE7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCWlucHV0X2Rldi0+Y2Rldi5kZXYgPSAmcGRldi0+ZGV2OworCWlucHV0X2Rldi0+cHJpdmF0ZSA9IGFhZWRrYmQ7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVQKTsKKwlpbnB1dF9kZXYtPmtleWNvZGUgPSBhYWVka2JkLT5rZXljb2RlOworCWlucHV0X2Rldi0+a2V5Y29kZXNpemUgPSBzaXplb2YodW5zaWduZWQgY2hhcik7CisJaW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShhYWVka2JkX2tleWNvZGUpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWFlZGtiZF9rZXljb2RlKTsgaSsrKQorCQlzZXRfYml0KGFhZWRrYmQtPmtleWNvZGVbaV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKKwljbGVhcl9iaXQoMCwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJaW5wdXRfZGV2LT5vcGVuID0gYWFlZGtiZF9vcGVuOworCWlucHV0X2Rldi0+Y2xvc2UgPSBhYWVka2JkX2Nsb3NlOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYWFlZGtiZC0+aW5wdXQpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJcmV0dXJuIDA7CisKKyBmYWlsOglrZnJlZShhYWVka2JkKTsKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWFlZGtiZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWFlZGtiZCAqYWFlZGtiZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYWFlZGtiZC0+aW5wdXQpOworCWtmcmVlKGFhZWRrYmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFhZWRrYmRfZHJpdmVyID0geworCS5wcm9iZQkJPSBhYWVka2JkX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWFlZGtiZF9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhYWVkMjAwMC1rZXlib2FyZCIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFhZWRrYmRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFhZWRrYmRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFhZWRrYmRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhYWVka2JkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFhZWRrYmRfaW5pdCk7Cittb2R1bGVfZXhpdChhYWVka2JkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJOaWNvbGFzIEJlbGxpZG8gWSBPcnRlZ2EiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUFFRC0yMDAwIEtleWJvYXJkIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FtaWtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hbWlrYmQuYwppbmRleCA4YWJkYmQwLi4xNjU4M2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FtaWtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYW1pa2JkLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCWludCBpLCBqOwogCiAJaWYgKCFBTUlHQUhXX1BSRVNFTlQoQU1JX0tFWUJPQVJEKSkKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oQ0lBQV9QSFlTQUREUi0xKzB4YjAwLCAweDEwMCwgImFtaWtleWIiKSkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTE5OCw4ICsxOTgsOCBAQAogCWFtaWtiZF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWFtaWtiZF9kZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhbWlrYmQ6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBpbnB1dCBkZXZpY2VcbiIpOwotCQlyZWxlYXNlX21lbV9yZWdpb24oQ0lBQV9QSFlTQUREUiAtIDEgKyAweGIwMCwgMHgxMDApOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsMTsKIAl9CiAKIAlhbWlrYmRfZGV2LT5uYW1lID0gIkFtaWdhIEtleWJvYXJkIjsKQEAgLTIzMSwxMCArMjMxLDIyIEBACiAJCW1lbWNweShrZXlfbWFwc1tpXSwgdGVtcF9tYXAsIHNpemVvZih0ZW1wX21hcCkpOwogCX0KIAljaWFhLmNyYSAmPSB+MHg0MTsJIC8qIHNlcmlhbCBkYXRhIGluLCB0dXJuIG9mZiBUQSAqLwotCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9DSUFBX1NQLCBhbWlrYmRfaW50ZXJydXB0LCAwLCAiYW1pa2JkIiwgYW1pa2JkX2ludGVycnVwdCk7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9DSUFBX1NQLCBhbWlrYmRfaW50ZXJydXB0LCAwLCAiYW1pa2JkIiwKKwkJCWFtaWtiZF9pbnRlcnJ1cHQpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBmYWlsMjsKKwl9CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYW1pa2JkX2Rldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGFtaWtiZF9kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKIAlyZXR1cm4gMDsKKworIGZhaWwzOglmcmVlX2lycShJUlFfQU1JR0FfQ0lBQV9TUCwgYW1pa2JkX2ludGVycnVwdCk7CisgZmFpbDI6CWlucHV0X2ZyZWVfZGV2aWNlKGFtaWtiZF9kZXYpOworIGZhaWwxOglyZWxlYXNlX21lbV9yZWdpb24oQ0lBQV9QSFlTQUREUiAtIDEgKyAweGIwMCwgMHgxMDApOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbWlrYmRfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCmluZGV4IGI2ZWY5ZWEuLmM2MjFhOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKQEAgLTIyMSw2ICsyMjEsNyBAQAogCXVuc2lnbmVkIGxvbmcgeGxfYml0OwogCXVuc2lnbmVkIGludCBsYXN0OwogCXVuc2lnbmVkIGxvbmcgdGltZTsKKwl1bnNpZ25lZCBsb25nIGVycl9jb3VudDsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCBldmVudF93b3JrOwogCXN0cnVjdCBtdXRleCBldmVudF9tdXRleDsKQEAgLTIzNCwxMSArMjM1LDEzIEBACiAjZGVmaW5lIEFUS0JEX0RFRklORV9BVFRSKF9uYW1lKQkJCQkJCVwKIHN0YXRpYyBzc2l6ZV90IGF0a2JkX3Nob3dfIyNfbmFtZShzdHJ1Y3QgYXRrYmQgKiwgY2hhciAqKTsJCQlcCiBzdGF0aWMgc3NpemVfdCBhdGtiZF9zZXRfIyNfbmFtZShzdHJ1Y3QgYXRrYmQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwkJXAotc3RhdGljIHNzaXplX3QgYXRrYmRfZG9fc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpiKQkJCVwKK3N0YXRpYyBzc2l6ZV90IGF0a2JkX2RvX3Nob3dfIyNfbmFtZShzdHJ1Y3QgZGV2aWNlICpkLAkJCQlcCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmIpCQlcCiB7CQkJCQkJCQkJCVwKIAlyZXR1cm4gYXRrYmRfYXR0cl9zaG93X2hlbHBlcihkLCBiLCBhdGtiZF9zaG93XyMjX25hbWUpOwkJXAogfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBhdGtiZF9kb19zZXRfIyNfbmFtZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYiwgc2l6ZV90IHMpCVwKK3N0YXRpYyBzc2l6ZV90IGF0a2JkX2RvX3NldF8jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmQsCQkJCVwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpiLCBzaXplX3QgcykJXAogewkJCQkJCQkJCQlcCiAJcmV0dXJuIGF0a2JkX2F0dHJfc2V0X2hlbHBlcihkLCBiLCBzLCBhdGtiZF9zZXRfIyNfbmFtZSk7CQlcCiB9CQkJCQkJCQkJCVwKQEAgLTI1MSw2ICsyNTQsMzIgQEAKIEFUS0JEX0RFRklORV9BVFRSKHNvZnRyZXBlYXQpOwogQVRLQkRfREVGSU5FX0FUVFIoc29mdHJhdyk7CiAKKyNkZWZpbmUgQVRLQkRfREVGSU5FX1JPX0FUVFIoX25hbWUpCQkJCQkJXAorc3RhdGljIHNzaXplX3QgYXRrYmRfc2hvd18jI19uYW1lKHN0cnVjdCBhdGtiZCAqLCBjaGFyICopOwkJCVwKK3N0YXRpYyBzc2l6ZV90IGF0a2JkX2RvX3Nob3dfIyNfbmFtZShzdHJ1Y3QgZGV2aWNlICpkLAkJCQlcCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmIpCQlcCit7CQkJCQkJCQkJCVwKKwlyZXR1cm4gYXRrYmRfYXR0cl9zaG93X2hlbHBlcihkLCBiLCBhdGtiZF9zaG93XyMjX25hbWUpOwkJXAorfQkJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYXRrYmRfYXR0cl8jI19uYW1lID0JCQkJXAorCV9fQVRUUihfbmFtZSwgU19JUlVHTywgYXRrYmRfZG9fc2hvd18jI19uYW1lLCBOVUxMKTsKKworQVRLQkRfREVGSU5FX1JPX0FUVFIoZXJyX2NvdW50KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmF0a2JkX2F0dHJpYnV0ZXNbXSA9IHsKKwkmYXRrYmRfYXR0cl9leHRyYS5hdHRyLAorCSZhdGtiZF9hdHRyX3Njcm9sbC5hdHRyLAorCSZhdGtiZF9hdHRyX3NldC5hdHRyLAorCSZhdGtiZF9hdHRyX3NvZnRyZXBlYXQuYXR0ciwKKwkmYXRrYmRfYXR0cl9zb2Z0cmF3LmF0dHIsCisJJmF0a2JkX2F0dHJfZXJyX2NvdW50LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYXRrYmRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycwk9IGF0a2JkX2F0dHJpYnV0ZXMsCit9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHhsX3RhYmxlW10gPSB7CiAJQVRLQkRfUkVUX0JBVCwgQVRLQkRfUkVUX0VSUiwgQVRLQkRfUkVUX0FDSywKIAlBVEtCRF9SRVRfTkFLLCBBVEtCRF9SRVRfSEFOSkEsIEFUS0JEX1JFVF9IQU5HRVVMLApAQCAtMzk2LDcgKzQyNSwxMCBAQAogCQkJYWRkX3JlbGVhc2VfZXZlbnQgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgQVRLQkRfUkVUX0VSUjoKKwkJCWF0a2JkLT5lcnJfY291bnQrKzsKKyNpZmRlZiBBVEtCRF9ERUJVRwogCQkJcHJpbnRrKEtFUk5fREVCVUcgImF0a2JkLmM6IEtleWJvYXJkIG9uICVzIHJlcG9ydHMgdG9vIG1hbnkga2V5cyBwcmVzc2VkLlxuIiwgc2VyaW8tPnBoeXMpOworI2VuZGlmCiAJCQlnb3RvIG91dDsKIAl9CiAKQEAgLTUzNSw5ICs1NjcsOSBAQAogICogaW50ZXJydXB0IGNvbnRleHQuCiAgKi8KIAotc3RhdGljIHZvaWQgYXRrYmRfZXZlbnRfd29yayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgYXRrYmRfZXZlbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGF0a2JkICphdGtiZCA9IGRhdGE7CisJc3RydWN0IGF0a2JkICphdGtiZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRrYmQsIGV2ZW50X3dvcmspOwogCiAJbXV0ZXhfbG9jaygmYXRrYmQtPmV2ZW50X211dGV4KTsKIApAQCAtNzg2LDEyICs4MTgsNyBAQAogCXN5bmNocm9uaXplX3NjaGVkKCk7ICAvKiBBbGxvdyBhdGtiZF9pbnRlcnJ1cHQoKXMgdG8gY29tcGxldGUuICovCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAotCWRldmljZV9yZW1vdmVfZmlsZSgmc2VyaW8tPmRldiwgJmF0a2JkX2F0dHJfZXh0cmEpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmc2VyaW8tPmRldiwgJmF0a2JkX2F0dHJfc2Nyb2xsKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNlcmlvLT5kZXYsICZhdGtiZF9hdHRyX3NldCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmYXRrYmRfYXR0cl9zb2Z0cmVwZWF0KTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNlcmlvLT5kZXYsICZhdGtiZF9hdHRyX3NvZnRyYXcpOwotCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZXJpby0+ZGV2LmtvYmosICZhdGtiZF9hdHRyaWJ1dGVfZ3JvdXApOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGF0a2JkLT5kZXYpOwogCXNlcmlvX2Nsb3NlKHNlcmlvKTsKIAlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CkBAIC05MTIsMTEgKzkzOSwxMSBAQAogCWF0a2JkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0a2JkKSwgR0ZQX0tFUk5FTCk7CiAJZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFhdGtiZCB8fCAhZGV2KQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDE7CiAKIAlhdGtiZC0+ZGV2ID0gZGV2OwogCXBzMl9pbml0KCZhdGtiZC0+cHMyZGV2LCBzZXJpbyk7Ci0JSU5JVF9XT1JLKCZhdGtiZC0+ZXZlbnRfd29yaywgYXRrYmRfZXZlbnRfd29yaywgYXRrYmQpOworCUlOSVRfV09SSygmYXRrYmQtPmV2ZW50X3dvcmssIGF0a2JkX2V2ZW50X3dvcmspOwogCW11dGV4X2luaXQoJmF0a2JkLT5ldmVudF9tdXRleCk7CiAKIAlzd2l0Y2ggKHNlcmlvLT5pZC50eXBlKSB7CkBAIC05NDAsMTQgKzk2NywxMyBAQAogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDI7CiAKIAlpZiAoYXRrYmQtPndyaXRlKSB7CiAKIAkJaWYgKGF0a2JkX3Byb2JlKGF0a2JkKSkgewotCQkJc2VyaW9fY2xvc2Uoc2VyaW8pOwogCQkJZXJyID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKKwkJCWdvdG8gZmFpbDM7CiAJCX0KIAogCQlhdGtiZC0+c2V0ID0gYXRrYmRfc2VsZWN0X3NldChhdGtiZCwgYXRrYmRfc2V0LCBhdGtiZF9leHRyYSk7CkBAIC05NjEsMjAgKzk4NywyMiBAQAogCWF0a2JkX3NldF9rZXljb2RlX3RhYmxlKGF0a2JkKTsKIAlhdGtiZF9zZXRfZGV2aWNlX2F0dHJzKGF0a2JkKTsKIAotCWRldmljZV9jcmVhdGVfZmlsZSgmc2VyaW8tPmRldiwgJmF0a2JkX2F0dHJfZXh0cmEpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmc2VyaW8tPmRldiwgJmF0a2JkX2F0dHJfc2Nyb2xsKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZhdGtiZF9hdHRyX3NldCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZzZXJpby0+ZGV2LCAmYXRrYmRfYXR0cl9zb2Z0cmVwZWF0KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZhdGtiZF9hdHRyX3NvZnRyYXcpOworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc2VyaW8tPmRldi5rb2JqLCAmYXRrYmRfYXR0cmlidXRlX2dyb3VwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwzOwogCiAJYXRrYmRfZW5hYmxlKGF0a2JkKTsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZShhdGtiZC0+ZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsNDsKIAogCXJldHVybiAwOwogCi0gZmFpbDoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwotCWlucHV0X2ZyZWVfZGV2aWNlKGRldik7CisgZmFpbDQ6IHN5c2ZzX3JlbW92ZV9ncm91cCgmc2VyaW8tPmRldi5rb2JqLCAmYXRrYmRfYXR0cmlidXRlX2dyb3VwKTsKKyBmYWlsMzoJc2VyaW9fY2xvc2Uoc2VyaW8pOworIGZhaWwyOglzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CisgZmFpbDE6CWlucHV0X2ZyZWVfZGV2aWNlKGRldik7CiAJa2ZyZWUoYXRrYmQpOwogCXJldHVybiBlcnI7CiB9CkBAIC0xMTEwLDkgKzExMzgsMTEgQEAKIAogc3RhdGljIHNzaXplX3QgYXRrYmRfc2V0X2V4dHJhKHN0cnVjdCBhdGtiZCAqYXRrYmQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpbnB1dF9kZXYgKm5ld19kZXY7CisJc3RydWN0IGlucHV0X2RldiAqb2xkX2RldiwgKm5ld19kZXY7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAljaGFyICpyZXN0OworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBvbGRfZXh0cmEsIG9sZF9zZXQ7CiAKIAlpZiAoIWF0a2JkLT53cml0ZSkKIAkJcmV0dXJuIC1FSU87CkBAIC0xMTI0LDE3ICsxMTU0LDM2IEBACiAJaWYgKGF0a2JkLT5leHRyYSAhPSB2YWx1ZSkgewogCQkvKgogCQkgKiBTaW5jZSBkZXZpY2UncyBwcm9wZXJ0aWVzIHdpbGwgY2hhbmdlIHdlIG5lZWQgdG8KLQkJICogdW5yZWdpc3RlciBvbGQgZGV2aWNlLiBCdXQgYWxsb2NhdGUgbmV3IG9uZSBmaXJzdAotCQkgKiB0byBtYWtlIHN1cmUgd2UgaGF2ZSBpdC4KKwkJICogdW5yZWdpc3RlciBvbGQgZGV2aWNlLiBCdXQgYWxsb2NhdGUgYW5kIHJlZ2lzdGVyCisJCSAqIG5ldyBvbmUgZmlyc3QgdG8gbWFrZSBzdXJlIHdlIGhhdmUgaXQuCiAJCSAqLwotCQlpZiAoIShuZXdfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCkpKQorCQlvbGRfZGV2ID0gYXRrYmQtPmRldjsKKwkJb2xkX2V4dHJhID0gYXRrYmQtPmV4dHJhOworCQlvbGRfc2V0ID0gYXRrYmQtPnNldDsKKworCQluZXdfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJCWlmICghbmV3X2RldikKIAkJCXJldHVybiAtRU5PTUVNOwotCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShhdGtiZC0+ZGV2KTsKKwogCQlhdGtiZC0+ZGV2ID0gbmV3X2RldjsKIAkJYXRrYmQtPnNldCA9IGF0a2JkX3NlbGVjdF9zZXQoYXRrYmQsIGF0a2JkLT5zZXQsIHZhbHVlKTsKIAkJYXRrYmRfYWN0aXZhdGUoYXRrYmQpOworCQlhdGtiZF9zZXRfa2V5Y29kZV90YWJsZShhdGtiZCk7CiAJCWF0a2JkX3NldF9kZXZpY2VfYXR0cnMoYXRrYmQpOwotCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisKKwkJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGF0a2JkLT5kZXYpOworCQlpZiAoZXJyKSB7CisJCQlpbnB1dF9mcmVlX2RldmljZShuZXdfZGV2KTsKKworCQkJYXRrYmQtPmRldiA9IG9sZF9kZXY7CisJCQlhdGtiZC0+c2V0ID0gYXRrYmRfc2VsZWN0X3NldChhdGtiZCwgb2xkX3NldCwgb2xkX2V4dHJhKTsKKwkJCWF0a2JkX3NldF9rZXljb2RlX3RhYmxlKGF0a2JkKTsKKwkJCWF0a2JkX3NldF9kZXZpY2VfYXR0cnMoYXRrYmQpOworCisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKG9sZF9kZXYpOworCiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTExNDYsMjMgKzExOTUsNDEgQEAKIAogc3RhdGljIHNzaXplX3QgYXRrYmRfc2V0X3Njcm9sbChzdHJ1Y3QgYXRrYmQgKmF0a2JkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpuZXdfZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKm9sZF9kZXYsICpuZXdfZGV2OwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAJY2hhciAqcmVzdDsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgb2xkX3Njcm9sbDsKIAogCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmcmVzdCwgMTApOwogCWlmICgqcmVzdCB8fCB2YWx1ZSA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGF0a2JkLT5zY3JvbGwgIT0gdmFsdWUpIHsKLQkJaWYgKCEobmV3X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpKSkKKwkJb2xkX2RldiA9IGF0a2JkLT5kZXY7CisJCW9sZF9zY3JvbGwgPSBhdGtiZC0+c2Nyb2xsOworCisJCW5ld19kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwkJaWYgKCFuZXdfZGV2KQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGF0a2JkLT5kZXYpOworCiAJCWF0a2JkLT5kZXYgPSBuZXdfZGV2OwogCQlhdGtiZC0+c2Nyb2xsID0gdmFsdWU7CiAJCWF0a2JkX3NldF9rZXljb2RlX3RhYmxlKGF0a2JkKTsKIAkJYXRrYmRfc2V0X2RldmljZV9hdHRycyhhdGtiZCk7Ci0JCWlucHV0X3JlZ2lzdGVyX2RldmljZShhdGtiZC0+ZGV2KTsKKworCQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisJCWlmIChlcnIpIHsKKwkJCWlucHV0X2ZyZWVfZGV2aWNlKG5ld19kZXYpOworCisJCQlhdGtiZC0+c2Nyb2xsID0gb2xkX3Njcm9sbDsKKwkJCWF0a2JkLT5kZXYgPSBvbGRfZGV2OworCQkJYXRrYmRfc2V0X2tleWNvZGVfdGFibGUoYXRrYmQpOworCQkJYXRrYmRfc2V0X2RldmljZV9hdHRycyhhdGtiZCk7CisKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uob2xkX2Rldik7CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTExNzQsOSArMTI0MSwxMSBAQAogCiBzdGF0aWMgc3NpemVfdCBhdGtiZF9zZXRfc2V0KHN0cnVjdCBhdGtiZCAqYXRrYmQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpbnB1dF9kZXYgKm5ld19kZXY7CisJc3RydWN0IGlucHV0X2RldiAqb2xkX2RldiwgKm5ld19kZXY7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAljaGFyICpyZXN0OworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBvbGRfc2V0LCBvbGRfZXh0cmE7CiAKIAlpZiAoIWF0a2JkLT53cml0ZSkKIAkJcmV0dXJuIC1FSU87CkBAIC0xMTg2LDE1ICsxMjU1LDMyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGF0a2JkLT5zZXQgIT0gdmFsdWUpIHsKLQkJaWYgKCEobmV3X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpKSkKKwkJb2xkX2RldiA9IGF0a2JkLT5kZXY7CisJCW9sZF9leHRyYSA9IGF0a2JkLT5leHRyYTsKKwkJb2xkX3NldCA9IGF0a2JkLT5zZXQ7CisKKwkJbmV3X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCQlpZiAoIW5ld19kZXYpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisKIAkJYXRrYmQtPmRldiA9IG5ld19kZXY7CiAJCWF0a2JkLT5zZXQgPSBhdGtiZF9zZWxlY3Rfc2V0KGF0a2JkLCB2YWx1ZSwgYXRrYmQtPmV4dHJhKTsKIAkJYXRrYmRfYWN0aXZhdGUoYXRrYmQpOwogCQlhdGtiZF9zZXRfa2V5Y29kZV90YWJsZShhdGtiZCk7CiAJCWF0a2JkX3NldF9kZXZpY2VfYXR0cnMoYXRrYmQpOwotCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisKKwkJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGF0a2JkLT5kZXYpOworCQlpZiAoZXJyKSB7CisJCQlpbnB1dF9mcmVlX2RldmljZShuZXdfZGV2KTsKKworCQkJYXRrYmQtPmRldiA9IG9sZF9kZXY7CisJCQlhdGtiZC0+c2V0ID0gYXRrYmRfc2VsZWN0X3NldChhdGtiZCwgb2xkX3NldCwgb2xkX2V4dHJhKTsKKwkJCWF0a2JkX3NldF9rZXljb2RlX3RhYmxlKGF0a2JkKTsKKwkJCWF0a2JkX3NldF9kZXZpY2VfYXR0cnMoYXRrYmQpOworCisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKG9sZF9kZXYpOwogCX0KIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xMjA2LDkgKzEyOTIsMTEgQEAKIAogc3RhdGljIHNzaXplX3QgYXRrYmRfc2V0X3NvZnRyZXBlYXQoc3RydWN0IGF0a2JkICphdGtiZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGlucHV0X2RldiAqbmV3X2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpvbGRfZGV2LCAqbmV3X2RldjsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWNoYXIgKnJlc3Q7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIG9sZF9zb2Z0cmVwZWF0LCBvbGRfc29mdHJhdzsKIAogCWlmICghYXRrYmQtPndyaXRlKQogCQlyZXR1cm4gLUVJTzsKQEAgLTEyMTgsMTUgKzEzMDYsMzIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYXRrYmQtPnNvZnRyZXBlYXQgIT0gdmFsdWUpIHsKLQkJaWYgKCEobmV3X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpKSkKKwkJb2xkX2RldiA9IGF0a2JkLT5kZXY7CisJCW9sZF9zb2Z0cmVwZWF0ID0gYXRrYmQtPnNvZnRyZXBlYXQ7CisJCW9sZF9zb2Z0cmF3ID0gYXRrYmQtPnNvZnRyYXc7CisKKwkJbmV3X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCQlpZiAoIW5ld19kZXYpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisKIAkJYXRrYmQtPmRldiA9IG5ld19kZXY7CiAJCWF0a2JkLT5zb2Z0cmVwZWF0ID0gdmFsdWU7CiAJCWlmIChhdGtiZC0+c29mdHJlcGVhdCkKIAkJCWF0a2JkLT5zb2Z0cmF3ID0gMTsKIAkJYXRrYmRfc2V0X2RldmljZV9hdHRycyhhdGtiZCk7Ci0JCWlucHV0X3JlZ2lzdGVyX2RldmljZShhdGtiZC0+ZGV2KTsKKworCQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisJCWlmIChlcnIpIHsKKwkJCWlucHV0X2ZyZWVfZGV2aWNlKG5ld19kZXYpOworCisJCQlhdGtiZC0+ZGV2ID0gb2xkX2RldjsKKwkJCWF0a2JkLT5zb2Z0cmVwZWF0ID0gb2xkX3NvZnRyZXBlYXQ7CisJCQlhdGtiZC0+c29mdHJhdyA9IG9sZF9zb2Z0cmF3OworCQkJYXRrYmRfc2V0X2RldmljZV9hdHRycyhhdGtiZCk7CisKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uob2xkX2Rldik7CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTEyMzksMzEgKzEzNDQsNTIgQEAKIAogc3RhdGljIHNzaXplX3QgYXRrYmRfc2V0X3NvZnRyYXcoc3RydWN0IGF0a2JkICphdGtiZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGlucHV0X2RldiAqbmV3X2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpvbGRfZGV2LCAqbmV3X2RldjsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWNoYXIgKnJlc3Q7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIG9sZF9zb2Z0cmF3OwogCiAJdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsICZyZXN0LCAxMCk7CiAJaWYgKCpyZXN0IHx8IHZhbHVlID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYXRrYmQtPnNvZnRyYXcgIT0gdmFsdWUpIHsKLQkJaWYgKCEobmV3X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpKSkKKwkJb2xkX2RldiA9IGF0a2JkLT5kZXY7CisJCW9sZF9zb2Z0cmF3ID0gYXRrYmQtPnNvZnRyYXc7CisKKwkJbmV3X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCQlpZiAoIW5ld19kZXYpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisKIAkJYXRrYmQtPmRldiA9IG5ld19kZXY7CiAJCWF0a2JkLT5zb2Z0cmF3ID0gdmFsdWU7CiAJCWF0a2JkX3NldF9kZXZpY2VfYXR0cnMoYXRrYmQpOwotCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYXRrYmQtPmRldik7CisKKwkJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGF0a2JkLT5kZXYpOworCQlpZiAoZXJyKSB7CisJCQlpbnB1dF9mcmVlX2RldmljZShuZXdfZGV2KTsKKworCQkJYXRrYmQtPmRldiA9IG9sZF9kZXY7CisJCQlhdGtiZC0+c29mdHJhdyA9IG9sZF9zb2Z0cmF3OworCQkJYXRrYmRfc2V0X2RldmljZV9hdHRycyhhdGtiZCk7CisKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uob2xkX2Rldik7CiAJfQogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3QgYXRrYmRfc2hvd19lcnJfY291bnQoc3RydWN0IGF0a2JkICphdGtiZCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgYXRrYmQtPmVycl9jb3VudCk7Cit9CisKIAogc3RhdGljIGludCBfX2luaXQgYXRrYmRfaW5pdCh2b2lkKQogewotCXNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmYXRrYmRfZHJ2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZhdGtiZF9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXRrYmRfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCmluZGV4IGNiNzA5NzAuLjEwMTZjOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogc3RhdGljIHZvaWQgY29yZ2lrYmRfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBjb3JnaWtiZCAqY29yZ2lrYmRfZGF0YSA9IChzdHJ1Y3QgY29yZ2lrYmQgKikgZGF0YTsKLQljb3JnaWtiZF9zY2Fua2V5Ym9hcmQoY29yZ2lrYmRfZGF0YSwgTlVMTCk7CisJY29yZ2lrYmRfc2NhbmtleWJvYXJkKGNvcmdpa2JkX2RhdGEpOwogfQogCiAvKgpAQCAtMjkxLDE1ICsyOTEsMTIgQEAKIHsKIAlzdHJ1Y3QgY29yZ2lrYmQgKmNvcmdpa2JkOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQlpbnQgaTsKKwlpbnQgaSwgZXJyID0gLUVOT01FTTsKIAogCWNvcmdpa2JkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvcmdpa2JkKSwgR0ZQX0tFUk5FTCk7CiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFjb3JnaWtiZCB8fCAhaW5wdXRfZGV2KSB7Ci0JCWtmcmVlKGNvcmdpa2JkKTsKLQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWlmICghY29yZ2lrYmQgfHwgIWlucHV0X2RldikKKwkJZ290byBmYWlsOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY29yZ2lrYmQpOwogCkBAIC0zNDEsNyArMzM4LDkgQEAKIAlzZXRfYml0KFNXX1RBQkxFVF9NT0RFLCBpbnB1dF9kZXYtPnN3Yml0KTsKIAlzZXRfYml0KFNXX0hFQURQSE9ORV9JTlNFUlQsIGlucHV0X2Rldi0+c3diaXQpOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNvcmdpa2JkLT5pbnB1dCk7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNvcmdpa2JkLT5pbnB1dCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOwogCiAJbW9kX3RpbWVyKCZjb3JnaWtiZC0+aHRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhISU5HRV9TQ0FOX0lOVEVSVkFMKSk7CiAKQEAgLTM2Miw2ICszNjEsMTAgQEAKIAlweGFfZ3Bpb19tb2RlKENPUkdJX0dQSU9fQUtfSU5UIHwgR1BJT19JTik7CiAKIAlyZXR1cm4gMDsKKworIGZhaWw6CWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoY29yZ2lrYmQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgY29yZ2lrYmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2hpbF9rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaGlsX2tiZC5jCmluZGV4IGU3NzRkZDMuLjdjYzk3MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaGlsX2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaGlsX2tiZC5jCkBAIC0zODEsOCArMzgxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaGlsX2tiZF9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZoaWxfa2JkX3NlcmlvX2Rydik7Ci0gICAgICAgIHJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJmhpbF9rYmRfc2VyaW9fZHJ2KTsKIH0KICAgICAgICAgICAgICAgICAKIHN0YXRpYyB2b2lkIF9fZXhpdCBoaWxfa2JkX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaGlsa2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2hpbGtiZC5jCmluZGV4IDU0YmM1NjkuLjM1NDYxZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaGlsa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxrYmQuYwpAQCAtMjMsNyArMjMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpZmRlZiBDT05GSUdfSFAzMDAKKyNpbmNsdWRlIDxhc20vaHd0ZXN0Lmg+CisjZW5kaWYKIAogCiBNT0RVTEVfQVVUSE9SKCJQaGlsaXAgQmx1bmRlbGwsIE1hdHRoZXcgV2lsY294LCBIZWxnZSBEZWxsZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYwppbmRleCA3MDhkNWExLi4zZDRkMGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jCkBAIC01OSwxMSArNTksNiBAQAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICoKLSAqIFNob3VsZCB5b3UgbmVlZCB0byBjb250YWN0IG1lLCB0aGUgYXV0aG9yLCB5b3UgY2FuIGRvIHNvIGVpdGhlciBieQotICogZW1haWwgb3IgYnkgcGFwZXIgbWFpbDoKLSAqIEphbi1CZW5lZGljdCBHbGF3LCBMaWxpZW5zdHJh32UgMTYsIDMzNzkwIEj2cnN0ZSAobmVhciBIYWxsZS9XZXN0Zi4pLAotICogR2VybWFueS4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTU3Nyw5ICs1NzIsOSBAQAogICogd2VyZSBpbi4KICAqLwogc3RhdGljIHZvaWQKLWxra2JkX3JlaW5pdCAodm9pZCAqZGF0YSkKK2xra2JkX3JlaW5pdCAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBsa2tiZCAqbGsgPSBkYXRhOworCXN0cnVjdCBsa2tiZCAqbGsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGxra2JkLCB0cSk7CiAJaW50IGRpdmlzaW9uOwogCXVuc2lnbmVkIGNoYXIgbGVkc19vbiA9IDA7CiAJdW5zaWduZWQgY2hhciBsZWRzX29mZiA9IDA7CkBAIC02NTEsMTIgKzY0NiwxMiBAQAogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSAoKTsKIAlpZiAoIWxrIHx8ICFpbnB1dF9kZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwxOwogCX0KIAogCWxrLT5zZXJpbyA9IHNlcmlvOwogCWxrLT5kZXYgPSBpbnB1dF9kZXY7Ci0JSU5JVF9XT1JLICgmbGstPnRxLCBsa2tiZF9yZWluaXQsIGxrKTsKKwlJTklUX1dPUksgKCZsay0+dHEsIGxra2JkX3JlaW5pdCk7CiAJbGstPmJlbGxfdm9sdW1lID0gYmVsbF92b2x1bWU7CiAJbGstPmtleWNsaWNrX3ZvbHVtZSA9IGtleWNsaWNrX3ZvbHVtZTsKIAlsay0+Y3RybGNsaWNrX3ZvbHVtZSA9IGN0cmxjbGlja192b2x1bWU7CkBAIC02OTYsMTUgKzY5MSwxOSBAQAogCiAJZXJyID0gc2VyaW9fb3BlbiAoc2VyaW8sIGRydik7CiAJaWYgKGVycikKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwyOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlIChsay0+ZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UgKGxrLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKIAlsay0+c2VyaW8tPndyaXRlIChsay0+c2VyaW8sIExLX0NNRF9QT1dFUkNZQ0xFX1JFU0VUKTsKIAogCXJldHVybiAwOwogCi0gZmFpbDoJc2VyaW9fc2V0X2RydmRhdGEgKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9mcmVlX2RldmljZSAoaW5wdXRfZGV2KTsKKyBmYWlsMzoJc2VyaW9fY2xvc2UgKHNlcmlvKTsKKyBmYWlsMjoJc2VyaW9fc2V0X2RydmRhdGEgKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UgKGlucHV0X2Rldik7CiAJa2ZyZWUgKGxrKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNzU0LDggKzc1Myw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogbGtrYmRfaW5pdCAodm9pZCkKIHsKLQlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJmxra2JkX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmbGtrYmRfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sb2NvbW9rYmQuYwppbmRleCBmZDMzYzljLi4yYWRlNTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG9jb21va2JkLmMKQEAgLTE4NiwyOSArMTg2LDI5IEBACiBzdGF0aWMgdm9pZCBsb2NvbW9rYmRfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBsb2NvbW9rYmQgKmxvY29tb2tiZCA9IChzdHJ1Y3QgbG9jb21va2JkICopIGRhdGE7Ci0JbG9jb21va2JkX3NjYW5rZXlib2FyZChsb2NvbW9rYmQsIE5VTEwpOworCWxvY29tb2tiZF9zY2Fua2V5Ym9hcmQobG9jb21va2JkKTsKIH0KIAogc3RhdGljIGludCBsb2NvbW9rYmRfcHJvYmUoc3RydWN0IGxvY29tb19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgbG9jb21va2JkICpsb2NvbW9rYmQ7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwotCWludCBpLCByZXQ7CisJaW50IGksIGVycjsKIAogCWxvY29tb2tiZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NvbW9rYmQpLCBHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWxvY29tb2tiZCB8fCAhaW5wdXRfZGV2KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9tZW07CiAJfQogCiAJLyogdHJ5IGFuZCBjbGFpbSBtZW1vcnkgcmVnaW9uICovCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oKHVuc2lnbmVkIGxvbmcpIGRldi0+bWFwYmFzZSwKIAkJCQlkZXYtPmxlbmd0aCwKIAkJCQlMT0NPTU9fRFJJVkVSX05BTUUoZGV2KSkpIHsKLQkJcmV0ID0gLUVCVVNZOworCQllcnIgPSAtRUJVU1k7CiAJCXByaW50ayhLRVJOX0VSUiAibG9jb21va2JkOiBDYW4ndCBhY3F1aXJlIGFjY2VzcyB0byBpbyBtZW1vcnkgZm9yIGtleWJvYXJkXG4iKTsKLQkJZ290byBmcmVlOworCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CiAKIAlsb2NvbW9rYmQtPmxkZXYgPSBkZXY7CkBAIC0yNDQsMjQgKzI0NCwyOCBAQAogCWNsZWFyX2JpdCgwLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAKIAkvKiBhdHRlbXB0IHRvIGdldCB0aGUgaW50ZXJydXB0ICovCi0JcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnFbMF0sIGxvY29tb2tiZF9pbnRlcnJ1cHQsIDAsICJsb2NvbW9rYmQiLCBsb2NvbW9rYmQpOwotCWlmIChyZXQpIHsKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycVswXSwgbG9jb21va2JkX2ludGVycnVwdCwgMCwgImxvY29tb2tiZCIsIGxvY29tb2tiZCk7CisJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgImxvY29tb2tiZDogQ2FuJ3QgZ2V0IGlycSBmb3Iga2V5Ym9hcmRcbiIpOwotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CiAJfQogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGxvY29tb2tiZC0+aW5wdXQpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShsb2NvbW9rYmQtPmlucHV0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2lycTsKIAogCXJldHVybiAwOwogCi1vdXQ6CisgZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxWzBdLCBsb2NvbW9rYmQpOworIGVycl9yZWxlYXNlX3JlZ2lvbjoKIAlyZWxlYXNlX21lbV9yZWdpb24oKHVuc2lnbmVkIGxvbmcpIGRldi0+bWFwYmFzZSwgZGV2LT5sZW5ndGgpOwogCWxvY29tb19zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwotZnJlZToKKyBlcnJfZnJlZV9tZW06CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShsb2NvbW9rYmQpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGxvY29tb2tiZF9yZW1vdmUoc3RydWN0IGxvY29tb19kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWFwbGVfa2V5Yi5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXBsZV9rZXliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNmFhZjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXBsZV9rZXliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqCSRJZDogbWFwbGVfa2V5Yi5jLHYgMS40IDIwMDQvMDMvMjIgMDE6MTg6MTUgbGV0aGFsIEV4cCAkCi0gKglTRUdBIERyZWFtY2FzdCBrZXlib2FyZCBkcml2ZXIKLSAqCUJhc2VkIG9uIGRyaXZlcnMvdXNiL3VzYmtiZC5jCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L21hcGxlLmg+Ci0KLU1PRFVMRV9BVVRIT1IoIllBRUdBU0hJIFRha2VzaGkgPHRAa2VzaGkub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTRUdBIERyZWFtY2FzdCBrZXlib2FyZCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZGNfa2JkX2tleWNvZGVbMjU2XSA9IHsKLQkgIDAsICAwLCAgMCwgIDAsIDMwLCA0OCwgNDYsIDMyLCAxOCwgMzMsIDM0LCAzNSwgMjMsIDM2LCAzNywgMzgsCi0JIDUwLCA0OSwgMjQsIDI1LCAxNiwgMTksIDMxLCAyMCwgMjIsIDQ3LCAxNywgNDUsIDIxLCA0NCwgIDIsICAzLAotCSAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDI4LCAgMSwgMTQsIDE1LCA1NywgMTIsIDEzLCAyNiwKLQkgMjcsIDQzLCA0MywgMzksIDQwLCA0MSwgNTEsIDUyLCA1MywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsCi0JIDY1LCA2NiwgNjcsIDY4LCA4NywgODgsIDk5LCA3MCwxMTksMTEwLDEwMiwxMDQsMTExLDEwNywxMDksMTA2LAotCTEwNSwxMDgsMTAzLCA2OSwgOTgsIDU1LCA3NCwgNzgsIDk2LCA3OSwgODAsIDgxLCA3NSwgNzYsIDc3LCA3MSwKLQkgNzIsIDczLCA4MiwgODMsIDg2LDEyNywxMTYsMTE3LDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsCi0JMTkxLDE5MiwxOTMsMTk0LDEzNCwxMzgsMTMwLDEzMiwxMjgsMTI5LDEzMSwxMzcsMTMzLDEzNSwxMzYsMTEzLAotCTExNSwxMTQsICAwLCAgMCwgIDAsMTIxLCAgMCwgODksIDkzLDEyNCwgOTIsIDk0LCA5NSwgIDAsICAwLCAgMCwKLQkxMjIsMTIzLCA5MCwgOTEsIDg1LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQkgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCSAyOSwgNDIsIDU2LDEyNSwgOTcsIDU0LDEwMCwxMjYsMTY0LDE2NiwxNjUsMTYzLDE2MSwxMTUsMTE0LDExMywKLQkxNTAsMTU4LDE1OSwxMjgsMTM2LDE3NywxNzgsMTc2LDE0MiwxNTIsMTczLDE0MAotfTsKLQotCi1zdHJ1Y3QgZGNfa2JkIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7Ci0JdW5zaWduZWQgY2hhciBuZXdbOF07Ci0JdW5zaWduZWQgY2hhciBvbGRbOF07Ci19OwotCi0KLXN0YXRpYyB2b2lkIGRjX3NjYW5fa2JkKHN0cnVjdCBkY19rYmQgKmtiZCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBrYmQtPmRldjsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBkY19rYmRfa2V5Y29kZVtpICsgMjI0XSwgKGtiZC0+bmV3WzBdID4+IGkpICYgMSk7Ci0KLQlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKSB7Ci0KLQkJaWYgKGtiZC0+b2xkW2ldID4gMyAmJiBtZW1zY2FuKGtiZC0+bmV3ICsgMiwga2JkLT5vbGRbaV0sIDYpID09IE5VTEwpIHsKLQkJCWlmIChkY19rYmRfa2V5Y29kZVtrYmQtPm9sZFtpXV0pCi0JCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIGRjX2tiZF9rZXljb2RlW2tiZC0+b2xkW2ldXSwgMCk7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSByZWxlYXNlZC4iLAotCQkJCSAgICAgICBrYmQtPm9sZFtpXSk7Ci0JCX0KLQotCQlpZiAoa2JkLT5uZXdbaV0gPiAzICYmIG1lbXNjYW4oa2JkLT5vbGQgKyAyLCBrYmQtPm5ld1tpXSwgNikgIT0gTlVMTCkgewotCQkJaWYoZGNfa2JkX2tleWNvZGVba2JkLT5uZXdbaV1dKQotCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBkY19rYmRfa2V5Y29kZVtrYmQtPm5ld1tpXV0sIDEpOwotCQkJZWxzZQotCQkJCXByaW50aygiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcHJlc3NlZC4iLAotCQkJCSAgICAgICBrYmQtPm5ld1tpXSk7Ci0JCX0KLQl9Ci0KLQlpbnB1dF9zeW5jKGRldik7Ci0KLQltZW1jcHkoa2JkLT5vbGQsIGtiZC0+bmV3LCA4KTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkY19rYmRfY2FsbGJhY2soc3RydWN0IG1hcGxlcSAqbXEpCi17Ci0Jc3RydWN0IG1hcGxlX2RldmljZSAqbWFwbGVkZXYgPSBtcS0+ZGV2OwotCXN0cnVjdCBkY19rYmQgKmtiZCA9IG1hcGxlZGV2LT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyAqYnVmID0gbXEtPnJlY3ZidWY7Ci0KLQlpZiAoYnVmWzFdID09IG1hcGxlZGV2LT5mdW5jdGlvbikgewotCQltZW1jcHkoa2JkLT5uZXcsIGJ1ZiArIDIsIDgpOwotCQlkY19zY2FuX2tiZChrYmQpOwotCX0KLX0KLQotc3RhdGljIGludCBkY19rYmRfY29ubmVjdChzdHJ1Y3QgbWFwbGVfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRjX2tiZCAqa2JkOwotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQl1bnNpZ25lZCBsb25nIGRhdGEgPSBiZTMyX3RvX2NwdShkZXYtPmRldmluZm8uZnVuY3Rpb25fZGF0YVswXSk7Ci0JaW50IGk7Ci0KLQlkZXYtPnByaXZhdGVfZGF0YSA9IGtiZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkY19rYmQpLCBHRlBfS0VSTkVMKTsKLQlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWtiZCB8fCAhaW5wdXRfZGV2KSB7Ci0JCWtmcmVlKGtiZCk7Ci0JCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWtiZC0+ZGV2ID0gaW5wdXRfZGV2OwotCi0JaW5wdXRfZGV2LT5uYW1lID0gZGV2LT5wcm9kdWN0X25hbWU7Ci0JaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX01BUExFOwotCWlucHV0X2Rldi0+cHJpdmF0ZSA9IGtiZDsKLQlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVQKTsKLQlmb3IgKGkgPSAwOyBpIDwgMjU1OyBpKyspCi0JCXNldF9iaXQoZGNfa2JkX2tleWNvZGVbaV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKLQljbGVhcl9iaXQoMCwgaW5wdXRfZGV2LT5rZXliaXQpOwotCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGtiZC0+ZGV2KTsKLQotCW1hcGxlX2dldGNvbmRfY2FsbGJhY2soZGV2LCBkY19rYmRfY2FsbGJhY2ssIDEsIE1BUExFX0ZVTkNfS0VZQk9BUkQpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGRjX2tiZF9kaXNjb25uZWN0KHN0cnVjdCBtYXBsZV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGNfa2JkICprYmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKLQotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGtiZC0+ZGV2KTsKLQlrZnJlZShrYmQpOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwbGVfZHJpdmVyIGRjX2tiZF9kcml2ZXIgPSB7Ci0JLmZ1bmN0aW9uID0JTUFQTEVfRlVOQ19LRVlCT0FSRCwKLQkubmFtZSA9CQkiRHJlYW1jYXN0IGtleWJvYXJkIiwKLQkuY29ubmVjdCA9CWRjX2tiZF9jb25uZWN0LAotCS5kaXNjb25uZWN0ID0JZGNfa2JkX2Rpc2Nvbm5lY3QsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IGRjX2tiZF9pbml0KHZvaWQpCi17Ci0JbWFwbGVfcmVnaXN0ZXJfZHJpdmVyKCZkY19rYmRfZHJpdmVyKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGNfa2JkX2V4aXQodm9pZCkKLXsKLQltYXBsZV91bnJlZ2lzdGVyX2RyaXZlcigmZGNfa2JkX2RyaXZlcik7Ci19Ci0KLQotbW9kdWxlX2luaXQoZGNfa2JkX2luaXQpOwotbW9kdWxlX2V4aXQoZGNfa2JkX2V4aXQpOwotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9uZXd0b25rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbmV3dG9ua2JkLmMKaW5kZXggOTI4MmU0ZS4uYWEyOWI1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9uZXd0b25rYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL25ld3RvbmtiZC5jCkBAIC05MSw3ICs5MSw3IEBACiAJbmtiZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBua2JkKSwgR0ZQX0tFUk5FTCk7CiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFua2JkIHx8ICFpbnB1dF9kZXYpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAogCW5rYmQtPnNlcmlvID0gc2VyaW87CiAJbmtiZC0+ZGV2ID0gaW5wdXRfZGV2OwpAQCAtMTE5LDEzICsxMTksMTcgQEAKIAogCWVyciA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7CiAJaWYgKGVycikKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwyOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG5rYmQtPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG5rYmQtPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMzsKKwogCXJldHVybiAwOwogCi0gZmFpbDoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwotCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisgZmFpbDM6CXNlcmlvX2Nsb3NlKHNlcmlvKTsKKyBmYWlsMjoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworIGZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCWtmcmVlKG5rYmQpOwogCXJldHVybiBlcnI7CiB9CkBAIC0xNjUsOCArMTY5LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgbmtiZF9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZua2JkX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmbmtiZF9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmtiZF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NwaXR6a2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NwaXR6a2JkLmMKaW5kZXggOGIxOGMwMC4uOGEyMTY2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zcGl0emtiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3BpdHprYmQuYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiB7CiAJc3RydWN0IHNwaXR6a2JkICpzcGl0emtiZF9kYXRhID0gKHN0cnVjdCBzcGl0emtiZCAqKSBkYXRhOwogCi0Jc3BpdHprYmRfc2NhbmtleWJvYXJkKHNwaXR6a2JkX2RhdGEsIE5VTEwpOworCXNwaXR6a2JkX3NjYW5rZXlib2FyZChzcGl0emtiZF9kYXRhKTsKIH0KIAogLyoKQEAgLTM0NiwxNyArMzQ2LDEyIEBACiB7CiAJc3RydWN0IHNwaXR6a2JkICpzcGl0emtiZDsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7Ci0JaW50IGk7CisJaW50IGksIGVyciA9IC1FTk9NRU07CiAKIAlzcGl0emtiZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzcGl0emtiZCksIEdGUF9LRVJORUwpOwotCWlmICghc3BpdHprYmQpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFpbnB1dF9kZXYpIHsKLQkJa2ZyZWUoc3BpdHprYmQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJaWYgKCFzcGl0emtiZCB8fCAhaW5wdXRfZGV2KQorCQlnb3RvIGZhaWw7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIHNwaXR6a2JkKTsKIAlzdHJjcHkoc3BpdHprYmQtPnBoeXMsICJzcGl0emtiZC9pbnB1dDAiKTsKQEAgLTQwMCw3ICszOTUsOSBAQAogCXNldF9iaXQoU1dfVEFCTEVUX01PREUsIGlucHV0X2Rldi0+c3diaXQpOwogCXNldF9iaXQoU1dfSEVBRFBIT05FX0lOU0VSVCwgaW5wdXRfZGV2LT5zd2JpdCk7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CiAKIAltb2RfdGltZXIoJnNwaXR6a2JkLT5odGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEhJTkdFX1NDQU5fSU5URVJWQUwpKTsKIApAQCAtNDM0LDEzICs0MzEsMTUgQEAKIAlyZXF1ZXN0X2lycShTUElUWl9JUlFfR1BJT19TV0IsIHNwaXR6a2JkX2hpbmdlX2lzciwKIAkJICAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCSAgICAiU3BpdHprYmQgU1dCIiwgc3BpdHprYmQpOwotIAlyZXF1ZXN0X2lycShTUElUWl9JUlFfR1BJT19BS19JTlQsIHNwaXR6a2JkX2hpbmdlX2lzciwKKwlyZXF1ZXN0X2lycShTUElUWl9JUlFfR1BJT19BS19JTlQsIHNwaXR6a2JkX2hpbmdlX2lzciwKIAkJICAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCSAgICAiU3BpdHprYmQgSFAiLCBzcGl0emtiZCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJpbnB1dDogU3BpdHogS2V5Ym9hcmQgUmVnaXN0ZXJlZFxuIik7Ci0KIAlyZXR1cm4gMDsKKworIGZhaWw6CWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoc3BpdHprYmQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgc3BpdHprYmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKQEAgLTQ3NCw2ICs0NzMsNyBAQAogCS5yZXN1bWUJCT0gc3BpdHprYmRfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzcGl0ei1rZXlib2FyZCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N0b3dhd2F5LmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N0b3dhd2F5LmMKaW5kZXggZTYwOTM3ZC4uZjdiNWM1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdG93YXdheS5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3Rvd2F3YXkuYwpAQCAtMTczLDggKzE3Myw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNrYmRfaW5pdCh2b2lkKQogewotCXNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmc2tiZF9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnNrYmRfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNrYmRfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdW5rYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc3Vua2JkLmMKaW5kZXggY2FjNDc4MS4uMzgyNmRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zdW5rYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3N1bmtiZC5jCkBAIC0yMDgsOSArMjA4LDkgQEAKICAqIHdlcmUgaW4uCiAgKi8KIAotc3RhdGljIHZvaWQgc3Vua2JkX3JlaW5pdCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgc3Vua2JkX3JlaW5pdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHN1bmtiZCAqc3Vua2JkID0gZGF0YTsKKwlzdHJ1Y3Qgc3Vua2JkICpzdW5rYmQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHN1bmtiZCwgdHEpOwogCiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc3Vua2JkLT53YWl0LCBzdW5rYmQtPnJlc2V0ID49IDAsIEhaKTsKIApAQCAtMjQzLDIzICsyNDMsMjMgQEAKIAlzdW5rYmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3Vua2JkKSwgR0ZQX0tFUk5FTCk7CiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFzdW5rYmQgfHwgIWlucHV0X2RldikKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwxOwogCiAJc3Vua2JkLT5zZXJpbyA9IHNlcmlvOwogCXN1bmtiZC0+ZGV2ID0gaW5wdXRfZGV2OwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1bmtiZC0+d2FpdCk7Ci0JSU5JVF9XT1JLKCZzdW5rYmQtPnRxLCBzdW5rYmRfcmVpbml0LCBzdW5rYmQpOworCUlOSVRfV09SSygmc3Vua2JkLT50cSwgc3Vua2JkX3JlaW5pdCk7CiAJc25wcmludGYoc3Vua2JkLT5waHlzLCBzaXplb2Yoc3Vua2JkLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKIAogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBzdW5rYmQpOwogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDI7CiAKIAlpZiAoc3Vua2JkX2luaXRpYWxpemUoc3Vua2JkKSA8IDApIHsKLQkJc2VyaW9fY2xvc2Uoc2VyaW8pOwotCQlnb3RvIGZhaWw7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbDM7CiAJfQogCiAJc25wcmludGYoc3Vua2JkLT5uYW1lLCBzaXplb2Yoc3Vua2JkLT5uYW1lKSwgIlN1biBUeXBlICVkIGtleWJvYXJkIiwgc3Vua2JkLT50eXBlKTsKQEAgLTI4NywxMSArMjg3LDE3IEBACiAJY2xlYXJfYml0KDAsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAogCXN1bmtiZF9lbmFibGUoc3Vua2JkLCAxKTsKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoc3Vua2JkLT5kZXYpOworCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHN1bmtiZC0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw0OworCiAJcmV0dXJuIDA7CiAKLSBmYWlsOglzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7Ci0JaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKyBmYWlsNDoJc3Vua2JkX2VuYWJsZShzdW5rYmQsIDApOworIGZhaWwzOglzZXJpb19jbG9zZShzZXJpbyk7CisgZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShzdW5rYmQpOwogCXJldHVybiBlcnI7CiB9CkBAIC0zNDYsOCArMzUyLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3Vua2JkX2luaXQodm9pZCkKIHsKLQlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnN1bmtiZF9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnN1bmtiZF9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3Vua2JkX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQveHRrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQveHRrYmQuYwppbmRleCA4YzExZGM5Li5hODIwOTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3h0a2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC94dGtiZC5jCkBAIC05NSw3ICs5NSw3IEBACiAJeHRrYmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgeHRrYmQpLCBHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIXh0a2JkIHx8ICFpbnB1dF9kZXYpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAogCXh0a2JkLT5zZXJpbyA9IHNlcmlvOwogCXh0a2JkLT5kZXYgPSBpbnB1dF9kZXY7CkBAIC0xMjQsMTMgKzEyNCwxNyBAQAogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDI7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoeHRrYmQtPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHh0a2JkLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKIAlyZXR1cm4gMDsKIAotIGZhaWw6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWwzOglzZXJpb19jbG9zZShzZXJpbyk7CisgZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZSh4dGtiZCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE3MCw4ICsxNzQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB4dGtiZF9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZ4dGtiZF9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnh0a2JkX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB4dGtiZF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2hwX3NkY19ydGMuYwppbmRleCAxYmU5NjM5Li4zMWQ1YTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvaHBfc2RjX3J0Yy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9ocF9zZGNfcnRjLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGhwX3NkY19ydGNfd2FpdCk7CiAKLXN0YXRpYyBzc2l6ZV90IGhwX3NkY19ydGNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3QgaHBfc2RjX3J0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKIAogc3RhdGljIGludCBocF9zZGNfcnRjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMzg1LDE0ICszODUsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgaHBfc2RjX3J0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCBocF9zZGNfcnRjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKIAlzc2l6ZV90IHJldHZhbDsKIAogICAgICAgICBpZiAoY291bnQgPCBzaXplb2YodW5zaWduZWQgbG9uZykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR2YWwgPSBwdXRfdXNlcig2OCwgKHVuc2lnbmVkIGxvbmcgKilidWYpOworCXJldHZhbCA9IHB1dF91c2VyKDY4LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTY5NSw4ICs2OTUsMTAgQEAKIAogCWlmICgocmV0ID0gaHBfc2RjX3JlcXVlc3RfdGltZXJfaXJxKCZocF9zZGNfcnRjX2lzcikpKQogCQlyZXR1cm4gcmV0OwotCW1pc2NfcmVnaXN0ZXIoJmhwX3NkY19ydGNfZGV2KTsKLSAgICAgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAoImRyaXZlci9ydGMiLCAwLCAwLCAKKwlpZiAobWlzY19yZWdpc3RlcigmaHBfc2RjX3J0Y19kZXYpICE9IDApCisJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkIG5vdCByZWdpc3RlciBtaXNjLiBkZXYgZm9yIGk4MDQyIHJ0Y1xuIik7CisKKyAgICAgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAoImRyaXZlci9ydGMiLCAwLCBOVUxMLAogCQkJCWhwX3NkY19ydGNfcmVhZF9wcm9jLCBOVUxMKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkhQIGk4MDQyIFNEQyArIE1TTS01ODMyMSBSVEMgc3VwcG9ydCBsb2FkZWQgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jCmluZGV4IDU5OWE3YjIuLjIzOWEwZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYW1pbW91c2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FtaW1vdXNlLmMKQEAgLTk1LDEwICs5NSwxMyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhbWltb3VzZV9pbml0KHZvaWQpCiB7CisJaW50IGVycjsKKwogCWlmICghTUFDSF9JU19BTUlHQSB8fCAhQU1JR0FIV19QUkVTRU5UKEFNSV9NT1VTRSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCEoYW1pbW91c2VfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCkpKQorCWFtaW1vdXNlX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghYW1pbW91c2VfZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWFtaW1vdXNlX2Rldi0+bmFtZSA9ICJBbWlnYSBtb3VzZSI7CkBAIC0xMTQsNyArMTE3LDExIEBACiAJYW1pbW91c2VfZGV2LT5vcGVuID0gYW1pbW91c2Vfb3BlbjsKIAlhbWltb3VzZV9kZXYtPmNsb3NlID0gYW1pbW91c2VfY2xvc2U7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYW1pbW91c2VfZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYW1pbW91c2VfZGV2KTsKKwlpZiAoZXJyKSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGFtaW1vdXNlX2Rldik7CisJCXJldHVybiBlcnI7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2hpbF9wdHIuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCmluZGV4IDRmMmI1MDMuLmJmYjE3NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGlsX3B0ci5jCkBAIC00MTcsOCArNDE3LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaGlsX3B0cl9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZoaWxfcHRyX3NlcmlvX2RyaXZlcik7Ci0gICAgICAgIHJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJmhpbF9wdHJfc2VyaW9fZHJpdmVyKTsKIH0KICAgICAgICAgICAgICAgICAKIHN0YXRpYyB2b2lkIF9fZXhpdCBoaWxfcHRyX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaW5wb3J0LmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2lucG9ydC5jCmluZGV4IGUxMjUyZmEuLjEzZGQ5NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaW5wb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9pbnBvcnQuYwpAQCAtMTM1LDYgKzEzNSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBpbnBvcnRfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgYSwgYiwgYzsKKwlpbnQgZXJyOwogCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJTlBPUlRfQkFTRSwgSU5QT1JUX0VYVEVOVCwgImlucG9ydCIpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaW5wb3J0LmM6IENhbid0IGFsbG9jYXRlIHBvcnRzIGF0ICUjeFxuIiwgSU5QT1JUX0JBU0UpOwpAQCAtMTQ1LDE1ICsxNDYsMTYgQEAKIAliID0gaW5iKElOUE9SVF9TSUdOQVRVUkVfUE9SVCk7CiAJYyA9IGluYihJTlBPUlRfU0lHTkFUVVJFX1BPUlQpOwogCWlmIChhID09IGIgfHwgYSAhPSBjKSB7Ci0JCXJlbGVhc2VfcmVnaW9uKElOUE9SVF9CQVNFLCBJTlBPUlRfRVhURU5UKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJpbnBvcnQuYzogRGlkbid0IGZpbmQgSW5Qb3J0IG1vdXNlIGF0ICUjeFxuIiwgSU5QT1JUX0JBU0UpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CiAJfQogCi0JaWYgKCEoaW5wb3J0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpKSkgeworCWlucG9ydF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucG9ydF9kZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpbnBvcnQuYzogTm90IGVub3VnaCBtZW1vcnkgZm9yIGlucHV0IGRldmljZVxuIik7Ci0JCXJlbGVhc2VfcmVnaW9uKElOUE9SVF9CQVNFLCBJTlBPUlRfRVhURU5UKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOwogCX0KIAogCWlucG9ydF9kZXYtPm5hbWUgPSBJTlBPUlRfTkFNRTsKQEAgLTE3NCw5ICsxNzYsMTggQEAKIAlvdXRiKElOUE9SVF9SRUdfTU9ERSwgSU5QT1JUX0NPTlRST0xfUE9SVCk7CiAJb3V0YihJTlBPUlRfTU9ERV9CQVNFLCBJTlBPUlRfREFUQV9QT1JUKTsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZShpbnBvcnRfZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wb3J0X2Rldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kZXY7CiAKIAlyZXR1cm4gMDsKKworIGVycl9mcmVlX2RldjoKKwlpbnB1dF9mcmVlX2RldmljZShpbnBvcnRfZGV2KTsKKyBlcnJfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oSU5QT1JUX0JBU0UsIElOUE9SVF9FWFRFTlQpOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlucG9ydF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMKaW5kZXggYzU3ZTg4NS4uMjk1NDJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYwpAQCAtMjEsNDcgKzIxLDUxIEBACiAjaW5jbHVkZSAibGlmZWJvb2suaCIKIAogc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGxpZmVib29rX2RtaV90YWJsZVtdID0gewotICAgICAgIHsKLSAgICAgICAgICAgICAgIC5pZGVudCA9ICJMaWZlQm9vayBCIiwKLSAgICAgICAgICAgICAgIC5tYXRjaGVzID0gewotICAgICAgICAgICAgICAgICAgICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxpZmVCb29rIEIgU2VyaWVzIiksCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgewotICAgICAgICAgICAgICAgLmlkZW50ID0gIkxpZmVib29rIEIiLAotICAgICAgICAgICAgICAgLm1hdGNoZXMgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTElGRUJPT0sgQiBTZXJpZXMiKSwKLSAgICAgICAgICAgICAgIH0sCi0gICAgICAgfSwKLSAgICAgICB7Ci0gICAgICAgICAgICAgICAuaWRlbnQgPSAiTGlmZWJvb2sgQjIxM3gvQjIxNTAiLAotICAgICAgICAgICAgICAgLm1hdGNoZXMgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGlmZUJvb2sgQjIxMzEvQjIxMzMvQjIxNTAiKSwKLSAgICAgICAgICAgICAgIH0sCi0gICAgICAgfSwKLSAgICAgICB7Ci0gICAgICAgICAgICAgICAuaWRlbnQgPSAiWmVwaHlyIiwKLSAgICAgICAgICAgICAgIC5tYXRjaGVzID0gewotICAgICAgICAgICAgICAgICAgICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlpFUEhZUiIpLAotICAgICAgICAgICAgICAgfSwKLSAgICAgICB9LAotICAgICAgIHsKLSAgICAgICAgICAgICAgIC5pZGVudCA9ICJDRi0xOCIsCi0gICAgICAgICAgICAgICAubWF0Y2hlcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJDRi0xOCIpLAotICAgICAgICAgICAgICAgfSwKLSAgICAgICB9LAotICAgICAgIHsKLSAgICAgICAgICAgICAgIC5pZGVudCA9ICJMaWZlYm9vayBCMTQyIiwKLSAgICAgICAgICAgICAgIC5tYXRjaGVzID0gewotICAgICAgICAgICAgICAgICAgICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxpZmVCb29rIEIxNDIiKSwKLSAgICAgICAgICAgICAgIH0sCi0KLSAgICAgICB9LAotICAgICAgIHsgfQorCXsKKwkJLmlkZW50ID0gIkZMT1JBLWllIDU1bWkiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiRkxPUkEtaWUgNTVtaSIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQgPSAiTGlmZUJvb2sgQiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMaWZlQm9vayBCIFNlcmllcyIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQgPSAiTGlmZWJvb2sgQiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMSUZFQk9PSyBCIFNlcmllcyIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQgPSAiTGlmZWJvb2sgQjIxM3gvQjIxNTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGlmZUJvb2sgQjIxMzEvQjIxMzMvQjIxNTAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIlplcGh5ciIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJaRVBIWVIiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkNGLTE4IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkNGLTE4IiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJMaWZlYm9vayBCMTQyIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxpZmVCb29rIEIxNDIiKSwKKwkJfSwKKwl9LAorCXsgfQogfTsKIAotCiBzdGF0aWMgcHNtb3VzZV9yZXRfdCBsaWZlYm9va19wcm9jZXNzX2J5dGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCiB7CiAJdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpYm0uYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naWJtLmMKaW5kZXggOGU5YzJmMy4uZGIyMDU5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpYm0uYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2libS5jCkBAIC0xMjQsNiArMTI0LDggQEAKIAogc3RhdGljIGludCBfX2luaXQgbG9naWJtX2luaXQodm9pZCkKIHsKKwlpbnQgZXJyOworCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihMT0dJQk1fQkFTRSwgTE9HSUJNX0VYVEVOVCwgImxvZ2libSIpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibG9naWJtLmM6IENhbid0IGFsbG9jYXRlIHBvcnRzIGF0ICUjeFxuIiwgTE9HSUJNX0JBU0UpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTM0LDE4ICsxMzYsMTkgQEAKIAl1ZGVsYXkoMTAwKTsKIAogCWlmIChpbmIoTE9HSUJNX1NJR05BVFVSRV9QT1JUKSAhPSBMT0dJQk1fU0lHTkFUVVJFX0JZVEUpIHsKLQkJcmVsZWFzZV9yZWdpb24oTE9HSUJNX0JBU0UsIExPR0lCTV9FWFRFTlQpOwogCQlwcmludGsoS0VSTl9FUlIgImxvZ2libS5jOiBEaWRuJ3QgZmluZCBMb2dpdGVjaCBidXNtb3VzZSBhdCAlI3hcbiIsIExPR0lCTV9CQVNFKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOwogCX0KIAogCW91dGIoTE9HSUJNX0RFRkFVTFRfTU9ERSwgTE9HSUJNX0NPTkZJR19QT1JUKTsKIAlvdXRiKExPR0lCTV9ESVNBQkxFX0lSUSwgTE9HSUJNX0NPTlRST0xfUE9SVCk7CiAKLQlpZiAoIShsb2dpYm1fZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCkpKSB7CisJbG9naWJtX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghbG9naWJtX2RldikgewogCQlwcmludGsoS0VSTl9FUlIgImxvZ2libS5jOiBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgaW5wdXQgZGV2aWNlXG4iKTsKLQkJcmVsZWFzZV9yZWdpb24oTE9HSUJNX0JBU0UsIExPR0lCTV9FWFRFTlQpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CiAJfQogCiAJbG9naWJtX2Rldi0+bmFtZSA9ICJMb2dpdGVjaCBidXMgbW91c2UiOwpAQCAtMTYyLDkgKzE2NSwxOCBAQAogCWxvZ2libV9kZXYtPm9wZW4gID0gbG9naWJtX29wZW47CiAJbG9naWJtX2Rldi0+Y2xvc2UgPSBsb2dpYm1fY2xvc2U7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobG9naWJtX2Rldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGxvZ2libV9kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfZGV2OwogCiAJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV9kZXY6CisJaW5wdXRfZnJlZV9kZXZpY2UobG9naWJtX2Rldik7CisgZXJyX3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKExPR0lCTV9CQVNFLCBMT0dJQk1fRVhURU5UKTsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBsb2dpYm1fZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naXBzMnBwLmMKaW5kZXggOGE0Zjg2Mi4uZDNkZGVhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpcHMycHAuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2lwczJwcC5jCkBAIC0zMjgsNiArMzI4LDcgQEAKIAl1bnNpZ25lZCBjaGFyIG1vZGVsLCBidXR0b25zOwogCWNvbnN0IHN0cnVjdCBwczJwcF9pbmZvICptb2RlbF9pbmZvOwogCWludCB1c2VfcHMycHAgPSAwOworCWludCBlcnJvcjsKIAogCXBhcmFtWzBdID0gMDsKIAlwczJfY29tbWFuZChwczJkZXYsIHBhcmFtLCBQU01PVVNFX0NNRF9TRVRSRVMpOwpAQCAtMzkzLDggKzM5NCwxNCBAQAogCQkJCXBzbW91c2UtPnNldF9yZXNvbHV0aW9uID0gcHMycHBfc2V0X3Jlc29sdXRpb247CiAJCQkJcHNtb3VzZS0+ZGlzY29ubmVjdCA9IHBzMnBwX2Rpc2Nvbm5lY3Q7CiAKLQkJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LAotCQkJCQkJICAgJnBzbW91c2VfYXR0cl9zbWFydHNjcm9sbC5kYXR0cik7CisJCQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBzbW91c2UtPnBzMmRldi5zZXJpby0+ZGV2LAorCQkJCQkJCSAgICZwc21vdXNlX2F0dHJfc21hcnRzY3JvbGwuZGF0dHIpOworCQkJCWlmIChlcnJvcikgeworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJCSJsb2dpcHMycHAuYzogZmFpbGVkIHRvIGNyZWF0ZSBzbWFydHNjcm9sbCAiCisJCQkJCQkic3lzZnMgYXR0cmlidXRlLCBlcnJvcjogJWRcbiIsIGVycm9yKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KIAkJCX0KIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BjMTEwcGFkLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BjMTEwcGFkLmMKaW5kZXggOGMwNzVhYS4uZjE1NWMxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wYzExMHBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcGMxMTBwYWQuYwpAQCAtMTA4LDYgKzEwOCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBwYzExMHBhZF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgZXJyOwogCiAJZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CiAJaWYgKGRldikgewpAQCAtMTI0LDE2ICsxMjUsMTYgQEAKIAlvdXRiKFBDMTEwUEFEX09GRiwgcGMxMTBwYWRfaW8gKyAyKTsKIAogCWlmIChyZXF1ZXN0X2lycShwYzExMHBhZF9pcnEsIHBjMTEwcGFkX2ludGVycnVwdCwgMCwgInBjMTEwcGFkIiwgTlVMTCkpIHsKLQkJcmVsZWFzZV9yZWdpb24ocGMxMTBwYWRfaW8sIDQpOwogCQlwcmludGsoS0VSTl9FUlIgInBjMTEwcGFkOiBVbmFibGUgdG8gZ2V0IGlycSAlZC5cbiIsIHBjMTEwcGFkX2lycSk7Ci0JCXJldHVybiAtRUJVU1k7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CiAJfQogCi0JaWYgKCEocGMxMTBwYWRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCkpKSB7Ci0JCWZyZWVfaXJxKHBjMTEwcGFkX2lycSwgTlVMTCk7Ci0JCXJlbGVhc2VfcmVnaW9uKHBjMTEwcGFkX2lvLCA0KTsKKwlwYzExMHBhZF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXBjMTEwcGFkX2RldikgewogCQlwcmludGsoS0VSTl9FUlIgInBjMTEwcGFkOiBOb3QgZW5vdWdoIG1lbW9yeS5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CiAJfQogCiAJcGMxMTBwYWRfZGV2LT5uYW1lID0gIklCTSBQQzExMCBUb3VjaFBhZCI7CkBAIC0xNTMsOSArMTU0LDIwIEBACiAJcGMxMTBwYWRfZGV2LT5vcGVuID0gcGMxMTBwYWRfb3BlbjsKIAlwYzExMHBhZF9kZXYtPmNsb3NlID0gcGMxMTBwYWRfY2xvc2U7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocGMxMTBwYWRfZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocGMxMTBwYWRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKIAogCXJldHVybiAwOworCisgZXJyX2ZyZWVfZGV2OgorCWlucHV0X2ZyZWVfZGV2aWNlKHBjMTEwcGFkX2Rldik7CisgZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHBjMTEwcGFkX2lycSwgTlVMTCk7CisgZXJyX3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKHBjMTEwcGFkX2lvLCA0KTsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwYzExMHBhZF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwppbmRleCA2ZjliMmM3Li5hMGU0YTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKQEAgLTg4OCw5ICs4ODgsMTAgQEAKICAqIHBzbW91c2VfcmVzeW5jKCkgYXR0ZW1wdHMgdG8gcmUtdmFsaWRhdGUgY3VycmVudCBwcm90b2NvbC4KICAqLwogCi1zdGF0aWMgdm9pZCBwc21vdXNlX3Jlc3luYyh2b2lkICpwKQorc3RhdGljIHZvaWQgcHNtb3VzZV9yZXN5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBwc21vdXNlICpwc21vdXNlID0gcCwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHBzbW91c2UgKnBhcmVudCA9IE5VTEwsICpwc21vdXNlID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwc21vdXNlLCByZXN5bmNfd29yayk7CiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHBzbW91c2UtPnBzMmRldi5zZXJpbzsKIAlwc21vdXNlX3JldF90IHJjID0gUFNNT1VTRV9HT09EX0RBVEE7CiAJaW50IGZhaWxlZCA9IDAsIGVuYWJsZWQgPSAwOwpAQCAtMTEwMiw3ICsxMTAzLDcgQEAKIHsKIAlzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgKnBhcmVudCA9IE5VTEw7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwotCWludCByZXR2YWwgPSAtRU5PTUVNOworCWludCByZXR2YWwgPSAwLCBlcnJvciA9IC1FTk9NRU07CiAKIAltdXRleF9sb2NrKCZwc21vdXNlX211dGV4KTsKIApAQCAtMTExOCwxMCArMTExOSwxMCBAQAogCXBzbW91c2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHNtb3VzZSksIEdGUF9LRVJORUwpOwogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghcHNtb3VzZSB8fCAhaW5wdXRfZGV2KQotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfZnJlZTsKIAogCXBzMl9pbml0KCZwc21vdXNlLT5wczJkZXYsIHNlcmlvKTsKLQlJTklUX1dPUksoJnBzbW91c2UtPnJlc3luY193b3JrLCBwc21vdXNlX3Jlc3luYywgcHNtb3VzZSk7CisJSU5JVF9XT1JLKCZwc21vdXNlLT5yZXN5bmNfd29yaywgcHNtb3VzZV9yZXN5bmMpOwogCXBzbW91c2UtPmRldiA9IGlucHV0X2RldjsKIAlzbnByaW50Zihwc21vdXNlLT5waHlzLCBzaXplb2YocHNtb3VzZS0+cGh5cyksICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CiAKQEAgLTExMjksMTQgKzExMzAsMTMgQEAKIAogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBwc21vdXNlKTsKIAotCXJldHZhbCA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBvdXQ7CisJZXJyb3IgPSBzZXJpb19vcGVuKHNlcmlvLCBkcnYpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfY2xlYXJfZHJ2ZGF0YTsKIAogCWlmIChwc21vdXNlX3Byb2JlKHBzbW91c2UpIDwgMCkgewotCQlzZXJpb19jbG9zZShzZXJpbyk7Ci0JCXJldHZhbCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0OworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2Nsb3NlX3NlcmlvOwogCX0KIAogCXBzbW91c2UtPnJhdGUgPSBwc21vdXNlX3JhdGU7CkBAIC0xMTUwLDMwICsxMTUwLDQ0IEBACiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9DTURfTU9ERSk7CiAJcHNtb3VzZV9pbml0aWFsaXplKHBzbW91c2UpOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHBzbW91c2UtPmRldik7CisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocHNtb3VzZS0+ZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX3Byb3RvY29sX2Rpc2Nvbm5lY3Q7CiAKIAlpZiAocGFyZW50ICYmIHBhcmVudC0+cHRfYWN0aXZhdGUpCiAJCXBhcmVudC0+cHRfYWN0aXZhdGUocGFyZW50KTsKIAotCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc2VyaW8tPmRldi5rb2JqLCAmcHNtb3VzZV9hdHRyaWJ1dGVfZ3JvdXApOworCWVycm9yID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzZXJpby0+ZGV2LmtvYmosICZwc21vdXNlX2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9wdF9kZWFjdGl2YXRlOwogCiAJcHNtb3VzZV9hY3RpdmF0ZShwc21vdXNlKTsKIAotCXJldHZhbCA9IDA7Ci0KLW91dDoKLQlpZiAocmV0dmFsKSB7Ci0JCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJa2ZyZWUocHNtb3VzZSk7Ci0JfQotCisgb3V0OgogCS8qIElmIHRoaXMgaXMgYSBwYXNzLXRocm91Z2ggcG9ydCB0aGUgcGFyZW50IG5lZWRzIHRvIGJlIHJlLWFjdGl2YXRlZCAqLwogCWlmIChwYXJlbnQpCiAJCXBzbW91c2VfYWN0aXZhdGUocGFyZW50KTsKIAogCW11dGV4X3VubG9jaygmcHNtb3VzZV9tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKKworIGVycl9wdF9kZWFjdGl2YXRlOgorCWlmIChwYXJlbnQgJiYgcGFyZW50LT5wdF9kZWFjdGl2YXRlKQorCQlwYXJlbnQtPnB0X2RlYWN0aXZhdGUocGFyZW50KTsKKyBlcnJfcHJvdG9jb2xfZGlzY29ubmVjdDoKKwlpZiAocHNtb3VzZS0+ZGlzY29ubmVjdCkKKwkJcHNtb3VzZS0+ZGlzY29ubmVjdChwc21vdXNlKTsKKwlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lHTk9SRSk7CisgZXJyX2Nsb3NlX3NlcmlvOgorCXNlcmlvX2Nsb3NlKHNlcmlvKTsKKyBlcnJfY2xlYXJfZHJ2ZGF0YToKKwlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CisgZXJyX2ZyZWU6CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwlrZnJlZShwc21vdXNlKTsKKworCXJldHZhbCA9IGVycm9yOworCWdvdG8gb3V0OwogfQogCiAKQEAgLTEzMzYsMTQgKzEzNTAsMTQgQEAKIAogc3RhdGljIHNzaXplX3QgcHNtb3VzZV9zaG93X2ludF9hdHRyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpvZmZzZXQsIGNoYXIgKmJ1ZikKIHsKLQl1bnNpZ25lZCBsb25nICpmaWVsZCA9ICh1bnNpZ25lZCBsb25nICopKChjaGFyICopcHNtb3VzZSArIChzaXplX3Qpb2Zmc2V0KTsKKwl1bnNpZ25lZCBpbnQgKmZpZWxkID0gKHVuc2lnbmVkIGludCAqKSgoY2hhciAqKXBzbW91c2UgKyAoc2l6ZV90KW9mZnNldCk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsICpmaWVsZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsICpmaWVsZCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHBzbW91c2Vfc2V0X2ludF9hdHRyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB2b2lkICpvZmZzZXQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXVuc2lnbmVkIGxvbmcgKmZpZWxkID0gKHVuc2lnbmVkIGxvbmcgKikoKGNoYXIgKilwc21vdXNlICsgKHNpemVfdClvZmZzZXQpOworCXVuc2lnbmVkIGludCAqZmllbGQgPSAodW5zaWduZWQgaW50ICopKChjaGFyICopcHNtb3VzZSArIChzaXplX3Qpb2Zmc2V0KTsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWNoYXIgKnJlc3Q7CiAKQEAgLTEzNTEsNiArMTM2NSw5IEBACiAJaWYgKCpyZXN0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICgodW5zaWduZWQgaW50KXZhbHVlICE9IHZhbHVlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCSpmaWVsZCA9IHZhbHVlOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMTM2NSwxNyArMTM4MiwyMCBAQAogewogCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSBwc21vdXNlLT5wczJkZXYuc2VyaW87CiAJc3RydWN0IHBzbW91c2UgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGlucHV0X2RldiAqbmV3X2RldjsKLQljb25zdCBzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCAqcHJvdG87CisJc3RydWN0IGlucHV0X2RldiAqb2xkX2RldiwgKm5ld19kZXY7CisJY29uc3Qgc3RydWN0IHBzbW91c2VfcHJvdG9jb2wgKnByb3RvLCAqb2xkX3Byb3RvOworCWludCBlcnJvcjsKIAlpbnQgcmV0cnkgPSAwOwogCi0JaWYgKCEocHJvdG8gPSBwc21vdXNlX3Byb3RvY29sX2J5X25hbWUoYnVmLCBjb3VudCkpKQorCXByb3RvID0gcHNtb3VzZV9wcm90b2NvbF9ieV9uYW1lKGJ1ZiwgY291bnQpOworCWlmICghcHJvdG8pCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHBzbW91c2UtPnR5cGUgPT0gcHJvdG8tPnR5cGUpCiAJCXJldHVybiBjb3VudDsKIAotCWlmICghKG5ld19kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKSkpCisJbmV3X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghbmV3X2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl3aGlsZSAoc2VyaW8tPmNoaWxkKSB7CkBAIC0xNDA4LDExICsxNDI4LDEzIEBACiAJCQlwYXJlbnQtPnB0X2RlYWN0aXZhdGUocGFyZW50KTsKIAl9CiAKKwlvbGRfZGV2ID0gcHNtb3VzZS0+ZGV2OworCW9sZF9wcm90byA9IHBzbW91c2VfcHJvdG9jb2xfYnlfdHlwZShwc21vdXNlLT50eXBlKTsKKwogCWlmIChwc21vdXNlLT5kaXNjb25uZWN0KQogCQlwc21vdXNlLT5kaXNjb25uZWN0KHBzbW91c2UpOwogCiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JR05PUkUpOwotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBzbW91c2UtPmRldik7CiAKIAlwc21vdXNlLT5kZXYgPSBuZXdfZGV2OwogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSU5JVElBTElaSU5HKTsKQEAgLTE0MjYsNyArMTQ0OCwyMyBAQAogCXBzbW91c2VfaW5pdGlhbGl6ZShwc21vdXNlKTsKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0NNRF9NT0RFKTsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZShwc21vdXNlLT5kZXYpOworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHBzbW91c2UtPmRldik7CisJaWYgKGVycm9yKSB7CisJCWlmIChwc21vdXNlLT5kaXNjb25uZWN0KQorCQkJcHNtb3VzZS0+ZGlzY29ubmVjdChwc21vdXNlKTsKKworCQlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lHTk9SRSk7CisJCWlucHV0X2ZyZWVfZGV2aWNlKG5ld19kZXYpOworCQlwc21vdXNlLT5kZXYgPSBvbGRfZGV2OworCQlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0lOSVRJQUxJWklORyk7CisJCXBzbW91c2Vfc3dpdGNoX3Byb3RvY29sKHBzbW91c2UsIG9sZF9wcm90byk7CisJCXBzbW91c2VfaW5pdGlhbGl6ZShwc21vdXNlKTsKKwkJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9DTURfTU9ERSk7CisKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKG9sZF9kZXYpOwogCiAJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnB0X2FjdGl2YXRlKQogCQlwYXJlbnQtPnB0X2FjdGl2YXRlKHBhcmVudCk7CkBAIC0xNDg3LDE1ICsxNTI1LDE5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBzbW91c2VfaW5pdCh2b2lkKQogeworCWludCBlcnI7CisKIAlrcHNtb3VzZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3BzbW91c2VkIik7CiAJaWYgKCFrcHNtb3VzZWRfd3EpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwc21vdXNlOiBmYWlsZWQgdG8gY3JlYXRlIGtwc21vdXNlZCB3b3JrcXVldWVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnBzbW91c2VfZHJ2KTsKKwllcnIgPSBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnBzbW91c2VfZHJ2KTsKKwlpZiAoZXJyKQorCQlkZXN0cm95X3dvcmtxdWV1ZShrcHNtb3VzZWRfd3EpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHBzbW91c2VfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9ycGNtb3VzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9ycGNtb3VzZS5jCmluZGV4IGVhMDQ2ODUuLmZiZGNmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcnBjbW91c2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3JwY21vdXNlLmMKQEAgLTY2LDcgKzY2LDEwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHJwY21vdXNlX2luaXQodm9pZCkKIHsKLQlpZiAoIShycGNtb3VzZV9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKSkpCisJaW50IGVycjsKKworCXJwY21vdXNlX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghcnBjbW91c2VfZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJwY21vdXNlX2Rldi0+bmFtZSA9ICJBY29ybiBSaXNjUEMgTW91c2UiOwpAQCAtODUsMTMgKzg4LDIyIEBACiAKIAlpZiAocmVxdWVzdF9pcnEoSVJRX1ZTWU5DUFVMU0UsIHJwY21vdXNlX2lycSwgSVJRRl9TSEFSRUQsICJycGNtb3VzZSIsIHJwY21vdXNlX2RldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJycGNtb3VzZTogdW5hYmxlIHRvIGFsbG9jYXRlIFZTWU5DIGludGVycnVwdFxuIik7Ci0JCWlucHV0X2ZyZWVfZGV2aWNlKHJwY21vdXNlX2Rldik7Ci0JCXJldHVybiAtRUJVU1k7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJfZnJlZV9kZXY7CiAJfQogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHJwY21vdXNlX2Rldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHJwY21vdXNlX2Rldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9pcnE7CiAKIAlyZXR1cm4gMDsKKworIGVycl9mcmVlX2lycToKKwlmcmVlX2lycShJUlFfVlNZTkNQVUxTRSwgcnBjbW91c2VfZGV2KTsKKyBlcnJfZnJlZV9kZXY6CisJaW5wdXRfZnJlZV9kZXZpY2UocnBjbW91c2VfZGV2KTsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBycGNtb3VzZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3Nlcm1vdXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3Nlcm1vdXNlLmMKaW5kZXggMmEyNzJjNS4uYTg1ZDc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zZXJtb3VzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VybW91c2UuYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJc2VybW91c2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VybW91c2UpLCBHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIXNlcm1vdXNlIHx8ICFpbnB1dF9kZXYpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAogCXNlcm1vdXNlLT5kZXYgPSBpbnB1dF9kZXY7CiAJc25wcmludGYoc2VybW91c2UtPnBoeXMsIHNpemVvZihzZXJtb3VzZS0+cGh5cyksICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CkBAIC0yNzUsMTQgKzI3NSwxNyBAQAogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDI7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoc2VybW91c2UtPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHNlcm1vdXNlLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CiAKIAlyZXR1cm4gMDsKIAotIGZhaWw6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWwzOglzZXJpb19jbG9zZShzZXJpbyk7CisgZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShzZXJtb3VzZSk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTM0OCw4ICszNTEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzZXJtb3VzZV9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZzZXJtb3VzZV9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnNlcm1vdXNlX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzZXJtb3VzZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3RyYWNrcG9pbnQuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jCmluZGV4IGFlNTg3MWEuLjlhYjViNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jCkBAIC0yOTMsNiArMjkzLDcgQEAKIAlzdHJ1Y3QgcHMyZGV2ICpwczJkZXYgPSAmcHNtb3VzZS0+cHMyZGV2OwogCXVuc2lnbmVkIGNoYXIgZmlybXdhcmVfaWQ7CiAJdW5zaWduZWQgY2hhciBidXR0b25faW5mbzsKKwlpbnQgZXJyb3I7CiAKIAlpZiAodHJhY2twb2ludF9zdGFydF9wcm90b2NvbChwc21vdXNlLCAmZmlybXdhcmVfaWQpKQogCQlyZXR1cm4gLTE7CkBAIC0zMDUsNyArMzA2LDcgQEAKIAkJYnV0dG9uX2luZm8gPSAwOwogCX0KIAotCXBzbW91c2UtPnByaXZhdGUgPSBwcml2ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyYWNrcG9pbnRfZGF0YSksIEdGUF9LRVJORUwpOworCXBzbW91c2UtPnByaXZhdGUgPSBwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRyYWNrcG9pbnRfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC0xOwogCkBAIC0zMTgsNyArMzE5LDE0IEBACiAJdHJhY2twb2ludF9kZWZhdWx0cyhwcml2KTsKIAl0cmFja3BvaW50X3N5bmMocHNtb3VzZSk7CiAKLQlzeXNmc19jcmVhdGVfZ3JvdXAoJnBzMmRldi0+c2VyaW8tPmRldi5rb2JqLCAmdHJhY2twb2ludF9hdHRyX2dyb3VwKTsKKwllcnJvciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcHMyZGV2LT5zZXJpby0+ZGV2LmtvYmosICZ0cmFja3BvaW50X2F0dHJfZ3JvdXApOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJ0cmFja3BvaW50LmM6IGZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlcywgZXJyb3I6ICVkXG4iLAorCQkJZXJyb3IpOworCQlrZnJlZShwcml2KTsKKwkJcmV0dXJuIC0xOworCX0KIAogCXByaW50ayhLRVJOX0lORk8gIklCTSBUcmFja1BvaW50IGZpcm13YXJlOiAweCUwMngsIGJ1dHRvbnM6ICVkLyVkXG4iLAogCQlmaXJtd2FyZV9pZCwgKGJ1dHRvbl9pbmZvICYgMHhmMCkgPj4gNCwgYnV0dG9uX2luZm8gJiAweDBmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS92c3h4eGFhLmMKaW5kZXggZmZkYjUwZS4uYzNkNjRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS92c3h4eGFhLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS92c3h4eGFhLmMKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCW1vdXNlID0ga3phbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdnN4eHhhYSksIEdGUF9LRVJORUwpOwogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSAoKTsKIAlpZiAoIW1vdXNlIHx8ICFpbnB1dF9kZXYpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAogCW1vdXNlLT5kZXYgPSBpbnB1dF9kZXY7CiAJbW91c2UtPnNlcmlvID0gc2VyaW87CkBAIC01MjcsNyArNTI3LDcgQEAKIAogCWVyciA9IHNlcmlvX29wZW4gKHNlcmlvLCBkcnYpOwogCWlmIChlcnIpCi0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMjsKIAogCS8qCiAJICogUmVxdWVzdCBzZWxmdGVzdC4gU3RhbmRhcmQgcGFja2V0IGZvcm1hdCBhbmQgZGlmZmVyZW50aWFsCkBAIC01MzUsMTIgKzUzNSwxNSBAQAogCSAqLwogCXNlcmlvLT53cml0ZSAoc2VyaW8sICdUJyk7IC8qIFRlc3QgKi8KIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZSAoaW5wdXRfZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UgKGlucHV0X2Rldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMzsKIAogCXJldHVybiAwOwogCi0gZmFpbDoJc2VyaW9fc2V0X2RydmRhdGEgKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9mcmVlX2RldmljZSAoaW5wdXRfZGV2KTsKKyBmYWlsMzoJc2VyaW9fY2xvc2UgKHNlcmlvKTsKKyBmYWlsMjoJc2VyaW9fc2V0X2RydmRhdGEgKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UgKGlucHV0X2Rldik7CiAJa2ZyZWUgKG1vdXNlKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTcxLDggKzU3NCw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogdnN4eHhhYV9pbml0ICh2b2lkKQogewotCXNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmdnN4eHhhYV9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnZzeHh4YWFfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKaW5kZXggYTIyYTc0YS4uNjY0YmNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwpAQCAtMTk2LDEyICsxOTYsMTIgQEAKIAlzd2l0Y2ggKGNvZGUpIHsKIAkJY2FzZSBCVE5fVE9VQ0g6CiAJCWNhc2UgQlROXzA6Ci0JCWNhc2UgQlROX0ZPUldBUkQ6CiAJCWNhc2UgQlROX0xFRlQ6CQlpbmRleCA9IDA7IGJyZWFrOwogCQljYXNlIEJUTl9TVFlMVVM6CiAJCWNhc2UgQlROXzE6CiAJCWNhc2UgQlROX1JJR0hUOgkJaW5kZXggPSAxOyBicmVhazsKIAkJY2FzZSBCVE5fMjoKKwkJY2FzZSBCVE5fRk9SV0FSRDoKIAkJY2FzZSBCVE5fU1RZTFVTMjoKIAkJY2FzZSBCVE5fTUlERExFOglpbmRleCA9IDI7IGJyZWFrOwogCQljYXNlIEJUTl8zOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9oaWxfbWxjLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2hpbF9tbGMuYwppbmRleCBiZGZkZTA0Li40OWUxMWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2hpbF9tbGMuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2hpbF9tbGMuYwpAQCAtMzkxLDIzICszOTEsMjMgQEAKIH0KIAogI2RlZmluZSBGVU5DKGZ1bmN0LCBmdW5jdF9hcmcsIHplcm9fcmMsIG5lZ19yYywgcG9zX3JjKSBcCi17IEhJTFNFX0ZVTkMsCQl7IGZ1bmM6ICZmdW5jdCB9LCBmdW5jdF9hcmcsIHplcm9fcmMsIG5lZ19yYywgcG9zX3JjIH0sCit7IEhJTFNFX0ZVTkMsCQl7IC5mdW5jID0gZnVuY3QgfSwgZnVuY3RfYXJnLCB6ZXJvX3JjLCBuZWdfcmMsIHBvc19yYyB9LAogI2RlZmluZSBPVVQocGFjaykgXAoteyBISUxTRV9PVVQsCQl7IHBhY2tldDogcGFjayB9LCAwLCBISUxTRU5fTkVYVCwgSElMU0VOX0RPWkUsIDAgfSwKK3sgSElMU0VfT1VULAkJeyAucGFja2V0ID0gcGFjayB9LCAwLCBISUxTRU5fTkVYVCwgSElMU0VOX0RPWkUsIDAgfSwKICNkZWZpbmUgQ1RTIFwKLXsgSElMU0VfQ1RTLAkJeyBwYWNrZXQ6IDAgICAgfSwgMCwgSElMU0VOX05FWFQgfCBISUxTRU5fU0NIRUQgfCBISUxTRU5fQlJFQUssIEhJTFNFTl9ET1pFLCAwIH0sCit7IEhJTFNFX0NUUywJCXsgLnBhY2tldCA9IDAgICAgfSwgMCwgSElMU0VOX05FWFQgfCBISUxTRU5fU0NIRUQgfCBISUxTRU5fQlJFQUssIEhJTFNFTl9ET1pFLCAwIH0sCiAjZGVmaW5lIEVYUEVDVChjb21wLCB0bywgZ290LCBnb3Rfd3JvbmcsIHRpbWVkX291dCkgXAoteyBISUxTRV9FWFBFQ1QsCQl7IHBhY2tldDogY29tcCB9LCB0bywgZ290LCBnb3Rfd3JvbmcsIHRpbWVkX291dCB9LAoreyBISUxTRV9FWFBFQ1QsCQl7IC5wYWNrZXQgPSBjb21wIH0sIHRvLCBnb3QsIGdvdF93cm9uZywgdGltZWRfb3V0IH0sCiAjZGVmaW5lIEVYUEVDVF9MQVNUKGNvbXAsIHRvLCBnb3QsIGdvdF93cm9uZywgdGltZWRfb3V0KSBcCi17IEhJTFNFX0VYUEVDVF9MQVNULAl7IHBhY2tldDogY29tcCB9LCB0bywgZ290LCBnb3Rfd3JvbmcsIHRpbWVkX291dCB9LAoreyBISUxTRV9FWFBFQ1RfTEFTVCwJeyAucGFja2V0ID0gY29tcCB9LCB0bywgZ290LCBnb3Rfd3JvbmcsIHRpbWVkX291dCB9LAogI2RlZmluZSBFWFBFQ1RfRElTQyhjb21wLCB0bywgZ290LCBnb3Rfd3JvbmcsIHRpbWVkX291dCkgXAoteyBISUxTRV9FWFBFQ1RfRElTQywJeyBwYWNrZXQ6IGNvbXAgfSwgdG8sIGdvdCwgZ290X3dyb25nLCB0aW1lZF9vdXQgfSwKK3sgSElMU0VfRVhQRUNUX0RJU0MsCXsgLnBhY2tldCA9IGNvbXAgfSwgdG8sIGdvdCwgZ290X3dyb25nLCB0aW1lZF9vdXQgfSwKICNkZWZpbmUgSU4odG8sIGdvdCwgZ290X2Vycm9yLCB0aW1lZF9vdXQpIFwKLXsgSElMU0VfSU4sCQl7IHBhY2tldDogMCAgICB9LCB0bywgZ290LCBnb3RfZXJyb3IsIHRpbWVkX291dCB9LAoreyBISUxTRV9JTiwJCXsgLnBhY2tldCA9IDAgICAgfSwgdG8sIGdvdCwgZ290X2Vycm9yLCB0aW1lZF9vdXQgfSwKICNkZWZpbmUgT1VUX0RJU0MocGFjaykgXAoteyBISUxTRV9PVVRfRElTQywJeyBwYWNrZXQ6IHBhY2sgfSwgMCwgMCwgMCwgMCB9LAoreyBISUxTRV9PVVRfRElTQywJeyAucGFja2V0ID0gcGFjayB9LCAwLCAwLCAwLCAwIH0sCiAjZGVmaW5lIE9VVF9MQVNUKHBhY2spIFwKLXsgSElMU0VfT1VUX0xBU1QsCXsgcGFja2V0OiBwYWNrIH0sIDAsIDAsIDAsIDAgfSwKK3sgSElMU0VfT1VUX0xBU1QsCXsgLnBhY2tldCA9IHBhY2sgfSwgMCwgMCwgMCwgMCB9LAogCiBzdHJ1Y3QgaGlsc2Vfbm9kZSBoaWxfbWxjX3NlW0hJTFNFTl9FTkRdID0gewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2hwX3NkYy5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9ocF9zZGMuYwppbmRleCBiYTdiOTIwLi45OTA3YWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2hwX3NkYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaHBfc2RjLmMKQEAgLTMxMCw3ICszMTAsNyBAQAogCQkJCSAqIGluIHRhc2tsZXQvYmggY29udGV4dC4KIAkJCQkgKi8KIAkJCQlpZiAoY3Vyci0+YWN0LmlycWhvb2spIAotCQkJCQljdXJyLT5hY3QuaXJxaG9vaygwLCAwLCAwLCAwKTsKKwkJCQkJY3Vyci0+YWN0LmlycWhvb2soMCwgTlVMTCwgMCwgMCk7CiAJCQl9CiAJCQljdXJyLT5hY3RpZHggPSBjdXJyLT5pZHg7CiAJCQljdXJyLT5pZHgrKzsKQEAgLTUyNSw3ICs1MjUsNyBAQAogCQl1cChjdXJyLT5hY3Quc2VtYXBob3JlKTsKIAl9CiAJZWxzZSBpZiAoYWN0ICYgSFBfU0RDX0FDVF9DQUxMQkFDSykgewotCQljdXJyLT5hY3QuaXJxaG9vaygwLDAsMCwwKTsKKwkJY3Vyci0+YWN0LmlycWhvb2soMCxOVUxMLDAsMCk7CiAJfQogCWlmIChjdXJyLT5pZHggPj0gY3Vyci0+ZW5kaWR4KSB7IC8qIFRoaXMgdHJhbnNhY3Rpb24gaXMgb3Zlci4gKi8KIAkJaWYgKGFjdCAmIEhQX1NEQ19BQ1RfREVBTExPQykga2ZyZWUoY3Vycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAppbmRleCA4NzM4ZWRkLi5kMzZiZDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKQEAgLTExMSw2ICsxMTEsMTMgQEAKIAkJfSwKIAl9LAogCXsKKwkJLmlkZW50ID0gIkZ1aml0c3UgTGlmZWJvb2sgUDcwMTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICIwMDAwMDAwMDAwIiksCisJCX0sCisJfSwKKwl7CiAJCS5pZGVudCA9ICJGdWppdHN1IExpZmVib29rIFA1MDIwRCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCmluZGV4IDA5YjA2ZTYuLmRlYmU5NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKQEAgLTEwNiw2ICsxMDYsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTgwNDJfbXV4X3ByZXNlbnQ7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpODA0Ml9rYmRfaXJxX3JlZ2lzdGVyZWQ7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpODA0Ml9hdXhfaXJxX3JlZ2lzdGVyZWQ7CitzdGF0aWMgdW5zaWduZWQgY2hhciBpODA0Ml9zdXBwcmVzc19rYmRfYWNrOwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmk4MDQyX3BsYXRmb3JtX2RldmljZTsKIAogc3RhdGljIGlycXJldHVybl90IGk4MDQyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpAQCAtMjU0LDI1ICsyNTUsMTAgQEAKIHN0YXRpYyBpbnQgaTgwNDJfYXV4X3dyaXRlKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgYykKIHsKIAlzdHJ1Y3QgaTgwNDJfcG9ydCAqcG9ydCA9IHNlcmlvLT5wb3J0X2RhdGE7Ci0JaW50IHJldHZhbDsKIAotLyoKLSAqIFNlbmQgdGhlIGJ5dGUgb3V0LgotICovCi0KLQlpZiAocG9ydC0+bXV4ID09IC0xKQotCQlyZXR2YWwgPSBpODA0Ml9jb21tYW5kKCZjLCBJODA0Ml9DTURfQVVYX1NFTkQpOwotCWVsc2UKLQkJcmV0dmFsID0gaTgwNDJfY29tbWFuZCgmYywgSTgwNDJfQ01EX01VWF9TRU5EICsgcG9ydC0+bXV4KTsKLQotLyoKLSAqIE1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGhhcHBlbnMgYW5kIHRoZSBjaGFyYWN0ZXIgaXMgcmVjZWl2ZWQgZXZlbgotICogaW4gdGhlIGNhc2UgdGhlIElSUSBpc24ndCB3aXJlZCwgc28gdGhhdCB3ZSBjYW4gcmVjZWl2ZSBmdXJ0aGVyCi0gKiBjaGFyYWN0ZXJzIGxhdGVyLgotICovCi0KLQlpODA0Ml9pbnRlcnJ1cHQoMCwgTlVMTCk7Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gaTgwNDJfY29tbWFuZCgmYywgcG9ydC0+bXV4ID09IC0xID8KKwkJCQkJSTgwNDJfQ01EX0FVWF9TRU5EIDoKKwkJCQkJSTgwNDJfQ01EX01VWF9TRU5EICsgcG9ydC0+bXV4KTsKIH0KIAogLyoKQEAgLTMxNiw3ICszMDIsNyBAQAogCXVuc2lnbmVkIGNoYXIgc3RyLCBkYXRhOwogCXVuc2lnbmVkIGludCBkZmw7CiAJdW5zaWduZWQgaW50IHBvcnRfbm87Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpODA0Ml9sb2NrLCBmbGFncyk7CiAJc3RyID0gaTgwNDJfcmVhZF9zdGF0dXMoKTsKQEAgLTMzNiwyMyArMzIyLDI3IEBACiAJCWRmbCA9IDA7CiAJCWlmIChzdHIgJiBJODA0Ml9TVFJfTVVYRVJSKSB7CiAJCQlkYmcoIk1VWCBlcnJvciwgc3RhdHVzIGlzICUwMngsIGRhdGEgaXMgJTAyeCIsIHN0ciwgZGF0YSk7Ci0JCQlzd2l0Y2ggKGRhdGEpIHsKLQkJCQlkZWZhdWx0OgogLyoKICAqIFdoZW4gTVVYRVJSIGNvbmRpdGlvbiBpcyBzaWduYWxsZWQgdGhlIGRhdGEgcmVnaXN0ZXIgY2FuIG9ubHkgY29udGFpbgogICogMHhmZCwgMHhmZSBvciAweGZmIGlmIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIHNwZWMuIFVuZm9ydHVuYXRlbHkKLSAqIGl0IGlzIG5vdCBhbHdheXMgdGhlIGNhc2UuIFNvbWUgS0JDIGp1c3QgZ2V0IGNvbmZ1c2VkIHdoaWNoIHBvcnQgdGhlCi0gKiBkYXRhIGNhbWUgZnJvbSBhbmQgc2lnbmFsIGVycm9yIGxlYXZpbmcgdGhlIGRhdGEgaW50YWN0LiBUaGV5IF9kbyBub3RfCi0gKiByZXZlcnQgdG8gbGVnYWN5IG1vZGUgKGFjdHVhbGx5IEkndmUgbmV2ZXIgc2VlbiBLQkMgcmV2ZXJ0aW5nIHRvIGxlZ2FjeQotICogbW9kZSB5ZXQsIHdoZW4gd2Ugc2VlIG9uZSB3ZSdsbCBhZGQgcHJvcGVyIGhhbmRsaW5nKS4KLSAqIEFueXdheSwgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUgZGF0YSBjYW1lIGZyb20gdGhlIHNhbWUgc2VyaW8gbGFzdCBieXRlCisgKiBpdCBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLiBTb21lIEtCQ3MgYWxzbyByZXBvcnQgMHhmYyB3aGVuIHRoZXJlIGlzCisgKiBub3RoaW5nIGNvbm5lY3RlZCB0byB0aGUgcG9ydCB3aGlsZSBvdGhlcnMgc29tZXRpbWVzIGdldCBjb25mdXNlZCB3aGljaAorICogcG9ydCB0aGUgZGF0YSBjYW1lIGZyb20gYW5kIHNpZ25hbCBlcnJvciBsZWF2aW5nIHRoZSBkYXRhIGludGFjdC4gVGhleQorICogX2RvIG5vdF8gcmV2ZXJ0IHRvIGxlZ2FjeSBtb2RlIChhY3R1YWxseSBJJ3ZlIG5ldmVyIHNlZW4gS0JDIHJldmVydGluZworICogdG8gbGVnYWN5IG1vZGUgeWV0LCB3aGVuIHdlIHNlZSBvbmUgd2UnbGwgYWRkIHByb3BlciBoYW5kbGluZykuCisgKiBBbnl3YXksIHdlIHByb2Nlc3MgMHhmYywgMHhmZCwgMHhmZSBhbmQgMHhmZiBhcyB0aW1lb3V0cywgYW5kIGZvciB0aGUKKyAqIHJlc3QgYXNzdW1lIHRoYXQgdGhlIGRhdGEgY2FtZSBmcm9tIHRoZSBzYW1lIHNlcmlvIGxhc3QgYnl0ZQogICogd2FzIHRyYW5zbWl0dGVkIChpZiB0cmFuc21pc3Npb24gaGFwcGVuZWQgbm90IHRvbyBsb25nIGFnbykuCiAgKi8KKworCQkJc3dpdGNoIChkYXRhKSB7CisJCQkJZGVmYXVsdDoKIAkJCQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGxhc3RfdHJhbnNtaXQgKyBIWi8xMCkpIHsKIAkJCQkJCXN0ciA9IGxhc3Rfc3RyOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJLyogZmFsbCB0aHJvdWdoIC0gcmVwb3J0IHRpbWVvdXQgKi8KKwkJCQljYXNlIDB4ZmM6CiAJCQkJY2FzZSAweGZkOgogCQkJCWNhc2UgMHhmZTogZGZsID0gU0VSSU9fVElNRU9VVDsgZGF0YSA9IDB4ZmU7IGJyZWFrOwogCQkJCWNhc2UgMHhmZjogZGZsID0gU0VSSU9fUEFSSVRZOyAgZGF0YSA9IDB4ZmU7IGJyZWFrOwpAQCAtMzc4LDEwICszNjgsMTYgQEAKIAkgICAgZGZsICYgU0VSSU9fUEFSSVRZID8gIiwgYmFkIHBhcml0eSIgOiAiIiwKIAkgICAgZGZsICYgU0VSSU9fVElNRU9VVCA/ICIsIHRpbWVvdXQiIDogIiIpOwogCisJaWYgKHVubGlrZWx5KGk4MDQyX3N1cHByZXNzX2tiZF9hY2spKQorCQlpZiAocG9ydF9ubyA9PSBJODA0Ml9LQkRfUE9SVF9OTyAmJgorCQkgICAgKGRhdGEgPT0gMHhmYSB8fCBkYXRhID09IDB4ZmUpKSB7CisJCQlpODA0Ml9zdXBwcmVzc19rYmRfYWNrID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisKIAlpZiAobGlrZWx5KHBvcnQtPmV4aXN0cykpCiAJCXNlcmlvX2ludGVycnVwdChwb3J0LT5zZXJpbywgZGF0YSwgZGZsKTsKIAotCXJldCA9IDE7CiAgb3V0OgogCXJldHVybiBJUlFfUkVUVkFMKHJldCk7CiB9CkBAIC04NDIsMTEgKzgzOCwxMyBAQAogCWxlZCBePSAweDAxIHwgMHgwNDsKIAl3aGlsZSAoaTgwNDJfcmVhZF9zdGF0dXMoKSAmIEk4MDQyX1NUUl9JQkYpCiAJCURFTEFZOworCWk4MDQyX3N1cHByZXNzX2tiZF9hY2sgPSAxOwogCWk4MDQyX3dyaXRlX2RhdGEoMHhlZCk7IC8qIHNldCBsZWRzICovCiAJREVMQVk7CiAJd2hpbGUgKGk4MDQyX3JlYWRfc3RhdHVzKCkgJiBJODA0Ml9TVFJfSUJGKQogCQlERUxBWTsKIAlERUxBWTsKKwlpODA0Ml9zdXBwcmVzc19rYmRfYWNrID0gMTsKIAlpODA0Ml93cml0ZV9kYXRhKGxlZCk7CiAJREVMQVk7CiAJbGFzdF9ibGluayA9IGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKaW5kZXggZGNiMTZiNS4uYjNlODRkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCkBAIC0xODksNyArMTg5LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCW11dGV4X2xvY2tfbmVzdGVkKCZwczJkZXYtPmNtZF9tdXRleCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCW11dGV4X2xvY2soJnBzMmRldi0+Y21kX211dGV4KTsKIAogCXNlcmlvX3BhdXNlX3J4KHBzMmRldi0+c2VyaW8pOwogCXBzMmRldi0+ZmxhZ3MgPSBjb21tYW5kID09IFBTMl9DTURfR0VUSUQgPyBQUzJfRkxBR19XQUlUSUQgOiAwOwpAQCAtMjUxLDkgKzI1MSw5IEBACiAgKiBwczJfc2NoZWR1bGVfY29tbWFuZCgpLCB0byBhIFBTLzIgZGV2aWNlIChrZXlib2FyZCwgbW91c2UsIGV0Yy4pCiAgKi8KIAotc3RhdGljIHZvaWQgcHMyX2V4ZWN1dGVfc2NoZWR1bGVkX2NvbW1hbmQodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHBzMl9leGVjdXRlX3NjaGVkdWxlZF9jb21tYW5kKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcHMyd29yayAqcHMyd29yayA9IGRhdGE7CisJc3RydWN0IHBzMndvcmsgKnBzMndvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBzMndvcmssIHdvcmspOwogCiAJcHMyX2NvbW1hbmQocHMyd29yay0+cHMyZGV2LCBwczJ3b3JrLT5wYXJhbSwgcHMyd29yay0+Y29tbWFuZCk7CiAJa2ZyZWUocHMyd29yayk7CkBAIC0yNzgsNyArMjc4LDcgQEAKIAlwczJ3b3JrLT5wczJkZXYgPSBwczJkZXY7CiAJcHMyd29yay0+Y29tbWFuZCA9IGNvbW1hbmQ7CiAJbWVtY3B5KHBzMndvcmstPnBhcmFtLCBwYXJhbSwgc2VuZCk7Ci0JSU5JVF9XT1JLKCZwczJ3b3JrLT53b3JrLCBwczJfZXhlY3V0ZV9zY2hlZHVsZWRfY29tbWFuZCwgcHMyd29yayk7CisJSU5JVF9XT1JLKCZwczJ3b3JrLT53b3JrLCBwczJfZXhlY3V0ZV9zY2hlZHVsZWRfY29tbWFuZCk7CiAKIAlpZiAoIXNjaGVkdWxlX3dvcmsoJnBzMndvcmstPndvcmspKSB7CiAJCWtmcmVlKHBzMndvcmspOwpAQCAtMjk2LDYgKzI5Niw3IEBACiB2b2lkIHBzMl9pbml0KHN0cnVjdCBwczJkZXYgKnBzMmRldiwgc3RydWN0IHNlcmlvICpzZXJpbykKIHsKIAltdXRleF9pbml0KCZwczJkZXYtPmNtZF9tdXRleCk7CisJbG9ja2RlcF9zZXRfc3ViY2xhc3MoJnBzMmRldi0+Y21kX211dGV4LCBzZXJpby0+ZGVwdGgpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBzMmRldi0+d2FpdCk7CiAJcHMyZGV2LT5zZXJpbyA9IHNlcmlvOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCmluZGV4IDk2MGZhZTMuLmYwY2U4MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiBNT0RVTEVfQVVUSE9SKCJWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEB1Y3cuY3o+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNlcmlvIGFic3RyYWN0aW9uIGNvcmUiKTsKQEAgLTQ0LDggKzQ1LDcgQEAKIEVYUE9SVF9TWU1CT0woX19zZXJpb19yZWdpc3Rlcl9wb3J0KTsKIEVYUE9SVF9TWU1CT0woc2VyaW9fdW5yZWdpc3Rlcl9wb3J0KTsKIEVYUE9SVF9TWU1CT0woc2VyaW9fdW5yZWdpc3Rlcl9jaGlsZF9wb3J0KTsKLUVYUE9SVF9TWU1CT0woX19zZXJpb191bnJlZ2lzdGVyX3BvcnRfZGVsYXllZCk7Ci1FWFBPUlRfU1lNQk9MKF9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0woc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKTsKIEVYUE9SVF9TWU1CT0woc2VyaW9fdW5yZWdpc3Rlcl9kcml2ZXIpOwogRVhQT1JUX1NZTUJPTChzZXJpb19vcGVuKTsKIEVYUE9SVF9TWU1CT0woc2VyaW9fY2xvc2UpOwpAQCAtNjIsMTEgKzYyLDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc2VyaW9fYnVzOwogCi1zdGF0aWMgdm9pZCBzZXJpb19hZGRfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydik7CiBzdGF0aWMgdm9pZCBzZXJpb19hZGRfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKLXN0YXRpYyB2b2lkIHNlcmlvX2Rlc3Ryb3lfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKIHN0YXRpYyB2b2lkIHNlcmlvX3JlY29ubmVjdF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOwogc3RhdGljIHZvaWQgc2VyaW9fZGlzY29ubmVjdF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOworc3RhdGljIHZvaWQgc2VyaW9fYXR0YWNoX2RyaXZlcihzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpOwogCiBzdGF0aWMgaW50IHNlcmlvX2Nvbm5lY3RfZHJpdmVyKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydikKIHsKQEAgLTExOCw2ICsxMTcsOCBAQAogCiBzdGF0aWMgdm9pZCBzZXJpb19iaW5kX2RyaXZlcihzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCiB7CisJaW50IGVycm9yOworCiAJZG93bl93cml0ZSgmc2VyaW9fYnVzLnN1YnN5cy5yd3NlbSk7CiAKIAlpZiAoc2VyaW9fbWF0Y2hfcG9ydChkcnYtPmlkX3RhYmxlLCBzZXJpbykpIHsKQEAgLTEyNiw5ICsxMjcsMTkgQEAKIAkJCXNlcmlvLT5kZXYuZHJpdmVyID0gTlVMTDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWRldmljZV9iaW5kX2RyaXZlcigmc2VyaW8tPmRldik7CisJCWVycm9yID0gZGV2aWNlX2JpbmRfZHJpdmVyKCZzZXJpby0+ZGV2KTsKKwkJaWYgKGVycm9yKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJInNlcmlvOiBkZXZpY2VfYmluZF9kcml2ZXIoKSBmYWlsZWQgIgorCQkJCSJmb3IgJXMgKCVzKSBhbmQgJXMsIGVycm9yOiAlZFxuIiwKKwkJCQlzZXJpby0+cGh5cywgc2VyaW8tPm5hbWUsCisJCQkJZHJ2LT5kZXNjcmlwdGlvbiwgZXJyb3IpOworCQkJc2VyaW9fZGlzY29ubmVjdF9kcml2ZXIoc2VyaW8pOworCQkJc2VyaW8tPmRldi5kcml2ZXIgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KIAl9Ci1vdXQ6Cisgb3V0OgogCXVwX3dyaXRlKCZzZXJpb19idXMuc3Vic3lzLnJ3c2VtKTsKIH0KIApAQCAtMTU4LDExICsxNjksMTAgQEAKICAqLwogCiBlbnVtIHNlcmlvX2V2ZW50X3R5cGUgewotCVNFUklPX1JFU0NBTiwKLQlTRVJJT19SRUNPTk5FQ1QsCisJU0VSSU9fUkVTQ0FOX1BPUlQsCisJU0VSSU9fUkVDT05ORUNUX1BPUlQsCiAJU0VSSU9fUkVHSVNURVJfUE9SVCwKLQlTRVJJT19VTlJFR0lTVEVSX1BPUlQsCi0JU0VSSU9fUkVHSVNURVJfRFJJVkVSLAorCVNFUklPX0FUVEFDSF9EUklWRVIsCiB9OwogCiBzdHJ1Y3Qgc2VyaW9fZXZlbnQgewpAQCAtMTc3LDExICsxODcsMTIgQEAKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChzZXJpb193YWl0KTsKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlcmlvX3Rhc2s7CiAKLXN0YXRpYyB2b2lkIHNlcmlvX3F1ZXVlX2V2ZW50KHZvaWQgKm9iamVjdCwgc3RydWN0IG1vZHVsZSAqb3duZXIsCi0JCQkgICAgICBlbnVtIHNlcmlvX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSkKK3N0YXRpYyBpbnQgc2VyaW9fcXVldWVfZXZlbnQodm9pZCAqb2JqZWN0LCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCSAgICAgZW51bSBzZXJpb19ldmVudF90eXBlIGV2ZW50X3R5cGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2VyaW9fZXZlbnQgKmV2ZW50OworCWludCByZXR2YWwgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcmlvX2V2ZW50X2xvY2ssIGZsYWdzKTsKIApAQCAtMjAwLDI0ICsyMTEsMzQgQEAKIAkJfQogCX0KIAotCWlmICgoZXZlbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VyaW9fZXZlbnQpLCBHRlBfQVRPTUlDKSkpIHsKLQkJaWYgKCF0cnlfbW9kdWxlX2dldChvd25lcikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNlcmlvOiBDYW4ndCBnZXQgbW9kdWxlIHJlZmVyZW5jZSwgZHJvcHBpbmcgZXZlbnQgJWRcbiIsIGV2ZW50X3R5cGUpOwotCQkJa2ZyZWUoZXZlbnQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlldmVudC0+dHlwZSA9IGV2ZW50X3R5cGU7Ci0JCWV2ZW50LT5vYmplY3QgPSBvYmplY3Q7Ci0JCWV2ZW50LT5vd25lciA9IG93bmVyOwotCi0JCWxpc3RfYWRkX3RhaWwoJmV2ZW50LT5ub2RlLCAmc2VyaW9fZXZlbnRfbGlzdCk7Ci0JCXdha2VfdXAoJnNlcmlvX3dhaXQpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2VyaW86IE5vdCBlbm91Z2ggbWVtb3J5IHRvIHF1ZXVlIGV2ZW50ICVkXG4iLCBldmVudF90eXBlKTsKKwlldmVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXJpb19ldmVudCksIEdGUF9BVE9NSUMpOworCWlmICghZXZlbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkic2VyaW86IE5vdCBlbm91Z2ggbWVtb3J5IHRvIHF1ZXVlIGV2ZW50ICVkXG4iLAorCQkJZXZlbnRfdHlwZSk7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KKworCWlmICghdHJ5X21vZHVsZV9nZXQob3duZXIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJzZXJpbzogQ2FuJ3QgZ2V0IG1vZHVsZSByZWZlcmVuY2UsIGRyb3BwaW5nIGV2ZW50ICVkXG4iLAorCQkJZXZlbnRfdHlwZSk7CisJCWtmcmVlKGV2ZW50KTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZXZlbnQtPnR5cGUgPSBldmVudF90eXBlOworCWV2ZW50LT5vYmplY3QgPSBvYmplY3Q7CisJZXZlbnQtPm93bmVyID0gb3duZXI7CisKKwlsaXN0X2FkZF90YWlsKCZldmVudC0+bm9kZSwgJnNlcmlvX2V2ZW50X2xpc3QpOworCXdha2VfdXAoJnNlcmlvX3dhaXQpOworCiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VyaW9fZXZlbnRfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIHNlcmlvX2ZyZWVfZXZlbnQoc3RydWN0IHNlcmlvX2V2ZW50ICpldmVudCkKQEAgLTI5NSwyMiArMzE2LDE3IEBACiAJCQkJc2VyaW9fYWRkX3BvcnQoZXZlbnQtPm9iamVjdCk7CiAJCQkJYnJlYWs7CiAKLQkJCWNhc2UgU0VSSU9fVU5SRUdJU1RFUl9QT1JUOgotCQkJCXNlcmlvX2Rpc2Nvbm5lY3RfcG9ydChldmVudC0+b2JqZWN0KTsKLQkJCQlzZXJpb19kZXN0cm95X3BvcnQoZXZlbnQtPm9iamVjdCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU0VSSU9fUkVDT05ORUNUOgorCQkJY2FzZSBTRVJJT19SRUNPTk5FQ1RfUE9SVDoKIAkJCQlzZXJpb19yZWNvbm5lY3RfcG9ydChldmVudC0+b2JqZWN0KTsKIAkJCQlicmVhazsKIAotCQkJY2FzZSBTRVJJT19SRVNDQU46CisJCQljYXNlIFNFUklPX1JFU0NBTl9QT1JUOgogCQkJCXNlcmlvX2Rpc2Nvbm5lY3RfcG9ydChldmVudC0+b2JqZWN0KTsKIAkJCQlzZXJpb19maW5kX2RyaXZlcihldmVudC0+b2JqZWN0KTsKIAkJCQlicmVhazsKIAotCQkJY2FzZSBTRVJJT19SRUdJU1RFUl9EUklWRVI6Ci0JCQkJc2VyaW9fYWRkX2RyaXZlcihldmVudC0+b2JqZWN0KTsKKwkJCWNhc2UgU0VSSU9fQVRUQUNIX0RSSVZFUjoKKwkJCQlzZXJpb19hdHRhY2hfZHJpdmVyKGV2ZW50LT5vYmplY3QpOwogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgpAQCAtNTM4LDggKzU1NCwxMiBAQAogCQkgInNlcmlvJWxkIiwgKGxvbmcpYXRvbWljX2luY19yZXR1cm4oJnNlcmlvX25vKSAtIDEpOwogCXNlcmlvLT5kZXYuYnVzID0gJnNlcmlvX2J1czsKIAlzZXJpby0+ZGV2LnJlbGVhc2UgPSBzZXJpb19yZWxlYXNlX3BvcnQ7Ci0JaWYgKHNlcmlvLT5wYXJlbnQpCisJaWYgKHNlcmlvLT5wYXJlbnQpIHsKIAkJc2VyaW8tPmRldi5wYXJlbnQgPSAmc2VyaW8tPnBhcmVudC0+ZGV2OworCQlzZXJpby0+ZGVwdGggPSBzZXJpby0+cGFyZW50LT5kZXB0aCArIDE7CisJfSBlbHNlCisJCXNlcmlvLT5kZXB0aCA9IDA7CisJbG9ja2RlcF9zZXRfc3ViY2xhc3MoJnNlcmlvLT5sb2NrLCBzZXJpby0+ZGVwdGgpOwogfQogCiAvKgpAQCAtNjU4LDEyICs2NzgsMTIgQEAKIAogdm9pZCBzZXJpb19yZXNjYW4oc3RydWN0IHNlcmlvICpzZXJpbykKIHsKLQlzZXJpb19xdWV1ZV9ldmVudChzZXJpbywgTlVMTCwgU0VSSU9fUkVTQ0FOKTsKKwlzZXJpb19xdWV1ZV9ldmVudChzZXJpbywgTlVMTCwgU0VSSU9fUkVTQ0FOX1BPUlQpOwogfQogCiB2b2lkIHNlcmlvX3JlY29ubmVjdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQogewotCXNlcmlvX3F1ZXVlX2V2ZW50KHNlcmlvLCBOVUxMLCBTRVJJT19SRUNPTk5FQ1QpOworCXNlcmlvX3F1ZXVlX2V2ZW50KHNlcmlvLCBOVUxMLCBTRVJJT19SRUNPTk5FQ1RfUE9SVCk7CiB9CiAKIC8qCkBAIC03MDAsMTYgKzcyMCw2IEBACiAJbXV0ZXhfdW5sb2NrKCZzZXJpb19tdXRleCk7CiB9CiAKLS8qCi0gKiBTdWJtaXRzIHJlZ2lzdGVyIHJlcXVlc3QgdG8ga3NlcmlvZCBmb3Igc3Vic2VxdWVudCBleGVjdXRpb24uCi0gKiBDYW4gYmUgdXNlZCB3aGVuIGl0IGlzIG5vdCBvYnZpb3VzIHdoZXRoZXIgdGhlIHNlcmlvX211dGV4IGlzCi0gKiB0YWtlbiBvciBub3QgYW5kIHdoZW4gZGVsYXllZCBleGVjdXRpb24gaXMgZmVhc2libGUuCi0gKi8KLXZvaWQgX19zZXJpb191bnJlZ2lzdGVyX3BvcnRfZGVsYXllZChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKLXsKLQlzZXJpb19xdWV1ZV9ldmVudChzZXJpbywgb3duZXIsIFNFUklPX1VOUkVHSVNURVJfUE9SVCk7Ci19Ci0KIAogLyoKICAqIFNlcmlvIGRyaXZlciBvcGVyYXRpb25zCkBAIC03NjgsMjggKzc3OCw1MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIHNlcmlvX2J1cyA9IHsKLQkubmFtZSA9CSJzZXJpbyIsCi0JLnByb2JlID0gc2VyaW9fZHJpdmVyX3Byb2JlLAotCS5yZW1vdmUgPSBzZXJpb19kcml2ZXJfcmVtb3ZlLAotfTsKLQotc3RhdGljIHZvaWQgc2VyaW9fYWRkX2RyaXZlcihzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCitzdGF0aWMgdm9pZCBzZXJpb19hdHRhY2hfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydikKIHsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworCWVycm9yID0gZHJpdmVyX2F0dGFjaCgmZHJ2LT5kcml2ZXIpOwogCWlmIChlcnJvcikKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkic2VyaW86IGRyaXZlcl9yZWdpc3RlcigpIGZhaWxlZCBmb3IgJXMsIGVycm9yOiAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJInNlcmlvOiBkcml2ZXJfYXR0YWNoKCkgZmFpbGVkIGZvciAlcyB3aXRoIGVycm9yICVkXG4iLAogCQkJZHJ2LT5kcml2ZXIubmFtZSwgZXJyb3IpOwogfQogCi12b2lkIF9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpCitpbnQgc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydikKIHsKKwlpbnQgbWFudWFsX2JpbmQgPSBkcnYtPm1hbnVhbF9iaW5kOworCWludCBlcnJvcjsKKwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZzZXJpb19idXM7CiAKLQlzZXJpb19xdWV1ZV9ldmVudChkcnYsIG93bmVyLCBTRVJJT19SRUdJU1RFUl9EUklWRVIpOworCS8qCisJICogVGVtcG9yYXJpbHkgZGlzYWJsZSBhdXRvbWF0aWMgYmluZGluZyBiZWNhdXNlIHByb2JpbmcKKwkgKiB0YWtlcyBsb25nIHRpbWUgYW5kIHdlIGFyZSBiZXR0ZXIgb2ZmIGRvaW5nIGl0IGluIGtzZXJpb2QKKwkgKi8KKwlkcnYtPm1hbnVhbF9iaW5kID0gMTsKKworCWVycm9yID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJInNlcmlvOiBkcml2ZXJfcmVnaXN0ZXIoKSBmYWlsZWQgZm9yICVzLCBlcnJvcjogJWRcbiIsCisJCQlkcnYtPmRyaXZlci5uYW1lLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKgorCSAqIFJlc3RvcmUgb3JpZ2luYWwgYmluZCBtb2RlIGFuZCBsZXQga3NlcmlvZCBiaW5kIHRoZQorCSAqIGRyaXZlciB0byBmcmVlIHBvcnRzCisJICovCisJaWYgKCFtYW51YWxfYmluZCkgeworCQlkcnYtPm1hbnVhbF9iaW5kID0gMDsKKwkJZXJyb3IgPSBzZXJpb19xdWV1ZV9ldmVudChkcnYsIE5VTEwsIFNFUklPX0FUVEFDSF9EUklWRVIpOworCQlpZiAoZXJyb3IpIHsKKwkJCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBzZXJpb191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCkBAIC05MzAsMTUgKzk2NCwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc2VyaW9fYnVzID0geworCS5uYW1lCQk9ICJzZXJpbyIsCisJLmRldl9hdHRycwk9IHNlcmlvX2RldmljZV9hdHRycywKKwkuZHJ2X2F0dHJzCT0gc2VyaW9fZHJpdmVyX2F0dHJzLAorCS5tYXRjaAkJPSBzZXJpb19idXNfbWF0Y2gsCisJLnVldmVudAkJPSBzZXJpb191ZXZlbnQsCisJLnByb2JlCQk9IHNlcmlvX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlCQk9IHNlcmlvX2RyaXZlcl9yZW1vdmUsCisJLnJlc3VtZQkJPSBzZXJpb19yZXN1bWUsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBzZXJpb19pbml0KHZvaWQpCiB7CiAJaW50IGVycm9yOwogCi0Jc2VyaW9fYnVzLmRldl9hdHRycyA9IHNlcmlvX2RldmljZV9hdHRyczsKLQlzZXJpb19idXMuZHJ2X2F0dHJzID0gc2VyaW9fZHJpdmVyX2F0dHJzOwotCXNlcmlvX2J1cy5tYXRjaCA9IHNlcmlvX2J1c19tYXRjaDsKLQlzZXJpb19idXMudWV2ZW50ID0gc2VyaW9fdWV2ZW50OwotCXNlcmlvX2J1cy5yZXN1bWUgPSBzZXJpb19yZXN1bWU7CiAJZXJyb3IgPSBidXNfcmVnaXN0ZXIoJnNlcmlvX2J1cyk7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic2VyaW86IGZhaWxlZCB0byByZWdpc3RlciBzZXJpbyBidXMsIGVycm9yOiAlZFxuIiwgZXJyb3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW9fcmF3LmMKaW5kZXggYmEyYTIwMy4uMDg4ZWJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpb19yYXcuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvX3Jhdy5jCkBAIC0yOTcsNyArMjk3LDcgQEAKIAogCXNlcmlvX3Jhdy0+ZGV2Lm1pbm9yID0gUFNNT1VTRV9NSU5PUjsKIAlzZXJpb19yYXctPmRldi5uYW1lID0gc2VyaW9fcmF3LT5uYW1lOwotCXNlcmlvX3Jhdy0+ZGV2LmRldiA9ICZzZXJpby0+ZGV2OworCXNlcmlvX3Jhdy0+ZGV2LnBhcmVudCA9ICZzZXJpby0+ZGV2OwogCXNlcmlvX3Jhdy0+ZGV2LmZvcHMgPSAmc2VyaW9fcmF3X2ZvcHM7CiAKIAllcnIgPSBtaXNjX3JlZ2lzdGVyKCZzZXJpb19yYXctPmRldik7CkBAIC0zODksOCArMzg5LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2VyaW9fcmF3X2luaXQodm9pZCkKIHsKLQlzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnNlcmlvX3Jhd19kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnNlcmlvX3Jhd19kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2VyaW9fcmF3X2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwppbmRleCA5NDE4YmJlLi42YjQ2YzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCkBAIC0xNDQsNCArMTQ0LDE5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0b3VjaHdpbi4KIAorY29uZmlnIFRPVUNIU0NSRUVOX1VDQjE0MDAKKwl0cmlzdGF0ZSAiUGhpbGlwcyBVQ0IxNDAwIHRvdWNoc2NyZWVuIgorCXNlbGVjdCBBQzk3X0JVUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUGhpbGlwcyBVQ0IxNDAwIHRvdWNoc2NyZWVuIGludGVyZmFjZS4KKwkgIFRoZSBVQ0IxNDAwIGlzIGFuIEFDOTcgYXVkaW8gY29kZWMuICBUaGUgdG91Y2hzY3JlZW4gaW50ZXJmYWNlCisJICB3aWxsIGJlIGluaXRpYWxpemVkIG9ubHkgYWZ0ZXIgdGhlIEFMU0Egc3Vic3lzdGVtIGhhcyBiZWVuCisJICBicm91Z2h0IHVwIGFuZCB0aGUgVUNCMTQwMCBkZXRlY3RlZC4gIFlvdSB0aGVyZWZvcmUgaGF2ZSB0bworCSAgY29uZmlndXJlIEFMU0Egc3VwcG9ydCBhcyB3ZWxsIChlaXRoZXIgYnVpbHQtaW4gb3IgbW9kdWxhciwKKwkgIGluZGVwZW5kZW50bHkgb2Ygd2hldGhlciB0aGlzIGRyaXZlciBpcyBpdHNlbGYgYnVpbHQtaW4gb3IKKwkgIG1vZHVsYXIpIGZvciB0aGlzIGRyaXZlciB0byB3b3JrLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1Y2IxNDAwX3RzLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKaW5kZXggMWFiYjhmMS4uMzBlNmUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCkBAIC0xNSwzICsxNSw0IEBACiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fUEVOTU9VTlQpCSs9IHBlbm1vdW50Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUKQkrPSB0b3VjaHJpZ2h0Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTikJKz0gdG91Y2h3aW4ubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDApCSs9IHVjYjE0MDBfdHMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwppbmRleCBmNTZkNmEwLi5jNjE2NGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwpAQCAtNzYsNiArNzYsNyBAQAogCWNoYXIJCQlwaHlzWzMyXTsKIAogCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CisJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkqYXR0cl9ncm91cDsKIAl1MTYJCQltb2RlbDsKIAl1MTYJCQl2cmVmX2RlbGF5X3VzZWNzOwogCXUxNgkJCXhfcGxhdGVfb2htczsKQEAgLTE4OSw3ICsxOTAsNyBAQAogewogCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAJc3RydWN0IGFkczc4NDYJCSp0cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzZXJfcmVxCQkqcmVxID0ga3phbGxvYyhzaXplb2YgKnJlcSwgU0xBQl9LRVJORUwpOworCXN0cnVjdCBzZXJfcmVxCQkqcmVxID0ga3phbGxvYyhzaXplb2YgKnJlcSwgR0ZQX0tFUk5FTCk7CiAJaW50CQkJc3RhdHVzOwogCWludAkJCXNhbXBsZTsKIAlpbnQJCQlpOwpAQCAtMzE3LDYgKzMxOCw0OCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoZGlzYWJsZSwgMDY2NCwgYWRzNzg0Nl9kaXNhYmxlX3Nob3csIGFkczc4NDZfZGlzYWJsZV9zdG9yZSk7CiAKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHM3ODQ2X2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfdGVtcDAuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcDEuYXR0ciwKKwkmZGV2X2F0dHJfdmJhdHQuYXR0ciwKKwkmZGV2X2F0dHJfdmF1eC5hdHRyLAorCSZkZXZfYXR0cl9wZW5fZG93bi5hdHRyLAorCSZkZXZfYXR0cl9kaXNhYmxlLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkczc4NDZfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHM3ODQ2X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogYWRzNzg0My83ODQ1IGRvbid0IGhhdmUgdGVtcGVyYXR1cmUgc2Vuc29ycywgYW5kCisgKiB1c2UgdGhlIG90aGVyIHNlbnNvcnMgYSBiaXQgZGlmZmVyZW50bHkgdG9vCisgKi8KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkczc4NDNfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl92YmF0dC5hdHRyLAorCSZkZXZfYXR0cl92YXV4LmF0dHIsCisJJmRldl9hdHRyX3Blbl9kb3duLmF0dHIsCisJJmRldl9hdHRyX2Rpc2FibGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRzNzg0M19hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkczc4NDNfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHM3ODQ1X2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfdmF1eC5hdHRyLAorCSZkZXZfYXR0cl9wZW5fZG93bi5hdHRyLAorCSZkZXZfYXR0cl9kaXNhYmxlLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkczc4NDVfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHM3ODQ1X2F0dHJpYnV0ZXMsCit9OworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKQEAgLTc4OCwzOCArODMxLDMwIEBACiAJKHZvaWQpIGFkczc4NDZfcmVhZDEyX3Nlcigmc3BpLT5kZXYsCiAJCQkgIFJFQURfMTJCSVRfU0VSKHZhdXgpIHwgQURTX1BEMTBfQUxMX09OKTsKIAotCS8qIGFkczc4NDMvNzg0NSBkb24ndCBoYXZlIHRlbXBlcmF0dXJlIHNlbnNvcnMsIGFuZAotCSAqIHVzZSB0aGUgb3RoZXIgc2Vuc29ycyBhIGJpdCBkaWZmZXJlbnRseSB0b28KLQkgKi8KLQlpZiAodHMtPm1vZGVsID09IDc4NDYpIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAwKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAxKTsKKwlzd2l0Y2ggKHRzLT5tb2RlbCkgeworCWNhc2UgNzg0NjoKKwkJdHMtPmF0dHJfZ3JvdXAgPSAmYWRzNzg0Nl9hdHRyX2dyb3VwOworCQlicmVhazsKKwljYXNlIDc4NDU6CisJCXRzLT5hdHRyX2dyb3VwID0gJmFkczc4NDVfYXR0cl9ncm91cDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHMtPmF0dHJfZ3JvdXAgPSAmYWRzNzg0M19hdHRyX2dyb3VwOworCQlicmVhazsKIAl9Ci0JaWYgKHRzLT5tb2RlbCAhPSA3ODQ1KQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdmJhdHQpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl92YXV4KTsKLQotCWRldmljZV9jcmVhdGVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9wZW5fZG93bik7Ci0KLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfZGlzYWJsZSk7CisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzcGktPmRldi5rb2JqLCB0cy0+YXR0cl9ncm91cCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9pcnE7CiAKIAllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9yZW1vdmVfYXR0cjsKKwkJZ290byBlcnJfcmVtb3ZlX2F0dHJfZ3JvdXA7CiAKIAlyZXR1cm4gMDsKIAotIGVycl9yZW1vdmVfYXR0cjoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfZGlzYWJsZSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3Blbl9kb3duKTsKLQlpZiAodHMtPm1vZGVsID09IDc4NDYpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAxKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAwKTsKLQl9Ci0JaWYgKHRzLT5tb2RlbCAhPSA3ODQ1KQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdmJhdHQpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl92YXV4KTsKLQorIGVycl9yZW1vdmVfYXR0cl9ncm91cDoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnNwaS0+ZGV2LmtvYmosIHRzLT5hdHRyX2dyb3VwKTsKKyBlcnJfZnJlZV9pcnE6CiAJZnJlZV9pcnEoc3BpLT5pcnEsIHRzKTsKICBlcnJfZnJlZV9tZW06CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKQEAgLTgzNSwxNSArODcwLDcgQEAKIAogCWFkczc4NDZfc3VzcGVuZChzcGksIFBNU0dfU1VTUEVORCk7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfZGlzYWJsZSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3Blbl9kb3duKTsKLQlpZiAodHMtPm1vZGVsID09IDc4NDYpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAxKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgJmRldl9hdHRyX3RlbXAwKTsKLQl9Ci0JaWYgKHRzLT5tb2RlbCAhPSA3ODQ1KQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdmJhdHQpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl92YXV4KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnNwaS0+ZGV2LmtvYmosIHRzLT5hdHRyX2dyb3VwKTsKIAogCWZyZWVfaXJxKHRzLT5zcGktPmlycSwgdHMpOwogCS8qIHN1c3BlbmQgbGVmdCB0aGUgSVJRIGRpc2FibGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2NvcmdpX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2NvcmdpX3RzLmMKaW5kZXggY2E3OWIyMi4uZTI5NDU1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jb3JnaV90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY29yZ2lfdHMuYwpAQCAtMTc1LDE3ICsxNzUsMTkgQEAKIAogc3RhdGljIHZvaWQgbmV3X2RhdGEoc3RydWN0IGNvcmdpX3RzICpjb3JnaV90cykKIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBjb3JnaV90cy0+aW5wdXQ7CisKIAlpZiAoY29yZ2lfdHMtPnBvd2VyX21vZGUgIT0gUFdSX01PREVfQUNUSVZFKQogCQlyZXR1cm47CiAKIAlpZiAoIWNvcmdpX3RzLT50Yy5wcmVzc3VyZSAmJiBjb3JnaV90cy0+cGVuZG93biA9PSAwKQogCQlyZXR1cm47CiAKLQlpbnB1dF9yZXBvcnRfYWJzKGNvcmdpX3RzLT5pbnB1dCwgQUJTX1gsIGNvcmdpX3RzLT50Yy54KTsKLQlpbnB1dF9yZXBvcnRfYWJzKGNvcmdpX3RzLT5pbnB1dCwgQUJTX1ksIGNvcmdpX3RzLT50Yy55KTsKLQlpbnB1dF9yZXBvcnRfYWJzKGNvcmdpX3RzLT5pbnB1dCwgQUJTX1BSRVNTVVJFLCBjb3JnaV90cy0+dGMucHJlc3N1cmUpOwotCWlucHV0X3JlcG9ydF9rZXkoY29yZ2lfdHMtPmlucHV0LCBCVE5fVE9VQ0gsIChjb3JnaV90cy0+cGVuZG93biAhPSAwKSk7Ci0JaW5wdXRfc3luYyhjb3JnaV90cy0+aW5wdXQpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgY29yZ2lfdHMtPnRjLngpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgY29yZ2lfdHMtPnRjLnkpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIGNvcmdpX3RzLT50Yy5wcmVzc3VyZSk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgY29yZ2lfdHMtPnBlbmRvd24pOworCWlucHV0X3N5bmMoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgdHNfaW50ZXJydXB0X21haW4oc3RydWN0IGNvcmdpX3RzICpjb3JnaV90cywgaW50IGlzVGltZXIpCkBAIC0yMTksMTIgKzIyMSwxNCBAQAogc3RhdGljIHZvaWQgY29yZ2lfdHNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBjb3JnaV90cyAqY29yZ2l0c19kYXRhID0gKHN0cnVjdCBjb3JnaV90cyAqKSBkYXRhOwotCXRzX2ludGVycnVwdF9tYWluKGNvcmdpdHNfZGF0YSwgMSwgTlVMTCk7CisKKwl0c19pbnRlcnJ1cHRfbWFpbihjb3JnaXRzX2RhdGEsIDEpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgdHNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgY29yZ2lfdHMgKmNvcmdpdHNfZGF0YSA9IGRldl9pZDsKKwogCXRzX2ludGVycnVwdF9tYWluKGNvcmdpdHNfZGF0YSwgMCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMjM3LDcgKzI0MSw3IEBACiAJaWYgKGNvcmdpX3RzLT5wZW5kb3duKSB7CiAJCWRlbF90aW1lcl9zeW5jKCZjb3JnaV90cy0+dGltZXIpOwogCQljb3JnaV90cy0+dGMucHJlc3N1cmUgPSAwOwotCQluZXdfZGF0YShjb3JnaV90cywgTlVMTCk7CisJCW5ld19kYXRhKGNvcmdpX3RzKTsKIAkJY29yZ2lfdHMtPnBlbmRvd24gPSAwOwogCX0KIAljb3JnaV90cy0+cG93ZXJfbW9kZSA9IFBXUl9NT0RFX1NVU1BFTkQ7CkBAIC0yNzIsNyArMjc2LDcgQEAKIAljb3JnaV90cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb3JnaV90cyksIEdGUF9LRVJORUwpOwogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghY29yZ2lfdHMgfHwgIWlucHV0X2RldikKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWwxOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY29yZ2lfdHMpOwogCkBAIC0yODEsNyArMjg1LDcgQEAKIAogCWlmIChjb3JnaV90cy0+aXJxX2dwaW8gPCAwKSB7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAl9CiAKIAljb3JnaV90cy0+aW5wdXQgPSBpbnB1dF9kZXY7CkBAIC0zMTksMTAgKzMyMywxMiBAQAogCiAJaWYgKHJlcXVlc3RfaXJxKGNvcmdpX3RzLT5pcnFfZ3BpbywgdHNfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAidHMiLCBjb3JnaV90cykpIHsKIAkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDE7CiAJfQogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNvcmdpX3RzLT5pbnB1dCk7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNvcmdpX3RzLT5pbnB1dCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsMjsKIAogCWNvcmdpX3RzLT5wb3dlcl9tb2RlID0gUFdSX01PREVfQUNUSVZFOwogCkBAIC0zMzEsMTcgKzMzNywxNyBAQAogCiAJcmV0dXJuIDA7CiAKLSBmYWlsOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWwyOglmcmVlX2lycShjb3JnaV90cy0+aXJxX2dwaW8sIGNvcmdpX3RzKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShjb3JnaV90cyk7CiAJcmV0dXJuIGVycjsKLQogfQogCiBzdGF0aWMgaW50IGNvcmdpdHNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGNvcmdpX3RzICpjb3JnaV90cyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JZnJlZV9pcnEoY29yZ2lfdHMtPmlycV9ncGlvLCBOVUxMKTsKKwlmcmVlX2lycShjb3JnaV90cy0+aXJxX2dwaW8sIGNvcmdpX3RzKTsKIAlkZWxfdGltZXJfc3luYygmY29yZ2lfdHMtPnRpbWVyKTsKIAljb3JnaV90cy0+bWFjaGluZm8tPnB1dF9oc3luYygpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGNvcmdpX3RzLT5pbnB1dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Vsby5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbG8uYwppbmRleCA5MTNlMWI3Li45ZDYxY2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Vsby5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWxvLmMKQEAgLTM5Nyw4ICszOTcsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBlbG9faW5pdCh2b2lkKQogewotCXNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmZWxvX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmZWxvX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBlbG9fZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ndW56ZS5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ndW56ZS5jCmluZGV4IDgxN2MyMTkuLjkxNTdlYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZ3VuemUuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2d1bnplLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghZ3VuemUgfHwgIWlucHV0X2RldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDE7CiAJfQogCiAJZ3VuemUtPnNlcmlvID0gc2VyaW87CkBAIC0xNDYsMTMgKzE0NiwxNyBAQAogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDI7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZ3VuemUtPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGd1bnplLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKIAlyZXR1cm4gMDsKIAotIGZhaWw6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKLQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworIGZhaWwzOglzZXJpb19jbG9zZShzZXJpbyk7CisgZmFpbDI6CXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZShndW56ZSk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE5MCw4ICsxOTQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBndW56ZV9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZndW56ZV9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJmd1bnplX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBndW56ZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMKaW5kZXggZDllNjFlZS4uYzQxMTZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaDM2MDBfdHNfaW5wdXQuYwpAQCAtNDc4LDggKzQ3OCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGgzNjAwdHNfaW5pdCh2b2lkKQogewotCXNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmaDM2MDB0c19kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJmgzNjAwdHNfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGgzNjAwdHNfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ocDY4MF90c19pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ocDY4MF90c19pbnB1dC5jCmluZGV4IGUzMWM2YzUuLjI0OTA4NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaHA2ODBfdHNfaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2hwNjgwX3RzX2lucHV0LmMKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2FkYy5oPgotI2luY2x1ZGUgPGFzbS9ocDZ4eC9ocDZ4eC5oPgorI2luY2x1ZGUgPGFzbS9ocDZ4eC5oPgogCiAjZGVmaW5lIE1PRE5BTUUgImhwNjgwX3RzX2lucHV0IgogCkBAIC03NiwzOCArNzYsNDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaHA2ODBfdHNfaW5pdCh2b2lkKQogeworCWludCBlcnI7CisKIAlocDY4MF90c19kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWhwNjgwX3RzX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlocDY4MF90c19kZXYtPmV2Yml0WzBdID0gQklUKEVWX0FCUykgfCBCSVQoRVZfS0VZKTsKLQlocDY4MF90c19kZXYtPmFic2JpdFswXSA9IEJJVChBQlNfWCkgfCBCSVQoQUJTX1kpOwogCWhwNjgwX3RzX2Rldi0+a2V5Yml0W0xPTkcoQlROX1RPVUNIKV0gPSBCSVQoQlROX1RPVUNIKTsKIAotCWhwNjgwX3RzX2Rldi0+YWJzbWluW0FCU19YXSA9IEhQNjgwX1RTX0FCU19YX01JTjsKLQlocDY4MF90c19kZXYtPmFic21pbltBQlNfWV0gPSBIUDY4MF9UU19BQlNfWV9NSU47Ci0JaHA2ODBfdHNfZGV2LT5hYnNtYXhbQUJTX1hdID0gSFA2ODBfVFNfQUJTX1hfTUFYOwotCWhwNjgwX3RzX2Rldi0+YWJzbWF4W0FCU19ZXSA9IEhQNjgwX1RTX0FCU19ZX01BWDsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhocDY4MF90c19kZXYsIEFCU19YLAorCQlIUDY4MF9UU19BQlNfWF9NSU4sIEhQNjgwX1RTX0FCU19YX01BWCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaHA2ODBfdHNfZGV2LCBBQlNfWSwKKwkJSFA2ODBfVFNfQUJTX1lfTUlOLCBIUDY4MF9UU19BQlNfWV9NQVgsIDAsIDApOwogCiAJaHA2ODBfdHNfZGV2LT5uYW1lID0gIkhQIEpvcm5hZGEgdG91Y2hzY3JlZW4iOwogCWhwNjgwX3RzX2Rldi0+cGh5cyA9ICJocDY4MF90cy9pbnB1dDAiOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGhwNjgwX3RzX2Rldik7Ci0KIAlpZiAocmVxdWVzdF9pcnEoSFA2ODBfVFNfSVJRLCBocDY4MF90c19pbnRlcnJ1cHQsCiAJCQlJUlFGX0RJU0FCTEVELCBNT0ROQU1FLCAwKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJocDY4MF90b3VjaHNjcmVlbi5jOiBDYW4ndCBhbGxvY2F0ZSBpcnEgJWRcbiIsCiAJCSAgICAgICBIUDY4MF9UU19JUlEpOwotCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShocDY4MF90c19kZXYpOwotCQlyZXR1cm4gLUVCVVNZOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbDE7CiAJfQogCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGhwNjgwX3RzX2Rldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMjsKKwogCXJldHVybiAwOworCisgZmFpbDI6CWZyZWVfaXJxKEhQNjgwX1RTX0lSUSwgTlVMTCk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmd29yayk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKyBmYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaHA2ODBfdHNfZGV2KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaHA2ODBfdHNfZXhpdCh2b2lkKQogewotCWZyZWVfaXJxKEhQNjgwX1RTX0lSUSwgMCk7CisJZnJlZV9pcnEoSFA2ODBfVFNfSVJRLCBOVUxMKTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZ3b3JrKTsKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGhwNjgwX3RzX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21rNzEyLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21rNzEyLmMKaW5kZXggNGNiY2FhNi4uNDQxNDBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tazcxMi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWs3MTIuYwpAQCAtOTYsMTUgKzk2LDEzIEBACiAJCWdvdG8gZW5kOwogCX0KIAotCWlmICh+c3RhdHVzICYgTUs3MTJfU1RBVFVTX1RPVUNIKQotCXsKKwlpZiAofnN0YXR1cyAmIE1LNzEyX1NUQVRVU19UT1VDSCkgewogCQlkZWJvdW5jZSA9IDE7CiAJCWlucHV0X3JlcG9ydF9rZXkobWs3MTJfZGV2LCBCVE5fVE9VQ0gsIDApOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlpZiAoZGVib3VuY2UpCi0JeworCWlmIChkZWJvdW5jZSkgewogCQlkZWJvdW5jZSA9IDA7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTExMyw4ICsxMTEsNyBAQAogCWlucHV0X3JlcG9ydF9hYnMobWs3MTJfZGV2LCBBQlNfWCwgbGFzdF94KTsKIAlpbnB1dF9yZXBvcnRfYWJzKG1rNzEyX2RldiwgQUJTX1ksIGxhc3RfeSk7CiAKLWVuZDoKLQorIGVuZDoKIAlsYXN0X3ggPSBpbncobWs3MTJfaW8gKyBNSzcxMl9YKSAmIDB4MGZmZjsKIAlsYXN0X3kgPSBpbncobWs3MTJfaW8gKyBNSzcxMl9ZKSAmIDB4MGZmZjsKIAlpbnB1dF9zeW5jKG1rNzEyX2Rldik7CkBAIC0xNjksMTMgKzE2NiwxNCBAQAogCSAgICAoaW53KG1rNzEyX2lvICsgTUs3MTJfU1RBVFVTKSAmIDB4ZjMzMykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWs3MTI6IGRldmljZSBub3QgcHJlc2VudFxuIik7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAl9CiAKLQlpZiAoIShtazcxMl9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKSkpIHsKKwltazcxMl9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIW1rNzEyX2RldikgewogCQlwcmludGsoS0VSTl9FUlIgIm1rNzEyOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAl9CiAKIAltazcxMl9kZXYtPm5hbWUgPSAiSUNTIE1pY3JvQ2xvY2sgTUs3MTIgVG91Y2hTY3JlZW4iOwpAQCAtMTk2LDEzICsxOTQsMTcgQEAKIAlpZiAocmVxdWVzdF9pcnEobWs3MTJfaXJxLCBtazcxMl9pbnRlcnJ1cHQsIDAsICJtazcxMiIsIG1rNzEyX2RldikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWs3MTI6IHVuYWJsZSB0byBnZXQgSVJRXG4iKTsKIAkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDE7CiAJfQogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG1rNzEyX2Rldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG1rNzEyX2Rldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMjsKKwogCXJldHVybiAwOwogCi0gZmFpbDoJaW5wdXRfZnJlZV9kZXZpY2UobWs3MTJfZGV2KTsKKyBmYWlsMjoJZnJlZV9pcnEobWs3MTJfaXJxLCBtazcxMl9kZXYpOworIGZhaWwxOglpbnB1dF9mcmVlX2RldmljZShtazcxMl9kZXYpOwogCXJlbGVhc2VfcmVnaW9uKG1rNzEyX2lvLCA4KTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tdG91Y2guYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbXRvdWNoLmMKaW5kZXggM2I0YzYxNi4uYzNjMmQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tdG91Y2guYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL210b3VjaC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIW10b3VjaCB8fCAhaW5wdXRfZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMTsKIAl9CiAKIAltdG91Y2gtPnNlcmlvID0gc2VyaW87CkBAIC0xNjAsMTQgKzE2MCwxNyBAQAogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbDI7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobXRvdWNoLT5kZXYpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShtdG91Y2gtPmRldik7CisJaWYgKGVycikKKwkJZ290byBmYWlsMzsKIAogCXJldHVybiAwOwogCi0gZmFpbDoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOwotCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisgZmFpbDM6CXNlcmlvX2Nsb3NlKHNlcmlvKTsKKyBmYWlsMjoJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworIGZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCWtmcmVlKG10b3VjaCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIwNSw4ICsyMDgsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtdG91Y2hfaW5pdCh2b2lkKQogewotCXNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmbXRvdWNoX2Rydik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmbXRvdWNoX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtdG91Y2hfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9wZW5tb3VudC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9wZW5tb3VudC5jCmluZGV4IDZjN2QwYzIuLmJkMjc2NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vcGVubW91bnQuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3Blbm1vdW50LmMKQEAgLTE3MSw4ICsxNzEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwbV9pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZwbV9kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnBtX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwbV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RvdWNocmlnaHQuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdG91Y2hyaWdodC5jCmluZGV4IGM3NGY3NGUuLjM1YmE0NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdG91Y2hyaWdodC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdG91Y2hyaWdodC5jCkBAIC0xODIsOCArMTgyLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgdHJfaW5pdCh2b2lkKQogewotCXNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmdHJfZHJ2KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZ0cl9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdHJfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90b3VjaHdpbi5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90b3VjaHdpbi5jCmluZGV4IDk5MTE4MjAuLjRkYzA3M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdG91Y2h3aW4uYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3RvdWNod2luLmMKQEAgLTE4OSw4ICsxODksNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB0d19pbml0KHZvaWQpCiB7Ci0Jc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKCZ0d19kcnYpOwotCXJldHVybiAwOworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnR3X2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0d19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNThhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYwpAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqICBQaGlsaXBzIFVDQjE0MDAgdG91Y2hzY3JlZW4gZHJpdmVyCisgKgorICogIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogIENyZWF0ZWQ6CVNlcHRlbWJlciAyNSwgMjAwNgorICogIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdWNiMXgwMC0qLmMgY29weXJpZ2h0ZWQgYnkgUnVzc2VsbCBLaW5nCisgKiBjb3ZlcmluZyB0aGUgVUNCMTEwMCwgVUNCMTIwMCBhbmQgVUNCMTMwMC4uICBTdXBwb3J0IGZvciB0aGUgVUNCMTQwMCBoYXMKKyAqIGJlZW4gbWFkZSBzZXBhcmF0ZSBmcm9tIHVjYjF4MDAtY29yZS91Y2IxeDAwLXRzIG9uIFJ1c3NlbGwncyByZXF1ZXN0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CisKKworLyoKKyAqIEludGVyZXN0aW5nIFVDQjE0MDAgQUMtbGluayByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIFVDQl9JRV9SSVMJCTB4NWUKKyNkZWZpbmUgVUNCX0lFX0ZBTAkJMHg2MAorI2RlZmluZSBVQ0JfSUVfU1RBVFVTCQkweDYyCisjZGVmaW5lIFVDQl9JRV9DTEVBUgkJMHg2MgorI2RlZmluZSBVQ0JfSUVfQURDCQkoMSA8PCAxMSkKKyNkZWZpbmUgVUNCX0lFX1RTUFgJCSgxIDw8IDEyKQorCisjZGVmaW5lIFVDQl9UU19DUgkJMHg2NAorI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWF9QT1cJKDEgPDwgMCkKKyNkZWZpbmUgVUNCX1RTX0NSX1RTUFhfUE9XCSgxIDw8IDEpCisjZGVmaW5lIFVDQl9UU19DUl9UU01ZX1BPVwkoMSA8PCAyKQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNQWV9QT1cJKDEgPDwgMykKKyNkZWZpbmUgVUNCX1RTX0NSX1RTTVhfR05ECSgxIDw8IDQpCisjZGVmaW5lIFVDQl9UU19DUl9UU1BYX0dORAkoMSA8PCA1KQorI2RlZmluZSBVQ0JfVFNfQ1JfVFNNWV9HTkQJKDEgPDwgNikKKyNkZWZpbmUgVUNCX1RTX0NSX1RTUFlfR05ECSgxIDw8IDcpCisjZGVmaW5lIFVDQl9UU19DUl9NT0RFX0lOVAkoMCA8PCA4KQorI2RlZmluZSBVQ0JfVFNfQ1JfTU9ERV9QUkVTCSgxIDw8IDgpCisjZGVmaW5lIFVDQl9UU19DUl9NT0RFX1BPUwkoMiA8PCA4KQorI2RlZmluZSBVQ0JfVFNfQ1JfQklBU19FTkEJKDEgPDwgMTEpCisjZGVmaW5lIFVDQl9UU19DUl9UU1BYX0xPVwkoMSA8PCAxMikKKyNkZWZpbmUgVUNCX1RTX0NSX1RTTVhfTE9XCSgxIDw8IDEzKQorCisjZGVmaW5lIFVDQl9BRENfQ1IJCTB4NjYKKyNkZWZpbmUgVUNCX0FEQ19TWU5DX0VOQQkoMSA8PCAwKQorI2RlZmluZSBVQ0JfQURDX1ZSRUZCWVBfQ09OCSgxIDw8IDEpCisjZGVmaW5lIFVDQl9BRENfSU5QX1RTUFgJKDAgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfVFNNWAkoMSA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0lOUF9UU1BZCSgyIDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX1RTTVkJKDMgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfQUQwCQkoNCA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0lOUF9BRDEJCSg1IDw8IDIpCisjZGVmaW5lIFVDQl9BRENfSU5QX0FEMgkJKDYgPDwgMikKKyNkZWZpbmUgVUNCX0FEQ19JTlBfQUQzCQkoNyA8PCAyKQorI2RlZmluZSBVQ0JfQURDX0VYVF9SRUYJCSgxIDw8IDUpCisjZGVmaW5lIFVDQl9BRENfU1RBUlQJCSgxIDw8IDcpCisjZGVmaW5lIFVDQl9BRENfRU5BCQkoMSA8PCAxNSkKKworI2RlZmluZSBVQ0JfQURDX0RBVEEJCTB4NjgKKyNkZWZpbmUgVUNCX0FEQ19EQVRfVkFMSUQJKDEgPDwgMTUpCisjZGVmaW5lIFVDQl9BRENfREFUX1ZBTFVFKHgpCSgoeCkgJiAweDNmZikKKworI2RlZmluZSBVQ0JfSUQJCQkweDdlCisjZGVmaW5lIFVDQl9JRF8xNDAwICAgICAgICAgICAgIDB4NDMwNAorCisKK3N0cnVjdCB1Y2IxNDAwIHsKKwlhYzk3X3QJCQkqYWM5NzsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSp0c19pZGV2OworCisJaW50CQkJaXJxOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJdHNfd2FpdDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRzX3Rhc2s7CisKKwl1bnNpZ25lZCBpbnQJCWlycV9wZW5kaW5nOwkvKiBub3QgYml0IGZpZWxkIHNoYXJlZCAqLworCXVuc2lnbmVkIGludAkJdHNfcmVzdGFydDoxOworCXVuc2lnbmVkIGludAkJYWRjc3luYzoxOworfTsKKworc3RhdGljIGludCBhZGNzeW5jOworCitzdGF0aWMgaW5saW5lIHUxNiB1Y2IxNDAwX3JlZ19yZWFkKHN0cnVjdCB1Y2IxNDAwICp1Y2IsIHUxNiByZWcpCit7CisJcmV0dXJuIHVjYi0+YWM5Ny0+YnVzLT5vcHMtPnJlYWQodWNiLT5hYzk3LCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMTQwMF9yZWdfd3JpdGUoc3RydWN0IHVjYjE0MDAgKnVjYiwgdTE2IHJlZywgdTE2IHZhbCkKK3sKKwl1Y2ItPmFjOTctPmJ1cy0+b3BzLT53cml0ZSh1Y2ItPmFjOTcsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfYWRjX2VuYWJsZShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQoreworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0FEQ19DUiwgVUNCX0FEQ19FTkEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHVjYjE0MDBfYWRjX3JlYWQoc3RydWN0IHVjYjE0MDAgKnVjYiwgdTE2IGFkY19jaGFubmVsKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAodWNiLT5hZGNzeW5jKQorCQlhZGNfY2hhbm5lbCB8PSBVQ0JfQURDX1NZTkNfRU5BOworCisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfQURDX0NSLCBVQ0JfQURDX0VOQSB8IGFkY19jaGFubmVsKTsKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BIHwgYWRjX2NoYW5uZWwgfCBVQ0JfQURDX1NUQVJUKTsKKworCWZvciAoOzspIHsKKwkJdmFsID0gdWNiMTQwMF9yZWdfcmVhZCh1Y2IsIFVDQl9BRENfREFUQSk7CisJCWlmICh2YWwgJiBVQ0JfQURDX0RBVF9WQUxJRCkKKwkJCWJyZWFrOworCQkvKiB5aWVsZCB0byBvdGhlciBwcm9jZXNzZXMgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlyZXR1cm4gVUNCX0FEQ19EQVRfVkFMVUUodmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfYWRjX2Rpc2FibGUoc3RydWN0IHVjYjE0MDAgKnVjYikKK3sKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIDApOworfQorCisvKiBTd2l0Y2ggdG8gaW50ZXJydXB0IG1vZGUuICovCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMTQwMF90c19tb2RlX2ludChzdHJ1Y3QgdWNiMTQwMCAqdWNiKQoreworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVhfUE9XIHwgVUNCX1RTX0NSX1RTUFhfUE9XIHwKKwkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX0dORCB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9JTlQpOworfQorCisvKgorICogU3dpdGNoIHRvIHByZXNzdXJlIG1vZGUsIGFuZCByZWFkIHByZXNzdXJlLiAgV2UgZG9uJ3QgbmVlZCB0byB3YWl0CisgKiBoZXJlLCBzaW5jZSBib3RoIHBsYXRlcyBhcmUgYmVpbmcgZHJpdmVuLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxNDAwX3RzX3JlYWRfcHJlc3N1cmUoc3RydWN0IHVjYjE0MDAgKnVjYikKK3sKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01YX1BPVyB8IFVDQl9UU19DUl9UU1BYX1BPVyB8CisJCQlVQ0JfVFNfQ1JfVFNNWV9HTkQgfCBVQ0JfVFNfQ1JfVFNQWV9HTkQgfAorCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisJcmV0dXJuIHVjYjE0MDBfYWRjX3JlYWQodWNiLCBVQ0JfQURDX0lOUF9UU1BZKTsKK30KKworLyoKKyAqIFN3aXRjaCB0byBYIHBvc2l0aW9uIG1vZGUgYW5kIG1lYXN1cmUgWSBwbGF0ZS4gIFdlIHN3aXRjaCB0aGUgcGxhdGUKKyAqIGNvbmZpZ3VyYXRpb24gaW4gcHJlc3N1cmUgbW9kZSwgdGhlbiBzd2l0Y2ggdG8gcG9zaXRpb24gbW9kZS4gIFRoaXMKKyAqIGdpdmVzIGEgZmFzdGVyIHJlc3BvbnNlIHRpbWUuICBFdmVuIHNvLCB3ZSBuZWVkIHRvIHdhaXQgYWJvdXQgNTV1cworICogZm9yIHRoaW5ncyB0byBzdGFiaWxpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVjYjE0MDBfdHNfcmVhZF94cG9zKHN0cnVjdCB1Y2IxNDAwICp1Y2IpCit7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAorCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAorCQkJVUNCX1RTX0NSX01PREVfUFJFUyB8IFVDQl9UU19DUl9CSUFTX0VOQSk7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfVFNfQ1IsCisJCQlVQ0JfVFNfQ1JfVFNNWF9HTkQgfCBVQ0JfVFNfQ1JfVFNQWF9QT1cgfAorCQkJVUNCX1RTX0NSX01PREVfUE9TIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKworCXVkZWxheSg1NSk7CisKKwlyZXR1cm4gdWNiMTQwMF9hZGNfcmVhZCh1Y2IsIFVDQl9BRENfSU5QX1RTUFkpOworfQorCisvKgorICogU3dpdGNoIHRvIFkgcG9zaXRpb24gbW9kZSBhbmQgbWVhc3VyZSBYIHBsYXRlLiAgV2Ugc3dpdGNoIHRoZSBwbGF0ZQorICogY29uZmlndXJhdGlvbiBpbiBwcmVzc3VyZSBtb2RlLCB0aGVuIHN3aXRjaCB0byBwb3NpdGlvbiBtb2RlLiAgVGhpcworICogZ2l2ZXMgYSBmYXN0ZXIgcmVzcG9uc2UgdGltZS4gIEV2ZW4gc28sIHdlIG5lZWQgdG8gd2FpdCBhYm91dCA1NXVzCisgKiBmb3IgdGhpbmdzIHRvIHN0YWJpbGlzZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdWNiMTQwMF90c19yZWFkX3lwb3Moc3RydWN0IHVjYjE0MDAgKnVjYikKK3sKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9QUkVTIHwgVUNCX1RTX0NSX0JJQVNfRU5BKTsKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9UU19DUiwKKwkJCVVDQl9UU19DUl9UU01ZX0dORCB8IFVDQl9UU19DUl9UU1BZX1BPVyB8CisJCQlVQ0JfVFNfQ1JfTU9ERV9QT1MgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOworCisJdWRlbGF5KDU1KTsKKworCXJldHVybiB1Y2IxNDAwX2FkY19yZWFkKHVjYiwgVUNCX0FEQ19JTlBfVFNQWCk7Cit9CisKKy8qCisgKiBTd2l0Y2ggdG8gWCBwbGF0ZSByZXNpc3RhbmNlIG1vZGUuICBTZXQgTVggdG8gZ3JvdW5kLCBQWCB0bworICogc3VwcGx5LiAgTWVhc3VyZSBjdXJyZW50LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxNDAwX3RzX3JlYWRfeHJlcyhzdHJ1Y3QgdWNiMTQwMCAqdWNiKQoreworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVhfR05EIHwgVUNCX1RTX0NSX1RTUFhfUE9XIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOworCXJldHVybiB1Y2IxNDAwX2FkY19yZWFkKHVjYiwgMCk7Cit9CisKKy8qCisgKiBTd2l0Y2ggdG8gWSBwbGF0ZSByZXNpc3RhbmNlIG1vZGUuICBTZXQgTVkgdG8gZ3JvdW5kLCBQWSB0bworICogc3VwcGx5LiAgTWVhc3VyZSBjdXJyZW50LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1Y2IxNDAwX3RzX3JlYWRfeXJlcyhzdHJ1Y3QgdWNiMTQwMCAqdWNiKQoreworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX1RTX0NSLAorCQkJVUNCX1RTX0NSX1RTTVlfR05EIHwgVUNCX1RTX0NSX1RTUFlfUE9XIHwKKwkJCVVDQl9UU19DUl9NT0RFX1BSRVMgfCBVQ0JfVFNfQ1JfQklBU19FTkEpOworCXJldHVybiB1Y2IxNDAwX2FkY19yZWFkKHVjYiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVjYjE0MDBfdHNfcGVuX2Rvd24oc3RydWN0IHVjYjE0MDAgKnVjYikKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWwgPSB1Y2IxNDAwX3JlZ19yZWFkKHVjYiwgVUNCX1RTX0NSKTsKKwlyZXR1cm4gKHZhbCAmIChVQ0JfVFNfQ1JfVFNQWF9MT1cgfCBVQ0JfVFNfQ1JfVFNNWF9MT1cpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVjYjE0MDBfdHNfaXJxX2VuYWJsZShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQoreworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCBVQ0JfSUVfVFNQWCk7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDApOworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0ZBTCwgVUNCX0lFX1RTUFgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWNiMTQwMF90c19pcnFfZGlzYWJsZShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQoreworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0ZBTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHVjYjE0MDBfdHNfZXZ0X2FkZChzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2LCB1MTYgcHJlc3N1cmUsIHUxNiB4LCB1MTYgeSkKK3sKKwlpbnB1dF9yZXBvcnRfYWJzKGlkZXYsIEFCU19YLCB4KTsKKwlpbnB1dF9yZXBvcnRfYWJzKGlkZXYsIEFCU19ZLCB5KTsKKwlpbnB1dF9yZXBvcnRfYWJzKGlkZXYsIEFCU19QUkVTU1VSRSwgcHJlc3N1cmUpOworCWlucHV0X3N5bmMoaWRldik7Cit9CisKK3N0YXRpYyB2b2lkIHVjYjE0MDBfdHNfZXZlbnRfcmVsZWFzZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCWlucHV0X3JlcG9ydF9hYnMoaWRldiwgQUJTX1BSRVNTVVJFLCAwKTsKKwlpbnB1dF9zeW5jKGlkZXYpOworfQorCitzdGF0aWMgdm9pZCB1Y2IxNDAwX2hhbmRsZV9wZW5kaW5nX2lycShzdHJ1Y3QgdWNiMTQwMCAqdWNiKQoreworCXVuc2lnbmVkIGludCBpc3I7CisKKwlpc3IgPSB1Y2IxNDAwX3JlZ19yZWFkKHVjYiwgVUNCX0lFX1NUQVRVUyk7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIGlzcik7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDApOworCisJaWYgKGlzciAmIFVDQl9JRV9UU1BYKQorCQl1Y2IxNDAwX3RzX2lycV9kaXNhYmxlKHVjYik7CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgInVjYjE0MDA6IHVuZXhwZWN0ZWQgSUVfU1RBVFVTID0gJSN4XG4iLCBpc3IpOworCisJZW5hYmxlX2lycSh1Y2ItPmlycSk7Cit9CisKK3N0YXRpYyBpbnQgdWNiMTQwMF90c190aHJlYWQodm9pZCAqX3VjYikKK3sKKwlzdHJ1Y3QgdWNiMTQwMCAqdWNiID0gX3VjYjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJaW50IHZhbGlkID0gMDsKKworCXRzay0+cG9saWN5ID0gU0NIRURfRklGTzsKKwl0c2stPnJ0X3ByaW9yaXR5ID0gMTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXVuc2lnbmVkIGludCB4LCB5LCBwOworCQlsb25nIHRpbWVvdXQ7CisKKwkJdWNiLT50c19yZXN0YXJ0ID0gMDsKKworCQlpZiAodWNiLT5pcnFfcGVuZGluZykgeworCQkJdWNiLT5pcnFfcGVuZGluZyA9IDA7CisJCQl1Y2IxNDAwX2hhbmRsZV9wZW5kaW5nX2lycSh1Y2IpOworCQl9CisKKwkJdWNiMTQwMF9hZGNfZW5hYmxlKHVjYik7CisJCXggPSB1Y2IxNDAwX3RzX3JlYWRfeHBvcyh1Y2IpOworCQl5ID0gdWNiMTQwMF90c19yZWFkX3lwb3ModWNiKTsKKwkJcCA9IHVjYjE0MDBfdHNfcmVhZF9wcmVzc3VyZSh1Y2IpOworCQl1Y2IxNDAwX2FkY19kaXNhYmxlKHVjYik7CisKKwkJLyogU3dpdGNoIGJhY2sgdG8gaW50ZXJydXB0IG1vZGUuICovCisJCXVjYjE0MDBfdHNfbW9kZV9pbnQodWNiKTsKKworCQltc2xlZXAoMTApOworCisJCWlmICh1Y2IxNDAwX3RzX3Blbl9kb3duKHVjYikpIHsKKwkJCXVjYjE0MDBfdHNfaXJxX2VuYWJsZSh1Y2IpOworCisJCQkvKgorCQkJICogSWYgd2Ugc3BhdCBvdXQgYSB2YWxpZCBzYW1wbGUgc2V0IGxhc3QgdGltZSwKKwkJCSAqIHNwaXQgb3V0IGEgInBlbiBvZmYiIHNhbXBsZSBoZXJlLgorCQkJICovCisJCQlpZiAodmFsaWQpIHsKKwkJCQl1Y2IxNDAwX3RzX2V2ZW50X3JlbGVhc2UodWNiLT50c19pZGV2KTsKKwkJCQl2YWxpZCA9IDA7CisJCQl9CisKKwkJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJfSBlbHNlIHsKKwkJCXZhbGlkID0gMTsKKwkJCXVjYjE0MDBfdHNfZXZ0X2FkZCh1Y2ItPnRzX2lkZXYsIHAsIHgsIHkpOworCQkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMTApOworCQl9CisKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodWNiLT50c193YWl0LAorCQkJdWNiLT5pcnFfcGVuZGluZyB8fCB1Y2ItPnRzX3Jlc3RhcnQgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpLAorCQkJdGltZW91dCk7CisJCXRyeV90b19mcmVlemUoKTsKKwl9CisKKwkvKiBTZW5kIHRoZSAicGVuIG9mZiIgaWYgd2UgYXJlIHN0b3BwaW5nIHdpdGggdGhlIHBlbiBzdGlsbCBhY3RpdmUgKi8KKwlpZiAodmFsaWQpCisJCXVjYjE0MDBfdHNfZXZlbnRfcmVsZWFzZSh1Y2ItPnRzX2lkZXYpOworCisJdWNiLT50c190YXNrID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEEgcmVzdHJpY3Rpb24gd2l0aCBpbnRlcnJ1cHRzIGV4aXN0cyB3aGVuIHVzaW5nIHRoZSB1Y2IxNDAwLCBhcworICogdGhlIGNvZGVjIHJlYWQvd3JpdGUgcm91dGluZXMgbWF5IHNsZWVwIHdoaWxlIHdhaXRpbmcgZm9yIGNvZGVjCisgKiBhY2Nlc3MgY29tcGxldGlvbiBhbmQgdXNlcyBzZW1hcGhvcmVzIGZvciBhY2Nlc3MgY29udHJvbCB0byB0aGUKKyAqIEFDOTcgYnVzLiAgQSBjb21wbGV0ZSBjb2RlYyByZWFkIGN5Y2xlIGNvdWxkIHRha2UgIGFueXdoZXJlIGZyb20KKyAqIDYwIHRvIDEwMHVTZWMgc28gd2UgKmRlZmluaXRlbHkqIGRvbid0IHdhbnQgdG8gc3BpbiBpbnNpZGUgdGhlCisgKiBpbnRlcnJ1cHQgaGFuZGxlciB3YWl0aW5nIGZvciBjb2RlYyBhY2Nlc3MuICBTbywgd2UgaGFuZGxlIHRoZQorICogaW50ZXJydXB0IGJ5IHNjaGVkdWxpbmcgYSBSVCBrZXJuZWwgdGhyZWFkIHRvIHJ1biBpbiBwcm9jZXNzCisgKiBjb250ZXh0IGluc3RlYWQgb2YgaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB1Y2IxNDAwX2hhcmRfaXJxKGludCBpcnFuciwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHVjYjE0MDAgKnVjYiA9IGRldmlkOworCisJaWYgKGlycW5yID09IHVjYi0+aXJxKSB7CisJCWRpc2FibGVfaXJxKHVjYi0+aXJxKTsKKwkJdWNiLT5pcnFfcGVuZGluZyA9IDE7CisJCXdha2VfdXAoJnVjYi0+dHNfd2FpdCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaW50IHVjYjE0MDBfdHNfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCXN0cnVjdCB1Y2IxNDAwICp1Y2IgPSBpZGV2LT5wcml2YXRlOworCWludCByZXQgPSAwOworCisJQlVHX09OKHVjYi0+dHNfdGFzayk7CisKKwl1Y2ItPnRzX3Rhc2sgPSBrdGhyZWFkX3J1bih1Y2IxNDAwX3RzX3RocmVhZCwgdWNiLCAiVUNCMTQwMF90cyIpOworCWlmIChJU19FUlIodWNiLT50c190YXNrKSkgeworCQlyZXQgPSBQVFJfRVJSKHVjYi0+dHNfdGFzayk7CisJCXVjYi0+dHNfdGFzayA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdWNiMTQwMF90c19jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCXN0cnVjdCB1Y2IxNDAwICp1Y2IgPSBpZGV2LT5wcml2YXRlOworCisJaWYgKHVjYi0+dHNfdGFzaykKKwkJa3RocmVhZF9zdG9wKHVjYi0+dHNfdGFzayk7CisKKwl1Y2IxNDAwX3RzX2lycV9kaXNhYmxlKHVjYik7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfVFNfQ1IsIDApOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHVjYjE0MDBfdHNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdWNiMTQwMCAqdWNiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAodWNiLT50c190YXNrKSB7CisJCS8qCisJCSAqIFJlc3RhcnQgdGhlIFRTIHRocmVhZCB0byBlbnN1cmUgdGhlCisJCSAqIFRTIGludGVycnVwdCBtb2RlIGlzIHNldCB1cCBhZ2FpbgorCQkgKiBhZnRlciBzbGVlcC4KKwkJICovCisJCXVjYi0+dHNfcmVzdGFydCA9IDE7CisJCXdha2VfdXAoJnVjYi0+dHNfd2FpdCk7CisJfQorCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgdWNiMTQwMF90c19yZXN1bWUgTlVMTAorI2VuZGlmCisKKyNpZm5kZWYgTk9fSVJRCisjZGVmaW5lIE5PX0lSUQkwCisjZW5kaWYKKworLyoKKyAqIFRyeSB0byBwcm9iZSBvdXIgaW50ZXJydXB0LCByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGxvdHMgb2YKKyAqIGhhcmQtY29kZWQgbWFjaGluZSBkZXBlbmRlbmNpZXMuCisgKi8KK3N0YXRpYyBpbnQgdWNiMTQwMF9kZXRlY3RfaXJxKHN0cnVjdCB1Y2IxNDAwICp1Y2IpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrLCB0aW1lb3V0OworCisJbWFzayA9IHByb2JlX2lycV9vbigpOworCWlmICghbWFzaykgeworCQlwcm9iZV9pcnFfb2ZmKG1hc2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEVuYWJsZSB0aGUgQURDIGludGVycnVwdC4gKi8KKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9SSVMsIFVDQl9JRV9BREMpOworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0ZBTCwgVUNCX0lFX0FEQyk7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDB4ZmZmZik7CisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfQ0xFQVIsIDApOworCisJLyogQ2F1c2UgYW4gQURDIGludGVycnVwdC4gKi8KKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BKTsKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9BRENfQ1IsIFVDQl9BRENfRU5BIHwgVUNCX0FEQ19TVEFSVCk7CisKKwkvKiBXYWl0IGZvciB0aGUgY29udmVyc2lvbiB0byBjb21wbGV0ZS4gKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEhaLzI7CisJd2hpbGUgKCEodWNiMTQwMF9yZWdfcmVhZCh1Y2IsIFVDQl9BRENfREFUQSkgJiBVQ0JfQURDX0RBVF9WQUxJRCkpIHsKKwkJY3B1X3JlbGF4KCk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInVjYjE0MDA6IHRpbWVkIG91dCBpbiBJUlEgcHJvYmVcbiIpOworCQkJcHJvYmVfaXJxX29mZihtYXNrKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0FEQ19DUiwgMCk7CisKKwkvKiBEaXNhYmxlIGFuZCBjbGVhciBpbnRlcnJ1cHQuICovCisJdWNiMTQwMF9yZWdfd3JpdGUodWNiLCBVQ0JfSUVfUklTLCAwKTsKKwl1Y2IxNDAwX3JlZ193cml0ZSh1Y2IsIFVDQl9JRV9GQUwsIDApOworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAweGZmZmYpOworCXVjYjE0MDBfcmVnX3dyaXRlKHVjYiwgVUNCX0lFX0NMRUFSLCAwKTsKKworCS8qIFJlYWQgdHJpZ2dlcmVkIGludGVycnVwdC4gKi8KKwl1Y2ItPmlycSA9IHByb2JlX2lycV9vZmYobWFzayk7CisJaWYgKHVjYi0+aXJxIDwgMCB8fCB1Y2ItPmlycSA9PSBOT19JUlEpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWNiMTQwMF90c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVjYjE0MDAgKnVjYjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCWludCBlcnJvciwgaWQsIHhfcmVzLCB5X3JlczsKKworCXVjYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2IxNDAwKSwgR0ZQX0tFUk5FTCk7CisJaWRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghdWNiIHx8ICFpZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9kZXZzOworCX0KKworCXVjYi0+dHNfaWRldiA9IGlkZXY7CisJdWNiLT5hZGNzeW5jID0gYWRjc3luYzsKKwl1Y2ItPmFjOTcgPSB0b19hYzk3X3QoZGV2KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1Y2ItPnRzX3dhaXQpOworCisJaWQgPSB1Y2IxNDAwX3JlZ19yZWFkKHVjYiwgVUNCX0lEKTsKKwlpZiAoaWQgIT0gVUNCX0lEXzE0MDApIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcmVlX2RldnM7CisJfQorCisJZXJyb3IgPSB1Y2IxNDAwX2RldGVjdF9pcnEodWNiKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVQ0IxNDAwOiBJUlEgcHJvYmUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZV9kZXZzOworCX0KKworCWVycm9yID0gcmVxdWVzdF9pcnEodWNiLT5pcnEsIHVjYjE0MDBfaGFyZF9pcnEsIElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJIlVDQjE0MDAiLCB1Y2IpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIgInVjYjE0MDA6IHVuYWJsZSB0byBncmFiIGlycSVkOiAlZFxuIiwKKwkJCQl1Y2ItPmlycSwgZXJyb3IpOworCQlnb3RvIGVycl9mcmVlX2RldnM7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJVQ0IxNDAwOiBmb3VuZCBJUlEgJWRcbiIsIHVjYi0+aXJxKTsKKworCWlkZXYtPnByaXZhdGUJCT0gdWNiOworCWlkZXYtPmNkZXYuZGV2CQk9IGRldjsKKwlpZGV2LT5uYW1lCQk9ICJVQ0IxNDAwIHRvdWNoc2NyZWVuIGludGVyZmFjZSI7CisJaWRldi0+aWQudmVuZG9yCQk9IHVjYjE0MDBfcmVnX3JlYWQodWNiLCBBQzk3X1ZFTkRPUl9JRDEpOworCWlkZXYtPmlkLnByb2R1Y3QJPSBpZDsKKwlpZGV2LT5vcGVuCQk9IHVjYjE0MDBfdHNfb3BlbjsKKwlpZGV2LT5jbG9zZQkJPSB1Y2IxNDAwX3RzX2Nsb3NlOworCWlkZXYtPmV2Yml0WzBdCQk9IEJJVChFVl9BQlMpOworCisJdWNiMTQwMF9hZGNfZW5hYmxlKHVjYik7CisJeF9yZXMgPSB1Y2IxNDAwX3RzX3JlYWRfeHJlcyh1Y2IpOworCXlfcmVzID0gdWNiMTQwMF90c19yZWFkX3lyZXModWNiKTsKKwl1Y2IxNDAwX2FkY19kaXNhYmxlKHVjYik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlVDQjE0MDA6IHgveSA9ICVkLyVkXG4iLCB4X3JlcywgeV9yZXMpOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaWRldiwgQUJTX1gsIDAsIHhfcmVzLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpZGV2LCBBQlNfWSwgMCwgeV9yZXMsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlkZXYsIEFCU19QUkVTU1VSRSwgMCwgMCwgMCwgMCk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgdWNiKTsKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2lycToKKwlmcmVlX2lycSh1Y2ItPmlycSwgdWNiKTsKKyBlcnJfZnJlZV9kZXZzOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlkZXYpOworCWtmcmVlKHVjYik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHVjYjE0MDBfdHNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdWNiMTQwMCAqdWNiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlmcmVlX2lycSh1Y2ItPmlycSwgdWNiKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh1Y2ItPnRzX2lkZXYpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCWtmcmVlKHVjYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB1Y2IxNDAwX3RzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmJ1cwkJPSAmYWM5N19idXNfdHlwZSwKKwkucHJvYmUJCT0gdWNiMTQwMF90c19wcm9iZSwKKwkucmVtb3ZlCQk9IHVjYjE0MDBfdHNfcmVtb3ZlLAorCS5yZXN1bWUJCT0gdWNiMTQwMF90c19yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1Y2IxNDAwX3RzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZ1Y2IxNDAwX3RzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1Y2IxNDAwX3RzX2V4aXQodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmdWNiMTQwMF90c19kcml2ZXIpOworfQorCittb2R1bGVfcGFyYW0oYWRjc3luYywgaW50LCAwNDQ0KTsKKworbW9kdWxlX2luaXQodWNiMTQwMF90c19pbml0KTsKK21vZHVsZV9leGl0KHVjYjE0MDBfdHNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUGhpbGlwcyBVQ0IxNDAwIHRvdWNoc2NyZWVuIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvYWN0MjAwMF9pc2EuYyBiL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2FjdDIwMDBfaXNhLmMKaW5kZXggM2NhYzIzNy4uMDllYTUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvYWN0MjAwMF9pc2EuYworKysgYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9hY3QyMDAwX2lzYS5jCkBAIC00MDgsNyArNDA4LDcgQEAKICAgICAgICAgcCA9IGNibG9jay5idWZmZXI7CiAgICAgICAgIGlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBwLCBsZW5ndGgpKQogICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICBidWYgPSAodV9jaGFyICopIGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGJ1ZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7CiAgICAgICAgIGlmICghYnVmKQogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICB0aW1lb3V0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2NhcGkuYwppbmRleCA2YWU2ZWIzLi45NDZjMzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vYWN0MjAwMC9jYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2FjdDIwMDAvY2FwaS5jCkBAIC02MjcsOCArNjI3LDEwIEBACiB9CiAKIHZvaWQKLWFjdGNhcGlfZGlzcGF0Y2goYWN0MjAwMF9jYXJkICpjYXJkKQorYWN0Y2FwaV9kaXNwYXRjaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGFjdDIwMDBfY2FyZCAqY2FyZCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWN0MjAwMF9jYXJkLCByY3ZfdHEpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJYWN0Y2FwaV9tc2cgKm1zZzsKIAlfX3UxNiBjY21kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvY2FwaS5oIGIvZHJpdmVycy9pc2RuL2FjdDIwMDAvY2FwaS5oCmluZGV4IDQ5ZjQ1M2MuLmU1NWY2YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2NhcGkuaAorKysgYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9jYXBpLmgKQEAgLTM1Niw3ICszNTYsNyBAQAogZXh0ZXJuIHZvaWQgYWN0Y2FwaV9zZWxlY3RfYjJfcHJvdG9jb2xfcmVxKGFjdDIwMDBfY2FyZCAqLCBhY3QyMDAwX2NoYW4gKik7CiBleHRlcm4gdm9pZCBhY3RjYXBpX2Rpc2Nvbm5lY3RfYjNfcmVxKGFjdDIwMDBfY2FyZCAqLCBhY3QyMDAwX2NoYW4gKik7CiBleHRlcm4gdm9pZCBhY3RjYXBpX2Nvbm5lY3RfcmVzcChhY3QyMDAwX2NhcmQgKiwgYWN0MjAwMF9jaGFuICosIF9fdTgpOwotZXh0ZXJuIHZvaWQgYWN0Y2FwaV9kaXNwYXRjaChhY3QyMDAwX2NhcmQgKik7CitleHRlcm4gdm9pZCBhY3RjYXBpX2Rpc3BhdGNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKICNpZmRlZiBERUJVR19NU0cKIGV4dGVybiB2b2lkIGFjdGNhcGlfZGVidWdfbXNnKHN0cnVjdCBza19idWZmICpza2IsIGludCk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvbW9kdWxlLmMgYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9tb2R1bGUuYwppbmRleCBkODlkY2RlLi5lM2U1YzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vYWN0MjAwMC9tb2R1bGUuYworKysgYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9tb2R1bGUuYwpAQCAtMTkyLDggKzE5MiwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotYWN0MjAwMF90cmFuc21pdChzdHJ1Y3QgYWN0MjAwMF9jYXJkICpjYXJkKQorYWN0MjAwMF90cmFuc21pdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGFjdDIwMDBfY2FyZCAqY2FyZCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWN0MjAwMF9jYXJkLCBzbmRfdHEpOworCiAJc3dpdGNoIChjYXJkLT5idXMpIHsKIAkJY2FzZSBBQ1QyMDAwX0JVU19JU0E6CiAJCQlhY3QyMDAwX2lzYV9zZW5kKGNhcmQpOwpAQCAtMjA3LDggKzIxMCwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotYWN0MjAwMF9yZWNlaXZlKHN0cnVjdCBhY3QyMDAwX2NhcmQgKmNhcmQpCithY3QyMDAwX3JlY2VpdmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBhY3QyMDAwX2NhcmQgKmNhcmQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFjdDIwMDBfY2FyZCwgcG9sbF90cSk7CisKIAlzd2l0Y2ggKGNhcmQtPmJ1cykgewogCQljYXNlIEFDVDIwMDBfQlVTX0lTQToKIAkJCWFjdDIwMDBfaXNhX3JlY2VpdmUoY2FyZCk7CkBAIC0yMjcsNyArMjMzLDcgQEAKIAlhY3QyMDAwX2NhcmQgKiBjYXJkID0gKGFjdDIwMDBfY2FyZCAqKWRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWFjdDIwMDBfcmVjZWl2ZShjYXJkKTsKKwlhY3QyMDAwX3JlY2VpdmUoJmNhcmQtPnBvbGxfdHEpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJbW9kX3RpbWVyKCZjYXJkLT5wdGltZXIsIGppZmZpZXMrMyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwpAQCAtNTY3LDIwICs1NzMsMTkgQEAKIHsKIAlpbnQgaTsKICAgICAgICAgYWN0MjAwMF9jYXJkICpjYXJkOwotICAgICAgICBpZiAoIShjYXJkID0gKGFjdDIwMDBfY2FyZCAqKSBrbWFsbG9jKHNpemVvZihhY3QyMDAwX2NhcmQpLCBHRlBfS0VSTkVMKSkpIHsKKyAgICAgICAgaWYgKCEoY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKGFjdDIwMDBfY2FyZCksIEdGUF9LRVJORUwpKSkgewogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJhY3QyMDAwOiAoJXMpIENvdWxkIG5vdCBhbGxvY2F0ZSBjYXJkLXN0cnVjdC5cbiIsIGlkKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbWVtc2V0KChjaGFyICopIGNhcmQsIDAsIHNpemVvZihhY3QyMDAwX2NhcmQpKTsKICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOwogICAgICAgICBzcGluX2xvY2tfaW5pdCgmY2FyZC0+bW5sb2NrKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5zbmRxKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5yY3ZxKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5hY2txKTsKLQlJTklUX1dPUksoJmNhcmQtPnNuZF90cSwgKHZvaWQgKikgKHZvaWQgKikgYWN0MjAwMF90cmFuc21pdCwgY2FyZCk7Ci0JSU5JVF9XT1JLKCZjYXJkLT5yY3ZfdHEsICh2b2lkICopICh2b2lkICopIGFjdGNhcGlfZGlzcGF0Y2gsIGNhcmQpOwotCUlOSVRfV09SSygmY2FyZC0+cG9sbF90cSwgKHZvaWQgKikgKHZvaWQgKikgYWN0MjAwMF9yZWNlaXZlLCBjYXJkKTsKKwlJTklUX1dPUksoJmNhcmQtPnNuZF90cSwgYWN0MjAwMF90cmFuc21pdCk7CisJSU5JVF9XT1JLKCZjYXJkLT5yY3ZfdHEsIGFjdGNhcGlfZGlzcGF0Y2gpOworCUlOSVRfV09SSygmY2FyZC0+cG9sbF90cSwgYWN0MjAwMF9yZWNlaXZlKTsKIAlpbml0X3RpbWVyKCZjYXJkLT5wdGltZXIpOwogCWNhcmQtPmludGVyZmFjZS5vd25lciA9IFRISVNfTU9EVUxFOwogICAgICAgICBjYXJkLT5pbnRlcmZhY2UuY2hhbm5lbHMgPSBBQ1QyMDAwX0JDSDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYwppbmRleCAxMTg0NGJiLi5kMjJjMDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCkBAIC0yMTUsMTMgKzIxNSwxMiBAQAogCXVuc2lnbmVkIGludCBtaW5vciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW1wID0ga21hbGxvYyhzaXplb2YoKm1wKSwgR0ZQX0FUT01JQyk7CisJbXAgPSBremFsbG9jKHNpemVvZigqbXApLCBHRlBfQVRPTUlDKTsKICAgCWlmICghbXApIHsKICAgCQlwcmludGsoS0VSTl9FUlIgImNhcGk6IGNhbid0IGFsbG9jIGNhcGltaW5vclxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCW1lbXNldChtcCwgMCwgc2l6ZW9mKHN0cnVjdCBjYXBpbWlub3IpKTsKIAltcC0+YXAgPSBhcDsKIAltcC0+bmNjaSA9IG5jY2k7CiAJbXAtPm1zZ2lkID0gMDsKQEAgLTMwNCwxMCArMzAzLDkgQEAKIAlzdHJ1Y3QgY2FwaW1pbm9yICptcCA9IE5VTEw7CiAjZW5kaWYgLyogQ09ORklHX0lTRE5fQ0FQSV9NSURETEVXQVJFICovCiAKLQlucCA9IGttYWxsb2Moc2l6ZW9mKCpucCksIEdGUF9BVE9NSUMpOworCW5wID0ga3phbGxvYyhzaXplb2YoKm5wKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFucCkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KG5wLCAwLCBzaXplb2Yoc3RydWN0IGNhcGluY2NpKSk7CiAJbnAtPm5jY2kgPSBuY2NpOwogCW5wLT5jZGV2ID0gY2RldjsKICNpZmRlZiBDT05GSUdfSVNETl9DQVBJX01JRERMRVdBUkUKQEAgLTM4NCwxMCArMzgyLDkgQEAKIAlzdHJ1Y3QgY2FwaWRldiAqY2RldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JY2RldiA9IGttYWxsb2Moc2l6ZW9mKCpjZGV2KSwgR0ZQX0tFUk5FTCk7CisJY2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpjZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjZGV2KQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoY2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBjYXBpZGV2KSk7CiAKIAlpbml0X01VVEVYKCZjZGV2LT5uY2NpX2xpc3Rfc2VtKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZjZGV2LT5yZWN2cXVldWUpOwpAQCAtMTAxMCw3ICsxMDA3LDcgQEAKIHsKIAlzdHJ1Y3QgY2FwaW1pbm9yICptcDsKIAotCWlmICgobXAgPSBjYXBpbWlub3JfZmluZChpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKSkgPT0gMCkKKwlpZiAoKG1wID0gY2FwaW1pbm9yX2ZpbmQoaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKSkgPT0gMCkKIAkJcmV0dXJuIC1FTlhJTzsKIAlpZiAobXAtPm5jY2lwID09IDApCiAJCXJldHVybiAtRU5YSU87CkBAIC0xMjAzLDcgKzEyMDAsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIHZvaWQgY2FwaW5jX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCkKK3N0YXRpYyB2b2lkIGNhcGluY190dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICogb2xkKQogewogI2lmZGVmIF9ERUJVR19UVFlGVU5DUwogCXByaW50ayhLRVJOX0RFQlVHICJjYXBpbmNfdHR5X3NldF90ZXJtaW9zXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYwppbmRleCBkMTBjOGI4Li5jNGQ0MzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jCkBAIC0zMzQsMTIgKzMzNCwxMSBAQAogewogCWNhcGlkcnZfcGxjaSAqcGxjaXA7CiAKLQlwbGNpcCA9IChjYXBpZHJ2X3BsY2kgKikga21hbGxvYyhzaXplb2YoY2FwaWRydl9wbGNpKSwgR0ZQX0FUT01JQyk7CisJcGxjaXAgPSBremFsbG9jKHNpemVvZihjYXBpZHJ2X3BsY2kpLCBHRlBfQVRPTUlDKTsKIAogCWlmIChwbGNpcCA9PSAwKQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChwbGNpcCwgMCwgc2l6ZW9mKGNhcGlkcnZfcGxjaSkpOwogCXBsY2lwLT5zdGF0ZSA9IFNUX1BMQ0lfTk9ORTsKIAlwbGNpcC0+cGxjaSA9IDA7CiAJcGxjaXAtPm1zZ2lkID0gMDsKQEAgLTQwNCwxMiArNDAzLDExIEBACiB7CiAJY2FwaWRydl9uY2NpICpuY2NpcDsKIAotCW5jY2lwID0gKGNhcGlkcnZfbmNjaSAqKSBrbWFsbG9jKHNpemVvZihjYXBpZHJ2X25jY2kpLCBHRlBfQVRPTUlDKTsKKwluY2NpcCA9IGt6YWxsb2Moc2l6ZW9mKGNhcGlkcnZfbmNjaSksIEdGUF9BVE9NSUMpOwogCiAJaWYgKG5jY2lwID09IDApCiAJCXJldHVybiBOVUxMOwogCi0JbWVtc2V0KG5jY2lwLCAwLCBzaXplb2YoY2FwaWRydl9uY2NpKSk7CiAJbmNjaXAtPm5jY2kgPSBuY2NpOwogCW5jY2lwLT5zdGF0ZSA9IFNUX05DQ0lfTk9ORTsKIAluY2NpcC0+cGxjaXAgPSBwbGNpcDsKQEAgLTE5MDcsNyArMTkwNSw4IEBACiAJfQogCiAJZm9yIChwPWJ1ZiwgY291bnQ9MDsgY291bnQgPCBsZW47IHArKywgY291bnQrKykgewotCQlwdXRfdXNlcigqY2FyZC0+cTkzMV9yZWFkKyssIHApOworCQlpZiAocHV0X3VzZXIoKmNhcmQtPnE5MzFfcmVhZCsrLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCSAgICAgICAgaWYgKGNhcmQtPnE5MzFfcmVhZCA+IGNhcmQtPnE5MzFfZW5kKQogCSAgICAgICAgICAgICAgICBjYXJkLT5xOTMxX3JlYWQgPSBjYXJkLT5xOTMxX2J1ZjsKIAl9CkBAIC0yMDA0LDE4ICsyMDAzLDE3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNhcGlkcnY6ICglcykgQ291bGQgbm90IHJlc2VydmUgbW9kdWxlXG4iLCBpZCk7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKCEoY2FyZCA9IChjYXBpZHJ2X2NvbnRyICopIGttYWxsb2Moc2l6ZW9mKGNhcGlkcnZfY29udHIpLCBHRlBfQVRPTUlDKSkpIHsKKwlpZiAoIShjYXJkID0ga3phbGxvYyhzaXplb2YoY2FwaWRydl9jb250ciksIEdGUF9BVE9NSUMpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAiY2FwaWRydjogKCVzKSBDb3VsZCBub3QgYWxsb2NhdGUgY29udHItc3RydWN0LlxuIiwgaWQpOwogCQlyZXR1cm4gLTE7CiAJfQotCW1lbXNldChjYXJkLCAwLCBzaXplb2YoY2FwaWRydl9jb250cikpOwogCWNhcmQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAJaW5pdF90aW1lcigmY2FyZC0+bGlzdGVudGltZXIpOwogCXN0cmNweShjYXJkLT5uYW1lLCBpZCk7CiAJY2FyZC0+Y29udHJuciA9IGNvbnRyOwogCWNhcmQtPm5iY2hhbiA9IHByb2ZwLT5uYmNoYW5uZWw7Ci0JY2FyZC0+YmNoYW5zID0gKGNhcGlkcnZfYmNoYW4gKikga21hbGxvYyhzaXplb2YoY2FwaWRydl9iY2hhbikgKiBjYXJkLT5uYmNoYW4sIEdGUF9BVE9NSUMpOworCWNhcmQtPmJjaGFucyA9IGttYWxsb2Moc2l6ZW9mKGNhcGlkcnZfYmNoYW4pICogY2FyZC0+bmJjaGFuLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWNhcmQtPmJjaGFucykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSJjYXBpZHJ2OiAoJXMpIENvdWxkIG5vdCBhbGxvY2F0ZSBiY2hhbi1zdHJ1Y3RzLlxuIiwgaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMKaW5kZXggOGM0ZmNiOS4uNzgzYTI1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jCkBAIC0yMDgsOSArMjA4LDEwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBub3RpZnlfaGFuZGxlcih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgbm90aWZ5X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBjYXBpX25vdGlmaWVyICpucCA9IGRhdGE7CisJc3RydWN0IGNhcGlfbm90aWZpZXIgKm5wID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjYXBpX25vdGlmaWVyLCB3b3JrKTsKIAogCXN3aXRjaCAobnAtPmNtZCkgewogCWNhc2UgS0NJX0NPTlRSVVA6CkBAIC0yMzUsNyArMjM2LDcgQEAKIAlpZiAoIW5wKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCUlOSVRfV09SSygmbnAtPndvcmssIG5vdGlmeV9oYW5kbGVyLCBucCk7CisJSU5JVF9XT1JLKCZucC0+d29yaywgbm90aWZ5X2hhbmRsZXIpOwogCW5wLT5jbWQgPSBjbWQ7CiAJbnAtPmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwogCW5wLT5hcHBsaWQgPSBhcHBsaWQ7CkBAIC0yNDgsMTAgKzI0OSwxMSBAQAogCQogLyogLS0tLS0tLS0gUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB2b2lkIHJlY3ZfaGFuZGxlcih2b2lkICpfYXApCitzdGF0aWMgdm9pZCByZWN2X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGNhcGkyMF9hcHBsICphcCA9IChzdHJ1Y3QgY2FwaTIwX2FwcGwgKikgX2FwOworCXN0cnVjdCBjYXBpMjBfYXBwbCAqYXAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGNhcGkyMF9hcHBsLCByZWN2X3dvcmspOwogCiAJaWYgKCghYXApIHx8IChhcC0+cmVsZWFzZV9pbl9wcm9ncmVzcykpCiAJCXJldHVybjsKQEAgLTUyNyw3ICs1MjksNyBAQAogCWFwLT5jYWxsYmFjayA9IE5VTEw7CiAJaW5pdF9NVVRFWCgmYXAtPnJlY3Zfc2VtKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZhcC0+cmVjdl9xdWV1ZSk7Ci0JSU5JVF9XT1JLKCZhcC0+cmVjdl93b3JrLCByZWN2X2hhbmRsZXIsICh2b2lkICopYXApOworCUlOSVRfV09SSygmYXAtPnJlY3Zfd29yaywgcmVjdl9oYW5kbGVyKTsKIAlhcC0+cmVsZWFzZV9pbl9wcm9ncmVzcyA9IDA7CiAKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYXBwbGljYXRpb25fbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2RpdmVydC9kaXZlcnRfcHJvY2ZzLmMgYi9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2RpdmVydF9wcm9jZnMuYwppbmRleCAzOTliMzE2Li4wNjk2N2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2RpdmVydF9wcm9jZnMuYworKysgYi9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2RpdmVydF9wcm9jZnMuYwpAQCAtNDUsNyArNDUsNyBAQAogCQlyZXR1cm47CiAJaWYgKCEqY3ApCiAJCXJldHVybjsKLQlpZiAoIShpYiA9IChzdHJ1Y3QgZGl2ZXJ0X2luZm8gKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGRpdmVydF9pbmZvKSArIHN0cmxlbihjcCksIEdGUF9BVE9NSUMpKSkKKwlpZiAoIShpYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaXZlcnRfaW5mbykgKyBzdHJsZW4oY3ApLCBHRlBfQVRPTUlDKSkpCiAJCSByZXR1cm47CS8qIG5vIG1lbW9yeSAqLwogCXN0cmNweShpYi0+aW5mb19zdGFydCwgY3ApOwkvKiBzZXQgb3V0cHV0IHN0cmluZyAqLwogCWliLT5uZXh0ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9kaXZlcnQvaXNkbl9kaXZlcnQuYyBiL2RyaXZlcnMvaXNkbi9kaXZlcnQvaXNkbl9kaXZlcnQuYwppbmRleCAxZjVlYmU5Li43ZDk3ZDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2lzZG5fZGl2ZXJ0LmMKKysrIGIvZHJpdmVycy9pc2RuL2RpdmVydC9pc2RuX2RpdmVydC5jCkBAIC0xMCw2ICsxMCw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogI2luY2x1ZGUgImlzZG5fZGl2ZXJ0LmgiCiAKQEAgLTE1MSw3ICsxNTMsNyBAQAogICAqaWVsZW5wID0gcCAtIGllbGVucCAtIDE7IC8qIHNldCB0b3RhbCBJRSBsZW5ndGggKi8gCiAKICAgLyogYWxsb2NhdGUgbWVtIGZvciBpbmZvcm1hdGlvbiBzdHJ1Y3QgKi8gIAotICBpZiAoIShjcyA9IChzdHJ1Y3QgY2FsbF9zdHJ1YyAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2FsbF9zdHJ1YyksIEdGUF9BVE9NSUMpKSkgCisgIGlmICghKGNzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNhbGxfc3RydWMpLCBHRlBfQVRPTUlDKSkpCiAgICAgICAgICAgICAgcmV0dXJuKC1FTk9NRU0pOyAvKiBubyBtZW1vcnkgKi8KICAgaW5pdF90aW1lcigmY3MtPnRpbWVyKTsKICAgY3MtPmluZm9bMF0gPSAnXDAnOwpAQCAtMjc0LDcgKzI3Niw3IEBACiB7IHN0cnVjdCBkZWZsZWN0X3N0cnVjICpkcywqZHMxPU5VTEw7CiAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSAgaWYgKCEoZHMgPSAoc3RydWN0IGRlZmxlY3Rfc3RydWMgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGRlZmxlY3Rfc3RydWMpLCAKKyAgaWYgKCEoZHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGVmbGVjdF9zdHJ1YyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCkpKSAKICAgICByZXR1cm4oLUVOT01FTSk7IC8qIG5vIG1lbW9yeSAqLwogCkBAIC00NDksNyArNDUxLDcgQEAKICAgICAgICAgICAgaWYgKGR2LT5ydWxlLmFjdGlvbiA9PSBERUZMRUNUX1BST0NFRUQpCiAJICAgIGlmICgoIWlmX3VzZWQpIHx8ICgoIWV4dGVybl93YWl0X21heCkgJiYgKCFkdi0+cnVsZS53YWl0dGltZSkpKSAKICAgICAgICAgICAgICAgcmV0dXJuKDApOyAvKiBubyBleHRlcm5hbCBkZWZsZWN0aW9uIG5lZWRlZCAqLyAgCi0gICAgICAgICAgIGlmICghKGNzID0gKHN0cnVjdCBjYWxsX3N0cnVjICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjYWxsX3N0cnVjKSwgR0ZQX0FUT01JQykpKSAKKyAgICAgICAgICAgaWYgKCEoY3MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2FsbF9zdHJ1YyksIEdGUF9BVE9NSUMpKSkKICAgICAgICAgICAgICByZXR1cm4oMCk7IC8qIG5vIG1lbW9yeSAqLwogICAgICAgICAgICBpbml0X3RpbWVyKCZjcy0+dGltZXIpOwogICAgICAgICAgICBjcy0+aW5mb1swXSA9ICdcMCc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvS2NvbmZpZwppbmRleCA1YjIwM2ZlLi43MDhkNDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L0tjb25maWcKQEAgLTUsNiArNSw3IEBACiAJdHJpc3RhdGUgIlNpZW1lbnMgR2lnYXNldCBzdXBwb3J0IChpc2RuKSIKIAlkZXBlbmRzIG9uIElTRE5fSTRMCiAJc2VsZWN0IENSQ19DQ0lUVAorCXNlbGVjdCBCSVRSRVZFUlNFCiAJaGVscAogCSAgU2F5IG0gaGVyZSBpZiB5b3UgaGF2ZSBhIEdpZ2FzZXQgb3IgU2ludXMgaXNkbiBkZXZpY2UuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2FzeW5jZGF0YS5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYXN5bmNkYXRhLmMKaW5kZXggY2UzY2Q3Ny4uODhlOTU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYXN5bmNkYXRhLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYXN5bmNkYXRhLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgImdpZ2FzZXQuaCIKICNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KIAogLy8jZGVmaW5lIEdJR19NMTB4X1NUVUZGX1ZPSUNFX0RBVEEKIApAQCAtMzAyLDcgKzMwMyw3IEBACiAJCQkJaW5wdXRzdGF0ZSB8PSBJTlNfc2tpcF9mcmFtZTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCSpfX3NrYl9wdXQoc2tiLCAxKSA9IGdpZ2FzZXRfaW52dGFiW2NdOworCQkJKl9fc2tiX3B1dChza2IsIDEpID0gYml0cmV2OChjKTsKIAkJfQogCiAJCWlmICh1bmxpa2VseSghbnVtYnl0ZXMpKQpAQCAtNTQzLDcgKzU0NCw3IEBACiAJY3AgPSBza2ItPmRhdGE7CiAJbGVuID0gc2tiLT5sZW47CiAJd2hpbGUgKGxlbi0tKSB7Ci0JCWMgPSBnaWdhc2V0X2ludnRhYlsqY3ArK107CisJCWMgPSBiaXRyZXY4KCpjcCsrKTsKIAkJaWYgKGMgPT0gRExFX0ZMQUcpCiAJCQkqKHNrYl9wdXQoaXJhd19za2IsIDEpKSA9IGM7CiAJCSooc2tiX3B1dChpcmF3X3NrYiwgMSkpID0gYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9iYXMtZ2lnYXNldC5jCmluZGV4IDBjOTM3MzIuLmI1ZTdmOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYmFzLWdpZ2FzZXQuYwpAQCAtNTcyLDcgKzU3Miw3IEBACiAJCQkgICAgIHVjcy0+cmN2YnVmLCB1Y3MtPnJjdmJ1Zl9zaXplLAogCQkJICAgICByZWFkX2N0cmxfY2FsbGJhY2ssIGNzLT5pbmJ1Zik7CiAKLQlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKHVjcy0+dXJiX2NtZF9pbiwgU0xBQl9BVE9NSUMpKSAhPSAwKSB7CisJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYih1Y3MtPnVyYl9jbWRfaW4sIEdGUF9BVE9NSUMpKSAhPSAwKSB7CiAJCXVwZGF0ZV9iYXNzdGF0ZSh1Y3MsIDAsIEJTX0FUUkRQRU5EKTsKIAkJZGV2X2Vycihjcy0+ZGV2LCAiY291bGQgbm90IHN1Ym1pdCBIRF9SRUFEX0FUTUVTU0FHRTogJXNcbiIsCiAJCQlnZXRfdXNiX3JjbXNnKHJldCkpOwpAQCAtNzQ3LDcgKzc0Nyw3IEBACiAJY2hlY2tfcGVuZGluZyh1Y3MpOwogCiByZXN1Ym1pdDoKLQlyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgU0xBQl9BVE9NSUMpOworCXJjID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAodW5saWtlbHkocmMgIT0gMCAmJiByYyAhPSAtRU5PREVWKSkgewogCQlkZXZfZXJyKGNzLT5kZXYsICJjb3VsZCBub3QgcmVzdWJtaXQgaW50ZXJydXB0IFVSQjogJXNcbiIsCiAJCQlnZXRfdXNiX3JjbXNnKHJjKSk7CkBAIC04MDcsNyArODA3LDcgQEAKIAkJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBCQVNfTlVNRlJBTUVTOwogCQkJZ2lnX2RiZyhERUJVR19JU08sICIlczogaXNvYyByZWFkIG92ZXJydW4vcmVzdWJtaXQiLAogCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gdXNiX3N1Ym1pdF91cmIodXJiLCBTTEFCX0FUT01JQyk7CisJCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAodW5saWtlbHkocmMgIT0gMCAmJiByYyAhPSAtRU5PREVWKSkgewogCQkJCWRldl9lcnIoYmNzLT5jcy0+ZGV2LAogCQkJCQkiY291bGQgbm90IHJlc3VibWl0IGlzb2Nocm9ub3VzIHJlYWQgIgpAQCAtOTAwLDcgKzkwMCw3IEBACiAJCX0KIAogCQlkdW1wX3VyYihERUJVR19JU08sICJJbml0aWFsIGlzb2MgcmVhZCIsIHVyYik7Ci0JCWlmICgocmMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIFNMQUJfQVRPTUlDKSkgIT0gMCkKKwkJaWYgKChyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpICE9IDApCiAJCQlnb3RvIGVycm9yOwogCX0KIApAQCAtOTM1LDcgKzkzNSw3IEBACiAJLyogc3VibWl0IHR3byBVUkJzLCBrZWVwIHRoaXJkIG9uZSAqLwogCWZvciAoayA9IDA7IGsgPCAyOyArK2spIHsKIAkJZHVtcF91cmIoREVCVUdfSVNPLCAiSW5pdGlhbCBpc29jIHdyaXRlIiwgdXJiKTsKLQkJcmMgPSB1c2Jfc3VibWl0X3VyYih1YmMtPmlzb291dHVyYnNba10udXJiLCBTTEFCX0FUT01JQyk7CisJCXJjID0gdXNiX3N1Ym1pdF91cmIodWJjLT5pc29vdXR1cmJzW2tdLnVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyYyAhPSAwKQogCQkJZ290byBlcnJvcjsKIAl9CkBAIC0xMDQyLDcgKzEwNDIsNyBAQAogCQlyZXR1cm4gMDsJLyogbm8gZGF0YSB0byBzZW5kICovCiAJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG5mcmFtZTsKIAotCXJjID0gdXNiX3N1Ym1pdF91cmIodXJiLCBTTEFCX0FUT01JQyk7CisJcmMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmICh1bmxpa2VseShyYykpIHsKIAkJaWYgKHJjID09IC1FTk9ERVYpCiAJCQkvKiBkZXZpY2UgcmVtb3ZlZCAtIGdpdmUgdXAgc2lsZW50bHkgKi8KQEAgLTEzNDEsNyArMTM0MSw3IEBACiAJCXVyYi0+ZGV2ID0gYmNzLT5jcy0+aHcuYmFzLT51ZGV2OwogCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOwogCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gQkFTX05VTUZSQU1FUzsKLQkJcmMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIFNMQUJfQVRPTUlDKTsKKwkJcmMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAodW5saWtlbHkocmMgIT0gMCAmJiByYyAhPSAtRU5PREVWKSkgewogCQkJZGV2X2Vycihjcy0+ZGV2LAogCQkJCSJjb3VsZCBub3QgcmVzdWJtaXQgaXNvY2hyb25vdXMgcmVhZCBVUkI6ICVzXG4iLApAQCAtMTQ1OCw3ICsxNDU4LDcgQEAKIAkJCSAgIHVjcy0+cmV0cnlfY3RybCk7CiAJCS8qIHVyYi0+ZGV2IGlzIGNsb2JiZXJlZCBieSBVU0Igc3Vic3lzdGVtICovCiAJCXVyYi0+ZGV2ID0gdWNzLT51ZGV2OwotCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgU0xBQl9BVE9NSUMpOworCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmICh1bmxpa2VseShyYykpIHsKIAkJCWRldl9lcnIoJnVjcy0+aW50ZXJmYWNlLT5kZXYsCiAJCQkJImNvdWxkIG5vdCByZXN1Ym1pdCByZXF1ZXN0IDB4JTAyeDogJXNcbiIsCkBAIC0xNTE3LDcgKzE1MTcsNyBAQAogCQkJICAgICAodW5zaWduZWQgY2hhciopICZ1Y3MtPmRyX2N0cmwsIE5VTEwsIDAsCiAJCQkgICAgIHdyaXRlX2N0cmxfY2FsbGJhY2ssIHVjcyk7CiAJdWNzLT5yZXRyeV9jdHJsID0gMDsKLQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1Y3MtPnVyYl9jdHJsLCBTTEFCX0FUT01JQyk7CisJcmV0ID0gdXNiX3N1Ym1pdF91cmIodWNzLT51cmJfY3RybCwgR0ZQX0FUT01JQyk7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJZGV2X2VycihiY3MtPmNzLT5kZXYsICJjb3VsZCBub3Qgc3VibWl0IHJlcXVlc3QgMHglMDJ4OiAlc1xuIiwKIAkJCXJlcSwgZ2V0X3VzYl9yY21zZyhyZXQpKTsKQEAgLTE3NjMsNyArMTc2Myw3IEBACiAJCQkgICAgIHVzYl9zbmRjdHJscGlwZSh1Y3MtPnVkZXYsIDApLAogCQkJICAgICAodW5zaWduZWQgY2hhciopICZ1Y3MtPmRyX2NtZF9vdXQsIGJ1ZiwgbGVuLAogCQkJICAgICB3cml0ZV9jb21tYW5kX2NhbGxiYWNrLCBjcyk7Ci0JcmMgPSB1c2Jfc3VibWl0X3VyYih1Y3MtPnVyYl9jbWRfb3V0LCBTTEFCX0FUT01JQyk7CisJcmMgPSB1c2Jfc3VibWl0X3VyYih1Y3MtPnVyYl9jbWRfb3V0LCBHRlBfQVRPTUlDKTsKIAlpZiAodW5saWtlbHkocmMpKSB7CiAJCXVwZGF0ZV9iYXNzdGF0ZSh1Y3MsIDAsIEJTX0FUV1JQRU5EKTsKIAkJZGV2X2Vycihjcy0+ZGV2LCAiY291bGQgbm90IHN1Ym1pdCBIRF9XUklURV9BVE1FU1NBR0U6ICVzXG4iLApAQCAtMTg1MywyMCArMTg1MywyNCBAQAogewogCXN0cnVjdCBjbWRidWZfdCAqY2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgc3RhdHVzOworCWludCByYzsKIAogCWdpZ2FzZXRfZGJnX2J1ZmZlcihhdG9taWNfcmVhZCgmY3MtPm1zdGF0ZSkgIT0gTVNfTE9DS0VEID8KIAkJCSAgICAgREVCVUdfVFJBTlNDTUQgOiBERUJVR19MT0NLQ01ELAogCQkJICAgIkNNRCBUcmFuc21pdCIsIGxlbiwgYnVmKTsKIAotCWlmIChsZW4gPD0gMCkKLQkJcmV0dXJuIDA7CQkJLyogbm90aGluZyB0byBkbyAqLworCWlmIChsZW4gPD0gMCkgeworCQkvKiBub3RoaW5nIHRvIGRvICovCisJCXJjID0gMDsKKwkJZ290byBub3RxdWV1ZWQ7CisJfQogCiAJaWYgKGxlbiA+IElGX1dSSVRFQlVGKQogCQlsZW4gPSBJRl9XUklURUJVRjsKIAlpZiAoIShjYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRidWZfdCkgKyBsZW4sIEdGUF9BVE9NSUMpKSkgewogCQlkZXZfZXJyKGNzLT5kZXYsICIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG5vdHF1ZXVlZDsKIAl9CiAKIAltZW1jcHkoY2ItPmJ1ZiwgYnVmLCBsZW4pOwpAQCAtMTg5MSwxMSArMTg5NSwyMSBAQAogCWlmICh1bmxpa2VseSghY3MtPmNvbm5lY3RlZCkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKIAkJZ2lnX2RiZyhERUJVR19VU0JSRVEsICIlczogbm90IGNvbm5lY3RlZCIsIF9fZnVuY19fKTsKKwkJLyogZmx1c2ggY29tbWFuZCBxdWV1ZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmNtZGxvY2ssIGZsYWdzKTsKKwkJd2hpbGUgKGNzLT5jbWRidWYgIT0gTlVMTCkKKwkJCWNvbXBsZXRlX2NiKGNzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmNtZGxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXN0YXR1cyA9IHN0YXJ0X2Nic2VuZChjcyk7CisJcmMgPSBzdGFydF9jYnNlbmQoY3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHN0YXR1cyA8IDAgPyBzdGF0dXMgOiBsZW47CisJcmV0dXJuIHJjIDwgMCA/IHJjIDogbGVuOworCitub3RxdWV1ZWQ6CQkJLyogcmVxdWVzdCBoYW5kbGVkIHdpdGhvdXQgcXVldWluZyAqLworCWlmICh3YWtlX3Rhc2tsZXQpCisJCXRhc2tsZXRfc2NoZWR1bGUod2FrZV90YXNrbGV0KTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qIGdpZ2FzZXRfd3JpdGVfcm9vbQpAQCAtMTk2NCwyMCArMTk3OCwxNSBAQAogCiAJLyoga2lsbCBVUkJzIGFuZCB0YXNrbGV0cyBiZWZvcmUgZnJlZWluZyAtIGJldHRlciBzYWZlIHRoYW4gc29ycnkgKi8KIAlhdG9taWNfc2V0KCZ1YmMtPnJ1bm5pbmcsIDApOwotCWZvciAoaSA9IDA7IGkgPCBCQVNfT1VUVVJCUzsgKytpKQotCQlpZiAodWJjLT5pc29vdXR1cmJzW2ldLnVyYikgewotCQkJZ2lnX2RiZyhERUJVR19JTklULCAiJXM6IGtpbGxpbmcgaXNvIG91dCBVUkIgJWQiLAotCQkJCV9fZnVuY19fLCBpKTsKLQkJCXVzYl9raWxsX3VyYih1YmMtPmlzb291dHVyYnNbaV0udXJiKTsKLQkJCXVzYl9mcmVlX3VyYih1YmMtPmlzb291dHVyYnNbaV0udXJiKTsKLQkJfQotCWZvciAoaSA9IDA7IGkgPCBCQVNfSU5VUkJTOyArK2kpCi0JCWlmICh1YmMtPmlzb2ludXJic1tpXSkgewotCQkJZ2lnX2RiZyhERUJVR19JTklULCAiJXM6IGtpbGxpbmcgaXNvIGluIFVSQiAlZCIsCi0JCQkJX19mdW5jX18sIGkpOwotCQkJdXNiX2tpbGxfdXJiKHViYy0+aXNvaW51cmJzW2ldKTsKLQkJCXVzYl9mcmVlX3VyYih1YmMtPmlzb2ludXJic1tpXSk7Ci0JCX0KKwlnaWdfZGJnKERFQlVHX0lOSVQsICIlczoga2lsbGluZyBpc28gVVJCcyIsIF9fZnVuY19fKTsKKwlmb3IgKGkgPSAwOyBpIDwgQkFTX09VVFVSQlM7ICsraSkgeworCQl1c2Jfa2lsbF91cmIodWJjLT5pc29vdXR1cmJzW2ldLnVyYik7CisJCXVzYl9mcmVlX3VyYih1YmMtPmlzb291dHVyYnNbaV0udXJiKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IEJBU19JTlVSQlM7ICsraSkgeworCQl1c2Jfa2lsbF91cmIodWJjLT5pc29pbnVyYnNbaV0pOworCQl1c2JfZnJlZV91cmIodWJjLT5pc29pbnVyYnNbaV0pOworCX0KIAl0YXNrbGV0X2tpbGwoJnViYy0+c2VudF90YXNrbGV0KTsKIAl0YXNrbGV0X2tpbGwoJnViYy0+cmN2ZF90YXNrbGV0KTsKIAlrZnJlZSh1YmMtPmlzb291dGJ1Zik7CkBAIC0yMDk5LDU1ICsyMTA4LDMyIEBACiAJc3RydWN0IGJhc19iY19zdGF0ZSAqdWJjOwogCWludCBpLCBqOwogCisJZ2lnX2RiZyhERUJVR19JTklULCAiJXM6IGtpbGxpbmcgVVJCcyIsIF9fZnVuY19fKTsKIAlmb3IgKGogPSAwOyBqIDwgMjsgKytqKSB7CiAJCXViYyA9IGNzLT5iY3Nbal0uaHcuYmFzOwotCQlmb3IgKGkgPSAwOyBpIDwgQkFTX09VVFVSQlM7ICsraSkKLQkJCWlmICh1YmMtPmlzb291dHVyYnNbaV0udXJiKSB7Ci0JCQkJdXNiX2tpbGxfdXJiKHViYy0+aXNvb3V0dXJic1tpXS51cmIpOwotCQkJCWdpZ19kYmcoREVCVUdfSU5JVCwKLQkJCQkJIiVzOiBpc29jIG91dHB1dCBVUkIgJWQvJWQgdW5saW5rZWQiLAotCQkJCQlfX2Z1bmNfXywgaiwgaSk7Ci0JCQkJdXNiX2ZyZWVfdXJiKHViYy0+aXNvb3V0dXJic1tpXS51cmIpOwotCQkJCXViYy0+aXNvb3V0dXJic1tpXS51cmIgPSBOVUxMOwotCQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgQkFTX0lOVVJCUzsgKytpKQotCQkJaWYgKHViYy0+aXNvaW51cmJzW2ldKSB7Ci0JCQkJdXNiX2tpbGxfdXJiKHViYy0+aXNvaW51cmJzW2ldKTsKLQkJCQlnaWdfZGJnKERFQlVHX0lOSVQsCi0JCQkJCSIlczogaXNvYyBpbnB1dCBVUkIgJWQvJWQgdW5saW5rZWQiLAotCQkJCQlfX2Z1bmNfXywgaiwgaSk7Ci0JCQkJdXNiX2ZyZWVfdXJiKHViYy0+aXNvaW51cmJzW2ldKTsKLQkJCQl1YmMtPmlzb2ludXJic1tpXSA9IE5VTEw7Ci0JCQl9CisJCWZvciAoaSA9IDA7IGkgPCBCQVNfT1VUVVJCUzsgKytpKSB7CisJCQl1c2Jfa2lsbF91cmIodWJjLT5pc29vdXR1cmJzW2ldLnVyYik7CisJCQl1c2JfZnJlZV91cmIodWJjLT5pc29vdXR1cmJzW2ldLnVyYik7CisJCQl1YmMtPmlzb291dHVyYnNbaV0udXJiID0gTlVMTDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQkFTX0lOVVJCUzsgKytpKSB7CisJCQl1c2Jfa2lsbF91cmIodWJjLT5pc29pbnVyYnNbaV0pOworCQkJdXNiX2ZyZWVfdXJiKHViYy0+aXNvaW51cmJzW2ldKTsKKwkJCXViYy0+aXNvaW51cmJzW2ldID0gTlVMTDsKKwkJfQogCX0KLQlpZiAodWNzLT51cmJfaW50X2luKSB7Ci0JCXVzYl9raWxsX3VyYih1Y3MtPnVyYl9pbnRfaW4pOwotCQlnaWdfZGJnKERFQlVHX0lOSVQsICIlczogaW50ZXJydXB0IGlucHV0IFVSQiB1bmxpbmtlZCIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXVzYl9mcmVlX3VyYih1Y3MtPnVyYl9pbnRfaW4pOwotCQl1Y3MtPnVyYl9pbnRfaW4gPSBOVUxMOwotCX0KLQlpZiAodWNzLT51cmJfY21kX291dCkgewotCQl1c2Jfa2lsbF91cmIodWNzLT51cmJfY21kX291dCk7Ci0JCWdpZ19kYmcoREVCVUdfSU5JVCwgIiVzOiBjb21tYW5kIG91dHB1dCBVUkIgdW5saW5rZWQiLAotCQkJX19mdW5jX18pOwotCQl1c2JfZnJlZV91cmIodWNzLT51cmJfY21kX291dCk7Ci0JCXVjcy0+dXJiX2NtZF9vdXQgPSBOVUxMOwotCX0KLQlpZiAodWNzLT51cmJfY21kX2luKSB7Ci0JCXVzYl9raWxsX3VyYih1Y3MtPnVyYl9jbWRfaW4pOwotCQlnaWdfZGJnKERFQlVHX0lOSVQsICIlczogY29tbWFuZCBpbnB1dCBVUkIgdW5saW5rZWQiLAotCQkJX19mdW5jX18pOwotCQl1c2JfZnJlZV91cmIodWNzLT51cmJfY21kX2luKTsKLQkJdWNzLT51cmJfY21kX2luID0gTlVMTDsKLQl9Ci0JaWYgKHVjcy0+dXJiX2N0cmwpIHsKLQkJdXNiX2tpbGxfdXJiKHVjcy0+dXJiX2N0cmwpOwotCQlnaWdfZGJnKERFQlVHX0lOSVQsICIlczogY29udHJvbCBvdXRwdXQgVVJCIHVubGlua2VkIiwKLQkJCV9fZnVuY19fKTsKLQkJdXNiX2ZyZWVfdXJiKHVjcy0+dXJiX2N0cmwpOwotCQl1Y3MtPnVyYl9jdHJsID0gTlVMTDsKLQl9CisJdXNiX2tpbGxfdXJiKHVjcy0+dXJiX2ludF9pbik7CisJdXNiX2ZyZWVfdXJiKHVjcy0+dXJiX2ludF9pbik7CisJdWNzLT51cmJfaW50X2luID0gTlVMTDsKKwl1c2Jfa2lsbF91cmIodWNzLT51cmJfY21kX291dCk7CisJdXNiX2ZyZWVfdXJiKHVjcy0+dXJiX2NtZF9vdXQpOworCXVjcy0+dXJiX2NtZF9vdXQgPSBOVUxMOworCXVzYl9raWxsX3VyYih1Y3MtPnVyYl9jbWRfaW4pOworCXVzYl9mcmVlX3VyYih1Y3MtPnVyYl9jbWRfaW4pOworCXVjcy0+dXJiX2NtZF9pbiA9IE5VTEw7CisJdXNiX2tpbGxfdXJiKHVjcy0+dXJiX2N0cmwpOworCXVzYl9mcmVlX3VyYih1Y3MtPnVyYl9jdHJsKTsKKwl1Y3MtPnVyYl9jdHJsID0gTlVMTDsKIH0KIAogLyogZ2lnYXNldF9wcm9iZQpAQCAtMjIxOCwyMSArMjIwNCwyMSBAQAogCSAqIC0gdGhyZWUgZm9yIHRoZSBkaWZmZXJlbnQgdXNlcyBvZiB0aGUgZGVmYXVsdCBjb250cm9sIHBpcGUKIAkgKiAtIHRocmVlIGZvciBlYWNoIGlzb2Nocm9ub3VzIHBpcGUKIAkgKi8KLQlpZiAoISh1Y3MtPnVyYl9pbnRfaW4gPSB1c2JfYWxsb2NfdXJiKDAsIFNMQUJfS0VSTkVMKSkgfHwKLQkgICAgISh1Y3MtPnVyYl9jbWRfaW4gPSB1c2JfYWxsb2NfdXJiKDAsIFNMQUJfS0VSTkVMKSkgfHwKLQkgICAgISh1Y3MtPnVyYl9jbWRfb3V0ID0gdXNiX2FsbG9jX3VyYigwLCBTTEFCX0tFUk5FTCkpIHx8Ci0JICAgICEodWNzLT51cmJfY3RybCA9IHVzYl9hbGxvY191cmIoMCwgU0xBQl9LRVJORUwpKSkKKwlpZiAoISh1Y3MtPnVyYl9pbnRfaW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSB8fAorCSAgICAhKHVjcy0+dXJiX2NtZF9pbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpIHx8CisJICAgICEodWNzLT51cmJfY21kX291dCA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpIHx8CisJICAgICEodWNzLT51cmJfY3RybCA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKQogCQlnb3RvIGFsbG9jZXJyOwogCiAJZm9yIChqID0gMDsgaiA8IDI7ICsraikgewogCQl1YmMgPSBjcy0+YmNzW2pdLmh3LmJhczsKIAkJZm9yIChpID0gMDsgaSA8IEJBU19PVVRVUkJTOyArK2kpCiAJCQlpZiAoISh1YmMtPmlzb291dHVyYnNbaV0udXJiID0KLQkJCSAgICAgIHVzYl9hbGxvY191cmIoQkFTX05VTUZSQU1FUywgU0xBQl9LRVJORUwpKSkKKwkJCSAgICAgIHVzYl9hbGxvY191cmIoQkFTX05VTUZSQU1FUywgR0ZQX0tFUk5FTCkpKQogCQkJCWdvdG8gYWxsb2NlcnI7CiAJCWZvciAoaSA9IDA7IGkgPCBCQVNfSU5VUkJTOyArK2kpCiAJCQlpZiAoISh1YmMtPmlzb2ludXJic1tpXSA9Ci0JCQkgICAgICB1c2JfYWxsb2NfdXJiKEJBU19OVU1GUkFNRVMsIFNMQUJfS0VSTkVMKSkpCisJCQkgICAgICB1c2JfYWxsb2NfdXJiKEJBU19OVU1GUkFNRVMsIEdGUF9LRVJORUwpKSkKIAkJCQlnb3RvIGFsbG9jZXJyOwogCX0KIApAQCAtMjI0Niw3ICsyMjMyLDcgQEAKIAkJCQkJKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSAmIDB4MGYpLAogCQkJIHVjcy0+aW50X2luX2J1ZiwgMywgcmVhZF9pbnRfY2FsbGJhY2ssIGNzLAogCQkJIGVuZHBvaW50LT5iSW50ZXJ2YWwpOwotCWlmICgocmMgPSB1c2Jfc3VibWl0X3VyYih1Y3MtPnVyYl9pbnRfaW4sIFNMQUJfS0VSTkVMKSkgIT0gMCkgeworCWlmICgocmMgPSB1c2Jfc3VibWl0X3VyYih1Y3MtPnVyYl9pbnRfaW4sIEdGUF9LRVJORUwpKSAhPSAwKSB7CiAJCWRldl9lcnIoY3MtPmRldiwgImNvdWxkIG5vdCBzdWJtaXQgaW50ZXJydXB0IFVSQjogJXNcbiIsCiAJCQlnZXRfdXNiX3JjbXNnKHJjKSk7CiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9jb21tb24uYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jCmluZGV4IGFjYTE2NWQuLjk1ZWZmM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2NvbW1vbi5jCkBAIC0zMyw0MyArMzMsNiBAQAogI2RlZmluZSBWQUxJRF9JRAkweDAyCiAjZGVmaW5lIEFTU0lHTkVECTB4MDQKIAotLyogYml0d2lzZSBieXRlIGludmVyc2lvbiB0YWJsZSAqLwotX191OCBnaWdhc2V0X2ludnRhYlsyNTZdID0gewotCTB4MDAsIDB4ODAsIDB4NDAsIDB4YzAsIDB4MjAsIDB4YTAsIDB4NjAsIDB4ZTAsCi0JMHgxMCwgMHg5MCwgMHg1MCwgMHhkMCwgMHgzMCwgMHhiMCwgMHg3MCwgMHhmMCwKLQkweDA4LCAweDg4LCAweDQ4LCAweGM4LCAweDI4LCAweGE4LCAweDY4LCAweGU4LAotCTB4MTgsIDB4OTgsIDB4NTgsIDB4ZDgsIDB4MzgsIDB4YjgsIDB4NzgsIDB4ZjgsCi0JMHgwNCwgMHg4NCwgMHg0NCwgMHhjNCwgMHgyNCwgMHhhNCwgMHg2NCwgMHhlNCwKLQkweDE0LCAweDk0LCAweDU0LCAweGQ0LCAweDM0LCAweGI0LCAweDc0LCAweGY0LAotCTB4MGMsIDB4OGMsIDB4NGMsIDB4Y2MsIDB4MmMsIDB4YWMsIDB4NmMsIDB4ZWMsCi0JMHgxYywgMHg5YywgMHg1YywgMHhkYywgMHgzYywgMHhiYywgMHg3YywgMHhmYywKLQkweDAyLCAweDgyLCAweDQyLCAweGMyLCAweDIyLCAweGEyLCAweDYyLCAweGUyLAotCTB4MTIsIDB4OTIsIDB4NTIsIDB4ZDIsIDB4MzIsIDB4YjIsIDB4NzIsIDB4ZjIsCi0JMHgwYSwgMHg4YSwgMHg0YSwgMHhjYSwgMHgyYSwgMHhhYSwgMHg2YSwgMHhlYSwKLQkweDFhLCAweDlhLCAweDVhLCAweGRhLCAweDNhLCAweGJhLCAweDdhLCAweGZhLAotCTB4MDYsIDB4ODYsIDB4NDYsIDB4YzYsIDB4MjYsIDB4YTYsIDB4NjYsIDB4ZTYsCi0JMHgxNiwgMHg5NiwgMHg1NiwgMHhkNiwgMHgzNiwgMHhiNiwgMHg3NiwgMHhmNiwKLQkweDBlLCAweDhlLCAweDRlLCAweGNlLCAweDJlLCAweGFlLCAweDZlLCAweGVlLAotCTB4MWUsIDB4OWUsIDB4NWUsIDB4ZGUsIDB4M2UsIDB4YmUsIDB4N2UsIDB4ZmUsCi0JMHgwMSwgMHg4MSwgMHg0MSwgMHhjMSwgMHgyMSwgMHhhMSwgMHg2MSwgMHhlMSwKLQkweDExLCAweDkxLCAweDUxLCAweGQxLCAweDMxLCAweGIxLCAweDcxLCAweGYxLAotCTB4MDksIDB4ODksIDB4NDksIDB4YzksIDB4MjksIDB4YTksIDB4NjksIDB4ZTksCi0JMHgxOSwgMHg5OSwgMHg1OSwgMHhkOSwgMHgzOSwgMHhiOSwgMHg3OSwgMHhmOSwKLQkweDA1LCAweDg1LCAweDQ1LCAweGM1LCAweDI1LCAweGE1LCAweDY1LCAweGU1LAotCTB4MTUsIDB4OTUsIDB4NTUsIDB4ZDUsIDB4MzUsIDB4YjUsIDB4NzUsIDB4ZjUsCi0JMHgwZCwgMHg4ZCwgMHg0ZCwgMHhjZCwgMHgyZCwgMHhhZCwgMHg2ZCwgMHhlZCwKLQkweDFkLCAweDlkLCAweDVkLCAweGRkLCAweDNkLCAweGJkLCAweDdkLCAweGZkLAotCTB4MDMsIDB4ODMsIDB4NDMsIDB4YzMsIDB4MjMsIDB4YTMsIDB4NjMsIDB4ZTMsCi0JMHgxMywgMHg5MywgMHg1MywgMHhkMywgMHgzMywgMHhiMywgMHg3MywgMHhmMywKLQkweDBiLCAweDhiLCAweDRiLCAweGNiLCAweDJiLCAweGFiLCAweDZiLCAweGViLAotCTB4MWIsIDB4OWIsIDB4NWIsIDB4ZGIsIDB4M2IsIDB4YmIsIDB4N2IsIDB4ZmIsCi0JMHgwNywgMHg4NywgMHg0NywgMHhjNywgMHgyNywgMHhhNywgMHg2NywgMHhlNywKLQkweDE3LCAweDk3LCAweDU3LCAweGQ3LCAweDM3LCAweGI3LCAweDc3LCAweGY3LAotCTB4MGYsIDB4OGYsIDB4NGYsIDB4Y2YsIDB4MmYsIDB4YWYsIDB4NmYsIDB4ZWYsCi0JMHgxZiwgMHg5ZiwgMHg1ZiwgMHhkZiwgMHgzZiwgMHhiZiwgMHg3ZiwgMHhmZgotfTsKLUVYUE9SVF9TWU1CT0xfR1BMKGdpZ2FzZXRfaW52dGFiKTsKLQogdm9pZCBnaWdhc2V0X2RiZ19idWZmZXIoZW51bSBkZWJ1Z2xldmVsIGxldmVsLCBjb25zdCB1bnNpZ25lZCBjaGFyICptc2csCiAJCQlzaXplX3QgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYpCiB7CkBAIC02MTYsNyArNTc5LDcgQEAKIAl9IGVsc2UgaWYgKChiY3MtPnNrYiA9IGRldl9hbGxvY19za2IoU0JVRlNJWkUgKyBIV19IRFJfTEVOKSkgIT0gTlVMTCkKIAkJc2tiX3Jlc2VydmUoYmNzLT5za2IsIEhXX0hEUl9MRU4pOwogCWVsc2UgewotCQlkZXZfd2Fybihjcy0+ZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIHNrYlxuIik7CisJCXdhcm4oImNvdWxkIG5vdCBhbGxvY2F0ZSBza2JcbiIpOwogCQliY3MtPmlucHV0c3RhdGUgfD0gSU5TX3NraXBfZnJhbWU7CiAJfQogCkBAIC03MDIsNyArNjY1LDcgQEAKIAljcy0+b3Blbl9jb3VudCA9IDA7CiAJY3MtPmRldiA9IE5VTEw7CiAJY3MtPnR0eSA9IE5VTEw7Ci0JY3MtPmNsYXNzID0gTlVMTDsKKwljcy0+dHR5X2RldiA9IE5VTEw7CiAJY3MtPmNpZG1vZGUgPSBjaWRtb2RlICE9IDA7CiAKIAkvL2lmKG9uZWNoYW5uZWwpIHsgLy9GSVhNRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZ2lnYXNldC5oIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZ2lnYXNldC5oCmluZGV4IDg4NGJkNzIuLmEwMzE3YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2dpZ2FzZXQuaAorKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9naWdhc2V0LmgKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCXN0cnVjdCBnaWdhc2V0X2RyaXZlciAqZHJpdmVyOwogCXVuc2lnbmVkIG1pbm9yX2luZGV4OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzczsKKwlzdHJ1Y3QgZGV2aWNlICp0dHlfZGV2OwogCiAJY29uc3Qgc3RydWN0IGdpZ2FzZXRfb3BzICpvcHM7CiAKQEAgLTg3NiwxMCArODc2LDYgQEAKIAl9CiB9CiAKLQotLyogYml0d2lzZSBieXRlIGludmVyc2lvbiB0YWJsZSAqLwotZXh0ZXJuIF9fdTggZ2lnYXNldF9pbnZ0YWJbXTsJLyogaW4gY29tbW9uLmMgKi8KLQogLyogYXBwZW5kIHJlY2VpdmVkIGJ5dGVzIHRvIGluYnVmICovCiBpbnQgZ2lnYXNldF9maWxsX2luYnVmKHN0cnVjdCBpbmJ1Zl90ICppbmJ1ZiwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAogCQkgICAgICAgdW5zaWduZWQgbnVtYnl0ZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwppbmRleCA1OTZmM2FlLi40NThiNjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pbnRlcmZhY2UuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiBzdGF0aWMgaW50ICBpZl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBpZl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIHN0YXRpYyB2b2lkIGlmX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgdm9pZCBpZl9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKK3N0YXRpYyB2b2lkIGlmX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkKTsKIHN0YXRpYyBpbnQgIGlmX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBpbnQgIGlmX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCW11dGV4X3VubG9jaygmY3MtPm11dGV4KTsKIH0KIAotc3RhdGljIHZvaWQgaWZfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZCkKK3N0YXRpYyB2b2lkIGlmX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCBjYXJkc3RhdGUgKmNzOwogCXVuc2lnbmVkIGludCBpZmxhZzsKQEAgLTYyNSwxMyArNjI1LDEzIEBACiAJCXJldHVybjsKIAogCXRhc2tsZXRfaW5pdCgmY3MtPmlmX3dha2VfdGFza2xldCwgJmlmX3dha2UsICh1bnNpZ25lZCBsb25nKSBjcyk7Ci0JY3MtPmNsYXNzID0gdHR5X3JlZ2lzdGVyX2RldmljZShkcnYtPnR0eSwgY3MtPm1pbm9yX2luZGV4LCBOVUxMKTsKKwljcy0+dHR5X2RldiA9IHR0eV9yZWdpc3Rlcl9kZXZpY2UoZHJ2LT50dHksIGNzLT5taW5vcl9pbmRleCwgTlVMTCk7CiAKLQlpZiAoIUlTX0VSUihjcy0+Y2xhc3MpKQotCQljbGFzc19zZXRfZGV2ZGF0YShjcy0+Y2xhc3MsIGNzKTsKKwlpZiAoIUlTX0VSUihjcy0+dHR5X2RldikpCisJCWRldl9zZXRfZHJ2ZGF0YShjcy0+dHR5X2RldiwgY3MpOwogCWVsc2UgewogCQl3YXJuKCJjb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlIHRvIHRoZSB0dHkgc3Vic3lzdGVtIik7Ci0JCWNzLT5jbGFzcyA9IE5VTEw7CisJCWNzLT50dHlfZGV2ID0gTlVMTDsKIAl9CiB9CiAKQEAgLTY0NSw3ICs2NDUsNyBAQAogCiAJdGFza2xldF9kaXNhYmxlKCZjcy0+aWZfd2FrZV90YXNrbGV0KTsKIAl0YXNrbGV0X2tpbGwoJmNzLT5pZl93YWtlX3Rhc2tsZXQpOwotCWNzLT5jbGFzcyA9IE5VTEw7CisJY3MtPnR0eV9kZXYgPSBOVUxMOwogCXR0eV91bnJlZ2lzdGVyX2RldmljZShkcnYtPnR0eSwgY3MtPm1pbm9yX2luZGV4KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaXNvY2RhdGEuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2lzb2NkYXRhLmMKaW5kZXggODY2N2RhYS4uZGY5ODhlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaXNvY2RhdGEuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9pc29jZGF0YS5jCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlICJnaWdhc2V0LmgiCiAjaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CiAKIC8qIGFjY2VzcyBtZXRob2RzIGZvciBpc293YnVmX3QgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTQ4Nyw3ICs0ODgsNyBAQAogCWdpZ19kYmcoREVCVUdfU1RSRUFNLCAicHV0ICVkIGJ5dGVzIiwgY291bnQpOwogCXdyaXRlID0gYXRvbWljX3JlYWQoJml3Yi0+d3JpdGUpOwogCWRvIHsKLQkJYyA9IGdpZ2FzZXRfaW52dGFiWyppbisrXTsKKwkJYyA9IGJpdHJldjgoKmluKyspOwogCQlpd2ItPmRhdGFbd3JpdGUrK10gPSBjOwogCQl3cml0ZSAlPSBCQVNfT1VUQlVGU0laRTsKIAl9IHdoaWxlICgtLWNvdW50ID4gMCk7CkBAIC04NzYsNyArODc3LDcgQEAKIAl3aGlsZSAoY291bnQgPiAwKSB7CiAJCWRzdCA9IHNrYl9wdXQoc2tiLCBjb3VudCA8IGRvYnl0ZXMgPyBjb3VudCA6IGRvYnl0ZXMpOwogCQl3aGlsZSAoY291bnQgPiAwICYmIGRvYnl0ZXMgPiAwKSB7Ci0JCQkqZHN0KysgPSBnaWdhc2V0X2ludnRhYlsqc3JjKytdOworCQkJKmRzdCsrID0gYml0cmV2OCgqc3JjKyspOwogCQkJY291bnQtLTsKIAkJCWRvYnl0ZXMtLTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvcHJvYy5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvcHJvYy5jCmluZGV4IDlhZDg0MGUuLmU3NjdhZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L3Byb2MuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9wcm9jLmMKQEAgLTE2LDExICsxNiwxMiBAQAogI2luY2x1ZGUgImdpZ2FzZXQuaCIKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCi1zdGF0aWMgc3NpemVfdCBzaG93X2NpZG1vZGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3MsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2lkbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGNhcmRzdGF0ZSAqY3MgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzcyk7CisJc3RydWN0IGNhcmRzdGF0ZSAqY3MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwogCXJldCA9IHNwcmludGYoYnVmLCAiJXVcbiIsIGNzLT5jaWRtb2RlKTsKQEAgLTI5LDEwICszMCwxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF9jaWRtb2RlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzLAorc3RhdGljIHNzaXplX3Qgc2V0X2NpZG1vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBjYXJkc3RhdGUgKmNzID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3MpOworCXN0cnVjdCBjYXJkc3RhdGUgKmNzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJbG9uZyBpbnQgdmFsdWU7CiAJY2hhciAqZW5kOwogCkBAIC02NCwyNSArNjUsMjUgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihjaWRtb2RlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfY2lkbW9kZSwgc2V0X2NpZG1vZGUpOworc3RhdGljIERFVklDRV9BVFRSKGNpZG1vZGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19jaWRtb2RlLCBzZXRfY2lkbW9kZSk7CiAKIC8qIGZyZWUgc3lzZnMgZm9yIGRldmljZSAqLwogdm9pZCBnaWdhc2V0X2ZyZWVfZGV2X3N5c2ZzKHN0cnVjdCBjYXJkc3RhdGUgKmNzKQogewotCWlmICghY3MtPmNsYXNzKQorCWlmICghY3MtPnR0eV9kZXYpCiAJCXJldHVybjsKIAogCWdpZ19kYmcoREVCVUdfSU5JVCwgInJlbW92aW5nIHN5c2ZzIGVudHJpZXMiKTsKLQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoY3MtPmNsYXNzLCAmY2xhc3NfZGV2aWNlX2F0dHJfY2lkbW9kZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGNzLT50dHlfZGV2LCAmZGV2X2F0dHJfY2lkbW9kZSk7CiB9CiAKIC8qIGluaXRpYWxpemUgc3lzZnMgZm9yIGRldmljZSAqLwogdm9pZCBnaWdhc2V0X2luaXRfZGV2X3N5c2ZzKHN0cnVjdCBjYXJkc3RhdGUgKmNzKQogewotCWlmICghY3MtPmNsYXNzKQorCWlmICghY3MtPnR0eV9kZXYpCiAJCXJldHVybjsKIAogCWdpZ19kYmcoREVCVUdfSU5JVCwgInNldHRpbmcgdXAgc3lzZnMiKTsKLQlpZiAoY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNzLT5jbGFzcywgJmNsYXNzX2RldmljZV9hdHRyX2NpZG1vZGUpKQorCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoY3MtPnR0eV9kZXYsICZkZXZfYXR0cl9jaWRtb2RlKSkKIAkJZGV2X2Vycihjcy0+ZGV2LCAiY291bGQgbm90IGNyZWF0ZSBzeXNmcyBhdHRyaWJ1dGVcbiIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvdXNiLWdpZ2FzZXQuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMKaW5kZXggNGZmYTllYi4uMDRmMmFkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvdXNiLWdpZ2FzZXQuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC91c2ItZ2lnYXNldC5jCkBAIC00MTAsNyArNDEwLDcgQEAKIAogCWlmIChyZXN1Ym1pdCkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKLQkJciA9IGNzLT5jb25uZWN0ZWQgPyB1c2Jfc3VibWl0X3VyYih1cmIsIFNMQUJfQVRPTUlDKSA6IC1FTk9ERVY7CisJCXIgPSBjcy0+Y29ubmVjdGVkID8gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSA6IC1FTk9ERVY7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CiAJCWlmIChyKQogCQkJZGV2X2Vycihjcy0+ZGV2LCAiZXJyb3IgJWQgd2hlbiByZXN1Ym1pdHRpbmcgdXJiLlxuIiwKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCQkJYXRvbWljX3NldCgmdWNzLT5idXN5LCAxKTsKIAogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5sb2NrLCBmbGFncyk7Ci0JCQlzdGF0dXMgPSBjcy0+Y29ubmVjdGVkID8gdXNiX3N1Ym1pdF91cmIodWNzLT5idWxrX291dF91cmIsIFNMQUJfQVRPTUlDKSA6IC1FTk9ERVY7CisJCQlzdGF0dXMgPSBjcy0+Y29ubmVjdGVkID8gdXNiX3N1Ym1pdF91cmIodWNzLT5idWxrX291dF91cmIsIEdGUF9BVE9NSUMpIDogLUVOT0RFVjsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CiAKIAkJCWlmIChzdGF0dXMpIHsKQEAgLTY2NCw3ICs2NjQsNyBAQAogCQkJCQkJICB1Y3MtPmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmIDB4MGYpLAogCQkJCSAgdWNzLT5idWxrX291dF9idWZmZXIsIGNvdW50LAogCQkJCSAgZ2lnYXNldF93cml0ZV9idWxrX2NhbGxiYWNrLCBjcyk7Ci0JCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVjcy0+YnVsa19vdXRfdXJiLCBTTEFCX0FUT01JQyk7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVjcy0+YnVsa19vdXRfdXJiLCBHRlBfQVRPTUlDKTsKIAl9IGVsc2UgewogCQlyZXQgPSAtRU5PREVWOwogCX0KQEAgLTc2Myw3ICs3NjMsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXVjcy0+YnVsa19vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBTTEFCX0tFUk5FTCk7CisJdWNzLT5idWxrX291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghdWNzLT5idWxrX291dF91cmIpIHsKIAkJZGV2X2Vycihjcy0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgYnVsa19vdXRfdXJiXG4iKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKQEAgLTc3NCw3ICs3NzQsNyBAQAogCiAJYXRvbWljX3NldCgmdWNzLT5idXN5LCAwKTsKIAotCXVjcy0+cmVhZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIFNMQUJfS0VSTkVMKTsKKwl1Y3MtPnJlYWRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVjcy0+cmVhZF91cmIpIHsKIAkJZGV2X2Vycihjcy0+ZGV2LCAiTm8gZnJlZSB1cmJzIGF2YWlsYWJsZVxuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CkBAIC03OTcsNyArNzk3LDcgQEAKIAkJCSBnaWdhc2V0X3JlYWRfaW50X2NhbGxiYWNrLAogCQkJIGNzLT5pbmJ1ZiArIDAsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOwogCi0JcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodWNzLT5yZWFkX3VyYiwgU0xBQl9LRVJORUwpOworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVjcy0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2Vycihjcy0+ZGV2LCAiQ291bGQgbm90IHN1Ym1pdCBVUkIgKGVycm9yICVkKVxuIiwgLXJldHZhbCk7CiAJCWdvdG8gZXJyb3I7CkBAIC04MTUsMTQgKzgxNSwxMSBAQAogCXJldHVybiAwOwogCiBlcnJvcjoKLQlpZiAodWNzLT5yZWFkX3VyYikKLQkJdXNiX2tpbGxfdXJiKHVjcy0+cmVhZF91cmIpOworCXVzYl9raWxsX3VyYih1Y3MtPnJlYWRfdXJiKTsKIAlrZnJlZSh1Y3MtPmJ1bGtfb3V0X2J1ZmZlcik7Ci0JaWYgKHVjcy0+YnVsa19vdXRfdXJiICE9IE5VTEwpCi0JCXVzYl9mcmVlX3VyYih1Y3MtPmJ1bGtfb3V0X3VyYik7CisJdXNiX2ZyZWVfdXJiKHVjcy0+YnVsa19vdXRfdXJiKTsKIAlrZnJlZShjcy0+aW5idWZbMF0ucmN2YnVmKTsKLQlpZiAodWNzLT5yZWFkX3VyYiAhPSBOVUxMKQotCQl1c2JfZnJlZV91cmIodWNzLT5yZWFkX3VyYik7CisJdXNiX2ZyZWVfdXJiKHVjcy0+cmVhZF91cmIpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKIAl1Y3MtPnJlYWRfdXJiID0gdWNzLT5idWxrX291dF91cmIgPSBOVUxMOwogCWNzLT5pbmJ1ZlswXS5yY3ZidWYgPSB1Y3MtPmJ1bGtfb3V0X2J1ZmZlciA9IE5VTEw7CkBAIC04NTAsMTEgKzg0Nyw5IEBACiAJdXNiX2tpbGxfdXJiKHVjcy0+YnVsa19vdXRfdXJiKTsJLyogRklYTUU6IG9ubHkgaWYgYWN0aXZlPyAqLwogCiAJa2ZyZWUodWNzLT5idWxrX291dF9idWZmZXIpOwotCWlmICh1Y3MtPmJ1bGtfb3V0X3VyYiAhPSBOVUxMKQotCQl1c2JfZnJlZV91cmIodWNzLT5idWxrX291dF91cmIpOworCXVzYl9mcmVlX3VyYih1Y3MtPmJ1bGtfb3V0X3VyYik7CiAJa2ZyZWUoY3MtPmluYnVmWzBdLnJjdmJ1Zik7Ci0JaWYgKHVjcy0+cmVhZF91cmIgIT0gTlVMTCkKLQkJdXNiX2ZyZWVfdXJiKHVjcy0+cmVhZF91cmIpOworCXVzYl9mcmVlX3VyYih1Y3MtPnJlYWRfdXJiKTsKIAl1Y3MtPnJlYWRfdXJiID0gdWNzLT5idWxrX291dF91cmIgPSBOVUxMOwogCWNzLT5pbmJ1ZlswXS5yY3ZidWYgPSB1Y3MtPmJ1bGtfb3V0X2J1ZmZlciA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jCmluZGV4IDdiYmZkODUuLmViYTEwNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYwpAQCAtMTIxLDEwICsxMjEsOSBAQAogICAgIHBfZGV2LT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKIAogICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBwcml2YXRlIGRldmljZS1zcGVjaWZpYyBkYXRhICovCi0gICAgbG9jYWwgPSBrbWFsbG9jKHNpemVvZihsb2NhbF9pbmZvX3QpLCBHRlBfS0VSTkVMKTsKKyAgICBsb2NhbCA9IGt6YWxsb2Moc2l6ZW9mKGxvY2FsX2luZm9fdCksIEdGUF9LRVJORUwpOwogICAgIGlmICghbG9jYWwpCiAgICAgICAgIGdvdG8gZXJyOwotICAgIG1lbXNldChsb2NhbCwgMCwgc2l6ZW9mKGxvY2FsX2luZm9fdCkpOwogICAgIHBfZGV2LT5wcml2ID0gbG9jYWw7CiAKICAgICByZXR1cm4gYXZtY3NfY29uZmlnKHBfZGV2KTsKQEAgLTE5NCw0MSArMTkzLDExIEBACiAKICAgICBkZXYgPSBsaW5rLT5wcml2OwogCi0gICAgLyoKLSAgICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLSAgICAgICByZWdpc3RlcnMuCi0gICAgKi8KICAgICBkbyB7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIGJyZWFrOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIGJyZWFrOwotCWkgPSBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIGJyZWFrOwotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotICAgIH0gd2hpbGUgKDApOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKLQljc19lcnJvcihsaW5rLCBQYXJzZVR1cGxlLCBpKTsKLQlyZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0KLSAgICBkbyB7Ci0KLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU0OwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotCiAJZGV2bmFtZVswXSA9IDA7Ci0JaWYoICFmaXJzdF90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkgJiYgcGFyc2UudmVyc2lvbl8xLm5zID4gMSApIHsKLQkgICAgc3RybGNweShkZXZuYW1lLHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzFdLCAKLQkJCXNpemVvZihkZXZuYW1lKSk7Ci0JfQorCWlmIChsaW5rLT5wcm9kX2lkWzFdKQorCQlzdHJsY3B5KGRldm5hbWUsIGxpbmstPnByb2RfaWRbMV0sIHNpemVvZihkZXZuYW1lKSk7CisKIAkvKgogICAgICAgICAgKiBmaW5kIElPIHBvcnQKICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2IxLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2IxLmMKaW5kZXggZGEyNzI5Mi4uN2E2OWExOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9iMS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYjEuYwpAQCAtNjUsMTggKzY1LDE1IEBACiAJYXZtY3RybF9pbmZvICpjaW5mbzsKIAlpbnQgaTsKIAotCWNhcmQgPSBrbWFsbG9jKHNpemVvZigqY2FyZCksIEdGUF9LRVJORUwpOworCWNhcmQgPSBremFsbG9jKHNpemVvZigqY2FyZCksIEdGUF9LRVJORUwpOwogCWlmICghY2FyZCkKIAkJcmV0dXJuIE5VTEw7CiAKLQltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKCpjYXJkKSk7Ci0KLSAgICAgICAgY2luZm8gPSBrbWFsbG9jKHNpemVvZigqY2luZm8pICogbnJfY29udHJvbGxlcnMsIEdGUF9LRVJORUwpOworCWNpbmZvID0ga3phbGxvYyhzaXplb2YoKmNpbmZvKSAqIG5yX2NvbnRyb2xsZXJzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNpbmZvKSB7CiAJCWtmcmVlKGNhcmQpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtc2V0KGNpbmZvLCAwLCBzaXplb2YoKmNpbmZvKSAqIG5yX2NvbnRyb2xsZXJzKTsKIAogCWNhcmQtPmN0cmxpbmZvID0gY2luZm87CiAJZm9yIChpID0gMDsgaSA8IG5yX2NvbnRyb2xsZXJzOyBpKyspIHsKQEAgLTcxOCwxMiArNzE1LDExIEBACiAJYXZtY2FyZF9kbWFpbmZvICpwOwogCXZvaWQgKmJ1ZjsKIAotCXAgPSBrbWFsbG9jKHNpemVvZihhdm1jYXJkX2RtYWluZm8pLCBHRlBfS0VSTkVMKTsKKwlwID0ga3phbGxvYyhzaXplb2YoYXZtY2FyZF9kbWFpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBtZW1vcnkuXG4iLCBuYW1lKTsKIAkJZ290byBlcnI7CiAJfQotCW1lbXNldChwLCAwLCBzaXplb2YoYXZtY2FyZF9kbWFpbmZvKSk7CiAKIAlwLT5yZWN2YnVmLnNpemUgPSByc2l6ZTsKIAlidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByc2l6ZSwgJnAtPnJlY3ZidWYuZG1hYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL3QxaXNhLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL3QxaXNhLmMKaW5kZXggZTQ3YzYwYi4uYzkyNTAyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS90MWlzYS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vdDFpc2EuYwpAQCAtNTg0LDYgKzU4NCw3IEBACiB7CiAJaW50IGk7CiAKKwl1bnJlZ2lzdGVyX2NhcGlfZHJpdmVyKCZjYXBpX2RyaXZlcl90MWlzYSk7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9DQVJEUzsgaSsrKSB7CiAJCWlmICghaW9baV0pCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kZWJ1Zy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RlYnVnLmMKaW5kZXggNjg1MWM2Mi4uZDgzNWU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RlYnVnLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RlYnVnLmMKQEAgLTc1NiwxNCArNzU2LDE0IEBACiAKICAgICBkYXRhX2xlbmd0aCAtPSA5OwogCi0gICAgaWYgKCh0b19jb3B5ID0gTUlOKHN0cmxlbihjbGllbnRzW2lkXS5kcnZOYW1lKSwgZGF0YV9sZW5ndGgtMSkpKSB7CisgICAgaWYgKCh0b19jb3B5ID0gbWluKHN0cmxlbihjbGllbnRzW2lkXS5kcnZOYW1lKSwgKHNpemVfdCkoZGF0YV9sZW5ndGgtMSkpKSkgewogICAgICAgbWVtY3B5IChwLCBjbGllbnRzW2lkXS5kcnZOYW1lLCB0b19jb3B5KTsKICAgICAgIHAgKz0gdG9fY29weTsKICAgICAgIGRhdGFfbGVuZ3RoIC09IHRvX2NvcHk7CiAgICAgICBpZiAoKGRhdGFfbGVuZ3RoID49IDQpICYmIGNsaWVudHNbaWRdLmhEYmctPmRydlRhZ1swXSkgewogICAgICAgICAqcCsrID0gJygnOwogICAgICAgICBkYXRhX2xlbmd0aCAtPSAxOwotICAgICAgICBpZiAoKHRvX2NvcHkgPSBNSU4oc3RybGVuKGNsaWVudHNbaWRdLmhEYmctPmRydlRhZyksIGRhdGFfbGVuZ3RoLTIpKSkgeworICAgICAgICBpZiAoKHRvX2NvcHkgPSBtaW4oc3RybGVuKGNsaWVudHNbaWRdLmhEYmctPmRydlRhZyksIChzaXplX3QpKGRhdGFfbGVuZ3RoLTIpKSkpIHsKICAgICAgICAgICBtZW1jcHkgKHAsIGNsaWVudHNbaWRdLmhEYmctPmRydlRhZywgdG9fY29weSk7CiAgICAgICAgICAgcCArPSB0b19jb3B5OwogICAgICAgICAgIGRhdGFfbGVuZ3RoIC09IHRvX2NvcHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaS5jCmluZGV4IDA2MTdkN2MuLmUxZGY4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaS5jCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICBpID0gdGhpcy0+WEN1cnJlbnQ7CiAgICAgWCA9IFBUUl9YKGEsdGhpcyk7CiAgICAgd2hpbGUoaTx0aGlzLT5YTnVtICYmIGxlbmd0aDwyNzApIHsKLSAgICAgIGNsZW5ndGggPSBNSU4oKHdvcmQpKDI3MC1sZW5ndGgpLFhbaV0uUExlbmd0aC10aGlzLT5YT2Zmc2V0KTsKKyAgICAgIGNsZW5ndGggPSBtaW4oKHdvcmQpKDI3MC1sZW5ndGgpLCh3b3JkKShYW2ldLlBMZW5ndGgtdGhpcy0+WE9mZnNldCkpOwogICAgICAgYS0+cmFtX291dF9idWZmZXIoYSwKICAgICAgICAgICAgICAgICAgICAgICAgICZSZXFPdXQtPlhCdWZmZXIuUFtsZW5ndGhdLAogICAgICAgICAgICAgICAgICAgICAgICAgUFRSX1AoYSx0aGlzLCZYW2ldLlBbdGhpcy0+WE9mZnNldF0pLApAQCAtNjIyLDcgKzYyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhLT5zdHJlYW1fYnVmZmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsLCBOVUxMLCBOVUxMKTsKICAgICAgICAgfQotICAgICAgICBJb0FkYXB0ZXItPlJCdWZmZXIubGVuZ3RoID0gTUlOKE1MZW5ndGgsIDI3MCk7CisgICAgICAgIElvQWRhcHRlci0+UkJ1ZmZlci5sZW5ndGggPSBtaW4oTUxlbmd0aCwgKHdvcmQpMjcwKTsKICAgICAgICAgaWYgKElvQWRhcHRlci0+UkJ1ZmZlci5sZW5ndGggIT0gTUxlbmd0aCkgewogICAgICAgICAgIHRoaXMtPmNvbXBsZXRlID0gMDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTY3Niw5ICs2NzYsOSBAQAogICAgICAgICB0aGlzLT5SQ3VycmVudCsrOwogICAgICAgfQogICAgICAgaWYgKGNtYSkgewotICAgICAgICBjbGVuZ3RoID0gTUlOKE1MZW5ndGgsIFJbdGhpcy0+UkN1cnJlbnRdLlBMZW5ndGgtdGhpcy0+Uk9mZnNldCk7CisgICAgICAgIGNsZW5ndGggPSBtaW4oTUxlbmd0aCwgKHdvcmQpKFJbdGhpcy0+UkN1cnJlbnRdLlBMZW5ndGgtdGhpcy0+Uk9mZnNldCkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xlbmd0aCA9IE1JTihhLT5yYW1faW53KGEsICZSQnVmZmVyLT5sZW5ndGgpLW9mZnNldCwKKyAgICAgICAgY2xlbmd0aCA9IG1pbihhLT5yYW1faW53KGEsICZSQnVmZmVyLT5sZW5ndGgpLW9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICBSW3RoaXMtPlJDdXJyZW50XS5QTGVuZ3RoLXRoaXMtPlJPZmZzZXQpOwogICAgICAgfQogICAgICAgaWYoUlt0aGlzLT5SQ3VycmVudF0uUCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RpdmFzbWFpbi5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RpdmFzbWFpbi5jCmluZGV4IGRhZTJlODMuLjkxZmM5MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kaXZhc21haW4uYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGl2YXNtYWluLmMKQEAgLTE4NSw3ICsxODUsNyBAQAogCXVuc2lnbmVkIGNoYXIgbGluZVsxNjBdOwogCiAJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQl2c3ByaW50ZihsaW5lLCBmb3JtYXQsIGFyZ3MpOworCXZzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksIGZvcm1hdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLCBEUklWRVJMTkFNRSwgbGluZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vaW8uYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pby5jCmluZGV4IDRhMjdlMjMuLjZmZDliMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pby5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pby5jCkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICBjYXNlIElESV9TWU5DX1JFUV9YRElfR0VUX0NBUElfUEFSQU1TOiB7CiAgICAgICAgZGl2YV94ZGlfZ2V0X2NhcGlfcGFyYW1ldGVyc190IHBybXMsICpwSSA9ICZzeW5jUmVxLT54ZGlfY2FwaV9wcm1zLmluZm87CiAgICAgICAgbWVtc2V0ICgmcHJtcywgMHgwMCwgc2l6ZW9mKHBybXMpKTsKLSAgICAgICBwcm1zLnN0cnVjdHVyZV9sZW5ndGggPSBNSU4oc2l6ZW9mKHBybXMpLCBwSS0+c3RydWN0dXJlX2xlbmd0aCk7CisgICAgICAgcHJtcy5zdHJ1Y3R1cmVfbGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBzaXplb2YocHJtcyksIHBJLT5zdHJ1Y3R1cmVfbGVuZ3RoKTsKICAgICAgICBtZW1zZXQgKHBJLCAweDAwLCBwSS0+c3RydWN0dXJlX2xlbmd0aCk7CiAgICAgICAgcHJtcy5mbGFnX2R5bmFtaWNfbDFfZG93biAgICA9IChJb0FkYXB0ZXItPmNhcGlfY2ZnLmNmZ18xICYgXAogICAgICAgICAgRElWQV9YRElfQ0FQSV9DRkdfMV9EWU5BTUlDX0wxX09OKSA/IDEgOiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2lzdHJlYW0uYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pc3RyZWFtLmMKaW5kZXggMjMxMzk2Ni4uMThmODc5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2lzdHJlYW0uYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vaXN0cmVhbS5jCkBAIC05Miw3ICs5Miw3IEBACiAgICAgcmV0dXJuICgtMSk7IC8qIHdhcyBub3QgYWJsZSB0byB3cml0ZSAgICAgICAqLwogICAgYnJlYWs7ICAgICAvKiBvbmx5IHBhcnQgb2YgbWVzc2FnZSB3YXMgd3JpdHRlbiAqLwogICB9Ci0gIHRvX3dyaXRlID0gTUlOKGxlbmd0aCwgRElWQV9ERklGT19EQVRBX1NaKTsKKyAgdG9fd3JpdGUgPSBtaW4obGVuZ3RoLCBESVZBX0RGSUZPX0RBVEFfU1opOwogICBpZiAodG9fd3JpdGUpIHsKICAgIGEtPnJhbV9vdXRfYnVmZmVyIChhLAogI2lmZGVmIFBMQVRGT1JNX0dUXzMyQklUCkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICByZXR1cm4gKC0xKTsgLyogd2FzIG5vdCBhYmxlIHRvIHJlYWQgKi8KICAgIGJyZWFrOwogICB9Ci0gIHRvX3JlYWQgPSBNSU4obWF4X2xlbmd0aCwgdG1wWzFdKTsKKyAgdG9fcmVhZCA9IG1pbihtYXhfbGVuZ3RoLCAoaW50KXRtcFsxXSk7CiAgIGlmICh0b19yZWFkKSB7CiAgICBhLT5yYW1faW5fYnVmZmVyKGEsCiAjaWZkZWYgUExBVEZPUk1fR1RfMzJCSVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc180YnJpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfNGJyaS5jCmluZGV4IDExZTZmOTMuLjdiNGVjM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc180YnJpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zXzRicmkuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIC8qCiAqKiAgQ2xlYW51cCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmb3IgbWFzdGVyIGFkYXB0ZXIgb25seQotKiogIHRoaXMgaXMgZ2FyYW50ZWVkIGJ5IGRlc2lnbjogY2xlYW51cCBjYWxsYmFjayBpcyBzZXQKKyoqICB0aGlzIGlzIGd1YXJhbnRlZWQgYnkgZGVzaWduOiBjbGVhbnVwIGNhbGxiYWNrIGlzIHNldAogKiogIGJ5IG1hc3RlciBhZGFwdGVyIG9ubHkKICovCiBzdGF0aWMgaW50IGRpdmFfNGJyaV9jbGVhbnVwX2FkYXB0ZXIoZGl2YV9vc194ZGlfYWRhcHRlcl90ICogYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9wbGF0Zm9ybS5oIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL3BsYXRmb3JtLmgKaW5kZXggYTY2ODM2Yy4uMjQ0NDgxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL3BsYXRmb3JtLmgKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL3BsYXRmb3JtLmgKQEAgLTgzLDE0ICs4Myw2IEBACiAjZGVmaW5lCU5VTEwJKCh2b2lkICopIDApCiAjZW5kaWYKIAotI2lmbmRlZglNSU4KLSNkZWZpbmUgTUlOKGEsYikJKChhKT4oYikgPyAoYikgOiAoYSkpCi0jZW5kaWYKLQotI2lmbmRlZglNQVgKLSNkZWZpbmUgTUFYKGEsYikJKChhKT4oYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQogI2lmbmRlZglmYXIKICNkZWZpbmUgZmFyCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2hpc2F4L0tjb25maWcKaW5kZXggZWI1N2E5OC4uMzRhYjVmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L0tjb25maWcKQEAgLTExMCw3ICsxMTAsNyBAQAogCiBjb25maWcgSElTQVhfVEVMRVNQQ0kKIAlib29sICJUZWxlcyBQQ0kiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SyB8fCBGUlYpKQorCWRlcGVuZHMgb24gUENJICYmIChCUk9LRU4gfHwgIShTUEFSQyB8fCBQUEMgfHwgUEFSSVNDIHx8IE02OEsgfHwgKE1JUFMgJiYgIUNQVV9MSVRUTEVfRU5ESUFOKSB8fCBGUlYpKQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBIaVNheCBzdXBwb3J0IGZvciB0aGUgVGVsZXMgUENJLgogCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuSGlTYXg+IG9uIGhvdyB0byBjb25maWd1cmUgaXQuCkBAIC0yMzgsNyArMjM4LDcgQEAKIAogY29uZmlnIEhJU0FYX05FVEpFVAogCWJvb2wgIk5FVGpldCBjYXJkIgotCWRlcGVuZHMgb24gUENJICYmIChCUk9LRU4gfHwgIShTUEFSQyB8fCBQUEMgfHwgUEFSSVNDIHx8IE02OEsgfHwgRlJWKSkKKwlkZXBlbmRzIG9uIFBDSSAmJiAoQlJPS0VOIHx8ICEoU1BBUkMgfHwgUFBDIHx8IFBBUklTQyB8fCBNNjhLIHx8IChNSVBTICYmICFDUFVfTElUVExFX0VORElBTikgfHwgRlJWKSkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgSGlTYXggc3VwcG9ydCBmb3IgdGhlIE5ldEpldCBmcm9tIFRyYXZlcnNlCiAJICBUZWNobm9sb2dpZXMuCkBAIC0yNDksNyArMjQ5LDcgQEAKIAogY29uZmlnIEhJU0FYX05FVEpFVF9VCiAJYm9vbCAiTkVUc3BpZGVyIFUgY2FyZCIKLQlkZXBlbmRzIG9uIFBDSSAmJiAoQlJPS0VOIHx8ICEoU1BBUkMgfHwgUFBDIHx8IFBBUklTQyB8fCBNNjhLIHx8IEZSVikpCisJZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SyB8fCAoTUlQUyAmJiAhQ1BVX0xJVFRMRV9FTkRJQU4pIHx8IEZSVikpCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIEhpU2F4IHN1cHBvcnQgZm9yIHRoZSBOZXRzcGlkZXIgVSBpbnRlcmZhY2UgSVNETiBjYXJkCiAJICBmcm9tIFRyYXZlcnNlIFRlY2hub2xvZ2llcy4KQEAgLTMxNyw3ICszMTcsNyBAQAogCiBjb25maWcgSElTQVhfSEZDX1BDSQogCWJvb2wgIkhGQyBQQ0ktQnVzIGNhcmRzIgotCWRlcGVuZHMgb24gUENJICYmIChCUk9LRU4gfHwgIShTUEFSQyB8fCBQUEMgfHwgUEFSSVNDIHx8IE02OEsgfHwgRlJWKSkKKwlkZXBlbmRzIG9uIFBDSSAmJiAoQlJPS0VOIHx8ICEoU1BBUkMgfHwgUFBDIHx8IFBBUklTQyB8fCBNNjhLIHx8IChNSVBTICYmICFDUFVfTElUVExFX0VORElBTikgfHwgRlJWKSkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgSGlTYXggc3VwcG9ydCBmb3IgdGhlIEhGQy1TIFBDSSAyQkRTMCBiYXNlZCBjYXJkcy4KIApAQCAtMzQ0LDE4ICszNDQsMTEgQEAKIAogY29uZmlnIEhJU0FYX0VOVEVSTk9XX1BDSQogCWJvb2wgIkZvcm11bGEtbiBlbnRlcjpub3cgUENJIGNhcmQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgKEJST0tFTiB8fCAhKFNQQVJDIHx8IFBQQyB8fCBQQVJJU0MgfHwgTTY4SyB8fCBGUlYpKQorCWRlcGVuZHMgb24gSElTQVhfTkVUSkVUICYmIFBDSSAmJiAoQlJPS0VOIHx8ICEoU1BBUkMgfHwgUFBDIHx8IFBBUklTQyB8fCBNNjhLIHx8IChNSVBTICYmICFDUFVfTElUVExFX0VORElBTikgfHwgRlJWKSkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgSGlTYXggc3VwcG9ydCBmb3IgdGhlIEZvcm11bGEtbiBlbnRlcjpub3cgUENJCiAJICBJU0ROIGNhcmQuCiAKLWNvbmZpZyBISVNBWF9BTUQ3OTMwCi0JYm9vbCAiQW03OTMwIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFNQQVJDICYmIEJST0tFTgotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyBIaVNheCBzdXBwb3J0IGZvciB0aGUgQU1ENzkzMCBjaGlwcyBvbiBzb21lIFNQQVJDcy4KLQkgIFRoaXMgY29kZSBpcyBub3QgZmluaXNoZWQgeWV0LgotCiBlbmRpZgogCiBpZiBJU0ROX0RSVl9ISVNBWApAQCAtNDAyLDYgKzM5NSw3IEBACiAJdHJpc3RhdGUgIlNUNTQ4MSBVU0IgSVNETiBtb2RlbSAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIFVTQiAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgQ1JDX0NDSVRUCisJc2VsZWN0IEJJVFJFVkVSU0UKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgdGhlIGRyaXZlciBmb3IgU1Q1NDgxIGJhc2VkIFVTQiBJU0ROIGFkYXB0ZXJzLAogCSAgZS5nLiB0aGUgQmVXYW4gR2F6ZWwgMTI4IFVTQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2FtZDc5MzBfZm4uYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9hbWQ3OTMwX2ZuLmMKaW5kZXggYmVjNTkwMS4uM2IxOWNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2FtZDc5MzBfZm4uYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYW1kNzkzMF9mbi5jCkBAIC0yMzIsOSArMjMyLDEwIEBACiAKIAogc3RhdGljIHZvaWQKLUFtZDc5MzBfYmgoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQorQW1kNzkzMF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0KKwlzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IElzZG5DYXJkU3RhdGUsIHRxdWV1ZSk7CiAgICAgICAgIHN0cnVjdCBQU3RhY2sgKnN0cHRyOwogCiAJaWYgKCFjcykKQEAgLTc4OSw3ICs3OTAsNyBAQAogdm9pZCBfX2RldmluaXQKIHNldHVwX0FtZDc5MzAoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewotICAgICAgICBJTklUX1dPUksoJmNzLT50cXVldWUsICh2b2lkICopKHZvaWQgKikgQW1kNzkzMF9iaCwgY3MpOworICAgICAgICBJTklUX1dPUksoJmNzLT50cXVldWUsIEFtZDc5MzBfYmgpOwogCWNzLT5kYnVzeXRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikgZGJ1c3lfdGltZXJfaGFuZGxlcjsKIAljcy0+ZGJ1c3l0aW1lci5kYXRhID0gKGxvbmcpIGNzOwogCWluaXRfdGltZXIoJmNzLT5kYnVzeXRpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKaW5kZXggYWMyOGUzMi4uOWU3MGMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bWExX2NzLmMKQEAgLTEyMywxMSArMTIzLDEwIEBACiAgICAgREVCVUcoMCwgImF2bWExY3NfYXR0YWNoKClcbiIpOwogCiAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHByaXZhdGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgKi8KLSAgICBsb2NhbCA9IGttYWxsb2Moc2l6ZW9mKGxvY2FsX2luZm9fdCksIEdGUF9LRVJORUwpOworICAgIGxvY2FsID0ga3phbGxvYyhzaXplb2YobG9jYWxfaW5mb190KSwgR0ZQX0tFUk5FTCk7CiAgICAgaWYgKCFsb2NhbCkKIAlyZXR1cm4gLUVOT01FTTsKIAotICAgIG1lbXNldChsb2NhbCwgMCwgc2l6ZW9mKGxvY2FsX2luZm9fdCkpOwogICAgIHBfZGV2LT5wcml2ID0gbG9jYWw7CiAKICAgICAvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcgKi8KQEAgLTIxNiw0MSArMjE1LDExIEBACiAKICAgICBERUJVRygwLCAiYXZtYTFjc19jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgLyoKLSAgICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLSAgICAgICByZWdpc3RlcnMuCi0gICAgKi8KICAgICBkbyB7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIGJyZWFrOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIGJyZWFrOwotCWkgPSBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotCWlmIChpICE9IENTX1NVQ0NFU1MpIGJyZWFrOwotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotICAgIH0gd2hpbGUgKDApOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKLQljc19lcnJvcihsaW5rLCBQYXJzZVR1cGxlLCBpKTsKLQlyZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0KLSAgICBkbyB7Ci0KLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU0OwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotCiAJZGV2bmFtZVswXSA9IDA7Ci0JaWYoICFmaXJzdF90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkgJiYgcGFyc2UudmVyc2lvbl8xLm5zID4gMSApIHsKLQkgICAgc3RybGNweShkZXZuYW1lLHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzFdLCAKLQkJCXNpemVvZihkZXZuYW1lKSk7Ci0JfQorCWlmIChsaW5rLT5wcm9kX2lkWzFdKQorCQlzdHJsY3B5KGRldm5hbWUsIGxpbmstPnByb2RfaWRbMV0sIHNpemVvZihkZXZuYW1lKSk7CisKIAkvKgogICAgICAgICAgKiBmaW5kIElPIHBvcnQKICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKaW5kZXggZTQ4MjNhYjIuLjE3ZWMwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKQEAgLTIyNywxNCArMjI3LDYgQEAKICNkZWZpbmUgREVGQVVMVF9DRkcgezUsMHgyRTAsMCwwfQogI2VuZGlmCiAKLQotI2lmZGVmIENPTkZJR19ISVNBWF9BTUQ3OTMwCi0jdW5kZWYgREVGQVVMVF9DQVJECi0jdW5kZWYgREVGQVVMVF9DRkcKLSNkZWZpbmUgREVGQVVMVF9DQVJEIElTRE5fQ1RZUEVfQU1ENzkzMAotI2RlZmluZSBERUZBVUxUX0NGRyB7MTIsMHgzZTAsMCwwfQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfSElTQVhfTklDQ1kKICN1bmRlZiBERUZBVUxUX0NBUkQKICN1bmRlZiBERUZBVUxUX0NGRwpAQCAtNTQ1LDEwICs1MzcsNiBAQAogZXh0ZXJuIGludCBzZXR1cF9oZmNzeChzdHJ1Y3QgSXNkbkNhcmQgKmNhcmQpOwogI2VuZGlmCiAKLSNpZiBDQVJEX0FNRDc5MzAKLWV4dGVybiBpbnQgc2V0dXBfYW1kNzkzMChzdHJ1Y3QgSXNkbkNhcmQgKmNhcmQpOwotI2VuZGlmCi0KICNpZiBDQVJEX05JQ0NZCiBleHRlcm4gaW50IHNldHVwX25pY2N5KHN0cnVjdCBJc2RuQ2FyZCAqY2FyZCk7CiAjZW5kaWYKQEAgLTYzMSw3ICs2MTksOCBAQAogCQljb3VudCA9IGNzLT5zdGF0dXNfZW5kIC0gY3MtPnN0YXR1c19yZWFkICsgMTsKIAkJaWYgKGNvdW50ID49IGxlbikKIAkJCWNvdW50ID0gbGVuOwotCQljb3B5X3RvX3VzZXIocCwgY3MtPnN0YXR1c19yZWFkLCBjb3VudCk7CisJCWlmIChjb3B5X3RvX3VzZXIocCwgY3MtPnN0YXR1c19yZWFkLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJY3MtPnN0YXR1c19yZWFkICs9IGNvdW50OwogCQlpZiAoY3MtPnN0YXR1c19yZWFkID4gY3MtPnN0YXR1c19lbmQpCiAJCQljcy0+c3RhdHVzX3JlYWQgPSBjcy0+c3RhdHVzX2J1ZjsKQEAgLTY0Miw3ICs2MzEsOCBAQAogCQkJCWNudCA9IEhJU0FYX1NUQVRVU19CVUZTSVpFOwogCQkJZWxzZQogCQkJCWNudCA9IGNvdW50OwotCQkJY29weV90b191c2VyKHAsIGNzLT5zdGF0dXNfcmVhZCwgY250KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIocCwgY3MtPnN0YXR1c19yZWFkLCBjbnQpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcCArPSBjbnQ7CiAJCQljcy0+c3RhdHVzX3JlYWQgKz0gY250ICUgSElTQVhfU1RBVFVTX0JVRlNJWkU7CiAJCQljb3VudCAtPSBjbnQ7CkBAIC04NjcsMTQgKzg1NywxMyBAQAogCXN0cnVjdCBJc2RuQ2FyZCAqY2FyZCA9IGNhcmRzICsgY2FyZG5yOwogCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjczsKIAotCWNzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IElzZG5DYXJkU3RhdGUpLCBHRlBfQVRPTUlDKTsKKwljcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBJc2RuQ2FyZFN0YXRlKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjcykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiSGlTYXg6IE5vIG1lbW9yeSBmb3IgSXNkbkNhcmRTdGF0ZShjYXJkICVkKVxuIiwKIAkJICAgICAgIGNhcmRuciArIDEpOwogCQlnb3RvIG91dDsKIAl9Ci0JbWVtc2V0KGNzLCAwLCBzaXplb2Yoc3RydWN0IElzZG5DYXJkU3RhdGUpKTsKIAljYXJkLT5jcyA9IGNzOwogCXNwaW5fbG9ja19pbml0KCZjcy0+c3RhdGxvY2spOwogCXNwaW5fbG9ja19pbml0KCZjcy0+bG9jayk7CkBAIC0xMDYyLDExICsxMDUxLDYgQEAKIAkJcmV0ID0gc2V0dXBfbmljY3koY2FyZCk7CiAJCWJyZWFrOwogI2VuZGlmCi0jaWYgQ0FSRF9BTUQ3OTMwCi0JY2FzZSBJU0ROX0NUWVBFX0FNRDc5MzA6Ci0JCXJldCA9IHNldHVwX2FtZDc5MzAoY2FyZCk7Ci0JCWJyZWFrOwotI2VuZGlmCiAjaWYgQ0FSRF9JU1VSRgogCWNhc2UgSVNETl9DVFlQRV9JU1VSRjoKIAkJcmV0ID0gc2V0dXBfaXN1cmYoY2FyZCk7CkBAIC0xMTM1LDcgKzExMTksNiBAQAogCWNzLT50eF9za2IgPSBOVUxMOwogCWNzLT50eF9jbnQgPSAwOwogCWNzLT5ldmVudCA9IDA7Ci0JY3MtPnRxdWV1ZS5kYXRhID0gY3M7CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZjcy0+cnEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNzLT5zcSk7CkBAIC0xNDM2LDcgKzE0MTksNiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgSVNETl9DVFlQRV9FTFNBX1BDSToKIAkJY2FzZSBJU0ROX0NUWVBFX05FVEpFVF9TOgotCQljYXNlIElTRE5fQ1RZUEVfQU1ENzkzMDoKIAkJY2FzZSBJU0ROX0NUWVBFX1RFTEVTUENJOgogCQljYXNlIElTRE5fQ1RZUEVfVzY2OTI6CiAJCWNhc2UgSVNETl9DVFlQRV9ORVRKRVRfVToKQEAgLTE1NTIsNyArMTUzNCw3IEBACiBzdGF0aWMgaW50IGhpc2F4X2NhcmRtc2coc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgbXQsIHZvaWQgKmFyZyk7CiBzdGF0aWMgaW50IGhpc2F4X2JjX3NldHN0YWNrKHN0cnVjdCBQU3RhY2sgKnN0LCBzdHJ1Y3QgQkNTdGF0ZSAqYmNzKTsKIHN0YXRpYyB2b2lkIGhpc2F4X2JjX2Nsb3NlKHN0cnVjdCBCQ1N0YXRlICpiY3MpOwotc3RhdGljIHZvaWQgaGlzYXhfYmgoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKK3N0YXRpYyB2b2lkIGhpc2F4X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgdm9pZCBFQ2hhbm5lbF9wcm9jX3JjdihzdHJ1Y3QgaGlzYXhfZF9pZiAqZF9pZik7CiAKIGludCBoaXNheF9yZWdpc3RlcihzdHJ1Y3QgaGlzYXhfZF9pZiAqaGlzYXhfZF9pZiwgc3RydWN0IGhpc2F4X2JfaWYgKmJfaWZbXSwKQEAgLTE1ODQsNyArMTU2Niw3IEBACiAJaGlzYXhfZF9pZi0+Y3MgPSBjczsKIAljcy0+aHcuaGlzYXhfZF9pZiA9IGhpc2F4X2RfaWY7CiAJY3MtPmNhcmRtc2cgPSBoaXNheF9jYXJkbXNnOwotCUlOSVRfV09SSygmY3MtPnRxdWV1ZSwgKHZvaWQgKikodm9pZCAqKWhpc2F4X2JoLCBjcyk7CisJSU5JVF9XT1JLKCZjcy0+dHF1ZXVlLCBoaXNheF9iaCk7CiAJY3MtPmNoYW5uZWxbMF0uZF9zdC0+bDIubDJsMSA9IGhpc2F4X2RfbDJsMTsKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCWNzLT5iY3NbaV0uQkNfU2V0U3RhY2sgPSBoaXNheF9iY19zZXRzdGFjazsKQEAgLTE2MTYsOCArMTU5OCwxMCBAQAogCXNjaGVkdWxlX3dvcmsoJmNzLT50cXVldWUpOwogfQogCi1zdGF0aWMgdm9pZCBoaXNheF9iaChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCitzdGF0aWMgdm9pZCBoaXNheF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBJc2RuQ2FyZFN0YXRlLCB0cXVldWUpOwogCXN0cnVjdCBQU3RhY2sgKnN0OwogCWludCBwcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9kaXZhLmMKaW5kZXggN2U5NWYwNC4uNmVlYmViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZGl2YS5jCkBAIC03MTYsOCArNzE2LDEwIEBACiAKIAkJKmNmZyA9IDA7IC8qIGRpc2FibGUgSU5UMC8xICovIAogCQkqY2ZnID0gMjsgLyogcmVzZXQgcGVuZGluZyBJTlQwICovCi0JCWlvdW5tYXAoKHZvaWQgKiljcy0+aHcuZGl2YS5jZmdfcmVnKTsKLQkJaW91bm1hcCgodm9pZCAqKWNzLT5ody5kaXZhLnBjaV9jZmcpOworCQlpZiAoY3MtPmh3LmRpdmEuY2ZnX3JlZykKKwkJCWlvdW5tYXAoKHZvaWQgKiljcy0+aHcuZGl2YS5jZmdfcmVnKTsKKwkJaWYgKGNzLT5ody5kaXZhLnBjaV9jZmcpCisJCQlpb3VubWFwKCh2b2lkICopY3MtPmh3LmRpdmEucGNpX2NmZyk7CiAJCXJldHVybjsKIAl9IGVsc2UgaWYgKGNzLT5zdWJ0eXAgIT0gRElWQV9JUEFDX0lTQSkgewogCQlkZWxfdGltZXIoJmNzLT5ody5kaXZhLnRsKTsKQEAgLTczNCw2ICs3MzYsMjMgQEAKIH0KIAogc3RhdGljIHZvaWQKK2lvdW5tYXBfZGl2YShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCit7CisJaWYgKChjcy0+c3VidHlwID09IERJVkFfSVBBQ19QQ0kpIHx8IChjcy0+c3VidHlwID09IERJVkFfSVBBQ1hfUENJKSkgeworCQlpZiAoY3MtPmh3LmRpdmEuY2ZnX3JlZykgeworCQkJaW91bm1hcCgodm9pZCAqKWNzLT5ody5kaXZhLmNmZ19yZWcpOworCQkJY3MtPmh3LmRpdmEuY2ZnX3JlZyA9IDA7CisJCX0KKwkJaWYgKGNzLT5ody5kaXZhLnBjaV9jZmcpIHsKKwkJCWlvdW5tYXAoKHZvaWQgKiljcy0+aHcuZGl2YS5wY2lfY2ZnKTsKKwkJCWNzLT5ody5kaXZhLnBjaV9jZmcgPSAwOworCQl9CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAogcmVzZXRfZGl2YShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJaWYgKGNzLT5zdWJ0eXAgPT0gRElWQV9JUEFDX0lTQSkgewpAQCAtMTA2OSwxMSArMTA4OCwxMyBAQAogCiAJCWlmICghY3MtPmlycSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGl2YTogTm8gSVJRIGZvciBQQ0kgY2FyZCBmb3VuZFxuIik7CisJCQlpb3VubWFwX2RpdmEoY3MpOwogCQkJcmV0dXJuKDApOwogCQl9CiAKIAkJaWYgKCFjcy0+aHcuZGl2YS5jZmdfcmVnKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJEaXZhOiBObyBJTy1BZHIgZm9yIFBDSSBjYXJkIGZvdW5kXG4iKTsKKwkJCWlvdW5tYXBfZGl2YShjcyk7CiAJCQlyZXR1cm4oMCk7CiAJCX0KIAkJY3MtPmlycV9mbGFncyB8PSBJUlFGX1NIQVJFRDsKQEAgLTExMDAsNyArMTEyMSwxMSBAQAogCQkJYnl0ZWNudCA9IDMyOwogCQl9CiAJfQorCisjaWZkZWYgX19JU0FQTlBfXwogcmVhZHk6CisjZW5kaWYKKwogCXByaW50ayhLRVJOX0lORk8KIAkJIkRpdmE6ICVzIGNhcmQgY29uZmlndXJlZCBhdCAlI2x4IElSUSAlZFxuIiwKIAkJKGNzLT5zdWJ0eXAgPT0gRElWQV9QQ0kpID8gIlBDSSIgOgpAQCAtMTEyMyw2ICsxMTQ4LDcgQEAKIAkJCSAgICAgICBDYXJkVHlwZVtjYXJkLT50eXBdLAogCQkJICAgICAgIGNzLT5ody5kaXZhLmNmZ19yZWcsCiAJCQkgICAgICAgY3MtPmh3LmRpdmEuY2ZnX3JlZyArIGJ5dGVjbnQpOworCQkJaW91bm1hcF9kaXZhKGNzKTsKIAkJCXJldHVybiAoMCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2FfY3MuYwppbmRleCBlMThlNzViLi43OWFiOWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMKQEAgLTE0Niw5ICsxNDYsOCBAQAogICAgIERFQlVHKDAsICJlbHNhX2NzX2F0dGFjaCgpXG4iKTsKIAogICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBwcml2YXRlIGRldmljZS1zcGVjaWZpYyBkYXRhICovCi0gICAgbG9jYWwgPSBrbWFsbG9jKHNpemVvZihsb2NhbF9pbmZvX3QpLCBHRlBfS0VSTkVMKTsKKyAgICBsb2NhbCA9IGt6YWxsb2Moc2l6ZW9mKGxvY2FsX2luZm9fdCksIEdGUF9LRVJORUwpOwogICAgIGlmICghbG9jYWwpIHJldHVybiAtRU5PTUVNOwotICAgIG1lbXNldChsb2NhbCwgMCwgc2l6ZW9mKGxvY2FsX2luZm9fdCkpOwogCiAgICAgbG9jYWwtPnBfZGV2ID0gbGluazsKICAgICBsaW5rLT5wcml2ID0gbG9jYWw7CkBAIC0yNDIsMjMgKzI0MSw2IEBACiAgICAgREVCVUcoMCwgImVsc2FfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKICAgICBkZXYgPSBsaW5rLT5wcml2OwogCi0gICAgLyoKLSAgICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLSAgICAgICByZWdpc3RlcnMuCi0gICAgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICBpID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOwotICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKLSAgICAgICAgbGFzdF9mbiA9IFBhcnNlVHVwbGU7Ci0JZ290byBjc19mYWlsZWQ7Ci0gICAgfQotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQogICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CiAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOyB0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvZnNtLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZnNtLmMKaW5kZXggMGQ0NGEzZi4uMzRmYWRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2ZzbS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9mc20uYwpAQCAtMjYsMTIgKzI2LDEwIEBACiAJaW50IGk7CiAKIAlmc20tPmp1bXBtYXRyaXggPSAoRlNNRk5QVFIgKikKLQkJa21hbGxvYyhzaXplb2YgKEZTTUZOUFRSKSAqIGZzbS0+c3RhdGVfY291bnQgKiBmc20tPmV2ZW50X2NvdW50LCBHRlBfS0VSTkVMKTsKKwkJa3phbGxvYyhzaXplb2YgKEZTTUZOUFRSKSAqIGZzbS0+c3RhdGVfY291bnQgKiBmc20tPmV2ZW50X2NvdW50LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZzbS0+anVtcG1hdHJpeCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQoZnNtLT5qdW1wbWF0cml4LCAwLCBzaXplb2YgKEZTTUZOUFRSKSAqIGZzbS0+c3RhdGVfY291bnQgKiBmc20tPmV2ZW50X2NvdW50KTsKLQogCWZvciAoaSA9IDA7IGkgPCBmbmNvdW50OyBpKyspIAogCQlpZiAoKGZubGlzdFtpXS5zdGF0ZT49ZnNtLT5zdGF0ZV9jb3VudCkgfHwgKGZubGlzdFtpXS5ldmVudD49ZnNtLT5ldmVudF9jb3VudCkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRnNtTmV3IEVycm9yIGxpbmUgJWQgc3QoJWxkLyVsZCkgZXYoJWxkLyVsZClcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjNHM4c19sMS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuYwppbmRleCBkODUyYzlkLi5hMmZhNGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjNHM4c19sMS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmM0czhzX2wxLmMKQEAgLTEwODMsOCArMTA4Myw5IEBACiAvKiBib3R0b20gaGFsZiBoYW5kbGVyIGZvciBpbnRlcnJ1cHQgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQKLWhmYzRzOHNfYmgoaGZjNHM4c19odyAqIGh3KQoraGZjNHM4c19iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJaGZjNHM4c19odyAqaHcgPSBjb250YWluZXJfb2Yod29yaywgaGZjNHM4c19odywgdHF1ZXVlKTsKIAl1X2NoYXIgYjsKIAlzdHJ1Y3QgaGZjNHM4c19sMSAqbDFwOwogCXZvbGF0aWxlIHVfY2hhciAqZmlmb19zdGF0OwpAQCAtMTU1MCw3ICsxNTUxLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JSU5JVF9XT1JLKCZody0+dHF1ZXVlLCAodm9pZCAqKSAodm9pZCAqKSBoZmM0czhzX2JoLCBodyk7CisJSU5JVF9XT1JLKCZody0+dHF1ZXVlLCBoZmM0czhzX2JoKTsKIAogCWlmIChyZXF1ZXN0X2lycQogCSAgICAoaHctPmlycSwgaGZjNHM4c19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBody0+Y2FyZF9uYW1lLCBodykpIHsKQEAgLTE1OTAsMTEgKzE1OTEsMTAgQEAKIAloZmM0czhzX3BhcmFtICpkcml2ZXJfZGF0YSA9IChoZmM0czhzX3BhcmFtICopIGVudC0+ZHJpdmVyX2RhdGE7CiAJaGZjNHM4c19odyAqaHc7CiAKLQlpZiAoIShodyA9IGttYWxsb2Moc2l6ZW9mKGhmYzRzOHNfaHcpLCBHRlBfQVRPTUlDKSkpIHsKKwlpZiAoIShodyA9IGt6YWxsb2Moc2l6ZW9mKGhmYzRzOHNfaHcpLCBHRlBfQVRPTUlDKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJObyBrbWVtIGZvciBIRkMtNFMvOFMgY2FyZFxuIik7CiAJCXJldHVybiAoZXJyKTsKIAl9Ci0JbWVtc2V0KGh3LCAwLCBzaXplb2YoaGZjNHM4c19odykpOwogCiAJaHctPnBkZXYgPSBwZGV2OwogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuaCBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmM0czhzX2wxLmgKaW5kZXggZThmOWMwNy4uOWQ1ZDJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjNHM4c19sMS5oCkBAIC0xNiw3ICsxNiw3IEBACiAKIC8qCiAqICBpbmNsdWRlIEdlbmVybyBnZW5lcmF0ZWQgSEZDLTRTLzhTIGhlYWRlciBmaWxlIGhmYzQ4c2N1LmgKLSogIGZvciBjb21sZXRlIHJlZ2lzdGVyIGRlc2NyaXB0aW9uLiBUaGlzIHdpbGwgZGVmaW5lIF9IRkM0OFNDVV9IXworKiAgZm9yIGNvbXBsZXRlIHJlZ2lzdGVyIGRlc2NyaXB0aW9uLiBUaGlzIHdpbGwgZGVmaW5lIF9IRkM0OFNDVV9IXwogKiAgdG8gcHJldmVudCByZWRlZmluaXRpb25zCiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjXzJiZHMwLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjXzJiZHMwLmMKaW5kZXggNjM2MGU4Mi4uOGQ5ODY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY18yYmRzMC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfMmJkczAuYwpAQCAtNTQ5LDEwICs1NDksMTEgQEAKIH0KIAogc3RhdGljIHZvaWQKLWhmY2RfYmgoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQoraGZjZF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JaWYgKCFjcykKLQkJcmV0dXJuOworCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSwgdHF1ZXVlKTsKKwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRF9MMVNUQVRFQ0hBTkdFLCAmY3MtPmV2ZW50KSkgewogCQlzd2l0Y2ggKGNzLT5kYy5oZmNkLnBoX3N0YXRlKSB7CiAJCQljYXNlICgwKToKQEAgLTEwNzIsNSArMTA3Myw1IEBACiAJY3MtPmRidXN5dGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSBoZmNfZGJ1c3lfdGltZXI7CiAJY3MtPmRidXN5dGltZXIuZGF0YSA9IChsb25nKSBjczsKIAlpbml0X3RpbWVyKCZjcy0+ZGJ1c3l0aW1lcik7Ci0JSU5JVF9XT1JLKCZjcy0+dHF1ZXVlLCAodm9pZCAqKSh2b2lkICopIGhmY2RfYmgsIGNzKTsKKwlJTklUX1dPUksoJmNzLT50cXVldWUsIGhmY2RfYmgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19wY2kuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfcGNpLmMKaW5kZXggOTNmNjBiNS4uOGE0OGEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19wY2kuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3BjaS5jCkBAIC0xMjExLDcgKzEyMTEsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgKEhXX1RFU1RMT09QIHwgUkVRVUVTVCk6CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3MtPmxvY2ssIGZsYWdzKTsKLQkJCXN3aXRjaCAoKGludCkgYXJnKSB7CisJCQlzd2l0Y2ggKChsb25nKSBhcmcpIHsKIAkJCQljYXNlICgxKToKIAkJCQkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfQjFfU1NMLCAweDgwKTsJLyogdHggc2xvdCAqLwogCQkJCQlXcml0ZV9oZmMoY3MsIEhGQ1BDSV9CMV9SU0wsIDB4ODApOwkvKiByeCBzbG90ICovCkBAIC0xMjI5LDcgKzEyMjksNyBAQAogCQkJCWRlZmF1bHQ6CiAJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5sb2NrLCBmbGFncyk7CiAJCQkJCWlmIChjcy0+ZGVidWcgJiBMMV9ERUJfV0FSTikKLQkJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfbDFodyBsb29wIGludmFsaWQgJTR4IiwgKGludCkgYXJnKTsKKwkJCQkJCWRlYnVnbDEoY3MsICJoZmNwY2lfbDFodyBsb29wIGludmFsaWQgJTRseCIsIChsb25nKSBhcmcpOwogCQkJCQlyZXR1cm47CiAJCQl9CiAJCQljcy0+aHcuaGZjcGNpLnRybSB8PSAweDgwOwkvKiBlbmFibGUgSU9NLWxvb3AgKi8KQEAgLTE1MDYsOCArMTUwNiwxMCBAQAogLyogaGFuZGxlIEwxIHN0YXRlIGNoYW5nZXMgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZAotaGZjcGNpX2JoKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKK2hmY3BjaV9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBJc2RuQ2FyZFN0YXRlLCB0cXVldWUpOwogCXVfbG9uZwlmbGFnczsKIC8vICAgICAgc3RydWN0IFBTdGFjayAqc3RwdHI7CiAKQEAgLTE3MDksOSArMTcxMSw5IEBACiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoY3MtPmh3LmhmY3BjaS5kZXYsIDB4ODAsICh1X2ludCkgdmlydF90b19idXMoY3MtPmh3LmhmY3BjaS5maWZvcykpOwogCQljcy0+aHcuaGZjcGNpLnBjaV9pbyA9IGlvcmVtYXAoKHVsb25nKSBjcy0+aHcuaGZjcGNpLnBjaV9pbywgMjU2KTsKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgIkhGQy1QQ0k6IGRlZmluZWQgYXQgbWVtICUjeCBmaWZvICUjeCglI3gpIElSUSAlZCBIWiAlZFxuIiwKLQkJICAgICAgICh1X2ludCkgY3MtPmh3LmhmY3BjaS5wY2lfaW8sCi0JCSAgICAgICAodV9pbnQpIGNzLT5ody5oZmNwY2kuZmlmb3MsCisJCSAgICAgICAiSEZDLVBDSTogZGVmaW5lZCBhdCBtZW0gJXAgZmlmbyAlcCglI3gpIElSUSAlZCBIWiAlZFxuIiwKKwkJICAgICAgIGNzLT5ody5oZmNwY2kucGNpX2lvLAorCQkgICAgICAgY3MtPmh3LmhmY3BjaS5maWZvcywKIAkJICAgICAgICh1X2ludCkgdmlydF90b19idXMoY3MtPmh3LmhmY3BjaS5maWZvcyksCiAJCSAgICAgICBjcy0+aXJxLCBIWik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwpAQCAtMTcyMiw3ICsxNzI0LDcgQEAKIAkJV3JpdGVfaGZjKGNzLCBIRkNQQ0lfSU5UX00yLCBjcy0+aHcuaGZjcGNpLmludF9tMik7CiAJCS8qIEF0IHRoaXMgcG9pbnQgdGhlIG5lZWRlZCBQQ0kgY29uZmlnIGlzIGRvbmUgKi8KIAkJLyogZmlmb3MgYXJlIHN0aWxsIG5vdCBlbmFibGVkICovCi0JCUlOSVRfV09SSygmY3MtPnRxdWV1ZSwgKHZvaWQgKikodm9pZCAqKSBoZmNwY2lfYmgsIGNzKTsKKwkJSU5JVF9XT1JLKCZjcy0+dHF1ZXVlLCAgaGZjcGNpX2JoKTsKIAkJY3MtPnNldHN0YWNrX2QgPSBzZXRzdGFja19oZmNwY2k7CiAJCWNzLT5CQ19TZW5kX0RhdGEgPSAmaGZjcGNpX3NlbmRfZGF0YTsKIAkJY3MtPnJlYWRpc2FjID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfc3guYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfc3guYwppbmRleCA5NTRkMTUzLi40ZmQwOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3N4LmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19zeC5jCkBAIC0xMjUxLDggKzEyNTEsMTAgQEAKIC8qIGhhbmRsZSBMMSBzdGF0ZSBjaGFuZ2VzICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQKLWhmY3N4X2JoKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKK2hmY3N4X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IElzZG5DYXJkU3RhdGUsIHRxdWV1ZSk7CiAJdV9sb25nIGZsYWdzOwogCiAJaWYgKCFjcykKQEAgLTE0OTksNyArMTUwMSw3IEBACiAJY3MtPmRidXN5dGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSBoZmNzeF9kYnVzeV90aW1lcjsKIAljcy0+ZGJ1c3l0aW1lci5kYXRhID0gKGxvbmcpIGNzOwogCWluaXRfdGltZXIoJmNzLT5kYnVzeXRpbWVyKTsKLQlJTklUX1dPUksoJmNzLT50cXVldWUsICh2b2lkICopKHZvaWQgKikgaGZjc3hfYmgsIGNzKTsKKwlJTklUX1dPUksoJmNzLT50cXVldWUsIGhmY3N4X2JoKTsKIAljcy0+cmVhZGlzYWMgPSBOVUxMOwogCWNzLT53cml0ZWlzYWMgPSBOVUxMOwogCWNzLT5yZWFkaXNhY2ZpZm8gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY191c2IuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfdXNiLmMKaW5kZXggNzEwNWIwNC4uNWE2OTg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY191c2IuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3VzYi5jCkBAIC0xNDgxLDkgKzE0ODEsOCBAQAogCQkJaWZhY2UgPSBpZmFjZV91c2VkOwogCQkJaWYgKCEKIAkJCSAgICAoY29udGV4dCA9Ci0JCQkgICAgIGttYWxsb2Moc2l6ZW9mKGhmY3VzYl9kYXRhKSwgR0ZQX0tFUk5FTCkpKQorCQkJICAgICBremFsbG9jKHNpemVvZihoZmN1c2JfZGF0YSksIEdGUF9LRVJORUwpKSkKIAkJCQlyZXR1cm4gKC1FTk9NRU0pOwkvKiBnb3Qgbm8gbWVtICovCi0JCQltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mKGhmY3VzYl9kYXRhKSk7CiAKIAkJCWVwID0gaWZhY2UtPmVuZHBvaW50OwogCQkJdmNmID0gdmFsaWRjb25mW3NtYWxsX21hdGNoXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheC5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmgKaW5kZXggMTU5YzU4OS4uM2YxMTM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmgKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmgKQEAgLTExMzksMTIgKzExMzksNiBAQAogI2RlZmluZSAgQ0FSRF9IRkNfU1ggMAogI2VuZGlmCiAKLSNpZmRlZiAgQ09ORklHX0hJU0FYX0FNRDc5MzAKLSNkZWZpbmUgQ0FSRF9BTUQ3OTMwIDEKLSNlbHNlCi0jZGVmaW5lIENBUkRfQU1ENzkzMCAwCi0jZW5kaWYKLQogI2lmZGVmCUNPTkZJR19ISVNBWF9OSUNDWQogI2RlZmluZQlDQVJEX05JQ0NZIDEKICNpZm5kZWYgSVNETl9DSElQX0lTQUMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheF9mY3BjaXBucC5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4X2ZjcGNpcG5wLmMKaW5kZXggZjZkYjU1YS4uOWUwODhmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4X2ZjcGNpcG5wLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4X2ZjcGNpcG5wLmMKQEAgLTg0MSwxMiArODQxLDEwIEBACiAJc3RydWN0IGhpc2F4X2JfaWYgKmJfaWZbMl07CiAJaW50IGk7CiAKLQlhZGFwdGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZyaXR6X2FkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKKwlhZGFwdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZyaXR6X2FkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXIpCiAJCXJldHVybiBOVUxMOwogCi0JbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZihzdHJ1Y3QgZnJpdHpfYWRhcHRlcikpOwotCiAJYWRhcHRlci0+aXNhYy5oaXNheF9kX2lmLm93bmVyID0gVEhJU19NT0RVTEU7CiAJYWRhcHRlci0+aXNhYy5oaXNheF9kX2lmLmlmYy5wcml2ID0gJmFkYXB0ZXItPmlzYWM7CiAJYWRhcHRlci0+aXNhYy5oaXNheF9kX2lmLmlmYy5sMmwxID0gaXNhY19kX2wybDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXhfaXNhYy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4X2lzYWMuYwppbmRleCA4MWVhYzM0Li5kMGZlZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXhfaXNhYy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oaXNheF9pc2FjLmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogCWNoYXIgYnVmWzI1Nl07CiAJCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CiAJREJHKERCR19MMU0sICIlcyIsIGJ1Zik7CiAJdmFfZW5kKGFyZ3MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2ljYy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2ljYy5jCmluZGV4IGRhNzA2OTIuLjY4MmNhYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pY2MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaWNjLmMKQEAgLTc3LDggKzc3LDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pY2NfYmgoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQoraWNjX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IElzZG5DYXJkU3RhdGUsIHRxdWV1ZSk7CiAJc3RydWN0IFBTdGFjayAqc3RwdHI7CiAJCiAJaWYgKCFjcykKQEAgLTY3NCw3ICs2NzYsNyBAQAogdm9pZCBfX2RldmluaXQKIHNldHVwX2ljYyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7Ci0JSU5JVF9XT1JLKCZjcy0+dHF1ZXVlLCAodm9pZCAqKSh2b2lkICopIGljY19iaCwgY3MpOworCUlOSVRfV09SSygmY3MtPnRxdWV1ZSwgaWNjX2JoKTsKIAljcy0+ZGJ1c3l0aW1lci5mdW5jdGlvbiA9ICh2b2lkICopIGRidXN5X3RpbWVyX2hhbmRsZXI7CiAJY3MtPmRidXN5dGltZXIuZGF0YSA9IChsb25nKSBjczsKIAlpbml0X3RpbWVyKCZjcy0+ZGJ1c3l0aW1lcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNhYy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzYWMuYwppbmRleCAyODJmMzQ5Li40ZTlmMjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNhYy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2FjLmMKQEAgLTgxLDggKzgxLDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1pc2FjX2JoKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKK2lzYWNfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSwgdHF1ZXVlKTsKIAlzdHJ1Y3QgUFN0YWNrICpzdHB0cjsKIAkKIAlpZiAoIWNzKQpAQCAtNjc0LDcgKzY3Niw3IEBACiB2b2lkIF9fZGV2aW5pdAogc2V0dXBfaXNhYyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7Ci0JSU5JVF9XT1JLKCZjcy0+dHF1ZXVlLCAodm9pZCAqKSh2b2lkICopIGlzYWNfYmgsIGNzKTsKKwlJTklUX1dPUksoJmNzLT50cXVldWUsIGlzYWNfYmgpOwogCWNzLT5kYnVzeXRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikgZGJ1c3lfdGltZXJfaGFuZGxlcjsKIAljcy0+ZGJ1c3l0aW1lci5kYXRhID0gKGxvbmcpIGNzOwogCWluaXRfdGltZXIoJmNzLT5kYnVzeXRpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2FyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNhci5jCmluZGV4IDY3NGFmNjcuLjZmMWE2NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2FyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzYXIuYwpAQCAtNDM3LDggKzQzNywxMCBAQAogI2RlZmluZSBCX0xMX09LCQkxMAogCiBzdGF0aWMgdm9pZAotaXNhcl9iaChzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQoraXNhcl9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IEJDU3RhdGUgKmJjcyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgQkNTdGF0ZSwgdHF1ZXVlKTsKKwogCUJDaGFubmVsX2JoKGJjcyk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCX0xMX05PQ0FSUklFUiwgJmJjcy0+ZXZlbnQpKQogCQlsbF9kZWxpdmVyX2ZheHN0YXQoYmNzLCBJU0ROX0ZBWF9DTEFTUzFfTk9DQVJSKTsKQEAgLTE1ODAsNyArMTU4Miw3IEBACiAJCWNzLT5iY3NbaV0ubW9kZSA9IDA7CiAJCWNzLT5iY3NbaV0uaHcuaXNhci5kcGF0aCA9IGkgKyAxOwogCQltb2RlaXNhcigmY3MtPmJjc1tpXSwgMCwgMCk7Ci0JCUlOSVRfV09SSygmY3MtPmJjc1tpXS50cXVldWUsICh2b2lkICopKHZvaWQgKikgaXNhcl9iaCwgJmNzLT5iY3NbaV0pOworCQlJTklUX1dPUksoJmNzLT5iY3NbaV0udHF1ZXVlLCBpc2FyX2JoKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RuaGRsYy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5oZGxjLmMKaW5kZXggY2JkZjU0Yy4uMjY4ZGNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5oZGxjLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5oZGxjLmMKQEAgLTM1LDMwICszNSw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIGJpdCBzd2FwIHRhYmxlLgotICogVmVyeSBoYW5keSBmb3IgZGV2aWNlcyB3aXRoIGRpZmZlcmVudCBiaXQgb3JkZXIsCi0gKiBhbmQgbmVjY2Vzc2FyeSBmb3IgZWFjaCB0cmFuc3BhcmVudCBCLWNoYW5uZWwgYWNjZXNzIGZvciBhbGwKLSAqIGRldmljZXMgd2hpY2ggd29ya3Mgd2l0aCB0aGlzIEhETEMgZGVjb2RlciB3aXRob3V0IGJpdCByZXZlcnNhbC4KLSAqLwotY29uc3QgdW5zaWduZWQgY2hhciBpc2RuaGRsY19iaXRfcmV2X3RhYlsyNTZdID0gewotCTB4MDAsMHg4MCwweDQwLDB4QzAsMHgyMCwweEEwLDB4NjAsMHhFMCwweDEwLDB4OTAsMHg1MCwweEQwLDB4MzAsMHhCMCwweDcwLDB4RjAsCi0JMHgwOCwweDg4LDB4NDgsMHhDOCwweDI4LDB4QTgsMHg2OCwweEU4LDB4MTgsMHg5OCwweDU4LDB4RDgsMHgzOCwweEI4LDB4NzgsMHhGOCwKLQkweDA0LDB4ODQsMHg0NCwweEM0LDB4MjQsMHhBNCwweDY0LDB4RTQsMHgxNCwweDk0LDB4NTQsMHhENCwweDM0LDB4QjQsMHg3NCwweEY0LAotCTB4MEMsMHg4QywweDRDLDB4Q0MsMHgyQywweEFDLDB4NkMsMHhFQywweDFDLDB4OUMsMHg1QywweERDLDB4M0MsMHhCQywweDdDLDB4RkMsCi0JMHgwMiwweDgyLDB4NDIsMHhDMiwweDIyLDB4QTIsMHg2MiwweEUyLDB4MTIsMHg5MiwweDUyLDB4RDIsMHgzMiwweEIyLDB4NzIsMHhGMiwKLQkweDBBLDB4OEEsMHg0QSwweENBLDB4MkEsMHhBQSwweDZBLDB4RUEsMHgxQSwweDlBLDB4NUEsMHhEQSwweDNBLDB4QkEsMHg3QSwweEZBLAotCTB4MDYsMHg4NiwweDQ2LDB4QzYsMHgyNiwweEE2LDB4NjYsMHhFNiwweDE2LDB4OTYsMHg1NiwweEQ2LDB4MzYsMHhCNiwweDc2LDB4RjYsCi0JMHgwRSwweDhFLDB4NEUsMHhDRSwweDJFLDB4QUUsMHg2RSwweEVFLDB4MUUsMHg5RSwweDVFLDB4REUsMHgzRSwweEJFLDB4N0UsMHhGRSwKLQkweDAxLDB4ODEsMHg0MSwweEMxLDB4MjEsMHhBMSwweDYxLDB4RTEsMHgxMSwweDkxLDB4NTEsMHhEMSwweDMxLDB4QjEsMHg3MSwweEYxLAotCTB4MDksMHg4OSwweDQ5LDB4QzksMHgyOSwweEE5LDB4NjksMHhFOSwweDE5LDB4OTksMHg1OSwweEQ5LDB4MzksMHhCOSwweDc5LDB4RjksCi0JMHgwNSwweDg1LDB4NDUsMHhDNSwweDI1LDB4QTUsMHg2NSwweEU1LDB4MTUsMHg5NSwweDU1LDB4RDUsMHgzNSwweEI1LDB4NzUsMHhGNSwKLQkweDBELDB4OEQsMHg0RCwweENELDB4MkQsMHhBRCwweDZELDB4RUQsMHgxRCwweDlELDB4NUQsMHhERCwweDNELDB4QkQsMHg3RCwweEZELAotCTB4MDMsMHg4MywweDQzLDB4QzMsMHgyMywweEEzLDB4NjMsMHhFMywweDEzLDB4OTMsMHg1MywweEQzLDB4MzMsMHhCMywweDczLDB4RjMsCi0JMHgwQiwweDhCLDB4NEIsMHhDQiwweDJCLDB4QUIsMHg2QiwweEVCLDB4MUIsMHg5QiwweDVCLDB4REIsMHgzQiwweEJCLDB4N0IsMHhGQiwKLQkweDA3LDB4ODcsMHg0NywweEM3LDB4MjcsMHhBNywweDY3LDB4RTcsMHgxNywweDk3LDB4NTcsMHhENywweDM3LDB4QjcsMHg3NywweEY3LAotCTB4MEYsMHg4RiwweDRGLDB4Q0YsMHgyRiwweEFGLDB4NkYsMHhFRiwweDFGLDB4OUYsMHg1RiwweERGLDB4M0YsMHhCRiwweDdGLDB4RkYKLX07Ci0KIGVudW0gewogCUhETENfRkFTVF9JRExFLEhETENfR0VUX0ZMQUdfQjAsSERMQ19HRVRGTEFHX0IxQTYsSERMQ19HRVRGTEFHX0I3LAogCUhETENfR0VUX0RBVEEsSERMQ19GQVNUX0ZMQUcKQEAgLTYyMSw3ICs1OTcsNiBAQAogCXJldHVybiBsZW47CiB9CiAKLUVYUE9SVF9TWU1CT0woaXNkbmhkbGNfYml0X3Jldl90YWIpOwogRVhQT1JUX1NZTUJPTChpc2RuaGRsY19yY3ZfaW5pdCk7CiBFWFBPUlRfU1lNQk9MKGlzZG5oZGxjX2RlY29kZSk7CiBFWFBPUlRfU1lNQk9MKGlzZG5oZGxjX291dF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RuaGRsYy5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5oZGxjLmgKaW5kZXggMjY5MzE1OS4uNDUxNjdkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5oZGxjLmgKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5oZGxjLmgKQEAgLTQxLDEwICs0MSwxMCBAQAogCXVuc2lnbmVkIGNoYXIgc2hpZnRfcmVnOwogCXVuc2lnbmVkIGNoYXIgZmZ2YWx1ZTsKIAotCWludCBkYXRhX3JlY2VpdmVkOjE7IAkvLyBzZXQgaWYgdHJhbnNmZXJyaW5nIGRhdGEKLQlpbnQgZGNoYW5uZWw6MTsgCS8vIHNldCBpZiBEIGNoYW5uZWwgKHNlbmQgaWRsZSBpbnN0ZWFkIG9mIGZsYWdzKQotCWludCBkb19hZGFwdDU2OjE7IAkvLyBzZXQgaWYgNTZLIGFkYXB0YXRpb24KLSAgICAgICAgaW50IGRvX2Nsb3Npbmc6MTsgCS8vIHNldCBpZiBpbiBjbG9zaW5nIHBoYXNlIChuZWVkIHRvIHNlbmQgQ1JDICsgZmxhZworCXVuc2lnbmVkIGludCBkYXRhX3JlY2VpdmVkOjE7IAkvLyBzZXQgaWYgdHJhbnNmZXJyaW5nIGRhdGEKKwl1bnNpZ25lZCBpbnQgZGNoYW5uZWw6MTsgCS8vIHNldCBpZiBEIGNoYW5uZWwgKHNlbmQgaWRsZSBpbnN0ZWFkIG9mIGZsYWdzKQorCXVuc2lnbmVkIGludCBkb19hZGFwdDU2OjE7IAkvLyBzZXQgaWYgNTZLIGFkYXB0YXRpb24KKwl1bnNpZ25lZCBpbnQgZG9fY2xvc2luZzoxOyAJLy8gc2V0IGlmIGluIGNsb3NpbmcgcGhhc2UgKG5lZWQgdG8gc2VuZCBDUkMgKyBmbGFnCiB9OwogCiAKQEAgLTU3LDggKzU3LDYgQEAKICNkZWZpbmUgSERMQ19DUkNfRVJST1IgICAgICAgICAyCiAjZGVmaW5lIEhETENfTEVOR1RIX0VSUk9SICAgICAgMwogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBpc2RuaGRsY19iaXRfcmV2X3RhYlsyNTZdOwotCiBleHRlcm4gdm9pZCBpc2RuaGRsY19yY3ZfaW5pdCAoc3RydWN0IGlzZG5oZGxjX3ZhcnMgKmhkbGMsIGludCBkb19hZGFwdDU2KTsKIAogZXh0ZXJuIGludCBpc2RuaGRsY19kZWNvZGUgKHN0cnVjdCBpc2RuaGRsY192YXJzICpoZGxjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzbGVuLGludCAqY291bnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwxLmMKaW5kZXggYmFiMzU2OC4uYTE0MjA0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDEuYwpAQCAtMzE1LDggKzMxNSwxMCBAQAogfQogCiB2b2lkCi1CQ2hhbm5lbF9iaChzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQorQkNoYW5uZWxfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBCQ1N0YXRlICpiY3MgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IEJDU3RhdGUsIHRxdWV1ZSk7CisKIAlpZiAoIWJjcykKIAkJcmV0dXJuOwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQl9SQ1ZCVUZSRUFEWSwgJmJjcy0+ZXZlbnQpKQpAQCAtMzYyLDcgKzM2NCw3IEBACiAKIAliY3MtPmNzID0gY3M7CiAJYmNzLT5jaGFubmVsID0gYmM7Ci0JSU5JVF9XT1JLKCZiY3MtPnRxdWV1ZSwgKHZvaWQgKikodm9pZCAqKSBCQ2hhbm5lbF9iaCwgYmNzKTsKKwlJTklUX1dPUksoJmJjcy0+dHF1ZXVlLCBCQ2hhbm5lbF9iaCk7CiAJc3Bpbl9sb2NrX2luaXQoJmJjcy0+YWNsb2NrKTsKIAliY3MtPkJDX1NldFN0YWNrID0gTlVMTDsKIAliY3MtPkJDX0Nsb3NlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYwppbmRleCA2ZDA0MzE3Li5jZDNiNWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jCkBAIC0xNDQyLDcgKzE0NDIsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbDJfc3QxNF9wZXJzaXN0YW50X2RhKHN0cnVjdCBGc21JbnN0ICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCitsMl9zdDE0X3BlcnNpc3RlbnRfZGEoc3RydWN0IEZzbUluc3QgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgUFN0YWNrICpzdCA9IGZpLT51c2VyZGF0YTsKIAkKQEAgLTE0NTMsNyArMTQ1Myw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1sMl9zdDVfcGVyc2lzdGFudF9kYShzdHJ1Y3QgRnNtSW5zdCAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorbDJfc3Q1X3BlcnNpc3RlbnRfZGEoc3RydWN0IEZzbUluc3QgKmZpLCBpbnQgZXZlbnQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgUFN0YWNrICpzdCA9IGZpLT51c2VyZGF0YTsKIApAQCAtMTQ2Niw3ICsxNDY2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWwyX3N0Nl9wZXJzaXN0YW50X2RhKHN0cnVjdCBGc21JbnN0ICpmaSwgaW50IGV2ZW50LCB2b2lkICphcmcpCitsMl9zdDZfcGVyc2lzdGVudF9kYShzdHJ1Y3QgRnNtSW5zdCAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBQU3RhY2sgKnN0ID0gZmktPnVzZXJkYXRhOwogCkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbDJfcGVyc2lzdGFudF9kYShzdHJ1Y3QgRnNtSW5zdCAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQorbDJfcGVyc2lzdGVudF9kYShzdHJ1Y3QgRnNtSW5zdCAqZmksIGludCBldmVudCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBQU3RhY2sgKnN0ID0gZmktPnVzZXJkYXRhOwogCkBAIC0xNjEyLDE0ICsxNjEyLDE0IEBACiAJe1NUX0wyXzYsIEVWX0wyX0ZSQU1FX0VSUk9SLCBsMl9mcmFtZV9lcnJvcn0sCiAJe1NUX0wyXzcsIEVWX0wyX0ZSQU1FX0VSUk9SLCBsMl9mcmFtZV9lcnJvcl9yZWVzdH0sCiAJe1NUX0wyXzgsIEVWX0wyX0ZSQU1FX0VSUk9SLCBsMl9mcmFtZV9lcnJvcl9yZWVzdH0sCi0Je1NUX0wyXzEsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3N0MTRfcGVyc2lzdGFudF9kYX0sCisJe1NUX0wyXzEsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3N0MTRfcGVyc2lzdGVudF9kYX0sCiAJe1NUX0wyXzIsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3N0MjRfdGVpX3JlbW92ZX0sCiAJe1NUX0wyXzMsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3N0M190ZWlfcmVtb3ZlfSwKLQl7U1RfTDJfNCwgRVZfTDFfREVBQ1RJVkFURSwgbDJfc3QxNF9wZXJzaXN0YW50X2RhfSwKLQl7U1RfTDJfNSwgRVZfTDFfREVBQ1RJVkFURSwgbDJfc3Q1X3BlcnNpc3RhbnRfZGF9LAotCXtTVF9MMl82LCBFVl9MMV9ERUFDVElWQVRFLCBsMl9zdDZfcGVyc2lzdGFudF9kYX0sCi0Je1NUX0wyXzcsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3BlcnNpc3RhbnRfZGF9LAotCXtTVF9MMl84LCBFVl9MMV9ERUFDVElWQVRFLCBsMl9wZXJzaXN0YW50X2RhfSwKKwl7U1RfTDJfNCwgRVZfTDFfREVBQ1RJVkFURSwgbDJfc3QxNF9wZXJzaXN0ZW50X2RhfSwKKwl7U1RfTDJfNSwgRVZfTDFfREVBQ1RJVkFURSwgbDJfc3Q1X3BlcnNpc3RlbnRfZGF9LAorCXtTVF9MMl82LCBFVl9MMV9ERUFDVElWQVRFLCBsMl9zdDZfcGVyc2lzdGVudF9kYX0sCisJe1NUX0wyXzcsIEVWX0wxX0RFQUNUSVZBVEUsIGwyX3BlcnNpc3RlbnRfZGF9LAorCXtTVF9MMl84LCBFVl9MMV9ERUFDVElWQVRFLCBsMl9wZXJzaXN0ZW50X2RhfSwKIH07CiAKICNkZWZpbmUgTDJfRk5fQ09VTlQgKHNpemVvZihMMkZuTGlzdCkvc2l6ZW9mKHN0cnVjdCBGc21Ob2RlKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYwppbmRleCA5NTIyMTQxLi4wMzBkMTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlci5jCkBAIC02NzcsNyArNjc3LDExIEBACiAJCXJldHVybiAoMCk7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCX0JCisKKyNpZmRlZiBfX0lTQVBOUF9fCiByZWFkeToJCisjZW5kaWYKKwogCS8qIEluIGNhc2Ugb2YgdGhlIHNlZGxiYXVlciBwY21jaWEgY2FyZCwgdGhpcyByZWdpb24gaXMgaW4gdXNlLAogCSAqIHJlc2VydmVkIGZvciB1cyBieSB0aGUgY2FyZCBtYW5hZ2VyLiBTbyB3ZSBkbyBub3QgY2hlY2sgaXQKIAkgKiBoZXJlLCBpdCB3b3VsZCBmYWlsLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jCmluZGV4IGY5YzE0YTIuLjQ1ZGViZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMKQEAgLTE1NSw5ICsxNTUsOCBAQAogICAgIERFQlVHKDAsICJzZWRsYmF1ZXJfYXR0YWNoKClcbiIpOwogCiAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHByaXZhdGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgKi8KLSAgICBsb2NhbCA9IGttYWxsb2Moc2l6ZW9mKGxvY2FsX2luZm9fdCksIEdGUF9LRVJORUwpOworICAgIGxvY2FsID0ga3phbGxvYyhzaXplb2YobG9jYWxfaW5mb190KSwgR0ZQX0tFUk5FTCk7CiAgICAgaWYgKCFsb2NhbCkgcmV0dXJuIC1FTk9NRU07Ci0gICAgbWVtc2V0KGxvY2FsLCAwLCBzaXplb2YobG9jYWxfaW5mb190KSk7CiAgICAgbG9jYWwtPmNhcmRuciA9IC0xOwogCiAgICAgbG9jYWwtPnBfZGV2ID0gbGluazsKQEAgLTIzMywyMCArMjMyLDEwIEBACiAKICAgICBERUJVRygwLCAic2VkbGJhdWVyX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLSAgICAvKgotICAgICAgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgotICAgICAgIHJlZ2lzdGVycy4KLSAgICAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CiAgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwogICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKIAogICAgIENTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLCAmY29uZikpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX2IuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfYi5jCmluZGV4IDc1ZDBmMjQ4Li5mYTY0MTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX2IuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX2IuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KICNpbmNsdWRlICJzdDU0ODEuaCIKIAogc3RhdGljIGlubGluZSB2b2lkIEJfTDFMMihzdHJ1Y3Qgc3Q1NDgxX2JjcyAqYmNzLCBpbnQgcHIsIHZvaWQgKmFyZykKQEAgLTcyLDcgKzczLDcgQEAKIAkJCQkJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqZGVzdCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyK2xlbjsKIAkJCQkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGNvdW50OwogCQkJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBieXRlc19zZW50OyBjb3VudCsrKQotCQkJCQkJKmRlc3QrKyA9IGlzZG5oZGxjX2JpdF9yZXZfdGFiWypzcmMrK107CisJCQkJCQkqZGVzdCsrID0gYml0cmV2OCgqc3JjKyspOwogCQkJCX0KIAkJCQlsZW4gKz0gYnl0ZXNfc2VudDsKIAkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX2QuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCmluZGV4IDFkOGMyNjEuLmI4YzQ4NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfZC5jCkBAIC0xNzMsNyArMTczLDcgQEAKIAljaGFyIGJ1ZlsyNTZdOwogCQogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOwogCURCRyg4LCAiJXMiLCBidWYpOwogCXZhX2VuZChhcmdzKTsKIH0KQEAgLTI3NSw3ICsyNzUsNyBAQAogCWNoYXIgYnVmWzI1Nl07CiAJCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CiAJREJHKDB4MiwgIiVzIiwgYnVmKTsKIAl2YV9lbmQoYXJncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX2luaXQuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfaW5pdC5jCmluZGV4IDI3MTZhYTUuLmJiM2EyOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfaW5pdC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfaW5pdC5jCkBAIC02OSwxMiArNjksMTAgQEAKIAkgICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAogCSAgICAgbnVtYmVyX29mX2xlZHMpOwogCi0JYWRhcHRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdDU0ODFfYWRhcHRlciksIEdGUF9LRVJORUwpOworCWFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3Q1NDgxX2FkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc3Q1NDgxX2FkYXB0ZXIpKTsKLQogCWFkYXB0ZXItPm51bWJlcl9vZl9sZWRzID0gbnVtYmVyX29mX2xlZHM7CiAJYWRhcHRlci0+dXNiX2RldiA9IGRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYwppbmRleCBhZmNjMmFlLi4zZTNlMTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYwpAQCAtMTM3LDkgKzEzNyw4IEBACiAgICAgREVCVUcoMCwgInRlbGVzX2F0dGFjaCgpXG4iKTsKIAogICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBwcml2YXRlIGRldmljZS1zcGVjaWZpYyBkYXRhICovCi0gICAgbG9jYWwgPSBrbWFsbG9jKHNpemVvZihsb2NhbF9pbmZvX3QpLCBHRlBfS0VSTkVMKTsKKyAgICBsb2NhbCA9IGt6YWxsb2Moc2l6ZW9mKGxvY2FsX2luZm9fdCksIEdGUF9LRVJORUwpOwogICAgIGlmICghbG9jYWwpIHJldHVybiAtRU5PTUVNOwotICAgIG1lbXNldChsb2NhbCwgMCwgc2l6ZW9mKGxvY2FsX2luZm9fdCkpOwogICAgIGxvY2FsLT5jYXJkbnIgPSAtMTsKIAogICAgIGxvY2FsLT5wX2RldiA9IGxpbms7CkBAIC0yMzIsMjMgKzIzMSw2IEBACiAgICAgREVCVUcoMCwgInRlbGVzX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAgICAgZGV2ID0gbGluay0+cHJpdjsKIAotICAgIC8qCi0gICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCi0gICAgICAgcmVnaXN0ZXJzLgotICAgICovCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NTsKLSAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKLSAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7Ci0gICAgICAgIGxhc3RfZm4gPSBQYXJzZVR1cGxlOwotCWdvdG8gY3NfZmFpbGVkOwotICAgIH0KLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwogICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3c2NjkyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdzY2OTIuYwppbmRleCAxNjU1MzQxLi4zYWVjZWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvdzY2OTIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdzY2OTIuYwpAQCAtMTAxLDggKzEwMSwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotVzY2OTJfYmgoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQorVzY2OTJfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSwgdHF1ZXVlKTsKIAlzdHJ1Y3QgUFN0YWNrICpzdHB0cjsKIAogCWlmICghY3MpCkBAIC0xMDcwLDcgKzEwNzIsNyBAQAogCSAgICAgICBpZF9saXN0W2NzLT5zdWJ0eXBdLmNhcmRfbmFtZSwgY3MtPmlycSwKIAkgICAgICAgY3MtPmh3Lnc2NjkyLmlvYmFzZSk7CiAKLQlJTklUX1dPUksoJmNzLT50cXVldWUsICh2b2lkICopKHZvaWQgKikgVzY2OTJfYmgsIGNzKTsKKwlJTklUX1dPUksoJmNzLT50cXVldWUsIFc2NjkyX2JoKTsKIAljcy0+cmVhZFc2NjkyID0gJlJlYWRXNjY5MjsKIAljcy0+d3JpdGVXNjY5MiA9ICZXcml0ZVc2NjkyOwogCWNzLT5yZWFkaXNhY2ZpZm8gPSAmUmVhZElTQUNmaWZvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2JvYXJkZXJnby5jIGIvZHJpdmVycy9pc2RuL2h5c2RuL2JvYXJkZXJnby5jCmluZGV4IDE2MGYyMmYuLmExMjA2NDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vYm9hcmRlcmdvLmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2JvYXJkZXJnby5jCkBAIC00NSwxMSArNDUsMTAgQEAKIAlpZiAoIWNhcmQtPmlycV9lbmFibGVkKQogCQlyZXR1cm4gSVJRX05PTkU7CQkvKiBvdGhlciBkZXZpY2UgaW50ZXJydXB0aW5nIG9yIGlycSBzd2l0Y2hlZCBvZmYgKi8KIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwkJCS8qIG5vIGZ1cnRoZXIgaXJxcyBhbGxvd2VkICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsgLyogbm8gZnVydGhlciBpcnFzIGFsbG93ZWQgKi8KIAogCWlmICghKGJ5dGVpbihjYXJkLT5pb2Jhc2UgKyBQQ0k5MDUwX0lOVFJfUkVHKSAmIFBDSTkwNTBfSU5UUl9SRUdfU1RBVDEpKSB7Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwkvKiByZXN0b3JlIG9sZCBzdGF0ZSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CS8qIHJlc3RvcmUgb2xkIHN0YXRlICovCiAJCXJldHVybiBJUlFfTk9ORTsJCS8qIG5vIGludGVycnVwdCByZXF1ZXN0ZWQgYnkgRTEgKi8KIAl9CiAJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50cyBvbiB0aGUgYm9hcmQgKi8KQEAgLTYxLDcgKzYwLDcgQEAKIAkvKiBzdGFydCBrZXJuZWwgdGFzayBpbW1lZGlhdGVseSBhZnRlciBsZWF2aW5nIGFsbCBpbnRlcnJ1cHRzICovCiAJaWYgKCFjYXJkLT5od19sb2NrKQogCQlzY2hlZHVsZV93b3JrKCZjYXJkLT5pcnFfcXVldWUpOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CQkJCS8qIGVyZ29faW50ZXJydXB0ICovCiAKQEAgLTcyLDggKzcxLDkgQEAKIC8qIG1heSBiZSBxdWV1ZWQgZnJvbSBldmVyeXdoZXJlIChpbnRlcnJ1cHRzIGluY2x1ZGVkKS4gICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQKLWVyZ29faXJxX2JoKGh5c2RuX2NhcmQgKiBjYXJkKQorZXJnb19pcnFfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp1Z2xpX2FwaSkKIHsKKwloeXNkbl9jYXJkICogY2FyZCA9IGNvbnRhaW5lcl9vZih1Z2xpX2FwaSwgaHlzZG5fY2FyZCwgaXJxX3F1ZXVlKTsKIAl0RXJnRHByYW0gKmRwcjsKIAlpbnQgYWdhaW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTgzLDEwICs4Myw5IEBACiAKIAlkcHIgPSBjYXJkLT5kcHJhbTsJLyogcG9pbnQgdG8gRFBSQU0gKi8KIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJaWYgKGNhcmQtPmh3X2xvY2spIHsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CS8qIGhhcmR3YXJlIGN1cnJlbnRseSB1bmF2YWlsYWJsZSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CS8qIGhhcmR3YXJlIGN1cnJlbnRseSB1bmF2YWlsYWJsZSAqLwogCQlyZXR1cm47CiAJfQogCWNhcmQtPmh3X2xvY2sgPSAxOwkvKiB3ZSBub3cgbG9jayB0aGUgaGFyZHdhcmUgKi8KQEAgLTEyMCw3ICsxMTksNyBAQAogCQkJY2FyZC0+aHdfbG9jayA9IDA7CS8qIGZyZWUgaGFyZHdhcmUgYWdhaW4gKi8KIAl9IHdoaWxlIChhZ2Fpbik7CS8qIHVudGlsIG5vdGhpbmcgbW9yZSB0byBkbyAqLwogCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwogfQkJCQkvKiBlcmdvX2lycV9iaCAqLwogCiAKQEAgLTEzNyw4ICsxMzYsNyBAQAogI2lmZGVmIENPTkZJR19IWVNETl9DQVBJCiAJaHljYXBpX2NhcGlfc3RvcChjYXJkKTsKICNlbmRpZiAvKiBDT05GSUdfSFlTRE5fQ0FQSSAqLwotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJdmFsID0gYnl0ZWluKGNhcmQtPmlvYmFzZSArIFBDSTkwNTBfSU5UUl9SRUcpOwkvKiBnZXQgYWN0dWFsIHZhbHVlICovCiAJdmFsICY9IH4oUENJOTA1MF9JTlRSX1JFR19FTlBDSSB8IFBDSTkwNTBfSU5UUl9SRUdfRU4xKTsJLyogbWFzayBpcnEgKi8KIAlieXRlb3V0KGNhcmQtPmlvYmFzZSArIFBDSTkwNTBfSU5UUl9SRUcsIHZhbCk7CkBAIC0xNDcsNyArMTQ1LDcgQEAKIAljYXJkLT5zdGF0ZSA9IENBUkRfU1RBVEVfVU5VU0VEOwogCWNhcmQtPmVycl9sb2dfc3RhdGUgPSBFUlJMT0dfU1RBVEVfT0ZGOwkJLyogY3VycmVudGx5IG5vIGxvZyBhY3RpdmUgKi8KIAotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIH0JCQkJLyogZXJnb19zdG9wY2FyZCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjIsMTIgKzE2MCwxMSBAQAogCQljYXJkLT5lcnJfbG9nX3N0YXRlID0gRVJSTE9HX1NUQVRFX09GRjsJCS8qIG11c3QgYmUgb2ZmICovCiAJCXJldHVybjsKIAl9Ci0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAogCWlmICgoKGNhcmQtPmVycl9sb2dfc3RhdGUgPT0gRVJSTE9HX1NUQVRFX09GRikgJiYgIW9uKSB8fAogCSAgICAoKGNhcmQtPmVycl9sb2dfc3RhdGUgPT0gRVJSTE9HX1NUQVRFX09OKSAmJiBvbikpIHsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwkJLyogbm90aGluZyB0byBkbyAqLwogCX0KIAlpZiAob24pCkBAIC0xNzUsNyArMTcyLDcgQEAKIAllbHNlCiAJCWNhcmQtPmVycl9sb2dfc3RhdGUgPSBFUlJMT0dfU1RBVEVfU1RPUDsJLyogcmVxdWVzdCBzdG9wICovCiAKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJc2NoZWR1bGVfd29yaygmY2FyZC0+aXJxX3F1ZXVlKTsKIH0JCQkJLyogZXJnb19zZXRfZXJybG9nX3N0YXRlICovCiAKQEAgLTM1Niw4ICszNTMsNyBAQAogCiAJCQlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiBMT0dfUE9GX1JFQ09SRCkKIAkJCQloeXNkbl9hZGRsb2coY2FyZCwgIkVSR086IHBvZiBib290IHN1Y2Nlc3MiKTsKLQkJCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQkJY2xpKCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwogCiAJCQljYXJkLT5zdGF0ZSA9IENBUkRfU1RBVEVfUlVOOwkvKiBub3cgY2FyZCBpcyBydW5uaW5nICovCiAJCQkvKiBlbmFibGUgdGhlIGNhcmRzIGludGVycnVwdCAqLwpAQCAtMzcwLDcgKzM2Niw3IEBACiAJCQlkcHItPlRvSHlJbnQgPSAxOwogCQkJZHByLT5Ub1BjSW50ID0gMTsJLyogaW50ZXJydXB0IHRvIEUxIGZvciBhbGwgY2FyZHMgKi8KIAotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJCQlpZiAoKGh5bmV0X2VuYWJsZSAmICgxIDw8IGNhcmQtPm15aWQpKSAKIAkJCSAgICAmJiAoaSA9IGh5c2RuX25ldF9jcmVhdGUoY2FyZCkpKSAKIAkJCXsKQEAgLTQwOCw3ICs0MDQsNyBAQAogCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CS8qIHJlbGVhc2UgaW50ZXJydXB0ICovCiAJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlICsgUENJOTA1MF9JTlRSX1JFRywgMSk7CS8qIHJlbGVhc2UgYWxsIGlvIHBvcnRzICovCiAJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlICsgUENJOTA1MF9VU0VSX0lPLCAxKTsKLQl2ZnJlZShjYXJkLT5kcHJhbSk7CisJaW91bm1hcChjYXJkLT5kcHJhbSk7CiAJY2FyZC0+ZHByYW0gPSBOVUxMOwkvKiByZWxlYXNlIHNoYXJlZCBtZW0gKi8KIH0JCQkJLyogZXJnb19yZWxlYXNlaGFyZHdhcmUgKi8KIApAQCAtNDQ3LDcgKzQ0Myw4IEBACiAJY2FyZC0+d3JpdGVib290c2VxID0gZXJnb193cml0ZWJvb3RzZXE7CiAJY2FyZC0+d2FpdHBvZnJlYWR5ID0gZXJnb193YWl0cG9mcmVhZHk7CiAJY2FyZC0+c2V0X2VycmxvZ19zdGF0ZSA9IGVyZ29fc2V0X2VycmxvZ19zdGF0ZTsKLQlJTklUX1dPUksoJmNhcmQtPmlycV9xdWV1ZSwgKHZvaWQgKikgKHZvaWQgKikgZXJnb19pcnFfYmgsIGNhcmQpOworCUlOSVRfV09SSygmY2FyZC0+aXJxX3F1ZXVlLCBlcmdvX2lycV9iaCk7CisJY2FyZC0+aHlzZG5fbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKIAogCXJldHVybiAoMCk7CiB9CQkJCS8qIGVyZ29faW5pdGhhcmR3YXJlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHljYXBpLmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHljYXBpLmMKaW5kZXggNmJhYzQzYy4uYjJhZTRlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5Y2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeWNhcGkuYwpAQCAtNzQ1LDEyICs3NDUsMTEgQEAKIAkJcmV0dXJuIDE7CiAJfQogCWlmICghY2FyZC0+aHljdHJsaW5mbykgewotCQljaW5mbyA9IChoeWNhcGljdHJsX2luZm8gKikga21hbGxvYyhzaXplb2YoaHljYXBpY3RybF9pbmZvKSwgR0ZQX0FUT01JQyk7CisJCWNpbmZvID0ga3phbGxvYyhzaXplb2YoaHljYXBpY3RybF9pbmZvKSwgR0ZQX0FUT01JQyk7CiAJCWlmICghY2luZm8pIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhZU0ROOiBubyBtZW1vcnkgZm9yIGNhcGktY3RybC5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJbWVtc2V0KGNpbmZvLCAwLCBzaXplb2YoaHljYXBpY3RybF9pbmZvKSk7CiAJCWNhcmQtPmh5Y3RybGluZm8gPSBjaW5mbzsKIAkJY2luZm8tPmNhcmQgPSBjYXJkOwogCQlzcGluX2xvY2tfaW5pdCgmY2luZm8tPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2Jvb3QuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9ib290LmMKaW5kZXggNmQwZWIwZi4uYmU3ODdlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2Jvb3QuYworKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fYm9vdC5jCkBAIC0yNzgsMTQgKzI3OCwxMyBAQAogCQlyZXR1cm4gKC1FUlJfQUxSRUFEWV9CT09UKTsJLyogYm9vdCBhbHJlYWR5IGFjdGl2ZSAqLwogCX0KIAkvKiBlcnJvciBubyBtZW0gYXZhaWxhYmxlICovCi0JaWYgKCEoYm9vdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBib290X2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShib290ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJvb3RfZGF0YSksIEdGUF9LRVJORUwpKSkgewogCQlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiBMT0dfTUVNX0VSUikKIAkJCWh5c2RuX2FkZGxvZyhjYXJkLCAiUE9GIG9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW0iKTsKIAkJcmV0dXJuICgtRUZBVUxUKTsKIAl9CiAJY2FyZC0+Ym9vdCA9IGJvb3Q7CiAJY2FyZC0+c3RhdGUgPSBDQVJEX1NUQVRFX0JPT1RJTkc7Ci0JbWVtc2V0KGJvb3QsIDAsIHNpemVvZihzdHJ1Y3QgYm9vdF9kYXRhKSk7CiAKIAljYXJkLT5zdG9wY2FyZChjYXJkKTsJLyogZmlyc3Qgc3RvcCB0aGUgY2FyZCAqLwogCWlmIChjYXJkLT50ZXN0cmFtKGNhcmQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fZGVmcy5oIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2RlZnMuaAppbmRleCA0NjFlODMxLi43MjlkZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fZGVmcy5oCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9kZWZzLmgKQEAgLTE4OCw2ICsxODgsOCBAQAogCS8qIGluaXQgYW5kIGRlaW5pdCBzdG9wY2FyZCBmb3IgYm9vdGluZywgdG9vICovCiAJdm9pZCAoKnN0b3BjYXJkKSAoc3RydWN0IEhZU0ROX0NBUkQgKik7CiAJdm9pZCAoKnJlbGVhc2VoYXJkd2FyZSkgKHN0cnVjdCBIWVNETl9DQVJEICopOworCisJc3BpbmxvY2tfdCBoeXNkbl9sb2NrOwogI2lmZGVmIENPTkZJR19IWVNETl9DQVBJCiAJc3RydWN0IGh5Y2FwaWN0cmxfaW5mbyB7CiAJCWNoYXIgY2FyZG5hbWVbMzJdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2luaXQuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9pbml0LmMKaW5kZXggYjcwMmVkMjcuLjllMDE3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9pbml0LmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2luaXQuYwpAQCAtODEsMTEgKzgxLDEwIEBACiAJCWlmIChwY2lfZW5hYmxlX2RldmljZShha3RfcGNpZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICghKGNhcmQgPSBrbWFsbG9jKHNpemVvZihoeXNkbl9jYXJkKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWlmICghKGNhcmQgPSBremFsbG9jKHNpemVvZihoeXNkbl9jYXJkKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkhZU0ROOiB1bmFibGUgdG8gYWxsb2MgZGV2aWNlIG1lbSBcbiIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCW1lbXNldChjYXJkLCAwLCBzaXplb2YoaHlzZG5fY2FyZCkpOwogCQljYXJkLT5teWlkID0gY2FyZG1heDsJLyogc2V0IG93biBpZCAqLwogCQljYXJkLT5idXMgPSBha3RfcGNpZGV2LT5idXMtPm51bWJlcjsKIAkJY2FyZC0+ZGV2Zm4gPSBha3RfcGNpZGV2LT5kZXZmbjsJLyogc2xvdCArIGZ1bmN0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMKaW5kZXggZDIwNTI0OS4uNTU3ZDk2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9uZXQuYwpAQCAtMjc4LDExICsyNzgsMTAgQEAKIAkJcmV0dXJuICgtRU5PTUVNKTsKIAl9CiAJaHlzZG5fbmV0X3JlbGVhc2UoY2FyZCk7CS8qIHJlbGVhc2UgYW4gZXhpc3RpbmcgbmV0IGRldmljZSAqLwotCWlmICgoZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJaWYgKChkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiSFlTRE46IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1cbiIpOwogCQlyZXR1cm4gKC1FTk9NRU0pOwogCX0KLQltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOwkvKiBjbGVhbiB0aGUgc3RydWN0dXJlICovCiAKIAlzcGluX2xvY2tfaW5pdCgmKChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldiktPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2NvbmYuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jY29uZi5jCmluZGV4IDhlMmIwMzguLjk0YTkzNTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2NvbmYuYworKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2NvbmYuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJfSBlbHNlIGlmICgoZmlsZXAtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSA9PSBGTU9ERV9SRUFEKSB7CiAJCS8qIHJlYWQgYWNjZXNzIC0+IG91dHB1dCBjYXJkIGluZm8gZGF0YSAqLwogCi0JCWlmICghKHRtcCA9IChjaGFyICopIGttYWxsb2MoSU5GT19PVVRfTEVOICogMiArIDIsIEdGUF9LRVJORUwpKSkgeworCQlpZiAoISh0bXAgPSBrbWFsbG9jKElORk9fT1VUX0xFTiAqIDIgKyAyLCBHRlBfS0VSTkVMKSkpIHsKIAkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXJldHVybiAoLUVGQVVMVCk7CS8qIG91dCBvZiBtZW1vcnkgKi8KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3Byb2Nsb2cuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jbG9nLmMKaW5kZXggYzQzMDFlOC4uMzc1ZDk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3Byb2Nsb2cuYworKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jCkBAIC0xMTEsMTMgKzExMSwxMiBAQAogCWlmIChwZC0+aWZfdXNlZCA8PSAwKQogCQlyZXR1cm47CQkvKiBubyBvcGVuIGZpbGUgZm9yIHJlYWQgKi8KIAotCWlmICghKGliID0gKHN0cnVjdCBsb2dfZGF0YSAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9nX2RhdGEpICsgc3RybGVuKGNwKSwgR0ZQX0FUT01JQykpKQorCWlmICghKGliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvZ19kYXRhKSArIHN0cmxlbihjcCksIEdGUF9BVE9NSUMpKSkKIAkJIHJldHVybjsJLyogbm8gbWVtb3J5ICovCiAJc3RyY3B5KGliLT5sb2dfc3RhcnQsIGNwKTsJLyogc2V0IG91dHB1dCBzdHJpbmcgKi8KIAlpYi0+bmV4dCA9IE5VTEw7CiAJaWItPnByb2NfY3RybCA9IHBkOwkvKiBwb2ludCB0byBvd24gY29udHJvbCBzdHJ1Y3R1cmUgKi8KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwogCWliLT51c2FnZV9jbnQgPSBwZC0+aWZfdXNlZDsKIAlpZiAoIXBkLT5sb2dfaGVhZCkKIAkJcGQtPmxvZ19oZWFkID0gaWI7CS8qIG5ldyBoZWFkICovCkBAIC0xMjUsNyArMTI0LDcgQEAKIAkJcGQtPmxvZ190YWlsLT5uZXh0ID0gaWI7CS8qIGZvbGxvd3MgZXhpc3RpbmcgbWVzc2FnZXMgKi8KIAlwZC0+bG9nX3RhaWwgPSBpYjsJLyogbmV3IHRhaWwgKi8KIAlpID0gcGQtPmRlbF9sb2NrKys7CS8qIGdldCBsb2NrIHN0YXRlICovCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aHlzZG5fbG9jaywgZmxhZ3MpOwogCiAJLyogZGVsZXRlIG9sZCBlbnRyeXMgKi8KIAlpZiAoIWkpCkBAIC0yMDUsNyArMjA0LDcgQEAKIHsKIAlzdHJ1Y3QgbG9nX2RhdGEgKmluZjsKIAlpbnQgbGVuOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgcHJvY2RhdGEgKnBkID0gTlVMTDsKIAloeXNkbl9jYXJkICpjYXJkOwogCkBAIC0yNzAsMTQgKzI2OSwxMyBAQAogCX0gZWxzZSBpZiAoKGZpbGVwLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkgPT0gRk1PREVfUkVBRCkgewogCiAJCS8qIHJlYWQgYWNjZXNzIC0+IGxvZy9kZWJ1ZyByZWFkICovCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAkJcGQtPmlmX3VzZWQrKzsKIAkJaWYgKHBkLT5sb2dfaGVhZCkKIAkJCWZpbGVwLT5wcml2YXRlX2RhdGEgPSAmcGQtPmxvZ190YWlsLT5uZXh0OwogCQllbHNlCiAJCQlmaWxlcC0+cHJpdmF0ZV9kYXRhID0gJnBkLT5sb2dfaGVhZDsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmh5c2RuX2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewkJLyogc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgYWNjZXNzIGZvcmJpZGRlbiAhICovCiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuICgtRVBFUk0pOwkvKiBubyBwZXJtaXNzaW9uIHRoaXMgdGltZSAqLwpAQCAtMzAxLDcgKzI5OSw3IEBACiAJaHlzZG5fY2FyZCAqY2FyZDsKIAlpbnQgcmV0dmFsID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCisJc3BpbmxvY2tfdCBoeXNkbl9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOwogCiAJbG9ja19rZXJuZWwoKTsKIAlpZiAoKGZpbGVwLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkgPT0gRk1PREVfV1JJVEUpIHsKQEAgLTMxMSw4ICszMDksNyBAQAogCQkvKiByZWFkIGFjY2VzcyAtPiBsb2cvZGVidWcgcmVhZCwgbWFyayBvbmUgZnVydGhlciBmaWxlIGFzIGNsb3NlZCAqLwogCiAJCXBkID0gTlVMTDsKLQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCWNsaSgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHlzZG5fbG9jaywgZmxhZ3MpOwogCQlpbmYgPSAqKChzdHJ1Y3QgbG9nX2RhdGEgKiopIGZpbGVwLT5wcml2YXRlX2RhdGEpOwkvKiBnZXQgZmlyc3QgbG9nIGVudHJ5ICovCiAJCWlmIChpbmYpCiAJCQlwZCA9IChzdHJ1Y3QgcHJvY2RhdGEgKikgaW5mLT5wcm9jX2N0cmw7CS8qIHN0aWxsIGVudHJpZXMgdGhlcmUgKi8KQEAgLTMzNSw3ICszMzIsNyBAQAogCQkJaW5mLT51c2FnZV9jbnQtLTsJLyogZGVjcmVtZW50IHVzYWdlIGNvdW50IGZvciBidWZmZXJzICovCiAJCQlpbmYgPSBpbmYtPm5leHQ7CiAJCX0KLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh5c2RuX2xvY2ssIGZsYWdzKTsKIAogCQlpZiAocGQpCiAJCQlpZiAocGQtPmlmX3VzZWQgPD0gMCkJLyogZGVsZXRlIGJ1ZmZlcnMgaWYgbGFzdCBmaWxlIGNsb3NlZCAqLwpAQCAtMzU3LDcgKzM1NCw3IEBACiBoeXNkbl9sb2dfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAloeXNkbl9jYXJkICpjYXJkOwogCXN0cnVjdCBwcm9jZGF0YSAqcGQgPSBOVUxMOwogCkBAIC00MDgsOCArNDA1LDcgQEAKIAogCS8qIGNyZWF0ZSBhIGNhcmRsb2cgcHJvYyBlbnRyeSAqLwogCi0JaWYgKChwZCA9IChzdHJ1Y3QgcHJvY2RhdGEgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NkYXRhKSwgR0ZQX0tFUk5FTCkpICE9IE5VTEwpIHsKLQkJbWVtc2V0KHBkLCAwLCBzaXplb2Yoc3RydWN0IHByb2NkYXRhKSk7CisJaWYgKChwZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jZGF0YSksIEdGUF9LRVJORUwpKSAhPSBOVUxMKSB7CiAJCXNwcmludGYocGQtPmxvZ19uYW1lLCAiJXMlZCIsIFBST0NfTE9HX0JBU0VOQU1FLCBjYXJkLT5teWlkKTsKIAkJaWYgKChwZC0+bG9nID0gY3JlYXRlX3Byb2NfZW50cnkocGQtPmxvZ19uYW1lLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsIGh5c2RuX3Byb2NfZW50cnkpKSAhPSBOVUxMKSB7CiAJCSAgICAgICAgcGQtPmxvZy0+cHJvY19mb3BzID0gJmxvZ19mb3BzOyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9zY2hlZC5jIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3NjaGVkLmMKaW5kZXggMWMwZDU0YS4uMTg3NTg3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3NjaGVkLmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3NjaGVkLmMKQEAgLTE1NSwyMiArMTU1LDE3IEBACiAJaWYgKGNhcmQtPmRlYnVnX2ZsYWdzICYgTE9HX1NDSEVEX0FTWU4pCiAJCWh5c2RuX2FkZGxvZyhjYXJkLCAiYXN5bmMgdHgtY2ZnIGNoYW49JWQgbGVuPSVkIiwgY2hhbiwgc3RybGVuKGxpbmUpICsgMSk7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKIAl3aGlsZSAoY2FyZC0+YXN5bmNfYnVzeSkgewotCQlzdGkoKTsKIAogCQlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiBMT0dfU0NIRURfQVNZTikKIAkJCWh5c2RuX2FkZGxvZyhjYXJkLCAiYXN5bmMgdHgtY2ZnIGRlbGF5ZWQiKTsKIAogCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMCk7CQkvKiBUaW1lb3V0IDIwbXMgKi8KLQkJaWYgKCEtLWNudCkgewotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCWlmICghLS1jbnQpCiAJCQlyZXR1cm4gKC1FUlJfQVNZTkNfVElNRSk7CS8qIHRpbWVkIG91dCAqLwotCQl9Ci0JCWNsaSgpOwogCX0JCQkvKiB3YWl0IGZvciBidWZmZXIgdG8gYmVjb21lIGZyZWUgKi8KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAJc3RyY3B5KGNhcmQtPmFzeW5jX2RhdGEsIGxpbmUpOwogCWNhcmQtPmFzeW5jX2xlbiA9IHN0cmxlbihsaW5lKSArIDE7CiAJY2FyZC0+YXN5bmNfY2hhbm5lbCA9IGNoYW47CkBAIC0xNzgsMzAgKzE3MywyMyBAQAogCiAJLyogbm93IHF1ZXVlIHRoZSB0YXNrICovCiAJc2NoZWR1bGVfd29yaygmY2FyZC0+aXJxX3F1ZXVlKTsKLQlzdGkoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5oeXNkbl9sb2NrLCBmbGFncyk7CiAKIAlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiBMT0dfU0NIRURfQVNZTikKIAkJaHlzZG5fYWRkbG9nKGNhcmQsICJhc3luYyB0eC1jZmcgZGF0YSBxdWV1ZWQiKTsKIAogCWNudCsrOwkJCS8qIHNob3J0IGRlbGF5ICovCi0JY2xpKCk7CiAKIAl3aGlsZSAoY2FyZC0+YXN5bmNfYnVzeSkgewotCQlzdGkoKTsKIAogCQlpZiAoY2FyZC0+ZGVidWdfZmxhZ3MgJiBMT0dfU0NIRURfQVNZTikKIAkJCWh5c2RuX2FkZGxvZyhjYXJkLCAiYXN5bmMgdHgtY2ZnIHdhaXRpbmcgZm9yIHR4LXJlYWR5Iik7CiAKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoMjApOwkJLyogVGltZW91dCAyMG1zICovCi0JCWlmICghLS1jbnQpIHsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQlpZiAoIS0tY250KQogCQkJcmV0dXJuICgtRVJSX0FTWU5DX1RJTUUpOwkvKiB0aW1lZCBvdXQgKi8KLQkJfQotCQljbGkoKTsKIAl9CQkJLyogd2FpdCBmb3IgYnVmZmVyIHRvIGJlY29tZSBmcmVlIGFnYWluICovCiAKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQogCWlmIChjYXJkLT5kZWJ1Z19mbGFncyAmIExPR19TQ0hFRF9BU1lOKQogCQloeXNkbl9hZGRsb2coY2FyZCwgImFzeW5jIHR4LWNmZyBkYXRhIHNlbmQiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2F1ZGlvLmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYXVkaW8uYwppbmRleCAyY2M1NmQ2Li5mYjM1MGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYXVkaW8uYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYXVkaW8uYwpAQCAtMzI4LDcgKzMyOCw3IEBACiBpc2RuX2F1ZGlvX2FkcGNtX2luaXQoYWRwY21fc3RhdGUgKiBzLCBpbnQgbmJpdHMpCiB7CiAJaWYgKCFzKQotCQlzID0gKGFkcGNtX3N0YXRlICopIGttYWxsb2Moc2l6ZW9mKGFkcGNtX3N0YXRlKSwgR0ZQX0FUT01JQyk7CisJCXMgPSBrbWFsbG9jKHNpemVvZihhZHBjbV9zdGF0ZSksIEdGUF9BVE9NSUMpOwogCWlmIChzKSB7CiAJCXMtPmEgPSAwOwogCQlzLT5kID0gNTsKQEAgLTM0Myw3ICszNDMsNyBAQAogaXNkbl9hdWRpb19kdG1mX2luaXQoZHRtZl9zdGF0ZSAqIHMpCiB7CiAJaWYgKCFzKQotCQlzID0gKGR0bWZfc3RhdGUgKikga21hbGxvYyhzaXplb2YoZHRtZl9zdGF0ZSksIEdGUF9BVE9NSUMpOworCQlzID0ga21hbGxvYyhzaXplb2YoZHRtZl9zdGF0ZSksIEdGUF9BVE9NSUMpOwogCWlmIChzKSB7CiAJCXMtPmlkeCA9IDA7CiAJCXMtPmxhc3QgPSAnICc7CkBAIC02MjEsNyArNjIxLDcgQEAKIGlzZG5fYXVkaW9fc2lsZW5jZV9pbml0KHNpbGVuY2Vfc3RhdGUgKiBzKQogewogCWlmICghcykKLQkJcyA9IChzaWxlbmNlX3N0YXRlICopIGttYWxsb2Moc2l6ZW9mKHNpbGVuY2Vfc3RhdGUpLCBHRlBfQVRPTUlDKTsKKwkJcyA9IGttYWxsb2Moc2l6ZW9mKHNpbGVuY2Vfc3RhdGUpLCBHRlBfQVRPTUlDKTsKIAlpZiAocykgewogCQlzLT5pZHggPSAwOwogCQlzLT5zdGF0ZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYnNkY29tcC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2JzZGNvbXAuYwppbmRleCAwYWZlNDQyLi5hMjBmMzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fYnNkY29tcC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9ic2Rjb21wLmMKQEAgLTMzMSwxMiArMzMxLDEwIEBACiAJICogQWxsb2NhdGUgdGhlIG1haW4gY29udHJvbCBzdHJ1Y3R1cmUgZm9yIHRoaXMgaW5zdGFuY2UuCiAJICovCiAJbWF4bWF4Y29kZSA9IE1BWENPREUoYml0cyk7Ci0JZGIgPSAoc3RydWN0IGJzZF9kYiAqKSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBic2RfZGIpLEdGUF9LRVJORUwpOworCWRiID0ga3phbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYnNkX2RiKSxHRlBfS0VSTkVMKTsKIAlpZiAoIWRiKQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldCAoZGIsIDAsIHNpemVvZihzdHJ1Y3QgYnNkX2RiKSk7Ci0KIAlkYi0+eG1pdCA9IGRhdGEtPmZsYWdzICYgSVBQUF9DT01QX0ZMQUdfWE1JVDsKIAlkZWNvbXAgPSBkYi0+eG1pdCA/IDAgOiAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKaW5kZXggYzNkNzllZS4uNmEyZWYwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYwpAQCAtMTA1OSw3ICsxMDU5LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBpc2RuX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogb2ZmKQogewotCXVpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXVpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJaW50IGxlbiA9IDA7CiAJaW50IGRydmlkeDsKIAlpbnQgY2hpZHg7CkBAIC0xMTM0LDkgKzExMzQsMTIgQEAKIAkJaWYgKGRldi0+ZHJ2W2RydmlkeF0tPmludGVyZmFjZS0+cmVhZHN0YXQpIHsKIAkJCWlmIChjb3VudCA+IGRldi0+ZHJ2W2RydmlkeF0tPnN0YXZhaWwpCiAJCQkJY291bnQgPSBkZXYtPmRydltkcnZpZHhdLT5zdGF2YWlsOwotCQkJbGVuID0gZGV2LT5kcnZbZHJ2aWR4XS0+aW50ZXJmYWNlLT4KLQkJCQlyZWFkc3RhdChidWYsIGNvdW50LCBkcnZpZHgsCi0JCQkJCSBpc2RuX21pbm9yMmNoYW4obWlub3IpKTsKKwkJCWxlbiA9IGRldi0+ZHJ2W2RydmlkeF0tPmludGVyZmFjZS0+cmVhZHN0YXQoYnVmLCBjb3VudCwKKwkJCQkJCWRydmlkeCwgaXNkbl9taW5vcjJjaGFuKG1pbm9yKSk7CisJCQlpZiAobGVuIDwgMCkgeworCQkJCXJldHZhbCA9IGxlbjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCWxlbiA9IDA7CiAJCX0KQEAgLTExNjMsNyArMTE2Niw3IEBACiBzdGF0aWMgc3NpemVfdAogaXNkbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBvZmYpCiB7Ci0JdWludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJdWludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQgZHJ2aWR4OwogCWludCBjaGlkeDsKIAlpbnQgcmV0dmFsOwpAQCAtMTIyNSw3ICsxMjI4LDcgQEAKIGlzZG5fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWludCBkcnZpZHggPSBpc2RuX21pbm9yMmRydihtaW5vciAtIElTRE5fTUlOT1JfQ1RSTCk7CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtMjA2OSwyMSArMjA3MiwxOSBAQAogCiAJaWYgKChhZGRpbmcpICYmIChkLT5yY3ZlcnIpKQogCQlrZnJlZShkLT5yY3ZlcnIpOwotCWlmICghKGQtPnJjdmVyciA9IGttYWxsb2Moc2l6ZW9mKGludCkgKiBtLCBHRlBfQVRPTUlDKSkpIHsKKwlpZiAoIShkLT5yY3ZlcnIgPSBremFsbG9jKHNpemVvZihpbnQpICogbSwgR0ZQX0FUT01JQykpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInJlZ2lzdGVyX2lzZG46IENvdWxkIG5vdCBhbGxvYyByY3ZlcnJcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQotCW1lbXNldCgoY2hhciAqKSBkLT5yY3ZlcnIsIDAsIHNpemVvZihpbnQpICogbSk7CiAKIAlpZiAoKGFkZGluZykgJiYgKGQtPnJjdmNvdW50KSkKIAkJa2ZyZWUoZC0+cmN2Y291bnQpOwotCWlmICghKGQtPnJjdmNvdW50ID0ga21hbGxvYyhzaXplb2YoaW50KSAqIG0sIEdGUF9BVE9NSUMpKSkgeworCWlmICghKGQtPnJjdmNvdW50ID0ga3phbGxvYyhzaXplb2YoaW50KSAqIG0sIEdGUF9BVE9NSUMpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWdpc3Rlcl9pc2RuOiBDb3VsZCBub3QgYWxsb2MgcmN2Y291bnRcbiIpOwogCQlpZiAoIWFkZGluZykKIAkJCWtmcmVlKGQtPnJjdmVycik7CiAJCXJldHVybiAtMTsKIAl9Ci0JbWVtc2V0KChjaGFyICopIGQtPnJjdmNvdW50LCAwLCBzaXplb2YoaW50KSAqIG0pOwogCiAJaWYgKChhZGRpbmcpICYmIChkLT5ycHF1ZXVlKSkgewogCQlmb3IgKGogPSAwOyBqIDwgZC0+Y2hhbm5lbHM7IGorKykKQEAgLTIyMjMsMTEgKzIyMjQsMTAgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVnaXN0ZXJfaXNkbjogTm8gd3JpdGUgcm91dGluZSBnaXZlbi5cbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKCEoZCA9IGttYWxsb2Moc2l6ZW9mKGlzZG5fZHJpdmVyX3QpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShkID0ga3phbGxvYyhzaXplb2YoaXNkbl9kcml2ZXJfdCksIEdGUF9LRVJORUwpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWdpc3Rlcl9pc2RuOiBDb3VsZCBub3QgYWxsb2MgZHJpdmVyLXN0cnVjdFxuIik7CiAJCXJldHVybiAwOwogCX0KLQltZW1zZXQoKGNoYXIgKikgZCwgMCwgc2l6ZW9mKGlzZG5fZHJpdmVyX3QpKTsKIAogCWQtPm1heGJ1ZnNpemUgPSBpLT5tYXhidWZzaXplOwogCWQtPnBrdGNvdW50ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwppbmRleCAxZjhkNmFlNi4uODM4YjM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwpAQCAtOTg0LDkgKzk4NCw5IEBACiAvKgogICogY2FsbGVkIGZyb20gdHFfaW1tZWRpYXRlCiAgKi8KLXN0YXRpYyB2b2lkIGlzZG5fbmV0X3NvZnRpbnQodm9pZCAqcHJpdmF0ZSkKK3N0YXRpYyB2b2lkIGlzZG5fbmV0X3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCWlzZG5fbmV0X2xvY2FsICpscCA9IHByaXZhdGU7CisJaXNkbl9uZXRfbG9jYWwgKmxwID0gY29udGFpbmVyX29mKHdvcmssIGlzZG5fbmV0X2xvY2FsLCB0cXVldWUpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlzcGluX2xvY2tfYmgoJmxwLT54bWl0X2xvY2spOwpAQCAtMjU0MiwxNyArMjU0MiwxNSBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpc2RuX25ldDogaW50ZXJmYWNlICVzIGFscmVhZHkgZXhpc3RzXG4iLCBuYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmICghKG5ldGRldiA9IChpc2RuX25ldF9kZXYgKikga21hbGxvYyhzaXplb2YoaXNkbl9uZXRfZGV2KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEobmV0ZGV2ID0ga3phbGxvYyhzaXplb2YoaXNkbl9uZXRfZGV2KSwgR0ZQX0tFUk5FTCkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlzZG5fbmV0OiBDb3VsZCBub3QgYWxsb2NhdGUgbmV0LWRldmljZVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQobmV0ZGV2LCAwLCBzaXplb2YoaXNkbl9uZXRfZGV2KSk7Ci0JaWYgKCEobmV0ZGV2LT5sb2NhbCA9IChpc2RuX25ldF9sb2NhbCAqKSBrbWFsbG9jKHNpemVvZihpc2RuX25ldF9sb2NhbCksIEdGUF9LRVJORUwpKSkgeworCWlmICghKG5ldGRldi0+bG9jYWwgPSBremFsbG9jKHNpemVvZihpc2RuX25ldF9sb2NhbCksIEdGUF9LRVJORUwpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpc2RuX25ldDogQ291bGQgbm90IGFsbG9jYXRlIGRldmljZSBsb2NhbHNcbiIpOwogCQlrZnJlZShuZXRkZXYpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtc2V0KG5ldGRldi0+bG9jYWwsIDAsIHNpemVvZihpc2RuX25ldF9sb2NhbCkpOwogCWlmIChuYW1lID09IE5VTEwpCiAJCXN0cmNweShuZXRkZXYtPmxvY2FsLT5uYW1lLCAiICAgICAgICAgIik7CiAJZWxzZQpAQCAtMjU5Niw3ICsyNTk0LDcgQEAKIAluZXRkZXYtPmxvY2FsLT5uZXRkZXYgPSBuZXRkZXY7CiAJbmV0ZGV2LT5sb2NhbC0+bmV4dCA9IG5ldGRldi0+bG9jYWw7CiAKLQlJTklUX1dPUksoJm5ldGRldi0+bG9jYWwtPnRxdWV1ZSwgKHZvaWQgKikodm9pZCAqKSBpc2RuX25ldF9zb2Z0aW50LCBuZXRkZXYtPmxvY2FsKTsKKwlJTklUX1dPUksoJm5ldGRldi0+bG9jYWwtPnRxdWV1ZSwgaXNkbl9uZXRfc29mdGludCk7CiAJc3Bpbl9sb2NrX2luaXQoJm5ldGRldi0+bG9jYWwtPnhtaXRfbG9jayk7CiAKIAluZXRkZXYtPmxvY2FsLT5pc2RuX2RldmljZSA9IC0xOwpAQCAtMjk1MCw3ICsyOTQ4LDcgQEAKIAlpc2RuX25ldF9waG9uZSAqbjsKIAogCWlmIChwKSB7Ci0JCWlmICghKG4gPSAoaXNkbl9uZXRfcGhvbmUgKikga21hbGxvYyhzaXplb2YoaXNkbl9uZXRfcGhvbmUpLCBHRlBfS0VSTkVMKSkpCisJCWlmICghKG4gPSBrbWFsbG9jKHNpemVvZihpc2RuX25ldF9waG9uZSksIEdGUF9LRVJORUwpKSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlzdHJjcHkobi0+bnVtLCBwaG9uZS0+cGhvbmUpOwogCQluLT5uZXh0ID0gcC0+bG9jYWwtPnBob25lW3Bob25lLT5vdXRnb2luZyAmIDFdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCmluZGV4IDExOTQxMmQuLjE3MjYxMzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCkBAIC02NjcsNyArNjY3LDcgQEAKIAogCWlmIChpcy0+ZGVidWcgJiAweDIpCiAJCXByaW50ayhLRVJOX0RFQlVHICJpc2RuX3BwcF9wb2xsOiBtaW5vcjogJWRcbiIsCi0JCQkJaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisJCQkJaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKTsKIAogCS8qIGp1c3QgcmVnaXN0ZXJzIHdhaXRfcXVldWUgaG9vay4gVGhpcyBkb2Vzbid0IHJlYWxseSB3YWl0LiAqLwogCXBvbGxfd2FpdChmaWxlLCAmaXMtPndxLCB3YWl0KTsKQEAgLTcxNyw3ICs3MTcsNyBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAiaXBwcDogZGV2aWNlIG5vdCBhY3RpdmF0ZWQuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQotCW5idWYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKGxlbiArIDQsIEdGUF9BVE9NSUMpOworCW5idWYgPSBrbWFsbG9jKGxlbiArIDQsIEdGUF9BVE9NSUMpOwogCWlmICghbmJ1ZikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcHBwOiBDYW4ndCBhbGxvYyBidWZcbiIpOwogCQlyZXR1cm4gMDsKQEAgLTg3NiwxNCArODc2LDEyIEBACiAjZW5kaWYgLyogQ09ORklHX0lTRE5fTVBQICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgSVNETl9NQVhfQ0hBTk5FTFM7IGkrKykgewotCQlpZiAoIShpcHBwX3RhYmxlW2ldID0gKHN0cnVjdCBpcHBwX3N0cnVjdCAqKQotCQkgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBwcF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKSkpIHsKKwkJaWYgKCEoaXBwcF90YWJsZVtpXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHBwX3N0cnVjdCksIEdGUF9LRVJORUwpKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXNkbl9wcHBfaW5pdDogQ291bGQgbm90IGFsbG9jIGlwcHBfdGFibGVcbiIpOwogCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKIAkJCQlrZnJlZShpcHBwX3RhYmxlW2pdKTsKIAkJCXJldHVybiAtMTsKIAkJfQotCQltZW1zZXQoKGNoYXIgKikgaXBwcF90YWJsZVtpXSwgMCwgc2l6ZW9mKHN0cnVjdCBpcHBwX3N0cnVjdCkpOwogCQlzcGluX2xvY2tfaW5pdCgmaXBwcF90YWJsZVtpXS0+YnVmbG9jayk7CiAJCWlwcHBfdGFibGVbaV0tPnN0YXRlID0gMDsKIAkJaXBwcF90YWJsZVtpXS0+Zmlyc3QgPSBpcHBwX3RhYmxlW2ldLT5ycSArIE5VTV9SQ1ZfQlVGRlMgLSAxOwpAQCAtMTUyOSwxMCArMTUyNyw4IEBACiB7CiAJaW50IGk7CiAJaW50IHN6ID0gSVNETl9NQVhfQ0hBTk5FTFMqc2l6ZW9mKGlwcHBfYnVuZGxlKTsKLQlpZiggKGlzZG5fcHBwX2J1bmRsZV9hcnIgPSAoaXBwcF9idW5kbGUqKWttYWxsb2Moc3osIAotCQkJCQkJCUdGUF9LRVJORUwpKSA9PSBOVUxMICkKKwlpZiggKGlzZG5fcHBwX2J1bmRsZV9hcnIgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKSkgPT0gTlVMTCApCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChpc2RuX3BwcF9idW5kbGVfYXJyLCAwLCBzeik7CiAJZm9yKCBpID0gMDsgaSA8IElTRE5fTUFYX0NIQU5ORUxTOyBpKysgKQogCQlzcGluX2xvY2tfaW5pdCgmaXNkbl9wcHBfYnVuZGxlX2FycltpXS5sb2NrKTsKIAlyZXR1cm4gMDsKQEAgLTIyNDYsMTMgKzIyNDIsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgaXBwcF9jY3BfcmVzZXQgKmlzZG5fcHBwX2NjcF9yZXNldF9hbGxvYyhzdHJ1Y3QgaXBwcF9zdHJ1Y3QgKmlzKQogewogCXN0cnVjdCBpcHBwX2NjcF9yZXNldCAqcjsKLQlyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwcHBfY2NwX3Jlc2V0KSwgR0ZQX0tFUk5FTCk7CisJciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHBwX2NjcF9yZXNldCksIEdGUF9LRVJORUwpOwogCWlmKCFyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXBwcF9jY3A6IGZhaWxlZCB0byBhbGxvY2F0ZSByZXNldCBkYXRhIgogCQkgICAgICAgIiBzdHJ1Y3R1cmUgLSBubyBtZW1cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtc2V0KHIsIDAsIHNpemVvZihzdHJ1Y3QgaXBwcF9jY3BfcmVzZXQpKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiaXBwcF9jY3A6IGFsbG9jYXRlZCByZXNldCBkYXRhIHN0cnVjdHVyZSAlcFxuIiwgcik7CiAJaXMtPnJlc2V0ID0gcjsKIAlyZXR1cm4gcjsKQEAgLTIzMzgsMTAgKzIzMzMsOSBAQAogCQkgICAgICAgaWQpOwogCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UgewotCQlycyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHBwX2NjcF9yZXNldF9zdGF0ZSksIEdGUF9LRVJORUwpOworCQlycyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHBwX2NjcF9yZXNldF9zdGF0ZSksIEdGUF9LRVJORUwpOwogCQlpZighcnMpCiAJCQlyZXR1cm4gTlVMTDsKLQkJbWVtc2V0KHJzLCAwLCBzaXplb2Yoc3RydWN0IGlwcHBfY2NwX3Jlc2V0X3N0YXRlKSk7CiAJCXJzLT5zdGF0ZSA9IENDUFJlc2V0SWRsZTsKIAkJcnMtPmlzID0gaXM7CiAJCXJzLT5pZCA9IGlkOwpAQCAtMjUzNiw2ICsyNTMwLDExIEBACiAgIAkJcnNwYXJtLm1heGRsZW4gPSBJUFBQX1JFU0VUX01BWERBVEFCWVRFUzsKICAgCiAgIAkJc2tiX291dCA9IGRldl9hbGxvY19za2IoaXMtPm1ydSArIFBQUF9IRFJMRU4pOworICAJCWlmICghc2tiX291dCkgeworICAJCQlrZnJlZV9za2Ioc2tiKTsKKyAgCQkJcHJpbnRrKEtFUk5fRVJSICJpcHBwOiBkZWNvbXAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQlyZXR1cm4gTlVMTDsKKyAgCQl9CiAJCWxlbiA9IGlwYy0+ZGVjb21wcmVzcyhzdGF0LCBza2IsIHNrYl9vdXQsICZyc3Bhcm0pOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJaWYgKGxlbiA8PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMKaW5kZXggMmI5MWJiMC4uZmM4MGFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYwpAQCAtMTQ2NCw3ICsxNDY0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWlzZG5fdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK2lzZG5fdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJbW9kZW1faW5mbyAqaW5mbyA9IChtb2RlbV9pbmZvICopIHR0eS0+ZHJpdmVyX2RhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl92MTEwLmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdjExMC5jCmluZGV4IDM4NjE5ZTguLjU0ODRkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl92MTEwLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3YxMTAuYwpAQCAtOTIsOSArOTIsOCBAQAogCWludCBpOwogCWlzZG5fdjExMF9zdHJlYW0gKnY7CiAKLQlpZiAoKHYgPSBrbWFsbG9jKHNpemVvZihpc2RuX3YxMTBfc3RyZWFtKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJaWYgKCh2ID0ga3phbGxvYyhzaXplb2YoaXNkbl92MTEwX3N0cmVhbSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQodiwgMCwgc2l6ZW9mKGlzZG5fdjExMF9zdHJlYW0pKTsKIAl2LT5rZXkgPSBrZXk7CiAJdi0+bmJpdHMgPSAwOwogCWZvciAoaSA9IDA7IGtleSAmICgxIDw8IGkpOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaWNuL2ljbi5jIGIvZHJpdmVycy9pc2RuL2ljbi9pY24uYwppbmRleCA2NjQ5ZjhiLi4xZTY5OWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaWNuL2ljbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9pY24vaWNuLmMKQEAgLTEwMTAsNyArMTAxMCw4IEBACiAJZm9yIChwID0gYnVmLCBjb3VudCA9IDA7IGNvdW50IDwgbGVuOyBwKyssIGNvdW50KyspIHsKIAkJaWYgKGNhcmQtPm1zZ19idWZfcmVhZCA9PSBjYXJkLT5tc2dfYnVmX3dyaXRlKQogCQkJcmV0dXJuIGNvdW50OwotCQlwdXRfdXNlcigqY2FyZC0+bXNnX2J1Zl9yZWFkKyssIHApOworCQlpZiAocHV0X3VzZXIoKmNhcmQtPm1zZ19idWZfcmVhZCsrLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAoY2FyZC0+bXNnX2J1Zl9yZWFkID4gY2FyZC0+bXNnX2J1Zl9lbmQpCiAJCQljYXJkLT5tc2dfYnVmX3JlYWQgPSBjYXJkLT5tc2dfYnVmOwogCX0KQEAgLTE1MTgsMTIgKzE1MTksMTEgQEAKIAlpY25fY2FyZCAqY2FyZDsKIAlpbnQgaTsKIAotCWlmICghKGNhcmQgPSAoaWNuX2NhcmQgKikga21hbGxvYyhzaXplb2YoaWNuX2NhcmQpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShjYXJkID0ga3phbGxvYyhzaXplb2YoaWNuX2NhcmQpLCBHRlBfS0VSTkVMKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgImljbjogKCVzKSBDb3VsZCBub3QgYWxsb2NhdGUgY2FyZC1zdHJ1Y3QuXG4iLCBpZCk7CiAJCXJldHVybiAoaWNuX2NhcmQgKikgMDsKIAl9Ci0JbWVtc2V0KChjaGFyICopIGNhcmQsIDAsIHNpemVvZihpY25fY2FyZCkpOwogCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKIAljYXJkLT5wb3J0ID0gcG9ydDsKIAljYXJkLT5pbnRlcmZhY2Uub3duZXIgPSBUSElTX01PRFVMRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5jIGIvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmMKaW5kZXggZmFiYmQ0Ni4uZTNhZGQyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmMKKysrIGIvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmMKQEAgLTEwMCwxMiArMTAwLDExIEBACiAJCWlzZG5sb29wX2JjaGFuX3NlbmQoY2FyZCwgMSk7CiAJaWYgKGNhcmQtPmZsYWdzICYgKElTRE5MT09QX0ZMQUdTX0IxQUNUSVZFIHwgSVNETkxPT1BfRkxBR1NfQjJBQ1RJVkUpKSB7CiAJCS8qIHNjaGVkdWxlIGItY2hhbm5lbCBwb2xsaW5nIGFnYWluICovCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJY2FyZC0+cmJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBJU0ROTE9PUF9USU1FUl9CQ1JFQUQ7CiAJCWFkZF90aW1lcigmY2FyZC0+cmJfdGltZXIpOwogCQljYXJkLT5mbGFncyB8PSBJU0ROTE9PUF9GTEFHU19SQlRJTUVSOwotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCX0gZWxzZQogCQljYXJkLT5mbGFncyAmPSB+SVNETkxPT1BfRkxBR1NfUkJUSU1FUjsKIH0KQEAgLTI4MSw4ICsyODAsNyBAQAogewogCXVsb25nIGZsYWdzOwogCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkqY2FyZC0+bXNnX2J1Zl93cml0ZSsrID0gKGMgPT0gMHhmZikgPyAnXG4nIDogYzsKIAlpZiAoY2FyZC0+bXNnX2J1Zl93cml0ZSA9PSBjYXJkLT5tc2dfYnVmX3JlYWQpIHsKIAkJaWYgKCsrY2FyZC0+bXNnX2J1Zl9yZWFkID4gY2FyZC0+bXNnX2J1Zl9lbmQpCkBAIC0yOTAsNyArMjg4LDcgQEAKIAl9CiAJaWYgKGNhcmQtPm1zZ19idWZfd3JpdGUgPiBjYXJkLT5tc2dfYnVmX2VuZCkKIAkJY2FyZC0+bXNnX2J1Zl93cml0ZSA9IGNhcmQtPm1zZ19idWY7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtMzcyLDIxICszNzAsMTkgQEAKIAkJaWYgKCEoY2FyZC0+ZmxhZ3MgJiBJU0ROTE9PUF9GTEFHU19SQlRJTUVSKSkgewogCQkJLyogc2NoZWR1bGUgYi1jaGFubmVsIHBvbGxpbmcgKi8KIAkJCWNhcmQtPmZsYWdzIHw9IElTRE5MT09QX0ZMQUdTX1JCVElNRVI7Ci0JCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJCWNsaSgpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCWRlbF90aW1lcigmY2FyZC0+cmJfdGltZXIpOwogCQkJY2FyZC0+cmJfdGltZXIuZnVuY3Rpb24gPSBpc2RubG9vcF9wb2xsYmNoYW47CiAJCQljYXJkLT5yYl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQ7CiAJCQljYXJkLT5yYl90aW1lci5leHBpcmVzID0gamlmZmllcyArIElTRE5MT09QX1RJTUVSX0JDUkVBRDsKIAkJCWFkZF90aW1lcigmY2FyZC0+cmJfdGltZXIpOwotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCX0KIAkvKiBzY2hlZHVsZSBhZ2FpbiAqLwotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJY2FyZC0+c3RfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBJU0ROTE9PUF9USU1FUl9EQ1JFQUQ7CiAJYWRkX3RpbWVyKCZjYXJkLT5zdF90aW1lcik7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtNDE2LDggKzQxMiw3IEBACiAJCQlyZXR1cm4gMDsKIAkJaWYgKGNhcmQtPnNuZGNvdW50W2NoYW5uZWxdID4gSVNETkxPT1BfTUFYX1NRVUVVRSkKIAkJCXJldHVybiAwOwotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCW5za2IgPSBkZXZfYWxsb2Nfc2tiKHNrYi0+bGVuKTsKIAkJaWYgKG5za2IpIHsKIAkJCW1lbWNweShza2JfcHV0KG5za2IsIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKQEAgLTQyNiw3ICs0MjEsNyBAQAogCQl9IGVsc2UKIAkJCWxlbiA9IDA7CiAJCWNhcmQtPnNuZGNvdW50W2NoYW5uZWxdICs9IGxlbjsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAl9CiAJcmV0dXJuIGxlbjsKIH0KQEAgLTQ1MSw3ICs0NDYsOCBAQAogCWZvciAocCA9IGJ1ZiwgY291bnQgPSAwOyBjb3VudCA8IGxlbjsgcCsrLCBjb3VudCsrKSB7CiAJCWlmIChjYXJkLT5tc2dfYnVmX3JlYWQgPT0gY2FyZC0+bXNnX2J1Zl93cml0ZSkKIAkJCXJldHVybiBjb3VudDsKLQkJcHV0X3VzZXIoKmNhcmQtPm1zZ19idWZfcmVhZCsrLCBwKTsKKwkJaWYgKHB1dF91c2VyKCpjYXJkLT5tc2dfYnVmX3JlYWQrKywgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKGNhcmQtPm1zZ19idWZfcmVhZCA+IGNhcmQtPm1zZ19idWZfZW5kKQogCQkJY2FyZC0+bXNnX2J1Zl9yZWFkID0gY2FyZC0+bXNnX2J1ZjsKIAl9CkBAIC01NzYsOCArNTcyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNoYXIgYnVmWzYwXTsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJaWYgKGNhcmQtPnJjYXJkKSB7CiAJCWlzZG5sb29wX2Zha2UoY2FyZC0+cmNhcmRbY2hdLCAiRERJU19JIiwgY2FyZC0+cmNoW2NoXSArIDEpOwogCQljYXJkLT5yY2FyZFtjaF0tPnJjYXJkW2NhcmQtPnJjaFtjaF1dID0gTlVMTDsKQEAgLTU4Nyw3ICs1ODIsNyBAQAogCS8qIE5vIHVzZXIgcmVzcG9uZGluZyAqLwogCXNwcmludGYoYnVmLCAiQ0FVJXMiLCBpc2RubG9vcF91bmljYXVzZShjYXJkLCAxLCAzKSk7CiAJaXNkbmxvb3BfZmFrZShjYXJkLCBidWYsIGNoICsgMSk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtNjIyLDggKzYxNyw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJaW5pdF90aW1lcigmY2FyZC0+Y190aW1lcltjaF0pOwogCWNhcmQtPmNfdGltZXJbY2hdLmV4cGlyZXMgPSBqaWZmaWVzICsgSVNETkxPT1BfVElNRVJfQUxFUlRXQUlUOwogCWlmIChjaCkKQEAgLTYzMiw3ICs2MjYsNyBAQAogCQljYXJkLT5jX3RpbWVyW2NoXS5mdW5jdGlvbiA9IGlzZG5sb29wX2F0aW1lb3V0MDsKIAljYXJkLT5jX3RpbWVyW2NoXS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQ7CiAJYWRkX3RpbWVyKCZjYXJkLT5jX3RpbWVyW2NoXSk7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtNjQ3LDEwICs2NDEsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCWRlbF90aW1lcigmY2FyZC0+Y190aW1lcltjaF0pOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHVfY2hhciBzaTJiaXRbXSA9CkBAIC03MDYsMTMgKzY5OSwxMiBAQAogCQkJCQl9CiAJCQl9CiAJCQlpZiAobnVtX21hdGNoKSB7Ci0JCQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCQkJY2xpKCk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCQkvKiBjaGFubmVsIGlkbGU/ICovCiAJCQkJaWYgKCEoY2MtPnJjYXJkW2NoXSkpIHsKIAkJCQkJLyogQ2hlY2sgU0kgKi8KIAkJCQkJaWYgKCEoc2kyYml0W2NtZC0+cGFybS5zZXR1cC5zaTFdICYgY2MtPnNpbFtjaF0pKSB7Ci0JCQkJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCQkJCXJldHVybiAzOwogCQkJCQl9CiAJCQkJCS8qIGNoIGlzIGlkbGUsIHNpIGFuZCBudW1iZXIgbWF0Y2hlcyAqLwpAQCAtNzIwLDEwICs3MTIsMTAgQEAKIAkJCQkJY2MtPnJjaFtjaF0gPSBsY2g7CiAJCQkJCWNhcmQtPnJjYXJkW2xjaF0gPSBjYzsKIAkJCQkJY2FyZC0+cmNoW2xjaF0gPSBjaDsKLQkJCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCQkJcmV0dXJuIDA7CiAJCQkJfSBlbHNlIHsKLQkJCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCQkJLyogbnVtIG1hdGNoZXMsIGJ1dCBidXN5ICovCiAJCQkJCWlmIChjaCA9PSAxKQogCQkJCQkJcmV0dXJuIDE7CkBAIC0xMDI3LDggKzEwMTksNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaXNkbl9jdHJsIGNtZDsKIAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJaWYgKGNhcmQtPmZsYWdzICYgSVNETkxPT1BfRkxBR1NfUlVOTklORykgewogCQljYXJkLT5mbGFncyAmPSB+SVNETkxPT1BfRkxBR1NfUlVOTklORzsKIAkJZGVsX3RpbWVyKCZjYXJkLT5zdF90aW1lcik7CkBAIC0xMDM5LDcgKzEwMzAsNyBAQAogCQljbWQuZHJpdmVyID0gY2FyZC0+bXlpZDsKIAkJY2FyZC0+aW50ZXJmYWNlLnN0YXRjYWxsYigmY21kKTsKIAl9Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtMTA3OCwxOCArMTA2OSwxNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKSAmc2RlZiwgKGNoYXIgKikgc2RlZnAsIHNpemVvZihzZGVmKSkpCiAJCXJldHVybiAtRUZBVUxUOwotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJc3dpdGNoIChzZGVmLnB0eXBlKSB7CiAJCWNhc2UgSVNETl9QVFlQRV9FVVJPOgogCQkJaWYgKGlzZG5sb29wX2Zha2UoY2FyZCwgIkRSVjEuMjNFQy1RLjkzMS1DQVBJLUNOUy1CQVNJUy0yMC4wMi45NiIsCiAJCQkJCSAgLTEpKSB7Ci0JCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJY2FyZC0+c2lsWzBdID0gY2FyZC0+c2lsWzFdID0gNDsKIAkJCWlmIChpc2RubG9vcF9mYWtlKGNhcmQsICJURUkgT0siLCAwKSkgewotCQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCkBAIC0xMDk4LDEyICsxMDg4LDEyIEBACiAJCWNhc2UgSVNETl9QVFlQRV8xVFI2OgogCQkJaWYgKGlzZG5sb29wX2Zha2UoY2FyZCwgIkRSVjEuMDRUQy0xVFI2LUNBUEktQ05TLUJBU0lTLTI5LjExLjk1IiwKIAkJCQkJICAtMSkpIHsKLQkJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQljYXJkLT5zaWxbMF0gPSBjYXJkLT5zaWxbMV0gPSA0OwogCQkJaWYgKGlzZG5sb29wX2Zha2UoY2FyZCwgIlRFSSBPSyIsIDApKSB7Ci0JCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+aXNkbmxvb3BfbG9jaywgZmxhZ3MpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJc3RyY3B5KGNhcmQtPnMwbnVtWzBdLCBzZGVmLm51bVswXSk7CkBAIC0xMTExLDcgKzExMDEsNyBAQAogCQkJY2FyZC0+czBudW1bMl1bMF0gPSAnXDAnOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmlzZG5sb29wX2xvY2ssIGZsYWdzKTsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlzZG5sb29wOiBJbGxlZ2FsIEQtY2hhbm5lbCBwcm90b2NvbCAlZFxuIiwKIAkJCSAgICAgICBzZGVmLnB0eXBlKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTEyMiw3ICsxMTEyLDcgQEAKIAljYXJkLT5zdF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQ7CiAJYWRkX3RpbWVyKCZjYXJkLT5zdF90aW1lcik7CiAJY2FyZC0+ZmxhZ3MgfD0gSVNETkxPT1BfRkxBR1NfUlVOTklORzsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NDAsMTIgKzE0MzAsMTEgQEAKIAlpc2RubG9vcF9jYXJkICpjYXJkOwogCWludCBpOwogCi0JaWYgKCEoY2FyZCA9IChpc2RubG9vcF9jYXJkICopIGttYWxsb2Moc2l6ZW9mKGlzZG5sb29wX2NhcmQpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShjYXJkID0ga3phbGxvYyhzaXplb2YoaXNkbmxvb3BfY2FyZCksIEdGUF9LRVJORUwpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAiaXNkbmxvb3A6ICglcykgQ291bGQgbm90IGFsbG9jYXRlIGNhcmQtc3RydWN0LlxuIiwgaWQpOwogCQlyZXR1cm4gKGlzZG5sb29wX2NhcmQgKikgMDsKIAl9Ci0JbWVtc2V0KChjaGFyICopIGNhcmQsIDAsIHNpemVvZihpc2RubG9vcF9jYXJkKSk7CiAJY2FyZC0+aW50ZXJmYWNlLm93bmVyID0gVEhJU19NT0RVTEU7CiAJY2FyZC0+aW50ZXJmYWNlLmNoYW5uZWxzID0gSVNETkxPT1BfQkNIOwogCWNhcmQtPmludGVyZmFjZS5obF9oZHJsZW4gID0gMTsgLyogc2NyYXRjaCBhcmVhIGZvciBzdG9yaW5nIGFjayBmbGFnKi8gCkBAIC0xNDcyLDYgKzE0NjEsNyBAQAogCQlza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5icXVldWVbaV0pOwogCX0KIAlza2JfcXVldWVfaGVhZF9pbml0KCZjYXJkLT5kcXVldWUpOworCWNhcmQtPmlzZG5sb29wX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CiAJY2FyZC0+bmV4dCA9IGNhcmRzOwogCWNhcmRzID0gY2FyZDsKIAlpZiAoIXJlZ2lzdGVyX2lzZG4oJmNhcmQtPmludGVyZmFjZSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pc2RubG9vcC9pc2RubG9vcC5oIGIvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmgKaW5kZXggZDY5OWZlNS4uMGQ0NThhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmgKKysrIGIvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmgKQEAgLTk0LDYgKzk0LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCiAJIGJxdWV1ZVtJU0ROTE9PUF9CQ0hdOyAgLyogQi1DaGFubmVsIHF1ZXVlcyAgICAgICAgICAgICAgICAgKi8KIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGRxdWV1ZTsJLyogRC1DaGFubmVsIHF1ZXVlICAgICAgICAgICAgICAgICAgKi8KKwlzcGlubG9ja190IGlzZG5sb29wX2xvY2s7CiB9IGlzZG5sb29wX2NhcmQ7CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vcGNiaXQvZHJ2LmMgYi9kcml2ZXJzL2lzZG4vcGNiaXQvZHJ2LmMKaW5kZXggOTRmMjE0OC4uMTFjMWIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL3BjYml0L2Rydi5jCisrKyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9kcnYuYwpAQCAtNjgsMjEgKzY4LDE4IEBACiBzdGF0aWMgaW50IHBjYml0X2NoZWNrX21zbihzdHJ1Y3QgcGNiaXRfZGV2ICpkZXYsIGNoYXIgKm1zbik7CiAKIAotZXh0ZXJuIHZvaWQgcGNiaXRfZGVsaXZlcih2b2lkICogZGF0YSk7Ci0KIGludCBwY2JpdF9pbml0X2RldihpbnQgYm9hcmQsIGludCBtZW1fYmFzZSwgaW50IGlycSkKIHsKIAlzdHJ1Y3QgcGNiaXRfZGV2ICpkZXY7CiAJaXNkbl9pZiAqZGV2X2lmOwogCi0JaWYgKChkZXY9a21hbGxvYyhzaXplb2Yoc3RydWN0IHBjYml0X2RldiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWlmICgoZGV2PWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2JpdF9kZXYpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKIAl7CiAJCXByaW50aygicGNiaXRfaW5pdDogY291bGRuJ3QgbWFsbG9jIHBjYml0X2RldiBzdHJ1Y3RcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlkZXZfcGNiaXRbYm9hcmRdID0gZGV2OwotCW1lbXNldChkZXYsIDAsIHNpemVvZihzdHJ1Y3QgcGNiaXRfZGV2KSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5zZXRfcnVubmluZ193cSk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CiAKQEAgLTEwNiw3ICsxMDMsNyBAQAogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKLQlkZXYtPmIxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjYml0X2NoYW4pLCBHRlBfS0VSTkVMKTsKKwlkZXYtPmIxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjYml0X2NoYW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+YjEpIHsKIAkJcHJpbnRrKCJwY2JpdF9pbml0OiBjb3VsZG4ndCBtYWxsb2MgcGNiaXRfY2hhbiBzdHJ1Y3RcbiIpOwogCQlpb3VubWFwKGRldi0+c2hfbWVtKTsKQEAgLTExNSw3ICsxMTIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAgICAgCi0JZGV2LT5iMiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2JpdF9jaGFuKSwgR0ZQX0tFUk5FTCk7CisJZGV2LT5iMiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2JpdF9jaGFuKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYtPmIyKSB7CiAJCXByaW50aygicGNiaXRfaW5pdDogY291bGRuJ3QgbWFsbG9jIHBjYml0X2NoYW4gc3RydWN0XG4iKTsKIAkJa2ZyZWUoZGV2LT5iMSk7CkBAIC0xMjUsMTEgKzEyMiw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW1lbXNldChkZXYtPmIxLCAwLCBzaXplb2Yoc3RydWN0IHBjYml0X2NoYW4pKTsKLQltZW1zZXQoZGV2LT5iMiwgMCwgc2l6ZW9mKHN0cnVjdCBwY2JpdF9jaGFuKSk7CiAJZGV2LT5iMi0+aWQgPSAxOwogCi0JSU5JVF9XT1JLKCZkZXYtPnFkZWxpdmVyeSwgcGNiaXRfZGVsaXZlciwgZGV2KTsKKwlJTklUX1dPUksoJmRldi0+cWRlbGl2ZXJ5LCBwY2JpdF9kZWxpdmVyKTsKIAogCS8qCiAJICogIGludGVycnVwdHMKQEAgLTcyNSwyMyArNzIwLDI3IEBACiAKIAlpZiAoc3RhdF9zdCA8IHN0YXRfZW5kKQogCXsKLQkJY29weV90b191c2VyKGJ1Ziwgc3RhdGJ1ZiArIHN0YXRfc3QsIGxlbik7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzdGF0YnVmICsgc3RhdF9zdCwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQlzdGF0X3N0ICs9IGxlbjsJICAgCiAJfQogCWVsc2UKIAl7CiAJCWlmIChsZW4gPiBTVEFUQlVGX0xFTiAtIHN0YXRfc3QpCiAJCXsKLQkJCWNvcHlfdG9fdXNlcihidWYsIHN0YXRidWYgKyBzdGF0X3N0LCAKLQkJCQkgICAgICAgU1RBVEJVRl9MRU4gLSBzdGF0X3N0KTsKLQkJCWNvcHlfdG9fdXNlcihidWYsIHN0YXRidWYsIAotCQkJCSAgICAgICBsZW4gLSAoU1RBVEJVRl9MRU4gLSBzdGF0X3N0KSk7CisJCQlpZiAoY29weV90b191c2VyKGJ1Ziwgc3RhdGJ1ZiArIHN0YXRfc3QsCisJCQkJICAgICAgIFNUQVRCVUZfTEVOIC0gc3RhdF9zdCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoY29weV90b191c2VyKGJ1Ziwgc3RhdGJ1ZiwKKwkJCQkgICAgICAgbGVuIC0gKFNUQVRCVUZfTEVOIC0gc3RhdF9zdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQlzdGF0X3N0ID0gbGVuIC0gKFNUQVRCVUZfTEVOIC0gc3RhdF9zdCk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQljb3B5X3RvX3VzZXIoYnVmLCBzdGF0YnVmICsgc3RhdF9zdCwgbGVuKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzdGF0YnVmICsgc3RhdF9zdCwgbGVuKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJc3RhdF9zdCArPSBsZW47CiAJCQkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9wY2JpdC9sYXllcjIuYyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9sYXllcjIuYwppbmRleCA5MzdmZDIxLi5lYWZjY2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vcGNiaXQvbGF5ZXIyLmMKKysrIGIvZHJpdmVycy9pc2RuL3BjYml0L2xheWVyMi5jCkBAIC02Nyw3ICs2Nyw2IEBACiAgKiAgUHJvdG90eXBlcwogICovCiAKLXZvaWQgcGNiaXRfZGVsaXZlcih2b2lkICpkYXRhKTsKIHN0YXRpYyB2b2lkIHBjYml0X3RyYW5zbWl0KHN0cnVjdCBwY2JpdF9kZXYgKmRldik7CiAKIHN0YXRpYyB2b2lkIHBjYml0X3JlY3ZfYWNrKHN0cnVjdCBwY2JpdF9kZXYgKmRldiwgdW5zaWduZWQgY2hhciBhY2spOwpAQCAtMTAxLDcgKzEwMCw3IEBACiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAoKGZyYW1lID0gKHN0cnVjdCBmcmFtZV9idWYgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGZyYW1lX2J1ZiksCisJaWYgKChmcmFtZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcmFtZV9idWYpLAogCQkJCQkJICBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2JpdF8yX3dyaXRlOiBrbWFsbG9jIGZhaWxlZFxuIik7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKQEAgLTI5OSwxMSArMjk4LDEyIEBACiAgKi8KIAogdm9pZAotcGNiaXRfZGVsaXZlcih2b2lkICpkYXRhKQorcGNiaXRfZGVsaXZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGZyYW1lX2J1ZiAqZnJhbWU7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgbXNnOwotCXN0cnVjdCBwY2JpdF9kZXYgKmRldiA9IChzdHJ1Y3QgcGNiaXRfZGV2ICopIGRhdGE7CisJc3RydWN0IHBjYml0X2RldiAqZGV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwY2JpdF9kZXYsIHFkZWxpdmVyeSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTM2OSwxMyArMzY5LDEyIEBACiAJCQlrZnJlZShkZXYtPnJlYWRfZnJhbWUpOwogCQkJZGV2LT5yZWFkX2ZyYW1lID0gTlVMTDsKIAkJfQotCQlmcmFtZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcmFtZV9idWYpLCBHRlBfQVRPTUlDKTsKKwkJZnJhbWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZnJhbWVfYnVmKSwgR0ZQX0FUT01JQyk7CiAKIAkJaWYgKGZyYW1lID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImttYWxsb2MgZmFpbGVkXG4iKTsKIAkJCXJldHVybjsKIAkJfQotCQltZW1zZXQoZnJhbWUsIDAsIHNpemVvZihzdHJ1Y3QgZnJhbWVfYnVmKSk7CiAKIAkJY3B1ID0gcGNiaXRfcmVhZGIoZGV2KTsKIAkJcHJvYyA9IHBjYml0X3JlYWRiKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vcGNiaXQvcGNiaXQuaCBiL2RyaXZlcnMvaXNkbi9wY2JpdC9wY2JpdC5oCmluZGV4IDM4OGJhY2UuLjE5YzE4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9wY2JpdC9wY2JpdC5oCisrKyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9wY2JpdC5oCkBAIC0xNjYsNCArMTY2LDYgQEAKICNkZWZpbmUgTDJfUlVOTklORyAgNQogI2RlZmluZSBMMl9FUlJPUiAgICA2CiAKK2V4dGVybiB2b2lkIHBjYml0X2RlbGl2ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vc2MvaW5pdC5jIGIvZHJpdmVycy9pc2RuL3NjL2luaXQuYwppbmRleCAwNmM5ODcyLi4xNTA3NTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vc2MvaW5pdC5jCisrKyBiL2RyaXZlcnMvaXNkbi9zYy9pbml0LmMKQEAgLTI3MSwxNCArMjcxLDEzIEBACiAJCSAqIEhvcnJheSEgV2UgZm91bmQgYSBib2FyZCwgTWFrZSBzdXJlIHdlIGNhbiByZWdpc3RlcgogCQkgKiBpdCB3aXRoIElTRE40TGludXgKIAkJICovCi0JCWludGVyZmFjZSA9IGttYWxsb2Moc2l6ZW9mKGlzZG5faWYpLCBHRlBfS0VSTkVMKTsKKwkJaW50ZXJmYWNlID0ga3phbGxvYyhzaXplb2YoaXNkbl9pZiksIEdGUF9LRVJORUwpOwogCQlpZiAoaW50ZXJmYWNlID09IE5VTEwpIHsKIAkJCS8qCiAJCQkgKiBPb3BzLCBjYW4ndCBtYWxsb2MgaXNkbl9pZgogCQkJICovCiAJCQljb250aW51ZTsKIAkJfQotCQltZW1zZXQoaW50ZXJmYWNlLCAwLCBzaXplb2YoaXNkbl9pZikpOwogCiAJCWludGVyZmFjZS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAkJaW50ZXJmYWNlLT5obF9oZHJsZW4gPSAwOwpAQCAtMjk0LDcgKzI5Myw3IEBACiAJCS8qCiAJCSAqIEFsbG9jYXRlIHRoZSBib2FyZCBzdHJ1Y3R1cmUKIAkJICovCi0JCXNjX2FkYXB0ZXJbY2luc3RdID0ga21hbGxvYyhzaXplb2YoYm9hcmQpLCBHRlBfS0VSTkVMKTsKKwkJc2NfYWRhcHRlcltjaW5zdF0gPSBremFsbG9jKHNpemVvZihib2FyZCksIEdGUF9LRVJORUwpOwogCQlpZiAoc2NfYWRhcHRlcltjaW5zdF0gPT0gTlVMTCkgewogCQkJLyoKIAkJCSAqIE9vcHMsIGNhbid0IGFsbG9jIG1lbW9yeSBmb3IgdGhlIGJvYXJkCkBAIC0zMDIsNyArMzAxLDYgQEAKIAkJCWtmcmVlKGludGVyZmFjZSk7CiAJCQljb250aW51ZTsKIAkJfQotCQltZW1zZXQoc2NfYWRhcHRlcltjaW5zdF0sIDAsIHNpemVvZihib2FyZCkpOwogCQlzcGluX2xvY2tfaW5pdCgmc2NfYWRhcHRlcltjaW5zdF0tPmxvY2spOwogCiAJCWlmKCFyZWdpc3Rlcl9pc2RuKGludGVyZmFjZSkpIHsKQEAgLTMyNiw3ICszMjQsNyBAQAogCQkvKgogCQkgKiBBbGxvY2F0ZSBjaGFubmVscyBzdGF0dXMgc3RydWN0dXJlcwogCQkgKi8KLQkJc2NfYWRhcHRlcltjaW5zdF0tPmNoYW5uZWwgPSBrbWFsbG9jKHNpemVvZihiY2hhbikgKiBjaGFubmVscywgR0ZQX0tFUk5FTCk7CisJCXNjX2FkYXB0ZXJbY2luc3RdLT5jaGFubmVsID0ga3phbGxvYyhzaXplb2YoYmNoYW4pICogY2hhbm5lbHMsIEdGUF9LRVJORUwpOwogCQlpZiAoc2NfYWRhcHRlcltjaW5zdF0tPmNoYW5uZWwgPT0gTlVMTCkgewogCQkJLyoKIAkJCSAqIE9vcHMsIGNhbid0IGFsbG9jIG1lbW9yeSBmb3IgdGhlIGNoYW5uZWxzCkBAIC0zMzYsNyArMzM0LDYgQEAKIAkJCWtmcmVlKHNjX2FkYXB0ZXJbY2luc3RdKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCW1lbXNldChzY19hZGFwdGVyW2NpbnN0XS0+Y2hhbm5lbCwgMCwgc2l6ZW9mKGJjaGFuKSAqIGNoYW5uZWxzKTsKIAogCQkvKgogCQkgKiBMb2NrIGRvd24gdGhlIGhhcmR3YXJlIHJlc291cmNlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0vS2NvbmZpZyBiL2RyaXZlcnMva3ZtL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzY2M4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMva3ZtL0tjb25maWcKQEAgLTAsMCArMSwzNyBAQAorIworIyBLVk0gY29uZmlndXJhdGlvbgorIworbWVudSAiVmlydHVhbGl6YXRpb24iCisKK2NvbmZpZyBLVk0KKwl0cmlzdGF0ZSAiS2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSAoS1ZNKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2ICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgaG9zdGluZyBmdWxseSB2aXJ0dWFsaXplZCBndWVzdCBtYWNoaW5lcyB1c2luZyBoYXJkd2FyZQorCSAgdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9ucy4gIFlvdSB3aWxsIG5lZWQgYSBmYWlybHkgcmVjZW50CisJICBwcm9jZXNzb3IgZXF1aXBwZWQgd2l0aCB2aXJ0dWFsaXphdGlvbiBleHRlbnNpb25zLiBZb3Ugd2lsbCBhbHNvCisJICBuZWVkIHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBvZiB0aGUgcHJvY2Vzc29yIG1vZHVsZXMgYmVsb3cuCisKKwkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaGFyZHdhcmUgY2FwYWJpbGl0aWVzIHRocm91Z2gKKwkgIGEgY2hhcmFjdGVyIGRldmljZSBub2RlIG5hbWVkIC9kZXYva3ZtLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGt2bS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEtWTV9JTlRFTAorCXRyaXN0YXRlICJLVk0gZm9yIEludGVsIHByb2Nlc3NvcnMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEtWTQorCS0tLWhlbHAtLS0KKwkgIFByb3ZpZGVzIHN1cHBvcnQgZm9yIEtWTSBvbiBJbnRlbCBwcm9jZXNzb3JzIGVxdWlwcGVkIHdpdGggdGhlIFZUCisJICBleHRlbnNpb25zLgorCitjb25maWcgS1ZNX0FNRAorCXRyaXN0YXRlICJLVk0gZm9yIEFNRCBwcm9jZXNzb3JzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBLVk0KKwktLS1oZWxwLS0tCisJICBQcm92aWRlcyBzdXBwb3J0IGZvciBLVk0gb24gQU1EIHByb2Nlc3NvcnMgZXF1aXBwZWQgd2l0aCB0aGUgQU1ELVYKKwkgIChTVk0pIGV4dGVuc2lvbnMuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMva3ZtL01ha2VmaWxlIGIvZHJpdmVycy9rdm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhNzg5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMva3ZtL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEtlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgbW9kdWxlCisjCisKK2t2bS1vYmpzIDo9IGt2bV9tYWluLm8gbW11Lm8geDg2X2VtdWxhdGUubworb2JqLSQoQ09ORklHX0tWTSkgKz0ga3ZtLm8KK2t2bS1pbnRlbC1vYmpzID0gdm14Lm8KK29iai0kKENPTkZJR19LVk1fSU5URUwpICs9IGt2bS1pbnRlbC5vCitrdm0tYW1kLW9ianMgPSBzdm0ubworb2JqLSQoQ09ORklHX0tWTV9BTUQpICs9IGt2bS1hbWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0va3ZtLmggYi9kcml2ZXJzL2t2bS9rdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBlMDRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9rdm0va3ZtLmgKQEAgLTAsMCArMSw1NTEgQEAKKyNpZm5kZWYgX19LVk1fSAorI2RlZmluZSBfX0tWTV9ICisKKy8qCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKKyAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSAidm14LmgiCisjaW5jbHVkZSA8bGludXgva3ZtLmg+CisKKyNkZWZpbmUgQ1IwX1BFX01BU0sgKDFVTEwgPDwgMCkKKyNkZWZpbmUgQ1IwX1RTX01BU0sgKDFVTEwgPDwgMykKKyNkZWZpbmUgQ1IwX05FX01BU0sgKDFVTEwgPDwgNSkKKyNkZWZpbmUgQ1IwX1dQX01BU0sgKDFVTEwgPDwgMTYpCisjZGVmaW5lIENSMF9OV19NQVNLICgxVUxMIDw8IDI5KQorI2RlZmluZSBDUjBfQ0RfTUFTSyAoMVVMTCA8PCAzMCkKKyNkZWZpbmUgQ1IwX1BHX01BU0sgKDFVTEwgPDwgMzEpCisKKyNkZWZpbmUgQ1IzX1dQVF9NQVNLICgxVUxMIDw8IDMpCisjZGVmaW5lIENSM19QQ0RfTUFTSyAoMVVMTCA8PCA0KQorCisjZGVmaW5lIENSM19SRVNFVkVEX0JJVFMgMHgwN1VMTAorI2RlZmluZSBDUjNfTF9NT0RFX1JFU0VWRURfQklUUyAofigoMVVMTCA8PCA0MCkgLSAxKSB8IDB4MGZlN1VMTCkKKyNkZWZpbmUgQ1IzX0ZMQUdTX01BU0sgKCgxVUxMIDw8IDUpIC0gMSkKKworI2RlZmluZSBDUjRfVk1FX01BU0sgKDFVTEwgPDwgMCkKKyNkZWZpbmUgQ1I0X1BTRV9NQVNLICgxVUxMIDw8IDQpCisjZGVmaW5lIENSNF9QQUVfTUFTSyAoMVVMTCA8PCA1KQorI2RlZmluZSBDUjRfUEdFX01BU0sgKDFVTEwgPDwgNykKKyNkZWZpbmUgQ1I0X1ZNWEVfTUFTSyAoMVVMTCA8PCAxMykKKworI2RlZmluZSBLVk1fR1VFU1RfQ1IwX01BU0sgXAorCShDUjBfUEdfTUFTSyB8IENSMF9QRV9NQVNLIHwgQ1IwX1dQX01BU0sgfCBDUjBfTkVfTUFTSyBcCisJIHwgQ1IwX05XX01BU0sgfCBDUjBfQ0RfTUFTSykKKyNkZWZpbmUgS1ZNX1ZNX0NSMF9BTFdBWVNfT04gXAorCShDUjBfUEdfTUFTSyB8IENSMF9QRV9NQVNLIHwgQ1IwX1dQX01BU0sgfCBDUjBfTkVfTUFTSykKKyNkZWZpbmUgS1ZNX0dVRVNUX0NSNF9NQVNLIFwKKwkoQ1I0X1BTRV9NQVNLIHwgQ1I0X1BBRV9NQVNLIHwgQ1I0X1BHRV9NQVNLIHwgQ1I0X1ZNWEVfTUFTSyB8IENSNF9WTUVfTUFTSykKKyNkZWZpbmUgS1ZNX1BNT0RFX1ZNX0NSNF9BTFdBWVNfT04gKENSNF9WTVhFX01BU0sgfCBDUjRfUEFFX01BU0spCisjZGVmaW5lIEtWTV9STU9ERV9WTV9DUjRfQUxXQVlTX09OIChDUjRfVk1YRV9NQVNLIHwgQ1I0X1BBRV9NQVNLIHwgQ1I0X1ZNRV9NQVNLKQorCisjZGVmaW5lIElOVkFMSURfUEFHRSAofihocGFfdCkwKQorI2RlZmluZSBVTk1BUFBFRF9HVkEgKH4oZ3BhX3QpMCkKKworI2RlZmluZSBLVk1fTUFYX1ZDUFVTIDEKKyNkZWZpbmUgS1ZNX01FTU9SWV9TTE9UUyA0CisjZGVmaW5lIEtWTV9OVU1fTU1VX1BBR0VTIDI1NgorCisjZGVmaW5lIEZYX0lNQUdFX1NJWkUgNTEyCisjZGVmaW5lIEZYX0lNQUdFX0FMSUdOIDE2CisjZGVmaW5lIEZYX0JVRl9TSVpFICgyICogRlhfSU1BR0VfU0laRSArIEZYX0lNQUdFX0FMSUdOKQorCisjZGVmaW5lIERFX1ZFQ1RPUiAwCisjZGVmaW5lIERGX1ZFQ1RPUiA4CisjZGVmaW5lIFRTX1ZFQ1RPUiAxMAorI2RlZmluZSBOUF9WRUNUT1IgMTEKKyNkZWZpbmUgU1NfVkVDVE9SIDEyCisjZGVmaW5lIEdQX1ZFQ1RPUiAxMworI2RlZmluZSBQRl9WRUNUT1IgMTQKKworI2RlZmluZSBTRUxFQ1RPUl9USV9NQVNLICgxIDw8IDIpCisjZGVmaW5lIFNFTEVDVE9SX1JQTF9NQVNLIDB4MDMKKworI2RlZmluZSBJT1BMX1NISUZUIDEyCisKKy8qCisgKiBBZGRyZXNzIHR5cGVzOgorICoKKyAqICBndmEgLSBndWVzdCB2aXJ0dWFsIGFkZHJlc3MKKyAqICBncGEgLSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzCisgKiAgZ2ZuIC0gZ3Vlc3QgZnJhbWUgbnVtYmVyCisgKiAgaHZhIC0gaG9zdCB2aXJ0dWFsIGFkZHJlc3MKKyAqICBocGEgLSBob3N0IHBoeXNpY2FsIGFkZHJlc3MKKyAqICBoZm4gLSBob3N0IGZyYW1lIG51bWJlcgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgZ3ZhX3Q7Cit0eXBlZGVmIHU2NCAgICAgICAgICAgIGdwYV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBnZm5fdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBodmFfdDsKK3R5cGVkZWYgdTY0ICAgICAgICAgICAgaHBhX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIGhmbl90OworCitzdHJ1Y3Qga3ZtX21tdV9wYWdlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJaHBhX3QgcGFnZV9ocGE7CisJdW5zaWduZWQgbG9uZyBzbG90X2JpdG1hcDsgLyogT25lIGJpdCBzZXQgcGVyIHNsb3Qgd2hpY2ggaGFzIG1lbW9yeQorCQkJCSAgICAqIGluIHRoaXMgc2hhZG93IHBhZ2UuCisJCQkJICAgICovCisJaW50IGdsb2JhbDsgICAgICAgICAgICAgIC8qIFNldCBpZiBhbGwgcHRlcyBpbiB0aGlzIHBhZ2UgYXJlIGdsb2JhbCAqLworCXU2NCAqcGFyZW50X3B0ZTsKK307CisKK3N0cnVjdCB2bWNzIHsKKwl1MzIgcmV2aXNpb25faWQ7CisJdTMyIGFib3J0OworCWNoYXIgZGF0YVswXTsKK307CisKKyNkZWZpbmUgdm14X21zcl9lbnRyeSBrdm1fbXNyX2VudHJ5CisKK3N0cnVjdCBrdm1fdmNwdTsKKworLyoKKyAqIHg4NiBzdXBwb3J0cyAzIHBhZ2luZyBtb2RlcyAoNC1sZXZlbCA2NC1iaXQsIDMtbGV2ZWwgNjQtYml0LCBhbmQgMi1sZXZlbAorICogMzItYml0KS4gIFRoZSBrdm1fbW11IHN0cnVjdHVyZSBhYnN0cmFjdHMgdGhlIGRldGFpbHMgb2YgdGhlIGN1cnJlbnQgbW11CisgKiBtb2RlLgorICovCitzdHJ1Y3Qga3ZtX21tdSB7CisJdm9pZCAoKm5ld19jcjMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJaW50ICgqcGFnZV9mYXVsdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIHUzMiBlcnIpOworCXZvaWQgKCppbnZhbF9wYWdlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSk7CisJdm9pZCAoKmZyZWUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJZ3BhX3QgKCpndmFfdG9fZ3BhKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSk7CisJaHBhX3Qgcm9vdF9ocGE7CisJaW50IHJvb3RfbGV2ZWw7CisJaW50IHNoYWRvd19yb290X2xldmVsOworfTsKKworc3RydWN0IGt2bV9ndWVzdF9kZWJ1ZyB7CisJaW50IGVuYWJsZWQ7CisJdW5zaWduZWQgbG9uZyBicFs0XTsKKwlpbnQgc2luZ2xlc3RlcDsKK307CisKK2VudW0geworCVZDUFVfUkVHU19SQVggPSAwLAorCVZDUFVfUkVHU19SQ1ggPSAxLAorCVZDUFVfUkVHU19SRFggPSAyLAorCVZDUFVfUkVHU19SQlggPSAzLAorCVZDUFVfUkVHU19SU1AgPSA0LAorCVZDUFVfUkVHU19SQlAgPSA1LAorCVZDUFVfUkVHU19SU0kgPSA2LAorCVZDUFVfUkVHU19SREkgPSA3LAorI2lmZGVmIENPTkZJR19YODZfNjQKKwlWQ1BVX1JFR1NfUjggPSA4LAorCVZDUFVfUkVHU19SOSA9IDksCisJVkNQVV9SRUdTX1IxMCA9IDEwLAorCVZDUFVfUkVHU19SMTEgPSAxMSwKKwlWQ1BVX1JFR1NfUjEyID0gMTIsCisJVkNQVV9SRUdTX1IxMyA9IDEzLAorCVZDUFVfUkVHU19SMTQgPSAxNCwKKwlWQ1BVX1JFR1NfUjE1ID0gMTUsCisjZW5kaWYKKwlOUl9WQ1BVX1JFR1MKK307CisKK2VudW0geworCVZDUFVfU1JFR19DUywKKwlWQ1BVX1NSRUdfRFMsCisJVkNQVV9TUkVHX0VTLAorCVZDUFVfU1JFR19GUywKKwlWQ1BVX1NSRUdfR1MsCisJVkNQVV9TUkVHX1NTLAorCVZDUFVfU1JFR19UUiwKKwlWQ1BVX1NSRUdfTERUUiwKK307CisKK3N0cnVjdCBrdm1fdmNwdSB7CisJc3RydWN0IGt2bSAqa3ZtOworCXVuaW9uIHsKKwkJc3RydWN0IHZtY3MgKnZtY3M7CisJCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtOworCX07CisJc3RydWN0IG11dGV4IG11dGV4OworCWludCAgIGNwdTsKKwlpbnQgICBsYXVuY2hlZDsKKwl1bnNpZ25lZCBsb25nIGlycV9zdW1tYXJ5OyAvKiBiaXQgdmVjdG9yOiAxIHBlciB3b3JkIGluIGlycV9wZW5kaW5nICovCisjZGVmaW5lIE5SX0lSUV9XT1JEUyBLVk1fSVJRX0JJVE1BUF9TSVpFKHVuc2lnbmVkIGxvbmcpCisJdW5zaWduZWQgbG9uZyBpcnFfcGVuZGluZ1tOUl9JUlFfV09SRFNdOworCXVuc2lnbmVkIGxvbmcgcmVnc1tOUl9WQ1BVX1JFR1NdOyAvKiBmb3IgcnNwOiB2Y3B1X2xvYWRfcnNwX3JpcCgpICovCisJdW5zaWduZWQgbG9uZyByaXA7ICAgICAgLyogbmVlZHMgdmNwdV9sb2FkX3JzcF9yaXAoKSAqLworCisJdW5zaWduZWQgbG9uZyBjcjA7CisJdW5zaWduZWQgbG9uZyBjcjI7CisJdW5zaWduZWQgbG9uZyBjcjM7CisJdW5zaWduZWQgbG9uZyBjcjQ7CisJdW5zaWduZWQgbG9uZyBjcjg7CisJdTY0IHNoYWRvd19lZmVyOworCXU2NCBhcGljX2Jhc2U7CisJaW50IG5tc3JzOworCXN0cnVjdCB2bXhfbXNyX2VudHJ5ICpndWVzdF9tc3JzOworCXN0cnVjdCB2bXhfbXNyX2VudHJ5ICpob3N0X21zcnM7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfcGFnZXM7CisJc3RydWN0IGt2bV9tbXVfcGFnZSBwYWdlX2hlYWRlcl9idWZbS1ZNX05VTV9NTVVfUEFHRVNdOworCXN0cnVjdCBrdm1fbW11IG1tdTsKKworCXN0cnVjdCBrdm1fZ3Vlc3RfZGVidWcgZ3Vlc3RfZGVidWc7CisKKwljaGFyIGZ4X2J1ZltGWF9CVUZfU0laRV07CisJY2hhciAqaG9zdF9meF9pbWFnZTsKKwljaGFyICpndWVzdF9meF9pbWFnZTsKKworCWludCBtbWlvX25lZWRlZDsKKwlpbnQgbW1pb19yZWFkX2NvbXBsZXRlZDsKKwlpbnQgbW1pb19pc193cml0ZTsKKwlpbnQgbW1pb19zaXplOworCXVuc2lnbmVkIGNoYXIgbW1pb19kYXRhWzhdOworCWdwYV90IG1taW9fcGh5c19hZGRyOworCisJc3RydWN0IHsKKwkJaW50IGFjdGl2ZTsKKwkJdTggc2F2ZV9pb3BsOworCQlzdHJ1Y3Qga3ZtX3NhdmVfc2VnbWVudCB7CisJCQl1MTYgc2VsZWN0b3I7CisJCQl1bnNpZ25lZCBsb25nIGJhc2U7CisJCQl1MzIgbGltaXQ7CisJCQl1MzIgYXI7CisJCX0gdHIsIGVzLCBkcywgZnMsIGdzOworCX0gcm1vZGU7Cit9OworCitzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90IHsKKwlnZm5fdCBiYXNlX2dmbjsKKwl1bnNpZ25lZCBsb25nIG5wYWdlczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwYWdlICoqcGh5c19tZW07CisJdW5zaWduZWQgbG9uZyAqZGlydHlfYml0bWFwOworfTsKKworc3RydWN0IGt2bSB7CisJc3BpbmxvY2tfdCBsb2NrOyAvKiBwcm90ZWN0cyBldmVyeXRoaW5nIGV4Y2VwdCB2Y3B1cyAqLworCWludCBubWVtc2xvdHM7CisJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCBtZW1zbG90c1tLVk1fTUVNT1JZX1NMT1RTXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9tbXVfcGFnZXM7CisJc3RydWN0IGt2bV92Y3B1IHZjcHVzW0tWTV9NQVhfVkNQVVNdOworCWludCBtZW1vcnlfY29uZmlnX3ZlcnNpb247CisJaW50IGJ1c3k7Cit9OworCitzdHJ1Y3Qga3ZtX3N0YXQgeworCXUzMiBwZl9maXhlZDsKKwl1MzIgcGZfZ3Vlc3Q7CisJdTMyIHRsYl9mbHVzaDsKKwl1MzIgaW52bHBnOworCisJdTMyIGV4aXRzOworCXUzMiBpb19leGl0czsKKwl1MzIgbW1pb19leGl0czsKKwl1MzIgc2lnbmFsX2V4aXRzOworCXUzMiBpcnFfZXhpdHM7Cit9OworCitzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSB7CisJdTE2IGxpbWl0OworCXVuc2lnbmVkIGxvbmcgYmFzZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBrdm1fYXJjaF9vcHMgeworCWludCAoKmNwdV9oYXNfa3ZtX3N1cHBvcnQpKHZvaWQpOyAgICAgICAgICAvKiBfX2luaXQgKi8KKwlpbnQgKCpkaXNhYmxlZF9ieV9iaW9zKSh2b2lkKTsgICAgICAgICAgICAgLyogX19pbml0ICovCisJdm9pZCAoKmhhcmR3YXJlX2VuYWJsZSkodm9pZCAqZHVtbXkpOyAgICAgIC8qIF9faW5pdCAqLworCXZvaWQgKCpoYXJkd2FyZV9kaXNhYmxlKSh2b2lkICpkdW1teSk7CisJaW50ICgqaGFyZHdhcmVfc2V0dXApKHZvaWQpOyAgICAgICAgICAgICAgIC8qIF9faW5pdCAqLworCXZvaWQgKCpoYXJkd2FyZV91bnNldHVwKSh2b2lkKTsgICAgICAgICAgICAvKiBfX2V4aXQgKi8KKworCWludCAoKnZjcHVfY3JlYXRlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCXZvaWQgKCp2Y3B1X2ZyZWUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKigqdmNwdV9sb2FkKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCXZvaWQgKCp2Y3B1X3B1dCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKworCWludCAoKnNldF9ndWVzdF9kZWJ1Zykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgICAgIHN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QgKmRiZyk7CisJaW50ICgqZ2V0X21zcikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgbXNyX2luZGV4LCB1NjQgKnBkYXRhKTsKKwlpbnQgKCpzZXRfbXNyKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBtc3JfaW5kZXgsIHU2NCBkYXRhKTsKKwl1NjQgKCpnZXRfc2VnbWVudF9iYXNlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBzZWcpOworCXZvaWQgKCpnZXRfc2VnbWVudCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgIHN0cnVjdCBrdm1fc2VnbWVudCAqdmFyLCBpbnQgc2VnKTsKKwl2b2lkICgqc2V0X3NlZ21lbnQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICBzdHJ1Y3Qga3ZtX3NlZ21lbnQgKnZhciwgaW50IHNlZyk7CisJaW50ICgqaXNfbG9uZ19tb2RlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCXZvaWQgKCpnZXRfY3NfZGJfbF9iaXRzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCAqZGIsIGludCAqbCk7CisJdm9pZCAoKnNldF9jcjApKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjApOworCXZvaWQgKCpzZXRfY3IwX25vX21vZGVzd2l0Y2gpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGNyMCk7CisJdm9pZCAoKnNldF9jcjMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjMpOworCXZvaWQgKCpzZXRfY3I0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KTsKKwl2b2lkICgqc2V0X2VmZXIpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGVmZXIpOworCXZvaWQgKCpnZXRfaWR0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlICpkdCk7CisJdm9pZCAoKnNldF9pZHQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGRlc2NyaXB0b3JfdGFibGUgKmR0KTsKKwl2b2lkICgqZ2V0X2dkdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSAqZHQpOworCXZvaWQgKCpzZXRfZ2R0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlICpkdCk7CisJdW5zaWduZWQgbG9uZyAoKmdldF9kcikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgZHIpOworCXZvaWQgKCpzZXRfZHIpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGRyLCB1bnNpZ25lZCBsb25nIHZhbHVlLAorCQkgICAgICAgaW50ICpleGNlcHRpb24pOworCXZvaWQgKCpjYWNoZV9yZWdzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCXZvaWQgKCpkZWNhY2hlX3JlZ3MpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJdW5zaWduZWQgbG9uZyAoKmdldF9yZmxhZ3MpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJdm9pZCAoKnNldF9yZmxhZ3MpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyByZmxhZ3MpOworCisJdm9pZCAoKmludmxwZykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyKTsKKwl2b2lkICgqdGxiX2ZsdXNoKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCXZvaWQgKCppbmplY3RfcGFnZV9mYXVsdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLCB1MzIgZXJyX2NvZGUpOworCisJdm9pZCAoKmluamVjdF9ncCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBlcnJfY29kZSk7CisKKwlpbnQgKCpydW4pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bik7CisJaW50ICgqdmNwdV9zZXR1cCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwl2b2lkICgqc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK307CisKK2V4dGVybiBzdHJ1Y3Qga3ZtX3N0YXQga3ZtX3N0YXQ7CitleHRlcm4gc3RydWN0IGt2bV9hcmNoX29wcyAqa3ZtX2FyY2hfb3BzOworCisjZGVmaW5lIGt2bV9wcmludGYoa3ZtLCBmbXQgLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmbXQpCisjZGVmaW5lIHZjcHVfcHJpbnRmKHZjcHUsIGZtdC4uLikga3ZtX3ByaW50Zih2Y3B1LT5rdm0sIGZtdCkKKworaW50IGt2bV9pbml0X2FyY2goc3RydWN0IGt2bV9hcmNoX29wcyAqb3BzLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOwordm9pZCBrdm1fZXhpdF9hcmNoKHZvaWQpOworCit2b2lkIGt2bV9tbXVfZGVzdHJveShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworaW50IGt2bV9tbXVfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCitpbnQga3ZtX21tdV9yZXNldF9jb250ZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cit2b2lkIGt2bV9tbXVfc2xvdF9yZW1vdmVfd3JpdGVfYWNjZXNzKHN0cnVjdCBrdm0gKmt2bSwgaW50IHNsb3QpOworCitocGFfdCBncGFfdG9faHBhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhKTsKKyNkZWZpbmUgSFBBX01TQiAoKHNpemVvZihocGFfdCkgKiA4KSAtIDEpCisjZGVmaW5lIEhQQV9FUlJfTUFTSyAoKGhwYV90KTEgPDwgSFBBX01TQikKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2Vycm9yX2hwYShocGFfdCBocGEpIHsgcmV0dXJuIGhwYSA+PiBIUEFfTVNCOyB9CitocGFfdCBndmFfdG9faHBhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhKTsKKwordm9pZCBrdm1fZW11bGF0b3Jfd2FudF9ncm91cDdfaW52bHBnKHZvaWQpOworCitleHRlcm4gaHBhX3QgYmFkX3BhZ2VfYWRkcmVzczsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqZ2ZuX3RvX3BhZ2Uoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwgZ2ZuX3QgZ2ZuKQoreworCXJldHVybiBzbG90LT5waHlzX21lbVtnZm4gLSBzbG90LT5iYXNlX2dmbl07Cit9CisKK3N0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmdmbl90b19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKTsKK3ZvaWQgbWFya19wYWdlX2RpcnR5KHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKTsKKworZW51bSBlbXVsYXRpb25fcmVzdWx0IHsKKwlFTVVMQVRFX0RPTkUsICAgICAgIC8qIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyAqLworCUVNVUxBVEVfRE9fTU1JTywgICAgICAvKiBrdm1fcnVuIGZpbGxlZCB3aXRoIG1taW8gcmVxdWVzdCAqLworCUVNVUxBVEVfRkFJTCwgICAgICAgICAvKiBjYW4ndCBlbXVsYXRlIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KK307CisKK2ludCBlbXVsYXRlX2luc3RydWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1biwKKwkJCXVuc2lnbmVkIGxvbmcgY3IyLCB1MTYgZXJyb3JfY29kZSk7Cit2b2lkIHJlYWxtb2RlX2xnZHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MTYgc2l6ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKK3ZvaWQgcmVhbG1vZGVfbGlkdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUxNiBzaXplLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwordm9pZCByZWFsbW9kZV9sbXN3KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBtc3csCisJCSAgIHVuc2lnbmVkIGxvbmcgKnJmbGFncyk7CisKK3Vuc2lnbmVkIGxvbmcgcmVhbG1vZGVfZ2V0X2NyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGNyKTsKK3ZvaWQgcmVhbG1vZGVfc2V0X2NyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGNyLCB1bnNpZ25lZCBsb25nIHZhbHVlLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgKnJmbGFncyk7CisKK3N0cnVjdCB4ODZfZW11bGF0ZV9jdHh0OworCitpbnQgZW11bGF0ZV9pbnZscGcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyZXNzKTsKK2ludCBlbXVsYXRlX2NsdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2ludCBlbXVsYXRvcl9nZXRfZHIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQqIGN0eHQsIGludCBkciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgKmRlc3QpOworaW50IGVtdWxhdG9yX3NldF9kcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IGRyLAorCQkgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CisKK3ZvaWQgc2V0X2NyMChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IwKTsKK3ZvaWQgc2V0X2NyMyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IwKTsKK3ZvaWQgc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IwKTsKK3ZvaWQgc2V0X2NyOChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IwKTsKK3ZvaWQgbG1zdyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgbXN3KTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKK3ZvaWQgc2V0X2VmZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZWZlcik7CisjZW5kaWYKKwordm9pZCBmeF9pbml0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisKK3ZvaWQgbG9hZF9tc3JzKHN0cnVjdCB2bXhfbXNyX2VudHJ5ICplLCBpbnQgbik7Cit2b2lkIHNhdmVfbXNycyhzdHJ1Y3Qgdm14X21zcl9lbnRyeSAqZSwgaW50IG4pOwordm9pZCBrdm1fcmVzY2hlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCitpbnQga3ZtX3JlYWRfZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCSAgICAgICBndmFfdCBhZGRyLAorCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJICAgICAgIHZvaWQgKmRlc3QpOworCitpbnQga3ZtX3dyaXRlX2d1ZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJZ3ZhX3QgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBzaXplLAorCQl2b2lkICpkYXRhKTsKKwordW5zaWduZWQgbG9uZyBzZWdtZW50X2Jhc2UodTE2IHNlbGVjdG9yKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqX2dmbl90b19wYWdlKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQoreworCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdmbik7CisJcmV0dXJuIChzbG90KSA/IHNsb3QtPnBoeXNfbWVtW2dmbiAtIHNsb3QtPmJhc2VfZ2ZuXSA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3BhZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZjcHUtPmNyNCAmIENSNF9QQUVfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfcHNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+Y3I0ICYgQ1I0X1BTRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19wYWdpbmcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiB2Y3B1LT5jcjAgJiBDUjBfUEdfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWVtc2xvdF9pZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QpCit7CisJcmV0dXJuIHNsb3QgLSBrdm0tPm1lbXNsb3RzOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnBhZ2VfaGVhZGVyKGhwYV90IHNoYWRvd19wYWdlKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2Uoc2hhZG93X3BhZ2UgPj4gUEFHRV9TSElGVCk7CisKKwlyZXR1cm4gKHN0cnVjdCBrdm1fbW11X3BhZ2UgKilwYWdlLT5wcml2YXRlOworfQorCitzdGF0aWMgaW5saW5lIHUxNiByZWFkX2ZzKHZvaWQpCit7CisJdTE2IHNlZzsKKwlhc20gKCJtb3YgJSVmcywgJTAiIDogIj1nIihzZWcpKTsKKwlyZXR1cm4gc2VnOworfQorCitzdGF0aWMgaW5saW5lIHUxNiByZWFkX2dzKHZvaWQpCit7CisJdTE2IHNlZzsKKwlhc20gKCJtb3YgJSVncywgJTAiIDogIj1nIihzZWcpKTsKKwlyZXR1cm4gc2VnOworfQorCitzdGF0aWMgaW5saW5lIHUxNiByZWFkX2xkdCh2b2lkKQoreworCXUxNiBsZHQ7CisJYXNtICgic2xkdCAlMCIgOiAiPWciKGxkdCkpOworCXJldHVybiBsZHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX2ZzKHUxNiBzZWwpCit7CisJYXNtICgibW92ICUwLCAlJWZzIiA6IDogInJtIihzZWwpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvYWRfZ3ModTE2IHNlbCkKK3sKKwlhc20gKCJtb3YgJTAsICUlZ3MiIDogOiAicm0iKHNlbCkpOworfQorCisjaWZuZGVmIGxvYWRfbGR0CitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9sZHQodTE2IHNlbCkKK3sKKwlhc20gKCJsbGR0ICUwIiA6IDogImciKHNlbCkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfaWR0KHN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlICp0YWJsZSkKK3sKKwlhc20gKCJzaWR0ICUwIiA6ICI9bSIoKnRhYmxlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfZ2R0KHN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlICp0YWJsZSkKK3sKKwlhc20gKCJzZ2R0ICUwIiA6ICI9bSIoKnRhYmxlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX3RyX2Jhc2Uodm9pZCkKK3sKKwl1MTYgdHI7CisJYXNtICgic3RyICUwIiA6ICI9ZyIodHIpKTsKKwlyZXR1cm4gc2VnbWVudF9iYXNlKHRyKTsKK30KKworI2lmZGVmIENPTkZJR19YODZfNjQKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX21zcih1bnNpZ25lZCBsb25nIG1zcikKK3sKKwl1NjQgdmFsdWU7CisKKwlyZG1zcmwobXNyLCB2YWx1ZSk7CisJcmV0dXJuIHZhbHVlOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmeF9zYXZlKHZvaWQgKmltYWdlKQoreworCWFzbSAoImZ4c2F2ZSAoJTApIjo6ICJyIiAoaW1hZ2UpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZ4X3Jlc3RvcmUodm9pZCAqaW1hZ2UpCit7CisJYXNtICgiZnhyc3RvciAoJTApIjo6ICJyIiAoaW1hZ2UpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZwdV9pbml0KHZvaWQpCit7CisJYXNtICgiZmluaXQiKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0X3JkeF9pbml0X3ZhbCh2b2lkKQoreworCXJldHVybiAweDYwMDsgLyogUDYgZmFtaWx5ICovCit9CisKKyNkZWZpbmUgQVNNX1ZNWF9WTUNMRUFSX1JBWCAgICAgICAiLmJ5dGUgMHg2NiwgMHgwZiwgMHhjNywgMHgzMCIKKyNkZWZpbmUgQVNNX1ZNWF9WTUxBVU5DSCAgICAgICAgICAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhjMiIKKyNkZWZpbmUgQVNNX1ZNWF9WTVJFU1VNRSAgICAgICAgICAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhjMyIKKyNkZWZpbmUgQVNNX1ZNWF9WTVBUUkxEX1JBWCAgICAgICAiLmJ5dGUgMHgwZiwgMHhjNywgMHgzMCIKKyNkZWZpbmUgQVNNX1ZNWF9WTVJFQURfUkRYX1JBWCAgICAiLmJ5dGUgMHgwZiwgMHg3OCwgMHhkMCIKKyNkZWZpbmUgQVNNX1ZNWF9WTVdSSVRFX1JBWF9SRFggICAiLmJ5dGUgMHgwZiwgMHg3OSwgMHhkMCIKKyNkZWZpbmUgQVNNX1ZNWF9WTVdSSVRFX1JTUF9SRFggICAiLmJ5dGUgMHgwZiwgMHg3OSwgMHhkNCIKKyNkZWZpbmUgQVNNX1ZNWF9WTVhPRkYgICAgICAgICAgICAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhjNCIKKyNkZWZpbmUgQVNNX1ZNWF9WTVhPTl9SQVggICAgICAgICAiLmJ5dGUgMHhmMywgMHgwZiwgMHhjNywgMHgzMCIKKworI2RlZmluZSBNU1JfSUEzMl9USU1FX1NUQU1QX0NPVU5URVIJCTB4MDEwCisKKyNkZWZpbmUgVFNTX0lPUEJfQkFTRV9PRkZTRVQgMHg2NgorI2RlZmluZSBUU1NfQkFTRV9TSVpFIDB4NjgKKyNkZWZpbmUgVFNTX0lPUEJfU0laRSAoNjU1MzYgLyA4KQorI2RlZmluZSBUU1NfUkVESVJFQ1RJT05fU0laRSAoMjU2IC8gOCkKKyNkZWZpbmUgUk1PREVfVFNTX1NJWkUgKFRTU19CQVNFX1NJWkUgKyBUU1NfUkVESVJFQ1RJT05fU0laRSArIFRTU19JT1BCX1NJWkUgKyAxKQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCisvKgorICogV2hlbiBlbXVsYXRpbmcgMzItYml0IG1vZGUsIGNyMyBpcyBvbmx5IDMyIGJpdHMgZXZlbiBvbiB4ODZfNjQuICBUaGVyZWZvcmUKKyAqIHdlIG5lZWQgdG8gYWxsb2NhdGUgc2hhZG93IHBhZ2UgdGFibGVzIGluIHRoZSBmaXJzdCA0R0Igb2YgbWVtb3J5LCB3aGljaAorICogaGFwcGVucyB0byBmaXQgdGhlIERNQTMyIHpvbmUuCisgKi8KKyNkZWZpbmUgR0ZQX0tWTV9NTVUgKEdGUF9LRVJORUwgfCBfX0dGUF9ETUEzMikKKworI2Vsc2UKKworI2RlZmluZSBHRlBfS1ZNX01NVSBHRlBfS0VSTkVMCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMva3ZtL2t2bV9tYWluLmMgYi9kcml2ZXJzL2t2bS9rdm1fbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMWJiODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2t2bS9rdm1fbWFpbi5jCkBAIC0wLDAgKzEsMTkxNyBAQAorLyoKKyAqIEtlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIFRoaXMgbW9kdWxlIGVuYWJsZXMgbWFjaGluZXMgd2l0aCBJbnRlbCBWVC14IGV4dGVuc2lvbnMgdG8gcnVuIHZpcnR1YWwKKyAqIG1hY2hpbmVzIHdpdGhvdXQgZW11bGF0aW9uIG9yIGJpbmFyeSB0cmFuc2xhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUXVtcmFuZXQsIEluYy4KKyAqCisgKiBBdXRob3JzOgorICogICBBdmkgS2l2aXR5ICAgPGF2aUBxdW1yYW5ldC5jb20+CisgKiAgIFlhbml2IEthbWF5ICA8eWFuaXZAcXVtcmFuZXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2luY2x1ZGUgImt2bS5oIgorCisjaW5jbHVkZSA8bGludXgva3ZtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKKyNpbmNsdWRlICJ4ODZfZW11bGF0ZS5oIgorI2luY2x1ZGUgInNlZ21lbnRfZGVzY3JpcHRvci5oIgorCitNT0RVTEVfQVVUSE9SKCJRdW1yYW5ldCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3Qga3ZtX2FyY2hfb3BzICprdm1fYXJjaF9vcHM7CitzdHJ1Y3Qga3ZtX3N0YXQga3ZtX3N0YXQ7CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fc3RhdCk7CisKK3N0YXRpYyBzdHJ1Y3Qga3ZtX3N0YXRzX2RlYnVnZnNfaXRlbSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MzIgKmRhdGE7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworfSBkZWJ1Z2ZzX2VudHJpZXNbXSA9IHsKKwl7ICJwZl9maXhlZCIsICZrdm1fc3RhdC5wZl9maXhlZCB9LAorCXsgInBmX2d1ZXN0IiwgJmt2bV9zdGF0LnBmX2d1ZXN0IH0sCisJeyAidGxiX2ZsdXNoIiwgJmt2bV9zdGF0LnRsYl9mbHVzaCB9LAorCXsgImludmxwZyIsICZrdm1fc3RhdC5pbnZscGcgfSwKKwl7ICJleGl0cyIsICZrdm1fc3RhdC5leGl0cyB9LAorCXsgImlvX2V4aXRzIiwgJmt2bV9zdGF0LmlvX2V4aXRzIH0sCisJeyAibW1pb19leGl0cyIsICZrdm1fc3RhdC5tbWlvX2V4aXRzIH0sCisJeyAic2lnbmFsX2V4aXRzIiwgJmt2bV9zdGF0LnNpZ25hbF9leGl0cyB9LAorCXsgImlycV9leGl0cyIsICZrdm1fc3RhdC5pcnFfZXhpdHMgfSwKKwl7IDAsIDAgfQorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOworCisjZGVmaW5lIE1BWF9JT19NU1JTIDI1NgorCisjZGVmaW5lIENSMF9SRVNFVkVEX0JJVFMgMHhmZmZmZmZmZjFmZmFmZmMwVUxMCisjZGVmaW5lIExNU1dfR1VFU1RfTUFTSyAweDBlVUxMCisjZGVmaW5lIENSNF9SRVNFVkVEX0JJVFMgKH4oKDFVTEwgPDwgMTEpIC0gMSkpCisjZGVmaW5lIENSOF9SRVNFVkVEX0JJVFMgKH4weDBmVUxMKQorI2RlZmluZSBFRkVSX1JFU0VSVkVEX0JJVFMgMHhmZmZmZmZmZmZmZmZmMmZlCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisvLyBMRFQgb3IgVFNTIGRlc2NyaXB0b3IgaW4gdGhlIEdEVC4gMTYgYnl0ZXMuCitzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yXzY0IHsKKwlzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yIHM7CisJdTMyIGJhc2VfaGlnaGVyOworCXUzMiBwYWRfemVybzsKK307CisKKyNlbmRpZgorCit1bnNpZ25lZCBsb25nIHNlZ21lbnRfYmFzZSh1MTYgc2VsZWN0b3IpCit7CisJc3RydWN0IGRlc2NyaXB0b3JfdGFibGUgZ2R0OworCXN0cnVjdCBzZWdtZW50X2Rlc2NyaXB0b3IgKmQ7CisJdW5zaWduZWQgbG9uZyB0YWJsZV9iYXNlOworCXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bDsKKwl1bnNpZ25lZCBsb25nIHY7CisKKwlpZiAoc2VsZWN0b3IgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlhc20gKCJzZ2R0ICUwIiA6ICI9bSIoZ2R0KSk7CisJdGFibGVfYmFzZSA9IGdkdC5iYXNlOworCisJaWYgKHNlbGVjdG9yICYgNCkgeyAgICAgICAgICAgLyogZnJvbSBsZHQgKi8KKwkJdTE2IGxkdF9zZWxlY3RvcjsKKworCQlhc20gKCJzbGR0ICUwIiA6ICI9ZyIobGR0X3NlbGVjdG9yKSk7CisJCXRhYmxlX2Jhc2UgPSBzZWdtZW50X2Jhc2UobGR0X3NlbGVjdG9yKTsKKwl9CisJZCA9IChzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yICopKHRhYmxlX2Jhc2UgKyAoc2VsZWN0b3IgJiB+NykpOworCXYgPSBkLT5iYXNlX2xvdyB8ICgodWwpZC0+YmFzZV9taWQgPDwgMTYpIHwgKCh1bClkLT5iYXNlX2hpZ2ggPDwgMjQpOworI2lmZGVmIENPTkZJR19YODZfNjQKKwlpZiAoZC0+c3lzdGVtID09IDAKKwkgICAgJiYgKGQtPnR5cGUgPT0gMiB8fCBkLT50eXBlID09IDkgfHwgZC0+dHlwZSA9PSAxMSkpCisJCXYgfD0gKCh1bCkoKHN0cnVjdCBzZWdtZW50X2Rlc2NyaXB0b3JfNjQgKilkKS0+YmFzZV9oaWdoZXIpIDw8IDMyOworI2VuZGlmCisJcmV0dXJuIHY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzZWdtZW50X2Jhc2UpOworCitpbnQga3ZtX3JlYWRfZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgICBndmFfdCBhZGRyLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkgICAgIHZvaWQgKmRlc3QpCit7CisJdW5zaWduZWQgY2hhciAqaG9zdF9idWYgPSBkZXN0OworCXVuc2lnbmVkIGxvbmcgcmVxX3NpemUgPSBzaXplOworCisJd2hpbGUgKHNpemUpIHsKKwkJaHBhX3QgcGFkZHI7CisJCXVuc2lnbmVkIG5vdzsKKwkJdW5zaWduZWQgb2Zmc2V0OworCQlodmFfdCBndWVzdF9idWY7CisKKwkJcGFkZHIgPSBndmFfdG9faHBhKHZjcHUsIGFkZHIpOworCisJCWlmIChpc19lcnJvcl9ocGEocGFkZHIpKQorCQkJYnJlYWs7CisKKwkJZ3Vlc3RfYnVmID0gKGh2YV90KWttYXBfYXRvbWljKAorCQkJCQlwZm5fdG9fcGFnZShwYWRkciA+PiBQQUdFX1NISUZUKSwKKwkJCQkJS01fVVNFUjApOworCQlvZmZzZXQgPSBhZGRyICYgflBBR0VfTUFTSzsKKwkJZ3Vlc3RfYnVmIHw9IG9mZnNldDsKKwkJbm93ID0gbWluKHNpemUsIFBBR0VfU0laRSAtIG9mZnNldCk7CisJCW1lbWNweShob3N0X2J1ZiwgKHZvaWQqKWd1ZXN0X2J1Ziwgbm93KTsKKwkJaG9zdF9idWYgKz0gbm93OworCQlhZGRyICs9IG5vdzsKKwkJc2l6ZSAtPSBub3c7CisJCWt1bm1hcF9hdG9taWMoKHZvaWQgKikoZ3Vlc3RfYnVmICYgUEFHRV9NQVNLKSwgS01fVVNFUjApOworCX0KKwlyZXR1cm4gcmVxX3NpemUgLSBzaXplOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3JlYWRfZ3Vlc3QpOworCitpbnQga3ZtX3dyaXRlX2d1ZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICAgZ3ZhX3QgYWRkciwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgICB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgKmhvc3RfYnVmID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nIHJlcV9zaXplID0gc2l6ZTsKKworCXdoaWxlIChzaXplKSB7CisJCWhwYV90IHBhZGRyOworCQl1bnNpZ25lZCBub3c7CisJCXVuc2lnbmVkIG9mZnNldDsKKwkJaHZhX3QgZ3Vlc3RfYnVmOworCisJCXBhZGRyID0gZ3ZhX3RvX2hwYSh2Y3B1LCBhZGRyKTsKKworCQlpZiAoaXNfZXJyb3JfaHBhKHBhZGRyKSkKKwkJCWJyZWFrOworCisJCWd1ZXN0X2J1ZiA9IChodmFfdClrbWFwX2F0b21pYygKKwkJCQlwZm5fdG9fcGFnZShwYWRkciA+PiBQQUdFX1NISUZUKSwgS01fVVNFUjApOworCQlvZmZzZXQgPSBhZGRyICYgflBBR0VfTUFTSzsKKwkJZ3Vlc3RfYnVmIHw9IG9mZnNldDsKKwkJbm93ID0gbWluKHNpemUsIFBBR0VfU0laRSAtIG9mZnNldCk7CisJCW1lbWNweSgodm9pZCopZ3Vlc3RfYnVmLCBob3N0X2J1Ziwgbm93KTsKKwkJaG9zdF9idWYgKz0gbm93OworCQlhZGRyICs9IG5vdzsKKwkJc2l6ZSAtPSBub3c7CisJCWt1bm1hcF9hdG9taWMoKHZvaWQgKikoZ3Vlc3RfYnVmICYgUEFHRV9NQVNLKSwgS01fVVNFUjApOworCX0KKwlyZXR1cm4gcmVxX3NpemUgLSBzaXplOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3dyaXRlX2d1ZXN0KTsKKworc3RhdGljIGludCB2Y3B1X3Nsb3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiB2Y3B1IC0gdmNwdS0+a3ZtLT52Y3B1czsKK30KKworLyoKKyAqIFN3aXRjaGVzIHRvIHNwZWNpZmllZCB2Y3B1LCB1bnRpbCBhIG1hdGNoaW5nIHZjcHVfcHV0KCkKKyAqLworc3RhdGljIHN0cnVjdCBrdm1fdmNwdSAqdmNwdV9sb2FkKHN0cnVjdCBrdm0gKmt2bSwgaW50IHZjcHVfc2xvdCkKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSAma3ZtLT52Y3B1c1t2Y3B1X3Nsb3RdOworCisJbXV0ZXhfbG9jaygmdmNwdS0+bXV0ZXgpOworCWlmICh1bmxpa2VseSghdmNwdS0+dm1jcykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ2Y3B1LT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4ga3ZtX2FyY2hfb3BzLT52Y3B1X2xvYWQodmNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIHZjcHVfcHV0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1fYXJjaF9vcHMtPnZjcHVfcHV0KHZjcHUpOworCW11dGV4X3VubG9jaygmdmNwdS0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IGt2bV9kZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qga3ZtICprdm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtKSwgR0ZQX0tFUk5FTCk7CisJaW50IGk7CisKKwlpZiAoIWt2bSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgma3ZtLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgma3ZtLT5hY3RpdmVfbW11X3BhZ2VzKTsKKwlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKSB7CisJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9ICZrdm0tPnZjcHVzW2ldOworCisJCW11dGV4X2luaXQoJnZjcHUtPm11dGV4KTsKKwkJdmNwdS0+bW11LnJvb3RfaHBhID0gSU5WQUxJRF9QQUdFOworCQlJTklUX0xJU1RfSEVBRCgmdmNwdS0+ZnJlZV9wYWdlcyk7CisJfQorCWZpbHAtPnByaXZhdGVfZGF0YSA9IGt2bTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgYW55IG1lbW9yeSBpbiBAZnJlZSBidXQgbm90IGluIEBkb250LgorICovCitzdGF0aWMgdm9pZCBrdm1fZnJlZV9waHlzbWVtX3Nsb3Qoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqZnJlZSwKKwkJCQkgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmRvbnQpCit7CisJaW50IGk7CisKKwlpZiAoIWRvbnQgfHwgZnJlZS0+cGh5c19tZW0gIT0gZG9udC0+cGh5c19tZW0pCisJCWlmIChmcmVlLT5waHlzX21lbSkgeworCQkJZm9yIChpID0gMDsgaSA8IGZyZWUtPm5wYWdlczsgKytpKQorCQkJCV9fZnJlZV9wYWdlKGZyZWUtPnBoeXNfbWVtW2ldKTsKKwkJCXZmcmVlKGZyZWUtPnBoeXNfbWVtKTsKKwkJfQorCisJaWYgKCFkb250IHx8IGZyZWUtPmRpcnR5X2JpdG1hcCAhPSBkb250LT5kaXJ0eV9iaXRtYXApCisJCXZmcmVlKGZyZWUtPmRpcnR5X2JpdG1hcCk7CisKKwlmcmVlLT5waHlzX21lbSA9IDA7CisJZnJlZS0+bnBhZ2VzID0gMDsKKwlmcmVlLT5kaXJ0eV9iaXRtYXAgPSAwOworfQorCitzdGF0aWMgdm9pZCBrdm1fZnJlZV9waHlzbWVtKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBrdm0tPm5tZW1zbG90czsgKytpKQorCQlrdm1fZnJlZV9waHlzbWVtX3Nsb3QoJmt2bS0+bWVtc2xvdHNbaV0sIDApOworfQorCitzdGF0aWMgdm9pZCBrdm1fZnJlZV92Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1fYXJjaF9vcHMtPnZjcHVfZnJlZSh2Y3B1KTsKKwlrdm1fbW11X2Rlc3Ryb3kodmNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV9mcmVlX3ZjcHVzKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBLVk1fTUFYX1ZDUFVTOyArK2kpCisJCWt2bV9mcmVlX3ZjcHUoJmt2bS0+dmNwdXNbaV0pOworfQorCitzdGF0aWMgaW50IGt2bV9kZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qga3ZtICprdm0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlrdm1fZnJlZV92Y3B1cyhrdm0pOworCWt2bV9mcmVlX3BoeXNtZW0oa3ZtKTsKKwlrZnJlZShrdm0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbmplY3RfZ3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWt2bV9hcmNoX29wcy0+aW5qZWN0X2dwKHZjcHUsIDApOworfQorCitzdGF0aWMgaW50IHBkcHRyc19oYXZlX3Jlc2VydmVkX2JpdHNfc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgY3IzKQoreworCWdmbl90IHBkcHRfZ2ZuID0gY3IzID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgb2Zmc2V0ID0gKGNyMyAmIChQQUdFX1NJWkUtMSkpID4+IDU7CisJaW50IGk7CisJdTY0IHBkcHRlOworCXU2NCAqcGRwdDsKKwlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90OworCisJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCW1lbXNsb3QgPSBnZm5fdG9fbWVtc2xvdCh2Y3B1LT5rdm0sIHBkcHRfZ2ZuKTsKKwkvKiBGSVhNRTogIW1lbXNsb3QgLSBlbXVsYXRlPyAweGZmPyAqLworCXBkcHQgPSBrbWFwX2F0b21pYyhnZm5fdG9fcGFnZShtZW1zbG90LCBwZHB0X2dmbiksIEtNX1VTRVIwKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJcGRwdGUgPSBwZHB0W29mZnNldCArIGldOworCQlpZiAoKHBkcHRlICYgMSkgJiYgKHBkcHRlICYgMHhmZmZmZmZmMDAwMDAwMWU2dWxsKSkKKwkJCWJyZWFrOworCX0KKworCWt1bm1hcF9hdG9taWMocGRwdCwgS01fVVNFUjApOworCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCisJcmV0dXJuIGkgIT0gNDsKK30KKwordm9pZCBzZXRfY3IwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjApCit7CisJaWYgKGNyMCAmIENSMF9SRVNFVkVEX0JJVFMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9jcjA6IDB4JWx4ICNHUCwgcmVzZXJ2ZWQgYml0cyAweCVseFxuIiwKKwkJICAgICAgIGNyMCwgdmNwdS0+Y3IwKTsKKwkJaW5qZWN0X2dwKHZjcHUpOworCQlyZXR1cm47CisJfQorCisJaWYgKChjcjAgJiBDUjBfTldfTUFTSykgJiYgIShjcjAgJiBDUjBfQ0RfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9jcjA6ICNHUCwgQ0QgPT0gMCAmJiBOVyA9PSAxXG4iKTsKKwkJaW5qZWN0X2dwKHZjcHUpOworCQlyZXR1cm47CisJfQorCisJaWYgKChjcjAgJiBDUjBfUEdfTUFTSykgJiYgIShjcjAgJiBDUjBfUEVfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9jcjA6ICNHUCwgc2V0IFBHIGZsYWcgIgorCQkgICAgICAgImFuZCBhIGNsZWFyIFBFIGZsYWdcbiIpOworCQlpbmplY3RfZ3AodmNwdSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWlzX3BhZ2luZyh2Y3B1KSAmJiAoY3IwICYgQ1IwX1BHX01BU0spKSB7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQlpZiAoKHZjcHUtPnNoYWRvd19lZmVyICYgRUZFUl9MTUUpKSB7CisJCQlpbnQgY3NfZGIsIGNzX2w7CisKKwkJCWlmICghaXNfcGFlKHZjcHUpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9jcjA6ICNHUCwgc3RhcnQgcGFnaW5nICIKKwkJCQkgICAgICAgImluIGxvbmcgbW9kZSB3aGlsZSBQQUUgaXMgZGlzYWJsZWRcbiIpOworCQkJCWluamVjdF9ncCh2Y3B1KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlrdm1fYXJjaF9vcHMtPmdldF9jc19kYl9sX2JpdHModmNwdSwgJmNzX2RiLCAmY3NfbCk7CisJCQlpZiAoY3NfbCkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzZXRfY3IwOiAjR1AsIHN0YXJ0IHBhZ2luZyAiCisJCQkJICAgICAgICJpbiBsb25nIG1vZGUgd2hpbGUgQ1MuTCA9PSAxXG4iKTsKKwkJCQlpbmplY3RfZ3AodmNwdSk7CisJCQkJcmV0dXJuOworCisJCQl9CisJCX0gZWxzZQorI2VuZGlmCisJCWlmIChpc19wYWUodmNwdSkgJiYKKwkJCSAgICBwZHB0cnNfaGF2ZV9yZXNlcnZlZF9iaXRzX3NldCh2Y3B1LCB2Y3B1LT5jcjMpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2V0X2NyMDogI0dQLCBwZHB0cnMgIgorCQkJICAgICAgICJyZXNlcnZlZCBiaXRzXG4iKTsKKwkJCWluamVjdF9ncCh2Y3B1KTsKKwkJCXJldHVybjsKKwkJfQorCisJfQorCisJa3ZtX2FyY2hfb3BzLT5zZXRfY3IwKHZjcHUsIGNyMCk7CisJdmNwdS0+Y3IwID0gY3IwOworCisJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCWt2bV9tbXVfcmVzZXRfY29udGV4dCh2Y3B1KTsKKwlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5sb2NrKTsKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfY3IwKTsKKwordm9pZCBsbXN3KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBtc3cpCit7CisJc2V0X2NyMCh2Y3B1LCAodmNwdS0+Y3IwICYgfjB4MGZ1bCkgfCAobXN3ICYgMHgwZikpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobG1zdyk7CisKK3ZvaWQgc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KQoreworCWlmIChjcjQgJiBDUjRfUkVTRVZFRF9CSVRTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJzZXRfY3I0OiAjR1AsIHJlc2VydmVkIGJpdHNcbiIpOworCQlpbmplY3RfZ3AodmNwdSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoa3ZtX2FyY2hfb3BzLT5pc19sb25nX21vZGUodmNwdSkpIHsKKwkJaWYgKCEoY3I0ICYgQ1I0X1BBRV9NQVNLKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9jcjQ6ICNHUCwgY2xlYXJpbmcgUEFFIHdoaWxlICIKKwkJCSAgICAgICAiaW4gbG9uZyBtb2RlXG4iKTsKKwkJCWluamVjdF9ncCh2Y3B1KTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoaXNfcGFnaW5nKHZjcHUpICYmICFpc19wYWUodmNwdSkgJiYgKGNyNCAmIENSNF9QQUVfTUFTSykKKwkJICAgJiYgcGRwdHJzX2hhdmVfcmVzZXJ2ZWRfYml0c19zZXQodmNwdSwgdmNwdS0+Y3IzKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAic2V0X2NyNDogI0dQLCBwZHB0cnMgcmVzZXJ2ZWQgYml0c1xuIik7CisJCWluamVjdF9ncCh2Y3B1KTsKKwl9CisKKwlpZiAoY3I0ICYgQ1I0X1ZNWEVfTUFTSykgeworCQlwcmludGsoS0VSTl9ERUJVRyAic2V0X2NyNDogI0dQLCBzZXR0aW5nIFZNWEVcbiIpOworCQlpbmplY3RfZ3AodmNwdSk7CisJCXJldHVybjsKKwl9CisJa3ZtX2FyY2hfb3BzLT5zZXRfY3I0KHZjcHUsIGNyNCk7CisJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCWt2bV9tbXVfcmVzZXRfY29udGV4dCh2Y3B1KTsKKwlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9jcjQpOworCit2b2lkIHNldF9jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMykKK3sKKwlpZiAoa3ZtX2FyY2hfb3BzLT5pc19sb25nX21vZGUodmNwdSkpIHsKKwkJaWYgKCBjcjMgJiBDUjNfTF9NT0RFX1JFU0VWRURfQklUUykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9jcjM6ICNHUCwgcmVzZXJ2ZWQgYml0c1xuIik7CisJCQlpbmplY3RfZ3AodmNwdSk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3IzICYgQ1IzX1JFU0VWRURfQklUUykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9jcjM6ICNHUCwgcmVzZXJ2ZWQgYml0c1xuIik7CisJCQlpbmplY3RfZ3AodmNwdSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGlzX3BhZ2luZyh2Y3B1KSAmJiBpc19wYWUodmNwdSkgJiYKKwkJICAgIHBkcHRyc19oYXZlX3Jlc2VydmVkX2JpdHNfc2V0KHZjcHUsIGNyMykpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzZXRfY3IzOiAjR1AsIHBkcHRycyAiCisJCQkgICAgICAgInJlc2VydmVkIGJpdHNcbiIpOworCQkJaW5qZWN0X2dwKHZjcHUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJdmNwdS0+Y3IzID0gY3IzOworCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5sb2NrKTsKKwl2Y3B1LT5tbXUubmV3X2NyMyh2Y3B1KTsKKwlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9jcjMpOworCit2b2lkIHNldF9jcjgoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyOCkKK3sKKwlpZiAoIGNyOCAmIENSOF9SRVNFVkVEX0JJVFMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9jcjg6ICNHUCwgcmVzZXJ2ZWQgYml0cyAweCVseFxuIiwgY3I4KTsKKwkJaW5qZWN0X2dwKHZjcHUpOworCQlyZXR1cm47CisJfQorCXZjcHUtPmNyOCA9IGNyODsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9jcjgpOworCit2b2lkIGZ4X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGZ4X2ltYWdlX3MgeworCQl1MTYgY29udHJvbDsgLy9mY3cKKwkJdTE2IHN0YXR1czsgLy9mc3cKKwkJdTE2IHRhZzsgLy8gZnR3CisJCXUxNiBvcGNvZGU7IC8vZm9wCisJCXU2NCBpcDsgLy8gZnB1IGlwCisJCXU2NCBvcGVyYW5kOy8vIGZwdSBkcAorCQl1MzIgbXhjc3I7CisJCXUzMiBteGNzcl9tYXNrOworCisJfSAqZnhfaW1hZ2U7CisKKwlmeF9zYXZlKHZjcHUtPmhvc3RfZnhfaW1hZ2UpOworCWZwdV9pbml0KCk7CisJZnhfc2F2ZSh2Y3B1LT5ndWVzdF9meF9pbWFnZSk7CisJZnhfcmVzdG9yZSh2Y3B1LT5ob3N0X2Z4X2ltYWdlKTsKKworCWZ4X2ltYWdlID0gKHN0cnVjdCBmeF9pbWFnZV9zICopdmNwdS0+Z3Vlc3RfZnhfaW1hZ2U7CisJZnhfaW1hZ2UtPm14Y3NyID0gMHgxZjgwOworCW1lbXNldCh2Y3B1LT5ndWVzdF9meF9pbWFnZSArIHNpemVvZihzdHJ1Y3QgZnhfaW1hZ2VfcyksCisJICAgICAgIDAsIEZYX0lNQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGZ4X2ltYWdlX3MpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZ4X2luaXQpOworCisvKgorICogQ3JlYXRlcyBzb21lIHZpcnR1YWwgY3B1cy4gIEdvb2QgbHVjayBjcmVhdGluZyBtb3JlIHRoYW4gb25lLgorICovCitzdGF0aWMgaW50IGt2bV9kZXZfaW9jdGxfY3JlYXRlX3ZjcHUoc3RydWN0IGt2bSAqa3ZtLCBpbnQgbikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisKKwlyID0gLUVJTlZBTDsKKwlpZiAobiA8IDAgfHwgbiA+PSBLVk1fTUFYX1ZDUFVTKQorCQlnb3RvIG91dDsKKworCXZjcHUgPSAma3ZtLT52Y3B1c1tuXTsKKworCW11dGV4X2xvY2soJnZjcHUtPm11dGV4KTsKKworCWlmICh2Y3B1LT52bWNzKSB7CisJCW11dGV4X3VubG9jaygmdmNwdS0+bXV0ZXgpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwl2Y3B1LT5ob3N0X2Z4X2ltYWdlID0gKGNoYXIqKUFMSUdOKChodmFfdCl2Y3B1LT5meF9idWYsCisJCQkJCSAgIEZYX0lNQUdFX0FMSUdOKTsKKwl2Y3B1LT5ndWVzdF9meF9pbWFnZSA9IHZjcHUtPmhvc3RfZnhfaW1hZ2UgKyBGWF9JTUFHRV9TSVpFOworCisJdmNwdS0+Y3B1ID0gLTE7ICAvKiBGaXJzdCBsb2FkIHdpbGwgc2V0IHVwIFRSICovCisJdmNwdS0+a3ZtID0ga3ZtOworCXIgPSBrdm1fYXJjaF9vcHMtPnZjcHVfY3JlYXRlKHZjcHUpOworCWlmIChyIDwgMCkKKwkJZ290byBvdXRfZnJlZV92Y3B1czsKKworCWt2bV9hcmNoX29wcy0+dmNwdV9sb2FkKHZjcHUpOworCisJciA9IGt2bV9hcmNoX29wcy0+dmNwdV9zZXR1cCh2Y3B1KTsKKwlpZiAociA+PSAwKQorCQlyID0ga3ZtX21tdV9pbml0KHZjcHUpOworCisJdmNwdV9wdXQodmNwdSk7CisKKwlpZiAociA8IDApCisJCWdvdG8gb3V0X2ZyZWVfdmNwdXM7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfdmNwdXM6CisJa3ZtX2ZyZWVfdmNwdSh2Y3B1KTsKKwltdXRleF91bmxvY2soJnZjcHUtPm11dGV4KTsKK291dDoKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEFsbG9jYXRlIHNvbWUgbWVtb3J5IGFuZCBnaXZlIGl0IGFuIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MKKyAqIHNwYWNlLgorICoKKyAqIERpc2NvbnRpZ3VvdXMgbWVtb3J5IGlzIGFsbG93ZWQsIG1vc3RseSBmb3IgZnJhbWVidWZmZXJzLgorICovCitzdGF0aWMgaW50IGt2bV9kZXZfaW9jdGxfc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLAorCQkJCQkgICBzdHJ1Y3Qga3ZtX21lbW9yeV9yZWdpb24gKm1lbSkKK3sKKwlpbnQgcjsKKwlnZm5fdCBiYXNlX2dmbjsKKwl1bnNpZ25lZCBsb25nIG5wYWdlczsKKwl1bnNpZ25lZCBsb25nIGk7CisJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDsKKwlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90IG9sZCwgbmV3OworCWludCBtZW1vcnlfY29uZmlnX3ZlcnNpb247CisKKwlyID0gLUVJTlZBTDsKKwkvKiBHZW5lcmFsIHNhbml0eSBjaGVja3MgKi8KKwlpZiAobWVtLT5tZW1vcnlfc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkKKwkJZ290byBvdXQ7CisJaWYgKG1lbS0+Z3Vlc3RfcGh5c19hZGRyICYgKFBBR0VfU0laRSAtIDEpKQorCQlnb3RvIG91dDsKKwlpZiAobWVtLT5zbG90ID49IEtWTV9NRU1PUllfU0xPVFMpCisJCWdvdG8gb3V0OworCWlmIChtZW0tPmd1ZXN0X3BoeXNfYWRkciArIG1lbS0+bWVtb3J5X3NpemUgPCBtZW0tPmd1ZXN0X3BoeXNfYWRkcikKKwkJZ290byBvdXQ7CisKKwltZW1zbG90ID0gJmt2bS0+bWVtc2xvdHNbbWVtLT5zbG90XTsKKwliYXNlX2dmbiA9IG1lbS0+Z3Vlc3RfcGh5c19hZGRyID4+IFBBR0VfU0hJRlQ7CisJbnBhZ2VzID0gbWVtLT5tZW1vcnlfc2l6ZSA+PiBQQUdFX1NISUZUOworCisJaWYgKCFucGFnZXMpCisJCW1lbS0+ZmxhZ3MgJj0gfktWTV9NRU1fTE9HX0RJUlRZX1BBR0VTOworCityYWNlZDoKKwlzcGluX2xvY2soJmt2bS0+bG9jayk7CisKKwltZW1vcnlfY29uZmlnX3ZlcnNpb24gPSBrdm0tPm1lbW9yeV9jb25maWdfdmVyc2lvbjsKKwluZXcgPSBvbGQgPSAqbWVtc2xvdDsKKworCW5ldy5iYXNlX2dmbiA9IGJhc2VfZ2ZuOworCW5ldy5ucGFnZXMgPSBucGFnZXM7CisJbmV3LmZsYWdzID0gbWVtLT5mbGFnczsKKworCS8qIERpc2FsbG93IGNoYW5naW5nIGEgbWVtb3J5IHNsb3QncyBzaXplLiAqLworCXIgPSAtRUlOVkFMOworCWlmIChucGFnZXMgJiYgb2xkLm5wYWdlcyAmJiBucGFnZXMgIT0gb2xkLm5wYWdlcykKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyogQ2hlY2sgZm9yIG92ZXJsYXBzICovCisJciA9IC1FRVhJU1Q7CisJZm9yIChpID0gMDsgaSA8IEtWTV9NRU1PUllfU0xPVFM7ICsraSkgeworCQlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzID0gJmt2bS0+bWVtc2xvdHNbaV07CisKKwkJaWYgKHMgPT0gbWVtc2xvdCkKKwkJCWNvbnRpbnVlOworCQlpZiAoISgoYmFzZV9nZm4gKyBucGFnZXMgPD0gcy0+YmFzZV9nZm4pIHx8CisJCSAgICAgIChiYXNlX2dmbiA+PSBzLT5iYXNlX2dmbiArIHMtPm5wYWdlcykpKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKwkvKgorCSAqIERvIG1lbW9yeSBhbGxvY2F0aW9ucyBvdXRzaWRlIGxvY2suICBtZW1vcnlfY29uZmlnX3ZlcnNpb24gd2lsbAorCSAqIGRldGVjdCBhbnkgcmFjZXMuCisJICovCisJc3Bpbl91bmxvY2soJmt2bS0+bG9jayk7CisKKwkvKiBEZWFsbG9jYXRlIGlmIHNsb3QgaXMgYmVpbmcgcmVtb3ZlZCAqLworCWlmICghbnBhZ2VzKQorCQluZXcucGh5c19tZW0gPSAwOworCisJLyogRnJlZSBwYWdlIGRpcnR5IGJpdG1hcCBpZiB1bm5lZWRlZCAqLworCWlmICghKG5ldy5mbGFncyAmIEtWTV9NRU1fTE9HX0RJUlRZX1BBR0VTKSkKKwkJbmV3LmRpcnR5X2JpdG1hcCA9IDA7CisKKwlyID0gLUVOT01FTTsKKworCS8qIEFsbG9jYXRlIGlmIGEgc2xvdCBpcyBiZWluZyBjcmVhdGVkICovCisJaWYgKG5wYWdlcyAmJiAhbmV3LnBoeXNfbWVtKSB7CisJCW5ldy5waHlzX21lbSA9IHZtYWxsb2MobnBhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKKworCQlpZiAoIW5ldy5waHlzX21lbSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisKKwkJbWVtc2V0KG5ldy5waHlzX21lbSwgMCwgbnBhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKKwkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKSB7CisJCQluZXcucGh5c19tZW1baV0gPSBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUgorCQkJCQkJICAgICB8IF9fR0ZQX1pFUk8pOworCQkJaWYgKCFuZXcucGh5c19tZW1baV0pCisJCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCX0KKworCS8qIEFsbG9jYXRlIHBhZ2UgZGlydHkgYml0bWFwIGlmIG5lZWRlZCAqLworCWlmICgobmV3LmZsYWdzICYgS1ZNX01FTV9MT0dfRElSVFlfUEFHRVMpICYmICFuZXcuZGlydHlfYml0bWFwKSB7CisJCXVuc2lnbmVkIGRpcnR5X2J5dGVzID0gQUxJR04obnBhZ2VzLCBCSVRTX1BFUl9MT05HKSAvIDg7CisKKwkJbmV3LmRpcnR5X2JpdG1hcCA9IHZtYWxsb2MoZGlydHlfYnl0ZXMpOworCQlpZiAoIW5ldy5kaXJ0eV9iaXRtYXApCisJCQlnb3RvIG91dF9mcmVlOworCQltZW1zZXQobmV3LmRpcnR5X2JpdG1hcCwgMCwgZGlydHlfYnl0ZXMpOworCX0KKworCXNwaW5fbG9jaygma3ZtLT5sb2NrKTsKKworCWlmIChtZW1vcnlfY29uZmlnX3ZlcnNpb24gIT0ga3ZtLT5tZW1vcnlfY29uZmlnX3ZlcnNpb24pIHsKKwkJc3Bpbl91bmxvY2soJmt2bS0+bG9jayk7CisJCWt2bV9mcmVlX3BoeXNtZW1fc2xvdCgmbmV3LCAmb2xkKTsKKwkJZ290byByYWNlZDsKKwl9CisKKwlyID0gLUVBR0FJTjsKKwlpZiAoa3ZtLT5idXN5KQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAobWVtLT5zbG90ID49IGt2bS0+bm1lbXNsb3RzKQorCQlrdm0tPm5tZW1zbG90cyA9IG1lbS0+c2xvdCArIDE7CisKKwkqbWVtc2xvdCA9IG5ldzsKKwkrK2t2bS0+bWVtb3J5X2NvbmZpZ192ZXJzaW9uOworCisJc3Bpbl91bmxvY2soJmt2bS0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKSB7CisJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKworCQl2Y3B1ID0gdmNwdV9sb2FkKGt2bSwgaSk7CisJCWlmICghdmNwdSkKKwkJCWNvbnRpbnVlOworCQlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CisJCXZjcHVfcHV0KHZjcHUpOworCX0KKworCWt2bV9mcmVlX3BoeXNtZW1fc2xvdCgmb2xkLCAmbmV3KTsKKwlyZXR1cm4gMDsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygma3ZtLT5sb2NrKTsKK291dF9mcmVlOgorCWt2bV9mcmVlX3BoeXNtZW1fc2xvdCgmbmV3LCAmb2xkKTsKK291dDoKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIEdldCAoYW5kIGNsZWFyKSB0aGUgZGlydHkgbWVtb3J5IGxvZyBmb3IgYSBtZW1vcnkgc2xvdC4KKyAqLworc3RhdGljIGludCBrdm1fZGV2X2lvY3RsX2dldF9kaXJ0eV9sb2coc3RydWN0IGt2bSAqa3ZtLAorCQkJCSAgICAgICBzdHJ1Y3Qga3ZtX2RpcnR5X2xvZyAqbG9nKQoreworCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7CisJaW50IHIsIGk7CisJaW50IG47CisJdW5zaWduZWQgbG9uZyBhbnkgPSAwOworCisJc3Bpbl9sb2NrKCZrdm0tPmxvY2spOworCisJLyoKKwkgKiBQcmV2ZW50IGNoYW5nZXMgdG8gZ3Vlc3QgbWVtb3J5IGNvbmZpZ3VyYXRpb24gZXZlbiB3aGlsZSB0aGUgbG9jaworCSAqIGlzIG5vdCB0YWtlbi4KKwkgKi8KKwkrK2t2bS0+YnVzeTsKKwlzcGluX3VubG9jaygma3ZtLT5sb2NrKTsKKwlyID0gLUVJTlZBTDsKKwlpZiAobG9nLT5zbG90ID49IEtWTV9NRU1PUllfU0xPVFMpCisJCWdvdG8gb3V0OworCisJbWVtc2xvdCA9ICZrdm0tPm1lbXNsb3RzW2xvZy0+c2xvdF07CisJciA9IC1FTk9FTlQ7CisJaWYgKCFtZW1zbG90LT5kaXJ0eV9iaXRtYXApCisJCWdvdG8gb3V0OworCisJbiA9IEFMSUdOKG1lbXNsb3QtPm5wYWdlcywgOCkgLyA4OworCisJZm9yIChpID0gMDsgIWFueSAmJiBpIDwgbjsgKytpKQorCQlhbnkgPSBtZW1zbG90LT5kaXJ0eV9iaXRtYXBbaV07CisKKwlyID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKGxvZy0+ZGlydHlfYml0bWFwLCBtZW1zbG90LT5kaXJ0eV9iaXRtYXAsIG4pKQorCQlnb3RvIG91dDsKKworCisJaWYgKGFueSkgeworCQlzcGluX2xvY2soJmt2bS0+bG9jayk7CisJCWt2bV9tbXVfc2xvdF9yZW1vdmVfd3JpdGVfYWNjZXNzKGt2bSwgbG9nLT5zbG90KTsKKwkJc3Bpbl91bmxvY2soJmt2bS0+bG9jayk7CisJCW1lbXNldChtZW1zbG90LT5kaXJ0eV9iaXRtYXAsIDAsIG4pOworCQlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKSB7CisJCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSB2Y3B1X2xvYWQoa3ZtLCBpKTsKKworCQkJaWYgKCF2Y3B1KQorCQkJCWNvbnRpbnVlOworCQkJa3ZtX2FyY2hfb3BzLT50bGJfZmx1c2godmNwdSk7CisJCQl2Y3B1X3B1dCh2Y3B1KTsKKwkJfQorCX0KKworCXIgPSAwOworCitvdXQ6CisJc3Bpbl9sb2NrKCZrdm0tPmxvY2spOworCS0ta3ZtLT5idXN5OworCXNwaW5fdW5sb2NrKCZrdm0tPmxvY2spOworCXJldHVybiByOworfQorCitzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpnZm5fdG9fbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBrdm0tPm5tZW1zbG90czsgKytpKSB7CisJCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QgPSAma3ZtLT5tZW1zbG90c1tpXTsKKworCQlpZiAoZ2ZuID49IG1lbXNsb3QtPmJhc2VfZ2ZuCisJCSAgICAmJiBnZm4gPCBtZW1zbG90LT5iYXNlX2dmbiArIG1lbXNsb3QtPm5wYWdlcykKKwkJCXJldHVybiBtZW1zbG90OworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdmbl90b19tZW1zbG90KTsKKwordm9pZCBtYXJrX3BhZ2VfZGlydHkoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCit7CisJaW50IGk7CisJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCA9IDA7CisJdW5zaWduZWQgbG9uZyByZWxfZ2ZuOworCisJZm9yIChpID0gMDsgaSA8IGt2bS0+bm1lbXNsb3RzOyArK2kpIHsKKwkJbWVtc2xvdCA9ICZrdm0tPm1lbXNsb3RzW2ldOworCisJCWlmIChnZm4gPj0gbWVtc2xvdC0+YmFzZV9nZm4KKwkJICAgICYmIGdmbiA8IG1lbXNsb3QtPmJhc2VfZ2ZuICsgbWVtc2xvdC0+bnBhZ2VzKSB7CisKKwkJCWlmICghbWVtc2xvdCB8fCAhbWVtc2xvdC0+ZGlydHlfYml0bWFwKQorCQkJCXJldHVybjsKKworCQkJcmVsX2dmbiA9IGdmbiAtIG1lbXNsb3QtPmJhc2VfZ2ZuOworCisJCQkvKiBhdm9pZCBSTVcgKi8KKwkJCWlmICghdGVzdF9iaXQocmVsX2dmbiwgbWVtc2xvdC0+ZGlydHlfYml0bWFwKSkKKwkJCQlzZXRfYml0KHJlbF9nZm4sIG1lbXNsb3QtPmRpcnR5X2JpdG1hcCk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgZW11bGF0b3JfcmVhZF9zdGQodW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICB1bnNpZ25lZCBsb25nICp2YWwsCisJCQkgICAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCSAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gY3R4dC0+dmNwdTsKKwl2b2lkICpkYXRhID0gdmFsOworCisJd2hpbGUgKGJ5dGVzKSB7CisJCWdwYV90IGdwYSA9IHZjcHUtPm1tdS5ndmFfdG9fZ3BhKHZjcHUsIGFkZHIpOworCQl1bnNpZ25lZCBvZmZzZXQgPSBhZGRyICYgKFBBR0VfU0laRS0xKTsKKwkJdW5zaWduZWQgdG9jb3B5ID0gbWluKGJ5dGVzLCAodW5zaWduZWQpUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKwkJdW5zaWduZWQgbG9uZyBwZm47CisJCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7CisJCXZvaWQgKnBhZ2U7CisKKwkJaWYgKGdwYSA9PSBVTk1BUFBFRF9HVkEpCisJCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CisJCXBmbiA9IGdwYSA+PiBQQUdFX1NISUZUOworCQltZW1zbG90ID0gZ2ZuX3RvX21lbXNsb3QodmNwdS0+a3ZtLCBwZm4pOworCQlpZiAoIW1lbXNsb3QpCisJCQlyZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisJCXBhZ2UgPSBrbWFwX2F0b21pYyhnZm5fdG9fcGFnZShtZW1zbG90LCBwZm4pLCBLTV9VU0VSMCk7CisKKwkJbWVtY3B5KGRhdGEsIHBhZ2UgKyBvZmZzZXQsIHRvY29weSk7CisKKwkJa3VubWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisKKwkJYnl0ZXMgLT0gdG9jb3B5OworCQlkYXRhICs9IHRvY29weTsKKwkJYWRkciArPSB0b2NvcHk7CisJfQorCisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQgZW11bGF0b3Jfd3JpdGVfc3RkKHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJcHJpbnRrKEtFUk5fRVJSICJlbXVsYXRvcl93cml0ZV9zdGQ6IGFkZHIgJWx4IG4gJWRcbiIsCisJICAgICAgIGFkZHIsIGJ5dGVzKTsKKwlyZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7Cit9CisKK3N0YXRpYyBpbnQgZW11bGF0b3JfcmVhZF9lbXVsYXRlZCh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICB1bnNpZ25lZCBsb25nICp2YWwsCisJCQkJICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisJCQkJICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBjdHh0LT52Y3B1OworCisJaWYgKHZjcHUtPm1taW9fcmVhZF9jb21wbGV0ZWQpIHsKKwkJbWVtY3B5KHZhbCwgdmNwdS0+bW1pb19kYXRhLCBieXRlcyk7CisJCXZjcHUtPm1taW9fcmVhZF9jb21wbGV0ZWQgPSAwOworCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKKwl9IGVsc2UgaWYgKGVtdWxhdG9yX3JlYWRfc3RkKGFkZHIsIHZhbCwgYnl0ZXMsIGN0eHQpCisJCSAgID09IFg4NkVNVUxfQ09OVElOVUUpCisJCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworCWVsc2UgeworCQlncGFfdCBncGEgPSB2Y3B1LT5tbXUuZ3ZhX3RvX2dwYSh2Y3B1LCBhZGRyKTsKKwkJaWYgKGdwYSA9PSBVTk1BUFBFRF9HVkEpCisJCQlyZXR1cm4gdmNwdV9wcmludGYodmNwdSwgIm5vdCBwcmVzZW50XG4iKSwgWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CisJCXZjcHUtPm1taW9fbmVlZGVkID0gMTsKKwkJdmNwdS0+bW1pb19waHlzX2FkZHIgPSBncGE7CisJCXZjcHUtPm1taW9fc2l6ZSA9IGJ5dGVzOworCQl2Y3B1LT5tbWlvX2lzX3dyaXRlID0gMDsKKworCQlyZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisJfQorfQorCitzdGF0aWMgaW50IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkKHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisJCQkJICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gY3R4dC0+dmNwdTsKKwlncGFfdCBncGEgPSB2Y3B1LT5tbXUuZ3ZhX3RvX2dwYSh2Y3B1LCBhZGRyKTsKKworCWlmIChncGEgPT0gVU5NQVBQRURfR1ZBKQorCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CisKKwl2Y3B1LT5tbWlvX25lZWRlZCA9IDE7CisJdmNwdS0+bW1pb19waHlzX2FkZHIgPSBncGE7CisJdmNwdS0+bW1pb19zaXplID0gYnl0ZXM7CisJdmNwdS0+bW1pb19pc193cml0ZSA9IDE7CisJbWVtY3B5KHZjcHUtPm1taW9fZGF0YSwgJnZhbCwgYnl0ZXMpOworCisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKK3N0YXRpYyBpbnQgZW11bGF0b3JfY21weGNoZ19lbXVsYXRlZCh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9sZCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbmV3LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJCSAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJc3RhdGljIGludCByZXBvcnRlZDsKKworCWlmICghcmVwb3J0ZWQpIHsKKwkJcmVwb3J0ZWQgPSAxOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJrdm06IGVtdWxhdGluZyBleGNoYW5nZSBhcyB3cml0ZVxuIik7CisJfQorCXJldHVybiBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZChhZGRyLCBuZXcsIGJ5dGVzLCBjdHh0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3NlZ21lbnRfYmFzZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBzZWcpCit7CisJcmV0dXJuIGt2bV9hcmNoX29wcy0+Z2V0X3NlZ21lbnRfYmFzZSh2Y3B1LCBzZWcpOworfQorCitpbnQgZW11bGF0ZV9pbnZscGcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyZXNzKQoreworCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5sb2NrKTsKKwl2Y3B1LT5tbXUuaW52YWxfcGFnZSh2Y3B1LCBhZGRyZXNzKTsKKwlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5sb2NrKTsKKwlrdm1fYXJjaF9vcHMtPmludmxwZyh2Y3B1LCBhZGRyZXNzKTsKKwlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKK30KKworaW50IGVtdWxhdGVfY2x0cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbG9uZyBjcjAgPSB2Y3B1LT5jcjA7CisKKwljcjAgJj0gfkNSMF9UU19NQVNLOworCWt2bV9hcmNoX29wcy0+c2V0X2NyMCh2Y3B1LCBjcjApOworCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCitpbnQgZW11bGF0b3JfZ2V0X2RyKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0KiBjdHh0LCBpbnQgZHIsIHVuc2lnbmVkIGxvbmcgKmRlc3QpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gY3R4dC0+dmNwdTsKKworCXN3aXRjaCAoZHIpIHsKKwljYXNlIDAgLi4uIDM6CisJCSpkZXN0ID0ga3ZtX2FyY2hfb3BzLT5nZXRfZHIodmNwdSwgZHIpOworCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuZXhwZWN0ZWQgZHIgJXVcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRyKTsKKwkJcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworCX0KK30KKworaW50IGVtdWxhdG9yX3NldF9kcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IGRyLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQpID8gfjBVTEwgOiB+MFU7CisJaW50IGV4Y2VwdGlvbjsKKworCWt2bV9hcmNoX29wcy0+c2V0X2RyKGN0eHQtPnZjcHUsIGRyLCB2YWx1ZSAmIG1hc2ssICZleGNlcHRpb24pOworCWlmIChleGNlcHRpb24pIHsKKwkJLyogRklYTUU6IGJldHRlciBoYW5kbGluZyAqLworCQlyZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisJfQorCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfZW11bGF0aW9uX2ZhaWx1cmUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJc3RhdGljIGludCByZXBvcnRlZDsKKwl1OCBvcGNvZGVzWzRdOworCXVuc2lnbmVkIGxvbmcgcmlwID0gY3R4dC0+dmNwdS0+cmlwOworCXVuc2lnbmVkIGxvbmcgcmlwX2xpbmVhcjsKKworCXJpcF9saW5lYXIgPSByaXAgKyBnZXRfc2VnbWVudF9iYXNlKGN0eHQtPnZjcHUsIFZDUFVfU1JFR19DUyk7CisKKwlpZiAocmVwb3J0ZWQpCisJCXJldHVybjsKKworCWVtdWxhdG9yX3JlYWRfc3RkKHJpcF9saW5lYXIsICh2b2lkICopb3Bjb2RlcywgNCwgY3R4dCk7CisKKwlwcmludGsoS0VSTl9FUlIgImVtdWxhdGlvbiBmYWlsZWQgYnV0ICFtbWlvX25lZWRlZD8iCisJICAgICAgICIgcmlwICVseCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCSAgICAgICByaXAsIG9wY29kZXNbMF0sIG9wY29kZXNbMV0sIG9wY29kZXNbMl0sIG9wY29kZXNbM10pOworCXJlcG9ydGVkID0gMTsKK30KKworc3RydWN0IHg4Nl9lbXVsYXRlX29wcyBlbXVsYXRlX29wcyA9IHsKKwkucmVhZF9zdGQgICAgICAgICAgICA9IGVtdWxhdG9yX3JlYWRfc3RkLAorCS53cml0ZV9zdGQgICAgICAgICAgID0gZW11bGF0b3Jfd3JpdGVfc3RkLAorCS5yZWFkX2VtdWxhdGVkICAgICAgID0gZW11bGF0b3JfcmVhZF9lbXVsYXRlZCwKKwkud3JpdGVfZW11bGF0ZWQgICAgICA9IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkLAorCS5jbXB4Y2hnX2VtdWxhdGVkICAgID0gZW11bGF0b3JfY21weGNoZ19lbXVsYXRlZCwKK307CisKK2ludCBlbXVsYXRlX2luc3RydWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCXN0cnVjdCBrdm1fcnVuICpydW4sCisJCQl1bnNpZ25lZCBsb25nIGNyMiwKKwkJCXUxNiBlcnJvcl9jb2RlKQoreworCXN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0IGVtdWxhdGVfY3R4dDsKKwlpbnQgcjsKKwlpbnQgY3NfZGIsIGNzX2w7CisKKwlrdm1fYXJjaF9vcHMtPmNhY2hlX3JlZ3ModmNwdSk7CisKKwlrdm1fYXJjaF9vcHMtPmdldF9jc19kYl9sX2JpdHModmNwdSwgJmNzX2RiLCAmY3NfbCk7CisKKwllbXVsYXRlX2N0eHQudmNwdSA9IHZjcHU7CisJZW11bGF0ZV9jdHh0LmVmbGFncyA9IGt2bV9hcmNoX29wcy0+Z2V0X3JmbGFncyh2Y3B1KTsKKwllbXVsYXRlX2N0eHQuY3IyID0gY3IyOworCWVtdWxhdGVfY3R4dC5tb2RlID0gKGVtdWxhdGVfY3R4dC5lZmxhZ3MgJiBYODZfRUZMQUdTX1ZNKQorCQk/IFg4NkVNVUxfTU9ERV9SRUFMIDogY3NfbAorCQk/IFg4NkVNVUxfTU9ERV9QUk9UNjQgOgljc19kYgorCQk/IFg4NkVNVUxfTU9ERV9QUk9UMzIgOiBYODZFTVVMX01PREVfUFJPVDE2OworCisJaWYgKGVtdWxhdGVfY3R4dC5tb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQpIHsKKwkJZW11bGF0ZV9jdHh0LmNzX2Jhc2UgPSAwOworCQllbXVsYXRlX2N0eHQuZHNfYmFzZSA9IDA7CisJCWVtdWxhdGVfY3R4dC5lc19iYXNlID0gMDsKKwkJZW11bGF0ZV9jdHh0LnNzX2Jhc2UgPSAwOworCX0gZWxzZSB7CisJCWVtdWxhdGVfY3R4dC5jc19iYXNlID0gZ2V0X3NlZ21lbnRfYmFzZSh2Y3B1LCBWQ1BVX1NSRUdfQ1MpOworCQllbXVsYXRlX2N0eHQuZHNfYmFzZSA9IGdldF9zZWdtZW50X2Jhc2UodmNwdSwgVkNQVV9TUkVHX0RTKTsKKwkJZW11bGF0ZV9jdHh0LmVzX2Jhc2UgPSBnZXRfc2VnbWVudF9iYXNlKHZjcHUsIFZDUFVfU1JFR19FUyk7CisJCWVtdWxhdGVfY3R4dC5zc19iYXNlID0gZ2V0X3NlZ21lbnRfYmFzZSh2Y3B1LCBWQ1BVX1NSRUdfU1MpOworCX0KKworCWVtdWxhdGVfY3R4dC5nc19iYXNlID0gZ2V0X3NlZ21lbnRfYmFzZSh2Y3B1LCBWQ1BVX1NSRUdfR1MpOworCWVtdWxhdGVfY3R4dC5mc19iYXNlID0gZ2V0X3NlZ21lbnRfYmFzZSh2Y3B1LCBWQ1BVX1NSRUdfRlMpOworCisJdmNwdS0+bW1pb19pc193cml0ZSA9IDA7CisJciA9IHg4Nl9lbXVsYXRlX21lbW9wKCZlbXVsYXRlX2N0eHQsICZlbXVsYXRlX29wcyk7CisKKwlpZiAoKHIgfHwgdmNwdS0+bW1pb19pc193cml0ZSkgJiYgcnVuKSB7CisJCXJ1bi0+bW1pby5waHlzX2FkZHIgPSB2Y3B1LT5tbWlvX3BoeXNfYWRkcjsKKwkJbWVtY3B5KHJ1bi0+bW1pby5kYXRhLCB2Y3B1LT5tbWlvX2RhdGEsIDgpOworCQlydW4tPm1taW8ubGVuID0gdmNwdS0+bW1pb19zaXplOworCQlydW4tPm1taW8uaXNfd3JpdGUgPSB2Y3B1LT5tbWlvX2lzX3dyaXRlOworCX0KKworCWlmIChyKSB7CisJCWlmICghdmNwdS0+bW1pb19uZWVkZWQpIHsKKwkJCXJlcG9ydF9lbXVsYXRpb25fZmFpbHVyZSgmZW11bGF0ZV9jdHh0KTsKKwkJCXJldHVybiBFTVVMQVRFX0ZBSUw7CisJCX0KKwkJcmV0dXJuIEVNVUxBVEVfRE9fTU1JTzsKKwl9CisKKwlrdm1fYXJjaF9vcHMtPmRlY2FjaGVfcmVncyh2Y3B1KTsKKwlrdm1fYXJjaF9vcHMtPnNldF9yZmxhZ3ModmNwdSwgZW11bGF0ZV9jdHh0LmVmbGFncyk7CisKKwlpZiAodmNwdS0+bW1pb19pc193cml0ZSkKKwkJcmV0dXJuIEVNVUxBVEVfRE9fTU1JTzsKKworCXJldHVybiBFTVVMQVRFX0RPTkU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChlbXVsYXRlX2luc3RydWN0aW9uKTsKKworc3RhdGljIHU2NCBta19jcl82NCh1NjQgY3Vycl9jciwgdTMyIG5ld192YWwpCit7CisJcmV0dXJuIChjdXJyX2NyICYgfigoMVVMTCA8PCAzMikgLSAxKSkgfCBuZXdfdmFsOworfQorCit2b2lkIHJlYWxtb2RlX2xnZHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MTYgbGltaXQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSBkdCA9IHsgbGltaXQsIGJhc2UgfTsKKworCWt2bV9hcmNoX29wcy0+c2V0X2dkdCh2Y3B1LCAmZHQpOworfQorCit2b2lkIHJlYWxtb2RlX2xpZHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MTYgbGltaXQsIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwlzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSBkdCA9IHsgbGltaXQsIGJhc2UgfTsKKworCWt2bV9hcmNoX29wcy0+c2V0X2lkdCh2Y3B1LCAmZHQpOworfQorCit2b2lkIHJlYWxtb2RlX2xtc3coc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIG1zdywKKwkJICAgdW5zaWduZWQgbG9uZyAqcmZsYWdzKQoreworCWxtc3codmNwdSwgbXN3KTsKKwkqcmZsYWdzID0ga3ZtX2FyY2hfb3BzLT5nZXRfcmZsYWdzKHZjcHUpOworfQorCit1bnNpZ25lZCBsb25nIHJlYWxtb2RlX2dldF9jcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcikKK3sKKwlzd2l0Y2ggKGNyKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gdmNwdS0+Y3IwOworCWNhc2UgMjoKKwkJcmV0dXJuIHZjcHUtPmNyMjsKKwljYXNlIDM6CisJCXJldHVybiB2Y3B1LT5jcjM7CisJY2FzZSA0OgorCQlyZXR1cm4gdmNwdS0+Y3I0OworCWRlZmF1bHQ6CisJCXZjcHVfcHJpbnRmKHZjcHUsICIlczogdW5leHBlY3RlZCBjciAldVxuIiwgX19GVU5DVElPTl9fLCBjcik7CisJCXJldHVybiAwOworCX0KK30KKwordm9pZCByZWFsbW9kZV9zZXRfY3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3IsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgKnJmbGFncykKK3sKKwlzd2l0Y2ggKGNyKSB7CisJY2FzZSAwOgorCQlzZXRfY3IwKHZjcHUsIG1rX2NyXzY0KHZjcHUtPmNyMCwgdmFsKSk7CisJCSpyZmxhZ3MgPSBrdm1fYXJjaF9vcHMtPmdldF9yZmxhZ3ModmNwdSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmNwdS0+Y3IyID0gdmFsOworCQlicmVhazsKKwljYXNlIDM6CisJCXNldF9jcjModmNwdSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzZXRfY3I0KHZjcHUsIG1rX2NyXzY0KHZjcHUtPmNyNCwgdmFsKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZjcHVfcHJpbnRmKHZjcHUsICIlczogdW5leHBlY3RlZCBjciAldVxuIiwgX19GVU5DVElPTl9fLCBjcik7CisJfQorfQorCisvKgorICogUmVhZHMgYW4gbXNyIHZhbHVlIChvZiAnbXNyX2luZGV4JykgaW50byAncGRhdGEnLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi0wIG90aGVyd2lzZS4KKyAqIEFzc3VtZXMgdmNwdV9sb2FkKCkgd2FzIGFscmVhZHkgY2FsbGVkLgorICovCitzdGF0aWMgaW50IGdldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgbXNyX2luZGV4LCB1NjQgKnBkYXRhKQoreworCXJldHVybiBrdm1fYXJjaF9vcHMtPmdldF9tc3IodmNwdSwgbXNyX2luZGV4LCBwZGF0YSk7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisKK3ZvaWQgc2V0X2VmZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZWZlcikKK3sKKwlpZiAoZWZlciAmIEVGRVJfUkVTRVJWRURfQklUUykgeworCQlwcmludGsoS0VSTl9ERUJVRyAic2V0X2VmZXI6IDB4JWxseCAjR1AsIHJlc2VydmVkIGJpdHNcbiIsCisJCSAgICAgICBlZmVyKTsKKwkJaW5qZWN0X2dwKHZjcHUpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlzX3BhZ2luZyh2Y3B1KQorCSAgICAmJiAodmNwdS0+c2hhZG93X2VmZXIgJiBFRkVSX0xNRSkgIT0gKGVmZXIgJiBFRkVSX0xNRSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNldF9lZmVyOiAjR1AsIGNoYW5nZSBMTUUgd2hpbGUgcGFnaW5nXG4iKTsKKwkJaW5qZWN0X2dwKHZjcHUpOworCQlyZXR1cm47CisJfQorCisJa3ZtX2FyY2hfb3BzLT5zZXRfZWZlcih2Y3B1LCBlZmVyKTsKKworCWVmZXIgJj0gfkVGRVJfTE1BOworCWVmZXIgfD0gdmNwdS0+c2hhZG93X2VmZXIgJiBFRkVSX0xNQTsKKworCXZjcHUtPnNoYWRvd19lZmVyID0gZWZlcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9lZmVyKTsKKworI2VuZGlmCisKKy8qCisgKiBXcml0ZXMgbXNyIHZhbHVlIGludG8gaW50byB0aGUgYXBwcm9wcmlhdGUgInJlZ2lzdGVyIi4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBub24tMCBvdGhlcndpc2UuCisgKiBBc3N1bWVzIHZjcHVfbG9hZCgpIHdhcyBhbHJlYWR5IGNhbGxlZC4KKyAqLworc3RhdGljIGludCBzZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG1zcl9pbmRleCwgdTY0IGRhdGEpCit7CisJcmV0dXJuIGt2bV9hcmNoX29wcy0+c2V0X21zcih2Y3B1LCBtc3JfaW5kZXgsIGRhdGEpOworfQorCit2b2lkIGt2bV9yZXNjaGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2Y3B1X3B1dCh2Y3B1KTsKKwljb25kX3Jlc2NoZWQoKTsKKwkvKiBDYW5ub3QgZmFpbCAtICBubyB2Y3B1IHVucGx1ZyB5ZXQuICovCisJdmNwdV9sb2FkKHZjcHUtPmt2bSwgdmNwdV9zbG90KHZjcHUpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9yZXNjaGVkKTsKKwordm9pZCBsb2FkX21zcnMoc3RydWN0IHZteF9tc3JfZW50cnkgKmUsIGludCBuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJd3Jtc3JsKGVbaV0uaW5kZXgsIGVbaV0uZGF0YSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsb2FkX21zcnMpOworCit2b2lkIHNhdmVfbXNycyhzdHJ1Y3Qgdm14X21zcl9lbnRyeSAqZSwgaW50IG4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCQlyZG1zcmwoZVtpXS5pbmRleCwgZVtpXS5kYXRhKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNhdmVfbXNycyk7CisKK3N0YXRpYyBpbnQga3ZtX2Rldl9pb2N0bF9ydW4oc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJaW50IHI7CisKKwlpZiAoa3ZtX3J1bi0+dmNwdSA8IDAgfHwga3ZtX3J1bi0+dmNwdSA+PSBLVk1fTUFYX1ZDUFVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZjcHUgPSB2Y3B1X2xvYWQoa3ZtLCBrdm1fcnVuLT52Y3B1KTsKKwlpZiAoIXZjcHUpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKGt2bV9ydW4tPmVtdWxhdGVkKSB7CisJCWt2bV9hcmNoX29wcy0+c2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJa3ZtX3J1bi0+ZW11bGF0ZWQgPSAwOworCX0KKworCWlmIChrdm1fcnVuLT5tbWlvX2NvbXBsZXRlZCkgeworCQltZW1jcHkodmNwdS0+bW1pb19kYXRhLCBrdm1fcnVuLT5tbWlvLmRhdGEsIDgpOworCQl2Y3B1LT5tbWlvX3JlYWRfY29tcGxldGVkID0gMTsKKwl9CisKKwl2Y3B1LT5tbWlvX25lZWRlZCA9IDA7CisKKwlyID0ga3ZtX2FyY2hfb3BzLT5ydW4odmNwdSwga3ZtX3J1bik7CisKKwl2Y3B1X3B1dCh2Y3B1KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBrdm1fZGV2X2lvY3RsX2dldF9yZWdzKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKworCWlmIChyZWdzLT52Y3B1IDwgMCB8fCByZWdzLT52Y3B1ID49IEtWTV9NQVhfVkNQVVMpCisJCXJldHVybiAtRUlOVkFMOworCisJdmNwdSA9IHZjcHVfbG9hZChrdm0sIHJlZ3MtPnZjcHUpOworCWlmICghdmNwdSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlrdm1fYXJjaF9vcHMtPmNhY2hlX3JlZ3ModmNwdSk7CisKKwlyZWdzLT5yYXggPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SQVhdOworCXJlZ3MtPnJieCA9IHZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JCWF07CisJcmVncy0+cmN4ID0gdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkNYXTsKKwlyZWdzLT5yZHggPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SRFhdOworCXJlZ3MtPnJzaSA9IHZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JTSV07CisJcmVncy0+cmRpID0gdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkRJXTsKKwlyZWdzLT5yc3AgPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SU1BdOworCXJlZ3MtPnJicCA9IHZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JCUF07CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXJlZ3MtPnI4ID0gdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUjhdOworCXJlZ3MtPnI5ID0gdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUjldOworCXJlZ3MtPnIxMCA9IHZjcHUtPnJlZ3NbVkNQVV9SRUdTX1IxMF07CisJcmVncy0+cjExID0gdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUjExXTsKKwlyZWdzLT5yMTIgPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SMTJdOworCXJlZ3MtPnIxMyA9IHZjcHUtPnJlZ3NbVkNQVV9SRUdTX1IxM107CisJcmVncy0+cjE0ID0gdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUjE0XTsKKwlyZWdzLT5yMTUgPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SMTVdOworI2VuZGlmCisKKwlyZWdzLT5yaXAgPSB2Y3B1LT5yaXA7CisJcmVncy0+cmZsYWdzID0ga3ZtX2FyY2hfb3BzLT5nZXRfcmZsYWdzKHZjcHUpOworCisJLyoKKwkgKiBEb24ndCBsZWFrIGRlYnVnIGZsYWdzIGluIGNhc2UgdGhleSB3ZXJlIHNldCBmb3IgZ3Vlc3QgZGVidWdnaW5nCisJICovCisJaWYgKHZjcHUtPmd1ZXN0X2RlYnVnLmVuYWJsZWQgJiYgdmNwdS0+Z3Vlc3RfZGVidWcuc2luZ2xlc3RlcCkKKwkJcmVncy0+cmZsYWdzICY9IH4oWDg2X0VGTEFHU19URiB8IFg4Nl9FRkxBR1NfUkYpOworCisJdmNwdV9wdXQodmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrdm1fZGV2X2lvY3RsX3NldF9yZWdzKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKworCWlmIChyZWdzLT52Y3B1IDwgMCB8fCByZWdzLT52Y3B1ID49IEtWTV9NQVhfVkNQVVMpCisJCXJldHVybiAtRUlOVkFMOworCisJdmNwdSA9IHZjcHVfbG9hZChrdm0sIHJlZ3MtPnZjcHUpOworCWlmICghdmNwdSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SQVhdID0gcmVncy0+cmF4OworCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JCWF0gPSByZWdzLT5yYng7CisJdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkNYXSA9IHJlZ3MtPnJjeDsKKwl2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SRFhdID0gcmVncy0+cmR4OworCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JTSV0gPSByZWdzLT5yc2k7CisJdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkRJXSA9IHJlZ3MtPnJkaTsKKwl2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SU1BdID0gcmVncy0+cnNwOworCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JCUF0gPSByZWdzLT5yYnA7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1I4XSA9IHJlZ3MtPnI4OworCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1I5XSA9IHJlZ3MtPnI5OworCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1IxMF0gPSByZWdzLT5yMTA7CisJdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUjExXSA9IHJlZ3MtPnIxMTsKKwl2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SMTJdID0gcmVncy0+cjEyOworCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1IxM10gPSByZWdzLT5yMTM7CisJdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUjE0XSA9IHJlZ3MtPnIxNDsKKwl2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SMTVdID0gcmVncy0+cjE1OworI2VuZGlmCisKKwl2Y3B1LT5yaXAgPSByZWdzLT5yaXA7CisJa3ZtX2FyY2hfb3BzLT5zZXRfcmZsYWdzKHZjcHUsIHJlZ3MtPnJmbGFncyk7CisKKwlrdm1fYXJjaF9vcHMtPmRlY2FjaGVfcmVncyh2Y3B1KTsKKworCXZjcHVfcHV0KHZjcHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zZWdtZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCXN0cnVjdCBrdm1fc2VnbWVudCAqdmFyLCBpbnQgc2VnKQoreworCXJldHVybiBrdm1fYXJjaF9vcHMtPmdldF9zZWdtZW50KHZjcHUsIHZhciwgc2VnKTsKK30KKworc3RhdGljIGludCBrdm1fZGV2X2lvY3RsX2dldF9zcmVncyhzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fc3JlZ3MgKnNyZWdzKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwlzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSBkdDsKKworCWlmIChzcmVncy0+dmNwdSA8IDAgfHwgc3JlZ3MtPnZjcHUgPj0gS1ZNX01BWF9WQ1BVUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmNwdSA9IHZjcHVfbG9hZChrdm0sIHNyZWdzLT52Y3B1KTsKKwlpZiAoIXZjcHUpCisJCXJldHVybiAtRU5PRU5UOworCisJZ2V0X3NlZ21lbnQodmNwdSwgJnNyZWdzLT5jcywgVkNQVV9TUkVHX0NTKTsKKwlnZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPmRzLCBWQ1BVX1NSRUdfRFMpOworCWdldF9zZWdtZW50KHZjcHUsICZzcmVncy0+ZXMsIFZDUFVfU1JFR19FUyk7CisJZ2V0X3NlZ21lbnQodmNwdSwgJnNyZWdzLT5mcywgVkNQVV9TUkVHX0ZTKTsKKwlnZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPmdzLCBWQ1BVX1NSRUdfR1MpOworCWdldF9zZWdtZW50KHZjcHUsICZzcmVncy0+c3MsIFZDUFVfU1JFR19TUyk7CisKKwlnZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPnRyLCBWQ1BVX1NSRUdfVFIpOworCWdldF9zZWdtZW50KHZjcHUsICZzcmVncy0+bGR0LCBWQ1BVX1NSRUdfTERUUik7CisKKwlrdm1fYXJjaF9vcHMtPmdldF9pZHQodmNwdSwgJmR0KTsKKwlzcmVncy0+aWR0LmxpbWl0ID0gZHQubGltaXQ7CisJc3JlZ3MtPmlkdC5iYXNlID0gZHQuYmFzZTsKKwlrdm1fYXJjaF9vcHMtPmdldF9nZHQodmNwdSwgJmR0KTsKKwlzcmVncy0+Z2R0LmxpbWl0ID0gZHQubGltaXQ7CisJc3JlZ3MtPmdkdC5iYXNlID0gZHQuYmFzZTsKKworCXNyZWdzLT5jcjAgPSB2Y3B1LT5jcjA7CisJc3JlZ3MtPmNyMiA9IHZjcHUtPmNyMjsKKwlzcmVncy0+Y3IzID0gdmNwdS0+Y3IzOworCXNyZWdzLT5jcjQgPSB2Y3B1LT5jcjQ7CisJc3JlZ3MtPmNyOCA9IHZjcHUtPmNyODsKKwlzcmVncy0+ZWZlciA9IHZjcHUtPnNoYWRvd19lZmVyOworCXNyZWdzLT5hcGljX2Jhc2UgPSB2Y3B1LT5hcGljX2Jhc2U7CisKKwltZW1jcHkoc3JlZ3MtPmludGVycnVwdF9iaXRtYXAsIHZjcHUtPmlycV9wZW5kaW5nLAorCSAgICAgICBzaXplb2Ygc3JlZ3MtPmludGVycnVwdF9iaXRtYXApOworCisJdmNwdV9wdXQodmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3NlZ21lbnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJc3RydWN0IGt2bV9zZWdtZW50ICp2YXIsIGludCBzZWcpCit7CisJcmV0dXJuIGt2bV9hcmNoX29wcy0+c2V0X3NlZ21lbnQodmNwdSwgdmFyLCBzZWcpOworfQorCitzdGF0aWMgaW50IGt2bV9kZXZfaW9jdGxfc2V0X3NyZWdzKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9zcmVncyAqc3JlZ3MpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCWludCBtbXVfcmVzZXRfbmVlZGVkID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSBkdDsKKworCWlmIChzcmVncy0+dmNwdSA8IDAgfHwgc3JlZ3MtPnZjcHUgPj0gS1ZNX01BWF9WQ1BVUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmNwdSA9IHZjcHVfbG9hZChrdm0sIHNyZWdzLT52Y3B1KTsKKwlpZiAoIXZjcHUpCisJCXJldHVybiAtRU5PRU5UOworCisJc2V0X3NlZ21lbnQodmNwdSwgJnNyZWdzLT5jcywgVkNQVV9TUkVHX0NTKTsKKwlzZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPmRzLCBWQ1BVX1NSRUdfRFMpOworCXNldF9zZWdtZW50KHZjcHUsICZzcmVncy0+ZXMsIFZDUFVfU1JFR19FUyk7CisJc2V0X3NlZ21lbnQodmNwdSwgJnNyZWdzLT5mcywgVkNQVV9TUkVHX0ZTKTsKKwlzZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPmdzLCBWQ1BVX1NSRUdfR1MpOworCXNldF9zZWdtZW50KHZjcHUsICZzcmVncy0+c3MsIFZDUFVfU1JFR19TUyk7CisKKwlzZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPnRyLCBWQ1BVX1NSRUdfVFIpOworCXNldF9zZWdtZW50KHZjcHUsICZzcmVncy0+bGR0LCBWQ1BVX1NSRUdfTERUUik7CisKKwlkdC5saW1pdCA9IHNyZWdzLT5pZHQubGltaXQ7CisJZHQuYmFzZSA9IHNyZWdzLT5pZHQuYmFzZTsKKwlrdm1fYXJjaF9vcHMtPnNldF9pZHQodmNwdSwgJmR0KTsKKwlkdC5saW1pdCA9IHNyZWdzLT5nZHQubGltaXQ7CisJZHQuYmFzZSA9IHNyZWdzLT5nZHQuYmFzZTsKKwlrdm1fYXJjaF9vcHMtPnNldF9nZHQodmNwdSwgJmR0KTsKKworCXZjcHUtPmNyMiA9IHNyZWdzLT5jcjI7CisJbW11X3Jlc2V0X25lZWRlZCB8PSB2Y3B1LT5jcjMgIT0gc3JlZ3MtPmNyMzsKKwl2Y3B1LT5jcjMgPSBzcmVncy0+Y3IzOworCisJdmNwdS0+Y3I4ID0gc3JlZ3MtPmNyODsKKworCW1tdV9yZXNldF9uZWVkZWQgfD0gdmNwdS0+c2hhZG93X2VmZXIgIT0gc3JlZ3MtPmVmZXI7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCWt2bV9hcmNoX29wcy0+c2V0X2VmZXIodmNwdSwgc3JlZ3MtPmVmZXIpOworI2VuZGlmCisJdmNwdS0+YXBpY19iYXNlID0gc3JlZ3MtPmFwaWNfYmFzZTsKKworCW1tdV9yZXNldF9uZWVkZWQgfD0gdmNwdS0+Y3IwICE9IHNyZWdzLT5jcjA7CisJa3ZtX2FyY2hfb3BzLT5zZXRfY3IwX25vX21vZGVzd2l0Y2godmNwdSwgc3JlZ3MtPmNyMCk7CisKKwltbXVfcmVzZXRfbmVlZGVkIHw9IHZjcHUtPmNyNCAhPSBzcmVncy0+Y3I0OworCWt2bV9hcmNoX29wcy0+c2V0X2NyNCh2Y3B1LCBzcmVncy0+Y3I0KTsKKworCWlmIChtbXVfcmVzZXRfbmVlZGVkKQorCQlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CisKKwltZW1jcHkodmNwdS0+aXJxX3BlbmRpbmcsIHNyZWdzLT5pbnRlcnJ1cHRfYml0bWFwLAorCSAgICAgICBzaXplb2YgdmNwdS0+aXJxX3BlbmRpbmcpOworCXZjcHUtPmlycV9zdW1tYXJ5ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRX1dPUkRTOyArK2kpCisJCWlmICh2Y3B1LT5pcnFfcGVuZGluZ1tpXSkKKwkJCV9fc2V0X2JpdChpLCAmdmNwdS0+aXJxX3N1bW1hcnkpOworCisJdmNwdV9wdXQodmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExpc3Qgb2YgbXNyIG51bWJlcnMgd2hpY2ggd2UgZXhwb3NlIHRvIHVzZXJzcGFjZSB0aHJvdWdoIEtWTV9HRVRfTVNSUworICogYW5kIEtWTV9TRVRfTVNSUywgYW5kIEtWTV9HRVRfTVNSX0lOREVYX0xJU1QuCisgKi8KK3N0YXRpYyB1MzIgbXNyc190b19zYXZlW10gPSB7CisJTVNSX0lBMzJfU1lTRU5URVJfQ1MsIE1TUl9JQTMyX1NZU0VOVEVSX0VTUCwgTVNSX0lBMzJfU1lTRU5URVJfRUlQLAorCU1TUl9LNl9TVEFSLAorI2lmZGVmIENPTkZJR19YODZfNjQKKwlNU1JfQ1NUQVIsIE1TUl9LRVJORUxfR1NfQkFTRSwgTVNSX1NZU0NBTExfTUFTSywgTVNSX0xTVEFSLAorI2VuZGlmCisJTVNSX0lBMzJfVElNRV9TVEFNUF9DT1VOVEVSLAorfTsKKworCisvKgorICogQWRhcHQgc2V0X21zcigpIHRvIG1zcl9pbygpJ3MgY2FsbGluZyBjb252ZW50aW9uCisgKi8KK3N0YXRpYyBpbnQgZG9fc2V0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGluZGV4LCB1NjQgKmRhdGEpCit7CisJcmV0dXJuIHNldF9tc3IodmNwdSwgaW5kZXgsICpkYXRhKTsKK30KKworLyoKKyAqIFJlYWQgb3Igd3JpdGUgYSBidW5jaCBvZiBtc3JzLiBBbGwgcGFyYW1ldGVycyBhcmUga2VybmVsIGFkZHJlc3Nlcy4KKyAqCisgKiBAcmV0dXJuIG51bWJlciBvZiBtc3JzIHNldCBzdWNjZXNzZnVsbHkuCisgKi8KK3N0YXRpYyBpbnQgX19tc3JfaW8oc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21zcnMgKm1zcnMsCisJCSAgICBzdHJ1Y3Qga3ZtX21zcl9lbnRyeSAqZW50cmllcywKKwkJICAgIGludCAoKmRvX21zcikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgdW5zaWduZWQgaW5kZXgsIHU2NCAqZGF0YSkpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCWludCBpOworCisJaWYgKG1zcnMtPnZjcHUgPCAwIHx8IG1zcnMtPnZjcHUgPj0gS1ZNX01BWF9WQ1BVUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2Y3B1ID0gdmNwdV9sb2FkKGt2bSwgbXNycy0+dmNwdSk7CisJaWYgKCF2Y3B1KQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWZvciAoaSA9IDA7IGkgPCBtc3JzLT5ubXNyczsgKytpKQorCQlpZiAoZG9fbXNyKHZjcHUsIGVudHJpZXNbaV0uaW5kZXgsICZlbnRyaWVzW2ldLmRhdGEpKQorCQkJYnJlYWs7CisKKwl2Y3B1X3B1dCh2Y3B1KTsKKworCXJldHVybiBpOworfQorCisvKgorICogUmVhZCBvciB3cml0ZSBhIGJ1bmNoIG9mIG1zcnMuIFBhcmFtZXRlcnMgYXJlIHVzZXIgYWRkcmVzc2VzLgorICoKKyAqIEByZXR1cm4gbnVtYmVyIG9mIG1zcnMgc2V0IHN1Y2Nlc3NmdWxseS4KKyAqLworc3RhdGljIGludCBtc3JfaW8oc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21zcnMgX191c2VyICp1c2VyX21zcnMsCisJCSAgaW50ICgqZG9fbXNyKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJdW5zaWduZWQgaW5kZXgsIHU2NCAqZGF0YSksCisJCSAgaW50IHdyaXRlYmFjaykKK3sKKwlzdHJ1Y3Qga3ZtX21zcnMgbXNyczsKKwlzdHJ1Y3Qga3ZtX21zcl9lbnRyeSAqZW50cmllczsKKwlpbnQgciwgbjsKKwl1bnNpZ25lZCBzaXplOworCisJciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZtc3JzLCB1c2VyX21zcnMsIHNpemVvZiBtc3JzKSkKKwkJZ290byBvdXQ7CisKKwlyID0gLUUyQklHOworCWlmIChtc3JzLm5tc3JzID49IE1BWF9JT19NU1JTKQorCQlnb3RvIG91dDsKKworCXIgPSAtRU5PTUVNOworCXNpemUgPSBzaXplb2Yoc3RydWN0IGt2bV9tc3JfZW50cnkpICogbXNycy5ubXNyczsKKwllbnRyaWVzID0gdm1hbGxvYyhzaXplKTsKKwlpZiAoIWVudHJpZXMpCisJCWdvdG8gb3V0OworCisJciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKGVudHJpZXMsIHVzZXJfbXNycy0+ZW50cmllcywgc2l6ZSkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyID0gbiA9IF9fbXNyX2lvKGt2bSwgJm1zcnMsIGVudHJpZXMsIGRvX21zcik7CisJaWYgKHIgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJciA9IC1FRkFVTFQ7CisJaWYgKHdyaXRlYmFjayAmJiBjb3B5X3RvX3VzZXIodXNlcl9tc3JzLT5lbnRyaWVzLCBlbnRyaWVzLCBzaXplKSkKKwkJZ290byBvdXRfZnJlZTsKKworCXIgPSBuOworCitvdXRfZnJlZToKKwl2ZnJlZShlbnRyaWVzKTsKK291dDoKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIFRyYW5zbGF0ZSBhIGd1ZXN0IHZpcnR1YWwgYWRkcmVzcyB0byBhIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBpbnQga3ZtX2Rldl9pb2N0bF90cmFuc2xhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX3RyYW5zbGF0aW9uICp0cikKK3sKKwl1bnNpZ25lZCBsb25nIHZhZGRyID0gdHItPmxpbmVhcl9hZGRyZXNzOworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwlncGFfdCBncGE7CisKKwl2Y3B1ID0gdmNwdV9sb2FkKGt2bSwgdHItPnZjcHUpOworCWlmICghdmNwdSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJc3Bpbl9sb2NrKCZrdm0tPmxvY2spOworCWdwYSA9IHZjcHUtPm1tdS5ndmFfdG9fZ3BhKHZjcHUsIHZhZGRyKTsKKwl0ci0+cGh5c2ljYWxfYWRkcmVzcyA9IGdwYTsKKwl0ci0+dmFsaWQgPSBncGEgIT0gVU5NQVBQRURfR1ZBOworCXRyLT53cml0ZWFibGUgPSAxOworCXRyLT51c2VybW9kZSA9IDA7CisJc3Bpbl91bmxvY2soJmt2bS0+bG9jayk7CisJdmNwdV9wdXQodmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrdm1fZGV2X2lvY3RsX2ludGVycnVwdChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1faW50ZXJydXB0ICppcnEpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCisJaWYgKGlycS0+dmNwdSA8IDAgfHwgaXJxLT52Y3B1ID49IEtWTV9NQVhfVkNQVVMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpcnEtPmlycSA8IDAgfHwgaXJxLT5pcnEgPj0gMjU2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwl2Y3B1ID0gdmNwdV9sb2FkKGt2bSwgaXJxLT52Y3B1KTsKKwlpZiAoIXZjcHUpCisJCXJldHVybiAtRU5PRU5UOworCisJc2V0X2JpdChpcnEtPmlycSwgdmNwdS0+aXJxX3BlbmRpbmcpOworCXNldF9iaXQoaXJxLT5pcnEgLyBCSVRTX1BFUl9MT05HLCAmdmNwdS0+aXJxX3N1bW1hcnkpOworCisJdmNwdV9wdXQodmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrdm1fZGV2X2lvY3RsX2RlYnVnX2d1ZXN0KHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkgICAgIHN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QgKmRiZykKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJaW50IHI7CisKKwlpZiAoZGJnLT52Y3B1IDwgMCB8fCBkYmctPnZjcHUgPj0gS1ZNX01BWF9WQ1BVUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmNwdSA9IHZjcHVfbG9hZChrdm0sIGRiZy0+dmNwdSk7CisJaWYgKCF2Y3B1KQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXIgPSBrdm1fYXJjaF9vcHMtPnNldF9ndWVzdF9kZWJ1Zyh2Y3B1LCBkYmcpOworCisJdmNwdV9wdXQodmNwdSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGxvbmcga3ZtX2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgdW5zaWduZWQgaW50IGlvY3RsLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qga3ZtICprdm0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHIgPSAtRUlOVkFMOworCisJc3dpdGNoIChpb2N0bCkgeworCWNhc2UgS1ZNX0NSRUFURV9WQ1BVOiB7CisJCXIgPSBrdm1fZGV2X2lvY3RsX2NyZWF0ZV92Y3B1KGt2bSwgYXJnKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQorCWNhc2UgS1ZNX1JVTjogeworCQlzdHJ1Y3Qga3ZtX3J1biBrdm1fcnVuOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9ydW4sICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3J1bikpCisJCQlnb3RvIG91dDsKKwkJciA9IGt2bV9kZXZfaW9jdGxfcnVuKGt2bSwgJmt2bV9ydW4pOworCQlpZiAociA8IDApCisJCQlnb3RvIG91dDsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZrdm1fcnVuLCBzaXplb2Yga3ZtX3J1bikpCisJCQlnb3RvIG91dDsKKwkJciA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIEtWTV9HRVRfUkVHUzogeworCQlzdHJ1Y3Qga3ZtX3JlZ3Mga3ZtX3JlZ3M7CisKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3JlZ3MsICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3JlZ3MpKQorCQkJZ290byBvdXQ7CisJCXIgPSBrdm1fZGV2X2lvY3RsX2dldF9yZWdzKGt2bSwgJmt2bV9yZWdzKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZrdm1fcmVncywgc2l6ZW9mIGt2bV9yZWdzKSkKKwkJCWdvdG8gb3V0OworCQlyID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgS1ZNX1NFVF9SRUdTOiB7CisJCXN0cnVjdCBrdm1fcmVncyBrdm1fcmVnczsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fcmVncywgKHZvaWQgKilhcmcsIHNpemVvZiBrdm1fcmVncykpCisJCQlnb3RvIG91dDsKKwkJciA9IGt2bV9kZXZfaW9jdGxfc2V0X3JlZ3Moa3ZtLCAma3ZtX3JlZ3MpOworCQlpZiAocikKKwkJCWdvdG8gb3V0OworCQlyID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgS1ZNX0dFVF9TUkVHUzogeworCQlzdHJ1Y3Qga3ZtX3NyZWdzIGt2bV9zcmVnczsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrdm1fc3JlZ3MsICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX3NyZWdzKSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX2Rldl9pb2N0bF9nZXRfc3JlZ3Moa3ZtLCAma3ZtX3NyZWdzKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZrdm1fc3JlZ3MsIHNpemVvZiBrdm1fc3JlZ3MpKQorCQkJZ290byBvdXQ7CisJCXIgPSAwOworCQlicmVhazsKKwl9CisJY2FzZSBLVk1fU0VUX1NSRUdTOiB7CisJCXN0cnVjdCBrdm1fc3JlZ3Mga3ZtX3NyZWdzOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9zcmVncywgKHZvaWQgKilhcmcsIHNpemVvZiBrdm1fc3JlZ3MpKQorCQkJZ290byBvdXQ7CisJCXIgPSBrdm1fZGV2X2lvY3RsX3NldF9zcmVncyhrdm0sICZrdm1fc3JlZ3MpOworCQlpZiAocikKKwkJCWdvdG8gb3V0OworCQlyID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgS1ZNX1RSQU5TTEFURTogeworCQlzdHJ1Y3Qga3ZtX3RyYW5zbGF0aW9uIHRyOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnRyLCAodm9pZCAqKWFyZywgc2l6ZW9mIHRyKSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX2Rldl9pb2N0bF90cmFuc2xhdGUoa3ZtLCAmdHIpOworCQlpZiAocikKKwkJCWdvdG8gb3V0OworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnRyLCBzaXplb2YgdHIpKQorCQkJZ290byBvdXQ7CisJCXIgPSAwOworCQlicmVhazsKKwl9CisJY2FzZSBLVk1fSU5URVJSVVBUOiB7CisJCXN0cnVjdCBrdm1faW50ZXJydXB0IGlycTsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpcnEsICh2b2lkICopYXJnLCBzaXplb2YgaXJxKSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX2Rldl9pb2N0bF9pbnRlcnJ1cHQoa3ZtLCAmaXJxKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKwkJciA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIEtWTV9ERUJVR19HVUVTVDogeworCQlzdHJ1Y3Qga3ZtX2RlYnVnX2d1ZXN0IGRiZzsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYmcsICh2b2lkICopYXJnLCBzaXplb2YgZGJnKSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX2Rldl9pb2N0bF9kZWJ1Z19ndWVzdChrdm0sICZkYmcpOworCQlpZiAocikKKwkJCWdvdG8gb3V0OworCQlyID0gMDsKKwkJYnJlYWs7CisJfQorCWNhc2UgS1ZNX1NFVF9NRU1PUllfUkVHSU9OOiB7CisJCXN0cnVjdCBrdm1fbWVtb3J5X3JlZ2lvbiBrdm1fbWVtOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmt2bV9tZW0sICh2b2lkICopYXJnLCBzaXplb2Yga3ZtX21lbSkpCisJCQlnb3RvIG91dDsKKwkJciA9IGt2bV9kZXZfaW9jdGxfc2V0X21lbW9yeV9yZWdpb24oa3ZtLCAma3ZtX21lbSk7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIEtWTV9HRVRfRElSVFlfTE9HOiB7CisJCXN0cnVjdCBrdm1fZGlydHlfbG9nIGxvZzsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZsb2csICh2b2lkICopYXJnLCBzaXplb2YgbG9nKSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX2Rldl9pb2N0bF9nZXRfZGlydHlfbG9nKGt2bSwgJmxvZyk7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIEtWTV9HRVRfTVNSUzoKKwkJciA9IG1zcl9pbyhrdm0sICh2b2lkIF9fdXNlciAqKWFyZywgZ2V0X21zciwgMSk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1NFVF9NU1JTOgorCQlyID0gbXNyX2lvKGt2bSwgKHZvaWQgX191c2VyICopYXJnLCBkb19zZXRfbXNyLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fR0VUX01TUl9JTkRFWF9MSVNUOiB7CisJCXN0cnVjdCBrdm1fbXNyX2xpc3QgX191c2VyICp1c2VyX21zcl9saXN0ID0gKHZvaWQgX191c2VyICopYXJnOworCQlzdHJ1Y3Qga3ZtX21zcl9saXN0IG1zcl9saXN0OworCQl1bnNpZ25lZCBuOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm1zcl9saXN0LCB1c2VyX21zcl9saXN0LCBzaXplb2YgbXNyX2xpc3QpKQorCQkJZ290byBvdXQ7CisJCW4gPSBtc3JfbGlzdC5ubXNyczsKKwkJbXNyX2xpc3Qubm1zcnMgPSBBUlJBWV9TSVpFKG1zcnNfdG9fc2F2ZSk7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9tc3JfbGlzdCwgJm1zcl9saXN0LCBzaXplb2YgbXNyX2xpc3QpKQorCQkJZ290byBvdXQ7CisJCXIgPSAtRTJCSUc7CisJCWlmIChuIDwgQVJSQVlfU0laRShtc3JzX3RvX3NhdmUpKQorCQkJZ290byBvdXQ7CisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV90b191c2VyKHVzZXJfbXNyX2xpc3QtPmluZGljZXMsICZtc3JzX3RvX3NhdmUsCisJCQkJIHNpemVvZiBtc3JzX3RvX3NhdmUpKQorCQkJZ290byBvdXQ7CisJCXIgPSAwOworCX0KKwlkZWZhdWx0OgorCQk7CisJfQorb3V0OgorCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmt2bV9kZXZfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICBpbnQgKnR5cGUpCit7CisJc3RydWN0IGt2bSAqa3ZtID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBwZ29mZjsKKwlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90OworCXN0cnVjdCBwYWdlICpwYWdlOworCisJKnR5cGUgPSBWTV9GQVVMVF9NSU5PUjsKKwlwZ29mZiA9ICgoYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpICsgdm1hLT52bV9wZ29mZjsKKwlzbG90ID0gZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBwZ29mZik7CisJaWYgKCFzbG90KQorCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsKKwlwYWdlID0gZ2ZuX3RvX3BhZ2Uoc2xvdCwgcGdvZmYpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5PUEFHRV9TSUdCVVM7CisJZ2V0X3BhZ2UocGFnZSk7CisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qga3ZtX2Rldl92bV9vcHMgPSB7CisJLm5vcGFnZSA9IGt2bV9kZXZfbm9wYWdlLAorfTsKKworc3RhdGljIGludCBrdm1fZGV2X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXZtYS0+dm1fb3BzID0gJmt2bV9kZXZfdm1fb3BzOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrdm1fY2hhcmRldl9vcHMgPSB7CisJLm9wZW4JCT0ga3ZtX2Rldl9vcGVuLAorCS5yZWxlYXNlICAgICAgICA9IGt2bV9kZXZfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBrdm1fZGV2X2lvY3RsLAorCS5jb21wYXRfaW9jdGwgICA9IGt2bV9kZXZfaW9jdGwsCisJLm1tYXAgICAgICAgICAgID0ga3ZtX2Rldl9tbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGt2bV9kZXYgPSB7CisJTUlTQ19EWU5BTUlDX01JTk9SLAorCSJrdm0iLAorCSZrdm1fY2hhcmRldl9vcHMsCit9OworCitzdGF0aWMgaW50IGt2bV9yZWJvb3Qoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwgdW5zaWduZWQgbG9uZyB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnYpCit7CisJaWYgKHZhbCA9PSBTWVNfUkVTVEFSVCkgeworCQkvKgorCQkgKiBTb21lICh3ZWxsLCBhdCBsZWFzdCBtaW5lKSBCSU9TZXMgaGFuZyBvbiByZWJvb3QgaWYKKwkJICogaW4gdm14IHJvb3QgbW9kZS4KKwkJICovCisJCXByaW50ayhLRVJOX0lORk8gImt2bTogZXhpdGluZyBoYXJkd2FyZSB2aXJ0dWFsaXphdGlvblxuIik7CisJCW9uX2VhY2hfY3B1KGt2bV9hcmNoX29wcy0+aGFyZHdhcmVfZGlzYWJsZSwgMCwgMCwgMSk7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3ZtX3JlYm9vdF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGt2bV9yZWJvb3QsCisJLnByaW9yaXR5ID0gMCwKK307CisKK3N0YXRpYyBfX2luaXQgdm9pZCBrdm1faW5pdF9kZWJ1Zyh2b2lkKQoreworCXN0cnVjdCBrdm1fc3RhdHNfZGVidWdmc19pdGVtICpwOworCisJZGVidWdmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImt2bSIsIDApOworCWZvciAocCA9IGRlYnVnZnNfZW50cmllczsgcC0+bmFtZTsgKytwKQorCQlwLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIocC0+bmFtZSwgMDQ0NCwgZGVidWdmc19kaXIsCisJCQkJCSAgICAgICBwLT5kYXRhKTsKK30KKworc3RhdGljIHZvaWQga3ZtX2V4aXRfZGVidWcodm9pZCkKK3sKKwlzdHJ1Y3Qga3ZtX3N0YXRzX2RlYnVnZnNfaXRlbSAqcDsKKworCWZvciAocCA9IGRlYnVnZnNfZW50cmllczsgcC0+bmFtZTsgKytwKQorCQlkZWJ1Z2ZzX3JlbW92ZShwLT5kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlKGRlYnVnZnNfZGlyKTsKK30KKworaHBhX3QgYmFkX3BhZ2VfYWRkcmVzczsKKworaW50IGt2bV9pbml0X2FyY2goc3RydWN0IGt2bV9hcmNoX29wcyAqb3BzLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCit7CisJaW50IHI7CisKKwlrdm1fYXJjaF9vcHMgPSBvcHM7CisKKwlpZiAoIWt2bV9hcmNoX29wcy0+Y3B1X2hhc19rdm1fc3VwcG9ydCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAia3ZtOiBubyBoYXJkd2FyZSBzdXBwb3J0XG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlpZiAoa3ZtX2FyY2hfb3BzLT5kaXNhYmxlZF9ieV9iaW9zKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJrdm06IGRpc2FibGVkIGJ5IGJpb3NcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJciA9IGt2bV9hcmNoX29wcy0+aGFyZHdhcmVfc2V0dXAoKTsKKwlpZiAociA8IDApCisJICAgIHJldHVybiByOworCisJb25fZWFjaF9jcHUoa3ZtX2FyY2hfb3BzLT5oYXJkd2FyZV9lbmFibGUsIDAsIDAsIDEpOworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigma3ZtX3JlYm9vdF9ub3RpZmllcik7CisKKwlrdm1fY2hhcmRldl9vcHMub3duZXIgPSBtb2R1bGU7CisKKwlyID0gbWlzY19yZWdpc3Rlcigma3ZtX2Rldik7CisJaWYgKHIpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAia3ZtOiBtaXNjIGRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXJldHVybiByOworCitvdXRfZnJlZToKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigma3ZtX3JlYm9vdF9ub3RpZmllcik7CisJb25fZWFjaF9jcHUoa3ZtX2FyY2hfb3BzLT5oYXJkd2FyZV9kaXNhYmxlLCAwLCAwLCAxKTsKKwlrdm1fYXJjaF9vcHMtPmhhcmR3YXJlX3Vuc2V0dXAoKTsKKwlyZXR1cm4gcjsKK30KKwordm9pZCBrdm1fZXhpdF9hcmNoKHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZrdm1fZGV2KTsKKworCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZrdm1fcmVib290X25vdGlmaWVyKTsKKwlvbl9lYWNoX2NwdShrdm1fYXJjaF9vcHMtPmhhcmR3YXJlX2Rpc2FibGUsIDAsIDAsIDEpOworCWt2bV9hcmNoX29wcy0+aGFyZHdhcmVfdW5zZXR1cCgpOworfQorCitzdGF0aWMgX19pbml0IGludCBrdm1faW5pdCh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3QgcGFnZSAqYmFkX3BhZ2U7CisJaW50IHIgPSAwOworCisJa3ZtX2luaXRfZGVidWcoKTsKKworCWlmICgoYmFkX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwliYWRfcGFnZV9hZGRyZXNzID0gcGFnZV90b19wZm4oYmFkX3BhZ2UpIDw8IFBBR0VfU0hJRlQ7CisJbWVtc2V0KF9fdmEoYmFkX3BhZ2VfYWRkcmVzcyksIDAsIFBBR0VfU0laRSk7CisKKwlyZXR1cm4gcjsKKworb3V0OgorCWt2bV9leGl0X2RlYnVnKCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBrdm1fZXhpdCh2b2lkKQoreworCWt2bV9leGl0X2RlYnVnKCk7CisJX19mcmVlX3BhZ2UocGZuX3RvX3BhZ2UoYmFkX3BhZ2VfYWRkcmVzcyA+PiBQQUdFX1NISUZUKSk7Cit9CisKK21vZHVsZV9pbml0KGt2bV9pbml0KQorbW9kdWxlX2V4aXQoa3ZtX2V4aXQpCisKK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9pbml0X2FyY2gpOworRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2V4aXRfYXJjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2t2bS9rdm1fc3ZtLmggYi9kcml2ZXJzL2t2bS9rdm1fc3ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjYzg2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMva3ZtL2t2bV9zdm0uaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9fS1ZNX1NWTV9ICisjZGVmaW5lIF9fS1ZNX1NWTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKyNpbmNsdWRlICJzdm0uaCIKKyNpbmNsdWRlICJrdm0uaCIKKworc3RhdGljIGNvbnN0IHUzMiBob3N0X3NhdmVfbXNyc1tdID0geworI2lmZGVmIENPTkZJR19YODZfNjQKKwlNU1JfU1RBUiwgTVNSX0xTVEFSLCBNU1JfQ1NUQVIsIE1TUl9TWVNDQUxMX01BU0ssIE1TUl9LRVJORUxfR1NfQkFTRSwKKwlNU1JfRlNfQkFTRSwgTVNSX0dTX0JBU0UsCisjZW5kaWYKKwlNU1JfSUEzMl9TWVNFTlRFUl9DUywgTVNSX0lBMzJfU1lTRU5URVJfRVNQLCBNU1JfSUEzMl9TWVNFTlRFUl9FSVAsCisJTVNSX0lBMzJfREVCVUdDVExNU1IsIC8qTVNSX0lBMzJfTEFTVEJSQU5DSEZST01JUCwKKwlNU1JfSUEzMl9MQVNUQlJBTkNIVE9JUCwgTVNSX0lBMzJfTEFTVElOVEZST01JUCxNU1JfSUEzMl9MQVNUSU5UVE9JUCwqLworfTsKKworI2RlZmluZSBOUl9IT1NUX1NBVkVfTVNSUyAoc2l6ZW9mKGhvc3Rfc2F2ZV9tc3JzKSAvIHNpemVvZigqaG9zdF9zYXZlX21zcnMpKQorI2RlZmluZSBOVU1fREJfUkVHUyA0CisKK3N0cnVjdCB2Y3B1X3N2bSB7CisJc3RydWN0IHZtY2IgKnZtY2I7CisJdW5zaWduZWQgbG9uZyB2bWNiX3BhOworCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnN2bV9kYXRhOworCXVpbnQ2NF90IGFzaWRfZ2VuZXJhdGlvbjsKKworCXVuc2lnbmVkIGxvbmcgY3IwOworCXVuc2lnbmVkIGxvbmcgY3I0OworCXVuc2lnbmVkIGxvbmcgZGJfcmVnc1tOVU1fREJfUkVHU107CisKKwl1NjQgbmV4dF9yaXA7CisKKwl1NjQgaG9zdF9tc3JzW05SX0hPU1RfU0FWRV9NU1JTXTsKKwl1bnNpZ25lZCBsb25nIGhvc3RfY3IyOworCXVuc2lnbmVkIGxvbmcgaG9zdF9kYl9yZWdzW05VTV9EQl9SRUdTXTsKKwl1bnNpZ25lZCBsb25nIGhvc3RfZHI2OworCXVuc2lnbmVkIGxvbmcgaG9zdF9kcjc7Cit9OworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0va3ZtX3ZteC5oIGIvZHJpdmVycy9rdm0va3ZtX3ZteC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzlmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2t2bS9rdm1fdm14LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfX0tWTV9WTVhfSAorI2RlZmluZSBfX0tWTV9WTVhfSAorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorLyoKKyAqIGF2b2lkIHNhdmUvbG9hZCBNU1JfU1lTQ0FMTF9NQVNLIGFuZCBNU1JfTFNUQVIgYnkgc3RkIHZ0CisgKiBtZWNoYW5pc20gKGNwdSBidWcgQUEyNCkKKyAqLworI2RlZmluZSBOUl9CQURfTVNSUyAyCisjZWxzZQorI2RlZmluZSBOUl9CQURfTVNSUyAwCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2t2bS9tbXUuYyBiL2RyaXZlcnMva3ZtL21tdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzY3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2t2bS9tbXUuYwpAQCAtMCwwICsxLDY4NiBAQAorLyoKKyAqIEtlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIFRoaXMgbW9kdWxlIGVuYWJsZXMgbWFjaGluZXMgd2l0aCBJbnRlbCBWVC14IGV4dGVuc2lvbnMgdG8gcnVuIHZpcnR1YWwKKyAqIG1hY2hpbmVzIHdpdGhvdXQgZW11bGF0aW9uIG9yIGJpbmFyeSB0cmFuc2xhdGlvbi4KKyAqCisgKiBNTVUgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBRdW1yYW5ldCwgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgIFlhbml2IEthbWF5ICA8eWFuaXZAcXVtcmFuZXQuY29tPgorICogICBBdmkgS2l2aXR5ICAgPGF2aUBxdW1yYW5ldC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgInZteC5oIgorI2luY2x1ZGUgImt2bS5oIgorCisjZGVmaW5lIHBncHJpbnRrKHguLi4pIGRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBBU1NFUlQoeCkJCQkJCQkJXAorCWlmICghKHgpKSB7CQkJCQkJCVwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXNzZXJ0aW9uIGZhaWxlZCAlczolZDogJXNcbiIsCVwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI3gpOwkJCQlcCisJfQorCisjZGVmaW5lIFBUNjRfRU5UX1BFUl9QQUdFIDUxMgorI2RlZmluZSBQVDMyX0VOVF9QRVJfUEFHRSAxMDI0CisKKyNkZWZpbmUgUFRfV1JJVEFCTEVfU0hJRlQgMQorCisjZGVmaW5lIFBUX1BSRVNFTlRfTUFTSyAoMVVMTCA8PCAwKQorI2RlZmluZSBQVF9XUklUQUJMRV9NQVNLICgxVUxMIDw8IFBUX1dSSVRBQkxFX1NISUZUKQorI2RlZmluZSBQVF9VU0VSX01BU0sgKDFVTEwgPDwgMikKKyNkZWZpbmUgUFRfUFdUX01BU0sgKDFVTEwgPDwgMykKKyNkZWZpbmUgUFRfUENEX01BU0sgKDFVTEwgPDwgNCkKKyNkZWZpbmUgUFRfQUNDRVNTRURfTUFTSyAoMVVMTCA8PCA1KQorI2RlZmluZSBQVF9ESVJUWV9NQVNLICgxVUxMIDw8IDYpCisjZGVmaW5lIFBUX1BBR0VfU0laRV9NQVNLICgxVUxMIDw8IDcpCisjZGVmaW5lIFBUX1BBVF9NQVNLICgxVUxMIDw8IDcpCisjZGVmaW5lIFBUX0dMT0JBTF9NQVNLICgxVUxMIDw8IDgpCisjZGVmaW5lIFBUNjRfTlhfTUFTSyAoMVVMTCA8PCA2MykKKworI2RlZmluZSBQVF9QQVRfU0hJRlQgNworI2RlZmluZSBQVF9ESVJfUEFUX1NISUZUIDEyCisjZGVmaW5lIFBUX0RJUl9QQVRfTUFTSyAoMVVMTCA8PCBQVF9ESVJfUEFUX1NISUZUKQorCisjZGVmaW5lIFBUMzJfRElSX1BTRTM2X1NJWkUgNAorI2RlZmluZSBQVDMyX0RJUl9QU0UzNl9TSElGVCAxMworI2RlZmluZSBQVDMyX0RJUl9QU0UzNl9NQVNLICgoKDFVTEwgPDwgUFQzMl9ESVJfUFNFMzZfU0laRSkgLSAxKSA8PCBQVDMyX0RJUl9QU0UzNl9TSElGVCkKKworCisjZGVmaW5lIFBUMzJfUFRFX0NPUFlfTUFTSyBcCisJKFBUX1BSRVNFTlRfTUFTSyB8IFBUX0FDQ0VTU0VEX01BU0sgfCBQVF9ESVJUWV9NQVNLIHwgUFRfR0xPQkFMX01BU0spCisKKyNkZWZpbmUgUFQ2NF9QVEVfQ09QWV9NQVNLIChQVDY0X05YX01BU0sgfCBQVDMyX1BURV9DT1BZX01BU0spCisKKyNkZWZpbmUgUFRfRklSU1RfQVZBSUxfQklUU19TSElGVCA5CisjZGVmaW5lIFBUNjRfU0VDT05EX0FWQUlMX0JJVFNfU0hJRlQgNTIKKworI2RlZmluZSBQVF9TSEFET1dfUFNfTUFSSyAoMVVMTCA8PCBQVF9GSVJTVF9BVkFJTF9CSVRTX1NISUZUKQorI2RlZmluZSBQVF9TSEFET1dfSU9fTUFSSyAoMVVMTCA8PCBQVF9GSVJTVF9BVkFJTF9CSVRTX1NISUZUKQorCisjZGVmaW5lIFBUX1NIQURPV19XUklUQUJMRV9TSElGVCAoUFRfRklSU1RfQVZBSUxfQklUU19TSElGVCArIDEpCisjZGVmaW5lIFBUX1NIQURPV19XUklUQUJMRV9NQVNLICgxVUxMIDw8IFBUX1NIQURPV19XUklUQUJMRV9TSElGVCkKKworI2RlZmluZSBQVF9TSEFET1dfVVNFUl9TSElGVCAoUFRfU0hBRE9XX1dSSVRBQkxFX1NISUZUICsgMSkKKyNkZWZpbmUgUFRfU0hBRE9XX1VTRVJfTUFTSyAoMVVMTCA8PCAoUFRfU0hBRE9XX1VTRVJfU0hJRlQpKQorCisjZGVmaW5lIFBUX1NIQURPV19CSVRTX09GRlNFVCAoUFRfU0hBRE9XX1dSSVRBQkxFX1NISUZUIC0gUFRfV1JJVEFCTEVfU0hJRlQpCisKKyNkZWZpbmUgVkFMSURfUEFHRSh4KSAoKHgpICE9IElOVkFMSURfUEFHRSkKKworI2RlZmluZSBQVDY0X0xFVkVMX0JJVFMgOQorCisjZGVmaW5lIFBUNjRfTEVWRUxfU0hJRlQobGV2ZWwpIFwKKwkJKCBQQUdFX1NISUZUICsgKGxldmVsIC0gMSkgKiBQVDY0X0xFVkVMX0JJVFMgKQorCisjZGVmaW5lIFBUNjRfTEVWRUxfTUFTSyhsZXZlbCkgXAorCQkoKCgxVUxMIDw8IFBUNjRfTEVWRUxfQklUUykgLSAxKSA8PCBQVDY0X0xFVkVMX1NISUZUKGxldmVsKSkKKworI2RlZmluZSBQVDY0X0lOREVYKGFkZHJlc3MsIGxldmVsKVwKKwkoKChhZGRyZXNzKSA+PiBQVDY0X0xFVkVMX1NISUZUKGxldmVsKSkgJiAoKDEgPDwgUFQ2NF9MRVZFTF9CSVRTKSAtIDEpKQorCisKKyNkZWZpbmUgUFQzMl9MRVZFTF9CSVRTIDEwCisKKyNkZWZpbmUgUFQzMl9MRVZFTF9TSElGVChsZXZlbCkgXAorCQkoIFBBR0VfU0hJRlQgKyAobGV2ZWwgLSAxKSAqIFBUMzJfTEVWRUxfQklUUyApCisKKyNkZWZpbmUgUFQzMl9MRVZFTF9NQVNLKGxldmVsKSBcCisJCSgoKDFVTEwgPDwgUFQzMl9MRVZFTF9CSVRTKSAtIDEpIDw8IFBUMzJfTEVWRUxfU0hJRlQobGV2ZWwpKQorCisjZGVmaW5lIFBUMzJfSU5ERVgoYWRkcmVzcywgbGV2ZWwpXAorCSgoKGFkZHJlc3MpID4+IFBUMzJfTEVWRUxfU0hJRlQobGV2ZWwpKSAmICgoMSA8PCBQVDMyX0xFVkVMX0JJVFMpIC0gMSkpCisKKworI2RlZmluZSBQVDY0X0JBU0VfQUREUl9NQVNLICgoKDFVTEwgPDwgNTIpIC0gMSkgJiBQQUdFX01BU0spCisjZGVmaW5lIFBUNjRfRElSX0JBU0VfQUREUl9NQVNLIFwKKwkoUFQ2NF9CQVNFX0FERFJfTUFTSyAmIH4oKDFVTEwgPDwgKFBBR0VfU0hJRlQgKyBQVDY0X0xFVkVMX0JJVFMpKSAtIDEpKQorCisjZGVmaW5lIFBUMzJfQkFTRV9BRERSX01BU0sgUEFHRV9NQVNLCisjZGVmaW5lIFBUMzJfRElSX0JBU0VfQUREUl9NQVNLIFwKKwkoUEFHRV9NQVNLICYgfigoMVVMTCA8PCAoUEFHRV9TSElGVCArIFBUMzJfTEVWRUxfQklUUykpIC0gMSkpCisKKworI2RlZmluZSBQRkVSUl9QUkVTRU5UX01BU0sgKDFVIDw8IDApCisjZGVmaW5lIFBGRVJSX1dSSVRFX01BU0sgKDFVIDw8IDEpCisjZGVmaW5lIFBGRVJSX1VTRVJfTUFTSyAoMVUgPDwgMikKKworI2RlZmluZSBQVDY0X1JPT1RfTEVWRUwgNAorI2RlZmluZSBQVDMyX1JPT1RfTEVWRUwgMgorI2RlZmluZSBQVDMyRV9ST09UX0xFVkVMIDMKKworI2RlZmluZSBQVF9ESVJFQ1RPUllfTEVWRUwgMgorI2RlZmluZSBQVF9QQUdFX1RBQkxFX0xFVkVMIDEKKworc3RhdGljIGludCBpc193cml0ZV9wcm90ZWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+Y3IwICYgQ1IwX1dQX01BU0s7Cit9CisKK3N0YXRpYyBpbnQgaXNfY3B1aWRfUFNFMzYodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpc19wcmVzZW50X3B0ZSh1bnNpZ25lZCBsb25nIHB0ZSkKK3sKKwlyZXR1cm4gcHRlICYgUFRfUFJFU0VOVF9NQVNLOworfQorCitzdGF0aWMgaW50IGlzX3dyaXRlYmxlX3B0ZSh1bnNpZ25lZCBsb25nIHB0ZSkKK3sKKwlyZXR1cm4gcHRlICYgUFRfV1JJVEFCTEVfTUFTSzsKK30KKworc3RhdGljIGludCBpc19pb19wdGUodW5zaWduZWQgbG9uZyBwdGUpCit7CisJcmV0dXJuIHB0ZSAmIFBUX1NIQURPV19JT19NQVJLOworfQorCitzdGF0aWMgdm9pZCBrdm1fbW11X2ZyZWVfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGhwYV90IHBhZ2VfaHBhKQoreworCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnBhZ2VfaGVhZCA9IHBhZ2VfaGVhZGVyKHBhZ2VfaHBhKTsKKworCWxpc3RfZGVsKCZwYWdlX2hlYWQtPmxpbmspOworCXBhZ2VfaGVhZC0+cGFnZV9ocGEgPSBwYWdlX2hwYTsKKwlsaXN0X2FkZCgmcGFnZV9oZWFkLT5saW5rLCAmdmNwdS0+ZnJlZV9wYWdlcyk7Cit9CisKK3N0YXRpYyBpbnQgaXNfZW1wdHlfc2hhZG93X3BhZ2UoaHBhX3QgcGFnZV9ocGEpCit7CisJdTMyICpwb3M7CisJdTMyICplbmQ7CisJZm9yIChwb3MgPSBfX3ZhKHBhZ2VfaHBhKSwgZW5kID0gcG9zICsgUEFHRV9TSVpFIC8gc2l6ZW9mKHUzMik7CisJCSAgICAgIHBvcyAhPSBlbmQ7IHBvcysrKQorCQlpZiAoKnBvcyAhPSAwKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBocGFfdCBrdm1fbW11X2FsbG9jX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKnBhcmVudF9wdGUpCit7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqcGFnZTsKKworCWlmIChsaXN0X2VtcHR5KCZ2Y3B1LT5mcmVlX3BhZ2VzKSkKKwkJcmV0dXJuIElOVkFMSURfUEFHRTsKKworCXBhZ2UgPSBsaXN0X2VudHJ5KHZjcHUtPmZyZWVfcGFnZXMubmV4dCwgc3RydWN0IGt2bV9tbXVfcGFnZSwgbGluayk7CisJbGlzdF9kZWwoJnBhZ2UtPmxpbmspOworCWxpc3RfYWRkKCZwYWdlLT5saW5rLCAmdmNwdS0+a3ZtLT5hY3RpdmVfbW11X3BhZ2VzKTsKKwlBU1NFUlQoaXNfZW1wdHlfc2hhZG93X3BhZ2UocGFnZS0+cGFnZV9ocGEpKTsKKwlwYWdlLT5zbG90X2JpdG1hcCA9IDA7CisJcGFnZS0+Z2xvYmFsID0gMTsKKwlwYWdlLT5wYXJlbnRfcHRlID0gcGFyZW50X3B0ZTsKKwlyZXR1cm4gcGFnZS0+cGFnZV9ocGE7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2VfaGVhZGVyX3VwZGF0ZV9zbG90KHN0cnVjdCBrdm0gKmt2bSwgdm9pZCAqcHRlLCBncGFfdCBncGEpCit7CisJaW50IHNsb3QgPSBtZW1zbG90X2lkKGt2bSwgZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBncGEgPj4gUEFHRV9TSElGVCkpOworCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnBhZ2VfaGVhZCA9IHBhZ2VfaGVhZGVyKF9fcGEocHRlKSk7CisKKwlfX3NldF9iaXQoc2xvdCwgJnBhZ2VfaGVhZC0+c2xvdF9iaXRtYXApOworfQorCitocGFfdCBzYWZlX2dwYV90b19ocGEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEpCit7CisJaHBhX3QgaHBhID0gZ3BhX3RvX2hwYSh2Y3B1LCBncGEpOworCisJcmV0dXJuIGlzX2Vycm9yX2hwYShocGEpID8gYmFkX3BhZ2VfYWRkcmVzcyB8IChncGEgJiB+UEFHRV9NQVNLKTogaHBhOworfQorCitocGFfdCBncGFfdG9faHBhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhKQoreworCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlBU1NFUlQoKGdwYSAmIEhQQV9FUlJfTUFTSykgPT0gMCk7CisJc2xvdCA9IGdmbl90b19tZW1zbG90KHZjcHUtPmt2bSwgZ3BhID4+IFBBR0VfU0hJRlQpOworCWlmICghc2xvdCkKKwkJcmV0dXJuIGdwYSB8IEhQQV9FUlJfTUFTSzsKKwlwYWdlID0gZ2ZuX3RvX3BhZ2Uoc2xvdCwgZ3BhID4+IFBBR0VfU0hJRlQpOworCXJldHVybiAoKGhwYV90KXBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCisJCXwgKGdwYSAmIChQQUdFX1NJWkUtMSkpOworfQorCitocGFfdCBndmFfdG9faHBhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhKQoreworCWdwYV90IGdwYSA9IHZjcHUtPm1tdS5ndmFfdG9fZ3BhKHZjcHUsIGd2YSk7CisKKwlpZiAoZ3BhID09IFVOTUFQUEVEX0dWQSkKKwkJcmV0dXJuIFVOTUFQUEVEX0dWQTsKKwlyZXR1cm4gZ3BhX3RvX2hwYSh2Y3B1LCBncGEpOworfQorCisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcHRfcGFnZV82NChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGhwYV90IHBhZ2VfaHBhLAorCQkJICAgICAgIGludCBsZXZlbCkKK3sKKwlBU1NFUlQodmNwdSk7CisJQVNTRVJUKFZBTElEX1BBR0UocGFnZV9ocGEpKTsKKwlBU1NFUlQobGV2ZWwgPD0gUFQ2NF9ST09UX0xFVkVMICYmIGxldmVsID4gMCk7CisKKwlpZiAobGV2ZWwgPT0gMSkKKwkJbWVtc2V0KF9fdmEocGFnZV9ocGEpLCAwLCBQQUdFX1NJWkUpOworCWVsc2UgeworCQl1NjQgKnBvczsKKwkJdTY0ICplbmQ7CisKKwkJZm9yIChwb3MgPSBfX3ZhKHBhZ2VfaHBhKSwgZW5kID0gcG9zICsgUFQ2NF9FTlRfUEVSX1BBR0U7CisJCSAgICAgcG9zICE9IGVuZDsgcG9zKyspIHsKKwkJCXU2NCBjdXJyZW50X2VudCA9ICpwb3M7CisKKwkJCSpwb3MgPSAwOworCQkJaWYgKGlzX3ByZXNlbnRfcHRlKGN1cnJlbnRfZW50KSkKKwkJCQlyZWxlYXNlX3B0X3BhZ2VfNjQodmNwdSwKKwkJCQkJCSAgY3VycmVudF9lbnQgJgorCQkJCQkJICBQVDY0X0JBU0VfQUREUl9NQVNLLAorCQkJCQkJICBsZXZlbCAtIDEpOworCQl9CisJfQorCWt2bV9tbXVfZnJlZV9wYWdlKHZjcHUsIHBhZ2VfaHBhKTsKK30KKworc3RhdGljIHZvaWQgbm9ucGFnaW5nX25ld19jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworfQorCitzdGF0aWMgaW50IG5vbnBhZ2luZ19tYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCB2LCBocGFfdCBwKQoreworCWludCBsZXZlbCA9IFBUMzJFX1JPT1RfTEVWRUw7CisJaHBhX3QgdGFibGVfYWRkciA9IHZjcHUtPm1tdS5yb290X2hwYTsKKworCWZvciAoOyA7IGxldmVsLS0pIHsKKwkJdTMyIGluZGV4ID0gUFQ2NF9JTkRFWCh2LCBsZXZlbCk7CisJCXU2NCAqdGFibGU7CisKKwkJQVNTRVJUKFZBTElEX1BBR0UodGFibGVfYWRkcikpOworCQl0YWJsZSA9IF9fdmEodGFibGVfYWRkcik7CisKKwkJaWYgKGxldmVsID09IDEpIHsKKwkJCW1hcmtfcGFnZV9kaXJ0eSh2Y3B1LT5rdm0sIHYgPj4gUEFHRV9TSElGVCk7CisJCQlwYWdlX2hlYWRlcl91cGRhdGVfc2xvdCh2Y3B1LT5rdm0sIHRhYmxlLCB2KTsKKwkJCXRhYmxlW2luZGV4XSA9IHAgfCBQVF9QUkVTRU5UX01BU0sgfCBQVF9XUklUQUJMRV9NQVNLIHwKKwkJCQkJCQkJUFRfVVNFUl9NQVNLOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAodGFibGVbaW5kZXhdID09IDApIHsKKwkJCWhwYV90IG5ld190YWJsZSA9IGt2bV9tbXVfYWxsb2NfcGFnZSh2Y3B1LAorCQkJCQkJCSAgICAgJnRhYmxlW2luZGV4XSk7CisKKwkJCWlmICghVkFMSURfUEFHRShuZXdfdGFibGUpKSB7CisJCQkJcGdwcmludGsoIm5vbnBhZ2luZ19tYXA6IEVOT01FTVxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisKKwkJCWlmIChsZXZlbCA9PSBQVDMyRV9ST09UX0xFVkVMKQorCQkJCXRhYmxlW2luZGV4XSA9IG5ld190YWJsZSB8IFBUX1BSRVNFTlRfTUFTSzsKKwkJCWVsc2UKKwkJCQl0YWJsZVtpbmRleF0gPSBuZXdfdGFibGUgfCBQVF9QUkVTRU5UX01BU0sgfAorCQkJCQkJUFRfV1JJVEFCTEVfTUFTSyB8IFBUX1VTRVJfTUFTSzsKKwkJfQorCQl0YWJsZV9hZGRyID0gdGFibGVbaW5kZXhdICYgUFQ2NF9CQVNFX0FERFJfTUFTSzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5vbnBhZ2luZ19mbHVzaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaHBhX3Qgcm9vdCA9IHZjcHUtPm1tdS5yb290X2hwYTsKKworCSsra3ZtX3N0YXQudGxiX2ZsdXNoOworCXBncHJpbnRrKCJub25wYWdpbmdfZmx1c2hcbiIpOworCUFTU0VSVChWQUxJRF9QQUdFKHJvb3QpKTsKKwlyZWxlYXNlX3B0X3BhZ2VfNjQodmNwdSwgcm9vdCwgdmNwdS0+bW11LnNoYWRvd19yb290X2xldmVsKTsKKwlyb290ID0ga3ZtX21tdV9hbGxvY19wYWdlKHZjcHUsIE5VTEwpOworCUFTU0VSVChWQUxJRF9QQUdFKHJvb3QpKTsKKwl2Y3B1LT5tbXUucm9vdF9ocGEgPSByb290OworCWlmIChpc19wYWdpbmcodmNwdSkpCisJCXJvb3QgfD0gKHZjcHUtPmNyMyAmIChDUjNfUENEX01BU0sgfCBDUjNfV1BUX01BU0spKTsKKwlrdm1fYXJjaF9vcHMtPnNldF9jcjModmNwdSwgcm9vdCk7CisJa3ZtX2FyY2hfb3BzLT50bGJfZmx1c2godmNwdSk7Cit9CisKK3N0YXRpYyBncGFfdCBub25wYWdpbmdfZ3ZhX3RvX2dwYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IHZhZGRyKQoreworCXJldHVybiB2YWRkcjsKK30KKworc3RhdGljIGludCBub25wYWdpbmdfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSwKKwkJCSAgICAgICB1MzIgZXJyb3JfY29kZSkKK3sKKwlpbnQgcmV0OworCWdwYV90IGFkZHIgPSBndmE7CisKKwlBU1NFUlQodmNwdSk7CisJQVNTRVJUKFZBTElEX1BBR0UodmNwdS0+bW11LnJvb3RfaHBhKSk7CisKKwlmb3IgKDs7KSB7CisJICAgICBocGFfdCBwYWRkcjsKKworCSAgICAgcGFkZHIgPSBncGFfdG9faHBhKHZjcHUgLCBhZGRyICYgUFQ2NF9CQVNFX0FERFJfTUFTSyk7CisKKwkgICAgIGlmIChpc19lcnJvcl9ocGEocGFkZHIpKQorCQkgICAgIHJldHVybiAxOworCisJICAgICByZXQgPSBub25wYWdpbmdfbWFwKHZjcHUsIGFkZHIgJiBQQUdFX01BU0ssIHBhZGRyKTsKKwkgICAgIGlmIChyZXQpIHsKKwkJICAgICBub25wYWdpbmdfZmx1c2godmNwdSk7CisJCSAgICAgY29udGludWU7CisJICAgICB9CisJICAgICBicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbm9ucGFnaW5nX2ludmFsX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyKQoreworfQorCitzdGF0aWMgdm9pZCBub25wYWdpbmdfZnJlZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaHBhX3Qgcm9vdDsKKworCUFTU0VSVCh2Y3B1KTsKKwlyb290ID0gdmNwdS0+bW11LnJvb3RfaHBhOworCWlmIChWQUxJRF9QQUdFKHJvb3QpKQorCQlyZWxlYXNlX3B0X3BhZ2VfNjQodmNwdSwgcm9vdCwgdmNwdS0+bW11LnNoYWRvd19yb290X2xldmVsKTsKKwl2Y3B1LT5tbXUucm9vdF9ocGEgPSBJTlZBTElEX1BBR0U7Cit9CisKK3N0YXRpYyBpbnQgbm9ucGFnaW5nX2luaXRfY29udGV4dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9tbXUgKmNvbnRleHQgPSAmdmNwdS0+bW11OworCisJY29udGV4dC0+bmV3X2NyMyA9IG5vbnBhZ2luZ19uZXdfY3IzOworCWNvbnRleHQtPnBhZ2VfZmF1bHQgPSBub25wYWdpbmdfcGFnZV9mYXVsdDsKKwljb250ZXh0LT5pbnZhbF9wYWdlID0gbm9ucGFnaW5nX2ludmFsX3BhZ2U7CisJY29udGV4dC0+Z3ZhX3RvX2dwYSA9IG5vbnBhZ2luZ19ndmFfdG9fZ3BhOworCWNvbnRleHQtPmZyZWUgPSBub25wYWdpbmdfZnJlZTsKKwljb250ZXh0LT5yb290X2xldmVsID0gUFQzMkVfUk9PVF9MRVZFTDsKKwljb250ZXh0LT5zaGFkb3dfcm9vdF9sZXZlbCA9IFBUMzJFX1JPT1RfTEVWRUw7CisJY29udGV4dC0+cm9vdF9ocGEgPSBrdm1fbW11X2FsbG9jX3BhZ2UodmNwdSwgTlVMTCk7CisJQVNTRVJUKFZBTElEX1BBR0UoY29udGV4dC0+cm9vdF9ocGEpKTsKKwlrdm1fYXJjaF9vcHMtPnNldF9jcjModmNwdSwgY29udGV4dC0+cm9vdF9ocGEpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGt2bV9tbXVfZmx1c2hfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpwYWdlLCAqbnBhZ2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFnZSwgbnBhZ2UsICZ2Y3B1LT5rdm0tPmFjdGl2ZV9tbXVfcGFnZXMsCisJCQkJIGxpbmspIHsKKwkJaWYgKHBhZ2UtPmdsb2JhbCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghcGFnZS0+cGFyZW50X3B0ZSkKKwkJCWNvbnRpbnVlOworCisJCSpwYWdlLT5wYXJlbnRfcHRlID0gMDsKKwkJcmVsZWFzZV9wdF9wYWdlXzY0KHZjcHUsIHBhZ2UtPnBhZ2VfaHBhLCAxKTsKKwl9CisJKytrdm1fc3RhdC50bGJfZmx1c2g7CisJa3ZtX2FyY2hfb3BzLT50bGJfZmx1c2godmNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ19uZXdfY3IzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlrdm1fbW11X2ZsdXNoX3RsYih2Y3B1KTsKK30KKworc3RhdGljIHZvaWQgbWFya19wYWdldGFibGVfbm9uZ2xvYmFsKHZvaWQgKnNoYWRvd19wdGUpCit7CisJcGFnZV9oZWFkZXIoX19wYShzaGFkb3dfcHRlKSktPmdsb2JhbCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcHRlX2NvbW1vbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgICAgIHU2NCAqc2hhZG93X3B0ZSwKKwkJCSAgICAgZ3BhX3QgZ2FkZHIsCisJCQkgICAgIGludCBkaXJ0eSwKKwkJCSAgICAgdTY0IGFjY2Vzc19iaXRzKQoreworCWhwYV90IHBhZGRyOworCisJKnNoYWRvd19wdGUgfD0gYWNjZXNzX2JpdHMgPDwgUFRfU0hBRE9XX0JJVFNfT0ZGU0VUOworCWlmICghZGlydHkpCisJCWFjY2Vzc19iaXRzICY9IH5QVF9XUklUQUJMRV9NQVNLOworCisJaWYgKGFjY2Vzc19iaXRzICYgUFRfV1JJVEFCTEVfTUFTSykKKwkJbWFya19wYWdlX2RpcnR5KHZjcHUtPmt2bSwgZ2FkZHIgPj4gUEFHRV9TSElGVCk7CisKKwkqc2hhZG93X3B0ZSB8PSBhY2Nlc3NfYml0czsKKworCXBhZGRyID0gZ3BhX3RvX2hwYSh2Y3B1LCBnYWRkciAmIFBUNjRfQkFTRV9BRERSX01BU0spOworCisJaWYgKCEoKnNoYWRvd19wdGUgJiBQVF9HTE9CQUxfTUFTSykpCisJCW1hcmtfcGFnZXRhYmxlX25vbmdsb2JhbChzaGFkb3dfcHRlKTsKKworCWlmIChpc19lcnJvcl9ocGEocGFkZHIpKSB7CisJCSpzaGFkb3dfcHRlIHw9IGdhZGRyOworCQkqc2hhZG93X3B0ZSB8PSBQVF9TSEFET1dfSU9fTUFSSzsKKwkJKnNoYWRvd19wdGUgJj0gflBUX1BSRVNFTlRfTUFTSzsKKwl9IGVsc2UgeworCQkqc2hhZG93X3B0ZSB8PSBwYWRkcjsKKwkJcGFnZV9oZWFkZXJfdXBkYXRlX3Nsb3QodmNwdS0+a3ZtLCBzaGFkb3dfcHRlLCBnYWRkcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbmplY3RfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgICAgICB1NjQgYWRkciwKKwkJCSAgICAgIHUzMiBlcnJfY29kZSkKK3sKKwlrdm1fYXJjaF9vcHMtPmluamVjdF9wYWdlX2ZhdWx0KHZjcHUsIGFkZHIsIGVycl9jb2RlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZml4X3JlYWRfcGYodTY0ICpzaGFkb3dfZW50KQoreworCWlmICgoKnNoYWRvd19lbnQgJiBQVF9TSEFET1dfVVNFUl9NQVNLKSAmJgorCSAgICAhKCpzaGFkb3dfZW50ICYgUFRfVVNFUl9NQVNLKSkgeworCQkvKgorCQkgKiBJZiBzdXBlcnZpc29yIHdyaXRlIHByb3RlY3QgaXMgZGlzYWJsZWQsIHdlIHNoYWRvdyBrZXJuZWwKKwkJICogcGFnZXMgYXMgdXNlciBwYWdlcyBzbyB3ZSBjYW4gdHJhcCB0aGUgd3JpdGUgYWNjZXNzLgorCQkgKi8KKwkJKnNoYWRvd19lbnQgfD0gUFRfVVNFUl9NQVNLOworCQkqc2hhZG93X2VudCAmPSB+UFRfV1JJVEFCTEVfTUFTSzsKKworCQlyZXR1cm4gMTsKKworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXlfYWNjZXNzKHU2NCBwdGUsIGludCB3cml0ZSwgaW50IHVzZXIpCit7CisKKwlpZiAodXNlciAmJiAhKHB0ZSAmIFBUX1VTRVJfTUFTSykpCisJCXJldHVybiAwOworCWlmICh3cml0ZSAmJiAhKHB0ZSAmIFBUX1dSSVRBQkxFX01BU0spKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNoYWRvdyBwdGUuCisgKi8KK3N0YXRpYyB2b2lkIHBhZ2luZ19pbnZhbF9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgYWRkcikKK3sKKwlocGFfdCBwYWdlX2FkZHIgPSB2Y3B1LT5tbXUucm9vdF9ocGE7CisJaW50IGxldmVsID0gdmNwdS0+bW11LnNoYWRvd19yb290X2xldmVsOworCisJKytrdm1fc3RhdC5pbnZscGc7CisKKwlmb3IgKDsgOyBsZXZlbC0tKSB7CisJCXUzMiBpbmRleCA9IFBUNjRfSU5ERVgoYWRkciwgbGV2ZWwpOworCQl1NjQgKnRhYmxlID0gX192YShwYWdlX2FkZHIpOworCisJCWlmIChsZXZlbCA9PSBQVF9QQUdFX1RBQkxFX0xFVkVMICkgeworCQkJdGFibGVbaW5kZXhdID0gMDsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICghaXNfcHJlc2VudF9wdGUodGFibGVbaW5kZXhdKSkKKwkJCXJldHVybjsKKworCQlwYWdlX2FkZHIgPSB0YWJsZVtpbmRleF0gJiBQVDY0X0JBU0VfQUREUl9NQVNLOworCisJCWlmIChsZXZlbCA9PSBQVF9ESVJFQ1RPUllfTEVWRUwgJiYKKwkJCSAgKHRhYmxlW2luZGV4XSAmIFBUX1NIQURPV19QU19NQVJLKSkgeworCQkJdGFibGVbaW5kZXhdID0gMDsKKwkJCXJlbGVhc2VfcHRfcGFnZV82NCh2Y3B1LCBwYWdlX2FkZHIsIFBUX1BBR0VfVEFCTEVfTEVWRUwpOworCisJCQlrdm1fYXJjaF9vcHMtPnRsYl9mbHVzaCh2Y3B1KTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcGFnaW5nX2ZyZWUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCW5vbnBhZ2luZ19mcmVlKHZjcHUpOworfQorCisjZGVmaW5lIFBUVFlQRSA2NAorI2luY2x1ZGUgInBhZ2luZ190bXBsLmgiCisjdW5kZWYgUFRUWVBFCisKKyNkZWZpbmUgUFRUWVBFIDMyCisjaW5jbHVkZSAicGFnaW5nX3RtcGwuaCIKKyN1bmRlZiBQVFRZUEUKKworc3RhdGljIGludCBwYWdpbmc2NF9pbml0X2NvbnRleHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fbW11ICpjb250ZXh0ID0gJnZjcHUtPm1tdTsKKworCUFTU0VSVChpc19wYWUodmNwdSkpOworCWNvbnRleHQtPm5ld19jcjMgPSBwYWdpbmdfbmV3X2NyMzsKKwljb250ZXh0LT5wYWdlX2ZhdWx0ID0gcGFnaW5nNjRfcGFnZV9mYXVsdDsKKwljb250ZXh0LT5pbnZhbF9wYWdlID0gcGFnaW5nX2ludmFsX3BhZ2U7CisJY29udGV4dC0+Z3ZhX3RvX2dwYSA9IHBhZ2luZzY0X2d2YV90b19ncGE7CisJY29udGV4dC0+ZnJlZSA9IHBhZ2luZ19mcmVlOworCWNvbnRleHQtPnJvb3RfbGV2ZWwgPSBQVDY0X1JPT1RfTEVWRUw7CisJY29udGV4dC0+c2hhZG93X3Jvb3RfbGV2ZWwgPSBQVDY0X1JPT1RfTEVWRUw7CisJY29udGV4dC0+cm9vdF9ocGEgPSBrdm1fbW11X2FsbG9jX3BhZ2UodmNwdSwgTlVMTCk7CisJQVNTRVJUKFZBTElEX1BBR0UoY29udGV4dC0+cm9vdF9ocGEpKTsKKwlrdm1fYXJjaF9vcHMtPnNldF9jcjModmNwdSwgY29udGV4dC0+cm9vdF9ocGEgfAorCQkgICAgKHZjcHUtPmNyMyAmIChDUjNfUENEX01BU0sgfCBDUjNfV1BUX01BU0spKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFnaW5nMzJfaW5pdF9jb250ZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX21tdSAqY29udGV4dCA9ICZ2Y3B1LT5tbXU7CisKKwljb250ZXh0LT5uZXdfY3IzID0gcGFnaW5nX25ld19jcjM7CisJY29udGV4dC0+cGFnZV9mYXVsdCA9IHBhZ2luZzMyX3BhZ2VfZmF1bHQ7CisJY29udGV4dC0+aW52YWxfcGFnZSA9IHBhZ2luZ19pbnZhbF9wYWdlOworCWNvbnRleHQtPmd2YV90b19ncGEgPSBwYWdpbmczMl9ndmFfdG9fZ3BhOworCWNvbnRleHQtPmZyZWUgPSBwYWdpbmdfZnJlZTsKKwljb250ZXh0LT5yb290X2xldmVsID0gUFQzMl9ST09UX0xFVkVMOworCWNvbnRleHQtPnNoYWRvd19yb290X2xldmVsID0gUFQzMkVfUk9PVF9MRVZFTDsKKwljb250ZXh0LT5yb290X2hwYSA9IGt2bV9tbXVfYWxsb2NfcGFnZSh2Y3B1LCBOVUxMKTsKKwlBU1NFUlQoVkFMSURfUEFHRShjb250ZXh0LT5yb290X2hwYSkpOworCWt2bV9hcmNoX29wcy0+c2V0X2NyMyh2Y3B1LCBjb250ZXh0LT5yb290X2hwYSB8CisJCSAgICAodmNwdS0+Y3IzICYgKENSM19QQ0RfTUFTSyB8IENSM19XUFRfTUFTSykpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWdpbmczMkVfaW5pdF9jb250ZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBwYWdpbmc2NF9pbml0X2NvbnRleHQodmNwdSkpKQorCQlyZXR1cm4gcmV0OworCisJdmNwdS0+bW11LnJvb3RfbGV2ZWwgPSBQVDMyRV9ST09UX0xFVkVMOworCXZjcHUtPm1tdS5zaGFkb3dfcm9vdF9sZXZlbCA9IFBUMzJFX1JPT1RfTEVWRUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9rdm1fbW11KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlBU1NFUlQodmNwdSk7CisJQVNTRVJUKCFWQUxJRF9QQUdFKHZjcHUtPm1tdS5yb290X2hwYSkpOworCisJaWYgKCFpc19wYWdpbmcodmNwdSkpCisJCXJldHVybiBub25wYWdpbmdfaW5pdF9jb250ZXh0KHZjcHUpOworCWVsc2UgaWYgKGt2bV9hcmNoX29wcy0+aXNfbG9uZ19tb2RlKHZjcHUpKQorCQlyZXR1cm4gcGFnaW5nNjRfaW5pdF9jb250ZXh0KHZjcHUpOworCWVsc2UgaWYgKGlzX3BhZSh2Y3B1KSkKKwkJcmV0dXJuIHBhZ2luZzMyRV9pbml0X2NvbnRleHQodmNwdSk7CisJZWxzZQorCQlyZXR1cm4gcGFnaW5nMzJfaW5pdF9jb250ZXh0KHZjcHUpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2t2bV9tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCUFTU0VSVCh2Y3B1KTsKKwlpZiAoVkFMSURfUEFHRSh2Y3B1LT5tbXUucm9vdF9ocGEpKSB7CisJCXZjcHUtPm1tdS5mcmVlKHZjcHUpOworCQl2Y3B1LT5tbXUucm9vdF9ocGEgPSBJTlZBTElEX1BBR0U7CisJfQorfQorCitpbnQga3ZtX21tdV9yZXNldF9jb250ZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlkZXN0cm95X2t2bV9tbXUodmNwdSk7CisJcmV0dXJuIGluaXRfa3ZtX21tdSh2Y3B1KTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9tbXVfcGFnZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXdoaWxlICghbGlzdF9lbXB0eSgmdmNwdS0+ZnJlZV9wYWdlcykpIHsKKwkJc3RydWN0IGt2bV9tbXVfcGFnZSAqcGFnZTsKKworCQlwYWdlID0gbGlzdF9lbnRyeSh2Y3B1LT5mcmVlX3BhZ2VzLm5leHQsCisJCQkJICBzdHJ1Y3Qga3ZtX21tdV9wYWdlLCBsaW5rKTsKKwkJbGlzdF9kZWwoJnBhZ2UtPmxpbmspOworCQlfX2ZyZWVfcGFnZShwZm5fdG9fcGFnZShwYWdlLT5wYWdlX2hwYSA+PiBQQUdFX1NISUZUKSk7CisJCXBhZ2UtPnBhZ2VfaHBhID0gSU5WQUxJRF9QQUdFOworCX0KK30KKworc3RhdGljIGludCBhbGxvY19tbXVfcGFnZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWludCBpOworCisJQVNTRVJUKHZjcHUpOworCisJZm9yIChpID0gMDsgaSA8IEtWTV9OVU1fTU1VX1BBR0VTOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnBhZ2VfaGVhZGVyID0gJnZjcHUtPnBhZ2VfaGVhZGVyX2J1ZltpXTsKKworCQlJTklUX0xJU1RfSEVBRCgmcGFnZV9oZWFkZXItPmxpbmspOworCQlpZiAoKHBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LVk1fTU1VKSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3JfMTsKKwkJcGFnZS0+cHJpdmF0ZSA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfaGVhZGVyOworCQlwYWdlX2hlYWRlci0+cGFnZV9ocGEgPSAoaHBhX3QpcGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVDsKKwkJbWVtc2V0KF9fdmEocGFnZV9oZWFkZXItPnBhZ2VfaHBhKSwgMCwgUEFHRV9TSVpFKTsKKwkJbGlzdF9hZGQoJnBhZ2VfaGVhZGVyLT5saW5rLCAmdmNwdS0+ZnJlZV9wYWdlcyk7CisJfQorCXJldHVybiAwOworCitlcnJvcl8xOgorCWZyZWVfbW11X3BhZ2VzKHZjcHUpOworCXJldHVybiAtRU5PTUVNOworfQorCitpbnQga3ZtX21tdV9pbml0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgcjsKKworCUFTU0VSVCh2Y3B1KTsKKwlBU1NFUlQoIVZBTElEX1BBR0UodmNwdS0+bW11LnJvb3RfaHBhKSk7CisJQVNTRVJUKGxpc3RfZW1wdHkoJnZjcHUtPmZyZWVfcGFnZXMpKTsKKworCWlmICgociA9IGFsbG9jX21tdV9wYWdlcyh2Y3B1KSkpCisJCXJldHVybiByOworCisJaWYgKChyID0gaW5pdF9rdm1fbW11KHZjcHUpKSkgeworCQlmcmVlX21tdV9wYWdlcyh2Y3B1KTsKKwkJcmV0dXJuIHI7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGt2bV9tbXVfZGVzdHJveShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJQVNTRVJUKHZjcHUpOworCisJZGVzdHJveV9rdm1fbW11KHZjcHUpOworCWZyZWVfbW11X3BhZ2VzKHZjcHUpOworfQorCit2b2lkIGt2bV9tbXVfc2xvdF9yZW1vdmVfd3JpdGVfYWNjZXNzKHN0cnVjdCBrdm0gKmt2bSwgaW50IHNsb3QpCit7CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqcGFnZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGFnZSwgJmt2bS0+YWN0aXZlX21tdV9wYWdlcywgbGluaykgeworCQlpbnQgaTsKKwkJdTY0ICpwdDsKKworCQlpZiAoIXRlc3RfYml0KHNsb3QsICZwYWdlLT5zbG90X2JpdG1hcCkpCisJCQljb250aW51ZTsKKworCQlwdCA9IF9fdmEocGFnZS0+cGFnZV9ocGEpOworCQlmb3IgKGkgPSAwOyBpIDwgUFQ2NF9FTlRfUEVSX1BBR0U7ICsraSkKKwkJCS8qIGF2b2lkIFJNVyAqLworCQkJaWYgKHB0W2ldICYgUFRfV1JJVEFCTEVfTUFTSykKKwkJCQlwdFtpXSAmPSB+UFRfV1JJVEFCTEVfTUFTSzsKKworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMva3ZtL3BhZ2luZ190bXBsLmggYi9kcml2ZXJzL2t2bS9wYWdpbmdfdG1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzcxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2t2bS9wYWdpbmdfdG1wbC5oCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICogS2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSBkcml2ZXIgZm9yIExpbnV4CisgKgorICogVGhpcyBtb2R1bGUgZW5hYmxlcyBtYWNoaW5lcyB3aXRoIEludGVsIFZULXggZXh0ZW5zaW9ucyB0byBydW4gdmlydHVhbAorICogbWFjaGluZXMgd2l0aG91dCBlbXVsYXRpb24gb3IgYmluYXJ5IHRyYW5zbGF0aW9uLgorICoKKyAqIE1NVSBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFF1bXJhbmV0LCBJbmMuCisgKgorICogQXV0aG9yczoKKyAqICAgWWFuaXYgS2FtYXkgIDx5YW5pdkBxdW1yYW5ldC5jb20+CisgKiAgIEF2aSBLaXZpdHkgICA8YXZpQHF1bXJhbmV0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKKyAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKy8qCisgKiBXZSBuZWVkIHRoZSBtbXUgY29kZSB0byBhY2Nlc3MgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBndWVzdCBwdGVzLAorICogc28gdGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBvbmNlIHBlciBwdGUgc2l6ZS4KKyAqLworCisjaWYgUFRUWVBFID09IDY0CisJI2RlZmluZSBwdF9lbGVtZW50X3QgdTY0CisJI2RlZmluZSBndWVzdF93YWxrZXIgZ3Vlc3Rfd2Fsa2VyNjQKKwkjZGVmaW5lIEZOQU1FKG5hbWUpIHBhZ2luZyMjNjRfIyNuYW1lCisJI2RlZmluZSBQVF9CQVNFX0FERFJfTUFTSyBQVDY0X0JBU0VfQUREUl9NQVNLCisJI2RlZmluZSBQVF9ESVJfQkFTRV9BRERSX01BU0sgUFQ2NF9ESVJfQkFTRV9BRERSX01BU0sKKwkjZGVmaW5lIFBUX0lOREVYKGFkZHIsIGxldmVsKSBQVDY0X0lOREVYKGFkZHIsIGxldmVsKQorCSNkZWZpbmUgU0hBRE9XX1BUX0lOREVYKGFkZHIsIGxldmVsKSBQVDY0X0lOREVYKGFkZHIsIGxldmVsKQorCSNkZWZpbmUgUFRfTEVWRUxfTUFTSyhsZXZlbCkgUFQ2NF9MRVZFTF9NQVNLKGxldmVsKQorCSNkZWZpbmUgUFRfUFRFX0NPUFlfTUFTSyBQVDY0X1BURV9DT1BZX01BU0sKKyNlbGlmIFBUVFlQRSA9PSAzMgorCSNkZWZpbmUgcHRfZWxlbWVudF90IHUzMgorCSNkZWZpbmUgZ3Vlc3Rfd2Fsa2VyIGd1ZXN0X3dhbGtlcjMyCisJI2RlZmluZSBGTkFNRShuYW1lKSBwYWdpbmcjIzMyXyMjbmFtZQorCSNkZWZpbmUgUFRfQkFTRV9BRERSX01BU0sgUFQzMl9CQVNFX0FERFJfTUFTSworCSNkZWZpbmUgUFRfRElSX0JBU0VfQUREUl9NQVNLIFBUMzJfRElSX0JBU0VfQUREUl9NQVNLCisJI2RlZmluZSBQVF9JTkRFWChhZGRyLCBsZXZlbCkgUFQzMl9JTkRFWChhZGRyLCBsZXZlbCkKKwkjZGVmaW5lIFNIQURPV19QVF9JTkRFWChhZGRyLCBsZXZlbCkgUFQ2NF9JTkRFWChhZGRyLCBsZXZlbCkKKwkjZGVmaW5lIFBUX0xFVkVMX01BU0sobGV2ZWwpIFBUMzJfTEVWRUxfTUFTSyhsZXZlbCkKKwkjZGVmaW5lIFBUX1BURV9DT1BZX01BU0sgUFQzMl9QVEVfQ09QWV9NQVNLCisjZWxzZQorCSNlcnJvciBJbnZhbGlkIFBUVFlQRSB2YWx1ZQorI2VuZGlmCisKKy8qCisgKiBUaGUgZ3Vlc3Rfd2Fsa2VyIHN0cnVjdHVyZSBlbXVsYXRlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGhhcmR3YXJlIHBhZ2UKKyAqIHRhYmxlIHdhbGtlci4KKyAqLworc3RydWN0IGd1ZXN0X3dhbGtlciB7CisJaW50IGxldmVsOworCXB0X2VsZW1lbnRfdCAqdGFibGU7CisJcHRfZWxlbWVudF90IGluaGVyaXRlZF9hcjsKK307CisKK3N0YXRpYyB2b2lkIEZOQU1FKGluaXRfd2Fsa2VyKShzdHJ1Y3QgZ3Vlc3Rfd2Fsa2VyICp3YWxrZXIsCisJCQkgICAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWhwYV90IGhwYTsKKwlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90OworCisJd2Fsa2VyLT5sZXZlbCA9IHZjcHUtPm1tdS5yb290X2xldmVsOworCXNsb3QgPSBnZm5fdG9fbWVtc2xvdCh2Y3B1LT5rdm0sCisJCQkgICAgICAodmNwdS0+Y3IzICYgUFQ2NF9CQVNFX0FERFJfTUFTSykgPj4gUEFHRV9TSElGVCk7CisJaHBhID0gc2FmZV9ncGFfdG9faHBhKHZjcHUsIHZjcHUtPmNyMyAmIFBUNjRfQkFTRV9BRERSX01BU0spOworCXdhbGtlci0+dGFibGUgPSBrbWFwX2F0b21pYyhwZm5fdG9fcGFnZShocGEgPj4gUEFHRV9TSElGVCksIEtNX1VTRVIwKTsKKworCUFTU0VSVCgoIWt2bV9hcmNoX29wcy0+aXNfbG9uZ19tb2RlKHZjcHUpICYmIGlzX3BhZSh2Y3B1KSkgfHwKKwkgICAgICAgKHZjcHUtPmNyMyAmIH4oUEFHRV9NQVNLIHwgQ1IzX0ZMQUdTX01BU0spKSA9PSAwKTsKKworCXdhbGtlci0+dGFibGUgPSAocHRfZWxlbWVudF90ICopKCAodW5zaWduZWQgbG9uZyl3YWxrZXItPnRhYmxlIHwKKwkJKHVuc2lnbmVkIGxvbmcpKHZjcHUtPmNyMyAmIH4oUEFHRV9NQVNLIHwgQ1IzX0ZMQUdTX01BU0spKSApOworCXdhbGtlci0+aW5oZXJpdGVkX2FyID0gUFRfVVNFUl9NQVNLIHwgUFRfV1JJVEFCTEVfTUFTSzsKK30KKworc3RhdGljIHZvaWQgRk5BTUUocmVsZWFzZV93YWxrZXIpKHN0cnVjdCBndWVzdF93YWxrZXIgKndhbGtlcikKK3sKKwlrdW5tYXBfYXRvbWljKHdhbGtlci0+dGFibGUsIEtNX1VTRVIwKTsKK30KKworc3RhdGljIHZvaWQgRk5BTUUoc2V0X3B0ZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3Vlc3RfcHRlLAorCQkJICAgdTY0ICpzaGFkb3dfcHRlLCB1NjQgYWNjZXNzX2JpdHMpCit7CisJQVNTRVJUKCpzaGFkb3dfcHRlID09IDApOworCWFjY2Vzc19iaXRzICY9IGd1ZXN0X3B0ZTsKKwkqc2hhZG93X3B0ZSA9IChndWVzdF9wdGUgJiBQVF9QVEVfQ09QWV9NQVNLKTsKKwlzZXRfcHRlX2NvbW1vbih2Y3B1LCBzaGFkb3dfcHRlLCBndWVzdF9wdGUgJiBQVF9CQVNFX0FERFJfTUFTSywKKwkJICAgICAgIGd1ZXN0X3B0ZSAmIFBUX0RJUlRZX01BU0ssIGFjY2Vzc19iaXRzKTsKK30KKworc3RhdGljIHZvaWQgRk5BTUUoc2V0X3BkZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3Vlc3RfcGRlLAorCQkJICAgdTY0ICpzaGFkb3dfcHRlLCB1NjQgYWNjZXNzX2JpdHMsCisJCQkgICBpbnQgaW5kZXgpCit7CisJZ3BhX3QgZ2FkZHI7CisKKwlBU1NFUlQoKnNoYWRvd19wdGUgPT0gMCk7CisJYWNjZXNzX2JpdHMgJj0gZ3Vlc3RfcGRlOworCWdhZGRyID0gKGd1ZXN0X3BkZSAmIFBUX0RJUl9CQVNFX0FERFJfTUFTSykgKyBQQUdFX1NJWkUgKiBpbmRleDsKKwlpZiAoUFRUWVBFID09IDMyICYmIGlzX2NwdWlkX1BTRTM2KCkpCisJCWdhZGRyIHw9IChndWVzdF9wZGUgJiBQVDMyX0RJUl9QU0UzNl9NQVNLKSA8PAorCQkJKDMyIC0gUFQzMl9ESVJfUFNFMzZfU0hJRlQpOworCSpzaGFkb3dfcHRlID0gZ3Vlc3RfcGRlICYgUFRfUFRFX0NPUFlfTUFTSzsKKwlzZXRfcHRlX2NvbW1vbih2Y3B1LCBzaGFkb3dfcHRlLCBnYWRkciwKKwkJICAgICAgIGd1ZXN0X3BkZSAmIFBUX0RJUlRZX01BU0ssIGFjY2Vzc19iaXRzKTsKK30KKworLyoKKyAqIEZldGNoIGEgZ3Vlc3QgcHRlIGZyb20gYSBzcGVjaWZpYyBsZXZlbCBpbiB0aGUgcGFnaW5nIGhpZXJhcmNoeS4KKyAqLworc3RhdGljIHB0X2VsZW1lbnRfdCAqRk5BTUUoZmV0Y2hfZ3Vlc3QpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkJc3RydWN0IGd1ZXN0X3dhbGtlciAqd2Fsa2VyLAorCQkJCQlpbnQgbGV2ZWwsCisJCQkJCWd2YV90IGFkZHIpCit7CisKKwlBU1NFUlQobGV2ZWwgPiAwICAmJiBsZXZlbCA8PSB3YWxrZXItPmxldmVsKTsKKworCWZvciAoOzspIHsKKwkJaW50IGluZGV4ID0gUFRfSU5ERVgoYWRkciwgd2Fsa2VyLT5sZXZlbCk7CisJCWhwYV90IHBhZGRyOworCisJCUFTU0VSVCgoKHVuc2lnbmVkIGxvbmcpd2Fsa2VyLT50YWJsZSAmIFBBR0VfTUFTSykgPT0KKwkJICAgICAgICgodW5zaWduZWQgbG9uZykmd2Fsa2VyLT50YWJsZVtpbmRleF0gJiBQQUdFX01BU0spKTsKKwkJaWYgKGxldmVsID09IHdhbGtlci0+bGV2ZWwgfHwKKwkJICAgICFpc19wcmVzZW50X3B0ZSh3YWxrZXItPnRhYmxlW2luZGV4XSkgfHwKKwkJICAgICh3YWxrZXItPmxldmVsID09IFBUX0RJUkVDVE9SWV9MRVZFTCAmJgorCQkgICAgICh3YWxrZXItPnRhYmxlW2luZGV4XSAmIFBUX1BBR0VfU0laRV9NQVNLKSAmJgorCQkgICAgIChQVFRZUEUgPT0gNjQgfHwgaXNfcHNlKHZjcHUpKSkpCisJCQlyZXR1cm4gJndhbGtlci0+dGFibGVbaW5kZXhdOworCQlpZiAod2Fsa2VyLT5sZXZlbCAhPSAzIHx8IGt2bV9hcmNoX29wcy0+aXNfbG9uZ19tb2RlKHZjcHUpKQorCQkJd2Fsa2VyLT5pbmhlcml0ZWRfYXIgJj0gd2Fsa2VyLT50YWJsZVtpbmRleF07CisJCXBhZGRyID0gc2FmZV9ncGFfdG9faHBhKHZjcHUsIHdhbGtlci0+dGFibGVbaW5kZXhdICYgUFRfQkFTRV9BRERSX01BU0spOworCQlrdW5tYXBfYXRvbWljKHdhbGtlci0+dGFibGUsIEtNX1VTRVIwKTsKKwkJd2Fsa2VyLT50YWJsZSA9IGttYXBfYXRvbWljKHBmbl90b19wYWdlKHBhZGRyID4+IFBBR0VfU0hJRlQpLAorCQkJCQkgICAgS01fVVNFUjApOworCQktLXdhbGtlci0+bGV2ZWw7CisJfQorfQorCisvKgorICogRmV0Y2ggYSBzaGFkb3cgcHRlIGZvciBhIHNwZWNpZmljIGxldmVsIGluIHRoZSBwYWdpbmcgaGllcmFyY2h5LgorICovCitzdGF0aWMgdTY0ICpGTkFNRShmZXRjaCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyLAorCQkJICAgICAgc3RydWN0IGd1ZXN0X3dhbGtlciAqd2Fsa2VyKQoreworCWhwYV90IHNoYWRvd19hZGRyOworCWludCBsZXZlbDsKKwl1NjQgKnByZXZfc2hhZG93X2VudCA9IE5VTEw7CisKKwlzaGFkb3dfYWRkciA9IHZjcHUtPm1tdS5yb290X2hwYTsKKwlsZXZlbCA9IHZjcHUtPm1tdS5zaGFkb3dfcm9vdF9sZXZlbDsKKworCWZvciAoOyA7IGxldmVsLS0pIHsKKwkJdTMyIGluZGV4ID0gU0hBRE9XX1BUX0lOREVYKGFkZHIsIGxldmVsKTsKKwkJdTY0ICpzaGFkb3dfZW50ID0gKCh1NjQgKilfX3ZhKHNoYWRvd19hZGRyKSkgKyBpbmRleDsKKwkJcHRfZWxlbWVudF90ICpndWVzdF9lbnQ7CisJCXU2NCBzaGFkb3dfcHRlOworCisJCWlmIChpc19wcmVzZW50X3B0ZSgqc2hhZG93X2VudCkgfHwgaXNfaW9fcHRlKCpzaGFkb3dfZW50KSkgeworCQkJaWYgKGxldmVsID09IFBUX1BBR0VfVEFCTEVfTEVWRUwpCisJCQkJcmV0dXJuIHNoYWRvd19lbnQ7CisJCQlzaGFkb3dfYWRkciA9ICpzaGFkb3dfZW50ICYgUFQ2NF9CQVNFX0FERFJfTUFTSzsKKwkJCXByZXZfc2hhZG93X2VudCA9IHNoYWRvd19lbnQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChQVFRZUEUgPT0gMzIgJiYgbGV2ZWwgPiBQVDMyX1JPT1RfTEVWRUwpIHsKKwkJCUFTU0VSVChsZXZlbCA9PSBQVDMyRV9ST09UX0xFVkVMKTsKKwkJCWd1ZXN0X2VudCA9IEZOQU1FKGZldGNoX2d1ZXN0KSh2Y3B1LCB3YWxrZXIsCisJCQkJCQkgICAgICAgUFQzMl9ST09UX0xFVkVMLCBhZGRyKTsKKwkJfSBlbHNlCisJCQlndWVzdF9lbnQgPSBGTkFNRShmZXRjaF9ndWVzdCkodmNwdSwgd2Fsa2VyLAorCQkJCQkJICAgICAgIGxldmVsLCBhZGRyKTsKKworCQlpZiAoIWlzX3ByZXNlbnRfcHRlKCpndWVzdF9lbnQpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyogRG9uJ3Qgc2V0IGFjY2Vzc2VkIGJpdCBvbiBQQUUgUERQVFJzICovCisJCWlmICh2Y3B1LT5tbXUucm9vdF9sZXZlbCAhPSAzIHx8IHdhbGtlci0+bGV2ZWwgIT0gMykKKwkJCSpndWVzdF9lbnQgfD0gUFRfQUNDRVNTRURfTUFTSzsKKworCQlpZiAobGV2ZWwgPT0gUFRfUEFHRV9UQUJMRV9MRVZFTCkgeworCisJCQlpZiAod2Fsa2VyLT5sZXZlbCA9PSBQVF9ESVJFQ1RPUllfTEVWRUwpIHsKKwkJCQlpZiAocHJldl9zaGFkb3dfZW50KQorCQkJCQkqcHJldl9zaGFkb3dfZW50IHw9IFBUX1NIQURPV19QU19NQVJLOworCQkJCUZOQU1FKHNldF9wZGUpKHZjcHUsICpndWVzdF9lbnQsIHNoYWRvd19lbnQsCisJCQkJCSAgICAgICB3YWxrZXItPmluaGVyaXRlZF9hciwKKwkJCQkgICAgICAgICAgUFRfSU5ERVgoYWRkciwgUFRfUEFHRV9UQUJMRV9MRVZFTCkpOworCQkJfSBlbHNlIHsKKwkJCQlBU1NFUlQod2Fsa2VyLT5sZXZlbCA9PSBQVF9QQUdFX1RBQkxFX0xFVkVMKTsKKwkJCQlGTkFNRShzZXRfcHRlKSh2Y3B1LCAqZ3Vlc3RfZW50LCBzaGFkb3dfZW50LCB3YWxrZXItPmluaGVyaXRlZF9hcik7CisJCQl9CisJCQlyZXR1cm4gc2hhZG93X2VudDsKKwkJfQorCisJCXNoYWRvd19hZGRyID0ga3ZtX21tdV9hbGxvY19wYWdlKHZjcHUsIHNoYWRvd19lbnQpOworCQlpZiAoIVZBTElEX1BBR0Uoc2hhZG93X2FkZHIpKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXNoYWRvd19wdGUgPSBzaGFkb3dfYWRkciB8IFBUX1BSRVNFTlRfTUFTSzsKKwkJaWYgKHZjcHUtPm1tdS5yb290X2xldmVsID4gMyB8fCBsZXZlbCAhPSAzKQorCQkJc2hhZG93X3B0ZSB8PSBQVF9BQ0NFU1NFRF9NQVNLCisJCQkJfCBQVF9XUklUQUJMRV9NQVNLIHwgUFRfVVNFUl9NQVNLOworCQkqc2hhZG93X2VudCA9IHNoYWRvd19wdGU7CisJCXByZXZfc2hhZG93X2VudCA9IHNoYWRvd19lbnQ7CisJfQorfQorCisvKgorICogVGhlIGd1ZXN0IGZhdWx0ZWQgZm9yIHdyaXRlLiAgV2UgbmVlZCB0bworICoKKyAqIC0gY2hlY2sgd3JpdGUgcGVybWlzc2lvbnMKKyAqIC0gdXBkYXRlIHRoZSBndWVzdCBwdGUgZGlydHkgYml0CisgKiAtIHVwZGF0ZSBvdXIgb3duIGRpcnR5IHBhZ2UgdHJhY2tpbmcgc3RydWN0dXJlcworICovCitzdGF0aWMgaW50IEZOQU1FKGZpeF93cml0ZV9wZikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgICAgIHU2NCAqc2hhZG93X2VudCwKKwkJCSAgICAgICBzdHJ1Y3QgZ3Vlc3Rfd2Fsa2VyICp3YWxrZXIsCisJCQkgICAgICAgZ3ZhX3QgYWRkciwKKwkJCSAgICAgICBpbnQgdXNlcikKK3sKKwlwdF9lbGVtZW50X3QgKmd1ZXN0X2VudDsKKwlpbnQgd3JpdGFibGVfc2hhZG93OworCWdmbl90IGdmbjsKKworCWlmIChpc193cml0ZWJsZV9wdGUoKnNoYWRvd19lbnQpKQorCQlyZXR1cm4gMDsKKworCXdyaXRhYmxlX3NoYWRvdyA9ICpzaGFkb3dfZW50ICYgUFRfU0hBRE9XX1dSSVRBQkxFX01BU0s7CisJaWYgKHVzZXIpIHsKKwkJLyoKKwkJICogVXNlciBtb2RlIGFjY2Vzcy4gIEZhaWwgaWYgaXQncyBhIGtlcm5lbCBwYWdlIG9yIGEgcmVhZC1vbmx5CisJCSAqIHBhZ2UuCisJCSAqLworCQlpZiAoISgqc2hhZG93X2VudCAmIFBUX1NIQURPV19VU0VSX01BU0spIHx8ICF3cml0YWJsZV9zaGFkb3cpCisJCQlyZXR1cm4gMDsKKwkJQVNTRVJUKCpzaGFkb3dfZW50ICYgUFRfVVNFUl9NQVNLKTsKKwl9IGVsc2UKKwkJLyoKKwkJICogS2VybmVsIG1vZGUgYWNjZXNzLiAgRmFpbCBpZiBpdCdzIGEgcmVhZC1vbmx5IHBhZ2UgYW5kCisJCSAqIHN1cGVydmlzb3Igd3JpdGUgcHJvdGVjdGlvbiBpcyBlbmFibGVkLgorCQkgKi8KKwkJaWYgKCF3cml0YWJsZV9zaGFkb3cpIHsKKwkJCWlmIChpc193cml0ZV9wcm90ZWN0aW9uKHZjcHUpKQorCQkJCXJldHVybiAwOworCQkJKnNoYWRvd19lbnQgJj0gflBUX1VTRVJfTUFTSzsKKwkJfQorCisJZ3Vlc3RfZW50ID0gRk5BTUUoZmV0Y2hfZ3Vlc3QpKHZjcHUsIHdhbGtlciwgUFRfUEFHRV9UQUJMRV9MRVZFTCwgYWRkcik7CisKKwlpZiAoIWlzX3ByZXNlbnRfcHRlKCpndWVzdF9lbnQpKSB7CisJCSpzaGFkb3dfZW50ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJZ2ZuID0gKCpndWVzdF9lbnQgJiBQVDY0X0JBU0VfQUREUl9NQVNLKSA+PiBQQUdFX1NISUZUOworCW1hcmtfcGFnZV9kaXJ0eSh2Y3B1LT5rdm0sIGdmbik7CisJKnNoYWRvd19lbnQgfD0gUFRfV1JJVEFCTEVfTUFTSzsKKwkqZ3Vlc3RfZW50IHw9IFBUX0RJUlRZX01BU0s7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFBhZ2UgZmF1bHQgaGFuZGxlci4gIFRoZXJlIGFyZSBzZXZlcmFsIGNhdXNlcyBmb3IgYSBwYWdlIGZhdWx0OgorICogICAtIHRoZXJlIGlzIG5vIHNoYWRvdyBwdGUgZm9yIHRoZSBndWVzdCBwdGUKKyAqICAgLSB3cml0ZSBhY2Nlc3MgdGhyb3VnaCBhIHNoYWRvdyBwdGUgbWFya2VkIHJlYWQgb25seSBzbyB0aGF0IHdlIGNhbiBzZXQKKyAqICAgICB0aGUgZGlydHkgYml0CisgKiAgIC0gd3JpdGUgYWNjZXNzIHRvIGEgc2hhZG93IHB0ZSBtYXJrZWQgcmVhZCBvbmx5IHNvIHdlIGNhbiB1cGRhdGUgdGhlIHBhZ2UKKyAqICAgICBkaXJ0eSBiaXRtYXAsIHdoZW4gdXNlcnNwYWNlIHJlcXVlc3RzIGl0CisgKiAgIC0gbW1pbyBhY2Nlc3M7IGluIHRoaXMgY2FzZSB3ZSB3aWxsIG5ldmVyIGluc3RhbGwgYSBwcmVzZW50IHNoYWRvdyBwdGUKKyAqICAgLSBub3JtYWwgZ3Vlc3QgcGFnZSBmYXVsdCBkdWUgdG8gdGhlIGd1ZXN0IHB0ZSBtYXJrZWQgbm90IHByZXNlbnQsIG5vdAorICogICAgIHdyaXRhYmxlLCBvciBub3QgZXhlY3V0YWJsZQorICoKKyAqICBSZXR1cm5zOiAxIGlmIHdlIG5lZWQgdG8gZW11bGF0ZSB0aGUgaW5zdHJ1Y3Rpb24sIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgRk5BTUUocGFnZV9mYXVsdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyLAorCQkJICAgICAgIHUzMiBlcnJvcl9jb2RlKQoreworCWludCB3cml0ZV9mYXVsdCA9IGVycm9yX2NvZGUgJiBQRkVSUl9XUklURV9NQVNLOworCWludCBwdGVfcHJlc2VudCA9IGVycm9yX2NvZGUgJiBQRkVSUl9QUkVTRU5UX01BU0s7CisJaW50IHVzZXJfZmF1bHQgPSBlcnJvcl9jb2RlICYgUEZFUlJfVVNFUl9NQVNLOworCXN0cnVjdCBndWVzdF93YWxrZXIgd2Fsa2VyOworCXU2NCAqc2hhZG93X3B0ZTsKKwlpbnQgZml4ZWQ7CisKKwkvKgorCSAqIExvb2sgdXAgdGhlIHNoYWRvdyBwdGUgZm9yIHRoZSBmYXVsdGluZyBhZGRyZXNzLgorCSAqLworCWZvciAoOzspIHsKKwkJRk5BTUUoaW5pdF93YWxrZXIpKCZ3YWxrZXIsIHZjcHUpOworCQlzaGFkb3dfcHRlID0gRk5BTUUoZmV0Y2gpKHZjcHUsIGFkZHIsICZ3YWxrZXIpOworCQlpZiAoSVNfRVJSKHNoYWRvd19wdGUpKSB7ICAvKiBtdXN0IGJlIC1FTk9NRU0gKi8KKwkJCW5vbnBhZ2luZ19mbHVzaCh2Y3B1KTsKKwkJCUZOQU1FKHJlbGVhc2Vfd2Fsa2VyKSgmd2Fsa2VyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKworCS8qCisJICogVGhlIHBhZ2UgaXMgbm90IG1hcHBlZCBieSB0aGUgZ3Vlc3QuICBMZXQgdGhlIGd1ZXN0IGhhbmRsZSBpdC4KKwkgKi8KKwlpZiAoIXNoYWRvd19wdGUpIHsKKwkJaW5qZWN0X3BhZ2VfZmF1bHQodmNwdSwgYWRkciwgZXJyb3JfY29kZSk7CisJCUZOQU1FKHJlbGVhc2Vfd2Fsa2VyKSgmd2Fsa2VyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgdGhlIHNoYWRvdyBwdGUuCisJICovCisJaWYgKHdyaXRlX2ZhdWx0KQorCQlmaXhlZCA9IEZOQU1FKGZpeF93cml0ZV9wZikodmNwdSwgc2hhZG93X3B0ZSwgJndhbGtlciwgYWRkciwKKwkJCQkJICAgIHVzZXJfZmF1bHQpOworCWVsc2UKKwkJZml4ZWQgPSBmaXhfcmVhZF9wZihzaGFkb3dfcHRlKTsKKworCUZOQU1FKHJlbGVhc2Vfd2Fsa2VyKSgmd2Fsa2VyKTsKKworCS8qCisJICogbW1pbzogZW11bGF0ZSBpZiBhY2Nlc3NpYmxlLCBvdGhlcndpc2UgaXRzIGEgZ3Vlc3QgZmF1bHQuCisJICovCisJaWYgKGlzX2lvX3B0ZSgqc2hhZG93X3B0ZSkpIHsKKwkJaWYgKG1heV9hY2Nlc3MoKnNoYWRvd19wdGUsIHdyaXRlX2ZhdWx0LCB1c2VyX2ZhdWx0KSkKKwkJCXJldHVybiAxOworCQlwZ3ByaW50aygiJXM6IGlvIHdvcmssIG5vIGFjY2Vzc1xuIiwgX19GVU5DVElPTl9fKTsKKwkJaW5qZWN0X3BhZ2VfZmF1bHQodmNwdSwgYWRkciwKKwkJCQkgIGVycm9yX2NvZGUgfCBQRkVSUl9QUkVTRU5UX01BU0spOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIHB0ZSBub3QgcHJlc2VudCwgZ3Vlc3QgcGFnZSBmYXVsdC4KKwkgKi8KKwlpZiAocHRlX3ByZXNlbnQgJiYgIWZpeGVkKSB7CisJCWluamVjdF9wYWdlX2ZhdWx0KHZjcHUsIGFkZHIsIGVycm9yX2NvZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkrK2t2bV9zdGF0LnBmX2ZpeGVkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBncGFfdCBGTkFNRShndmFfdG9fZ3BhKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IHZhZGRyKQoreworCXN0cnVjdCBndWVzdF93YWxrZXIgd2Fsa2VyOworCXB0X2VsZW1lbnRfdCBndWVzdF9wdGU7CisJZ3BhX3QgZ3BhOworCisJRk5BTUUoaW5pdF93YWxrZXIpKCZ3YWxrZXIsIHZjcHUpOworCWd1ZXN0X3B0ZSA9ICpGTkFNRShmZXRjaF9ndWVzdCkodmNwdSwgJndhbGtlciwgUFRfUEFHRV9UQUJMRV9MRVZFTCwKKwkJCQkJdmFkZHIpOworCUZOQU1FKHJlbGVhc2Vfd2Fsa2VyKSgmd2Fsa2VyKTsKKworCWlmICghaXNfcHJlc2VudF9wdGUoZ3Vlc3RfcHRlKSkKKwkJcmV0dXJuIFVOTUFQUEVEX0dWQTsKKworCWlmICh3YWxrZXIubGV2ZWwgPT0gUFRfRElSRUNUT1JZX0xFVkVMKSB7CisJCUFTU0VSVCgoZ3Vlc3RfcHRlICYgUFRfUEFHRV9TSVpFX01BU0spKTsKKwkJQVNTRVJUKFBUVFlQRSA9PSA2NCB8fCBpc19wc2UodmNwdSkpOworCisJCWdwYSA9IChndWVzdF9wdGUgJiBQVF9ESVJfQkFTRV9BRERSX01BU0spIHwgKHZhZGRyICYKKwkJCShQVF9MRVZFTF9NQVNLKFBUX1BBR0VfVEFCTEVfTEVWRUwpIHwgflBBR0VfTUFTSykpOworCisJCWlmIChQVFRZUEUgPT0gMzIgJiYgaXNfY3B1aWRfUFNFMzYoKSkKKwkJCWdwYSB8PSAoZ3Vlc3RfcHRlICYgUFQzMl9ESVJfUFNFMzZfTUFTSykgPDwKKwkJCQkJKDMyIC0gUFQzMl9ESVJfUFNFMzZfU0hJRlQpOworCX0gZWxzZSB7CisJCWdwYSA9IChndWVzdF9wdGUgJiBQVF9CQVNFX0FERFJfTUFTSyk7CisJCWdwYSB8PSAodmFkZHIgJiB+UEFHRV9NQVNLKTsKKwl9CisKKwlyZXR1cm4gZ3BhOworfQorCisjdW5kZWYgcHRfZWxlbWVudF90CisjdW5kZWYgZ3Vlc3Rfd2Fsa2VyCisjdW5kZWYgRk5BTUUKKyN1bmRlZiBQVF9CQVNFX0FERFJfTUFTSworI3VuZGVmIFBUX0lOREVYCisjdW5kZWYgU0hBRE9XX1BUX0lOREVYCisjdW5kZWYgUFRfTEVWRUxfTUFTSworI3VuZGVmIFBUX1BURV9DT1BZX01BU0sKKyN1bmRlZiBQVF9OT05fUFRFX0NPUFlfTUFTSworI3VuZGVmIFBUX0RJUl9CQVNFX0FERFJfTUFTSwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0vc2VnbWVudF9kZXNjcmlwdG9yLmggYi9kcml2ZXJzL2t2bS9zZWdtZW50X2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWZkZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9rdm0vc2VnbWVudF9kZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwxNyBAQAorc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvciB7CisJdTE2IGxpbWl0X2xvdzsKKwl1MTYgYmFzZV9sb3c7CisJdTggIGJhc2VfbWlkOworCXU4ICB0eXBlIDogNDsKKwl1OCAgc3lzdGVtIDogMTsKKwl1OCAgZHBsIDogMjsKKwl1OCAgcHJlc2VudCA6IDE7CisJdTggIGxpbWl0X2hpZ2ggOiA0OworCXU4ICBhdmwgOiAxOworCXU4ICBsb25nX21vZGUgOiAxOworCXU4ICBkZWZhdWx0X29wIDogMTsKKwl1OCAgZ3JhbnVsYXJpdHkgOiAxOworCXU4ICBiYXNlX2hpZ2g7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMva3ZtL3N2bS5jIGIvZHJpdmVycy9rdm0vc3ZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2YmM4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMva3ZtL3N2bS5jCkBAIC0wLDAgKzEsMTY0MSBAQAorLyoKKyAqIEtlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIEFNRCBTVk0gc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBRdW1yYW5ldCwgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgIFlhbml2IEthbWF5ICA8eWFuaXZAcXVtcmFuZXQuY29tPgorICogICBBdmkgS2l2aXR5ICAgPGF2aUBxdW1yYW5ldC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCisjaW5jbHVkZSAia3ZtX3N2bS5oIgorI2luY2x1ZGUgIng4Nl9lbXVsYXRlLmgiCisKK01PRFVMRV9BVVRIT1IoIlF1bXJhbmV0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgSU9QTV9BTExPQ19PUkRFUiAyCisjZGVmaW5lIE1TUlBNX0FMTE9DX09SREVSIDEKKworI2RlZmluZSBEQl9WRUNUT1IgMQorI2RlZmluZSBVRF9WRUNUT1IgNgorI2RlZmluZSBHUF9WRUNUT1IgMTMKKworI2RlZmluZSBEUjdfR0RfTUFTSyAoMSA8PCAxMykKKyNkZWZpbmUgRFI2X0JEX01BU0sgKDEgPDwgMTMpCisjZGVmaW5lIENSNF9ERV9NQVNLICgxVUwgPDwgMykKKworI2RlZmluZSBTRUdfVFlQRV9MRFQgMgorI2RlZmluZSBTRUdfVFlQRV9CVVNZX1RTUzE2IDMKKworI2RlZmluZSBLVk1fRUZFUl9MTUEgKDEgPDwgMTApCisjZGVmaW5lIEtWTV9FRkVSX0xNRSAoMSA8PCA4KQorCit1bnNpZ25lZCBsb25nIGlvcG1fYmFzZTsKK3Vuc2lnbmVkIGxvbmcgbXNycG1fYmFzZTsKKworc3RydWN0IGt2bV9sZHR0c3NfZGVzYyB7CisJdTE2IGxpbWl0MDsKKwl1MTYgYmFzZTA7CisJdW5zaWduZWQgYmFzZTEgOiA4LCB0eXBlIDogNSwgZHBsIDogMiwgcCA6IDE7CisJdW5zaWduZWQgbGltaXQxIDogNCwgemVybzAgOiAzLCBnIDogMSwgYmFzZTIgOiA4OworCXUzMiBiYXNlMzsKKwl1MzIgemVybzE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3ZtX2NwdV9kYXRhIHsKKwlpbnQgY3B1OworCisJdWludDY0X3QgYXNpZF9nZW5lcmF0aW9uOworCXVpbnQzMl90IG1heF9hc2lkOworCXVpbnQzMl90IG5leHRfYXNpZDsKKwlzdHJ1Y3Qga3ZtX2xkdHRzc19kZXNjICp0c3NfZGVzYzsKKworCXN0cnVjdCBwYWdlICpzYXZlX2FyZWE7Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN2bV9jcHVfZGF0YSAqLCBzdm1fZGF0YSk7CisKK3N0cnVjdCBzdm1faW5pdF9kYXRhIHsKKwlpbnQgY3B1OworCWludCByOworfTsKKworc3RhdGljIHUzMiBtc3JwbV9yYW5nZXNbXSA9IHswLCAweGMwMDAwMDAwLCAweGMwMDEwMDAwfTsKKworI2RlZmluZSBOVU1fTVNSX01BUFMgKHNpemVvZihtc3JwbV9yYW5nZXMpIC8gc2l6ZW9mKCptc3JwbV9yYW5nZXMpKQorI2RlZmluZSBNU1JTX1JBTkdFX1NJWkUgMjA0OAorI2RlZmluZSBNU1JTX0lOX1JBTkdFIChNU1JTX1JBTkdFX1NJWkUgKiA4IC8gMikKKworI2RlZmluZSBNQVhfSU5TVF9TSVpFIDE1CisKK3N0YXRpYyB1bnNpZ25lZCBnZXRfYWRkcl9zaXplKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qgdm1jYl9zYXZlX2FyZWEgKnNhID0gJnZjcHUtPnN2bS0+dm1jYi0+c2F2ZTsKKwl1MTYgY3NfYXR0cmliOworCisJaWYgKCEoc2EtPmNyMCAmIENSMF9QRV9NQVNLKSB8fCAoc2EtPnJmbGFncyAmIFg4Nl9FRkxBR1NfVk0pKQorCQlyZXR1cm4gMjsKKworCWNzX2F0dHJpYiA9IHNhLT5jcy5hdHRyaWI7CisKKwlyZXR1cm4gKGNzX2F0dHJpYiAmIFNWTV9TRUxFQ1RPUl9MX01BU0spID8gOCA6CisJCQkJKGNzX2F0dHJpYiAmIFNWTV9TRUxFQ1RPUl9EQl9NQVNLKSA/IDQgOiAyOworfQorCitzdGF0aWMgaW5saW5lIHU4IHBvcF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWludCB3b3JkX2luZGV4ID0gX19mZnModmNwdS0+aXJxX3N1bW1hcnkpOworCWludCBiaXRfaW5kZXggPSBfX2Zmcyh2Y3B1LT5pcnFfcGVuZGluZ1t3b3JkX2luZGV4XSk7CisJaW50IGlycSA9IHdvcmRfaW5kZXggKiBCSVRTX1BFUl9MT05HICsgYml0X2luZGV4OworCisJY2xlYXJfYml0KGJpdF9pbmRleCwgJnZjcHUtPmlycV9wZW5kaW5nW3dvcmRfaW5kZXhdKTsKKwlpZiAoIXZjcHUtPmlycV9wZW5kaW5nW3dvcmRfaW5kZXhdKQorCQljbGVhcl9iaXQod29yZF9pbmRleCwgJnZjcHUtPmlycV9zdW1tYXJ5KTsKKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHVzaF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1OCBpcnEpCit7CisJc2V0X2JpdChpcnEsIHZjcHUtPmlycV9wZW5kaW5nKTsKKwlzZXRfYml0KGlycSAvIEJJVFNfUEVSX0xPTkcsICZ2Y3B1LT5pcnFfc3VtbWFyeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGdpKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlIChTVk1fQ0xHSSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGdpKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlIChTVk1fU1RHSSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnZscGdhKHVuc2lnbmVkIGxvbmcgYWRkciwgdTMyIGFzaWQpCit7CisJYXNtIHZvbGF0aWxlIChTVk1fSU5WTFBHQSA6OiAiYSIoYWRkciksICJjIihhc2lkKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrdm1fcmVhZF9jcjIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyMjsKKworCWFzbSB2b2xhdGlsZSAoIm1vdiAlJWNyMiwgJTAiIDogIj1yIiAoY3IyKSk7CisJcmV0dXJuIGNyMjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGt2bV93cml0ZV9jcjIodW5zaWduZWQgbG9uZyB2YWwpCit7CisJYXNtIHZvbGF0aWxlICgibW92ICUwLCAlJWNyMiIgOjogInIiICh2YWwpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfZHI2KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBkcjY7CisKKwlhc20gdm9sYXRpbGUgKCJtb3YgJSVkcjYsICUwIiA6ICI9ciIgKGRyNikpOworCXJldHVybiBkcjY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9kcjYodW5zaWduZWQgbG9uZyB2YWwpCit7CisJYXNtIHZvbGF0aWxlICgibW92ICUwLCAlJWRyNiIgOjogInIiICh2YWwpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfZHI3KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBkcjc7CisKKwlhc20gdm9sYXRpbGUgKCJtb3YgJSVkcjcsICUwIiA6ICI9ciIgKGRyNykpOworCXJldHVybiBkcjc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9kcjcodW5zaWduZWQgbG9uZyB2YWwpCit7CisJYXNtIHZvbGF0aWxlICgibW92ICUwLCAlJWRyNyIgOjogInIiICh2YWwpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3ZtX2lzX2xvbmdfbW9kZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5lZmVyICYgS1ZNX0VGRVJfTE1BOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZm9yY2VfbmV3X2FzaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZjcHUtPnN2bS0+YXNpZF9nZW5lcmF0aW9uLS07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9ndWVzdF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWZvcmNlX25ld19hc2lkKHZjcHUpOworfQorCitzdGF0aWMgdm9pZCBzdm1fc2V0X2VmZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZWZlcikKK3sKKwlpZiAoIShlZmVyICYgS1ZNX0VGRVJfTE1BKSkKKwkJZWZlciAmPSB+S1ZNX0VGRVJfTE1FOworCisJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmVmZXIgPSBlZmVyIHwgTVNSX0VGRVJfU1ZNRV9NQVNLOworCXZjcHUtPnNoYWRvd19lZmVyID0gZWZlcjsKK30KKworc3RhdGljIHZvaWQgc3ZtX2luamVjdF9ncChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGVycm9yX2NvZGUpCit7CisJdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLmV2ZW50X2luaiA9IAlTVk1fRVZUSU5KX1ZBTElEIHwKKwkJCQkJCVNWTV9FVlRJTkpfVkFMSURfRVJSIHwKKwkJCQkJCVNWTV9FVlRJTkpfVFlQRV9FWEVQVCB8CisJCQkJCQlHUF9WRUNUT1I7CisJdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLmV2ZW50X2lual9lcnIgPSBlcnJvcl9jb2RlOworfQorCitzdGF0aWMgdm9pZCBpbmplY3RfdWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZjcHUtPnN2bS0+dm1jYi0+Y29udHJvbC5ldmVudF9pbmogPSAJU1ZNX0VWVElOSl9WQUxJRCB8CisJCQkJCQlTVk1fRVZUSU5KX1RZUEVfRVhFUFQgfAorCQkJCQkJVURfVkVDVE9SOworfQorCitzdGF0aWMgdm9pZCBpbmplY3RfZGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZjcHUtPnN2bS0+dm1jYi0+Y29udHJvbC5ldmVudF9pbmogPSAJU1ZNX0VWVElOSl9WQUxJRCB8CisJCQkJCQlTVk1fRVZUSU5KX1RZUEVfRVhFUFQgfAorCQkJCQkJREJfVkVDVE9SOworfQorCitzdGF0aWMgaW50IGlzX3BhZ2VfZmF1bHQodWludDMyX3QgaW5mbykKK3sKKwlpbmZvICY9IFNWTV9FVlRJTkpfVkVDX01BU0sgfCBTVk1fRVZUSU5KX1RZUEVfTUFTSyB8IFNWTV9FVlRJTkpfVkFMSUQ7CisJcmV0dXJuIGluZm8gPT0gKFBGX1ZFQ1RPUiB8IFNWTV9FVlRJTkpfVkFMSUQgfCBTVk1fRVZUSU5KX1RZUEVfRVhFUFQpOworfQorCitzdGF0aWMgaW50IGlzX2V4dGVybmFsX2ludGVycnVwdCh1MzIgaW5mbykKK3sKKwlpbmZvICY9IFNWTV9FVlRJTkpfVFlQRV9NQVNLIHwgU1ZNX0VWVElOSl9WQUxJRDsKKwlyZXR1cm4gaW5mbyA9PSAoU1ZNX0VWVElOSl9WQUxJRCB8IFNWTV9FVlRJTkpfVFlQRV9JTlRSKTsKK30KKworc3RhdGljIHZvaWQgc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaWYgKCF2Y3B1LT5zdm0tPm5leHRfcmlwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTk9QXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCWlmICh2Y3B1LT5zdm0tPm5leHRfcmlwIC0gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnJpcCA+IDE1KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlwIDB4JWxseCBuZXh0IDB4JWxseFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5yaXAsCisJCSAgICAgICB2Y3B1LT5zdm0tPm5leHRfcmlwKTsKKwl9CisKKwl2Y3B1LT5yaXAgPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucmlwID0gdmNwdS0+c3ZtLT5uZXh0X3JpcDsKKwl2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuaW50X3N0YXRlICY9IH5TVk1fSU5URVJSVVBUX1NIQURPV19NQVNLOworfQorCitzdGF0aWMgaW50IGhhc19zdm0odm9pZCkKK3sKKwl1aW50MzJfdCBlYXgsIGVieCwgZWN4LCBlZHg7CisKKwlpZiAoY3VycmVudF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhhc19zdm06IG5vdCBhbWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljcHVpZCgweDgwMDAwMDAwLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlpZiAoZWF4IDwgU1ZNX0NQVUlEX0ZVTkMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaGFzX3N2bTogY2FuJ3QgZXhlY3V0ZSBjcHVpZF84MDAwMDAwYVxuIik7CisJCXJldHVybiAwOworCX0KKworCWNwdWlkKDB4ODAwMDAwMDEsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCWlmICghKGVjeCAmICgxIDw8IFNWTV9DUFVJRF9GRUFUVVJFX1NISUZUKSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImhhc19zdm06IHN2bSBub3QgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzdm1faGFyZHdhcmVfZGlzYWJsZSh2b2lkICpnYXJiYWdlKQoreworCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnN2bV9kYXRhCisJCT0gcGVyX2NwdShzdm1fZGF0YSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlpZiAoc3ZtX2RhdGEpIHsKKwkJdWludDY0X3QgZWZlcjsKKworCQl3cm1zcmwoTVNSX1ZNX0hTQVZFX1BBLCAwKTsKKwkJcmRtc3JsKE1TUl9FRkVSLCBlZmVyKTsKKwkJd3Jtc3JsKE1TUl9FRkVSLCBlZmVyICYgfk1TUl9FRkVSX1NWTUVfTUFTSyk7CisJCXBlcl9jcHUoc3ZtX2RhdGEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpID0gMDsKKwkJX19mcmVlX3BhZ2Uoc3ZtX2RhdGEtPnNhdmVfYXJlYSk7CisJCWtmcmVlKHN2bV9kYXRhKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN2bV9oYXJkd2FyZV9lbmFibGUodm9pZCAqZ2FyYmFnZSkKK3sKKworCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnN2bV9kYXRhOworCXVpbnQ2NF90IGVmZXI7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXN0cnVjdCBkZXNjX3B0ciBnZHRfZGVzY3I7CisjZWxzZQorCXN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgZ2R0X2Rlc2NyOworI2VuZGlmCisJc3RydWN0IGRlc2Nfc3RydWN0ICpnZHQ7CisJaW50IG1lID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICghaGFzX3N2bSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3ZtX2NwdV9pbml0OiBlcnIgRU9QTk9UU1VQUCBvbiAlZFxuIiwgbWUpOworCQlyZXR1cm47CisJfQorCXN2bV9kYXRhID0gcGVyX2NwdShzdm1fZGF0YSwgbWUpOworCisJaWYgKCFzdm1fZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgInN2bV9jcHVfaW5pdDogc3ZtX2RhdGEgaXMgTlVMTCBvbiAlZFxuIiwKKwkJICAgICAgIG1lKTsKKwkJcmV0dXJuOworCX0KKworCXN2bV9kYXRhLT5hc2lkX2dlbmVyYXRpb24gPSAxOworCXN2bV9kYXRhLT5tYXhfYXNpZCA9IGNwdWlkX2VieChTVk1fQ1BVSURfRlVOQykgLSAxOworCXN2bV9kYXRhLT5uZXh0X2FzaWQgPSBzdm1fZGF0YS0+bWF4X2FzaWQgKyAxOworCisJYXNtIHZvbGF0aWxlICggInNnZHQgJTAiIDogIj1tIihnZHRfZGVzY3IpICk7CisJZ2R0ID0gKHN0cnVjdCBkZXNjX3N0cnVjdCAqKWdkdF9kZXNjci5hZGRyZXNzOworCXN2bV9kYXRhLT50c3NfZGVzYyA9IChzdHJ1Y3Qga3ZtX2xkdHRzc19kZXNjICopKGdkdCArIEdEVF9FTlRSWV9UU1MpOworCisJcmRtc3JsKE1TUl9FRkVSLCBlZmVyKTsKKwl3cm1zcmwoTVNSX0VGRVIsIGVmZXIgfCBNU1JfRUZFUl9TVk1FX01BU0spOworCisJd3Jtc3JsKE1TUl9WTV9IU0FWRV9QQSwKKwkgICAgICAgcGFnZV90b19wZm4oc3ZtX2RhdGEtPnNhdmVfYXJlYSkgPDwgUEFHRV9TSElGVCk7Cit9CisKK3N0YXRpYyBpbnQgc3ZtX2NwdV9pbml0KGludCBjcHUpCit7CisJc3RydWN0IHN2bV9jcHVfZGF0YSAqc3ZtX2RhdGE7CisJaW50IHI7CisKKwlzdm1fZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdm1fY3B1X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN2bV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzdm1fZGF0YS0+Y3B1ID0gY3B1OworCXN2bV9kYXRhLT5zYXZlX2FyZWEgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCXIgPSAtRU5PTUVNOworCWlmICghc3ZtX2RhdGEtPnNhdmVfYXJlYSkKKwkJZ290byBlcnJfMTsKKworCXBlcl9jcHUoc3ZtX2RhdGEsIGNwdSkgPSBzdm1fZGF0YTsKKworCXJldHVybiAwOworCitlcnJfMToKKwlrZnJlZShzdm1fZGF0YSk7CisJcmV0dXJuIHI7CisKK30KKworc3RhdGljIGludCBzZXRfbXNyX2ludGVyY2VwdGlvbih1MzIgKm1zcnBtLCB1bnNpZ25lZCBtc3IsCisJCQkJaW50IHJlYWQsIGludCB3cml0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fTVNSX01BUFM7IGkrKykgeworCQlpZiAobXNyID49IG1zcnBtX3Jhbmdlc1tpXSAmJgorCQkgICAgbXNyIDwgbXNycG1fcmFuZ2VzW2ldICsgTVNSU19JTl9SQU5HRSkgeworCQkJdTMyIG1zcl9vZmZzZXQgPSAoaSAqIE1TUlNfSU5fUkFOR0UgKyBtc3IgLQorCQkJCQkgIG1zcnBtX3Jhbmdlc1tpXSkgKiAyOworCisJCQl1MzIgKmJhc2UgPSBtc3JwbSArIChtc3Jfb2Zmc2V0IC8gMzIpOworCQkJdTMyIG1zcl9zaGlmdCA9IG1zcl9vZmZzZXQgJSAzMjsKKwkJCXUzMiBtYXNrID0gKCh3cml0ZSkgPyAwIDogMikgfCAoKHJlYWQpID8gMCA6IDEpOworCQkJKmJhc2UgPSAoKmJhc2UgJiB+KDB4MyA8PCBtc3Jfc2hpZnQpKSB8CisJCQkJKG1hc2sgPDwgbXNyX3NoaWZ0KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXByaW50ayhLRVJOX0RFQlVHICIlczogbm90IGZvdW5kIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgbXNyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgc3ZtX2hhcmR3YXJlX3NldHVwKHZvaWQpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgcGFnZSAqaW9wbV9wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqbXNycG1fcGFnZXM7CisJdm9pZCAqbXNycG1fdmE7CisJaW50IHI7CisKKwlrdm1fZW11bGF0b3Jfd2FudF9ncm91cDdfaW52bHBnKCk7CisKKwlpb3BtX3BhZ2VzID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgSU9QTV9BTExPQ19PUkRFUik7CisKKwlpZiAoIWlvcG1fcGFnZXMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChwYWdlX2FkZHJlc3MoaW9wbV9wYWdlcyksIDB4ZmYsCisJCQkJCVBBR0VfU0laRSAqICgxIDw8IElPUE1fQUxMT0NfT1JERVIpKTsKKwlpb3BtX2Jhc2UgPSBwYWdlX3RvX3Bmbihpb3BtX3BhZ2VzKSA8PCBQQUdFX1NISUZUOworCisKKwltc3JwbV9wYWdlcyA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIE1TUlBNX0FMTE9DX09SREVSKTsKKworCXIgPSAtRU5PTUVNOworCWlmICghbXNycG1fcGFnZXMpCisJCWdvdG8gZXJyXzE7CisKKwltc3JwbV92YSA9IHBhZ2VfYWRkcmVzcyhtc3JwbV9wYWdlcyk7CisJbWVtc2V0KG1zcnBtX3ZhLCAweGZmLCBQQUdFX1NJWkUgKiAoMSA8PCBNU1JQTV9BTExPQ19PUkRFUikpOworCW1zcnBtX2Jhc2UgPSBwYWdlX3RvX3Bmbihtc3JwbV9wYWdlcykgPDwgUEFHRV9TSElGVDsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwlzZXRfbXNyX2ludGVyY2VwdGlvbihtc3JwbV92YSwgTVNSX0dTX0JBU0UsIDEsIDEpOworCXNldF9tc3JfaW50ZXJjZXB0aW9uKG1zcnBtX3ZhLCBNU1JfRlNfQkFTRSwgMSwgMSk7CisJc2V0X21zcl9pbnRlcmNlcHRpb24obXNycG1fdmEsIE1TUl9LRVJORUxfR1NfQkFTRSwgMSwgMSk7CisJc2V0X21zcl9pbnRlcmNlcHRpb24obXNycG1fdmEsIE1TUl9TVEFSLCAxLCAxKTsKKwlzZXRfbXNyX2ludGVyY2VwdGlvbihtc3JwbV92YSwgTVNSX0xTVEFSLCAxLCAxKTsKKwlzZXRfbXNyX2ludGVyY2VwdGlvbihtc3JwbV92YSwgTVNSX0NTVEFSLCAxLCAxKTsKKwlzZXRfbXNyX2ludGVyY2VwdGlvbihtc3JwbV92YSwgTVNSX1NZU0NBTExfTUFTSywgMSwgMSk7CisjZW5kaWYKKwlzZXRfbXNyX2ludGVyY2VwdGlvbihtc3JwbV92YSwgTVNSX0lBMzJfU1lTRU5URVJfQ1MsIDEsIDEpOworCXNldF9tc3JfaW50ZXJjZXB0aW9uKG1zcnBtX3ZhLCBNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIDEsIDEpOworCXNldF9tc3JfaW50ZXJjZXB0aW9uKG1zcnBtX3ZhLCBNU1JfSUEzMl9TWVNFTlRFUl9FSVAsIDEsIDEpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJciA9IHN2bV9jcHVfaW5pdChjcHUpOworCQlpZiAocikKKwkJCWdvdG8gZXJyXzI7CisJfQorCXJldHVybiAwOworCitlcnJfMjoKKwlfX2ZyZWVfcGFnZXMobXNycG1fcGFnZXMsIE1TUlBNX0FMTE9DX09SREVSKTsKKwltc3JwbV9iYXNlID0gMDsKK2Vycl8xOgorCV9fZnJlZV9wYWdlcyhpb3BtX3BhZ2VzLCBJT1BNX0FMTE9DX09SREVSKTsKKwlpb3BtX2Jhc2UgPSAwOworCXJldHVybiByOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgc3ZtX2hhcmR3YXJlX3Vuc2V0dXAodm9pZCkKK3sKKwlfX2ZyZWVfcGFnZXMocGZuX3RvX3BhZ2UobXNycG1fYmFzZSA+PiBQQUdFX1NISUZUKSwgTVNSUE1fQUxMT0NfT1JERVIpOworCV9fZnJlZV9wYWdlcyhwZm5fdG9fcGFnZShpb3BtX2Jhc2UgPj4gUEFHRV9TSElGVCksIElPUE1fQUxMT0NfT1JERVIpOworCWlvcG1fYmFzZSA9IG1zcnBtX2Jhc2UgPSAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3NlZyhzdHJ1Y3Qgdm1jYl9zZWcgKnNlZykKK3sKKwlzZWctPnNlbGVjdG9yID0gMDsKKwlzZWctPmF0dHJpYiA9IFNWTV9TRUxFQ1RPUl9QX01BU0sgfCBTVk1fU0VMRUNUT1JfU19NQVNLIHwKKwkJU1ZNX1NFTEVDVE9SX1dSSVRFX01BU0s7IC8qIFJlYWQvV3JpdGUgRGF0YSBTZWdtZW50ICovCisJc2VnLT5saW1pdCA9IDB4ZmZmZjsKKwlzZWctPmJhc2UgPSAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3N5c19zZWcoc3RydWN0IHZtY2Jfc2VnICpzZWcsIHVpbnQzMl90IHR5cGUpCit7CisJc2VnLT5zZWxlY3RvciA9IDA7CisJc2VnLT5hdHRyaWIgPSBTVk1fU0VMRUNUT1JfUF9NQVNLIHwgdHlwZTsKKwlzZWctPmxpbWl0ID0gMHhmZmZmOworCXNlZy0+YmFzZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgc3ZtX3ZjcHVfc2V0dXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3ZtY2Ioc3RydWN0IHZtY2IgKnZtY2IpCit7CisJc3RydWN0IHZtY2JfY29udHJvbF9hcmVhICpjb250cm9sID0gJnZtY2ItPmNvbnRyb2w7CisJc3RydWN0IHZtY2Jfc2F2ZV9hcmVhICpzYXZlID0gJnZtY2ItPnNhdmU7CisJdTY0IHRzYzsKKworCWNvbnRyb2wtPmludGVyY2VwdF9jcl9yZWFkID0gCUlOVEVSQ0VQVF9DUjBfTUFTSyB8CisJCQkJCUlOVEVSQ0VQVF9DUjNfTUFTSyB8CisJCQkJCUlOVEVSQ0VQVF9DUjRfTUFTSzsKKworCWNvbnRyb2wtPmludGVyY2VwdF9jcl93cml0ZSA9IAlJTlRFUkNFUFRfQ1IwX01BU0sgfAorCQkJCQlJTlRFUkNFUFRfQ1IzX01BU0sgfAorCQkJCQlJTlRFUkNFUFRfQ1I0X01BU0s7CisKKwljb250cm9sLT5pbnRlcmNlcHRfZHJfcmVhZCA9IAlJTlRFUkNFUFRfRFIwX01BU0sgfAorCQkJCQlJTlRFUkNFUFRfRFIxX01BU0sgfAorCQkJCQlJTlRFUkNFUFRfRFIyX01BU0sgfAorCQkJCQlJTlRFUkNFUFRfRFIzX01BU0s7CisKKwljb250cm9sLT5pbnRlcmNlcHRfZHJfd3JpdGUgPSAJSU5URVJDRVBUX0RSMF9NQVNLIHwKKwkJCQkJSU5URVJDRVBUX0RSMV9NQVNLIHwKKwkJCQkJSU5URVJDRVBUX0RSMl9NQVNLIHwKKwkJCQkJSU5URVJDRVBUX0RSM19NQVNLIHwKKwkJCQkJSU5URVJDRVBUX0RSNV9NQVNLIHwKKwkJCQkJSU5URVJDRVBUX0RSN19NQVNLOworCisJY29udHJvbC0+aW50ZXJjZXB0X2V4Y2VwdGlvbnMgPSAxIDw8IFBGX1ZFQ1RPUjsKKworCisJY29udHJvbC0+aW50ZXJjZXB0ID0gCSgxVUxMIDw8IElOVEVSQ0VQVF9JTlRSKSB8CisJCQkJKDFVTEwgPDwgSU5URVJDRVBUX05NSSkgfAorCQkvKgorCQkgKiBzZWxlY3RpdmUgY3IwIGludGVyY2VwdCBidWc/CisJCSAqICAgIAkwOiAgIDBmIDIyIGQ4ICAgICAgICAgICAgICAgIG1vdiAgICAlZWF4LCVjcjMKKwkJICoJMzogICAwZiAyMCBjMCAgICAgICAgICAgICAgICBtb3YgICAgJWNyMCwlZWF4CisJCSAqCTY6ICAgMGQgMDAgMDAgMDAgODAgICAgICAgICAgb3IgICAgICQweDgwMDAwMDAwLCVlYXgKKwkJICoJYjogICAwZiAyMiBjMCAgICAgICAgICAgICAgICBtb3YgICAgJWVheCwlY3IwCisJCSAqIHNldCBjcjMgLT5pbnRlcmNlcHRpb24KKwkJICogZ2V0IGNyMCAtPmludGVyY2VwdGlvbgorCQkgKiBzZXQgY3IwIC0+IG5vIGludGVyY2VwdGlvbgorCQkgKi8KKwkJLyogICAgICAgICAgICAgICgxVUxMIDw8IElOVEVSQ0VQVF9TRUxFQ1RJVkVfQ1IwKSB8ICovCisJCQkJKDFVTEwgPDwgSU5URVJDRVBUX0NQVUlEKSB8CisJCQkJKDFVTEwgPDwgSU5URVJDRVBUX0hMVCkgfAorCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9JTlZMUEcpIHwKKwkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfSU5WTFBHQSkgfAorCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9JT0lPX1BST1QpIHwKKwkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfTVNSX1BST1QpIHwKKwkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfVEFTS19TV0lUQ0gpIHwKKwkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfVk1SVU4pIHwKKwkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfVk1NQ0FMTCkgfAorCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9WTUxPQUQpIHwKKwkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfVk1TQVZFKSB8CisJCQkJKDFVTEwgPDwgSU5URVJDRVBUX1NUR0kpIHwKKwkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfQ0xHSSkgfAorCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9TS0lOSVQpOworCisJY29udHJvbC0+aW9wbV9iYXNlX3BhID0gaW9wbV9iYXNlOworCWNvbnRyb2wtPm1zcnBtX2Jhc2VfcGEgPSBtc3JwbV9iYXNlOworCXJkdHNjbGwodHNjKTsKKwljb250cm9sLT50c2Nfb2Zmc2V0ID0gLXRzYzsKKwljb250cm9sLT5pbnRfY3RsID0gVl9JTlRSX01BU0tJTkdfTUFTSzsKKworCWluaXRfc2VnKCZzYXZlLT5lcyk7CisJaW5pdF9zZWcoJnNhdmUtPnNzKTsKKwlpbml0X3NlZygmc2F2ZS0+ZHMpOworCWluaXRfc2VnKCZzYXZlLT5mcyk7CisJaW5pdF9zZWcoJnNhdmUtPmdzKTsKKworCXNhdmUtPmNzLnNlbGVjdG9yID0gMHhmMDAwOworCS8qIEV4ZWN1dGFibGUvUmVhZGFibGUgQ29kZSBTZWdtZW50ICovCisJc2F2ZS0+Y3MuYXR0cmliID0gU1ZNX1NFTEVDVE9SX1JFQURfTUFTSyB8IFNWTV9TRUxFQ1RPUl9QX01BU0sgfAorCQlTVk1fU0VMRUNUT1JfU19NQVNLIHwgU1ZNX1NFTEVDVE9SX0NPREVfTUFTSzsKKwlzYXZlLT5jcy5saW1pdCA9IDB4ZmZmZjsKKwlzYXZlLT5jcy5iYXNlID0gMHhmZmZmMDAwMDsKKworCXNhdmUtPmdkdHIubGltaXQgPSAweGZmZmY7CisJc2F2ZS0+aWR0ci5saW1pdCA9IDB4ZmZmZjsKKworCWluaXRfc3lzX3NlZygmc2F2ZS0+bGR0ciwgU0VHX1RZUEVfTERUKTsKKwlpbml0X3N5c19zZWcoJnNhdmUtPnRyLCBTRUdfVFlQRV9CVVNZX1RTUzE2KTsKKworCXNhdmUtPmVmZXIgPSBNU1JfRUZFUl9TVk1FX01BU0s7CisKKyAgICAgICAgc2F2ZS0+ZHI2ID0gMHhmZmZmMGZmMDsKKwlzYXZlLT5kcjcgPSAweDQwMDsKKwlzYXZlLT5yZmxhZ3MgPSAyOworCXNhdmUtPnJpcCA9IDB4MDAwMGZmZjA7CisKKwkvKgorCSAqIGNyMCB2YWwgb24gY3B1IGluaXQgc2hvdWxkIGJlIDB4NjAwMDAwMTAsIHdlIGVuYWJsZSBjcHUKKwkgKiBjYWNoZSBieSBkZWZhdWx0LiB0aGUgb3JkZXJseSB3YXkgaXMgdG8gZW5hYmxlIGNhY2hlIGluIGJpb3MuCisJICovCisJc2F2ZS0+Y3IwID0gMHgwMDAwMDAxMCB8IENSMF9QR19NQVNLOworCXNhdmUtPmNyNCA9IENSNF9QQUVfTUFTSzsKKwkvKiByZHggPSA/PyAqLworfQorCitzdGF0aWMgaW50IHN2bV9jcmVhdGVfdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHI7CisKKwlyID0gLUVOT01FTTsKKwl2Y3B1LT5zdm0gPSBremFsbG9jKHNpemVvZiAqdmNwdS0+c3ZtLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZjcHUtPnN2bSkKKwkJZ290byBvdXQxOworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghcGFnZSkKKwkJZ290byBvdXQyOworCisJdmNwdS0+c3ZtLT52bWNiID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCW1lbXNldCh2Y3B1LT5zdm0tPnZtY2IsIDAsIFBBR0VfU0laRSk7CisJdmNwdS0+c3ZtLT52bWNiX3BhID0gcGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVDsKKwl2Y3B1LT5zdm0tPmNyMCA9IDB4MDAwMDAwMTA7CisJdmNwdS0+c3ZtLT5hc2lkX2dlbmVyYXRpb24gPSAwOworCW1lbXNldCh2Y3B1LT5zdm0tPmRiX3JlZ3MsIDAsIHNpemVvZih2Y3B1LT5zdm0tPmRiX3JlZ3MpKTsKKwlpbml0X3ZtY2IodmNwdS0+c3ZtLT52bWNiKTsKKworCXJldHVybiAwOworCitvdXQyOgorCWtmcmVlKHZjcHUtPnN2bSk7CitvdXQxOgorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBzdm1fZnJlZV92Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAoIXZjcHUtPnN2bSkKKwkJcmV0dXJuOworCWlmICh2Y3B1LT5zdm0tPnZtY2IpCisJCV9fZnJlZV9wYWdlKHBmbl90b19wYWdlKHZjcHUtPnN2bS0+dm1jYl9wYSA+PiBQQUdFX1NISUZUKSk7CisJa2ZyZWUodmNwdS0+c3ZtKTsKK30KKworc3RhdGljIHN0cnVjdCBrdm1fdmNwdSAqc3ZtX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJZ2V0X2NwdSgpOworCXJldHVybiB2Y3B1OworfQorCitzdGF0aWMgdm9pZCBzdm1fdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXB1dF9jcHUoKTsKK30KKworc3RhdGljIHZvaWQgc3ZtX2NhY2hlX3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JBWF0gPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucmF4OworCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JTUF0gPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucnNwOworCXZjcHUtPnJpcCA9IHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5yaXA7Cit9CisKK3N0YXRpYyB2b2lkIHN2bV9kZWNhY2hlX3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5yYXggPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SQVhdOworCXZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5yc3AgPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SU1BdOworCXZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5yaXAgPSB2Y3B1LT5yaXA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN2bV9nZXRfcmZsYWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnJmbGFnczsKK30KKworc3RhdGljIHZvaWQgc3ZtX3NldF9yZmxhZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIHJmbGFncykKK3sKKwl2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucmZsYWdzID0gcmZsYWdzOworfQorCitzdGF0aWMgc3RydWN0IHZtY2Jfc2VnICpzdm1fc2VnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNlZykKK3sKKwlzdHJ1Y3Qgdm1jYl9zYXZlX2FyZWEgKnNhdmUgPSAmdmNwdS0+c3ZtLT52bWNiLT5zYXZlOworCisJc3dpdGNoIChzZWcpIHsKKwljYXNlIFZDUFVfU1JFR19DUzogcmV0dXJuICZzYXZlLT5jczsKKwljYXNlIFZDUFVfU1JFR19EUzogcmV0dXJuICZzYXZlLT5kczsKKwljYXNlIFZDUFVfU1JFR19FUzogcmV0dXJuICZzYXZlLT5lczsKKwljYXNlIFZDUFVfU1JFR19GUzogcmV0dXJuICZzYXZlLT5mczsKKwljYXNlIFZDUFVfU1JFR19HUzogcmV0dXJuICZzYXZlLT5nczsKKwljYXNlIFZDUFVfU1JFR19TUzogcmV0dXJuICZzYXZlLT5zczsKKwljYXNlIFZDUFVfU1JFR19UUjogcmV0dXJuICZzYXZlLT50cjsKKwljYXNlIFZDUFVfU1JFR19MRFRSOiByZXR1cm4gJnNhdmUtPmxkdHI7CisJfQorCUJVRygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTY0IHN2bV9nZXRfc2VnbWVudF9iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNlZykKK3sKKwlzdHJ1Y3Qgdm1jYl9zZWcgKnMgPSBzdm1fc2VnKHZjcHUsIHNlZyk7CisKKwlyZXR1cm4gcy0+YmFzZTsKK30KKworc3RhdGljIHZvaWQgc3ZtX2dldF9zZWdtZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICBzdHJ1Y3Qga3ZtX3NlZ21lbnQgKnZhciwgaW50IHNlZykKK3sKKwlzdHJ1Y3Qgdm1jYl9zZWcgKnMgPSBzdm1fc2VnKHZjcHUsIHNlZyk7CisKKwl2YXItPmJhc2UgPSBzLT5iYXNlOworCXZhci0+bGltaXQgPSBzLT5saW1pdDsKKwl2YXItPnNlbGVjdG9yID0gcy0+c2VsZWN0b3I7CisJdmFyLT50eXBlID0gcy0+YXR0cmliICYgU1ZNX1NFTEVDVE9SX1RZUEVfTUFTSzsKKwl2YXItPnMgPSAocy0+YXR0cmliID4+IFNWTV9TRUxFQ1RPUl9TX1NISUZUKSAmIDE7CisJdmFyLT5kcGwgPSAocy0+YXR0cmliID4+IFNWTV9TRUxFQ1RPUl9EUExfU0hJRlQpICYgMzsKKwl2YXItPnByZXNlbnQgPSAocy0+YXR0cmliID4+IFNWTV9TRUxFQ1RPUl9QX1NISUZUKSAmIDE7CisJdmFyLT5hdmwgPSAocy0+YXR0cmliID4+IFNWTV9TRUxFQ1RPUl9BVkxfU0hJRlQpICYgMTsKKwl2YXItPmwgPSAocy0+YXR0cmliID4+IFNWTV9TRUxFQ1RPUl9MX1NISUZUKSAmIDE7CisJdmFyLT5kYiA9IChzLT5hdHRyaWIgPj4gU1ZNX1NFTEVDVE9SX0RCX1NISUZUKSAmIDE7CisJdmFyLT5nID0gKHMtPmF0dHJpYiA+PiBTVk1fU0VMRUNUT1JfR19TSElGVCkgJiAxOworCXZhci0+dW51c2FibGUgPSAhdmFyLT5wcmVzZW50OworfQorCitzdGF0aWMgdm9pZCBzdm1fZ2V0X2NzX2RiX2xfYml0cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCAqZGIsIGludCAqbCkKK3sKKwlzdHJ1Y3Qgdm1jYl9zZWcgKnMgPSBzdm1fc2VnKHZjcHUsIFZDUFVfU1JFR19DUyk7CisKKwkqZGIgPSAocy0+YXR0cmliID4+IFNWTV9TRUxFQ1RPUl9EQl9TSElGVCkgJiAxOworCSpsID0gKHMtPmF0dHJpYiA+PiBTVk1fU0VMRUNUT1JfTF9TSElGVCkgJiAxOworfQorCitzdGF0aWMgdm9pZCBzdm1fZ2V0X2lkdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlICpkdCkKK3sKKwlkdC0+bGltaXQgPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUubGR0ci5saW1pdDsKKwlkdC0+YmFzZSA9IHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5sZHRyLmJhc2U7Cit9CisKK3N0YXRpYyB2b2lkIHN2bV9zZXRfaWR0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGRlc2NyaXB0b3JfdGFibGUgKmR0KQoreworCXZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5sZHRyLmxpbWl0ID0gZHQtPmxpbWl0OworCXZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5sZHRyLmJhc2UgPSBkdC0+YmFzZSA7Cit9CisKK3N0YXRpYyB2b2lkIHN2bV9nZXRfZ2R0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGRlc2NyaXB0b3JfdGFibGUgKmR0KQoreworCWR0LT5saW1pdCA9IHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5nZHRyLmxpbWl0OworCWR0LT5iYXNlID0gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmdkdHIuYmFzZTsKK30KKworc3RhdGljIHZvaWQgc3ZtX3NldF9nZHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSAqZHQpCit7CisJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmdkdHIubGltaXQgPSBkdC0+bGltaXQ7CisJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmdkdHIuYmFzZSA9IGR0LT5iYXNlIDsKK30KKworc3RhdGljIHZvaWQgc3ZtX3NldF9jcjAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJaWYgKHZjcHUtPnNoYWRvd19lZmVyICYgS1ZNX0VGRVJfTE1FKSB7CisJCWlmICghaXNfcGFnaW5nKHZjcHUpICYmIChjcjAgJiBDUjBfUEdfTUFTSykpIHsKKwkJCXZjcHUtPnNoYWRvd19lZmVyIHw9IEtWTV9FRkVSX0xNQTsKKwkJCXZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5lZmVyIHw9IEtWTV9FRkVSX0xNQSB8IEtWTV9FRkVSX0xNRTsKKwkJfQorCisJCWlmIChpc19wYWdpbmcodmNwdSkgJiYgIShjcjAgJiBDUjBfUEdfTUFTSykgKSB7CisJCQl2Y3B1LT5zaGFkb3dfZWZlciAmPSB+S1ZNX0VGRVJfTE1BOworCQkJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmVmZXIgJj0gfihLVk1fRUZFUl9MTUEgfCBLVk1fRUZFUl9MTUUpOworCQl9CisJfQorI2VuZGlmCisJdmNwdS0+c3ZtLT5jcjAgPSBjcjA7CisJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmNyMCA9IGNyMCB8IENSMF9QR19NQVNLOworCXZjcHUtPmNyMCA9IGNyMDsKK30KKworc3RhdGljIHZvaWQgc3ZtX3NldF9jcjQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyNCkKK3sKKyAgICAgICB2Y3B1LT5jcjQgPSBjcjQ7CisgICAgICAgdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmNyNCA9IGNyNCB8IENSNF9QQUVfTUFTSzsKK30KKworc3RhdGljIHZvaWQgc3ZtX3NldF9zZWdtZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICBzdHJ1Y3Qga3ZtX3NlZ21lbnQgKnZhciwgaW50IHNlZykKK3sKKwlzdHJ1Y3Qgdm1jYl9zZWcgKnMgPSBzdm1fc2VnKHZjcHUsIHNlZyk7CisKKwlzLT5iYXNlID0gdmFyLT5iYXNlOworCXMtPmxpbWl0ID0gdmFyLT5saW1pdDsKKwlzLT5zZWxlY3RvciA9IHZhci0+c2VsZWN0b3I7CisJaWYgKHZhci0+dW51c2FibGUpCisJCXMtPmF0dHJpYiA9IDA7CisJZWxzZSB7CisJCXMtPmF0dHJpYiA9ICh2YXItPnR5cGUgJiBTVk1fU0VMRUNUT1JfVFlQRV9NQVNLKTsKKwkJcy0+YXR0cmliIHw9ICh2YXItPnMgJiAxKSA8PCBTVk1fU0VMRUNUT1JfU19TSElGVDsKKwkJcy0+YXR0cmliIHw9ICh2YXItPmRwbCAmIDMpIDw8IFNWTV9TRUxFQ1RPUl9EUExfU0hJRlQ7CisJCXMtPmF0dHJpYiB8PSAodmFyLT5wcmVzZW50ICYgMSkgPDwgU1ZNX1NFTEVDVE9SX1BfU0hJRlQ7CisJCXMtPmF0dHJpYiB8PSAodmFyLT5hdmwgJiAxKSA8PCBTVk1fU0VMRUNUT1JfQVZMX1NISUZUOworCQlzLT5hdHRyaWIgfD0gKHZhci0+bCAmIDEpIDw8IFNWTV9TRUxFQ1RPUl9MX1NISUZUOworCQlzLT5hdHRyaWIgfD0gKHZhci0+ZGIgJiAxKSA8PCBTVk1fU0VMRUNUT1JfREJfU0hJRlQ7CisJCXMtPmF0dHJpYiB8PSAodmFyLT5nICYgMSkgPDwgU1ZNX1NFTEVDVE9SX0dfU0hJRlQ7CisJfQorCWlmIChzZWcgPT0gVkNQVV9TUkVHX0NTKQorCQl2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuY3BsCisJCQk9ICh2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuY3MuYXR0cmliCisJCQkgICA+PiBTVk1fU0VMRUNUT1JfRFBMX1NISUZUKSAmIDM7CisKK30KKworLyogRklYTUU6CisKKwl2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuaW50X2N0bCAmPSB+Vl9UUFJfTUFTSzsKKwl2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuaW50X2N0bCB8PSAoc3JlZ3MtPmNyOCAmIFZfVFBSX01BU0spOworCisqLworCitzdGF0aWMgaW50IHN2bV9ndWVzdF9kZWJ1ZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QgKmRiZykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfaG9zdF9tc3JzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwOyBpIDwgTlJfSE9TVF9TQVZFX01TUlM7IGkrKykKKwkJd3Jtc3JsKGhvc3Rfc2F2ZV9tc3JzW2ldLCB2Y3B1LT5zdm0tPmhvc3RfbXNyc1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfaG9zdF9tc3JzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgaTsKKworCWZvciAoIGkgPSAwOyBpIDwgTlJfSE9TVF9TQVZFX01TUlM7IGkrKykKKwkJcmRtc3JsKGhvc3Rfc2F2ZV9tc3JzW2ldLCB2Y3B1LT5zdm0tPmhvc3RfbXNyc1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIG5ld19hc2lkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IHN2bV9jcHVfZGF0YSAqc3ZtX2RhdGEpCit7CisJaWYgKHN2bV9kYXRhLT5uZXh0X2FzaWQgPiBzdm1fZGF0YS0+bWF4X2FzaWQpIHsKKwkJKytzdm1fZGF0YS0+YXNpZF9nZW5lcmF0aW9uOworCQlzdm1fZGF0YS0+bmV4dF9hc2lkID0gMTsKKwkJdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLnRsYl9jdGwgPSBUTEJfQ09OVFJPTF9GTFVTSF9BTExfQVNJRDsKKwl9CisKKwl2Y3B1LT5jcHUgPSBzdm1fZGF0YS0+Y3B1OworCXZjcHUtPnN2bS0+YXNpZF9nZW5lcmF0aW9uID0gc3ZtX2RhdGEtPmFzaWRfZ2VuZXJhdGlvbjsKKwl2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuYXNpZCA9IHN2bV9kYXRhLT5uZXh0X2FzaWQrKzsKK30KKworc3RhdGljIHZvaWQgc3ZtX2ludmxwZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGFkZHJlc3MpCit7CisJaW52bHBnYShhZGRyZXNzLCB2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuYXNpZCk7IC8vIGlzIG5lZWRlZD8KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3ZtX2dldF9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkcikKK3sKKwlyZXR1cm4gdmNwdS0+c3ZtLT5kYl9yZWdzW2RyXTsKK30KKworc3RhdGljIHZvaWQgc3ZtX3NldF9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBkciwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKKwkJICAgICAgIGludCAqZXhjZXB0aW9uKQoreworCSpleGNlcHRpb24gPSAwOworCisJaWYgKHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5kcjcgJiBEUjdfR0RfTUFTSykgeworCQl2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuZHI3ICY9IH5EUjdfR0RfTUFTSzsKKwkJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmRyNiB8PSBEUjZfQkRfTUFTSzsKKwkJKmV4Y2VwdGlvbiA9IERCX1ZFQ1RPUjsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoZHIpIHsKKwljYXNlIDAgLi4uIDM6CisJCXZjcHUtPnN2bS0+ZGJfcmVnc1tkcl0gPSB2YWx1ZTsKKwkJcmV0dXJuOworCWNhc2UgNCAuLi4gNToKKwkJaWYgKHZjcHUtPmNyNCAmIENSNF9ERV9NQVNLKSB7CisJCQkqZXhjZXB0aW9uID0gVURfVkVDVE9SOworCQkJcmV0dXJuOworCQl9CisJY2FzZSA3OiB7CisJCWlmICh2YWx1ZSAmIH4oKDFVTEwgPDwgMzIpIC0gMSkpIHsKKwkJCSpleGNlcHRpb24gPSBHUF9WRUNUT1I7CisJCQlyZXR1cm47CisJCX0KKwkJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmRyNyA9IHZhbHVlOworCQlyZXR1cm47CisJfQorCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5leHBlY3RlZCBkciAldVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgZHIpOworCQkqZXhjZXB0aW9uID0gVURfVkVDVE9SOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW50IHBmX2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXUzMiBleGl0X2ludF9pbmZvID0gdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm87CisJdTY0IGZhdWx0X2FkZHJlc3M7CisJdTMyIGVycm9yX2NvZGU7CisJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyOworCisJaWYgKGlzX2V4dGVybmFsX2ludGVycnVwdChleGl0X2ludF9pbmZvKSkKKwkJcHVzaF9pcnEodmNwdSwgZXhpdF9pbnRfaW5mbyAmIFNWTV9FVlRJTkpfVkVDX01BU0spOworCisJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCisJZmF1bHRfYWRkcmVzcyAgPSB2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbmZvXzI7CisJZXJyb3JfY29kZSA9IHZjcHUtPnN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMTsKKwlpZiAoIXZjcHUtPm1tdS5wYWdlX2ZhdWx0KHZjcHUsIGZhdWx0X2FkZHJlc3MsIGVycm9yX2NvZGUpKSB7CisJCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCQlyZXR1cm4gMTsKKwl9CisJZXIgPSBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIGt2bV9ydW4sIGZhdWx0X2FkZHJlc3MsIGVycm9yX2NvZGUpOworCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCisJc3dpdGNoIChlcikgeworCWNhc2UgRU1VTEFURV9ET05FOgorCQlyZXR1cm4gMTsKKwljYXNlIEVNVUxBVEVfRE9fTU1JTzoKKwkJKytrdm1fc3RhdC5tbWlvX2V4aXRzOworCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX01NSU87CisJCXJldHVybiAwOworCWNhc2UgRU1VTEFURV9GQUlMOgorCQl2Y3B1X3ByaW50Zih2Y3B1LCAiJXM6IGVtdWxhdGUgZmFpbFxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9VTktOT1dOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvX2dldF9vdmVycmlkZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgIHN0cnVjdCB2bWNiX3NlZyAqKnNlZywKKwkJCSAgaW50ICphZGRyX292ZXJyaWRlKQoreworCXU4IGluc3RbTUFYX0lOU1RfU0laRV07CisJdW5zaWduZWQgaW5zX2xlbmd0aDsKKwlndmFfdCByaXA7CisJaW50IGk7CisKKwlyaXAgPSAgdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnJpcDsKKwlpbnNfbGVuZ3RoID0gdmNwdS0+c3ZtLT5uZXh0X3JpcCAtIHJpcDsKKwlyaXAgKz0gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmNzLmJhc2U7CisKKwlpZiAoaW5zX2xlbmd0aCA+IE1BWF9JTlNUX1NJWkUpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IGluc3QgbGVuZ3RoIGVyciwgY3MgYmFzZSAweCVsbHggcmlwIDB4JWxseCAiCisJCSAgICAgICAibmV4dCByaXAgMHglbGx4IGluc19sZW5ndGggJXVcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sCisJCSAgICAgICB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuY3MuYmFzZSwKKwkJICAgICAgIHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5yaXAsCisJCSAgICAgICB2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbmZvXzIsCisJCSAgICAgICBpbnNfbGVuZ3RoKTsKKworCWlmIChrdm1fcmVhZF9ndWVzdCh2Y3B1LCByaXAsIGluc19sZW5ndGgsIGluc3QpICE9IGluc19sZW5ndGgpCisJCS8qICNQRiAqLworCQlyZXR1cm4gMDsKKworCSphZGRyX292ZXJyaWRlID0gMDsKKwkqc2VnID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zX2xlbmd0aDsgaSsrKQorCQlzd2l0Y2ggKGluc3RbaV0pIHsKKwkJY2FzZSAweGYwOgorCQljYXNlIDB4ZjI6CisJCWNhc2UgMHhmMzoKKwkJY2FzZSAweDY2OgorCQkJY29udGludWU7CisJCWNhc2UgMHg2NzoKKwkJCSphZGRyX292ZXJyaWRlID0gMTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDB4MmU6CisJCQkqc2VnID0gJnZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5jczsKKwkJCWNvbnRpbnVlOworCQljYXNlIDB4MzY6CisJCQkqc2VnID0gJnZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5zczsKKwkJCWNvbnRpbnVlOworCQljYXNlIDB4M2U6CisJCQkqc2VnID0gJnZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5kczsKKwkJCWNvbnRpbnVlOworCQljYXNlIDB4MjY6CisJCQkqc2VnID0gJnZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5lczsKKwkJCWNvbnRpbnVlOworCQljYXNlIDB4NjQ6CisJCQkqc2VnID0gJnZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5mczsKKwkJCWNvbnRpbnVlOworCQljYXNlIDB4NjU6CisJCQkqc2VnID0gJnZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5nczsKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDE7CisJCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuZXhwZWN0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlvX2FkcmVzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBpbnMsIHU2NCAqYWRkcmVzcykKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHJfbWFzazsKKwl1bnNpZ25lZCBsb25nICpyZWc7CisJc3RydWN0IHZtY2Jfc2VnICpzZWc7CisJaW50IGFkZHJfb3ZlcnJpZGU7CisJc3RydWN0IHZtY2Jfc2F2ZV9hcmVhICpzYXZlX2FyZWEgPSAmdmNwdS0+c3ZtLT52bWNiLT5zYXZlOworCXUxNiBjc19hdHRyaWIgPSBzYXZlX2FyZWEtPmNzLmF0dHJpYjsKKwl1bnNpZ25lZCBhZGRyX3NpemUgPSBnZXRfYWRkcl9zaXplKHZjcHUpOworCisJaWYgKCFpb19nZXRfb3ZlcnJpZGUodmNwdSwgJnNlZywgJmFkZHJfb3ZlcnJpZGUpKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGRyX292ZXJyaWRlKQorCQlhZGRyX3NpemUgPSAoYWRkcl9zaXplID09IDIpID8gNDogKGFkZHJfc2l6ZSA+PiAxKTsKKworCWlmIChpbnMpIHsKKwkJcmVnID0gJnZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JESV07CisJCXNlZyA9ICZ2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuZXM7CisJfSBlbHNlIHsKKwkJcmVnID0gJnZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JTSV07CisJCXNlZyA9IChzZWcpID8gc2VnIDogJnZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5kczsKKwl9CisKKwlhZGRyX21hc2sgPSB+MFVMTCA+PiAoNjQgLSAoYWRkcl9zaXplICogOCkpOworCisJaWYgKChjc19hdHRyaWIgJiBTVk1fU0VMRUNUT1JfTF9NQVNLKSAmJgorCSAgICAhKHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5yZmxhZ3MgJiBYODZfRUZMQUdTX1ZNKSkgeworCQkqYWRkcmVzcyA9ICgqcmVnICYgYWRkcl9tYXNrKTsKKwkJcmV0dXJuIGFkZHJfbWFzazsKKwl9CisKKwlpZiAoIShzZWctPmF0dHJpYiAmIFNWTV9TRUxFQ1RPUl9QX1NISUZUKSkgeworCQlzdm1faW5qZWN0X2dwKHZjcHUsIDApOworCQlyZXR1cm4gMDsKKwl9CisKKwkqYWRkcmVzcyA9ICgqcmVnICYgYWRkcl9tYXNrKSArIHNlZy0+YmFzZTsKKwlyZXR1cm4gYWRkcl9tYXNrOworfQorCitzdGF0aWMgaW50IGlvX2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXUzMiBpb19pbmZvID0gdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18xOyAvL2FkZHJlc3Mgc2l6ZSBidWc/CisJaW50IF9pbiA9IGlvX2luZm8gJiBTVk1fSU9JT19UWVBFX01BU0s7CisKKwkrK2t2bV9zdGF0LmlvX2V4aXRzOworCisJdmNwdS0+c3ZtLT5uZXh0X3JpcCA9IHZjcHUtPnN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMjsKKworCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU87CisJa3ZtX3J1bi0+aW8ucG9ydCA9IGlvX2luZm8gPj4gMTY7CisJa3ZtX3J1bi0+aW8uZGlyZWN0aW9uID0gKF9pbikgPyBLVk1fRVhJVF9JT19JTiA6IEtWTV9FWElUX0lPX09VVDsKKwlrdm1fcnVuLT5pby5zaXplID0gKChpb19pbmZvICYgU1ZNX0lPSU9fU0laRV9NQVNLKSA+PiBTVk1fSU9JT19TSVpFX1NISUZUKTsKKwlrdm1fcnVuLT5pby5zdHJpbmcgPSAoaW9faW5mbyAmIFNWTV9JT0lPX1NUUl9NQVNLKSAhPSAwOworCWt2bV9ydW4tPmlvLnJlcCA9IChpb19pbmZvICYgU1ZNX0lPSU9fUkVQX01BU0spICE9IDA7CisKKwlpZiAoa3ZtX3J1bi0+aW8uc3RyaW5nKSB7CisJCXVuc2lnbmVkIGFkZHJfbWFzazsKKworCQlhZGRyX21hc2sgPSBpb19hZHJlc3ModmNwdSwgX2luLCAma3ZtX3J1bi0+aW8uYWRkcmVzcyk7CisJCWlmICghYWRkcl9tYXNrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGdldCBpbyBhZGRyZXNzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKGt2bV9ydW4tPmlvLnJlcCkgeworCQkJa3ZtX3J1bi0+aW8uY291bnQgPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SQ1hdICYgYWRkcl9tYXNrOworCQkJa3ZtX3J1bi0+aW8uc3RyaW5nX2Rvd24gPSAodmNwdS0+c3ZtLT52bWNiLT5zYXZlLnJmbGFncworCQkJCQkJICAgJiBYODZfRUZMQUdTX0RGKSAhPSAwOworCQl9CisJfSBlbHNlIHsKKwkJa3ZtX3J1bi0+aW8udmFsdWUgPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucmF4OworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG5vcF9vbl9pbnRlcmNlcHRpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYWx0X2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXZjcHUtPnN2bS0+bmV4dF9yaXAgPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucmlwICsgMTsKKwlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCWlmICh2Y3B1LT5pcnFfc3VtbWFyeSAmJiAodmNwdS0+c3ZtLT52bWNiLT5zYXZlLnJmbGFncyAmIFg4Nl9FRkxBR1NfSUYpKQorCQlyZXR1cm4gMTsKKworCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSExUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludmFsaWRfb3BfaW50ZXJjZXB0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJaW5qZWN0X3VkKHZjcHUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRhc2tfc3dpdGNoX2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlczogdGFzayBzd2ljaGUgaXMgdW5zdXBwb3J0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9VTktOT1dOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwdWlkX2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXZjcHUtPnN2bS0+bmV4dF9yaXAgPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucmlwICsgMjsKKwlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0NQVUlEOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJaWYgKGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgMCwgMCwgMCkgIT0gRU1VTEFURV9ET05FKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc3ZtX2dldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBlY3gsIHU2NCAqZGF0YSkKK3sKKwlzd2l0Y2ggKGVjeCkgeworCWNhc2UgTVNSX0lBMzJfTUMwX0NUTDoKKwljYXNlIE1TUl9JQTMyX01DR19TVEFUVVM6CisJY2FzZSBNU1JfSUEzMl9NQ0dfQ0FQOgorCWNhc2UgTVNSX0lBMzJfTUMwX01JU0M6CisJY2FzZSBNU1JfSUEzMl9NQzBfTUlTQys0OgorCWNhc2UgTVNSX0lBMzJfTUMwX01JU0MrODoKKwljYXNlIE1TUl9JQTMyX01DMF9NSVNDKzEyOgorCWNhc2UgTVNSX0lBMzJfTUMwX01JU0MrMTY6CisJY2FzZSBNU1JfSUEzMl9VQ09ERV9SRVY6CisJCS8qIE1UUlIgcmVnaXN0ZXJzICovCisJY2FzZSAweGZlOgorCWNhc2UgMHgyMDAgLi4uIDB4MmZmOgorCQkqZGF0YSA9IDA7CisJCWJyZWFrOworCWNhc2UgTVNSX0lBMzJfVElNRV9TVEFNUF9DT1VOVEVSOiB7CisJCXU2NCB0c2M7CisKKwkJcmR0c2NsbCh0c2MpOworCQkqZGF0YSA9IHZjcHUtPnN2bS0+dm1jYi0+Y29udHJvbC50c2Nfb2Zmc2V0ICsgdHNjOworCQlicmVhazsKKwl9CisJY2FzZSBNU1JfRUZFUjoKKwkJKmRhdGEgPSB2Y3B1LT5zaGFkb3dfZWZlcjsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9BUElDQkFTRToKKwkJKmRhdGEgPSB2Y3B1LT5hcGljX2Jhc2U7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19YODZfNjQKKwljYXNlIE1TUl9TVEFSOgorCQkqZGF0YSA9IHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5zdGFyOworCQlicmVhazsKKwljYXNlIE1TUl9MU1RBUjoKKwkJKmRhdGEgPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUubHN0YXI7CisJCWJyZWFrOworCWNhc2UgTVNSX0NTVEFSOgorCQkqZGF0YSA9IHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5jc3RhcjsKKwkJYnJlYWs7CisJY2FzZSBNU1JfS0VSTkVMX0dTX0JBU0U6CisJCSpkYXRhID0gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmtlcm5lbF9nc19iYXNlOworCQlicmVhazsKKwljYXNlIE1TUl9TWVNDQUxMX01BU0s6CisJCSpkYXRhID0gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnNmbWFzazsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0NTOgorCQkqZGF0YSA9IHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5zeXNlbnRlcl9jczsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9FSVA6CisJCSpkYXRhID0gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnN5c2VudGVyX2VpcDsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9FU1A6CisJCSpkYXRhID0gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnN5c2VudGVyX2VzcDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJrdm06IHVuaGFuZGxlZCByZG1zcjogMHgleFxuIiwgZWN4KTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJkbXNyX2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXUzMiBlY3ggPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SQ1hdOworCXU2NCBkYXRhOworCisJaWYgKHN2bV9nZXRfbXNyKHZjcHUsIGVjeCwgJmRhdGEpKQorCQlzdm1faW5qZWN0X2dwKHZjcHUsIDApOworCWVsc2UgeworCQl2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucmF4ID0gZGF0YSAmIDB4ZmZmZmZmZmY7CisJCXZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JEWF0gPSBkYXRhID4+IDMyOworCQl2Y3B1LT5zdm0tPm5leHRfcmlwID0gdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnJpcCArIDI7CisJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHN2bV9zZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgZWN4LCB1NjQgZGF0YSkKK3sKKwlzd2l0Y2ggKGVjeCkgeworI2lmZGVmIENPTkZJR19YODZfNjQKKwljYXNlIE1TUl9FRkVSOgorCQlzZXRfZWZlcih2Y3B1LCBkYXRhKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIE1TUl9JQTMyX01DMF9TVEFUVVM6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNU1JfSUEzMl9NQzBfU1RBVFVTIDB4JWxseCwgbm9wXG4iCisJCQkgICAgLCBfX0ZVTkNUSU9OX18sIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1RJTUVfU1RBTVBfQ09VTlRFUjogeworCQl1NjQgdHNjOworCisJCXJkdHNjbGwodHNjKTsKKwkJdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLnRzY19vZmZzZXQgPSBkYXRhIC0gdHNjOworCQlicmVhazsKKwl9CisJY2FzZSBNU1JfSUEzMl9VQ09ERV9SRVY6CisJY2FzZSBNU1JfSUEzMl9VQ09ERV9XUklURToKKwljYXNlIDB4MjAwIC4uLiAweDJmZjogLyogTVRSUnMgKi8KKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9BUElDQkFTRToKKwkJdmNwdS0+YXBpY19iYXNlID0gZGF0YTsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX1g4Nl82NF8KKwljYXNlIE1TUl9TVEFSOgorCQl2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuc3RhciA9IGRhdGE7CisJCWJyZWFrOworCWNhc2UgTVNSX0xTVEFSOgorCQl2Y3B1LT5zdm0tPnZtY2ItPnNhdmUubHN0YXIgPSBkYXRhOworCQlicmVhazsKKwljYXNlIE1TUl9DU1RBUjoKKwkJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmNzdGFyID0gZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfS0VSTkVMX0dTX0JBU0U6CisJCXZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5rZXJuZWxfZ3NfYmFzZSA9IGRhdGE7CisJCWJyZWFrOworCWNhc2UgTVNSX1NZU0NBTExfTUFTSzoKKwkJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnNmbWFzayA9IGRhdGE7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9DUzoKKwkJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnN5c2VudGVyX2NzID0gZGF0YTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9FSVA6CisJCXZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5zeXNlbnRlcl9laXAgPSBkYXRhOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VTUDoKKwkJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnN5c2VudGVyX2VzcCA9IGRhdGE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAia3ZtOiB1bmhhbmRsZWQgd3Jtc3I6ICV4XG4iLCBlY3gpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3Jtc3JfaW50ZXJjZXB0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJdTMyIGVjeCA9IHZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JDWF07CisJdTY0IGRhdGEgPSAodmNwdS0+c3ZtLT52bWNiLT5zYXZlLnJheCAmIC0xdSkKKwkJfCAoKHU2NCkodmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkRYXSAmIC0xdSkgPDwgMzIpOworCXZjcHUtPnN2bS0+bmV4dF9yaXAgPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUucmlwICsgMjsKKwlpZiAoc3ZtX3NldF9tc3IodmNwdSwgZWN4LCBkYXRhKSkKKwkJc3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKKwllbHNlCisJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbXNyX2ludGVyY2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCWlmICh2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbmZvXzEpCisJCXJldHVybiB3cm1zcl9pbnRlcmNlcHRpb24odmNwdSwga3ZtX3J1bik7CisJZWxzZQorCQlyZXR1cm4gcmRtc3JfaW50ZXJjZXB0aW9uKHZjcHUsIGt2bV9ydW4pOworfQorCitzdGF0aWMgaW50ICgqc3ZtX2V4aXRfaGFuZGxlcnNbXSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKSA9IHsKKwlbU1ZNX0VYSVRfUkVBRF9DUjBdICAgICAgICAgICAJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1JFQURfQ1IzXSAgICAgICAgICAgCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9SRUFEX0NSNF0gICAgICAgICAgIAkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwkvKiBmb3Igbm93OiAqLworCVtTVk1fRVhJVF9XUklURV9DUjBdICAgICAgICAgIAkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfV1JJVEVfQ1IzXSAgICAgICAgICAJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1dSSVRFX0NSNF0gICAgICAgICAgCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9SRUFEX0RSMF0gCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfUkVBRF9EUjFdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfUkVBRF9EUjJdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfUkVBRF9EUjNdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfV1JJVEVfRFIwXQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1dSSVRFX0RSMV0JCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9XUklURV9EUjJdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfV1JJVEVfRFIzXQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1dSSVRFX0RSNV0JCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9XUklURV9EUjddCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfRVhDUF9CQVNFICsgUEZfVkVDVE9SXSAJPSBwZl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX0lOVFJdIAkJCT0gbm9wX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfTk1JXQkJCQk9IG5vcF9vbl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1NNSV0JCQkJPSBub3Bfb25faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9JTklUXQkJCQk9IG5vcF9vbl9pbnRlcmNlcHRpb24sCisJLyogW1NWTV9FWElUX0NSMF9TRUxfV1JJVEVdCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLCAqLworCVtTVk1fRVhJVF9DUFVJRF0JCQk9IGNwdWlkX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfSExUXQkJCQk9IGhhbHRfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9JTlZMUEddCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfSU5WTFBHQV0JCQk9IGludmFsaWRfb3BfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9JT0lPXSAJCSAgCT0gaW9faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9NU1JdCQkJCT0gbXNyX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfVEFTS19TV0lUQ0hdCQkJPSB0YXNrX3N3aXRjaF9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1ZNUlVOXQkJCT0gaW52YWxpZF9vcF9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1ZNTUNBTExdCQkJPSBpbnZhbGlkX29wX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfVk1MT0FEXQkJCT0gaW52YWxpZF9vcF9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1ZNU0FWRV0JCQk9IGludmFsaWRfb3BfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9TVEdJXQkJCQk9IGludmFsaWRfb3BfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9DTEdJXQkJCQk9IGludmFsaWRfb3BfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9TS0lOSVRdCQkJPSBpbnZhbGlkX29wX2ludGVyY2VwdGlvbiwKK307CisKKworc3RhdGljIGludCBoYW5kbGVfZXhpdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXUzMiBleGl0X2NvZGUgPSB2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlOworCisJa3ZtX3J1bi0+ZXhpdF90eXBlID0gS1ZNX0VYSVRfVFlQRV9WTV9FWElUOworCisJaWYgKGlzX2V4dGVybmFsX2ludGVycnVwdCh2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbykgJiYKKwkgICAgZXhpdF9jb2RlICE9IFNWTV9FWElUX0VYQ1BfQkFTRSArIFBGX1ZFQ1RPUikKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCBleGl0X2luaV9pbmZvIDB4JXggIgorCQkgICAgICAgImV4aXRfY29kZSAweCV4XG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCB2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbywKKwkJICAgICAgIGV4aXRfY29kZSk7CisKKwlpZiAoZXhpdF9jb2RlID49IHNpemVvZihzdm1fZXhpdF9oYW5kbGVycykgLyBzaXplb2YoKnN2bV9leGl0X2hhbmRsZXJzKQorCSAgICB8fCBzdm1fZXhpdF9oYW5kbGVyc1tleGl0X2NvZGVdID09IDApIHsKKwkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9VTktOT1dOOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAweCV4IEAgMHglbGx4IGNyMCAweCVseCByZmxhZ3MgMHglbGx4XG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLAorCQkgICAgICAgZXhpdF9jb2RlLAorCQkgICAgICAgdmNwdS0+c3ZtLT52bWNiLT5zYXZlLnJpcCwKKwkJICAgICAgIHZjcHUtPmNyMCwKKwkJICAgICAgIHZjcHUtPnN2bS0+dm1jYi0+c2F2ZS5yZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc3ZtX2V4aXRfaGFuZGxlcnNbZXhpdF9jb2RlXSh2Y3B1LCBrdm1fcnVuKTsKK30KKworc3RhdGljIHZvaWQgcmVsb2FkX3RzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlzdHJ1Y3Qgc3ZtX2NwdV9kYXRhICpzdm1fZGF0YSA9IHBlcl9jcHUoc3ZtX2RhdGEsIGNwdSk7CisJc3ZtX2RhdGEtPnRzc19kZXNjLT50eXBlID0gOTsgLy9hdmFpbGFibGUgMzIvNjQtYml0IFRTUworCWxvYWRfVFJfZGVzYygpOworfQorCitzdGF0aWMgdm9pZCBwcmVfc3ZtX3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlzdHJ1Y3Qgc3ZtX2NwdV9kYXRhICpzdm1fZGF0YSA9IHBlcl9jcHUoc3ZtX2RhdGEsIGNwdSk7CisKKwl2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wudGxiX2N0bCA9IFRMQl9DT05UUk9MX0RPX05PVEhJTkc7CisJaWYgKHZjcHUtPmNwdSAhPSBjcHUgfHwKKwkgICAgdmNwdS0+c3ZtLT5hc2lkX2dlbmVyYXRpb24gIT0gc3ZtX2RhdGEtPmFzaWRfZ2VuZXJhdGlvbikKKwkJbmV3X2FzaWQodmNwdSwgc3ZtX2RhdGEpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fdHJ5X2luamVjdF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2bWNiX2NvbnRyb2xfYXJlYSAqY29udHJvbDsKKworCWlmICghdmNwdS0+aXJxX3N1bW1hcnkpCisJCXJldHVybjsKKworCWNvbnRyb2wgPSAmdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sOworCisJY29udHJvbC0+aW50X3ZlY3RvciA9IHBvcF9pcnEodmNwdSk7CisJY29udHJvbC0+aW50X2N0bCAmPSB+Vl9JTlRSX1BSSU9fTUFTSzsKKwljb250cm9sLT5pbnRfY3RsIHw9IFZfSVJRX01BU0sgfAorCQkoKC8qY29udHJvbC0+aW50X3ZlY3RvciA+PiA0Ki8gMHhmKSA8PCBWX0lOVFJfUFJJT19TSElGVCk7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV9yZXB1dF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2bWNiX2NvbnRyb2xfYXJlYSAqY29udHJvbCA9ICZ2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2w7CisKKwlpZiAoY29udHJvbC0+aW50X2N0bCAmIFZfSVJRX01BU0spIHsKKwkJY29udHJvbC0+aW50X2N0bCAmPSB+Vl9JUlFfTUFTSzsKKwkJcHVzaF9pcnEodmNwdSwgY29udHJvbC0+aW50X3ZlY3Rvcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzYXZlX2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZGJfcmVncykKK3sKKwlhc20gdm9sYXRpbGUgKCJtb3YgJSVkcjAsICUwIiA6ICI9ciIoZGJfcmVnc1swXSkpOworCWFzbSB2b2xhdGlsZSAoIm1vdiAlJWRyMSwgJTAiIDogIj1yIihkYl9yZWdzWzFdKSk7CisJYXNtIHZvbGF0aWxlICgibW92ICUlZHIyLCAlMCIgOiAiPXIiKGRiX3JlZ3NbMl0pKTsKKwlhc20gdm9sYXRpbGUgKCJtb3YgJSVkcjMsICUwIiA6ICI9ciIoZGJfcmVnc1szXSkpOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZGJfcmVncykKK3sKKwlhc20gdm9sYXRpbGUgKCJtb3YgJTAsICUlZHIwIiA6IDogInIiKGRiX3JlZ3NbMF0pKTsKKwlhc20gdm9sYXRpbGUgKCJtb3YgJTAsICUlZHIxIiA6IDogInIiKGRiX3JlZ3NbMV0pKTsKKwlhc20gdm9sYXRpbGUgKCJtb3YgJTAsICUlZHIyIiA6IDogInIiKGRiX3JlZ3NbMl0pKTsKKwlhc20gdm9sYXRpbGUgKCJtb3YgJTAsICUlZHIzIiA6IDogInIiKGRiX3JlZ3NbM10pKTsKK30KKworc3RhdGljIGludCBzdm1fdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKK3sKKwl1MTYgZnNfc2VsZWN0b3I7CisJdTE2IGdzX3NlbGVjdG9yOworCXUxNiBsZHRfc2VsZWN0b3I7CisKK2FnYWluOgorCWt2bV90cnlfaW5qZWN0X2lycSh2Y3B1KTsKKworCWNsZ2koKTsKKworCXByZV9zdm1fcnVuKHZjcHUpOworCisJc2F2ZV9ob3N0X21zcnModmNwdSk7CisJZnNfc2VsZWN0b3IgPSByZWFkX2ZzKCk7CisJZ3Nfc2VsZWN0b3IgPSByZWFkX2dzKCk7CisJbGR0X3NlbGVjdG9yID0gcmVhZF9sZHQoKTsKKwl2Y3B1LT5zdm0tPmhvc3RfY3IyID0ga3ZtX3JlYWRfY3IyKCk7CisJdmNwdS0+c3ZtLT5ob3N0X2RyNiA9IHJlYWRfZHI2KCk7CisJdmNwdS0+c3ZtLT5ob3N0X2RyNyA9IHJlYWRfZHI3KCk7CisJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmNyMiA9IHZjcHUtPmNyMjsKKworCWlmICh2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuZHI3ICYgMHhmZikgeworCQl3cml0ZV9kcjcoMCk7CisJCXNhdmVfZGJfcmVncyh2Y3B1LT5zdm0tPmhvc3RfZGJfcmVncyk7CisJCWxvYWRfZGJfcmVncyh2Y3B1LT5zdm0tPmRiX3JlZ3MpOworCX0KKwlhc20gdm9sYXRpbGUgKAorI2lmZGVmIENPTkZJR19YODZfNjQKKwkJInB1c2ggJSVyYng7IHB1c2ggJSVyY3g7IHB1c2ggJSVyZHg7IgorCQkicHVzaCAlJXJzaTsgcHVzaCAlJXJkaTsgcHVzaCAlJXJicDsiCisJCSJwdXNoICUlcjg7ICBwdXNoICUlcjk7ICBwdXNoICUlcjEwOyBwdXNoICUlcjExOyIKKwkJInB1c2ggJSVyMTI7IHB1c2ggJSVyMTM7IHB1c2ggJSVyMTQ7IHB1c2ggJSVyMTU7IgorI2Vsc2UKKwkJInB1c2ggJSVlYng7IHB1c2ggJSVlY3g7IHB1c2ggJSVlZHg7IgorCQkicHVzaCAlJWVzaTsgcHVzaCAlJWVkaTsgcHVzaCAlJWVicDsiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJIm1vdiAlY1tyYnhdKCVbdmNwdV0pLCAlJXJieCBcblx0IgorCQkibW92ICVjW3JjeF0oJVt2Y3B1XSksICUlcmN4IFxuXHQiCisJCSJtb3YgJWNbcmR4XSglW3ZjcHVdKSwgJSVyZHggXG5cdCIKKwkJIm1vdiAlY1tyc2ldKCVbdmNwdV0pLCAlJXJzaSBcblx0IgorCQkibW92ICVjW3JkaV0oJVt2Y3B1XSksICUlcmRpIFxuXHQiCisJCSJtb3YgJWNbcmJwXSglW3ZjcHVdKSwgJSVyYnAgXG5cdCIKKwkJIm1vdiAlY1tyOF0oJVt2Y3B1XSksICAlJXI4ICBcblx0IgorCQkibW92ICVjW3I5XSglW3ZjcHVdKSwgICUlcjkgIFxuXHQiCisJCSJtb3YgJWNbcjEwXSglW3ZjcHVdKSwgJSVyMTAgXG5cdCIKKwkJIm1vdiAlY1tyMTFdKCVbdmNwdV0pLCAlJXIxMSBcblx0IgorCQkibW92ICVjW3IxMl0oJVt2Y3B1XSksICUlcjEyIFxuXHQiCisJCSJtb3YgJWNbcjEzXSglW3ZjcHVdKSwgJSVyMTMgXG5cdCIKKwkJIm1vdiAlY1tyMTRdKCVbdmNwdV0pLCAlJXIxNCBcblx0IgorCQkibW92ICVjW3IxNV0oJVt2Y3B1XSksICUlcjE1IFxuXHQiCisjZWxzZQorCQkibW92ICVjW3JieF0oJVt2Y3B1XSksICUlZWJ4IFxuXHQiCisJCSJtb3YgJWNbcmN4XSglW3ZjcHVdKSwgJSVlY3ggXG5cdCIKKwkJIm1vdiAlY1tyZHhdKCVbdmNwdV0pLCAlJWVkeCBcblx0IgorCQkibW92ICVjW3JzaV0oJVt2Y3B1XSksICUlZXNpIFxuXHQiCisJCSJtb3YgJWNbcmRpXSglW3ZjcHVdKSwgJSVlZGkgXG5cdCIKKwkJIm1vdiAlY1tyYnBdKCVbdmNwdV0pLCAlJWVicCBcblx0IgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCS8qIEVudGVyIGd1ZXN0IG1vZGUgKi8KKwkJInB1c2ggJSVyYXggXG5cdCIKKwkJIm1vdiAlY1tzdm1dKCVbdmNwdV0pLCAlJXJheCBcblx0IgorCQkibW92ICVjW3ZtY2JdKCUlcmF4KSwgJSVyYXggXG5cdCIKKwkJU1ZNX1ZNTE9BRCAiXG5cdCIKKwkJU1ZNX1ZNUlVOICJcblx0IgorCQlTVk1fVk1TQVZFICJcblx0IgorCQkicG9wICUlcmF4IFxuXHQiCisjZWxzZQorCQkvKiBFbnRlciBndWVzdCBtb2RlICovCisJCSJwdXNoICUlZWF4IFxuXHQiCisJCSJtb3YgJWNbc3ZtXSglW3ZjcHVdKSwgJSVlYXggXG5cdCIKKwkJIm1vdiAlY1t2bWNiXSglJWVheCksICUlZWF4IFxuXHQiCisJCVNWTV9WTUxPQUQgIlxuXHQiCisJCVNWTV9WTVJVTiAiXG5cdCIKKwkJU1ZNX1ZNU0FWRSAiXG5cdCIKKwkJInBvcCAlJWVheCBcblx0IgorI2VuZGlmCisKKwkJLyogU2F2ZSBndWVzdCByZWdpc3RlcnMsIGxvYWQgaG9zdCByZWdpc3RlcnMgKi8KKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCSJtb3YgJSVyYngsICVjW3JieF0oJVt2Y3B1XSkgXG5cdCIKKwkJIm1vdiAlJXJjeCwgJWNbcmN4XSglW3ZjcHVdKSBcblx0IgorCQkibW92ICUlcmR4LCAlY1tyZHhdKCVbdmNwdV0pIFxuXHQiCisJCSJtb3YgJSVyc2ksICVjW3JzaV0oJVt2Y3B1XSkgXG5cdCIKKwkJIm1vdiAlJXJkaSwgJWNbcmRpXSglW3ZjcHVdKSBcblx0IgorCQkibW92ICUlcmJwLCAlY1tyYnBdKCVbdmNwdV0pIFxuXHQiCisJCSJtb3YgJSVyOCwgICVjW3I4XSglW3ZjcHVdKSBcblx0IgorCQkibW92ICUlcjksICAlY1tyOV0oJVt2Y3B1XSkgXG5cdCIKKwkJIm1vdiAlJXIxMCwgJWNbcjEwXSglW3ZjcHVdKSBcblx0IgorCQkibW92ICUlcjExLCAlY1tyMTFdKCVbdmNwdV0pIFxuXHQiCisJCSJtb3YgJSVyMTIsICVjW3IxMl0oJVt2Y3B1XSkgXG5cdCIKKwkJIm1vdiAlJXIxMywgJWNbcjEzXSglW3ZjcHVdKSBcblx0IgorCQkibW92ICUlcjE0LCAlY1tyMTRdKCVbdmNwdV0pIFxuXHQiCisJCSJtb3YgJSVyMTUsICVjW3IxNV0oJVt2Y3B1XSkgXG5cdCIKKworCQkicG9wICAlJXIxNTsgcG9wICAlJXIxNDsgcG9wICAlJXIxMzsgcG9wICAlJXIxMjsiCisJCSJwb3AgICUlcjExOyBwb3AgICUlcjEwOyBwb3AgICUlcjk7ICBwb3AgICUlcjg7IgorCQkicG9wICAlJXJicDsgcG9wICAlJXJkaTsgcG9wICAlJXJzaTsiCisJCSJwb3AgICUlcmR4OyBwb3AgICUlcmN4OyBwb3AgICUlcmJ4OyBcblx0IgorI2Vsc2UKKwkJIm1vdiAlJWVieCwgJWNbcmJ4XSglW3ZjcHVdKSBcblx0IgorCQkibW92ICUlZWN4LCAlY1tyY3hdKCVbdmNwdV0pIFxuXHQiCisJCSJtb3YgJSVlZHgsICVjW3JkeF0oJVt2Y3B1XSkgXG5cdCIKKwkJIm1vdiAlJWVzaSwgJWNbcnNpXSglW3ZjcHVdKSBcblx0IgorCQkibW92ICUlZWRpLCAlY1tyZGldKCVbdmNwdV0pIFxuXHQiCisJCSJtb3YgJSVlYnAsICVjW3JicF0oJVt2Y3B1XSkgXG5cdCIKKworCQkicG9wICAlJWVicDsgcG9wICAlJWVkaTsgcG9wICAlJWVzaTsiCisJCSJwb3AgICUlZWR4OyBwb3AgICUlZWN4OyBwb3AgICUlZWJ4OyBcblx0IgorI2VuZGlmCisJCToKKwkJOiBbdmNwdV0iYSIodmNwdSksCisJCSAgW3N2bV0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBzdm0pKSwKKwkJICBbdm1jYl0iaSIob2Zmc2V0b2Yoc3RydWN0IHZjcHVfc3ZtLCB2bWNiX3BhKSksCisJCSAgW3JieF0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SQlhdKSksCisJCSAgW3JjeF0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SQ1hdKSksCisJCSAgW3JkeF0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SRFhdKSksCisJCSAgW3JzaV0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SU0ldKSksCisJCSAgW3JkaV0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SREldKSksCisJCSAgW3JicF0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SQlBdKSkKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCSAgLFtyOCBdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjggXSkpLAorCQkgIFtyOSBdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjkgXSkpLAorCQkgIFtyMTBdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjEwXSkpLAorCQkgIFtyMTFdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjExXSkpLAorCQkgIFtyMTJdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjEyXSkpLAorCQkgIFtyMTNdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjEzXSkpLAorCQkgIFtyMTRdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjE0XSkpLAorCQkgIFtyMTVdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjE1XSkpCisjZW5kaWYKKwkJOiAiY2MiLCAibWVtb3J5IiApOworCisJaWYgKCh2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuZHI3ICYgMHhmZikpCisJCWxvYWRfZGJfcmVncyh2Y3B1LT5zdm0tPmhvc3RfZGJfcmVncyk7CisKKwl2Y3B1LT5jcjIgPSB2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuY3IyOworCisJd3JpdGVfZHI2KHZjcHUtPnN2bS0+aG9zdF9kcjYpOworCXdyaXRlX2RyNyh2Y3B1LT5zdm0tPmhvc3RfZHI3KTsKKwlrdm1fd3JpdGVfY3IyKHZjcHUtPnN2bS0+aG9zdF9jcjIpOworCisJbG9hZF9mcyhmc19zZWxlY3Rvcik7CisJbG9hZF9ncyhnc19zZWxlY3Rvcik7CisJbG9hZF9sZHQobGR0X3NlbGVjdG9yKTsKKwlsb2FkX2hvc3RfbXNycyh2Y3B1KTsKKworCXJlbG9hZF90c3ModmNwdSk7CisKKwlzdGdpKCk7CisKKwlrdm1fcmVwdXRfaXJxKHZjcHUpOworCisJdmNwdS0+c3ZtLT5uZXh0X3JpcCA9IDA7CisKKwlpZiAodmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLmV4aXRfY29kZSA9PSBTVk1fRVhJVF9FUlIpIHsKKwkJa3ZtX3J1bi0+ZXhpdF90eXBlID0gS1ZNX0VYSVRfVFlQRV9GQUlMX0VOVFJZOworCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IHZjcHUtPnN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2NvZGU7CisJCXJldHVybiAwOworCX0KKworCWlmIChoYW5kbGVfZXhpdCh2Y3B1LCBrdm1fcnVuKSkgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCSsra3ZtX3N0YXQuc2lnbmFsX2V4aXRzOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJfQorCQlrdm1fcmVzY2hlZCh2Y3B1KTsKKwkJZ290byBhZ2FpbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN2bV9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWZvcmNlX25ld19hc2lkKHZjcHUpOworfQorCitzdGF0aWMgdm9pZCBzdm1fc2V0X2NyMyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgcm9vdCkKK3sKKwl2Y3B1LT5zdm0tPnZtY2ItPnNhdmUuY3IzID0gcm9vdDsKKwlmb3JjZV9uZXdfYXNpZCh2Y3B1KTsKK30KKworc3RhdGljIHZvaWQgc3ZtX2luamVjdF9wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgIGFkZHIsCisJCQkJICB1aW50MzJfdCBlcnJfY29kZSkKK3sKKwl1aW50MzJfdCBleGl0X2ludF9pbmZvID0gdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm87CisKKwkrK2t2bV9zdGF0LnBmX2d1ZXN0OworCisJaWYgKGlzX3BhZ2VfZmF1bHQoZXhpdF9pbnRfaW5mbykpIHsKKworCQl2Y3B1LT5zdm0tPnZtY2ItPmNvbnRyb2wuZXZlbnRfaW5qX2VyciA9IDA7CisJCXZjcHUtPnN2bS0+dm1jYi0+Y29udHJvbC5ldmVudF9pbmogPSAJU1ZNX0VWVElOSl9WQUxJRCB8CisJCQkJCQkJU1ZNX0VWVElOSl9WQUxJRF9FUlIgfAorCQkJCQkJCVNWTV9FVlRJTkpfVFlQRV9FWEVQVCB8CisJCQkJCQkJREZfVkVDVE9SOworCQlyZXR1cm47CisJfQorCXZjcHUtPmNyMiA9IGFkZHI7CisJdmNwdS0+c3ZtLT52bWNiLT5zYXZlLmNyMiA9IGFkZHI7CisJdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLmV2ZW50X2luaiA9IAlTVk1fRVZUSU5KX1ZBTElEIHwKKwkJCQkJCVNWTV9FVlRJTkpfVkFMSURfRVJSIHwKKwkJCQkJCVNWTV9FVlRJTkpfVFlQRV9FWEVQVCB8CisJCQkJCQlQRl9WRUNUT1I7CisJdmNwdS0+c3ZtLT52bWNiLT5jb250cm9sLmV2ZW50X2lual9lcnIgPSBlcnJfY29kZTsKK30KKworCitzdGF0aWMgaW50IGlzX2Rpc2FibGVkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga3ZtX2FyY2hfb3BzIHN2bV9hcmNoX29wcyA9IHsKKwkuY3B1X2hhc19rdm1fc3VwcG9ydCA9IGhhc19zdm0sCisJLmRpc2FibGVkX2J5X2Jpb3MgPSBpc19kaXNhYmxlZCwKKwkuaGFyZHdhcmVfc2V0dXAgPSBzdm1faGFyZHdhcmVfc2V0dXAsCisJLmhhcmR3YXJlX3Vuc2V0dXAgPSBzdm1faGFyZHdhcmVfdW5zZXR1cCwKKwkuaGFyZHdhcmVfZW5hYmxlID0gc3ZtX2hhcmR3YXJlX2VuYWJsZSwKKwkuaGFyZHdhcmVfZGlzYWJsZSA9IHN2bV9oYXJkd2FyZV9kaXNhYmxlLAorCisJLnZjcHVfY3JlYXRlID0gc3ZtX2NyZWF0ZV92Y3B1LAorCS52Y3B1X2ZyZWUgPSBzdm1fZnJlZV92Y3B1LAorCisJLnZjcHVfbG9hZCA9IHN2bV92Y3B1X2xvYWQsCisJLnZjcHVfcHV0ID0gc3ZtX3ZjcHVfcHV0LAorCisJLnNldF9ndWVzdF9kZWJ1ZyA9IHN2bV9ndWVzdF9kZWJ1ZywKKwkuZ2V0X21zciA9IHN2bV9nZXRfbXNyLAorCS5zZXRfbXNyID0gc3ZtX3NldF9tc3IsCisJLmdldF9zZWdtZW50X2Jhc2UgPSBzdm1fZ2V0X3NlZ21lbnRfYmFzZSwKKwkuZ2V0X3NlZ21lbnQgPSBzdm1fZ2V0X3NlZ21lbnQsCisJLnNldF9zZWdtZW50ID0gc3ZtX3NldF9zZWdtZW50LAorCS5pc19sb25nX21vZGUgPSBzdm1faXNfbG9uZ19tb2RlLAorCS5nZXRfY3NfZGJfbF9iaXRzID0gc3ZtX2dldF9jc19kYl9sX2JpdHMsCisJLnNldF9jcjAgPSBzdm1fc2V0X2NyMCwKKwkuc2V0X2NyMF9ub19tb2Rlc3dpdGNoID0gc3ZtX3NldF9jcjAsCisJLnNldF9jcjMgPSBzdm1fc2V0X2NyMywKKwkuc2V0X2NyNCA9IHN2bV9zZXRfY3I0LAorCS5zZXRfZWZlciA9IHN2bV9zZXRfZWZlciwKKwkuZ2V0X2lkdCA9IHN2bV9nZXRfaWR0LAorCS5zZXRfaWR0ID0gc3ZtX3NldF9pZHQsCisJLmdldF9nZHQgPSBzdm1fZ2V0X2dkdCwKKwkuc2V0X2dkdCA9IHN2bV9zZXRfZ2R0LAorCS5nZXRfZHIgPSBzdm1fZ2V0X2RyLAorCS5zZXRfZHIgPSBzdm1fc2V0X2RyLAorCS5jYWNoZV9yZWdzID0gc3ZtX2NhY2hlX3JlZ3MsCisJLmRlY2FjaGVfcmVncyA9IHN2bV9kZWNhY2hlX3JlZ3MsCisJLmdldF9yZmxhZ3MgPSBzdm1fZ2V0X3JmbGFncywKKwkuc2V0X3JmbGFncyA9IHN2bV9zZXRfcmZsYWdzLAorCisJLmludmxwZyA9IHN2bV9pbnZscGcsCisJLnRsYl9mbHVzaCA9IHN2bV9mbHVzaF90bGIsCisJLmluamVjdF9wYWdlX2ZhdWx0ID0gc3ZtX2luamVjdF9wYWdlX2ZhdWx0LAorCisJLmluamVjdF9ncCA9IHN2bV9pbmplY3RfZ3AsCisKKwkucnVuID0gc3ZtX3ZjcHVfcnVuLAorCS5za2lwX2VtdWxhdGVkX2luc3RydWN0aW9uID0gc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbiwKKwkudmNwdV9zZXR1cCA9IHN2bV92Y3B1X3NldHVwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3ZtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4ga3ZtX2luaXRfYXJjaCgmc3ZtX2FyY2hfb3BzLCBUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdm1fZXhpdCh2b2lkKQoreworCWt2bV9leGl0X2FyY2goKTsKK30KKworbW9kdWxlX2luaXQoc3ZtX2luaXQpCittb2R1bGVfZXhpdChzdm1fZXhpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMva3ZtL3N2bS5oIGIvZHJpdmVycy9rdm0vc3ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3MzFjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMva3ZtL3N2bS5oCkBAIC0wLDAgKzEsMzE1IEBACisjaWZuZGVmIF9fU1ZNX0gKKyNkZWZpbmUgX19TVk1fSAorCitlbnVtIHsKKwlJTlRFUkNFUFRfSU5UUiwKKwlJTlRFUkNFUFRfTk1JLAorCUlOVEVSQ0VQVF9TTUksCisJSU5URVJDRVBUX0lOSVQsCisJSU5URVJDRVBUX1ZJTlRSLAorCUlOVEVSQ0VQVF9TRUxFQ1RJVkVfQ1IwLAorCUlOVEVSQ0VQVF9TVE9SRV9JRFRSLAorCUlOVEVSQ0VQVF9TVE9SRV9HRFRSLAorCUlOVEVSQ0VQVF9TVE9SRV9MRFRSLAorCUlOVEVSQ0VQVF9TVE9SRV9UUiwKKwlJTlRFUkNFUFRfTE9BRF9JRFRSLAorCUlOVEVSQ0VQVF9MT0FEX0dEVFIsCisJSU5URVJDRVBUX0xPQURfTERUUiwKKwlJTlRFUkNFUFRfTE9BRF9UUiwKKwlJTlRFUkNFUFRfUkRUU0MsCisJSU5URVJDRVBUX1JEUE1DLAorCUlOVEVSQ0VQVF9QVVNIRiwKKwlJTlRFUkNFUFRfUE9QRiwKKwlJTlRFUkNFUFRfQ1BVSUQsCisJSU5URVJDRVBUX1JTTSwKKwlJTlRFUkNFUFRfSVJFVCwKKwlJTlRFUkNFUFRfSU5UbiwKKwlJTlRFUkNFUFRfSU5WRCwKKwlJTlRFUkNFUFRfUEFVU0UsCisJSU5URVJDRVBUX0hMVCwKKwlJTlRFUkNFUFRfSU5WTFBHLAorCUlOVEVSQ0VQVF9JTlZMUEdBLAorCUlOVEVSQ0VQVF9JT0lPX1BST1QsCisJSU5URVJDRVBUX01TUl9QUk9ULAorCUlOVEVSQ0VQVF9UQVNLX1NXSVRDSCwKKwlJTlRFUkNFUFRfRkVSUl9GUkVFWkUsCisJSU5URVJDRVBUX1NIVVRET1dOLAorCUlOVEVSQ0VQVF9WTVJVTiwKKwlJTlRFUkNFUFRfVk1NQ0FMTCwKKwlJTlRFUkNFUFRfVk1MT0FELAorCUlOVEVSQ0VQVF9WTVNBVkUsCisJSU5URVJDRVBUX1NUR0ksCisJSU5URVJDRVBUX0NMR0ksCisJSU5URVJDRVBUX1NLSU5JVCwKKwlJTlRFUkNFUFRfUkRUU0NQLAorCUlOVEVSQ0VQVF9JQ0VCUCwKKwlJTlRFUkNFUFRfV0JJTlZELAorfTsKKworCitzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB2bWNiX2NvbnRyb2xfYXJlYSB7CisJdTE2IGludGVyY2VwdF9jcl9yZWFkOworCXUxNiBpbnRlcmNlcHRfY3Jfd3JpdGU7CisJdTE2IGludGVyY2VwdF9kcl9yZWFkOworCXUxNiBpbnRlcmNlcHRfZHJfd3JpdGU7CisJdTMyIGludGVyY2VwdF9leGNlcHRpb25zOworCXU2NCBpbnRlcmNlcHQ7CisJdTggcmVzZXJ2ZWRfMVs0NF07CisJdTY0IGlvcG1fYmFzZV9wYTsKKwl1NjQgbXNycG1fYmFzZV9wYTsKKwl1NjQgdHNjX29mZnNldDsKKwl1MzIgYXNpZDsKKwl1OCB0bGJfY3RsOworCXU4IHJlc2VydmVkXzJbM107CisJdTMyIGludF9jdGw7CisJdTMyIGludF92ZWN0b3I7CisJdTMyIGludF9zdGF0ZTsKKwl1OCByZXNlcnZlZF8zWzRdOworCXUzMiBleGl0X2NvZGU7CisJdTMyIGV4aXRfY29kZV9oaTsKKwl1NjQgZXhpdF9pbmZvXzE7CisJdTY0IGV4aXRfaW5mb18yOworCXUzMiBleGl0X2ludF9pbmZvOworCXUzMiBleGl0X2ludF9pbmZvX2VycjsKKwl1NjQgbmVzdGVkX2N0bDsKKwl1OCByZXNlcnZlZF80WzE2XTsKKwl1MzIgZXZlbnRfaW5qOworCXUzMiBldmVudF9pbmpfZXJyOworCXU2NCBuZXN0ZWRfY3IzOworCXU2NCBsYnJfY3RsOworCXU4IHJlc2VydmVkXzVbODMyXTsKK307CisKKworI2RlZmluZSBUTEJfQ09OVFJPTF9ET19OT1RISU5HIDAKKyNkZWZpbmUgVExCX0NPTlRST0xfRkxVU0hfQUxMX0FTSUQgMQorCisjZGVmaW5lIFZfVFBSX01BU0sgMHgwZgorCisjZGVmaW5lIFZfSVJRX1NISUZUIDgKKyNkZWZpbmUgVl9JUlFfTUFTSyAoMSA8PCBWX0lSUV9TSElGVCkKKworI2RlZmluZSBWX0lOVFJfUFJJT19TSElGVCAxNgorI2RlZmluZSBWX0lOVFJfUFJJT19NQVNLICgweDBmIDw8IFZfSU5UUl9QUklPX1NISUZUKQorCisjZGVmaW5lIFZfSUdOX1RQUl9TSElGVCAyMAorI2RlZmluZSBWX0lHTl9UUFJfTUFTSyAoMSA8PCBWX0lHTl9UUFJfU0hJRlQpCisKKyNkZWZpbmUgVl9JTlRSX01BU0tJTkdfU0hJRlQgMjQKKyNkZWZpbmUgVl9JTlRSX01BU0tJTkdfTUFTSyAoMSA8PCBWX0lOVFJfTUFTS0lOR19TSElGVCkKKworI2RlZmluZSBTVk1fSU5URVJSVVBUX1NIQURPV19NQVNLIDEKKworI2RlZmluZSBTVk1fSU9JT19TVFJfU0hJRlQgMgorI2RlZmluZSBTVk1fSU9JT19SRVBfU0hJRlQgMworI2RlZmluZSBTVk1fSU9JT19TSVpFX1NISUZUIDQKKyNkZWZpbmUgU1ZNX0lPSU9fQVNJWkVfU0hJRlQgNworCisjZGVmaW5lIFNWTV9JT0lPX1RZUEVfTUFTSyAxCisjZGVmaW5lIFNWTV9JT0lPX1NUUl9NQVNLICgxIDw8IFNWTV9JT0lPX1NUUl9TSElGVCkKKyNkZWZpbmUgU1ZNX0lPSU9fUkVQX01BU0sgKDEgPDwgU1ZNX0lPSU9fUkVQX1NISUZUKQorI2RlZmluZSBTVk1fSU9JT19TSVpFX01BU0sgKDcgPDwgU1ZNX0lPSU9fU0laRV9TSElGVCkKKyNkZWZpbmUgU1ZNX0lPSU9fQVNJWkVfTUFTSyAoNyA8PCBTVk1fSU9JT19BU0laRV9TSElGVCkKKworc3RydWN0IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdm1jYl9zZWcgeworCXUxNiBzZWxlY3RvcjsKKwl1MTYgYXR0cmliOworCXUzMiBsaW1pdDsKKwl1NjQgYmFzZTsKK307CisKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHZtY2Jfc2F2ZV9hcmVhIHsKKwlzdHJ1Y3Qgdm1jYl9zZWcgZXM7CisJc3RydWN0IHZtY2Jfc2VnIGNzOworCXN0cnVjdCB2bWNiX3NlZyBzczsKKwlzdHJ1Y3Qgdm1jYl9zZWcgZHM7CisJc3RydWN0IHZtY2Jfc2VnIGZzOworCXN0cnVjdCB2bWNiX3NlZyBnczsKKwlzdHJ1Y3Qgdm1jYl9zZWcgZ2R0cjsKKwlzdHJ1Y3Qgdm1jYl9zZWcgbGR0cjsKKwlzdHJ1Y3Qgdm1jYl9zZWcgaWR0cjsKKwlzdHJ1Y3Qgdm1jYl9zZWcgdHI7CisJdTggcmVzZXJ2ZWRfMVs0M107CisJdTggY3BsOworCXU4IHJlc2VydmVkXzJbNF07CisJdTY0IGVmZXI7CisJdTggcmVzZXJ2ZWRfM1sxMTJdOworCXU2NCBjcjQ7CisJdTY0IGNyMzsKKwl1NjQgY3IwOworCXU2NCBkcjc7CisJdTY0IGRyNjsKKwl1NjQgcmZsYWdzOworCXU2NCByaXA7CisJdTggcmVzZXJ2ZWRfNFs4OF07CisJdTY0IHJzcDsKKwl1OCByZXNlcnZlZF81WzI0XTsKKwl1NjQgcmF4OworCXU2NCBzdGFyOworCXU2NCBsc3RhcjsKKwl1NjQgY3N0YXI7CisJdTY0IHNmbWFzazsKKwl1NjQga2VybmVsX2dzX2Jhc2U7CisJdTY0IHN5c2VudGVyX2NzOworCXU2NCBzeXNlbnRlcl9lc3A7CisJdTY0IHN5c2VudGVyX2VpcDsKKwl1NjQgY3IyOworCXU4IHJlc2VydmVkXzZbMzJdOworCXU2NCBnX3BhdDsKKwl1NjQgZGJnY3RsOworCXU2NCBicl9mcm9tOworCXU2NCBicl90bzsKKwl1NjQgbGFzdF9leGNwX2Zyb207CisJdTY0IGxhc3RfZXhjcF90bzsKK307CisKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHZtY2IgeworCXN0cnVjdCB2bWNiX2NvbnRyb2xfYXJlYSBjb250cm9sOworCXN0cnVjdCB2bWNiX3NhdmVfYXJlYSBzYXZlOworfTsKKworI2RlZmluZSBTVk1fQ1BVSURfRkVBVFVSRV9TSElGVCAyCisjZGVmaW5lIFNWTV9DUFVJRF9GVU5DIDB4ODAwMDAwMGEKKworI2RlZmluZSBNU1JfRUZFUl9TVk1FX01BU0sgKDFVTEwgPDwgMTIpCisjZGVmaW5lIE1TUl9WTV9IU0FWRV9QQSAweGMwMDEwMTE3VUxMCisKKyNkZWZpbmUgU1ZNX1NFTEVDVE9SX1NfU0hJRlQgNAorI2RlZmluZSBTVk1fU0VMRUNUT1JfRFBMX1NISUZUIDUKKyNkZWZpbmUgU1ZNX1NFTEVDVE9SX1BfU0hJRlQgNworI2RlZmluZSBTVk1fU0VMRUNUT1JfQVZMX1NISUZUIDgKKyNkZWZpbmUgU1ZNX1NFTEVDVE9SX0xfU0hJRlQgOQorI2RlZmluZSBTVk1fU0VMRUNUT1JfREJfU0hJRlQgMTAKKyNkZWZpbmUgU1ZNX1NFTEVDVE9SX0dfU0hJRlQgMTEKKworI2RlZmluZSBTVk1fU0VMRUNUT1JfVFlQRV9NQVNLICgweGYpCisjZGVmaW5lIFNWTV9TRUxFQ1RPUl9TX01BU0sgKDEgPDwgU1ZNX1NFTEVDVE9SX1NfU0hJRlQpCisjZGVmaW5lIFNWTV9TRUxFQ1RPUl9EUExfTUFTSyAoMyA8PCBTVk1fU0VMRUNUT1JfRFBMX1NISUZUKQorI2RlZmluZSBTVk1fU0VMRUNUT1JfUF9NQVNLICgxIDw8IFNWTV9TRUxFQ1RPUl9QX1NISUZUKQorI2RlZmluZSBTVk1fU0VMRUNUT1JfQVZMX01BU0sgKDEgPDwgU1ZNX1NFTEVDVE9SX0FWTF9TSElGVCkKKyNkZWZpbmUgU1ZNX1NFTEVDVE9SX0xfTUFTSyAoMSA8PCBTVk1fU0VMRUNUT1JfTF9TSElGVCkKKyNkZWZpbmUgU1ZNX1NFTEVDVE9SX0RCX01BU0sgKDEgPDwgU1ZNX1NFTEVDVE9SX0RCX1NISUZUKQorI2RlZmluZSBTVk1fU0VMRUNUT1JfR19NQVNLICgxIDw8IFNWTV9TRUxFQ1RPUl9HX1NISUZUKQorCisjZGVmaW5lIFNWTV9TRUxFQ1RPUl9XUklURV9NQVNLICgxIDw8IDEpCisjZGVmaW5lIFNWTV9TRUxFQ1RPUl9SRUFEX01BU0sgU1ZNX1NFTEVDVE9SX1dSSVRFX01BU0sKKyNkZWZpbmUgU1ZNX1NFTEVDVE9SX0NPREVfTUFTSyAoMSA8PCAzKQorCisjZGVmaW5lIElOVEVSQ0VQVF9DUjBfTUFTSyAxCisjZGVmaW5lIElOVEVSQ0VQVF9DUjNfTUFTSyAoMSA8PCAzKQorI2RlZmluZSBJTlRFUkNFUFRfQ1I0X01BU0sgKDEgPDwgNCkKKworI2RlZmluZSBJTlRFUkNFUFRfRFIwX01BU0sgMQorI2RlZmluZSBJTlRFUkNFUFRfRFIxX01BU0sgKDEgPDwgMSkKKyNkZWZpbmUgSU5URVJDRVBUX0RSMl9NQVNLICgxIDw8IDIpCisjZGVmaW5lIElOVEVSQ0VQVF9EUjNfTUFTSyAoMSA8PCAzKQorI2RlZmluZSBJTlRFUkNFUFRfRFI0X01BU0sgKDEgPDwgNCkKKyNkZWZpbmUgSU5URVJDRVBUX0RSNV9NQVNLICgxIDw8IDUpCisjZGVmaW5lIElOVEVSQ0VQVF9EUjZfTUFTSyAoMSA8PCA2KQorI2RlZmluZSBJTlRFUkNFUFRfRFI3X01BU0sgKDEgPDwgNykKKworI2RlZmluZSBTVk1fRVZUSU5KX1ZFQ19NQVNLIDB4ZmYKKworI2RlZmluZSBTVk1fRVZUSU5KX1RZUEVfU0hJRlQgOAorI2RlZmluZSBTVk1fRVZUSU5KX1RZUEVfTUFTSyAoNyA8PCBTVk1fRVZUSU5KX1RZUEVfU0hJRlQpCisKKyNkZWZpbmUgU1ZNX0VWVElOSl9UWVBFX0lOVFIgKDAgPDwgU1ZNX0VWVElOSl9UWVBFX1NISUZUKQorI2RlZmluZSBTVk1fRVZUSU5KX1RZUEVfTk1JICgyIDw8IFNWTV9FVlRJTkpfVFlQRV9TSElGVCkKKyNkZWZpbmUgU1ZNX0VWVElOSl9UWVBFX0VYRVBUICgzIDw8IFNWTV9FVlRJTkpfVFlQRV9TSElGVCkKKyNkZWZpbmUgU1ZNX0VWVElOSl9UWVBFX1NPRlQgKDQgPDwgU1ZNX0VWVElOSl9UWVBFX1NISUZUKQorCisjZGVmaW5lIFNWTV9FVlRJTkpfVkFMSUQgKDEgPDwgMzEpCisjZGVmaW5lIFNWTV9FVlRJTkpfVkFMSURfRVJSICgxIDw8IDExKQorCisjZGVmaW5lIFNWTV9FWElUSU5USU5GT19WRUNfTUFTSyBTVk1fRVZUSU5KX1ZFQ19NQVNLCisKKyNkZWZpbmUJU1ZNX0VYSVRJTlRJTkZPX1RZUEVfSU5UUiBTVk1fRVZUSU5KX1RZUEVfSU5UUgorI2RlZmluZQlTVk1fRVhJVElOVElORk9fVFlQRV9OTUkgU1ZNX0VWVElOSl9UWVBFX05NSQorI2RlZmluZQlTVk1fRVhJVElOVElORk9fVFlQRV9FWEVQVCBTVk1fRVZUSU5KX1RZUEVfRVhFUFQKKyNkZWZpbmUJU1ZNX0VYSVRJTlRJTkZPX1RZUEVfU09GVCBTVk1fRVZUSU5KX1RZUEVfU09GVAorCisjZGVmaW5lIFNWTV9FWElUSU5USU5GT19WQUxJRCBTVk1fRVZUSU5KX1ZBTElECisjZGVmaW5lIFNWTV9FWElUSU5USU5GT19WQUxJRF9FUlIgU1ZNX0VWVElOSl9WQUxJRF9FUlIKKworI2RlZmluZQlTVk1fRVhJVF9SRUFEX0NSMCAJMHgwMDAKKyNkZWZpbmUJU1ZNX0VYSVRfUkVBRF9DUjMgCTB4MDAzCisjZGVmaW5lCVNWTV9FWElUX1JFQURfQ1I0IAkweDAwNAorI2RlZmluZQlTVk1fRVhJVF9SRUFEX0NSOCAJMHgwMDgKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfQ1IwIAkweDAxMAorI2RlZmluZQlTVk1fRVhJVF9XUklURV9DUjMgCTB4MDEzCisjZGVmaW5lCVNWTV9FWElUX1dSSVRFX0NSNCAJMHgwMTQKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfQ1I4IAkweDAxOAorI2RlZmluZQlTVk1fRVhJVF9SRUFEX0RSMCAJMHgwMjAKKyNkZWZpbmUJU1ZNX0VYSVRfUkVBRF9EUjEgCTB4MDIxCisjZGVmaW5lCVNWTV9FWElUX1JFQURfRFIyIAkweDAyMgorI2RlZmluZQlTVk1fRVhJVF9SRUFEX0RSMyAJMHgwMjMKKyNkZWZpbmUJU1ZNX0VYSVRfUkVBRF9EUjQgCTB4MDI0CisjZGVmaW5lCVNWTV9FWElUX1JFQURfRFI1IAkweDAyNQorI2RlZmluZQlTVk1fRVhJVF9SRUFEX0RSNiAJMHgwMjYKKyNkZWZpbmUJU1ZNX0VYSVRfUkVBRF9EUjcgCTB4MDI3CisjZGVmaW5lCVNWTV9FWElUX1dSSVRFX0RSMCAJMHgwMzAKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfRFIxIAkweDAzMQorI2RlZmluZQlTVk1fRVhJVF9XUklURV9EUjIgCTB4MDMyCisjZGVmaW5lCVNWTV9FWElUX1dSSVRFX0RSMyAJMHgwMzMKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfRFI0IAkweDAzNAorI2RlZmluZQlTVk1fRVhJVF9XUklURV9EUjUgCTB4MDM1CisjZGVmaW5lCVNWTV9FWElUX1dSSVRFX0RSNiAJMHgwMzYKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfRFI3IAkweDAzNworI2RlZmluZSBTVk1fRVhJVF9FWENQX0JBU0UgICAgICAweDA0MAorI2RlZmluZSBTVk1fRVhJVF9JTlRSCQkweDA2MAorI2RlZmluZSBTVk1fRVhJVF9OTUkJCTB4MDYxCisjZGVmaW5lIFNWTV9FWElUX1NNSQkJMHgwNjIKKyNkZWZpbmUgU1ZNX0VYSVRfSU5JVAkJMHgwNjMKKyNkZWZpbmUgU1ZNX0VYSVRfVklOVFIJCTB4MDY0CisjZGVmaW5lIFNWTV9FWElUX0NSMF9TRUxfV1JJVEUJMHgwNjUKKyNkZWZpbmUgU1ZNX0VYSVRfSURUUl9SRUFECTB4MDY2CisjZGVmaW5lIFNWTV9FWElUX0dEVFJfUkVBRAkweDA2NworI2RlZmluZSBTVk1fRVhJVF9MRFRSX1JFQUQJMHgwNjgKKyNkZWZpbmUgU1ZNX0VYSVRfVFJfUkVBRAkweDA2OQorI2RlZmluZSBTVk1fRVhJVF9JRFRSX1dSSVRFCTB4MDZhCisjZGVmaW5lIFNWTV9FWElUX0dEVFJfV1JJVEUJMHgwNmIKKyNkZWZpbmUgU1ZNX0VYSVRfTERUUl9XUklURQkweDA2YworI2RlZmluZSBTVk1fRVhJVF9UUl9XUklURQkweDA2ZAorI2RlZmluZSBTVk1fRVhJVF9SRFRTQwkJMHgwNmUKKyNkZWZpbmUgU1ZNX0VYSVRfUkRQTUMJCTB4MDZmCisjZGVmaW5lIFNWTV9FWElUX1BVU0hGCQkweDA3MAorI2RlZmluZSBTVk1fRVhJVF9QT1BGCQkweDA3MQorI2RlZmluZSBTVk1fRVhJVF9DUFVJRAkJMHgwNzIKKyNkZWZpbmUgU1ZNX0VYSVRfUlNNCQkweDA3MworI2RlZmluZSBTVk1fRVhJVF9JUkVUCQkweDA3NAorI2RlZmluZSBTVk1fRVhJVF9TV0lOVAkJMHgwNzUKKyNkZWZpbmUgU1ZNX0VYSVRfSU5WRAkJMHgwNzYKKyNkZWZpbmUgU1ZNX0VYSVRfUEFVU0UJCTB4MDc3CisjZGVmaW5lIFNWTV9FWElUX0hMVAkJMHgwNzgKKyNkZWZpbmUgU1ZNX0VYSVRfSU5WTFBHCQkweDA3OQorI2RlZmluZSBTVk1fRVhJVF9JTlZMUEdBCTB4MDdhCisjZGVmaW5lIFNWTV9FWElUX0lPSU8JCTB4MDdiCisjZGVmaW5lIFNWTV9FWElUX01TUgkJMHgwN2MKKyNkZWZpbmUgU1ZNX0VYSVRfVEFTS19TV0lUQ0gJMHgwN2QKKyNkZWZpbmUgU1ZNX0VYSVRfRkVSUl9GUkVFWkUJMHgwN2UKKyNkZWZpbmUgU1ZNX0VYSVRfU0hVVERPV04JMHgwN2YKKyNkZWZpbmUgU1ZNX0VYSVRfVk1SVU4JCTB4MDgwCisjZGVmaW5lIFNWTV9FWElUX1ZNTUNBTEwJMHgwODEKKyNkZWZpbmUgU1ZNX0VYSVRfVk1MT0FECQkweDA4MgorI2RlZmluZSBTVk1fRVhJVF9WTVNBVkUJCTB4MDgzCisjZGVmaW5lIFNWTV9FWElUX1NUR0kJCTB4MDg0CisjZGVmaW5lIFNWTV9FWElUX0NMR0kJCTB4MDg1CisjZGVmaW5lIFNWTV9FWElUX1NLSU5JVAkJMHgwODYKKyNkZWZpbmUgU1ZNX0VYSVRfUkRUU0NQCQkweDA4NworI2RlZmluZSBTVk1fRVhJVF9JQ0VCUAkJMHgwODgKKyNkZWZpbmUgU1ZNX0VYSVRfV0JJTlZECQkweDA4OQorI2RlZmluZSBTVk1fRVhJVF9OUEYgIAkJMHg0MDAKKworI2RlZmluZSBTVk1fRVhJVF9FUlIJCS0xCisKKyNkZWZpbmUgU1ZNX0NSMF9TRUxFQ1RJVkVfTUFTSyAoMSA8PCAzIHwgMSkgLy8gVFMgYW5kIE1QCisKKyNkZWZpbmUgU1ZNX1ZNTE9BRCAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhkYSIKKyNkZWZpbmUgU1ZNX1ZNUlVOICAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhkOCIKKyNkZWZpbmUgU1ZNX1ZNU0FWRSAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhkYiIKKyNkZWZpbmUgU1ZNX0NMR0kgICAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhkZCIKKyNkZWZpbmUgU1ZNX1NUR0kgICAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhkYyIKKyNkZWZpbmUgU1ZNX0lOVkxQR0EgIi5ieXRlIDB4MGYsIDB4MDEsIDB4ZGYiCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2t2bS92bXguYyBiL2RyaXZlcnMva3ZtL3ZteC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjBiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2t2bS92bXguYwpAQCAtMCwwICsxLDIwMTQgQEAKKy8qCisgKiBLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBUaGlzIG1vZHVsZSBlbmFibGVzIG1hY2hpbmVzIHdpdGggSW50ZWwgVlQteCBleHRlbnNpb25zIHRvIHJ1biB2aXJ0dWFsCisgKiBtYWNoaW5lcyB3aXRob3V0IGVtdWxhdGlvbiBvciBiaW5hcnkgdHJhbnNsYXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFF1bXJhbmV0LCBJbmMuCisgKgorICogQXV0aG9yczoKKyAqICAgQXZpIEtpdml0eSAgIDxhdmlAcXVtcmFuZXQuY29tPgorICogICBZYW5pdiBLYW1heSAgPHlhbml2QHF1bXJhbmV0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKKyAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpbmNsdWRlICJrdm0uaCIKKyNpbmNsdWRlICJ2bXguaCIKKyNpbmNsdWRlICJrdm1fdm14LmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKworI2luY2x1ZGUgInNlZ21lbnRfZGVzY3JpcHRvci5oIgorCisjZGVmaW5lIE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTCAJCTB4MDNhCisKK01PRFVMRV9BVVRIT1IoIlF1bXJhbmV0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgdm1jcyAqLCB2bXhhcmVhKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgdm1jcyAqLCBjdXJyZW50X3ZtY3MpOworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorI2RlZmluZSBIT1NUX0lTXzY0IDEKKyNlbHNlCisjZGVmaW5lIEhPU1RfSVNfNjQgMAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgdm1jc19kZXNjcmlwdG9yIHsKKwlpbnQgc2l6ZTsKKwlpbnQgb3JkZXI7CisJdTMyIHJldmlzaW9uX2lkOworfSB2bWNzX2Rlc2NyaXB0b3I7CisKKyNkZWZpbmUgVk1YX1NFR01FTlRfRklFTEQoc2VnKQkJCQkJXAorCVtWQ1BVX1NSRUdfIyNzZWddID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkuc2VsZWN0b3IgPSBHVUVTVF8jI3NlZyMjX1NFTEVDVE9SLAkJXAorCQkuYmFzZSA9IEdVRVNUXyMjc2VnIyNfQkFTRSwJCSAgIAlcCisJCS5saW1pdCA9IEdVRVNUXyMjc2VnIyNfTElNSVQsCQkgICAJXAorCQkuYXJfYnl0ZXMgPSBHVUVTVF8jI3NlZyMjX0FSX0JZVEVTLAkgICAJXAorCX0KKworc3RhdGljIHN0cnVjdCBrdm1fdm14X3NlZ21lbnRfZmllbGQgeworCXVuc2lnbmVkIHNlbGVjdG9yOworCXVuc2lnbmVkIGJhc2U7CisJdW5zaWduZWQgbGltaXQ7CisJdW5zaWduZWQgYXJfYnl0ZXM7Cit9IGt2bV92bXhfc2VnbWVudF9maWVsZHNbXSA9IHsKKwlWTVhfU0VHTUVOVF9GSUVMRChDUyksCisJVk1YX1NFR01FTlRfRklFTEQoRFMpLAorCVZNWF9TRUdNRU5UX0ZJRUxEKEVTKSwKKwlWTVhfU0VHTUVOVF9GSUVMRChGUyksCisJVk1YX1NFR01FTlRfRklFTEQoR1MpLAorCVZNWF9TRUdNRU5UX0ZJRUxEKFNTKSwKKwlWTVhfU0VHTUVOVF9GSUVMRChUUiksCisJVk1YX1NFR01FTlRfRklFTEQoTERUUiksCit9OworCitzdGF0aWMgY29uc3QgdTMyIHZteF9tc3JfaW5kZXhbXSA9IHsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJTVNSX1NZU0NBTExfTUFTSywgTVNSX0xTVEFSLCBNU1JfQ1NUQVIsIE1TUl9LRVJORUxfR1NfQkFTRSwKKyNlbmRpZgorCU1TUl9FRkVSLCBNU1JfSzZfU1RBUiwKK307CisjZGVmaW5lIE5SX1ZNWF9NU1IgKHNpemVvZih2bXhfbXNyX2luZGV4KSAvIHNpemVvZigqdm14X21zcl9pbmRleCkpCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3BhZ2VfZmF1bHQodTMyIGludHJfaW5mbykKK3sKKwlyZXR1cm4gKGludHJfaW5mbyAmIChJTlRSX0lORk9fSU5UUl9UWVBFX01BU0sgfCBJTlRSX0lORk9fVkVDVE9SX01BU0sgfAorCQkJICAgICBJTlRSX0lORk9fVkFMSURfTUFTSykpID09CisJCShJTlRSX1RZUEVfRVhDRVBUSU9OIHwgUEZfVkVDVE9SIHwgSU5UUl9JTkZPX1ZBTElEX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19leHRlcm5hbF9pbnRlcnJ1cHQodTMyIGludHJfaW5mbykKK3sKKwlyZXR1cm4gKGludHJfaW5mbyAmIChJTlRSX0lORk9fSU5UUl9UWVBFX01BU0sgfCBJTlRSX0lORk9fVkFMSURfTUFTSykpCisJCT09IChJTlRSX1RZUEVfRVhUX0lOVFIgfCBJTlRSX0lORk9fVkFMSURfTUFTSyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm14X21zcl9lbnRyeSAqZmluZF9tc3JfZW50cnkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgbXNyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHZjcHUtPm5tc3JzOyArK2kpCisJCWlmICh2Y3B1LT5ndWVzdF9tc3JzW2ldLmluZGV4ID09IG1zcikKKwkJCXJldHVybiAmdmNwdS0+Z3Vlc3RfbXNyc1tpXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1jc19jbGVhcihzdHJ1Y3Qgdm1jcyAqdm1jcykKK3sKKwl1NjQgcGh5c19hZGRyID0gX19wYSh2bWNzKTsKKwl1OCBlcnJvcjsKKworCWFzbSB2b2xhdGlsZSAoQVNNX1ZNWF9WTUNMRUFSX1JBWCAiOyBzZXRuYSAlMCIKKwkJICAgICAgOiAiPWciKGVycm9yKSA6ICJhIigmcGh5c19hZGRyKSwgIm0iKHBoeXNfYWRkcikKKwkJICAgICAgOiAiY2MiLCAibWVtb3J5Iik7CisJaWYgKGVycm9yKQorCQlwcmludGsoS0VSTl9FUlIgImt2bTogdm1jbGVhciBmYWlsOiAlcC8lbGx4XG4iLAorCQkgICAgICAgdm1jcywgcGh5c19hZGRyKTsKK30KKworc3RhdGljIHZvaWQgX192Y3B1X2NsZWFyKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBhcmc7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICh2Y3B1LT5jcHUgPT0gY3B1KQorCQl2bWNzX2NsZWFyKHZjcHUtPnZtY3MpOworCWlmIChwZXJfY3B1KGN1cnJlbnRfdm1jcywgY3B1KSA9PSB2Y3B1LT52bWNzKQorCQlwZXJfY3B1KGN1cnJlbnRfdm1jcywgY3B1KSA9IE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZtY3NfcmVhZGwodW5zaWduZWQgbG9uZyBmaWVsZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJYXNtIHZvbGF0aWxlIChBU01fVk1YX1ZNUkVBRF9SRFhfUkFYCisJCSAgICAgIDogIj1hIih2YWx1ZSkgOiAiZCIoZmllbGQpIDogImNjIik7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdTE2IHZtY3NfcmVhZDE2KHVuc2lnbmVkIGxvbmcgZmllbGQpCit7CisJcmV0dXJuIHZtY3NfcmVhZGwoZmllbGQpOworfQorCitzdGF0aWMgdTMyIHZtY3NfcmVhZDMyKHVuc2lnbmVkIGxvbmcgZmllbGQpCit7CisJcmV0dXJuIHZtY3NfcmVhZGwoZmllbGQpOworfQorCitzdGF0aWMgdTY0IHZtY3NfcmVhZDY0KHVuc2lnbmVkIGxvbmcgZmllbGQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXJldHVybiB2bWNzX3JlYWRsKGZpZWxkKTsKKyNlbHNlCisJcmV0dXJuIHZtY3NfcmVhZGwoZmllbGQpIHwgKCh1NjQpdm1jc19yZWFkbChmaWVsZCsxKSA8PCAzMik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdm1jc193cml0ZWwodW5zaWduZWQgbG9uZyBmaWVsZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwl1OCBlcnJvcjsKKworCWFzbSB2b2xhdGlsZSAoQVNNX1ZNWF9WTVdSSVRFX1JBWF9SRFggIjsgc2V0bmEgJTAiCisJCSAgICAgICA6ICI9cSIoZXJyb3IpIDogImEiKHZhbHVlKSwgImQiKGZpZWxkKSA6ICJjYyIgKTsKKwlpZiAoZXJyb3IpCisJCXByaW50ayhLRVJOX0VSUiAidm13cml0ZSBlcnJvcjogcmVnICVseCB2YWx1ZSAlbHggKGVyciAlZClcbiIsCisJCSAgICAgICBmaWVsZCwgdmFsdWUsIHZtY3NfcmVhZDMyKFZNX0lOU1RSVUNUSU9OX0VSUk9SKSk7Cit9CisKK3N0YXRpYyB2b2lkIHZtY3Nfd3JpdGUxNih1bnNpZ25lZCBsb25nIGZpZWxkLCB1MTYgdmFsdWUpCit7CisJdm1jc193cml0ZWwoZmllbGQsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgdm1jc193cml0ZTMyKHVuc2lnbmVkIGxvbmcgZmllbGQsIHUzMiB2YWx1ZSkKK3sKKwl2bWNzX3dyaXRlbChmaWVsZCwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCB2bWNzX3dyaXRlNjQodW5zaWduZWQgbG9uZyBmaWVsZCwgdTY0IHZhbHVlKQoreworI2lmZGVmIENPTkZJR19YODZfNjQKKwl2bWNzX3dyaXRlbChmaWVsZCwgdmFsdWUpOworI2Vsc2UKKwl2bWNzX3dyaXRlbChmaWVsZCwgdmFsdWUpOworCWFzbSB2b2xhdGlsZSAoIiIpOworCXZtY3Nfd3JpdGVsKGZpZWxkKzEsIHZhbHVlID4+IDMyKTsKKyNlbmRpZgorfQorCisvKgorICogU3dpdGNoZXMgdG8gc3BlY2lmaWVkIHZjcHUsIHVudGlsIGEgbWF0Y2hpbmcgdmNwdV9wdXQoKSwgYnV0IGFzc3VtZXMKKyAqIHZjcHUgbXV0ZXggaXMgYWxyZWFkeSB0YWtlbi4KKyAqLworc3RhdGljIHN0cnVjdCBrdm1fdmNwdSAqdm14X3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdTY0IHBoeXNfYWRkciA9IF9fcGEodmNwdS0+dm1jcyk7CisJaW50IGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKworCWlmICh2Y3B1LT5jcHUgIT0gY3B1KSB7CisJCXNtcF9jYWxsX2Z1bmN0aW9uKF9fdmNwdV9jbGVhciwgdmNwdSwgMCwgMSk7CisJCXZjcHUtPmxhdW5jaGVkID0gMDsKKwl9CisKKwlpZiAocGVyX2NwdShjdXJyZW50X3ZtY3MsIGNwdSkgIT0gdmNwdS0+dm1jcykgeworCQl1OCBlcnJvcjsKKworCQlwZXJfY3B1KGN1cnJlbnRfdm1jcywgY3B1KSA9IHZjcHUtPnZtY3M7CisJCWFzbSB2b2xhdGlsZSAoQVNNX1ZNWF9WTVBUUkxEX1JBWCAiOyBzZXRuYSAlMCIKKwkJCSAgICAgIDogIj1nIihlcnJvcikgOiAiYSIoJnBoeXNfYWRkciksICJtIihwaHlzX2FkZHIpCisJCQkgICAgICA6ICJjYyIpOworCQlpZiAoZXJyb3IpCisJCQlwcmludGsoS0VSTl9FUlIgImt2bTogdm1wdHJsZCAlcC8lbGx4IGZhaWxcbiIsCisJCQkgICAgICAgdmNwdS0+dm1jcywgcGh5c19hZGRyKTsKKwl9CisKKwlpZiAodmNwdS0+Y3B1ICE9IGNwdSkgeworCQlzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSBkdDsKKwkJdW5zaWduZWQgbG9uZyBzeXNlbnRlcl9lc3A7CisKKwkJdmNwdS0+Y3B1ID0gY3B1OworCQkvKgorCQkgKiBMaW51eCB1c2VzIHBlci1jcHUgVFNTIGFuZCBHRFQsIHNvIHNldCB0aGVzZSB3aGVuIHN3aXRjaGluZworCQkgKiBwcm9jZXNzb3JzLgorCQkgKi8KKwkJdm1jc193cml0ZWwoSE9TVF9UUl9CQVNFLCByZWFkX3RyX2Jhc2UoKSk7IC8qIDIyLjIuNCAqLworCQlnZXRfZ2R0KCZkdCk7CisJCXZtY3Nfd3JpdGVsKEhPU1RfR0RUUl9CQVNFLCBkdC5iYXNlKTsgICAvKiAyMi4yLjQgKi8KKworCQlyZG1zcmwoTVNSX0lBMzJfU1lTRU5URVJfRVNQLCBzeXNlbnRlcl9lc3ApOworCQl2bWNzX3dyaXRlbChIT1NUX0lBMzJfU1lTRU5URVJfRVNQLCBzeXNlbnRlcl9lc3ApOyAvKiAyMi4yLjMgKi8KKwl9CisJcmV0dXJuIHZjcHU7Cit9CisKK3N0YXRpYyB2b2lkIHZteF92Y3B1X3B1dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcHV0X2NwdSgpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bXhfZ2V0X3JmbGFncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZtY3NfcmVhZGwoR1VFU1RfUkZMQUdTKTsKK30KKworc3RhdGljIHZvaWQgdm14X3NldF9yZmxhZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIHJmbGFncykKK3sKKwl2bWNzX3dyaXRlbChHVUVTVF9SRkxBR1MsIHJmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXVuc2lnbmVkIGxvbmcgcmlwOworCXUzMiBpbnRlcnJ1cHRpYmlsaXR5OworCisJcmlwID0gdm1jc19yZWFkbChHVUVTVF9SSVApOworCXJpcCArPSB2bWNzX3JlYWQzMihWTV9FWElUX0lOU1RSVUNUSU9OX0xFTik7CisJdm1jc193cml0ZWwoR1VFU1RfUklQLCByaXApOworCisJLyoKKwkgKiBXZSBlbXVsYXRlZCBhbiBpbnN0cnVjdGlvbiwgc28gdGVtcG9yYXJ5IGludGVycnVwdCBibG9ja2luZworCSAqIHNob3VsZCBiZSByZW1vdmVkLCBpZiBzZXQuCisJICovCisJaW50ZXJydXB0aWJpbGl0eSA9IHZtY3NfcmVhZDMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTyk7CisJaWYgKGludGVycnVwdGliaWxpdHkgJiAzKQorCQl2bWNzX3dyaXRlMzIoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLAorCQkJICAgICBpbnRlcnJ1cHRpYmlsaXR5ICYgfjMpOworfQorCitzdGF0aWMgdm9pZCB2bXhfaW5qZWN0X2dwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgZXJyb3JfY29kZSkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiaW5qZWN0X2dlbmVyYWxfcHJvdGVjdGlvbjogcmlwIDB4JWx4XG4iLAorCSAgICAgICB2bWNzX3JlYWRsKEdVRVNUX1JJUCkpOworCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9FWENFUFRJT05fRVJST1JfQ09ERSwgZXJyb3JfY29kZSk7CisJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKKwkJICAgICBHUF9WRUNUT1IgfAorCQkgICAgIElOVFJfVFlQRV9FWENFUFRJT04gfAorCQkgICAgIElOVFJfSU5GT19ERUxJRVZFUl9DT0RFX01BU0sgfAorCQkgICAgIElOVFJfSU5GT19WQUxJRF9NQVNLKTsKK30KKworLyoKKyAqIHJlYWRzIGFuZCByZXR1cm5zIGd1ZXN0J3MgdGltZXN0YW1wIGNvdW50ZXIgInJlZ2lzdGVyIgorICogZ3Vlc3RfdHNjID0gaG9zdF90c2MgKyB0c2Nfb2Zmc2V0ICAgIC0tIDIxLjMKKyAqLworc3RhdGljIHU2NCBndWVzdF9yZWFkX3RzYyh2b2lkKQoreworCXU2NCBob3N0X3RzYywgdHNjX29mZnNldDsKKworCXJkdHNjbGwoaG9zdF90c2MpOworCXRzY19vZmZzZXQgPSB2bWNzX3JlYWQ2NChUU0NfT0ZGU0VUKTsKKwlyZXR1cm4gaG9zdF90c2MgKyB0c2Nfb2Zmc2V0OworfQorCisvKgorICogd3JpdGVzICdndWVzdF90c2MnIGludG8gZ3Vlc3QncyB0aW1lc3RhbXAgY291bnRlciAicmVnaXN0ZXIiCisgKiBndWVzdF90c2MgPSBob3N0X3RzYyArIHRzY19vZmZzZXQgPT0+IHRzY19vZmZzZXQgPSBndWVzdF90c2MgLSBob3N0X3RzYworICovCitzdGF0aWMgdm9pZCBndWVzdF93cml0ZV90c2ModTY0IGd1ZXN0X3RzYykKK3sKKwl1NjQgaG9zdF90c2M7CisKKwlyZHRzY2xsKGhvc3RfdHNjKTsKKwl2bWNzX3dyaXRlNjQoVFNDX09GRlNFVCwgZ3Vlc3RfdHNjIC0gaG9zdF90c2MpOworfQorCitzdGF0aWMgdm9pZCByZWxvYWRfdHNzKHZvaWQpCit7CisjaWZuZGVmIENPTkZJR19YODZfNjQKKworCS8qCisJICogVlQgcmVzdG9yZXMgVFIgYnV0IG5vdCBpdHMgc2l6ZS4gIFVzZWxlc3MuCisJICovCisJc3RydWN0IGRlc2NyaXB0b3JfdGFibGUgZ2R0OworCXN0cnVjdCBzZWdtZW50X2Rlc2NyaXB0b3IgKmRlc2NzOworCisJZ2V0X2dkdCgmZ2R0KTsKKwlkZXNjcyA9ICh2b2lkICopZ2R0LmJhc2U7CisJZGVzY3NbR0RUX0VOVFJZX1RTU10udHlwZSA9IDk7IC8qIGF2YWlsYWJsZSBUU1MgKi8KKwlsb2FkX1RSX2Rlc2MoKTsKKyNlbmRpZgorfQorCisvKgorICogUmVhZHMgYW4gbXNyIHZhbHVlIChvZiAnbXNyX2luZGV4JykgaW50byAncGRhdGEnLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi0wIG90aGVyd2lzZS4KKyAqIEFzc3VtZXMgdmNwdV9sb2FkKCkgd2FzIGFscmVhZHkgY2FsbGVkLgorICovCitzdGF0aWMgaW50IHZteF9nZXRfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIG1zcl9pbmRleCwgdTY0ICpwZGF0YSkKK3sKKwl1NjQgZGF0YTsKKwlzdHJ1Y3Qgdm14X21zcl9lbnRyeSAqbXNyOworCisJaWYgKCFwZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgIkJVRzogZ2V0X21zciBjYWxsZWQgd2l0aCBOVUxMIHBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChtc3JfaW5kZXgpIHsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJY2FzZSBNU1JfRlNfQkFTRToKKwkJZGF0YSA9IHZtY3NfcmVhZGwoR1VFU1RfRlNfQkFTRSk7CisJCWJyZWFrOworCWNhc2UgTVNSX0dTX0JBU0U6CisJCWRhdGEgPSB2bWNzX3JlYWRsKEdVRVNUX0dTX0JBU0UpOworCQlicmVhazsKKwljYXNlIE1TUl9FRkVSOgorCQlkYXRhID0gdmNwdS0+c2hhZG93X2VmZXI7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBNU1JfSUEzMl9USU1FX1NUQU1QX0NPVU5URVI6CisJCWRhdGEgPSBndWVzdF9yZWFkX3RzYygpOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0NTOgorCQlkYXRhID0gdm1jc19yZWFkMzIoR1VFU1RfU1lTRU5URVJfQ1MpOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VJUDoKKwkJZGF0YSA9IHZtY3NfcmVhZDMyKEdVRVNUX1NZU0VOVEVSX0VJUCk7CisJCWJyZWFrOworCWNhc2UgTVNSX0lBMzJfU1lTRU5URVJfRVNQOgorCQlkYXRhID0gdm1jc19yZWFkMzIoR1VFU1RfU1lTRU5URVJfRVNQKTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9NQzBfQ1RMOgorCWNhc2UgTVNSX0lBMzJfTUNHX1NUQVRVUzoKKwljYXNlIE1TUl9JQTMyX01DR19DQVA6CisJY2FzZSBNU1JfSUEzMl9NQzBfTUlTQzoKKwljYXNlIE1TUl9JQTMyX01DMF9NSVNDKzQ6CisJY2FzZSBNU1JfSUEzMl9NQzBfTUlTQys4OgorCWNhc2UgTVNSX0lBMzJfTUMwX01JU0MrMTI6CisJY2FzZSBNU1JfSUEzMl9NQzBfTUlTQysxNjoKKwljYXNlIE1TUl9JQTMyX1VDT0RFX1JFVjoKKwkJLyogTVRSUiByZWdpc3RlcnMgKi8KKwljYXNlIDB4ZmU6CisJY2FzZSAweDIwMCAuLi4gMHgyZmY6CisJCWRhdGEgPSAwOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX0FQSUNCQVNFOgorCQlkYXRhID0gdmNwdS0+YXBpY19iYXNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltc3IgPSBmaW5kX21zcl9lbnRyeSh2Y3B1LCBtc3JfaW5kZXgpOworCQlpZiAoIW1zcikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJrdm06IHVuaGFuZGxlZCByZG1zcjogJXhcbiIsIG1zcl9pbmRleCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYXRhID0gbXNyLT5kYXRhOworCQlicmVhazsKKwl9CisKKwkqcGRhdGEgPSBkYXRhOworCXJldHVybiAwOworfQorCisvKgorICogV3JpdGVzIG1zciB2YWx1ZSBpbnRvIGludG8gdGhlIGFwcHJvcHJpYXRlICJyZWdpc3RlciIuCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgbm9uLTAgb3RoZXJ3aXNlLgorICogQXNzdW1lcyB2Y3B1X2xvYWQoKSB3YXMgYWxyZWFkeSBjYWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgdm14X3NldF9tc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgbXNyX2luZGV4LCB1NjQgZGF0YSkKK3sKKwlzdHJ1Y3Qgdm14X21zcl9lbnRyeSAqbXNyOworCXN3aXRjaCAobXNyX2luZGV4KSB7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCWNhc2UgTVNSX0ZTX0JBU0U6CisJCXZtY3Nfd3JpdGVsKEdVRVNUX0ZTX0JBU0UsIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1TUl9HU19CQVNFOgorCQl2bWNzX3dyaXRlbChHVUVTVF9HU19CQVNFLCBkYXRhKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0NTOgorCQl2bWNzX3dyaXRlMzIoR1VFU1RfU1lTRU5URVJfQ1MsIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VJUDoKKwkJdm1jc193cml0ZTMyKEdVRVNUX1NZU0VOVEVSX0VJUCwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTVNSX0lBMzJfU1lTRU5URVJfRVNQOgorCQl2bWNzX3dyaXRlMzIoR1VFU1RfU1lTRU5URVJfRVNQLCBkYXRhKTsKKwkJYnJlYWs7CisjaWZkZWYgX194ODZfNjQKKwljYXNlIE1TUl9FRkVSOgorCQlzZXRfZWZlcih2Y3B1LCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNU1JfSUEzMl9NQzBfU1RBVFVTOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTVNSX0lBMzJfTUMwX1NUQVRVUyAweCVsbHgsIG5vcFxuIgorCQkJICAgICwgX19GVU5DVElPTl9fLCBkYXRhKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIE1TUl9JQTMyX1RJTUVfU1RBTVBfQ09VTlRFUjogeworCQlndWVzdF93cml0ZV90c2MoZGF0YSk7CisJCWJyZWFrOworCX0KKwljYXNlIE1TUl9JQTMyX1VDT0RFX1JFVjoKKwljYXNlIE1TUl9JQTMyX1VDT0RFX1dSSVRFOgorCWNhc2UgMHgyMDAgLi4uIDB4MmZmOiAvKiBNVFJScyAqLworCQlicmVhazsKKwljYXNlIE1TUl9JQTMyX0FQSUNCQVNFOgorCQl2Y3B1LT5hcGljX2Jhc2UgPSBkYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltc3IgPSBmaW5kX21zcl9lbnRyeSh2Y3B1LCBtc3JfaW5kZXgpOworCQlpZiAoIW1zcikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJrdm06IHVuaGFuZGxlZCB3cm1zcjogMHgleFxuIiwgbXNyX2luZGV4KTsKKwkJCXJldHVybiAxOworCQl9CisJCW1zci0+ZGF0YSA9IGRhdGE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogU3luYyB0aGUgcnNwIGFuZCByaXAgcmVnaXN0ZXJzIGludG8gdGhlIHZjcHUgc3RydWN0dXJlLiAgVGhpcyBhbGxvd3MKKyAqIHJlZ2lzdGVycyB0byBiZSBhY2Nlc3NlZCBieSBpbmRleGluZyB2Y3B1LT5yZWdzLgorICovCitzdGF0aWMgdm9pZCB2Y3B1X2xvYWRfcnNwX3JpcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUlNQXSA9IHZtY3NfcmVhZGwoR1VFU1RfUlNQKTsKKwl2Y3B1LT5yaXAgPSB2bWNzX3JlYWRsKEdVRVNUX1JJUCk7Cit9CisKKy8qCisgKiBTeW5jcyByc3AgYW5kIHJpcCBiYWNrIGludG8gdGhlIHZtY3MuICBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIHBvc3NpYmxlCisgKiBtb2RpZmljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHZjcHVfcHV0X3JzcF9yaXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZtY3Nfd3JpdGVsKEdVRVNUX1JTUCwgdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUlNQXSk7CisJdm1jc193cml0ZWwoR1VFU1RfUklQLCB2Y3B1LT5yaXApOworfQorCitzdGF0aWMgaW50IHNldF9ndWVzdF9kZWJ1ZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QgKmRiZykKK3sKKwl1bnNpZ25lZCBsb25nIGRyNyA9IDB4NDAwOworCXUzMiBleGNlcHRpb25fYml0bWFwOworCWludCBvbGRfc2luZ2xlc3RlcDsKKworCWV4Y2VwdGlvbl9iaXRtYXAgPSB2bWNzX3JlYWQzMihFWENFUFRJT05fQklUTUFQKTsKKwlvbGRfc2luZ2xlc3RlcCA9IHZjcHUtPmd1ZXN0X2RlYnVnLnNpbmdsZXN0ZXA7CisKKwl2Y3B1LT5ndWVzdF9kZWJ1Zy5lbmFibGVkID0gZGJnLT5lbmFibGVkOworCWlmICh2Y3B1LT5ndWVzdF9kZWJ1Zy5lbmFibGVkKSB7CisJCWludCBpOworCisJCWRyNyB8PSAweDIwMDsgIC8qIGV4YWN0ICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKwkJCWlmICghZGJnLT5icmVha3BvaW50c1tpXS5lbmFibGVkKQorCQkJCWNvbnRpbnVlOworCQkJdmNwdS0+Z3Vlc3RfZGVidWcuYnBbaV0gPSBkYmctPmJyZWFrcG9pbnRzW2ldLmFkZHJlc3M7CisJCQlkcjcgfD0gMiA8PCAoaSoyKTsgICAgLyogZ2xvYmFsIGVuYWJsZSAqLworCQkJZHI3IHw9IDAgPDwgKGkqNCsxNik7IC8qIGV4ZWN1dGlvbiBicmVha3BvaW50ICovCisJCX0KKworCQlleGNlcHRpb25fYml0bWFwIHw9ICgxdSA8PCAxKTsgIC8qIFRyYXAgZGVidWcgZXhjZXB0aW9ucyAqLworCisJCXZjcHUtPmd1ZXN0X2RlYnVnLnNpbmdsZXN0ZXAgPSBkYmctPnNpbmdsZXN0ZXA7CisJfSBlbHNlIHsKKwkJZXhjZXB0aW9uX2JpdG1hcCAmPSB+KDF1IDw8IDEpOyAvKiBJZ25vcmUgZGVidWcgZXhjZXB0aW9ucyAqLworCQl2Y3B1LT5ndWVzdF9kZWJ1Zy5zaW5nbGVzdGVwID0gMDsKKwl9CisKKwlpZiAob2xkX3NpbmdsZXN0ZXAgJiYgIXZjcHUtPmd1ZXN0X2RlYnVnLnNpbmdsZXN0ZXApIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlmbGFncyA9IHZtY3NfcmVhZGwoR1VFU1RfUkZMQUdTKTsKKwkJZmxhZ3MgJj0gfihYODZfRUZMQUdTX1RGIHwgWDg2X0VGTEFHU19SRik7CisJCXZtY3Nfd3JpdGVsKEdVRVNUX1JGTEFHUywgZmxhZ3MpOworCX0KKworCXZtY3Nfd3JpdGUzMihFWENFUFRJT05fQklUTUFQLCBleGNlcHRpb25fYml0bWFwKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9EUjcsIGRyNyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgY3B1X2hhc19rdm1fc3VwcG9ydCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZWN4ID0gY3B1aWRfZWN4KDEpOworCXJldHVybiB0ZXN0X2JpdCg1LCAmZWN4KTsgLyogQ1BVSUQuMTpFQ1guVk1YW2JpdCA1XSAtPiBWVCAqLworfQorCitzdGF0aWMgX19pbml0IGludCB2bXhfZGlzYWJsZWRfYnlfYmlvcyh2b2lkKQoreworCXU2NCBtc3I7CisKKwlyZG1zcmwoTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MLCBtc3IpOworCXJldHVybiAobXNyICYgNSkgPT0gMTsgLyogbG9ja2VkIGJ1dCBub3QgZW5hYmxlZCAqLworfQorCitzdGF0aWMgX19pbml0IHZvaWQgaGFyZHdhcmVfZW5hYmxlKHZvaWQgKmdhcmJhZ2UpCit7CisJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJdTY0IHBoeXNfYWRkciA9IF9fcGEocGVyX2NwdSh2bXhhcmVhLCBjcHUpKTsKKwl1NjQgb2xkOworCisJcmRtc3JsKE1TUl9JQTMyX0ZFQVRVUkVfQ09OVFJPTCwgb2xkKTsKKwlpZiAoKG9sZCAmIDUpICE9IDUpCisJCS8qIGVuYWJsZSBhbmQgbG9jayAqLworCQl3cm1zcmwoTVNSX0lBMzJfRkVBVFVSRV9DT05UUk9MLCBvbGQgfCA1KTsKKwl3cml0ZV9jcjQocmVhZF9jcjQoKSB8IENSNF9WTVhFKTsgLyogRklYTUU6IG5vdCBjcHUgaG90cGx1ZyBzYWZlICovCisJYXNtIHZvbGF0aWxlIChBU01fVk1YX1ZNWE9OX1JBWCA6IDogImEiKCZwaHlzX2FkZHIpLCAibSIocGh5c19hZGRyKQorCQkgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKK30KKworc3RhdGljIHZvaWQgaGFyZHdhcmVfZGlzYWJsZSh2b2lkICpnYXJiYWdlKQoreworCWFzbSB2b2xhdGlsZSAoQVNNX1ZNWF9WTVhPRkYgOiA6IDogImNjIik7Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCBzZXR1cF92bWNzX2Rlc2NyaXB0b3Iodm9pZCkKK3sKKwl1MzIgdm14X21zcl9sb3csIHZteF9tc3JfaGlnaDsKKworCXJkbXNyKE1TUl9JQTMyX1ZNWF9CQVNJQ19NU1IsIHZteF9tc3JfbG93LCB2bXhfbXNyX2hpZ2gpOworCXZtY3NfZGVzY3JpcHRvci5zaXplID0gdm14X21zcl9oaWdoICYgMHgxZmZmOworCXZtY3NfZGVzY3JpcHRvci5vcmRlciA9IGdldF9vcmRlcih2bWNzX2Rlc2NyaXB0b3Iuc2l6ZSk7CisJdm1jc19kZXNjcmlwdG9yLnJldmlzaW9uX2lkID0gdm14X21zcl9sb3c7Cit9OworCitzdGF0aWMgc3RydWN0IHZtY3MgKmFsbG9jX3ZtY3NfY3B1KGludCBjcHUpCit7CisJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOworCXN0cnVjdCBwYWdlICpwYWdlczsKKwlzdHJ1Y3Qgdm1jcyAqdm1jczsKKworCXBhZ2VzID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBHRlBfS0VSTkVMLCB2bWNzX2Rlc2NyaXB0b3Iub3JkZXIpOworCWlmICghcGFnZXMpCisJCXJldHVybiBOVUxMOworCXZtY3MgPSBwYWdlX2FkZHJlc3MocGFnZXMpOworCW1lbXNldCh2bWNzLCAwLCB2bWNzX2Rlc2NyaXB0b3Iuc2l6ZSk7CisJdm1jcy0+cmV2aXNpb25faWQgPSB2bWNzX2Rlc2NyaXB0b3IucmV2aXNpb25faWQ7IC8qIHZtY3MgcmV2aXNpb24gaWQgKi8KKwlyZXR1cm4gdm1jczsKK30KKworc3RhdGljIHN0cnVjdCB2bWNzICphbGxvY192bWNzKHZvaWQpCit7CisJcmV0dXJuIGFsbG9jX3ZtY3NfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdm1jcyhzdHJ1Y3Qgdm1jcyAqdm1jcykKK3sKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZtY3MsIHZtY3NfZGVzY3JpcHRvci5vcmRlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBmcmVlX2t2bV9hcmVhKHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlmcmVlX3ZtY3MocGVyX2NwdSh2bXhhcmVhLCBjcHUpKTsKK30KKworZXh0ZXJuIHN0cnVjdCB2bWNzICphbGxvY192bWNzX2NwdShpbnQgY3B1KTsKKworc3RhdGljIF9faW5pdCBpbnQgYWxsb2Nfa3ZtX2FyZWEodm9pZCkKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc3RydWN0IHZtY3MgKnZtY3M7CisKKwkJdm1jcyA9IGFsbG9jX3ZtY3NfY3B1KGNwdSk7CisJCWlmICghdm1jcykgeworCQkJZnJlZV9rdm1fYXJlYSgpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlwZXJfY3B1KHZteGFyZWEsIGNwdSkgPSB2bWNzOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgaGFyZHdhcmVfc2V0dXAodm9pZCkKK3sKKwlzZXR1cF92bWNzX2Rlc2NyaXB0b3IoKTsKKwlyZXR1cm4gYWxsb2Nfa3ZtX2FyZWEoKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGhhcmR3YXJlX3Vuc2V0dXAodm9pZCkKK3sKKwlmcmVlX2t2bV9hcmVhKCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9leGNlcHRpb25fYml0bWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAodmNwdS0+cm1vZGUuYWN0aXZlKQorCQl2bWNzX3dyaXRlMzIoRVhDRVBUSU9OX0JJVE1BUCwgfjApOworCWVsc2UKKwkJdm1jc193cml0ZTMyKEVYQ0VQVElPTl9CSVRNQVAsIDEgPDwgUEZfVkVDVE9SKTsKK30KKworc3RhdGljIHZvaWQgZml4X3Btb2RlX2RhdGFzZWcoaW50IHNlZywgc3RydWN0IGt2bV9zYXZlX3NlZ21lbnQgKnNhdmUpCit7CisJc3RydWN0IGt2bV92bXhfc2VnbWVudF9maWVsZCAqc2YgPSAma3ZtX3ZteF9zZWdtZW50X2ZpZWxkc1tzZWddOworCisJaWYgKHZtY3NfcmVhZGwoc2YtPmJhc2UpID09IHNhdmUtPmJhc2UpIHsKKwkJdm1jc193cml0ZTE2KHNmLT5zZWxlY3Rvciwgc2F2ZS0+c2VsZWN0b3IpOworCQl2bWNzX3dyaXRlbChzZi0+YmFzZSwgc2F2ZS0+YmFzZSk7CisJCXZtY3Nfd3JpdGUzMihzZi0+bGltaXQsIHNhdmUtPmxpbWl0KTsKKwkJdm1jc193cml0ZTMyKHNmLT5hcl9ieXRlcywgc2F2ZS0+YXIpOworCX0gZWxzZSB7CisJCXUzMiBkcGwgPSAodm1jc19yZWFkMTYoc2YtPnNlbGVjdG9yKSAmIFNFTEVDVE9SX1JQTF9NQVNLKQorCQkJPDwgQVJfRFBMX1NISUZUOworCQl2bWNzX3dyaXRlMzIoc2YtPmFyX2J5dGVzLCAweDkzIHwgZHBsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVudGVyX3Btb2RlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdmNwdS0+cm1vZGUuYWN0aXZlID0gMDsKKworCXZtY3Nfd3JpdGVsKEdVRVNUX1RSX0JBU0UsIHZjcHUtPnJtb2RlLnRyLmJhc2UpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9UUl9MSU1JVCwgdmNwdS0+cm1vZGUudHIubGltaXQpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9UUl9BUl9CWVRFUywgdmNwdS0+cm1vZGUudHIuYXIpOworCisJZmxhZ3MgPSB2bWNzX3JlYWRsKEdVRVNUX1JGTEFHUyk7CisJZmxhZ3MgJj0gfihJT1BMX01BU0sgfCBYODZfRUZMQUdTX1ZNKTsKKwlmbGFncyB8PSAodmNwdS0+cm1vZGUuc2F2ZV9pb3BsIDw8IElPUExfU0hJRlQpOworCXZtY3Nfd3JpdGVsKEdVRVNUX1JGTEFHUywgZmxhZ3MpOworCisJdm1jc193cml0ZWwoR1VFU1RfQ1I0LCAodm1jc19yZWFkbChHVUVTVF9DUjQpICYgfkNSNF9WTUVfTUFTSykgfAorCQkJKHZtY3NfcmVhZGwoQ1I0X1JFQURfU0hBRE9XKSAmIENSNF9WTUVfTUFTSykpOworCisJdXBkYXRlX2V4Y2VwdGlvbl9iaXRtYXAodmNwdSk7CisKKwlmaXhfcG1vZGVfZGF0YXNlZyhWQ1BVX1NSRUdfRVMsICZ2Y3B1LT5ybW9kZS5lcyk7CisJZml4X3Btb2RlX2RhdGFzZWcoVkNQVV9TUkVHX0RTLCAmdmNwdS0+cm1vZGUuZHMpOworCWZpeF9wbW9kZV9kYXRhc2VnKFZDUFVfU1JFR19HUywgJnZjcHUtPnJtb2RlLmdzKTsKKwlmaXhfcG1vZGVfZGF0YXNlZyhWQ1BVX1NSRUdfRlMsICZ2Y3B1LT5ybW9kZS5mcyk7CisKKwl2bWNzX3dyaXRlMTYoR1VFU1RfU1NfU0VMRUNUT1IsIDApOworCXZtY3Nfd3JpdGUzMihHVUVTVF9TU19BUl9CWVRFUywgMHg5Myk7CisKKwl2bWNzX3dyaXRlMTYoR1VFU1RfQ1NfU0VMRUNUT1IsCisJCSAgICAgdm1jc19yZWFkMTYoR1VFU1RfQ1NfU0VMRUNUT1IpICYgflNFTEVDVE9SX1JQTF9NQVNLKTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfQ1NfQVJfQllURVMsIDB4OWIpOworfQorCitzdGF0aWMgaW50IHJtb2RlX3Rzc19iYXNlKHN0cnVjdCBrdm0qIGt2bSkKK3sKKwlnZm5fdCBiYXNlX2dmbiA9IGt2bS0+bWVtc2xvdHNbMF0uYmFzZV9nZm4gKyBrdm0tPm1lbXNsb3RzWzBdLm5wYWdlcyAtIDM7CisJcmV0dXJuIGJhc2VfZ2ZuIDw8IFBBR0VfU0hJRlQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpeF9ybW9kZV9zZWcoaW50IHNlZywgc3RydWN0IGt2bV9zYXZlX3NlZ21lbnQgKnNhdmUpCit7CisJc3RydWN0IGt2bV92bXhfc2VnbWVudF9maWVsZCAqc2YgPSAma3ZtX3ZteF9zZWdtZW50X2ZpZWxkc1tzZWddOworCisJc2F2ZS0+c2VsZWN0b3IgPSB2bWNzX3JlYWQxNihzZi0+c2VsZWN0b3IpOworCXNhdmUtPmJhc2UgPSB2bWNzX3JlYWRsKHNmLT5iYXNlKTsKKwlzYXZlLT5saW1pdCA9IHZtY3NfcmVhZDMyKHNmLT5saW1pdCk7CisJc2F2ZS0+YXIgPSB2bWNzX3JlYWQzMihzZi0+YXJfYnl0ZXMpOworCXZtY3Nfd3JpdGUxNihzZi0+c2VsZWN0b3IsIHZtY3NfcmVhZGwoc2YtPmJhc2UpID4+IDQpOworCXZtY3Nfd3JpdGUzMihzZi0+bGltaXQsIDB4ZmZmZik7CisJdm1jc193cml0ZTMyKHNmLT5hcl9ieXRlcywgMHhmMyk7Cit9CisKK3N0YXRpYyB2b2lkIGVudGVyX3Jtb2RlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdmNwdS0+cm1vZGUuYWN0aXZlID0gMTsKKworCXZjcHUtPnJtb2RlLnRyLmJhc2UgPSB2bWNzX3JlYWRsKEdVRVNUX1RSX0JBU0UpOworCXZtY3Nfd3JpdGVsKEdVRVNUX1RSX0JBU0UsIHJtb2RlX3Rzc19iYXNlKHZjcHUtPmt2bSkpOworCisJdmNwdS0+cm1vZGUudHIubGltaXQgPSB2bWNzX3JlYWQzMihHVUVTVF9UUl9MSU1JVCk7CisJdm1jc193cml0ZTMyKEdVRVNUX1RSX0xJTUlULCBSTU9ERV9UU1NfU0laRSAtIDEpOworCisJdmNwdS0+cm1vZGUudHIuYXIgPSB2bWNzX3JlYWQzMihHVUVTVF9UUl9BUl9CWVRFUyk7CisJdm1jc193cml0ZTMyKEdVRVNUX1RSX0FSX0JZVEVTLCAweDAwOGIpOworCisJZmxhZ3MgPSB2bWNzX3JlYWRsKEdVRVNUX1JGTEFHUyk7CisJdmNwdS0+cm1vZGUuc2F2ZV9pb3BsID0gKGZsYWdzICYgSU9QTF9NQVNLKSA+PiBJT1BMX1NISUZUOworCisJZmxhZ3MgfD0gSU9QTF9NQVNLIHwgWDg2X0VGTEFHU19WTTsKKworCXZtY3Nfd3JpdGVsKEdVRVNUX1JGTEFHUywgZmxhZ3MpOworCXZtY3Nfd3JpdGVsKEdVRVNUX0NSNCwgdm1jc19yZWFkbChHVUVTVF9DUjQpIHwgQ1I0X1ZNRV9NQVNLKTsKKwl1cGRhdGVfZXhjZXB0aW9uX2JpdG1hcCh2Y3B1KTsKKworCXZtY3Nfd3JpdGUxNihHVUVTVF9TU19TRUxFQ1RPUiwgdm1jc19yZWFkbChHVUVTVF9TU19CQVNFKSA+PiA0KTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfU1NfTElNSVQsIDB4ZmZmZik7CisJdm1jc193cml0ZTMyKEdVRVNUX1NTX0FSX0JZVEVTLCAweGYzKTsKKworCXZtY3Nfd3JpdGUzMihHVUVTVF9DU19BUl9CWVRFUywgMHhmMyk7CisJdm1jc193cml0ZTE2KEdVRVNUX0NTX1NFTEVDVE9SLCB2bWNzX3JlYWRsKEdVRVNUX0NTX0JBU0UpID4+IDQpOworCisJZml4X3Jtb2RlX3NlZyhWQ1BVX1NSRUdfRVMsICZ2Y3B1LT5ybW9kZS5lcyk7CisJZml4X3Jtb2RlX3NlZyhWQ1BVX1NSRUdfRFMsICZ2Y3B1LT5ybW9kZS5kcyk7CisJZml4X3Jtb2RlX3NlZyhWQ1BVX1NSRUdfR1MsICZ2Y3B1LT5ybW9kZS5ncyk7CisJZml4X3Jtb2RlX3NlZyhWQ1BVX1NSRUdfRlMsICZ2Y3B1LT5ybW9kZS5mcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisKK3N0YXRpYyB2b2lkIGVudGVyX2xtb2RlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1MzIgZ3Vlc3RfdHJfYXI7CisKKwlndWVzdF90cl9hciA9IHZtY3NfcmVhZDMyKEdVRVNUX1RSX0FSX0JZVEVTKTsKKwlpZiAoKGd1ZXN0X3RyX2FyICYgQVJfVFlQRV9NQVNLKSAhPSBBUl9UWVBFX0JVU1lfNjRfVFNTKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHNzIGZpeHVwIGZvciBsb25nIG1vZGUuIFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXZtY3Nfd3JpdGUzMihHVUVTVF9UUl9BUl9CWVRFUywKKwkJCSAgICAgKGd1ZXN0X3RyX2FyICYgfkFSX1RZUEVfTUFTSykKKwkJCSAgICAgfCBBUl9UWVBFX0JVU1lfNjRfVFNTKTsKKwl9CisKKwl2Y3B1LT5zaGFkb3dfZWZlciB8PSBFRkVSX0xNQTsKKworCWZpbmRfbXNyX2VudHJ5KHZjcHUsIE1TUl9FRkVSKS0+ZGF0YSB8PSBFRkVSX0xNQSB8IEVGRVJfTE1FOworCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9DT05UUk9MUywKKwkJICAgICB2bWNzX3JlYWQzMihWTV9FTlRSWV9DT05UUk9MUykKKwkJICAgICB8IFZNX0VOVFJZX0NPTlRST0xTX0lBMzJFX01BU0spOworfQorCitzdGF0aWMgdm9pZCBleGl0X2xtb2RlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2Y3B1LT5zaGFkb3dfZWZlciAmPSB+RUZFUl9MTUE7CisKKwl2bWNzX3dyaXRlMzIoVk1fRU5UUllfQ09OVFJPTFMsCisJCSAgICAgdm1jc19yZWFkMzIoVk1fRU5UUllfQ09OVFJPTFMpCisJCSAgICAgJiB+Vk1fRU5UUllfQ09OVFJPTFNfSUEzMkVfTUFTSyk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2bXhfc2V0X2NyMChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IwKQoreworCWlmICh2Y3B1LT5ybW9kZS5hY3RpdmUgJiYgKGNyMCAmIENSMF9QRV9NQVNLKSkKKwkJZW50ZXJfcG1vZGUodmNwdSk7CisKKwlpZiAoIXZjcHUtPnJtb2RlLmFjdGl2ZSAmJiAhKGNyMCAmIENSMF9QRV9NQVNLKSkKKwkJZW50ZXJfcm1vZGUodmNwdSk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJaWYgKHZjcHUtPnNoYWRvd19lZmVyICYgRUZFUl9MTUUpIHsKKwkJaWYgKCFpc19wYWdpbmcodmNwdSkgJiYgKGNyMCAmIENSMF9QR19NQVNLKSkKKwkJCWVudGVyX2xtb2RlKHZjcHUpOworCQlpZiAoaXNfcGFnaW5nKHZjcHUpICYmICEoY3IwICYgQ1IwX1BHX01BU0spKQorCQkJZXhpdF9sbW9kZSh2Y3B1KTsKKwl9CisjZW5kaWYKKworCXZtY3Nfd3JpdGVsKENSMF9SRUFEX1NIQURPVywgY3IwKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9DUjAsCisJCSAgICAoY3IwICYgfktWTV9HVUVTVF9DUjBfTUFTSykgfCBLVk1fVk1fQ1IwX0FMV0FZU19PTik7CisJdmNwdS0+Y3IwID0gY3IwOworfQorCisvKgorICogVXNlZCB3aGVuIHJlc3RvcmluZyB0aGUgVk0gdG8gYXZvaWQgY29ycnVwdGluZyBzZWdtZW50IHJlZ2lzdGVycworICovCitzdGF0aWMgdm9pZCB2bXhfc2V0X2NyMF9ub19tb2Rlc3dpdGNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjApCit7CisJdmNwdS0+cm1vZGUuYWN0aXZlID0gKChjcjAgJiBDUjBfUEVfTUFTSykgPT0gMCk7CisJdXBkYXRlX2V4Y2VwdGlvbl9iaXRtYXAodmNwdSk7CisJdm1jc193cml0ZWwoQ1IwX1JFQURfU0hBRE9XLCBjcjApOworCXZtY3Nfd3JpdGVsKEdVRVNUX0NSMCwKKwkJICAgIChjcjAgJiB+S1ZNX0dVRVNUX0NSMF9NQVNLKSB8IEtWTV9WTV9DUjBfQUxXQVlTX09OKTsKKwl2Y3B1LT5jcjAgPSBjcjA7Cit9CisKK3N0YXRpYyB2b2lkIHZteF9zZXRfY3IzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjMpCit7CisJdm1jc193cml0ZWwoR1VFU1RfQ1IzLCBjcjMpOworfQorCitzdGF0aWMgdm9pZCB2bXhfc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KQoreworCXZtY3Nfd3JpdGVsKENSNF9SRUFEX1NIQURPVywgY3I0KTsKKwl2bWNzX3dyaXRlbChHVUVTVF9DUjQsIGNyNCB8ICh2Y3B1LT5ybW9kZS5hY3RpdmUgPworCQkgICAgS1ZNX1JNT0RFX1ZNX0NSNF9BTFdBWVNfT04gOiBLVk1fUE1PREVfVk1fQ1I0X0FMV0FZU19PTikpOworCXZjcHUtPmNyNCA9IGNyNDsKK30KKworI2lmZGVmIENPTkZJR19YODZfNjQKKworc3RhdGljIHZvaWQgdm14X3NldF9lZmVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGVmZXIpCit7CisJc3RydWN0IHZteF9tc3JfZW50cnkgKm1zciA9IGZpbmRfbXNyX2VudHJ5KHZjcHUsIE1TUl9FRkVSKTsKKworCXZjcHUtPnNoYWRvd19lZmVyID0gZWZlcjsKKwlpZiAoZWZlciAmIEVGRVJfTE1BKSB7CisJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9DT05UUk9MUywKKwkJCQkgICAgIHZtY3NfcmVhZDMyKFZNX0VOVFJZX0NPTlRST0xTKSB8CisJCQkJICAgICBWTV9FTlRSWV9DT05UUk9MU19JQTMyRV9NQVNLKTsKKwkJbXNyLT5kYXRhID0gZWZlcjsKKworCX0gZWxzZSB7CisJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9DT05UUk9MUywKKwkJCQkgICAgIHZtY3NfcmVhZDMyKFZNX0VOVFJZX0NPTlRST0xTKSAmCisJCQkJICAgICB+Vk1fRU5UUllfQ09OVFJPTFNfSUEzMkVfTUFTSyk7CisKKwkJbXNyLT5kYXRhID0gZWZlciAmIH5FRkVSX0xNRTsKKwl9Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdTY0IHZteF9nZXRfc2VnbWVudF9iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNlZykKK3sKKwlzdHJ1Y3Qga3ZtX3ZteF9zZWdtZW50X2ZpZWxkICpzZiA9ICZrdm1fdm14X3NlZ21lbnRfZmllbGRzW3NlZ107CisKKwlyZXR1cm4gdm1jc19yZWFkbChzZi0+YmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHZteF9nZXRfc2VnbWVudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgICAgc3RydWN0IGt2bV9zZWdtZW50ICp2YXIsIGludCBzZWcpCit7CisJc3RydWN0IGt2bV92bXhfc2VnbWVudF9maWVsZCAqc2YgPSAma3ZtX3ZteF9zZWdtZW50X2ZpZWxkc1tzZWddOworCXUzMiBhcjsKKworCXZhci0+YmFzZSA9IHZtY3NfcmVhZGwoc2YtPmJhc2UpOworCXZhci0+bGltaXQgPSB2bWNzX3JlYWQzMihzZi0+bGltaXQpOworCXZhci0+c2VsZWN0b3IgPSB2bWNzX3JlYWQxNihzZi0+c2VsZWN0b3IpOworCWFyID0gdm1jc19yZWFkMzIoc2YtPmFyX2J5dGVzKTsKKwlpZiAoYXIgJiBBUl9VTlVTQUJMRV9NQVNLKQorCQlhciA9IDA7CisJdmFyLT50eXBlID0gYXIgJiAxNTsKKwl2YXItPnMgPSAoYXIgPj4gNCkgJiAxOworCXZhci0+ZHBsID0gKGFyID4+IDUpICYgMzsKKwl2YXItPnByZXNlbnQgPSAoYXIgPj4gNykgJiAxOworCXZhci0+YXZsID0gKGFyID4+IDEyKSAmIDE7CisJdmFyLT5sID0gKGFyID4+IDEzKSAmIDE7CisJdmFyLT5kYiA9IChhciA+PiAxNCkgJiAxOworCXZhci0+ZyA9IChhciA+PiAxNSkgJiAxOworCXZhci0+dW51c2FibGUgPSAoYXIgPj4gMTYpICYgMTsKK30KKworc3RhdGljIHZvaWQgdm14X3NldF9zZWdtZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICBzdHJ1Y3Qga3ZtX3NlZ21lbnQgKnZhciwgaW50IHNlZykKK3sKKwlzdHJ1Y3Qga3ZtX3ZteF9zZWdtZW50X2ZpZWxkICpzZiA9ICZrdm1fdm14X3NlZ21lbnRfZmllbGRzW3NlZ107CisJdTMyIGFyOworCisJdm1jc193cml0ZWwoc2YtPmJhc2UsIHZhci0+YmFzZSk7CisJdm1jc193cml0ZTMyKHNmLT5saW1pdCwgdmFyLT5saW1pdCk7CisJdm1jc193cml0ZTE2KHNmLT5zZWxlY3RvciwgdmFyLT5zZWxlY3Rvcik7CisJaWYgKHZhci0+dW51c2FibGUpCisJCWFyID0gMSA8PCAxNjsKKwllbHNlIHsKKwkJYXIgPSB2YXItPnR5cGUgJiAxNTsKKwkJYXIgfD0gKHZhci0+cyAmIDEpIDw8IDQ7CisJCWFyIHw9ICh2YXItPmRwbCAmIDMpIDw8IDU7CisJCWFyIHw9ICh2YXItPnByZXNlbnQgJiAxKSA8PCA3OworCQlhciB8PSAodmFyLT5hdmwgJiAxKSA8PCAxMjsKKwkJYXIgfD0gKHZhci0+bCAmIDEpIDw8IDEzOworCQlhciB8PSAodmFyLT5kYiAmIDEpIDw8IDE0OworCQlhciB8PSAodmFyLT5nICYgMSkgPDwgMTU7CisJfQorCWlmIChhciA9PSAwKSAvKiBhIDAgdmFsdWUgbWVhbnMgdW51c2FibGUgKi8KKwkJYXIgPSBBUl9VTlVTQUJMRV9NQVNLOworCXZtY3Nfd3JpdGUzMihzZi0+YXJfYnl0ZXMsIGFyKTsKK30KKworc3RhdGljIGludCB2bXhfaXNfbG9uZ19tb2RlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdm1jc19yZWFkMzIoVk1fRU5UUllfQ09OVFJPTFMpICYgVk1fRU5UUllfQ09OVFJPTFNfSUEzMkVfTUFTSzsKK30KKworc3RhdGljIHZvaWQgdm14X2dldF9jc19kYl9sX2JpdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgKmRiLCBpbnQgKmwpCit7CisJdTMyIGFyID0gdm1jc19yZWFkMzIoR1VFU1RfQ1NfQVJfQllURVMpOworCisJKmRiID0gKGFyID4+IDE0KSAmIDE7CisJKmwgPSAoYXIgPj4gMTMpICYgMTsKK30KKworc3RhdGljIHZvaWQgdm14X2dldF9pZHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSAqZHQpCit7CisJZHQtPmxpbWl0ID0gdm1jc19yZWFkMzIoR1VFU1RfSURUUl9MSU1JVCk7CisJZHQtPmJhc2UgPSB2bWNzX3JlYWRsKEdVRVNUX0lEVFJfQkFTRSk7Cit9CisKK3N0YXRpYyB2b2lkIHZteF9zZXRfaWR0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGRlc2NyaXB0b3JfdGFibGUgKmR0KQoreworCXZtY3Nfd3JpdGUzMihHVUVTVF9JRFRSX0xJTUlULCBkdC0+bGltaXQpOworCXZtY3Nfd3JpdGVsKEdVRVNUX0lEVFJfQkFTRSwgZHQtPmJhc2UpOworfQorCitzdGF0aWMgdm9pZCB2bXhfZ2V0X2dkdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlICpkdCkKK3sKKwlkdC0+bGltaXQgPSB2bWNzX3JlYWQzMihHVUVTVF9HRFRSX0xJTUlUKTsKKwlkdC0+YmFzZSA9IHZtY3NfcmVhZGwoR1VFU1RfR0RUUl9CQVNFKTsKK30KKworc3RhdGljIHZvaWQgdm14X3NldF9nZHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSAqZHQpCit7CisJdm1jc193cml0ZTMyKEdVRVNUX0dEVFJfTElNSVQsIGR0LT5saW1pdCk7CisJdm1jc193cml0ZWwoR1VFU1RfR0RUUl9CQVNFLCBkdC0+YmFzZSk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9ybW9kZV90c3Moc3RydWN0IGt2bSoga3ZtKQoreworCXN0cnVjdCBwYWdlICpwMSwgKnAyLCAqcDM7CisJZ2ZuX3QgZm4gPSBybW9kZV90c3NfYmFzZShrdm0pID4+IFBBR0VfU0hJRlQ7CisJY2hhciAqcGFnZTsKKworCXAxID0gX2dmbl90b19wYWdlKGt2bSwgZm4rKyk7CisJcDIgPSBfZ2ZuX3RvX3BhZ2Uoa3ZtLCBmbisrKTsKKwlwMyA9IF9nZm5fdG9fcGFnZShrdm0sIGZuKTsKKworCWlmICghcDEgfHwgIXAyIHx8ICFwMykgeworCQlrdm1fcHJpbnRmKGt2bSwiJXM6IGdmbl90b19wYWdlIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGFnZSA9IGttYXBfYXRvbWljKHAxLCBLTV9VU0VSMCk7CisJbWVtc2V0KHBhZ2UsIDAsIFBBR0VfU0laRSk7CisJKih1MTYqKShwYWdlICsgMHg2NikgPSBUU1NfQkFTRV9TSVpFICsgVFNTX1JFRElSRUNUSU9OX1NJWkU7CisJa3VubWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisKKwlwYWdlID0ga21hcF9hdG9taWMocDIsIEtNX1VTRVIwKTsKKwltZW1zZXQocGFnZSwgMCwgUEFHRV9TSVpFKTsKKwlrdW5tYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKworCXBhZ2UgPSBrbWFwX2F0b21pYyhwMywgS01fVVNFUjApOworCW1lbXNldChwYWdlLCAwLCBQQUdFX1NJWkUpOworCSoocGFnZSArIFJNT0RFX1RTU19TSVpFIC0gMiAqIFBBR0VfU0laRSAtIDEpID0gfjA7CisJa3VubWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdm1jc193cml0ZTMyX2ZpeGVkYml0cyh1MzIgbXNyLCB1MzIgdm1jc19maWVsZCwgdTMyIHZhbCkKK3sKKwl1MzIgbXNyX2hpZ2gsIG1zcl9sb3c7CisKKwlyZG1zcihtc3IsIG1zcl9sb3csIG1zcl9oaWdoKTsKKworCXZhbCAmPSBtc3JfaGlnaDsKKwl2YWwgfD0gbXNyX2xvdzsKKwl2bWNzX3dyaXRlMzIodm1jc19maWVsZCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgc2VnX3NldHVwKGludCBzZWcpCit7CisJc3RydWN0IGt2bV92bXhfc2VnbWVudF9maWVsZCAqc2YgPSAma3ZtX3ZteF9zZWdtZW50X2ZpZWxkc1tzZWddOworCisJdm1jc193cml0ZTE2KHNmLT5zZWxlY3RvciwgMCk7CisJdm1jc193cml0ZWwoc2YtPmJhc2UsIDApOworCXZtY3Nfd3JpdGUzMihzZi0+bGltaXQsIDB4ZmZmZik7CisJdm1jc193cml0ZTMyKHNmLT5hcl9ieXRlcywgMHg5Myk7Cit9CisKKy8qCisgKiBTZXRzIHVwIHRoZSB2bWNzIGZvciBlbXVsYXRlZCByZWFsIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgdm14X3ZjcHVfc2V0dXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXUzMiBob3N0X3N5c2VudGVyX2NzOworCXUzMiBqdW5rOworCXVuc2lnbmVkIGxvbmcgYTsKKwlzdHJ1Y3QgZGVzY3JpcHRvcl90YWJsZSBkdDsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbnJfZ29vZF9tc3JzOworCWV4dGVybiBhc21saW5rYWdlIHZvaWQga3ZtX3ZteF9yZXR1cm4odm9pZCk7CisKKwlpZiAoIWluaXRfcm1vZGVfdHNzKHZjcHUtPmt2bSkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KHZjcHUtPnJlZ3MsIDAsIHNpemVvZih2Y3B1LT5yZWdzKSk7CisJdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA9IGdldF9yZHhfaW5pdF92YWwoKTsKKwl2Y3B1LT5jcjggPSAwOworCXZjcHUtPmFwaWNfYmFzZSA9IDB4ZmVlMDAwMDAgfAorCQkJLypmb3IgdmNwdSAwKi8gTVNSX0lBMzJfQVBJQ0JBU0VfQlNQIHwKKwkJCU1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRTsKKworCWZ4X2luaXQodmNwdSk7CisKKwkvKgorCSAqIEdVRVNUX0NTX0JBU0Ugc2hvdWxkIHJlYWxseSBiZSAweGZmZmYwMDAwLCBidXQgVlQgdm04NiBtb2RlCisJICogaW5zaXN0cyBvbiBoYXZpbmcgR1VFU1RfQ1NfQkFTRSA9PSBHVUVTVF9DU19TRUxFQ1RPUiA8PCA0LiAgU2lnaC4KKwkgKi8KKwl2bWNzX3dyaXRlMTYoR1VFU1RfQ1NfU0VMRUNUT1IsIDB4ZjAwMCk7CisJdm1jc193cml0ZWwoR1VFU1RfQ1NfQkFTRSwgMHgwMDBmMDAwMCk7CisJdm1jc193cml0ZTMyKEdVRVNUX0NTX0xJTUlULCAweGZmZmYpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9DU19BUl9CWVRFUywgMHg5Yik7CisKKwlzZWdfc2V0dXAoVkNQVV9TUkVHX0RTKTsKKwlzZWdfc2V0dXAoVkNQVV9TUkVHX0VTKTsKKwlzZWdfc2V0dXAoVkNQVV9TUkVHX0ZTKTsKKwlzZWdfc2V0dXAoVkNQVV9TUkVHX0dTKTsKKwlzZWdfc2V0dXAoVkNQVV9TUkVHX1NTKTsKKworCXZtY3Nfd3JpdGUxNihHVUVTVF9UUl9TRUxFQ1RPUiwgMCk7CisJdm1jc193cml0ZWwoR1VFU1RfVFJfQkFTRSwgMCk7CisJdm1jc193cml0ZTMyKEdVRVNUX1RSX0xJTUlULCAweGZmZmYpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9UUl9BUl9CWVRFUywgMHgwMDhiKTsKKworCXZtY3Nfd3JpdGUxNihHVUVTVF9MRFRSX1NFTEVDVE9SLCAwKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9MRFRSX0JBU0UsIDApOworCXZtY3Nfd3JpdGUzMihHVUVTVF9MRFRSX0xJTUlULCAweGZmZmYpOworCXZtY3Nfd3JpdGUzMihHVUVTVF9MRFRSX0FSX0JZVEVTLCAweDAwMDgyKTsKKworCXZtY3Nfd3JpdGUzMihHVUVTVF9TWVNFTlRFUl9DUywgMCk7CisJdm1jc193cml0ZWwoR1VFU1RfU1lTRU5URVJfRVNQLCAwKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9TWVNFTlRFUl9FSVAsIDApOworCisJdm1jc193cml0ZWwoR1VFU1RfUkZMQUdTLCAweDAyKTsKKwl2bWNzX3dyaXRlbChHVUVTVF9SSVAsIDB4ZmZmMCk7CisJdm1jc193cml0ZWwoR1VFU1RfUlNQLCAwKTsKKworCXZtY3Nfd3JpdGVsKEdVRVNUX0NSMywgMCk7CisKKwkvL3RvZG86IGRyMCA9IGRyMSA9IGRyMiA9IGRyMyA9IDA7IGRyNiA9IDB4ZmZmZjBmZjAKKwl2bWNzX3dyaXRlbChHVUVTVF9EUjcsIDB4NDAwKTsKKworCXZtY3Nfd3JpdGVsKEdVRVNUX0dEVFJfQkFTRSwgMCk7CisJdm1jc193cml0ZTMyKEdVRVNUX0dEVFJfTElNSVQsIDB4ZmZmZik7CisKKwl2bWNzX3dyaXRlbChHVUVTVF9JRFRSX0JBU0UsIDApOworCXZtY3Nfd3JpdGUzMihHVUVTVF9JRFRSX0xJTUlULCAweGZmZmYpOworCisJdm1jc193cml0ZTMyKEdVRVNUX0FDVElWSVRZX1NUQVRFLCAwKTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLCAwKTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfUEVORElOR19EQkdfRVhDRVBUSU9OUywgMCk7CisKKwkvKiBJL08gKi8KKwl2bWNzX3dyaXRlNjQoSU9fQklUTUFQX0EsIDApOworCXZtY3Nfd3JpdGU2NChJT19CSVRNQVBfQiwgMCk7CisKKwlndWVzdF93cml0ZV90c2MoMCk7CisKKwl2bWNzX3dyaXRlNjQoVk1DU19MSU5LX1BPSU5URVIsIC0xdWxsKTsgLyogMjIuMy4xLjUgKi8KKworCS8qIFNwZWNpYWwgcmVnaXN0ZXJzICovCisJdm1jc193cml0ZTY0KEdVRVNUX0lBMzJfREVCVUdDVEwsIDApOworCisJLyogQ29udHJvbCAqLworCXZtY3Nfd3JpdGUzMl9maXhlZGJpdHMoTVNSX0lBMzJfVk1YX1BJTkJBU0VEX0NUTFNfTVNSLAorCQkJICAgICAgIFBJTl9CQVNFRF9WTV9FWEVDX0NPTlRST0wsCisJCQkgICAgICAgUElOX0JBU0VEX0VYVF9JTlRSX01BU0sgICAvKiAyMC42LjEgKi8KKwkJCSAgICAgICB8IFBJTl9CQVNFRF9OTUlfRVhJVElORyAgIC8qIDIwLjYuMSAqLworCQkJKTsKKwl2bWNzX3dyaXRlMzJfZml4ZWRiaXRzKE1TUl9JQTMyX1ZNWF9QUk9DQkFTRURfQ1RMU19NU1IsCisJCQkgICAgICAgQ1BVX0JBU0VEX1ZNX0VYRUNfQ09OVFJPTCwKKwkJCSAgICAgICBDUFVfQkFTRURfSExUX0VYSVRJTkcgICAgICAgICAvKiAyMC42LjIgKi8KKwkJCSAgICAgICB8IENQVV9CQVNFRF9DUjhfTE9BRF9FWElUSU5HICAgIC8qIDIwLjYuMiAqLworCQkJICAgICAgIHwgQ1BVX0JBU0VEX0NSOF9TVE9SRV9FWElUSU5HICAgLyogMjAuNi4yICovCisJCQkgICAgICAgfCBDUFVfQkFTRURfVU5DT05EX0lPX0VYSVRJTkcgICAvKiAyMC42LjIgKi8KKwkJCSAgICAgICB8IENQVV9CQVNFRF9JTlZEUEdfRVhJVElORworCQkJICAgICAgIHwgQ1BVX0JBU0VEX01PVl9EUl9FWElUSU5HCisJCQkgICAgICAgfCBDUFVfQkFTRURfVVNFX1RTQ19PRkZTRVRJTkcgICAvKiAyMS4zICovCisJCQkpOworCisJdm1jc193cml0ZTMyKEVYQ0VQVElPTl9CSVRNQVAsIDEgPDwgUEZfVkVDVE9SKTsKKwl2bWNzX3dyaXRlMzIoUEFHRV9GQVVMVF9FUlJPUl9DT0RFX01BU0ssIDApOworCXZtY3Nfd3JpdGUzMihQQUdFX0ZBVUxUX0VSUk9SX0NPREVfTUFUQ0gsIDApOworCXZtY3Nfd3JpdGUzMihDUjNfVEFSR0VUX0NPVU5ULCAwKTsgICAgICAgICAgIC8qIDIyLjIuMSAqLworCisJdm1jc193cml0ZWwoSE9TVF9DUjAsIHJlYWRfY3IwKCkpOyAgLyogMjIuMi4zICovCisJdm1jc193cml0ZWwoSE9TVF9DUjQsIHJlYWRfY3I0KCkpOyAgLyogMjIuMi4zLCAyMi4yLjUgKi8KKwl2bWNzX3dyaXRlbChIT1NUX0NSMywgcmVhZF9jcjMoKSk7ICAvKiAyMi4yLjMgIEZJWE1FOiBzaGFkb3cgdGFibGVzICovCisKKwl2bWNzX3dyaXRlMTYoSE9TVF9DU19TRUxFQ1RPUiwgX19LRVJORUxfQ1MpOyAgLyogMjIuMi40ICovCisJdm1jc193cml0ZTE2KEhPU1RfRFNfU0VMRUNUT1IsIF9fS0VSTkVMX0RTKTsgIC8qIDIyLjIuNCAqLworCXZtY3Nfd3JpdGUxNihIT1NUX0VTX1NFTEVDVE9SLCBfX0tFUk5FTF9EUyk7ICAvKiAyMi4yLjQgKi8KKwl2bWNzX3dyaXRlMTYoSE9TVF9GU19TRUxFQ1RPUiwgcmVhZF9mcygpKTsgICAgLyogMjIuMi40ICovCisJdm1jc193cml0ZTE2KEhPU1RfR1NfU0VMRUNUT1IsIHJlYWRfZ3MoKSk7ICAgIC8qIDIyLjIuNCAqLworCXZtY3Nfd3JpdGUxNihIT1NUX1NTX1NFTEVDVE9SLCBfX0tFUk5FTF9EUyk7ICAvKiAyMi4yLjQgKi8KKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJcmRtc3JsKE1TUl9GU19CQVNFLCBhKTsKKwl2bWNzX3dyaXRlbChIT1NUX0ZTX0JBU0UsIGEpOyAvKiAyMi4yLjQgKi8KKwlyZG1zcmwoTVNSX0dTX0JBU0UsIGEpOworCXZtY3Nfd3JpdGVsKEhPU1RfR1NfQkFTRSwgYSk7IC8qIDIyLjIuNCAqLworI2Vsc2UKKwl2bWNzX3dyaXRlbChIT1NUX0ZTX0JBU0UsIDApOyAvKiAyMi4yLjQgKi8KKwl2bWNzX3dyaXRlbChIT1NUX0dTX0JBU0UsIDApOyAvKiAyMi4yLjQgKi8KKyNlbmRpZgorCisJdm1jc193cml0ZTE2KEhPU1RfVFJfU0VMRUNUT1IsIEdEVF9FTlRSWV9UU1MqOCk7ICAvKiAyMi4yLjQgKi8KKworCWdldF9pZHQoJmR0KTsKKwl2bWNzX3dyaXRlbChIT1NUX0lEVFJfQkFTRSwgZHQuYmFzZSk7ICAgLyogMjIuMi40ICovCisKKworCXZtY3Nfd3JpdGVsKEhPU1RfUklQLCAodW5zaWduZWQgbG9uZylrdm1fdm14X3JldHVybik7IC8qIDIyLjIuNSAqLworCisJcmRtc3IoTVNSX0lBMzJfU1lTRU5URVJfQ1MsIGhvc3Rfc3lzZW50ZXJfY3MsIGp1bmspOworCXZtY3Nfd3JpdGUzMihIT1NUX0lBMzJfU1lTRU5URVJfQ1MsIGhvc3Rfc3lzZW50ZXJfY3MpOworCXJkbXNybChNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIGEpOworCXZtY3Nfd3JpdGVsKEhPU1RfSUEzMl9TWVNFTlRFUl9FU1AsIGEpOyAgIC8qIDIyLjIuMyAqLworCXJkbXNybChNU1JfSUEzMl9TWVNFTlRFUl9FSVAsIGEpOworCXZtY3Nfd3JpdGVsKEhPU1RfSUEzMl9TWVNFTlRFUl9FSVAsIGEpOyAgIC8qIDIyLjIuMyAqLworCisJcmV0ID0gLUVOT01FTTsKKwl2Y3B1LT5ndWVzdF9tc3JzID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghdmNwdS0+Z3Vlc3RfbXNycykKKwkJZ290byBvdXQ7CisJdmNwdS0+aG9zdF9tc3JzID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghdmNwdS0+aG9zdF9tc3JzKQorCQlnb3RvIG91dF9mcmVlX2d1ZXN0X21zcnM7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfVk1YX01TUjsgKytpKSB7CisJCXUzMiBpbmRleCA9IHZteF9tc3JfaW5kZXhbaV07CisJCXUzMiBkYXRhX2xvdywgZGF0YV9oaWdoOworCQl1NjQgZGF0YTsKKwkJaW50IGogPSB2Y3B1LT5ubXNyczsKKworCQlpZiAocmRtc3Jfc2FmZShpbmRleCwgJmRhdGFfbG93LCAmZGF0YV9oaWdoKSA8IDApCisJCQljb250aW51ZTsKKwkJZGF0YSA9IGRhdGFfbG93IHwgKCh1NjQpZGF0YV9oaWdoIDw8IDMyKTsKKwkJdmNwdS0+aG9zdF9tc3JzW2pdLmluZGV4ID0gaW5kZXg7CisJCXZjcHUtPmhvc3RfbXNyc1tqXS5yZXNlcnZlZCA9IDA7CisJCXZjcHUtPmhvc3RfbXNyc1tqXS5kYXRhID0gZGF0YTsKKwkJdmNwdS0+Z3Vlc3RfbXNyc1tqXSA9IHZjcHUtPmhvc3RfbXNyc1tqXTsKKwkJKyt2Y3B1LT5ubXNyczsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgImt2bTogbXNyczogJWRcbiIsIHZjcHUtPm5tc3JzKTsKKworCW5yX2dvb2RfbXNycyA9IHZjcHUtPm5tc3JzIC0gTlJfQkFEX01TUlM7CisJdm1jc193cml0ZWwoVk1fRU5UUllfTVNSX0xPQURfQUREUiwKKwkJICAgIHZpcnRfdG9fcGh5cyh2Y3B1LT5ndWVzdF9tc3JzICsgTlJfQkFEX01TUlMpKTsKKwl2bWNzX3dyaXRlbChWTV9FWElUX01TUl9TVE9SRV9BRERSLAorCQkgICAgdmlydF90b19waHlzKHZjcHUtPmd1ZXN0X21zcnMgKyBOUl9CQURfTVNSUykpOworCXZtY3Nfd3JpdGVsKFZNX0VYSVRfTVNSX0xPQURfQUREUiwKKwkJICAgIHZpcnRfdG9fcGh5cyh2Y3B1LT5ob3N0X21zcnMgKyBOUl9CQURfTVNSUykpOworCXZtY3Nfd3JpdGUzMl9maXhlZGJpdHMoTVNSX0lBMzJfVk1YX0VYSVRfQ1RMU19NU1IsIFZNX0VYSVRfQ09OVFJPTFMsCisJCSAgICAgCSAgICAgICAoSE9TVF9JU182NCA8PCA5KSk7ICAvKiAyMi4yLDEsIDIwLjcuMSAqLworCXZtY3Nfd3JpdGUzMihWTV9FWElUX01TUl9TVE9SRV9DT1VOVCwgbnJfZ29vZF9tc3JzKTsgLyogMjIuMi4yICovCisJdm1jc193cml0ZTMyKFZNX0VYSVRfTVNSX0xPQURfQ09VTlQsIG5yX2dvb2RfbXNycyk7ICAvKiAyMi4yLjIgKi8KKwl2bWNzX3dyaXRlMzIoVk1fRU5UUllfTVNSX0xPQURfQ09VTlQsIG5yX2dvb2RfbXNycyk7IC8qIDIyLjIuMiAqLworCisKKwkvKiAyMi4yLjEsIDIwLjguMSAqLworCXZtY3Nfd3JpdGUzMl9maXhlZGJpdHMoTVNSX0lBMzJfVk1YX0VOVFJZX0NUTFNfTVNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZNX0VOVFJZX0NPTlRST0xTLCAwKTsKKwl2bWNzX3dyaXRlMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxELCAwKTsgIC8qIDIyLjIuMSAqLworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXZtY3Nfd3JpdGVsKFZJUlRVQUxfQVBJQ19QQUdFX0FERFIsIDApOworCXZtY3Nfd3JpdGVsKFRQUl9USFJFU0hPTEQsIDApOworI2VuZGlmCisKKwl2bWNzX3dyaXRlbChDUjBfR1VFU1RfSE9TVF9NQVNLLCBLVk1fR1VFU1RfQ1IwX01BU0spOworCXZtY3Nfd3JpdGVsKENSNF9HVUVTVF9IT1NUX01BU0ssIEtWTV9HVUVTVF9DUjRfTUFTSyk7CisKKwl2Y3B1LT5jcjAgPSAweDYwMDAwMDEwOworCXZteF9zZXRfY3IwKHZjcHUsIHZjcHUtPmNyMCk7IC8vIGVudGVyIHJtb2RlCisJdm14X3NldF9jcjQodmNwdSwgMCk7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXZteF9zZXRfZWZlcih2Y3B1LCAwKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKK291dF9mcmVlX2d1ZXN0X21zcnM6CisJa2ZyZWUodmNwdS0+Z3Vlc3RfbXNycyk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW5qZWN0X3Jtb2RlX2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBpcnEpCit7CisJdTE2IGVudFsyXTsKKwl1MTYgY3M7CisJdTE2IGlwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzc19iYXNlID0gdm1jc19yZWFkbChHVUVTVF9TU19CQVNFKTsKKwl1MTYgc3AgPSAgdm1jc19yZWFkbChHVUVTVF9SU1ApOworCXUzMiBzc19saW1pdCA9IHZtY3NfcmVhZDMyKEdVRVNUX1NTX0xJTUlUKTsKKworCWlmIChzcCA+IHNzX2xpbWl0IHx8IHNwIC0gNiA+IHNwKSB7CisJCXZjcHVfcHJpbnRmKHZjcHUsICIlczogI1NTLCByc3AgMHglbHggc3MgMHglbHggbGltaXQgMHgleFxuIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sCisJCQkgICAgdm1jc19yZWFkbChHVUVTVF9SU1ApLAorCQkJICAgIHZtY3NfcmVhZGwoR1VFU1RfU1NfQkFTRSksCisJCQkgICAgdm1jc19yZWFkMzIoR1VFU1RfU1NfTElNSVQpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChrdm1fcmVhZF9ndWVzdCh2Y3B1LCBpcnEgKiBzaXplb2YoZW50KSwgc2l6ZW9mKGVudCksICZlbnQpICE9CisJCQkJCQkJCXNpemVvZihlbnQpKSB7CisJCXZjcHVfcHJpbnRmKHZjcHUsICIlczogcmVhZCBndWVzdCBlcnJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlmbGFncyA9ICB2bWNzX3JlYWRsKEdVRVNUX1JGTEFHUyk7CisJY3MgPSAgdm1jc19yZWFkbChHVUVTVF9DU19CQVNFKSA+PiA0OworCWlwID0gIHZtY3NfcmVhZGwoR1VFU1RfUklQKTsKKworCisJaWYgKGt2bV93cml0ZV9ndWVzdCh2Y3B1LCBzc19iYXNlICsgc3AgLSAyLCAyLCAmZmxhZ3MpICE9IDIgfHwKKwkgICAga3ZtX3dyaXRlX2d1ZXN0KHZjcHUsIHNzX2Jhc2UgKyBzcCAtIDQsIDIsICZjcykgIT0gMiB8fAorCSAgICBrdm1fd3JpdGVfZ3Vlc3QodmNwdSwgc3NfYmFzZSArIHNwIC0gNiwgMiwgJmlwKSAhPSAyKSB7CisJCXZjcHVfcHJpbnRmKHZjcHUsICIlczogd3JpdGUgZ3Vlc3QgZXJyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJdm1jc193cml0ZWwoR1VFU1RfUkZMQUdTLCBmbGFncyAmCisJCSAgICB+KCBYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19BQyB8IFg4Nl9FRkxBR1NfVEYpKTsKKwl2bWNzX3dyaXRlMTYoR1VFU1RfQ1NfU0VMRUNUT1IsIGVudFsxXSkgOworCXZtY3Nfd3JpdGVsKEdVRVNUX0NTX0JBU0UsIGVudFsxXSA8PCA0KTsKKwl2bWNzX3dyaXRlbChHVUVTVF9SSVAsIGVudFswXSk7CisJdm1jc193cml0ZWwoR1VFU1RfUlNQLCAodm1jc19yZWFkbChHVUVTVF9SU1ApICYgfjB4ZmZmZikgfCAoc3AgLSA2KSk7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV9kb19pbmplY3RfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgd29yZF9pbmRleCA9IF9fZmZzKHZjcHUtPmlycV9zdW1tYXJ5KTsKKwlpbnQgYml0X2luZGV4ID0gX19mZnModmNwdS0+aXJxX3BlbmRpbmdbd29yZF9pbmRleF0pOworCWludCBpcnEgPSB3b3JkX2luZGV4ICogQklUU19QRVJfTE9ORyArIGJpdF9pbmRleDsKKworCWNsZWFyX2JpdChiaXRfaW5kZXgsICZ2Y3B1LT5pcnFfcGVuZGluZ1t3b3JkX2luZGV4XSk7CisJaWYgKCF2Y3B1LT5pcnFfcGVuZGluZ1t3b3JkX2luZGV4XSkKKwkJY2xlYXJfYml0KHdvcmRfaW5kZXgsICZ2Y3B1LT5pcnFfc3VtbWFyeSk7CisKKwlpZiAodmNwdS0+cm1vZGUuYWN0aXZlKSB7CisJCWluamVjdF9ybW9kZV9pcnEodmNwdSwgaXJxKTsKKwkJcmV0dXJuOworCX0KKwl2bWNzX3dyaXRlMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxELAorCQkJaXJxIHwgSU5UUl9UWVBFX0VYVF9JTlRSIHwgSU5UUl9JTkZPX1ZBTElEX01BU0spOworfQorCitzdGF0aWMgdm9pZCBrdm1fdHJ5X2luamVjdF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWlmICgodm1jc19yZWFkbChHVUVTVF9SRkxBR1MpICYgWDg2X0VGTEFHU19JRikKKwkgICAgJiYgKHZtY3NfcmVhZDMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTykgJiAzKSA9PSAwKQorCQkvKgorCQkgKiBJbnRlcnJ1cHRzIGVuYWJsZWQsIGFuZCBub3QgYmxvY2tlZCBieSBzdGkgb3IgbW92IHNzLiBHb29kLgorCQkgKi8KKwkJa3ZtX2RvX2luamVjdF9pcnEodmNwdSk7CisJZWxzZQorCQkvKgorCQkgKiBJbnRlcnJ1cHRzIGJsb2NrZWQuICBXYWl0IGZvciB1bmJsb2NrLgorCQkgKi8KKwkJdm1jc193cml0ZTMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wsCisJCQkgICAgIHZtY3NfcmVhZDMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wpCisJCQkgICAgIHwgQ1BVX0JBU0VEX1ZJUlRVQUxfSU5UUl9QRU5ESU5HKTsKK30KKworc3RhdGljIHZvaWQga3ZtX2d1ZXN0X2RlYnVnX3ByZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9ndWVzdF9kZWJ1ZyAqZGJnID0gJnZjcHUtPmd1ZXN0X2RlYnVnOworCisJc2V0X2RlYnVncmVnKGRiZy0+YnBbMF0sIDApOworCXNldF9kZWJ1Z3JlZyhkYmctPmJwWzFdLCAxKTsKKwlzZXRfZGVidWdyZWcoZGJnLT5icFsyXSwgMik7CisJc2V0X2RlYnVncmVnKGRiZy0+YnBbM10sIDMpOworCisJaWYgKGRiZy0+c2luZ2xlc3RlcCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWZsYWdzID0gdm1jc19yZWFkbChHVUVTVF9SRkxBR1MpOworCQlmbGFncyB8PSBYODZfRUZMQUdTX1RGIHwgWDg2X0VGTEFHU19SRjsKKwkJdm1jc193cml0ZWwoR1VFU1RfUkZMQUdTLCBmbGFncyk7CisJfQorfQorCitzdGF0aWMgaW50IGhhbmRsZV9ybW9kZV9leGNlcHRpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgaW50IHZlYywgdTMyIGVycl9jb2RlKQoreworCWlmICghdmNwdS0+cm1vZGUuYWN0aXZlKQorCQlyZXR1cm4gMDsKKworCWlmICh2ZWMgPT0gR1BfVkVDVE9SICYmIGVycl9jb2RlID09IDApCisJCWlmIChlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIE5VTEwsIDAsIDApID09IEVNVUxBVEVfRE9ORSkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9leGNlcHRpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKK3sKKwl1MzIgaW50cl9pbmZvLCBlcnJvcl9jb2RlOworCXVuc2lnbmVkIGxvbmcgY3IyLCByaXA7CisJdTMyIHZlY3RfaW5mbzsKKwllbnVtIGVtdWxhdGlvbl9yZXN1bHQgZXI7CisKKwl2ZWN0X2luZm8gPSB2bWNzX3JlYWQzMihJRFRfVkVDVE9SSU5HX0lORk9fRklFTEQpOworCWludHJfaW5mbyA9IHZtY3NfcmVhZDMyKFZNX0VYSVRfSU5UUl9JTkZPKTsKKworCWlmICgodmVjdF9pbmZvICYgVkVDVE9SSU5HX0lORk9fVkFMSURfTUFTSykgJiYKKwkJCQkJCSFpc19wYWdlX2ZhdWx0KGludHJfaW5mbykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBlY3RlZCwgdmVjdG9yaW5nIGluZm8gMHgleCAiCisJCSAgICAgICAiaW50ciBpbmZvIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgdmVjdF9pbmZvLCBpbnRyX2luZm8pOworCX0KKworCWlmIChpc19leHRlcm5hbF9pbnRlcnJ1cHQodmVjdF9pbmZvKSkgeworCQlpbnQgaXJxID0gdmVjdF9pbmZvICYgVkVDVE9SSU5HX0lORk9fVkVDVE9SX01BU0s7CisJCXNldF9iaXQoaXJxLCB2Y3B1LT5pcnFfcGVuZGluZyk7CisJCXNldF9iaXQoaXJxIC8gQklUU19QRVJfTE9ORywgJnZjcHUtPmlycV9zdW1tYXJ5KTsKKwl9CisKKwlpZiAoKGludHJfaW5mbyAmIElOVFJfSU5GT19JTlRSX1RZUEVfTUFTSykgPT0gMHgyMDApIHsgLyogbm1pICovCisJCWFzbSAoImludCAkMiIpOworCQlyZXR1cm4gMTsKKwl9CisJZXJyb3JfY29kZSA9IDA7CisJcmlwID0gdm1jc19yZWFkbChHVUVTVF9SSVApOworCWlmIChpbnRyX2luZm8gJiBJTlRSX0lORk9fREVMSUVWRVJfQ09ERV9NQVNLKQorCQllcnJvcl9jb2RlID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlRSX0VSUk9SX0NPREUpOworCWlmIChpc19wYWdlX2ZhdWx0KGludHJfaW5mbykpIHsKKwkJY3IyID0gdm1jc19yZWFkbChFWElUX1FVQUxJRklDQVRJT04pOworCisJCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5sb2NrKTsKKwkJaWYgKCF2Y3B1LT5tbXUucGFnZV9mYXVsdCh2Y3B1LCBjcjIsIGVycm9yX2NvZGUpKSB7CisJCQlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5sb2NrKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJZXIgPSBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIGt2bV9ydW4sIGNyMiwgZXJyb3JfY29kZSk7CisJCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCisJCXN3aXRjaCAoZXIpIHsKKwkJY2FzZSBFTVVMQVRFX0RPTkU6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBFTVVMQVRFX0RPX01NSU86CisJCQkrK2t2bV9zdGF0Lm1taW9fZXhpdHM7CisJCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX01NSU87CisJCQlyZXR1cm4gMDsKKwkJIGNhc2UgRU1VTEFURV9GQUlMOgorCQkJdmNwdV9wcmludGYodmNwdSwgIiVzOiBlbXVsYXRlIGZhaWxcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQorCisJaWYgKHZjcHUtPnJtb2RlLmFjdGl2ZSAmJgorCSAgICBoYW5kbGVfcm1vZGVfZXhjZXB0aW9uKHZjcHUsIGludHJfaW5mbyAmIElOVFJfSU5GT19WRUNUT1JfTUFTSywKKwkJCQkJCQkJZXJyb3JfY29kZSkpCisJCXJldHVybiAxOworCisJaWYgKChpbnRyX2luZm8gJiAoSU5UUl9JTkZPX0lOVFJfVFlQRV9NQVNLIHwgSU5UUl9JTkZPX1ZFQ1RPUl9NQVNLKSkgPT0gKElOVFJfVFlQRV9FWENFUFRJT04gfCAxKSkgeworCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0RFQlVHOworCQlyZXR1cm4gMDsKKwl9CisJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9FWENFUFRJT047CisJa3ZtX3J1bi0+ZXguZXhjZXB0aW9uID0gaW50cl9pbmZvICYgSU5UUl9JTkZPX1ZFQ1RPUl9NQVNLOworCWt2bV9ydW4tPmV4LmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9leHRlcm5hbF9pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJKytrdm1fc3RhdC5pcnFfZXhpdHM7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBnZXRfaW9fY291bnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKmNvdW50KQoreworCXU2NCBpbnN0OworCWd2YV90IHJpcDsKKwlpbnQgY291bnRyX3NpemU7CisJaW50IGksIG47CisKKwlpZiAoKHZtY3NfcmVhZGwoR1VFU1RfUkZMQUdTKSAmIFg4Nl9FRkxBR1NfVk0pKSB7CisJCWNvdW50cl9zaXplID0gMjsKKwl9IGVsc2UgeworCQl1MzIgY3NfYXIgPSB2bWNzX3JlYWQzMihHVUVTVF9DU19BUl9CWVRFUyk7CisKKwkJY291bnRyX3NpemUgPSAoY3NfYXIgJiBBUl9MX01BU0spID8gODoKKwkJCSAgICAgIChjc19hciAmIEFSX0RCX01BU0spID8gNDogMjsKKwl9CisKKwlyaXAgPSAgdm1jc19yZWFkbChHVUVTVF9SSVApOworCWlmIChjb3VudHJfc2l6ZSAhPSA4KQorCQlyaXAgKz0gdm1jc19yZWFkbChHVUVTVF9DU19CQVNFKTsKKworCW4gPSBrdm1fcmVhZF9ndWVzdCh2Y3B1LCByaXAsIHNpemVvZihpbnN0KSwgJmluc3QpOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlzd2l0Y2ggKCgodTgqKSZpbnN0KVtpXSkgeworCQljYXNlIDB4ZjA6CisJCWNhc2UgMHhmMjoKKwkJY2FzZSAweGYzOgorCQljYXNlIDB4MmU6CisJCWNhc2UgMHgzNjoKKwkJY2FzZSAweDNlOgorCQljYXNlIDB4MjY6CisJCWNhc2UgMHg2NDoKKwkJY2FzZSAweDY1OgorCQljYXNlIDB4NjY6CisJCQlicmVhazsKKwkJY2FzZSAweDY3OgorCQkJY291bnRyX3NpemUgPSAoY291bnRyX3NpemUgPT0gMikgPyA0OiAoY291bnRyX3NpemUgPj4gMSk7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisJcmV0dXJuIDA7Citkb25lOgorCWNvdW50cl9zaXplICo9IDg7CisJKmNvdW50ID0gdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkNYXSAmICh+MFVMTCA+PiAoNjQgLSBjb3VudHJfc2l6ZSkpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9pbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXU2NCBleGl0X3F1YWxpZmljYXRpb247CisKKwkrK2t2bV9zdGF0LmlvX2V4aXRzOworCWV4aXRfcXVhbGlmaWNhdGlvbiA9IHZtY3NfcmVhZDY0KEVYSVRfUVVBTElGSUNBVElPTik7CisJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTzsKKwlpZiAoZXhpdF9xdWFsaWZpY2F0aW9uICYgOCkKKwkJa3ZtX3J1bi0+aW8uZGlyZWN0aW9uID0gS1ZNX0VYSVRfSU9fSU47CisJZWxzZQorCQlrdm1fcnVuLT5pby5kaXJlY3Rpb24gPSBLVk1fRVhJVF9JT19PVVQ7CisJa3ZtX3J1bi0+aW8uc2l6ZSA9IChleGl0X3F1YWxpZmljYXRpb24gJiA3KSArIDE7CisJa3ZtX3J1bi0+aW8uc3RyaW5nID0gKGV4aXRfcXVhbGlmaWNhdGlvbiAmIDE2KSAhPSAwOworCWt2bV9ydW4tPmlvLnN0cmluZ19kb3duCisJCT0gKHZtY3NfcmVhZGwoR1VFU1RfUkZMQUdTKSAmIFg4Nl9FRkxBR1NfREYpICE9IDA7CisJa3ZtX3J1bi0+aW8ucmVwID0gKGV4aXRfcXVhbGlmaWNhdGlvbiAmIDMyKSAhPSAwOworCWt2bV9ydW4tPmlvLnBvcnQgPSBleGl0X3F1YWxpZmljYXRpb24gPj4gMTY7CisJaWYgKGt2bV9ydW4tPmlvLnN0cmluZykgeworCQlpZiAoIWdldF9pb19jb3VudCh2Y3B1LCAma3ZtX3J1bi0+aW8uY291bnQpKQorCQkJcmV0dXJuIDE7CisJCWt2bV9ydW4tPmlvLmFkZHJlc3MgPSB2bWNzX3JlYWRsKEdVRVNUX0xJTkVBUl9BRERSRVNTKTsKKwl9IGVsc2UKKwkJa3ZtX3J1bi0+aW8udmFsdWUgPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SQVhdOyAvKiByYXggKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfaW52bHBnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJdTY0IGFkZHJlc3MgPSB2bWNzX3JlYWQ2NChFWElUX1FVQUxJRklDQVRJT04pOworCWludCBpbnN0cnVjdGlvbl9sZW5ndGggPSB2bWNzX3JlYWQzMihWTV9FWElUX0lOU1RSVUNUSU9OX0xFTik7CisJc3Bpbl9sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCXZjcHUtPm1tdS5pbnZhbF9wYWdlKHZjcHUsIGFkZHJlc3MpOworCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOworCXZtY3Nfd3JpdGVsKEdVRVNUX1JJUCwgdm1jc19yZWFkbChHVUVTVF9SSVApICsgaW5zdHJ1Y3Rpb25fbGVuZ3RoKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfY3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKK3sKKwl1NjQgZXhpdF9xdWFsaWZpY2F0aW9uOworCWludCBjcjsKKwlpbnQgcmVnOworCisJZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkNjQoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKKwljciA9IGV4aXRfcXVhbGlmaWNhdGlvbiAmIDE1OworCXJlZyA9IChleGl0X3F1YWxpZmljYXRpb24gPj4gOCkgJiAxNTsKKwlzd2l0Y2ggKChleGl0X3F1YWxpZmljYXRpb24gPj4gNCkgJiAzKSB7CisJY2FzZSAwOiAvKiBtb3YgdG8gY3IgKi8KKwkJc3dpdGNoIChjcikgeworCQljYXNlIDA6CisJCQl2Y3B1X2xvYWRfcnNwX3JpcCh2Y3B1KTsKKwkJCXNldF9jcjAodmNwdSwgdmNwdS0+cmVnc1tyZWddKTsKKwkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSAzOgorCQkJdmNwdV9sb2FkX3JzcF9yaXAodmNwdSk7CisJCQlzZXRfY3IzKHZjcHUsIHZjcHUtPnJlZ3NbcmVnXSk7CisJCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCQkJcmV0dXJuIDE7CisJCWNhc2UgNDoKKwkJCXZjcHVfbG9hZF9yc3BfcmlwKHZjcHUpOworCQkJc2V0X2NyNCh2Y3B1LCB2Y3B1LT5yZWdzW3JlZ10pOworCQkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJCXJldHVybiAxOworCQljYXNlIDg6CisJCQl2Y3B1X2xvYWRfcnNwX3JpcCh2Y3B1KTsKKwkJCXNldF9jcjgodmNwdSwgdmNwdS0+cmVnc1tyZWddKTsKKwkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJCQlyZXR1cm4gMTsKKwkJfTsKKwkJYnJlYWs7CisJY2FzZSAxOiAvKm1vdiBmcm9tIGNyKi8KKwkJc3dpdGNoIChjcikgeworCQljYXNlIDM6CisJCQl2Y3B1X2xvYWRfcnNwX3JpcCh2Y3B1KTsKKwkJCXZjcHUtPnJlZ3NbcmVnXSA9IHZjcHUtPmNyMzsKKwkJCXZjcHVfcHV0X3JzcF9yaXAodmNwdSk7CisJCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCQkJcmV0dXJuIDE7CisJCWNhc2UgODoKKwkJCXByaW50ayhLRVJOX0RFQlVHICJoYW5kbGVfY3I6IHJlYWQgQ1I4ICIKKwkJCSAgICAgICAiY3B1IGVycmF0dW0gQUExNVxuIik7CisJCQl2Y3B1X2xvYWRfcnNwX3JpcCh2Y3B1KTsKKwkJCXZjcHUtPnJlZ3NbcmVnXSA9IHZjcHUtPmNyODsKKwkJCXZjcHVfcHV0X3JzcF9yaXAodmNwdSk7CisJCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOiAvKiBsbXN3ICovCisJCWxtc3codmNwdSwgKGV4aXRfcXVhbGlmaWNhdGlvbiA+PiBMTVNXX1NPVVJDRV9EQVRBX1NISUZUKSAmIDB4MGYpOworCisJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IDA7CisJcHJpbnRrKEtFUk5fRVJSICJrdm06IHVuaGFuZGxlZCBjb250cm9sIHJlZ2lzdGVyOiBvcCAlZCBjciAlZFxuIiwKKwkgICAgICAgKGludCkoZXhpdF9xdWFsaWZpY2F0aW9uID4+IDQpICYgMywgY3IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9kcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXU2NCBleGl0X3F1YWxpZmljYXRpb247CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGRyLCByZWc7CisKKwkvKgorCSAqIEZJWE1FOiB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgaG9zdCBpcyBkZWJ1Z2dpbmcgdGhlIGd1ZXN0LgorCSAqICAgICAgICBuZWVkIHRvIGRlYWwgd2l0aCBndWVzdCBkZWJ1Z2dpbmcgaXRzZWxmIHRvby4KKwkgKi8KKwlleGl0X3F1YWxpZmljYXRpb24gPSB2bWNzX3JlYWQ2NChFWElUX1FVQUxJRklDQVRJT04pOworCWRyID0gZXhpdF9xdWFsaWZpY2F0aW9uICYgNzsKKwlyZWcgPSAoZXhpdF9xdWFsaWZpY2F0aW9uID4+IDgpICYgMTU7CisJdmNwdV9sb2FkX3JzcF9yaXAodmNwdSk7CisJaWYgKGV4aXRfcXVhbGlmaWNhdGlvbiAmIDE2KSB7CisJCS8qIG1vdiBmcm9tIGRyICovCisJCXN3aXRjaCAoZHIpIHsKKwkJY2FzZSA2OgorCQkJdmFsID0gMHhmZmZmMGZmMDsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQl2YWwgPSAweDQwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmFsID0gMDsKKwkJfQorCQl2Y3B1LT5yZWdzW3JlZ10gPSB2YWw7CisJfSBlbHNlIHsKKwkJLyogbW92IHRvIGRyICovCisJfQorCXZjcHVfcHV0X3JzcF9yaXAodmNwdSk7CisJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfY3B1aWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKK3sKKwlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0NQVUlEOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9yZG1zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXUzMiBlY3ggPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SQ1hdOworCXU2NCBkYXRhOworCisJaWYgKHZteF9nZXRfbXNyKHZjcHUsIGVjeCwgJmRhdGEpKSB7CisJCXZteF9pbmplY3RfZ3AodmNwdSwgMCk7CisJCXJldHVybiAxOworCX0KKworCS8qIEZJWE1FOiBoYW5kbGluZyBvZiBiaXRzIDMyOjYzIG9mIHJheCwgcmR4ICovCisJdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9IGRhdGEgJiAtMXU7CisJdmNwdS0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA9IChkYXRhID4+IDMyKSAmIC0xdTsKKwlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhbmRsZV93cm1zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCXUzMiBlY3ggPSB2Y3B1LT5yZWdzW1ZDUFVfUkVHU19SQ1hdOworCXU2NCBkYXRhID0gKHZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JBWF0gJiAtMXUpCisJCXwgKCh1NjQpKHZjcHUtPnJlZ3NbVkNQVV9SRUdTX1JEWF0gJiAtMXUpIDw8IDMyKTsKKworCWlmICh2bXhfc2V0X21zcih2Y3B1LCBlY3gsIGRhdGEpICE9IDApIHsKKwkJdm14X2luamVjdF9ncCh2Y3B1LCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfaW50ZXJydXB0X3dpbmRvdyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICAgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJLyogVHVybiBvZmYgaW50ZXJydXB0IHdpbmRvdyByZXBvcnRpbmcuICovCisJdm1jc193cml0ZTMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wsCisJCSAgICAgdm1jc19yZWFkMzIoQ1BVX0JBU0VEX1ZNX0VYRUNfQ09OVFJPTCkKKwkJICAgICAmIH5DUFVfQkFTRURfVklSVFVBTF9JTlRSX1BFTkRJTkcpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9oYWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwlpZiAodmNwdS0+aXJxX3N1bW1hcnkgJiYgKHZtY3NfcmVhZGwoR1VFU1RfUkZMQUdTKSAmIFg4Nl9FRkxBR1NfSUYpKQorCQlyZXR1cm4gMTsKKworCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSExUOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGV4aXQgaGFuZGxlcnMgcmV0dXJuIDEgaWYgdGhlIGV4aXQgd2FzIGhhbmRsZWQgZnVsbHkgYW5kIGd1ZXN0IGV4ZWN1dGlvbgorICogbWF5IHJlc3VtZS4gIE90aGVyd2lzZSB0aGV5IHNldCB0aGUga3ZtX3J1biBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgd2hhdCBuZWVkcworICogdG8gYmUgZG9uZSB0byB1c2Vyc3BhY2UgYW5kIHJldHVybiAwLgorICovCitzdGF0aWMgaW50ICgqa3ZtX3ZteF9leGl0X2hhbmRsZXJzW10pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgICAgICBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikgPSB7CisJW0VYSVRfUkVBU09OX0VYQ0VQVElPTl9OTUldICAgICAgICAgICA9IGhhbmRsZV9leGNlcHRpb24sCisJW0VYSVRfUkVBU09OX0VYVEVSTkFMX0lOVEVSUlVQVF0gICAgICA9IGhhbmRsZV9leHRlcm5hbF9pbnRlcnJ1cHQsCisJW0VYSVRfUkVBU09OX0lPX0lOU1RSVUNUSU9OXSAgICAgICAgICA9IGhhbmRsZV9pbywKKwlbRVhJVF9SRUFTT05fSU5WTFBHXSAgICAgICAgICAgICAgICAgID0gaGFuZGxlX2ludmxwZywKKwlbRVhJVF9SRUFTT05fQ1JfQUNDRVNTXSAgICAgICAgICAgICAgID0gaGFuZGxlX2NyLAorCVtFWElUX1JFQVNPTl9EUl9BQ0NFU1NdICAgICAgICAgICAgICAgPSBoYW5kbGVfZHIsCisJW0VYSVRfUkVBU09OX0NQVUlEXSAgICAgICAgICAgICAgICAgICA9IGhhbmRsZV9jcHVpZCwKKwlbRVhJVF9SRUFTT05fTVNSX1JFQURdICAgICAgICAgICAgICAgID0gaGFuZGxlX3JkbXNyLAorCVtFWElUX1JFQVNPTl9NU1JfV1JJVEVdICAgICAgICAgICAgICAgPSBoYW5kbGVfd3Jtc3IsCisJW0VYSVRfUkVBU09OX1BFTkRJTkdfSU5URVJSVVBUXSAgICAgICA9IGhhbmRsZV9pbnRlcnJ1cHRfd2luZG93LAorCVtFWElUX1JFQVNPTl9ITFRdICAgICAgICAgICAgICAgICAgICAgPSBoYW5kbGVfaGFsdCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQga3ZtX3ZteF9tYXhfZXhpdF9oYW5kbGVycyA9CisJc2l6ZW9mKGt2bV92bXhfZXhpdF9oYW5kbGVycykgLyBzaXplb2YoKmt2bV92bXhfZXhpdF9oYW5kbGVycyk7CisKKy8qCisgKiBUaGUgZ3Vlc3QgaGFzIGV4aXRlZC4gIFNlZSBpZiB3ZSBjYW4gZml4IGl0IG9yIGlmIHdlIG5lZWQgdXNlcnNwYWNlCisgKiBhc3Npc3RhbmNlLgorICovCitzdGF0aWMgaW50IGt2bV9oYW5kbGVfZXhpdChzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXUzMiB2ZWN0b3JpbmdfaW5mbyA9IHZtY3NfcmVhZDMyKElEVF9WRUNUT1JJTkdfSU5GT19GSUVMRCk7CisJdTMyIGV4aXRfcmVhc29uID0gdm1jc19yZWFkMzIoVk1fRVhJVF9SRUFTT04pOworCisJaWYgKCAodmVjdG9yaW5nX2luZm8gJiBWRUNUT1JJTkdfSU5GT19WQUxJRF9NQVNLKSAmJgorCQkJCWV4aXRfcmVhc29uICE9IEVYSVRfUkVBU09OX0VYQ0VQVElPTl9OTUkgKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5leHBlY3RlZCwgdmFsaWQgdmVjdG9yaW5nIGluZm8gYW5kICIKKwkJICAgICAgICJleGl0IHJlYXNvbiBpcyAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIGV4aXRfcmVhc29uKTsKKwlrdm1fcnVuLT5pbnN0cnVjdGlvbl9sZW5ndGggPSB2bWNzX3JlYWQzMihWTV9FWElUX0lOU1RSVUNUSU9OX0xFTik7CisJaWYgKGV4aXRfcmVhc29uIDwga3ZtX3ZteF9tYXhfZXhpdF9oYW5kbGVycworCSAgICAmJiBrdm1fdm14X2V4aXRfaGFuZGxlcnNbZXhpdF9yZWFzb25dKQorCQlyZXR1cm4ga3ZtX3ZteF9leGl0X2hhbmRsZXJzW2V4aXRfcmVhc29uXSh2Y3B1LCBrdm1fcnVuKTsKKwllbHNlIHsKKwkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9VTktOT1dOOworCQlrdm1fcnVuLT5ody5oYXJkd2FyZV9leGl0X3JlYXNvbiA9IGV4aXRfcmVhc29uOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bXhfdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKK3sKKwl1OCBmYWlsOworCXUxNiBmc19zZWwsIGdzX3NlbCwgbGR0X3NlbDsKKwlpbnQgZnNfZ3NfbGR0X3JlbG9hZF9uZWVkZWQ7CisKK2FnYWluOgorCS8qCisJICogU2V0IGhvc3QgZnMgYW5kIGdzIHNlbGVjdG9ycy4gIFVuZm9ydHVuYXRlbHksIDIyLjIuMyBkb2VzIG5vdAorCSAqIGFsbG93IHNlZ21lbnQgc2VsZWN0b3JzIHdpdGggY3BsID4gMCBvciB0aSA9PSAxLgorCSAqLworCWZzX3NlbCA9IHJlYWRfZnMoKTsKKwlnc19zZWwgPSByZWFkX2dzKCk7CisJbGR0X3NlbCA9IHJlYWRfbGR0KCk7CisJZnNfZ3NfbGR0X3JlbG9hZF9uZWVkZWQgPSAoZnNfc2VsICYgNykgfCAoZ3Nfc2VsICYgNykgfCBsZHRfc2VsOworCWlmICghZnNfZ3NfbGR0X3JlbG9hZF9uZWVkZWQpIHsKKwkJdm1jc193cml0ZTE2KEhPU1RfRlNfU0VMRUNUT1IsIGZzX3NlbCk7CisJCXZtY3Nfd3JpdGUxNihIT1NUX0dTX1NFTEVDVE9SLCBnc19zZWwpOworCX0gZWxzZSB7CisJCXZtY3Nfd3JpdGUxNihIT1NUX0ZTX1NFTEVDVE9SLCAwKTsKKwkJdm1jc193cml0ZTE2KEhPU1RfR1NfU0VMRUNUT1IsIDApOworCX0KKworI2lmZGVmIENPTkZJR19YODZfNjQKKwl2bWNzX3dyaXRlbChIT1NUX0ZTX0JBU0UsIHJlYWRfbXNyKE1TUl9GU19CQVNFKSk7CisJdm1jc193cml0ZWwoSE9TVF9HU19CQVNFLCByZWFkX21zcihNU1JfR1NfQkFTRSkpOworI2Vsc2UKKwl2bWNzX3dyaXRlbChIT1NUX0ZTX0JBU0UsIHNlZ21lbnRfYmFzZShmc19zZWwpKTsKKwl2bWNzX3dyaXRlbChIT1NUX0dTX0JBU0UsIHNlZ21lbnRfYmFzZShnc19zZWwpKTsKKyNlbmRpZgorCisJaWYgKHZjcHUtPmlycV9zdW1tYXJ5ICYmCisJICAgICEodm1jc19yZWFkMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxEKSAmIElOVFJfSU5GT19WQUxJRF9NQVNLKSkKKwkJa3ZtX3RyeV9pbmplY3RfaXJxKHZjcHUpOworCisJaWYgKHZjcHUtPmd1ZXN0X2RlYnVnLmVuYWJsZWQpCisJCWt2bV9ndWVzdF9kZWJ1Z19wcmUodmNwdSk7CisKKwlmeF9zYXZlKHZjcHUtPmhvc3RfZnhfaW1hZ2UpOworCWZ4X3Jlc3RvcmUodmNwdS0+Z3Vlc3RfZnhfaW1hZ2UpOworCisJc2F2ZV9tc3JzKHZjcHUtPmhvc3RfbXNycywgdmNwdS0+bm1zcnMpOworCWxvYWRfbXNycyh2Y3B1LT5ndWVzdF9tc3JzLCBOUl9CQURfTVNSUyk7CisKKwlhc20gKAorCQkvKiBTdG9yZSBob3N0IHJlZ2lzdGVycyAqLworCQkicHVzaGYgXG5cdCIKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCSJwdXNoICUlcmF4OyBwdXNoICUlcmJ4OyBwdXNoICUlcmR4OyIKKwkJInB1c2ggJSVyc2k7IHB1c2ggJSVyZGk7IHB1c2ggJSVyYnA7IgorCQkicHVzaCAlJXI4OyAgcHVzaCAlJXI5OyAgcHVzaCAlJXIxMDsgcHVzaCAlJXIxMTsiCisJCSJwdXNoICUlcjEyOyBwdXNoICUlcjEzOyBwdXNoICUlcjE0OyBwdXNoICUlcjE1OyIKKwkJInB1c2ggJSVyY3ggXG5cdCIKKwkJQVNNX1ZNWF9WTVdSSVRFX1JTUF9SRFggIlxuXHQiCisjZWxzZQorCQkicHVzaGE7IHB1c2ggJSVlY3ggXG5cdCIKKwkJQVNNX1ZNWF9WTVdSSVRFX1JTUF9SRFggIlxuXHQiCisjZW5kaWYKKwkJLyogQ2hlY2sgaWYgdm1sYXVuY2ggb2Ygdm1yZXN1bWUgaXMgbmVlZGVkICovCisJCSJjbXAgJDAsICUxIFxuXHQiCisJCS8qIExvYWQgZ3Vlc3QgcmVnaXN0ZXJzLiAgRG9uJ3QgY2xvYmJlciBmbGFncy4gKi8KKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCSJtb3YgJWNbY3IyXSglMyksICUlcmF4IFxuXHQiCisJCSJtb3YgJSVyYXgsICUlY3IyIFxuXHQiCisJCSJtb3YgJWNbcmF4XSglMyksICUlcmF4IFxuXHQiCisJCSJtb3YgJWNbcmJ4XSglMyksICUlcmJ4IFxuXHQiCisJCSJtb3YgJWNbcmR4XSglMyksICUlcmR4IFxuXHQiCisJCSJtb3YgJWNbcnNpXSglMyksICUlcnNpIFxuXHQiCisJCSJtb3YgJWNbcmRpXSglMyksICUlcmRpIFxuXHQiCisJCSJtb3YgJWNbcmJwXSglMyksICUlcmJwIFxuXHQiCisJCSJtb3YgJWNbcjhdKCUzKSwgICUlcjggIFxuXHQiCisJCSJtb3YgJWNbcjldKCUzKSwgICUlcjkgIFxuXHQiCisJCSJtb3YgJWNbcjEwXSglMyksICUlcjEwIFxuXHQiCisJCSJtb3YgJWNbcjExXSglMyksICUlcjExIFxuXHQiCisJCSJtb3YgJWNbcjEyXSglMyksICUlcjEyIFxuXHQiCisJCSJtb3YgJWNbcjEzXSglMyksICUlcjEzIFxuXHQiCisJCSJtb3YgJWNbcjE0XSglMyksICUlcjE0IFxuXHQiCisJCSJtb3YgJWNbcjE1XSglMyksICUlcjE1IFxuXHQiCisJCSJtb3YgJWNbcmN4XSglMyksICUlcmN4IFxuXHQiIC8qIGtpbGxzICUzIChyY3gpICovCisjZWxzZQorCQkibW92ICVjW2NyMl0oJTMpLCAlJWVheCBcblx0IgorCQkibW92ICUlZWF4LCAgICUlY3IyIFxuXHQiCisJCSJtb3YgJWNbcmF4XSglMyksICUlZWF4IFxuXHQiCisJCSJtb3YgJWNbcmJ4XSglMyksICUlZWJ4IFxuXHQiCisJCSJtb3YgJWNbcmR4XSglMyksICUlZWR4IFxuXHQiCisJCSJtb3YgJWNbcnNpXSglMyksICUlZXNpIFxuXHQiCisJCSJtb3YgJWNbcmRpXSglMyksICUlZWRpIFxuXHQiCisJCSJtb3YgJWNbcmJwXSglMyksICUlZWJwIFxuXHQiCisJCSJtb3YgJWNbcmN4XSglMyksICUlZWN4IFxuXHQiIC8qIGtpbGxzICUzIChlY3gpICovCisjZW5kaWYKKwkJLyogRW50ZXIgZ3Vlc3QgbW9kZSAqLworCQkiam5lIGxhdW5jaGVkIFxuXHQiCisJCUFTTV9WTVhfVk1MQVVOQ0ggIlxuXHQiCisJCSJqbXAga3ZtX3ZteF9yZXR1cm4gXG5cdCIKKwkJImxhdW5jaGVkOiAiIEFTTV9WTVhfVk1SRVNVTUUgIlxuXHQiCisJCSIuZ2xvYmwga3ZtX3ZteF9yZXR1cm4gXG5cdCIKKwkJImt2bV92bXhfcmV0dXJuOiAiCisJCS8qIFNhdmUgZ3Vlc3QgcmVnaXN0ZXJzLCBsb2FkIGhvc3QgcmVnaXN0ZXJzLCBrZWVwIGZsYWdzICovCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQkieGNoZyAlMywgICAgIDAoJSVyc3ApIFxuXHQiCisJCSJtb3YgJSVyYXgsICVjW3JheF0oJTMpIFxuXHQiCisJCSJtb3YgJSVyYngsICVjW3JieF0oJTMpIFxuXHQiCisJCSJwdXNocSAwKCUlcnNwKTsgcG9wcSAlY1tyY3hdKCUzKSBcblx0IgorCQkibW92ICUlcmR4LCAlY1tyZHhdKCUzKSBcblx0IgorCQkibW92ICUlcnNpLCAlY1tyc2ldKCUzKSBcblx0IgorCQkibW92ICUlcmRpLCAlY1tyZGldKCUzKSBcblx0IgorCQkibW92ICUlcmJwLCAlY1tyYnBdKCUzKSBcblx0IgorCQkibW92ICUlcjgsICAlY1tyOF0oJTMpIFxuXHQiCisJCSJtb3YgJSVyOSwgICVjW3I5XSglMykgXG5cdCIKKwkJIm1vdiAlJXIxMCwgJWNbcjEwXSglMykgXG5cdCIKKwkJIm1vdiAlJXIxMSwgJWNbcjExXSglMykgXG5cdCIKKwkJIm1vdiAlJXIxMiwgJWNbcjEyXSglMykgXG5cdCIKKwkJIm1vdiAlJXIxMywgJWNbcjEzXSglMykgXG5cdCIKKwkJIm1vdiAlJXIxNCwgJWNbcjE0XSglMykgXG5cdCIKKwkJIm1vdiAlJXIxNSwgJWNbcjE1XSglMykgXG5cdCIKKwkJIm1vdiAlJWNyMiwgJSVyYXggICBcblx0IgorCQkibW92ICUlcmF4LCAlY1tjcjJdKCUzKSBcblx0IgorCQkibW92IDAoJSVyc3ApLCAlMyBcblx0IgorCisJCSJwb3AgICUlcmN4OyBwb3AgICUlcjE1OyBwb3AgICUlcjE0OyBwb3AgICUlcjEzOyBwb3AgICUlcjEyOyIKKwkJInBvcCAgJSVyMTE7IHBvcCAgJSVyMTA7IHBvcCAgJSVyOTsgIHBvcCAgJSVyODsiCisJCSJwb3AgICUlcmJwOyBwb3AgICUlcmRpOyBwb3AgICUlcnNpOyIKKwkJInBvcCAgJSVyZHg7IHBvcCAgJSVyYng7IHBvcCAgJSVyYXggXG5cdCIKKyNlbHNlCisJCSJ4Y2hnICUzLCAwKCUlZXNwKSBcblx0IgorCQkibW92ICUlZWF4LCAlY1tyYXhdKCUzKSBcblx0IgorCQkibW92ICUlZWJ4LCAlY1tyYnhdKCUzKSBcblx0IgorCQkicHVzaGwgMCglJWVzcCk7IHBvcGwgJWNbcmN4XSglMykgXG5cdCIKKwkJIm1vdiAlJWVkeCwgJWNbcmR4XSglMykgXG5cdCIKKwkJIm1vdiAlJWVzaSwgJWNbcnNpXSglMykgXG5cdCIKKwkJIm1vdiAlJWVkaSwgJWNbcmRpXSglMykgXG5cdCIKKwkJIm1vdiAlJWVicCwgJWNbcmJwXSglMykgXG5cdCIKKwkJIm1vdiAlJWNyMiwgJSVlYXggIFxuXHQiCisJCSJtb3YgJSVlYXgsICVjW2NyMl0oJTMpIFxuXHQiCisJCSJtb3YgMCglJWVzcCksICUzIFxuXHQiCisKKwkJInBvcCAlJWVjeDsgcG9wYSBcblx0IgorI2VuZGlmCisJCSJzZXRiZSAlMCBcblx0IgorCQkicG9wZiBcblx0IgorCSAgICAgIDogIj1nIiAoZmFpbCkKKwkgICAgICA6ICJyIih2Y3B1LT5sYXVuY2hlZCksICJkIigodW5zaWduZWQgbG9uZylIT1NUX1JTUCksCisJCSJjIih2Y3B1KSwKKwkJW3JheF0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SQVhdKSksCisJCVtyYnhdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUkJYXSkpLAorCQlbcmN4XSJpIihvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIHJlZ3NbVkNQVV9SRUdTX1JDWF0pKSwKKwkJW3JkeF0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SRFhdKSksCisJCVtyc2ldImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUlNJXSkpLAorCQlbcmRpXSJpIihvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIHJlZ3NbVkNQVV9SRUdTX1JESV0pKSwKKwkJW3JicF0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SQlBdKSksCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQlbcjggXSJpIihvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIHJlZ3NbVkNQVV9SRUdTX1I4IF0pKSwKKwkJW3I5IF0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SOSBdKSksCisJCVtyMTBdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjEwXSkpLAorCQlbcjExXSJpIihvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIHJlZ3NbVkNQVV9SRUdTX1IxMV0pKSwKKwkJW3IxMl0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SMTJdKSksCisJCVtyMTNdImkiKG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgcmVnc1tWQ1BVX1JFR1NfUjEzXSkpLAorCQlbcjE0XSJpIihvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIHJlZ3NbVkNQVV9SRUdTX1IxNF0pKSwKKwkJW3IxNV0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCByZWdzW1ZDUFVfUkVHU19SMTVdKSksCisjZW5kaWYKKwkJW2NyMl0iaSIob2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBjcjIpKQorCSAgICAgIDogImNjIiwgIm1lbW9yeSIgKTsKKworCSsra3ZtX3N0YXQuZXhpdHM7CisKKwlzYXZlX21zcnModmNwdS0+Z3Vlc3RfbXNycywgTlJfQkFEX01TUlMpOworCWxvYWRfbXNycyh2Y3B1LT5ob3N0X21zcnMsIE5SX0JBRF9NU1JTKTsKKworCWZ4X3NhdmUodmNwdS0+Z3Vlc3RfZnhfaW1hZ2UpOworCWZ4X3Jlc3RvcmUodmNwdS0+aG9zdF9meF9pbWFnZSk7CisKKyNpZm5kZWYgQ09ORklHX1g4Nl82NAorCWFzbSAoIm1vdiAlMCwgJSVkczsgbW92ICUwLCAlJWVzIiA6IDogInIiKF9fVVNFUl9EUykpOworI2VuZGlmCisKKwlrdm1fcnVuLT5leGl0X3R5cGUgPSAwOworCWlmIChmYWlsKSB7CisJCWt2bV9ydW4tPmV4aXRfdHlwZSA9IEtWTV9FWElUX1RZUEVfRkFJTF9FTlRSWTsKKwkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSB2bWNzX3JlYWQzMihWTV9JTlNUUlVDVElPTl9FUlJPUik7CisJfSBlbHNlIHsKKwkJaWYgKGZzX2dzX2xkdF9yZWxvYWRfbmVlZGVkKSB7CisJCQlsb2FkX2xkdChsZHRfc2VsKTsKKwkJCWxvYWRfZnMoZnNfc2VsKTsKKwkJCS8qCisJCQkgKiBJZiB3ZSBoYXZlIHRvIHJlbG9hZCBncywgd2UgbXVzdCB0YWtlIGNhcmUgdG8KKwkJCSAqIHByZXNlcnZlIG91ciBncyBiYXNlLgorCQkJICovCisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJbG9hZF9ncyhnc19zZWwpOworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJCXdybXNybChNU1JfR1NfQkFTRSwgdm1jc19yZWFkbChIT1NUX0dTX0JBU0UpKTsKKyNlbmRpZgorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJCQlyZWxvYWRfdHNzKCk7CisJCX0KKwkJdmNwdS0+bGF1bmNoZWQgPSAxOworCQlrdm1fcnVuLT5leGl0X3R5cGUgPSBLVk1fRVhJVF9UWVBFX1ZNX0VYSVQ7CisJCWlmIChrdm1faGFuZGxlX2V4aXQoa3ZtX3J1biwgdmNwdSkpIHsKKwkJCS8qIEdpdmUgc2NoZWR1bGVyIGEgY2hhbmdlIHRvIHJlc2NoZWR1bGUuICovCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkrK2t2bV9zdGF0LnNpZ25hbF9leGl0czsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCQkJa3ZtX3Jlc2NoZWQodmNwdSk7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXhfZmx1c2hfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2bWNzX3dyaXRlbChHVUVTVF9DUjMsIHZtY3NfcmVhZGwoR1VFU1RfQ1IzKSk7Cit9CisKK3N0YXRpYyB2b2lkIHZteF9pbmplY3RfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICB1MzIgZXJyX2NvZGUpCit7CisJdTMyIHZlY3RfaW5mbyA9IHZtY3NfcmVhZDMyKElEVF9WRUNUT1JJTkdfSU5GT19GSUVMRCk7CisKKwkrK2t2bV9zdGF0LnBmX2d1ZXN0OworCisJaWYgKGlzX3BhZ2VfZmF1bHQodmVjdF9pbmZvKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaW5qZWN0X3BhZ2VfZmF1bHQ6ICIKKwkJICAgICAgICJkb3VibGUgZmF1bHQgMHglbHggQCAweCVseFxuIiwKKwkJICAgICAgIGFkZHIsIHZtY3NfcmVhZGwoR1VFU1RfUklQKSk7CisJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9FWENFUFRJT05fRVJST1JfQ09ERSwgMCk7CisJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9JTlRSX0lORk9fRklFTEQsCisJCQkgICAgIERGX1ZFQ1RPUiB8CisJCQkgICAgIElOVFJfVFlQRV9FWENFUFRJT04gfAorCQkJICAgICBJTlRSX0lORk9fREVMSUVWRVJfQ09ERV9NQVNLIHwKKwkJCSAgICAgSU5UUl9JTkZPX1ZBTElEX01BU0spOworCQlyZXR1cm47CisJfQorCXZjcHUtPmNyMiA9IGFkZHI7CisJdm1jc193cml0ZTMyKFZNX0VOVFJZX0VYQ0VQVElPTl9FUlJPUl9DT0RFLCBlcnJfY29kZSk7CisJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKKwkJICAgICBQRl9WRUNUT1IgfAorCQkgICAgIElOVFJfVFlQRV9FWENFUFRJT04gfAorCQkgICAgIElOVFJfSU5GT19ERUxJRVZFUl9DT0RFX01BU0sgfAorCQkgICAgIElOVFJfSU5GT19WQUxJRF9NQVNLKTsKKworfQorCitzdGF0aWMgdm9pZCB2bXhfZnJlZV92bWNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAodmNwdS0+dm1jcykgeworCQlvbl9lYWNoX2NwdShfX3ZjcHVfY2xlYXIsIHZjcHUsIDAsIDEpOworCQlmcmVlX3ZtY3ModmNwdS0+dm1jcyk7CisJCXZjcHUtPnZtY3MgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgdm14X2ZyZWVfdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdm14X2ZyZWVfdm1jcyh2Y3B1KTsKK30KKworc3RhdGljIGludCB2bXhfY3JlYXRlX3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2bWNzICp2bWNzOworCisJdm1jcyA9IGFsbG9jX3ZtY3MoKTsKKwlpZiAoIXZtY3MpCisJCXJldHVybiAtRU5PTUVNOworCXZtY3NfY2xlYXIodm1jcyk7CisJdmNwdS0+dm1jcyA9IHZtY3M7CisJdmNwdS0+bGF1bmNoZWQgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGt2bV9hcmNoX29wcyB2bXhfYXJjaF9vcHMgPSB7CisJLmNwdV9oYXNfa3ZtX3N1cHBvcnQgPSBjcHVfaGFzX2t2bV9zdXBwb3J0LAorCS5kaXNhYmxlZF9ieV9iaW9zID0gdm14X2Rpc2FibGVkX2J5X2Jpb3MsCisJLmhhcmR3YXJlX3NldHVwID0gaGFyZHdhcmVfc2V0dXAsCisJLmhhcmR3YXJlX3Vuc2V0dXAgPSBoYXJkd2FyZV91bnNldHVwLAorCS5oYXJkd2FyZV9lbmFibGUgPSBoYXJkd2FyZV9lbmFibGUsCisJLmhhcmR3YXJlX2Rpc2FibGUgPSBoYXJkd2FyZV9kaXNhYmxlLAorCisJLnZjcHVfY3JlYXRlID0gdm14X2NyZWF0ZV92Y3B1LAorCS52Y3B1X2ZyZWUgPSB2bXhfZnJlZV92Y3B1LAorCisJLnZjcHVfbG9hZCA9IHZteF92Y3B1X2xvYWQsCisJLnZjcHVfcHV0ID0gdm14X3ZjcHVfcHV0LAorCisJLnNldF9ndWVzdF9kZWJ1ZyA9IHNldF9ndWVzdF9kZWJ1ZywKKwkuZ2V0X21zciA9IHZteF9nZXRfbXNyLAorCS5zZXRfbXNyID0gdm14X3NldF9tc3IsCisJLmdldF9zZWdtZW50X2Jhc2UgPSB2bXhfZ2V0X3NlZ21lbnRfYmFzZSwKKwkuZ2V0X3NlZ21lbnQgPSB2bXhfZ2V0X3NlZ21lbnQsCisJLnNldF9zZWdtZW50ID0gdm14X3NldF9zZWdtZW50LAorCS5pc19sb25nX21vZGUgPSB2bXhfaXNfbG9uZ19tb2RlLAorCS5nZXRfY3NfZGJfbF9iaXRzID0gdm14X2dldF9jc19kYl9sX2JpdHMsCisJLnNldF9jcjAgPSB2bXhfc2V0X2NyMCwKKwkuc2V0X2NyMF9ub19tb2Rlc3dpdGNoID0gdm14X3NldF9jcjBfbm9fbW9kZXN3aXRjaCwKKwkuc2V0X2NyMyA9IHZteF9zZXRfY3IzLAorCS5zZXRfY3I0ID0gdm14X3NldF9jcjQsCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS5zZXRfZWZlciA9IHZteF9zZXRfZWZlciwKKyNlbmRpZgorCS5nZXRfaWR0ID0gdm14X2dldF9pZHQsCisJLnNldF9pZHQgPSB2bXhfc2V0X2lkdCwKKwkuZ2V0X2dkdCA9IHZteF9nZXRfZ2R0LAorCS5zZXRfZ2R0ID0gdm14X3NldF9nZHQsCisJLmNhY2hlX3JlZ3MgPSB2Y3B1X2xvYWRfcnNwX3JpcCwKKwkuZGVjYWNoZV9yZWdzID0gdmNwdV9wdXRfcnNwX3JpcCwKKwkuZ2V0X3JmbGFncyA9IHZteF9nZXRfcmZsYWdzLAorCS5zZXRfcmZsYWdzID0gdm14X3NldF9yZmxhZ3MsCisKKwkudGxiX2ZsdXNoID0gdm14X2ZsdXNoX3RsYiwKKwkuaW5qZWN0X3BhZ2VfZmF1bHQgPSB2bXhfaW5qZWN0X3BhZ2VfZmF1bHQsCisKKwkuaW5qZWN0X2dwID0gdm14X2luamVjdF9ncCwKKworCS5ydW4gPSB2bXhfdmNwdV9ydW4sCisJLnNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24gPSBza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uLAorCS52Y3B1X3NldHVwID0gdm14X3ZjcHVfc2V0dXAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB2bXhfaW5pdCh2b2lkKQoreworCXJldHVybiBrdm1faW5pdF9hcmNoKCZ2bXhfYXJjaF9vcHMsIFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZteF9leGl0KHZvaWQpCit7CisJa3ZtX2V4aXRfYXJjaCgpOworfQorCittb2R1bGVfaW5pdCh2bXhfaW5pdCkKK21vZHVsZV9leGl0KHZteF9leGl0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0vdm14LmggYi9kcml2ZXJzL2t2bS92bXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTcyNzgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9rdm0vdm14LmgKQEAgLTAsMCArMSwyOTYgQEAKKyNpZm5kZWYgVk1YX0gKKyNkZWZpbmUgVk1YX0gKKworLyoKKyAqIHZteC5oOiBWTVggQXJjaGl0ZWN0dXJlIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIEEgZmV3IHJhbmRvbSBhZGRpdGlvbnMgYXJlOgorICogQ29weXJpZ2h0IChDKSAyMDA2IFF1bXJhbmV0CisgKiAgICBBdmkgS2l2aXR5IDxhdmlAcXVtcmFuZXQuY29tPgorICogICAgWWFuaXYgS2FtYXkgPHlhbml2QHF1bXJhbmV0LmNvbT4KKyAqCisgKi8KKworI2RlZmluZSBDUFVfQkFTRURfVklSVFVBTF9JTlRSX1BFTkRJTkcgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ1BVX0JBU0VEX1VTRV9UU0NfT0ZGU0VUSU5HICAgICAweDAwMDAwMDA4CisjZGVmaW5lIENQVV9CQVNFRF9ITFRfRVhJVElORyAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBDUFVfQkFTRURfSU5WRFBHX0VYSVRJTkcgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQ1BVX0JBU0VEX01XQUlUX0VYSVRJTkcgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIENQVV9CQVNFRF9SRFBNQ19FWElUSU5HICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBDUFVfQkFTRURfUkRUU0NfRVhJVElORyAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQ1BVX0JBU0VEX0NSOF9MT0FEX0VYSVRJTkcgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIENQVV9CQVNFRF9DUjhfU1RPUkVfRVhJVElORyAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBDUFVfQkFTRURfVFBSX1NIQURPVyAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgQ1BVX0JBU0VEX01PVl9EUl9FWElUSU5HICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIENQVV9CQVNFRF9VTkNPTkRfSU9fRVhJVElORyAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBDUFVfQkFTRURfQUNUSVZBVEVfSU9fQklUTUFQICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgQ1BVX0JBU0VEX01TUl9CSVRNQVBTICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIENQVV9CQVNFRF9NT05JVE9SX0VYSVRJTkcgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBDUFVfQkFTRURfUEFVU0VfRVhJVElORyAgICAgICAgIDB4NDAwMDAwMDAKKworI2RlZmluZSBQSU5fQkFTRURfRVhUX0lOVFJfTUFTSyAweDEKKyNkZWZpbmUgUElOX0JBU0VEX05NSV9FWElUSU5HICAgMHg4CisKKyNkZWZpbmUgVk1fRVhJVF9BQ0tfSU5UUl9PTl9FWElUICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFZNX0VYSVRfSE9TVF9BRERfU1BBQ0VfU0laRSAgICAgMHgwMDAwMDIwMAorCisKKy8qIFZNQ1MgRW5jb2RpbmdzICovCitlbnVtIHZtY3NfZmllbGQgeworCUdVRVNUX0VTX1NFTEVDVE9SICAgICAgICAgICAgICAgPSAweDAwMDAwODAwLAorCUdVRVNUX0NTX1NFTEVDVE9SICAgICAgICAgICAgICAgPSAweDAwMDAwODAyLAorCUdVRVNUX1NTX1NFTEVDVE9SICAgICAgICAgICAgICAgPSAweDAwMDAwODA0LAorCUdVRVNUX0RTX1NFTEVDVE9SICAgICAgICAgICAgICAgPSAweDAwMDAwODA2LAorCUdVRVNUX0ZTX1NFTEVDVE9SICAgICAgICAgICAgICAgPSAweDAwMDAwODA4LAorCUdVRVNUX0dTX1NFTEVDVE9SICAgICAgICAgICAgICAgPSAweDAwMDAwODBhLAorCUdVRVNUX0xEVFJfU0VMRUNUT1IgICAgICAgICAgICAgPSAweDAwMDAwODBjLAorCUdVRVNUX1RSX1NFTEVDVE9SICAgICAgICAgICAgICAgPSAweDAwMDAwODBlLAorCUhPU1RfRVNfU0VMRUNUT1IgICAgICAgICAgICAgICAgPSAweDAwMDAwYzAwLAorCUhPU1RfQ1NfU0VMRUNUT1IgICAgICAgICAgICAgICAgPSAweDAwMDAwYzAyLAorCUhPU1RfU1NfU0VMRUNUT1IgICAgICAgICAgICAgICAgPSAweDAwMDAwYzA0LAorCUhPU1RfRFNfU0VMRUNUT1IgICAgICAgICAgICAgICAgPSAweDAwMDAwYzA2LAorCUhPU1RfRlNfU0VMRUNUT1IgICAgICAgICAgICAgICAgPSAweDAwMDAwYzA4LAorCUhPU1RfR1NfU0VMRUNUT1IgICAgICAgICAgICAgICAgPSAweDAwMDAwYzBhLAorCUhPU1RfVFJfU0VMRUNUT1IgICAgICAgICAgICAgICAgPSAweDAwMDAwYzBjLAorCUlPX0JJVE1BUF9BICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDAwLAorCUlPX0JJVE1BUF9BX0hJR0ggICAgICAgICAgICAgICAgPSAweDAwMDAyMDAxLAorCUlPX0JJVE1BUF9CICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDAyLAorCUlPX0JJVE1BUF9CX0hJR0ggICAgICAgICAgICAgICAgPSAweDAwMDAyMDAzLAorCU1TUl9CSVRNQVAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDA0LAorCU1TUl9CSVRNQVBfSElHSCAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDA1LAorCVZNX0VYSVRfTVNSX1NUT1JFX0FERFIgICAgICAgICAgPSAweDAwMDAyMDA2LAorCVZNX0VYSVRfTVNSX1NUT1JFX0FERFJfSElHSCAgICAgPSAweDAwMDAyMDA3LAorCVZNX0VYSVRfTVNSX0xPQURfQUREUiAgICAgICAgICAgPSAweDAwMDAyMDA4LAorCVZNX0VYSVRfTVNSX0xPQURfQUREUl9ISUdIICAgICAgPSAweDAwMDAyMDA5LAorCVZNX0VOVFJZX01TUl9MT0FEX0FERFIgICAgICAgICAgPSAweDAwMDAyMDBhLAorCVZNX0VOVFJZX01TUl9MT0FEX0FERFJfSElHSCAgICAgPSAweDAwMDAyMDBiLAorCVRTQ19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDEwLAorCVRTQ19PRkZTRVRfSElHSCAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDExLAorCVZJUlRVQUxfQVBJQ19QQUdFX0FERFIgICAgICAgICAgPSAweDAwMDAyMDEyLAorCVZJUlRVQUxfQVBJQ19QQUdFX0FERFJfSElHSCAgICAgPSAweDAwMDAyMDEzLAorCVZNQ1NfTElOS19QT0lOVEVSICAgICAgICAgICAgICAgPSAweDAwMDAyODAwLAorCVZNQ1NfTElOS19QT0lOVEVSX0hJR0ggICAgICAgICAgPSAweDAwMDAyODAxLAorCUdVRVNUX0lBMzJfREVCVUdDVEwgICAgICAgICAgICAgPSAweDAwMDAyODAyLAorCUdVRVNUX0lBMzJfREVCVUdDVExfSElHSCAgICAgICAgPSAweDAwMDAyODAzLAorCVBJTl9CQVNFRF9WTV9FWEVDX0NPTlRST0wgICAgICAgPSAweDAwMDA0MDAwLAorCUNQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wgICAgICAgPSAweDAwMDA0MDAyLAorCUVYQ0VQVElPTl9CSVRNQVAgICAgICAgICAgICAgICAgPSAweDAwMDA0MDA0LAorCVBBR0VfRkFVTFRfRVJST1JfQ09ERV9NQVNLICAgICAgPSAweDAwMDA0MDA2LAorCVBBR0VfRkFVTFRfRVJST1JfQ09ERV9NQVRDSCAgICAgPSAweDAwMDA0MDA4LAorCUNSM19UQVJHRVRfQ09VTlQgICAgICAgICAgICAgICAgPSAweDAwMDA0MDBhLAorCVZNX0VYSVRfQ09OVFJPTFMgICAgICAgICAgICAgICAgPSAweDAwMDA0MDBjLAorCVZNX0VYSVRfTVNSX1NUT1JFX0NPVU5UICAgICAgICAgPSAweDAwMDA0MDBlLAorCVZNX0VYSVRfTVNSX0xPQURfQ09VTlQgICAgICAgICAgPSAweDAwMDA0MDEwLAorCVZNX0VOVFJZX0NPTlRST0xTICAgICAgICAgICAgICAgPSAweDAwMDA0MDEyLAorCVZNX0VOVFJZX01TUl9MT0FEX0NPVU5UICAgICAgICAgPSAweDAwMDA0MDE0LAorCVZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCAgICAgICAgPSAweDAwMDA0MDE2LAorCVZNX0VOVFJZX0VYQ0VQVElPTl9FUlJPUl9DT0RFICAgPSAweDAwMDA0MDE4LAorCVZNX0VOVFJZX0lOU1RSVUNUSU9OX0xFTiAgICAgICAgPSAweDAwMDA0MDFhLAorCVRQUl9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgPSAweDAwMDA0MDFjLAorCVNFQ09OREFSWV9WTV9FWEVDX0NPTlRST0wgICAgICAgPSAweDAwMDA0MDFlLAorCVZNX0lOU1RSVUNUSU9OX0VSUk9SICAgICAgICAgICAgPSAweDAwMDA0NDAwLAorCVZNX0VYSVRfUkVBU09OICAgICAgICAgICAgICAgICAgPSAweDAwMDA0NDAyLAorCVZNX0VYSVRfSU5UUl9JTkZPICAgICAgICAgICAgICAgPSAweDAwMDA0NDA0LAorCVZNX0VYSVRfSU5UUl9FUlJPUl9DT0RFICAgICAgICAgPSAweDAwMDA0NDA2LAorCUlEVF9WRUNUT1JJTkdfSU5GT19GSUVMRCAgICAgICAgPSAweDAwMDA0NDA4LAorCUlEVF9WRUNUT1JJTkdfRVJST1JfQ09ERSAgICAgICAgPSAweDAwMDA0NDBhLAorCVZNX0VYSVRfSU5TVFJVQ1RJT05fTEVOICAgICAgICAgPSAweDAwMDA0NDBjLAorCVZNWF9JTlNUUlVDVElPTl9JTkZPICAgICAgICAgICAgPSAweDAwMDA0NDBlLAorCUdVRVNUX0VTX0xJTUlUICAgICAgICAgICAgICAgICAgPSAweDAwMDA0ODAwLAorCUdVRVNUX0NTX0xJTUlUICAgICAgICAgICAgICAgICAgPSAweDAwMDA0ODAyLAorCUdVRVNUX1NTX0xJTUlUICAgICAgICAgICAgICAgICAgPSAweDAwMDA0ODA0LAorCUdVRVNUX0RTX0xJTUlUICAgICAgICAgICAgICAgICAgPSAweDAwMDA0ODA2LAorCUdVRVNUX0ZTX0xJTUlUICAgICAgICAgICAgICAgICAgPSAweDAwMDA0ODA4LAorCUdVRVNUX0dTX0xJTUlUICAgICAgICAgICAgICAgICAgPSAweDAwMDA0ODBhLAorCUdVRVNUX0xEVFJfTElNSVQgICAgICAgICAgICAgICAgPSAweDAwMDA0ODBjLAorCUdVRVNUX1RSX0xJTUlUICAgICAgICAgICAgICAgICAgPSAweDAwMDA0ODBlLAorCUdVRVNUX0dEVFJfTElNSVQgICAgICAgICAgICAgICAgPSAweDAwMDA0ODEwLAorCUdVRVNUX0lEVFJfTElNSVQgICAgICAgICAgICAgICAgPSAweDAwMDA0ODEyLAorCUdVRVNUX0VTX0FSX0JZVEVTICAgICAgICAgICAgICAgPSAweDAwMDA0ODE0LAorCUdVRVNUX0NTX0FSX0JZVEVTICAgICAgICAgICAgICAgPSAweDAwMDA0ODE2LAorCUdVRVNUX1NTX0FSX0JZVEVTICAgICAgICAgICAgICAgPSAweDAwMDA0ODE4LAorCUdVRVNUX0RTX0FSX0JZVEVTICAgICAgICAgICAgICAgPSAweDAwMDA0ODFhLAorCUdVRVNUX0ZTX0FSX0JZVEVTICAgICAgICAgICAgICAgPSAweDAwMDA0ODFjLAorCUdVRVNUX0dTX0FSX0JZVEVTICAgICAgICAgICAgICAgPSAweDAwMDA0ODFlLAorCUdVRVNUX0xEVFJfQVJfQllURVMgICAgICAgICAgICAgPSAweDAwMDA0ODIwLAorCUdVRVNUX1RSX0FSX0JZVEVTICAgICAgICAgICAgICAgPSAweDAwMDA0ODIyLAorCUdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTyAgICAgPSAweDAwMDA0ODI0LAorCUdVRVNUX0FDVElWSVRZX1NUQVRFICAgICAgICAgICAgPSAwWDAwMDA0ODI2LAorCUdVRVNUX1NZU0VOVEVSX0NTICAgICAgICAgICAgICAgPSAweDAwMDA0ODJBLAorCUhPU1RfSUEzMl9TWVNFTlRFUl9DUyAgICAgICAgICAgPSAweDAwMDA0YzAwLAorCUNSMF9HVUVTVF9IT1NUX01BU0sgICAgICAgICAgICAgPSAweDAwMDA2MDAwLAorCUNSNF9HVUVTVF9IT1NUX01BU0sgICAgICAgICAgICAgPSAweDAwMDA2MDAyLAorCUNSMF9SRUFEX1NIQURPVyAgICAgICAgICAgICAgICAgPSAweDAwMDA2MDA0LAorCUNSNF9SRUFEX1NIQURPVyAgICAgICAgICAgICAgICAgPSAweDAwMDA2MDA2LAorCUNSM19UQVJHRVRfVkFMVUUwICAgICAgICAgICAgICAgPSAweDAwMDA2MDA4LAorCUNSM19UQVJHRVRfVkFMVUUxICAgICAgICAgICAgICAgPSAweDAwMDA2MDBhLAorCUNSM19UQVJHRVRfVkFMVUUyICAgICAgICAgICAgICAgPSAweDAwMDA2MDBjLAorCUNSM19UQVJHRVRfVkFMVUUzICAgICAgICAgICAgICAgPSAweDAwMDA2MDBlLAorCUVYSVRfUVVBTElGSUNBVElPTiAgICAgICAgICAgICAgPSAweDAwMDA2NDAwLAorCUdVRVNUX0xJTkVBUl9BRERSRVNTICAgICAgICAgICAgPSAweDAwMDA2NDBhLAorCUdVRVNUX0NSMCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODAwLAorCUdVRVNUX0NSMyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODAyLAorCUdVRVNUX0NSNCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODA0LAorCUdVRVNUX0VTX0JBU0UgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODA2LAorCUdVRVNUX0NTX0JBU0UgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODA4LAorCUdVRVNUX1NTX0JBU0UgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODBhLAorCUdVRVNUX0RTX0JBU0UgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODBjLAorCUdVRVNUX0ZTX0JBU0UgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODBlLAorCUdVRVNUX0dTX0JBU0UgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODEwLAorCUdVRVNUX0xEVFJfQkFTRSAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODEyLAorCUdVRVNUX1RSX0JBU0UgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODE0LAorCUdVRVNUX0dEVFJfQkFTRSAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODE2LAorCUdVRVNUX0lEVFJfQkFTRSAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODE4LAorCUdVRVNUX0RSNyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODFhLAorCUdVRVNUX1JTUCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODFjLAorCUdVRVNUX1JJUCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODFlLAorCUdVRVNUX1JGTEFHUyAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2ODIwLAorCUdVRVNUX1BFTkRJTkdfREJHX0VYQ0VQVElPTlMgICAgPSAweDAwMDA2ODIyLAorCUdVRVNUX1NZU0VOVEVSX0VTUCAgICAgICAgICAgICAgPSAweDAwMDA2ODI0LAorCUdVRVNUX1NZU0VOVEVSX0VJUCAgICAgICAgICAgICAgPSAweDAwMDA2ODI2LAorCUhPU1RfQ1IwICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzAwLAorCUhPU1RfQ1IzICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzAyLAorCUhPU1RfQ1I0ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzA0LAorCUhPU1RfRlNfQkFTRSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzA2LAorCUhPU1RfR1NfQkFTRSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzA4LAorCUhPU1RfVFJfQkFTRSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzBhLAorCUhPU1RfR0RUUl9CQVNFICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzBjLAorCUhPU1RfSURUUl9CQVNFICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzBlLAorCUhPU1RfSUEzMl9TWVNFTlRFUl9FU1AgICAgICAgICAgPSAweDAwMDA2YzEwLAorCUhPU1RfSUEzMl9TWVNFTlRFUl9FSVAgICAgICAgICAgPSAweDAwMDA2YzEyLAorCUhPU1RfUlNQICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzE0LAorCUhPU1RfUklQICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDA2YzE2LAorfTsKKworI2RlZmluZSBWTVhfRVhJVF9SRUFTT05TX0ZBSUxFRF9WTUVOVFJZICAgICAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIEVYSVRfUkVBU09OX0VYQ0VQVElPTl9OTUkgICAgICAgMAorI2RlZmluZSBFWElUX1JFQVNPTl9FWFRFUk5BTF9JTlRFUlJVUFQgIDEKKworI2RlZmluZSBFWElUX1JFQVNPTl9QRU5ESU5HX0lOVEVSUlVQVCAgIDcKKworI2RlZmluZSBFWElUX1JFQVNPTl9UQVNLX1NXSVRDSCAgICAgICAgIDkKKyNkZWZpbmUgRVhJVF9SRUFTT05fQ1BVSUQgICAgICAgICAgICAgICAxMAorI2RlZmluZSBFWElUX1JFQVNPTl9ITFQgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEVYSVRfUkVBU09OX0lOVkxQRyAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgRVhJVF9SRUFTT05fUkRQTUMgICAgICAgICAgICAgICAxNQorI2RlZmluZSBFWElUX1JFQVNPTl9SRFRTQyAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEVYSVRfUkVBU09OX1ZNQ0FMTCAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgRVhJVF9SRUFTT05fVk1DTEVBUiAgICAgICAgICAgICAxOQorI2RlZmluZSBFWElUX1JFQVNPTl9WTUxBVU5DSCAgICAgICAgICAgIDIwCisjZGVmaW5lIEVYSVRfUkVBU09OX1ZNUFRSTEQgICAgICAgICAgICAgMjEKKyNkZWZpbmUgRVhJVF9SRUFTT05fVk1QVFJTVCAgICAgICAgICAgICAyMgorI2RlZmluZSBFWElUX1JFQVNPTl9WTVJFQUQgICAgICAgICAgICAgIDIzCisjZGVmaW5lIEVYSVRfUkVBU09OX1ZNUkVTVU1FICAgICAgICAgICAgMjQKKyNkZWZpbmUgRVhJVF9SRUFTT05fVk1XUklURSAgICAgICAgICAgICAyNQorI2RlZmluZSBFWElUX1JFQVNPTl9WTU9GRiAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIEVYSVRfUkVBU09OX1ZNT04gICAgICAgICAgICAgICAgMjcKKyNkZWZpbmUgRVhJVF9SRUFTT05fQ1JfQUNDRVNTICAgICAgICAgICAyOAorI2RlZmluZSBFWElUX1JFQVNPTl9EUl9BQ0NFU1MgICAgICAgICAgIDI5CisjZGVmaW5lIEVYSVRfUkVBU09OX0lPX0lOU1RSVUNUSU9OICAgICAgMzAKKyNkZWZpbmUgRVhJVF9SRUFTT05fTVNSX1JFQUQgICAgICAgICAgICAzMQorI2RlZmluZSBFWElUX1JFQVNPTl9NU1JfV1JJVEUgICAgICAgICAgIDMyCisjZGVmaW5lIEVYSVRfUkVBU09OX01XQUlUX0lOU1RSVUNUSU9OICAgMzYKKworLyoKKyAqIEludGVycnVwdGlvbi1pbmZvcm1hdGlvbiBmb3JtYXQKKyAqLworI2RlZmluZSBJTlRSX0lORk9fVkVDVE9SX01BU0sgICAgICAgICAgIDB4ZmYgICAgICAgICAgICAvKiA3OjAgKi8KKyNkZWZpbmUgSU5UUl9JTkZPX0lOVFJfVFlQRV9NQVNLICAgICAgICAweDcwMCAgICAgICAgICAgLyogMTA6OCAqLworI2RlZmluZSBJTlRSX0lORk9fREVMSUVWRVJfQ09ERV9NQVNLICAgIDB4ODAwICAgICAgICAgICAvKiAxMSAqLworI2RlZmluZSBJTlRSX0lORk9fVkFMSURfTUFTSyAgICAgICAgICAgIDB4ODAwMDAwMDAgICAgICAvKiAzMSAqLworCisjZGVmaW5lIFZFQ1RPUklOR19JTkZPX1ZFQ1RPUl9NQVNLICAgICAgICAgICAJSU5UUl9JTkZPX1ZFQ1RPUl9NQVNLCisjZGVmaW5lIFZFQ1RPUklOR19JTkZPX1RZUEVfTUFTSyAgICAgICAgCUlOVFJfSU5GT19JTlRSX1RZUEVfTUFTSworI2RlZmluZSBWRUNUT1JJTkdfSU5GT19ERUxJRVZFUl9DT0RFX01BU0sgICAgCUlOVFJfSU5GT19ERUxJRVZFUl9DT0RFX01BU0sKKyNkZWZpbmUgVkVDVE9SSU5HX0lORk9fVkFMSURfTUFTSyAgICAgICAJSU5UUl9JTkZPX1ZBTElEX01BU0sKKworI2RlZmluZSBJTlRSX1RZUEVfRVhUX0lOVFIgICAgICAgICAgICAgICgwIDw8IDgpIC8qIGV4dGVybmFsIGludGVycnVwdCAqLworI2RlZmluZSBJTlRSX1RZUEVfRVhDRVBUSU9OICAgICAgICAgICAgICgzIDw8IDgpIC8qIHByb2Nlc3NvciBleGNlcHRpb24gKi8KKworLyoKKyAqIEV4aXQgUXVhbGlmaWNhdGlvbnMgZm9yIE1PViBmb3IgQ29udHJvbCBSZWdpc3RlciBBY2Nlc3MKKyAqLworI2RlZmluZSBDT05UUk9MX1JFR19BQ0NFU1NfTlVNICAgICAgICAgIDB4NyAgICAgLyogMjowLCBudW1iZXIgb2YgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBDT05UUk9MX1JFR19BQ0NFU1NfVFlQRSAgICAgICAgIDB4MzAgICAgLyogNTo0LCBhY2Nlc3MgdHlwZSAqLworI2RlZmluZSBDT05UUk9MX1JFR19BQ0NFU1NfUkVHICAgICAgICAgIDB4ZjAwICAgLyogMTA6OCwgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCisjZGVmaW5lIExNU1dfU09VUkNFX0RBVEFfU0hJRlQgMTYKKyNkZWZpbmUgTE1TV19TT1VSQ0VfREFUQSAgKDB4RkZGRiA8PCBMTVNXX1NPVVJDRV9EQVRBX1NISUZUKSAvKiAxNjozMSBsbXN3IHNvdXJjZSAqLworI2RlZmluZSBSRUdfRUFYICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IDgpCisjZGVmaW5lIFJFR19FQ1ggICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgUkVHX0VEWCAgICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCA4KQorI2RlZmluZSBSRUdfRUJYICAgICAgICAgICAgICAgICAgICAgICAgICgzIDw8IDgpCisjZGVmaW5lIFJFR19FU1AgICAgICAgICAgICAgICAgICAgICAgICAgKDQgPDwgOCkKKyNkZWZpbmUgUkVHX0VCUCAgICAgICAgICAgICAgICAgICAgICAgICAoNSA8PCA4KQorI2RlZmluZSBSRUdfRVNJICAgICAgICAgICAgICAgICAgICAgICAgICg2IDw8IDgpCisjZGVmaW5lIFJFR19FREkgICAgICAgICAgICAgICAgICAgICAgICAgKDcgPDwgOCkKKyNkZWZpbmUgUkVHX1I4ICAgICAgICAgICAgICAgICAgICAgICAgICg4IDw8IDgpCisjZGVmaW5lIFJFR19SOSAgICAgICAgICAgICAgICAgICAgICAgICAoOSA8PCA4KQorI2RlZmluZSBSRUdfUjEwICAgICAgICAgICAgICAgICAgICAgICAgKDEwIDw8IDgpCisjZGVmaW5lIFJFR19SMTEgICAgICAgICAgICAgICAgICAgICAgICAoMTEgPDwgOCkKKyNkZWZpbmUgUkVHX1IxMiAgICAgICAgICAgICAgICAgICAgICAgICgxMiA8PCA4KQorI2RlZmluZSBSRUdfUjEzICAgICAgICAgICAgICAgICAgICAgICAgKDEzIDw8IDgpCisjZGVmaW5lIFJFR19SMTQgICAgICAgICAgICAgICAgICAgICAgICAoMTQgPDwgOCkKKyNkZWZpbmUgUkVHX1IxNSAgICAgICAgICAgICAgICAgICAgICAgICgxNSA8PCA4KQorCisvKgorICogRXhpdCBRdWFsaWZpY2F0aW9ucyBmb3IgTU9WIGZvciBEZWJ1ZyBSZWdpc3RlciBBY2Nlc3MKKyAqLworI2RlZmluZSBERUJVR19SRUdfQUNDRVNTX05VTSAgICAgICAgICAgIDB4NyAgICAgLyogMjowLCBudW1iZXIgb2YgZGVidWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgREVCVUdfUkVHX0FDQ0VTU19UWVBFICAgICAgICAgICAweDEwICAgIC8qIDQsIGRpcmVjdGlvbiBvZiBhY2Nlc3MgKi8KKyNkZWZpbmUgVFlQRV9NT1ZfVE9fRFIgICAgICAgICAgICAgICAgICAoMCA8PCA0KQorI2RlZmluZSBUWVBFX01PVl9GUk9NX0RSICAgICAgICAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIERFQlVHX1JFR19BQ0NFU1NfUkVHICAgICAgICAgICAgMHhmMDAgICAvKiAxMTo4LCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgKi8KKworCisvKiBzZWdtZW50IEFSICovCisjZGVmaW5lIFNFR01FTlRfQVJfTF9NQVNLICgxIDw8IDEzKQorCisvKiBlbnRyeSBjb250cm9scyAqLworI2RlZmluZSBWTV9FTlRSWV9DT05UUk9MU19JQTMyRV9NQVNLICgxIDw8IDkpCisKKyNkZWZpbmUgQVJfVFlQRV9BQ0NFU1NFU19NQVNLIDEKKyNkZWZpbmUgQVJfVFlQRV9SRUFEQUJMRV9NQVNLICgxIDw8IDEpCisjZGVmaW5lIEFSX1RZUEVfV1JJVEVBQkxFX01BU0sgKDEgPDwgMikKKyNkZWZpbmUgQVJfVFlQRV9DT0RFX01BU0sgKDEgPDwgMykKKyNkZWZpbmUgQVJfVFlQRV9NQVNLIDB4MGYKKyNkZWZpbmUgQVJfVFlQRV9CVVNZXzY0X1RTUyAxMQorI2RlZmluZSBBUl9UWVBFX0JVU1lfMzJfVFNTIDExCisjZGVmaW5lIEFSX1RZUEVfQlVTWV8xNl9UU1MgMworI2RlZmluZSBBUl9UWVBFX0xEVCAyCisKKyNkZWZpbmUgQVJfVU5VU0FCTEVfTUFTSyAoMSA8PCAxNikKKyNkZWZpbmUgQVJfU19NQVNLICgxIDw8IDQpCisjZGVmaW5lIEFSX1BfTUFTSyAoMSA8PCA3KQorI2RlZmluZSBBUl9MX01BU0sgKDEgPDwgMTMpCisjZGVmaW5lIEFSX0RCX01BU0sgKDEgPDwgMTQpCisjZGVmaW5lIEFSX0dfTUFTSyAoMSA8PCAxNSkKKyNkZWZpbmUgQVJfRFBMX1NISUZUIDUKKyNkZWZpbmUgQVJfRFBMKGFyKSAoKChhcikgPj4gQVJfRFBMX1NISUZUKSAmIDMpCisKKyNkZWZpbmUgQVJfUkVTRVJWRF9NQVNLIDB4ZmZmZTBmMDAKKworI2RlZmluZSBDUjRfVk1YRSAweDIwMDAKKworI2RlZmluZSBNU1JfSUEzMl9WTVhfQkFTSUNfTVNSICAgCQkweDQ4MAorI2RlZmluZSBNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0wgCQkweDAzYQorI2RlZmluZSBNU1JfSUEzMl9WTVhfUElOQkFTRURfQ1RMU19NU1IJCTB4NDgxCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9QUk9DQkFTRURfQ1RMU19NU1IJCTB4NDgyCisjZGVmaW5lIE1TUl9JQTMyX1ZNWF9FWElUX0NUTFNfTVNSCQkweDQ4MworI2RlZmluZSBNU1JfSUEzMl9WTVhfRU5UUllfQ1RMU19NU1IJCTB4NDg0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0veDg2X2VtdWxhdGUuYyBiL2RyaXZlcnMva3ZtL3g4Nl9lbXVsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZjNlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMva3ZtL3g4Nl9lbXVsYXRlLmMKQEAgLTAsMCArMSwxNDA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB4ODZfZW11bGF0ZS5jCisgKgorICogR2VuZXJpYyB4ODYgKDMyLWJpdCBhbmQgNjQtYml0KSBpbnN0cnVjdGlvbiBkZWNvZGVyIGFuZCBlbXVsYXRvci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgS2VpciBGcmFzZXIKKyAqCisgKiBMaW51eCBjb2Rpbmcgc3R5bGUsIG1vZCByL20gZGVjb2Rlciwgc2VnbWVudCBiYXNlIGZpeGVzLCByZWFsLW1vZGUKKyAqIHByaXZpZWdlZCBpbnN0cnVjdGlvbnM6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFF1bXJhbmV0CisgKgorICogICBBdmkgS2l2aXR5IDxhdmlAcXVtcmFuZXQuY29tPgorICogICBZYW5pdiBLYW1heSA8eWFuaXZAcXVtcmFuZXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKiBGcm9tOiB4ZW4tdW5zdGFibGUgMTA2NzY6YWY5ODA5ZjUxZjgxYTNjNDNmMjc2ZjAwYzgxYTUyZWY1NThhZmRhNAorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8cHVibGljL3hlbi5oPgorI2RlZmluZSBEUFJJTlRGKF9mLCBfYSAuLi4pIHByaW50ZiggX2YgLCAjIyBfYSApCisjZWxzZQorI2luY2x1ZGUgImt2bS5oIgorI2RlZmluZSBEUFJJTlRGKHguLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjaW5jbHVkZSAieDg2X2VtdWxhdGUuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyoKKyAqIE9wY29kZSBlZmZlY3RpdmUtYWRkcmVzcyBkZWNvZGUgdGFibGVzLgorICogTm90ZSB0aGF0IHdlIG9ubHkgZW11bGF0ZSBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSBtZW1vcnkKKyAqIG9wZXJhbmQgKGV4Y2x1ZGluZyBpbXBsaWNpdCBzdGFjayByZWZlcmVuY2VzKS4gV2UgYXNzdW1lIHRoYXQgc3RhY2sKKyAqIHJlZmVyZW5jZXMgYW5kIGluc3RydWN0aW9uIGZldGNoZXMgd2lsbCBuZXZlciBvY2N1ciBpbiBzcGVjaWFsIG1lbW9yeQorICogYXJlYXMgdGhhdCByZXF1aXJlIGVtdWxhdGlvbi4gU28sIGZvciBleGFtcGxlLCAnbW92IDxpbW0+LDxyZWc+JyBuZWVkCisgKiBub3QgYmUgaGFuZGxlZC4KKyAqLworCisvKiBPcGVyYW5kIHNpemVzOiA4LWJpdCBvcGVyYW5kcyBvciBzcGVjaWZpZWQvb3ZlcnJpZGRlbiBzaXplLiAqLworI2RlZmluZSBCeXRlT3AgICAgICAoMTw8MCkJLyogOC1iaXQgb3BlcmFuZHMuICovCisvKiBEZXN0aW5hdGlvbiBvcGVyYW5kIHR5cGUuICovCisjZGVmaW5lIEltcGxpY2l0T3BzICgxPDwxKQkvKiBJbXBsaWNpdCBpbiBvcGNvZGUuIE5vIGdlbmVyaWMgZGVjb2RlLiAqLworI2RlZmluZSBEc3RSZWcgICAgICAoMjw8MSkJLyogUmVnaXN0ZXIgb3BlcmFuZC4gKi8KKyNkZWZpbmUgRHN0TWVtICAgICAgKDM8PDEpCS8qIE1lbW9yeSBvcGVyYW5kLiAqLworI2RlZmluZSBEc3RNYXNrICAgICAoMzw8MSkKKy8qIFNvdXJjZSBvcGVyYW5kIHR5cGUuICovCisjZGVmaW5lIFNyY05vbmUgICAgICgwPDwzKQkvKiBObyBzb3VyY2Ugb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjSW1wbGljaXQgKDA8PDMpCS8qIFNvdXJjZSBvcGVyYW5kIGlzIGltcGxpY2l0IGluIHRoZSBvcGNvZGUuICovCisjZGVmaW5lIFNyY1JlZyAgICAgICgxPDwzKQkvKiBSZWdpc3RlciBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNNZW0gICAgICAoMjw8MykJLyogTWVtb3J5IG9wZXJhbmQuICovCisjZGVmaW5lIFNyY01lbTE2ICAgICgzPDwzKQkvKiBNZW1vcnkgb3BlcmFuZCAoMTYtYml0KS4gKi8KKyNkZWZpbmUgU3JjTWVtMzIgICAgKDQ8PDMpCS8qIE1lbW9yeSBvcGVyYW5kICgzMi1iaXQpLiAqLworI2RlZmluZSBTcmNJbW0gICAgICAoNTw8MykJLyogSW1tZWRpYXRlIG9wZXJhbmQuICovCisjZGVmaW5lIFNyY0ltbUJ5dGUgICg2PDwzKQkvKiA4LWJpdCBzaWduLWV4dGVuZGVkIGltbWVkaWF0ZSBvcGVyYW5kLiAqLworI2RlZmluZSBTcmNNYXNrICAgICAoNzw8MykKKy8qIEdlbmVyaWMgTW9kUk0gZGVjb2RlLiAqLworI2RlZmluZSBNb2RSTSAgICAgICAoMTw8NikKKy8qIERlc3RpbmF0aW9uIGlzIG9ubHkgd3JpdHRlbjsgbmV2ZXIgcmVhZC4gKi8KKyNkZWZpbmUgTW92ICAgICAgICAgKDE8PDcpCisKK3N0YXRpYyB1OCBvcGNvZGVfdGFibGVbMjU2XSA9IHsKKwkvKiAweDAwIC0gMHgwNyAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweDA4IC0gMHgwRiAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweDEwIC0gMHgxNyAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweDE4IC0gMHgxRiAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweDIwIC0gMHgyNyAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweDI4IC0gMHgyRiAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweDMwIC0gMHgzNyAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweDM4IC0gMHgzRiAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweDQwIC0gMHg0RiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHg1MCAtIDB4NUYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCS8qIDB4NjAgLSAweDZGICovCisJMCwgMCwgMCwgRHN0UmVnIHwgU3JjTWVtMzIgfCBNb2RSTSB8IE1vdiAvKiBtb3ZzeGQgKHg4Ni82NCkgKi8gLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHg3MCAtIDB4N0YgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCS8qIDB4ODAgLSAweDg3ICovCisJQnl0ZU9wIHwgRHN0TWVtIHwgU3JjSW1tIHwgTW9kUk0sIERzdE1lbSB8IFNyY0ltbSB8IE1vZFJNLAorCUJ5dGVPcCB8IERzdE1lbSB8IFNyY0ltbSB8IE1vZFJNLCBEc3RNZW0gfCBTcmNJbW1CeXRlIHwgTW9kUk0sCisJQnl0ZU9wIHwgRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0sIERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLAorCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwkvKiAweDg4IC0gMHg4RiAqLworCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNIHwgTW92LCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IE1vdiwKKwlCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0gfCBNb3YsCisJMCwgMCwgMCwgRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNIHwgTW92LAorCS8qIDB4OTAgLSAweDlGICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkvKiAweEEwIC0gMHhBNyAqLworCUJ5dGVPcCB8IERzdFJlZyB8IFNyY01lbSB8IE1vdiwgRHN0UmVnIHwgU3JjTWVtIHwgTW92LAorCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vdiwgRHN0TWVtIHwgU3JjUmVnIHwgTW92LAorCUJ5dGVPcCB8IEltcGxpY2l0T3BzIHwgTW92LCBJbXBsaWNpdE9wcyB8IE1vdiwKKwlCeXRlT3AgfCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsCisJLyogMHhBOCAtIDB4QUYgKi8KKwkwLCAwLCBCeXRlT3AgfCBJbXBsaWNpdE9wcyB8IE1vdiwgSW1wbGljaXRPcHMgfCBNb3YsCisJQnl0ZU9wIHwgSW1wbGljaXRPcHMgfCBNb3YsIEltcGxpY2l0T3BzIHwgTW92LAorCUJ5dGVPcCB8IEltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywKKwkvKiAweEIwIC0gMHhCRiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHhDMCAtIDB4QzcgKi8KKwlCeXRlT3AgfCBEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSwgRHN0TWVtIHwgU3JjSW1tQnl0ZSB8IE1vZFJNLCAwLCAwLAorCTAsIDAsIEJ5dGVPcCB8IERzdE1lbSB8IFNyY0ltbSB8IE1vZFJNIHwgTW92LAorCSAgICBEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSB8IE1vdiwKKwkvKiAweEM4IC0gMHhDRiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHhEMCAtIDB4RDcgKi8KKwlCeXRlT3AgfCBEc3RNZW0gfCBTcmNJbXBsaWNpdCB8IE1vZFJNLCBEc3RNZW0gfCBTcmNJbXBsaWNpdCB8IE1vZFJNLAorCUJ5dGVPcCB8IERzdE1lbSB8IFNyY0ltcGxpY2l0IHwgTW9kUk0sIERzdE1lbSB8IFNyY0ltcGxpY2l0IHwgTW9kUk0sCisJMCwgMCwgMCwgMCwKKwkvKiAweEQ4IC0gMHhERiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHhFMCAtIDB4RUYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCS8qIDB4RjAgLSAweEY3ICovCisJMCwgMCwgMCwgMCwKKwkwLCAwLCBCeXRlT3AgfCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0sIERzdE1lbSB8IFNyY05vbmUgfCBNb2RSTSwKKwkvKiAweEY4IC0gMHhGRiAqLworCTAsIDAsIDAsIDAsCisJMCwgMCwgQnl0ZU9wIHwgRHN0TWVtIHwgU3JjTm9uZSB8IE1vZFJNLCBEc3RNZW0gfCBTcmNOb25lIHwgTW9kUk0KK307CisKK3N0YXRpYyB1OCB0d29ieXRlX3RhYmxlWzI1Nl0gPSB7CisJLyogMHgwMCAtIDB4MEYgKi8KKwkwLCBTcmNNZW0gfCBNb2RSTSB8IERzdFJlZywgMCwgMCwgMCwgMCwgSW1wbGljaXRPcHMsIDAsCisJMCwgMCwgMCwgMCwgMCwgSW1wbGljaXRPcHMgfCBNb2RSTSwgMCwgMCwKKwkvKiAweDEwIC0gMHgxRiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIEltcGxpY2l0T3BzIHwgTW9kUk0sIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHgyMCAtIDB4MkYgKi8KKwlNb2RSTSB8IEltcGxpY2l0T3BzLCBNb2RSTSwgTW9kUk0gfCBJbXBsaWNpdE9wcywgTW9kUk0sIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkvKiAweDMwIC0gMHgzRiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHg0MCAtIDB4NDcgKi8KKwlEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0gfCBNb3YsCisJRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0gfCBNb3YsIERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgTW92LAorCURzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgTW92LCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwKKwlEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0gfCBNb3YsCisJLyogMHg0OCAtIDB4NEYgKi8KKwlEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0gfCBNb3YsCisJRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0gfCBNb3YsIERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgTW92LAorCURzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgTW92LCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwKKwlEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwgRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0gfCBNb3YsCisJLyogMHg1MCAtIDB4NUYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCS8qIDB4NjAgLSAweDZGICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkvKiAweDcwIC0gMHg3RiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHg4MCAtIDB4OEYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCS8qIDB4OTAgLSAweDlGICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkvKiAweEEwIC0gMHhBNyAqLworCTAsIDAsIDAsIERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLCAwLCAwLCAwLCAwLAorCS8qIDB4QTggLSAweEFGICovCisJMCwgMCwgMCwgRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0sIDAsIDAsIDAsIDAsCisJLyogMHhCMCAtIDB4QjcgKi8KKwlCeXRlT3AgfCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwgRHN0TWVtIHwgU3JjUmVnIHwgTW9kUk0sIDAsCisJICAgIERzdE1lbSB8IFNyY1JlZyB8IE1vZFJNLAorCTAsIDAsIEJ5dGVPcCB8IERzdFJlZyB8IFNyY01lbSB8IE1vZFJNIHwgTW92LAorCSAgICBEc3RSZWcgfCBTcmNNZW0xNiB8IE1vZFJNIHwgTW92LAorCS8qIDB4QjggLSAweEJGICovCisJMCwgMCwgRHN0TWVtIHwgU3JjSW1tQnl0ZSB8IE1vZFJNLCBEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSwKKwkwLCAwLCBCeXRlT3AgfCBEc3RSZWcgfCBTcmNNZW0gfCBNb2RSTSB8IE1vdiwKKwkgICAgRHN0UmVnIHwgU3JjTWVtMTYgfCBNb2RSTSB8IE1vdiwKKwkvKiAweEMwIC0gMHhDRiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIEltcGxpY2l0T3BzIHwgTW9kUk0sIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJLyogMHhEMCAtIDB4REYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCS8qIDB4RTAgLSAweEVGICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkvKiAweEYwIC0gMHhGRiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKy8qCisgKiBUZWxsIHRoZSBlbXVsYXRvciB0aGF0IG9mIHRoZSBHcm91cCA3IGluc3RydWN0aW9ucyAoc2dkdCwgbGlkdCwgZXRjLikgd2UKKyAqIGFyZSBpbnRlcmVzdGVkIG9ubHkgaW4gaW52bHBnIGFuZCBub3QgaW4gYW55IG9mIHRoZSByZXN0LgorICoKKyAqIGludmxwZyBpcyBhIHNwZWNpYWwgaW5zdHJ1Y3Rpb24gaW4gdGhhdCB0aGUgZGF0YSBpdCByZWZlcmVuY2VzIG1heSBub3QKKyAqIGJlIG1hcHBlZC4KKyAqLwordm9pZCBrdm1fZW11bGF0b3Jfd2FudF9ncm91cDdfaW52bHBnKHZvaWQpCit7CisJdHdvYnl0ZV90YWJsZVsxXSAmPSB+U3JjTWVtOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2VtdWxhdG9yX3dhbnRfZ3JvdXA3X2ludmxwZyk7CisKKy8qIFR5cGUsIGFkZHJlc3Mtb2YsIGFuZCB2YWx1ZSBvZiBhbiBpbnN0cnVjdGlvbidzIG9wZXJhbmQuICovCitzdHJ1Y3Qgb3BlcmFuZCB7CisJZW51bSB7IE9QX1JFRywgT1BfTUVNLCBPUF9JTU0gfSB0eXBlOworCXVuc2lnbmVkIGludCBieXRlczsKKwl1bnNpZ25lZCBsb25nIHZhbCwgb3JpZ192YWwsICpwdHI7Cit9OworCisvKiBFRkxBR1MgYml0IGRlZmluaXRpb25zLiAqLworI2RlZmluZSBFRkxHX09GICgxPDwxMSkKKyNkZWZpbmUgRUZMR19ERiAoMTw8MTApCisjZGVmaW5lIEVGTEdfU0YgKDE8PDcpCisjZGVmaW5lIEVGTEdfWkYgKDE8PDYpCisjZGVmaW5lIEVGTEdfQUYgKDE8PDQpCisjZGVmaW5lIEVGTEdfUEYgKDE8PDIpCisjZGVmaW5lIEVGTEdfQ0YgKDE8PDApCisKKy8qCisgKiBJbnN0cnVjdGlvbiBlbXVsYXRpb246CisgKiBNb3N0IGluc3RydWN0aW9ucyBhcmUgZW11bGF0ZWQgZGlyZWN0bHkgdmlhIGEgZnJhZ21lbnQgb2YgaW5saW5lIGFzc2VtYmx5CisgKiBjb2RlLiBUaGlzIGFsbG93cyB1cyB0byBzYXZlL3Jlc3RvcmUgRUZMQUdTIGFuZCB0aHVzIHZlcnkgZWFzaWx5IHBpY2sgdXAKKyAqIGFueSBtb2RpZmllZCBmbGFncy4KKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorI2RlZmluZSBfTE8zMiAiayIJCS8qIGZvcmNlIDMyLWJpdCBvcGVyYW5kICovCisjZGVmaW5lIF9TVEsgICIlJXJzcCIJCS8qIHN0YWNrIHBvaW50ZXIgKi8KKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIF9MTzMyICIiCQkvKiBmb3JjZSAzMi1iaXQgb3BlcmFuZCAqLworI2RlZmluZSBfU1RLICAiJSVlc3AiCQkvKiBzdGFjayBwb2ludGVyICovCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIEVGTEFHUyBiaXRzIGFyZSByZXN0b3JlZCBmcm9tIHNhdmVkIHZhbHVlIGR1cmluZyBlbXVsYXRpb24sIGFuZAorICogYW55IGNoYW5nZXMgYXJlIHdyaXR0ZW4gYmFjayB0byB0aGUgc2F2ZWQgdmFsdWUgYWZ0ZXIgZW11bGF0aW9uLgorICovCisjZGVmaW5lIEVGTEFHU19NQVNLIChFRkxHX09GfEVGTEdfU0Z8RUZMR19aRnxFRkxHX0FGfEVGTEdfUEZ8RUZMR19DRikKKworLyogQmVmb3JlIGV4ZWN1dGluZyBpbnN0cnVjdGlvbjogcmVzdG9yZSBuZWNlc3NhcnkgYml0cyBpbiBFRkxBR1MuICovCisjZGVmaW5lIF9QUkVfRUZMQUdTKF9zYXYsIF9tc2ssIF90bXApIFwKKwkvKiBFRkxBR1MgPSAoX3NhdiAmIF9tc2spIHwgKEVGTEFHUyAmIH5fbXNrKTsgKi8JXAorCSJwdXNoICUiX3NhdiI7ICIJCQkJCVwKKwkibW92bCAlIl9tc2siLCUiX0xPMzIgX3RtcCI7ICIJCQkJXAorCSJhbmRsICUiX0xPMzIgX3RtcCIsKCJfU1RLIik7ICIJCQkJXAorCSJwdXNoZjsgIgkJCQkJCVwKKwkibm90bCAlIl9MTzMyIF90bXAiOyAiCQkJCQlcCisJImFuZGwgJSJfTE8zMiBfdG1wIiwoIl9TVEsiKTsgIgkJCQlcCisJInBvcCAgJSJfdG1wIjsgIgkJCQkJXAorCSJvcmwgICUiX0xPMzIgX3RtcCIsKCJfU1RLIik7ICIJCQkJXAorCSJwb3BmOyAiCQkJCQkJXAorCS8qIF9zYXYgJj0gfm1zazsgKi8JCQkJCVwKKwkibW92bCAlIl9tc2siLCUiX0xPMzIgX3RtcCI7ICIJCQkJXAorCSJub3RsICUiX0xPMzIgX3RtcCI7ICIJCQkJCVwKKwkiYW5kbCAlIl9MTzMyIF90bXAiLCUiX3NhdiI7ICIKKworLyogQWZ0ZXIgZXhlY3V0aW5nIGluc3RydWN0aW9uOiB3cml0ZS1iYWNrIG5lY2Vzc2FyeSBiaXRzIGluIEVGTEFHUy4gKi8KKyNkZWZpbmUgX1BPU1RfRUZMQUdTKF9zYXYsIF9tc2ssIF90bXApIFwKKwkvKiBfc2F2IHw9IEVGTEFHUyAmIF9tc2s7ICovCQlcCisJInB1c2hmOyAiCQkJCVwKKwkicG9wICAlIl90bXAiOyAiCQkJXAorCSJhbmRsICUiX21zayIsJSJfTE8zMiBfdG1wIjsgIgkJXAorCSJvcmwgICUiX0xPMzIgX3RtcCIsJSJfc2F2IjsgIgorCisvKiBSYXcgZW11bGF0aW9uOiBpbnN0cnVjdGlvbiBoYXMgdHdvIGV4cGxpY2l0IG9wZXJhbmRzLiAqLworI2RlZmluZSBfX2VtdWxhdGVfMm9wX25vYnl0ZShfb3AsX3NyYyxfZHN0LF9lZmxhZ3MsX3d4LF93eSxfbHgsX2x5LF9xeCxfcXkpIFwKKwlkbyB7IAkJCQkJCQkJICAgIFwKKwkJdW5zaWduZWQgbG9uZyBfdG1wOwkJCQkJICAgIFwKKwkJCQkJCQkJCSAgICBcCisJCXN3aXRjaCAoKF9kc3QpLmJ5dGVzKSB7CQkJCQkgICAgXAorCQljYXNlIDI6CQkJCQkJCSAgICBcCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCSAgICBcCisJCQkJX1BSRV9FRkxBR1MoIjAiLCI0IiwiMiIpCQkgICAgXAorCQkJCV9vcCJ3ICUiX3d4IjMsJTE7ICIJCQkgICAgXAorCQkJCV9QT1NUX0VGTEFHUygiMCIsIjQiLCIyIikJCSAgICBcCisJCQkJOiAiPW0iIChfZWZsYWdzKSwgIj1tIiAoKF9kc3QpLnZhbCksICAgICAgICBcCisJCQkJICAiPSZyIiAoX3RtcCkJCQkJICAgIFwKKwkJCQk6IF93eSAoKF9zcmMpLnZhbCksICJpIiAoRUZMQUdTX01BU0spICk7ICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCWNhc2UgNDoJCQkJCQkJICAgIFwKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJICAgIFwKKwkJCQlfUFJFX0VGTEFHUygiMCIsIjQiLCIyIikJCSAgICBcCisJCQkJX29wImwgJSJfbHgiMywlMTsgIgkJCSAgICBcCisJCQkJX1BPU1RfRUZMQUdTKCIwIiwiNCIsIjIiKQkJICAgIFwKKwkJCQk6ICI9bSIgKF9lZmxhZ3MpLCAiPW0iICgoX2RzdCkudmFsKSwJICAgIFwKKwkJCQkgICI9JnIiIChfdG1wKQkJCQkgICAgXAorCQkJCTogX2x5ICgoX3NyYykudmFsKSwgImkiIChFRkxBR1NfTUFTSykgKTsgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgIFwKKwkJY2FzZSA4OgkJCQkJCQkgICAgXAorCQkJX19lbXVsYXRlXzJvcF84Ynl0ZShfb3AsIF9zcmMsIF9kc3QsCQkgICAgXAorCQkJCQkgICAgX2VmbGFncywgX3F4LCBfcXkpOwkJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCX0JCQkJCQkJICAgIFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fZW11bGF0ZV8yb3AoX29wLF9zcmMsX2RzdCxfZWZsYWdzLF9ieCxfYnksX3d4LF93eSxfbHgsX2x5LF9xeCxfcXkpIFwKKwlkbyB7CQkJCQkJCQkgICAgIFwKKwkJdW5zaWduZWQgbG9uZyBfdG1wOwkJCQkJICAgICBcCisJCXN3aXRjaCAoIChfZHN0KS5ieXRlcyApCQkJCQkgICAgIFwKKwkJewkJCQkJCQkgICAgIFwKKwkJY2FzZSAxOgkJCQkJCQkgICAgIFwKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJICAgICBcCisJCQkJX1BSRV9FRkxBR1MoIjAiLCI0IiwiMiIpCQkgICAgIFwKKwkJCQlfb3AiYiAlIl9ieCIzLCUxOyAiCQkJICAgICBcCisJCQkJX1BPU1RfRUZMQUdTKCIwIiwiNCIsIjIiKQkJICAgICBcCisJCQkJOiAiPW0iIChfZWZsYWdzKSwgIj1tIiAoKF9kc3QpLnZhbCksCSAgICAgXAorCQkJCSAgIj0mciIgKF90bXApCQkJCSAgICAgXAorCQkJCTogX2J5ICgoX3NyYykudmFsKSwgImkiIChFRkxBR1NfTUFTSykgKTsgICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgXAorCQlkZWZhdWx0OgkJCQkJCSAgICAgXAorCQkJX19lbXVsYXRlXzJvcF9ub2J5dGUoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAkgICAgIFwKKwkJCQkJICAgICBfd3gsIF93eSwgX2x4LCBfbHksIF9xeCwgX3F5KTsgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICAgXAorCQl9CQkJCQkJCSAgICAgXAorCX0gd2hpbGUgKDApCisKKy8qIFNvdXJjZSBvcGVyYW5kIGlzIGJ5dGUtc2l6ZWQgYW5kIG1heSBiZSByZXN0cmljdGVkIHRvIGp1c3QgJWNsLiAqLworI2RlZmluZSBlbXVsYXRlXzJvcF9TcmNCKF9vcCwgX3NyYywgX2RzdCwgX2VmbGFncykgICAgICAgICAgICAgICAgICAgICAgXAorCV9fZW11bGF0ZV8yb3AoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAkJCQlcCisJCSAgICAgICJiIiwgImMiLCAiYiIsICJjIiwgImIiLCAiYyIsICJiIiwgImMiKQorCisvKiBTb3VyY2Ugb3BlcmFuZCBpcyBieXRlLCB3b3JkLCBsb25nIG9yIHF1YWQgc2l6ZWQuICovCisjZGVmaW5lIGVtdWxhdGVfMm9wX1NyY1YoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzKSAgICAgICAgICAgICAgICAgICAgICBcCisJX19lbXVsYXRlXzJvcChfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsCQkJCVwKKwkJICAgICAgImIiLCAicSIsICJ3IiwgInIiLCBfTE8zMiwgInIiLCAiIiwgInIiKQorCisvKiBTb3VyY2Ugb3BlcmFuZCBpcyB3b3JkLCBsb25nIG9yIHF1YWQgc2l6ZWQuICovCisjZGVmaW5lIGVtdWxhdGVfMm9wX1NyY1Zfbm9ieXRlKF9vcCwgX3NyYywgX2RzdCwgX2VmbGFncykgICAgICAgICAgICAgICBcCisJX19lbXVsYXRlXzJvcF9ub2J5dGUoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzLAkJCVwKKwkJCSAgICAgInciLCAiciIsIF9MTzMyLCAiciIsICIiLCAiciIpCisKKy8qIEluc3RydWN0aW9uIGhhcyBvbmx5IG9uZSBleHBsaWNpdCBvcGVyYW5kIChubyBzb3VyY2Ugb3BlcmFuZCkuICovCisjZGVmaW5lIGVtdWxhdGVfMW9wKF9vcCwgX2RzdCwgX2VmbGFncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8gewkJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIF90bXA7CQkJCQlcCisJCQkJCQkJCQlcCisJCXN3aXRjaCAoIChfZHN0KS5ieXRlcyApCQkJCQlcCisJCXsJCQkJCQkJXAorCQljYXNlIDE6CQkJCQkJCVwKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJXAorCQkJCV9QUkVfRUZMQUdTKCIwIiwiMyIsIjIiKQkJXAorCQkJCV9vcCJiICUxOyAiCQkJCVwKKwkJCQlfUE9TVF9FRkxBR1MoIjAiLCIzIiwiMiIpCQlcCisJCQkJOiAiPW0iIChfZWZsYWdzKSwgIj1tIiAoKF9kc3QpLnZhbCksCVwKKwkJCQkgICI9JnIiIChfdG1wKQkJCQlcCisJCQkJOiAiaSIgKEVGTEFHU19NQVNLKSApOwkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJY2FzZSAyOgkJCQkJCQlcCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCVwKKwkJCQlfUFJFX0VGTEFHUygiMCIsIjMiLCIyIikJCVwKKwkJCQlfb3AidyAlMTsgIgkJCQlcCisJCQkJX1BPU1RfRUZMQUdTKCIwIiwiMyIsIjIiKQkJXAorCQkJCTogIj1tIiAoX2VmbGFncyksICI9bSIgKChfZHN0KS52YWwpLAlcCisJCQkJICAiPSZyIiAoX3RtcCkJCQkJXAorCQkJCTogImkiIChFRkxBR1NfTUFTSykgKTsJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgNDoJCQkJCQkJXAorCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQlcCisJCQkJX1BSRV9FRkxBR1MoIjAiLCIzIiwiMiIpCQlcCisJCQkJX29wImwgJTE7ICIJCQkJXAorCQkJCV9QT1NUX0VGTEFHUygiMCIsIjMiLCIyIikJCVwKKwkJCQk6ICI9bSIgKF9lZmxhZ3MpLCAiPW0iICgoX2RzdCkudmFsKSwJXAorCQkJCSAgIj0mciIgKF90bXApCQkJCVwKKwkJCQk6ICJpIiAoRUZMQUdTX01BU0spICk7CQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIDg6CQkJCQkJCVwKKwkJCV9fZW11bGF0ZV8xb3BfOGJ5dGUoX29wLCBfZHN0LCBfZWZsYWdzKTsJXAorCQkJYnJlYWs7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisvKiBFbXVsYXRlIGFuIGluc3RydWN0aW9uIHdpdGggcXVhZHdvcmQgb3BlcmFuZHMgKHg4Ni82NCBvbmx5KS4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisjZGVmaW5lIF9fZW11bGF0ZV8yb3BfOGJ5dGUoX29wLCBfc3JjLCBfZHN0LCBfZWZsYWdzLCBfcXgsIF9xeSkgICAgICAgICAgIFwKKwlkbyB7CQkJCQkJCQkgIFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJICBcCisJCQlfUFJFX0VGTEFHUygiMCIsIjQiLCIyIikJCQkgIFwKKwkJCV9vcCJxICUiX3F4IjMsJTE7ICIJCQkJICBcCisJCQlfUE9TVF9FRkxBR1MoIjAiLCI0IiwiMiIpCQkJICBcCisJCQk6ICI9bSIgKF9lZmxhZ3MpLCAiPW0iICgoX2RzdCkudmFsKSwgIj0mciIgKF90bXApIFwKKwkJCTogX3F5ICgoX3NyYykudmFsKSwgImkiIChFRkxBR1NfTUFTSykgKTsJICBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX2VtdWxhdGVfMW9wXzhieXRlKF9vcCwgX2RzdCwgX2VmbGFncykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8gewkJCQkJCQkJICBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCSAgXAorCQkJX1BSRV9FRkxBR1MoIjAiLCIzIiwiMiIpCQkJICBcCisJCQlfb3AicSAlMTsgIgkJCQkJICBcCisJCQlfUE9TVF9FRkxBR1MoIjAiLCIzIiwiMiIpCQkJICBcCisJCQk6ICI9bSIgKF9lZmxhZ3MpLCAiPW0iICgoX2RzdCkudmFsKSwgIj0mciIgKF90bXApIFwKKwkJCTogImkiIChFRkxBR1NfTUFTSykgKTsJCQkJICBcCisJfSB3aGlsZSAoMCkKKworI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyNkZWZpbmUgX19lbXVsYXRlXzJvcF84Ynl0ZShfb3AsIF9zcmMsIF9kc3QsIF9lZmxhZ3MsIF9xeCwgX3F5KQorI2RlZmluZSBfX2VtdWxhdGVfMW9wXzhieXRlKF9vcCwgX2RzdCwgX2VmbGFncykKKyNlbmRpZgkJCQkvKiBfX2kzODZfXyAqLworCisvKiBGZXRjaCBuZXh0IHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGJlaW5nIGVtdWxhdGVkLiAqLworI2RlZmluZSBpbnNuX2ZldGNoKF90eXBlLCBfc2l6ZSwgX2VpcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsJdW5zaWduZWQgbG9uZyBfeDsJCQkJCQlcCisJcmMgPSBvcHMtPnJlYWRfc3RkKCh1bnNpZ25lZCBsb25nKShfZWlwKSArIGN0eHQtPmNzX2Jhc2UsICZfeCwJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3NpemUpLCBjdHh0KTsgICAgICAgXAorCWlmICggcmMgIT0gMCApCQkJCQkJCVwKKwkJZ290byBkb25lOwkJCQkJCVwKKwkoX2VpcCkgKz0gKF9zaXplKTsJCQkJCQlcCisJKF90eXBlKV94OwkJCQkJCQlcCit9KQorCisvKiBBY2Nlc3MvdXBkYXRlIGFkZHJlc3MgaGVsZCBpbiBhIHJlZ2lzdGVyLCBiYXNlZCBvbiBhZGRyZXNzaW5nIG1vZGUuICovCisjZGVmaW5lIHJlZ2lzdGVyX2FkZHJlc3MoYmFzZSwgcmVnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKChiYXNlKSArICgoYWRfYnl0ZXMgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSA/IChyZWcpIDoJXAorCQkgICAoKHJlZykgJiAoKDFVTCA8PCAoYWRfYnl0ZXMgPDwgMykpIC0gMSkpKSkKKworI2RlZmluZSByZWdpc3Rlcl9hZGRyZXNzX2luY3JlbWVudChyZWcsIGluYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsJCQkJCQkJCVwKKwkJLyogc2lnbmVkIHR5cGUgZW5zdXJlcyBzaWduIGV4dGVuc2lvbiB0byBsb25nICovICAgICAgICBcCisJCWludCBfaW5jID0gKGluYyk7CQkJCQlcCisJCWlmICggYWRfYnl0ZXMgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICkJCVwKKwkJCShyZWcpICs9IF9pbmM7CQkJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJKHJlZykgPSAoKHJlZykgJiB+KCgxVUwgPDwgKGFkX2J5dGVzIDw8IDMpKSAtIDEpKSB8IFwKKwkJCSAgICgoKHJlZykgKyBfaW5jKSAmICgoMVVMIDw8IChhZF9ieXRlcyA8PCAzKSkgLSAxKSk7IFwKKwl9IHdoaWxlICgwKQorCit2b2lkICpkZWNvZGVfcmVnaXN0ZXIodTggbW9kcm1fcmVnLCB1bnNpZ25lZCBsb25nICpyZWdzLAorCQkgICAgICBpbnQgaGlnaGJ5dGVfcmVncykKK3sKKwl2b2lkICpwOworCisJcCA9ICZyZWdzW21vZHJtX3JlZ107CisJaWYgKGhpZ2hieXRlX3JlZ3MgJiYgbW9kcm1fcmVnID49IDQgJiYgbW9kcm1fcmVnIDwgOCkKKwkJcCA9ICh1bnNpZ25lZCBjaGFyICopJnJlZ3NbbW9kcm1fcmVnICYgM10gKyAxOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IHJlYWRfZGVzY3JpcHRvcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJCSAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcywKKwkJCSAgIHZvaWQgKnB0ciwKKwkJCSAgIHUxNiAqc2l6ZSwgdW5zaWduZWQgbG9uZyAqYWRkcmVzcywgaW50IG9wX2J5dGVzKQoreworCWludCByYzsKKworCWlmIChvcF9ieXRlcyA9PSAyKQorCQlvcF9ieXRlcyA9IDM7CisJKmFkZHJlc3MgPSAwOworCXJjID0gb3BzLT5yZWFkX3N0ZCgodW5zaWduZWQgbG9uZylwdHIsICh1bnNpZ25lZCBsb25nICopc2l6ZSwgMiwgY3R4dCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmMgPSBvcHMtPnJlYWRfc3RkKCh1bnNpZ25lZCBsb25nKXB0ciArIDIsIGFkZHJlc3MsIG9wX2J5dGVzLCBjdHh0KTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAoreDg2X2VtdWxhdGVfbWVtb3Aoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcykKK3sKKwl1OCBiLCBkLCBzaWIsIHR3b2J5dGUgPSAwLCByZXhfcHJlZml4ID0gMDsKKwl1OCBtb2RybSwgbW9kcm1fbW9kID0gMCwgbW9kcm1fcmVnID0gMCwgbW9kcm1fcm0gPSAwOworCXVuc2lnbmVkIGxvbmcgKm92ZXJyaWRlX2Jhc2UgPSBOVUxMOworCXVuc2lnbmVkIGludCBvcF9ieXRlcywgYWRfYnl0ZXMsIGxvY2tfcHJlZml4ID0gMCwgcmVwX3ByZWZpeCA9IDAsIGk7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qgb3BlcmFuZCBzcmMsIGRzdDsKKwl1bnNpZ25lZCBsb25nIGNyMiA9IGN0eHQtPmNyMjsKKwlpbnQgbW9kZSA9IGN0eHQtPm1vZGU7CisJdW5zaWduZWQgbG9uZyBtb2RybV9lYTsKKwlpbnQgdXNlX21vZHJtX2VhLCBpbmRleF9yZWcgPSAwLCBiYXNlX3JlZyA9IDAsIHNjYWxlLCByaXBfcmVsYXRpdmUgPSAwOworCisJLyogU2hhZG93IGNvcHkgb2YgcmVnaXN0ZXIgc3RhdGUuIENvbW1pdHRlZCBvbiBzdWNjZXNzZnVsIGVtdWxhdGlvbi4gKi8KKwl1bnNpZ25lZCBsb25nIF9yZWdzW05SX1ZDUFVfUkVHU107CisJdW5zaWduZWQgbG9uZyBfZWlwID0gY3R4dC0+dmNwdS0+cmlwLCBfZWZsYWdzID0gY3R4dC0+ZWZsYWdzOworCXVuc2lnbmVkIGxvbmcgbW9kcm1fdmFsID0gMDsKKworCW1lbWNweShfcmVncywgY3R4dC0+dmNwdS0+cmVncywgc2l6ZW9mIF9yZWdzKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgWDg2RU1VTF9NT0RFX1JFQUw6CisJY2FzZSBYODZFTVVMX01PREVfUFJPVDE2OgorCQlvcF9ieXRlcyA9IGFkX2J5dGVzID0gMjsKKwkJYnJlYWs7CisJY2FzZSBYODZFTVVMX01PREVfUFJPVDMyOgorCQlvcF9ieXRlcyA9IGFkX2J5dGVzID0gNDsKKwkJYnJlYWs7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCWNhc2UgWDg2RU1VTF9NT0RFX1BST1Q2NDoKKwkJb3BfYnl0ZXMgPSA0OworCQlhZF9ieXRlcyA9IDg7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIExlZ2FjeSBwcmVmaXhlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXN3aXRjaCAoYiA9IGluc25fZmV0Y2godTgsIDEsIF9laXApKSB7CisJCWNhc2UgMHg2NjoJLyogb3BlcmFuZC1zaXplIG92ZXJyaWRlICovCisJCQlvcF9ieXRlcyBePSA2OwkvKiBzd2l0Y2ggYmV0d2VlbiAyLzQgYnl0ZXMgKi8KKwkJCWJyZWFrOworCQljYXNlIDB4Njc6CS8qIGFkZHJlc3Mtc2l6ZSBvdmVycmlkZSAqLworCQkJaWYgKG1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkKKwkJCQlhZF9ieXRlcyBePSAxMjsJLyogc3dpdGNoIGJldHdlZW4gNC84IGJ5dGVzICovCisJCQllbHNlCisJCQkJYWRfYnl0ZXMgXj0gNjsJLyogc3dpdGNoIGJldHdlZW4gMi80IGJ5dGVzICovCisJCQlicmVhazsKKwkJY2FzZSAweDJlOgkvKiBDUyBvdmVycmlkZSAqLworCQkJb3ZlcnJpZGVfYmFzZSA9ICZjdHh0LT5jc19iYXNlOworCQkJYnJlYWs7CisJCWNhc2UgMHgzZToJLyogRFMgb3ZlcnJpZGUgKi8KKwkJCW92ZXJyaWRlX2Jhc2UgPSAmY3R4dC0+ZHNfYmFzZTsKKwkJCWJyZWFrOworCQljYXNlIDB4MjY6CS8qIEVTIG92ZXJyaWRlICovCisJCQlvdmVycmlkZV9iYXNlID0gJmN0eHQtPmVzX2Jhc2U7CisJCQlicmVhazsKKwkJY2FzZSAweDY0OgkvKiBGUyBvdmVycmlkZSAqLworCQkJb3ZlcnJpZGVfYmFzZSA9ICZjdHh0LT5mc19iYXNlOworCQkJYnJlYWs7CisJCWNhc2UgMHg2NToJLyogR1Mgb3ZlcnJpZGUgKi8KKwkJCW92ZXJyaWRlX2Jhc2UgPSAmY3R4dC0+Z3NfYmFzZTsKKwkJCWJyZWFrOworCQljYXNlIDB4MzY6CS8qIFNTIG92ZXJyaWRlICovCisJCQlvdmVycmlkZV9iYXNlID0gJmN0eHQtPnNzX2Jhc2U7CisJCQlicmVhazsKKwkJY2FzZSAweGYwOgkvKiBMT0NLICovCisJCQlsb2NrX3ByZWZpeCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweGYzOgkvKiBSRVAvUkVQRS9SRVBaICovCisJCQlyZXBfcHJlZml4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4ZjI6CS8qIFJFUE5FL1JFUE5aICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZG9uZV9wcmVmaXhlczsKKwkJfQorCX0KKworZG9uZV9wcmVmaXhlczoKKworCS8qIFJFWCBwcmVmaXguICovCisJaWYgKChtb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQpICYmICgoYiAmIDB4ZjApID09IDB4NDApKSB7CisJCXJleF9wcmVmaXggPSBiOworCQlpZiAoYiAmIDgpCisJCQlvcF9ieXRlcyA9IDg7CS8qIFJFWC5XICovCisJCW1vZHJtX3JlZyA9IChiICYgNCkgPDwgMTsJLyogUkVYLlIgKi8KKwkJaW5kZXhfcmVnID0gKGIgJiAyKSA8PCAyOyAvKiBSRVguWCAqLworCQltb2RybV9ybSA9IGJhc2VfcmVnID0gKGIgJiAxKSA8PCAzOyAvKiBSRUcuQiAqLworCQliID0gaW5zbl9mZXRjaCh1OCwgMSwgX2VpcCk7CisJfQorCisJLyogT3Bjb2RlIGJ5dGUocykuICovCisJZCA9IG9wY29kZV90YWJsZVtiXTsKKwlpZiAoZCA9PSAwKSB7CisJCS8qIFR3by1ieXRlIG9wY29kZT8gKi8KKwkJaWYgKGIgPT0gMHgwZikgeworCQkJdHdvYnl0ZSA9IDE7CisJCQliID0gaW5zbl9mZXRjaCh1OCwgMSwgX2VpcCk7CisJCQlkID0gdHdvYnl0ZV90YWJsZVtiXTsKKwkJfQorCisJCS8qIFVucmVjb2duaXNlZD8gKi8KKwkJaWYgKGQgPT0gMCkKKwkJCWdvdG8gY2Fubm90X2VtdWxhdGU7CisJfQorCisJLyogTW9kUk0gYW5kIFNJQiBieXRlcy4gKi8KKwlpZiAoZCAmIE1vZFJNKSB7CisJCW1vZHJtID0gaW5zbl9mZXRjaCh1OCwgMSwgX2VpcCk7CisJCW1vZHJtX21vZCB8PSAobW9kcm0gJiAweGMwKSA+PiA2OworCQltb2RybV9yZWcgfD0gKG1vZHJtICYgMHgzOCkgPj4gMzsKKwkJbW9kcm1fcm0gfD0gKG1vZHJtICYgMHgwNyk7CisJCW1vZHJtX2VhID0gMDsKKwkJdXNlX21vZHJtX2VhID0gMTsKKworCQlpZiAobW9kcm1fbW9kID09IDMpIHsKKwkJCW1vZHJtX3ZhbCA9ICoodW5zaWduZWQgbG9uZyAqKQorCQkJCWRlY29kZV9yZWdpc3Rlcihtb2RybV9ybSwgX3JlZ3MsIGQgJiBCeXRlT3ApOworCQkJZ290byBtb2RybV9kb25lOworCQl9CisKKwkJaWYgKGFkX2J5dGVzID09IDIpIHsKKwkJCXVuc2lnbmVkIGJ4ID0gX3JlZ3NbVkNQVV9SRUdTX1JCWF07CisJCQl1bnNpZ25lZCBicCA9IF9yZWdzW1ZDUFVfUkVHU19SQlBdOworCQkJdW5zaWduZWQgc2kgPSBfcmVnc1tWQ1BVX1JFR1NfUlNJXTsKKwkJCXVuc2lnbmVkIGRpID0gX3JlZ3NbVkNQVV9SRUdTX1JESV07CisKKwkJCS8qIDE2LWJpdCBNb2RSL00gZGVjb2RlLiAqLworCQkJc3dpdGNoIChtb2RybV9tb2QpIHsKKwkJCWNhc2UgMDoKKwkJCQlpZiAobW9kcm1fcm0gPT0gNikKKwkJCQkJbW9kcm1fZWEgKz0gaW5zbl9mZXRjaCh1MTYsIDIsIF9laXApOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczgsIDEsIF9laXApOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2godTE2LCAyLCBfZWlwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAobW9kcm1fcm0pIHsKKwkJCWNhc2UgMDoKKwkJCQltb2RybV9lYSArPSBieCArIHNpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCW1vZHJtX2VhICs9IGJ4ICsgZGk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJbW9kcm1fZWEgKz0gYnAgKyBzaTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQltb2RybV9lYSArPSBicCArIGRpOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCW1vZHJtX2VhICs9IHNpOworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCW1vZHJtX2VhICs9IGRpOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCWlmIChtb2RybV9tb2QgIT0gMCkKKwkJCQkJbW9kcm1fZWEgKz0gYnA7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJbW9kcm1fZWEgKz0gYng7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAobW9kcm1fcm0gPT0gMiB8fCBtb2RybV9ybSA9PSAzIHx8CisJCQkgICAgKG1vZHJtX3JtID09IDYgJiYgbW9kcm1fbW9kICE9IDApKQorCQkJCWlmICghb3ZlcnJpZGVfYmFzZSkKKwkJCQkJb3ZlcnJpZGVfYmFzZSA9ICZjdHh0LT5zc19iYXNlOworCQkJbW9kcm1fZWEgPSAodTE2KW1vZHJtX2VhOworCQl9IGVsc2UgeworCQkJLyogMzIvNjQtYml0IE1vZFIvTSBkZWNvZGUuICovCisJCQlzd2l0Y2ggKG1vZHJtX3JtKSB7CisJCQljYXNlIDQ6CisJCQljYXNlIDEyOgorCQkJCXNpYiA9IGluc25fZmV0Y2godTgsIDEsIF9laXApOworCQkJCWluZGV4X3JlZyB8PSAoc2liID4+IDMpICYgNzsKKwkJCQliYXNlX3JlZyB8PSBzaWIgJiA3OworCQkJCXNjYWxlID0gc2liID4+IDY7CisKKwkJCQlzd2l0Y2ggKGJhc2VfcmVnKSB7CisJCQkJY2FzZSA1OgorCQkJCQlpZiAobW9kcm1fbW9kICE9IDApCisJCQkJCQltb2RybV9lYSArPSBfcmVnc1tiYXNlX3JlZ107CisJCQkJCWVsc2UKKwkJCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCA0LCBfZWlwKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJbW9kcm1fZWEgKz0gX3JlZ3NbYmFzZV9yZWddOworCQkJCX0KKwkJCQlzd2l0Y2ggKGluZGV4X3JlZykgeworCQkJCWNhc2UgNDoKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJbW9kcm1fZWEgKz0gX3JlZ3NbaW5kZXhfcmVnXSA8PCBzY2FsZTsKKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlpZiAobW9kcm1fbW9kICE9IDApCisJCQkJCW1vZHJtX2VhICs9IF9yZWdzW21vZHJtX3JtXTsKKwkJCQllbHNlIGlmIChtb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQpCisJCQkJCXJpcF9yZWxhdGl2ZSA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW1vZHJtX2VhICs9IF9yZWdzW21vZHJtX3JtXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAobW9kcm1fbW9kKSB7CisJCQljYXNlIDA6CisJCQkJaWYgKG1vZHJtX3JtID09IDUpCisJCQkJCW1vZHJtX2VhICs9IGluc25fZmV0Y2goczMyLCA0LCBfZWlwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHM4LCAxLCBfZWlwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQltb2RybV9lYSArPSBpbnNuX2ZldGNoKHMzMiwgNCwgX2VpcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFvdmVycmlkZV9iYXNlKQorCQkJb3ZlcnJpZGVfYmFzZSA9ICZjdHh0LT5kc19iYXNlOworCQlpZiAobW9kZSA9PSBYODZFTVVMX01PREVfUFJPVDY0ICYmCisJCSAgICBvdmVycmlkZV9iYXNlICE9ICZjdHh0LT5mc19iYXNlICYmCisJCSAgICBvdmVycmlkZV9iYXNlICE9ICZjdHh0LT5nc19iYXNlKQorCQkJb3ZlcnJpZGVfYmFzZSA9IE5VTEw7CisKKwkJaWYgKG92ZXJyaWRlX2Jhc2UpCisJCQltb2RybV9lYSArPSAqb3ZlcnJpZGVfYmFzZTsKKworCQlpZiAocmlwX3JlbGF0aXZlKSB7CisJCQltb2RybV9lYSArPSBfZWlwOworCQkJc3dpdGNoIChkICYgU3JjTWFzaykgeworCQkJY2FzZSBTcmNJbW1CeXRlOgorCQkJCW1vZHJtX2VhICs9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIFNyY0ltbToKKwkJCQlpZiAoZCAmIEJ5dGVPcCkKKwkJCQkJbW9kcm1fZWEgKz0gMTsKKwkJCQllbHNlCisJCQkJCWlmIChvcF9ieXRlcyA9PSA4KQorCQkJCQkJbW9kcm1fZWEgKz0gNDsKKwkJCQkJZWxzZQorCQkJCQkJbW9kcm1fZWEgKz0gb3BfYnl0ZXM7CisJCQl9CisJCX0KKwkJaWYgKGFkX2J5dGVzICE9IDgpCisJCQltb2RybV9lYSA9ICh1MzIpbW9kcm1fZWE7CisJCWNyMiA9IG1vZHJtX2VhOworCW1vZHJtX2RvbmU6CisJCTsKKwl9CisKKwkvKiBEZWNvZGUgYW5kIGZldGNoIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kOiByZWdpc3RlciBvciBtZW1vcnkuICovCisJc3dpdGNoIChkICYgRHN0TWFzaykgeworCWNhc2UgSW1wbGljaXRPcHM6CisJCS8qIFNwZWNpYWwgaW5zdHJ1Y3Rpb25zIGRvIHRoZWlyIG93biBvcGVyYW5kIGRlY29kaW5nLiAqLworCQlnb3RvIHNwZWNpYWxfaW5zbjsKKwljYXNlIERzdFJlZzoKKwkJZHN0LnR5cGUgPSBPUF9SRUc7CisJCWlmICgoZCAmIEJ5dGVPcCkKKwkJICAgICYmICEodHdvYnl0ZV90YWJsZSAmJiAoYiA9PSAweGI2IHx8IGIgPT0gMHhiNykpKSB7CisJCQlkc3QucHRyID0gZGVjb2RlX3JlZ2lzdGVyKG1vZHJtX3JlZywgX3JlZ3MsCisJCQkJCQkgIChyZXhfcHJlZml4ID09IDApKTsKKwkJCWRzdC52YWwgPSAqKHU4ICopIGRzdC5wdHI7CisJCQlkc3QuYnl0ZXMgPSAxOworCQl9IGVsc2UgeworCQkJZHN0LnB0ciA9IGRlY29kZV9yZWdpc3Rlcihtb2RybV9yZWcsIF9yZWdzLCAwKTsKKwkJCXN3aXRjaCAoKGRzdC5ieXRlcyA9IG9wX2J5dGVzKSkgeworCQkJY2FzZSAyOgorCQkJCWRzdC52YWwgPSAqKHUxNiAqKWRzdC5wdHI7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJZHN0LnZhbCA9ICoodTMyICopZHN0LnB0cjsKKwkJCQlicmVhazsKKwkJCWNhc2UgODoKKwkJCQlkc3QudmFsID0gKih1NjQgKilkc3QucHRyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgRHN0TWVtOgorCQlkc3QudHlwZSA9IE9QX01FTTsKKwkJZHN0LnB0ciA9ICh1bnNpZ25lZCBsb25nICopY3IyOworCQlkc3QuYnl0ZXMgPSAoZCAmIEJ5dGVPcCkgPyAxIDogb3BfYnl0ZXM7CisJCWlmICghKGQgJiBNb3YpICYmIC8qIG9wdGltaXNhdGlvbiAtIGF2b2lkIHNsb3cgZW11bGF0ZWQgcmVhZCAqLworCQkgICAgKChyYyA9IG9wcy0+cmVhZF9lbXVsYXRlZCgodW5zaWduZWQgbG9uZylkc3QucHRyLAorCQkJCQkgICAgICAmZHN0LnZhbCwgZHN0LmJ5dGVzLCBjdHh0KSkgIT0gMCkpCisJCQlnb3RvIGRvbmU7CisJCWJyZWFrOworCX0KKwlkc3Qub3JpZ192YWwgPSBkc3QudmFsOworCisJLyoKKwkgKiBEZWNvZGUgYW5kIGZldGNoIHRoZSBzb3VyY2Ugb3BlcmFuZDogcmVnaXN0ZXIsIG1lbW9yeQorCSAqIG9yIGltbWVkaWF0ZS4KKwkgKi8KKwlzd2l0Y2ggKGQgJiBTcmNNYXNrKSB7CisJY2FzZSBTcmNOb25lOgorCQlicmVhazsKKwljYXNlIFNyY1JlZzoKKwkJc3JjLnR5cGUgPSBPUF9SRUc7CisJCWlmIChkICYgQnl0ZU9wKSB7CisJCQlzcmMucHRyID0gZGVjb2RlX3JlZ2lzdGVyKG1vZHJtX3JlZywgX3JlZ3MsCisJCQkJCQkgIChyZXhfcHJlZml4ID09IDApKTsKKwkJCXNyYy52YWwgPSBzcmMub3JpZ192YWwgPSAqKHU4ICopIHNyYy5wdHI7CisJCQlzcmMuYnl0ZXMgPSAxOworCQl9IGVsc2UgeworCQkJc3JjLnB0ciA9IGRlY29kZV9yZWdpc3Rlcihtb2RybV9yZWcsIF9yZWdzLCAwKTsKKwkJCXN3aXRjaCAoKHNyYy5ieXRlcyA9IG9wX2J5dGVzKSkgeworCQkJY2FzZSAyOgorCQkJCXNyYy52YWwgPSBzcmMub3JpZ192YWwgPSAqKHUxNiAqKSBzcmMucHRyOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXNyYy52YWwgPSBzcmMub3JpZ192YWwgPSAqKHUzMiAqKSBzcmMucHRyOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCXNyYy52YWwgPSBzcmMub3JpZ192YWwgPSAqKHU2NCAqKSBzcmMucHRyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgU3JjTWVtMTY6CisJCXNyYy5ieXRlcyA9IDI7CisJCWdvdG8gc3JjbWVtX2NvbW1vbjsKKwljYXNlIFNyY01lbTMyOgorCQlzcmMuYnl0ZXMgPSA0OworCQlnb3RvIHNyY21lbV9jb21tb247CisJY2FzZSBTcmNNZW06CisJCXNyYy5ieXRlcyA9IChkICYgQnl0ZU9wKSA/IDEgOiBvcF9ieXRlczsKKwkgICAgICBzcmNtZW1fY29tbW9uOgorCQlzcmMudHlwZSA9IE9QX01FTTsKKwkJc3JjLnB0ciA9ICh1bnNpZ25lZCBsb25nICopY3IyOworCQlpZiAoKHJjID0gb3BzLT5yZWFkX2VtdWxhdGVkKCh1bnNpZ25lZCBsb25nKXNyYy5wdHIsCisJCQkJCSAgICAgJnNyYy52YWwsIHNyYy5ieXRlcywgY3R4dCkpICE9IDApCisJCQlnb3RvIGRvbmU7CisJCXNyYy5vcmlnX3ZhbCA9IHNyYy52YWw7CisJCWJyZWFrOworCWNhc2UgU3JjSW1tOgorCQlzcmMudHlwZSA9IE9QX0lNTTsKKwkJc3JjLnB0ciA9ICh1bnNpZ25lZCBsb25nICopX2VpcDsKKwkJc3JjLmJ5dGVzID0gKGQgJiBCeXRlT3ApID8gMSA6IG9wX2J5dGVzOworCQlpZiAoc3JjLmJ5dGVzID09IDgpCisJCQlzcmMuYnl0ZXMgPSA0OworCQkvKiBOQi4gSW1tZWRpYXRlcyBhcmUgc2lnbi1leHRlbmRlZCBhcyBuZWNlc3NhcnkuICovCisJCXN3aXRjaCAoc3JjLmJ5dGVzKSB7CisJCWNhc2UgMToKKwkJCXNyYy52YWwgPSBpbnNuX2ZldGNoKHM4LCAxLCBfZWlwKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzcmMudmFsID0gaW5zbl9mZXRjaChzMTYsIDIsIF9laXApOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXNyYy52YWwgPSBpbnNuX2ZldGNoKHMzMiwgNCwgX2VpcCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNyY0ltbUJ5dGU6CisJCXNyYy50eXBlID0gT1BfSU1NOworCQlzcmMucHRyID0gKHVuc2lnbmVkIGxvbmcgKilfZWlwOworCQlzcmMuYnl0ZXMgPSAxOworCQlzcmMudmFsID0gaW5zbl9mZXRjaChzOCwgMSwgX2VpcCk7CisJCWJyZWFrOworCX0KKworCWlmICh0d29ieXRlKQorCQlnb3RvIHR3b2J5dGVfaW5zbjsKKworCXN3aXRjaCAoYikgeworCWNhc2UgMHgwMCAuLi4gMHgwNToKKwkgICAgICBhZGQ6CQkvKiBhZGQgKi8KKwkJZW11bGF0ZV8yb3BfU3JjVigiYWRkIiwgc3JjLCBkc3QsIF9lZmxhZ3MpOworCQlicmVhazsKKwljYXNlIDB4MDggLi4uIDB4MGQ6CisJICAgICAgb3I6CQkvKiBvciAqLworCQllbXVsYXRlXzJvcF9TcmNWKCJvciIsIHNyYywgZHN0LCBfZWZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSAweDEwIC4uLiAweDE1OgorCSAgICAgIGFkYzoJCS8qIGFkYyAqLworCQllbXVsYXRlXzJvcF9TcmNWKCJhZGMiLCBzcmMsIGRzdCwgX2VmbGFncyk7CisJCWJyZWFrOworCWNhc2UgMHgxOCAuLi4gMHgxZDoKKwkgICAgICBzYmI6CQkvKiBzYmIgKi8KKwkJZW11bGF0ZV8yb3BfU3JjVigic2JiIiwgc3JjLCBkc3QsIF9lZmxhZ3MpOworCQlicmVhazsKKwljYXNlIDB4MjAgLi4uIDB4MjU6CisJICAgICAgYW5kOgkJLyogYW5kICovCisJCWVtdWxhdGVfMm9wX1NyY1YoImFuZCIsIHNyYywgZHN0LCBfZWZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSAweDI4IC4uLiAweDJkOgorCSAgICAgIHN1YjoJCS8qIHN1YiAqLworCQllbXVsYXRlXzJvcF9TcmNWKCJzdWIiLCBzcmMsIGRzdCwgX2VmbGFncyk7CisJCWJyZWFrOworCWNhc2UgMHgzMCAuLi4gMHgzNToKKwkgICAgICB4b3I6CQkvKiB4b3IgKi8KKwkJZW11bGF0ZV8yb3BfU3JjVigieG9yIiwgc3JjLCBkc3QsIF9lZmxhZ3MpOworCQlicmVhazsKKwljYXNlIDB4MzggLi4uIDB4M2Q6CisJICAgICAgY21wOgkJLyogY21wICovCisJCWVtdWxhdGVfMm9wX1NyY1YoImNtcCIsIHNyYywgZHN0LCBfZWZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSAweDYzOgkJLyogbW92c3hkICovCisJCWlmIChtb2RlICE9IFg4NkVNVUxfTU9ERV9QUk9UNjQpCisJCQlnb3RvIGNhbm5vdF9lbXVsYXRlOworCQlkc3QudmFsID0gKHMzMikgc3JjLnZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDgwIC4uLiAweDgzOgkvKiBHcnAxICovCisJCXN3aXRjaCAobW9kcm1fcmVnKSB7CisJCWNhc2UgMDoKKwkJCWdvdG8gYWRkOworCQljYXNlIDE6CisJCQlnb3RvIG9yOworCQljYXNlIDI6CisJCQlnb3RvIGFkYzsKKwkJY2FzZSAzOgorCQkJZ290byBzYmI7CisJCWNhc2UgNDoKKwkJCWdvdG8gYW5kOworCQljYXNlIDU6CisJCQlnb3RvIHN1YjsKKwkJY2FzZSA2OgorCQkJZ290byB4b3I7CisJCWNhc2UgNzoKKwkJCWdvdG8gY21wOworCQl9CisJCWJyZWFrOworCWNhc2UgMHg4NCAuLi4gMHg4NToKKwkgICAgICB0ZXN0OgkJLyogdGVzdCAqLworCQllbXVsYXRlXzJvcF9TcmNWKCJ0ZXN0Iiwgc3JjLCBkc3QsIF9lZmxhZ3MpOworCQlicmVhazsKKwljYXNlIDB4ODYgLi4uIDB4ODc6CS8qIHhjaGcgKi8KKwkJLyogV3JpdGUgYmFjayB0aGUgcmVnaXN0ZXIgc291cmNlLiAqLworCQlzd2l0Y2ggKGRzdC5ieXRlcykgeworCQljYXNlIDE6CisJCQkqKHU4ICopIHNyYy5wdHIgPSAodTgpIGRzdC52YWw7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJKih1MTYgKikgc3JjLnB0ciA9ICh1MTYpIGRzdC52YWw7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJKnNyYy5wdHIgPSAodTMyKSBkc3QudmFsOworCQkJYnJlYWs7CS8qIDY0YiByZWc6IHplcm8tZXh0ZW5kICovCisJCWNhc2UgODoKKwkJCSpzcmMucHRyID0gZHN0LnZhbDsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIFdyaXRlIGJhY2sgdGhlIG1lbW9yeSBkZXN0aW5hdGlvbiB3aXRoIGltcGxpY2l0IExPQ0sKKwkJICogcHJlZml4LgorCQkgKi8KKwkJZHN0LnZhbCA9IHNyYy52YWw7CisJCWxvY2tfcHJlZml4ID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweGEwIC4uLiAweGExOgkvKiBtb3YgKi8KKwkJZHN0LnB0ciA9ICh1bnNpZ25lZCBsb25nICopJl9yZWdzW1ZDUFVfUkVHU19SQVhdOworCQlkc3QudmFsID0gc3JjLnZhbDsKKwkJX2VpcCArPSBhZF9ieXRlczsJLyogc2tpcCBzcmMgZGlzcGxhY2VtZW50ICovCisJCWJyZWFrOworCWNhc2UgMHhhMiAuLi4gMHhhMzoJLyogbW92ICovCisJCWRzdC52YWwgPSAodW5zaWduZWQgbG9uZylfcmVnc1tWQ1BVX1JFR1NfUkFYXTsKKwkJX2VpcCArPSBhZF9ieXRlczsJLyogc2tpcCBkc3QgZGlzcGxhY2VtZW50ICovCisJCWJyZWFrOworCWNhc2UgMHg4OCAuLi4gMHg4YjoJLyogbW92ICovCisJY2FzZSAweGM2IC4uLiAweGM3OgkvKiBtb3YgKHNvbGUgbWVtYmVyIG9mIEdycDExKSAqLworCQlkc3QudmFsID0gc3JjLnZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDhmOgkJLyogcG9wIChzb2xlIG1lbWJlciBvZiBHcnAxYSkgKi8KKwkJLyogNjQtYml0IG1vZGU6IFBPUCBhbHdheXMgcG9wcyBhIDY0LWJpdCBvcGVyYW5kLiAqLworCQlpZiAobW9kZSA9PSBYODZFTVVMX01PREVfUFJPVDY0KQorCQkJZHN0LmJ5dGVzID0gODsKKwkJaWYgKChyYyA9IG9wcy0+cmVhZF9zdGQocmVnaXN0ZXJfYWRkcmVzcyhjdHh0LT5zc19iYXNlLAorCQkJCQkJCSBfcmVnc1tWQ1BVX1JFR1NfUlNQXSksCisJCQkJCSZkc3QudmFsLCBkc3QuYnl0ZXMsIGN0eHQpKSAhPSAwKQorCQkJZ290byBkb25lOworCQlyZWdpc3Rlcl9hZGRyZXNzX2luY3JlbWVudChfcmVnc1tWQ1BVX1JFR1NfUlNQXSwgZHN0LmJ5dGVzKTsKKwkJYnJlYWs7CisJY2FzZSAweGMwIC4uLiAweGMxOgorCSAgICAgIGdycDI6CQkvKiBHcnAyICovCisJCXN3aXRjaCAobW9kcm1fcmVnKSB7CisJCWNhc2UgMDoJLyogcm9sICovCisJCQllbXVsYXRlXzJvcF9TcmNCKCJyb2wiLCBzcmMsIGRzdCwgX2VmbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiByb3IgKi8KKwkJCWVtdWxhdGVfMm9wX1NyY0IoInJvciIsIHNyYywgZHN0LCBfZWZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8qIHJjbCAqLworCQkJZW11bGF0ZV8yb3BfU3JjQigicmNsIiwgc3JjLCBkc3QsIF9lZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgMzoJLyogcmNyICovCisJCQllbXVsYXRlXzJvcF9TcmNCKCJyY3IiLCBzcmMsIGRzdCwgX2VmbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSA0OgkvKiBzYWwvc2hsICovCisJCWNhc2UgNjoJLyogc2FsL3NobCAqLworCQkJZW11bGF0ZV8yb3BfU3JjQigic2FsIiwgc3JjLCBkc3QsIF9lZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgNToJLyogc2hyICovCisJCQllbXVsYXRlXzJvcF9TcmNCKCJzaHIiLCBzcmMsIGRzdCwgX2VmbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSA3OgkvKiBzYXIgKi8KKwkJCWVtdWxhdGVfMm9wX1NyY0IoInNhciIsIHNyYywgZHN0LCBfZWZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgMHhkMCAuLi4gMHhkMToJLyogR3JwMiAqLworCQlzcmMudmFsID0gMTsKKwkJZ290byBncnAyOworCWNhc2UgMHhkMiAuLi4gMHhkMzoJLyogR3JwMiAqLworCQlzcmMudmFsID0gX3JlZ3NbVkNQVV9SRUdTX1JDWF07CisJCWdvdG8gZ3JwMjsKKwljYXNlIDB4ZjYgLi4uIDB4Zjc6CS8qIEdycDMgKi8KKwkJc3dpdGNoIChtb2RybV9yZWcpIHsKKwkJY2FzZSAwIC4uLiAxOgkvKiB0ZXN0ICovCisJCQkvKgorCQkJICogU3BlY2lhbCBjYXNlIGluIEdycDM6IHRlc3QgaGFzIGFuIGltbWVkaWF0ZQorCQkJICogc291cmNlIG9wZXJhbmQuCisJCQkgKi8KKwkJCXNyYy50eXBlID0gT1BfSU1NOworCQkJc3JjLnB0ciA9ICh1bnNpZ25lZCBsb25nICopX2VpcDsKKwkJCXNyYy5ieXRlcyA9IChkICYgQnl0ZU9wKSA/IDEgOiBvcF9ieXRlczsKKwkJCWlmIChzcmMuYnl0ZXMgPT0gOCkKKwkJCQlzcmMuYnl0ZXMgPSA0OworCQkJc3dpdGNoIChzcmMuYnl0ZXMpIHsKKwkJCWNhc2UgMToKKwkJCQlzcmMudmFsID0gaW5zbl9mZXRjaChzOCwgMSwgX2VpcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJc3JjLnZhbCA9IGluc25fZmV0Y2goczE2LCAyLCBfZWlwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlzcmMudmFsID0gaW5zbl9mZXRjaChzMzIsIDQsIF9laXApOworCQkJCWJyZWFrOworCQkJfQorCQkJZ290byB0ZXN0OworCQljYXNlIDI6CS8qIG5vdCAqLworCQkJZHN0LnZhbCA9IH5kc3QudmFsOworCQkJYnJlYWs7CisJCWNhc2UgMzoJLyogbmVnICovCisJCQllbXVsYXRlXzFvcCgibmVnIiwgZHN0LCBfZWZsYWdzKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBjYW5ub3RfZW11bGF0ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4ZmUgLi4uIDB4ZmY6CS8qIEdycDQvR3JwNSAqLworCQlzd2l0Y2ggKG1vZHJtX3JlZykgeworCQljYXNlIDA6CS8qIGluYyAqLworCQkJZW11bGF0ZV8xb3AoImluYyIsIGRzdCwgX2VmbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBkZWMgKi8KKwkJCWVtdWxhdGVfMW9wKCJkZWMiLCBkc3QsIF9lZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgNjoJLyogcHVzaCAqLworCQkJLyogNjQtYml0IG1vZGU6IFBVU0ggYWx3YXlzIHB1c2hlcyBhIDY0LWJpdCBvcGVyYW5kLiAqLworCQkJaWYgKG1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkgeworCQkJCWRzdC5ieXRlcyA9IDg7CisJCQkJaWYgKChyYyA9IG9wcy0+cmVhZF9zdGQoKHVuc2lnbmVkIGxvbmcpZHN0LnB0ciwKKwkJCQkJCQkmZHN0LnZhbCwgOCwKKwkJCQkJCQljdHh0KSkgIT0gMCkKKwkJCQkJZ290byBkb25lOworCQkJfQorCQkJcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoX3JlZ3NbVkNQVV9SRUdTX1JTUF0sCisJCQkJCQkgICAtZHN0LmJ5dGVzKTsKKwkJCWlmICgocmMgPSBvcHMtPndyaXRlX3N0ZCgKKwkJCQkgICAgIHJlZ2lzdGVyX2FkZHJlc3MoY3R4dC0+c3NfYmFzZSwKKwkJCQkJCSAgICAgIF9yZWdzW1ZDUFVfUkVHU19SU1BdKSwKKwkJCQkgICAgIGRzdC52YWwsIGRzdC5ieXRlcywgY3R4dCkpICE9IDApCisJCQkJZ290byBkb25lOworCQkJZHN0LnZhbCA9IGRzdC5vcmlnX3ZhbDsJLyogc2thbmt5OiBkaXNhYmxlIHdyaXRlYmFjayAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGNhbm5vdF9lbXVsYXRlOworCQl9CisJCWJyZWFrOworCX0KKword3JpdGViYWNrOgorCWlmICgoZCAmIE1vdikgfHwgKGRzdC5vcmlnX3ZhbCAhPSBkc3QudmFsKSkgeworCQlzd2l0Y2ggKGRzdC50eXBlKSB7CisJCWNhc2UgT1BfUkVHOgorCQkJLyogVGhlIDQtYnl0ZSBjYXNlICppcyogY29ycmVjdDogaW4gNjQtYml0IG1vZGUgd2UgemVyby1leHRlbmQuICovCisJCQlzd2l0Y2ggKGRzdC5ieXRlcykgeworCQkJY2FzZSAxOgorCQkJCSoodTggKilkc3QucHRyID0gKHU4KWRzdC52YWw7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJKih1MTYgKilkc3QucHRyID0gKHUxNilkc3QudmFsOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCSpkc3QucHRyID0gKHUzMilkc3QudmFsOworCQkJCWJyZWFrOwkvKiA2NGI6IHplcm8tZXh0ICovCisJCQljYXNlIDg6CisJCQkJKmRzdC5wdHIgPSBkc3QudmFsOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1BfTUVNOgorCQkJaWYgKGxvY2tfcHJlZml4KQorCQkJCXJjID0gb3BzLT5jbXB4Y2hnX2VtdWxhdGVkKCh1bnNpZ25lZCBsb25nKWRzdC4KKwkJCQkJCQkgICBwdHIsIGRzdC5vcmlnX3ZhbCwKKwkJCQkJCQkgICBkc3QudmFsLCBkc3QuYnl0ZXMsCisJCQkJCQkJICAgY3R4dCk7CisJCQllbHNlCisJCQkJcmMgPSBvcHMtPndyaXRlX2VtdWxhdGVkKCh1bnNpZ25lZCBsb25nKWRzdC5wdHIsCisJCQkJCQkJIGRzdC52YWwsIGRzdC5ieXRlcywKKwkJCQkJCQkgY3R4dCk7CisJCQlpZiAocmMgIT0gMCkKKwkJCQlnb3RvIGRvbmU7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENvbW1pdCBzaGFkb3cgcmVnaXN0ZXIgc3RhdGUuICovCisJbWVtY3B5KGN0eHQtPnZjcHUtPnJlZ3MsIF9yZWdzLCBzaXplb2YgX3JlZ3MpOworCWN0eHQtPmVmbGFncyA9IF9lZmxhZ3M7CisJY3R4dC0+dmNwdS0+cmlwID0gX2VpcDsKKworZG9uZToKKwlyZXR1cm4gKHJjID09IFg4NkVNVUxfVU5IQU5ETEVBQkxFKSA/IC0xIDogMDsKKworc3BlY2lhbF9pbnNuOgorCWlmICh0d29ieXRlKQorCQlnb3RvIHR3b2J5dGVfc3BlY2lhbF9pbnNuOworCWlmIChyZXBfcHJlZml4KSB7CisJCWlmIChfcmVnc1tWQ1BVX1JFR1NfUkNYXSA9PSAwKSB7CisJCQljdHh0LT52Y3B1LT5yaXAgPSBfZWlwOworCQkJZ290byBkb25lOworCQl9CisJCV9yZWdzW1ZDUFVfUkVHU19SQ1hdLS07CisJCV9laXAgPSBjdHh0LT52Y3B1LT5yaXA7CisJfQorCXN3aXRjaCAoYikgeworCWNhc2UgMHhhNCAuLi4gMHhhNToJLyogbW92cyAqLworCQlkc3QudHlwZSA9IE9QX01FTTsKKwkJZHN0LmJ5dGVzID0gKGQgJiBCeXRlT3ApID8gMSA6IG9wX2J5dGVzOworCQlkc3QucHRyID0gKHVuc2lnbmVkIGxvbmcgKilyZWdpc3Rlcl9hZGRyZXNzKGN0eHQtPmVzX2Jhc2UsCisJCQkJCQkJX3JlZ3NbVkNQVV9SRUdTX1JESV0pOworCQlpZiAoKHJjID0gb3BzLT5yZWFkX2VtdWxhdGVkKHJlZ2lzdGVyX2FkZHJlc3MoCisJCSAgICAgIG92ZXJyaWRlX2Jhc2UgPyAqb3ZlcnJpZGVfYmFzZSA6IGN0eHQtPmRzX2Jhc2UsCisJCSAgICAgIF9yZWdzW1ZDUFVfUkVHU19SU0ldKSwgJmRzdC52YWwsIGRzdC5ieXRlcywgY3R4dCkpICE9IDApCisJCQlnb3RvIGRvbmU7CisJCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KF9yZWdzW1ZDUFVfUkVHU19SU0ldLAorCQkJICAgICAoX2VmbGFncyAmIEVGTEdfREYpID8gLWRzdC5ieXRlcyA6IGRzdC5ieXRlcyk7CisJCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KF9yZWdzW1ZDUFVfUkVHU19SREldLAorCQkJICAgICAoX2VmbGFncyAmIEVGTEdfREYpID8gLWRzdC5ieXRlcyA6IGRzdC5ieXRlcyk7CisJCWJyZWFrOworCWNhc2UgMHhhNiAuLi4gMHhhNzoJLyogY21wcyAqLworCQlEUFJJTlRGKCJVcmshIEkgZG9uJ3QgaGFuZGxlIENNUFMuXG4iKTsKKwkJZ290byBjYW5ub3RfZW11bGF0ZTsKKwljYXNlIDB4YWEgLi4uIDB4YWI6CS8qIHN0b3MgKi8KKwkJZHN0LnR5cGUgPSBPUF9NRU07CisJCWRzdC5ieXRlcyA9IChkICYgQnl0ZU9wKSA/IDEgOiBvcF9ieXRlczsKKwkJZHN0LnB0ciA9ICh1bnNpZ25lZCBsb25nICopY3IyOworCQlkc3QudmFsID0gX3JlZ3NbVkNQVV9SRUdTX1JBWF07CisJCXJlZ2lzdGVyX2FkZHJlc3NfaW5jcmVtZW50KF9yZWdzW1ZDUFVfUkVHU19SREldLAorCQkJICAgICAoX2VmbGFncyAmIEVGTEdfREYpID8gLWRzdC5ieXRlcyA6IGRzdC5ieXRlcyk7CisJCWJyZWFrOworCWNhc2UgMHhhYyAuLi4gMHhhZDoJLyogbG9kcyAqLworCQlkc3QudHlwZSA9IE9QX1JFRzsKKwkJZHN0LmJ5dGVzID0gKGQgJiBCeXRlT3ApID8gMSA6IG9wX2J5dGVzOworCQlkc3QucHRyID0gKHVuc2lnbmVkIGxvbmcgKikmX3JlZ3NbVkNQVV9SRUdTX1JBWF07CisJCWlmICgocmMgPSBvcHMtPnJlYWRfZW11bGF0ZWQoY3IyLCAmZHN0LnZhbCwgZHN0LmJ5dGVzLCBjdHh0KSkgIT0gMCkKKwkJCWdvdG8gZG9uZTsKKwkJcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoX3JlZ3NbVkNQVV9SRUdTX1JTSV0sCisJCQkgICAoX2VmbGFncyAmIEVGTEdfREYpID8gLWRzdC5ieXRlcyA6IGRzdC5ieXRlcyk7CisJCWJyZWFrOworCWNhc2UgMHhhZSAuLi4gMHhhZjoJLyogc2NhcyAqLworCQlEUFJJTlRGKCJVcmshIEkgZG9uJ3QgaGFuZGxlIFNDQVMuXG4iKTsKKwkJZ290byBjYW5ub3RfZW11bGF0ZTsKKwl9CisJZ290byB3cml0ZWJhY2s7CisKK3R3b2J5dGVfaW5zbjoKKwlzd2l0Y2ggKGIpIHsKKwljYXNlIDB4MDE6IC8qIGxnZHQsIGxpZHQsIGxtc3cgKi8KKwkJc3dpdGNoIChtb2RybV9yZWcpIHsKKwkJCXUxNiBzaXplOworCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCisJCWNhc2UgMjogLyogbGdkdCAqLworCQkJcmMgPSByZWFkX2Rlc2NyaXB0b3IoY3R4dCwgb3BzLCBzcmMucHRyLAorCQkJCQkgICAgICZzaXplLCAmYWRkcmVzcywgb3BfYnl0ZXMpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gZG9uZTsKKwkJCXJlYWxtb2RlX2xnZHQoY3R4dC0+dmNwdSwgc2l6ZSwgYWRkcmVzcyk7CisJCQlicmVhazsKKwkJY2FzZSAzOiAvKiBsaWR0ICovCisJCQlyYyA9IHJlYWRfZGVzY3JpcHRvcihjdHh0LCBvcHMsIHNyYy5wdHIsCisJCQkJCSAgICAgJnNpemUsICZhZGRyZXNzLCBvcF9ieXRlcyk7CisJCQlpZiAocmMpCisJCQkJZ290byBkb25lOworCQkJcmVhbG1vZGVfbGlkdChjdHh0LT52Y3B1LCBzaXplLCBhZGRyZXNzKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6IC8qIHNtc3cgKi8KKwkJCWlmIChtb2RybV9tb2QgIT0gMykKKwkJCQlnb3RvIGNhbm5vdF9lbXVsYXRlOworCQkJKih1MTYgKikmX3JlZ3NbbW9kcm1fcm1dCisJCQkJPSByZWFsbW9kZV9nZXRfY3IoY3R4dC0+dmNwdSwgMCk7CisJCQlicmVhazsKKwkJY2FzZSA2OiAvKiBsbXN3ICovCisJCQlpZiAobW9kcm1fbW9kICE9IDMpCisJCQkJZ290byBjYW5ub3RfZW11bGF0ZTsKKwkJCXJlYWxtb2RlX2xtc3coY3R4dC0+dmNwdSwgKHUxNiltb2RybV92YWwsICZfZWZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIDc6IC8qIGludmxwZyovCisJCQllbXVsYXRlX2ludmxwZyhjdHh0LT52Y3B1LCBjcjIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGNhbm5vdF9lbXVsYXRlOworCQl9CisJCWJyZWFrOworCWNhc2UgMHgyMTogLyogbW92IGZyb20gZHIgdG8gcmVnICovCisJCWlmIChtb2RybV9tb2QgIT0gMykKKwkJCWdvdG8gY2Fubm90X2VtdWxhdGU7CisJCXJjID0gZW11bGF0b3JfZ2V0X2RyKGN0eHQsIG1vZHJtX3JlZywgJl9yZWdzW21vZHJtX3JtXSk7CisJCWJyZWFrOworCWNhc2UgMHgyMzogLyogbW92IGZyb20gcmVnIHRvIGRyICovCisJCWlmIChtb2RybV9tb2QgIT0gMykKKwkJCWdvdG8gY2Fubm90X2VtdWxhdGU7CisJCXJjID0gZW11bGF0b3Jfc2V0X2RyKGN0eHQsIG1vZHJtX3JlZywgX3JlZ3NbbW9kcm1fcm1dKTsKKwkJYnJlYWs7CisJY2FzZSAweDQwIC4uLiAweDRmOgkvKiBjbW92ICovCisJCWRzdC52YWwgPSBkc3Qub3JpZ192YWwgPSBzcmMudmFsOworCQlkICY9IH5Nb3Y7CS8qIGRlZmF1bHQgdG8gbm8gbW92ZSAqLworCQkvKgorCQkgKiBGaXJzdCwgYXNzdW1lIHdlJ3JlIGRlY29kaW5nIGFuIGV2ZW4gY21vdiBvcGNvZGUKKwkJICogKGxzYiA9PSAwKS4KKwkJICovCisJCXN3aXRjaCAoKGIgJiAxNSkgPj4gMSkgeworCQljYXNlIDA6CS8qIGNtb3ZvICovCisJCQlkIHw9IChfZWZsYWdzICYgRUZMR19PRikgPyBNb3YgOiAwOworCQkJYnJlYWs7CisJCWNhc2UgMToJLyogY21vdmIvY21vdmMvY21vdm5hZSAqLworCQkJZCB8PSAoX2VmbGFncyAmIEVGTEdfQ0YpID8gTW92IDogMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8qIGNtb3Z6L2Ntb3ZlICovCisJCQlkIHw9IChfZWZsYWdzICYgRUZMR19aRikgPyBNb3YgOiAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoJLyogY21vdmJlL2Ntb3ZuYSAqLworCQkJZCB8PSAoX2VmbGFncyAmIChFRkxHX0NGIHwgRUZMR19aRikpID8gTW92IDogMDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CS8qIGNtb3ZzICovCisJCQlkIHw9IChfZWZsYWdzICYgRUZMR19TRikgPyBNb3YgOiAwOworCQkJYnJlYWs7CisJCWNhc2UgNToJLyogY21vdnAvY21vdnBlICovCisJCQlkIHw9IChfZWZsYWdzICYgRUZMR19QRikgPyBNb3YgOiAwOworCQkJYnJlYWs7CisJCWNhc2UgNzoJLyogY21vdmxlL2Ntb3ZuZyAqLworCQkJZCB8PSAoX2VmbGFncyAmIEVGTEdfWkYpID8gTW92IDogMDsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDY6CS8qIGNtb3ZsL2Ntb3ZuZ2UgKi8KKwkJCWQgfD0gKCEoX2VmbGFncyAmIEVGTEdfU0YpICE9CisJCQkgICAgICAhKF9lZmxhZ3MgJiBFRkxHX09GKSkgPyBNb3YgOiAwOworCQkJYnJlYWs7CisJCX0KKwkJLyogT2RkIGNtb3Ygb3Bjb2RlcyAobHNiID09IDEpIGhhdmUgaW52ZXJ0ZWQgc2Vuc2UuICovCisJCWQgXj0gKGIgJiAxKSA/IE1vdiA6IDA7CisJCWJyZWFrOworCWNhc2UgMHhiMCAuLi4gMHhiMToJLyogY21weGNoZyAqLworCQkvKgorCQkgKiBTYXZlIHJlYWwgc291cmNlIHZhbHVlLCB0aGVuIGNvbXBhcmUgRUFYIGFnYWluc3QKKwkJICogZGVzdGluYXRpb24uCisJCSAqLworCQlzcmMub3JpZ192YWwgPSBzcmMudmFsOworCQlzcmMudmFsID0gX3JlZ3NbVkNQVV9SRUdTX1JBWF07CisJCWVtdWxhdGVfMm9wX1NyY1YoImNtcCIsIHNyYywgZHN0LCBfZWZsYWdzKTsKKwkJLyogQWx3YXlzIHdyaXRlIGJhY2suIFRoZSBxdWVzdGlvbiBpczogd2hlcmUgdG8/ICovCisJCWQgfD0gTW92OworCQlpZiAoX2VmbGFncyAmIEVGTEdfWkYpIHsKKwkJCS8qIFN1Y2Nlc3M6IHdyaXRlIGJhY2sgdG8gbWVtb3J5LiAqLworCQkJZHN0LnZhbCA9IHNyYy5vcmlnX3ZhbDsKKwkJfSBlbHNlIHsKKwkJCS8qIEZhaWx1cmU6IHdyaXRlIHRoZSB2YWx1ZSB3ZSBzYXcgdG8gRUFYLiAqLworCQkJZHN0LnR5cGUgPSBPUF9SRUc7CisJCQlkc3QucHRyID0gKHVuc2lnbmVkIGxvbmcgKikmX3JlZ3NbVkNQVV9SRUdTX1JBWF07CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweGEzOgorCSAgICAgIGJ0OgkJLyogYnQgKi8KKwkJc3JjLnZhbCAmPSAoZHN0LmJ5dGVzIDw8IDMpIC0gMTsgLyogb25seSBzdWJ3b3JkIG9mZnNldCAqLworCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnQiLCBzcmMsIGRzdCwgX2VmbGFncyk7CisJCWJyZWFrOworCWNhc2UgMHhiMzoKKwkgICAgICBidHI6CQkvKiBidHIgKi8KKwkJc3JjLnZhbCAmPSAoZHN0LmJ5dGVzIDw8IDMpIC0gMTsgLyogb25seSBzdWJ3b3JkIG9mZnNldCAqLworCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnRyIiwgc3JjLCBkc3QsIF9lZmxhZ3MpOworCQlicmVhazsKKwljYXNlIDB4YWI6CisJICAgICAgYnRzOgkJLyogYnRzICovCisJCXNyYy52YWwgJj0gKGRzdC5ieXRlcyA8PCAzKSAtIDE7IC8qIG9ubHkgc3Vid29yZCBvZmZzZXQgKi8KKwkJZW11bGF0ZV8yb3BfU3JjVl9ub2J5dGUoImJ0cyIsIHNyYywgZHN0LCBfZWZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSAweGI2IC4uLiAweGI3OgkvKiBtb3Z6eCAqLworCQlkc3QuYnl0ZXMgPSBvcF9ieXRlczsKKwkJZHN0LnZhbCA9IChkICYgQnl0ZU9wKSA/ICh1OCkgc3JjLnZhbCA6ICh1MTYpIHNyYy52YWw7CisJCWJyZWFrOworCWNhc2UgMHhiYjoKKwkgICAgICBidGM6CQkvKiBidGMgKi8KKwkJc3JjLnZhbCAmPSAoZHN0LmJ5dGVzIDw8IDMpIC0gMTsgLyogb25seSBzdWJ3b3JkIG9mZnNldCAqLworCQllbXVsYXRlXzJvcF9TcmNWX25vYnl0ZSgiYnRjIiwgc3JjLCBkc3QsIF9lZmxhZ3MpOworCQlicmVhazsKKwljYXNlIDB4YmE6CQkvKiBHcnA4ICovCisJCXN3aXRjaCAobW9kcm1fcmVnICYgMykgeworCQljYXNlIDA6CisJCQlnb3RvIGJ0OworCQljYXNlIDE6CisJCQlnb3RvIGJ0czsKKwkJY2FzZSAyOgorCQkJZ290byBidHI7CisJCWNhc2UgMzoKKwkJCWdvdG8gYnRjOworCQl9CisJCWJyZWFrOworCWNhc2UgMHhiZSAuLi4gMHhiZjoJLyogbW92c3ggKi8KKwkJZHN0LmJ5dGVzID0gb3BfYnl0ZXM7CisJCWRzdC52YWwgPSAoZCAmIEJ5dGVPcCkgPyAoczgpIHNyYy52YWwgOiAoczE2KSBzcmMudmFsOworCQlicmVhazsKKwl9CisJZ290byB3cml0ZWJhY2s7CisKK3R3b2J5dGVfc3BlY2lhbF9pbnNuOgorCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLworCWRzdC5vcmlnX3ZhbCA9IGRzdC52YWw7CisJc3dpdGNoIChiKSB7CisJY2FzZSAweDBkOgkJLyogR3JwUCAocHJlZmV0Y2gpICovCisJY2FzZSAweDE4OgkJLyogR3JwMTYgKHByZWZldGNoL25vcCkgKi8KKwkJYnJlYWs7CisJY2FzZSAweDA2OgorCQllbXVsYXRlX2NsdHMoY3R4dC0+dmNwdSk7CisJCWJyZWFrOworCWNhc2UgMHgyMDogLyogbW92IGNyLCByZWcgKi8KKwkJaWYgKG1vZHJtX21vZCAhPSAzKQorCQkJZ290byBjYW5ub3RfZW11bGF0ZTsKKwkJX3JlZ3NbbW9kcm1fcm1dID0gcmVhbG1vZGVfZ2V0X2NyKGN0eHQtPnZjcHUsIG1vZHJtX3JlZyk7CisJCWJyZWFrOworCWNhc2UgMHgyMjogLyogbW92IHJlZywgY3IgKi8KKwkJaWYgKG1vZHJtX21vZCAhPSAzKQorCQkJZ290byBjYW5ub3RfZW11bGF0ZTsKKwkJcmVhbG1vZGVfc2V0X2NyKGN0eHQtPnZjcHUsIG1vZHJtX3JlZywgbW9kcm1fdmFsLCAmX2VmbGFncyk7CisJCWJyZWFrOworCWNhc2UgMHhjNzoJCS8qIEdycDkgKGNtcHhjaGc4YikgKi8KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorCQl7CisJCQl1bnNpZ25lZCBsb25nIG9sZF9sbywgb2xkX2hpOworCQkJaWYgKCgocmMgPSBvcHMtPnJlYWRfZW11bGF0ZWQoY3IyICsgMCwgJm9sZF9sbywgNCwKKwkJCQkJCSAgICAgIGN0eHQpKSAhPSAwKQorCQkJICAgIHx8ICgocmMgPSBvcHMtPnJlYWRfZW11bGF0ZWQoY3IyICsgNCwgJm9sZF9oaSwgNCwKKwkJCQkJCQkgY3R4dCkpICE9IDApKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlmICgob2xkX2xvICE9IF9yZWdzW1ZDUFVfUkVHU19SQVhdKQorCQkJICAgIHx8IChvbGRfaGkgIT0gX3JlZ3NbVkNQVV9SRUdTX1JESV0pKSB7CisJCQkJX3JlZ3NbVkNQVV9SRUdTX1JBWF0gPSBvbGRfbG87CisJCQkJX3JlZ3NbVkNQVV9SRUdTX1JEWF0gPSBvbGRfaGk7CisJCQkJX2VmbGFncyAmPSB+RUZMR19aRjsKKwkJCX0gZWxzZSBpZiAob3BzLT5jbXB4Y2hnOGJfZW11bGF0ZWQgPT0gTlVMTCkgeworCQkJCXJjID0gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisJCQkJZ290byBkb25lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHJjID0gb3BzLT5jbXB4Y2hnOGJfZW11bGF0ZWQoY3IyLCBvbGRfbG8sCisJCQkJCQkJICBvbGRfaGksCisJCQkJCQkJICBfcmVnc1tWQ1BVX1JFR1NfUkJYXSwKKwkJCQkJCQkgIF9yZWdzW1ZDUFVfUkVHU19SQ1hdLAorCQkJCQkJCSAgY3R4dCkpICE9IDApCisJCQkJCWdvdG8gZG9uZTsKKwkJCQlfZWZsYWdzIHw9IEVGTEdfWkY7CisJCQl9CisJCQlicmVhazsKKwkJfQorI2VsaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCQl7CisJCQl1bnNpZ25lZCBsb25nIG9sZCwgbmV3OworCQkJaWYgKChyYyA9IG9wcy0+cmVhZF9lbXVsYXRlZChjcjIsICZvbGQsIDgsIGN0eHQpKSAhPSAwKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlmICgoKHUzMikgKG9sZCA+PiAwKSAhPSAodTMyKSBfcmVnc1tWQ1BVX1JFR1NfUkFYXSkgfHwKKwkJCSAgICAoKHUzMikgKG9sZCA+PiAzMikgIT0gKHUzMikgX3JlZ3NbVkNQVV9SRUdTX1JEWF0pKSB7CisJCQkJX3JlZ3NbVkNQVV9SRUdTX1JBWF0gPSAodTMyKSAob2xkID4+IDApOworCQkJCV9yZWdzW1ZDUFVfUkVHU19SRFhdID0gKHUzMikgKG9sZCA+PiAzMik7CisJCQkJX2VmbGFncyAmPSB+RUZMR19aRjsKKwkJCX0gZWxzZSB7CisJCQkJbmV3ID0gKF9yZWdzW1ZDUFVfUkVHU19SQ1hdIDw8IDMyKSB8ICh1MzIpIF9yZWdzW1ZDUFVfUkVHU19SQlhdOworCQkJCWlmICgocmMgPSBvcHMtPmNtcHhjaGdfZW11bGF0ZWQoY3IyLCBvbGQsCisJCQkJCQkJICBuZXcsIDgsIGN0eHQpKSAhPSAwKQorCQkJCQlnb3RvIGRvbmU7CisJCQkJX2VmbGFncyB8PSBFRkxHX1pGOworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCX0KKwlnb3RvIHdyaXRlYmFjazsKKworY2Fubm90X2VtdWxhdGU6CisJRFBSSU5URigiQ2Fubm90IGVtdWxhdGUgJTAyeFxuIiwgYik7CisJcmV0dXJuIC0xOworfQorCisjaWZkZWYgX19YRU5fXworCisjaW5jbHVkZSA8YXNtL21tLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworaW50Cit4ODZfZW11bGF0ZV9yZWFkX3N0ZCh1bnNpZ25lZCBsb25nIGFkZHIsCisJCSAgICAgdW5zaWduZWQgbG9uZyAqdmFsLAorCQkgICAgIHVuc2lnbmVkIGludCBieXRlcywgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJdW5zaWduZWQgaW50IHJjOworCisJKnZhbCA9IDA7CisKKwlpZiAoKHJjID0gY29weV9mcm9tX3VzZXIoKHZvaWQgKil2YWwsICh2b2lkICopYWRkciwgYnl0ZXMpKSAhPSAwKSB7CisJCXByb3BhZ2F0ZV9wYWdlX2ZhdWx0KGFkZHIgKyBieXRlcyAtIHJjLCAwKTsJLyogcmVhZCBmYXVsdCAqLworCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CisJfQorCisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKK2ludAoreDg2X2VtdWxhdGVfd3JpdGVfc3RkKHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAgICAgdW5zaWduZWQgbG9uZyB2YWwsCisJCSAgICAgIHVuc2lnbmVkIGludCBieXRlcywgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJdW5zaWduZWQgaW50IHJjOworCisJaWYgKChyYyA9IGNvcHlfdG9fdXNlcigodm9pZCAqKWFkZHIsICh2b2lkICopJnZhbCwgYnl0ZXMpKSAhPSAwKSB7CisJCXByb3BhZ2F0ZV9wYWdlX2ZhdWx0KGFkZHIgKyBieXRlcyAtIHJjLCBQR0VSUl93cml0ZV9hY2Nlc3MpOworCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CisJfQorCisJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9rdm0veDg2X2VtdWxhdGUuaCBiL2RyaXZlcnMva3ZtL3g4Nl9lbXVsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0MWJkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMva3ZtL3g4Nl9lbXVsYXRlLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHg4Nl9lbXVsYXRlLmgKKyAqCisgKiBHZW5lcmljIHg4NiAoMzItYml0IGFuZCA2NC1iaXQpIGluc3RydWN0aW9uIGRlY29kZXIgYW5kIGVtdWxhdG9yLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBLZWlyIEZyYXNlcgorICoKKyAqIEZyb206IHhlbi11bnN0YWJsZSAxMDY3NjphZjk4MDlmNTFmODFhM2M0M2YyNzZmMDBjODFhNTJlZjU1OGFmZGE0CisgKi8KKworI2lmbmRlZiBfX1g4Nl9FTVVMQVRFX0hfXworI2RlZmluZSBfX1g4Nl9FTVVMQVRFX0hfXworCitzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dDsKKworLyoKKyAqIHg4Nl9lbXVsYXRlX29wczoKKyAqCisgKiBUaGVzZSBvcGVyYXRpb25zIHJlcHJlc2VudCB0aGUgaW5zdHJ1Y3Rpb24gZW11bGF0b3IncyBpbnRlcmZhY2UgdG8gbWVtb3J5LgorICogVGhlcmUgYXJlIHR3byBjYXRlZ29yaWVzIG9mIG9wZXJhdGlvbjogdGhvc2UgdGhhdCBhY3Qgb24gb3JkaW5hcnkgbWVtb3J5CisgKiByZWdpb25zICgqX3N0ZCksIGFuZCB0aG9zZSB0aGF0IGFjdCBvbiBtZW1vcnkgcmVnaW9ucyBrbm93biB0byByZXF1aXJlCisgKiBzcGVjaWFsIHRyZWF0bWVudCBvciBlbXVsYXRpb24gKCpfZW11bGF0ZWQpLgorICoKKyAqIFRoZSBlbXVsYXRvciBhc3N1bWVzIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gYWNjZXNzZXMgb25seSBvbmUgJ2VtdWxhdGVkIG1lbW9yeScKKyAqIGxvY2F0aW9uLCB0aGF0IHRoaXMgbG9jYXRpb24gaXMgdGhlIGdpdmVuIGxpbmVhciBmYXVsdGluZyBhZGRyZXNzIChjcjIpLCBhbmQKKyAqIHRoYXQgdGhpcyBpcyBvbmUgb2YgdGhlIGluc3RydWN0aW9uJ3MgZGF0YSBvcGVyYW5kcy4gSW5zdHJ1Y3Rpb24gZmV0Y2hlcyBhbmQKKyAqIHN0YWNrIG9wZXJhdGlvbnMgYXJlIGFzc3VtZWQgbmV2ZXIgdG8gYWNjZXNzIGVtdWxhdGVkIG1lbW9yeS4gVGhlIGVtdWxhdG9yCisgKiBhdXRvbWF0aWNhbGx5IGRlZHVjZXMgd2hpY2ggb3BlcmFuZCBvZiBhIHN0cmluZy1tb3ZlIG9wZXJhdGlvbiBpcyBhY2Nlc3NpbmcKKyAqIGVtdWxhdGVkIG1lbW9yeSwgYW5kIGFzc3VtZXMgdGhhdCB0aGUgb3RoZXIgb3BlcmFuZCBhY2Nlc3NlcyBub3JtYWwgbWVtb3J5LgorICoKKyAqIE5PVEVTOgorICogIDEuIFRoZSBlbXVsYXRvciBpc24ndCB2ZXJ5IHNtYXJ0IGFib3V0IGVtdWxhdGVkIHZzLiBzdGFuZGFyZCBtZW1vcnkuCisgKiAgICAgJ0VtdWxhdGVkIG1lbW9yeScgYWNjZXNzIGFkZHJlc3NlcyBzaG91bGQgYmUgY2hlY2tlZCBmb3Igc2FuaXR5LgorICogICAgICdOb3JtYWwgbWVtb3J5JyBhY2Nlc3NlcyBtYXkgZmF1bHQsIGFuZCB0aGUgY2FsbGVyIG11c3QgYXJyYW5nZSB0bworICogICAgIGRldGVjdCBhbmQgaGFuZGxlIHJlZW50cmFuY3kgaW50byB0aGUgZW11bGF0b3IgdmlhIHJlY3Vyc2l2ZSBmYXVsdHMuCisgKiAgICAgQWNjZXNzZXMgbWF5IGJlIHVuYWxpZ25lZCBhbmQgbWF5IGNyb3NzIHBhZ2UgYm91bmRhcmllcy4KKyAqICAyLiBJZiB0aGUgYWNjZXNzIGZhaWxzIChjYW5ub3QgZW11bGF0ZSwgb3IgYSBzdGFuZGFyZCBhY2Nlc3MgZmF1bHRzKSB0aGVuCisgKiAgICAgaXQgaXMgdXAgdG8gdGhlIG1lbW9wIHRvIHByb3BhZ2F0ZSB0aGUgZmF1bHQgdG8gdGhlIGd1ZXN0IFZNIHZpYQorICogICAgIHNvbWUgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLCB1bmtub3duIHRvIHRoZSBlbXVsYXRvci4gVGhlIG1lbW9wIHNpZ25hbHMKKyAqICAgICBmYWlsdXJlIGJ5IHJldHVybmluZyBYODZFTVVMX1BST1BBR0FURV9GQVVMVCB0byB0aGUgZW11bGF0b3IsIHdoaWNoIHdpbGwKKyAqICAgICB0aGVuIGltbWVkaWF0ZWx5IGJhaWwuCisgKiAgMy4gVmFsaWQgYWNjZXNzIHNpemVzIGFyZSAxLCAyLCA0IGFuZCA4IGJ5dGVzLiBPbiB4ODYvMzIgc3lzdGVtcyBvbmx5CisgKiAgICAgY21weGNoZzhiX2VtdWxhdGVkIG5lZWQgc3VwcG9ydCA4LWJ5dGUgYWNjZXNzZXMuCisgKiAgNC4gVGhlIGVtdWxhdG9yIGNhbm5vdCBoYW5kbGUgNjQtYml0IG1vZGUgZW11bGF0aW9uIG9uIGFuIHg4Ni8zMiBzeXN0ZW0uCisgKi8KKy8qIEFjY2VzcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5OiBjb250aW51ZSBlbXVsYXRpb24gYXMgbm9ybWFsLiAqLworI2RlZmluZSBYODZFTVVMX0NPTlRJTlVFICAgICAgICAwCisvKiBBY2Nlc3MgaXMgdW5oYW5kbGVhYmxlOiBiYWlsIGZyb20gZW11bGF0aW9uIGFuZCByZXR1cm4gZXJyb3IgdG8gY2FsbGVyLiAqLworI2RlZmluZSBYODZFTVVMX1VOSEFORExFQUJMRSAgICAxCisvKiBUZXJtaW5hdGUgZW11bGF0aW9uIGJ1dCByZXR1cm4gc3VjY2VzcyB0byB0aGUgY2FsbGVyLiAqLworI2RlZmluZSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCAyIC8qIHByb3BhZ2F0ZSBhIGdlbmVyYXRlZCBmYXVsdCB0byBndWVzdCAqLworI2RlZmluZSBYODZFTVVMX1JFVFJZX0lOU1RSICAgICAyIC8qIHJldHJ5IHRoZSBpbnN0cnVjdGlvbiBmb3Igc29tZSByZWFzb24gKi8KKyNkZWZpbmUgWDg2RU1VTF9DTVBYQ0hHX0ZBSUxFRCAgMiAvKiBjbXB4Y2hnIGRpZCBub3Qgc2VlIGV4cGVjdGVkIHZhbHVlICovCitzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzIHsKKwkvKgorCSAqIHJlYWRfc3RkOiBSZWFkIGJ5dGVzIG9mIHN0YW5kYXJkIChub24tZW11bGF0ZWQvc3BlY2lhbCkgbWVtb3J5LgorCSAqICAgICAgICAgICBVc2VkIGZvciBpbnN0cnVjdGlvbiBmZXRjaCwgc3RhY2sgb3BlcmF0aW9ucywgYW5kIG90aGVycy4KKwkgKiAgQGFkZHI6ICBbSU4gXSBMaW5lYXIgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlYWQuCisJICogIEB2YWw6ICAgW09VVF0gVmFsdWUgcmVhZCBmcm9tIG1lbW9yeSwgemVyby1leHRlbmRlZCB0byAndV9sb25nJy4KKwkgKiAgQGJ5dGVzOiBbSU4gXSBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIG1lbW9yeS4KKwkgKi8KKwlpbnQgKCpyZWFkX3N0ZCkodW5zaWduZWQgbG9uZyBhZGRyLAorCQkJdW5zaWduZWQgbG9uZyAqdmFsLAorCQkJdW5zaWduZWQgaW50IGJ5dGVzLCBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqIGN0eHQpOworCisJLyoKKwkgKiB3cml0ZV9zdGQ6IFdyaXRlIGJ5dGVzIG9mIHN0YW5kYXJkIChub24tZW11bGF0ZWQvc3BlY2lhbCkgbWVtb3J5LgorCSAqICAgICAgICAgICAgVXNlZCBmb3Igc3RhY2sgb3BlcmF0aW9ucywgYW5kIG90aGVycy4KKwkgKiAgQGFkZHI6ICBbSU4gXSBMaW5lYXIgYWRkcmVzcyB0byB3aGljaCB0byB3cml0ZS4KKwkgKiAgQHZhbDogICBbSU4gXSBWYWx1ZSB0byB3cml0ZSB0byBtZW1vcnkgKGxvdy1vcmRlciBieXRlcyB1c2VkIGFzCisJICogICAgICAgICAgICAgICAgcmVxdWlyZWQpLgorCSAqICBAYnl0ZXM6IFtJTiBdIE51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byBtZW1vcnkuCisJICovCisJaW50ICgqd3JpdGVfc3RkKSh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkgdW5zaWduZWQgaW50IGJ5dGVzLCBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqIGN0eHQpOworCisJLyoKKwkgKiByZWFkX2VtdWxhdGVkOiBSZWFkIGJ5dGVzIGZyb20gZW11bGF0ZWQvc3BlY2lhbCBtZW1vcnkgYXJlYS4KKwkgKiAgQGFkZHI6ICBbSU4gXSBMaW5lYXIgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlYWQuCisJICogIEB2YWw6ICAgW09VVF0gVmFsdWUgcmVhZCBmcm9tIG1lbW9yeSwgemVyby1leHRlbmRlZCB0byAndV9sb25nJy4KKwkgKiAgQGJ5dGVzOiBbSU4gXSBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIG1lbW9yeS4KKwkgKi8KKwlpbnQgKCpyZWFkX2VtdWxhdGVkKSAodW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqdmFsLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKiBjdHh0KTsKKworCS8qCisJICogd3JpdGVfZW11bGF0ZWQ6IFJlYWQgYnl0ZXMgZnJvbSBlbXVsYXRlZC9zcGVjaWFsIG1lbW9yeSBhcmVhLgorCSAqICBAYWRkcjogIFtJTiBdIExpbmVhciBhZGRyZXNzIHRvIHdoaWNoIHRvIHdyaXRlLgorCSAqICBAdmFsOiAgIFtJTiBdIFZhbHVlIHRvIHdyaXRlIHRvIG1lbW9yeSAobG93LW9yZGVyIGJ5dGVzIHVzZWQgYXMKKwkgKiAgICAgICAgICAgICAgICByZXF1aXJlZCkuCisJICogIEBieXRlczogW0lOIF0gTnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIG1lbW9yeS4KKwkgKi8KKwlpbnQgKCp3cml0ZV9lbXVsYXRlZCkgKHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisJCQkgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKiBjdHh0KTsKKworCS8qCisJICogY21weGNoZ19lbXVsYXRlZDogRW11bGF0ZSBhbiBhdG9taWMgKExPQ0tlZCkgQ01QWENIRyBvcGVyYXRpb24gb24gYW4KKwkgKiAgICAgICAgICAgICAgICAgICBlbXVsYXRlZC9zcGVjaWFsIG1lbW9yeSBhcmVhLgorCSAqICBAYWRkcjogIFtJTiBdIExpbmVhciBhZGRyZXNzIHRvIGFjY2Vzcy4KKwkgKiAgQG9sZDogICBbSU4gXSBWYWx1ZSBleHBlY3RlZCB0byBiZSBjdXJyZW50IGF0IEBhZGRyLgorCSAqICBAbmV3OiAgIFtJTiBdIFZhbHVlIHRvIHdyaXRlIHRvIEBhZGRyLgorCSAqICBAYnl0ZXM6IFtJTiBdIE51bWJlciBvZiBieXRlcyB0byBhY2Nlc3MgdXNpbmcgQ01QWENIRy4KKwkgKi8KKwlpbnQgKCpjbXB4Y2hnX2VtdWxhdGVkKSAodW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSB1bnNpZ25lZCBsb25nIG9sZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBuZXcsCisJCQkJIHVuc2lnbmVkIGludCBieXRlcywKKwkJCQkgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKiBjdHh0KTsKKworCS8qCisJICogY21weGNoZzhiX2VtdWxhdGVkOiBFbXVsYXRlIGFuIGF0b21pYyAoTE9DS2VkKSBDTVBYQ0hHOEIgb3BlcmF0aW9uIG9uIGFuCisJICogICAgICAgICAgICAgICAgICAgICBlbXVsYXRlZC9zcGVjaWFsIG1lbW9yeSBhcmVhLgorCSAqICBAYWRkcjogIFtJTiBdIExpbmVhciBhZGRyZXNzIHRvIGFjY2Vzcy4KKwkgKiAgQG9sZDogICBbSU4gXSBWYWx1ZSBleHBlY3RlZCB0byBiZSBjdXJyZW50IGF0IEBhZGRyLgorCSAqICBAbmV3OiAgIFtJTiBdIFZhbHVlIHRvIHdyaXRlIHRvIEBhZGRyLgorCSAqIE5PVEVTOgorCSAqICAxLiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXZlciBjYWxsZWQgd2hlbiBlbXVsYXRpbmcgYSByZWFsIENNUFhDSEc4Qi4KKwkgKiAgMi4gVGhpcyBmdW5jdGlvbiBpcyAqbmV2ZXIqIGNhbGxlZCBvbiB4ODYvNjQgc3lzdGVtcy4KKwkgKiAgMi4gTm90IGRlZmluaW5nIHRoaXMgZnVuY3Rpb24gKGkuZS4sIHNwZWNpZnlpbmcgTlVMTCkgaXMgZXF1aXZhbGVudAorCSAqICAgICB0byBkZWZpbmluZyBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgWDg2RU1VTF9VTkhBTkRMRUFCTEUuCisJICovCisJaW50ICgqY21weGNoZzhiX2VtdWxhdGVkKSAodW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2xkX2xvLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2xkX2hpLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbmV3X2xvLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbmV3X2hpLAorCQkJCSAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICogY3R4dCk7Cit9OworCitzdHJ1Y3QgY3B1X3VzZXJfcmVnczsKKworc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgeworCS8qIFJlZ2lzdGVyIHN0YXRlIGJlZm9yZS9hZnRlciBlbXVsYXRpb24uICovCisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCisJLyogTGluZWFyIGZhdWx0aW5nIGFkZHJlc3MgKGlmIGVtdWxhdGluZyBhIHBhZ2UtZmF1bHRpbmcgaW5zdHJ1Y3Rpb24pLiAqLworCXVuc2lnbmVkIGxvbmcgZWZsYWdzOworCXVuc2lnbmVkIGxvbmcgY3IyOworCisJLyogRW11bGF0ZWQgZXhlY3V0aW9uIG1vZGUsIHJlcHJlc2VudGVkIGJ5IGFuIFg4NkVNVUxfTU9ERSB2YWx1ZS4gKi8KKwlpbnQgbW9kZTsKKworCXVuc2lnbmVkIGxvbmcgY3NfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGRzX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBlc19iYXNlOworCXVuc2lnbmVkIGxvbmcgc3NfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGdzX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBmc19iYXNlOworfTsKKworLyogRXhlY3V0aW9uIG1vZGUsIHBhc3NlZCB0byB0aGUgZW11bGF0b3IuICovCisjZGVmaW5lIFg4NkVNVUxfTU9ERV9SRUFMICAgICAwCS8qIFJlYWwgbW9kZS4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgWDg2RU1VTF9NT0RFX1BST1QxNiAgIDIJLyogMTYtYml0IHByb3RlY3RlZCBtb2RlLiAqLworI2RlZmluZSBYODZFTVVMX01PREVfUFJPVDMyICAgNAkvKiAzMi1iaXQgcHJvdGVjdGVkIG1vZGUuICovCisjZGVmaW5lIFg4NkVNVUxfTU9ERV9QUk9UNjQgICA4CS8qIDY0LWJpdCAobG9uZykgbW9kZS4gICAgKi8KKworLyogSG9zdCBleGVjdXRpb24gbW9kZS4gKi8KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBYODZFTVVMX01PREVfSE9TVCBYODZFTVVMX01PREVfUFJPVDMyCisjZWxpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisjZGVmaW5lIFg4NkVNVUxfTU9ERV9IT1NUIFg4NkVNVUxfTU9ERV9QUk9UNjQKKyNlbmRpZgorCisvKgorICogeDg2X2VtdWxhdGVfbWVtb3A6IEVtdWxhdGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBmYXVsdGVkIGF0dGVtcHRpbmcgdG8KKyAqICAgICAgICAgICAgICAgICAgICByZWFkL3dyaXRlIGEgJ3NwZWNpYWwnIG1lbW9yeSBhcmVhLgorICogUmV0dXJucyAtMSBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCB4ODZfZW11bGF0ZV9tZW1vcChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKTsKKworLyoKKyAqIEdpdmVuIHRoZSAncmVnJyBwb3J0aW9uIG9mIGEgTW9kUk0gYnl0ZSwgYW5kIGEgcmVnaXN0ZXIgYmxvY2ssIHJldHVybiBhCisgKiBwb2ludGVyIGludG8gdGhlIGJsb2NrIHRoYXQgYWRkcmVzc2VzIHRoZSByZWxldmFudCByZWdpc3Rlci4KKyAqIEBoaWdoYnl0ZV9yZWdzIHNwZWNpZmllcyB3aGV0aGVyIHRvIGRlY29kZSBBSCxDSCxESCxCSC4KKyAqLwordm9pZCAqZGVjb2RlX3JlZ2lzdGVyKHU4IG1vZHJtX3JlZywgdW5zaWduZWQgbG9uZyAqcmVncywKKwkJICAgICAgaW50IGhpZ2hieXRlX3JlZ3MpOworCisjZW5kaWYJCQkJLyogX19YODZfRU1VTEFURV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmlnIGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggOWMzOWI5OC4uNzM5OWJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL0tjb25maWcKKysrIGIvZHJpdmVycy9sZWRzL0tjb25maWcKQEAgLTEyLDcgKzEyLDcgQEAKIAogY29uZmlnIExFRFNfQ0xBU1MKIAl0cmlzdGF0ZSAiTEVEIENsYXNzIFN1cHBvcnQiCi0JZGVwZW5kcyBORVdfTEVEUworCWRlcGVuZHMgb24gTkVXX0xFRFMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBsZWQgc3lzZnMgY2xhc3MgaW4gL3N5cy9jbGFzcy9sZWRzLiAgWW91J2xsCiAJICBuZWVkIHRoaXMgdG8gZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggTEVEcy4gIElmIHVuc3VyZSwgc2F5IE4uCkBAIC0yMSwyOCArMjEsMjggQEAKIAogY29uZmlnIExFRFNfQ09SR0kKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIHRoZSBTaGFycCBTTC1DN3gwIHNlcmllcyIKLQlkZXBlbmRzIExFRFNfQ0xBU1MgJiYgUFhBX1NIQVJQX0M3eHgKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgUFhBX1NIQVJQX0M3eHgKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMRURzIG9uIFNoYXJwIFphdXJ1cwogCSAgU0wtQzd4MCBzZXJpZXMgKEM3MDAsIEM3NTAsIEM3NjAsIEM4NjApLgogCiBjb25maWcgTEVEU19MT0NPTU8KIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIExvY29tbyBkZXZpY2UiCi0JZGVwZW5kcyBMRURTX0NMQVNTICYmIFNIQVJQX0xPQ09NTworCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBTSEFSUF9MT0NPTU8KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMRURzIG9uIFNoYXJwIExvY29tby4KIAkgIFphdXJ1cyBtb2RlbHMgU0wtNTUwMCBhbmQgU0wtNTYwMC4KIAogY29uZmlnIExFRFNfU1BJVFoKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIHRoZSBTaGFycCBTTC1DeHgwMCBzZXJpZXMiCi0JZGVwZW5kcyBMRURTX0NMQVNTICYmIFBYQV9TSEFSUF9DeHgwMAorCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBQWEFfU0hBUlBfQ3h4MDAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMRURzIG9uIFNoYXJwIFphdXJ1cwogCSAgU0wtQ3h4MDAgc2VyaWVzIChDMTAwMCwgQzMwMDAsIEMzMTAwKS4KIAogY29uZmlnIExFRFNfSVhQNFhYCiAJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciBHUElPIGNvbm5lY3RlZCBMRURzIG9uIElYUDRYWCBwcm9jZXNzb3JzIgotCWRlcGVuZHMgTEVEU19DTEFTUyAmJiBBUkNIX0lYUDRYWAorCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBBUkNIX0lYUDRYWAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIExFRHMgY29ubmVjdGVkIHRvIEdQSU8KIAkgIG91dHB1dHMgb2YgdGhlIEludGVsIElYUDRYWCBwcm9jZXNzb3JzLiAgVG8gYmUgdXNlZnVsIHRoZQpAQCAtNTEsNyArNTEsNyBAQAogCiBjb25maWcgTEVEU19UT1NBCiAJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciB0aGUgU2hhcnAgU0wtNjAwMCBzZXJpZXMiCi0JZGVwZW5kcyBMRURTX0NMQVNTICYmIFBYQV9TSEFSUFNMCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIFBYQV9TSEFSUFNMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTEVEcyBvbiBTaGFycCBaYXVydXMKIAkgIFNMLTYwMDAgc2VyaWVzLgpAQCAtNjUsNyArNjUsNyBAQAogCiBjb25maWcgTEVEU19BTVNfREVMVEEKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIHRoZSBBbXN0cmFkIERlbHRhIChFMykiCi0JZGVwZW5kcyBMRURTX0NMQVNTICYmIE1BQ0hfQU1TX0RFTFRBCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIE1BQ0hfQU1TX0RFTFRBCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTEVEcyBvbiBBbXN0cmFkIERlbHRhIChFMykuCiAKQEAgLTc2LDExICs3NiwxNyBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU29la3JpcyBuZXQ0ODAxIGFuZCBuZXQ0ODI2IGVycm9yCiAJICBMRUQuCiAKK2NvbmZpZyBMRURTX1dSQVAKKwl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIHRoZSBXUkFQIHNlcmllcyBMRURzIgorCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBTQ3gyMDBfR1BJTworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFBDRW5naW5lcyBXUkFQIHByb2dyYW1tYWJsZSBMRURzLgorCiBjb21tZW50ICJMRUQgVHJpZ2dlcnMiCiAKIGNvbmZpZyBMRURTX1RSSUdHRVJTCiAJYm9vbCAiTEVEIFRyaWdnZXIgc3VwcG9ydCIKLQlkZXBlbmRzIE5FV19MRURTCisJZGVwZW5kcyBvbiBORVdfTEVEUwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdHJpZ2dlciBzdXBwb3J0IGZvciB0aGUgbGVkcyBjbGFzcy4KIAkgIFRoZXNlIHRyaWdnZXJzIGFsbG93IGtlcm5lbCBldmVudHMgdG8gZHJpdmUgdGhlIExFRHMgYW5kIGNhbgpAQCAtODgsMjEgKzk0LDIxIEBACiAKIGNvbmZpZyBMRURTX1RSSUdHRVJfVElNRVIKIAl0cmlzdGF0ZSAiTEVEIFRpbWVyIFRyaWdnZXIiCi0JZGVwZW5kcyBMRURTX1RSSUdHRVJTCisJZGVwZW5kcyBvbiBMRURTX1RSSUdHRVJTCiAJaGVscAogCSAgVGhpcyBhbGxvd3MgTEVEcyB0byBiZSBjb250cm9sbGVkIGJ5IGEgcHJvZ3JhbW1hYmxlIHRpbWVyCiAJICB2aWEgc3lzZnMuIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBMRURTX1RSSUdHRVJfSURFX0RJU0sKIAlib29sICJMRUQgSURFIERpc2sgVHJpZ2dlciIKLQlkZXBlbmRzIExFRFNfVFJJR0dFUlMgJiYgQkxLX0RFVl9JREVESVNLCisJZGVwZW5kcyBvbiBMRURTX1RSSUdHRVJTICYmIEJMS19ERVZfSURFRElTSwogCWhlbHAKIAkgIFRoaXMgYWxsb3dzIExFRHMgdG8gYmUgY29udHJvbGxlZCBieSBJREUgZGlzayBhY3Rpdml0eS4KIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBMRURTX1RSSUdHRVJfSEVBUlRCRUFUCiAJdHJpc3RhdGUgIkxFRCBIZWFydGJlYXQgVHJpZ2dlciIKLQlkZXBlbmRzIExFRFNfVFJJR0dFUlMKKwlkZXBlbmRzIG9uIExFRFNfVFJJR0dFUlMKIAloZWxwCiAJICBUaGlzIGFsbG93cyBMRURzIHRvIGJlIGNvbnRyb2xsZWQgYnkgYSBDUFUgbG9hZCBhdmVyYWdlLgogCSAgVGhlIGZsYXNoIGZyZXF1ZW5jeSBpcyBhIGh5cGVyYm9saWMgZnVuY3Rpb24gb2YgdGhlIDEtbWludXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKaW5kZXggNmFhMmFlZC4uNTAwZGUzZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKQEAgLTEzLDYgKzEzLDcgQEAKIG9iai0kKENPTkZJR19MRURTX1MzQzI0WFgpCQkrPSBsZWRzLXMzYzI0eHgubwogb2JqLSQoQ09ORklHX0xFRFNfQU1TX0RFTFRBKQkJKz0gbGVkcy1hbXMtZGVsdGEubwogb2JqLSQoQ09ORklHX0xFRFNfTkVUNDhYWCkJCSs9IGxlZHMtbmV0NDh4eC5vCitvYmotJChDT05GSUdfTEVEU19XUkFQKQkJCSs9IGxlZHMtd3JhcC5vCiAKICMgTEVEIFRyaWdnZXJzCiBvYmotJChDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSKQkrPSBsZWR0cmlnLXRpbWVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYyBiL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYwppbmRleCBhZWNiYmUyLi4zYzE3MTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jCkBAIC05MSw2ICs5MSw4IEBACiAgKi8KIGludCBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKIHsKKwlpbnQgcmM7CisKIAlsZWRfY2Rldi0+Y2xhc3NfZGV2ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShsZWRzX2NsYXNzLCBOVUxMLCAwLAogCQkJCQkJcGFyZW50LCAiJXMiLCBsZWRfY2Rldi0+bmFtZSk7CiAJaWYgKHVubGlrZWx5KElTX0VSUihsZWRfY2Rldi0+Y2xhc3NfZGV2KSkpCkBAIC05OSw4ICsxMDEsMTAgQEAKIAljbGFzc19zZXRfZGV2ZGF0YShsZWRfY2Rldi0+Y2xhc3NfZGV2LCBsZWRfY2Rldik7CiAKIAkvKiByZWdpc3RlciB0aGUgYXR0cmlidXRlcyAqLwotCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShsZWRfY2Rldi0+Y2xhc3NfZGV2LAotCQkJCSZjbGFzc19kZXZpY2VfYXR0cl9icmlnaHRuZXNzKTsKKwlyYyA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShsZWRfY2Rldi0+Y2xhc3NfZGV2LAorCQkJCSAgICAgICZjbGFzc19kZXZpY2VfYXR0cl9icmlnaHRuZXNzKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKIAogCS8qIGFkZCB0byB0aGUgbGlzdCBvZiBsZWRzICovCiAJd3JpdGVfbG9jaygmbGVkc19saXN0X2xvY2spOwpAQCAtMTEwLDE2ICsxMTQsMjggQEAKICNpZmRlZiBDT05GSUdfTEVEU19UUklHR0VSUwogCXJ3bG9ja19pbml0KCZsZWRfY2Rldi0+dHJpZ2dlcl9sb2NrKTsKIAotCWxlZF90cmlnZ2VyX3NldF9kZWZhdWx0KGxlZF9jZGV2KTsKKwlyYyA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShsZWRfY2Rldi0+Y2xhc3NfZGV2LAorCQkJCSAgICAgICZjbGFzc19kZXZpY2VfYXR0cl90cmlnZ2VyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9sZWRfbGlzdDsKIAotCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShsZWRfY2Rldi0+Y2xhc3NfZGV2LAotCQkJCSZjbGFzc19kZXZpY2VfYXR0cl90cmlnZ2VyKTsKKwlsZWRfdHJpZ2dlcl9zZXRfZGVmYXVsdChsZWRfY2Rldik7CiAjZW5kaWYKIAogCXByaW50ayhLRVJOX0lORk8gIlJlZ2lzdGVyZWQgbGVkIGRldmljZTogJXNcbiIsCiAJCQlsZWRfY2Rldi0+Y2xhc3NfZGV2LT5jbGFzc19pZCk7CiAKIAlyZXR1cm4gMDsKKworI2lmZGVmIENPTkZJR19MRURTX1RSSUdHRVJTCitlcnJfb3V0X2xlZF9saXN0OgorCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShsZWRfY2Rldi0+Y2xhc3NfZGV2LAorCQkJCSZjbGFzc19kZXZpY2VfYXR0cl9icmlnaHRuZXNzKTsKKwlsaXN0X2RlbCgmbGVkX2NkZXYtPm5vZGUpOworI2VuZGlmCitlcnJfb3V0OgorCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKGxlZF9jZGV2LT5jbGFzc19kZXYpOworCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxlZF9jbGFzc2Rldl9yZWdpc3Rlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXdyYXAuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXdyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZiMmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogTEVEcyBkcml2ZXIgZm9yIFBDRW5naW5lcyBXUkFQCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEtyaXN0aWFuIEtpZWxob2ZuZXIgPGtyaXNAa3Jpc2sub3JnPgorICoKKyAqIEJhc2VkIG9uIGxlZHMtbmV0NDh4eC5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY3gyMDBfZ3Bpby5oPgorCisjZGVmaW5lIERSVk5BTUUgIndyYXAtbGVkIgorI2RlZmluZSBXUkFQX0VSUk9SX0xFRF9HUElPCTMKKyNkZWZpbmUJV1JBUF9FWFRSQV9MRURfR1BJTwkxOAorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKworc3RhdGljIHZvaWQgd3JhcF9lcnJvcl9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQllbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCWlmICh2YWx1ZSkKKwkJc2N4MjAwX2dwaW9fc2V0X2xvdyhXUkFQX0VSUk9SX0xFRF9HUElPKTsKKwllbHNlCisJCXNjeDIwMF9ncGlvX3NldF9oaWdoKFdSQVBfRVJST1JfTEVEX0dQSU8pOworfQorCitzdGF0aWMgdm9pZCB3cmFwX2V4dHJhX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJaWYgKHZhbHVlKQorCQlzY3gyMDBfZ3Bpb19zZXRfbG93KFdSQVBfRVhUUkFfTEVEX0dQSU8pOworCWVsc2UKKwkJc2N4MjAwX2dwaW9fc2V0X2hpZ2goV1JBUF9FWFRSQV9MRURfR1BJTyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IHdyYXBfZXJyb3JfbGVkID0geworCS5uYW1lCQk9ICJ3cmFwOmVycm9yIiwKKwkuYnJpZ2h0bmVzc19zZXQJPSB3cmFwX2Vycm9yX2xlZF9zZXQsCit9OworCitzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiB3cmFwX2V4dHJhX2xlZCA9IHsKKwkubmFtZSAgICAgICAgICAgPSAid3JhcDpleHRyYSIsCisJLmJyaWdodG5lc3Nfc2V0ID0gd3JhcF9leHRyYV9sZWRfc2V0LAorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB3cmFwX2xlZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwkJcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZ3cmFwX2Vycm9yX2xlZCk7CisJbGVkX2NsYXNzZGV2X3N1c3BlbmQoJndyYXBfZXh0cmFfbGVkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cmFwX2xlZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWxlZF9jbGFzc2Rldl9yZXN1bWUoJndyYXBfZXJyb3JfbGVkKTsKKwlsZWRfY2xhc3NkZXZfcmVzdW1lKCZ3cmFwX2V4dHJhX2xlZCk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB3cmFwX2xlZF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgd3JhcF9sZWRfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHdyYXBfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmd3JhcF9lcnJvcl9sZWQpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJndyYXBfZXh0cmFfbGVkKTsKKwkJaWYgKHJldCA8IDApCisJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3Rlcigmd3JhcF9lcnJvcl9sZWQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdyYXBfbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ3cmFwX2Vycm9yX2xlZCk7CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJndyYXBfZXh0cmFfbGVkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd3JhcF9sZWRfZHJpdmVyID0geworCS5wcm9iZQkJPSB3cmFwX2xlZF9wcm9iZSwKKwkucmVtb3ZlCQk9IHdyYXBfbGVkX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHdyYXBfbGVkX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB3cmFwX2xlZF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9IERSVk5BTUUsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgd3JhcF9sZWRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoIXNjeDIwMF9ncGlvX3ByZXNlbnQoKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndyYXBfbGVkX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJWTkFNRSwgLTEsIE5VTEwsIDApOworCWlmIChJU19FUlIocGRldikpIHsKKwkJcmV0ID0gUFRSX0VSUihwZGV2KTsKKwkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndyYXBfbGVkX2RyaXZlcik7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3cmFwX2xlZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndyYXBfbGVkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHdyYXBfbGVkX2luaXQpOworbW9kdWxlX2V4aXQod3JhcF9sZWRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIktyaXN0aWFuIEtpZWxob2ZuZXIgPGtyaXNAa3Jpc2sub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0VuZ2luZXMgV1JBUCBMRUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWR0cmlnLWlkZS1kaXNrLmMgYi9kcml2ZXJzL2xlZHMvbGVkdHJpZy1pZGUtZGlzay5jCmluZGV4IGZhNjUxODguLjU0YjE1NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWR0cmlnLWlkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctaWRlLWRpc2suYwpAQCAtMTIsNiArMTIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkdHJpZy10aW1lci5jIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctdGltZXIuYwppbmRleCAxNzljMjg3Li5kNzU2YmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkdHJpZy10aW1lci5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWR0cmlnLXRpbWVyLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0xMjMsNiArMTI0LDcgQEAKIHN0YXRpYyB2b2lkIHRpbWVyX3RyaWdfYWN0aXZhdGUoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCiB7CiAJc3RydWN0IHRpbWVyX3RyaWdfZGF0YSAqdGltZXJfZGF0YTsKKwlpbnQgcmM7CiAKIAl0aW1lcl9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRpbWVyX3RyaWdfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghdGltZXJfZGF0YSkKQEAgLTEzNCwxMCArMTM2LDIxIEBACiAJdGltZXJfZGF0YS0+dGltZXIuZnVuY3Rpb24gPSBsZWRfdGltZXJfZnVuY3Rpb247CiAJdGltZXJfZGF0YS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBsZWRfY2RldjsKIAotCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShsZWRfY2Rldi0+Y2xhc3NfZGV2LAorCXJjID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGxlZF9jZGV2LT5jbGFzc19kZXYsCiAJCQkJJmNsYXNzX2RldmljZV9hdHRyX2RlbGF5X29uKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUobGVkX2NkZXYtPmNsYXNzX2RldiwKKwlpZiAocmMpIGdvdG8gZXJyX291dDsKKwlyYyA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShsZWRfY2Rldi0+Y2xhc3NfZGV2LAogCQkJCSZjbGFzc19kZXZpY2VfYXR0cl9kZWxheV9vZmYpOworCWlmIChyYykgZ290byBlcnJfb3V0X2RlbGF5b247CisKKwlyZXR1cm47CisKK2Vycl9vdXRfZGVsYXlvbjoKKwljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUobGVkX2NkZXYtPmNsYXNzX2RldiwKKwkJCQkmY2xhc3NfZGV2aWNlX2F0dHJfZGVsYXlfb24pOworZXJyX291dDoKKwlsZWRfY2Rldi0+dHJpZ2dlcl9kYXRhID0gTlVMTDsKKwlrZnJlZSh0aW1lcl9kYXRhKTsKIH0KIAogc3RhdGljIHZvaWQgdGltZXJfdHJpZ19kZWFjdGl2YXRlKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZyBiL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKaW5kZXggN2Y4NDc3ZC4uYTllNzQ3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZworKysgYi9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCkBAIC0xNjIsNyArMTYyLDYgQEAKIAogY29uZmlnIE1BQ19FTVVNT1VTRUJUTgogCWJvb2wgIlN1cHBvcnQgZm9yIG1vdXNlIGJ1dHRvbiAyKzMgZW11bGF0aW9uIgotCWRlcGVuZHMgb24gSU5QVVRfQURCSElECiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBnZW5lcmljIHN1cHBvcnQgZm9yIGVtdWxhdGluZyB0aGUgMm5kIGFuZCAzcmQgbW91c2UKIAkgIGJ1dHRvbiB3aXRoIGtleXByZXNzZXMuICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIGVtdWxhdGlvbiBpcyBzdGlsbApAQCAtMjI4LDQgKzIyNywxMSBAQAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBBTlMgTENEIGRpc3BsYXkiCiAJZGVwZW5kcyBvbiBBREJfQ1VEQSAmJiBQUENfUE1BQwogCitjb25maWcgUE1BQ19SQUNLTUVURVIKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQXBwbGUgWFNlcnZlIGZyb250IHBhbmVsIExFRHMiCisJZGVwZW5kcyBvbiBQUENfUE1BQworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb2NpZGVzIHNvbWUgc3VwcG9ydCB0byBjb250cm9sIHRoZSBmcm9udCBwYW5lbAorICAgICAgICAgIGJsdWUgTEVEcyAidnUtbWV0ZXIiIG9mIHRoZSBYU2VydmVyIG1hY3MuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlIGIvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKaW5kZXggYjUzZDQ1Zi4uMmRmYzNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvTWFrZWZpbGUKQEAgLTQyLDMgKzQyLDQgQEAKIAkJCQkgICB3aW5kZmFybV9zbXVfc2Vuc29ycy5vIFwKIAkJCQkgICB3aW5kZmFybV9tYXg2NjkwX3NlbnNvci5vIFwKIAkJCQkgICB3aW5kZmFybV9sbTc1X3NlbnNvci5vIHdpbmRmYXJtX3BpZC5vCitvYmotJChDT05GSUdfUE1BQ19SQUNLTUVURVIpCSs9IHJhY2stbWV0ZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMgYi9kcml2ZXJzL21hY2ludG9zaC9hZGIuYwppbmRleCBiZTBiZDM0Li43Y2VjNmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9hZGIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9hZGIuYwpAQCAtMjY3LDEyICsyNjcsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQKLV9fYWRiX3Byb2JlX3Rhc2sodm9pZCAqZGF0YSkKK19fYWRiX3Byb2JlX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICpidWxsc2hpdCkKIHsKIAlhZGJfcHJvYmVfdGFza19waWQgPSBrZXJuZWxfdGhyZWFkKGFkYl9wcm9iZV90YXNrLCBOVUxMLCBTSUdDSExEIHwgQ0xPTkVfS0VSTkVMKTsKIH0KIAotc3RhdGljIERFQ0xBUkVfV09SSyhhZGJfcmVzZXRfd29yaywgX19hZGJfcHJvYmVfdGFzaywgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9XT1JLKGFkYl9yZXNldF93b3JrLCBfX2FkYl9wcm9iZV90YXNrKTsKIAogaW50CiBhZGJfcmVzZXRfYnVzKHZvaWQpCkBAIC04MjgsNyArODI4LDcgQEAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmVxID0gKHN0cnVjdCBhZGJfcmVxdWVzdCAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRiX3JlcXVlc3QpLAorCXJlcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGJfcmVxdWVzdCksCiAJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlcSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYmhpZC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiaGlkLmMKaW5kZXggNTA2NmU3YS4uMWM3ZDZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiaGlkLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiaGlkLmMKQEAgLTY4OSw3ICs2ODksNiBAQAogCWlmICghaGlkIHx8ICFpbnB1dF9kZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwotCiAJfQogCiAJc3ByaW50ZihoaWQtPnBoeXMsICJhZGIlZDolZC4lMDJ4L2lucHV0IiwgaWQsIGRlZmF1bHRfaWQsIG9yaWdpbmFsX2hhbmRsZXJfaWQpOwpAQCAtODA3LDcgKzgwNiw5IEBACiAKIAlpbnB1dF9kZXYtPmtleWNvZGUgPSBoaWQtPmtleWNvZGU7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CiAKIAlpZiAoZGVmYXVsdF9pZCA9PSBBREJfS0VZQk9BUkQpIHsKIAkJLyogSEFDSyBXQVJOSU5HISEgVGhpcyBzaG91bGQgZ28gYXdheSBhcyBzb29uIHRoZXJlIGlzIGFuIHV0aWxpdHkKQEAgLTgyMCw3ICs4MjEsMTAgQEAKIAlyZXR1cm4gMDsKIAogIGZhaWw6CWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0Ja2ZyZWUoaGlkKTsKKwlpZiAoaGlkKSB7CisJCWtmcmVlKGhpZC0+a2V5Y29kZSk7CisJCWtmcmVlKGhpZCk7CisJfQogCWFkYmhpZFtpZF0gPSBOVUxMOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9hcG1fZW11LmMgYi9kcml2ZXJzL21hY2ludG9zaC9hcG1fZW11LmMKaW5kZXggMTI5Mzg3Ni4uNDMwMGM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvYXBtX2VtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL2FwbV9lbXUuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiB7CiAJc3RydWN0IGFwbV91c2VyICoJYXM7CiAKLQlhcyA9IChzdHJ1Y3QgYXBtX3VzZXIgKilrbWFsbG9jKHNpemVvZigqYXMpLCBHRlBfS0VSTkVMKTsKKwlhcyA9IGttYWxsb2Moc2l6ZW9mKCphcyksIEdGUF9LRVJORUwpOwogCWlmIChhcyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYXBtOiBjYW5ub3QgYWxsb2NhdGUgc3RydWN0IG9mIHNpemUgJWQgYnl0ZXNcbiIsCiAJCSAgICAgICBzaXplb2YoKmFzKSk7CkBAIC01MjksNyArNTI5LDggQEAKIAlpZiAoYXBtX3Byb2MpCiAJCWFwbV9wcm9jLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JbWlzY19yZWdpc3RlcigmYXBtX2RldmljZSk7CisJaWYgKG1pc2NfcmVnaXN0ZXIoJmFwbV9kZXZpY2UpICE9IDApCisJCXByaW50ayhLRVJOX0lORk8gIkNvdWxkIG5vdCBjcmVhdGUgbWlzYy4gZGV2aWNlIGZvciBhcG1cbiIpOwogCiAJcG11X3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZhcG1fc2xlZXBfbm90aWZpZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNfaGlkLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNfaGlkLmMKaW5kZXggNmIxMjllZS4uZWU2YjRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjX2hpZC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY19oaWQuYwpAQCAtMTA2LDYgKzEwNiw4IEBACiAKIHN0YXRpYyBpbnQgZW11bW91c2VidG5faW5wdXRfcmVnaXN0ZXIodm9pZCkKIHsKKwlpbnQgcmV0OworCiAJZW11bW91c2VidG4gPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWVtdW1vdXNlYnRuKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEyMCw5ICsxMjIsMTEgQEAKIAllbXVtb3VzZWJ0bi0+a2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9NSURETEUpIHwgQklUKEJUTl9SSUdIVCk7CiAJZW11bW91c2VidG4tPnJlbGJpdFswXSA9IEJJVChSRUxfWCkgfCBCSVQoUkVMX1kpOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGVtdW1vdXNlYnRuKTsKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZW11bW91c2VidG4pOworCWlmIChyZXQpCisJCWlucHV0X2ZyZWVfZGV2aWNlKGVtdW1vdXNlYnRuKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIGludCBfX2luaXQgbWFjX2hpZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMgYi9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkNDFmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3JhY2stbWV0ZXIuYwpAQCAtMCwwICsxLDYxNiBAQAorLyoKKyAqIFJhY2tNYWMgdnUtbWV0ZXIgZHJpdmVyCisgKgorICogKGMpIENvcHlyaWdodCAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgorICogICAgICAgICAgICAgICAgICAgIDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm0gb2YgdGhlIEdOVSBHUEwgdjIuCisgKgorICogU3VwcG9ydCB0aGUgQ1BVLW1ldGVyIExFRHMgb2YgdGhlIFhzZXJ2ZSBHNQorICoKKyAqIFRPRE86IEltcGxlbWVudCBQV00gdG8gZG8gdmFyaWFibGUgaW50ZW5zaXR5IGFuZCBwcm92aWRlIHVzZXJsYW5kCisgKiBpbnRlcmZhY2UgZm9yIGZ1bi4gQWxzbywgdGhlIENQVS1tZXRlciBjb3VsZCBiZSBtYWRlIG5pY2VyIGJ5IGJlaW5nCisgKiBhIGJpdCBsZXNzICJpbW1lZGlhdGUiIGJ1dCBnaXZpbmcgaW5zdGVhZCBhIG1vcmUgYXZlcmFnZSBsb2FkIG92ZXIKKyAqIHRpbWUuIFBhdGNoZXMgd2VsY29tZSA6LSkKKyAqCisgKi8KKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9kYmRtYS5oPgorI2luY2x1ZGUgPGFzbS9kYmRtYS5oPgorI2luY2x1ZGUgPGFzbS9tYWNpby5oPgorI2luY2x1ZGUgPGFzbS9rZXlsYXJnby5oPgorCisvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBhIHNhbXBsZSBidWZmZXIgKi8KKyNkZWZpbmUgU0FNUExFX0NPVU5UCQkyNTYKKworLyogQ1BVIG1ldGVyIHNhbXBsaW5nIHJhdGUgaW4gbXMgKi8KKyNkZWZpbmUgQ1BVX1NBTVBMSU5HX1JBVEUJMjUwCisKK3N0cnVjdCByYWNrbWV0ZXJfZG1hIHsKKwlzdHJ1Y3QgZGJkbWFfY21kCWNtZFs0XQkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwl1MzIJCQltYXJrCQkJX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXUzMgkJCWJ1ZjFbU0FNUExFX0NPVU5UXQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJdTMyCQkJYnVmMltTQU1QTEVfQ09VTlRdCV9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCitzdHJ1Y3QgcmFja21ldGVyX2NwdSB7CisJc3RydWN0IGRlbGF5ZWRfd29yawlzbmlmZmVyOworCXN0cnVjdCByYWNrbWV0ZXIJKnJtOworCWNwdXRpbWU2NF90CQlwcmV2X3dhbGw7CisJY3B1dGltZTY0X3QJCXByZXZfaWRsZTsKKwlpbnQJCQl6ZXJvOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0cnVjdCByYWNrbWV0ZXIgeworCXN0cnVjdCBtYWNpb19kZXYJCSptZGV2OworCXVuc2lnbmVkIGludAkJCWlycTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCSppMnM7CisJdTgJCQkJKnVidWY7CisJc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbQkqZG1hX3JlZ3M7CisJdm9pZCBfX2lvbWVtCQkJKmkyc19yZWdzOworCWRtYV9hZGRyX3QJCQlkbWFfYnVmX3A7CisJc3RydWN0IHJhY2ttZXRlcl9kbWEJCSpkbWFfYnVmX3Y7CisJaW50CQkJCXN0YWxlX2lycTsKKwlzdHJ1Y3QgcmFja21ldGVyX2NwdQkJY3B1WzJdOworCWludAkJCQlwYXVzZWQ7CisJc3RydWN0IG11dGV4CQkJc2VtOworfTsKKworLyogVG8gYmUgc2V0IGFzIGEgdHVuYWJsZSAqLworc3RhdGljIGludCByYWNrbWV0ZXJfaWdub3JlX25pY2U7CisKKy8qIFRoaXMgR1BJTyBpcyB3aGFja2VkIGJ5IHRoZSBPUyBYIGRyaXZlciB3aGVuIGluaXRpYWxpemluZyAqLworI2RlZmluZSBSQUNLTUVURVJfTUFHSUNfR1BJTwkweDc4CisKKy8qIFRoaXMgaXMgY29waWVkIGZyb20gY3B1ZnJlcV9vbmRlbWFuZCwgbWF5YmUgd2Ugc2hvdWxkIHB1dCBpdCBpbgorICogYSBjb21tb24gaGVhZGVyIHNvbWV3aGVyZQorICovCitzdGF0aWMgaW5saW5lIGNwdXRpbWU2NF90IGdldF9jcHVfaWRsZV90aW1lKHVuc2lnbmVkIGludCBjcHUpCit7CisJY3B1dGltZTY0X3QgcmV0dmFsOworCisJcmV0dmFsID0gY3B1dGltZTY0X2FkZChrc3RhdF9jcHUoY3B1KS5jcHVzdGF0LmlkbGUsCisJCQlrc3RhdF9jcHUoY3B1KS5jcHVzdGF0Lmlvd2FpdCk7CisKKwlpZiAocmFja21ldGVyX2lnbm9yZV9uaWNlKQorCQlyZXR2YWwgPSBjcHV0aW1lNjRfYWRkKHJldHZhbCwga3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5uaWNlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJhY2ttZXRlcl9zZXR1cF9pMnMoc3RydWN0IHJhY2ttZXRlciAqcm0pCit7CisJc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvID0gcm0tPm1kZXYtPmJ1cy0+Y2hpcDsKKworCS8qIEZpcnN0IHdoYWNrIG1hZ2ljIEdQSU8gKi8KKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9XUklURV9HUElPLCBOVUxMLCBSQUNLTUVURVJfTUFHSUNfR1BJTywgNSk7CisKKworCS8qIENhbGwgZmVhdHVyZSBjb2RlIHRvIGVuYWJsZSB0aGUgc291bmQgY2hhbm5lbCBhbmQgdGhlIHByb3BlcgorCSAqIGNsb2NrIHNvdXJjZXMKKwkgKi8KKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9TT1VORF9DSElQX0VOQUJMRSwgcm0tPmkycywgMCwgMSk7CisKKwkvKiBQb3dlciBpMnMgYW5kIHN0b3AgaTJzIGNsb2NrLiBXZSB3aGFjayBNYWNJTyBGQ1JzIGRpcmVjdGx5IGZvciBub3cuCisJICogVGhpcyBpcyBhIGJpdCByYWN5LCB0aHVzIHdlIHNob3VsZCBhZGQgbmV3IHBsYXRmb3JtIGZ1bmN0aW9ucyB0bworCSAqIGhhbmRsZSB0aGF0LiBzbmQtYW9hIG5lZWRzIHRoYXQgdG9vCisJICovCisJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjEsIEtMMV9JMlMwX0VOQUJMRSk7CisJTUFDSU9fQklDKEtFWUxBUkdPX0ZDUjEsIEtMMV9JMlMwX0NMS19FTkFCTEVfQklUKTsKKwkodm9pZClNQUNJT19JTjMyKEtFWUxBUkdPX0ZDUjEpOworCXVkZWxheSgxMCk7CisKKwkvKiBUaGVuIHNldHVwIGkycy4gRm9yIG5vdywgd2UgdXNlIHRoZSBzYW1lIG1hZ2ljIHZhbHVlIHRoYXQKKwkgKiB0aGUgT1MgWCBkcml2ZXIgc2VlbXMgdG8gdXNlLiBXZSBtaWdodCB3YW50IHRvIHBsYXkgYXJvdW5kCisJICogd2l0aCB0aGUgY2xvY2sgZGl2aXNvcnMgbGF0ZXIKKwkgKi8KKwlvdXRfbGUzMihybS0+aTJzX3JlZ3MgKyAweDEwLCAweDAxZmEwMDAwKTsKKwkodm9pZClpbl9sZTMyKHJtLT5pMnNfcmVncyArIDB4MTApOworCXVkZWxheSgxMCk7CisKKwkvKiBGdWxseSByZXN0YXJ0IGkycyovCisJTUFDSU9fQklTKEtFWUxBUkdPX0ZDUjEsIEtMMV9JMlMwX0NFTExfRU5BQkxFIHwKKwkJICBLTDFfSTJTMF9DTEtfRU5BQkxFX0JJVCk7CisJKHZvaWQpTUFDSU9fSU4zMihLRVlMQVJHT19GQ1IxKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCByYWNrbWV0ZXJfc2V0X2RlZmF1bHRfcGF0dGVybihzdHJ1Y3QgcmFja21ldGVyICpybSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmIChpIDwgOCkKKwkJCXJtLT51YnVmW2ldID0gKGkgJiAxKSAqIDI1NTsKKwkJZWxzZQorCQkJcm0tPnVidWZbaV0gPSAoKH5pKSAmIDEpICogMjU1OworCX0KK30KKworc3RhdGljIHZvaWQgcmFja21ldGVyX2RvX3BhdXNlKHN0cnVjdCByYWNrbWV0ZXIgKnJtLCBpbnQgcGF1c2UpCit7CisJc3RydWN0IHJhY2ttZXRlcl9kbWEgKnJkbWEgPSBybS0+ZG1hX2J1Zl92OworCisJcHJfZGVidWcoInJhY2ttZXRlcjogJXNcbiIsIHBhdXNlID8gInBhdXNlZCIgOiAic3RhcnRlZCIpOworCisJcm0tPnBhdXNlZCA9IHBhdXNlOworCWlmIChwYXVzZSkgeworCQlEQkRNQV9ET19TVE9QKHJtLT5kbWFfcmVncyk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KHJkbWEtPmJ1ZjEsIDAsIFNBTVBMRV9DT1VOVCAmIHNpemVvZih1MzIpKTsKKwltZW1zZXQocmRtYS0+YnVmMiwgMCwgU0FNUExFX0NPVU5UICYgc2l6ZW9mKHUzMikpOworCisJcm0tPmRtYV9idWZfdi0+bWFyayA9IDA7CisKKwltYigpOworCW91dF9sZTMyKCZybS0+ZG1hX3JlZ3MtPmNtZHB0cl9oaSwgMCk7CisJb3V0X2xlMzIoJnJtLT5kbWFfcmVncy0+Y21kcHRyLCBybS0+ZG1hX2J1Zl9wKTsKKwlvdXRfbGUzMigmcm0tPmRtYV9yZWdzLT5jb250cm9sLCAoUlVOIDw8IDE2KSB8IFJVTik7Cit9CisKK3N0YXRpYyB2b2lkIHJhY2ttZXRlcl9zZXR1cF9kYmRtYShzdHJ1Y3QgcmFja21ldGVyICpybSkKK3sKKwlzdHJ1Y3QgcmFja21ldGVyX2RtYSAqZGIgPSBybS0+ZG1hX2J1Zl92OworCXN0cnVjdCBkYmRtYV9jbWQgKmNtZCA9IGRiLT5jbWQ7CisKKwkvKiBNYWtlIHN1cmUgZGJkbWEgaXMgcmVzZXQgKi8KKwlEQkRNQV9ET19SRVNFVChybS0+ZG1hX3JlZ3MpOworCisJcHJfZGVidWcoInJhY2ttZXRlcjogbWFyayBvZmZzZXQ9MHglbHhcbiIsCisJCSBvZmZzZXRvZihzdHJ1Y3QgcmFja21ldGVyX2RtYSwgbWFyaykpOworCXByX2RlYnVnKCJyYWNrbWV0ZXI6IGJ1ZjEgb2Zmc2V0PTB4JWx4XG4iLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEsIGJ1ZjEpKTsKKwlwcl9kZWJ1ZygicmFja21ldGVyOiBidWYyIG9mZnNldD0weCVseFxuIiwKKwkJIG9mZnNldG9mKHN0cnVjdCByYWNrbWV0ZXJfZG1hLCBidWYyKSk7CisKKwkvKiBQcmVwYXJlIDQgZGJkbWEgY29tbWFuZHMgZm9yIHRoZSAyIGJ1ZmZlcnMgKi8KKwltZW1zZXQoY21kLCAwLCA0ICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwlzdF9sZTE2KCZjbWQtPnJlcV9jb3VudCwgNCk7CisJc3RfbGUxNigmY21kLT5jb21tYW5kLCBTVE9SRV9XT1JEIHwgSU5UUl9BTFdBWVMgfCBLRVlfU1lTVEVNKTsKKwlzdF9sZTMyKCZjbWQtPnBoeV9hZGRyLCBybS0+ZG1hX2J1Zl9wICsKKwkJb2Zmc2V0b2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEsIG1hcmspKTsKKwlzdF9sZTMyKCZjbWQtPmNtZF9kZXAsIDB4MDIwMDAwMDApOworCWNtZCsrOworCisJc3RfbGUxNigmY21kLT5yZXFfY291bnQsIFNBTVBMRV9DT1VOVCAqIDQpOworCXN0X2xlMTYoJmNtZC0+Y29tbWFuZCwgT1VUUFVUX01PUkUpOworCXN0X2xlMzIoJmNtZC0+cGh5X2FkZHIsIHJtLT5kbWFfYnVmX3AgKworCQlvZmZzZXRvZihzdHJ1Y3QgcmFja21ldGVyX2RtYSwgYnVmMSkpOworCWNtZCsrOworCisJc3RfbGUxNigmY21kLT5yZXFfY291bnQsIDQpOworCXN0X2xlMTYoJmNtZC0+Y29tbWFuZCwgU1RPUkVfV09SRCB8IElOVFJfQUxXQVlTIHwgS0VZX1NZU1RFTSk7CisJc3RfbGUzMigmY21kLT5waHlfYWRkciwgcm0tPmRtYV9idWZfcCArCisJCW9mZnNldG9mKHN0cnVjdCByYWNrbWV0ZXJfZG1hLCBtYXJrKSk7CisJc3RfbGUzMigmY21kLT5jbWRfZGVwLCAweDAxMDAwMDAwKTsKKwljbWQrKzsKKworCXN0X2xlMTYoJmNtZC0+cmVxX2NvdW50LCBTQU1QTEVfQ09VTlQgKiA0KTsKKwlzdF9sZTE2KCZjbWQtPmNvbW1hbmQsIE9VVFBVVF9NT1JFIHwgQlJfQUxXQVlTKTsKKwlzdF9sZTMyKCZjbWQtPnBoeV9hZGRyLCBybS0+ZG1hX2J1Zl9wICsKKwkJb2Zmc2V0b2Yoc3RydWN0IHJhY2ttZXRlcl9kbWEsIGJ1ZjIpKTsKKwlzdF9sZTMyKCZjbWQtPmNtZF9kZXAsIHJtLT5kbWFfYnVmX3ApOworCisJcmFja21ldGVyX2RvX3BhdXNlKHJtLCAwKTsKK30KKworc3RhdGljIHZvaWQgcmFja21ldGVyX2RvX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcmFja21ldGVyX2NwdSAqcmNwdSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcmFja21ldGVyX2NwdSwgc25pZmZlci53b3JrKTsKKwlzdHJ1Y3QgcmFja21ldGVyICpybSA9IHJjcHUtPnJtOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3B1dGltZTY0X3QgY3VyX2ppZmZpZXMsIHRvdGFsX2lkbGVfdGlja3M7CisJdW5zaWduZWQgaW50IHRvdGFsX3RpY2tzLCBpZGxlX3RpY2tzOworCWludCBpLCBvZmZzZXQsIGxvYWQsIGN1bW0sIHBhdXNlOworCisJY3VyX2ppZmZpZXMgPSBqaWZmaWVzNjRfdG9fY3B1dGltZTY0KGdldF9qaWZmaWVzXzY0KCkpOworCXRvdGFsX3RpY2tzID0gKHVuc2lnbmVkIGludCljcHV0aW1lNjRfc3ViKGN1cl9qaWZmaWVzLAorCQkJCQkJICByY3B1LT5wcmV2X3dhbGwpOworCXJjcHUtPnByZXZfd2FsbCA9IGN1cl9qaWZmaWVzOworCisJdG90YWxfaWRsZV90aWNrcyA9IGdldF9jcHVfaWRsZV90aW1lKGNwdSk7CisJaWRsZV90aWNrcyA9ICh1bnNpZ25lZCBpbnQpIGNwdXRpbWU2NF9zdWIodG90YWxfaWRsZV90aWNrcywKKwkJCQlyY3B1LT5wcmV2X2lkbGUpOworCXJjcHUtPnByZXZfaWRsZSA9IHRvdGFsX2lkbGVfdGlja3M7CisKKwkvKiBXZSBkbyBhIHZlcnkgZHVtYiBjYWxjdWxhdGlvbiB0byB1cGRhdGUgdGhlIExFRHMgZm9yIG5vdywKKwkgKiB3ZSdsbCBkbyBiZXR0ZXIgb25jZSB3ZSBoYXZlIGFjdHVhbCBQV00gaW1wbGVtZW50ZWQKKwkgKi8KKwlsb2FkID0gKDkgKiAodG90YWxfdGlja3MgLSBpZGxlX3RpY2tzKSkgLyB0b3RhbF90aWNrczsKKworCW9mZnNldCA9IGNwdSA8PCAzOworCWN1bW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdTggdWIgPSAobG9hZCA+IGkpID8gMHhmZiA6IDA7CisJCXJtLT51YnVmW2kgKyBvZmZzZXRdID0gdWI7CisJCWN1bW0gfD0gdWI7CisJfQorCXJjcHUtPnplcm8gPSAoY3VtbSA9PSAwKTsKKworCS8qIE5vdyBjaGVjayBpZiBMRURzIGFyZSBhbGwgMCwgd2UgY2FuIHN0b3AgRE1BICovCisJcGF1c2UgPSAocm0tPmNwdVswXS56ZXJvICYmIHJtLT5jcHVbMV0uemVybyk7CisJaWYgKHBhdXNlICE9IHJtLT5wYXVzZWQpIHsKKwkJbXV0ZXhfbG9jaygmcm0tPnNlbSk7CisJCXBhdXNlID0gKHJtLT5jcHVbMF0uemVybyAmJiBybS0+Y3B1WzFdLnplcm8pOworCQlyYWNrbWV0ZXJfZG9fcGF1c2Uocm0sIHBhdXNlKTsKKwkJbXV0ZXhfdW5sb2NrKCZybS0+c2VtKTsKKwl9CisJc2NoZWR1bGVfZGVsYXllZF93b3JrX29uKGNwdSwgJnJjcHUtPnNuaWZmZXIsCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoQ1BVX1NBTVBMSU5HX1JBVEUpKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHJhY2ttZXRlcl9pbml0X2NwdV9zbmlmZmVyKHN0cnVjdCByYWNrbWV0ZXIgKnJtKQoreworCXVuc2lnbmVkIGludCBjcHU7CisKKwkvKiBUaGlzIGRyaXZlciB3b3JrcyBvbmx5IHdpdGggMSBvciAyIENQVXMgbnVtYmVyZWQgMCBhbmQgMSwKKwkgKiBidXQgdGhhdCdzIHJlYWxseSBhbGwgd2UgaGF2ZSBvbiBBcHBsZSBYc2VydmUuIEl0IGRvZXNuJ3QKKwkgKiBwbGF5IHZlcnkgbmljZSB3aXRoIENQVSBob3RwbHVnIG5laXRoZXIgYnV0IHdlIGRvbid0IGRvIHRoYXQKKwkgKiBvbiB0aG9zZSBtYWNoaW5lcyB5ZXQKKwkgKi8KKworCXJtLT5jcHVbMF0ucm0gPSBybTsKKwlJTklUX0RFTEFZRURfV09SSygmcm0tPmNwdVswXS5zbmlmZmVyLCByYWNrbWV0ZXJfZG9fdGltZXIpOworCXJtLT5jcHVbMV0ucm0gPSBybTsKKwlJTklUX0RFTEFZRURfV09SSygmcm0tPmNwdVsxXS5zbmlmZmVyLCByYWNrbWV0ZXJfZG9fdGltZXIpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc3RydWN0IHJhY2ttZXRlcl9jcHUgKnJjcHU7CisKKwkJaWYgKGNwdSA+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+ZG1hX3JlZ3MpOworCWlvdW5tYXAocm0tPmkyc19yZWdzKTsKKworCS8qIEZyZWUgRE1BICovCisJZG1hX2ZyZWVfY29oZXJlbnQoJm1hY2lvX2dldF9wY2lfZGV2KG1kZXYpLT5kZXYsCisJCQkgIHNpemVvZihzdHJ1Y3QgcmFja21ldGVyX2RtYSksCisJCQkgIHJtLT5kbWFfYnVmX3YsIHJtLT5kbWFfYnVmX3ApOworCisJLyogRnJlZSBzYW1wbGVzICovCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXJtLT51YnVmKTsKKworI2lmIDAKKwkvKiBSZWxlYXNlIHJlc291cmNlcyAqLworCW1hY2lvX3JlbGVhc2VfcmVzb3VyY2VzKG1kZXYpOworI2VuZGlmCisKKwkvKiBHZXQgcmlkIG9mIG1lICovCisJa2ZyZWUocm0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFja21ldGVyX3NodXRkb3duKHN0cnVjdCBtYWNpb19kZXYqIG1kZXYpCit7CisJc3RydWN0IHJhY2ttZXRlciAqcm0gPSBkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CisKKwlpZiAocm0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBTdG9wIENQVSBzbmlmZmVyIHRpbWVyICYgd29yayBxdWV1ZXMgKi8KKwlyYWNrbWV0ZXJfc3RvcF9jcHVfc25pZmZlcihybSk7CisKKwkvKiBTdG9wL3Jlc2V0IGRiZG1hICovCisJREJETUFfRE9fUkVTRVQocm0tPmRtYV9yZWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCByYWNrbWV0ZXJfbWF0Y2hbXSA9IHsKKwl7IC5uYW1lID0gImkycyIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIHJhY2ttZXRlcl9kcnYgPSB7CisJLm5hbWUgPSAicmFja21ldGVyIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubWF0Y2hfdGFibGUgPSByYWNrbWV0ZXJfbWF0Y2gsCisJLnByb2JlID0gcmFja21ldGVyX3Byb2JlLAorCS5yZW1vdmUgPSByYWNrbWV0ZXJfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHJhY2ttZXRlcl9zaHV0ZG93biwKK307CisKKworc3RhdGljIGludCBfX2luaXQgcmFja21ldGVyX2luaXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygicmFja21ldGVyX2luaXQoKVxuIik7CisKKwlyZXR1cm4gbWFjaW9fcmVnaXN0ZXJfZHJpdmVyKCZyYWNrbWV0ZXJfZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJhY2ttZXRlcl9leGl0KHZvaWQpCit7CisJcHJfZGVidWcoInJhY2ttZXRlcl9leGl0KClcbiIpOworCisJbWFjaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnJhY2ttZXRlcl9kcnYpOworfQorCittb2R1bGVfaW5pdChyYWNrbWV0ZXJfaW5pdCk7Cittb2R1bGVfZXhpdChyYWNrbWV0ZXJfZXhpdCk7CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSYWNrTWV0ZXI6IFN1cHBvcnQgdnUtbWV0ZXIgb24gWFNlcnZlIGZyb250IHBhbmVsIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9zbXUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCmluZGV4IGFkZTI1YjMuLjZmMzA0NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAKICNkZWZpbmUgVkVSU0lPTiAiMC43IgogI2RlZmluZSBBVVRIT1IgICIoYykgMjAwNSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4iCkBAIC02MDAsNyArNjAxLDcgQEAKICAqIHN5c2ZzIHZpc2liaWxpdHkKICAqLwogCi1zdGF0aWMgdm9pZCBzbXVfZXhwb3NlX2NoaWxkcyh2b2lkICp1bnVzZWQpCitzdGF0aWMgdm9pZCBzbXVfZXhwb3NlX2NoaWxkcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCkBAIC02MTAsNyArNjExLDcgQEAKIAkJCQkJCSAgJnNtdS0+b2ZfZGV2LT5kZXYpOwogfQogCi1zdGF0aWMgREVDTEFSRV9XT1JLKHNtdV9leHBvc2VfY2hpbGRzX3dvcmssIHNtdV9leHBvc2VfY2hpbGRzLCBOVUxMKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoc211X2V4cG9zZV9jaGlsZHNfd29yaywgc211X2V4cG9zZV9jaGlsZHMpOwogCiBzdGF0aWMgaW50IHNtdV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKQEAgLTY1Myw3ICs2NTQsNyBAQAogCSAqIEknbSBhIGJpdCB0b28gZmFyIGZyb20gZmlndXJpbmcgb3V0IGhvdyB0aGF0IHdvcmtzIHdpdGggdGhvc2UKIAkgKiBuZXcgY2hpcHNldHMsIGJ1dCB0aGF0IHdpbGwgY29tZSBiYWNrIGFuZCBiaXRlIHVzCiAJICovCi0Jb2ZfcmVnaXN0ZXJfZHJpdmVyKCZzbXVfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKKwlvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnNtdV9vZl9wbGF0Zm9ybV9kcml2ZXIpOwogCXJldHVybiAwOwogfQogCkBAIC05NDQsNyArOTQ1LDcgQEAKIAkgKi8KIAl0bGVuID0gc2l6ZW9mKHN0cnVjdCBwcm9wZXJ0eSkgKyBsZW4gKyAxODsKIAotCXByb3AgPSBrY2FsbG9jKHRsZW4sIDEsIEdGUF9LRVJORUwpOworCXByb3AgPSBremFsbG9jKHRsZW4sIEdGUF9LRVJORUwpOwogCWlmIChwcm9wID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCWhkciA9IChzdHJ1Y3Qgc211X3NkYnBfaGVhZGVyICopKHByb3AgKyAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwppbmRleCBhMGYzMGQwLi4zZDNiZjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCkBAIC0yNCwxMyArMjQsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAKICN1bmRlZiBERUJVRwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKaW5kZXggZDAwYzBjMy4uMmU0YWQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYwpAQCAtMTI5LDYgKzEyOSw3IEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNpby5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSAidGhlcm1fcG03Mi5oIgogCkBAIC0yMjM2LDE0ICsyMjM3LDE0IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCW9mX3JlZ2lzdGVyX2RyaXZlcigmZmN1X29mX3BsYXRmb3JtX2RyaXZlcik7CisJb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmY3Vfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKIAkKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHRoZXJtX3BtNzJfZXhpdCh2b2lkKQogewotCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZmY3Vfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZmN1X29mX3BsYXRmb3JtX2RyaXZlcik7CiAKIAlpZiAob2ZfZGV2KQogCQlvZl9kZXZpY2VfdW5yZWdpc3RlcihvZl9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jCmluZGV4IDczOGZhYWIuLmExZDNhOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV93aW5kdHVubmVsLmMKQEAgLTM2LDEyICszNiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxhc20vbWFjaW8uaD4KIAogI2RlZmluZSBMT0dfVEVNUAkJMAkJCS8qIGNvbnRpbm91c2x5IGxvZyB0ZW1wZXJhdHVyZSAqLwpAQCAtNTExLDE0ICs1MTIsMTQgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jb2ZfcmVnaXN0ZXJfZHJpdmVyKCAmdGhlcm1fb2ZfZHJpdmVyICk7CisJb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCAmdGhlcm1fb2ZfZHJpdmVyICk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdAogZzRmYW5fZXhpdCggdm9pZCApCiB7Ci0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoICZ0aGVybV9vZl9kcml2ZXIgKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlciggJnRoZXJtX29mX2RyaXZlciApOwogCiAJaWYoIHgub2ZfZGV2ICkKIAkJb2ZfZGV2aWNlX3VucmVnaXN0ZXIoIHgub2ZfZGV2ICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKaW5kZXggZTYzZWExYy4uYzg1NThkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdTY4ay5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdTY4ay5jCmluZGV4IGQ5OTg2ZjMuLjkzZTZlZjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11NjhrLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdTY4ay5jCkBAIC04NDcsNyArODQ3LDcgQEAKIAluX3Bib29rX3BjaV9zYXZlcyA9IG5wY2k7CiAJaWYgKG5wY2kgPT0gMCkKIAkJcmV0dXJuOwotCXBzID0gKHN0cnVjdCBwY2lfc2F2ZSAqKSBrbWFsbG9jKG5wY2kgKiBzaXplb2YoKnBzKSwgR0ZQX0tFUk5FTCk7CisJcHMgPSBrbWFsbG9jKG5wY2kgKiBzaXplb2YoKnBzKSwgR0ZQX0tFUk5FTCk7CiAJcGJvb2tfcGNpX3NhdmVzID0gcHM7CiAJaWYgKHBzID09IE5VTEwpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2NvcmUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2NvcmUuYwppbmRleCBhYjNmYWE3Li5lOTQ3YWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9jb3JlLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fY29yZS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTExMi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG0xMTIuYwppbmRleCBmYTRiMTNmLi5iM2ZiYjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTExMi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtMTEyLmMKQEAgLTY4NSw2ICs2ODUsMTcgQEAKIAkJKytucl9jb3JlczsKIAogCXByaW50ayhLRVJOX0lORk8gIndpbmRmYXJtOiBpbml0aWFsaXppbmcgZm9yIGR1YWwtY29yZSBkZXNrdG9wIEc1XG4iKTsKKworI2lmZGVmIE1PRFVMRQorCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9zbXVfY29udHJvbHMiKTsKKwlyZXF1ZXN0X21vZHVsZSgid2luZGZhcm1fc211X3NlbnNvcnMiKTsKKwlyZXF1ZXN0X21vZHVsZSgid2luZGZhcm1fc211X3NhdCIpOworCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9sbTc1X3NlbnNvciIpOworCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9tYXg2NjkwX3NlbnNvciIpOworCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9jcHVmcmVxX2NsYW1wIik7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwogCXBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd2ZfcG0xMTJfZHJpdmVyKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtODEuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtODEuYwppbmRleCAyYTk0NDg1Li5mMjRmYTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTgxLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG04MS5jCkBAIC03ODgsNiArNzg4LDcgQEAKIAkJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX3NtdV9jb250cm9scyIpOwogCQlyZXF1ZXN0X21vZHVsZSgid2luZGZhcm1fc211X3NlbnNvcnMiKTsKIAkJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX2xtNzVfc2Vuc29yIik7CisJCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9jcHVmcmVxX2NsYW1wIik7CiAKICNlbmRpZiAvKiBNT0RVTEUgKi8KIAkJcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ3Zl9zbXVfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtOTEuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtOTEuYwppbmRleCA5OTYxYTY3Li4yNmVlZTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTkxLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG05MS5jCkBAIC03MTksNiArNzE5LDcgQEAKIAkJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX3NtdV9jb250cm9scyIpOwogCQlyZXF1ZXN0X21vZHVsZSgid2luZGZhcm1fc211X3NlbnNvcnMiKTsKIAkJcmVxdWVzdF9tb2R1bGUoIndpbmRmYXJtX2xtNzVfc2Vuc29yIik7CisJCXJlcXVlc3RfbW9kdWxlKCJ3aW5kZmFybV9jcHVmcmVxX2NsYW1wIik7CiAKICNlbmRpZiAvKiBNT0RVTEUgKi8KIAkJcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ3Zl9zbXVfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvS2NvbmZpZyBiL2RyaXZlcnMvbWQvS2NvbmZpZwppbmRleCBjOTJjMTUyMS4uNDU0MGFkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWQvS2NvbmZpZwpAQCAtMjE1LDYgKzIxNSw3IEBACiAJdHJpc3RhdGUgIkNyeXB0IHRhcmdldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQkxLX0RFVl9ETSAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IENSWVBUT19DQkMKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRldmljZS1tYXBwZXIgdGFyZ2V0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgZGV2aWNlIHRoYXQKIAkgIHRyYW5zcGFyZW50bHkgZW5jcnlwdHMgdGhlIGRhdGEgb24gaXQuIFlvdSdsbCBuZWVkIHRvIGFjdGl2YXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JpdG1hcC5jIGIvZHJpdmVycy9tZC9iaXRtYXAuYwppbmRleCBkNDdkMzhhLi41NDMyZDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKQEAgLTIxMiw4ICsyMTIsOCBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gTlVMTDsKIAotCWQgPSBmaWxlLT5mX2RlbnRyeTsKLQl2ID0gZmlsZS0+Zl92ZnNtbnQ7CisJZCA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CisJdiA9IGZpbGUtPmZfcGF0aC5tbnQ7CiAKIAlidWYgPSBkX3BhdGgoZCwgdiwgYnVmLCBjb3VudCk7CiAKQEAgLTM0OSw3ICszNDksNyBAQAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc2VjdG9yX3QgYmxvY2s7CiAKQEAgLTUzNiw3ICs1MzYsNyBAQAogCQlwcmludGsoS0VSTl9JTkZPICIlczogYml0bWFwIGZpbGUgaXMgb3V0IG9mIGRhdGUgKCVsbHUgPCAlbGx1KSAiCiAJCQkiLS0gZm9yY2luZyBmdWxsIHJlY292ZXJ5XG4iLCBibW5hbWUoYml0bWFwKSwgZXZlbnRzLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgYml0bWFwLT5tZGRldi0+ZXZlbnRzKTsKLQkJc2ItPnN0YXRlIHw9IEJJVE1BUF9TVEFMRTsKKwkJc2ItPnN0YXRlIHw9IGNwdV90b19sZTMyKEJJVE1BUF9TVEFMRSk7CiAJfQogc3VjY2VzczoKIAkvKiBhc3NpZ24gZmllbGRzIHVzaW5nIHZhbHVlcyBmcm9tIHN1cGVyYmxvY2sgKi8KQEAgLTU0NCwxMSArNTQ0LDExIEBACiAJYml0bWFwLT5kYWVtb25fc2xlZXAgPSBkYWVtb25fc2xlZXA7CiAJYml0bWFwLT5kYWVtb25fbGFzdHJ1biA9IGppZmZpZXM7CiAJYml0bWFwLT5tYXhfd3JpdGVfYmVoaW5kID0gd3JpdGVfYmVoaW5kOwotCWJpdG1hcC0+ZmxhZ3MgfD0gc2ItPnN0YXRlOworCWJpdG1hcC0+ZmxhZ3MgfD0gbGUzMl90b19jcHUoc2ItPnN0YXRlKTsKIAlpZiAobGUzMl90b19jcHUoc2ItPnZlcnNpb24pID09IEJJVE1BUF9NQUpPUl9IT1NURU5ESUFOKQogCQliaXRtYXAtPmZsYWdzIHw9IEJJVE1BUF9IT1NURU5ESUFOOwogCWJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPSBsZTY0X3RvX2NwdShzYi0+ZXZlbnRzX2NsZWFyZWQpOwotCWlmIChzYi0+c3RhdGUgJiBCSVRNQVBfU1RBTEUpCisJaWYgKHNiLT5zdGF0ZSAmIGNwdV90b19sZTMyKEJJVE1BUF9TVEFMRSkpCiAJCWJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPSBiaXRtYXAtPm1kZGV2LT5ldmVudHM7CiAJZXJyID0gMDsKIG91dDoKQEAgLTU3OCw5ICs1NzgsOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCXNiID0gKGJpdG1hcF9zdXBlcl90ICopa21hcF9hdG9taWMoYml0bWFwLT5zYl9wYWdlLCBLTV9VU0VSMCk7CiAJc3dpdGNoIChvcCkgewotCQljYXNlIE1BU0tfU0VUOiBzYi0+c3RhdGUgfD0gYml0czsKKwkJY2FzZSBNQVNLX1NFVDogc2ItPnN0YXRlIHw9IGNwdV90b19sZTMyKGJpdHMpOwogCQkJCWJyZWFrOwotCQljYXNlIE1BU0tfVU5TRVQ6IHNiLT5zdGF0ZSAmPSB+Yml0czsKKwkJY2FzZSBNQVNLX1VOU0VUOiBzYi0+c3RhdGUgJj0gY3B1X3RvX2xlMzIofmJpdHMpOwogCQkJCWJyZWFrOwogCQlkZWZhdWx0OiBCVUcoKTsKIAl9CkBAIC02NjIsNyArNjYyLDcgQEAKIAliaXRtYXBfZmlsZV91bm1hcChiaXRtYXApOwogCiAJaWYgKGZpbGUpIHsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nKTsKIAkJZnB1dChmaWxlKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWJpby1saXN0LmggYi9kcml2ZXJzL21kL2RtLWJpby1saXN0LmgKaW5kZXggYmJmNDYxNS4uZGE0MzQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1iaW8tbGlzdC5oCisrKyBiL2RyaXZlcnMvbWQvZG0tYmlvLWxpc3QuaApAQCAtNDQsNiArNDQsMjAgQEAKIAlibC0+dGFpbCA9IGJsMi0+dGFpbDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGJpb19saXN0X21lcmdlX2hlYWQoc3RydWN0IGJpb19saXN0ICpibCwKKwkJCQkgICAgICAgc3RydWN0IGJpb19saXN0ICpibDIpCit7CisJaWYgKCFibDItPmhlYWQpCisJCXJldHVybjsKKworCWlmIChibC0+aGVhZCkKKwkJYmwyLT50YWlsLT5iaV9uZXh0ID0gYmwtPmhlYWQ7CisJZWxzZQorCQlibC0+dGFpbCA9IGJsMi0+dGFpbDsKKworCWJsLT5oZWFkID0gYmwyLT5oZWFkOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBiaW8gKmJpb19saXN0X3BvcChzdHJ1Y3QgYmlvX2xpc3QgKmJsKQogewogCXN0cnVjdCBiaW8gKmJpbyA9IGJsLT5oZWFkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCmluZGV4IDY1NWQ4MTYuLjRjMjQ3MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYworKysgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKQEAgLTE2LDkgKzE2LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlICJkbS5oIgogCkBAIC04NCw3ICs4NiwxMCBAQAogCSAqLwogCXN0cnVjdCBjcnlwdF9pdl9vcGVyYXRpb25zICppdl9nZW5fb3BzOwogCWNoYXIgKml2X21vZGU7Ci0Jc3RydWN0IGNyeXB0b19jaXBoZXIgKml2X2dlbl9wcml2YXRlOworCXVuaW9uIHsKKwkJc3RydWN0IGNyeXB0b19jaXBoZXIgKmVzc2l2X3RmbTsKKwkJaW50IGJlbmJpX3NoaWZ0OworCX0gaXZfZ2VuX3ByaXZhdGU7CiAJc2VjdG9yX3QgaXZfb2Zmc2V0OwogCXVuc2lnbmVkIGludCBpdl9zaXplOwogCkBAIC0xMDAsNyArMTA1LDcgQEAKICNkZWZpbmUgTUlOX1BPT0xfUEFHRVMgMzIKICNkZWZpbmUgTUlOX0JJT19QQUdFUyAgOAogCi1zdGF0aWMga21lbV9jYWNoZV90ICpfY3J5cHRfaW9fcG9vbDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqX2NyeXB0X2lvX3Bvb2w7CiAKIC8qCiAgKiBEaWZmZXJlbnQgSVYgZ2VuZXJhdGlvbiBhbGdvcml0aG1zOgpAQCAtMTEyLDYgKzExNyw5IEBACiAgKiAgICAgICAgZW5jcnlwdGVkIHdpdGggdGhlIGJ1bGsgY2lwaGVyIHVzaW5nIGEgc2FsdCBhcyBrZXkuIFRoZSBzYWx0CiAgKiAgICAgICAgc2hvdWxkIGJlIGRlcml2ZWQgZnJvbSB0aGUgYnVsayBjaXBoZXIncyBrZXkgdmlhIGhhc2hpbmcuCiAgKgorICogYmVuYmk6IHRoZSA2NC1iaXQgImJpZy1lbmRpYW4gJ25hcnJvdyBibG9jayctY291bnQiLCBzdGFydGluZyBhdCAxCisgKiAgICAgICAgKG5lZWRlZCBmb3IgTFJXLTMyLUFFUyBhbmQgcG9zc2libGUgb3RoZXIgbmFycm93IGJsb2NrIG1vZGVzKQorICoKICAqIHBsdW1iOiB1bmltcGxlbWVudGVkLCBzZWU6CiAgKiBodHRwOi8vYXJ0aWNsZS5nbWFuZS5vcmcvZ21hbmUubGludXgua2VybmVsLmRldmljZS1tYXBwZXIuZG0tY3J5cHQvNDU0CiAgKi8KQEAgLTE5MCwyMSArMTk4LDYxIEBACiAJfQogCWtmcmVlKHNhbHQpOwogCi0JY2MtPml2X2dlbl9wcml2YXRlID0gZXNzaXZfdGZtOworCWNjLT5pdl9nZW5fcHJpdmF0ZS5lc3Npdl90Zm0gPSBlc3Npdl90Zm07CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNyeXB0X2l2X2Vzc2l2X2R0cihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYykKIHsKLQljcnlwdG9fZnJlZV9jaXBoZXIoY2MtPml2X2dlbl9wcml2YXRlKTsKLQljYy0+aXZfZ2VuX3ByaXZhdGUgPSBOVUxMOworCWNyeXB0b19mcmVlX2NpcGhlcihjYy0+aXZfZ2VuX3ByaXZhdGUuZXNzaXZfdGZtKTsKKwljYy0+aXZfZ2VuX3ByaXZhdGUuZXNzaXZfdGZtID0gTlVMTDsKIH0KIAogc3RhdGljIGludCBjcnlwdF9pdl9lc3Npdl9nZW4oc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHU4ICppdiwgc2VjdG9yX3Qgc2VjdG9yKQogewogCW1lbXNldChpdiwgMCwgY2MtPml2X3NpemUpOwogCSoodTY0ICopaXYgPSBjcHVfdG9fbGU2NChzZWN0b3IpOwotCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoY2MtPml2X2dlbl9wcml2YXRlLCBpdiwgaXYpOworCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoY2MtPml2X2dlbl9wcml2YXRlLmVzc2l2X3RmbSwgaXYsIGl2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcnlwdF9pdl9iZW5iaV9jdHIoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJICAgICAgY29uc3QgY2hhciAqb3B0cykKK3sKKwl1bnNpZ25lZCBpbnQgYnMgPSBjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZShjYy0+dGZtKTsKKwlpbnQgbG9nID0gaWxvZzIoYnMpOworCisJLyogd2UgbmVlZCB0byBjYWxjdWxhdGUgaG93IGZhciB3ZSBtdXN0IHNoaWZ0IHRoZSBzZWN0b3IgY291bnQKKwkgKiB0byBnZXQgdGhlIGNpcGhlciBibG9jayBjb3VudCwgd2UgdXNlIHRoaXMgc2hpZnQgaW4gX2dlbiAqLworCisJaWYgKDEgPDwgbG9nICE9IGJzKSB7CisJCXRpLT5lcnJvciA9ICJjeXBoZXIgYmxvY2tzaXplIGlzIG5vdCBhIHBvd2VyIG9mIDIiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobG9nID4gOSkgeworCQl0aS0+ZXJyb3IgPSAiY3lwaGVyIGJsb2Nrc2l6ZSBpcyA+IDUxMiI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNjLT5pdl9nZW5fcHJpdmF0ZS5iZW5iaV9zaGlmdCA9IDkgLSBsb2c7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3J5cHRfaXZfYmVuYmlfZHRyKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjKQoreworfQorCitzdGF0aWMgaW50IGNyeXB0X2l2X2JlbmJpX2dlbihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgdTggKml2LCBzZWN0b3JfdCBzZWN0b3IpCit7CisJX19iZTY0IHZhbDsKKworCW1lbXNldChpdiwgMCwgY2MtPml2X3NpemUgLSBzaXplb2YodTY0KSk7IC8qIHJlc3QgaXMgY2xlYXJlZCBiZWxvdyAqLworCisJdmFsID0gY3B1X3RvX2JlNjQoKCh1NjQpc2VjdG9yIDw8IGNjLT5pdl9nZW5fcHJpdmF0ZS5iZW5iaV9zaGlmdCkgKyAxKTsKKwlwdXRfdW5hbGlnbmVkKHZhbCwgKF9fYmU2NCAqKShpdiArIGNjLT5pdl9zaXplIC0gc2l6ZW9mKHU2NCkpKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMTgsMTMgKzI2NiwxOCBAQAogCS5nZW5lcmF0b3IgPSBjcnlwdF9pdl9lc3Npdl9nZW4KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRfaXZfb3BlcmF0aW9ucyBjcnlwdF9pdl9iZW5iaV9vcHMgPSB7CisJLmN0cgkgICA9IGNyeXB0X2l2X2JlbmJpX2N0ciwKKwkuZHRyCSAgID0gY3J5cHRfaXZfYmVuYmlfZHRyLAorCS5nZW5lcmF0b3IgPSBjcnlwdF9pdl9iZW5iaV9nZW4KK307CiAKIHN0YXRpYyBpbnQKIGNyeXB0X2NvbnZlcnRfc2NhdHRlcmxpc3Qoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmluLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3JpdGUsIHNlY3Rvcl90IHNlY3RvcikKIHsKLQl1OCBpdltjYy0+aXZfc2l6ZV07CisJdTggaXZbY2MtPml2X3NpemVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKF9fYWxpZ25vZl9fKHU2NCkpKSk7CiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7CiAJCS50Zm0gPSBjYy0+dGZtLAogCQkuaW5mbyA9IGl2LApAQCAtNDU3LDExICs1MTAsMTEgQEAKICAqIGludGVycnVwdCBjb250ZXh0LgogICovCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKl9rY3J5cHRkX3dvcmtxdWV1ZTsKLXN0YXRpYyB2b2lkIGtjcnlwdGRfZG9fd29yayh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGtjcnlwdGRfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdGF0aWMgdm9pZCBrY3J5cHRkX3F1ZXVlX2lvKHN0cnVjdCBjcnlwdF9pbyAqaW8pCiB7Ci0JSU5JVF9XT1JLKCZpby0+d29yaywga2NyeXB0ZF9kb193b3JrLCBpbyk7CisJSU5JVF9XT1JLKCZpby0+d29yaywga2NyeXB0ZF9kb193b3JrKTsKIAlxdWV1ZV93b3JrKF9rY3J5cHRkX3dvcmtxdWV1ZSwgJmlvLT53b3JrKTsKIH0KIApAQCAtNjAyLDcgKzY1NSw3IEBACiAKIAkJLyogb3V0IG9mIG1lbW9yeSAtPiBydW4gcXVldWVzICovCiAJCWlmIChyZW1haW5pbmcpCi0JCQlibGtfY29uZ2VzdGlvbl93YWl0KGJpb19kYXRhX2RpcihjbG9uZSksIEhaLzEwMCk7CisJCQljb25nZXN0aW9uX3dhaXQoYmlvX2RhdGFfZGlyKGNsb25lKSwgSFovMTAwKTsKIAl9CiB9CiAKQEAgLTYxNyw5ICs2NzAsOSBAQAogCWRlY19wZW5kaW5nKGlvLCBjcnlwdF9jb252ZXJ0KGNjLCAmY3R4KSk7CiB9CiAKLXN0YXRpYyB2b2lkIGtjcnlwdGRfZG9fd29yayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQga2NyeXB0ZF9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgY3J5cHRfaW8gKmlvID0gZGF0YTsKKwlzdHJ1Y3QgY3J5cHRfaW8gKmlvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjcnlwdF9pbywgd29yayk7CiAKIAlpZiAoaW8tPnBvc3RfcHJvY2VzcykKIAkJcHJvY2Vzc19yZWFkX2VuZGlvKGlvKTsKQEAgLTc2Nyw3ICs4MjAsNyBAQAogCWNjLT50Zm0gPSB0Zm07CiAKIAkvKgotCSAqIENob29zZSBpdm1vZGUuIFZhbGlkIG1vZGVzOiAicGxhaW4iLCAiZXNzaXY6PGVzc2hhc2g+Ii4KKwkgKiBDaG9vc2UgaXZtb2RlLiBWYWxpZCBtb2RlczogInBsYWluIiwgImVzc2l2Ojxlc3NoYXNoPiIsICJiZW5iaSIuCiAJICogU2VlIGNvbW1lbnRzIGF0IGl2IGNvZGUKIAkgKi8KIApAQCAtNzc3LDYgKzgzMCw4IEBACiAJCWNjLT5pdl9nZW5fb3BzID0gJmNyeXB0X2l2X3BsYWluX29wczsKIAllbHNlIGlmIChzdHJjbXAoaXZtb2RlLCAiZXNzaXYiKSA9PSAwKQogCQljYy0+aXZfZ2VuX29wcyA9ICZjcnlwdF9pdl9lc3Npdl9vcHM7CisJZWxzZSBpZiAoc3RyY21wKGl2bW9kZSwgImJlbmJpIikgPT0gMCkKKwkJY2MtPml2X2dlbl9vcHMgPSAmY3J5cHRfaXZfYmVuYmlfb3BzOwogCWVsc2UgewogCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBJViBtb2RlIjsKIAkJZ290byBiYWQyOwpAQCAtOTA3LDE1ICs5NjIsMTMgQEAKIAlhdG9taWNfc2V0KCZpby0+cGVuZGluZywgMCk7CiAJa2NyeXB0ZF9xdWV1ZV9pbyhpbyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gRE1fTUFQSU9fU1VCTUlUVEVEOwogfQogCiBzdGF0aWMgaW50IGNyeXB0X3N0YXR1cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RhdHVzX3R5cGVfdCB0eXBlLAogCQkJY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgbWF4bGVuKQogewogCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gKHN0cnVjdCBjcnlwdF9jb25maWcgKikgdGktPnByaXZhdGU7Ci0JY29uc3QgY2hhciAqY2lwaGVyOwotCWNvbnN0IGNoYXIgKmNoYWlubW9kZSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHN6ID0gMDsKIAogCXN3aXRjaCAodHlwZSkgewpAQCAtOTI0LDE0ICs5NzcsMTEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNUQVRVU1RZUEVfVEFCTEU6Ci0JCWNpcGhlciA9IGNyeXB0b19ibGtjaXBoZXJfbmFtZShjYy0+dGZtKTsKLQotCQljaGFpbm1vZGUgPSBjYy0+Y2hhaW5tb2RlOwotCiAJCWlmIChjYy0+aXZfbW9kZSkKLQkJCURNRU1JVCgiJXMtJXMtJXMgIiwgY2lwaGVyLCBjaGFpbm1vZGUsIGNjLT5pdl9tb2RlKTsKKwkJCURNRU1JVCgiJXMtJXMtJXMgIiwgY2MtPmNpcGhlciwgY2MtPmNoYWlubW9kZSwKKwkJCSAgICAgICBjYy0+aXZfbW9kZSk7CiAJCWVsc2UKLQkJCURNRU1JVCgiJXMtJXMgIiwgY2lwaGVyLCBjaGFpbm1vZGUpOworCQkJRE1FTUlUKCIlcy0lcyAiLCBjYy0+Y2lwaGVyLCBjYy0+Y2hhaW5tb2RlKTsKIAogCQlpZiAoY2MtPmtleV9zaXplID4gMCkgewogCQkJaWYgKChtYXhsZW4gLSBzeikgPCAoKGNjLT5rZXlfc2l6ZSA8PCAxKSArIDEpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1lbWMuYyBiL2RyaXZlcnMvbWQvZG0tZW1jLmMKaW5kZXggMmIyZDQ1ZDcuLjI2NWM0NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tZW1jLmMKKysrIGIvZHJpdmVycy9tZC9kbS1lbWMuYwpAQCAtNDAsNyArNDAsNyBAQAogCiBzdGF0aWMgaW50IGVtY19lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlc19kb25lLCBpbnQgZXJyb3IpCiB7Ci0Jc3RydWN0IHBhdGggKnBhdGggPSBiaW8tPmJpX3ByaXZhdGU7CisJc3RydWN0IGRtX3BhdGggKnBhdGggPSBiaW8tPmJpX3ByaXZhdGU7CiAKIAlpZiAoYmlvLT5iaV9zaXplKQogCQlyZXR1cm4gMTsKQEAgLTYxLDcgKzYxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBiaW8gKmdldF9mYWlsb3Zlcl9iaW8oc3RydWN0IHBhdGggKnBhdGgsIHVuc2lnbmVkIGRhdGFfc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgYmlvICpnZXRfZmFpbG92ZXJfYmlvKHN0cnVjdCBkbV9wYXRoICpwYXRoLCB1bnNpZ25lZCBkYXRhX3NpemUpCiB7CiAJc3RydWN0IGJpbyAqYmlvOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtOTYsNyArOTYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmdldF9mYWlsb3Zlcl9yZXEoc3RydWN0IGVtY19oYW5kbGVyICpoLAotCQkJCQlzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBwYXRoICpwYXRoKQorCQkJCQlzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBkbV9wYXRoICpwYXRoKQogewogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gYmlvLT5iaV9iZGV2OwpAQCAtMTMzLDcgKzEzMyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqZW1jX3RyZXNwYXNzX2dldChzdHJ1Y3QgZW1jX2hhbmRsZXIgKmgsCi0JCQkJCXN0cnVjdCBwYXRoICpwYXRoKQorCQkJCQlzdHJ1Y3QgZG1fcGF0aCAqcGF0aCkKIHsKIAlzdHJ1Y3QgYmlvICpiaW87CiAJc3RydWN0IHJlcXVlc3QgKnJxOwpAQCAtMTkxLDcgKzE5MSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGVtY19wZ19pbml0KHN0cnVjdCBod19oYW5kbGVyICpod2gsIHVuc2lnbmVkIGJ5cGFzc2VkLAotCQkJc3RydWN0IHBhdGggKnBhdGgpCisJCQlzdHJ1Y3QgZG1fcGF0aCAqcGF0aCkKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShwYXRoLT5kZXYtPmJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1ody1oYW5kbGVyLmggYi9kcml2ZXJzL21kL2RtLWh3LWhhbmRsZXIuaAppbmRleCAxNWY1NjI5Li4zMmVmZjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWh3LWhhbmRsZXIuaAorKysgYi9kcml2ZXJzL21kL2RtLWh3LWhhbmRsZXIuaApAQCAtMzIsNyArMzIsNyBAQAogCXZvaWQgKCpkZXN0cm95KSAoc3RydWN0IGh3X2hhbmRsZXIgKmh3aCk7CiAKIAl2b2lkICgqcGdfaW5pdCkgKHN0cnVjdCBod19oYW5kbGVyICpod2gsIHVuc2lnbmVkIGJ5cGFzc2VkLAotCQkJIHN0cnVjdCBwYXRoICpwYXRoKTsKKwkJCSBzdHJ1Y3QgZG1fcGF0aCAqcGF0aCk7CiAJdW5zaWduZWQgKCplcnJvcikgKHN0cnVjdCBod19oYW5kbGVyICpod2gsIHN0cnVjdCBiaW8gKmJpbyk7CiAJaW50ICgqc3RhdHVzKSAoc3RydWN0IGh3X2hhbmRsZXIgKmh3aCwgc3RhdHVzX3R5cGVfdCB0eXBlLAogCQkgICAgICAgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgbWF4bGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW8uYyBiL2RyaXZlcnMvbWQvZG0taW8uYwppbmRleCBkYTY2M2QyLi40ZWI3M2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pby5jCkBAIC05MiwxMiArOTIsMTIgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBiaW9fc2V0X3JlZ2lvbihzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIHJlZ2lvbikKIHsKLQliaW8tPmJpX2lvX3ZlY1tiaW8tPmJpX21heF92ZWNzIC0gMV0uYnZfbGVuID0gcmVnaW9uOworCWJpby0+YmlfaW9fdmVjW2Jpby0+YmlfbWF4X3ZlY3NdLmJ2X2xlbiA9IHJlZ2lvbjsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBiaW9fZ2V0X3JlZ2lvbihzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JcmV0dXJuIGJpby0+YmlfaW9fdmVjW2Jpby0+YmlfbWF4X3ZlY3MgLSAxXS5idl9sZW47CisJcmV0dXJuIGJpby0+YmlfaW9fdmVjW2Jpby0+YmlfbWF4X3ZlY3NdLmJ2X2xlbjsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTM2LDYgKzEzNiw3IEBACiAJCXplcm9fZmlsbF9iaW8oYmlvKTsKIAogCWRlY19jb3VudChpbywgYmlvX2dldF9yZWdpb24oYmlvKSwgZXJyb3IpOworCWJpby0+YmlfbWF4X3ZlY3MrKzsKIAliaW9fcHV0KGJpbyk7CiAKIAlyZXR1cm4gMDsKQEAgLTI1MCwxNiArMjUxLDE4IEBACiAKIAl3aGlsZSAocmVtYWluaW5nKSB7CiAJCS8qCi0JCSAqIEFsbG9jYXRlIGEgc3VpdGFibHkgc2l6ZWQgYmlvLCB3ZSBhZGQgYW4gZXh0cmEKLQkJICogYnZlYyBmb3IgYmlvX2dldC9zZXRfcmVnaW9uKCkuCisJCSAqIEFsbG9jYXRlIGEgc3VpdGFibHkgc2l6ZWQtYmlvOiB3ZSBhZGQgYW4gZXh0cmEKKwkJICogYnZlYyBmb3IgYmlvX2dldC9zZXRfcmVnaW9uKCkgYW5kIGRlY3JlbWVudCBiaV9tYXhfdmVjcworCQkgKiB0byBoaWRlIGl0IGZyb20gYmlvX2FkZF9wYWdlKCkuCiAJCSAqLwotCQludW1fYnZlY3MgPSAocmVtYWluaW5nIC8gKFBBR0VfU0laRSA+PiA5KSkgKyAyOworCQludW1fYnZlY3MgPSAocmVtYWluaW5nIC8gKFBBR0VfU0laRSA+PiBTRUNUT1JfU0hJRlQpKSArIDI7CiAJCWJpbyA9IGJpb19hbGxvY19iaW9zZXQoR0ZQX05PSU8sIG51bV9idmVjcywgX2Jpb3MpOwogCQliaW8tPmJpX3NlY3RvciA9IHdoZXJlLT5zZWN0b3IgKyAod2hlcmUtPmNvdW50IC0gcmVtYWluaW5nKTsKIAkJYmlvLT5iaV9iZGV2ID0gd2hlcmUtPmJkZXY7CiAJCWJpby0+YmlfZW5kX2lvID0gZW5kaW87CiAJCWJpby0+YmlfcHJpdmF0ZSA9IGlvOwogCQliaW8tPmJpX2Rlc3RydWN0b3IgPSBkbV9iaW9fZGVzdHJ1Y3RvcjsKKwkJYmlvLT5iaV9tYXhfdmVjcy0tOwogCQliaW9fc2V0X3JlZ2lvbihiaW8sIHJlZ2lvbik7CiAKIAkJLyoKQEAgLTMwMiw3ICszMDUsNyBAQAogCX0KIAogCS8qCi0JICogRHJvcCB0aGUgZXh0cmEgcmVmZW5jZSB0aGF0IHdlIHdlcmUgaG9sZGluZyB0byBhdm9pZAorCSAqIERyb3AgdGhlIGV4dHJhIHJlZmVyZW5jZSB0aGF0IHdlIHdlcmUgaG9sZGluZyB0byBhdm9pZAogCSAqIHRoZSBpbyBiZWluZyBjb21wbGV0ZWQgdG9vIGVhcmx5LgogCSAqLwogCWRlY19jb3VudChpbywgMCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKaW5kZXggZDEzYmIxNS4uY2Q2YTE4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwpAQCAtNjA2LDkgKzYwNiwxNCBAQAogCQlyZXR1cm4gX19nZXRfbmFtZV9jZWxsKHBhcmFtLT5uYW1lKTsKIAogCW1kID0gZG1fZ2V0X21kKGh1Z2VfZGVjb2RlX2RldihwYXJhbS0+ZGV2KSk7Ci0JaWYgKG1kKQotCQltZHB0ciA9IGRtX2dldF9tZHB0cihtZCk7CisJaWYgKCFtZCkKKwkJZ290byBvdXQ7CiAKKwltZHB0ciA9IGRtX2dldF9tZHB0cihtZCk7CisJaWYgKCFtZHB0cikKKwkJZG1fcHV0KG1kKTsKKworb3V0OgogCXJldHVybiBtZHB0cjsKIH0KIApAQCAtNzYwLDcgKzc2NSw3IEBACiBzdGF0aWMgaW50IGRvX3N1c3BlbmQoc3RydWN0IGRtX2lvY3RsICpwYXJhbSkKIHsKIAlpbnQgciA9IDA7Ci0JaW50IGRvX2xvY2tmcyA9IDE7CisJdW5zaWduZWQgc3VzcGVuZF9mbGFncyA9IERNX1NVU1BFTkRfTE9DS0ZTX0ZMQUc7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOwogCiAJbWQgPSBmaW5kX2RldmljZShwYXJhbSk7CkBAIC03NjgsMTAgKzc3MywxMiBAQAogCQlyZXR1cm4gLUVOWElPOwogCiAJaWYgKHBhcmFtLT5mbGFncyAmIERNX1NLSVBfTE9DS0ZTX0ZMQUcpCi0JCWRvX2xvY2tmcyA9IDA7CisJCXN1c3BlbmRfZmxhZ3MgJj0gfkRNX1NVU1BFTkRfTE9DS0ZTX0ZMQUc7CisJaWYgKHBhcmFtLT5mbGFncyAmIERNX05PRkxVU0hfRkxBRykKKwkJc3VzcGVuZF9mbGFncyB8PSBETV9TVVNQRU5EX05PRkxVU0hfRkxBRzsKIAogCWlmICghZG1fc3VzcGVuZGVkKG1kKSkKLQkJciA9IGRtX3N1c3BlbmQobWQsIGRvX2xvY2tmcyk7CisJCXIgPSBkbV9zdXNwZW5kKG1kLCBzdXNwZW5kX2ZsYWdzKTsKIAogCWlmICghcikKIAkJciA9IF9fZGV2X3N0YXR1cyhtZCwgcGFyYW0pOwpAQCAtNzgzLDcgKzc5MCw3IEBACiBzdGF0aWMgaW50IGRvX3Jlc3VtZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQogewogCWludCByID0gMDsKLQlpbnQgZG9fbG9ja2ZzID0gMTsKKwl1bnNpZ25lZCBzdXNwZW5kX2ZsYWdzID0gRE1fU1VTUEVORF9MT0NLRlNfRkxBRzsKIAlzdHJ1Y3QgaGFzaF9jZWxsICpoYzsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CiAJc3RydWN0IGRtX3RhYmxlICpuZXdfbWFwOwpAQCAtODA5LDkgKzgxNiwxMSBAQAogCWlmIChuZXdfbWFwKSB7CiAJCS8qIFN1c3BlbmQgaWYgaXQgaXNuJ3QgYWxyZWFkeSBzdXNwZW5kZWQgKi8KIAkJaWYgKHBhcmFtLT5mbGFncyAmIERNX1NLSVBfTE9DS0ZTX0ZMQUcpCi0JCQlkb19sb2NrZnMgPSAwOworCQkJc3VzcGVuZF9mbGFncyAmPSB+RE1fU1VTUEVORF9MT0NLRlNfRkxBRzsKKwkJaWYgKHBhcmFtLT5mbGFncyAmIERNX05PRkxVU0hfRkxBRykKKwkJCXN1c3BlbmRfZmxhZ3MgfD0gRE1fU1VTUEVORF9OT0ZMVVNIX0ZMQUc7CiAJCWlmICghZG1fc3VzcGVuZGVkKG1kKSkKLQkJCWRtX3N1c3BlbmQobWQsIGRvX2xvY2tmcyk7CisJCQlkbV9zdXNwZW5kKG1kLCBzdXNwZW5kX2ZsYWdzKTsKIAogCQlyID0gZG1fc3dhcF90YWJsZShtZCwgbmV3X21hcCk7CiAJCWlmIChyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxpbmVhci5jIGIvZHJpdmVycy9tZC9kbS1saW5lYXIuYwppbmRleCAwMDIzNDkwLi4xNzc1M2Q4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbGluZWFyLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAliaW8tPmJpX2JkZXYgPSBsYy0+ZGV2LT5iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gbGMtPnN0YXJ0ICsgKGJpby0+Ymlfc2VjdG9yIC0gdGktPmJlZ2luKTsKIAotCXJldHVybiAxOworCXJldHVybiBETV9NQVBJT19SRU1BUFBFRDsKIH0KIAogc3RhdGljIGludCBsaW5lYXJfc3RhdHVzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdGF0dXNfdHlwZV90IHR5cGUsCkBAIC0xMDgsNyArMTA4LDcgQEAKIAlzdHJ1Y3QgZGVudHJ5IGZha2VfZGVudHJ5ID0ge307CiAKIAlmYWtlX2ZpbGUuZl9tb2RlID0gbGMtPmRldi0+bW9kZTsKLQlmYWtlX2ZpbGUuZl9kZW50cnkgPSAmZmFrZV9kZW50cnk7CisJZmFrZV9maWxlLmZfcGF0aC5kZW50cnkgPSAmZmFrZV9kZW50cnk7CiAJZmFrZV9kZW50cnkuZF9pbm9kZSA9IGJkZXYtPmJkX2lub2RlOwogCiAJcmV0dXJuIGJsa2Rldl9kcml2ZXJfaW9jdGwoYmRldi0+YmRfaW5vZGUsICZmYWtlX2ZpbGUsIGJkZXYtPmJkX2Rpc2ssIGNtZCwgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLmMgYi9kcml2ZXJzL21kL2RtLWxvZy5jCmluZGV4IDY0Yjc2NGIuLjZhOTI2MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2cuYwpAQCAtNDY2LDYgKzQ2Niw3IEBACiAJLyogY29weSBjbGVhbiBhY3Jvc3MgdG8gc3luYyAqLwogCW1lbWNweShsYy0+c3luY19iaXRzLCBsYy0+Y2xlYW5fYml0cywgc2l6ZSk7CiAJbGMtPnN5bmNfY291bnQgPSBjb3VudF9iaXRzMzIobGMtPmNsZWFuX2JpdHMsIGxjLT5iaXRzZXRfdWludDMyX2NvdW50KTsKKwlsYy0+c3luY19zZWFyY2ggPSAwOwogCiAJLyogc2V0IHRoZSBjb3JyZWN0IG51bWJlciBvZiByZWdpb25zIGluIHRoZSBoZWFkZXIgKi8KIAlsYy0+aGVhZGVyLm5yX3JlZ2lvbnMgPSBsYy0+cmVnaW9uX2NvdW50OwpAQCAtNDgwLDYgKzQ4MSwxMyBAQAogCXJldHVybiBsYy0+cmVnaW9uX3NpemU7CiB9CiAKK3N0YXRpYyBpbnQgY29yZV9yZXN1bWUoc3RydWN0IGRpcnR5X2xvZyAqbG9nKQoreworCXN0cnVjdCBsb2dfYyAqbGMgPSAoc3RydWN0IGxvZ19jICopIGxvZy0+Y29udGV4dDsKKwlsYy0+c3luY19zZWFyY2ggPSAwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGNvcmVfaXNfY2xlYW4oc3RydWN0IGRpcnR5X2xvZyAqbG9nLCByZWdpb25fdCByZWdpb24pCiB7CiAJc3RydWN0IGxvZ19jICpsYyA9IChzdHJ1Y3QgbG9nX2MgKikgbG9nLT5jb250ZXh0OwpAQCAtNTQ5LDE2ICs1NTcsMTkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgY29yZV9jb21wbGV0ZV9yZXN5bmNfd29yayhzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90IHJlZ2lvbiwKLQkJCQkgICAgICBpbnQgc3VjY2VzcykKK3N0YXRpYyB2b2lkIGNvcmVfc2V0X3JlZ2lvbl9zeW5jKHN0cnVjdCBkaXJ0eV9sb2cgKmxvZywgcmVnaW9uX3QgcmVnaW9uLAorCQkJCSBpbnQgaW5fc3luYykKIHsKIAlzdHJ1Y3QgbG9nX2MgKmxjID0gKHN0cnVjdCBsb2dfYyAqKSBsb2ctPmNvbnRleHQ7CiAKIAlsb2dfY2xlYXJfYml0KGxjLCBsYy0+cmVjb3ZlcmluZ19iaXRzLCByZWdpb24pOwotCWlmIChzdWNjZXNzKSB7CisJaWYgKGluX3N5bmMpIHsKIAkJbG9nX3NldF9iaXQobGMsIGxjLT5zeW5jX2JpdHMsIHJlZ2lvbik7CiAgICAgICAgICAgICAgICAgbGMtPnN5bmNfY291bnQrKzsKLSAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxvZ190ZXN0X2JpdChsYy0+c3luY19iaXRzLCByZWdpb24pKSB7CisJCWxjLT5zeW5jX2NvdW50LS07CisJCWxvZ19jbGVhcl9iaXQobGMsIGxjLT5zeW5jX2JpdHMsIHJlZ2lvbik7CisJfQogfQogCiBzdGF0aWMgcmVnaW9uX3QgY29yZV9nZXRfc3luY19jb3VudChzdHJ1Y3QgZGlydHlfbG9nICpsb2cpCkBAIC02MTgsNiArNjI5LDcgQEAKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLmN0ciA9IGNvcmVfY3RyLAogCS5kdHIgPSBjb3JlX2R0ciwKKwkucmVzdW1lID0gY29yZV9yZXN1bWUsCiAJLmdldF9yZWdpb25fc2l6ZSA9IGNvcmVfZ2V0X3JlZ2lvbl9zaXplLAogCS5pc19jbGVhbiA9IGNvcmVfaXNfY2xlYW4sCiAJLmluX3N5bmMgPSBjb3JlX2luX3N5bmMsCkBAIC02MjUsNyArNjM3LDcgQEAKIAkubWFya19yZWdpb24gPSBjb3JlX21hcmtfcmVnaW9uLAogCS5jbGVhcl9yZWdpb24gPSBjb3JlX2NsZWFyX3JlZ2lvbiwKIAkuZ2V0X3Jlc3luY193b3JrID0gY29yZV9nZXRfcmVzeW5jX3dvcmssCi0JLmNvbXBsZXRlX3Jlc3luY193b3JrID0gY29yZV9jb21wbGV0ZV9yZXN5bmNfd29yaywKKwkuc2V0X3JlZ2lvbl9zeW5jID0gY29yZV9zZXRfcmVnaW9uX3N5bmMsCiAJLmdldF9zeW5jX2NvdW50ID0gY29yZV9nZXRfc3luY19jb3VudCwKIAkuc3RhdHVzID0gY29yZV9zdGF0dXMsCiB9OwpAQCAtNjQ0LDcgKzY1Niw3IEBACiAJLm1hcmtfcmVnaW9uID0gY29yZV9tYXJrX3JlZ2lvbiwKIAkuY2xlYXJfcmVnaW9uID0gY29yZV9jbGVhcl9yZWdpb24sCiAJLmdldF9yZXN5bmNfd29yayA9IGNvcmVfZ2V0X3Jlc3luY193b3JrLAotCS5jb21wbGV0ZV9yZXN5bmNfd29yayA9IGNvcmVfY29tcGxldGVfcmVzeW5jX3dvcmssCisJLnNldF9yZWdpb25fc3luYyA9IGNvcmVfc2V0X3JlZ2lvbl9zeW5jLAogCS5nZXRfc3luY19jb3VudCA9IGNvcmVfZ2V0X3N5bmNfY291bnQsCiAJLnN0YXR1cyA9IGRpc2tfc3RhdHVzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLmggYi9kcml2ZXJzL21kL2RtLWxvZy5oCmluZGV4IDVhZTUzMDkuLjg2YTMwMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLmgKKysrIGIvZHJpdmVycy9tZC9kbS1sb2cuaApAQCAtOTAsMTIgKzkwLDEyIEBACiAJaW50ICgqZ2V0X3Jlc3luY193b3JrKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csIHJlZ2lvbl90ICpyZWdpb24pOwogCiAJLyoKLQkgKiBUaGlzIG5vdGlmaWVzIHRoZSBsb2cgdGhhdCB0aGUgcmVzeW5jIG9mIGFuIGFyZWEgaGFzCi0JICogYmVlbiBjb21wbGV0ZWQuICBUaGUgbG9nIHNob3VsZCB0aGVuIG1hcmsgdGhpcyByZWdpb24KLQkgKiBhcyBDTEVBTi4KKwkgKiBUaGlzIG5vdGlmaWVzIHRoZSBsb2cgdGhhdCB0aGUgcmVzeW5jIHN0YXR1cyBvZiBhIHJlZ2lvbgorCSAqIGhhcyBjaGFuZ2VkLiAgSXQgYWxzbyBjbGVhcnMgdGhlIHJlZ2lvbiBmcm9tIHRoZSByZWNvdmVyaW5nCisJICogbGlzdCAoaWYgcHJlc2VudCkuCiAJICovCi0Jdm9pZCAoKmNvbXBsZXRlX3Jlc3luY193b3JrKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csCi0JCQkJICAgICByZWdpb25fdCByZWdpb24sIGludCBzdWNjZXNzKTsKKwl2b2lkICgqc2V0X3JlZ2lvbl9zeW5jKShzdHJ1Y3QgZGlydHlfbG9nICpsb2csCisJCQkJcmVnaW9uX3QgcmVnaW9uLCBpbnQgaW5fc3luYyk7CiAKICAgICAgICAgLyoKIAkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVnaW9ucyB0aGF0IGFyZSBpbiBzeW5jLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCmluZGV4IGQ3NTRlMGIuLjNhYTAxMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYworKysgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAlzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKnBnOwkvKiBPd25pbmcgUEcgKi8KIAl1bnNpZ25lZCBmYWlsX2NvdW50OwkJLyogQ3VtdWxhdGl2ZSBmYWlsdXJlIGNvdW50ICovCiAKLQlzdHJ1Y3QgcGF0aCBwYXRoOworCXN0cnVjdCBkbV9wYXRoIHBhdGg7CiB9OwogCiAjZGVmaW5lIHBhdGhfdG9fcGdwYXRoKF9fcGdwKSBjb250YWluZXJfb2YoKF9fcGdwKSwgc3RydWN0IHBncGF0aCwgcGF0aCkKQEAgLTEwMSwxMSArMTAxLDExIEBACiAKICNkZWZpbmUgTUlOX0lPUyAyNTYJLyogTWVtcG9vbCBzaXplICovCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKl9tcGlvX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfbXBpb19jYWNoZTsKIAogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmttdWx0aXBhdGhkOwotc3RhdGljIHZvaWQgcHJvY2Vzc19xdWV1ZWRfaW9zKHZvaWQgKmRhdGEpOwotc3RhdGljIHZvaWQgdHJpZ2dlcl9ldmVudCh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfcXVldWVkX2lvcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgdHJpZ2dlcl9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3Myw4ICsxNzMsOCBAQAogCQlJTklUX0xJU1RfSEVBRCgmbS0+cHJpb3JpdHlfZ3JvdXBzKTsKIAkJc3Bpbl9sb2NrX2luaXQoJm0tPmxvY2spOwogCQltLT5xdWV1ZV9pbyA9IDE7Ci0JCUlOSVRfV09SSygmbS0+cHJvY2Vzc19xdWV1ZWRfaW9zLCBwcm9jZXNzX3F1ZXVlZF9pb3MsIG0pOwotCQlJTklUX1dPUksoJm0tPnRyaWdnZXJfZXZlbnQsIHRyaWdnZXJfZXZlbnQsIG0pOworCQlJTklUX1dPUksoJm0tPnByb2Nlc3NfcXVldWVkX2lvcywgcHJvY2Vzc19xdWV1ZWRfaW9zKTsKKwkJSU5JVF9XT1JLKCZtLT50cmlnZ2VyX2V2ZW50LCB0cmlnZ2VyX2V2ZW50KTsKIAkJbS0+bXBpb19wb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKE1JTl9JT1MsIF9tcGlvX2NhY2hlKTsKIAkJaWYgKCFtLT5tcGlvX3Bvb2wpIHsKIAkJCWtmcmVlKG0pOwpAQCAtMjI5LDcgKzIyOSw3IEBACiAKIHN0YXRpYyBpbnQgX19jaG9vc2VfcGF0aF9pbl9wZyhzdHJ1Y3QgbXVsdGlwYXRoICptLCBzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKnBnKQogewotCXN0cnVjdCBwYXRoICpwYXRoOworCXN0cnVjdCBkbV9wYXRoICpwYXRoOwogCiAJcGF0aCA9IHBnLT5wcy50eXBlLT5zZWxlY3RfcGF0aCgmcGctPnBzLCAmbS0+cmVwZWF0X2NvdW50KTsKIAlpZiAoIXBhdGgpCkBAIC0yODIsMTAgKzI4MiwyNyBAQAogCW0tPmN1cnJlbnRfcGcgPSBOVUxMOwogfQogCisvKgorICogQ2hlY2sgd2hldGhlciBiaW9zIG11c3QgYmUgcXVldWVkIGluIHRoZSBkZXZpY2UtbWFwcGVyIGNvcmUgcmF0aGVyCisgKiB0aGFuIGhlcmUgaW4gdGhlIHRhcmdldC4KKyAqCisgKiBtLT5sb2NrIG11c3QgYmUgaGVsZCBvbiBlbnRyeS4KKyAqCisgKiBJZiBtLT5xdWV1ZV9pZl9ub19wYXRoIGFuZCBtLT5zYXZlZF9xdWV1ZV9pZl9ub19wYXRoIGhvbGQgdGhlCisgKiBzYW1lIHZhbHVlIHRoZW4gd2UgYXJlIG5vdCBiZXR3ZWVuIG11bHRpcGF0aF9wcmVzdXNwZW5kKCkKKyAqIGFuZCBtdWx0aXBhdGhfcmVzdW1lKCkgY2FsbHMgYW5kIHdlIGhhdmUgbm8gbmVlZCB0byBjaGVjaworICogZm9yIHRoZSBETUZfTk9GTFVTSF9TVVNQRU5ESU5HIGZsYWcuCisgKi8KK3N0YXRpYyBpbnQgX19tdXN0X3B1c2hfYmFjayhzdHJ1Y3QgbXVsdGlwYXRoICptKQoreworCXJldHVybiAobS0+cXVldWVfaWZfbm9fcGF0aCAhPSBtLT5zYXZlZF9xdWV1ZV9pZl9ub19wYXRoICYmCisJCWRtX25vZmx1c2hfc3VzcGVuZGluZyhtLT50aSkpOworfQorCiBzdGF0aWMgaW50IG1hcF9pbyhzdHJ1Y3QgbXVsdGlwYXRoICptLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBtcGF0aF9pbyAqbXBpbywKIAkJICB1bnNpZ25lZCB3YXNfcXVldWVkKQogewotCWludCByID0gMTsKKwlpbnQgciA9IERNX01BUElPX1JFTUFQUEVEOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHBncGF0aCAqcGdwYXRoOwogCkBAIC0zMTAsMTEgKzMyNywxMyBAQAogCQkgICAgIW0tPnF1ZXVlX2lvKQogCQkJcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnByb2Nlc3NfcXVldWVkX2lvcyk7CiAJCXBncGF0aCA9IE5VTEw7Ci0JCXIgPSAwOwotCX0gZWxzZSBpZiAoIXBncGF0aCkKLQkJciA9IC1FSU87CQkvKiBGYWlsZWQgKi8KLQllbHNlCisJCXIgPSBETV9NQVBJT19TVUJNSVRURUQ7CisJfSBlbHNlIGlmIChwZ3BhdGgpCiAJCWJpby0+YmlfYmRldiA9IHBncGF0aC0+cGF0aC5kZXYtPmJkZXY7CisJZWxzZSBpZiAoX19tdXN0X3B1c2hfYmFjayhtKSkKKwkJciA9IERNX01BUElPX1JFUVVFVUU7CisJZWxzZQorCQlyID0gLUVJTzsJLyogRmFpbGVkICovCiAKIAltcGlvLT5wZ3BhdGggPSBwZ3BhdGg7CiAKQEAgLTM3MiwxNiArMzkxLDE5IEBACiAJCXIgPSBtYXBfaW8obSwgYmlvLCBtcGlvLCAxKTsKIAkJaWYgKHIgPCAwKQogCQkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCByKTsKLQkJZWxzZSBpZiAociA9PSAxKQorCQllbHNlIGlmIChyID09IERNX01BUElPX1JFTUFQUEVEKQogCQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKKwkJZWxzZSBpZiAociA9PSBETV9NQVBJT19SRVFVRVVFKQorCQkJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAtRUlPKTsKIAogCQliaW8gPSBuZXh0OwogCX0KIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19xdWV1ZWRfaW9zKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwcm9jZXNzX3F1ZXVlZF9pb3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBtdWx0aXBhdGggKm0gPSAoc3RydWN0IG11bHRpcGF0aCAqKSBkYXRhOworCXN0cnVjdCBtdWx0aXBhdGggKm0gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG11bHRpcGF0aCwgcHJvY2Vzc19xdWV1ZWRfaW9zKTsKIAlzdHJ1Y3QgaHdfaGFuZGxlciAqaHdoID0gJm0tPmh3X2hhbmRsZXI7CiAJc3RydWN0IHBncGF0aCAqcGdwYXRoID0gTlVMTDsKIAl1bnNpZ25lZCBpbml0X3JlcXVpcmVkID0gMCwgbXVzdF9xdWV1ZSA9IDE7CkBAIC00MjEsOSArNDQzLDEwIEBACiAgKiBBbiBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBwYXRoIGlzIHRha2VuIG91dCBvZiB1c2UuCiAgKiBJbmNsdWRlcyBwYXRoIGZhaWx1cmUgYW5kIFBHIGJ5cGFzcy4KICAqLwotc3RhdGljIHZvaWQgdHJpZ2dlcl9ldmVudCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgdHJpZ2dlcl9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG11bHRpcGF0aCAqbSA9IChzdHJ1Y3QgbXVsdGlwYXRoICopIGRhdGE7CisJc3RydWN0IG11bHRpcGF0aCAqbSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXVsdGlwYXRoLCB0cmlnZ2VyX2V2ZW50KTsKIAogCWRtX3RhYmxlX2V2ZW50KG0tPnRpLT50YWJsZSk7CiB9CkBAIC03ODEsNyArODA0LDcgQEAKIAltYXBfY29udGV4dC0+cHRyID0gbXBpbzsKIAliaW8tPmJpX3J3IHw9ICgxIDw8IEJJT19SV19GQUlMRkFTVCk7CiAJciA9IG1hcF9pbyhtLCBiaW8sIG1waW8sIDApOwotCWlmIChyIDwgMCkKKwlpZiAociA8IDAgfHwgciA9PSBETV9NQVBJT19SRVFVRVVFKQogCQltZW1wb29sX2ZyZWUobXBpbywgbS0+bXBpb19wb29sKTsKIAogCXJldHVybiByOwpAQCAtOTU1LDcgKzk3OCw3IEBACiAvKgogICogcGdfaW5pdCBtdXN0IGNhbGwgdGhpcyB3aGVuIGl0IGhhcyBjb21wbGV0ZWQgaXRzIGluaXRpYWxpc2F0aW9uCiAgKi8KLXZvaWQgZG1fcGdfaW5pdF9jb21wbGV0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgdW5zaWduZWQgZXJyX2ZsYWdzKQordm9pZCBkbV9wZ19pbml0X2NvbXBsZXRlKHN0cnVjdCBkbV9wYXRoICpwYXRoLCB1bnNpZ25lZCBlcnJfZmxhZ3MpCiB7CiAJc3RydWN0IHBncGF0aCAqcGdwYXRoID0gcGF0aF90b19wZ3BhdGgocGF0aCk7CiAJc3RydWN0IHByaW9yaXR5X2dyb3VwICpwZyA9IHBncGF0aC0+cGc7CkBAIC0xMDA1LDcgKzEwMjgsMTAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtLT5sb2NrLCBmbGFncyk7CiAJaWYgKCFtLT5ucl92YWxpZF9wYXRocykgewotCQlpZiAoIW0tPnF1ZXVlX2lmX25vX3BhdGgpIHsKKwkJaWYgKF9fbXVzdF9wdXNoX2JhY2sobSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBETV9FTkRJT19SRVFVRVVFOworCQl9IGVsc2UgaWYgKCFtLT5xdWV1ZV9pZl9ub19wYXRoKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfSBlbHNlIHsKQEAgLTEwNDAsNyArMTA2Niw3IEBACiAJCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT5wcm9jZXNzX3F1ZXVlZF9pb3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKIAotCXJldHVybiAxOwkvKiBpbyBub3QgY29tcGxldGUgKi8KKwlyZXR1cm4gRE1fRU5ESU9fSU5DT01QTEVURTsJLyogaW8gbm90IGNvbXBsZXRlICovCiB9CiAKIHN0YXRpYyBpbnQgbXVsdGlwYXRoX2VuZF9pbyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLApAQCAtMTA1OCw3ICsxMDg0LDcgQEAKIAkJaWYgKHBzLT50eXBlLT5lbmRfaW8pCiAJCQlwcy0+dHlwZS0+ZW5kX2lvKHBzLCAmcGdwYXRoLT5wYXRoKTsKIAl9Ci0JaWYgKHIgPD0gMCkKKwlpZiAociAhPSBETV9FTkRJT19JTkNPTVBMRVRFKQogCQltZW1wb29sX2ZyZWUobXBpbywgbS0+bXBpb19wb29sKTsKIAogCXJldHVybiByOwpAQCAtMTI3MCw3ICsxMjk2LDcgQEAKIAlzdHJ1Y3QgZGVudHJ5IGZha2VfZGVudHJ5ID0ge307CiAJaW50IHIgPSAwOwogCi0JZmFrZV9maWxlLmZfZGVudHJ5ID0gJmZha2VfZGVudHJ5OworCWZha2VfZmlsZS5mX3BhdGguZGVudHJ5ID0gJmZha2VfZGVudHJ5OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm0tPmxvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1tcGF0aC5oIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5oCmluZGV4IDhhNGJmMmIuLmI5Y2RjYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbXBhdGguaAorKysgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmgKQEAgLTExLDcgKzExLDcgQEAKIAogc3RydWN0IGRtX2RldjsKIAotc3RydWN0IHBhdGggeworc3RydWN0IGRtX3BhdGggewogCXN0cnVjdCBkbV9kZXYgKmRldjsJLyogUmVhZC1vbmx5ICovCiAJdW5zaWduZWQgaXNfYWN0aXZlOwkvKiBSZWFkLW9ubHkgKi8KIApAQCAtMjAsNiArMjAsNiBAQAogfTsKIAogLyogQ2FsbGJhY2sgZm9yIGh3aF9wZ19pbml0X2ZuIHRvIHVzZSB3aGVuIGNvbXBsZXRlICovCi12b2lkIGRtX3BnX2luaXRfY29tcGxldGUoc3RydWN0IHBhdGggKnBhdGgsIHVuc2lnbmVkIGVycl9mbGFncyk7Cit2b2lkIGRtX3BnX2luaXRfY29tcGxldGUoc3RydWN0IGRtX3BhdGggKnBhdGgsIHVuc2lnbmVkIGVycl9mbGFncyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1wYXRoLXNlbGVjdG9yLmggYi9kcml2ZXJzL21kL2RtLXBhdGgtc2VsZWN0b3IuaAppbmRleCA3MzJkMDZhLi4yNzM1N2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXBhdGgtc2VsZWN0b3IuaAorKysgYi9kcml2ZXJzL21kL2RtLXBhdGgtc2VsZWN0b3IuaApAQCAtNDQsNyArNDQsNyBAQAogCSAqIEFkZCBhbiBvcGFxdWUgcGF0aCBvYmplY3QsIGFsb25nIHdpdGggc29tZSBzZWxlY3RvciBzcGVjaWZpYwogCSAqIHBhdGggYXJncyAoZWcsIHBhdGggcHJpb3JpdHkpLgogCSAqLwotCWludCAoKmFkZF9wYXRoKSAoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwlpbnQgKCphZGRfcGF0aCkgKHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywgc3RydWN0IGRtX3BhdGggKnBhdGgsCiAJCQkgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICoqZXJyb3IpOwogCiAJLyoKQEAgLTU1LDI3ICs1NSwyNyBAQAogCSAqIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGFnYWluLiAgMCBtZWFucyBkb24ndCBjYWxsIGl0IGFnYWluIHVubGVzcwogCSAqIHRoZSBwYXRoIGZhaWxzLgogCSAqLwotCXN0cnVjdCBwYXRoICooKnNlbGVjdF9wYXRoKSAoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLAorCXN0cnVjdCBkbV9wYXRoICooKnNlbGVjdF9wYXRoKSAoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLAogCQkJCSAgICAgdW5zaWduZWQgKnJlcGVhdF9jb3VudCk7CiAKIAkvKgogCSAqIE5vdGlmeSB0aGUgc2VsZWN0b3IgdGhhdCBhIHBhdGggaGFzIGZhaWxlZC4KIAkgKi8KLQl2b2lkICgqZmFpbF9wYXRoKSAoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgcGF0aCAqcCk7CisJdm9pZCAoKmZhaWxfcGF0aCkgKHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywgc3RydWN0IGRtX3BhdGggKnApOwogCiAJLyoKIAkgKiBBc2sgc2VsZWN0b3IgdG8gcmVpbnN0YXRlIGEgcGF0aC4KIAkgKi8KLQlpbnQgKCpyZWluc3RhdGVfcGF0aCkgKHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywgc3RydWN0IHBhdGggKnApOworCWludCAoKnJlaW5zdGF0ZV9wYXRoKSAoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgZG1fcGF0aCAqcCk7CiAKIAkvKgogCSAqIFRhYmxlIGNvbnRlbnQgYmFzZWQgb24gcGFyYW1ldGVycyBhZGRlZCBpbiBwc19hZGRfcGF0aF9mbgogCSAqIG9yIHBhdGggc2VsZWN0b3Igc3RhdHVzCiAJICovCi0JaW50ICgqc3RhdHVzKSAoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwlpbnQgKCpzdGF0dXMpIChzdHJ1Y3QgcGF0aF9zZWxlY3RvciAqcHMsIHN0cnVjdCBkbV9wYXRoICpwYXRoLAogCQkgICAgICAgc3RhdHVzX3R5cGVfdCB0eXBlLCBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIGludCBtYXhsZW4pOwogCi0JaW50ICgqZW5kX2lvKSAoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgcGF0aCAqcGF0aCk7CisJaW50ICgqZW5kX2lvKSAoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgZG1fcGF0aCAqcGF0aCk7CiB9OwogCiAvKiBSZWdpc3RlciBhIHBhdGggc2VsZWN0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwppbmRleCA2NTkyMjRjLi4yM2E2NDI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCkBAIC0yNCw2ICsyNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqX2ttaXJyb3JkX3dxOwogc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBfa21pcnJvcmRfd29yazsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChfa21pcnJvcmRfcmVjb3Zlcnlfc3RvcHBlZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWtlKHZvaWQpCiB7CkBAIC04Myw2ICs4NCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqYnVja2V0czsKIAogCXNwaW5sb2NrX3QgcmVnaW9uX2xvY2s7CisJYXRvbWljX3QgcmVjb3ZlcnlfaW5fZmxpZ2h0OwogCXN0cnVjdCBzZW1hcGhvcmUgcmVjb3ZlcnlfY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBjbGVhbl9yZWdpb25zOwogCXN0cnVjdCBsaXN0X2hlYWQgcXVpZXNjZWRfcmVnaW9uczsKQEAgLTE5MSw2ICsxOTMsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnJoLT5yZWdpb25fbG9jayk7CiAJc2VtYV9pbml0KCZyaC0+cmVjb3ZlcnlfY291bnQsIDApOworCWF0b21pY19zZXQoJnJoLT5yZWNvdmVyeV9pbl9mbGlnaHQsIDApOwogCUlOSVRfTElTVF9IRUFEKCZyaC0+Y2xlYW5fcmVnaW9ucyk7CiAJSU5JVF9MSVNUX0hFQUQoJnJoLT5xdWllc2NlZF9yZWdpb25zKTsKIAlJTklUX0xJU1RfSEVBRCgmcmgtPnJlY292ZXJlZF9yZWdpb25zKTsKQEAgLTM0MSw2ICszNDQsMTcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX3Jlc3luY193b3JrKHN0cnVjdCByZWdpb24gKnJlZywgaW50IHN1Y2Nlc3MpCit7CisJc3RydWN0IHJlZ2lvbl9oYXNoICpyaCA9IHJlZy0+cmg7CisKKwlyaC0+bG9nLT50eXBlLT5zZXRfcmVnaW9uX3N5bmMocmgtPmxvZywgcmVnLT5rZXksIHN1Y2Nlc3MpOworCWRpc3BhdGNoX2Jpb3MocmgtPm1zLCAmcmVnLT5kZWxheWVkX2Jpb3MpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyaC0+cmVjb3ZlcnlfaW5fZmxpZ2h0KSkKKwkJd2FrZV91cF9hbGwoJl9rbWlycm9yZF9yZWNvdmVyeV9zdG9wcGVkKTsKKwl1cCgmcmgtPnJlY292ZXJ5X2NvdW50KTsKK30KKwogc3RhdGljIHZvaWQgcmhfdXBkYXRlX3N0YXRlcyhzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoKQogewogCXN0cnVjdCByZWdpb24gKnJlZywgKm5leHQ7CkBAIC0zODAsOSArMzk0LDcgQEAKIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKHJlZywgbmV4dCwgJnJlY292ZXJlZCwgbGlzdCkgewogCQlyaC0+bG9nLT50eXBlLT5jbGVhcl9yZWdpb24ocmgtPmxvZywgcmVnLT5rZXkpOwotCQlyaC0+bG9nLT50eXBlLT5jb21wbGV0ZV9yZXN5bmNfd29yayhyaC0+bG9nLCByZWctPmtleSwgMSk7Ci0JCWRpc3BhdGNoX2Jpb3MocmgtPm1zLCAmcmVnLT5kZWxheWVkX2Jpb3MpOwotCQl1cCgmcmgtPnJlY292ZXJ5X2NvdW50KTsKKwkJY29tcGxldGVfcmVzeW5jX3dvcmsocmVnLCAxKTsKIAkJbWVtcG9vbF9mcmVlKHJlZywgcmgtPnJlZ2lvbl9wb29sKTsKIAl9CiAKQEAgLTUwMiwxMSArNTE0LDIxIEBACiAKIHN0YXRpYyB2b2lkIHJoX3JlY292ZXJ5X3ByZXBhcmUoc3RydWN0IHJlZ2lvbl9oYXNoICpyaCkKIHsKLQl3aGlsZSAoIWRvd25fdHJ5bG9jaygmcmgtPnJlY292ZXJ5X2NvdW50KSkKKwkvKiBFeHRyYSByZWZlcmVuY2UgdG8gYXZvaWQgcmFjZSB3aXRoIHJoX3N0b3BfcmVjb3ZlcnkgKi8KKwlhdG9taWNfaW5jKCZyaC0+cmVjb3ZlcnlfaW5fZmxpZ2h0KTsKKworCXdoaWxlICghZG93bl90cnlsb2NrKCZyaC0+cmVjb3ZlcnlfY291bnQpKSB7CisJCWF0b21pY19pbmMoJnJoLT5yZWNvdmVyeV9pbl9mbGlnaHQpOwogCQlpZiAoX19yaF9yZWNvdmVyeV9wcmVwYXJlKHJoKSA8PSAwKSB7CisJCQlhdG9taWNfZGVjKCZyaC0+cmVjb3ZlcnlfaW5fZmxpZ2h0KTsKIAkJCXVwKCZyaC0+cmVjb3ZlcnlfY291bnQpOwogCQkJYnJlYWs7CiAJCX0KKwl9CisKKwkvKiBEcm9wIHRoZSBleHRyYSByZWZlcmVuY2UgKi8KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmgtPnJlY292ZXJ5X2luX2ZsaWdodCkpCisJCXdha2VfdXBfYWxsKCZfa21pcnJvcmRfcmVjb3Zlcnlfc3RvcHBlZCk7CiB9CiAKIC8qCkBAIC04NjgsNyArODkwLDcgQEAKIAlkb193cml0ZXMobXMsICZ3cml0ZXMpOwogfQogCi1zdGF0aWMgdm9pZCBkb193b3JrKHZvaWQgKmlnbm9yZWQpCitzdGF0aWMgdm9pZCBkb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCkKIHsKIAlzdHJ1Y3QgbWlycm9yX3NldCAqbXM7CiAKQEAgLTExMjIsNyArMTE0NCw3IEBACiAKIAlpZiAocncgPT0gV1JJVEUpIHsKIAkJcXVldWVfYmlvKG1zLCBiaW8sIHJ3KTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBETV9NQVBJT19TVUJNSVRURUQ7CiAJfQogCiAJciA9IG1zLT5yaC5sb2ctPnR5cGUtPmluX3N5bmMobXMtPnJoLmxvZywKQEAgLTExMzEsNyArMTE1Myw3IEBACiAJCXJldHVybiByOwogCiAJaWYgKHIgPT0gLUVXT1VMREJMT0NLKQkvKiBGSVhNRTogdWdseSAqLwotCQlyID0gMDsKKwkJciA9IERNX01BUElPX1NVQk1JVFRFRDsKIAogCS8qCiAJICogV2UgZG9uJ3Qgd2FudCB0byBmYXN0IHRyYWNrIGEgcmVjb3ZlcnkganVzdCBmb3IgYSByZWFkCkBAIC0xMTQ0LDcgKzExNjYsNyBAQAogCWlmICghcikgewogCQkvKiBQYXNzIHRoaXMgaW8gb3ZlciB0byB0aGUgZGFlbW9uICovCiAJCXF1ZXVlX2JpbyhtcywgYmlvLCBydyk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gRE1fTUFQSU9fU1VCTUlUVEVEOwogCX0KIAogCW0gPSBjaG9vc2VfbWlycm9yKG1zLCBiaW8tPmJpX3NlY3Rvcik7CkBAIC0xMTUyLDcgKzExNzQsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCW1hcF9iaW8obXMsIG0sIGJpbyk7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogfQogCiBzdGF0aWMgaW50IG1pcnJvcl9lbmRfaW8oc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBiaW8gKmJpbywKQEAgLTExNzcsNiArMTE5OSwxMSBAQAogCXN0cnVjdCBkaXJ0eV9sb2cgKmxvZyA9IG1zLT5yaC5sb2c7CiAKIAlyaF9zdG9wX3JlY292ZXJ5KCZtcy0+cmgpOworCisJLyogV2FpdCBmb3IgYWxsIEkvTyB3ZSBnZW5lcmF0ZWQgdG8gY29tcGxldGUgKi8KKwl3YWl0X2V2ZW50KF9rbWlycm9yZF9yZWNvdmVyeV9zdG9wcGVkLAorCQkgICAhYXRvbWljX3JlYWQoJm1zLT5yaC5yZWNvdmVyeV9pbl9mbGlnaHQpKTsKKwogCWlmIChsb2ctPnR5cGUtPnN1c3BlbmQgJiYgbG9nLT50eXBlLT5zdXNwZW5kKGxvZykpCiAJCS8qIEZJWE1FOiBuZWVkIGJldHRlciBlcnJvciBoYW5kbGluZyAqLwogCQlETVdBUk4oImxvZyBzdXNwZW5kIGZhaWxlZCIpOwpAQCAtMTI0OSw3ICsxMjc2LDcgQEAKIAkJZG1fZGlydHlfbG9nX2V4aXQoKTsKIAkJcmV0dXJuIHI7CiAJfQotCUlOSVRfV09SSygmX2ttaXJyb3JkX3dvcmssIGRvX3dvcmssIE5VTEwpOworCUlOSVRfV09SSygmX2ttaXJyb3JkX3dvcmssIGRvX3dvcmspOwogCiAJciA9IGRtX3JlZ2lzdGVyX3RhcmdldCgmbWlycm9yX3RhcmdldCk7CiAJaWYgKHIgPCAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMgYi9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMKaW5kZXggYzVhMTZjNS4uYTM0OGE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yb3VuZC1yb2Jpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcm91bmQtcm9iaW4uYwpAQCAtMjEsNyArMjEsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RydWN0IHBhdGhfaW5mbyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBwYXRoICpwYXRoOworCXN0cnVjdCBkbV9wYXRoICpwYXRoOwogCXVuc2lnbmVkIHJlcGVhdF9jb3VudDsKIH07CiAKQEAgLTgwLDcgKzgwLDcgQEAKIAlwcy0+Y29udGV4dCA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgcnJfc3RhdHVzKHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywgc3RydWN0IHBhdGggKnBhdGgsCitzdGF0aWMgaW50IHJyX3N0YXR1cyhzdHJ1Y3QgcGF0aF9zZWxlY3RvciAqcHMsIHN0cnVjdCBkbV9wYXRoICpwYXRoLAogCQkgICAgIHN0YXR1c190eXBlX3QgdHlwZSwgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgbWF4bGVuKQogewogCXN0cnVjdCBwYXRoX2luZm8gKnBpOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgKiBDYWxsZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uIHRvIHJlZ2lzdGVyIGVhY2ggcGF0aCB3aXRoIGFuCiAgKiBvcHRpb25hbCByZXBlYXRfY291bnQuCiAgKi8KLXN0YXRpYyBpbnQgcnJfYWRkX3BhdGgoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgcGF0aCAqcGF0aCwKK3N0YXRpYyBpbnQgcnJfYWRkX3BhdGgoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgZG1fcGF0aCAqcGF0aCwKIAkJICAgICAgIGludCBhcmdjLCBjaGFyICoqYXJndiwgY2hhciAqKmVycm9yKQogewogCXN0cnVjdCBzZWxlY3RvciAqcyA9IChzdHJ1Y3Qgc2VsZWN0b3IgKikgcHMtPmNvbnRleHQ7CkBAIC0xMzYsMTIgKzEzNiwxMiBAQAogCiAJcGF0aC0+cHNjb250ZXh0ID0gcGk7CiAKLQlsaXN0X2FkZCgmcGktPmxpc3QsICZzLT52YWxpZF9wYXRocyk7CisJbGlzdF9hZGRfdGFpbCgmcGktPmxpc3QsICZzLT52YWxpZF9wYXRocyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnJfZmFpbF9wYXRoKHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywgc3RydWN0IHBhdGggKnApCitzdGF0aWMgdm9pZCBycl9mYWlsX3BhdGgoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLCBzdHJ1Y3QgZG1fcGF0aCAqcCkKIHsKIAlzdHJ1Y3Qgc2VsZWN0b3IgKnMgPSAoc3RydWN0IHNlbGVjdG9yICopIHBzLT5jb250ZXh0OwogCXN0cnVjdCBwYXRoX2luZm8gKnBpID0gcC0+cHNjb250ZXh0OwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJbGlzdF9tb3ZlKCZwaS0+bGlzdCwgJnMtPmludmFsaWRfcGF0aHMpOwogfQogCi1zdGF0aWMgaW50IHJyX3JlaW5zdGF0ZV9wYXRoKHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywgc3RydWN0IHBhdGggKnApCitzdGF0aWMgaW50IHJyX3JlaW5zdGF0ZV9wYXRoKHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywgc3RydWN0IGRtX3BhdGggKnApCiB7CiAJc3RydWN0IHNlbGVjdG9yICpzID0gKHN0cnVjdCBzZWxlY3RvciAqKSBwcy0+Y29udGV4dDsKIAlzdHJ1Y3QgcGF0aF9pbmZvICpwaSA9IHAtPnBzY29udGV4dDsKQEAgLTE1OSw3ICsxNTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhdGggKnJyX3NlbGVjdF9wYXRoKHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywKK3N0YXRpYyBzdHJ1Y3QgZG1fcGF0aCAqcnJfc2VsZWN0X3BhdGgoc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLAogCQkJCSAgIHVuc2lnbmVkICpyZXBlYXRfY291bnQpCiB7CiAJc3RydWN0IHNlbGVjdG9yICpzID0gKHN0cnVjdCBzZWxlY3RvciAqKSBwcy0+Y29udGV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKaW5kZXggNTI4MWUwMC4uMDgyMWEyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKQEAgLTM5LDggKzM5LDggQEAKICAqLwogI2RlZmluZSBTTkFQU0hPVF9QQUdFUyAyNTYKIAotc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmtzbmFwZDsKLXN0YXRpYyB2b2lkIGZsdXNoX3F1ZXVlZF9iaW9zKHZvaWQgKmRhdGEpOworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprc25hcGQ7CitzdGF0aWMgdm9pZCBmbHVzaF9xdWV1ZWRfYmlvcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdHJ1Y3QgcGVuZGluZ19leGNlcHRpb24gewogCXN0cnVjdCBleGNlcHRpb24gZTsKQEAgLTg4LDggKzg4LDggQEAKICAqIEhhc2ggdGFibGUgbWFwcGluZyBvcmlnaW4gdm9sdW1lcyB0byBsaXN0cyBvZiBzbmFwc2hvdHMgYW5kCiAgKiBhIGxvY2sgdG8gcHJvdGVjdCBpdAogICovCi1zdGF0aWMga21lbV9jYWNoZV90ICpleGNlcHRpb25fY2FjaGU7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpwZW5kaW5nX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleGNlcHRpb25fY2FjaGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnBlbmRpbmdfY2FjaGU7CiBzdGF0aWMgbWVtcG9vbF90ICpwZW5kaW5nX3Bvb2w7CiAKIC8qCkBAIC0yMjgsNyArMjI4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXhpdF9leGNlcHRpb25fdGFibGUoc3RydWN0IGV4Y2VwdGlvbl90YWJsZSAqZXQsIGttZW1fY2FjaGVfdCAqbWVtKQorc3RhdGljIHZvaWQgZXhpdF9leGNlcHRpb25fdGFibGUoc3RydWN0IGV4Y2VwdGlvbl90YWJsZSAqZXQsIHN0cnVjdCBrbWVtX2NhY2hlICptZW0pCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqc2xvdDsKIAlzdHJ1Y3QgZXhjZXB0aW9uICpleCwgKm5leHQ7CkBAIC01MjgsNyArNTI4LDcgQEAKIAl9CiAKIAliaW9fbGlzdF9pbml0KCZzLT5xdWV1ZWRfYmlvcyk7Ci0JSU5JVF9XT1JLKCZzLT5xdWV1ZWRfYmlvc193b3JrLCBmbHVzaF9xdWV1ZWRfYmlvcywgcyk7CisJSU5JVF9XT1JLKCZzLT5xdWV1ZWRfYmlvc193b3JrLCBmbHVzaF9xdWV1ZWRfYmlvcyk7CiAKIAkvKiBBZGQgc25hcHNob3QgdG8gdGhlIGxpc3Qgb2Ygc25hcHNob3RzIGZvciB0aGlzIG9yaWdpbiAqLwogCS8qIEV4Y2VwdGlvbnMgYXJlbid0IHRyaWdnZXJlZCB0aWxsIHNuYXBzaG90X3Jlc3VtZSgpIGlzIGNhbGxlZCAqLwpAQCAtNTY0LDYgKzU2NCwxNyBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgdm9pZCBfX2ZyZWVfZXhjZXB0aW9ucyhzdHJ1Y3QgZG1fc25hcHNob3QgKnMpCit7CisJa2NvcHlkX2NsaWVudF9kZXN0cm95KHMtPmtjb3B5ZF9jbGllbnQpOworCXMtPmtjb3B5ZF9jbGllbnQgPSBOVUxMOworCisJZXhpdF9leGNlcHRpb25fdGFibGUoJnMtPnBlbmRpbmcsIHBlbmRpbmdfY2FjaGUpOworCWV4aXRfZXhjZXB0aW9uX3RhYmxlKCZzLT5jb21wbGV0ZSwgZXhjZXB0aW9uX2NhY2hlKTsKKworCXMtPnN0b3JlLmRlc3Ryb3koJnMtPnN0b3JlKTsKK30KKwogc3RhdGljIHZvaWQgc25hcHNob3RfZHRyKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IChzdHJ1Y3QgZG1fc25hcHNob3QgKikgdGktPnByaXZhdGU7CkBAIC01NzQsMTMgKzU4NSw3IEBACiAJLyogQWZ0ZXIgdGhpcyByZXR1cm5zIHRoZXJlIGNhbiBiZSBubyBuZXcga2NvcHlkIGpvYnMuICovCiAJdW5yZWdpc3Rlcl9zbmFwc2hvdChzKTsKIAotCWtjb3B5ZF9jbGllbnRfZGVzdHJveShzLT5rY29weWRfY2xpZW50KTsKLQotCWV4aXRfZXhjZXB0aW9uX3RhYmxlKCZzLT5wZW5kaW5nLCBwZW5kaW5nX2NhY2hlKTsKLQlleGl0X2V4Y2VwdGlvbl90YWJsZSgmcy0+Y29tcGxldGUsIGV4Y2VwdGlvbl9jYWNoZSk7Ci0KLQkvKiBEZWFsbG9jYXRlIG1lbW9yeSB1c2VkICovCi0Jcy0+c3RvcmUuZGVzdHJveSgmcy0+c3RvcmUpOworCV9fZnJlZV9leGNlcHRpb25zKHMpOwogCiAJZG1fcHV0X2RldmljZSh0aSwgcy0+b3JpZ2luKTsKIAlkbV9wdXRfZGV2aWNlKHRpLCBzLT5jb3cpOwpAQCAtNjAzLDkgKzYwOCwxMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZmx1c2hfcXVldWVkX2Jpb3Modm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGZsdXNoX3F1ZXVlZF9iaW9zKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZG1fc25hcHNob3QgKnMgPSAoc3RydWN0IGRtX3NuYXBzaG90ICopIGRhdGE7CisJc3RydWN0IGRtX3NuYXBzaG90ICpzID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkbV9zbmFwc2hvdCwgcXVldWVkX2Jpb3Nfd29yayk7CiAJc3RydWN0IGJpbyAqcXVldWVkX2Jpb3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtODY3LDcgKzg3Myw3IEBACiB7CiAJc3RydWN0IGV4Y2VwdGlvbiAqZTsKIAlzdHJ1Y3QgZG1fc25hcHNob3QgKnMgPSAoc3RydWN0IGRtX3NuYXBzaG90ICopIHRpLT5wcml2YXRlOwotCWludCByID0gMTsKKwlpbnQgciA9IERNX01BUElPX1JFTUFQUEVEOwogCWNodW5rX3QgY2h1bms7CiAJc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICpwZSA9IE5VTEw7CiAKQEAgLTkxMyw3ICs5MTksNyBAQAogCQlyZW1hcF9leGNlcHRpb24ocywgJnBlLT5lLCBiaW8pOwogCQliaW9fbGlzdF9hZGQoJnBlLT5zbmFwc2hvdF9iaW9zLCBiaW8pOwogCi0JCXIgPSAwOworCQlyID0gRE1fTUFQSU9fU1VCTUlUVEVEOwogCiAJCWlmICghcGUtPnN0YXJ0ZWQpIHsKIAkJCS8qIHRoaXMgaXMgcHJvdGVjdGVkIGJ5IHNuYXAtPmxvY2sgKi8KQEAgLTk5MSw3ICs5OTcsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludCBfX29yaWdpbl93cml0ZShzdHJ1Y3QgbGlzdF9oZWFkICpzbmFwc2hvdHMsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlpbnQgciA9IDEsIGZpcnN0ID0gMDsKKwlpbnQgciA9IERNX01BUElPX1JFTUFQUEVELCBmaXJzdCA9IDA7CiAJc3RydWN0IGRtX3NuYXBzaG90ICpzbmFwOwogCXN0cnVjdCBleGNlcHRpb24gKmU7CiAJc3RydWN0IHBlbmRpbmdfZXhjZXB0aW9uICpwZSwgKm5leHRfcGUsICpwcmltYXJ5X3BlID0gTlVMTDsKQEAgLTEwNDksNyArMTA1NSw3IEBACiAKIAkJCWJpb19saXN0X2FkZCgmcHJpbWFyeV9wZS0+b3JpZ2luX2Jpb3MsIGJpbyk7CiAKLQkJCXIgPSAwOworCQkJciA9IERNX01BUElPX1NVQk1JVFRFRDsKIAkJfQogCiAJCWlmICghcGUtPnByaW1hcnlfcGUpIHsKQEAgLTEwOTgsNyArMTEwNCw3IEBACiBzdGF0aWMgaW50IGRvX29yaWdpbihzdHJ1Y3QgZG1fZGV2ICpvcmlnaW4sIHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3Qgb3JpZ2luICpvOwotCWludCByID0gMTsKKwlpbnQgciA9IERNX01BUElPX1JFTUFQUEVEOwogCiAJZG93bl9yZWFkKCZfb3JpZ2luc19sb2NrKTsKIAlvID0gX19sb29rdXBfb3JpZ2luKG9yaWdpbi0+YmRldik7CkBAIC0xMTU1LDcgKzExNjEsNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBPbmx5IHRlbGwgc25hcHNob3RzIGlmIHRoaXMgaXMgYSB3cml0ZSAqLwotCXJldHVybiAoYmlvX3J3KGJpbykgPT0gV1JJVEUpID8gZG9fb3JpZ2luKGRldiwgYmlvKSA6IDE7CisJcmV0dXJuIChiaW9fcncoYmlvKSA9PSBXUklURSkgPyBkb19vcmlnaW4oZGV2LCBiaW8pIDogRE1fTUFQSU9fUkVNQVBQRUQ7CiB9CiAKICNkZWZpbmUgbWluX25vdF96ZXJvKGwsIHIpIChsID09IDApID8gciA6ICgociA9PSAwKSA/IGwgOiBtaW4obCwgcikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXN0cmlwZS5jIGIvZHJpdmVycy9tZC9kbS1zdHJpcGUuYwppbmRleCA2YzI5ZmNlLi41MWY1ZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXN0cmlwZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogCWJpby0+YmlfYmRldiA9IHNjLT5zdHJpcGVbc3RyaXBlXS5kZXYtPmJkZXY7CiAJYmlvLT5iaV9zZWN0b3IgPSBzYy0+c3RyaXBlW3N0cmlwZV0ucGh5c2ljYWxfc3RhcnQgKwogCSAgICAoY2h1bmsgPDwgc2MtPmNodW5rX3NoaWZ0KSArIChvZmZzZXQgJiBzYy0+Y2h1bmtfbWFzayk7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogfQogCiBzdGF0aWMgaW50IHN0cmlwZV9zdGF0dXMoc3RydWN0IGRtX3RhcmdldCAqdGksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXplcm8uYyBiL2RyaXZlcnMvbWQvZG0temVyby5jCmluZGV4IGVhNTY5ZjcuLmYzMTRkN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0temVyby5jCisrKyBiL2RyaXZlcnMvbWQvZG0temVyby5jCkBAIC00Niw3ICs0Niw3IEBACiAJYmlvX2VuZGlvKGJpbywgYmlvLT5iaV9zaXplLCAwKTsKIAogCS8qIGFjY2VwdGVkIGJpbywgZG9uJ3QgbWFrZSBuZXcgcmVxdWVzdCAqLwotCXJldHVybiAwOworCXJldHVybiBETV9NQVBJT19TVUJNSVRURUQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgemVyb190YXJnZXQgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggYjU3NjRhOC4uZmU3YzU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtNjgsMTAgKzY4LDEyIEBACiAjZGVmaW5lIERNRl9GUk9aRU4gMgogI2RlZmluZSBETUZfRlJFRUlORyAzCiAjZGVmaW5lIERNRl9ERUxFVElORyA0CisjZGVmaW5lIERNRl9OT0ZMVVNIX1NVU1BFTkRJTkcgNQogCiBzdHJ1Y3QgbWFwcGVkX2RldmljZSB7CiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBpb19sb2NrOwogCXN0cnVjdCBzZW1hcGhvcmUgc3VzcGVuZF9sb2NrOworCXNwaW5sb2NrX3QgcHVzaGJhY2tfbG9jazsKIAlyd2xvY2tfdCBtYXBfbG9jazsKIAlhdG9taWNfdCBob2xkZXJzOwogCWF0b21pY190IG9wZW5fY291bnQ7CkBAIC04OSw3ICs5MSw4IEBACiAJICovCiAJYXRvbWljX3QgcGVuZGluZzsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotIAlzdHJ1Y3QgYmlvX2xpc3QgZGVmZXJyZWQ7CisJc3RydWN0IGJpb19saXN0IGRlZmVycmVkOworCXN0cnVjdCBiaW9fbGlzdCBwdXNoYmFjazsKIAogCS8qCiAJICogVGhlIGN1cnJlbnQgbWFwcGluZy4KQEAgLTEyMSw4ICsxMjQsOCBAQAogfTsKIAogI2RlZmluZSBNSU5fSU9TIDI1Ngotc3RhdGljIGttZW1fY2FjaGVfdCAqX2lvX2NhY2hlOwotc3RhdGljIGttZW1fY2FjaGVfdCAqX3Rpb19jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqX2lvX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfdGlvX2NhY2hlOwogCiBzdGF0aWMgaW50IF9faW5pdCBsb2NhbF9pbml0KHZvaWQpCiB7CkBAIC00NDQsMjMgKzQ0Nyw1MCBAQAogICogICB5b3UgdGhpcyBjbGVhcmx5IGRlbWFyY2F0ZWQgY3JhcC4KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorc3RhdGljIGludCBfX25vZmx1c2hfc3VzcGVuZGluZyhzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCit7CisJcmV0dXJuIHRlc3RfYml0KERNRl9OT0ZMVVNIX1NVU1BFTkRJTkcsICZtZC0+ZmxhZ3MpOworfQorCiAvKgogICogRGVjcmVtZW50cyB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGlvcyB0aGF0IGEgYmlvIGhhcyBiZWVuCiAgKiBjbG9uZWQgaW50bywgY29tcGxldGluZyB0aGUgb3JpZ2luYWwgaW8gaWYgbmVjYy4KICAqLwogc3RhdGljIHZvaWQgZGVjX3BlbmRpbmcoc3RydWN0IGRtX2lvICppbywgaW50IGVycm9yKQogewotCWlmIChlcnJvcikKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUHVzaC1iYWNrIHN1cGVyc2VkZXMgYW55IEkvTyBlcnJvcnMgKi8KKwlpZiAoZXJyb3IgJiYgIShpby0+ZXJyb3IgPiAwICYmIF9fbm9mbHVzaF9zdXNwZW5kaW5nKGlvLT5tZCkpKQogCQlpby0+ZXJyb3IgPSBlcnJvcjsKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpby0+aW9fY291bnQpKSB7CisJCWlmIChpby0+ZXJyb3IgPT0gRE1fRU5ESU9fUkVRVUVVRSkgeworCQkJLyoKKwkJCSAqIFRhcmdldCByZXF1ZXN0ZWQgcHVzaGluZyBiYWNrIHRoZSBJL08uCisJCQkgKiBUaGlzIG11c3QgYmUgaGFuZGxlZCBiZWZvcmUgdGhlIHNsZWVwZXIgb24KKwkJCSAqIHN1c3BlbmQgcXVldWUgbWVyZ2VzIHRoZSBwdXNoYmFjayBsaXN0LgorCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW8tPm1kLT5wdXNoYmFja19sb2NrLCBmbGFncyk7CisJCQlpZiAoX19ub2ZsdXNoX3N1c3BlbmRpbmcoaW8tPm1kKSkKKwkJCQliaW9fbGlzdF9hZGQoJmlvLT5tZC0+cHVzaGJhY2ssIGlvLT5iaW8pOworCQkJZWxzZQorCQkJCS8qIG5vZmx1c2ggc3VzcGVuZCB3YXMgaW50ZXJydXB0ZWQuICovCisJCQkJaW8tPmVycm9yID0gLUVJTzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvLT5tZC0+cHVzaGJhY2tfbG9jaywgZmxhZ3MpOworCQl9CisKIAkJaWYgKGVuZF9pb19hY2N0KGlvKSkKIAkJCS8qIG51ZGdlIGFueW9uZSB3YWl0aW5nIG9uIHN1c3BlbmQgcXVldWUgKi8KIAkJCXdha2VfdXAoJmlvLT5tZC0+d2FpdCk7CiAKLQkJYmxrX2FkZF90cmFjZV9iaW8oaW8tPm1kLT5xdWV1ZSwgaW8tPmJpbywgQkxLX1RBX0NPTVBMRVRFKTsKKwkJaWYgKGlvLT5lcnJvciAhPSBETV9FTkRJT19SRVFVRVVFKSB7CisJCQlibGtfYWRkX3RyYWNlX2Jpbyhpby0+bWQtPnF1ZXVlLCBpby0+YmlvLAorCQkJCQkgIEJMS19UQV9DT01QTEVURSk7CiAKLQkJYmlvX2VuZGlvKGlvLT5iaW8sIGlvLT5iaW8tPmJpX3NpemUsIGlvLT5lcnJvcik7CisJCQliaW9fZW5kaW8oaW8tPmJpbywgaW8tPmJpby0+Ymlfc2l6ZSwgaW8tPmVycm9yKTsKKwkJfQorCiAJCWZyZWVfaW8oaW8tPm1kLCBpbyk7CiAJfQogfQpAQCAtNDgwLDEyICs1MTAsMTkgQEAKIAogCWlmIChlbmRpbykgewogCQlyID0gZW5kaW8odGlvLT50aSwgYmlvLCBlcnJvciwgJnRpby0+aW5mbyk7Ci0JCWlmIChyIDwgMCkKKwkJaWYgKHIgPCAwIHx8IHIgPT0gRE1fRU5ESU9fUkVRVUVVRSkKKwkJCS8qCisJCQkgKiBlcnJvciBhbmQgcmVxdWV1ZSByZXF1ZXN0IGFyZSBoYW5kbGVkCisJCQkgKiBpbiBkZWNfcGVuZGluZygpLgorCQkJICovCiAJCQllcnJvciA9IHI7Ci0KLQkJZWxzZSBpZiAociA+IDApCi0JCQkvKiB0aGUgdGFyZ2V0IHdhbnRzIGFub3RoZXIgc2hvdCBhdCB0aGUgaW8gKi8KKwkJZWxzZSBpZiAociA9PSBETV9FTkRJT19JTkNPTVBMRVRFKQorCQkJLyogVGhlIHRhcmdldCB3aWxsIGhhbmRsZSB0aGUgaW8gKi8KIAkJCXJldHVybiAxOworCQllbHNlIGlmIChyKSB7CisJCQlETVdBUk4oInVuaW1wbGVtZW50ZWQgdGFyZ2V0IGVuZGlvIHJldHVybiB2YWx1ZTogJWQiLCByKTsKKwkJCUJVRygpOworCQl9CiAJfQogCiAJZGVjX3BlbmRpbmcodGlvLT5pbywgZXJyb3IpOwpAQCAtNTQzLDcgKzU4MCw3IEBACiAJYXRvbWljX2luYygmdGlvLT5pby0+aW9fY291bnQpOwogCXNlY3RvciA9IGNsb25lLT5iaV9zZWN0b3I7CiAJciA9IHRpLT50eXBlLT5tYXAodGksIGNsb25lLCAmdGlvLT5pbmZvKTsKLQlpZiAociA+IDApIHsKKwlpZiAociA9PSBETV9NQVBJT19SRU1BUFBFRCkgewogCQkvKiB0aGUgYmlvIGhhcyBiZWVuIHJlbWFwcGVkIHNvIGRpc3BhdGNoIGl0ICovCiAKIAkJYmxrX2FkZF90cmFjZV9yZW1hcChiZGV2X2dldF9xdWV1ZShjbG9uZS0+YmlfYmRldiksIGNsb25lLApAQCAtNTUxLDEwICs1ODgsOCBAQAogCQkJCSAgICBjbG9uZS0+Ymlfc2VjdG9yKTsKIAogCQlnZW5lcmljX21ha2VfcmVxdWVzdChjbG9uZSk7Ci0JfQotCi0JZWxzZSBpZiAociA8IDApIHsKLQkJLyogZXJyb3IgdGhlIGlvIGFuZCBiYWlsIG91dCAqLworCX0gZWxzZSBpZiAociA8IDAgfHwgciA9PSBETV9NQVBJT19SRVFVRVVFKSB7CisJCS8qIGVycm9yIHRoZSBpbyBhbmQgYmFpbCBvdXQsIG9yIHJlcXVldWUgaXQgaWYgbmVlZGVkICovCiAJCW1kID0gdGlvLT5pby0+bWQ7CiAJCWRlY19wZW5kaW5nKHRpby0+aW8sIHIpOwogCQkvKgpAQCAtNTYzLDYgKzU5OCw5IEBACiAJCWNsb25lLT5iaV9wcml2YXRlID0gbWQtPmJzOwogCQliaW9fcHV0KGNsb25lKTsKIAkJZnJlZV90aW8obWQsIHRpbyk7CisJfSBlbHNlIGlmIChyKSB7CisJCURNV0FSTigidW5pbXBsZW1lbnRlZCB0YXJnZXQgbWFwIHJldHVybiB2YWx1ZTogJWQiLCByKTsKKwkJQlVHKCk7CiAJfQogfQogCkBAIC05NDgsNiArOTg2LDcgQEAKIAltZW1zZXQobWQsIDAsIHNpemVvZigqbWQpKTsKIAlpbml0X3J3c2VtKCZtZC0+aW9fbG9jayk7CiAJaW5pdF9NVVRFWCgmbWQtPnN1c3BlbmRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1kLT5wdXNoYmFja19sb2NrKTsKIAlyd2xvY2tfaW5pdCgmbWQtPm1hcF9sb2NrKTsKIAlhdG9taWNfc2V0KCZtZC0+aG9sZGVycywgMSk7CiAJYXRvbWljX3NldCgmbWQtPm9wZW5fY291bnQsIDApOwpAQCAtOTY2LDggKzEwMDUsOCBAQAogCW1kLT5xdWV1ZS0+aXNzdWVfZmx1c2hfZm4gPSBkbV9mbHVzaF9hbGw7CiAKIAltZC0+aW9fcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChNSU5fSU9TLCBfaW9fY2FjaGUpOwotIAlpZiAoIW1kLT5pb19wb29sKQotIAkJZ290byBiYWQyOworCWlmICghbWQtPmlvX3Bvb2wpCisJCWdvdG8gYmFkMjsKIAogCW1kLT50aW9fcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChNSU5fSU9TLCBfdGlvX2NhY2hlKTsKIAlpZiAoIW1kLT50aW9fcG9vbCkKQEAgLTEyNzUsMjAgKzEzMTQsMzAgQEAKICAqIGRtX2JpbmRfdGFibGUsIGRtX3N1c3BlbmQgbXVzdCBiZSBjYWxsZWQgdG8gZmx1c2ggYW55IGluCiAgKiBmbGlnaHQgYmlvcyBhbmQgZW5zdXJlIHRoYXQgYW55IGZ1cnRoZXIgaW8gZ2V0cyBkZWZlcnJlZC4KICAqLwotaW50IGRtX3N1c3BlbmQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBpbnQgZG9fbG9ja2ZzKQoraW50IGRtX3N1c3BlbmQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCB1bnNpZ25lZCBzdXNwZW5kX2ZsYWdzKQogewogCXN0cnVjdCBkbV90YWJsZSAqbWFwID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXN0cnVjdCBiaW8gKmRlZjsKIAlpbnQgciA9IC1FSU5WQUw7CisJaW50IGRvX2xvY2tmcyA9IHN1c3BlbmRfZmxhZ3MgJiBETV9TVVNQRU5EX0xPQ0tGU19GTEFHID8gMSA6IDA7CisJaW50IG5vZmx1c2ggPSBzdXNwZW5kX2ZsYWdzICYgRE1fU1VTUEVORF9OT0ZMVVNIX0ZMQUcgPyAxIDogMDsKIAogCWRvd24oJm1kLT5zdXNwZW5kX2xvY2spOwogCiAJaWYgKGRtX3N1c3BlbmRlZChtZCkpCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF91bmxvY2s7CiAKIAltYXAgPSBkbV9nZXRfdGFibGUobWQpOwogCisJLyoKKwkgKiBETUZfTk9GTFVTSF9TVVNQRU5ESU5HIG11c3QgYmUgc2V0IGJlZm9yZSBwcmVzdXNwZW5kLgorCSAqIFRoaXMgZmxhZyBpcyBjbGVhcmVkIGJlZm9yZSBkbV9zdXNwZW5kIHJldHVybnMuCisJICovCisJaWYgKG5vZmx1c2gpCisJCXNldF9iaXQoRE1GX05PRkxVU0hfU1VTUEVORElORywgJm1kLT5mbGFncyk7CisKIAkvKiBUaGlzIGRvZXMgbm90IGdldCByZXZlcnRlZCBpZiB0aGVyZSdzIGFuIGVycm9yIGxhdGVyLiAqLwogCWRtX3RhYmxlX3ByZXN1c3BlbmRfdGFyZ2V0cyhtYXApOwogCkBAIC0xMjk2LDExICsxMzQ1LDE0IEBACiAJaWYgKCFtZC0+c3VzcGVuZGVkX2JkZXYpIHsKIAkJRE1XQVJOKCJiZGdldCBmYWlsZWQgaW4gZG1fc3VzcGVuZCIpOwogCQlyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZmx1c2hfYW5kX291dDsKIAl9CiAKLQkvKiBGbHVzaCBJL08gdG8gdGhlIGRldmljZS4gKi8KLQlpZiAoZG9fbG9ja2ZzKSB7CisJLyoKKwkgKiBGbHVzaCBJL08gdG8gdGhlIGRldmljZS4KKwkgKiBub2ZsdXNoIHN1cGVyc2VkZXMgZG9fbG9ja2ZzLCBiZWNhdXNlIGxvY2tfZnMoKSBuZWVkcyB0byBmbHVzaCBJL09zLgorCSAqLworCWlmIChkb19sb2NrZnMgJiYgIW5vZmx1c2gpIHsKIAkJciA9IGxvY2tfZnMobWQpOwogCQlpZiAocikKIAkJCWdvdG8gb3V0OwpAQCAtMTMzNiw2ICsxMzg4LDE0IEBACiAJZG93bl93cml0ZSgmbWQtPmlvX2xvY2spOwogCXJlbW92ZV93YWl0X3F1ZXVlKCZtZC0+d2FpdCwgJndhaXQpOwogCisJaWYgKG5vZmx1c2gpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1kLT5wdXNoYmFja19sb2NrLCBmbGFncyk7CisJCWNsZWFyX2JpdChETUZfTk9GTFVTSF9TVVNQRU5ESU5HLCAmbWQtPmZsYWdzKTsKKwkJYmlvX2xpc3RfbWVyZ2VfaGVhZCgmbWQtPmRlZmVycmVkLCAmbWQtPnB1c2hiYWNrKTsKKwkJYmlvX2xpc3RfaW5pdCgmbWQtPnB1c2hiYWNrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWQtPnB1c2hiYWNrX2xvY2ssIGZsYWdzKTsKKwl9CisKIAkvKiB3ZXJlIHdlIGludGVycnVwdGVkID8gKi8KIAlyID0gLUVJTlRSOwogCWlmIChhdG9taWNfcmVhZCgmbWQtPnBlbmRpbmcpKSB7CkBAIC0xMzQ0LDcgKzE0MDQsNyBAQAogCQlfX2ZsdXNoX2RlZmVycmVkX2lvKG1kLCBkZWYpOwogCQl1cF93cml0ZSgmbWQtPmlvX2xvY2spOwogCQl1bmxvY2tfZnMobWQpOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXQ7IC8qIHB1c2hiYWNrIGxpc3QgaXMgYWxyZWFkeSBmbHVzaGVkLCBzbyBza2lwIGZsdXNoICovCiAJfQogCXVwX3dyaXRlKCZtZC0+aW9fbG9jayk7CiAKQEAgLTEzNTQsNiArMTQxNCwyNSBAQAogCiAJciA9IDA7CiAKK2ZsdXNoX2FuZF9vdXQ6CisJaWYgKHIgJiYgbm9mbHVzaCkgeworCQkvKgorCQkgKiBCZWNhdXNlIHRoZXJlIG1heSBiZSBhbHJlYWR5IEkvT3MgaW4gdGhlIHB1c2hiYWNrIGxpc3QsCisJCSAqIGZsdXNoIHRoZW0gYmVmb3JlIHJldHVybi4KKwkJICovCisJCWRvd25fd3JpdGUoJm1kLT5pb19sb2NrKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWQtPnB1c2hiYWNrX2xvY2ssIGZsYWdzKTsKKwkJY2xlYXJfYml0KERNRl9OT0ZMVVNIX1NVU1BFTkRJTkcsICZtZC0+ZmxhZ3MpOworCQliaW9fbGlzdF9tZXJnZV9oZWFkKCZtZC0+ZGVmZXJyZWQsICZtZC0+cHVzaGJhY2spOworCQliaW9fbGlzdF9pbml0KCZtZC0+cHVzaGJhY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZC0+cHVzaGJhY2tfbG9jaywgZmxhZ3MpOworCisJCWRlZiA9IGJpb19saXN0X2dldCgmbWQtPmRlZmVycmVkKTsKKwkJX19mbHVzaF9kZWZlcnJlZF9pbyhtZCwgZGVmKTsKKwkJdXBfd3JpdGUoJm1kLT5pb19sb2NrKTsKKwl9CisKIG91dDoKIAlpZiAociAmJiBtZC0+c3VzcGVuZGVkX2JkZXYpIHsKIAkJYmRwdXQobWQtPnN1c3BlbmRlZF9iZGV2KTsKQEAgLTEzNjEsNiArMTQ0MCw4IEBACiAJfQogCiAJZG1fdGFibGVfcHV0KG1hcCk7CisKK291dF91bmxvY2s6CiAJdXAoJm1kLT5zdXNwZW5kX2xvY2spOwogCXJldHVybiByOwogfQpAQCAtMTQzOCw2ICsxNTE5LDE3IEBACiAJcmV0dXJuIHRlc3RfYml0KERNRl9TVVNQRU5ERUQsICZtZC0+ZmxhZ3MpOwogfQogCitpbnQgZG1fbm9mbHVzaF9zdXNwZW5kaW5nKHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IGRtX3RhYmxlX2dldF9tZCh0aS0+dGFibGUpOworCWludCByID0gX19ub2ZsdXNoX3N1c3BlbmRpbmcobWQpOworCisJZG1fcHV0KG1kKTsKKworCXJldHVybiByOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fbm9mbHVzaF9zdXNwZW5kaW5nKTsKKwogc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBkbV9ibGtfZG9wcyA9IHsKIAkub3BlbiA9IGRtX2Jsa19vcGVuLAogCS5yZWxlYXNlID0gZG1fYmxrX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5oIGIvZHJpdmVycy9tZC9kbS5oCmluZGV4IGE0OGVjNWUuLjJmNzk2YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uaAorKysgYi9kcml2ZXJzL21kL2RtLmgKQEAgLTMzLDYgKzMzLDI1IEBACiAjZGVmaW5lIFNFQ1RPUl9TSElGVCA5CiAKIC8qCisgKiBEZWZpbml0aW9ucyBvZiByZXR1cm4gdmFsdWVzIGZyb20gdGFyZ2V0IGVuZF9pbyBmdW5jdGlvbi4KKyAqLworI2RlZmluZSBETV9FTkRJT19JTkNPTVBMRVRFCTEKKyNkZWZpbmUgRE1fRU5ESU9fUkVRVUVVRQkyCisKKy8qCisgKiBEZWZpbml0aW9ucyBvZiByZXR1cm4gdmFsdWVzIGZyb20gdGFyZ2V0IG1hcCBmdW5jdGlvbi4KKyAqLworI2RlZmluZSBETV9NQVBJT19TVUJNSVRURUQJMAorI2RlZmluZSBETV9NQVBJT19SRU1BUFBFRAkxCisjZGVmaW5lIERNX01BUElPX1JFUVVFVUUJRE1fRU5ESU9fUkVRVUVVRQorCisvKgorICogU3VzcGVuZCBmZWF0dXJlIGZsYWdzCisgKi8KKyNkZWZpbmUgRE1fU1VTUEVORF9MT0NLRlNfRkxBRwkJKDEgPDwgMCkKKyNkZWZpbmUgRE1fU1VTUEVORF9OT0ZMVVNIX0ZMQUcJCSgxIDw8IDEpCisKKy8qCiAgKiBMaXN0IG9mIGRldmljZXMgdGhhdCBhIG1ldGFkZXZpY2UgdXNlcyBhbmQgc2hvdWxkIG9wZW4vY2xvc2UuCiAgKi8KIHN0cnVjdCBkbV9kZXYgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9mYXVsdHkuYyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKaW5kZXggYTdhNWFiNS4uNGViZDBmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9mYXVsdHkuYworKysgYi9kcml2ZXJzL21kL2ZhdWx0eS5jCkBAIC0xNzMsNyArMTczLDcgQEAKIAljb25mX3QgKmNvbmYgPSAoY29uZl90KiltZGRldi0+cHJpdmF0ZTsKIAlpbnQgZmFpbGl0ID0gMDsKIAotCWlmIChiaW8tPmJpX3J3ICYgMSkgeworCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgewogCQkvKiB3cml0ZSByZXF1ZXN0ICovCiAJCWlmIChhdG9taWNfcmVhZCgmY29uZi0+Y291bnRlcnNbV3JpdGVBbGxdKSkgewogCQkJLyogc3BlY2lhbCBjYXNlIC0gZG9uJ3QgZGVjcmVtZW50LCBkb24ndCBnZW5lcmljX21ha2VfcmVxdWVzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQva2NvcHlkLmMgYi9kcml2ZXJzL21kL2tjb3B5ZC5jCmluZGV4IGYxZGI2ZWYuLmI0NmY2YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQva2NvcHlkLmMKKysrIGIvZHJpdmVycy9tZC9rY29weWQuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAvKiBGSVhNRTogdGhpcyBzaG91bGQgc2NhbGUgd2l0aCB0aGUgbnVtYmVyIG9mIHBhZ2VzICovCiAjZGVmaW5lIE1JTl9KT0JTIDUxMgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpfam9iX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfam9iX2NhY2hlOwogc3RhdGljIG1lbXBvb2xfdCAqX2pvYl9wb29sOwogCiAvKgpAQCAtNDE3LDcgKzQxNyw3IEBACiAvKgogICoga2NvcHlkIGRvZXMgdGhpcyBldmVyeSB0aW1lIGl0J3Mgd29rZW4gdXAuCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3dvcmsodm9pZCAqaWdub3JlZCkKK3N0YXRpYyB2b2lkIGRvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKQogewogCS8qCiAJICogVGhlIG9yZGVyIHRoYXQgdGhlc2UgYXJlIGNhbGxlZCBpcyAqdmVyeSogaW1wb3J0YW50LgpAQCAtNjI4LDcgKzYyOCw3IEBACiAJfQogCiAJa2NvcHlkX2NsaWVudHMrKzsKLQlJTklUX1dPUksoJl9rY29weWRfd29yaywgZG9fd29yaywgTlVMTCk7CisJSU5JVF9XT1JLKCZfa2NvcHlkX3dvcmssIGRvX3dvcmspOwogCW11dGV4X3VubG9jaygma2NvcHlkX2luaXRfbG9jayk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggNTdmYTY0Zi4uMjFlMmE3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5jCisrKyBiL2RyaXZlcnMvbWQvbWQuYwpAQCAtMzksMTAgKzM5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvcmFpZC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPiAvKiBmb3IgaW52YWxpZGF0ZV9iZGV2ICovCi0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCkBAIC05NzQsMTIgKzk3NCwxMyBAQAogICogdmVyc2lvbiAxIHN1cGVyYmxvY2sKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfc2JfMV9jc3VtKHN0cnVjdCBtZHBfc3VwZXJibG9ja18xICogc2IpCitzdGF0aWMgX19sZTMyIGNhbGNfc2JfMV9jc3VtKHN0cnVjdCBtZHBfc3VwZXJibG9ja18xICogc2IpCiB7Ci0JdW5zaWduZWQgaW50IGRpc2tfY3N1bSwgY3N1bTsKKwlfX2xlMzIgZGlza19jc3VtOworCXUzMiBjc3VtOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXdjc3VtOwogCWludCBzaXplID0gMjU2ICsgbGUzMl90b19jcHUoc2ItPm1heF9kZXYpKjI7Ci0JdW5zaWduZWQgaW50ICppc3VwZXIgPSAodW5zaWduZWQgaW50KilzYjsKKwlfX2xlMzIgKmlzdXBlciA9IChfX2xlMzIqKXNiOwogCWludCBpOwogCiAJZGlza19jc3VtID0gc2ItPnNiX2NzdW07CkBAIC05ODksNyArOTkwLDcgQEAKIAkJbmV3Y3N1bSArPSBsZTMyX3RvX2NwdSgqaXN1cGVyKyspOwogCiAJaWYgKHNpemUgPT0gMikKLQkJbmV3Y3N1bSArPSBsZTE2X3RvX2NwdSgqKHVuc2lnbmVkIHNob3J0KikgaXN1cGVyKTsKKwkJbmV3Y3N1bSArPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiopIGlzdXBlcik7CiAKIAljc3VtID0gKG5ld2NzdW0gJiAweGZmZmZmZmZmKSArIChuZXdjc3VtID4+IDMyKTsKIAlzYi0+c2JfY3N1bSA9IGRpc2tfY3N1bTsKQEAgLTExMDYsNyArMTEwNyw3IEBACiAJaWYgKGxlMzJfdG9fY3B1KHNiLT5jaHVua3NpemUpKQogCQlyZGV2LT5zaXplICY9IH4oKHNlY3Rvcl90KWxlMzJfdG9fY3B1KHNiLT5jaHVua3NpemUpLzIgLSAxKTsKIAotCWlmIChsZTMyX3RvX2NwdShzYi0+c2l6ZSkgPiByZGV2LT5zaXplKjIpCisJaWYgKGxlNjRfdG9fY3B1KHNiLT5zaXplKSA+IHJkZXYtPnNpemUqMikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEyMjgsNyArMTIyOSw3IEBACiAJZWxzZQogCQlzYi0+cmVzeW5jX29mZnNldCA9IGNwdV90b19sZTY0KDApOwogCi0Jc2ItPmNudF9jb3JyZWN0ZWRfcmVhZCA9IGF0b21pY19yZWFkKCZyZGV2LT5jb3JyZWN0ZWRfZXJyb3JzKTsKKwlzYi0+Y250X2NvcnJlY3RlZF9yZWFkID0gY3B1X3RvX2xlMzIoYXRvbWljX3JlYWQoJnJkZXYtPmNvcnJlY3RlZF9lcnJvcnMpKTsKIAogCXNiLT5yYWlkX2Rpc2tzID0gY3B1X3RvX2xlMzIobWRkZXYtPnJhaWRfZGlza3MpOwogCXNiLT5zaXplID0gY3B1X3RvX2xlNjQobWRkZXYtPnNpemU8PDEpOwpAQCAtMTQxMiw3ICsxNDEzLDcgQEAKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotCWJkZXYgPSBvcGVuX3BhcnRpdGlvbl9ieV9kZXZudW0oZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwliZGV2ID0gb3Blbl9ieV9kZXZudW0oZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKIAlpZiAoSVNfRVJSKGJkZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibWQ6IGNvdWxkIG5vdCBvcGVuICVzLlxuIiwKIAkJCV9fYmRldm5hbWUoZGV2LCBiKSk7CkBAIC0xNDIyLDcgKzE0MjMsNyBAQAogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtZDogY291bGQgbm90IGJkX2NsYWltICVzLlxuIiwKIAkJCWJkZXZuYW1lKGJkZXYsIGIpKTsKLQkJYmxrZGV2X3B1dF9wYXJ0aXRpb24oYmRldik7CisJCWJsa2Rldl9wdXQoYmRldik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJkZXYtPmJkZXYgPSBiZGV2OwpAQCAtMTQzNiw3ICsxNDM3LDcgQEAKIAlpZiAoIWJkZXYpCiAJCU1EX0JVRygpOwogCWJkX3JlbGVhc2UoYmRldik7Ci0JYmxrZGV2X3B1dF9wYXJ0aXRpb24oYmRldik7CisJYmxrZGV2X3B1dChiZGV2KTsKIH0KIAogdm9pZCBtZF9hdXRvZGV0ZWN0X2RldihkZXZfdCBkZXYpOwpAQCAtMjAwMiw2ICsyMDAzLDcgQEAKIAlrb2JqZWN0X2luaXQoJnJkZXYtPmtvYmopOwogCiAJcmRldi0+ZGVzY19uciA9IC0xOworCXJkZXYtPnNhdmVkX3JhaWRfZGlzayA9IC0xOwogCXJkZXYtPmZsYWdzID0gMDsKIAlyZGV2LT5kYXRhX29mZnNldCA9IDA7CiAJcmRldi0+c2JfZXZlbnRzID0gMDsKQEAgLTMxOTgsNiArMzIwMCw3IEBACiAKIAltZGRldi0+Y2hhbmdlZCA9IDE7CiAJbWRfbmV3X2V2ZW50KG1kZGV2KTsKKwlrb2JqZWN0X3VldmVudCgmbWRkZXYtPmdlbmRpc2stPmtvYmosIEtPQkpfQ0hBTkdFKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzMxMSw2ICszMzE0LDEwIEBACiAKIAkJCW1vZHVsZV9wdXQobWRkZXYtPnBlcnMtPm93bmVyKTsKIAkJCW1kZGV2LT5wZXJzID0gTlVMTDsKKworCQkJc2V0X2NhcGFjaXR5KGRpc2ssIDApOworCQkJbWRkZXYtPmNoYW5nZWQgPSAxOworCiAJCQlpZiAobWRkZXYtPnJvKQogCQkJCW1kZGV2LT5ybyA9IDA7CiAJCX0KQEAgLTMzMzAsNyArMzMzNyw3IEBACiAJaWYgKG1vZGUgPT0gMCkgewogCQltZGtfcmRldl90ICpyZGV2OwogCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0JCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCiAJCXByaW50ayhLRVJOX0lORk8gIm1kOiAlcyBzdG9wcGVkLlxuIiwgbWRuYW1lKG1kZGV2KSk7CiAKIAkJYml0bWFwX2Rlc3Ryb3kobWRkZXYpOwpAQCAtMzM1NSwxMCArMzM2Miw2IEBACiAJCW1kZGV2LT5yYWlkX2Rpc2tzID0gMDsKIAkJbWRkZXYtPnJlY292ZXJ5X2NwID0gMDsKIAotCQlkaXNrID0gbWRkZXYtPmdlbmRpc2s7Ci0JCWlmIChkaXNrKQotCQkJc2V0X2NhcGFjaXR5KGRpc2ssIDApOwotCQltZGRldi0+Y2hhbmdlZCA9IDE7CiAJfSBlbHNlIGlmIChtZGRldi0+cGVycykKIAkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICVzIHN3aXRjaGVkIHRvIHJlYWQtb25seSBtb2RlLlxuIiwKIAkJCW1kbmFtZShtZGRldikpOwpAQCAtMzM2OCw2ICszMzcxLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCisjaWZuZGVmIE1PRFVMRQogc3RhdGljIHZvaWQgYXV0b3J1bl9hcnJheShtZGRldl90ICptZGRldikKIHsKIAltZGtfcmRldl90ICpyZGV2OwpAQCAtMzQ4Miw2ICszNDg2LDcgQEAKIAl9CiAJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IC4uLiBhdXRvcnVuIERPTkUuXG4iKTsKIH0KKyNlbmRpZiAvKiAhTU9EVUxFICovCiAKIHN0YXRpYyBpbnQgZ2V0X3ZlcnNpb24odm9pZCBfX3VzZXIgKiBhcmcpCiB7CkBAIC0zNzE5LDYgKzM3MjQsNyBAQAogCQlpZiAoZXJyKQogCQkJZXhwb3J0X3JkZXYocmRldik7CiAKKwkJbWRfdXBkYXRlX3NiKG1kZGV2LCAxKTsKIAkJc2V0X2JpdChNRF9SRUNPVkVSWV9ORUVERUQsICZtZGRldi0+cmVjb3ZlcnkpOwogCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCQlyZXR1cm4gZXJyOwpAQCAtNDA0MywxMSArNDA0OSw4IEBACiAJCXJldHVybiAtRUJVU1k7CiAJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYsdG1wKSB7CiAJCXNlY3Rvcl90IGF2YWlsOwotCQlpZiAocmRldi0+c2Jfb2Zmc2V0ID4gcmRldi0+ZGF0YV9vZmZzZXQpCi0JCQlhdmFpbCA9IChyZGV2LT5zYl9vZmZzZXQqMikgLSByZGV2LT5kYXRhX29mZnNldDsKLQkJZWxzZQotCQkJYXZhaWwgPSBnZXRfY2FwYWNpdHkocmRldi0+YmRldi0+YmRfZGlzaykKLQkJCQktIHJkZXYtPmRhdGFfb2Zmc2V0OworCQlhdmFpbCA9IHJkZXYtPnNpemUgKiAyOworCiAJCWlmIChmaXQgJiYgKHNpemUgPT0gMCB8fCBzaXplID4gYXZhaWwvMikpCiAJCQlzaXplID0gYXZhaWwvMjsKIAkJaWYgKGF2YWlsIDwgKChzZWN0b3JfdClzaXplIDw8IDEpKQpAQCAtNDQyMyw3ICs0NDI2LDcgQEAKIAltZGRldl90ICptZGRldiA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKIAlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBtZGRldl9sb2NrKG1kZGV2KSkpCisJaWYgKChlcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGVfbmVzdGVkKCZtZGRldi0+cmVjb25maWdfbXV0ZXgsIDEpKSkKIAkJZ290byBvdXQ7CiAKIAllcnIgPSAwOwpAQCAtNDQ4Niw2ICs0NDg5LDcgQEAKIAkgKiBtYW55IGRpcnR5IFJBSUQ1IGJsb2Nrcy4KIAkgKi8KIAorCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCkBAIC00NTAyLDcgKzQ1MDYsNiBAQAogCQkJIHRlc3RfYml0KFRIUkVBRF9XQUtFVVAsICZ0aHJlYWQtPmZsYWdzKQogCQkJIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSwKIAkJCSB0aHJlYWQtPnRpbWVvdXQpOwotCQl0cnlfdG9fZnJlZXplKCk7CiAKIAkJY2xlYXJfYml0KFRIUkVBRF9XQUtFVVAsICZ0aHJlYWQtPmZsYWdzKTsKIApAQCAtNDg0Niw4ICs0ODQ5LDggQEAKIAkJCQljaHVua19rYiA/ICJLQiIgOiAiQiIpOwogCQkJaWYgKGJpdG1hcC0+ZmlsZSkgewogCQkJCXNlcV9wcmludGYoc2VxLCAiLCBmaWxlOiAiKTsKLQkJCQlzZXFfcGF0aChzZXEsIGJpdG1hcC0+ZmlsZS0+Zl92ZnNtbnQsCi0JCQkJCSBiaXRtYXAtPmZpbGUtPmZfZGVudHJ5LCIgXHRcbiIpOworCQkJCXNlcV9wYXRoKHNlcSwgYml0bWFwLT5maWxlLT5mX3BhdGgubW50LAorCQkJCQkgYml0bWFwLT5maWxlLT5mX3BhdGguZGVudHJ5LCIgXHRcbiIpOwogCQkJfQogCiAJCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CkBAIC00OTEyLDYgKzQ5MTUsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZF9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gbWRfc2VxX29wZW4sCiAJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLApAQCAtNTI3Miw3ICs1Mjc2LDYgQEAKIAltZGRldi0+cGVycy0+c3luY19yZXF1ZXN0KG1kZGV2LCBtYXhfc2VjdG9ycywgJnNraXBwZWQsIDEpOwogCiAJaWYgKCF0ZXN0X2JpdChNRF9SRUNPVkVSWV9FUlIsICZtZGRldi0+cmVjb3ZlcnkpICYmCi0JICAgIHRlc3RfYml0KE1EX1JFQ09WRVJZX1NZTkMsICZtZGRldi0+cmVjb3ZlcnkpICYmCiAJICAgICF0ZXN0X2JpdChNRF9SRUNPVkVSWV9DSEVDSywgJm1kZGV2LT5yZWNvdmVyeSkgJiYKIAkgICAgbWRkZXYtPmN1cnJfcmVzeW5jID4gMikgewogCQlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfU1lOQywgJm1kZGV2LT5yZWNvdmVyeSkpIHsKQEAgLTUyOTYsNiArNTI5OSw3IEBACiAJCQkJCXJkZXYtPnJlY292ZXJ5X29mZnNldCA9IG1kZGV2LT5jdXJyX3Jlc3luYzsKIAkJfQogCX0KKwlzZXRfYml0KE1EX0NIQU5HRV9ERVZTLCAmbWRkZXYtPmZsYWdzKTsKIAogIHNraXA6CiAJbWRkZXYtPmN1cnJfcmVzeW5jID0gMDsKQEAgLTU1OTIsNyArNTU5Niw3IEBACiAJYXV0b3J1bl9kZXZpY2VzKHBhcnQpOwogfQogCi0jZW5kaWYKKyNlbmRpZiAvKiAhTU9EVUxFICovCiAKIHN0YXRpYyBfX2V4aXQgdm9pZCBtZF9leGl0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL211bHRpcGF0aC5jIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwppbmRleCAxNzFmZjQxLi4xNGRhMzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL211bHRpcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKQEAgLTI3Nyw2ICsyNzcsNyBAQAogCQkJc2V0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncyk7CiAJCQlzZXRfYml0KE1EX0NIQU5HRV9ERVZTLCAmbWRkZXYtPmZsYWdzKTsKIAkJCWNvbmYtPndvcmtpbmdfZGlza3MtLTsKKwkJCW1kZGV2LT5kZWdyYWRlZCsrOwogCQkJcHJpbnRrKEtFUk5fQUxFUlQgIm11bHRpcGF0aDogSU8gZmFpbHVyZSBvbiAlcywiCiAJCQkJIiBkaXNhYmxpbmcgSU8gcGF0aC4gXG4JT3BlcmF0aW9uIGNvbnRpbnVpbmciCiAJCQkJIiBvbiAlZCBJTyBwYXRocy5cbiIsCkBAIC0zMzYsNiArMzM3LDcgQEAKIAkJCQlibGtfcXVldWVfbWF4X3NlY3RvcnMobWRkZXYtPnF1ZXVlLCBQQUdFX1NJWkU+PjkpOwogCiAJCQljb25mLT53b3JraW5nX2Rpc2tzKys7CisJCQltZGRldi0+ZGVncmFkZWQtLTsKIAkJCXJkZXYtPnJhaWRfZGlzayA9IHBhdGg7CiAJCQlzZXRfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncyk7CiAJCQlyY3VfYXNzaWduX3BvaW50ZXIocC0+cmRldiwgcmRldik7CkBAIC01MDEsNyArNTAzLDcgQEAKIAkJCW1kbmFtZShtZGRldikpOwogCQlnb3RvIG91dF9mcmVlX2NvbmY7CiAJfQotCW1kZGV2LT5kZWdyYWRlZCA9IGNvbmYtPnJhaWRfZGlza3MgPSBjb25mLT53b3JraW5nX2Rpc2tzOworCW1kZGV2LT5kZWdyYWRlZCA9IGNvbmYtPnJhaWRfZGlza3MgLSBjb25mLT53b3JraW5nX2Rpc2tzOwogCiAJY29uZi0+cG9vbCA9IG1lbXBvb2xfY3JlYXRlX2t6YWxsb2NfcG9vbChOUl9SRVNFUlZFRF9CVUZTLAogCQkJCQkJIHNpemVvZihzdHJ1Y3QgbXVsdGlwYXRoX2JoKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggZGM5ZDJkZS4uYjMwZjc0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMTQ3NCw4ICsxNDc0LDggQEAKIAkJCQkJICAgICAgICJyYWlkMTolczogcmVhZCBlcnJvciBjb3JyZWN0ZWQgIgogCQkJCQkgICAgICAgIiglZCBzZWN0b3JzIGF0ICVsbHUgb24gJXMpXG4iLAogCQkJCQkgICAgICAgbWRuYW1lKG1kZGV2KSwgcywKLQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdCArCi0JCQkJCSAgICAgICAgICAgcmRldi0+ZGF0YV9vZmZzZXQsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShzZWN0ICsKKwkJCQkJICAgICAgICAgICByZGV2LT5kYXRhX29mZnNldCksCiAJCQkJCSAgICAgICBiZGV2bmFtZShyZGV2LT5iZGV2LCBiKSk7CiAJCQkJfQogCQkJfQpAQCAtMTczNiw3ICsxNzM2LDcgQEAKIAkJLyogdGFrZSBmcm9tIGJpb19pbml0ICovCiAJCWJpby0+YmlfbmV4dCA9IE5VTEw7CiAJCWJpby0+YmlfZmxhZ3MgfD0gMSA8PCBCSU9fVVBUT0RBVEU7Ci0JCWJpby0+YmlfcncgPSAwOworCQliaW8tPmJpX3J3ID0gUkVBRDsKIAkJYmlvLT5iaV92Y250ID0gMDsKIAkJYmlvLT5iaV9pZHggPSAwOwogCQliaW8tPmJpX3BoeXNfc2VnbWVudHMgPSAwOwpAQCAtMTk1MSw2ICsxOTUxLDcgQEAKIAkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmZGlzay0+cmRldi0+ZmxhZ3MpKSB7CiAJCQlkaXNrLT5oZWFkX3Bvc2l0aW9uID0gMDsKIAkJCW1kZGV2LT5kZWdyYWRlZCsrOworCQkJY29uZi0+ZnVsbHN5bmMgPSAxOwogCQl9CiAJfQogCWlmIChtZGRldi0+ZGVncmFkZWQgPT0gY29uZi0+cmFpZF9kaXNrcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggMTI1MGYwZS4uZjAxNDE5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMTAuYworKysgYi9kcml2ZXJzL21kL3JhaWQxMC5jCkBAIC0xNDcwLDggKzE0NzAsOCBAQAogCQkJCQkgICAgICAgInJhaWQxMDolczogcmVhZCBlcnJvciBjb3JyZWN0ZWQiCiAJCQkJCSAgICAgICAiICglZCBzZWN0b3JzIGF0ICVsbHUgb24gJXMpXG4iLAogCQkJCQkgICAgICAgbWRuYW1lKG1kZGV2KSwgcywKLQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdCsKLQkJCQkJICAgICAgICAgICAgcmRldi0+ZGF0YV9vZmZzZXQsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShzZWN0KworCQkJCQkgICAgICAgICAgICByZGV2LT5kYXRhX29mZnNldCksCiAJCQkJCSAgICAgICBiZGV2bmFtZShyZGV2LT5iZGV2LCBiKSk7CiAKIAkJCQlyZGV2X2RlY19wZW5kaW5nKHJkZXYsIG1kZGV2KTsKQEAgLTE3ODUsNyArMTc4NSw3IEBACiAJCQkJCQliaW9saXN0ID0gYmlvOwogCQkJCQkJYmlvLT5iaV9wcml2YXRlID0gcjEwX2JpbzsKIAkJCQkJCWJpby0+YmlfZW5kX2lvID0gZW5kX3N5bmNfcmVhZDsKLQkJCQkJCWJpby0+YmlfcncgPSAwOworCQkJCQkJYmlvLT5iaV9ydyA9IFJFQUQ7CiAJCQkJCQliaW8tPmJpX3NlY3RvciA9IHIxMF9iaW8tPmRldnNbal0uYWRkciArCiAJCQkJCQkJY29uZi0+bWlycm9yc1tkXS5yZGV2LT5kYXRhX29mZnNldDsKIAkJCQkJCWJpby0+YmlfYmRldiA9IGNvbmYtPm1pcnJvcnNbZF0ucmRldi0+YmRldjsKQEAgLTE4MDEsNyArMTgwMSw3IEBACiAJCQkJCQliaW9saXN0ID0gYmlvOwogCQkJCQkJYmlvLT5iaV9wcml2YXRlID0gcjEwX2JpbzsKIAkJCQkJCWJpby0+YmlfZW5kX2lvID0gZW5kX3N5bmNfd3JpdGU7Ci0JCQkJCQliaW8tPmJpX3J3ID0gMTsKKwkJCQkJCWJpby0+YmlfcncgPSBXUklURTsKIAkJCQkJCWJpby0+Ymlfc2VjdG9yID0gcjEwX2Jpby0+ZGV2c1trXS5hZGRyICsKIAkJCQkJCQljb25mLT5taXJyb3JzW2ldLnJkZXYtPmRhdGFfb2Zmc2V0OwogCQkJCQkJYmlvLT5iaV9iZGV2ID0gY29uZi0+bWlycm9yc1tpXS5yZGV2LT5iZGV2OwpAQCAtMTg3MCw3ICsxODcwLDcgQEAKIAkJCWJpb2xpc3QgPSBiaW87CiAJCQliaW8tPmJpX3ByaXZhdGUgPSByMTBfYmlvOwogCQkJYmlvLT5iaV9lbmRfaW8gPSBlbmRfc3luY19yZWFkOwotCQkJYmlvLT5iaV9ydyA9IDA7CisJCQliaW8tPmJpX3J3ID0gUkVBRDsKIAkJCWJpby0+Ymlfc2VjdG9yID0gcjEwX2Jpby0+ZGV2c1tpXS5hZGRyICsKIAkJCQljb25mLT5taXJyb3JzW2RdLnJkZXYtPmRhdGFfb2Zmc2V0OwogCQkJYmlvLT5iaV9iZGV2ID0gY29uZi0+bWlycm9yc1tkXS5yZGV2LT5iZGV2OwpAQCAtMjA3OSw3ICsyMDc5LDcgQEAKIAkJZGlzayA9IGNvbmYtPm1pcnJvcnMgKyBpOwogCiAJCWlmICghZGlzay0+cmRldiB8fAotCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKKwkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmZGlzay0+cmRldi0+ZmxhZ3MpKSB7CiAJCQlkaXNrLT5oZWFkX3Bvc2l0aW9uID0gMDsKIAkJCW1kZGV2LT5kZWdyYWRlZCsrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggZTE0ZjQ1Ny4uYmUwMDhmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtMTM0LDYgKzEzNCw4IEBACiAJCQlpZiAoIXRlc3RfYml0KFNUUklQRV9FWFBBTkRJTkcsICZzaC0+c3RhdGUpKSB7CiAJCQkJbGlzdF9hZGRfdGFpbCgmc2gtPmxydSwgJmNvbmYtPmluYWN0aXZlX2xpc3QpOwogCQkJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX3N0cmlwZSk7CisJCQkJaWYgKGNvbmYtPnJldHJ5X3JlYWRfYWxpZ25lZCkKKwkJCQkJbWRfd2FrZXVwX3RocmVhZChjb25mLT5tZGRldi0+dGhyZWFkKTsKIAkJCX0KIAkJfQogCX0KQEAgLTM0OCw3ICszNTAsNyBAQAogCiBzdGF0aWMgaW50IGdyb3dfc3RyaXBlcyhyYWlkNV9jb25mX3QgKmNvbmYsIGludCBudW0pCiB7Ci0Ja21lbV9jYWNoZV90ICpzYzsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqc2M7CiAJaW50IGRldnMgPSBjb25mLT5yYWlkX2Rpc2tzOwogCiAJc3ByaW50Zihjb25mLT5jYWNoZV9uYW1lWzBdLCAicmFpZDUvJXMiLCBtZG5hbWUoY29uZi0+bWRkZXYpKTsKQEAgLTM5Nyw3ICszOTksNyBAQAogCUxJU1RfSEVBRChuZXdzdHJpcGVzKTsKIAlzdHJ1Y3QgZGlza19pbmZvICpuZGlza3M7CiAJaW50IGVyciA9IDA7Ci0Ja21lbV9jYWNoZV90ICpzYzsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqc2M7CiAJaW50IGk7CiAKIAlpZiAobmV3c2l6ZSA8PSBjb25mLT5wb29sX3NpemUpCkBAIC01NDIsMzUgKzU0NCw3IEBACiAJfQogCiAJaWYgKHVwdG9kYXRlKSB7Ci0jaWYgMAotCQlzdHJ1Y3QgYmlvICpiaW87Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwotCQkvKiB3ZSBjYW4gcmV0dXJuIGEgYnVmZmVyIGlmIHdlIGJ5cGFzc2VkIHRoZSBjYWNoZSBvcgotCQkgKiBpZiB0aGUgdG9wIGJ1ZmZlciBpcyBub3QgaW4gaGlnaG1lbS4gIElmIHRoZXJlIGFyZQotCQkgKiBtdWx0aXBsZSBidWZmZXJzLCBsZWF2ZSB0aGUgZXh0cmEgd29yayB0bwotCQkgKiBoYW5kbGVfc3RyaXBlCi0JCSAqLwotCQlidWZmZXIgPSBzaC0+YmhfcmVhZFtpXTsKLQkJaWYgKGJ1ZmZlciAmJgotCQkgICAgKCFQYWdlSGlnaE1lbShidWZmZXItPmJfcGFnZSkKLQkJICAgICB8fCBidWZmZXItPmJfcGFnZSA9PSBiaC0+Yl9wYWdlICkKLQkJCSkgewotCQkJc2gtPmJoX3JlYWRbaV0gPSBidWZmZXItPmJfcmVxbmV4dDsKLQkJCWJ1ZmZlci0+Yl9yZXFuZXh0ID0gTlVMTDsKLQkJfSBlbHNlCi0JCQlidWZmZXIgPSBOVUxMOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwotCQlpZiAoc2gtPmJoX3BhZ2VbaV09PWJoLT5iX3BhZ2UpCi0JCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkJaWYgKGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlci0+Yl9wYWdlICE9IGJoLT5iX3BhZ2UpCi0JCQkJbWVtY3B5KGJ1ZmZlci0+Yl9kYXRhLCBiaC0+Yl9kYXRhLCBiaC0+Yl9zaXplKTsKLQkJCWJ1ZmZlci0+Yl9lbmRfaW8oYnVmZmVyLCAxKTsKLQkJfQotI2Vsc2UKIAkJc2V0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbaV0uZmxhZ3MpOwotI2VuZGlmCiAJCWlmICh0ZXN0X2JpdChSNV9SZWFkRXJyb3IsICZzaC0+ZGV2W2ldLmZsYWdzKSkgewogCQkJcmRldiA9IGNvbmYtPmRpc2tzW2ldLnJkZXY7CiAJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkNTolczogcmVhZCBlcnJvciBjb3JyZWN0ZWQgKCVsdSBzZWN0b3JzIGF0ICVsbHUgb24gJXMpXG4iLApAQCAtNjE2LDE0ICs1OTAsNiBAQAogCQl9CiAJfQogCXJkZXZfZGVjX3BlbmRpbmcoY29uZi0+ZGlza3NbaV0ucmRldiwgY29uZi0+bWRkZXYpOwotI2lmIDAKLQkvKiBtdXN0IHJlc3RvcmUgYl9wYWdlIGJlZm9yZSB1bmxvY2tpbmcgYnVmZmVyLi4uICovCi0JaWYgKHNoLT5iaF9wYWdlW2ldICE9IGJoLT5iX3BhZ2UpIHsKLQkJYmgtPmJfcGFnZSA9IHNoLT5iaF9wYWdlW2ldOwotCQliaC0+Yl9kYXRhID0gcGFnZV9hZGRyZXNzKGJoLT5iX3BhZ2UpOwotCQljbGVhcl9idWZmZXJfdXB0b2RhdGUoYmgpOwotCX0KLSNlbmRpZgogCWNsZWFyX2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKIAlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwogCXJlbGVhc2Vfc3RyaXBlKHNoKTsKQEAgLTgyMSw3ICs3ODcsOCBAQAogc3RhdGljIHNlY3Rvcl90IGNvbXB1dGVfYmxvY2tucihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBpbnQgaSkKIHsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBzaC0+cmFpZF9jb25mOwotCWludCByYWlkX2Rpc2tzID0gc2gtPmRpc2tzLCBkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDE7CisJaW50IHJhaWRfZGlza3MgPSBzaC0+ZGlza3M7CisJaW50IGRhdGFfZGlza3MgPSByYWlkX2Rpc2tzIC0gY29uZi0+bWF4X2RlZ3JhZGVkOwogCXNlY3Rvcl90IG5ld19zZWN0b3IgPSBzaC0+c2VjdG9yLCBjaGVjazsKIAlpbnQgc2VjdG9yc19wZXJfY2h1bmsgPSBjb25mLT5jaHVua19zaXplID4+IDk7CiAJc2VjdG9yX3Qgc3RyaXBlOwpAQCAtODU3LDcgKzgyNCw2IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSA2OgotCQlkYXRhX2Rpc2tzID0gcmFpZF9kaXNrcyAtIDI7CiAJCWlmIChpID09IHJhaWQ2X25leHRfZGlzayhzaC0+cGRfaWR4LCByYWlkX2Rpc2tzKSkKIAkJCXJldHVybiAwOyAvKiBJdCBpcyB0aGUgUSBkaXNrICovCiAJCXN3aXRjaCAoY29uZi0+YWxnb3JpdGhtKSB7CkBAIC0xMzUzLDggKzEzMTksMTAgQEAKIAlpbnQgcGRfaWR4LCBkZF9pZHg7CiAJaW50IGNodW5rX29mZnNldCA9IHNlY3Rvcl9kaXYoc3RyaXBlLCBzZWN0b3JzX3Blcl9jaHVuayk7CiAKLQlyYWlkNV9jb21wdXRlX3NlY3RvcihzdHJpcGUqKGRpc2tzLTEpKnNlY3RvcnNfcGVyX2NodW5rCi0JCQkgICAgICsgY2h1bmtfb2Zmc2V0LCBkaXNrcywgZGlza3MtMSwgJmRkX2lkeCwgJnBkX2lkeCwgY29uZik7CisJcmFpZDVfY29tcHV0ZV9zZWN0b3Ioc3RyaXBlICogKGRpc2tzIC0gY29uZi0+bWF4X2RlZ3JhZGVkKQorCQkJICAgICAqc2VjdG9yc19wZXJfY2h1bmsgKyBjaHVua19vZmZzZXQsCisJCQkgICAgIGRpc2tzLCBkaXNrcyAtIGNvbmYtPm1heF9kZWdyYWRlZCwKKwkJCSAgICAgJmRkX2lkeCwgJnBkX2lkeCwgY29uZik7CiAJcmV0dXJuIHBkX2lkeDsKIH0KIApAQCAtMTYxNSwxNSArMTU4Myw2IEBACiAJCQkJfSBlbHNlIGlmICh0ZXN0X2JpdChSNV9JbnN5bmMsICZkZXYtPmZsYWdzKSkgewogCQkJCQlzZXRfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpOwogCQkJCQlzZXRfYml0KFI1X1dhbnRyZWFkLCAmZGV2LT5mbGFncyk7Ci0jaWYgMAotCQkJCQkvKiBpZiBJIGFtIGp1c3QgcmVhZGluZyB0aGlzIGJsb2NrIGFuZCB3ZSBkb24ndCBoYXZlCi0JCQkJCSAgIGEgZmFpbGVkIGRyaXZlLCBvciBhbnkgcGVuZGluZyB3cml0ZXMgdGhlbiBzaWRlc3RlcCB0aGUgY2FjaGUgKi8KLQkJCQkJaWYgKHNoLT5iaF9yZWFkW2ldICYmICFzaC0+YmhfcmVhZFtpXS0+Yl9yZXFuZXh0ICYmCi0JCQkJCSAgICAhIHN5bmNpbmcgJiYgIWZhaWxlZCAmJiAhdG9fd3JpdGUpIHsKLQkJCQkJCXNoLT5iaF9jYWNoZVtpXS0+Yl9wYWdlID0gIHNoLT5iaF9yZWFkW2ldLT5iX3BhZ2U7Ci0JCQkJCQlzaC0+YmhfY2FjaGVbaV0tPmJfZGF0YSA9ICBzaC0+YmhfcmVhZFtpXS0+Yl9kYXRhOwotCQkJCQl9Ci0jZW5kaWYKIAkJCQkJbG9ja2VkKys7CiAJCQkJCVBSSU5USygiUmVhZGluZyBibG9jayAlZCAoc3luYz0lZClcbiIsIAogCQkJCQkJaSwgc3luY2luZyk7CkBAIC0xNjQxLDkgKzE2MDAsNiBAQAogCQkJZGV2ID0gJnNoLT5kZXZbaV07CiAJCQlpZiAoKGRldi0+dG93cml0ZSB8fCBpID09IHNoLT5wZF9pZHgpICYmCiAJCQkgICAgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKSAKLSNpZiAwCi18fCBzaC0+YmhfcGFnZVtpXSE9YmgtPmJfcGFnZQotI2VuZGlmCiAJCQkJICAgICkgJiYKIAkJCSAgICAhdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZkZXYtPmZsYWdzKSkgewogCQkJCWlmICh0ZXN0X2JpdChSNV9JbnN5bmMsICZkZXYtPmZsYWdzKQpAQCAtMTY1NSw5ICsxNjExLDYgQEAKIAkJCS8qIFdvdWxkIEkgaGF2ZSB0byByZWFkIHRoaXMgYnVmZmVyIGZvciByZWNvbnN0cnVjdF93cml0ZSAqLwogCQkJaWYgKCF0ZXN0X2JpdChSNV9PVkVSV1JJVEUsICZkZXYtPmZsYWdzKSAmJiBpICE9IHNoLT5wZF9pZHggJiYKIAkJCSAgICAoIXRlc3RfYml0KFI1X0xPQ0tFRCwgJmRldi0+ZmxhZ3MpIAotI2lmIDAKLXx8IHNoLT5iaF9wYWdlW2ldICE9IGJoLT5iX3BhZ2UKLSNlbmRpZgogCQkJCSAgICApICYmCiAJCQkgICAgIXRlc3RfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncykpIHsKIAkJCQlpZiAodGVzdF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncykpIHJjdysrOwpAQCAtMTg2NSwyMyArMTgxOCwyNSBAQAogCQlyZXR1cm5fYmkgPSBiaS0+YmlfbmV4dDsKIAkJYmktPmJpX25leHQgPSBOVUxMOwogCQliaS0+Ymlfc2l6ZSA9IDA7Ci0JCWJpLT5iaV9lbmRfaW8oYmksIGJ5dGVzLCAwKTsKKwkJYmktPmJpX2VuZF9pbyhiaSwgYnl0ZXMsCisJCQkgICAgICB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpCisJCQkgICAgICAgID8gMCA6IC1FSU8pOwogCX0KIAlmb3IgKGk9ZGlza3M7IGktLSA7KSB7CiAJCWludCBydzsKIAkJc3RydWN0IGJpbyAqYmk7CiAJCW1ka19yZGV2X3QgKnJkZXY7CiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfV2FudHdyaXRlLCAmc2gtPmRldltpXS5mbGFncykpCi0JCQlydyA9IDE7CisJCQlydyA9IFdSSVRFOwogCQllbHNlIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUjVfV2FudHJlYWQsICZzaC0+ZGV2W2ldLmZsYWdzKSkKLQkJCXJ3ID0gMDsKKwkJCXJ3ID0gUkVBRDsKIAkJZWxzZQogCQkJY29udGludWU7CiAgCiAJCWJpID0gJnNoLT5kZXZbaV0ucmVxOwogIAogCQliaS0+YmlfcncgPSBydzsKLQkJaWYgKHJ3KQorCQlpZiAocncgPT0gV1JJVEUpCiAJCQliaS0+YmlfZW5kX2lvID0gcmFpZDVfZW5kX3dyaXRlX3JlcXVlc3Q7CiAJCWVsc2UKIAkJCWJpLT5iaV9lbmRfaW8gPSByYWlkNV9lbmRfcmVhZF9yZXF1ZXN0OwpAQCAtMTkxNyw3ICsxODcyLDcgQEAKIAkJCQlhdG9taWNfYWRkKFNUUklQRV9TRUNUT1JTLCAmcmRldi0+Y29ycmVjdGVkX2Vycm9ycyk7CiAJCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaSk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAocncgPT0gMSkKKwkJCWlmIChydyA9PSBXUklURSkKIAkJCQlzZXRfYml0KFNUUklQRV9ERUdSQURFRCwgJnNoLT5zdGF0ZSk7CiAJCQlQUklOVEsoInNraXAgb3AgJWxkIG9uIGRpc2MgJWQgZm9yIHNlY3RvciAlbGx1XG4iLAogCQkJCWJpLT5iaV9ydywgaSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzaC0+c2VjdG9yKTsKQEAgLTIxOTMsMTUgKzIxNDgsNiBAQAogCQkJCX0gZWxzZSBpZiAodGVzdF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncykpIHsKIAkJCQkJc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKIAkJCQkJc2V0X2JpdChSNV9XYW50cmVhZCwgJmRldi0+ZmxhZ3MpOwotI2lmIDAKLQkJCQkJLyogaWYgSSBhbSBqdXN0IHJlYWRpbmcgdGhpcyBibG9jayBhbmQgd2UgZG9uJ3QgaGF2ZQotCQkJCQkgICBhIGZhaWxlZCBkcml2ZSwgb3IgYW55IHBlbmRpbmcgd3JpdGVzIHRoZW4gc2lkZXN0ZXAgdGhlIGNhY2hlICovCi0JCQkJCWlmIChzaC0+YmhfcmVhZFtpXSAmJiAhc2gtPmJoX3JlYWRbaV0tPmJfcmVxbmV4dCAmJgotCQkJCQkgICAgISBzeW5jaW5nICYmICFmYWlsZWQgJiYgIXRvX3dyaXRlKSB7Ci0JCQkJCQlzaC0+YmhfY2FjaGVbaV0tPmJfcGFnZSA9ICBzaC0+YmhfcmVhZFtpXS0+Yl9wYWdlOwotCQkJCQkJc2gtPmJoX2NhY2hlW2ldLT5iX2RhdGEgPSAgc2gtPmJoX3JlYWRbaV0tPmJfZGF0YTsKLQkJCQkJfQotI2VuZGlmCiAJCQkJCWxvY2tlZCsrOwogCQkJCQlQUklOVEsoIlJlYWRpbmcgYmxvY2sgJWQgKHN5bmM9JWQpXG4iLAogCQkJCQkJaSwgc3luY2luZyk7CkBAIC0yMjIwLDkgKzIxNjYsNiBAQAogCQkJaWYgKCF0ZXN0X2JpdChSNV9PVkVSV1JJVEUsICZkZXYtPmZsYWdzKQogCQkJICAgICYmIGkgIT0gcGRfaWR4ICYmIGkgIT0gcWRfaWR4CiAJCQkgICAgJiYgKCF0ZXN0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKQotI2lmIDAKLQkJCQl8fCBzaC0+YmhfcGFnZVtpXSAhPSBiaC0+Yl9wYWdlCi0jZW5kaWYKIAkJCQkgICAgKSAmJgogCQkJICAgICF0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKSB7CiAJCQkJaWYgKHRlc3RfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpKSByY3crKzsKQEAgLTI0MTgsMjMgKzIzNjEsMjUgQEAKIAkJcmV0dXJuX2JpID0gYmktPmJpX25leHQ7CiAJCWJpLT5iaV9uZXh0ID0gTlVMTDsKIAkJYmktPmJpX3NpemUgPSAwOwotCQliaS0+YmlfZW5kX2lvKGJpLCBieXRlcywgMCk7CisJCWJpLT5iaV9lbmRfaW8oYmksIGJ5dGVzLAorCQkJICAgICAgdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmktPmJpX2ZsYWdzKQorCQkJICAgICAgICA/IDAgOiAtRUlPKTsKIAl9CiAJZm9yIChpPWRpc2tzOyBpLS0gOykgewogCQlpbnQgcnc7CiAJCXN0cnVjdCBiaW8gKmJpOwogCQltZGtfcmRldl90ICpyZGV2OwogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X1dhbnR3cml0ZSwgJnNoLT5kZXZbaV0uZmxhZ3MpKQotCQkJcncgPSAxOworCQkJcncgPSBXUklURTsKIAkJZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFI1X1dhbnRyZWFkLCAmc2gtPmRldltpXS5mbGFncykpCi0JCQlydyA9IDA7CisJCQlydyA9IFJFQUQ7CiAJCWVsc2UKIAkJCWNvbnRpbnVlOwogCiAJCWJpID0gJnNoLT5kZXZbaV0ucmVxOwogCiAJCWJpLT5iaV9ydyA9IHJ3OwotCQlpZiAocncpCisJCWlmIChydyA9PSBXUklURSkKIAkJCWJpLT5iaV9lbmRfaW8gPSByYWlkNV9lbmRfd3JpdGVfcmVxdWVzdDsKIAkJZWxzZQogCQkJYmktPmJpX2VuZF9pbyA9IHJhaWQ1X2VuZF9yZWFkX3JlcXVlc3Q7CkBAIC0yNDcwLDcgKzI0MTUsNyBAQAogCQkJCWF0b21pY19hZGQoU1RSSVBFX1NFQ1RPUlMsICZyZGV2LT5jb3JyZWN0ZWRfZXJyb3JzKTsKIAkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChydyA9PSAxKQorCQkJaWYgKHJ3ID09IFdSSVRFKQogCQkJCXNldF9iaXQoU1RSSVBFX0RFR1JBREVELCAmc2gtPnN0YXRlKTsKIAkJCVBSSU5USygic2tpcCBvcCAlbGQgb24gZGlzYyAlZCBmb3Igc2VjdG9yICVsbHVcbiIsCiAJCQkJYmktPmJpX3J3LCBpLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwpAQCAtMjYxMSw2ICsyNTU2LDE4MCBAQAogCXJldHVybiAwOwogfQogCisvKiBXZSB3YW50IHJlYWQgcmVxdWVzdHMgdG8gYWxpZ24gd2l0aCBjaHVua3Mgd2hlcmUgcG9zc2libGUsCisgKiBidXQgd3JpdGUgcmVxdWVzdHMgZG9uJ3QgbmVlZCB0by4KKyAqLworc3RhdGljIGludCByYWlkNV9tZXJnZWFibGVfYnZlYyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpb192ZWMgKmJpb3ZlYykKK3sKKwltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKKwlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX3NlY3RvciArIGdldF9zdGFydF9zZWN0KGJpby0+YmlfYmRldik7CisJaW50IG1heDsKKwl1bnNpZ25lZCBpbnQgY2h1bmtfc2VjdG9ycyA9IG1kZGV2LT5jaHVua19zaXplID4+IDk7CisJdW5zaWduZWQgaW50IGJpb19zZWN0b3JzID0gYmlvLT5iaV9zaXplID4+IDk7CisKKwlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEUpCisJCXJldHVybiBiaW92ZWMtPmJ2X2xlbjsgLyogYWx3YXlzIGFsbG93IHdyaXRlcyB0byBiZSBtZXJnZWFibGUgKi8KKworCW1heCA9ICAoY2h1bmtfc2VjdG9ycyAtICgoc2VjdG9yICYgKGNodW5rX3NlY3RvcnMgLSAxKSkgKyBiaW9fc2VjdG9ycykpIDw8IDk7CisJaWYgKG1heCA8IDApIG1heCA9IDA7CisJaWYgKG1heCA8PSBiaW92ZWMtPmJ2X2xlbiAmJiBiaW9fc2VjdG9ycyA9PSAwKQorCQlyZXR1cm4gYmlvdmVjLT5idl9sZW47CisJZWxzZQorCQlyZXR1cm4gbWF4OworfQorCisKK3N0YXRpYyBpbnQgaW5fY2h1bmtfYm91bmRhcnkobWRkZXZfdCAqbWRkZXYsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzZWN0b3JfdCBzZWN0b3IgPSBiaW8tPmJpX3NlY3RvciArIGdldF9zdGFydF9zZWN0KGJpby0+YmlfYmRldik7CisJdW5zaWduZWQgaW50IGNodW5rX3NlY3RvcnMgPSBtZGRldi0+Y2h1bmtfc2l6ZSA+PiA5OworCXVuc2lnbmVkIGludCBiaW9fc2VjdG9ycyA9IGJpby0+Ymlfc2l6ZSA+PiA5OworCisJcmV0dXJuICBjaHVua19zZWN0b3JzID49CisJCSgoc2VjdG9yICYgKGNodW5rX3NlY3RvcnMgLSAxKSkgKyBiaW9fc2VjdG9ycyk7Cit9CisKKy8qCisgKiAgYWRkIGJpbyB0byB0aGUgcmV0cnkgTElGTyAgKCBpbiBPKDEpIC4uLiB3ZSBhcmUgaW4gaW50ZXJydXB0ICkKKyAqICBsYXRlciBzYW1wbGVkIGJ5IHJhaWQ1ZC4KKyAqLworc3RhdGljIHZvaWQgYWRkX2Jpb190b19yZXRyeShzdHJ1Y3QgYmlvICpiaSxyYWlkNV9jb25mX3QgKmNvbmYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOworCisJYmktPmJpX25leHQgPSBjb25mLT5yZXRyeV9yZWFkX2FsaWduZWRfbGlzdDsKKwljb25mLT5yZXRyeV9yZWFkX2FsaWduZWRfbGlzdCA9IGJpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwltZF93YWtldXBfdGhyZWFkKGNvbmYtPm1kZGV2LT50aHJlYWQpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgYmlvICpyZW1vdmVfYmlvX2Zyb21fcmV0cnkocmFpZDVfY29uZl90ICpjb25mKQoreworCXN0cnVjdCBiaW8gKmJpOworCisJYmkgPSBjb25mLT5yZXRyeV9yZWFkX2FsaWduZWQ7CisJaWYgKGJpKSB7CisJCWNvbmYtPnJldHJ5X3JlYWRfYWxpZ25lZCA9IE5VTEw7CisJCXJldHVybiBiaTsKKwl9CisJYmkgPSBjb25mLT5yZXRyeV9yZWFkX2FsaWduZWRfbGlzdDsKKwlpZihiaSkgeworCQljb25mLT5yZXRyeV9yZWFkX2FsaWduZWQgPSBiaS0+YmlfbmV4dDsKKwkJYmktPmJpX25leHQgPSBOVUxMOworCQliaS0+YmlfcGh5c19zZWdtZW50cyA9IDE7IC8qIGJpYXNlZCBjb3VudCBvZiBhY3RpdmUgc3RyaXBlcyAqLworCQliaS0+YmlfaHdfc2VnbWVudHMgPSAwOyAvKiBjb3VudCBvZiBwcm9jZXNzZWQgc3RyaXBlcyAqLworCX0KKworCXJldHVybiBiaTsKK30KKworCisvKgorICogIFRoZSAicmFpZDVfYWxpZ25fZW5kaW8iIHNob3VsZCBjaGVjayBpZiB0aGUgcmVhZCBzdWNjZWVkZWQgYW5kIGlmIGl0CisgKiAgZGlkLCBjYWxsIGJpb19lbmRpbyBvbiB0aGUgb3JpZ2luYWwgYmlvIChoYXZpbmcgYmlvX3B1dCB0aGUgbmV3IGJpbworICogIGZpcnN0KS4KKyAqICBJZiB0aGUgcmVhZCBmYWlsZWQuLgorICovCitzdGF0aWMgaW50IHJhaWQ1X2FsaWduX2VuZGlvKHN0cnVjdCBiaW8gKmJpLCB1bnNpZ25lZCBpbnQgYnl0ZXMsIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgYmlvKiByYWlkX2JpICA9IGJpLT5iaV9wcml2YXRlOworCW1kZGV2X3QgKm1kZGV2OworCXJhaWQ1X2NvbmZfdCAqY29uZjsKKwlpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpOworCW1ka19yZGV2X3QgKnJkZXY7CisKKwlpZiAoYmktPmJpX3NpemUpCisJCXJldHVybiAxOworCWJpb19wdXQoYmkpOworCisJbWRkZXYgPSByYWlkX2JpLT5iaV9iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+cXVldWVkYXRhOworCWNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKKwlyZGV2ID0gKHZvaWQqKXJhaWRfYmktPmJpX25leHQ7CisJcmFpZF9iaS0+YmlfbmV4dCA9IE5VTEw7CisKKwlyZGV2X2RlY19wZW5kaW5nKHJkZXYsIGNvbmYtPm1kZGV2KTsKKworCWlmICghZXJyb3IgJiYgdXB0b2RhdGUpIHsKKwkJYmlvX2VuZGlvKHJhaWRfYmksIGJ5dGVzLCAwKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNvbmYtPmFjdGl2ZV9hbGlnbmVkX3JlYWRzKSkKKwkJCXdha2VfdXAoJmNvbmYtPndhaXRfZm9yX3N0cmlwZSk7CisJCXJldHVybiAwOworCX0KKworCisJUFJJTlRLKCJyYWlkNV9hbGlnbl9lbmRpbyA6IGlvIGVycm9yLi4uaGFuZGluZyBJTyBmb3IgYSByZXRyeVxuIik7CisKKwlhZGRfYmlvX3RvX3JldHJ5KHJhaWRfYmksIGNvbmYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNodW5rX2FsaWduZWRfcmVhZChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKiByYWlkX2JpbykKK3sKKwltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKKwlyYWlkNV9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKKwljb25zdCB1bnNpZ25lZCBpbnQgcmFpZF9kaXNrcyA9IGNvbmYtPnJhaWRfZGlza3M7CisJY29uc3QgdW5zaWduZWQgaW50IGRhdGFfZGlza3MgPSByYWlkX2Rpc2tzIC0gY29uZi0+bWF4X2RlZ3JhZGVkOworCXVuc2lnbmVkIGludCBkZF9pZHgsIHBkX2lkeDsKKwlzdHJ1Y3QgYmlvKiBhbGlnbl9iaTsKKwltZGtfcmRldl90ICpyZGV2OworCisJaWYgKCFpbl9jaHVua19ib3VuZGFyeShtZGRldiwgcmFpZF9iaW8pKSB7CisJCXByaW50aygiY2h1bmtfYWxpZ25lZF9yZWFkIDogbm9uIGFsaWduZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKyAJICogdXNlIGJpb19jbG9uZSB0byBtYWtlIGEgY29weSBvZiB0aGUgYmlvCisJICovCisJYWxpZ25fYmkgPSBiaW9fY2xvbmUocmFpZF9iaW8sIEdGUF9OT0lPKTsKKwlpZiAoIWFsaWduX2JpKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqICAgc2V0IGJpX2VuZF9pbyB0byBhIG5ldyBmdW5jdGlvbiwgYW5kIHNldCBiaV9wcml2YXRlIHRvIHRoZQorCSAqICAgICBvcmlnaW5hbCBiaW8uCisJICovCisJYWxpZ25fYmktPmJpX2VuZF9pbyAgPSByYWlkNV9hbGlnbl9lbmRpbzsKKwlhbGlnbl9iaS0+YmlfcHJpdmF0ZSA9IHJhaWRfYmlvOworCS8qCisJICoJY29tcHV0ZSBwb3NpdGlvbgorCSAqLworCWFsaWduX2JpLT5iaV9zZWN0b3IgPSAgcmFpZDVfY29tcHV0ZV9zZWN0b3IocmFpZF9iaW8tPmJpX3NlY3RvciwKKwkJCQkJcmFpZF9kaXNrcywKKwkJCQkJZGF0YV9kaXNrcywKKwkJCQkJJmRkX2lkeCwKKwkJCQkJJnBkX2lkeCwKKwkJCQkJY29uZik7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmRldiA9IHJjdV9kZXJlZmVyZW5jZShjb25mLT5kaXNrc1tkZF9pZHhdLnJkZXYpOworCWlmIChyZGV2ICYmIHRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKKwkJYXRvbWljX2luYygmcmRldi0+bnJfcGVuZGluZyk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyYWlkX2Jpby0+YmlfbmV4dCA9ICh2b2lkKilyZGV2OworCQlhbGlnbl9iaS0+YmlfYmRldiA9ICByZGV2LT5iZGV2OworCQlhbGlnbl9iaS0+YmlfZmxhZ3MgJj0gfigxIDw8IEJJT19TRUdfVkFMSUQpOworCQlhbGlnbl9iaS0+Ymlfc2VjdG9yICs9IHJkZXYtPmRhdGFfb2Zmc2V0OworCisJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKwkJd2FpdF9ldmVudF9sb2NrX2lycShjb25mLT53YWl0X2Zvcl9zdHJpcGUsCisJCQkJICAgIGNvbmYtPnF1aWVzY2UgPT0gMCwKKwkJCQkgICAgY29uZi0+ZGV2aWNlX2xvY2ssIC8qIG5vdGhpbmcgKi8pOworCQlhdG9taWNfaW5jKCZjb25mLT5hY3RpdmVfYWxpZ25lZF9yZWFkcyk7CisJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCisJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGFsaWduX2JpKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWJpb19wdXQoYWxpZ25fYmkpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKwogc3RhdGljIGludCBtYWtlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICogYmkpCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7CkBAIC0yNjMyLDYgKzI3NTEsMTEgQEAKIAlkaXNrX3N0YXRfaW5jKG1kZGV2LT5nZW5kaXNrLCBpb3NbcnddKTsKIAlkaXNrX3N0YXRfYWRkKG1kZGV2LT5nZW5kaXNrLCBzZWN0b3JzW3J3XSwgYmlvX3NlY3RvcnMoYmkpKTsKIAorCWlmIChydyA9PSBSRUFEICYmCisJICAgICBtZGRldi0+cmVzaGFwZV9wb3NpdGlvbiA9PSBNYXhTZWN0b3IgJiYKKwkgICAgIGNodW5rX2FsaWduZWRfcmVhZChxLGJpKSkKKyAgICAgICAgICAgIAlyZXR1cm4gMDsKKwogCWxvZ2ljYWxfc2VjdG9yID0gYmktPmJpX3NlY3RvciAmIH4oKHNlY3Rvcl90KVNUUklQRV9TRUNUT1JTLTEpOwogCWxhc3Rfc2VjdG9yID0gYmktPmJpX3NlY3RvciArIChiaS0+Ymlfc2l6ZT4+OSk7CiAJYmktPmJpX25leHQgPSBOVUxMOwpAQCAtMjczOSw3ICsyODYzLDkgQEAKIAkJaWYgKCBydyA9PSBXUklURSApCiAJCQltZF93cml0ZV9lbmQobWRkZXYpOwogCQliaS0+Ymlfc2l6ZSA9IDA7Ci0JCWJpLT5iaV9lbmRfaW8oYmksIGJ5dGVzLCAwKTsKKwkJYmktPmJpX2VuZF9pbyhiaSwgYnl0ZXMsCisJCQkgICAgICB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaS0+YmlfZmxhZ3MpCisJCQkgICAgICAgID8gMCA6IC1FSU8pOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI5NTAsNiArMzA3Niw3NCBAQAogCXJldHVybiBTVFJJUEVfU0VDVE9SUzsKIH0KIAorc3RhdGljIGludCAgcmV0cnlfYWxpZ25lZF9yZWFkKHJhaWQ1X2NvbmZfdCAqY29uZiwgc3RydWN0IGJpbyAqcmFpZF9iaW8pCit7CisJLyogV2UgbWF5IG5vdCBiZSBhYmxlIHRvIHN1Ym1pdCBhIHdob2xlIGJpbyBhdCBvbmNlIGFzIHRoZXJlCisJICogbWF5IG5vdCBiZSBlbm91Z2ggc3RyaXBlX2hlYWRzIGF2YWlsYWJsZS4KKwkgKiBXZSBjYW5ub3QgcHJlLWFsbG9jYXRlIGVub3VnaCBzdHJpcGVfaGVhZHMgYXMgd2UgbWF5IG5lZWQKKwkgKiBtb3JlIHRoYW4gZXhpc3QgaW4gdGhlIGNhY2hlIChpZiB3ZSBhbGxvdyBldmVyIGxhcmdlIGNodW5rcykuCisJICogU28gd2UgZG8gb25lIHN0cmlwZSBoZWFkIGF0IGEgdGltZSBhbmQgcmVjb3JkIGluCisJICogLT5iaV9od19zZWdtZW50cyBob3cgbWFueSBoYXZlIGJlZW4gZG9uZS4KKwkgKgorCSAqIFdlICprbm93KiB0aGF0IHRoaXMgZW50aXJlIHJhaWRfYmlvIGlzIGluIG9uZSBjaHVuaywgc28KKwkgKiBpdCB3aWxsIGJlIG9ubHkgb25lICdkZF9pZHgnIGFuZCBvbmx5IG5lZWQgb25lIGNhbGwgdG8gcmFpZDVfY29tcHV0ZV9zZWN0b3IuCisJICovCisJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKKwlpbnQgZGRfaWR4LCBwZF9pZHg7CisJc2VjdG9yX3Qgc2VjdG9yLCBsb2dpY2FsX3NlY3RvciwgbGFzdF9zZWN0b3I7CisJaW50IHNjbnQgPSAwOworCWludCByZW1haW5pbmc7CisJaW50IGhhbmRsZWQgPSAwOworCisJbG9naWNhbF9zZWN0b3IgPSByYWlkX2Jpby0+Ymlfc2VjdG9yICYgfigoc2VjdG9yX3QpU1RSSVBFX1NFQ1RPUlMtMSk7CisJc2VjdG9yID0gcmFpZDVfY29tcHV0ZV9zZWN0b3IoCWxvZ2ljYWxfc2VjdG9yLAorCQkJCQljb25mLT5yYWlkX2Rpc2tzLAorCQkJCQljb25mLT5yYWlkX2Rpc2tzIC0gY29uZi0+bWF4X2RlZ3JhZGVkLAorCQkJCQkmZGRfaWR4LAorCQkJCQkmcGRfaWR4LAorCQkJCQljb25mKTsKKwlsYXN0X3NlY3RvciA9IHJhaWRfYmlvLT5iaV9zZWN0b3IgKyAocmFpZF9iaW8tPmJpX3NpemU+PjkpOworCisJZm9yICg7IGxvZ2ljYWxfc2VjdG9yIDwgbGFzdF9zZWN0b3I7CisJICAgICBsb2dpY2FsX3NlY3RvciArPSBTVFJJUEVfU0VDVE9SUywgc2NudCsrKSB7CisKKwkJaWYgKHNjbnQgPCByYWlkX2Jpby0+YmlfaHdfc2VnbWVudHMpCisJCQkvKiBhbHJlYWR5IGRvbmUgdGhpcyBzdHJpcGUgKi8KKwkJCWNvbnRpbnVlOworCisJCXNoID0gZ2V0X2FjdGl2ZV9zdHJpcGUoY29uZiwgc2VjdG9yLCBjb25mLT5yYWlkX2Rpc2tzLCBwZF9pZHgsIDEpOworCisJCWlmICghc2gpIHsKKwkJCS8qIGZhaWxlZCB0byBnZXQgYSBzdHJpcGUgLSBtdXN0IHdhaXQgKi8KKwkJCXJhaWRfYmlvLT5iaV9od19zZWdtZW50cyA9IHNjbnQ7CisJCQljb25mLT5yZXRyeV9yZWFkX2FsaWduZWQgPSByYWlkX2JpbzsKKwkJCXJldHVybiBoYW5kbGVkOworCQl9CisKKwkJc2V0X2JpdChSNV9SZWFkRXJyb3IsICZzaC0+ZGV2W2RkX2lkeF0uZmxhZ3MpOworCQlhZGRfc3RyaXBlX2JpbyhzaCwgcmFpZF9iaW8sIGRkX2lkeCwgMCk7CisJCWhhbmRsZV9zdHJpcGUoc2gsIE5VTEwpOworCQlyZWxlYXNlX3N0cmlwZShzaCk7CisJCWhhbmRsZWQrKzsKKwl9CisJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCXJlbWFpbmluZyA9IC0tcmFpZF9iaW8tPmJpX3BoeXNfc2VnbWVudHM7CisJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJaWYgKHJlbWFpbmluZyA9PSAwKSB7CisJCWludCBieXRlcyA9IHJhaWRfYmlvLT5iaV9zaXplOworCisJCXJhaWRfYmlvLT5iaV9zaXplID0gMDsKKwkJcmFpZF9iaW8tPmJpX2VuZF9pbyhyYWlkX2JpbywgYnl0ZXMsCisJCQkgICAgICB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZyYWlkX2Jpby0+YmlfZmxhZ3MpCisJCQkgICAgICAgID8gMCA6IC1FSU8pOworCX0KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY29uZi0+YWN0aXZlX2FsaWduZWRfcmVhZHMpKQorCQl3YWtlX3VwKCZjb25mLT53YWl0X2Zvcl9zdHJpcGUpOworCXJldHVybiBoYW5kbGVkOworfQorCisKKwogLyoKICAqIFRoaXMgaXMgb3VyIHJhaWQ1IGtlcm5lbCB0aHJlYWQuCiAgKgpAQCAtMjk3MSw2ICszMTY1LDcgQEAKIAlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqZmlyc3Q7CisJCXN0cnVjdCBiaW8gKmJpbzsKIAogCQlpZiAoY29uZi0+c2VxX2ZsdXNoICE9IGNvbmYtPnNlcV93cml0ZSkgewogCQkJaW50IHNlcSA9IGNvbmYtPnNlcV9mbHVzaDsKQEAgLTI5ODcsNiArMzE4MiwxNiBAQAogCQkgICAgIWxpc3RfZW1wdHkoJmNvbmYtPmRlbGF5ZWRfbGlzdCkpCiAJCQlyYWlkNV9hY3RpdmF0ZV9kZWxheWVkKGNvbmYpOwogCisJCXdoaWxlICgoYmlvID0gcmVtb3ZlX2Jpb19mcm9tX3JldHJ5KGNvbmYpKSkgeworCQkJaW50IG9rOworCQkJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CisJCQlvayA9IHJldHJ5X2FsaWduZWRfcmVhZChjb25mLCBiaW8pOworCQkJc3Bpbl9sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOworCQkJaWYgKCFvaykKKwkJCQlicmVhazsKKwkJCWhhbmRsZWQrKzsKKwkJfQorCiAJCWlmIChsaXN0X2VtcHR5KCZjb25mLT5oYW5kbGVfbGlzdCkpCiAJCQlicmVhazsKIApAQCAtMzE3NCw2ICszMzc5LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmY29uZi0+aW5hY3RpdmVfbGlzdCk7CiAJYXRvbWljX3NldCgmY29uZi0+YWN0aXZlX3N0cmlwZXMsIDApOwogCWF0b21pY19zZXQoJmNvbmYtPnByZXJlYWRfYWN0aXZlX3N0cmlwZXMsIDApOworCWF0b21pY19zZXQoJmNvbmYtPmFjdGl2ZV9hbGlnbmVkX3JlYWRzLCAwKTsKIAogCVBSSU5USygicmFpZDU6IHJ1biglcykgY2FsbGVkLlxuIiwgbWRuYW1lKG1kZGV2KSk7CiAKQEAgLTMzMjAsNiArMzUyNiw4IEBACiAJbWRkZXYtPmFycmF5X3NpemUgPSAgbWRkZXYtPnNpemUgKiAoY29uZi0+cHJldmlvdXNfcmFpZF9kaXNrcyAtCiAJCQkJCSAgICBjb25mLT5tYXhfZGVncmFkZWQpOwogCisJYmxrX3F1ZXVlX21lcmdlX2J2ZWMobWRkZXYtPnF1ZXVlLCByYWlkNV9tZXJnZWFibGVfYnZlYyk7CisKIAlyZXR1cm4gMDsKIGFib3J0OgogCWlmIChjb25mKSB7CkBAIC0zNjU5LDcgKzM4NjcsNyBAQAogCQliZGV2ID0gYmRnZXRfZGlzayhjb25mLT5tZGRldi0+Z2VuZGlzaywgMCk7CiAJCWlmIChiZGV2KSB7CiAJCQltdXRleF9sb2NrKCZiZGV2LT5iZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlpX3NpemVfd3JpdGUoYmRldi0+YmRfaW5vZGUsIGNvbmYtPm1kZGV2LT5hcnJheV9zaXplIDw8IDEwKTsKKwkJCWlfc2l6ZV93cml0ZShiZGV2LT5iZF9pbm9kZSwgKGxvZmZfdCljb25mLT5tZGRldi0+YXJyYXlfc2l6ZSA8PCAxMCk7CiAJCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2lub2RlLT5pX211dGV4KTsKIAkJCWJkcHV0KGJkZXYpOwogCQl9CkBAIC0zNjk0LDcgKzM5MDIsOCBAQAogCQlzcGluX2xvY2tfaXJxKCZjb25mLT5kZXZpY2VfbG9jayk7CiAJCWNvbmYtPnF1aWVzY2UgPSAxOwogCQl3YWl0X2V2ZW50X2xvY2tfaXJxKGNvbmYtPndhaXRfZm9yX3N0cmlwZSwKLQkJCQkgICAgYXRvbWljX3JlYWQoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKSA9PSAwLAorCQkJCSAgICBhdG9taWNfcmVhZCgmY29uZi0+YWN0aXZlX3N0cmlwZXMpID09IDAgJiYKKwkJCQkgICAgYXRvbWljX3JlYWQoJmNvbmYtPmFjdGl2ZV9hbGlnbmVkX3JlYWRzKSA9PSAwLAogCQkJCSAgICBjb25mLT5kZXZpY2VfbG9jaywgLyogbm90aGluZyAqLyk7CiAJCXNwaW5fdW5sb2NrX2lycSgmY29uZi0+ZGV2aWNlX2xvY2spOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvS2NvbmZpZwppbmRleCA5ZjdlMWZlLi44NzQxMGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9LY29uZmlnCkBAIC02Nyw2ICs2Nyw3IEBACiAKIGNvbmZpZyBWSURFT19UVU5FUgogCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFZJREVPX0JVRgogCXRyaXN0YXRlCkBAIC04Miw2ICs4Myw3IEBACiAKIGNvbmZpZyBWSURFT19UVkVFUFJPTQogCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFVTQl9EQUJVU0IKIAl0cmlzdGF0ZSAiREFCVVNCIGRyaXZlciIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYwppbmRleCBkYjc1MzQ0Li5mNTFlMDJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYwpAQCAtMTU1MiwzICsxNTUyLDU4IEBACiB9OwogCiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19ub3J3b29kKTsKKworLyogRnJvbSByZWFkaW5nIHRoZSBmb2xsb3dpbmcgcmVtb3RlczoKKyAqIFplbml0aCBVbml2ZXJzYWwgNyAvIFRWIE1vZGUgODA3IC8gVkNSIE1vZGUgODM3CisgKiBIYXVwcGF1Z2UgKGZyb20gTk9WQS1DSS1zIGJveCBwcm9kdWN0KQorICogVGhpcyBpcyBhICJtaWRkbGUgb2YgdGhlIHJvYWQiIGFwcHJvYWNoLCBkaWZmZXJlbmNlcyBhcmUgbm90ZWQKKyAqLworSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfYnVkZ2V0X2NpX29sZFtJUl9LRVlUQUJfU0laRV0gPSB7CisJWyAweDAwIF0gPSBLRVlfMCwKKwlbIDB4MDEgXSA9IEtFWV8xLAorCVsgMHgwMiBdID0gS0VZXzIsCisJWyAweDAzIF0gPSBLRVlfMywKKwlbIDB4MDQgXSA9IEtFWV80LAorCVsgMHgwNSBdID0gS0VZXzUsCisJWyAweDA2IF0gPSBLRVlfNiwKKwlbIDB4MDcgXSA9IEtFWV83LAorCVsgMHgwOCBdID0gS0VZXzgsCisJWyAweDA5IF0gPSBLRVlfOSwKKwlbIDB4MGEgXSA9IEtFWV9FTlRFUiwKKwlbIDB4MGIgXSA9IEtFWV9SRUQsCisJWyAweDBjIF0gPSBLRVlfUE9XRVIsICAgICAgICAgICAgIC8qIFJBRElPIG9uIEhhdXBwYXVnZSAqLworCVsgMHgwZCBdID0gS0VZX01VVEUsCisJWyAweDBmIF0gPSBLRVlfQSwgICAgICAgICAgICAgICAgIC8qIFRWIG9uIEhhdXBwYXVnZSAqLworCVsgMHgxMCBdID0gS0VZX1ZPTFVNRVVQLAorCVsgMHgxMSBdID0gS0VZX1ZPTFVNRURPV04sCisJWyAweDE0IF0gPSBLRVlfQiwKKwlbIDB4MWMgXSA9IEtFWV9VUCwKKwlbIDB4MWQgXSA9IEtFWV9ET1dOLAorCVsgMHgxZSBdID0gS0VZX09QVElPTiwgICAgICAgICAgICAvKiBSRVNFUlZFRCBvbiBIYXVwcGF1Z2UgKi8KKwlbIDB4MWYgXSA9IEtFWV9CUkVBSywKKwlbIDB4MjAgXSA9IEtFWV9DSEFOTkVMVVAsCisJWyAweDIxIF0gPSBLRVlfQ0hBTk5FTERPV04sCisJWyAweDIyIF0gPSBLRVlfUFJFVklPVVMsICAgICAgICAgIC8qIFByZXYuIENoIG9uIFplbml0aCwgU09VUkNFIG9uIEhhdXBwYXVnZSAqLworCVsgMHgyNCBdID0gS0VZX1JFU1RBUlQsCisJWyAweDI1IF0gPSBLRVlfT0ssCisJWyAweDI2IF0gPSBLRVlfQ1lDTEVXSU5ET1dTLCAgICAgIC8qIE1JTklNSVpFIG9uIEhhdXBwYXVnZSAqLworCVsgMHgyOCBdID0gS0VZX0VOVEVSLCAgICAgICAgICAgICAvKiBWQ1IgbW9kZSBvbiBaZW5pdGggKi8KKwlbIDB4MjkgXSA9IEtFWV9QQVVTRSwKKwlbIDB4MmIgXSA9IEtFWV9SSUdIVCwKKwlbIDB4MmMgXSA9IEtFWV9MRUZULAorCVsgMHgyZSBdID0gS0VZX01FTlUsICAgICAgICAgICAgICAvKiBGVUxMIFNDUkVFTiBvbiBIYXVwcGF1Z2UgKi8KKwlbIDB4MzAgXSA9IEtFWV9TTE9XLAorCVsgMHgzMSBdID0gS0VZX1BSRVZJT1VTLCAgICAgICAgICAvKiBWQ1IgbW9kZSBvbiBaZW5pdGggKi8KKwlbIDB4MzIgXSA9IEtFWV9SRVdJTkQsCisJWyAweDM0IF0gPSBLRVlfRkFTVEZPUldBUkQsCisJWyAweDM1IF0gPSBLRVlfUExBWSwKKwlbIDB4MzYgXSA9IEtFWV9TVE9QLAorCVsgMHgzNyBdID0gS0VZX1JFQ09SRCwKKwlbIDB4MzggXSA9IEtFWV9UVU5FUiwgICAgICAgICAgICAgLyogVFYvVkNSIG9uIFplbml0aCAqLworCVsgMHgzYSBdID0gS0VZX0MsCisJWyAweDNjIF0gPSBLRVlfRVhJVCwKKwlbIDB4M2QgXSA9IEtFWV9QT1dFUjIsCisJWyAweDNlIF0gPSBLRVlfVFVORVIsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19idWRnZXRfY2lfb2xkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2kyYy5jCmluZGV4IGQ5OTUzZjcuLjhjODVlZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9pMmMuYwpAQCAtMTg5LDEzICsxODksMjEgQEAKIAkJc2FhNzE0Nl93cml0ZShkZXYsIEkyQ19UUkFOU0ZFUiwgKmR3b3JkKTsKIAogCQlkZXYtPmkyY19vcCA9IDE7CisJCVNBQTcxNDZfSVNSX0NMRUFSKGRldiwgTUFTS18xNnxNQVNLXzE3KTsKIAkJU0FBNzE0Nl9JRVJfRU5BQkxFKGRldiwgTUFTS18xNnxNQVNLXzE3KTsKIAkJc2FhNzE0Nl93cml0ZShkZXYsIE1DMiwgKE1BU0tfMDAgfCBNQVNLXzE2KSk7CiAKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+aTJjX3dxLCBkZXYtPmkyY19vcCA9PSAwKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgewotCQkJLyogYSBzaWduYWwgYXJyaXZlZCAqLwotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJdGltZW91dCA9IEhaLzEwMCArIDE7IC8qIDEwbXMgKi8KKwkJdGltZW91dCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+aTJjX3dxLCBkZXYtPmkyY19vcCA9PSAwLCB0aW1lb3V0KTsKKwkJaWYgKHRpbWVvdXQgPT0gLUVSRVNUQVJUU1lTIHx8IGRldi0+aTJjX29wKSB7CisJCQlTQUE3MTQ2X0lFUl9ESVNBQkxFKGRldiwgTUFTS18xNnxNQVNLXzE3KTsKKwkJCVNBQTcxNDZfSVNSX0NMRUFSKGRldiwgTUFTS18xNnxNQVNLXzE3KTsKKwkJCWlmICh0aW1lb3V0ID09IC1FUkVTVEFSVFNZUykKKwkJCQkvKiBhIHNpZ25hbCBhcnJpdmVkICovCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2FhNzE0Nl9pMmNfd3JpdGVvdXQ6IHRpbWVkIG91dCB3YWl0aW5nIGZvciBlbmQgb2YgeGZlclxuIik7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlzdGF0dXMgPSBzYWE3MTQ2X3JlYWQoZGV2LCBJMkNfU1RBVFVTKTsKIAl9IGVsc2UgewpAQCAtMjE3LDExICsyMjUsOSBAQAogCQl9CiAJCS8qIHdhaXQgdW50aWwgd2UgZ2V0IGEgdHJhbnNmZXIgZG9uZSBvciBlcnJvciAqLwogCQl0aW1lb3V0ID0gamlmZmllcyArIEhaLzEwMCArIDE7IC8qIDEwbXMgKi8KKwkJLyogZmlyc3QgcmVhZCB1c3VhbGx5IGRlbGl2ZXJzIGJvZ3VzIHJlc3VsdHMuLi4gKi8KKwkJc2FhNzE0Nl9pMmNfc3RhdHVzKGRldik7CiAJCXdoaWxlKDEpIHsKLQkJCS8qKgotCQkJICogIGZpcnN0IHJlYWQgdXN1YWxseSBkZWxpdmVycyBib2d1cyByZXN1bHRzLi4uCi0JCQkgKi8KLQkJCXNhYTcxNDZfaTJjX3N0YXR1cyhkZXYpOwogCQkJc3RhdHVzID0gc2FhNzE0Nl9pMmNfc3RhdHVzKGRldik7CiAJCQlpZiAoKHN0YXR1cyAmIDB4MykgIT0gMSkKIAkJCQlicmVhazsKQEAgLTIzMiwxMCArMjM4LDEwIEBACiAJCQkJREVCX0kyQygoInNhYTcxNDZfaTJjX3dyaXRlb3V0OiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZW5kIG9mIHhmZXJcbiIpKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KLQkJCWlmICgoKyt0cmlhbCA8IDIwKSAmJiBzaG9ydF9kZWxheSkKKwkJCWlmICgrK3RyaWFsIDwgNTAgJiYgc2hvcnRfZGVsYXkpCiAJCQkJdWRlbGF5KDEwKTsKIAkJCWVsc2UKLQkJCW1zbGVlcCgxKTsKKwkJCQltc2xlZXAoMSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZwppbmRleCBhMGRjZDU5Li43OTg3NTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnCkBAIC05LDYgKzksNyBAQAogCXNlbGVjdCBEVkJfU1RWMDI5NyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfQkNNMzUxMCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfTEdEVDMzMFggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1RVTkVSX0xHSDA2WEYgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgZGlnaXRhbCBUViByZWNlaXZlciBjaGlwIG1hZGUgYnkgQjJDMiBJbmMuIGluY2x1ZGVkIGluCiAJICBUZWNobmlzYXRzIFBDSSBjYXJkcyBhbmQgVVNCIGJveGVzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYwppbmRleCBiOGJhODc4Li5jMmIzNWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgInN0djAyOTcuaCIKICNpbmNsdWRlICJtdDMxMi5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCi0jaW5jbHVkZSAibGdfaDA2eGYuaCIKKyNpbmNsdWRlICJsZ2gwNnhmLmgiCiAjaW5jbHVkZSAiZHZiLXBsbC5oIgogCiAvKiBsbmIgY29udHJvbCAqLwpAQCAtMzAzLDEyICszMDMsNiBAQAogCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlKGZ3LCBuYW1lLCBmYy0+ZGV2KTsKIH0KIAotc3RhdGljIGludCBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKLQlyZXR1cm4gbGdfaDA2eGZfcGxsX3NldChmZSwgJmZjLT5pMmNfYWRhcCwgcGFyYW1zKTsKLX0KLQogc3RhdGljIHN0cnVjdCBsZ2R0MzMweF9jb25maWcgYWlyMnBjX2F0c2NfaGQ1MDAwX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyAgICAgICA9IDB4NTksCiAJLmRlbW9kX2NoaXAgICAgICAgICAgPSBMR0RUMzMwMywKQEAgLTUzMyw3ICs1MjcsNyBAQAogCS8qIHRyeSB0aGUgYWlyIGF0c2MgM25kIGdlbmVyYXRpb24gKGxnZHQzMzAzKSAqLwogCWlmICgoZmMtPmZlID0gZHZiX2F0dGFjaChsZ2R0MzMweF9hdHRhY2gsICZhaXIycGNfYXRzY19oZDUwMDBfY29uZmlnLCAmZmMtPmkyY19hZGFwKSkgIT0gTlVMTCkgewogCQlmYy0+ZGV2X3R5cGUgICAgICAgICAgPSBGQ19BSVJfQVRTQzM7Ci0JCWZjLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbGdkdDMzMDNfdHVuZXJfc2V0X3BhcmFtczsKKwkJZHZiX2F0dGFjaChsZ2gwNnhmX2F0dGFjaCwgZmMtPmZlLCAmZmMtPmkyY19hZGFwKTsKIAkJaW5mbygiZm91bmQgdGhlIGxnZHQzMzAzIGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLGFpcjJwY19hdHNjX2hkNTAwMF9jb25maWcuZGVtb2RfYWRkcmVzcyk7CiAJfSBlbHNlCiAJLyogdHJ5IHRoZSBhaXIgYXRzYyAxbmQgZ2VuZXJhdGlvbiAoYmNtMzUxMCkvcGFuYXNvbmljIGN0MTBzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKaW5kZXggMDY4OTMyNC4uNmUxNjY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXBjaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1wY2kuYwpAQCAtNjMsNyArNjMsNyBAQAogCiAJdW5zaWduZWQgbG9uZyBsYXN0X2lycTsKIAotCXN0cnVjdCB3b3JrX3N0cnVjdCBpcnFfY2hlY2tfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGlycV9jaGVja193b3JrOwogCiAJc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmY19kZXY7CiB9OwpAQCAtOTcsOSArOTcsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZmxleGNvcF9wY2lfaXJxX2NoZWNrX3dvcmsodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGNpX2lycV9jaGVja193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSA9IGRhdGE7CisJc3RydWN0IGZsZXhjb3BfcGNpICpmY19wY2kgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZsZXhjb3BfcGNpLCBpcnFfY2hlY2tfd29yay53b3JrKTsKIAlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmNfcGNpLT5mY19kZXY7CiAKIAlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxzcmFtX2Rlc3RfcmVnXzcxNCk7CkBAIC0zNzEsNyArMzcyLDcgQEAKIAlpZiAoKHJldCA9IGZsZXhjb3BfcGNpX2RtYV9pbml0KGZjX3BjaSkpICE9IDApCiAJCWdvdG8gZXJyX2ZjX2V4aXQ7CiAKLQlJTklUX1dPUksoJmZjX3BjaS0+aXJxX2NoZWNrX3dvcmssIGZsZXhjb3BfcGNpX2lycV9jaGVja193b3JrLCBmY19wY2kpOworCUlOSVRfREVMQVlFRF9XT1JLKCZmY19wY2ktPmlycV9jaGVja193b3JrLCBmbGV4Y29wX3BjaV9pcnFfY2hlY2tfd29yayk7CiAKIAlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMKaW5kZXggMjg1M2VhMS4uODdmYjc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJd0luZGV4ID0gKGNoaXBhZGRyIDw8IDggKSB8IGFkZHI7CiAKIAlkZWJfaTJjKCJpMmMgJTJkOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIixmdW5jLHJlcXVlc3RfdHlwZSxyZXEsCi0JCQkoKHdWYWx1ZSAmJiAweGZmKSA8PCA4KSx3VmFsdWUgPj4gOCwoKHdJbmRleCAmJiAweGZmKSA8PCA4KSx3SW5kZXggPj4gOCk7CisJCXdWYWx1ZSAmIDB4ZmYsIHdWYWx1ZSA+PiA4LCB3SW5kZXggJiAweGZmLCB3SW5kZXggPj4gOCk7CiAKIAlsZW4gPSB1c2JfY29udHJvbF9tc2coZmNfdXNiLT51ZGV2LHBpcGUsCiAJCQlyZXEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZwppbmRleCBhZTJmZjVkLi5kZDY2YjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L0tjb25maWcKQEAgLTEsMTMgKzEsMTMgQEAKIGNvbmZpZyBEVkJfQlQ4WFgKIAl0cmlzdGF0ZSAiQlQ4eHggYmFzZWQgUENJIGNhcmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQyAmJiBWSURFT19CVDg0OAotCXNlbGVjdCBEVkJfUExMCiAJc2VsZWN0IERWQl9NVDM1MiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfU1A4ODdYIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9OWFQ2MDAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9DWDI0MTEwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9PUjUxMjExIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9MR0RUMzMwWCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfVFVORVJfTEdIMDZYRiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfWkwxMDM1MyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBGV19MT0FERVIKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jCmluZGV4IDI0MGFkMDguLjUwYmMzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jCkBAIC00ODAsNyArNDgwLDcgQEAKIAlzdHJ1Y3QgY2FfbXNnICpod19idWZmZXI7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlpZiAoKGh3X2J1ZmZlciA9IChzdHJ1Y3QgY2FfbXNnICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwlpZiAoKGh3X2J1ZmZlciA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKIAkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCmluZGV4IGZiNmM0Y2MuLjNlMzU5MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCiAjaW5jbHVkZSAiZHZiLWJ0OHh4LmgiCiAjaW5jbHVkZSAiYnQ4NzguaCIKLSNpbmNsdWRlICJkdmItcGxsLmgiCiAKIHN0YXRpYyBpbnQgZGVidWc7CiAKQEAgLTU2OCwxMiArNTY3LDYgQEAKIAkuZGVtb2RfaW5pdCA9IGRpZ2l0dl9hbHBzX3RkZWQ0X2RlbW9kX2luaXQsCiB9OwogCi1zdGF0aWMgaW50IHRkdnNfdHVhNjAzNF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKLXsKLQlzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQgPSAoc3RydWN0IGR2Yl9idDh4eF9jYXJkICopIGZlLT5kdmItPnByaXY7Ci0JcmV0dXJuIGxnX2gwNnhmX3BsbF9zZXQoZmUsIGNhcmQtPmkyY19hZGFwdGVyLCBwYXJhbXMpOwotfQotCiBzdGF0aWMgc3RydWN0IGxnZHQzMzB4X2NvbmZpZyB0ZHZzX3R1YTYwMzRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzICAgID0gMHgwZSwKIAkuZGVtb2RfY2hpcCAgICAgICA9IExHRFQzMzAzLApAQCAtNjE2LDcgKzYwOSw3IEBACiAJCWxnZHQzMzB4X3Jlc2V0KGNhcmQpOwogCQljYXJkLT5mZSA9IGR2Yl9hdHRhY2gobGdkdDMzMHhfYXR0YWNoLCAmdGR2c190dWE2MDM0X2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOwogCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewotCQkJY2FyZC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHRkdnNfdHVhNjAzNF90dW5lcl9zZXRfcGFyYW1zOworCQkJZHZiX2F0dGFjaChsZ2gwNnhmX2F0dGFjaCwgY2FyZC0+ZmUsIGNhcmQtPmkyY19hZGFwdGVyKTsKIAkJCWRwcmludGsgKCJkdmJfYnQ4eHg6IGxnZHQzMzB4IGRldGVjdGVkXG4iKTsKIAkJfQogCQlicmVhazsKQEAgLTY2NCw3ICs2NTcsMTEgQEAKIAogCWNhc2UgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVDoKIAkJLyoJRFNUIGlzIG5vdCBhIGZyb250ZW5kIGRyaXZlciAhISEJCSovCi0JCXN0YXRlID0gKHN0cnVjdCBkc3Rfc3RhdGUgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBkc3Rfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwkJc3RhdGUgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGRzdF9zdGF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAoIXN0YXRlKSB7CisJCQlwcmludGsoImR2Yl9idDh4eDogTm8gbWVtb3J5XG4iKTsKKwkJCWJyZWFrOworCQl9CiAJCS8qCVNldHVwIHRoZSBDYXJkCQkJCQkqLwogCQlzdGF0ZS0+Y29uZmlnID0gJmRzdF9jb25maWc7CiAJCXN0YXRlLT5pMmMgPSBjYXJkLT5pMmNfYWRhcHRlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKaW5kZXggNDc0NWE5MC4uZTc1ZjQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJjeDI0MTEwLmgiCiAjaW5jbHVkZSAib3I1MTIxMS5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCi0jaW5jbHVkZSAibGdfaDA2eGYuaCIKKyNpbmNsdWRlICJsZ2gwNnhmLmgiCiAjaW5jbHVkZSAiemwxMDM1My5oIgogCiBzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCmluZGV4IGZmN2Q0ZjU2Li5kNjRiOTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlICJkbXhkZXYuaCIKICNpbmNsdWRlICJkdmJfZGVtdXguaCIKQEAgLTEyNyw3ICsxMjgsNyBAQAogCiAJc3RydWN0IGR2YnRfc2V0X3BhcmFtZXRlcnNfbXNnIHBhcmFtOwogCXN0cnVjdCBkdmJ0X2dldF9zdGF0dXNfbXNnIHN0YXR1czsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcXVlcnlfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHF1ZXJ5X3dvcms7CiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBwb2xsX3dxOwogCWludCBwZW5kaW5nX2ZlX2V2ZW50czsKQEAgLTE0MSw3ICsxNDIsNyBAQAogI2lmZGVmIEVOQUJMRV9SQwogCXN0cnVjdCBpbnB1dF9kZXYgKnJjX2lucHV0X2RldjsKIAljaGFyIHBoeXNbNjRdOwotCXN0cnVjdCB3b3JrX3N0cnVjdCByY19xdWVyeV93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcmNfcXVlcnlfd29yazsKIAlpbnQgcmNfaW5wdXRfZXZlbnQ7CiAJdTMyIHJjX2xhc3RfY29kZTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfZXZlbnRfamlmZmllczsKQEAgLTI3NSw4ICsyNzYsNyBAQAogCWludCBpOwogCiAJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKQotCQlpZiAoY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKQotCQkJdXNiX2ZyZWVfdXJiKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSk7CisJCXVzYl9mcmVlX3VyYihjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pOwogCiAJdXNiX2J1ZmZlcl9mcmVlKGNpbmVyZ3l0Mi0+dWRldiwgU1RSRUFNX1VSQl9DT1VOVCpTVFJFQU1fQlVGX1NJWkUsCiAJCQkgICAgY2luZXJneXQyLT5zdHJlYW1idWYsIGNpbmVyZ3l0Mi0+c3RyZWFtYnVmX2RtYWhhbmRsZSk7CkBAIC0yODcsNyArMjg3LDcgQEAKIAlpbnQgaTsKIAogCWNpbmVyZ3l0Mi0+c3RyZWFtYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhjaW5lcmd5dDItPnVkZXYsIFNUUkVBTV9VUkJfQ09VTlQqU1RSRUFNX0JVRl9TSVpFLAotCQkJCQkgICAgICBTTEFCX0tFUk5FTCwgJmNpbmVyZ3l0Mi0+c3RyZWFtYnVmX2RtYWhhbmRsZSk7CisJCQkJCSAgICAgIEdGUF9LRVJORUwsICZjaW5lcmd5dDItPnN0cmVhbWJ1Zl9kbWFoYW5kbGUpOwogCWlmICghY2luZXJneXQyLT5zdHJlYW1idWYpIHsKIAkJZHByaW50aygxLCAiZmFpbGVkIHRvIGFsbG9jIGNvbnNpc3RlbnQgc3RyZWFtIG1lbW9yeSBhcmVhLCBiYWlsaW5nIG91dCFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTMyMCw4ICszMjAsNyBAQAogCWNpbmVyZ3l0Ml9jb250cm9sX3N0cmVhbV90cmFuc2ZlcihjaW5lcmd5dDIsIDApOwogCiAJZm9yIChpPTA7IGk8U1RSRUFNX1VSQl9DT1VOVDsgaSsrKQotCQlpZiAoY2luZXJneXQyLT5zdHJlYW1fdXJiW2ldKQotCQkJdXNiX2tpbGxfdXJiKGNpbmVyZ3l0Mi0+c3RyZWFtX3VyYltpXSk7CisJCXVzYl9raWxsX3VyYihjaW5lcmd5dDItPnN0cmVhbV91cmJbaV0pOwogfQogCiBzdGF0aWMgaW50IGNpbmVyZ3l0Ml9zdGFydF9zdHJlYW1feGZlciAoc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyKQpAQCAtNzI0LDkgKzcyMywxMCBAQAogCiAjaWZkZWYgRU5BQkxFX1JDCiAKLXN0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9xdWVyeV9yYyAodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGNpbmVyZ3l0Ml9xdWVyeV9yYyAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGRhdGE7CisJc3RydWN0IGNpbmVyZ3l0MiAqY2luZXJneXQyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjaW5lcmd5dDIsIHJjX3F1ZXJ5X3dvcmsud29yayk7CiAJY2hhciBidWZbMV0gPSB7IENJTkVSR1lUMl9FUDFfR0VUX1JDX0VWRU5UUyB9OwogCXN0cnVjdCBjaW5lcmd5dDJfcmNfZXZlbnQgcmNfZXZlbnRzWzEyXTsKIAlpbnQgbiwgbGVuLCBpOwpAQCAtNzQ2LDYgKzc0Niw3IEBACiAJCQkJZHByaW50aygxLCAicmNfaW5wdXRfZXZlbnQ9JWQgVXBcbiIsIGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQpOwogCQkJCWlucHV0X3JlcG9ydF9rZXkoY2luZXJneXQyLT5yY19pbnB1dF9kZXYsCiAJCQkJCQkgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCwgMCk7CisJCQkJaW5wdXRfc3luYyhjaW5lcmd5dDItPnJjX2lucHV0X2Rldik7CiAJCQkJY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCA9IEtFWV9NQVg7CiAJCQl9CiAJCQljaW5lcmd5dDItPnJjX2xhc3RfY29kZSA9IH4wOwpAQCAtNzgzLDYgKzc4NCw3IEBACiAJCQlkcHJpbnRrKDEsICJyY19pbnB1dF9ldmVudD0lZFxuIiwgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCk7CiAJCQlpbnB1dF9yZXBvcnRfa2V5KGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2LAogCQkJCQkgY2luZXJneXQyLT5yY19pbnB1dF9ldmVudCwgMSk7CisJCQlpbnB1dF9zeW5jKGNpbmVyZ3l0Mi0+cmNfaW5wdXRfZGV2KTsKIAkJCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gcmNfZXZlbnRzW25dLnZhbHVlOwogCQl9CiAJfQpAQCAtNzk4LDggKzgwMCw5IEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCWludCBpOworCWludCBlcnI7CiAKLQljaW5lcmd5dDItPnJjX2lucHV0X2RldiA9IGlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghaW5wdXRfZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtODA3LDcgKzgxMCw3IEBACiAJc3RybGNhdChjaW5lcmd5dDItPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGNpbmVyZ3l0Mi0+cGh5cykpOwogCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSBLRVlfTUFYOwogCWNpbmVyZ3l0Mi0+cmNfbGFzdF9jb2RlID0gfjA7Ci0JSU5JVF9XT1JLKCZjaW5lcmd5dDItPnJjX3F1ZXJ5X3dvcmssIGNpbmVyZ3l0Ml9xdWVyeV9yYywgY2luZXJneXQyKTsKKwlJTklUX0RFTEFZRURfV09SSygmY2luZXJneXQyLT5yY19xdWVyeV93b3JrLCBjaW5lcmd5dDJfcXVlcnlfcmMpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gRFJJVkVSX05BTUUgIiByZW1vdGUgY29udHJvbCI7CiAJaW5wdXRfZGV2LT5waHlzID0gY2luZXJneXQyLT5waHlzOwpAQCAtODE3LDcgKzgyMCwxMyBAQAogCWlucHV0X2Rldi0+a2V5Y29kZXNpemUgPSAwOwogCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IDA7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoY2luZXJneXQyLT5yY19pbnB1dF9kZXYpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnIpIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwljaW5lcmd5dDItPnJjX2lucHV0X2RldiA9IGlucHV0X2RldjsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNpbmVyZ3l0Mi0+cmNfcXVlcnlfd29yaywgSFovMik7CiAKIAlyZXR1cm4gMDsKQEAgLTg0OCw5ICs4NTcsMTAgQEAKIAogI2VuZGlmIC8qIEVOQUJMRV9SQyAqLwogCi1zdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnkgKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBjaW5lcmd5dDJfcXVlcnkgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgY2luZXJneXQyICpjaW5lcmd5dDIgPSAoc3RydWN0IGNpbmVyZ3l0MiAqKSBkYXRhOworCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2luZXJneXQyLCBxdWVyeV93b3JrLndvcmspOwogCWNoYXIgY21kIFtdID0geyBDSU5FUkdZVDJfRVAxX0dFVF9UVU5FUl9TVEFUVVMgfTsKIAlzdHJ1Y3QgZHZidF9nZXRfc3RhdHVzX21zZyAqcyA9ICZjaW5lcmd5dDItPnN0YXR1czsKIAl1aW50OF90IGxvY2tfYml0czsKQEAgLTg5NCw3ICs5MDQsNyBAQAogCiAJbXV0ZXhfaW5pdCgmY2luZXJneXQyLT5zZW0pOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZjaW5lcmd5dDItPnBvbGxfd3EpOwotCUlOSVRfV09SSygmY2luZXJneXQyLT5xdWVyeV93b3JrLCBjaW5lcmd5dDJfcXVlcnksIGNpbmVyZ3l0Mik7CisJSU5JVF9ERUxBWUVEX1dPUksoJmNpbmVyZ3l0Mi0+cXVlcnlfd29yaywgY2luZXJneXQyX3F1ZXJ5KTsKIAogCWNpbmVyZ3l0Mi0+dWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJY2luZXJneXQyLT5wYXJhbS5jbWQgPSBDSU5FUkdZVDJfRVAxX1NFVF9UVU5FUl9QQVJBTUVURVJTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL0tjb25maWcKaW5kZXggZTQ2ZWFlMy4uMTk5MGVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9LY29uZmlnCkBAIC0xOSw2ICsxOSw2IEBACiAJICBhbGxvdyB0aGUgY2FyZCBkcml2ZXJzIHRvIG9ubHkgbG9hZCB0aGUgZnJvbnRlbmQgbW9kdWxlcwogCSAgdGhleSByZXF1aXJlLiBUaGlzIHNhdmVzIHNldmVyYWwgS0J5dGVzIG9mIG1lbW9yeS4KIAotCSAgTm90ZTogWW91IHdpbGwgbmVlZCBtb3VkdWxlLWluaXQtdG9vbHMgdjMuMiBvciBsYXRlciBmb3IgdGhpcyBmZWF0dXJlLgorCSAgTm90ZTogWW91IHdpbGwgbmVlZCBtb2R1bGUtaW5pdC10b29scyB2My4yIG9yIGxhdGVyIGZvciB0aGlzIGZlYXR1cmUuCiAKIAkgIElmIHVuc3VyZSBzYXkgWS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggNTMzMDRlNi4uZTg1OTcyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKQEAgLTM0OCw3ICszNDgsNyBAQAogCiBzdGF0aWMgdm9pZCBkdmJfZnJvbnRlbmRfc3d6aWd6YWcoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7Ci0JZmVfc3RhdHVzX3QgczsKKwlmZV9zdGF0dXNfdCBzID0gMDsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwogCiAJLyogaWYgd2UndmUgZ290IG5vIHBhcmFtZXRlcnMsIGp1c3Qga2VlcCBpZGxpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYwppbmRleCA4ODU5YWI3Li5lYmY0ZGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCkBAIC0xMjcsNiArMTI3LDcgQEAKIAlpbnQgaW5fdXNlOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXUxNiBwaWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKIAlzdHJ1Y3QgZHZiX25ldCAqaG9zdDsKIAlzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eDsKIAlzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCAqc2VjZmVlZDsKQEAgLTExMjMsMTAgKzExMjQsMTEgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCB3cV9zZXRfbXVsdGljYXN0X2xpc3QgKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCB3cV9zZXRfbXVsdGljYXN0X2xpc3QgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgZHZiX25ldF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGR2Yl9uZXRfcHJpdiwgc2V0X211bHRpY2FzdF9saXN0X3dxKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmV0OwogCiAJZHZiX25ldF9mZWVkX3N0b3AoZGV2KTsKIAlwcml2LT5yeF9tb2RlID0gUlhfTU9ERV9VTkk7CkBAIC0xMTY3LDkgKzExNjksMTEgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCB3cV9yZXN0YXJ0X25ldF9mZWVkICh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgd3FfcmVzdGFydF9uZXRfZmVlZCAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBkdmJfbmV0X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGR2Yl9uZXRfcHJpdiwgcmVzdGFydF9uZXRfZmVlZF93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5ldDsKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJZHZiX25ldF9mZWVkX3N0b3AoZGV2KTsKQEAgLTEyNzYsNiArMTI4MCw3IEBACiAJZHZibmV0LT5kZXZpY2VbaWZfbnVtXSA9IG5ldDsKIAogCXByaXYgPSBuZXQtPnByaXY7CisJcHJpdi0+bmV0ID0gbmV0OwogCXByaXYtPmRlbXV4ID0gZHZibmV0LT5kZW11eDsKIAlwcml2LT5waWQgPSBwaWQ7CiAJcHJpdi0+cnhfbW9kZSA9IFJYX01PREVfVU5JOwpAQCAtMTI4NCw4ICsxMjg5LDggQEAKIAlwcml2LT5mZWVkdHlwZSA9IGZlZWR0eXBlOwogCXJlc2V0X3VsZShwcml2KTsKIAotCUlOSVRfV09SSygmcHJpdi0+c2V0X211bHRpY2FzdF9saXN0X3dxLCB3cV9zZXRfbXVsdGljYXN0X2xpc3QsIG5ldCk7Ci0JSU5JVF9XT1JLKCZwcml2LT5yZXN0YXJ0X25ldF9mZWVkX3dxLCB3cV9yZXN0YXJ0X25ldF9mZWVkLCBuZXQpOworCUlOSVRfV09SSygmcHJpdi0+c2V0X211bHRpY2FzdF9saXN0X3dxLCB3cV9zZXRfbXVsdGljYXN0X2xpc3QpOworCUlOSVRfV09SSygmcHJpdi0+cmVzdGFydF9uZXRfZmVlZF93cSwgd3FfcmVzdGFydF9uZXRfZmVlZCk7CiAJbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOwogCiAJbmV0LT5iYXNlX2FkZHIgPSBwaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKaW5kZXggMmNjNWNhYS4uYWQ1MjE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwpAQCAtMjYsNyArMjYsNyBAQAogCXRyaXN0YXRlICJBVmVyTWVkaWEgQXZlclRWIERWQi1UIFVTQiAyLjAgKEE4MDApIgogCWRlcGVuZHMgb24gRFZCX1VTQgogCXNlbGVjdCBEVkJfRElCMzAwME1DCi0Jc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAKKwlzZWxlY3QgRFZCX1RVTkVSX01UMjA2MCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgQVZlck1lZGlhIEF2ZXJUViBEVkItVCBVU0IgMi4wIChBODAwKSByZWNlaXZlci4KIApAQCAtMzQsNyArMzQsNyBAQAogCXRyaXN0YXRlICJEaUJjb20gVVNCIERWQi1UIGRldmljZXMgKGJhc2VkIG9uIHRoZSBEaUIzMDAwTS1CKSAoc2VlIGhlbHAgZm9yIGRldmljZSBsaXN0KSIKIAlkZXBlbmRzIG9uIERWQl9VU0IKIAlzZWxlY3QgRFZCX0RJQjMwMDBNQgotCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwCisJc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBVU0IgMS4xIGFuZCAyLjAgRFZCLVQgcmVjZWl2ZXJzIGJhc2VkIG9uIHJlZmVyZW5jZSBkZXNpZ25zIG1hZGUgYnkKIAkgIERpQmNvbSAoPGh0dHA6Ly93d3cuZGliY29tLmZyPikgZXF1aXBwZWQgd2l0aCBhIERpQjMwMDBNLUIgZGVtb2R1bGF0b3IuCkBAIC01NSw3ICs1NSw3IEBACiAJdHJpc3RhdGUgIkRpQmNvbSBVU0IgRFZCLVQgZGV2aWNlcyAoYmFzZWQgb24gdGhlIERpQjMwMDBNLUMvUCkgKHNlZSBoZWxwIGZvciBkZXZpY2UgbGlzdCkiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCiAJc2VsZWN0IERWQl9ESUIzMDAwTUMKLQlzZWxlY3QgRFZCX1RVTkVSX01UMjA2MAorCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgVVNCMi4wIERWQi1UIHJlY2VpdmVycyBiYXNlZCBvbiByZWZlcmVuY2UgZGVzaWducyBtYWRlIGJ5CiAJICBEaUJjb20gKDxodHRwOi8vd3d3LmRpYmNvbS5mcj4pIGVxdWlwcGVkIHdpdGggYSBEaUIzMDAwTS1DL1AgZGVtb2R1bGF0b3IuCkBAIC02OSw4ICs2OSwxMCBAQAogY29uZmlnIERWQl9VU0JfRElCMDcwMAogCXRyaXN0YXRlICJEaUJjb20gRGlCMDcwMCBVU0IgRFZCIGRldmljZXMgKHNlZSBoZWxwIGZvciBzdXBwb3J0ZWQgZGV2aWNlcykiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9ESUI3MDAwUAorCXNlbGVjdCBEVkJfRElCNzAwME0KIAlzZWxlY3QgRFZCX0RJQjMwMDBNQwotCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwCisJc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBVU0IyLjAvMS4xIERWQiByZWNlaXZlcnMgYmFzZWQgb24gdGhlIERpQjA3MDAgVVNCIGJyaWRnZS4gVGhlCiAJICBVU0IgYnJpZGdlIGlzIGFsc28gcHJlc2VudCBpbiBkZXZpY2VzIGhhdmluZyB0aGUgRGlCNzcwMCBEVkItVC1VU0IKQEAgLTg3LDcgKzg5LDcgQEAKIAl0cmlzdGF0ZSAiSGFuZlRlayBVTVQtMDEwIERWQi1UIFVTQjIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gRFZCX1VTQgogCXNlbGVjdCBEVkJfRElCMzAwME1DCi0Jc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAKKwlzZWxlY3QgRFZCX1RVTkVSX01UMjA2MCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgSGFuZlRlayBVTVQtMDEwIFVTQjIuMCBzdGljay1zaXplZCBEVkItVCByZWNlaXZlci4KIApAQCAtOTYsNiArOTgsNyBAQAogCWRlcGVuZHMgb24gRFZCX1VTQgogCXNlbGVjdCBEVkJfQ1gyMjcwMiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfTEdEVDMzMFggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1RVTkVSX0xHSDA2WEYgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX01UMzUyIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9aTDEwMzUzIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJaGVscApAQCAtMTUzLDEwICsxNTYsMjEgQEAKIAl0cmlzdGF0ZSAiSGF1cHBhdWdlIFdpblRWLU5PVkEtVCB1c2IyIERWQi1UIFVTQjIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gRFZCX1VTQgogCXNlbGVjdCBEVkJfRElCMzAwME1DCi0Jc2VsZWN0IERWQl9UVU5FUl9NVDIwNjAKKwlzZWxlY3QgRFZCX1RVTkVSX01UMjA2MCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgSGF1cHBhdWdlIFdpblRWLU5PVkEtVCB1c2IyIERWQi1UIFVTQjIuMCByZWNlaXZlci4KIAorY29uZmlnIERWQl9VU0JfVFRVU0IyCisJdHJpc3RhdGUgIlBpbm5hY2xlIDQwMGUgRFZCLVMgVVNCMi4wIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9UREExMDA4NiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfTE5CUDIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9UREE4MjZYIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBQaW5uYWNsZSA0MDBlIERWQi1TIFVTQjIuMCByZWNlaXZlci4gVGhlCisJICBmaXJtd2FyZSBwcm90b2NvbCB1c2VkIGJ5IHRoaXMgbW9kdWxlIGlzIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2VkIGJ5IHRoZQorCSAgb2xkIHR0dXNiLWRyaXZlciAtIHRoYXQncyB3aHkgdGhlIG1vZHVsZSBpcyBjYWxsZWQgZHZiLXVzYi10dHVzYjIua28uCisKIGNvbmZpZyBEVkJfVVNCX0RUVDIwMFUKIAl0cmlzdGF0ZSAiV2lkZVZpZXcgV1QtMjAwVSBhbmQgV1QtMjIwVSAocGVuKSBEVkItVCBVU0IyLjAgc3VwcG9ydCAoWWFrdW1vL0hhbWEvVHlwaG9vbi9ZdWFuKSIKIAlkZXBlbmRzIG9uIERWQl9VU0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCmluZGV4IGUyMzkxMDcuLjE1NGQ1OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQpAQCAtMzYsNiArMzYsOSBAQAogZHZiLXVzYi1jeHVzYi1vYmpzID0gY3h1c2Iubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfQ1hVU0IpICs9IGR2Yi11c2ItY3h1c2IubwogCitkdmItdXNiLXR0dXNiMi1vYmpzID0gdHR1c2IyLm8KK29iai0kKENPTkZJR19EVkJfVVNCX1RUVVNCMikgKz0gZHZiLXVzYi10dHVzYjIubworCiBkdmItdXNiLWRpYjA3MDAtb2JqcyA9IGRpYjA3MDBfY29yZS5vIGRpYjA3MDBfZGV2aWNlcy5vCiBvYmotJChDT05GSUdfRFZCX1VTQl9ESUIwNzAwKSArPSBkdmItdXNiLWRpYjA3MDAubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2E4MDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCmluZGV4IDJlZDNlYjYuLmE2YzVmMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCkBAIC0xMTYsMjQgKzExNiwyNCBAQAogCQl7CiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKLQkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYjJfMF9zdHJlYW1pbmdfY3RybCwKLQkucGlkX2ZpbHRlciAgICAgICA9IGRpYnVzYl9waWRfZmlsdGVyLAotCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAorCQkJLnBpZF9maWx0ZXIgICAgICAgPSBkaWJ1c2JfcGlkX2ZpbHRlciwKKwkJCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKIAotCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtY19mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBkaWJ1c2JfZGliMzAwMG1jX3R1bmVyX2F0dGFjaCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtY19mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWNfdHVuZXJfYXR0YWNoLAogCi0JLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwotCQkJLnN0cmVhbSA9IHsKLQkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSA3LAotCQkuZW5kcG9pbnQgPSAweDA2LAotCQkudSA9IHsKLQkJCS5idWxrID0gewotCQkJCS5idWZmZXJzaXplID0gNDA5NiwKLQkJCX0KLQkJfQotCX0sCisJCQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJCQkJCS5zdHJlYW0gPSB7CisJCQkJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJCS5jb3VudCA9IDcsCisJCQkJLmVuZHBvaW50ID0gMHgwNiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCisJCQkJCX0KKwkJCQl9CisJCQl9LAogCiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwppbmRleCA0M2YzOTA2Li4xNWQxMmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC0xNCwxMiArMTQsMTIgQEAKICAqIFRPRE86IFVzZSB0aGUgY3gyNTg0MC1kcml2ZXIgZm9yIHRoZSBhbmFsb2d1ZSBwYXJ0CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQotICogQ29weXJpZ2h0IChDKSAyMDA1IE1pY2hhZWwgS3J1Zmt5IChta3J1Zmt5QG0xay5uZXQpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCBLcnVma3kgKG1rcnVma3lAbGludXh0di5vcmcpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ2hyaXMgUGFzY29lIChjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdSkKICAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqCVNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgogICoKICAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICovCkBAIC0yNywyOSArMjcsMjkgQEAKIAogI2luY2x1ZGUgImN4MjI3MDIuaCIKICNpbmNsdWRlICJsZ2R0MzMweC5oIgotI2luY2x1ZGUgImxnX2gwNnhmLmgiCisjaW5jbHVkZSAibGdoMDZ4Zi5oIgogI2luY2x1ZGUgIm10MzUyLmgiCiAjaW5jbHVkZSAibXQzNTJfcHJpdi5oIgogI2luY2x1ZGUgInpsMTAzNTMuaCIKIAogLyogZGVidWcgKi8KIGludCBkdmJfdXNiX2N4dXNiX2RlYnVnOwotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGR2Yl91c2JfY3h1c2JfZGVidWcsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGR2Yl91c2JfY3h1c2JfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1yYyAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOwogCiBzdGF0aWMgaW50IGN4dXNiX2N0cmxfbXNnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwKLQkJdTggY21kLCB1OCAqd2J1ZiwgaW50IHdsZW4sIHU4ICpyYnVmLCBpbnQgcmxlbikKKwkJCSAgdTggY21kLCB1OCAqd2J1ZiwgaW50IHdsZW4sIHU4ICpyYnVmLCBpbnQgcmxlbikKIHsKIAlpbnQgd28gPSAocmJ1ZiA9PSBOVUxMIHx8IHJsZW4gPT0gMCk7IC8qIHdyaXRlLW9ubHkgKi8KIAl1OCBzbmRidWZbMSt3bGVuXTsKLQltZW1zZXQoc25kYnVmLDAsMSt3bGVuKTsKKwltZW1zZXQoc25kYnVmLCAwLCAxK3dsZW4pOwogCiAJc25kYnVmWzBdID0gY21kOwotCW1lbWNweSgmc25kYnVmWzFdLHdidWYsd2xlbik7CisJbWVtY3B5KCZzbmRidWZbMV0sIHdidWYsIHdsZW4pOwogCWlmICh3bykKLQkJZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsc25kYnVmLDErd2xlbik7CisJCWR2Yl91c2JfZ2VuZXJpY193cml0ZShkLCBzbmRidWYsIDErd2xlbik7CiAJZWxzZQotCQlkdmJfdXNiX2dlbmVyaWNfcncoZCxzbmRidWYsMSt3bGVuLHJidWYscmxlbiwwKTsKKwkJZHZiX3VzYl9nZW5lcmljX3J3KGQsIHNuZGJ1ZiwgMSt3bGVuLCByYnVmLCBybGVuLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTgsMTQgKzU4LDE0IEBACiBzdGF0aWMgdm9pZCBjeHVzYl9ncGlvX3R1bmVyKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQogewogCXN0cnVjdCBjeHVzYl9zdGF0ZSAqc3QgPSBkLT5wcml2OwotCXU4IG9bMl0saTsKKwl1OCBvWzJdLCBpOwogCiAJaWYgKHN0LT5ncGlvX3dyaXRlX3N0YXRlW0dQSU9fVFVORVJdID09IG9ub2ZmKQogCQlyZXR1cm47CiAKIAlvWzBdID0gR1BJT19UVU5FUjsKIAlvWzFdID0gb25vZmY7Ci0JY3h1c2JfY3RybF9tc2coZCxDTURfR1BJT19XUklURSxvLDIsJmksMSk7CisJY3h1c2JfY3RybF9tc2coZCwgQ01EX0dQSU9fV1JJVEUsIG8sIDIsICZpLCAxKTsKIAogCWlmIChpICE9IDB4MDEpCiAJCWRlYl9pbmZvKCJncGlvX3dyaXRlIGZhaWxlZC5cbiIpOwpAQCAtNzQsNyArNzQsOCBAQAogfQogCiAvKiBJMkMgKi8KLXN0YXRpYyBpbnQgY3h1c2JfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLHN0cnVjdCBpMmNfbXNnIG1zZ1tdLGludCBudW0pCitzdGF0aWMgaW50IGN4dXNiX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sCisJCQkgIGludCBudW0pCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKIAlpbnQgaTsKQEAgLTg5LDEyICs5MCwxMiBAQAogCiAJCWlmIChkLT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yID09IFVTQl9WSURfTUVESU9OKQogCQkJc3dpdGNoIChtc2dbaV0uYWRkcikgewotCQkJCWNhc2UgMHg2MzoKLQkJCQkJY3h1c2JfZ3Bpb190dW5lcihkLDApOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQljeHVzYl9ncGlvX3R1bmVyKGQsMSk7Ci0JCQkJCWJyZWFrOworCQkJY2FzZSAweDYzOgorCQkJCWN4dXNiX2dwaW9fdHVuZXIoZCwgMCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWN4dXNiX2dwaW9fdHVuZXIoZCwgMSk7CisJCQkJYnJlYWs7CiAJCQl9CiAKIAkJLyogcmVhZCByZXF1ZXN0ICovCkBAIC0xMDMsMjYgKzEwNCwyNyBAQAogCQkJb2J1ZlswXSA9IG1zZ1tpXS5sZW47CiAJCQlvYnVmWzFdID0gbXNnW2krMV0ubGVuOwogCQkJb2J1ZlsyXSA9IG1zZ1tpXS5hZGRyOwotCQkJbWVtY3B5KCZvYnVmWzNdLG1zZ1tpXS5idWYsbXNnW2ldLmxlbik7CisJCQltZW1jcHkoJm9idWZbM10sIG1zZ1tpXS5idWYsIG1zZ1tpXS5sZW4pOwogCiAJCQlpZiAoY3h1c2JfY3RybF9tc2coZCwgQ01EX0kyQ19SRUFELAotCQkJCQkJb2J1ZiwgMyttc2dbaV0ubGVuLAotCQkJCQkJaWJ1ZiwgMSttc2dbaSsxXS5sZW4pIDwgMCkKKwkJCQkJICAgb2J1ZiwgMyttc2dbaV0ubGVuLAorCQkJCQkgICBpYnVmLCAxK21zZ1tpKzFdLmxlbikgPCAwKQogCQkJCWJyZWFrOwogCiAJCQlpZiAoaWJ1ZlswXSAhPSAweDA4KQogCQkJCWRlYl9pMmMoImkyYyByZWFkIG1heSBoYXZlIGZhaWxlZFxuIik7CiAKLQkJCW1lbWNweShtc2dbaSsxXS5idWYsJmlidWZbMV0sbXNnW2krMV0ubGVuKTsKKwkJCW1lbWNweShtc2dbaSsxXS5idWYsICZpYnVmWzFdLCBtc2dbaSsxXS5sZW4pOwogCiAJCQlpKys7CiAJCX0gZWxzZSB7IC8qIHdyaXRlICovCiAJCQl1OCBvYnVmWzIrbXNnW2ldLmxlbl0sIGlidWY7CiAJCQlvYnVmWzBdID0gbXNnW2ldLmFkZHI7CiAJCQlvYnVmWzFdID0gbXNnW2ldLmxlbjsKLQkJCW1lbWNweSgmb2J1ZlsyXSxtc2dbaV0uYnVmLG1zZ1tpXS5sZW4pOworCQkJbWVtY3B5KCZvYnVmWzJdLCBtc2dbaV0uYnVmLCBtc2dbaV0ubGVuKTsKIAotCQkJaWYgKGN4dXNiX2N0cmxfbXNnKGQsQ01EX0kyQ19XUklURSwgb2J1ZiwgMittc2dbaV0ubGVuLCAmaWJ1ZiwxKSA8IDApCisJCQlpZiAoY3h1c2JfY3RybF9tc2coZCwgQ01EX0kyQ19XUklURSwgb2J1ZiwKKwkJCQkJICAgMittc2dbaV0ubGVuLCAmaWJ1ZiwxKSA8IDApCiAJCQkJYnJlYWs7CiAJCQlpZiAoaWJ1ZiAhPSAweDA4KQogCQkJCWRlYl9pMmMoImkyYyB3cml0ZSBtYXkgaGF2ZSBmYWlsZWRcbiIpOwpAQCAtMzI0LDE2ICszMjYsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGN4dXNiX2xnaDA2NGZfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKLQkJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKLXsKLQlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gZmUtPmR2Yi0+cHJpdjsKLQlyZXR1cm4gbGdfaDA2eGZfcGxsX3NldChmZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIGZlcCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgY3h1c2JfY3gyMjcwMl9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDYzLAotCiAJLm91dHB1dF9tb2RlID0gQ1gyMjcwMl9QQVJBTExFTF9PVVRQVVQsCiB9OwogCkBAIC0zNzQsMzEgKzM2OCwyNyBAQAogCiBzdGF0aWMgaW50IGN4dXNiX2RlZTE2MDFfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0JYWRhcC0+cGxsX2FkZHIgPSAweDYxOwotCWFkYXAtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5OwotCWFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncyA9IGR2Yl91c2JfdHVuZXJfY2FsY19yZWdzOworCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLAorCQkgICBOVUxMLCAmZHZiX3BsbF90aG9tc29uX2R0dDc1NzkpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGN4dXNiX2xnejIwMV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlhZGFwLT5wbGxfYWRkciA9IDB4NjE7Ci0JYWRhcC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9sZ196MjAxOwotCWFkYXAtPmZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncyA9IGR2Yl91c2JfdHVuZXJfY2FsY19yZWdzOworCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCBOVUxMLCAmZHZiX3BsbF9sZ196MjAxKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjeHVzYl9kdHQ3NTc5X3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWFkYXAtPnBsbF9hZGRyID0gMHg2MDsKLQlhZGFwLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OTsKLQlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MgPSBkdmJfdXNiX3R1bmVyX2NhbGNfcmVnczsKKwlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwKKwkJICAgTlVMTCwgJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjeHVzYl9sZ2R0MzMwM190dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3N0YXRpYyBpbnQgY3h1c2JfbGdoMDY0Zl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlhZGFwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gY3h1c2JfbGdoMDY0Zl90dW5lcl9zZXRfcGFyYW1zOworCWR2Yl9hdHRhY2gobGdoMDZ4Zl9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxMCw3ICs0MDAsOCBAQAogCiAJY3h1c2JfY3RybF9tc2coYWRhcC0+ZGV2LCBDTURfRElHSVRBTCwgTlVMTCwgMCwgJmIsIDEpOwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2goY3gyMjcwMl9hdHRhY2gsICZjeHVzYl9jeDIyNzAyX2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApKSAhPSBOVUxMKQorCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGN4MjI3MDJfYXR0YWNoLCAmY3h1c2JfY3gyMjcwMl9jb25maWcsCisJCQkJICAgJmFkYXAtPmRldi0+aTJjX2FkYXApKSAhPSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAtRUlPOwpAQCAtNDIzLDcgKzQxNCw4IEBACiAKIAljeHVzYl9jdHJsX21zZyhhZGFwLT5kZXYsIENNRF9ESUdJVEFMLCBOVUxMLCAwLCBOVUxMLCAwKTsKIAotCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGxnZHQzMzB4X2F0dGFjaCwgJmN4dXNiX2xnZHQzMzAzX2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApKSAhPSBOVUxMKQorCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGxnZHQzMzB4X2F0dGFjaCwgJmN4dXNiX2xnZHQzMzAzX2NvbmZpZywKKwkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU87CkBAIC00MzcsNyArNDI5LDggQEAKIAogCWN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwgQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmY3h1c2JfbXQzNTJfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpCisJaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmY3h1c2JfbXQzNTJfY29uZmlnLAorCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTzsKQEAgLTQ1MCw4ICs0NDMsMTEgQEAKIAogCWN4dXNiX2N0cmxfbXNnKGFkYXAtPmRldiwgQ01EX0RJR0lUQUwsIE5VTEwsIDAsIE5VTEwsIDApOwogCi0JaWYgKCgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwgJmN4dXNiX2RlZTE2MDFfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpIHx8Ci0JCSgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLCAmY3h1c2JfemwxMDM1M19kZWUxNjAxX2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApKSAhPSBOVUxMKSkKKwlpZiAoKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmY3h1c2JfZGVlMTYwMV9jb25maWcsCisJCQkJICAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgIT0gTlVMTCkgfHwKKwkJKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCisJCQkJCSZjeHVzYl96bDEwMzUzX2RlZTE2MDFfY29uZmlnLAorCQkJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAtRUlPOwpAQCAtNDYzLDcgKzQ1OSw4IEBACiAgKi8KIAogI2RlZmluZSBCTFVFQklSRF8wMV9JRF9PRkZTRVQgNjYzOAotc3RhdGljIGludCBibHVlYmlyZF9wYXRjaF9kdmljb19maXJtd2FyZV9kb3dubG9hZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3N0YXRpYyBpbnQgYmx1ZWJpcmRfcGF0Y2hfZHZpY29fZmlybXdhcmVfZG93bmxvYWQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCQkJCQkgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCiB7CiAJaWYgKGZ3LT5zaXplIDwgQkxVRUJJUkRfMDFfSURfT0ZGU0VUICsgNCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NzEsMTAgKzQ2OCwxMiBAQAogCWlmIChmdy0+ZGF0YVtCTFVFQklSRF8wMV9JRF9PRkZTRVRdID09IChVU0JfVklEX0RWSUNPICYgMHhmZikgJiYKIAkgICAgZnctPmRhdGFbQkxVRUJJUkRfMDFfSURfT0ZGU0VUICsgMV0gPT0gVVNCX1ZJRF9EVklDTyA+PiA4KSB7CiAKLQkJZnctPmRhdGFbQkxVRUJJUkRfMDFfSURfT0ZGU0VUICsgMl0gPSB1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCArIDE7Ci0JCWZ3LT5kYXRhW0JMVUVCSVJEXzAxX0lEX09GRlNFVCArIDNdID0gdWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPj4gODsKKwkJZnctPmRhdGFbQkxVRUJJUkRfMDFfSURfT0ZGU0VUICsgMl0gPQorCQkJdWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgKyAxOworCQlmdy0+ZGF0YVtCTFVFQklSRF8wMV9JRF9PRkZTRVQgKyAzXSA9CisJCQl1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA+PiA4OwogCi0JCXJldHVybiB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHVkZXYsZncsQ1lQUkVTU19GWDIpOworCQlyZXR1cm4gdXNiX2N5cHJlc3NfbG9hZF9maXJtd2FyZSh1ZGV2LCBmdywgQ1lQUkVTU19GWDIpOwogCX0KIAogCXJldHVybiAtRUlOVkFMOwpAQCAtNDg4LDcgKzQ4Nyw3IEBACiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgY3h1c2JfYmx1ZWJpcmRfZHR0NzU3OV9wcm9wZXJ0aWVzOwogCiBzdGF0aWMgaW50IGN4dXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAotCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJaWYgKGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmY3h1c2JfbWVkaW9uX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCkgPT0gMCB8fAogCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmN4dXNiX2JsdWViaXJkX2xnaDA2NGZfcHJvcGVydGllcyxUSElTX01PRFVMRSxOVUxMKSA9PSAwIHx8CkBAIC01MDIsMjAgKzUwMSwyMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgY3h1c2JfdGFibGUgW10gPSB7Ci0JCXsgVVNCX0RFVklDRShVU0JfVklEX01FRElPTiwgVVNCX1BJRF9NRURJT05fTUQ5NTcwMCkgfSwKLQkJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEcwNjRGX0NPTEQpIH0sCi0JCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHMDY0Rl9XQVJNKSB9LAotCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVUFMXzFfQ09MRCkgfSwKLQkJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfRFVBTF8xX1dBUk0pIH0sCi0JCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHWjIwMV9DT0xEKSB9LAotCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MR1oyMDFfV0FSTSkgfSwKLQkJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfVEg3NTc5X0NPTEQpIH0sCi0JCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX1RINzU3OV9XQVJNKSB9LAotCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9ESUdJVEFMTk9XX0JMVUVCSVJEX0RVQUxfMV9DT0xEKSB9LAotCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9ESUdJVEFMTk9XX0JMVUVCSVJEX0RVQUxfMV9XQVJNKSB9LAotCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVUFMXzJfQ09MRCkgfSwKLQkJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfRFVBTF8yX1dBUk0pIH0sCi0JCXt9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworCXsgVVNCX0RFVklDRShVU0JfVklEX01FRElPTiwgVVNCX1BJRF9NRURJT05fTUQ5NTcwMCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MRzA2NEZfQ09MRCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MRzA2NEZfV0FSTSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVUFMXzFfQ09MRCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVUFMXzFfV0FSTSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MR1oyMDFfQ09MRCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MR1oyMDFfV0FSTSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9USDc1NzlfQ09MRCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9EVklDT19CTFVFQklSRF9USDc1NzlfV0FSTSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9EVklDTywgVVNCX1BJRF9ESUdJVEFMTk9XX0JMVUVCSVJEX0RVQUxfMV9DT0xEKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVklEX0RWSUNPLCBVU0JfUElEX0RJR0lUQUxOT1dfQkxVRUJJUkRfRFVBTF8xX1dBUk0pIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfRFVBTF8yX0NPTEQpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfRFZJQ08sIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfRFVBTF8yX1dBUk0pIH0sCisJe30JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBjeHVzYl90YWJsZSk7CiAKQEAgLTUyOSwyMCArNTI4LDIwIEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKLQkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAotCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfY3gyMjcwMl9mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9mbWQxMjE2bWVfdHVuZXJfYXR0YWNoLAotCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KLQkJCS5zdHJlYW0gPSB7Ci0JCQkJLnR5cGUgPSBVU0JfQlVMSywKLQkJLmNvdW50ID0gNSwKLQkJLmVuZHBvaW50ID0gMHgwMiwKLQkJLnUgPSB7Ci0JCQkuYnVsayA9IHsKLQkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCi0JCQl9Ci0JCX0KLQl9LAorCQkJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfY3gyMjcwMl9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX2ZtZDEyMTZtZV90dW5lcl9hdHRhY2gsCisJCQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJCQkJCS5zdHJlYW0gPSB7CisJCQkJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJCS5jb3VudCA9IDUsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCisJCQkJCX0KKwkJCQl9CisJCQl9LAogCiAJCX0sCiAJfSwKQEAgLTU3NSwyMSArNTc0LDIxIEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKLQkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAotCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfbGdkdDMzMDNfZnJvbnRlbmRfYXR0YWNoLAotCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfbGdkdDMzMDNfdHVuZXJfYXR0YWNoLAorCQkJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfbGdkdDMzMDNfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9sZ2gwNjRmX3R1bmVyX2F0dGFjaCwKIAotCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KLQkJCS5zdHJlYW0gPSB7Ci0JCQkJLnR5cGUgPSBVU0JfQlVMSywKLQkJLmNvdW50ID0gNSwKLQkJLmVuZHBvaW50ID0gMHgwMiwKLQkJLnUgPSB7Ci0JCQkuYnVsayA9IHsKLQkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCi0JCQl9Ci0JCX0KLQl9LAorCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJCQkuc3RyZWFtID0geworCQkJCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCQkuY291bnQgPSA1LAorCQkJCS5lbmRwb2ludCA9IDB4MDIsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSA4MTkyLAorCQkJCQl9CisJCQkJfQorCQkJfSwKIAkJfSwKIAl9LAogCkBAIC02MjcsMjAgKzYyNiwyMCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7Ci0JLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKLQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2RlZTE2MDFfZnJvbnRlbmRfYXR0YWNoLAotCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfZGVlMTYwMV90dW5lcl9hdHRhY2gsCi0JLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfZGVlMTYwMV9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX2RlZTE2MDFfdHVuZXJfYXR0YWNoLAorCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKIAkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSA1LAotCQkuZW5kcG9pbnQgPSAweDA0LAotCQkudSA9IHsKLQkJCS5idWxrID0gewotCQkJCS5idWZmZXJzaXplID0gODE5MiwKLQkJCX0KLQkJfQotCX0sCisJCQkJLmNvdW50ID0gNSwKKwkJCQkuZW5kcG9pbnQgPSAweDA0LAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gODE5MiwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCiAJCX0sCiAJfSwKIApAQCAtNjg2LDIxICs2ODUsMjEgQEAKIAkubnVtX2FkYXB0ZXJzID0gMiwKIAkuYWRhcHRlciA9IHsKIAkJewotCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCi0JLmZyb250ZW5kX2F0dGFjaCAgPSBjeHVzYl9tdDM1Ml9mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9sZ3oyMDFfdHVuZXJfYXR0YWNoLAorCQkJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfbXQzNTJfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9sZ3oyMDFfdHVuZXJfYXR0YWNoLAogCi0JLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKIAkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSA1LAotCQkuZW5kcG9pbnQgPSAweDA0LAotCQkudSA9IHsKLQkJCS5idWxrID0gewotCQkJCS5idWZmZXJzaXplID0gODE5MiwKLQkJCX0KLQkJfQotCX0sCisJCQkJLmNvdW50ID0gNSwKKwkJCQkuZW5kcG9pbnQgPSAweDA0LAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gODE5MiwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCiAJCX0sCiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGN4dXNiX2JsdWViaXJkX3Bvd2VyX2N0cmwsCkBAIC03MzYsMjEgKzczNSwyMSBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7Ci0JLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKLQkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX210MzUyX2Zyb250ZW5kX2F0dGFjaCwKLQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX2R0dDc1NzlfdHVuZXJfYXR0YWNoLAorCQkJLnN0cmVhbWluZ19jdHJsICAgPSBjeHVzYl9zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfbXQzNTJfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBjeHVzYl9kdHQ3NTc5X3R1bmVyX2F0dGFjaCwKIAotCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKLQkJLmNvdW50ID0gNSwKLQkJLmVuZHBvaW50ID0gMHgwNCwKLQkJLnUgPSB7Ci0JCQkuYnVsayA9IHsKLQkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCi0JCQl9Ci0JCX0KLQl9LAorCQkJCS5jb3VudCA9IDUsCisJCQkJLmVuZHBvaW50ID0gMHgwNCwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCisJCQkJCX0KKwkJCQl9CisJCQl9LAogCQl9LAogCX0sCiAJLnBvd2VyX2N0cmwgICAgICAgPSBjeHVzYl9ibHVlYmlyZF9wb3dlcl9jdHJsLApAQCAtNzc2LDcgKzc3NSw3IEBACiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY3h1c2JfZHJpdmVyID0gewogCS5uYW1lCQk9ICJkdmJfdXNiX2N4dXNiIiwKIAkucHJvYmUJCT0gY3h1c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5kaXNjb25uZWN0ICAgICA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCiAJLmlkX3RhYmxlCT0gY3h1c2JfdGFibGUsCiB9OwogCkBAIC04MDIsNyArODAxLDcgQEAKIG1vZHVsZV9leGl0IChjeHVzYl9tb2R1bGVfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPiIpOwotTU9EVUxFX0FVVEhPUigiTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4iKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgS3J1Zmt5IDxta3J1Zmt5QGxpbnV4dHYub3JnPiIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBDb25leGFudCBVU0IyLjAgaHlicmlkIHJlZmVyZW5jZSBkZXNpZ24iKTsKIE1PRFVMRV9WRVJTSU9OKCIxLjAtYWxwaGEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwLmgKaW5kZXggYWM4NDM0Ny4uY2RhM2FkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwLmgKQEAgLTI0LDE4ICsyNCwyMyBAQAogI2RlZmluZSBSRVFVRVNUX0kyQ19XUklURSAgICAweDMKICNkZWZpbmUgUkVRVUVTVF9QT0xMX1JDICAgICAgMHg0CiAjZGVmaW5lIFJFUVVFU1RfSlVNUFJBTSAgICAgIDB4OAorI2RlZmluZSBSRVFVRVNUX1NFVF9DTE9DSyAgICAweEIKICNkZWZpbmUgUkVRVUVTVF9TRVRfR1BJTyAgICAgMHhDCiAjZGVmaW5lIFJFUVVFU1RfRU5BQkxFX1ZJREVPIDB4RgogCS8vIDEgQnl0ZTogNE1TQigxID0gZW5hYmxlIHN0cmVhbWluZywgMCA9IGRpc2FibGUgc3RyZWFtaW5nKSA0TFNCKFZpZGVvIE1vZGU6IDAgPSBNUEVHMiAxODhCeXRlcywgMSA9IEFuYWxvZykKIAkvLyAyIEJ5dGU6IE1QRUcyIG1vZGU6ICA0TVNCKDEgPSBNYXN0ZXIgTW9kZSwgMCA9IFNsYXZlIE1vZGUpIDRMU0IoQ2hhbm5lbCAxID0gYml0MCwgQ2hhbm5lbCAyID0gYml0MSkKIAkvLyAyIEJ5dGU6IEFuYWxvZyBtb2RlOiA0TVNCKDAgPSA2MjUgbGluZXMsIDEgPSA1MjUgbGluZXMpICAgIDRMU0IoICAgICAiICAgICAgICAgICAgICAgICIgICAgICAgICAgICkKKyNkZWZpbmUgUkVRVUVTVF9HRVRfVkVSU0lPTiAgMHgxNQogCiBzdHJ1Y3QgZGliMDcwMF9zdGF0ZSB7CiAJdTggY2hhbm5lbF9zdGF0ZTsKIAl1MTYgbXQyMDYwX2lmMVsyXTsKKworCXU4IGlzX2RpYjcwMDBwYzsKIH07CiAKIGV4dGVybiBpbnQgZGliMDcwMF9zZXRfZ3BpbyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiwgZW51bSBkaWIwN3gwX2dwaW9zIGdwaW8sIHU4IGdwaW9fZGlyLCB1OCBncGlvX3ZhbCk7CitleHRlcm4gaW50IGRpYjA3MDBfY3RybF9jbG9jayhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiBjbGtfTUh6LCB1OCBjbG9ja19vdXRfZ3AzKTsKIGV4dGVybiBpbnQgZGliMDcwMF9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyk7CiBleHRlcm4gaW50IGRpYjA3MDBfc3RyZWFtaW5nX2N0cmwoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCwgaW50IG9ub2ZmKTsKIGV4dGVybiBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkaWIwNzAwX2kyY19hbGdvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKaW5kZXggZGNhNmM2OS4uNmE0ZDE1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCkBAIC0xMzUsMTQgKzEzNSw0NiBAQAogaW50IGRpYjA3MDBfaWRlbnRpZnlfc3RhdGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzICpwcm9wcywKIAkJCXN0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiAqKmRlc2MsIGludCAqY29sZCkKIHsKLQl1OCBidWZbM10gPSB7IFJFUVVFU1RfU0VUX0dQSU8sIDQsIChHUElPX0lOIDw8IDcpIHwgKDAgPDwgNikgfTsgLy8gR1BJTzQgaXMgc2F2ZSAtIHVzZWQgZm9yIEkyQwotCSpjb2xkID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LDApLAotCQlidWZbMF0sIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VULCAwLCAwLCBidWYsIDMsIFVTQl9DVFJMX0dFVF9USU1FT1VUKSAhPSAzOworCXU4IGJbMTZdOworCXMxNiByZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsMCksCisJCVJFUVVFU1RfR0VUX1ZFUlNJT04sIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4sIDAsIDAsIGIsIDE2LCBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisKKwlkZWJfaW5mbygiRlcgR0VUX1ZFUlNJT04gbGVuZ3RoOiAlZFxuIixyZXQpOworCisJKmNvbGQgPSByZXQgPD0gMDsKIAogCWRlYl9pbmZvKCJjb2xkOiAlZFxuIiwgKmNvbGQpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRpYjA3MDBfc2V0X2Nsb2NrKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggZW5fcGxsLAorCXU4IHBsbF9zcmMsIHU4IHBsbF9yYW5nZSwgdTggY2xvY2tfZ3BpbzMsIHUxNiBwbGxfcHJlZGl2LAorCXUxNiBwbGxfbG9vcGRpdiwgdTE2IGZyZWVfZGl2LCB1MTYgZHN1U2NhbGVyKQoreworCXU4IGJbMTBdOworCWJbMF0gPSBSRVFVRVNUX1NFVF9DTE9DSzsKKwliWzFdID0gKGVuX3BsbCA8PCA3KSB8IChwbGxfc3JjIDw8IDYpIHwgKHBsbF9yYW5nZSA8PCA1KSB8IChjbG9ja19ncGlvMyA8PCA0KTsKKwliWzJdID0gKHBsbF9wcmVkaXYgPj4gOCkgICYgMHhmZjsgLy8gTVNCCisJYlszXSA9ICBwbGxfcHJlZGl2ICAgICAgICAmIDB4ZmY7IC8vIExTQgorCWJbNF0gPSAocGxsX2xvb3BkaXYgPj4gOCkgJiAweGZmOyAvLyBNU0IKKwliWzVdID0gIHBsbF9sb29wZGl2ICAgICAgICYgMHhmZjsgLy8gTFNCCisJYls2XSA9IChmcmVlX2RpdiA+PiA4KSAgICAmIDB4ZmY7IC8vIE1TQgorCWJbN10gPSAgZnJlZV9kaXYgICAgICAgICAgJiAweGZmOyAvLyBMU0IKKwliWzhdID0gKGRzdVNjYWxlciA+PiA4KSAgICYgMHhmZjsgLy8gTVNCCisJYls5XSA9ICBkc3VTY2FsZXIgICAgICAgICAmIDB4ZmY7IC8vIExTQgorCisJcmV0dXJuIGRpYjA3MDBfY3RybF93cihkLCBiLCAxMCk7Cit9CisKK2ludCBkaWIwNzAwX2N0cmxfY2xvY2soc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgY2xrX01IeiwgdTggY2xvY2tfb3V0X2dwMykKK3sKKwlzd2l0Y2ggKGNsa19NSHopIHsKKwkJY2FzZSA3MjogZGliMDcwMF9zZXRfY2xvY2soZCwgMSwgMCwgMSwgY2xvY2tfb3V0X2dwMywgMiwgMjQsIDAsIDB4NGMpOyBicmVhazsKKwkJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRpYjA3MDBfanVtcHJhbShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTMyIGFkZHJlc3MpCiB7CiAJaW50IHJldCwgYWN0bGVuOwpAQCAtMTk3LDcgKzIyOSw3IEBACiAJCS8qIHN0YXJ0IHRoZSBmaXJtd2FyZSAqLwogCQlpZiAoKHJldCA9IGRpYjA3MDBfanVtcHJhbSh1ZGV2LCAweDcwMDAwMDAwKSkgPT0gMCkgewogCQkJaW5mbygiZmlybXdhcmUgc3RhcnRlZCBzdWNjZXNzZnVsbHkuIik7Ci0JCQltc2xlZXAoMTAwKTsKKwkJCW1zbGVlcCg1MDApOwogCQl9CiAJfSBlbHNlCiAJCXJldCA9IC1FSU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYwppbmRleCBlNDczYmZlLi4yMjA4NzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKQEAgLTksNiArOSw4IEBACiAjaW5jbHVkZSAiZGliMDcwMC5oIgogCiAjaW5jbHVkZSAiZGliMzAwMG1jLmgiCisjaW5jbHVkZSAiZGliNzAwMG0uaCIKKyNpbmNsdWRlICJkaWI3MDAwcC5oIgogI2luY2x1ZGUgIm10MjA2MC5oIgogCiBzdGF0aWMgaW50IGZvcmNlX2xuYV9hY3RpdmF0aW9uOwpAQCAtOTUsMzcgKzk3LDE4OSBAQAogfQogCiAvKiBTVEs3NzAwUDogSGF1cHBhdWdlIE5vdmEtVCBTdGljaywgQVZlck1lZGlhIFZvbGFyICovCi0vKgotc3RhdGljIHN0cnVjdCBtdDIwNjBfY29uZmlnIHN0azcwMDBwX210MjA2MF9jb25maWcgPSB7Ci0JMHg2MAorc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgc3RrNzcwMHBfNzAwMG1fbXQyMDYwX2FnY19jb25maWcgPSB7CisJQkFORF9VSEYgfCBCQU5EX1ZIRiwgICAgICAgLy8gYmFuZF9jYXBzCisKKwkvKiBQX2FnY191c2Vfc2RfbW9kMT0wLCBQX2FnY191c2Vfc2RfbW9kMj0wLCBQX2FnY19mcmVxX3B3bV9kaXY9NSwgUF9hZ2NfaW52X3B3bTE9MCwgUF9hZ2NfaW52X3B3bTI9MCwKKwkgKiBQX2FnY19pbmhfZGNfcnZfZXN0PTAsIFBfYWdjX3RpbWVfZXN0PTMsIFBfYWdjX2ZyZWV6ZT0wLCBQX2FnY19uYl9lc3Q9MiwgUF9hZ2Nfd3JpdGU9MCAqLworCSgwIDw8IDE1KSB8ICgwIDw8IDE0KSB8ICg1IDw8IDExKSB8ICgwIDw8IDEwKSB8ICgwIDw8IDkpIHwgKDAgPDwgOCkgfCAoMyA8PCA1KSB8ICgwIDw8IDQpIHwgKDIgPDwgMSkgfCAoMCA8PCAwKSwgLy8gc2V0dXAKKworCTcxMiwgIC8vIGludl9nYWluCisJNDEsICAvLyB0aW1lX3N0YWJpbGl6CisKKwkwLCAgLy8gYWxwaGFfbGV2ZWwKKwkxMTgsICAvLyB0aGxvY2sKKworCTAsICAgICAvLyB3YmRfaW52CisJNDA5NSwgIC8vIHdiZF9yZWYKKwkwLCAgICAgLy8gd2JkX3NlbAorCTAsICAgICAvLyB3YmRfYWxwaGEKKworCTQyNTk4LCAgLy8gYWdjMV9tYXgKKwkxNzY5NCwgIC8vIGFnYzFfbWluCisJNDU4NzUsICAvLyBhZ2MyX21heAorCTI2MjEsICAvLyBhZ2MyX21pbgorCTAsICAvLyBhZ2MxX3B0MQorCTc2LCAgLy8gYWdjMV9wdDIKKwkxMzksICAvLyBhZ2MxX3B0MworCTUyLCAgLy8gYWdjMV9zbG9wZTEKKwk1OSwgIC8vIGFnYzFfc2xvcGUyCisJMTA3LCAgLy8gYWdjMl9wdDEKKwkxNzIsICAvLyBhZ2MyX3B0MgorCTU3LCAgLy8gYWdjMl9zbG9wZTEKKwk3MCwgIC8vIGFnYzJfc2xvcGUyCisKKwkyMSwgIC8vIGFscGhhX21hbnQKKwkyNSwgIC8vIGFscGhhX2V4cAorCTI4LCAgLy8gYmV0YV9tYW50CisJNDgsICAvLyBiZXRhX2V4cAorCisJMSwgIC8vIHBlcmZvcm1fYWdjX3NvZnRzcGxpdAorCXsgIDAsICAgICAvLyBzcGxpdF9taW4KKwkgICAxMDcsICAgLy8gc3BsaXRfbWF4CisJICAgNTE4MDAsIC8vIGdsb2JhbF9zcGxpdF9taW4KKwkgICAyNDcwMCAgLy8gZ2xvYmFsX3NwbGl0X21heAorCX0sCiB9OwotKi8KKworc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgc3RrNzcwMHBfNzAwMHBfbXQyMDYwX2FnY19jb25maWcgPSB7CisJQkFORF9VSEYgfCBCQU5EX1ZIRiwKKworCS8qIFBfYWdjX3VzZV9zZF9tb2QxPTAsIFBfYWdjX3VzZV9zZF9tb2QyPTAsIFBfYWdjX2ZyZXFfcHdtX2Rpdj01LCBQX2FnY19pbnZfcHdtMT0wLCBQX2FnY19pbnZfcHdtMj0wLAorCSAqIFBfYWdjX2luaF9kY19ydl9lc3Q9MCwgUF9hZ2NfdGltZV9lc3Q9MywgUF9hZ2NfZnJlZXplPTAsIFBfYWdjX25iX2VzdD0yLCBQX2FnY193cml0ZT0wICovCisJKDAgPDwgMTUpIHwgKDAgPDwgMTQpIHwgKDUgPDwgMTEpIHwgKDAgPDwgMTApIHwgKDAgPDwgOSkgfCAoMCA8PCA4KSB8ICgzIDw8IDUpIHwgKDAgPDwgNCkgfCAoMiA8PCAxKSB8ICgwIDw8IDApLCAvLyBzZXR1cAorCisJNzEyLCAvLyBpbnZfZ2FpbgorCTQxLCAgLy8gdGltZV9zdGFiaWxpegorCisJMCwgICAvLyBhbHBoYV9sZXZlbAorCTExOCwgLy8gdGhsb2NrCisKKwkwLCAgICAvLyB3YmRfaW52CisJNDA5NSwgLy8gd2JkX3JlZgorCTAsICAgIC8vIHdiZF9zZWwKKwkwLCAgICAvLyB3YmRfYWxwaGEKKworCTQyNTk4LCAvLyBhZ2MxX21heAorCTE2Mzg0LCAvLyBhZ2MxX21pbgorCTQyNTk4LCAvLyBhZ2MyX21heAorCSAgICAwLCAvLyBhZ2MyX21pbgorCisJICAwLCAgIC8vIGFnYzFfcHQxCisJMTM3LCAgIC8vIGFnYzFfcHQyCisJMjU1LCAgIC8vIGFnYzFfcHQzCisKKwkgIDAsICAgLy8gYWdjMV9zbG9wZTEKKwkyNTUsICAgLy8gYWdjMV9zbG9wZTIKKworCTAsICAgICAvLyBhZ2MyX3B0MQorCTAsICAgICAvLyBhZ2MyX3B0MgorCisJIDAsICAgIC8vIGFnYzJfc2xvcGUxCisJNDEsICAgIC8vIGFnYzJfc2xvcGUyCisKKwkxNSwgLy8gYWxwaGFfbWFudAorCTI1LCAvLyBhbHBoYV9leHAKKworCTI4LCAvLyBiZXRhX21hbnQKKwk0OCwgLy8gYmV0YV9leHAKKworCTAsIC8vIHBlcmZvcm1fYWdjX3NvZnRzcGxpdAorfTsKKworc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgc3RrNzcwMHBfcGxsX2NvbmZpZyA9IHsKKwk2MDAwMCwgMzAwMDAsIC8vIGludGVybmFsLCBzYW1wbGluZworCTEsIDgsIDMsIDEsIDAsIC8vIHBsbF9jZmc6IHByZWRpdiwgcmF0aW8sIHJhbmdlLCByZXNldCwgYnlwYXNzCisJMCwgMCwgMSwgMSwgMCwgLy8gbWlzYzogcmVmZGl2LCBieXBjbGtfZGl2LCBJT19DTEtfZW5fY29yZSwgQURDbGtTcmMsIG1vZHVsbworCSgzIDw8IDE0KSB8ICgxIDw8IDEyKSB8ICg1MjQgPDwgMCksIC8vIHNhZF9jZmc6IHJlZnNlbCwgc2VsLCBmcmVxXzE1aworCTYwMjU4MTY3LCAvLyBpZnJlcQorCTIwNDUyMjI1LCAvLyB0aW1mCit9OworCitzdGF0aWMgc3RydWN0IGRpYjcwMDBtX2NvbmZpZyBzdGs3NzAwcF9kaWI3MDAwbV9jb25maWcgPSB7CisJLmR2YnRfbW9kZSA9IDEsCisJLm91dHB1dF9tcGVnMl9pbl8xODhfYnl0ZXMgPSAxLAorCS5xdWFydHpfZGlyZWN0ID0gMSwKKworCS5hZ2NfY29uZmlnX2NvdW50ID0gMSwKKwkuYWdjID0gJnN0azc3MDBwXzcwMDBtX210MjA2MF9hZ2NfY29uZmlnLAorCS5idyAgPSAmc3RrNzcwMHBfcGxsX2NvbmZpZywKKworCS5ncGlvX2RpciA9IERJQjcwMDBNX0dQSU9fREVGQVVMVF9ESVJFQ1RJT05TLAorCS5ncGlvX3ZhbCA9IERJQjcwMDBNX0dQSU9fREVGQVVMVF9WQUxVRVMsCisJLmdwaW9fcHdtX3BvcyA9IERJQjcwMDBNX0dQSU9fREVGQVVMVF9QV01fUE9TLAorfTsKKworc3RhdGljIHN0cnVjdCBkaWI3MDAwcF9jb25maWcgc3RrNzcwMHBfZGliNzAwMHBfY29uZmlnID0geworCS5vdXRwdXRfbXBlZzJfaW5fMTg4X2J5dGVzID0gMSwKKworCS5hZ2MgPSAmc3RrNzcwMHBfNzAwMHBfbXQyMDYwX2FnY19jb25maWcsCisJLmJ3ICA9ICZzdGs3NzAwcF9wbGxfY29uZmlnLAorCisJLmdwaW9fZGlyID0gRElCNzAwME1fR1BJT19ERUZBVUxUX0RJUkVDVElPTlMsCisJLmdwaW9fdmFsID0gRElCNzAwME1fR1BJT19ERUZBVUxUX1ZBTFVFUywKKwkuZ3Bpb19wd21fcG9zID0gRElCNzAwME1fR1BJT19ERUZBVUxUX1BXTV9QT1MsCit9OwogCiBzdGF0aWMgaW50IHN0azc3MDBwX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogeworCXN0cnVjdCBkaWIwNzAwX3N0YXRlICpzdCA9IGFkYXAtPmRldi0+cHJpdjsKIAkvKiB1bmxlc3MgdGhlcmUgaXMgbm8gcmVhbCBwb3dlciBtYW5hZ2VtZW50IGluIERWQiAtIHdlIGxlYXZlIHRoZSBkZXZpY2Ugb24gR1BJTzYgKi8KLQlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsIEdQSU9fT1VULCAwKTsgbXNsZWVwKDEwKTsKLQlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsIEdQSU9fT1VULCAxKTsgbXNsZWVwKDEwKTsKLQlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzEwLCBHUElPX09VVCwgMSk7IG1zbGVlcCgxMCk7Ci0JZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU8xMCwgR1BJT19PVVQsIDApOyBtc2xlZXAoMTApOwogCi0vLwlhZGFwLT5mZSA9IGRpYjcwMDBtX2F0dGFjaCgmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgJnN0azc3MDBwX2RpYjcwMDBtX2NvbmZpZywgMTgpOwotCXJldHVybiAwOworCWRpYjA3MDBfc2V0X2dwaW8oYWRhcC0+ZGV2LCBHUElPMTAsIEdQSU9fT1VULCAwKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsICBHUElPX09VVCwgMCk7IG1zbGVlcCg1MCk7CisKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsICBHUElPX09VVCwgMSk7IG1zbGVlcCgxMCk7CisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU85LCAgR1BJT19PVVQsIDEpOworCisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU8xMCwgR1BJT19PVVQsIDApOyBtc2xlZXAoMTApOworCWRpYjA3MDBfY3RybF9jbG9jayhhZGFwLT5kZXYsIDcyLCAxKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzEwLCBHUElPX09VVCwgMSk7IG1zbGVlcCgxMDApOworCisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsICBHUElPMCwgR1BJT19PVVQsIDEpOworCisJc3QtPm10MjA2MF9pZjFbMF0gPSAxMjIwOworCisJaWYgKGRpYjcwMDBwY19kZXRlY3Rpb24oJmFkYXAtPmRldi0+aTJjX2FkYXApKSB7CisJCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAxOCwgJnN0azc3MDBwX2RpYjcwMDBwX2NvbmZpZyk7CisJCXN0LT5pc19kaWI3MDAwcGMgPSAxOworCX0gZWxzZQorCQlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMG1fYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMTgsICZzdGs3NzAwcF9kaWI3MDAwbV9jb25maWcpOworCisJcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KIAorc3RhdGljIHN0cnVjdCBtdDIwNjBfY29uZmlnIHN0azc3MDBwX210MjA2MF9jb25maWcgPSB7CisJMHg2MAorfTsKKwogc3RhdGljIGludCBzdGs3NzAwcF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLS8vCXR1bl9pMmMgPSBkaWI3MDAwbV9nZXRfdHVuZXJfaTJjX21hc3RlcihhZGFwLT5mZSwgMSk7Ci0vLwlyZXR1cm4gbXQyMDYwX2F0dGFjaChhZGFwLT5mZSwgdHVuX2kyYywgJnN0azMwMDBwX210MjA2MF9jb25maWcsIGlmMSk7Ci0JcmV0dXJuIDA7CisJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gYWRhcC0+ZGV2LT5wcml2OworCXN0cnVjdCBpMmNfYWRhcHRlciAqdHVuX2kyYzsKKworCWlmIChzdC0+aXNfZGliNzAwMHBjKQorCQl0dW5faTJjID0gZGliNzAwMHBfZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CisJZWxzZQorCQl0dW5faTJjID0gZGliNzAwMG1fZ2V0X2kyY19tYXN0ZXIoYWRhcC0+ZmUsIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CisKKwlyZXR1cm4gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywgJnN0azc3MDBwX210MjA2MF9jb25maWcsCisJCXN0LT5tdDIwNjBfaWYxWzBdKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRpYjA3MDBfdXNiX2lkX3RhYmxlW10gPSB7CiAJCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwgICAgVVNCX1BJRF9ESUJDT01fU1RLNzcwMFApIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwgICAgVVNCX1BJRF9ESUJDT01fU1RLNzcwMFBfUEMpIH0sCisKIAkJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCBVU0JfUElEX0hBVVBQQVVHRV9OT1ZBX1RfNTAwKSB9LAogCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIFVTQl9QSURfSEFVUFBBVUdFX05PVkFfVF81MDBfMikgfSwKIAkJeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLCBVU0JfUElEX0hBVVBQQVVHRV9OT1ZBX1RfU1RJQ0spIH0sCiAJCXsgVVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwgVVNCX1BJRF9BVkVSTUVESUFfVk9MQVIpIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0NPTVBSTywgICAgVVNCX1BJRF9DT01QUk9fVklERU9NQVRFX1U1MDApIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX1VOSVdJTEwsICAgVVNCX1BJRF9VTklXSUxMX1NUSzc3MDBQKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9MRUFEVEVLLCAgIFVTQl9QSURfV0lORkFTVF9EVFZfRE9OR0xFX1NUSzc3MDBQKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsIFVTQl9QSURfSEFVUFBBVUdFX05PVkFfVF9TVElDS18yKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BVkVSTUVESUEsIFVTQl9QSURfQVZFUk1FRElBX1ZPTEFSXzIpIH0sCiAJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGliMDcwMF91c2JfaWRfdGFibGUpOwpAQCAtMTY3LDIwICszMjEsMzIgQEAKIAkJCX0sCiAJCX0sCiAKLQkJLm51bV9kZXZpY2VfZGVzY3MgPSAzLAorCQkubnVtX2RldmljZV9kZXNjcyA9IDYsCiAJCS5kZXZpY2VzID0gewogCQkJeyAgICJEaUJjb20gU1RLNzcwMFAgcmVmZXJlbmNlIGRlc2lnbiIsCi0JCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbMF0sIE5VTEwgfSwKKwkJCQl7ICZkaWIwNzAwX3VzYl9pZF90YWJsZVswXSwgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzFdIH0sCiAJCQkJeyBOVUxMIH0sCiAJCQl9LAogCQkJeyAgICJIYXVwcGF1Z2UgTm92YS1UIFN0aWNrIiwKLQkJCQl7ICZkaWIwNzAwX3VzYl9pZF90YWJsZVszXSwgTlVMTCB9LAorCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzRdLCAmZGliMDcwMF91c2JfaWRfdGFibGVbOV0sIE5VTEwgfSwKIAkJCQl7IE5VTEwgfSwKIAkJCX0sCiAJCQl7ICAgIkFWZXJNZWRpYSBBVmVyVFYgRFZCLVQgVm9sYXIiLAotCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzRdLCBOVUxMIH0sCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbNV0sICZkaWIwNzAwX3VzYl9pZF90YWJsZVsxMF0gfSwKIAkJCQl7IE5VTEwgfSwKIAkJCX0sCisJCQl7ICAgIkNvbXBybyBWaWRlb21hdGUgVTUwMCIsCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbNl0sIE5VTEwgfSwKKwkJCQl7IE5VTEwgfSwKKwkJCX0sCisJCQl7ICAgIlVuaXdpbGwgU1RLNzcwMFAgYmFzZWQgKEhhbWEgYW5kIG90aGVycykiLAorCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzddLCBOVUxMIH0sCisJCQkJeyBOVUxMIH0sCisJCQl9LAorCQkJeyAgICJMZWFkdGVrIFdpbmZhc3QgRFRWIERvbmdsZSAoU1RLNzcwMFAgYmFzZWQpIiwKKwkJCQl7ICZkaWIwNzAwX3VzYl9pZF90YWJsZVs4XSwgTlVMTCB9LAorCQkJCXsgTlVMTCB9LAorCQkJfQogCQl9CiAJfSwgeyBESUIwNzAwX0RFRkFVTFRfREVWSUNFX1BST1BFUlRJRVMsCiAKQEAgLTIwMiw3ICszNjgsNyBAQAogCQkubnVtX2RldmljZV9kZXNjcyA9IDEsCiAJCS5kZXZpY2VzID0gewogCQkJeyAgICJIYXVwcGF1Z2UgTm92YS1UIDUwMCBEdWFsIERWQi1UIiwKLQkJCQl7ICZkaWIwNzAwX3VzYl9pZF90YWJsZVsxXSwgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzJdLCBOVUxMIH0sCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbMl0sICZkaWIwNzAwX3VzYl9pZF90YWJsZVszXSwgTlVMTCB9LAogCQkJCXsgTlVMTCB9LAogCQkJfSwKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYwppbmRleCBmZDNhOTkwLi41MTQzZTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAvLyBDb25maWcgQWRqYWNlbnQgY2hhbm5lbHMgIFBlcmYgLWNhbDIyCiBzdGF0aWMgc3RydWN0IGRpYngwMDBfYWdjX2NvbmZpZyBkaWIzMDAwcF9tdDIwNjBfYWdjX2NvbmZpZyA9IHsKIAkuYmFuZF9jYXBzID0gQkFORF9WSEYgfCBCQU5EX1VIRiwKLQkuc2V0dXAgICAgID0gKDAgPDwgMTUpIHwgKDAgPDwgMTQpIHwgKDEgPDwgMTMpIHwgKDEgPDwgMTIpIHwgKDI5IDw8IDApLAorCS5zZXR1cCAgICAgPSAoMSA8PCA4KSB8ICg1IDw8IDUpIHwgKDEgPDwgNCkgfCAoMSA8PCAzKSB8ICgwIDw8IDIpIHwgKDIgPDwgMCksCiAKIAkuYWdjMV9tYXggPSA0ODQ5NywKIAkuYWdjMV9taW4gPSAyMzU5MywKQEAgLTE5NiwxMCArMTk2LDE0IEBACiAJLmxuX2FkY19sZXZlbCA9IDB4MWNjNywKIAogCS5vdXRwdXRfbXBlZzJfaW5fMTg4X2J5dGVzID0gMSwKKworCS5hZ2NfY29tbWFuZDEgPSAxLAorCS5hZ2NfY29tbWFuZDIgPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgZGliMzAwMHBfcGFuYXNvbmljX2FnY19jb25maWcgPSB7Ci0JLnNldHVwICAgID0gKDAgPDwgMTUpIHwgKDAgPDwgMTQpIHwgKDEgPDwgMTMpIHwgKDEgPDwgMTIpIHwgKDI5IDw8IDApLAorCS5iYW5kX2NhcHMgPSBCQU5EX1ZIRiB8IEJBTkRfVUhGLAorCS5zZXR1cCAgICAgPSAoMSA8PCA4KSB8ICg1IDw8IDUpIHwgKDEgPDwgNCkgfCAoMSA8PCAzKSB8ICgwIDw8IDIpIHwgKDIgPDwgMCksCiAKIAkuYWdjMV9tYXggPSA1NjM2MSwKIAkuYWdjMV9taW4gPSAyMjI4MiwKQEAgLTIyNiw2ICsyMzAsOSBAQAogCS5sbl9hZGNfbGV2ZWwgPSAweDFjYzcsCiAKIAkub3V0cHV0X21wZWcyX2luXzE4OF9ieXRlcyA9IDEsCisKKwkuYWdjX2NvbW1hbmQxID0gMSwKKwkuYWdjX2NvbW1hbmQyID0gMSwKIH07CiAKIGludCBkaWJ1c2JfZGliMzAwMG1jX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKaW5kZXggNGZlMzYzZS4uN2E2YWU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCkBAIC0xNjMsMjMgKzE2MywyMyBAQAogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMTYsCiAKLQkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYl9zdHJlYW1pbmdfY3RybCwKLQkucGlkX2ZpbHRlciAgICAgICA9IGRpYnVzYl9waWRfZmlsdGVyLAotCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKLQkuZnJvbnRlbmRfYXR0YWNoICA9IGRpYnVzYl9kaWIzMDAwbWJfZnJvbnRlbmRfYXR0YWNoLAotCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3R1bmVyX3Byb2JlX2FuZF9hdHRhY2gsCisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYl9zdHJlYW1pbmdfY3RybCwKKwkJCS5waWRfZmlsdGVyICAgICAgID0gZGlidXNiX3BpZF9maWx0ZXIsCisJCQkucGlkX2ZpbHRlcl9jdHJsICA9IGRpYnVzYl9waWRfZmlsdGVyX2N0cmwsCisJCQkuZnJvbnRlbmRfYXR0YWNoICA9IGRpYnVzYl9kaWIzMDAwbWJfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWJ1c2JfdHVuZXJfcHJvYmVfYW5kX2F0dGFjaCwKIAotCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKLQkJLmNvdW50ID0gNywKLQkJLmVuZHBvaW50ID0gMHgwMiwKLQkJLnUgPSB7Ci0JCQkuYnVsayA9IHsKLQkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCi0JCQl9Ci0JCX0KLQl9LAorCQkJCS5jb3VudCA9IDcsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCisJCQkJCX0KKwkJCQl9CisJCQl9LAogCQkJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCiAJCX0KIAl9LApAQCAtMjQ4LDIzICsyNDgsMjMgQEAKIAkJCS5jYXBzID0gRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgfCBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDE2LAogCi0JLnN0cmVhbWluZ19jdHJsICAgPSBkaWJ1c2Jfc3RyZWFtaW5nX2N0cmwsCi0JLnBpZF9maWx0ZXIgICAgICAgPSBkaWJ1c2JfcGlkX2ZpbHRlciwKLQkucGlkX2ZpbHRlcl9jdHJsICA9IGRpYnVzYl9waWRfZmlsdGVyX2N0cmwsCi0JLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKLQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl90dW5lcl9wcm9iZV9hbmRfYXR0YWNoLAorCQkJLnN0cmVhbWluZ19jdHJsICAgPSBkaWJ1c2Jfc3RyZWFtaW5nX2N0cmwsCisJCQkucGlkX2ZpbHRlciAgICAgICA9IGRpYnVzYl9waWRfZmlsdGVyLAorCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKKwkJCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3R1bmVyX3Byb2JlX2FuZF9hdHRhY2gsCiAKLQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJCQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCiAJCQkuc3RyZWFtID0gewogCQkJCS50eXBlID0gVVNCX0JVTEssCi0JCS5jb3VudCA9IDcsCi0JCS5lbmRwb2ludCA9IDB4MDIsCi0JCS51ID0gewotCQkJLmJ1bGsgPSB7Ci0JCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAotCQkJfQotCQl9Ci0JfSwKKwkJCQkuY291bnQgPSA3LAorCQkJCS5lbmRwb2ludCA9IDB4MDIsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJCQl9CisJCQkJfQorCQkJfSwKIAkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAogCQl9LAogCX0sCkBAIC0zMTIsMjIgKzMxMiwyMyBAQAogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMTYsCiAKLQkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYjJfMF9zdHJlYW1pbmdfY3RybCwKLQkucGlkX2ZpbHRlciAgICAgICA9IGRpYnVzYl9waWRfZmlsdGVyLAotCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKLQkuZnJvbnRlbmRfYXR0YWNoICA9IGRpYnVzYl9kaWIzMDAwbWJfZnJvbnRlbmRfYXR0YWNoLAotCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3Rob21zb25fdHVuZXJfYXR0YWNoLAotCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAorCQkJLnBpZF9maWx0ZXIgICAgICAgPSBkaWJ1c2JfcGlkX2ZpbHRlciwKKwkJCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtYl9mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl90aG9tc29uX3R1bmVyX2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKIAkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSA3LAotCQkuZW5kcG9pbnQgPSAweDA2LAotCQkudSA9IHsKLQkJCS5idWxrID0gewotCQkJCS5idWZmZXJzaXplID0gNDA5NiwKLQkJCX0KLQkJfQotCX0sCisJCQkJLmNvdW50ID0gNywKKwkJCQkuZW5kcG9pbnQgPSAweDA2LAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfQogCX0sCkBAIC0zNjksMjIgKzM3MCwyMiBAQAogCQkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKIAkJCS5waWRfZmlsdGVyX2NvdW50ID0gMTYsCiAKLQkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYjJfMF9zdHJlYW1pbmdfY3RybCwKLQkucGlkX2ZpbHRlciAgICAgICA9IGRpYnVzYl9waWRfZmlsdGVyLAotCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKLQkuZnJvbnRlbmRfYXR0YWNoICA9IGRpYnVzYl9kaWIzMDAwbWJfZnJvbnRlbmRfYXR0YWNoLAotCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3R1bmVyX3Byb2JlX2FuZF9hdHRhY2gsCi0JLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbWluZ19jdHJsICAgPSBkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwsCisJCQkucGlkX2ZpbHRlciAgICAgICA9IGRpYnVzYl9waWRfZmlsdGVyLAorCQkJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKKwkJCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX3R1bmVyX3Byb2JlX2FuZF9hdHRhY2gsCisJCQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCiAJCQkuc3RyZWFtID0gewogCQkJCS50eXBlID0gVVNCX0JVTEssCi0JCS5jb3VudCA9IDcsCi0JCS5lbmRwb2ludCA9IDB4MDYsCi0JCS51ID0gewotCQkJLmJ1bGsgPSB7Ci0JCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAotCQkJfQotCQl9Ci0JfSwKKwkJCQkuY291bnQgPSA3LAorCQkJCS5lbmRwb2ludCA9IDB4MDYsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJCQl9CisJCQkJfQorCQkJfSwKIAkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAogCQl9CiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYy5jCmluZGV4IGEwZmQzN2UuLmU3ZWEzZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYwpAQCAtNTQsMjMgKzU0LDIzIEBACiAJCXsKIAkJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAotCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAotCS5waWRfZmlsdGVyICAgICAgID0gZGlidXNiX3BpZF9maWx0ZXIsCi0JLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAotCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtY19mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBkaWJ1c2JfZGliMzAwMG1jX3R1bmVyX2F0dGFjaCwKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAorCQkJLnBpZF9maWx0ZXIgICAgICAgPSBkaWJ1c2JfcGlkX2ZpbHRlciwKKwkJCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtY19mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWNfdHVuZXJfYXR0YWNoLAogCiAJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKIAkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSA3LAotCQkuZW5kcG9pbnQgPSAweDA2LAotCQkudSA9IHsKLQkJCS5idWxrID0gewotCQkJCS5idWZmZXJzaXplID0gNDA5NiwKLQkJCX0KLQkJfQotCX0sCisJCQkJLmNvdW50ID0gNywKKwkJCQkuZW5kcG9pbnQgPSAweDA2LAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2IuaAppbmRleCA1MTUzZmI5Li5iNjA3ODEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLmgKQEAgLTk5LDcgKzk5LDkgQEAKIHN0cnVjdCBkaWJ1c2Jfc3RhdGUgewogCXN0cnVjdCBkaWJfZmVfeGZlcl9vcHMgb3BzOwogCWludCBtdDIwNjBfcHJlc2VudDsKK307CiAKK3N0cnVjdCBkaWJ1c2JfZGV2aWNlX3N0YXRlIHsKIAkvKiBmb3IgUkM1IHJlbW90ZSBjb250cm9sICovCiAJaW50IG9sZF90b2dnbGU7CiAJaW50IGxhc3RfcmVwZWF0X2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKaW5kZXggOGZiMzQzNy4uNGExOThkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCkBAIC0yNzQsMjAgKzI3NCwyMCBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7Ci0JLmZyb250ZW5kX2F0dGFjaCAgPSBkaWdpdHZfZnJvbnRlbmRfYXR0YWNoLAotCS50dW5lcl9hdHRhY2ggICAgID0gZGlnaXR2X3R1bmVyX2F0dGFjaCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gZGlnaXR2X2Zyb250ZW5kX2F0dGFjaCwKKwkJCS50dW5lcl9hdHRhY2ggICAgID0gZGlnaXR2X3R1bmVyX2F0dGFjaCwKIAotCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKLQkJLmNvdW50ID0gNywKLQkJLmVuZHBvaW50ID0gMHgwMiwKLQkJLnUgPSB7Ci0JCQkuYnVsayA9IHsKLQkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCi0JCQl9Ci0JCX0KLQl9LAorCQkJCS5jb3VudCA9IDcsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCisJCQkJCX0KKwkJCQl9CisJCQl9LAogCQl9CiAJfSwKIAkuaWRlbnRpZnlfc3RhdGUgICA9IGRpZ2l0dl9pZGVudGlmeV9zdGF0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKaW5kZXggZmE0M2E0MS4uN2RiZTE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKQEAgLTI2OCwyMCArMjY4LDIwIEBACiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9ORUVEX1BJRF9GSUxURVJJTkcsCiAJCQkucGlkX2ZpbHRlcl9jb3VudCA9IDE1LAogCi0JLnN0cmVhbWluZ19jdHJsICA9IGR0dDIwMHVfc3RyZWFtaW5nX2N0cmwsCi0JLnBpZF9maWx0ZXIgICAgICA9IGR0dDIwMHVfcGlkX2ZpbHRlciwKLQkuZnJvbnRlbmRfYXR0YWNoID0gZHR0MjAwdV9mcm9udGVuZF9hdHRhY2gsCi0JLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbWluZ19jdHJsICA9IGR0dDIwMHVfc3RyZWFtaW5nX2N0cmwsCisJCQkucGlkX2ZpbHRlciAgICAgID0gZHR0MjAwdV9waWRfZmlsdGVyLAorCQkJLmZyb250ZW5kX2F0dGFjaCA9IGR0dDIwMHVfZnJvbnRlbmRfYXR0YWNoLAorCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKIAkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSA3LAotCQkuZW5kcG9pbnQgPSAweDAyLAotCQkudSA9IHsKLQkJCS5idWxrID0gewotCQkJCS5idWZmZXJzaXplID0gNDA5NiwKLQkJCX0KLQkJfQotCX0sCisJCQkJLmNvdW50ID0gNywKKwkJCQkuZW5kcG9pbnQgPSAweDAyLAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCiAJCX0KIAl9LAogCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKaW5kZXggNGQ2YjA2OS4uMjk5MzgyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaApAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBVU0JfVklEX1ZJU0lPTlBMVVMJCQkweDEzZDMKICNkZWZpbmUgVVNCX1ZJRF9UV0lOSEFOCQkJCTB4MTgyMgogI2RlZmluZSBVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDCQkweDA1ZDgKKyNkZWZpbmUgVVNCX1ZJRF9VTklXSUxMCQkJCTB4MTU4NAogI2RlZmluZSBVU0JfVklEX1dJREVWSUVXCQkJMHgxNGFhCiAKIC8qIFByb2R1Y3QgSURzICovCkBAIC00Niw2ICs0Nyw3IEBACiAjZGVmaW5lIFVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX1dBUk0JCQkweGQwMDEKICNkZWZpbmUgVVNCX1BJRF9DT01QUk9fRFZCVTIwMDBfVU5LX0NPTEQJCTB4MDEwYwogI2RlZmluZSBVU0JfUElEX0NPTVBST19EVkJVMjAwMF9VTktfV0FSTQkJMHgwMTBkCisjZGVmaW5lIFVTQl9QSURfQ09NUFJPX1ZJREVPTUFURV9VNTAwCQkJMHgxZTc4CiAjZGVmaW5lIFVTQl9QSURfRElCQ09NX0hPT0tfREVGQVVMVAkJCTB4MDA2NAogI2RlZmluZSBVU0JfUElEX0RJQkNPTV9IT09LX0RFRkFVTFRfUkVFTlVNCQkweDAwNjUKICNkZWZpbmUgVVNCX1BJRF9ESUJDT01fTU9EMzAwMF9DT0xECQkJMHgwYmI4CkBAIC01Myw3ICs1NSw5IEBACiAjZGVmaW5lIFVTQl9QSURfRElCQ09NX01PRDMwMDFfQ09MRAkJCTB4MGJjNgogI2RlZmluZSBVU0JfUElEX0RJQkNPTV9NT0QzMDAxX1dBUk0JCQkweDBiYzcKICNkZWZpbmUgVVNCX1BJRF9ESUJDT01fU1RLNzcwMFAJCQkJMHgxZTE0CisjZGVmaW5lIFVTQl9QSURfRElCQ09NX1NUSzc3MDBQX1BDCQkJMHgxZTc4CiAjZGVmaW5lIFVTQl9QSURfRElCQ09NX0FOQ0hPUl8yMTM1X0NPTEQJCQkweDIxMzEKKyNkZWZpbmUgVVNCX1BJRF9VTklXSUxMX1NUSzc3MDBQCQkJMHg2MDAzCiAjZGVmaW5lIFVTQl9QSURfR1JBTkRURUNfRFZCVF9VU0JfQ09MRAkJCTB4MGZhMAogI2RlZmluZSBVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX1dBUk0JCQkweDBmYTEKICNkZWZpbmUgVVNCX1BJRF9LV09STERfVlNUUkVBTV9DT0xECQkJMHgxN2RlCkBAIC05Nyw3ICsxMDEsOSBAQAogI2RlZmluZSBVU0JfUElEX0hBVVBQQVVHRV9OT1ZBX1RfNTAwCQkJMHg5OTQxCiAjZGVmaW5lIFVTQl9QSURfSEFVUFBBVUdFX05PVkFfVF81MDBfMgkJCTB4OTk1MAogI2RlZmluZSBVU0JfUElEX0hBVVBQQVVHRV9OT1ZBX1RfU1RJQ0sJCQkweDcwNTAKLSNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfVk9MQVIJCQkJMHgxMjM0CisjZGVmaW5lIFVTQl9QSURfSEFVUFBBVUdFX05PVkFfVF9TVElDS18yCQkweDcwNjAKKyNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfVk9MQVIJCQkJMHhhODA3CisjZGVmaW5lIFVTQl9QSURfQVZFUk1FRElBX1ZPTEFSXzIJCQkweGI4MDgKICNkZWZpbmUgVVNCX1BJRF9ORUJVTEFfRElHSVRWCQkJCTB4MDIwMQogI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHRFQJCQkweGQ4MjAKICNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MRzA2NEZfQ09MRAkJMHhkNTAwCkBAIC0xMTAsOCArMTE2LDggQEAKICNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9EVUFMXzFfV0FSTQkJMHhkYjUxCiAjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfRFVBTF8yX0NPTEQJCTB4ZGI1OAogI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0RVQUxfMl9XQVJNCQkweGRiNTkKLSNkZWZpbmUgVVNCX1BJRF9ESUdJVEFMTk9XX0JMVUVCSVJEX0RVQUxfMV9DT0xECTB4ZGI1NAotI2RlZmluZSBVU0JfUElEX0RJR0lUQUxOT1dfQkxVRUJJUkRfRFVBTF8xX1dBUk0JMHhkYjU1CisjZGVmaW5lIFVTQl9QSURfRElHSVRBTE5PV19CTFVFQklSRF9EVUFMXzFfQ09MRAkJMHhkYjU0CisjZGVmaW5lIFVTQl9QSURfRElHSVRBTE5PV19CTFVFQklSRF9EVUFMXzFfV0FSTQkJMHhkYjU1CiAjZGVmaW5lIFVTQl9QSURfTUVESU9OX01EOTU3MDAJCQkJMHgwOTMyCiAjZGVmaW5lIFVTQl9QSURfS1lFX0RWQl9UX0NPTEQJCQkJMHg3MDFlCiAjZGVmaW5lIFVTQl9QSURfS1lFX0RWQl9UX1dBUk0JCQkJMHg3MDFmCkBAIC0xMjUsNyArMTMxLDkgQEAKICNkZWZpbmUgVVNCX1BJRF9HUkFORFRFQ19EVkJUX1VTQjJfV0FSTQkJCTB4MGJjNwogI2RlZmluZSBVU0JfUElEX1dJTkZBU1RfRFRWX0RPTkdMRV9DT0xECQkJMHg2MDI1CiAjZGVmaW5lIFVTQl9QSURfV0lORkFTVF9EVFZfRE9OR0xFX1dBUk0JCQkweDYwMjYKKyNkZWZpbmUgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfU1RLNzcwMFAJCTB4NmYwMAogI2RlZmluZSBVU0JfUElEX0dFTlBJWF84UFNLX0NPTEQJCQkweDAyMDAKICNkZWZpbmUgVVNCX1BJRF9HRU5QSVhfOFBTS19XQVJNCQkJMHgwMjAxCiAKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMKaW5kZXggMGEzYTBiNi4uMTlmZjU5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXJlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1yZW1vdGUuYwpAQCAtMTMsOSArMTMsMTAgQEAKICAqCiAgKiBUT0RPOiBGaXggdGhlIHJlcGVhdCByYXRlIG9mIHRoZSBpbnB1dCBkZXZpY2UuCiAgKi8KLXN0YXRpYyB2b2lkIGR2Yl91c2JfcmVhZF9yZW1vdGVfY29udHJvbCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZHZiX3VzYl9yZWFkX3JlbW90ZV9jb250cm9sKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBkYXRhOworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UsIHJjX3F1ZXJ5X3dvcmsud29yayk7CiAJdTMyIGV2ZW50OwogCWludCBzdGF0ZTsKIApAQCAtODksNyArOTAsOSBAQAogCiBpbnQgZHZiX3VzYl9yZW1vdGVfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCiB7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCWludCBpOworCWludCBlcnI7CiAKIAlpZiAoZC0+cHJvcHMucmNfa2V5X21hcCA9PSBOVUxMIHx8CiAJCWQtPnByb3BzLnJjX3F1ZXJ5ID09IE5VTEwgfHwKQEAgLTk5LDIzICsxMDIsMjQgQEAKIAl1c2JfbWFrZV9wYXRoKGQtPnVkZXYsIGQtPnJjX3BoeXMsIHNpemVvZihkLT5yY19waHlzKSk7CiAJc3RybGNhdChkLT5yY19waHlzLCAiL2lyMCIsIHNpemVvZihkLT5yY19waHlzKSk7CiAKLQlkLT5yY19pbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWQtPnJjX2lucHV0X2RldikKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkLT5yY19pbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7Ci0JZC0+cmNfaW5wdXRfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKLQlkLT5yY19pbnB1dF9kZXYtPmtleWNvZGVtYXggPSBLRVlfTUFYOwotCWQtPnJjX2lucHV0X2Rldi0+bmFtZSA9ICJJUi1yZWNlaXZlciBpbnNpZGUgYW4gVVNCIERWQiByZWNlaXZlciI7Ci0JZC0+cmNfaW5wdXRfZGV2LT5waHlzID0gZC0+cmNfcGh5czsKLQl1c2JfdG9faW5wdXRfaWQoZC0+dWRldiwgJmQtPnJjX2lucHV0X2Rldi0+aWQpOwotCWQtPnJjX2lucHV0X2Rldi0+Y2Rldi5kZXYgPSAmZC0+dWRldi0+ZGV2OworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwlpbnB1dF9kZXYtPmtleWNvZGVzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IEtFWV9NQVg7CisJaW5wdXRfZGV2LT5uYW1lID0gIklSLXJlY2VpdmVyIGluc2lkZSBhbiBVU0IgRFZCIHJlY2VpdmVyIjsKKwlpbnB1dF9kZXYtPnBoeXMgPSBkLT5yY19waHlzOworCXVzYl90b19pbnB1dF9pZChkLT51ZGV2LCAmaW5wdXRfZGV2LT5pZCk7CisJaW5wdXRfZGV2LT5jZGV2LmRldiA9ICZkLT51ZGV2LT5kZXY7CiAKIAkvKiBzZXQgdGhlIGJpdHMgZm9yIHRoZSBrZXlzICovCiAJZGViX3JjKCJrZXkgbWFwIHNpemU6ICVkXG4iLCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemUpOwogCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykgewotCQlkZWJfcmMoInNldHRpbmcgYml0IGZvciBldmVudCAlZCBpdGVtICVkXG4iLGQtPnByb3BzLnJjX2tleV9tYXBbaV0uZXZlbnQsIGkpOwotCQlzZXRfYml0KGQtPnByb3BzLnJjX2tleV9tYXBbaV0uZXZlbnQsIGQtPnJjX2lucHV0X2Rldi0+a2V5Yml0KTsKKwkJZGViX3JjKCJzZXR0aW5nIGJpdCBmb3IgZXZlbnQgJWQgaXRlbSAlZFxuIiwKKwkJCWQtPnByb3BzLnJjX2tleV9tYXBbaV0uZXZlbnQsIGkpOworCQlzZXRfYml0KGQtPnByb3BzLnJjX2tleV9tYXBbaV0uZXZlbnQsIGlucHV0X2Rldi0+a2V5Yml0KTsKIAl9CiAKIAkvKiBTdGFydCB0aGUgcmVtb3RlLWNvbnRyb2wgcG9sbGluZy4gKi8KQEAgLTEyMywxMiArMTI3LDE4IEBACiAJCWQtPnByb3BzLnJjX2ludGVydmFsID0gMTAwOyAvKiBkZWZhdWx0ICovCiAKIAkvKiBzZXR0aW5nIHRoZXNlIHR3byB2YWx1ZXMgdG8gbm9uLXplcm8sIHdlIGhhdmUgdG8gbWFuYWdlIGtleSByZXBlYXRzICovCi0JZC0+cmNfaW5wdXRfZGV2LT5yZXBbUkVQX1BFUklPRF0gPSBkLT5wcm9wcy5yY19pbnRlcnZhbDsKLQlkLT5yY19pbnB1dF9kZXYtPnJlcFtSRVBfREVMQVldICA9IGQtPnByb3BzLnJjX2ludGVydmFsICsgMTUwOworCWlucHV0X2Rldi0+cmVwW1JFUF9QRVJJT0RdID0gZC0+cHJvcHMucmNfaW50ZXJ2YWw7CisJaW5wdXRfZGV2LT5yZXBbUkVQX0RFTEFZXSAgPSBkLT5wcm9wcy5yY19pbnRlcnZhbCArIDE1MDsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZShkLT5yY19pbnB1dF9kZXYpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnIpIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKLQlJTklUX1dPUksoJmQtPnJjX3F1ZXJ5X3dvcmssIGR2Yl91c2JfcmVhZF9yZW1vdGVfY29udHJvbCwgZCk7CisJZC0+cmNfaW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCisJSU5JVF9ERUxBWUVEX1dPUksoJmQtPnJjX3F1ZXJ5X3dvcmssIGR2Yl91c2JfcmVhZF9yZW1vdGVfY29udHJvbCk7CiAKIAlpbmZvKCJzY2hlZHVsZSByZW1vdGUgcXVlcnkgaW50ZXJ2YWwgdG8gJWQgbXNlY3MuIiwgZC0+cHJvcHMucmNfaW50ZXJ2YWwpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZC0+cmNfcXVlcnlfd29yayxtc2Vjc190b19qaWZmaWVzKGQtPnByb3BzLnJjX2ludGVydmFsKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IDM3NmM0NWEuLjBkNzIxNzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaApAQCAtMzY5LDcgKzM2OSw3IEBACiAJLyogcmVtb3RlIGNvbnRyb2wgKi8KIAlzdHJ1Y3QgaW5wdXRfZGV2ICpyY19pbnB1dF9kZXY7CiAJY2hhciByY19waHlzWzY0XTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmNfcXVlcnlfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHJjX3F1ZXJ5X3dvcms7CiAJdTMyIGxhc3RfZXZlbnQ7CiAJaW50IGxhc3Rfc3RhdGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jCmluZGV4IDczNzVlYjIuLjUxOGQ2N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suYwpAQCAtMTk0LDE5ICsxOTQsMTkgQEAKIAkubnVtX2FkYXB0ZXJzID0gMSwKIAkuYWRhcHRlciA9IHsKIAkJewotCS5zdHJlYW1pbmdfY3RybCAgID0gZ3A4cHNrX3N0cmVhbWluZ19jdHJsLAotCS5mcm9udGVuZF9hdHRhY2ggID0gZ3A4cHNrX2Zyb250ZW5kX2F0dGFjaCwKLQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJCQkuc3RyZWFtaW5nX2N0cmwgICA9IGdwOHBza19zdHJlYW1pbmdfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gZ3A4cHNrX2Zyb250ZW5kX2F0dGFjaCwKKwkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKLQkJLmNvdW50ID0gNywKLQkJLmVuZHBvaW50ID0gMHg4MiwKLQkJLnUgPSB7Ci0JCQkuYnVsayA9IHsKLQkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCi0JCQl9Ci0JCX0KLQl9LAorCQkJCS5jb3VudCA9IDcsCisJCQkJLmVuZHBvaW50ID0gMHg4MiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDgxOTIsCisJCQkJCX0KKwkJCQl9CisJCQl9LAogCQl9CiAJfSwKIAkucG93ZXJfY3RybCAgICAgICA9IGdwOHBza19wb3dlcl9jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ub3ZhLXQtdXNiMi5jCmluZGV4IGE5MjE5YmYuLmQ0ODYyMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAl1OCBrZXlbNV0sY21kWzJdID0geyBESUJVU0JfUkVRX1BPTExfUkVNT1RFLCAweDM1IH0sIGRhdGEsdG9nZ2xlLGN1c3RvbTsKIAl1MTYgcmF3OwogCWludCBpOwotCXN0cnVjdCBkaWJ1c2Jfc3RhdGUgKnN0ID0gZC0+cHJpdjsKKwlzdHJ1Y3QgZGlidXNiX2RldmljZV9zdGF0ZSAqc3QgPSBkLT5wcml2OwogCiAJZHZiX3VzYl9nZW5lcmljX3J3KGQsY21kLDIsa2V5LDUsMCk7CiAKQEAgLTE2MywyNyArMTYzLDI4IEBACiAJCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCQkJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKIAotCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAotCS5waWRfZmlsdGVyICAgICAgID0gZGlidXNiX3BpZF9maWx0ZXIsCi0JLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAotCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtY19mcm9udGVuZF9hdHRhY2gsCi0JLnR1bmVyX2F0dGFjaCAgICAgPSBkaWJ1c2JfZGliMzAwMG1jX3R1bmVyX2F0dGFjaCwKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAorCQkJLnBpZF9maWx0ZXIgICAgICAgPSBkaWJ1c2JfcGlkX2ZpbHRlciwKKwkJCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtY19mcm9udGVuZF9hdHRhY2gsCisJCQkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWNfdHVuZXJfYXR0YWNoLAogCi0JLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwotCQkJLnN0cmVhbSA9IHsKLQkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSA3LAotCQkuZW5kcG9pbnQgPSAweDA2LAotCQkudSA9IHsKLQkJCS5idWxrID0gewotCQkJCS5idWZmZXJzaXplID0gNDA5NiwKLQkJCX0KLQkJfQotCX0sCisJCQkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJCQkJCS5zdHJlYW0gPSB7CisJCQkJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJCS5jb3VudCA9IDcsCisJCQkJLmVuZHBvaW50ID0gMHgwNiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCisJCQkJCX0KKwkJCQl9CisJCQl9LAogCiAJCQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKIAkJfQogCX0sCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9kZXZpY2Vfc3RhdGUpLAogCiAJLnBvd2VyX2N0cmwgICAgICAgPSBkaWJ1c2IyXzBfcG93ZXJfY3RybCwKIAkucmVhZF9tYWNfYWRkcmVzcyA9IG5vdmFfdF9yZWFkX21hY19hZGRyZXNzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90dHVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdHR1c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkMjk5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdHR1c2IyLmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qIERWQiBVU0IgY29tcGxpYW50IGxpbnV4IGRyaXZlciBmb3IgVGVjaG5vdHJlbmQgRFZCIFVTQiBib3hlcyBhbmQgY2xvbmVzCisgKiAoZS5nLiBQaW5uYWNsZSA0MDBlIERWQi1TIFVTQjIuMCkuCisgKgorICogVGhlIFBpbm5hY2xlIDQwMGUgdXNlcyB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgVGVjaG5vdHJlbmQgVVNCMS4xIGJveGVzLgorICoKKyAqIFREQTgyNjMgKyBUREExMDA4NgorICoKKyAqIEkyQyBhZGRyZXNzZXM6CisgKiAweDA4IC0gTE5CUDIxUEQgICAtIExOQiBwb3dlciBzdXBwbHkKKyAqIDB4MGUgLSBUREExMDA4NiAgIC0gRGVtb2R1bGF0b3IKKyAqIDB4NTAgLSBGWDIgZWVwcm9tCisgKiAweDYwIC0gVERBODI2MyAgICAtIFR1bmVyCisgKiAweDc4ID8/PworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBIb2xnZXIgV2FlY2h0bGVyIDxob2xnZXJAY29udmVyZ2VuY2UuZGU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmVsaXggRG9ta2UgPHRtYmluY0BlbGl0ZWR2Yi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtNiBQYXRyaWNrIEJvZXR0Y2hlciA8cGJAbGludXh0di5vcmc+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJ0dHVzYjIiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorCisjaW5jbHVkZSAidHR1c2IyLmgiCisKKyNpbmNsdWRlICJ0ZGE4MjZ4LmgiCisjaW5jbHVkZSAidGRhMTAwODYuaCIKKyNpbmNsdWRlICJsbmJwMjEuaCIKKworLyogZGVidWcgKi8KK3N0YXRpYyBpbnQgZHZiX3VzYl90dHVzYjJfZGVidWc7CisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX3R0dXNiMl9kZWJ1ZywweDAxLGFyZ3MpCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsZHZiX3VzYl90dHVzYjJfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvIChvci1hYmxlKSkuIiBEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CisKK3N0cnVjdCB0dHVzYjJfc3RhdGUgeworCXU4IGlkOworfTsKKworc3RhdGljIGludCB0dHVzYjJfbXNnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggY21kLAorCQl1OCAqd2J1ZiwgaW50IHdsZW4sIHU4ICpyYnVmLCBpbnQgcmxlbikKK3sKKwlzdHJ1Y3QgdHR1c2IyX3N0YXRlICpzdCA9IGQtPnByaXY7CisJdTggc1t3bGVuKzRdLHJbNjRdID0geyAwIH07CisJaW50IHJldCA9IDA7CisKKwltZW1zZXQocywwLHdsZW4rNCk7CisKKwlzWzBdID0gMHhhYTsKKwlzWzFdID0gKytzdC0+aWQ7CisJc1syXSA9IGNtZDsKKwlzWzNdID0gd2xlbjsKKwltZW1jcHkoJnNbNF0sd2J1Zix3bGVuKTsKKworCXJldCA9IGR2Yl91c2JfZ2VuZXJpY19ydyhkLCBzLCB3bGVuKzQsIHIsIDY0LCAwKTsKKworCWlmIChyZXQgICE9IDAgfHwKKwkJclswXSAhPSAweDU1IHx8CisJCXJbMV0gIT0gc1sxXSB8fAorCQlyWzJdICE9IGNtZCB8fAorCQkocmxlbiA+IDAgJiYgclszXSAhPSBybGVuKSkgeworCQl3YXJuKCJ0aGVyZSBtaWdodCBoYXZlIGJlZW4gYW4gZXJyb3IgZHVyaW5nIGNvbnRyb2wgbWVzc2FnZSB0cmFuc2Zlci4gKHJsZW4gPSAlZCwgd2FzICVkKSIscmxlbixyWzNdKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHJsZW4gPiAwKQorCQltZW1jcHkocmJ1ZiwgJnJbNF0sIHJsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHR1c2IyX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCxzdHJ1Y3QgaTJjX21zZyBtc2dbXSxpbnQgbnVtKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJc3RhdGljIHU4IG9idWZbNjBdLCBpYnVmWzYwXTsKKwlpbnQgaSxyZWFkOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+aTJjX211dGV4KSA8IDApCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKG51bSA+IDIpCisJCXdhcm4oIm1vcmUgdGhhbiAyIGkyYyBtZXNzYWdlcyBhdCBhIHRpbWUgaXMgbm90IGhhbmRsZWQgeWV0LiBUT0RPLiIpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXJlYWQgPSBpKzEgPCBudW0gJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpOworCisJCW9idWZbMF0gPSAobXNnW2ldLmFkZHIgPDwgMSkgfCByZWFkOworCQlvYnVmWzFdID0gbXNnW2ldLmxlbjsKKworCQkvKiByZWFkIHJlcXVlc3QgKi8KKwkJaWYgKHJlYWQpCisJCQlvYnVmWzJdID0gbXNnW2krMV0ubGVuOworCQllbHNlCisJCQlvYnVmWzJdID0gMDsKKworCQltZW1jcHkoJm9idWZbM10sbXNnW2ldLmJ1Zixtc2dbaV0ubGVuKTsKKworCQlpZiAodHR1c2IyX21zZyhkLCBDTURfSTJDX1hGRVIsIG9idWYsIG1zZ1tpXS5sZW4rMywgaWJ1Ziwgb2J1ZlsyXSArIDMpIDwgMCkgeworCQkJZXJyKCJpMmMgdHJhbnNmZXIgZmFpbGVkLiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVhZCkgeworCQkJbWVtY3B5KG1zZ1tpKzFdLmJ1ZiwmaWJ1ZlszXSxtc2dbaSsxXS5sZW4pOworCQkJaSsrOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdTMyIHR0dXNiMl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHR0dXNiMl9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgICA9IHR0dXNiMl9pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IHR0dXNiMl9pMmNfZnVuYywKK307CisKKy8qIENhbGxiYWNrcyBmb3IgRFZCIFVTQiAqLworc3RhdGljIGludCB0dHVzYjJfaWRlbnRpZnlfc3RhdGUgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QKKwkJZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyAqcHJvcHMsIHN0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiAqKmRlc2MsCisJCWludCAqY29sZCkKK3sKKwkqY29sZCA9IHVkZXYtPmRlc2NyaXB0b3IuaU1hbnVmYWN0dXJlciA9PSAwICYmIHVkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QgPT0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dHVzYjJfcG93ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKK3sKKwl1OCBiID0gb25vZmY7CisJdHR1c2IyX21zZyhkLCBDTURfUE9XRVIsICZiLCAwLCBOVUxMLCAwKTsKKwlyZXR1cm4gdHR1c2IyX21zZyhkLCBDTURfUE9XRVIsICZiLCAxLCBOVUxMLCAwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHRkYTEwMDg2X2NvbmZpZyB0ZGExMDA4Nl9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDBlLAorCS5pbnZlcnQgPSAwLAorfTsKKworc3RhdGljIGludCB0dHVzYjJfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJaWYgKHVzYl9zZXRfaW50ZXJmYWNlKGFkYXAtPmRldi0+dWRldiwwLDMpIDwgMCkKKwkJZXJyKCJzZXQgaW50ZXJmYWNlIHRvIGFsdHM9MyBmYWlsZWQiKTsKKworCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDg2X2F0dGFjaCwgJnRkYTEwMDg2X2NvbmZpZywgJmFkYXAtPmRldi0+aTJjX2FkYXApKSA9PSBOVUxMKSB7CisJCWRlYl9pbmZvKCJUREExMDA4NiBhdHRhY2ggZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHR1c2IyX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCWlmIChkdmJfYXR0YWNoKHRkYTgyNnhfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIDApID09IE5VTEwpIHsKKwkJZGViX2luZm8oIlREQTgyNjMgYXR0YWNoIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChkdmJfYXR0YWNoKGxuYnAyMV9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMCwgMCkgPT0gTlVMTCkgeworCQlkZWJfaW5mbygiTE5CUDIxIGF0dGFjaCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIERWQiBVU0IgRHJpdmVyIHN0dWZmICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgdHR1c2IyX3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgdHR1c2IyX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmdHR1c2IyX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUsTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB0dHVzYjJfdGFibGUgW10gPSB7CisJCXsgVVNCX0RFVklDRShVU0JfVklEX1BJTk5BQ0xFLCBVU0JfUElEX1BDVFZfNDAwRSkgfSwKKwkJe30JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCB0dHVzYjJfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgdHR1c2IyX3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCisJLnVzYl9jdHJsID0gQ1lQUkVTU19GWDIsCisJLmZpcm13YXJlID0gImR2Yi11c2ItcGN0di00MDBlLTAxLmZ3IiwKKworCS5zaXplX29mX3ByaXYgPSBzaXplb2Yoc3RydWN0IHR0dXNiMl9zdGF0ZSksCisKKwkubnVtX2FkYXB0ZXJzID0gMSwKKwkuYWRhcHRlciA9IHsKKwkJeworCQkJLnN0cmVhbWluZ19jdHJsICAgPSBOVUxMLCAvLyB0dHVzYjJfc3RyZWFtaW5nX2N0cmwsCisKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gdHR1c2IyX2Zyb250ZW5kX2F0dGFjaCwKKwkJCS50dW5lcl9hdHRhY2ggICAgID0gdHR1c2IyX3R1bmVyX2F0dGFjaCwKKworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLnN0cmVhbSA9IHsKKwkJCQkudHlwZSA9IFVTQl9JU09DLAorCQkJCS5jb3VudCA9IDUsCisJCQkJLmVuZHBvaW50ID0gMHgwMiwKKwkJCQkudSA9IHsKKwkJCQkJLmlzb2MgPSB7CisJCQkJCQkuZnJhbWVzcGVydXJiID0gNCwKKwkJCQkJCS5mcmFtZXNpemUgPSA5NDAsCisJCQkJCQkuaW50ZXJ2YWwgPSAxLAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSwKKworCS5wb3dlcl9jdHJsICAgICAgID0gdHR1c2IyX3Bvd2VyX2N0cmwsCisJLmlkZW50aWZ5X3N0YXRlICAgPSB0dHVzYjJfaWRlbnRpZnlfc3RhdGUsCisKKwkuaTJjX2FsZ28gICAgICAgICA9ICZ0dHVzYjJfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7ICAgIlBpbm5hY2xlIDQwMGUgRFZCLVMgVVNCMi4wIiwKKwkJCXsgJnR0dXNiMl90YWJsZVswXSwgTlVMTCB9LAorCQkJeyBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHR0dXNiMl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImR2Yl91c2JfdHR1c2IyIiwKKwkucHJvYmUJCT0gdHR1c2IyX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKKwkuaWRfdGFibGUJPSB0dHVzYjJfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IHR0dXNiMl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisJaWYgKChyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJnR0dXNiMl9kcml2ZXIpKSkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZCIscmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHR0dXNiMl9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZ0dHVzYjJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQgKHR0dXNiMl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCAodHR1c2IyX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgUGlubmFjbGUgUENUViA0MDBlIERWQi1TIFVTQjIuMCIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90dHVzYjIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdHR1c2IyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhNjNhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdHR1c2IyLmgKQEAgLTAsMCArMSw3MCBAQAorLyogRFZCIFVTQiBjb21wbGlhbnQgbGludXggZHJpdmVyIGZvciBUZWNobm90cmVuZCBEVkIgVVNCIGJveGVzIGFuZCBjbG9uZXMKKyAqIChlLmcuIFBpbm5hY2xlIDQwMGUgRFZCLVMgVVNCMi4wKS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSG9sZ2VyIFdhZWNodGxlciA8aG9sZ2VyQGNvbnZlcmdlbmNlLmRlPgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZlbGl4IERvbWtlIDx0bWJpbmNAZWxpdGVkdmIubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA1LTYgUGF0cmljayBCb2V0dGNoZXIgPHBiQGxpbnV4dHYuZGU+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNpZm5kZWYgX0RWQl9VU0JfVFRVU0IyX0hfCisjZGVmaW5lIF9EVkJfVVNCX1RUVVNCMl9IXworCisvKiBUVFVTQiBwcm90b2NvbAorICoKKyAqIGFsd2F5cyB0byBtZXNzYWdlcyAob3V0L2luKQorICogb3V0IG1lc3NhZ2U6CisgKiAweGFhIDxpZD4gPGNtZGJ5dGU+IDxkYXRhbGVuPiA8ZGF0YS4uLj4KKyAqCisgKiBpbiBtZXNzYWdlIChjb21wbGV0ZSBibG9jayBpcyBhbHdheXMgMHg0MCBieXRlcyBsb25nKQorICogMHg1NSA8aWQ+IDxjbWRieXRlPiA8ZGF0YWxlbj4gPGRhdGEuLi4+CisgKgorICogaWQgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggdHJhbnNhY3Rpb24KKyAqLworCisjZGVmaW5lIENNRF9EU1BfRE9XTkxPQUQgICAgMHgxMworLyogb3V0IGRhdGE6IDxieXRlPlsyOF0KKyAqIGxhc3QgYmxvY2sgbXVzdCBiZSBlbXB0eSAqLworCisjZGVmaW5lIENNRF9EU1BfQk9PVCAgICAgICAgMHgxNAorLyogb3V0IGRhdGE6IG5vdGhpbmcgKi8KKworI2RlZmluZSBDTURfUE9XRVIgICAgICAgICAgIDB4MTUKKy8qIG91dCBkYXRhOiA8b249MS9vZmY9MD4gKi8KKworI2RlZmluZSBDTURfTE5CICAgICAgICAgICAgIDB4MTYKKy8qIG91dCBkYXRhOiA8cG93ZXI9MT4gPDE4Vj0wLDEzVj0xPiA8dG9uZT4gPD8/PTE+IDw/Pz0xPiAqLworCisjZGVmaW5lIENNRF9HRVRfVkVSU0lPTiAgICAgMHgxNworLyogaW4gIGRhdGE6IDx2ZXJzaW9uX2J5dGU+WzVdICovCisKKyNkZWZpbmUgQ01EX0RJU0VRQyAgICAgICAgICAweDE4CisvKiBvdXQgZGF0YTogPG1hc3Rlcj0weGZmL2J1cnN0PT8/PiA8Y21kbGVuPiA8Y21kYnl0ZXM+W2NtZGxlbl0gKi8KKworI2RlZmluZSBDTURfUElEX0VOQUJMRSAgICAgIDB4MjIKKy8qIG91dCBkYXRhOiA8aW5kZXg+IDx0eXBlOiB0cz0xL3NlYz0yPiA8cGlkIG1zYj4gPHBpZCBsc2I+ICovCisKKyNkZWZpbmUgQ01EX1BJRF9ESVNBQkxFICAgICAweDIzCisvKiBvdXQgZGF0YTogPGluZGV4PiAqLworCisjZGVmaW5lIENNRF9GSUxURVJfRU5BQkxFICAgMHgyNAorLyogb3V0IGRhdGE6IDxpbmRleD4gPHBpZF9pZHg+IDxmaWx0ZXI+WzEyXSA8bWFzaz5bMTJdICovCisKKyNkZWZpbmUgQ01EX0ZJTFRFUl9ESVNBQkxFICAweDI1CisvKiBvdXQgZGF0YTogPGluZGV4PiAqLworCisjZGVmaW5lIENNRF9HRVRfRFNQX1ZFUlNJT04gMHgyNgorLyogaW4gIGRhdGE6IDx2ZXJzaW9uX2J5dGU+WzI4XSAqLworCisjZGVmaW5lIENNRF9JMkNfWEZFUiAgICAgICAgMHgzMQorLyogb3V0IGRhdGE6IDxhZGRyIDw8IDE+IDxzbmRsZW4+IDxyY3ZsZW4+IDxkYXRhPltzbmRsZW5dCisgKiBpbiAgZGF0YTogPGFkZHIgPDwgMT4gPHNuZGxlbj4gPHJjdmxlbj4gPGRhdGE+W3Jjdmxlbl0gKi8KKworI2RlZmluZSBDTURfSTJDX0JJVFJBVEUgICAgIDB4MzIKKy8qIG91dCBkYXRhOiA8ZGVmYXVsdD0wPiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdW10LTAxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKaW5kZXggZjk5NDFlYS4uZjc3YjQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMKQEAgLTk5LDIxICs5OSwyMSBAQAogCS5udW1fYWRhcHRlcnMgPSAxLAogCS5hZGFwdGVyID0gewogCQl7Ci0JLnN0cmVhbWluZ19jdHJsICAgPSBkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwsCi0JLmZyb250ZW5kX2F0dGFjaCAgPSB1bXRfbXQzNTJfZnJvbnRlbmRfYXR0YWNoLAotCS50dW5lcl9hdHRhY2ggICAgID0gdW10X3R1bmVyX2F0dGFjaCwKKwkJCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAorCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB1bXRfbXQzNTJfZnJvbnRlbmRfYXR0YWNoLAorCQkJLnR1bmVyX2F0dGFjaCAgICAgPSB1bXRfdHVuZXJfYXR0YWNoLAogCi0JLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKIAkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSAyMCwKLQkJLmVuZHBvaW50ID0gMHgwNiwKLQkJLnUgPSB7Ci0JCQkuYnVsayA9IHsKLQkJCQkuYnVmZmVyc2l6ZSA9IDUxMiwKLQkJCX0KLQkJfQotCX0sCisJCQkJLmNvdW50ID0gMjAsCisJCQkJLmVuZHBvaW50ID0gMHgwNiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDUxMiwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCiAKIAkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VzYi11cmIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdXNiLXVyYi5jCmluZGV4IDc4MDM1ZWUuLjM5N2Y1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdXNiLXVyYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdXNiLXVyYi5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAlmb3IgKHN0cmVhbS0+YnVmX251bSA9IDA7IHN0cmVhbS0+YnVmX251bSA8IG51bTsgc3RyZWFtLT5idWZfbnVtKyspIHsKIAkJZGViX21lbSgiYWxsb2NhdGluZyBidWZmZXIgJWRcbiIsc3RyZWFtLT5idWZfbnVtKTsKIAkJaWYgKCggc3RyZWFtLT5idWZfbGlzdFtzdHJlYW0tPmJ1Zl9udW1dID0KLQkJCQkJdXNiX2J1ZmZlcl9hbGxvYyhzdHJlYW0tPnVkZXYsIHNpemUsIFNMQUJfQVRPTUlDLAorCQkJCQl1c2JfYnVmZmVyX2FsbG9jKHN0cmVhbS0+dWRldiwgc2l6ZSwgR0ZQX0FUT01JQywKIAkJCQkJJnN0cmVhbS0+ZG1hX2FkZHJbc3RyZWFtLT5idWZfbnVtXSkgKSA9PSBOVUxMKSB7CiAJCQlkZWJfbWVtKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgdXJiLWJ1ZmZlciBhbGxvY2F0aW9uLlxuIik7CiAJCQl1c2JfZnJlZV9zdHJlYW1fYnVmZmVycyhzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LmMKaW5kZXggMDJiZDYxYS4uMTY1MzNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMnguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC5jCkBAIC0yNzUsMjIgKzI3NSwyMiBAQAogCQkJLmNhcHMgICAgICAgICAgICAgPSBEVkJfVVNCX0FEQVBfUkVDRUlWRVNfMjA0X0JZVEVfVFMsCiAKIAkJCS5zdHJlYW1pbmdfY3RybCAgID0gdnA3MDJ4X3N0cmVhbWluZ19jdHJsLAotCS5mcm9udGVuZF9hdHRhY2ggID0gdnA3MDJ4X2Zyb250ZW5kX2F0dGFjaCwKKwkJCS5mcm9udGVuZF9hdHRhY2ggID0gdnA3MDJ4X2Zyb250ZW5kX2F0dGFjaCwKIAotCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkJCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KIAkJCS5zdHJlYW0gPSB7CiAJCQkJLnR5cGUgPSBVU0JfQlVMSywKIAkJCQkuY291bnQgPSAxMCwKLQkJLmVuZHBvaW50ID0gMHgwMiwKLQkJLnUgPSB7Ci0JCQkuYnVsayA9IHsKLQkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCi0JCQl9Ci0JCX0KLQl9LAorCQkJCS5lbmRwb2ludCA9IDB4MDIsCisJCQkJLnUgPSB7CisJCQkJCS5idWxrID0geworCQkJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJCQl9CisJCQkJfQorCQkJfSwKIAkJCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCB2cDcwMnhfc3RhdGUpLAogCQl9Ci0JCX0sCisJfSwKIAkucmVhZF9tYWNfYWRkcmVzcyA9IHZwNzAyeF9yZWFkX21hY19hZGRyLAogCiAJLnJjX2tleV9tYXAgICAgICAgPSB2cDcwMnhfcmNfa2V5cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5jCmluZGV4IGI0Y2YwMDIuLjY5YTQ2YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYwpAQCAtMTI1LDcgKzEyNSwyNSBAQAogCXsgMHgwMCwgMHgwMCwgS0VZX1RBQiB9LCAvKiBUYWIgKi8KIAl7IDB4MDAsIDB4NDgsIEtFWV9JTkZPIH0sIC8qIFByZXZpZXcgKi8KIAl7IDB4MDAsIDB4MDQsIEtFWV9MSVNUIH0sIC8qIFJlY29yZExpc3QgKi8KLQl7IDB4MDAsIDB4MGYsIEtFWV9URVhUIH0gLyogVGVsZXRleHQgKi8KKwl7IDB4MDAsIDB4MGYsIEtFWV9URVhUIH0sIC8qIFRlbGV0ZXh0ICovCisJeyAweDAwLCAweDQxLCBLRVlfUFJFVklPVVNTT05HIH0sCisJeyAweDAwLCAweDQyLCBLRVlfTkVYVFNPTkcgfSwKKwl7IDB4MDAsIDB4NGIsIEtFWV9VUCB9LAorCXsgMHgwMCwgMHg1MSwgS0VZX0RPV04gfSwKKwl7IDB4MDAsIDB4NGUsIEtFWV9MRUZUIH0sCisJeyAweDAwLCAweDUyLCBLRVlfUklHSFQgfSwKKwl7IDB4MDAsIDB4NGYsIEtFWV9FTlRFUiB9LAorCXsgMHgwMCwgMHgxMywgS0VZX0NBTkNFTCB9LAorCXsgMHgwMCwgMHg0YSwgS0VZX0NMRUFSIH0sCisJeyAweDAwLCAweDU0LCBLRVlfUFJJTlQgfSwgLyogQ2FwdHVyZSAqLworCXsgMHgwMCwgMHg0MywgS0VZX1NVQlRJVExFIH0sIC8qIFN1YnRpdGxlL0NDICovCisJeyAweDAwLCAweDA4LCBLRVlfVklERU8gfSwgLyogQS9WICovCisJeyAweDAwLCAweDA3LCBLRVlfU0xFRVAgfSwgLyogSGliZXJuYXRlICovCisJeyAweDAwLCAweDQ1LCBLRVlfWk9PTSB9LCAvKiBab29tKyAqLworCXsgMHgwMCwgMHgxOCwgS0VZX1JFRH0sCisJeyAweDAwLCAweDUzLCBLRVlfR1JFRU59LAorCXsgMHgwMCwgMHg1ZSwgS0VZX1lFTExPV30sCisJeyAweDAwLCAweDVmLCBLRVlfQkxVRX0KIH07CiAKIHN0YXRpYyBpbnQgdnA3MDQ1X3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTMyICpldmVudCwgaW50ICpzdGF0ZSkKQEAgLTIxNywxOCArMjM1LDE4IEBACiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7CiAJCXsKLQkuZnJvbnRlbmRfYXR0YWNoICA9IHZwNzA0NV9mcm9udGVuZF9hdHRhY2gsCi0JLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCQkJLmZyb250ZW5kX2F0dGFjaCAgPSB2cDcwNDVfZnJvbnRlbmRfYXR0YWNoLAorCQkJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLwogCQkJLnN0cmVhbSA9IHsKIAkJCQkudHlwZSA9IFVTQl9CVUxLLAotCQkuY291bnQgPSA3LAotCQkuZW5kcG9pbnQgPSAweDAyLAotCQkudSA9IHsKLQkJCS5idWxrID0gewotCQkJCS5idWZmZXJzaXplID0gNDA5NiwKLQkJCX0KLQkJfQotCX0sCisJCQkJLmNvdW50ID0gNywKKwkJCQkuZW5kcG9pbnQgPSAweDAyLAorCQkJCS51ID0geworCQkJCQkuYnVsayA9IHsKKwkJCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCQkJfQorCQkJCX0KKwkJCX0sCiAJCX0KIAl9LAogCS5wb3dlcl9jdHJsICAgICAgID0gdnA3MDQ1X3Bvd2VyX2N0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCmluZGV4IDA4MGZhMjUuLmFmMzE0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCkBAIC0xNzIsNiArMTcyLDIyIEBACiAJICBBIERWQi1UIHR1bmVyIG1vZHVsZS4gRGVzaWduZWQgZm9yIG1vYmlsZSB1c2FnZS4gU2F5IFkgd2hlbiB5b3Ugd2FudAogCSAgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX0RJQjcwMDBNCisJdHJpc3RhdGUgIkRpQmNvbSA3MDAwTUEvTUIvUEEvUEIvTUMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIEEgRFZCLVQgdHVuZXIgbW9kdWxlLiBEZXNpZ25lZCBmb3IgbW9iaWxlIHVzYWdlLiBTYXkgWSB3aGVuIHlvdSB3YW50CisJICB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKK2NvbmZpZyBEVkJfRElCNzAwMFAKKwl0cmlzdGF0ZSAiRGlCY29tIDcwMDBQQyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgQSBEVkItVCB0dW5lciBtb2R1bGUuIERlc2lnbmVkIGZvciBtb2JpbGUgdXNhZ2UuIFNheSBZIHdoZW4geW91IHdhbnQKKwkgIHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KKwogY29tbWVudCAiRFZCLUMgKGNhYmxlKSBmcm9udGVuZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogCkBAIC0yNzYsOSArMjkyLDE5IEBACiAKIGNvbmZpZyBEVkJfVFVORVJfTVQyMDYwCiAJdHJpc3RhdGUgIk1pY3JvdHVuZSBNVDIwNjAgc2lsaWNvbiBJRiB0dW5lciIKKwlkZXBlbmRzIG9uIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCiAJaGVscAogCSAgQSBkcml2ZXIgZm9yIHRoZSBzaWxpY29uIElGIHR1bmVyIE1UMjA2MCBmcm9tIE1pY3JvdHVuZS4KIAorY29uZmlnIERWQl9UVU5FUl9MR0gwNlhGCisJdHJpc3RhdGUgIkxHIFREVlMtSDA2eEYgQVRTQyB0dW5lciIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCXNlbGVjdCBEVkJfUExMCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBBIGRyaXZlciBmb3IgdGhlIExHIFREVlMtSDA2eEYgQVRTQyB0dW5lciBmYW1pbHkuCisKIGNvbW1lbnQgIk1pc2NlbGxhbmVvdXMgZGV2aWNlcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQppbmRleCBkY2U5Y2YwLi4zZmE2ZTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCkBAIC0xMyw2ICsxMyw4IEBACiBvYmotJChDT05GSUdfRFZCX0w2NDc4MSkgKz0gbDY0NzgxLm8KIG9iai0kKENPTkZJR19EVkJfRElCMzAwME1CKSArPSBkaWIzMDAwbWIubwogb2JqLSQoQ09ORklHX0RWQl9ESUIzMDAwTUMpICs9IGRpYjMwMDBtYy5vIGRpYngwMDBfY29tbW9uLm8KK29iai0kKENPTkZJR19EVkJfRElCNzAwME0pICs9IGRpYjcwMDBtLm8gZGlieDAwMF9jb21tb24ubworb2JqLSQoQ09ORklHX0RWQl9ESUI3MDAwUCkgKz0gZGliNzAwMHAubyBkaWJ4MDAwX2NvbW1vbi5vCiBvYmotJChDT05GSUdfRFZCX01UMzEyKSArPSBtdDMxMi5vCiBvYmotJChDT05GSUdfRFZCX1ZFUzE4MjApICs9IHZlczE4MjAubwogb2JqLSQoQ09ORklHX0RWQl9WRVMxWDkzKSArPSB2ZXMxeDkzLm8KQEAgLTM3LDMgKzM5LDQgQEAKIG9iai0kKENPTkZJR19EVkJfVERBODI2WCkgKz0gdGRhODI2eC5vCiBvYmotJChDT05GSUdfRFZCX1RVTkVSX01UMjA2MCkgKz0gbXQyMDYwLm8KIG9iai0kKENPTkZJR19EVkJfVFVBNjEwMCkgKz0gdHVhNjEwMC5vCitvYmotJChDT05GSUdfRFZCX1RVTkVSX0xHSDA2WEYpICs9IGxnaDA2eGYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9iY20zNTEwLmgKaW5kZXggNmRmYTgzOS4uN2U0Zjk1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5oCkBAIC0zNCw3ICszNCw3IEBACiAJaW50ICgqcmVxdWVzdF9maXJtd2FyZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfQkNNMzUxMCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX0JDTTM1MTBfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9CQ00zNTEwKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0JDTTM1MTBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogYmNtMzUxMF9hdHRhY2goY29uc3Qgc3RydWN0IGJjbTM1MTBfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuaAppbmRleCAxMDI4NmNjLi43YWMzMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAwLmgKQEAgLTMxLDcgKzMxLDcgQEAKIAl1OCBkZW1vZF9hZGRyZXNzOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9DWDIyNzAwKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfQ1gyMjcwMF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0NYMjI3MDApIHx8IChkZWZpbmVkKENPTkZJR19EVkJfQ1gyMjcwMF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBjeDIyNzAwX2F0dGFjaChjb25zdCBzdHJ1Y3QgY3gyMjcwMF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5oCmluZGV4IGJjMjE3ZGQuLjljZDY0ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaApAQCAtNDEsNyArNDEsNyBAQAogCXU4IG91dHB1dF9tb2RlOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9DWDIyNzAyKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfQ1gyMjcwMl9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0NYMjI3MDIpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfQ1gyMjcwMl9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBjeDIyNzAyX2F0dGFjaChjb25zdCBzdHJ1Y3QgY3gyMjcwMl9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oCmluZGV4IGM5ZDVhZTIuLjBjYTNhZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaApAQCAtNDEsNyArNDEsNyBAQAogCXJldHVybiByOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX0NYMjQxMTApIHx8IGRlZmluZWQoQ09ORklHX0RWQl9DWDI0MTEwX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfQ1gyNDExMCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9DWDI0MTEwX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGN4MjQxMTBfYXR0YWNoKGNvbnN0IHN0cnVjdCBjeDI0MTEwX2NvbmZpZyogY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmgKaW5kZXggNTdhMWRhZS4uODRmOWU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5oCkBAIC0zNSw3ICszNSw3IEBACiAJaW50IGxuYl9wb2xhcml0eTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfQ1gyNDEyMykgfHwgZGVmaW5lZChDT05GSUdfRFZCX0NYMjQxMjNfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9DWDI0MTIzKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0NYMjQxMjNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogY3gyNDEyM19hdHRhY2goY29uc3Qgc3RydWN0IGN4MjQxMjNfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDAuaAppbmRleCAwY2FhYzNmLi5hNmQzODU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLmgKQEAgLTQxLDcgKzQxLDcgQEAKIAlpbnQgKCp0dW5lcl9wYXNzX2N0cmwpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgb25vZmYsIHU4IHBsbF9jdHJsKTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfRElCMzAwME1CKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfRElCMzAwME1CX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfRElCMzAwME1CKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0RJQjMwMDBNQl9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBkaWIzMDAwbWJfYXR0YWNoKGNvbnN0IHN0cnVjdCBkaWIzMDAwX2NvbmZpZyogY29uZmlnLAogCQkJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLCBzdHJ1Y3QgZGliX2ZlX3hmZXJfb3BzICp4ZmVyX29wcyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCmluZGV4IGNjYzgxM2IuLjVkYTY2MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKQEAgLTM0NSw3ICszNDUsNyBAQAogCiAJLyogYWdjICovCiAJZGliMzAwMG1jX3dyaXRlX3dvcmQoc3RhdGUsIDM2LCBzdGF0ZS0+Y2ZnLT5tYXhfdGltZSk7Ci0JZGliMzAwMG1jX3dyaXRlX3dvcmQoc3RhdGUsIDM3LCBhZ2MtPnNldHVwKTsKKwlkaWIzMDAwbWNfd3JpdGVfd29yZChzdGF0ZSwgMzcsIChzdGF0ZS0+Y2ZnLT5hZ2NfY29tbWFuZDEgPDwgMTMpIHwgKHN0YXRlLT5jZmctPmFnY19jb21tYW5kMiA8PCAxMikgfCAoMHgxZCA8PCAwKSk7CiAJZGliMzAwMG1jX3dyaXRlX3dvcmQoc3RhdGUsIDM4LCBzdGF0ZS0+Y2ZnLT5wd20zX3ZhbHVlKTsKIAlkaWIzMDAwbWNfd3JpdGVfd29yZChzdGF0ZSwgMzksIHN0YXRlLT5jZmctPmxuX2FkY19sZXZlbCk7CiAKQEAgLTUxMSwxNiArNTExLDExIEBACiAKIAogCS8qIGEgY2hhbm5lbCBmb3IgYXV0b3NlYXJjaCAqLwotCXJlZyA9IDA7Ci0JaWYgKGNoYW4tPm5mZnQgPT0gLTEgJiYgY2hhbi0+Z3VhcmQgPT0gLTEpIHJlZyA9IDc7Ci0JaWYgKGNoYW4tPm5mZnQgPT0gLTEgJiYgY2hhbi0+Z3VhcmQgIT0gLTEpIHJlZyA9IDI7Ci0JaWYgKGNoYW4tPm5mZnQgIT0gLTEgJiYgY2hhbi0+Z3VhcmQgPT0gLTEpIHJlZyA9IDM7Ci0KIAlmY2hhbi5uZmZ0ID0gMTsgZmNoYW4uZ3VhcmQgPSAwOyBmY2hhbi5ucWFtID0gMjsKIAlmY2hhbi52aXRfYWxwaGEgPSAxOyBmY2hhbi52aXRfY29kZV9yYXRlX2hwID0gMjsgZmNoYW4udml0X2NvZGVfcmF0ZV9scCA9IDI7CiAJZmNoYW4udml0X2hyY2ggPSAwOyBmY2hhbi52aXRfc2VsZWN0X2hwID0gMTsKIAotCWRpYjMwMDBtY19zZXRfY2hhbm5lbF9jZmcoc3RhdGUsICZmY2hhbiwgcmVnKTsKKwlkaWIzMDAwbWNfc2V0X2NoYW5uZWxfY2ZnKHN0YXRlLCAmZmNoYW4sIDcpOwogCiAJcmVnID0gZGliMzAwMG1jX3JlYWRfd29yZChzdGF0ZSwgMCk7CiAJZGliMzAwMG1jX3dyaXRlX3dvcmQoc3RhdGUsIDAsIHJlZyB8ICgxIDw8IDgpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuaAppbmRleCBiMTk4Y2Q1Li43MmQ0NzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5oCkBAIC0yOCw2ICsyOCw5IEBACiAJdTE2IG1heF90aW1lOwogCXUxNiBsbl9hZGNfbGV2ZWw7CiAKKwl1OCBhZ2NfY29tbWFuZDEgOjE7CisJdTggYWdjX2NvbW1hbmQyIDoxOworCiAJdTggbW9iaWxlX21vZGU7CiAKIAl1OCBvdXRwdXRfbXBlZzJfaW5fMTg4X2J5dGVzOwpAQCAtMzYsNyArMzksNyBAQAogI2RlZmluZSBERUZBVUxUX0RJQjMwMDBNQ19JMkNfQUREUkVTUyAxNgogI2RlZmluZSBERUZBVUxUX0RJQjMwMDBQX0kyQ19BRERSRVNTICAyNAogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX0RJQjMwMDBNQykgfHwgZGVmaW5lZChDT05GSUdfRFZCX0RJQjMwMDBNQ19NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0RJQjMwMDBNQykgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9ESUIzMDAwTUNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqIGRpYjMwMDBtY19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgdTggaTJjX2FkZHIsIHN0cnVjdCBkaWIzMDAwbWNfY29uZmlnICpjZmcpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqIGRpYjMwMDBtY19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgdTggaTJjX2FkZHIsIHN0cnVjdCBkaWIzMDAwbWNfY29uZmlnICpjZmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDQwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMG0uYwpAQCAtMCwwICsxLDExOTEgQEAKKy8qCisgKiBMaW51eC1EVkIgRHJpdmVyIGZvciBEaUJjb20ncyBEaUI3MDAwTSBhbmQKKyAqICAgICAgICAgICAgICBmaXJzdCBnZW5lcmF0aW9uIERpQjcwMDBQLWRlbW9kdWxhdG9yLWZhbWlseS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtNiBEaUJjb20gKGh0dHA6Ly93d3cuZGliY29tLmZyLykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNpbmNsdWRlICJkaWI3MDAwbS5oIgorCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInR1cm4gb24gZGVidWdnaW5nIChkZWZhdWx0OiAwKSIpOworCisjZGVmaW5lIGRwcmludGsoYXJncy4uLikgZG8geyBpZiAoZGVidWcpIHsgcHJpbnRrKEtFUk5fREVCVUcgIkRpQjcwMDBNOiIpOyBwcmludGsoYXJncyk7IH0gfSB3aGlsZSAoMCkKKworc3RydWN0IGRpYjcwMDBtX3N0YXRlIHsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGRlbW9kOworICAgIHN0cnVjdCBkaWI3MDAwbV9jb25maWcgY2ZnOworCisJdTggaTJjX2FkZHI7CisJc3RydWN0IGkyY19hZGFwdGVyICAgKmkyY19hZGFwOworCisJc3RydWN0IGRpYngwMDBfaTJjX21hc3RlciBpMmNfbWFzdGVyOworCisvKiBvZmZzZXQgaXMgMSBpbiBjYXNlIG9mIHRoZSA3MDAwTUMgKi8KKwl1OCByZWdfb2ZmczsKKworCXUxNiB3YmRfcmVmOworCisJdTggY3VycmVudF9iYW5kOworCWZlX2JhbmR3aWR0aF90IGN1cnJlbnRfYmFuZHdpZHRoOworCXN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgKmN1cnJlbnRfYWdjOworCXUzMiB0aW1mOworCisJdTE2IHJldmlzaW9uOworfTsKKworZW51bSBkaWI3MDAwbV9wb3dlcl9tb2RlIHsKKwlESUI3MDAwTV9QT1dFUl9BTEwgPSAwLAorCisJRElCNzAwME1fUE9XRVJfTk8sCisJRElCNzAwME1fUE9XRVJfSU5URVJGX0FOQUxPR19BR0MsCisJRElCNzAwME1fUE9XRVJfQ09SNF9ESU5UTFZfSUNJUk1fRVFVQUxfQ0ZST0QsCisJRElCNzAwME1fUE9XRVJfQ09SNF9DUllfRVNSQU1fTU9VVF9OVUQsCisJRElCNzAwME1fUE9XRVJfSU5URVJGQUNFX09OTFksCit9OworCitzdGF0aWMgdTE2IGRpYjcwMDBtX3JlYWRfd29yZChzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlLCB1MTYgcmVnKQoreworCXU4IHdiWzJdID0geyAocmVnID4+IDgpIHwgMHg4MCwgcmVnICYgMHhmZiB9OworCXU4IHJiWzJdOworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKKwkJeyAuYWRkciA9IHN0YXRlLT5pMmNfYWRkciA+PiAxLCAuZmxhZ3MgPSAwLCAgICAgICAgLmJ1ZiA9IHdiLCAubGVuID0gMiB9LAorCQl7IC5hZGRyID0gc3RhdGUtPmkyY19hZGRyID4+IDEsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gcmIsIC5sZW4gPSAyIH0sCisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyY19hZGFwLCBtc2csIDIpICE9IDIpCisJCWRwcmludGsoImkyYyByZWFkIGVycm9yIG9uICVkXG4iLHJlZyk7CisKKwlyZXR1cm4gKHJiWzBdIDw8IDgpIHwgcmJbMV07Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMG1fd3JpdGVfd29yZChzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlLCB1MTYgcmVnLCB1MTYgdmFsKQoreworCXU4IGJbNF0gPSB7CisJCShyZWcgPj4gOCkgJiAweGZmLCByZWcgJiAweGZmLAorCQkodmFsID4+IDgpICYgMHhmZiwgdmFsICYgMHhmZiwKKwl9OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKKwkJLmFkZHIgPSBzdGF0ZS0+aTJjX2FkZHIgPj4gMSwgLmZsYWdzID0gMCwgLmJ1ZiA9IGIsIC5sZW4gPSA0CisJfTsKKwlyZXR1cm4gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSA/IC1FUkVNT1RFSU8gOiAwOworfQorc3RhdGljIGludCBkaWI3MDAwbV9zZXRfb3V0cHV0X21vZGUoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSwgaW50IG1vZGUpCit7CisJaW50ICAgIHJldCA9IDA7CisJdTE2IG91dHJlZywgZmlmb190aHJlc2hvbGQsIHNtb19tb2RlLAorCQlzcmFtID0gMHgwMDA1OyAvKiBieSBkZWZhdWx0IFNSQU0gb3V0cHV0IGlzIGRpc2FibGVkICovCisKKwlvdXRyZWcgPSAwOworCWZpZm9fdGhyZXNob2xkID0gMTc5MjsKKwlzbW9fbW9kZSA9IChkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDI5NCArIHN0YXRlLT5yZWdfb2ZmcykgJiAweDAwMTApIHwgKDEgPDwgMSk7CisKKwlkcHJpbnRrKCItSS0gIFNldHRpbmcgb3V0cHV0IG1vZGUgZm9yIGRlbW9kICVwIHRvICVkXG4iLAorCQkJJnN0YXRlLT5kZW1vZCwgbW9kZSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBPVVRNT0RFX01QRUcyX1BBUl9HQVRFRF9DTEs6ICAgLy8gU1RCcyB3aXRoIHBhcmFsbGVsIGdhdGVkIGNsb2NrCisJCQlvdXRyZWcgPSAoMSA8PCAxMCk7ICAvKiAweDA0MDAgKi8KKwkJCWJyZWFrOworCQljYXNlIE9VVE1PREVfTVBFRzJfUEFSX0NPTlRfQ0xLOiAgICAvLyBTVEJzIHdpdGggcGFyYWxsZWwgY29udGludWVzIGNsb2NrCisJCQlvdXRyZWcgPSAoMSA8PCAxMCkgfCAoMSA8PCA2KTsgLyogMHgwNDQwICovCisJCQlicmVhazsKKwkJY2FzZSBPVVRNT0RFX01QRUcyX1NFUklBTDogICAgICAgICAgLy8gU1RCcyB3aXRoIHNlcmlhbCBpbnB1dAorCQkJb3V0cmVnID0gKDEgPDwgMTApIHwgKDIgPDwgNikgfCAoMCA8PCAxKTsgLyogMHgwNDgyICovCisJCQlicmVhazsKKwkJY2FzZSBPVVRNT0RFX0RJVkVSU0lUWToKKwkJCWlmIChzdGF0ZS0+Y2ZnLmhvc3RidXNfZGl2ZXJzaXR5KQorCQkJCW91dHJlZyA9ICgxIDw8IDEwKSB8ICg0IDw8IDYpOyAvKiAweDA1MDAgKi8KKwkJCWVsc2UKKwkJCQlzcmFtICAgfD0gMHgwYzAwOworCQkJYnJlYWs7CisJCWNhc2UgT1VUTU9ERV9NUEVHMl9GSUZPOiAgICAgICAgICAgIC8vIGUuZy4gVVNCIGZlZWRpbmcKKwkJCXNtb19tb2RlIHw9ICgzIDw8IDEpOworCQkJZmlmb190aHJlc2hvbGQgPSA1MTI7CisJCQlvdXRyZWcgPSAoMSA8PCAxMCkgfCAoNSA8PCA2KTsKKwkJCWJyZWFrOworCQljYXNlIE9VVE1PREVfSElHSF9aOiAgLy8gZGlzYWJsZQorCQkJb3V0cmVnID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygiVW5oYW5kbGVkIG91dHB1dF9tb2RlIHBhc3NlZCB0byBiZSBzZXQgZm9yIGRlbW9kICVwXG4iLCZzdGF0ZS0+ZGVtb2QpOworCQkJYnJlYWs7CisJfQorCisJaWYgKHN0YXRlLT5jZmcub3V0cHV0X21wZWcyX2luXzE4OF9ieXRlcykKKwkJc21vX21vZGUgfD0gKDEgPDwgNSkgOworCisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsICAyOTQgKyBzdGF0ZS0+cmVnX29mZnMsIHNtb19tb2RlKTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgIDI5NSArIHN0YXRlLT5yZWdfb2ZmcywgZmlmb190aHJlc2hvbGQpOyAvKiBzeW5jaHJvbm91cyBmcmVhZCAqLworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxNzk1LCBvdXRyZWcpOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxODA1LCBzcmFtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMG1fc2V0X3Bvd2VyX21vZGUoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSwgZW51bSBkaWI3MDAwbV9wb3dlcl9tb2RlIG1vZGUpCit7CisJLyogYnkgZGVmYXVsdCBldmVyeXRoaW5nIGlzIGdvaW5nIHRvIGJlIHBvd2VyZWQgb2ZmICovCisJdTE2IHJlZ185MDMgPSAweGZmZmYsIHJlZ185MDQgPSAweGZmZmYsIHJlZ185MDUgPSAweGZmZmYsIHJlZ185MDYgID0gMHgzZmZmOworCisJLyogbm93LCBkZXBlbmRpbmcgb24gdGhlIHJlcXVlc3RlZCBtb2RlLCB3ZSBwb3dlciBvbiAqLworCXN3aXRjaCAobW9kZSkgeworCQkvKiBwb3dlciB1cCBldmVyeXRoaW5nIGluIHRoZSBkZW1vZCAqLworCQljYXNlIERJQjcwMDBNX1BPV0VSX0FMTDoKKwkJCXJlZ185MDMgPSAweDAwMDA7IHJlZ185MDQgPSAweDAwMDA7IHJlZ185MDUgPSAweDAwMDA7IHJlZ185MDYgPSAweDAwMDA7CisJCQlicmVhazsKKworCQkvKiBqdXN0IGxlYXZlIHBvd2VyIG9uIHRoZSBjb250cm9sLWludGVyZmFjZXM6IEdQSU8gYW5kIChJMkMgb3IgU0RJTyBvciBTUkFNKSAqLworCQljYXNlIERJQjcwMDBNX1BPV0VSX0lOVEVSRkFDRV9PTkxZOiAvKiBUT0RPIHBvd2VyIHVwIGVpdGhlciBTRElPIG9yIEkyQyBvciBTUkFNICovCisJCQlyZWdfOTA1ICY9IH4oKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDUpIHwgKDEgPDwgMikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUI3MDAwTV9QT1dFUl9JTlRFUkZfQU5BTE9HX0FHQzoKKwkJCXJlZ185MDMgJj0gfigoMSA8PCAxNSkgfCAoMSA8PCAxNCkgfCAoMSA8PCAxMSkgfCAoMSA8PCAxMCkpOworCQkJcmVnXzkwNSAmPSB+KCgxIDw8IDcpIHwgKDEgPDwgNikgfCAoMSA8PCA1KSB8ICgxIDw8IDQpIHwgKDEgPDwgMikpOworCQkJcmVnXzkwNiAmPSB+KCgxIDw8IDApKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElCNzAwME1fUE9XRVJfQ09SNF9ESU5UTFZfSUNJUk1fRVFVQUxfQ0ZST0Q6CisJCQlyZWdfOTAzID0gMHgwMDAwOyByZWdfOTA0ID0gMHg4MDFmOyByZWdfOTA1ID0gMHgwMDAwOyByZWdfOTA2ID0gMHgwMDAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUI3MDAwTV9QT1dFUl9DT1I0X0NSWV9FU1JBTV9NT1VUX05VRDoKKwkJCXJlZ185MDMgPSAweDAwMDA7IHJlZ185MDQgPSAweDgwMDA7IHJlZ185MDUgPSAweDAxMGI7IHJlZ185MDYgPSAweDAwMDA7CisJCQlicmVhazsKKwkJY2FzZSBESUI3MDAwTV9QT1dFUl9OTzoKKwkJCWJyZWFrOworCX0KKworCS8qIGFsd2F5cyBwb3dlciBkb3duIHVudXNlZCBwYXJ0cyAqLworCWlmICghc3RhdGUtPmNmZy5tb2JpbGVfbW9kZSkKKwkJcmVnXzkwNCB8PSAoMSA8PCA3KSB8ICgxIDw8IDYpIHwgKDEgPDwgNCkgfCAoMSA8PCAyKSB8ICgxIDw8IDEpOworCisJLyogUF9zZGlvX3NlbGVjdF9jbGsgPSAwIG9uIE1DICovCisJaWYgKHN0YXRlLT5yZXZpc2lvbiAhPSAweDQwMDApCisJCXJlZ185MDYgPDw9IDE7CisKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAgOTAzLCAgcmVnXzkwMyk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgIDkwNCwgIHJlZ185MDQpOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsICA5MDUsICByZWdfOTA1KTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAgOTA2LCAgcmVnXzkwNik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwbV9zZXRfYWRjX3N0YXRlKHN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUsIGVudW0gZGlieDAwMF9hZGNfc3RhdGVzIG5vKQoreworCWludCByZXQgPSAwOworCXUxNiByZWdfOTEzID0gZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLCA5MTMpLAorCSAgICAgICByZWdfOTE0ID0gZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLCA5MTQpOworCisJc3dpdGNoIChubykgeworCQljYXNlIERJQlgwMDBfU0xPV19BRENfT046CisJCQlyZWdfOTE0IHw9ICgxIDw8IDEpIHwgKDEgPDwgMCk7CisJCQlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgOTE0LCByZWdfOTE0KTsKKwkJCXJlZ185MTQgJj0gfigxIDw8IDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUJYMDAwX1NMT1dfQURDX09GRjoKKwkJCXJlZ185MTQgfD0gICgxIDw8IDEpIHwgKDEgPDwgMCk7CisJCQlicmVhazsKKworCQljYXNlIERJQlgwMDBfQURDX09OOgorCQkJaWYgKHN0YXRlLT5yZXZpc2lvbiA9PSAweDQwMDApIHsgLy8gd29ya2Fyb3VuZCBmb3IgUEEvTUEKKwkJCQkvLyBwb3dlci11cCBBREMKKwkJCQlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA5MTMsIDApOworCQkJCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkxNCwgcmVnXzkxNCAmIDB4Myk7CisJCQkJLy8gcG93ZXItZG93biBiYW5kZ2FnCisJCQkJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgOTEzLCAoMSA8PCAxNSkpOworCQkJCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkxNCwgcmVnXzkxNCAmIDB4Myk7CisJCQl9CisKKwkJCXJlZ185MTMgJj0gMHgwZmZmOworCQkJcmVnXzkxNCAmPSAweDAwMDM7CisJCQlicmVhazsKKworCQljYXNlIERJQlgwMDBfQURDX09GRjogLy8gbGVhdmUgdGhlIFZCRyB2b2x0YWdlIG9uCisJCQlyZWdfOTEzIHw9ICgxIDw8IDE0KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDEyKTsKKwkJCXJlZ185MTQgfD0gKDEgPDwgNSkgfCAoMSA8PCA0KSB8ICgxIDw8IDMpIHwgKDEgPDwgMik7CisJCQlicmVhazsKKworCQljYXNlIERJQlgwMDBfVkJHX0VOQUJMRToKKwkJCXJlZ185MTMgJj0gfigxIDw8IDE1KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElCWDAwMF9WQkdfRElTQUJMRToKKwkJCXJlZ185MTMgfD0gKDEgPDwgMTUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworLy8JZHByaW50aygiLUQtICA5MTM6ICV4LCA5MTQ6ICV4XG4iLCByZWdfOTEzLCByZWdfOTE0KTsKKworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA5MTMsIHJlZ185MTMpOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA5MTQsIHJlZ185MTQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkaWI3MDAwbV9zZXRfYmFuZHdpZHRoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kLCB1OCBid19pZHgpCit7CisJc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSA9IGRlbW9kLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiB0aW1mOworCisJLy8gc3RvcmUgdGhlIGN1cnJlbnQgYmFuZHdpZHRoIGZvciBsYXRlciB1c2UKKwlzdGF0ZS0+Y3VycmVudF9iYW5kd2lkdGggPSBid19pZHg7CisKKwlpZiAoc3RhdGUtPnRpbWYgPT0gMCkgeworCQlkcHJpbnRrKCItRC0gIFVzaW5nIGRlZmF1bHQgdGltZlxuIik7CisJCXRpbWYgPSBzdGF0ZS0+Y2ZnLmJ3LT50aW1mOworCX0gZWxzZSB7CisJCWRwcmludGsoIi1ELSAgVXNpbmcgdXBkYXRlZCB0aW1mXG4iKTsKKwkJdGltZiA9IHN0YXRlLT50aW1mOworCX0KKworCXRpbWYgPSB0aW1mICogKEJXX0lOREVYX1RPX0tIWihid19pZHgpIC8gMTAwKSAvIDgwOworCisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMjMsICh0aW1mID4+IDE2KSAmIDB4ZmZmZik7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMjQsICh0aW1mICAgICAgKSAmIDB4ZmZmZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwbV9zYWRfY2FsaWIoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSkKK3sKKworLyogaW50ZXJuYWwgKi8KKy8vCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkyOCwgKDMgPDwgMTQpIHwgKDEgPDwgMTIpIHwgKDUyNCA8PCAwKSk7IC8vIHNhbXBsaW5nIGNsb2NrIG9mIHRoZSBTQUQgaXMgd3JpdHRpbmcgaW4gc2V0X2JhbmR3aWR0aAorCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkyOSwgKDAgPDwgMSkgfCAoMCA8PCAwKSk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgOTMwLCA3NzYpOyAvLyAwLjYyNSozLjMgLyA0MDk2CisKKwkvKiBkbyB0aGUgY2FsaWJyYXRpb24gKi8KKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA5MjksICgxIDw8IDApKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA5MjksICgwIDw8IDApKTsKKworCW1zbGVlcCgxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaWI3MDAwbV9yZXNldF9wbGxfY29tbW9uKHN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUsIGNvbnN0IHN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgKmJ3KQoreworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDE4LCAoKGJ3LT5pbnRlcm5hbCoxMDAwKSA+PiAxNikgJiAweGZmZmYpOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDE5LCAgKGJ3LT5pbnRlcm5hbCoxMDAwKSAgICAgICAgJiAweGZmZmYpOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDIxLCAgKGJ3LT5pZnJlcSAgICAgICAgICA+PiAxNikgJiAweGZmZmYpOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDIyLCAgIGJ3LT5pZnJlcSAgICAgICAgICAgICAgICAgJiAweGZmZmYpOworCisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgOTI4LCBidy0+c2FkX2NmZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpYjcwMDBtX3Jlc2V0X3BsbChzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlKQoreworCWNvbnN0IHN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgKmJ3ID0gc3RhdGUtPmNmZy5idzsKKwl1MTYgcmVnXzkwNyxyZWdfOTEwOworCisJLyogZGVmYXVsdCAqLworCXJlZ185MDcgPSAoYnctPnBsbF9ieXBhc3MgPDwgMTUpIHwgKGJ3LT5tb2R1bG8gPDwgNykgfAorCQkoYnctPkFEQ2xrU3JjIDw8IDYpIHwgKGJ3LT5JT19DTEtfZW5fY29yZSA8PCA1KSB8IChidy0+YnlwY2xrX2RpdiA8PCAyKSB8CisJCShidy0+ZW5hYmxlX3JlZmRpdiA8PCAxKSB8ICgwIDw8IDApOworCXJlZ185MTAgPSAoKChidy0+cGxsX3JhdGlvID4+IDYpICYgMHgzKSA8PCAzKSB8IChidy0+cGxsX3JhbmdlIDw8IDEpIHwgYnctPnBsbF9yZXNldDsKKworCS8vIGZvciB0aGlzIG9zY2lsbGF0b3IgZnJlcXVlbmN5IHNob3VsZCBiZSAzMCBNSHogZm9yIHRoZSBNYXN0ZXIgKGRlZmF1bHQgdmFsdWVzIGluIHRoZSBib2FyZF9wYXJhbWV0ZXJzIGdpdmUgdGhhdCB2YWx1ZSkKKwkvLyB0aGlzIGlzIG9ubHkgd29ya2luZyBvbmx5IGZvciAzMCBNSHogY3J5c3RhbHMKKwlpZiAoIXN0YXRlLT5jZmcucXVhcnR6X2RpcmVjdCkgeworCQlyZWdfOTEwIHw9ICgxIDw8IDUpOyAgLy8gZm9yY2luZyB0aGUgcHJlZGl2aWRlciB0byAxCisKKwkJLy8gaWYgdGhlIHByZXZpb3VzIGZyb250LWVuZCBpcyBiYXNlYmFuZCwgaXRzIG91dHB1dCBmcmVxdWVuY3kgaXMgMTUgTUh6IChwcmV2IGZyZXEgZGl2aWRlZCBieSAyKQorCQlpZihzdGF0ZS0+Y2ZnLmlucHV0X2Nsa19pc19kaXZfMikKKwkJCXJlZ185MDcgfD0gKDE2IDw8IDkpOworCQllbHNlIC8vIG90aGVyd2lzZSB0aGUgcHJldmlvdXMgZnJvbnQtZW5kIHB1dHMgb3V0IGl0cyBpbnB1dCAoZGVmYXVsdCAzME1IeikgLSBubyBleHRyYSBkaXZpc2lvbiBuZWNlc3NhcnkKKwkJCXJlZ185MDcgfD0gKDggPDwgOSk7CisJfSBlbHNlIHsKKwkJcmVnXzkwNyB8PSAoYnctPnBsbF9yYXRpbyAmIDB4M2YpIDw8IDk7CisJCXJlZ185MTAgfD0gKGJ3LT5wbGxfcHJlZGl2IDw8IDUpOworCX0KKworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkxMCwgcmVnXzkxMCk7IC8vIHBsbCBjZmcKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA5MDcsIHJlZ185MDcpOyAvLyBjbGsgY2ZnMAorCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkwOCwgMHgwMDA2KTsgIC8vIGNsa19jZmcxCisKKwlkaWI3MDAwbV9yZXNldF9wbGxfY29tbW9uKHN0YXRlLCBidyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpYjcwMDBtY19yZXNldF9wbGwoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSkKK3sKKwljb25zdCBzdHJ1Y3QgZGlieDAwMF9iYW5kd2lkdGhfY29uZmlnICpidyA9IHN0YXRlLT5jZmcuYnc7CisKKwkvLyBjbGtfY2ZnMAorCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkwNywgKGJ3LT5wbGxfcHJlZGl2IDw8IDgpIHwgKGJ3LT5wbGxfcmF0aW8gPDwgMCkpOworCisJLy8gY2xrX2NmZzEKKwkvL2RpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkwOCwgKDEgPDwgMTQpIHwgKDMgPDwgMTIpIHwoMCA8PCAxMSkgfAorCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkwOCwgKDAgPDwgMTQpIHwgKDMgPDwgMTIpIHwoMCA8PCAxMSkgfAorCQkJKGJ3LT5JT19DTEtfZW5fY29yZSA8PCAxMCkgfCAoYnctPmJ5cGNsa19kaXYgPDwgNSkgfCAoYnctPmVuYWJsZV9yZWZkaXYgPDwgNCkgfAorCQkJKGJ3LT5wbGxfYnlwYXNzIDw8IDMpIHwgKGJ3LT5wbGxfcmFuZ2UgPDwgMSkgfCAoYnctPnBsbF9yZXNldCA8PCAwKSk7CisKKwkvLyBzbXBsX2NmZworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkxMCwgKDEgPDwgMTIpIHwgKDIgPDwgMTApIHwgKGJ3LT5tb2R1bG8gPDwgOCkgfCAoYnctPkFEQ2xrU3JjIDw8IDcpKTsKKworCWRpYjcwMDBtX3Jlc2V0X3BsbF9jb21tb24oc3RhdGUsIGJ3KTsKK30KKworc3RhdGljIGludCBkaWI3MDAwbV9yZXNldF9ncGlvKHN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3QpCit7CisJLyogcmVzZXQgdGhlIEdQSU9zICovCisJZHByaW50aygiLUQtICBncGlvIGRpcjogJXg6IGdwaW8gdmFsOiAleCwgZ3BpbyBwd20gcG9zOiAleFxuIiwKKwkJc3QtPmNmZy5ncGlvX2Rpciwgc3QtPmNmZy5ncGlvX3ZhbCxzdC0+Y2ZnLmdwaW9fcHdtX3Bvcyk7CisKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0LCA3NzMsIHN0LT5jZmcuZ3Bpb19kaXIpOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3QsIDc3NCwgc3QtPmNmZy5ncGlvX3ZhbCk7CisKKwkvKiBUT0RPIDc4MiBpcyBQX2dwaW9fb2QgKi8KKworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3QsIDc3NSwgc3QtPmNmZy5ncGlvX3B3bV9wb3MpOworCisJZGliNzAwMG1fd3JpdGVfd29yZChzdCwgNzgwLCBzdC0+Y2ZnLnB3bV9mcmVxX2Rpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMG1fZGVtb2RfcmVzZXQoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSkKK3sKKwlkaWI3MDAwbV9zZXRfcG93ZXJfbW9kZShzdGF0ZSwgRElCNzAwME1fUE9XRVJfQUxMKTsKKworCS8qIGFsd2F5cyBsZWF2ZSB0aGUgVkJHIHZvbHRhZ2Ugb24gLSBpdCBjb25zdW1lcyBhbG1vc3Qgbm90aGluZyBidXQgdGFrZXMgYSBsb25nIHRpbWUgdG8gc3RhcnQgKi8KKwlkaWI3MDAwbV9zZXRfYWRjX3N0YXRlKHN0YXRlLCBESUJYMDAwX1ZCR19FTkFCTEUpOworCisJLyogcmVzdGFydCBhbGwgcGFydHMgKi8KKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAgODk4LCAweGZmZmYpOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsICA4OTksIDB4ZmZmZik7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgIDkwMCwgMHhmZjBmKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAgOTAxLCAweGZmZmMpOworCisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgIDg5OCwgMCk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgIDg5OSwgMCk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgIDkwMCwgMCk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgIDkwMSwgMCk7CisKKwlpZiAoc3RhdGUtPnJldmlzaW9uID09IDB4NDAwMCkKKwkJZGliNzAwMG1fcmVzZXRfcGxsKHN0YXRlKTsKKwllbHNlCisJCWRpYjcwMDBtY19yZXNldF9wbGwoc3RhdGUpOworCisJaWYgKGRpYjcwMDBtX3Jlc2V0X2dwaW8oc3RhdGUpICE9IDApCisJCWRwcmludGsoIi1FLSAgR1BJTyByZXNldCB3YXMgbm90IHN1Y2Nlc3NmdWwuXG4iKTsKKworCWlmIChkaWI3MDAwbV9zZXRfb3V0cHV0X21vZGUoc3RhdGUsIE9VVE1PREVfSElHSF9aKSAhPSAwKQorCQlkcHJpbnRrKCItRS0gIE9VVFBVVF9NT0RFIGNvdWxkIG5vdCBiZSByZXNldHRlZC5cbiIpOworCisJLyogdW5mb3JjZSBkaXZzdHIgcmVnYXJkbGVzcyB3aGV0aGVyIGkyYyBlbnVtZXJhdGlvbiB3YXMgZG9uZSBvciBub3QgKi8KKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxNzk0LCBkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDE3OTQpICYgfigxIDw8IDEpICk7CisKKwlkaWI3MDAwbV9zZXRfYmFuZHdpZHRoKCZzdGF0ZS0+ZGVtb2QsIEJBTkRXSURUSF84X01IWik7CisKKwlkaWI3MDAwbV9zZXRfYWRjX3N0YXRlKHN0YXRlLCBESUJYMDAwX1NMT1dfQURDX09OKTsKKwlkaWI3MDAwbV9zYWRfY2FsaWIoc3RhdGUpOworCWRpYjcwMDBtX3NldF9hZGNfc3RhdGUoc3RhdGUsIERJQlgwMDBfU0xPV19BRENfT0ZGKTsKKworCWRpYjcwMDBtX3NldF9wb3dlcl9tb2RlKHN0YXRlLCBESUI3MDAwTV9QT1dFUl9JTlRFUkZBQ0VfT05MWSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGliNzAwMG1fcmVzdGFydF9hZ2Moc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSkKK3sKKwkvLyBQX3Jlc3RhcnRfaXFjICYgUF9yZXN0YXJ0X2FnYworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDg5OCwgMHgwYzAwKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA4OTgsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMG1fYWdjX3NvZnRfc3BsaXQoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgYWdjLHNwbGl0X29mZnNldDsKKworCWlmKCFzdGF0ZS0+Y3VycmVudF9hZ2MgfHwgIXN0YXRlLT5jdXJyZW50X2FnYy0+cGVyZm9ybV9hZ2Nfc29mdHNwbGl0IHx8IHN0YXRlLT5jdXJyZW50X2FnYy0+c3BsaXQubWF4ID09IDApCisJCXJldHVybiAwOworCisJLy8gbl9hZ2NfZ2xvYmFsCisJYWdjID0gZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLCAzOTApOworCisJaWYgKGFnYyA+IHN0YXRlLT5jdXJyZW50X2FnYy0+c3BsaXQubWluX3RocmVzKQorCQlzcGxpdF9vZmZzZXQgPSBzdGF0ZS0+Y3VycmVudF9hZ2MtPnNwbGl0Lm1pbjsKKwllbHNlIGlmIChhZ2MgPCBzdGF0ZS0+Y3VycmVudF9hZ2MtPnNwbGl0Lm1heF90aHJlcykKKwkJc3BsaXRfb2Zmc2V0ID0gc3RhdGUtPmN1cnJlbnRfYWdjLT5zcGxpdC5tYXg7CisJZWxzZQorCQlzcGxpdF9vZmZzZXQgPSBzdGF0ZS0+Y3VycmVudF9hZ2MtPnNwbGl0Lm1heCAqCisJCQkoYWdjIC0gc3RhdGUtPmN1cnJlbnRfYWdjLT5zcGxpdC5taW5fdGhyZXMpIC8KKwkJCShzdGF0ZS0+Y3VycmVudF9hZ2MtPnNwbGl0Lm1heF90aHJlcyAtIHN0YXRlLT5jdXJyZW50X2FnYy0+c3BsaXQubWluX3RocmVzKTsKKworCWRwcmludGsoIkFHQyBzcGxpdF9vZmZzZXQ6ICVkXG4iLHNwbGl0X29mZnNldCk7CisKKwkvLyBQX2FnY19mb3JjZV9zcGxpdCBhbmQgUF9hZ2Nfc3BsaXRfb2Zmc2V0CisJcmV0dXJuIGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDEwMywgKGRpYjcwMDBtX3JlYWRfd29yZChzdGF0ZSwgMTAzKSAmIDB4ZmYwMCkgfCBzcGxpdF9vZmZzZXQpOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX3VwZGF0ZV9sbmEoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgaTsKKwl1MTYgZHluX2dhaW47CisKKwkvLyB3aGVuIHRoZXJlIGlzIG5vIExOQSB0byBwcm9ncmFtIHJldHVybiBpbW1lZGlhdGx5CisJaWYgKHN0YXRlLT5jZmcudXBkYXRlX2xuYSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCW1zbGVlcCg2MCk7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJLy8gcmVhZCBkeW5fZ2FpbiBoZXJlIChiZWNhdXNlIGl0IGlzIGRlbW9kLWRlcGVuZGVudCBhbmQgbm90IHR1bmVyKQorCQlkeW5fZ2FpbiA9IGRpYjcwMDBtX3JlYWRfd29yZChzdGF0ZSwgMzkwKTsKKworCQlkcHJpbnRrKCJhZ2MgZ2xvYmFsOiAlZFxuIiwgZHluX2dhaW4pOworCisJCWlmIChzdGF0ZS0+Y2ZnLnVwZGF0ZV9sbmEoJnN0YXRlLT5kZW1vZCxkeW5fZ2FpbikpIHsgLy8gTE5BIGhhcyBjaGFuZ2VkCisJCQlkaWI3MDAwbV9yZXN0YXJ0X2FnYyhzdGF0ZSk7CisJCQltc2xlZXAoNjApOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGliNzAwMG1fc2V0X2FnY19jb25maWcoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSwgdTggYmFuZCkKK3sKKwlzdHJ1Y3QgZGlieDAwMF9hZ2NfY29uZmlnICphZ2MgPSBOVUxMOworCWludCBpOworCWlmIChzdGF0ZS0+Y3VycmVudF9iYW5kID09IGJhbmQpCisJCXJldHVybjsKKwlzdGF0ZS0+Y3VycmVudF9iYW5kID0gYmFuZDsKKworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+Y2ZnLmFnY19jb25maWdfY291bnQ7IGkrKykKKwkJaWYgKHN0YXRlLT5jZmcuYWdjW2ldLmJhbmRfY2FwcyAmIGJhbmQpIHsKKwkJCWFnYyA9ICZzdGF0ZS0+Y2ZnLmFnY1tpXTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoYWdjID09IE5VTEwpIHsKKwkJZHByaW50aygiLUUtICBObyB2YWxpZCBBR0MgY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgYmFuZCAweCUwMnhcbiIsYmFuZCk7CisJCXJldHVybjsKKwl9CisKKwlzdGF0ZS0+Y3VycmVudF9hZ2MgPSBhZ2M7CisKKwkvKiBBR0MgKi8KKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA3MiAsICBhZ2MtPnNldHVwKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA3MyAsICBhZ2MtPmludl9nYWluKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA3NCAsICBhZ2MtPnRpbWVfc3RhYmlsaXopOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDk3ICwgKGFnYy0+YWxwaGFfbGV2ZWwgPDwgMTIpIHwgYWdjLT50aGxvY2spOworCisJLy8gRGVtb2QgQUdDIGxvb3AgY29uZmlndXJhdGlvbgorCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDk4LCAoYWdjLT5hbHBoYV9tYW50IDw8IDUpIHwgYWdjLT5hbHBoYV9leHApOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDk5LCAoYWdjLT5iZXRhX21hbnQgIDw8IDYpIHwgYWdjLT5iZXRhX2V4cCk7CisKKwlkcHJpbnRrKCItRC0gIFdCRDogcmVmOiAlZCwgc2VsOiAlZCwgYWN0aXZlOiAlZCwgYWxwaGE6ICVkXG4iLAorCQlzdGF0ZS0+d2JkX3JlZiAhPSAwID8gc3RhdGUtPndiZF9yZWYgOiBhZ2MtPndiZF9yZWYsIGFnYy0+d2JkX3NlbCwgIWFnYy0+cGVyZm9ybV9hZ2Nfc29mdHNwbGl0LCBhZ2MtPndiZF9zZWwpOworCisJLyogQUdDIGNvbnRpbnVlZCAqLworCWlmIChzdGF0ZS0+d2JkX3JlZiAhPSAwKQorCQlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxMDIsIHN0YXRlLT53YmRfcmVmKTsKKwllbHNlIC8vIHVzZSBkZWZhdWx0CisJCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDEwMiwgYWdjLT53YmRfcmVmKTsKKworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDEwMywgKGFnYy0+d2JkX2FscGhhIDw8IDkpIHwgKGFnYy0+cGVyZm9ybV9hZ2Nfc29mdHNwbGl0IDw8IDgpICk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTA0LCAgYWdjLT5hZ2MxX21heCk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTA1LCAgYWdjLT5hZ2MxX21pbik7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTA2LCAgYWdjLT5hZ2MyX21heCk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTA3LCAgYWdjLT5hZ2MyX21pbik7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTA4LCAoYWdjLT5hZ2MxX3B0MSA8PCA4KSB8IGFnYy0+YWdjMV9wdDIgKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxMDksIChhZ2MtPmFnYzFfc2xvcGUxIDw8IDgpIHwgYWdjLT5hZ2MxX3Nsb3BlMik7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTEwLCAoYWdjLT5hZ2MyX3B0MSA8PCA4KSB8IGFnYy0+YWdjMl9wdDIpOworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDExMSwgKGFnYy0+YWdjMl9zbG9wZTEgPDwgOCkgfCBhZ2MtPmFnYzJfc2xvcGUyKTsKKworCWlmIChzdGF0ZS0+cmV2aXNpb24gPiAweDQwMDApIHsgLy8gc2V0dGluZ3MgZm9yIHRoZSBNQworCQlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA3MSwgICBhZ2MtPmFnYzFfcHQzKTsKKy8vCQlkcHJpbnRrKCItRC0gIDkyOTogJXggJWQgJWRcbiIsCisvLwkJCShkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDkyOSkgJiAweGZmZTMpIHwgKGFnYy0+d2JkX2ludiA8PCA0KSB8IChhZ2MtPndiZF9zZWwgPDwgMiksIGFnYy0+d2JkX2ludiwgYWdjLT53YmRfc2VsKTsKKwkJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgOTI5LCAoZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLCA5MjkpICYgMHhmZmUzKSB8IChhZ2MtPndiZF9pbnYgPDwgNCkgfCAoYWdjLT53YmRfc2VsIDw8IDIpKTsKKwl9IGVsc2UgeworCQkvLyB3cm9uZyBkZWZhdWx0IHZhbHVlcworCQl1MTYgYls5XSA9IHsgNjc2LCA2OTYsIDcxNywgNzM3LCA3NTgsIDc3OCwgNzk5LCA4MTksIDg0MCB9OworCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQkJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgODggKyBpLCBiW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRpYjcwMDBtX3VwZGF0ZV90aW1mX2ZyZXEoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSkKK3sKKwl1MzIgdGltZiA9IChkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDQzNikgPDwgMTYpIHwgZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLCA0MzcpOworCXN0YXRlLT50aW1mID0gdGltZiAqIDgwIC8gKEJXX0lOREVYX1RPX0tIWihzdGF0ZS0+Y3VycmVudF9iYW5kd2lkdGgpIC8gMTAwKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAyMywgKHUxNikgKHRpbWYgPj4gMTYpKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAyNCwgKHUxNikgKHRpbWYgJiAweGZmZmYpKTsKKwlkcHJpbnRrKCItRC0gIFVwZGF0ZWQgdGltZl9mcmVxdWVuY3k6ICVkIChkZWZhdWx0OiAlZClcbiIsc3RhdGUtPnRpbWYsIHN0YXRlLT5jZmcuYnctPnRpbWYpOworfQorCitzdGF0aWMgdm9pZCBkaWI3MDAwbV9zZXRfY2hhbm5lbChzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgZGlieDAwMF9vZmRtX2NoYW5uZWwgKmNoLCB1OCBzZXEpCit7CisJdTE2IHZhbHVlLCBlc3RbNF07CisKKwlkaWI3MDAwbV9zZXRfYWdjX2NvbmZpZyhzdGF0ZSwgQkFORF9PRl9GUkVRVUVOQ1koY2gtPlJGX2tIeikpOworCisJLyogbmZmdCwgZ3VhcmQsIHFhbSwgYWxwaGEgKi8KKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAwLCAoY2gtPm5mZnQgPDwgNykgfCAoY2gtPmd1YXJkIDw8IDUpIHwgKGNoLT5ucWFtIDw8IDMpIHwgKGNoLT52aXRfYWxwaGEpKTsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA1LCAoc2VxIDw8IDQpKTsKKworCS8qIFBfZGludGxfbmF0aXZlLCBQX2RpbnRsdl9pbnYsIFBfdml0X2hyY2gsIFBfdml0X2NvZGVfcmF0ZSwgUF92aXRfc2VsZWN0X2hwICovCisJdmFsdWUgPSAoY2gtPmludGx2X25hdGl2ZSA8PCA2KSB8IChjaC0+dml0X2hyY2ggPDwgNCkgfCAoY2gtPnZpdF9zZWxlY3RfaHAgJiAweDEpOworCWlmIChjaC0+dml0X2hyY2ggPT0gMCB8fCBjaC0+dml0X3NlbGVjdF9ocCA9PSAxKQorCQl2YWx1ZSB8PSAoY2gtPnZpdF9jb2RlX3JhdGVfaHAgPDwgMSk7CisJZWxzZQorCQl2YWx1ZSB8PSAoY2gtPnZpdF9jb2RlX3JhdGVfbHAgPDwgMSk7CisJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMjY3ICsgc3RhdGUtPnJlZ19vZmZzLCB2YWx1ZSk7CisKKwkvKiBvZmZzZXQgbG9vcCBwYXJhbWV0ZXJzICovCisKKwkvKiBQX3RpbWZfYWxwaGEgPSA2LCBQX2Nvcm1fYWxwaGE9NiwgUF9jb3JtX3RocmVzPTB4ODAgKi8KKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAyNiwgKDYgPDwgMTIpIHwgKDYgPDwgOCkgfCAweDgwKTsKKworCS8qIFBfY3RybF9pbmhfY29yPTAsIFBfY3RybF9hbHBoYV9jb3I9NCwgUF9jdHJsX2luaF9pc2k9MSwgUF9jdHJsX2FscGhhX2lzaT0zLCBQX2N0cmxfaW5oX2NvcjQ9MSwgUF9jdHJsX2FscGhhX2NvcjQ9MyAqLworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDI5LCAoMCA8PCAxNCkgfCAoNCA8PCAxMCkgfCAoMSA8PCA5KSB8ICgzIDw8IDUpIHwgKDEgPDwgNCkgfCAoMHgzKSk7CisKKwkvKiBQX2N0cmxfZnJlZXplX3BoYV9zaGlmdD0wLCBQX2N0cmxfcGhhX29mZl9tYXg9MyAqLworCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDMyLCAoMCA8PCA0KSB8IDB4Myk7CisKKwkvKiBQX2N0cmxfc2ZyZXFfaW5oPTAsIFBfY3RybF9zZnJlcV9zdGVwPTUgKi8KKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAzMywgKDAgPDwgNCkgfCAweDUpOworCisJLyogUF9kdnN5X3N5bmNfd2FpdCAqLworCXN3aXRjaCAoY2gtPm5mZnQpIHsKKwkJY2FzZSAxOiB2YWx1ZSA9IDI1NjsgYnJlYWs7CisJCWNhc2UgMjogdmFsdWUgPSAxMjg7IGJyZWFrOworCQljYXNlIDA6CisJCWRlZmF1bHQ6IHZhbHVlID0gNjQ7IGJyZWFrOworCX0KKwl2YWx1ZSAqPSAoKDEgPDwgKGNoLT5ndWFyZCkpICogMyAvIDIpOyAvLyBhZGQgNTAlIFNGTiBtYXJnaW4KKwl2YWx1ZSA8PD0gNDsKKworCS8qIGRlYWN0aXZlIHRoZSBwb3NzaWJpbGl0eSBvZiBkaXZlcnNpdHkgcmVjZXB0aW9uIGlmIGV4dGVuZGVkIGludGVybGVhdmUgLSBub3QgZm9yIDcwMDBNQyAqLworCS8qIFBfZHZzeV9zeW5jX21vZGUgPSAwLCBQX2R2c3lfc3luY19lbmFibGU9MSwgUF9kdmNiX2NvbWJfbW9kZT0yICovCisJaWYgKGNoLT5pbnRsdl9uYXRpdmUgfHwgc3RhdGUtPnJldmlzaW9uID4gMHg0MDAwKQorCQl2YWx1ZSB8PSAoMSA8PCAyKSB8ICgyIDw8IDApOworCWVsc2UKKwkJdmFsdWUgfD0gMDsKKwlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAyNjYgKyBzdGF0ZS0+cmVnX29mZnMsIHZhbHVlKTsKKworCS8qIGNoYW5uZWwgZXN0aW1hdGlvbiBmaW5lIGNvbmZpZ3VyYXRpb24gKi8KKwlzd2l0Y2ggKGNoLT5ucWFtKSB7CisJCWNhc2UgMjoKKwkJCWVzdFswXSA9IDB4MDE0ODsgICAgICAgLyogUF9hZHBfcmVndWxfY250IDAuMDQgKi8KKwkJCWVzdFsxXSA9IDB4ZmZmMDsgICAgICAgLyogUF9hZHBfbm9pc2VfY250IC0wLjAwMiAqLworCQkJZXN0WzJdID0gMHgwMGE0OyAgICAgICAvKiBQX2FkcF9yZWd1bF9leHQgMC4wMiAqLworCQkJZXN0WzNdID0gMHhmZmY4OyAgICAgICAvKiBQX2FkcF9ub2lzZV9leHQgLTAuMDAxICovCisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZXN0WzBdID0gMHgwMjNkOyAgICAgICAvKiBQX2FkcF9yZWd1bF9jbnQgMC4wNyAqLworCQkJZXN0WzFdID0gMHhmZmRmOyAgICAgICAvKiBQX2FkcF9ub2lzZV9jbnQgLTAuMDA0ICovCisJCQllc3RbMl0gPSAweDAwYTQ7ICAgICAgIC8qIFBfYWRwX3JlZ3VsX2V4dCAwLjAyICovCisJCQllc3RbM10gPSAweGZmZjA7ICAgICAgIC8qIFBfYWRwX25vaXNlX2V4dCAtMC4wMDIgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXN0WzBdID0gMHgwOTlhOyAgICAgICAvKiBQX2FkcF9yZWd1bF9jbnQgMC4zICovCisJCQllc3RbMV0gPSAweGZmYWU7ICAgICAgIC8qIFBfYWRwX25vaXNlX2NudCAtMC4wMSAqLworCQkJZXN0WzJdID0gMHgwMzMzOyAgICAgICAvKiBQX2FkcF9yZWd1bF9leHQgMC4xICovCisJCQllc3RbM10gPSAweGZmZjg7ICAgICAgIC8qIFBfYWRwX25vaXNlX2V4dCAtMC4wMDIgKi8KKwkJCWJyZWFrOworCX0KKwlmb3IgKHZhbHVlID0gMDsgdmFsdWUgPCA0OyB2YWx1ZSsrKQorCQlkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAyMTQgKyB2YWx1ZSArIHN0YXRlLT5yZWdfb2ZmcywgZXN0W3ZhbHVlXSk7CisKKwkvLyBzZXQgcG93ZXItdXAgbGV2ZWw6IGludGVyZithbmFsb2crQUdDCisJZGliNzAwMG1fc2V0X3Bvd2VyX21vZGUoc3RhdGUsIERJQjcwMDBNX1BPV0VSX0lOVEVSRl9BTkFMT0dfQUdDKTsKKwlkaWI3MDAwbV9zZXRfYWRjX3N0YXRlKHN0YXRlLCBESUJYMDAwX0FEQ19PTik7CisKKwltc2xlZXAoNyk7CisKKwkvL0FHQyBpbml0aWFsaXphdGlvbgorCWlmIChzdGF0ZS0+Y2ZnLmFnY19jb250cm9sKQorCQlzdGF0ZS0+Y2ZnLmFnY19jb250cm9sKCZzdGF0ZS0+ZGVtb2QsIDEpOworCisJZGliNzAwMG1fcmVzdGFydF9hZ2Moc3RhdGUpOworCisJLy8gd2FpdCBBR0Mgcm91Z2ggbG9jayB0aW1lCisJbXNsZWVwKDUpOworCisJZGliNzAwMG1fdXBkYXRlX2xuYShzdGF0ZSk7CisJZGliNzAwMG1fYWdjX3NvZnRfc3BsaXQoc3RhdGUpOworCisJLy8gd2FpdCBBR0MgYWNjdXJhdGUgbG9jayB0aW1lCisJbXNsZWVwKDcpOworCisJaWYgKHN0YXRlLT5jZmcuYWdjX2NvbnRyb2wpCisJCXN0YXRlLT5jZmcuYWdjX2NvbnRyb2woJnN0YXRlLT5kZW1vZCwgMCk7CisKKwkvLyBzZXQgcG93ZXItdXAgbGV2ZWw6IGF1dG9zZWFyY2gKKwlkaWI3MDAwbV9zZXRfcG93ZXJfbW9kZShzdGF0ZSwgRElCNzAwME1fUE9XRVJfQ09SNF9ESU5UTFZfSUNJUk1fRVFVQUxfQ0ZST0QpOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX2F1dG9zZWFyY2hfc3RhcnQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZGVtb2QsIHN0cnVjdCBkaWJ4MDAwX29mZG1fY2hhbm5lbCAqY2gpCit7CisJc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSA9IGRlbW9kLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkaWJ4MDAwX29mZG1fY2hhbm5lbCBhdXRvX2NoOworCWludCByZXQgPSAwOworCXUzMiB2YWx1ZTsKKworCUlOSVRfT0ZETV9DSEFOTkVMKCZhdXRvX2NoKTsKKwlhdXRvX2NoLlJGX2tIeiAgICAgICAgICAgPSBjaC0+UkZfa0h6OworCWF1dG9fY2guQncgICAgICAgICAgICAgICA9IGNoLT5CdzsKKwlhdXRvX2NoLm5xYW0gICAgICAgICAgICAgPSAyOworCWF1dG9fY2guZ3VhcmQgICAgICAgICAgICA9IDA7CisJYXV0b19jaC5uZmZ0ICAgICAgICAgICAgID0gMTsKKwlhdXRvX2NoLnZpdF9hbHBoYSAgICAgICAgPSAxOworCWF1dG9fY2gudml0X3NlbGVjdF9ocCAgICA9IDE7CisJYXV0b19jaC52aXRfY29kZV9yYXRlX2hwID0gMjsKKwlhdXRvX2NoLnZpdF9jb2RlX3JhdGVfbHAgPSAzOworCWF1dG9fY2gudml0X2hyY2ggICAgICAgICA9IDA7CisJYXV0b19jaC5pbnRsdl9uYXRpdmUgICAgID0gMTsKKworCWRpYjcwMDBtX3NldF9jaGFubmVsKHN0YXRlLCAmYXV0b19jaCwgNyk7CisKKwkvLyBhbHdheXMgdXNlIHRoZSBzZXR0aW5nIGZvciA4TUh6IGhlcmUgbG9ja190aW1lIGZvciA3LDYgTUh6IGFyZSBsb25nZXIKKwl2YWx1ZSA9IDMwICogc3RhdGUtPmNmZy5idy0+aW50ZXJuYWw7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDYsICAodTE2KSAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZikpOyAvLyBsb2NrMCB3YWl0IHRpbWUKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgNywgICh1MTYpICAodmFsdWUgICAgICAgICYgMHhmZmZmKSk7IC8vIGxvY2swIHdhaXQgdGltZQorCXZhbHVlID0gMTAwICogc3RhdGUtPmNmZy5idy0+aW50ZXJuYWw7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDgsICAodTE2KSAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZikpOyAvLyBsb2NrMSB3YWl0IHRpbWUKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgOSwgICh1MTYpICAodmFsdWUgICAgICAgICYgMHhmZmZmKSk7IC8vIGxvY2sxIHdhaXQgdGltZQorCXZhbHVlID0gNTAwICogc3RhdGUtPmNmZy5idy0+aW50ZXJuYWw7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDEwLCAodTE2KSAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZikpOyAvLyBsb2NrMiB3YWl0IHRpbWUKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTEsICh1MTYpICAodmFsdWUgICAgICAgICYgMHhmZmZmKSk7IC8vIGxvY2syIHdhaXQgdGltZQorCisJLy8gc3RhcnQgc2VhcmNoCisJdmFsdWUgPSBkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDApOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAwLCB2YWx1ZSB8ICgxIDw8IDkpKTsKKworCS8qIGNsZWFyIG5faXJxX3BlbmRpbmcgKi8KKwlpZiAoc3RhdGUtPnJldmlzaW9uID09IDB4NDAwMCkKKwkJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTc5MywgMCk7CisJZWxzZQorCQlkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDUzNyk7CisKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMCwgKHUxNikgdmFsdWUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkaWI3MDAwbV9hdXRvc2VhcmNoX2lycShzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlLCB1MTYgcmVnKQoreworCXUxNiBpcnFfcGVuZGluZyA9IGRpYjcwMDBtX3JlYWRfd29yZChzdGF0ZSwgcmVnKTsKKworCWlmIChpcnFfcGVuZGluZyAmIDB4MSkgeyAvLyBmYWlsZWQKKwkJZHByaW50aygiI1xuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChpcnFfcGVuZGluZyAmIDB4MikgeyAvLyBzdWNjZWVkZWQKKwkJZHByaW50aygiIVxuIik7CisJCXJldHVybiAyOworCX0KKwlyZXR1cm4gMDsgLy8gc3RpbGwgcGVuZGluZworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX2F1dG9zZWFyY2hfaXNfaXJxKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kKQoreworCXN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUgPSBkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpZiAoc3RhdGUtPnJldmlzaW9uID09IDB4NDAwMCkKKwkJcmV0dXJuIGRpYjcwMDBtX2F1dG9zZWFyY2hfaXJxKHN0YXRlLCAxNzkzKTsKKwllbHNlCisJCXJldHVybiBkaWI3MDAwbV9hdXRvc2VhcmNoX2lycShzdGF0ZSwgNTM3KTsKK30KKworc3RhdGljIGludCBkaWI3MDAwbV90dW5lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kLCBzdHJ1Y3QgZGlieDAwMF9vZmRtX2NoYW5uZWwgKmNoKQoreworCXN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUgPSBkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgdmFsdWU7CisKKwkvLyB3ZSBhcmUgYWxyZWFkeSB0dW5lZCAtIGp1c3QgcmVzdW1pbmcgZnJvbSBzdXNwZW5kCisJaWYgKGNoICE9IE5VTEwpCisJCWRpYjcwMDBtX3NldF9jaGFubmVsKHN0YXRlLCBjaCwgMCk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8vIHJlc3RhcnQgZGVtb2QKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgODk4LCAweDQwMDApOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA4OTgsIDB4MDAwMCk7CisJbXNsZWVwKDQ1KTsKKworCXJldCB8PSBkaWI3MDAwbV9zZXRfcG93ZXJfbW9kZShzdGF0ZSwgRElCNzAwME1fUE9XRVJfQ09SNF9DUllfRVNSQU1fTU9VVF9OVUQpOworCS8qIFBfY3RybF9pbmhfY29yPTAsIFBfY3RybF9hbHBoYV9jb3I9NCwgUF9jdHJsX2luaF9pc2k9MCwgUF9jdHJsX2FscGhhX2lzaT0zLCBQX2N0cmxfaW5oX2NvcjQ9MSwgUF9jdHJsX2FscGhhX2NvcjQ9MyAqLworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAyOSwgKDAgPDwgMTQpIHwgKDQgPDwgMTApIHwgKDAgPDwgOSkgfCAoMyA8PCA1KSB8ICgxIDw8IDQpIHwgKDB4MykpOworCisJLy8gbmV2ZXIgYWNoaWV2ZWQgYSBsb2NrIHdpdGggdGhhdCBiYW5kd2lkdGggc28gZmFyIC0gd2FpdCBmb3IgdGltZnJlcSB0byB1cGRhdGUKKwlpZiAoc3RhdGUtPnRpbWYgPT0gMCkKKwkJbXNsZWVwKDIwMCk7CisKKwkvL2R1bXBfcmVnKHN0YXRlKTsKKwkvKiBQX3RpbWZfYWxwaGEsIFBfY29ybV9hbHBoYT02LCBQX2Nvcm1fdGhyZXM9MHg4MCAqLworCXZhbHVlID0gKDYgPDwgOCkgfCAweDgwOworCXN3aXRjaCAoY2gtPm5mZnQpIHsKKwkJY2FzZSAwOiB2YWx1ZSB8PSAoNyA8PCAxMik7IGJyZWFrOworCQljYXNlIDE6IHZhbHVlIHw9ICg5IDw8IDEyKTsgYnJlYWs7CisJCWNhc2UgMjogdmFsdWUgfD0gKDggPDwgMTIpOyBicmVhazsKKwl9CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDI2LCB2YWx1ZSk7CisKKwkvKiBQX2N0cmxfZnJlZXplX3BoYV9zaGlmdD0wLCBQX2N0cmxfcGhhX29mZl9tYXggKi8KKwl2YWx1ZSA9ICgwIDw8IDQpOworCXN3aXRjaCAoY2gtPm5mZnQpIHsKKwkJY2FzZSAwOiB2YWx1ZSB8PSAweDY7IGJyZWFrOworCQljYXNlIDE6IHZhbHVlIHw9IDB4ODsgYnJlYWs7CisJCWNhc2UgMjogdmFsdWUgfD0gMHg3OyBicmVhazsKKwl9CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDMyLCB2YWx1ZSk7CisKKwkvKiBQX2N0cmxfc2ZyZXFfaW5oPTAsIFBfY3RybF9zZnJlcV9zdGVwICovCisJdmFsdWUgPSAoMCA8PCA0KTsKKwlzd2l0Y2ggKGNoLT5uZmZ0KSB7CisJCWNhc2UgMDogdmFsdWUgfD0gMHg2OyBicmVhazsKKwkJY2FzZSAxOiB2YWx1ZSB8PSAweDg7IGJyZWFrOworCQljYXNlIDI6IHZhbHVlIHw9IDB4NzsgYnJlYWs7CisJfQorCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAzMywgIHZhbHVlKTsKKworCS8vIHdlIGFjaGlldmVkIGEgbG9jayAtIGl0J3MgdGltZSB0byB1cGRhdGUgdGhlIG9zYyBmcmVxCisJaWYgKChkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDUzNSkgPj4gNikgICYgMHgxKQorCQlkaWI3MDAwbV91cGRhdGVfdGltZl9mcmVxKHN0YXRlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMG1faW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkZW1vZCkKK3sKKwlzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlID0gZGVtb2QtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCA9IDA7CisJdTggbyA9IHN0YXRlLT5yZWdfb2ZmczsKKworCWRpYjcwMDBtX3NldF9wb3dlcl9tb2RlKHN0YXRlLCBESUI3MDAwTV9QT1dFUl9BTEwpOworCisJaWYgKGRpYjcwMDBtX3NldF9hZGNfc3RhdGUoc3RhdGUsIERJQlgwMDBfU0xPV19BRENfT04pICE9IDApCisJCWRwcmludGsoIi1FLSAgY291bGQgbm90IHN0YXJ0IFNsb3cgQURDXG4iKTsKKworCWlmIChzdGF0ZS0+Y2ZnLmR2YnRfbW9kZSkKKwkJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTc5NiwgMHgwKTsgLy8gc2VsZWN0IERWQi1UIG91dHB1dAorCisJaWYgKHN0YXRlLT5jZmcubW9iaWxlX21vZGUpCisJCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAyNjEgKyBvLCAyKTsKKwllbHNlCisJCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAyMjQgKyBvLCAxKTsKKworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxNzMgKyBvLCAwKTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTc0ICsgbywgMCk7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDE3NSArIG8sIDApOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxNzYgKyBvLCAwKTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTc3ICsgbywgMCk7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDE3OCArIG8sIDApOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxNzkgKyBvLCAwKTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTgwICsgbywgMCk7CisKKwkvLyBQX2Nvcm1fdGhyZXMgTG9jayBhbGdvcml0aG1zIGNvbmZpZ3VyYXRpb24KKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMjYsIDB4NjY4MCk7CisKKwkvLyBQX3BhbGZfYWxwaGFfcmVndWwsIFBfcGFsZl9maWx0ZXJfZnJlZXplLCBQX3BhbGZfZmlsdGVyX29uCisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDE3MCArIG8sIDB4MDQxMCk7CisJLy8gUF9mZnRfbmJfdG9fY3V0CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDE4MiArIG8sIDgxOTIpOworCS8vIFBfcGhhM190aHJlcworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxOTUgKyBvLCAweDBjY2QpOworCS8vIFBfY3RpX3VzZV9jcGUsIFBfY3RpX3VzZV9wcm9nCisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDE5NiArIG8sICAgICAwKTsKKwkvLyBQX2NzcHVfcmVndWwsIFBfY3NwdV93aW5fY3V0CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDIwNSArIG8sIDB4MjAwZik7CisJLy8gUF9hZHBfcmVndWxfY250CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDIxNCArIG8sIDB4MDIzZCk7CisJLy8gUF9hZHBfbm9pc2VfY250CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDIxNSArIG8sIDB4MDBhNCk7CisJLy8gUF9hZHBfcmVndWxfZXh0CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDIxNiArIG8sIDB4MDBhNCk7CisJLy8gUF9hZHBfbm9pc2VfZXh0CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDIxNyArIG8sIDB4N2ZmMCk7CisJLy8gUF9hZHBfZmlsCisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDIxOCArIG8sIDB4M2NjYyk7CisKKwkvLyBQXzJkX2J5cF90aV9udW0KKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMjI2ICsgbywgMCk7CisKKwkvLyBQX2ZlY18qCisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDI4MSArIG8sIDB4MDAxMCk7CisJLy8gUF9zbW9fbW9kZSwgUF9zbW9fcnNfZGlzY2FyZCwgUF9zbW9fZmlmb19mbHVzaCwgUF9zbW9fcGlkX3BhcnNlLCBQX3Ntb19lcnJvcl9kaXNjYXJkCisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDI5NCArIG8sMHgwMDYyKTsKKworCS8vIFBfaXFjX2FscGhhX3BoYSwgUF9pcWNfYWxwaGFfYW1wLCBQX2lxY19kY2NfYWxwaGEsIC4uLgorCWlmKHN0YXRlLT5jZmcudHVuZXJfaXNfYmFzZWJhbmQpCisJCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAzNiwgMHgwNzU1KTsKKwllbHNlCisJCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAzNiwgMHgxZjU1KTsKKworCS8vIGF1dG8gc2VhcmNoIGNvbmZpZ3VyYXRpb24KKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMiwgIDB4MDAwNCk7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDMsICAweDEwMDApOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA0LCAgMHgwODE0KTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgNiwgIDB4MDAxYik7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDcsICAweDc3NDApOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA4LCAgMHgwMDViKTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgOSwgIDB4OGQ4MCk7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDEwLCAweDAxYzkpOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxMSwgMHhjMzgwKTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTIsIDB4MDAwMCk7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDEzLCAweDAwODApOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxNCwgMHgwMDAwKTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTUsIDB4MDA5MCk7CisJcmV0IHw9IGRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDE2LCAweDAwMDEpOworCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCAxNywgMHhkNGMwKTsKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMjYzICsgbywweDAwMDEpOworCisJLy8gUF9kaXZjbGtzZWw9MyBQX2RpdmJpdHNlbD0xCisJaWYgKHN0YXRlLT5yZXZpc2lvbiA9PSAweDQwMDApCisJCWRpYjcwMDBtX3dyaXRlX3dvcmQoc3RhdGUsIDkwOSwgKDMgPDwgMTApIHwgKDEgPDwgNikpOworCWVsc2UKKwkJZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgOTA5LCAoMyA8PCA0KSB8IDEpOworCisJLy8gVHVuZXIgSU8gYmFuazogbWF4IGRyaXZlICgxNG1BKQorCXJldCB8PSBkaWI3MDAwbV93cml0ZV93b3JkKHN0YXRlLCA5MTIgLDB4MmM4YSk7CisKKwlyZXQgfD0gZGliNzAwMG1fd3JpdGVfd29yZChzdGF0ZSwgMTgxNywgMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kKQoreworCXN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3QgPSBkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlkaWI3MDAwbV9zZXRfb3V0cHV0X21vZGUoc3QsIE9VVE1PREVfSElHSF9aKTsKKwlyZXR1cm4gZGliNzAwMG1fc2V0X3Bvd2VyX21vZGUoc3QsIERJQjcwMDBNX1BPV0VSX0lOVEVSRkFDRV9PTkxZKSB8CisJCWRpYjcwMDBtX3NldF9hZGNfc3RhdGUoc3QsIERJQlgwMDBfU0xPV19BRENfT0ZGKSB8CisJCWRpYjcwMDBtX3NldF9hZGNfc3RhdGUoc3QsIERJQlgwMDBfQURDX09GRik7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMG1faWRlbnRpZnkoc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgdmFsdWU7CisJaWYgKCh2YWx1ZSA9IGRpYjcwMDBtX3JlYWRfd29yZChzdGF0ZSwgODk2KSkgIT0gMHgwMWIzKSB7CisJCWRwcmludGsoIi1FLSAgRGlCNzAwME06IHdyb25nIFZlbmRvciBJRCAocmVhZD0weCV4KVxuIix2YWx1ZSk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXN0YXRlLT5yZXZpc2lvbiA9IGRpYjcwMDBtX3JlYWRfd29yZChzdGF0ZSwgODk3KTsKKwlpZiAoc3RhdGUtPnJldmlzaW9uICE9IDB4NDAwMCAmJgorCQlzdGF0ZS0+cmV2aXNpb24gIT0gMHg0MDAxICYmCisJCXN0YXRlLT5yZXZpc2lvbiAhPSAweDQwMDIpIHsKKwkJZHByaW50aygiLUUtICBEaUI3MDAwTTogd3JvbmcgRGV2aWNlIElEICgleClcbiIsdmFsdWUpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwkvKiBwcm90ZWN0IHRoaXMgZHJpdmVyIHRvIGJlIHVzZWQgd2l0aCA3MDAwUEMgKi8KKwlpZiAoc3RhdGUtPnJldmlzaW9uID09IDB4NDAwMCAmJiBkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDc2OSkgPT0gMHg0MDAwKSB7CisJCWRwcmludGsoIi1FLSAgRGlCNzAwME06IHRoaXMgZHJpdmVyIGRvZXMgbm90IHdvcmsgd2l0aCBEaUI3MDAwUENcbiIpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlLT5yZXZpc2lvbikgeworCQljYXNlIDB4NDAwMDogZHByaW50aygiLUktICBmb3VuZCBEaUI3MDAwTUEvUEEvTUIvUEJcbiIpOyBicmVhazsKKwkJY2FzZSAweDQwMDE6IHN0YXRlLT5yZWdfb2ZmcyA9IDE7IGRwcmludGsoIi1JLSAgZm91bmQgRGlCNzAwMEhDXG4iKTsgYnJlYWs7CisJCWNhc2UgMHg0MDAyOiBzdGF0ZS0+cmVnX29mZnMgPSAxOyBkcHJpbnRrKCItSS0gIGZvdW5kIERpQjcwMDBNQ1xuIik7IGJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZGliNzAwMG1fZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoreworCXN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MTYgdHBzID0gZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLDQ4MCk7CisKKwlmZXAtPmludmVyc2lvbiA9IElOVkVSU0lPTl9BVVRPOworCisJZmVwLT51Lm9mZG0uYmFuZHdpZHRoID0gc3RhdGUtPmN1cnJlbnRfYmFuZHdpZHRoOworCisJc3dpdGNoICgodHBzID4+IDgpICYgMHgzKSB7CisJCWNhc2UgMDogZmVwLT51Lm9mZG0udHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV8ySzsgYnJlYWs7CisJCWNhc2UgMTogZmVwLT51Lm9mZG0udHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV84SzsgYnJlYWs7CisJCS8qIGNhc2UgMjogZmVwLT51Lm9mZG0udHJhbnNtaXNzaW9uX21vZGUgPSBUUkFOU01JU1NJT05fTU9ERV80SzsgYnJlYWs7ICovCisJfQorCisJc3dpdGNoICh0cHMgJiAweDMpIHsKKwkJY2FzZSAwOiBmZXAtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVEVSVkFMXzFfMzI7IGJyZWFrOworCQljYXNlIDE6IGZlcC0+dS5vZmRtLmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV8xNjsgYnJlYWs7CisJCWNhc2UgMjogZmVwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF8xXzg7IGJyZWFrOworCQljYXNlIDM6IGZlcC0+dS5vZmRtLmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV80OyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKCh0cHMgPj4gMTQpICYgMHgzKSB7CisJCWNhc2UgMDogZmVwLT51Lm9mZG0uY29uc3RlbGxhdGlvbiA9IFFQU0s7IGJyZWFrOworCQljYXNlIDE6IGZlcC0+dS5vZmRtLmNvbnN0ZWxsYXRpb24gPSBRQU1fMTY7IGJyZWFrOworCQljYXNlIDI6CisJCWRlZmF1bHQ6IGZlcC0+dS5vZmRtLmNvbnN0ZWxsYXRpb24gPSBRQU1fNjQ7IGJyZWFrOworCX0KKworCS8qIGFzIGxvbmcgYXMgdGhlIGZyb250ZW5kX3BhcmFtIHN0cnVjdHVyZSBpcyBmaXhlZCBmb3IgaGllcmFyY2hpY2FsIHRyYW5zbWlzc2lvbiBJIHJlZnVzZSB0byB1c2UgaXQgKi8KKwkvKiAodHBzID4+IDEzKSAmIDB4MSA9PSBocmNoIGlzIHVzZWQsICh0cHMgPj4gMTApICYgMHg3ID09IGFscGhhICovCisKKwlmZXAtPnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24gPSBISUVSQVJDSFlfTk9ORTsKKwlzd2l0Y2ggKCh0cHMgPj4gNSkgJiAweDcpIHsKKwkJY2FzZSAxOiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfSFAgPSBGRUNfMV8yOyBicmVhazsKKwkJY2FzZSAyOiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfSFAgPSBGRUNfMl8zOyBicmVhazsKKwkJY2FzZSAzOiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfSFAgPSBGRUNfM180OyBicmVhazsKKwkJY2FzZSA1OiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfSFAgPSBGRUNfNV82OyBicmVhazsKKwkJY2FzZSA3OgorCQlkZWZhdWx0OiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfSFAgPSBGRUNfN184OyBicmVhazsKKworCX0KKworCXN3aXRjaCAoKHRwcyA+PiAyKSAmIDB4NykgeworCQljYXNlIDE6IGZlcC0+dS5vZmRtLmNvZGVfcmF0ZV9MUCA9IEZFQ18xXzI7IGJyZWFrOworCQljYXNlIDI6IGZlcC0+dS5vZmRtLmNvZGVfcmF0ZV9MUCA9IEZFQ18yXzM7IGJyZWFrOworCQljYXNlIDM6IGZlcC0+dS5vZmRtLmNvZGVfcmF0ZV9MUCA9IEZFQ18zXzQ7IGJyZWFrOworCQljYXNlIDU6IGZlcC0+dS5vZmRtLmNvZGVfcmF0ZV9MUCA9IEZFQ181XzY7IGJyZWFrOworCQljYXNlIDc6CisJCWRlZmF1bHQ6IGZlcC0+dS5vZmRtLmNvZGVfcmF0ZV9MUCA9IEZFQ183Xzg7IGJyZWFrOworCX0KKworCS8qIG5hdGl2ZSBpbnRlcmxlYXZlcjogKGRpYjcwMDBtX3JlYWRfd29yZChzdGF0ZSwgNDgxKSA+PiAgNSkgJiAweDEgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJc3RydWN0IGRpYngwMDBfb2ZkbV9jaGFubmVsIGNoOworCisJSU5JVF9PRkRNX0NIQU5ORUwoJmNoKTsKKwlGRVAyRElCKGZlcCwmY2gpOworCisJc3RhdGUtPmN1cnJlbnRfYmFuZHdpZHRoID0gZmVwLT51Lm9mZG0uYmFuZHdpZHRoOworCWRpYjcwMDBtX3NldF9iYW5kd2lkdGgoZmUsIGZlcC0+dS5vZmRtLmJhbmR3aWR0aCk7CisKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgZmVwKTsKKworCWlmIChmZXAtPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSA9PSBUUkFOU01JU1NJT05fTU9ERV9BVVRPIHx8CisJCWZlcC0+dS5vZmRtLmd1YXJkX2ludGVydmFsICAgID09IEdVQVJEX0lOVEVSVkFMX0FVVE8gfHwKKwkJZmVwLT51Lm9mZG0uY29uc3RlbGxhdGlvbiAgICAgPT0gUUFNX0FVVE8gfHwKKwkJZmVwLT51Lm9mZG0uY29kZV9yYXRlX0hQICAgICAgPT0gRkVDX0FVVE8pIHsKKwkJaW50IGkgPSA4MDAsIGZvdW5kOworCisJCWRpYjcwMDBtX2F1dG9zZWFyY2hfc3RhcnQoZmUsICZjaCk7CisJCWRvIHsKKwkJCW1zbGVlcCgxKTsKKwkJCWZvdW5kID0gZGliNzAwMG1fYXV0b3NlYXJjaF9pc19pcnEoZmUpOworCQl9IHdoaWxlIChmb3VuZCA9PSAwICYmIGktLSk7CisKKwkJZHByaW50aygiYXV0b3NlYXJjaCByZXR1cm5zOiAlZFxuIixmb3VuZCk7CisJCWlmIChmb3VuZCA9PSAwIHx8IGZvdW5kID09IDEpCisJCQlyZXR1cm4gMDsgLy8gbm8gY2hhbm5lbCBmb3VuZAorCisJCWRpYjcwMDBtX2dldF9mcm9udGVuZChmZSwgZmVwKTsKKwkJRkVQMkRJQihmZXAsICZjaCk7CisJfQorCisJLyogbWFrZSB0aGlzIGEgY29uZmlnIHBhcmFtZXRlciAqLworCWRpYjcwMDBtX3NldF9vdXRwdXRfbW9kZShzdGF0ZSwgT1VUTU9ERV9NUEVHMl9GSUZPKTsKKworCXJldHVybiBkaWI3MDAwbV90dW5lKGZlLCAmY2gpOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zdGF0dXNfdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTE2IGxvY2sgPSBkaWI3MDAwbV9yZWFkX3dvcmQoc3RhdGUsIDUzNSk7CisKKwkqc3RhdCA9IDA7CisKKwlpZiAobG9jayAmIDB4ODAwMCkKKwkJKnN0YXQgfD0gRkVfSEFTX1NJR05BTDsKKwlpZiAobG9jayAmIDB4MzAwMCkKKwkJKnN0YXQgfD0gRkVfSEFTX0NBUlJJRVI7CisJaWYgKGxvY2sgJiAweDAxMDApCisJCSpzdGF0IHw9IEZFX0hBU19WSVRFUkJJOworCWlmIChsb2NrICYgMHgwMDEwKQorCQkqc3RhdCB8PSBGRV9IQVNfU1lOQzsKKwlpZiAobG9jayAmIDB4MDAwOCkKKwkJKnN0YXQgfD0gRkVfSEFTX0xPQ0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwbV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpiZXIpCit7CisJc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCSpiZXIgPSAoZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLCA1MjYpIDw8IDE2KSB8IGRpYjcwMDBtX3JlYWRfd29yZChzdGF0ZSwgNTI3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwbV9yZWFkX3VuY19ibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqdW5jKQoreworCXN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwkqdW5jID0gZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLCA1MzQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnN0cmVuZ3RoKQoreworCXN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MTYgdmFsID0gZGliNzAwMG1fcmVhZF93b3JkKHN0YXRlLCAzOTApOworCSpzdHJlbmd0aCA9IDY1NTM1IC0gdmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYgKnNucikKK3sKKwkqc25yID0gMHgwMDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBtX2ZlX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCit7CisJdHVuZS0+bWluX2RlbGF5X21zID0gMTAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGliNzAwMG1fcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkZW1vZCkKK3sKKwlzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgKnN0ID0gZGVtb2QtPmRlbW9kdWxhdG9yX3ByaXY7CisJZGlieDAwMF9leGl0X2kyY19tYXN0ZXIoJnN0LT5pMmNfbWFzdGVyKTsKKwlrZnJlZShzdCk7Cit9CisKK3N0cnVjdCBpMmNfYWRhcHRlciAqIGRpYjcwMDBtX2dldF9pMmNfbWFzdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kLCBlbnVtIGRpYngwMDBfaTJjX2ludGVyZmFjZSBpbnRmLCBpbnQgZ2F0aW5nKQoreworCXN0cnVjdCBkaWI3MDAwbV9zdGF0ZSAqc3QgPSBkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlyZXR1cm4gZGlieDAwMF9nZXRfaTJjX2FkYXB0ZXIoJnN0LT5pMmNfbWFzdGVyLCBpbnRmLCBnYXRpbmcpOworfQorRVhQT1JUX1NZTUJPTChkaWI3MDAwbV9nZXRfaTJjX21hc3Rlcik7CisKK2ludCBkaWI3MDAwbV9pMmNfZW51bWVyYXRpb24oc3RydWN0IGkyY19hZGFwdGVyICppMmMsIGludCBub19vZl9kZW1vZHMsIHU4IGRlZmF1bHRfYWRkciwgc3RydWN0IGRpYjcwMDBtX2NvbmZpZyBjZmdbXSkKK3sKKwlzdHJ1Y3QgZGliNzAwMG1fc3RhdGUgc3QgPSB7IC5pMmNfYWRhcCA9IGkyYyB9OworCWludCBrID0gMDsKKwl1OCBuZXdfYWRkciA9IDA7CisKKwlmb3IgKGsgPSBub19vZl9kZW1vZHMtMTsgayA+PSAwOyBrLS0pIHsKKwkJc3QuY2ZnID0gY2ZnW2tdOworCisJCS8qIGRlc2lnbmF0ZWQgaTJjIGFkZHJlc3MgKi8KKwkJbmV3X2FkZHIgICAgICAgICAgPSAoMHg0MCArIGspIDw8IDE7CisJCXN0LmkyY19hZGRyID0gbmV3X2FkZHI7CisJCWlmIChkaWI3MDAwbV9pZGVudGlmeSgmc3QpICE9IDApIHsKKwkJCXN0LmkyY19hZGRyID0gZGVmYXVsdF9hZGRyOworCQkJaWYgKGRpYjcwMDBtX2lkZW50aWZ5KCZzdCkgIT0gMCkgeworCQkJCWRwcmludGsoIkRpQjcwMDBNICMlZDogbm90IGlkZW50aWZpZWRcbiIsIGspOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisKKwkJLyogc3RhcnQgZGl2ZXJzaXR5IHRvIHB1bGxfZG93biBkaXZfc3RyIC0ganVzdCBmb3IgaTJjLWVudW1lcmF0aW9uICovCisJCWRpYjcwMDBtX3NldF9vdXRwdXRfbW9kZSgmc3QsIE9VVE1PREVfRElWRVJTSVRZKTsKKworCQlkaWI3MDAwbV93cml0ZV93b3JkKCZzdCwgMTc5NiwgMHgwKTsgLy8gc2VsZWN0IERWQi1UIG91dHB1dAorCisJCS8qIHNldCBuZXcgaTJjIGFkZHJlc3MgYW5kIGZvcmNlIGRpdnN0YXJ0ICovCisJCWRpYjcwMDBtX3dyaXRlX3dvcmQoJnN0LCAxNzk0LCAobmV3X2FkZHIgPDwgMikgfCAweDIpOworCisJCWRwcmludGsoIklDICVkIGluaXRpYWxpemVkICh0byBpMmNfYWRkcmVzcyAweCV4KVxuIiwgaywgbmV3X2FkZHIpOworCX0KKworCWZvciAoayA9IDA7IGsgPCBub19vZl9kZW1vZHM7IGsrKykgeworCQlzdC5jZmcgPSBjZmdba107CisJCXN0LmkyY19hZGRyID0gKDB4NDAgKyBrKSA8PCAxOworCisJCS8vIHVuZm9yY2UgZGl2c3RyCisJCWRpYjcwMDBtX3dyaXRlX3dvcmQoJnN0LDE3OTQsIHN0LmkyY19hZGRyIDw8IDIpOworCisJCS8qIGRlYWN0aXZhdGUgZGl2IC0gaXQgd2FzIGp1c3QgZm9yIGkyYy1lbnVtZXJhdGlvbiAqLworCQlkaWI3MDAwbV9zZXRfb3V0cHV0X21vZGUoJnN0LCBPVVRNT0RFX0hJR0hfWik7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRpYjcwMDBtX2kyY19lbnVtZXJhdGlvbik7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkaWI3MDAwbV9vcHM7CitzdHJ1Y3QgZHZiX2Zyb250ZW5kICogZGliNzAwMG1fYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHU4IGkyY19hZGRyLCBzdHJ1Y3QgZGliNzAwMG1fY29uZmlnICpjZmcpCit7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZGVtb2Q7CisJc3RydWN0IGRpYjcwMDBtX3N0YXRlICpzdDsKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkaWI3MDAwbV9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSgmc3QtPmNmZywgY2ZnLCBzaXplb2Yoc3RydWN0IGRpYjcwMDBtX2NvbmZpZykpOworCXN0LT5pMmNfYWRhcCA9IGkyY19hZGFwOworCXN0LT5pMmNfYWRkciA9IGkyY19hZGRyOworCisJZGVtb2QgICAgICAgICAgICAgICAgICAgPSAmc3QtPmRlbW9kOworCWRlbW9kLT5kZW1vZHVsYXRvcl9wcml2ID0gc3Q7CisJbWVtY3B5KCZzdC0+ZGVtb2Qub3BzLCAmZGliNzAwMG1fb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKworCWlmIChkaWI3MDAwbV9pZGVudGlmeShzdCkgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWlmIChzdC0+cmV2aXNpb24gPT0gMHg0MDAwKQorCQlkaWJ4MDAwX2luaXRfaTJjX21hc3Rlcigmc3QtPmkyY19tYXN0ZXIsIERJQjcwMDAsIHN0LT5pMmNfYWRhcCwgc3QtPmkyY19hZGRyKTsKKwllbHNlCisJCWRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKCZzdC0+aTJjX21hc3RlciwgRElCNzAwME1DLCBzdC0+aTJjX2FkYXAsIHN0LT5pMmNfYWRkcik7CisKKwlkaWI3MDAwbV9kZW1vZF9yZXNldChzdCk7CisKKwlyZXR1cm4gZGVtb2Q7CisKK2Vycm9yOgorCWtmcmVlKHN0KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woZGliNzAwMG1fYXR0YWNoKTsKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRpYjcwMDBtX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiRGlCY29tIDcwMDBNQS9NQi9QQS9QQi9NQyIsCisJCS50eXBlID0gRkVfT0ZETSwKKwkJLmZyZXF1ZW5jeV9taW4gICAgICA9IDQ0MjUwMDAwLAorCQkuZnJlcXVlbmN5X21heCAgICAgID0gODY3MjUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplID0gNjI1MDAsCisJCS5jYXBzID0gRkVfQ0FOX0lOVkVSU0lPTl9BVVRPIHwKKwkJCUZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfCBGRV9DQU5fRkVDXzNfNCB8CisJCQlGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ19BVVRPIHwKKwkJCUZFX0NBTl9RUFNLIHwgRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAorCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfAorCQkJRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkJRkVfQ0FOX1JFQ09WRVIgfAorCQkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPLAorCX0sCisKKwkucmVsZWFzZSAgICAgICAgICAgICAgPSBkaWI3MDAwbV9yZWxlYXNlLAorCisJLmluaXQgICAgICAgICAgICAgICAgID0gZGliNzAwMG1faW5pdCwKKwkuc2xlZXAgICAgICAgICAgICAgICAgPSBkaWI3MDAwbV9zbGVlcCwKKworCS5zZXRfZnJvbnRlbmQgICAgICAgICA9IGRpYjcwMDBtX3NldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgICAgPSBkaWI3MDAwbV9mZV9nZXRfdHVuZV9zZXR0aW5ncywKKwkuZ2V0X2Zyb250ZW5kICAgICAgICAgPSBkaWI3MDAwbV9nZXRfZnJvbnRlbmQsCisKKwkucmVhZF9zdGF0dXMgICAgICAgICAgPSBkaWI3MDAwbV9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgICAgICAgICAgICAgPSBkaWI3MDAwbV9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkaWI3MDAwbV9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgICAgICAgICAgICAgPSBkaWI3MDAwbV9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyAgICAgICAgPSBkaWI3MDAwbV9yZWFkX3VuY19ibG9ja3MsCit9OworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGJvZXR0Y2hlckBkaWJjb20uZnI+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIERpQmNvbSA3MDAwTUEvTUIvUEEvUEIvTUMgQ09GRE0gZGVtb2R1bGF0b3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwbS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3ZTljYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwbS5oCkBAIC0wLDAgKzEsNTEgQEAKKyNpZm5kZWYgRElCNzAwME1fSAorI2RlZmluZSBESUI3MDAwTV9ICisKKyNpbmNsdWRlICJkaWJ4MDAwX2NvbW1vbi5oIgorCitzdHJ1Y3QgZGliNzAwMG1fY29uZmlnIHsKKwl1OCBkdmJ0X21vZGU7CisJdTggb3V0cHV0X21wZWcyX2luXzE4OF9ieXRlczsKKwl1OCBob3N0YnVzX2RpdmVyc2l0eTsKKwl1OCB0dW5lcl9pc19iYXNlYmFuZDsKKwl1OCBtb2JpbGVfbW9kZTsKKwlpbnQgKCp1cGRhdGVfbG5hKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCB1MTYgYWdjX2dsb2JhbCk7CisKKwl1OCBhZ2NfY29uZmlnX2NvdW50OworCXN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgKmFnYzsKKworCXN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgKmJ3OworCisjZGVmaW5lIERJQjcwMDBNX0dQSU9fREVGQVVMVF9ESVJFQ1RJT05TIDB4ZmZmZgorCXUxNiBncGlvX2RpcjsKKyNkZWZpbmUgRElCNzAwME1fR1BJT19ERUZBVUxUX1ZBTFVFUyAgICAgMHgwMDAwCisJdTE2IGdwaW9fdmFsOworI2RlZmluZSBESUI3MDAwTV9HUElPX1BXTV9QT1MwKHYpICAgICAgICAoKHYgJiAweGYpIDw8IDEyKQorI2RlZmluZSBESUI3MDAwTV9HUElPX1BXTV9QT1MxKHYpICAgICAgICAoKHYgJiAweGYpIDw8IDggKQorI2RlZmluZSBESUI3MDAwTV9HUElPX1BXTV9QT1MyKHYpICAgICAgICAoKHYgJiAweGYpIDw8IDQgKQorI2RlZmluZSBESUI3MDAwTV9HUElPX1BXTV9QT1MzKHYpICAgICAgICAgKHYgJiAweGYpCisjZGVmaW5lIERJQjcwMDBNX0dQSU9fREVGQVVMVF9QV01fUE9TICAgIDB4ZmZmZgorCXUxNiBncGlvX3B3bV9wb3M7CisKKwl1MTYgcHdtX2ZyZXFfZGl2OworCisJdTggcXVhcnR6X2RpcmVjdDsKKworCXU4IGlucHV0X2Nsa19pc19kaXZfMjsKKworCWludCAoKmFnY19jb250cm9sKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCB1OCBiZWZvcmUpOworfTsKKworI2RlZmluZSBERUZBVUxUX0RJQjcwMDBNX0kyQ19BRERSRVNTIDE4CisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogZGliNzAwMG1fYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHU4IGkyY19hZGRyLCBzdHJ1Y3QgZGliNzAwMG1fY29uZmlnICpjZmcpOworZXh0ZXJuIHN0cnVjdCBpMmNfYWRhcHRlciAqIGRpYjcwMDBtX2dldF9pMmNfbWFzdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgZW51bSBkaWJ4MDAwX2kyY19pbnRlcmZhY2UsIGludCk7CisKKy8qIFRPRE8KK2V4dGVybiBJTlQgZGliNzAwMG1fc2V0X2dwaW8oc3RydWN0IGRpYkRlbW9kICpkZW1vZCwgVUNIQVIgbnVtLCBVQ0hBUiBkaXIsIFVDSEFSIHZhbCk7CitleHRlcm4gSU5UIGRpYjcwMDBtX2VuYWJsZV92Ymdfdm9sdGFnZShzdHJ1Y3QgZGliRGVtb2QgKmRlbW9kKTsKK2V4dGVybiB2b2lkIGRpYjcwMDBtX3NldF9ob3N0YnVzX2RpdmVyc2l0eShzdHJ1Y3QgZGliRGVtb2QgKmRlbW9kLCBVQ0hBUiBvbm9mZik7CitleHRlcm4gVVNIT1JUIGRpYjcwMDBtX2dldF9jdXJyZW50X2FnY19nbG9iYWwoc3RydWN0IGRpYkRlbW9kICpkZW1vZCk7CisqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0OWE0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5jCkBAIC0wLDAgKzEsMTAxOSBAQAorLyoKKyAqIExpbnV4LURWQiBEcml2ZXIgZm9yIERpQmNvbSdzIHNlY29uZCBnZW5lcmF0aW9uIERpQjcwMDBQIChQQykuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTYgRGlCY29tIChodHRwOi8vd3d3LmRpYmNvbS5mci8pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCisjaW5jbHVkZSAiZGliNzAwMHAuaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJ0dXJuIG9uIGRlYnVnZ2luZyAoZGVmYXVsdDogMCkiKTsKKworI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pIGRvIHsgaWYgKGRlYnVnKSB7IHByaW50ayhLRVJOX0RFQlVHICJEaUI3MDAwUDoiKTsgcHJpbnRrKGFyZ3MpOyB9IH0gd2hpbGUgKDApCisKK3N0cnVjdCBkaWI3MDAwcF9zdGF0ZSB7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBkZW1vZDsKKyAgICBzdHJ1Y3QgZGliNzAwMHBfY29uZmlnIGNmZzsKKworCXU4IGkyY19hZGRyOworCXN0cnVjdCBpMmNfYWRhcHRlciAgICppMmNfYWRhcDsKKworCXN0cnVjdCBkaWJ4MDAwX2kyY19tYXN0ZXIgaTJjX21hc3RlcjsKKworCXUxNiB3YmRfcmVmOworCisJdTggY3VycmVudF9iYW5kOworCWZlX2JhbmR3aWR0aF90IGN1cnJlbnRfYmFuZHdpZHRoOworCXN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgKmN1cnJlbnRfYWdjOworCXUzMiB0aW1mOworCisJdTE2IGdwaW9fZGlyOworCXUxNiBncGlvX3ZhbDsKK307CisKK2VudW0gZGliNzAwMHBfcG93ZXJfbW9kZSB7CisJRElCNzAwMFBfUE9XRVJfQUxMID0gMCwKKwlESUI3MDAwUF9QT1dFUl9JTlRFUkZBQ0VfT05MWSwKK307CisKK3N0YXRpYyB1MTYgZGliNzAwMHBfcmVhZF93b3JkKHN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUsIHUxNiByZWcpCit7CisJdTggd2JbMl0gPSB7IHJlZyA+PiA4LCByZWcgJiAweGZmIH07CisJdTggcmJbMl07CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7IC5hZGRyID0gc3RhdGUtPmkyY19hZGRyID4+IDEsIC5mbGFncyA9IDAsICAgICAgICAuYnVmID0gd2IsIC5sZW4gPSAyIH0sCisJCXsgLmFkZHIgPSBzdGF0ZS0+aTJjX2FkZHIgPj4gMSwgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSByYiwgLmxlbiA9IDIgfSwKKwl9OworCisJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjX2FkYXAsIG1zZywgMikgIT0gMikKKwkJZHByaW50aygiaTJjIHJlYWQgZXJyb3Igb24gJWRcbiIscmVnKTsKKworCXJldHVybiAocmJbMF0gPDwgOCkgfCByYlsxXTsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF93cml0ZV93b3JkKHN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUsIHUxNiByZWcsIHUxNiB2YWwpCit7CisJdTggYls0XSA9IHsKKwkJKHJlZyA+PiA4KSAmIDB4ZmYsIHJlZyAmIDB4ZmYsCisJCSh2YWwgPj4gOCkgJiAweGZmLCB2YWwgJiAweGZmLAorCX07CisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQkuYWRkciA9IHN0YXRlLT5pMmNfYWRkciA+PiAxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYiwgLmxlbiA9IDQKKwl9OworCXJldHVybiBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxID8gLUVSRU1PVEVJTyA6IDA7Cit9CitzdGF0aWMgaW50IGRpYjcwMDBwX3NldF9vdXRwdXRfbW9kZShzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlLCBpbnQgbW9kZSkKK3sKKwlpbnQgICAgcmV0ID0gMDsKKwl1MTYgb3V0cmVnLCBmaWZvX3RocmVzaG9sZCwgc21vX21vZGU7CisKKwlvdXRyZWcgPSAwOworCWZpZm9fdGhyZXNob2xkID0gMTc5MjsKKwlzbW9fbW9kZSA9IChkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDIzNSkgJiAweDAwMTApIHwgKDEgPDwgMSk7CisKKwlkcHJpbnRrKCItSS0gIFNldHRpbmcgb3V0cHV0IG1vZGUgZm9yIGRlbW9kICVwIHRvICVkXG4iLAorCQkJJnN0YXRlLT5kZW1vZCwgbW9kZSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBPVVRNT0RFX01QRUcyX1BBUl9HQVRFRF9DTEs6ICAgLy8gU1RCcyB3aXRoIHBhcmFsbGVsIGdhdGVkIGNsb2NrCisJCQlvdXRyZWcgPSAoMSA8PCAxMCk7ICAvKiAweDA0MDAgKi8KKwkJCWJyZWFrOworCQljYXNlIE9VVE1PREVfTVBFRzJfUEFSX0NPTlRfQ0xLOiAgICAvLyBTVEJzIHdpdGggcGFyYWxsZWwgY29udGludWVzIGNsb2NrCisJCQlvdXRyZWcgPSAoMSA8PCAxMCkgfCAoMSA8PCA2KTsgLyogMHgwNDQwICovCisJCQlicmVhazsKKwkJY2FzZSBPVVRNT0RFX01QRUcyX1NFUklBTDogICAgICAgICAgLy8gU1RCcyB3aXRoIHNlcmlhbCBpbnB1dAorCQkJb3V0cmVnID0gKDEgPDwgMTApIHwgKDIgPDwgNikgfCAoMCA8PCAxKTsgLyogMHgwNDgwICovCisJCQlicmVhazsKKwkJY2FzZSBPVVRNT0RFX0RJVkVSU0lUWToKKwkJCWlmIChzdGF0ZS0+Y2ZnLmhvc3RidXNfZGl2ZXJzaXR5KQorCQkJCW91dHJlZyA9ICgxIDw8IDEwKSB8ICg0IDw8IDYpOyAvKiAweDA1MDAgKi8KKwkJCWVsc2UKKwkJCQlvdXRyZWcgPSAoMSA8PCAxMSk7CisJCQlicmVhazsKKwkJY2FzZSBPVVRNT0RFX01QRUcyX0ZJRk86ICAgICAgICAgICAgLy8gZS5nLiBVU0IgZmVlZGluZworCQkJc21vX21vZGUgfD0gKDMgPDwgMSk7CisJCQlmaWZvX3RocmVzaG9sZCA9IDUxMjsKKwkJCW91dHJlZyA9ICgxIDw8IDEwKSB8ICg1IDw8IDYpOworCQkJYnJlYWs7CisJCWNhc2UgT1VUTU9ERV9ISUdIX1o6ICAvLyBkaXNhYmxlCisJCQlvdXRyZWcgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKCJVbmhhbmRsZWQgb3V0cHV0X21vZGUgcGFzc2VkIHRvIGJlIHNldCBmb3IgZGVtb2QgJXBcbiIsJnN0YXRlLT5kZW1vZCk7CisJCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdGUtPmNmZy5vdXRwdXRfbXBlZzJfaW5fMTg4X2J5dGVzKQorCQlzbW9fbW9kZSB8PSAoMSA8PCA1KSA7CisKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgIDIzNSwgc21vX21vZGUpOworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAgMjM2LCBmaWZvX3RocmVzaG9sZCk7IC8qIHN5bmNocm9ub3VzIGZyZWFkICovCisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDEyODYsIG91dHJlZyk7ICAgICAgICAgLyogUF9EaXZfYWN0aXZlICovCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRpYjcwMDBwX3NldF9wb3dlcl9tb2RlKHN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUsIGVudW0gZGliNzAwMHBfcG93ZXJfbW9kZSBtb2RlKQoreworCS8qIGJ5IGRlZmF1bHQgZXZlcnl0aGluZyBpcyBwb3dlcmVkIG9mZiAqLworCXUxNiByZWdfNzc0ID0gMHhmZmZmLCByZWdfNzc1ID0gMHhmZmZmLCByZWdfNzc2ID0gMHgwMDA3LCByZWdfODk5ICA9IDB4MDAwMywKKwkJcmVnXzEyODAgPSAoMHhmZTAwKSB8IChkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDEyODApICYgMHgwMWZmKTsKKworCS8qIG5vdywgZGVwZW5kaW5nIG9uIHRoZSByZXF1ZXN0ZWQgbW9kZSwgd2UgcG93ZXIgb24gKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKwkJLyogcG93ZXIgdXAgZXZlcnl0aGluZyBpbiB0aGUgZGVtb2QgKi8KKwkJY2FzZSBESUI3MDAwUF9QT1dFUl9BTEw6CisJCQlyZWdfNzc0ID0gMHgwMDAwOyByZWdfNzc1ID0gMHgwMDAwOyByZWdfNzc2ID0gMHgwOyByZWdfODk5ID0gMHgwOyByZWdfMTI4MCAmPSAweDAxZmY7CisJCQlicmVhazsKKwkJLyoganVzdCBsZWF2ZSBwb3dlciBvbiB0aGUgY29udHJvbC1pbnRlcmZhY2VzOiBHUElPIGFuZCAoSTJDIG9yIFNESU8pICovCisJCWNhc2UgRElCNzAwMFBfUE9XRVJfSU5URVJGQUNFX09OTFk6IC8qIFRPRE8gcG93ZXIgdXAgZWl0aGVyIFNESU8gb3IgSTJDICovCisJCQlyZWdfMTI4MCAmPSB+KCgxIDw8IDE0KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDEyKSB8ICgxIDw8IDEwKSk7CisJCQlicmVhazsKKy8qIFRPRE8gZm9sbG93aW5nIHN0dWZmIGlzIGp1c3QgY29udmVydGVkIGZyb20gdGhlIGRpYjcwMDAtZHJpdmVyIC0gY2hlY2sgd2hlbiBpcyB1c2VkIHdoYXQgKi8KKwl9CisKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAgNzc0LCAgcmVnXzc3NCk7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgIDc3NSwgIHJlZ183NzUpOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsICA3NzYsICByZWdfNzc2KTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAgODk5LCAgcmVnXzg5OSk7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTI4MCwgcmVnXzEyODApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpYjcwMDBwX3NldF9hZGNfc3RhdGUoc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSwgZW51bSBkaWJ4MDAwX2FkY19zdGF0ZXMgbm8pCit7CisJdTE2IHJlZ185MDggPSBkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDkwOCksCisJICAgICAgIHJlZ185MDkgPSBkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDkwOSk7CisKKwlzd2l0Y2ggKG5vKSB7CisJCWNhc2UgRElCWDAwMF9TTE9XX0FEQ19PTjoKKwkJCXJlZ185MDkgfD0gKDEgPDwgMSkgfCAoMSA8PCAwKTsKKwkJCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDkwOSwgcmVnXzkwOSk7CisJCQlyZWdfOTA5ICY9IH4oMSA8PCAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElCWDAwMF9TTE9XX0FEQ19PRkY6CisJCQlyZWdfOTA5IHw9ICAoMSA8PCAxKSB8ICgxIDw8IDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBESUJYMDAwX0FEQ19PTjoKKwkJCXJlZ185MDggJj0gMHgwZmZmOworCQkJcmVnXzkwOSAmPSAweDAwMDM7CisJCQlicmVhazsKKworCQljYXNlIERJQlgwMDBfQURDX09GRjogLy8gbGVhdmUgdGhlIFZCRyB2b2x0YWdlIG9uCisJCQlyZWdfOTA4IHw9ICgxIDw8IDE0KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDEyKTsKKwkJCXJlZ185MDkgfD0gKDEgPDwgNSkgfCAoMSA8PCA0KSB8ICgxIDw8IDMpIHwgKDEgPDwgMik7CisJCQlicmVhazsKKworCQljYXNlIERJQlgwMDBfVkJHX0VOQUJMRToKKwkJCXJlZ185MDggJj0gfigxIDw8IDE1KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElCWDAwMF9WQkdfRElTQUJMRToKKwkJCXJlZ185MDggfD0gKDEgPDwgMTUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworLy8JZHByaW50aygiOTA4OiAleCwgOTA5OiAleFxuIiwgcmVnXzkwOCwgcmVnXzkwOSk7CisKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA5MDgsIHJlZ185MDgpOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDkwOSwgcmVnXzkwOSk7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMHBfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkZW1vZCwgdTggQldfSWR4KQoreworCXN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUgPSBkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MzIgdGltZjsKKworCS8vIHN0b3JlIHRoZSBjdXJyZW50IGJhbmR3aWR0aCBmb3IgbGF0ZXIgdXNlCisJc3RhdGUtPmN1cnJlbnRfYmFuZHdpZHRoID0gQldfSWR4OworCisJaWYgKHN0YXRlLT50aW1mID09IDApIHsKKwkJZHByaW50aygiLUQtICBVc2luZyBkZWZhdWx0IHRpbWZcbiIpOworCQl0aW1mID0gc3RhdGUtPmNmZy5idy0+dGltZjsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCItRC0gIFVzaW5nIHVwZGF0ZWQgdGltZlxuIik7CisJCXRpbWYgPSBzdGF0ZS0+dGltZjsKKwl9CisKKwl0aW1mID0gdGltZiAqIChCV19JTkRFWF9UT19LSFooQldfSWR4KSAvIDEwMCkgLyA4MDsKKworCWRwcmludGsoInRpbWY6ICVkXG4iLHRpbWYpOworCisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMjMsICh0aW1mID4+IDE2KSAmIDB4ZmZmZik7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMjQsICh0aW1mICAgICAgKSAmIDB4ZmZmZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF9zYWRfY2FsaWIoc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSkKK3sKKy8qIGludGVybmFsICovCisvLwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA3MiwgKDMgPDwgMTQpIHwgKDEgPDwgMTIpIHwgKDUyNCA8PCAwKSk7IC8vIHNhbXBsaW5nIGNsb2NrIG9mIHRoZSBTQUQgaXMgd3JpdHRpbmcgaW4gc2V0X2JhbmR3aWR0aAorCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDczLCAoMCA8PCAxKSB8ICgwIDw8IDApKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA3NCwgNzc2KTsgLy8gMC42MjUqMy4zIC8gNDA5NgorCisJLyogZG8gdGhlIGNhbGlicmF0aW9uICovCisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgNzMsICgxIDw8IDApKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA3MywgKDAgPDwgMCkpOworCisJbXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpYjcwMDBwX3Jlc2V0X3BsbChzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgKmJ3ID0gJnN0YXRlLT5jZmcuYndbMF07CisKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA5MDMsIChidy0+cGxsX3ByZWRpdiA8PCA1KSB8ICgoKGJ3LT5wbGxfcmF0aW8gPj4gNikgJiAweDMpIDw8IDMpIHwgKGJ3LT5wbGxfcmFuZ2UgPDwgMSkgfCBidy0+cGxsX3Jlc2V0KTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA5MDAsICgoYnctPnBsbF9yYXRpbyAmIDB4M2YpIDw8IDkpIHwgKGJ3LT5wbGxfYnlwYXNzIDw8IDE1KSB8IChidy0+bW9kdWxvIDw8IDcpIHwgKGJ3LT5BRENsa1NyYyA8PCA2KSB8CisJCShidy0+SU9fQ0xLX2VuX2NvcmUgPDwgNSkgfCAoYnctPmJ5cGNsa19kaXYgPDwgMikgfCAoYnctPmVuYWJsZV9yZWZkaXYgPDwgMSkgfCAoMCA8PCAwKSk7CisKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxOCwgKChidy0+aW50ZXJuYWwqMTAwMCkgPj4gMTYpICYgMHhmZmZmKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxOSwgIChidy0+aW50ZXJuYWwqMTAwMCAgICAgICApICYgMHhmZmZmKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMSwgIChidy0+aWZyZXEgICAgICAgICAgPj4gMTYpICYgMHhmZmZmKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMiwgIChidy0+aWZyZXEgICAgICAgICAgICAgICApICYgMHhmZmZmKTsKKworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDcyLCBidy0+c2FkX2NmZyk7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMHBfcmVzZXRfZ3BpbyhzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0KQoreworCS8qIHJlc2V0IHRoZSBHUElPcyAqLworCWRwcmludGsoIi1ELSAgZ3BpbyBkaXI6ICV4OiBncGlvIHZhbDogJXgsIGdwaW8gcHdtIHBvczogJXhcbiIsc3QtPmdwaW9fZGlyLCBzdC0+Z3Bpb192YWwsc3QtPmNmZy5ncGlvX3B3bV9wb3MpOworCisJZGliNzAwMHBfd3JpdGVfd29yZChzdCwgMTAyOSwgc3QtPmdwaW9fZGlyKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0LCAxMDMwLCBzdC0+Z3Bpb192YWwpOworCisJLyogVE9ETyAxMDMxIGlzIFBfZ3Bpb19vZCAqLworCisJZGliNzAwMHBfd3JpdGVfd29yZChzdCwgMTAzMiwgc3QtPmNmZy5ncGlvX3B3bV9wb3MpOworCisJZGliNzAwMHBfd3JpdGVfd29yZChzdCwgMTAzNywgc3QtPmNmZy5wd21fZnJlcV9kaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBwX2RlbW9kX3Jlc2V0KHN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUpCit7CisJZGliNzAwMHBfc2V0X3Bvd2VyX21vZGUoc3RhdGUsIERJQjcwMDBQX1BPV0VSX0FMTCk7CisKKwlkaWI3MDAwcF9zZXRfYWRjX3N0YXRlKHN0YXRlLCBESUJYMDAwX1ZCR19FTkFCTEUpOworCisJLyogcmVzdGFydCBhbGwgcGFydHMgKi8KKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAgNzcwLCAweGZmZmYpOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsICA3NzEsIDB4ZmZmZik7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgIDc3MiwgMHgwMDFmKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAgODk4LCAweDAwMDMpOworCS8qIGV4Y2VwdCBpMmMsIHNkaW8sIGdwaW8gLSBjb250cm9sIGludGVyZmFjZXMgKi8KKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxMjgwLCAweDAxZmMgLSAoKDEgPDwgNykgfCAoMSA8PCA2KSB8ICgxIDw8IDUpKSApOworCisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgIDc3MCwgMCk7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgIDc3MSwgMCk7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgIDc3MiwgMCk7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgIDg5OCwgMCk7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTI4MCwgMCk7CisKKwkvKiBkZWZhdWx0ICovCisJZGliNzAwMHBfcmVzZXRfcGxsKHN0YXRlKTsKKworCWlmIChkaWI3MDAwcF9yZXNldF9ncGlvKHN0YXRlKSAhPSAwKQorCQlkcHJpbnRrKCItRS0gIEdQSU8gcmVzZXQgd2FzIG5vdCBzdWNjZXNzZnVsLlxuIik7CisKKwlpZiAoZGliNzAwMHBfc2V0X291dHB1dF9tb2RlKHN0YXRlLCBPVVRNT0RFX0hJR0hfWikgIT0gMCkKKwkJZHByaW50aygiLUUtICBPVVRQVVRfTU9ERSBjb3VsZCBub3QgYmUgcmVzZXR0ZWQuXG4iKTsKKworCS8qIHVuZm9yY2UgZGl2c3RyIHJlZ2FyZGxlc3Mgd2hldGhlciBpMmMgZW51bWVyYXRpb24gd2FzIGRvbmUgb3Igbm90ICovCisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTI4NSwgZGliNzAwMHBfcmVhZF93b3JkKHN0YXRlLCAxMjg1KSAmIH4oMSA8PCAxKSApOworCisJZGliNzAwMHBfc2V0X3Bvd2VyX21vZGUoc3RhdGUsIERJQjcwMDBQX1BPV0VSX0lOVEVSRkFDRV9PTkxZKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaWI3MDAwcF9yZXN0YXJ0X2FnYyhzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlKQoreworCS8vIFBfcmVzdGFydF9pcWMgJiBQX3Jlc3RhcnRfYWdjCisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgNzcwLCAweDBjMDApOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDc3MCwgMHgwMDAwKTsKK30KKworc3RhdGljIHZvaWQgZGliNzAwMHBfdXBkYXRlX2xuYShzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlKQoreworCWludCBpOworCXUxNiBkeW5fZ2FpbjsKKworCS8vIHdoZW4gdGhlcmUgaXMgbm8gTE5BIHRvIHByb2dyYW0gcmV0dXJuIGltbWVkaWF0bHkKKwlpZiAoc3RhdGUtPmNmZy51cGRhdGVfbG5hID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJLy8gcmVhZCBkeW5fZ2FpbiBoZXJlIChiZWNhdXNlIGl0IGlzIGRlbW9kLWRlcGVuZGVudCBhbmQgbm90IHR1bmVyKQorCQlkeW5fZ2FpbiA9IGRpYjcwMDBwX3JlYWRfd29yZChzdGF0ZSwgMzk0KTsKKworCQlpZiAoc3RhdGUtPmNmZy51cGRhdGVfbG5hKCZzdGF0ZS0+ZGVtb2QsZHluX2dhaW4pKSB7IC8vIExOQSBoYXMgY2hhbmdlZAorCQkJZGliNzAwMHBfcmVzdGFydF9hZ2Moc3RhdGUpOworCQkJbXNsZWVwKDUpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZGliNzAwMHBfcGxsX2Nsa19jZmcoc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgdG1wID0gMDsKKwl0bXAgPSBkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDkwMyk7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgOTAzLCAodG1wIHwgMHgxKSk7ICAgLy9wd3ItdXAgcGxsCisJdG1wID0gZGliNzAwMHBfcmVhZF93b3JkKHN0YXRlLCA5MDApOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDkwMCwgKHRtcCAmIDB4N2ZmZikgfCAoMSA8PCA2KSk7ICAgICAvL3VzZSBIaWdoIGZyZXEgY2xvY2sKK30KKworc3RhdGljIHZvaWQgZGliNzAwMHBfdXBkYXRlX3RpbWZfZnJlcShzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlKQoreworCXUzMiB0aW1mID0gKGRpYjcwMDBwX3JlYWRfd29yZChzdGF0ZSwgNDI3KSA8PCAxNikgfCBkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDQyOCk7CisJc3RhdGUtPnRpbWYgPSB0aW1mICogODAgLyAoQldfSU5ERVhfVE9fS0haKHN0YXRlLT5jdXJyZW50X2JhbmR3aWR0aCkgLyAxMDApOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDIzLCAodTE2KSAodGltZiA+PiAxNikpOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDI0LCAodTE2KSAodGltZiAmIDB4ZmZmZikpOworCWRwcmludGsoIi1ELSAgVXBkYXRlZCB0aW1mX2ZyZXF1ZW5jeTogJWQgKGRlZmF1bHQ6ICVkKVxuIixzdGF0ZS0+dGltZiwgc3RhdGUtPmNmZy5idy0+dGltZik7Cit9CisKK3N0YXRpYyB2b2lkIGRpYjcwMDBwX3NldF9jaGFubmVsKHN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBkaWJ4MDAwX29mZG1fY2hhbm5lbCAqY2gsIHU4IHNlcSkKK3sKKwl1MTYgdG1wLCBlc3RbNF07IC8vIHJlZ18yNiwgcmVnXzMyLCByZWdfMzMsIHJlZ18xODcsIHJlZ18xODgsIHJlZ18xODksIHJlZ18xOTAsIHJlZ18yMDcsIHJlZ18yMDg7CisKKwkvKiBuZmZ0LCBndWFyZCwgcWFtLCBhbHBoYSAqLworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDAsIChjaC0+bmZmdCA8PCA3KSB8IChjaC0+Z3VhcmQgPDwgNSkgfCAoY2gtPm5xYW0gPDwgMykgfCAoY2gtPnZpdF9hbHBoYSkpOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDUsIChzZXEgPDwgNCkgfCAxKTsgLyogZG8gbm90IGZvcmNlIHRwcywgc2VhcmNoIGxpc3QgMCAqLworCisJLyogUF9kaW50bF9uYXRpdmUsIFBfZGludGx2X2ludiwgUF92aXRfaHJjaCwgUF92aXRfY29kZV9yYXRlLCBQX3ZpdF9zZWxlY3RfaHAgKi8KKwl0bXAgPSAoY2gtPmludGx2X25hdGl2ZSA8PCA2KSB8IChjaC0+dml0X2hyY2ggPDwgNCkgfCAoY2gtPnZpdF9zZWxlY3RfaHAgJiAweDEpOworCWlmIChjaC0+dml0X2hyY2ggPT0gMCB8fCBjaC0+dml0X3NlbGVjdF9ocCA9PSAxKQorCQl0bXAgfD0gKGNoLT52aXRfY29kZV9yYXRlX2hwIDw8IDEpOworCWVsc2UKKwkJdG1wIHw9IChjaC0+dml0X2NvZGVfcmF0ZV9scCA8PCAxKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDgsIHRtcCk7CisKKwkvKiBQX2R2c3lfc3luY193YWl0ICovCisJc3dpdGNoIChjaC0+bmZmdCkgeworCQljYXNlIDE6IHRtcCA9IDI1NjsgYnJlYWs7CisJCWNhc2UgMjogdG1wID0gMTI4OyBicmVhazsKKwkJY2FzZSAwOgorCQlkZWZhdWx0OiB0bXAgPSA2NDsgYnJlYWs7CisJfQorCXRtcCAqPSAoKDEgPDwgKGNoLT5ndWFyZCkpICogMyAvIDIpOyAvLyBhZGQgNTAlIFNGTiBtYXJnaW4KKwl0bXAgPDw9IDQ7CisKKwkvKiBkZWFjdGl2ZSB0aGUgcG9zc2liaWxpdHkgb2YgZGl2ZXJzaXR5IHJlY2VwdGlvbiBpZiBleHRlbmRlZCBpbnRlcmxlYXZlICovCisJLyogUF9kdnN5X3N5bmNfbW9kZSA9IDAsIFBfZHZzeV9zeW5jX2VuYWJsZT0xLCBQX2R2Y2JfY29tYl9tb2RlPTIgKi8KKwlpZiAoY2gtPmludGx2X25hdGl2ZSB8fCBjaC0+bmZmdCA9PSAxKQorCQl0bXAgfD0gKDEgPDwgMikgfCAoMiA8PCAwKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyMDcsIHRtcCk7CisKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyNiwgMHg2NjgwKTsgICAvLyB0aW1mKDZ4eHgpCisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMjksIDB4MTI3Myk7ICAgLy8gaXNpIGluaDEyNzMgb24xMDczCisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMzIsIDB4MDAwMyk7ICAgLy8gcGhhX29mZl9tYXgoeHh4MykKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAzMywgMHgwMDA1KTsgICAvLyBzZnJlcSh4eHg1KQorCisJLyogY2hhbm5lbCBlc3RpbWF0aW9uIGZpbmUgY29uZmlndXJhdGlvbiAqLworCXN3aXRjaCAoY2gtPm5xYW0pIHsKKwkJY2FzZSAyOgorCQkJZXN0WzBdID0gMHgwMTQ4OyAgICAgICAvKiBQX2FkcF9yZWd1bF9jbnQgMC4wNCAqLworCQkJZXN0WzFdID0gMHhmZmYwOyAgICAgICAvKiBQX2FkcF9ub2lzZV9jbnQgLTAuMDAyICovCisJCQllc3RbMl0gPSAweDAwYTQ7ICAgICAgIC8qIFBfYWRwX3JlZ3VsX2V4dCAwLjAyICovCisJCQllc3RbM10gPSAweGZmZjg7ICAgICAgIC8qIFBfYWRwX25vaXNlX2V4dCAtMC4wMDEgKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQllc3RbMF0gPSAweDAyM2Q7ICAgICAgIC8qIFBfYWRwX3JlZ3VsX2NudCAwLjA3ICovCisJCQllc3RbMV0gPSAweGZmZGY7ICAgICAgIC8qIFBfYWRwX25vaXNlX2NudCAtMC4wMDQgKi8KKwkJCWVzdFsyXSA9IDB4MDBhNDsgICAgICAgLyogUF9hZHBfcmVndWxfZXh0IDAuMDIgKi8KKwkJCWVzdFszXSA9IDB4ZmZmMDsgICAgICAgLyogUF9hZHBfbm9pc2VfZXh0IC0wLjAwMiAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllc3RbMF0gPSAweDA5OWE7ICAgICAgIC8qIFBfYWRwX3JlZ3VsX2NudCAwLjMgKi8KKwkJCWVzdFsxXSA9IDB4ZmZhZTsgICAgICAgLyogUF9hZHBfbm9pc2VfY250IC0wLjAxICovCisJCQllc3RbMl0gPSAweDAzMzM7ICAgICAgIC8qIFBfYWRwX3JlZ3VsX2V4dCAwLjEgKi8KKwkJCWVzdFszXSA9IDB4ZmZmODsgICAgICAgLyogUF9hZHBfbm9pc2VfZXh0IC0wLjAwMiAqLworCQkJYnJlYWs7CisJfQorCWZvciAodG1wID0gMDsgdG1wIDwgNDsgdG1wKyspCisJCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDE4NyArIHRtcCwgZXN0W3RtcF0pOworCisJLy8gc2V0IHBvd2VyLXVwIGxldmVsOiBpbnRlcmYrYW5hbG9nK0FHQworCWRpYjcwMDBwX3NldF9wb3dlcl9tb2RlKHN0YXRlLCBESUI3MDAwUF9QT1dFUl9BTEwpOworCWRpYjcwMDBwX3NldF9hZGNfc3RhdGUoc3RhdGUsIERJQlgwMDBfQURDX09OKTsKKwlkaWI3MDAwcF9wbGxfY2xrX2NmZyhzdGF0ZSk7CisJbXNsZWVwKDcpOworCisJLy8gQUdDIGluaXRpYWxpemF0aW9uCisJaWYgKHN0YXRlLT5jZmcuYWdjX2NvbnRyb2wpCisJCXN0YXRlLT5jZmcuYWdjX2NvbnRyb2woJnN0YXRlLT5kZW1vZCwgMSk7CisKKwlkaWI3MDAwcF9yZXN0YXJ0X2FnYyhzdGF0ZSk7CisKKwkvLyB3YWl0IEFHQyByb3VnaCBsb2NrIHRpbWUKKwltc2xlZXAoNSk7CisKKwlkaWI3MDAwcF91cGRhdGVfbG5hKHN0YXRlKTsKKworCS8vIHdhaXQgQUdDIGFjY3VyYXRlIGxvY2sgdGltZQorCW1zbGVlcCg3KTsKKwlpZiAoc3RhdGUtPmNmZy5hZ2NfY29udHJvbCkKKwkJc3RhdGUtPmNmZy5hZ2NfY29udHJvbCgmc3RhdGUtPmRlbW9kLCAwKTsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF9hdXRvc2VhcmNoX3N0YXJ0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kLCBzdHJ1Y3QgZGlieDAwMF9vZmRtX2NoYW5uZWwgKmNoKQoreworCXN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUgPSBkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgZGlieDAwMF9vZmRtX2NoYW5uZWwgYXV0b19jaDsKKwl1MzIgdmFsdWU7CisKKwlJTklUX09GRE1fQ0hBTk5FTCgmYXV0b19jaCk7CisJYXV0b19jaC5SRl9rSHogICAgICAgICAgID0gY2gtPlJGX2tIejsKKwlhdXRvX2NoLkJ3ICAgICAgICAgICAgICAgPSBjaC0+Qnc7CisJYXV0b19jaC5ucWFtICAgICAgICAgICAgID0gMjsKKwlhdXRvX2NoLmd1YXJkICAgICAgICAgICAgPSAwOworCWF1dG9fY2gubmZmdCAgICAgICAgICAgICA9IDE7CisJYXV0b19jaC52aXRfYWxwaGEgICAgICAgID0gMTsKKwlhdXRvX2NoLnZpdF9zZWxlY3RfaHAgICAgPSAxOworCWF1dG9fY2gudml0X2NvZGVfcmF0ZV9ocCA9IDI7CisJYXV0b19jaC52aXRfY29kZV9yYXRlX2xwID0gMzsKKwlhdXRvX2NoLnZpdF9ocmNoICAgICAgICAgPSAwOworCWF1dG9fY2guaW50bHZfbmF0aXZlICAgICA9IDE7CisKKwlkaWI3MDAwcF9zZXRfY2hhbm5lbChzdGF0ZSwgJmF1dG9fY2gsIDcpOworCisJLy8gYWx3YXlzIHVzZSB0aGUgc2V0dGluZyBmb3IgOE1IeiBoZXJlIGxvY2tfdGltZSBmb3IgNyw2IE1IeiBhcmUgbG9uZ2VyCisJdmFsdWUgPSAzMCAqIHN0YXRlLT5jZmcuYnctPmludGVybmFsOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDYsICAodTE2KSAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZikpOyAvLyBsb2NrMCB3YWl0IHRpbWUKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA3LCAgKHUxNikgICh2YWx1ZSAgICAgICAgJiAweGZmZmYpKTsgLy8gbG9jazAgd2FpdCB0aW1lCisJdmFsdWUgPSAxMDAgKiBzdGF0ZS0+Y2ZnLmJ3LT5pbnRlcm5hbDsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA4LCAgKHUxNikgKCh2YWx1ZSA+PiAxNikgJiAweGZmZmYpKTsgLy8gbG9jazEgd2FpdCB0aW1lCisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgOSwgICh1MTYpICAodmFsdWUgICAgICAgICYgMHhmZmZmKSk7IC8vIGxvY2sxIHdhaXQgdGltZQorCXZhbHVlID0gNTAwICogc3RhdGUtPmNmZy5idy0+aW50ZXJuYWw7CisJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTAsICh1MTYpICgodmFsdWUgPj4gMTYpICYgMHhmZmZmKSk7IC8vIGxvY2syIHdhaXQgdGltZQorCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDExLCAodTE2KSAgKHZhbHVlICAgICAgICAmIDB4ZmZmZikpOyAvLyBsb2NrMiB3YWl0IHRpbWUKKworCXZhbHVlID0gZGliNzAwMHBfcmVhZF93b3JkKHN0YXRlLCAwKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAwLCAoMSA8PCA5KSB8IHZhbHVlKTsKKwlkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDEyODQpOworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDAsICh1MTYpIHZhbHVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpYjcwMDBwX2F1dG9zZWFyY2hfaXNfaXJxKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kKQoreworCXN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUgPSBkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MTYgaXJxX3BlbmRpbmcgPSBkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDEyODQpOworCisJaWYgKGlycV9wZW5kaW5nICYgMHgxKSAvLyBmYWlsZWQKKwkJcmV0dXJuIDE7CisKKwlpZiAoaXJxX3BlbmRpbmcgJiAweDIpIC8vIHN1Y2NlZWRlZAorCQlyZXR1cm4gMjsKKworCXJldHVybiAwOyAvLyBzdGlsbCBwZW5kaW5nCit9CisKK3N0YXRpYyBpbnQgZGliNzAwMHBfdHVuZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkZW1vZCwgc3RydWN0IGRpYngwMDBfb2ZkbV9jaGFubmVsICpjaCkKK3sKKwlzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlID0gZGVtb2QtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTE2IHRtcCA9IDA7CisKKwlpZiAoY2ggIT0gTlVMTCkKKwkJZGliNzAwMHBfc2V0X2NoYW5uZWwoc3RhdGUsIGNoLCAwKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gcmVzdGFydCBkZW1vZAorCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDc3MCwgMHg0MDAwKTsKKwlkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA3NzAsIDB4MDAwMCk7CisJbXNsZWVwKDQ1KTsKKworCS8qIFBfY3RybF9pbmhfY29yPTAsIFBfY3RybF9hbHBoYV9jb3I9NCwgUF9jdHJsX2luaF9pc2k9MCwgUF9jdHJsX2FscGhhX2lzaT0zLCBQX2N0cmxfaW5oX2NvcjQ9MSwgUF9jdHJsX2FscGhhX2NvcjQ9MyAqLworCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDI5LCAoMCA8PCAxNCkgfCAoNCA8PCAxMCkgfCAoMCA8PCA5KSB8ICgzIDw8IDUpIHwgKDEgPDwgNCkgfCAoMHgzKSk7CisKKwkvLyBuZXZlciBhY2hpZXZlZCBhIGxvY2sgd2l0aCB0aGF0IGJhbmR3aWR0aCBzbyBmYXIgLSB3YWl0IGZvciBvc2MtZnJlcSB0byB1cGRhdGUKKwlpZiAoc3RhdGUtPnRpbWYgPT0gMCkKKwkJbXNsZWVwKDIwMCk7CisKKwkvKiBvZmZzZXQgbG9vcCBwYXJhbWV0ZXJzICovCisKKwkvKiBQX3RpbWZfYWxwaGEsIFBfY29ybV9hbHBoYT02LCBQX2Nvcm1fdGhyZXM9MHg4MCAqLworCXRtcCA9ICg2IDw8IDgpIHwgMHg4MDsKKwlzd2l0Y2ggKGNoLT5uZmZ0KSB7CisJCWNhc2UgMDogdG1wIHw9ICg3IDw8IDEyKTsgYnJlYWs7CisJCWNhc2UgMTogdG1wIHw9ICg5IDw8IDEyKTsgYnJlYWs7CisJCWNhc2UgMjogdG1wIHw9ICg4IDw8IDEyKTsgYnJlYWs7CisJfQorCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDI2LCB0bXApOyAgLyogdGltZl9hKDZ4eHgpICovCisKKwkvKiBQX2N0cmxfZnJlZXplX3BoYV9zaGlmdD0wLCBQX2N0cmxfcGhhX29mZl9tYXggKi8KKwl0bXAgPSAoMCA8PCA0KTsKKwlzd2l0Y2ggKGNoLT5uZmZ0KSB7CisJCWNhc2UgMDogdG1wIHw9IDB4NjsgYnJlYWs7CisJCWNhc2UgMTogdG1wIHw9IDB4ODsgYnJlYWs7CisJCWNhc2UgMjogdG1wIHw9IDB4NzsgYnJlYWs7CisJfQorCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDMyLCAgdG1wKTsKKworCS8qIFBfY3RybF9zZnJlcV9pbmg9MCwgUF9jdHJsX3NmcmVxX3N0ZXAgKi8KKwl0bXAgPSAoMCA8PCA0KTsKKwlzd2l0Y2ggKGNoLT5uZmZ0KSB7CisJCWNhc2UgMDogdG1wIHw9IDB4NjsgYnJlYWs7CisJCWNhc2UgMTogdG1wIHw9IDB4ODsgYnJlYWs7CisJCWNhc2UgMjogdG1wIHw9IDB4NzsgYnJlYWs7CisJfQorCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDMzLCAgdG1wKTsKKworCXRtcCA9IGRpYjcwMDBwX3JlYWRfd29yZChzdGF0ZSw1MDkpOworCWlmICghKCh0bXAgPj4gNikgJiAweDEpKSB7CisJCS8qIHJlc3RhcnQgdGhlIGZlYyAqLworCQl0bXAgPSBkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsNzcxKTsKKwkJZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgNzcxLCB0bXAgfCAoMSA8PCAxKSk7CisJCWRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDc3MSwgdG1wKTsKKwkJbXNsZWVwKDEwKTsKKwkJdG1wID0gZGliNzAwMHBfcmVhZF93b3JkKHN0YXRlLDUwOSk7CisJfQorCisJLy8gd2UgYWNoaWV2ZWQgYSBsb2NrIC0gaXQncyB0aW1lIHRvIHVwZGF0ZSB0aGUgb3NjIGZyZXEKKwlpZiAoKHRtcCA+PiA2KSAmIDB4MSkKKwkJZGliNzAwMHBfdXBkYXRlX3RpbWZfZnJlcShzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kKQoreworCXN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgKmFnYzsKKwlzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlID0gZGVtb2QtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldCA9IDA7CisKKwkvLyBEZW1vZHVsYXRvciBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKwlhZ2MgPSBzdGF0ZS0+Y2ZnLmFnYzsKKworCWRpYjcwMDBwX3NldF9wb3dlcl9tb2RlKHN0YXRlLCBESUI3MDAwUF9QT1dFUl9BTEwpOworCWRpYjcwMDBwX3NldF9hZGNfc3RhdGUoc3RhdGUsIERJQlgwMDBfU0xPV19BRENfT04pOworCisJLyogQUdDICovCisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDc1ICwgIGFnYy0+c2V0dXAgKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgNzYgLCAgYWdjLT5pbnZfZ2FpbiApOworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA3NyAsICBhZ2MtPnRpbWVfc3RhYmlsaXogKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTAwLCAoYWdjLT5hbHBoYV9sZXZlbCA8PCAxMikgfCBhZ2MtPnRobG9jayk7CisKKwkvLyBEZW1vZCBBR0MgbG9vcCBjb25maWd1cmF0aW9uCisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDEwMSwgKGFnYy0+YWxwaGFfbWFudCA8PCA1KSB8IGFnYy0+YWxwaGFfZXhwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTAyLCAoYWdjLT5iZXRhX21hbnQgPDwgNikgIHwgYWdjLT5iZXRhX2V4cCk7CisKKwkvKiBBR0MgY29udGludWVkICovCisJZHByaW50aygiLUQtICBXQkQ6IHJlZjogJWQsIHNlbDogJWQsIGFjdGl2ZTogJWQsIGFscGhhOiAlZFxuIiwKKwkJc3RhdGUtPndiZF9yZWYgIT0gMCA/IHN0YXRlLT53YmRfcmVmIDogYWdjLT53YmRfcmVmLCBhZ2MtPndiZF9zZWwsICFhZ2MtPnBlcmZvcm1fYWdjX3NvZnRzcGxpdCwgYWdjLT53YmRfc2VsKTsKKworCWlmIChzdGF0ZS0+d2JkX3JlZiAhPSAwKQorCQlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTA1LCAoYWdjLT53YmRfaW52IDw8IDEyKSB8IHN0YXRlLT53YmRfcmVmKTsKKwllbHNlCisJCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxMDUsIChhZ2MtPndiZF9pbnYgPDwgMTIpIHwgYWdjLT53YmRfcmVmKTsKKworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxMDYsIChhZ2MtPndiZF9zZWwgPDwgMTMpIHwgKGFnYy0+d2JkX2FscGhhIDw8IDkpIHwgKGFnYy0+cGVyZm9ybV9hZ2Nfc29mdHNwbGl0IDw8IDgpICk7CisKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTA3LCAgYWdjLT5hZ2MxX21heCk7CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDEwOCwgIGFnYy0+YWdjMV9taW4pOworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxMDksICBhZ2MtPmFnYzJfbWF4KTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTEwLCAgYWdjLT5hZ2MyX21pbik7CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDExMSwgKGFnYy0+YWdjMV9wdDEgPDwgOCkgfCBhZ2MtPmFnYzFfcHQyICk7CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDExMiwgIGFnYy0+YWdjMV9wdDMpOworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxMTMsIChhZ2MtPmFnYzFfc2xvcGUxIDw8IDgpIHwgYWdjLT5hZ2MxX3Nsb3BlMik7CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDExNCwgKGFnYy0+YWdjMl9wdDEgPDwgOCkgfCBhZ2MtPmFnYzJfcHQyKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTE1LCAoYWdjLT5hZ2MyX3Nsb3BlMSA8PCA4KSB8IGFnYy0+YWdjMl9zbG9wZTIpOworCisJLyogZGlzYWJsZSBwb3dlciBzbW9vdGhpbmcgKi8KKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTQ1LCAwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTQ2LCAwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTQ3LCAwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTQ4LCAwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTQ5LCAwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTUwLCAwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTUxLCAwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTUyLCAwKTsKKworCS8vIFBfdGltZl9hbHBoYT02LCBQX2Nvcm1fYWxwaGE9NiwgUF9jb3JtX3RocmVzPTEyOCBkZWZhdWx0OiA2LDQsMjYKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMjYgLDB4NjY4MCk7CisKKwkvLyBQX3BhbGZfZmlsdGVyX29uPTEsIFBfcGFsZl9maWx0ZXJfZnJlZXplPTAsIFBfcGFsZl9hbHBoYV9yZWd1bD0xNgorCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxNDIsMHgwNDEwKTsKKwkvLyBQX2ZmdF9mcmVxX2Rpcj0xLCBQX2ZmdF9uYl90b19jdXQ9MAorCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxNTQsMSA8PCAxMyk7CisJLy8gUF9waGEzX3RocmVzLCBkZWZhdWx0IDB4MzAwMAorCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxNjgsMHgwY2NkKTsKKwkvLyBQX2N0aV91c2VfY3BlPTAsIFBfY3RpX3VzZV9wcm9nPTAsIFBfY3RpX3dpbl9sZW49MTYsIGRlZmF1bHQ6IDB4MDAxMAorCS8vcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDE2OSwweDAwMTApOworCS8vIFBfY3NwdV9yZWd1bD01MTIsIFBfY3NwdV93aW5fY3V0PTE1LCBkZWZhdWx0OiAweDIwMDUKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTgzLDB4MjAwZik7CisJLy8gUF9hZHBfcmVndWxfY250PTU3MywgZGVmYXVsdDogNDEwCisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDE4NywweDAyM2QpOworCS8vIFBfYWRwX25vaXNlX2NudD0KKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTg4LDB4MDBhNCk7CisJLy8gUF9hZHBfcmVndWxfZXh0CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDE4OSwweDAwYTQpOworCS8vIFBfYWRwX25vaXNlX2V4dAorCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxOTAsMHg3ZmYwKTsKKwkvLyBQX2FkcF9maWwKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTkxLDB4M2NjYyk7CisKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMjIyLDB4MDAxMCk7CisJLy8gUF9zbW9fbW9kZSwgUF9zbW9fcnNfZGlzY2FyZCwgUF9zbW9fZmlmb19mbHVzaCwgUF9zbW9fcGlkX3BhcnNlLCBQX3Ntb19lcnJvcl9kaXNjYXJkCisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDIzNSwweDAwNjIpOworCisJLy8gUF9pcWNfYWxwaGFfcGhhLCBQX2lxY19hbHBoYV9hbXBfZGNjX2FscGhhLCAuLi4KKwlpZihzdGF0ZS0+Y2ZnLnR1bmVyX2lzX2Jhc2ViYW5kKQorCQlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMzYsMHgwNzU1KTsKKwllbHNlCisJCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAzNiwweDFmNTUpOworCisJLy8gYXV0byBzZWFyY2ggY29uZmlndXJhdGlvbgorCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAyICAsMHgwMDA0KTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMyAgLDB4MTAwMCk7CisKKwkvKiBFcXVhbCBMb2NrICovCisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDQgICAsMHgwODE0KTsKKworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA2ICAsMHgwMDFiKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgNyAgLDB4Nzc0MCk7CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDggICwweDAwNWIpOworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA5ICAsMHg4ZDgwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTAgLDB4MDFjOSk7CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDExICwweGMzODApOworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxMiAsMHgwMDAwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTMgLDB4MDA4MCk7CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDE0ICwweDAwMDApOworCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCAxNSAsMHgwMDkwKTsKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgMTYgLDB4MDAwMSk7CisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDE3ICwweGQ0YzApOworCisJLy8gUF9jbGtfY2ZnMQorCXJldCB8PSBkaWI3MDAwcF93cml0ZV93b3JkKHN0YXRlLCA5MDEsIDB4MDAwNik7CisKKwkvLyBQX2RpdmNsa3NlbD0zIFBfZGl2Yml0c2VsPTEKKwlyZXQgfD0gZGliNzAwMHBfd3JpdGVfd29yZChzdGF0ZSwgOTAyLCAoMyA8PCAxMCkgfCAoMSA8PCA2KSk7CisKKwkvLyBUdW5lciBJTyBiYW5rOiBtYXggZHJpdmUgKDE0bUEpICsgZGl2b3V0IHBhZHMgbWF4IGRyaXZlCisJcmV0IHw9IGRpYjcwMDBwX3dyaXRlX3dvcmQoc3RhdGUsIDkwNSwgMHgyYzhlKTsKKworCXJldCB8PSBkaWI3MDAwcF9zZXRfYmFuZHdpZHRoKCZzdGF0ZS0+ZGVtb2QsIEJBTkRXSURUSF84X01IWik7CisJZGliNzAwMHBfc2FkX2NhbGliKHN0YXRlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMHBfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZGVtb2QpCit7CisJc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSA9IGRlbW9kLT5kZW1vZHVsYXRvcl9wcml2OworCXJldHVybiBkaWI3MDAwcF9zZXRfb3V0cHV0X21vZGUoc3RhdGUsIE9VVE1PREVfSElHSF9aKSB8IGRpYjcwMDBwX3NldF9wb3dlcl9tb2RlKHN0YXRlLCBESUI3MDAwUF9QT1dFUl9JTlRFUkZBQ0VfT05MWSk7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMHBfaWRlbnRpZnkoc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdCkKK3sKKwl1MTYgdmFsdWU7CisJZHByaW50aygiLUktICBEaUI3MDAwUEM6IGNoZWNraW5nIGRlbW9kIG9uIEkyQyBhZGRyZXNzOiAlZCAoJXgpXG4iLAorCQlzdC0+aTJjX2FkZHIsIHN0LT5pMmNfYWRkcik7CisKKwlpZiAoKHZhbHVlID0gZGliNzAwMHBfcmVhZF93b3JkKHN0LCA3NjgpKSAhPSAweDAxYjMpIHsKKwkJZHByaW50aygiLUUtICBEaUI3MDAwUEM6IHdyb25nIFZlbmRvciBJRCAocmVhZD0weCV4KVxuIix2YWx1ZSk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCWlmICgodmFsdWUgPSBkaWI3MDAwcF9yZWFkX3dvcmQoc3QsIDc2OSkpICE9IDB4NDAwMCkgeworCQlkcHJpbnRrKCItRS0gIERpQjcwMDBQQzogd3JvbmcgRGV2aWNlIElEICgleClcbiIsdmFsdWUpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGRpYjcwMDBwX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTE2IHRwcyA9IGRpYjcwMDBwX3JlYWRfd29yZChzdGF0ZSw0NjMpOworCisJZmVwLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fQVVUTzsKKworCWZlcC0+dS5vZmRtLmJhbmR3aWR0aCA9IHN0YXRlLT5jdXJyZW50X2JhbmR3aWR0aDsKKworCXN3aXRjaCAoKHRwcyA+PiA4KSAmIDB4MykgeworCQljYXNlIDA6IGZlcC0+dS5vZmRtLnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfMks7IGJyZWFrOworCQljYXNlIDE6IGZlcC0+dS5vZmRtLnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfOEs7IGJyZWFrOworCQkvKiBjYXNlIDI6IGZlcC0+dS5vZmRtLnRyYW5zbWlzc2lvbl9tb2RlID0gVFJBTlNNSVNTSU9OX01PREVfNEs7IGJyZWFrOyAqLworCX0KKworCXN3aXRjaCAodHBzICYgMHgzKSB7CisJCWNhc2UgMDogZmVwLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWwgPSBHVUFSRF9JTlRFUlZBTF8xXzMyOyBicmVhazsKKwkJY2FzZSAxOiBmZXAtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVEVSVkFMXzFfMTY7IGJyZWFrOworCQljYXNlIDI6IGZlcC0+dS5vZmRtLmd1YXJkX2ludGVydmFsID0gR1VBUkRfSU5URVJWQUxfMV84OyBicmVhazsKKwkJY2FzZSAzOiBmZXAtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCA9IEdVQVJEX0lOVEVSVkFMXzFfNDsgYnJlYWs7CisJfQorCisJc3dpdGNoICgodHBzID4+IDE0KSAmIDB4MykgeworCQljYXNlIDA6IGZlcC0+dS5vZmRtLmNvbnN0ZWxsYXRpb24gPSBRUFNLOyBicmVhazsKKwkJY2FzZSAxOiBmZXAtPnUub2ZkbS5jb25zdGVsbGF0aW9uID0gUUFNXzE2OyBicmVhazsKKwkJY2FzZSAyOgorCQlkZWZhdWx0OiBmZXAtPnUub2ZkbS5jb25zdGVsbGF0aW9uID0gUUFNXzY0OyBicmVhazsKKwl9CisKKwkvKiBhcyBsb25nIGFzIHRoZSBmcm9udGVuZF9wYXJhbSBzdHJ1Y3R1cmUgaXMgZml4ZWQgZm9yIGhpZXJhcmNoaWNhbCB0cmFuc21pc3Npb24gSSByZWZ1c2UgdG8gdXNlIGl0ICovCisJLyogKHRwcyA+PiAxMykgJiAweDEgPT0gaHJjaCBpcyB1c2VkLCAodHBzID4+IDEwKSAmIDB4NyA9PSBhbHBoYSAqLworCisJZmVwLT51Lm9mZG0uaGllcmFyY2h5X2luZm9ybWF0aW9uID0gSElFUkFSQ0hZX05PTkU7CisJc3dpdGNoICgodHBzID4+IDUpICYgMHg3KSB7CisJCWNhc2UgMTogZmVwLT51Lm9mZG0uY29kZV9yYXRlX0hQID0gRkVDXzFfMjsgYnJlYWs7CisJCWNhc2UgMjogZmVwLT51Lm9mZG0uY29kZV9yYXRlX0hQID0gRkVDXzJfMzsgYnJlYWs7CisJCWNhc2UgMzogZmVwLT51Lm9mZG0uY29kZV9yYXRlX0hQID0gRkVDXzNfNDsgYnJlYWs7CisJCWNhc2UgNTogZmVwLT51Lm9mZG0uY29kZV9yYXRlX0hQID0gRkVDXzVfNjsgYnJlYWs7CisJCWNhc2UgNzoKKwkJZGVmYXVsdDogZmVwLT51Lm9mZG0uY29kZV9yYXRlX0hQID0gRkVDXzdfODsgYnJlYWs7CisKKwl9CisKKwlzd2l0Y2ggKCh0cHMgPj4gMikgJiAweDcpIHsKKwkJY2FzZSAxOiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfMV8yOyBicmVhazsKKwkJY2FzZSAyOiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfMl8zOyBicmVhazsKKwkJY2FzZSAzOiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfM180OyBicmVhazsKKwkJY2FzZSA1OiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfNV82OyBicmVhazsKKwkJY2FzZSA3OgorCQlkZWZhdWx0OiBmZXAtPnUub2ZkbS5jb2RlX3JhdGVfTFAgPSBGRUNfN184OyBicmVhazsKKwl9CisKKwkvKiBuYXRpdmUgaW50ZXJsZWF2ZXI6IChkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDQ2NCkgPj4gIDUpICYgMHgxICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCit7CisJc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXN0cnVjdCBkaWJ4MDAwX29mZG1fY2hhbm5lbCBjaDsKKworCUlOSVRfT0ZETV9DSEFOTkVMKCZjaCk7CisJRkVQMkRJQihmZXAsJmNoKTsKKworCXN0YXRlLT5jdXJyZW50X2JhbmR3aWR0aCA9IGZlcC0+dS5vZmRtLmJhbmR3aWR0aDsKKwlkaWI3MDAwcF9zZXRfYmFuZHdpZHRoKGZlLCBmZXAtPnUub2ZkbS5iYW5kd2lkdGgpOworCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpCisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIGZlcCk7CisKKwlpZiAoZmVwLT51Lm9mZG0udHJhbnNtaXNzaW9uX21vZGUgPT0gVFJBTlNNSVNTSU9OX01PREVfQVVUTyB8fAorCQlmZXAtPnUub2ZkbS5ndWFyZF9pbnRlcnZhbCAgICA9PSBHVUFSRF9JTlRFUlZBTF9BVVRPIHx8CisJCWZlcC0+dS5vZmRtLmNvbnN0ZWxsYXRpb24gICAgID09IFFBTV9BVVRPIHx8CisJCWZlcC0+dS5vZmRtLmNvZGVfcmF0ZV9IUCAgICAgID09IEZFQ19BVVRPKSB7CisJCWludCBpID0gODAwLCBmb3VuZDsKKworCQlkaWI3MDAwcF9hdXRvc2VhcmNoX3N0YXJ0KGZlLCAmY2gpOworCQlkbyB7CisJCQltc2xlZXAoMSk7CisJCQlmb3VuZCA9IGRpYjcwMDBwX2F1dG9zZWFyY2hfaXNfaXJxKGZlKTsKKwkJfSB3aGlsZSAoZm91bmQgPT0gMCAmJiBpLS0pOworCisJCWRwcmludGsoImF1dG9zZWFyY2ggcmV0dXJuczogJWRcbiIsZm91bmQpOworCQlpZiAoZm91bmQgPT0gMCB8fCBmb3VuZCA9PSAxKQorCQkJcmV0dXJuIDA7IC8vIG5vIGNoYW5uZWwgZm91bmQKKworCQlkaWI3MDAwcF9nZXRfZnJvbnRlbmQoZmUsIGZlcCk7CisJCUZFUDJESUIoZmVwLCAmY2gpOworCX0KKworCS8qIG1ha2UgdGhpcyBhIGNvbmZpZyBwYXJhbWV0ZXIgKi8KKwlkaWI3MDAwcF9zZXRfb3V0cHV0X21vZGUoc3RhdGUsIE9VVE1PREVfTVBFRzJfRklGTyk7CisKKwlyZXR1cm4gZGliNzAwMHBfdHVuZShmZSwgJmNoKTsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXQpCit7CisJc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUxNiBsb2NrID0gZGliNzAwMHBfcmVhZF93b3JkKHN0YXRlLCA1MDkpOworCisJKnN0YXQgPSAwOworCisJaWYgKGxvY2sgJiAweDgwMDApCisJCSpzdGF0IHw9IEZFX0hBU19TSUdOQUw7CisJaWYgKGxvY2sgJiAweDMwMDApCisJCSpzdGF0IHw9IEZFX0hBU19DQVJSSUVSOworCWlmIChsb2NrICYgMHgwMTAwKQorCQkqc3RhdCB8PSBGRV9IQVNfVklURVJCSTsKKwlpZiAobG9jayAmIDB4MDAxMCkKKwkJKnN0YXQgfD0gRkVfSEFTX1NZTkM7CisJaWYgKGxvY2sgJiAweDAwMDgpCisJCSpzdGF0IHw9IEZFX0hBU19MT0NLOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMHBfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCXN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwkqYmVyID0gKGRpYjcwMDBwX3JlYWRfd29yZChzdGF0ZSwgNTAwKSA8PCAxNikgfCBkaWI3MDAwcF9yZWFkX3dvcmQoc3RhdGUsIDUwMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGliNzAwMHBfcmVhZF91bmNfYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnVuYykKK3sKKwlzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJKnVuYyA9IGRpYjcwMDBwX3JlYWRfd29yZChzdGF0ZSwgNTA2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTE2IHZhbCA9IGRpYjcwMDBwX3JlYWRfd29yZChzdGF0ZSwgMzk0KTsKKwkqc3RyZW5ndGggPSA2NTUzNSAtIHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzbnIpCit7CisJKnNuciA9IDB4MDAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWI3MDAwcF9mZV9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICp0dW5lKQoreworCXR1bmUtPm1pbl9kZWxheV9tcyA9IDEwMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpYjcwMDBwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZGVtb2QpCit7CisJc3RydWN0IGRpYjcwMDBwX3N0YXRlICpzdCA9IGRlbW9kLT5kZW1vZHVsYXRvcl9wcml2OworCWRpYngwMDBfZXhpdF9pMmNfbWFzdGVyKCZzdC0+aTJjX21hc3Rlcik7CisJa2ZyZWUoc3QpOworfQorCitpbnQgZGliNzAwMHBjX2RldGVjdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwKQoreworCXU4IHR4WzJdLCByeFsyXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7CisJCXsgLmFkZHIgPSAxOCA+PiAxLCAuZmxhZ3MgPSAwLCAgICAgICAgLmJ1ZiA9IHR4LCAubGVuID0gMiB9LAorCQl7IC5hZGRyID0gMTggPj4gMSwgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSByeCwgLmxlbiA9IDIgfSwKKwl9OworCisJdHhbMF0gPSAweDAzOworCXR4WzFdID0gMHgwMDsKKworCWlmIChpMmNfdHJhbnNmZXIoaTJjX2FkYXAsIG1zZywgMikgPT0gMikKKwkJaWYgKHJ4WzBdID09IDB4MDEgJiYgcnhbMV0gPT0gMHhiMykgeworCQkJZHByaW50aygiLUQtICBEaUI3MDAwUEMgZGV0ZWN0ZWRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCW1zZ1swXS5hZGRyID0gbXNnWzFdLmFkZHIgPSAweDQwOworCisJaWYgKGkyY190cmFuc2ZlcihpMmNfYWRhcCwgbXNnLCAyKSA9PSAyKQorCQlpZiAocnhbMF0gPT0gMHgwMSAmJiByeFsxXSA9PSAweGIzKSB7CisJCQlkcHJpbnRrKCItRC0gIERpQjcwMDBQQyBkZXRlY3RlZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJZHByaW50aygiLUQtICBEaUI3MDAwUEMgbm90IGRldGVjdGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZGliNzAwMHBjX2RldGVjdGlvbik7CisKK3N0cnVjdCBpMmNfYWRhcHRlciAqIGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRlbW9kLCBlbnVtIGRpYngwMDBfaTJjX2ludGVyZmFjZSBpbnRmLCBpbnQgZ2F0aW5nKQoreworCXN0cnVjdCBkaWI3MDAwcF9zdGF0ZSAqc3QgPSBkZW1vZC0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlyZXR1cm4gZGlieDAwMF9nZXRfaTJjX2FkYXB0ZXIoJnN0LT5pMmNfbWFzdGVyLCBpbnRmLCBnYXRpbmcpOworfQorRVhQT1JUX1NZTUJPTChkaWI3MDAwcF9nZXRfaTJjX21hc3Rlcik7CisKK2ludCBkaWI3MDAwcF9pMmNfZW51bWVyYXRpb24oc3RydWN0IGkyY19hZGFwdGVyICppMmMsIGludCBub19vZl9kZW1vZHMsIHU4IGRlZmF1bHRfYWRkciwgc3RydWN0IGRpYjcwMDBwX2NvbmZpZyBjZmdbXSkKK3sKKwlzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgc3QgPSB7IC5pMmNfYWRhcCA9IGkyYyB9OworCWludCBrID0gMDsKKwl1OCBuZXdfYWRkciA9IDA7CisKKwlmb3IgKGsgPSBub19vZl9kZW1vZHMtMTsgayA+PSAwOyBrLS0pIHsKKwkJc3QuY2ZnID0gY2ZnW2tdOworCisJCS8qIGRlc2lnbmF0ZWQgaTJjIGFkZHJlc3MgKi8KKwkJbmV3X2FkZHIgICAgICAgICAgPSAoMHg0MCArIGspIDw8IDE7CisJCXN0LmkyY19hZGRyID0gbmV3X2FkZHI7CisJCWlmIChkaWI3MDAwcF9pZGVudGlmeSgmc3QpICE9IDApIHsKKwkJCXN0LmkyY19hZGRyID0gZGVmYXVsdF9hZGRyOworCQkJaWYgKGRpYjcwMDBwX2lkZW50aWZ5KCZzdCkgIT0gMCkgeworCQkJCWRwcmludGsoIkRpQjcwMDBQICMlZDogbm90IGlkZW50aWZpZWRcbiIsIGspOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisKKwkJLyogc3RhcnQgZGl2ZXJzaXR5IHRvIHB1bGxfZG93biBkaXZfc3RyIC0ganVzdCBmb3IgaTJjLWVudW1lcmF0aW9uICovCisJCWRpYjcwMDBwX3NldF9vdXRwdXRfbW9kZSgmc3QsIE9VVE1PREVfRElWRVJTSVRZKTsKKworCQkvKiBzZXQgbmV3IGkyYyBhZGRyZXNzIGFuZCBmb3JjZSBkaXZzdGFydCAqLworCQlkaWI3MDAwcF93cml0ZV93b3JkKCZzdCwgMTI4NSwgKG5ld19hZGRyIDw8IDIpIHwgMHgyKTsKKworCQlkcHJpbnRrKCJJQyAlZCBpbml0aWFsaXplZCAodG8gaTJjX2FkZHJlc3MgMHgleClcbiIsIGssIG5ld19hZGRyKTsKKwl9CisKKwlmb3IgKGsgPSAwOyBrIDwgbm9fb2ZfZGVtb2RzOyBrKyspIHsKKwkJc3QuY2ZnID0gY2ZnW2tdOworCQlzdC5pMmNfYWRkciA9ICgweDQwICsgaykgPDwgMTsKKworCQkvLyB1bmZvcmNlIGRpdnN0cgorCQlkaWI3MDAwcF93cml0ZV93b3JkKCZzdCwgMTI4NSwgc3QuaTJjX2FkZHIgPDwgMik7CisKKwkJLyogZGVhY3RpdmF0ZSBkaXYgLSBpdCB3YXMganVzdCBmb3IgaTJjLWVudW1lcmF0aW9uICovCisJCWRpYjcwMDBwX3NldF9vdXRwdXRfbW9kZSgmc3QsIE9VVE1PREVfSElHSF9aKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZGliNzAwMHBfaTJjX2VudW1lcmF0aW9uKTsKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRpYjcwMDBwX29wczsKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKiBkaWI3MDAwcF9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgdTggaTJjX2FkZHIsIHN0cnVjdCBkaWI3MDAwcF9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkZW1vZDsKKwlzdHJ1Y3QgZGliNzAwMHBfc3RhdGUgKnN0OworCXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRpYjcwMDBwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtY3B5KCZzdC0+Y2ZnLCBjZmcsIHNpemVvZihzdHJ1Y3QgZGliNzAwMHBfY29uZmlnKSk7CisJc3QtPmkyY19hZGFwID0gaTJjX2FkYXA7CisJc3QtPmkyY19hZGRyID0gaTJjX2FkZHI7CisJc3QtPmdwaW9fdmFsID0gY2ZnLT5ncGlvX3ZhbDsKKwlzdC0+Z3Bpb19kaXIgPSBjZmctPmdwaW9fZGlyOworCisJZGVtb2QgICAgICAgICAgICAgICAgICAgPSAmc3QtPmRlbW9kOworCWRlbW9kLT5kZW1vZHVsYXRvcl9wcml2ID0gc3Q7CisJbWVtY3B5KCZzdC0+ZGVtb2Qub3BzLCAmZGliNzAwMHBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKworCWlmIChkaWI3MDAwcF9pZGVudGlmeShzdCkgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKCZzdC0+aTJjX21hc3RlciwgRElCNzAwMFAsIHN0LT5pMmNfYWRhcCwgc3QtPmkyY19hZGRyKTsKKworCWRpYjcwMDBwX2RlbW9kX3Jlc2V0KHN0KTsKKworCXJldHVybiBkZW1vZDsKKworZXJyb3I6CisJa2ZyZWUoc3QpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkaWI3MDAwcF9hdHRhY2gpOworCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZGliNzAwMHBfb3BzID0geworCS5pbmZvID0geworCQkubmFtZSA9ICJEaUJjb20gNzAwMFBDIiwKKwkJLnR5cGUgPSBGRV9PRkRNLAorCQkuZnJlcXVlbmN5X21pbiAgICAgID0gNDQyNTAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ICAgICAgPSA4NjcyNTAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUgPSA2MjUwMCwKKwkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfAorCQkJRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8IEZFX0NBTl9RQU1fQVVUTyB8CisJCQlGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTyB8CisJCQlGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8CisJCQlGRV9DQU5fUkVDT1ZFUiB8CisJCQlGRV9DQU5fSElFUkFSQ0hZX0FVVE8sCisJfSwKKworCS5yZWxlYXNlICAgICAgICAgICAgICA9IGRpYjcwMDBwX3JlbGVhc2UsCisKKwkuaW5pdCAgICAgICAgICAgICAgICAgPSBkaWI3MDAwcF9pbml0LAorCS5zbGVlcCAgICAgICAgICAgICAgICA9IGRpYjcwMDBwX3NsZWVwLAorCisJLnNldF9mcm9udGVuZCAgICAgICAgID0gZGliNzAwMHBfc2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyAgICA9IGRpYjcwMDBwX2ZlX2dldF90dW5lX3NldHRpbmdzLAorCS5nZXRfZnJvbnRlbmQgICAgICAgICA9IGRpYjcwMDBwX2dldF9mcm9udGVuZCwKKworCS5yZWFkX3N0YXR1cyAgICAgICAgICA9IGRpYjcwMDBwX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciAgICAgICAgICAgICA9IGRpYjcwMDBwX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGRpYjcwMDBwX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciAgICAgICAgICAgICA9IGRpYjcwMDBwX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzICAgICAgICA9IGRpYjcwMDBwX3JlYWRfdW5jX2Jsb2NrcywKK307CisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYm9ldHRjaGVyQGRpYmNvbS5mcj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciB0aGUgRGlCY29tIDcwMDBQQyBDT0ZETSBkZW1vZHVsYXRvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQ2NWNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBESUI3MDAwUF9ICisjZGVmaW5lIERJQjcwMDBQX0gKKworI2luY2x1ZGUgImRpYngwMDBfY29tbW9uLmgiCisKK3N0cnVjdCBkaWI3MDAwcF9jb25maWcgeworCXU4IG91dHB1dF9tcGVnMl9pbl8xODhfYnl0ZXM7CisJdTggaG9zdGJ1c19kaXZlcnNpdHk7CisJdTggdHVuZXJfaXNfYmFzZWJhbmQ7CisJaW50ICgqdXBkYXRlX2xuYSkgKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgdTE2IGFnY19nbG9iYWwpOworCisJc3RydWN0IGRpYngwMDBfYWdjX2NvbmZpZyAqYWdjOworCXN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgKmJ3OworCisjZGVmaW5lIERJQjcwMDBQX0dQSU9fREVGQVVMVF9ESVJFQ1RJT05TIDB4ZmZmZgorCXUxNiBncGlvX2RpcjsKKyNkZWZpbmUgRElCNzAwMFBfR1BJT19ERUZBVUxUX1ZBTFVFUyAgICAgMHgwMDAwCisJdTE2IGdwaW9fdmFsOworI2RlZmluZSBESUI3MDAwUF9HUElPX1BXTV9QT1MwKHYpICAgICAgICAoKHYgJiAweGYpIDw8IDEyKQorI2RlZmluZSBESUI3MDAwUF9HUElPX1BXTV9QT1MxKHYpICAgICAgICAoKHYgJiAweGYpIDw8IDggKQorI2RlZmluZSBESUI3MDAwUF9HUElPX1BXTV9QT1MyKHYpICAgICAgICAoKHYgJiAweGYpIDw8IDQgKQorI2RlZmluZSBESUI3MDAwUF9HUElPX1BXTV9QT1MzKHYpICAgICAgICAgKHYgJiAweGYpCisjZGVmaW5lIERJQjcwMDBQX0dQSU9fREVGQVVMVF9QV01fUE9TICAgIDB4ZmZmZgorCXUxNiBncGlvX3B3bV9wb3M7CisKKwl1MTYgcHdtX2ZyZXFfZGl2OworCisJdTggcXVhcnR6X2RpcmVjdDsKKworCWludCAoKmFnY19jb250cm9sKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCB1OCBiZWZvcmUpOworfTsKKworI2RlZmluZSBERUZBVUxUX0RJQjcwMDBQX0kyQ19BRERSRVNTIDE4CisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogZGliNzAwMHBfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHU4IGkyY19hZGRyLCBzdHJ1Y3QgZGliNzAwMHBfY29uZmlnICpjZmcpOworZXh0ZXJuIHN0cnVjdCBpMmNfYWRhcHRlciAqIGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgZW51bSBkaWJ4MDAwX2kyY19pbnRlcmZhY2UsIGludCk7CitleHRlcm4gaW50IGRpYjcwMDBwY19kZXRlY3Rpb24oc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCk7CisKKy8qIFRPRE8KK2V4dGVybiBJTlQgZGliNzAwMHBfc2V0X2dwaW8oc3RydWN0IGRpYkRlbW9kICpkZW1vZCwgVUNIQVIgbnVtLCBVQ0hBUiBkaXIsIFVDSEFSIHZhbCk7CitleHRlcm4gSU5UIGRpYjcwMDBwX2VuYWJsZV92Ymdfdm9sdGFnZShzdHJ1Y3QgZGliRGVtb2QgKmRlbW9kKTsKK2V4dGVybiB2b2lkIGRpYjcwMDBwX3NldF9ob3N0YnVzX2RpdmVyc2l0eShzdHJ1Y3QgZGliRGVtb2QgKmRlbW9kLCBVQ0hBUiBvbm9mZik7CitleHRlcm4gVVNIT1JUIGRpYjcwMDBwX2dldF9jdXJyZW50X2FnY19nbG9iYWwoc3RydWN0IGRpYkRlbW9kICpkZW1vZCk7CisqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWJ4MDAwX2NvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKaW5kZXggYmIwYzY1Zi4uYTFkZjYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYngwMDBfY29tbW9uLmgKQEAgLTMyLDYgKzMyLDEzIEBACiAjZGVmaW5lIEJBTkRfTEJBTkQgMHgwMQogI2RlZmluZSBCQU5EX1VIRiAgIDB4MDIKICNkZWZpbmUgQkFORF9WSEYgICAweDA0CisjZGVmaW5lIEJBTkRfU0JBTkQgMHgwOAorI2RlZmluZSBCQU5EX0ZNCSAgIDB4MTAKKworI2RlZmluZSBCQU5EX09GX0ZSRVFVRU5DWShmcmVxX2tIeikgKCAoZnJlcV9rSHopIDw9IDExNTAwMCA/IEJBTkRfRk0gOiBcCisJCQkJCQkJCQkoZnJlcV9rSHopIDw9IDI1MDAwMCA/IEJBTkRfVkhGIDogXAorCQkJCQkJCQkJKGZyZXFfa0h6KSA8PSA4NjMwMDAgPyBCQU5EX1VIRiA6IFwKKwkJCQkJCQkJCShmcmVxX2tIeikgPD0gMjAwMDAwMCA/IEJBTkRfTEJBTkQgOiBCQU5EX1NCQU5EICkKIAogc3RydWN0IGRpYngwMDBfYWdjX2NvbmZpZyB7CiAJLyogZGVmaW5lcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgQUdDLXNldHRpbmcgLSB1c2luZyB0aGUgQkFORF8tZGVmaW5lcyovCkBAIC0xMjksNiArMTM2LDcgQEAKIAogLyogSSBob3BlIEkgY2FuIGdldCByaWQgb2YgdGhlIGZvbGxvd2luZyBrbHVkZ2UgaW4gdGhlIG5lYXIgZnV0dXJlICovCiBzdHJ1Y3QgZGlieDAwMF9vZmRtX2NoYW5uZWwgeworCXUzMiBSRl9rSHo7CiAJdTggIEJ3OwogCXMxNiBuZmZ0OwogCXMxNiBndWFyZDsKQEAgLTEzOCw5ICsxNDYsMTEgQEAKIAlzMTYgdml0X2FscGhhOwogCXMxNiB2aXRfY29kZV9yYXRlX2hwOwogCXMxNiB2aXRfY29kZV9yYXRlX2xwOworCXU4ICBpbnRsdl9uYXRpdmU7CiB9OwogCiAjZGVmaW5lIEZFUDJESUIoZmVwLGNoKSBcCisJKGNoKS0+UkZfa0h6ICAgICAgICAgICA9IChmZXApLT5mcmVxdWVuY3kgLyAxMDAwOyBcCiAJKGNoKS0+QncgICAgICAgICAgICAgICA9IChmZXApLT51Lm9mZG0uYmFuZHdpZHRoOyBcCiAJKGNoKS0+bmZmdCAgICAgICAgICAgICA9IChmZXApLT51Lm9mZG0udHJhbnNtaXNzaW9uX21vZGUgPT0gVFJBTlNNSVNTSU9OX01PREVfQVVUTyA/IC0xIDogKGZlcCktPnUub2ZkbS50cmFuc21pc3Npb25fbW9kZTsgXAogCShjaCktPmd1YXJkICAgICAgICAgICAgPSAoZmVwKS0+dS5vZmRtLmd1YXJkX2ludGVydmFsID09IEdVQVJEX0lOVEVSVkFMX0FVVE8gPyAtMSA6IChmZXApLT51Lm9mZG0uZ3VhcmRfaW50ZXJ2YWw7IFwKQEAgLTE0OSw3ICsxNTksOCBAQAogCShjaCktPnZpdF9zZWxlY3RfaHAgICAgPSAxOyBcCiAJKGNoKS0+dml0X2FscGhhICAgICAgICA9IDE7IFwKIAkoY2gpLT52aXRfY29kZV9yYXRlX2hwID0gKGZlcCktPnUub2ZkbS5jb2RlX3JhdGVfSFAgPT0gRkVDX0FVVE8gPyAtMSA6IChmZXApLT51Lm9mZG0uY29kZV9yYXRlX0hQOyBcCi0JKGNoKS0+dml0X2NvZGVfcmF0ZV9scCA9IChmZXApLT51Lm9mZG0uY29kZV9yYXRlX0xQID09IEZFQ19BVVRPID8gLTEgOiAoZmVwKS0+dS5vZmRtLmNvZGVfcmF0ZV9MUDsKKwkoY2gpLT52aXRfY29kZV9yYXRlX2xwID0gKGZlcCktPnUub2ZkbS5jb2RlX3JhdGVfTFAgPT0gRkVDX0FVVE8gPyAtMSA6IChmZXApLT51Lm9mZG0uY29kZV9yYXRlX0xQOyBcCisJKGNoKS0+aW50bHZfbmF0aXZlICAgICA9IDE7CiAKICNkZWZpbmUgSU5JVF9PRkRNX0NIQU5ORUwoY2gpIGRvIHtcCiAJKGNoKS0+QncgICAgICAgICAgICAgICA9IDA7ICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYwppbmRleCBiN2U3MTA4Li42MmRlNzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKQEAgLTQ3MiwxNCArNDcyLDE0IEBACiAJCXByaW50aygicGxsOiAlczogZGl2PSVkIHwgYnVmPTB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeFxuIiwKIAkJICAgICAgIGRlc2MtPm5hbWUsIGRpdiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsKIAotCXJldHVybiAwOworCS8vIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IHdlIHNldCBpdCB0bworCXJldHVybiAoZGl2ICogZGVzYy0+ZW50cmllc1tpXS5zdGVwc2l6ZSkgLSBkZXNjLT5lbnRyaWVzW2ldLm9mZnNldDsKIH0KIEVYUE9SVF9TWU1CT0woZHZiX3BsbF9jb25maWd1cmUpOwogCiBzdGF0aWMgaW50IGR2Yl9wbGxfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlpZiAoZmUtPnR1bmVyX3ByaXYpCi0JCWtmcmVlKGZlLT50dW5lcl9wcml2KTsKKwlrZnJlZShmZS0+dHVuZXJfcHJpdik7CiAJZmUtPnR1bmVyX3ByaXYgPSBOVUxMOwogCXJldHVybiAwOwogfQpAQCAtNDg5LDcgKzQ4OSw4IEBACiAJc3RydWN0IGR2Yl9wbGxfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OwogCXU4IGJ1Zls0XTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPQotCQl7IC5hZGRyID0gcHJpdi0+cGxsX2kyY19hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKwkJeyAuYWRkciA9IHByaXYtPnBsbF9pMmNfYWRkcmVzcywgLmZsYWdzID0gMCwKKwkJICAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKIAlpbnQgaTsKIAlpbnQgcmVzdWx0OwogCkBAIC01MTcsMTYgKzUxOCwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR2Yl9wbGxfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IGR2Yl9wbGxfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCSAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBkdmJfcGxsX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKIAl1OCBidWZbNF07CiAJc3RydWN0IGkyY19tc2cgbXNnID0KLQkJeyAuYWRkciA9IHByaXYtPnBsbF9pMmNfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisJCXsgLmFkZHIgPSBwcml2LT5wbGxfaTJjX2FkZHJlc3MsIC5mbGFncyA9IDAsCisJCSAgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CiAJaW50IHJlc3VsdDsKLQl1MzIgZGl2OwotCWludCBpOwotCXUzMiBiYW5kd2lkdGggPSAwOworCXUzMiBiYW5kd2lkdGggPSAwLCBmcmVxdWVuY3kgPSAwOwogCiAJaWYgKHByaXYtPmkyYyA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUzNiw4ICs1MzcsMTEgQEAKIAkJYmFuZHdpZHRoID0gcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoOwogCX0KIAotCWlmICgocmVzdWx0ID0gZHZiX3BsbF9jb25maWd1cmUocHJpdi0+cGxsX2Rlc2MsIGJ1ZiwgcGFyYW1zLT5mcmVxdWVuY3ksIGJhbmR3aWR0aCkpICE9IDApCisJaWYgKChyZXN1bHQgPSBkdmJfcGxsX2NvbmZpZ3VyZShwcml2LT5wbGxfZGVzYywgYnVmLAorCQkJCQlwYXJhbXMtPmZyZXF1ZW5jeSwgYmFuZHdpZHRoKSkgPCAwKQogCQlyZXR1cm4gcmVzdWx0OworCWVsc2UKKwkJZnJlcXVlbmN5ID0gcmVzdWx0OwogCiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKIAkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKQEAgLTU0NSwyNiArNTQ5LDE5IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JLy8gY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgd2Ugc2V0IGl0IHRvCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPnBsbF9kZXNjLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+IHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLmxpbWl0KQotCQkJY29udGludWU7Ci0JCWJyZWFrOwotCX0KLQlkaXYgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5vZmZzZXQpIC8gcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0uc3RlcHNpemU7Ci0JcHJpdi0+ZnJlcXVlbmN5ID0gKGRpdiAqIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLnN0ZXBzaXplKSAtIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLm9mZnNldDsKKwlwcml2LT5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CiAJcHJpdi0+YmFuZHdpZHRoID0gYmFuZHdpZHRoOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHZiX3BsbF9jYWxjX3JlZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLCB1OCAqYnVmLCBpbnQgYnVmX2xlbikKK3N0YXRpYyBpbnQgZHZiX3BsbF9jYWxjX3JlZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLAorCQkJICAgICB1OCAqYnVmLCBpbnQgYnVmX2xlbikKIHsKIAlzdHJ1Y3QgZHZiX3BsbF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CiAJaW50IHJlc3VsdDsKLQl1MzIgZGl2OwotCWludCBpOwotCXUzMiBiYW5kd2lkdGggPSAwOworCXUzMiBiYW5kd2lkdGggPSAwLCBmcmVxdWVuY3kgPSAwOwogCiAJaWYgKGJ1Zl9sZW4gPCA1KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU3NCwxOCArNTcxLDE1IEBACiAJCWJhbmR3aWR0aCA9IHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aDsKIAl9CiAKLQlpZiAoKHJlc3VsdCA9IGR2Yl9wbGxfY29uZmlndXJlKHByaXYtPnBsbF9kZXNjLCBidWYrMSwgcGFyYW1zLT5mcmVxdWVuY3ksIGJhbmR3aWR0aCkpICE9IDApCisJaWYgKChyZXN1bHQgPSBkdmJfcGxsX2NvbmZpZ3VyZShwcml2LT5wbGxfZGVzYywgYnVmKzEsCisJCQkJCXBhcmFtcy0+ZnJlcXVlbmN5LCBiYW5kd2lkdGgpKSA8IDApCiAJCXJldHVybiByZXN1bHQ7CisJZWxzZQorCQlmcmVxdWVuY3kgPSByZXN1bHQ7CisKIAlidWZbMF0gPSBwcml2LT5wbGxfaTJjX2FkZHJlc3M7CiAKLQkvLyBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSB3ZSBzZXQgaXQgdG8KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cGxsX2Rlc2MtPmNvdW50OyBpKyspIHsKLQkJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5ID4gcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0ubGltaXQpCi0JCQljb250aW51ZTsKLQkJYnJlYWs7Ci0JfQotCWRpdiA9IChwYXJhbXMtPmZyZXF1ZW5jeSArIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLm9mZnNldCkgLyBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5zdGVwc2l6ZTsKLQlwcml2LT5mcmVxdWVuY3kgPSAoZGl2ICogcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0uc3RlcHNpemUpIC0gcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0ub2Zmc2V0OworCXByaXYtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKIAlwcml2LT5iYW5kd2lkdGggPSBiYW5kd2lkdGg7CiAKIAlyZXR1cm4gNTsKQEAgLTYxNCwxMCArNjA4LDEzIEBACiAJLmdldF9iYW5kd2lkdGggPSBkdmJfcGxsX2dldF9iYW5kd2lkdGgsCiB9OwogCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kICpkdmJfcGxsX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IHBsbF9hZGRyLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9wbGxfZGVzYyAqZGVzYykKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKmR2Yl9wbGxfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgcGxsX2FkZHIsCisJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCSAgICBzdHJ1Y3QgZHZiX3BsbF9kZXNjICpkZXNjKQogewogCXU4IGIxIFtdID0geyAwIH07Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHBsbF9hZGRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGIxLCAubGVuID0gMSB9OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBwbGxfYWRkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCQkgICAgICAgLmJ1ZiA9IGIxLCAubGVuID0gMSB9OwogCXN0cnVjdCBkdmJfcGxsX3ByaXYgKnByaXYgPSBOVUxMOwogCWludCByZXQ7CiAKQEAgLTY0MCw3ICs2MzcsOSBAQAogCXByaXYtPmkyYyA9IGkyYzsKIAlwcml2LT5wbGxfZGVzYyA9IGRlc2M7CiAKLQltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmZHZiX3BsbF90dW5lcl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZkdmJfcGxsX3R1bmVyX29wcywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CisKIAlzdHJuY3B5KGZlLT5vcHMudHVuZXJfb3BzLmluZm8ubmFtZSwgZGVzYy0+bmFtZSwgMTI4KTsKIAlmZS0+b3BzLnR1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9taW4gPSBkZXNjLT5taW47CiAJZmUtPm9wcy50dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfbWluID0gZGVzYy0+bWF4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKaW5kZXggZWQ1YWM1YS4uNjgxMTg2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCkBAIC00OCw3ICs0OCw3IEBACiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Rob21zb25fZmU2NjAwOwogCiBleHRlcm4gaW50IGR2Yl9wbGxfY29uZmlndXJlKHN0cnVjdCBkdmJfcGxsX2Rlc2MgKmRlc2MsIHU4ICpidWYsCi0JCSAgICAgIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKTsKKwkJCSAgICAgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpOwogCiAvKioKICAqIEF0dGFjaCBhIGR2Yi1wbGwgdG8gdGhlIHN1cHBsaWVkIGZyb250ZW5kIHN0cnVjdHVyZS4KQEAgLTU5LDYgKzU5LDkgQEAKICAqIEBwYXJhbSBkZXNjIGR2Yl9wbGxfZGVzYyB0byB1c2UuCiAgKiBAcmV0dXJuIEZyb250ZW5kIHBvaW50ZXIgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlCiAgKi8KLWV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkdmJfcGxsX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IHBsbF9hZGRyLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9wbGxfZGVzYyAqZGVzYyk7CitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqZHZiX3BsbF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgIGludCBwbGxfYWRkciwKKwkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJCSAgIHN0cnVjdCBkdmJfcGxsX2Rlc2MgKmRlc2MpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXNsNjQyMS5oCmluZGV4IDE5MTZlM2UuLmVhN2Y3OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2lzbDY0MjEuaApAQCAtMzksNyArMzksNyBAQAogI2RlZmluZSBJU0w2NDIxX0lTRUwxCTB4MjAKICNkZWZpbmUgSVNMNjQyMV9EQ0wJMHg0MAogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX0lTTDY0MjEpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9JU0w2NDIxX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfSVNMNjQyMSkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9JU0w2NDIxX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogLyogb3ZlcnJpZGVfc2V0IGFuZCBvdmVycmlkZV9jbGVhciBjb250cm9sIHdoaWNoIHN5c3RlbSByZWdpc3RlciBiaXRzIChhYm92ZSkgdG8gYWx3YXlzIHNldCAmIGNsZWFyICovCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqaXNsNjQyMV9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBpMmNfYWRkciwKIAkJCSAgdTggb3ZlcnJpZGVfc2V0LCB1OCBvdmVycmlkZV9jbGVhcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMKaW5kZXggZjNiYzgyZS4uMWFlYWNiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYwpAQCAtMzYsNyArMzYsNyBAQAogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiAKIAkvKiBwcml2YXRlIGRlbW9kdWxhdG9yIGRhdGEgKi8KLQlpbnQgZmlyc3Q6MTsKKwl1bnNpZ25lZCBpbnQgZmlyc3Q6MTsKIH07CiAKICNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmgKaW5kZXggMjFiYTRhMi4uY2QxNWY3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuaApAQCAtMzEsNyArMzEsNyBAQAogCXU4IGRlbW9kX2FkZHJlc3M7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX0w2NDc4MSkgfHwgZGVmaW5lZChDT05GSUdfRFZCX0w2NDc4MV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0w2NDc4MSkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9MNjQ3ODFfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogbDY0NzgxX2F0dGFjaChjb25zdCBzdHJ1Y3QgbDY0NzgxX2NvbmZpZyogY29uZmlnLAogCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdfaDA2eGYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ19oMDZ4Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTRkNTFkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ19oMDZ4Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqICBsZ19oMDZ4Zi5oIC0gQVRTQyBUdW5lciBzdXBwb3J0IGZvciBMRyBURFZTLUgwNnhGCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9MR19IMDZYRl9IXwotI2RlZmluZSBfTEdfSDA2WEZfSF8KLSNpbmNsdWRlICJkdmItcGxsLmgiCi0KLXN0YXRpYyBpbnQgbGdfaDA2eGZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGkyY19hZGFwdGVyKiBpMmNfYWRhcCwKLQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKLXsKLQl1OCBidWZbNF07Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsCi0JCQkgICAgICAgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07Ci0JaW50IGVycjsKLQotCWR2Yl9wbGxfY29uZmlndXJlKCZkdmJfcGxsX2xnX3RkdnNfaDA2eGYsIGJ1ZiwgcGFyYW1zLT5mcmVxdWVuY3ksIDApOwotCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoaTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImxnX2gwNnhmOiAlcyBlcnJvciAiCi0JCQkiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWVsc2UKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQotCS8qIFNldCB0aGUgQXV4aWxpYXJ5IEJ5dGUuICovCi0JYnVmWzBdID0gYnVmWzJdOwotCWJ1ZlswXSAmPSB+MHgyMDsKLQlidWZbMF0gfD0gMHgxODsKLQlidWZbMV0gPSAweDUwOwotCW1zZy5sZW4gPSAyOwotCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoaTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImxnX2gwNnhmOiAlcyBlcnJvciAiCi0JCQkiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWVsc2UKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQotCXJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCmluZGV4IDlhMzU0NzAuLjY4YWFkMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCkBAIC0zMSw5ICszMSw2IEBACiAgKiAgIEFpcjJQQy9BaXJTdGFyIDIgQVRTQyAzcmQgZ2VuZXJhdGlvbiAoSEQ1MDAwKQogICogICBwY0hEVFYgSEQ1NTAwCiAgKgotICogVE9ETzoKLSAqIHNpZ25hbCBzdHJlbmd0aCBhbHdheXMgcmV0dXJucyAwLgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00Niw5ICs0MywxMyBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImR2Yl9tYXRoLmgiCiAjaW5jbHVkZSAibGdkdDMzMHhfcHJpdi5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCiAKKy8qIFVzZSBFcXVhbGl6ZXIgTWVhbiBTcXVhcmVkIEVycm9yIGluc3RlYWQgb2YgUGhhc2VyIFRyYWNrZXIgTVNFICovCisvKiAjZGVmaW5lIFVTRV9FUU1TRSAqLworCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsIlR1cm4gb24vb2ZmIGxnZHQzMzB4IGZyb250ZW5kIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOwpAQCAtNjgsNiArNjksNyBAQAogCiAJLyogRGVtb2R1bGF0b3IgcHJpdmF0ZSBkYXRhICovCiAJZmVfbW9kdWxhdGlvbl90IGN1cnJlbnRfbW9kdWxhdGlvbjsKKwl1MzIgc25yOyAvKiBSZXN1bHQgb2YgbGFzdCBTTlIgY2FsY3VsYXRpb24gKi8KIAogCS8qIFR1bmVyIHByaXZhdGUgZGF0YSAqLwogCXUzMiBjdXJyZW50X2ZyZXF1ZW5jeTsKQEAgLTMwMiwxMCArMzA0LDEwIEBACiAJc3RhdGljIHU4IGxnZHQzMzAzXzh2c2JfNDRfZGF0YVtdID0gewogCQkweDA0LCAweDAwLAogCQkweDBkLCAweDQwLAotCTB4MGUsIDB4ODcsCi0JMHgwZiwgMHg4ZSwKLQkweDEwLCAweDAxLAotCTB4NDcsIDB4OGIgfTsKKwkJMHgwZSwgMHg4NywKKwkJMHgwZiwgMHg4ZSwKKwkJMHgxMCwgMHgwMSwKKwkJMHg0NywgMHg4YiB9OwogCiAJLyoKIAkgKiBBcnJheSBvZiBieXRlIHBhaXJzIDxhZGRyZXNzLCB2YWx1ZT4KQEAgLTQzNSw5ICs0MzcsNiBAQAogCQkvKiBUZXN0IHNpZ25hbCBkb2VzIG5vdCBleGlzdCBmbGFnICovCiAJCS8qIGFzIHdlbGwgYXMgdGhlIEFHQyBsb2NrIGZsYWcuICAgKi8KIAkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOwotCX0gZWxzZSB7Ci0JCS8qIFdpdGhvdXQgYSBzaWduYWwgYWxsIG90aGVyIHN0YXR1cyBiaXRzIGFyZSBtZWFuaW5nbGVzcyAqLwotCQlyZXR1cm4gMDsKIAl9CiAKIAkvKgpAQCAtNTAwLDkgKzQ5OSw2IEBACiAJCS8qIFRlc3QgaW5wdXQgc2lnbmFsIGRvZXMgbm90IGV4aXN0IGZsYWcgKi8KIAkJLyogYXMgd2VsbCBhcyB0aGUgQUdDIGxvY2sgZmxhZy4gICAqLwogCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7Ci0JfSBlbHNlIHsKLQkJLyogV2l0aG91dCBhIHNpZ25hbCBhbGwgb3RoZXIgc3RhdHVzIGJpdHMgYXJlIG1lYW5pbmdsZXNzICovCi0JCXJldHVybiAwOwogCX0KIAogCS8qIENhcnJpZXIgUmVjb3ZlcnkgTG9jayBTdGF0dXMgUmVnaXN0ZXIgKi8KQEAgLTU0MywxNTEgKzUzOSwxNTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsZ2R0MzMweF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzdHJlbmd0aCkKKy8qIENhbGN1bGF0ZSBTTlIgZXN0aW1hdGlvbiAoc2NhbGVkIGJ5IDJeMjQpCisKKyAgIDgtVlNCIFNOUiBlcXVhdGlvbnMgZnJvbSBMR0RUMzMwMiBhbmQgTEdEVDMzMDMgZGF0YXNoZWV0cywgUUFNCisgICBlcXVhdGlvbnMgZnJvbSBMR0RUMzMwMyBkYXRhc2hlZXQuICBWU0IgaXMgdGhlIHNhbWUgYmV0d2VlbiB0aGUgJzAyCisgICBhbmQgJzAzLCBzbyBtYXliZSBRQU0gaXMgdG9vPyAgUGVyaGFwcyBzb21lb25lIHdpdGggYSBuZXdlciBkYXRhc2hlZXQKKyAgIHRoYXQgaGFzIFFBTSBpbmZvcm1hdGlvbiBjb3VsZCB2ZXJpZnk/CisKKyAgIEZvciA4LVZTQjogKHR3byB3YXlzLCB0YWtlIHlvdXIgcGljaykKKyAgIExHRFQzMzAyOgorICAgICBTTlJfRVEgPSAxMCAqIGxvZzEwKDI1ICogMjReMiAvIEVRX01TRSkKKyAgIExHRFQzMzAzOgorICAgICBTTlJfRVEgPSAxMCAqIGxvZzEwKDI1ICogMzJeMiAvIEVRX01TRSkKKyAgIExHRFQzMzAyICYgTEdEVDMzMDM6CisgICAgIFNOUl9QVCA9IDEwICogbG9nMTAoMjUgKiAzMl4yIC8gUFRfTVNFKSAgKHdlIHVzZSB0aGlzIG9uZSkKKyAgIEZvciA2NC1RQU06CisgICAgIFNOUiAgICA9IDEwICogbG9nMTAoIDY4ODEyOCAgIC8gTVNFUUFNKQorICAgRm9yIDI1Ni1RQU06CisgICAgIFNOUiAgICA9IDEwICogbG9nMTAoIDY5NjMyMCAgIC8gTVNFUUFNKQorCisgICBXZSByZS13cml0ZSB0aGUgc25yIGVxdWF0aW9uIGFzOgorICAgICBTTlIgKiAyXjI0ID0gMTAqKGMgLSBpbnRsb2cxMChNU0UpKQorICAgV2hlcmUgZm9yIDI1Ni1RQU0sIGMgPSBsb2cxMCg2OTYzMjApICogMl4yNCwgYW5kIHNvIG9uLiAqLworCitzdGF0aWMgdTMyIGNhbGN1bGF0ZV9zbnIodTMyIG1zZSwgdTMyIGMpCiB7Ci0JLyogbm90IGRpcmVjdGx5IGF2YWlsYWJsZS4gKi8KLQkqc3RyZW5ndGggPSAwOwotCXJldHVybiAwOworCWlmIChtc2UgPT0gMCkgLyogTm8gc2lnbmFsICovCisJCXJldHVybiAwOworCisJbXNlID0gaW50bG9nMTAobXNlKTsKKwlpZiAobXNlID4gYykgeworCQkvKiBOZWdhdGl2ZSBTTlIsIHdoaWNoIGlzIHBvc3NpYmxlLCBidXQgcmVhbGlzdGljbHkgdGhlCisJCWRlbW9kIHdpbGwgbG9zZSBsb2NrIGJlZm9yZSB0aGUgc2lnbmFsIGdldHMgdGhpcyBiYWQuICBUaGUKKwkJQVBJIG9ubHkgYWxsb3dzIGZvciB1bnNpZ25lZCB2YWx1ZXMsIHNvIGp1c3QgcmV0dXJuIDAgKi8KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxMCooYyAtIG1zZSk7CiB9CiAKIHN0YXRpYyBpbnQgbGdkdDMzMDJfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQogewotI2lmZGVmIFNOUl9JTl9EQgotCS8qCi0JICogU3BlYyBzaGVldCBzaG93cyBmb3JtdWxhIGZvciBTTlJfRVEgPSAxMCBsb2cxMCgyNSAqIDI0KioyIC8gbm9pc2UpCi0JICogYW5kIFNOUl9QSCA9IDEwIGxvZzEwKDI1ICogMzIqKjIgLyBub2lzZSkgZm9yIGVxdWFsaXplciBhbmQgcGhhc2UgdHJhY2tlcgotCSAqIHJlc3BlY3RpdmVseS4gVGhlIGZvbGxvd2luZyB0YWJsZXMgYXJlIGJ1aWx0IG9uIHRoZXNlIGZvcm11bGFzLgotCSAqIFRoZSB1c3VhbCBkZWZpbml0aW9uIGlzIFNOUiA9IDIwIGxvZzEwKHNpZ25hbC9ub2lzZSkKLQkgKiBJZiB0aGUgc3BlY2lmaWNhdGlvbiBpcyB3cm9uZyB0aGUgdmFsdWUgcmV0dW5lZCBpcyAxLzIgdGhlIGFjdHVhbCBTTlIgaW4gZGIuCi0JICoKLQkgKiBUaGlzIHRhYmxlIGlzIGEgYW4gb3JkZXJlZCBsaXN0IG9mIG5vaXNlIHZhbHVlcyBjb21wdXRlZCBieSB0aGUKLQkgKiBmb3JtdWxhIGZyb20gdGhlIHNwZWMgc2hlZXQgc3VjaCB0aGF0IHRoZSBpbmRleCBpbnRvIHRoZSB0YWJsZQotCSAqIHN0YXJ0aW5nIGF0IDQzIG9yIDQ1IGlzIHRoZSBTTlIgdmFsdWUgaW4gZGIuIFRoZXJlIGFyZSBkdXBsaWNhdGUgbm9pc2UKLQkgKiB2YWx1ZSBlbnRyaWVzIGF0IHRoZSBiZWdpbm5pbmcgYmVjYXVzZSB0aGUgU05SIHZhcmllcyBtb3JlIHRoYW4KLQkgKiAxIGRiIGZvciBhIGNoYW5nZSBvZiAxIGRpZ2l0IGluIG5vaXNlIGF0IHZlcnkgc21hbGwgdmFsdWVzIG9mIG5vaXNlLgotCSAqCi0JICogRXhhbXBsZXMgZnJvbSBTTlJfRVEgdGFibGU6Ci0JICogbm9pc2UgU05SCi0JICogICAwICAgIDQzCi0JICogICAxICAgIDQyCi0JICogICAyICAgIDM5Ci0JICogICAzICAgIDM3Ci0JICogICA0ICAgIDM2Ci0JICogICA1ICAgIDM1Ci0JICogICA2ICAgIDM0Ci0JICogICA3ICAgIDMzCi0JICogICA4ICAgIDMzCi0JICogICA5ICAgIDMyCi0JICogICAxMCAgIDMyCi0JICogICAxMSAgIDMxCi0JICogICAxMiAgIDMxCi0JICogICAxMyAgIDMwCi0JICovCi0KLQlzdGF0aWMgY29uc3QgdTMyIFNOUl9FUVtdID0KLQkJeyAxLCAgICAgMiwgICAgICAyLCAgICAgIDIsIDMsICAgICAgMywgICAgICA0LCAgICAgNCwgICAgIDUsICAgICA3LAotCQkgIDksICAgICAxMSwgICAgIDEzLCAgICAgMTcsIDIxLCAgICAgMjYsICAgICAzMywgICAgNDEsICAgIDUyLCAgICA2NSwKLQkJICA4MSwgICAgMTAyLCAgICAxMjksICAgIDE2MiwgMjA0LCAgICAyNTcsICAgIDMyMywgICA0MDYsICAgNTExLCAgIDY0NCwKLQkJICA4MTAsICAgMTAyMCwgICAxMjg0LCAgIDE2MTYsIDIwMzUsICAgMjU2MSwgICAzMjI0LCAgNDA1OSwgIDUxMTAsICA2NDMzLAotCQkgIDgwOTgsICAxMDE5NSwgIDEyODM1LCAgMTYxNTgsIDIwMzQxLCAgMjU2MDgsICAzMjIzOCwgNDA1ODUsIDUxMDk0LCA2NDMyMywKLQkJICA4MDk3OCwgMTAxOTQ1LCAxMjgzNDEsIDE2MTU3MSwgMjAzNDA2LCAyNTYwNzMsIDB4NDAwMDAKLQkJfTsKLQotCXN0YXRpYyBjb25zdCB1MzIgU05SX1BIW10gPQotCQl7IDEsICAgICAyLCAgICAgIDIsICAgICAgMiwgICAgICAzLCAgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA4LAotCQkgIDEwLCAgICAxMiwgICAgIDE1LCAgICAgMTksICAgICAyMywgICAgIDI5LCAzNywgICAgNDYsICAgIDU4LCAgICA3MywKLQkJICA5MSwgICAgMTE1LCAgICAxNDQsICAgIDE4MiwgICAgMjI5LCAgICAyODgsIDM2MiwgICA0NTYsICAgNTc0LCAgIDcyMiwKLQkJICA5MDksICAgMTE0NCwgICAxNDQwLCAgIDE4MTMsICAgMjI4MiwgICAyODczLCAzNjE3LCAgNDU1MywgIDU3MzIsICA3MjE2LAotCQkgIDkwODQsICAxMTQzNiwgIDE0Mzk2LCAgMTgxMjQsICAyMjgxNywgIDI4NzI0LCAgMzYxNjEsIDQ1NTI0LCA1NzMxMiwgNzIxNTEsCi0JCSAgOTA4MzMsIDExNDM1MSwgMTQzOTYwLCAxODEyMzUsIDIyODE2MSwgMHgwODAwMDAKLQkJfTsKLQotCXN0YXRpYyB1OCBidWZbNV07LyogcmVhZCBkYXRhIGJ1ZmZlciAqLwotCXN0YXRpYyB1MzIgbm9pc2U7ICAgLyogbm9pc2UgdmFsdWUgKi8KLQlzdGF0aWMgdTMyIHNucl9kYjsgIC8qIGluZGV4IGludG8gU05SX0VRW10gKi8KIAlzdHJ1Y3QgbGdkdDMzMHhfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsZ2R0MzMweF9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGJ1Zls1XTsJLyogcmVhZCBkYXRhIGJ1ZmZlciAqLworCXUzMiBub2lzZTsJLyogbm9pc2UgdmFsdWUgKi8KKwl1MzIgYzsJCS8qIHBlci1tb2R1bGF0aW9uIFNOUiBjYWxjdWxhdGlvbiBjb25zdGFudCAqLwogCi0JLyogcmVhZCBib3RoIGVxdWFsaXplciBhbmQgcGhhc2UgdHJhY2tlciBub2lzZSBkYXRhICovCi0JaTJjX3JlYWRfZGVtb2RfYnl0ZXMoc3RhdGUsIEVRUEhfRVJSMCwgYnVmLCBzaXplb2YoYnVmKSk7Ci0KLQlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBWU0JfOCkgewotCQkvKiBFcXVhbGl6ZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLworCXN3aXRjaChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uKSB7CisJY2FzZSBWU0JfODoKKwkJaTJjX3JlYWRfZGVtb2RfYnl0ZXMoc3RhdGUsIExHRFQzMzAyX0VRUEhfRVJSMCwgYnVmLCA1KTsKKyNpZmRlZiBVU0VfRVFNU0UKKwkJLyogVXNlIEVxdWFsaXplciBNZWFuLVNxdWFyZSBFcnJvciBSZWdpc3RlciAqLworCQkvKiBTTlIgZm9yIHJhbmdlcyBmcm9tIC0xNS42MSB0byArNDEuNTggKi8KIAkJbm9pc2UgPSAoKGJ1ZlswXSAmIDcpIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMl07Ci0KLQkJLyoKLQkJICogTG9vayB1cCBub2lzZSB2YWx1ZSBpbiB0YWJsZS4KLQkJICogQSBiZXR0ZXIgc2VhcmNoIGFsZ29yaXRobSBjb3VsZCBiZSB1c2VkLi4uCi0JCSAqIHdhdGNoIG91dCB0aGVyZSBhcmUgZHVwbGljYXRlIGVudHJpZXMuCi0JCSAqLwotCQlmb3IgKHNucl9kYiA9IDA7IHNucl9kYiA8IHNpemVvZihTTlJfRVEpOyBzbnJfZGIrKykgewotCQkJaWYgKG5vaXNlIDwgU05SX0VRW3Nucl9kYl0pIHsKLQkJCQkqc25yID0gNDMgLSBzbnJfZGI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBQaGFzZSBUcmFja2VyIE1lYW4tU3F1YXJlIEVycm9yIFJlZ2lzdGVyIGZvciBRQU0gKi8KLQkJbm9pc2UgPSAoKGJ1ZlswXSAmIDc8PDMpIDw8IDEzKSB8IChidWZbM10gPDwgOCkgfCBidWZbNF07Ci0KLQkJLyogTG9vayB1cCBub2lzZSB2YWx1ZSBpbiB0YWJsZS4gKi8KLQkJZm9yIChzbnJfZGIgPSAwOyBzbnJfZGIgPCBzaXplb2YoU05SX1BIKTsgc25yX2RiKyspIHsKLQkJCWlmIChub2lzZSA8IFNOUl9QSFtzbnJfZGJdKSB7Ci0JCQkJKnNuciA9IDQ1IC0gc25yX2RiOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorCQljID0gNjk3NjU3NDU7IC8qIGxvZzEwKDI1KjI0XjIpKjJeMjQgKi8KICNlbHNlCi0JLyogUmV0dXJuIHRoZSByYXcgbm9pc2UgdmFsdWUgKi8KLQlzdGF0aWMgdTggYnVmWzVdOy8qIHJlYWQgZGF0YSBidWZmZXIgKi8KLQlzdGF0aWMgdTMyIG5vaXNlOyAgIC8qIG5vaXNlIHZhbHVlICovCi0Jc3RydWN0IGxnZHQzMzB4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgbGdkdDMzMHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQotCS8qIHJlYWQgYm90aCBlcXVhbGl6ZXIgYW5kIHBhc2UgdHJhY2tlciBub2lzZSBkYXRhICovCi0JaTJjX3JlYWRfZGVtb2RfYnl0ZXMoc3RhdGUsIEVRUEhfRVJSMCwgYnVmLCBzaXplb2YoYnVmKSk7Ci0KLQlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBWU0JfOCkgewotCQkvKiBQaGFzZSBUcmFja2VyIE1lYW4tU3F1YXJlIEVycm9yIFJlZ2lzdGVyIGZvciBWU0IgKi8KKwkJLyogVXNlIFBoYXNlIFRyYWNrZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgKi8KKwkJLyogU05SIGZvciByYW5nZXMgZnJvbSAtMTMuMTEgdG8gKzQ0LjA4ICovCiAJCW5vaXNlID0gKChidWZbMF0gJiA3PDwzKSA8PCAxMykgfCAoYnVmWzNdIDw8IDgpIHwgYnVmWzRdOwotCX0gZWxzZSB7Ci0KLQkJLyogQ2FycmllciBSZWNvdmVyeSBNZWFuLVNxdWFyZSBFcnJvciBmb3IgUUFNICovCi0JCWkyY19yZWFkX2RlbW9kX2J5dGVzKHN0YXRlLCAweDFhLCBidWYsIDIpOworCQljID0gNzM5NTc5OTQ7IC8qIGxvZzEwKDI1KjMyXjIpKjJeMjQgKi8KKyNlbmRpZgorCQlicmVhazsKKwljYXNlIFFBTV82NDoKKwljYXNlIFFBTV8yNTY6CisJCWkyY19yZWFkX2RlbW9kX2J5dGVzKHN0YXRlLCBDQVJSSUVSX01TRVFBTTEsIGJ1ZiwgMik7CiAJCW5vaXNlID0gKChidWZbMF0gJiAzKSA8PCA4KSB8IGJ1ZlsxXTsKKwkJYyA9IHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPT0gUUFNXzY0ID8gOTc5Mzk4MzcgOiA5ODAyNjA2NjsKKwkJLyogbG9nMTAoNjg4MTI4KSoyXjI0IGFuZCBsb2cxMCg2OTYzMjApKjJeMjQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJsZ2R0MzMweDogJXM6IE1vZHVsYXRpb24gc2V0IHRvIHVuc3VwcG9ydGVkIHZhbHVlXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIHJldHVybiAtRURSSVZFUl9JU19HSUJCRVJFRDsgKi8KIAl9CiAKLQkvKiBTbWFsbCB2YWx1ZXMgZm9yIG5vaXNlIG1lYW4gc2lnbmFsIGlzIGJldHRlciBzbyBpbnZlcnQgbm9pc2UgKi8KLQkqc25yID0gfm5vaXNlOwotI2VuZGlmCisJc3RhdGUtPnNuciA9IGNhbGN1bGF0ZV9zbnIobm9pc2UsIGMpOworCSpzbnIgPSAoc3RhdGUtPnNucikgPj4gMTY7IC8qIENvbnZlcnQgZnJvbSA4LjI0IGZpeGVkLXBvaW50IHRvIDguOCAqLwogCi0JZHByaW50aygiJXM6IG5vaXNlID0gMHglMDV4LCBzbnIgPSAlaWRiXG4iLF9fRlVOQ1RJT05fXywgbm9pc2UsICpzbnIpOworCWRwcmludGsoIiVzOiBub2lzZSA9IDB4JTA4eCwgc25yID0gJWQuJTAyZCBkQlxuIiwgX19GVU5DVElPTl9fLCBub2lzZSwKKwkJc3RhdGUtPnNuciA+PiAyNCwgKCgoc3RhdGUtPnNucj4+OCkgJiAweGZmZmYpICogMTAwKSA+PiAxNik7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBsZ2R0MzMwM19yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzbnIpCiB7Ci0JLyogUmV0dXJuIHRoZSByYXcgbm9pc2UgdmFsdWUgKi8KLQlzdGF0aWMgdTggYnVmWzVdOy8qIHJlYWQgZGF0YSBidWZmZXIgKi8KLQlzdGF0aWMgdTMyIG5vaXNlOyAgIC8qIG5vaXNlIHZhbHVlICovCiAJc3RydWN0IGxnZHQzMzB4X3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgbGdkdDMzMHhfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBidWZbNV07CS8qIHJlYWQgZGF0YSBidWZmZXIgKi8KKwl1MzIgbm9pc2U7CS8qIG5vaXNlIHZhbHVlICovCisJdTMyIGM7CQkvKiBwZXItbW9kdWxhdGlvbiBTTlIgY2FsY3VsYXRpb24gY29uc3RhbnQgKi8KIAotCWlmIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID09IFZTQl84KSB7Ci0KLQkJaTJjX3JlYWRfZGVtb2RfYnl0ZXMoc3RhdGUsIDB4NmUsIGJ1ZiwgNSk7Ci0JCS8qIFBoYXNlIFRyYWNrZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLworCXN3aXRjaChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uKSB7CisJY2FzZSBWU0JfODoKKwkJaTJjX3JlYWRfZGVtb2RfYnl0ZXMoc3RhdGUsIExHRFQzMzAzX0VRUEhfRVJSMCwgYnVmLCA1KTsKKyNpZmRlZiBVU0VfRVFNU0UKKwkJLyogVXNlIEVxdWFsaXplciBNZWFuLVNxdWFyZSBFcnJvciBSZWdpc3RlciAqLworCQkvKiBTTlIgZm9yIHJhbmdlcyBmcm9tIC0xNi4xMiB0byArNDQuMDggKi8KKwkJbm9pc2UgPSAoKGJ1ZlswXSAmIDB4NzgpIDw8IDEzKSB8IChidWZbMV0gPDwgOCkgfCBidWZbMl07CisJCWMgPSA3Mzk1Nzk5NDsgLyogbG9nMTAoMjUqMzJeMikqMl4yNCAqLworI2Vsc2UKKwkJLyogVXNlIFBoYXNlIFRyYWNrZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgKi8KKwkJLyogU05SIGZvciByYW5nZXMgZnJvbSAtMTMuMTEgdG8gKzQ0LjA4ICovCiAJCW5vaXNlID0gKChidWZbMF0gJiA3KSA8PCAxNikgfCAoYnVmWzNdIDw8IDgpIHwgYnVmWzRdOwotCX0gZWxzZSB7Ci0KLQkJLyogQ2FycmllciBSZWNvdmVyeSBNZWFuLVNxdWFyZSBFcnJvciBmb3IgUUFNICovCi0JCWkyY19yZWFkX2RlbW9kX2J5dGVzKHN0YXRlLCAweDFhLCBidWYsIDIpOworCQljID0gNzM5NTc5OTQ7IC8qIGxvZzEwKDI1KjMyXjIpKjJeMjQgKi8KKyNlbmRpZgorCQlicmVhazsKKwljYXNlIFFBTV82NDoKKwljYXNlIFFBTV8yNTY6CisJCWkyY19yZWFkX2RlbW9kX2J5dGVzKHN0YXRlLCBDQVJSSUVSX01TRVFBTTEsIGJ1ZiwgMik7CiAJCW5vaXNlID0gKGJ1ZlswXSA8PCA4KSB8IGJ1ZlsxXTsKKwkJYyA9IHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPT0gUUFNXzY0ID8gOTc5Mzk4MzcgOiA5ODAyNjA2NjsKKwkJLyogbG9nMTAoNjg4MTI4KSoyXjI0IGFuZCBsb2cxMCg2OTYzMjApKjJeMjQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJsZ2R0MzMweDogJXM6IE1vZHVsYXRpb24gc2V0IHRvIHVuc3VwcG9ydGVkIHZhbHVlXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIHJldHVybiAtRURSSVZFUl9JU19HSUJCRVJFRDsgKi8KIAl9CiAKLQkvKiBTbWFsbCB2YWx1ZXMgZm9yIG5vaXNlIG1lYW4gc2lnbmFsIGlzIGJldHRlciBzbyBpbnZlcnQgbm9pc2UgKi8KLQkqc25yID0gfm5vaXNlOworCXN0YXRlLT5zbnIgPSBjYWxjdWxhdGVfc25yKG5vaXNlLCBjKTsKKwkqc25yID0gKHN0YXRlLT5zbnIpID4+IDE2OyAvKiBDb252ZXJ0IGZyb20gOC4yNCBmaXhlZC1wb2ludCB0byA4LjggKi8KIAotCWRwcmludGsoIiVzOiBub2lzZSA9IDB4JTA1eCwgc25yID0gJWlkYlxuIixfX0ZVTkNUSU9OX18sIG5vaXNlLCAqc25yKTsKKwlkcHJpbnRrKCIlczogbm9pc2UgPSAweCUwOHgsIHNuciA9ICVkLiUwMmQgZEJcbiIsIF9fRlVOQ1RJT05fXywgbm9pc2UsCisJCXN0YXRlLT5zbnIgPj4gMjQsICgoKHN0YXRlLT5zbnIgPj4gOCkgJiAweGZmZmYpICogMTAwKSA+PiAxNik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMweF9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzdHJlbmd0aCkKK3sKKwkvKiBDYWxjdWxhdGUgU3RyZW5ndGggZnJvbSBTTlIgdXAgdG8gMzVkQiAqLworCS8qIEV2ZW4gdGhvdWdoIHRoZSBTTlIgY2FuIGdvIGhpZ2hlciB0aGFuIDM1ZEIsIHRoZXJlIGlzIHNvbWUgY29tZm9ydCAqLworCS8qIGZhY3RvciBpbiBoYXZpbmcgYSByYW5nZSBvZiBzdHJvbmcgc2lnbmFscyB0aGF0IGNhbiBzaG93IGF0IDEwMCUgICAqLworCXN0cnVjdCBsZ2R0MzMweF9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGxnZHQzMzB4X3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTE2IHNucjsKKwlpbnQgcmV0OworCisJcmV0ID0gZmUtPm9wcy5yZWFkX3NucihmZSwgJnNucik7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCS8qIFJhdGhlciB0aGFuIHVzZSB0aGUgOC44IHZhbHVlIHNuciwgdXNlIHN0YXRlLT5zbnIgd2hpY2ggaXMgOC4yNCAqLworCS8qIHNjYWxlIHRoZSByYW5nZSAwIC0gMzUqMl4yNCBpbnRvIDAgLSA2NTUzNSAqLworCWlmIChzdGF0ZS0+c25yID49IDg5NjAgKiAweDEwMDAwKQorCQkqc3RyZW5ndGggPSAweGZmZmY7CisJZWxzZQorCQkqc3RyZW5ndGggPSBzdGF0ZS0+c25yIC8gODk2MDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguaAppbmRleCAzZjk2YjQ4Li45OTUwNTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguaApAQCAtNTIsNyArNTIsNyBAQAogCWludCBjbG9ja19wb2xhcml0eV9mbGlwOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9MR0RUMzMwWCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX0xHRFQzMzBYX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfTEdEVDMzMFgpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfTEdEVDMzMFhfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogbGdkdDMzMHhfYXR0YWNoKGNvbnN0IHN0cnVjdCBsZ2R0MzMweF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHhfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4X3ByaXYuaAppbmRleCA1OWI3YzViLi4zOGM3NjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHhfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweF9wcml2LmgKQEAgLTUxLDE0ICs1MSwxOSBAQAogCUFHQ19SRklGX0FDQzI9IDB4M2IsCiAJQUdDX1NUQVRVUz0gMHgzZiwKIAlTWU5DX1NUQVRVU19WU0I9IDB4NDMsCi0JRVFQSF9FUlIwPSAweDQ3LAotCUVRX0VSUjE9IDB4NDgsCi0JRVFfRVJSMj0gMHg0OSwKLQlQSF9FUlIxPSAweDRhLAotCVBIX0VSUjI9IDB4NGIsCiAJREVNVVhfQ09OVFJPTD0gMHg2NiwKKwlMR0RUMzMwMl9FUVBIX0VSUjA9IDB4NDcsCisJTEdEVDMzMDJfRVFfRVJSMT0gMHg0OCwKKwlMR0RUMzMwMl9FUV9FUlIyPSAweDQ5LAorCUxHRFQzMzAyX1BIX0VSUjE9IDB4NGEsCisJTEdEVDMzMDJfUEhfRVJSMj0gMHg0YiwKIAlMR0RUMzMwMl9QQUNLRVRfRVJSX0NPVU5URVIxPSAweDZhLAogCUxHRFQzMzAyX1BBQ0tFVF9FUlJfQ09VTlRFUjI9IDB4NmIsCisJTEdEVDMzMDNfRVFQSF9FUlIwPSAweDZlLAorCUxHRFQzMzAzX0VRX0VSUjE9IDB4NmYsCisJTEdEVDMzMDNfRVFfRVJSMj0gMHg3MCwKKwlMR0RUMzMwM19QSF9FUlIxPSAweDcxLAorCUxHRFQzMzAzX1BIX0VSUjI9IDB4NzIsCiAJTEdEVDMzMDNfUEFDS0VUX0VSUl9DT1VOVEVSMT0gMHg4YiwKIAlMR0RUMzMwM19QQUNLRVRfRVJSX0NPVU5URVIyPSAweDhjLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2gwNnhmLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdoMDZ4Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDJkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdoMDZ4Zi5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogIGxnaDA2eGYuYyAtIEFUU0MgVHVuZXIgc3VwcG9ydCBmb3IgTEcgVERWUy1IMDZ4RgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImR2Yi1wbGwuaCIKKyNpbmNsdWRlICJsZ2gwNnhmLmgiCisKKyNkZWZpbmUgTEdfSDA2WEZfUExMX0kyQ19BRERSIDB4NjEKKworc3RydWN0IGxnaDA2eGZfcHJpdiB7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJdTMyIGZyZXF1ZW5jeTsKK307CisKK3N0YXRpYyBpbnQgbGdoMDZ4Zl9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWtmcmVlKGZlLT50dW5lcl9wcml2KTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdoMDZ4Zl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCit7CisJc3RydWN0IGxnaDA2eGZfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXU4IGJ1Zls0XTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gTEdfSDA2WEZfUExMX0kyQ19BRERSLCAuZmxhZ3MgPSAwLAorCQkJICAgICAgIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OworCXUzMiBmcmVxdWVuY3k7CisJaW50IHJlc3VsdDsKKworCWlmICgocmVzdWx0ID0gZHZiX3BsbF9jb25maWd1cmUoJmR2Yl9wbGxfbGdfdGR2c19oMDZ4ZiwgYnVmLAorCQkJCQlwYXJhbXMtPmZyZXF1ZW5jeSwgMCkpIDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKwllbHNlCisJCWZyZXF1ZW5jeSA9IHJlc3VsdDsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKChyZXN1bHQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2gwNnhmOiAlcyBlcnJvciAiCisJCSAgICAgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCByZXN1bHQgPSAlaSlcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCByZXN1bHQpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWVsc2UKKwkJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCS8qIFNldCB0aGUgQXV4aWxpYXJ5IEJ5dGUuICovCisJYnVmWzBdID0gYnVmWzJdOworCWJ1ZlswXSAmPSB+MHgyMDsKKwlidWZbMF0gfD0gMHgxODsKKwlidWZbMV0gPSAweDUwOworCW1zZy5sZW4gPSAyOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKChyZXN1bHQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2gwNnhmOiAlcyBlcnJvciAiCisJCSAgICAgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCByZXN1bHQgPSAlaSlcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCByZXN1bHQpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWVsc2UKKwkJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXByaXYtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnaDA2eGZfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCit7CisJc3RydWN0IGxnaDA2eGZfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCSpmcmVxdWVuY3kgPSBwcml2LT5mcmVxdWVuY3k7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3R1bmVyX29wcyBsZ2gwNnhmX3R1bmVyX29wcyA9IHsKKwkucmVsZWFzZSAgICAgICA9IGxnaDA2eGZfcmVsZWFzZSwKKwkuc2V0X3BhcmFtcyAgICA9IGxnaDA2eGZfc2V0X3BhcmFtcywKKwkuZ2V0X2ZyZXF1ZW5jeSA9IGxnaDA2eGZfZ2V0X2ZyZXF1ZW5jeSwKK307CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIGxnaDA2eGZfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3QgbGdoMDZ4Zl9wcml2ICpwcml2ID0gTlVMTDsKKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGdoMDZ4Zl9wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwcml2LT5pMmMgPSBpMmM7CisKKwltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmbGdoMDZ4Zl90dW5lcl9vcHMsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCisJc3RybGNweShmZS0+b3BzLnR1bmVyX29wcy5pbmZvLm5hbWUsIGR2Yl9wbGxfbGdfdGR2c19oMDZ4Zi5uYW1lLAorCQlzaXplb2YoZmUtPm9wcy50dW5lcl9vcHMuaW5mby5uYW1lKSk7CisKKwlmZS0+b3BzLnR1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9taW4gPSBkdmJfcGxsX2xnX3RkdnNfaDA2eGYubWluOworCWZlLT5vcHMudHVuZXJfb3BzLmluZm8uZnJlcXVlbmN5X21heCA9IGR2Yl9wbGxfbGdfdGR2c19oMDZ4Zi5tYXg7CisKKwlmZS0+dHVuZXJfcHJpdiA9IHByaXY7CisJcmV0dXJuIGZlOworfQorCitFWFBPUlRfU1lNQk9MKGxnaDA2eGZfYXR0YWNoKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJMRyBURFZTLUgwNnhGIEFUU0MgVHVuZXIgc3VwcG9ydCIpOworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBLcnVma3kiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2gwNnhmLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdoMDZ4Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGI0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdoMDZ4Zi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAgbGdoMDZ4Zi5oIC0gQVRTQyBUdW5lciBzdXBwb3J0IGZvciBMRyBURFZTLUgwNnhGCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9MR0gwNlhGX0hfCisjZGVmaW5lIF9MR0gwNlhGX0hfCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVFVORVJfTEdIMDZYRikgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9UVU5FUl9MR0gwNlhGX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGxnaDA2eGZfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCQkgICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCogbGdoMDZ4Zl9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfRFZCX1RVTkVSX0xHSDA2WEYgKi8KKworI2VuZGlmIC8qIF9MR0gwNlhGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbG5icDIxLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbG5icDIxLmgKaW5kZXggMWZlMWRkMS4uNjg5MDZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjEuaApAQCAtMzksNyArMzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfTE5CUDIxKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfTE5CUDIxX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfTE5CUDIxKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX0xOQlAyMV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIC8qIG92ZXJyaWRlX3NldCBhbmQgb3ZlcnJpZGVfY2xlYXIgY29udHJvbCB3aGljaCBzeXN0ZW0gcmVnaXN0ZXIgYml0cyAoYWJvdmUpIHRvIGFsd2F5cyBzZXQgJiBjbGVhciAqLwogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmxuYnAyMV9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBvdmVycmlkZV9zZXQsIHU4IG92ZXJyaWRlX2NsZWFyKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQyMDYwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQyMDYwLmgKaW5kZXggMzRhMzdjMi4uMGE4NmVhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MjA2MC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDIwNjAuaApAQCAtMzAsNiArMzAsMTQgQEAKIAl1OCBjbG9ja19vdXQ7IC8qIDAgPSBvZmYsIDEgPSBDTEsvNCwgMiA9IENMSy8yLCAzID0gQ0xLLzEgKi8KIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVFVORVJfTVQyMDYwKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1RVTkVSX01UMjA2MF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogbXQyMDYwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBtdDIwNjBfY29uZmlnICpjZmcsIHUxNiBpZjEpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqIG10MjA2MF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgbXQyMDYwX2NvbmZpZyAqY2ZnLCB1MTYgaWYxKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvLyBDT05GSUdfRFZCX1RVTkVSX01UMjA2MAogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmgKaW5kZXggNzExMmZiNC4uY2Y5YTE1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmgKQEAgLTM0LDcgKzM0LDcgQEAKIAl1OCBkZW1vZF9hZGRyZXNzOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9NVDMxMikgfHwgZGVmaW5lZChDT05GSUdfRFZCX01UMzEyX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfTVQzMTIpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfTVQzMTJfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB2cDMxMF9tdDMxMl9hdHRhY2goY29uc3Qgc3RydWN0IG10MzEyX2NvbmZpZyogY29uZmlnLAogCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaAppbmRleCAwMDM1YzJlLi5lOTk2NDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaApAQCAtNTEsNyArNTEsNyBAQAogCWludCAoKmRlbW9kX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfTVQzNTIpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9NVDM1Ml9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX01UMzUyKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX01UMzUyX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIG10MzUyX2F0dGFjaChjb25zdCBzdHJ1Y3QgbXQzNTJfY29uZmlnKiBjb25maWcsCiAJCQkJCSBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmgKaW5kZXggMmViMjIwZS4uMjhiYzU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5oCkBAIC00NSw3ICs0NSw3IEBACiAJaW50ICgqc2V0X3RzX3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9OWFQyMDBYKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfTlhUMjAwWF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX05YVDIwMFgpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfTlhUMjAwWF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBueHQyMDB4X2F0dGFjaChjb25zdCBzdHJ1Y3Qgbnh0MjAweF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5oCmluZGV4IDkzOTczOTMuLjEzZDIyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuaApAQCAtMzMsNyArMzMsNyBAQAogCXU4IGNsb2NrX2ludmVyc2lvbjoxOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9OWFQ2MDAwKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfTlhUNjAwMF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX05YVDYwMDApIHx8IChkZWZpbmVkKENPTkZJR19EVkJfTlhUNjAwMF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBueHQ2MDAwX2F0dGFjaChjb25zdCBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5jCmluZGV4IGQyMGFiMzAuLjVhM2E2ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKKyNpbmNsdWRlICJkdmJfbWF0aC5oIgogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogI2luY2x1ZGUgImR2Yi1wbGwuaCIKICNpbmNsdWRlICJvcjUxMTMyLmgiCkBAIC02Miw2ICs2Myw3IEBACiAKIAkvKiBEZW1vZHVsYXRvciBwcml2YXRlIGRhdGEgKi8KIAlmZV9tb2R1bGF0aW9uX3QgY3VycmVudF9tb2R1bGF0aW9uOworCXUzMiBzbnI7IC8qIFJlc3VsdCBvZiBsYXN0IFNOUiBjYWxjdWxhdGlvbiAqLwogCiAJLyogVHVuZXIgcHJpdmF0ZSBkYXRhICovCiAJdTMyIGN1cnJlbnRfZnJlcXVlbmN5OwpAQCAtNDY1LDEyNCArNDY3LDEyOCBAQAogCXJldHVybiAwOwogfQogCi0vKiBsb2cxMC0xIHRhYmxlIGF0IC41IGluY3JlbWVudHMgZnJvbSAxIHRvIDEwMC41ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGkxMDB4MjBsb2cxMFtdID0gewotICAgICAwLCAgMzUyLCAgNjAyLCAgNzk1LCAgOTU0LCAxMDg4LCAxMjA0LCAxMzA2LCAxMzk3LCAxNDgwLAotICAxNTU2LCAxNjI1LCAxNjkwLCAxNzUwLCAxODA2LCAxODU4LCAxOTA4LCAxOTU1LCAyMDAwLCAyMDQyLAotICAyMDgyLCAyMTIxLCAyMTU4LCAyMTkzLCAyMjI3LCAyMjYwLCAyMjkyLCAyMzIyLCAyMzUyLCAyMzgwLAotICAyNDA4LCAyNDM0LCAyNDYwLCAyNDg2LCAyNTEwLCAyNTM0LCAyNTU3LCAyNTgwLCAyNjAyLCAyNjIzLAotICAyNjQ0LCAyNjY0LCAyNjg0LCAyNzA0LCAyNzIzLCAyNzQyLCAyNzYwLCAyNzc4LCAyNzk1LCAyODEzLAotICAyODI5LCAyODQ2LCAyODYyLCAyODc4LCAyODk0LCAyOTA5LCAyOTI0LCAyOTM5LCAyOTU0LCAyOTY4LAotICAyOTgyLCAyOTk2LCAzMDEwLCAzMDIzLCAzMDM3LCAzMDUwLCAzMDYyLCAzMDc1LCAzMDg4LCAzMTAwLAotICAzMTEyLCAzMTI0LCAzMTM2LCAzMTQ4LCAzMTU5LCAzMTcwLCAzMTgyLCAzMTkzLCAzMjA0LCAzMjE0LAotICAzMjI1LCAzMjM2LCAzMjQ2LCAzMjU2LCAzMjY2LCAzMjc2LCAzMjg2LCAzMjk2LCAzMzA2LCAzMzE2LAotICAzMzI1LCAzMzM0LCAzMzQ0LCAzMzUzLCAzMzYyLCAzMzcxLCAzMzgwLCAzMzg5LCAzMzk3LCAzNDA2LAotICAzNDE1LCAzNDIzLCAzNDMyLCAzNDQwLCAzNDQ4LCAzNDU2LCAzNDY0LCAzNDcyLCAzNDgwLCAzNDg4LAotICAzNDk2LCAzNTA0LCAzNTExLCAzNTE5LCAzNTI2LCAzNTM0LCAzNTQxLCAzNTQ5LCAzNTU2LCAzNTYzLAotICAzNTcwLCAzNTc3LCAzNTg0LCAzNTkxLCAzNTk4LCAzNjA1LCAzNjEyLCAzNjE5LCAzNjI1LCAzNjMyLAotICAzNjM5LCAzNjQ1LCAzNjUyLCAzNjU4LCAzNjY1LCAzNjcxLCAzNjc3LCAzNjgzLCAzNjkwLCAzNjk2LAotICAzNzAyLCAzNzA4LCAzNzE0LCAzNzIwLCAzNzI2LCAzNzMyLCAzNzM4LCAzNzQ0LCAzNzUwLCAzNzU1LAotICAzNzYxLCAzNzY3LCAzNzcyLCAzNzc4LCAzNzg0LCAzNzg5LCAzNzk1LCAzODAwLCAzODA2LCAzODExLAotICAzODE2LCAzODIyLCAzODI3LCAzODMyLCAzODM4LCAzODQzLCAzODQ4LCAzODUzLCAzODU4LCAzODYzLAotICAzODY4LCAzODc0LCAzODc5LCAzODg0LCAzODg4LCAzODkzLCAzODk4LCAzOTAzLCAzOTA4LCAzOTEzLAotICAzOTE4LCAzOTIyLCAzOTI3LCAzOTMyLCAzOTM2LCAzOTQxLCAzOTQ2LCAzOTUwLCAzOTU1LCAzOTYwLAotICAzOTY0LCAzOTY5LCAzOTczLCAzOTc4LCAzOTgyLCAzOTg2LCAzOTkxLCAzOTk1LCA0MDAwLCA0MDA0LAotfTsKKy8qIENhbGN1bGF0ZSBTTlIgZXN0aW1hdGlvbiAoc2NhbGVkIGJ5IDJeMjQpCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVub21bXSA9IHsxLDEsMTAwLDEwMDAsMTAwMDAsMTAwMDAwLDEwMDAwMDAsMTAwMDAwMDAsMTAwMDAwMDAwfTsKKyAgIDgtVlNCIFNOUiBhbmQgUUFNIGVxdWF0aW9ucyBmcm9tIE9yZW4gZGF0YXNoZWV0cwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGkyMExvZzEwKHVuc2lnbmVkIHNob3J0IHZhbCkKKyAgIEZvciA4LVZTQjoKKyAgICAgU05SW2RCXSA9IDEwICogbG9nMTAoODk3MTUyMDQ0LjgyODIgLyBNU0VeMiApIC0gSworCisgICAgIFdoZXJlIEsgPSAwIGlmIE5UU0MgcmVqZWN0aW9uIGZpbHRlciBpcyBPRkY7IGFuZAorCSAgIEsgPSAzIGlmIE5UU0MgcmVqZWN0aW9uIGZpbHRlciBpcyBPTgorCisgICBGb3IgUUFNNjQ6CisgICAgIFNOUltkQl0gPSAxMCAqIGxvZzEwKDg5NzE1MjA0NC44MjgyIC8gTVNFXjIgKQorCisgICBGb3IgUUFNMjU2OgorICAgICBTTlJbZEJdID0gMTAgKiBsb2cxMCg5MDc4MzI0MjYuMzE0MjY2ICAvIE1TRV4yICkKKworICAgV2UgcmUtd3JpdGUgdGhlIHNuciBlcXVhdGlvbiBhczoKKyAgICAgU05SICogMl4yNCA9IDEwKihjIC0gMippbnRsb2cxMChNU0UpKQorICAgV2hlcmUgZm9yIFFBTTI1NiwgYyA9IGxvZzEwKDkwNzgzMjQyNi4zMTQyNjYpICogMl4yNAorICAgYW5kIGZvciA4LVZTQiBhbmQgUUFNNjQsIGMgPSBsb2cxMCg4OTcxNTIwNDQuODI4MikgKiAyXjI0ICovCisKK3N0YXRpYyB1MzIgY2FsY3VsYXRlX3Nucih1MzIgbXNlLCB1MzIgYykKIHsKLQl1bnNpZ25lZCBpbnQgcm50dmFsID0gMTAwOwotCXVuc2lnbmVkIGludCB0bXAgPSB2YWw7Ci0JdW5zaWduZWQgaW50IGV4cCA9IDE7CisJaWYgKG1zZSA9PSAwKSAvKiBObyBzaWduYWwgKi8KKwkJcmV0dXJuIDA7CiAKLQl3aGlsZSh0bXAgPiAxMDApIHt0bXAgLz0gMTAwOyBleHArKzt9Ci0KLQl2YWwgPSAoMiAqIHZhbCkvZGVub21bZXhwXTsKLQlpZiAoZXhwID4gMSkgcm50dmFsID0gMjAwMCpleHA7Ci0KLQlybnR2YWwgKz0gaTEwMHgyMGxvZzEwW3ZhbF07Ci0JcmV0dXJuIHJudHZhbDsKLX0KLQotc3RhdGljIGludCBvcjUxMTMyX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQotewotCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXVuc2lnbmVkIGNoYXIgcmVjX2J1ZlsyXTsKLQl1bnNpZ25lZCBjaGFyIHNuZF9idWZbMl07Ci0JdTggcmN2cl9zdGF0OwotCXUxNiBzbnJfZXF1OwotCXUzMiBzaWduYWxfc3RyZW5ndGg7Ci0JaW50IHVzSzsKLQotCXNuZF9idWZbMF09MHgwNDsKLQlzbmRfYnVmWzFdPTB4MDI7IC8qIFNOUiBhZnRlciBFcXVhbGl6ZXIgKi8KLQltc2xlZXAoMzApOyAvKiAzMG1zICovCi0JaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3Msc25kX2J1ZiwyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiByZWFkX3N0YXR1cyB3cml0ZSBlcnJvclxuIik7Ci0JCXJldHVybiAtMTsKKwltc2UgPSAyKmludGxvZzEwKG1zZSk7CisJaWYgKG1zZSA+IGMpIHsKKwkJLyogTmVnYXRpdmUgU05SLCB3aGljaCBpcyBwb3NzaWJsZSwgYnV0IHJlYWxpc3RpY2x5IHRoZQorCQlkZW1vZCB3aWxsIGxvc2UgbG9jayBiZWZvcmUgdGhlIHNpZ25hbCBnZXRzIHRoaXMgYmFkLiAgVGhlCisJCUFQSSBvbmx5IGFsbG93cyBmb3IgdW5zaWduZWQgdmFsdWVzLCBzbyBqdXN0IHJldHVybiAwICovCisJCXJldHVybiAwOwogCX0KLQltc2xlZXAoMzApOyAvKiAzMG1zICovCi0JaWYgKGkyY19yZWFkYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcyxyZWNfYnVmLDIpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IHJlYWRfc3RhdHVzIHJlYWQgZXJyb3JcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNucl9lcXUgPSByZWNfYnVmWzBdIHwgKHJlY19idWZbMV0gPDwgOCk7Ci0JZHByaW50aygicmVhZF9zaWduYWxfc3RyZW5ndGggc25yX2VxdSAleCAleCAoJWkpXG4iLHJlY19idWZbMF0scmVjX2J1ZlsxXSxzbnJfZXF1KTsKLQotCS8qIFJlY2VpdmVyIFN0YXR1cyAqLwotCXNuZF9idWZbMF09MHgwNDsKLQlzbmRfYnVmWzFdPTB4MDA7Ci0JbXNsZWVwKDMwKTsgLyogMzBtcyAqLwotCWlmIChpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLHNuZF9idWYsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogcmVhZF9zaWduYWxfc3RyZW5ndGggcmVhZF9zdGF0dXMgd3JpdGUgZXJyb3JcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1zbGVlcCgzMCk7IC8qIDMwbXMgKi8KLQlpZiAoaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLHJlY19idWYsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogcmVhZF9zaWduYWxfc3RyZW5ndGggcmVhZF9zdGF0dXMgcmVhZCBlcnJvclxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZHByaW50aygicmVhZF9zaWduYWxfc3RyZW5ndGggcmVhZF9zdGF0dXMgJXggJXhcbiIscmVjX2J1ZlswXSxyZWNfYnVmWzFdKTsKLQlyY3ZyX3N0YXQgPSByZWNfYnVmWzFdOwotCXVzSyA9IChyY3ZyX3N0YXQgJiAweDEwKSA/IDMgOiAwOwotCi0JLyogVGhlIHZhbHVlIHJlcG9ydGVkIGJhY2sgZnJvbSB0aGUgZnJvbnRlbmQgd2lsbCBiZSBGRkZGPTEwMCUgMDAwMD0wJSAqLwotCXNpZ25hbF9zdHJlbmd0aCA9ICgoKDg5NTIgLSBpMjBMb2cxMChzbnJfZXF1KSAtIHVzSyoxMDApLzMrNSkqNjU1MzUpLzEwMDA7Ci0JaWYgKHNpZ25hbF9zdHJlbmd0aCA+IDB4ZmZmZikKLQkJKnN0cmVuZ3RoID0gMHhmZmZmOwotCWVsc2UKLQkJKnN0cmVuZ3RoID0gc2lnbmFsX3N0cmVuZ3RoOwotCWRwcmludGsoInJlYWRfc2lnbmFsX3N0cmVuZ3RoICVpXG4iLCpzdHJlbmd0aCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gMTAqKGMgLSBtc2UpOwogfQogCiBzdGF0aWMgaW50IG9yNTExMzJfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQogewogCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXVuc2lnbmVkIGNoYXIgcmVjX2J1ZlsyXTsKLQl1bnNpZ25lZCBjaGFyIHNuZF9idWZbMl07Ci0JdTE2IHNucl9lcXU7CisJdTggcmVjX2J1ZlsyXTsKKwl1OCBzbmRfYnVmWzJdOworCXUzMiBub2lzZTsKKwl1MzIgYzsKKwl1MzIgdXNLOwogCisJLyogUmVnaXN0ZXIgaXMgc2FtZSBmb3IgVlNCIG9yIFFBTSBmaXJtd2FyZSAqLwogCXNuZF9idWZbMF09MHgwNDsKIAlzbmRfYnVmWzFdPTB4MDI7IC8qIFNOUiBhZnRlciBFcXVhbGl6ZXIgKi8KIAltc2xlZXAoMzApOyAvKiAzMG1zICovCiAJaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3Msc25kX2J1ZiwyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiByZWFkX3NuciB3cml0ZSBlcnJvclxuIik7Ci0JCXJldHVybiAtMTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc25yIHdyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQogCW1zbGVlcCgzMCk7IC8qIDMwbXMgKi8KIAlpZiAoaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLHJlY19idWYsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogcmVhZF9zbnIgZHZyIHJlYWQgZXJyb3JcbiIpOwotCQlyZXR1cm4gLTE7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IHNuciByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCXNucl9lcXUgPSByZWNfYnVmWzBdIHwgKHJlY19idWZbMV0gPDwgOCk7Ci0JZHByaW50aygicmVhZF9zbnIgc25yX2VxdSAleCAleCAoJWkpXG4iLHJlY19idWZbMF0scmVjX2J1ZlsxXSxzbnJfZXF1KTsKKwlub2lzZSA9IHJlY19idWZbMF0gfCAocmVjX2J1ZlsxXSA8PCA4KTsKKwlkcHJpbnRrKCJyZWFkX3NuciBub2lzZSAleCAleCAoJWkpXG4iLHJlY19idWZbMF0scmVjX2J1ZlsxXSxub2lzZSk7CiAKLQkqc25yID0gMHhGRkZGIC0gc25yX2VxdTsKLQlkcHJpbnRrKCJyZWFkX3NuciAlaVxuIiwqc25yKTsKKwkvKiBSZWFkIHN0YXR1cywgY29udGFpbnMgbW9kdWxhdGlvbiB0eXBlIGZvciBRQU1fQVVUTyBhbmQKKwkgICBOVFNDIGZpbHRlciBmb3IgVlNCICovCisJc25kX2J1ZlswXT0weDA0OworCXNuZF9idWZbMV09MHgwMDsgLyogU3RhdHVzIHJlZ2lzdGVyICovCisJbXNsZWVwKDMwKTsgLyogMzBtcyAqLworCWlmIChpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLHNuZF9idWYsMikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc3RhdHVzIHdyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCW1zbGVlcCgzMCk7IC8qIDMwbXMgKi8KKwlpZiAoaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLHJlY19idWYsMikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc3RhdHVzIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwl1c0sgPSAwOworCXN3aXRjaCAocmVjX2J1ZlswXSkgeworCWNhc2UgMHgwNjoKKwkJdXNLID0gKHJlY19idWZbMV0gJiAweDEwKSA/IDB4MDMwMDAwMDAgOiAwOworCQkvKiBGYWxsIHRocm91Z2ggdG8gUUFNNjQgY2FzZSAqLworCWNhc2UgMHg0MzoKKwkJYyA9IDE1MDIwNDE2NzsKKwkJYnJlYWs7CisJY2FzZSAweDQ1OgorCQljID0gMTUwMjkwMzk2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm9yNTExMzI6IHVua25vd24gc3RhdHVzIDB4JTAyeFxuIiwgcmVjX2J1ZlswXSk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlkcHJpbnRrKCIlczogbW9kdWxhdGlvbiAlMDJ4LCBOVFNDIHJlaiBPJXNcbiIsIF9fRlVOQ1RJT05fXywKKwkJcmVjX2J1ZlswXSwgcmVjX2J1ZlsxXSYweDEwPyJuIjoiZmYiKTsKKworCS8qIENhbGN1bGF0ZSBTTlIgdXNpbmcgbm9pc2UsIGMsIGFuZCBOVFNDIHJlamVjdGlvbiBjb3JyZWN0aW9uICovCisJc3RhdGUtPnNuciA9IGNhbGN1bGF0ZV9zbnIobm9pc2UsIGMpIC0gdXNLOworCSpzbnIgPSAoc3RhdGUtPnNucikgPj4gMTY7CisKKwlkcHJpbnRrKCIlczogbm9pc2UgPSAweCUwOHgsIHNuciA9ICVkLiUwMmQgZEJcbiIsIF9fRlVOQ1RJT05fXywgbm9pc2UsCisJCXN0YXRlLT5zbnIgPj4gMjQsICgoKHN0YXRlLT5zbnI+PjgpICYgMHhmZmZmKSAqIDEwMCkgPj4gMTYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3I1MTEzMl9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzdHJlbmd0aCkKK3sKKwkvKiBDYWxjdWxhdGUgU3RyZW5ndGggZnJvbSBTTlIgdXAgdG8gMzVkQiAqLworCS8qIEV2ZW4gdGhvdWdoIHRoZSBTTlIgY2FuIGdvIGhpZ2hlciB0aGFuIDM1ZEIsIHRoZXJlIGlzIHNvbWUgY29tZm9ydCAqLworCS8qIGZhY3RvciBpbiBoYXZpbmcgYSByYW5nZSBvZiBzdHJvbmcgc2lnbmFscyB0aGF0IGNhbiBzaG93IGF0IDEwMCUgICAqLworCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUxNiBzbnI7CisJaW50IHJldDsKKworCXJldCA9IGZlLT5vcHMucmVhZF9zbnIoZmUsICZzbnIpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwkvKiBSYXRoZXIgdGhhbiB1c2UgdGhlIDguOCB2YWx1ZSBzbnIsIHVzZSBzdGF0ZS0+c25yIHdoaWNoIGlzIDguMjQgKi8KKwkvKiBzY2FsZSB0aGUgcmFuZ2UgMCAtIDM1KjJeMjQgaW50byAwIC0gNjU1MzUgKi8KKwlpZiAoc3RhdGUtPnNuciA+PSA4OTYwICogMHgxMDAwMCkKKwkJKnN0cmVuZ3RoID0gMHhmZmZmOworCWVsc2UKKwkJKnN0cmVuZ3RoID0gc3RhdGUtPnNuciAvIDg5NjA7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5oCmluZGV4IDk3MThiZTQuLmFkZDI0ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuaApAQCAtMzQsNyArMzQsNyBAQAogCWludCAoKnNldF90c19wYXJhbXMpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgaXNfcHVuY3R1cmVkKTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfT1I1MTEzMikgfHwgZGVmaW5lZChDT05GSUdfRFZCX09SNTExMzJfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9PUjUxMTMyKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX09SNTExMzJfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogb3I1MTEzMl9hdHRhY2goY29uc3Qgc3RydWN0IG9yNTExMzJfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuYwppbmRleCAyYmYxMjRiLi4wNDhkN2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMjExLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCisjaW5jbHVkZSAiZHZiX21hdGguaCIKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKICNpbmNsdWRlICJvcjUxMjExLmgiCiAKQEAgLTYzLDYgKzY0LDcgQEAKIAogCS8qIERlbW9kdWxhdG9yIHByaXZhdGUgZGF0YSAqLwogCXU4IGluaXRpYWxpemVkOjE7CisJdTMyIHNucjsgLyogUmVzdWx0IG9mIGxhc3QgU05SIGNsYWN1bGF0aW9uICovCiAKIAkvKiBUdW5lciBwcml2YXRlIGRhdGEgKi8KIAl1MzIgY3VycmVudF9mcmVxdWVuY3k7CkBAIC0yOTIsMTA3ICsyOTQsODEgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogbG9nMTAtMSB0YWJsZSBhdCAuNSBpbmNyZW1lbnRzIGZyb20gMSB0byAxMDAuNSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpMTAweDIwbG9nMTBbXSA9IHsKLQkJMCwgIDM1MiwgIDYwMiwgIDc5NSwgIDk1NCwgMTA4OCwgMTIwNCwgMTMwNiwgMTM5NywgMTQ4MCwKLQkgMTU1NiwgMTYyNSwgMTY5MCwgMTc1MCwgMTgwNiwgMTg1OCwgMTkwOCwgMTk1NSwgMjAwMCwgMjA0MiwKLQkgMjA4MiwgMjEyMSwgMjE1OCwgMjE5MywgMjIyNywgMjI2MCwgMjI5MiwgMjMyMiwgMjM1MiwgMjM4MCwKLQkgMjQwOCwgMjQzNCwgMjQ2MCwgMjQ4NiwgMjUxMCwgMjUzNCwgMjU1NywgMjU4MCwgMjYwMiwgMjYyMywKLQkgMjY0NCwgMjY2NCwgMjY4NCwgMjcwNCwgMjcyMywgMjc0MiwgMjc2MCwgMjc3OCwgMjc5NSwgMjgxMywKLQkgMjgyOSwgMjg0NiwgMjg2MiwgMjg3OCwgMjg5NCwgMjkwOSwgMjkyNCwgMjkzOSwgMjk1NCwgMjk2OCwKLQkgMjk4MiwgMjk5NiwgMzAxMCwgMzAyMywgMzAzNywgMzA1MCwgMzA2MiwgMzA3NSwgMzA4OCwgMzEwMCwKLQkgMzExMiwgMzEyNCwgMzEzNiwgMzE0OCwgMzE1OSwgMzE3MCwgMzE4MiwgMzE5MywgMzIwNCwgMzIxNCwKLQkgMzIyNSwgMzIzNiwgMzI0NiwgMzI1NiwgMzI2NiwgMzI3NiwgMzI4NiwgMzI5NiwgMzMwNiwgMzMxNiwKLQkgMzMyNSwgMzMzNCwgMzM0NCwgMzM1MywgMzM2MiwgMzM3MSwgMzM4MCwgMzM4OSwgMzM5NywgMzQwNiwKLQkgMzQxNSwgMzQyMywgMzQzMiwgMzQ0MCwgMzQ0OCwgMzQ1NiwgMzQ2NCwgMzQ3MiwgMzQ4MCwgMzQ4OCwKLQkgMzQ5NiwgMzUwNCwgMzUxMSwgMzUxOSwgMzUyNiwgMzUzNCwgMzU0MSwgMzU0OSwgMzU1NiwgMzU2MywKLQkgMzU3MCwgMzU3NywgMzU4NCwgMzU5MSwgMzU5OCwgMzYwNSwgMzYxMiwgMzYxOSwgMzYyNSwgMzYzMiwKLQkgMzYzOSwgMzY0NSwgMzY1MiwgMzY1OCwgMzY2NSwgMzY3MSwgMzY3NywgMzY4MywgMzY5MCwgMzY5NiwKLQkgMzcwMiwgMzcwOCwgMzcxNCwgMzcyMCwgMzcyNiwgMzczMiwgMzczOCwgMzc0NCwgMzc1MCwgMzc1NSwKLQkgMzc2MSwgMzc2NywgMzc3MiwgMzc3OCwgMzc4NCwgMzc4OSwgMzc5NSwgMzgwMCwgMzgwNiwgMzgxMSwKLQkgMzgxNiwgMzgyMiwgMzgyNywgMzgzMiwgMzgzOCwgMzg0MywgMzg0OCwgMzg1MywgMzg1OCwgMzg2MywKLQkgMzg2OCwgMzg3NCwgMzg3OSwgMzg4NCwgMzg4OCwgMzg5MywgMzg5OCwgMzkwMywgMzkwOCwgMzkxMywKLQkgMzkxOCwgMzkyMiwgMzkyNywgMzkzMiwgMzkzNiwgMzk0MSwgMzk0NiwgMzk1MCwgMzk1NSwgMzk2MCwKLQkgMzk2NCwgMzk2OSwgMzk3MywgMzk3OCwgMzk4MiwgMzk4NiwgMzk5MSwgMzk5NSwgNDAwMCwgNDAwNCwKLX07CisvKiBDYWxjdWxhdGUgU05SIGVzdGltYXRpb24gKHNjYWxlZCBieSAyXjI0KQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGRlbm9tW10gPSB7MSwxLDEwMCwxMDAwLDEwMDAwLDEwMDAwMCwxMDAwMDAwLDEwMDAwMDAwLDEwMDAwMDAwMH07CisgICA4LVZTQiBTTlIgZXF1YXRpb24gZnJvbSBPcmVuIGRhdGFzaGVldHMKIAotc3RhdGljIHVuc2lnbmVkIGludCBpMjBMb2cxMCh1bnNpZ25lZCBzaG9ydCB2YWwpCisgICBGb3IgOC1WU0I6CisgICAgIFNOUltkQl0gPSAxMCAqIGxvZzEwKDIxOTAzNy45NDU0IC8gTVNFXjIgKQorCisgICBXZSByZS13cml0ZSB0aGUgc25yIGVxdWF0aW9uIGFzOgorICAgICBTTlIgKiAyXjI0ID0gMTAqKGMgLSAyKmludGxvZzEwKE1TRSkpCisgICBXaGVyZSBmb3IgOC1WU0IsIGMgPSBsb2cxMCgyMTkwMzcuOTQ1NCkgKiAyXjI0ICovCisKK3N0YXRpYyB1MzIgY2FsY3VsYXRlX3Nucih1MzIgbXNlLCB1MzIgYykKIHsKLQl1bnNpZ25lZCBpbnQgcm50dmFsID0gMTAwOwotCXVuc2lnbmVkIGludCB0bXAgPSB2YWw7Ci0JdW5zaWduZWQgaW50IGV4cCA9IDE7CisJaWYgKG1zZSA9PSAwKSAvKiBObyBzaWduYWwgKi8KKwkJcmV0dXJuIDA7CiAKLQl3aGlsZSh0bXAgPiAxMDApIHt0bXAgLz0gMTAwOyBleHArKzt9Ci0KLQl2YWwgPSAoMiAqIHZhbCkvZGVub21bZXhwXTsKLQlpZiAoZXhwID4gMSkgcm50dmFsID0gMjAwMCpleHA7Ci0KLQlybnR2YWwgKz0gaTEwMHgyMGxvZzEwW3ZhbF07Ci0JcmV0dXJuIHJudHZhbDsKLX0KLQotc3RhdGljIGludCBvcjUxMjExX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQotewotCXN0cnVjdCBvcjUxMjExX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IHJlY19idWZbMl07Ci0JdTggc25kX2J1Zls0XTsKLQl1OCBzbnJfZXF1OwotCXUzMiBzaWduYWxfc3RyZW5ndGg7Ci0KLQkvKiBTTlIgYWZ0ZXIgRXF1YWxpemVyICovCi0Jc25kX2J1ZlswXSA9IDB4MDQ7Ci0Jc25kX2J1ZlsxXSA9IDB4MDA7Ci0Jc25kX2J1ZlsyXSA9IDB4MDQ7Ci0Jc25kX2J1ZlszXSA9IDB4MDA7Ci0KLQlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcyxzbmRfYnVmLDMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTEyMTE6IHJlYWRfc3RhdHVzIHdyaXRlIGVycm9yXG4iKTsKLQkJcmV0dXJuIC0xOworCW1zZSA9IDIqaW50bG9nMTAobXNlKTsKKwlpZiAobXNlID4gYykgeworCQkvKiBOZWdhdGl2ZSBTTlIsIHdoaWNoIGlzIHBvc3NpYmxlLCBidXQgcmVhbGlzdGljbHkgdGhlCisJCWRlbW9kIHdpbGwgbG9zZSBsb2NrIGJlZm9yZSB0aGUgc2lnbmFsIGdldHMgdGhpcyBiYWQuICBUaGUKKwkJQVBJIG9ubHkgYWxsb3dzIGZvciB1bnNpZ25lZCB2YWx1ZXMsIHNvIGp1c3QgcmV0dXJuIDAgKi8KKwkJcmV0dXJuIDA7CiAJfQotCW1zbGVlcCgzKTsKLQlpZiAoaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLHJlY19idWYsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTIxMTogcmVhZF9zdGF0dXMgcmVhZCBlcnJvclxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc25yX2VxdSA9IHJlY19idWZbMF0gJiAweGZmOwotCi0JLyogVGhlIHZhbHVlIHJlcG9ydGVkIGJhY2sgZnJvbSB0aGUgZnJvbnRlbmQgd2lsbCBiZSBGRkZGPTEwMCUgMDAwMD0wJSAqLwotCXNpZ25hbF9zdHJlbmd0aCA9ICgoKDUzMzQgLSBpMjBMb2cxMChzbnJfZXF1KSkvMys1KSo2NTUzNSkvMTAwMDsKLQlpZiAoc2lnbmFsX3N0cmVuZ3RoID4gMHhmZmZmKQotCQkqc3RyZW5ndGggPSAweGZmZmY7Ci0JZWxzZQotCQkqc3RyZW5ndGggPSBzaWduYWxfc3RyZW5ndGg7Ci0JZHByaW50aygicmVhZF9zaWduYWxfc3RyZW5ndGggJWlcbiIsKnN0cmVuZ3RoKTsKLQotCXJldHVybiAwOworCXJldHVybiAxMCooYyAtIG1zZSk7CiB9CiAKIHN0YXRpYyBpbnQgb3I1MTIxMV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzbnIpCiB7CiAJc3RydWN0IG9yNTEyMTFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJdTggcmVjX2J1ZlsyXTsKLQl1OCBzbmRfYnVmWzRdOworCXU4IHNuZF9idWZbM107CiAKIAkvKiBTTlIgYWZ0ZXIgRXF1YWxpemVyICovCiAJc25kX2J1ZlswXSA9IDB4MDQ7CiAJc25kX2J1ZlsxXSA9IDB4MDA7CiAJc25kX2J1ZlsyXSA9IDB4MDQ7Ci0Jc25kX2J1ZlszXSA9IDB4MDA7CiAKIAlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcyxzbmRfYnVmLDMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTEyMTE6IHJlYWRfc3RhdHVzIHdyaXRlIGVycm9yXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGVycm9yIHdyaXRpbmcgc25yIHJlZ1xuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtMTsKIAl9Ci0JbXNsZWVwKDMpOwogCWlmIChpMmNfcmVhZGJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MscmVjX2J1ZiwyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMjExOiByZWFkX3N0YXR1cyByZWFkIGVycm9yXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlYWRfc3RhdHVzIHJlYWQgZXJyb3JcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLTE7CiAJfQotCSpzbnIgPSByZWNfYnVmWzBdICYgMHhmZjsKIAotCWRwcmludGsoInJlYWRfc25yICVpXG4iLCpzbnIpOworCXN0YXRlLT5zbnIgPSBjYWxjdWxhdGVfc25yKHJlY19idWZbMF0sIDg5NTk5MDQ3KTsKKwkqc25yID0gKHN0YXRlLT5zbnIpID4+IDE2OworCisJZHByaW50aygiJXM6IG5vaXNlID0gMHglMDJ4LCBzbnIgPSAlZC4lMDJkIGRCXG4iLCBfX0ZVTkNUSU9OX18sIHJlY19idWZbMF0sCisJCXN0YXRlLT5zbnIgPj4gMjQsICgoKHN0YXRlLT5zbnI+PjgpICYgMHhmZmZmKSAqIDEwMCkgPj4gMTYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3I1MTIxMV9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzdHJlbmd0aCkKK3sKKwkvKiBDYWxjdWxhdGUgU3RyZW5ndGggZnJvbSBTTlIgdXAgdG8gMzVkQiAqLworCS8qIEV2ZW4gdGhvdWdoIHRoZSBTTlIgY2FuIGdvIGhpZ2hlciB0aGFuIDM1ZEIsIHRoZXJlIGlzIHNvbWUgY29tZm9ydCAqLworCS8qIGZhY3RvciBpbiBoYXZpbmcgYSByYW5nZSBvZiBzdHJvbmcgc2lnbmFscyB0aGF0IGNhbiBzaG93IGF0IDEwMCUgICAqLworCXN0cnVjdCBvcjUxMjExX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3Qgb3I1MTIxMV9zdGF0ZSopZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTE2IHNucjsKKwlpbnQgcmV0OworCisJcmV0ID0gZmUtPm9wcy5yZWFkX3NucihmZSwgJnNucik7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gcmV0OworCS8qIFJhdGhlciB0aGFuIHVzZSB0aGUgOC44IHZhbHVlIHNuciwgdXNlIHN0YXRlLT5zbnIgd2hpY2ggaXMgOC4yNCAqLworCS8qIHNjYWxlIHRoZSByYW5nZSAwIC0gMzUqMl4yNCBpbnRvIDAgLSA2NTUzNSAqLworCWlmIChzdGF0ZS0+c25yID49IDg5NjAgKiAweDEwMDAwKQorCQkqc3RyZW5ndGggPSAweGZmZmY7CisJZWxzZQorCQkqc3RyZW5ndGggPSBzdGF0ZS0+c25yIC8gODk2MDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMjExLmgKaW5kZXggMTBhNTQxOS4uOGFhZDg0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5oCkBAIC0zNyw3ICszNyw3IEBACiAJdm9pZCAoKnNsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICogZmUpOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9PUjUxMjExKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfT1I1MTIxMV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX09SNTEyMTEpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfT1I1MTIxMV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBvcjUxMjExX2F0dGFjaChjb25zdCBzdHJ1Y3Qgb3I1MTIxMV9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oCmluZGV4IGVmYzU0ZDcuLjE1NTU4NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApAQCAtMzQsNyArMzQsNyBAQAogCXU4IGludmVydDoxOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9TNUgxNDIwKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfUzVIMTQyMF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1M1SDE0MjApIHx8IChkZWZpbmVkKENPTkZJR19EVkJfUzVIMTQyMF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzNWgxNDIwX2F0dGFjaChjb25zdCBzdHJ1Y3QgczVoMTQyMF9jb25maWcqIGNvbmZpZywKIAkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmgKaW5kZXggNGNmMjdkMy4uOTA5Y2VmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuaApAQCAtMzUsNyArMzUsNyBAQAogCWludCAoKnJlcXVlc3RfZmlybXdhcmUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciogbmFtZSk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3MCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3MF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3MCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9TUDg4NzBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogc3A4ODcwX2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3A4ODcwX2NvbmZpZyogY29uZmlnLAogCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmgKaW5kZXggY2FiN2VhNi4uN2VlNzhkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guaApAQCAtMTcsNyArMTcsNyBAQAogCWludCAoKnJlcXVlc3RfZmlybXdhcmUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciogbmFtZSk7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3WCkgfHwgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3WF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NQODg3WCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9TUDg4N1hfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogc3A4ODd4X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3A4ODd4X2NvbmZpZyogY29uZmlnLAogCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuaAppbmRleCA3NjBiODBkLi42OWY0NTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmgKQEAgLTQyLDcgKzQyLDcgQEAKIAl1OCBzdG9wX2R1cmluZ19yZWFkOjE7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1NUVjAyOTcpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9TVFYwMjk3X01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfU1RWMDI5NykgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9TVFYwMjk3X01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHN0djAyOTdfYXR0YWNoKGNvbnN0IHN0cnVjdCBzdHYwMjk3X2NvbmZpZyogY29uZmlnLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmgKaW5kZXggN2VmMjUyMC4uMzNkZjk0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oCkBAIC04OSw3ICs4OSw3IEBACiAJaW50ICgqc2V0X3N5bWJvbF9yYXRlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyIHNyYXRlLCB1MzIgcmF0aW8pOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9TVFYwMjk5KSB8fCBkZWZpbmVkKENPTkZJR19EVkJfU1RWMDI5OV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1NUVjAyOTkpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfU1RWMDI5OV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzdHYwMjk5X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyMS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKaW5kZXggZDY4YWUyMC4uZTNkYTc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmgKQEAgLTMyLDcgKzMyLDcgQEAKIAl1OCBkZW1vZF9hZGRyZXNzOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UREExMDAyMSkgfHwgZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDIxX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwMjEpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwMjFfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwMjFfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDAyMV9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLCB1OCBwd20pOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKaW5kZXggMTFlMGRjYS4uMDBlNGJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKQEAgLTY0OCwxOCArNjQ4LDI0IEBACiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MGEpOyAvLyBBR0Mgc2V0dXAKIAkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDAwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCiAJCWJyZWFrOwotCWNhc2UgVERBMTAwNDZfQUdDX1REQTgyN1g6CisJY2FzZSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDExOgogCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAweDAyKTsgICAvLyBBR0Mgc2V0dXAKIAkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfVEhSLCAweDcwKTsgICAgLy8gQUdDIFRocmVzaG9sZAogCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19SRU5PUk0sIDB4MDgpOyAvLyBHYWluIFJlbm9ybWFsaXplCiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORl9QT0xBUklUWSwgMHg2YSk7IC8vIHNldCBBR0MgcG9sYXJpdGllcwogCQlicmVhazsKLQljYXNlIFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQTDoKKwljYXNlIFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMDA6CiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MDIpOyAgIC8vIEFHQyBzZXR1cAogCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19USFIsIDB4NzApOyAgICAvLyBBR0MgVGhyZXNob2xkCiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1JFTk9STSwgMHgwOCk7IC8vIEdhaW4gUmVub3JtYWxpemUKIAkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDYwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCiAJCWJyZWFrOworCWNhc2UgVERBMTAwNDZfQUdDX1REQTgyN1hfR1AwMToKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfQ09ORiwgMHgwMik7ICAgLy8gQUdDIHNldHVwCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1RIUiwgMHg3MCk7ICAgIC8vIEFHQyBUaHJlc2hvbGQKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfUkVOT1JNLCAweDA4KTsgLy8gR2FpbiBSZW5vcm1hbGl6ZQorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4NjIpOyAvLyBzZXQgQUdDIHBvbGFyaXRpZXMKKwkJYnJlYWs7CiAJfQogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9DT05GQURDMiwgMHgzOCk7CiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1RSSVNUQVRFMSwgMHg2MSk7IC8vIFR1cm4gYm90aCBBR0Mgb3V0cHV0cyBvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaAppbmRleCBlMjhmY2EwLi5lYzUwMmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaApAQCAtMzUsOCArMzUsOSBAQAogCVREQTEwMDQ2X0FHQ19ERUZBVUxULAkJLyogb3JpZ2luYWwgY29uZmlndXJhdGlvbiAqLwogCVREQTEwMDQ2X0FHQ19JRk9fQVVUT19ORUcsCS8qIElGIEFHQyBvbmx5LCBhdXRvbWF0aWMsIG5lZ3RpdmUgKi8KIAlUREExMDA0Nl9BR0NfSUZPX0FVVE9fUE9TLAkvKiBJRiBBR0Mgb25seSwgYXV0b21hdGljLCBwb3NpdGl2ZSAqLwotCVREQTEwMDQ2X0FHQ19UREE4MjdYLAkJLyogSUYgQUdDIG9ubHksIHNwZWNpYWwgc2V0dXAgZm9yIHRkYTgyN3ggKi8KLQlUREExMDA0Nl9BR0NfVERBODI3WF9HUEwsCS8qIHNhbWUgYXMgYWJvdmUsIGJ1dCBHUElPcyAwICovCisJVERBMTAwNDZfQUdDX1REQTgyN1hfR1AxMSwJLyogSUYgQUdDIG9ubHksIHNwZWNpYWwgc2V0dXAgZm9yIHRkYTgyN3ggKi8KKwlUREExMDA0Nl9BR0NfVERBODI3WF9HUDAwLAkvKiBzYW1lIGFzIGFib3ZlLCBidXQgR1BJT3MgMCAqLworCVREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMDEsCS8qIHNhbWUgYXMgYWJvdmUsIGJ1dCBHUElPMz0wIEdQSU8xPTEqLwogfTsKIAogZW51bSB0ZGExMDA0Nl9pZiB7CkBAIC03MSw3ICs3Miw3IEBACiAJaW50ICgqcmVxdWVzdF9maXJtd2FyZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKTsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwNFgpIHx8IGRlZmluZWQoQ09ORklHX0RWQl9UREExMDA0WF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDRYKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDRYX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDQ1X2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDg2LmMKaW5kZXggNzQ1NmIwYi4uNGMyN2EyZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5jCkBAIC00NDEsNiArNDQxLDEwIEBACiAKIAlkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKKwkvLyBjaGVjayBmb3IgaW52YWxpZCBzeW1ib2wgcmF0ZQorCWlmIChmZV9wYXJhbXMtPnUucXBzay5zeW1ib2xfcmF0ZSA8IDUwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvLyBjYWxjdWxhdGUgdGhlIHVwZGF0ZWQgZnJlcXVlbmN5IChub3RlOiB3ZSBjb252ZXJ0IGZyb20gSHotPmtIeikKIAl0bXA2NCA9IHRkYTEwMDg2X3JlYWRfYnl0ZShzdGF0ZSwgMHg1Mik7CiAJdG1wNjQgfD0gKHRkYTEwMDg2X3JlYWRfYnl0ZShzdGF0ZSwgMHg1MSkgPDwgOCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwODYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5oCmluZGV4IGU4MDYxZGIuLmVkNTg0YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA4Ni5oCkBAIC0zNSw3ICszNSwxNiBAQAogCXU4IGludmVydDsKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwODYpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwODZfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwODZfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDA4Nl9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDg2X2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwODZfY29uZmlnKiBjb25maWcsCisJCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLy8gQ09ORklHX0RWQl9UREExMDA4NgogCiAjZW5kaWYgLy8gVERBMTAwODZfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmMKaW5kZXggM2FhNDVlYi4uNjc0MTVjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5jCkBAIC0yNjIsMTIgKzI2MiwyOSBAQAogCWlmIChzeW5jICYgMHgxMCkKIAkJKnN0YXR1cyB8PSBGRV9IQVNfU1lOQzsKIAorCWlmIChzeW5jICYgMHgyMCkgLyogZnJvbnRlbmQgY2FuIG5vdCBsb2NrICovCisJCSpzdGF0dXMgfD0gRkVfVElNRURPVVQ7CisKIAlpZiAoKHN5bmMgJiAweDFmKSA9PSAweDFmKQogCQkqc3RhdHVzIHw9IEZFX0hBU19MT0NLOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdGRhODA4M19yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCit7CisJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJaW50IHJldDsKKwl1OCBidWZbM107CisKKwlpZiAoKHJldCA9IHRkYTgwODNfcmVhZHJlZ3Moc3RhdGUsIDB4MGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSkKKwkJcmV0dXJuIHJldDsKKworCSpiZXIgPSAoKGJ1ZlswXSAmIDB4MWYpIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMl07CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB0ZGE4MDgzX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQogewogCXN0cnVjdCB0ZGE4MDgzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtMjg4LDYgKzMwNSwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHRkYTgwODNfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgdGRhODA4M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCSp1Y2Jsb2NrcyA9IHRkYTgwODNfcmVhZHJlZyhzdGF0ZSwgMHgwZik7CisJaWYgKCp1Y2Jsb2NrcyA9PSAweGZmKQorCQkqdWNibG9ja3MgPSAweGZmZmZmZmZmOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdGRhODA4M19zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKIAlzdHJ1Y3QgdGRhODA4M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTQ0MCw2ICs0NjgsOCBAQAogCS5yZWFkX3N0YXR1cyA9IHRkYTgwODNfcmVhZF9zdGF0dXMsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gdGRhODA4M19yZWFkX3NpZ25hbF9zdHJlbmd0aCwKIAkucmVhZF9zbnIgPSB0ZGE4MDgzX3JlYWRfc25yLAorCS5yZWFkX2JlciA9IHRkYTgwODNfcmVhZF9iZXIsCisJLnJlYWRfdWNibG9ja3MgPSB0ZGE4MDgzX3JlYWRfdWNibG9ja3MsCiAKIAkuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IHRkYTgwODNfc2VuZF9kaXNlcWNfbXNnLAogCS5kaXNlcWNfc2VuZF9idXJzdCA9IHRkYTgwODNfZGlzZXFjX3NlbmRfYnVyc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuaAppbmRleCBhYWUxNWJkLi4yZDMzMDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmgKQEAgLTM1LDcgKzM1LDcgQEAKIAl1OCBkZW1vZF9hZGRyZXNzOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UREE4MDgzKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfVERBODA4M19NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1REQTgwODMpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVERBODA4M19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB0ZGE4MDgzX2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhODA4M19jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MjZ4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2eC5jCmluZGV4IGVlYWIyNmIuLjc5Zjk3MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MjZ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyNnguYwpAQCAtNDIsOCArNDIsNyBAQAogCiBzdGF0aWMgaW50IHRkYTgyNnhfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKLQlpZiAoZmUtPnR1bmVyX3ByaXYpCi0JCWtmcmVlKGZlLT50dW5lcl9wcml2KTsKKwlrZnJlZShmZS0+dHVuZXJfcHJpdik7CiAJZmUtPnR1bmVyX3ByaXYgPSBOVUxMOwogCXJldHVybiAwOwogfQpAQCAtMTIxLDcgKzEyMCw3IEBACiAJLmluZm8gPSB7CiAJCS5uYW1lID0gIlBoaWxpcHMgVERBODI2WCIsCiAJCS5mcmVxdWVuY3lfbWluID0gOTUwMDAwLAotCQkuZnJlcXVlbmN5X21pbiA9IDIxNzUwMDAKKwkJLmZyZXF1ZW5jeV9tYXggPSAyMTc1MDAwCiAJfSwKIAkucmVsZWFzZSA9IHRkYTgyNnhfcmVsZWFzZSwKIAkuc2xlZXAgPSB0ZGE4MjZ4X3NsZWVwLApAQCAtMTMzLDE4ICsxMzIsMjEgQEAKIHsKIAlzdHJ1Y3QgdGRhODI2eF9wcml2ICpwcml2ID0gTlVMTDsKIAl1OCBiMSBbXSA9IHsgMCwgMCB9OwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBhZGRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGIxLCAubGVuID0gMiB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKKwkJeyAuYWRkciA9IGFkZHIsIC5mbGFncyA9IDAsICAgICAgICAuYnVmID0gTlVMTCwgLmxlbiA9IDAgfSwKKwkJeyAuYWRkciA9IGFkZHIsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjEsIC5sZW4gPSAyIH0KKwl9OwogCWludCByZXQ7CiAKIAlkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQogCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwotCXJldCA9IGkyY190cmFuc2ZlciAoaTJjLCAmbXNnLCAxKTsKKwlyZXQgPSBpMmNfdHJhbnNmZXIgKGkyYywgbXNnLCAyKTsKIAlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQogCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOwogCi0JaWYgKHJldCAhPSAxKQorCWlmIChyZXQgIT0gMikKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKCEoYjFbMV0gJiAweDgwKSkKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyNnguaAppbmRleCAzMzA3NjA3Li5hZDk5ODExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI2eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MjZ4LmgKQEAgLTM1LDYgKzM1LDE5IEBACiAgKiBAcGFyYW0gaGFzX2xvb3B0aHJvdWdoIFNldCB0byAxIGlmIHRoZSBjYXJkIGhhcyBhIGxvb3B0aHJvdWdoIFJGIGNvbm5lY3Rvci4KICAqIEByZXR1cm4gRkUgcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCiAgKi8KLWV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICp0ZGE4MjZ4X2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGFkZHIsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBpbnQgaGFzX2xvb3B0aHJvdWdoKTsKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBODI2WCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9UREE4MjZYX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTgyNnhfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgYWRkciwKKwkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJCSAgIGludCBoYXNfbG9vcHRocm91Z2gpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhODI2eF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQkgIGludCBhZGRyLAorCQkJCQkJICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKKwkJCQkJCSAgaW50IGhhc19sb29wdGhyb3VnaCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLy8gQ09ORklHX0RWQl9UREE4MjZYCiAKLSNlbmRpZgorI2VuZGlmIC8vIF9fRFZCX1REQTgyNlhfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdHVhNjEwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3R1YTYxMDAuYwppbmRleCA4ODU1NDM5Li42YmEwMDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdHVhNjEwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90dWE2MTAwLmMKQEAgLTQzLDggKzQzLDcgQEAKIAogc3RhdGljIGludCB0dWE2MTAwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7Ci0JaWYgKGZlLT50dW5lcl9wcml2KQotCQlrZnJlZShmZS0+dHVuZXJfcHJpdik7CisJa2ZyZWUoZmUtPnR1bmVyX3ByaXYpOwogCWZlLT50dW5lcl9wcml2ID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90dWE2MTAwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdHVhNjEwMC5oCmluZGV4IDhmOTgwMzMuLjAzYTY2NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90dWE2MTAwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3R1YTYxMDAuaApAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogCi0jaWYgZGVmaW5lZChDT05GSUdfRFZCX1RVQTYxMDApIHx8IGRlZmluZWQoQ09ORklHX0RWQl9UVUE2MTAwX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVFVBNjEwMCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9UVUE2MTAwX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnR1YTYxMDBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgYWRkciwgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCogdHVhNjEwMF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBhZGRyLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5oCmluZGV4IGYwYzlkZGUuLmU0YTJhMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuaApAQCAtNDEsNyArNDEsNyBAQAogCXU4IHNlbGFnYzoxOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9WRVMxODIwKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfVkVTMTgyMF9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1ZFUzE4MjApIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVkVTMTgyMF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB2ZXMxODIwX2F0dGFjaChjb25zdCBzdHJ1Y3QgdmVzMTgyMF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMsIHU4IHB3bSk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxeDkzLmgKaW5kZXggMzk1ZmVkMy4uZDUwN2Y4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5oCkBAIC00MCw3ICs0MCw3IEBACiAJdTggaW52ZXJ0X3B3bToxOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9WRVMxWDkzKSB8fCBkZWZpbmVkKENPTkZJR19EVkJfVkVTMVg5M19NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1ZFUzFYOTMpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVkVTMVg5M19NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB2ZXMxeDkzX2F0dGFjaChjb25zdCBzdHJ1Y3QgdmVzMXg5M19jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5oCmluZGV4IDc5YTk0NzIuLjBiYzAxMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3psMTAzNTMuaApAQCAtMzYsNyArMzYsNyBAQAogCWludCBwYXJhbGxlbF90czsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19EVkJfWkwxMDM1MykgfHwgZGVmaW5lZChDT05GSUdfRFZCX1pMMTAzNTNfTU9EVUxFKQorI2lmIGRlZmluZWQoQ09ORklHX0RWQl9aTDEwMzUzKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1pMMTAzNTNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogemwxMDM1M19hdHRhY2goY29uc3Qgc3RydWN0IHpsMTAzNTNfY29uZmlnICpjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKaW5kZXggOGU0Y2UxMC4uZmZkYTcxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYwpAQCAtNjUwLDcgKzY1MCw3IEBACiAJLyogZHZiICovCiAJcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJnBsdXRvLT5kdmJfYWRhcHRlciwgRFJJVkVSX05BTUUsIFRISVNfTU9EVUxFLCAmcGRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfaTJjX2JpdF9kZWxfYnVzOworCQlnb3RvIGVycl9pMmNfZGVsX2FkYXB0ZXI7CiAKIAlkdmJfYWRhcHRlciA9ICZwbHV0by0+ZHZiX2FkYXB0ZXI7CiAKQEAgLTcxMiw4ICs3MTIsOCBAQAogCWR2Yl9kbXhfcmVsZWFzZShkdmJkZW11eCk7CiBlcnJfZHZiX3VucmVnaXN0ZXJfYWRhcHRlcjoKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGR2Yl9hZGFwdGVyKTsKLWVycl9pMmNfYml0X2RlbF9idXM6Ci0JaTJjX2JpdF9kZWxfYnVzKCZwbHV0by0+aTJjX2FkYXApOworZXJyX2kyY19kZWxfYWRhcHRlcjoKKwlpMmNfZGVsX2FkYXB0ZXIoJnBsdXRvLT5pMmNfYWRhcCk7CiBlcnJfcGx1dG9faHdfZXhpdDoKIAlwbHV0b19od19leGl0KHBsdXRvKTsKIGVycl9mcmVlX2lycToKQEAgLTc0OCw3ICs3NDgsNyBAQAogCWR2Yl9kbXhkZXZfcmVsZWFzZSgmcGx1dG8tPmRteGRldik7CiAJZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGR2Yl9hZGFwdGVyKTsKLQlpMmNfYml0X2RlbF9idXMoJnBsdXRvLT5pMmNfYWRhcCk7CisJaTJjX2RlbF9hZGFwdGVyKCZwbHV0by0+aTJjX2FkYXApOwogCXBsdXRvX2h3X2V4aXQocGx1dG8pOwogCWZyZWVfaXJxKHBkZXYtPmlycSwgcGx1dG8pOwogCXBjaV9pb3VubWFwKHBkZXYsIHBsdXRvLT5pb19tZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKaW5kZXggOTU1MzFhNi4uZWVjN2NjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCkBAIC05Miw2ICs5Miw3IEBACiAJc2VsZWN0IERWQl9TVFYwMjk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9UREExMDA0WCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfTE5CUDIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IFZJREVPX0lSCiAJaGVscAogCSAgU3VwcG9ydCBmb3Igc2ltcGxlIFNBQTcxNDYgYmFzZWQgRFZCIGNhcmRzCiAJICAoc28gY2FsbGVkIEJ1ZGdldC0gb3IgTm92YS1QQ0kgY2FyZHMpIHdpdGhvdXQgb25ib2FyZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYwppbmRleCBiYmEyM2JjLi4zNjZjMTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYwpAQCAtMjgyOCw3ICsyODI4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBhdjcxMTBfZXh0ZW5zaW9uID0gewogCS5uYW1lCQk9ICJkdmIiLAotCS5mbGFncwkJPSBTQUE3MTQ2X0kyQ19TSE9SVF9ERUxBWSwKKwkuZmxhZ3MJCT0gU0FBNzE0Nl9VU0VfSTJDX0lSUSwKIAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJLnBjaV90YmwJPSAmcGNpX3RibFswXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9pci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKaW5kZXggZDU0YmJjZC4uZTQ1NDRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMKQEAgLTQ4LDcgKzQ4LDggQEAKIAlpZiAoIWRhdGEgfHwgIXRlc3RfYml0KGRhdGEsIGlucHV0X2Rldi0+a2V5KSkKIAkJcmV0dXJuOwogCi0JaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGRhdGEsICEhMCk7CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9kZXYsIGRhdGEsIDApOworCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKIH0KIAogCkBAIC0xMTUsMTQgKzExNiwxNyBAQAogCQlkZWxfdGltZXIoJmtleXVwX3RpbWVyKTsKIAkJaWYgKGtleXVwX3RpbWVyLmRhdGEgIT0ga2V5Y29kZSB8fCBuZXdfdG9nZ2xlICE9IG9sZF90b2dnbGUpIHsKIAkJCWRlbGF5X3RpbWVyX2ZpbmlzaGVkID0gMDsKLQkJCWlucHV0X2V2ZW50KGlucHV0X2RldiwgRVZfS0VZLCBrZXl1cF90aW1lci5kYXRhLCAhITApOwotCQkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsICEwKTsKLQkJfSBlbHNlCi0JCQlpZiAoZGVsYXlfdGltZXJfZmluaXNoZWQpCi0JCQkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsIDIpOworCQkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleXVwX3RpbWVyLmRhdGEsIDApOworCQkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsIDEpOworCQkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOworCQl9IGVsc2UgaWYgKGRlbGF5X3RpbWVyX2ZpbmlzaGVkKSB7CisJCQlpbnB1dF9ldmVudChpbnB1dF9kZXYsIEVWX0tFWSwga2V5Y29kZSwgMik7CisJCQlpbnB1dF9zeW5jKGlucHV0X2Rldik7CisJCX0KIAl9IGVsc2UgewogCQlkZWxheV90aW1lcl9maW5pc2hlZCA9IDA7Ci0JCWlucHV0X2V2ZW50KGlucHV0X2RldiwgRVZfS0VZLCBrZXljb2RlLCAhMCk7CisJCWlucHV0X2V2ZW50KGlucHV0X2RldiwgRVZfS0VZLCBrZXljb2RlLCAxKTsKKwkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOwogCX0KIAogCWtleXVwX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVVBfVElNRU9VVDsKQEAgLTIxMSw2ICsyMTUsNyBAQAogaW50IF9fZGV2aW5pdCBhdjcxMTBfaXJfaW5pdChzdHJ1Y3QgYXY3MTEwICphdjcxMTApCiB7CiAJc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKKwlpbnQgZXJyOwogCiAJaWYgKGF2X2NudCA+PSBzaXplb2YgYXZfbGlzdC9zaXplb2YgYXZfbGlzdFswXSkKIAkJcmV0dXJuIC1FTk9TUEM7CkBAIC0yMzEsNyArMjM2LDExIEBACiAJCXNldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKIAkJc2V0X2JpdChFVl9SRVAsIGlucHV0X2Rldi0+ZXZiaXQpOwogCQlpbnB1dF9yZWdpc3Rlcl9rZXlzKCk7Ci0JCWlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwkJaWYgKGVycikgeworCQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAkJaW5wdXRfZGV2LT50aW1lci5mdW5jdGlvbiA9IGlucHV0X3JlcGVhdF9rZXk7CiAKIAkJZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJhdjcxMTBfaXIiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYwppbmRleCAyMjM1ZmY4Li44OWFiNGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYwpAQCAtMzYwLDcgKzM2MCw3IEBACiAJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsKIAogCS8qIEVuYWJsZSBERUJJIHBpbnMgKi8KLQlzYWE3MTQ2X3dyaXRlKHNhYSwgTUMxLCBzYWE3MTQ2X3JlYWQoc2FhLCBNQzEpIHwgKDB4ODAwIDw8IDE2KSB8IDB4ODAwKTsKKwlzYWE3MTQ2X3dyaXRlKHNhYSwgTUMxLCBNQVNLXzI3IHwgTUFTS18xMSk7CiAKIAkvKiByZWdpc3RlciBDSSBpbnRlcmZhY2UgKi8KIAlidWRnZXRfYXYtPmNhLm93bmVyID0gVEhJU19NT0RVTEU7CkBAIC0zODYsNyArMzg2LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3I6Ci0Jc2FhNzE0Nl93cml0ZShzYWEsIE1DMSwgc2FhNzE0Nl9yZWFkKHNhYSwgTUMxKSB8ICgweDgwMCA8PCAxNikpOworCXNhYTcxNDZfd3JpdGUoc2FhLCBNQzEsIE1BU0tfMjcpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTQwMyw3ICs0MDMsNyBAQAogCWR2Yl9jYV9lbjUwMjIxX3JlbGVhc2UoJmJ1ZGdldF9hdi0+Y2EpOwogCiAJLyogZGlzYWJsZSBERUJJIHBpbnMgKi8KLQlzYWE3MTQ2X3dyaXRlKHNhYSwgTUMxLCBzYWE3MTQ2X3JlYWQoc2FhLCBNQzEpIHwgKDB4ODAwIDw8IDE2KSk7CisJc2FhNzE0Nl93cml0ZShzYWEsIE1DMSwgTUFTS18yNyk7CiB9CiAKIApAQCAtNjU1LDYgKzY1NSwxMCBAQAogCS5kZW1vZF9hZGRyZXNzID0gMHgwYywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdGRhMTAwMjFfY29uZmlnIHBoaWxpcHNfY3UxMjE2X2NvbmZpZ19hbHRhZGRyZXNzID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwZCwKK307CisKIAogCiAKQEAgLTgzMSw3ICs4MzUsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJjPWR2Yl9wbGxfY29uZmlndXJlKCZkdmJfcGxsX3BoaWxpcHNfc2QxODc4X3RkYTgyNjEsIGJ1ZiwKLQkJCXBhcmFtcy0+ZnJlcXVlbmN5LCAwKTsKKwkJCSAgICAgcGFyYW1zLT5mcmVxdWVuY3ksIDApOwogCWlmKHJjIDwgMCkgcmV0dXJuIHJjOwogCiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKQEAgLTkxNCw2ICs5MTgsNyBAQAogI2RlZmluZSBTVUJJRF9EVkJTX1RWX1NUQVJfQ0kJMHgwMDE2CiAjZGVmaW5lIFNVQklEX0RWQlNfRUFTWVdBVENIXzEgIDB4MDAxYQogI2RlZmluZSBTVUJJRF9EVkJTX0VBU1lXQVRDSAkweDAwMWUKKyNkZWZpbmUgU1VCSURfRFZCQ19FQVNZV0FUQ0gJMHgwMDJhCiAjZGVmaW5lIFNVQklEX0RWQkNfS05DMQkJMHgwMDIwCiAjZGVmaW5lIFNVQklEX0RWQkNfS05DMV9QTFVTCTB4MDAyMQogI2RlZmluZSBTVUJJRF9EVkJDX0NJTkVSR1kxMjAwCTB4MTE1NgpAQCAtOTQ3LDExICs5NTIsMTUgQEAKIAkvKiBFbmFibGUgLyBQb3dlck9OIEZyb250ZW5kICovCiAJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMCwgU0FBNzE0Nl9HUElPX09VVExPKTsKIAorCS8qIFdhaXQgZm9yIFBvd2VyT04gKi8KKwltc2xlZXAoMTAwKTsKKwogCS8qIGFkZGl0aW9uYWwgc2V0dXAgbmVjZXNzYXJ5IGZvciB0aGUgUExVUyBjYXJkcyAqLwogCXN3aXRjaCAoc2FhLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpIHsKIAkJY2FzZSBTVUJJRF9EVkJTX0tOQzFfUExVUzoKIAkJY2FzZSBTVUJJRF9EVkJDX0tOQzFfUExVUzoKIAkJY2FzZSBTVUJJRF9EVkJUX0tOQzFfUExVUzoKKwkJY2FzZSBTVUJJRF9EVkJDX0VBU1lXQVRDSDoKIAkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJCQlicmVhazsKIAl9CkBAIC0xMDA2LDEwICsxMDE1LDE1IEBACiAJY2FzZSBTVUJJRF9EVkJDX0tOQzE6CiAJY2FzZSBTVUJJRF9EVkJDX0tOQzFfUExVUzoKIAljYXNlIFNVQklEX0RWQkNfQ0lORVJHWTEyMDA6CisJY2FzZSBTVUJJRF9EVkJDX0VBU1lXQVRDSDoKIAkJYnVkZ2V0X2F2LT5yZWluaXRpYWxpc2VfZGVtb2QgPSAxOwogCQlmZSA9IGR2Yl9hdHRhY2godGRhMTAwMjFfYXR0YWNoLCAmcGhpbGlwc19jdTEyMTZfY29uZmlnLAogCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwLAogCQkJCSAgICAgcmVhZF9wd20oYnVkZ2V0X2F2KSk7CisJCWlmIChmZSA9PSBOVUxMKQorCQkJZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIxX2F0dGFjaCwgJnBoaWxpcHNfY3UxMjE2X2NvbmZpZ19hbHRhZGRyZXNzLAorCQkJCQkgICAgICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCwKKwkJCQkJICAgICByZWFkX3B3bShidWRnZXRfYXYpKTsKIAkJaWYgKGZlKSB7CiAJCQlidWRnZXRfYXYtPnRkYTEwMDIxX3BvY2xrcCA9IDE7CiAJCQlidWRnZXRfYXYtPnRkYTEwMDIxX3NldF9mcm9udGVuZCA9IGZlLT5vcHMuc2V0X2Zyb250ZW5kOwpAQCAtMTI0Miw2ICsxMjU2LDcgQEAKIE1BS0VfQlVER0VUX0lORk8oa25jeHMsICJLTkMgVFYgU1RBUiBEVkItUyIsIEJVREdFVF9UVlNUQVIpOwogTUFLRV9CVURHRVRfSU5GTyhzYXRld3BscywgIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TIGxpZ2h0IiwgQlVER0VUX1RWU1RBUik7CiBNQUtFX0JVREdFVF9JTkZPKHNhdGV3cGxzMSwgIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TIGxpZ2h0IiwgQlVER0VUX0tOQzFTKTsKK01BS0VfQlVER0VUX0lORk8oc2F0ZXdwbGMsICJTYXRlbGNvIEVhc3lXYXRjaCBEVkItQyIsIEJVREdFVF9LTkMxQ1ApOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxc3AsICJLTkMxIERWQi1TIFBsdXMiLCBCVURHRVRfS05DMVNQKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMWNwLCAiS05DMSBEVkItQyBQbHVzIiwgQlVER0VUX0tOQzFDUCk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzF0cCwgIktOQzEgRFZCLVQgUGx1cyIsIEJVREdFVF9LTkMxVFApOwpAQCAtMTI2MCw2ICsxMjc1LDcgQEAKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jeHMsIDB4MTg5NCwgMHgwMDE2KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koc2F0ZXdwbHMsIDB4MTg5NCwgMHgwMDFlKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koc2F0ZXdwbHMxLCAweDE4OTQsIDB4MDAxYSksCisJTUFLRV9FWFRFTlNJT05fUENJKHNhdGV3cGxjLCAweDE4OTQsIDB4MDAyYSksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFjLCAweDE4OTQsIDB4MDAyMCksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzFjcCwgMHgxODk0LCAweDAwMjEpLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxdCwgMHgxODk0LCAweDAwMzApLApAQCAtMTI3Nyw3ICsxMjkzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBidWRnZXRfZXh0ZW5zaW9uID0gewogCS5uYW1lID0gImJ1ZGdldF9hdiIsCi0JLmZsYWdzID0gU0FBNzE0Nl9JMkNfU0hPUlRfREVMQVksCisJLmZsYWdzID0gU0FBNzE0Nl9VU0VfSTJDX0lSUSwKIAogCS5wY2lfdGJsID0gcGNpX3RibCwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwppbmRleCAyYTJlOWI0Li5mMjA2NmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KIAogI2luY2x1ZGUgImR2Yl9jYV9lbjUwMjIxLmgiCiAjaW5jbHVkZSAic3R2MDI5OS5oIgpAQCAtNDYsNyArNDcsMTQgQEAKICNpbmNsdWRlICJic2JlMS5oIgogI2luY2x1ZGUgImJzcnU2LmgiCiAKLSNkZWZpbmUgREVCSUFERFJfSVIJCTB4MTIzNAorLyoKKyAqIFJlZ2FyZGluZyBERUJJQUREUl9JUjoKKyAqIFNvbWUgQ0kgbW9kdWxlcyBoYW5nIGlmIHJhbmRvbSBhZGRyZXNzZXMgYXJlIHJlYWQuCisgKiBVc2luZyBhZGRyZXNzIDB4NDAwMCBmb3IgdGhlIElSIHJlYWQgbWVhbnMgdGhhdCB3ZQorICogdXNlIHRoZSBzYW1lIGFkZHJlc3MgYXMgZm9yIENJIHZlcnNpb24sIHdoaWNoIHNob3VsZAorICogYmUgYSBzYWZlIGRlZmF1bHQuCisgKi8KKyNkZWZpbmUgREVCSUFERFJfSVIJCTB4NDAwMAogI2RlZmluZSBERUJJQUREUl9DSUNPTlRST0wJMHgwMDAwCiAjZGVmaW5lIERFQklBRERSX0NJVkVSU0lPTgkweDQwMDAKICNkZWZpbmUgREVCSUFERFJfSU8JCTB4MTAwMApAQCAtNjUsMTYyICs3MywyMTggQEAKICNkZWZpbmUgU0xPVFNUQVRVU19SRUFEWQk4CiAjZGVmaW5lIFNMT1RTVEFUVVNfT0NDVVBJRUQJKFNMT1RTVEFUVVNfUFJFU0VOVHxTTE9UU1RBVFVTX1JFU0VUfFNMT1RTVEFUVVNfUkVBRFkpCiAKKy8qIE1pbGxpc2Vjb25kcyBkdXJpbmcgd2hpY2gga2V5IHByZXNzZXMgYXJlIHJlZ2FyZGVkIGFzIGtleSByZXBlYXQgYW5kIGR1cmluZworICogd2hpY2ggdGhlIGRlYm91bmNlIGxvZ2ljIGlzIGFjdGl2ZQorICovCisjZGVmaW5lIElSX1JFUEVBVF9USU1FT1VUCTM1MAorCisvKiBSQzUgZGV2aWNlIHdpbGRjYXJkICovCisjZGVmaW5lIElSX0RFVklDRV9BTlkJCTI1NQorCisvKiBTb21lIHJlbW90ZXMgc2VuZHMgbXVsdGlwbGUgc2VxdWVuY2VzIHBlciBrZXlwcmVzcyAoZS5nLiBaZW5pdGggc2VuZHMgdHdvKSwKKyAqIHRoaXMgc2V0dGluZyBhbGxvd3MgdGhlIHN1cGVyZmxvdXMgc2VxdWVuY2VzIHRvIGJlIGlnbm9yZWQKKyAqLworc3RhdGljIGludCBkZWJvdW5jZSA9IDA7Cittb2R1bGVfcGFyYW0oZGVib3VuY2UsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYm91bmNlLCAiaWdub3JlIHJlcGVhdGVkIElSIHNlcXVlbmNlcyAoZGVmYXVsdDogMCA9IGlnbm9yZSBubyBzZXF1ZW5jZXMpIik7CisKK3N0YXRpYyBpbnQgcmM1X2RldmljZSA9IC0xOworbW9kdWxlX3BhcmFtKHJjNV9kZXZpY2UsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJjNV9kZXZpY2UsICJvbmx5IElSIGNvbW1hbmRzIHRvIGdpdmVuIFJDNSBkZXZpY2UgKGRldmljZSA9IDAgLSAzMSwgYW55IGRldmljZSA9IDI1NSwgZGVmYXVsdDogYXV0b2RldGVjdCkiKTsKKworc3RhdGljIGludCBpcl9kZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oaXJfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyX2RlYnVnLCAiZW5hYmxlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgSVIgZGVjb2RpbmciKTsKKworc3RydWN0IGJ1ZGdldF9jaV9pciB7CisJc3RydWN0IGlucHV0X2RldiAqZGV2OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBtc3A0MzBfaXJxX3Rhc2tsZXQ7CisJY2hhciBuYW1lWzcyXTsgLyogNDAgKyAzMiBmb3IgKHN0cnVjdCBzYWE3MTQ2X2RldikubmFtZSAqLworCWNoYXIgcGh5c1szMl07CisJc3RydWN0IGlyX2lucHV0X3N0YXRlIHN0YXRlOworCWludCByYzVfZGV2aWNlOworfTsKKwogc3RydWN0IGJ1ZGdldF9jaSB7CiAJc3RydWN0IGJ1ZGdldCBidWRnZXQ7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBtc3A0MzBfaXJxX3Rhc2tsZXQ7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IGNpaW50Zl9pcnFfdGFza2xldDsKIAlpbnQgc2xvdF9zdGF0dXM7CiAJaW50IGNpX2lycTsKIAlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgY2E7Ci0JY2hhciBpcl9kZXZfbmFtZVs1MF07CisJc3RydWN0IGJ1ZGdldF9jaV9pciBpcjsKIAl1OCB0dW5lcl9wbGxfYWRkcmVzczsgLyogdXNlZCBmb3IgcGhpbGlwc190ZG0xMzE2bCBjb25maWdzICovCiB9OwogCi0vKiBmcm9tIHJlYWRpbmcgdGhlIGZvbGxvd2luZyByZW1vdGVzOgotICAgWmVuaXRoIFVuaXZlcnNhbCA3IC8gVFYgTW9kZSA4MDcgLyBWQ1IgTW9kZSA4MzcKLSAgIEhhdXBwYXVnZSAoZnJvbSBOT1ZBLUNJLXMgYm94IHByb2R1Y3QpCi0gICBpJ3ZlIHRha2VuIGEgIm1pZGRsZSBvZiB0aGUgcm9hZCIgYXBwcm9hY2ggYW5kIG5vdGUgdGhlIGRpZmZlcmVuY2VzCi0qLwotc3RhdGljIHUxNiBrZXlfbWFwWzY0XSA9IHsKLQkvKiAweDBYICovCi0JS0VZXzAsIEtFWV8xLCBLRVlfMiwgS0VZXzMsIEtFWV80LCBLRVlfNSwgS0VZXzYsIEtFWV83LCBLRVlfOCwKLQlLRVlfOSwKLQlLRVlfRU5URVIsCi0JS0VZX1JFRCwKLQlLRVlfUE9XRVIsCQkvKiBSQURJTyBvbiBIYXVwcGF1Z2UgKi8KLQlLRVlfTVVURSwKLQkwLAotCUtFWV9BLAkJCS8qIFRWIG9uIEhhdXBwYXVnZSAqLwotCS8qIDB4MVggKi8KLQlLRVlfVk9MVU1FVVAsIEtFWV9WT0xVTUVET1dOLAotCTAsIDAsCi0JS0VZX0IsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQlLRVlfVVAsIEtFWV9ET1dOLAotCUtFWV9PUFRJT04sCQkvKiBSRVNFUlZFRCBvbiBIYXVwcGF1Z2UgKi8KLQlLRVlfQlJFQUssCi0JLyogMHgyWCAqLwotCUtFWV9DSEFOTkVMVVAsIEtFWV9DSEFOTkVMRE9XTiwKLQlLRVlfUFJFVklPVVMsCQkvKiBQcmV2LiBDaCBvbiBaZW5pdGgsIFNPVVJDRSBvbiBIYXVwcGF1Z2UgKi8KLQkwLCBLRVlfUkVTVEFSVCwgS0VZX09LLAotCUtFWV9DWUNMRVdJTkRPV1MsCS8qIE1JTklNSVpFIG9uIEhhdXBwYXVnZSAqLwotCTAsCi0JS0VZX0VOVEVSLAkJLyogVkNSIG1vZGUgb24gWmVuaXRoICovCi0JS0VZX1BBVVNFLAotCTAsCi0JS0VZX1JJR0hULCBLRVlfTEVGVCwKLQkwLAotCUtFWV9NRU5VLAkJLyogRlVMTCBTQ1JFRU4gb24gSGF1cHBhdWdlICovCi0JMCwKLQkvKiAweDNYICovCi0JS0VZX1NMT1csCi0JS0VZX1BSRVZJT1VTLAkJLyogVkNSIG1vZGUgb24gWmVuaXRoICovCi0JS0VZX1JFV0lORCwKLQkwLAotCUtFWV9GQVNURk9SV0FSRCwKLQlLRVlfUExBWSwgS0VZX1NUT1AsCi0JS0VZX1JFQ09SRCwKLQlLRVlfVFVORVIsCQkvKiBUVi9WQ1Igb24gWmVuaXRoICovCi0JMCwKLQlLRVlfQywKLQkwLAotCUtFWV9FWElULAotCUtFWV9QT1dFUjIsCi0JS0VZX1RVTkVSLAkJLyogVkNSIG1vZGUgb24gWmVuaXRoICovCi0JMCwKLX07Ci0KLXN0YXRpYyB2b2lkIG1zcDQzMF9pcl9kZWJvdW5jZSh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBtc3A0MzBfaXJfa2V5dXAodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IChzdHJ1Y3QgaW5wdXRfZGV2ICopIGRhdGE7Ci0KLQlpZiAoZGV2LT5yZXBbMF0gPT0gMCB8fCBkZXYtPnJlcFswXSA9PSB+MCkgewotCQlpbnB1dF9ldmVudChkZXYsIEVWX0tFWSwga2V5X21hcFtkZXYtPnJlcGVhdF9rZXldLCAhITApOwotCQlyZXR1cm47Ci0JfQotCi0JZGV2LT5yZXBbMF0gPSAwOwotCWRldi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAqIDM1MCAvIDEwMDA7Ci0JYWRkX3RpbWVyKCZkZXYtPnRpbWVyKTsKLQlpbnB1dF9ldmVudChkZXYsIEVWX0tFWSwga2V5X21hcFtkZXYtPnJlcGVhdF9rZXldLCAyKTsJLyogUkVQRUFUICovCisJc3RydWN0IGJ1ZGdldF9jaV9pciAqaXIgPSAoc3RydWN0IGJ1ZGdldF9jaV9pciAqKSBkYXRhOworCWlyX2lucHV0X25va2V5KGlyLT5kZXYsICZpci0+c3RhdGUpOwogfQogCiBzdGF0aWMgdm9pZCBtc3A0MzBfaXJfaW50ZXJydXB0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBkYXRhOwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGJ1ZGdldF9jaS0+aW5wdXRfZGV2OwotCXVuc2lnbmVkIGludCBjb2RlID0KLQkJdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfY2ktPmJ1ZGdldCwgREVCSU5PU1dBUCwgREVCSUFERFJfSVIsIDIsIDEsIDApID4+IDg7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gYnVkZ2V0X2NpLT5pci5kZXY7CisJc3RhdGljIGludCBib3VuY2VzID0gMDsKKwlpbnQgZGV2aWNlOworCWludCB0b2dnbGU7CisJc3RhdGljIGludCBwcmV2X3RvZ2dsZSA9IC0xOworCXN0YXRpYyB1MzIgaXJfa2V5OworCXUzMiBjb21tYW5kID0gdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfY2ktPmJ1ZGdldCwgREVCSU5PU1dBUCwgREVCSUFERFJfSVIsIDIsIDEsIDApID4+IDg7CiAKLQlpZiAoY29kZSAmIDB4NDApIHsKLQkJY29kZSAmPSAweDNmOworCS8qCisJICogVGhlIG1zcDQzMCBjaGlwIGNhbiBnZW5lcmF0ZSB0d28gZGlmZmVyZW50IGJ5dGVzLCBjb21tYW5kIGFuZCBkZXZpY2UKKwkgKgorCSAqIHR5cGUxOiBYMUNDQ0NDQywgQyA9IGNvbW1hbmQgYml0cyAoMCAtIDYzKQorCSAqIHR5cGUyOiBYMFRERERERCwgRCA9IGRldmljZSBiaXRzICgwIC0gMzEpLCBUID0gUkM1IHRvZ2dsZSBiaXQKKwkgKgorCSAqIE1vcmUgdGhhbiBvbmUgY29tbWFuZCBieXRlIG1heSBiZSBnZW5lcmF0ZWQgYmVmb3JlIHRoZSBkZXZpY2UgYnl0ZQorCSAqIE9ubHkgd2hlbiB3ZSBoYXZlIGJvdGgsIGEgY29ycmVjdCBrZXlwcmVzcyBpcyBnZW5lcmF0ZWQKKwkgKi8KIAotCQlpZiAodGltZXJfcGVuZGluZygmZGV2LT50aW1lcikpIHsKLQkJCWlmIChjb2RlID09IGRldi0+cmVwZWF0X2tleSkgewotCQkJCSsrZGV2LT5yZXBbMF07Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZGVsX3RpbWVyKCZkZXYtPnRpbWVyKTsKLQkJCWlucHV0X2V2ZW50KGRldiwgRVZfS0VZLCBrZXlfbWFwW2Rldi0+cmVwZWF0X2tleV0sICEhMCk7Ci0JCX0KKwkvKiBJcyB0aGlzIGEgUkM1IGNvbW1hbmQgYnl0ZT8gKi8KKwlpZiAoY29tbWFuZCAmIDB4NDApIHsKKwkJaWYgKGlyX2RlYnVnKQorCQkJcHJpbnRrKCJidWRnZXRfY2k6IHJlY2VpdmVkIGNvbW1hbmQgYnl0ZSAweCUwMnhcbiIsIGNvbW1hbmQpOworCQlpcl9rZXkgPSBjb21tYW5kICYgMHgzZjsKKwkJcmV0dXJuOworCX0KIAotCQlpZiAoIWtleV9tYXBbY29kZV0pIHsKLQkJCXByaW50aygiRFZCICglcyk6IG5vIGtleSBmb3IgJTAyeCFcbiIsIF9fRlVOQ1RJT05fXywgY29kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkvKiBJdCdzIGEgUkM1IGRldmljZSBieXRlICovCisJaWYgKGlyX2RlYnVnKQorCQlwcmludGsoImJ1ZGdldF9jaTogcmVjZWl2ZWQgZGV2aWNlIGJ5dGUgMHglMDJ4XG4iLCBjb21tYW5kKTsKKwlkZXZpY2UgPSBjb21tYW5kICYgMHgxZjsKKwl0b2dnbGUgPSBjb21tYW5kICYgMHgyMDsKIAotCQkvKiBpbml0aWFsaXplIGRlYm91bmNlIGFuZCByZXBlYXQgKi8KLQkJZGV2LT5yZXBlYXRfa2V5ID0gY29kZTsKLQkJLyogWmVuaXRoIHJlbW90ZSBfYWx3YXlzXyBzZW5kcyAyIHNlcXVlbmNlcyAqLwotCQlkZXYtPnJlcFswXSA9IH4wOwotCQkvKiAzNTAgbWlsbGlzZWNvbmRzICovCi0JCWRldi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAqIDM1MCAvIDEwMDA7Ci0JCS8qIE1BS0UgKi8KLQkJaW5wdXRfZXZlbnQoZGV2LCBFVl9LRVksIGtleV9tYXBbY29kZV0sICEwKTsKLQkJYWRkX3RpbWVyKCZkZXYtPnRpbWVyKTsKKwlpZiAoYnVkZ2V0X2NpLT5pci5yYzVfZGV2aWNlICE9IElSX0RFVklDRV9BTlkgJiYgYnVkZ2V0X2NpLT5pci5yYzVfZGV2aWNlICE9IGRldmljZSkKKwkJcmV0dXJuOworCisJLyogSWdub3JlIHJlcGVhdGVkIGtleSBzZXF1ZW5jZXMgaWYgcmVxdWVzdGVkICovCisJaWYgKHRvZ2dsZSA9PSBwcmV2X3RvZ2dsZSAmJiBpcl9rZXkgPT0gZGV2LT5yZXBlYXRfa2V5ICYmCisJICAgIGJvdW5jZXMgPiAwICYmIHRpbWVyX3BlbmRpbmcoJmRldi0+dGltZXIpKSB7CisJCWlmIChpcl9kZWJ1ZykKKwkJCXByaW50aygiYnVkZ2V0X2NpOiBkZWJvdW5jZSBsb2dpYyBpZ25vcmVkIElSIGNvbW1hbmRcbiIpOworCQlib3VuY2VzLS07CisJCXJldHVybjsKKwl9CisJcHJldl90b2dnbGUgPSB0b2dnbGU7CisKKwkvKiBBcmUgd2Ugc3RpbGwgd2FpdGluZyBmb3IgYSBrZXl1cCBldmVudD8gKi8KKwlpZiAoZGVsX3RpbWVyKCZkZXYtPnRpbWVyKSkKKwkJaXJfaW5wdXRfbm9rZXkoZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSk7CisKKwkvKiBHZW5lcmF0ZSBrZXlwcmVzcyAqLworCWlmIChpcl9kZWJ1ZykKKwkJcHJpbnRrKCJidWRnZXRfY2k6IGdlbmVyYXRpbmcga2V5cHJlc3MgMHglMDJ4XG4iLCBpcl9rZXkpOworCWlyX2lucHV0X2tleWRvd24oZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSwgaXJfa2V5LCAoaXJfa2V5ICYgKGNvbW1hbmQgPDwgOCkpKTsKKworCS8qIERvIHdlIHdhbnQgdG8gZGVsYXkgdGhlIGtleXVwIGV2ZW50PyAqLworCWlmIChkZWJvdW5jZSkgeworCQlib3VuY2VzID0gZGVib3VuY2U7CisJCW1vZF90aW1lcigmZGV2LT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSVJfUkVQRUFUX1RJTUVPVVQpKTsKKwl9IGVsc2UgeworCQlpcl9pbnB1dF9ub2tleShkZXYsICZidWRnZXRfY2ktPmlyLnN0YXRlKTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgbXNwNDMwX2lyX2luaXQoc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpKQogewogCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0X2NpLT5idWRnZXQuZGV2OwotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQlpbnQgaTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBidWRnZXRfY2ktPmlyLmRldjsKKwlpbnQgZXJyb3I7CiAKLQlidWRnZXRfY2ktPmlucHV0X2RldiA9IGlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghaW5wdXRfZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKKwlidWRnZXRfY2ktPmlyLmRldiA9IGlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXRfZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnVkZ2V0X2NpOiBJUiBpbnRlcmZhY2UgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dDE7CisJfQogCi0Jc3ByaW50ZihidWRnZXRfY2ktPmlyX2Rldl9uYW1lLCAiQnVkZ2V0LUNJIGR2YiBpciByZWNlaXZlciAlcyIsIHNhYS0+bmFtZSk7CisJc25wcmludGYoYnVkZ2V0X2NpLT5pci5uYW1lLCBzaXplb2YoYnVkZ2V0X2NpLT5pci5uYW1lKSwKKwkJICJCdWRnZXQtQ0kgZHZiIGlyIHJlY2VpdmVyICVzIiwgc2FhLT5uYW1lKTsKKwlzbnByaW50ZihidWRnZXRfY2ktPmlyLnBoeXMsIHNpemVvZihidWRnZXRfY2ktPmlyLnBoeXMpLAorCQkgInBjaS0lcy9pcjAiLCBwY2lfbmFtZShzYWEtPnBjaSkpOwogCi0JaW5wdXRfZGV2LT5uYW1lID0gYnVkZ2V0X2NpLT5pcl9kZXZfbmFtZTsKKwlpbnB1dF9kZXYtPm5hbWUgPSBidWRnZXRfY2ktPmlyLm5hbWU7CiAKLQlzZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa2V5X21hcCk7IGkrKykKLQkJaWYgKGtleV9tYXBbaV0pCi0JCQlzZXRfYml0KGtleV9tYXBbaV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKKwlpbnB1dF9kZXYtPnBoeXMgPSBidWRnZXRfY2ktPmlyLnBoeXM7CisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1BDSTsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAxOworCWlmIChzYWEtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvcikgeworCQlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IHNhYS0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBzYWEtPnBjaS0+c3Vic3lzdGVtX2RldmljZTsKKwl9IGVsc2UgeworCQlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IHNhYS0+cGNpLT52ZW5kb3I7CisJCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IHNhYS0+cGNpLT5kZXZpY2U7CisJfQorCWlucHV0X2Rldi0+Y2Rldi5kZXYgPSAmc2FhLT5wY2ktPmRldjsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZShidWRnZXRfY2ktPmlucHV0X2Rldik7CisJLyogU2VsZWN0IGtleW1hcCBhbmQgYWRkcmVzcyAqLworCXN3aXRjaCAoYnVkZ2V0X2NpLT5idWRnZXQuZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwljYXNlIDB4MTAwYzoKKwljYXNlIDB4MTAwZjoKKwljYXNlIDB4MTAxMDoKKwljYXNlIDB4MTAxMToKKwljYXNlIDB4MTAxMjoKKwljYXNlIDB4MTAxNzoKKwkJLyogVGhlIGhhdXBwYXVnZSBrZXltYXAgaXMgYSBzdXBlcnNldCBvZiB0aGVzZSByZW1vdGVzICovCisJCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSwKKwkJCSAgICAgIElSX1RZUEVfUkM1LCBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3KTsKIAotCWlucHV0X2Rldi0+dGltZXIuZnVuY3Rpb24gPSBtc3A0MzBfaXJfZGVib3VuY2U7CisJCWlmIChyYzVfZGV2aWNlIDwgMCkKKwkJCWJ1ZGdldF9jaS0+aXIucmM1X2RldmljZSA9IDB4MWY7CisJCWVsc2UKKwkJCWJ1ZGdldF9jaS0+aXIucmM1X2RldmljZSA9IHJjNV9kZXZpY2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHVua25vd24gcmVtb3RlICovCisJCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSwKKwkJCSAgICAgIElSX1RZUEVfUkM1LCBpcl9jb2Rlc19idWRnZXRfY2lfb2xkKTsKIAotCXNhYTcxNDZfd3JpdGUoc2FhLCBJRVIsIHNhYTcxNDZfcmVhZChzYWEsIElFUikgfCBNQVNLXzA2KTsKKwkJaWYgKHJjNV9kZXZpY2UgPCAwKQorCQkJYnVkZ2V0X2NpLT5pci5yYzVfZGV2aWNlID0gSVJfREVWSUNFX0FOWTsKKwkJZWxzZQorCQkJYnVkZ2V0X2NpLT5pci5yYzVfZGV2aWNlID0gcmM1X2RldmljZTsKKwkJYnJlYWs7CisJfQorCisJLyogaW5pdGlhbGlzZSB0aGUga2V5LXVwIGRlYm91bmNlIHRpbWVvdXQgaGFuZGxlciAqLworCWlucHV0X2Rldi0+dGltZXIuZnVuY3Rpb24gPSBtc3A0MzBfaXJfa2V5dXA7CisJaW5wdXRfZGV2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZidWRnZXRfY2ktPmlyOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXRfY2k6IGNvdWxkIG5vdCBpbml0IGRyaXZlciBmb3IgSVIgZGV2aWNlIChjb2RlICVkKVxuIiwgZXJyb3IpOworCQlnb3RvIG91dDI7CisJfQorCisJdGFza2xldF9pbml0KCZidWRnZXRfY2ktPmlyLm1zcDQzMF9pcnFfdGFza2xldCwgbXNwNDMwX2lyX2ludGVycnVwdCwKKwkJICAgICAodW5zaWduZWQgbG9uZykgYnVkZ2V0X2NpKTsKKworCVNBQTcxNDZfSUVSX0VOQUJMRShzYWEsIE1BU0tfMDYpOwogCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19JUlFISSk7CiAKIAlyZXR1cm4gMDsKKworb3V0MjoKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworb3V0MToKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIG1zcDQzMF9pcl9kZWluaXQoc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpKQogewogCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0X2NpLT5idWRnZXQuZGV2OwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGJ1ZGdldF9jaS0+aW5wdXRfZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGJ1ZGdldF9jaS0+aXIuZGV2OwogCi0Jc2FhNzE0Nl93cml0ZShzYWEsIElFUiwgc2FhNzE0Nl9yZWFkKHNhYSwgSUVSKSAmIH5NQVNLXzA2KTsKKwlTQUE3MTQ2X0lFUl9ESVNBQkxFKHNhYSwgTUFTS18wNik7CiAJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX0lOUFVUKTsKKwl0YXNrbGV0X2tpbGwoJmJ1ZGdldF9jaS0+aXIubXNwNDMwX2lycV90YXNrbGV0KTsKIAotCWlmIChkZWxfdGltZXIoJmRldi0+dGltZXIpKQotCQlpbnB1dF9ldmVudChkZXYsIEVWX0tFWSwga2V5X21hcFtkZXYtPnJlcGVhdF9rZXldLCAhITApOworCWlmIChkZWxfdGltZXIoJmRldi0+dGltZXIpKSB7CisJCWlyX2lucHV0X25va2V5KGRldiwgJmJ1ZGdldF9jaS0+aXIuc3RhdGUpOworCQlpbnB1dF9zeW5jKGRldik7CisJfQogCiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKIH0KQEAgLTQyMSw3ICs0ODUsNyBAQAogCW1lbXNldCgmYnVkZ2V0X2NpLT5jYSwgMCwgc2l6ZW9mKHN0cnVjdCBkdmJfY2FfZW41MDIyMSkpOwogCiAJLy8gZW5hYmxlIERFQkkgcGlucwotCXNhYTcxNDZfd3JpdGUoc2FhLCBNQzEsIHNhYTcxNDZfcmVhZChzYWEsIE1DMSkgfCAoMHg4MDAgPDwgMTYpIHwgMHg4MDApOworCXNhYTcxNDZfd3JpdGUoc2FhLCBNQzEsIE1BU0tfMjcgfCBNQVNLXzExKTsKIAogCS8vIHRlc3QgaWYgaXQgaXMgdGhlcmUKIAljaV92ZXJzaW9uID0gdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfY2ktPmJ1ZGdldCwgREVCSUNJQ1RMLCBERUJJQUREUl9DSVZFUlNJT04sIDEsIDEsIDApOwpAQCAtNDczLDcgKzUzNyw3IEBACiAJCX0gZWxzZSB7CiAJCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAwLCBTQUE3MTQ2X0dQSU9fSVJRSEkpOwogCQl9Ci0JCXNhYTcxNDZfd3JpdGUoc2FhLCBJRVIsIHNhYTcxNDZfcmVhZChzYWEsIElFUikgfCBNQVNLXzAzKTsKKwkJU0FBNzE0Nl9JRVJfRU5BQkxFKHNhYSwgTUFTS18wMyk7CiAJfQogCiAJLy8gZW5hYmxlIGludGVyZmFjZQpAQCAtNDk1LDcgKzU1OSw3IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yOgotCXNhYTcxNDZfd3JpdGUoc2FhLCBNQzEsIHNhYTcxNDZfcmVhZChzYWEsIE1DMSkgfCAoMHg4MDAgPDwgMTYpKTsKKwlzYWE3MTQ2X3dyaXRlKHNhYSwgTUMxLCBNQVNLXzI3KTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC01MDUsNyArNTY5LDcgQEAKIAogCS8vIGRpc2FibGUgQ0kgaW50ZXJydXB0cwogCWlmIChidWRnZXRfY2ktPmNpX2lycSkgewotCQlzYWE3MTQ2X3dyaXRlKHNhYSwgSUVSLCBzYWE3MTQ2X3JlYWQoc2FhLCBJRVIpICYgfk1BU0tfMDMpOworCQlTQUE3MTQ2X0lFUl9ESVNBQkxFKHNhYSwgTUFTS18wMyk7CiAJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19JTlBVVCk7CiAJCXRhc2tsZXRfa2lsbCgmYnVkZ2V0X2NpLT5jaWludGZfaXJxX3Rhc2tsZXQpOwogCX0KQEAgLTUyMyw3ICs1ODcsNyBAQAogCWR2Yl9jYV9lbjUwMjIxX3JlbGVhc2UoJmJ1ZGdldF9jaS0+Y2EpOwogCiAJLy8gZGlzYWJsZSBERUJJIHBpbnMKLQlzYWE3MTQ2X3dyaXRlKHNhYSwgTUMxLCBzYWE3MTQ2X3JlYWQoc2FhLCBNQzEpIHwgKDB4ODAwIDw8IDE2KSk7CisJc2FhNzE0Nl93cml0ZShzYWEsIE1DMSwgTUFTS18yNyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJ1ZGdldF9jaV9pcnEoc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIHUzMiAqIGlzcikKQEAgLTUzMyw3ICs1OTcsNyBAQAogCWRwcmludGsoOCwgImRldjogJXAsIGJ1ZGdldF9jaTogJXBcbiIsIGRldiwgYnVkZ2V0X2NpKTsKIAogCWlmICgqaXNyICYgTUFTS18wNikKLQkJdGFza2xldF9zY2hlZHVsZSgmYnVkZ2V0X2NpLT5tc3A0MzBfaXJxX3Rhc2tsZXQpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZidWRnZXRfY2ktPmlyLm1zcDQzMF9pcnFfdGFza2xldCk7CiAKIAlpZiAoKmlzciAmIE1BU0tfMTApCiAJCXR0cGNpX2J1ZGdldF9pcnExMF9oYW5kbGVyKGRldiwgaXNyKTsKQEAgLTgyOCw3ICs4OTIsNyBAQAogCQliYW5kID0gMTsKIAl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDIwMDAwMDAwMCkgewogCQljcCA9IDY7Ci0JCWJhbmQgPSAxOworCQliYW5kID0gMjsKIAl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDI5MDAwMDAwMCkgewogCQljcCA9IDM7CiAJCWJhbmQgPSAyOwpAQCAtMTAyOCw2ICsxMDkyLDcgQEAKIAogCWNhc2UgMHgxMDEyOgkJLy8gVFQgRFZCLVQgQ0kgYnVkZ2V0ICh0ZGExMDA0Ni9QaGlsaXBzIHRkbTEzMTZsKHRkYTY2NTF0dCkpCiAJCWJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MgPSAweDYwOworCQlwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZy5pbnZlcnQgPSAxOwogCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQogCQkJZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsICZwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgewpAQCAtMTA3NSwyNCArMTE0MCwyMyBAQAogCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaTsKIAlpbnQgZXJyOwogCi0JaWYgKCEoYnVkZ2V0X2NpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZGdldF9jaSksIEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJYnVkZ2V0X2NpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZGdldF9jaSksIEdGUF9LRVJORUwpOworCWlmICghYnVkZ2V0X2NpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0MTsKKwl9CiAKIAlkcHJpbnRrKDIsICJidWRnZXRfY2k6ICVwXG4iLCBidWRnZXRfY2kpOwogCi0JYnVkZ2V0X2NpLT5idWRnZXQuY2lfcHJlc2VudCA9IDA7Ci0KIAlkZXYtPmV4dF9wcml2ID0gYnVkZ2V0X2NpOwogCi0JaWYgKChlcnIgPSB0dHBjaV9idWRnZXRfaW5pdCgmYnVkZ2V0X2NpLT5idWRnZXQsIGRldiwgaW5mbywgVEhJU19NT0RVTEUpKSkgewotCQlrZnJlZShidWRnZXRfY2kpOwotCQlyZXR1cm4gZXJyOwotCX0KKwllcnIgPSB0dHBjaV9idWRnZXRfaW5pdCgmYnVkZ2V0X2NpLT5idWRnZXQsIGRldiwgaW5mbywgVEhJU19NT0RVTEUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKIAotCXRhc2tsZXRfaW5pdCgmYnVkZ2V0X2NpLT5tc3A0MzBfaXJxX3Rhc2tsZXQsIG1zcDQzMF9pcl9pbnRlcnJ1cHQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIGJ1ZGdldF9jaSk7Ci0KLQltc3A0MzBfaXJfaW5pdChidWRnZXRfY2kpOworCWVyciA9IG1zcDQzMF9pcl9pbml0KGJ1ZGdldF9jaSk7CisJaWYgKGVycikKKwkJZ290byBvdXQzOwogCiAJY2lpbnRmX2luaXQoYnVkZ2V0X2NpKTsKIApAQCAtMTEwMiw2ICsxMTY2LDEzIEBACiAJdHRwY2lfYnVkZ2V0X2luaXRfaG9va3MoJmJ1ZGdldF9jaS0+YnVkZ2V0KTsKIAogCXJldHVybiAwOworCitvdXQzOgorCXR0cGNpX2J1ZGdldF9kZWluaXQoJmJ1ZGdldF9jaS0+YnVkZ2V0KTsKK291dDI6CisJa2ZyZWUoYnVkZ2V0X2NpKTsKK291dDE6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBidWRnZXRfY2lfZGV0YWNoKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2KQpAQCAtMTExMiwxNiArMTE4MywxMyBAQAogCiAJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmNpX3ByZXNlbnQpCiAJCWNpaW50Zl9kZWluaXQoYnVkZ2V0X2NpKTsKKwltc3A0MzBfaXJfZGVpbml0KGJ1ZGdldF9jaSk7CiAJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgewogCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpOwogCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CiAJfQogCWVyciA9IHR0cGNpX2J1ZGdldF9kZWluaXQoJmJ1ZGdldF9jaS0+YnVkZ2V0KTsKIAotCXRhc2tsZXRfa2lsbCgmYnVkZ2V0X2NpLT5tc3A0MzBfaXJxX3Rhc2tsZXQpOwotCi0JbXNwNDMwX2lyX2RlaW5pdChidWRnZXRfY2kpOwotCiAJLy8gZGlzYWJsZSBmcm9udGVuZCBhbmQgQ0kgaW50ZXJmYWNlCiAJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMiwgU0FBNzE0Nl9HUElPX0lOUFVUKTsKIApAQCAtMTE1NCw3ICsxMjIyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBidWRnZXRfZXh0ZW5zaW9uID0gewogCS5uYW1lID0gImJ1ZGdldF9jaSBkdmIiLAotCS5mbGFncyA9IFNBQTcxNDZfSTJDX1NIT1JUX0RFTEFZLAorCS5mbGFncyA9IFNBQTcxNDZfVVNFX0kyQ19JUlEsCiAKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLnBjaV90YmwgPSAmcGNpX3RibFswXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1wYXRjaC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKaW5kZXggZmMxMjY3Yi4uOWExNTUzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMKQEAgLTUwMCwxNCArNTAwLDE0IEBACiAKIC8qICAgICAgTmV3IGRlc2lnbiAoQnkgRW1hcmQpCiAqKiAgICAgIHRoaXMgcnBzMSBjb2RlIHdpbGwgY29weSBpbnRlcm5hbCBIUyBldmVudCB0byBHUElPMyBwaW4uCi0qKiAgICAgIEdQSU8zIGlzIGluIGJ1ZGdldC1wYXRjaCBoYXJkd2FyZSBjb25uZWN0ZCB0byBwb3J0IEIgVlNZTkMKKyoqICAgICAgR1BJTzMgaXMgaW4gYnVkZ2V0LXBhdGNoIGhhcmR3YXJlIGNvbm5lY3RlZCB0byBwb3J0IEIgVlNZTkMKIAogKiogICAgICBIUyBpcyBhbiBpbnRlcm5hbCBldmVudCBvZiA3MTQ2LCBhY2Nlc3NpYmxlIHdpdGggUlBTCiAqKiAgICAgIGFuZCB0ZW1wb3JhcmlseSByYWlzZWQgaGlnaCBldmVyeSBuIGxpbmVzCiAqKiAgICAgIChuIGluIGRlZmluZWQgaW4gdGhlIFJQU19USFJFU0gxIGNvdW50ZXIgdGhyZXNob2xkKQogKiogICAgICBJIHRoaW5rIEhTIGlzIHJhaXNlZCBoaWdoIG9uIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG4tdGggbGluZQogKiogICAgICBhbmQgcmVtYWlucyBoaWdoIHVudGlsIHRoaXMgbi10aCBsaW5lIHRoYXQgdHJpZ2dlcmVkCi0qKiAgICAgIGl0IGlzIGNvbXBsZXRlbHkgcmVjZWl2ZWQuIFdoZW4gdGhlIHJlY2VpcHRpb24gb2Ygbi10aCBsaW5lCisqKiAgICAgIGl0IGlzIGNvbXBsZXRlbHkgcmVjZWl2ZWQuIFdoZW4gdGhlIHJlY2VwdGlvbiBvZiBuLXRoIGxpbmUKICoqICAgICAgZW5kcywgSFMgaXMgbG93ZXJlZC4KIAogKiogICAgICBUbyB0cmFuc21pdCBkYXRhIG92ZXIgRE1BLCA3MTQ2IG5lZWRzIGNoYW5naW5nIHN0YXRlIGF0CkBAIC01NDEsNyArNTQxLDcgQEAKICoqICAgICAgaGFyZHdhcmUgZGVidWcgbm90ZTogYSB3b3JraW5nIGJ1ZGdldCBjYXJkIChpbmNsdWRpbmcgYnVkZ2V0IHBhdGNoKQogKiogICAgICB3aXRoIHZwZWlycSgpIGludGVycnVwdCBzZXR1cCBpbiBtb2RlICIweDkwIiAoZXZlcnkgNjRLKSB3aWxsCiAqKiAgICAgIGdlbmVyYXRlIDMgaW50ZXJydXB0cyBwZXIgMjUtSHogRE1BIGZyYW1lIG9mIDIqMTg4KjUxMiBieXRlcwotKiogICAgICBhbmQgdGhhdCBtZWFucyAzKjI1PTc1IEh6IG9mIGludGVycnVwdCBmcmVxZW5jeSwgYXMgc2VlbiBieQorKiogICAgICBhbmQgdGhhdCBtZWFucyAzKjI1PTc1IEh6IG9mIGludGVycnVwdCBmcmVxdWVuY3ksIGFzIHNlZW4gYnkKICoqICAgICAgd2F0Y2ggY2F0IC9wcm9jL2ludGVycnVwdHMKICoqCiAqKiAgICAgIElmIHRoaXMgZnJlcXVlbmN5IGlzIDN4IGxvd2VyIChhbmQgZGF0YSByZWNlaXZlZCBpbiB0aGUgRE1BCkBAIC01NTAsNyArNTUwLDcgQEAKICoqICAgICAgdGhpcyBtZWFucyBWU1lOQyBsaW5lIGlzIG5vdCBjb25uZWN0ZWQgaW4gdGhlIGhhcmR3YXJlLgogKiogICAgICAoY2hlY2sgc29sZGVyaW5nIHBjYiBhbmQgcGlucykKICoqICAgICAgVGhlIHNhbWUgYmVoYXZpb3VyIG9mIG1pc3NpbmcgVlNZTkMgY2FuIGJlIGR1cGxpY2F0ZWQgb24gYnVkZ2V0Ci0qKiAgICAgIGNhcmRzLCBieSBzZXRpbmcgREQxX0lOSVQgdHJpZ2dlciBtb2RlIDcgaW4gM3JkIG5pYmJsZS4KKyoqICAgICAgY2FyZHMsIGJ5IHNldHRpbmcgREQxX0lOSVQgdHJpZ2dlciBtb2RlIDcgaW4gM3JkIG5pYmJsZS4KICovCiAKIAkvLyBTZXR1cCBSUFMxICJwcm9ncmFtIiAocDM1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwppbmRleCBlNThmMDM5Li45MjY4YTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwpAQCAtNDYsNiArNDYsMTAgQEAKICNpbmNsdWRlICJsbmJwMjEuaCIKICNpbmNsdWRlICJic3J1Ni5oIgogCitzdGF0aWMgaW50IGRpc2VxY19tZXRob2Q7Cittb2R1bGVfcGFyYW0oZGlzZXFjX21ldGhvZCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzZXFjX21ldGhvZCwgIlNlbGVjdCBEaVNFcUMgbWV0aG9kIGZvciBzdWJzeXN0ZW0gaWQgMTNjMjoxMDAzLCAwOiBkZWZhdWx0LCAxOiBtb3JlIHJlbGlhYmxlIChmb3IgbmV3ZXIgcmV2aXNpb25zIG9ubHkpIik7CisKIHN0YXRpYyB2b2lkIFNldDIySyAoc3RydWN0IGJ1ZGdldCAqYnVkZ2V0LCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHNhYTcxNDZfZGV2ICpkZXY9YnVkZ2V0LT5kZXY7CkBAIC0zODIsNiArMzg2LDExIEBACiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewogCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfYnNydTZfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT50dW5lcl9wcml2ID0gJmJ1ZGdldC0+aTJjX2FkYXA7CisJCQlpZiAoYnVkZ2V0LT5kZXYtPnBjaS0+c3Vic3lzdGVtX2RldmljZSA9PSAweDEwMDMgJiYgZGlzZXFjX21ldGhvZCA9PSAwKSB7CisJCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5kaXNlcWNfc2VuZF9idXJzdCA9IGJ1ZGdldF9kaXNlcWNfc2VuZF9idXJzdDsKKwkJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF90b25lID0gYnVkZ2V0X3NldF90b25lOworCQkJfQogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC01NDYsNyArNTU1LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzYWE3MTQ2X2V4dGVuc2lvbiBidWRnZXRfZXh0ZW5zaW9uID0gewogCS5uYW1lCQk9ICJidWRnZXQgZHZiIiwKLQkuZmxhZ3MJCT0gU0FBNzE0Nl9JMkNfU0hPUlRfREVMQVksCisJLmZsYWdzCQk9IFNBQTcxNDZfVVNFX0kyQ19JUlEsCiAKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAogCS5wY2lfdGJsCT0gcGNpX3RibCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwppbmRleCBhMWM5ZmE5Li5iZDZlN2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCkBAIC0yMzgsNiArMjM4LDcgQEAKIAkJICogZm9yIG5vdyBsZXRzIHJlcG9ydCBlYWNoIHNpZ25hbCBhcyBhIGtleSBkb3duIGFuZCB1cCovCiAJCWRwcmludGsoIiVzOnJjIHNpZ25hbDolZFxuIiwgX19GVU5DVElPTl9fLCBidWZmZXJbNF0pOwogCQlpbnB1dF9yZXBvcnRfa2V5KGRlYy0+cmNfaW5wdXRfZGV2LCByY19rZXlzW2J1ZmZlcls0XSAtIDFdLCAxKTsKKwkJaW5wdXRfc3luYyhkZWMtPnJjX2lucHV0X2Rldik7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGVjLT5yY19pbnB1dF9kZXYsIHJjX2tleXNbYnVmZmVyWzRdIC0gMV0sIDApOwogCQlpbnB1dF9zeW5jKGRlYy0+cmNfaW5wdXRfZGV2KTsKIAl9CkBAIC0xMTM1LDggKzExMzYsNyBAQAogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJZm9yIChpID0gMDsgaSA8IElTT19CVUZfQ09VTlQ7IGkrKykKLQkJaWYgKGRlYy0+aXNvX3VyYltpXSkKLQkJCXVzYl9mcmVlX3VyYihkZWMtPmlzb191cmJbaV0pOworCQl1c2JfZnJlZV91cmIoZGVjLT5pc29fdXJiW2ldKTsKIAogCXBjaV9mcmVlX2NvbnNpc3RlbnQoTlVMTCwKIAkJCSAgICBJU09fRlJBTUVfU0laRSAqIChGUkFNRVNfUEVSX0lTT19CVUYgKgpAQCAtMTE4OCwxMSArMTE4OCwxMiBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAl1OCBiW10gPSB7IDB4MDAsIDB4MDEgfTsKIAlpbnQgaTsKKwlpbnQgZXJyOwogCiAJdXNiX21ha2VfcGF0aChkZWMtPnVkZXYsIGRlYy0+cmNfcGh5cywgc2l6ZW9mKGRlYy0+cmNfcGh5cykpOwogCXN0cmxjcHkoZGVjLT5yY19waHlzLCAiL2lucHV0MCIsIHNpemVvZihkZWMtPnJjX3BoeXMpKTsKIAotCWRlYy0+cmNfaW5wdXRfZGV2ID0gaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpbnB1dF9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMjA2LDggKzEyMDcsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyY19rZXlzKTsgaSsrKQogCQkgIHNldF9iaXQocmNfa2V5c1tpXSwgaW5wdXRfZGV2LT5rZXliaXQpOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaWYgKGVycikgeworCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCQlyZXR1cm4gZXJyOworCX0KIAorCWRlYy0+cmNfaW5wdXRfZGV2ID0gaW5wdXRfZGV2OwogCWlmICh1c2Jfc3VibWl0X3VyYihkZWMtPmlycV91cmIsIEdGUF9LRVJORUwpKQogCQlwcmludGsoIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWRcbiIsX19GVU5DVElPTl9fKTsKIAkvKiBlbmFibGUgaXJxIHBpcGUgKi8KQEAgLTEyNDUsNyArMTI1MSw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlkZWMtPmlycV9idWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jKGRlYy0+dWRldixJUlFfUEFDS0VUX1NJWkUsCi0JCQkJCVNMQUJfQVRPTUlDLCAmZGVjLT5pcnFfZG1hX2hhbmRsZSk7CisJCQkJCUdGUF9BVE9NSUMsICZkZWMtPmlycV9kbWFfaGFuZGxlKTsKIAkJaWYoIWRlYy0+aXJxX2J1ZmZlcikgewogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jCmluZGV4IDQyZjM5YTguLmE2ZmIxZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJc3RydWN0IHR0dXNiZGVjZmVfc3RhdGUqIHN0YXRlID0gTlVMTDsKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCi0Jc3RhdGUgPSAoc3RydWN0IHR0dXNiZGVjZmVfc3RhdGUqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR1c2JkZWNmZV9zdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR0dXNiZGVjZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogCXN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKiBzdGF0ZSA9IE5VTEw7CiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotCXN0YXRlID0gKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHR0dXNiZGVjZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKaW5kZXggNmQ5NmIxNy4uOTIwYjYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwpAQCAtMTczLDM4ICsxNzMsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmFkaW8tbWFlc3Ryby4KIAotY29uZmlnIFJBRElPX01JUk9QQ00yMAotCXRyaXN0YXRlICJtaXJvU09VTkQgUENNMjAgcmFkaW8iCi0JZGVwZW5kcyBvbiBJU0EgJiYgVklERU9fVjRMMSAmJiBTT1VORF9BQ0lfTUlYRVIKLQktLS1oZWxwLS0tCi0JICBDaG9vc2UgWSBoZXJlIGlmIHlvdSBoYXZlIHRoaXMgRk0gcmFkaW8gY2FyZC4gWW91IGFsc28gbmVlZCB0byBzYXkgWQotCSAgdG8gIkFDSSBtaXhlciAobWlyb1NPVU5EIFBDTTEtcHJvL1BDTTEyL1BDTTIwIHJhZGlvKSIgKGluICJTb3VuZCIpCi0JICBmb3IgdGhpcyB0byB3b3JrLgotCi0JICBJbiBvcmRlciB0byBjb250cm9sIHlvdXIgcmFkaW8gY2FyZCwgeW91IHdpbGwgbmVlZCB0byB1c2UgcHJvZ3JhbXMKLQkgIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgVmlkZW8gRm9yIExpbnV4IEFQSS4gIEluZm9ybWF0aW9uIG9uCi0JICB0aGlzIEFQSSBhbmQgcG9pbnRlcnMgdG8gInY0bCIgcHJvZ3JhbXMgbWF5IGJlIGZvdW5kIGF0Ci0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sPi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWlyb3BjbTIwLgotCi1jb25maWcgUkFESU9fTUlST1BDTTIwX1JEUwotCXRyaXN0YXRlICJtaXJvU09VTkQgUENNMjAgcmFkaW8gUkRTIHVzZXIgaW50ZXJmYWNlIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUkFESU9fTUlST1BDTTIwICYmIEVYUEVSSU1FTlRBTAotCS0tLWhlbHAtLS0KLQkgIENob29zZSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc2VlIFJEUy9SQkRTIGluZm9ybWF0aW9uIGxpa2UKLQkgIFJhZGlvVGV4dCwgUHJvZ3JhbW1lIFNlcnZpY2UgbmFtZSwgQ2xvY2sgVGltZSBhbmQgZGF0ZSwgUHJvZ3JhbW1lCi0JICBUeXBlIGFuZCBUcmFmZmljIEFubm91bmNlbWVudC9Qcm9ncmFtbWUgaWRlbnRpZmljYXRpb24uCi0KLQkgIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHJlYWQgdGhlIHJhdyBSRFMgcGFja2V0cyBmcm9tIHRoZSBkZXZpY2UsIHNvCi0JICB0aGUgZHJpdmVyIGNhbnQgcHJvdmlkZSBhbiBWNEwgaW50ZXJmYWNlIGZvciB0aGlzLiAgQnV0IHRoZQotCSAgYXZhaWxhYmlsaXR5IG9mIFJEUyBpcyByZXBvcnRlZCBvdmVyIFY0TCBieSB0aGUgYmFzaWMgZHJpdmVyCi0JICBhbHJlYWR5LiAgSGVyZSBSRFMgY2FuIGJlIHJlYWQgZnJvbSBmaWxlcyBpbiAvZGV2L3Y0bC9yZHMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1pcm9wY20yMC1yZHMuCi0KIGNvbmZpZyBSQURJT19TRjE2Rk1JCiAJdHJpc3RhdGUgIlNGMTZGTUkgUmFkaW8iCiAJZGVwZW5kcyBvbiBJU0EgJiYgVklERU9fVjRMMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IGFmYjczNGQuLjI5YTExYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKQEAgLTI0LDcgKzI0LDcgQEAKIAkgIGRlY29kZSBhdWRpby92aWRlbyBzdGFuZGFyZHMuIFRoaXMgb3B0aW9uIHdpbGwgYXV0b3NlbGVjdAogCSAgYWxsIHBlcnRpbmVudCBtb2R1bGVzIHRvIGVhY2ggc2VsZWN0ZWQgdmlkZW8gbW9kdWxlLgogCi0JICBVbnNlbGVjdCB0aGlzIG9ubHkgaWYgeW91IGtub3cgZXhhY2x0eSB3aGF0IHlvdSBhcmUgZG9pbmcsIHNpbmNlCisJICBVbnNlbGVjdCB0aGlzIG9ubHkgaWYgeW91IGtub3cgZXhhY3RseSB3aGF0IHlvdSBhcmUgZG9pbmcsIHNpbmNlCiAJICBpdCBtYXkgYnJlYWsgc3VwcG9ydCBvbiBzb21lIGJvYXJkcy4KIAogCSAgSW4gZG91YnQsIHNheSBZLgpAQCAtMTg0LDkgKzE4NCwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQga3MwMTI3LgogCitjb25maWcgVklERU9fT1Y3NjcwCisJdHJpc3RhdGUgIk9tbmlWaXNpb24gT1Y3NjcwIHNlbnNvciBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgVmlkZW80TGludXgyIHNlbnNvci1sZXZlbCBkcml2ZXIgZm9yIHRoZSBPbW5pVmlzaW9uCisJICBPVjc2NzAgVkdBIGNhbWVyYS4gIEl0IGN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggdGhlIE04OEFMUDAxCisJICBjb250cm9sbGVyLgorCiBjb25maWcgVklERU9fU0FBNzExMAogCXRyaXN0YXRlICJQaGlsaXBzIFNBQTcxMTAgdmlkZW8gZGVjb2RlciIKLQlkZXBlbmRzIG9uIFZJREVPX1Y0TDEKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDEgJiYgSTJDCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgU0FBNzExMCB2aWRlbyBkZWNvZGVycy4KIApAQCAtNTY3LDE4ICs1NzUsNiBAQAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBBdmVyTWVkaWEgNiBFeWVzIHZpZGVvIHN1cnZlaWxsYW5jZSBjYXJkLgogCi1jb25maWcgVklERU9fWlIzNjEyMAotCXRyaXN0YXRlICJab3JhbiBaUjM2MTIwLzM2MTI1IFZpZGVvIEZvciBMaW51eCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBJMkMgJiYgVklERU9fVjRMMSAmJiBCUk9LRU4KLQloZWxwCi0JICBTdXBwb3J0IGZvciBaUjM2MTIwL1pSMzYxMjUgYmFzZWQgZnJhbWUgZ3JhYmJlci9vdmVybGF5IGJvYXJkcy4KLQkgIFRoaXMgaW5jbHVkZXMgdGhlIFZpY3RvciBJSSwgV2F2ZVdhdGNoZXIsIFZpZGVvIFdvbmRlciwgTWF4aS1UViwKLQkgIGFuZCBCdXN0ZXIgYm9hcmRzLiBQbGVhc2UgcmVhZCB0aGUgbWF0ZXJpYWwgaW4KLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvenIzNjEyMC50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB6cjM2MTIwLgotCiBjb25maWcgVklERU9fTUVZRQogCXRyaXN0YXRlICJTb255IFZhaW8gUGljdHVyZWJvb2sgTW90aW9uIEV5ZSBWaWRlbyBGb3IgTGludXgiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgU09OWVBJICYmIFZJREVPX1Y0TDEKQEAgLTY3MCw2ICs2NjYsMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFydi4KIAorY29uZmlnIFZJREVPX0NBRkVfQ0NJQworCXRyaXN0YXRlICJNYXJ2ZWxsIDg4QUxQMDEgKENhZmUpIENNT1MgQ2FtZXJhIENvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyCisJc2VsZWN0IFZJREVPX09WNzY3MAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eDIgZHJpdmVyIGZvciB0aGUgTWFydmVsbCA4OEFMUDAxIGludGVncmF0ZWQKKwkgIENNT1MgY2FtZXJhIGNvbnRyb2xsZXIuICBUaGlzIGlzIHRoZSBjb250cm9sbGVyIGZvdW5kIG9uIGZpcnN0LQorCSAgZ2VuZXJhdGlvbiBPTFBDIHN5c3RlbXMuCisKICMKICMgVVNCIE11bHRpbWVkaWEgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKQEAgLTY3Nyw4ICs2ODIsMTIgQEAKIG1lbnUgIlY0TCBVU0IgZGV2aWNlcyIKIAlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19ERVYKIAorc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCmluZGV4IGFmNTdhYmMuLjliMWYzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQpAQCAtMiw3ICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSB2aWRlbyBjYXB0dXJlL3BsYXliYWNrIGRldmljZSBkcml2ZXJzLgogIwogCi16b3Jhbi1vYmpzICAgICAgOj0JenIzNjEyMC5vIHpyMzYxMjBfaTJjLm8genIzNjEyMF9tZW0ubwogenIzNjA2Ny1vYmpzCTo9CXpvcmFuX3Byb2Nmcy5vIHpvcmFuX2RldmljZS5vIFwKIAkJCXpvcmFuX2RyaXZlci5vIHpvcmFuX2NhcmQubwogdHVuZXItb2Jqcwk6PQl0dW5lci1jb3JlLm8gdHVuZXItdHlwZXMubyB0dW5lci1zaW1wbGUubyBcCkBAIC0yMyw3ICsyMiw2IEBACiBvYmotJChDT05GSUdfVklERU9fVERBOTg3NSkgKz0gdGRhOTg3NS5vCiBvYmotJChDT05GSUdfU09VTkRfVFZNSVhFUikgKz0gdHZtaXhlci5vCiAKLW9iai0kKENPTkZJR19WSURFT19aUjM2MTIwKSArPSB6b3Jhbi5vCiBvYmotJChDT05GSUdfVklERU9fU0FBNjU4OCkgKz0gc2FhNjU4OC5vCiBvYmotJChDT05GSUdfVklERU9fU0FBNTI0NkEpICs9IHNhYTUyNDZhLm8KIG9iai0kKENPTkZJR19WSURFT19TQUE1MjQ5KSArPSBzYWE1MjQ5Lm8KQEAgLTY0LDYgKzYyLDcgQEAKIG9iai0kKENPTkZJR19WSURFT19TQUE3MTM0KSArPSBpci1rYmQtaTJjLm8gc2FhNzEzNC8KIG9iai0kKENPTkZJR19WSURFT19DWDg4KSArPSBjeDg4Lwogb2JqLSQoQ09ORklHX1ZJREVPX0VNMjhYWCkgKz0gZW0yOHh4Lworb2JqLSQoQ09ORklHX1ZJREVPX1VTQlZJU0lPTikgKz0gdXNidmlzaW9uLwogb2JqLSQoQ09ORklHX1ZJREVPX1RWUDUxNTApICs9IHR2cDUxNTAubwogb2JqLSQoQ09ORklHX1ZJREVPX1BWUlVTQjIpICs9IHB2cnVzYjIvCiBvYmotJChDT05GSUdfVklERU9fTVNQMzQwMCkgKz0gbXNwMzQwMC5vCkBAIC05Miw2ICs5MSw5IEBACiBvYmotJChDT05GSUdfVklERU9fVVBENjQwODMpICs9IHVwZDY0MDgzLm8KIG9iai0kKENPTkZJR19WSURFT19DWDIzNDFYKSArPSBjeDIzNDF4Lm8KIAorb2JqLSQoQ09ORklHX1ZJREVPX0NBRkVfQ0NJQykgKz0gY2FmZV9jY2ljLm8KK29iai0kKENPTkZJR19WSURFT19PVjc2NzApIAkrPSBvdjc2NzAubworCiBvYmotJChDT05GSUdfVVNCX0RBQlVTQikgICAgICAgICs9IGRhYnVzYi5vCiBvYmotJChDT05GSUdfVVNCX09WNTExKSAgICAgICAgICs9IG92NTExLm8KIG9iai0kKENPTkZJR19VU0JfU0U0MDEpICAgICAgICAgKz0gc2U0MDEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwppbmRleCBhODQ5MDNlLi4yMWViZThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwpAQCAtNDAwMSw3ICs0MDAxLDcgQEAKICAqICAgICAgLSBzbGVlcCAxbXMKICAqICAgICAgLSB3cml0ZSAweDBFCiAgKiAgICAgcmVhZCBmcm9tIEdQSU9fREFUQSBpbnRvIGJ1ZiAodWludF8zMikKLSAqICAgICAgLSBpZiAoIGJ1Zj4+MTggJiAweDAxICkgfHwgKCBidWY+PjE5ICYmIDB4MDEgIT0gMCApCisgKiAgICAgIC0gaWYgKCBidWY+PjE4ICYgMHgwMSApIHx8ICggYnVmPj4xOSAmIDB4MDEgIT0gMCApCiAgKiAgICAgICAgICAgICAgICBlcnJvci4gRVJST1JfQ1BMRF9DaGVja19GYWlsZWQuCiAgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKaW5kZXggNmUxZGRhZC4uM2M4ZTQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYwpAQCAtMTc5Myw3ICsxNzkzLDcgQEAKIAkJbWVtc2V0KGksMCxzaXplb2YoKmkpKTsKIAkJaS0+aW5kZXggICAgPSBuOwogCQlpLT50eXBlICAgICA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0JCWktPmF1ZGlvc2V0ID0gMDsKKwkJaS0+YXVkaW9zZXQgPSAxOwogCQlpZiAoaS0+aW5kZXggPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcikgewogCQkJc3ByaW50ZihpLT5uYW1lLCAiVGVsZXZpc2lvbiIpOwogCQkJaS0+dHlwZSAgPSBWNEwyX0lOUFVUX1RZUEVfVFVORVI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaTJjLmMKaW5kZXggNzBkZTZjOS4uNjJiODczMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pMmMuYwpAQCAtNDc5LDExICs0NzksNyBAQAogCWlmICgwICE9IGJ0di0+aTJjX3JjKQogCQlyZXR1cm4gMDsKIAotCWlmIChidHYtPnVzZV9pMmNfaHcpIHsKLQkJcmV0dXJuIGkyY19kZWxfYWRhcHRlcigmYnR2LT5jLmkyY19hZGFwKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gaTJjX2JpdF9kZWxfYnVzKCZidHYtPmMuaTJjX2FkYXApOwotCX0KKwlyZXR1cm4gaTJjX2RlbF9hZGFwdGVyKCZidHYtPmMuaTJjX2FkYXApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYwppbmRleCA5MzNkNmRiLi5jYmMwMTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYwpAQCAtMjU5LDI0ICsyNTksNTkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCitzdGF0aWMgdm9pZCBidHR2X2lyX3N0YXJ0KHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCBidHR2X2lyICppcikKK3sKKwlpZiAoaXItPnBvbGxpbmcpIHsKKwkJaW5pdF90aW1lcigmaXItPnRpbWVyKTsKKwkJaXItPnRpbWVyLmZ1bmN0aW9uID0gYnR0dl9pbnB1dF90aW1lcjsKKwkJaXItPnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpYnR2OworCQlpci0+dGltZXIuZXhwaXJlcyAgPSBqaWZmaWVzICsgSFo7CisJCWFkZF90aW1lcigmaXItPnRpbWVyKTsKKwl9IGVsc2UgaWYgKGlyLT5yYzVfZ3BpbykgeworCQkvKiBzZXQgdGltZXJfZW5kIGZvciBjb2RlIGNvbXBsZXRpb24gKi8KKwkJaW5pdF90aW1lcigmaXItPnRpbWVyX2VuZCk7CisJCWlyLT50aW1lcl9lbmQuZnVuY3Rpb24gPSBidHR2X3JjNV90aW1lcl9lbmQ7CisJCWlyLT50aW1lcl9lbmQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWlyOworCisJCWluaXRfdGltZXIoJmlyLT50aW1lcl9rZXl1cCk7CisJCWlyLT50aW1lcl9rZXl1cC5mdW5jdGlvbiA9IGJ0dHZfcmM1X3RpbWVyX2tleXVwOworCQlpci0+dGltZXJfa2V5dXAuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWlyOworCX0KK30KKworc3RhdGljIHZvaWQgYnR0dl9pcl9zdG9wKHN0cnVjdCBidHR2ICpidHYpCit7CisJaWYgKGJ0di0+cmVtb3RlLT5wb2xsaW5nKSB7CisJCWRlbF90aW1lcl9zeW5jKCZidHYtPnJlbW90ZS0+dGltZXIpOworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCX0KKworCWlmIChidHYtPnJlbW90ZS0+cmM1X2dwaW8pIHsKKwkJdTMyIGdwaW87CisKKwkJZGVsX3RpbWVyX3N5bmMoJmJ0di0+cmVtb3RlLT50aW1lcl9lbmQpOworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJCWdwaW8gPSBidHR2X2dwaW9fcmVhZCgmYnR2LT5jKTsKKwkJYnR0dl9ncGlvX3dyaXRlKCZidHYtPmMsIGdwaW8gJiB+KDEgPDwgNCkpOworCX0KK30KKwogaW50IGJ0dHZfaW5wdXRfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQogewogCXN0cnVjdCBidHR2X2lyICppcjsKIAlJUl9LRVlUQUJfVFlQRSAqaXJfY29kZXMgPSBOVUxMOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgaXJfdHlwZSA9IElSX1RZUEVfT1RIRVI7CisJaW50IGVyciA9IC1FTk9NRU07CiAKIAlpZiAoIWJ0di0+aGFzX3JlbW90ZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpciA9IGt6YWxsb2Moc2l6ZW9mKCppciksR0ZQX0tFUk5FTCk7CiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFpciB8fCAhaW5wdXRfZGV2KSB7Ci0JCWtmcmVlKGlyKTsKLQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1lbXNldChpciwwLHNpemVvZigqaXIpKTsKKwlpZiAoIWlyIHx8ICFpbnB1dF9kZXYpCisJCWdvdG8gZXJyX291dF9mcmVlOwogCiAJLyogZGV0ZWN0ICYgY29uZmlndXJlICovCiAJc3dpdGNoIChidHYtPmMudHlwZSkgewpAQCAtMzQ4LDEwICszODMsOSBAQAogCQlicmVhazsKIAl9CiAJaWYgKE5VTEwgPT0gaXJfY29kZXMpIHsKLQkJZHByaW50ayhLRVJOX0lORk8gIk9vb3BzOiBJUiBjb25maWcgZXJyb3IgW2NhcmQ9JWRdXG4iLGJ0di0+Yy50eXBlKTsKLQkJa2ZyZWUoaXIpOwotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZHByaW50ayhLRVJOX0lORk8gIk9vb3BzOiBJUiBjb25maWcgZXJyb3IgW2NhcmQ9JWRdXG4iLCBidHYtPmMudHlwZSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlOwogCX0KIAogCWlmIChpci0+cmM1X2dwaW8pIHsKQEAgLTM4OSwzMiArNDIzLDI2IEBACiAJaW5wdXRfZGV2LT5jZGV2LmRldiA9ICZidHYtPmMucGNpLT5kZXY7CiAKIAlidHYtPnJlbW90ZSA9IGlyOwotCWlmIChpci0+cG9sbGluZykgewotCQlpbml0X3RpbWVyKCZpci0+dGltZXIpOwotCQlpci0+dGltZXIuZnVuY3Rpb24gPSBidHR2X2lucHV0X3RpbWVyOwotCQlpci0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylidHY7Ci0JCWlyLT50aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyBIWjsKLQkJYWRkX3RpbWVyKCZpci0+dGltZXIpOwotCX0gZWxzZSBpZiAoaXItPnJjNV9ncGlvKSB7Ci0JCS8qIHNldCB0aW1lcl9lbmQgZm9yIGNvZGUgY29tcGxldGlvbiAqLwotCQlpbml0X3RpbWVyKCZpci0+dGltZXJfZW5kKTsKLQkJaXItPnRpbWVyX2VuZC5mdW5jdGlvbiA9IGJ0dHZfcmM1X3RpbWVyX2VuZDsKLQkJaXItPnRpbWVyX2VuZC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaXI7Ci0KLQkJaW5pdF90aW1lcigmaXItPnRpbWVyX2tleXVwKTsKLQkJaXItPnRpbWVyX2tleXVwLmZ1bmN0aW9uID0gYnR0dl9yYzVfdGltZXJfa2V5dXA7Ci0JCWlyLT50aW1lcl9rZXl1cC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaXI7Ci0JfQorCWJ0dHZfaXJfc3RhcnQoYnR2LCBpcik7CiAKIAkvKiBhbGwgZG9uZSAqLwotCWlucHV0X3JlZ2lzdGVyX2RldmljZShidHYtPnJlbW90ZS0+ZGV2KTsKLQlwcmludGsoREVWTkFNRSAiOiAlcyBkZXRlY3RlZCBhdCAlc1xuIixpci0+bmFtZSxpci0+cGh5cyk7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGJ0di0+cmVtb3RlLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9zdG9wOwogCiAJLyogdGhlIHJlbW90ZSBpc24ndCBhcyBib3VuY3kgYXMgYSBrZXlib2FyZCAqLwogCWlyLT5kZXYtPnJlcFtSRVBfREVMQVldID0gcmVwZWF0X2RlbGF5OwogCWlyLT5kZXYtPnJlcFtSRVBfUEVSSU9EXSA9IHJlcGVhdF9wZXJpb2Q7CiAKIAlyZXR1cm4gMDsKKworIGVycl9vdXRfc3RvcDoKKwlidHR2X2lyX3N0b3AoYnR2KTsKKwlidHYtPnJlbW90ZSA9IE5VTEw7CisgZXJyX291dF9mcmVlOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoaXIpOworCXJldHVybiBlcnI7CiB9CiAKIHZvaWQgYnR0dl9pbnB1dF9maW5pKHN0cnVjdCBidHR2ICpidHYpCkBAIC00MjIsMjIgKzQ1MCw3IEBACiAJaWYgKGJ0di0+cmVtb3RlID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmIChidHYtPnJlbW90ZS0+cG9sbGluZykgewotCQlkZWxfdGltZXJfc3luYygmYnR2LT5yZW1vdGUtPnRpbWVyKTsKLQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQl9Ci0KLQotCWlmIChidHYtPnJlbW90ZS0+cmM1X2dwaW8pIHsKLQkJdTMyIGdwaW87Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJmJ0di0+cmVtb3RlLT50aW1lcl9lbmQpOwotCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCi0JCWdwaW8gPSBidHR2X2dwaW9fcmVhZCgmYnR2LT5jKTsKLQkJYnR0dl9ncGlvX3dyaXRlKCZidHYtPmMsIGdwaW8gJiB+KDEgPDwgNCkpOwotCX0KLQorCWJ0dHZfaXJfc3RvcChidHYpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGJ0di0+cmVtb3RlLT5kZXYpOwogCWtmcmVlKGJ0di0+cmVtb3RlKTsKIAlidHYtPnJlbW90ZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy1yZWdzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy1yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjMjJhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLXJlZ3MuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgbTg4YWxwMDEgY2FtZXJhIGludGVyZmFjZS4gIE9mZnNldHMgaW4gYnl0ZXMKKyAqIGFzIGdpdmVuIGluIHRoZSBzcGVjLgorICoKKyAqIENvcHlyaWdodCAyMDA2IE9uZSBMYXB0b3AgUGVyIENoaWxkIEFzc29jaWF0aW9uLCBJbmMuCisgKgorICogV3JpdHRlbiBieSBKb25hdGhhbiBDb3JiZXQsIGNvcmJldEBsd24ubmV0LgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyAqLworI2RlZmluZSBSRUdfWTBCQVIJMHgwMAorI2RlZmluZSBSRUdfWTFCQVIJMHgwNAorI2RlZmluZSBSRUdfWTJCQVIJMHgwOAorLyogLi4uICovCisKKyNkZWZpbmUgUkVHX0lNR1BJVENICTB4MjQJLyogSW1hZ2UgcGl0Y2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBJTUdQX1lQX1NIRlQJICAyCQkvKiBZIHBpdGNoIHBhcmFtcyAqLworI2RlZmluZSAgIElNR1BfWVBfTUFTSwkgIDB4MDAwMDNmZmMJLyogWSBwaXRjaCBmaWVsZCAqLworI2RlZmluZQkgIElNR1BfVVZQX1NIRlQJICAxOAkJLyogVVYgcGl0Y2ggKHBsYW5hcikgKi8KKyNkZWZpbmUgICBJTUdQX1VWUF9NQVNLICAgMHgzZmZjMDAwMAorI2RlZmluZSBSRUdfSVJRU1RBVFJBVwkweDI4CS8qIFJBVyBJUlEgU3RhdHVzICovCisjZGVmaW5lICAgSVJRX0VPRjAJICAweDAwMDAwMDAxCS8qIEVuZCBvZiBmcmFtZSAwICovCisjZGVmaW5lICAgSVJRX0VPRjEJICAweDAwMDAwMDAyCS8qIEVuZCBvZiBmcmFtZSAxICovCisjZGVmaW5lICAgSVJRX0VPRjIJICAweDAwMDAwMDA0CS8qIEVuZCBvZiBmcmFtZSAyICovCisjZGVmaW5lICAgSVJRX1NPRjAJICAweDAwMDAwMDA4CS8qIFN0YXJ0IG9mIGZyYW1lIDAgKi8KKyNkZWZpbmUgICBJUlFfU09GMQkgIDB4MDAwMDAwMTAJLyogU3RhcnQgb2YgZnJhbWUgMSAqLworI2RlZmluZSAgIElSUV9TT0YyCSAgMHgwMDAwMDAyMAkvKiBTdGFydCBvZiBmcmFtZSAyICovCisjZGVmaW5lICAgSVJRX09WRVJGTE9XCSAgMHgwMDAwMDA0MAkvKiBGSUZPIG92ZXJmbG93ICovCisjZGVmaW5lICAgSVJRX1RXU0lXCSAgMHgwMDAxMDAwMAkvKiBUV1NJIChzbWJ1cykgd3JpdGUgKi8KKyNkZWZpbmUgICBJUlFfVFdTSVIJICAweDAwMDIwMDAwCS8qIFRXU0kgcmVhZCAqLworI2RlZmluZSAgIElSUV9UV1NJRQkgIDB4MDAwNDAwMDAJLyogVFdTSSBlcnJvciAqLworI2RlZmluZSAgIFRXU0lJUlFTIChJUlFfVFdTSVd8SVJRX1RXU0lSfElSUV9UV1NJRSkKKyNkZWZpbmUgICBGUkFNRUlSUVMgKElSUV9FT0YwfElSUV9FT0YxfElSUV9FT0YyfElSUV9TT0YwfElSUV9TT0YxfElSUV9TT0YyKQorI2RlZmluZSAgIEFMTElSUVMgKFRXU0lJUlFTfEZSQU1FSVJRU3xJUlFfT1ZFUkZMT1cpCisjZGVmaW5lIFJFR19JUlFNQVNLCTB4MmMJLyogSVJRIG1hc2sgLSBzYW1lIGJpdHMgYXMgSVJRU1RBVCAqLworI2RlZmluZSBSRUdfSVJRU1RBVAkweDMwCS8qIElSUSBzdGF0dXMgLyBjbGVhciAqLworCisjZGVmaW5lIFJFR19JTUdTSVpFCTB4MzQJLyogSW1hZ2Ugc2l6ZSAqLworI2RlZmluZSAgSU1HU1pfVl9NQVNLCSAgMHgxZmZmMDAwMAorI2RlZmluZSAgSU1HU1pfVl9TSElGVAkgIDE2CisjZGVmaW5lCSBJTUdTWl9IX01BU0sJICAweDAwMDAzZmZmCisjZGVmaW5lIFJFR19JTUdPRkZTRVQJMHgzOAkvKiBJTWFnZSBvZmZzZXQgKi8KKworI2RlZmluZSBSRUdfQ1RSTDAJMHgzYwkvKiBDb250cm9sIDAgKi8KKyNkZWZpbmUgICBDMF9FTkFCTEUJICAweDAwMDAwMDAxCS8qIE1ha2VzIHRoZSB3aG9sZSB0aGluZyBnbyAqLworCisvKiBNYXNrIGZvciBhbGwgdGhlIGZvcm1hdCBiaXRzICovCisjZGVmaW5lICAgQzBfREZfTUFTSwkgIDB4MDBmZmZmZmMgICAgLyogQml0cyAyLTIzICovCisKKy8qIFJHQiBvcmRlcmluZyAqLworI2RlZmluZSAgIEMwX1JHQjRfUkdCWAkgIDB4MDAwMDAwMDAKKyNkZWZpbmUJICBDMF9SR0I0X1hSR0IJICAweDAwMDAwMDA0CisjZGVmaW5lCSAgQzBfUkdCNF9CR1JYCSAgMHgwMDAwMDAwOAorI2RlZmluZSAgIEMwX1JHQjRfWEJHUgkgIDB4MDAwMDAwMGMKKyNkZWZpbmUgICBDMF9SR0I1X1JHR0IJICAweDAwMDAwMDAwCisjZGVmaW5lCSAgQzBfUkdCNV9HUkJHCSAgMHgwMDAwMDAwNAorI2RlZmluZQkgIEMwX1JHQjVfR0JSRwkgIDB4MDAwMDAwMDgKKyNkZWZpbmUgICBDMF9SR0I1X0JHR1IJICAweDAwMDAwMDBjCisKKy8qIFNwZWMgaGFzIHR3byBmaWVsZHMgZm9yIERJTiBhbmQgRE9VVCwgYnV0IHRoZXkgbXVzdCBtYXRjaCwgc28KKyAgIGNvbWJpbmUgdGhlbSBoZXJlLiAqLworI2RlZmluZSAgIEMwX0RGX1lVVgkgIDB4MDAwMDAwMDAgICAgLyogRGF0YSBpcyBZVVYJICAgICovCisjZGVmaW5lICAgQzBfREZfUkdCCSAgMHgwMDAwMDBhMAkvKiAuLi4gUkdCCQkgICAgKi8KKyNkZWZpbmUgICBDMF9ERl9CQVlFUiAgICAgMHgwMDAwMDE0MAkvKiAuLi4gQmF5ZXIgICAgICAgICAgICAgICAgKi8KKy8qIDgtOC04IG11c3QgYmUgbWlzc2luZyBmcm9tIHRoZSBiZWxvdyAtIGFzayAqLworI2RlZmluZSAgIEMwX1JHQkZfNTY1CSAgMHgwMDAwMDAwMAorI2RlZmluZSAgIEMwX1JHQkZfNDQ0CSAgMHgwMDAwMDgwMAorI2RlZmluZSAgIEMwX1JHQl9CR1IJICAweDAwMDAxMDAwCS8qIEJsdWUgY29tZXMgZmlyc3QgKi8KKyNkZWZpbmUgICBDMF9ZVVZfUExBTkFSCSAgMHgwMDAwMDAwMAkvKiBZVVYgNDIyIHBsYW5hciBmb3JtYXQgKi8KKyNkZWZpbmUgICBDMF9ZVVZfUEFDS0VECSAgMHgwMDAwODAwMAkvKiBZVVYgNDIyIHBhY2tlZAkqLworI2RlZmluZSAgIEMwX1lVVl80MjBQTAkgIDB4MDAwMGEwMDAJLyogWVVWIDQyMCBwbGFuYXIJKi8KKy8qIFRoaW5rIHRoYXQgNDIwIHBhY2tlZCBtdXN0IGJlIDExMSAtIGFzayAqLworI2RlZmluZQkgIEMwX1lVVkVfWVVZVgkgIDB4MDAwMDAwMDAJLyogWTFDYlkwQ3IgCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWVZZVQkgIDB4MDAwMTAwMDAJLyogWTFDclkwQ2IgCQkqLworI2RlZmluZQkgIEMwX1lVVkVfVllVWQkgIDB4MDAwMjAwMDAJLyogQ3JZMUNiWTAgCQkqLworI2RlZmluZQkgIEMwX1lVVkVfVVlWWQkgIDB4MDAwMzAwMDAJLyogQ2JZMUNyWTAgCQkqLworI2RlZmluZSAgIEMwX1lVVkVfWFlVVgkgIDB4MDAwMDAwMDAgICAgLyogNDIwOiAuWVVWCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFlWVQkgIDB4MDAwMTAwMDAJLyogNDIwOiAuWVZVIAkJKi8KKyNkZWZpbmUJICBDMF9ZVVZFX1hVVlkJICAweDAwMDIwMDAwCS8qIDQyMDogLlVWWSAJCSovCisjZGVmaW5lCSAgQzBfWVVWRV9YVlVZCSAgMHgwMDAzMDAwMAkvKiA0MjA6IC5WVVkgCQkqLworLyogQmF5ZXIgYml0cyAxOCwxOSBpZiBuZWVkZWQgKi8KKyNkZWZpbmUgICBDMF9IUE9MX0xPVwkgIDB4MDEwMDAwMDAJLyogSFNZTkMgcG9sYXJpdHkgYWN0aXZlIGxvdyAqLworI2RlZmluZSAgIEMwX1ZQT0xfTE9XCSAgMHgwMjAwMDAwMAkvKiBWU1lOQyBwb2xhcml0eSBhY3RpdmUgbG93ICovCisjZGVmaW5lICAgQzBfVkNMS19MT1cJICAweDA0MDAwMDAwCS8qIFZDTEsgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lICAgQzBfRE9XTlNDQUxFCSAgMHgwODAwMDAwMAkvKiBFbmFibGUgZG93bnNjYWxlciAqLworI2RlZmluZQkgIEMwX1NJRk1fTUFTSwkgIDB4YzAwMDAwMDAJLyogU0lGIG1vZGUgYml0cyAqLworI2RlZmluZSAgIEMwX1NJRl9IVlNZTkMJICAweDAwMDAwMDAwCS8qIFVzZSBIL1ZTWU5DICovCisjZGVmaW5lICAgQ09fU09GX05PU1lOQwkgIDB4NDAwMDAwMDAJLyogVXNlIGluYmFuZCBhY3RpdmUgc2lnbmFsaW5nICovCisKKworI2RlZmluZSBSRUdfQ1RSTDEJMHg0MAkvKiBDb250cm9sIDEgKi8KKyNkZWZpbmUgICBDMV80NDRBTFBIQQkgIDB4MDBmMDAwMDAJLyogQWxwaGEgZmllbGQgaW4gUkdCNDQ0ICovCisjZGVmaW5lICAgQzFfQUxQSEFfU0hGVAkgIDIwCisjZGVmaW5lICAgQzFfRE1BQjMyCSAgMHgwMDAwMDAwMAkvKiAzMi1ieXRlIERNQSBidXJzdCAqLworI2RlZmluZSAgIEMxX0RNQUIxNgkgIDB4MDIwMDAwMDAJLyogMTYtYnl0ZSBETUEgYnVyc3QgKi8KKyNkZWZpbmUJICBDMV9ETUFCNjQJICAweDA0MDAwMDAwCS8qIDY0LWJ5dGUgRE1BIGJ1cnN0ICovCisjZGVmaW5lCSAgQzFfRE1BQl9NQVNLCSAgMHgwNjAwMDAwMAorI2RlZmluZSAgIEMxX1RXT0JVRlMJICAweDA4MDAwMDAwCS8qIFVzZSBvbmx5IHR3byBETUEgYnVmZmVycyAqLworI2RlZmluZSAgIEMxX1BXUkRXTgkgIDB4MTAwMDAwMDAJLyogUG93ZXIgZG93biAqLworCisjZGVmaW5lIFJFR19DTEtDVFJMCTB4ODgJLyogQ2xvY2sgY29udHJvbCAqLworI2RlZmluZSAgIENMS19ESVZfTUFTSwkgIDB4MDAwMGZmZmYJLyogVXBwZXIgYml0cyBSVyAicmVzZXJ2ZWQiICovCisKKyNkZWZpbmUgUkVHX0dQUgkJMHhiNAkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIuICBUaGlzCisJCQkJICAgY29udHJvbHMgaW5wdXRzIHRvIHRoZSBwb3dlciBhbmQgcmVzZXQKKwkJCQkgICBwaW5zIG9uIHRoZSBPVjc2NzAgdXNlZCB3aXRoIE9MUEM7CisJCQkJICAgb3RoZXIgZGVwbG95bWVudHMgY291bGQgZGlmZmVyLiAgKi8KKyNkZWZpbmUgICBHUFJfQzFFTgkgIDB4MDAwMDAwMjAJLyogUGFkIDEgKHBvd2VyIGRvd24pIGVuYWJsZSAqLworI2RlZmluZSAgIEdQUl9DMEVOCSAgMHgwMDAwMDAxMAkvKiBQYWQgMCAocmVzZXQpIGVuYWJsZSAqLworI2RlZmluZQkgIEdQUl9DMQkgIDB4MDAwMDAwMDIJLyogQ29udHJvbCAxIHZhbHVlICovCisvKgorICogQ29udHJvbCAwIGlzIHdpcmVkIHRvIHJlc2V0IG9uIE9MUEMgbWFjaGluZXMuICBGb3Igb3Y3eCBzZW5zb3JzLAorICogaXQgaXMgYWN0aXZlIGxvdywgZm9yIDB2NngsIGluc3RlYWQsIGl0J3MgYWN0aXZlIGhpZ2guICBXaGF0CisgKiBmdW4uCisgKi8KKyNkZWZpbmUgICBHUFJfQzAJICAweDAwMDAwMDAxCS8qIENvbnRyb2wgMCB2YWx1ZSAqLworCisjZGVmaW5lIFJFR19UV1NJQzAJMHhiOAkvKiBUV1NJIChzbWJ1cykgY29udHJvbCAwICovCisjZGVmaW5lICAgVFdTSUMwX0VOICAgICAgIDB4MDAwMDAwMDEJLyogVFdTSSBlbmFibGUgKi8KKyNkZWZpbmUgICBUV1NJQzBfTU9ERQkgIDB4MDAwMDAwMDIJLyogMSA9IDE2LWJpdCwgMCA9IDgtYml0ICovCisjZGVmaW5lICAgVFdTSUMwX1NJRAkgIDB4MDAwMDAzZmMJLyogU2xhdmUgSUQgKi8KKyNkZWZpbmUgICBUV1NJQzBfU0lEX1NISUZUIDIKKyNkZWZpbmUgICBUV1NJQzBfQ0xLRElWICAgMHgwMDA3ZmMwMAkvKiBDbG9jayBkaXZpZGVyICovCisjZGVmaW5lICAgVFdTSUMwX01BU0tBQ0sgIDB4MDA0MDAwMDAJLyogTWFzayBhY2sgZnJvbSBzZW5zb3IgKi8KKyNkZWZpbmUgICBUV1NJQzBfT1ZNQUdJQyAgMHgwMDgwMDAwMAkvKiBNYWtlIGl0IHdvcmsgb24gT1Ygc2Vuc29ycyAqLworCisjZGVmaW5lIFJFR19UV1NJQzEJMHhiYwkvKiBUV1NJIGNvbnRyb2wgMSAqLworI2RlZmluZSAgIFRXU0lDMV9EQVRBCSAgMHgwMDAwZmZmZgkvKiBEYXRhIHRvL2Zyb20gY2FtY2hpcCAqLworI2RlZmluZSAgIFRXU0lDMV9BRERSCSAgMHgwMGZmMDAwMAkvKiBBZGRyZXNzIChyZWdpc3RlcikgKi8KKyNkZWZpbmUgICBUV1NJQzFfQUREUl9TSElGVCAxNgorI2RlZmluZSAgIFRXU0lDMV9SRUFECSAgMHgwMTAwMDAwMAkvKiBTZXQgZm9yIHJlYWQgb3AgKi8KKyNkZWZpbmUgICBUV1NJQzFfV1NUQVQJICAweDAyMDAwMDAwCS8qIFdyaXRlIHN0YXR1cyAqLworI2RlZmluZSAgIFRXU0lDMV9SVkFMSUQJICAweDA0MDAwMDAwCS8qIFJlYWQgZGF0YSB2YWxpZCAqLworI2RlZmluZSAgIFRXU0lDMV9FUlJPUgkgIDB4MDgwMDAwMDAJLyogU29tZXRoaW5nIHNjcmV3ZWQgdXAgKi8KKworCisjZGVmaW5lIFJFR19VQkFSCTB4YzQJLyogVXBwZXIgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCisKKy8qCisgKiBIZXJlJ3MgdGhlIHdlaXJkIGdsb2JhbCBjb250cm9sIHJlZ2lzdGVycyB3aGljaCBhcmUgc2FpZCB0byBsaXZlCisgKiB3YXkgdXAgaGVyZS4KKyAqLworI2RlZmluZSBSRUdfR0xfQ1NSICAgICAweDMwMDQgIC8qIENvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICAgR0NTUl9TUlMJIDB4MDAwMDAwMDEJLyogU1cgUmVzZXQgc2V0ICovCisjZGVmaW5lICAgR0NTUl9TUkMgIAkgMHgwMDAwMDAwMgkvKiBTVyBSZXNldCBjbGVhciAqLworI2RlZmluZQkgIEdDU1JfTVJTCSAweDAwMDAwMDA0CS8qIE1hc3RlciByZXNldCBzZXQgKi8KKyNkZWZpbmUJICBHQ1NSX01SQwkgMHgwMDAwMDAwOAkvKiBIVyBSZXNldCBjbGVhciAqLworI2RlZmluZSAgIEdDU1JfQ0NJQ19FTiAgIDB4MDAwMDQwMDAgICAgLyogQ0NJQyBDbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgUkVHX0dMX0lNQVNLICAgMHgzMDBjICAvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSAgIEdJTVNLX0NDSUNfRU4gICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBDQ0lDIEludGVycnVwdCBlbmFibGUgKi8KKworI2RlZmluZSBSRUdfTEVOICAgICAgICAgICAgICAgIFJFR19HTF9JTUFTSyArIDQKKworCisvKgorICogVXNlZnVsIHN0dWZmIHRoYXQgcHJvYmFibHkgYmVsb25ncyBzb21ld2hlcmUgZ2xvYmFsLgorICovCisjZGVmaW5lIFZHQV9XSURUSAk2NDAKKyNkZWZpbmUgVkdBX0hFSUdIVAk0ODAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDdjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCkBAIC0wLDAgKzEsMjIyOCBAQAorLyoKKyAqIEEgZHJpdmVyIGZvciB0aGUgQ01PUyBjYW1lcmEgY29udHJvbGxlciBpbiB0aGUgTWFydmVsbCA4OEFMUDAxICJjYWZlIgorICogbXVsdGlmdW5jdGlvbiBjaGlwLiAgQ3VycmVudGx5IHdvcmtzIHdpdGggdGhlIE9tbml2aXNpb24gT1Y3NjcwCisgKiBzZW5zb3IuCisgKgorICogQ29weXJpZ2h0IDIwMDYgT25lIExhcHRvcCBQZXIgQ2hpbGQgQXNzb2NpYXRpb24sIEluYy4KKyAqCisgKiBXcml0dGVuIGJ5IEpvbmF0aGFuIENvcmJldCwgY29yYmV0QGx3bi5uZXQuCisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJjYWZlX2NjaWMtcmVncy5oIgorCisjZGVmaW5lIENBRkVfVkVSU0lPTiAweDAwMDAwMQorCisKKy8qCisgKiBQYXJhbWV0ZXJzLgorICovCitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIDg4QUxQMDEgQ01PUyBDYW1lcmEgQ29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJWaWRlbyIpOworCisvKgorICogSW50ZXJuYWwgRE1BIGJ1ZmZlciBtYW5hZ2VtZW50LiAgU2luY2UgdGhlIGNvbnRyb2xsZXIgY2Fubm90IGRvIFMvRyBJL08sCisgKiB3ZSBtdXN0IGhhdmUgcGh5c2ljYWxseSBjb250aWd1b3VzIGJ1ZmZlcnMgdG8gYnJpbmcgZnJhbWVzIGludG8uCisgKiBUaGVzZSBwYXJhbWV0ZXJzIGNvbnRyb2wgaG93IG1hbnkgYnVmZmVycyB3ZSB1c2UsIHdoZXRoZXIgd2UKKyAqIGFsbG9jYXRlIHRoZW0gYXQgbG9hZCB0aW1lIChiZXR0ZXIgY2hhbmNlIG9mIHN1Y2Nlc3MsIGJ1dCBuYWlscyBkb3duCisgKiBtZW1vcnkpIG9yIHdoZW4gc29tZWJvZHkgdHJpZXMgdG8gdXNlIHRoZSBjYW1lcmEgKHJpc2tpZXIpLCBhbmQsCisgKiBmb3IgbG9hZC10aW1lIGFsbG9jYXRpb24sIGhvdyBiaWcgdGhleSBzaG91bGQgYmUuCisgKgorICogVGhlIGNvbnRyb2xsZXIgY2FuIGN5Y2xlIHRocm91Z2ggdGhyZWUgYnVmZmVycy4gIFdlIGNvdWxkIHVzZQorICogbW9yZSBieSBmbGlwcGluZyBwb2ludGVycyBhcm91bmQsIGJ1dCBpdCBwcm9iYWJseSBtYWtlcyBsaXR0bGUKKyAqIHNlbnNlLgorICovCisKKyNkZWZpbmUgTUFYX0RNQV9CVUZTIDMKK3N0YXRpYyBpbnQgYWxsb2NfYnVmc19hdF9sb2FkID0gMDsKK21vZHVsZV9wYXJhbShhbGxvY19idWZzX2F0X2xvYWQsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY19idWZzX2F0X2xvYWQsCisJCSJOb24temVybyB2YWx1ZSBjYXVzZXMgRE1BIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIGF0IG1vZHVsZSAiCisJCSJsb2FkIHRpbWUuICBUaGlzIGluY3JlYXNlcyB0aGUgY2hhbmNlcyBvZiBzdWNjZXNzZnVsbHkgZ2V0dGluZyAiCisJCSJ0aG9zZSBidWZmZXJzLCBidXQgYXQgdGhlIGNvc3Qgb2YgbmFpbGluZyBkb3duIHRoZSBtZW1vcnkgZnJvbSAiCisJCSJ0aGUgb3V0c2V0LiIpOworCitzdGF0aWMgaW50IG5fZG1hX2J1ZnMgPSAzOworbW9kdWxlX3BhcmFtKG5fZG1hX2J1ZnMsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhuX2RtYV9idWZzLAorCQkiVGhlIG51bWJlciBvZiBETUEgYnVmZmVycyB0byBhbGxvY2F0ZS4gIENhbiBiZSBlaXRoZXIgdHdvICIKKwkJIihzYXZlcyBtZW1vcnksIG1ha2VzIHRpbWluZyB0aWdodGVyKSBvciB0aHJlZS4iKTsKKworc3RhdGljIGludCBkbWFfYnVmX3NpemUgPSBWR0FfV0lEVEggKiBWR0FfSEVJR0hUICogMjsgIC8qIFdvcnN0IGNhc2UgKi8KK21vZHVsZV9wYXJhbShkbWFfYnVmX3NpemUsIHVpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkbWFfYnVmX3NpemUsCisJCSJUaGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIERNQSBidWZmZXJzLiAgSWYgYWN0dWFsIG9wZXJhdGluZyAiCisJCSJwYXJhbWV0ZXJzIHJlcXVpcmUgbGFyZ2VyIGJ1ZmZlcnMsIGFuIGF0dGVtcHQgdG8gcmVhbGxvY2F0ZSAiCisJCSJ3aWxsIGJlIG1hZGUuIik7CisKK3N0YXRpYyBpbnQgbWluX2J1ZmZlcnMgPSAxOworbW9kdWxlX3BhcmFtKG1pbl9idWZmZXJzLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2J1ZmZlcnMsCisJCSJUaGUgbWluaW11bSBudW1iZXIgb2Ygc3RyZWFtaW5nIEkvTyBidWZmZXJzIHdlIGFyZSB3aWxsaW5nICIKKwkJInRvIHdvcmsgd2l0aC4iKTsKKworc3RhdGljIGludCBtYXhfYnVmZmVycyA9IDEwOworbW9kdWxlX3BhcmFtKG1heF9idWZmZXJzLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2J1ZmZlcnMsCisJCSJUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtaW5nIEkvTyBidWZmZXJzIGFuIGFwcGxpY2F0aW9uICIKKwkJIndpbGwgYmUgYWxsb3dlZCB0byBhbGxvY2F0ZS4gIFRoZXNlIGJ1ZmZlcnMgYXJlIGJpZyBhbmQgbGl2ZSAiCisJCSJpbiB2bWFsbG9jIHNwYWNlLiIpOworCitzdGF0aWMgaW50IGZsaXAgPSAwOworbW9kdWxlX3BhcmFtKGZsaXAsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhmbGlwLAorCQkiSWYgc2V0LCB0aGUgc2Vuc29yIHdpbGwgYmUgaW5zdHJ1Y3RlZCB0byBmbGlwIHRoZSBpbWFnZSAiCisJCSJ2ZXJ0aWNhbGx5LiIpOworCisKK2VudW0gY2FmZV9zdGF0ZSB7CisJU19OT1RSRUFEWSwJLyogTm90IHlldCBpbml0aWFsaXplZCAqLworCVNfSURMRSwJCS8qIEp1c3QgaGFuZ2luZyBhcm91bmQgKi8KKwlTX0ZMQUtFRCwJLyogU29tZSBzb3J0IG9mIHByb2JsZW0gKi8KKwlTX1NJTkdMRVJFQUQsCS8qIEluIHJlYWQoKSAqLworCVNfU1BFQ1JFQUQsICAgCS8qIFNwZWN1bGF0aXZlIHJlYWQgKGZvciBmdXR1cmUgcmVhZCgpKSAqLworCVNfU1RSRUFNSU5HCS8qIFN0cmVhbWluZyBkYXRhICovCit9OworCisvKgorICogVHJhY2tpbmcgb2Ygc3RyZWFtaW5nIEkvTyBidWZmZXJzLgorICovCitzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHY0bDJfYnVmZmVyIHY0bGJ1ZjsKKwljaGFyICpidWZmZXI7ICAgLyogV2hlcmUgaXQgbGl2ZXMgaW4ga2VybmVsIHNwYWNlICovCisJaW50IG1hcGNvdW50OworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtOworfTsKKworLyoKKyAqIEEgZGVzY3JpcHRpb24gb2Ygb25lIG9mIG91ciBkZXZpY2VzLgorICogTG9ja2luZzogY29udHJvbGxlZCBieSBzX211dGV4LiAgQ2VydGFpbiBmaWVsZHMsIGhvd2V2ZXIsIHJlcXVpcmUKKyAqIAkgICAgdGhlIGRldl9sb2NrIHNwaW5sb2NrOyB0aGV5IGFyZSBtYXJrZWQgYXMgc3VjaCBieSBjb21tZW50cy4KKyAqCSAgICBkZXZfbG9jayBpcyBhbHNvIHJlcXVpcmVkIGZvciBhY2Nlc3MgdG8gZGV2aWNlIHJlZ2lzdGVycy4KKyAqLworc3RydWN0IGNhZmVfY2FtZXJhCit7CisJZW51bSBjYWZlX3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7ICAgCQkvKiBCdWZmZXIgc3RhdHVzLCBtYWlubHkgKGRldl9sb2NrKSAqLworCWludCB1c2VyczsJCQkvKiBIb3cgbWFueSBvcGVuIEZEcyAqLworCXN0cnVjdCBmaWxlICpvd25lcjsJCS8qIFdobyBoYXMgZGF0YSBhY2Nlc3MgKHY0bDIpICovCisKKwkvKgorCSAqIFN1YnN5c3RlbSBzdHJ1Y3R1cmVzLgorCSAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgdjRsZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqc2Vuc29yOworCisJdW5zaWduZWQgY2hhciBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2xpc3Q7CS8qIGxpbmsgdG8gb3RoZXIgZGV2aWNlcyAqLworCisJLyogRE1BIGJ1ZmZlcnMgKi8KKwl1bnNpZ25lZCBpbnQgbmJ1ZnM7CQkvKiBIb3cgbWFueSBhcmUgYWxsb2MnZCAqLworCWludCBuZXh0X2J1ZjsJCQkvKiBOZXh0IHRvIGNvbnN1bWUgKGRldl9sb2NrKSAqLworCXVuc2lnbmVkIGludCBkbWFfYnVmX3NpemU7ICAJLyogYWxsb2NhdGVkIHNpemUgKi8KKwl2b2lkICpkbWFfYnVmc1tNQVhfRE1BX0JVRlNdOwkvKiBJbnRlcm5hbCBidWZmZXIgYWRkcmVzc2VzICovCisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlc1tNQVhfRE1BX0JVRlNdOyAvKiBCdWZmZXIgYnVzIGFkZHJlc3NlcyAqLworCXVuc2lnbmVkIGludCBzcGVjZnJhbWVzOwkvKiBVbmNvbnN1bWVkIHNwZWMgZnJhbWVzIChkZXZfbG9jaykgKi8KKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CQkvKiBGcmFtZSBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3NlcVtNQVhfRE1BX0JVRlNdOyAvKiBTZXF1ZW5jZSBmb3IgaW5kaXZpZHVhbCBidWZmZXJzICovCisKKwkvKiBTdHJlYW1pbmcgYnVmZmVycyAqLworCXVuc2lnbmVkIGludCBuX3NidWZzOwkJLyogSG93IG1hbnkgd2UgaGF2ZSAqLworCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNiX2J1ZnM7IC8qIFRoZSBhcnJheSBvZiBob3VzZWtlZXBpbmcgc3RydWN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgc2JfYXZhaWw7CS8qIEF2YWlsYWJsZSBmb3IgZGF0YSAod2Ugb3duKSAoZGV2X2xvY2spICovCisJc3RydWN0IGxpc3RfaGVhZCBzYl9mdWxsOwkvKiBXaXRoIGRhdGEgKHVzZXIgc3BhY2Ugb3ducykgKGRldl9sb2NrKSAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBzX3Rhc2tsZXQ7CisKKwkvKiBDdXJyZW50IG9wZXJhdGluZyBwYXJhbWV0ZXJzICovCisJZW51bSB2NGwyX2NoaXBfaWRlbnQgc2Vuc29yX3R5cGU7CQkvKiBDdXJyZW50bHkgb3Y3NjcwIG9ubHkgKi8KKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHBpeF9mb3JtYXQ7CisKKwkvKiBMb2NrcyAqLworCXN0cnVjdCBtdXRleCBzX211dGV4OyAvKiBBY2Nlc3MgdG8gdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzcGlubG9ja190IGRldl9sb2NrOyAgLyogQWNjZXNzIHRvIGRldmljZSAqLworCisJLyogTWlzYyAqLworCXdhaXRfcXVldWVfaGVhZF90IHNtYnVzX3dhaXQ7CS8qIFdhaXRpbmcgb24gaTJjIGV2ZW50cyAqLworCXdhaXRfcXVldWVfaGVhZF90IGlvd2FpdDsJLyogV2FpdGluZyBvbiBmcmFtZSBkYXRhICovCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCXN0cnVjdCBkZW50cnkgKmRmc19yZWdzOworCXN0cnVjdCBkZW50cnkgKmRmc19jYW1fcmVnczsKKyNlbmRpZgorfTsKKworLyoKKyAqIFN0YXR1cyBmbGFncy4gIEFsd2F5cyBtYW5pcHVsYXRlZCB3aXRoIGJpdCBvcGVyYXRpb25zLgorICovCisjZGVmaW5lIENGX0JVRjBfVkFMSUQJIDAJLyogQnVmZmVycyB2YWxpZCAtIGZpcnN0IHRocmVlICovCisjZGVmaW5lIENGX0JVRjFfVkFMSUQJIDEKKyNkZWZpbmUgQ0ZfQlVGMl9WQUxJRAkgMgorI2RlZmluZSBDRl9ETUFfQUNUSVZFCSAzCS8qIEEgZnJhbWUgaXMgaW5jb21pbmcgKi8KKyNkZWZpbmUgQ0ZfQ09ORklHX05FRURFRCA0CS8qIE11c3QgY29uZmlndXJlIGhhcmR3YXJlICovCisKKworCisvKgorICogU3RhcnQgb3ZlciB3aXRoIERNQSBidWZmZXJzIC0gZGV2X2xvY2sgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZCBjYWZlX3Jlc2V0X2J1ZmZlcnMoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJaW50IGk7CisKKwljYW0tPm5leHRfYnVmID0gLTE7CisJZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZnM7IGkrKykKKwkJY2xlYXJfYml0KGksICZjYW0tPmZsYWdzKTsKKwljYW0tPnNwZWNmcmFtZXMgPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjYWZlX25lZWRzX2NvbmZpZyhzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjYWZlX3NldF9jb25maWdfbmVlZGVkKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCBpbnQgbmVlZGVkKQoreworCWlmIChuZWVkZWQpCisJCXNldF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KENGX0NPTkZJR19ORUVERUQsICZjYW0tPmZsYWdzKTsKK30KKworCisKKworLyoKKyAqIERlYnVnZ2luZyBhbmQgcmVsYXRlZC4KKyAqLworI2RlZmluZSBjYW1fZXJyKGNhbSwgZm10LCBhcmcuLi4pIFwKKwlkZXZfZXJyKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKKyNkZWZpbmUgY2FtX3dhcm4oY2FtLCBmbXQsIGFyZy4uLikgXAorCWRldl93YXJuKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKKyNkZWZpbmUgY2FtX2RiZyhjYW0sIGZtdCwgYXJnLi4uKSBcCisJZGV2X2RiZygmKGNhbSktPnBkZXYtPmRldiwgZm10LCAjI2FyZyk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXZSBrZWVwIGEgc2ltcGxlIGxpc3Qgb2Yga25vd24gZGV2aWNlcyB0byBzZWFyY2ggYXQgb3BlbiB0aW1lLgorICovCitzdGF0aWMgTElTVF9IRUFEKGNhZmVfZGV2X2xpc3QpOworc3RhdGljIERFRklORV9NVVRFWChjYWZlX2Rldl9saXN0X2xvY2spOworCitzdGF0aWMgdm9pZCBjYWZlX2FkZF9kZXYoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJbXV0ZXhfbG9jaygmY2FmZV9kZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZjYW0tPmRldl9saXN0LCAmY2FmZV9kZXZfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjYWZlX2Rldl9saXN0X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjYWZlX3JlbW92ZV9kZXYoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJbXV0ZXhfbG9jaygmY2FmZV9kZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmY2FtLT5kZXZfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjYWZlX2Rldl9saXN0X2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IGNhZmVfY2FtZXJhICpjYWZlX2ZpbmRfZGV2KGludCBtaW5vcikKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbTsKKworCW11dGV4X2xvY2soJmNhZmVfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYW0sICZjYWZlX2Rldl9saXN0LCBkZXZfbGlzdCkgeworCQlpZiAoY2FtLT52NGxkZXYubWlub3IgPT0gbWlub3IpCisJCQlnb3RvIGRvbmU7CisJfQorCWNhbSA9IE5VTEw7CisgIGRvbmU6CisJbXV0ZXhfdW5sb2NrKCZjYWZlX2Rldl9saXN0X2xvY2spOworCXJldHVybiBjYW07Cit9CisKKworc3RhdGljIHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FmZV9maW5kX2J5X3BkZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW07CisKKwltdXRleF9sb2NrKCZjYWZlX2Rldl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FtLCAmY2FmZV9kZXZfbGlzdCwgZGV2X2xpc3QpIHsKKwkJaWYgKGNhbS0+cGRldiA9PSBwZGV2KQorCQkJZ290byBkb25lOworCX0KKwljYW0gPSBOVUxMOworICBkb25lOgorCW11dGV4X3VubG9jaygmY2FmZV9kZXZfbGlzdF9sb2NrKTsKKwlyZXR1cm4gY2FtOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIERldmljZSByZWdpc3RlciBJL08KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNhZmVfcmVnX3dyaXRlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgcmVnLAorCQl1bnNpZ25lZCBpbnQgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIGNhbS0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhZmVfcmVnX3JlYWQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCisJCXVuc2lnbmVkIGludCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyKGNhbS0+cmVncyArIHJlZyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGNhZmVfcmVnX3dyaXRlX21hc2soc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCByZWcsCisJCXVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGludCB2ID0gY2FmZV9yZWdfcmVhZChjYW0sIHJlZyk7CisKKwl2ID0gKHYgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CisJY2FmZV9yZWdfd3JpdGUoY2FtLCByZWcsIHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2FmZV9yZWdfY2xlYXJfYml0KHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAorCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCByZWcsIDAsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYWZlX3JlZ19zZXRfYml0KHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAorCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCByZWcsIHZhbCwgdmFsKTsKK30KKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhlIEkyQy9TTUJVUyBpbnRlcmZhY2UgdG8gdGhlIGNhbWVyYSBpdHNlbGYgc3RhcnRzIGhlcmUuICBUaGUKKyAqIGNvbnRyb2xsZXIgaGFuZGxlcyBTTUJVUyBpdHNlbGYsIHByZXNlbnRpbmcgYSByZWxhdGl2ZWx5IHNpbXBsZSByZWdpc3RlcgorICogaW50ZXJmYWNlOyBhbGwgd2UgaGF2ZSB0byBkbyBpcyB0byB0ZWxsIGl0IHdoZXJlIHRvIHJvdXRlIHRoZSBkYXRhLgorICovCisjZGVmaW5lIENBRkVfU01CVVNfVElNRU9VVCAoSFopICAvKiBnZW5lcm91cyAqLworCitzdGF0aWMgaW50IGNhZmVfc21idXNfd3JpdGVfZG9uZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjMTsKKworCS8qCisJICogV2UgbXVzdCBkZWxheSBhZnRlciB0aGUgaW50ZXJydXB0LCBvciB0aGUgY29udHJvbGxlciBnZXRzIGNvbmZ1c2VkCisJICogYW5kIG5ldmVyIGRvZXMgZ2l2ZSB1cyBnb29kIHN0YXR1cy4gIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBkbyB0aGlzCisJICogb2Z0ZW4uCisJICovCisJdWRlbGF5KDIwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWMxID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKGMxICYgKFRXU0lDMV9XU1RBVHxUV1NJQzFfRVJST1IpKSAhPSBUV1NJQzFfV1NUQVQ7Cit9CisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c193cml0ZV9kYXRhKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAorCQl1MTYgYWRkciwgdTggY29tbWFuZCwgdTggdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHJ2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJcnZhbCA9IFRXU0lDMF9FTiB8ICgoYWRkciA8PCBUV1NJQzBfU0lEX1NISUZUKSAmIFRXU0lDMF9TSUQpOworCXJ2YWwgfD0gVFdTSUMwX09WTUFHSUM7ICAvKiBNYWtlIE9WIHNlbnNvcnMgd29yayAqLworCS8qCisJICogTWFydmVsbCBzZXogc2V0IGNsa2RpdiB0byBhbGwgMSdzIGZvciBub3cuCisJICovCisJcnZhbCB8PSBUV1NJQzBfQ0xLRElWOworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1RXU0lDMCwgcnZhbCk7CisJKHZvaWQpIGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfVFdTSUMxKTsgLyogZm9yY2Ugd3JpdGUgKi8KKwlydmFsID0gdmFsdWUgfCAoKGNvbW1hbmQgPDwgVFdTSUMxX0FERFJfU0hJRlQpICYgVFdTSUMxX0FERFIpOworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1RXU0lDMSwgcnZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCW1zbGVlcCgyKTsgLyogUmVxdWlyZWQgb3IgdGhpbmdzIGZsYWtlICovCisKKwl3YWl0X2V2ZW50X3RpbWVvdXQoY2FtLT5zbWJ1c193YWl0LCBjYWZlX3NtYnVzX3dyaXRlX2RvbmUoY2FtKSwKKwkJCUNBRkVfU01CVVNfVElNRU9VVCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKworCWlmIChydmFsICYgVFdTSUMxX1dTVEFUKSB7CisJCWNhbV9lcnIoY2FtLCAiU01CVVMgd3JpdGUgKCUwMngvJTAyeC8lMDJ4KSB0aW1lZCBvdXRcbiIsIGFkZHIsCisJCQkJY29tbWFuZCwgdmFsdWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHJ2YWwgJiBUV1NJQzFfRVJST1IpIHsKKwkJY2FtX2VycihjYW0sICJTTUJVUyB3cml0ZSAoJTAyeC8lMDJ4LyUwMngpIGVycm9yXG4iLCBhZGRyLAorCQkJCWNvbW1hbmQsIHZhbHVlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBjYWZlX3NtYnVzX3JlYWRfZG9uZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjMTsKKworCS8qCisJICogV2UgbXVzdCBkZWxheSBhZnRlciB0aGUgaW50ZXJydXB0LCBvciB0aGUgY29udHJvbGxlciBnZXRzIGNvbmZ1c2VkCisJICogYW5kIG5ldmVyIGRvZXMgZ2l2ZSB1cyBnb29kIHN0YXR1cy4gIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBkbyB0aGlzCisJICogb2Z0ZW4uCisJICovCisJdWRlbGF5KDIwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWMxID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYzEgJiAoVFdTSUMxX1JWQUxJRHxUV1NJQzFfRVJST1IpOworfQorCisKKworc3RhdGljIGludCBjYWZlX3NtYnVzX3JlYWRfZGF0YShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKKwkJdTE2IGFkZHIsIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gVFdTSUMwX0VOIHwgKChhZGRyIDw8IFRXU0lDMF9TSURfU0hJRlQpICYgVFdTSUMwX1NJRCk7CisJcnZhbCB8PSBUV1NJQzBfT1ZNQUdJQzsgLyogTWFrZSBPViBzZW5zb3JzIHdvcmsgKi8KKwkvKgorCSAqIE1hcnZlbCBzZXogc2V0IGNsa2RpdiB0byBhbGwgMSdzIGZvciBub3cuCisJICovCisJcnZhbCB8PSBUV1NJQzBfQ0xLRElWOworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1RXU0lDMCwgcnZhbCk7CisJKHZvaWQpIGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfVFdTSUMxKTsgLyogZm9yY2Ugd3JpdGUgKi8KKwlydmFsID0gVFdTSUMxX1JFQUQgfCAoKGNvbW1hbmQgPDwgVFdTSUMxX0FERFJfU0hJRlQpICYgVFdTSUMxX0FERFIpOworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1RXU0lDMSwgcnZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJd2FpdF9ldmVudF90aW1lb3V0KGNhbS0+c21idXNfd2FpdCwKKwkJCWNhZmVfc21idXNfcmVhZF9kb25lKGNhbSksIENBRkVfU01CVVNfVElNRU9VVCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKworCWlmIChydmFsICYgVFdTSUMxX0VSUk9SKSB7CisJCWNhbV9lcnIoY2FtLCAiU01CVVMgcmVhZCAoJTAyeC8lMDJ4KSBlcnJvclxuIiwgYWRkciwgY29tbWFuZCk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoISAocnZhbCAmIFRXU0lDMV9SVkFMSUQpKSB7CisJCWNhbV9lcnIoY2FtLCAiU01CVVMgcmVhZCAoJTAyeC8lMDJ4KSB0aW1lZCBvdXRcbiIsIGFkZHIsCisJCQkJY29tbWFuZCk7CisJCXJldHVybiAtRUlPOworCX0KKwkqdmFsdWUgPSBydmFsICYgMHhmZjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSB0cmFuc2ZlciBvdmVyIFNNQlVTLiAgVGhpcyB0aGluZyBpcyBjYWxsZWQgdW5kZXIKKyAqIHRoZSBpMmMgYnVzIGxvY2ssIHNvIHdlIHNob3VsZG4ndCByYWNlIHdpdGggb3Vyc2VsdmVzLi4uCisgKi8KK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTE2IGFkZHIsCisJCXVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJ3LCB1OCBjb21tYW5kLAorCQlpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOworCWludCByZXQgPSAtRUlOVkFMOworCisJLyoKKwkgKiBSZWZ1c2UgdG8gdGFsayB0byBhbnl0aGluZyBidXQgT1YgY2FtIGNoaXBzLiAgV2Ugc2hvdWxkCisJICogbmV2ZXIgZXZlbiBzZWUgYW4gYXR0ZW1wdCB0byBkbyBzbywgYnV0IG9uZSBuZXZlciBrbm93cy4KKwkgKi8KKwlpZiAoY2FtLT5zZW5zb3IgJiYgYWRkciAhPSBjYW0tPnNlbnNvci0+YWRkcikgeworCQljYW1fZXJyKGNhbSwgImZ1bmt5IHNtYnVzIGFkZHIgJWRcbiIsIGFkZHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyoKKwkgKiBUaGlzIGludGVyZmFjZSB3b3VsZCBhcHBlYXIgdG8gb25seSBkbyBieXRlIGRhdGEgb3BzLiAgT0sKKwkgKiBpdCBjYW4gZG8gd29yZCB0b28sIGJ1dCB0aGUgY2FtIGNoaXAgaGFzIG5vIHVzZSBmb3IgdGhhdC4KKwkgKi8KKwlpZiAoc2l6ZSAhPSBJMkNfU01CVVNfQllURV9EQVRBKSB7CisJCWNhbV9lcnIoY2FtLCAiZnVua3kgeGZlciBzaXplICVkXG4iLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJ3ID09IEkyQ19TTUJVU19XUklURSkKKwkJcmV0ID0gY2FmZV9zbWJ1c193cml0ZV9kYXRhKGNhbSwgYWRkciwgY29tbWFuZCwgZGF0YS0+Ynl0ZSk7CisJZWxzZSBpZiAocncgPT0gSTJDX1NNQlVTX1JFQUQpCisJCXJldCA9IGNhZmVfc21idXNfcmVhZF9kYXRhKGNhbSwgYWRkciwgY29tbWFuZCwgJmRhdGEtPmJ5dGUpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgY2FmZV9zbWJ1c19lbmFibGVfaXJxKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfSVJRTUFTSywgVFdTSUlSUVMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHUzMiBjYWZlX3NtYnVzX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSAgfAorCSAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBjYWZlX3NtYnVzX2FsZ28gPSB7CisJLnNtYnVzX3hmZXIgPSBjYWZlX3NtYnVzX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBjYWZlX3NtYnVzX2Z1bmMKK307CisKKy8qIFNvbWVib2R5IGlzIG9uIHRoZSBidXMgKi8KK3N0YXRpYyBpbnQgY2FmZV9jYW1faW5pdChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSk7CitzdGF0aWMgdm9pZCBjYWZlX2N0bHJfc3RvcF9kbWEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pOworc3RhdGljIHZvaWQgY2FmZV9jdGxyX3Bvd2VyX2Rvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pOworCitzdGF0aWMgaW50IGNhZmVfc21idXNfYXR0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBpMmNfZ2V0X2FkYXBkYXRhKGNsaWVudC0+YWRhcHRlcik7CisKKwkvKgorCSAqIERvbid0IHRhbGsgdG8gY2hpcHMgd2UgZG9uJ3QgcmVjb2duaXplLgorCSAqLworCWlmIChjbGllbnQtPmRyaXZlci0+aWQgPT0gSTJDX0RSSVZFUklEX09WNzY3MCkgeworCQljYW0tPnNlbnNvciA9IGNsaWVudDsKKwkJcmV0dXJuIGNhZmVfY2FtX2luaXQoY2FtKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKworCWlmIChjYW0tPnNlbnNvciA9PSBjbGllbnQpIHsKKwkJY2FmZV9jdGxyX3N0b3BfZG1hKGNhbSk7CisJCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJCWNhbV9lcnIoY2FtLCAibG9zdCB0aGUgc2Vuc29yIVxuIik7CisJCWNhbS0+c2Vuc29yID0gTlVMTDsgIC8qIEJ1bW1lciwgbm8gY2FtZXJhICovCisJCWNhbS0+c3RhdGUgPSBTX05PVFJFQURZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYWZlX3NtYnVzX3NldHVwKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9ICZjYW0tPmkyY19hZGFwdGVyOworCWludCByZXQ7CisKKwljYWZlX3NtYnVzX2VuYWJsZV9pcnEoY2FtKTsKKwlhZGFwLT5pZCA9IEkyQ19IV19TTUJVU19DQUZFOworCWFkYXAtPmNsYXNzID0gSTJDX0NMQVNTX0NBTV9ESUdJVEFMOworCWFkYXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJYWRhcC0+Y2xpZW50X3JlZ2lzdGVyID0gY2FmZV9zbWJ1c19hdHRhY2g7CisJYWRhcC0+Y2xpZW50X3VucmVnaXN0ZXIgPSBjYWZlX3NtYnVzX2RldGFjaDsKKwlhZGFwLT5hbGdvID0gJmNhZmVfc21idXNfYWxnbzsKKwlzdHJjcHkoYWRhcC0+bmFtZSwgImNhZmVfY2NpYyIpOworCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgY2FtKTsKKwlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgY2FmZSBpMmMgYWRhcHRlclxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY2FmZV9zbWJ1c19zaHV0ZG93bihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwlpMmNfZGVsX2FkYXB0ZXIoJmNhbS0+aTJjX2FkYXB0ZXIpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBEZWFsIHdpdGggdGhlIGNvbnRyb2xsZXIuCisgKi8KKworLyoKKyAqIERvIGV2ZXJ5dGhpbmcgd2UgdGhpbmsgd2UgbmVlZCB0byBoYXZlIHRoZSBpbnRlcmZhY2Ugb3BlcmF0aW5nCisgKiBhY2NvcmRpbmcgdG8gdGhlIGRlc2lyZWQgZm9ybWF0LgorICovCitzdGF0aWMgdm9pZCBjYWZlX2N0bHJfZG1hKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCS8qCisJICogU3RvcmUgdGhlIGZpcnN0IHR3byBZIGJ1ZmZlcnMgKHdlIGFyZW4ndCBzdXBwb3J0aW5nCisJICogcGxhbmFyIGZvcm1hdHMgZm9yIG5vdywgc28gbm8gVVYgYnVmcykuICBUaGVuIGVpdGhlcgorCSAqIHNldCB0aGUgdGhpcmQgaWYgaXQgZXhpc3RzLCBvciB0ZWxsIHRoZSBjb250cm9sbGVyCisJICogdG8ganVzdCB1c2UgdHdvLgorCSAqLworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1kwQkFSLCBjYW0tPmRtYV9oYW5kbGVzWzBdKTsKKwljYWZlX3JlZ193cml0ZShjYW0sIFJFR19ZMUJBUiwgY2FtLT5kbWFfaGFuZGxlc1sxXSk7CisJaWYgKGNhbS0+bmJ1ZnMgPiAyKSB7CisJCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1kyQkFSLCBjYW0tPmRtYV9oYW5kbGVzWzJdKTsKKwkJY2FmZV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9UV09CVUZTKTsKKwl9CisJZWxzZQorCQljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9UV09CVUZTKTsKKwljYWZlX3JlZ193cml0ZShjYW0sIFJFR19VQkFSLCAwKTsgLyogMzIgYml0cyBvbmx5IGZvciBub3cgKi8KK30KKworc3RhdGljIHZvaWQgY2FmZV9jdGxyX2ltYWdlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCWludCBpbWdzejsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpmbXQgPSAmY2FtLT5waXhfZm9ybWF0OworCisJaW1nc3ogPSAoKGZtdC0+aGVpZ2h0IDw8IElNR1NaX1ZfU0hJRlQpICYgSU1HU1pfVl9NQVNLKSB8CisJCShmbXQtPmJ5dGVzcGVybGluZSAmIElNR1NaX0hfTUFTSyk7CisJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSU1HU0laRSwgaW1nc3opOworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0lNR09GRlNFVCwgMCk7CisJLyogWVBJVENIIGp1c3QgZHJvcHMgdGhlIGxhc3QgdHdvIGJpdHMgKi8KKwljYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0lNR1BJVENILCBmbXQtPmJ5dGVzcGVybGluZSwKKwkJCUlNR1BfWVBfTUFTSyk7CisJLyoKKwkgKiBUZWxsIHRoZSBjb250cm9sbGVyIGFib3V0IHRoZSBpbWFnZSBmb3JtYXQgd2UgYXJlIHVzaW5nLgorCSAqLworCXN3aXRjaCAoY2FtLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0KSB7CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKKwkgICAgY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKKwkJCSAgICBDMF9ERl9ZVVZ8QzBfWVVWX1BBQ0tFRHxDMF9ZVVZFX1lVWVYsCisJCQkgICAgQzBfREZfTUFTSyk7CisJICAgIGJyZWFrOworCisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNDQ0OgorCSAgICBjYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLAorCQkJICAgIEMwX0RGX1JHQnxDMF9SR0JGXzQ0NHxDMF9SR0I0X1hSR0IsCisJCQkgICAgQzBfREZfTUFTSyk7CisJCS8qIEFscGhhIHZhbHVlPyAqLworCSAgICBicmVhazsKKworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwkgICAgY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKKwkJCSAgICBDMF9ERl9SR0J8QzBfUkdCRl81NjV8QzBfUkdCNV9CR0dSLAorCQkJICAgIEMwX0RGX01BU0spOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIGNhbV9lcnIoY2FtLCAiVW5rbm93biBmb3JtYXQgJXhcbiIsIGNhbS0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCk7CisJICAgIGJyZWFrOworCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSBpdCBrbm93cyB3ZSB3YW50IHRvIHVzZSBoc3luYy92c3luYy4KKwkgKi8KKwljYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLCBDMF9TSUZfSFZTWU5DLAorCQkJQzBfU0lGTV9NQVNLKTsKK30KKworCisvKgorICogQ29uZmlndXJlIHRoZSBjb250cm9sbGVyIGZvciBvcGVyYXRpb247IGNhbGxlciBob2xkcyB0aGUKKyAqIGRldmljZSBtdXRleC4KKyAqLworc3RhdGljIGludCBjYWZlX2N0bHJfY29uZmlndXJlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWNhZmVfY3Rscl9kbWEoY2FtKTsKKwljYWZlX2N0bHJfaW1hZ2UoY2FtKTsKKwljYWZlX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYWZlX2N0bHJfaXJxX2VuYWJsZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwkvKgorCSAqIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMsIHNpbmNlIHdlIGRvIG5vdAorCSAqIGV4cGVjdCB0byBoYXZlIEkvTyBhY3RpdmUgcHJpb3IgdG8gZW5hYmxpbmcuCisJICovCisJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRU1RBVCwgRlJBTUVJUlFTKTsKKwljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0lSUU1BU0ssIEZSQU1FSVJRUyk7Cit9CisKK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9pcnFfZGlzYWJsZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfSVJRTUFTSywgRlJBTUVJUlFTKTsKK30KKworLyoKKyAqIE1ha2UgdGhlIGNvbnRyb2xsZXIgc3RhcnQgZ3JhYmJpbmcgaW1hZ2VzLiAgRXZlcnl0aGluZyBtdXN0CisgKiBiZSBzZXQgdXAgYmVmb3JlIGRvaW5nIHRoaXMuCisgKi8KK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9zdGFydChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwkvKiBzZXRfYml0IHBlcmZvcm1zIGEgcmVhZCwgc28gbm8gb3RoZXIgYmFycmllciBzaG91bGQgYmUKKwkgICBuZWVkZWQgaGVyZSAqLworCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDAsIEMwX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9zdG9wKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCWNhZmVfcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgY2FmZV9jdGxyX2luaXQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBBZGRlZCBtYWdpYyB0byBicmluZyB1cCB0aGUgaGFyZHdhcmUgb24gdGhlIEItVGVzdCBib2FyZAorCSAqLworCWNhZmVfcmVnX3dyaXRlKGNhbSwgMHgzMDM4LCAweDgpOworCWNhZmVfcmVnX3dyaXRlKGNhbSwgMHgzMTVjLCAweDgwMDA4KTsKKwkvKgorCSAqIEdvIHRocm91Z2ggdGhlIGRhbmNlIG5lZWRlZCB0byB3YWtlIHRoZSBkZXZpY2UgdXAuCisJICogTm90ZSB0aGF0IHRoZXNlIHJlZ2lzdGVycyBhcmUgZ2xvYmFsIGFuZCBzaGFyZWQKKwkgKiB3aXRoIHRoZSBOQU5EIGFuZCBTRCBkZXZpY2VzLiAgSW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUKKwkgKiB0aHJlZSBzdGlsbCBuZWVkcyB0byBiZSBleGFtaW5lZC4KKwkgKi8KKwljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9DU1IsIEdDU1JfU1JTfEdDU1JfTVJTKTsgLyogTmVlZGVkPyAqLworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0NTUiwgR0NTUl9TUkN8R0NTUl9NUkMpOworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0NTUiwgR0NTUl9TUkN8R0NTUl9NUlMpOworCW1kZWxheSg1KTsJLyogRklYTUUgcmV2aXNpdCB0aGlzICovCisJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX0NDSUNfRU58R0NTUl9TUkN8R0NTUl9NUkMpOworCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfR0xfSU1BU0ssIEdJTVNLX0NDSUNfRU4pOworCS8qCisJICogTWFrZSBzdXJlIGl0J3Mgbm90IHBvd2VyZWQgZG93bi4KKwkgKi8KKwljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7CisJLyoKKwkgKiBUdXJuIG9mZiB0aGUgZW5hYmxlIGJpdC4gIEl0IHN1cmUgc2hvdWxkIGJlIG9mZiBhbnl3YXksCisJICogYnV0IGl0J3MgZ29vZCB0byBiZSBzdXJlLgorCSAqLworCWNhZmVfcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKKwkvKgorCSAqIE1hc2sgYWxsIGludGVycnVwdHMuCisJICovCisJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRTUFTSywgMCk7CisJLyoKKwkgKiBDbG9jayB0aGUgc2Vuc29yIGFwcHJvcHJpYXRlbHkuICBDb250cm9sbGVyIGNsb2NrIHNob3VsZAorCSAqIGJlIDQ4TUh6LCBzZW5zb3IgInR5cGljYWwiIHZhbHVlIGlzIGhhbGYgdGhhdC4KKwkgKi8KKwljYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NMS0NUUkwsIDIsIENMS19ESVZfTUFTSyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKiBTdG9wIHRoZSBjb250cm9sbGVyLCBhbmQgZG9uJ3QgcmV0dXJuIHVudGlsIHdlJ3JlIHJlYWxseSBzdXJlIHRoYXQgbm8KKyAqIGZ1cnRoZXIgRE1BIGlzIGdvaW5nIG9uLgorICovCitzdGF0aWMgdm9pZCBjYWZlX2N0bHJfc3RvcF9kbWEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogVGhlb3J5OiBzdG9wIHRoZSBjYW1lcmEgY29udHJvbGxlciAod2hldGhlciBpdCBpcyBvcGVyYXRpbmcKKwkgKiBvciBub3QpLiAgRGVsYXkgYnJpZWZseSBqdXN0IGluIGNhc2Ugd2UgcmFjZSB3aXRoIHRoZSBTT0YKKwkgKiBpbnRlcnJ1cHQsIHRoZW4gd2FpdCB1bnRpbCBubyBETUEgaXMgYWN0aXZlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJY2FmZV9jdGxyX3N0b3AoY2FtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJbWRlbGF5KDEpOworCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPmlvd2FpdCwKKwkJCSF0ZXN0X2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncyksIEhaKTsKKwlpZiAodGVzdF9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpKQorCQljYW1fZXJyKGNhbSwgIlRpbWVvdXQgd2FpdGluZyBmb3IgRE1BIHRvIGVuZFxuIik7CisJCS8qIFRoaXMgd291bGQgYmUgYmFkIG5ld3MgLSB3aGF0IG5vdz8gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWNhbS0+c3RhdGUgPSBTX0lETEU7CisJY2FmZV9jdGxyX2lycV9kaXNhYmxlKGNhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogUG93ZXIgdXAgYW5kIGRvd24uCisgKi8KK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9wb3dlcl91cChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7CisJLyoKKwkgKiBQdXQgdGhlIHNlbnNvciBpbnRvIG9wZXJhdGlvbmFsIG1vZGUgKGFzc3VtZXMgT0xQQy1zdHlsZQorCSAqIHdpcmluZykuICBDb250cm9sIDAgaXMgcmVzZXQgLSBzZXQgdG8gMSB0byBvcGVyYXRlLgorCSAqIENvbnRyb2wgMSBpcyBwb3dlciBkb3duLCBzZXQgdG8gMCB0byBvcGVyYXRlLgorCSAqLworCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dQUiwgR1BSX0MxRU58R1BSX0MwRU4pOyAvKiBwd3IgdXAsIHJlc2V0ICovCisJbWRlbGF5KDEpOyAvKiBNYXJ2ZWxsIHNheXMgMW1zIHdpbGwgZG8gaXQgKi8KKwljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOfEdQUl9DMCk7CisJbWRlbGF5KDEpOyAvKiBFbm91Z2g/ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjYWZlX2N0bHJfcG93ZXJfZG93bihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOfEdQUl9DMSk7CisJY2FmZV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfUFdSRFdOKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgc2Vuc29yLgorICovCisKK3N0YXRpYyBpbnQgX19jYWZlX2NhbV9jbWQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqc2MgPSBjYW0tPnNlbnNvcjsKKwlpbnQgcmV0OworCisJaWYgKHNjID09IE5VTEwgfHwgc2MtPmRyaXZlciA9PSBOVUxMIHx8IHNjLT5kcml2ZXItPmNvbW1hbmQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gc2MtPmRyaXZlci0+Y29tbWFuZChzYywgY21kLCBhcmcpOworCWlmIChyZXQgPT0gLUVQRVJNKSAvKiBVbnN1cHBvcnRlZCBjb21tYW5kICovCisJCXJldHVybiAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19jYWZlX2NhbV9yZXNldChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgemVybyA9IDA7CisJcmV0dXJuIF9fY2FmZV9jYW1fY21kKGNhbSwgVklESU9DX0lOVF9SRVNFVCwgJnplcm8pOworfQorCisvKgorICogV2UgaGF2ZSBmb3VuZCB0aGUgc2Vuc29yIG9uIHRoZSBpMmMuICBMZXQncyB0cnkgdG8gaGF2ZSBhCisgKiBjb252ZXJzYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgY2FmZV9jYW1faW5pdChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX05PVFJFQURZKQorCQljYW1fd2FybihjYW0sICJDYW0gaW5pdCB3aXRoIGRldmljZSBpbiBmdW5reSBzdGF0ZSAlZCIsCisJCQkJY2FtLT5zdGF0ZSk7CisJcmV0ID0gX19jYWZlX2NhbV9yZXNldChjYW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IF9fY2FmZV9jYW1fY21kKGNhbSwgVklESU9DX0lOVF9HX0NISVBfSURFTlQsICZjYW0tPnNlbnNvcl90eXBlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKy8vCWlmIChjYW0tPnNlbnNvci0+YWRkciAhPSBPVjd4eDBfU0lEKSB7CisJaWYgKGNhbS0+c2Vuc29yX3R5cGUgIT0gVjRMMl9JREVOVF9PVjc2NzApIHsKKwkJY2FtX2VycihjYW0sICJVbnN1cHBvcnRlZCBzZW5zb3IgdHlwZSAlZCIsIGNhbS0+c2Vuc29yLT5hZGRyKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorLyogR2V0L3NldCBwYXJhbWV0ZXJzPyAqLworCXJldCA9IDA7CisJY2FtLT5zdGF0ZSA9IFNfSURMRTsKKyAgb3V0OgorCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ29uZmlndXJlIHRoZSBzZW5zb3IgdG8gbWF0Y2ggdGhlIHBhcmFtZXRlcnMgd2UgaGF2ZS4gIENhbGxlciBzaG91bGQKKyAqIGhvbGQgc19tdXRleAorICovCitzdGF0aWMgaW50IGNhZmVfY2FtX3NldF9mbGlwKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKworCW1lbXNldCgmY3RybCwgMCwgc2l6ZW9mKGN0cmwpKTsKKwljdHJsLmlkID0gVjRMMl9DSURfVkZMSVA7CisJY3RybC52YWx1ZSA9IGZsaXA7CisJcmV0dXJuIF9fY2FmZV9jYW1fY21kKGNhbSwgVklESU9DX1NfQ1RSTCwgJmN0cmwpOworfQorCisKK3N0YXRpYyBpbnQgY2FmZV9jYW1fY29uZmlndXJlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCXN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7CisJaW50IHJldCwgemVybyA9IDA7CisKKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUpCisJCXJldHVybiAtRUlOVkFMOworCWZtdC5mbXQucGl4ID0gY2FtLT5waXhfZm9ybWF0OworCXJldCA9IF9fY2FmZV9jYW1fY21kKGNhbSwgVklESU9DX0lOVF9JTklULCAmemVybyk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBfX2NhZmVfY2FtX2NtZChjYW0sIFZJRElPQ19TX0ZNVCwgJmZtdCk7CisJLyoKKwkgKiBPVjc2NzAgZG9lcyB3ZWlyZCB0aGluZ3MgaWYgZmxpcCBpcyBzZXQgKmJlZm9yZSogZm9ybWF0Li4uCisJICovCisJcmV0ICs9IGNhZmVfY2FtX3NldF9mbGlwKGNhbSk7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBETUEgYnVmZmVyIG1hbmFnZW1lbnQuICBUaGVzZSBmdW5jdGlvbnMgbmVlZCBzX211dGV4IGhlbGQuCisgKi8KKworLyogRklYTUU6IHRoaXMgaXMgaW5lZmZpY2llbnQgYXMgaGVsbCwgc2luY2UgZG1hX2FsbG9jX2NvaGVyZW50IGp1c3QKKyAqIGRvZXMgYSBnZXRfZnJlZV9wYWdlcygpIGNhbGwsIGFuZCB3ZSB3YXN0ZSBhIGdvb2QgY2h1bmsgb2YgYW4gb3JkZXJOCisgKiBhbGxvY2F0aW9uLiAgU2hvdWxkIHRyeSB0byBhbGxvY2F0ZSB0aGUgd2hvbGUgc2V0IGluIG9uZSBjaHVuay4KKyAqLworc3RhdGljIGludCBjYWZlX2FsbG9jX2RtYV9idWZzKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCBpbnQgbG9hZHRpbWUpCit7CisJaW50IGk7CisKKwljYWZlX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7CisJaWYgKGxvYWR0aW1lKQorCQljYW0tPmRtYV9idWZfc2l6ZSA9IGRtYV9idWZfc2l6ZTsKKwllbHNlCisJCWNhbS0+ZG1hX2J1Zl9zaXplID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZTsKKwlpZiAobl9kbWFfYnVmcyA+IDMpCisJCW5fZG1hX2J1ZnMgPSAzOworCisJY2FtLT5uYnVmcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5fZG1hX2J1ZnM7IGkrKykgeworCQljYW0tPmRtYV9idWZzW2ldID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjYW0tPnBkZXYtPmRldiwKKwkJCQljYW0tPmRtYV9idWZfc2l6ZSwgY2FtLT5kbWFfaGFuZGxlcyArIGksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChjYW0tPmRtYV9idWZzW2ldID09IE5VTEwpIHsKKwkJCWNhbV93YXJuKGNhbSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBETUEgYnVmZmVyXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZvciBkZWJ1ZywgcmVtb3ZlIGV2ZW50dWFsbHkgKi8KKwkJbWVtc2V0KGNhbS0+ZG1hX2J1ZnNbaV0sIDB4Y2MsIGNhbS0+ZG1hX2J1Zl9zaXplKTsKKwkJKGNhbS0+bmJ1ZnMpKys7CisJfQorCisJc3dpdGNoIChjYW0tPm5idWZzKSB7CisJY2FzZSAxOgorCSAgICBkbWFfZnJlZV9jb2hlcmVudCgmY2FtLT5wZGV2LT5kZXYsIGNhbS0+ZG1hX2J1Zl9zaXplLAorCQkJICAgIGNhbS0+ZG1hX2J1ZnNbMF0sIGNhbS0+ZG1hX2hhbmRsZXNbMF0pOworCSAgICBjYW0tPm5idWZzID0gMDsKKwljYXNlIDA6CisJICAgIGNhbV9lcnIoY2FtLCAiSW5zdWZmaWNpZW50IERNQSBidWZmZXJzLCBjYW5ub3Qgb3BlcmF0ZVxuIik7CisJICAgIHJldHVybiAtRU5PTUVNOworCisJY2FzZSAyOgorCSAgICBpZiAobl9kbWFfYnVmcyA+IDIpCisJCSAgICBjYW1fd2FybihjYW0sICJXaWxsIGxpbXAgYWxvbmcgd2l0aCBvbmx5IDIgYnVmZmVyc1xuIik7CisJICAgIGJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2FmZV9mcmVlX2RtYV9idWZzKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZnM7IGkrKykgeworCQlkbWFfZnJlZV9jb2hlcmVudCgmY2FtLT5wZGV2LT5kZXYsIGNhbS0+ZG1hX2J1Zl9zaXplLAorCQkJCWNhbS0+ZG1hX2J1ZnNbaV0sIGNhbS0+ZG1hX2hhbmRsZXNbaV0pOworCQljYW0tPmRtYV9idWZzW2ldID0gTlVMTDsKKwl9CisJY2FtLT5uYnVmcyA9IDA7Cit9CisKKworCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBIZXJlIHN0YXJ0cyB0aGUgVjRMMiBpbnRlcmZhY2UgY29kZS4KKyAqLworCisvKgorICogUmVhZCBhbiBpbWFnZSBmcm9tIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNhZmVfZGVsaXZlcl9idWZmZXIoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCisJCWNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCWludCBidWZubzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlpZiAoY2FtLT5uZXh0X2J1ZiA8IDApIHsKKwkJY2FtX2VycihjYW0sICJkZWxpdmVyX2J1ZmZlcjogTm8gbmV4dCBidWZmZXJcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUlPOworCX0KKwlidWZubyA9IGNhbS0+bmV4dF9idWY7CisJY2xlYXJfYml0KGJ1Zm5vLCAmY2FtLT5mbGFncyk7CisJaWYgKCsrKGNhbS0+bmV4dF9idWYpID49IGNhbS0+bmJ1ZnMpCisJCWNhbS0+bmV4dF9idWYgPSAwOworCWlmICghIHRlc3RfYml0KGNhbS0+bmV4dF9idWYsICZjYW0tPmZsYWdzKSkKKwkJY2FtLT5uZXh0X2J1ZiA9IC0xOworCWNhbS0+c3BlY2ZyYW1lcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJaWYgKGxlbiA+IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpCisJCWxlbiA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2U7CisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGNhbS0+ZG1hX2J1ZnNbYnVmbm9dLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkoKnBvcykgKz0gbGVuOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBHZXQgZXZlcnl0aGluZyByZWFkeSwgYW5kIHN0YXJ0IGdyYWJiaW5nIGZyYW1lcy4KKyAqLworc3RhdGljIGludCBjYWZlX3JlYWRfc2V0dXAoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIGVudW0gY2FmZV9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIENvbmZpZ3VyYXRpb24uICBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIERNQSBidWZmZXJzLAorCSAqIG1ha2Ugb25lIGxhc3QsIGRlc3BlcmF0ZSBhdHRlbXB0LgorCSAqLworCWlmIChjYW0tPm5idWZzID09IDApCisJCWlmIChjYWZlX2FsbG9jX2RtYV9idWZzKGNhbSwgMCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjYWZlX25lZWRzX2NvbmZpZyhjYW0pKSB7CisJCWNhZmVfY2FtX2NvbmZpZ3VyZShjYW0pOworCQlyZXQgPSBjYWZlX2N0bHJfY29uZmlndXJlKGNhbSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogVHVybiBpdCBsb29zZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWNhZmVfcmVzZXRfYnVmZmVycyhjYW0pOworCWNhZmVfY3Rscl9pcnFfZW5hYmxlKGNhbSk7CisJY2FtLT5zdGF0ZSA9IHN0YXRlOworCWNhZmVfY3Rscl9zdGFydChjYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3NpemVfdCBjYWZlX3Y0bF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLAorCQljaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBQZXJoYXBzIHdlJ3JlIGluIHNwZWN1bGF0aXZlIHJlYWQgbW9kZSBhbmQgYWxyZWFkeQorCSAqIGhhdmUgZGF0YT8KKwkgKi8KKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWlmIChjYW0tPnN0YXRlID09IFNfU1BFQ1JFQUQpIHsKKwkJaWYgKGNhbS0+bmV4dF9idWYgPj0gMCkgeworCQkJcmV0ID0gY2FmZV9kZWxpdmVyX2J1ZmZlcihjYW0sIGJ1ZmZlciwgbGVuLCBwb3MpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0gZWxzZSBpZiAoY2FtLT5zdGF0ZSA9PSBTX0ZMQUtFRCB8fCBjYW0tPnN0YXRlID09IFNfTk9UUkVBRFkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfdW5sb2NrOworCX0gZWxzZSBpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyoKKwkgKiB2NGwyOiBtdWx0aXBsZSBwcm9jZXNzZXMgY2FuIG9wZW4gdGhlIGRldmljZSwgYnV0IG9ubHkKKwkgKiBvbmUgZ2V0cyB0byBncmFiIGRhdGEgZnJvbSBpdC4KKwkgKi8KKwlpZiAoY2FtLT5vd25lciAmJiBjYW0tPm93bmVyICE9IGZpbHApIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWNhbS0+b3duZXIgPSBmaWxwOworCisJLyoKKwkgKiBEbyBzZXR1cCBpZiBuZWVkIGJlLgorCSAqLworCWlmIChjYW0tPnN0YXRlICE9IFNfU1BFQ1JFQUQpIHsKKwkJcmV0ID0gY2FmZV9yZWFkX3NldHVwKGNhbSwgU19TSU5HTEVSRUFEKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJLyoKKwkgKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuLiAgVGhpcyBzaG91bGQgcHJvYmFibHkKKwkgKiBiZSBpbnRlcnJ1cHRpYmxlIChGSVhNRSkuCisJICovCisJd2FpdF9ldmVudF90aW1lb3V0KGNhbS0+aW93YWl0LCBjYW0tPm5leHRfYnVmID49IDAsIEhaKTsKKwlpZiAoY2FtLT5uZXh0X2J1ZiA8IDApIHsKKwkJY2FtX2VycihjYW0sICJyZWFkKCkgb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCS8qCisJICogR2l2ZSB0aGVtIHRoZWlyIGRhdGEgYW5kIHdlIHNob3VsZCBiZSBkb25lLgorCSAqLworCXJldCA9IGNhZmVfZGVsaXZlcl9idWZmZXIoY2FtLCBidWZmZXIsIGxlbiwgcG9zKTsKKworICBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworCisKKworCisKKy8qCisgKiBTdHJlYW1pbmcgSS9PIHN1cHBvcnQuCisgKi8KKworCisKK3N0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlnb3RvIG91dDsKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWlmIChjYW0tPnN0YXRlICE9IFNfSURMRSB8fCBjYW0tPm5fc2J1ZnMgPT0gMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJY2FtLT5zZXF1ZW5jZSA9IDA7CisJcmV0ID0gY2FmZV9yZWFkX3NldHVwKGNhbSwgU19TVFJFQU1JTkcpOworCisgIG91dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworICBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGNhZmVfdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCWdvdG8gb3V0OworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGNhbS0+c3RhdGUgIT0gU19TVFJFQU1JTkcpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOworCXJldCA9IDA7CisKKyAgb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisgIG91dDoKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIGludCBjYWZlX3NldHVwX3Npb2J1ZihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgaW50IGluZGV4KQoreworCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKmJ1ZiA9IGNhbS0+c2JfYnVmcyArIGluZGV4OworCisJSU5JVF9MSVNUX0hFQUQoJmJ1Zi0+bGlzdCk7CisJYnVmLT52NGxidWYubGVuZ3RoID0gUEFHRV9BTElHTihjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKTsKKwlidWYtPmJ1ZmZlciA9IHZtYWxsb2NfdXNlcihidWYtPnY0bGJ1Zi5sZW5ndGgpOworCWlmIChidWYtPmJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlidWYtPm1hcGNvdW50ID0gMDsKKwlidWYtPmNhbSA9IGNhbTsKKworCWJ1Zi0+djRsYnVmLmluZGV4ID0gaW5kZXg7CisJYnVmLT52NGxidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlidWYtPnY0bGJ1Zi5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlidWYtPnY0bGJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCS8qCisJICogT2Zmc2V0OiBtdXN0IGJlIDMyLWJpdCBldmVuIG9uIGEgNjQtYml0IHN5c3RlbS4gIHZpZGVvLWJ1ZgorCSAqIGp1c3QgdXNlcyB0aGUgbGVuZ3RoIHRpbWVzIHRoZSBpbmRleCwgYnV0IHRoZSBzcGVjIHdhcm5zCisJICogYWdhaW5zdCBkb2luZyBqdXN0IHRoYXQgLSB2bWEgbWVyZ2luZyBwcm9ibGVtcy4gIFNvIHdlCisJICogbGVhdmUgYSBnYXAgYmV0d2VlbiBlYWNoIHBhaXIgb2YgYnVmZmVycy4KKwkgKi8KKwlidWYtPnY0bGJ1Zi5tLm9mZnNldCA9IDIqaW5kZXgqYnVmLT52NGxidWYubGVuZ3RoOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhZmVfZnJlZV9zaW9fYnVmZmVycyhzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgaTsKKworCS8qCisJICogSWYgYW55IGJ1ZmZlcnMgYXJlIG1hcHBlZCwgd2UgY2Fubm90IGZyZWUgdGhlbSBhdCBhbGwuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNhbS0+bl9zYnVmczsgaSsrKQorCQlpZiAoY2FtLT5zYl9idWZzW2ldLm1hcGNvdW50ID4gMCkKKwkJCXJldHVybiAtRUJVU1k7CisJLyoKKwkgKiBPSywgbGV0J3MgZG8gaXQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNhbS0+bl9zYnVmczsgaSsrKQorCQl2ZnJlZShjYW0tPnNiX2J1ZnNbaV0uYnVmZmVyKTsKKwljYW0tPm5fc2J1ZnMgPSAwOworCWtmcmVlKGNhbS0+c2JfYnVmcyk7CisJY2FtLT5zYl9idWZzID0gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmY2FtLT5zYl9hdmFpbCk7CisJSU5JVF9MSVNUX0hFQUQoJmNhbS0+c2JfZnVsbCk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGNhZmVfdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCS8qCisJICogTWFrZSBzdXJlIGl0J3Mgc29tZXRoaW5nIHdlIGNhbiBkby4gIFVzZXIgcG9pbnRlcnMgY291bGQgYmUKKwkgKiBpbXBsZW1lbnRlZCB3aXRob3V0IGdyZWF0IHBhaW4sIGJ1dCB0aGF0J3Mgbm90IGJlZW4gZG9uZSB5ZXQuCisJICovCisJaWYgKHJlcS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChyZXEtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIElmIHRoZXkgYXNrIGZvciB6ZXJvIGJ1ZmZlcnMsIHRoZXkgcmVhbGx5IHdhbnQgdXMgdG8gc3RvcCBzdHJlYW1pbmcKKwkgKiAoaWYgaXQncyBoYXBwZW5pbmcpIGFuZCBmcmVlIGV2ZXJ5dGhpbmcuICBTaG91bGQgd2UgY2hlY2sgb3duZXI/CisJICovCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlpZiAocmVxLT5jb3VudCA9PSAwKSB7CisJCWlmIChjYW0tPnN0YXRlID09IFNfU1RSRUFNSU5HKQorCQkJY2FmZV9jdGxyX3N0b3BfZG1hKGNhbSk7CisJCXJldCA9IGNhZmVfZnJlZV9zaW9fYnVmZmVycyAoY2FtKTsKKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogRGV2aWNlIG5lZWRzIHRvIGJlIGlkbGUgYW5kIHdvcmtpbmcuICBXZSAqY291bGQqIHRyeSB0byBkbyB0aGUKKwkgKiByaWdodCB0aGluZyBpbiBTX1NQRUNSRUFEIGJ5IHNodXR0aW5nIHRoaW5ncyBkb3duLCBidXQgaXQKKwkgKiBwcm9iYWJseSBkb2Vzbid0IG1hdHRlci4KKwkgKi8KKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUgfHwgKGNhbS0+b3duZXIgJiYgY2FtLT5vd25lciAhPSBmaWxwKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwljYW0tPm93bmVyID0gZmlscDsKKworCWlmIChyZXEtPmNvdW50IDwgbWluX2J1ZmZlcnMpCisJCXJlcS0+Y291bnQgPSBtaW5fYnVmZmVyczsKKwllbHNlIGlmIChyZXEtPmNvdW50ID4gbWF4X2J1ZmZlcnMpCisJCXJlcS0+Y291bnQgPSBtYXhfYnVmZmVyczsKKwlpZiAoY2FtLT5uX3NidWZzID4gMCkgeworCQlyZXQgPSBjYWZlX2ZyZWVfc2lvX2J1ZmZlcnMoY2FtKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWNhbS0+c2JfYnVmcyA9IGt6YWxsb2MocmVxLT5jb3VudCpzaXplb2Yoc3RydWN0IGNhZmVfc2lvX2J1ZmZlciksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoY2FtLT5zYl9idWZzID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWZvciAoY2FtLT5uX3NidWZzID0gMDsgY2FtLT5uX3NidWZzIDwgcmVxLT5jb3VudDsgKGNhbS0+bl9zYnVmcysrKSkgeworCQlyZXQgPSBjYWZlX3NldHVwX3Npb2J1ZihjYW0sIGNhbS0+bl9zYnVmcyk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoY2FtLT5uX3NidWZzID09IDApICAvKiBubyBsdWNrIGF0IGFsbCAtIHJldCBhbHJlYWR5IHNldCAqLworCQlrZnJlZShjYW0tPnNiX2J1ZnMpOworCWVsc2UKKwkJcmV0ID0gMDsKKwlyZXEtPmNvdW50ID0gY2FtLT5uX3NidWZzOyAgLyogSW4gY2FzZSBvZiBwYXJ0aWFsIHN1Y2Nlc3MgKi8KKworICBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBjYWZlX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlnb3RvIG91dDsKKwlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBjYW0tPm5fc2J1ZnMpCisJCWdvdG8gb3V0OworCSpidWYgPSBjYW0tPnNiX2J1ZnNbYnVmLT5pbmRleF0udjRsYnVmOworCXJldCA9IDA7CisgIG91dDoKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWZlX3ZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpzYnVmOworCWludCByZXQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlnb3RvIG91dDsKKwlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBjYW0tPm5fc2J1ZnMpCisJCWdvdG8gb3V0OworCXNidWYgPSBjYW0tPnNiX2J1ZnMgKyBidWYtPmluZGV4OworCWlmIChzYnVmLT52NGxidWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX1FVRVVFRCkgeworCQlyZXQgPSAwOyAvKiBBbHJlYWR5IHF1ZXVlZD8/ICovCisJCWdvdG8gb3V0OworCX0KKwlpZiAoc2J1Zi0+djRsYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19ET05FKSB7CisJCS8qIFNwZWMgZG9lc24ndCBzYXkgYW55dGhpbmcsIHNlZW1zIGFwcHJvcHJpYXRlIHRobyAqLworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlzYnVmLT52NGxidWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmc2J1Zi0+bGlzdCwgJmNhbS0+c2JfYXZhaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXQgPSAwOworICBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2FmZV92aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWY7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCWdvdG8gb3V0X3VubG9jazsKKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORykKKwkJZ290byBvdXRfdW5sb2NrOworCWlmIChsaXN0X2VtcHR5KCZjYW0tPnNiX2Z1bGwpICYmIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl3aGlsZSAobGlzdF9lbXB0eSgmY2FtLT5zYl9mdWxsKSAmJiBjYW0tPnN0YXRlID09IFNfU1RSRUFNSU5HKSB7CisJCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjYW0tPmlvd2FpdCwKKwkJCQkJCSFsaXN0X2VtcHR5KCZjYW0tPnNiX2Z1bGwpKSkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJZ290byBvdXQ7CisJCX0KKwkJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwl9CisKKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORykKKwkJcmV0ID0gLUVJTlRSOworCWVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCQkvKiBTaG91bGQgcHJvYmFibHkgcmVjaGVjayAhbGlzdF9lbXB0eSgpIGhlcmUgKi8KKwkJc2J1ZiA9IGxpc3RfZW50cnkoY2FtLT5zYl9mdWxsLm5leHQsCisJCQkJc3RydWN0IGNhZmVfc2lvX2J1ZmZlciwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJnNidWYtPmxpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJCXNidWYtPnY0bGJ1Zi5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19ET05FOworCQkqYnVmID0gc2J1Zi0+djRsYnVmOworCQlyZXQgPSAwOworCX0KKworICBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKyAgb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworCitzdGF0aWMgdm9pZCBjYWZlX3Y0bF92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwkvKgorCSAqIExvY2tpbmc6IGRvbmUgdW5kZXIgbW1hcF9zZW0sIHNvIHdlIGRvbid0IG5lZWQgdG8KKwkgKiBnbyBiYWNrIHRvIHRoZSBjYW1lcmEgbG9jayBoZXJlLgorCSAqLworCXNidWYtPm1hcGNvdW50Kys7Cit9CisKKworc3RhdGljIHZvaWQgY2FmZV92NGxfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2J1ZiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJbXV0ZXhfbG9jaygmc2J1Zi0+Y2FtLT5zX211dGV4KTsKKwlzYnVmLT5tYXBjb3VudC0tOworCS8qIERvY3Mgc2F5IHdlIHNob3VsZCBzdG9wIEkvTyB0b28uLi4gKi8KKwlpZiAoc2J1Zi0+bWFwY291bnQgPT0gMCkKKwkJc2J1Zi0+djRsYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX01BUFBFRDsKKwltdXRleF91bmxvY2soJnNidWYtPmNhbS0+c19tdXRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgY2FmZV92NGxfdm1fb3BzID0geworCS5vcGVuID0gY2FmZV92NGxfdm1fb3BlbiwKKwkuY2xvc2UgPSBjYWZlX3Y0bF92bV9jbG9zZQorfTsKKworCitzdGF0aWMgaW50IGNhZmVfdjRsX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBpOworCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWYgPSBOVUxMOworCisJaWYgKCEgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgfHwgISAodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogRmluZCB0aGUgYnVmZmVyIHRoZXkgYXJlIGxvb2tpbmcgZm9yLgorCSAqLworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IGNhbS0+bl9zYnVmczsgaSsrKQorCQlpZiAoY2FtLT5zYl9idWZzW2ldLnY0bGJ1Zi5tLm9mZnNldCA9PSBvZmZzZXQpIHsKKwkJCXNidWYgPSBjYW0tPnNiX2J1ZnMgKyBpOworCQkJYnJlYWs7CisJCX0KKwlpZiAoc2J1ZiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXJldCA9IHJlbWFwX3ZtYWxsb2NfcmFuZ2Uodm1hLCBzYnVmLT5idWZmZXIsIDApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fRE9OVEVYUEFORDsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHNidWY7CisJdm1hLT52bV9vcHMgPSAmY2FmZV92NGxfdm1fb3BzOworCXNidWYtPnY0bGJ1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKKwljYWZlX3Y0bF92bV9vcGVuKHZtYSk7CisJcmV0ID0gMDsKKyAgb3V0OgorCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIGludCBjYWZlX3Y0bF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtOworCisJY2FtID0gY2FmZV9maW5kX2RldihpbWlub3IoaW5vZGUpKTsKKwlpZiAoY2FtID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGNhbTsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGNhbS0+dXNlcnMgPT0gMCkgeworCQljYWZlX2N0bHJfcG93ZXJfdXAoY2FtKTsKKwkJX19jYWZlX2NhbV9yZXNldChjYW0pOworCQljYWZlX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7CisJLyogRklYTUUgbWFrZSBzdXJlIHRoaXMgaXMgY29tcGxldGUgKi8KKwl9CisJKGNhbS0+dXNlcnMpKys7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2FmZV92NGxfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJKGNhbS0+dXNlcnMpLS07CisJaWYgKGZpbHAgPT0gY2FtLT5vd25lcikgeworCQljYWZlX2N0bHJfc3RvcF9kbWEoY2FtKTsKKwkJY2FmZV9mcmVlX3Npb19idWZmZXJzKGNhbSk7CisJCWNhbS0+b3duZXIgPSBOVUxMOworCX0KKwlpZiAoY2FtLT51c2VycyA9PSAwKSB7CisJCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJCWlmICghIGFsbG9jX2J1ZnNfYXRfbG9hZCkKKwkJCWNhZmVfZnJlZV9kbWFfYnVmcyhjYW0pOworCX0KKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNhZmVfdjRsX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcHQpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlscCwgJmNhbS0+aW93YWl0LCBwdCk7CisJaWYgKGNhbS0+bmV4dF9idWYgPj0gMCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGNhZmVfdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBfX2NhZmVfY2FtX2NtZChjYW0sIFZJRElPQ19RVUVSWUNUUkwsIHFjKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGNhZmVfdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBfX2NhZmVfY2FtX2NtZChjYW0sIFZJRElPQ19HX0NUUkwsIGN0cmwpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IF9fY2FmZV9jYW1fY21kKGNhbSwgVklESU9DX1NfQ1RSTCwgY3RybCk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworCisKKworc3RhdGljIGludCBjYWZlX3ZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cmNweShjYXAtPmRyaXZlciwgImNhZmVfY2NpYyIpOworCXN0cmNweShjYXAtPmNhcmQsICJjYWZlX2NjaWMiKTsKKwljYXAtPnZlcnNpb24gPSBDQUZFX1ZFUlNJT047CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJVjRMMl9DQVBfUkVBRFdSSVRFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBUaGUgZGVmYXVsdCBmb3JtYXQgd2UgdXNlIHVudGlsIHNvbWVib2R5IHNheXMgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBjYWZlX2RlZl9waXhfZm9ybWF0ID0geworCS53aWR0aAkJPSBWR0FfV0lEVEgsCisJLmhlaWdodAkJPSBWR0FfSEVJR0hULAorCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCS5maWVsZAkJPSBWNEwyX0ZJRUxEX05PTkUsCisJLmJ5dGVzcGVybGluZQk9IFZHQV9XSURUSCoyLAorCS5zaXplaW1hZ2UJPSBWR0FfV0lEVEgqVkdBX0hFSUdIVCoyLAorfTsKKworc3RhdGljIGludCBjYWZlX3ZpZGlvY19lbnVtX2ZtdF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsCisJCXZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCWlmIChmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IF9fY2FmZV9jYW1fY21kKGNhbSwgVklESU9DX0VOVU1fRk1ULCBmbXQpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgY2FmZV92aWRpb2NfdHJ5X2ZtdF9jYXAgKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gX19jYWZlX2NhbV9jbWQoY2FtLCBWSURJT0NfVFJZX0ZNVCwgZm10KTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX2ZtdF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDYW4ndCBkbyBhbnl0aGluZyBpZiB0aGUgZGV2aWNlIGlzIG5vdCBpZGxlCisJICogQWxzbyBjYW4ndCBpZiB0aGVyZSBhcmUgc3RyZWFtaW5nIGJ1ZmZlcnMgaW4gcGxhY2UuCisJICovCisJaWYgKGNhbS0+c3RhdGUgIT0gU19JRExFIHx8IGNhbS0+bl9zYnVmcyA+IDApCisJCXJldHVybiAtRUJVU1k7CisJLyoKKwkgKiBTZWUgaWYgdGhlIGZvcm1hdHRpbmcgd29ya3MgaW4gcHJpbmNpcGxlLgorCSAqLworCXJldCA9IGNhZmVfdmlkaW9jX3RyeV9mbXRfY2FwKGZpbHAsIHByaXYsIGZtdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIE5vdyB3ZSBzdGFydCB0byBjaGFuZ2UgdGhpbmdzIGZvciByZWFsLCBzbyBsZXQncyBkbyBpdAorCSAqIHVuZGVyIGxvY2suCisJICovCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwljYW0tPnBpeF9mb3JtYXQgPSBmbXQtPmZtdC5waXg7CisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgaGF2ZSBhcHByb3ByaWF0ZSBETUEgYnVmZmVycy4KKwkgKi8KKwlyZXQgPSAtRU5PTUVNOworCWlmIChjYW0tPm5idWZzID4gMCAmJiBjYW0tPmRtYV9idWZfc2l6ZSA8IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpCisJCWNhZmVfZnJlZV9kbWFfYnVmcyhjYW0pOworCWlmIChjYW0tPm5idWZzID09IDApIHsKKwkJaWYgKGNhZmVfYWxsb2NfZG1hX2J1ZnMoY2FtLCAwKSkKKwkJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIEl0IGxvb2tzIGxpa2UgdGhpcyBtaWdodCB3b3JrLCBzbyBsZXQncyBwcm9ncmFtIHRoZSBzZW5zb3IuCisJICovCisJcmV0ID0gY2FmZV9jYW1fY29uZmlndXJlKGNhbSk7CisJaWYgKCEgcmV0KQorCQlyZXQgPSBjYWZlX2N0bHJfY29uZmlndXJlKGNhbSk7CisgIG91dDoKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJldHVybiBvdXIgc3RvcmVkIG5vdGlvbiBvZiBob3cgdGhlIGNhbWVyYSBpcy9zaG91bGQgYmUgY29uZmlndXJlZC4KKyAqIFRoZSBWNGwyIHNwZWMgd2FudHMgdXMgdG8gYmUgc21hcnRlciwgYW5kIGFjdHVhbGx5IGdldCB0aGlzIGZyb20KKyAqIHRoZSBjYW1lcmEgKGFuZCBub3QgbWVzcyB3aXRoIGl0IGF0IG9wZW4gdGltZSkuICBTb21lZGF5LgorICovCitzdGF0aWMgaW50IGNhZmVfdmlkaW9jX2dfZm10X2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKKworCWYtPmZtdC5waXggPSBjYW0tPnBpeF9mb3JtYXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBvbmx5IGhhdmUgb25lIGlucHV0IC0gdGhlIHNlbnNvciAtIHNvIG1pbmltaXplIHRoZSBub25zZW5zZSBoZXJlLgorICovCitzdGF0aWMgaW50IGNhZmVfdmlkaW9jX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2lucHV0ICppbnB1dCkKK3sKKwlpZiAoaW5wdXQtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaW5wdXQtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCWlucHV0LT5zdGQgPSBWNEwyX1NURF9BTEw7IC8qIE5vdCBzdXJlIHdoYXQgc2hvdWxkIGdvIGhlcmUgKi8KKwlzdHJjcHkoaW5wdXQtPm5hbWUsICJDYW1lcmEiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYWZlX3ZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhZmVfdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisvKiBmcm9tIHZpdmkuYyAqLworc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKmEpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHL1NfUEFSTS4gIE1vc3Qgb2YgdGhpcyBpcyBkb25lIGJ5IHRoZSBzZW5zb3IsIGJ1dCB3ZSBhcmUKKyAqIHRoZSBsZXZlbCB3aGljaCBjb250cm9scyB0aGUgbnVtYmVyIG9mIHJlYWQgYnVmZmVycy4KKyAqLworc3RhdGljIGludCBjYWZlX3ZpZGlvY19nX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBfX2NhZmVfY2FtX2NtZChjYW0sIFZJRElPQ19HX1BBUk0sIHBhcm1zKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IG5fZG1hX2J1ZnM7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBfX2NhZmVfY2FtX2NtZChjYW0sIFZJRElPQ19TX1BBUk0sIHBhcm1zKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcGFybXMtPnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IG5fZG1hX2J1ZnM7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBjYWZlX3Y0bF9kZXZfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZCkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGNvbnRhaW5lcl9vZih2ZCwgc3RydWN0IGNhZmVfY2FtZXJhLCB2NGxkZXYpOworCisJa2ZyZWUoY2FtKTsKK30KKworCisvKgorICogVGhpcyB0ZW1wbGF0ZSBkZXZpY2UgaG9sZHMgYWxsIG9mIHRob3NlIHY0bDIgbWV0aG9kczsgd2UKKyAqIGNsb25lIGl0IGZvciBzcGVjaWZpYyByZWFsIGRldmljZXMuCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2FmZV92NGxfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGNhZmVfdjRsX29wZW4sCisJLnJlbGVhc2UgPSBjYWZlX3Y0bF9yZWxlYXNlLAorCS5yZWFkID0gY2FmZV92NGxfcmVhZCwKKwkucG9sbCA9IGNhZmVfdjRsX3BvbGwsCisJLm1tYXAgPSBjYWZlX3Y0bF9tbWFwLAorCS5pb2N0bCA9IHZpZGVvX2lvY3RsMiwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgY2FmZV92NGxfdGVtcGxhdGUgPSB7CisJLm5hbWUgPSAiY2FmZSIsCisJLnR5cGUgPSBWRkxfVFlQRV9HUkFCQkVSLAorCS50eXBlMiA9IFZJRF9UWVBFX0NBUFRVUkUsCisJLm1pbm9yID0gLTEsIC8qIEdldCBvbmUgZHluYW1pY2FsbHkgKi8KKwkudHZub3JtcyA9IFY0TDJfU1REX05UU0NfTSwKKwkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLCAgLyogbWFrZSBtcGxheWVyIGhhcHB5ICovCisKKwkuZm9wcyA9ICZjYWZlX3Y0bF9mb3BzLAorCS5yZWxlYXNlID0gY2FmZV92NGxfZGV2X3JlbGVhc2UsCisKKwkudmlkaW9jX3F1ZXJ5Y2FwIAk9IGNhZmVfdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZW51bV9mbXRfY2FwCT0gY2FmZV92aWRpb2NfZW51bV9mbXRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF9jYXAJPSBjYWZlX3ZpZGlvY190cnlfZm10X2NhcCwKKwkudmlkaW9jX3NfZm10X2NhcAk9IGNhZmVfdmlkaW9jX3NfZm10X2NhcCwKKwkudmlkaW9jX2dfZm10X2NhcAk9IGNhZmVfdmlkaW9jX2dfZm10X2NhcCwKKwkudmlkaW9jX2VudW1faW5wdXQJPSBjYWZlX3ZpZGlvY19lbnVtX2lucHV0LAorCS52aWRpb2NfZ19pbnB1dAkJPSBjYWZlX3ZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dAkJPSBjYWZlX3ZpZGlvY19zX2lucHV0LAorCS52aWRpb2Nfc19zdGQJCT0gY2FmZV92aWRpb2Nfc19zdGQsCisJLnZpZGlvY19yZXFidWZzCQk9IGNhZmVfdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1Zgk9IGNhZmVfdmlkaW9jX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZgkJPSBjYWZlX3ZpZGlvY19xYnVmLAorCS52aWRpb2NfZHFidWYJCT0gY2FmZV92aWRpb2NfZHFidWYsCisJLnZpZGlvY19zdHJlYW1vbgk9IGNhZmVfdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmCT0gY2FmZV92aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfcXVlcnljdHJsCT0gY2FmZV92aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsCQk9IGNhZmVfdmlkaW9jX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybAkJPSBjYWZlX3ZpZGlvY19zX2N0cmwsCisJLnZpZGlvY19nX3Bhcm0JCT0gY2FmZV92aWRpb2NfZ19wYXJtLAorCS52aWRpb2Nfc19wYXJtCQk9IGNhZmVfdmlkaW9jX3NfcGFybSwKK307CisKKworCisKKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxlciBzdHVmZgorICovCisKKworCitzdGF0aWMgdm9pZCBjYWZlX2ZyYW1lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gKHN0cnVjdCBjYWZlX2NhbWVyYSAqKSBkYXRhOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2J1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZnM7IGkrKykgeworCQlpbnQgYnVmbm8gPSBjYW0tPm5leHRfYnVmOworCQlpZiAoYnVmbm8gPCAwKSB7ICAvKiAid2lsbCBuZXZlciBoYXBwZW4iICovCisJCQljYW1fZXJyKGNhbSwgIk5vIHZhbGlkIGJ1ZnMgaW4gdGFza2xldCFcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCsrKGNhbS0+bmV4dF9idWYpID49IGNhbS0+bmJ1ZnMpCisJCQljYW0tPm5leHRfYnVmID0gMDsKKwkJaWYgKCEgdGVzdF9iaXQoYnVmbm8sICZjYW0tPmZsYWdzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobGlzdF9lbXB0eSgmY2FtLT5zYl9hdmFpbCkpCisJCQlicmVhazsgIC8qIExlYXZlIGl0IHZhbGlkLCBob3BlIGZvciBiZXR0ZXIgbGF0ZXIgKi8KKwkJY2xlYXJfYml0KGJ1Zm5vLCAmY2FtLT5mbGFncyk7CisJCS8qCisJCSAqIFdlIGNvdWxkIHBlcmhhcHMgZHJvcCB0aGUgc3BpbmxvY2sgZHVyaW5nIHRoaXMKKwkJICogYmlnIGNvcHkuICBTb21ldGhpbmcgdG8gY29uc2lkZXIuCisJCSAqLworCQlzYnVmID0gbGlzdF9lbnRyeShjYW0tPnNiX2F2YWlsLm5leHQsCisJCQkJc3RydWN0IGNhZmVfc2lvX2J1ZmZlciwgbGlzdCk7CisJCW1lbWNweShzYnVmLT5idWZmZXIsIGNhbS0+ZG1hX2J1ZnNbYnVmbm9dLAorCQkJCWNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpOworCQlzYnVmLT52NGxidWYuYnl0ZXN1c2VkID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZTsKKwkJc2J1Zi0+djRsYnVmLnNlcXVlbmNlID0gY2FtLT5idWZfc2VxW2J1Zm5vXTsKKwkJc2J1Zi0+djRsYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJc2J1Zi0+djRsYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnNidWYtPmxpc3QsICZjYW0tPnNiX2Z1bGwpOworCX0KKwlpZiAoISBsaXN0X2VtcHR5KCZjYW0tPnNiX2Z1bGwpKQorCQl3YWtlX3VwKCZjYW0tPmlvd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisKKworc3RhdGljIHZvaWQgY2FmZV9mcmFtZV9jb21wbGV0ZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQoreworCS8qCisJICogQmFzaWMgZnJhbWUgaG91c2VrZWVwaW5nLgorCSAqLworCWlmICh0ZXN0X2JpdChmcmFtZSwgJmNhbS0+ZmxhZ3MpICYmIHByaW50a19yYXRlbGltaXQoKSkKKwkJY2FtX2VycihjYW0sICJGcmFtZSBvdmVycnVuIG9uICVkLCBmcmFtZXMgbG9zdFxuIiwgZnJhbWUpOworCXNldF9iaXQoZnJhbWUsICZjYW0tPmZsYWdzKTsKKwljbGVhcl9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpOworCWlmIChjYW0tPm5leHRfYnVmIDwgMCkKKwkJY2FtLT5uZXh0X2J1ZiA9IGZyYW1lOworCWNhbS0+YnVmX3NlcVtmcmFtZV0gPSArKyhjYW0tPnNlcXVlbmNlKTsKKworCXN3aXRjaCAoY2FtLT5zdGF0ZSkgeworCS8qCisJICogSWYgaW4gc2luZ2xlIHJlYWQgbW9kZSwgdHJ5IGdvaW5nIHNwZWN1bGF0aXZlLgorCSAqLworCSAgICBjYXNlIFNfU0lOR0xFUkVBRDoKKwkJY2FtLT5zdGF0ZSA9IFNfU1BFQ1JFQUQ7CisJCWNhbS0+c3BlY2ZyYW1lcyA9IDA7CisJCXdha2VfdXAoJmNhbS0+aW93YWl0KTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIElmIHdlIGFyZSBhbHJlYWR5IGRvaW5nIHNwZWN1bGF0aXZlIHJlYWRzLCBhbmQgbm9ib2R5IGlzCisJICogcmVhZGluZyB0aGVtLCBqdXN0IHN0b3AuCisJICovCisJICAgIGNhc2UgU19TUEVDUkVBRDoKKwkJaWYgKCsrKGNhbS0+c3BlY2ZyYW1lcykgPj0gY2FtLT5uYnVmcykgeworCQkJY2FmZV9jdGxyX3N0b3AoY2FtKTsKKwkJCWNhZmVfY3Rscl9pcnFfZGlzYWJsZShjYW0pOworCQkJY2FtLT5zdGF0ZSA9IFNfSURMRTsKKwkJfQorCQl3YWtlX3VwKCZjYW0tPmlvd2FpdCk7CisJCWJyZWFrOworCS8qCisJICogRm9yIHRoZSBzdHJlYW1pbmcgY2FzZSwgd2UgZGVmZXIgdGhlIHJlYWwgd29yayB0byB0aGUKKwkgKiBjYW1lcmEgdGFza2xldC4KKwkgKgorCSAqIEZJWE1FOiBpZiB0aGUgYXBwbGljYXRpb24gaXMgbm90IGNvbnN1bWluZyB0aGUgYnVmZmVycywKKwkgKiB3ZSBzaG91bGQgZXZlbnR1YWxseSBwdXQgdGhpbmdzIG9uIGhvbGQgYW5kIHJlc3RhcnQgaW4KKwkgKiB2aWRpb2NfZHFidWYoKS4KKwkgKi8KKwkgICAgY2FzZSBTX1NUUkVBTUlORzoKKwkJdGFza2xldF9zY2hlZHVsZSgmY2FtLT5zX3Rhc2tsZXQpOworCQlicmVhazsKKworCSAgICBkZWZhdWx0OgorCQljYW1fZXJyKGNhbSwgIkZyYW1lIGludGVycnVwdCBpbiBub24tb3BlcmF0aW9uYWwgc3RhdGVcbiIpOworCQlicmVhazsKKwl9Cit9CisKKworCisKK3N0YXRpYyB2b2lkIGNhZmVfZnJhbWVfaXJxKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgaXJxcykKK3sKKwl1bnNpZ25lZCBpbnQgZnJhbWU7CisKKwljYWZlX3JlZ193cml0ZShjYW0sIFJFR19JUlFTVEFULCBGUkFNRUlSUVMpOyAvKiBDbGVhcidlbSBhbGwgKi8KKwkvKgorCSAqIEhhbmRsZSBhbnkgZnJhbWUgY29tcGxldGlvbnMuICBUaGVyZSByZWFsbHkgc2hvdWxkCisJICogbm90IGJlIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UsIG9yIHdlIGhhdmUgZmFsbGVuCisJICogZmFyIGJlaGluZC4KKwkgKi8KKwlmb3IgKGZyYW1lID0gMDsgZnJhbWUgPCBjYW0tPm5idWZzOyBmcmFtZSsrKQorCQlpZiAoaXJxcyAmIChJUlFfRU9GMCA8PCBmcmFtZSkpCisJCQljYWZlX2ZyYW1lX2NvbXBsZXRlKGNhbSwgZnJhbWUpOworCS8qCisJICogSWYgYSBmcmFtZSBzdGFydHMsIG5vdGUgdGhhdCB3ZSBoYXZlIERNQSBhY3RpdmUuICBUaGlzCisJICogY29kZSBhc3N1bWVzIHRoYXQgd2Ugd29uJ3QgZ2V0IG11bHRpcGxlIGZyYW1lIGludGVycnVwdHMKKwkgKiBhdCBvbmNlOyBtYXkgd2FudCB0byByZXRoaW5rIHRoYXQuCisJICovCisJaWYgKGlycXMgJiAoSVJRX1NPRjAgfCBJUlFfU09GMSB8IElSUV9TT0YyKSkKKwkJc2V0X2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncyk7Cit9CisKKworCitzdGF0aWMgaXJxcmV0dXJuX3QgY2FmZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGRhdGE7CisJdW5zaWduZWQgaW50IGlycXM7CisKKwlzcGluX2xvY2soJmNhbS0+ZGV2X2xvY2spOworCWlycXMgPSBjYWZlX3JlZ19yZWFkKGNhbSwgUkVHX0lSUVNUQVQpOworCWlmICgoaXJxcyAmIEFMTElSUVMpID09IDApIHsKKwkJc3Bpbl91bmxvY2soJmNhbS0+ZGV2X2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCWlmIChpcnFzICYgRlJBTUVJUlFTKQorCQljYWZlX2ZyYW1lX2lycShjYW0sIGlycXMpOworCWlmIChpcnFzICYgVFdTSUlSUVMpIHsKKwkJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRU1RBVCwgVFdTSUlSUVMpOworCQl3YWtlX3VwKCZjYW0tPnNtYnVzX3dhaXQpOworCX0KKwlzcGluX3VubG9jaygmY2FtLT5kZXZfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworLyoKKyAqIERlYnVnZnMgc3R1ZmYuCisgKi8KKworc3RhdGljIGNoYXIgY2FmZV9kZWJ1Z19idWZbMTAyNF07CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqY2FmZV9kZnNfcm9vdDsKKworc3RhdGljIHZvaWQgY2FmZV9kZnNfc2V0dXAodm9pZCkKK3sKKwljYWZlX2Rmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJjYWZlX2NjaWMiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGNhZmVfZGZzX3Jvb3QpKSB7CisJCWNhZmVfZGZzX3Jvb3QgPSBOVUxMOyAgLyogTmV2ZXIgbWluZCAqLworCQlwcmludGsoS0VSTl9OT1RJQ0UgImNhZmVfY2NpYyB1bmFibGUgdG8gc2V0IHVwIGRlYnVnZnNcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgY2FmZV9kZnNfc2h1dGRvd24odm9pZCkKK3sKKwlpZiAoY2FmZV9kZnNfcm9vdCkKKwkJZGVidWdmc19yZW1vdmUoY2FmZV9kZnNfcm9vdCk7Cit9CisKK3N0YXRpYyBpbnQgY2FmZV9kZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBjYWZlX2Rmc19yZWFkX3JlZ3Moc3RydWN0IGZpbGUgKmZpbGUsCisJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKnMgPSBjYWZlX2RlYnVnX2J1ZjsKKwlpbnQgb2Zmc2V0OworCisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAweDQ0OyBvZmZzZXQgKz0gNCkKKwkJcyArPSBzcHJpbnRmKHMsICIlMDJ4OiAlMDh4XG4iLCBvZmZzZXQsCisJCQkJY2FmZV9yZWdfcmVhZChjYW0sIG9mZnNldCkpOworCWZvciAob2Zmc2V0ID0gMHg4ODsgb2Zmc2V0IDw9IDB4OTA7IG9mZnNldCArPSA0KQorCQlzICs9IHNwcmludGYocywgIiUwMng6ICUwOHhcbiIsIG9mZnNldCwKKwkJCQljYWZlX3JlZ19yZWFkKGNhbSwgb2Zmc2V0KSk7CisJZm9yIChvZmZzZXQgPSAweGI0OyBvZmZzZXQgPD0gMHhiYzsgb2Zmc2V0ICs9IDQpCisJCXMgKz0gc3ByaW50ZihzLCAiJTAyeDogJTA4eFxuIiwgb2Zmc2V0LAorCQkJCWNhZmVfcmVnX3JlYWQoY2FtLCBvZmZzZXQpKTsKKwlmb3IgKG9mZnNldCA9IDB4MzAwMDsgb2Zmc2V0IDw9IDB4MzAwYzsgb2Zmc2V0ICs9IDQpCisJCXMgKz0gc3ByaW50ZihzLCAiJTA0eDogJTA4eFxuIiwgb2Zmc2V0LAorCQkJCWNhZmVfcmVnX3JlYWQoY2FtLCBvZmZzZXQpKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgY2FmZV9kZWJ1Z19idWYsCisJCQlzIC0gY2FmZV9kZWJ1Z19idWYpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjYWZlX2Rmc19yZWdfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gY2FmZV9kZnNfcmVhZF9yZWdzLAorCS5vcGVuID0gY2FmZV9kZnNfb3BlbgorfTsKKworc3RhdGljIHNzaXplX3QgY2FmZV9kZnNfcmVhZF9jYW0oc3RydWN0IGZpbGUgKmZpbGUsCisJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKnMgPSBjYWZlX2RlYnVnX2J1ZjsKKwlpbnQgb2Zmc2V0OworCisJaWYgKCEgY2FtLT5zZW5zb3IpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAob2Zmc2V0ID0gMHgwOyBvZmZzZXQgPCAweDhhOyBvZmZzZXQrKykKKwl7CisJCXU4IHY7CisKKwkJY2FmZV9zbWJ1c19yZWFkX2RhdGEoY2FtLCBjYW0tPnNlbnNvci0+YWRkciwgb2Zmc2V0LCAmdik7CisJCXMgKz0gc3ByaW50ZihzLCAiJTAyeDogJTAyeFxuIiwgb2Zmc2V0LCB2KTsKKwl9CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGNhZmVfZGVidWdfYnVmLAorCQkJcyAtIGNhZmVfZGVidWdfYnVmKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2FmZV9kZnNfY2FtX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCA9IGNhZmVfZGZzX3JlYWRfY2FtLAorCS5vcGVuID0gY2FmZV9kZnNfb3BlbgorfTsKKworCisKK3N0YXRpYyB2b2lkIGNhZmVfZGZzX2NhbV9zZXR1cChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwljaGFyIGZuYW1lWzQwXTsKKworCWlmICghY2FmZV9kZnNfcm9vdCkKKwkJcmV0dXJuOworCXNwcmludGYoZm5hbWUsICJyZWdzLSVkIiwgY2FtLT52NGxkZXYubWlub3IpOworCWNhbS0+ZGZzX3JlZ3MgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCAwNDQ0LCBjYWZlX2Rmc19yb290LAorCQkJY2FtLCAmY2FmZV9kZnNfcmVnX29wcyk7CisJc3ByaW50ZihmbmFtZSwgImNhbS0lZCIsIGNhbS0+djRsZGV2Lm1pbm9yKTsKKwljYW0tPmRmc19jYW1fcmVncyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIDA0NDQsIGNhZmVfZGZzX3Jvb3QsCisJCQljYW0sICZjYWZlX2Rmc19jYW1fb3BzKTsKK30KKworCitzdGF0aWMgdm9pZCBjYWZlX2Rmc19jYW1fc2h1dGRvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJaWYgKCEgSVNfRVJSKGNhbS0+ZGZzX3JlZ3MpKQorCQlkZWJ1Z2ZzX3JlbW92ZShjYW0tPmRmc19yZWdzKTsKKwlpZiAoISBJU19FUlIoY2FtLT5kZnNfY2FtX3JlZ3MpKQorCQlkZWJ1Z2ZzX3JlbW92ZShjYW0tPmRmc19jYW1fcmVncyk7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgY2FmZV9kZnNfc2V0dXAoKQorI2RlZmluZSBjYWZlX2Rmc19zaHV0ZG93bigpCisjZGVmaW5lIGNhZmVfZGZzX2NhbV9zZXR1cChjYW0pCisjZGVmaW5lIGNhZmVfZGZzX2NhbV9zaHV0ZG93bihjYW0pCisjZW5kaWYgICAgLyogQ09ORklHX1ZJREVPX0FEVl9ERUJVRyAqLworCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFBDSSBpbnRlcmZhY2Ugc3R1ZmYuCisgKi8KKworc3RhdGljIGludCBjYWZlX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJdTE2IGNsYXNzd29yZDsKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbTsKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgY2FtZXJhIGhlcmUgLSB3ZSdsbCBnZXQgY2FsbHMgZm9yCisJICogdGhlIG90aGVyIGNhZmUgZGV2aWNlcyBhcyB3ZWxsLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DTEFTU19ERVZJQ0UsICZjbGFzc3dvcmQpOworCWlmIChjbGFzc3dvcmQgIT0gUENJX0NMQVNTX01VTFRJTUVESUFfVklERU8pCisJCXJldHVybiAtRU5PREVWOworCS8qCisJICogU3RhcnQgcHV0dGluZyB0b2dldGhlciBvbmUgb2Ygb3VyIGJpZyBjYW1lcmEgc3RydWN0dXJlcy4KKwkgKi8KKwlyZXQgPSAtRU5PTUVNOworCWNhbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYWZlX2NhbWVyYSksIEdGUF9LRVJORUwpOworCWlmIChjYW0gPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJbXV0ZXhfaW5pdCgmY2FtLT5zX211dGV4KTsKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZjYW0tPmRldl9sb2NrKTsKKwljYW0tPnN0YXRlID0gU19OT1RSRUFEWTsKKwljYWZlX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FtLT5zbWJ1c193YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPmlvd2FpdCk7CisJY2FtLT5wZGV2ID0gcGRldjsKKwljYW0tPnBpeF9mb3JtYXQgPSBjYWZlX2RlZl9waXhfZm9ybWF0OworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmRldl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmY2FtLT5zYl9hdmFpbCk7CisJSU5JVF9MSVNUX0hFQUQoJmNhbS0+c2JfZnVsbCk7CisJdGFza2xldF9pbml0KCZjYW0tPnNfdGFza2xldCwgY2FmZV9mcmFtZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZykgY2FtKTsKKwkvKgorCSAqIEdldCBzZXQgdXAgb24gdGhlIFBDSSBidXMuCisJICovCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXJldCA9IC1FSU87CisJY2FtLT5yZWdzID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOworCWlmICghIGNhbS0+cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBpb3JlbWFwIGNhZmUtY2NpYyByZWdzXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBjYWZlX2lycSwgSVJRRl9TSEFSRUQsICJjYWZlLWNjaWMiLCBjYW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2lvdW5tYXA7CisJY2FmZV9jdGxyX2luaXQoY2FtKTsKKwljYWZlX2N0bHJfcG93ZXJfdXAoY2FtKTsKKwkvKgorCSAqIFNldCB1cCBJMkMvU01CVVMgY29tbXVuaWNhdGlvbnMKKwkgKi8KKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7ICAvKiBhdHRhY2ggY2FuIGRlYWRsb2NrICovCisJcmV0ID0gY2FmZV9zbWJ1c19zZXR1cChjYW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWVpcnE7CisJLyoKKwkgKiBHZXQgdGhlIHY0bDIgc2V0dXAgZG9uZS4KKwkgKi8KKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWNhbS0+djRsZGV2ID0gY2FmZV92NGxfdGVtcGxhdGU7CisJY2FtLT52NGxkZXYuZGVidWcgPSAwOworLy8JY2FtLT52NGxkZXYuZGVidWcgPSBWNEwyX0RFQlVHX0lPQ1RMX0FSRzsKKwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+djRsZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfc21idXM7CisJLyoKKwkgKiBJZiBzbyByZXF1ZXN0ZWQsIHRyeSB0byBnZXQgb3VyIERNQSBidWZmZXJzIG5vdy4KKwkgKi8KKwlpZiAoYWxsb2NfYnVmc19hdF9sb2FkKSB7CisJCWlmIChjYWZlX2FsbG9jX2RtYV9idWZzKGNhbSwgMSkpCisJCQljYW1fd2FybihjYW0sICJVbmFibGUgdG8gYWxsb2MgRE1BIGJ1ZmZlcnMgYXQgbG9hZCIKKwkJCQkJIiB3aWxsIHRyeSBhZ2FpbiBsYXRlci4iKTsKKwl9CisKKwljYWZlX2Rmc19jYW1fc2V0dXAoY2FtKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJY2FmZV9hZGRfZGV2KGNhbSk7CisJcmV0dXJuIDA7CisKKyAgb3V0X3NtYnVzOgorCWNhZmVfc21idXNfc2h1dGRvd24oY2FtKTsKKyAgb3V0X2ZyZWVpcnE6CisJY2FmZV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKKwlmcmVlX2lycShwZGV2LT5pcnEsIGNhbSk7CisgIG91dF9pb3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIGNhbS0+cmVncyk7CisgIG91dF9mcmVlOgorCWtmcmVlKGNhbSk7CisgIG91dDoKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBTaHV0IGRvd24gYW4gaW5pdGlhbGl6ZWQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGNhZmVfc2h1dGRvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisvKiBGSVhNRTogTWFrZSBzdXJlIHdlIHRha2UgY2FyZSBvZiBldmVyeXRoaW5nIGhlcmUgKi8KKwljYWZlX2Rmc19jYW1fc2h1dGRvd24oY2FtKTsKKwlpZiAoY2FtLT5uX3NidWZzID4gMCkKKwkJLyogV2hhdCBpZiB0aGV5IGFyZSBzdGlsbCBtYXBwZWQ/ICBTaG91bGRuJ3QgYmUsIGJ1dC4uLiAqLworCQljYWZlX2ZyZWVfc2lvX2J1ZmZlcnMoY2FtKTsKKwljYWZlX3JlbW92ZV9kZXYoY2FtKTsKKwljYWZlX2N0bHJfc3RvcF9kbWEoY2FtKTsKKwljYWZlX2N0bHJfcG93ZXJfZG93bihjYW0pOworCWNhZmVfc21idXNfc2h1dGRvd24oY2FtKTsKKwljYWZlX2ZyZWVfZG1hX2J1ZnMoY2FtKTsKKwlmcmVlX2lycShjYW0tPnBkZXYtPmlycSwgY2FtKTsKKwlwY2lfaW91bm1hcChjYW0tPnBkZXYsIGNhbS0+cmVncyk7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+djRsZGV2KTsKKwkvKiBrZnJlZShjYW0pOyBkb25lIGluIHY0bF9yZWxlYXNlICgpICovCit9CisKKworc3RhdGljIHZvaWQgY2FmZV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gY2FmZV9maW5kX2J5X3BkZXYocGRldik7CisKKwlpZiAoY2FtID09IE5VTEwpIHsKKwkJY2FtX3dhcm4oY2FtLCAicGNpX3JlbW92ZSBvbiB1bmtub3duIHBkZXYgJXBcbiIsIHBkZXYpOworCQlyZXR1cm47CisJfQorCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGNhbS0+dXNlcnMgPiAwKQorCQljYW1fd2FybihjYW0sICJSZW1vdmluZyBhIGRldmljZSB3aXRoIHVzZXJzIVxuIik7CisJY2FmZV9zaHV0ZG93bihjYW0pOworLyogTm8gdW5sb2NrIC0gaXQgbm8gbG9uZ2VyIGV4aXN0cyAqLworfQorCisKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FmZV9pZHNbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxMTQ4LCAweDQzNDApIH0sIC8qIFRlbXBvcmFyeSBJRCBvbiBkZXZlbCBib2FyZCAqLworCXsgUENJX0RFVklDRSgweDExYWIsIDB4NDEwMCkgfSwgLyogRXZlbnR1YWwgcmVhbCBJRCAqLworCXsgUENJX0RFVklDRSgweDExYWIsIDB4NDEwMikgfSwgLyogUmVhbGx5IGV2ZW50dWFsIHJlYWwgSUQgKi8KKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjYWZlX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjYWZlX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiY2FmZTEwMDAtY2NpYyIsCisJLmlkX3RhYmxlID0gY2FmZV9pZHMsCisJLnByb2JlID0gY2FmZV9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IGNhZmVfcGNpX3JlbW92ZSwKK307CisKKworCisKK3N0YXRpYyBpbnQgX19pbml0IGNhZmVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk1hcnZlbGwgTTg4QUxQMDEgJ0NBRkUnIENhbWVyYSBDb250cm9sbGVyIHZlcnNpb24gJWRcbiIsCisJCQlDQUZFX1ZFUlNJT04pOworCWNhZmVfZGZzX3NldHVwKCk7CisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2FmZV9wY2lfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIGNhZmVfY2NpYyBkcml2ZXJcbiIpOworCQlnb3RvIG91dDsKKwl9CisJcmVxdWVzdF9tb2R1bGUoIm92NzY3MCIpOyAgLyogRklYTUUgd2FudCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsICovCisJcmV0ID0gMDsKKworICBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2FmZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjYWZlX3BjaV9kcml2ZXIpOworCWNhZmVfZGZzX3NodXRkb3duKCk7Cit9CisKK21vZHVsZV9pbml0KGNhZmVfaW5pdCk7Cittb2R1bGVfZXhpdChjYWZlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jb21wYXRfaW9jdGwzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jb21wYXRfaW9jdGwzMi5jCmluZGV4IGQ4MmE0ODguLmYwNjVhZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY29tcGF0X2lvY3RsMzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NvbXBhdF9pb2N0bDMyLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCQlyZXQgPSBmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CiAJZWxzZSBpZiAoZmlsZS0+Zl9vcC0+aW9jdGwpIHsKIAkJbG9ja19rZXJuZWwoKTsKLQkJcmV0ID0gZmlsZS0+Zl9vcC0+aW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKKwkJcmV0ID0gZmlsZS0+Zl9vcC0+aW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwgY21kLCBhcmcpOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfcHAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV9wcC5jCmluZGV4IDQxZjRiOGQuLmIxMmNlYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV9wcC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV9wcC5jCkBAIC04Miw2ICs4Miw4IEBACiAJc3RydWN0IHBhcmRldmljZSAqcGRldjsKIAlzdHJ1Y3QgcGFycG9ydCAqcG9ydDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2JfdGFzazsKKwl2b2lkICgqY2JfZnVuYykodm9pZCAqY2JkYXRhKTsKKwl2b2lkICpjYl9kYXRhOwogCWludCBvcGVuX2NvdW50OwogCXdhaXRfcXVldWVfaGVhZF90IHdxX3N0cmVhbTsKIAkvKiBpbWFnZSBzdGF0ZSBmbGFncyAqLwpAQCAtMTMwLDYgKzEzMiwyMCBAQAogI2RlZmluZSBQQVJQT1JUX0NIVU5LX1NJWkUJUEFHRV9TSVpFCiAKIAorc3RhdGljIHZvaWQgY3BpYV9wcF9ydW5fY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXZvaWQgKCpjYl9mdW5jKSh2b2lkICpjYmRhdGEpOworCXZvaWQgKmNiX2RhdGE7CisJc3RydWN0IHBwX2NhbV9lbnRyeSAqY2FtOworCisJY2FtID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwcF9jYW1fZW50cnksIGNiX3Rhc2spOworCWNiX2Z1bmMgPSBjYW0tPmNiX2Z1bmM7CisJY2JfZGF0YSA9IGNhbS0+Y2JfZGF0YTsKKwl3b3JrX3JlbGVhc2Uod29yayk7CisKKwljYl9mdW5jKGNiX2RhdGEpOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqICBDUGlBLXNwZWNpZmljICBsb3ctbGV2ZWwgcGFycG9ydCBmdW5jdGlvbnMgZm9yIG5pYmJsZSB1cGxvYWRzCkBAIC02NjQsNyArNjgwLDkgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAogCWlmKGNhbS0+cG9ydC0+aXJxICE9IFBBUlBPUlRfSVJRX05PTkUpIHsKLQkJSU5JVF9XT1JLKCZjYW0tPmNiX3Rhc2ssIGNiLCBjYmRhdGEpOworCQljYW0tPmNiX2Z1bmMgPSBjYjsKKwkJY2FtLT5jYl9kYXRhID0gY2JkYXRhOworCQlJTklUX1dPUktfTkFSKCZjYW0tPmNiX3Rhc2ssIGNwaWFfcHBfcnVuX2NhbGxiYWNrKTsKIAl9IGVsc2UgewogCQlyZXR2YWwgPSAtMTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLXZiaS5jCmluZGV4IDQ4MDE0YTIuLmY4NWYyMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLXZiaS5jCkBAIC0yMzUsNiArMjM1LDcgQEAKIAkJCTAsIDAsIFY0TDJfU0xJQ0VEX1ZQUywgMCwgMCwJLyogOSAqLwogCQkJMCwgMCwgMCwgMAogCQl9OworCQlpbnQgaXNfcGFsID0gIShjeDI1ODQwX2dldF92NGxzdGQoY2xpZW50KSAmIFY0TDJfU1REXzUyNV82MCk7CiAJCWludCBpOwogCiAJCWZtdCA9IGFyZzsKQEAgLTI0NiwxMyArMjQ3LDI1IEBACiAJCWlmICgoY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MDQpICYgMHgxMCkgPT0gMCkKIAkJCWJyZWFrOwogCi0JCWZvciAoaSA9IDc7IGkgPD0gMjM7IGkrKykgewotCQkJdTggdiA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDI0ICsgaSAtIDcpOworCQlpZiAoaXNfcGFsKSB7CisJCQlmb3IgKGkgPSA3OyBpIDw9IDIzOyBpKyspIHsKKwkJCQl1OCB2ID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MjQgKyBpIC0gNyk7CiAKLQkJCXN2YmktPnNlcnZpY2VfbGluZXNbMF1baV0gPSBsY3IydmJpW3YgPj4gNF07Ci0JCQlzdmJpLT5zZXJ2aWNlX2xpbmVzWzFdW2ldID0gbGNyMnZiaVt2ICYgMHhmXTsKLQkJCXN2YmktPnNlcnZpY2Vfc2V0IHw9Ci0JCQkJIHN2YmktPnNlcnZpY2VfbGluZXNbMF1baV0gfCBzdmJpLT5zZXJ2aWNlX2xpbmVzWzFdW2ldOworCQkJCXN2YmktPnNlcnZpY2VfbGluZXNbMF1baV0gPSBsY3IydmJpW3YgPj4gNF07CisJCQkJc3ZiaS0+c2VydmljZV9saW5lc1sxXVtpXSA9IGxjcjJ2YmlbdiAmIDB4Zl07CisJCQkJc3ZiaS0+c2VydmljZV9zZXQgfD0KKwkJCQkJc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSB8IHN2YmktPnNlcnZpY2VfbGluZXNbMV1baV07CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlmb3IgKGkgPSAxMDsgaSA8PSAyMTsgaSsrKSB7CisJCQkJdTggdiA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDI0ICsgaSAtIDEwKTsKKworCQkJCXN2YmktPnNlcnZpY2VfbGluZXNbMF1baV0gPSBsY3IydmJpW3YgPj4gNF07CisJCQkJc3ZiaS0+c2VydmljZV9saW5lc1sxXVtpXSA9IGxjcjJ2YmlbdiAmIDB4Zl07CisJCQkJc3ZiaS0+c2VydmljZV9zZXQgfD0KKwkJCQkJc3ZiaS0+c2VydmljZV9saW5lc1swXVtpXSB8IHN2YmktPnNlcnZpY2VfbGluZXNbMV1baV07CisJCQl9CiAJCX0KIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZwppbmRleCAwZjlkOTY5Li5iMmE2NmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZwpAQCAtNTMsNiArNTMsNyBAQAogCXNlbGVjdCBEVkJfT1I1MTEzMiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfQ1gyMjcwMiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfTEdEVDMzMFggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1RVTkVSX0xHSDA2WEYgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX05YVDIwMFggaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0NYMjQxMjMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0lTTDY0MjEgaWYgIURWQl9GRV9DVVNUT01JU0UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKaW5kZXggNDY3MzgzMi4uMGNmMDM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKQEAgLTUwLDcgKzUwLDYgQEAKICNkZWZpbmUgZHByaW50ayhsZXZlbCxmbXQsIGFyZy4uLikJaWYgKGRlYnVnID49IGxldmVsKSBcCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzLzItYmI6ICIgZm10LCBkZXYtPmNvcmUtPm5hbWUgLCAjIyBhcmcpCiAKLXN0YXRpYyBMSVNUX0hFQUQoY3g4ODAyX2Rldmxpc3QpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtODgyLDcgKzg4MSw3IEBACiAJCQkJICBCTEFDS0JJUkRfTVBFR19DQVBUVVJFLAogCQkJCSAgQkxBQ0tCSVJEX1JBV19CSVRTX05PTkUpOwogCi0JCWN4ODhfZG9faW9jdGwoaW5vZGUsIGZpbGUsIDAsIGRldi0+Y29yZSwgY21kLCBhcmcsIG1wZWdfZG9faW9jdGwpOworCQljeDg4X2RvX2lvY3RsKGlub2RlLCBmaWxlLCAwLCBkZXYtPmNvcmUsIGNtZCwgYXJnLCBjeDg4X2lvY3RsX2hvb2spOwogCiAJCWJsYWNrYmlyZF9pbml0aWFsaXplX2NvZGVjKGRldik7CiAJCWN4ODhfc2V0X3NjYWxlKGRldi0+Y29yZSwgZGV2LT53aWR0aCwgZGV2LT5oZWlnaHQsCkBAIC05MTQsMTEgKzkxMywxNSBAQAogCX0KIAogCWRlZmF1bHQ6Ci0JCXJldHVybiBjeDg4X2RvX2lvY3RsKGlub2RlLCBmaWxlLCAwLCBkZXYtPmNvcmUsIGNtZCwgYXJnLCBtcGVnX2RvX2lvY3RsKTsKKwkJcmV0dXJuIGN4ODhfZG9faW9jdGwoaW5vZGUsIGZpbGUsIDAsIGRldi0+Y29yZSwgY21kLCBhcmcsIGN4ODhfaW9jdGxfaG9vayk7CiAJfQogCXJldHVybiAwOwogfQogCitpbnQgKCpjeDg4X2lvY3RsX2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKK3Vuc2lnbmVkIGludCAoKmN4ODhfaW9jdGxfdHJhbnNsYXRvcikodW5zaWduZWQgaW50IGNtZCk7CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXBlZ190cmFuc2xhdGVfaW9jdGwodW5zaWduZWQgaW50IGNtZCkKIHsKIAlyZXR1cm4gY21kOwpAQCAtOTI3LDMzICs5MzAsNDkgQEAKIHN0YXRpYyBpbnQgbXBlZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWNtZCA9IG1wZWdfdHJhbnNsYXRlX2lvY3RsKCBjbWQgKTsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBtcGVnX2RvX2lvY3RsKTsKKwljbWQgPSBjeDg4X2lvY3RsX3RyYW5zbGF0b3IoIGNtZCApOworCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGN4ODhfaW9jdGxfaG9vayk7CiB9CiAKIHN0YXRpYyBpbnQgbXBlZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGN4ODgwMl9kZXYgKmgsKmRldiA9IE5VTEw7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IE5VTEw7CiAJc3RydWN0IGN4ODgwMl9maCAqZmg7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2ID0gTlVMTDsKKwlpbnQgZXJyOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCZjeDg4MDJfZGV2bGlzdCkgewotCQloID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY3g4ODAyX2RldiwgZGV2bGlzdCk7Ci0JCWlmIChoLT5tcGVnX2Rldi0+bWlub3IgPT0gbWlub3IpCi0JCQlkZXYgPSBoOwotCX0KLQlpZiAoTlVMTCA9PSBkZXYpCisgICAgICAgZGV2ID0gY3g4ODAyX2dldF9kZXZpY2UoaW5vZGUpOworCisJZHByaW50ayggMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKGRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChibGFja2JpcmRfaW5pdGlhbGl6ZV9jb2RlYyhkZXYpIDwgMCkKKwkvKiBNYWtlIHN1cmUgd2UgY2FuIGFjcXVpcmUgdGhlIGhhcmR3YXJlICovCisJZHJ2ID0gY3g4ODAyX2dldF9kcml2ZXIoZGV2LCBDWDg4X01QRUdfQkxBQ0tCSVJEKTsKKwlpZiAoZHJ2KSB7CisJCWVyciA9IGRydi0+cmVxdWVzdF9hY3F1aXJlKGRydik7CisJCWlmKGVyciAhPSAwKSB7CisJCQlkcHJpbnRrKDEsIiVzOiBVbmFibGUgdG8gYWNxdWlyZSBoYXJkd2FyZSwgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlpZiAoYmxhY2tiaXJkX2luaXRpYWxpemVfY29kZWMoZGV2KSA8IDApIHsKKwkJaWYgKGRydikKKwkJCWRydi0+cmVxdWVzdF9yZWxlYXNlKGRydik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAlkcHJpbnRrKDEsIm9wZW4gbWlub3I9JWRcbiIsbWlub3IpOwogCiAJLyogYWxsb2NhdGUgKyBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KIAlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gZmgpCisJaWYgKE5VTEwgPT0gZmgpIHsKKwkJaWYgKGRydikKKwkJCWRydi0+cmVxdWVzdF9yZWxlYXNlKGRydik7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAlmaC0+ZGV2ICAgICAgPSBkZXY7CiAKQEAgLTk3NCw2ICs5OTMsOCBAQAogc3RhdGljIGludCBtcGVnX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGN4ODgwMl9maCAgKmZoICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2ID0gTlVMTDsKIAogCS8qIGJsYWNrYmlyZF9hcGlfY21kKGZoLT5kZXYsIENYMjM0MVhfRU5DX1NUT1BfQ0FQVFVSRSwgMywgMCwgQkxBQ0tCSVJEX0VORF9OT1csIDAsIDB4MTMpOyAqLwogCWJsYWNrYmlyZF9hcGlfY21kKGZoLT5kZXYsIENYMjM0MVhfRU5DX1NUT1BfQ0FQVFVSRSwgMywgMCwKQEAgLTk5Miw2ICsxMDEzLDE2IEBACiAJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+bXBlZ3EpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CiAJa2ZyZWUoZmgpOworCisJLyogTWFrZSBzdXJlIHdlIHJlbGVhc2UgdGhlIGhhcmR3YXJlICovCisJZGV2ID0gY3g4ODAyX2dldF9kZXZpY2UoaW5vZGUpOworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkcnYgPSBjeDg4MDJfZ2V0X2RyaXZlcihkZXYsIENYODhfTVBFR19CTEFDS0JJUkQpOworCWlmIChkcnYpCisJCWRydi0+cmVxdWVzdF9yZWxlYXNlKGRydik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA0Myw2ICsxMDc0LDQ0IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKiBUaGUgQ1g4ODAyIE1QRUcgQVBJIHdpbGwgY2FsbCB0aGlzIHdoZW4gd2UgY2FuIHVzZSB0aGUgaGFyZHdhcmUgKi8KK3N0YXRpYyBpbnQgY3g4ODAyX2JsYWNrYmlyZF9hZHZpc2VfYWNxdWlyZShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkcnYtPmNvcmU7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNvcmUtPmJvYXJkKSB7CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMzAwOgorCQkvKiBCeSBkZWZhdWx0LCBjb3JlIHNldHVwIHdpbGwgbGVhdmUgdGhlIGN4MjI3MDIgb3V0IG9mIHJlc2V0LCBvbiB0aGUgYnVzLgorCQkgKiBXZSBsZWZ0IHRoZSBoYXJkd2FyZSBvbiBwb3dlciB1cCB3aXRoIHRoZSBjeDIyNzAyIGFjdGl2ZS4KKwkJICogV2UncmUgYmVpbmcgZ2l2ZW4gYWNjZXNzIHRvIHJlLWFycmFuZ2UgdGhlIEdQSU9zLgorCQkgKiBUYWtlIHRoZSBidXMgb2ZmIHRoZSBjeDIyNzAyIGFuZCBwdXQgdGhlIGN4MjM0MTYgb24gaXQuCisJCSAqLworCQljeF9jbGVhcihNT19HUDBfSU8sIDB4MDAwMDAwODApOyAvKiBjeDIyNzAyIGluIHJlc2V0ICovCisJCWN4X3NldChNT19HUDBfSU8sICAgMHgwMDAwMDAwNCk7IC8qIERpc2FibGUgdGhlIGN4MjI3MDIgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0RFVjsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogVGhlIENYODgwMiBNUEVHIEFQSSB3aWxsIGNhbGwgdGhpcyB3aGVuIHdlIG5lZWQgdG8gcmVsZWFzZSB0aGUgaGFyZHdhcmUgKi8KK3N0YXRpYyBpbnQgY3g4ODAyX2JsYWNrYmlyZF9hZHZpc2VfcmVsZWFzZShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkcnYtPmNvcmU7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNvcmUtPmJvYXJkKSB7CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMzAwOgorCQkvKiBFeGl0IGxlYXZpbmcgdGhlIGN4MjM0MTYgb24gdGhlIGJ1cyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PREVWOworCX0KKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgdm9pZCBibGFja2JpcmRfdW5yZWdpc3Rlcl92aWRlbyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewogCWlmIChkZXYtPm1wZWdfZGV2KSB7CkBAIC0xMDczLDI4ICsxMTQyLDIzIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGJsYWNrYmlyZF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCitzdGF0aWMgaW50IGN4ODgwMl9ibGFja2JpcmRfcHJvYmUoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydikKIHsKLQlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2OwotCXN0cnVjdCBjeDg4X2NvcmUgICpjb3JlOworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkcnYtPmNvcmU7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGNvcmUtPmR2YmRldjsKIAlpbnQgZXJyOwogCi0JLyogZ2VuZXJhbCBzZXR1cCAqLwotCWNvcmUgPSBjeDg4X2NvcmVfZ2V0KHBjaV9kZXYpOwotCWlmIChOVUxMID09IGNvcmUpCi0JCXJldHVybiAtRUlOVkFMOworCWRwcmludGsoIDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKCAxLCAiIC0+YmVpbmcgcHJvYmVkIGJ5IENhcmQ9JWQgTmFtZT0lcywgUENJICUwMng6JTAyeFxuIiwKKwkJY29yZS0+Ym9hcmQsCisJCWNvcmUtPm5hbWUsCisJCWNvcmUtPnBjaV9idXMsCisJCWNvcmUtPnBjaV9zbG90KTsKIAogCWVyciA9IC1FTk9ERVY7CiAJaWYgKCEoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm1wZWcgJiBDWDg4X01QRUdfQkxBQ0tCSVJEKSkKIAkJZ290byBmYWlsX2NvcmU7CiAKLQllcnIgPSAtRU5PTUVNOwotCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLEdGUF9LRVJORUwpOwotCWlmIChOVUxMID09IGRldikKLQkJZ290byBmYWlsX2NvcmU7Ci0JZGV2LT5wY2kgPSBwY2lfZGV2OwotCWRldi0+Y29yZSA9IGNvcmU7CiAJZGV2LT53aWR0aCA9IDcyMDsKIAlkZXYtPmhlaWdodCA9IDU3NjsKIAljeDIzNDF4X2ZpbGxfZGVmYXVsdHMoJmRldi0+cGFyYW1zKTsKQEAgLTExMDYsNjQgKzExNzAsMzYgQEAKIAkJZGV2LT5oZWlnaHQgPSA1NzY7CiAJfQogCi0JZXJyID0gY3g4ODAyX2luaXRfY29tbW9uKGRldik7Ci0JaWYgKDAgIT0gZXJyKQotCQlnb3RvIGZhaWxfZnJlZTsKLQogCS8qIGJsYWNrYmlyZCBzdHVmZiAqLwogCXByaW50aygiJXMvMjogY3gyMzQxNiBiYXNlZCBtcGVnIGVuY29kZXIgKGJsYWNrYmlyZCByZWZlcmVuY2UgZGVzaWduKVxuIiwKIAkgICAgICAgY29yZS0+bmFtZSk7CiAJaG9zdF9zZXR1cChkZXYtPmNvcmUpOwogCi0JbGlzdF9hZGRfdGFpbCgmZGV2LT5kZXZsaXN0LCZjeDg4MDJfZGV2bGlzdCk7CiAJYmxhY2tiaXJkX3JlZ2lzdGVyX3ZpZGVvKGRldik7CiAKIAkvKiBpbml0aWFsIGRldmljZSBjb25maWd1cmF0aW9uOiBuZWVkZWQgPyAqLwogCiAJcmV0dXJuIDA7CiAKLSBmYWlsX2ZyZWU6Ci0Ja2ZyZWUoZGV2KTsKICBmYWlsX2NvcmU6Ci0JY3g4OF9jb3JlX3B1dChjb3JlLHBjaV9kZXYpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBibGFja2JpcmRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQorc3RhdGljIGludCBjeDg4MDJfYmxhY2tiaXJkX3JlbW92ZShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0KIAkvKiBibGFja2JpcmQgKi8KLQlibGFja2JpcmRfdW5yZWdpc3Rlcl92aWRlbyhkZXYpOwotCWxpc3RfZGVsKCZkZXYtPmRldmxpc3QpOworCWJsYWNrYmlyZF91bnJlZ2lzdGVyX3ZpZGVvKGRydi0+Y29yZS0+ZHZiZGV2KTsKIAotCS8qIGNvbW1vbiAqLwotCWN4ODgwMl9maW5pX2NvbW1vbihkZXYpOwotCWN4ODhfY29yZV9wdXQoZGV2LT5jb3JlLGRldi0+cGNpKTsKLQlrZnJlZShkZXYpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3g4ODAyX3BjaV90YmxbXSA9IHsKLQl7Ci0JCS52ZW5kb3IgICAgICAgPSAweDE0ZjEsCi0JCS5kZXZpY2UgICAgICAgPSAweDg4MDIsCi0JCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKLQl9LHsKLQkJLyogLS0tIGVuZCBvZiBsaXN0IC0tLSAqLwotCX0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3g4ODAyX3BjaV90YmwpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYmxhY2tiaXJkX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgICAgID0gImN4ODgtYmxhY2tiaXJkIiwKLQkuaWRfdGFibGUgPSBjeDg4MDJfcGNpX3RibCwKLQkucHJvYmUgICAgPSBibGFja2JpcmRfcHJvYmUsCi0JLnJlbW92ZSAgID0gX19kZXZleGl0X3AoYmxhY2tiaXJkX3JlbW92ZSksCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgID0gY3g4ODAyX3N1c3BlbmRfY29tbW9uLAotCS5yZXN1bWUgICA9IGN4ODgwMl9yZXN1bWVfY29tbW9uLAotI2VuZGlmCitzdGF0aWMgc3RydWN0IGN4ODgwMl9kcml2ZXIgY3g4ODAyX2JsYWNrYmlyZF9kcml2ZXIgPSB7CisJLnR5cGVfaWQJPSBDWDg4X01QRUdfQkxBQ0tCSVJELAorCS5od19hY2Nlc3MJPSBDWDg4MDJfRFJWQ1RMX1NIQVJFRCwKKwkucHJvYmUJCT0gY3g4ODAyX2JsYWNrYmlyZF9wcm9iZSwKKwkucmVtb3ZlCQk9IGN4ODgwMl9ibGFja2JpcmRfcmVtb3ZlLAorCS5hZHZpc2VfYWNxdWlyZQk9IGN4ODgwMl9ibGFja2JpcmRfYWR2aXNlX2FjcXVpcmUsCisJLmFkdmlzZV9yZWxlYXNlCT0gY3g4ODAyX2JsYWNrYmlyZF9hZHZpc2VfcmVsZWFzZSwKIH07CiAKIHN0YXRpYyBpbnQgYmxhY2tiaXJkX2luaXQodm9pZCkKQEAgLTExNzYsMTcgKzEyMTIsMjIgQEAKIAlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAogCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOwogI2VuZGlmCi0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJsYWNrYmlyZF9wY2lfZHJpdmVyKTsKKwljeDg4X2lvY3RsX2hvb2sgPSBtcGVnX2RvX2lvY3RsOworCWN4ODhfaW9jdGxfdHJhbnNsYXRvciA9IG1wZWdfdHJhbnNsYXRlX2lvY3RsOworCXJldHVybiBjeDg4MDJfcmVnaXN0ZXJfZHJpdmVyKCZjeDg4MDJfYmxhY2tiaXJkX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGJsYWNrYmlyZF9maW5pKHZvaWQpCiB7Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZibGFja2JpcmRfcGNpX2RyaXZlcik7CisJY3g4ODAyX3VucmVnaXN0ZXJfZHJpdmVyKCZjeDg4MDJfYmxhY2tiaXJkX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGJsYWNrYmlyZF9pbml0KTsKIG1vZHVsZV9leGl0KGJsYWNrYmlyZF9maW5pKTsKIAorRVhQT1JUX1NZTUJPTChjeDg4X2lvY3RsX2hvb2spOworRVhQT1JUX1NZTUJPTChjeDg4X2lvY3RsX3RyYW5zbGF0b3IpOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCmluZGV4IGFmNzFkNDIuLmM3OTE3MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwpAQCAtMjgxLDE4ICsyODEsMjIgQEAKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgPSAwLAogCQkJLmdwaW8wICA9IDB4MDAwMGJkZTIsCisJCQkuZXh0YWRjID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgID0gMSwKIAkJCS5ncGlvMCAgPSAweDAwMDBiZGU2LAorCQkJLmV4dGFkYyA9IDEsCiAJCX0sewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgID0gMiwKIAkJCS5ncGlvMCAgPSAweDAwMDBiZGU2LAorCQkJLmV4dGFkYyA9IDEsCiAJCX19LAogCQkucmFkaW8gPSB7CiAJCQkudHlwZSAgID0gQ1g4OF9SQURJTywKIAkJCS5ncGlvMCAgPSAweDAwMDBiZDYyLAorCQkJLmV4dGFkYyA9IDEsCiAJCX0sCiAJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19CTEFDS0JJUkQsCiAJfSwKQEAgLTM1Myw2ICszNTcsNyBAQAogCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgID0gMiwKIAkJCS5ncGlvMCAgPSAweDAwMDBmZGU2LCAvLyAweDAwMDBmZGE2IEwsUiBSQ0EgYXVkaW8gaW4/CisJCQkuZXh0YWRjID0gMSwKIAkJfX0sCiAJCS5yYWRpbyA9IHsKIAkJCS50eXBlICAgPSBDWDg4X1JBRElPLApAQCAtNTIzLDYgKzUyOCw3IEBACiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKKwkJCS5leHRhZGMgPSAxLAogCQl9fSwKIAkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0JMQUNLQklSRCwKIAl9LApAQCAtNjQ2LDE4ICs2NTIsMjIgQEAKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgPSAwLAogCQkJLmdwaW8wICA9IDB4MDAwMDlkODAsCisJCQkuZXh0YWRjID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgID0gMSwKIAkJCS5ncGlvMCAgPSAweDAwMDA5ZDc2LAorCQkJLmV4dGFkYyA9IDEsCiAJCX0sewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgID0gMiwKIAkJCS5ncGlvMCAgPSAweDAwMDA5ZDc2LAorCQkJLmV4dGFkYyA9IDEsCiAJCX19LAogCQkucmFkaW8gPSB7CiAJCQkudHlwZSAgID0gQ1g4OF9SQURJTywKIAkJCS5ncGlvMCAgPSAweDAwMDA5ZDAwLAorCQkJLmV4dGFkYyA9IDEsCiAJCX0sCiAJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19CTEFDS0JJUkQsCiAJfSwKQEAgLTc4NiwyNSArNzk2LDI5IEBACiAJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKLQkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0JMQUNLQklSRCwKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgPSAwLAogCQkJLmdwaW8wICA9IDB4MDAwMGNkNzMsCisJCQkuZXh0YWRjID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgPSAxLAogCQkJLmdwaW8wICA9IDB4MDAwMGNkNzMsCisJCQkuZXh0YWRjID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMywKIAkJCS5ncGlvMCAgPSAweDAwMDBjZGIzLAorCQkJLmV4dGFkYyA9IDEsCiAJCX19LAogCQkucmFkaW8gPSB7CiAJCQkudHlwZSAgID0gQ1g4OF9SQURJTywKIAkJCS52bXV4ICAgPSAyLAogCQkJLmdwaW8wICA9IDB4MDAwMGNkZjMsCisJCQkuZXh0YWRjID0gMSwKIAkJfSwKKwkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0JMQUNLQklSRCwKIAl9LAogCVtDWDg4X0JPQVJEX0tXT1JMRF9WU1RSRUFNX0VYUEVSVF9EVkRdID0gewogCQkgLyogQWxleGFuZGVyIFdvbGQgPGF3b2xkQGJpZ2Zvb3QuY29tPiAqLwpAQCAtMTA1MCw3ICsxMDY0LDYgQEAKIAkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKIAl9LAogCVtDWDg4X0JPQVJEX0tXT1JMRF9IQVJEV0FSRV9NUEVHX1RWX1hQRVJUXSA9IHsKLQkJLyogRklYTUU6IEF1ZGlvIG5vdCB3b3JraW5nIGZvciBzLXZpZGVvIC8gY29tcG9zaXRlIGlucHV0cy4gKi8KIAkJLm5hbWUgICAgICAgICAgID0gIktXb3JsZCBIYXJkd2FyZU1wZWdUViBYUGVydCIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCkBAIC0xMDY1LDEwICsxMDc4LDEyIEBACiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgID0gMSwKIAkJCS5ncGlvMCAgPSAweDNkZTYsCisJCQkuZXh0YWRjID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgPSAyLAogCQkJLmdwaW8wICA9IDB4M2RlNiwKKwkJCS5leHRhZGMgPSAxLAogCQl9fSwKIAkJLnJhZGlvID0gewogCQkJLnR5cGUgICA9IENYODhfUkFESU8sCkBAIC0xMjMwLDYgKzEyNDUsNyBAQAogCQkJLnZtdXggICA9IDIsCiAJCQkuZ3BpbzAgID0gMHg4NGJmLAogCQl9fSwKKwkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKIAl9LAogCVtDWDg4X0JPQVJEX05PUldPT0RfTUlDUk9dID0gewogCQkubmFtZSAgICAgICAgICAgPSAiTm9yd29vZCBNaWNybyBUViBUdW5lciIsCkBAIC0xMjUxLDM1ICsxMjY3LDM1IEBACiAJCQkuZ3BpbzAgID0gMHgwNzBiLAogCQl9fSwKIAl9LAotICAgICAgIFtDWDg4X0JPQVJEX1RFX0RUVl8yNTBfT0VNX1NXQU5OXSA9IHsKLQkgICAgICAgLm5hbWUgICAgICAgICAgID0gIlNoZW56aGVuIFR1bmdzdGVuIEFnZXMgVGVjaCBURS1EVFYtMjUwIC8gU3dhbm4gT0VNIiwKLQkgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfUEFMX05FV19UQVBDLAotCSAgICAgICAucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKLQkgICAgICAgLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKLQkgICAgICAgLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKLQkgICAgICAgLmlucHV0ICAgICAgICAgID0ge3sKLQkJICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKLQkJICAgICAgIC52bXV4ICAgPSAwLAotCQkgICAgICAgLmdwaW8wICA9IDB4MDAzZmZmZmYsCi0JCSAgICAgICAuZ3BpbzEgID0gMHgwMGUwMDAwMCwKLQkJICAgICAgIC5ncGlvMiAgPSAweDAwM2ZmZmZmLAotCQkgICAgICAgLmdwaW8zICA9IDB4MDIwMDAwMDAsCi0JICAgICAgIH0sewotCQkgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAotCQkgICAgICAgLnZtdXggICA9IDEsCi0JCSAgICAgICAuZ3BpbzAgID0gMHgwMDNmZmZmZiwKLQkJICAgICAgIC5ncGlvMSAgPSAweDAwZTAwMDAwLAotCQkgICAgICAgLmdwaW8yICA9IDB4MDAzZmZmZmYsCi0JCSAgICAgICAuZ3BpbzMgID0gMHgwMjAwMDAwMCwKKwlbQ1g4OF9CT0FSRF9URV9EVFZfMjUwX09FTV9TV0FOTl0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJTaGVuemhlbiBUdW5nc3RlbiBBZ2VzIFRlY2ggVEUtRFRWLTI1MCAvIFN3YW5uIE9FTSIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDAwM2ZmZmZmLAorCQkJLmdwaW8xICA9IDB4MDBlMDAwMDAsCisJCQkuZ3BpbzIgID0gMHgwMDNmZmZmZiwKKwkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAogCQl9LHsKLQkJICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAotCQkgICAgICAgLnZtdXggICA9IDIsCi0JCSAgICAgICAuZ3BpbzAgID0gMHgwMDNmZmZmZiwKLQkJICAgICAgIC5ncGlvMSAgPSAweDAwZTAwMDAwLAotCQkgICAgICAgLmdwaW8yICA9IDB4MDAzZmZmZmYsCi0JCSAgICAgICAuZ3BpbzMgID0gMHgwMjAwMDAwMCwKLQkgICAgICAgfX0sCi0gICAgICAgfSwKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4MDAzZmZmZmYsCisJCQkuZ3BpbzEgID0gMHgwMGUwMDAwMCwKKwkJCS5ncGlvMiAgPSAweDAwM2ZmZmZmLAorCQkJLmdwaW8zICA9IDB4MDIwMDAwMDAsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKKwkJCS5ncGlvMCAgPSAweDAwM2ZmZmZmLAorCQkJLmdwaW8xICA9IDB4MDBlMDAwMDAsCisJCQkuZ3BpbzIgID0gMHgwMDNmZmZmZiwKKwkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAorCQl9fSwKKwl9LAogCVtDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMzAwXSA9IHsKIAkJLm5hbWUJCT0gIkhhdXBwYXVnZSBXaW5UVi1IVlIxMzAwIERWQi1UL0h5YnJpZCBNUEVHIEVuY29kZXIiLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMsCkBAIC0xMjkyLDE3ICsxMzA4LDIwIEBACiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKIAkJCS5ncGlvMAk9IDB4ZTc4MCwKKwkJCS5leHRhZGMgPSAxLAogCQl9LHsKIAkJCS50eXBlCT0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eAk9IDEsCiAJCQkuZ3BpbzAJPSAweGU3ODAsCisJCQkuZXh0YWRjID0gMSwKIAkJfSx7CiAJCQkudHlwZQk9IENYODhfVk1VWF9TVklERU8sCiAJCQkudm11eAk9IDIsCiAJCQkuZ3BpbzAJPSAweGU3ODAsCisJCQkuZXh0YWRjID0gMSwKIAkJfX0sCiAJCS8qIGZpeG1lOiBBZGQgcmFkaW8gc3VwcG9ydCAqLwotCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAorCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCIHwgQ1g4OF9NUEVHX0JMQUNLQklSRCwKIAl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9ib2FyZHMpOwpAQCAtMTUxMiw2ICsxNTMxLDEwIEBACiAJfSx7CiAJCS5zdWJ2ZW5kb3IgPSAweDE3ZGUsCiAJCS5zdWJkZXZpY2UgPSAweDA4NDAsCisJICAgICAgIC5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0tXT1JMRF9IQVJEV0FSRV9NUEVHX1RWX1hQRVJULAorICAgICAgIH0seworCSAgICAgICAuc3VidmVuZG9yID0gMHgxNDIxLAorCSAgICAgICAuc3ViZGV2aWNlID0gMHgwMzA1LAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9LV09STERfSEFSRFdBUkVfTVBFR19UVl9YUEVSVCwKIAl9LHsKIAkJLnN1YnZlbmRvciA9IDB4MThhYywKQEAgLTE1OTAsNiArMTYxMywxOCBAQAogCQkuc3VidmVuZG9yID0gMHgwMDcwLAogCQkuc3ViZGV2aWNlID0gMHg5MDAwLAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxLAorCX0seworCQkuc3VidmVuZG9yID0gMHgwMDcwLAorCQkuc3ViZGV2aWNlID0gMHgxNDAwLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MDA3MCwKKwkJLnN1YmRldmljZSA9IDB4MTQwMSwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjMwMDAsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgPSAweDE0MDIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIzMDAwLAogCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IGN4ODhfaWRjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9zdWJpZHMpOwpAQCAtMTYzMyw3ICsxNjY4LDE1IEBACiAJLyogTWFrZSBzdXJlIHdlIHN1cHBvcnQgdGhlIGJvYXJkIG1vZGVsICovCiAJc3dpdGNoICh0di5tb2RlbCkKIAl7CisJY2FzZSAxNDAwOTogLyogV2luVFYtSFZSMzAwMCAoUmV0YWlsLCBJUiwgYi9wYW5lbCB2aWRlbywgMy41bW0gYXVkaW8gaW4pICovCisJY2FzZSAxNDAxOTogLyogV2luVFYtSFZSMzAwMCAoUmV0YWlsLCBJUiBCbGFzdGVyLCBiL3BhbmVsIHZpZGVvLCAzLjVtbSBhdWRpbyBpbikgKi8KKwljYXNlIDE0MDI5OiAvKiBXaW5UVi1IVlIzMDAwIChSZXRhaWwsIElSLCBiL3BhbmVsIHZpZGVvLCAzLjVtbSBhdWRpbyBpbiAtIDg4MCBicmlkZ2UpICovCisJY2FzZSAxNDEwOTogLyogV2luVFYtSFZSMzAwMCAoUmV0YWlsLCBJUiwgYi9wYW5lbCB2aWRlbywgMy41bW0gYXVkaW8gaW4gLSBsb3cgcHJvZmlsZSkgKi8KKwljYXNlIDE0MTI5OiAvKiBXaW5UVi1IVlIzMDAwIChSZXRhaWwsIElSLCBiL3BhbmVsIHZpZGVvLCAzLjVtbSBhdWRpbyBpbiAtIDg4MCBicmlkZ2UgLSBMUCkgKi8KKwljYXNlIDE0NTU5OiAvKiBXaW5UVi1IVlIzMDAwIChPRU0sIG5vIElSLCBiL3BhbmVsIHZpZGVvLCAzLjVtbSBhdWRpbyBpbikgKi8KIAljYXNlIDE0NTY5OiAvKiBXaW5UVi1IVlIzMDAwIChPRU0sIG5vIElSLCBubyBiYWNrIHBhbmVsIHZpZGVvKSAqLworCWNhc2UgMTQ2NTk6IC8qIFdpblRWLUhWUjMwMDAgKE9FTSwgbm8gSVIsIGIvcGFuZWwgdmlkZW8sIFJDQSBhdWRpbyBpbiAtIExvdyBwcm9maWxlKSAqLworCWNhc2UgMTQ2Njk6IC8qIFdpblRWLUhWUjMwMDAgKE9FTSwgbm8gSVIsIG5vIGIvcGFuZWwgdmlkZW8gLSBMb3cgcHJvZmlsZSkgKi8KIAljYXNlIDI4NTUyOiAvKiBXaW5UVi1QVlIgJ1Jvc2x5bicgKE5vIElSKSAqLwogCWNhc2UgMzQ1MTk6IC8qIFdpblRWLVBDSS1GTSAqLwogCWNhc2UgOTAwMDI6IC8qIE5vdmEtVC1QQ0kgKDkwMDIpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggNGI2NTVmMi4uNDUzYWY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwpAQCAtMTE1Myw3ICsxMTUzLDcgQEAKIAltdXRleF9sb2NrKCZkZXZsaXN0KTsKIAljeDg4X2lyX2ZpbmkoY29yZSk7CiAJaWYgKDAgPT0gY29yZS0+aTJjX3JjKQotCQlpMmNfYml0X2RlbF9idXMoJmNvcmUtPmkyY19hZGFwKTsKKwkJaTJjX2RlbF9hZGFwdGVyKCZjb3JlLT5pMmNfYWRhcCk7CiAJbGlzdF9kZWwoJmNvcmUtPmRldmxpc3QpOwogCWlvdW5tYXAoY29yZS0+bG1taW8pOwogCWN4ODhfZGV2Y291bnQtLTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKaW5kZXggYmQwYzg3OS4uOGIyMDMzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlICJjeDIyNzAyLmgiCiAjaW5jbHVkZSAib3I1MTEzMi5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCi0jaW5jbHVkZSAibGdfaDA2eGYuaCIKKyNpbmNsdWRlICJsZ2gwNnhmLmgiCiAjaW5jbHVkZSAibnh0MjAweC5oIgogI2luY2x1ZGUgImN4MjQxMjMuaCIKICNpbmNsdWRlICJpc2w2NDIxLmgiCkBAIC01Nyw3ICs1Nyw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW2R2Yl0iKTsKIAogI2RlZmluZSBkcHJpbnRrKGxldmVsLGZtdCwgYXJnLi4uKQlpZiAoZGVidWcgPj0gbGV2ZWwpIFwKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMvMi1kdmI6ICIgZm10LCBkZXYtPmNvcmUtPm5hbWUgLCAjIyBhcmcpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzLzItZHZiOiAiIGZtdCwgY29yZS0+bmFtZSwgIyMgYXJnKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNzQsOCArNzQsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR2Yl9idWZfcHJlcGFyZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAotCQkJICAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQorc3RhdGljIGludCBkdmJfYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gcS0+cHJpdl9kYXRhOwogCXJldHVybiBjeDg4MDJfYnVmX3ByZXBhcmUocSwgZGV2LCAoc3RydWN0IGN4ODhfYnVmZmVyKil2YixmaWVsZCk7CkBAIC04Nyw3ICs4Nyw4IEBACiAJY3g4ODAyX2J1Zl9xdWV1ZShkZXYsIChzdHJ1Y3QgY3g4OF9idWZmZXIqKXZiKTsKIH0KIAotc3RhdGljIHZvaWQgZHZiX2J1Zl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCitzdGF0aWMgdm9pZCBkdmJfYnVmX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCWN4ODhfZnJlZV9idWZmZXIocSwgKHN0cnVjdCBjeDg4X2J1ZmZlciopdmIpOwogfQpAQCAtMTAwLDYgKzEwMSwyNiBAQAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgY3g4OF9kdmJfYnVzX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBhY3F1aXJlKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY9IGZlLT5kdmItPnByaXY7CisJc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlkcnYgPSBjeDg4MDJfZ2V0X2RyaXZlcihkZXYsIENYODhfTVBFR19EVkIpOworCWlmIChkcnYpIHsKKwkJaWYgKGFjcXVpcmUpCisJCQlyZXQgPSBkcnYtPnJlcXVlc3RfYWNxdWlyZShkcnYpOworCQllbHNlCisJCQlyZXQgPSBkcnYtPnJlcXVlc3RfcmVsZWFzZShkcnYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiBzdGF0aWMgaW50IGR2aWNvX2Z1c2lvbmhkdHZfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdGF0aWMgdTggY2xvY2tfY29uZmlnIFtdICA9IHsgQ0xPQ0tfQ1RMLCAgMHgzOCwgMHgzOSB9OwpAQCAtMjY4LDM1ICsyODksNiBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgaW50IGR2aWNvX2h5YnJpZF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQkJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCi17Ci0JdTggcGxsYnVmWzRdOwotCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY9IGZlLT5kdmItPnByaXY7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0KLQkJeyAuYWRkciA9IGRldi0+Y29yZS0+cGxsX2FkZHIsIC5mbGFncyA9IDAsCi0JCSAgLmJ1ZiA9IHBsbGJ1ZiwgLmxlbiA9IDQgfTsKLQlpbnQgZXJyOwotCi0JZHZiX3BsbF9jb25maWd1cmUoZGV2LT5jb3JlLT5wbGxfZGVzYywgcGxsYnVmLAotCQkJICBwYXJhbXMtPmZyZXF1ZW5jeSwKLQkJCSAgcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKTsKLQotCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoJmRldi0+Y29yZS0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImN4ODgtZHZiOiAlcyBlcnJvciAiCi0JCSAgICAgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIHBsbGJ1ZlswXSwgcGxsYnVmWzFdLCBlcnIpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWVsc2UKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHpsMTAzNTNfY29uZmlnIGR2aWNvX2Z1c2lvbmhkdHZfaHlicmlkID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKIAkubm9fdHVuZXIgICAgICA9IDEsCkBAIC0zMTEsMjEgKzMwMywxMiBAQAogCS5vdXRwdXRfbW9kZSAgID0gQ1gyMjcwMl9TRVJJQUxfT1VUUFVULAogfTsKIAotc3RhdGljIHN0cnVjdCBjeDIyNzAyX2NvbmZpZyBoYXVwcGF1Z2Vfbm92YXRfY29uZmlnID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHg0MywKLQkub3V0cHV0X21vZGUgICA9IENYMjI3MDJfU0VSSUFMX09VVFBVVCwKLX07Ci1zdGF0aWMgc3RydWN0IGN4MjI3MDJfY29uZmlnIGhhdXBwYXVnZV9odnIxMTAwX2NvbmZpZyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4NjMsCi0JLm91dHB1dF9tb2RlICAgPSBDWDIyNzAyX1NFUklBTF9PVVRQVVQsCi19Owotc3RhdGljIHN0cnVjdCBjeDIyNzAyX2NvbmZpZyBoYXVwcGF1Z2VfaHZyMTMwMF9jb25maWcgPSB7CitzdGF0aWMgc3RydWN0IGN4MjI3MDJfY29uZmlnIGhhdXBwYXVnZV9odnJfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2MywKIAkub3V0cHV0X21vZGUgICA9IENYMjI3MDJfU0VSSUFMX09VVFBVVCwKIH07CiAKLXN0YXRpYyBpbnQgb3I1MTEzMl9zZXRfdHNfcGFyYW0oc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkJaW50IGlzX3B1bmN0dXJlZCkKK3N0YXRpYyBpbnQgb3I1MTEzMl9zZXRfdHNfcGFyYW0oc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpCiB7CiAJc3RydWN0IGN4ODgwMl9kZXYgKmRldj0gZmUtPmR2Yi0+cHJpdjsKIAlkZXYtPnRzX2dlbl9jbnRybCA9IGlzX3B1bmN0dXJlZCA/IDB4MDQgOiAweDAwOwpAQCAtMzM3LDUwICszMjAsNiBAQAogCS5zZXRfdHNfcGFyYW1zID0gb3I1MTEzMl9zZXRfdHNfcGFyYW0sCiB9OwogCi1zdGF0aWMgaW50IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKLXsKLQkvKiBGSVhNRSBtYWtlIHRoaXMgcm91dGluZSB1c2UgdGhlIHR1bmVyLXNpbXBsZSBjb2RlLgotCSAqIEl0IGNvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIGEgbnVtYmVyIG9mIEFUU0MKLQkgKiBmcm9udGVuZHMuIE1hbnkgc2hhcmUgdGhlIHNhbWUgdHVuZXIgd2l0aCBhbmFsb2cgVFYuICovCi0KLQlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OwotCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7Ci0JdTggYnVmWzRdOwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9Ci0JCXsgLmFkZHIgPSBkZXYtPmNvcmUtPnBsbF9hZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gNCB9OwotCWludCBlcnI7Ci0KLQlkdmJfcGxsX2NvbmZpZ3VyZShjb3JlLT5wbGxfZGVzYywgYnVmLCBwYXJhbXMtPmZyZXF1ZW5jeSwgMCk7Ci0JZHByaW50aygxLCAiJXM6IHR1bmVyIGF0IDB4JTAyeCBieXRlczogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAotCQlfX0ZVTkNUSU9OX18sIG1zZy5hZGRyLCBidWZbMF0sYnVmWzFdLGJ1ZlsyXSxidWZbM10pOwotCi0JaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmY29yZS0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImN4ODgtZHZiOiAlcyBlcnJvciAiCi0JCSAgICAgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWVsc2UKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAotCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCi17Ci0Jc3RydWN0IGN4ODgwMl9kZXYgKmRldj0gZmUtPmR2Yi0+cHJpdjsKLQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwotCi0JLyogUHV0IHRoZSBhbmFsb2cgZGVjb2RlciBpbiBzdGFuZGJ5IHRvIGtlZXAgaXQgcXVpZXQgKi8KLQljeDg4X2NhbGxfaTJjX2NsaWVudHMgKGRldi0+Y29yZSwgVFVORVJfU0VUX1NUQU5EQlksIE5VTEwpOwotCi0JcmV0dXJuIGxnX2gwNnhmX3BsbF9zZXQoZmUsICZjb3JlLT5pMmNfYWRhcCwgcGFyYW1zKTsKLX0KLQogc3RhdGljIGludCBsZ2R0MzMweF9wbGxfcmZfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IGN4ODgwMl9kZXYgKmRldj0gZmUtPmR2Yi0+cHJpdjsKQEAgLTQyNSw4ICszNjQsNyBAQAogCS5zZXRfdHNfcGFyYW1zID0gbGdkdDMzMHhfc2V0X3RzX3BhcmFtLAogfTsKIAotc3RhdGljIGludCBueHQyMDB4X3NldF90c19wYXJhbShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCQlpbnQgaXNfcHVuY3R1cmVkKQorc3RhdGljIGludCBueHQyMDB4X3NldF90c19wYXJhbShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGlzX3B1bmN0dXJlZCkKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OwogCWRldi0+dHNfZ2VuX2NudHJsID0gaXNfcHVuY3R1cmVkID8gMHgwNCA6IDB4MDA7CkBAIC00NjIsMTEgKzQwMCwxMCBAQAogCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY9IGZlLT5kdmItPnByaXY7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAotCWlmICh2b2x0YWdlID09IFNFQ19WT0xUQUdFX09GRikgeworCWlmICh2b2x0YWdlID09IFNFQ19WT0xUQUdFX09GRikKIAkJY3hfd3JpdGUoTU9fR1AwX0lPLCAweDAwMDAwNmZiKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJY3hfd3JpdGUoTU9fR1AwX0lPLCAweDAwMDAwNmY5KTsKLQl9CiAKIAlpZiAoY29yZS0+cHJldl9zZXRfdm9sdGFnZSkKIAkJcmV0dXJuIGNvcmUtPnByZXZfc2V0X3ZvbHRhZ2UoZmUsIHZvbHRhZ2UpOwpAQCAtNTE1LDcgKzQ1Miw3IEBACiAJc3dpdGNoIChkZXYtPmNvcmUtPmJvYXJkKSB7CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwKLQkJCQkJICAgICAgICZoYXVwcGF1Z2Vfbm92YXRfY29uZmlnLAorCQkJCQkgICAgICAgJmNvbm5leGFudF9yZWZib2FyZF9jb25maWcsCiAJCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CiAJCQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKQEAgLTU0MCwyMiArNDc3LDExIEBACiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTAwOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMExQOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goY3gyMjcwMl9hdHRhY2gsCi0JCQkJCSAgICAgICAmaGF1cHBhdWdlX2h2cjExMDBfY29uZmlnLAorCQkJCQkgICAgICAgJmhhdXBwYXVnZV9odnJfY29uZmlnLAogCQkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgewogCQkJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCi0JCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCi0JCQkJICAgJmR2Yl9wbGxfZm1kMTIxNm1lKTsKLQkJfQotCQlicmVhazsKLQljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjEzMDA6Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwKLQkJCQkJICAgICAgICZoYXVwcGF1Z2VfaHZyMTMwMF9jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7Ci0JCQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKLQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKLQkJCQkgICAmZHZiX3BsbF9mbWQxMjE2bWUpOworCQkJCSAgICZkZXYtPmNvcmUtPmkyY19hZGFwLCAmZHZiX3BsbF9mbWQxMjE2bWUpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX1BMVVM6CkBAIC02MzAsMTggKzU1NiwxNyBAQAogI2VuZGlmCiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0hZQlJJRDoKLQkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7Ci0JCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90aG9tc29uX2ZlNjYwMDsKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAogCQkJCQkgICAgICAgJmR2aWNvX2Z1c2lvbmhkdHZfaHlicmlkLAogCQkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGR2aWNvX2h5YnJpZF90dW5lcl9zZXRfcGFyYW1zOworCQkJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCisJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgJmR2Yl9wbGxfdGhvbXNvbl9mZTY2MDApOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9QQ0hEVFZfSEQzMDAwOgotCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2gob3I1MTEzMl9hdHRhY2gsCi0JCQkJCSAgICAgICAmcGNoZHR2X2hkMzAwMCwKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKG9yNTExMzJfYXR0YWNoLCAmcGNoZHR2X2hkMzAwMCwKIAkJCQkJICAgICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKIAkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKIAkJCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLApAQCAtNjYyLDEzICs1ODcsMTMgQEAKIAogCQkvKiBTZWxlY3QgUkYgY29ubmVjdG9yIGNhbGxiYWNrICovCiAJCWZ1c2lvbmhkdHZfM19nb2xkLnBsbF9yZl9zZXQgPSBsZ2R0MzMweF9wbGxfcmZfc2V0OwotCQlkZXYtPmNvcmUtPnBsbF9hZGRyID0gMHg2MTsKLQkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX21pY3JvdHVuZV80MDQyOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2gobGdkdDMzMHhfYXR0YWNoLAogCQkJCQkgICAgICAgJmZ1c2lvbmhkdHZfM19nb2xkLAogCQkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXM7CisJCQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKKwkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAmZHZiX3BsbF9taWNyb3R1bmVfNDA0Mik7CiAJCX0KIAkJfQogCQlicmVhazsKQEAgLTY4MiwxMyArNjA3LDEzIEBACiAJCW1kZWxheSgxMDApOwogCQljeF9zZXQoTU9fR1AwX0lPLCA5KTsKIAkJbWRlbGF5KDIwMCk7Ci0JCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOwotCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjF4OwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2gobGdkdDMzMHhfYXR0YWNoLAogCQkJCQkgICAgICAgJmZ1c2lvbmhkdHZfM19nb2xkLAogCQkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXM7CisJCQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKKwkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAmZHZiX3BsbF90aG9tc29uX2R0dDc2MXgpOwogCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC03MDYsNyArNjMxLDggQEAKIAkJCQkJICAgICAgICZmdXNpb25oZHR2XzVfZ29sZCwKIAkJCQkJICAgICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKIAkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zOworCQkJZHZiX2F0dGFjaChsZ2gwNnhmX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsCisJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQl9CiAJCX0KIAkJYnJlYWs7CkBAIC03MjQsNyArNjUwLDggQEAKIAkJCQkJICAgICAgICZwY2hkdHZfaGQ1NTAwLAogCQkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGxnZHQzMzAzX3R1bmVyX3NldF9wYXJhbXM7CisJCQlkdmJfYXR0YWNoKGxnaDA2eGZfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwKKwkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCX0KIAkJfQogCQlicmVhazsKQEAgLTc2NSw2ICs2OTIsMjQgQEAKIAkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2UgPSBnZW5pYXRlY2hfZHZic19zZXRfdm9sdGFnZTsKIAkJfQogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjEzMDA6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwKKwkJCQkJICAgICAgICZoYXVwcGF1Z2VfaHZyX2NvbmZpZywKKwkJCQkJICAgICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICZkZXYtPmNvcmUtPmkyY19hZGFwLCAmZHZiX3BsbF9mbWQxMjE2bWUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMDoKKwkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGN4MjI3MDJfYXR0YWNoLAorCQkJCQkgICAgICAgJmhhdXBwYXVnZV9odnJfY29uZmlnLAorCQkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCisJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsICZkdmJfcGxsX2ZtZDEyMTZtZSk7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKCIlczogVGhlIGZyb250ZW5kIG9mIHlvdXIgRFZCL0FUU0MgY2FyZCBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iLAogCQkgICAgICAgZGV2LT5jb3JlLT5uYW1lKTsKQEAgLTc3OSw2ICs3MjQsOCBAQAogCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLmluZm8uZnJlcXVlbmN5X21pbiA9IGRldi0+Y29yZS0+cGxsX2Rlc2MtPm1pbjsKIAkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pbmZvLmZyZXF1ZW5jeV9tYXggPSBkZXYtPmNvcmUtPnBsbF9kZXNjLT5tYXg7CiAJfQorCS8qIEVuc3VyZSBhbGwgZnJvbnRlbmRzIG5lZ290aWF0ZSBidXMgYWNjZXNzICovCisJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50c19idXNfY3RybCA9IGN4ODhfZHZiX2J1c19jdHJsOwogCiAJLyogUHV0IHRoZSBhbmFsb2cgZGVjb2RlciBpbiBzdGFuZGJ5IHRvIGtlZXAgaXQgcXVpZXQgKi8KIAljeDg4X2NhbGxfaTJjX2NsaWVudHMgKGRldi0+Y29yZSwgVFVORVJfU0VUX1NUQU5EQlksIE5VTEwpOwpAQCAtNzg5LDM3ICs3MzYsNjcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBfX2RldmluaXQgZHZiX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCisvKiBDWDg4MDIgTVBFRyAtPiBtaW5pIGRyaXZlciAtIFdlIGhhdmUgYmVlbiBnaXZlbiB0aGUgaGFyZHdhcmUgKi8KK3N0YXRpYyBpbnQgY3g4ODAyX2R2Yl9hZHZpc2VfYWNxdWlyZShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY7Ci0Jc3RydWN0IGN4ODhfY29yZSAgKmNvcmU7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRydi0+Y29yZTsKKwlpbnQgZXJyID0gMDsKKwlkcHJpbnRrKCAxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKGNvcmUtPmJvYXJkKSB7CisJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMzAwOgorCQkvKiBXZSBhcnJpdmUgaGVyZSB3aXRoIGVpdGhlciB0aGUgY3gyMzQxNiBvciB0aGUgY3gyMjcwMgorCQkgKiBvbiB0aGUgYnVzLiBUYWtlIHRoZSBidXMgZnJvbSB0aGUgY3gyMzQxNiBhbmQgZW5hYmxlIHRoZQorCQkgKiBjeDIyNzAyIGRlbW9kCisJCSAqLworCQljeF9zZXQoTU9fR1AwX0lPLCAgIDB4MDAwMDAwODApOyAvKiBjeDIyNzAyIG91dCBvZiByZXNldCBhbmQgZW5hYmxlICovCisJCWN4X2NsZWFyKE1PX0dQMF9JTywgMHgwMDAwMDAwNCk7CisJCXVkZWxheSgxMDAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0RFVjsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogQ1g4ODAyIE1QRUcgLT4gbWluaSBkcml2ZXIgLSBXZSBubyBsb25nZXIgaGF2ZSB0aGUgaGFyZHdhcmUgKi8KK3N0YXRpYyBpbnQgY3g4ODAyX2R2Yl9hZHZpc2VfcmVsZWFzZShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkcnYtPmNvcmU7CisJaW50IGVyciA9IDA7CisJZHByaW50ayggMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoIChjb3JlLT5ib2FyZCkgeworCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTMwMDoKKwkJLyogRG8gTm90aGluZywgbGVhdmUgdGhlIGN4MjI3MDIgb24gdGhlIGJ1cy4gKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0RFVjsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjeDg4MDJfZHZiX3Byb2JlKHN0cnVjdCBjeDg4MDJfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRydi0+Y29yZTsKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2ID0gZHJ2LT5jb3JlLT5kdmJkZXY7CiAJaW50IGVycjsKIAotCS8qIGdlbmVyYWwgc2V0dXAgKi8KLQljb3JlID0gY3g4OF9jb3JlX2dldChwY2lfZGV2KTsKLQlpZiAoTlVMTCA9PSBjb3JlKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlkcHJpbnRrKCAxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZHByaW50ayggMSwgIiAtPmJlaW5nIHByb2JlZCBieSBDYXJkPSVkIE5hbWU9JXMsIFBDSSAlMDJ4OiUwMnhcbiIsCisJCWNvcmUtPmJvYXJkLAorCQljb3JlLT5uYW1lLAorCQljb3JlLT5wY2lfYnVzLAorCQljb3JlLT5wY2lfc2xvdCk7CiAKIAllcnIgPSAtRU5PREVWOwogCWlmICghKGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5tcGVnICYgQ1g4OF9NUEVHX0RWQikpCiAJCWdvdG8gZmFpbF9jb3JlOwogCi0JZXJyID0gLUVOT01FTTsKLQlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSxHRlBfS0VSTkVMKTsKLQlpZiAoTlVMTCA9PSBkZXYpCi0JCWdvdG8gZmFpbF9jb3JlOwotCWRldi0+cGNpID0gcGNpX2RldjsKLQlkZXYtPmNvcmUgPSBjb3JlOwotCi0JZXJyID0gY3g4ODAyX2luaXRfY29tbW9uKGRldik7Ci0JaWYgKDAgIT0gZXJyKQotCQlnb3RvIGZhaWxfZnJlZTsKLQogI2lmZGVmIEhBVkVfVlAzMDU0X0kyQwogCWVyciA9IHZwMzA1NF9pMmNfcHJvYmUoZGV2KTsKIAlpZiAoMCAhPSBlcnIpCi0JCWdvdG8gZmFpbF9mcmVlOworCQlnb3RvIGZhaWxfY29yZTsKICNlbmRpZgogCiAJLyogZHZiIHN0dWZmICovCkBAIC04MzEsMjggKzgwOCwxNiBAQAogCQkJICAgIHNpemVvZihzdHJ1Y3QgY3g4OF9idWZmZXIpLAogCQkJICAgIGRldik7CiAJZXJyID0gZHZiX3JlZ2lzdGVyKGRldik7Ci0JaWYgKDAgIT0gZXJyKQotCQlnb3RvIGZhaWxfZmluaTsKKwlpZiAoZXJyICE9IDApCisJCXByaW50aygiJXMgZHZiX3JlZ2lzdGVyIGZhaWxlZCBlcnIgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOwogCi0JLyogTWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gY3g4OC12aWRlbyBjYW4gcXVlcnkgdGhlIDg4MDIgZGV2aWNlLiAqLwotCWNvcmUtPmR2YmRldiA9IGRldjsKLQlyZXR1cm4gMDsKLQotIGZhaWxfZmluaToKLQljeDg4MDJfZmluaV9jb21tb24oZGV2KTsKLSBmYWlsX2ZyZWU6Ci0Ja2ZyZWUoZGV2KTsKICBmYWlsX2NvcmU6Ci0JY3g4OF9jb3JlX3B1dChjb3JlLHBjaV9kZXYpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkdmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQorc3RhdGljIGludCBjeDg4MDJfZHZiX3JlbW92ZShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0KLQkvKiBEZXN0cm95IGFueSA4ODAyIHJlZmVyZW5jZS4gKi8KLQlkZXYtPmNvcmUtPmR2YmRldiA9IE5VTEw7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGRydi0+Y29yZS0+ZHZiZGV2OwogCiAJLyogZHZiICovCiAJdmlkZW9idWZfZHZiX3VucmVnaXN0ZXIoJmRldi0+ZHZiKTsKQEAgLTg2MSwzMyArODI2LDE2IEBACiAJdnAzMDU0X2kyY19yZW1vdmUoZGV2KTsKICNlbmRpZgogCi0JLyogY29tbW9uICovCi0JY3g4ODAyX2ZpbmlfY29tbW9uKGRldik7Ci0JY3g4OF9jb3JlX3B1dChkZXYtPmNvcmUsZGV2LT5wY2kpOwotCWtmcmVlKGRldik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeDg4MDJfcGNpX3RibFtdID0gewotCXsKLQkJLnZlbmRvciAgICAgICA9IDB4MTRmMSwKLQkJLmRldmljZSAgICAgICA9IDB4ODgwMiwKLQkJLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAotCX0sewotCQkvKiAtLS0gZW5kIG9mIGxpc3QgLS0tICovCi0JfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjeDg4MDJfcGNpX3RibCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkdmJfcGNpX2RyaXZlciA9IHsKLQkubmFtZSAgICAgPSAiY3g4OC1kdmIiLAotCS5pZF90YWJsZSA9IGN4ODgwMl9wY2lfdGJsLAotCS5wcm9iZSAgICA9IGR2Yl9wcm9iZSwKLQkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChkdmJfcmVtb3ZlKSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZCAgPSBjeDg4MDJfc3VzcGVuZF9jb21tb24sCi0JLnJlc3VtZSAgID0gY3g4ODAyX3Jlc3VtZV9jb21tb24sCi0jZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgY3g4ODAyX2RyaXZlciBjeDg4MDJfZHZiX2RyaXZlciA9IHsKKwkudHlwZV9pZCAgICAgICAgPSBDWDg4X01QRUdfRFZCLAorCS5od19hY2Nlc3MgICAgICA9IENYODgwMl9EUlZDVExfU0hBUkVELAorCS5wcm9iZSAgICAgICAgICA9IGN4ODgwMl9kdmJfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gY3g4ODAyX2R2Yl9yZW1vdmUsCisJLmFkdmlzZV9hY3F1aXJlID0gY3g4ODAyX2R2Yl9hZHZpc2VfYWNxdWlyZSwKKwkuYWR2aXNlX3JlbGVhc2UgPSBjeDg4MDJfZHZiX2FkdmlzZV9yZWxlYXNlLAogfTsKIAogc3RhdGljIGludCBkdmJfaW5pdCh2b2lkKQpAQCAtOTAwLDEyICs4NDgsMTIgQEAKIAlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAogCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOwogI2VuZGlmCi0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmR2Yl9wY2lfZHJpdmVyKTsKKwlyZXR1cm4gY3g4ODAyX3JlZ2lzdGVyX2RyaXZlcigmY3g4ODAyX2R2Yl9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBkdmJfZmluaSh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHZiX3BjaV9kcml2ZXIpOworCWN4ODgwMl91bnJlZ2lzdGVyX2RyaXZlcigmY3g4ODAyX2R2Yl9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChkdmJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwppbmRleCA4M2ViZjdhLi44MTM2NjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKQEAgLTE0NSw5ICsxNDUsOSBAQAogCXNjaGVkdWxlX3dvcmsoJmlyLT53b3JrKTsKIH0KIAotc3RhdGljIHZvaWQgY3g4OF9pcl93b3JrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBjeDg4X2lyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBjeDg4X0lSICppciA9IGRhdGE7CisJc3RydWN0IGN4ODhfSVIgKmlyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjeDg4X0lSLCB3b3JrKTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKIAljeDg4X2lyX2hhbmRsZV9rZXkoaXIpOwpAQCAtMTU1LDYgKzE1NSwzNSBAQAogCW1vZF90aW1lcigmaXItPnRpbWVyLCB0aW1lb3V0KTsKIH0KIAorc3RhdGljIHZvaWQgY3g4OF9pcl9zdGFydChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCBzdHJ1Y3QgY3g4OF9JUiAqaXIpCit7CisJaWYgKGlyLT5wb2xsaW5nKSB7CisJCUlOSVRfV09SSygmaXItPndvcmssIGN4ODhfaXJfd29yayk7CisJCWluaXRfdGltZXIoJmlyLT50aW1lcik7CisJCWlyLT50aW1lci5mdW5jdGlvbiA9IGlyX3RpbWVyOworCQlpci0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWlyOworCQlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7CisJfQorCWlmIChpci0+c2FtcGxpbmcpIHsKKwkJY29yZS0+cGNpX2lycW1hc2sgfD0gKDEgPDwgMTgpOwkvKiBJUl9TTVBfSU5UICovCisJCWN4X3dyaXRlKE1PX0REU19JTywgMHhhODBhODApOwkvKiA0IGtIeiBzYW1wbGUgcmF0ZSAqLworCQljeF93cml0ZShNT19ERFNDRkdfSU8sIDB4NSk7CS8qIGVuYWJsZSAqLworCX0KK30KKworc3RhdGljIHZvaWQgY3g4OF9pcl9zdG9wKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHN0cnVjdCBjeDg4X0lSICppcikKK3sKKwlpZiAoaXItPnNhbXBsaW5nKSB7CisJCWN4X3dyaXRlKE1PX0REU0NGR19JTywgMHgwKTsKKwkJY29yZS0+cGNpX2lycW1hc2sgJj0gfigxIDw8IDE4KTsKKwl9CisKKwlpZiAoaXItPnBvbGxpbmcpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmlyLT50aW1lcik7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfQorfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIGludCBjeDg4X2lyX2luaXQoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgc3RydWN0IHBjaV9kZXYgKnBjaSkKQEAgLTE2MywxNCArMTkyLDEyIEBACiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCUlSX0tFWVRBQl9UWVBFICppcl9jb2RlcyA9IE5VTEw7CiAJaW50IGlyX3R5cGUgPSBJUl9UWVBFX09USEVSOworCWludCBlcnIgPSAtRU5PTUVNOwogCiAJaXIgPSBremFsbG9jKHNpemVvZigqaXIpLCBHRlBfS0VSTkVMKTsKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWlyIHx8ICFpbnB1dF9kZXYpIHsKLQkJa2ZyZWUoaXIpOwotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJaWYgKCFpciB8fCAhaW5wdXRfZGV2KQorCQlnb3RvIGVycl9vdXRfZnJlZTsKIAogCWlyLT5pbnB1dCA9IGlucHV0X2RldjsKIApAQCAtMTk2LDE4ICsyMjMsMjUgQEAKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTUExVU19TMToKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDA6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMzAwOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMDoKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3OwogCQlpcl90eXBlID0gSVJfVFlQRV9SQzU7CiAJCWlyLT5zYW1wbGluZyA9IDE7CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIOgotCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVDoKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc193aW5mYXN0OwogCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CiAJCWlyLT5tYXNrX2tleXVwID0gMHgxMDA7CiAJCWlyLT5wb2xsaW5nID0gNTA7IC8qIG1zICovCiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVDoKKwkJaXJfY29kZXMgPSBpcl9jb2Rlc193aW5mYXN0OworCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOworCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CisJCWlyLT5tYXNrX2tleXVwID0gMHgxMDA7CisJCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KKwkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0lPREFUQV9HVkJDVFY3RToKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc19pb2RhdGFfYmN0djdlOwogCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwpAQCAtMjE1LDcgKzI0OSw3IEBACiAJCWlyLT5tYXNrX2tleWRvd24gPSAweDAyOwogCQlpci0+cG9sbGluZyA9IDU7IC8qIG1zICovCiAJCWJyZWFrOwotICAgICAgIGNhc2UgQ1g4OF9CT0FSRF9QUk9MSU5LX1BMQVlUVlBWUjoKKwljYXNlIENYODhfQk9BUkRfUFJPTElOS19QTEFZVFZQVlI6CiAJY2FzZSBDWDg4X0JPQVJEX1BJWEVMVklFV19QTEFZVFZfVUxUUkFfUFJPOgogCQlpcl9jb2RlcyA9IGlyX2NvZGVzX3BpeGVsdmlldzsKIAkJaXItPmdwaW9fYWRkciA9IE1PX0dQMV9JTzsKQEAgLTI3Myw5ICszMDcsOCBAQAogCX0KIAogCWlmIChOVUxMID09IGlyX2NvZGVzKSB7Ci0JCWtmcmVlKGlyKTsKLQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlOwogCX0KIAogCS8qIGluaXQgaW5wdXQgZGV2aWNlICovCkBAIC0zMDAsMjMgKzMzMywyMiBAQAogCWlyLT5jb3JlID0gY29yZTsKIAljb3JlLT5pciA9IGlyOwogCi0JaWYgKGlyLT5wb2xsaW5nKSB7Ci0JCUlOSVRfV09SSygmaXItPndvcmssIGN4ODhfaXJfd29yaywgaXIpOwotCQlpbml0X3RpbWVyKCZpci0+dGltZXIpOwotCQlpci0+dGltZXIuZnVuY3Rpb24gPSBpcl90aW1lcjsKLQkJaXItPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpcjsKLQkJc2NoZWR1bGVfd29yaygmaXItPndvcmspOwotCX0KLQlpZiAoaXItPnNhbXBsaW5nKSB7Ci0JCWNvcmUtPnBjaV9pcnFtYXNrIHw9ICgxIDw8IDE4KTsJLyogSVJfU01QX0lOVCAqLwotCQljeF93cml0ZShNT19ERFNfSU8sIDB4YTgwYTgwKTsJLyogNCBrSHogc2FtcGxlIHJhdGUgKi8KLQkJY3hfd3JpdGUoTU9fRERTQ0ZHX0lPLCAweDUpOwkvKiBlbmFibGUgKi8KLQl9CisJY3g4OF9pcl9zdGFydChjb3JlLCBpcik7CiAKIAkvKiBhbGwgZG9uZSAqLwotCWlucHV0X3JlZ2lzdGVyX2RldmljZShpci0+aW5wdXQpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpci0+aW5wdXQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9zdG9wOwogCiAJcmV0dXJuIDA7CisKKyBlcnJfb3V0X3N0b3A6CisJY3g4OF9pcl9zdG9wKGNvcmUsIGlyKTsKKwljb3JlLT5pciA9IE5VTEw7CisgZXJyX291dF9mcmVlOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoaXIpOworCXJldHVybiBlcnI7CiB9CiAKIGludCBjeDg4X2lyX2Zpbmkoc3RydWN0IGN4ODhfY29yZSAqY29yZSkKQEAgLTMyNywxNSArMzU5LDcgQEAKIAlpZiAoTlVMTCA9PSBpcikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoaXItPnNhbXBsaW5nKSB7Ci0JCWN4X3dyaXRlKE1PX0REU0NGR19JTywgMHgwKTsKLQkJY29yZS0+cGNpX2lycW1hc2sgJj0gfigxIDw8IDE4KTsKLQl9Ci0JaWYgKGlyLT5wb2xsaW5nKSB7Ci0JCWRlbF90aW1lcigmaXItPnRpbWVyKTsKLQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQl9Ci0KKwljeDg4X2lyX3N0b3AoY29yZSwgaXIpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlyLT5pbnB1dCk7CiAJa2ZyZWUoaXIpOwogCkBAIC00MTksNiArNDQzLDcgQEAKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX05PVkFTUExVU19TMToKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDA6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMzAwOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMDoKIAkJaXJjb2RlID0gaXJfZGVjb2RlX2JpcGhhc2UoaXItPnNhbXBsZXMsIGlyLT5zY291bnQsIDUsIDcpOwogCQlpcl9kcHJpbnRrKCJiaXBoYXNlIGRlY29kZWQ6ICV4XG4iLCBpcmNvZGUpOwogCQlpZiAoKGlyY29kZSAmIDB4ZmZmZmYwMDApICE9IDB4MzAwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwppbmRleCA2YjIzYTRlLi4xZmUxYTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC00NCw4ICs0NCwxMiBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFttcGVnXSIpOwogCiAjZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCWlmIChkZWJ1ZyA+PSBsZXZlbCkgXAotCXByaW50ayhLRVJOX0RFQlVHICIlcy8yOiAiIGZtdCwgZGV2LT5jb3JlLT5uYW1lICwgIyMgYXJnKQorCXByaW50ayhLRVJOX0RFQlVHICIlcy8yLW1wZWc6ICIgZm10LCBkZXYtPmNvcmUtPm5hbWUsICMjIGFyZykKIAorI2RlZmluZSBtcGVnX2RiZyhsZXZlbCxmbXQsIGFyZy4uLikJaWYgKGRlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzLzItbXBlZzogIiBmbXQsIGNvcmUtPm5hbWUsICMjIGFyZykKKworc3RhdGljIExJU1RfSEVBRChjeDg4MDJfZGV2bGlzdCk7CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGludCBjeDg4MDJfc3RhcnRfZG1hKHN0cnVjdCBjeDg4MDJfZGV2ICAgICpkZXYsCkBAIC02NSwxNyArNjksMTMgQEAKIAogCS8qIEZJWE1FOiB0aGlzIG5lZWRzIGEgcmV2aWV3LgogCSAqIGFsc286IG1vdmUgdG8gY3g4OC1ibGFja2JpcmQgKyBjeDg4LWR2YiBzb3VyY2UgZmlsZXM/ICovCi0JaWYgKGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5tcGVnID09IChDWDg4X01QRUdfRFZCIHwgQ1g4OF9NUEVHX0JMQUNLQklSRCkgKSB7Ci0JCS8qIFJlcG9ydCBhIHdhcm5pbmcgdW50aWwgdGhlIG1pbmkgZHJpdmVyIHBhdGNoIGlzIGFwcGxpZWQsCi0JCSAqIGVsc2UgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHdpbGwgc2V0IHRoZSBkbWEgcmVnaXN0ZXJzIGluY29ycmVjdGx5LgotCQkgKiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciBwYXRjaCBhbmQgY2hhbmdlcyB0byB0aGUgY29uZGl0aW9ucwotCQkgKiB3aWxsIGJlIG1hZGUuCi0JCSAqLwotCQlwcmludGsoS0VSTl9JTkZPICIlcygpIGJvYXJkLT4oQ1g4OF9NUEVHX0RWQiB8IENYODhfTVBFR19CTEFDS0JJUkQpIGlzIGludmFsaWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAotCWlmIChjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubXBlZyAmIENYODhfTVBFR19EVkIpIHsKKwlkcHJpbnRrKCAxLCAiY29yZS0+YWN0aXZlX3R5cGVfaWQgPSAweCUwOHhcbiIsIGNvcmUtPmFjdGl2ZV90eXBlX2lkKTsKKworCWlmICggKGNvcmUtPmFjdGl2ZV90eXBlX2lkID09IENYODhfTVBFR19EVkIpICYmCisJCShjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubXBlZyAmIENYODhfTVBFR19EVkIpICkgeworCisJCWRwcmludGsoIDEsICJjeDg4MDJfc3RhcnRfZG1hIGRvaW5nIC5kdmJcbiIpOwogCQkvKiBuZWdlZGdlIGRyaXZlbiAmIHNvZnR3YXJlIHJlc2V0ICovCiAJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgMHgwMDQwIHwgZGV2LT50c19nZW5fY250cmwpOwogCQl1ZGVsYXkoMTAwKTsKQEAgLTkzLDE1ICs5MywxNyBAQAogCQkJY3hfd3JpdGUoTU9fUElOTVVYX0lPLCAweDg4KTsgLyogRW5hYmxlIE1QRUcgcGFyYWxsZWwgSU8gYW5kIHZpZGVvIHNpZ25hbCBwaW5zICovCiAJCQl1ZGVsYXkoMTAwKTsKIAkJCWJyZWFrOworCQljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjEzMDA6CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWN4X3dyaXRlKFRTX1NPUF9TVEFULCAweDAwKTsKIAkJCWJyZWFrOwogCQl9CiAJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgZGV2LT50c19nZW5fY250cmwpOwogCQl1ZGVsYXkoMTAwKTsKLQl9Ci0KLQlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm1wZWcgJiBDWDg4X01QRUdfQkxBQ0tCSVJEKSB7CisJfSBlbHNlIGlmICggKGNvcmUtPmFjdGl2ZV90eXBlX2lkID09IENYODhfTVBFR19CTEFDS0JJUkQpICYmCisJCShjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubXBlZyAmIENYODhfTVBFR19CTEFDS0JJUkQpICkgeworCQlkcHJpbnRrKCAxLCAiY3g4ODAyX3N0YXJ0X2RtYSBkb2luZyAuYmxhY2tiaXJkXG4iKTsKIAkJY3hfd3JpdGUoTU9fUElOTVVYX0lPLCAweDg4KTsgLyogZW5hYmxlIE1QRUcgcGFyYWxsZWwgSU8gKi8KIAogCQljeF93cml0ZShUU19HRU5fQ05UUkwsIDB4NDYpOyAvKiBwdW5jdHVyZWQgY2xvY2sgVFMgJiBwb3NlZGdlIGRyaXZlbiAmIHNvZnR3YXJlIHJlc2V0ICovCkBAIC0xMTIsNiArMTE0LDEwIEBACiAKIAkJY3hfd3JpdGUoVFNfR0VOX0NOVFJMLCAweDA2KTsgLyogcHVuY3R1cmVkIGNsb2NrIFRTICYgcG9zZWRnZSBkcml2ZW4gKi8KIAkJdWRlbGF5KDEwMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCAiJXMoKSBGYWlsZWQuIFVuc3VwcG9ydGVkIHZhbHVlIGluIC5tcGVnICgweCUwOHgpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQljeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubXBlZyApOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiByZXNldCBjb3VudGVyICovCkBAIC01NDIsOCArNTQ4LDMxNSBAQAogCXJldHVybiAwOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RydWN0IGN4ODgwMl9kZXYgKiBjeDg4MDJfZ2V0X2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGN4ODgwMl9kZXYgKmggPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsJmN4ODgwMl9kZXZsaXN0KSB7CisJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDg4MDJfZGV2LCBkZXZsaXN0KTsKKwkJaWYgKGgtPm1wZWdfZGV2LT5taW5vciA9PSBtaW5vcikKKwkJCXJldHVybiBoOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqIGN4ODgwMl9nZXRfZHJpdmVyKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsIGVudW0gY3g4OF9ib2FyZF90eXBlIGJ0eXBlKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpoID0gTlVMTDsKKwlzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZCA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0MjsKKworCWxpc3RfZm9yX2VhY2gobGlzdCwmY3g4ODAyX2Rldmxpc3QpIHsKKwkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGN4ODgwMl9kZXYsIGRldmxpc3QpOworCQlpZiAoaCAhPSBkZXYpCisJCQljb250aW51ZTsKKworCQlsaXN0X2Zvcl9lYWNoKGxpc3QyLCAmaC0+ZHJ2bGlzdC5kZXZsaXN0KSB7CisJCQlkID0gbGlzdF9lbnRyeShsaXN0Miwgc3RydWN0IGN4ODgwMl9kcml2ZXIsIGRldmxpc3QpOworCisJCQkvKiBvbmx5IHVucmVnaXN0ZXIgdGhlIGNvcnJlY3QgZHJpdmVyIHR5cGUgKi8KKwkJCWlmIChkLT50eXBlX2lkID09IGJ0eXBlKSB7CisJCQkJcmV0dXJuIGQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRHJpdmVyIGFza2VkIGZvciBoYXJkd2FyZSBhY2Nlc3MuICovCitpbnQgY3g4ODAyX3JlcXVlc3RfYWNxdWlyZShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkcnYtPmNvcmU7CisKKwkvKiBGYWlsIGEgcmVxdWVzdCBmb3IgaGFyZHdhcmUgaWYgdGhlIGRldmljZSBpcyBidXN5LiAqLworCWlmIChjb3JlLT5hY3RpdmVfdHlwZV9pZCAhPSBDWDg4X0JPQVJEX05PTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoZHJ2LT5hZHZpc2VfYWNxdWlyZSkKKwl7CisJCWNvcmUtPmFjdGl2ZV90eXBlX2lkID0gZHJ2LT50eXBlX2lkOworCQlkcnYtPmFkdmlzZV9hY3F1aXJlKGRydik7CisKKwkJbXBlZ19kYmcoMSwiJXMoKSBQb3N0IGFjcXVpcmUgR1BJTz0leFxuIiwgX19GVU5DVElPTl9fLCBjeF9yZWFkKE1PX0dQMF9JTykpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBEcml2ZXIgYXNrZWQgdG8gcmVsZWFzZSBoYXJkd2FyZS4gKi8KK2ludCBjeDg4MDJfcmVxdWVzdF9yZWxlYXNlKHN0cnVjdCBjeDg4MDJfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRydi0+Y29yZTsKKworCWlmIChkcnYtPmFkdmlzZV9yZWxlYXNlKQorCXsKKwkJZHJ2LT5hZHZpc2VfcmVsZWFzZShkcnYpOworCQljb3JlLT5hY3RpdmVfdHlwZV9pZCA9IENYODhfQk9BUkRfTk9ORTsKKwkJbXBlZ19kYmcoMSwiJXMoKSBQb3N0IHJlbGVhc2UgR1BJTz0leFxuIiwgX19GVU5DVElPTl9fLCBjeF9yZWFkKE1PX0dQMF9JTykpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4ODgwMl9jaGVja19kcml2ZXIoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydikKK3sKKwlpZiAoZHJ2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChkcnYtPnR5cGVfaWQgIT0gQ1g4OF9NUEVHX0RWQikgJiYKKwkJKGRydi0+dHlwZV9pZCAhPSBDWDg4X01QRUdfQkxBQ0tCSVJEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGRydi0+aHdfYWNjZXNzICE9IENYODgwMl9EUlZDVExfU0hBUkVEKSAmJgorCQkoZHJ2LT5od19hY2Nlc3MgIT0gQ1g4ODAyX0RSVkNUTF9FWENMVVNJVkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoZHJ2LT5wcm9iZSA9PSBOVUxMKSB8fAorCQkoZHJ2LT5yZW1vdmUgPT0gTlVMTCkgfHwKKwkJKGRydi0+YWR2aXNlX2FjcXVpcmUgPT0gTlVMTCkgfHwKKwkJKGRydi0+YWR2aXNlX3JlbGVhc2UgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDg4MDJfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBjeDg4MDJfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGN4ODgwMl9kZXYgKmg7CisJc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWludCBlcnIgPSAwLCBpID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzKCkgLT5yZWdpc3RlcmluZyBkcml2ZXIgdHlwZT0lcyBhY2Nlc3M9JXNcbiIsIF9fRlVOQ1RJT05fXyAsCisJCWRydi0+dHlwZV9pZCA9PSBDWDg4X01QRUdfRFZCID8gImR2YiIgOiAiYmxhY2tiaXJkIiwKKwkJZHJ2LT5od19hY2Nlc3MgPT0gQ1g4ODAyX0RSVkNUTF9TSEFSRUQgPyAic2hhcmVkIiA6ICJleGNsdXNpdmUiKTsKKworCWlmICgoZXJyID0gY3g4ODAyX2NoZWNrX2RyaXZlcihkcnYpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzKCkgY3g4ODAyX2RyaXZlciBpcyBpbnZhbGlkXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsJmN4ODgwMl9kZXZsaXN0KSB7CisJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDg4MDJfZGV2LCBkZXZsaXN0KTsKKworCQlwcmludGsoS0VSTl9JTkZPICJDT1JFICVzOiBzdWJzeXN0ZW06ICUwNHg6JTA0eCwgYm9hcmQ6ICVzIFtjYXJkPSVkXVxuIiwKKwkJCWgtPmNvcmUtPm5hbWUsaC0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yLAorCQkJaC0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlLGN4ODhfYm9hcmRzW2gtPmNvcmUtPmJvYXJkXS5uYW1lLAorCQkJaC0+Y29yZS0+Ym9hcmQpOworCisJCS8qIEJyaW5nIHVwIGEgbmV3IHN0cnVjdCBmb3IgZWFjaCBkcml2ZXIgaW5zdGFuY2UgKi8KKwkJZHJpdmVyID0ga3phbGxvYyhzaXplb2YoKmRydiksR0ZQX0tFUk5FTCk7CisJCWlmIChkcml2ZXIgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIFNuYXBzaG90IG9mIHRoZSBkcml2ZXIgcmVnaXN0cmF0aW9uIGRhdGEgKi8KKwkJZHJ2LT5jb3JlID0gaC0+Y29yZTsKKwkJZHJ2LT5zdXNwZW5kID0gY3g4ODAyX3N1c3BlbmRfY29tbW9uOworCQlkcnYtPnJlc3VtZSA9IGN4ODgwMl9yZXN1bWVfY29tbW9uOworCQlkcnYtPnJlcXVlc3RfYWNxdWlyZSA9IGN4ODgwMl9yZXF1ZXN0X2FjcXVpcmU7CisJCWRydi0+cmVxdWVzdF9yZWxlYXNlID0gY3g4ODAyX3JlcXVlc3RfcmVsZWFzZTsKKwkJbWVtY3B5KGRyaXZlciwgZHJ2LCBzaXplb2YoKmRyaXZlcikpOworCisJCWVyciA9IGRydi0+cHJvYmUoZHJpdmVyKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQlpKys7CisJCQltdXRleF9sb2NrKCZkcnYtPmNvcmUtPmxvY2spOworCQkJbGlzdF9hZGRfdGFpbCgmZHJpdmVyLT5kZXZsaXN0LCZoLT5kcnZsaXN0LmRldmxpc3QpOworCQkJbXV0ZXhfdW5sb2NrKCZkcnYtPmNvcmUtPmxvY2spOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIC0+cHJvYmUgZmFpbGVkIGVyciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisJCX0KKworCX0KKwlpZiAoaSA9PSAwKQorCQllcnIgPSAtRU5PREVWOworCWVsc2UKKwkJZXJyID0gMDsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBjeDg4MDJfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqaDsKKwlzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QyLCAqcTsKKwlpbnQgZXJyID0gMCwgaSA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlcygpIC0+dW5yZWdpc3RlcmluZyBkcml2ZXIgdHlwZT0lc1xuIiwgX19GVU5DVElPTl9fICwKKwkJZHJ2LT50eXBlX2lkID09IENYODhfTVBFR19EVkIgPyAiZHZiIiA6ICJibGFja2JpcmQiKTsKKworCWxpc3RfZm9yX2VhY2gobGlzdCwmY3g4ODAyX2Rldmxpc3QpIHsKKwkJaSsrOworCQloID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY3g4ODAyX2RldiwgZGV2bGlzdCk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ09SRSAlczogc3Vic3lzdGVtOiAlMDR4OiUwNHgsIGJvYXJkOiAlcyBbY2FyZD0lZF1cbiIsCisJCQloLT5jb3JlLT5uYW1lLGgtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKKwkJCWgtPnBjaS0+c3Vic3lzdGVtX2RldmljZSxjeDg4X2JvYXJkc1toLT5jb3JlLT5ib2FyZF0ubmFtZSwKKwkJCWgtPmNvcmUtPmJvYXJkKTsKKworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdDIsIHEsICZoLT5kcnZsaXN0LmRldmxpc3QpIHsKKwkJCWQgPSBsaXN0X2VudHJ5KGxpc3QyLCBzdHJ1Y3QgY3g4ODAyX2RyaXZlciwgZGV2bGlzdCk7CisKKwkJCS8qIG9ubHkgdW5yZWdpc3RlciB0aGUgY29ycmVjdCBkcml2ZXIgdHlwZSAqLworCQkJaWYgKGQtPnR5cGVfaWQgIT0gZHJ2LT50eXBlX2lkKQorCQkJCWNvbnRpbnVlOworCisJCQllcnIgPSBkLT5yZW1vdmUoZCk7CisJCQlpZiAoZXJyID09IDApIHsKKwkJCQltdXRleF9sb2NrKCZkcnYtPmNvcmUtPmxvY2spOworCQkJCWxpc3RfZGVsKGxpc3QyKTsKKwkJCQltdXRleF91bmxvY2soJmRydi0+Y29yZS0+bG9jayk7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgLT5yZW1vdmUgZmFpbGVkIGVyciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycik7CisKKwkJfQorCisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGN4ODgwMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY7CisJc3RydWN0IGN4ODhfY29yZSAgKmNvcmU7CisJaW50IGVycjsKKworCS8qIGdlbmVyYWwgc2V0dXAgKi8KKwljb3JlID0gY3g4OF9jb3JlX2dldChwY2lfZGV2KTsKKwlpZiAoTlVMTCA9PSBjb3JlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaW50aygiJXMvMjogY3gyMzg4eCA4ODAyIERyaXZlciBNYW5hZ2VyXG4iLCBjb3JlLT5uYW1lKTsKKworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ubXBlZykKKwkJZ290byBmYWlsX2NvcmU7CisKKwllcnIgPSAtRU5PTUVNOworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGRldikKKwkJZ290byBmYWlsX2NvcmU7CisJZGV2LT5wY2kgPSBwY2lfZGV2OworCWRldi0+Y29yZSA9IGNvcmU7CisKKwllcnIgPSBjeDg4MDJfaW5pdF9jb21tb24oZGV2KTsKKwlpZiAoZXJyICE9IDApCisJCWdvdG8gZmFpbF9mcmVlOworCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZHJ2bGlzdC5kZXZsaXN0KTsKKwlsaXN0X2FkZF90YWlsKCZkZXYtPmRldmxpc3QsJmN4ODgwMl9kZXZsaXN0KTsKKworCS8qIE1haW50YWluIGEgcmVmZXJlbmNlIHNvIGN4ODgtdmlkZW8gY2FuIHF1ZXJ5IHRoZSA4ODAyIGRldmljZS4gKi8KKwljb3JlLT5kdmJkZXYgPSBkZXY7CisJcmV0dXJuIDA7CisKKyBmYWlsX2ZyZWU6CisJa2ZyZWUoZGV2KTsKKyBmYWlsX2NvcmU6CisJY3g4OF9jb3JlX3B1dChjb3JlLHBjaV9kZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjeDg4MDJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY7CisJc3RydWN0IGN4ODgwMl9kcml2ZXIgKmg7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKworCWRwcmludGsoIDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWxpc3RfZm9yX2VhY2gobGlzdCwmZGV2LT5kcnZsaXN0LmRldmxpc3QpIHsKKwkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGN4ODgwMl9kcml2ZXIsIGRldmxpc3QpOworCQlkcHJpbnRrKCAxLCAiIC0+ZHJpdmVyXG4iKTsKKwkJaWYgKGgtPnJlbW92ZSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzIC4uIHNraXBwaW5nIGRyaXZlciwgbm8gcHJvYmUgZnVuY3Rpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICIlcyAuLiBSZW1vdmluZyBkcml2ZXIgdHlwZSAlZFxuIiwgX19GVU5DVElPTl9fLCBoLT50eXBlX2lkKTsKKwkJY3g4ODAyX3VucmVnaXN0ZXJfZHJpdmVyKGgpOworCQlsaXN0X2RlbCgmZGV2LT5kcnZsaXN0LmRldmxpc3QpOworCX0KKworCS8qIERlc3Ryb3kgYW55IDg4MDIgcmVmZXJlbmNlLiAqLworCWRldi0+Y29yZS0+ZHZiZGV2ID0gTlVMTDsKKworCS8qIGNvbW1vbiAqLworCWN4ODgwMl9maW5pX2NvbW1vbihkZXYpOworCWN4ODhfY29yZV9wdXQoZGV2LT5jb3JlLGRldi0+cGNpKTsKKwlrZnJlZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3g4ODAyX3BjaV90YmxbXSA9IHsKKwl7CisJCS52ZW5kb3IgICAgICAgPSAweDE0ZjEsCisJCS5kZXZpY2UgICAgICAgPSAweDg4MDIsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwl9LHsKKwkJLyogLS0tIGVuZCBvZiBsaXN0IC0tLSAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3g4ODAyX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3g4ODAyX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgICAgID0gImN4ODgtbXBlZyBkcml2ZXIgbWFuYWdlciIsCisJLmlkX3RhYmxlID0gY3g4ODAyX3BjaV90YmwsCisJLnByb2JlICAgID0gY3g4ODAyX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGN4ODgwMl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBjeDg4MDJfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHggY3g4OC1tcGVnIERyaXZlciBNYW5hZ2VyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAorCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKKwkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+ICA4KSAmIDB4ZmYsCisJICAgICAgIENYODhfVkVSU0lPTl9DT0RFICYgMHhmZik7CisjaWZkZWYgU05BUFNIT1QKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAorCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOworI2VuZGlmCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN4ODgwMl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgY3g4ODAyX2Zpbmkodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmN4ODgwMl9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3g4ODAyX2luaXQpOworbW9kdWxlX2V4aXQoY3g4ODAyX2ZpbmkpOwogRVhQT1JUX1NZTUJPTChjeDg4MDJfYnVmX3ByZXBhcmUpOwogRVhQT1JUX1NZTUJPTChjeDg4MDJfYnVmX3F1ZXVlKTsKIEVYUE9SVF9TWU1CT0woY3g4ODAyX2NhbmNlbF9idWZmZXJzKTsKQEAgLTU1MSw5ICs4NjQsMTAgQEAKIEVYUE9SVF9TWU1CT0woY3g4ODAyX2luaXRfY29tbW9uKTsKIEVYUE9SVF9TWU1CT0woY3g4ODAyX2ZpbmlfY29tbW9uKTsKIAotRVhQT1JUX1NZTUJPTChjeDg4MDJfc3VzcGVuZF9jb21tb24pOwotRVhQT1JUX1NZTUJPTChjeDg4MDJfcmVzdW1lX2NvbW1vbik7Ci0KK0VYUE9SVF9TWU1CT0woY3g4ODAyX3JlZ2lzdGVyX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKGN4ODgwMl91bnJlZ2lzdGVyX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKGN4ODgwMl9nZXRfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0woY3g4ODAyX2dldF9kcml2ZXIpOwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKaW5kZXggNThiYTlmNy4uMzQ4MmUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpAQCAtMTQzLDE5ICsxNDMsNiBAQAogCWN4ODhfc3RhcnRfYXVkaW9fZG1hKGNvcmUpOwogCiAJaWYgKGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5tcGVnICYgQ1g4OF9NUEVHX0JMQUNLQklSRCkgewotCQkvKiBzZXRzIHNvdW5kIGlucHV0IGZyb20gZXh0ZXJuYWwgYWRjICovCi0JCXN3aXRjaCAoY29yZS0+Ym9hcmQpIHsKLQkJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU46Ci0JCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfTUNFMjAwX0RFTFVYRToKLQkJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9IQVJEV0FSRV9NUEVHX1RWX1hQRVJUOgotCQljYXNlIENYODhfQk9BUkRfUElYRUxWSUVXX1BMQVlUVl9QNzAwMDoKLQkJY2FzZSBDWDg4X0JPQVJEX0FTVVNfUFZSXzQxNjoKLQkJCWN4X2NsZWFyKEFVRF9DVEwsIEVOX0kyU0lOX0VOQUJMRSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWN4X3NldChBVURfQ1RMLCBFTl9JMlNJTl9FTkFCTEUpOwotCQl9Ci0KIAkJY3hfd3JpdGUoQVVEX0kyU0lOUFVUQ05UTCwgNCk7CiAJCWN4X3dyaXRlKEFVRF9CQVVEUkFURSwgMSk7CiAJCS8qICdwYXNzLXRocnUgbW9kZSc6IHRoaXMgZW5hYmxlcyB0aGUgaTJzIG91dHB1dCB0byB0aGUgbXBlZyBlbmNvZGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCA5MGUyOThkLi44NjEzMzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTQ1NCw2ICs0NTQsMTQgQEAKIAkJY3hfY2xlYXIoTU9fRklMVEVSX09ERCwgICAweDAwMDAyMDIwKTsKIAkJYnJlYWs7CiAJfQorCisJaWYgKGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5tcGVnICYgQ1g4OF9NUEVHX0JMQUNLQklSRCkgeworCQkvKiBzZXRzIHNvdW5kIGlucHV0IGZyb20gZXh0ZXJuYWwgYWRjICovCisJCWlmIChJTlBVVChpbnB1dCktPmV4dGFkYykKKwkJCWN4X3NldChBVURfQ1RMLCBFTl9JMlNJTl9FTkFCTEUpOworCQllbHNlCisJCQljeF9jbGVhcihBVURfQ1RMLCBFTl9JMlNJTl9FTkFCTEUpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ5MCw2ICsxNDk4LDMwIEBACiAJCW11dGV4X3VubG9jaygmY29yZS0+bG9jayk7CiAJCXJldHVybiAwOwogCX0KKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLyogaW9jdGxzIHRvIGFsbG93IGRpcmVjdCBhY2NlcyB0byB0aGUgY3gyMzg4eCByZWdpc3RlcnMgKi8KKwljYXNlIFZJRElPQ19JTlRfR19SRUdJU1RFUjoKKwl7CisJCXN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcgPSBhcmc7CisKKwkJaWYgKHJlZy0+aTJjX2lkICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogY3gyMzg4eCBoYXMgYSAyNC1iaXQgcmVnaXN0ZXIgc3BhY2UgKi8KKwkJcmVnLT52YWwgPSBjeF9yZWFkKHJlZy0+cmVnJjB4ZmZmZmZmKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX0lOVF9TX1JFR0lTVEVSOgorCXsKKwkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZyA9IGFyZzsKKworCQlpZiAocmVnLT5pMmNfaWQgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQljeF93cml0ZShyZWctPnJlZyYweGZmZmZmZiwgcmVnLT52YWwpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKIAogCWRlZmF1bHQ6CiAJCXJldHVybiB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmMKaW5kZXggMmI0ZjE5Ny4uNjA2OGM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdnAzMDU0LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZwMzA1NC1pMmMuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJICAgIGRldi0+Y29yZS0+Ym9hcmQgIT0gQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1RfUFJPKQogCQlyZXR1cm47CiAKLQlpMmNfYml0X2RlbF9idXMoJnZwMzA1NF9pMmMtPmFkYXApOworCWkyY19kZWxfYWRhcHRlcigmdnAzMDU0X2kyYy0+YWRhcCk7CiAJa2ZyZWUodnAzMDU0X2kyYyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IDNiYzkxYWEuLjcwNTRlOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtNzQsNiArNzQsMTEgQEAKIAlDWDg4X01QRUdfQkxBQ0tCSVJECiB9OwogCitlbnVtIGN4ODgwMl9ib2FyZF9hY2Nlc3MgeworCUNYODgwMl9EUlZDVExfU0hBUkVEICAgID0gMSwKKwlDWDg4MDJfRFJWQ1RMX0VYQ0xVU0lWRSA9IDIsCit9OworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogdHYgbm9ybXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApAQCAtMjIwLDYgKzIyNSw3IEBACiAJZW51bSBjeDg4X2l0eXBlIHR5cGU7CiAJdW5zaWduZWQgaW50ICAgIHZtdXg7CiAJdTMyICAgICAgICAgICAgIGdwaW8wLCBncGlvMSwgZ3BpbzIsIGdwaW8zOworCXVuc2lnbmVkIGludCAgICBleHRhZGM6MTsKIH07CiAKIHN0cnVjdCBjeDg4X2JvYXJkIHsKQEAgLTMzMCw2ICszMzYsNyBAQAogCiAJLyogY3g4OC12aWRlbyBuZWVkcyB0byBhY2Nlc3MgY3g4ODAyIGZvciBoeWJyaWQgdHVuZXIgcGxsIGFjY2Vzcy4gKi8KIAlzdHJ1Y3QgY3g4ODAyX2RldiAgICAgICAgICAqZHZiZGV2OworCWVudW0gY3g4OF9ib2FyZF90eXBlICAgICAgIGFjdGl2ZV90eXBlX2lkOwogfTsKIAogc3RydWN0IGN4ODgwMF9kZXY7CkBAIC00MDUsNiArNDEyLDMxIEBACiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ7CiB9OwogCitzdHJ1Y3QgY3g4ODAyX2RyaXZlciB7CisJc3RydWN0IGN4ODhfY29yZSAqY29yZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldmxpc3Q7CisKKwkvKiBUeXBlIG9mIGRyaXZlciBhbmQgYWNjZXNzIHJlcXVpcmVkICovCisJZW51bSBjeDg4X2JvYXJkX3R5cGUgdHlwZV9pZDsKKwllbnVtIGN4ODgwMl9ib2FyZF9hY2Nlc3MgaHdfYWNjZXNzOworCisJLyogTVBFRyA4ODAyIGludGVybmFsIG9ubHkgKi8KKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKKworCS8qIE1QRUcgODgwMiAtPiBtaW5pIGRyaXZlciAtIERyaXZlciBwcm9iZSBhbmQgY29uZmlndXJhdGlvbiAqLworCWludCAoKnByb2JlKShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KTsKKwlpbnQgKCpyZW1vdmUpKHN0cnVjdCBjeDg4MDJfZHJpdmVyICpkcnYpOworCisJLyogTVBFRyA4ODAyIC0+IG1pbmkgZHJpdmVyIC0gQWNjZXNzIGZvciBoYXJkd2FyZSBjb250cm9sICovCisJaW50ICgqYWR2aXNlX2FjcXVpcmUpKHN0cnVjdCBjeDg4MDJfZHJpdmVyICpkcnYpOworCWludCAoKmFkdmlzZV9yZWxlYXNlKShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KTsKKworCS8qIE1QRUcgODgwMiA8LSBtaW5pIGRyaXZlciAtIEFjY2VzcyBmb3IgaGFyZHdhcmUgY29udHJvbCAqLworCWludCAoKnJlcXVlc3RfYWNxdWlyZSkoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydik7CisJaW50ICgqcmVxdWVzdF9yZWxlYXNlKShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KTsKK307CisKIHN0cnVjdCBjeDg4MDJfZGV2IHsKIAlzdHJ1Y3QgY3g4OF9jb3JlICAgICAgICAgICAqY29yZTsKIAlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKQEAgLTQzOSw2ICs0NzEsOSBAQAogCiAJLyogbXBlZyBwYXJhbXMgKi8KIAlzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyBwYXJhbXM7CisKKwkvKiBMaXN0IG9mIGF0dGFjaGVkIGRyaXZlcnMgKi8KKwlzdHJ1Y3QgY3g4ODAyX2RyaXZlciAgICAgICBkcnZsaXN0OwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTU3MSw2ICs2MDYsMTEgQEAKIHZvaWQgY3g4OF9zZXRfc3RlcmVvKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIHUzMiBtb2RlLCBpbnQgbWFudWFsKTsKIGludCBjeDg4X2F1ZGlvX3RocmVhZCh2b2lkICpkYXRhKTsKIAoraW50IGN4ODgwMl9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydik7CitpbnQgY3g4ODAyX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBjeDg4MDJfZHJpdmVyICpkcnYpOworc3RydWN0IGN4ODgwMl9kZXYgKiBjeDg4MDJfZ2V0X2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3N0cnVjdCBjeDg4MDJfZHJpdmVyICogY3g4ODAyX2dldF9kcml2ZXIoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgZW51bSBjeDg4X2JvYXJkX3R5cGUgYnR5cGUpOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogY3g4OC1pbnB1dC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApAQCAtNjAwLDYgKzY0MCwxMyBAQAogZXh0ZXJuIGNvbnN0IHUzMiBjeDg4X3VzZXJfY3RybHNbXTsKIGV4dGVybiBpbnQgY3g4ODAwX2N0cmxfcXVlcnkoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCk7CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjeDg4LWJsYWNrYmlyZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogdXNlZCBieSBjeDg4LWl2dHYgaW9jdGwgZW11bGF0aW9uIGxheWVyICAgICAgICAgICAgICAgICAgICAgKi8KK2V4dGVybiBpbnQgKCpjeDg4X2lvY3RsX2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgKCpjeDg4X2lvY3RsX3RyYW5zbGF0b3IpKHVuc2lnbmVkIGludCBjbWQpOworCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogYy1iYXNpYy1vZmZzZXQ6IDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGFidXNiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhYnVzYi5jCmluZGV4IGIxMDEyZTkuLjkxNzAyMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGFidXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYWJ1c2IuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCSBwaXBlc2l6ZSwgcGFja2V0cywgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CiAKIAl3aGlsZSAoYnVmZmVycyA8IChzLT50b3RhbF9idWZmZXJfc2l6ZSA8PCAxMCkpIHsKLQkJYiA9IChwYnVmZl90KSBremFsbG9jIChzaXplb2YgKGJ1ZmZfdCksIEdGUF9LRVJORUwpOworCQliID0ga3phbGxvYyhzaXplb2YgKGJ1ZmZfdCksIEdGUF9LRVJORUwpOwogCQlpZiAoIWIpIHsKIAkJCWVycigia3phbGxvYyhzaXplb2YoYnVmZl90KSk9PU5VTEwiKTsKIAkJCWdvdG8gZXJyOwpAQCAtNjU5LDcgKzY1OSw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAogCWNhc2UgSU9DVExfREFCX0JVTEs6Ci0JCXBidWxrID0gKHBidWxrX3RyYW5zZmVyX3QpIGttYWxsb2MgKHNpemVvZiAoYnVsa190cmFuc2Zlcl90KSwgR0ZQX0tFUk5FTCk7CisJCXBidWxrID0ga21hbGxvYyhzaXplb2YgKGJ1bGtfdHJhbnNmZXJfdCksIEdGUF9LRVJORUwpOwogCiAJCWlmICghcGJ1bGspIHsKIAkJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCmluZGV4IGJjNTQ0Y2MuLjg2ZTM1M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCkBAIC05NzMsMTYgKzk3MywzMiBAQAogCQkJIGV0NjF4MjUxX3Nob3dfaTJjX3ZhbCwgZXQ2MXgyNTFfc3RvcmVfaTJjX3ZhbCk7CiAKIAotc3RhdGljIHZvaWQgZXQ2MXgyNTFfY3JlYXRlX3N5c2ZzKHN0cnVjdCBldDYxeDI1MV9kZXZpY2UqIGNhbSkKK3N0YXRpYyBpbnQgZXQ2MXgyNTFfY3JlYXRlX3N5c2ZzKHN0cnVjdCBldDYxeDI1MV9kZXZpY2UqIGNhbSkKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2NGxkZXYgPSBjYW0tPnY0bGRldjsKKwlpbnQgcmM7CiAKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmFsKTsKKwlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWcpOworCWlmIChyYykgZ290byBlcnI7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmFsKTsKKwlpZiAocmMpIGdvdG8gZXJyX3JlZzsKIAlpZiAoY2FtLT5zZW5zb3Iuc3lzZnNfb3BzKSB7Ci0JCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfcmVnKTsKLQkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2kyY192YWwpOworCQlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfcmVnKTsKKwkJaWYgKHJjKSBnb3RvIGVycl92YWw7CisJCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2kyY192YWwpOworCQlpZiAocmMpIGdvdG8gZXJyX2kyY19yZWc7CiAJfQorCisJcmV0dXJuIDA7CisKK2Vycl9pMmNfcmVnOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfcmVnKTsKK2Vycl92YWw6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZhbCk7CitlcnJfcmVnOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWcpOworZXJyOgorCXJldHVybiByYzsKIH0KICNlbmRpZiAvKiBDT05GSUdfVklERU9fQURWX0RFQlVHICovCiAKQEAgLTExNjYsOCArMTE4Miw2IEBACiAJdmlkZW9fc2V0X2RydmRhdGEoY2FtLT52NGxkZXYsIE5VTEwpOwogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2KTsKIAotCXVzYl9wdXRfZGV2KGNhbS0+dXNiZGV2KTsKLQogCW11dGV4X3VubG9jaygmZXQ2MXgyNTFfc3lzZnNfbG9jayk7CiAKIAlrZnJlZShjYW0tPmNvbnRyb2xfYnVmZmVyKTsKQEAgLTEyNTksNiArMTI3Myw3IEBACiAKIAlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKIAkJZXQ2MXgyNTFfcmVsZWFzZV9yZXNvdXJjZXMoY2FtKTsKKwkJdXNiX3B1dF9kZXYoY2FtLT51c2JkZXYpOwogCQltdXRleF91bmxvY2soJmNhbS0+ZGV2X211dGV4KTsKIAkJa2ZyZWUoY2FtKTsKIAkJcmV0dXJuIDA7CkBAIC0yNTM0LDcgKzI1NDksOSBAQAogCWRldl9uciA9IChkZXZfbnIgPCBFVDYxWDI1MV9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKIAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQlldDYxeDI1MV9jcmVhdGVfc3lzZnMoY2FtKTsKKwllcnIgPSBldDYxeDI1MV9jcmVhdGVfc3lzZnMoY2FtKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwyOwogCURCRygyLCAiT3B0aW9uYWwgZGV2aWNlIGNvbnRyb2wgdGhyb3VnaCAnc3lzZnMnIGludGVyZmFjZSByZWFkeSIpOwogI2VuZGlmCiAKQEAgLTI1NDQsNiArMjU2MSwxMyBAQAogCiAJcmV0dXJuIDA7CiAKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitmYWlsMjoKKwl2aWRlb19ucltkZXZfbnJdID0gLTE7CisJZGV2X25yID0gKGRldl9uciA8IEVUNjFYMjUxX01BWF9ERVZJQ0VTLTEpID8gZGV2X25yKzEgOiAwOworCW11dGV4X3VubG9jaygmY2FtLT5kZXZfbXV0ZXgpOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2KTsKKyNlbmRpZgogZmFpbDoKIAlpZiAoY2FtKSB7CiAJCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwppbmRleCAxNDU3YjE2Li41OWVkZjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwpAQCAtMjY4LDkgKzI2OCw5IEBACiAJc2NoZWR1bGVfd29yaygmaXItPndvcmspOwogfQogCi1zdGF0aWMgdm9pZCBpcl93b3JrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgSVJfaTJjICppciA9IGRhdGE7CisJc3RydWN0IElSX2kyYyAqaXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IElSX2kyYywgd29yayk7CiAJaXJfa2V5X3BvbGwoaXIpOwogCW1vZF90aW1lcigmaXItPnRpbWVyLCBqaWZmaWVzK0haLzEwKTsKIH0KQEAgLTMwNSwxNSArMzA1LDE0IEBACiAJaW50IGlyX3R5cGU7CiAJc3RydWN0IElSX2kyYyAqaXI7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnI7CiAKIAlpciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBJUl9pMmMpLEdGUF9LRVJORUwpOwogCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghaXIgfHwgIWlucHV0X2RldikgewotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCQlrZnJlZShpcik7Ci0JCXJldHVybiAtRU5PTUVNOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZTsKIAl9Ci0JbWVtc2V0KGlyLDAsc2l6ZW9mKCppcikpOwogCiAJaXItPmMgPSBjbGllbnRfdGVtcGxhdGU7CiAJaXItPmlucHV0ID0gaW5wdXRfZGV2OwpAQCAtMzU1LDMyICszNTQsMzQgQEAKIAkJYnJlYWs7CiAJY2FzZSAweDdhOgogCWNhc2UgMHg0NzoKKwljYXNlIDB4NzE6CiAJCS8qIEhhbmRsZWQgYnkgc2FhNzEzNC1pbnB1dCAqLwogCQluYW1lICAgICAgICA9ICJTQUE3MTN4IHJlbW90ZSI7CiAJCWlyX3R5cGUgICAgID0gSVJfVFlQRV9PVEhFUjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwotCQlwcmludGsoREVWTkFNRSAiOiBIdWg/IHVua25vd24gaTJjIGFkZHJlc3MgKDB4JTAyeCk/XG4iLGFkZHIpOwotCQlrZnJlZShpcik7Ci0JCXJldHVybiAtMTsKKwkJcHJpbnRrKERFVk5BTUUgIjogSHVoPyB1bmtub3duIGkyYyBhZGRyZXNzICgweCUwMngpP1xuIiwgYWRkcik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlOwogCX0KIAogCS8qIFNldHMgbmFtZSAqLwogCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgImkyYyBJUiAoJXMpIiwgbmFtZSk7Ci0JaXItPmlyX2NvZGVzPWlyX2NvZGVzOworCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzOwogCiAJLyogcmVnaXN0ZXIgaTJjIGRldmljZQogCSAqIEF0IGRldmljZSByZWdpc3RlciwgSVIgY29kZXMgbWF5IGJlIGNoYW5nZWQgdG8gYmUKIAkgKiBib2FyZCBkZXBlbmRlbnQuCiAJICovCi0JaTJjX2F0dGFjaF9jbGllbnQoJmlyLT5jKTsKKwllcnIgPSBpMmNfYXR0YWNoX2NsaWVudCgmaXItPmMpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlOwogCiAJLyogSWYgSVIgbm90IHN1cHBvcnRlZCBvciBkaXNhYmxlZCwgdW5yZWdpc3RlcnMgZHJpdmVyICovCiAJaWYgKGlyLT5nZXRfa2V5ID09IE5VTEwpIHsKLQkJaTJjX2RldGFjaF9jbGllbnQoJmlyLT5jKTsKLQkJa2ZyZWUoaXIpOwotCQlyZXR1cm4gLTE7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kZXRhY2g7CiAJfQogCiAJLyogUGh5cyBhZGRyIGNhbiBvbmx5IGJlIHNldCBhZnRlciBhdHRhY2hpbmcgKGZvciBpci0+Yy5kZXYuYnVzX2lkKSAqLwpAQCAtMzg5LDI0ICszOTAsMzMgQEAKIAkJIGlyLT5jLmRldi5idXNfaWQpOwogCiAJLyogaW5pdCArIHJlZ2lzdGVyIGlucHV0IGRldmljZSAqLwotCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCZpci0+aXIsaXJfdHlwZSxpci0+aXJfY29kZXMpOworCWlyX2lucHV0X2luaXQoaW5wdXRfZGV2LCAmaXItPmlyLCBpcl90eXBlLCBpci0+aXJfY29kZXMpOwogCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CiAJaW5wdXRfZGV2LT5uYW1lICAgICAgID0gaXItPmMubmFtZTsKIAlpbnB1dF9kZXYtPnBoeXMgICAgICAgPSBpci0+cGh5czsKIAotCS8qIHJlZ2lzdGVyIGV2ZW50IGRldmljZSAqLwotCWlucHV0X3JlZ2lzdGVyX2RldmljZShpci0+aW5wdXQpOworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpci0+aW5wdXQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9kZXRhY2g7CisKIAlwcmludGsoREVWTkFNRSAiOiAlcyBkZXRlY3RlZCBhdCAlcyBbJXNdXG4iLAotCSAgICAgICBpci0+aW5wdXQtPm5hbWUsaXItPmlucHV0LT5waHlzLGFkYXAtPm5hbWUpOworCSAgICAgICBpci0+aW5wdXQtPm5hbWUsIGlyLT5pbnB1dC0+cGh5cywgYWRhcC0+bmFtZSk7CiAKIAkvKiBzdGFydCBwb2xsaW5nIHZpYSBldmVudGQgKi8KLQlJTklUX1dPUksoJmlyLT53b3JrLCBpcl93b3JrLCBpcik7CisJSU5JVF9XT1JLKCZpci0+d29yaywgaXJfd29yayk7CiAJaW5pdF90aW1lcigmaXItPnRpbWVyKTsKIAlpci0+dGltZXIuZnVuY3Rpb24gPSBpcl90aW1lcjsKIAlpci0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylpcjsKIAlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7CiAKIAlyZXR1cm4gMDsKKworIGVycl9vdXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KCZpci0+Yyk7CisgZXJyX291dF9mcmVlOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoaXIpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgaXJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC00MTQsNyArNDI0LDcgQEAKIAlzdHJ1Y3QgSVJfaTJjICppciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJLyoga2lsbCBvdXRzdGFuZGluZyBwb2xscyAqLwotCWRlbF90aW1lcigmaXItPnRpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmaXItPnRpbWVyKTsKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCiAJLyogdW5yZWdpc3RlciBkZXZpY2VzICovCkBAIC00MzksNyArNDQ5LDcgQEAKIAkqLwogCiAJc3RhdGljIGNvbnN0IGludCBwcm9iZV9idHR2W10gPSB7IDB4MWEsIDB4MTgsIDB4NGIsIDB4NjQsIDB4MzAsIC0xfTsKLQlzdGF0aWMgY29uc3QgaW50IHByb2JlX3NhYTcxMzRbXSA9IHsgMHg3YSwgMHg0NywgLTEgfTsKKwlzdGF0aWMgY29uc3QgaW50IHByb2JlX3NhYTcxMzRbXSA9IHsgMHg3YSwgMHg0NywgMHg3MSwgLTEgfTsKIAlzdGF0aWMgY29uc3QgaW50IHByb2JlX2VtMjhYWFtdID0geyAweDMwLCAweDQ3LCAtMSB9OwogCWNvbnN0IGludCAqcHJvYmUgPSBOVUxMOwogCXN0cnVjdCBpMmNfY2xpZW50IGM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKaW5kZXggY2Y0M2RmMy4uZTFiNTZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwpAQCAtNTYsNyArNTYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3R2YXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9tc3AzNDAwLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSAibXNwMzQwMC1kcml2ZXIuaCIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKaW5kZXggYjBhZWE0MC4uMTUyY2M2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCkBAIC0xNjAsMTAgKzE2MCw2IEBACiAJCXByaW50aygibXhiOiBzYWE3MTExIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JaWYgKChyZXN1bHQgPSByZXF1ZXN0X21vZHVsZSgidHVuZXIiKSkgPCAwKSB7Ci0JCXByaW50aygibXhiOiB0dW5lciBpMmMgbW9kdWxlIG5vdCBhdmFpbGFibGUuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCWlmICgocmVzdWx0ID0gcmVxdWVzdF9tb2R1bGUoInRlYTY0MjAiKSkgPCAwKSB7CiAJCXByaW50aygibXhiOiB0ZWE2NDIwIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE3Niw2ICsxNzIsMTAgQEAKIAkJcHJpbnRrKCJteGI6IHRkYTk4NDAgaTJjIG1vZHVsZSBub3QgYXZhaWxhYmxlLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwlpZiAoKHJlc3VsdCA9IHJlcXVlc3RfbW9kdWxlKCJ0dW5lciIpKSA8IDApIHsKKwkJcHJpbnRrKCJteGI6IHR1bmVyIGkyYyBtb2R1bGUgbm90IGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlteGIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXhiKSwgR0ZQX0tFUk5FTCk7CiAJaWYoIE5VTEwgPT0gbXhiICkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jCmluZGV4IGNlNDg4NmYuLmI0ZGIyY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMKQEAgLTU2NDgsMTcgKzU2NDgsNDkgQEAKIH0KIHN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihleHBvc3VyZSwgU19JUlVHTywgc2hvd19leHBvc3VyZSwgTlVMTCk7CiAKLXN0YXRpYyB2b2lkIG92X2NyZWF0ZV9zeXNmcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQorc3RhdGljIGludCBvdl9jcmVhdGVfc3lzZnMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKIHsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2N1c3RvbV9pZCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlkZ2UpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc2Vuc29yKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc2F0dXJhdGlvbik7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jb250cmFzdCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9odWUpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZXhwb3N1cmUpOworCWludCByYzsKKworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jdXN0b21faWQpOworCWlmIChyYykgZ290byBlcnI7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX21vZGVsKTsKKwlpZiAocmMpIGdvdG8gZXJyX2lkOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlkZ2UpOworCWlmIChyYykgZ290byBlcnJfbW9kZWw7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3NlbnNvcik7CisJaWYgKHJjKSBnb3RvIGVycl9icmlkZ2U7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOworCWlmIChyYykgZ290byBlcnJfc2Vuc29yOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zYXR1cmF0aW9uKTsKKwlpZiAocmMpIGdvdG8gZXJyX2JyaWdodDsKKwlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfY29udHJhc3QpOworCWlmIChyYykgZ290byBlcnJfc2F0OworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9odWUpOworCWlmIChyYykgZ290byBlcnJfY29udHJhc3Q7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2V4cG9zdXJlKTsKKwlpZiAocmMpIGdvdG8gZXJyX2h1ZTsKKworCXJldHVybiAwOworCitlcnJfaHVlOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaHVlKTsKK2Vycl9jb250cmFzdDoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2NvbnRyYXN0KTsKK2Vycl9zYXQ6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zYXR1cmF0aW9uKTsKK2Vycl9icmlnaHQ6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlnaHRuZXNzKTsKK2Vycl9zZW5zb3I6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zZW5zb3IpOworZXJyX2JyaWRnZToKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWRnZSk7CitlcnJfbW9kZWw6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7CitlcnJfaWQ6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jdXN0b21faWQpOworZXJyOgorCXJldHVybiByYzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU4MTcsNyArNTg0OSwxMSBAQAogCSAgICAgb3YtPnZkZXYtPm1pbm9yKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgb3YpOwotCW92X2NyZWF0ZV9zeXNmcyhvdi0+dmRldik7CisJaWYgKG92X2NyZWF0ZV9zeXNmcyhvdi0+dmRldikpIHsKKwkJZXJyKCJvdl9jcmVhdGVfc3lzZnMgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCiAJcmV0dXJuIDA7CiAKIGVycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkMGFkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKQEAgLTAsMCArMSwxMzMzIEBACisvKgorICogQSBWNEwyIGRyaXZlciBmb3IgT21uaVZpc2lvbiBPVjc2NzAgY2FtZXJhcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBPbmUgTGFwdG9wIFBlciBDaGlsZCBBc3NvY2lhdGlvbiwgSW5jLiAgV3JpdHRlbgorICogYnkgSm9uYXRoYW4gQ29yYmV0IHdpdGggc3Vic3RhbnRpYWwgaW5zcGlyYXRpb24gZnJvbSBNYXJrCisgKiBNY0NsZWxsYW5kJ3Mgb3ZjYW1jaGlwIGNvZGUuCisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisKK01PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkEgbG93LWxldmVsIGRyaXZlciBmb3IgT21uaVZpc2lvbiBvdjc2NzAgc2Vuc29ycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogQmFzaWMgd2luZG93IHNpemVzLiAgVGhlc2UgcHJvYmFibHkgYmVsb25nIHNvbWV3aGVyZSBtb3JlIGdsb2JhbGx5CisgKiB1c2VmdWwuCisgKi8KKyNkZWZpbmUgVkdBX1dJRFRICTY0MAorI2RlZmluZSBWR0FfSEVJR0hUCTQ4MAorI2RlZmluZSBRVkdBX1dJRFRICTMyMAorI2RlZmluZSBRVkdBX0hFSUdIVAkyNDAKKyNkZWZpbmUgQ0lGX1dJRFRICTM1MgorI2RlZmluZSBDSUZfSEVJR0hUCTI4OAorI2RlZmluZSBRQ0lGX1dJRFRICTE3NgorI2RlZmluZQlRQ0lGX0hFSUdIVAkxNDQKKworLyoKKyAqIE91ciBub21pbmFsIChkZWZhdWx0KSBmcmFtZSByYXRlLgorICovCisjZGVmaW5lIE9WNzY3MF9GUkFNRV9SQVRFIDMwCisKKy8qCisgKiBUaGUgNzY3MCBzaXRzIG9uIGkyYyB3aXRoIElEIDB4NDIKKyAqLworI2RlZmluZSBPVjc2NzBfSTJDX0FERFIgMHg0MgorCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkVHX0dBSU4JMHgwMAkvKiBHYWluIGxvd2VyIDggYml0cyAocmVzdCBpbiB2cmVmKSAqLworI2RlZmluZSBSRUdfQkxVRQkweDAxCS8qIGJsdWUgZ2FpbiAqLworI2RlZmluZSBSRUdfUkVECQkweDAyCS8qIHJlZCBnYWluICovCisjZGVmaW5lIFJFR19WUkVGCTB4MDMJLyogUGllY2VzIG9mIEdBSU4sIFZTVEFSVCwgVlNUT1AgKi8KKyNkZWZpbmUgUkVHX0NPTTEJMHgwNAkvKiBDb250cm9sIDEgKi8KKyNkZWZpbmUgIENPTTFfQ0NJUjY1NgkgIDB4NDAgIC8qIENDSVI2NTYgZW5hYmxlICovCisjZGVmaW5lIFJFR19CQVZFCTB4MDUJLyogVS9CIEF2ZXJhZ2UgbGV2ZWwgKi8KKyNkZWZpbmUgUkVHX0diQVZFCTB4MDYJLyogWS9HYiBBdmVyYWdlIGxldmVsICovCisjZGVmaW5lIFJFR19BRUNISAkweDA3CS8qIEFFQyBNUyA1IGJpdHMgKi8KKyNkZWZpbmUgUkVHX1JBVkUJMHgwOAkvKiBWL1IgQXZlcmFnZSBsZXZlbCAqLworI2RlZmluZSBSRUdfQ09NMgkweDA5CS8qIENvbnRyb2wgMiAqLworI2RlZmluZSAgQ09NMl9TU0xFRVAJICAweDEwCS8qIFNvZnQgc2xlZXAgbW9kZSAqLworI2RlZmluZSBSRUdfUElECQkweDBhCS8qIFByb2R1Y3QgSUQgTVNCICovCisjZGVmaW5lIFJFR19WRVIJCTB4MGIJLyogUHJvZHVjdCBJRCBMU0IgKi8KKyNkZWZpbmUgUkVHX0NPTTMJMHgwYwkvKiBDb250cm9sIDMgKi8KKyNkZWZpbmUgIENPTTNfU1dBUAkgIDB4NDAJICAvKiBCeXRlIHN3YXAgKi8KKyNkZWZpbmUgIENPTTNfU0NBTEVFTgkgIDB4MDgJICAvKiBFbmFibGUgc2NhbGluZyAqLworI2RlZmluZSAgQ09NM19EQ1dFTgkgIDB4MDQJICAvKiBFbmFibGUgZG93bnNhbXAvY3JvcC93aW5kb3cgKi8KKyNkZWZpbmUgUkVHX0NPTTQJMHgwZAkvKiBDb250cm9sIDQgKi8KKyNkZWZpbmUgUkVHX0NPTTUJMHgwZQkvKiBBbGwgInJlc2VydmVkIiAqLworI2RlZmluZSBSRUdfQ09NNgkweDBmCS8qIENvbnRyb2wgNiAqLworI2RlZmluZSBSRUdfQUVDSAkweDEwCS8qIE1vcmUgYml0cyBvZiBBRUMgdmFsdWUgKi8KKyNkZWZpbmUgUkVHX0NMS1JDCTB4MTEJLyogQ2xvY2wgY29udHJvbCAqLworI2RlZmluZSAgIENMS19FWFQJICAweDQwCSAgLyogVXNlIGV4dGVybmFsIGNsb2NrIGRpcmVjdGx5ICovCisjZGVmaW5lICAgQ0xLX1NDQUxFCSAgMHgzZgkgIC8qIE1hc2sgZm9yIGludGVybmFsIGNsb2NrIHNjYWxlICovCisjZGVmaW5lIFJFR19DT003CTB4MTIJLyogQ29udHJvbCA3ICovCisjZGVmaW5lICAgQ09NN19SRVNFVAkgIDB4ODAJICAvKiBSZWdpc3RlciByZXNldCAqLworI2RlZmluZSAgIENPTTdfRk1UX01BU0sJICAweDM4CisjZGVmaW5lICAgQ09NN19GTVRfVkdBCSAgMHgwMAorI2RlZmluZQkgIENPTTdfRk1UX0NJRgkgIDB4MjAJICAvKiBDSUYgZm9ybWF0ICovCisjZGVmaW5lICAgQ09NN19GTVRfUVZHQQkgIDB4MTAJICAvKiBRVkdBIGZvcm1hdCAqLworI2RlZmluZSAgIENPTTdfRk1UX1FDSUYJICAweDA4CSAgLyogUUNJRiBmb3JtYXQgKi8KKyNkZWZpbmUJICBDT003X1JHQgkgIDB4MDQJICAvKiBiaXRzIDAgYW5kIDIgLSBSR0IgZm9ybWF0ICovCisjZGVmaW5lCSAgQ09NN19ZVVYJICAweDAwCSAgLyogWVVWICovCisjZGVmaW5lCSAgQ09NN19CQVlFUgkgIDB4MDEJICAvKiBCYXllciBmb3JtYXQgKi8KKyNkZWZpbmUJICBDT003X1BCQVlFUgkgIDB4MDUJICAvKiAiUHJvY2Vzc2VkIGJheWVyIiAqLworI2RlZmluZSBSRUdfQ09NOAkweDEzCS8qIENvbnRyb2wgOCAqLworI2RlZmluZSAgIENPTThfRkFTVEFFQwkgIDB4ODAJICAvKiBFbmFibGUgZmFzdCBBR0MvQUVDICovCisjZGVmaW5lICAgQ09NOF9BRUNTVEVQCSAgMHg0MAkgIC8qIFVubGltaXRlZCBBRUMgc3RlcCBzaXplICovCisjZGVmaW5lICAgQ09NOF9CRklMVAkgIDB4MjAJICAvKiBCYW5kIGZpbHRlciBlbmFibGUgKi8KKyNkZWZpbmUgICBDT004X0FHQwkgIDB4MDQJICAvKiBBdXRvIGdhaW4gZW5hYmxlICovCisjZGVmaW5lICAgQ09NOF9BV0IJICAweDAyCSAgLyogV2hpdGUgYmFsYW5jZSBlbmFibGUgKi8KKyNkZWZpbmUgICBDT004X0FFQwkgIDB4MDEJICAvKiBBdXRvIGV4cG9zdXJlIGVuYWJsZSAqLworI2RlZmluZSBSRUdfQ09NOQkweDE0CS8qIENvbnRyb2wgOSAgLSBnYWluIGNlaWxpbmcgKi8KKyNkZWZpbmUgUkVHX0NPTTEwCTB4MTUJLyogQ29udHJvbCAxMCAqLworI2RlZmluZSAgIENPTTEwX0hTWU5DCSAgMHg0MAkgIC8qIEhTWU5DIGluc3RlYWQgb2YgSFJFRiAqLworI2RlZmluZSAgIENPTTEwX1BDTEtfSEIJICAweDIwCSAgLyogU3VwcHJlc3MgUENMSyBvbiBob3JpeiBibGFuayAqLworI2RlZmluZSAgIENPTTEwX0hSRUZfUkVWICAweDA4CSAgLyogUmV2ZXJzZSBIUkVGICovCisjZGVmaW5lICAgQ09NMTBfVlNfTEVBRAkgIDB4MDQJICAvKiBWU1lOQyBvbiBjbG9jayBsZWFkaW5nIGVkZ2UgKi8KKyNkZWZpbmUgICBDT00xMF9WU19ORUcJICAweDAyCSAgLyogVlNZTkMgbmVnYXRpdmUgKi8KKyNkZWZpbmUgICBDT00xMF9IU19ORUcJICAweDAxCSAgLyogSFNZTkMgbmVnYXRpdmUgKi8KKyNkZWZpbmUgUkVHX0hTVEFSVAkweDE3CS8qIEhvcml6IHN0YXJ0IGhpZ2ggYml0cyAqLworI2RlZmluZSBSRUdfSFNUT1AJMHgxOAkvKiBIb3JpeiBzdG9wIGhpZ2ggYml0cyAqLworI2RlZmluZSBSRUdfVlNUQVJUCTB4MTkJLyogVmVydCBzdGFydCBoaWdoIGJpdHMgKi8KKyNkZWZpbmUgUkVHX1ZTVE9QCTB4MWEJLyogVmVydCBzdG9wIGhpZ2ggYml0cyAqLworI2RlZmluZSBSRUdfUFNIRlQJMHgxYgkvKiBQaXhlbCBkZWxheSBhZnRlciBIUkVGICovCisjZGVmaW5lIFJFR19NSURICTB4MWMJLyogTWFudWYuIElEIGhpZ2ggKi8KKyNkZWZpbmUgUkVHX01JREwJMHgxZAkvKiBNYW51Zi4gSUQgbG93ICovCisjZGVmaW5lIFJFR19NVkZQCTB4MWUJLyogTWlycm9yIC8gdmZsaXAgKi8KKyNkZWZpbmUgICBNVkZQX01JUlJPUgkgIDB4MjAJICAvKiBNaXJyb3IgaW1hZ2UgKi8KKyNkZWZpbmUgICBNVkZQX0ZMSVAJICAweDEwCSAgLyogVmVydGljYWwgZmxpcCAqLworCisjZGVmaW5lIFJFR19BRVcJCTB4MjQJLyogQUdDIHVwcGVyIGxpbWl0ICovCisjZGVmaW5lIFJFR19BRUIJCTB4MjUJLyogQUdDIGxvd2VyIGxpbWl0ICovCisjZGVmaW5lIFJFR19WUFQJCTB4MjYJLyogQUdDL0FFQyBmYXN0IG1vZGUgb3AgcmVnaW9uICovCisjZGVmaW5lIFJFR19IU1lTVAkweDMwCS8qIEhTWU5DIHJpc2luZyBlZGdlIGRlbGF5ICovCisjZGVmaW5lIFJFR19IU1lFTgkweDMxCS8qIEhTWU5DIGZhbGxpbmcgZWRnZSBkZWxheSAqLworI2RlZmluZSBSRUdfSFJFRgkweDMyCS8qIEhSRUYgcGllY2VzICovCisjZGVmaW5lIFJFR19UU0xCCTB4M2EJLyogbG90cyBvZiBzdHVmZiAqLworI2RlZmluZSAgIFRTTEJfWUxBU1QJICAweDA0CSAgLyogVVlWWSBvciBWWVVZIC0gc2VlIGNvbTEzICovCisjZGVmaW5lIFJFR19DT00xMQkweDNiCS8qIENvbnRyb2wgMTEgKi8KKyNkZWZpbmUgICBDT00xMV9OSUdIVAkgIDB4ODAJICAvKiBOSWdodCBtb2RlIGVuYWJsZSAqLworI2RlZmluZSAgIENPTTExX05NRlIJICAweDYwCSAgLyogVHdvIGJpdCBOTSBmcmFtZSByYXRlICovCisjZGVmaW5lICAgQ09NMTFfSFpBVVRPCSAgMHgxMAkgIC8qIEF1dG8gZGV0ZWN0IDUwLzYwIEh6ICovCisjZGVmaW5lCSAgQ09NMTFfNTBIWgkgIDB4MDgJICAvKiBNYW51YWwgNTBIeiBzZWxlY3QgKi8KKyNkZWZpbmUgICBDT00xMV9FWFAJICAweDAyCisjZGVmaW5lIFJFR19DT00xMgkweDNjCS8qIENvbnRyb2wgMTIgKi8KKyNkZWZpbmUgICBDT00xMl9IUkVGCSAgMHg4MAkgIC8qIEhSRUYgYWx3YXlzICovCisjZGVmaW5lIFJFR19DT00xMwkweDNkCS8qIENvbnRyb2wgMTMgKi8KKyNkZWZpbmUgICBDT00xM19HQU1NQQkgIDB4ODAJICAvKiBHYW1tYSBlbmFibGUgKi8KKyNkZWZpbmUJICBDT00xM19VVlNBVAkgIDB4NDAJICAvKiBVViBzYXR1cmF0aW9uIGF1dG8gYWRqdXN0bWVudCAqLworI2RlZmluZSAgIENPTTEzX1VWU1dBUAkgIDB4MDEJICAvKiBWIGJlZm9yZSBVIC0gdy9UU0xCICovCisjZGVmaW5lIFJFR19DT00xNAkweDNlCS8qIENvbnRyb2wgMTQgKi8KKyNkZWZpbmUgICBDT00xNF9EQ1dFTgkgIDB4MTAJICAvKiBEQ1cvUENMSy1zY2FsZSBlbmFibGUgKi8KKyNkZWZpbmUgUkVHX0VER0UJMHgzZgkvKiBFZGdlIGVuaGFuY2VtZW50IGZhY3RvciAqLworI2RlZmluZSBSRUdfQ09NMTUJMHg0MAkvKiBDb250cm9sIDE1ICovCisjZGVmaW5lICAgQ09NMTVfUjEwRjAJICAweDAwCSAgLyogRGF0YSByYW5nZSAxMCB0byBGMCAqLworI2RlZmluZQkgIENPTTE1X1IwMUZFCSAgMHg4MAkgIC8qICAgICAgICAgICAgMDEgdG8gRkUgKi8KKyNkZWZpbmUgICBDT00xNV9SMDBGRgkgIDB4YzAJICAvKiAgICAgICAgICAgIDAwIHRvIEZGICovCisjZGVmaW5lICAgQ09NMTVfUkdCNTY1CSAgMHgxMAkgIC8qIFJHQjU2NSBvdXRwdXQgKi8KKyNkZWZpbmUgICBDT00xNV9SR0I1NTUJICAweDMwCSAgLyogUkdCNTU1IG91dHB1dCAqLworI2RlZmluZSBSRUdfQ09NMTYJMHg0MQkvKiBDb250cm9sIDE2ICovCisjZGVmaW5lICAgQ09NMTZfQVdCR0FJTiAgIDB4MDgJICAvKiBBV0IgZ2FpbiBlbmFibGUgKi8KKyNkZWZpbmUgUkVHX0NPTTE3CTB4NDIJLyogQ29udHJvbCAxNyAqLworI2RlZmluZSAgIENPTTE3X0FFQ1dJTgkgIDB4YzAJICAvKiBBRUMgd2luZG93IC0gbXVzdCBtYXRjaCBDT000ICovCisjZGVmaW5lICAgQ09NMTdfQ0JBUgkgIDB4MDgJICAvKiBEU1AgQ29sb3IgYmFyICovCisKKy8qCisgKiBUaGlzIG1hdHJpeCBkZWZpbmVzIGhvdyB0aGUgY29sb3JzIGFyZSBnZW5lcmF0ZWQsIG11c3QgYmUKKyAqIHR3ZWFrZWQgdG8gYWRqdXN0IGh1ZSBhbmQgc2F0dXJhdGlvbi4KKyAqCisgKiBPcmRlcjogdi1yZWQsIHYtZ3JlZW4sIHYtYmx1ZSwgdS1yZWQsIHUtZ3JlZW4sIHUtYmx1ZQorICoKKyAqIFRoZXkgYXJlIG5pbmUtYml0IHNpZ25lZCBxdWFudGl0aWVzLCB3aXRoIHRoZSBzaWduIGJpdAorICogc3RvcmVkIGluIDB4NTguICBTaWduIGZvciB2LXJlZCBpcyBiaXQgMCwgYW5kIHVwIGZyb20gdGhlcmUuCisgKi8KKyNkZWZpbmUJUkVHX0NNQVRSSVhfQkFTRSAweDRmCisjZGVmaW5lICAgQ01BVFJJWF9MRU4gNgorI2RlZmluZSBSRUdfQ01BVFJJWF9TSUdOIDB4NTgKKworCisjZGVmaW5lIFJFR19CUklHSFQJMHg1NQkvKiBCcmlnaHRuZXNzICovCisjZGVmaW5lIFJFR19DT05UUkFTCTB4NTYJLyogQ29udHJhc3QgY29udHJvbCAqLworCisjZGVmaW5lIFJFR19HRklYCTB4NjkJLyogRml4IGdhaW4gY29udHJvbCAqLworCisjZGVmaW5lIFJFR19SR0I0NDQJMHg4YwkvKiBSR0IgNDQ0IGNvbnRyb2wgKi8KKyNkZWZpbmUgICBSNDQ0X0VOQUJMRQkgIDB4MDIJICAvKiBUdXJuIG9uIFJHQjQ0NCwgb3ZlcnJpZGVzIDV4NSAqLworI2RlZmluZSAgIFI0NDRfUkdCWAkgIDB4MDEJICAvKiBFbXB0eSBuaWJibGUgYXQgZW5kICovCisKKyNkZWZpbmUgUkVHX0hBRUNDMQkweDlmCS8qIEhpc3QgQUVDL0FHQyBjb250cm9sIDEgKi8KKyNkZWZpbmUgUkVHX0hBRUNDMgkweGEwCS8qIEhpc3QgQUVDL0FHQyBjb250cm9sIDIgKi8KKworI2RlZmluZSBSRUdfQkQ1ME1BWAkweGE1CS8qIDUwaHogYmFuZGluZyBzdGVwIGxpbWl0ICovCisjZGVmaW5lIFJFR19IQUVDQzMJMHhhNgkvKiBIaXN0IEFFQy9BR0MgY29udHJvbCAzICovCisjZGVmaW5lIFJFR19IQUVDQzQJMHhhNwkvKiBIaXN0IEFFQy9BR0MgY29udHJvbCA0ICovCisjZGVmaW5lIFJFR19IQUVDQzUJMHhhOAkvKiBIaXN0IEFFQy9BR0MgY29udHJvbCA1ICovCisjZGVmaW5lIFJFR19IQUVDQzYJMHhhOQkvKiBIaXN0IEFFQy9BR0MgY29udHJvbCA2ICovCisjZGVmaW5lIFJFR19IQUVDQzcJMHhhYQkvKiBIaXN0IEFFQy9BR0MgY29udHJvbCA3ICovCisjZGVmaW5lIFJFR19CRDYwTUFYCTB4YWIJLyogNjBoeiBiYW5kaW5nIHN0ZXAgbGltaXQgKi8KKworCisvKgorICogSW5mb3JtYXRpb24gd2UgbWFpbnRhaW4gYWJvdXQgYSBrbm93biBzZW5zb3IuCisgKi8KK3N0cnVjdCBvdjc2NzBfZm9ybWF0X3N0cnVjdDsgIC8qIGNvbWluZyBsYXRlciAqLworc3RydWN0IG92NzY3MF9pbmZvIHsKKwlzdHJ1Y3Qgb3Y3NjcwX2Zvcm1hdF9zdHJ1Y3QgKmZtdDsgIC8qIEN1cnJlbnQgZm9ybWF0ICovCisJdW5zaWduZWQgY2hhciBzYXQ7CQkvKiBTYXR1cmF0aW9uIHZhbHVlICovCisJaW50IGh1ZTsJCQkvKiBIdWUgdmFsdWUgKi8KK307CisKKworCisKKy8qCisgKiBUaGUgZGVmYXVsdCByZWdpc3RlciBzZXR0aW5ncywgYXMgb2J0YWluZWQgZnJvbSBPbW5pVmlzaW9uLiAgVGhlcmUKKyAqIGlzIHJlYWxseSBubyBtYWtpbmcgc2Vuc2Ugb2YgbW9zdCBvZiB0aGVzZSAtIGxvdHMgb2YgInJlc2VydmVkIiB2YWx1ZXMKKyAqIGFuZCBzdWNoLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIGdpdmUgVkdBIFlVWVYuCisgKi8KKworc3RydWN0IHJlZ3ZhbF9saXN0IHsKKwl1bnNpZ25lZCBjaGFyIHJlZ19udW07CisJdW5zaWduZWQgY2hhciB2YWx1ZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y3NjcwX2RlZmF1bHRfcmVnc1tdID0geworCXsgUkVHX0NPTTcsIENPTTdfUkVTRVQgfSwKKy8qCisgKiBDbG9jayBzY2FsZTogMyA9IDE1ZnBzCisgKiAgICAgICAgICAgICAgMiA9IDIwZnBzCisgKiAgICAgICAgICAgICAgMSA9IDMwZnBzCisgKi8KKwl7IFJFR19DTEtSQywgMHgxIH0sCS8qIE9WOiBjbG9jayBzY2FsZSAoMzAgZnBzKSAqLworCXsgUkVHX1RTTEIsICAweDA0IH0sCS8qIE9WICovCisJeyBSRUdfQ09NNywgMCB9LAkvKiBWR0EgKi8KKwkvKgorCSAqIFNldCB0aGUgaGFyZHdhcmUgd2luZG93LiAgVGhlc2UgdmFsdWVzIGZyb20gT1YgZG9uJ3QgZW50aXJlbHkKKwkgKiBtYWtlIHNlbnNlIC0gaHN0b3AgaXMgbGVzcyB0aGFuIGhzdGFydC4gIEJ1dCB0aGV5IHdvcmsuLi4KKwkgKi8KKwl7IFJFR19IU1RBUlQsIDB4MTMgfSwJeyBSRUdfSFNUT1AsIDB4MDEgfSwKKwl7IFJFR19IUkVGLCAweGI2IH0sCXsgUkVHX1ZTVEFSVCwgMHgwMiB9LAorCXsgUkVHX1ZTVE9QLCAweDdhIH0sCXsgUkVHX1ZSRUYsIDB4MGEgfSwKKworCXsgUkVHX0NPTTMsIDAgfSwJeyBSRUdfQ09NMTQsIDAgfSwKKwkvKiBNeXN0ZXJ5IHNjYWxpbmcgbnVtYmVycyAqLworCXsgMHg3MCwgMHgzYSB9LAkJeyAweDcxLCAweDM1IH0sCisJeyAweDcyLCAweDExIH0sCQl7IDB4NzMsIDB4ZjAgfSwKKwl7IDB4YTIsIDB4MDIgfSwJCXsgUkVHX0NPTTEwLCAweDAgfSwKKworCS8qIEdhbW1hIGN1cnZlIHZhbHVlcyAqLworCXsgMHg3YSwgMHgyMCB9LAkJeyAweDdiLCAweDEwIH0sCisJeyAweDdjLCAweDFlIH0sCQl7IDB4N2QsIDB4MzUgfSwKKwl7IDB4N2UsIDB4NWEgfSwJCXsgMHg3ZiwgMHg2OSB9LAorCXsgMHg4MCwgMHg3NiB9LAkJeyAweDgxLCAweDgwIH0sCisJeyAweDgyLCAweDg4IH0sCQl7IDB4ODMsIDB4OGYgfSwKKwl7IDB4ODQsIDB4OTYgfSwJCXsgMHg4NSwgMHhhMyB9LAorCXsgMHg4NiwgMHhhZiB9LAkJeyAweDg3LCAweGM0IH0sCisJeyAweDg4LCAweGQ3IH0sCQl7IDB4ODksIDB4ZTggfSwKKworCS8qIEFHQyBhbmQgQUVDIHBhcmFtZXRlcnMuICBOb3RlIHdlIHN0YXJ0IGJ5IGRpc2FibGluZyB0aG9zZSBmZWF0dXJlcywKKwkgICB0aGVuIHR1cm4gdGhlbSBvbmx5IGFmdGVyIHR3ZWFraW5nIHRoZSB2YWx1ZXMuICovCisJeyBSRUdfQ09NOCwgQ09NOF9GQVNUQUVDIHwgQ09NOF9BRUNTVEVQIHwgQ09NOF9CRklMVCB9LAorCXsgUkVHX0dBSU4sIDAgfSwJeyBSRUdfQUVDSCwgMCB9LAorCXsgUkVHX0NPTTQsIDB4NDAgfSwgLyogbWFnaWMgcmVzZXJ2ZWQgYml0ICovCisJeyBSRUdfQ09NOSwgMHgxOCB9LCAvKiA0eCBnYWluICsgbWFnaWMgcnN2ZCBiaXQgKi8KKwl7IFJFR19CRDUwTUFYLCAweDA1IH0sCXsgUkVHX0JENjBNQVgsIDB4MDcgfSwKKwl7IFJFR19BRVcsIDB4OTUgfSwJeyBSRUdfQUVCLCAweDMzIH0sCisJeyBSRUdfVlBULCAweGUzIH0sCXsgUkVHX0hBRUNDMSwgMHg3OCB9LAorCXsgUkVHX0hBRUNDMiwgMHg2OCB9LAl7IDB4YTEsIDB4MDMgfSwgLyogbWFnaWMgKi8KKwl7IFJFR19IQUVDQzMsIDB4ZDggfSwJeyBSRUdfSEFFQ0M0LCAweGQ4IH0sCisJeyBSRUdfSEFFQ0M1LCAweGYwIH0sCXsgUkVHX0hBRUNDNiwgMHg5MCB9LAorCXsgUkVHX0hBRUNDNywgMHg5NCB9LAorCXsgUkVHX0NPTTgsIENPTThfRkFTVEFFQ3xDT004X0FFQ1NURVB8Q09NOF9CRklMVHxDT004X0FHQ3xDT004X0FFQyB9LAorCisJLyogQWxtb3N0IGFsbCBvZiB0aGVzZSBhcmUgbWFnaWMgInJlc2VydmVkIiB2YWx1ZXMuICAqLworCXsgUkVHX0NPTTUsIDB4NjEgfSwJeyBSRUdfQ09NNiwgMHg0YiB9LAorCXsgMHgxNiwgMHgwMiB9LAkJeyBSRUdfTVZGUCwgMHgwN3xNVkZQX01JUlJPUiB9LAorCXsgMHgyMSwgMHgwMiB9LAkJeyAweDIyLCAweDkxIH0sCisJeyAweDI5LCAweDA3IH0sCQl7IDB4MzMsIDB4MGIgfSwKKwl7IDB4MzUsIDB4MGIgfSwJCXsgMHgzNywgMHgxZCB9LAorCXsgMHgzOCwgMHg3MSB9LAkJeyAweDM5LCAweDJhIH0sCisJeyBSRUdfQ09NMTIsIDB4NzggfSwJeyAweDRkLCAweDQwIH0sCisJeyAweDRlLCAweDIwIH0sCQl7IFJFR19HRklYLCAwIH0sCisJeyAweDZiLCAweDRhIH0sCQl7IDB4NzQsIDB4MTAgfSwKKwl7IDB4OGQsIDB4NGYgfSwJCXsgMHg4ZSwgMCB9LAorCXsgMHg4ZiwgMCB9LAkJeyAweDkwLCAwIH0sCisJeyAweDkxLCAwIH0sCQl7IDB4OTYsIDAgfSwKKwl7IDB4OWEsIDAgfSwJCXsgMHhiMCwgMHg4NCB9LAorCXsgMHhiMSwgMHgwYyB9LAkJeyAweGIyLCAweDBlIH0sCisJeyAweGIzLCAweDgyIH0sCQl7IDB4YjgsIDB4MGEgfSwKKworCS8qIE1vcmUgcmVzZXJ2ZWQgbWFnaWMsIHNvbWUgb2Ygd2hpY2ggdHdlYWtzIHdoaXRlIGJhbGFuY2UgKi8KKwl7IDB4NDMsIDB4MGEgfSwJCXsgMHg0NCwgMHhmMCB9LAorCXsgMHg0NSwgMHgzNCB9LAkJeyAweDQ2LCAweDU4IH0sCisJeyAweDQ3LCAweDI4IH0sCQl7IDB4NDgsIDB4M2EgfSwKKwl7IDB4NTksIDB4ODggfSwJCXsgMHg1YSwgMHg4OCB9LAorCXsgMHg1YiwgMHg0NCB9LAkJeyAweDVjLCAweDY3IH0sCisJeyAweDVkLCAweDQ5IH0sCQl7IDB4NWUsIDB4MGUgfSwKKwl7IDB4NmMsIDB4MGEgfSwJCXsgMHg2ZCwgMHg1NSB9LAorCXsgMHg2ZSwgMHgxMSB9LAkJeyAweDZmLCAweDlmIH0sIC8qICI5ZSBmb3IgYWR2YW5jZSBBV0IiICovCisJeyAweDZhLCAweDQwIH0sCQl7IFJFR19CTFVFLCAweDQwIH0sCisJeyBSRUdfUkVELCAweDYwIH0sCisJeyBSRUdfQ09NOCwgQ09NOF9GQVNUQUVDfENPTThfQUVDU1RFUHxDT004X0JGSUxUfENPTThfQUdDfENPTThfQUVDfENPTThfQVdCIH0sCisKKwkvKiBNYXRyaXggY29lZmZpY2llbnRzICovCisJeyAweDRmLCAweDgwIH0sCQl7IDB4NTAsIDB4ODAgfSwKKwl7IDB4NTEsIDAgfSwJCXsgMHg1MiwgMHgyMiB9LAorCXsgMHg1MywgMHg1ZSB9LAkJeyAweDU0LCAweDgwIH0sCisJeyAweDU4LCAweDllIH0sCisKKwl7IFJFR19DT00xNiwgQ09NMTZfQVdCR0FJTiB9LAl7IFJFR19FREdFLCAwIH0sCisJeyAweDc1LCAweDA1IH0sCQl7IDB4NzYsIDB4ZTEgfSwKKwl7IDB4NGMsIDAgfSwJCXsgMHg3NywgMHgwMSB9LAorCXsgUkVHX0NPTTEzLCAweGMzIH0sCXsgMHg0YiwgMHgwOSB9LAorCXsgMHhjOSwgMHg2MCB9LAkJeyBSRUdfQ09NMTYsIDB4MzggfSwKKwl7IDB4NTYsIDB4NDAgfSwKKworCXsgMHgzNCwgMHgxMSB9LAkJeyBSRUdfQ09NMTEsIENPTTExX0VYUHxDT00xMV9IWkFVVE8gfSwKKwl7IDB4YTQsIDB4ODggfSwJCXsgMHg5NiwgMCB9LAorCXsgMHg5NywgMHgzMCB9LAkJeyAweDk4LCAweDIwIH0sCisJeyAweDk5LCAweDMwIH0sCQl7IDB4OWEsIDB4ODQgfSwKKwl7IDB4OWIsIDB4MjkgfSwJCXsgMHg5YywgMHgwMyB9LAorCXsgMHg5ZCwgMHg0YyB9LAkJeyAweDllLCAweDNmIH0sCisJeyAweDc4LCAweDA0IH0sCisKKwkvKiBFeHRyYS13ZWlyZCBzdHVmZi4gIFNvbWUgc29ydCBvZiBtdWx0aXBsZXhvciByZWdpc3RlciAqLworCXsgMHg3OSwgMHgwMSB9LAkJeyAweGM4LCAweGYwIH0sCisJeyAweDc5LCAweDBmIH0sCQl7IDB4YzgsIDB4MDAgfSwKKwl7IDB4NzksIDB4MTAgfSwJCXsgMHhjOCwgMHg3ZSB9LAorCXsgMHg3OSwgMHgwYSB9LAkJeyAweGM4LCAweDgwIH0sCisJeyAweDc5LCAweDBiIH0sCQl7IDB4YzgsIDB4MDEgfSwKKwl7IDB4NzksIDB4MGMgfSwJCXsgMHhjOCwgMHgwZiB9LAorCXsgMHg3OSwgMHgwZCB9LAkJeyAweGM4LCAweDIwIH0sCisJeyAweDc5LCAweDA5IH0sCQl7IDB4YzgsIDB4ODAgfSwKKwl7IDB4NzksIDB4MDIgfSwJCXsgMHhjOCwgMHhjMCB9LAorCXsgMHg3OSwgMHgwMyB9LAkJeyAweGM4LCAweDQwIH0sCisJeyAweDc5LCAweDA1IH0sCQl7IDB4YzgsIDB4MzAgfSwKKwl7IDB4NzksIDB4MjYgfSwKKworCXsgMHhmZiwgMHhmZiB9LAkvKiBFTkQgTUFSS0VSICovCit9OworCisKKy8qCisgKiBIZXJlIHdlJ2xsIHRyeSB0byBlbmNhcHN1bGF0ZSB0aGUgY2hhbmdlcyBmb3IganVzdCB0aGUgb3V0cHV0CisgKiB2aWRlbyBmb3JtYXQuCisgKgorICogUkdCNjU2IGFuZCBZVVY0MjIgY29tZSBmcm9tIE9WOyBSR0I0NDQgaXMgaG9tZWJyZXdlZC4KKyAqCisgKiBJTVBPUlRBTlQgUlVMRTogdGhlIGZpcnN0IGVudHJ5IG11c3QgYmUgZm9yIENPTTcsIHNlZSBvdjc2NzBfc19mbXQgZm9yIHdoeS4KKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y3NjcwX2ZtdF95dXY0MjJbXSA9IHsKKwl7IFJFR19DT003LCAweDAgfSwgIC8qIFNlbGVjdHMgWVVWIG1vZGUgKi8KKwl7IFJFR19SR0I0NDQsIDAgfSwJLyogTm8gUkdCNDQ0IHBsZWFzZSAqLworCXsgUkVHX0NPTTEsIDAgfSwKKwl7IFJFR19DT00xNSwgQ09NMTVfUjAwRkYgfSwKKwl7IFJFR19DT005LCAweDE4IH0sIC8qIDR4IGdhaW4gY2VpbGluZzsgMHg4IGlzIHJlc2VydmVkIGJpdCAqLworCXsgMHg0ZiwgMHg4MCB9LCAJLyogIm1hdHJpeCBjb2VmZmljaWVudCAxIiAqLworCXsgMHg1MCwgMHg4MCB9LCAJLyogIm1hdHJpeCBjb2VmZmljaWVudCAyIiAqLworCXsgMHg1MSwgMCAgICB9LAkJLyogdmIgKi8KKwl7IDB4NTIsIDB4MjIgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNCIgKi8KKwl7IDB4NTMsIDB4NWUgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNSIgKi8KKwl7IDB4NTQsIDB4ODAgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNiIgKi8KKwl7IFJFR19DT00xMywgQ09NMTNfR0FNTUF8Q09NMTNfVVZTQVQgfSwKKwl7IDB4ZmYsIDB4ZmYgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y3NjcwX2ZtdF9yZ2I1NjVbXSA9IHsKKwl7IFJFR19DT003LCBDT003X1JHQiB9LAkvKiBTZWxlY3RzIFJHQiBtb2RlICovCisJeyBSRUdfUkdCNDQ0LCAwIH0sCS8qIE5vIFJHQjQ0NCBwbGVhc2UgKi8KKwl7IFJFR19DT00xLCAweDAgfSwKKwl7IFJFR19DT00xNSwgQ09NMTVfUkdCNTY1IH0sCisJeyBSRUdfQ09NOSwgMHgzOCB9LCAJLyogMTZ4IGdhaW4gY2VpbGluZzsgMHg4IGlzIHJlc2VydmVkIGJpdCAqLworCXsgMHg0ZiwgMHhiMyB9LCAJLyogIm1hdHJpeCBjb2VmZmljaWVudCAxIiAqLworCXsgMHg1MCwgMHhiMyB9LCAJLyogIm1hdHJpeCBjb2VmZmljaWVudCAyIiAqLworCXsgMHg1MSwgMCAgICB9LAkJLyogdmIgKi8KKwl7IDB4NTIsIDB4M2QgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNCIgKi8KKwl7IDB4NTMsIDB4YTcgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNSIgKi8KKwl7IDB4NTQsIDB4ZTQgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNiIgKi8KKwl7IFJFR19DT00xMywgQ09NMTNfR0FNTUF8Q09NMTNfVVZTQVQgfSwKKwl7IDB4ZmYsIDB4ZmYgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y3NjcwX2ZtdF9yZ2I0NDRbXSA9IHsKKwl7IFJFR19DT003LCBDT003X1JHQiB9LAkvKiBTZWxlY3RzIFJHQiBtb2RlICovCisJeyBSRUdfUkdCNDQ0LCBSNDQ0X0VOQUJMRSB9LAkvKiBFbmFibGUgeHh4eHJycnIgZ2dnZ2JiYmIgKi8KKwl7IFJFR19DT00xLCAweDQwIH0sCS8qIE1hZ2ljIHJlc2VydmVkIGJpdCAqLworCXsgUkVHX0NPTTE1LCBDT00xNV9SMDFGRXxDT00xNV9SR0I1NjUgfSwgLyogRGF0YSByYW5nZSBuZWVkZWQ/ICovCisJeyBSRUdfQ09NOSwgMHgzOCB9LCAJLyogMTZ4IGdhaW4gY2VpbGluZzsgMHg4IGlzIHJlc2VydmVkIGJpdCAqLworCXsgMHg0ZiwgMHhiMyB9LCAJLyogIm1hdHJpeCBjb2VmZmljaWVudCAxIiAqLworCXsgMHg1MCwgMHhiMyB9LCAJLyogIm1hdHJpeCBjb2VmZmljaWVudCAyIiAqLworCXsgMHg1MSwgMCAgICB9LAkJLyogdmIgKi8KKwl7IDB4NTIsIDB4M2QgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNCIgKi8KKwl7IDB4NTMsIDB4YTcgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNSIgKi8KKwl7IDB4NTQsIDB4ZTQgfSwgCS8qICJtYXRyaXggY29lZmZpY2llbnQgNiIgKi8KKwl7IFJFR19DT00xMywgQ09NMTNfR0FNTUF8Q09NMTNfVVZTQVR8MHgyIH0sICAvKiBNYWdpYyByc3ZkIGJpdCAqLworCXsgMHhmZiwgMHhmZiB9LAorfTsKKworCisKKworLyoKKyAqIExvdy1sZXZlbCByZWdpc3RlciBJL08uCisgKi8KKworc3RhdGljIGludCBvdjc2NzBfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciByZWcsCisJCXVuc2lnbmVkIGNoYXIgKnZhbHVlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoYywgcmVnKTsKKwlpZiAocmV0ID49IDApCisJCSp2YWx1ZSA9ICh1bnNpZ25lZCBjaGFyKSByZXQ7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG92NzY3MF93cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgY2hhciByZWcsCisJCXVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoYywgcmVnLCB2YWx1ZSk7Cit9CisKKworLyoKKyAqIFdyaXRlIGEgbGlzdCBvZiByZWdpc3RlciBzZXR0aW5nczsgZmYvZmYgc3RvcHMgdGhlIHByb2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgb3Y3NjcwX3dyaXRlX2FycmF5KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgcmVndmFsX2xpc3QgKnZhbHMpCit7CisJd2hpbGUgKHZhbHMtPnJlZ19udW0gIT0gMHhmZiB8fCB2YWxzLT52YWx1ZSAhPSAweGZmKSB7CisJCWludCByZXQgPSBvdjc2NzBfd3JpdGUoYywgdmFscy0+cmVnX251bSwgdmFscy0+dmFsdWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXZhbHMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFN0dWZmIHRoYXQga25vd3MgYWJvdXQgdGhlIHNlbnNvci4KKyAqLworc3RhdGljIHZvaWQgb3Y3NjcwX3Jlc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJb3Y3NjcwX3dyaXRlKGNsaWVudCwgUkVHX0NPTTcsIENPTTdfUkVTRVQpOworCW1zbGVlcCgxKTsKK30KKworCitzdGF0aWMgaW50IG92NzY3MF9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIG92NzY3MF93cml0ZV9hcnJheShjbGllbnQsIG92NzY3MF9kZWZhdWx0X3JlZ3MpOworfQorCisKKworc3RhdGljIGludCBvdjc2NzBfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdW5zaWduZWQgY2hhciB2OworCWludCByZXQ7CisKKwlyZXQgPSBvdjc2NzBfaW5pdChjbGllbnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG92NzY3MF9yZWFkKGNsaWVudCwgUkVHX01JREgsICZ2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodiAhPSAweDdmKSAvKiBPViBtYW51Zi4gaWQuICovCisJCXJldHVybiAtRU5PREVWOworCXJldCA9IG92NzY3MF9yZWFkKGNsaWVudCwgUkVHX01JREwsICZ2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodiAhPSAweGEyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkvKgorCSAqIE9LLCB3ZSBrbm93IHdlIGhhdmUgYW4gT21uaVZpc2lvbiBjaGlwLi4uYnV0IHdoaWNoIG9uZT8KKwkgKi8KKwlyZXQgPSBvdjc2NzBfcmVhZChjbGllbnQsIFJFR19QSUQsICZ2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodiAhPSAweDc2KSAgLyogUElEICsgVkVSID0gMHg3NiAvIDB4NzMgKi8KKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0ID0gb3Y3NjcwX3JlYWQoY2xpZW50LCBSRUdfVkVSLCAmdik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHYgIT0gMHg3MykgIC8qIFBJRCArIFZFUiA9IDB4NzYgLyAweDczICovCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBTdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gZGF0YSBmb3JtYXQuICBUaGUgY29sb3IgbWF0cml4CisgKiBpcyBkZWVwbHkgdGllZCBpbnRvIHRoZSBmb3JtYXQsIHNvIGtlZXAgdGhlIHJlbGV2YW50IHZhbHVlcyBoZXJlLgorICogVGhlIG1hZ2ljIG1hdHJpeCBudWJtZXJzIGNvbWUgZnJvbSBPbW5pVmlzaW9uLgorICovCitzdGF0aWMgc3RydWN0IG92NzY3MF9mb3JtYXRfc3RydWN0IHsKKwlfX3U4ICpkZXNjOworCV9fdTMyIHBpeGVsZm9ybWF0OworCXN0cnVjdCByZWd2YWxfbGlzdCAqcmVnczsKKwlpbnQgY21hdHJpeFtDTUFUUklYX0xFTl07Cit9IG92NzY3MF9mb3JtYXRzW10gPSB7CisJeworCQkuZGVzYwkJPSAiWVVZViA0OjI6MiIsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkucmVncyAJCT0gb3Y3NjcwX2ZtdF95dXY0MjIsCisJCS5jbWF0cml4CT0geyAxMjgsIC0xMjgsIDAsIC0zNCwgLTk0LCAxMjggfSwKKwl9LAorCXsKKwkJLmRlc2MJCT0gIlJHQiA0NDQiLAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCNDQ0LAorCQkucmVncwkJPSBvdjc2NzBfZm10X3JnYjQ0NCwKKwkJLmNtYXRyaXgJPSB7IDE3OSwgLTE3OSwgMCwgLTYxLCAtMTc2LCAyMjggfSwKKwl9LAorCXsKKwkJLmRlc2MJCT0gIlJHQiA1NjUiLAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAorCQkucmVncwkJPSBvdjc2NzBfZm10X3JnYjU2NSwKKwkJLmNtYXRyaXgJPSB7IDE3OSwgLTE3OSwgMCwgLTYxLCAtMTc2LCAyMjggfSwKKwl9LAorfTsKKyNkZWZpbmUgTl9PVjc2NzBfRk1UUyAoc2l6ZW9mKG92NzY3MF9mb3JtYXRzKS9zaXplb2Yob3Y3NjcwX2Zvcm1hdHNbMF0pKQorCisvKgorICogQWxsIGZvcm1hdHMgd2Ugc3VwcG9ydCBhcmUgMiBieXRlcy9waXhlbC4KKyAqLworI2RlZmluZSBCWVRFU19QRVJfUElYRUwgMgorCisvKgorICogVGhlbiB0aGVyZSBpcyB0aGUgaXNzdWUgb2Ygd2luZG93IHNpemVzLiAgVHJ5IHRvIGNhcHR1cmUgdGhlIGluZm8gaGVyZS4KKyAqLworCisvKgorICogUUNJRiBtb2RlIGlzIGRvbmUgKGJ5IE9WKSBpbiBhIHZlcnkgc3RyYW5nZSB3YXkgLSBpdCBhY3R1YWxseSBsb29rcyBsaWtlCisgKiBWR0Egd2l0aCB3ZWlyZCBzY2FsaW5nIG9wdGlvbnMgLSB0aGV5IGRvICpub3QqIHVzZSB0aGUgY2FubmVkIFFDSUYgbW9kZQorICogd2hpY2ggaXMgYWxsZWdlZGx5IHByb3ZpZGVkIGJ5IHRoZSBzZW5zb3IuICBTbyBoZXJlJ3MgdGhlIHdlaXJkIHJlZ2lzdGVyCisgKiBzZXR0aW5ncy4KKyAqLworc3RhdGljIHN0cnVjdCByZWd2YWxfbGlzdCBvdjc2NzBfcWNpZl9yZWdzW10gPSB7CisJeyBSRUdfQ09NMywgQ09NM19TQ0FMRUVOfENPTTNfRENXRU4gfSwKKwl7IFJFR19DT00zLCBDT00zX0RDV0VOIH0sCisJeyBSRUdfQ09NMTQsIENPTTE0X0RDV0VOIHwgMHgwMX0sCisJeyAweDczLCAweGYxIH0sCisJeyAweGEyLCAweDUyIH0sCisJeyAweDdiLCAweDFjIH0sCisJeyAweDdjLCAweDI4IH0sCisJeyAweDdkLCAweDNjIH0sCisJeyAweDdmLCAweDY5IH0sCisJeyBSRUdfQ09NOSwgMHgzOCB9LAorCXsgMHhhMSwgMHgwYiB9LAorCXsgMHg3NCwgMHgxOSB9LAorCXsgMHg5YSwgMHg4MCB9LAorCXsgMHg0MywgMHgxNCB9LAorCXsgUkVHX0NPTTEzLCAweGMwIH0sCisJeyAweGZmLCAweGZmIH0sCit9OworCitzdGF0aWMgc3RydWN0IG92NzY3MF93aW5fc2l6ZSB7CisJaW50CXdpZHRoOworCWludAloZWlnaHQ7CisJdW5zaWduZWQgY2hhciBjb203X2JpdDsKKwlpbnQJaHN0YXJ0OwkJLyogU3RhcnQvc3RvcCB2YWx1ZXMgZm9yIHRoZSBjYW1lcmEuICBOb3RlICovCisJaW50CWhzdG9wOwkJLyogdGhhdCB0aGV5IGRvIG5vdCBhbHdheXMgbWFrZSBjb21wbGV0ZSAqLworCWludAl2c3RhcnQ7CQkvKiBzZW5zZSB0byBodW1hbnMsIGJ1dCBldmlkZW50bHkgdGhlIHNlbnNvciAqLworCWludAl2c3RvcDsJCS8qIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLi4uICovCisJc3RydWN0IHJlZ3ZhbF9saXN0ICpyZWdzOyAvKiBSZWdzIHRvIHR3ZWFrICovCisvKiBoL3ZyZWYgc3R1ZmYgKi8KK30gb3Y3NjcwX3dpbl9zaXplc1tdID0geworCS8qIFZHQSAqLworCXsKKwkJLndpZHRoCQk9IFZHQV9XSURUSCwKKwkJLmhlaWdodAkJPSBWR0FfSEVJR0hULAorCQkuY29tN19iaXQJPSBDT003X0ZNVF9WR0EsCisJCS5oc3RhcnQJCT0gMTU4LAkJLyogVGhlc2UgdmFsdWVzIGZyb20gKi8KKwkJLmhzdG9wCQk9ICAxNCwJCS8qIE9tbml2aXNpb24gKi8KKwkJLnZzdGFydAkJPSAgMTAsCisJCS52c3RvcAkJPSA0OTAsCisJCS5yZWdzIAkJPSBOVUxMLAorCX0sCisJLyogQ0lGICovCisJeworCQkud2lkdGgJCT0gQ0lGX1dJRFRILAorCQkuaGVpZ2h0CQk9IENJRl9IRUlHSFQsCisJCS5jb203X2JpdAk9IENPTTdfRk1UX0NJRiwKKwkJLmhzdGFydAkJPSAxNzAsCQkvKiBFbXBpcmljYWxseSBkZXRlcm1pbmVkICovCisJCS5oc3RvcAkJPSAgOTAsCisJCS52c3RhcnQJCT0gIDE0LAorCQkudnN0b3AJCT0gNDk0LAorCQkucmVncyAJCT0gTlVMTCwKKwl9LAorCS8qIFFWR0EgKi8KKwl7CisJCS53aWR0aAkJPSBRVkdBX1dJRFRILAorCQkuaGVpZ2h0CQk9IFFWR0FfSEVJR0hULAorCQkuY29tN19iaXQJPSBDT003X0ZNVF9RVkdBLAorCQkuaHN0YXJ0CQk9IDE2NCwJCS8qIEVtcGlyaWNhbGx5IGRldGVybWluZWQgKi8KKwkJLmhzdG9wCQk9ICAyMCwKKwkJLnZzdGFydAkJPSAgMTQsCisJCS52c3RvcAkJPSA0OTQsCisJCS5yZWdzIAkJPSBOVUxMLAorCX0sCisJLyogUUNJRiAqLworCXsKKwkJLndpZHRoCQk9IFFDSUZfV0lEVEgsCisJCS5oZWlnaHQJCT0gUUNJRl9IRUlHSFQsCisJCS5jb203X2JpdAk9IENPTTdfRk1UX1ZHQSwgLyogc2VlIGNvbW1lbnQgYWJvdmUgKi8KKwkJLmhzdGFydAkJPSA0NTYsCQkvKiBFbXBpcmljYWxseSBkZXRlcm1pbmVkICovCisJCS5oc3RvcAkJPSAgMjQsCisJCS52c3RhcnQJCT0gIDE0LAorCQkudnN0b3AJCT0gNDk0LAorCQkucmVncyAJCT0gb3Y3NjcwX3FjaWZfcmVncywKKwl9LAorfTsKKworI2RlZmluZSBOX1dJTl9TSVpFUyAoc2l6ZW9mKG92NzY3MF93aW5fc2l6ZXMpL3NpemVvZihvdjc2NzBfd2luX3NpemVzWzBdKSkKKworCisvKgorICogU3RvcmUgYSBzZXQgb2Ygc3RhcnQvc3RvcCB2YWx1ZXMgaW50byB0aGUgY2FtZXJhLgorICovCitzdGF0aWMgaW50IG92NzY3MF9zZXRfaHcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGhzdGFydCwgaW50IGhzdG9wLAorCQlpbnQgdnN0YXJ0LCBpbnQgdnN0b3ApCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIHY7CisvKgorICogSG9yaXpvbnRhbDogMTEgYml0cywgdG9wIDggbGl2ZSBpbiBoc3RhcnQgYW5kIGhzdG9wLiAgQm90dG9tIDMgb2YKKyAqIGhzdGFydCBhcmUgaW4gaHJlZlsyOjBdLCBib3R0b20gMyBvZiBoc3RvcCBpbiBocmVmWzU6M10uICBUaGVyZSBpcworICogYSBteXN0ZXJ5ICJlZGdlIG9mZnNldCIgdmFsdWUgaW4gdGhlIHRvcCB0d28gYml0cyBvZiBocmVmLgorICovCisJcmV0ID0gIG92NzY3MF93cml0ZShjbGllbnQsIFJFR19IU1RBUlQsIChoc3RhcnQgPj4gMykgJiAweGZmKTsKKwlyZXQgKz0gb3Y3NjcwX3dyaXRlKGNsaWVudCwgUkVHX0hTVE9QLCAoaHN0b3AgPj4gMykgJiAweGZmKTsKKwlyZXQgKz0gb3Y3NjcwX3JlYWQoY2xpZW50LCBSRUdfSFJFRiwgJnYpOworCXYgPSAodiAmIDB4YzApIHwgKChoc3RvcCAmIDB4NykgPDwgMykgfCAoaHN0YXJ0ICYgMHg3KTsKKwltc2xlZXAoMTApOworCXJldCArPSBvdjc2NzBfd3JpdGUoY2xpZW50LCBSRUdfSFJFRiwgdik7CisvKgorICogVmVydGljYWw6IHNpbWlsYXIgYXJyYW5nZW1lbnQsIGJ1dCBvbmx5IDEwIGJpdHMuCisgKi8KKwlyZXQgKz0gb3Y3NjcwX3dyaXRlKGNsaWVudCwgUkVHX1ZTVEFSVCwgKHZzdGFydCA+PiAyKSAmIDB4ZmYpOworCXJldCArPSBvdjc2NzBfd3JpdGUoY2xpZW50LCBSRUdfVlNUT1AsICh2c3RvcCA+PiAyKSAmIDB4ZmYpOworCXJldCArPSBvdjc2NzBfcmVhZChjbGllbnQsIFJFR19WUkVGLCAmdik7CisJdiA9ICh2ICYgMHhmMCkgfCAoKHZzdG9wICYgMHgzKSA8PCAyKSB8ICh2c3RhcnQgJiAweDMpOworCW1zbGVlcCgxMCk7CisJcmV0ICs9IG92NzY3MF93cml0ZShjbGllbnQsIFJFR19WUkVGLCB2KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgb3Y3NjcwX2VudW1fZm10KHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQpCit7CisJc3RydWN0IG92NzY3MF9mb3JtYXRfc3RydWN0ICpvZm10OworCisJaWYgKGZtdC0+aW5kZXggPj0gTl9PVjc2NzBfRk1UUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvZm10ID0gb3Y3NjcwX2Zvcm1hdHMgKyBmbXQtPmluZGV4OworCWZtdC0+ZmxhZ3MgPSAwOworCXN0cmNweShmbXQtPmRlc2NyaXB0aW9uLCBvZm10LT5kZXNjKTsKKwlmbXQtPnBpeGVsZm9ybWF0ID0gb2ZtdC0+cGl4ZWxmb3JtYXQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBvdjc2NzBfdHJ5X2ZtdChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQsCisJCXN0cnVjdCBvdjc2NzBfZm9ybWF0X3N0cnVjdCAqKnJldF9mbXQsCisJCXN0cnVjdCBvdjc2NzBfd2luX3NpemUgKipyZXRfd3NpemUpCit7CisJaW50IGluZGV4OworCXN0cnVjdCBvdjc2NzBfd2luX3NpemUgKndzaXplOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmbXQtPmZtdC5waXg7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOX09WNzY3MF9GTVRTOyBpbmRleCsrKQorCQlpZiAob3Y3NjcwX2Zvcm1hdHNbaW5kZXhdLnBpeGVsZm9ybWF0ID09IHBpeC0+cGl4ZWxmb3JtYXQpCisJCQlicmVhazsKKwlpZiAoaW5kZXggPj0gTl9PVjc2NzBfRk1UUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJldF9mbXQgIT0gTlVMTCkKKwkJKnJldF9mbXQgPSBvdjc2NzBfZm9ybWF0cyArIGluZGV4OworCS8qCisJICogRmllbGRzOiB0aGUgT1YgZGV2aWNlcyBjbGFpbSB0byBiZSBwcm9ncmVzc2l2ZS4KKwkgKi8KKwlpZiAocGl4LT5maWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkKKwkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwllbHNlIGlmIChwaXgtPmZpZWxkICE9IFY0TDJfRklFTERfTk9ORSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBSb3VuZCByZXF1ZXN0ZWQgaW1hZ2Ugc2l6ZSBkb3duIHRvIHRoZSBuZWFyZXN0CisJICogd2Ugc3VwcG9ydCwgYnV0IG5vdCBiZWxvdyB0aGUgc21hbGxlc3QuCisJICovCisJZm9yICh3c2l6ZSA9IG92NzY3MF93aW5fc2l6ZXM7IHdzaXplIDwgb3Y3NjcwX3dpbl9zaXplcyArIE5fV0lOX1NJWkVTOworCSAgICAgd3NpemUrKykKKwkJaWYgKHBpeC0+d2lkdGggPj0gd3NpemUtPndpZHRoICYmIHBpeC0+aGVpZ2h0ID49IHdzaXplLT5oZWlnaHQpCisJCQlicmVhazsKKwlpZiAod3NpemUgPj0gb3Y3NjcwX3dpbl9zaXplcyArIE5fV0lOX1NJWkVTKQorCQl3c2l6ZS0tOyAgIC8qIFRha2UgdGhlIHNtYWxsZXN0IG9uZSAqLworCWlmIChyZXRfd3NpemUgIT0gTlVMTCkKKwkJKnJldF93c2l6ZSA9IHdzaXplOworCS8qCisJICogTm90ZSB0aGUgc2l6ZSB3ZSdsbCBhY3R1YWxseSBoYW5kbGUuCisJICovCisJcGl4LT53aWR0aCA9IHdzaXplLT53aWR0aDsKKwlwaXgtPmhlaWdodCA9IHdzaXplLT5oZWlnaHQ7CisJcGl4LT5ieXRlc3BlcmxpbmUgPSBwaXgtPndpZHRoKkJZVEVTX1BFUl9QSVhFTDsKKwlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0KnBpeC0+Ynl0ZXNwZXJsaW5lOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGEgZm9ybWF0LgorICovCitzdGF0aWMgaW50IG92NzY3MF9zX2ZtdChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb3Y3NjcwX2Zvcm1hdF9zdHJ1Y3QgKm92Zm10OworCXN0cnVjdCBvdjc2NzBfd2luX3NpemUgKndzaXplOworCXN0cnVjdCBvdjc2NzBfaW5mbyAqaW5mbyA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwl1bnNpZ25lZCBjaGFyIGNvbTc7CisKKwlyZXQgPSBvdjc2NzBfdHJ5X2ZtdChjLCBmbXQsICZvdmZtdCwgJndzaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qCisJICogQ09NNyBpcyBhIHBhaW4gaW4gdGhlIGFzcywgaXQgZG9lc24ndCBsaWtlIHRvIGJlIHJlYWQgdGhlbgorCSAqIHF1aWNrbHkgd3JpdHRlbiBhZnRlcndhcmQuICBCdXQgd2UgaGF2ZSBldmVyeXRoaW5nIHdlIG5lZWQKKwkgKiB0byBzZXQgaXQgYWJzb2x1dGVseSBoZXJlLCBhcyBsb25nIGFzIHRoZSBmb3JtYXQtc3BlY2lmaWMKKwkgKiByZWdpc3RlciBzZXRzIGxpc3QgaXQgZmlyc3QuCisJICovCisJY29tNyA9IG92Zm10LT5yZWdzWzBdLnZhbHVlOworCWNvbTcgfD0gd3NpemUtPmNvbTdfYml0OworCW92NzY3MF93cml0ZShjLCBSRUdfQ09NNywgY29tNyk7CisJLyoKKwkgKiBOb3cgd3JpdGUgdGhlIHJlc3Qgb2YgdGhlIGFycmF5LiAgQWxzbyBzdG9yZSBzdGFydC9zdG9wcworCSAqLworCW92NzY3MF93cml0ZV9hcnJheShjLCBvdmZtdC0+cmVncyArIDEpOworCW92NzY3MF9zZXRfaHcoYywgd3NpemUtPmhzdGFydCwgd3NpemUtPmhzdG9wLCB3c2l6ZS0+dnN0YXJ0LAorCQkJd3NpemUtPnZzdG9wKTsKKwlyZXQgPSAwOworCWlmICh3c2l6ZS0+cmVncykKKwkJcmV0ID0gb3Y3NjcwX3dyaXRlX2FycmF5KGMsIHdzaXplLT5yZWdzKTsKKwlpbmZvLT5mbXQgPSBvdmZtdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEltcGxlbWVudCBHL1NfUEFSTS4gIFRoZXJlIGlzIGEgImhpZ2ggcXVhbGl0eSIgbW9kZSB3ZSBjb3VsZCB0cnkKKyAqIHRvIGRvIHNvbWVkYXk7IGZvciBub3csIHdlIGp1c3QgZG8gdGhlIGZyYW1lIHJhdGUgdHdlYWsuCisgKi8KK3N0YXRpYyBpbnQgb3Y3NjcwX2dfcGFybShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gKmNwID0gJnBhcm1zLT5wYXJtLmNhcHR1cmU7CisJdW5zaWduZWQgY2hhciBjbGtyYzsKKwlpbnQgcmV0OworCisJaWYgKHBhcm1zLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gb3Y3NjcwX3JlYWQoYywgUkVHX0NMS1JDLCAmY2xrcmMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCW1lbXNldChjcCwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2NhcHR1cmVwYXJtKSk7CisJY3AtPmNhcGFiaWxpdHkgPSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7CisJY3AtPnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxOworCWNwLT50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSBPVjc2NzBfRlJBTUVfUkFURTsKKwlpZiAoKGNsa3JjICYgQ0xLX0VYVCkgPT0gMCAmJiAoY2xrcmMgJiBDTEtfU0NBTEUpID4gMSkKKwkJY3AtPnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciAvPSAoY2xrcmMgJiBDTEtfU0NBTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NzY3MF9zX3Bhcm0oc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQoreworCXN0cnVjdCB2NGwyX2NhcHR1cmVwYXJtICpjcCA9ICZwYXJtcy0+cGFybS5jYXB0dXJlOworCXN0cnVjdCB2NGwyX2ZyYWN0ICp0cGYgPSAmY3AtPnRpbWVwZXJmcmFtZTsKKwl1bnNpZ25lZCBjaGFyIGNsa3JjOworCWludCByZXQsIGRpdjsKKworCWlmIChwYXJtcy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjcC0+ZXh0ZW5kZWRtb2RlICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogQ0xLUkMgaGFzIGEgcmVzZXJ2ZWQgYml0LCBzbyBsZXQncyBwcmVzZXJ2ZSBpdC4KKwkgKi8KKwlyZXQgPSBvdjc2NzBfcmVhZChjLCBSRUdfQ0xLUkMsICZjbGtyYyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHRwZi0+bnVtZXJhdG9yID09IDAgfHwgdHBmLT5kZW5vbWluYXRvciA9PSAwKQorCQlkaXYgPSAxOyAgLyogUmVzZXQgdG8gZnVsbCByYXRlICovCisJZWxzZQorCQlkaXYgPSAodHBmLT5udW1lcmF0b3IqT1Y3NjcwX0ZSQU1FX1JBVEUpL3RwZi0+ZGVub21pbmF0b3I7CisJaWYgKGRpdiA9PSAwKQorCQlkaXYgPSAxOworCWVsc2UgaWYgKGRpdiA+IENMS19TQ0FMRSkKKwkJZGl2ID0gQ0xLX1NDQUxFOworCWNsa3JjID0gKGNsa3JjICYgMHg4MCkgfCBkaXY7CisJdHBmLT5udW1lcmF0b3IgPSAxOworCXRwZi0+ZGVub21pbmF0b3IgPSBPVjc2NzBfRlJBTUVfUkFURS9kaXY7CisJcmV0dXJuIG92NzY3MF93cml0ZShjLCBSRUdfQ0xLUkMsIGNsa3JjKTsKK30KKworCisKKy8qCisgKiBDb2RlIGZvciBkZWFsaW5nIHdpdGggY29udHJvbHMuCisgKi8KKworCisKKworCitzdGF0aWMgaW50IG92NzY3MF9zdG9yZV9jbWF0cml4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWludCBtYXRyaXhbQ01BVFJJWF9MRU5dKQoreworCWludCBpLCByZXQ7CisJdW5zaWduZWQgY2hhciBzaWduYml0czsKKworCS8qCisJICogV2VpcmQgY3JhcCBzZWVtcyB0byBleGlzdCBpbiB0aGUgdXBwZXIgcGFydCBvZgorCSAqIHRoZSBzaWduIGJpdHMgcmVnaXN0ZXIsIHNvIGxldCdzIHByZXNlcnZlIGl0LgorCSAqLworCXJldCA9IG92NzY3MF9yZWFkKGNsaWVudCwgUkVHX0NNQVRSSVhfU0lHTiwgJnNpZ25iaXRzKTsKKwlzaWduYml0cyAmPSAweGMwOworCisJZm9yIChpID0gMDsgaSA8IENNQVRSSVhfTEVOOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciByYXc7CisKKwkJaWYgKG1hdHJpeFtpXSA8IDApIHsKKwkJCXNpZ25iaXRzIHw9ICgxIDw8IGkpOworCQkJaWYgKG1hdHJpeFtpXSA8IC0yNTUpCisJCQkJcmF3ID0gMHhmZjsKKwkJCWVsc2UKKwkJCQlyYXcgPSAoLTEgKiBtYXRyaXhbaV0pICYgMHhmZjsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChtYXRyaXhbaV0gPiAyNTUpCisJCQkJcmF3ID0gMHhmZjsKKwkJCWVsc2UKKwkJCQlyYXcgPSBtYXRyaXhbaV0gJiAweGZmOworCQl9CisJCXJldCArPSBvdjc2NzBfd3JpdGUoY2xpZW50LCBSRUdfQ01BVFJJWF9CQVNFICsgaSwgcmF3KTsKKwl9CisJcmV0ICs9IG92NzY3MF93cml0ZShjbGllbnQsIFJFR19DTUFUUklYX1NJR04sIHNpZ25iaXRzKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBIdWUgYWxzbyByZXF1aXJlcyBtZXNzaW5nIHdpdGggdGhlIGNvbG9yIG1hdHJpeC4gIEl0IGFsc28gcmVxdWlyZXMKKyAqIHRyaWcgZnVuY3Rpb25zLCB3aGljaCB0ZW5kIG5vdCB0byBiZSB3ZWxsIHN1cHBvcnRlZCBpbiB0aGUga2VybmVsLgorICogU28gaGVyZSBpcyBhIHNpbXBsZSB0YWJsZSBvZiBzaW5lIHZhbHVlcywgMC05MCBkZWdyZWVzLCBpbiBzdGVwcworICogb2YgZml2ZSBkZWdyZWVzLiAgVmFsdWVzIGFyZSBtdWx0aXBsaWVkIGJ5IDEwMDAuCisgKgorICogVGhlIGZvbGxvd2luZyBuYWl2ZSBhcHByb3hpbWF0ZSB0cmlnIGZ1bmN0aW9ucyByZXF1aXJlIGFuIGFyZ3VtZW50CisgKiBjYXJlZnVsbHkgbGltaXRlZCB0byAtMTgwIDw9IHRoZXRhIDw9IDE4MC4KKyAqLworI2RlZmluZSBTSU5fU1RFUCA1CitzdGF0aWMgY29uc3QgaW50IG92NzY3MF9zaW5fdGFibGVbXSA9IHsKKwkgICAwLAkgODcsICAgMTczLCAgIDI1OCwgICAzNDIsICAgNDIyLAorCSA0OTksCTU3MywgICA2NDIsICAgNzA3LCAgIDc2NiwgICA4MTksCisJIDg2NiwJOTA2LCAgIDkzOSwgICA5NjUsICAgOTg0LCAgIDk5NiwKKwkxMDAwCit9OworCitzdGF0aWMgaW50IG92NzY3MF9zaW5lKGludCB0aGV0YSkKK3sKKwlpbnQgY2hzID0gMTsKKwlpbnQgc2luZTsKKworCWlmICh0aGV0YSA8IDApIHsKKwkJdGhldGEgPSAtdGhldGE7CisJCWNocyA9IC0xOworCX0KKwlpZiAodGhldGEgPD0gOTApCisJCXNpbmUgPSBvdjc2NzBfc2luX3RhYmxlW3RoZXRhL1NJTl9TVEVQXTsKKwllbHNlIHsKKwkJdGhldGEgLT0gOTA7CisJCXNpbmUgPSAxMDAwIC0gb3Y3NjcwX3Npbl90YWJsZVt0aGV0YS9TSU5fU1RFUF07CisJfQorCXJldHVybiBzaW5lKmNoczsKK30KKworc3RhdGljIGludCBvdjc2NzBfY29zaW5lKGludCB0aGV0YSkKK3sKKwl0aGV0YSA9IDkwIC0gdGhldGE7CisJaWYgKHRoZXRhID4gMTgwKQorCQl0aGV0YSAtPSAzNjA7CisJZWxzZSBpZiAodGhldGEgPCAtMTgwKQorCQl0aGV0YSArPSAzNjA7CisJcmV0dXJuIG92NzY3MF9zaW5lKHRoZXRhKTsKK30KKworCisKKworc3RhdGljIHZvaWQgb3Y3NjcwX2NhbGNfY21hdHJpeChzdHJ1Y3Qgb3Y3NjcwX2luZm8gKmluZm8sCisJCWludCBtYXRyaXhbQ01BVFJJWF9MRU5dKQoreworCWludCBpOworCS8qCisJICogQXBwbHkgdGhlIGN1cnJlbnQgc2F0dXJhdGlvbiBzZXR0aW5nIGZpcnN0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBDTUFUUklYX0xFTjsgaSsrKQorCQltYXRyaXhbaV0gPSAoaW5mby0+Zm10LT5jbWF0cml4W2ldKmluZm8tPnNhdCkgPj4gNzsKKwkvKgorCSAqIFRoZW4sIGlmIG5lZWQgYmUsIHJvdGF0ZSB0aGUgaHVlIHZhbHVlLgorCSAqLworCWlmIChpbmZvLT5odWUgIT0gMCkgeworCQlpbnQgc2ludGgsIGNvc3RoLCB0bXBtYXRyaXhbQ01BVFJJWF9MRU5dOworCisJCW1lbWNweSh0bXBtYXRyaXgsIG1hdHJpeCwgQ01BVFJJWF9MRU4qc2l6ZW9mKGludCkpOworCQlzaW50aCA9IG92NzY3MF9zaW5lKGluZm8tPmh1ZSk7CisJCWNvc3RoID0gb3Y3NjcwX2Nvc2luZShpbmZvLT5odWUpOworCisJCW1hdHJpeFswXSA9IChtYXRyaXhbM10qc2ludGggKyBtYXRyaXhbMF0qY29zdGgpLzEwMDA7CisJCW1hdHJpeFsxXSA9IChtYXRyaXhbNF0qc2ludGggKyBtYXRyaXhbMV0qY29zdGgpLzEwMDA7CisJCW1hdHJpeFsyXSA9IChtYXRyaXhbNV0qc2ludGggKyBtYXRyaXhbMl0qY29zdGgpLzEwMDA7CisJCW1hdHJpeFszXSA9IChtYXRyaXhbM10qY29zdGggLSBtYXRyaXhbMF0qc2ludGgpLzEwMDA7CisJCW1hdHJpeFs0XSA9IChtYXRyaXhbNF0qY29zdGggLSBtYXRyaXhbMV0qc2ludGgpLzEwMDA7CisJCW1hdHJpeFs1XSA9IChtYXRyaXhbNV0qY29zdGggLSBtYXRyaXhbMl0qc2ludGgpLzEwMDA7CisJfQorfQorCisKKworc3RhdGljIGludCBvdjc2NzBfdF9zYXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBvdjc2NzBfaW5mbyAqaW5mbyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBtYXRyaXhbQ01BVFJJWF9MRU5dOworCWludCByZXQ7CisKKwlpbmZvLT5zYXQgPSB2YWx1ZTsKKwlvdjc2NzBfY2FsY19jbWF0cml4KGluZm8sIG1hdHJpeCk7CisJcmV0ID0gb3Y3NjcwX3N0b3JlX2NtYXRyaXgoY2xpZW50LCBtYXRyaXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y3NjcwX3Ffc2F0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIF9fczMyICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgb3Y3NjcwX2luZm8gKmluZm8gPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCSp2YWx1ZSA9IGluZm8tPnNhdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjc2NzBfdF9odWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBvdjc2NzBfaW5mbyAqaW5mbyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBtYXRyaXhbQ01BVFJJWF9MRU5dOworCWludCByZXQ7CisKKwlpZiAodmFsdWUgPCAtMTgwIHx8IHZhbHVlID4gMTgwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpbmZvLT5odWUgPSB2YWx1ZTsKKwlvdjc2NzBfY2FsY19jbWF0cml4KGluZm8sIG1hdHJpeCk7CisJcmV0ID0gb3Y3NjcwX3N0b3JlX2NtYXRyaXgoY2xpZW50LCBtYXRyaXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBvdjc2NzBfcV9odWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgX19zMzIgKnZhbHVlKQoreworCXN0cnVjdCBvdjc2NzBfaW5mbyAqaW5mbyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJKnZhbHVlID0gaW5mby0+aHVlOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBTb21lIHdlaXJkIHJlZ2lzdGVycyBzZWVtIHRvIHN0b3JlIHZhbHVlcyBpbiBhIHNpZ24vbWFnbml0dWRlIGZvcm1hdCEKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgb3Y3NjcwX3NtX3RvX2Ficyh1bnNpZ25lZCBjaGFyIHYpCit7CisJaWYgKCh2ICYgMHg4MCkgPT0gMCkKKwkJcmV0dXJuIHYgKyAxMjg7CisJZWxzZQorCQlyZXR1cm4gMTI4IC0gKHYgJiAweDdmKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgY2hhciBvdjc2NzBfYWJzX3RvX3NtKHVuc2lnbmVkIGNoYXIgdikKK3sKKwlpZiAodiA+IDEyNykKKwkJcmV0dXJuIHYgJiAweDdmOworCWVsc2UKKwkJcmV0dXJuICgxMjggLSB2KSB8IDB4ODA7Cit9CisKK3N0YXRpYyBpbnQgb3Y3NjcwX3RfYnJpZ2h0bmVzcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBjb204LCB2OworCWludCByZXQ7CisKKwlvdjc2NzBfcmVhZChjbGllbnQsIFJFR19DT004LCAmY29tOCk7CisJY29tOCAmPSB+Q09NOF9BRUM7CisJb3Y3NjcwX3dyaXRlKGNsaWVudCwgUkVHX0NPTTgsIGNvbTgpOworCXYgPSBvdjc2NzBfYWJzX3RvX3NtKHZhbHVlKTsKKwlyZXQgPSBvdjc2NzBfd3JpdGUoY2xpZW50LCBSRUdfQlJJR0hULCB2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92NzY3MF9xX2JyaWdodG5lc3Moc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgX19zMzIgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgdjsKKwlpbnQgcmV0ID0gb3Y3NjcwX3JlYWQoY2xpZW50LCBSRUdfQlJJR0hULCAmdik7CisKKwkqdmFsdWUgPSBvdjc2NzBfc21fdG9fYWJzKHYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y3NjcwX3RfY29udHJhc3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHZhbHVlKQoreworCXJldHVybiBvdjc2NzBfd3JpdGUoY2xpZW50LCBSRUdfQ09OVFJBUywgKHVuc2lnbmVkIGNoYXIpIHZhbHVlKTsKK30KKworc3RhdGljIGludCBvdjc2NzBfcV9jb250cmFzdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBfX3MzMiAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciB2OworCWludCByZXQgPSBvdjc2NzBfcmVhZChjbGllbnQsIFJFR19DT05UUkFTLCAmdik7CisKKwkqdmFsdWUgPSB2OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y3NjcwX3FfaGZsaXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgX19zMzIgKnZhbHVlKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciB2OworCisJcmV0ID0gb3Y3NjcwX3JlYWQoY2xpZW50LCBSRUdfTVZGUCwgJnYpOworCSp2YWx1ZSA9ICh2ICYgTVZGUF9NSVJST1IpID09IE1WRlBfTUlSUk9SOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBvdjc2NzBfdF9oZmxpcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciB2OworCWludCByZXQ7CisKKwlyZXQgPSBvdjc2NzBfcmVhZChjbGllbnQsIFJFR19NVkZQLCAmdik7CisJaWYgKHZhbHVlKQorCQl2IHw9IE1WRlBfTUlSUk9SOworCWVsc2UKKwkJdiAmPSB+TVZGUF9NSVJST1I7CisJbXNsZWVwKDEwKTsgIC8qIEZJWE1FICovCisJcmV0ICs9IG92NzY3MF93cml0ZShjbGllbnQsIFJFR19NVkZQLCB2KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIGludCBvdjc2NzBfcV92ZmxpcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBfX3MzMiAqdmFsdWUpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIHY7CisKKwlyZXQgPSBvdjc2NzBfcmVhZChjbGllbnQsIFJFR19NVkZQLCAmdik7CisJKnZhbHVlID0gKHYgJiBNVkZQX0ZMSVApID09IE1WRlBfRkxJUDsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgb3Y3NjcwX3RfdmZsaXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgdjsKKwlpbnQgcmV0OworCisJcmV0ID0gb3Y3NjcwX3JlYWQoY2xpZW50LCBSRUdfTVZGUCwgJnYpOworCWlmICh2YWx1ZSkKKwkJdiB8PSBNVkZQX0ZMSVA7CisJZWxzZQorCQl2ICY9IH5NVkZQX0ZMSVA7CisJbXNsZWVwKDEwKTsgIC8qIEZJWE1FICovCisJcmV0ICs9IG92NzY3MF93cml0ZShjbGllbnQsIFJFR19NVkZQLCB2KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgb3Y3NjcwX2NvbnRyb2wgeworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxYzsKKwlpbnQgKCpxdWVyeSkoc3RydWN0IGkyY19jbGllbnQgKmMsIF9fczMyICp2YWx1ZSk7CisJaW50ICgqdHdlYWspKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBpbnQgdmFsdWUpOworfSBvdjc2NzBfY29udHJvbHNbXSA9Cit7CisJeworCQkucWMgPSB7CisJCQkuaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiQnJpZ2h0bmVzcyIsCisJCQkubWluaW11bSA9IDAsCisJCQkubWF4aW11bSA9IDI1NSwKKwkJCS5zdGVwID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHg4MCwKKwkJCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUgorCQl9LAorCQkudHdlYWsgPSBvdjc2NzBfdF9icmlnaHRuZXNzLAorCQkucXVlcnkgPSBvdjc2NzBfcV9icmlnaHRuZXNzLAorCX0sCisJeworCQkucWMgPSB7CisJCQkuaWQgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIkNvbnRyYXN0IiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMTI3LAorCQkJLnN0ZXAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDQwLCAgIC8qIFhYWCBvdjc2NzAgc3BlYyAqLworCQkJLmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSCisJCX0sCisJCS50d2VhayA9IG92NzY3MF90X2NvbnRyYXN0LAorCQkucXVlcnkgPSBvdjc2NzBfcV9jb250cmFzdCwKKwl9LAorCXsKKwkJLnFjID0geworCQkJLmlkID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIlNhdHVyYXRpb24iLAorCQkJLm1pbmltdW0gPSAwLAorCQkJLm1heGltdW0gPSAyNTYsCisJCQkuc3RlcCA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4ODAsCisJCQkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19TTElERVIKKwkJfSwKKwkJLnR3ZWFrID0gb3Y3NjcwX3Rfc2F0LAorCQkucXVlcnkgPSBvdjc2NzBfcV9zYXQsCisJfSwKKwl7CisJCS5xYyA9IHsKKwkJCS5pZCA9IFY0TDJfQ0lEX0hVRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIkhVRSIsCisJCQkubWluaW11bSA9IC0xODAsCisJCQkubWF4aW11bSA9IDE4MCwKKwkJCS5zdGVwID0gNSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJCS5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUgorCQl9LAorCQkudHdlYWsgPSBvdjc2NzBfdF9odWUsCisJCS5xdWVyeSA9IG92NzY3MF9xX2h1ZSwKKwl9LAorCXsKKwkJLnFjID0geworCQkJLmlkID0gVjRMMl9DSURfVkZMSVAsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSA9ICJWZXJ0aWNhbCBmbGlwIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMSwKKwkJCS5zdGVwID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJfSwKKwkJLnR3ZWFrID0gb3Y3NjcwX3RfdmZsaXAsCisJCS5xdWVyeSA9IG92NzY3MF9xX3ZmbGlwLAorCX0sCisJeworCQkucWMgPSB7CisJCQkuaWQgPSBWNEwyX0NJRF9IRkxJUCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lID0gIkhvcml6b250YWwgbWlycm9yIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMSwKKwkJCS5zdGVwID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJfSwKKwkJLnR3ZWFrID0gb3Y3NjcwX3RfaGZsaXAsCisJCS5xdWVyeSA9IG92NzY3MF9xX2hmbGlwLAorCX0sCit9OworI2RlZmluZSBOX0NPTlRST0xTIChzaXplb2Yob3Y3NjcwX2NvbnRyb2xzKS9zaXplb2Yob3Y3NjcwX2NvbnRyb2xzWzBdKSkKKworc3RhdGljIHN0cnVjdCBvdjc2NzBfY29udHJvbCAqb3Y3NjcwX2ZpbmRfY29udHJvbChfX3UzMiBpZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOX0NPTlRST0xTOyBpKyspCisJCWlmIChvdjc2NzBfY29udHJvbHNbaV0ucWMuaWQgPT0gaWQpCisJCQlyZXR1cm4gb3Y3NjcwX2NvbnRyb2xzICsgaTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgaW50IG92NzY3MF9xdWVyeWN0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlzdHJ1Y3Qgb3Y3NjcwX2NvbnRyb2wgKmN0cmwgPSBvdjc2NzBfZmluZF9jb250cm9sKHFjLT5pZCk7CisKKwlpZiAoY3RybCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqcWMgPSBjdHJsLT5xYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjc2NzBfZ19jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IG92NzY3MF9jb250cm9sICpvY3RybCA9IG92NzY3MF9maW5kX2NvbnRyb2woY3RybC0+aWQpOworCWludCByZXQ7CisKKwlpZiAob2N0cmwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gb2N0cmwtPnF1ZXJ5KGNsaWVudCwgJmN0cmwtPnZhbHVlKTsKKwlpZiAocmV0ID49IDApCisJCXJldHVybiAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y3NjcwX3NfY3RybChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBvdjc2NzBfY29udHJvbCAqb2N0cmwgPSBvdjc2NzBfZmluZF9jb250cm9sKGN0cmwtPmlkKTsKKwlpbnQgcmV0OworCisJaWYgKG9jdHJsID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9ICBvY3RybC0+dHdlYWsoY2xpZW50LCBjdHJsLT52YWx1ZSk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OworfQorCisKKworCisKKworLyoKKyAqIEJhc2ljIGkyYyBzdHVmZi4KKyAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92NzY3MF9kcml2ZXI7CisKK3N0YXRpYyBpbnQgb3Y3NjcwX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBvdjc2NzBfaW5mbyAqaW5mbzsKKworCS8qCisJICogRm9yIG5vdzogb25seSBkZWFsIHdpdGggYWRhcHRlcnMgd2UgcmVjb2duaXplLgorCSAqLworCWlmIChhZGFwdGVyLT5pZCAhPSBJMkNfSFdfU01CVVNfQ0FGRSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljbGllbnQgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISBjbGllbnQpCisJCXJldHVybiAtRU5PTUVNOworCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJY2xpZW50LT5hZGRyID0gT1Y3NjcwX0kyQ19BRERSOworCWNsaWVudC0+ZHJpdmVyID0gJm92NzY3MF9kcml2ZXIsCisJc3RyY3B5KGNsaWVudC0+bmFtZSwgIk9WNzY3MCIpOworCS8qCisJICogU2V0IHVwIG91ciBpbmZvIHN0cnVjdHVyZS4KKwkgKi8KKwlpbmZvID0ga3phbGxvYyhzaXplb2YgKHN0cnVjdCBvdjc2NzBfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghIGluZm8pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJaW5mby0+Zm10ID0gJm92NzY3MF9mb3JtYXRzWzBdOworCWluZm8tPnNhdCA9IDEyODsJLyogUmV2aWV3IHRoaXMgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmZvKTsKKworCS8qCisJICogTWFrZSBzdXJlIGl0J3MgYW4gb3Y3NjcwCisJICovCisJcmV0ID0gb3Y3NjcwX2RldGVjdChjbGllbnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWVfaW5mbzsKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXJldHVybiAwOworCisgIG91dF9mcmVlX2luZm86CisJa2ZyZWUoaW5mbyk7CisgIG91dF9mcmVlOgorCWtmcmVlKGNsaWVudCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG92NzY3MF9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlrZnJlZShjbGllbnQpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgb3Y3NjcwX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdm9pZCAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfSU5UX0dfQ0hJUF9JREVOVDoKKwkJKiAoZW51bSB2NGwyX2NoaXBfaWRlbnQgKikgYXJnID0gVjRMMl9JREVOVF9PVjc2NzA7CisJCXJldHVybiAwOworCisJY2FzZSBWSURJT0NfSU5UX1JFU0VUOgorCQlvdjc2NzBfcmVzZXQoY2xpZW50KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFZJRElPQ19JTlRfSU5JVDoKKwkJcmV0dXJuIG92NzY3MF9pbml0KGNsaWVudCk7CisKKwljYXNlIFZJRElPQ19FTlVNX0ZNVDoKKwkJcmV0dXJuIG92NzY3MF9lbnVtX2ZtdChjbGllbnQsIChzdHJ1Y3QgdjRsMl9mbXRkZXNjICopIGFyZyk7CisJY2FzZSBWSURJT0NfVFJZX0ZNVDoKKwkJcmV0dXJuIG92NzY3MF90cnlfZm10KGNsaWVudCwgKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKSBhcmcsIE5VTEwsIE5VTEwpOworCWNhc2UgVklESU9DX1NfRk1UOgorCQlyZXR1cm4gb3Y3NjcwX3NfZm10KGNsaWVudCwgKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKSBhcmcpOworCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwkJcmV0dXJuIG92NzY3MF9xdWVyeWN0cmwoY2xpZW50LCAoc3RydWN0IHY0bDJfcXVlcnljdHJsICopIGFyZyk7CisJY2FzZSBWSURJT0NfU19DVFJMOgorCQlyZXR1cm4gb3Y3NjcwX3NfY3RybChjbGllbnQsIChzdHJ1Y3QgdjRsMl9jb250cm9sICopIGFyZyk7CisJY2FzZSBWSURJT0NfR19DVFJMOgorCQlyZXR1cm4gb3Y3NjcwX2dfY3RybChjbGllbnQsIChzdHJ1Y3QgdjRsMl9jb250cm9sICopIGFyZyk7CisJY2FzZSBWSURJT0NfU19QQVJNOgorCQlyZXR1cm4gb3Y3NjcwX3NfcGFybShjbGllbnQsIChzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICopIGFyZyk7CisJY2FzZSBWSURJT0NfR19QQVJNOgorCQlyZXR1cm4gb3Y3NjcwX2dfcGFybShjbGllbnQsIChzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICopIGFyZyk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92NzY3MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAib3Y3NjcwIiwKKwl9LAorCS5pZCAJCT0gSTJDX0RSSVZFUklEX09WNzY3MCwKKwkuY2xhc3MgCQk9IEkyQ19DTEFTU19DQU1fRElHSVRBTCwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBvdjc2NzBfYXR0YWNoLAorCS5kZXRhY2hfY2xpZW50CT0gb3Y3NjcwX2RldGFjaCwKKwkuY29tbWFuZAk9IG92NzY3MF9jb21tYW5kLAorfTsKKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG92NzY3MF9tb2RfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX05PVElDRSAiT21uaVZpc2lvbiBvdjc2NzAgc2Vuc29yIGRyaXZlciwgYXQgeW91ciBzZXJ2aWNlXG4iKTsKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm92NzY3MF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3Y3NjcwX21vZF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm92NzY3MF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvdjc2NzBfbW9kX2luaXQpOworbW9kdWxlX2V4aXQob3Y3NjcwX21vZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcGxhbmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcGxhbmIuYwppbmRleCAzNjhkNmUyLi44NmQyODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJKyBNQVhfTE5VTQogI2VuZGlmIC8qIFBMQU5CX0dTQ0FOTElORSAqLwogCQkpOwotCWlmICgocGItPnJhd2J1ZiA9ICh1bnNpZ25lZCBjaGFyKiopIGttYWxsb2MgKG5wYWdlCisJaWYgKChwYi0+cmF3YnVmID0ga21hbGxvYyhucGFnZQogCQkJCSogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKSkgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJZm9yIChpID0gMDsgaSA8IG5wYWdlOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWNvbnRleHQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWNvbnRleHQuYwppbmRleCBmMTI5ZjMxLi5jZjEyOTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1jb250ZXh0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItY29udGV4dC5jCkBAIC00NSwxNiArNDUsMjEgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBwdnIyX2NvbnRleHRfcG9sbChzdHJ1Y3QgcHZyMl9jb250ZXh0ICptcCkKK3N0YXRpYyB2b2lkIHB2cjJfY29udGV4dF9wb2xsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgcHZyMl9jb250ZXh0ICptcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcHZyMl9jb250ZXh0LCB3b3JrcG9sbCk7CiAJcHZyMl9jb250ZXh0X2VudGVyKG1wKTsgZG8gewogCQlwdnIyX2hkd19wb2xsKG1wLT5oZHcpOwogCX0gd2hpbGUgKDApOyBwdnIyX2NvbnRleHRfZXhpdChtcCk7CiB9CiAKIAotc3RhdGljIHZvaWQgcHZyMl9jb250ZXh0X3NldHVwKHN0cnVjdCBwdnIyX2NvbnRleHQgKm1wKQorc3RhdGljIHZvaWQgcHZyMl9jb250ZXh0X3NldHVwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgcHZyMl9jb250ZXh0ICptcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcHZyMl9jb250ZXh0LCB3b3JraW5pdCk7CisKIAlwdnIyX2NvbnRleHRfZW50ZXIobXApOyBkbyB7CiAJCWlmICghcHZyMl9oZHdfZGV2X29rKG1wLT5oZHcpKSBicmVhazsKIAkJcHZyMl9oZHdfc2V0dXAobXAtPmhkdyk7CkBAIC05Miw4ICs5Nyw4IEBACiAJfQogCiAJbXAtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJwdnJ1c2IyIik7Ci0JSU5JVF9XT1JLKCZtcC0+d29ya2luaXQsKHZvaWQgKCopKHZvaWQqKSlwdnIyX2NvbnRleHRfc2V0dXAsbXApOwotCUlOSVRfV09SSygmbXAtPndvcmtwb2xsLCh2b2lkICgqKSh2b2lkKikpcHZyMl9jb250ZXh0X3BvbGwsbXApOworCUlOSVRfV09SSygmbXAtPndvcmtpbml0LCBwdnIyX2NvbnRleHRfc2V0dXApOworCUlOSVRfV09SSygmbXAtPndvcmtwb2xsLCBwdnIyX2NvbnRleHRfcG9sbCk7CiAJcXVldWVfd29yayhtcC0+d29ya3F1ZXVlLCZtcC0+d29ya2luaXQpOwogIGRvbmU6CiAJcmV0dXJuIG1wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItY3gyNTg0eC12NGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWN4MjU4NHgtdjRsLmMKaW5kZXggZGY4ZmVhYy4uODQ4ZmIyMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWN4MjU4NHgtdjRsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItY3gyNTg0eC12NGwuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiBzdGF0aWMgdm9pZCBkZWNvZGVyX3Jlc2V0KHN0cnVjdCBwdnIyX3Y0bF9jeDI1ODR4ICpjdHh0KQogewogCWludCByZXQ7Ci0JcmV0ID0gcHZyMl9pMmNfY2xpZW50X2NtZChjdHh0LT5jbGllbnQsVklESU9DX0lOVF9SRVNFVCwwKTsKKwlyZXQgPSBwdnIyX2kyY19jbGllbnRfY21kKGN0eHQtPmNsaWVudCxWSURJT0NfSU5UX1JFU0VULE5VTEwpOwogCXB2cjJfdHJhY2UoUFZSMl9UUkFDRV9DSElQUywiaTJjIGN4MjU4NDAgZGVjb2Rlcl9yZXNldCAocmV0PSVkKSIscmV0KTsKIH0KIApAQCAtMjYwLDYgKzI2MCwyMiBAQAogCQkJCSAgc2l6ZW9mKGRlY29kZXJfb3BzWzBdKSkpIC0gMTsKIAloZHctPmRlY29kZXJfY3RybCA9ICZjdHh0LT5jdHJsOwogCWNwLT5oYW5kbGVyID0gJmN0eHQtPmhhbmRsZXI7CisJeworCQkvKgorCQkgIE1pa2UgSXNlbHkgPGlzZWx5QHBvYm94LmNvbT4gMTktTm92LTIwMDYgLSBUaGlzIGJpdAorCQkgIG9mIG51dHRpbmVzcyBmb3IgY3gyNTg0MCBjYXVzZXMgdGhhdCBtb2R1bGUgdG8KKwkJICBjb3JyZWN0bHkgc2V0IHVwIGl0cyB2aWRlbyBzY2FsaW5nLiAgVGhpcyBpcyByZWFsbHkKKwkJICBhIHByb2JsZW0gaW4gdGhlIGN4MjU4NDAgbW9kdWxlIGl0c2VsZiwgYnV0IHdlIHdvcmsKKwkJICBhcm91bmQgaXQgaGVyZS4gIFRoZSBwcm9ibGVtIGhhcyBub3QgYmVlbiBzZWVuIGluCisJCSAgaXZ0diBiZWNhdXNlIHRoZXJlIFZCSSBpcyBzdXBwb3J0ZWQgYW5kIHNldCB1cC4gIFdlCisJCSAgZG9uJ3QgZG8gVkJJIGhlcmUgKGF0IGxlYXN0IG5vdCB5ZXQpIGFuZCB0aHVzIHdlCisJCSAgbmV2ZXIgYXR0ZW1wdGVkIHRvIGV2ZW4gc2V0IGl0IHVwLgorCQkgKi8KKwkJc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKwkJbWVtc2V0KCZmbXQsMCxzaXplb2YoZm10KSk7CisJCWZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkU7CisJCXB2cjJfaTJjX2NsaWVudF9jbWQoY3R4dC0+Y2xpZW50LFZJRElPQ19TX0ZNVCwmZm10KTsKKwl9CiAJcHZyMl90cmFjZShQVlIyX1RSQUNFX0NISVBTLCJpMmMgMHgleCBjeDI1ODR4IFY0TDIgaGFuZGxlciBzZXQgdXAiLAogCQkgICBjcC0+Y2xpZW50LT5hZGRyKTsKIAlyZXR1cm4gITA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCmluZGV4IGY5MjBlMGMuLmQyMDA0OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCkBAIC0zNTYsMjggKzM1Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3RybF9ocmVzX21heF9nZXQoc3RydWN0IHB2cjJfY3RybCAqY3B0cixpbnQgKnZwKQotewotCS8qIElmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIDI0eHh4IGRldmljZSwgZm9yY2UgdGhlIGhvcml6b250YWwKLQkgICBtYXhpbXVtIHRvIGJlIDcyMCBubyBtYXR0ZXIgd2hhdCwgc2luY2Ugd2UgY2FuJ3QgZ2V0IHRoZSBkZXZpY2UKLQkgICB0byB3b3JrIHByb3Blcmx5IHdpdGggYW55IG90aGVyIHZhbHVlLiAgT3RoZXJ3aXNlIGp1c3QgcmV0dXJuCi0JICAgdGhlIG5vcm1hbCB2YWx1ZS4gKi8KLQkqdnAgPSBjcHRyLT5pbmZvLT5kZWYudHlwZV9pbnQubWF4X3ZhbHVlOwotCWlmIChjcHRyLT5oZHctPmhkd190eXBlID09IFBWUjJfSERXX1RZUEVfMjRYWFgpICp2cCA9IDcyMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjdHJsX2hyZXNfbWluX2dldChzdHJ1Y3QgcHZyMl9jdHJsICpjcHRyLGludCAqdnApCi17Ci0JLyogSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgMjR4eHggZGV2aWNlLCBmb3JjZSB0aGUgaG9yaXpvbnRhbAotCSAgIG1pbmltdW0gdG8gYmUgNzIwIG5vIG1hdHRlciB3aGF0LCBzaW5jZSB3ZSBjYW4ndCBnZXQgdGhlIGRldmljZQotCSAgIHRvIHdvcmsgcHJvcGVybHkgd2l0aCBhbnkgb3RoZXIgdmFsdWUuICBPdGhlcndpc2UganVzdCByZXR1cm4KLQkgICB0aGUgbm9ybWFsIHZhbHVlLiAqLwotCSp2cCA9IGNwdHItPmluZm8tPmRlZi50eXBlX2ludC5taW5fdmFsdWU7Ci0JaWYgKGNwdHItPmhkdy0+aGR3X3R5cGUgPT0gUFZSMl9IRFdfVFlQRV8yNFhYWCkgKnZwID0gNzIwOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGN0cmxfdnJlc19tYXhfZ2V0KHN0cnVjdCBwdnIyX2N0cmwgKmNwdHIsaW50ICp2cCkKIHsKIAkvKiBBY3R1YWwgbWF4aW11bSBkZXBlbmRzIG9uIHRoZSB2aWRlbyBzdGFuZGFyZCBpbiBlZmZlY3QuICovCkBAIC03NTgsMTAgKzczNiw2IEBACiAJCS5kZWZhdWx0X3ZhbHVlID0gNzIwLAogCQlERUZSRUYocmVzX2hvciksCiAJCURFRklOVCgxOSw3MjApLAotCQkvKiBIb29rIGluIGNoZWNrIGZvciBjbGFtcCBvbiBob3Jpem9udGFsIHJlc29sdXRpb24gaW4KLQkJICAgb3JkZXIgdG8gYXZvaWQgdW5zb2x2ZWQgcHJvYmxlbSBpbnZvbHZpbmcgY3gyNTg0MC4gKi8KLQkJLmdldF9tYXhfdmFsdWUgPSBjdHJsX2hyZXNfbWF4X2dldCwKLQkJLmdldF9taW5fdmFsdWUgPSBjdHJsX2hyZXNfbWluX2dldCwKIAl9LHsKIAkJLmRlc2MgPSAiVmVydGljYWwgY2FwdHVyZSByZXNvbHV0aW9uIiwKIAkJLm5hbWUgPSAicmVzb2x1dGlvbl92ZXIiLApAQCAtMTk1Myw4ICsxOTI3LDggQEAKIAlyZXR1cm4gaGR3OwogIGZhaWw6CiAJaWYgKGhkdykgewotCQlpZiAoaGR3LT5jdGxfcmVhZF91cmIpIHVzYl9mcmVlX3VyYihoZHctPmN0bF9yZWFkX3VyYik7Ci0JCWlmIChoZHctPmN0bF93cml0ZV91cmIpIHVzYl9mcmVlX3VyYihoZHctPmN0bF93cml0ZV91cmIpOworCQl1c2JfZnJlZV91cmIoaGR3LT5jdGxfcmVhZF91cmIpOworCQl1c2JfZnJlZV91cmIoaGR3LT5jdGxfd3JpdGVfdXJiKTsKIAkJaWYgKGhkdy0+Y3RsX3JlYWRfYnVmZmVyKSBrZnJlZShoZHctPmN0bF9yZWFkX2J1ZmZlcik7CiAJCWlmIChoZHctPmN0bF93cml0ZV9idWZmZXIpIGtmcmVlKGhkdy0+Y3RsX3dyaXRlX2J1ZmZlcik7CiAJCWlmIChoZHctPmNvbnRyb2xzKSBrZnJlZShoZHctPmNvbnRyb2xzKTsKQEAgLTI1NzUsMTIgKzI1NDksMTAgQEAKIAlzdHJ1Y3QgcHZyMl9oZHcgKmhkdyA9IChzdHJ1Y3QgcHZyMl9oZHcgKilkYXRhOwogCWlmIChoZHctPmN0bF93cml0ZV9wZW5kX2ZsYWcgfHwgaGR3LT5jdGxfcmVhZF9wZW5kX2ZsYWcpIHsKIAkJaGR3LT5jdGxfdGltZW91dF9mbGFnID0gITA7Ci0JCWlmIChoZHctPmN0bF93cml0ZV9wZW5kX2ZsYWcgJiYgaGR3LT5jdGxfd3JpdGVfdXJiKSB7CisJCWlmIChoZHctPmN0bF93cml0ZV9wZW5kX2ZsYWcpCiAJCQl1c2JfdW5saW5rX3VyYihoZHctPmN0bF93cml0ZV91cmIpOwotCQl9Ci0JCWlmIChoZHctPmN0bF9yZWFkX3BlbmRfZmxhZyAmJiBoZHctPmN0bF9yZWFkX3VyYikgeworCQlpZiAoaGR3LT5jdGxfcmVhZF9wZW5kX2ZsYWcpCiAJCQl1c2JfdW5saW5rX3VyYihoZHctPmN0bF9yZWFkX3VyYik7Ci0JCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY29yZS5jCmluZGV4IDNiOTAxMmY4ZTMuLmY5YmI0MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNvcmUuYwpAQCAtMTg1LDYgKzE4NSw3OSBAQAogCX0KIH0KIAorCisvKiBUaGlzIGlzIGEgc3BlY2lhbCBlbnRyeSBwb2ludCBmb3IgY2FzZXMgb2YgSTJDIHRyYW5zYWN0aW9uIGF0dGVtcHRzIHRvCisgICB0aGUgSVIgcmVjZWl2ZXIuICBUaGUgaW1wbGVtZW50YXRpb24gaGVyZSBzaW11bGF0ZXMgdGhlIElSIHJlY2VpdmVyIGJ5CisgICBpc3N1aW5nIGEgY29tbWFuZCB0byB0aGUgRlgyIGZpcm13YXJlIGFuZCB1c2luZyB0aGF0IHJlc3BvbnNlIHRvIHJldHVybgorICAgd2hhdCB0aGUgcmVhbCBJMkMgcmVjZWl2ZXIgd291bGQgaGF2ZSByZXR1cm5lZC4gIFdlIHVzZSB0aGlzIGZvciAyNHh4eAorICAgZGV2aWNlcywgd2hlcmUgdGhlIElSIHJlY2VpdmVyIGNoaXAgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aAorICAgRlgyIHJlbGF0ZWQgbG9naWMuICovCitzdGF0aWMgaW50IGkyY18yNHh4eF9pcihzdHJ1Y3QgcHZyMl9oZHcgKmhkdywKKwkJCXU4IGkyY19hZGRyLHU4ICp3ZGF0YSx1MTYgd2xlbix1OCAqcmRhdGEsdTE2IHJsZW4pCit7CisJdTggZGF0WzRdOworCXVuc2lnbmVkIGludCBzdGF0OworCisJaWYgKCEocmxlbiB8fCB3bGVuKSkgeworCQkvKiBUaGlzIGlzIGEgcHJvYmUgYXR0ZW1wdC4gIEp1c3QgbGV0IGl0IHN1Y2NlZWQuICovCisJCXJldHVybiAwOworCX0KKworCS8qIFdlIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBraW5kIG9mIHRyYW5zYWN0aW9uICovCisJaWYgKCh3bGVuICE9IDApIHx8IChybGVuID09IDApKSByZXR1cm4gLUVJTzsKKworCWlmIChybGVuIDwgMykgeworCQkvKiBNaWtlIElzZWx5IDxpc2VseUBwb2JveC5jb20+IEFwcGVhcnMgdG8gYmUgYSBwcm9iZQorCQkgICBhdHRlbXB0IGZyb20gbGlyYy4gIEp1c3QgZmlsbCBpbiB6ZXJvZXMgYW5kIHJldHVybi4gIElmCisJCSAgIHdlIHRyeSBpbnN0ZWFkIHRvIGRvIHRoZSBmdWxsIHRyYW5zYWN0aW9uIGhlcmUsIHRoZW4gYmFkCisJCSAgIHRoaW5ncyBzZWVtIHRvIGhhcHBlbiB3aXRoaW4gdGhlIGxpcmMgZHJpdmVyIG1vZHVsZQorCQkgICAodmVyc2lvbiAwLjguMC03IHNvdXJjZXMgZnJvbSBEZWJpYW4sIHdoZW4gcnVuIHVuZGVyCisJCSAgIHZhbmlsbGEgMi42LjE3LjYga2VybmVsKSAtIGFuZCBJIGRvbid0IGhhdmUgdGhlIHBhdGllbmNlCisJCSAgIHRvIGNoYXNlIGl0IGRvd24uICovCisJCWlmIChybGVuID4gMCkgcmRhdGFbMF0gPSAwOworCQlpZiAocmxlbiA+IDEpIHJkYXRhWzFdID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSXNzdWUgYSBjb21tYW5kIHRvIHRoZSBGWDIgdG8gcmVhZCB0aGUgSVIgcmVjZWl2ZXIuICovCisJTE9DS19UQUtFKGhkdy0+Y3RsX2xvY2spOyBkbyB7CisJCWhkdy0+Y21kX2J1ZmZlclswXSA9IDB4ZWM7CisJCXN0YXQgPSBwdnIyX3NlbmRfcmVxdWVzdChoZHcsCisJCQkJCSBoZHctPmNtZF9idWZmZXIsMSwKKwkJCQkJIGhkdy0+Y21kX2J1ZmZlciw0KTsKKwkJZGF0WzBdID0gaGR3LT5jbWRfYnVmZmVyWzBdOworCQlkYXRbMV0gPSBoZHctPmNtZF9idWZmZXJbMV07CisJCWRhdFsyXSA9IGhkdy0+Y21kX2J1ZmZlclsyXTsKKwkJZGF0WzNdID0gaGR3LT5jbWRfYnVmZmVyWzNdOworCX0gd2hpbGUgKDApOyBMT0NLX0dJVkUoaGR3LT5jdGxfbG9jayk7CisKKwkvKiBHaXZlIHVwIGlmIHRoYXQgb3BlcmF0aW9uIGZhaWxlZC4gKi8KKwlpZiAoc3RhdCAhPSAwKSByZXR1cm4gc3RhdDsKKworCS8qIE1hbmdsZSB0aGUgcmVzdWx0cyBpbnRvIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgdGhlIHJlYWwgSVIKKwkgICByZWNlaXZlci4gKi8KKwlyZGF0YVsyXSA9IDB4YzE7CisJaWYgKGRhdFswXSAhPSAxKSB7CisJCS8qIE5vIGNvZGUgcmVjZWl2ZWQuICovCisJCXJkYXRhWzBdID0gMDsKKwkJcmRhdGFbMV0gPSAwOworCX0gZWxzZSB7CisJCXUxNiB2YWw7CisJCS8qIE1hc2ggdGhlIEZYMiBmaXJtd2FyZS1wcm92aWRlZCBJUiBjb2RlIGludG8gc29tZXRoaW5nCisJCSAgIHRoYXQgdGhlIG5vcm1hbCBpMmMgY2hpcC1sZXZlbCBkcml2ZXIgZXhwZWN0cy4gKi8KKwkJdmFsID0gZGF0WzFdOworCQl2YWwgPDw9IDg7CisJCXZhbCB8PSBkYXRbMl07CisJCXZhbCA+Pj0gMTsKKwkJdmFsICY9IH4weDAwMDM7CisJCXZhbCB8PSAweDgwMDA7CisJCXJkYXRhWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmZ1OworCQlyZGF0YVsxXSA9IHZhbCAmIDB4ZmZ1OworCX0KKworCXJldHVybiAwOworfQorCiAvKiBUaGlzIGlzIGEgc3BlY2lhbCBlbnRyeSBwb2ludCB0aGF0IGlzIGVudGVyZWQgaWYgYW4gSTJDIG9wZXJhdGlvbiBpcwogICAgYXR0ZW1wdGVkIHRvIGEgd204Nzc1IGNoaXAgb24gbW9kZWwgMjR4eHggaGFyZHdhcmUuICBBdXRvZGV0ZWN0IG9mIHRoaXMKICAgIHBhcnQgZG9lc24ndCB3b3JrLCBidXQgd2Uga25vdyBpdCBpcyByZWFsbHkgdGhlcmUuICBTbyBsZXQncyBsb29rIGZvcgpAQCAtODg3LDE3ICs5NjAsMTcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaWR4OwogCi0JLy8gVGhlIGRlZmF1bHQgYWN0aW9uIGZvciBhbGwgcG9zc2libGUgSTJDIGFkZHJlc3NlcyBpcyBqdXN0IHRvIGRvCi0JLy8gdGhlIHRyYW5zZmVyIG5vcm1hbGx5LgorCS8qIFRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgYWxsIHBvc3NpYmxlIEkyQyBhZGRyZXNzZXMgaXMganVzdCB0byBkbworCSAgIHRoZSB0cmFuc2ZlciBub3JtYWxseS4gKi8KIAlmb3IgKGlkeCA9IDA7IGlkeCA8IFBWUjJfSTJDX0ZVTkNfQ05UOyBpZHgrKykgewogCQloZHctPmkyY19mdW5jW2lkeF0gPSBwdnIyX2kyY19iYXNpY19vcDsKIAl9CiAKLQkvLyBJZiBob3dldmVyIHdlJ3JlIGRlYWxpbmcgd2l0aCBuZXcgaGFyZHdhcmUsIGluc2VydCBzb21lIGhhY2tzIGluCi0JLy8gdGhlIEkyQyB0cmFuc2ZlciBzdGFjayB0byBsZXQgdGhpbmdzIHdvcmsgYmV0dGVyLgorCS8qIEhvd2V2ZXIsIGRlYWwgd2l0aCB2YXJpb3VzIHNwZWNpYWwgY2FzZXMgZm9yIDI0eHh4IGhhcmR3YXJlLiAqLwogCWlmIChoZHctPmhkd190eXBlID09IFBWUjJfSERXX1RZUEVfMjRYWFgpIHsKIAkJaGR3LT5pMmNfZnVuY1sweDFiXSA9IGkyY19oYWNrX3dtODc3NTsKIAkJaGR3LT5pMmNfZnVuY1sweDQ0XSA9IGkyY19oYWNrX2N4MjU4NDA7CisJCWhkdy0+aTJjX2Z1bmNbMHgxOF0gPSBpMmNfMjR4eHhfaXI7CiAJfQogCiAJLy8gQ29uZmlndXJlIHRoZSBhZGFwdGVyIGFuZCBzZXQgdXAgZXZlcnl0aGluZyBlbHNlIHJlbGF0ZWQgdG8gaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaW8uYwppbmRleCA3MGFhNjNlLi41N2ZiMzIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWlvLmMKQEAgLTI4OSw3ICsyODksNyBAQAogCXB2cjJfYnVmZmVyX3NldF9ub25lKGJwKTsKIAlicC0+c2lnbmF0dXJlID0gMDsKIAlicC0+c3RyZWFtID0gTlVMTDsKLQlpZiAoYnAtPnB1cmIpIHVzYl9mcmVlX3VyYihicC0+cHVyYik7CisJdXNiX2ZyZWVfdXJiKGJwLT5wdXJiKTsKIAlwdnIyX3RyYWNlKFBWUjJfVFJBQ0VfQlVGX1BPT0wsIi8qLS0tVFJBQ0VfRkxPVy0tLSovIgogCQkgICAiIGJ1ZmZlckRvbmUgICAgICVwIixicCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKaW5kZXggOTdlOTc0ZC4uYmI0MGU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYwpAQCAtNzExLDggKzcxMSw4IEBACiAJICAgICAgIGRpcC0+ZGV2YmFzZS5taW5vcixwdnIyX2NvbmZpZ19nZXRfbmFtZShkaXAtPmNvbmZpZykpOwogCiAJLyogUGFyYW5vaWEgKi8KLQlkaXAtPnY0bHAgPSAwOwotCWRpcC0+c3RyZWFtID0gMDsKKwlkaXAtPnY0bHAgPSBOVUxMOworCWRpcC0+c3RyZWFtID0gTlVMTDsKIAogCS8qIEFjdHVhbCBkZWFsbG9jYXRpb24gaGFwcGVucyBsYXRlciB3aGVuIGFsbCBpbnRlcm5hbCByZWZlcmVuY2VzCiAJICAgYXJlIGdvbmUuICovCkBAIC0xMDc2LDcgKzEwNzYsNyBAQAogCXZwLT52ZGV2ID0ga21hbGxvYyhzaXplb2YoKnZwLT52ZGV2KSxHRlBfS0VSTkVMKTsKIAlpZiAoIXZwLT52ZGV2KSB7CiAJCWtmcmVlKHZwKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBOVUxMOwogCX0KIAltZW1zZXQodnAtPnZkZXYsMCxzaXplb2YoKnZwLT52ZGV2KSk7CiAJcHZyMl9jaGFubmVsX2luaXQoJnZwLT5jaGFubmVsLG1ucCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCmluZGV4IGM3N2I4NWMuLmE5OTZhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCkBAIC04NjYsMTEgKzg2Niw5IEBACiAJfQogCWlmIChyZXQpIHsKIAkJLyogRGUtYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciAqLwotCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQlpZiAocGRldi0+c2J1ZltpXS51cmIgIT0gTlVMTCkKLQkJCQl1c2JfZnJlZV91cmIocGRldi0+c2J1ZltpXS51cmIpOworCQl3aGlsZSAoaS0tKSB7CisJCQl1c2JfZnJlZV91cmIocGRldi0+c2J1ZltpXS51cmIpOwogCQkJcGRldi0+c2J1ZltpXS51cmIgPSBOVUxMOwotCQkJaS0tOwogCQl9CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMTAyNCwxMiArMTAyMiwyNSBAQAogc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGJ1dHRvbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfc25hcHNob3RfYnV0dG9uX3N0YXR1cywKIAkJCSBOVUxMKTsKIAotc3RhdGljIHZvaWQgcHdjX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQorc3RhdGljIGludCBwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCiB7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCi0JCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFuX3RpbHQpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYnV0dG9uKTsKKwlpbnQgcmM7CisKKwlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYnV0dG9uKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkgeworCQlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCZjbGFzc19kZXZpY2VfYXR0cl9wYW5fdGlsdCk7CisJCWlmIChyYykgZ290byBlcnJfYnV0dG9uOworCX0KKworCXJldHVybiAwOworCitlcnJfYnV0dG9uOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYnV0dG9uKTsKK2VycjoKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIHB3Y19yZW1vdmVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKQEAgLTEwODIsOCArMTA5Myw3IEBACiAJUFdDX0RFQlVHX09QRU4oIj4+IHZpZGVvX29wZW4gY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOwogCiAJcGRldiA9IChzdHJ1Y3QgcHdjX2RldmljZSAqKXZkZXYtPnByaXY7Ci0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJQlVHKCk7CisJQlVHX09OKCFwZGV2KTsKIAlpZiAocGRldi0+dm9wZW4pIHsKIAkJUFdDX0RFQlVHX09QRU4oIkknbSBidXN5LCBzb21lb25lIGlzIHVzaW5nIHRoZSBkZXZpY2UuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTE0MDgsNyArMTQxOCw3IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gTlVMTDsKIAlpbnQgdmVuZG9yX2lkLCBwcm9kdWN0X2lkLCB0eXBlX2lkOwotCWludCBpLCBoaW50OworCWludCBpLCBoaW50LCByYzsKIAlpbnQgZmVhdHVyZXMgPSAwOwogCWludCB2aWRlb19uciA9IC0xOyAvKiBkZWZhdWx0OiB1c2UgbmV4dCBhdmFpbGFibGUgZGV2aWNlICovCiAJY2hhciBzZXJpYWxfbnVtYmVyWzMwXSwgKm5hbWU7CkBAIC0xNzA5LDkgKzE3MTksOCBAQAogCWkgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UocGRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpOwogCWlmIChpIDwgMCkgewogCQlQV0NfRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBhcyB2aWRlbyBkZXZpY2UgKCVkKS5cbiIsIGkpOwotCQl2aWRlb19kZXZpY2VfcmVsZWFzZShwZGV2LT52ZGV2KTsgLyogRHJpcC4uLiBkcmlwLi4uIGRyaXAuLi4gKi8KLQkJa2ZyZWUocGRldik7IC8qIE9vcHMsIG5vIG1lbW9yeSBsZWFrcyBwbGVhc2UgKi8KLQkJcmV0dXJuIC1FSU87CisJCXJjID0gaTsKKwkJZ290byBlcnI7CiAJfQogCWVsc2UgewogCQlQV0NfSU5GTygiUmVnaXN0ZXJlZCBhcyAvZGV2L3ZpZGVvJWQuXG4iLCBwZGV2LT52ZGV2LT5taW5vciAmIDB4M0YpOwpAQCAtMTcyMywxMyArMTczMiwyNCBAQAogCiAJUFdDX0RFQlVHX1BST0JFKCJwcm9iZSgpIGZ1bmN0aW9uIHJldHVybmluZyBzdHJ1Y3QgYXQgMHglcC5cbiIsIHBkZXYpOwogCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIHBkZXYpOwotCXB3Y19jcmVhdGVfc3lzZnNfZmlsZXMocGRldi0+dmRldik7CisJcmMgPSBwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfdW5yZWc7CiAKIAkvKiBTZXQgdGhlIGxlZHMgb2ZmICovCiAJcHdjX3NldF9sZWRzKHBkZXYsIDAsIDApOwogCXB3Y19jYW1lcmFfcG93ZXIocGRldiwgMCk7CiAKIAlyZXR1cm4gMDsKKworZXJyX3VucmVnOgorCWlmIChoaW50IDwgTUFYX0RFVl9ISU5UUykKKwkJZGV2aWNlX2hpbnRbaGludF0ucGRldiA9IE5VTEw7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocGRldi0+dmRldik7CitlcnI6CisJdmlkZW9fZGV2aWNlX3JlbGVhc2UocGRldi0+dmRldik7IC8qIERyaXAuLi4gZHJpcC4uLiBkcmlwLi4uICovCisJa2ZyZWUocGRldik7IC8qIE9vcHMsIG5vIG1lbW9yeSBsZWFrcyBwbGVhc2UgKi8KKwlyZXR1cm4gcmM7CiB9CiAKIC8qIFRoZSB1c2VyIGphbmtlZCBvdXQgdGhlIGNhYmxlLi4uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTY1ODguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCmluZGV4IGE4MTI4NWMuLjkyZWFiZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNjU4OC5jCkBAIC0yMTIsOCArMjEyLDEwIEBACiAJaWYgKHJkX2Jsb2NrcyA+IHMtPmJsb2NrX2NvdW50KQogCQlyZF9ibG9ja3MgPSBzLT5ibG9ja19jb3VudDsKIAotCWlmICghcmRfYmxvY2tzKQorCWlmICghcmRfYmxvY2tzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCByZF9ibG9ja3M7IGkrKykgewogCQlpZiAoYmxvY2tfdG9fdXNlcl9idWYocywgYnVmX3B0cikpIHsKQEAgLTMyMiw5ICszMjQsOSBAQAogCXNjaGVkdWxlX3dvcmsoJnMtPndvcmspOwogfQogCi1zdGF0aWMgdm9pZCBzYWE2NTg4X3dvcmsodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHNhYTY1ODhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNhYTY1ODggKnMgPSAoc3RydWN0IHNhYTY1ODggKilkYXRhOworCXN0cnVjdCBzYWE2NTg4ICpzID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzYWE2NTg4LCB3b3JrKTsKIAogCXNhYTY1ODhfaTJjX3BvbGwocyk7CiAJbW9kX3RpbWVyKCZzLT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApKTsKQEAgLTQxNyw3ICs0MTksNyBAQAogCXNhYTY1ODhfY29uZmlndXJlKHMpOwogCiAJLyogc3RhcnQgcG9sbGluZyB2aWEgZXZlbnRkICovCi0JSU5JVF9XT1JLKCZzLT53b3JrLCBzYWE2NTg4X3dvcmssIHMpOworCUlOSVRfV09SSygmcy0+d29yaywgc2FhNjU4OF93b3JrKTsKIAlpbml0X3RpbWVyKCZzLT50aW1lcik7CiAJcy0+dGltZXIuZnVuY3Rpb24gPSBzYWE2NTg4X3RpbWVyOwogCXMtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYwppbmRleCA5NzQxNzlkLi5jMjM3NGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYwpAQCAtODUxLDcgKzg1MSw3IEBACiAKIAkvKiBPbiA2MEh6LCBpdCBpcyB1c2luZyBhIGhpZ2hlciBWZXJ0aWNhbCBPdXRwdXQgU2l6ZSAqLwogCWlmICghaXNfNTBoeikKLQkJcmVzKz0oVlJFU182MEhaLTQ4MCk+PjE7CisJCXJlcyArPSAoVlJFU182MEhaIC0gNDgwKSA+PiAxOwogCiAJCS8qIGhlaWdodCAqLwogCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSX0NFX0JfVkVSVF9PVVRQVVRfV0lORE9XX0xFTkdUSCwKQEAgLTkwNyw3ICs5MDcsNyBAQAogCiAJLyogQWN0aXZhdGVzIHRhc2sgIkIiICovCiAJc2FhNzExeF93cml0ZShjbGllbnQsIFJfODBfR0xPQkFMX0NOVExfMSwKLQkJCQlzYWE3MTF4X3JlYWQoY2xpZW50LFJfODBfR0xPQkFMX0NOVExfMSl8MHgyMCk7CisJCQkJc2FhNzExeF9yZWFkKGNsaWVudCxSXzgwX0dMT0JBTF9DTlRMXzEpIHwgMHgyMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkzMiwxMSArOTMyLDExIEBACiAJaWYgKHN0ZCAmIFY0TDJfU1REXzUyNV82MCkgewogCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZWNvZGVyIHNldCBzdGFuZGFyZCA2MCBIelxuIik7CiAJCXNhYTcxMXhfd3JpdGVyZWdzKGNsaWVudCwgc2FhNzExNV9jZmdfNjBoel92aWRlbyk7Ci0JCXNhYTcxMXhfc2V0X3NpemUoY2xpZW50LDcyMCw0ODApOworCQlzYWE3MTF4X3NldF9zaXplKGNsaWVudCwgNzIwLCA0ODApOwogCX0gZWxzZSB7CiAJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImRlY29kZXIgc2V0IHN0YW5kYXJkIDUwIEh6XG4iKTsKIAkJc2FhNzExeF93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ181MGh6X3ZpZGVvKTsKLQkJc2FhNzExeF9zZXRfc2l6ZShjbGllbnQsNzIwLDU3Nik7CisJCXNhYTcxMXhfc2V0X3NpemUoY2xpZW50LCA3MjAsIDU3Nik7CiAJfQogCiAJLyogUmVnaXN0ZXIgMEUgLSBCaXRzIEQ2LUQ0IG9uIE5PLUFVVE8gbW9kZQpAQCAtOTYwLDYgKzk2MCw4IEBACiAJCQlyZWcgfD0gMHgxMDsKIAkJfSBlbHNlIGlmIChzdGQgPT0gVjRMMl9TVERfTlRTQ19NX0pQKSB7CiAJCQlyZWcgfD0gMHg0MDsKKwkJfSBlbHNlIGlmIChzdGQgPT0gVjRMMl9TVERfU0VDQU0pIHsKKwkJCXJlZyB8PSAweDUwOwogCQl9CiAJCXNhYTcxMXhfd3JpdGUoY2xpZW50LCBSXzBFX0NIUk9NQV9DTlRMXzEsIHJlZyk7CiAJfSBlbHNlIHsKQEAgLTE0NjIsMTkgKzE0NjQsMjQgQEAKIAljbGllbnQtPmRyaXZlciA9ICZpMmNfZHJpdmVyX3NhYTcxMXg7CiAJc25wcmludGYoY2xpZW50LT5uYW1lLCBzaXplb2YoY2xpZW50LT5uYW1lKSAtIDEsICJzYWE3MTE1Iik7CiAKLQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZXRlY3Rpbmcgc2FhNzExNSBjbGllbnQgb24gYWRkcmVzcyAweCV4XG4iLCBhZGRyZXNzIDw8IDEpOwotCi0JZm9yIChpPTA7aTwweDBmO2krKykgeworCWZvciAoaSA9IDA7IGkgPCAweDBmOyBpKyspIHsKIAkJc2FhNzExeF93cml0ZShjbGllbnQsIDAsIGkpOwotCQluYW1lW2ldID0gKHNhYTcxMXhfcmVhZChjbGllbnQsIDApICYweDBmKSArJzAnOwotCQlpZiAobmFtZVtpXT4nOScpCi0JCQluYW1lW2ldKz0nYSctJzknLTE7CisJCW5hbWVbaV0gPSAoc2FhNzExeF9yZWFkKGNsaWVudCwgMCkgJiAweDBmKSArICcwJzsKKwkJaWYgKG5hbWVbaV0gPiAnOScpCisJCQluYW1lW2ldICs9ICdhJyAtICc5JyAtIDE7CiAJfQotCW5hbWVbaV09J1wwJzsKKwluYW1lW2ldID0gJ1wwJzsKIAogCXNhYTcxMXhfd3JpdGUoY2xpZW50LCAwLCA1KTsKIAljaGlwX2lkID0gc2FhNzExeF9yZWFkKGNsaWVudCwgMCkgJiAweDBmOwogCisJLyogQ2hlY2sgd2hldGhlciB0aGlzIGNoaXAgaXMgcGFydCBvZiB0aGUgc2FhNzExeCBzZXJpZXMgKi8KKwlpZiAobWVtY21wKG5hbWUsICIxZjcxMSIsIDUpKSB7CisJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgImNoaXAgZm91bmQgQCAweCV4IChJRCAlcykgZG9lcyBub3QgbWF0Y2ggYSBrbm93biBzYWE3MTF4IGNoaXAuXG4iLAorCQkJYWRkcmVzcyA8PCAxLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc25wcmludGYoY2xpZW50LT5uYW1lLCBzaXplb2YoY2xpZW50LT5uYW1lKSAtIDEsICJzYWE3MTElZCIsY2hpcF9pZCk7CiAJdjRsX2luZm8oY2xpZW50LCAic2FhNzExJWQgZm91bmQgKCVzKSBAIDB4JXggKCVzKVxuIiwgY2hpcF9pZCwgbmFtZSwgYWRkcmVzcyA8PCAxLCBhZGFwdGVyLT5uYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCmluZGV4IDRhYmY1YzAuLmZmYjBmNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKQEAgLTEsMTAgKzEsNiBAQAogLyoKICAqICAgU0FBNzEzeCBBTFNBIHN1cHBvcnQgZm9yIFY0TAogICoKLSAqCi0gKiAgIENhdmVhdHM6Ci0gKiAgICAgICAgLSBWb2x1bWUgZG9lc24ndCB3b3JrIChpdCdzIGFsd2F5cyBhdCBtYXgpCi0gKgogICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIKQEAgLTYxNCwxMyArNjEwLDE4IEBACiAJc25kX2NhcmRfc2FhNzEzNF9wY21fdCAqcGNtOwogCXNuZF9jYXJkX3NhYTcxMzRfdCAqc2FhNzEzNCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IHNhYTcxMzQtPmRldjsKLQlpbnQgZXJyOworCWludCBhbXV4LCBlcnI7CiAKIAltdXRleF9sb2NrKCZkZXYtPmRtYXNvdW5kLmxvY2spOwogCiAJZGV2LT5kbWFzb3VuZC5yZWFkX2NvdW50ICA9IDA7CiAJZGV2LT5kbWFzb3VuZC5yZWFkX29mZnNldCA9IDA7CiAKKwlhbXV4ID0gZGV2LT5pbnB1dC0+YW11eDsKKwlpZiAoKGFtdXggPCAxKSB8fCAoYW11eCA+IDMpKQorCQlhbXV4ID0gMTsKKwlkZXYtPmRtYXNvdW5kLmlucHV0ICA9ICBhbXV4IC0gMTsKKwogCW11dGV4X3VubG9jaygmZGV2LT5kbWFzb3VuZC5sb2NrKTsKIAogCXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCpwY20pLCBHRlBfS0VSTkVMKTsKQEAgLTcxMyw2ICs3MTQsOCBAQAogCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqIHVjb250cm9sKQogewogCXNuZF9jYXJkX3NhYTcxMzRfdCAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGNoaXAtPmRldjsKKwogCWludCBjaGFuZ2UsIGFkZHIgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlpbnQgbGVmdCwgcmlnaHQ7CiAKQEAgLTcyNywxMCArNzMwLDUyIEBACiAJaWYgKHJpZ2h0ID4gMjApCiAJCXJpZ2h0ID0gMjA7CiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+bWl4ZXJfbG9jayk7Ci0JY2hhbmdlID0gY2hpcC0+bWl4ZXJfdm9sdW1lW2FkZHJdWzBdICE9IGxlZnQgfHwKLQkJIGNoaXAtPm1peGVyX3ZvbHVtZVthZGRyXVsxXSAhPSByaWdodDsKLQljaGlwLT5taXhlcl92b2x1bWVbYWRkcl1bMF0gPSBsZWZ0OwotCWNoaXAtPm1peGVyX3ZvbHVtZVthZGRyXVsxXSA9IHJpZ2h0OworCWNoYW5nZSA9IDA7CisJaWYgKGNoaXAtPm1peGVyX3ZvbHVtZVthZGRyXVswXSAhPSBsZWZ0KSB7CisJCWNoYW5nZSA9IDE7CisJCXJpZ2h0ID0gbGVmdDsKKwl9CisJaWYgKGNoaXAtPm1peGVyX3ZvbHVtZVthZGRyXVsxXSAhPSByaWdodCkgeworCQljaGFuZ2UgPSAxOworCQlsZWZ0ID0gcmlnaHQ7CisJfQorCWlmIChjaGFuZ2UpIHsKKwkJc3dpdGNoIChkZXYtPnBjaS0+ZGV2aWNlKSB7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0OgorCQkJCXN3aXRjaCAoYWRkcikgeworCQkJCQljYXNlIE1JWEVSX0FERFJfVFZUVU5FUjoKKwkJCQkJCWxlZnQgPSAyMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIE1JWEVSX0FERFJfTElORTE6CisJCQkJCQlzYWFfYW5kb3JiKFNBQTcxMzRfQU5BTE9HX0lPX1NFTEVDVCwgIDB4MTAsCisJCQkJCQkJICAgKGxlZnQgPiAxMCkgPyAweDAwIDogMHgxMCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBNSVhFUl9BRERSX0xJTkUyOgorCQkJCQkJc2FhX2FuZG9yYihTQUE3MTM0X0FOQUxPR19JT19TRUxFQ1QsICAweDIwLAorCQkJCQkJCSAgIChsZWZ0ID4gMTApID8gMHgwMCA6IDB4MjApOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMzoKKwkJCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzU6CisJCQkJc3dpdGNoIChhZGRyKSB7CisJCQkJCWNhc2UgTUlYRVJfQUREUl9UVlRVTkVSOgorCQkJCQkJbGVmdCA9IDIwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgTUlYRVJfQUREUl9MSU5FMToKKwkJCQkJCXNhYV9hbmRvcmIoMHgwNTk0LCAgMHgxMCwKKwkJCQkJCQkgICAobGVmdCA+IDEwKSA/IDB4MDAgOiAweDEwKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIE1JWEVSX0FERFJfTElORTI6CisJCQkJCQlzYWFfYW5kb3JiKDB4MDU5NCwgIDB4MjAsCisJCQkJCQkJICAgKGxlZnQgPiAxMCkgPyAweDAwIDogMHgyMCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwkJY2hpcC0+bWl4ZXJfdm9sdW1lW2FkZHJdWzBdID0gbGVmdDsKKwkJY2hpcC0+bWl4ZXJfdm9sdW1lW2FkZHJdWzFdID0gcmlnaHQ7CisJfQogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+bWl4ZXJfbG9jayk7CiAJcmV0dXJuIGNoYW5nZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IGM5ZDhlM2IuLjRkZWFkODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwpAQCAtMjQ2MiwxNCArMjQ2MiwxNyBAQAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBUViwKIAkJCS50diAgID0gMSwKKwkJCS5ncGlvID0gMHgwMDAwMDAwLAogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9jb21wMSwKIAkJCS52bXV4ID0gMywKIAkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDIwMDAwMCwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA4LAogCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwMjAwMDAwLAogCQl9fSwKIAkJLnJhZGlvID0gewogCQkJLm5hbWUgPSBuYW1lX3JhZGlvLApAQCAtMjk2OSw3ICsyOTcyLDcgQEAKIAkJLyogUGV0ciBCYXVkaXMgPHBhc2t5QHVjdy5jej4gKi8KIAkJLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBUViBIeWJyaWQgQTE2QVIiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDE4N2RlNywKLQkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLCAvKiB1bnRlc3RlZCAqLworCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REMTMxNiwgLyogdW50ZXN0ZWQgKi8KIAkJLnJhZGlvX3R5cGUgICAgID0gVFVORVJfVEVBNTc2NywgLyogdW50ZXN0ZWQgKi8KIAkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKQEAgLTMwMjIsNiArMzAyNSwxNTggQEAKIAkJCS5hbXV4ICAgPSBMSU5FMSwKIAkJfSwKIAl9LAorCVtTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfMzEwaV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIDMxMGkiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAorCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwMDIwMDAwMCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gNCwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggICA9IFRWLAorCQkJLmdwaW8gICA9IDB4MDIwMDAwMCwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fNTA3XSA9IHsKKwkJLyogTWlraGFpbCBGZWRvdG92IDxtb19mZWRvdG92QG1haWwucnU+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJBdmVybWVkaWEgQVZlclRWIFN0dWRpbyA1MDciLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuZ3Bpb21hc2sgICAgICAgPSAweDAzLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJCS5ncGlvID0gMHgwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAxLAorCQl9LAorCQkubXV0ZSAgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MDAsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfRFZCVF8yMDBBXSA9IHsKKwkJLyogRnJhbmNpcyBCYXJiZXIgPGZlZG9yYUBiYXJiZXItZmFtaWx5LmlkLmF1PiAqLworCQkubmFtZSAgICAgICAgICAgPSAiQ29tcHJvIFZpZGVvbWF0ZSBEVkItVDIwMEEiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19QT1JUMV9BQ1RJVkUsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS5pbnB1dHMgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMywKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gTElORTIsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDgsCisJCQkuYW11eCAgID0gTElORTIsCisJCX19LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfSEFVUFBBVUdFX0hWUjExMTBdID0geworCQkvKiBUaG9tYXMgR2VudHkgPHRvbWxvaGF2ZUBnbWFpbC5jb20+ICovCisJCS5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYtSFZSMTExMCBEVkItVC9IeWJyaWQiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUyLCAvKiBGSVhNRTogYXVkaW8gZG9lc24ndCB3b3JrIG9uIHN2aWRlby9jb21wb3NpdGUgKi8KKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gOCwKKwkJCS5hbXV4ICAgPSBMSU5FMiwgLyogRklYTUU6IGF1ZGlvIGRvZXNuJ3Qgd29yayBvbiBzdmlkZW8vY29tcG9zaXRlICovCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCAgID0gVFYsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9DSU5FUkdZX0hUX1BDTUNJQV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IEhUIFBDTUNJQSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAorCQkuaW5wdXRzID0ge3sKKwkJCS5uYW1lICAgPSBuYW1lX3R2LAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gVFYsCisJCQkudHYgICAgID0gMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ICAgPSA2LAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9fSwKKwl9LAogfTsKIAogY29uc3QgdW5zaWduZWQgaW50IHNhYTcxMzRfYmNvdW50ID0gQVJSQVlfU0laRShzYWE3MTM0X2JvYXJkcyk7CkBAIC0zNjMxLDYgKzM3ODYsMzYgQEAKIAkJLnN1YmRldmljZSAgICA9IDB4NDg2MCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU19FVVJPUEEyX0hZQlJJRCwKIAl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxMWJkLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMDJmLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWXzMxMGksCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KKwkJLnN1YmRldmljZSAgICA9IDB4OTcxNSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT181MDcsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTA0MywKKwkJLnN1YmRldmljZSAgICA9IDB4NDg3NiwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDAwNzAsCisJCS5zdWJkZXZpY2UgICAgPSAweDY3MDEsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTEwLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE1M2IsCisJCS5zdWJkZXZpY2UgICAgPSAweDExNzIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1lfSFRfUENNQ0lBLAorCX0sewogCQkvKiAtLS0gYm9hcmRzIHdpdGhvdXQgZWVwcm9tICsgc3Vic3lzdGVtIElEIC0tLSAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCkBAIC0zNzE3LDEzICszOTAyLDE2IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDU6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA3OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3OgorCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzUwNzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTToKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzc3NzoKIC8qICAgICAgY2FzZSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTTogICovIC8qIG5vdCBmaW5pc2hlZCB5ZXQgKi8KIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUjoKIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0dPTERfUExVUzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX0dPTERfUExVU0lJOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfRFZCVF8zMDA6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzIwMDoKKwljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0RWQlRfMjAwQToKIAljYXNlIFNBQTcxMzRfQk9BUkRfTUFOTElfTVRWMDAxOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDI6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0JFSE9MRF80MDlGTToKQEAgLTM3MzQsNiArMzkyMiw3IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlRfTFIzMDE6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU86CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BST1RFVVNfMjMwOToKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0ExNkFSOgogCQlkZXYtPmhhc19yZW1vdGUgPSBTQUE3MTM0X1JFTU9URV9HUElPOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCU19MUjMwMDoKQEAgLTM3NzIsNyArMzk2MSw2IEBACiAJCXNhYV93cml0ZWIoU0FBNzEzNF9HUElPX0dQTU9ERTMsIDB4MDgpOwogCQlzYWFfd3JpdGViKFNBQTcxMzRfR1BJT19HUFNUQVRVUzMsIDB4MDApOwogCQlicmVhazsKLQljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0ExNkFSOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVUzoKIAkJLyogcG93ZXItdXAgdHVuZXIgY2hpcCAqLwogCQlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CkBAIC0zNzkyLDcgKzM5ODAsOSBAQAogCQlicmVhazsKIAkvKiBpMmMgcmVtb3RlcyAqLwogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWXzExMGk6CisJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfMzEwaToKIAljYXNlIFNBQTcxMzRfQk9BUkRfVVBNT1NUX1BVUlBMRV9UVjoKKwljYXNlIFNBQTcxMzRfQk9BUkRfSEFVUFBBVUdFX0hWUjExMTA6CiAJCWRldi0+aGFzX3JlbW90ZSA9IFNBQTcxMzRfUkVNT1RFX0kyQzsKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9BMTY5X0I6CkBAIC0zOTIzLDkgKzQxMTMsMTEgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19USUdFUjoKKwljYXNlIFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfUENUVl8zMTBpOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9URVZJT05fRFZCVF8yMjBSRjoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9NRURJT05fTUQ4ODAwX1FVQURSTzoKKwljYXNlIFNBQTcxMzRfQk9BUkRfSEFVUFBBVUdFX0hWUjExMTA6CiAJCS8qIHRoaXMgaXMgYSBoeWJyaWQgYm9hcmQsIGluaXRpYWxpemUgdG8gYW5hbG9nIG1vZGUKIAkJICogYW5kIGNvbmZpZ3VyZSBmaXJtd2FyZSBlZXByb20gYWRkcmVzcwogCQkgKi8KQEAgLTM5NTEsNiArNDE0MywxNCBAQAogCQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZX0hUX1BDTUNJQToKKwkJLyogbWFrZSB0aGUgdGRhMTAwNDYgZmluZCBpdHMgZWVwcm9tICovCisJCXsKKwkJdTggZGF0YVtdID0geyAweDNjLCAweDMzLCAweDYwfTsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPTB4MDgsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSl9OworCQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOworCQl9CisJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfQVRTQzExMDoKIAkJewogCQkJLyogZW5hYmxlIHR1bmVyICovCkBAIC0zOTYzLDYgKzQxNjMsMjkgQEAKIAkJCQkJICAgICAgIGRldi0+bmFtZSwgaSk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzIwMDoKKwljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX0RWQlRfMjAwQToKKwkJLyogVGhlIFQyMDAgYW5kIHRoZSBUMjAwQSBzaGFyZSB0aGUgc2FtZSBwY2kgaWQuICBDb25zZXF1ZW50bHksCisJCSAqIHdlIGFyZSBnb2luZyB0byBxdWVyeSBlZXByb20gdG8gdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIG9uZSB3ZQorCQkgKiBhcmUgYWN0dWFsbHkgbG9va2luZyBhdC4gKi8KKworCQkvKiBEb24ndCBkbyB0aGlzIGlmIHRoZSBib2FyZCB3YXMgc3BlY2lmaWNhbGx5IHNlbGVjdGVkIHdpdGggYW4KKwkJICogaW5zbW9kIG9wdGlvbiBvciBpZiB3ZSBoYXZlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gVDIwMCovCisJCWlmKCFkZXYtPmF1dG9kZXRlY3RlZCB8fCAoZGV2LT5lZWRhdGFbMHg0MV0gPT0gMHhkMCkpCisJCQlicmVhazsKKwkJaWYoZGV2LT5lZWRhdGFbMHg0MV0gPT0gMHgwMikgeworCQkJLyogUmVjb25maWd1cmUgYm9hcmQgIGFzIFQyMDBBICovCisJCQlkZXYtPmJvYXJkID0gU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfRFZCVF8yMDBBOworCQkJZGV2LT50dW5lcl90eXBlICAgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50dW5lcl90eXBlOworCQkJZGV2LT50ZGE5ODg3X2NvbmYgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50ZGE5ODg3X2NvbmY7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjb25maWd1cmVkIGJvYXJkIGFzICVzXG4iLAorCQkJCWRldi0+bmFtZSwgc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5leHBlY3RlZCB0dW5lciB0eXBlIGluZm86ICV4IGluIGVlcHJvbVxuIiwKKwkJCQlkZXYtPm5hbWUsIGRldi0+ZWVkYXRhWzB4NDFdKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwppbmRleCA1YzllNjNkLi5lZDAzOGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCkBAIC04ODksMTUgKzg4OSwxNiBAQAogCQltdXN0X2NvbmZpZ3VyZV9tYW51YWxseSgpOwogCQlkZXYtPmJvYXJkID0gU0FBNzEzNF9CT0FSRF9VTktOT1dOOwogCX0KKwlkZXYtPmF1dG9kZXRlY3RlZCA9IGNhcmRbZGV2LT5ucl0gIT0gZGV2LT5ib2FyZDsKIAlkZXYtPnR1bmVyX3R5cGUgICA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLnR1bmVyX3R5cGU7CiAJZGV2LT50ZGE5ODg3X2NvbmYgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50ZGE5ODg3X2NvbmY7CiAJaWYgKFVOU0VUICE9IHR1bmVyW2Rldi0+bnJdKQogCQlkZXYtPnR1bmVyX3R5cGUgPSB0dW5lcltkZXYtPm5yXTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogc3Vic3lzdGVtOiAlMDR4OiUwNHgsIGJvYXJkOiAlcyBbY2FyZD0lZCwlc11cbiIsCi0JICAgICAgIGRldi0+bmFtZSxwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLAotCSAgICAgICBwY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUsCi0JICAgICAgIGRldi0+Ym9hcmQsIGNhcmRbZGV2LT5ucl0gPT0gZGV2LT5ib2FyZCA/Ci0JICAgICAgICJpbnNtb2Qgb3B0aW9uIiA6ICJhdXRvZGV0ZWN0ZWQiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN1YnN5c3RlbTogJTA0eDolMDR4LCBib2FyZDogJXMgW2NhcmQ9JWQsJXNdXG4iLAorCQlkZXYtPm5hbWUscGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvciwKKwkJcGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZSxzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lLAorCQlkZXYtPmJvYXJkLCBkZXYtPmF1dG9kZXRlY3RlZCA/CisJCSJhdXRvZGV0ZWN0ZWQiIDogImluc21vZCBvcHRpb24iKTsKIAogCS8qIGdldCBtbWlvICovCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IDFiYTUzYjUuLmZhODMzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC01MCw2ICs1MCwxMCBAQAogbW9kdWxlX3BhcmFtKGFudGVubmFfcHdyLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhbnRlbm5hX3B3ciwiZW5hYmxlIGFudGVubmEgcG93ZXIgKFBpbm5hY2xlIDMwMGkpIik7CiAKK3N0YXRpYyBpbnQgdXNlX2Zyb250ZW50ID0gMDsKK21vZHVsZV9wYXJhbSh1c2VfZnJvbnRlbnQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9mcm9udGVudCwiZm9yIGNhcmRzIHdpdGggbXVsdGlwbGUgZnJvbnRlbmRzICgwOiB0ZXJyZXN0cmlhbCwgMTogc2F0ZWxsaXRlKSIpOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQgcGlubmFjbGVfYW50ZW5uYV9wd3Ioc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBvbikKIHsKQEAgLTI5Myw3ICsyOTcsNyBAQAogCXJldHVybiBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldCgweDYwLCBmZSwgcGFyYW1zKTsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorc3RhdGljIGludCBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCiAJCQkJCSAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKQEAgLTMwOCw3ICszMTIsNyBAQAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF80TSwKIAkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8zNjE3LAotCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190dTEyMTZfcmVxdWVzdF9maXJtd2FyZSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzMxLDEyICszMzUsMTIgQEAKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfNE0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfREVGQVVMVCwKIAkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMzYxNywKLQkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdHUxMjE2X3JlcXVlc3RfZmlybXdhcmUsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBwaGlsaXBzX2V1cm9wYV90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX3RkMTMxNl90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAlzdGF0aWMgdTggbXNnW10gPSB7IDB4MGIsIDB4ZjUsIDB4ODYsIDB4YWIgfTsKQEAgLTM0NywxOCArMzUxLDggQEAKIAkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmaW5pdF9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwotCW1zbGVlcCgxKTsKLQotCS8qIHN3aXRjaCB0aGUgYm9hcmQgdG8gZHZiIG1vZGUgKi8KLQlpbml0X21zZy5hZGRyID0gMHg0MzsKLQlpbml0X21zZy5sZW4gID0gMHgwMjsKLQltc2dbMF0gPSAweDAwOwotCW1zZ1sxXSA9IDB4NDA7CiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmaW5pdF9tc2csIDEpICE9IDEpCi0JCXJldHVybiAtRUlPOwotCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2Nyw2ICszNjEsMjIgQEAKIAlyZXR1cm4gcGhpbGlwc190ZGE2NjUxX3BsbF9zZXQoMHg2MSwgZmUsIHBhcmFtcyk7CiB9CiAKK3N0YXRpYyBpbnQgcGhpbGlwc19ldXJvcGFfdHVuZXJfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJc3RhdGljIHU4IG1zZ1tdID0geyAweDAwLCAweDQwfTsKKwlzdHJ1Y3QgaTJjX21zZyBpbml0X21zZyA9IHsuYWRkciA9IDB4NDMsLmZsYWdzID0gMCwuYnVmID0gbXNnLC5sZW4gPSBzaXplb2YobXNnKSB9OworCisKKwlpZiAocGhpbGlwc190ZDEzMTZfdHVuZXJfaW5pdChmZSkpCisJCXJldHVybiAtRUlPOworCW1zbGVlcCgxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmaW5pdF9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcGhpbGlwc19ldXJvcGFfdHVuZXJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwpAQCAtNjcxLDcgKzY4MSw3IEBACiAJLmludmVydCAgICAgICAgPSAxLAogCS5pbnZlcnRfb2NsayAgID0gMCwKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAotCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1gsCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDExLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKQEAgLTgxMiw2ICs4MjIsMjcgQEAKIAlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQogCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgdGRhODI5MF9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwlzdGF0aWMgdTggdGRhODI5MF9jbG9zZVtdID0geyAweDIxLCAweGMwfTsKKwlzdGF0aWMgdTggdGRhODI5MF9vcGVuW10gID0geyAweDIxLCAweDgwfTsKKwlzdHJ1Y3QgaTJjX21zZyB0ZGE4MjkwX21zZyA9IHsuYWRkciA9IDB4NGIsLmZsYWdzID0gMCwgLmxlbiA9IDJ9OworCWlmIChlbmFibGUpIHsKKwkJdGRhODI5MF9tc2cuYnVmID0gdGRhODI5MF9jbG9zZTsKKwl9IGVsc2UgeworCQl0ZGE4MjkwX21zZy5idWYgPSB0ZGE4MjkwX29wZW47CisJfQorCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0ZGE4MjkwX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisJbXNsZWVwKDIwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIwLDI0ICs4NTEsMTEgQEAKIHN0YXRpYyBpbnQgcGhpbGlwc190aWdlcl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKLQlzdGF0aWMgdTggdGRhODI5MF9jbG9zZVtdID0geyAweDIxLCAweGMwfTsKLQlzdGF0aWMgdTggdGRhODI5MF9vcGVuW10gID0geyAweDIxLCAweDgwfTsKLQlzdHJ1Y3QgaTJjX21zZyB0ZGE4MjkwX21zZyA9IHsuYWRkciA9IDB4NGIsLmZsYWdzID0gMCwgLmxlbiA9IDJ9OwogCi0JLyogY2xvc2UgdGRhODI5MCBpMmMgYnJpZGdlICovCi0JdGRhODI5MF9tc2cuYnVmID0gdGRhODI5MF9jbG9zZTsKLQlyZXQgPSBpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0ZGE4MjkwX21zZywgMSk7Ci0JaWYgKHJldCAhPSAxKQotCQlyZXR1cm4gLUVJTzsKLQltc2xlZXAoMjApOwogCXJldCA9IHBoaWxpcHNfdGRhODI3eGFfcGxsX3NldCgweDYxLCBmZSwgcGFyYW1zKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7Ci0JLyogb3BlbiB0ZGE4MjkwIGkyYyBicmlkZ2UgKi8KLQl0ZGE4MjkwX21zZy5idWYgPSB0ZGE4MjkwX29wZW47Ci0JaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdGRhODI5MF9tc2csIDEpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGhpbGlwc190aWdlcl90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQpAQCAtODY3LDEzICs4ODUsODAgQEAKIAkuaW52ZXJ0ICAgICAgICA9IDEsCiAJLmludmVydF9vY2xrICAgPSAwLAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCi0JLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMTEsCisJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCit9OworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgY2luZXJneV9odF90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwlzdGF0aWMgdTggZGF0YVtdID0geyAweDNjLCAweDMzLCAweDYyfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHI9MHgwOCwgLmZsYWdzPTAsIC5idWY9ZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKX07CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW5lcmd5X2h0X3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwlzdGF0aWMgdTggZGF0YVtdID0geyAweDNjLCAweDMzLCAweDYwfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHI9MHgwOCwgLmZsYWdzPTAsIC5idWY9ZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKX07CisKKwlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOworCXBoaWxpcHNfdGRhODI3eGFfdHVuZXJfc2xlZXAoIDB4NjEsIGZlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgY2luZXJneV9odF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAorCS5pbnZlcnQgICAgICAgID0gMSwKKwkuaW52ZXJ0X29jbGsgICA9IDAsCisJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMDEsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKIAkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGlubmFjbGVfcGN0dl8zMTBpX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCisJLmludmVydCAgICAgICAgPSAxLAorCS5pbnZlcnRfb2NsayAgID0gMCwKKwkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAorCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1hfR1AxMSwKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIGhhdXBwYXVnZV9odnJfMTExMF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAorCS5pbnZlcnQgICAgICAgID0gMSwKKwkuaW52ZXJ0X29jbGsgICA9IDAsCisJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMTEsCisJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBhc3VzX3A3MTMxX2R1YWxfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDExLAorCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUsCit9OworCiBzdGF0aWMgaW50IGFzdXNfcDcxMzFfZHVhbF90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKQEAgLTkyMSw3ICsxMDA2LDcgQEAKIAkuaW52ZXJ0ICAgICAgICA9IDEsCiAJLmludmVydF9vY2xrICAgPSAwLAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCi0JLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUEwsCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDAwLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKQEAgLTk1OCw3ICsxMDQzLDcgQEAKIAkuaW52ZXJ0ICAgICAgICA9IDEsCiAJLmludmVydF9vY2xrICAgPSAwLAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCi0JLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUEwsCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDAwLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKQEAgLTk4Myw3ICsxMDY4LDcgQEAKIAkuaW52ZXJ0ICAgICAgICA9IDEsCiAJLmludmVydF9vY2xrICAgPSAwLAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCi0JLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMTEsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKIAkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCiB9OwpAQCAtMTAyOCw3ICsxMTEzLDcgQEAKIAkuaW52ZXJ0ICAgICAgICA9IDEsCiAJLmludmVydF9vY2xrICAgPSAwLAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCi0JLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMTEsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKIAkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCiB9OwpAQCAtMTE0Nyw2ICsxMjMyLDggQEAKIAkJCQkJICAgICAgICZwaGlsaXBzX2V1cm9wYV9jb25maWcsCiAJCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7CiAJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5vcmlnaW5hbF9kZW1vZF9zbGVlcCA9IGRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2xlZXA7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnNsZWVwID0gcGhpbGlwc19ldXJvcGFfZGVtb2Rfc2xlZXA7CiAJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc19ldXJvcGFfdHVuZXJfaW5pdDsKIAkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gcGhpbGlwc19ldXJvcGFfdHVuZXJfc2xlZXA7CiAJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZDEzMTZfdHVuZXJfc2V0X3BhcmFtczsKQEAgLTExNjYsNiArMTI1MywyOSBAQAogCQkJCQkgICAgICAgJnBoaWxpcHNfdGlnZXJfY29uZmlnLAogCQkJCQkgICAgICAgJmRldi0+aTJjX2FkYXApOwogCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCA9IHRkYTgyOTBfaTJjX2dhdGVfY3RybDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2xlZXA7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190aWdlcl90dW5lcl9zZXRfcGFyYW1zOworCQl9CisJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWXzMxMGk6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCisJCQkJCSAgICAgICAmcGlubmFjbGVfcGN0dl8zMTBpX2NvbmZpZywKKwkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLmkyY19nYXRlX2N0cmwgPSB0ZGE4MjkwX2kyY19nYXRlX2N0cmw7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190aWdlcl90dW5lcl9pbml0OworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQorCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfSEFVUFBBVUdFX0hWUjExMTA6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCisJCQkJCSAgICAgICAmaGF1cHBhdWdlX2h2cl8xMTEwX2NvbmZpZywKKwkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLmkyY19nYXRlX2N0cmwgPSB0ZGE4MjkwX2kyY19nYXRlX2N0cmw7CiAJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190aWdlcl90dW5lcl9pbml0OwogCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NsZWVwOwogCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2V0X3BhcmFtczsKQEAgLTExNzMsOSArMTI4MywxMCBAQAogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAotCQkJCQkgICAgICAgJnBoaWxpcHNfdGlnZXJfY29uZmlnLAorCQkJCQkgICAgICAgJmFzdXNfcDcxMzFfZHVhbF9jb25maWcsCiAJCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7CiAJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gdGRhODI5MF9pMmNfZ2F0ZV9jdHJsOwogCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGFzdXNfcDcxMzFfZHVhbF90dW5lcl9pbml0OwogCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBhc3VzX3A3MTMxX2R1YWxfdHVuZXJfc2xlZXA7CiAJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190aWdlcl90dW5lcl9zZXRfcGFyYW1zOwpAQCAtMTE5MiwxMiArMTMwMywyNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJfVFJJTzoKLQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDQ2X2F0dGFjaCwKLQkJCQkJICAgICAgICZsaWZldmlld190cmlvX2NvbmZpZywKLQkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKLQkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IGxpZmV2aWV3X3RyaW9fdHVuZXJfc2xlZXA7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbGlmZXZpZXdfdHJpb190dW5lcl9zZXRfcGFyYW1zOworCQlpZighIHVzZV9mcm9udGVudCkgewkvL3RlcnJlc3RyaWFsCisJCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAorCQkJCQkJICAgICAgICZsaWZldmlld190cmlvX2NvbmZpZywKKwkJCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7CisJCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IGxpZmV2aWV3X3RyaW9fdHVuZXJfc2xlZXA7CisJCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9CisJCQkJCQkJCWxpZmV2aWV3X3RyaW9fdHVuZXJfc2V0X3BhcmFtczsKKwkJCX0KKwkJfSBlbHNlIHsgIAkgICAgICAvL3NhdGVsbGl0ZQorCQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDg2X2F0dGFjaCwgJmZseWR2YnMsICZkZXYtPmkyY19hZGFwKTsKKwkJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJCWlmIChkdmJfYXR0YWNoKHRkYTgyNnhfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MywKKwkJCQkJCQkJCSZkZXYtPmkyY19hZGFwLCAwKSA9PSBOVUxMKSB7CisJCQkJCXByaW50aygiJXM6IExpZmV2aWV3IFRyaW8sIE5vIHRkYTgyNnggZm91bmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCX0KKwkJCQlpZiAoZHZiX2F0dGFjaChpc2w2NDIxX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsICZkZXYtPmkyY19hZGFwLAorCQkJCQkJCQkJCTB4MDgsIDAsIDApID09IE5VTEwpIHsKKwkJCQkJcHJpbnRrKCIlczogTGlmZXZpZXcgVHJpbywgTm8gSVNMNjQyMSBmb3VuZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJfQorCQkJfQogCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9BRFNfRFVPX0NBUkRCVVNfUFRWMzMxOgpAQCAtMTI3OSw3ICsxNDA1LDI3IEBACiAJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19mbWQxMjE2X3R1bmVyX3NldF9wYXJhbXM7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzIwMEE6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCisJCQkJJnBoaWxpcHNfZXVyb3BhX2NvbmZpZywKKwkJCQkmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGQxMzE2X3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZDEzMTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQorCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWV9IVF9QQ01DSUE6CisJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCisJCQkJCSAgICAgICAmY2luZXJneV9odF9jb25maWcsCisJCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gdGRhODI5MF9pMmNfZ2F0ZV9jdHJsOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGNpbmVyZ3lfaHRfdHVuZXJfaW5pdDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gY2luZXJneV9odF90dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NldF9wYXJhbXM7CiAKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoIiVzOiBIdWg/IHVua25vd24gRFZCIGNhcmQ/XG4iLGRldi0+bmFtZSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCmluZGV4IDY1ZDA0NDAuLmRhYWFlODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKQEAgLTM0Myw5ICszNDMsMTAgQEAKIAkubWlub3IJICAgICAgID0gLTEsCiB9OwogCi1zdGF0aWMgdm9pZCBlbXByZXNzX3NpZ25hbF91cGRhdGUodm9pZCogZGF0YSkKK3N0YXRpYyB2b2lkIGVtcHJlc3Nfc2lnbmFsX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2KiBkZXYgPSAoc3RydWN0IHNhYTcxMzRfZGV2KikgZGF0YTsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYqIGRldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2FhNzEzNF9kZXYsIGVtcHJlc3Nfd29ya3F1ZXVlKTsKIAogCWlmIChkZXYtPm5vc2lnbmFsKSB7CiAJCWRwcmludGsoIm5vIHZpZGVvIHNpZ25hbFxuIik7CkBAIC0zNzgsNyArMzc5LDcgQEAKIAkJICIlcyBlbXByZXNzICglcykiLCBkZXYtPm5hbWUsCiAJCSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lKTsKIAotCUlOSVRfV09SSygmZGV2LT5lbXByZXNzX3dvcmtxdWV1ZSwgZW1wcmVzc19zaWduYWxfdXBkYXRlLCAodm9pZCopIGRldik7CisJSU5JVF9XT1JLKCZkZXYtPmVtcHJlc3Nfd29ya3F1ZXVlLCBlbXByZXNzX3NpZ25hbF91cGRhdGUpOwogCiAJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+ZW1wcmVzc19kZXYsVkZMX1RZUEVfR1JBQkJFUiwKIAkJCQkgICAgZW1wcmVzc19ucltkZXYtPm5yXSk7CkBAIC0zOTksNyArNDAwLDcgQEAKIAkJCSAgICBzaXplb2Yoc3RydWN0IHNhYTcxMzRfYnVmKSwKIAkJCSAgICBkZXYpOwogCi0JZW1wcmVzc19zaWduYWxfdXBkYXRlKGRldik7CisJZW1wcmVzc19zaWduYWxfdXBkYXRlKCZkZXYtPmVtcHJlc3Nfd29ya3F1ZXVlKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYwppbmRleCA2MTYyNTUwLi42ZjlmZTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYwpAQCAtMzQxLDYgKzM0MSw3IEBACiAJc3dpdGNoIChjbGllbnQtPmFkZHIpIHsKIAkJY2FzZSAweDdhOgogCQljYXNlIDB4NDc6CisJCWNhc2UgMHg3MToKIAkJewogCQkJc3RydWN0IElSX2kyYyAqaXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAkJCWQxcHJpbnRrKCIlcyBpMmMgSVIgZGV0ZWN0ZWQgKCVzKS5cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwppbmRleCBmZjU5OTExLi42MGIzOGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKQEAgLTExMiw2ICsxMTIsMjcgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBnZXRfa2V5X2h2cjExMTAoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls1XSwgY29kNCwgY29kZTMsIGNvZGU0OworCisJLyogcG9sbCBJUiBjaGlwICovCisJaWYgKDUgIT0gaTJjX21hc3Rlcl9yZWN2KCZpci0+YyxidWYsNSkpCisJCXJldHVybiAtRUlPOworCisJY29kNAk9IGJ1Zls0XTsKKwljb2RlNAk9IChjb2Q0ID4+IDIpOworCWNvZGUzCT0gYnVmWzNdOworCWlmIChjb2RlMyA9PSAwKQorCQkvKiBubyBrZXkgcHJlc3NlZCAqLworCQlyZXR1cm4gMDsKKworCS8qIHJldHVybiBrZXkgKi8KKwkqaXJfa2V5ID0gY29kZTQ7CisJKmlyX3JhdyA9IGNvZGU0OworCXJldHVybiAxOworfQorCiB2b2lkIHNhYTcxMzRfaW5wdXRfaXJxKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewogCXN0cnVjdCBzYWE3MTM0X2lyICppciA9IGRldi0+cmVtb3RlOwpAQCAtMTMxLDYgKzE1MiwyMyBAQAogCW1vZF90aW1lcigmaXItPnRpbWVyLCB0aW1lb3V0KTsKIH0KIAorc3RhdGljIHZvaWQgc2FhNzEzNF9pcl9zdGFydChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHNhYTcxMzRfaXIgKmlyKQoreworCWlmIChpci0+cG9sbGluZykgeworCQlpbml0X3RpbWVyKCZpci0+dGltZXIpOworCQlpci0+dGltZXIuZnVuY3Rpb24gPSBzYWE3MTM0X2lucHV0X3RpbWVyOworCQlpci0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylkZXY7CisJCWlyLT50aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZpci0+dGltZXIpOworCX0KK30KKworc3RhdGljIHZvaWQgc2FhNzEzNF9pcl9zdG9wKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQoreworCWlmIChkZXYtPnJlbW90ZS0+cG9sbGluZykKKwkJZGVsX3RpbWVyX3N5bmMoJmRldi0+cmVtb3RlLT50aW1lcik7Cit9CisKIGludCBzYWE3MTM0X2lucHV0X2luaXQxKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewogCXN0cnVjdCBzYWE3MTM0X2lyICppcjsKQEAgLTE0MSw2ICsxNzksNyBAQAogCXUzMiBtYXNrX2tleXVwICAgPSAwOwogCWludCBwb2xsaW5nICAgICAgPSAwOwogCWludCBpcl90eXBlICAgICAgPSBJUl9UWVBFX09USEVSOworCWludCBlcnI7CiAKIAlpZiAoZGV2LT5oYXNfcmVtb3RlICE9IFNBQTcxMzRfUkVNT1RFX0dQSU8pCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTg0LDggKzIyMyw4IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDc6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA1OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwNzoKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT181MDc6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9HT18wMDdfRk06Ci0JY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9BMTZBUjoKIAkJaXJfY29kZXMgICAgID0gaXJfY29kZXNfYXZlcm1lZGlhOwogCQltYXNrX2tleWNvZGUgPSAweDAwMDdDODsKIAkJbWFza19rZXlkb3duID0gMHgwMDAwMTA7CkBAIC0xOTQsNiArMjMzLDE2IEBACiAJCXNhYV9zZXRiKFNBQTcxMzRfR1BJT19HUE1PREUwLCAweDQpOwogCQlzYWFfc2V0YihTQUE3MTM0X0dQSU9fR1BTVEFUVVMwLCAweDQpOwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzc3NzoKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0ExNkFSOgorCQlpcl9jb2RlcyAgICAgPSBpcl9jb2Rlc19hdmVybWVkaWE7CisJCW1hc2tfa2V5Y29kZSA9IDB4MDJGMjAwOworCQltYXNrX2tleWRvd24gPSAweDAwMDQwMDsKKwkJcG9sbGluZyAgICAgID0gNTA7IC8vIG1zCisJCS8qIFdpdGhvdXQgdGhpcyB3ZSB3b24ndCByZWNlaXZlIGtleSB1cCBldmVudHMgKi8KKwkJc2FhX3NldGIoU0FBNzEzNF9HUElPX0dQTU9ERTEsIDB4MSk7CisJCXNhYV9zZXRiKFNBQTcxMzRfR1BJT19HUFNUQVRVUzEsIDB4MSk7CisJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfVEVSTUlOQVRPUjoKIAkJaXJfY29kZXMgICAgID0gaXJfY29kZXNfcGl4ZWx2aWV3OwogCQltYXNrX2tleWNvZGUgPSAweDAwMDAxZjsKQEAgLTI1Nyw5ICszMDYsOCBAQAogCWlyID0ga3phbGxvYyhzaXplb2YoKmlyKSwgR0ZQX0tFUk5FTCk7CiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpciB8fCAhaW5wdXRfZGV2KSB7Ci0JCWtmcmVlKGlyKTsKLQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlOwogCX0KIAogCWlyLT5kZXYgPSBpbnB1dF9kZXY7CkBAIC0yOTAsMTggKzMzOCwyMiBAQAogCX0KIAlpbnB1dF9kZXYtPmNkZXYuZGV2ID0gJmRldi0+cGNpLT5kZXY7CiAKLQkvKiBhbGwgZG9uZSAqLwogCWRldi0+cmVtb3RlID0gaXI7Ci0JaWYgKGlyLT5wb2xsaW5nKSB7Ci0JCWluaXRfdGltZXIoJmlyLT50aW1lcik7Ci0JCWlyLT50aW1lci5mdW5jdGlvbiA9IHNhYTcxMzRfaW5wdXRfdGltZXI7Ci0JCWlyLT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWRldjsKLQkJaXItPnRpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIEhaOwotCQlhZGRfdGltZXIoJmlyLT50aW1lcik7Ci0JfQorCXNhYTcxMzRfaXJfc3RhcnQoZGV2LCBpcik7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaXItPmRldik7CisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlyLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9zdG9wOworCiAJcmV0dXJuIDA7CisKKyBlcnJfb3V0X3N0b3A6CisJc2FhNzEzNF9pcl9zdG9wKGRldik7CisJZGV2LT5yZW1vdGUgPSBOVUxMOworIGVycl9vdXRfZnJlZToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKGlyKTsKKwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIHNhYTcxMzRfaW5wdXRfZmluaShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKQEAgLTMwOSw4ICszNjEsNyBAQAogCWlmIChOVUxMID09IGRldi0+cmVtb3RlKQogCQlyZXR1cm47CiAKLQlpZiAoZGV2LT5yZW1vdGUtPnBvbGxpbmcpCi0JCWRlbF90aW1lcl9zeW5jKCZkZXYtPnJlbW90ZS0+dGltZXIpOworCXNhYTcxMzRfaXJfc3RvcChkZXYpOwogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+cmVtb3RlLT5kZXYpOwogCWtmcmVlKGRldi0+cmVtb3RlKTsKIAlkZXYtPnJlbW90ZSA9IE5VTEw7CkBAIC0zMjYsNiArMzc3LDcgQEAKIAogCXN3aXRjaCAoZGV2LT5ib2FyZCkgewogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWXzExMGk6CisJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfMzEwaToKIAkJc25wcmludGYoaXItPmMubmFtZSwgc2l6ZW9mKGlyLT5jLm5hbWUpLCAiUGlubmFjbGUgUENUViIpOwogCQlpZiAocGlubmFjbGVfcmVtb3RlID09IDApIHsKIAkJCWlyLT5nZXRfa2V5ICAgPSBnZXRfa2V5X3Bpbm5hY2xlX2NvbG9yOwpAQCAtMzQwLDYgKzM5MiwxMSBAQAogCQlpci0+Z2V0X2tleSAgID0gZ2V0X2tleV9wdXJwbGV0djsKIAkJaXItPmlyX2NvZGVzICA9IGlyX2NvZGVzX3B1cnBsZXR2OwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfSEFVUFBBVUdFX0hWUjExMTA6CisJCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgIkhWUiAxMTEwIik7CisJCWlyLT5nZXRfa2V5ICAgPSBnZXRfa2V5X2h2cjExMTA7CisJCWlyLT5pcl9jb2RlcyAgPSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkcHJpbnRrKCJTaG91bGRuJ3QgZ2V0IGhlcmU6IFVua25vd24gYm9hcmQgJXggZm9yIEkyQyBJUj9cbiIsZGV2LT5ib2FyZCk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKaW5kZXggMjAzMzAyZi4uODMwNjE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCkBAIC0yMjQ4LDcgKzIyNDgsMTEgQEAKIAkJdC0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CiAKIAkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX0dfVFVORVIsIHQpOwotCisJCWlmIChkZXYtPmlucHV0LT5hbXV4ID09IFRWKSB7CisJCQl0LT5zaWduYWwgPSAweGY4MDAgLSAoKHNhYV9yZWFkYigweDU4MSkgJiAweDFmKSA8PCAxMSk7CisJCQl0LT5yeHN1YmNoYW5zID0gKHNhYV9yZWFkYigweDUyOSkgJiAweDA4KSA/CisJCQkJCVY0TDJfVFVORVJfU1VCX1NURVJFTyA6IFY0TDJfVFVORVJfU1VCX01PTk87CisJCX0KIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX1NfVFVORVI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAppbmRleCA3Y2Y5NmI0Li5lODhhZDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTIyNyw2ICsyMjcsMTEgQEAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9QUk9URVVTXzIzMDkgOTgKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQTE2QVIgICA5OQogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FTVVNfRVVST1BBMl9IWUJSSUQgMTAwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfUENUVl8zMTBpICAxMDEKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzUwNyAxMDIKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfRFZCVF8yMDBBICAxMDMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9IQVVQUEFVR0VfSFZSMTExMCAgICAxMDQKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9DSU5FUkdZX0hUX1BDTUNJQSAgICAxMDUKIAogI2RlZmluZSBTQUE3MTM0X01BWEJPQVJEUyA4CiAjZGVmaW5lIFNBQTcxMzRfSU5QVVRfTUFYIDgKQEAgLTQ0Niw2ICs0NTEsOSBAQAogCXN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgICAgIHByaW87CiAjZW5kaWYKIAorCS8qIGluc21vZCBvcHRpb24vYXV0b2RldGVjdGVkICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2RldGVjdGVkOworCiAJLyogdmFyaW91cyBkZXZpY2UgaW5mbyAqLwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHJlc291cmNlczsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICAgICAgICAqdmlkZW9fZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCmluZGV4IDNlMGZmOGEuLjE4NDU4ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKQEAgLTc3NSw3ICs3NzUsNyBAQAogCXJldHVybiAwOwogCiBmcmVlX3VyYnM6Ci0JZm9yIChpID0gMDsgKGkgPCBTTjlDMTAyX1VSQlMpICYmICBjYW0tPnVyYltpXTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBTTjlDMTAyX1VSQlM7IGkrKykKIAkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2ldKTsKIAogZnJlZV9idWZmZXJzOgpAQCAtMTI0MCwyMyArMTI0MCw1MyBAQAogCQkJIHNuOWMxMDJfc2hvd19mcmFtZV9oZWFkZXIsIE5VTEwpOwogCiAKLXN0YXRpYyB2b2lkIHNuOWMxMDJfY3JlYXRlX3N5c2ZzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQorc3RhdGljIGludCBzbjljMTAyX2NyZWF0ZV9zeXNmcyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2NGxkZXYgPSBjYW0tPnY0bGRldjsKKwlpbnQgcmM7CiAKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmFsKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVfaGVhZGVyKTsKLQlpZiAoY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDEgfHwgY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDIpCi0JCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9ncmVlbik7Ci0JZWxzZSBpZiAoY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDMpIHsKLQkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JsdWUpOwotCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVkKTsKLQl9CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnKTsKKwlpZiAocmMpIGdvdG8gZXJyOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZhbCk7CisJaWYgKHJjKSBnb3RvIGVycl9yZWc7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVfaGVhZGVyKTsKKwlpZiAocmMpIGdvdG8gZXJyX3ZhbDsKKwogCWlmIChjYW0tPnNlbnNvci5zeXNmc19vcHMpIHsKLQkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2kyY19yZWcpOwotCQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3ZhbCk7CisJCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2kyY19yZWcpOworCQlpZiAocmMpIGdvdG8gZXJyX2ZyaGVhZDsKKwkJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3ZhbCk7CisJCWlmIChyYykgZ290byBlcnJfaTJjX3JlZzsKIAl9CisKKwlpZiAoY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDEgfHwgY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDIpIHsKKwkJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZ3JlZW4pOworCQlpZiAocmMpIGdvdG8gZXJyX2kyY192YWw7CisJfSBlbHNlIGlmIChjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMykgeworCQlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9ibHVlKTsKKwkJaWYgKHJjKSBnb3RvIGVycl9pMmNfdmFsOworCQlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWQpOworCQlpZiAocmMpIGdvdG8gZXJyX2JsdWU7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9ibHVlOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9ibHVlKTsKK2Vycl9pMmNfdmFsOgorCWlmIChjYW0tPnNlbnNvci5zeXNmc19vcHMpCisJCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfdmFsKTsKK2Vycl9pMmNfcmVnOgorCWlmIChjYW0tPnNlbnNvci5zeXNmc19vcHMpCisJCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfcmVnKTsKK2Vycl9mcmhlYWQ6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2ZyYW1lX2hlYWRlcik7CitlcnJfdmFsOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92YWwpOworZXJyX3JlZzoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnKTsKK2VycjoKKwlyZXR1cm4gcmM7CiB9CiAjZW5kaWYgLyogQ09ORklHX1ZJREVPX0FEVl9ERUJVRyAqLwogCkBAIC0xNDMyLDggKzE0NjIsNiBAQAogCXZpZGVvX3NldF9kcnZkYXRhKGNhbS0+djRsZGV2LCBOVUxMKTsKIAl2aWRlb191bnJlZ2lzdGVyX2RldmljZShjYW0tPnY0bGRldik7CiAKLQl1c2JfcHV0X2RldihjYW0tPnVzYmRldik7Ci0KIAltdXRleF91bmxvY2soJnNuOWMxMDJfc3lzZnNfbG9jayk7CiAKIAlrZnJlZShjYW0tPmNvbnRyb2xfYnVmZmVyKTsKQEAgLTE1MjUsNiArMTU1Myw3IEBACiAKIAlpZiAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHsKIAkJc245YzEwMl9yZWxlYXNlX3Jlc291cmNlcyhjYW0pOworCQl1c2JfcHV0X2RldihjYW0tPnVzYmRldik7CiAJCW11dGV4X3VubG9jaygmY2FtLT5kZXZfbXV0ZXgpOwogCQlrZnJlZShjYW0pOwogCQlyZXR1cm4gMDsKQEAgLTI4MDksMTAgKzI4MzgsNyBAQAogCQlEQkcoMSwgIlY0TDIgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKIAkJaWYgKGVyciA9PSAtRU5GSUxFICYmIHZpZGVvX25yW2Rldl9ucl0gPT0gLTEpCiAJCQlEQkcoMSwgIkZyZWUgL2Rldi92aWRlb1ggbm9kZSBub3QgZm91bmQiKTsKLQkJdmlkZW9fbnJbZGV2X25yXSA9IC0xOwotCQlkZXZfbnIgPSAoZGV2X25yIDwgU045QzEwMl9NQVhfREVWSUNFUy0xKSA/IGRldl9ucisxIDogMDsKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPmRldl9tdXRleCk7Ci0JCWdvdG8gZmFpbDsKKwkJZ290byBmYWlsMjsKIAl9CiAKIAlEQkcoMiwgIlY0TDIgZGV2aWNlIHJlZ2lzdGVyZWQgYXMgL2Rldi92aWRlbyVkIiwgY2FtLT52NGxkZXYtPm1pbm9yKTsKQEAgLTI4MjMsNyArMjg0OSw5IEBACiAJZGV2X25yID0gKGRldl9uciA8IFNOOUMxMDJfTUFYX0RFVklDRVMtMSkgPyBkZXZfbnIrMSA6IDA7CiAKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0Jc245YzEwMl9jcmVhdGVfc3lzZnMoY2FtKTsKKwllcnIgPSBzbjljMTAyX2NyZWF0ZV9zeXNmcyhjYW0pOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CiAJREJHKDIsICJPcHRpb25hbCBkZXZpY2UgY29udHJvbCB0aHJvdWdoICdzeXNmcycgaW50ZXJmYWNlIHJlYWR5Iik7CiAjZW5kaWYKIApAQCAtMjgzMyw2ICsyODYxLDE0IEBACiAKIAlyZXR1cm4gMDsKIAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK2ZhaWwzOgorCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGNhbS0+djRsZGV2KTsKKyNlbmRpZgorZmFpbDI6CisJdmlkZW9fbnJbZGV2X25yXSA9IC0xOworCWRldl9uciA9IChkZXZfbnIgPCBTTjlDMTAyX01BWF9ERVZJQ0VTLTEpID8gZGV2X25yKzEgOiAwOworCW11dGV4X3VubG9jaygmY2FtLT5kZXZfbXV0ZXgpOwogZmFpbDoKIAlpZiAoY2FtKSB7CiAJCWtmcmVlKGNhbS0+Y29udHJvbF9idWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3R2NjgwLmMKaW5kZXggODdlMTEzMC4uYTFlYzNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jCkBAIC01MTYsMTYgKzUxNiw0NSBAQAogc3R2NjgwX2ZpbGUocGFja2V0c19kcm9wcGVkLCBkcm9wcGVkLCAiJWRcbiIpOwogc3R2NjgwX2ZpbGUoZGVjb2RpbmdfZXJyb3JzLCBlcnJvciwgIiVkXG4iKTsKIAotc3RhdGljIHZvaWQgc3R2NjgwX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQorc3RhdGljIGludCBzdHY2ODBfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCiB7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pbl91c2UpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc3RyZWFtaW5nKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3BhbGV0dGUpOwotCXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVzX3RvdGFsKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2ZyYW1lc19yZWFkKTsKLQl2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3BhY2tldHNfZHJvcHBlZCk7Ci0JdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9kZWNvZGluZ19lcnJvcnMpOworCWludCByYzsKKworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9tb2RlbCk7CisJaWYgKHJjKSBnb3RvIGVycjsKKwlyYyA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaW5fdXNlKTsKKwlpZiAocmMpIGdvdG8gZXJyX21vZGVsOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zdHJlYW1pbmcpOworCWlmIChyYykgZ290byBlcnJfaW51c2U7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3BhbGV0dGUpOworCWlmIChyYykgZ290byBlcnJfc3RyZWFtOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZXNfdG90YWwpOworCWlmIChyYykgZ290byBlcnJfcGFsOworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZXNfcmVhZCk7CisJaWYgKHJjKSBnb3RvIGVycl9mcmFtdG90OworCXJjID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYWNrZXRzX2Ryb3BwZWQpOworCWlmIChyYykgZ290byBlcnJfZnJhbXJlYWQ7CisJcmMgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2RlY29kaW5nX2Vycm9ycyk7CisJaWYgKHJjKSBnb3RvIGVycl9kcm9wcGVkOworCisJcmV0dXJuIDA7CisKK2Vycl9kcm9wcGVkOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFja2V0c19kcm9wcGVkKTsKK2Vycl9mcmFtcmVhZDoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2ZyYW1lc19yZWFkKTsKK2Vycl9mcmFtdG90OgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfZnJhbWVzX3RvdGFsKTsKK2Vycl9wYWw6CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYWxldHRlKTsKK2Vycl9zdHJlYW06CisJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zdHJlYW1pbmcpOworZXJyX2ludXNlOgorCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaW5fdXNlKTsKK2Vycl9tb2RlbDoKKwl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX21vZGVsKTsKK2VycjoKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIHN0djY4MF9yZW1vdmVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKQEAgLTY1OCw3ICs2ODcsNyBAQAogCQlzdHY2ODAtPnNidWZbaV0uZGF0YSA9IGttYWxsb2MgKHN0djY4MC0+cmF3YnVmc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChzdHY2ODAtPnNidWZbaV0uZGF0YSA9PSBOVUxMKSB7CiAJCQlQREVCVUcgKDAsICJTVFYoZSk6IENvdWxkIG5vdCBrbWFsbG9jIHJhdyBkYXRhIGJ1ZmZlciAlaSIsIGkpOwotCQkJcmV0dXJuIC0xOworCQkJZ290byBub21lbV9lcnI7CiAJCX0KIAl9CiAKQEAgLTY2OSw3ICs2OTgsNyBAQAogCQlzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSA9IGttYWxsb2MgKHN0djY4MC0+cmF3YnVmc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChzdHY2ODAtPnNjcmF0Y2hbaV0uZGF0YSA9PSBOVUxMKSB7CiAJCQlQREVCVUcgKDAsICJTVFYoZSk6IENvdWxkIG5vdCBrbWFsbG9jIHJhdyBzY3JhdGNoIGJ1ZmZlciAlaSIsIGkpOwotCQkJcmV0dXJuIC0xOworCQkJZ290byBub21lbV9lcnI7CiAJCX0KIAkJc3R2NjgwLT5zY3JhdGNoW2ldLnN0YXRlID0gQlVGRkVSX1VOVVNFRDsKIAl9CkBAIC02NzcsNyArNzA2LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNCVUY7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiICgwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCWdvdG8gbm9tZW1fZXJyOwogCiAJCS8qIHNidWYgaXMgdXJiLT50cmFuc2Zlcl9idWZmZXIsIGxhdGVyIGdldHMgbWVtY3B5ZWQgdG8gc2NyYXRjaCAqLwogCQl1c2JfZmlsbF9idWxrX3VyYiAodXJiLCBzdHY2ODAtPnVkZXYsCkBAIC02OTIsNiArNzIxLDIxIEBACiAKIAlzdHY2ODAtPmZyYW1lY291bnQgPSAwOwogCXJldHVybiAwOworCisgbm9tZW1fZXJyOgorCWZvciAoaSA9IDA7IGkgPCBTVFY2ODBfTlVNU0NSQVRDSDsgaSsrKSB7CisJCWtmcmVlKHN0djY4MC0+c2NyYXRjaFtpXS5kYXRhKTsKKwkJc3R2NjgwLT5zY3JhdGNoW2ldLmRhdGEgPSBOVUxMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgU1RWNjgwX05VTVNCVUY7IGkrKykgeworCQl1c2Jfa2lsbF91cmIoc3R2NjgwLT51cmJbaV0pOworCQl1c2JfZnJlZV91cmIoc3R2NjgwLT51cmJbaV0pOworCQlzdHY2ODAtPnVyYltpXSA9IE5VTEw7CisJCWtmcmVlKHN0djY4MC0+c2J1ZltpXS5kYXRhKTsKKwkJc3R2NjgwLT5zYnVmW2ldLmRhdGEgPSBOVUxMOworCX0KKwlyZXR1cm4gLUVOT01FTTsKKwogfQogCiBzdGF0aWMgaW50IHN0djY4MF9zdG9wX3N0cmVhbSAoc3RydWN0IHVzYl9zdHYgKnN0djY4MCkKQEAgLTE0MTgsOSArMTQ2MiwxMyBAQAogCVBERUJVRyAoMCwgIlNUVihpKTogcmVnaXN0ZXJlZCBuZXcgdmlkZW8gZGV2aWNlOiB2aWRlbyVkIiwgc3R2NjgwLT52ZGV2LT5taW5vcik7CiAKIAl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBzdHY2ODApOwotCXN0djY4MF9jcmVhdGVfc3lzZnNfZmlsZXMoc3R2NjgwLT52ZGV2KTsKKwlyZXR2YWwgPSBzdHY2ODBfY3JlYXRlX3N5c2ZzX2ZpbGVzKHN0djY4MC0+dmRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcl91bnJlZzsKIAlyZXR1cm4gMDsKIAorZXJyb3JfdW5yZWc6CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3R2NjgwLT52ZGV2KTsKIGVycm9yX3ZkZXY6CiAJdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3R2NjgwLT52ZGV2KTsKIGVycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODg3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYwppbmRleCA4N2ZmYjBlLi5mZGU1NzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYwpAQCAtNDgyLDYgKzQ4MiwxMiBAQAogCQlidWZbMV0gJj0gfmNRU1M7CiAJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19HQVRJTkdfMTgpCiAJCWJ1ZlszXSAmPSB+Y0dhdGluZ18zNjsKKworCWlmICh0LT50ZGE5ODg3X2NvbmZpZyAmIFREQTk4ODdfR0FJTl9OT1JNQUwpIHsKKwkJcmFkaW9fc3RlcmVvLmUgJj0gfmNUdW5lckdhaW5Mb3c7CisJCXJhZGlvX21vbm8uZSAmPSB+Y1R1bmVyR2FpbkxvdzsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYwppbmRleCA0MDU5MGJhLi43MDVkYWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYwpAQCAtNDQzLDYgKzQ0MywxMCBAQAogCQkJcHJpbnRrKCIlMDJ4ICIsYnVmZmVyW2ldKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KKwkvKiBIQUNLOiBUaGlzIHRlc3Qgd2VyZSBhZGRlZCB0byBhdm9pZCB0dW5lciB0byBwcm9iZSB0ZGE5ODQwIGFuZCB0ZWE2NDE1YyBvbiB0aGUgTVhCIGNhcmQgKi8KKwlpZiAoYWRhcC0+aWQgPT0gSTJDX0hXX1NBQTcxNDYgJiYgYWRkciA8IDB4NGEpCisJCXJldHVybiAtRU5PREVWOworCiAJLyogYXV0b2RldGVjdGlvbiBjb2RlIGJhc2VkIG9uIHRoZSBpMmMgYWRkciAqLwogCWlmICghbm9fYXV0b2RldGVjdCkgewogCQlzd2l0Y2ggKGFkZHIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCmluZGV4IDYzZGI0ZTkuLjFiOWIwNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYwpAQCAtMTA4LDYgKzEwOCw3IEBACiAJCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzM6CiAJCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMzZfTUszOgogCQljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMzoKKwkJY2FzZSBUVU5FUl9MR19OVFNDX1RBUEU6CiAJCQlzdGVyZW8gPSAoKHN0YXR1cyAmIFRVTkVSX1NJR05BTCkgPT0gVFVORVJfU1RFUkVPX01LMyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTQyMSw2ICs0MjIsNyBAQAogCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzM6CiAJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzM6CiAJY2FzZSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzM6CisJY2FzZSBUVU5FUl9MR19OVFNDX1RBUEU6CiAJCWJ1ZmZlclszXSA9IDB4MTk7CiAJCWJyZWFrOwogCWNhc2UgVFVORVJfVE5GXzUzMzVNRjoKQEAgLTQ2NSw2ICs0NjcsOCBAQAogCQkJY29uZmlnIHw9IFREQTk4ODdfSU5URVJDQVJSSUVSOwogLyoJCWlmIChwYXJhbXMtPnBvcnQxX3NldF9mb3JfZm1fbW9ubykKIAkJCWNvbmZpZyAmPSB+VERBOTg4N19QT1JUMV9BQ1RJVkU7Ki8KKwkJaWYgKHBhcmFtcy0+Zm1fZ2Fpbl9ub3JtYWwpCisJCQljb25maWcgfD0gVERBOTg4N19HQUlOX05PUk1BTDsKIAkJaTJjX2NsaWVudHNfY29tbWFuZChjLT5hZGFwdGVyLCBUREE5ODg3X1NFVF9DT05GSUcsICZjb25maWcpOwogCX0KIAlpZiAoNCAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoYyxidWZmZXIsNCkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jCmluZGV4IDhmZmY2NDIuLjc0YzNlNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItdHlwZXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXR5cGVzLmMKQEAgLTY1MSw2ICs2NTEsNyBAQAogCQkuaGFzX3RkYTk4ODcgPSAxLAogCQkucG9ydDFfaW52ZXJ0X2Zvcl9zZWNhbV9sYyA9IDEsCiAJCS5kZWZhdWx0X3BsbF9nYXRpbmdfMTggPSAxLAorCQkuZm1fZ2Fpbl9ub3JtYWw9MSwKIAl9LAogfTsKIApAQCAtNjcyLDE2ICs2NzMsNiBAQAogCX0sCiB9OwogCi0vKiAtLS0tLS0tLS0tLS0gVFVORVJfTEdfTlRTQ19UQVBFIC0gTEdJTk5PVEVLIE5UU0MgLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBzdHJ1Y3QgdHVuZXJfcGFyYW1zIHR1bmVyX2xnX250c2NfdGFwZV9wYXJhbXNbXSA9IHsKLQl7Ci0JCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCi0JCS5yYW5nZXMgPSB0dW5lcl9mbTEyMzZfbWszX250c2NfcmFuZ2VzLAotCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9mbTEyMzZfbWszX250c2NfcmFuZ2VzKSwKLQl9LAotfTsKLQogLyogLS0tLS0tLS0tLS0tIFRVTkVSX1RORl84ODMxQkdGRiAtIFBoaWxpcHMgUEFMIC0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3RuZl84ODMxYmdmZl9wYWxfcmFuZ2VzW10gPSB7CkBAIC0xMDQ2LDcgKzEwMzcsNiBAQAogCQkudHlwZSAgID0gVFVORVJfUEFSQU1fVFlQRV9OVFNDLAogCQkucmFuZ2VzID0gdHVuZXJfc2Ftc3VuZ190Y3BuXzIxMjFwMzBhX250c2NfcmFuZ2VzLAogCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9zYW1zdW5nX3RjcG5fMjEyMXAzMGFfbnRzY19yYW5nZXMpLAotCQkuaGFzX3RkYTk4ODcgPSAxLAogCX0sCiB9OwogCkBAIC0xMzMyLDggKzEzMjIsOCBAQAogCX0sCiAJW1RVTkVSX0xHX05UU0NfVEFQRV0gPSB7IC8qIExHSU5OT1RFSyBOVFNDICovCiAJCS5uYW1lICAgPSAiTEcgTlRTQyAoVEFQRSBzZXJpZXMpIiwKLQkJLnBhcmFtcyA9IHR1bmVyX2xnX250c2NfdGFwZV9wYXJhbXMsCi0JCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX2xnX250c2NfdGFwZV9wYXJhbXMpLAorCQkucGFyYW1zID0gdHVuZXJfZm0xMjM2X21rM19wYXJhbXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX2ZtMTIzNl9tazNfcGFyYW1zKSwKIAl9LAogCVtUVU5FUl9UTkZfODgzMUJHRkZdID0geyAvKiBQaGlsaXBzIFBBTCAqLwogCQkubmFtZSAgID0gIlRlbm5hIFRORiA4ODMxIEJHRkYpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKaW5kZXggZmNhZWY0Yi4uZDUwNmRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdHZhdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKaW5kZXggZTZiYWFlZS4uMjYyNGUzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwpAQCAtNDMwLDcgKzQzMCw3IEBACiAJCQl0dmVlLT5oYXNfcmFkaW8gPSBlZXByb21fZGF0YVtpK2xlbi0xXTsKIAkJCS8qIG9sZCBzdHlsZSB0YWcsIGRvbid0IGtub3cgaG93IHRvIGRldGVjdAogCQkJSVIgcHJlc2VuY2UsIG1hcmsgYXMgdW5rbm93bi4gKi8KLQkJCXR2ZWUtPmhhc19pciA9IDI7CisJCQl0dmVlLT5oYXNfaXIgPSAtMTsKIAkJCXR2ZWUtPm1vZGVsID0KIAkJCQllZXByb21fZGF0YVtpKzhdICsKIAkJCQkoZWVwcm9tX2RhdGFbaSs5XSA8PCA4KTsKQEAgLTQ2OCw3ICs0NjgsNyBAQAogCQkJCShlZXByb21fZGF0YVtpKzZdIDw8IDgpICsKIAkJCQkoZWVwcm9tX2RhdGFbaSs3XSA8PCAxNik7CiAKLQkJCQlpZiAoIChlZXByb21fZGF0YVtpICsgOF0gJiYgMHhmMCkgJiYKKwkJCQlpZiAoIChlZXByb21fZGF0YVtpICsgOF0gJiAweGYwKSAmJgogCQkJCQkodHZlZS0+c2VyaWFsX251bWJlciA8IDB4ZmZmZmZmKSApIHsKIAkJCQkJdHZlZS0+TUFDX2FkZHJlc3NbMF0gPSAweDAwOwogCQkJCQl0dmVlLT5NQUNfYWRkcmVzc1sxXSA9IDB4MEQ7CkBAIC02NTMsMTMgKzY1MywxNCBAQAogCQkJU1RSTShkZWNvZGVySUMsIHR2ZWUtPmRlY29kZXJfcHJvY2Vzc29yKSwKIAkJCXR2ZWUtPmRlY29kZXJfcHJvY2Vzc29yKTsKIAl9Ci0JaWYgKHR2ZWUtPmhhc19pciA9PSAyKQorCWlmICh0dmVlLT5oYXNfaXIgPT0gLTEpCiAJCXR2ZWVwcm9tX2luZm8oImhhcyAlc3JhZGlvXG4iLAogCQkJCXR2ZWUtPmhhc19yYWRpbyA/ICIiIDogIm5vICIpOwogCWVsc2UKLQkJdHZlZXByb21faW5mbygiaGFzICVzcmFkaW8sIGhhcyAlc0lSIHJlbW90ZVxuIiwKKwkJdHZlZXByb21faW5mbygiaGFzICVzcmFkaW8sIGhhcyAlc0lSIHJlY2VpdmVyLCBoYXMgJXNJUiB0cmFuc21pdHRlclxuIiwKIAkJCQl0dmVlLT5oYXNfcmFkaW8gPyAiIiA6ICJubyAiLAotCQkJCXR2ZWUtPmhhc19pciA/ICIiIDogIm5vICIpOworCQkJCSh0dmVlLT5oYXNfaXIgJiAxKSA/ICIiIDogIm5vICIsCisJCQkJKHR2ZWUtPmhhc19pciAmIDIpID8gIiIgOiAibm8gIik7CiB9CiBFWFBPUlRfU1lNQk9MKHR2ZWVwcm9tX2hhdXBwYXVnZV9hbmFsb2cpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYwppbmRleCA5YTI2Yjk0Li5lYzBmZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKQEAgLTg2LDYgKzg2LDcgQEAKIHN0YXRpYyB2b2lkIHFjbV9yZWdpc3Rlcl9pbnB1dChzdHJ1Y3QgcWNtICpjYW0sIHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnJvcjsKIAogCXVzYl9tYWtlX3BhdGgoZGV2LCBjYW0tPmlucHV0X3BoeXNuYW1lLCBzaXplb2YoY2FtLT5pbnB1dF9waHlzbmFtZSkpOwogCXN0cm5jYXQoY2FtLT5pbnB1dF9waHlzbmFtZSwgIi9pbnB1dDAiLCBzaXplb2YoY2FtLT5pbnB1dF9waHlzbmFtZSkpOwpAQCAtMTA2LDcgKzEwNywxMyBAQAogCiAJaW5wdXRfZGV2LT5wcml2YXRlID0gY2FtOwogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNhbS0+aW5wdXQpOworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNhbS0+aW5wdXQpOworCWlmIChlcnJvcikgeworCQl3YXJuKCJGYWlsZWQgdG8gcmVnaXN0ZXIgY2FtZXJhJ3MgaW5wdXQgZGV2aWNlLCBlcnI6ICVkXG4iLAorCQkgICAgIGVycm9yKTsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoY2FtLT5pbnB1dCk7CisJCWNhbS0+aW5wdXQgPSBOVUxMOworCX0KIH0KIAogc3RhdGljIHZvaWQgcWNtX3VucmVnaXN0ZXJfaW5wdXQoc3RydWN0IHFjbSAqY2FtKQpAQCAtMTkwLDggKzE5Nyw3IEBACiAKIHN0YXRpYyB2b2lkIHFjbV9mcmVlX2ludChzdHJ1Y3QgcWNtICpjYW0pCiB7Ci0JaWYgKGNhbS0+YnV0dG9uX3VyYikKLQkJdXNiX2ZyZWVfdXJiKGNhbS0+YnV0dG9uX3VyYik7CisJdXNiX2ZyZWVfdXJiKGNhbS0+YnV0dG9uX3VyYik7CiB9CiAjZW5kaWYgLyogQ09ORklHX0lOUFVUICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdXNidmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdXNidmlkZW8uYwppbmRleCBkOGI4ODAyLi5iNTYwYzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91c2J2aWRlby5jCkBAIC02OTAsNyArNjkwLDcgQEAKIAl9CiAKIAliYXNlX3NpemUgPSBudW1fY2FtcyAqIHNpemVvZihzdHJ1Y3QgdXZkKSArIHNpemVvZihzdHJ1Y3QgdXNidmlkZW8pOwotCWNhbXMgPSAoc3RydWN0IHVzYnZpZGVvICopIGt6YWxsb2MoYmFzZV9zaXplLCBHRlBfS0VSTkVMKTsKKwljYW1zID0ga3phbGxvYyhiYXNlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmIChjYW1zID09IE5VTEwpIHsKIAkJZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQuIGJ5dGVzIGZvciB1c2J2aWRlbyBzdHJ1Y3QiLCBiYXNlX3NpemUpOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjRlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi9LY29uZmlnCkBAIC0wLDAgKzEsMTIgQEAKK2NvbmZpZyBWSURFT19VU0JWSVNJT04KKwl0cmlzdGF0ZSAiVVNCIHZpZGVvIGRldmljZXMgYmFzZWQgb24gTm9nYXRlY2ggTlQxMDAzLzEwMDQvMTAwNSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyCisJc2VsZWN0IFZJREVPX1RVTkVSCisJc2VsZWN0IFZJREVPX1NBQTcxMVggaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KKwktLS1oZWxwLS0tCisJICBUaGVyZSBhcmUgbW9yZSB0aGFuIDUwIGRpZmZlcmVudCBVU0IgdmlkZW8gZGV2aWNlcyBiYXNlZCBvbgorCSAgTlQxMDAzLzEwMDQvMTAwNSBVU0IgQnJpZGdlcy4gVGhpcyBkcml2ZXIgZW5hYmxlcyB1c2luZyB0aG9zZQorCSAgZGV2aWNlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdXNidmlzaW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWM5MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACit1c2J2aXNpb24tb2JqcyAgOj0gdXNidmlzaW9uLWNvcmUubyB1c2J2aXNpb24tdmlkZW8ubyB1c2J2aXNpb24taTJjLm8gdXNidmlzaW9uLWNhcmRzLm8KKworb2JqLSQoQ09ORklHX1ZJREVPX1VTQlZJU0lPTikgKz0gdXNidmlzaW9uLm8KKworRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS92aWRlbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY2FyZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzRlYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNhcmRzLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBVU0JWSVNJT04uSAorICogIHVzYnZpc2lvbiBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IEpvZXJnIEhlY2tlbmJhY2ggPGpvZXJnQGhlY2tlbmJhY2gtYXcuZGU+CisgKgorICogVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB1c2J2aXNpb24gZHJpdmVyIHByb2plY3QuCisgKiBVcGRhdGVzIHRvIGRyaXZlciBjb21wbGV0ZWQgYnkgRHdhaW5lIFAuIEdhcmRlbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSAidXNidmlzaW9uLmgiCisKKy8qIFN1cHBvcnRlZCBEZXZpY2VzOiBBIHRhYmxlIGZvciB1c2J2aXNpb24uYyovCitzdHJ1Y3QgdXNidmlzaW9uX2RldmljZV9kYXRhX3N0ICB1c2J2aXNpb25fZGV2aWNlX2RhdGFbXSA9IHsKKwl7MHhGRkYwLCAweEZGRjAsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIkN1c3RvbSBEdW1teSBVU0JWaXNpb24gRGV2aWNlIn0sCisJezB4MEE2RiwgMHgwNDAwLCAtMSwgQ09ERUNfU0FBNzExMywgNCwgVjRMMl9TVERfTlRTQywgIDEsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsICJYYW5ib28ifSwKKwl7MHgwNTBELCAweDAyMDgsIC0xLCBDT0RFQ19TQUE3MTEzLCAyLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkJlbGtpbiBVU0JWaWV3IElJIn0sCisJezB4MDU3MSwgMHgwMDAyLCAgMCwgQ09ERUNfU0FBNzExMSwgMiwgVjRMMl9TVERfUEFMLCAgIDAsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgIDcsICJlY2hvRlggSW50ZXJWaWV3IExpdGUifSwKKwl7MHgwNTczLCAweDAwMDMsIC0xLCBDT0RFQ19TQUE3MTExLCAyLCBWNEwyX1NURF9OVFNDLCAgMSwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIlVTQkdlYXIgVVNCRy1WMSByZXNwLiBIQU1BIFVTQiJ9LAorCXsweDA1NzMsIDB4MDQwMCwgLTEsIENPREVDX1NBQTcxMTMsIDQsIFY0TDJfU1REX05UU0MsICAwLCAwLCAxLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiRC1MaW5rIFYxMDAifSwKKwl7MHgwNTczLCAweDIwMDAsIC0xLCBDT0RFQ19TQUE3MTExLCAyLCBWNEwyX1NURF9OVFNDLCAgMSwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIlgxMCBVU0IgQ2FtZXJhIn0sCisJezB4MDU3MywgMHgyZDAwLCAtMSwgQ09ERUNfU0FBNzExMSwgMiwgVjRMMl9TVERfUEFMLCAgIDEsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAgMywgIDcsICJPc3ByZXkgNTAifSwKKwl7MHgwNTczLCAweDJkMDEsIC0xLCBDT0RFQ19TQUE3MTEzLCAyLCBWNEwyX1NURF9OVFNDLAkgMCwgMCwgMSwgMCwgMCwJCQkJIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBVU0ItTGl2ZSBNb2RlbCA2MDAifSwKKwl7MHgwNTczLCAweDIxMDEsIC0xLCBDT0RFQ19TQUE3MTEzLCAyLCBWNEwyX1NURF9QQUwsIAkgMiwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIlpvcmFuIENvLiBQTUQgKE5vZ2F0ZWNoKSBBVi1ncmFiYmVyIE1hbmhhdHRhbiJ9LAorCXsweDA1NzMsIDB4NDEwMCwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX05UU0MsICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX05UU0NfTSwgICAgICAgLTEsIC0xLCAtMSwgMjAsIC0xLCAiTm9nYXRlY2ggVVNCLVRWIChOVFNDKSBGTSJ9LAorCXsweDA1NzMsIDB4NDExMCwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX05UU0MsICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX05UU0NfTSwgICAgICAgLTEsIC0xLCAtMSwgMjAsIC0xLCAiUE5ZIFVTQi1UViAoTlRTQykgRk0ifSwKKwl7MHgwNTczLCAweDQ0NTAsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIlBpeGVsVmlldyBQbGF5VHYtVVNCIFBSTyAoUEFMKSBGTSJ9LAorCXsweDA1NzMsIDB4NDU1MCwgIDAsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX1BBTCwgICAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiWlRWIFpULTcyMSAyLjRHSHogVVNCIEEvViBSZWNlaXZlciJ9LAorCXsweDA1NzMsIDB4NGQwMCwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX05UU0MsICAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX05UU0NfTSwgICAgICAgLTEsIC0xLCAtMSwgMjAsIC0xLCAiSGF1cHBhdWdlIFdpblR2LVVTQiBVU0EifSwKKwl7MHgwNTczLCAweDRkMDEsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIkhhdXBwYXVnZSBXaW5Udi1VU0IifSwKKwl7MHgwNTczLCAweDRkMDIsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIkhhdXBwYXVnZSBXaW5Udi1VU0IgKE5UU0MpIn0sCisJezB4MDU3MywgMHg0ZDAzLCAtMSwgQ09ERUNfU0FBNzExMSwgMywgVjRMMl9TVERfU0VDQU0sIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfU0VDQU0sICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsICJIYXVwcGF1Z2UgV2luVHYtVVNCIChTRUNBTSkgIn0sCisJezB4MDU3MywgMHg0ZDEwLCAtMSwgQ09ERUNfU0FBNzExMSwgMywgVjRMMl9TVERfTlRTQywgIDEsIDEsIDEsIDEsIFRVTkVSX1BISUxJUFNfTlRTQ19NLCAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsICJIYXVwcGF1Z2UgV2luVHYtVVNCIChOVFNDKSBGTSJ9LAorCXsweDA1NzMsIDB4NGQxMSwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX1BBTCwgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiSGF1cHBhdWdlIFdpblR2LVVTQiAoUEFMKSBGTSJ9LAorCXsweDA1NzMsIDB4NGQxMiwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX1BBTCwgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiSGF1cHBhdWdlIFdpblR2LVVTQiAoUEFMKSBGTSJ9LAorCXsweDA1NzMsIDB4NGQyYSwgIDAsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX05UU0MsICAxLCAxLCAxLCAxLCBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNSwgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiSGF1cHBhdWdlIFdpblR2IFVTQiAoTlRTQykgRk0gTW9kZWwgNjAyIDQwMjAxIFJldiBCMjg1In0sCisJezB4MDU3MywgMHg0ZDJiLCAgMCwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfTlRTQywgIDEsIDEsIDEsIDEsIFRVTkVSX01JQ1JPVFVORV80MDQ5Rk01LCAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYgVVNCIChOVFNDKSBGTSBNb2RlbCA2MDIgNDAyMDEgUmV2IEIyODIifSwKKwl7MHgwNTczLCAweDRkMmMsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5UdiBVU0IgKFBBTC9TRUNBTSkgNDAyMDkgUmV2IEUxQTUifSwKKwl7MHgwNTczLCAweDRkMjAsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgSUkgKFBBTCkgRk0gTW9kZWwgNDAyMDEgUmV2IEIyMjYifSwKKwl7MHgwNTczLCAweDRkMjEsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgSUkgKFBBTCkifSwKKwl7MHgwNTczLCAweDRkMjIsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgSUkgKFBBTCkgTU9ERUwgNTY2In0sCisJezB4MDU3MywgMHg0ZDIzLCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfU0VDQU0sIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfU0VDQU0sICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIChTRUNBTSkgNEQyMyJ9LAorCXsweDA1NzMsIDB4NGQyNSwgLTEsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1NFQ0FNLCAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX1NFQ0FNLCAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiSGF1cHBhdWdlIFdpblR2LVVTQiAoU0VDQU0pIE1vZGVsIDQwMjA5IFJldiBCMjM0In0sCisJezB4MDU3MywgMHg0ZDI2LCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfU0VDQU0sIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfU0VDQU0sICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIChTRUNBTSkgTW9kZWwgNDAyMDkgUmV2IEIyNDMifSwKKwl7MHgwNTczLCAweDRkMjcsIC0xLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMSwgVFVORVJfQUxQU19UU0JFMV9QQUwsICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgTW9kZWwgNDAyMDQgUmV2IEIyODEifSwKKwl7MHgwNTczLCAweDRkMjgsIC0xLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMSwgVFVORVJfQUxQU19UU0JFMV9QQUwsICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgTW9kZWwgNDAyMDQgUmV2IEIyODMifSwKKwl7MHgwNTczLCAweDRkMjksIC0xLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgTW9kZWwgNDAyMDUgUmV2IEIyOTgifSwKKwl7MHgwNTczLCAweDRkMzAsIC0xLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgRk0gTW9kZWwgNDAyMTEgUmV2IEIxMjMifSwKKwl7MHgwNTczLCAweDRkMzEsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgSUlJIChQQUwpIEZNIE1vZGVsIDU2OCJ9LAorCXsweDA1NzMsIDB4NGQzMiwgIDAsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX1BBTCwgICAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiSGF1cHBhdWdlIFdpblR2LVVTQiBJSUkgKFBBTCkgRk0gTW9kZWwgNTczIn0sCisJezB4MDU3MywgMHg0ZDM1LCAgMCwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDEsIDEsIDEsIFRVTkVSX01JQ1JPVFVORV80MDQ5Rk01LCAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIElJSSAoUEFMKSBGTSBNb2RlbCA0MDIxOSBSZXYgQjI1MiJ9LAorCXsweDA1NzMsIDB4NGQzNywgIDAsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywgLTEsIC0xLCAgMCwgIDMsICA3LCAiSGF1cHBhdWdlIFdpblRWIFVTQiBkZXZpY2UgTW9kZWwgNDAyMTkgUmV2IEUxODkifSwKKwl7MHgwNzY4LCAweDAwMDYsIC0xLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgIDUsICA1LCAtMSwgIkNhbXRlbCBUZWNobm9sb2d5IFVTQiBUViBHZW5pZSBQcm8gRk0gTW9kZWwgVFZCMzMwIn0sCisJezB4MDdkMCwgMHgwMDAxLCAtMSwgQ09ERUNfU0FBNzExMywgMiwgVjRMMl9TVERfUEFMLCAgIDAsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJEaWdpdGFsIFZpZGVvIENyZWF0b3IgSSJ9LAorCXsweDA3ZDAsIDB4MDAwMiwgLTEsIENPREVDX1NBQTcxMTEsIDIsIFY0TDJfU1REX05UU0MsICAwLCAwLCAxLCAwLCAwLCAgIAkJCSAtMSwgLTEsIDgyLCAyMCwgIDcsICJHbG9iYWwgVmlsbGFnZSBHVi0wMDcgKE5UU0MpIn0sCisJezB4MDdkMCwgMHgwMDAzLCAgMCwgQ09ERUNfU0FBNzExMywgMiwgVjRMMl9TVERfTlRTQywgIDAsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy01MCBSZXYgMSAoTlRTQykifSwKKwl7MHgwN2QwLCAweDAwMDQsICAwLCBDT0RFQ19TQUE3MTEzLCAyLCBWNEwyX1NURF9QQUwsICAgMCwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkRhenpsZSBGdXNpb24gTW9kZWwgRFZDLTgwIFJldiAxIChQQUwpIn0sCisJezB4MDdkMCwgMHgwMDA1LCAgMCwgQ09ERUNfU0FBNzExMywgMiwgVjRMMl9TVERfU0VDQU0sIDAsIDAsIDEsIDAsIDAsCQkJCSAtMSwgLTEsICAwLCAgMywgIDcsICJEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy05MCBSZXYgMSAoU0VDQU0pIn0sCisJezB4MjMwNCwgMHgwMTBkLCAtMSwgQ09ERUNfU0FBNzExMSwgMywgVjRMMl9TVERfUEFMLCAgIDEsIDAsIDAsIDEsIFRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0ksICAtMSwgLTEsIC0xLCAtMSwgLTEsICJQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkifSwKKwl7MHgyMzA0LCAweDAxMDksIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9TRUNBTSwgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19TRUNBTSwgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoU0VDQU0pIn0sCisJezB4MjMwNCwgMHgwMTEwLCAtMSwgQ09ERUNfU0FBNzExMSwgMywgVjRMMl9TVERfUEFMLCAgIDEsIDEsIDEsIDEsIFRVTkVSX1BISUxJUFNfUEFMLCAgICAgICAgICAtMSwgLTEsMTI4LCAyMywgLTEsICJQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgRk0ifSwKKwl7MHgyMzA0LCAweDAxMTEsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIk1pcm8gUENUViBVU0IifSwKKwl7MHgyMzA0LCAweDAxMTIsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoTlRTQykgRk0ifSwKKwl7MHgyMzA0LCAweDAyMTAsIC0xLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfVEVNSUNfNDAwOUZSNV9QQUwsICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSBGTSJ9LAorCXsweDIzMDQsIDB4MDIxMiwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX05UU0MsICAxLCAxLCAxLCAxLCBUVU5FUl9URU1JQ180MDM5RlI1X05UU0MsICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChOVFNDKSBGTSJ9LAorCXsweDIzMDQsIDB4MDIxNCwgLTEsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAxLCAxLCAxLCBUVU5FUl9URU1JQ180MDA5RlI1X1BBTCwgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChQQUwpIEZNIn0sCisJezB4MjMwNCwgMHgwMzAwLCAtMSwgQ09ERUNfU0FBNzExMywgMiwgVjRMMl9TVERfTlRTQywgIDEsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJQaW5uYWNsZSBTdHVkaW8gTGlueCBWaWRlbyBpbnB1dCBjYWJsZSAoTlRTQykifSwKKwl7MHgyMzA0LCAweDAzMDEsIC0xLCBDT0RFQ19TQUE3MTEzLCAyLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIlBpbm5hY2xlIFN0dWRpbyBMaW54IFZpZGVvIGlucHV0IGNhYmxlIChQQUwpIn0sCisJezB4MjMwNCwgMHgwNDE5LCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDEsIDEsIDEsIFRVTkVSX1RFTUlDXzQwMDlGUjVfUEFMLCAgICAtMSwgLTEsICAwLCAgMywgIDcsICJQaW5uYWNsZSBQQ1RWIEJ1bmdlZSBVU0IgKFBBTCkgRk0ifSwKKwl7MHgyNDAwLCAweDQyMDAsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWSURFT19NT0RFX05UU0MsICAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX05UU0NfTSwgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiSGF1cHBhdWdlIFdpblR2LVVTQiJ9LAorCXt9ICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworLyogU3VwcG9ydGVkIERldmljZXMgKi8KKworc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNidmlzaW9uX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRSgweEZGRjAsIDB4RkZGMCkgfSwgIC8qIEN1c3RvbSBEdW1teSBVU0JWaXNpb24gRGV2aWNlICovCisJeyBVU0JfREVWSUNFKDB4MEE2RiwgMHgwNDAwKSB9LCAgLyogWGFuYm9vICovCisJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHgwMjA4KSB9LCAgLyogQmVsa2luIFVTQlZpZXcgSUkgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTcxLCAweDAwMDIpIH0sICAvKiBlY2hvRlggSW50ZXJWaWV3IExpdGUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDAwMDMpIH0sICAvKiBVU0JHZWFyIFVTQkctVjEgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDA0MDApIH0sICAvKiBELUxpbmsgVjEwMCAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4MjAwMCkgfSwgIC8qIFgxMCBVU0IgQ2FtZXJhICovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHgyZDAwKSB9LCAgLyogT3NwcmV5IDUwICovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHgyZDAxKSB9LCAgLyogSGF1cHBhdWdlIFVTQi1MaXZlIE1vZGVsIDYwMCAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4MjEwMSkgfSwgIC8qIFpvcmFuIENvLiBQTUQgKE5vZ2F0ZWNoKSBBVi1ncmFiYmVyIE1hbmhhdHRhbiAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NDEwMCkgfSwgIC8qIE5vZ2F0ZWNoIFVTQi1UViBGTSAoTlRTQykgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDQxMTApIH0sICAvKiBQTlkgVVNCLVRWIChOVFNDKSBGTSAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NDQ1MCkgfSwgIC8qIFBpeGVsVmlldyBQbGF5VHYtVVNCIFBSTyAoUEFMKSBGTSAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NDU1MCkgfSwgIC8qIFpUViBaVC03MjEgMi40R0h6IFVTQiBBL1YgUmVjZWl2ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMDApIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIFVTQSAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQwMSkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMDIpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIFVLICovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDAzKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBGcmFuY2UgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMTApIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIHdpdGggRk0gVVNBIHJhZGlvICovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDExKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiAoUEFMKSB3aXRoIEZNIHJhZGlvICovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDEyKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBVSyB3aXRoIEZNIFJhZGlvICovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDJhKSB9LCAgLyogSGF1cHBhZ3VlIFdpblR2IFVTQiBNb2RlbCA2MDIgNDAyMDEgUmV2IEIyODUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMmIpIH0sICAvKiBIYXVwcGFndWUgV2luVHYgVVNCIE1vZGVsIDYwMiA0MDIwMSBSZXYgQjI4MiAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyYykgfSwgIC8qIEhhdXBwYWd1ZSBXaW5UdiBVU0IgTW9kZWwgNDAyMDkgUmV2LiBFMUE1IFBBTCovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDIwKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBJSSAoUEFMKSBGTSBNb2RlbCA0MDIwMSBSZXYgQjIyNiAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyMSkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgSUkgKFBBTCkgd2l0aCBGTSByYWRpbyovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDIyKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBJSSAoUEFMKSBNb2RlbCA1NjYgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjMpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIEZyYW5jZSA0RDIzKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjUpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjA5IHJldiBCMjM0ICovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDI2KSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBNb2RlbCA0MDIwOSBSZXYgQjI0MyAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyNykgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgTW9kZWwgNDAyMDQgUmV2IEIyODEgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjgpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjA0IFJldiBCMjgzICovCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDI5KSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBNb2RlbCA0MDIwNSBSZXYgQjI5OCAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQzMCkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgRk0gTW9kZWwgNDAyMTEgUmV2IEIxMjMgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMzEpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIElJSSAoUEFMKSB3aXRoIEZNIHJhZGlvIE1vZGVsIDU2OCAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQzMikgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgSUlJIChQQUwpIEZNIE1vZGVsIDU3MyAqLworCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQzNSkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgSUlJIChTRUNBTSkgRk0gTW9kZWwgNDAyMTkgUmV2IEIyNTIgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMzcpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjE5IFJldiBFMTg5ICovCisJeyBVU0JfREVWSUNFKDB4MDc2OCwgMHgwMDA2KSB9LCAgLyogQ2FtdGVsIFRlY2hub2xvZ3kgVVNCIFRWIEdlbmllIFBybyBGTSBNb2RlbCBUVkIzMzAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwN2QwLCAweDAwMDEpIH0sICAvKiBEaWdpdGFsIFZpZGVvIENyZWF0b3IgSSAqLworCXsgVVNCX0RFVklDRSgweDA3ZDAsIDB4MDAwMikgfSwgIC8qIEdsb2JhbCBWaWxsYWdlIEdWLTAwNyAoTlRTQykgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwN2QwLCAweDAwMDMpIH0sICAvKiBEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy01MCBSZXYgMSAoTlRTQykgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwN2QwLCAweDAwMDQpIH0sICAvKiBEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy04MCBSZXYgMSAoUEFMKSAqLworCXsgVVNCX0RFVklDRSgweDA3ZDAsIDB4MDAwNSkgfSwgIC8qIERhenpsZSBGdXNpb24gTW9kZWwgRFZDLTkwIFJldiAxIChTRUNBTSkgKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAxMGQpIH0sICAvKiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAxMDkpIH0sICAvKiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFNFQ0FNKSAqLworCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDExMCkgfSwgIC8qIFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSAqLworCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDExMSkgfSwgIC8qIE1pcm8gUENUViBVU0IgKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAxMTIpIH0sICAvKiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKE5UU0MpIHdpdGggRk0gcmFkaW8gKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAyMTApIH0sICAvKiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgd2l0aCBGTSByYWRpbyAqLworCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDIxMikgfSwgIC8qIFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoTlRTQykgd2l0aCBGTSByYWRpbyAqLworCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDIxNCkgfSwgIC8qIFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSB3aXRoIEZNIHJhZGlvICovCisJeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMzAwKSB9LCAgLyogUGlubmFjbGUgU3R1ZGlvIExpbnggVmlkZW8gaW5wdXQgY2FibGUgKE5UU0MpICovCisJeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMzAxKSB9LCAgLyogUGlubmFjbGUgU3R1ZGlvIExpbnggVmlkZW8gaW5wdXQgY2FibGUgKFBBTCkgKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDA0MTkpIH0sICAvKiBQaW5uYWNsZSBQQ1RWIEJ1bmdlZSBVU0IgKFBBTCkgRk0gKi8KKworCXsgVVNCX0RFVklDRSgweDI0MDAsIDB4NDIwMCkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IyIE1vZGVsIDQyMDEyICovCisKKwl7IH0gIC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHVzYnZpc2lvbl90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTdiOTdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYwpAQCAtMCwwICsxLDI1NTQgQEAKKy8qCisgKiB1c2J2aXNpb24tY29yZS5jIC0gZHJpdmVyIGZvciBOVDEwMHggVVNCIHZpZGVvIGNhcHR1cmUgZGV2aWNlcworICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBKb2VyZyBIZWNrZW5iYWNoIDxqb2VyZ0BoZWNrZW5iYWNoLWF3LmRlPgorICogICAgICAgICAgICAgICAgICAgICAgICAgRHdhaW5lIEdhcmRlbiA8ZHdhaW5lZ2FyZGVuQHJvZ2Vycy5jb20+CisgKgorICogVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB1c2J2aXNpb24gZHJpdmVyIHByb2plY3QuCisgKiBVcGRhdGVzIHRvIGRyaXZlciBjb21wbGV0ZWQgYnkgRHdhaW5lIFAuIEdhcmRlbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zYWE3MTE1Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2lmZGVmIENPTkZJR19LTU9ECisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ1c2J2aXNpb24uaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBjb3JlX2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbShjb3JlX2RlYnVnLGludCwwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY29yZV9kZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtjb3JlXSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGZvcmNlX3Rlc3RwYXR0ZXJuID0gMDsKK21vZHVsZV9wYXJhbShmb3JjZV90ZXN0cGF0dGVybixpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3Rlc3RwYXR0ZXJuLCJlbmFibGUgdGVzdCBwYXR0ZXJuIGRpc3BsYXkgW2NvcmVdIik7CisKK3N0YXRpYyBpbnQgYWRqdXN0Q29tcHJlc3Npb24gPSAxOwkJCS8vIFNldCB0aGUgY29tcHJlc3Npb24gdG8gYmUgYWRhcHRpdmUKK21vZHVsZV9wYXJhbShhZGp1c3RDb21wcmVzc2lvbiwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWRqdXN0Q29tcHJlc3Npb24sICIgU2V0IHRoZSBBRFBDTSBjb21wcmVzc2lvbiBmb3IgdGhlIGRldmljZS4gIERlZmF1bHQ6IDEgKE9uKSIpOworCitzdGF0aWMgaW50IFN3aXRjaFNWaWRlb0lucHV0ID0gMDsJCQkvLyBUbyBoZWxwIHBlb3BsZSB3aXRoIEJsYWNrIGFuZCBXaGl0ZSBvdXRwdXQgd2l0aCB1c2luZyBzLXZpZGVvIGlucHV0LiAgU29tZSBjYWJsZXMgYW5kIGlucHV0IGRldmljZSBhcmUgd2lyZWQgZGlmZmVyZW50bHkuCittb2R1bGVfcGFyYW0oU3dpdGNoU1ZpZGVvSW5wdXQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKFN3aXRjaFNWaWRlb0lucHV0LCAiIFNldCB0aGUgUy1WaWRlbyBpbnB1dC4gIFNvbWUgY2FibGVzIGFuZCBpbnB1dCBkZXZpY2UgYXJlIHdpcmVkIGRpZmZlcmVudGx5LiBEZWZhdWx0OiAwIChPZmYpIik7CisKKyNkZWZpbmUJRU5BQkxFX0hFWERVTVAJMAkvKiBFbmFibGUgaWYgeW91IG5lZWQgaXQgKi8KKworCisjaWZkZWYgVVNCVklTSU9OX0RFQlVHCisJI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorCQlpZiAoY29yZV9kZWJ1ZyAmIChsZXZlbCkpIGluZm8oIlslczolZF0gIiBmbXQsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncykKKyNlbHNlCisJI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIERCR19IRUFERVIJMTw8MAorI2RlZmluZSBEQkdfSVJRCQkxPDwxCisjZGVmaW5lIERCR19JU09DCTE8PDIKKyNkZWZpbmUgREJHX1BBUlNFCTE8PDMKKyNkZWZpbmUgREJHX1NDUkFUQ0gJMTw8NAorI2RlZmluZSBEQkdfRlVOQwkxPDw1CisKK3N0YXRpYyBjb25zdCBpbnQgbWF4X2ltZ3dpZHRoID0gTUFYX0ZSQU1FX1dJRFRIOworc3RhdGljIGNvbnN0IGludCBtYXhfaW1naGVpZ2h0ID0gTUFYX0ZSQU1FX0hFSUdIVDsKK3N0YXRpYyBjb25zdCBpbnQgbWluX2ltZ3dpZHRoID0gTUlOX0ZSQU1FX1dJRFRIOworc3RhdGljIGNvbnN0IGludCBtaW5faW1naGVpZ2h0ID0gTUlOX0ZSQU1FX0hFSUdIVDsKKworLyogVGhlIHZhbHVlIG9mICdzY3JhdGNoX2J1Zl9zaXplJyBhZmZlY3RzIHF1YWxpdHkgb2YgdGhlIHBpY3R1cmUKKyAqIGluIG1hbnkgd2F5cy4gU2hvcnRlciBidWZmZXJzIG1heSBjYXVzZSBsb3NzIG9mIGRhdGEgd2hlbiBjbGllbnQKKyAqIGlzIHRvbyBzbG93LiBMYXJnZXIgYnVmZmVycyBhcmUgbWVtb3J5LWNvbnN1bWluZyBhbmQgdGFrZSBsb25nZXIKKyAqIHRvIHdvcmsgd2l0aC4gVGhpcyBzZXR0aW5nIGNhbiBiZSBhZGp1c3RlZCwgYnV0IHRoZSBkZWZhdWx0IHZhbHVlCisgKiBzaG91bGQgYmUgT0sgZm9yIG1vc3QgZGVza3RvcCB1c2Vycy4KKyAqLworI2RlZmluZSBERUZBVUxUX1NDUkFUQ0hfQlVGX1NJWkUJKDB4MjAwMDApCQkvLyAxMjhrQiBtZW1vcnkgc2NyYXRjaCBidWZmZXIKK3N0YXRpYyBjb25zdCBpbnQgc2NyYXRjaF9idWZfc2l6ZSA9IERFRkFVTFRfU0NSQVRDSF9CVUZfU0laRTsKKworLy8gRnVuY3Rpb24gcHJvdG90eXBlcworc3RhdGljIGludCB1c2J2aXNpb25fcmVxdWVzdF9pbnRyYSAoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7CitzdGF0aWMgaW50IHVzYnZpc2lvbl91bnJlcXVlc3RfaW50cmEgKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOworc3RhdGljIGludCB1c2J2aXNpb25fYWRqdXN0X2NvbXByZXNzaW9uIChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKTsKK3N0YXRpYyBpbnQgdXNidmlzaW9uX21lYXN1cmVfYmFuZHdpZHRoIChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGVyZSB3ZSB3YW50IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtZW1vcnkuCisgKiBUaGlzIGlzIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmVhLgorICovCisKK3ZvaWQgKnVzYnZpc2lvbl9ydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqbWVtOworCXVuc2lnbmVkIGxvbmcgYWRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJbWVtID0gdm1hbGxvY18zMihzaXplKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwlhZHIgPSAodW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlIChzaXplID4gMCkgeworCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJCWFkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBtZW07Cit9CisKK3ZvaWQgdXNidmlzaW9uX3J2ZnJlZSh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkcjsKKworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKworCWFkciA9ICh1bnNpZ25lZCBsb25nKSBtZW07CisJd2hpbGUgKChsb25nKSBzaXplID4gMCkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkJYWRyICs9IFBBR0VfU0laRTsKKwkJc2l6ZSAtPSBQQUdFX1NJWkU7CisJfQorCisJdmZyZWUobWVtKTsKK30KKworCisKKyNpZiBFTkFCTEVfSEVYRFVNUAorc3RhdGljIHZvaWQgdXNidmlzaW9uX2hleGR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwljaGFyIHRtcFs4MF07CisJaW50IGksIGs7CisKKwlmb3IgKGkgPSBrID0gMDsgbGVuID4gMDsgaSsrLCBsZW4tLSkgeworCQlpZiAoaSA+IDAgJiYgKGkgJSAxNiA9PSAwKSkgeworCQkJcHJpbnRrKCIlc1xuIiwgdG1wKTsKKwkJCWsgPSAwOworCQl9CisJCWsgKz0gc3ByaW50ZigmdG1wW2tdLCAiJTAyeCAiLCBkYXRhW2ldKTsKKwl9CisJaWYgKGsgPiAwKQorCQlwcmludGsoIiVzXG4iLCB0bXApOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc2NyYXRjaCByaW5nIGJ1ZmZlciBoYW5kbGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHNjcmF0Y2hfbGVuKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pICAgIC8qVGhpcyByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSBhY3R1YWxseSBpbiB0aGUgYnVmZmVyICovCit7CisJaW50IGxlbiA9IHVzYnZpc2lvbi0+c2NyYXRjaF93cml0ZV9wdHIgLSB1c2J2aXNpb24tPnNjcmF0Y2hfcmVhZF9wdHI7CisJaWYgKGxlbiA8IDApIHsKKwkJbGVuICs9IHNjcmF0Y2hfYnVmX3NpemU7CisJfQorCVBERUJVRyhEQkdfU0NSQVRDSCwgInNjcmF0Y2hfbGVuKCkgPSAlZFxuIiwgbGVuKTsKKworCXJldHVybiBsZW47Cit9CisKKworLyogVGhpcyByZXR1cm5zIHRoZSBmcmVlIHNwYWNlIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworaW50IHNjcmF0Y2hfZnJlZShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCWludCBmcmVlID0gdXNidmlzaW9uLT5zY3JhdGNoX3JlYWRfcHRyIC0gdXNidmlzaW9uLT5zY3JhdGNoX3dyaXRlX3B0cjsKKwlpZiAoZnJlZSA8PSAwKSB7CisJCWZyZWUgKz0gc2NyYXRjaF9idWZfc2l6ZTsKKwl9CisJaWYgKGZyZWUpIHsKKwkJZnJlZSAtPSAxOwkJCQkJCQkvKiBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB0aGUgYnVmZmVyIG11c3QgKi8KKwkJCQkJCQkJCQkvKiBsZWZ0IGJsYW5rLCBvdGhlcndpc2UgdGhlcmUgaXMgbm8gY2hhbmNlIHRvIGRpZmZlciBiZXR3ZWVuIGZ1bGwgYW5kIGVtcHR5ICovCisJfQorCVBERUJVRyhEQkdfU0NSQVRDSCwgInJldHVybiAlZFxuIiwgZnJlZSk7CisKKwlyZXR1cm4gZnJlZTsKK30KKworCisvKiBUaGlzIHB1dHMgZGF0YSBpbnRvIHRoZSBidWZmZXIgKi8KK2ludCBzY3JhdGNoX3B1dChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCWludCBsZW5fcGFydDsKKworCWlmICh1c2J2aXNpb24tPnNjcmF0Y2hfd3JpdGVfcHRyICsgbGVuIDwgc2NyYXRjaF9idWZfc2l6ZSkgeworCQltZW1jcHkodXNidmlzaW9uLT5zY3JhdGNoICsgdXNidmlzaW9uLT5zY3JhdGNoX3dyaXRlX3B0ciwgZGF0YSwgbGVuKTsKKwkJdXNidmlzaW9uLT5zY3JhdGNoX3dyaXRlX3B0ciArPSBsZW47CisJfQorCWVsc2UgeworCQlsZW5fcGFydCA9IHNjcmF0Y2hfYnVmX3NpemUgLSB1c2J2aXNpb24tPnNjcmF0Y2hfd3JpdGVfcHRyOworCQltZW1jcHkodXNidmlzaW9uLT5zY3JhdGNoICsgdXNidmlzaW9uLT5zY3JhdGNoX3dyaXRlX3B0ciwgZGF0YSwgbGVuX3BhcnQpOworCQlpZiAobGVuID09IGxlbl9wYXJ0KSB7CisJCQl1c2J2aXNpb24tPnNjcmF0Y2hfd3JpdGVfcHRyID0gMDsJCQkvKiBqdXN0IHNldCB3cml0ZV9wdHIgdG8gemVybyAqLworCQl9CisJCWVsc2UgeworCQkJbWVtY3B5KHVzYnZpc2lvbi0+c2NyYXRjaCwgZGF0YSArIGxlbl9wYXJ0LCBsZW4gLSBsZW5fcGFydCk7CisJCQl1c2J2aXNpb24tPnNjcmF0Y2hfd3JpdGVfcHRyID0gbGVuIC0gbGVuX3BhcnQ7CisJCX0KKwl9CisKKwlQREVCVUcoREJHX1NDUkFUQ0gsICJsZW49JWQsIG5ldyB3cml0ZV9wdHI9JWRcbiIsIGxlbiwgdXNidmlzaW9uLT5zY3JhdGNoX3dyaXRlX3B0cik7CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBUaGlzIG1hcmtzIHRoZSB3cml0ZV9wdHIgYXMgcG9zaXRpb24gb2YgbmV3IGZyYW1lIGhlYWRlciAqLwordm9pZCBzY3JhdGNoX21hcmtfaGVhZGVyKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJUERFQlVHKERCR19TQ1JBVENILCAiaGVhZGVyIGF0IHdyaXRlX3B0cj0lZFxuIiwgdXNidmlzaW9uLT5zY3JhdGNoX2hlYWRlcm1hcmtlcl93cml0ZV9wdHIpOworCisJdXNidmlzaW9uLT5zY3JhdGNoX2hlYWRlcm1hcmtlclt1c2J2aXNpb24tPnNjcmF0Y2hfaGVhZGVybWFya2VyX3dyaXRlX3B0cl0gPQorCQkJCXVzYnZpc2lvbi0+c2NyYXRjaF93cml0ZV9wdHI7CisJdXNidmlzaW9uLT5zY3JhdGNoX2hlYWRlcm1hcmtlcl93cml0ZV9wdHIgKz0gMTsKKwl1c2J2aXNpb24tPnNjcmF0Y2hfaGVhZGVybWFya2VyX3dyaXRlX3B0ciAlPSBVU0JWSVNJT05fTlVNX0hFQURFUk1BUktFUjsKK30KKworLyogVGhpcyBnZXRzIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGF0IHRoZSBnaXZlbiAicHRyIiBwb3NpdGlvbiAqLworaW50IHNjcmF0Y2hfZ2V0X2V4dHJhKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCAqcHRyLCBpbnQgbGVuKQoreworCWludCBsZW5fcGFydDsKKwlpZiAoKnB0ciArIGxlbiA8IHNjcmF0Y2hfYnVmX3NpemUpIHsKKwkJbWVtY3B5KGRhdGEsIHVzYnZpc2lvbi0+c2NyYXRjaCArICpwdHIsIGxlbik7CisJCSpwdHIgKz0gbGVuOworCX0KKwllbHNlIHsKKwkJbGVuX3BhcnQgPSBzY3JhdGNoX2J1Zl9zaXplIC0gKnB0cjsKKwkJbWVtY3B5KGRhdGEsIHVzYnZpc2lvbi0+c2NyYXRjaCArICpwdHIsIGxlbl9wYXJ0KTsKKwkJaWYgKGxlbiA9PSBsZW5fcGFydCkgeworCQkJKnB0ciA9IDA7CQkJCQkJCS8qIGp1c3Qgc2V0IHRoZSB5X3B0ciB0byB6ZXJvICovCisJCX0KKwkJZWxzZSB7CisJCQltZW1jcHkoZGF0YSArIGxlbl9wYXJ0LCB1c2J2aXNpb24tPnNjcmF0Y2gsIGxlbiAtIGxlbl9wYXJ0KTsKKwkJCSpwdHIgPSBsZW4gLSBsZW5fcGFydDsKKwkJfQorCX0KKworCVBERUJVRyhEQkdfU0NSQVRDSCwgImxlbj0lZCwgbmV3IHB0cj0lZFxuIiwgbGVuLCAqcHRyKTsKKworCXJldHVybiBsZW47Cit9CisKKworLyogVGhpcyBzZXRzIHRoZSBzY3JhdGNoIGV4dHJhIHJlYWQgcG9pbnRlciAqLwordm9pZCBzY3JhdGNoX3NldF9leHRyYV9wdHIoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgaW50ICpwdHIsIGludCBsZW4pCit7CisJKnB0ciA9ICh1c2J2aXNpb24tPnNjcmF0Y2hfcmVhZF9wdHIgKyBsZW4pJXNjcmF0Y2hfYnVmX3NpemU7CisKKwlQREVCVUcoREJHX1NDUkFUQ0gsICJwdHI9JWRcbiIsICpwdHIpOworfQorCisKKy8qVGhpcyBpbmNyZW1lbnRzIHRoZSBzY3JhdGNoIGV4dHJhIHJlYWQgcG9pbnRlciAqLwordm9pZCBzY3JhdGNoX2luY19leHRyYV9wdHIoaW50ICpwdHIsIGludCBsZW4pCit7CisJKnB0ciA9ICgqcHRyICsgbGVuKSAlIHNjcmF0Y2hfYnVmX3NpemU7CisKKwlQREVCVUcoREJHX1NDUkFUQ0gsICJwdHI9JWRcbiIsICpwdHIpOworfQorCisKKy8qIFRoaXMgZ2V0cyBkYXRhIGZyb20gdGhlIGJ1ZmZlciAqLworaW50IHNjcmF0Y2hfZ2V0KHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGxlbl9wYXJ0OworCWlmICh1c2J2aXNpb24tPnNjcmF0Y2hfcmVhZF9wdHIgKyBsZW4gPCBzY3JhdGNoX2J1Zl9zaXplKSB7CisJCW1lbWNweShkYXRhLCB1c2J2aXNpb24tPnNjcmF0Y2ggKyB1c2J2aXNpb24tPnNjcmF0Y2hfcmVhZF9wdHIsIGxlbik7CisJCXVzYnZpc2lvbi0+c2NyYXRjaF9yZWFkX3B0ciArPSBsZW47CisJfQorCWVsc2UgeworCQlsZW5fcGFydCA9IHNjcmF0Y2hfYnVmX3NpemUgLSB1c2J2aXNpb24tPnNjcmF0Y2hfcmVhZF9wdHI7CisJCW1lbWNweShkYXRhLCB1c2J2aXNpb24tPnNjcmF0Y2ggKyB1c2J2aXNpb24tPnNjcmF0Y2hfcmVhZF9wdHIsIGxlbl9wYXJ0KTsKKwkJaWYgKGxlbiA9PSBsZW5fcGFydCkgeworCQkJdXNidmlzaW9uLT5zY3JhdGNoX3JlYWRfcHRyID0gMDsJCQkJLyoganVzdCBzZXQgdGhlIHJlYWRfcHRyIHRvIHplcm8gKi8KKwkJfQorCQllbHNlIHsKKwkJCW1lbWNweShkYXRhICsgbGVuX3BhcnQsIHVzYnZpc2lvbi0+c2NyYXRjaCwgbGVuIC0gbGVuX3BhcnQpOworCQkJdXNidmlzaW9uLT5zY3JhdGNoX3JlYWRfcHRyID0gbGVuIC0gbGVuX3BhcnQ7CisJCX0KKwl9CisKKwlQREVCVUcoREJHX1NDUkFUQ0gsICJsZW49JWQsIG5ldyByZWFkX3B0cj0lZFxuIiwgbGVuLCB1c2J2aXNpb24tPnNjcmF0Y2hfcmVhZF9wdHIpOworCisJcmV0dXJuIGxlbjsKK30KKworCisvKiBUaGlzIHNldHMgcmVhZCBwb2ludGVyIHRvIG5leHQgaGVhZGVyIGFuZCByZXR1cm5zIGl0ICovCitpbnQgc2NyYXRjaF9nZXRfaGVhZGVyKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sc3RydWN0IHVzYnZpc2lvbl9mcmFtZV9oZWFkZXIgKmhlYWRlcikKK3sKKwlpbnQgZXJyQ29kZSA9IDA7CisKKwlQREVCVUcoREJHX1NDUkFUQ0gsICJmcm9tIHJlYWRfcHRyPSVkIiwgdXNidmlzaW9uLT5zY3JhdGNoX2hlYWRlcm1hcmtlcl9yZWFkX3B0cik7CisKKwl3aGlsZSAodXNidmlzaW9uLT5zY3JhdGNoX2hlYWRlcm1hcmtlcl93cml0ZV9wdHIgLQorCQl1c2J2aXNpb24tPnNjcmF0Y2hfaGVhZGVybWFya2VyX3JlYWRfcHRyICE9IDApIHsKKwkJdXNidmlzaW9uLT5zY3JhdGNoX3JlYWRfcHRyID0KKwkJCXVzYnZpc2lvbi0+c2NyYXRjaF9oZWFkZXJtYXJrZXJbdXNidmlzaW9uLT5zY3JhdGNoX2hlYWRlcm1hcmtlcl9yZWFkX3B0cl07CisJCXVzYnZpc2lvbi0+c2NyYXRjaF9oZWFkZXJtYXJrZXJfcmVhZF9wdHIgKz0gMTsKKwkJdXNidmlzaW9uLT5zY3JhdGNoX2hlYWRlcm1hcmtlcl9yZWFkX3B0ciAlPSBVU0JWSVNJT05fTlVNX0hFQURFUk1BUktFUjsKKwkJc2NyYXRjaF9nZXQodXNidmlzaW9uLCAodW5zaWduZWQgY2hhciAqKWhlYWRlciwgVVNCVklTSU9OX0hFQURFUl9MRU5HVEgpOworCQlpZiAoKGhlYWRlci0+bWFnaWNfMSA9PSBVU0JWSVNJT05fTUFHSUNfMSkKKwkJCSAmJiAoaGVhZGVyLT5tYWdpY18yID09IFVTQlZJU0lPTl9NQUdJQ18yKQorCQkJICYmIChoZWFkZXItPmhlYWRlckxlbmd0aCA9PSBVU0JWSVNJT05fSEVBREVSX0xFTkdUSCkpIHsKKwkJCWVyckNvZGUgPSBVU0JWSVNJT05fSEVBREVSX0xFTkdUSDsKKwkJCWhlYWRlci0+ZnJhbWVXaWR0aCAgPSBoZWFkZXItPmZyYW1lV2lkdGhMbyAgKyAoaGVhZGVyLT5mcmFtZVdpZHRoSGkgPDwgOCk7CisJCQloZWFkZXItPmZyYW1lSGVpZ2h0ID0gaGVhZGVyLT5mcmFtZUhlaWdodExvICsgKGhlYWRlci0+ZnJhbWVIZWlnaHRIaSA8PCA4KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGVyckNvZGU7Cit9CisKKworLypUaGlzIHJlbW92ZXMgbGVuIGJ5dGVzIG9mIG9sZCBkYXRhIGZyb20gdGhlIGJ1ZmZlciAqLwordm9pZCBzY3JhdGNoX3JtX29sZChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uLCBpbnQgbGVuKQoreworCisJdXNidmlzaW9uLT5zY3JhdGNoX3JlYWRfcHRyICs9IGxlbjsKKwl1c2J2aXNpb24tPnNjcmF0Y2hfcmVhZF9wdHIgJT0gc2NyYXRjaF9idWZfc2l6ZTsKKwlQREVCVUcoREJHX1NDUkFUQ0gsICJyZWFkX3B0ciBpcyBub3cgJWRcbiIsIHVzYnZpc2lvbi0+c2NyYXRjaF9yZWFkX3B0cik7Cit9CisKKworLypUaGlzIHJlc2V0cyB0aGUgYnVmZmVyIC0ga2lsbHMgYWxsIGRhdGEgaW4gaXQgdG9vICovCit2b2lkIHNjcmF0Y2hfcmVzZXQoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlQREVCVUcoREJHX1NDUkFUQ0gsICJcbiIpOworCisJdXNidmlzaW9uLT5zY3JhdGNoX3JlYWRfcHRyID0gMDsKKwl1c2J2aXNpb24tPnNjcmF0Y2hfd3JpdGVfcHRyID0gMDsKKwl1c2J2aXNpb24tPnNjcmF0Y2hfaGVhZGVybWFya2VyX3JlYWRfcHRyID0gMDsKKwl1c2J2aXNpb24tPnNjcmF0Y2hfaGVhZGVybWFya2VyX3dyaXRlX3B0ciA9IDA7CisJdXNidmlzaW9uLT5pc29jc3RhdGUgPSBJc29jU3RhdGVfTm9GcmFtZTsKK30KKworaW50IHVzYnZpc2lvbl9zY3JhdGNoX2FsbG9jKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJdXNidmlzaW9uLT5zY3JhdGNoID0gdm1hbGxvYyhzY3JhdGNoX2J1Zl9zaXplKTsKKwlzY3JhdGNoX3Jlc2V0KHVzYnZpc2lvbik7CisJaWYodXNidmlzaW9uLT5zY3JhdGNoID09IE5VTEwpIHsKKwkJZXJyKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBzY3JhdGNoIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgc2NyYXRjaF9idWZfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCB1c2J2aXNpb25fc2NyYXRjaF9mcmVlKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJaWYgKHVzYnZpc2lvbi0+c2NyYXRjaCAhPSBOVUxMKSB7CisJCXZmcmVlKHVzYnZpc2lvbi0+c2NyYXRjaCk7CisJCXVzYnZpc2lvbi0+c2NyYXRjaCA9IE5VTEw7CisJfQorfQorCisvKgorICogdXNidmlzaW9uX3Rlc3RwYXR0ZXJuKCkKKyAqCisgKiBQcm9jZWR1cmUgZm9ybXMgYSB0ZXN0IHBhdHRlcm4gKHllbGxvdyBncmlkIG9uIGJsdWUgYmFja2dyb3VuZCkuCisgKgorICogUGFyYW1ldGVyczoKKyAqIGZ1bGxmcmFtZTogICBpZiBUUlVFIHRoZW4gZW50aXJlIGZyYW1lIGlzIGZpbGxlZCwgb3RoZXJ3aXNlIHRoZSBwcm9jZWR1cmUKKyAqCQljb250aW51ZXMgZnJvbSB0aGUgY3VycmVudCBzY2FubGluZS4KKyAqIHBtb2RlCTA6IGZpbGwgdGhlIGZyYW1lIHdpdGggc29saWQgYmx1ZSBjb2xvciAobGlrZSBvbiBWQ1Igb3IgVFYpCisgKgkJMTogRHJhdyBhIGNvbG9yZWQgZ3JpZAorICoKKyAqLwordm9pZCB1c2J2aXNpb25fdGVzdHBhdHRlcm4oc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgaW50IGZ1bGxmcmFtZSwKKwkJCWludCBwbW9kZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBwcm9jW10gPSAidXNidmlzaW9uX3Rlc3RwYXR0ZXJuIjsKKwlzdHJ1Y3QgdXNidmlzaW9uX2ZyYW1lICpmcmFtZTsKKwl1bnNpZ25lZCBjaGFyICpmOworCWludCBudW1fY2VsbCA9IDA7CisJaW50IHNjYW5fbGVuZ3RoID0gMDsKKwlzdGF0aWMgaW50IG51bV9wYXNzID0gMDsKKworCWlmICh1c2J2aXNpb24gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1c2J2aXNpb24gPT0gTlVMTFxuIiwgcHJvYyk7CisJCXJldHVybjsKKwl9CisJaWYgKHVzYnZpc2lvbi0+Y3VyRnJhbWUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1c2J2aXNpb24tPmN1ckZyYW1lIGlzIE5VTEwuXG4iLCBwcm9jKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdyYWIgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKwlmcmFtZSA9IHVzYnZpc2lvbi0+Y3VyRnJhbWU7CisKKwkvKiBPcHRpb25hbGx5IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgKi8KKwlpZiAoZnVsbGZyYW1lKSB7CisJCWZyYW1lLT5jdXJsaW5lID0gMDsKKwkJZnJhbWUtPnNjYW5sZW5ndGggPSAwOworCX0KKworCS8qIEZvcm0gZXZlcnkgc2NhbiBsaW5lICovCisJZm9yICg7IGZyYW1lLT5jdXJsaW5lIDwgZnJhbWUtPmZybWhlaWdodDsgZnJhbWUtPmN1cmxpbmUrKykgeworCQlpbnQgaTsKKworCQlmID0gZnJhbWUtPmRhdGEgKyAodXNidmlzaW9uLT5jdXJ3aWR0aCAqIDMgKiBmcmFtZS0+Y3VybGluZSk7CisJCWZvciAoaSA9IDA7IGkgPCB1c2J2aXNpb24tPmN1cndpZHRoOyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgY2IgPSAweDgwOworCQkJdW5zaWduZWQgY2hhciBjZyA9IDA7CisJCQl1bnNpZ25lZCBjaGFyIGNyID0gMDsKKworCQkJaWYgKHBtb2RlID09IDEpIHsKKwkJCQlpZiAoZnJhbWUtPmN1cmxpbmUgJSAzMiA9PSAwKQorCQkJCQljYiA9IDAsIGNnID0gY3IgPSAweEZGOworCQkJCWVsc2UgaWYgKGkgJSAzMiA9PSAwKSB7CisJCQkJCWlmIChmcmFtZS0+Y3VybGluZSAlIDMyID09IDEpCisJCQkJCQludW1fY2VsbCsrOworCQkJCQljYiA9IDAsIGNnID0gY3IgPSAweEZGOworCQkJCX0gZWxzZSB7CisJCQkJCWNiID0KKwkJCQkJICAgICgobnVtX2NlbGwgKiA3KSArCisJCQkJCSAgICAgbnVtX3Bhc3MpICYgMHhGRjsKKwkJCQkJY2cgPQorCQkJCQkgICAgKChudW1fY2VsbCAqIDUpICsKKwkJCQkJICAgICBudW1fcGFzcyAqIDIpICYgMHhGRjsKKwkJCQkJY3IgPQorCQkJCQkgICAgKChudW1fY2VsbCAqIDMpICsKKwkJCQkJICAgICBudW1fcGFzcyAqIDMpICYgMHhGRjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIEp1c3QgdGhlIGJsdWUgc2NyZWVuICovCisJCQl9CisKKwkJCSpmKysgPSBjYjsKKwkJCSpmKysgPSBjZzsKKwkJCSpmKysgPSBjcjsKKwkJCXNjYW5fbGVuZ3RoICs9IDM7CisJCX0KKwl9CisKKwlmcmFtZS0+Z3JhYnN0YXRlID0gRnJhbWVTdGF0ZV9Eb25lOworCWZyYW1lLT5zY2FubGVuZ3RoICs9IHNjYW5fbGVuZ3RoOworCSsrbnVtX3Bhc3M7CisKK30KKworLyoKKyAqIHVzYnZpc2lvbl9kZWNvbXByZXNzX2FsbG9jKCkKKyAqCisgKiBhbGxvY2F0ZXMgaW50ZXJtZWRpYXRlIGJ1ZmZlciBmb3IgZGVjb21wcmVzc2lvbgorICovCitpbnQgdXNidmlzaW9uX2RlY29tcHJlc3NfYWxsb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlpbnQgSUZCX3NpemUgPSBNQVhfRlJBTUVfV0lEVEggKiBNQVhfRlJBTUVfSEVJR0hUICogMyAvIDI7CisJdXNidmlzaW9uLT5JbnRyYUZyYW1lQnVmZmVyID0gdm1hbGxvYyhJRkJfc2l6ZSk7CisJaWYgKHVzYnZpc2lvbi0+SW50cmFGcmFtZUJ1ZmZlciA9PSBOVUxMKSB7CisJCWVycigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSAlZCBmb3IgY29tcHIuIGZyYW1lIGJ1ZmZlciIsIF9fRlVOQ1RJT05fXywgSUZCX3NpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1c2J2aXNpb25fZGVjb21wcmVzc19mcmVlKCkKKyAqCisgKiBmcmVlcyBpbnRlcm1lZGlhdGUgYnVmZmVyIGZvciBkZWNvbXByZXNzaW9uCisgKi8KK3ZvaWQgdXNidmlzaW9uX2RlY29tcHJlc3NfZnJlZShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCWlmICh1c2J2aXNpb24tPkludHJhRnJhbWVCdWZmZXIgIT0gTlVMTCkgeworCQl2ZnJlZSh1c2J2aXNpb24tPkludHJhRnJhbWVCdWZmZXIpOworCQl1c2J2aXNpb24tPkludHJhRnJhbWVCdWZmZXIgPSBOVUxMOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVyZSBjb21lcyB0aGUgZGF0YSBwYXJzaW5nIHN0dWZmIHRoYXQgaXMgcnVuIGFzIGludGVycnVwdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB1c2J2aXNpb25fZmluZF9oZWFkZXIoKQorICoKKyAqIExvY2F0ZSBvbmUgb2Ygc3VwcG9ydGVkIGhlYWRlciBtYXJrZXJzIGluIHRoZSBzY3JhdGNoIGJ1ZmZlci4KKyAqLworc3RhdGljIGVudW0gUGFyc2VTdGF0ZSB1c2J2aXNpb25fZmluZF9oZWFkZXIoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlzdHJ1Y3QgdXNidmlzaW9uX2ZyYW1lICpmcmFtZTsKKwlpbnQgZm91bmRIZWFkZXIgPSAwOworCisJZnJhbWUgPSB1c2J2aXNpb24tPmN1ckZyYW1lOworCisJd2hpbGUgKHNjcmF0Y2hfZ2V0X2hlYWRlcih1c2J2aXNpb24sICZmcmFtZS0+aXNvY0hlYWRlcikgPT0gVVNCVklTSU9OX0hFQURFUl9MRU5HVEgpIHsKKwkJLy8gZm91bmQgaGVhZGVyIGluIHNjcmF0Y2gKKwkJUERFQlVHKERCR19IRUFERVIsICJmb3VuZCBoZWFkZXI6IDB4JTAyeCUwMnggJWQgJWQgJWQgJWQgJSN4IDB4JTAyeCAldSAldSIsCisJCQkJZnJhbWUtPmlzb2NIZWFkZXIubWFnaWNfMiwKKwkJCQlmcmFtZS0+aXNvY0hlYWRlci5tYWdpY18xLAorCQkJCWZyYW1lLT5pc29jSGVhZGVyLmhlYWRlckxlbmd0aCwKKwkJCQlmcmFtZS0+aXNvY0hlYWRlci5mcmFtZU51bSwKKwkJCQlmcmFtZS0+aXNvY0hlYWRlci5mcmFtZVBoYXNlLAorCQkJCWZyYW1lLT5pc29jSGVhZGVyLmZyYW1lTGF0ZW5jeSwKKwkJCQlmcmFtZS0+aXNvY0hlYWRlci5kYXRhRm9ybWF0LAorCQkJCWZyYW1lLT5pc29jSGVhZGVyLmZvcm1hdFBhcmFtLAorCQkJCWZyYW1lLT5pc29jSGVhZGVyLmZyYW1lV2lkdGgsCisJCQkJZnJhbWUtPmlzb2NIZWFkZXIuZnJhbWVIZWlnaHQpOworCisJCWlmICh1c2J2aXNpb24tPnJlcXVlc3RJbnRyYSkgeworCQkJaWYgKGZyYW1lLT5pc29jSGVhZGVyLmZvcm1hdFBhcmFtICYgMHg4MCkgeworCQkJCWZvdW5kSGVhZGVyID0gMTsKKwkJCQl1c2J2aXNpb24tPmxhc3RJc29jRnJhbWVOdW0gPSAtMTsgLy8gZG8gbm90IGNoZWNrIGZvciBsb3N0IGZyYW1lcyB0aGlzIHRpbWUKKwkJCQl1c2J2aXNpb25fdW5yZXF1ZXN0X2ludHJhKHVzYnZpc2lvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlmb3VuZEhlYWRlciA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmb3VuZEhlYWRlcikgeworCQlmcmFtZS0+ZnJtd2lkdGggPSBmcmFtZS0+aXNvY0hlYWRlci5mcmFtZVdpZHRoICogdXNidmlzaW9uLT5zdHJldGNoX3dpZHRoOworCQlmcmFtZS0+ZnJtaGVpZ2h0ID0gZnJhbWUtPmlzb2NIZWFkZXIuZnJhbWVIZWlnaHQgKiB1c2J2aXNpb24tPnN0cmV0Y2hfaGVpZ2h0OworCQlmcmFtZS0+djRsMl9saW5lc2l6ZSA9IChmcmFtZS0+ZnJtd2lkdGggKiBmcmFtZS0+djRsMl9mb3JtYXQuZGVwdGgpPj4gMzsKKwl9CisJZWxzZSB7IC8vIG5vIGhlYWRlciBmb3VuZAorCQlQREVCVUcoREJHX0hFQURFUiwgInNraXBwaW5nIHNjcmF0Y2ggZGF0YSwgbm8gaGVhZGVyIik7CisJCXNjcmF0Y2hfcmVzZXQodXNidmlzaW9uKTsKKwkJcmV0dXJuIFBhcnNlU3RhdGVfRW5kUGFyc2U7CisJfQorCisJLy8gZm91bmQgaGVhZGVyCisJaWYgKGZyYW1lLT5pc29jSGVhZGVyLmRhdGFGb3JtYXQ9PUlTT0NfTU9ERV9DT01QUkVTUykgeworCQkvL2NoZWNrIGlzb2NIZWFkZXIuZnJhbWVOdW0gZm9yIGxvc3QgZnJhbWVzCisJCWlmICh1c2J2aXNpb24tPmxhc3RJc29jRnJhbWVOdW0gPj0gMCkgeworCQkJaWYgKCgodXNidmlzaW9uLT5sYXN0SXNvY0ZyYW1lTnVtICsgMSkgJSAzMikgIT0gZnJhbWUtPmlzb2NIZWFkZXIuZnJhbWVOdW0pIHsKKwkJCQkvLyB1bmV4cGVjdGVkIGZyYW1lIGRyb3A6IG5lZWQgdG8gcmVxdWVzdCBuZXcgaW50cmEgZnJhbWUKKwkJCQlQREVCVUcoREJHX0hFQURFUiwgIkxvc3QgZnJhbWUgYmVmb3JlICVkIG9uIFVTQiIsIGZyYW1lLT5pc29jSGVhZGVyLmZyYW1lTnVtKTsKKwkJCQl1c2J2aXNpb25fcmVxdWVzdF9pbnRyYSh1c2J2aXNpb24pOworCQkJCXJldHVybiBQYXJzZVN0YXRlX05leHRGcmFtZTsKKwkJCX0KKwkJfQorCQl1c2J2aXNpb24tPmxhc3RJc29jRnJhbWVOdW0gPSBmcmFtZS0+aXNvY0hlYWRlci5mcmFtZU51bTsKKwl9CisJdXNidmlzaW9uLT5oZWFkZXJfY291bnQrKzsKKwlmcmFtZS0+c2NhbnN0YXRlID0gU2NhblN0YXRlX0xpbmVzOworCWZyYW1lLT5jdXJsaW5lID0gMDsKKworCWlmIChmb3JjZV90ZXN0cGF0dGVybikgeworCQl1c2J2aXNpb25fdGVzdHBhdHRlcm4odXNidmlzaW9uLCAxLCAxKTsKKwkJcmV0dXJuIFBhcnNlU3RhdGVfTmV4dEZyYW1lOworCX0KKwlyZXR1cm4gUGFyc2VTdGF0ZV9Db250aW51ZTsKK30KKworc3RhdGljIGVudW0gUGFyc2VTdGF0ZSB1c2J2aXNpb25fcGFyc2VfbGluZXNfNDIyKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sCisJCQkJCSAgIGxvbmcgKnBjb3B5bGVuKQoreworCXZvbGF0aWxlIHN0cnVjdCB1c2J2aXNpb25fZnJhbWUgKmZyYW1lOworCXVuc2lnbmVkIGNoYXIgKmY7CisJaW50IGxlbjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHl1eXZbNF09ezE4MCwgMTI4LCAxMCwgMTI4fTsgLy8gWVVWIGNvbXBvbmVudHMKKwl1bnNpZ25lZCBjaGFyIHJ2LCBndiwgYnY7CS8vIFJHQiBjb21wb25lbnRzCisJaW50IGNsaXBtYXNrX2luZGV4LCBieXRlc19wZXJfcGl4ZWw7CisJaW50IHN0cmV0Y2hfYnl0ZXMsIGNsaXBtYXNrX2FkZDsKKworCWZyYW1lICA9IHVzYnZpc2lvbi0+Y3VyRnJhbWU7CisJZiA9IGZyYW1lLT5kYXRhICsgKGZyYW1lLT52NGwyX2xpbmVzaXplICogZnJhbWUtPmN1cmxpbmUpOworCisJLyogTWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIGRhdGEgZm9yIHRoZSBlbnRpcmUgbGluZSAqLworCWxlbiA9IChmcmFtZS0+aXNvY0hlYWRlci5mcmFtZVdpZHRoICogMikrNTsKKwlpZiAoc2NyYXRjaF9sZW4odXNidmlzaW9uKSA8IGxlbikgeworCQlQREVCVUcoREJHX1BBUlNFLCAib3V0IG9mIGRhdGEgaW4gbGluZSAlZCwgbmVlZCAldS5cbiIsIGZyYW1lLT5jdXJsaW5lLCBsZW4pOworCQlyZXR1cm4gUGFyc2VTdGF0ZV9PdXQ7CisJfQorCisJaWYgKChmcmFtZS0+Y3VybGluZSArIDEpID49IGZyYW1lLT5mcm1oZWlnaHQpIHsKKwkJcmV0dXJuIFBhcnNlU3RhdGVfTmV4dEZyYW1lOworCX0KKworCWJ5dGVzX3Blcl9waXhlbCA9IGZyYW1lLT52NGwyX2Zvcm1hdC5ieXRlc19wZXJfcGl4ZWw7CisJc3RyZXRjaF9ieXRlcyA9ICh1c2J2aXNpb24tPnN0cmV0Y2hfd2lkdGggLSAxKSAqIGJ5dGVzX3Blcl9waXhlbDsKKwljbGlwbWFza19pbmRleCA9IGZyYW1lLT5jdXJsaW5lICogTUFYX0ZSQU1FX1dJRFRIOworCWNsaXBtYXNrX2FkZCA9IHVzYnZpc2lvbi0+c3RyZXRjaF93aWR0aDsKKworCWZvciAoaSA9IDA7IGkgPCBmcmFtZS0+ZnJtd2lkdGg7IGkrPSgyICogdXNidmlzaW9uLT5zdHJldGNoX3dpZHRoKSkgeworCisJCXNjcmF0Y2hfZ2V0KHVzYnZpc2lvbiwgJnl1eXZbMF0sIDQpOworCisJCWlmIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVVlWKSB7CisJCQkqZisrID0geXV5dlswXTsgLy8gWQorCQkJKmYrKyA9IHl1eXZbM107IC8vIFUKKwkJfQorCQllbHNlIHsKKworCQkJWVVWX1RPX1JHQl9CWV9USEVfQk9PSyh5dXl2WzBdLCB5dXl2WzFdLCB5dXl2WzNdLCBydiwgZ3YsIGJ2KTsKKwkJCXN3aXRjaCAoZnJhbWUtPnY0bDJfZm9ybWF0LmZvcm1hdCkgeworCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwkJCQkJKmYrKyA9ICgweDFGICYgKGJ2ID4+IDMpKSB8ICgweEUwICYgKGd2IDw8IDMpKTsKKwkJCQkJKmYrKyA9ICgweDA3ICYgKGd2ID4+IDUpKSB8ICgweEY4ICYgIHJ2KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisJCQkJCSpmKysgPSBidjsKKwkJCQkJKmYrKyA9IGd2OworCQkJCQkqZisrID0gcnY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorCQkJCQkqZisrID0gYnY7CisJCQkJCSpmKysgPSBndjsKKwkJCQkJKmYrKyA9IHJ2OworCQkJCQlmKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKwkJCQkJKmYrKyA9ICgweDFGICYgKGJ2ID4+IDMpKSB8ICgweEUwICYgKGd2IDw8IDIpKTsKKwkJCQkJKmYrKyA9ICgweDAzICYgKGd2ID4+IDYpKSB8ICgweDdDICYgKHJ2ID4+IDEpKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2xpcG1hc2tfaW5kZXggKz0gY2xpcG1hc2tfYWRkOworCQlmICs9IHN0cmV0Y2hfYnl0ZXM7CisKKwkJaWYgKGZyYW1lLT52NGwyX2Zvcm1hdC5mb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpIHsKKwkJCSpmKysgPSB5dXl2WzJdOyAvLyBZCisJCQkqZisrID0geXV5dlsxXTsgLy8gVgorCQl9CisJCWVsc2UgeworCisJCQlZVVZfVE9fUkdCX0JZX1RIRV9CT09LKHl1eXZbMl0sIHl1eXZbMV0sIHl1eXZbM10sIHJ2LCBndiwgYnYpOworCQkJc3dpdGNoIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0KSB7CisJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorCQkJCQkqZisrID0gKDB4MUYgJiAoYnYgPj4gMykpIHwgKDB4RTAgJiAoZ3YgPDwgMykpOworCQkJCQkqZisrID0gKDB4MDcgJiAoZ3YgPj4gNSkpIHwgKDB4RjggJiAgcnYpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0IyNDoKKwkJCQkJKmYrKyA9IGJ2OworCQkJCQkqZisrID0gZ3Y7CisJCQkJCSpmKysgPSBydjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisJCQkJCSpmKysgPSBidjsKKwkJCQkJKmYrKyA9IGd2OworCQkJCQkqZisrID0gcnY7CisJCQkJCWYrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1OgorCQkJCQkqZisrID0gKDB4MUYgJiAoYnYgPj4gMykpIHwgKDB4RTAgJiAoZ3YgPDwgMikpOworCQkJCQkqZisrID0gKDB4MDMgJiAoZ3YgPj4gNikpIHwgKDB4N0MgJiAocnYgPj4gMSkpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQljbGlwbWFza19pbmRleCArPSBjbGlwbWFza19hZGQ7CisJCWYgKz0gc3RyZXRjaF9ieXRlczsKKwl9CisKKwlmcmFtZS0+Y3VybGluZSArPSB1c2J2aXNpb24tPnN0cmV0Y2hfaGVpZ2h0OworCSpwY29weWxlbiArPSBmcmFtZS0+djRsMl9saW5lc2l6ZSAqIHVzYnZpc2lvbi0+c3RyZXRjaF9oZWlnaHQ7CisKKwlpZiAoZnJhbWUtPmN1cmxpbmUgPj0gZnJhbWUtPmZybWhlaWdodCkgeworCQlyZXR1cm4gUGFyc2VTdGF0ZV9OZXh0RnJhbWU7CisJfQorCWVsc2UgeworCQlyZXR1cm4gUGFyc2VTdGF0ZV9Db250aW51ZTsKKwl9Cit9CisKKy8qIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmUgICovCitzdGF0aWMgaW50IHVzYnZpc2lvbl9kZWNvbXByZXNzKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sdW5zaWduZWQgY2hhciAqQ29tcHJlc3NlZCwKKwkJCQkJCQkJdW5zaWduZWQgY2hhciAqRGVjb21wcmVzc2VkLCBpbnQgKlN0YXJ0UG9zLAorCQkJCQkJCQlpbnQgKkJsb2NrVHlwZVN0YXJ0UG9zLCBpbnQgTGVuKQoreworCWludCBSZXN0UGl4ZWwsIElkeCwgTWF4UG9zLCBQb3MsIEV4dHJhUG9zLCBCbG9ja0xlbiwgQmxvY2tUeXBlUG9zLCBCbG9ja1R5cGVMZW47CisJdW5zaWduZWQgY2hhciBCbG9ja0J5dGUsIEJsb2NrQ29kZSwgQmxvY2tUeXBlLCBCbG9ja1R5cGVCeXRlLCBJbnRlZ3JhdG9yOworCisJSW50ZWdyYXRvciA9IDA7CisJUG9zID0gKlN0YXJ0UG9zOworCUJsb2NrVHlwZVBvcyA9ICpCbG9ja1R5cGVTdGFydFBvczsKKwlNYXhQb3MgPSAzOTY7IC8vUG9zICsgTGVuOworCUV4dHJhUG9zID0gUG9zOworCUJsb2NrTGVuID0gMDsKKwlCbG9ja0J5dGUgPSAwOworCUJsb2NrQ29kZSA9IDA7CisJQmxvY2tUeXBlID0gMDsKKwlCbG9ja1R5cGVCeXRlID0gMDsKKwlCbG9ja1R5cGVMZW4gPSAwOworCVJlc3RQaXhlbCA9IExlbjsKKworCWZvciAoSWR4ID0gMDsgSWR4IDwgTGVuOyBJZHgrKykgeworCisJCWlmIChCbG9ja0xlbiA9PSAwKSB7CisJCQlpZiAoQmxvY2tUeXBlTGVuPT0wKSB7CisJCQkJQmxvY2tUeXBlQnl0ZSA9IENvbXByZXNzZWRbQmxvY2tUeXBlUG9zXTsKKwkJCQlCbG9ja1R5cGVQb3MrKzsKKwkJCQlCbG9ja1R5cGVMZW4gPSA0OworCQkJfQorCQkJQmxvY2tUeXBlID0gKEJsb2NrVHlwZUJ5dGUgJiAweEMwKSA+PiA2OworCisJCQkvL3N0YXRpc3RpYzoKKwkJCXVzYnZpc2lvbi0+Q29tcHJCbG9ja1R5cGVzW0Jsb2NrVHlwZV0rKzsKKworCQkJUG9zID0gRXh0cmFQb3M7CisJCQlpZiAoQmxvY2tUeXBlID09IDApIHsKKwkJCQlpZihSZXN0UGl4ZWwgPj0gMjQpIHsKKwkJCQkJSWR4ICs9IDIzOworCQkJCQlSZXN0UGl4ZWwgLT0gMjQ7CisJCQkJCUludGVncmF0b3IgPSBEZWNvbXByZXNzZWRbSWR4XTsKKwkJCQl9IGVsc2UgeworCQkJCQlJZHggKz0gUmVzdFBpeGVsIC0gMTsKKwkJCQkJUmVzdFBpeGVsID0gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUJsb2NrQ29kZSA9IENvbXByZXNzZWRbUG9zXTsKKwkJCQlQb3MrKzsKKwkJCQlpZiAoUmVzdFBpeGVsID49IDI0KSB7CisJCQkJCUJsb2NrTGVuICA9IDI0OworCQkJCX0gZWxzZSB7CisJCQkJCUJsb2NrTGVuID0gUmVzdFBpeGVsOworCQkJCX0KKwkJCQlSZXN0UGl4ZWwgLT0gQmxvY2tMZW47CisJCQkJRXh0cmFQb3MgPSBQb3MgKyAoQmxvY2tMZW4gLyA0KTsKKwkJCX0KKwkJCUJsb2NrVHlwZUJ5dGUgPDw9IDI7CisJCQlCbG9ja1R5cGVMZW4gLT0gMTsKKwkJfQorCQlpZiAoQmxvY2tMZW4gPiAwKSB7CisJCQlpZiAoKEJsb2NrTGVuJTQpID09IDApIHsKKwkJCQlCbG9ja0J5dGUgPSBDb21wcmVzc2VkW1Bvc107CisJCQkJUG9zKys7CisJCQl9CisJCQlpZiAoQmxvY2tUeXBlID09IDEpIHsgLy9pbnRlciBCbG9jaworCQkJCUludGVncmF0b3IgPSBEZWNvbXByZXNzZWRbSWR4XTsKKwkJCX0KKwkJCXN3aXRjaCAoQmxvY2tCeXRlICYgMHhDMCkgeworCQkJCWNhc2UgMHgwMzw8NjoKKwkJCQkJSW50ZWdyYXRvciArPSBDb21wcmVzc2VkW0V4dHJhUG9zXTsKKwkJCQkJRXh0cmFQb3MrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDAyPDw2OgorCQkJCQlJbnRlZ3JhdG9yICs9IEJsb2NrQ29kZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDAwOgorCQkJCQlJbnRlZ3JhdG9yIC09IEJsb2NrQ29kZTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlEZWNvbXByZXNzZWRbSWR4XSA9IEludGVncmF0b3I7CisJCQlCbG9ja0J5dGUgPDw9IDI7CisJCQlCbG9ja0xlbiAtPSAxOworCQl9CisJfQorCSpTdGFydFBvcyA9IEV4dHJhUG9zOworCSpCbG9ja1R5cGVTdGFydFBvcyA9IEJsb2NrVHlwZVBvczsKKwlyZXR1cm4gSWR4OworfQorCisKKy8qCisgKiB1c2J2aXNpb25fcGFyc2VfY29tcHJlc3MoKQorICoKKyAqIFBhcnNlIGNvbXByZXNzZWQgZnJhbWUgZnJvbSB0aGUgc2NyYXRjaCBidWZmZXIsIHB1dAorICogZGVjb2RlZCBSR0IgdmFsdWUgaW50byB0aGUgY3VycmVudCBmcmFtZSBidWZmZXIgYW5kIGFkZCB0aGUgd3JpdHRlbgorICogbnVtYmVyIG9mIGJ5dGVzIChSR0IpIHRvIHRoZSAqcGNvcHlsZW4uCisgKgorICovCitzdGF0aWMgZW51bSBQYXJzZVN0YXRlIHVzYnZpc2lvbl9wYXJzZV9jb21wcmVzcyhzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uLAorCQkJCQkgICBsb25nICpwY29weWxlbikKK3sKKyNkZWZpbmUgVVNCVklTSU9OX1NUUklQX01BR0lDCQkweDVBCisjZGVmaW5lIFVTQlZJU0lPTl9TVFJJUF9MRU5fTUFYCQk0MDAKKyNkZWZpbmUgVVNCVklTSU9OX1NUUklQX0hFQURFUl9MRU4JMworCisJc3RydWN0IHVzYnZpc2lvbl9mcmFtZSAqZnJhbWU7CisJdW5zaWduZWQgY2hhciAqZiwqdSA9IE5VTEwgLCp2ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIFN0cmlwRGF0YVtVU0JWSVNJT05fU1RSSVBfTEVOX01BWF07CisJdW5zaWduZWQgY2hhciBTdHJpcEhlYWRlcltVU0JWSVNJT05fU1RSSVBfSEVBREVSX0xFTl07CisJaW50IElkeCwgSWR4RW5kLCBTdHJpcExlbiwgU3RyaXBQdHIsIFN0YXJ0QmxvY2tQb3MsIEJsb2NrUG9zLCBCbG9ja1R5cGVQb3M7CisJaW50IGNsaXBtYXNrX2luZGV4LCBieXRlc19wZXJfcGl4ZWwsIHJjOworCWludCBpbWFnZVNpemU7CisJdW5zaWduZWQgY2hhciBydiwgZ3YsIGJ2OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyICpZLCAqVSwgKlY7CisKKwlmcmFtZSAgPSB1c2J2aXNpb24tPmN1ckZyYW1lOworCWltYWdlU2l6ZSA9IGZyYW1lLT5mcm13aWR0aCAqIGZyYW1lLT5mcm1oZWlnaHQ7CisJaWYgKCAoZnJhbWUtPnY0bDJfZm9ybWF0LmZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVWNDIyUCkgfHwKKwkgICAgIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVlU0MjApICkgeyAgICAgICAvLyB0aGlzIGlzIGEgcGxhbmFyIGZvcm1hdAorCQkvLy4uLiB2NGwyX2xpbmVzaXplIG5vdCB1c2VkIGhlcmUuCisJCWYgPSBmcmFtZS0+ZGF0YSArIChmcmFtZS0+d2lkdGggKiBmcmFtZS0+Y3VybGluZSk7CisJfSBlbHNlCisJCWYgPSBmcmFtZS0+ZGF0YSArIChmcmFtZS0+djRsMl9saW5lc2l6ZSAqIGZyYW1lLT5jdXJsaW5lKTsKKworCWlmIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVVlWKXsgLy9pbml0aWFsaXNlIHUgYW5kIHYgcG9pbnRlcnMKKwkJLy8gZ2V0IGJhc2Ugb2YgdSBhbmQgYiBwbGFuZXMgYWRkIGhhbGZvZmZzZXQKKworCQl1ID0gZnJhbWUtPmRhdGEKKwkJCSsgaW1hZ2VTaXplCisJCQkrIChmcmFtZS0+ZnJtd2lkdGggPj4xKSAqIGZyYW1lLT5jdXJsaW5lIDsKKwkJdiA9IHUgKyAoaW1hZ2VTaXplID4+MSApOworCisJfSBlbHNlIGlmIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVlU0MjApeworCisJCXYgPSBmcmFtZS0+ZGF0YSArIGltYWdlU2l6ZSArICgoZnJhbWUtPmN1cmxpbmUqIChmcmFtZS0+d2lkdGgpKT4+MikgOworCQl1ID0gdiArIChpbWFnZVNpemUgPj4yKSA7CisJfQorCisJaWYgKGZyYW1lLT5jdXJsaW5lID09IDApIHsKKwkJdXNidmlzaW9uX2FkanVzdF9jb21wcmVzc2lvbih1c2J2aXNpb24pOworCX0KKworCWlmIChzY3JhdGNoX2xlbih1c2J2aXNpb24pIDwgVVNCVklTSU9OX1NUUklQX0hFQURFUl9MRU4pIHsKKwkJcmV0dXJuIFBhcnNlU3RhdGVfT3V0OworCX0KKworCS8vZ2V0IHN0cmlwIGhlYWRlciB3aXRob3V0IGNoYW5naW5nIHRoZSBzY3JhdGNoX3JlYWRfcHRyCisJc2NyYXRjaF9zZXRfZXh0cmFfcHRyKHVzYnZpc2lvbiwgJlN0cmlwUHRyLCAwKTsKKwlzY3JhdGNoX2dldF9leHRyYSh1c2J2aXNpb24sICZTdHJpcEhlYWRlclswXSwgJlN0cmlwUHRyLAorCQkJCVVTQlZJU0lPTl9TVFJJUF9IRUFERVJfTEVOKTsKKworCWlmIChTdHJpcEhlYWRlclswXSAhPSBVU0JWSVNJT05fU1RSSVBfTUFHSUMpIHsKKwkJLy8gd3Jvbmcgc3RyaXAgbWFnaWMKKwkJdXNidmlzaW9uLT5zdHJpcE1hZ2ljRXJyb3JzKys7CisJCXJldHVybiBQYXJzZVN0YXRlX05leHRGcmFtZTsKKwl9CisKKwlpZiAoZnJhbWUtPmN1cmxpbmUgIT0gKGludClTdHJpcEhlYWRlclsyXSkgeworCQkvL2xpbmUgbnVtYmVyIG1pc3NtYXRjaCBlcnJvcgorCQl1c2J2aXNpb24tPnN0cmlwTGluZU51bWJlckVycm9ycysrOworCX0KKworCVN0cmlwTGVuID0gMiAqICh1bnNpZ25lZCBpbnQpU3RyaXBIZWFkZXJbMV07CisJaWYgKFN0cmlwTGVuID4gVVNCVklTSU9OX1NUUklQX0xFTl9NQVgpIHsKKwkJLy8gc3RyaXAgb3ZlcnJ1bgorCQkvLyBJIHRoaW5rIHRoaXMgbmV2ZXIgaGFwcGVucworCQl1c2J2aXNpb25fcmVxdWVzdF9pbnRyYSh1c2J2aXNpb24pOworCX0KKworCWlmIChzY3JhdGNoX2xlbih1c2J2aXNpb24pIDwgU3RyaXBMZW4pIHsKKwkJLy90aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEgZm9yIHRoZSBzdHJpcAorCQlyZXR1cm4gUGFyc2VTdGF0ZV9PdXQ7CisJfQorCisJaWYgKHVzYnZpc2lvbi0+SW50cmFGcmFtZUJ1ZmZlcikgeworCQlZID0gdXNidmlzaW9uLT5JbnRyYUZyYW1lQnVmZmVyICsgZnJhbWUtPmZybXdpZHRoICogZnJhbWUtPmN1cmxpbmU7CisJCVUgPSB1c2J2aXNpb24tPkludHJhRnJhbWVCdWZmZXIgKyBpbWFnZVNpemUgKyAoZnJhbWUtPmZybXdpZHRoIC8gMikgKiAoZnJhbWUtPmN1cmxpbmUgLyAyKTsKKwkJViA9IHVzYnZpc2lvbi0+SW50cmFGcmFtZUJ1ZmZlciArIGltYWdlU2l6ZSAvIDQgKiA1ICsgKGZyYW1lLT5mcm13aWR0aCAvIDIpICogKGZyYW1lLT5jdXJsaW5lIC8gMik7CisJfQorCWVsc2UgeworCQlyZXR1cm4gUGFyc2VTdGF0ZV9OZXh0RnJhbWU7CisJfQorCisJYnl0ZXNfcGVyX3BpeGVsID0gZnJhbWUtPnY0bDJfZm9ybWF0LmJ5dGVzX3Blcl9waXhlbDsKKwljbGlwbWFza19pbmRleCA9IGZyYW1lLT5jdXJsaW5lICogTUFYX0ZSQU1FX1dJRFRIOworCisJc2NyYXRjaF9nZXQodXNidmlzaW9uLCBTdHJpcERhdGEsIFN0cmlwTGVuKTsKKworCUlkeEVuZCA9IGZyYW1lLT5mcm13aWR0aDsKKwlCbG9ja1R5cGVQb3MgPSBVU0JWSVNJT05fU1RSSVBfSEVBREVSX0xFTjsKKwlTdGFydEJsb2NrUG9zID0gQmxvY2tUeXBlUG9zICsgKElkeEVuZCAtIDEpIC8gOTYgKyAoSWR4RW5kIC8gMiAtIDEpIC8gOTYgKyAyOworCUJsb2NrUG9zID0gU3RhcnRCbG9ja1BvczsKKworCXVzYnZpc2lvbi0+QmxvY2tQb3MgPSBCbG9ja1BvczsKKworCWlmICgocmMgPSB1c2J2aXNpb25fZGVjb21wcmVzcyh1c2J2aXNpb24sIFN0cmlwRGF0YSwgWSwgJkJsb2NrUG9zLCAmQmxvY2tUeXBlUG9zLCBJZHhFbmQpKSAhPSBJZHhFbmQpIHsKKwkJLy9yZXR1cm4gUGFyc2VTdGF0ZV9Db250aW51ZTsKKwl9CisJaWYgKFN0cmlwTGVuID4gdXNidmlzaW9uLT5tYXhTdHJpcExlbikgeworCQl1c2J2aXNpb24tPm1heFN0cmlwTGVuID0gU3RyaXBMZW47CisJfQorCisJaWYgKGZyYW1lLT5jdXJsaW5lJTIpIHsKKwkJaWYgKChyYyA9IHVzYnZpc2lvbl9kZWNvbXByZXNzKHVzYnZpc2lvbiwgU3RyaXBEYXRhLCBWLCAmQmxvY2tQb3MsICZCbG9ja1R5cGVQb3MsIElkeEVuZC8yKSkgIT0gSWR4RW5kLzIpIHsKKwkJLy9yZXR1cm4gUGFyc2VTdGF0ZV9Db250aW51ZTsKKwkJfQorCX0KKwllbHNlIHsKKwkJaWYgKChyYyA9IHVzYnZpc2lvbl9kZWNvbXByZXNzKHVzYnZpc2lvbiwgU3RyaXBEYXRhLCBVLCAmQmxvY2tQb3MsICZCbG9ja1R5cGVQb3MsIElkeEVuZC8yKSkgIT0gSWR4RW5kLzIpIHsKKwkJCS8vcmV0dXJuIFBhcnNlU3RhdGVfQ29udGludWU7CisJCX0KKwl9CisKKwlpZiAoQmxvY2tQb3MgPiB1c2J2aXNpb24tPmNvbXByQmxvY2tQb3MpIHsKKwkJdXNidmlzaW9uLT5jb21wckJsb2NrUG9zID0gQmxvY2tQb3M7CisJfQorCWlmIChCbG9ja1BvcyA+IFN0cmlwTGVuKSB7CisJCXVzYnZpc2lvbi0+c3RyaXBMZW5FcnJvcnMrKzsKKwl9CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IElkeEVuZDsgSWR4KyspIHsKKwkJaWYoZnJhbWUtPnY0bDJfZm9ybWF0LmZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVZVikgeworCQkJKmYrKyA9IFlbSWR4XTsKKwkJCSpmKysgPSBJZHggJiAweDAxID8gVVtJZHgvMl0gOiBWW0lkeC8yXTsKKwkJfQorCQllbHNlIGlmKGZyYW1lLT52NGwyX2Zvcm1hdC5mb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMlApIHsKKwkJCSpmKysgPSBZW0lkeF07CisJCQlpZiAoIElkeCAmIDB4MDEpCisJCQkJKnUrKyA9IFVbSWR4Pj4xXSA7CisJCQllbHNlCisJCQkJKnYrKyA9IFZbSWR4Pj4xXTsKKwkJfQorCQllbHNlIGlmIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVlU0MjApIHsKKwkJCSpmKysgPSBZIFtJZHhdOworCQkJaWYgKCAhKCggIElkeCAmIDB4MDEgICkgfCAoICBmcmFtZS0+Y3VybGluZSAmIDB4MDEgICkpICl7CisKKy8qIAkJCQkgb25seSBuZWVkIGRvIHRoaXMgZm9yIDEgaW4gNCBwaXhlbHMgKi8KKy8qIAkJCQkgaW50cmFmcmFtZSBidWZmZXIgaXMgWVVWNDIwIGZvcm1hdCAqLworCisJCQkJKnUrKyA9IFVbSWR4ID4+MV07CisJCQkJKnYrKyA9IFZbSWR4ID4+MV07CisJCQl9CisKKwkJfQorCQllbHNlIHsKKwkJCVlVVl9UT19SR0JfQllfVEhFX0JPT0soWVtJZHhdLCBVW0lkeC8yXSwgVltJZHgvMl0sIHJ2LCBndiwgYnYpOworCQkJc3dpdGNoIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0KSB7CisJCQkJY2FzZSBWNEwyX1BJWF9GTVRfR1JFWToKKwkJCQkJKmYrKyA9IFlbSWR4XTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1OgorCQkJCQkqZisrID0gKDB4MUYgJiAoYnYgPj4gMykpIHwgKDB4RTAgJiAoZ3YgPDwgMikpOworCQkJCQkqZisrID0gKDB4MDMgJiAoZ3YgPj4gNikpIHwgKDB4N0MgJiAocnYgPj4gMSkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJCQkJCSpmKysgPSAoMHgxRiAmIChidiA+PiAzKSkgfCAoMHhFMCAmIChndiA8PCAzKSk7CisJCQkJCSpmKysgPSAoMHgwNyAmIChndiA+PiA1KSkgfCAoMHhGOCAmICBydik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjI0OgorCQkJCQkqZisrID0gYnY7CisJCQkJCSpmKysgPSBndjsKKwkJCQkJKmYrKyA9IHJ2OworCQkJCQlicmVhazsKKwkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKKwkJCQkJKmYrKyA9IGJ2OworCQkJCQkqZisrID0gZ3Y7CisJCQkJCSpmKysgPSBydjsKKwkJCQkJZisrOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQljbGlwbWFza19pbmRleCsrOworCX0KKwkvKiBEZWFsIHdpdGggbm9uLWludGVnZXIgbm8uIG9mIGJ5dGVzIGZvciBZVVY0MjBQICovCisJaWYgKGZyYW1lLT52NGwyX2Zvcm1hdC5mb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1lWVTQyMCApCisJCSpwY29weWxlbiArPSBmcmFtZS0+djRsMl9saW5lc2l6ZTsKKwllbHNlCisJCSpwY29weWxlbiArPSBmcmFtZS0+Y3VybGluZSAmIDB4MDEgPyBmcmFtZS0+djRsMl9saW5lc2l6ZSA6IGZyYW1lLT52NGwyX2xpbmVzaXplIDw8IDE7CisKKwlmcmFtZS0+Y3VybGluZSArPSAxOworCisJaWYgKGZyYW1lLT5jdXJsaW5lID49IGZyYW1lLT5mcm1oZWlnaHQpIHsKKwkJcmV0dXJuIFBhcnNlU3RhdGVfTmV4dEZyYW1lOworCX0KKwllbHNlIHsKKwkJcmV0dXJuIFBhcnNlU3RhdGVfQ29udGludWU7CisJfQorCit9CisKKworLyoKKyAqIHVzYnZpc2lvbl9wYXJzZV9saW5lc180MjAoKQorICoKKyAqIFBhcnNlIHR3byBsaW5lcyBmcm9tIHRoZSBzY3JhdGNoIGJ1ZmZlciwgcHV0CisgKiBkZWNvZGVkIFJHQiB2YWx1ZSBpbnRvIHRoZSBjdXJyZW50IGZyYW1lIGJ1ZmZlciBhbmQgYWRkIHRoZSB3cml0dGVuCisgKiBudW1iZXIgb2YgYnl0ZXMgKFJHQikgdG8gdGhlICpwY29weWxlbi4KKyAqCisgKi8KK3N0YXRpYyBlbnVtIFBhcnNlU3RhdGUgdXNidmlzaW9uX3BhcnNlX2xpbmVzXzQyMChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uLAorCQkJCQkgICBsb25nICpwY29weWxlbikKK3sKKwlzdHJ1Y3QgdXNidmlzaW9uX2ZyYW1lICpmcmFtZTsKKwl1bnNpZ25lZCBjaGFyICpmX2V2ZW4gPSBOVUxMLCAqZl9vZGQgPSBOVUxMOworCXVuc2lnbmVkIGludCBwaXhlbF9wZXJfbGluZSwgYmxvY2s7CisJaW50IHBpeGVsLCBibG9ja19zcGxpdDsKKwlpbnQgeV9wdHIsIHVfcHRyLCB2X3B0ciwgeV9vZGRfb2Zmc2V0OworCWNvbnN0IGludCAgIHlfYmxvY2tfc2l6ZSA9IDEyODsKKwljb25zdCBpbnQgIHV2X2Jsb2NrX3NpemUgPSA2NDsKKwljb25zdCBpbnQgc3ViX2Jsb2NrX3NpemUgPSAzMjsKKwljb25zdCBpbnQgeV9zdGVwW10gPSB7IDAsIDAsIDAsIDIgfSwgIHlfc3RlcF9zaXplID0gNDsKKwljb25zdCBpbnQgdXZfc3RlcFtdPSB7IDAsIDAsIDAsIDQgfSwgdXZfc3RlcF9zaXplID0gNDsKKwl1bnNpZ25lZCBjaGFyIHlbMl0sIHUsIHY7CS8qIFlVViBjb21wb25lbnRzICovCisJaW50IHlfLCB1Xywgdl8sIHZiLCB1dmcsIHVyOworCWludCByXywgZ18sIGJfOwkJCS8qIFJHQiBjb21wb25lbnRzICovCisJdW5zaWduZWQgY2hhciBnOworCWludCBjbGlwbWFza19ldmVuX2luZGV4LCBjbGlwbWFza19vZGRfaW5kZXgsIGJ5dGVzX3Blcl9waXhlbDsKKwlpbnQgY2xpcG1hc2tfYWRkLCBzdHJldGNoX2J5dGVzOworCisJZnJhbWUgID0gdXNidmlzaW9uLT5jdXJGcmFtZTsKKwlmX2V2ZW4gPSBmcmFtZS0+ZGF0YSArIChmcmFtZS0+djRsMl9saW5lc2l6ZSAqIGZyYW1lLT5jdXJsaW5lKTsKKwlmX29kZCAgPSBmX2V2ZW4gKyBmcmFtZS0+djRsMl9saW5lc2l6ZSAqIHVzYnZpc2lvbi0+c3RyZXRjaF9oZWlnaHQ7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggZGF0YSBmb3IgdGhlIGVudGlyZSBsaW5lICovCisJLyogSW4gdGhpcyBtb2RlIHVzYnZpc2lvbiB0cmFuc2ZlciAzIGJ5dGVzIGZvciBldmVyeSAyIHBpeGVscyAqLworCS8qIEkgbmVlZCB0d28gbGluZXMgdG8gZGVjb2RlIHRoZSBjb2xvciAqLworCWJ5dGVzX3Blcl9waXhlbCA9IGZyYW1lLT52NGwyX2Zvcm1hdC5ieXRlc19wZXJfcGl4ZWw7CisJc3RyZXRjaF9ieXRlcyA9ICh1c2J2aXNpb24tPnN0cmV0Y2hfd2lkdGggLSAxKSAqIGJ5dGVzX3Blcl9waXhlbDsKKwljbGlwbWFza19ldmVuX2luZGV4ID0gZnJhbWUtPmN1cmxpbmUgKiBNQVhfRlJBTUVfV0lEVEg7CisJY2xpcG1hc2tfb2RkX2luZGV4ICA9IGNsaXBtYXNrX2V2ZW5faW5kZXggKyBNQVhfRlJBTUVfV0lEVEg7CisJY2xpcG1hc2tfYWRkID0gdXNidmlzaW9uLT5zdHJldGNoX3dpZHRoOworCXBpeGVsX3Blcl9saW5lID0gZnJhbWUtPmlzb2NIZWFkZXIuZnJhbWVXaWR0aDsKKworCWlmIChzY3JhdGNoX2xlbih1c2J2aXNpb24pIDwgKGludClwaXhlbF9wZXJfbGluZSAqIDMpIHsKKwkJLy9wcmludGsoS0VSTl9ERUJVRyAib3V0IG9mIGRhdGEsIG5lZWQgJWRcbiIsIGxlbik7CisJCXJldHVybiBQYXJzZVN0YXRlX091dDsKKwl9CisKKwlpZiAoKGZyYW1lLT5jdXJsaW5lICsgMSkgPj0gZnJhbWUtPmZybWhlaWdodCkgeworCQlyZXR1cm4gUGFyc2VTdGF0ZV9OZXh0RnJhbWU7CisJfQorCisJYmxvY2tfc3BsaXQgPSAocGl4ZWxfcGVyX2xpbmUleV9ibG9ja19zaXplKSA/IDEgOiAwOwkvL2FyZSBzb21lIGJsb2NrcyBzcGxpdHRlZCBpbnRvIGRpZmZlcmVudCBsaW5lcz8KKworCXlfb2RkX29mZnNldCA9IChwaXhlbF9wZXJfbGluZSAvIHlfYmxvY2tfc2l6ZSkgKiAoeV9ibG9ja19zaXplICsgdXZfYmxvY2tfc2l6ZSkKKwkJCSsgYmxvY2tfc3BsaXQgKiB1dl9ibG9ja19zaXplOworCisJc2NyYXRjaF9zZXRfZXh0cmFfcHRyKHVzYnZpc2lvbiwgJnlfcHRyLCB5X29kZF9vZmZzZXQpOworCXNjcmF0Y2hfc2V0X2V4dHJhX3B0cih1c2J2aXNpb24sICZ1X3B0ciwgeV9ibG9ja19zaXplKTsKKwlzY3JhdGNoX3NldF9leHRyYV9wdHIodXNidmlzaW9uLCAmdl9wdHIsIHlfb2RkX29mZnNldAorCQkJKyAoNCAtIGJsb2NrX3NwbGl0KSAqIHN1Yl9ibG9ja19zaXplKTsKKworCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IChwaXhlbF9wZXJfbGluZSAvIHN1Yl9ibG9ja19zaXplKTsKKwkgICAgIGJsb2NrKyspIHsKKworCisJCWZvciAocGl4ZWwgPSAwOyBwaXhlbCA8IHN1Yl9ibG9ja19zaXplOyBwaXhlbCArPTIpIHsKKwkJCXNjcmF0Y2hfZ2V0KHVzYnZpc2lvbiwgJnlbMF0sIDIpOworCQkJc2NyYXRjaF9nZXRfZXh0cmEodXNidmlzaW9uLCAmdSwgJnVfcHRyLCAxKTsKKwkJCXNjcmF0Y2hfZ2V0X2V4dHJhKHVzYnZpc2lvbiwgJnYsICZ2X3B0ciwgMSk7CisKKwkJCS8vSSBkb24ndCB1c2UgdGhlIFlVVl9UT19SR0IgbWFjcm8gZm9yIGJldHRlciBwZXJmb3JtYW5jZQorCQkJdl8gPSB2IC0gMTI4OworCQkJdV8gPSB1IC0gMTI4OworCQkJdmIgPSAgICAgICAgICAgICAgMTMyMjUyICogdl87CisJCQl1dmc9IC01MzI4MSAqIHVfIC0gMjU2MjUgKiB2XzsKKwkJCXVyID0gMTA0NTk1ICogdV87CisKKwkJCWlmKGZyYW1lLT52NGwyX2Zvcm1hdC5mb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpIHsKKwkJCQkqZl9ldmVuKysgPSB5WzBdOworCQkJCSpmX2V2ZW4rKyA9IHY7CisJCQl9CisJCQllbHNlIHsKKwkJCQl5XyA9IDc2Mjg0ICogKHlbMF0gLSAxNik7CisKKwkJCQliXyA9ICh5XyArIHZiKSA+PiAxNjsKKwkJCQlnXyA9ICh5XyArIHV2Zyk+PiAxNjsKKwkJCQlyXyA9ICh5XyArIHVyKSA+PiAxNjsKKworCQkJCXN3aXRjaCAoZnJhbWUtPnY0bDJfZm9ybWF0LmZvcm1hdCkgeworCQkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJCQkJCQlnID0gTElNSVRfUkdCKGdfKTsKKwkJCQkJCSpmX2V2ZW4rKyA9ICgweDFGICYgKExJTUlUX1JHQihiXykgPj4gMykpIHwgKDB4RTAgJiAoZyA8PCAzKSk7CisJCQkJCQkqZl9ldmVuKysgPSAoMHgwNyAmICggICAgICAgICAgZyAgID4+IDUpKSB8ICgweEY4ICYgTElNSVRfUkdCKHJfKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisJCQkJCQkqZl9ldmVuKysgPSBMSU1JVF9SR0IoYl8pOworCQkJCQkJKmZfZXZlbisrID0gTElNSVRfUkdCKGdfKTsKKwkJCQkJCSpmX2V2ZW4rKyA9IExJTUlUX1JHQihyXyk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisJCQkJCQkqZl9ldmVuKysgPSBMSU1JVF9SR0IoYl8pOworCQkJCQkJKmZfZXZlbisrID0gTElNSVRfUkdCKGdfKTsKKwkJCQkJCSpmX2V2ZW4rKyA9IExJTUlUX1JHQihyXyk7CisJCQkJCQlmX2V2ZW4rKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTU6CisJCQkJCQlnID0gTElNSVRfUkdCKGdfKTsKKwkJCQkJCSpmX2V2ZW4rKyA9ICgweDFGICYgKExJTUlUX1JHQihiXykgPj4gMykpIHwgKDB4RTAgJiAoZyA8PCAyKSk7CisJCQkJCQkqZl9ldmVuKysgPSAoMHgwMyAmICggICAgICAgICAgZyAgID4+IDYpKSB8CisJCQkJCQkJICAgICgweDdDICYgKExJTUlUX1JHQihyXykgPj4gMSkpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJY2xpcG1hc2tfZXZlbl9pbmRleCArPSBjbGlwbWFza19hZGQ7CisJCQlmX2V2ZW4gKz0gc3RyZXRjaF9ieXRlczsKKworCQkJaWYoZnJhbWUtPnY0bDJfZm9ybWF0LmZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVZVikgeworCQkJCSpmX2V2ZW4rKyA9IHlbMV07CisJCQkJKmZfZXZlbisrID0gdTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXlfID0gNzYyODQgKiAoeVsxXSAtIDE2KTsKKworCQkJCWJfID0gKHlfICsgdmIpID4+IDE2OworCQkJCWdfID0gKHlfICsgdXZnKT4+IDE2OworCQkJCXJfID0gKHlfICsgdXIpID4+IDE2OworCisJCQkJc3dpdGNoIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0KSB7CisJCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwkJCQkJCWcgPSBMSU1JVF9SR0IoZ18pOworCQkJCQkJKmZfZXZlbisrID0gKDB4MUYgJiAoTElNSVRfUkdCKGJfKSA+PiAzKSkgfCAoMHhFMCAmIChnIDw8IDMpKTsKKwkJCQkJCSpmX2V2ZW4rKyA9ICgweDA3ICYgKCAgICAgICAgICBnICAgPj4gNSkpIHwgKDB4RjggJiBMSU1JVF9SR0Iocl8pKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0IyNDoKKwkJCQkJCSpmX2V2ZW4rKyA9IExJTUlUX1JHQihiXyk7CisJCQkJCQkqZl9ldmVuKysgPSBMSU1JVF9SR0IoZ18pOworCQkJCQkJKmZfZXZlbisrID0gTElNSVRfUkdCKHJfKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKKwkJCQkJCSpmX2V2ZW4rKyA9IExJTUlUX1JHQihiXyk7CisJCQkJCQkqZl9ldmVuKysgPSBMSU1JVF9SR0IoZ18pOworCQkJCQkJKmZfZXZlbisrID0gTElNSVRfUkdCKHJfKTsKKwkJCQkJCWZfZXZlbisrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKwkJCQkJCWcgPSBMSU1JVF9SR0IoZ18pOworCQkJCQkJKmZfZXZlbisrID0gKDB4MUYgJiAoTElNSVRfUkdCKGJfKSA+PiAzKSkgfCAoMHhFMCAmIChnIDw8IDIpKTsKKwkJCQkJCSpmX2V2ZW4rKyA9ICgweDAzICYgKCAgICAgICAgICBnICAgPj4gNikpIHwKKwkJCQkJCQkgICAgKDB4N0MgJiAoTElNSVRfUkdCKHJfKSA+PiAxKSk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljbGlwbWFza19ldmVuX2luZGV4ICs9IGNsaXBtYXNrX2FkZDsKKwkJCWZfZXZlbiArPSBzdHJldGNoX2J5dGVzOworCisJCQlzY3JhdGNoX2dldF9leHRyYSh1c2J2aXNpb24sICZ5WzBdLCAmeV9wdHIsIDIpOworCisJCQlpZihmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVVlWKSB7CisJCQkJKmZfb2RkKysgPSB5WzBdOworCQkJCSpmX29kZCsrID0gdjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXlfID0gNzYyODQgKiAoeVswXSAtIDE2KTsKKworCQkJCWJfID0gKHlfICsgdmIpID4+IDE2OworCQkJCWdfID0gKHlfICsgdXZnKT4+IDE2OworCQkJCXJfID0gKHlfICsgdXIpID4+IDE2OworCisJCQkJc3dpdGNoIChmcmFtZS0+djRsMl9mb3JtYXQuZm9ybWF0KSB7CisJCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwkJCQkJCWcgPSBMSU1JVF9SR0IoZ18pOworCQkJCQkJKmZfb2RkKysgPSAoMHgxRiAmIChMSU1JVF9SR0IoYl8pID4+IDMpKSB8ICgweEUwICYgKGcgPDwgMykpOworCQkJCQkJKmZfb2RkKysgPSAoMHgwNyAmICggICAgICAgICAgZyAgID4+IDUpKSB8ICgweEY4ICYgTElNSVRfUkdCKHJfKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisJCQkJCQkqZl9vZGQrKyA9IExJTUlUX1JHQihiXyk7CisJCQkJCQkqZl9vZGQrKyA9IExJTUlUX1JHQihnXyk7CisJCQkJCQkqZl9vZGQrKyA9IExJTUlUX1JHQihyXyk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisJCQkJCQkqZl9vZGQrKyA9IExJTUlUX1JHQihiXyk7CisJCQkJCQkqZl9vZGQrKyA9IExJTUlUX1JHQihnXyk7CisJCQkJCQkqZl9vZGQrKyA9IExJTUlUX1JHQihyXyk7CisJCQkJCQlmX29kZCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU1NToKKwkJCQkJCWcgPSBMSU1JVF9SR0IoZ18pOworCQkJCQkJKmZfb2RkKysgPSAoMHgxRiAmIChMSU1JVF9SR0IoYl8pID4+IDMpKSB8ICgweEUwICYgKGcgPDwgMikpOworCQkJCQkJKmZfb2RkKysgPSAoMHgwMyAmICggICAgICAgICAgZyAgID4+IDYpKSB8CisJCQkJCQkJICAgKDB4N0MgJiAoTElNSVRfUkdCKHJfKSA+PiAxKSk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljbGlwbWFza19vZGRfaW5kZXggKz0gY2xpcG1hc2tfYWRkOworCQkJZl9vZGQgKz0gc3RyZXRjaF9ieXRlczsKKworCQkJaWYoZnJhbWUtPnY0bDJfZm9ybWF0LmZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWVVZVikgeworCQkJCSpmX29kZCsrID0geVsxXTsKKwkJCQkqZl9vZGQrKyA9IHU7CisJCQl9CisJCQllbHNlIHsKKwkJCQl5XyA9IDc2Mjg0ICogKHlbMV0gLSAxNik7CisKKwkJCQliXyA9ICh5XyArIHZiKSA+PiAxNjsKKwkJCQlnXyA9ICh5XyArIHV2Zyk+PiAxNjsKKwkJCQlyXyA9ICh5XyArIHVyKSA+PiAxNjsKKworCQkJCXN3aXRjaCAoZnJhbWUtPnY0bDJfZm9ybWF0LmZvcm1hdCkgeworCQkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisJCQkJCQlnID0gTElNSVRfUkdCKGdfKTsKKwkJCQkJCSpmX29kZCsrID0gKDB4MUYgJiAoTElNSVRfUkdCKGJfKSA+PiAzKSkgfCAoMHhFMCAmIChnIDw8IDMpKTsKKwkJCQkJCSpmX29kZCsrID0gKDB4MDcgJiAoICAgICAgICAgIGcgICA+PiA1KSkgfCAoMHhGOCAmIExJTUlUX1JHQihyXykpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjI0OgorCQkJCQkJKmZfb2RkKysgPSBMSU1JVF9SR0IoYl8pOworCQkJCQkJKmZfb2RkKysgPSBMSU1JVF9SR0IoZ18pOworCQkJCQkJKmZfb2RkKysgPSBMSU1JVF9SR0Iocl8pOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorCQkJCQkJKmZfb2RkKysgPSBMSU1JVF9SR0IoYl8pOworCQkJCQkJKmZfb2RkKysgPSBMSU1JVF9SR0IoZ18pOworCQkJCQkJKmZfb2RkKysgPSBMSU1JVF9SR0Iocl8pOworCQkJCQkJZl9vZGQrKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTU6CisJCQkJCQlnID0gTElNSVRfUkdCKGdfKTsKKwkJCQkJCSpmX29kZCsrID0gKDB4MUYgJiAoTElNSVRfUkdCKGJfKSA+PiAzKSkgfCAoMHhFMCAmIChnIDw8IDIpKTsKKwkJCQkJCSpmX29kZCsrID0gKDB4MDMgJiAoICAgICAgICAgIGcgICA+PiA2KSkgfAorCQkJCQkJCSAgICgweDdDICYgKExJTUlUX1JHQihyXykgPj4gMSkpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJY2xpcG1hc2tfb2RkX2luZGV4ICs9IGNsaXBtYXNrX2FkZDsKKwkJCWZfb2RkICs9IHN0cmV0Y2hfYnl0ZXM7CisJCX0KKworCQlzY3JhdGNoX3JtX29sZCh1c2J2aXNpb24seV9zdGVwW2Jsb2NrICUgeV9zdGVwX3NpemVdICogc3ViX2Jsb2NrX3NpemUpOworCQlzY3JhdGNoX2luY19leHRyYV9wdHIoJnlfcHRyLCB5X3N0ZXBbKGJsb2NrICsgMiAqIGJsb2NrX3NwbGl0KSAlIHlfc3RlcF9zaXplXQorCQkJCSogc3ViX2Jsb2NrX3NpemUpOworCQlzY3JhdGNoX2luY19leHRyYV9wdHIoJnVfcHRyLCB1dl9zdGVwW2Jsb2NrICUgdXZfc3RlcF9zaXplXQorCQkJCSogc3ViX2Jsb2NrX3NpemUpOworCQlzY3JhdGNoX2luY19leHRyYV9wdHIoJnZfcHRyLCB1dl9zdGVwWyhibG9jayArIDIgKiBibG9ja19zcGxpdCkgJSB1dl9zdGVwX3NpemVdCisJCQkJKiBzdWJfYmxvY2tfc2l6ZSk7CisJfQorCisJc2NyYXRjaF9ybV9vbGQodXNidmlzaW9uLCBwaXhlbF9wZXJfbGluZSAqIDMgLyAyCisJCQkrIGJsb2NrX3NwbGl0ICogc3ViX2Jsb2NrX3NpemUpOworCisJZnJhbWUtPmN1cmxpbmUgKz0gMiAqIHVzYnZpc2lvbi0+c3RyZXRjaF9oZWlnaHQ7CisJKnBjb3B5bGVuICs9IGZyYW1lLT52NGwyX2xpbmVzaXplICogMiAqIHVzYnZpc2lvbi0+c3RyZXRjaF9oZWlnaHQ7CisKKwlpZiAoZnJhbWUtPmN1cmxpbmUgPj0gZnJhbWUtPmZybWhlaWdodCkKKwkJcmV0dXJuIFBhcnNlU3RhdGVfTmV4dEZyYW1lOworCWVsc2UKKwkJcmV0dXJuIFBhcnNlU3RhdGVfQ29udGludWU7Cit9CisKKy8qCisgKiB1c2J2aXNpb25fcGFyc2VfZGF0YSgpCisgKgorICogR2VuZXJpYyByb3V0aW5lIHRvIHBhcnNlIHRoZSBzY3JhdGNoIGJ1ZmZlci4gSXQgZW1wbG95cyBlaXRoZXIKKyAqIHVzYnZpc2lvbl9maW5kX2hlYWRlcigpIG9yIHVzYnZpc2lvbl9wYXJzZV9saW5lcygpIHRvIGRvIG1vc3QKKyAqIG9mIHdvcmsuCisgKgorICovCitzdGF0aWMgdm9pZCB1c2J2aXNpb25fcGFyc2VfZGF0YShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCXN0cnVjdCB1c2J2aXNpb25fZnJhbWUgKmZyYW1lOworCWVudW0gUGFyc2VTdGF0ZSBuZXdzdGF0ZTsKKwlsb25nIGNvcHlsZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKKworCWZyYW1lID0gdXNidmlzaW9uLT5jdXJGcmFtZTsKKworCVBERUJVRyhEQkdfUEFSU0UsICJwYXJzaW5nIGxlbj0lZFxuIiwgc2NyYXRjaF9sZW4odXNidmlzaW9uKSk7CisKKwl3aGlsZSAoMSkgeworCisJCW5ld3N0YXRlID0gUGFyc2VTdGF0ZV9PdXQ7CisJCWlmIChzY3JhdGNoX2xlbih1c2J2aXNpb24pKSB7CisJCQlpZiAoZnJhbWUtPnNjYW5zdGF0ZSA9PSBTY2FuU3RhdGVfU2Nhbm5pbmcpIHsKKwkJCQluZXdzdGF0ZSA9IHVzYnZpc2lvbl9maW5kX2hlYWRlcih1c2J2aXNpb24pOworCQkJfQorCQkJZWxzZSBpZiAoZnJhbWUtPnNjYW5zdGF0ZSA9PSBTY2FuU3RhdGVfTGluZXMpIHsKKwkJCQlpZiAodXNidmlzaW9uLT5pc29jTW9kZSA9PSBJU09DX01PREVfWVVWNDIwKSB7CisJCQkJCW5ld3N0YXRlID0gdXNidmlzaW9uX3BhcnNlX2xpbmVzXzQyMCh1c2J2aXNpb24sICZjb3B5bGVuKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAodXNidmlzaW9uLT5pc29jTW9kZSA9PSBJU09DX01PREVfWVVWNDIyKSB7CisJCQkJCW5ld3N0YXRlID0gdXNidmlzaW9uX3BhcnNlX2xpbmVzXzQyMih1c2J2aXNpb24sICZjb3B5bGVuKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAodXNidmlzaW9uLT5pc29jTW9kZSA9PSBJU09DX01PREVfQ09NUFJFU1MpIHsKKwkJCQkJbmV3c3RhdGUgPSB1c2J2aXNpb25fcGFyc2VfY29tcHJlc3ModXNidmlzaW9uLCAmY29weWxlbik7CisJCQkJfQorCisJCQl9CisJCX0KKwkJaWYgKG5ld3N0YXRlID09IFBhcnNlU3RhdGVfQ29udGludWUpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKChuZXdzdGF0ZSA9PSBQYXJzZVN0YXRlX05leHRGcmFtZSkgfHwgKG5ld3N0YXRlID09IFBhcnNlU3RhdGVfT3V0KSkgeworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm47CS8qIFBhcnNlU3RhdGVfRW5kUGFyc2UgKi8KKwkJfQorCX0KKworCWlmIChuZXdzdGF0ZSA9PSBQYXJzZVN0YXRlX05leHRGcmFtZSkgeworCQlmcmFtZS0+Z3JhYnN0YXRlID0gRnJhbWVTdGF0ZV9Eb25lOworCQlkb19nZXR0aW1lb2ZkYXkoJihmcmFtZS0+dGltZXN0YW1wKSk7CisJCWZyYW1lLT5zZXF1ZW5jZSA9IHVzYnZpc2lvbi0+ZnJhbWVfbnVtOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2J2aXNpb24tPnF1ZXVlX2xvY2ssIGxvY2tfZmxhZ3MpOworCQlsaXN0X21vdmVfdGFpbCgmKGZyYW1lLT5mcmFtZSksICZ1c2J2aXNpb24tPm91dHF1ZXVlKTsKKwkJdXNidmlzaW9uLT5jdXJGcmFtZSA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYnZpc2lvbi0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisKKwkJdXNidmlzaW9uLT5mcmFtZV9udW0rKzsKKworCQkvKiBUaGlzIHdpbGwgY2F1c2UgdGhlIHByb2Nlc3MgdG8gcmVxdWVzdCBhbm90aGVyIGZyYW1lLiAqLworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdXNidmlzaW9uLT53YWl0X2ZyYW1lKSkgeworCQkJUERFQlVHKERCR19QQVJTRSwgIldha2UgdXAgISIpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1c2J2aXNpb24tPndhaXRfZnJhbWUpOworCQl9CisJfQorCWVsc2UKKwkJZnJhbWUtPmdyYWJzdGF0ZSA9IEZyYW1lU3RhdGVfR3JhYmJpbmc7CisKKworCS8qIFVwZGF0ZSB0aGUgZnJhbWUncyB1bmNvbXByZXNzZWQgbGVuZ3RoLiAqLworCWZyYW1lLT5zY2FubGVuZ3RoICs9IGNvcHlsZW47Cit9CisKKworLyoKKyAqIE1ha2UgYWxsIG9mIHRoZSBibG9ja3Mgb2YgZGF0YSBjb250aWd1b3VzCisgKi8KK3N0YXRpYyBpbnQgdXNidmlzaW9uX2NvbXByZXNzX2lzb2Nocm9ub3VzKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sCisJCQkJCSAgc3RydWN0IHVyYiAqdXJiKQoreworCXVuc2lnbmVkIGNoYXIgKnBhY2tldF9kYXRhOworCWludCBpLCB0b3RsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQlpbnQgcGFja2V0X2xlbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJaW50IHBhY2tldF9zdGF0ID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CisKKwkJcGFja2V0X2RhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OworCisJCS8qIERldGVjdCBhbmQgaWdub3JlIGVycm9yZWQgcGFja2V0cyAqLworCQlpZiAocGFja2V0X3N0YXQpIHsJLy8gcGFja2V0X3N0YXQgIT0gMCA/Pz8/Pz8/Pz8/Pz8/CisJCQlQREVCVUcoREJHX0lTT0MsICJkYXRhIGVycm9yOiBbJWRdIGxlbj0lZCwgc3RhdHVzPSVYIiwgaSwgcGFja2V0X2xlbiwgcGFja2V0X3N0YXQpOworCQkJdXNidmlzaW9uLT5pc29jRXJyQ291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRGV0ZWN0IGFuZCBpZ25vcmUgZW1wdHkgcGFja2V0cyAqLworCQlpZiAocGFja2V0X2xlbiA8IDApIHsKKwkJCVBERUJVRyhEQkdfSVNPQywgImVycm9yIHBhY2tldCBbJWRdIiwgaSk7CisJCQl1c2J2aXNpb24tPmlzb2NTa2lwQ291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKHBhY2tldF9sZW4gPT0gMCkgewkvKiBGcmFtZSBlbmQgPz8/Pz8gKi8KKwkJCVBERUJVRyhEQkdfSVNPQywgIm51bGwgcGFja2V0IFslZF0iLCBpKTsKKwkJCXVzYnZpc2lvbi0+aXNvY3N0YXRlPUlzb2NTdGF0ZV9Ob0ZyYW1lOworCQkJdXNidmlzaW9uLT5pc29jU2tpcENvdW50Kys7CisJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChwYWNrZXRfbGVuID4gdXNidmlzaW9uLT5pc29jUGFja2V0U2l6ZSkgeworCQkJUERFQlVHKERCR19JU09DLCAicGFja2V0WyVkXSA+IGlzb2NQYWNrZXRTaXplIiwgaSk7CisJCQl1c2J2aXNpb24tPmlzb2NTa2lwQ291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJUERFQlVHKERCR19JU09DLCAicGFja2V0IG9rIFslZF0gbGVuPSVkIiwgaSwgcGFja2V0X2xlbik7CisKKwkJaWYgKHVzYnZpc2lvbi0+aXNvY3N0YXRlPT1Jc29jU3RhdGVfTm9GcmFtZSkgeyAvL25ldyBmcmFtZSBiZWdpbnMKKwkJCXVzYnZpc2lvbi0+aXNvY3N0YXRlPUlzb2NTdGF0ZV9JbkZyYW1lOworCQkJc2NyYXRjaF9tYXJrX2hlYWRlcih1c2J2aXNpb24pOworCQkJdXNidmlzaW9uX21lYXN1cmVfYmFuZHdpZHRoKHVzYnZpc2lvbik7CisJCQlQREVCVUcoREJHX0lTT0MsICJwYWNrZXQgd2l0aCBoZWFkZXIiKTsKKwkJfQorCisJCS8qCisJCSAqIElmIHVzYnZpc2lvbiBjb250aW51ZXMgdG8gZmVlZCB1cyB3aXRoIGRhdGEgYnV0IHRoZXJlIGlzIG5vCisJCSAqIGNvbnN1bXB0aW9uIChpZiwgZm9yIGV4YW1wbGUsIFY0TCBjbGllbnQgZmVsbCBhc2xlZXApIHdlCisJCSAqIG1heSBvdmVyZmxvdyB0aGUgYnVmZmVyLiBXZSBoYXZlIHRvIG1vdmUgb2xkIGRhdGEgb3ZlciB0bworCQkgKiBmcmVlIHJvb20gZm9yIG5ldyBkYXRhLiBUaGlzIGlzIGJhZCBmb3Igb2xkIGRhdGEuIElmIHdlCisJCSAqIGp1c3QgZHJvcCBuZXcgZGF0YSB0aGVuIGl0J3MgYmFkIGZvciBuZXcgZGF0YS4uLiBjaG9vc2UKKwkJICogeW91ciBmYXZvcml0ZSBldmlsIGhlcmUuCisJCSAqLworCQlpZiAoc2NyYXRjaF9mcmVlKHVzYnZpc2lvbikgPCBwYWNrZXRfbGVuKSB7CisKKwkJCXVzYnZpc2lvbi0+c2NyYXRjaF9vdmZfY291bnQrKzsKKwkJCVBERUJVRyhEQkdfSVNPQywgInNjcmF0Y2ggYnVmIG92ZXJmbG93ISBzY3JfbGVuOiAlZCwgbjogJWQiLAorCQkJICAgICAgIHNjcmF0Y2hfbGVuKHVzYnZpc2lvbiksIHBhY2tldF9sZW4pOworCQkJc2NyYXRjaF9ybV9vbGQodXNidmlzaW9uLCBwYWNrZXRfbGVuIC0gc2NyYXRjaF9mcmVlKHVzYnZpc2lvbikpOworCQl9CisKKwkJLyogTm93IHdlIGtub3cgdGhhdCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBzY3JhdGNoIGJ1ZmZlciAqLworCQlzY3JhdGNoX3B1dCh1c2J2aXNpb24sIHBhY2tldF9kYXRhLCBwYWNrZXRfbGVuKTsKKwkJdG90bGVuICs9IHBhY2tldF9sZW47CisJCXVzYnZpc2lvbi0+aXNvY0RhdGFDb3VudCArPSBwYWNrZXRfbGVuOworCQl1c2J2aXNpb24tPmlzb2NQYWNrZXRDb3VudCsrOworCX0KKyNpZiBFTkFCTEVfSEVYRFVNUAorCWlmICh0b3RsZW4gPiAwKSB7CisJCXN0YXRpYyBpbnQgZm9vID0gMDsKKwkJaWYgKGZvbyA8IDEpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIrJWQuXG4iLCB1c2J2aXNpb24tPnNjcmF0Y2hsZW4pOworCQkJdXNidmlzaW9uX2hleGR1bXAoZGF0YTAsICh0b3RsZW4gPiA2NCkgPyA2NCA6IHRvdGxlbik7CisJCQkrK2ZvbzsKKwkJfQorCX0KKyNlbmRpZgorIHJldHVybiB0b3RsZW47Cit9CisKK3N0YXRpYyB2b2lkIHVzYnZpc2lvbl9pc29jSXJxKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgZXJyQ29kZSA9IDA7CisJaW50IGxlbjsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdXJiLT5jb250ZXh0OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgc3RhcnRUaW1lID0gamlmZmllczsKKwlzdHJ1Y3QgdXNidmlzaW9uX2ZyYW1lICoqZjsKKworCS8qIFdlIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgaWYgd2UgYXJlIGFib3V0IHRvIGJlIHJlbW92ZWQhICovCisJaWYgKCFVU0JWSVNJT05fSVNfT1BFUkFUSU9OQUwodXNidmlzaW9uKSkKKwkJcmV0dXJuOworCisJZiA9ICZ1c2J2aXNpb24tPmN1ckZyYW1lOworCisJLyogTWFuYWdlIHN0cmVhbWluZyBpbnRlcnJ1cHRpb24gKi8KKwlpZiAodXNidmlzaW9uLT5zdHJlYW1pbmcgPT0gU3RyZWFtX0ludGVycnVwdCkgeworCQl1c2J2aXNpb24tPnN0cmVhbWluZyA9IFN0cmVhbV9JZGxlOworCQlpZiAoKCpmKSkgeworCQkJKCpmKS0+Z3JhYnN0YXRlID0gRnJhbWVTdGF0ZV9SZWFkeTsKKwkJCSgqZiktPnNjYW5zdGF0ZSA9IFNjYW5TdGF0ZV9TY2FubmluZzsKKwkJfQorCQlQREVCVUcoREJHX0lSUSwgInN0cmVhbSBpbnRlcnJ1cHRlZCIpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVzYnZpc2lvbi0+d2FpdF9zdHJlYW0pOworCX0KKworCS8qIENvcHkgdGhlIGRhdGEgcmVjZWl2ZWQgaW50byBvdXIgc2NyYXRjaCBidWZmZXIgKi8KKwlsZW4gPSB1c2J2aXNpb25fY29tcHJlc3NfaXNvY2hyb25vdXModXNidmlzaW9uLCB1cmIpOworCisJdXNidmlzaW9uLT5pc29jVXJiQ291bnQrKzsKKwl1c2J2aXNpb24tPnVyYl9sZW5ndGggPSBsZW47CisKKwlpZiAodXNidmlzaW9uLT5zdHJlYW1pbmcgPT0gU3RyZWFtX09uKSB7CisKKwkJLyogSWYgd2UgY29sbGVjdGVkIGVub3VnaCBkYXRhIGxldCdzIHBhcnNlISAqLworCQlpZiAoc2NyYXRjaF9sZW4odXNidmlzaW9uKSA+IFVTQlZJU0lPTl9IRUFERVJfTEVOR1RIKSB7CS8qIDEyID09IGhlYWRlcl9sZW5ndGggKi8KKwkJCS8qSWYgd2UgZG9uJ3QgaGF2ZSBhIGZyYW1lIHdlJ3JlIGN1cnJlbnQgd29ya2luZyBvbiwgY29tcGxhaW4gKi8KKwkJCWlmKCFsaXN0X2VtcHR5KCYodXNidmlzaW9uLT5pbnF1ZXVlKSkpIHsKKwkJCQlpZiAoISgqZikpIHsKKwkJCQkJKCpmKSA9IGxpc3RfZW50cnkodXNidmlzaW9uLT5pbnF1ZXVlLm5leHQsc3RydWN0IHVzYnZpc2lvbl9mcmFtZSwgZnJhbWUpOworCQkJCX0KKwkJCQl1c2J2aXNpb25fcGFyc2VfZGF0YSh1c2J2aXNpb24pOworCQkJfQorCQkJZWxzZSB7CisJCQkJUERFQlVHKERCR19JUlEsICJyZWNlaXZlZCBkYXRhLCBidXQgbm8gb25lIG5lZWRzIGl0Iik7CisJCQkJc2NyYXRjaF9yZXNldCh1c2J2aXNpb24pOworCQkJfQorCQl9CisJfQorCWVsc2UgeworCQlQREVCVUcoREJHX0lSUSwgInJlY2VpdmVkIGRhdGEsIGJ1dCBubyBvbmUgbmVlZHMgaXQiKTsKKwkJc2NyYXRjaF9yZXNldCh1c2J2aXNpb24pOworCX0KKworCXVzYnZpc2lvbi0+dGltZUluSXJxICs9IGppZmZpZXMgLSBzdGFydFRpbWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgVVNCVklTSU9OX1VSQl9GUkFNRVM7IGkrKykgeworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyA9IDA7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA9IDA7CisJfQorCisJdXJiLT5zdGF0dXMgPSAwOworCXVyYi0+ZGV2ID0gdXNidmlzaW9uLT5kZXY7CisJZXJyQ29kZSA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOworCisJLyogRGlzYWJsZSB0aGlzIHdhcm5pbmcuICBCeSBkZXNpZ24gb2YgdGhlIGRyaXZlci4gKi8KKwkvLwlpZihlcnJDb2RlKSB7CisJLy8JCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZDogZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIGVyckNvZGUpOworCS8vCX0KKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMb3cgbGV2ZWwgdXNidmlzaW9uIGFjY2VzcyBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogdXNidmlzaW9uX3JlYWRfcmVnKCkKKyAqCisgKiByZXR1cm4gIDwgMCAtPiBFcnJvcgorICogICAgICAgID49IDAgLT4gRGF0YQorICovCisKK2ludCB1c2J2aXNpb25fcmVhZF9yZWcoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgdW5zaWduZWQgY2hhciByZWcpCit7CisJaW50IGVyckNvZGUgPSAwOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzFdOworCisJaWYgKCFVU0JWSVNJT05fSVNfT1BFUkFUSU9OQUwodXNidmlzaW9uKSkKKwkJcmV0dXJuIC0xOworCisJZXJyQ29kZSA9IHVzYl9jb250cm9sX21zZyh1c2J2aXNpb24tPmRldiwgdXNiX3JjdmN0cmxwaXBlKHVzYnZpc2lvbi0+ZGV2LCAxKSwKKwkJCQlVU0JWSVNJT05fT1BfQ09ERSwKKwkJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0VORFBPSU5ULAorCQkJCTAsIChfX3UxNikgcmVnLCBidWZmZXIsIDEsIEhaKTsKKworCWlmIChlcnJDb2RlIDwgMCkgeworCQllcnIoIiVzOiBmYWlsZWQ6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBlcnJDb2RlKTsKKwkJcmV0dXJuIGVyckNvZGU7CisJfQorCXJldHVybiBidWZmZXJbMF07Cit9CisKKy8qCisgKiB1c2J2aXNpb25fd3JpdGVfcmVnKCkKKyAqCisgKiByZXR1cm4gMSAtPiBSZWcgd3JpdHRlbgorICogICAgICAgIDAgLT4gdXNidmlzaW9uIGlzIG5vdCB5ZXQgcmVhZHkKKyAqICAgICAgIC0xIC0+IFNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KKworaW50IHVzYnZpc2lvbl93cml0ZV9yZWcoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgdW5zaWduZWQgY2hhciByZWcsCisJCQkgICAgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlpbnQgZXJyQ29kZSA9IDA7CisKKwlpZiAoIVVTQlZJU0lPTl9JU19PUEVSQVRJT05BTCh1c2J2aXNpb24pKQorCQlyZXR1cm4gMDsKKworCWVyckNvZGUgPSB1c2JfY29udHJvbF9tc2codXNidmlzaW9uLT5kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2J2aXNpb24tPmRldiwgMSksCisJCQkJVVNCVklTSU9OX09QX0NPREUsCisJCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCVVTQl9SRUNJUF9FTkRQT0lOVCwgMCwgKF9fdTE2KSByZWcsICZ2YWx1ZSwgMSwgSFopOworCisJaWYgKGVyckNvZGUgPCAwKSB7CisJCWVycigiJXM6IGZhaWxlZDogZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIGVyckNvZGUpOworCX0KKwlyZXR1cm4gZXJyQ29kZTsKK30KKworCitzdGF0aWMgdm9pZCB1c2J2aXNpb25fY3RybFVyYl9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKXVyYi0+Y29udGV4dDsKKworCVBERUJVRyhEQkdfSVJRLCAiIik7CisJdXNidmlzaW9uLT5jdHJsVXJiQnVzeSA9IDA7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnVzYnZpc2lvbi0+Y3RybFVyYl93cSkpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1c2J2aXNpb24tPmN0cmxVcmJfd3EpOworCX0KK30KKworCitzdGF0aWMgaW50IHVzYnZpc2lvbl93cml0ZV9yZWdfaXJxKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24saW50IGFkZHJlc3MsCisJCQkJCQkJCQl1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCWludCBlcnJDb2RlID0gMDsKKworCVBERUJVRyhEQkdfSVJRLCAiIik7CisJaWYgKGxlbiA+IDgpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorLy8JZG93bigmdXNidmlzaW9uLT5jdHJsVXJiTG9jayk7CisJaWYgKHVzYnZpc2lvbi0+Y3RybFVyYkJ1c3kpIHsKKy8vCQl1cCgmdXNidmlzaW9uLT5jdHJsVXJiTG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXVzYnZpc2lvbi0+Y3RybFVyYkJ1c3kgPSAxOworLy8JdXAoJnVzYnZpc2lvbi0+Y3RybFVyYkxvY2spOworCisJdXNidmlzaW9uLT5jdHJsVXJiU2V0dXAuYlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfRU5EUE9JTlQ7CisJdXNidmlzaW9uLT5jdHJsVXJiU2V0dXAuYlJlcXVlc3QgICAgID0gVVNCVklTSU9OX09QX0NPREU7CisJdXNidmlzaW9uLT5jdHJsVXJiU2V0dXAud1ZhbHVlICAgICAgID0gMDsKKwl1c2J2aXNpb24tPmN0cmxVcmJTZXR1cC53SW5kZXggICAgICAgPSBjcHVfdG9fbGUxNihhZGRyZXNzKTsKKwl1c2J2aXNpb24tPmN0cmxVcmJTZXR1cC53TGVuZ3RoICAgICAgPSBjcHVfdG9fbGUxNihsZW4pOworCXVzYl9maWxsX2NvbnRyb2xfdXJiICh1c2J2aXNpb24tPmN0cmxVcmIsIHVzYnZpc2lvbi0+ZGV2LAorCQkJCQkJCXVzYl9zbmRjdHJscGlwZSh1c2J2aXNpb24tPmRldiwgMSksCisJCQkJCQkJKHVuc2lnbmVkIGNoYXIgKikmdXNidmlzaW9uLT5jdHJsVXJiU2V0dXAsCisJCQkJCQkJKHZvaWQgKil1c2J2aXNpb24tPmN0cmxVcmJCdWZmZXIsIGxlbiwKKwkJCQkJCQl1c2J2aXNpb25fY3RybFVyYl9jb21wbGV0ZSwKKwkJCQkJCQkodm9pZCAqKXVzYnZpc2lvbik7CisKKwltZW1jcHkodXNidmlzaW9uLT5jdHJsVXJiQnVmZmVyLCBkYXRhLCBsZW4pOworCisJZXJyQ29kZSA9IHVzYl9zdWJtaXRfdXJiKHVzYnZpc2lvbi0+Y3RybFVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKGVyckNvZGUgPCAwKSB7CisJCS8vIGVycm9yIGluIHVzYl9zdWJtaXRfdXJiKCkKKwkJdXNidmlzaW9uLT5jdHJsVXJiQnVzeSA9IDA7CisJfQorCVBERUJVRyhEQkdfSVJRLCAic3VibWl0ICVkIGJ5dGU6IGVycm9yICVkIiwgbGVuLCBlcnJDb2RlKTsKKwlyZXR1cm4gZXJyQ29kZTsKK30KKworCitzdGF0aWMgaW50IHVzYnZpc2lvbl9pbml0X2NvbXByZXNzaW9uKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJaW50IGVyckNvZGUgPSAwOworCisJdXNidmlzaW9uLT5sYXN0SXNvY0ZyYW1lTnVtID0gLTE7CisJdXNidmlzaW9uLT5pc29jRGF0YUNvdW50ID0gMDsKKwl1c2J2aXNpb24tPmlzb2NQYWNrZXRDb3VudCA9IDA7CisJdXNidmlzaW9uLT5pc29jU2tpcENvdW50ID0gMDsKKwl1c2J2aXNpb24tPmNvbXByTGV2ZWwgPSA1MDsKKwl1c2J2aXNpb24tPmxhc3RDb21wckxldmVsID0gLTE7CisJdXNidmlzaW9uLT5pc29jVXJiQ291bnQgPSAwOworCXVzYnZpc2lvbi0+cmVxdWVzdEludHJhID0gMTsKKwl1c2J2aXNpb24tPmlzb2NNZWFzdXJlQmFuZHdpZHRoQ291bnQgPSAwOworCisJcmV0dXJuIGVyckNvZGU7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gbWVhc3VyZXMgdGhlIHVzZWQgYmFuZHdpZHRoIHNpbmNlIGxhc3QgY2FsbAorICogcmV0dXJuOiAgICAwIDogbm8gZXJyb3IKKyAqIHNldHMgdXNlZEJhbmR3aWR0aCB0byAxLTEwMCA6IDEtMTAwJSBvZiBmdWxsIGJhbmR3aWR0aCByZXNwLiB0byBpc29jUGFja2V0U2l6ZQorICovCitzdGF0aWMgaW50IHVzYnZpc2lvbl9tZWFzdXJlX2JhbmR3aWR0aCAoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlpbnQgZXJyQ29kZSA9IDA7CisKKwlpZiAodXNidmlzaW9uLT5pc29jTWVhc3VyZUJhbmR3aWR0aENvdW50IDwgMikgeyAvLyB0aGlzIGdpdmVzIGFuIGF2ZXJhZ2UgYmFuZHdpZHRoIG9mIDMgZnJhbWVzCisJCXVzYnZpc2lvbi0+aXNvY01lYXN1cmVCYW5kd2lkdGhDb3VudCsrOworCQlyZXR1cm4gZXJyQ29kZTsKKwl9CisJaWYgKCh1c2J2aXNpb24tPmlzb2NQYWNrZXRTaXplID4gMCkgJiYgKHVzYnZpc2lvbi0+aXNvY1BhY2tldENvdW50ID4gMCkpIHsKKwkJdXNidmlzaW9uLT51c2VkQmFuZHdpZHRoID0gdXNidmlzaW9uLT5pc29jRGF0YUNvdW50IC8KKwkJCQkJKHVzYnZpc2lvbi0+aXNvY1BhY2tldENvdW50ICsgdXNidmlzaW9uLT5pc29jU2tpcENvdW50KSAqCisJCQkJCTEwMCAvIHVzYnZpc2lvbi0+aXNvY1BhY2tldFNpemU7CisJfQorCXVzYnZpc2lvbi0+aXNvY01lYXN1cmVCYW5kd2lkdGhDb3VudCA9IDA7CisJdXNidmlzaW9uLT5pc29jRGF0YUNvdW50ID0gMDsKKwl1c2J2aXNpb24tPmlzb2NQYWNrZXRDb3VudCA9IDA7CisJdXNidmlzaW9uLT5pc29jU2tpcENvdW50ID0gMDsKKwlyZXR1cm4gZXJyQ29kZTsKK30KKworc3RhdGljIGludCB1c2J2aXNpb25fYWRqdXN0X2NvbXByZXNzaW9uIChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCWludCBlcnJDb2RlID0gMDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2XTsKKworCVBERUJVRyhEQkdfSVJRLCAiIik7CisJaWYgKChhZGp1c3RDb21wcmVzc2lvbikgJiYgKHVzYnZpc2lvbi0+dXNlZEJhbmR3aWR0aCA+IDApKSB7CisJCXVzYnZpc2lvbi0+Y29tcHJMZXZlbCArPSAodXNidmlzaW9uLT51c2VkQmFuZHdpZHRoIC0gOTApIC8gMjsKKwkJUkVTVFJJQ1RfVE9fUkFOR0UodXNidmlzaW9uLT5jb21wckxldmVsLCAwLCAxMDApOworCQlpZiAodXNidmlzaW9uLT5jb21wckxldmVsICE9IHVzYnZpc2lvbi0+bGFzdENvbXByTGV2ZWwpIHsKKwkJCWludCBkaXN0b3JzaW9uOworCQkJaWYgKHVzYnZpc2lvbi0+YnJpZGdlVHlwZSA9PSBCUklER0VfTlQxMDA0IHx8IHVzYnZpc2lvbi0+YnJpZGdlVHlwZSA9PSBCUklER0VfTlQxMDA1KSB7CisJCQkJYnVmZmVyWzBdID0gKHVuc2lnbmVkIGNoYXIpKDQgKyAxNiAqIHVzYnZpc2lvbi0+Y29tcHJMZXZlbCAvIDEwMCk7CS8vIFBDTSBUaHJlc2hvbGQgMQorCQkJCWJ1ZmZlclsxXSA9ICh1bnNpZ25lZCBjaGFyKSg0ICsgOCAqIHVzYnZpc2lvbi0+Y29tcHJMZXZlbCAvIDEwMCk7CS8vIFBDTSBUaHJlc2hvbGQgMgorCQkJCWRpc3RvcnNpb24gPSA3ICsgMjQ4ICogdXNidmlzaW9uLT5jb21wckxldmVsIC8gMTAwOworCQkJCWJ1ZmZlclsyXSA9ICh1bnNpZ25lZCBjaGFyKShkaXN0b3JzaW9uICYgMHhGRik7CQkJCS8vIEF2ZXJhZ2UgZGlzdG9yc2lvbiBUaHJlc2hvbGQgKGludGVyKQorCQkJCWJ1ZmZlclszXSA9ICh1bnNpZ25lZCBjaGFyKShkaXN0b3JzaW9uICYgMHhGRik7CQkJCS8vIEF2ZXJhZ2UgZGlzdG9yc2lvbiBUaHJlc2hvbGQgKGludHJhKQorCQkJCWRpc3RvcnNpb24gPSAxICsgNDIgKiB1c2J2aXNpb24tPmNvbXByTGV2ZWwgLyAxMDA7CisJCQkJYnVmZmVyWzRdID0gKHVuc2lnbmVkIGNoYXIpKGRpc3RvcnNpb24gJiAweEZGKTsJCQkJLy8gTWF4aW11bSBkaXN0b3JzaW9uIFRocmVzaG9sZCAoaW50ZXIpCisJCQkJYnVmZmVyWzVdID0gKHVuc2lnbmVkIGNoYXIpKGRpc3RvcnNpb24gJiAweEZGKTsJCQkJLy8gTWF4aW11bSBkaXN0b3JzaW9uIFRocmVzaG9sZCAoaW50cmEpCisJCQl9CisJCQllbHNlIHsgLy9CUklER0VfTlQxMDAzCisJCQkJYnVmZmVyWzBdID0gKHVuc2lnbmVkIGNoYXIpKDQgKyAxNiAqIHVzYnZpc2lvbi0+Y29tcHJMZXZlbCAvIDEwMCk7CS8vIFBDTSB0aHJlc2hvbGQgMQorCQkJCWJ1ZmZlclsxXSA9ICh1bnNpZ25lZCBjaGFyKSg0ICsgOCAqIHVzYnZpc2lvbi0+Y29tcHJMZXZlbCAvIDEwMCk7CS8vIFBDTSB0aHJlc2hvbGQgMgorCQkJCWRpc3RvcnNpb24gPSAyICsgMjUzICogdXNidmlzaW9uLT5jb21wckxldmVsIC8gMTAwOworCQkJCWJ1ZmZlclsyXSA9ICh1bnNpZ25lZCBjaGFyKShkaXN0b3JzaW9uICYgMHhGRik7CQkJCS8vIGRpc3RvcnNpb24gdGhyZXNob2xkIGJpdDAtNworCQkJCWJ1ZmZlclszXSA9IDA7IAkvLyh1bnNpZ25lZCBjaGFyKSgoZGlzdG9yc2lvbiA+PiA4KSAmIDB4MEYpOwkJLy8gZGlzdG9yc2lvbiB0aHJlc2hvbGQgYml0IDgtMTEKKwkJCQlkaXN0b3JzaW9uID0gMCArIDQzICogdXNidmlzaW9uLT5jb21wckxldmVsIC8gMTAwOworCQkJCWJ1ZmZlcls0XSA9ICh1bnNpZ25lZCBjaGFyKShkaXN0b3JzaW9uICYgMHhGRik7CQkJCS8vIG1heGltdW0gZGlzdG9yc2lvbiBiaXQwLTcKKwkJCQlidWZmZXJbNV0gPSAwOyAvLyh1bnNpZ25lZCBjaGFyKSgoZGlzdG9yc2lvbiA+PiA4KSAmIDB4MDEpOwkJLy8gbWF4aW11bSBkaXN0b3JzaW9uIGJpdCA4CisJCQl9CisJCQllcnJDb2RlID0gdXNidmlzaW9uX3dyaXRlX3JlZ19pcnEodXNidmlzaW9uLCBVU0JWSVNJT05fUENNX1RIUjEsIGJ1ZmZlciwgNik7CisJCQlpZiAoZXJyQ29kZSA9PSAwKXsKKwkJCQlQREVCVUcoREJHX0lSUSwgIm5ldyBjb21wciBwYXJhbXMgJSMwMnggJSMwMnggJSMwMnggJSMwMnggJSMwMnggJSMwMngiLCBidWZmZXJbMF0sCisJCQkJCQkJCWJ1ZmZlclsxXSwgYnVmZmVyWzJdLCBidWZmZXJbM10sIGJ1ZmZlcls0XSwgYnVmZmVyWzVdKTsKKwkJCQl1c2J2aXNpb24tPmxhc3RDb21wckxldmVsID0gdXNidmlzaW9uLT5jb21wckxldmVsOworCQkJfQorCQl9CisJfQorCXJldHVybiBlcnJDb2RlOworfQorCitzdGF0aWMgaW50IHVzYnZpc2lvbl9yZXF1ZXN0X2ludHJhIChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCWludCBlcnJDb2RlID0gMDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxXTsKKworCVBERUJVRyhEQkdfSVJRLCAiIik7CisJdXNidmlzaW9uLT5yZXF1ZXN0SW50cmEgPSAxOworCWJ1ZmZlclswXSA9IDE7CisJdXNidmlzaW9uX3dyaXRlX3JlZ19pcnEodXNidmlzaW9uLCBVU0JWSVNJT05fRk9SQ0VfSU5UUkEsIGJ1ZmZlciwgMSk7CisJcmV0dXJuIGVyckNvZGU7Cit9CisKK3N0YXRpYyBpbnQgdXNidmlzaW9uX3VucmVxdWVzdF9pbnRyYSAoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlpbnQgZXJyQ29kZSA9IDA7CisJdW5zaWduZWQgY2hhciBidWZmZXJbMV07CisKKwlQREVCVUcoREJHX0lSUSwgIiIpOworCXVzYnZpc2lvbi0+cmVxdWVzdEludHJhID0gMDsKKwlidWZmZXJbMF0gPSAwOworCXVzYnZpc2lvbl93cml0ZV9yZWdfaXJxKHVzYnZpc2lvbiwgVVNCVklTSU9OX0ZPUkNFX0lOVFJBLCBidWZmZXIsIDEpOworCXJldHVybiBlcnJDb2RlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdXNidmlzaW9uIHV0aWxpdHkgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IHVzYnZpc2lvbl9wb3dlcl9vZmYoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlpbnQgZXJyQ29kZSA9IDA7CisKKwlQREVCVUcoREJHX0ZVTkMsICIiKTsKKworCWVyckNvZGUgPSB1c2J2aXNpb25fd3JpdGVfcmVnKHVzYnZpc2lvbiwgVVNCVklTSU9OX1BXUl9SRUcsIFVTQlZJU0lPTl9TU1BORF9FTik7CisJaWYgKGVyckNvZGUgPT0gMSkgeworCQl1c2J2aXNpb24tPnBvd2VyID0gMDsKKwl9CisJUERFQlVHKERCR19GVU5DLCAiJXM6IGVyckNvZGUgJWQiLCAoZXJyQ29kZSE9MSk/IkVSUk9SIjoicG93ZXIgaXMgb2ZmIiwgZXJyQ29kZSk7CisJcmV0dXJuIGVyckNvZGU7Cit9CisKKy8qCisgKiB1c2J2aXNpb25fc2V0X3ZpZGVvX2Zvcm1hdCgpCisgKgorICovCitzdGF0aWMgaW50IHVzYnZpc2lvbl9zZXRfdmlkZW9fZm9ybWF0KHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIGludCBmb3JtYXQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gInVzYnZpc2lvbl9zZXRfdmlkZW9fZm9ybWF0IjsKKwlpbnQgcmM7CisJdW5zaWduZWQgY2hhciB2YWx1ZVsyXTsKKworCWlmICghVVNCVklTSU9OX0lTX09QRVJBVElPTkFMKHVzYnZpc2lvbikpCisJCXJldHVybiAwOworCisJUERFQlVHKERCR19GVU5DLCAiaXNvY01vZGUgJSMwMngiLCBmb3JtYXQpOworCisJaWYgKChmb3JtYXQgIT0gSVNPQ19NT0RFX1lVVjQyMikKKwkgICAgJiYgKGZvcm1hdCAhPSBJU09DX01PREVfWVVWNDIwKQorCSAgICAmJiAoZm9ybWF0ICE9IElTT0NfTU9ERV9DT01QUkVTUykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1c2J2aXNpb246IHVua25vd24gdmlkZW8gZm9ybWF0ICUwMngsIHVzaW5nIGRlZmF1bHQgWVVWNDIwIiwKKwkJICAgICAgIGZvcm1hdCk7CisJCWZvcm1hdCA9IElTT0NfTU9ERV9ZVVY0MjA7CisJfQorCXZhbHVlWzBdID0gMHgwQTsgIC8vVE9ETzogU2VlIHRoZSBlZmZlY3Qgb2YgdGhlIGZpbHRlcgorCXZhbHVlWzFdID0gZm9ybWF0OworCXJjID0gdXNiX2NvbnRyb2xfbXNnKHVzYnZpc2lvbi0+ZGV2LCB1c2Jfc25kY3RybHBpcGUodXNidmlzaW9uLT5kZXYsIDEpLAorCQkJICAgICBVU0JWSVNJT05fT1BfQ09ERSwKKwkJCSAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJICAgICBVU0JfUkVDSVBfRU5EUE9JTlQsIDAsCisJCQkgICAgIChfX3UxNikgVVNCVklTSU9OX0ZJTFRfQ09OVCwgdmFsdWUsIDIsIEhaKTsKKworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRVJST1I9JWQuIFVTQlZJU0lPTiBzdG9wcGVkIC0gIgorCQkgICAgICAgInJlY29ubmVjdCBvciByZWxvYWQgZHJpdmVyLlxuIiwgcHJvYywgcmMpOworCX0KKwl1c2J2aXNpb24tPmlzb2NNb2RlID0gZm9ybWF0OworCXJldHVybiByYzsKK30KKworLyoKKyAqIHVzYnZpc2lvbl9zZXRfb3V0cHV0KCkKKyAqCisgKi8KKworaW50IHVzYnZpc2lvbl9zZXRfb3V0cHV0KHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIGludCB3aWR0aCwKKwkJCSBpbnQgaGVpZ2h0KQoreworCWludCBlcnJDb2RlID0gMDsKKwlpbnQgVXNiV2lkdGgsIFVzYkhlaWdodDsKKwl1bnNpZ25lZCBpbnQgZnJhbWVSYXRlPTAsIGZyYW1lRHJvcD0wOworCXVuc2lnbmVkIGNoYXIgdmFsdWVbNF07CisKKwlpZiAoIVVTQlZJU0lPTl9JU19PUEVSQVRJT05BTCh1c2J2aXNpb24pKSB7CisJCXJldHVybiAwOworCX0KKworCWlmICh3aWR0aCA+IE1BWF9VU0JfV0lEVEgpIHsKKwkJVXNiV2lkdGggPSB3aWR0aCAvIDI7CisJCXVzYnZpc2lvbi0+c3RyZXRjaF93aWR0aCA9IDI7CisJfQorCWVsc2UgeworCQlVc2JXaWR0aCA9IHdpZHRoOworCQl1c2J2aXNpb24tPnN0cmV0Y2hfd2lkdGggPSAxOworCX0KKworCWlmIChoZWlnaHQgPiBNQVhfVVNCX0hFSUdIVCkgeworCQlVc2JIZWlnaHQgPSBoZWlnaHQgLyAyOworCQl1c2J2aXNpb24tPnN0cmV0Y2hfaGVpZ2h0ID0gMjsKKwl9CisJZWxzZSB7CisJCVVzYkhlaWdodCA9IGhlaWdodDsKKwkJdXNidmlzaW9uLT5zdHJldGNoX2hlaWdodCA9IDE7CisJfQorCisJUkVTVFJJQ1RfVE9fUkFOR0UoVXNiV2lkdGgsIE1JTl9GUkFNRV9XSURUSCwgTUFYX1VTQl9XSURUSCk7CisJVXNiV2lkdGggJj0gfihNSU5fRlJBTUVfV0lEVEgtMSk7CisJUkVTVFJJQ1RfVE9fUkFOR0UoVXNiSGVpZ2h0LCBNSU5fRlJBTUVfSEVJR0hULCBNQVhfVVNCX0hFSUdIVCk7CisJVXNiSGVpZ2h0ICY9IH4oMSk7CisKKwlQREVCVUcoREJHX0ZVTkMsICJ1c2IgJWR4JWQ7IHNjcmVlbiAlZHglZDsgc3RyZXRjaCAlZHglZCIsCisJCQkJCQlVc2JXaWR0aCwgVXNiSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LAorCQkJCQkJdXNidmlzaW9uLT5zdHJldGNoX3dpZHRoLCB1c2J2aXNpb24tPnN0cmV0Y2hfaGVpZ2h0KTsKKworCS8qIEknbGwgbm90IHJld3JpdGUgdGhlIHNhbWUgdmFsdWVzICovCisJaWYgKChVc2JXaWR0aCAhPSB1c2J2aXNpb24tPmN1cndpZHRoKSB8fCAoVXNiSGVpZ2h0ICE9IHVzYnZpc2lvbi0+Y3VyaGVpZ2h0KSkgeworCQl2YWx1ZVswXSA9IFVzYldpZHRoICYgMHhmZjsJCS8vTFNCCisJCXZhbHVlWzFdID0gKFVzYldpZHRoID4+IDgpICYgMHgwMzsJLy9NU0IKKwkJdmFsdWVbMl0gPSBVc2JIZWlnaHQgJiAweGZmOwkJLy9MU0IKKwkJdmFsdWVbM10gPSAoVXNiSGVpZ2h0ID4+IDgpICYgMHgwMzsJLy9NU0IKKworCQllcnJDb2RlID0gdXNiX2NvbnRyb2xfbXNnKHVzYnZpc2lvbi0+ZGV2LCB1c2Jfc25kY3RybHBpcGUodXNidmlzaW9uLT5kZXYsIDEpLAorCQkJICAgICBVU0JWSVNJT05fT1BfQ09ERSwKKwkJCSAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfRU5EUE9JTlQsCisJCQkJIDAsIChfX3UxNikgVVNCVklTSU9OX0xYU0laRV9PLCB2YWx1ZSwgNCwgSFopOworCisJCWlmIChlcnJDb2RlIDwgMCkgeworCQkJZXJyKCIlcyBmYWlsZWQ6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBlcnJDb2RlKTsKKwkJCXJldHVybiBlcnJDb2RlOworCQl9CisJCXVzYnZpc2lvbi0+Y3Vyd2lkdGggPSB1c2J2aXNpb24tPnN0cmV0Y2hfd2lkdGggKiBVc2JXaWR0aDsKKwkJdXNidmlzaW9uLT5jdXJoZWlnaHQgPSB1c2J2aXNpb24tPnN0cmV0Y2hfaGVpZ2h0ICogVXNiSGVpZ2h0OworCX0KKworCWlmICh1c2J2aXNpb24tPmlzb2NNb2RlID09IElTT0NfTU9ERV9ZVVY0MjIpIHsKKwkJZnJhbWVSYXRlID0gKHVzYnZpc2lvbi0+aXNvY1BhY2tldFNpemUgKiAxMDAwKSAvIChVc2JXaWR0aCAqIFVzYkhlaWdodCAqIDIpOworCX0KKwllbHNlIGlmICh1c2J2aXNpb24tPmlzb2NNb2RlID09IElTT0NfTU9ERV9ZVVY0MjApIHsKKwkJZnJhbWVSYXRlID0gKHVzYnZpc2lvbi0+aXNvY1BhY2tldFNpemUgKiAxMDAwKSAvICgoVXNiV2lkdGggKiBVc2JIZWlnaHQgKiAxMikgLyA4KTsKKwl9CisJZWxzZSB7CisJCWZyYW1lUmF0ZSA9IEZSQU1FUkFURV9NQVg7CisJfQorCisJaWYgKHVzYnZpc2lvbi0+dHZub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgeworCQlmcmFtZURyb3AgPSBmcmFtZVJhdGUgKiAzMiAvIDI1IC0gMTsKKwl9CisJZWxzZSBpZiAodXNidmlzaW9uLT50dm5vcm0tPmlkICYgVjRMMl9TVERfNTI1XzYwKSB7CisJCWZyYW1lRHJvcCA9IGZyYW1lUmF0ZSAqIDMyIC8gMzAgLSAxOworCX0KKworCVJFU1RSSUNUX1RPX1JBTkdFKGZyYW1lRHJvcCwgRlJBTUVSQVRFX01JTiwgRlJBTUVSQVRFX01BWCk7CisKKwlQREVCVUcoREJHX0ZVTkMsICJmcmFtZVJhdGUgJWQgZnBzLCBmcmFtZURyb3AgJWQiLCBmcmFtZVJhdGUsIGZyYW1lRHJvcCk7CisKKwlmcmFtZURyb3AgPSBGUkFNRVJBVEVfTUFYOyAJLy8gV2UgY2FuIGFsbG93IHRoZSBtYXhpbXVtIGhlcmUsIGJlY2F1c2UgZHJvcHBpbmcgaXMgY29udHJvbGxlZAorCisJLyogZnJhbWVEcm9wID0gNzsgPT4gZnJhbWVQaGFzZSA9IDEsIDUsIDksIDEzLCAxNywgMjEsIDI1LCAwLCA0LCA4LCAuLi4KKwkJPT4gZnJhbWVTa2lwID0gNDsKKwkJPT4gZnJhbWVSYXRlID0gKDcgKyAxKSAqIDI1IC8gMzIgPSAyMDAgLyAzMiA9IDYuMjU7CisKKwkgICBmcmFtZURyb3AgPSA5OyA9PiBmcmFtZVBoYXNlID0gMSwgNSwgOCwgMTEsIDE0LCAxNywgMjEsIDI0LCAyNywgMSwgNCwgOCwgLi4uCisJICAgID0+IGZyYW1lU2tpcCA9IDQsIDMsIDMsIDMsIDMsIDQsIDMsIDMsIDMsIDMsIDQsIC4uLgorCQk9PiBmcmFtZVJhdGUgPSAoOSArIDEpICogMjUgLyAzMiA9IDI1MCAvIDMyID0gNy44MTI1OworCSovCisJZXJyQ29kZSA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fRlJNX1JBVEUsIGZyYW1lRHJvcCk7CisJcmV0dXJuIGVyckNvZGU7Cit9CisKKworLyoKKyAqIHVzYnZpc2lvbl9mcmFtZXNfYWxsb2MKKyAqIGFsbG9jYXRlIHRoZSBtYXhpbXVtIGZyYW1lcyB0aGlzIGRyaXZlciBjYW4gbWFuYWdlCisgKi8KK2ludCB1c2J2aXNpb25fZnJhbWVzX2FsbG9jKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJaW50IGk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBmcmFtZSBidWZmZXJzICovCisJdXNidmlzaW9uLT5tYXhfZnJhbWVfc2l6ZSA9IE1BWF9GUkFNRV9TSVpFOworCXVzYnZpc2lvbi0+ZmJ1Zl9zaXplID0gVVNCVklTSU9OX05VTUZSQU1FUyAqIHVzYnZpc2lvbi0+bWF4X2ZyYW1lX3NpemU7CisJdXNidmlzaW9uLT5mYnVmID0gdXNidmlzaW9uX3J2bWFsbG9jKHVzYnZpc2lvbi0+ZmJ1Zl9zaXplKTsKKworCWlmKHVzYnZpc2lvbi0+ZmJ1ZiA9PSBOVUxMKSB7CisJCWVycigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgZmJ1ZiAiLAorCQkgICAgX19GVU5DVElPTl9fLCB1c2J2aXNpb24tPmZidWZfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcGluX2xvY2tfaW5pdCgmdXNidmlzaW9uLT5xdWV1ZV9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1c2J2aXNpb24tPndhaXRfZnJhbWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnVzYnZpc2lvbi0+d2FpdF9zdHJlYW0pOworCisJLyogQWxsb2NhdGUgYWxsIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVVNCVklTSU9OX05VTUZSQU1FUzsgaSsrKSB7CisJCXVzYnZpc2lvbi0+ZnJhbWVbaV0uaW5kZXggPSBpOworCQl1c2J2aXNpb24tPmZyYW1lW2ldLmdyYWJzdGF0ZSA9IEZyYW1lU3RhdGVfVW51c2VkOworCQl1c2J2aXNpb24tPmZyYW1lW2ldLmRhdGEgPSB1c2J2aXNpb24tPmZidWYgKworCQkJaSAqIHVzYnZpc2lvbi0+bWF4X2ZyYW1lX3NpemU7CisJCS8qCisJCSAqIFNldCBkZWZhdWx0IHNpemVzIGZvciByZWFkIG9wZXJhdGlvbi4KKwkJICovCisJCXVzYnZpc2lvbi0+c3RyZXRjaF93aWR0aCA9IDE7CisJCXVzYnZpc2lvbi0+c3RyZXRjaF9oZWlnaHQgPSAxOworCQl1c2J2aXNpb24tPmZyYW1lW2ldLndpZHRoID0gdXNidmlzaW9uLT5jdXJ3aWR0aDsKKwkJdXNidmlzaW9uLT5mcmFtZVtpXS5oZWlnaHQgPSB1c2J2aXNpb24tPmN1cmhlaWdodDsKKwkJdXNidmlzaW9uLT5mcmFtZVtpXS5ieXRlc19yZWFkID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1c2J2aXNpb25fZnJhbWVzX2ZyZWUKKyAqIGZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBmcmFtZXMKKyAqLwordm9pZCB1c2J2aXNpb25fZnJhbWVzX2ZyZWUoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwkvKiBIYXZlIHRvIGZyZWUgYWxsIHRoYXQgbWVtb3J5ICovCisJaWYgKHVzYnZpc2lvbi0+ZmJ1ZiAhPSBOVUxMKSB7CisJCXVzYnZpc2lvbl9ydmZyZWUodXNidmlzaW9uLT5mYnVmLCB1c2J2aXNpb24tPmZidWZfc2l6ZSk7CisJCXVzYnZpc2lvbi0+ZmJ1ZiA9IE5VTEw7CisJfQorfQorLyoKKyAqIHVzYnZpc2lvbl9lbXB0eV9mcmFtZXF1ZXVlcygpCisgKiBwcmVwYXJlIHF1ZXVlcyBmb3IgaW5jb21pbmcgYW5kIG91dGdvaW5nIGZyYW1lcworICovCit2b2lkIHVzYnZpc2lvbl9lbXB0eV9mcmFtZXF1ZXVlcyhzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCXUzMiBpOworCisJSU5JVF9MSVNUX0hFQUQoJih1c2J2aXNpb24tPmlucXVldWUpKTsKKwlJTklUX0xJU1RfSEVBRCgmKHVzYnZpc2lvbi0+b3V0cXVldWUpKTsKKworCWZvciAoaSA9IDA7IGkgPCBVU0JWSVNJT05fTlVNRlJBTUVTOyBpKyspIHsKKwkJdXNidmlzaW9uLT5mcmFtZVtpXS5ncmFic3RhdGUgPSBGcmFtZVN0YXRlX1VudXNlZDsKKwkJdXNidmlzaW9uLT5mcmFtZVtpXS5ieXRlc19yZWFkID0gMDsKKwl9Cit9CisKKy8qCisgKiB1c2J2aXNpb25fc3RyZWFtX2ludGVycnVwdCgpCisgKiBzdG9wcyBzdHJlYW1pbmcKKyAqLworaW50IHVzYnZpc2lvbl9zdHJlYW1faW50ZXJydXB0KHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJaW50IHJldCA9IDA7CisKKwkvKiBzdG9wIHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlICovCisKKwl1c2J2aXNpb24tPnN0cmVhbWluZyA9IFN0cmVhbV9JbnRlcnJ1cHQ7CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHVzYnZpc2lvbi0+d2FpdF9zdHJlYW0sCisJCQkJICh1c2J2aXNpb24tPnN0cmVhbWluZyA9PSBTdHJlYW1fSWRsZSksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVVNCVklTSU9OX05VTVNCVUYqVVNCVklTSU9OX1VSQl9GUkFNRVMpKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdXNidmlzaW9uX3NldF9jb21wcmVzc19wYXJhbXMoKQorICoKKyAqLworCitzdGF0aWMgaW50IHVzYnZpc2lvbl9zZXRfY29tcHJlc3NfcGFyYW1zKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gInVzYnZpc2lvbl9zZXRfY29tcHJlc2lvbl9wYXJhbXM6ICI7CisJaW50IHJjOworCXVuc2lnbmVkIGNoYXIgdmFsdWVbNl07CisKKwl2YWx1ZVswXSA9IDB4MEY7ICAgIC8vIEludHJhLUNvbXByZXNzaW9uIGN5Y2xlCisJdmFsdWVbMV0gPSAweDAxOyAgICAvLyBSZWcuNDUgb25lIGxpbmUgcGVyIHN0cmlwCisJdmFsdWVbMl0gPSAweDAwOyAgICAvLyBSZWcuNDYgRm9yY2UgaW50cmEgbW9kZSBvbiBhbGwgbmV3IGZyYW1lcworCXZhbHVlWzNdID0gMHgwMDsgICAgLy8gUmVnLjQ3IEZPUkNFX1VQIDwtIDAgbm9ybWFsIG9wZXJhdGlvbiAobm90IGZvcmNlKQorCXZhbHVlWzRdID0gMHhBMjsgICAgLy8gUmVnLjQ4IEJVRl9USFIgSSdtIG5vdCBzdXJlIGlmIHRoaXMgZG9lcyBzb21ldGhpbmcgaW4gbm90IGNvbXByZXNzZWQgbW9kZS4KKwl2YWx1ZVs1XSA9IDB4MDA7ICAgIC8vIFJlZy40OSBEVklfWVVWIFRoaXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBjb21wcmVzc2lvbgorCisJLy9jYXRjaGVkIHZhbHVlcyBmb3IgTlQxMDA0CisJLy8gdmFsdWVbMF0gPSAweEZGOyAvLyBOZXZlciBhcHBseSBpbnRyYSBtb2RlIGF1dG9tYXRpY2FsbHkKKwkvLyB2YWx1ZVsxXSA9IDB4RjE7IC8vIFVzZSBmdWxsIGZyYW1lIGhlaWdodCBmb3IgdmlydHVhbCBzdHJpcCB3aWR0aDsgT25lIGxpbmUgcGVyIHN0cmlwCisJLy8gdmFsdWVbMl0gPSAweDAxOyAvLyBGb3JjZSBpbnRyYSBtb2RlIG9uIGFsbCBuZXcgZnJhbWVzCisJLy8gdmFsdWVbM10gPSAweDAwOyAvLyBTdHJpcCBzaXplIDQwMCBCeXRlczsgZG8gbm90IGZvcmNlIHVwCisJLy8gdmFsdWVbNF0gPSAweEEyOyAvLworCWlmICghVVNCVklTSU9OX0lTX09QRVJBVElPTkFMKHVzYnZpc2lvbikpCisJCXJldHVybiAwOworCisJcmMgPSB1c2JfY29udHJvbF9tc2codXNidmlzaW9uLT5kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2J2aXNpb24tPmRldiwgMSksCisJCQkgICAgIFVTQlZJU0lPTl9PUF9DT0RFLAorCQkJICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkgICAgIFVTQl9SRUNJUF9FTkRQT0lOVCwgMCwKKwkJCSAgICAgKF9fdTE2KSBVU0JWSVNJT05fSU5UUkFfQ1lDLCB2YWx1ZSwgNSwgSFopOworCisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzRVJST1I9JWQuIFVTQlZJU0lPTiBzdG9wcGVkIC0gIgorCQkgICAgICAgInJlY29ubmVjdCBvciByZWxvYWQgZHJpdmVyLlxuIiwgcHJvYywgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHVzYnZpc2lvbi0+YnJpZGdlVHlwZSA9PSBCUklER0VfTlQxMDA0KSB7CisJCXZhbHVlWzBdID0gIDIwOyAvLyBQQ00gVGhyZXNob2xkIDEKKwkJdmFsdWVbMV0gPSAgMTI7IC8vIFBDTSBUaHJlc2hvbGQgMgorCQl2YWx1ZVsyXSA9IDI1NTsgLy8gRGlzdG9yc2lvbiBUaHJlc2hvbGQgaW50ZXIKKwkJdmFsdWVbM10gPSAyNTU7IC8vIERpc3RvcnNpb24gVGhyZXNob2xkIGludHJhCisJCXZhbHVlWzRdID0gIDQzOyAvLyBNYXggRGlzdG9yc2lvbiBpbnRlcgorCQl2YWx1ZVs1XSA9ICA0MzsgLy8gTWF4IERpc3RvcnNpb24gaW50cmEKKwl9CisJZWxzZSB7CisJCXZhbHVlWzBdID0gIDIwOyAvLyBQQ00gVGhyZXNob2xkIDEKKwkJdmFsdWVbMV0gPSAgMTI7IC8vIFBDTSBUaHJlc2hvbGQgMgorCQl2YWx1ZVsyXSA9IDI1NTsgLy8gRGlzdG9yc2lvbiBUaHJlc2hvbGQgZDctZDAKKwkJdmFsdWVbM10gPSAgIDA7IC8vIERpc3RvcnNpb24gVGhyZXNob2xkIGQxMS1kOAorCQl2YWx1ZVs0XSA9ICA0MzsgLy8gTWF4IERpc3RvcnNpb24gZDctZDAKKwkJdmFsdWVbNV0gPSAgIDA7IC8vIE1heCBEaXN0b3JzaW9uIGQ4CisJfQorCisJaWYgKCFVU0JWSVNJT05fSVNfT1BFUkFUSU9OQUwodXNidmlzaW9uKSkKKwkJcmV0dXJuIDA7CisKKwlyYyA9IHVzYl9jb250cm9sX21zZyh1c2J2aXNpb24tPmRldiwgdXNiX3NuZGN0cmxwaXBlKHVzYnZpc2lvbi0+ZGV2LCAxKSwKKwkJCSAgICAgVVNCVklTSU9OX09QX0NPREUsCisJCQkgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCSAgICAgVVNCX1JFQ0lQX0VORFBPSU5ULCAwLAorCQkJICAgICAoX191MTYpIFVTQlZJU0lPTl9QQ01fVEhSMSwgdmFsdWUsIDYsIEhaKTsKKworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0VSUk9SPSVkLiBVU0JWSVNJT04gc3RvcHBlZCAtICIKKwkJICAgICAgICJyZWNvbm5lY3Qgb3IgcmVsb2FkIGRyaXZlci5cbiIsIHByb2MsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiB1c2J2aXNpb25fc2V0X2lucHV0KCkKKyAqCisgKiBTZXQgdGhlIGlucHV0IChzYWE3MTF4LCAuLi4pIHNpemUgeCB5IGFuZCBvdGhlciBtaXNjIGlucHV0IHBhcmFtcworICogSSd2ZSBubyBpZGVhIGlmIHRoaXMgcGFyYW1ldGVycyBhcmUgcmlnaHQKKyAqCisgKi8KK2ludCB1c2J2aXNpb25fc2V0X2lucHV0KHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvY1tdID0gInVzYnZpc2lvbl9zZXRfaW5wdXQ6ICI7CisJaW50IHJjOworCXVuc2lnbmVkIGNoYXIgdmFsdWVbOF07CisJdW5zaWduZWQgY2hhciBkdmlfeXV2X3ZhbHVlOworCisJaWYgKCFVU0JWSVNJT05fSVNfT1BFUkFUSU9OQUwodXNidmlzaW9uKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTZXQgaW5wdXQgZm9ybWF0IGV4cGVjdGVkIGZyb20gZGVjb2RlciovCisJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaW5fUmVnMSA+PSAwKSB7CisJCXZhbHVlWzBdID0gdXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLlZpbl9SZWcxICYgMHhmZjsKKwl9IGVsc2UgaWYodXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLkNvZGVjID09IENPREVDX1NBQTcxMTMpIHsKKwkJLyogU0FBNzExMyB1c2VzIDggYml0IG91dHB1dCAqLworCQl2YWx1ZVswXSA9IFVTQlZJU0lPTl84XzQyMl9TWU5DOworCX0gZWxzZSB7CisJCS8qIEknbSBzdXJlIG9ubHkgYWJvdXQgZDItZDAgWzAxMF0gMTYgYml0IDQ6MjoyIHVzaW4gc3luYyBwdWxzZXMKKwkJICogYXMgdGhhdCBpcyBob3cgc2FhNzExMSBpcyBjb25maWd1cmVkICovCisJCXZhbHVlWzBdID0gVVNCVklTSU9OXzE2XzQyMl9TWU5DOworCQkvKiB8IFVTQlZJU0lPTl9WU05DX1BPTCB8IFVTQlZJU0lPTl9WQ0xLX1BPTCk7Ki8KKwl9CisKKwlyYyA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fVklOX1JFRzEsIHZhbHVlWzBdKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNFUlJPUj0lZC4gVVNCVklTSU9OIHN0b3BwZWQgLSAiCisJCSAgICAgICAicmVjb25uZWN0IG9yIHJlbG9hZCBkcml2ZXIuXG4iLCBwcm9jLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKworCWlmICh1c2J2aXNpb24tPnR2bm9ybS0+aWQgJiBWNEwyX1NURF9QQUwpIHsKKwkJdmFsdWVbMF0gPSAweEMwOworCQl2YWx1ZVsxXSA9IDB4MDI7CS8vMHgwMkMwIC0+IDcwNCBJbnB1dCB2aWRlbyBsaW5lIGxlbmd0aAorCQl2YWx1ZVsyXSA9IDB4MjA7CisJCXZhbHVlWzNdID0gMHgwMTsJLy8weDAxMjAgLT4gMjg4IElucHV0IHZpZGVvIG4uIG9mIGxpbmVzCisJCXZhbHVlWzRdID0gMHg2MDsKKwkJdmFsdWVbNV0gPSAweDAwOwkvLzB4MDA2MCAtPiA5NiBJbnB1dCB2aWRlbyBoIG9mZnNldAorCQl2YWx1ZVs2XSA9IDB4MTY7CisJCXZhbHVlWzddID0gMHgwMDsJLy8weDAwMTYgLT4gMjIgSW5wdXQgdmlkZW8gdiBvZmZzZXQKKwl9IGVsc2UgaWYgKHVzYnZpc2lvbi0+dHZub3JtLT5pZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCXZhbHVlWzBdID0gMHhDMDsKKwkJdmFsdWVbMV0gPSAweDAyOwkvLzB4MDJDMCAtPiA3MDQgSW5wdXQgdmlkZW8gbGluZSBsZW5ndGgKKwkJdmFsdWVbMl0gPSAweDIwOworCQl2YWx1ZVszXSA9IDB4MDE7CS8vMHgwMTIwIC0+IDI4OCBJbnB1dCB2aWRlbyBuLiBvZiBsaW5lcworCQl2YWx1ZVs0XSA9IDB4MDE7CisJCXZhbHVlWzVdID0gMHgwMDsJLy8weDAwMDEgLT4gMDEgSW5wdXQgdmlkZW8gaCBvZmZzZXQKKwkJdmFsdWVbNl0gPSAweDAxOworCQl2YWx1ZVs3XSA9IDB4MDA7CS8vMHgwMDAxIC0+IDAxIElucHV0IHZpZGVvIHYgb2Zmc2V0CisJfSBlbHNlIHsJLyogVjRMMl9TVERfTlRTQyAqLworCQl2YWx1ZVswXSA9IDB4RDA7CisJCXZhbHVlWzFdID0gMHgwMjsJLy8weDAyRDAgLT4gNzIwIElucHV0IHZpZGVvIGxpbmUgbGVuZ3RoCisJCXZhbHVlWzJdID0gMHhGMDsKKwkJdmFsdWVbM10gPSAweDAwOwkvLzB4MDBGMCAtPiAyNDAgSW5wdXQgdmlkZW8gbnVtYmVyIG9mIGxpbmVzCisJCXZhbHVlWzRdID0gMHg1MDsKKwkJdmFsdWVbNV0gPSAweDAwOwkvLzB4MDA1MCAtPiA4MCBJbnB1dCB2aWRlbyBoIG9mZnNldAorCQl2YWx1ZVs2XSA9IDB4MTA7CisJCXZhbHVlWzddID0gMHgwMDsJLy8weDAwMTAgLT4gMTYgSW5wdXQgdmlkZW8gdiBvZmZzZXQKKwl9CisKKwlpZiAodXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLlhfT2Zmc2V0ID49IDApIHsKKwkJdmFsdWVbNF09dXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLlhfT2Zmc2V0ICYgMHhmZjsKKwkJdmFsdWVbNV09KHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5YX09mZnNldCAmIDB4MDMwMCkgPj4gODsKKwl9CisKKwlpZiAodXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLllfT2Zmc2V0ID49IDApIHsKKwkJdmFsdWVbNl09dXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLllfT2Zmc2V0ICYgMHhmZjsKKwkJdmFsdWVbN109KHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5ZX09mZnNldCAmIDB4MDMwMCkgPj4gODsKKwl9CisKKwlyYyA9IHVzYl9jb250cm9sX21zZyh1c2J2aXNpb24tPmRldiwgdXNiX3NuZGN0cmxwaXBlKHVzYnZpc2lvbi0+ZGV2LCAxKSwKKwkJCSAgICAgVVNCVklTSU9OX09QX0NPREUsCS8qIFVTQlZJU0lPTiBzcGVjaWZpYyBjb2RlICovCisJCQkgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0VORFBPSU5ULCAwLAorCQkJICAgICAoX191MTYpIFVTQlZJU0lPTl9MWFNJWkVfSSwgdmFsdWUsIDgsIEhaKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNFUlJPUj0lZC4gVVNCVklTSU9OIHN0b3BwZWQgLSAiCisJCSAgICAgICAicmVjb25uZWN0IG9yIHJlbG9hZCBkcml2ZXIuXG4iLCBwcm9jLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKworCWR2aV95dXZfdmFsdWUgPSAweDAwOwkvKiBVIGNvbWVzIGFmdGVyIFYsIFlhIGNvbWVzIGFmdGVyIFUvViwgWWIgY29tZXMgYWZ0ZXIgWWIgKi8KKworCWlmKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5EdmlfeXV2ID49IDApeworCQlkdmlfeXV2X3ZhbHVlID0gdXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLkR2aV95dXYgJiAweGZmOworCX0KKwllbHNlIGlmKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5Db2RlYyA9PSBDT0RFQ19TQUE3MTEzKSB7CisJLyogVGhpcyBjaGFuZ2VzIGFzIHRoZSBmaW5lIHN5bmMgY29udHJvbCBjaGFuZ2VzLiBGdXJ0aGVyIGludmVzdGlnYXRpb24gbmVjZXNzYXJ5ICovCisJCWR2aV95dXZfdmFsdWUgPSAweDA2OworCX0KKworCXJldHVybiAodXNidmlzaW9uX3dyaXRlX3JlZyh1c2J2aXNpb24sIFVTQlZJU0lPTl9EVklfWVVWLCBkdmlfeXV2X3ZhbHVlKSk7Cit9CisKKworLyoKKyAqIHVzYnZpc2lvbl9zZXRfZHJhbV9zZXR0aW5ncygpCisgKgorICogU2V0IHRoZSBidWZmZXIgYWRkcmVzcyBuZWVkZWQgYnkgdGhlIHVzYnZpc2lvbiBkcmFtIHRvIG9wZXJhdGUKKyAqIFRoaXMgdmFsdWVzIGhhcyBiZWVuIHRha2VuIHdpdGggdXNic25vb3AuCisgKgorICovCisKK3N0YXRpYyBpbnQgdXNidmlzaW9uX3NldF9kcmFtX3NldHRpbmdzKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJaW50IHJjOworCXVuc2lnbmVkIGNoYXIgdmFsdWVbOF07CisKKwlpZiAodXNidmlzaW9uLT5pc29jTW9kZSA9PSBJU09DX01PREVfQ09NUFJFU1MpIHsKKwkJdmFsdWVbMF0gPSAweDQyOworCQl2YWx1ZVsxXSA9IDB4NzE7CisJCXZhbHVlWzJdID0gMHhmZjsKKwkJdmFsdWVbM10gPSAweDAwOworCQl2YWx1ZVs0XSA9IDB4OTg7CisJCXZhbHVlWzVdID0gMHhlMDsKKwkJdmFsdWVbNl0gPSAweDcxOworCQl2YWx1ZVs3XSA9IDB4ZmY7CisJCS8vIFVSOiAgMHgwRTIwMC0weDNGRkZGID0gMjA0Mjg4IFdvcmRzICgxIFdvcmQgPSAyIEJ5dGUpCisJCS8vIEZETDogMHgwMDAwMC0weDBFMDk5ID0gIDU3NDk4IFdvcmRzCisJCS8vIFZEVzogMHgwRTNGRi0weDNGRkZGCisJfQorCWVsc2UgeworCQl2YWx1ZVswXSA9IDB4NDI7CisJCXZhbHVlWzFdID0gMHgwMDsKKwkJdmFsdWVbMl0gPSAweGZmOworCQl2YWx1ZVszXSA9IDB4MDA7CisJCXZhbHVlWzRdID0gMHgwMDsKKwkJdmFsdWVbNV0gPSAweDAwOworCQl2YWx1ZVs2XSA9IDB4MDA7CisJCXZhbHVlWzddID0gMHhmZjsKKwl9CisJLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIHZpZGVvIGJ1ZmZlciwKKwkgKiB0aGV5IGhhdmUgdG8gYmUgbG9hZGVkIGludG8gdGhlIFVTQlZJU0lPTl9EUk1fUFJNMS04CisJICoKKwkgKiBTdGFydCBhZGRyZXNzIG9mIHZpZGVvIG91dHB1dCBidWZmZXIgZm9yIHJlYWQ6IAlkcm1fcHJtMS0yIC0+IDB4MDAwMDAKKwkgKiBFbmQgYWRkcmVzcyBvZiB2aWRlbyBvdXRwdXQgYnVmZmVyIGZvciByZWFkOiAJZHJtX3BybTEtMyAtPiAweDFmZmZmCisJICogU3RhcnQgYWRkcmVzcyBvZiB2aWRlbyBmcmFtZSBkZWxheSBidWZmZXI6IAkJZHJtX3BybTEtNCAtPiAweDIwMDAwCisJICogICAgT25seSB1c2VkIGluIGNvbXByZXNzZWQgbW9kZQorCSAqIEVuZCBhZGRyZXNzIG9mIHZpZGVvIGZyYW1lIGRlbGF5IGJ1ZmZlcjogCQlkcm1fcHJtMS01LTYgLT4gMHgzZmZmZgorCSAqICAgIE9ubHkgdXNlZCBpbiBjb21wcmVzc2VkIG1vZGUKKwkgKiBTdGFydCBhZGRyZXNzIG9mIHZpZGVvIG91dHB1dCBidWZmZXIgZm9yIHdyaXRlOiAJZHJtX3BybTEtNyAtPiAweDAwMDAwCisJICogRW5kIGFkZHJlc3Mgb2YgdmlkZW8gb3V0cHV0IGJ1ZmZlciBmb3Igd3JpdGU6IAlkcm1fcHJtMS04IC0+IDB4MWZmZmYKKwkgKi8KKworCWlmICghVVNCVklTSU9OX0lTX09QRVJBVElPTkFMKHVzYnZpc2lvbikpCisJCXJldHVybiAwOworCisJcmMgPSB1c2JfY29udHJvbF9tc2codXNidmlzaW9uLT5kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2J2aXNpb24tPmRldiwgMSksCisJCQkgICAgIFVTQlZJU0lPTl9PUF9DT0RFLAkvKiBVU0JWSVNJT04gc3BlY2lmaWMgY29kZSAqLworCQkJICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkgICAgIFVTQl9SRUNJUF9FTkRQT0lOVCwgMCwKKwkJCSAgICAgKF9fdTE2KSBVU0JWSVNJT05fRFJNX1BSTTEsIHZhbHVlLCA4LCBIWik7CisKKwlpZiAocmMgPCAwKSB7CisJCWVycigiJXNFUlJPUj0lZCIsIF9fRlVOQ1RJT05fXywgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogUmVzdGFydCB0aGUgdmlkZW8gYnVmZmVyIGxvZ2ljICovCisJaWYgKChyYyA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fRFJNX0NPTlQsIFVTQlZJU0lPTl9SRVNfVVIgfAorCQkJCSAgIFVTQlZJU0lPTl9SRVNfRkRMIHwgVVNCVklTSU9OX1JFU19WRFcpKSA8IDApCisJCXJldHVybiByYzsKKwlyYyA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fRFJNX0NPTlQsIDB4MDApOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogKCkKKyAqCisgKiBQb3dlciBvbiB0aGUgZGV2aWNlLCBlbmFibGVzIHN1c3BlbmQtcmVzdW1lIGxvZ2ljCisgKiAmICByZXNldCB0aGUgaXNvYyBFbmQtUG9pbnQKKyAqCisgKi8KKworaW50IHVzYnZpc2lvbl9wb3dlcl9vbihzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCWludCBlcnJDb2RlID0gMDsKKworCVBERUJVRyhEQkdfRlVOQywgIiIpOworCisJdXNidmlzaW9uX3dyaXRlX3JlZyh1c2J2aXNpb24sIFVTQlZJU0lPTl9QV1JfUkVHLCBVU0JWSVNJT05fU1NQTkRfRU4pOworCXVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fUFdSX1JFRywKKwkJCSBVU0JWSVNJT05fU1NQTkRfRU4gfCBVU0JWSVNJT05fUkVTMik7CisJdXNidmlzaW9uX3dyaXRlX3JlZyh1c2J2aXNpb24sIFVTQlZJU0lPTl9QV1JfUkVHLAorCQkJIFVTQlZJU0lPTl9TU1BORF9FTiB8IFVTQlZJU0lPTl9QV1JfVklEKTsKKwllcnJDb2RlID0gdXNidmlzaW9uX3dyaXRlX3JlZyh1c2J2aXNpb24sIFVTQlZJU0lPTl9QV1JfUkVHLAorCQkJCQkJVVNCVklTSU9OX1NTUE5EX0VOIHwgVVNCVklTSU9OX1BXUl9WSUQgfCBVU0JWSVNJT05fUkVTMik7CisJaWYgKGVyckNvZGUgPT0gMSkgeworCQl1c2J2aXNpb24tPnBvd2VyID0gMTsKKwl9CisJUERFQlVHKERCR19GVU5DLCAiJXM6IGVyckNvZGUgJWQiLCAoZXJyQ29kZTwwKT8iRVJST1IiOiJwb3dlciBpcyBvbiIsIGVyckNvZGUpOworCXJldHVybiBlcnJDb2RlOworfQorCisKKy8qCisgKiB1c2J2aXNpb24gdGltZXIgc3R1ZmYKKyAqLworCisvLyB0byBjYWxsIHVzYnZpc2lvbl9wb3dlcl9vZmYgZnJvbSB0YXNrIHF1ZXVlCitzdGF0aWMgdm9pZCBjYWxsX3VzYnZpc2lvbl9wb3dlcl9vZmYoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYl91c2J2aXNpb24sIHBvd2VyT2ZmV29yayk7CisKKwlQREVCVUcoREJHX0ZVTkMsICIiKTsKKwlkb3duX2ludGVycnVwdGlibGUoJnVzYnZpc2lvbi0+bG9jayk7CisJaWYodXNidmlzaW9uLT51c2VyID09IDApIHsKKwkJdXNidmlzaW9uX2kyY191c2JfZGVsX2J1cygmdXNidmlzaW9uLT5pMmNfYWRhcCk7CisKKwkJdXNidmlzaW9uX3Bvd2VyX29mZih1c2J2aXNpb24pOworCQl1c2J2aXNpb24tPmluaXRpYWxpemVkID0gMDsKKwl9CisJdXAoJnVzYnZpc2lvbi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYnZpc2lvbl9wb3dlck9mZlRpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gKHZvaWQgKikgZGF0YTsKKworCVBERUJVRyhEQkdfRlVOQywgIiIpOworCWRlbF90aW1lcigmdXNidmlzaW9uLT5wb3dlck9mZlRpbWVyKTsKKwlJTklUX1dPUksoJnVzYnZpc2lvbi0+cG93ZXJPZmZXb3JrLCBjYWxsX3VzYnZpc2lvbl9wb3dlcl9vZmYpOworCSh2b2lkKSBzY2hlZHVsZV93b3JrKCZ1c2J2aXNpb24tPnBvd2VyT2ZmV29yayk7CisKK30KKwordm9pZCB1c2J2aXNpb25faW5pdF9wb3dlck9mZlRpbWVyKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJaW5pdF90aW1lcigmdXNidmlzaW9uLT5wb3dlck9mZlRpbWVyKTsKKwl1c2J2aXNpb24tPnBvd2VyT2ZmVGltZXIuZGF0YSA9IChsb25nKSB1c2J2aXNpb247CisJdXNidmlzaW9uLT5wb3dlck9mZlRpbWVyLmZ1bmN0aW9uID0gdXNidmlzaW9uX3Bvd2VyT2ZmVGltZXI7Cit9CisKK3ZvaWQgdXNidmlzaW9uX3NldF9wb3dlck9mZlRpbWVyKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJbW9kX3RpbWVyKCZ1c2J2aXNpb24tPnBvd2VyT2ZmVGltZXIsIGppZmZpZXMgKyBVU0JWSVNJT05fUE9XRVJPRkZfVElNRSk7Cit9CisKK3ZvaWQgdXNidmlzaW9uX3Jlc2V0X3Bvd2VyT2ZmVGltZXIoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlpZiAodGltZXJfcGVuZGluZygmdXNidmlzaW9uLT5wb3dlck9mZlRpbWVyKSkgeworCQlkZWxfdGltZXIoJnVzYnZpc2lvbi0+cG93ZXJPZmZUaW1lcik7CisJfQorfQorCisvKgorICogdXNidmlzaW9uX2JlZ2luX3N0cmVhbWluZygpCisgKiBTdXJlIHlvdSBoYXZlIHRvIHB1dCBiaXQgNyB0byAwLCBpZiBub3QgaW5jb21pbmcgZnJhbWVzIGFyZSBkcm9wZWQsIGJ1dCBubworICogaWRlYSBhYm91dCB0aGUgcmVzdAorICovCitpbnQgdXNidmlzaW9uX2JlZ2luX3N0cmVhbWluZyhzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCWludCBlcnJDb2RlID0gMDsKKworCWlmICh1c2J2aXNpb24tPmlzb2NNb2RlID09IElTT0NfTU9ERV9DT01QUkVTUykgeworCQl1c2J2aXNpb25faW5pdF9jb21wcmVzc2lvbih1c2J2aXNpb24pOworCX0KKwllcnJDb2RlID0gdXNidmlzaW9uX3dyaXRlX3JlZyh1c2J2aXNpb24sIFVTQlZJU0lPTl9WSU5fUkVHMiwgVVNCVklTSU9OX05PSFZBTElEIHwKKwkJCQkJCQkJCQl1c2J2aXNpb24tPlZpbl9SZWcyX1ByZXNldCk7CisJcmV0dXJuIGVyckNvZGU7Cit9CisKKy8qCisgKiB1c2J2aXNpb25fcmVzdGFydF9pc29jKCkKKyAqIE5vdCBzdXJlIHlldCBpZiB0b3VjaGluZyBoZXJlIFBXUl9SRUcgbWFrZSBsb29zZSB0aGUgY29uZmlnCisgKi8KKworaW50IHVzYnZpc2lvbl9yZXN0YXJ0X2lzb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlpbnQgcmV0OworCisJaWYgKAorCSAgICAocmV0ID0KKwkgICAgIHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fUFdSX1JFRywKKwkJCSAgICAgIFVTQlZJU0lPTl9TU1BORF9FTiB8IFVTQlZJU0lPTl9QV1JfVklEKSkgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmICgKKwkgICAgKHJldCA9CisJICAgICB1c2J2aXNpb25fd3JpdGVfcmVnKHVzYnZpc2lvbiwgVVNCVklTSU9OX1BXUl9SRUcsCisJCQkgICAgICBVU0JWSVNJT05fU1NQTkRfRU4gfCBVU0JWSVNJT05fUFdSX1ZJRCB8CisJCQkgICAgICBVU0JWSVNJT05fUkVTMikpIDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoCisJICAgIChyZXQgPQorCSAgICAgdXNidmlzaW9uX3dyaXRlX3JlZyh1c2J2aXNpb24sIFVTQlZJU0lPTl9WSU5fUkVHMiwKKwkJCSAgICAgIFVTQlZJU0lPTl9LRUVQX0JMQU5LIHwgVVNCVklTSU9OX05PSFZBTElEIHwKKwkJCQkgIHVzYnZpc2lvbi0+VmluX1JlZzJfUHJlc2V0KSkgPCAwKSByZXR1cm4gcmV0OworCisJLyogVE9ETzogc2NoZWR1bGUgdGltZW91dCAqLworCXdoaWxlICgodXNidmlzaW9uX3JlYWRfcmVnKHVzYnZpc2lvbiwgVVNCVklTSU9OX1NUQVRVU19SRUcpICYmIDB4MDEpICE9IDEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2J2aXNpb25fYXVkaW9fb2ZmKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJaWYgKHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fSU9QSU5fUkVHLCBVU0JWSVNJT05fQVVESU9fTVVURSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNidmlzaW9uX2F1ZGlvX29mZjogY2FuJ3Qgd2lydGUgcmVnXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwl1c2J2aXNpb24tPkF1ZGlvTXV0ZSA9IDA7CisJdXNidmlzaW9uLT5BdWRpb0NoYW5uZWwgPSBVU0JWSVNJT05fQVVESU9fTVVURTsKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYnZpc2lvbl9zZXRfYXVkaW8oc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgaW50IEF1ZGlvQ2hhbm5lbCkKK3sKKwlpZiAoIXVzYnZpc2lvbi0+QXVkaW9NdXRlKSB7CisJCWlmICh1c2J2aXNpb25fd3JpdGVfcmVnKHVzYnZpc2lvbiwgVVNCVklTSU9OX0lPUElOX1JFRywgQXVkaW9DaGFubmVsKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidXNidmlzaW9uX3NldF9hdWRpbzogY2FuJ3Qgd3JpdGUgaW9waW4gcmVnaXN0ZXIgZm9yIGF1ZGlvIHN3aXRjaGluZ1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJdXNidmlzaW9uLT5BdWRpb0NoYW5uZWwgPSBBdWRpb0NoYW5uZWw7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2J2aXNpb25fc2V0dXAoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbixpbnQgZm9ybWF0KQoreworCXVzYnZpc2lvbl9zZXRfdmlkZW9fZm9ybWF0KHVzYnZpc2lvbiwgZm9ybWF0KTsKKwl1c2J2aXNpb25fc2V0X2RyYW1fc2V0dGluZ3ModXNidmlzaW9uKTsKKwl1c2J2aXNpb25fc2V0X2NvbXByZXNzX3BhcmFtcyh1c2J2aXNpb24pOworCXVzYnZpc2lvbl9zZXRfaW5wdXQodXNidmlzaW9uKTsKKwl1c2J2aXNpb25fc2V0X291dHB1dCh1c2J2aXNpb24sIE1BWF9VU0JfV0lEVEgsIE1BWF9VU0JfSEVJR0hUKTsKKwl1c2J2aXNpb25fcmVzdGFydF9pc29jKHVzYnZpc2lvbik7CisKKwkvKiBjb3NhcyBkZWwgUENNICovCisJcmV0dXJuIFVTQlZJU0lPTl9JU19PUEVSQVRJT05BTCh1c2J2aXNpb24pOworfQorCisKK2ludCB1c2J2aXNpb25fc2J1Zl9hbGxvYyhzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCWludCBpLCBlcnJDb2RlID0gMDsKKwljb25zdCBpbnQgc2Jfc2l6ZSA9IFVTQlZJU0lPTl9VUkJfRlJBTUVTICogVVNCVklTSU9OX01BWF9JU09DX1BBQ0tFVF9TSVpFOworCisJLyogQ2xlYW4gcG9pbnRlcnMgc28gd2Uga25vdyBpZiB3ZSBhbGxvY2F0ZWQgc29tZXRoaW5nICovCisJZm9yIChpID0gMDsgaSA8IFVTQlZJU0lPTl9OVU1TQlVGOyBpKyspCisJCXVzYnZpc2lvbi0+c2J1ZltpXS5kYXRhID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBVU0JWSVNJT05fTlVNU0JVRjsgaSsrKSB7CisJCXVzYnZpc2lvbi0+c2J1ZltpXS5kYXRhID0ga3phbGxvYyhzYl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVzYnZpc2lvbi0+c2J1ZltpXS5kYXRhID09IE5VTEwpIHsKKwkJCWVycigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc2J1ZiIsIF9fRlVOQ1RJT05fXywgc2Jfc2l6ZSk7CisJCQllcnJDb2RlID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBlcnJDb2RlOworfQorCisKK3ZvaWQgdXNidmlzaW9uX3NidWZfZnJlZShzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFVTQlZJU0lPTl9OVU1TQlVGOyBpKyspIHsKKwkJaWYgKHVzYnZpc2lvbi0+c2J1ZltpXS5kYXRhICE9IE5VTEwpIHsKKwkJCWtmcmVlKHVzYnZpc2lvbi0+c2J1ZltpXS5kYXRhKTsKKwkJCXVzYnZpc2lvbi0+c2J1ZltpXS5kYXRhID0gTlVMTDsKKwkJfQorCX0KK30KKworLyoKKyAqIHVzYnZpc2lvbl9pbml0X2lzb2MoKQorICoKKyAqLworaW50IHVzYnZpc2lvbl9pbml0X2lzb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gdXNidmlzaW9uLT5kZXY7CisJaW50IGJ1ZklkeCwgZXJyQ29kZSwgcmVnVmFsdWU7CisKKwlpZiAoIVVTQlZJU0lPTl9JU19PUEVSQVRJT05BTCh1c2J2aXNpb24pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVzYnZpc2lvbi0+Y3VyRnJhbWUgPSBOVUxMOworCXNjcmF0Y2hfcmVzZXQodXNidmlzaW9uKTsKKworCS8qIEFsdGVybmF0ZSBpbnRlcmZhY2UgMSBpcyBpcyB0aGUgYmlnZ2VzdCBmcmFtZSBzaXplICovCisJZXJyQ29kZSA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldiwgdXNidmlzaW9uLT5pZmFjZSwgdXNidmlzaW9uLT5pZmFjZUFsdEFjdGl2ZSk7CisJaWYgKGVyckNvZGUgPCAwKSB7CisJCXVzYnZpc2lvbi0+bGFzdF9lcnJvciA9IGVyckNvZGU7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmVnVmFsdWUgPSAoMTYgLSB1c2J2aXNpb25fcmVhZF9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fQUxURVJfUkVHKSkgJiAweDBGOworCXVzYnZpc2lvbi0+aXNvY1BhY2tldFNpemUgPSAocmVnVmFsdWUgPT0gMCkgPyAwIDogKHJlZ1ZhbHVlICogNjQpIC0gMTsKKwlQREVCVUcoREJHX0lTT0MsICJJU08gUGFja2V0IExlbmd0aDolZCIsIHVzYnZpc2lvbi0+aXNvY1BhY2tldFNpemUpOworCisJdXNidmlzaW9uLT51c2JfYmFuZHdpZHRoID0gcmVnVmFsdWUgPj4gMTsKKwlQREVCVUcoREJHX0lTT0MsICJVU0IgQmFuZHdpZHRoIFVzYWdlOiAlZE1iaXQvU2VjIiwgdXNidmlzaW9uLT51c2JfYmFuZHdpZHRoKTsKKworCisKKwkvKiBXZSBkb3VibGUgYnVmZmVyIHRoZSBJc28gbGlzdHMgKi8KKworCWZvciAoYnVmSWR4ID0gMDsgYnVmSWR4IDwgVVNCVklTSU9OX05VTVNCVUY7IGJ1ZklkeCsrKSB7CisJCWludCBqLCBrOworCQlzdHJ1Y3QgdXJiICp1cmI7CisKKwkJdXJiID0gdXNiX2FsbG9jX3VyYihVU0JWSVNJT05fVVJCX0ZSQU1FUywgR0ZQX0tFUk5FTCk7CisJCWlmICh1cmIgPT0gTlVMTCkgeworCQkJZXJyKCIlczogdXNiX2FsbG9jX3VyYigpIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2J2aXNpb24tPnNidWZbYnVmSWR4XS51cmIgPSB1cmI7CisJCXVyYi0+ZGV2ID0gZGV2OworCQl1cmItPmNvbnRleHQgPSB1c2J2aXNpb247CisJCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShkZXYsIHVzYnZpc2lvbi0+dmlkZW9fZW5kcCk7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHVzYnZpc2lvbi0+c2J1ZltidWZJZHhdLmRhdGE7CisJCXVyYi0+Y29tcGxldGUgPSB1c2J2aXNpb25faXNvY0lycTsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IFVTQlZJU0lPTl9VUkJfRlJBTUVTOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPQorCQkgICAgdXNidmlzaW9uLT5pc29jUGFja2V0U2l6ZSAqIFVTQlZJU0lPTl9VUkJfRlJBTUVTOworCQlmb3IgKGogPSBrID0gMDsgaiA8IFVTQlZJU0lPTl9VUkJfRlJBTUVTOyBqKyssCisJCSAgICAgayArPSB1c2J2aXNpb24tPmlzb2NQYWNrZXRTaXplKSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGs7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9IHVzYnZpc2lvbi0+aXNvY1BhY2tldFNpemU7CisJCX0KKwl9CisKKworCS8qIFN1Ym1pdCBhbGwgVVJCcyAqLworCWZvciAoYnVmSWR4ID0gMDsgYnVmSWR4IDwgVVNCVklTSU9OX05VTVNCVUY7IGJ1ZklkeCsrKSB7CisJCQllcnJDb2RlID0gdXNiX3N1Ym1pdF91cmIodXNidmlzaW9uLT5zYnVmW2J1ZklkeF0udXJiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVyckNvZGUpIHsKKwkJCWVycigiJXM6IHVzYl9zdWJtaXRfdXJiKCVkKSBmYWlsZWQ6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBidWZJZHgsIGVyckNvZGUpOworCQl9CisJfQorCisJdXNidmlzaW9uLT5zdHJlYW1pbmcgPSBTdHJlYW1fSWRsZTsKKwlQREVCVUcoREJHX0lTT0MsICIlczogc3RyZWFtaW5nPTEgdXNidmlzaW9uLT52aWRlb19lbmRwPSQlMDJ4IiwgX19GVU5DVElPTl9fLCB1c2J2aXNpb24tPnZpZGVvX2VuZHApOworCXJldHVybiAwOworfQorCisvKgorICogdXNidmlzaW9uX3N0b3BfaXNvYygpCisgKgorICogVGhpcyBwcm9jZWR1cmUgc3RvcHMgc3RyZWFtaW5nIGFuZCBkZWFsbG9jYXRlcyBVUkJzLiBUaGVuIGl0CisgKiBhY3RpdmF0ZXMgemVyby1iYW5kd2lkdGggYWx0LiBzZXR0aW5nIG9mIHRoZSB2aWRlbyBpbnRlcmZhY2UuCisgKgorICovCit2b2lkIHVzYnZpc2lvbl9zdG9wX2lzb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlpbnQgYnVmSWR4LCBlcnJDb2RlLCByZWdWYWx1ZTsKKworCWlmICgodXNidmlzaW9uLT5zdHJlYW1pbmcgPT0gU3RyZWFtX09mZikgfHwgKHVzYnZpc2lvbi0+ZGV2ID09IE5VTEwpKQorCQlyZXR1cm47CisKKwkvKiBVbnNjaGVkdWxlIGFsbCBvZiB0aGUgaXNvIHRkJ3MgKi8KKwlmb3IgKGJ1ZklkeCA9IDA7IGJ1ZklkeCA8IFVTQlZJU0lPTl9OVU1TQlVGOyBidWZJZHgrKykgeworCQl1c2Jfa2lsbF91cmIodXNidmlzaW9uLT5zYnVmW2J1ZklkeF0udXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHVzYnZpc2lvbi0+c2J1ZltidWZJZHhdLnVyYik7CisJCXVzYnZpc2lvbi0+c2J1ZltidWZJZHhdLnVyYiA9IE5VTEw7CisJfQorCisKKwlQREVCVUcoREJHX0lTT0MsICIlczogc3RyZWFtaW5nPVN0cmVhbV9PZmZcbiIsIF9fRlVOQ1RJT05fXyk7CisJdXNidmlzaW9uLT5zdHJlYW1pbmcgPSBTdHJlYW1fT2ZmOworCisJaWYgKCF1c2J2aXNpb24tPnJlbW92ZV9wZW5kaW5nKSB7CisKKwkJLyogU2V0IHBhY2tldCBzaXplIHRvIDAgKi8KKwkJZXJyQ29kZSA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYnZpc2lvbi0+ZGV2LCB1c2J2aXNpb24tPmlmYWNlLAorCQkJCSAgICAgIHVzYnZpc2lvbi0+aWZhY2VBbHRJbmFjdGl2ZSk7CisJCWlmIChlcnJDb2RlIDwgMCkgeworCQkJZXJyKCIlczogdXNiX3NldF9pbnRlcmZhY2UoKSBmYWlsZWQ6IGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBlcnJDb2RlKTsKKwkJCXVzYnZpc2lvbi0+bGFzdF9lcnJvciA9IGVyckNvZGU7CisJCX0KKwkJcmVnVmFsdWUgPSAoMTYgLSB1c2J2aXNpb25fcmVhZF9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fQUxURVJfUkVHKSkgJiAweDBGOworCQl1c2J2aXNpb24tPmlzb2NQYWNrZXRTaXplID0gKHJlZ1ZhbHVlID09IDApID8gMCA6IChyZWdWYWx1ZSAqIDY0KSAtIDE7CisJCVBERUJVRyhEQkdfSVNPQywgIklTTyBQYWNrZXQgTGVuZ3RoOiVkIiwgdXNidmlzaW9uLT5pc29jUGFja2V0U2l6ZSk7CisKKwkJdXNidmlzaW9uLT51c2JfYmFuZHdpZHRoID0gcmVnVmFsdWUgPj4gMTsKKwkJUERFQlVHKERCR19JU09DLCAiVVNCIEJhbmR3aWR0aCBVc2FnZTogJWRNYml0L1NlYyIsIHVzYnZpc2lvbi0+dXNiX2JhbmR3aWR0aCk7CisJfQorfQorCitpbnQgdXNidmlzaW9uX211eHNlbChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uLCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgbW9kZVs0XTsKKwlpbnQgYXVkaW9bXT0gezEsIDAsIDAsIDB9OworCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CisJLy9jaGFubmVsIDAgaXMgVFYgd2l0aCBhdWRpb2NoYW5uZWwgMSAodHVuZXIgbW9ubykKKwkvL2NoYW5uZWwgMSBpcyBDb21wb3NpdGUgd2l0aCBhdWRpbyBjaGFubmVsIDAgKGxpbmUgaW4pCisJLy9jaGFubmVsIDIgaXMgUy1WaWRlbyB3aXRoIGF1ZGlvIGNoYW5uZWwgMCAobGluZSBpbikKKwkvL2NoYW5uZWwgMyBpcyBhZGRpdGlvbmFsIHZpZGVvIGlucHV0cyB0byB0aGUgZGV2aWNlIHdpdGggYXVkaW8gY2hhbm5lbCAwIChsaW5lIGluKQorCisJUkVTVFJJQ1RfVE9fUkFOR0UoY2hhbm5lbCwgMCwgdXNidmlzaW9uLT52aWRlb19pbnB1dHMpOworCXVzYnZpc2lvbi0+Y3RsX2lucHV0ID0gY2hhbm5lbDsKKwkgIHJvdXRlLmlucHV0ID0gU0FBNzExNV9DT01QT1NJVEUxOworCSAgY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HLCZyb3V0ZSk7CisJICBjYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbiwgVklESU9DX1NfSU5QVVQsICZ1c2J2aXNpb24tPmN0bF9pbnB1dCk7CisKKwkvLyBzZXQgdGhlIG5ldyBjaGFubmVsCisJLy8gUmVndWxhciBVU0IgVFYgVHVuZXJzIC0+IGNoYW5uZWw6IDAgPSBUZWxldmlzaW9uLCAxID0gQ29tcG9zaXRlLCAyID0gUy1WaWRlbworCS8vIEZvdXIgdmlkZW8gaW5wdXQgZGV2aWNlcyAtPiBjaGFubmVsOiAwID0gQ2hhbiBXaGl0ZSwgMSA9IENoYW4gR3JlZW4sIDIgPSBDaGFuIFllbGxvdywgMyA9IENoYW4gUmVkCisKKwlzd2l0Y2ggKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5Db2RlYykgeworCQljYXNlIENPREVDX1NBQTcxMTM6CisJCQlpZiAoU3dpdGNoU1ZpZGVvSW5wdXQpIHsgLy8gVG8gaGFuZGxlIHByb2JsZW1zIHdpdGggUy1WaWRlbyBJbnB1dCBmb3Igc29tZSBkZXZpY2VzLiAgVXNlIFN3aXRjaFNWaWRlb0lucHV0IHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KKwkJCQltb2RlWzJdID0gMTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCW1vZGVbMl0gPSA3OworCQkJfQorCQkJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaWRlb0NoYW5uZWxzID09IDQpIHsKKwkJCQltb2RlWzBdID0gMDsgbW9kZVsxXSA9IDI7IG1vZGVbM10gPSAzOyAgLy8gU3BlY2lhbCBmb3IgZm91ciBpbnB1dCBkZXZpY2VzCisJCQl9CisJCQllbHNlIHsKKwkJCQltb2RlWzBdID0gMDsgbW9kZVsxXSA9IDI7IC8vbW9kZXMgZm9yIHJlZ3VsYXIgc2FhNzExMyBkZXZpY2VzCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT0RFQ19TQUE3MTExOgorCQkJbW9kZVswXSA9IDA7IG1vZGVbMV0gPSAxOyBtb2RlWzJdID0gNzsgLy9tb2RlcyBmb3Igc2FhNzExMQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltb2RlWzBdID0gMDsgbW9kZVsxXSA9IDE7IG1vZGVbMl0gPSA3OyAvL2RlZmF1bHQgbW9kZXMKKwl9CisJcm91dGUuaW5wdXQgPSBtb2RlW2NoYW5uZWxdOworCWNhbGxfaTJjX2NsaWVudHModXNidmlzaW9uLCBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORywmcm91dGUpOworCXVzYnZpc2lvbi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJdXNidmlzaW9uX3NldF9hdWRpbyh1c2J2aXNpb24sIGF1ZGlvW2NoYW5uZWxdKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24taTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24taTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzZmJhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1pMmMuYwpAQCAtMCwwICsxLDU3MSBAQAorLyoKKyAqIEkyQ19BTEdPX1VTQi5DCisgKiAgaTJjIGFsZ29yaXRobSBmb3IgVVNCLUkyQyBCcmlkZ2VzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgSm9lcmcgSGVja2VuYmFjaCA8am9lcmdAaGVja2VuYmFjaC1hdy5kZT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIER3YWluZSBHYXJkZW4gPGR3YWluZWdhcmRlbkByb2dlcnMuY29tPgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIHBhcnQgb2YgdXNidmlzaW9uIGRyaXZlciBwcm9qZWN0LgorICogVXBkYXRlcyB0byBkcml2ZXIgY29tcGxldGVkIGJ5IER3YWluZSBQLiBHYXJkZW4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlICJ1c2J2aXNpb24uaCIKKworI2RlZmluZSBEQkdfSTJDCQkxPDwwCisjZGVmaW5lIERCR19BTEdPCTE8PDEKKworc3RhdGljIGludCBpMmNfZGVidWcgPSAwOworCittb2R1bGVfcGFyYW0gKGkyY19kZWJ1ZywgaW50LCAwNjQ0KTsJCQkvLyBkZWJ1Z19pMmNfdXNiIG1vZGUgb2YgdGhlIGRldmljZSBkcml2ZXIKK01PRFVMRV9QQVJNX0RFU0MoaTJjX2RlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtpMmNdIik7CisKKyNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKwkJaWYgKGkyY19kZWJ1ZyAmIChsZXZlbCkpIGluZm8oIlslczolZF0gIiBmbXQsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncykKKworc3RhdGljIGludCB1c2J2aXNpb25faTJjX3dyaXRlKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGNoYXIgYWRkciwgY2hhciAqYnVmLAorCQkJICAgIHNob3J0IGxlbik7CitzdGF0aWMgaW50IHVzYnZpc2lvbl9pMmNfcmVhZCh2b2lkICpkYXRhLCB1bnNpZ25lZCBjaGFyIGFkZHIsIGNoYXIgKmJ1ZiwKKwkJCSAgIHNob3J0IGxlbik7CisKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV93cml0ZV9hZGRyZXNzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgYWRkciwgaW50IHJldHJpZXMpCit7CisJc3RydWN0IGkyY19hbGdvX3VzYl9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwl2b2lkICpkYXRhOworCWludCBpLCByZXQgPSAtMTsKKwljaGFyIGJ1Zls0XTsKKworCWRhdGEgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKKwlidWZbMF0gPSAweDAwOworCWZvciAoaSA9IDA7IGkgPD0gcmV0cmllczsgaSsrKSB7CisJCXJldCA9ICh1c2J2aXNpb25faTJjX3dyaXRlKGRhdGEsIGFkZHIsIGJ1ZiwgMSkpOworCQlpZiAocmV0ID09IDEpCisJCQlicmVhazsJLyogc3VjY2VzcyEgKi8KKwkJdWRlbGF5KDUgLyphZGFwLT51ZGVsYXkgKi8gKTsKKwkJaWYgKGkgPT0gcmV0cmllcykJLyogbm8gc3VjY2VzcyAqLworCQkJYnJlYWs7CisJCXVkZWxheShhZGFwLT51ZGVsYXkpOworCX0KKwlpZiAoaSkgeworCQlQREVCVUcoREJHX0FMR08sIk5lZWRlZCAlZCByZXRyaWVzIGZvciBhZGRyZXNzICUjMngiLCBpLCBhZGRyKTsKKwkJUERFQlVHKERCR19BTEdPLCJNYXliZSB0aGVyZSdzIG5vIGRldmljZSBhdCB0aGlzIGFkZHJlc3MiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHJ5X3JlYWRfYWRkcmVzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgYWRkciwgaW50IHJldHJpZXMpCit7CisJc3RydWN0IGkyY19hbGdvX3VzYl9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwl2b2lkICpkYXRhOworCWludCBpLCByZXQgPSAtMTsKKwljaGFyIGJ1Zls0XTsKKworCWRhdGEgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKKwlmb3IgKGkgPSAwOyBpIDw9IHJldHJpZXM7IGkrKykgeworCQlyZXQgPSAodXNidmlzaW9uX2kyY19yZWFkKGRhdGEsIGFkZHIsIGJ1ZiwgMSkpOworCQlpZiAocmV0ID09IDEpCisJCQlicmVhazsJLyogc3VjY2VzcyEgKi8KKwkJdWRlbGF5KDUgLyphZGFwLT51ZGVsYXkgKi8gKTsKKwkJaWYgKGkgPT0gcmV0cmllcykJLyogbm8gc3VjY2VzcyAqLworCQkJYnJlYWs7CisJCXVkZWxheShhZGFwLT51ZGVsYXkpOworCX0KKwlpZiAoaSkgeworCQlQREVCVUcoREJHX0FMR08sIk5lZWRlZCAlZCByZXRyaWVzIGZvciBhZGRyZXNzICUjMngiLCBpLCBhZGRyKTsKKwkJUERFQlVHKERCR19BTEdPLCJNYXliZSB0aGVyZSdzIG5vIGRldmljZSBhdCB0aGlzIGFkZHJlc3MiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdXNiX2ZpbmRfYWRkcmVzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAorCQkJCSAgIHN0cnVjdCBpMmNfbXNnICptc2csIGludCByZXRyaWVzLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgKmFkZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBmbGFncyA9IG1zZy0+ZmxhZ3M7CisKKwl1bnNpZ25lZCBjaGFyIGFkZHI7CisJaW50IHJldDsKKwlpZiAoKGZsYWdzICYgSTJDX01fVEVOKSkgeworCQkvKiBhIHRlbiBiaXQgYWRkcmVzcyAqLworCQlhZGRyID0gMHhmMCB8ICgobXNnLT5hZGRyID4+IDcpICYgMHgwMyk7CisJCS8qIHRyeSBleHRlbmRlZCBhZGRyZXNzIGNvZGUuLi4gKi8KKwkJcmV0ID0gdHJ5X3dyaXRlX2FkZHJlc3MoaTJjX2FkYXAsIGFkZHIsIHJldHJpZXMpOworCQlpZiAocmV0ICE9IDEpIHsKKwkJCWVycigiZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUsIHdoaWxlIHdyaXRpbmciKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJCWFkZFswXSA9IGFkZHI7CisJCWlmIChmbGFncyAmIEkyQ19NX1JEKSB7CisJCQkvKiBva2F5LCBub3cgc3dpdGNoIGludG8gcmVhZGluZyBtb2RlICovCisJCQlhZGRyIHw9IDB4MDE7CisJCQlyZXQgPSB0cnlfcmVhZF9hZGRyZXNzKGkyY19hZGFwLCBhZGRyLCByZXRyaWVzKTsKKwkJCWlmIChyZXQgIT0gMSkgeworCQkJCWVycigiZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUsIHdoaWxlIHJlYWRpbmciKTsKKwkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCX0KKwkJfQorCisJfSBlbHNlIHsJCS8qIG5vcm1hbCA3Yml0IGFkZHJlc3MgICovCisJCWFkZHIgPSAobXNnLT5hZGRyIDw8IDEpOworCQlpZiAoZmxhZ3MgJiBJMkNfTV9SRCkKKwkJCWFkZHIgfD0gMTsKKwkJaWYgKGZsYWdzICYgSTJDX01fUkVWX0RJUl9BRERSKQorCQkJYWRkciBePSAxOworCisJCWFkZFswXSA9IGFkZHI7CisJCWlmIChmbGFncyAmIEkyQ19NX1JEKQorCQkJcmV0ID0gdHJ5X3JlYWRfYWRkcmVzcyhpMmNfYWRhcCwgYWRkciwgcmV0cmllcyk7CisJCWVsc2UKKwkJCXJldCA9IHRyeV93cml0ZV9hZGRyZXNzKGkyY19hZGFwLCBhZGRyLCByZXRyaWVzKTsKKworCQlpZiAocmV0ICE9IDEpIHsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit1c2JfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCit7CisJc3RydWN0IGkyY19tc2cgKnBtc2c7CisJdm9pZCAqZGF0YTsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGNoYXIgYWRkcjsKKworCWRhdGEgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlwbXNnID0gJm1zZ3NbaV07CisJCXJldCA9IHVzYl9maW5kX2FkZHJlc3MoaTJjX2FkYXAsIHBtc2csIGkyY19hZGFwLT5yZXRyaWVzLCAmYWRkcik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJUERFQlVHKERCR19BTEdPLCJnb3QgTkFLIGZyb20gZGV2aWNlLCBtZXNzYWdlICMlZCIsIGkpOworCQkJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IC1FUkVNT1RFSU87CisJCX0KKworCQlpZiAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgeworCQkJLyogcmVhZCBieXRlcyBpbnRvIGJ1ZmZlciAqLworCQkJcmV0ID0gKHVzYnZpc2lvbl9pMmNfcmVhZChkYXRhLCBhZGRyLCBwbXNnLT5idWYsIHBtc2ctPmxlbikpOworCQkJaWYgKHJldCA8IHBtc2ctPmxlbikgeworCQkJCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiAtRVJFTU9URUlPOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogd3JpdGUgYnl0ZXMgZnJvbSBidWZmZXIgKi8KKwkJCXJldCA9ICh1c2J2aXNpb25faTJjX3dyaXRlKGRhdGEsIGFkZHIsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuKSk7CisJCQlpZiAocmV0IDwgcG1zZy0+bGVuKSB7CisJCQkJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IC1FUkVNT1RFSU87CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIGludCBhbGdvX2NvbnRyb2woc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiB1c2JfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX0VNVUwgfCBJMkNfRlVOQ18xMEJJVF9BRERSIHwgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkc7Cit9CisKKworLyogLS0tLS1leHBvcnRlZCBhbGdvcml0aG0gZGF0YTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaTJjX3VzYl9hbGdvID0geworCS5tYXN0ZXJfeGZlciAgID0gdXNiX3hmZXIsCisJLnNtYnVzX3hmZXIgICAgPSBOVUxMLAorCS5hbGdvX2NvbnRyb2wgID0gYWxnb19jb250cm9sLAorCS5mdW5jdGlvbmFsaXR5ID0gdXNiX2Z1bmMsCit9OworCisKKy8qCisgKiByZWdpc3RlcmluZyBmdW5jdGlvbnMgdG8gbG9hZCBhbGdvcml0aG1zIGF0IHJ1bnRpbWUKKyAqLworaW50IHVzYnZpc2lvbl9pMmNfdXNiX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCVBERUJVRyhEQkdfSTJDLCAiSTJDICAgZGVidWdnaW5nIGlzIGVuYWJsZWQgW2kyY10iKTsKKwlQREVCVUcoREJHX0FMR08sICJBTEdPICAgZGVidWdnaW5nIGlzIGVuYWJsZWQgW2kyY10iKTsKKworCS8qIHJlZ2lzdGVyIG5ldyBhZGFwdGVyIHRvIGkyYyBtb2R1bGUuLi4gKi8KKworCWFkYXAtPmFsZ28gPSAmaTJjX3VzYl9hbGdvOworCisJYWRhcC0+dGltZW91dCA9IDEwMDsJLyogZGVmYXVsdCB2YWx1ZXMsIHNob3VsZCAgICAgICAqLworCWFkYXAtPnJldHJpZXMgPSAzOwkvKiBiZSByZXBsYWNlZCBieSBkZWZpbmVzICAgICAgICovCisKKwlpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CisKKwlQREVCVUcoREJHX0FMR08sImkyYyBidXMgZm9yICVzIHJlZ2lzdGVyZWQiLCBhZGFwLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisKK2ludCB1c2J2aXNpb25faTJjX3VzYl9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKworCWkyY19kZWxfYWRhcHRlcihhZGFwKTsKKworCVBERUJVRyhEQkdfQUxHTywiaTJjIGJ1cyBmb3IgJXMgdW5yZWdpc3RlcmVkIiwgYWRhcC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdXNidmlzaW9uIHNwZWNpZmljIEkyQyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwX3RlbXBsYXRlOworc3RhdGljIHN0cnVjdCBpMmNfYWxnb191c2JfZGF0YSBpMmNfYWxnb190ZW1wbGF0ZTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBpMmNfY2xpZW50X3RlbXBsYXRlOworCitpbnQgdXNidmlzaW9uX2luaXRfaTJjKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pCit7CisJbWVtY3B5KCZ1c2J2aXNpb24tPmkyY19hZGFwLCAmaTJjX2FkYXBfdGVtcGxhdGUsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpKTsKKwltZW1jcHkoJnVzYnZpc2lvbi0+aTJjX2FsZ28sICZpMmNfYWxnb190ZW1wbGF0ZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpMmNfYWxnb191c2JfZGF0YSkpOworCW1lbWNweSgmdXNidmlzaW9uLT5pMmNfY2xpZW50LCAmaTJjX2NsaWVudF90ZW1wbGF0ZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisKKwlzcHJpbnRmKHVzYnZpc2lvbi0+aTJjX2FkYXAubmFtZSArIHN0cmxlbih1c2J2aXNpb24tPmkyY19hZGFwLm5hbWUpLAorCQkiICMlZCIsIHVzYnZpc2lvbi0+dmRldi0+bWlub3IgJiAweDFmKTsKKwlQREVCVUcoREJHX0kyQywiQWRhcHRlcm5hbWU6ICVzIiwgdXNidmlzaW9uLT5pMmNfYWRhcC5uYW1lKTsKKworCWkyY19zZXRfYWRhcGRhdGEoJnVzYnZpc2lvbi0+aTJjX2FkYXAsIHVzYnZpc2lvbik7CisJaTJjX3NldF9jbGllbnRkYXRhKCZ1c2J2aXNpb24tPmkyY19jbGllbnQsIHVzYnZpc2lvbik7CisJaTJjX3NldF9hbGdvX3VzYl9kYXRhKCZ1c2J2aXNpb24tPmkyY19hbGdvLCB1c2J2aXNpb24pOworCisJdXNidmlzaW9uLT5pMmNfYWRhcC5hbGdvX2RhdGEgPSAmdXNidmlzaW9uLT5pMmNfYWxnbzsKKwl1c2J2aXNpb24tPmkyY19jbGllbnQuYWRhcHRlciA9ICZ1c2J2aXNpb24tPmkyY19hZGFwOworCisJaWYgKHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fU0VSX01PREUsIFVTQlZJU0lPTl9JSUNfTFJOQUNLKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1c2J2aXNpb25faW5pdF9pMmM6IGNhbid0IHdyaXRlIHJlZ1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKwkvKiBSZXF1ZXN0IHRoZSBsb2FkIG9mIHRoZSBpMmMgbW9kdWxlcyB3ZSBuZWVkICovCisJc3dpdGNoICh1c2J2aXNpb25fZGV2aWNlX2RhdGFbdXNidmlzaW9uLT5EZXZNb2RlbF0uQ29kZWMpIHsKKwljYXNlIENPREVDX1NBQTcxMTM6CisJCXJlcXVlc3RfbW9kdWxlKCJzYWE3MTE1Iik7CisJCWJyZWFrOworCWNhc2UgQ09ERUNfU0FBNzExMToKKwkJcmVxdWVzdF9tb2R1bGUoInNhYTcxMTUiKTsKKwkJYnJlYWs7CisJfQorCWlmICh1c2J2aXNpb25fZGV2aWNlX2RhdGFbdXNidmlzaW9uLT5EZXZNb2RlbF0uVHVuZXIgPT0gMSkgeworCQlyZXF1ZXN0X21vZHVsZSgidHVuZXIiKTsKKwl9CisjZW5kaWYKKworCXJldHVybiB1c2J2aXNpb25faTJjX3VzYl9hZGRfYnVzKCZ1c2J2aXNpb24tPmkyY19hZGFwKTsKK30KKwordm9pZCBjYWxsX2kyY19jbGllbnRzKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgIHZvaWQgKmFyZykKK3sKKwlCVUdfT04oTlVMTCA9PSB1c2J2aXNpb24tPmkyY19hZGFwLmFsZ29fZGF0YSk7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmdXNidmlzaW9uLT5pMmNfYWRhcCwgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IGF0dGFjaF9pbmZvcm0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uOworCisJdXNidmlzaW9uID0gKHN0cnVjdCB1c2JfdXNidmlzaW9uICopaTJjX2dldF9hZGFwZGF0YShjbGllbnQtPmFkYXB0ZXIpOworCisJc3dpdGNoIChjbGllbnQtPmFkZHIgPDwgMSkgeworCQljYXNlIDB4NDM6CisJCWNhc2UgMHg0YjoKKwkJeworCQkJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKKworCQkJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfQU5BTE9HX1RWIHwgVF9SQURJTzsKKwkJCXR1bl9zZXR1cC50eXBlID0gVFVORVJfVERBOTg4NzsKKwkJCXR1bl9zZXR1cC5hZGRyID0gY2xpZW50LT5hZGRyOworCisJCQljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbiwgVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMHg0MjoKKwkJCVBERUJVRyhEQkdfSTJDLCJhdHRhY2hfaW5mb3JtOiBzYWE3MTE0IGRldGVjdGVkLiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHg0YToKKwkJCVBERUJVRyhEQkdfSTJDLCJhdHRhY2hfaW5mb3JtOiBzYWE3MTEzIGRldGVjdGVkLiIpOworCQkJYnJlYWs7CisJCWNhc2UgMHhhMDoKKwkJCVBERUJVRyhEQkdfSTJDLCJhdHRhY2hfaW5mb3JtOiBlZXByb20gZGV0ZWN0ZWQuIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJeworCQkJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CisKKwkJCQlQREVCVUcoREJHX0kyQywiYXR0YWNoIGluZm9ybTogZGV0ZWN0ZWQgSTJDIGFkZHJlc3MgJXgiLCBjbGllbnQtPmFkZHIgPDwgMSk7CisJCQkJdXNidmlzaW9uLT50dW5lcl9hZGRyID0gY2xpZW50LT5hZGRyOworCisJCQkJaWYgKCh1c2J2aXNpb24tPmhhdmVfdHVuZXIpICYmICh1c2J2aXNpb24tPnR1bmVyX3R5cGUgIT0gLTEpKSB7CisJCQkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UViB8IFRfUkFESU87CisJCQkJCXR1bl9zZXR1cC50eXBlID0gdXNidmlzaW9uLT50dW5lcl90eXBlOworCQkJCQl0dW5fc2V0dXAuYWRkciA9IHVzYnZpc2lvbi0+dHVuZXJfYWRkcjsKKwkJCQkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZXRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbjsKKworCXVzYnZpc2lvbiA9IChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKWkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKworCVBERUJVRyhEQkdfSTJDLCJ1c2J2aXNpb25bJWRdIGRldGFjaGVzICVzIiwgdXNidmlzaW9uLT5uciwgY2xpZW50LT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordXNidmlzaW9uX2kyY19yZWFkX21heDQoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgdW5zaWduZWQgY2hhciBhZGRyLAorCQkgICAgIGNoYXIgKmJ1Ziwgc2hvcnQgbGVuKQoreworCWludCByYywgcmV0cmllczsKKworCWZvciAocmV0cmllcyA9IDU7OykgeworCQlyYyA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fU0VSX0FEUlMsIGFkZHIpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCS8qIEluaXRpYXRlIGJ5dGUgcmVhZCBjeWNsZSAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogVVNCVklTSU9OX1NFUl9DT05UIDwtIGQwLWQyIG4uIG9mIGJ5dGVzIHRvIHIvdyAqLworCQkvKiAgICAgICAgICAgICAgICAgICAgZDMgMD1XciAxPVJkICAgICAgICAgICAgICovCisJCXJjID0gdXNidmlzaW9uX3dyaXRlX3JlZyh1c2J2aXNpb24sIFVTQlZJU0lPTl9TRVJfQ09OVCwKKwkJCQkgICAgICAobGVuICYgMHgwNykgfCAweDE4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQkvKiBUZXN0IGZvciBCdXN5IGFuZCBBQ0sgKi8KKwkJZG8geworCQkJLyogVVNCVklTSU9OX1NFUl9DT05UIC0+IGQ0ID09IDAgYnVzeSAqLworCQkJcmMgPSB1c2J2aXNpb25fcmVhZF9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fU0VSX0NPTlQpOworCQl9IHdoaWxlIChyYyA+IDAgJiYgKChyYyAmIDB4MTApICE9IDApKTsJLyogUmV0cnkgd2hpbGUgYnVzeSAqLworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCS8qIFVTQlZJU0lPTl9TRVJfQ09OVCAtPiBkNSA9PSAxIE5vdCBhY2sgKi8KKwkJaWYgKChyYyAmIDB4MjApID09IDApCS8qIEFjaz8gKi8KKwkJCWJyZWFrOworCisJCS8qIEkyQyBhYm9ydCAqLworCQlyYyA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fU0VSX0NPTlQsIDB4MDApOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCWlmICgtLXJldHJpZXMgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSA0OgorCQlidWZbM10gPSB1c2J2aXNpb25fcmVhZF9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fU0VSX0RBVDQpOworCWNhc2UgMzoKKwkJYnVmWzJdID0gdXNidmlzaW9uX3JlYWRfcmVnKHVzYnZpc2lvbiwgVVNCVklTSU9OX1NFUl9EQVQzKTsKKwljYXNlIDI6CisJCWJ1ZlsxXSA9IHVzYnZpc2lvbl9yZWFkX3JlZyh1c2J2aXNpb24sIFVTQlZJU0lPTl9TRVJfREFUMik7CisJY2FzZSAxOgorCQlidWZbMF0gPSB1c2J2aXNpb25fcmVhZF9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fU0VSX0RBVDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJ1c2J2aXNpb25faTJjX3JlYWRfbWF4NDogYnVmZmVyIGxlbmd0aCA+IDRcbiIpOworCX0KKworCWlmIChpMmNfZGVidWcgJiBEQkdfSTJDKSB7CisJCWludCBpZHg7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgeworCQkJUERFQlVHKERCR19JMkMsInJlYWQgJXggZnJvbSBhZGRyZXNzICV4IiwgKHVuc2lnbmVkIGNoYXIpYnVmW2lkeF0sIGFkZHIpOworCQl9CisJfQorCXJldHVybiBsZW47Cit9CisKKworc3RhdGljIGludCB1c2J2aXNpb25faTJjX3dyaXRlX21heDQoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwKKwkJCQkgdW5zaWduZWQgY2hhciBhZGRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJIHNob3J0IGxlbikKK3sKKwlpbnQgcmMsIHJldHJpZXM7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciB2YWx1ZVs2XTsKKwl1bnNpZ25lZCBjaGFyIHNlcl9jb250OworCisJc2VyX2NvbnQgPSAobGVuICYgMHgwNykgfCAweDEwOworCisJdmFsdWVbMF0gPSBhZGRyOworCXZhbHVlWzFdID0gc2VyX2NvbnQ7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQl2YWx1ZVtpICsgMl0gPSBidWZbaV07CisKKwlmb3IgKHJldHJpZXMgPSA1OzspIHsKKwkJcmMgPSB1c2JfY29udHJvbF9tc2codXNidmlzaW9uLT5kZXYsCisJCQkJICAgICB1c2Jfc25kY3RybHBpcGUodXNidmlzaW9uLT5kZXYsIDEpLAorCQkJCSAgICAgVVNCVklTSU9OX09QX0NPREUsCisJCQkJICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJICAgICBVU0JfUkVDSVBfRU5EUE9JTlQsIDAsCisJCQkJICAgICAoX191MTYpIFVTQlZJU0lPTl9TRVJfQURSUywgdmFsdWUsCisJCQkJICAgICBsZW4gKyAyLCBIWik7CisKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlyYyA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fU0VSX0NPTlQsCisJCQkJICAgICAgKGxlbiAmIDB4MDcpIHwgMHgxMCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJLyogVGVzdCBmb3IgQnVzeSBhbmQgQUNLICovCisJCWRvIHsKKwkJCXJjID0gdXNidmlzaW9uX3JlYWRfcmVnKHVzYnZpc2lvbiwgVVNCVklTSU9OX1NFUl9DT05UKTsKKwkJfSB3aGlsZSAocmMgPiAwICYmICgocmMgJiAweDEwKSAhPSAwKSk7CS8qIFJldHJ5IHdoaWxlIGJ1c3kgKi8KKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlpZiAoKHJjICYgMHgyMCkgPT0gMCkJLyogQWNrPyAqLworCQkJYnJlYWs7CisKKwkJLyogSTJDIGFib3J0ICovCisJCXVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCBVU0JWSVNJT05fU0VSX0NPTlQsIDB4MDApOworCisJCWlmICgtLXJldHJpZXMgPCAwKQorCQkJcmV0dXJuIC0xOworCisJfQorCisJaWYgKGkyY19kZWJ1ZyAmIERCR19JMkMpIHsKKwkJaW50IGlkeDsKKwkJZm9yIChpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CisJCQlQREVCVUcoREJHX0kyQywid3JvdGUgJXggYXQgYWRkcmVzcyAleCIsICh1bnNpZ25lZCBjaGFyKWJ1ZltpZHhdLCBhZGRyKTsKKwkJfQorCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHVzYnZpc2lvbl9pMmNfd3JpdGUodm9pZCAqZGF0YSwgdW5zaWduZWQgY2hhciBhZGRyLCBjaGFyICpidWYsCisJCQkgICAgc2hvcnQgbGVuKQoreworCWNoYXIgKmJ1ZlB0ciA9IGJ1ZjsKKwlpbnQgcmV0dmFsOworCWludCB3cmNvdW50ID0gMDsKKwlpbnQgY291bnQ7CisJaW50IG1heExlbiA9IDQ7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSBkYXRhOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJY291bnQgPSAobGVuID4gbWF4TGVuKSA/IG1heExlbiA6IGxlbjsKKwkJcmV0dmFsID0gdXNidmlzaW9uX2kyY193cml0ZV9tYXg0KHVzYnZpc2lvbiwgYWRkciwgYnVmUHRyLCBjb3VudCk7CisJCWlmIChyZXR2YWwgPiAwKSB7CisJCQlsZW4gLT0gY291bnQ7CisJCQlidWZQdHIgKz0gY291bnQ7CisJCQl3cmNvdW50ICs9IGNvdW50OworCQl9IGVsc2UKKwkJCXJldHVybiAocmV0dmFsIDwgMCkgPyByZXR2YWwgOiAtRUZBVUxUOworCX0KKwlyZXR1cm4gd3Jjb3VudDsKK30KKworc3RhdGljIGludCB1c2J2aXNpb25faTJjX3JlYWQodm9pZCAqZGF0YSwgdW5zaWduZWQgY2hhciBhZGRyLCBjaGFyICpidWYsCisJCQkgICBzaG9ydCBsZW4pCit7CisJY2hhciB0ZW1wWzRdOworCWludCByZXR2YWwsIGk7CisJaW50IHJkY291bnQgPSAwOworCWludCBjb3VudDsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIGRhdGE7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQljb3VudCA9IChsZW4gPiAzKSA/IDQgOiBsZW47CisJCXJldHZhbCA9IHVzYnZpc2lvbl9pMmNfcmVhZF9tYXg0KHVzYnZpc2lvbiwgYWRkciwgdGVtcCwgY291bnQpOworCQlpZiAocmV0dmFsID4gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJCWJ1ZltyZGNvdW50ICsgaV0gPSB0ZW1wW2ldOworCQkJbGVuIC09IGNvdW50OworCQkJcmRjb3VudCArPSBjb3VudDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gKHJldHZhbCA8IDApID8gcmV0dmFsIDogLUVGQVVMVDsKKwl9CisJcmV0dXJuIHJkY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fdXNiX2RhdGEgaTJjX2FsZ29fdGVtcGxhdGUgPSB7CisJLmRhdGEJCT0gTlVMTCwKKwkuaW5iCQk9IHVzYnZpc2lvbl9pMmNfcmVhZCwKKwkub3V0YgkJPSB1c2J2aXNpb25faTJjX3dyaXRlLAorCS51ZGVsYXkJCT0gMTAsCisJLm1kZWxheQkJPSAxMCwKKwkudGltZW91dAk9IDEwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXBfdGVtcGxhdGUgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgICAgICAgICAgICAgID0gInVzYnZpc2lvbiIsCisJLmlkICAgICAgICAgICAgICAgID0gSTJDX0hXX0JfQlQ4NDgsIC8qIEZJWE1FICovCisJLmFsZ28gICAgICAgICAgICAgID0gTlVMTCwKKwkuYWxnb19kYXRhICAgICAgICAgPSBOVUxMLAorCS5jbGllbnRfcmVnaXN0ZXIgICA9IGF0dGFjaF9pbmZvcm0sCisJLmNsaWVudF91bnJlZ2lzdGVyID0gZGV0YWNoX2luZm9ybSwKKyNpZmRlZiBJMkNfQURBUF9DTEFTU19UVl9BTkFMT0cKKwkuY2xhc3MgICAgICAgICAgICAgPSBJMkNfQURBUF9DTEFTU19UVl9BTkFMT0csCisjZWxzZQorCS5jbGFzcwkJICAgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgaTJjX2NsaWVudF90ZW1wbGF0ZSA9IHsKKwkubmFtZQkJPSAidXNidmlzaW9uIGludGVybmFsIiwKK307CisKK0VYUE9SVF9TWU1CT0wodXNidmlzaW9uX2kyY191c2JfYWRkX2J1cyk7CitFWFBPUlRfU1lNQk9MKHVzYnZpc2lvbl9pMmNfdXNiX2RlbF9idXMpOworCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0NDQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCkBAIC0wLDAgKzEsMjA1MSBAQAorLyoKKyAqIFVTQiBVU0JWSVNJT04gVmlkZW8gZGV2aWNlIGRyaXZlciAwLjkuOQorICoKKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgSm9lcmcgSGVja2VuYmFjaCA8am9lcmdAaGVja2VuYmFjaC1hdy5kZT4KKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHVzYnZpc2lvbiBkcml2ZXIgcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBMZXQncyBjYWxsIHRoZSB2ZXJzaW9uIDAuLi4uIHVudGlsIGNvbXByZXNzaW9uIGRlY29kaW5nIGlzIGNvbXBsZXRlbHkKKyAqIGltcGxlbWVudGVkLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gYnkgSm9zZSBJZ25hY2lvIEdpam9uIGFuZCBKb2VyZyBIZWNrZW5iYWNoLgorICogSXQgd2FzIGJhc2VkIG9uIFVTQiBDUGlBIGRyaXZlciB3cml0dGVuIGJ5IFBldGVyIFByZWdsZXIsCisgKiBTY290dCBKLiBCZXJ0aW4gYW5kIEpvaGFubmVzIEVyZGZlbHQKKyAqIElkZWFzIGFyZSB0YWtlbiBmcm9tIGJ0dHYgZHJpdmVyIGJ5IFJhbHBoIE1ldHpsZXIsIE1hcmN1cyBNZXR6bGVyICYKKyAqIEdlcmQgS25vcnIgYW5kIHpvcmFuIDM2MTIwLzM2MTI1IGRyaXZlciBieSBQYXVsaW5lIE1pZGRlbGluaworICogVXBkYXRlcyB0byBkcml2ZXIgY29tcGxldGVkIGJ5IER3YWluZSBQLiBHYXJkZW4KKyAqCisgKgorICogVE9ETzoKKyAqICAgICAtIHVzZSBzdWJtaXRfdXJiIGZvciBhbGwgc2V0dXAgcGFja2V0cworICogICAgIC0gRml4IG1lbW9yeSBzZXR0aW5ncyBmb3IgbnQxMDA0LiBJdCBpcyA0IHRpbWVzIGFzIGJpZyBhcyB0aGUKKyAqICAgICAgIG50MTAwMyBtZW1vcnkuCisgKiAgICAgLSBBZGQgYXVkaW8gb24gZW5kcG9pbnQgMyBmb3IgbnQxMDA0IGNoaXAuICBTZWVtcyBpbXBvc3NpYmxlLCBuZWVkcyBhIGNvZGVjIGludGVyZmFjZS4gIFdoaWNoIG9uZT8KKyAqICAgICAtIENsZWFuIHVwIHRoZSBkcml2ZXIuCisgKiAgICAgLSBvcHRpbWl6YXRpb24gZm9yIHBlcmZvcm1hbmNlLgorICogICAgIC0gQWRkIFZpZGVvdGV4dCBjYXBhYmlsaXR5IChWQkkpLiAgV29ya2luZyBvbiBpdC4uLi4uCisgKiAgICAgLSBDaGVjayBhdWRpbyBmb3Igb3RoZXIgZGV2aWNlcworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3NhYTcxMTUuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9jaGlwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInVzYnZpc2lvbi5oIgorCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkpvZXJnIEhlY2tlbmJhY2ggPGpvZXJnQGhlY2tlbmJhY2gtYXcuZGU+LCBEd2FpbmUgR2FyZGVuIDxEd2FpbmVHYXJkZW5Acm9nZXJzLmNvbT4iCisjZGVmaW5lIERSSVZFUl9OQU1FICJ1c2J2aXNpb24iCisjZGVmaW5lIERSSVZFUl9BTElBUyAiVVNCVmlzaW9uIgorI2RlZmluZSBEUklWRVJfREVTQyAiVVNCVmlzaW9uIFVTQiBWaWRlbyBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCIKKyNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKKyNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX01BSk9SIDAKKyNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX01JTk9SIDkKKyNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwgOQorI2RlZmluZSBVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX01BSk9SLFVTQlZJU0lPTl9EUklWRVJfVkVSU0lPTl9NSU5PUixVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKyNkZWZpbmUgVVNCVklTSU9OX1ZFUlNJT05fU1RSSU5HIF9fc3RyaW5naWZ5KFVTQlZJU0lPTl9EUklWRVJfVkVSU0lPTl9NQUpPUikgIi4iIF9fc3RyaW5naWZ5KFVTQlZJU0lPTl9EUklWRVJfVkVSU0lPTl9NSU5PUikgIi4iIF9fc3RyaW5naWZ5KFVTQlZJU0lPTl9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMKQorCisjZGVmaW5lCUVOQUJMRV9IRVhEVU1QCTAJLyogRW5hYmxlIGlmIHlvdSBuZWVkIGl0ICovCisKKworI2lmZGVmIFVTQlZJU0lPTl9ERUJVRworCSNkZWZpbmUgUERFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKwkJaWYgKHZpZGVvX2RlYnVnICYgKGxldmVsKSkgaW5mbygiWyVzOiVkXSAiIGZtdCwgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKQorI2Vsc2UKKwkjZGVmaW5lIFBERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgREJHX0lPQ1RMCTE8PDAKKyNkZWZpbmUgREJHX0lPCQkxPDwxCisjZGVmaW5lIERCR19QUk9CRQkxPDwyCisjZGVmaW5lIERCR19NTUFQCTE8PDMKKworLy9TdHJpbmcgb3BlcmF0aW9ucworI2RlZmluZSBybXNwYWNlKHN0cikJd2hpbGUoKnN0cj09JyAnKSBzdHIrKzsKKyNkZWZpbmUgZ290bzJuZXh0KHN0cikJd2hpbGUoKnN0ciE9JyAnKSBzdHIrKzsgd2hpbGUoKnN0cj09JyAnKSBzdHIrKzsKKworCitzdGF0aWMgaW50IHVzYnZpc2lvbl9uciA9IDA7CQkJLy8gc2VxdWVudGlhbCBudW1iZXIgb2YgdXNidmlzaW9uIGRldmljZQorCitzdGF0aWMgc3RydWN0IHVzYnZpc2lvbl92NGwyX2Zvcm1hdF9zdCB1c2J2aXNpb25fdjRsMl9mb3JtYXRbXSA9IHsKKwl7IDEsIDEsICA4LCBWNEwyX1BJWF9GTVRfR1JFWSAgICAsICJHUkVZIiB9LAorCXsgMSwgMiwgMTYsIFY0TDJfUElYX0ZNVF9SR0I1NjUgICwgIlJHQjU2NSIgfSwKKwl7IDEsIDMsIDI0LCBWNEwyX1BJWF9GTVRfUkdCMjQgICAsICJSR0IyNCIgfSwKKwl7IDEsIDQsIDMyLCBWNEwyX1BJWF9GTVRfUkdCMzIgICAsICJSR0IzMiIgfSwKKwl7IDEsIDIsIDE2LCBWNEwyX1BJWF9GTVRfUkdCNTU1ICAsICJSR0I1NTUiIH0sCisJeyAxLCAyLCAxNiwgVjRMMl9QSVhfRk1UX1lVWVYgICAgLCAiWVVWNDIyIiB9LAorCXsgMSwgMiwgMTIsIFY0TDJfUElYX0ZNVF9ZVlU0MjAgICwgIllVVjQyMFAiIH0sIC8vIDEuNSAhCisJeyAxLCAyLCAxNiwgVjRMMl9QSVhfRk1UX1lVVjQyMlAgLCAiWVVWNDIyUCIgfQorfTsKKworLyogc3VwcG9ydGVkIHR2IG5vcm1zICovCitzdGF0aWMgc3RydWN0IHVzYnZpc2lvbl90dm5vcm0gdHZub3Jtc1tdID0geworCXsKKwkJLm5hbWUgPSAiUEFMIiwKKwkJLmlkID0gVjRMMl9TVERfUEFMLAorCX0sIHsKKwkJLm5hbWUgPSAiTlRTQyIsCisJCS5pZCA9IFY0TDJfU1REX05UU0MsCisJfSwgeworCQkgLm5hbWUgPSAiU0VDQU0iLAorCQkgLmlkID0gVjRMMl9TVERfU0VDQU0sCisJfSwgeworCQkubmFtZSA9ICJQQUwtTSIsCisJCS5pZCA9IFY0TDJfU1REX1BBTF9NLAorCX0KK307CisKKyNkZWZpbmUgVFZOT1JNUyBBUlJBWV9TSVpFKHR2bm9ybXMpCisKKy8vIEZ1bmN0aW9uIHByb3RvdHlwZXMKK3N0YXRpYyB2b2lkIHVzYnZpc2lvbl9yZWxlYXNlKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOworCisvLyBEZWZhdWx0IGluaXRhbGl6YXRpb24gb2YgZGV2aWNlIGRyaXZlciBwYXJhbWV0ZXJzCitzdGF0aWMgaW50IGlzb2NNb2RlID0gSVNPQ19NT0RFX0NPTVBSRVNTOwkJLy8gU2V0IHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgSVNPQyBlbmRwb2ludAorc3RhdGljIGludCB2aWRlb19kZWJ1ZyA9IDA7CQkJCS8vIFNldCB0aGUgZGVmYXVsdCBEZWJ1ZyBNb2RlIG9mIHRoZSBkZXZpY2UgZHJpdmVyCitzdGF0aWMgaW50IFBvd2VyT25BdE9wZW4gPSAxOwkJCQkvLyBTZXQgdGhlIGRlZmF1bHQgZGV2aWNlIHRvIHBvd2VyIG9uIGF0IHN0YXJ0dXAKK3N0YXRpYyBpbnQgdmlkZW9fbnIgPSAtMTsJCQkJLy8gU2VxdWVudGlhbCBOdW1iZXIgb2YgVmlkZW8gRGV2aWNlCitzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CQkJCS8vIFNlcXVlbnRpYWwgTnVtYmVyIG9mIFJhZGlvIERldmljZQorc3RhdGljIGludCB2YmlfbnIgPSAtMTsJCQkJCS8vIFNlcXVlbnRpYWwgTnVtYmVyIG9mIFZCSSBEZXZpY2UKK3N0YXRpYyBjaGFyICpDdXN0b21EZXZpY2U9TlVMTDsJCQkJLy8gU2V0IGFzIG5vdGhpbmcuLi4uCisKKy8vIEdyYWIgcGFyYW1ldGVycyBmb3IgdGhlIGRldmljZSBkcml2ZXIKKworI2lmIGRlZmluZWQobW9kdWxlX3BhcmFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG93aW5nIHBhcmFtZXRlcnMgdW5kZXIgU1lTRlMKK21vZHVsZV9wYXJhbShpc29jTW9kZSwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbSh2aWRlb19kZWJ1ZywgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShQb3dlck9uQXRPcGVuLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHZiaV9uciwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShDdXN0b21EZXZpY2UsIGNoYXJwLCAwNDQ0KTsKKyNlbHNlCQkJCQkJCS8vIE9sZCBTdHlsZQorTU9EVUxFX1BBUkFNKGlzb2NNb2RlLCAiaSIpOworTU9EVUxFX1BBUk0odmlkZW9fZGVidWcsICJpIik7CQkJCS8vIEdyYWIgdGhlIERlYnVnIE1vZGUgb2YgdGhlIGRldmljZSBkcml2ZXIKK01PRFVMRV9QQVJNKGFkanVzdENvbXByZXNzaW9uLCAiaSIpOwkJCS8vIEdyYWIgdGhlIGNvbXByZXNzaW9uIHRvIGJlIGFkYXB0aXZlCitNT0RVTEVfUEFSTShQb3dlck9uQXRPcGVuLCAiaSIpOwkJCS8vIEdyYWIgdGhlIGRldmljZSB0byBwb3dlciBvbiBhdCBzdGFydHVwCitNT0RVTEVfUEFSTShTd2l0Y2hTVmlkZW9JbnB1dCwgImkiKTsJCQkvLyBUbyBoZWxwIHBlb3BsZSB3aXRoIEJsYWNrIGFuZCBXaGl0ZSBvdXRwdXQgd2l0aCB1c2luZyBzLXZpZGVvIGlucHV0LiAgU29tZSBjYWJsZXMgYW5kIGlucHV0IGRldmljZSBhcmUgd2lyZWQgZGlmZmVyZW50bHkuCitNT0RVTEVfUEFSTSh2aWRlb19uciwgImkiKTsJCQkJLy8gdmlkZW9fbnIgb3B0aW9uIGFsbG93cyB0byBzcGVjaWZ5IGEgY2VydGFpbiAvZGV2L3ZpZGVvWCBkZXZpY2UgKGxpa2UgL2Rldi92aWRlbzAgb3IgL2Rldi92aWRlbzEgLi4uKQorTU9EVUxFX1BBUk0ocmFkaW9fbnIsICJpIik7CQkJCS8vIHJhZGlvX25yIG9wdGlvbiBhbGxvd3MgdG8gc3BlY2lmeSBhIGNlcnRhaW4gL2Rldi9yYWRpb1ggZGV2aWNlIChsaWtlIC9kZXYvcmFkaW8wIG9yIC9kZXYvcmFkaW8xIC4uLikKK01PRFVMRV9QQVJNKHZiaV9uciwgImkiKTsJCQkJLy8gdmJpX25yIG9wdGlvbiBhbGxvd3MgdG8gc3BlY2lmeSBhIGNlcnRhaW4gL2Rldi92YmlYIGRldmljZSAobGlrZSAvZGV2L3ZiaTAgb3IgL2Rldi92YmkxIC4uLikKK01PRFVMRV9QQVJNKEN1c3RvbURldmljZSwgInMiKTsJCQkJLy8gLi4uLiBDdXN0b21EZXZpY2UKKyNlbmRpZgorCitNT0RVTEVfUEFSTV9ERVNDKGlzb2NNb2RlLCAiIFNldCB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yIElTT0MgZW5kcG9pbnQuICBEZWZhdWx0OiAweDYwIChDb21wcmVzc2lvbiBPbikiKTsKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fZGVidWcsICIgU2V0IHRoZSBkZWZhdWx0IERlYnVnIE1vZGUgb2YgdGhlIGRldmljZSBkcml2ZXIuICBEZWZhdWx0OiAwIChPZmYpIik7CitNT0RVTEVfUEFSTV9ERVNDKFBvd2VyT25BdE9wZW4sICIgU2V0IHRoZSBkZWZhdWx0IGRldmljZSB0byBwb3dlciBvbiB3aGVuIGRldmljZSBpcyBvcGVuZWQuICBEZWZhdWx0OiAxIChPbikiKTsKK01PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsICJTZXQgdmlkZW8gZGV2aWNlIG51bWJlciAoL2Rldi92aWRlb1gpLiAgRGVmYXVsdDogLTEgKGF1dG9kZXRlY3QpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJhZGlvX25yLCAiU2V0IHJhZGlvIGRldmljZSBudW1iZXIgKC9kZXYvcmFkaW9YKS4gIERlZmF1bHQ6IC0xIChhdXRvZGV0ZWN0KSIpOworTU9EVUxFX1BBUk1fREVTQyh2YmlfbnIsICJTZXQgdmJpIGRldmljZSBudW1iZXIgKC9kZXYvdmJpWCkuICBEZWZhdWx0OiAtMSAoYXV0b2RldGVjdCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoQ3VzdG9tRGV2aWNlLCAiIERlZmluZSB0aGUgZmluZSB0dW5pbmcgcGFyYW1ldGVycyBmb3IgdGhlIGRldmljZS4gIERlZmF1bHQ6IG51bGwiKTsKKworCisvLyBNaXNjIHN0dWZmCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKK01PRFVMRV9WRVJTSU9OKFVTQlZJU0lPTl9WRVJTSU9OX1NUUklORyk7CitNT0RVTEVfQUxJQVMoRFJJVkVSX0FMSUFTKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNZU0ZTIENvZGUgLSBDb3BpZWQgZnJvbSB0aGUgc3R2NjgwLmMgdXNiIG1vZHVsZS4JCQkJCSovCisvKiBEZXZpY2UgaW5mb3JtYXRpb24gaXMgbG9jYXRlZCBhdCAvc3lzL2NsYXNzL3ZpZGVvNGxpbnV4L3ZpZGVvMAkJCSovCisvKiBEZXZpY2UgcGFyYW1ldGVycyBpbmZvcm1hdGlvbiBpcyBsb2NhdGVkIGF0IC9zeXMvbW9kdWxlL3VzYnZpc2lvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERldmljZSBVU0IgSW5mb3JtYXRpb24gaXMgbG9jYXRlZCBhdCAvc3lzL2J1cy91c2IvZHJpdmVycy9VU0JWaXNpb24gVmlkZW8gR3JhYmJlciAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBZRVNfTk8oeCkgKCh4KSA/ICJZZXMiIDogIk5vIikKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqY2RfdG9fdXNidmlzaW9uKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2QpOworCXJldHVybiB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd192ZXJzaW9uKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIFVTQlZJU0lPTl9WRVJTSU9OX1NUUklORyk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodmVyc2lvbiwgU19JUlVHTywgc2hvd192ZXJzaW9uLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19tb2RlbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdG9fdmlkZW9fZGV2aWNlKGNsYXNzX2Rldik7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbdXNidmlzaW9uLT5EZXZNb2RlbF0uTW9kZWxTdHJpbmcpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG1vZGVsLCBTX0lSVUdPLCBzaG93X21vZGVsLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19odWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShjbGFzc19kZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisJY3RybC5pZCA9IFY0TDJfQ0lEX0hVRTsKKwljdHJsLnZhbHVlID0gMDsKKwljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbiwgVklESU9DX0dfQ1RSTCwgJmN0cmwpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjdHJsLnZhbHVlID4+IDgpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGh1ZSwgU19JUlVHTywgc2hvd19odWUsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2NvbnRyYXN0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworCWN0cmwuaWQgPSBWNEwyX0NJRF9DT05UUkFTVDsKKwljdHJsLnZhbHVlID0gMDsKKwljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbiwgVklESU9DX0dfQ1RSTCwgJmN0cmwpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjdHJsLnZhbHVlID4+IDgpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNvbnRyYXN0LCBTX0lSVUdPLCBzaG93X2NvbnRyYXN0LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19icmlnaHRuZXNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworCWN0cmwuaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTOworCWN0cmwudmFsdWUgPSAwOworCWNhbGxfaTJjX2NsaWVudHModXNidmlzaW9uLCBWSURJT0NfR19DVFJMLCAmY3RybCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGN0cmwudmFsdWUgPj4gOCk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYnJpZ2h0bmVzcywgU19JUlVHTywgc2hvd19icmlnaHRuZXNzLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19zYXR1cmF0aW9uKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworCWN0cmwuaWQgPSBWNEwyX0NJRF9TQVRVUkFUSU9OOworCWN0cmwudmFsdWUgPSAwOworCWNhbGxfaTJjX2NsaWVudHModXNidmlzaW9uLCBWSURJT0NfR19DVFJMLCAmY3RybCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGN0cmwudmFsdWUgPj4gOCk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc2F0dXJhdGlvbiwgU19JUlVHTywgc2hvd19zYXR1cmF0aW9uLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19zdHJlYW1pbmcoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShjbGFzc19kZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgWUVTX05PKHVzYnZpc2lvbi0+c3RyZWFtaW5nPT1TdHJlYW1fT24/MTowKSk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc3RyZWFtaW5nLCBTX0lSVUdPLCBzaG93X3N0cmVhbWluZywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY29tcHJlc3Npb24oc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShjbGFzc19kZXYpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgWUVTX05PKHVzYnZpc2lvbi0+aXNvY01vZGU9PUlTT0NfTU9ERV9DT01QUkVTUykpOworfQorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNvbXByZXNzaW9uLCBTX0lSVUdPLCBzaG93X2NvbXByZXNzaW9uLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19kZXZpY2VfYnJpZGdlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB0b192aWRlb19kZXZpY2UoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHVzYnZpc2lvbi0+YnJpZGdlVHlwZSk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYnJpZGdlLCBTX0lSVUdPLCBzaG93X2RldmljZV9icmlkZ2UsIE5VTEwpOworCitzdGF0aWMgdm9pZCB1c2J2aXNpb25fY3JlYXRlX3N5c2ZzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit7CisJaW50IHJlczsKKwlpZiAodmRldikgeworCQlyZXM9dmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92ZXJzaW9uKTsKKwkJcmVzPXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfbW9kZWwpOworCQlyZXM9dmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9odWUpOworCQlyZXM9dmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jb250cmFzdCk7CisJCXJlcz12aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOworCQlyZXM9dmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zYXR1cmF0aW9uKTsKKwkJcmVzPXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfc3RyZWFtaW5nKTsKKwkJcmVzPXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfY29tcHJlc3Npb24pOworCQlyZXM9dmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9icmlkZ2UpOworCX0KK30KKworc3RhdGljIHZvaWQgdXNidmlzaW9uX3JlbW92ZV9zeXNmcyhzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQoreworCWlmICh2ZGV2KSB7CisJCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmVyc2lvbik7CisJCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfbW9kZWwpOworCQl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2h1ZSk7CisJCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfY29udHJhc3QpOworCQl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWdodG5lc3MpOworCQl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3NhdHVyYXRpb24pOworCQl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX3N0cmVhbWluZyk7CisJCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfY29tcHJlc3Npb24pOworCQl2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUodmRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JyaWRnZSk7CisJfQorfQorCisKKy8qCisgKiB1c2J2aXNpb25fb3BlbigpCisgKgorICogVGhpcyBpcyBwYXJ0IG9mIFZpZGVvIDQgTGludXggQVBJLiBUaGUgZHJpdmVyIGNhbiBiZSBvcGVuZWQgYnkgb25lCisgKiBjbGllbnQgb25seSAoY2hlY2tzIGludGVybmFsIGNvdW50ZXIgJ3VzYnZpc2lvbi0+dXNlcicpLiBUaGUgcHJvY2VkdXJlCisgKiB0aGVuIGFsbG9jYXRlcyBidWZmZXJzIG5lZWRlZCBmb3IgdmlkZW8gcHJvY2Vzc2luZy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgdXNidmlzaW9uX3Y0bDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSAoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyQ29kZSA9IDA7CisKKwlQREVCVUcoREJHX0lPLCAib3BlbiIpOworCisKKwl1c2J2aXNpb25fcmVzZXRfcG93ZXJPZmZUaW1lcih1c2J2aXNpb24pOworCisJaWYgKHVzYnZpc2lvbi0+dXNlcikKKwkJZXJyQ29kZSA9IC1FQlVTWTsKKwllbHNlIHsKKwkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZnJhbWUgYnVmZmVycyAqLworCQllcnJDb2RlID0gdXNidmlzaW9uX2ZyYW1lc19hbGxvYyh1c2J2aXNpb24pOworCQlpZighZXJyQ29kZSkgeworCQkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2NyYXRjaCByaW5nIGJ1ZmZlciAqLworCQkJZXJyQ29kZSA9IHVzYnZpc2lvbl9zY3JhdGNoX2FsbG9jKHVzYnZpc2lvbik7CisJCQlpZighZXJyQ29kZSkgeworCQkJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFVTQiBTIGJ1ZmZlcnMgKi8KKwkJCQllcnJDb2RlID0gdXNidmlzaW9uX3NidWZfYWxsb2ModXNidmlzaW9uKTsKKwkJCQlpZiAoKCFlcnJDb2RlKSAmJiAodXNidmlzaW9uLT5pc29jTW9kZT09SVNPQ19NT0RFX0NPTVBSRVNTKSkgeworCQkJCQkvKiBBbGxvY2F0ZSBpbnRlcm1lZGlhdGUgZGVjb21wcmVzc2lvbiBidWZmZXJzIG9ubHkgaWYgbmVlZGVkICovCisJCQkJCWVyckNvZGUgPSB1c2J2aXNpb25fZGVjb21wcmVzc19hbGxvYyh1c2J2aXNpb24pOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZXJyQ29kZSkgeworCQkJLyogRGVhbGxvY2F0ZSBhbGwgYnVmZmVycyBpZiB0cm91YmxlICovCisJCQl1c2J2aXNpb25fZnJhbWVzX2ZyZWUodXNidmlzaW9uKTsKKwkJCXVzYnZpc2lvbl9zY3JhdGNoX2ZyZWUodXNidmlzaW9uKTsKKwkJCXVzYnZpc2lvbl9zYnVmX2ZyZWUodXNidmlzaW9uKTsKKwkJCXVzYnZpc2lvbl9kZWNvbXByZXNzX2ZyZWUodXNidmlzaW9uKTsKKwkJfQorCX0KKworCS8qIElmIHNvIGZhciBubyBlcnJvcnMgdGhlbiB3ZSBzaGFsbCBzdGFydCB0aGUgY2FtZXJhICovCisJaWYgKCFlcnJDb2RlKSB7CisJCWRvd24oJnVzYnZpc2lvbi0+bG9jayk7CisJCWlmICh1c2J2aXNpb24tPnBvd2VyID09IDApIHsKKwkJCXVzYnZpc2lvbl9wb3dlcl9vbih1c2J2aXNpb24pOworCQkJdXNidmlzaW9uX2luaXRfaTJjKHVzYnZpc2lvbik7CisJCX0KKworCQkvKiBTZW5kIGluaXQgc2VxdWVuY2Ugb25seSBvbmNlLCBpdCdzIGxhcmdlISAqLworCQlpZiAoIXVzYnZpc2lvbi0+aW5pdGlhbGl6ZWQpIHsKKwkJCWludCBzZXR1cF9vayA9IDA7CisJCQlzZXR1cF9vayA9IHVzYnZpc2lvbl9zZXR1cCh1c2J2aXNpb24saXNvY01vZGUpOworCQkJaWYgKHNldHVwX29rKQorCQkJCXVzYnZpc2lvbi0+aW5pdGlhbGl6ZWQgPSAxOworCQkJZWxzZQorCQkJCWVyckNvZGUgPSAtRUJVU1k7CisJCX0KKworCQlpZiAoIWVyckNvZGUpIHsKKwkJCXVzYnZpc2lvbl9iZWdpbl9zdHJlYW1pbmcodXNidmlzaW9uKTsKKwkJCWVyckNvZGUgPSB1c2J2aXNpb25faW5pdF9pc29jKHVzYnZpc2lvbik7CisJCQkvKiBkZXZpY2UgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGlzb2MgdHJhbnNmZXIgKi8KKwkJCXVzYnZpc2lvbl9tdXhzZWwodXNidmlzaW9uLDApOworCQkJdXNidmlzaW9uLT51c2VyKys7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoUG93ZXJPbkF0T3BlbikgeworCQkJCXVzYnZpc2lvbl9pMmNfdXNiX2RlbF9idXMoJnVzYnZpc2lvbi0+aTJjX2FkYXApOworCQkJCXVzYnZpc2lvbl9wb3dlcl9vZmYodXNidmlzaW9uKTsKKwkJCQl1c2J2aXNpb24tPmluaXRpYWxpemVkID0gMDsKKwkJCX0KKwkJfQorCQl1cCgmdXNidmlzaW9uLT5sb2NrKTsKKwl9CisKKwlpZiAoZXJyQ29kZSkgeworCX0KKworCS8qIHByZXBhcmUgcXVldWVzICovCisJdXNidmlzaW9uX2VtcHR5X2ZyYW1lcXVldWVzKHVzYnZpc2lvbik7CisKKwlQREVCVUcoREJHX0lPLCAic3VjY2VzcyIpOworCXJldHVybiBlcnJDb2RlOworfQorCisvKgorICogdXNidmlzaW9uX3Y0bDJfY2xvc2UoKQorICoKKyAqIFRoaXMgaXMgcGFydCBvZiBWaWRlbyA0IExpbnV4IEFQSS4gVGhlIHByb2NlZHVyZQorICogc3RvcHMgc3RyZWFtaW5nIGFuZCBkZWFsbG9jYXRlcyBhbGwgYnVmZmVycyB0aGF0IHdlcmUgZWFybGllcgorICogYWxsb2NhdGVkIGluIHVzYnZpc2lvbl92NGwyX29wZW4oKS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgdXNidmlzaW9uX3Y0bDJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisKKwlQREVCVUcoREJHX0lPLCAiY2xvc2UiKTsKKwlkb3duKCZ1c2J2aXNpb24tPmxvY2spOworCisJdXNidmlzaW9uX2F1ZGlvX29mZih1c2J2aXNpb24pOworCXVzYnZpc2lvbl9yZXN0YXJ0X2lzb2ModXNidmlzaW9uKTsKKwl1c2J2aXNpb25fc3RvcF9pc29jKHVzYnZpc2lvbik7CisKKwl1c2J2aXNpb25fZGVjb21wcmVzc19mcmVlKHVzYnZpc2lvbik7CisJdXNidmlzaW9uX3J2ZnJlZSh1c2J2aXNpb24tPmZidWYsIHVzYnZpc2lvbi0+ZmJ1Zl9zaXplKTsKKwl1c2J2aXNpb25fc2NyYXRjaF9mcmVlKHVzYnZpc2lvbik7CisJdXNidmlzaW9uX3NidWZfZnJlZSh1c2J2aXNpb24pOworCisJdXNidmlzaW9uLT51c2VyLS07CisKKwlpZiAoUG93ZXJPbkF0T3BlbikgeworCQkvKiBwb3dlciBvZmYgaW4gYSBsaXR0bGUgd2hpbGUgdG8gYXZvaWQgb2ZmL29uIGV2ZXJ5IGNsb3NlL29wZW4gc2hvcnQgc2VxdWVuY2VzICovCisJCXVzYnZpc2lvbl9zZXRfcG93ZXJPZmZUaW1lcih1c2J2aXNpb24pOworCQl1c2J2aXNpb24tPmluaXRpYWxpemVkID0gMDsKKwl9CisKKwl1cCgmdXNidmlzaW9uLT5sb2NrKTsKKworCWlmICh1c2J2aXNpb24tPnJlbW92ZV9wZW5kaW5nKSB7CisJCWluZm8oIiVzOiBGaW5hbCBkaXNjb25uZWN0IiwgX19GVU5DVElPTl9fKTsKKwkJdXNidmlzaW9uX3JlbGVhc2UodXNidmlzaW9uKTsKKwl9CisKKwlQREVCVUcoREJHX0lPLCAic3VjY2VzcyIpOworCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogdXNidmlzaW9uX2lvY3RsKCkKKyAqCisgKiBUaGlzIGlzIHBhcnQgb2YgVmlkZW8gNCBMaW51eCBBUEkuIFRoZSBwcm9jZWR1cmUgaGFuZGxlcyBpb2N0bCgpIGNhbGxzLgorICoKKyAqLworc3RhdGljIGludCB1c2J2aXNpb25fdjRsMl9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFVU0JWSVNJT05fSVNfT1BFUkFUSU9OQUwodXNidmlzaW9uKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCQkvKiBpb2N0bHMgdG8gYWxsb3cgZGlyZWN0IGFjY2VzIHRvIHRoZSBOVDEwMHggcmVnaXN0ZXJzICovCisJCWNhc2UgVklESU9DX0lOVF9HX1JFR0lTVEVSOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVnID0gYXJnOworCQkJaW50IGVyckNvZGU7CisKKwkJCWlmIChyZWctPmkyY19pZCAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogTlQxMDB4IGhhcyBhIDgtYml0IHJlZ2lzdGVyIHNwYWNlICovCisJCQllcnJDb2RlID0gdXNidmlzaW9uX3JlYWRfcmVnKHVzYnZpc2lvbiwgcmVnLT5yZWcmMHhmZik7CisJCQlpZiAoZXJyQ29kZSA8IDApIHsKKwkJCQllcnIoIiVzOiBWSURJT0NfSU5UX0dfUkVHSVNURVIgZmFpbGVkOiBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgZXJyQ29kZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZWctPnZhbD0odW5zaWduZWQgY2hhcillcnJDb2RlOworCQkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfSU5UX0dfUkVHSVNURVIgcmVnPTB4JTAyWCwgdmFsdWU9MHglMDJYIiwKKwkJCQkJCQkodW5zaWduZWQgaW50KXJlZy0+cmVnLCByZWctPnZhbCk7CisJCQkJZXJyQ29kZSA9IDA7IC8vIE5vIGVycm9yCisJCQl9CisJCQlyZXR1cm4gZXJyQ29kZTsKKwkJfQorCQljYXNlIFZJRElPQ19JTlRfU19SRUdJU1RFUjoKKwkJeworCQkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZyA9IGFyZzsKKwkJCWludCBlcnJDb2RlOworCisJCQlpZiAocmVnLT5pMmNfaWQgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJZXJyQ29kZSA9IHVzYnZpc2lvbl93cml0ZV9yZWcodXNidmlzaW9uLCByZWctPnJlZyYweGZmLCByZWctPnZhbCk7CisJCQlpZiAoZXJyQ29kZSA8IDApIHsKKwkJCQllcnIoIiVzOiBWSURJT0NfSU5UX1NfUkVHSVNURVIgZmFpbGVkOiBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgZXJyQ29kZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlQREVCVUcoREJHX0lPQ1RMLCAiVklESU9DX0lOVF9TX1JFR0lTVEVSIHJlZz0weCUwMlgsIHZhbHVlPTB4JTAyWCIsCisJCQkJCQkJKHVuc2lnbmVkIGludClyZWctPnJlZywgcmVnLT52YWwpOworCQkJCWVyckNvZGUgPSAwOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKyNlbmRpZgorCQljYXNlIFZJRElPQ19RVUVSWUNBUDoKKwkJeworCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdmM9YXJnOworCisJCQltZW1zZXQodmMsIDAsIHNpemVvZigqdmMpKTsKKwkJCXN0cmxjcHkodmMtPmRyaXZlciwgIlVTQlZpc2lvbiIsIHNpemVvZih2Yy0+ZHJpdmVyKSk7CisJCQlzdHJsY3B5KHZjLT5jYXJkLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbdXNidmlzaW9uLT5EZXZNb2RlbF0uTW9kZWxTdHJpbmcsCisJCQkJc2l6ZW9mKHZjLT5jYXJkKSk7CisJCQlzdHJsY3B5KHZjLT5idXNfaW5mbywgdXNidmlzaW9uLT5kZXYtPmRldi5idXNfaWQsCisJCQkJc2l6ZW9mKHZjLT5idXNfaW5mbykpOworCQkJdmMtPnZlcnNpb24gPSBVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT047CisJCQl2Yy0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQkJVjRMMl9DQVBfQVVESU8gfAorCQkJCVY0TDJfQ0FQX1JFQURXUklURSB8CisJCQkJVjRMMl9DQVBfU1RSRUFNSU5HIHwKKwkJCQkodXNidmlzaW9uLT5oYXZlX3R1bmVyID8gVjRMMl9DQVBfVFVORVIgOiAwKTsKKwkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfUVVFUllDQVAiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwkJeworCQkJc3RydWN0IHY0bDJfaW5wdXQgKnZpID0gYXJnOworCQkJaW50IGNoYW47CisKKwkJCWlmICgodmktPmluZGV4ID49IHVzYnZpc2lvbi0+dmlkZW9faW5wdXRzKSB8fCAodmktPmluZGV4IDwgMCkgKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHVzYnZpc2lvbi0+aGF2ZV90dW5lcikgeworCQkJCWNoYW4gPSB2aS0+aW5kZXg7CisJCQl9CisJCQllbHNlIHsKKwkJCQljaGFuID0gdmktPmluZGV4ICsgMTsgLy9za2lwIFRlbGV2aXNpb24gc3RyaW5nCisJCQl9CisJCQlzd2l0Y2goY2hhbikgeworCQkJCWNhc2UgMDoKKwkJCQkJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaWRlb0NoYW5uZWxzID09IDQpIHsKKwkJCQkJCXN0cmNweSh2aS0+bmFtZSwgIldoaXRlIFZpZGVvIElucHV0Iik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlzdHJjcHkodmktPm5hbWUsICJUZWxldmlzaW9uIik7CisJCQkJCQl2aS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKKwkJCQkJCXZpLT5hdWRpb3NldCA9IDE7CisJCQkJCQl2aS0+dHVuZXIgPSBjaGFuOworCQkJCQkJdmktPnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX05UU0MgfCBWNEwyX1NURF9TRUNBTTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXZpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkJCQkJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaWRlb0NoYW5uZWxzID09IDQpIHsKKwkJCQkJCXN0cmNweSh2aS0+bmFtZSwgIkdyZWVuIFZpZGVvIElucHV0Iik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlzdHJjcHkodmktPm5hbWUsICJDb21wb3NpdGUgVmlkZW8gSW5wdXQiKTsKKwkJCQkJfQorCQkJCQl2aS0+c3RkID0gVjRMMl9TVERfUEFMOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCXZpLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwkJCQkJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaWRlb0NoYW5uZWxzID09IDQpIHsKKwkJCQkJCXN0cmNweSh2aS0+bmFtZSwgIlllbGxvdyBWaWRlbyBJbnB1dCIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQlzdHJjcHkodmktPm5hbWUsICJTLVZpZGVvIElucHV0Iik7CisJCQkJCX0KKwkJCQkJdmktPnN0ZCA9IFY0TDJfU1REX1BBTDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCQl2aS0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJCQkJCXN0cmNweSh2aS0+bmFtZSwgIlJlZCBWaWRlbyBJbnB1dCIpOworCQkJCQl2aS0+c3RkID0gVjRMMl9TVERfUEFMOworCQkJCQlicmVhazsKKwkJCX0KKwkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfRU5VTUlOUFVUIG5hbWU9JXM6JWQgdHVuZXJzPSVkIHR5cGU9JWQgbm9ybT0leCIsCisJCQkgICAgICAgdmktPm5hbWUsIHZpLT5pbmRleCwgdmktPnR1bmVyLHZpLT50eXBlLChpbnQpdmktPnN0ZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19FTlVNU1REOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqZSA9IGFyZzsKKwkJCXVuc2lnbmVkIGludCBpOworCQkJaW50IHJldDsKKworCQkJaSA9IGUtPmluZGV4OworCQkJaWYgKGkgPj0gVFZOT1JNUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldCA9IHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdChlLCB0dm5vcm1zW2UtPmluZGV4XS5pZCwKKwkJCQkJCSAgICAgICB0dm5vcm1zW2UtPmluZGV4XS5uYW1lKTsKKwkJCWUtPmluZGV4ID0gaTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19HX0lOUFVUOgorCQl7CisJCQlpbnQgKmlucHV0ID0gYXJnOworCQkJKmlucHV0ID0gdXNidmlzaW9uLT5jdGxfaW5wdXQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19TX0lOUFVUOgorCQl7CisJCQlpbnQgKmlucHV0ID0gYXJnOworCQkJaWYgKCgqaW5wdXQgPj0gdXNidmlzaW9uLT52aWRlb19pbnB1dHMpIHx8ICgqaW5wdXQgPCAwKSApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl1c2J2aXNpb24tPmN0bF9pbnB1dCA9ICppbnB1dDsKKworCQkJZG93bigmdXNidmlzaW9uLT5sb2NrKTsKKwkJCXVzYnZpc2lvbl9tdXhzZWwodXNidmlzaW9uLCB1c2J2aXNpb24tPmN0bF9pbnB1dCk7CisJCQl1c2J2aXNpb25fc2V0X2lucHV0KHVzYnZpc2lvbik7CisJCQl1c2J2aXNpb25fc2V0X291dHB1dCh1c2J2aXNpb24sIHVzYnZpc2lvbi0+Y3Vyd2lkdGgsIHVzYnZpc2lvbi0+Y3VyaGVpZ2h0KTsKKwkJCXVwKCZ1c2J2aXNpb24tPmxvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfR19TVEQ6CisJCXsKKwkJCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKKworCQkJKmlkID0gdXNidmlzaW9uLT50dm5vcm0tPmlkOworCisJCQlQREVCVUcoREJHX0lPQ1RMLCAiVklESU9DX0dfU1REIHN0ZF9pZD0lcyIsIHVzYnZpc2lvbi0+dHZub3JtLT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX1NfU1REOgorCQl7CisJCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisJCQl1bnNpZ25lZCBpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IFRWTk9STVM7IGkrKykKKwkJCQlpZiAoKmlkID09IHR2bm9ybXNbaV0uaWQpCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gVFZOT1JNUykKKwkJCQlmb3IgKGkgPSAwOyBpIDwgVFZOT1JNUzsgaSsrKQorCQkJCQlpZiAoKmlkICYgdHZub3Jtc1tpXS5pZCkKKwkJCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gVFZOT1JNUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJZG93bigmdXNidmlzaW9uLT5sb2NrKTsKKwkJCXVzYnZpc2lvbi0+dHZub3JtID0gJnR2bm9ybXNbaV07CisKKwkJCWNhbGxfaTJjX2NsaWVudHModXNidmlzaW9uLCBWSURJT0NfU19TVEQsCisJCQkJCSAmdXNidmlzaW9uLT50dm5vcm0tPmlkKTsKKworCQkJdXAoJnVzYnZpc2lvbi0+bG9jayk7CisKKwkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfU19TVEQgc3RkX2lkPSVzIiwgdXNidmlzaW9uLT50dm5vcm0tPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfR19UVU5FUjoKKwkJeworCQkJc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gYXJnOworCisJCQlpZiAoIXVzYnZpc2lvbi0+aGF2ZV90dW5lciB8fCB2dC0+aW5kZXgpCS8vIE9ubHkgdHVuZXIgMAorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3RyY3B5KHZ0LT5uYW1lLCAiVGVsZXZpc2lvbiIpOworCQkJLyogTGV0IGNsaWVudHMgZmlsbCBpbiB0aGUgcmVtYWluZGVyIG9mIHRoaXMgc3RydWN0ICovCisJCQljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbixWSURJT0NfR19UVU5FUix2dCk7CisKKwkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfR19UVU5FUiBzaWduYWw9JXgsIGFmYz0leCIsdnQtPnNpZ25hbCx2dC0+YWZjKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX1NfVFVORVI6CisJCXsKKwkJCXN0cnVjdCB2NGwyX3R1bmVyICp2dCA9IGFyZzsKKworCQkJLy8gT25seSBubyBvciBvbmUgdHVuZXIgZm9yIG5vdworCQkJaWYgKCF1c2J2aXNpb24tPmhhdmVfdHVuZXIgfHwgdnQtPmluZGV4KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogbGV0IGNsaWVudHMgaGFuZGxlIHRoaXMgKi8KKwkJCWNhbGxfaTJjX2NsaWVudHModXNidmlzaW9uLFZJRElPQ19TX1RVTkVSLHZ0KTsKKworCQkJUERFQlVHKERCR19JT0NUTCwgIlZJRElPQ19TX1RVTkVSIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwkJeworCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmcmVxID0gYXJnOworCisJCQlmcmVxLT50dW5lciA9IDA7IC8vIE9ubHkgb25lIHR1bmVyCisJCQlmcmVxLT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7CisJCQlmcmVxLT5mcmVxdWVuY3kgPSB1c2J2aXNpb24tPmZyZXE7CisJCQlQREVCVUcoREJHX0lPQ1RMLCAiVklESU9DX0dfRlJFUVVFTkNZIGZyZXE9MHglWCIsICh1bnNpZ25lZClmcmVxLT5mcmVxdWVuY3kpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZnJlcSA9IGFyZzsKKworCQkJLy8gT25seSBubyBvciBvbmUgdHVuZXIgZm9yIG5vdworCQkJaWYgKCF1c2J2aXNpb24tPmhhdmVfdHVuZXIgfHwgZnJlcS0+dHVuZXIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXVzYnZpc2lvbi0+ZnJlcSA9IGZyZXEtPmZyZXF1ZW5jeTsKKwkJCWNhbGxfaTJjX2NsaWVudHModXNidmlzaW9uLCBjbWQsIGZyZXEpOworCQkJUERFQlVHKERCR19JT0NUTCwgIlZJRElPQ19TX0ZSRVFVRU5DWSBmcmVxPTB4JVgiLCAodW5zaWduZWQpZnJlcS0+ZnJlcXVlbmN5KTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX0dfQVVESU86CisJCXsKKwkJCXN0cnVjdCB2NGwyX2F1ZGlvICp2ID0gYXJnOworCQkJbWVtc2V0KHYsMCwgc2l6ZW9mKHYpKTsKKwkJCXN0cmNweSh2LT5uYW1lLCAiVFYiKTsKKwkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfR19BVURJTyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfU19BVURJTzoKKwkJeworCQkJc3RydWN0IHY0bDJfYXVkaW8gKnYgPSBhcmc7CisJCQlpZih2LT5pbmRleCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJUERFQlVHKERCR19JT0NUTCwgIlZJRElPQ19TX0FVRElPIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJCXsKKwkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybCA9IGFyZzsKKwkJCWludCBpZD1jdHJsLT5pZDsKKworCQkJbWVtc2V0KGN0cmwsMCxzaXplb2YoKmN0cmwpKTsKKwkJCWN0cmwtPmlkPWlkOworCisJCQljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbiwgY21kLCBhcmcpOworCisJCQlpZiAoY3RybC0+dHlwZSkKKwkJCQlyZXR1cm4gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJUERFQlVHKERCR19JT0NUTCwiVklESU9DX1FVRVJZQ1RSTCBpZD0leCB2YWx1ZT0leCIsY3RybC0+aWQsY3RybC0+dHlwZSk7CisJCX0KKwkJY2FzZSBWSURJT0NfR19DVFJMOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCQkJUERFQlVHKERCR19JT0NUTCwiVklESU9DX0dfQ1RSTCBpZD0leCB2YWx1ZT0leCIsY3RybC0+aWQsY3RybC0+dmFsdWUpOworCQkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIFZJRElPQ19HX0NUUkwsIGN0cmwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfU19DVFJMOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCisJCQlQREVCVUcoREJHX0lPQ1RMLCAiVklESU9DX1NfQ1RSTCBpZD0leCB2YWx1ZT0leCIsY3RybC0+aWQsY3RybC0+dmFsdWUpOworCQkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIFZJRElPQ19TX0NUUkwsIGN0cmwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfUkVRQlVGUzoKKwkJeworCQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnZyID0gYXJnOworCQkJaW50IHJldDsKKworCQkJUkVTVFJJQ1RfVE9fUkFOR0UodnItPmNvdW50LDEsVVNCVklTSU9OX05VTUZSQU1FUyk7CisKKwkJCS8vIENoZWNrIGlucHV0IHZhbGlkaXR5IDogdGhlIHVzZXIgbXVzdCBkbyBhIFZJREVPIENBUFRVUkUgYW5kIE1NQVAgbWV0aG9kLgorCQkJaWYoKHZyLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgfHwKKwkJCSAgICh2ci0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZih1c2J2aXNpb24tPnN0cmVhbWluZyA9PSBTdHJlYW1fT24pIHsKKwkJCQlpZiAoKHJldCA9IHVzYnZpc2lvbl9zdHJlYW1faW50ZXJydXB0KHVzYnZpc2lvbikpKQorCQkJCSAgICByZXR1cm4gcmV0OworCQkJfQorCisJCQl1c2J2aXNpb25fZW1wdHlfZnJhbWVxdWV1ZXModXNidmlzaW9uKTsKKworCQkJdXNidmlzaW9uLT5jdXJGcmFtZSA9IE5VTEw7CisKKwkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfUkVRQlVGUyBjb3VudD0lZCIsdnItPmNvdW50KTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX1FVRVJZQlVGOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnZiID0gYXJnOworCQkJc3RydWN0IHVzYnZpc2lvbl9mcmFtZSAqZnJhbWU7CisKKwkJCS8vIEZJWE1FIDogbXVzdCBjb250cm9sIHRoYXQgYnVmZmVycyBhcmUgbWFwcGVkIChWSURJT0NfUkVRQlVGUyBoYXMgYmVlbiBjYWxsZWQpCisKKwkJCWlmKHZiLT50eXBlICE9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmKHZiLT5pbmRleD49VVNCVklTSU9OX05VTUZSQU1FUykgIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8vIFVwZGF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGZyYW1lIHN0YXRlCisJCQl2Yi0+ZmxhZ3MgPSAwOworCQkJZnJhbWUgPSAmdXNidmlzaW9uLT5mcmFtZVt2Yi0+aW5kZXhdOworCQkJaWYoZnJhbWUtPmdyYWJzdGF0ZSA+PSBGcmFtZVN0YXRlX1JlYWR5KQorCQkJCXZiLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJCWlmKGZyYW1lLT5ncmFic3RhdGUgPj0gRnJhbWVTdGF0ZV9Eb25lKQorCQkJCXZiLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7CisJCQlpZihmcmFtZS0+Z3JhYnN0YXRlID09IEZyYW1lU3RhdGVfVW51c2VkKQorCQkJCXZiLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKKwkJCXZiLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCisJCQl2Yi0+bS5vZmZzZXQgPSB2Yi0+aW5kZXgqdXNidmlzaW9uLT5tYXhfZnJhbWVfc2l6ZTsKKworCQkJdmItPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJCQl2Yi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCQl2Yi0+bGVuZ3RoID0gdXNidmlzaW9uLT5jdXJ3aWR0aCp1c2J2aXNpb24tPmN1cmhlaWdodCp1c2J2aXNpb24tPnBhbGV0dGUuYnl0ZXNfcGVyX3BpeGVsOworCQkJdmItPnRpbWVzdGFtcCA9IHVzYnZpc2lvbi0+ZnJhbWVbdmItPmluZGV4XS50aW1lc3RhbXA7CisJCQl2Yi0+c2VxdWVuY2UgPSB1c2J2aXNpb24tPmZyYW1lW3ZiLT5pbmRleF0uc2VxdWVuY2U7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19RQlVGOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnZiID0gYXJnOworCQkJc3RydWN0IHVzYnZpc2lvbl9mcmFtZSAqZnJhbWU7CisJCQl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisKKwkJCS8vIEZJWE1FIDogd29ya3Mgb25seSBvbiBWSURFT19DQVBUVVJFIE1PREUsIE1NQVAuCisJCQlpZih2Yi0+dHlwZSAhPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZih2Yi0+aW5kZXg+PVVTQlZJU0lPTl9OVU1GUkFNRVMpICB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWZyYW1lID0gJnVzYnZpc2lvbi0+ZnJhbWVbdmItPmluZGV4XTsKKworCQkJaWYgKGZyYW1lLT5ncmFic3RhdGUgIT0gRnJhbWVTdGF0ZV9VbnVzZWQpIHsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKworCQkJLyogTWFyayBpdCBhcyByZWFkeSBhbmQgZW5xdWV1ZSBmcmFtZSAqLworCQkJZnJhbWUtPmdyYWJzdGF0ZSA9IEZyYW1lU3RhdGVfUmVhZHk7CisJCQlmcmFtZS0+c2NhbnN0YXRlID0gU2NhblN0YXRlX1NjYW5uaW5nOworCQkJZnJhbWUtPnNjYW5sZW5ndGggPSAwOwkvKiBBY2N1bXVsYXRlZCBpbiB1c2J2aXNpb25fcGFyc2VfZGF0YSgpICovCisKKwkJCXZiLT5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19ET05FOworCisJCQkvKiBzZXQgdjRsMl9mb3JtYXQgaW5kZXggKi8KKwkJCWZyYW1lLT52NGwyX2Zvcm1hdCA9IHVzYnZpc2lvbi0+cGFsZXR0ZTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYnZpc2lvbi0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisJCQlsaXN0X2FkZF90YWlsKCZ1c2J2aXNpb24tPmZyYW1lW3ZiLT5pbmRleF0uZnJhbWUsICZ1c2J2aXNpb24tPmlucXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNidmlzaW9uLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCQkJUERFQlVHKERCR19JT0NUTCwgIlZJRElPQ19RQlVGIGZyYW1lICMlZCIsdmItPmluZGV4KTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX0RRQlVGOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnZiID0gYXJnOworCQkJaW50IHJldDsKKwkJCXN0cnVjdCB1c2J2aXNpb25fZnJhbWUgKmY7CisJCQl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisKKwkJCWlmICh2Yi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmIChsaXN0X2VtcHR5KCYodXNidmlzaW9uLT5vdXRxdWV1ZSkpKSB7CisJCQkJaWYgKHVzYnZpc2lvbi0+c3RyZWFtaW5nID09IFN0cmVhbV9JZGxlKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUKKwkJCQkJKHVzYnZpc2lvbi0+d2FpdF9mcmFtZSwKKwkJCQkJICFsaXN0X2VtcHR5KCYodXNidmlzaW9uLT5vdXRxdWV1ZSkpKTsKKwkJCQlpZiAocmV0KQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXNidmlzaW9uLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJCWYgPSBsaXN0X2VudHJ5KHVzYnZpc2lvbi0+b3V0cXVldWUubmV4dCwKKwkJCQkgICAgICAgc3RydWN0IHVzYnZpc2lvbl9mcmFtZSwgZnJhbWUpOworCQkJbGlzdF9kZWwodXNidmlzaW9uLT5vdXRxdWV1ZS5uZXh0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYnZpc2lvbi0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisKKwkJCWYtPmdyYWJzdGF0ZSA9IEZyYW1lU3RhdGVfVW51c2VkOworCisJCQl2Yi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKwkJCXZiLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEIHwgVjRMMl9CVUZfRkxBR19RVUVVRUQgfCBWNEwyX0JVRl9GTEFHX0RPTkU7CisJCQl2Yi0+aW5kZXggPSBmLT5pbmRleDsKKwkJCXZiLT5zZXF1ZW5jZSA9IGYtPnNlcXVlbmNlOworCQkJdmItPnRpbWVzdGFtcCA9IGYtPnRpbWVzdGFtcDsKKwkJCXZiLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCXZiLT5ieXRlc3VzZWQgPSBmLT5zY2FubGVuZ3RoOworCisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19TVFJFQU1PTjoKKwkJeworCQkJaW50IGI9VjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJCQl1c2J2aXNpb24tPnN0cmVhbWluZyA9IFN0cmVhbV9PbjsKKworCQkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sVklESU9DX1NUUkVBTU9OICwgJmIpOworCisJCQlQREVCVUcoREJHX0lPQ1RMLCAiVklESU9DX1NUUkVBTU9OIik7CisKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX1NUUkVBTU9GRjoKKwkJeworCQkJaW50ICp0eXBlID0gYXJnOworCQkJaW50IGI9VjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJCQlpZiAoKnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZih1c2J2aXNpb24tPnN0cmVhbWluZyA9PSBTdHJlYW1fT24pIHsKKwkJCQl1c2J2aXNpb25fc3RyZWFtX2ludGVycnVwdCh1c2J2aXNpb24pOworCQkJCS8vIFN0b3AgYWxsIHZpZGVvIHN0cmVhbWluZ3MKKwkJCQljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbixWSURJT0NfU1RSRUFNT0ZGICwgJmIpOworCQkJfQorCQkJdXNidmlzaW9uX2VtcHR5X2ZyYW1lcXVldWVzKHVzYnZpc2lvbik7CisKKwkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfU1RSRUFNT0ZGIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19FTlVNX0ZNVDoKKwkJeworCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqdmZkID0gYXJnOworCisJCQlpZih2ZmQtPmluZGV4Pj1VU0JWSVNJT05fU1VQUE9SVEVEX1BBTEVUVEVTLTEpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXZmZC0+ZmxhZ3MgPSAwOworCQkJdmZkLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQkJc3RyY3B5KHZmZC0+ZGVzY3JpcHRpb24sdXNidmlzaW9uX3Y0bDJfZm9ybWF0W3ZmZC0+aW5kZXhdLmRlc2MpOworCQkJdmZkLT5waXhlbGZvcm1hdCA9IHVzYnZpc2lvbl92NGwyX2Zvcm1hdFt2ZmQtPmluZGV4XS5mb3JtYXQ7CisJCQltZW1zZXQodmZkLT5yZXNlcnZlZCwgMCwgc2l6ZW9mKHZmZC0+cmVzZXJ2ZWQpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX0dfRk1UOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKnZmID0gYXJnOworCisJCQlzd2l0Y2ggKHZmLT50eXBlKSB7CisJCQkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCQkJeworCQkJCQl2Zi0+Zm10LnBpeC53aWR0aCA9IHVzYnZpc2lvbi0+Y3Vyd2lkdGg7CisJCQkJCXZmLT5mbXQucGl4LmhlaWdodCA9IHVzYnZpc2lvbi0+Y3VyaGVpZ2h0OworCQkJCQl2Zi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IHVzYnZpc2lvbi0+cGFsZXR0ZS5mb3JtYXQ7CisJCQkJCXZmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9ICB1c2J2aXNpb24tPmN1cndpZHRoKnVzYnZpc2lvbi0+cGFsZXR0ZS5ieXRlc19wZXJfcGl4ZWw7CisJCQkJCXZmLT5mbXQucGl4LnNpemVpbWFnZSA9IHZmLT5mbXQucGl4LmJ5dGVzcGVybGluZSp1c2J2aXNpb24tPmN1cmhlaWdodDsKKwkJCQkJdmYtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisJCQkJCXZmLT5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOyAvKiBBbHdheXMgcHJvZ3Jlc3NpdmUgaW1hZ2UgKi8KKwkJCQkJUERFQlVHKERCR19JT0NUTCwgIlZJRElPQ19HX0ZNVCB3PSVkLCBoPSVkLCBmb3JtYXQ9JXMiLAorCQkJCQkgICAgICAgdmYtPmZtdC5waXgud2lkdGgsIHZmLT5mbXQucGl4LmhlaWdodCx1c2J2aXNpb24tPnBhbGV0dGUuZGVzYyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlkZWZhdWx0OgorCQkJCQlQREVCVUcoREJHX0lPQ1RMLCAiVklESU9DX0dfRk1UIGludmFsaWQgdHlwZSAlZCIsdmYtPnR5cGUpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJCWNhc2UgVklESU9DX1NfRk1UOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKnZmID0gYXJnOworCQkJaW50IGZvcm1hdElkeCxyZXQ7CisKKwkJCXN3aXRjaCh2Zi0+dHlwZSkgeworCQkJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQkJCXsKKwkJCQkJLyogRmluZCByZXF1ZXN0ZWQgZm9ybWF0IGluIGF2YWlsYWJsZSBvbmVzICovCisJCQkJCWZvcihmb3JtYXRJZHg9MDtmb3JtYXRJZHg8VVNCVklTSU9OX1NVUFBPUlRFRF9QQUxFVFRFUztmb3JtYXRJZHgrKykgeworCQkJCQkJaWYodmYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gdXNidmlzaW9uX3Y0bDJfZm9ybWF0W2Zvcm1hdElkeF0uZm9ybWF0KSB7CisJCQkJCQkJdXNidmlzaW9uLT5wYWxldHRlID0gdXNidmlzaW9uX3Y0bDJfZm9ybWF0W2Zvcm1hdElkeF07CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLyogcm9idXN0bmVzcyAqLworCQkJCQlpZihmb3JtYXRJZHggPT0gVVNCVklTSU9OX1NVUFBPUlRFRF9QQUxFVFRFUykgeworCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJUkVTVFJJQ1RfVE9fUkFOR0UodmYtPmZtdC5waXgud2lkdGgsIE1JTl9GUkFNRV9XSURUSCwgTUFYX0ZSQU1FX1dJRFRIKTsKKwkJCQkJUkVTVFJJQ1RfVE9fUkFOR0UodmYtPmZtdC5waXguaGVpZ2h0LCBNSU5fRlJBTUVfSEVJR0hULCBNQVhfRlJBTUVfSEVJR0hUKTsKKworCQkJCQl2Zi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSB2Zi0+Zm10LnBpeC53aWR0aCp1c2J2aXNpb24tPnBhbGV0dGUuYnl0ZXNfcGVyX3BpeGVsOworCQkJCQl2Zi0+Zm10LnBpeC5zaXplaW1hZ2UgPSB2Zi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUqdmYtPmZtdC5waXguaGVpZ2h0OworCisJCQkJCWlmKGNtZCA9PSBWSURJT0NfVFJZX0ZNVCkgeworCQkJCQkJUERFQlVHKERCR19JT0NUTCwgIlZJRElPQ19UUllfRk1UIGdyYWJkaXNwbGF5IHc9JWQsIGg9JWQsIGZvcm1hdD0lcyIsCisJCQkJCSAgICAgICB2Zi0+Zm10LnBpeC53aWR0aCwgdmYtPmZtdC5waXguaGVpZ2h0LHVzYnZpc2lvbi0+cGFsZXR0ZS5kZXNjKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisKKwkJCQkJLyogc3RvcCBpbyBpbiBjYXNlIGl0IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KKwkJCQkJaWYodXNidmlzaW9uLT5zdHJlYW1pbmcgPT0gU3RyZWFtX09uKSB7CisJCQkJCQlpZiAoKHJldCA9IHVzYnZpc2lvbl9zdHJlYW1faW50ZXJydXB0KHVzYnZpc2lvbikpKQorCQkJCQkJCXJldHVybiByZXQ7CisJCQkJCX0KKwkJCQkJdXNidmlzaW9uX2VtcHR5X2ZyYW1lcXVldWVzKHVzYnZpc2lvbik7CisKKwkJCQkJdXNidmlzaW9uLT5jdXJGcmFtZSA9IE5VTEw7CisKKwkJCQkJLy8gYnkgbm93IHdlIGFyZSBjb21taXR0ZWQgdG8gdGhlIG5ldyBkYXRhLi4uCisJCQkJCWRvd24oJnVzYnZpc2lvbi0+bG9jayk7CisJCQkJCXVzYnZpc2lvbl9zZXRfb3V0cHV0KHVzYnZpc2lvbiwgdmYtPmZtdC5waXgud2lkdGgsIHZmLT5mbXQucGl4LmhlaWdodCk7CisJCQkJCXVwKCZ1c2J2aXNpb24tPmxvY2spOworCisJCQkJCVBERUJVRyhEQkdfSU9DVEwsICJWSURJT0NfU19GTVQgZ3JhYmRpc3BsYXkgdz0lZCwgaD0lZCwgZm9ybWF0PSVzIiwKKwkJCQkJICAgICAgIHZmLT5mbXQucGl4LndpZHRoLCB2Zi0+Zm10LnBpeC5oZWlnaHQsdXNidmlzaW9uLT5wYWxldHRlLmRlc2MpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYnZpc2lvbl92NGwyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgdXNidmlzaW9uX3Y0bDJfZG9faW9jdGwpOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHVzYnZpc2lvbl92NGwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwKKwkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJaW50IG5vYmxvY2sgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisKKwlpbnQgZnJteCA9IC0xOworCWludCByZXQsaTsKKwlzdHJ1Y3QgdXNidmlzaW9uX2ZyYW1lICpmcmFtZTsKKworCVBERUJVRyhEQkdfSU8sICIlczogJWxkIGJ5dGVzLCBub2Jsb2NrPSVkIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyljb3VudCwgbm9ibG9jayk7CisKKwlpZiAoIVVTQlZJU0lPTl9JU19PUEVSQVRJT05BTCh1c2J2aXNpb24pIHx8IChidWYgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogbm8gc3RyZWFtIGlzIHJ1bm5pbmcsIG1ha2UgaXQgcnVubmluZyAhICovCisJdXNidmlzaW9uLT5zdHJlYW1pbmcgPSBTdHJlYW1fT247CisJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sVklESU9DX1NUUkVBTU9OICwgTlVMTCk7CisKKwkvKiBGaXJzdCwgZW5xdWV1ZSBhcyBtYW55IGZyYW1lcyBhcyBwb3NzaWJsZSAobGlrZSBhIHVzZXIgb2YgVklESU9DX1FCVUYgd291bGQgZG8pICovCisJZm9yKGk9MDtpPFVTQlZJU0lPTl9OVU1GUkFNRVM7aSsrKSB7CisJCWZyYW1lID0gJnVzYnZpc2lvbi0+ZnJhbWVbaV07CisJCWlmKGZyYW1lLT5ncmFic3RhdGUgPT0gRnJhbWVTdGF0ZV9VbnVzZWQpIHsKKwkJCS8qIE1hcmsgaXQgYXMgcmVhZHkgYW5kIGVucXVldWUgZnJhbWUgKi8KKwkJCWZyYW1lLT5ncmFic3RhdGUgPSBGcmFtZVN0YXRlX1JlYWR5OworCQkJZnJhbWUtPnNjYW5zdGF0ZSA9IFNjYW5TdGF0ZV9TY2FubmluZzsKKwkJCWZyYW1lLT5zY2FubGVuZ3RoID0gMDsJLyogQWNjdW11bGF0ZWQgaW4gdXNidmlzaW9uX3BhcnNlX2RhdGEoKSAqLworCisJCQkvKiBzZXQgdjRsMl9mb3JtYXQgaW5kZXggKi8KKwkJCWZyYW1lLT52NGwyX2Zvcm1hdCA9IHVzYnZpc2lvbi0+cGFsZXR0ZTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYnZpc2lvbi0+cXVldWVfbG9jaywgbG9ja19mbGFncyk7CisJCQlsaXN0X2FkZF90YWlsKCZmcmFtZS0+ZnJhbWUsICZ1c2J2aXNpb24tPmlucXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNidmlzaW9uLT5xdWV1ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJfQorCX0KKworCS8qIFRoZW4gdHJ5IHRvIHN0ZWFsIGEgZnJhbWUgKGxpa2UgYSBWSURJT0NfRFFCVUYgd291bGQgZG8pICovCisJaWYgKGxpc3RfZW1wdHkoJih1c2J2aXNpb24tPm91dHF1ZXVlKSkpIHsKKwkJaWYobm9ibG9jaykKKwkJCXJldHVybiAtRUFHQUlOOworCisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZQorCQkJKHVzYnZpc2lvbi0+d2FpdF9mcmFtZSwKKwkJCSAhbGlzdF9lbXB0eSgmKHVzYnZpc2lvbi0+b3V0cXVldWUpKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2J2aXNpb24tPnF1ZXVlX2xvY2ssIGxvY2tfZmxhZ3MpOworCWZyYW1lID0gbGlzdF9lbnRyeSh1c2J2aXNpb24tPm91dHF1ZXVlLm5leHQsCisJCQkgICBzdHJ1Y3QgdXNidmlzaW9uX2ZyYW1lLCBmcmFtZSk7CisJbGlzdF9kZWwodXNidmlzaW9uLT5vdXRxdWV1ZS5uZXh0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2J2aXNpb24tPnF1ZXVlX2xvY2ssIGxvY2tfZmxhZ3MpOworCisJLyogQW4gZXJyb3IgcmV0dXJucyBhbiBlbXB0eSBmcmFtZSAqLworCWlmIChmcmFtZS0+Z3JhYnN0YXRlID09IEZyYW1lU3RhdGVfRXJyb3IpIHsKKwkJZnJhbWUtPmJ5dGVzX3JlYWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlQREVCVUcoREJHX0lPLCAiJXM6IGZybXg9JWQsIGJ5dGVzX3JlYWQ9JWxkLCBzY2FubGVuZ3RoPSVsZCIsIF9fRlVOQ1RJT05fXywKKwkJICAgICAgIGZyYW1lLT5pbmRleCwgZnJhbWUtPmJ5dGVzX3JlYWQsIGZyYW1lLT5zY2FubGVuZ3RoKTsKKworCS8qIGNvcHkgYnl0ZXMgdG8gdXNlciBzcGFjZTsgd2UgYWxsb3cgZm9yIHBhcnRpYWxzIHJlYWRzICovCisJaWYgKChjb3VudCArIGZyYW1lLT5ieXRlc19yZWFkKSA+ICh1bnNpZ25lZCBsb25nKWZyYW1lLT5zY2FubGVuZ3RoKQorCQljb3VudCA9IGZyYW1lLT5zY2FubGVuZ3RoIC0gZnJhbWUtPmJ5dGVzX3JlYWQ7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgZnJhbWUtPmRhdGEgKyBmcmFtZS0+Ynl0ZXNfcmVhZCwgY291bnQpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZyYW1lLT5ieXRlc19yZWFkICs9IGNvdW50OworCVBERUJVRyhEQkdfSU8sICIlczoge2NvcHl9IGNvdW50IHVzZWQ9JWxkLCBuZXcgYnl0ZXNfcmVhZD0lbGQiLCBfX0ZVTkNUSU9OX18sCisJCSAgICAgICAodW5zaWduZWQgbG9uZyljb3VudCwgZnJhbWUtPmJ5dGVzX3JlYWQpOworCisJLy8gRm9yIG5vdywgZm9yZ2V0IHRoZSBmcmFtZSBpZiBpdCBoYXMgbm90IGJlZW4gcmVhZCBpbiBvbmUgc2hvdC4KKy8qIAlpZiAoZnJhbWUtPmJ5dGVzX3JlYWQgPj0gZnJhbWUtPnNjYW5sZW5ndGgpIHsvLyBBbGwgZGF0YSBoYXMgYmVlbiByZWFkICovCisJCWZyYW1lLT5ieXRlc19yZWFkID0gMDsKKworCQkvKiBNYXJrIGl0IGFzIGF2YWlsYWJsZSB0byBiZSB1c2VkIGFnYWluLiAqLworCQl1c2J2aXNpb24tPmZyYW1lW2ZybXhdLmdyYWJzdGF0ZSA9IEZyYW1lU3RhdGVfVW51c2VkOworLyogCX0gKi8KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB1c2J2aXNpb25fdjRsMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKwl2b2lkICpwb3M7CisJdTMyIGk7CisKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSAoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKworCWRvd24oJnVzYnZpc2lvbi0+bG9jayk7CisKKwlpZiAoIVVTQlZJU0lPTl9JU19PUEVSQVRJT05BTCh1c2J2aXNpb24pKSB7CisJCXVwKCZ1c2J2aXNpb24tPmxvY2spOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHx8CisJICAgIHNpemUgIT0gUEFHRV9BTElHTih1c2J2aXNpb24tPmN1cndpZHRoKnVzYnZpc2lvbi0+Y3VyaGVpZ2h0KnVzYnZpc2lvbi0+cGFsZXR0ZS5ieXRlc19wZXJfcGl4ZWwpKSB7CisJCXVwKCZ1c2J2aXNpb24tPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVVNCVklTSU9OX05VTUZSQU1FUzsgaSsrKSB7CisJCWlmICgoKHVzYnZpc2lvbi0+bWF4X2ZyYW1lX3NpemUqaSkgPj4gUEFHRV9TSElGVCkgPT0gdm1hLT52bV9wZ29mZikKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBVU0JWSVNJT05fTlVNRlJBTUVTKSB7CisJCVBERUJVRyhEQkdfTU1BUCwgIm1tYXA6IHVzZXIgc3VwcGxpZWQgbWFwcGluZyBhZGRyZXNzIGlzIG91dCBvZiByYW5nZSIpOworCQl1cCgmdXNidmlzaW9uLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVk1fSU8gaXMgZXZlbnR1YWxseSBnb2luZyB0byByZXBsYWNlIFBhZ2VSZXNlcnZlZCBhbHRvZ2V0aGVyICovCisJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOwkvKiBhdm9pZCB0byBzd2FwIG91dCB0aGlzIFZNQSAqLworCisJcG9zID0gdXNidmlzaW9uLT5mcmFtZVtpXS5kYXRhOworCXdoaWxlIChzaXplID4gMCkgeworCisJCWlmICh2bV9pbnNlcnRfcGFnZSh2bWEsIHN0YXJ0LCB2bWFsbG9jX3RvX3BhZ2UocG9zKSkpIHsKKwkJCVBERUJVRyhEQkdfTU1BUCwgIm1tYXA6IHZtX2luc2VydF9wYWdlIGZhaWxlZCIpOworCQkJdXAoJnVzYnZpc2lvbi0+bG9jayk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCXBvcyArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKworCXVwKCZ1c2J2aXNpb24tPmxvY2spOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBIZXJlIGNvbWVzIHRoZSBzdHVmZiBmb3IgcmFkaW8gb24gdXNidmlzaW9uIGJhc2VkIGRldmljZXMKKyAqCisgKi8KK3N0YXRpYyBpbnQgdXNidmlzaW9uX3JhZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gKHN0cnVjdCB1c2JfdXNidmlzaW9uICopIHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHY0bDJfZnJlcXVlbmN5IGZyZXE7CisJaW50IGVyckNvZGUgPSAwOworCisJUERFQlVHKERCR19JTywgIiVzOiIsIF9fRlVOQ1RJT05fXyk7CisKKwlkb3duKCZ1c2J2aXNpb24tPmxvY2spOworCisJaWYgKHVzYnZpc2lvbi0+dXNlcikgeworCQllcnIoIiVzOiBTb21lb25lIHRyaWVkIHRvIG9wZW4gYW4gYWxyZWFkeSBvcGVuZWQgVVNCVmlzaW9uIFJhZGlvISIsIF9fRlVOQ1RJT05fXyk7CisJCWVyckNvZGUgPSAtRUJVU1k7CisJfQorCWVsc2UgeworCQlpZihQb3dlck9uQXRPcGVuKSB7CisJCQl1c2J2aXNpb25fcmVzZXRfcG93ZXJPZmZUaW1lcih1c2J2aXNpb24pOworCQkJaWYgKHVzYnZpc2lvbi0+cG93ZXIgPT0gMCkgeworCQkJCXVzYnZpc2lvbl9wb3dlcl9vbih1c2J2aXNpb24pOworCQkJCXVzYnZpc2lvbl9pbml0X2kyYyh1c2J2aXNpb24pOworCQkJfQorCQl9CisKKwkJLy8gSWYgc28gZmFyIG5vIGVycm9ycyB0aGVuIHdlIHNoYWxsIHN0YXJ0IHRoZSByYWRpbworCQl1c2J2aXNpb24tPnJhZGlvID0gMTsKKwkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sQVVEQ19TRVRfUkFESU8sJnVzYnZpc2lvbi0+dHVuZXJfdHlwZSk7CisJCWZyZXEuZnJlcXVlbmN5ID0gMTUxNzsgLy9TV1IzIEAgOTQuOE1IegorCQljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbiwgVklESU9DX1NfRlJFUVVFTkNZLCAmZnJlcSk7CisJCXVzYnZpc2lvbl9zZXRfYXVkaW8odXNidmlzaW9uLCBVU0JWSVNJT05fQVVESU9fUkFESU8pOworCQl1c2J2aXNpb24tPnVzZXIrKzsKKwl9CisKKwlpZiAoZXJyQ29kZSkgeworCQlpZiAoUG93ZXJPbkF0T3BlbikgeworCQkJdXNidmlzaW9uX2kyY191c2JfZGVsX2J1cygmdXNidmlzaW9uLT5pMmNfYWRhcCk7CisJCQl1c2J2aXNpb25fcG93ZXJfb2ZmKHVzYnZpc2lvbik7CisJCQl1c2J2aXNpb24tPmluaXRpYWxpemVkID0gMDsKKwkJfQorCX0KKwl1cCgmdXNidmlzaW9uLT5sb2NrKTsKKwlyZXR1cm4gZXJyQ29kZTsKK30KKworCitzdGF0aWMgaW50IHVzYnZpc2lvbl9yYWRpb19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSAoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyQ29kZSA9IDA7CisKKwlQREVCVUcoREJHX0lPLCAiIik7CisKKwlkb3duKCZ1c2J2aXNpb24tPmxvY2spOworCisJdXNidmlzaW9uX2F1ZGlvX29mZih1c2J2aXNpb24pOworCXVzYnZpc2lvbi0+cmFkaW89MDsKKwl1c2J2aXNpb24tPnVzZXItLTsKKworCWlmIChQb3dlck9uQXRPcGVuKSB7CisJCXVzYnZpc2lvbl9zZXRfcG93ZXJPZmZUaW1lcih1c2J2aXNpb24pOworCQl1c2J2aXNpb24tPmluaXRpYWxpemVkID0gMDsKKwl9CisKKwl1cCgmdXNidmlzaW9uLT5sb2NrKTsKKworCWlmICh1c2J2aXNpb24tPnJlbW92ZV9wZW5kaW5nKSB7CisJCWluZm8oIiVzOiBGaW5hbCBkaXNjb25uZWN0IiwgX19GVU5DVElPTl9fKTsKKwkJdXNidmlzaW9uX3JlbGVhc2UodXNidmlzaW9uKTsKKwl9CisKKworCVBERUJVRyhEQkdfSU8sICJzdWNjZXNzIik7CisKKwlyZXR1cm4gZXJyQ29kZTsKK30KKworc3RhdGljIGludCB1c2J2aXNpb25fZG9fcmFkaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSAoc3RydWN0IHVzYl91c2J2aXNpb24gKikgdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghVVNCVklTSU9OX0lTX09QRVJBVElPTkFMKHVzYnZpc2lvbikpCisJCXJldHVybiAtRUlPOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnZjPWFyZzsKKworCQkJbWVtc2V0KHZjLCAwLCBzaXplb2YoKnZjKSk7CisJCQlzdHJsY3B5KHZjLT5kcml2ZXIsICJVU0JWaXNpb24iLCBzaXplb2YodmMtPmRyaXZlcikpOworCQkJc3RybGNweSh2Yy0+Y2FyZCwgdXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLk1vZGVsU3RyaW5nLAorCQkJCXNpemVvZih2Yy0+Y2FyZCkpOworCQkJc3RybGNweSh2Yy0+YnVzX2luZm8sIHVzYnZpc2lvbi0+ZGV2LT5kZXYuYnVzX2lkLAorCQkJCXNpemVvZih2Yy0+YnVzX2luZm8pKTsKKwkJCXZjLT52ZXJzaW9uID0gVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OOworCQkJdmMtPmNhcGFiaWxpdGllcyA9ICh1c2J2aXNpb24tPmhhdmVfdHVuZXIgPyBWNEwyX0NBUF9UVU5FUiA6IDApOworCQkJUERFQlVHKERCR19JTywgIlZJRElPQ19RVUVSWUNBUCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwgPSBhcmc7CisJCQlpbnQgaWQ9Y3RybC0+aWQ7CisKKwkJCW1lbXNldChjdHJsLDAsc2l6ZW9mKCpjdHJsKSk7CisJCQljdHJsLT5pZD1pZDsKKworCQkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIGNtZCwgYXJnKTsKKwkJCVBERUJVRyhEQkdfSU8sIlZJRElPQ19RVUVSWUNUUkwgaWQ9JXggdmFsdWU9JXgiLGN0cmwtPmlkLGN0cmwtPnR5cGUpOworCisJCQlpZiAoY3RybC0+dHlwZSkKKwkJCQlyZXR1cm4gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisJCWNhc2UgVklESU9DX0dfQ1RSTDoKKwkJeworCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKKworCQkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIFZJRElPQ19HX0NUUkwsIGN0cmwpOworCQkJUERFQlVHKERCR19JTywiVklESU9DX0dfQ1RSTCBpZD0leCB2YWx1ZT0leCIsY3RybC0+aWQsY3RybC0+dmFsdWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfU19DVFJMOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCisJCQljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbiwgVklESU9DX1NfQ1RSTCwgY3RybCk7CisJCQlQREVCVUcoREJHX0lPLCAiVklESU9DX1NfQ1RSTCBpZD0leCB2YWx1ZT0leCIsY3RybC0+aWQsY3RybC0+dmFsdWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfR19UVU5FUjoKKwkJeworCQkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7CisKKwkJCWlmICh0LT5pbmRleCA+IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCW1lbXNldCh0LDAsc2l6ZW9mKCp0KSk7CisJCQlzdHJjcHkodC0+bmFtZSwgIlJhZGlvIik7CisJCQl0LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKworCQkJLyogTGV0IGNsaWVudHMgZmlsbCBpbiB0aGUgcmVtYWluZGVyIG9mIHRoaXMgc3RydWN0ICovCisJCQljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbixWSURJT0NfR19UVU5FUix0KTsKKwkJCVBERUJVRyhEQkdfSU8sICJWSURJT0NfR19UVU5FUiBzaWduYWw9JXgsIGFmYz0leCIsdC0+c2lnbmFsLHQtPmFmYyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19TX1RVTkVSOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSBhcmc7CisKKwkJCS8vIE9ubHkgbm8gb3Igb25lIHR1bmVyIGZvciBub3cKKwkJCWlmICghdXNidmlzaW9uLT5oYXZlX3R1bmVyIHx8IHZ0LT5pbmRleCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCS8qIGxldCBjbGllbnRzIGhhbmRsZSB0aGlzICovCisJCQljYWxsX2kyY19jbGllbnRzKHVzYnZpc2lvbixWSURJT0NfU19UVU5FUix2dCk7CisKKwkJCVBERUJVRyhEQkdfSU8sICJWSURJT0NfU19UVU5FUiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfR19BVURJTzoKKwkJeworCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEgPSBhcmc7CisKKwkJCW1lbXNldChhLDAsc2l6ZW9mKCphKSk7CisJCQlzdHJjcHkoYS0+bmFtZSwiUmFkaW8iKTsKKwkJCVBERUJVRyhEQkdfSU8sICJWSURJT0NfR19BVURJTyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY2FzZSBWSURJT0NfU19BVURJTzoKKwkJY2FzZSBWSURJT0NfU19JTlBVVDoKKwkJY2FzZSBWSURJT0NfU19TVEQ6CisJCXJldHVybiAwOworCisJCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisKKwkJCW1lbXNldChmLDAsc2l6ZW9mKCpmKSk7CisKKwkJCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCQkJZi0+ZnJlcXVlbmN5ID0gdXNidmlzaW9uLT5mcmVxOworCQkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIGNtZCwgZik7CisJCQlQREVCVUcoREJHX0lPLCAiVklESU9DX0dfRlJFUVVFTkNZIGZyZXE9MHglWCIsICh1bnNpZ25lZClmLT5mcmVxdWVuY3kpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwkJeworCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOworCisJCQlpZiAoZi0+dHVuZXIgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXVzYnZpc2lvbi0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKKwkJCWNhbGxfaTJjX2NsaWVudHModXNidmlzaW9uLCBjbWQsIGYpOworCQkJUERFQlVHKERCR19JTywgIlZJRElPQ19TX0ZSRVFVRU5DWSBmcmVxPTB4JVgiLCAodW5zaWduZWQpZi0+ZnJlcXVlbmN5KTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJUERFQlVHKERCR19JTywgIiVzOiBVbmtub3duIGNvbW1hbmQgJXgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdXNidmlzaW9uX3JhZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgdXNidmlzaW9uX2RvX3JhZGlvX2lvY3RsKTsKK30KKworCisvKgorICogSGVyZSBjb21lcyB0aGUgc3R1ZmYgZm9yIHZiaSBvbiB1c2J2aXNpb24gYmFzZWQgZGV2aWNlcworICoKKyAqLworc3RhdGljIGludCB1c2J2aXNpb25fdmJpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogVE9ETyAqLworCXJldHVybiAtRUlOVkFMOworCit9CisKK3N0YXRpYyBpbnQgdXNidmlzaW9uX3ZiaV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBUT0RPICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdXNidmlzaW9uX2RvX3ZiaV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCS8qIFRPRE8gKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB1c2J2aXNpb25fdmJpX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgdXNidmlzaW9uX2RvX3ZiaV9pb2N0bCk7Cit9CisKKworLy8KKy8vIFZpZGVvIHJlZ2lzdHJhdGlvbiBzdHVmZgorLy8KKworLy8gVmlkZW8gdGVtcGxhdGUKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYnZpc2lvbl9mb3BzID0geworCS5vd25lciAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHVzYnZpc2lvbl92NGwyX29wZW4sCisJLnJlbGVhc2UJPSB1c2J2aXNpb25fdjRsMl9jbG9zZSwKKwkucmVhZAkJPSB1c2J2aXNpb25fdjRsMl9yZWFkLAorCS5tbWFwCQk9IHVzYnZpc2lvbl92NGwyX21tYXAsCisJLmlvY3RsCQk9IHVzYnZpc2lvbl92NGwyX2lvY3RsLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorfTsKK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIHVzYnZpc2lvbl92aWRlb190ZW1wbGF0ZSA9IHsKKwkub3duZXIgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkudHlwZQkJPSBWSURfVFlQRV9UVU5FUiB8IFZJRF9UWVBFX0NBUFRVUkUsCisJLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1VTQlZJU0lPTiwKKwkuZm9wcwkJPSAmdXNidmlzaW9uX2ZvcHMsCisJLm5hbWUgICAgICAgICAgID0gInVzYnZpc2lvbi12aWRlbyIsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkubWlub3IJCT0gLTEsCit9OworCisKKy8vIFJhZGlvIHRlbXBsYXRlCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2J2aXNpb25fcmFkaW9fZm9wcyA9IHsKKwkub3duZXIgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB1c2J2aXNpb25fcmFkaW9fb3BlbiwKKwkucmVsZWFzZQk9IHVzYnZpc2lvbl9yYWRpb19jbG9zZSwKKwkuaW9jdGwJCT0gdXNidmlzaW9uX3JhZGlvX2lvY3RsLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdXNidmlzaW9uX3JhZGlvX3RlbXBsYXRlPQoreworCS5vd25lciAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS50eXBlCQk9IFZJRF9UWVBFX1RVTkVSLAorCS5oYXJkd2FyZQk9IFZJRF9IQVJEV0FSRV9VU0JWSVNJT04sCisJLmZvcHMJCT0gJnVzYnZpc2lvbl9yYWRpb19mb3BzLAorCS5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCisJLm5hbWUgICAgICAgICAgID0gInVzYnZpc2lvbi1yYWRpbyIsCisJLm1pbm9yCQk9IC0xLAorfTsKKworCisvLyB2YmkgdGVtcGxhdGUKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYnZpc2lvbl92YmlfZm9wcyA9IHsKKwkub3duZXIgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB1c2J2aXNpb25fdmJpX29wZW4sCisJLnJlbGVhc2UJPSB1c2J2aXNpb25fdmJpX2Nsb3NlLAorCS5pb2N0bAkJPSB1c2J2aXNpb25fdmJpX2lvY3RsLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdXNidmlzaW9uX3ZiaV90ZW1wbGF0ZT0KK3sKKwkub3duZXIgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwkudHlwZQkJPSBWSURfVFlQRV9UVU5FUiwKKwkuaGFyZHdhcmUJPSBWSURfSEFSRFdBUkVfVVNCVklTSU9OLAorCS5mb3BzCQk9ICZ1c2J2aXNpb25fdmJpX2ZvcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkubmFtZSAgICAgICAgICAgPSAidXNidmlzaW9uLXZiaSIsCisJLm1pbm9yCQk9IC0xLAorfTsKKworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqdXNidmlzaW9uX3ZkZXZfaW5pdChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uLAorCQkJCQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2X3RlbXBsYXRlLAorCQkJCQljaGFyICpuYW1lKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gdXNidmlzaW9uLT5kZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKKworCWlmICh1c2JfZGV2ID09IE5VTEwpIHsKKwkJZXJyKCIlczogdXNidmlzaW9uLT5kZXYgaXMgbm90IHNldCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoTlVMTCA9PSB2ZGV2KSB7CisJCXJldHVybiBOVUxMOworCX0KKwkqdmRldiA9ICp2ZGV2X3RlbXBsYXRlOworLy8JdmRldi0+bWlub3IgICA9IC0xOworCXZkZXYtPmRldiAgICAgPSAmdXNiX2Rldi0+ZGV2OworCXNucHJpbnRmKHZkZXYtPm5hbWUsIHNpemVvZih2ZGV2LT5uYW1lKSwgIiVzIiwgbmFtZSk7CisJdmlkZW9fc2V0X2RydmRhdGEodmRldiwgdXNidmlzaW9uKTsKKwlyZXR1cm4gdmRldjsKK30KKworLy8gdW5yZWdpc3RlciB2aWRlbzRsaW51eCBkZXZpY2VzCitzdGF0aWMgdm9pZCB1c2J2aXNpb25fdW5yZWdpc3Rlcl92aWRlbyhzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoreworCS8vIHZiaSBEZXZpY2U6CisJaWYgKHVzYnZpc2lvbi0+dmJpKSB7CisJCVBERUJVRyhEQkdfUFJPQkUsICJ1bnJlZ2lzdGVyIC9kZXYvdmJpJWQgW3Y0bDJdIiwgdXNidmlzaW9uLT52YmktPm1pbm9yICYgMHgxZik7CisJCWlmICh1c2J2aXNpb24tPnZiaS0+bWlub3IgIT0gLTEpIHsKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHVzYnZpc2lvbi0+dmJpKTsKKwkJfQorCQllbHNlIHsKKwkJCXZpZGVvX2RldmljZV9yZWxlYXNlKHVzYnZpc2lvbi0+dmJpKTsKKwkJfQorCQl1c2J2aXNpb24tPnZiaSA9IE5VTEw7CisJfQorCisJLy8gUmFkaW8gRGV2aWNlOgorCWlmICh1c2J2aXNpb24tPnJkZXYpIHsKKwkJUERFQlVHKERCR19QUk9CRSwgInVucmVnaXN0ZXIgL2Rldi9yYWRpbyVkIFt2NGwyXSIsIHVzYnZpc2lvbi0+cmRldi0+bWlub3IgJiAweDFmKTsKKwkJaWYgKHVzYnZpc2lvbi0+cmRldi0+bWlub3IgIT0gLTEpIHsKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHVzYnZpc2lvbi0+cmRldik7CisJCX0KKwkJZWxzZSB7CisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZSh1c2J2aXNpb24tPnJkZXYpOworCQl9CisJCXVzYnZpc2lvbi0+cmRldiA9IE5VTEw7CisJfQorCisJLy8gVmlkZW8gRGV2aWNlOgorCWlmICh1c2J2aXNpb24tPnZkZXYpIHsKKwkJUERFQlVHKERCR19QUk9CRSwgInVucmVnaXN0ZXIgL2Rldi92aWRlbyVkIFt2NGwyXSIsIHVzYnZpc2lvbi0+dmRldi0+bWlub3IgJiAweDFmKTsKKwkJaWYgKHVzYnZpc2lvbi0+dmRldi0+bWlub3IgIT0gLTEpIHsKKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHVzYnZpc2lvbi0+dmRldik7CisJCX0KKwkJZWxzZSB7CisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZSh1c2J2aXNpb24tPnZkZXYpOworCQl9CisJCXVzYnZpc2lvbi0+dmRldiA9IE5VTEw7CisJfQorfQorCisvLyByZWdpc3RlciB2aWRlbzRsaW51eCBkZXZpY2VzCitzdGF0aWMgaW50IF9fZGV2aW5pdCB1c2J2aXNpb25fcmVnaXN0ZXJfdmlkZW8oc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwkvLyBWaWRlbyBEZXZpY2U6CisJdXNidmlzaW9uLT52ZGV2ID0gdXNidmlzaW9uX3ZkZXZfaW5pdCh1c2J2aXNpb24sICZ1c2J2aXNpb25fdmlkZW9fdGVtcGxhdGUsICJVU0JWaXNpb24gVmlkZW8iKTsKKwlpZiAodXNidmlzaW9uLT52ZGV2ID09IE5VTEwpIHsKKwkJZ290byBlcnJfZXhpdDsKKwl9CisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSh1c2J2aXNpb24tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKTwwKSB7CisJCWdvdG8gZXJyX2V4aXQ7CisJfQorCWluZm8oIlVTQlZpc2lvblslZF06IHJlZ2lzdGVyZWQgVVNCVmlzaW9uIFZpZGVvIGRldmljZSAvZGV2L3ZpZGVvJWQgW3Y0bDJdIiwgdXNidmlzaW9uLT5ucix1c2J2aXNpb24tPnZkZXYtPm1pbm9yICYgMHgxZik7CisKKwkvLyBSYWRpbyBEZXZpY2U6CisJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5SYWRpbykgeworCQkvLyB1c2J2aXNpb24gaGFzIHJhZGlvCisJCXVzYnZpc2lvbi0+cmRldiA9IHVzYnZpc2lvbl92ZGV2X2luaXQodXNidmlzaW9uLCAmdXNidmlzaW9uX3JhZGlvX3RlbXBsYXRlLCAiVVNCVmlzaW9uIFJhZGlvIik7CisJCWlmICh1c2J2aXNpb24tPnJkZXYgPT0gTlVMTCkgeworCQkJZ290byBlcnJfZXhpdDsKKwkJfQorCQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHVzYnZpc2lvbi0+cmRldiwgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKTwwKSB7CisJCQlnb3RvIGVycl9leGl0OworCQl9CisJCWluZm8oIlVTQlZpc2lvblslZF06IHJlZ2lzdGVyZWQgVVNCVmlzaW9uIFJhZGlvIGRldmljZSAvZGV2L3JhZGlvJWQgW3Y0bDJdIiwgdXNidmlzaW9uLT5uciwgdXNidmlzaW9uLT5yZGV2LT5taW5vciAmIDB4MWYpOworCX0KKwkvLyB2YmkgRGV2aWNlOgorCWlmICh1c2J2aXNpb25fZGV2aWNlX2RhdGFbdXNidmlzaW9uLT5EZXZNb2RlbF0udmJpKSB7CisJCXVzYnZpc2lvbi0+dmJpID0gdXNidmlzaW9uX3ZkZXZfaW5pdCh1c2J2aXNpb24sICZ1c2J2aXNpb25fdmJpX3RlbXBsYXRlLCAiVVNCVmlzaW9uIFZCSSIpOworCQlpZiAodXNidmlzaW9uLT52ZGV2ID09IE5VTEwpIHsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSh1c2J2aXNpb24tPnZiaSwgVkZMX1RZUEVfVkJJLCB2YmlfbnIpPDApIHsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJaW5mbygiVVNCVmlzaW9uWyVkXTogcmVnaXN0ZXJlZCBVU0JWaXNpb24gVkJJIGRldmljZSAvZGV2L3ZiaSVkIFt2NGwyXSAoTm90IFdvcmtpbmcgWWV0ISkiLCB1c2J2aXNpb24tPm5yLHVzYnZpc2lvbi0+dmJpLT5taW5vciAmIDB4MWYpOworCX0KKwkvLyBhbGwgZG9uZQorCXJldHVybiAwOworCisgZXJyX2V4aXQ6CisJZXJyKCJVU0JWaXNpb25bJWRdOiB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoKSBmYWlsZWQiLCB1c2J2aXNpb24tPm5yKTsKKwl1c2J2aXNpb25fdW5yZWdpc3Rlcl92aWRlbyh1c2J2aXNpb24pOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIHVzYnZpc2lvbl9hbGxvYygpCisgKgorICogVGhpcyBjb2RlIGFsbG9jYXRlcyB0aGUgc3RydWN0IHVzYl91c2J2aXNpb24uIEl0IGlzIGZpbGxlZCB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICoKKyAqIFJldHVybnMgTlVMTCBvbiBlcnJvciwgYSBwb2ludGVyIHRvIHVzYl91c2J2aXNpb24gZWxzZS4KKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uX2FsbG9jKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbjsKKworCWlmICgodXNidmlzaW9uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl91c2J2aXNpb24pLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlnb3RvIGVycl9leGl0OworCX0KKworCXVzYnZpc2lvbi0+ZGV2ID0gZGV2OworCisJaW5pdF9NVVRFWCgmdXNidmlzaW9uLT5sb2NrKTsJLyogdG8gMSA9PSBhdmFpbGFibGUgKi8KKworCS8vIHByZXBhcmUgY29udHJvbCB1cmIgZm9yIGNvbnRyb2wgbWVzc2FnZXMgZHVyaW5nIGludGVycnVwdHMKKwl1c2J2aXNpb24tPmN0cmxVcmIgPSB1c2JfYWxsb2NfdXJiKFVTQlZJU0lPTl9VUkJfRlJBTUVTLCBHRlBfS0VSTkVMKTsKKwlpZiAodXNidmlzaW9uLT5jdHJsVXJiID09IE5VTEwpIHsKKwkJZ290byBlcnJfZXhpdDsKKwl9CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdXNidmlzaW9uLT5jdHJsVXJiX3dxKTsKKwlpbml0X01VVEVYKCZ1c2J2aXNpb24tPmN0cmxVcmJMb2NrKTsJLyogdG8gMSA9PSBhdmFpbGFibGUgKi8KKworCXVzYnZpc2lvbl9pbml0X3Bvd2VyT2ZmVGltZXIodXNidmlzaW9uKTsKKworCXJldHVybiB1c2J2aXNpb247CisKK2Vycl9leGl0OgorCWlmICh1c2J2aXNpb24gJiYgdXNidmlzaW9uLT5jdHJsVXJiKSB7CisJCXVzYl9mcmVlX3VyYih1c2J2aXNpb24tPmN0cmxVcmIpOworCX0KKwlpZiAodXNidmlzaW9uKSB7CisJCWtmcmVlKHVzYnZpc2lvbik7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogdXNidmlzaW9uX3JlbGVhc2UoKQorICoKKyAqIFRoaXMgY29kZSBkb2VzIGZpbmFsIHJlbGVhc2Ugb2Ygc3RydWN0IHVzYl91c2J2aXNpb24uIFRoaXMgaGFwcGVucworICogYWZ0ZXIgdGhlIGRldmljZSBpcyBkaXNjb25uZWN0ZWQgLWFuZC0gYWxsIGNsaWVudHMgY2xvc2VkIHRoZWlyIGZpbGVzLgorICoKKyAqLworc3RhdGljIHZvaWQgdXNidmlzaW9uX3JlbGVhc2Uoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlQREVCVUcoREJHX1BST0JFLCAiIik7CisKKwlkb3duKCZ1c2J2aXNpb24tPmxvY2spOworCisJdXNidmlzaW9uX3Jlc2V0X3Bvd2VyT2ZmVGltZXIodXNidmlzaW9uKTsKKworCXVzYnZpc2lvbi0+aW5pdGlhbGl6ZWQgPSAwOworCisJdXAoJnVzYnZpc2lvbi0+bG9jayk7CisKKwl1c2J2aXNpb25fcmVtb3ZlX3N5c2ZzKHVzYnZpc2lvbi0+dmRldik7CisJdXNidmlzaW9uX3VucmVnaXN0ZXJfdmlkZW8odXNidmlzaW9uKTsKKworCWlmICh1c2J2aXNpb24tPmN0cmxVcmIpIHsKKwkJdXNiX2ZyZWVfdXJiKHVzYnZpc2lvbi0+Y3RybFVyYik7CisJfQorCisJa2ZyZWUodXNidmlzaW9uKTsKKworCVBERUJVRyhEQkdfUFJPQkUsICJzdWNjZXNzIik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHVzYiBpbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHVzYnZpc2lvbl9jb25maWd1cmVfdmlkZW8oc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKwlpbnQgbW9kZWwsaTsKKworCWlmICh1c2J2aXNpb24gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbW9kZWwgPSB1c2J2aXNpb24tPkRldk1vZGVsOworCXVzYnZpc2lvbi0+cGFsZXR0ZSA9IHVzYnZpc2lvbl92NGwyX2Zvcm1hdFsyXTsgLy8gVjRMMl9QSVhfRk1UX1JHQjI0OworCisJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaW5fUmVnMiA+PSAwKSB7CisJCXVzYnZpc2lvbi0+VmluX1JlZzJfUHJlc2V0ID0gdXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLlZpbl9SZWcyICYgMHhmZjsKKwl9IGVsc2UgeworCQl1c2J2aXNpb24tPlZpbl9SZWcyX1ByZXNldCA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRWTk9STVM7IGkrKykKKwkJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVttb2RlbF0uVmlkZW9Ob3JtID09IHR2bm9ybXNbaV0ubW9kZSkKKwkJCWJyZWFrOworCWlmIChpID09IFRWTk9STVMpCisJCWkgPSAwOworCXVzYnZpc2lvbi0+dHZub3JtID0gJnR2bm9ybXNbaV07ICAgICAgICAvKiBzZXQgZGVmYXVsdCBub3JtICovCisKKwl1c2J2aXNpb24tPnZpZGVvX2lucHV0cyA9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVttb2RlbF0uVmlkZW9DaGFubmVsczsKKwl1c2J2aXNpb24tPmN0bF9pbnB1dCA9IDA7CisKKwkvKiBUaGlzIHNob3VsZCBiZSBoZXJlIHRvIG1ha2UgaTJjIGNsaWVudHMgdG8gYmUgYWJsZSB0byByZWdpc3RlciAqLworCXVzYnZpc2lvbl9hdWRpb19vZmYodXNidmlzaW9uKTsJLy9maXJzdCBzd2l0Y2ggb2ZmIGF1ZGlvCisJaWYgKCFQb3dlck9uQXRPcGVuKSB7CisJCXVzYnZpc2lvbl9wb3dlcl9vbih1c2J2aXNpb24pOwkvL2FuZCB0aGVuIHBvd2VyIHVwIHRoZSBub2lzeSB0dW5lcgorCQl1c2J2aXNpb25faW5pdF9pMmModXNidmlzaW9uKTsKKwl9Cit9CisKKy8qCisgKiB1c2J2aXNpb25fcHJvYmUoKQorICoKKyAqIFRoaXMgcHJvY2VkdXJlIHF1ZXJpZXMgZGV2aWNlIGRlc2NyaXB0b3IgYW5kIGFjY2VwdHMgdGhlIGludGVyZmFjZQorICogaWYgaXQgbG9va3MgbGlrZSBVU0JWSVNJT04gdmlkZW8gZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB1c2J2aXNpb25fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlfX3U4IGlmbnVtID0gaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCWNvbnN0IHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCBtb2RlbDsKKworCVBERUJVRyhEQkdfUFJPQkUsICJWSUQ9JSMwNHgsIFBJRD0lIzA0eCwgaWZudW09JXUiLAorCQkJCQlkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QsIGlmbnVtKTsKKwkvKiBJcyBpdCBhbiBVU0JWSVNJT04gdmlkZW8gZGV2PyAqLworCW1vZGVsID0gMDsKKwlmb3IobW9kZWwgPSAwOyB1c2J2aXNpb25fZGV2aWNlX2RhdGFbbW9kZWxdLmlkVmVuZG9yOyBtb2RlbCsrKSB7CisJCWlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICE9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVttb2RlbF0uaWRWZW5kb3IpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSAhPSB1c2J2aXNpb25fZGV2aWNlX2RhdGFbbW9kZWxdLmlkUHJvZHVjdCkgeworCQkJY29udGludWU7CisJCX0KKworCQlpbmZvKCIlczogJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVttb2RlbF0uTW9kZWxTdHJpbmcpOworCQlicmVhazsKKwl9CisKKwlpZiAodXNidmlzaW9uX2RldmljZV9kYXRhW21vZGVsXS5pZFZlbmRvciA9PSAwKSB7CisJCXJldHVybiAtRU5PREVWOyAvL25vIG1hdGNoaW5nIGRldmljZQorCX0KKwlpZiAodXNidmlzaW9uX2RldmljZV9kYXRhW21vZGVsXS5JbnRlcmZhY2UgPj0gMCkgeworCQlpbnRlcmZhY2UgPSAmZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVt1c2J2aXNpb25fZGV2aWNlX2RhdGFbbW9kZWxdLkludGVyZmFjZV0tPmFsdHNldHRpbmdbMF07CisJfQorCWVsc2UgeworCQlpbnRlcmZhY2UgPSAmZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpZm51bV0tPmFsdHNldHRpbmdbMF07CisJfQorCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMV0uZGVzYzsKKwlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQllcnIoIiVzOiBpbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsIF9fRlVOQ1RJT05fXywgaWZudW0pOworCQllcnIoIiVzOiBFbmRwb2ludCBhdHRyaWJ1cmVzICVkIiwgX19GVU5DVElPTl9fLCBlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSB7CisJCWVycigiJXM6IGludGVyZmFjZSAlZC4gaGFzIElTTyBPVVQgZW5kcG9pbnQhIiwgX19GVU5DVElPTl9fLCBpZm51bSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXVzYl9nZXRfZGV2KGRldik7CisKKwlpZiAoKHVzYnZpc2lvbiA9IHVzYnZpc2lvbl9hbGxvYyhkZXYpKSA9PSBOVUxMKSB7CisJCWVycigiJXM6IGNvdWxkbid0IGFsbG9jYXRlIFVTQlZpc2lvbiBzdHJ1Y3QiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgPiAxKSB7CisJCXVzYnZpc2lvbi0+YnJpZGdlVHlwZSA9IEJSSURHRV9OVDEwMDQ7CisJfQorCWVsc2UgaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVttb2RlbF0uTW9kZWxTdHJpbmcgPT0gIkRhenpsZSBGdXNpb24gTW9kZWwgRFZDLTkwIFJldiAxIChTRUNBTSkiKSB7CisJCXVzYnZpc2lvbi0+YnJpZGdlVHlwZSA9IEJSSURHRV9OVDEwMDU7CisJfQorCWVsc2UgeworCQl1c2J2aXNpb24tPmJyaWRnZVR5cGUgPSBCUklER0VfTlQxMDAzOworCX0KKwlQREVCVUcoREJHX1BST0JFLCAiYnJpZGdlVHlwZSAlZCIsIHVzYnZpc2lvbi0+YnJpZGdlVHlwZSk7CisKKwlkb3duKCZ1c2J2aXNpb24tPmxvY2spOworCisJdXNidmlzaW9uLT5uciA9IHVzYnZpc2lvbl9ucisrOworCisJdXNidmlzaW9uLT5oYXZlX3R1bmVyID0gdXNidmlzaW9uX2RldmljZV9kYXRhW21vZGVsXS5UdW5lcjsKKwlpZiAodXNidmlzaW9uLT5oYXZlX3R1bmVyKSB7CisJCXVzYnZpc2lvbi0+dHVuZXJfdHlwZSA9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVttb2RlbF0uVHVuZXJUeXBlOworCX0KKworCXVzYnZpc2lvbi0+dHVuZXJfYWRkciA9IEFERFJfVU5TRVQ7CisKKwl1c2J2aXNpb24tPkRldk1vZGVsID0gbW9kZWw7CisJdXNidmlzaW9uLT5yZW1vdmVfcGVuZGluZyA9IDA7CisJdXNidmlzaW9uLT5pZmFjZSA9IGlmbnVtOworCXVzYnZpc2lvbi0+aWZhY2VBbHRJbmFjdGl2ZSA9IDA7CisJdXNidmlzaW9uLT5pZmFjZUFsdEFjdGl2ZSA9IDE7CisJdXNidmlzaW9uLT52aWRlb19lbmRwID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJdXNidmlzaW9uLT5pc29jUGFja2V0U2l6ZSA9IDA7CisJdXNidmlzaW9uLT51c2JfYmFuZHdpZHRoID0gMDsKKwl1c2J2aXNpb24tPnVzZXIgPSAwOworCXVzYnZpc2lvbi0+c3RyZWFtaW5nID0gU3RyZWFtX09mZjsKKwl1c2J2aXNpb25fcmVnaXN0ZXJfdmlkZW8odXNidmlzaW9uKTsKKwl1c2J2aXNpb25fY29uZmlndXJlX3ZpZGVvKHVzYnZpc2lvbik7CisJdXAoJnVzYnZpc2lvbi0+bG9jayk7CisKKworCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIHVzYnZpc2lvbik7CisJdXNidmlzaW9uX2NyZWF0ZV9zeXNmcyh1c2J2aXNpb24tPnZkZXYpOworCisJUERFQlVHKERCR19QUk9CRSwgInN1Y2Nlc3MiKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogdXNidmlzaW9uX2Rpc2Nvbm5lY3QoKQorICoKKyAqIFRoaXMgcHJvY2VkdXJlIHN0b3BzIGFsbCBkcml2ZXIgYWN0aXZpdHksIGRlYWxsb2NhdGVzIGludGVyZmFjZS1wcml2YXRlCisgKiBzdHJ1Y3R1cmUgKHBvaW50ZWQgYnkgJ3B0cicpIGFuZCBhZnRlciB0aGF0IGRyaXZlciBzaG91bGQgYmUgcmVtb3ZhYmxlCisgKiB3aXRoIG5vIGlsbCBjb25zZXF1ZW5jZXMuCisgKgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdXNidmlzaW9uX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlQREVCVUcoREJHX1BST0JFLCAiIik7CisKKwlpZiAodXNidmlzaW9uID09IE5VTEwpIHsKKwkJZXJyKCIlczogdXNiX2dldF9pbnRmZGF0YSgpIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CisKKwlkb3duKCZ1c2J2aXNpb24tPmxvY2spOworCisJLy8gQXQgdGhpcyB0aW1lIHdlIGFzayB0byBjYW5jZWwgb3V0c3RhbmRpbmcgVVJCcworCXVzYnZpc2lvbl9zdG9wX2lzb2ModXNidmlzaW9uKTsKKworCWlmICh1c2J2aXNpb24tPnBvd2VyKSB7CisJCXVzYnZpc2lvbl9pMmNfdXNiX2RlbF9idXMoJnVzYnZpc2lvbi0+aTJjX2FkYXApOworCQl1c2J2aXNpb25fcG93ZXJfb2ZmKHVzYnZpc2lvbik7CisJfQorCXVzYnZpc2lvbi0+cmVtb3ZlX3BlbmRpbmcgPSAxOwkvLyBOb3cgYWxsIElTTyBkYXRhIHdpbGwgYmUgaWdub3JlZAorCisJdXNiX3B1dF9kZXYodXNidmlzaW9uLT5kZXYpOworCXVzYnZpc2lvbi0+ZGV2ID0gTlVMTDsJLy8gVVNCIGRldmljZSBpcyBubyBtb3JlCisKKwl1cCgmdXNidmlzaW9uLT5sb2NrKTsKKworCWlmICh1c2J2aXNpb24tPnVzZXIpIHsKKwkJaW5mbygiJXM6IEluIHVzZSwgZGlzY29ubmVjdCBwZW5kaW5nIiwgX19GVU5DVElPTl9fKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1c2J2aXNpb24tPndhaXRfZnJhbWUpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVzYnZpc2lvbi0+d2FpdF9zdHJlYW0pOworCX0KKwllbHNlIHsKKwkJdXNidmlzaW9uX3JlbGVhc2UodXNidmlzaW9uKTsKKwl9CisKKwlQREVCVUcoREJHX1BST0JFLCAic3VjY2VzcyIpOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2J2aXNpb25fZHJpdmVyID0geworCS5uYW1lCQk9ICJ1c2J2aXNpb24iLAorCS5pZF90YWJsZQk9IHVzYnZpc2lvbl90YWJsZSwKKwkucHJvYmUJCT0gdXNidmlzaW9uX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gdXNidmlzaW9uX2Rpc2Nvbm5lY3QKK307CisKKy8qCisgKiBjdXN0b21kZXZpY2VfcHJvY2VzcygpCisgKgorICogVGhpcyBwcm9jZWR1cmUgcHJlcHJvY2Vzc2VzIEN1c3RvbURldmljZSBwYXJhbWV0ZXIgaWYgYW55CisgKgorICovCit2b2lkIGN1c3RvbWRldmljZV9wcm9jZXNzKHZvaWQpCit7CisJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdPXVzYnZpc2lvbl9kZXZpY2VfZGF0YVsxXTsKKwl1c2J2aXNpb25fdGFibGVbMF09dXNidmlzaW9uX3RhYmxlWzFdOworCisJaWYoQ3VzdG9tRGV2aWNlKQorCXsKKwkJY2hhciAqcGFyc2U9Q3VzdG9tRGV2aWNlOworCisJCVBERUJVRyhEQkdfUFJPQkUsICJDdXN0b21EZXZpZGU9JXMiLCBDdXN0b21EZXZpY2UpOworCisJCS8qZm9ybWF0IGlzIEN1c3RvbURldmljZT0iMHgwNTczIDB4NEQzMSAwIDcxMTMgMyBQQUwgMSAxIDEgNSAtMSAtMSAtMSAtMSAtMSIKKwkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLmlkVmVuZG9yOworCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRQcm9kdWN0OworCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uSW50ZXJmYWNlOworCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQ29kZWM7CisJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb0NoYW5uZWxzOworCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVmlkZW9Ob3JtOworCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQXVkaW9DaGFubmVsczsKKwkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlJhZGlvOworCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVHVuZXI7CisJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5UdW5lclR5cGU7CisJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaW5fUmVnMTsKKwkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlZpbl9SZWcyOworCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uWF9PZmZzZXQ7CisJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5ZX09mZnNldDsKKwkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLkR2aV95dXY7CisJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5Nb2RlbFN0cmluZzsKKwkJKi8KKworCQlybXNwYWNlKHBhcnNlKTsKKwkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLk1vZGVsU3RyaW5nPSJVU0JWSVNJT04gQ3VzdG9tIERldmljZSI7CisKKwkJcGFyc2UrPTI7CisJCXNzY2FuZihwYXJzZSwiJXgiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRWZW5kb3IpOworCQlnb3RvMm5leHQocGFyc2UpOworCQlQREVCVUcoREJHX1BST0JFLCAiaWRWZW5kb3I9MHglLjRYIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLmlkVmVuZG9yKTsKKwkJcGFyc2UrPTI7CisJCXNzY2FuZihwYXJzZSwiJXgiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRQcm9kdWN0KTsKKwkJZ290bzJuZXh0KHBhcnNlKTsKKwkJUERFQlVHKERCR19QUk9CRSwgImlkUHJvZHVjdD0weCUuNFgiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRQcm9kdWN0KTsKKwkJc3NjYW5mKHBhcnNlLCIlZCIsJnVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5JbnRlcmZhY2UpOworCQlnb3RvMm5leHQocGFyc2UpOworCQlQREVCVUcoREJHX1BST0JFLCAiSW50ZXJmYWNlPSVkIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLkludGVyZmFjZSk7CisJCXNzY2FuZihwYXJzZSwiJWQiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQ29kZWMpOworCQlnb3RvMm5leHQocGFyc2UpOworCQlQREVCVUcoREJHX1BST0JFLCAiQ29kZWM9JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQ29kZWMpOworCQlzc2NhbmYocGFyc2UsIiVkIiwmdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlZpZGVvQ2hhbm5lbHMpOworCQlnb3RvMm5leHQocGFyc2UpOworCQlQREVCVUcoREJHX1BST0JFLCAiVmlkZW9DaGFubmVscz0lZCIsIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb0NoYW5uZWxzKTsKKworCQlzd2l0Y2goKnBhcnNlKQorCQl7CisJCQljYXNlICdQJzoKKwkJCQlQREVCVUcoREJHX1BST0JFLCAiVmlkZW9Ob3JtPVBBTCIpOworCQkJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb05vcm09VklERU9fTU9ERV9QQUw7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ1MnOgorCQkJCVBERUJVRyhEQkdfUFJPQkUsICJWaWRlb05vcm09U0VDQU0iKTsKKwkJCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVmlkZW9Ob3JtPVZJREVPX01PREVfU0VDQU07CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ04nOgorCQkJCVBERUJVRyhEQkdfUFJPQkUsICJWaWRlb05vcm09TlRTQyIpOworCQkJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb05vcm09VklERU9fTU9ERV9OVFNDOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCVBERUJVRyhEQkdfUFJPQkUsICJWaWRlb05vcm09UEFMIChieSBkZWZhdWx0KSIpOworCQkJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb05vcm09VklERU9fTU9ERV9QQUw7CisJCQkJYnJlYWs7CisJCX0KKwkJZ290bzJuZXh0KHBhcnNlKTsKKworCQlzc2NhbmYocGFyc2UsIiVkIiwmdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLkF1ZGlvQ2hhbm5lbHMpOworCQlnb3RvMm5leHQocGFyc2UpOworCQlQREVCVUcoREJHX1BST0JFLCAiQXVkaW9DaGFubmVscz0lZCIsIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5BdWRpb0NoYW5uZWxzKTsKKwkJc3NjYW5mKHBhcnNlLCIlZCIsJnVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5SYWRpbyk7CisJCWdvdG8ybmV4dChwYXJzZSk7CisJCVBERUJVRyhEQkdfUFJPQkUsICJSYWRpbz0lZCIsIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5SYWRpbyk7CisJCXNzY2FuZihwYXJzZSwiJWQiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVHVuZXIpOworCQlnb3RvMm5leHQocGFyc2UpOworCQlQREVCVUcoREJHX1BST0JFLCAiVHVuZXI9JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVHVuZXIpOworCQlzc2NhbmYocGFyc2UsIiVkIiwmdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlR1bmVyVHlwZSk7CisJCWdvdG8ybmV4dChwYXJzZSk7CisJCVBERUJVRyhEQkdfUFJPQkUsICJUdW5lclR5cGU9JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVHVuZXJUeXBlKTsKKwkJc3NjYW5mKHBhcnNlLCIlZCIsJnVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaW5fUmVnMSk7CisJCWdvdG8ybmV4dChwYXJzZSk7CisJCVBERUJVRyhEQkdfUFJPQkUsICJWaW5fUmVnMT0lZCIsIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaW5fUmVnMSk7CisJCXNzY2FuZihwYXJzZSwiJWQiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVmluX1JlZzIpOworCQlnb3RvMm5leHQocGFyc2UpOworCQlQREVCVUcoREJHX1BST0JFLCAiVmluX1JlZzI9JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVmluX1JlZzIpOworCQlzc2NhbmYocGFyc2UsIiVkIiwmdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlhfT2Zmc2V0KTsKKwkJZ290bzJuZXh0KHBhcnNlKTsKKwkJUERFQlVHKERCR19QUk9CRSwgIlhfT2Zmc2V0PSVkIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlhfT2Zmc2V0KTsKKwkJc3NjYW5mKHBhcnNlLCIlZCIsJnVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5ZX09mZnNldCk7CisJCWdvdG8ybmV4dChwYXJzZSk7CisJCVBERUJVRyhEQkdfUFJPQkUsICJZX09mZnNldD0lZCIsIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5ZX09mZnNldCk7CisJCXNzY2FuZihwYXJzZSwiJWQiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uRHZpX3l1dik7CisJCVBERUJVRyhEQkdfUFJPQkUsICJEdmlfeXV2PSVkIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLkR2aV95dXYpOworCisJCS8vYWRkIHRvIHVzYnZpc2lvbl90YWJsZSBhbHNvCisJCXVzYnZpc2lvbl90YWJsZVswXS5tYXRjaF9mbGFncz1VU0JfREVWSUNFX0lEX01BVENIX0RFVklDRTsKKwkJdXNidmlzaW9uX3RhYmxlWzBdLmlkVmVuZG9yPXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5pZFZlbmRvcjsKKwkJdXNidmlzaW9uX3RhYmxlWzBdLmlkUHJvZHVjdD11c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRQcm9kdWN0OworCisJfQorfQorCisKKworLyoKKyAqIHVzYnZpc2lvbl9pbml0KCkKKyAqCisgKiBUaGlzIGNvZGUgaXMgcnVuIHRvIGluaXRpYWxpemUgdGhlIGRyaXZlci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHVzYnZpc2lvbl9pbml0KHZvaWQpCit7CisJaW50IGVyckNvZGU7CisKKwlQREVCVUcoREJHX1BST0JFLCAiIik7CisKKwlQREVCVUcoREJHX0lPQ1RMLCAiSU9DVEwgICBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCBbdmlkZW9dIik7CisJUERFQlVHKERCR19JTywgICJJTyAgICAgIGRlYnVnZ2luZyBpcyBlbmFibGVkIFt2aWRlb10iKTsKKwlQREVCVUcoREJHX1BST0JFLCAiUFJPQkUgICBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCBbdmlkZW9dIik7CisJUERFQlVHKERCR19NTUFQLCAiTU1BUCAgICBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCBbdmlkZW9dIik7CisKKwkvKiBkaXNhYmxlIHBsYW5hciBtb2RlIHN1cHBvcnQgdW5sZXNzIGNvbXByZXNzaW9uIGVuYWJsZWQgKi8KKwlpZiAoaXNvY01vZGUgIT0gSVNPQ19NT0RFX0NPTVBSRVNTICkgeworCQkvLyBGSVhNRSA6IG5vdCB0aGUgcmlnaHQgd2F5IHRvIHNldCBzdXBwb3J0ZWQgZmxhZworCQl1c2J2aXNpb25fdjRsMl9mb3JtYXRbNl0uc3VwcG9ydGVkID0gMDsgLy8gVjRMMl9QSVhfRk1UX1lWVTQyMAorCQl1c2J2aXNpb25fdjRsMl9mb3JtYXRbN10uc3VwcG9ydGVkID0gMDsgLy8gVjRMMl9QSVhfRk1UX1lVVjQyMlAKKwl9CisKKwljdXN0b21kZXZpY2VfcHJvY2VzcygpOworCisJZXJyQ29kZSA9IHVzYl9yZWdpc3RlcigmdXNidmlzaW9uX2RyaXZlcik7CisKKwlpZiAoZXJyQ29kZSA9PSAwKSB7CisJCWluZm8oRFJJVkVSX0RFU0MgIiA6ICIgVVNCVklTSU9OX1ZFUlNJT05fU1RSSU5HKTsKKwkJUERFQlVHKERCR19QUk9CRSwgInN1Y2Nlc3MiKTsKKwl9CisJcmV0dXJuIGVyckNvZGU7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2J2aXNpb25fZXhpdCh2b2lkKQoreworIFBERUJVRyhEQkdfUFJPQkUsICIiKTsKKworIHVzYl9kZXJlZ2lzdGVyKCZ1c2J2aXNpb25fZHJpdmVyKTsKKyBQREVCVUcoREJHX1BST0JFLCAic3VjY2VzcyIpOworfQorCittb2R1bGVfaW5pdCh1c2J2aXNpb25faW5pdCk7Cittb2R1bGVfZXhpdCh1c2J2aXNpb25fZXhpdCk7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdlM2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLmgKQEAgLTAsMCArMSw1NTggQEAKKy8qCisgKiBVU0JWSVNJT04uSAorICogIHVzYnZpc2lvbiBoZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IEpvZXJnIEhlY2tlbmJhY2ggPGpvZXJnQGhlY2tlbmJhY2gtYXcuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBEd2FpbmUgR2FyZGVuIDxkd2FpbmVnYXJkZW5Acm9nZXJzLmNvbT4KKyAqCisgKgorICogUmVwb3J0IHByb2JsZW1zIHRvIHY0bCBNYWlsaW5nTGlzdCA6IGh0dHA6Ly93d3cucmVkaGF0LmNvbS9tYWlsbWFuL2xpc3RpbmZvL3ZpZGVvNGxpbnV4LWxpc3QKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHVzYnZpc2lvbiBkcml2ZXIgcHJvamVjdC4KKyAqIFVwZGF0ZXMgdG8gZHJpdmVyIGNvbXBsZXRlZCBieSBEd2FpbmUgUC4gR2FyZGVuCisgKiB2NGwyIGNvbnZlcnNpb24gYnkgVGhpZXJyeSBNZXJsZSA8dGhpZXJyeS5tZXJsZUBmcmVlLmZyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKworI2lmbmRlZiBfX0xJTlVYX1VTQlZJU0lPTl9ICisjZGVmaW5lIF9fTElOVVhfVVNCVklTSU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNkZWZpbmUgVVNCVklTSU9OX0RFQlVHCQkvKiBUdXJuIG9uIGRlYnVnIG1lc3NhZ2VzICovCisKKyNpZm5kZWYgVklEX0hBUkRXQVJFX1VTQlZJU0lPTgorCSNkZWZpbmUgVklEX0hBUkRXQVJFX1VTQlZJU0lPTiAzNCAgIC8qIFVTQlZpc2lvbiBWaWRlbyBHcmFiYmVyICovCisjZW5kaWYKKworI2RlZmluZSBVU0JWSVNJT05fUFdSX1JFRwkJMHgwMAorCSNkZWZpbmUgVVNCVklTSU9OX1NTUE5EX0VOCQkoMSA8PCAxKQorCSNkZWZpbmUgVVNCVklTSU9OX1JFUzIJCQkoMSA8PCAyKQorCSNkZWZpbmUgVVNCVklTSU9OX1BXUl9WSUQJCSgxIDw8IDUpCisJI2RlZmluZSBVU0JWSVNJT05fRTJfRU4JCQkoMSA8PCA3KQorI2RlZmluZSBVU0JWSVNJT05fQ09ORklHX1JFRwkJMHgwMQorI2RlZmluZSBVU0JWSVNJT05fQURSU19SRUcJCTB4MDIKKyNkZWZpbmUgVVNCVklTSU9OX0FMVEVSX1JFRwkJMHgwMworI2RlZmluZSBVU0JWSVNJT05fRk9SQ0VfQUxURVJfUkVHCTB4MDQKKyNkZWZpbmUgVVNCVklTSU9OX1NUQVRVU19SRUcJCTB4MDUKKyNkZWZpbmUgVVNCVklTSU9OX0lPUElOX1JFRwkJMHgwNgorCSNkZWZpbmUgVVNCVklTSU9OX0lPXzEJCQkoMSA8PCAwKQorCSNkZWZpbmUgVVNCVklTSU9OX0lPXzIJCQkoMSA8PCAxKQorCSNkZWZpbmUgVVNCVklTSU9OX0FVRElPX0lOCQkwCisJI2RlZmluZSBVU0JWSVNJT05fQVVESU9fVFYJCTEKKwkjZGVmaW5lIFVTQlZJU0lPTl9BVURJT19SQURJTwkJMgorCSNkZWZpbmUgVVNCVklTSU9OX0FVRElPX01VVEUJCTMKKyNkZWZpbmUgVVNCVklTSU9OX1NFUl9NT0RFCQkweDA3CisjZGVmaW5lIFVTQlZJU0lPTl9TRVJfQURSUwkJMHgwOAorI2RlZmluZSBVU0JWSVNJT05fU0VSX0NPTlQJCTB4MDkKKyNkZWZpbmUgVVNCVklTSU9OX1NFUl9EQVQxCQkweDBBCisjZGVmaW5lIFVTQlZJU0lPTl9TRVJfREFUMgkJMHgwQgorI2RlZmluZSBVU0JWSVNJT05fU0VSX0RBVDMJCTB4MEMKKyNkZWZpbmUgVVNCVklTSU9OX1NFUl9EQVQ0CQkweDBECisjZGVmaW5lIFVTQlZJU0lPTl9FRV9EQVRBCQkweDBFCisjZGVmaW5lIFVTQlZJU0lPTl9FRV9MU0JBRAkJMHgwRgorI2RlZmluZSBVU0JWSVNJT05fRUVfQ09OVAkJMHgxMAorI2RlZmluZSBVU0JWSVNJT05fRFJNX0NPTlQJCQkweDEyCisJI2RlZmluZSBVU0JWSVNJT05fUkVGCQkJKDEgPDwgMCkKKwkjZGVmaW5lIFVTQlZJU0lPTl9SRVNfVVIJCSgxIDw8IDIpCisJI2RlZmluZSBVU0JWSVNJT05fUkVTX0ZETAkJKDEgPDwgMykKKwkjZGVmaW5lIFVTQlZJU0lPTl9SRVNfVkRXCQkoMSA8PCA0KQorI2RlZmluZSBVU0JWSVNJT05fRFJNX1BSTTEJCTB4MTMKKyNkZWZpbmUgVVNCVklTSU9OX0RSTV9QUk0yCQkweDE0CisjZGVmaW5lIFVTQlZJU0lPTl9EUk1fUFJNMwkJMHgxNQorI2RlZmluZSBVU0JWSVNJT05fRFJNX1BSTTQJCTB4MTYKKyNkZWZpbmUgVVNCVklTSU9OX0RSTV9QUk01CQkweDE3CisjZGVmaW5lIFVTQlZJU0lPTl9EUk1fUFJNNgkJMHgxOAorI2RlZmluZSBVU0JWSVNJT05fRFJNX1BSTTcJCTB4MTkKKyNkZWZpbmUgVVNCVklTSU9OX0RSTV9QUk04CQkweDFBCisjZGVmaW5lIFVTQlZJU0lPTl9WSU5fUkVHMQkJMHgxQgorCSNkZWZpbmUgVVNCVklTSU9OXzhfNDIyX1NZTkMJCTB4MDEKKwkjZGVmaW5lIFVTQlZJU0lPTl8xNl80MjJfU1lOQwkJMHgwMgorCSNkZWZpbmUgVVNCVklTSU9OX1ZTTkNfUE9MCQkoMSA8PCAzKQorCSNkZWZpbmUgVVNCVklTSU9OX0hTTkNfUE9MCQkoMSA8PCA0KQorCSNkZWZpbmUgVVNCVklTSU9OX0ZJRF9QT0wJCSgxIDw8IDUpCisJI2RlZmluZSBVU0JWSVNJT05fSFZBTElEX1BPCQkoMSA8PCA2KQorCSNkZWZpbmUgVVNCVklTSU9OX1ZDTEtfUE9MCQkoMSA8PCA3KQorI2RlZmluZSBVU0JWSVNJT05fVklOX1JFRzIJCTB4MUMKKwkjZGVmaW5lIFVTQlZJU0lPTl9BVVRPX0ZJRAkJKDEgPDwgMCkKKwkjZGVmaW5lIFVTQlZJU0lPTl9OT05FX0lOVEVSCQkoMSA8PCAxKQorCSNkZWZpbmUgVVNCVklTSU9OX05PSFZBTElECQkoMSA8PCAyKQorCSNkZWZpbmUgVVNCVklTSU9OX1VWX0lECQkJKDEgPDwgMykKKwkjZGVmaW5lIFVTQlZJU0lPTl9GSVhfMkMJCSgxIDw8IDQpCisJI2RlZmluZSBVU0JWSVNJT05fU0VORF9GSUQJCSgxIDw8IDUpCisJI2RlZmluZSBVU0JWSVNJT05fS0VFUF9CTEFOSwkJKDEgPDwgNykKKyNkZWZpbmUgVVNCVklTSU9OX0xYU0laRV9JCQkweDFECisjZGVmaW5lIFVTQlZJU0lPTl9NWFNJWkVfSQkJMHgxRQorI2RlZmluZSBVU0JWSVNJT05fTFlTSVpFX0kJCTB4MUYKKyNkZWZpbmUgVVNCVklTSU9OX01ZU0laRV9JCQkweDIwCisjZGVmaW5lIFVTQlZJU0lPTl9MWF9PRkZTVAkJMHgyMQorI2RlZmluZSBVU0JWSVNJT05fTVhfT0ZGU1QJCTB4MjIKKyNkZWZpbmUgVVNCVklTSU9OX0xZX09GRlNUCQkweDIzCisjZGVmaW5lIFVTQlZJU0lPTl9NWV9PRkZTVAkJMHgyNAorI2RlZmluZSBVU0JWSVNJT05fRlJNX1JBVEUJCTB4MjUKKyNkZWZpbmUgVVNCVklTSU9OX0xYU0laRV9PCQkweDI2CisjZGVmaW5lIFVTQlZJU0lPTl9NWFNJWkVfTwkJMHgyNworI2RlZmluZSBVU0JWSVNJT05fTFlTSVpFX08JCTB4MjgKKyNkZWZpbmUgVVNCVklTSU9OX01ZU0laRV9PCQkweDI5CisjZGVmaW5lIFVTQlZJU0lPTl9GSUxUX0NPTlQJCTB4MkEKKyNkZWZpbmUgVVNCVklTSU9OX1ZPX01PREUJCTB4MkIKKyNkZWZpbmUgVVNCVklTSU9OX0lOVFJBX0NZQwkJMHgyQworI2RlZmluZSBVU0JWSVNJT05fU1RSSVBfU1oJCTB4MkQKKyNkZWZpbmUgVVNCVklTSU9OX0ZPUkNFX0lOVFJBCQkweDJFCisjZGVmaW5lIFVTQlZJU0lPTl9GT1JDRV9VUAkJMHgyRgorI2RlZmluZSBVU0JWSVNJT05fQlVGX1RIUgkJMHgzMAorI2RlZmluZSBVU0JWSVNJT05fRFZJX1lVVgkJMHgzMQorI2RlZmluZSBVU0JWSVNJT05fQVVESU9fQ09OVAkJMHgzMgorI2RlZmluZSBVU0JWSVNJT05fQVVEX1BLX0xFTgkJMHgzMworI2RlZmluZSBVU0JWSVNJT05fQkxLX1BLX0xFTgkJMHgzNAorI2RlZmluZSBVU0JWSVNJT05fUENNX1RIUjEJCTB4MzgKKyNkZWZpbmUgVVNCVklTSU9OX1BDTV9USFIyCQkweDM5CisjZGVmaW5lIFVTQlZJU0lPTl9ESVNUX1RIUl9MCQkweDNBCisjZGVmaW5lIFVTQlZJU0lPTl9ESVNUX1RIUl9ICQkweDNCCisjZGVmaW5lIFVTQlZJU0lPTl9NQVhfRElTVF9MCQkweDNDCisjZGVmaW5lIFVTQlZJU0lPTl9NQVhfRElTVF9ICQkweDNECisjZGVmaW5lIFVTQlZJU0lPTl9PUF9DT0RFCQkweDMzCisKKyNkZWZpbmUgTUFYX0JZVEVTX1BFUl9QSVhFTAkJNAorCisjZGVmaW5lIE1JTl9GUkFNRV9XSURUSAkJCTY0CisjZGVmaW5lIE1BWF9VU0JfV0lEVEgJCQkzMjAgIC8vMzg0CisjZGVmaW5lIE1BWF9GUkFNRV9XSURUSAkJCTMyMCAgLy8zODQJCQkvKnN0cmVjaGluZyBzb21ldGltZXMgY2F1c2VzIGNyYXNoZXMqLworCisjZGVmaW5lIE1JTl9GUkFNRV9IRUlHSFQJCTQ4CisjZGVmaW5lIE1BWF9VU0JfSEVJR0hUCQkJMjQwICAvLzI4OAorI2RlZmluZSBNQVhfRlJBTUVfSEVJR0hUCQkyNDAgIC8vMjg4CQkJLypTdHJlY2hpbmcgc29tZXRpbWVzIGNhdXNlcyBjcmFzaGVzKi8KKworI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgICAgCQkoTUFYX0ZSQU1FX1dJRFRIICogTUFYX0ZSQU1FX0hFSUdIVCAqIE1BWF9CWVRFU19QRVJfUElYRUwpCisjZGVmaW5lIFVTQlZJU0lPTl9DTElQTUFTS19TSVpFCQkoTUFYX0ZSQU1FX1dJRFRIICogTUFYX0ZSQU1FX0hFSUdIVCAvIDgpIC8vYnl0ZXNpemUgb2YgY2xpcG1hc2sKKworI2RlZmluZSBVU0JWSVNJT05fVVJCX0ZSQU1FUwkJMzIKKyNkZWZpbmUgVVNCVklTSU9OX01BWF9JU09DX1BBQ0tFVF9TSVpFIAk5NTkJCQkvLyBOVDEwMDMgU3BlY3MgRG9jdW1lbnQgc2F5cyAxMDIzCisKKyNkZWZpbmUgVVNCVklTSU9OX05VTV9IRUFERVJNQVJLRVIJMjAKKyNkZWZpbmUgVVNCVklTSU9OX05VTUZSQU1FUwkJMyAgLyogTWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIGFuIGFwcGxpY2F0aW9uIGNhbiBnZXQgKi8KKyNkZWZpbmUgVVNCVklTSU9OX05VTVNCVUYJCTIgLyogRGltZW5zaW9uaW5nIHRoZSBVU0IgUyBidWZmZXJpbmcgKi8KKworI2RlZmluZSBVU0JWSVNJT05fUE9XRVJPRkZfVElNRQkJMyAqIChIWikJCS8vIDMgc2Vjb25kcworCisKKyNkZWZpbmUgRlJBTUVSQVRFX01JTgkwCisjZGVmaW5lIEZSQU1FUkFURV9NQVgJMzEKKworZW51bSB7CisJSVNPQ19NT0RFX1lVVjQyMiA9IDB4MDMsCisJSVNPQ19NT0RFX1lVVjQyMCA9IDB4MTQsCisJSVNPQ19NT0RFX0NPTVBSRVNTID0gMHg2MCwKK307CisKKy8qIFRoaXMgbWFjcm8gcmVzdHJpY3RzIGFuIGludCB2YXJpYWJsZSB0byBhbiBpbmNsdXNpdmUgcmFuZ2UgKi8KKyNkZWZpbmUgUkVTVFJJQ1RfVE9fUkFOR0UodixtaSxtYSkgeyBpZiAoKHYpIDwgKG1pKSkgKHYpID0gKG1pKTsgZWxzZSBpZiAoKHYpID4gKG1hKSkgKHYpID0gKG1hKTsgfQorCisvKgorICogV2UgdXNlIG1hY3JvcyB0byBkbyBZVVYgLT4gUkdCIGNvbnZlcnNpb24gYmVjYXVzZSB0aGlzIGlzCisgKiB2ZXJ5IGltcG9ydGFudCBmb3Igc3BlZWQgYW5kIHRvdGFsbHkgdW5pbXBvcnRhbnQgZm9yIHNpemUuCisgKgorICogWVVWIC0+IFJHQiBDb252ZXJzaW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBCID0gMS4xNjQqKFktMTYpCQkgICAgKyAyLjAxOCooVi0xMjgpCisgKiBHID0gMS4xNjQqKFktMTYpIC0gMC44MTMqKFUtMTI4KSAtIDAuMzkxKihWLTEyOCkKKyAqIFIgPSAxLjE2NCooWS0xNikgKyAxLjU5NiooVS0xMjgpCisgKgorICogSWYgeW91IGZhbmN5IGludGVnZXIgYXJpdGhtZXRpY3MgKGFzIHlvdSBzaG91bGQpLCBoZWFyIHRoaXM6CisgKgorICogNjU1MzYqQiA9IDc2Mjg0KihZLTE2KQkJICArIDEzMjI1MiooVi0xMjgpCisgKiA2NTUzNipHID0gNzYyODQqKFktMTYpIC0gIDUzMjgxKihVLTEyOCkgLSAgMjU2MjUqKFYtMTI4KQorICogNjU1MzYqUiA9IDc2Mjg0KihZLTE2KSArIDEwNDU5NSooVS0xMjgpCisgKgorICogTWFrZSBzdXJlIHRoZSBvdXRwdXQgdmFsdWVzIGFyZSB3aXRoaW4gWzAuLjI1NV0gcmFuZ2UuCisgKi8KKyNkZWZpbmUgTElNSVRfUkdCKHgpICgoKHgpIDwgMCkgPyAwIDogKCgoeCkgPiAyNTUpID8gMjU1IDogKHgpKSkKKyNkZWZpbmUgWVVWX1RPX1JHQl9CWV9USEVfQk9PSyhteSxtdSxtdixtcixtZyxtYikgeyBcCisgICAgaW50IG1tX3ksIG1tX3ljLCBtbV91LCBtbV92LCBtbV9yLCBtbV9nLCBtbV9iOyBcCisgICAgbW1feSA9IChteSkgLSAxNjsgIFwKKyAgICBtbV91ID0gKG11KSAtIDEyODsgXAorICAgIG1tX3YgPSAobXYpIC0gMTI4OyBcCisgICAgbW1feWM9IG1tX3kgKiA3NjI4NDsgXAorICAgIG1tX2IgPSAobW1feWMJCSsgMTMyMjUyKm1tX3YJKSA+PiAxNjsgXAorICAgIG1tX2cgPSAobW1feWMgLSAgNTMyODEqbW1fdSAtICAyNTYyNSptbV92CSkgPj4gMTY7IFwKKyAgICBtbV9yID0gKG1tX3ljICsgMTA0NTk1Km1tX3UJCQkpID4+IDE2OyBcCisgICAgbWIgPSBMSU1JVF9SR0IobW1fYik7IFwKKyAgICBtZyA9IExJTUlUX1JHQihtbV9nKTsgXAorICAgIG1yID0gTElNSVRfUkdCKG1tX3IpOyBcCit9CisKKy8qIERlYnVnZ2luZyBhaWQgKi8KKyNkZWZpbmUgVVNCVklTSU9OX1NBWV9BTkRfV0FJVCh3aGF0KSB7IFwKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsgXAorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndxKTsgXAorCXByaW50ayhLRVJOX0lORk8gIlNheTogJXNcbiIsIHdoYXQpOyBcCisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0ICgmd3EsIEhaKjMpOyBcCit9CisKKy8qCisgKiBUaGlzIG1hY3JvIGNoZWNrcyBpZiB1c2J2aXNpb24gaXMgc3RpbGwgb3BlcmF0aW9uYWwuIFRoZSAndXNidmlzaW9uJworICogcG9pbnRlciBtdXN0IGJlIHZhbGlkLCB1c2J2aXNpb24tPmRldiBtdXN0IGJlIHZhbGlkLCB3ZSBhcmUgbm90CisgKiByZW1vdmluZyB0aGUgZGV2aWNlIGFuZCB0aGUgZGV2aWNlIGhhcyBub3QgZXJyZWQgb24gdXMuCisgKi8KKyNkZWZpbmUgVVNCVklTSU9OX0lTX09QRVJBVElPTkFMKHVkZXZpY2UpIChcCisJKHVkZXZpY2UgIT0gTlVMTCkgJiYgXAorCSgodWRldmljZSktPmRldiAhPSBOVUxMKSAmJiBcCisJKCh1ZGV2aWNlKS0+bGFzdF9lcnJvciA9PSAwKSAmJiBcCisJKCEodWRldmljZSktPnJlbW92ZV9wZW5kaW5nKSkKKworLyogSTJDIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBpMmNfYWxnb191c2JfZGF0YSB7CisJdm9pZCAqZGF0YTsJCS8qIHByaXZhdGUgZGF0YSBmb3IgbG93bGV2ZWwgcm91dGluZXMgKi8KKwlpbnQgKCppbmIpICh2b2lkICpkYXRhLCB1bnNpZ25lZCBjaGFyIGFkZHIsIGNoYXIgKmJ1Ziwgc2hvcnQgbGVuKTsKKwlpbnQgKCpvdXRiKSAodm9pZCAqZGF0YSwgdW5zaWduZWQgY2hhciBhZGRyLCBjaGFyICpidWYsIHNob3J0IGxlbik7CisKKwkvKiBsb2NhbCBzZXR0aW5ncyAqLworCWludCB1ZGVsYXk7CisJaW50IG1kZWxheTsKKwlpbnQgdGltZW91dDsKK307CisKKyNkZWZpbmUgSTJDX1VTQl9BREFQX01BWAkxNgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdXNidmlzaW9uIHZpZGVvIHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitlbnVtIFNjYW5TdGF0ZSB7CisJU2NhblN0YXRlX1NjYW5uaW5nLAkvKiBTY2FubmluZyBmb3IgaGVhZGVyICovCisJU2NhblN0YXRlX0xpbmVzCQkvKiBQYXJzaW5nIGxpbmVzICovCit9OworCisvKiBDb21wbGV0aW9uIHN0YXRlcyBvZiB0aGUgZGF0YSBwYXJzZXIgKi8KK2VudW0gUGFyc2VTdGF0ZSB7CisJUGFyc2VTdGF0ZV9Db250aW51ZSwJLyogSnVzdCBwYXJzZSBuZXh0IGl0ZW0gKi8KKwlQYXJzZVN0YXRlX05leHRGcmFtZSwJLyogRnJhbWUgZG9uZSwgc2VuZCBpdCB0byBWNEwgKi8KKwlQYXJzZVN0YXRlX091dCwJCS8qIE5vdCBlbm91Z2ggZGF0YSBmb3IgZnJhbWUgKi8KKwlQYXJzZVN0YXRlX0VuZFBhcnNlCS8qIEVuZCBwYXJzaW5nICovCit9OworCitlbnVtIEZyYW1lU3RhdGUgeworCUZyYW1lU3RhdGVfVW51c2VkLAkvKiBVbnVzZWQgKG5vIE1DQVBUVVJFKSAqLworCUZyYW1lU3RhdGVfUmVhZHksCS8qIFJlYWR5IHRvIHN0YXJ0IGdyYWJiaW5nICovCisJRnJhbWVTdGF0ZV9HcmFiYmluZywJLyogSW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZ3JhYmJlZCBpbnRvICovCisJRnJhbWVTdGF0ZV9Eb25lLAkvKiBGaW5pc2hlZCBncmFiYmluZywgYnV0IG5vdCBiZWVuIHN5bmNlZCB5ZXQgKi8KKwlGcmFtZVN0YXRlX0RvbmVIb2xkLAkvKiBBcmUgc3luY2luZyBvciByZWFkaW5nICovCisJRnJhbWVTdGF0ZV9FcnJvciwJLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCB3aGlsZSBwcm9jZXNzaW5nICovCit9OworCisvKiBzdHJlYW0gc3RhdGVzICovCitlbnVtIFN0cmVhbVN0YXRlIHsKKwlTdHJlYW1fT2ZmLAkJLyogRHJpdmVyIHN0cmVhbWluZyBpcyBjb21wbGV0ZWx5IE9GRiAqLworCVN0cmVhbV9JZGxlLAkJLyogRHJpdmVyIHN0cmVhbWluZyBpcyByZWFkeSB0byBiZSBwdXQgT04gYnkgdGhlIGFwcGxpY2F0aW9uICovCisJU3RyZWFtX0ludGVycnVwdCwJLyogRHJpdmVyIHN0cmVhbWluZyBtdXN0IGJlIGludGVycnVwdGVkICovCisJU3RyZWFtX09uLAkJLyogRHJpdmVyIHN0cmVhbWluZyBpcyBwdXQgT04gYnkgdGhlIGFwcGxpY2F0aW9uICovCit9OworCitlbnVtIElzb2NTdGF0ZSB7CisJSXNvY1N0YXRlX0luRnJhbWUsCS8qIElzb2MgcGFja2V0IGlzIG1lbWJlciBvZiBmcmFtZSAqLworCUlzb2NTdGF0ZV9Ob0ZyYW1lLAkvKiBJc29jIHBhY2tldCBpcyBub3QgbWVtYmVyIG9mIGFueSBmcmFtZSAqLworfTsKKworc3RydWN0IHVzYl9kZXZpY2U7CisKK3N0cnVjdCB1c2J2aXNpb25fc2J1ZiB7CisJY2hhciAqZGF0YTsKKwlzdHJ1Y3QgdXJiICp1cmI7Cit9OworCisjZGVmaW5lIFVTQlZJU0lPTl9NQUdJQ18xICAgICAgCQkJMHg1NQorI2RlZmluZSBVU0JWSVNJT05fTUFHSUNfMiAgICAgIAkJCTB4QUEKKyNkZWZpbmUgVVNCVklTSU9OX0hFQURFUl9MRU5HVEgJCQkweDBjCisjZGVmaW5lIFVTQlZJU0lPTl9TQUE3MTExX0FERFIJCQkweDQ4CisjZGVmaW5lIFVTQlZJU0lPTl9TQUE3MTEzX0FERFIJCQkweDRhCisjZGVmaW5lIFVTQlZJU0lPTl9JSUNfTFJBQ0sJCQkweDIwCisjZGVmaW5lIFVTQlZJU0lPTl9JSUNfTFJOQUNLCQkJMHgzMAorI2RlZmluZSBVU0JWSVNJT05fRlJBTUVfRk9STUFUX1BBUkFNX0lOVFJBCSgxPDw3KQorCitzdHJ1Y3QgdXNidmlzaW9uX3Y0bDJfZm9ybWF0X3N0IHsKKwlpbnQJCXN1cHBvcnRlZDsKKwlpbnQJCWJ5dGVzX3Blcl9waXhlbDsKKwlpbnQJCWRlcHRoOworCWludAkJZm9ybWF0OworCWNoYXIJCSpkZXNjOworfTsKKyNkZWZpbmUgVVNCVklTSU9OX1NVUFBPUlRFRF9QQUxFVFRFUyBBUlJBWV9TSVpFKHVzYnZpc2lvbl92NGwyX2Zvcm1hdCkKKworc3RydWN0IHVzYnZpc2lvbl9mcmFtZV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgbWFnaWNfMTsJCQkJLyogMCBtYWdpYyAqLworCXVuc2lnbmVkIGNoYXIgbWFnaWNfMjsJCQkJLyogMSAgbWFnaWMgKi8KKwl1bnNpZ25lZCBjaGFyIGhlYWRlckxlbmd0aDsJCQkvKiAyICovCisJdW5zaWduZWQgY2hhciBmcmFtZU51bTsJCQkJLyogMyAqLworCXVuc2lnbmVkIGNoYXIgZnJhbWVQaGFzZTsJCQkvKiA0ICovCisJdW5zaWduZWQgY2hhciBmcmFtZUxhdGVuY3k7CQkJLyogNSAqLworCXVuc2lnbmVkIGNoYXIgZGF0YUZvcm1hdDsJCQkvKiA2ICovCisJdW5zaWduZWQgY2hhciBmb3JtYXRQYXJhbTsJCQkvKiA3ICovCisJdW5zaWduZWQgY2hhciBmcmFtZVdpZHRoTG87CQkJLyogOCAqLworCXVuc2lnbmVkIGNoYXIgZnJhbWVXaWR0aEhpOwkJCS8qIDkgKi8KKwl1bnNpZ25lZCBjaGFyIGZyYW1lSGVpZ2h0TG87CQkJLyogMTAgKi8KKwl1bnNpZ25lZCBjaGFyIGZyYW1lSGVpZ2h0SGk7CQkJLyogMTEgKi8KKwlfX3UxNiBmcmFtZVdpZHRoOwkJCQkvKiA4IC0gOSBhZnRlciBlbmRpYW4gY29ycmVjdGlvbiovCisJX191MTYgZnJhbWVIZWlnaHQ7CQkJCS8qIDEwIC0gMTEgYWZ0ZXIgZW5kaWFuIGNvcnJlY3Rpb24qLworfTsKKworLyogdHZub3JtcyAqLworc3RydWN0IHVzYnZpc2lvbl90dm5vcm0geworCWNoYXIgKm5hbWU7CisJdjRsMl9zdGRfaWQgaWQ7CisJLyogbW9kZSBmb3Igc2FhNzExM2ggKi8KKwlpbnQgbW9kZTsKK307CisKK3N0cnVjdCB1c2J2aXNpb25fZnJhbWUgeworCWNoYXIgKmRhdGE7CQkJCQkvKiBGcmFtZSBidWZmZXIgKi8KKwlzdHJ1Y3QgdXNidmlzaW9uX2ZyYW1lX2hlYWRlciBpc29jSGVhZGVyOwkvKiBIZWFkZXIgZnJvbSBzdHJlYW0gKi8KKworCWludCB3aWR0aDsJCQkJCS8qIFdpZHRoIGFwcGxpY2F0aW9uIGlzIGV4cGVjdGluZyAqLworCWludCBoZWlnaHQ7CQkJCQkvKiBIZWlnaHQgKi8KKwlpbnQgaW5kZXg7CQkJCQkvKiBGcmFtZSBpbmRleCAqLworCWludCBmcm13aWR0aDsJCQkJCS8qIFdpZHRoIHRoZSBmcmFtZSBhY3R1YWxseSBpcyAqLworCWludCBmcm1oZWlnaHQ7CQkJCQkvKiBIZWlnaHQgKi8KKworCXZvbGF0aWxlIGludCBncmFic3RhdGU7CQkJCS8qIFN0YXRlIG9mIGdyYWJiaW5nICovCisJaW50IHNjYW5zdGF0ZTsJCQkJCS8qIFN0YXRlIG9mIHNjYW5uaW5nICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyYW1lOworCisJaW50IGN1cmxpbmU7CQkJCQkvKiBMaW5lIG9mIGZyYW1lIHdlJ3JlIHdvcmtpbmcgb24gKi8KKworCWxvbmcgc2Nhbmxlbmd0aDsJCQkJLyogdW5jb21wcmVzc2VkLCByYXcgZGF0YSBsZW5ndGggb2YgZnJhbWUgKi8KKwlsb25nIGJ5dGVzX3JlYWQ7CQkJCS8qIGFtb3VudCBvZiBzY2FubGVuZ3RoIHRoYXQgaGFzIGJlZW4gcmVhZCBmcm9tIGRhdGEgKi8KKwlzdHJ1Y3QgdXNidmlzaW9uX3Y0bDJfZm9ybWF0X3N0IHY0bDJfZm9ybWF0OwkvKiBmb3JtYXQgdGhlIHVzZXIgbmVlZHMqLworCWludCB2NGwyX2xpbmVzaXplOwkJCQkvKiBieXRlcyBmb3Igb25lIHZpZGVvbGluZSovCisJc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOworCWludCBzZXF1ZW5jZTsJCQkJCS8vIEhvdyBtYW55IHZpZGVvIGZyYW1lcyB3ZSBzZW5kIHRvIHVzZXIKK307CisKKyNkZWZpbmUgQ09ERUNfU0FBNzExMwk3MTEzCisjZGVmaW5lIENPREVDX1NBQTcxMTEJNzExMQorI2RlZmluZSBCUklER0VfTlQxMDAzCTEwMDMKKyNkZWZpbmUgQlJJREdFX05UMTAwNAkxMDA0CisjZGVmaW5lIEJSSURHRV9OVDEwMDUgICAxMDA1CisKK3N0cnVjdCB1c2J2aXNpb25fZGV2aWNlX2RhdGFfc3QgeworCWludCBpZFZlbmRvcjsKKwlpbnQgaWRQcm9kdWN0OworCWludCBJbnRlcmZhY2U7IC8qIHRvIGhhbmRsZSBzcGVjaWFsIGludGVyZmFjZSBudW1iZXIgbGlrZSBCRUxLSU4gYW5kIEhhdXBwYXVnZSBXaW5UVi1VU0IgSUkgKi8KKwlpbnQgQ29kZWM7CisJaW50IFZpZGVvQ2hhbm5lbHM7CisJX191NjQgVmlkZW9Ob3JtOworCWludCBBdWRpb0NoYW5uZWxzOworCWludCBSYWRpbzsKKwlpbnQgdmJpOworCWludCBUdW5lcjsKKwlpbnQgVHVuZXJUeXBlOworCWludCBWaW5fUmVnMTsKKwlpbnQgVmluX1JlZzI7CisJaW50IFhfT2Zmc2V0OworCWludCBZX09mZnNldDsKKwlpbnQgRHZpX3l1djsKKwljaGFyICpNb2RlbFN0cmluZzsKK307CisKKy8qIERlY2xhcmVkIG9uIHVzYnZpc2lvbi1jYXJkcy5jICovCitleHRlcm4gc3RydWN0IHVzYnZpc2lvbl9kZXZpY2VfZGF0YV9zdCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbXTsKK2V4dGVybiBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2J2aXNpb25fdGFibGVbXTsKKworc3RydWN0IHVzYl91c2J2aXNpb24geworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7ICAgICAgICAgCQkJCS8qIFZpZGVvIERldmljZSAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnJkZXY7ICAgICAgICAgICAgICAgCQkJLyogUmFkaW8gRGV2aWNlICovCisJc3RydWN0IHZpZGVvX2RldmljZSAqdmJpOyAJCQkJCS8qIFZCSSBEZXZpY2UgICAqLworCisJLyogaTJjIERlY2xhcmF0aW9uIFNlY3Rpb24qLworCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcDsKKwlzdHJ1Y3QgaTJjX2FsZ29fdXNiX2RhdGEgaTJjX2FsZ287CisJc3RydWN0IGkyY19jbGllbnQgaTJjX2NsaWVudDsKKworCXN0cnVjdCB1cmIgKmN0cmxVcmI7CisJdW5zaWduZWQgY2hhciBjdHJsVXJiQnVmZmVyWzhdOworCWludCBjdHJsVXJiQnVzeTsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGN0cmxVcmJTZXR1cDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBjdHJsVXJiX3dxOwkJCQkJLy8gUHJvY2Vzc2VzIHdhaXRpbmcKKwlzdHJ1Y3Qgc2VtYXBob3JlIGN0cmxVcmJMb2NrOworCisJLyogY29uZmlndXJhdGlvbiBwYXJ0ICovCisJaW50IGhhdmVfdHVuZXI7CisJaW50IHR1bmVyX3R5cGU7CisJaW50IHR1bmVyX2FkZHI7CisJaW50IGJyaWRnZVR5cGU7CQkJCQkJCS8vIE5UMTAwMywgTlQxMDA0LCBOVDEwMDUKKwlpbnQgY2hhbm5lbDsKKwlpbnQgcmFkaW87CisJaW50IHZpZGVvX2lucHV0czsJCQkJCQkvLyAjIG9mIGlucHV0cworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKwlpbnQgQXVkaW9NdXRlOworCWludCBBdWRpb0NoYW5uZWw7CisJaW50IGlzb2NNb2RlOwkJCQkJCQkvLyBmb3JtYXQgb2YgdmlkZW8gZGF0YSBmb3IgdGhlIHVzYiBpc29jLXRyYW5zZmVyCisJdW5zaWduZWQgaW50IG5yOwkJCQkJCS8vIE51bWJlciBvZiB0aGUgZGV2aWNlCisKKwkvKiBEZXZpY2Ugc3RydWN0dXJlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBjaGFyIGlmYWNlOwkJCQkJCS8qIFZpZGVvIGludGVyZmFjZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGlmYWNlQWx0QWN0aXZlLCBpZmFjZUFsdEluYWN0aXZlOwkJCS8qIEFsdCBzZXR0aW5ncyAqLworCXVuc2lnbmVkIGNoYXIgVmluX1JlZzJfUHJlc2V0OworCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBwb3dlck9mZlRpbWVyOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwb3dlck9mZldvcms7CisJaW50IHBvd2VyOwkJCQkJCQkvKiBpcyB0aGUgZGV2aWNlIHBvd2VyZWQgb24/ICovCisJaW50IHVzZXI7CQkJCQkJCS8qIHVzZXIgY291bnQgZm9yIGV4Y2x1c2l2ZSB1c2UgKi8KKwlpbnQgaW5pdGlhbGl6ZWQ7CQkJCQkJLyogSGFkIHdlIGFscmVhZHkgc2VudCBpbml0IHNlcXVlbmNlPyAqLworCWludCBEZXZNb2RlbDsJCQkJCQkJLyogV2hhdCB0eXBlIG9mIFVTQlZJU0lPTiBkZXZpY2Ugd2UgZ290PyAqLworCWVudW0gU3RyZWFtU3RhdGUgc3RyZWFtaW5nOwkJCQkJLyogQXJlIHdlIHN0cmVhbWluZyBJc29jaHJvbm91cz8gKi8KKwlpbnQgbGFzdF9lcnJvcjsJCQkJCQkJLyogV2hhdCBjYWxhbWl0eSBzdHJ1Y2sgdXM/ICovCisJaW50IGN1cndpZHRoOwkJCQkJCQkvKiB3aWR0aCBvZiB0aGUgZnJhbWUgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgc2V0IHRvKi8KKwlpbnQgY3VyaGVpZ2h0OyAgICAgIAkJCQkJCS8qIGhlaWdodCBvZiB0aGUgZnJhbWUgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgc2V0IHRvKi8KKwlpbnQgc3RyZXRjaF93aWR0aDsJCQkJCQkvKiBzdHJldGNoLWZhY3RvciBmb3IgZnJhbWUgd2lkdGggKGZyb20gdXNiIHRvIHNjcmVlbikqLworCWludCBzdHJldGNoX2hlaWdodDsJCQkJCQkvKiBzdHJldGNoLWZhY3RvciBmb3IgZnJhbWUgaGVpZ2h0IChmcm9tIHVzYiB0byBzY3JlZW4pKi8KKwljaGFyICpmYnVmOwkJCQkJCQkvKiBWaWRlb2RldiBidWZmZXIgYXJlYSBmb3IgbW1hcCovCisJaW50IG1heF9mcmFtZV9zaXplOwkJCQkJCS8qIEJ5dGVzIGluIG9uZSB2aWRlbyBmcmFtZSAqLworCWludCBmYnVmX3NpemU7CQkJCQkJCS8qIFZpZGVvZGV2IGJ1ZmZlciBzaXplICovCisJc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOwkJCQkJCS8qIHNwaW5sb2NrIGZvciBwcm90ZWN0aW5nIG1vZHMgb24gaW5xdWV1ZSBhbmQgb3V0cXVldWUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlucXVldWUsIG91dHF1ZXVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXVldWVkIGZyYW1lIGxpc3QgYW5kIHJlYWR5IHRvIGRlcXVldWUgZnJhbWUgbGlzdCAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfZnJhbWU7CQkJCQkvKiBQcm9jZXNzZXMgd2FpdGluZyAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfc3RyZWFtOwkJCQkJLyogUHJvY2Vzc2VzIHdhaXRpbmcgKi8KKwlzdHJ1Y3QgdXNidmlzaW9uX2ZyYW1lICpjdXJGcmFtZTsJCQkJLy8gcG9pbnRlciB0byBjdXJyZW50IGZyYW1lLCBzZXQgYnkgdXNidmlzaW9uX2ZpbmRfaGVhZGVyCisJc3RydWN0IHVzYnZpc2lvbl9mcmFtZSBmcmFtZVtVU0JWSVNJT05fTlVNRlJBTUVTXTsJCS8vIGZyYW1lIGJ1ZmZlcgorCXN0cnVjdCB1c2J2aXNpb25fc2J1ZiBzYnVmW1VTQlZJU0lPTl9OVU1TQlVGXTsJCQkvLyBTIGJ1ZmZlcmluZworCXZvbGF0aWxlIGludCByZW1vdmVfcGVuZGluZzsJCQkJCS8qIElmIHNldCB0aGVuIGFib3V0IHRvIGV4aXQgKi8KKworCS8qIFNjcmF0Y2ggc3BhY2UgZnJvbSB0aGUgSXNvY2hyb25vdXMgUGlwZS4qLworCXVuc2lnbmVkIGNoYXIgKnNjcmF0Y2g7CisJaW50IHNjcmF0Y2hfcmVhZF9wdHI7CisJaW50IHNjcmF0Y2hfd3JpdGVfcHRyOworCWludCBzY3JhdGNoX2hlYWRlcm1hcmtlcltVU0JWSVNJT05fTlVNX0hFQURFUk1BUktFUl07CisJaW50IHNjcmF0Y2hfaGVhZGVybWFya2VyX3JlYWRfcHRyOworCWludCBzY3JhdGNoX2hlYWRlcm1hcmtlcl93cml0ZV9wdHI7CisJZW51bSBJc29jU3RhdGUgaXNvY3N0YXRlOworCXN0cnVjdCB1c2J2aXNpb25fdjRsMl9mb3JtYXRfc3QgcGFsZXR0ZTsKKworCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgdmNhcDsJCQkJCS8qIFZpZGVvIGNhcGFiaWxpdGllcyAqLworCXVuc2lnbmVkIGludCBjdGxfaW5wdXQ7CQkJCQkJLyogc2VsZWN0ZWQgaW5wdXQgKi8KKwlzdHJ1Y3QgdXNidmlzaW9uX3R2bm9ybSAqdHZub3JtOwkJCQkvKiBzZWxlY3RlZCB0diBub3JtICovCisJdW5zaWduZWQgY2hhciB2aWRlb19lbmRwOwkJCQkJLyogMHg4MiBmb3IgVVNCVklTSU9OIGRldmljZXMgYmFzZWQgKi8KKworCS8vIERlY29tcHJlc3Npb24gc3R1ZmY6CisJdW5zaWduZWQgY2hhciAqSW50cmFGcmFtZUJ1ZmZlcjsJCQkJLyogQnVmZmVyIGZvciByZWZlcmVuY2UgZnJhbWUgKi8KKwlpbnQgQmxvY2tQb3M7IAkJCQkJCQkvL2ZvciB0ZXN0IG9ubHkKKwlpbnQgcmVxdWVzdEludHJhOwkJCQkJCS8vIDAgPSBub3JtYWw7IDEgPSBpbnRyYSBmcmFtZSBpcyByZXF1ZXN0ZWQ7CisJaW50IGxhc3RJc29jRnJhbWVOdW07CQkJCQkJLy8gY2hlY2sgZm9yIGxvc3QgaXNvYyBmcmFtZXMKKwlpbnQgaXNvY1BhY2tldFNpemU7CQkJCQkJLy8gbmVlZCB0byBjYWxjdWxhdGUgdXNlZEJhbmR3aWR0aAorCWludCB1c2VkQmFuZHdpZHRoOwkJCQkJCS8vIHVzZWQgYmFuZHdpZHRoIDAtMTAwJSwgbmVlZCB0byBzZXQgY29tcHJMZXZlbAorCWludCBjb21wckxldmVsOwkJCQkJCQkvLyBIb3cgc3Ryb25nICgxMDApIG9yIHdlYWsgKDApIGlzIGNvbXByZXNzaW9uCisJaW50IGxhc3RDb21wckxldmVsOwkJCQkJCS8vIEhvdyBzdHJvbmcgKDEwMCkgb3Igd2VhayAoMCkgd2FzIGNvbXByZXNzaW9uCisJaW50IHVzYl9iYW5kd2lkdGg7CQkJCQkJLyogTWJpdC9zICovCisKKwkvKiBTdGF0aXN0aWNzIHRoYXQgY2FuIGJlIG92ZXJsYXllZCBvbiB0aGUgc2NyZWVuICovCisJdW5zaWduZWQgbG9uZyBpc29jVXJiQ291bnQ7CQkJLy8gSG93IG1hbnkgVVJCcyB3ZSByZWNlaXZlZCBzbyBmYXIKKwl1bnNpZ25lZCBsb25nIHVyYl9sZW5ndGg7CQkJLyogTGVuZ3RoIG9mIGxhc3QgVVJCICovCisJdW5zaWduZWQgbG9uZyBpc29jRGF0YUNvdW50OwkJCS8qIEhvdyBtYW55IGJ5dGVzIHdlIHJlY2VpdmVkICovCisJdW5zaWduZWQgbG9uZyBoZWFkZXJfY291bnQ7CQkJLyogSG93IG1hbnkgZnJhbWUgaGVhZGVycyB3ZSBmb3VuZCAqLworCXVuc2lnbmVkIGxvbmcgc2NyYXRjaF9vdmZfY291bnQ7CQkvKiBIb3cgbWFueSB0aW1lcyB3ZSBvdmVyZmxvd2VkIHNjcmF0Y2ggKi8KKwl1bnNpZ25lZCBsb25nIGlzb2NTa2lwQ291bnQ7CQkJLyogSG93IG1hbnkgZW1wdHkgSVNPIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1bnNpZ25lZCBsb25nIGlzb2NFcnJDb3VudDsJCQkvKiBIb3cgbWFueSBiYWQgSVNPIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1bnNpZ25lZCBsb25nIGlzb2NQYWNrZXRDb3VudDsJCQkvLyBIb3cgbWFueSBwYWNrZXRzIHdlIHRvdGFsbHkgZ290CisJdW5zaWduZWQgbG9uZyB0aW1lSW5JcnE7CQkJLy8gSG93IGxvbmcgZG8gd2UgbmVlZCBmb3IgaW50ZXJydXB0CisJaW50IGlzb2NNZWFzdXJlQmFuZHdpZHRoQ291bnQ7CisJaW50IGZyYW1lX251bTsJCQkJCS8vIEhvdyBtYW55IHZpZGVvIGZyYW1lcyB3ZSBzZW5kIHRvIHVzZXIKKwlpbnQgbWF4U3RyaXBMZW47CQkJCS8vIEhvdyBiaWcgaXMgdGhlIGJpZ2dlc3Qgc3RyaXAKKwlpbnQgY29tcHJCbG9ja1BvczsKKwlpbnQgc3RyaXBMZW5FcnJvcnM7CQkJCS8vIEhvdyBtYW55IHRpbWVzIHdhcyBCbG9ja1BvcyBncmVhdGVyIHRoYW4gU3RyaXBMZW4KKwlpbnQgc3RyaXBNYWdpY0Vycm9yczsKKwlpbnQgc3RyaXBMaW5lTnVtYmVyRXJyb3JzOworCWludCBDb21wckJsb2NrVHlwZXNbNF07Cit9OworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZGVmaW5lZCBpbiB1c2J2aXNpb24taTJjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBpMmMtYWxnby11c2IgZGVjbGFyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgdXNidmlzaW9uX2kyY191c2JfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CitpbnQgdXNidmlzaW9uX2kyY191c2JfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaTJjX2dldF9hbGdvX3VzYl9kYXRhIChzdHJ1Y3QgaTJjX2FsZ29fdXNiX2RhdGEgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaTJjX3NldF9hbGdvX3VzYl9kYXRhIChzdHJ1Y3QgaTJjX2FsZ29fdXNiX2RhdGEgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlkZXYtPmRhdGEgPSBkYXRhOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB1c2J2aXNpb24gc3BlY2lmaWMgSTJDIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ludCB1c2J2aXNpb25faW5pdF9pMmMoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7Cit2b2lkIGNhbGxfaTJjX2NsaWVudHMoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgdW5zaWduZWQgaW50IGNtZCx2b2lkICphcmcpOworCisvKiBkZWZpbmVkIGluIHVzYnZpc2lvbi1jb3JlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkICp1c2J2aXNpb25fcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKTsKK3ZvaWQgdXNidmlzaW9uX3J2ZnJlZSh2b2lkICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitpbnQgdXNidmlzaW9uX3JlYWRfcmVnKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGNoYXIgcmVnKTsKK2ludCB1c2J2aXNpb25fd3JpdGVfcmVnKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJdW5zaWduZWQgY2hhciB2YWx1ZSk7CisKK2ludCB1c2J2aXNpb25fZnJhbWVzX2FsbG9jKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOwordm9pZCB1c2J2aXNpb25fZnJhbWVzX2ZyZWUoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7CitpbnQgdXNidmlzaW9uX3NjcmF0Y2hfYWxsb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7Cit2b2lkIHVzYnZpc2lvbl9zY3JhdGNoX2ZyZWUoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7CitpbnQgdXNidmlzaW9uX3NidWZfYWxsb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7Cit2b2lkIHVzYnZpc2lvbl9zYnVmX2ZyZWUoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7CitpbnQgdXNidmlzaW9uX2RlY29tcHJlc3NfYWxsb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7Cit2b2lkIHVzYnZpc2lvbl9kZWNvbXByZXNzX2ZyZWUoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7CisKK2ludCB1c2J2aXNpb25fc2V0dXAoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbixpbnQgZm9ybWF0KTsKK2ludCB1c2J2aXNpb25faW5pdF9pc29jKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOworaW50IHVzYnZpc2lvbl9yZXN0YXJ0X2lzb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7Cit2b2lkIHVzYnZpc2lvbl9zdG9wX2lzb2Moc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7CisKK2ludCB1c2J2aXNpb25fc2V0X2F1ZGlvKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIGludCBBdWRpb0NoYW5uZWwpOworaW50IHVzYnZpc2lvbl9hdWRpb19vZmYoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7CisKK2ludCB1c2J2aXNpb25fYmVnaW5fc3RyZWFtaW5nKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOwordm9pZCB1c2J2aXNpb25fZW1wdHlfZnJhbWVxdWV1ZXMoc3RydWN0IHVzYl91c2J2aXNpb24gKmRldik7CitpbnQgdXNidmlzaW9uX3N0cmVhbV9pbnRlcnJ1cHQoc3RydWN0IHVzYl91c2J2aXNpb24gKmRldik7CisKK2ludCB1c2J2aXNpb25fbXV4c2VsKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIGludCBjaGFubmVsKTsKK2ludCB1c2J2aXNpb25fc2V0X2lucHV0KHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOworaW50IHVzYnZpc2lvbl9zZXRfb3V0cHV0KHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKK3ZvaWQgdXNidmlzaW9uX2luaXRfcG93ZXJPZmZUaW1lcihzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKTsKK3ZvaWQgdXNidmlzaW9uX3NldF9wb3dlck9mZlRpbWVyKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOwordm9pZCB1c2J2aXNpb25fcmVzZXRfcG93ZXJPZmZUaW1lcihzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKTsKK2ludCB1c2J2aXNpb25fcG93ZXJfb2ZmKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOworaW50IHVzYnZpc2lvbl9wb3dlcl9vbihzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKTsKKworI2VuZGlmCQkJCQkJCQkJLyogX19MSU5VWF9VU0JWSVNJT05fSCAqLworCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwppbmRleCAxZDg5OWUyLi44YTEzZTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCkBAIC0zNTAsNiArMzUwLDcgQEAKIAkJc3RydWN0IHZpZGVvX2J1ZmZlcgkqYnVmZmVyID0gYXJnOwogCiAJCW1lbXNldChidWZmZXIsIDAsIHNpemVvZigqYnVmZmVyKSk7CisJCW1lbXNldCgmZmJ1ZjIsIDAsIHNpemVvZihmYnVmMikpOwogCiAJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfRkJVRiwgJmZidWYyKTsKIAkJaWYgKGVyciA8IDApIHsKQEAgLTYxNiw2ICs2MTcsNyBAQAogCWNhc2UgVklESU9DU1BJQ1Q6IC8qICBzZXQgdG9uZSBjb250cm9scyAmIHBhcnRpYWwgY2FwdHVyZSBmb3JtYXQgICovCiAJewogCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZQkqcGljdCA9IGFyZzsKKwkJbWVtc2V0KCZmYnVmMiwgMCwgc2l6ZW9mKGZidWYyKSk7CiAKIAkJc2V0X3Y0bF9jb250cm9sKGlub2RlLCBmaWxlLAogCQkJCVY0TDJfQ0lEX0JSSUdIVE5FU1MsIHBpY3QtPmJyaWdodG5lc3MsIGRydik7CkBAIC03MDgsMTIgKzcxMCwyMiBAQAogCX0KIAljYXNlIFZJRElPQ1NUVU5FUjogLyogIHNlbGVjdCBhIHR1bmVyIGlucHV0ICAqLwogCXsKLQkJZXJyID0gMDsKKwkJc3RydWN0IHZpZGVvX3R1bmVyCSp0dW4gPSBhcmc7CisJCXN0cnVjdCB2NGwyX3R1bmVyCXQ7CisJCW1lbXNldCgmdCwwLHNpemVvZih0KSk7CisKKwkJdC5pbmRleD10dW4tPnR1bmVyOworCisJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX1NfSU5QVVQsICZ0KTsKKwkJaWYgKGVyciA8IDApCisJCQlkcHJpbnRrKCJWSURJT0NTVFVORVIgLyBWSURJT0NfU19JTlBVVDogJWRcbiIsZXJyKTsKKwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NHRlJFUTogLyogIGdldCBmcmVxdWVuY3kgICovCiAJewogCQl1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOworCQltZW1zZXQoJmZyZXEyLDAsc2l6ZW9mKGZyZXEyKSk7CiAKIAkJZnJlcTIudHVuZXIgPSAwOwogCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX0ZSRVFVRU5DWSwgJmZyZXEyKTsKQEAgLTcyNiw4ICs3MzgsOCBAQAogCWNhc2UgVklESU9DU0ZSRVE6IC8qICBzZXQgZnJlcXVlbmN5ICAqLwogCXsKIAkJdW5zaWduZWQgbG9uZyAqZnJlcSA9IGFyZzsKKwkJbWVtc2V0KCZmcmVxMiwwLHNpemVvZihmcmVxMikpOwogCi0JCWZyZXEyLnR1bmVyID0gMDsKIAkJZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfR19GUkVRVUVOQ1ksICZmcmVxMik7CiAJCWZyZXEyLmZyZXF1ZW5jeSA9ICpmcmVxOwogCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0ZSRVFVRU5DWSwgJmZyZXEyKTsKQEAgLTczOCw2ICs3NTAsNyBAQAogCWNhc2UgVklESU9DR0FVRElPOiAvKiAgZ2V0IGF1ZGlvIHByb3BlcnRpZXMvY29udHJvbHMgICovCiAJewogCQlzdHJ1Y3QgdmlkZW9fYXVkaW8JKmF1ZCA9IGFyZzsKKwkJbWVtc2V0KCZhdWQyLDAsc2l6ZW9mKGF1ZDIpKTsKIAogCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19HX0FVRElPLCAmYXVkMik7CiAJCWlmIChlcnIgPCAwKSB7CkBAIC04OTgsNiArOTExLDcgQEAKIAl7CiAJCWludAkJCSppID0gYXJnOwogCisJCW1lbXNldCgmYnVmMiwwLHNpemVvZihidWYyKSk7CiAJCWJ1ZjIuaW5kZXggPSAqaTsKIAkJYnVmMi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19RVUVSWUJVRiwgJmJ1ZjIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCmluZGV4IDc4ZDI4YjAuLjc1MmM4MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKQEAgLTg3LDYgKzg3LDc4IEBACiAgKi8KIAogCitjaGFyICp2NGwyX25vcm1fdG9fbmFtZSh2NGwyX3N0ZF9pZCBpZCkKK3sKKwljaGFyICpuYW1lOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVjRMMl9TVERfUEFMOgorCQluYW1lPSJQQUwiOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9QQUxfQkc6CisJCW5hbWU9IlBBTC1CRyI7CQlicmVhazsKKwljYXNlIFY0TDJfU1REX1BBTF9ESzoKKwkJbmFtZT0iUEFMLURLIjsJCWJyZWFrOworCWNhc2UgVjRMMl9TVERfUEFMX0I6CisJCW5hbWU9IlBBTC1CIjsJCWJyZWFrOworCWNhc2UgVjRMMl9TVERfUEFMX0IxOgorCQluYW1lPSJQQUwtQjEiOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9QQUxfRzoKKwkJbmFtZT0iUEFMLUciOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9QQUxfSDoKKwkJbmFtZT0iUEFMLUgiOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9QQUxfSToKKwkJbmFtZT0iUEFMLUkiOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9QQUxfRDoKKwkJbmFtZT0iUEFMLUQiOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9QQUxfRDE6CisJCW5hbWU9IlBBTC1EMSI7CQlicmVhazsKKwljYXNlIFY0TDJfU1REX1BBTF9LOgorCQluYW1lPSJQQUwtSyI7CQlicmVhazsKKwljYXNlIFY0TDJfU1REX1BBTF9NOgorCQluYW1lPSJQQUwtTSI7CQlicmVhazsKKwljYXNlIFY0TDJfU1REX1BBTF9OOgorCQluYW1lPSJQQUwtTiI7CQlicmVhazsKKwljYXNlIFY0TDJfU1REX1BBTF9OYzoKKwkJbmFtZT0iUEFMLU5jIjsJCWJyZWFrOworCWNhc2UgVjRMMl9TVERfUEFMXzYwOgorCQluYW1lPSJQQUwtNjAiOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9OVFNDOgorCQluYW1lPSJOVFNDIjsJCWJyZWFrOworCWNhc2UgVjRMMl9TVERfTlRTQ19NOgorCQluYW1lPSJOVFNDLU0iOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9OVFNDX01fSlA6CisJCW5hbWU9Ik5UU0MtTS1KUCI7CWJyZWFrOworCWNhc2UgVjRMMl9TVERfTlRTQ180NDM6CisJCW5hbWU9Ik5UU0MtNDQzIjsJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9OVFNDX01fS1I6CisJCW5hbWU9Ik5UU0MtTS1LUiI7CWJyZWFrOworCWNhc2UgVjRMMl9TVERfU0VDQU06CisJCW5hbWU9IlNFQ0FNIjsJCWJyZWFrOworCWNhc2UgVjRMMl9TVERfU0VDQU1fREs6CisJCW5hbWU9IlNFQ0FNLURLIjsJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9TRUNBTV9COgorCQluYW1lPSJTRUNBTS1CIjsJCWJyZWFrOworCWNhc2UgVjRMMl9TVERfU0VDQU1fRDoKKwkJbmFtZT0iU0VDQU0tRCI7CQlicmVhazsKKwljYXNlIFY0TDJfU1REX1NFQ0FNX0c6CisJCW5hbWU9IlNFQ0FNLUciOwkJYnJlYWs7CisJY2FzZSBWNEwyX1NURF9TRUNBTV9IOgorCQluYW1lPSJTRUNBTS1IIjsJCWJyZWFrOworCWNhc2UgVjRMMl9TVERfU0VDQU1fSzoKKwkJbmFtZT0iU0VDQU0tSyI7CQlicmVhazsKKwljYXNlIFY0TDJfU1REX1NFQ0FNX0sxOgorCQluYW1lPSJTRUNBTS1LMSI7CWJyZWFrOworCWNhc2UgVjRMMl9TVERfU0VDQU1fTDoKKwkJbmFtZT0iU0VDQU0tTCI7CQlicmVhazsKKwljYXNlIFY0TDJfU1REX1NFQ0FNX0xDOgorCQluYW1lPSJTRUNBTS1MQyI7CWJyZWFrOworCWRlZmF1bHQ6CisJCW5hbWU9IlVua25vd24iOwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5hbWU7Cit9CisKIC8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiBhIHY0bDJfc3RhbmRhcmQgc3RydWN0dXJlIGFjY29yZGluZyB0byB0aGUKICAgICdpZCcgYW5kICd0cmFuc21pc3Npb24nIHBhcmFtZXRlcnMuICBSZXR1cm5zIG5lZ2F0aXZlIG9uIGVycm9yLiAgKi8KIGludCB2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RydWN0IHY0bDJfc3RhbmRhcmQgKnZzLApAQCAtMTg0LDExICsyNTYsMTMgQEAKIH07CiAKIGNoYXIgKnY0bDJfdHlwZV9uYW1lc1tdID0gewotCVtWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVdID0gInZpZGVvLWNhcCIsCi0JW1Y0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWV0gPSAidmlkZW8tb3ZlciIsCi0JW1Y0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUXSAgPSAidmlkZW8tb3V0IiwKLQlbVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRV0gICA9ICJ2YmktY2FwIiwKLQlbVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUXSAgICA9ICJ2Ymktb3V0IiwKKwlbVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXSAgICAgID0gInZpZGVvLWNhcCIsCisJW1Y0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWV0gICAgICA9ICJ2aWRlby1vdmVyIiwKKwlbVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRdICAgICAgID0gInZpZGVvLW91dCIsCisJW1Y0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkVdICAgICAgICA9ICJ2YmktY2FwIiwKKwlbVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUXSAgICAgICAgID0gInZiaS1vdXQiLAorCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRV0gPSAic2xpY2VkLXZiaS1jYXAiLAorCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUXSAgPSAic2xpY2VjLXZiaS1vdXQiLAogfTsKIAogc3RhdGljIGNoYXIgKnY0bDJfbWVtb3J5X25hbWVzW10gPSB7CkBAIC0xNDUxLDYgKzE1MjUsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCitFWFBPUlRfU1lNQk9MKHY0bDJfbm9ybV90b19uYW1lKTsKIEVYUE9SVF9TWU1CT0wodjRsMl92aWRlb19zdGRfY29uc3RydWN0KTsKIAogRVhQT1JUX1NZTUJPTCh2NGwyX3ByaW9faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jCmluZGV4IGY1M2VkZjEuLmZjYzU0NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYtZHZiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9jb2RlYy5jCmluZGV4IDJhZTNmYjIuLjI5MGU2NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9jb2RlYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9jb2RlYy5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAkJc2l6ZSk7CiAKIAlrZnJlZSh2aWRlb2NvZGVjX2J1Zik7Ci0JdmlkZW9jb2RlY19idWYgPSAoY2hhciAqKSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCXZpZGVvY29kZWNfYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAogCWkgPSAwOwogCWkgKz0gc2NucHJpbnRmKHZpZGVvY29kZWNfYnVmICsgaSwgc2l6ZSAtIDEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKaW5kZXggNDc5YTA2Ny4uNmEwZThjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYwpAQCAtMTcsMTAgKzE3LDExIEBACiAgKi8KIAogI2RlZmluZSBkYmdhcmcoY21kLCBmbXQsIGFyZy4uLikgXAotCQlpZiAodmZkLT5kZWJ1ZyAmIFY0TDJfREVCVUdfSU9DVExfQVJHKQkJCVwKKwkJaWYgKHZmZC0+ZGVidWcgJiBWNEwyX0RFQlVHX0lPQ1RMX0FSRykgewkJXAogCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogIiwgIHZmZC0+bmFtZSk7CQlcCiAJCQl2NGxfcHJpbnRrX2lvY3RsKGNtZCk7CQkJCVwKLQkJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCB2ZmQtPm5hbWUsICMjIGFyZyk7CisJCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgdmZkLT5uYW1lLCAjIyBhcmcpOyBcCisJCX0KIAogI2RlZmluZSBkYmdhcmcyKGZtdCwgYXJnLi4uKSBcCiAJCWlmICh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpCQkJXApAQCAtMTA0LDcgKzEwNSw3IEBACiAKIHN0cnVjdCB2aWRlb19kZXZpY2UqIHZpZGVvX2RldmRhdGEoc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHZpZGVvX2RldmljZVtpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpXTsKKwlyZXR1cm4gdmlkZW9fZGV2aWNlW2ltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKV07CiB9CiAKIC8qCkBAIC0zNDEsNyArMzQyLDcgQEAKIAogCWRiZ2FyZyAoY21kLCAiJTAybGQ6JTAyZDolMDJkLiUwOGxkIGluZGV4PSVkLCB0eXBlPSVzLCAiCiAJCSJieXRlc3VzZWQ9JWQsIGZsYWdzPTB4JTA4ZCwgIgotCQkiZmllbGQ9JTBkLCBzZXF1ZW5jZT0lZCwgbWVtb3J5PSVzLCBvZmZzZXQvdXNlcnB0cj0weCUwOGx4XG4iLAorCQkiZmllbGQ9JTBkLCBzZXF1ZW5jZT0lZCwgbWVtb3J5PSVzLCBvZmZzZXQvdXNlcnB0cj0weCUwOGx4LCBsZW5ndGg9JWRcbiIsCiAJCQkocC0+dGltZXN0YW1wLnR2X3NlYy8zNjAwKSwKIAkJCShpbnQpKHAtPnRpbWVzdGFtcC50dl9zZWMvNjApJTYwLAogCQkJKGludCkocC0+dGltZXN0YW1wLnR2X3NlYyU2MCksCkBAIC0zNTEsNyArMzUyLDcgQEAKIAkJCXAtPmJ5dGVzdXNlZCxwLT5mbGFncywKIAkJCXAtPmZpZWxkLHAtPnNlcXVlbmNlLAogCQkJcHJ0X25hbWVzKHAtPm1lbW9yeSx2NGwyX21lbW9yeV9uYW1lcyksCi0JCQlwLT5tLnVzZXJwdHIpOworCQkJcC0+bS51c2VycHRyLCBwLT5sZW5ndGgpOwogCWRiZ2FyZzIgKCJ0aW1lY29kZT0gJTAyZDolMDJkOiUwMmQgdHlwZT0lZCwgIgogCQkiZmxhZ3M9MHglMDhkLCBmcmFtZXM9JWQsIHVzZXJiaXRzPTB4JTA4eFxuIiwKIAkJCXRjLT5ob3Vycyx0Yy0+bWludXRlcyx0Yy0+c2Vjb25kcywKQEAgLTM2OCw5ICszNjksMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB2NGxfcHJpbnRfcGl4X2ZtdCAoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAogCQkJCQkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqZm10KQogewotCWRiZ2FyZzIgKCJ3aWR0aD0lZCwgaGVpZ2h0PSVkLCBmb3JtYXQ9MHglMDh4LCBmaWVsZD0lcywgIgorCWRiZ2FyZzIgKCJ3aWR0aD0lZCwgaGVpZ2h0PSVkLCBmb3JtYXQ9JWMlYyVjJWMsIGZpZWxkPSVzLCAiCiAJCSJieXRlc3BlcmxpbmU9JWQgc2l6ZWltYWdlPSVkLCBjb2xvcnNwYWNlPSVkXG4iLAotCQlmbXQtPndpZHRoLGZtdC0+aGVpZ2h0LGZtdC0+cGl4ZWxmb3JtYXQsCisJCWZtdC0+d2lkdGgsZm10LT5oZWlnaHQsCisJCShmbXQtPnBpeGVsZm9ybWF0ICYgMHhmZiksCisJCShmbXQtPnBpeGVsZm9ybWF0ID4+ICA4KSAmIDB4ZmYsCisJCShmbXQtPnBpeGVsZm9ybWF0ID4+IDE2KSAmIDB4ZmYsCisJCShmbXQtPnBpeGVsZm9ybWF0ID4+IDI0KSAmIDB4ZmYsCiAJCXBydF9uYW1lcyhmbXQtPmZpZWxkLHY0bDJfZmllbGRfbmFtZXNfRklYTUUpLAogCQlmbXQtPmJ5dGVzcGVybGluZSxmbXQtPnNpemVpbWFnZSxmbXQtPmNvbG9yc3BhY2UpOwogfTsKQEAgLTQyNyw2ICs0MzIsMTAgQEAKIAkJdjRsX3ByaW50X2lvY3RsKHZmZC0+bmFtZSwgY21kKTsKIAl9CiAKKwlpZiAoX0lPQ19UWVBFKGNtZCk9PSd2JykKKwkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKKwkJCQkJCV9fdmlkZW9fZG9faW9jdGwpOworCiAJc3dpdGNoKGNtZCkgewogCS8qIC0tLSBjYXBhYmlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJY2FzZSBWSURJT0NfUVVFUllDQVA6CkBAIC01MjUsMTIgKzUzNCwxMyBAQAogCQl9CiAJCWlmICghcmV0KQogCQkJZGJnYXJnIChjbWQsICJpbmRleD0lZCwgdHlwZT0lZCwgZmxhZ3M9JWQsICIKLQkJCQkJImRlc2NyaXB0aW9uPSVzLCIKLQkJCQkJIiBwaXhlbGZvcm1hdD0weCU4eFxuIiwKKwkJCQkJInBpeGVsZm9ybWF0PSVjJWMlYyVjLCBkZXNjcmlwdGlvbj0nJXMnXG4iLAogCQkJCQlmLT5pbmRleCwgZi0+dHlwZSwgZi0+ZmxhZ3MsCi0JCQkJCWYtPmRlc2NyaXB0aW9uLAotCQkJCQlmLT5waXhlbGZvcm1hdCk7Ci0KKwkJCQkJKGYtPnBpeGVsZm9ybWF0ICYgMHhmZiksCisJCQkJCShmLT5waXhlbGZvcm1hdCA+PiAgOCkgJiAweGZmLAorCQkJCQkoZi0+cGl4ZWxmb3JtYXQgPj4gMTYpICYgMHhmZiwKKwkJCQkJKGYtPnBpeGVsZm9ybWF0ID4+IDI0KSAmIDB4ZmYsCisJCQkJCWYtPmRlc2NyaXB0aW9uKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVklESU9DX0dfRk1UOgpAQCAtODI4LDIwICs4MzgsODUgQEAKIAljYXNlIFZJRElPQ19FTlVNU1REOgogCXsKIAkJc3RydWN0IHY0bDJfc3RhbmRhcmQgKnAgPSBhcmc7Ci0JCXVuc2lnbmVkIGludCBpbmRleCA9IHAtPmluZGV4OworCQl2NGwyX3N0ZF9pZCBpZCA9IHZmZC0+dHZub3JtcyxjdXJyX2lkPTA7CisJCXVuc2lnbmVkIGludCBpbmRleCA9IHAtPmluZGV4LGk7CiAKLQkJaWYgKCF2ZmQtPnR2bm9ybXNpemUpIHsKLQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbm8gVFYgbm9ybXMgZGVmaW5lZCFcbiIsCi0JCQkJCQl2ZmQtPm5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaW5kZXg8MCB8fCBpbmRleCA+PSB2ZmQtPnR2bm9ybXNpemUpIHsKKwkJaWYgKGluZGV4PDApIHsKIAkJCXJldD0tRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KLQkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHAsIHZmZC0+dHZub3Jtc1twLT5pbmRleF0uaWQsCi0JCQkJCSB2ZmQtPnR2bm9ybXNbcC0+aW5kZXhdLm5hbWUpOworCisJCS8qIFJldHVybiBub3JtIGFycmF5IG9uIGEgY2Fub25pY2FsIHdheSAqLworCQlmb3IgKGk9MDtpPD0gaW5kZXggJiYgaWQ7IGkrKykgeworCQkJaWYgKCAoaWQgJiBWNEwyX1NURF9QQUwpID09IFY0TDJfU1REX1BBTCkgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9QQUw7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfQkcpID09IFY0TDJfU1REX1BBTF9CRykgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9QQUxfQkc7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfREspID09IFY0TDJfU1REX1BBTF9ESykgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9QQUxfREs7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfQikgPT0gVjRMMl9TVERfUEFMX0IpIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfUEFMX0I7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfQjEpID09IFY0TDJfU1REX1BBTF9CMSkgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9QQUxfQjE7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfRykgPT0gVjRMMl9TVERfUEFMX0cpIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfUEFMX0c7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfSCkgPT0gVjRMMl9TVERfUEFMX0gpIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfUEFMX0g7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfSSkgPT0gVjRMMl9TVERfUEFMX0kpIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfUEFMX0k7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfRCkgPT0gVjRMMl9TVERfUEFMX0QpIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfUEFMX0Q7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfRDEpID09IFY0TDJfU1REX1BBTF9EMSkgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9QQUxfRDE7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfSykgPT0gVjRMMl9TVERfUEFMX0spIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfUEFMX0s7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfTSkgPT0gVjRMMl9TVERfUEFMX00pIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfUEFMX007CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfTikgPT0gVjRMMl9TVERfUEFMX04pIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfUEFMX047CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfTmMpID09IFY0TDJfU1REX1BBTF9OYykgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9QQUxfTmM7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9QQUxfNjApID09IFY0TDJfU1REX1BBTF82MCkgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9QQUxfNjA7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9OVFNDKSA9PSBWNEwyX1NURF9OVFNDKSB7CisJCQkJY3Vycl9pZCA9IFY0TDJfU1REX05UU0M7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9OVFNDX00pID09IFY0TDJfU1REX05UU0NfTSkgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9OVFNDX007CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9OVFNDX01fSlApID09IFY0TDJfU1REX05UU0NfTV9KUCkgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9OVFNDX01fSlA7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9OVFNDXzQ0MykgPT0gVjRMMl9TVERfTlRTQ180NDMpIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfTlRTQ180NDM7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9OVFNDX01fS1IpID09IFY0TDJfU1REX05UU0NfTV9LUikgeworCQkJCWN1cnJfaWQgPSBWNEwyX1NURF9OVFNDX01fS1I7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTSkgPT0gVjRMMl9TVERfU0VDQU0pIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfU0VDQU07CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9ESykgPT0gVjRMMl9TVERfU0VDQU1fREspIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfU0VDQU1fREs7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9CKSA9PSBWNEwyX1NURF9TRUNBTV9CKSB7CisJCQkJY3Vycl9pZCA9IFY0TDJfU1REX1NFQ0FNX0I7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9EKSA9PSBWNEwyX1NURF9TRUNBTV9EKSB7CisJCQkJY3Vycl9pZCA9IFY0TDJfU1REX1NFQ0FNX0Q7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9HKSA9PSBWNEwyX1NURF9TRUNBTV9HKSB7CisJCQkJY3Vycl9pZCA9IFY0TDJfU1REX1NFQ0FNX0c7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9IKSA9PSBWNEwyX1NURF9TRUNBTV9IKSB7CisJCQkJY3Vycl9pZCA9IFY0TDJfU1REX1NFQ0FNX0g7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9LKSA9PSBWNEwyX1NURF9TRUNBTV9LKSB7CisJCQkJY3Vycl9pZCA9IFY0TDJfU1REX1NFQ0FNX0s7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9LMSkgPT0gVjRMMl9TVERfU0VDQU1fSzEpIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfU0VDQU1fSzE7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9MKSA9PSBWNEwyX1NURF9TRUNBTV9MKSB7CisJCQkJY3Vycl9pZCA9IFY0TDJfU1REX1NFQ0FNX0w7CisJCQl9IGVsc2UgaWYgKCAoaWQgJiBWNEwyX1NURF9TRUNBTV9MQykgPT0gVjRMMl9TVERfU0VDQU1fTEMpIHsKKwkJCQljdXJyX2lkID0gVjRMMl9TVERfU0VDQU1fTEM7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQkJaWQgJj0gfmN1cnJfaWQ7CisJCX0KKwkJaWYgKGk8PWluZGV4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHAsIGN1cnJfaWQsdjRsMl9ub3JtX3RvX25hbWUoY3Vycl9pZCkpOwogCQlwLT5pbmRleCA9IGluZGV4OwogCiAJCWRiZ2FyZyAoY21kLCAiaW5kZXg9JWQsIGlkPSVMZCwgbmFtZT0lcywgZnBzPSVkLyVkLCAiCkBAIC04NjcsMzkgKzk0MiwyMyBAQAogCX0KIAljYXNlIFZJRElPQ19TX1NURDoKIAl7Ci0JCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGk7Ci0KLQkJaWYgKCF2ZmQtPnR2bm9ybXNpemUpIHsKLQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbm8gVFYgbm9ybXMgZGVmaW5lZCFcbiIsCi0JCQkJCQl2ZmQtPm5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KKwkJdjRsMl9zdGRfaWQgKmlkID0gYXJnLG5vcm07CiAKIAkJZGJnYXJnIChjbWQsICJ2YWx1ZT0lTHVcbiIsIChsb25nIGxvbmcgdW5zaWduZWQpICppZCk7CiAKLQkJLyogRmlyc3Qgc2VhcmNoIGZvciBleGFjdCBtYXRjaCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgdmZkLT50dm5vcm1zaXplOyBpKyspCi0JCQlpZiAoKmlkID09IHZmZC0+dHZub3Jtc1tpXS5pZCkKLQkJCQlicmVhazsKLQkJLyogVGhlbiBmb3IgYSBnZW5lcmljIHZpZGVvIHN0ZCB0aGF0IGNvbnRhaW5zIGRlc2lyZWQgc3RkICovCi0JCWlmIChpID09IHZmZC0+dHZub3Jtc2l6ZSkKLQkJCWZvciAoaSA9IDA7IGkgPCB2ZmQtPnR2bm9ybXNpemU7IGkrKykKLQkJCQlpZiAoKmlkICYgdmZkLT50dm5vcm1zW2ldLmlkKQotCQkJCQlicmVhazsKLQkJaWYgKGkgPT0gdmZkLT50dm5vcm1zaXplKSB7CisJCW5vcm0gPSAoKmlkKSAmIHZmZC0+dHZub3JtczsKKwkJaWYgKCB2ZmQtPnR2bm9ybXMgJiYgIW5vcm0pCS8qIENoZWNrIGlmIHN0ZCBpcyBzdXBwb3J0ZWQgKi8KIAkJCWJyZWFrOwotCQl9CiAKIAkJLyogQ2FsbHMgdGhlIHNwZWNpZmljIGhhbmRsZXIgKi8KIAkJaWYgKHZmZC0+dmlkaW9jX3Nfc3RkKQotCQkJcmV0PXZmZC0+dmlkaW9jX3Nfc3RkKGZpbGUsIGZoLCBpKTsKKwkJCXJldD12ZmQtPnZpZGlvY19zX3N0ZChmaWxlLCBmaCwgJm5vcm0pOwogCQllbHNlCiAJCQlyZXQ9LUVJTlZBTDsKIAogCQkvKiBVcGRhdGVzIHN0YW5kYXJkIGluZm9ybWF0aW9uICovCi0JCWlmICghcmV0KQotCQkJdmZkLT5jdXJyZW50X25vcm09KmlkOworCQlpZiAocmV0Pj0wKQorCQkJdmZkLT5jdXJyZW50X25vcm09bm9ybTsKIAogCQlicmVhazsKIAl9CkBAIC0xMDg3LDkgKzExNDYsMTMgQEAKIAljYXNlIFZJRElPQ19HX0FVRElPOgogCXsKIAkJc3RydWN0IHY0bDJfYXVkaW8gKnA9YXJnOworCQlfX3UzMiBpbmRleD1wLT5pbmRleDsKIAogCQlpZiAoIXZmZC0+dmlkaW9jX2dfYXVkaW8pCiAJCQlicmVhazsKKworCQltZW1zZXQocCwwLHNpemVvZigqcCkpOworCQlwLT5pbmRleD1pbmRleDsKIAkJZGJnYXJnKGNtZCwgIkdldCBmb3IgaW5kZXg9JWRcbiIsIHAtPmluZGV4KTsKIAkJcmV0PXZmZC0+dmlkaW9jX2dfYXVkaW8oZmlsZSwgZmgsIHApOwogCQlpZiAoIXJldCkKQEAgLTEyODgsMTcgKzEzNTEsMTEgQEAKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCB2NGwyX3N0YW5kYXJkIHM7CiAKLQkJCWlmICghdmZkLT50dm5vcm1zaXplKSB7Ci0JCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBubyBUViBub3JtcyBkZWZpbmVkIVxuIiwKLQkJCQkJCQl2ZmQtPm5hbWUpOwotCQkJCWJyZWFrOwotCQkJfQotCiAJCQlpZiAocC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCXY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdCgmcywgdmZkLT50dm5vcm1zW3ZmZC0+Y3VycmVudF9ub3JtXS5pZCwKLQkJCQkJCSB2ZmQtPnR2bm9ybXNbdmZkLT5jdXJyZW50X25vcm1dLm5hbWUpOworCQkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KCZzLCB2ZmQtPmN1cnJlbnRfbm9ybSwKKwkJCQkJCSB2NGwyX25vcm1fdG9fbmFtZSh2ZmQtPmN1cnJlbnRfbm9ybSkpOwogCiAJCQltZW1zZXQocCwwLHNpemVvZigqcCkpOwogCkBAIC0xMzIxLDggKzEzNzgsMTQgQEAKIAljYXNlIFZJRElPQ19HX1RVTkVSOgogCXsKIAkJc3RydWN0IHY0bDJfdHVuZXIgKnA9YXJnOworCQlfX3UzMiBpbmRleD1wLT5pbmRleDsKKwogCQlpZiAoIXZmZC0+dmlkaW9jX2dfdHVuZXIpCiAJCQlicmVhazsKKworCQltZW1zZXQocCwwLHNpemVvZigqcCkpOworCQlwLT5pbmRleD1pbmRleDsKKwogCQlyZXQ9dmZkLT52aWRpb2NfZ190dW5lcihmaWxlLCBmaCwgcCk7CiAJCWlmICghcmV0KQogCQkJZGJnYXJnIChjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgIgpAQCAtMTM1NSw2ICsxNDE4LDkgQEAKIAkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpwPWFyZzsKIAkJaWYgKCF2ZmQtPnZpZGlvY19nX2ZyZXF1ZW5jeSkKIAkJCWJyZWFrOworCisJCW1lbXNldChwLDAsc2l6ZW9mKCpwKSk7CisKIAkJcmV0PXZmZC0+dmlkaW9jX2dfZnJlcXVlbmN5KGZpbGUsIGZoLCBwKTsKIAkJaWYgKCFyZXQpCiAJCQlkYmdhcmcgKGNtZCwgInR1bmVyPSVkLCB0eXBlPSVkLCBmcmVxdWVuY3k9JWRcbiIsCkBAIC0xMzg4LDEyICsxNDU0LDcgQEAKIAkJcmV0PXZmZC0+dmlkaW9jX2xvZ19zdGF0dXMoZmlsZSwgZmgpOwogCQlicmVhazsKIAl9Ci0KLQkvKiAtLS0gT3RoZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0JZGVmYXVsdDoKLQkJcmV0PXY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZyxfX3ZpZGVvX2RvX2lvY3RsKTsKLQl9CisJfSAvKiBzd2l0Y2ggKi8KIAogCWlmICh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpIHsKIAkJaWYgKHJldDwwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCmluZGV4IDZiNmRmZjQuLmEzNzNjMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jCkBAIC03ODIsNyArNzgyLDcgQEAKIAogc3RhdGljIGludCB2aW5vX2kyY19kZWxfYnVzKHZvaWQpCiB7Ci0JcmV0dXJuIGkyY19zZ2lfZGVsX2J1cygmdmlub19pMmNfYWRhcHRlcik7CisJcmV0dXJuIGkyY19kZWxfYWRhcHRlcigmdmlub19pMmNfYWRhcHRlcik7CiB9CiAKIHN0YXRpYyBpbnQgaTJjX2NhbWVyYV9jb21tYW5kKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKaW5kZXggZTdjMDFkNS4uNDc0ZGRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAvKiBXYWtlIHVwIGF0IGFib3V0IDMwIGZwcyAqLwogI2RlZmluZSBXQUtFX05VTUVSQVRPUiAzMApAQCAtMjcyLDcgKzI3Myw3IEBACiAKIAkvKiBHZXQgZmlyc3QgYWRkciBwb2ludGVkIHRvIHBpeGVsIHBvc2l0aW9uICovCiAJb2xkcGc9Z2V0X2FkZHJfcG9zKHBvcyxwYWdlcyx0b19hZGRyKTsKLQlwZz1wZm5fdG9fcGFnZSh0b19hZGRyW29sZHBnXS5zZy0+ZG1hX2FkZHJlc3MgPj4gUEFHRV9TSElGVCk7CisJcGc9cGZuX3RvX3BhZ2Uoc2dfZG1hX2FkZHJlc3ModG9fYWRkcltvbGRwZ10uc2cpID4+IFBBR0VfU0hJRlQpOwogCWJhc2VwID0ga21hcF9hdG9taWMocGcsIEtNX0JPVU5DRV9SRUFEKSt0b19hZGRyW29sZHBnXS5zZy0+b2Zmc2V0OwogCiAJLyogV2Ugd2lsbCBqdXN0IGR1cGxpY2F0ZSB0aGUgc2Vjb25kIHBpeGVsIGF0IHRoZSBwYWNrZXQgKi8KQEAgLTI4Nyw3ICsyODgsNyBAQAogCQlmb3IgKGNvbG9yPTA7Y29sb3I8NDtjb2xvcisrKSB7CiAJCQlwZ3Bvcz1nZXRfYWRkcl9wb3MocG9zLHBhZ2VzLHRvX2FkZHIpOwogCQkJaWYgKHBncG9zIT1vbGRwZykgewotCQkJCXBnPXBmbl90b19wYWdlKHRvX2FkZHJbcGdwb3NdLnNnLT5kbWFfYWRkcmVzcyA+PiBQQUdFX1NISUZUKTsKKwkJCQlwZz1wZm5fdG9fcGFnZShzZ19kbWFfYWRkcmVzcyh0b19hZGRyW3BncG9zXS5zZykgPj4gUEFHRV9TSElGVCk7CiAJCQkJa3VubWFwX2F0b21pYyhiYXNlcCwgS01fQk9VTkNFX1JFQUQpOwogCQkJCWJhc2VwPSBrbWFwX2F0b21pYyhwZywgS01fQk9VTkNFX1JFQUQpK3RvX2FkZHJbcGdwb3NdLnNnLT5vZmZzZXQ7CiAJCQkJb2xkcGc9cGdwb3M7CkBAIC0zMzksOCArMzQwLDggQEAKIAkJCQlmb3IgKGNvbG9yPTA7Y29sb3I8NDtjb2xvcisrKSB7CiAJCQkJCXBncG9zPWdldF9hZGRyX3Bvcyhwb3MscGFnZXMsdG9fYWRkcik7CiAJCQkJCWlmIChwZ3BvcyE9b2xkcGcpIHsKLQkJCQkJCXBnPXBmbl90b19wYWdlKHRvX2FkZHJbcGdwb3NdLgotCQkJCQkJCQlzZy0+ZG1hX2FkZHJlc3MKKwkJCQkJCXBnPXBmbl90b19wYWdlKHNnX2RtYV9hZGRyZXNzKAorCQkJCQkJCQl0b19hZGRyW3BncG9zXS5zZykKIAkJCQkJCQkJPj4gUEFHRV9TSElGVCk7CiAJCQkJCQlrdW5tYXBfYXRvbWljKGJhc2VwLAogCQkJCQkJCQlLTV9CT1VOQ0VfUkVBRCk7CkBAIC0zODYsNyArMzg3LDcgQEAKIAlzdHJ1Y3QgdGltZXZhbCB0czsKIAogCS8qIFRlc3QgaWYgRE1BIG1hcHBpbmcgaXMgcmVhZHkgKi8KLQlpZiAoIXZiLT5kbWEuc2dsaXN0WzBdLmRtYV9hZGRyZXNzKQorCWlmICghc2dfZG1hX2FkZHJlc3MoJnZiLT5kbWEuc2dsaXN0WzBdKSkKIAkJcmV0dXJuOwogCiAJcHJlcF90b19hZGRyKHRvX2FkZHIsdmIpOwpAQCAtNzgzLDcgKzc4NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKysgKSB7CiAJCUJVR19PTighc2dbaV0ucGFnZSk7CiAKLQkJc2dbaV0uZG1hX2FkZHJlc3MgPSBwYWdlX3RvX3BoeXMoc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQ7CisJCXNnX2RtYV9hZGRyZXNzKCZzZ1tpXSkgPSBwYWdlX3RvX3BoeXMoc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQ7CiAJfQogCiAJcmV0dXJuIG5lbnRzOwpAQCAtMTA0MywxNiArMTA0NCw4IEBACiAJcmV0dXJuICgwKTsKIH0KIAotc3RhdGljIHN0cnVjdCB2NGwyX3R2bm9ybSB0dm5vcm1zW10gPSB7Ci0JewotCQkubmFtZSAgICAgID0gIk5UU0MtTSIsCi0JCS5pZCAgICAgICAgPSBWNEwyX1NURF9OVFNDX00sCi0JfQotfTsKLQotc3RhdGljIGludCB2aWRpb2Nfc19zdGQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCBhKQorc3RhdGljIGludCB2aWRpb2Nfc19zdGQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqaSkKIHsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMzMyLDggKzEzMjUsOCBAQAogI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAogCS52aWRpb2NnbWJ1ZiAgICAgICAgICA9IHZpZGlvY2dtYnVmLAogI2VuZGlmCi0JLnR2bm9ybXMgICAgICAgICAgICAgID0gdHZub3JtcywKLQkudHZub3Jtc2l6ZSAgICAgICAgICAgPSBBUlJBWV9TSVpFKHR2bm9ybXMpLAorCS50dm5vcm1zICAgICAgICAgICAgICA9IFY0TDJfU1REX05UU0NfTSwKKwkuY3VycmVudF9ub3JtICAgICAgICAgPSBWNEwyX1NURF9OVFNDX00sCiB9OwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlJbml0aWFsaXphdGlvbiBhbmQgbW9kdWxlIHN0dWZmCkBAIC0xMzYwLDggKzEzNTMsNiBAQAogCWRldi0+dmlkcS50aW1lb3V0LmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpZGV2OwogCWluaXRfdGltZXIoJmRldi0+dmlkcS50aW1lb3V0KTsKIAotCXZpdmkuY3VycmVudF9ub3JtICAgICAgICAgPSB0dm5vcm1zWzBdLmlkOwotCiAJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZ2aXZpLCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiVmlkZW8gVGVjaG5vbG9neSBNYWdhemluZSBWaXJ0dWFsIFZpZGVvIENhcHR1cmUgQm9hcmQgKExvYWQgc3RhdHVzOiAlZClcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfY29yZS5jCmluZGV4IDViNTU2MzQuLjUyZDBmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYwpAQCAtNDg5LDcgKzQ4OSw3IEBACiAJcmV0dXJuIDA7CiAKIGZyZWVfdXJiczoKLQlmb3IgKGkgPSAwOyAoaSA8IFpDMDMwMV9VUkJTKSAmJiAgY2FtLT51cmJbaV07IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgWkMwMzAxX1VSQlM7IGkrKykKIAkJdXNiX2ZyZWVfdXJiKGNhbS0+dXJiW2ldKTsKIAogZnJlZV9idWZmZXJzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2NhcmQuYwppbmRleCA2NTM4MjJjLi40ZDFlYjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2NhcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2NhcmQuYwpAQCAtODQ5LDcgKzg0OSw3IEBACiBzdGF0aWMgdm9pZAogem9yYW5fdW5yZWdpc3Rlcl9pMmMgKHN0cnVjdCB6b3JhbiAqenIpCiB7Ci0JaTJjX2JpdF9kZWxfYnVzKCgmenItPmkyY19hZGFwdGVyKSk7CisJaTJjX2RlbF9hZGFwdGVyKCZ6ci0+aTJjX2FkYXB0ZXIpOwogfQogCiAvKiBDaGVjayBhIHpvcmFuX3BhcmFtcyBzdHJ1Y3QgZm9yIGNvcnJlY3RuZXNzLCBpbnNlcnQgZGVmYXVsdCBwYXJhbXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX3Byb2Nmcy5jCmluZGV4IGM3ZjZmNjQuLmMzNzRjNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9wcm9jZnMuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiBzdGF0aWMgc3NpemVfdCB6b3Jhbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCB6b3JhbiAqenIgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCXN0cnVjdCB6b3JhbiAqenIgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJY2hhciAqc3RyaW5nLCAqc3A7CiAJY2hhciAqbGluZSwgKmxkZWxpbSwgKnZhcm5hbWUsICpzdmFyLCAqdGRlbGltOwogCkBAIC0xNjUsNyArMTY1LDcgQEAKIAl9CiAJc3RyaW5nW2NvdW50XSA9IDA7CiAJZHByaW50ayg0LCBLRVJOX0lORk8gIiVzOiB3cml0ZV9wcm9jOiBuYW1lPSVzIGNvdW50PSV6dSB6cj0lcFxuIiwKLQkJWlJfREVWTkFNRSh6ciksIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwgY291bnQsIHpyKTsKKwkJWlJfREVWTkFNRSh6ciksIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLCBjb3VudCwgenIpOwogCWxkZWxpbSA9ICIgXHRcbiI7CiAJdGRlbGltID0gIj0iOwogCWxpbmUgPSBzdHJwYnJrKHNwLCBsZGVsaW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiZjU2NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNzkgKzAsMCBAQAotLyoKLSAgICB6cjM2MTIwLmMgLSBab3JhbiAzNjEyMC8zNjEyNSBiYXNlZCBmcmFtZWdyYWJiZXJzCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSBQYXVsaW5lIE1pZGRlbGluayA8bWlkZGVsaW5AcG9seXdhcmUubmw+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICJ0dW5lci5oIgotI2luY2x1ZGUgInpyMzYxMjAuaCIKLSNpbmNsdWRlICJ6cjM2MTIwX21lbS5oIgotCi0vKiBtYXJrIGFuIHJlcXVpcmVkIGZ1bmN0aW9uIGFyZ3VtZW50IHVudXNlZCAtIGxpbnRpc20gKi8KLSNkZWZpbmUJVU5VU0VEKHgpCSh2b2lkKSh4KQotCi0vKiBzZW5zaWJsZSBkZWZhdWx0ICovCi0jaWZuZGVmIENBUkRUWVBFCi0jZGVmaW5lIENBUkRUWVBFIDAKLSNlbmRpZgotCi0vKiBBbnlib2R5IHdobyB1c2VzIG1vcmUgdGhhbiBmb3VyPyAqLwotI2RlZmluZSBaT1JBTl9NQVggNAotCi1zdGF0aWMgdW5zaWduZWQgaW50IHRyaXRvbjE9MDsJCQkvKiB0cml0b24xIGNoaXBzZXQ/ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGNhcmR0eXBlW1pPUkFOX01BWF09eyBbIDAgLi4uIFpPUkFOX01BWC0xIF0gPSBDQVJEVFlQRSB9Owotc3RhdGljIGludCB2aWRlb19uciA9IC0xOwotc3RhdGljIGludCB2YmlfbnIgPSAtMTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHpyMzYxMjBfcGNpX3RibFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9aT1JBTixQQ0lfREVWSUNFX0lEX1pPUkFOXzM2MTIwLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAotCXsgMCB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHpyMzYxMjBfcGNpX3RibCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlBhdWxpbmUgTWlkZGVsaW5rIDxtaWRkZWxpbkBwb2x5d2FyZS5ubD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiWm9yYW4gWlIzNjEyMCBiYXNlZCBmcmFtZWdyYWJiZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotbW9kdWxlX3BhcmFtKHRyaXRvbjEsIHVpbnQsIDApOwotbW9kdWxlX3BhcmFtX2FycmF5KGNhcmR0eXBlLCB1aW50LCBOVUxMLCAwKTsKLW1vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbSh2YmlfbnIsIGludCwgMCk7Ci0KLXN0YXRpYyBpbnQgem9yYW5fY2FyZHM7Ci1zdGF0aWMgc3RydWN0IHpvcmFuIHpvcmFuc1taT1JBTl9NQVhdOwotCi0vKgotICogdGhlIG1lYW5pbmcgb2YgZWFjaCBlbGVtZW50IGNhbiBiZSBmb3VuZCBpbiB6cjM2MTIwLmgKLSAqIERldGVybWluaW5nIHRoZSB2YWx1ZSBvZiBncGRpci9ncHZhbCBjYW4gYmUgdHJpY2t5LiBUaGUKLSAqIGJlc3Qgd2F5IGlzIHRvIHJ1biB0aGUgY2FyZCB1bmRlciB0aGUgb3JpZ2luYWwgc29mdHdhcmUKLSAqIGFuZCByZWFkIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycwotICogMHgyOCBhbmQgMHgyQy4gSG93IHlvdSBkbyB0aGF0IGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UKLSAqIHRvIHRoZSBpbXBhdGllbnQgcmVhZGVyIDopCi0gKi8KLSNkZWZpbmUgVCAxCS8qIHRvIHNlcGFyYXRlIHRoZSBib29scyBmcm9tIHRoZSBpbnRzICovCi0jZGVmaW5lIEYgMAotc3RhdGljIHN0cnVjdCB0dmNhcmQgdHZjYXJkc1tdID0gewotCS8qIHJlcG9ydGVkIHdvcmtpbmcgYnkgPG1pZGRlbGluQHBvbHl3YXJlLm5sPiAqLwotLyowKi8JeyAiVHJ1c3QgVmljdG9yIElJIiwKLQkgIDIsIDAsIFQsIFQsIFQsIFQsIDB4N0YsIDB4ODAsIHsgMSwgU1ZIUyg2KSB9LCB7IDAgfSB9LAotCS8qIHJlcG9ydGVkIHdvcmtpbmcgYnkgPE1pY2hhZWwuUGF4dG9uQGFpaHcuZ292LmF1PiAgKi8KLS8qMSovICAgeyAiQWl0ZWNoIFdhdmVXYXRjaGVyIFRWLVBDSSIsCi0JICAzLCAwLCBULCBGLCBULCBULCAweDdGLCAweDgwLCB7IDEsIFRVTkVSKDMpLCBTVkhTKDYpIH0sIHsgMCB9IH0sCi0JLyogcmVwb3J0ZWQgd29ya2luZyBieSA/ICovCi0vKjIqLwl7ICJHZW5pdXMgVmlkZW8gV29uZGVyIFBDSSBWaWRlbyBDYXB0dXJlIENhcmQiLAotCSAgMiwgMCwgVCwgVCwgVCwgVCwgMHg3RiwgMHg4MCwgeyAxLCBTVkhTKDYpIH0sIHsgMCB9IH0sCi0JLyogcmVwb3J0ZWQgd29ya2luZyBieSA8UGFzY2FsLkdhYnJpZWxAd2FuYWRvby5mcj4gKi8KLS8qMyovCXsgIkd1aWxsZW1vdCBNYXhpLVRWIFBDSSIsCi0JICAyLCAwLCBULCBULCBULCBULCAweDdGLCAweDgwLCB7IDEsIFNWSFMoNikgfSwgeyAwIH0gfSwKLQkvKiByZXBvcnRlZCB3b3JraW5nIGJ5ICJDcmFpZyBXaGl0bW9yZSA8bGVubm9uQGlncmluLmNvLm56PiAqLwotLyo0Ki8JeyAiUXVhZHJhbnQgQnVzdGVyIiwKLQkgIDMsIDMsIFQsIEYsIFQsIFQsIDB4N0YsIDB4ODAsIHsgU1ZIUygxKSwgVFVORVIoMiksIDMgfSwgeyAxLCAyLCAzIH0gfSwKLQkvKiBhIGRlYnVnIGVudHJ5IHdoaWNoIGhhcyBhbGwgaW5wdXRzIG1hcHBlZCAqLwotLyo1Ki8JeyAiWlIzNjEyMCBiYXNlZCBmcmFtZWdyYWJiZXIgKGFsbCBpbnB1dHMgZW5hYmxlZCkiLAotCSAgNiwgMCwgVCwgVCwgVCwgVCwgMHg3RiwgMHg4MCwgeyAxLCAyLCAzLCA0LCA1LCA2IH0sIHsgMCB9IH0KLX07Ci0jdW5kZWYgVAotI3VuZGVmIEYKLSNkZWZpbmUgTlJUVkNBUkRTIChzaXplb2YodHZjYXJkcykvc2l6ZW9mKHR2Y2FyZHNbMF0pKQotCi0jaWZkZWYgX19zcGFyY19fCi0jZGVmaW5lCUVORElBTkVTUwkwCi0jZWxzZQotI2RlZmluZQlFTkRJQU5FU1MJWk9SQU5fVkZFQ19MRQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgeyBjb25zdCBjaGFyIG5hbWVbOF07IHVpbnQgbW9kZTsgdWludCBicHA7IH0gcGFsZXR0ZTJmbXRbXSA9IHsKLS8qIG4vYSAgICAgKi8JeyAibi9hIiwgICAgIDAsIDAgfSwKLS8qIEdSRVkgICAgKi8JeyAiR1JBWSIsICAgIDAsIDAgfSwKLS8qIEhJMjQwICAgKi8JeyAiSEkyNDAiLCAgIDAsIDAgfSwKLS8qIFJHQjU2NSAgKi8JeyAiUkdCNTY1IiwgIFpPUkFOX1ZGRUNfUkdCX1JHQjU2NXxFTkRJQU5FU1MsIDIgfSwKLS8qIFJHQjI0ICAgKi8JeyAiUkdCMjQiLCAgIFpPUkFOX1ZGRUNfUkdCX1JHQjg4OHxFTkRJQU5FU1N8Wk9SQU5fVkZFQ19QQUNLMjQsIDMgfSwKLS8qIFJHQjMyICAgKi8JeyAiUkdCMzIiLCAgIFpPUkFOX1ZGRUNfUkdCX1JHQjg4OHxFTkRJQU5FU1MsIDQgfSwKLS8qIFJHQjU1NSAgKi8JeyAiUkdCNTU1IiwgIFpPUkFOX1ZGRUNfUkdCX1JHQjU1NXxFTkRJQU5FU1MsIDIgfSwKLS8qIFlVVjQyMiAgKi8JeyAiWVVWNDIyIiwgIFpPUkFOX1ZGRUNfUkdCX1lVVjQyMnxFTkRJQU5FU1MsIDIgfSwKLS8qIFlVWVYgICAgKi8JeyAiWVVZViIsICAgIDAsIDAgfSwKLS8qIFVZVlkgICAgKi8JeyAiVVlWWSIsICAgIDAsIDAgfSwKLS8qIFlVVjQyMCAgKi8JeyAiWVVWNDIwIiwgIDAsIDAgfSwKLS8qIFlVVjQxMSAgKi8JeyAiWVVWNDExIiwgIDAsIDAgfSwKLS8qIFJBVyAgICAgKi8JeyAiUkFXIiwgICAgIDAsIDAgfSwKLS8qIFlVVjQyMlAgKi8JeyAiWVVWNDIyUCIsIDAsIDAgfSwKLS8qIFlVVjQxMVAgKi8JeyAiWVVWNDExUCIsIDAsIDAgfX07Ci0jZGVmaW5lIE5SUEFMRVRURVMgKHNpemVvZihwYWxldHRlMmZtdCkvc2l6ZW9mKHBhbGV0dGUyZm10WzBdKSkKLSN1bmRlZiBFTkRJQU5FU1MKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIFpPUkFOIGNoaXBzZXQgZGV0ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIGJ0dHYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJlYXNvbiBmb3IgYmVlaW5nIGhlcmU6IHdlIG5lZWQgdG8gZGV0ZWN0IGlmIHdlIGFyZSBydW5uaW5nIG9uIGEgICAgICAgICovCi0vKiBUcml0b24gYmFzZWQgY2hpcHNldCwgYW5kIGlmIHNvLCBlbmFibGUgYSBjZXJ0YWluIGJpdCAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYwotdm9pZCBfX2luaXQgaGFuZGxlX2NoaXBzZXQodm9pZCkKLXsKLQkvKiBKdXN0IGluIGNhc2Ugc29tZSBudXQgc2V0IHRoaXMgdG8gc29tZXRoaW5nIGRhbmdlcm91cyAqLwotCWlmICh0cml0b24xKQotCQl0cml0b24xID0gWk9SQU5fVkRDX1RSSUNPTTsKLQotCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgUENJUENJX1RSSVRPTikgewotCQlwcmludGsoS0VSTl9JTkZPICJ6b3JhbjogSG9zdCBicmlkZ2UgODI0MzdGWCBUcml0b24gUElJWFxuIik7Ci0JCXRyaXRvbjEgPSBaT1JBTl9WRENfVFJJQ09NOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIFpPUkFOIGZ1bmN0aW9ucwkJCQkJCQkgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgem9yYW5fc2V0X2dlbyhzdHJ1Y3Qgem9yYW4qIHp0diwgc3RydWN0IHZpZGluZm8qIGkpOwotCi0jaWYgMCAvKiB1bnVzZWQgKi8KLXN0YXRpYwotdm9pZCB6b3Jhbl9kdW1wKHN0cnVjdCB6b3JhbiAqenR2KQotewotCWNoYXIJc3RyWzI1Nl07Ci0JY2hhcgkqcD1zdHI7IC8qIHNodXQgdXAsIGdjYyEgKi8KLQlpbnQJaTsKLQotCWZvciAoaT0wOyBpPDB4NjA7IGkrPTQpIHsKLQkJaWYgKChpICUgMTYpID09IDApIHsKLQkJCWlmIChpKSBwcmludGsoIiVzXG4iLHN0cik7Ci0JCQlwID0gc3RyOwotCQkJcCs9IHNwcmludGYoc3RyLCBLRVJOX0RFQlVHICIgICAgICAgJTA0eDogIixpKTsKLQkJfQotCQlwICs9IHNwcmludGYocCwgIiUwOHggIix6cnJlYWQoaSkpOwotCX0KLX0KLSNlbmRpZiAvKiB1bnVzZWQgKi8KLQotc3RhdGljCi12b2lkIHJlYXBfc3RhdGVzKHN0cnVjdCB6b3JhbiogenR2KQotewotCS8qIGNvdW50IGZyYW1lcyAqLwotCXp0di0+ZmllbGRucisrOwotCi0JLyoKLQkgKiBBcmUgd2UgYnVzeSBhdCBhbGw/Ci0JICogVGhpcyBkZXBlbmRzIG9uIGlmIHRoZXJlIGlzIGEgd29ya3F1ZXVlIEFORCB0aGUKLQkgKiB2aWRlb3RyYW5zZmVyIGlzIGVuYWJsZWQgb24gdGhlIGNoaXAuLi4KLQkgKi8KLQlpZiAoenR2LT53b3JrcXVldWUgJiYgKHpycmVhZChaT1JBTl9WREMpICYgWk9SQU5fVkRDX1ZJREVOKSkKLQl7Ci0JCXN0cnVjdCB2aWRpbmZvKiBuZXdpdGVtOwotCi0JCS8qIGRpZCB3ZSBnZXQgYSBjb21wbGV0ZSBmcmFtZT8gKi8KLQkJaWYgKHpycmVhZChaT1JBTl9WU1RSKSAmIFpPUkFOX1ZTVFJfR1JBQikKLQkJCXJldHVybjsKLQotREVCVUcocHJpbnRrKENBUkRfREVCVUcgImNvbXBsZXRlZCAlcyBhdCAlcFxuIixDQVJELHp0di0+d29ya3F1ZXVlLT5raW5kb2Y9PUZCVUZGRVJfR1JBQj8iZ3JhYiI6InJlYWQiLHp0di0+d29ya3F1ZXVlKSk7Ci0KLQkJLyogd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGJ1ZmZlciwgdGVsbCBldmVyeW9uZSAqLwotCQl6dHYtPndvcmtxdWV1ZS0+c3RhdHVzID0gRkJVRkZFUl9ET05FOwotCQl6dHYtPndvcmtxdWV1ZS0+ZmllbGRuciA9IHp0di0+ZmllbGRucjsKLQkJLyogbm90IGdvb2QsIGhlcmUgZm9yIEJUVFZfRklFTEROUiByZWFzb25zICovCi0JCXp0di0+bGFzdGZpZWxkbnIgPSB6dHYtPmZpZWxkbnI7Ci0KLQkJc3dpdGNoICh6dHYtPndvcmtxdWV1ZS0+a2luZG9mKSB7Ci0JCSBjYXNlIEZCVUZGRVJfR1JBQjoKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmenR2LT5ncmFicSk7Ci0JCQlicmVhazsKLQkJIGNhc2UgRkJVRkZFUl9WQkk6Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnp0di0+dmJpcSk7Ci0JCQlicmVhazsKLQkJIGRlZmF1bHQ6Ci0JCQlwcmludGsoQ0FSRF9JTkZPICJzb21lYm9keSBraWxsZWQgdGhlIHdvcmtxdWV1ZSAoa2luZG9mPSVkKSFcbiIsQ0FSRCx6dHYtPndvcmtxdWV1ZS0+a2luZG9mKTsKLQkJfQotCi0JCS8qIGl0ZW0gY29tcGxldGVkLCBza2lwIHRvIG5leHQgaXRlbSBpbiBxdWV1ZSAqLwotCQl3cml0ZV9sb2NrKCZ6dHYtPmxvY2spOwotCQluZXdpdGVtID0genR2LT53b3JrcXVldWUtPm5leHQ7Ci0JCXp0di0+d29ya3F1ZXVlLT5uZXh0ID0gMDsJLyogbWFyayBjb21wbGV0ZWQgKi8KLQkJenR2LT53b3JrcXVldWUgPSBuZXdpdGVtOwotCQl3cml0ZV91bmxvY2soJnp0di0+bG9jayk7Ci0JfQotCi0JLyoKLQkgKiBvaywgc28gaXQgc2VlbXMgd2UgaGF2ZSBub3RoaW5nIGluIHByb2dyZXNzIHJpZ2h0IG5vdy4KLQkgKiBMZXRzIHNlZSBpZiB3ZSBjYW4gZmluZCBzb21lIHdvcmsuCi0JICovCi0JaWYgKHp0di0+d29ya3F1ZXVlKQotCXsKLQkJc3RydWN0IHZpZGluZm8qIG5ld2l0ZW07Ci1hZ2FpbjoKLQotREVCVUcocHJpbnRrKENBUkRfREVCVUcgInN0YXJ0aW5nICVzIGF0ICVwXG4iLENBUkQsenR2LT53b3JrcXVldWUtPmtpbmRvZj09RkJVRkZFUl9HUkFCPyJncmFiIjoicmVhZCIsenR2LT53b3JrcXVldWUpKTsKLQotCQkvKiBsb2FkdXAgdGhlIGZyYW1lIHNldHRpbmdzICovCi0JCXJlYWRfbG9jaygmenR2LT5sb2NrKTsKLQkJem9yYW5fc2V0X2dlbyh6dHYsenR2LT53b3JrcXVldWUpOwotCQlyZWFkX3VubG9jaygmenR2LT5sb2NrKTsKLQotCQlzd2l0Y2ggKHp0di0+d29ya3F1ZXVlLT5raW5kb2YpIHsKLQkJIGNhc2UgRkJVRkZFUl9HUkFCOgotCQkgY2FzZSBGQlVGRkVSX1ZCSToKLQkJCXpyYW5kKH5aT1JBTl9PQ1JfT1ZMRU4sIFpPUkFOX09DUik7Ci0JCQl6cm9yKFpPUkFOX1ZTVFJfU05BUFNIT1QsWk9SQU5fVlNUUik7Ci0JCQl6cm9yKFpPUkFOX1ZEQ19WSURFTixaT1JBTl9WREMpOwotCi0JCQkvKiBzdGFydCBzaW5nbGUtc2hvdCBncmFiICovCi0JCQl6cm9yKFpPUkFOX1ZTVFJfR1JBQiwgWk9SQU5fVlNUUik7Ci0JCQlicmVhazsKLQkJIGRlZmF1bHQ6Ci0JCQlwcmludGsoQ0FSRF9JTkZPICJ3aGF0IGlzIHRoaXMgZG9pbmcgb24gdGhlIHF1ZXVlPyAoa2luZG9mPSVkKVxuIixDQVJELHp0di0+d29ya3F1ZXVlLT5raW5kb2YpOwotCQkJd3JpdGVfbG9jaygmenR2LT5sb2NrKTsKLQkJCW5ld2l0ZW0gPSB6dHYtPndvcmtxdWV1ZS0+bmV4dDsKLQkJCXp0di0+d29ya3F1ZXVlLT5uZXh0ID0gMDsKLQkJCXp0di0+d29ya3F1ZXVlID0gbmV3aXRlbTsKLQkJCXdyaXRlX3VubG9jaygmenR2LT5sb2NrKTsKLQkJCWlmIChuZXdpdGVtKQotCQkJCWdvdG8gYWdhaW47CS8qIHllYWgsIHN1cmUuLiAqLwotCQl9Ci0JCS8qIGJ5ZSBmb3Igbm93ICovCi0JCXJldHVybjsKLQl9Ci1ERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAibm90aGluZyBpbiBxdWV1ZVxuIixDQVJEKSk7Ci0KLQkvKgotCSAqIFdoYXQ/IEV2ZW4gdGhlIHdvcmtxdWV1ZSBpcyBlbXB0eT8gQW0gaSByZWFsbHkgaGVyZQotCSAqIGZvciBub3RoaW5nPyBEaWQgaSBjb21lIGFsbCB0aGF0IHdheSB0by4uLiBkbyBub3RoaW5nPwotCSAqLwotCi0JLyogZG8gd2UgbmVlZCB0byBvdmVybGF5PyAqLwotCWlmICh0ZXN0X2JpdChTVEFURV9PVkVSTEFZLCAmenR2LT5zdGF0ZSkpCi0JewotCQkvKiBhcmUgd2UgYWxyZWFkeSBvdmVybGF5aW5nPyAqLwotCQlpZiAoISh6cnJlYWQoWk9SQU5fT0NSKSAmIFpPUkFOX09DUl9PVkxFTikgfHwKLQkJICAgICEoenJyZWFkKFpPUkFOX1ZEQykgJiBaT1JBTl9WRENfVklERU4pKQotCQl7Ci1ERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAic3RhcnRpbmcgb3ZlcmxheVxuIixDQVJEKSk7Ci0KLQkJCXJlYWRfbG9jaygmenR2LT5sb2NrKTsKLQkJCXpvcmFuX3NldF9nZW8oenR2LCZ6dHYtPm92ZXJpbmZvKTsKLQkJCXJlYWRfdW5sb2NrKCZ6dHYtPmxvY2spOwotCi0JCQl6cm9yKFpPUkFOX09DUl9PVkxFTiwgWk9SQU5fT0NSKTsKLQkJCXpyYW5kKH5aT1JBTl9WU1RSX1NOQVBTSE9ULFpPUkFOX1ZTVFIpOwotCQkJenJvcihaT1JBTl9WRENfVklERU4sWk9SQU5fVkRDKTsKLQkJfQotCi0JCS8qCi0JCSAqIGxlYXZlIG92ZXJsYXlpbmcgb24sIGJ1dCB0dXJuIGludGVycnVwdHMgb2ZmLgotCQkgKi8KLQkJenJhbmQoflpPUkFOX0lDUl9FTixaT1JBTl9JQ1IpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZG8gd2UgaGF2ZSBhbnkgVkJJIGlkbGUgdGltZSBwcm9jZXNzaW5nPyAqLwotCWlmICh0ZXN0X2JpdChTVEFURV9WQkksICZ6dHYtPnN0YXRlKSkKLQl7Ci0JCXN0cnVjdCB2aWRpbmZvKiBpdGVtOwotCQlzdHJ1Y3QgdmlkaW5mbyogbGFzdGl0ZW07Ci0KLQkJLyogcHJvdGVjdCB0aGUgd29ya3F1ZXVlICovCi0JCXdyaXRlX2xvY2soJnp0di0+bG9jayk7Ci0JCWxhc3RpdGVtID0genR2LT53b3JrcXVldWU7Ci0JCWlmIChsYXN0aXRlbSkKLQkJCXdoaWxlIChsYXN0aXRlbS0+bmV4dCkgbGFzdGl0ZW0gPSBsYXN0aXRlbS0+bmV4dDsKLQkJZm9yIChpdGVtPXp0di0+cmVhZGluZm87IGl0ZW0hPXp0di0+cmVhZGluZm8rWk9SQU5fVkJJX0JVRkZFUlM7IGl0ZW0rKykKLQkJCWlmIChpdGVtLT5uZXh0ID09IDAgJiYgaXRlbS0+c3RhdHVzID09IEZCVUZGRVJfRlJFRSkKLQkJCXsKLURFQlVHKHByaW50ayhDQVJEX0RFQlVHICIlcCBhZGRlZCB0byBxdWV1ZVxuIixDQVJELGl0ZW0pKTsKLQkJCQlpdGVtLT5zdGF0dXMgPSBGQlVGRkVSX0JVU1k7Ci0JCQkJaWYgKCFsYXN0aXRlbSkKLQkJCQkJenR2LT53b3JrcXVldWUgPSBpdGVtOwotCQkJCWVsc2UKLQkJCQkJbGFzdGl0ZW0tPm5leHQgPSBpdGVtOwotCQkJCWxhc3RpdGVtID0gaXRlbTsKLQkJCX0KLQkJd3JpdGVfdW5sb2NrKCZ6dHYtPmxvY2spOwotCQlpZiAoenR2LT53b3JrcXVldWUpCi0JCQlnb3RvIGFnYWluOwkvKiBoZXksIF9pXyBncmFkdWF0ZWQgOikgKi8KLQl9Ci0KLQkvKgotCSAqIFRoZW4gd2UgbXVzdCBiZSByZWFseSBJRExFCi0JICovCi1ERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAidHVybmluZyBvZmZcbiIsQ0FSRCkpOwotCS8qIG5vdGhpbmcgZnVydGhlciB0byBkbywgZGlzYWJsZSBETUEgYW5kIGZ1cnRoZXIgSVJRcyAqLwotCXpyYW5kKH5aT1JBTl9WRENfVklERU4sWk9SQU5fVkRDKTsKLQl6cmFuZCh+Wk9SQU5fSUNSX0VOLFpPUkFOX0lDUik7Ci19Ci0KLXN0YXRpYwotdm9pZCB6b3Jhbl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXUzMiBzdGF0LGVzdGF0OwotCWludCBjb3VudCA9IDA7Ci0Jc3RydWN0IHpvcmFuICp6dHYgPSBkZXZfaWQ7Ci0KLQlVTlVTRUQoaXJxKTsKLQlmb3IgKDs7KSB7Ci0JCS8qIGdldC9jbGVhciBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgKi8KLQkJc3RhdD16cnJlYWQoWk9SQU5fSVNSKTsKLQkJZXN0YXQ9c3RhdCAmIHpycmVhZChaT1JBTl9JQ1IpOwotCQlpZiAoIWVzdGF0KQotCQkJcmV0dXJuOwotCQl6cndyaXRlKGVzdGF0LFpPUkFOX0lTUik7Ci0JCUlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiZXN0YXQgJTA4eFxuIixDQVJELGVzdGF0KSk7Ci0JCUlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiIHN0YXQgJTA4eFxuIixDQVJELHN0YXQpKTsKLQotCQlpZiAoZXN0YXQgJiBaT1JBTl9JU1JfQ09ERSkKLQkJewotCQkJSURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJDb2RSZXBsSVJRXG4iLENBUkQpKTsKLQkJfQotCQlpZiAoZXN0YXQgJiBaT1JBTl9JU1JfR0lSUTApCi0JCXsKLQkJCUlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiR0lSUTBcbiIsQ0FSRCkpOwotCQkJaWYgKCF6dHYtPmNhcmQtPnVzZWdpcnExKQotCQkJCXJlYXBfc3RhdGVzKHp0dik7Ci0JCX0KLQkJaWYgKGVzdGF0ICYgWk9SQU5fSVNSX0dJUlExKQotCQl7Ci0JCQlJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIkdJUlExXG4iLENBUkQpKTsKLQkJCWlmICh6dHYtPmNhcmQtPnVzZWdpcnExKQotCQkJCXJlYXBfc3RhdGVzKHp0dik7Ci0JCX0KLQotCQljb3VudCsrOwotCQlpZiAoY291bnQgPiAxMCkKLQkJCXByaW50ayhDQVJEX0VSUiAiaXJxIGxvb3AgJWQgKCV4KVxuIixDQVJELGNvdW50LGVzdGF0KTsKLQkJaWYgKGNvdW50ID4gMjApCi0JCXsKLQkJCXpyd3JpdGUoMCwgWk9SQU5fSUNSKTsKLQkJCXByaW50ayhDQVJEX0VSUiAiSVJRIGxvY2t1cCwgY2xlYXJlZCBpbnQgbWFza1xuIixDQVJEKTsKLQkJfQotCX0KLX0KLQotc3RhdGljCi1pbnQgem9yYW5fbXV4c2VsKHN0cnVjdCB6b3JhbiogenR2LCBpbnQgY2hhbm5lbCwgaW50IG5vcm0pCi17Ci0JaW50CXJ2OwotCi0JLyogc2V0IHRoZSBuZXcgdmlkZW8gbm9ybSAqLwotCXJ2ID0gaTJjX2NvbnRyb2xfZGV2aWNlKCYoenR2LT5pMmMpLCBJMkNfRFJJVkVSSURfVklERU9ERUNPREVSLCBERUNPREVSX1NFVF9OT1JNLCAmbm9ybSk7Ci0JaWYgKHJ2KQotCQlyZXR1cm4gcnY7Ci0JenR2LT5ub3JtID0gbm9ybTsKLQotCS8qIG1hcCB0aGUgZ2l2ZW4gY2hhbm5lbCB0byB0aGUgY2FyZHMgZGVjb2RlcidzIGNoYW5uZWwgKi8KLQljaGFubmVsID0genR2LT5jYXJkLT52aWRlb19tdXhbY2hhbm5lbF0gJiBDSEFOTkVMX01BU0s7Ci0KLQkvKiBzZXQgdGhlIG5ldyBjaGFubmVsICovCi0JcnYgPSBpMmNfY29udHJvbF9kZXZpY2UoJih6dHYtPmkyYyksIEkyQ19EUklWRVJJRF9WSURFT0RFQ09ERVIsIERFQ09ERVJfU0VUX0lOUFVULCAmY2hhbm5lbCk7Ci0JcmV0dXJuIHJ2OwotfQotCi0vKiBUZWxsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGF0IHRvIHRvLiAgKi8KLXN0YXRpYwotdm9pZCB6b3Jhbl9jYXAoc3RydWN0IHpvcmFuKiB6dHYsIGludCBvbikKLXsKLURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJ6b3Jhbl9jYXAoJWQpIHN0YXRlPSV4XG4iLENBUkQsb24senR2LT5zdGF0ZSkpOwotCi0JaWYgKG9uKSB7Ci0JCXp0di0+cnVubmluZyA9IDE7Ci0KLQkJLyoKLQkJICogdHVybiBpbnRlcnJ1cHRzIChiYWNrKSBvbi4gVGhlIERNQSB3aWxsIGJlIGVuYWJsZWQKLQkJICogaW5zaWRlIHRoZSBpcnEgaGFuZGxlciB3aGVuIGl0IGRldGVjdHMgYSByZXN0YXJ0LgotCQkgKi8KLQkJenJvcihaT1JBTl9JQ1JfRU4sWk9SQU5fSUNSKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIHR1cm4gYm90aCBpbnRlcnJ1cHRzIGFuZCBETUEgb2ZmCi0JCSAqLwotCQl6cmFuZCh+Wk9SQU5fVkRDX1ZJREVOLFpPUkFOX1ZEQyk7Ci0JCXpyYW5kKH5aT1JBTl9JQ1JfRU4sWk9SQU5fSUNSKTsKLQotCQl6dHYtPnJ1bm5pbmcgPSAwOwotCX0KLX0KLQotc3RhdGljIHVsb25nIGRtYXNrW10gPSB7Ci0JMHhGRkZGRkZGRiwgMHhGRkZGRkZGRSwgMHhGRkZGRkZGQywgMHhGRkZGRkZGOCwKLQkweEZGRkZGRkYwLCAweEZGRkZGRkUwLCAweEZGRkZGRkMwLCAweEZGRkZGRjgwLAotCTB4RkZGRkZGMDAsIDB4RkZGRkZFMDAsIDB4RkZGRkZDMDAsIDB4RkZGRkY4MDAsCi0JMHhGRkZGRjAwMCwgMHhGRkZGRTAwMCwgMHhGRkZGQzAwMCwgMHhGRkZGODAwMCwKLQkweEZGRkYwMDAwLCAweEZGRkUwMDAwLCAweEZGRkMwMDAwLCAweEZGRjgwMDAwLAotCTB4RkZGMDAwMDAsIDB4RkZFMDAwMDAsIDB4RkZDMDAwMDAsIDB4RkY4MDAwMDAsCi0JMHhGRjAwMDAwMCwgMHhGRTAwMDAwMCwgMHhGQzAwMDAwMCwgMHhGODAwMDAwMCwKLQkweEYwMDAwMDAwLCAweEUwMDAwMDAwLCAweEMwMDAwMDAwLCAweDgwMDAwMDAwCi19OwotCi1zdGF0aWMKLXZvaWQgem9yYW5fYnVpbHRfb3ZlcmxheShzdHJ1Y3Qgem9yYW4qIHp0diwgaW50IGNvdW50LCBzdHJ1Y3QgdmlkZW9fY2xpcCAqdmNwKQotewotCXVsb25nKgltdG9wOwotCWludAl5c3RlcCA9ICh6dHYtPnZpZFhzaGlmdCArIHp0di0+dmlkV2lkdGgrMzEpLzMyOwkvKiBuZXh0IERXT1JEICovCi0JaW50CWk7Ci0KLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgb3ZlcmxheSBhdCAlcCwgeXN0ZXA9JWQsIGNsaXBzPSVkXG4iLHp0di0+b3ZlcmluZm8ub3ZlcmxheSx5c3RlcCxjb3VudCkpOwotCi0JZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgewotCQlzdHJ1Y3QgdmlkZW9fY2xpcCAqdnAgPSB2Y3AraTsKLQkJVU5VU0VEKHZwKTsKLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgJWQ6IGNsaXAoJWQsJWQsJWQsJWQpXG4iLCBpLHZwLT54LHZwLT55LHZwLT53aWR0aCx2cC0+aGVpZ2h0KSk7Ci0JfQotCi0JLyoKLQkgKiBhY3RpdmF0ZSB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzY3JlZW4KLQkgKiBOb3RlIHdlIHRha2Ugc29tZSBzaG9ydGN1dHMgaGVyZSwgYmVjYXVzZSB3ZQotCSAqIGtub3cgdGhlIHdpZHRoIGNhbiBuZXZlciBiZSA8IDMyLiAoSS5lLiBhIERXT1JEKQotCSAqIFdlIGFsc28gYXNzdW1lIHRoZSBvdmVybGF5IHN0YXJ0cyBzb21ld2hlcmUgaW4KLQkgKiB0aGUgRklSU1QgZHdvcmQuCi0JICovCi0JewotCQlpbnQgc3RhcnQgPSB6dHYtPnZpZFhzaGlmdDsKLQkJdWxvbmcgZmlyc3RkID0gZG1hc2tbc3RhcnRdOwotCQl1bG9uZyBsYXN0ZCA9IH5kbWFza1soc3RhcnQgKyB6dHYtPm92ZXJpbmZvLncpICYgMzFdOwotCQltdG9wID0genR2LT5vdmVyaW5mby5vdmVybGF5OwotCQlmb3IgKGk9MDsgaTx6dHYtPm92ZXJpbmZvLmg7IGkrKykgewotCQkJaW50IHcgPSB6dHYtPnZpZFdpZHRoOwotCQkJdWxvbmcqIGxpbmUgPSBtdG9wOwotCQkJaWYgKHN0YXJ0ICYgMzEpIHsKLQkJCQkqbGluZSsrID0gZmlyc3RkOwotCQkJCXcgLT0gMzItKHN0YXJ0JjMxKTsKLQkJCX0KLQkJCW1lbXNldChsaW5lLCB+MCwgdy84KTsKLQkJCWlmICh3ICYgMzEpCi0JCQkJbGluZVt3LzMyXSA9IGxhc3RkOwotCQkJbXRvcCArPSB5c3RlcDsKLQkJfQotCX0KLQotCS8qIHByb2Nlc3MgY2xpcHBpbmcgcmVnaW9ucyAqLwotCWZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJaW50IGg7Ci0JCWlmICh2Y3AtPnggPCAwIHx8ICh1aW50KXZjcC0+eCA+IHp0di0+b3ZlcmluZm8udyB8fAotCQkgICAgdmNwLT55IDwgMCB8fCB2Y3AtPnkgPiB6dHYtPm92ZXJpbmZvLmggfHwKLQkJICAgIHZjcC0+d2lkdGggPCAwIHx8ICh1aW50KSh2Y3AtPngrdmNwLT53aWR0aCkgPiB6dHYtPm92ZXJpbmZvLncgfHwKLQkJICAgIHZjcC0+aGVpZ2h0IDwgMCB8fCAodmNwLT55K3ZjcC0+aGVpZ2h0KSA+IHp0di0+b3ZlcmluZm8uaCkKLQkJewotCQkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgImludmFsaWQgY2xpcHpvbmUgKCVkLCVkLCVkLCVkKSBub3QgaW4gKDAsMCwlZCwlZCksIGFkYXB0aW5nXG4iLENBUkQsdmNwLT54LHZjcC0+eSx2Y3AtPndpZHRoLHZjcC0+aGVpZ2h0LHp0di0+b3ZlcmluZm8udyx6dHYtPm92ZXJpbmZvLmgpKTsKLQkJCWlmICh2Y3AtPnggPCAwKSB2Y3AtPnggPSAwOwotCQkJaWYgKCh1aW50KXZjcC0+eCA+IHp0di0+b3ZlcmluZm8udykgdmNwLT54ID0genR2LT5vdmVyaW5mby53OwotCQkJaWYgKHZjcC0+eSA8IDApIHZjcC0+eSA9IDA7Ci0JCQlpZiAodmNwLT55ID4genR2LT5vdmVyaW5mby5oKSB2Y3AtPnkgPSB6dHYtPm92ZXJpbmZvLmg7Ci0JCQlpZiAodmNwLT53aWR0aCA8IDApIHZjcC0+d2lkdGggPSAwOwotCQkJaWYgKCh1aW50KSh2Y3AtPngrdmNwLT53aWR0aCkgPiB6dHYtPm92ZXJpbmZvLncpIHZjcC0+d2lkdGggPSB6dHYtPm92ZXJpbmZvLncgLSB2Y3AtPng7Ci0JCQlpZiAodmNwLT5oZWlnaHQgPCAwKSB2Y3AtPmhlaWdodCA9IDA7Ci0JCQlpZiAodmNwLT55K3ZjcC0+aGVpZ2h0ID4genR2LT5vdmVyaW5mby5oKSB2Y3AtPmhlaWdodCA9IHp0di0+b3ZlcmluZm8uaCAtIHZjcC0+eTsKLS8vCQkJY29udGludWU7Ci0JCX0KLQotCQltdG9wID0gJnp0di0+b3ZlcmluZm8ub3ZlcmxheVt2Y3AtPnkqeXN0ZXBdOwotCQlmb3IgKGg9MDsgaDw9dmNwLT5oZWlnaHQ7IGgrKykgewotCQkJaW50IHc7Ci0JCQlpbnQgeCA9IHp0di0+dmlkWHNoaWZ0ICsgdmNwLT54OwotCQkJZm9yICh3PTA7IHc8PXZjcC0+d2lkdGg7IHcrKykgewotCQkJCWNsZWFyX2JpdCh4JjMxLCAmbXRvcFt4LzMyXSk7Ci0JCQkJeCsrOwotCQkJfQotCQkJbXRvcCArPSB5c3RlcDsKLQkJfQotCQkrK3ZjcDsKLQl9Ci0KLQltdG9wID0genR2LT5vdmVyaW5mby5vdmVybGF5OwotCXpyd3JpdGUodmlydF90b19idXMobXRvcCksIFpPUkFOX01UT1ApOwotCXpyd3JpdGUodmlydF90b19idXMobXRvcCt5c3RlcCksIFpPUkFOX01CT1QpOwotCXpyYW9yKCh6dHYtPnZpZEludGVybGFjZSp5c3RlcCk8PDAsflpPUkFOX09DUl9NQVNLU1RSSURFLFpPUkFOX09DUik7Ci19Ci0KLXN0cnVjdCB0dm5vcm0KLXsKLQl1MTYgV3QsIFdhLCBIdCwgSGEsIEhTdGFydCwgVlN0YXJ0OwotfTsKLQotc3RhdGljIHN0cnVjdCB0dm5vcm0gdHZub3Jtc1tdID0gewotCS8qIFBBTC1CREdISSAqLwotLyoJeyA4NjQsIDcyMCwgNjI1LCA1NzYsIDEzMSwgMjEgfSwqLwotLyowMCovCXsgODY0LCA3NjgsIDYyNSwgNTc2LCA4MSwgMTcgfSwKLQkvKiBOVFNDICovCi0vKjAxKi8JeyA4NTgsIDcyMCwgNTI1LCA0ODAsIDEyMSwgMTAgfSwKLQkvKiBTRUNBTSAqLwotLyowMiovCXsgODY0LCA3MjAsIDYyNSwgNTc2LCAxMzEsIDIxIH0sCi0JLyogQlc1MCAqLwotLyowMyovCXsgODY0LCA3MjAsIDYyNSwgNTc2LCAxMzEsIDIxIH0sCi0JLyogQlc2MCAqLwotLyowNCovCXsgODU4LCA3MjAsIDUyNSwgNDgwLCAxMjEsIDEwIH0KLX07Ci0jZGVmaW5lIFRWTk9STVMgKHNpemVvZih0dm5vcm1zKS9zaXplb2YodHZub3JtKSkKLQotLyoKLSAqIFByb2dyYW0gdGhlIGNoaXAgZm9yIGEgc2V0dXAgYXMgZGVzY3JpYmVkIGluIHRoZSB2aWRpbmZvIHN0cnVjdC4KLSAqCi0gKiBTaWRlLWVmZmVjdHM6IGNhbGN1bGF0ZXMgdmlkWHNoaWZ0LCB2aWRJbnRlcmxhY2UsCi0gKiB2aWRIZWlnaHQsIHZpZFdpZHRoIHdoaWNoIGFyZSB1c2VkIGluIGEgbGF0ZXIgc3RhZ2UKLSAqIHRvIGNhbGN1bGF0ZSB0aGUgb3ZlcmxheSBtYXNrCi0gKgotICogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiwgYXMgc3VjaCBpdCBkb2VzIG5vdCBjaGVjayB0aGUKLSAqIHZhbGlkaXR5IG9mIHRoZSBzdHJ1Y3QgbWVtYmVycy4uLiBTcGVjdGFjdWxhaXIgY3Jhc2hlcyB3aWxsCi0gKiBmb2xsb3cgL3ZlcnkvIHF1aWNrIHdoZW4geW91J3JlIHdyb25nIGFuZCB0aGUgY2hpcCByaWdodCA6KQotICovCi1zdGF0aWMKLXZvaWQgem9yYW5fc2V0X2dlbyhzdHJ1Y3Qgem9yYW4qIHp0diwgc3RydWN0IHZpZGluZm8qIGkpCi17Ci0JdWxvbmcJdG9wLCBib3Q7Ci0JaW50CXN0cmlkZTsKLQlpbnQJd2luV2lkdGgsIHdpbkhlaWdodDsKLQlpbnQJbWF4V2lkdGgsIG1heEhlaWdodCwgbWF4WE9mZnNldCwgbWF4WU9mZnNldDsKLQlsb25nCXZmZWM7Ci0KLURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJzZXRfZ2VvKHJlY3Q9KCVkLCVkLCVkLCVkKSwgbm9ybT0lZCwgZm9ybWF0PSVkLCBicHA9JWQsIGJwbD0lZCwgYnVzYWRyPSVseCwgb3ZlcmxheT0lcClcbiIsQ0FSRCxpLT54LGktPnksaS0+dyxpLT5oLHp0di0+bm9ybSxpLT5mb3JtYXQsaS0+YnBwLGktPmJwbCxpLT5idXNhZHIsaS0+b3ZlcmxheSkpOwotCi0JLyoKLQkgKiBtYWtlIHN1cmUgdGhlIERNQSB0cmFuc2ZlcnMgYXJlIGluaGliaXRlZCBkdXJpbmcgb3VyCi0JICogcmVwcm9ncmFtbWluZyBvZiB0aGUgY2hpcAotCSAqLwotCXpyYW5kKH5aT1JBTl9WRENfVklERU4sWk9SQU5fVkRDKTsKLQotCW1heFdpZHRoID0gdHZub3Jtc1t6dHYtPm5vcm1dLldhOwotCW1heEhlaWdodCA9IHR2bm9ybXNbenR2LT5ub3JtXS5IYS8yOwotCW1heFhPZmZzZXQgPSB0dm5vcm1zW3p0di0+bm9ybV0uSFN0YXJ0OwotCW1heFlPZmZzZXQgPSB0dm5vcm1zW3p0di0+bm9ybV0uVlN0YXJ0OwotCi0JLyogc2V0dXAgdmZlYyByZWdpc3RlciAoa2VlcCBFeHRGbCxUb3BGaWVsZCBhbmQgVkNMS1BvbCBzZXR0aW5ncykgKi8KLQl2ZmVjID0gKHpycmVhZChaT1JBTl9WRkVDKSAmIChaT1JBTl9WRkVDX0VYVEZMfFpPUkFOX1ZGRUNfVE9QRklFTER8Wk9SQU5fVkZFQ19WQ0xLUE9MKSkgfAotCSAgICAgICAocGFsZXR0ZTJmbXRbaS0+Zm9ybWF0XS5tb2RlICYgKFpPUkFOX1ZGRUNfUkdCfFpPUkFOX1ZGRUNfRVJSRElGfFpPUkFOX1ZGRUNfTEV8Wk9SQU5fVkZFQ19QQUNLMjQpKTsKLQotCS8qCi0JICogU2V0IHRvcCwgYm90dG9tIHB0cnMuIFNpbmNlIHRoZXNlIG11c3QgYmUgRFdPUkQgYWxpZ25lZCwKLQkgKiBwb3NzaWJsZSBhZGp1c3QgdGhlIHggYW5kIHRoZSB3aWR0aCBvZiB0aGUgd2luZG93LgotCSAqIHNvIHRoZSBlbmRwb3NpdGlvbiBzdGF5IHRoZSBzYW1lLiBUaGUgdmlkWHNoaWZ0IHdpbGwgbWFrZQotCSAqIHN1cmUgd2UgYXJlIG5vdCB3cml0aW5nIHBpeGVscyBiZWZvcmUgdGhlIHJlcXVlc3RlZCB4LgotCSAqLwotCXp0di0+dmlkWHNoaWZ0ID0gMDsKLQl3aW5XaWR0aCA9IGktPnc7Ci0JaWYgKHdpbldpZHRoIDwgMCkKLQkJd2luV2lkdGggPSAtd2luV2lkdGg7Ci0JdG9wID0gaS0+YnVzYWRyICsgaS0+eCppLT5icHAgKyBpLT55KmktPmJwbDsKLQlpZiAodG9wICYgMykgewotCQl6dHYtPnZpZFhzaGlmdCA9ICh0b3AgJiAzKSAvIGktPmJwcDsKLQkJd2luV2lkdGggKz0genR2LT52aWRYc2hpZnQ7Ci0JCURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgd2luZG93LXggc2hpZnRlZCAlZCBwaXhlbHMgbGVmdFxuIix6dHYtPnZpZFhzaGlmdCkpOwotCQl0b3AgJj0gfjM7Ci0JfQotCi0JLyoKLQkgKiBib3R0b20gcG9pbnRzIHRvIG5leHQgZnJhbWUgYnV0IGluIGludGVybGVhdmVkIG1vZGUgd2Ugd2FudAotCSAqIHRvICdtaXgnIHRoZSAyIGZyYW1lcyB0byBvbmUgY2FwdHVyZSwgc28gJ2JvdCcgcG9pbnRzIHRvIG9uZQotCSAqIChwaHlzaWNhbCkgbGluZSBiZWxvdyB0aGUgdG9wIGxpbmUuCi0JICovCi0JYm90ID0gdG9wICsgaS0+YnBsOwotCXpyd3JpdGUodG9wLFpPUkFOX1ZUT1ApOwotCXpyd3JpdGUoYm90LFpPUkFOX1ZCT1QpOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIHdpbldpZHRoIGlzIERXT1JEIGFsaWduZWQgdG9vLAotCSAqIHRoZXJlYnkgYXV0b21hdGljbHkgbWFraW5nIHN1cmUgdGhlIHN0cmlkZSB0byB0aGUKLQkgKiBuZXh0IGxpbmUgaXMgRFdPUkQgYWxpZ25lZCB0b28gKGFzIHJlcXVpcmVkIGJ5IHNwZWMpLgotCSAqLwotCWlmICgod2luV2lkdGgqaS0+YnBwKSAmIDMpIHsKLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgd2luZG93LXdpZHRoIGVubGFyZ2VkIGJ5ICVkIHBpeGVsc1xuIiwod2luV2lkdGgqaS0+YnBwKSAmIDMpKTsKLQkJd2luV2lkdGggKz0gKHdpbldpZHRoKmktPmJwcCkgJiAzOwotCX0KLQotCS8qIGRldGVybWluZSB0aGUgRGlzcE1vZGUgYW5kIHN0cmlkZSAqLwotCWlmIChpLT5oID49IDAgJiYgaS0+aCA8PSBtYXhIZWlnaHQpIHsKLQkJLyogc2luZ2xlIGZyYW1lIGdyYWIgc3VmZmljZXMgZm9yIHRoaXMgaGVpZ2h0LiAqLwotCQl2ZmVjIHw9IFpPUkFOX1ZGRUNfRElTUE1PRDsKLQkJenR2LT52aWRJbnRlcmxhY2UgPSAwOwotCQlzdHJpZGUgPSBpLT5icGwgLSAod2luV2lkdGgqaS0+YnBwKTsKLQkJd2luSGVpZ2h0ID0gaS0+aDsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGludGVybGVhdmluZyBuZWVkZWQgZm9yIHRoaXMgaGVpZ2h0ICovCi0JCXp0di0+dmlkSW50ZXJsYWNlID0gMTsKLQkJc3RyaWRlID0gaS0+YnBsKjIgLSAod2luV2lkdGgqaS0+YnBwKTsKLQkJd2luSGVpZ2h0ID0gaS0+aC8yOwotCX0KLQlpZiAod2luSGVpZ2h0IDwgMCkJLyogY2FuIGhhcHBlbiBmb3IgVkJJISAqLwotCQl3aW5IZWlnaHQgPSAtd2luSGVpZ2h0OwotCi0JLyogc2FmZXR5IG5ldCwgc29tZXRpbWVzIGJwbCBpcyB0b28gc2hvcnQ/Pz8gKi8KLQlpZiAoc3RyaWRlPDApIHsKLURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJXQVJOSU5HIHN0cmlkZSA9ICVkXG4iLENBUkQsc3RyaWRlKSk7Ci0JCXN0cmlkZSA9IDA7Ci0JfQotCi0JenJhb3IoKHdpbkhlaWdodDw8MTIpfCh3aW5XaWR0aDw8MCksfihaT1JBTl9WRENfVklEV0lOSFR8Wk9SQU5fVkRDX1ZJRFdJTldJRCksIFpPUkFOX1ZEQyk7Ci0JenJhb3Ioc3RyaWRlPDwxNix+Wk9SQU5fVlNUUl9ESVNQU1RSSURFLFpPUkFOX1ZTVFIpOwotCi0JLyogcmVtZW1iZXIgdmlkV2lkdGgsIHZpZEhlaWdodCBmb3Igb3ZlcmxheSBjYWxjdWxhdGlvbnMgKi8KLQl6dHYtPnZpZFdpZHRoID0gd2luV2lkdGg7Ci0JenR2LT52aWRIZWlnaHQgPSB3aW5IZWlnaHQ7Ci1ERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiICAgICAgIHRvcD0lMDhseCwgYm90dG9tPSUwOGx4XG4iLHRvcCxib3QpKTsKLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgd2luV2lkdGg9JWQsIHdpbkhlaWdodD0lZFxuIix3aW5XaWR0aCx3aW5IZWlnaHQpKTsKLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgbWF4V2lkdGg9JWQsIG1heEhlaWdodD0lZFxuIixtYXhXaWR0aCxtYXhIZWlnaHQpKTsKLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgc3RyaWRlPSVkXG4iLHN0cmlkZSkpOwotCi0JLyoKLQkgKiBkZXRlcm1pbmUgaG9yaXpvbnRhbCBzY2FsZXMgYW5kIGNyb3BzCi0JICovCi0JaWYgKGktPncgPCAwKSB7Ci0JCWludCBIc3RhcnQgPSAxOwotCQlpbnQgSGVuZCA9IEhzdGFydCArIHdpbldpZHRoOwotREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICBZOiBzY2FsZT0wLCBzdGFydD0lZCwgZW5kPSVkXG4iLCBIc3RhcnQsIEhlbmQpKTsKLQkJenJhb3IoKEhzdGFydDw8MTApfChIZW5kPDwwKSx+KFpPUkFOX1ZGRUhfSFNUQVJUfFpPUkFOX1ZGRUhfSEVORCksWk9SQU5fVkZFSCk7Ci0JfQotCWVsc2UgewotCQlpbnQgV2EgPSBtYXhXaWR0aDsKLQkJaW50IFggPSAod2luV2lkdGgqNjQrV2EtMSkvV2E7Ci0JCWludCBXZSA9IHdpbldpZHRoKjY0L1g7Ci0JCWludCBIb3JEY20gPSA2NC1YOwotCQlpbnQgaGNyb3AxID0gMiooV2EtV2UpLzQ7Ci0JCS8qCi0JCSAqIEJVR0ZJWDogSnVoYSBOdXJtZWxhIDxqdW5raUBxbi1scHIyLTE2NS5xdWlja25ldC5pbmV0LmZpPgotCQkgKiBmb3VuZCB0aGUgc29sdXRpb24gdG8gdGhlIGNvbG9yIHBoYXNlIHNoaWZ0LgotCQkgKiBTZWUgQ2hhbmdlTG9nIGZvciB0aGUgZnVsbCBleHBsYW5hdGlvbikKLQkJICovCi0JCWludCBIc3RhcnQgPSAobWF4WE9mZnNldCArIGhjcm9wMSkgfCAxOwotCQlpbnQgSGVuZCA9IEhzdGFydCArIFdlIC0gMTsKLQotREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICBYOiBzY2FsZT0lZCwgc3RhcnQ9JWQsIGVuZD0lZFxuIiwgSG9yRGNtLCBIc3RhcnQsIEhlbmQpKTsKLQotCQl6cmFvcigoSHN0YXJ0PDwxMCl8KEhlbmQ8PDApLH4oWk9SQU5fVkZFSF9IU1RBUlR8Wk9SQU5fVkZFSF9IRU5EKSxaT1JBTl9WRkVIKTsKLQkJdmZlYyB8PSBIb3JEY208PDE0OwotCi0JCWlmIChIb3JEY208MTYpCi0JCQl2ZmVjIHw9IFpPUkFOX1ZGRUNfSEZJTFRFUl8xOyAvKiBubyBmaWx0ZXIgKi8KLQkJZWxzZSBpZiAoSG9yRGNtPDMyKQotCQkJdmZlYyB8PSBaT1JBTl9WRkVDX0hGSUxURVJfMzsgLyogMyB0YXAgZmlsdGVyICovCi0JCWVsc2UgaWYgKEhvckRjbTw0OCkKLQkJCXZmZWMgfD0gWk9SQU5fVkZFQ19IRklMVEVSXzQ7IC8qIDQgdGFwIGZpbHRlciAqLwotCQllbHNlCXZmZWMgfD0gWk9SQU5fVkZFQ19IRklMVEVSXzU7IC8qIDUgdGFwIGZpbHRlciAqLwotCX0KLQotCS8qCi0JICogRGV0ZXJtaW5lIHZlcnRpY2FsIHNjYWxlcyBhbmQgY3JvcHMKLQkgKgotCSAqIHdoZW4gaGVpZ2h0IGlzIG5lZ2F0aXZlLCB3ZSB3YW50IHRvIHJlYWQgc3RhcnRpbmcgYXQgbGluZSAwCi0JICogT25lIGRheSBzb21lb25lIG1pZ2h0IG5lZWQgYWNjZXNzIHRvIHRoZXNlIGxpbmVzLi4uCi0JICovCi0JaWYgKGktPmggPCAwKSB7Ci0JCWludCBWc3RhcnQgPSAwOwotCQlpbnQgVmVuZCA9IFZzdGFydCArIHdpbkhlaWdodDsKLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgWTogc2NhbGU9MCwgc3RhcnQ9JWQsIGVuZD0lZFxuIiwgVnN0YXJ0LCBWZW5kKSk7Ci0JCXpyYW9yKChWc3RhcnQ8PDEwKXwoVmVuZDw8MCksfihaT1JBTl9WRkVWX1ZTVEFSVHxaT1JBTl9WRkVWX1ZFTkQpLFpPUkFOX1ZGRVYpOwotCX0KLQllbHNlIHsKLQkJaW50IEhhID0gbWF4SGVpZ2h0OwotCQlpbnQgWSA9ICh3aW5IZWlnaHQqNjQrSGEtMSkvSGE7Ci0JCWludCBIZSA9IHdpbkhlaWdodCo2NC9ZOwotCQlpbnQgVmVyRGNtID0gNjQtWTsKLQkJaW50IHZjcm9wMSA9IDIqKEhhLUhlKS80OwotCQlpbnQgVnN0YXJ0ID0gbWF4WU9mZnNldCArIHZjcm9wMTsKLQkJaW50IFZlbmQgPSBWc3RhcnQgKyBIZSAtIDE7Ci0KLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgWTogc2NhbGU9JWQsIHN0YXJ0PSVkLCBlbmQ9JWRcbiIsIFZlckRjbSwgVnN0YXJ0LCBWZW5kKSk7Ci0JCXpyYW9yKChWc3RhcnQ8PDEwKXwoVmVuZDw8MCksfihaT1JBTl9WRkVWX1ZTVEFSVHxaT1JBTl9WRkVWX1ZFTkQpLFpPUkFOX1ZGRVYpOwotCQl2ZmVjIHw9IFZlckRjbTw8ODsKLQl9Ci0KLURFQlVHKHByaW50ayhLRVJOX0RFQlVHICIgICAgICAgRjogZm9ybWF0PSVkKD0lcylcbiIsaS0+Zm9ybWF0LHBhbGV0dGUyZm10W2ktPmZvcm1hdF0ubmFtZSkpOwotCi0JLyogc2V0dXAgdGhlIHJlcXVlc3RlZCBmb3JtYXQgKi8KLQl6cndyaXRlKHZmZWMsIFpPUkFOX1ZGRUMpOwotfQotCi1zdGF0aWMKLXZvaWQgem9yYW5fY29tbW9uX29wZW4oc3RydWN0IHpvcmFuKiB6dHYsIGludCBmbGFncykKLXsKLQlVTlVTRUQoZmxhZ3MpOwotCi0JLyogYWxyZWFkeSBvcGVuZWQ/ICovCi0JaWYgKHp0di0+dXNlcnMrKyAhPSAwKQotCQlyZXR1cm47Ci0KLQkvKiB1bm11dGUgYXVkaW8gKi8KLQkvKiAvd2hhdC8gYXVkaW8/ICovCi0KLQl6dHYtPnN0YXRlID0gMDsKLQotCS8qIHNldHVwIHRoZSBlbmNvZGVyIHRvIHRoZSBpbml0aWFsIHZhbHVlcyAqLwotCXp0di0+cGljdHVyZS5jb2xvdXI9MjU0PDw3OwotCXp0di0+cGljdHVyZS5icmlnaHRuZXNzPTEyODw8ODsKLQl6dHYtPnBpY3R1cmUuaHVlPTEyODw8ODsKLQl6dHYtPnBpY3R1cmUuY29udHJhc3Q9MjE2PDw3OwotCWkyY19jb250cm9sX2RldmljZSgmenR2LT5pMmMsIEkyQ19EUklWRVJJRF9WSURFT0RFQ09ERVIsIERFQ09ERVJfU0VUX1BJQ1RVUkUsICZ6dHYtPnBpY3R1cmUpOwotCi0JLyogZGVmYXVsdCB0byB0aGUgY29tcG9zaXRlIGlucHV0IHNpbmNlIG15IGNhbWVyYSBpcyB0aGVyZSAqLwotCXpvcmFuX211eHNlbCh6dHYsIDAsIFZJREVPX01PREVfUEFMKTsKLX0KLQotc3RhdGljCi12b2lkIHpvcmFuX2NvbW1vbl9jbG9zZShzdHJ1Y3Qgem9yYW4qIHp0dikKLXsKLQlpZiAoLS16dHYtPnVzZXJzICE9IDApCi0JCXJldHVybjsKLQotCS8qIG11dGUgYXVkaW8gKi8KLQkvKiAvd2hhdC8gYXVkaW8/ICovCi0KLQkvKiBzdG9wIHRoZSBjaGlwICovCi0Jem9yYW5fY2FwKHp0diwgMCk7Ci19Ci0KLS8qCi0gKiBPcGVuIGEgem9yYW4gY2FyZC4gUmlnaHQgbm93IHRoZSBmbGFncyBhcmUganVzdCBhIGhhY2sKLSAqLwotc3RhdGljIGludCB6b3Jhbl9vcGVuKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgaW50IGZsYWdzKQotewotCXN0cnVjdCB6b3JhbiAqenR2ID0gKHN0cnVjdCB6b3JhbiopZGV2OwotCXN0cnVjdCB2aWRpbmZvKiBpdGVtOwotCWNoYXIqIHBvczsKLQotCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJvcGVuKGRldiwlZClcbiIsQ0FSRCxmbGFncykpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFdlIHJlYWxseSBzaG91bGQgYmUgZG9pbmcgbGF6eSBhbGxvY2luZy4uLgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogYWxsb2NhdGUgYSBmcmFtZSBidWZmZXIgKi8KLQlpZiAoIXp0di0+ZmJ1ZmZlcikKLQkJenR2LT5mYnVmZmVyID0gYm1hbGxvYyhaT1JBTl9NQVhfRkJVRlNJWkUpOwotCWlmICghenR2LT5mYnVmZmVyKSB7Ci0JCS8qIGNvdWxkIG5vdCBnZXQgYSBidWZmZXIsIGJhaWwgb3V0ICovCi0JCXJldHVybiAtRU5PQlVGUzsKLQl9Ci0JLyogYXQgdGhpcyB0aW1lIHdlIF9hbHdheXNfIGhhdmUgYSBmcmFtZWJ1ZmZlciAqLwotCW1lbXNldCh6dHYtPmZidWZmZXIsMCxaT1JBTl9NQVhfRkJVRlNJWkUpOwotCi0JaWYgKCF6dHYtPm92ZXJpbmZvLm92ZXJsYXkpCi0JCXp0di0+b3ZlcmluZm8ub3ZlcmxheSA9IGttYWxsb2MoMTAyNCoxMDI0LzgsIEdGUF9LRVJORUwpOwotCWlmICghenR2LT5vdmVyaW5mby5vdmVybGF5KSB7Ci0JCS8qIGNvdWxkIG5vdCBnZXQgYW4gb3ZlcmxheSBidWZmZXIsIGJhaWwgb3V0ICovCi0JCWJmcmVlKHp0di0+ZmJ1ZmZlciwgWk9SQU5fTUFYX0ZCVUZTSVpFKTsKLQkJcmV0dXJuIC1FTk9CVUZTOwotCX0KLQkvKiBhdCB0aGlzIHRpbWUgd2UgX2Fsd2F5c18gaGF2ZSBhIG92ZXJsYXkgKi8KLQotCS8qIGNsZWFyIGJ1ZmZlciBzdGF0dXMsIGFuZCBnaXZlIHRoZW0gYSBETUFhYmxlIGFkZHJlc3MgKi8KLQlwb3MgPSB6dHYtPmZidWZmZXI7Ci0JZm9yIChpdGVtPXp0di0+Z3JhYmluZm87IGl0ZW0hPXp0di0+Z3JhYmluZm8rWk9SQU5fTUFYX0ZCVUZGRVJTOyBpdGVtKyspCi0JewotCQlpdGVtLT5zdGF0dXMgPSBGQlVGRkVSX0ZSRUU7Ci0JCWl0ZW0tPm1lbWFkciA9IHBvczsKLQkJaXRlbS0+YnVzYWRyID0gdmlydF90b19idXMocG9zKTsKLQkJcG9zICs9IFpPUkFOX01BWF9GQlVGRkVSOwotCX0KLQotCS8qIGRvIHRoZSBjb21tb24gcGFydCBvZiBhbGwgb3BlbidzICovCi0Jem9yYW5fY29tbW9uX29wZW4oenR2LCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljCi12b2lkIHpvcmFuX2Nsb3NlKHN0cnVjdCB2aWRlb19kZXZpY2UqIGRldikKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4qKWRldjsKLQotCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJjbG9zZShkZXYpXG4iLENBUkQpKTsKLQotCS8qIGRyaXZlciBzcGVjaWZpYyBjbG9zdXJlICovCi0JY2xlYXJfYml0KFNUQVRFX09WRVJMQVksICZ6dHYtPnN0YXRlKTsKLQotCXpvcmFuX2NvbW1vbl9jbG9zZSh6dHYpOwotCi0JLyoKLQkgKiAgICAgIFRoaXMgaXMgc3Vja3kgYnV0IHJpZ2h0IG5vdyBJIGNhbid0IGZpbmQgYSBnb29kIHdheSB0bwotCSAqICAgICAgYmUgc3VyZSBpdHMgc2FmZSB0byBmcmVlIHRoZSBidWZmZXIuIFdlIHdhaXQgNS02IGZpZWxkcwotCSAqICAgICAgd2hpY2ggaXMgbW9yZSB0aGFuIHN1ZmZpY2llbnQgdG8gYmUgc3VyZS4KLQkgKi8KLQltc2xlZXAoMTAwKTsJCQkvKiBXYWl0IDEvMTB0aCBvZiBhIHNlY29uZCAqLwotCi0JLyogZnJlZSB0aGUgYWxsb2NhdGVkIGZyYW1lYnVmZmVyICovCi0JYmZyZWUoenR2LT5mYnVmZmVyLCBaT1JBTl9NQVhfRkJVRlNJWkUpOwotCXp0di0+ZmJ1ZmZlciA9IDA7Ci0Ja2ZyZWUoenR2LT5vdmVyaW5mby5vdmVybGF5KTsKLQl6dHYtPm92ZXJpbmZvLm92ZXJsYXkgPSAwOwotCi19Ci0KLS8qCi0gKiBUaGlzIHJlYWQgZnVuY3Rpb24gY291bGQgYmUgdXNlZCByZWVudHJhbnQgaW4gYSBTTVAgc2l0dWF0aW9uLgotICoKLSAqIFRoaXMgaXMgbWFkZSBwb3NzaWJsZSBieSB0aGUgc3BpbmxvY2sgd2hpY2ggaXMga2VwdCB0aWxsIHdlCi0gKiBmb3VuZCBhbmQgbWFya2VkIGEgYnVmZmVyIGZvciBvdXIgb3duIHVzZS4gVGhlIGxvY2sgbXVzdAotICogYmUgcmVsZWFzZWQgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBwcmV2ZW50IGxvY2sgY29udGVudGlvbi4KLSAqLwotc3RhdGljCi1sb25nIHpvcmFuX3JlYWQoc3RydWN0IHZpZGVvX2RldmljZSogZGV2LCBjaGFyKiBidWYsIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCBub25ibG9jaykKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4qKWRldjsKLQl1bnNpZ25lZCBsb25nIG1heDsKLQlzdHJ1Y3QgdmlkaW5mbyogdW51c2VkID0gMDsKLQlzdHJ1Y3QgdmlkaW5mbyogZG9uZSA9IDA7Ci0KLQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiem9yYW5fcmVhZCglcCwlbGQsJWQpXG4iLENBUkQsYnVmLGNvdW50LG5vbmJsb2NrKSk7Ci0KLQkvKiBmaW5kIG91cnNlbGYgYSBmcmVlIG9yIGNvbXBsZXRlZCBidWZmZXIgKi8KLQlmb3IgKDs7KSB7Ci0JCXN0cnVjdCB2aWRpbmZvKiBpdGVtOwotCi0JCXdyaXRlX2xvY2tfaXJxKCZ6dHYtPmxvY2spOwotCQlmb3IgKGl0ZW09enR2LT5ncmFiaW5mbzsgaXRlbSE9enR2LT5ncmFiaW5mbytaT1JBTl9NQVhfRkJVRkZFUlM7IGl0ZW0rKykKLQkJewotCQkJaWYgKCF1bnVzZWQgJiYgaXRlbS0+c3RhdHVzID09IEZCVUZGRVJfRlJFRSkKLQkJCQl1bnVzZWQgPSBpdGVtOwotCQkJaWYgKCFkb25lICYmIGl0ZW0tPnN0YXR1cyA9PSBGQlVGRkVSX0RPTkUpCi0JCQkJZG9uZSA9IGl0ZW07Ci0JCX0KLQkJaWYgKGRvbmUgfHwgdW51c2VkKQotCQkJYnJlYWs7Ci0KLQkJLyogbm8gbW9yZSBmcmVlIGJ1ZmZlcnMsIHdhaXQgZm9yIHRoZW0uICovCi0JCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7Ci0JCWlmIChub25ibG9jaykKLQkJCXJldHVybiAtRVdPVUxEQkxPQ0s7Ci0JCWludGVycnVwdGlibGVfc2xlZXBfb24oJnp0di0+Z3JhYnEpOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4gLUVJTlRSOwotCX0KLQotCS8qIERvIHdlIGhhdmUgJ3JlYWR5JyBkYXRhPyAqLwotCWlmICghZG9uZSkgewotCQkvKiBubz8gdGhhbiB0aGlzIHdpbGwgdGFrZSBhIHdoaWxlLi4uICovCi0JCWlmIChub25ibG9jaykgewotCQkJd3JpdGVfdW5sb2NrX2lycSgmenR2LT5sb2NrKTsKLQkJCXJldHVybiAtRVdPVUxEQkxPQ0s7Ci0JCX0KLQotCQkvKiBtYXJrIHRoZSB1bnVzZWQgYnVmZmVyIGFzIHdhbnRlZCAqLwotCQl1bnVzZWQtPnN0YXR1cyA9IEZCVUZGRVJfQlVTWTsKLQkJdW51c2VkLT53ID0gMzIwOwotCQl1bnVzZWQtPmggPSAyNDA7Ci0JCXVudXNlZC0+Zm9ybWF0ID0gVklERU9fUEFMRVRURV9SR0IyNDsKLQkJdW51c2VkLT5icHAgPSBwYWxldHRlMmZtdFt1bnVzZWQtPmZvcm1hdF0uYnBwOwotCQl1bnVzZWQtPmJwbCA9IHVudXNlZC0+dyAqIHVudXNlZC0+YnBwOwotCQl1bnVzZWQtPm5leHQgPSAwOwotCQl7IC8qIGFkZCB0byB0YWlsIG9mIHF1ZXVlICovCi0JCSAgc3RydWN0IHZpZGluZm8qIG9sZGZyYW1lID0genR2LT53b3JrcXVldWU7Ci0JCSAgaWYgKCFvbGRmcmFtZSkgenR2LT53b3JrcXVldWUgPSB1bnVzZWQ7Ci0JCSAgZWxzZSB7Ci0JCSAgICB3aGlsZSAob2xkZnJhbWUtPm5leHQpIG9sZGZyYW1lID0gb2xkZnJhbWUtPm5leHQ7Ci0JCSAgICBvbGRmcmFtZS0+bmV4dCA9IHVudXNlZDsKLQkJICB9Ci0JCX0KLQkJd3JpdGVfdW5sb2NrX2lycSgmenR2LT5sb2NrKTsKLQotCQkvKiB0ZWxsIHRoZSBzdGF0ZSBtYWNoaW5lIHdlIHdhbnQgaXQgZmlsbGVkIC9OT1cvICovCi0JCXpvcmFuX2NhcCh6dHYsIDEpOwotCi0JCS8qIHdhaXQgdGlsbCB0aGlzIGJ1ZmZlciBnZXRzIGdyYWJiZWQgKi8KLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHp0di0+Z3JhYnEsCi0JCQkJKHVudXNlZC0+c3RhdHVzICE9IEZCVUZGRVJfQlVTWSkpOwotCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JCWRvbmUgPSB1bnVzZWQ7Ci0JfQotCWVsc2UKLQkJd3JpdGVfdW5sb2NrX2lycSgmenR2LT5sb2NrKTsKLQotCS8qIFllcyEgd2UgZ290IGRhdGEhICovCi0JbWF4ID0gZG9uZS0+YnBsICogZG9uZS0+aDsKLQlpZiAoY291bnQgPiBtYXgpCi0JCWNvdW50ID0gbWF4OwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQqKWJ1ZiwgZG9uZS0+bWVtYWRyLCBjb3VudCkpCi0JCWNvdW50ID0gLUVGQVVMVDsKLQotCS8qIGtlZXAgdGhlIGVuZ2luZSBydW5uaW5nICovCi0JZG9uZS0+c3RhdHVzID0gRkJVRkZFUl9GUkVFOwotLy8Jem9yYW5fY2FwKHp0diwxKTsKLQotCS8qIHRlbGwgbGlzdGVuZXJzIHRoaXMgYnVmZmVyIGJlY2FtZSBmcmVlICovCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ6dHYtPmdyYWJxKTsKLQotCS8qIGdvb2RieWUgKi8KLQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiem9yYW5fcmVhZCgpIHJldHVybnMgJWx1XG4iLENBUkQsY291bnQpKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYwotbG9uZyB6b3Jhbl93cml0ZShzdHJ1Y3QgdmlkZW9fZGV2aWNlKiBkZXYsIGNvbnN0IGNoYXIqIGJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50IG5vbmJsb2NrKQotewotCXN0cnVjdCB6b3JhbiAqenR2ID0gKHN0cnVjdCB6b3JhbiAqKWRldjsKLQlVTlVTRUQoenR2KTsgVU5VU0VEKGRldik7IFVOVVNFRChidWYpOyBVTlVTRUQoY291bnQpOyBVTlVTRUQobm9uYmxvY2spOwotCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJ6b3Jhbl93cml0ZVxuIixDQVJEKSk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYwotdW5zaWduZWQgaW50IHpvcmFuX3BvbGwoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4gKilkZXY7Ci0Jc3RydWN0IHZpZGluZm8qIGl0ZW07Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0JcG9sbF93YWl0KGZpbGUsICZ6dHYtPmdyYWJxLCB3YWl0KTsKLQotCWZvciAoaXRlbT16dHYtPmdyYWJpbmZvOyBpdGVtIT16dHYtPmdyYWJpbmZvK1pPUkFOX01BWF9GQlVGRkVSUzsgaXRlbSsrKQotCQlpZiAoaXRlbS0+c3RhdHVzID09IEZCVUZGRVJfRE9ORSkKLQkJewotCQkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7Ci0JCQlicmVhazsKLQkJfQotCi0JREVCVUcocHJpbnRrKENBUkRfREVCVUcgInpvcmFuX3BvbGwoKT0leFxuIixDQVJELG1hc2spKTsKLQotCXJldHVybiBtYXNrOwotfQotCi0vKiBhcHBlbmQgYSBuZXcgY2xpcHJlZ2lvbiB0byB0aGUgdmVjdG9yIG9mIHZpZGVvX2NsaXBzICovCi1zdGF0aWMKLXZvaWQgbmV3X2NsaXAoc3RydWN0IHZpZGVvX3dpbmRvdyogdncsIHN0cnVjdCB2aWRlb19jbGlwKiB2Y3AsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQotewotCXZjcFt2dy0+Y2xpcGNvdW50XS54ID0geDsKLQl2Y3BbdnctPmNsaXBjb3VudF0ueSA9IHk7Ci0JdmNwW3Z3LT5jbGlwY291bnRdLndpZHRoID0gdzsKLQl2Y3BbdnctPmNsaXBjb3VudF0uaGVpZ2h0ID0gaDsKLQl2dy0+Y2xpcGNvdW50Kys7Ci19Ci0KLXN0YXRpYwotaW50IHpvcmFuX2lvY3RsKHN0cnVjdCB2aWRlb19kZXZpY2UqIGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCB6b3JhbiogenR2ID0gKHN0cnVjdCB6b3JhbiopZGV2OwotCi0Jc3dpdGNoIChjbWQpIHsKLQkgY2FzZSBWSURJT0NHQ0FQOgotCSB7Ci0JCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IGM7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHQ0FQXG4iLENBUkQpKTsKLQotCQlzdHJjcHkoYy5uYW1lLHp0di0+dmlkZW9fZGV2Lm5hbWUpOwotCQljLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFfAotCQkJIFZJRF9UWVBFX09WRVJMQVl8Ci0JCQkgVklEX1RZUEVfQ0xJUFBJTkd8Ci0JCQkgVklEX1RZUEVfRlJBTUVSQU18Ci0JCQkgVklEX1RZUEVfU0NBTEVTOwotCQlpZiAoenR2LT5oYXZlX3R1bmVyKQotCQkJYy50eXBlIHw9IFZJRF9UWVBFX1RVTkVSOwotCQlpZiAocGNpX3Byb2JsZW1zICYgKFBDSVBDSV9GQUlMfFBDSUFHUF9GQUlMKSkKLQkJCWMudHlwZSAmPSB+VklEX1RZUEVfT1ZFUkxBWTsKLQkJaWYgKHp0di0+aGF2ZV9kZWNvZGVyKSB7Ci0JCQljLmNoYW5uZWxzID0genR2LT5jYXJkLT52aWRlb19pbnB1dHM7Ci0JCQljLmF1ZGlvcyA9IHp0di0+Y2FyZC0+YXVkaW9faW5wdXRzOwotCQl9IGVsc2UKLQkJCS8qIG5vIGRlY29kZXIgLT4gbm8gY2hhbm5lbHMgKi8KLQkJCWMuY2hhbm5lbHMgPSBjLmF1ZGlvcyA9IDA7Ci0JCWMubWF4d2lkdGggPSA3Njg7Ci0JCWMubWF4aGVpZ2h0ID0gNTc2OwotCQljLm1pbndpZHRoID0gMzI7Ci0JCWMubWluaGVpZ2h0ID0gMzI7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJnLCZjLHNpemVvZihjKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JIH0KLQotCSBjYXNlIFZJRElPQ0dDSEFOOgotCSB7Ci0JCXN0cnVjdCB2aWRlb19jaGFubmVsIHY7Ci0JCWludCBtdXg7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJnLHNpemVvZih2KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ0dDSEFOKCVkKVxuIixDQVJELHYuY2hhbm5lbCkpOwotCQl2LmZsYWdzPVZJREVPX1ZDX0FVRElPCi0jaWZkZWYgVklERU9fVkNfTk9STQotCQkJfFZJREVPX1ZDX05PUk0KLSNlbmRpZgotCQkJOwotCQl2LnR1bmVycz0wOwotCQl2LnR5cGU9VklERU9fVFlQRV9DQU1FUkE7Ci0jaWZkZWYgSV9FWFBFQ1RfUE9TU0lCTEVfTk9STVNfSU5fVEhFX0FQSQotCQl2Lm5vcm09VklERU9fTU9ERV9QQUx8Ci0JCSAgICAgICBWSURFT19NT0RFX05UU0N8Ci0JCSAgICAgICBWSURFT19NT0RFX1NFQ0FNOwotI2Vsc2UKLQkJdi5ub3JtPVZJREVPX01PREVfUEFMOwotI2VuZGlmCi0JCS8qIHRvbyBtYW55IGlucHV0cz8gbm8gZGVjb2RlciAtPiBubyBjaGFubmVscyAqLwotCQlpZiAoIXp0di0+aGF2ZV9kZWNvZGVyIHx8IHYuY2hhbm5lbCA8IDAgfHwgIHYuY2hhbm5lbCA+PSB6dHYtPmNhcmQtPnZpZGVvX2lucHV0cykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCS8qIG5vdyBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgKi8KLQkJbXV4ID0genR2LT5jYXJkLT52aWRlb19tdXhbdi5jaGFubmVsXTsKLQkJaWYgKG11eCAmIElTX1RVTkVSKSB7Ci0JCQkvKiBsZXRzIGFzc3VtZSBvbmx5IG9uZSB0dW5lciwgeWVzPyAqLwotCQkJc3RyY3B5KHYubmFtZSwiVGVsZXZpc2lvbiIpOwotCQkJdi50eXBlID0gVklERU9fVFlQRV9UVjsKLQkJCWlmICh6dHYtPmhhdmVfdHVuZXIpIHsKLQkJCQl2LmZsYWdzIHw9IFZJREVPX1ZDX1RVTkVSOwotCQkJCXYudHVuZXJzID0gMTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtdXggJiBJU19TVkhTKQotCQkJc3ByaW50Zih2Lm5hbWUsIlMtVmlkZW8tJWQiLHYuY2hhbm5lbCk7Ci0JCWVsc2UKLQkJCXNwcmludGYodi5uYW1lLCJDVkJTLSVkIix2LmNoYW5uZWwpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoYXJnLCZ2LHNpemVvZih2KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JIH0KLQkgY2FzZSBWSURJT0NTQ0hBTjoKLQkgewkvKiBzZXQgdmlkZW8gY2hhbm5lbCAqLwotCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCB2OwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZyxzaXplb2YodikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NTQ0hBTiglZCwlZClcbiIsQ0FSRCx2LmNoYW5uZWwsdi5ub3JtKSk7Ci0KLQkJLyogdG9vIG1hbnkgaW5wdXRzPyBubyBkZWNvZGVyIC0+IG5vIGNoYW5uZWxzICovCi0JCWlmICghenR2LT5oYXZlX2RlY29kZXIgfHwgdi5jaGFubmVsID49IHp0di0+Y2FyZC0+dmlkZW9faW5wdXRzIHx8IHYuY2hhbm5lbCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAodi5ub3JtICE9IFZJREVPX01PREVfUEFMICYmCi0JCSAgICB2Lm5vcm0gIT0gVklERU9fTU9ERV9OVFNDICYmCi0JCSAgICB2Lm5vcm0gIT0gVklERU9fTU9ERV9TRUNBTSAmJgotCQkgICAgdi5ub3JtICE9IFZJREVPX01PREVfQVVUTykKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCQkvKiBtYWtlIGl0IGhhcHBlbiwgbnIxISAqLwotCQlyZXR1cm4gem9yYW5fbXV4c2VsKHp0dix2LmNoYW5uZWwsdi5ub3JtKTsKLQkgfQotCi0JIGNhc2UgVklESU9DR1RVTkVSOgotCSB7Ci0JCXN0cnVjdCB2aWRlb190dW5lciB2OwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZyxzaXplb2YodikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHVFVORVIoJWQpXG4iLENBUkQsdi50dW5lcikpOwotCi0JCS8qIE9ubHkgbm8gb3Igb25lIHR1bmVyIGZvciBub3cgKi8KLQkJaWYgKCF6dHYtPmhhdmVfdHVuZXIgfHwgdi50dW5lcikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN0cmNweSh2Lm5hbWUsIlRlbGV2aXNpb24iKTsKLQkJdi5yYW5nZWxvdyAgPSAwOwotCQl2LnJhbmdlaGlnaCA9IH4wOwotCQl2LmZsYWdzICAgICA9IFZJREVPX1RVTkVSX1BBTHxWSURFT19UVU5FUl9OVFNDfFZJREVPX1RVTkVSX1NFQ0FNOwotCQl2Lm1vZGUgICAgICA9IHp0di0+bm9ybTsKLQkJdi5zaWduYWwgICAgPSAweEZGRkY7IC8qIHVua25vd24gKi8KLQotCQlpZiAoY29weV90b191c2VyKGFyZywmdixzaXplb2YodikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJyZWFrOwotCSB9Ci0JIGNhc2UgVklESU9DU1RVTkVSOgotCSB7Ci0JCXN0cnVjdCB2aWRlb190dW5lciB2OwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZywgc2l6ZW9mKHYpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DU1RVTkVSKCVkLCVkKVxuIixDQVJELHYudHVuZXIsdi5tb2RlKSk7Ci0KLQkJLyogT25seSBubyBvciBvbmUgdHVuZXIgZm9yIG5vdyAqLwotCQlpZiAoIXp0di0+aGF2ZV90dW5lciB8fCB2LnR1bmVyKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyogYW5kIGl0IG9ubHkgaGFzIGNlcnRhaW4gdmFsaWQgbW9kZXMgKi8KLQkJaWYoIHYubW9kZSAhPSBWSURFT19NT0RFX1BBTCAmJgotCQkgICAgdi5tb2RlICE9IFZJREVPX01PREVfTlRTQyAmJgotCQkgICAgdi5tb2RlICE9IFZJREVPX01PREVfU0VDQU0pCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkJLyogZW5nYWdlISAqLwotCQlyZXR1cm4gem9yYW5fbXV4c2VsKHp0dix2LnR1bmVyLHYubW9kZSk7Ci0JIH0KLQotCSBjYXNlIFZJRElPQ0dQSUNUOgotCSB7Ci0JCXN0cnVjdCB2aWRlb19waWN0dXJlIHAgPSB6dHYtPnBpY3R1cmU7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHUElDVFxuIixDQVJEKSk7Ci0JCXAuZGVwdGggPSB6dHYtPmRlcHRoOwotCQlzd2l0Y2ggKHAuZGVwdGgpIHsKLQkJIGNhc2UgIDg6IHAucGFsZXR0ZT1WSURFT19QQUxFVFRFX1lVVjQyMjsKLQkJCSAgYnJlYWs7Ci0JCSBjYXNlIDE1OiBwLnBhbGV0dGU9VklERU9fUEFMRVRURV9SR0I1NTU7Ci0JCQkgIGJyZWFrOwotCQkgY2FzZSAxNjogcC5wYWxldHRlPVZJREVPX1BBTEVUVEVfUkdCNTY1OwotCQkJICBicmVhazsKLQkJIGNhc2UgMjQ6IHAucGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjI0OwotCQkJICBicmVhazsKLQkJIGNhc2UgMzI6IHAucGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjMyOwotCQkJICBicmVhazsKLQkJfQotCQlpZiAoY29weV90b191c2VyKGFyZywgJnAsIHNpemVvZihwKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JIH0KLQkgY2FzZSBWSURJT0NTUElDVDoKLQkgewotCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGFyZyxzaXplb2YocCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NTUElDVCglZCwlZCwlZCwlZCwlZCwlZCwlZClcbiIsQ0FSRCxwLmJyaWdodG5lc3MscC5odWUscC5jb2xvdXIscC5jb250cmFzdCxwLndoaXRlbmVzcyxwLmRlcHRoLHAucGFsZXR0ZSkpOwotCi0JCS8qIGRlcHRoIG11c3QgbWF0Y2ggd2l0aCBmcmFtZWJ1ZmZlciAqLwotCQlpZiAocC5kZXB0aCAhPSB6dHYtPmRlcHRoKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyogY2hlY2sgaWYgcGFsZXR0ZSBtYXRjaGVzIHRoaXMgYnBwICovCi0JCWlmIChwLnBhbGV0dGU+TlJQQUxFVFRFUyB8fAotCQkgICAgcGFsZXR0ZTJmbXRbcC5wYWxldHRlXS5icHAgIT0genR2LT5vdmVyaW5mby5icHApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQl3cml0ZV9sb2NrX2lycSgmenR2LT5sb2NrKTsKLQkJenR2LT5vdmVyaW5mby5mb3JtYXQgPSBwLnBhbGV0dGU7Ci0JCXp0di0+cGljdHVyZSA9IHA7Ci0JCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7Ci0KLQkJLyogdGVsbCB0aGUgZGVjb2RlciAqLwotCQlpMmNfY29udHJvbF9kZXZpY2UoJnp0di0+aTJjLCBJMkNfRFJJVkVSSURfVklERU9ERUNPREVSLCBERUNPREVSX1NFVF9QSUNUVVJFLCAmcCk7Ci0JCWJyZWFrOwotCSB9Ci0KLQkgY2FzZSBWSURJT0NHV0lOOgotCSB7Ci0JCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHV0lOXG4iLENBUkQpKTsKLQkJcmVhZF9sb2NrKCZ6dHYtPmxvY2spOwotCQl2dy54ICAgICAgPSB6dHYtPm92ZXJpbmZvLng7Ci0JCXZ3LnkgICAgICA9IHp0di0+b3ZlcmluZm8ueTsKLQkJdncud2lkdGggID0genR2LT5vdmVyaW5mby53OwotCQl2dy5oZWlnaHQgPSB6dHYtPm92ZXJpbmZvLmg7Ci0JCXZ3LmNocm9tYWtleT0gMDsKLQkJdncuZmxhZ3MgID0gMDsKLQkJaWYgKHp0di0+dmlkSW50ZXJsYWNlKQotCQkJdncuZmxhZ3N8PVZJREVPX1dJTkRPV19JTlRFUkxBQ0U7Ci0JCXJlYWRfdW5sb2NrKCZ6dHYtPmxvY2spOwotCQlpZiAoY29weV90b191c2VyKGFyZywmdncsc2l6ZW9mKHZ3KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JIH0KLQkgY2FzZSBWSURJT0NTV0lOOgotCSB7Ci0JCXN0cnVjdCB2aWRlb193aW5kb3cgdnc7Ci0JCXN0cnVjdCB2aWRlb19jbGlwICp2Y3A7Ci0JCWludCBvbjsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2dyxhcmcsc2l6ZW9mKHZ3KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ1NXSU4oJWQsJWQsJWQsJWQsJXgsJWQpXG4iLENBUkQsdncueCx2dy55LHZ3LndpZHRoLHZ3LmhlaWdodCx2dy5mbGFncyx2dy5jbGlwY291bnQpKTsKLQotCQlpZiAodncuZmxhZ3MpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAodncuY2xpcGNvdW50IDwwIHx8IHZ3LmNsaXBjb3VudD4yNTYpCi0JCQlyZXR1cm4gLUVET007ICAgLyogVG9vIG1hbnkhICovCi0KLQkJLyoKLQkJICogICAgICBEbyBhbnkgY2xpcHMuCi0JCSAqLwotCQl2Y3AgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkqKHZ3LmNsaXBjb3VudCs0KSk7Ci0JCWlmICh2Y3A9PU5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJaWYgKHZ3LmNsaXBjb3VudCAmJiBjb3B5X2Zyb21fdXNlcih2Y3AsdncuY2xpcHMsc2l6ZW9mKHN0cnVjdCB2aWRlb19jbGlwKSp2dy5jbGlwY291bnQpKSB7Ci0JCQl2ZnJlZSh2Y3ApOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlvbiA9IHp0di0+cnVubmluZzsKLQkJaWYgKG9uKQotCQkJem9yYW5fY2FwKHp0diwgMCk7Ci0KLQkJLyoKLQkJICogc3RyYW5nZSwgaXQgc2VlbXMgeGF3dHYgc29tZXRpbWVzIGNhbGxzIHVzIHdpdGggMAotCQkgKiB3aWR0aCBhbmQvb3IgaGVpZ2h0LiBJZ25vcmUgdGhlc2UgdmFsdWVzCi0JCSAqLwotCQlpZiAodncueCA9PSAwKQotCQkJdncueCA9IHp0di0+b3ZlcmluZm8ueDsKLQkJaWYgKHZ3LnkgPT0gMCkKLQkJCXZ3LnkgPSB6dHYtPm92ZXJpbmZvLnk7Ci0KLQkJLyogYnkgbm93IHdlIGFyZSBjb21taXR0ZWQgdG8gdGhlIG5ldyBkYXRhLi4uICovCi0JCXdyaXRlX2xvY2tfaXJxKCZ6dHYtPmxvY2spOwotCQl6dHYtPm92ZXJpbmZvLnggPSB2dy54OwotCQl6dHYtPm92ZXJpbmZvLnkgPSB2dy55OwotCQl6dHYtPm92ZXJpbmZvLncgPSB2dy53aWR0aDsKLQkJenR2LT5vdmVyaW5mby5oID0gdncuaGVpZ2h0OwotCQl3cml0ZV91bmxvY2tfaXJxKCZ6dHYtPmxvY2spOwotCi0JCS8qCi0JCSAqICAgICAgSW1wb3NlIGRpc3BsYXkgY2xpcHMKLQkJICovCi0JCWlmICh2dy54K3Z3LndpZHRoID4genR2LT5zd2lkdGgpCi0JCQluZXdfY2xpcCgmdncsIHZjcCwgenR2LT5zd2lkdGgtdncueCwgMCwgdncud2lkdGgtMSwgdncuaGVpZ2h0LTEpOwotCQlpZiAodncueSt2dy5oZWlnaHQgPiB6dHYtPnNoZWlnaHQpCi0JCQluZXdfY2xpcCgmdncsIHZjcCwgMCwgenR2LT5zaGVpZ2h0LXZ3LnksIHZ3LndpZHRoLTEsIHZ3LmhlaWdodC0xKTsKLQotCQkvKiBidWlsdCB0aGUgcmVxdWVzdGVkIGNsaXBwaW5nIHpvbmVzICovCi0JCXpvcmFuX3NldF9nZW8oenR2LCAmenR2LT5vdmVyaW5mbyk7Ci0JCXpvcmFuX2J1aWx0X292ZXJsYXkoenR2LCB2dy5jbGlwY291bnQsIHZjcCk7Ci0JCXZmcmVlKHZjcCk7Ci0KLQkJLyogaWYgd2Ugd2VyZSBvbiwgcmVzdGFydCB0aGUgdmlkZW8gZW5naW5lICovCi0JCWlmIChvbikKLQkJCXpvcmFuX2NhcCh6dHYsIDEpOwotCQlicmVhazsKLQkgfQotCi0JIGNhc2UgVklESU9DQ0FQVFVSRToKLQkgewotCQlpbnQgdjsKLQkJaWYgKGdldF91c2VyKHYsIChpbnQgKilhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NDQVBUVVJFKCVkKVxuIixDQVJELHYpKTsKLQotCQlpZiAodj09MCkgewotCQkJY2xlYXJfYml0KFNUQVRFX09WRVJMQVksICZ6dHYtPnN0YXRlKTsKLQkJCXpvcmFuX2NhcCh6dHYsIDEpOwotCQl9Ci0JCWVsc2UgewotCQkJLyogaXMgVklESU9DU0ZCVUYsIFZJRElPQ1NXSU4gZG9uZT8gKi8KLQkJCWlmICh6dHYtPm92ZXJpbmZvLmJ1c2Fkcj09MCB8fCB6dHYtPm92ZXJpbmZvLnc9PTAgfHwgenR2LT5vdmVyaW5mby5oPT0wKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlzZXRfYml0KFNUQVRFX09WRVJMQVksICZ6dHYtPnN0YXRlKTsKLQkJCXpvcmFuX2NhcCh6dHYsIDEpOwotCQl9Ci0JCWJyZWFrOwotCSB9Ci0KLQkgY2FzZSBWSURJT0NHRkJVRjoKLQkgewotCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyIHY7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHRkJVRlxuIixDQVJEKSk7Ci0JCXJlYWRfbG9jaygmenR2LT5sb2NrKTsKLQkJdi5iYXNlICAgPSAodm9pZCAqKXp0di0+b3ZlcmluZm8uYnVzYWRyOwotCQl2LmhlaWdodCA9IHp0di0+c2hlaWdodDsKLQkJdi53aWR0aCAgPSB6dHYtPnN3aWR0aDsKLQkJdi5kZXB0aCAgPSB6dHYtPmRlcHRoOwotCQl2LmJ5dGVzcGVybGluZSA9IHp0di0+b3ZlcmluZm8uYnBsOwotCQlyZWFkX3VubG9jaygmenR2LT5sb2NrKTsKLQkJaWYoY29weV90b191c2VyKGFyZywgJnYsc2l6ZW9mKHYpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlicmVhazsKLQkgfQotCSBjYXNlIFZJRElPQ1NGQlVGOgotCSB7Ci0JCXN0cnVjdCB2aWRlb19idWZmZXIgdjsKLQkJaWYoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlpZiAocGNpcGNpX3Byb2JsZW1zICYgKFBDSVBDSV9GQUlMfFBDSUFHUF9GQUlMKSkKLQkJCXJldHVybiAtRU5YSU87Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJnLHNpemVvZih2KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ1NGQlVGKCVwLCVkLCVkLCVkLCVkKVxuIixDQVJELHYuYmFzZSwgdi53aWR0aCx2LmhlaWdodCx2LmRlcHRoLHYuYnl0ZXNwZXJsaW5lKSk7Ci0KLQkJaWYgKHYuZGVwdGghPTE1ICYmIHYuZGVwdGghPTE2ICYmIHYuZGVwdGghPTI0ICYmIHYuZGVwdGghPTMyKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICh2LmJ5dGVzcGVybGluZTwxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICh6dHYtPnJ1bm5pbmcpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQl3cml0ZV9sb2NrX2lycSgmenR2LT5sb2NrKTsKLQkJenR2LT5vdmVyaW5mby5idXNhZHIgID0gKHVsb25nKXYuYmFzZTsKLQkJenR2LT5zaGVpZ2h0ICAgICAgPSB2LmhlaWdodDsKLQkJenR2LT5zd2lkdGggICAgICAgPSB2LndpZHRoOwotCQl6dHYtPmRlcHRoICAgICAgICA9IHYuZGVwdGg7CQkvKiBiaXRzIHBlciBwaXhlbCAqLwotCQl6dHYtPm92ZXJpbmZvLmJwcCA9ICgodi5kZXB0aCsxKSYweDM4KS84Oy8qIGJ5dGVzIHBlciBwaXhlbCAqLwotCQl6dHYtPm92ZXJpbmZvLmJwbCA9IHYuYnl0ZXNwZXJsaW5lOwkvKiBieXRlcyBwZXIgbGluZSAqLwotCQl3cml0ZV91bmxvY2tfaXJxKCZ6dHYtPmxvY2spOwotCQlicmVhazsKLQkgfQotCi0JIGNhc2UgVklESU9DS0VZOgotCSB7Ci0JCS8qIFdpbGwgYmUgaGFuZGxlZCBoaWdoZXIgdXAgLi4gKi8KLQkJYnJlYWs7Ci0JIH0KLQotCSBjYXNlIFZJRElPQ1NZTkM6Ci0JIHsKLQkJaW50IGk7Ci0JCWlmIChnZXRfdXNlcihpLCAoaW50ICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJREVPQ1NZTkMoJWQpXG4iLENBUkQsaSkpOwotCQlpZiAoaTwwIHx8IGk+Wk9SQU5fTUFYX0ZCVUZGRVJTKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN3aXRjaCAoenR2LT5ncmFiaW5mb1tpXS5zdGF0dXMpIHsKLQkJIGNhc2UgRkJVRkZFUl9GUkVFOgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCSBjYXNlIEZCVUZGRVJfQlVTWToKLQkJCS8qIHdhaXQgdGlsbCB0aGlzIGJ1ZmZlciBnZXRzIGdyYWJiZWQgKi8KLQkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh6dHYtPmdyYWJxLAotCQkJCQkoenR2LT5ncmFiaW5mb1tpXS5zdGF0dXMgIT0gRkJVRkZFUl9CVVNZKSk7Ci0JCQkvKiBzZWUgaWYgYSBzaWduYWwgZGlkIGl0ICovCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0dXJuIC1FSU5UUjsKLQkJCS8qIGRvbid0IGZhbGwgdGhyb3VnaDsgYSBET05FIGJ1ZmZlciBpcyBub3QgVU5VU0VEICovCi0JCQlicmVhazsKLQkJIGNhc2UgRkJVRkZFUl9ET05FOgotCQkJenR2LT5ncmFiaW5mb1tpXS5zdGF0dXMgPSBGQlVGRkVSX0ZSRUU7Ci0JCQkvKiB0ZWxsIHBwbCB3ZSBoYXZlIGEgc3BhcmUgYnVmZmVyICovCi0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnp0di0+Z3JhYnEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJREVPQ1NZTkMoJWQpIHJldHVybnNcbiIsQ0FSRCxpKSk7Ci0JCWJyZWFrOwotCSB9Ci0KLQkgY2FzZSBWSURJT0NNQ0FQVFVSRToKLQkgewotCQlzdHJ1Y3QgdmlkZW9fbW1hcCB2bTsKLQkJc3RydWN0IHZpZGluZm8qIGZyYW1lOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZtLGFyZyxzaXplb2Yodm0pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DTUNBUFRVUkUoJWQsKCVkLCVkKSwlZClcbiIsQ0FSRCx2bS5mcmFtZSx2bS53aWR0aCx2bS5oZWlnaHQsdm0uZm9ybWF0KSk7Ci0JCWlmICh2bS5mcmFtZTwwIHx8IHZtLmZyYW1lPlpPUkFOX01BWF9GQlVGRkVSUyB8fAotCQkgICAgdm0ud2lkdGg8MzIgfHwgdm0ud2lkdGg+NzY4IHx8Ci0JCSAgICB2bS5oZWlnaHQ8MzIgfHwgdm0uaGVpZ2h0PjU3NiB8fAotCQkgICAgdm0uZm9ybWF0Pk5SUEFMRVRURVMgfHwKLQkJICAgIHBhbGV0dGUyZm10W3ZtLmZvcm1hdF0ubW9kZSA9PSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyogd2UgYXJlIGFsbG93ZWQgdG8gdGFrZSBvdmVyIFVOVVNFRCBhbmQgRE9ORSBidWZmZXJzICovCi0JCWZyYW1lID0gJnp0di0+Z3JhYmluZm9bdm0uZnJhbWVdOwotCQlpZiAoZnJhbWUtPnN0YXR1cyA9PSBGQlVGRkVSX0JVU1kpCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCS8qIHNldHVwIHRoZSBvdGhlciBwYXJhbWV0ZXJzIGlmIHRoZXkgYXJlIGdpdmVuICovCi0JCXdyaXRlX2xvY2tfaXJxKCZ6dHYtPmxvY2spOwotCQlmcmFtZS0+dyA9IHZtLndpZHRoOwotCQlmcmFtZS0+aCA9IHZtLmhlaWdodDsKLQkJZnJhbWUtPmZvcm1hdCA9IHZtLmZvcm1hdDsKLQkJZnJhbWUtPmJwcCA9IHBhbGV0dGUyZm10W2ZyYW1lLT5mb3JtYXRdLmJwcDsKLQkJZnJhbWUtPmJwbCA9IGZyYW1lLT53KmZyYW1lLT5icHA7Ci0JCWZyYW1lLT5zdGF0dXMgPSBGQlVGRkVSX0JVU1k7Ci0JCWZyYW1lLT5uZXh0ID0gMDsKLQkJeyAvKiBhZGQgdG8gdGFpbCBvZiBxdWV1ZSAqLwotCQkgIHN0cnVjdCB2aWRpbmZvKiBvbGRmcmFtZSA9IHp0di0+d29ya3F1ZXVlOwotCQkgIGlmICghb2xkZnJhbWUpIHp0di0+d29ya3F1ZXVlID0gZnJhbWU7Ci0JCSAgZWxzZSB7Ci0JCSAgICB3aGlsZSAob2xkZnJhbWUtPm5leHQpIG9sZGZyYW1lID0gb2xkZnJhbWUtPm5leHQ7Ci0JCSAgICBvbGRmcmFtZS0+bmV4dCA9IGZyYW1lOwotCQkgIH0KLQkJfQotCQl3cml0ZV91bmxvY2tfaXJxKCZ6dHYtPmxvY2spOwotCQl6b3Jhbl9jYXAoenR2LCAxKTsKLQkJYnJlYWs7Ci0JIH0KLQotCSBjYXNlIFZJRElPQ0dNQlVGOgotCSB7Ci0JCXN0cnVjdCB2aWRlb19tYnVmIG1iOwotCQlpbnQgaTsKLQkJREVCVUcocHJpbnRrKENBUkRfREVCVUcgIlZJRElPQ0dNQlVGXG4iLENBUkQpKTsKLQkJbWIuc2l6ZSA9IFpPUkFOX01BWF9GQlVGU0laRTsKLQkJbWIuZnJhbWVzID0gWk9SQU5fTUFYX0ZCVUZGRVJTOwotCQlmb3IgKGk9MDsgaTxaT1JBTl9NQVhfRkJVRkZFUlM7IGkrKykKLQkJCW1iLm9mZnNldHNbaV0gPSBpKlpPUkFOX01BWF9GQlVGRkVSOwotCQlpZihjb3B5X3RvX3VzZXIoYXJnLCAmbWIsc2l6ZW9mKG1iKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JIH0KLQotCSBjYXNlIFZJRElPQ0dVTklUOgotCSB7Ci0JCXN0cnVjdCB2aWRlb191bml0IHZ1OwotCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DR1VOSVRcbiIsQ0FSRCkpOwotCQl2dS52aWRlbyA9IHp0di0+dmlkZW9fZGV2Lm1pbm9yOwotCQl2dS52YmkgPSB6dHYtPnZiaV9kZXYubWlub3I7Ci0JCXZ1LnJhZGlvID0gVklERU9fTk9fVU5JVDsKLQkJdnUuYXVkaW8gPSBWSURFT19OT19VTklUOwotCQl2dS50ZWxldGV4dCA9IFZJREVPX05PX1VOSVQ7Ci0JCWlmKGNvcHlfdG9fdXNlcihhcmcsICZ2dSxzaXplb2YodnUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlicmVhazsKLQkgfQotCi0JIGNhc2UgVklESU9DR0ZSRVE6Ci0JIHsKLQkJdW5zaWduZWQgbG9uZyB2ID0genR2LT50dW5lcl9mcmVxOwotCQlpZiAoY29weV90b191c2VyKGFyZywmdixzaXplb2YodikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHRlJFUVxuIixDQVJEKSk7Ci0JCWJyZWFrOwotCSB9Ci0JIGNhc2UgVklESU9DU0ZSRVE6Ci0JIHsKLQkJdW5zaWduZWQgbG9uZyB2OwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZywgc2l6ZW9mKHYpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DU0ZSRVFcbiIsQ0FSRCkpOwotCi0JCWlmICh6dHYtPmhhdmVfdHVuZXIpIHsKLQkJCWludCBmaXhtZSA9IHY7Ci0JCQlpZiAoaTJjX2NvbnRyb2xfZGV2aWNlKCYoenR2LT5pMmMpLCBJMkNfRFJJVkVSSURfVFVORVIsIFRVTkVSX1NFVF9UVkZSRVEsICZmaXhtZSkgPCAwKQotCQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JCXp0di0+dHVuZXJfZnJlcSA9IHY7Ci0JCWJyZWFrOwotCSB9Ci0KLQkgLyogV2h5IGlzbid0IHRoaXMgaW4gdGhlIEFQST8KLQkgICogQW5kIHdoeSBkb2Vzbid0IGl0IHRha2UgYSBidWZmZXIgbnVtYmVyPwotCSBjYXNlIEJUVFZfRklFTEROUjoKLQkgewotCQl1bnNpZ25lZCBsb25nIHYgPSB6dHYtPmxhc3RmaWVsZG5yOwotCQlpZiAoY29weV90b191c2VyKGFyZywmdixzaXplb2YodikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJCVFRWX0ZJRUxETlJcbiIsQ0FSRCkpOwotCQlicmVhazsKLQkgfQotCSAqLwotCi0JIGRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMKLWludCB6b3Jhbl9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlKiBkZXYsIGNvbnN0IGNoYXIqIGFkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXN0cnVjdCB6b3JhbiogenR2ID0gKHN0cnVjdCB6b3JhbiopZGV2OwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylhZHI7Ci0JdW5zaWduZWQgbG9uZyBwb3M7Ci0KLQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiem9yYW5fbW1hcCgweCVwLCVsZClcbiIsQ0FSRCxhZHIsc2l6ZSkpOwotCi0JLyogc2FuaXR5IGNoZWNrcyAqLwotCWlmIChzaXplID4gWk9SQU5fTUFYX0ZCVUZTSVpFIHx8ICF6dHYtPmZidWZmZXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogc3RhcnQgbWFwcGluZyB0aGUgd2hvbGUgc2hhYmFuZyB0byB1c2VyIG1lbW9yeSAqLwotCXBvcyA9ICh1bnNpZ25lZCBsb25nKXp0di0+ZmJ1ZmZlcjsKLQl3aGlsZSAoc2l6ZT4wKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gdmlydF90b19waHlzKCh2b2lkKilwb3MpID4+IFBBR0VfU0hJRlQ7Ci0JCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGZuLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkKLQkJCXJldHVybiAtRUFHQUlOOwotCQlzdGFydCArPSBQQUdFX1NJWkU7Ci0JCXBvcyArPSBQQUdFX1NJWkU7Ci0JCXNpemUgLT0gUEFHRV9TSVpFOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgenIzNjEyMF90ZW1wbGF0ZT0KLXsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gIlVOU0VUIiwKLQkudHlwZQkJPSBWSURfVFlQRV9UVU5FUnxWSURfVFlQRV9DQVBUVVJFfFZJRF9UWVBFX09WRVJMQVksCi0JLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1pSMzYxMjAsCi0JLm9wZW4JCT0gem9yYW5fb3BlbiwKLQkuY2xvc2UJCT0gem9yYW5fY2xvc2UsCi0JLnJlYWQJCT0gem9yYW5fcmVhZCwKLQkud3JpdGUJCT0gem9yYW5fd3JpdGUsCi0JLnBvbGwJCT0gem9yYW5fcG9sbCwKLQkuaW9jdGwJCT0gem9yYW5faW9jdGwsCi0JLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKLQkubW1hcAkJPSB6b3Jhbl9tbWFwLAotCS5taW5vcgkJPSAtMSwKLX07Ci0KLXN0YXRpYwotaW50IHZiaV9vcGVuKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgaW50IGZsYWdzKQotewotCXN0cnVjdCB6b3JhbiAqenR2ID0gZGV2LT5wcml2OwotCXN0cnVjdCB2aWRpbmZvKiBpdGVtOwotCi0JREVCVUcocHJpbnRrKENBUkRfREVCVUcgInZiaV9vcGVuKGRldiwlZClcbiIsQ0FSRCxmbGFncykpOwotCi0JLyoKLQkgKiBEdXJpbmcgVkJJIGRldmljZSBvcGVuLCB3ZSBjb250aW5pb3VzbHkgZ3JhYiBWQkktbGlrZQotCSAqIGRhdGEgaW4gdGhlIHZiaSBidWZmZXIgd2hlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCi0JICogT25seSB3aGVuIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHJlcXVlc3QgZm9yIFZCSSBkYXRhCi0JICogKHJlYWQgY2FsbCkgd2UgL2ZvcmNlLyBhIHJlYWQuCi0JICovCi0KLQkvKiBhbGxvY2F0ZSBidWZmZXJzICovCi0JZm9yIChpdGVtPXp0di0+cmVhZGluZm87IGl0ZW0hPXp0di0+cmVhZGluZm8rWk9SQU5fVkJJX0JVRkZFUlM7IGl0ZW0rKykKLQl7Ci0JCWl0ZW0tPnN0YXR1cyA9IEZCVUZGRVJfRlJFRTsKLQotCQkvKiBhbGxvYyAqLwotCQlpZiAoIWl0ZW0tPm1lbWFkcikgewotCQkJaXRlbS0+bWVtYWRyID0gYm1hbGxvYyhaT1JBTl9WQklfQlVGU0laRSk7Ci0JCQlpZiAoIWl0ZW0tPm1lbWFkcikgewotCQkJCS8qIGNvdWxkIG5vdCBnZXQgYSBidWZmZXIsIGJhaWwgb3V0ICovCi0JCQkJd2hpbGUgKGl0ZW0gIT0genR2LT5yZWFkaW5mbykgewotCQkJCQlpdGVtLS07Ci0JCQkJCWJmcmVlKGl0ZW0tPm1lbWFkciwgWk9SQU5fVkJJX0JVRlNJWkUpOwotCQkJCQlpdGVtLT5tZW1hZHIgPSAwOwotCQkJCQlpdGVtLT5idXNhZHIgPSAwOwotCQkJCX0KLQkJCQlyZXR1cm4gLUVOT0JVRlM7Ci0JCQl9Ci0JCX0KLQotCQkvKiBkZXRlcm1pbmUgdGhlIERNQWFibGUgYWRkcmVzcyAqLwotCQlpdGVtLT5idXNhZHIgPSB2aXJ0X3RvX2J1cyhpdGVtLT5tZW1hZHIpOwotCX0KLQotCS8qIGRvIHRoZSBjb21tb24gcGFydCBvZiBhbGwgb3BlbidzICovCi0Jem9yYW5fY29tbW9uX29wZW4oenR2LCBmbGFncyk7Ci0KLQlzZXRfYml0KFNUQVRFX1ZCSSwgJnp0di0+c3RhdGUpOwotCS8qIHN0YXJ0IHJlYWQtYWhlYWQgKi8KLQl6b3Jhbl9jYXAoenR2LCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMKLXZvaWQgdmJpX2Nsb3NlKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgdmlkaW5mbyogaXRlbTsKLQotCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJ2YmlfY2xvc2UoZGV2KVxuIixDQVJEKSk7Ci0KLQkvKiBkcml2ZXIgc3BlY2lmaWMgY2xvc3VyZSAqLwotCWNsZWFyX2JpdChTVEFURV9WQkksICZ6dHYtPnN0YXRlKTsKLQotCXpvcmFuX2NvbW1vbl9jbG9zZSh6dHYpOwotCi0JLyoKLQkgKiAgICAgIFRoaXMgaXMgc3Vja3kgYnV0IHJpZ2h0IG5vdyBJIGNhbid0IGZpbmQgYSBnb29kIHdheSB0bwotCSAqICAgICAgYmUgc3VyZSBpdHMgc2FmZSB0byBmcmVlIHRoZSBidWZmZXIuIFdlIHdhaXQgNS02IGZpZWxkcwotCSAqICAgICAgd2hpY2ggaXMgbW9yZSB0aGFuIHN1ZmZpY2llbnQgdG8gYmUgc3VyZS4KLQkgKi8KLQltc2xlZXAoMTAwKTsJCQkvKiBXYWl0IDEvMTB0aCBvZiBhIHNlY29uZCAqLwotCi0JZm9yIChpdGVtPXp0di0+cmVhZGluZm87IGl0ZW0hPXp0di0+cmVhZGluZm8rWk9SQU5fVkJJX0JVRkZFUlM7IGl0ZW0rKykKLQl7Ci0JCWlmIChpdGVtLT5tZW1hZHIpCi0JCQliZnJlZShpdGVtLT5tZW1hZHIsIFpPUkFOX1ZCSV9CVUZTSVpFKTsKLQkJaXRlbS0+bWVtYWRyID0gMDsKLQl9Ci0KLX0KLQotLyoKLSAqIFRoaXMgcmVhZCBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIHJlZW50cmFudCBpbiBhIFNNUCBzaXR1YXRpb24uCi0gKgotICogVGhpcyBpcyBtYWRlIHBvc3NpYmxlIGJ5IHRoZSBzcGlubG9jayB3aGljaCBpcyBrZXB0IHRpbGwgd2UKLSAqIGZvdW5kIGFuZCBtYXJrZWQgYSBidWZmZXIgZm9yIG91ciBvd24gdXNlLiBUaGUgbG9jayBtdXN0Ci0gKiBiZSByZWxlYXNlZCBhcyBzb29uIGFzIHBvc3NpYmxlIHRvIHByZXZlbnQgbG9jayBjb250ZW50aW9uLgotICovCi1zdGF0aWMKLWxvbmcgdmJpX3JlYWQoc3RydWN0IHZpZGVvX2RldmljZSogZGV2LCBjaGFyKiBidWYsIHVuc2lnbmVkIGxvbmcgY291bnQsIGludCBub25ibG9jaykKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IGRldi0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIG1heDsKLQlzdHJ1Y3QgdmlkaW5mbyogdW51c2VkID0gMDsKLQlzdHJ1Y3QgdmlkaW5mbyogZG9uZSA9IDA7Ci0KLQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAidmJpX3JlYWQoMHglcCwlbGQsJWQpXG4iLENBUkQsYnVmLGNvdW50LG5vbmJsb2NrKSk7Ci0KLQkvKiBmaW5kIG91cnNlbGYgYSBmcmVlIG9yIGNvbXBsZXRlZCBidWZmZXIgKi8KLQlmb3IgKDs7KSB7Ci0JCXN0cnVjdCB2aWRpbmZvKiBpdGVtOwotCi0JCXdyaXRlX2xvY2tfaXJxKCZ6dHYtPmxvY2spOwotCQlmb3IgKGl0ZW09enR2LT5yZWFkaW5mbzsgaXRlbSE9enR2LT5yZWFkaW5mbytaT1JBTl9WQklfQlVGRkVSUzsgaXRlbSsrKSB7Ci0JCQlpZiAoIXVudXNlZCAmJiBpdGVtLT5zdGF0dXMgPT0gRkJVRkZFUl9GUkVFKQotCQkJCXVudXNlZCA9IGl0ZW07Ci0JCQlpZiAoIWRvbmUgJiYgaXRlbS0+c3RhdHVzID09IEZCVUZGRVJfRE9ORSkKLQkJCQlkb25lID0gaXRlbTsKLQkJfQotCQlpZiAoZG9uZSB8fCB1bnVzZWQpCi0JCQlicmVhazsKLQotCQkvKiBubyBtb3JlIGZyZWUgYnVmZmVycywgd2FpdCBmb3IgdGhlbS4gKi8KLQkJd3JpdGVfdW5sb2NrX2lycSgmenR2LT5sb2NrKTsKLQkJaWYgKG5vbmJsb2NrKQotCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKLQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmenR2LT52YmlxKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9Ci0KLQkvKiBEbyB3ZSBoYXZlICdyZWFkeScgZGF0YT8gKi8KLQlpZiAoIWRvbmUpIHsKLQkJLyogbm8/IHRoYW4gdGhpcyB3aWxsIHRha2UgYSB3aGlsZS4uLiAqLwotCQlpZiAobm9uYmxvY2spIHsKLQkJCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7Ci0JCQlyZXR1cm4gLUVXT1VMREJMT0NLOwotCQl9Ci0KLQkJLyogbWFyayB0aGUgdW51c2VkIGJ1ZmZlciBhcyB3YW50ZWQgKi8KLQkJdW51c2VkLT5zdGF0dXMgPSBGQlVGRkVSX0JVU1k7Ci0JCXVudXNlZC0+bmV4dCA9IDA7Ci0JCXsgLyogYWRkIHRvIHRhaWwgb2YgcXVldWUgKi8KLQkJICBzdHJ1Y3QgdmlkaW5mbyogb2xkZnJhbWUgPSB6dHYtPndvcmtxdWV1ZTsKLQkJICBpZiAoIW9sZGZyYW1lKSB6dHYtPndvcmtxdWV1ZSA9IHVudXNlZDsKLQkJICBlbHNlIHsKLQkJICAgIHdoaWxlIChvbGRmcmFtZS0+bmV4dCkgb2xkZnJhbWUgPSBvbGRmcmFtZS0+bmV4dDsKLQkJICAgIG9sZGZyYW1lLT5uZXh0ID0gdW51c2VkOwotCQkgIH0KLQkJfQotCQl3cml0ZV91bmxvY2tfaXJxKCZ6dHYtPmxvY2spOwotCi0JCS8qIHRlbGwgdGhlIHN0YXRlIG1hY2hpbmUgd2Ugd2FudCBpdCBmaWxsZWQgL05PVy8gKi8KLQkJem9yYW5fY2FwKHp0diwgMSk7Ci0KLQkJLyogd2FpdCB0aWxsIHRoaXMgYnVmZmVyIGdldHMgZ3JhYmJlZCAqLwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoenR2LT52YmlxLAotCQkJCSh1bnVzZWQtPnN0YXR1cyAhPSBGQlVGRkVSX0JVU1kpKTsKLQkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4gLUVJTlRSOwotCQlkb25lID0gdW51c2VkOwotCX0KLQllbHNlCi0JCXdyaXRlX3VubG9ja19pcnEoJnp0di0+bG9jayk7Ci0KLQkvKiBZZXMhIHdlIGdvdCBkYXRhISAqLwotCW1heCA9IGRvbmUtPmJwbCAqIC1kb25lLT5oOwotCWlmIChjb3VudCA+IG1heCkKLQkJY291bnQgPSBtYXg7Ci0KLQkvKiBjaGVjayBpZiB0aGUgdXNlciBnYXZlIHVzIGVub3VnaCByb29tIHRvIHdyaXRlIHRoZSBkYXRhICovCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkgewotCQljb3VudCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogTm93IHRyYW5zZm9ybS9zdHJpcCB0aGUgZGF0YSBmcm9tIFlVViB0byBZLW9ubHkKLQkgKiBOQi4gQXNzdW1lIHRoZSBZIGlzIGluIHRoZSBMU0Igb2YgdGhlIFlVViBkYXRhLgotCSAqLwotCXsKLQl1bnNpZ25lZCBjaGFyKiBvcHRyID0gYnVmOwotCXVuc2lnbmVkIGNoYXIqIGVwdHIgPSBidWYrY291bnQ7Ci0KLQkvKiBhcmUgd2UgYmVlaW5nIGFjY2Vzc2VkIGZyb20gYW4gb2xkIGRyaXZlcj8gKi8KLQlpZiAoY291bnQgPT0gMioxOSoyMDQ4KSB7Ci0JCS8qCi0JCSAqIEV4dHJlbWUgSEFDSywgb2xkIFZCSSBwcm9ncmFtcyBleHBlY3QgMjA0OCBwb2ludHMKLQkJICogb2YgZGF0YSwgYW5kIHdlIG9ubHkgZ290IDg2NCBvcnNvLiBEb3VibGUgZWFjaAotCQkgKiBkYXRhcG9pbnQgYW5kIGNsZWFyIHRoZSByZXN0IG9mIHRoZSBsaW5lLgotCQkgKiBUaGlzIHdheSB3ZSBoYXZlIGFwcGVhciB0byBoYXZlIGEKLQkJICogc2FtcGxlX2ZyZXF1ZW5jeSBvZiAyOS41IE1jLgotCQkgKi8KLQkJaW50IHgseTsKLQkJdW5zaWduZWQgY2hhciogaXB0ciA9IGRvbmUtPm1lbWFkcisxOwotCQlmb3IgKHk9ZG9uZS0+aDsgb3B0cjxlcHRyICYmIHk8MDsgeSsrKQotCQl7Ci0JCQkvKiBjb3B5IHRvIGRvdWJsZWQgZGF0YSB0byB1c2VybGFuZCAqLwotCQkJZm9yICh4PTA7IG9wdHIrMTxlcHRyICYmIHg8LWRvbmUtPnc7IHgrKykKLQkJCXsKLQkJCQl1bnNpZ25lZCBjaGFyIGEgPSBpcHRyW3gqMl07Ci0JCQkJX19wdXRfdXNlcihhLCBvcHRyKyspOwotCQkJCV9fcHV0X3VzZXIoYSwgb3B0cisrKTsKLQkJCX0KLQkJCS8qIGFuZCBjbGVhciB0aGUgcmVzdCBvZiB0aGUgbGluZSAqLwotCQkJZm9yICh4Kj0yOyBvcHRyPGVwdHIgJiYgeDxkb25lLT5icGw7IHgrKykKLQkJCQlfX3B1dF91c2VyKDAsIG9wdHIrKyk7Ci0JCQkvKiBuZXh0IGxpbmUgKi8KLQkJCWlwdHIgKz0gZG9uZS0+YnBsOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKgotCQkgKiBPdGhlciAocHJvYmFibHkgbmV3ZXIpIHByb2dyYW1zIGFza2VkCi0JCSAqIHVzIHdoYXQgZ2VvbWV0cnkgd2UgYXJlIHVzaW5nLCBhbmQgYXJlCi0JCSAqIHJlYWRpbmcgdGhlIGNvcnJlY3Qgc2l6ZS4KLQkJICovCi0JCWludCB4LHk7Ci0JCXVuc2lnbmVkIGNoYXIqIGlwdHIgPSBkb25lLT5tZW1hZHIrMTsKLQkJZm9yICh5PWRvbmUtPmg7IG9wdHI8ZXB0ciAmJiB5PDA7IHkrKykKLQkJewotCQkJLyogY29weSB0byBkb3VibGVkIGRhdGEgdG8gdXNlcmxhbmQgKi8KLQkJCWZvciAoeD0wOyBvcHRyPGVwdHIgJiYgeDwtZG9uZS0+dzsgeCsrKQotCQkJCV9fcHV0X3VzZXIoaXB0clt4KjJdLCBvcHRyKyspOwotCQkJLyogYW5kIGNsZWFyIHRoZSByZXN0IG9mIHRoZSBsaW5lICovCi0JCQlmb3IgKDtvcHRyPGVwdHIgJiYgeDxkb25lLT5icGw7IHgrKykKLQkJCQlfX3B1dF91c2VyKDAsIG9wdHIrKyk7Ci0JCQkvKiBuZXh0IGxpbmUgKi8KLQkJCWlwdHIgKz0gZG9uZS0+YnBsOwotCQl9Ci0JfQotCi0JLyogQVBJIGNvbXBsaWFuY2U6Ci0JICogcGxhY2UgdGhlIGZyYW1lbnVtYmVyIChoYWxmIGZpZWxkbnIpIGluIHRoZSBsYXN0IGxvbmcKLQkgKi8KLQlfX3B1dF91c2VyKGRvbmUtPmZpZWxkbnIvMiwgKCh1bG9uZyopZXB0cilbLTFdKTsKLQl9Ci0KLQkvKiBrZWVwIHRoZSBlbmdpbmUgcnVubmluZyAqLwotCWRvbmUtPnN0YXR1cyA9IEZCVUZGRVJfRlJFRTsKLQl6b3Jhbl9jYXAoenR2LCAxKTsKLQotCS8qIHRlbGwgbGlzdGVuZXJzIHRoaXMgYnVmZmVyIGp1c3QgYmVjYW1lIGZyZWUgKi8KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnp0di0+dmJpcSk7Ci0KLQkvKiBnb29kYnllICovCi1vdXQ6Ci0JREVCVUcocHJpbnRrKENBUkRfREVCVUcgInZiaV9yZWFkKCkgcmV0dXJucyAlbHVcbiIsQ0FSRCxjb3VudCkpOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljCi11bnNpZ25lZCBpbnQgdmJpX3BvbGwoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgdmlkaW5mbyogaXRlbTsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQlwb2xsX3dhaXQoZmlsZSwgJnp0di0+dmJpcSwgd2FpdCk7Ci0KLQlmb3IgKGl0ZW09enR2LT5yZWFkaW5mbzsgaXRlbSE9enR2LT5yZWFkaW5mbytaT1JBTl9WQklfQlVGRkVSUzsgaXRlbSsrKQotCQlpZiAoaXRlbS0+c3RhdHVzID09IEZCVUZGRVJfRE9ORSkKLQkJewotCQkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7Ci0JCQlicmVhazsKLQkJfQotCi0JREVCVUcocHJpbnRrKENBUkRfREVCVUcgInZiaV9wb2xsKCk9JXhcbiIsQ0FSRCxtYXNrKSk7Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljCi1pbnQgdmJpX2lvY3RsKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCB6b3JhbiogenR2ID0gZGV2LT5wcml2OwotCi0Jc3dpdGNoIChjbWQpIHsKLQkgY2FzZSBWSURJT0NHVkJJRk1UOgotCSB7Ci0JCXN0cnVjdCB2YmlfZm9ybWF0IGY7Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJWSURJT0NHVkJJSU5GT1xuIixDQVJEKSk7Ci0JCWYuc2FtcGxpbmdfcmF0ZSA9IDE0NzUwMDAwVUw7Ci0JCWYuc2FtcGxlc19wZXJfbGluZSA9IC16dHYtPnJlYWRpbmZvWzBdLnc7Ci0JCWYuc2FtcGxlX2Zvcm1hdCA9IFZJREVPX1BBTEVUVEVfUkFXOwotCQlmLnN0YXJ0WzBdID0gZi5zdGFydFsxXSA9IHp0di0+cmVhZGluZm9bMF0ueTsKLQkJZi5zdGFydFsxXSArPSAzMTI7Ci0JCWYuY291bnRbMF0gPSBmLmNvdW50WzFdID0gLXp0di0+cmVhZGluZm9bMF0uaDsKLQkJZi5mbGFncyA9IFZCSV9JTlRFUkxBQ0VEOwotCQlpZiAoY29weV90b191c2VyKGFyZywmZixzaXplb2YoZikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJyZWFrOwotCSB9Ci0JIGNhc2UgVklESU9DU1ZCSUZNVDoKLQkgewotCQlzdHJ1Y3QgdmJpX2Zvcm1hdCBmOwotCQlpbnQgaTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmLCBhcmcsc2l6ZW9mKGYpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlERUJVRyhwcmludGsoQ0FSRF9ERUJVRyAiVklESU9DU1ZCSUlORk8oJWQsJWQsJWQsJWQsJWQsJWQsJWQsJXgpXG4iLENBUkQsZi5zYW1wbGluZ19yYXRlLGYuc2FtcGxlc19wZXJfbGluZSxmLnNhbXBsZV9mb3JtYXQsZi5zdGFydFswXSxmLnN0YXJ0WzFdLGYuY291bnRbMF0sZi5jb3VudFsxXSxmLmZsYWdzKSk7Ci0KLQkJLyogbG90cyBvZiBwYXJhbWV0ZXJzIGFyZSBmaXhlZC4uLiAoUEFMKSAqLwotCQlpZiAoZi5zYW1wbGluZ19yYXRlICE9IDE0NzUwMDAwVUwgfHwKLQkJICAgIGYuc2FtcGxlc19wZXJfbGluZSA+IDg2NCB8fAotCQkgICAgZi5zYW1wbGVfZm9ybWF0ICE9IFZJREVPX1BBTEVUVEVfUkFXIHx8Ci0JCSAgICBmLnN0YXJ0WzBdIDwgMCB8fAotCQkgICAgZi5zdGFydFswXSAhPSBmLnN0YXJ0WzFdLTMxMiB8fAotCQkgICAgZi5jb3VudFswXSAhPSBmLmNvdW50WzFdIHx8Ci0JCSAgICBmLnN0YXJ0WzBdK2YuY291bnRbMF0gPj0gMjg4IHx8Ci0JCSAgICBmLmZsYWdzICE9IFZCSV9JTlRFUkxBQ0VEKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJd3JpdGVfbG9ja19pcnEoJnp0di0+bG9jayk7Ci0JCXp0di0+cmVhZGluZm9bMF0ueSA9IGYuc3RhcnRbMF07Ci0JCXp0di0+cmVhZGluZm9bMF0udyA9IC1mLnNhbXBsZXNfcGVyX2xpbmU7Ci0JCXp0di0+cmVhZGluZm9bMF0uaCA9IC1mLmNvdW50WzBdOwotCQl6dHYtPnJlYWRpbmZvWzBdLmJwbCA9IGYuc2FtcGxlc19wZXJfbGluZSp6dHYtPnJlYWRpbmZvWzBdLmJwcDsKLQkJZm9yIChpPTE7IGk8Wk9SQU5fVkJJX0JVRkZFUlM7IGkrKykKLQkJCXp0di0+cmVhZGluZm9baV0gPSB6dHYtPnJlYWRpbmZvW2ldOwotCQl3cml0ZV91bmxvY2tfaXJxKCZ6dHYtPmxvY2spOwotCQlicmVhazsKLQkgfQotCSBkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdmJpX3RlbXBsYXRlPQotewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAiVU5TRVQiLAotCS50eXBlCQk9IFZJRF9UWVBFX0NBUFRVUkV8VklEX1RZUEVfVEVMRVRFWFQsCi0JLmhhcmR3YXJlCT0gVklEX0hBUkRXQVJFX1pSMzYxMjAsCi0JLm9wZW4JCT0gdmJpX29wZW4sCi0JLmNsb3NlCQk9IHZiaV9jbG9zZSwKLQkucmVhZAkJPSB2YmlfcmVhZCwKLQkud3JpdGUJCT0gem9yYW5fd3JpdGUsCi0JLnBvbGwJCT0gdmJpX3BvbGwsCi0JLmlvY3RsCQk9IHZiaV9pb2N0bCwKLQkubWlub3IJCT0gLTEsCi19OwotCi0vKgotICogICAgICBTY2FuIGZvciBhIFpvcmFuIGNoaXAsIHJlcXVlc3QgdGhlIGlycSBhbmQgbWFwIHRoZSBpbyBtZW1vcnkKLSAqLwotc3RhdGljCi1pbnQgX19pbml0IGZpbmRfem9yYW4odm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCB6b3JhbiAqenR2OwotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247Ci0JaW50IHpvcmFuX251bSA9IDA7Ci0KLQl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfWk9SQU4sUENJX0RFVklDRV9JRF9aT1JBTl8zNjEyMCwgZGV2KSkpCi0JewotCQkvKiBPaywgYSBaUjM2MTIwL1pSMzYxMjUgZm91bmQhICovCi0JCXp0diA9ICZ6b3JhbnNbem9yYW5fbnVtXTsKLQkJenR2LT5kZXYgPSBkZXY7Ci0KLQkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldikpCi0JCQljb250aW51ZTsKLQotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiem9yYW46IFpvcmFuICV4IChyZXYgJWQpICIsCi0JCQlkZXYtPmRldmljZSwgcmV2aXNpb24pOwotCQlwcmludGsoImJ1czogJWQsIGRldmZuOiAlZCwgaXJxOiAlZCwgIiwKLQkJCWRldi0+YnVzLT5udW1iZXIsIGRldi0+ZGV2Zm4sIGRldi0+aXJxKTsKLQkJcHJpbnRrKCJtZW1vcnk6IDB4JTA4bHguXG4iLCB6dHYtPnpvcmFuX2Fkcik7Ci0KLQkJenR2LT56b3Jhbl9tZW0gPSBpb3JlbWFwKHp0di0+em9yYW5fYWRyLCAweDEwMDApOwotCQlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiem9yYW46IG1hcHBlZC1tZW1vcnkgYXQgMHglcFxuIix6dHYtPnpvcmFuX21lbSkpOwotCi0JCXJlc3VsdCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCB6b3Jhbl9pcnEsCi0JCQlJUlFGX1NIQVJFRHxJUlFGX0RJU0FCTEVELCJ6b3JhbiIsIHp0dik7Ci0JCWlmIChyZXN1bHQ9PS1FSU5WQUwpCi0JCXsKLQkJCWlvdW5tYXAoenR2LT56b3Jhbl9tZW0pOwotCQkJcHJpbnRrKEtFUk5fRVJSICJ6b3JhbjogQmFkIGlycSBudW1iZXIgb3IgaGFuZGxlclxuIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAocmVzdWx0PT0tRUJVU1kpCi0JCQlwcmludGsoS0VSTl9FUlIgInpvcmFuOiBJUlEgJWQgYnVzeSwgY2hhbmdlIHlvdXIgUG5QIGNvbmZpZyBpbiBCSU9TXG4iLGRldi0+aXJxKTsKLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCWlvdW5tYXAoenR2LT56b3Jhbl9tZW0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJLyogRW5hYmxlIGJ1cy1tYXN0ZXJpbmcgKi8KLQkJcGNpX3NldF9tYXN0ZXIoZGV2KTsKLQkJLyogS2VlcCBhIHJlZmVyZW5jZSAqLwotCQlwY2lfZGV2X2dldChkZXYpOwotCQl6b3Jhbl9udW0rKzsKLQl9Ci0JaWYoem9yYW5fbnVtKQotCQlwcmludGsoS0VSTl9JTkZPICJ6b3JhbjogJWQgWm9yYW4gY2FyZChzKSBmb3VuZC5cbiIsem9yYW5fbnVtKTsKLQlyZXR1cm4gem9yYW5fbnVtOwotfQotCi1zdGF0aWMKLWludCBfX2luaXQgaW5pdF96b3JhbihpbnQgY2FyZCkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9ICZ6b3JhbnNbY2FyZF07Ci0JaW50CWk7Ci0KLQkvKiBpZiB0aGUgZ2l2ZW4gY2FyZHR5cGUgdmFsaWQ/ICovCi0JaWYgKGNhcmR0eXBlW2NhcmRdPj1OUlRWQ0FSRFMpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaW52YWxpZCBjYXJkdHlwZSglZCkgZGV0ZWN0ZWRcbiIsY2FyZHR5cGVbY2FyZF0pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogcmVzZXQgdGhlIHpvcmFuICovCi0JenJhbmQoflpPUkFOX1BDSV9TT0ZUUkVTRVQsWk9SQU5fUENJKTsKLQl1ZGVsYXkoMTApOwotCXpyb3IoWk9SQU5fUENJX1NPRlRSRVNFVCxaT1JBTl9QQ0kpOwotCXVkZWxheSgxMCk7Ci0KLQkvKiB6b3JhbiBjaGlwIHNwZWNpZmljIGRldGFpbHMgKi8KLQl6dHYtPmNhcmQgPSB0dmNhcmRzK2NhcmR0eXBlW2NhcmRdOwkvKiBwb2ludCB0byB0aGUgc2VsZWN0ZWQgY2FyZCAqLwotCXp0di0+bm9ybSA9IDA7CQkJCS8qIFBBTCAqLwotCXp0di0+dHVuZXJfZnJlcSA9IDA7Ci0KLQkvKiB2aWRlb2NhcmQgZGV0YWlscyAqLwotCXp0di0+c3dpZHRoID0gODAwOwotCXp0di0+c2hlaWdodCA9IDYwMDsKLQl6dHYtPmRlcHRoID0gMTY7Ci0KLQkvKiBTdGF0ZSBkZXRhaWxzICovCi0JenR2LT5mYnVmZmVyID0gMDsKLQl6dHYtPm92ZXJpbmZvLmtpbmRvZiA9IEZCVUZGRVJfT1ZFUkxBWTsKLQl6dHYtPm92ZXJpbmZvLnN0YXR1cyA9IEZCVUZGRVJfRlJFRTsKLQl6dHYtPm92ZXJpbmZvLnggPSAwOwotCXp0di0+b3ZlcmluZm8ueSA9IDA7Ci0JenR2LT5vdmVyaW5mby53ID0gNzY4OyAvKiA2NDAgKi8KLQl6dHYtPm92ZXJpbmZvLmggPSA1NzY7IC8qIDQ4MCAqLwotCXp0di0+b3ZlcmluZm8uZm9ybWF0ID0gVklERU9fUEFMRVRURV9SR0I1NjU7Ci0JenR2LT5vdmVyaW5mby5icHAgPSBwYWxldHRlMmZtdFt6dHYtPm92ZXJpbmZvLmZvcm1hdF0uYnBwOwotCXp0di0+b3ZlcmluZm8uYnBsID0genR2LT5vdmVyaW5mby5icHAqenR2LT5zd2lkdGg7Ci0JenR2LT5vdmVyaW5mby5idXNhZHIgPSAwOwotCXp0di0+b3ZlcmluZm8ubWVtYWRyID0gMDsKLQl6dHYtPm92ZXJpbmZvLm92ZXJsYXkgPSAwOwotCWZvciAoaT0wOyBpPFpPUkFOX01BWF9GQlVGRkVSUzsgaSsrKSB7Ci0JCXp0di0+Z3JhYmluZm9baV0gPSB6dHYtPm92ZXJpbmZvOwotCQl6dHYtPmdyYWJpbmZvW2ldLmtpbmRvZiA9IEZCVUZGRVJfR1JBQjsKLQl9Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmenR2LT5ncmFicSk7Ci0KLQkvKiBWQkkgZGV0YWlscyAqLwotCXp0di0+cmVhZGluZm9bMF0gPSB6dHYtPm92ZXJpbmZvOwotCXp0di0+cmVhZGluZm9bMF0ua2luZG9mID0gRkJVRkZFUl9WQkk7Ci0JenR2LT5yZWFkaW5mb1swXS53ID0gLTg2NDsKLQl6dHYtPnJlYWRpbmZvWzBdLmggPSAtMzg7Ci0JenR2LT5yZWFkaW5mb1swXS5mb3JtYXQgPSBWSURFT19QQUxFVFRFX1lVVjQyMjsKLQl6dHYtPnJlYWRpbmZvWzBdLmJwcCA9IHBhbGV0dGUyZm10W3p0di0+cmVhZGluZm9bMF0uZm9ybWF0XS5icHA7Ci0JenR2LT5yZWFkaW5mb1swXS5icGwgPSAxMDI0Knp0di0+cmVhZGluZm9bMF0uYnBwOwotCWZvciAoaT0xOyBpPFpPUkFOX1ZCSV9CVUZGRVJTOyBpKyspCi0JCXp0di0+cmVhZGluZm9baV0gPSB6dHYtPnJlYWRpbmZvWzBdOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnp0di0+dmJpcSk7Ci0KLQkvKiBtYWludGVuYW5jZSBkYXRhICovCi0JenR2LT5oYXZlX2RlY29kZXIgPSAwOwotCXp0di0+aGF2ZV90dW5lciA9IDA7Ci0JenR2LT50dW5lcl90eXBlID0gMDsKLQl6dHYtPnJ1bm5pbmcgPSAwOwotCXp0di0+dXNlcnMgPSAwOwotCXJ3bG9ja19pbml0KCZ6dHYtPmxvY2spOwotCXp0di0+d29ya3F1ZXVlID0gMDsKLQl6dHYtPmZpZWxkbnIgPSAwOwotCXp0di0+bGFzdGZpZWxkbnIgPSAwOwotCi0JaWYgKHRyaXRvbjEpCi0JCXpyYW5kKH5aT1JBTl9WRENfVFJJQ09NLCBaT1JBTl9WREMpOwotCi0JLyogZXh0ZXJuYWwgRkwgZGV0ZXJtaW5lcyBUT1AgZnJhbWUgKi8KLQl6cm9yKFpPUkFOX1ZGRUNfRVhURkwsIFpPUkFOX1ZGRUMpOwotCi0JLyogc2V0IEhTcG9sICovCi0JaWYgKHp0di0+Y2FyZC0+aHN5bmNfcG9zKQotCQl6cndyaXRlKFpPUkFOX1ZGRUhfSFNQT0wsIFpPUkFOX1ZGRUgpOwotCS8qIHNldCBWU3BvbCAqLwotCWlmICh6dHYtPmNhcmQtPnZzeW5jX3BvcykKLQkJenJ3cml0ZShaT1JBTl9WRkVWX1ZTUE9MLCBaT1JBTl9WRkVWKTsKLQotCS8qIFNldCB0aGUgcHJvcGVyIEdlbmVyYWwgUHVycHVzZSByZWdpc3RlciBiaXRzICovCi0JLyogaW1wbGljaXQ6IG5vIHNvZnRyZXNldCwgMCB3YWl0c3RhdGVzICovCi0JenJ3cml0ZShaT1JBTl9QQ0lfU09GVFJFU0VUfCh6dHYtPmNhcmQtPmdwZGlyPDwwKSxaT1JBTl9QQ0kpOwotCS8qIGltcGxpY2l0OiAzIGR1cmF0aW9uIGFuZCByZWNvdmVyeSBQQ0kgY2xvY2tzIG9uIGd1ZXN0IDAtMyAqLwotCXpyd3JpdGUoenR2LT5jYXJkLT5ncHZhbDw8MjQsWk9SQU5fR1VFU1QpOwotCi0JLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCXpyd3JpdGUofjAsIFpPUkFOX0lTUik7Ci0KLQkvKgotCSAqIGkyYyB0ZW1wbGF0ZQotCSAqLwotCXp0di0+aTJjID0gem9yYW5faTJjX2J1c190ZW1wbGF0ZTsKLQlzcHJpbnRmKHp0di0+aTJjLm5hbWUsInpvcmFuLSVkIixjYXJkKTsKLQl6dHYtPmkyYy5kYXRhID0genR2OwotCi0JLyoKLQkgKiBOb3cgYWRkIHRoZSB0ZW1wbGF0ZSBhbmQgcmVnaXN0ZXIgdGhlIGRldmljZSB1bml0Ci0JICovCi0JenR2LT52aWRlb19kZXYgPSB6cjM2MTIwX3RlbXBsYXRlOwotCXN0cmNweSh6dHYtPnZpZGVvX2Rldi5uYW1lLCB6dHYtPmkyYy5uYW1lKTsKLQl6dHYtPnZpZGVvX2Rldi5wcml2ID0genR2OwotCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnp0di0+dmlkZW9fZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucikgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQl6dHYtPnZiaV9kZXYgPSB2YmlfdGVtcGxhdGU7Ci0Jc3RyY3B5KHp0di0+dmJpX2Rldi5uYW1lLCB6dHYtPmkyYy5uYW1lKTsKLQl6dHYtPnZiaV9kZXYucHJpdiA9IHp0djsKLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZ6dHYtPnZiaV9kZXYsIFZGTF9UWVBFX1ZCSSwgdmJpX25yKSA8IDApIHsKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnp0di0+dmlkZW9fZGV2KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpMmNfcmVnaXN0ZXJfYnVzKCZ6dHYtPmkyYyk7Ci0KLQkvKiBzZXQgaW50ZXJydXB0IG1hc2sgLSB0aGUgUElOIGVuYWJsZSB3aWxsIGJlIHNldCBsYXRlciAqLwotCXpyd3JpdGUoWk9SQU5fSUNSX0dJUlEwfFpPUkFOX0lDUl9HSVJRMXxaT1JBTl9JQ1JfQ09ERSwgWk9SQU5fSUNSKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnN0YWxsZWQgJXNcbiIsenR2LT5pMmMubmFtZSx6dHYtPmNhcmQtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMKLXZvaWQgcmVsZWFzZV96b3JhbihpbnQgbWF4KQotewotCXN0cnVjdCB6b3JhbiAqenR2OwotCWludCBpOwotCi0JZm9yIChpPTA7aTxtYXg7IGkrKykKLQl7Ci0JCXp0diA9ICZ6b3JhbnNbaV07Ci0KLQkJLyogdHVybiBvZmYgYWxsIGNhcHR1cmluZywgRE1BIGFuZCBJUlFzICovCi0JCS8qIHJlc2V0IHRoZSB6b3JhbiAqLwotCQl6cmFuZCh+Wk9SQU5fUENJX1NPRlRSRVNFVCxaT1JBTl9QQ0kpOwotCQl1ZGVsYXkoMTApOwotCQl6cm9yKFpPUkFOX1BDSV9TT0ZUUkVTRVQsWk9SQU5fUENJKTsKLQkJdWRlbGF5KDEwKTsKLQotCQkvKiBmaXJzdCBkaXNhYmxlIGludGVycnVwdHMgYmVmb3JlIHVubWFwcGluZyB0aGUgbWVtb3J5ISAqLwotCQl6cndyaXRlKDAsIFpPUkFOX0lDUik7Ci0JCXpyd3JpdGUoMHhmZmZmZmZmZlVMLFpPUkFOX0lTUik7Ci0KLQkJLyogZnJlZSBpdCAqLwotCQlmcmVlX2lycSh6dHYtPmRldi0+aXJxLHp0dik7Ci0KLQkJLyogdW5yZWdpc3RlciBpMmNfYnVzICovCi0JCWkyY191bnJlZ2lzdGVyX2J1cygoJnp0di0+aTJjKSk7Ci0KLQkJLyogdW5tYXAgYW5kIGZyZWUgbWVtb3J5ICovCi0JCWlmICh6dHYtPnpvcmFuX21lbSkKLQkJCWlvdW5tYXAoenR2LT56b3Jhbl9tZW0pOwotCi0JCS8qIERyb3AgUENJIGRldmljZSAqLwotCQlwY2lfZGV2X3B1dCh6dHYtPmRldik7Ci0KLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnp0di0+dmlkZW9fZGV2KTsKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnp0di0+dmJpX2Rldik7Ci0JfQotfQotCi12b2lkIF9fZXhpdCB6cjM2MTIwX2V4aXQodm9pZCkKLXsKLQlyZWxlYXNlX3pvcmFuKHpvcmFuX2NhcmRzKTsKLX0KLQotaW50IF9faW5pdCB6cjM2MTIwX2luaXQodm9pZCkKLXsKLQlpbnQJY2FyZDsKLQotCWhhbmRsZV9jaGlwc2V0KCk7Ci0Jem9yYW5fY2FyZHMgPSBmaW5kX3pvcmFuKCk7Ci0JaWYgKHpvcmFuX2NhcmRzIDw9IDApCi0JCXJldHVybiAtRUlPOwotCi0JLyogaW5pdGlhbGl6ZSBab3JhbnMgKi8KLQlmb3IgKGNhcmQ9MDsgY2FyZDx6b3Jhbl9jYXJkczsgY2FyZCsrKSB7Ci0JCWlmIChpbml0X3pvcmFuKGNhcmQpIDwgMCkgewotCQkJLyogb25seSByZWxlYXNlIHRoZSB6b3JhbnMgd2UgaGF2ZSByZWdpc3RlcmVkICovCi0JCQlyZWxlYXNlX3pvcmFuKGNhcmQpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KHpyMzYxMjBfaW5pdCk7Ci1tb2R1bGVfZXhpdCh6cjM2MTIwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxZTQ4NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKgotICAgIHpyMzYxMjAuaCAtIFpvcmFuIDM2MTIwLzM2MTI1IGJhc2VkIGZyYW1lZ3JhYmJlcnMKLQotICAgIENvcHlyaWdodCAoQykgMTk5OC0xOTk5IFBhdWxpbmUgTWlkZGVsaW5rIChtaWRkZWxpbkBwb2x5d2FyZS5ubCkKLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KLQotI2lmbmRlZiBfWlIzNjEyMF9ICi0jZGVmaW5lIF9aUjM2MTIwX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jaW5jbHVkZSA8bGludXgvaTJjLW9sZC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotLyoKLSAqIERlYnVnIG1hY3JvJ3MsIHBsYWNlIGFuIHggYmVoaW5kIHRoZSApIGZvciBhY3R1YWwgZGVidWctY29tcGlsYXRpb24KLSAqIEUuZy4gI2RlZmluZSBERUJVRyh4Li4uKQl4Ci0gKi8KLSNkZWZpbmUgREVCVUcoeC4uLikJCQkvKiBEZWJ1ZyBkcml2ZXIgKi8KLSNkZWZpbmUgSURFQlVHKHguLi4pCQkJLyogRGVidWcgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSNkZWZpbmUgUERFQlVHCQkwCQkvKiBEZWJ1ZyBQQ0kgd3JpdGVzICovCi0KLS8qIGRlZmluZWQgaW4genIzNjEyMF9pMmMgKi8KLWV4dGVybiBzdHJ1Y3QgaTJjX2J1cyB6b3Jhbl9pMmNfYnVzX3RlbXBsYXRlOwotCi0jZGVmaW5lCVpPUkFOX01BWF9GQlVGRkVSUwkyCi0jZGVmaW5lCVpPUkFOX01BWF9GQlVGRkVSCSg3NjgqNTc2KjIpCi0jZGVmaW5lCVpPUkFOX01BWF9GQlVGU0laRQkoWk9SQU5fTUFYX0ZCVUZGRVJTKlpPUkFOX01BWF9GQlVGRkVSKQotCi0jZGVmaW5lCVpPUkFOX1ZCSV9CVUZGRVJTCTIKLSNkZWZpbmUJWk9SQU5fVkJJX0JVRlNJWkUJKDIyKjEwMjQqMikKLQotc3RydWN0IHR2Y2FyZCB7Ci0JY2hhcioJbmFtZTsJCS8qIG5hbWUgb2YgdGhlIGNhcmR0eXBlICovCi0JaW50CXZpZGVvX2lucHV0czsJLyogbnVtYmVyIG9mIGNoYW5uZWxzIGRlZmluZWQgaW4gdmlkZW9fbXV4ICovCi0JaW50CWF1ZGlvX2lucHV0czsJLyogbnVtYmVyIG9mIGNoYW5uZWxzIGRlZmluZWQgaW4gYXVkaW9fbXV4ICovCi0JX191MzIJc3dhcGkyYzoxLAkvKiBuZWVkIHRvIHN3YXAgaTJjIHdpcmVzIFNEQS9TQ0w/ICovCi0JCXVzZWdpcnExOjEsCS8qIFZTWU5DIGF0IEdJUlExIGluc3RlYWQgb2YgR0lSUTA/ICovCi0JCXZzeW5jX3BvczoxLAkvKiBwb3NpdGl2ZSBWU1lOQyBzaWduYWw/ICovCi0JCWhzeW5jX3BvczoxLAkvKiBwb3NpdGl2ZSBIU1lOQyBzaWduYWw/ICovCi0JCWdwZGlyOjgsCS8qIEdlbmVyYWwgUHVycG9zZSBEaXJlY3Rpb24gcmVnaXN0ZXIgKi8KLQkJZ3B2YWw6ODsJLyogR2VuZXJhbCBQdXJwb3NlIFZhbHVlIHJlZ2lzdGVyICovCi0JaW50CXZpZGVvX211eFs2XTsJLyogbWFwcGluZyBjaGFubmVsIG51bWJlciB0byBwaHlzaWNhbCBpbnB1dCAqLwotI2RlZmluZQkJSVNfVFVORVIJMHg4MAotI2RlZmluZQkJSVNfU1ZIUwkJMHg0MAotI2RlZmluZQkJQ0hBTk5FTF9NQVNLCTB4M0YKLQlpbnQJYXVkaW9fbXV4WzZdOwkvKiBtYXBwaW5nIGNoYW5uZWwgbnVtYmVyIHRvIHBoeXNpY2FsIGlucHV0ICovCi19OwotI2RlZmluZQlUVU5FUih4KQkoKHgpfElTX1RVTkVSKQotI2RlZmluZQlTVkhTKHgpCQkoKHgpfElTX1NWSFMpCi0KLXN0cnVjdCB2aWRpbmZvIHsKLQlzdHJ1Y3QJdmlkaW5mbyogbmV4dDsJLyogbmV4dCBhY3RpdmUgYnVmZmVyCQkJKi8KLQl1aW50CWtpbmRvZjsKLSNkZWZpbmUJRkJVRkZFUl9PVkVSTEFZCQkwCi0jZGVmaW5lCUZCVUZGRVJfR1JBQgkJMQotI2RlZmluZQlGQlVGRkVSX1ZCSQkJMgotCXVpbnQJc3RhdHVzOwotI2RlZmluZSBGQlVGRkVSX0ZSRUUJCTAKLSNkZWZpbmUgRkJVRkZFUl9CVVNZCQkxCi0jZGVmaW5lIEZCVUZGRVJfRE9ORQkJMgotCXVsb25nCWZpZWxkbnI7CS8qICMgb2YgZmllbGQsIG5vdCBmcmFtZXIhCQkqLwotCXVpbnQJeCx5OwotCWludAl3LGg7CQkvKiB3LGggY2FuIGJlIG5lZ2F0aXZlIQkJCSovCi0JdWludAlmb3JtYXQ7CQkvKiBpbmRleCBpbiBwYWxldHRlMmZtdFtdCQkqLwotCXVpbnQJYnBwOwkJLyogbG9va3VwIGZyb20gcGFsZXR0ZTJmbXRbXQkJKi8KLQl1aW50CWJwbDsJCS8qIGNhbGM6IHdpZHRoICogYnBwCQkJKi8KLQl1bG9uZwlidXNhZHI7CQkvKiBidXMgYWRkciBmb3IgRE1BIGVuZ2luZQkJKi8KLQljaGFyKgltZW1hZHI7CQkvKiBrZXJuZWwgYWRkciBmb3IgbWFraW5nIGNvcGllcwkqLwotCXVsb25nKglvdmVybGF5OwkvKiBrZXJuZWwgYWRkciBvZiBvdmVybGF5IG1hc2sJCSovCi19OwotCi1zdHJ1Y3Qgem9yYW4KLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpZGVvX2RldjsKLSNkZWZpbmUgQ0FSRF9ERUJVRwlLRVJOX0RFQlVHICIlcyglbHUpOiAiCi0jZGVmaW5lIENBUkRfSU5GTwlLRVJOX0lORk8gIiVzKCVsdSk6ICIKLSNkZWZpbmUgQ0FSRF9FUlIJS0VSTl9FUlIgIiVzKCVsdSk6ICIKLSNkZWZpbmUgQ0FSRAkJenR2LT52aWRlb19kZXYubmFtZSx6dHYtPmZpZWxkbnIKLQotCS8qIHpvcmFuIGNoaXAgc3BlY2lmaWMgZGV0YWlscyAqLwotCXN0cnVjdCBpMmNfYnVzCWkyYzsJCS8qIGkyYyByZWdpc3RyYXRpb24gZGF0YQkqLwotCXN0cnVjdCBwY2lfZGV2KglkZXY7CQkvKiBwdHIgdG8gUENJIGRldmljZQkJKi8KLQl1bG9uZwkJem9yYW5fYWRyOwkvKiBidXMgYWRkcmVzcyBvZiBJTyBtZW1vcnkJKi8KLQljaGFyKgkJem9yYW5fbWVtOwkvKiBrZXJuZWwgYWRkcmVzcyBvZiBJTyBtZW1vcnkJKi8KLQlzdHJ1Y3QgdHZjYXJkKgljYXJkOwkJLyogdGhlIGNhcmR0eXBlCQkJKi8KLQl1aW50CQlub3JtOwkJLyogMD1QQUwsIDE9TlRTQywgMj1TRUNBTQkqLwotCXVpbnQJCXR1bmVyX2ZyZXE7CS8qIEN1cnJlbnQgZnJlcSBpbiBrSHoJCSovCi0Jc3RydWN0IHZpZGVvX3BpY3R1cmUgcGljdHVyZTsJLyogQ3VycmVudCBwaWN0dXJlIHBhcmFtcwkqLwotCi0JLyogdmlkZW9jYXJkIGRldGFpbHMgKi8KLQl1aW50CQlzd2lkdGg7CQkvKiBzY3JlZW4gd2lkdGgJCQkqLwotCXVpbnQJCXNoZWlnaHQ7CS8qIHNjcmVlbiBoZWlnaHQJCSovCi0JdWludAkJZGVwdGg7CQkvKiBkZXB0aCBpbiBiaXRzCQkqLwotCi0JLyogU3RhdGUgZGV0YWlscyAqLwotCWNoYXIqCQlmYnVmZmVyOwkvKiBmcmFtZWJ1ZmZlcnMgZm9yIG1tYXAJKi8KLQlzdHJ1Y3QgdmlkaW5mbwlvdmVyaW5mbzsJLyogb3ZlcmxheSBkYXRhCQkJKi8KLQlzdHJ1Y3QgdmlkaW5mbwlncmFiaW5mb1taT1JBTl9NQVhfRkJVRkZFUlNdOwkvKiBncmFiYmluZyBkYXRhKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBncmFicTsJLyogZ3JhYmJlcnMgcXVldWUJCSovCi0KLQkvKiBWQkkgZGV0YWlscyAqLwotCXN0cnVjdCB2aWRlb19kZXZpY2UgdmJpX2RldjsKLQlzdHJ1Y3QgdmlkaW5mbwlyZWFkaW5mb1syXTsJLyogVkJJIGRhdGEgLSBmbGlwIGJ1ZmZlcnMJKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCB2YmlxOwkJLyogdmJpIHF1ZXVlCQkJKi8KLQotCS8qIG1haW50ZW5hbmNlIGRhdGEgKi8KLQlpbnQJCWhhdmVfZGVjb2RlcjsJLyogZGlkIHdlIGRldGVjdCBhIG11eD8JCSovCi0JaW50CQloYXZlX3R1bmVyOwkvKiBkaWQgd2UgZGV0ZWN0IGEgdHVuZXI/CSovCi0JaW50CQl1c2VyczsJCS8qIGhvd21hbnkgdmlkZW8vdmJpIG9wZW4/CSovCi0JaW50CQl0dW5lcl90eXBlOwkvKiB0dW5lciB0eXBlLCB3aGVuIGZvdW5kCSovCi0JaW50CQlydW5uaW5nOwkvKiBhcmUgd2Ugcm9sbGluZz8JCSovCi0Jcndsb2NrX3QJbG9jazsKLQlsb25nCQlzdGF0ZTsJCS8qIHdoYXQgaXMgcmVxdWVzdGVkIG9mIHVzPwkqLwotI2RlZmluZSBTVEFURV9PVkVSTEFZCTAKLSNkZWZpbmUgU1RBVEVfVkJJCTEKLQlzdHJ1Y3QgdmlkaW5mbyoJd29ya3F1ZXVlOwkvKiBidWZmZXJzIHRvIGdyYWIsIGhlYWQgaXMgYWN0aXZlICovCi0JdWxvbmcJCWZpZWxkbnI7CS8qICNmaWVsZCwgdGlja2VkIGV2ZXJ5IFZTWU5DCSovCi0JdWxvbmcJCWxhc3RmaWVsZG5yOwkvKiAjZmllbGQsIHRpY2tlZCBldmVyeSBHUkFCCSovCi0KLQlpbnQJCXZpZEludGVybGFjZTsJLyogY2FsY3VsYXRlZCAqLwotCWludAkJdmlkWHNoaWZ0OwkvKiBjYWxjdWxhdGVkICovCi0JdWludAkJdmlkV2lkdGg7CS8qIGNhbGN1bGF0ZWQgKi8KLQl1aW50CQl2aWRIZWlnaHQ7CS8qIGNhbGN1bGF0ZWQgKi8KLX07Ci0KLSNkZWZpbmUgenJ3cml0ZShkYXQsYWRyKSAgICB3cml0ZWwoKGRhdCksKGNoYXIgKikgKHp0di0+em9yYW5fbWVtKyhhZHIpKSkKLSNkZWZpbmUgenJyZWFkKGFkcikgICAgICAgICByZWFkbCh6dHYtPnpvcmFuX21lbSsoYWRyKSkKLQotI2lmIFBERUJVRyA9PSAwCi0jZGVmaW5lIHpyYW5kKGRhdCxhZHIpICAgICAgenJ3cml0ZSgoZGF0KSAmIHpycmVhZChhZHIpLCBhZHIpCi0jZGVmaW5lIHpyb3IoZGF0LGFkcikgICAgICAgenJ3cml0ZSgoZGF0KSB8IHpycmVhZChhZHIpLCBhZHIpCi0jZGVmaW5lIHpyYW9yKGRhdCxtYXNrLGFkcikgenJ3cml0ZSggKChkYXQpJn4obWFzaykpIHwgKChtYXNrKSZ6cnJlYWQoYWRyKSksIGFkcikKLSNlbHNlCi0jZGVmaW5lIHpyYW5kKGRhdCwgYWRyKSBcCi1kbyB7IFwKLQl1bG9uZyBkYXRhID0gKGRhdCkgJiB6cnJlYWQoKGFkcikpOyBcCi0JenJ3cml0ZShkYXRhLCAoYWRyKSk7IFwKLQlpZiAoMCAhPSAofihkYXQpICYgenJyZWFkKChhZHIpKSkpIFwKLQkJcHJpbnRrKEtFUk5fREVCVUcgInpvcmFuOiB6cmFuZCBhdCAlZCglZCkgZGV0ZWN0ZWQgc2V0IGJpdHMoJXgpXG4iLCBfX0xJTkVfXywgKGFkciksIChkYXQpKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIHpyb3IoZGF0LCBhZHIpIFwKLWRvIHsgXAotCXVsb25nIGRhdGEgPSAoZGF0KSB8IHpycmVhZCgoYWRyKSk7IFwKLQl6cndyaXRlKGRhdGEsIChhZHIpKTsgXAotCWlmICgoZGF0KSAhPSAoKGRhdCkgJiB6cnJlYWQoYWRyKSkpIFwKLQkJcHJpbnRrKEtFUk5fREVCVUcgInpvcmFuOiB6cm9yIGF0ICVkKCVkKSBkZXRlY3RlZCB1bnNldCBiaXRzKCV4KVxuIiwgX19MSU5FX18sIChhZHIpLCAoZGF0KSk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSB6cmFvcihkYXQsIG1hc2ssIGFkcikgXAotZG8geyBcCi0JdWxvbmcgZGF0YTsgXAotCWlmICgoZGF0KSAmIChtYXNrKSkgXAotCQlwcmludGsoS0VSTl9ERUJVRyAiem9yYW46IHpyYW9yIGF0ICVkKCVkKSBkZXRlY3RlZCBiaXRzKCV4OiV4KVxuIiwgX19MSU5FX18sIChhZHIpLCAoZGF0KSwgKG1hc2spKTsgXAotCWRhdGEgPSAoKGRhdCkmfihtYXNrKSkgfCAoKG1hc2spICYgenJyZWFkKChhZHIpKSk7IFwKLQl6cndyaXRlKGRhdGEsKGFkcikpOyBcCi0JaWYgKCAoZGF0KSAhPSAofihtYXNrKSAmIHpycmVhZCgoYWRyKSkpICkgXAotCQlwcmludGsoS0VSTl9ERUJVRyAiem9yYW46IHpyYW9yIGF0ICVkKCVkKSBjb3VsZCBub3Qgc2V0IGFsbCBiaXRzKCV4OiV4KVxuIiwgX19MSU5FX18sIChhZHIpLCAoZGF0KSwgKG1hc2spKTsgXAotfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNlbmRpZgotCi0vKiB6b3JhbiBQQ0kgYWRkcmVzcyBzcGFjZSAqLwotI2RlZmluZSBaT1JBTl9WRkVICQkweDAwMAkvKiBWaWRlbyBGcm9udCBFbmQgSG9yaXpvbnRhbCBDb25mLiAqLwotI2RlZmluZQlaT1JBTl9WRkVIX0hTUE9MCSgxPDwzMCkKLSNkZWZpbmUJWk9SQU5fVkZFSF9IU1RBUlQJKDB4M0ZGPDwxMCkKLSNkZWZpbmUJWk9SQU5fVkZFSF9IRU5ECQkoMHgzRkY8PDApCi0KLSNkZWZpbmUgWk9SQU5fVkZFVgkJMHgwMDQJLyogVmlkZW8gRnJvbnQgRW5kIFZlcnRpY2FsIENvbmYuICovCi0jZGVmaW5lCVpPUkFOX1ZGRVZfVlNQT0wJKDE8PDMwKQotI2RlZmluZQlaT1JBTl9WRkVWX1ZTVEFSVAkoMHgzRkY8PDEwKQotI2RlZmluZQlaT1JBTl9WRkVWX1ZFTkQJCSgweDNGRjw8MCkKLQotI2RlZmluZQlaT1JBTl9WRkVDCQkweDAwOAkvKiBWaWRlbyBGcm9udCBFbmQgU2NhbGVyIGFuZCBQaXhlbCAqLwotI2RlZmluZSBaT1JBTl9WRkVDX0VYVEZMCSgxPDwyNikKLSNkZWZpbmUJWk9SQU5fVkZFQ19UT1BGSUVMRAkoMTw8MjUpCi0jZGVmaW5lCVpPUkFOX1ZGRUNfVkNMS1BPTAkoMTw8MjQpCi0jZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUgkoNzw8MjEpCi0jZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl8xCSgwPDwyMSkJLyogbm8gbHVtaSwgICAgMy10YXAgY2hyb21vICovCi0jZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl8yCSgxPDwyMSkJLyogMy10YXAgbHVtaSwgMy10YXAgY2hyb21vICovCi0jZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl8zCSgyPDwyMSkJLyogNC10YXAgbHVtaSwgNC10YXAgY2hyb21vICovCi0jZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl80CSgzPDwyMSkJLyogNS10YXAgbHVtaSwgNC10YXAgY2hyb21vICovCi0jZGVmaW5lCVpPUkFOX1ZGRUNfSEZJTFRFUl81CSg0PDwyMSkJLyogNC10YXAgbHVtaSwgNC10YXAgY2hyb21vICovCi0jZGVmaW5lCVpPUkFOX1ZGRUNfRFVQRkxECSgxPDwyMCkKLSNkZWZpbmUJWk9SQU5fVkZFQ19IT1JEQ00JKDYzPDwxNCkKLSNkZWZpbmUJWk9SQU5fVkZFQ19WRVJEQ00JKDYzPDw4KQotI2RlZmluZQlaT1JBTl9WRkVDX0RJU1BNT0QJKDE8PDYpCi0jZGVmaW5lCVpPUkFOX1ZGRUNfUkdCCQkoMzw8MykKLSNkZWZpbmUJWk9SQU5fVkZFQ19SR0JfWVVWNDIyCSgwPDwzKQotI2RlZmluZQlaT1JBTl9WRkVDX1JHQl9SR0I4ODgJKDE8PDMpCi0jZGVmaW5lCVpPUkFOX1ZGRUNfUkdCX1JHQjU2NQkoMjw8MykKLSNkZWZpbmUJWk9SQU5fVkZFQ19SR0JfUkdCNTU1CSgzPDwzKQotI2RlZmluZQlaT1JBTl9WRkVDX0VSUkRJRgkoMTw8MikKLSNkZWZpbmUJWk9SQU5fVkZFQ19QQUNLMjQJKDE8PDEpCi0jZGVmaW5lCVpPUkFOX1ZGRUNfTEUJCSgxPDwwKQotCi0jZGVmaW5lCVpPUkFOX1ZUT1AJCTB4MDBDCS8qIFZpZGVvIERpc3BsYXkgIlRvcCIgKi8KLQotI2RlZmluZQlaT1JBTl9WQk9UCQkweDAxMAkvKiBWaWRlbyBEaXNwbGF5ICJCb3R0b20iICovCi0KLSNkZWZpbmUJWk9SQU5fVlNUUgkJMHgwMTQJLyogVmlkZW8gRGlzcGxheSBTdHJpZGUgKi8KLSNkZWZpbmUJWk9SQU5fVlNUUl9ESVNQU1RSSURFCSgweEZGRkY8PDE2KQotI2RlZmluZQlaT1JBTl9WU1RSX1ZJRE9WRgkoMTw8OCkKLSNkZWZpbmUJWk9SQU5fVlNUUl9TTkFQU0hPVAkoMTw8MSkKLSNkZWZpbmUJWk9SQU5fVlNUUl9HUkFCCQkoMTw8MCkKLQotI2RlZmluZQlaT1JBTl9WREMJCTB4MDE4CS8qIFZpZGVvIERpc3BsYXkgQ29uZi4gKi8KLSNkZWZpbmUJWk9SQU5fVkRDX1ZJREVOCQkoMTw8MzEpCi0jZGVmaW5lCVpPUkFOX1ZEQ19NSU5QSVgJKDB4MUY8PDI1KQotI2RlZmluZQlaT1JBTl9WRENfVFJJQ09NCSgxPDwyNCkKLSNkZWZpbmUJWk9SQU5fVkRDX1ZJRFdJTkhUCSgweDNGRjw8MTIpCi0jZGVmaW5lCVpPUkFOX1ZEQ19WSURXSU5XSUQJKDB4M0ZGPDwwKQotCi0jZGVmaW5lCVpPUkFOX01UT1AJCTB4MDFDCS8qIE1hc2tpbmcgTWFwICJUb3AiICovCi0KLSNkZWZpbmUJWk9SQU5fTUJPVAkJMHgwMjAJLyogTWFza2luZyBNYXAgIkJvdHRvbSIgKi8KLQotI2RlZmluZQlaT1JBTl9PQ1IJCTB4MDI0CS8qIE92ZXJsYXkgQ29udHJvbCAqLwotI2RlZmluZQlaT1JBTl9PQ1JfT1ZMRU4JCSgxPDwxNSkKLSNkZWZpbmUJWk9SQU5fT0NSX01BU0tTVFJJREUJKDB4RkY8PDApCi0KLSNkZWZpbmUJWk9SQU5fUENJCQkweDAyOAkvKiBTeXN0ZW0sIFBDSSBhbmQgR1BQIENvbnRyb2wgKi8KLSNkZWZpbmUJWk9SQU5fUENJX1NPRlRSRVNFVAkoMTw8MjQpCi0jZGVmaW5lCVpPUkFOX1BDSV9XQUlUU1RBVEUJKDM8PDE2KQotI2RlZmluZQlaT1JBTl9QQ0lfR0VOUFVSRElSCSgweEZGPDwwKQotCi0jZGVmaW5lCVpPUkFOX0dVRVNUCQkweDAyQwkvKiBHdWVzdEJ1cyBDb250cm9sICovCi0KLSNkZWZpbmUJWk9SQU5fQ1NPVVJDRQkJMHgwMzAJLyogQ29kZSBTb3VyY2UgQWRkcmVzcyAqLwotCi0jZGVmaW5lCVpPUkFOX0NUUkFOUwkJMHgwMzQJLyogQ29kZSBUcmFuc2ZlciBDb250cm9sICovCi0KLSNkZWZpbmUJWk9SQU5fQ01FTQkJMHgwMzgJLyogQ29kZSBNZW1vcnkgUG9pbnRlciAqLwotCi0jZGVmaW5lCVpPUkFOX0lTUgkJMHgwM0MJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlaT1JBTl9JU1JfQ09ERQkJKDE8PDI4KQotI2RlZmluZQlaT1JBTl9JU1JfR0lSUTAJCSgxPDwyOSkKLSNkZWZpbmUJWk9SQU5fSVNSX0dJUlExCQkoMTw8MzApCi0KLSNkZWZpbmUJWk9SQU5fSUNSCQkweDA0MAkvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlaT1JBTl9JQ1JfRU4JCSgxPDwyNCkKLSNkZWZpbmUJWk9SQU5fSUNSX0NPREUJCSgxPDwyOCkKLSNkZWZpbmUJWk9SQU5fSUNSX0dJUlEwCQkoMTw8MjkpCi0jZGVmaW5lCVpPUkFOX0lDUl9HSVJRMQkJKDE8PDMwKQotCi0jZGVmaW5lCVpPUkFOX0kyQwkJMHgwNDQJLyogSTJDLUJ1cyAqLwotI2RlZmluZSBaT1JBTl9JMkNfU0NMCQkoMTw8MSkKLSNkZWZpbmUgWk9SQU5fSTJDX1NEQQkJKDE8PDApCi0KLSNkZWZpbmUJWk9SQU5fUE9TVAkJMHg0OAkvKiBQb3N0T2ZmaWNlICovCi0jZGVmaW5lCVpPUkFOX1BPU1RfUEVOCQkoMTw8MjUpCi0jZGVmaW5lCVpPUkFOX1BPU1RfVElNRQkJKDE8PDI0KQotI2RlZmluZQlaT1JBTl9QT1NUX0RJUgkJKDE8PDIzKQotI2RlZmluZQlaT1JBTl9QT1NUX0dVRVNUSUQJKDM8PDIwKQotI2RlZmluZQlaT1JBTl9QT1NUX0dVRVNUCSg3PDwxNikKLSNkZWZpbmUJWk9SQU5fUE9TVF9EQVRBCQkoMHhGRjw8MCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjBfaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjBfaTJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZmRlNDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwX2kyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gICAgenIzNjEyMF9pMmMuYyAtIFpvcmFuIDM2MTIwLzM2MTI1IGJhc2VkIGZyYW1lZ3JhYmJlcnMKLQotICAgIENvcHlyaWdodCAoQykgMTk5OC0xOTk5IFBhdWxpbmUgTWlkZGVsaW5rIDxtaWRkZWxpbkBwb2x5d2FyZS5ubD4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAidHVuZXIuaCIKLSNpbmNsdWRlICJ6cjM2MTIwLmgiCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBJMkMgZnVuY3Rpb25zCQkJCQkJCSAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBzb2Z0d2FyZSBJMkMgZnVuY3Rpb25zICovCi0KLSNkZWZpbmUgSTJDX0RFTEFZICAgMTAKLQotc3RhdGljIHZvaWQgaTJjX3NldGxpbmVzKHN0cnVjdCBpMmNfYnVzICpidXMsaW50IGN0cmwsaW50IGRhdGEpCi17Ci0Jc3RydWN0IHpvcmFuICp6dHYgPSAoc3RydWN0IHpvcmFuKilidXMtPmRhdGE7Ci0JdW5zaWduZWQgaW50IGIgPSAwOwotCWlmIChkYXRhKSBiIHw9IHp0di0+Y2FyZC0+c3dhcGkyYyA/IFpPUkFOX0kyQ19TQ0wgOiBaT1JBTl9JMkNfU0RBOwotCWlmIChjdHJsKSBiIHw9IHp0di0+Y2FyZC0+c3dhcGkyYyA/IFpPUkFOX0kyQ19TREEgOiBaT1JBTl9JMkNfU0NMOwotCXpyd3JpdGUoYiwgWk9SQU5fSTJDKTsKLQl1ZGVsYXkoSTJDX0RFTEFZKTsKLX0KLQotc3RhdGljIGludCBpMmNfZ2V0ZGF0YWxpbmUoc3RydWN0IGkyY19idXMgKmJ1cykKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4qKWJ1cy0+ZGF0YTsKLQlpZiAoenR2LT5jYXJkLT5zd2FwaTJjKQotCQlyZXR1cm4genJyZWFkKFpPUkFOX0kyQykgJiBaT1JBTl9JMkNfU0NMOwotCXJldHVybiB6cnJlYWQoWk9SQU5fSTJDKSAmIFpPUkFOX0kyQ19TREE7Ci19Ci0KLXN0YXRpYwotdm9pZCBhdHRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfYnVzICpidXMsIGludCBpZCkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4qKWJ1cy0+ZGF0YTsKLQlzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5IGRjOwotCWludCBydjsKLQotCXN3aXRjaCAoaWQpIHsKLQkgY2FzZSBJMkNfRFJJVkVSSURfVklERU9ERUNPREVSOgotCQlERUJVRyhwcmludGsoQ0FSRF9JTkZPICJkZWNvZGVyIGF0dGFjaGVkXG4iLENBUkQpKTsKLQotCQkvKiBmZXRjaCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZWNvZGVyICovCi0JCXJ2ID0gaTJjX2NvbnRyb2xfZGV2aWNlKCZ6dHYtPmkyYywgSTJDX0RSSVZFUklEX1ZJREVPREVDT0RFUiwgREVDT0RFUl9HRVRfQ0FQQUJJTElUSUVTLCAmZGMpOwotCQlpZiAocnYpIHsKLQkJCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJkZWNvZGVyIGlzIG5vdCBWNEwgYXdhcmUhXG4iLENBUkQpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCURFQlVHKHByaW50ayhDQVJEX0RFQlVHICJjYXBhYmlsaXRpZXMgJWQgJWQgJWRcbiIsQ0FSRCxkYy5mbGFncyxkYy5pbnB1dHMsZGMub3V0cHV0cykpOwotCi0JCS8qIFRlc3QgaWYgdGhlIGRlY29kZXIgY2FuIGRlIFZCSSB0cmFuc2ZlcnMgKi8KLQkJaWYgKGRjLmZsYWdzICYgMTYgLypWSURFT19ERUNPREVSX1ZCSSovKQotCQkJenR2LT5oYXZlX2RlY29kZXIgPSAyOwotCQllbHNlCi0JCQl6dHYtPmhhdmVfZGVjb2RlciA9IDE7Ci0JCWJyZWFrOwotCSBjYXNlIEkyQ19EUklWRVJJRF9UVU5FUjoKLQkJenR2LT5oYXZlX3R1bmVyID0gMTsKLQkJREVCVUcocHJpbnRrKENBUkRfSU5GTyAidHVuZXIgYXR0YWNoZWRcbiIsQ0FSRCkpOwotCQlpZiAoenR2LT50dW5lcl90eXBlID49IDApCi0JCXsKLQkJCWlmIChpMmNfY29udHJvbF9kZXZpY2UoJnp0di0+aTJjLEkyQ19EUklWRVJJRF9UVU5FUixUVU5FUl9TRVRfVFlQRSwmenR2LT50dW5lcl90eXBlKTwwKQotCQkJREVCVUcocHJpbnRrKENBUkRfSU5GTyAiYXR0YWNoX2luZm9ybTsgdHVuZXIgd29uJ3QgYmUgc2V0IHRvIHR5cGUgJWRcbiIsQ0FSRCx6dHYtPnR1bmVyX3R5cGUpKTsKLQkJfQotCQlicmVhazsKLQkgZGVmYXVsdDoKLQkJREVCVUcocHJpbnRrKENBUkRfSU5GTyAiYXR0YWNoX2luZm9ybTsgdW5rbm93biBkZXZpY2UgaWQ9JWRcbiIsQ0FSRCxpZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYwotdm9pZCBkZXRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfYnVzICpidXMsIGludCBpZCkKLXsKLQlzdHJ1Y3Qgem9yYW4gKnp0diA9IChzdHJ1Y3Qgem9yYW4qKWJ1cy0+ZGF0YTsKLQotCXN3aXRjaCAoaWQpIHsKLQkgY2FzZSBJMkNfRFJJVkVSSURfVklERU9ERUNPREVSOgotCQl6dHYtPmhhdmVfZGVjb2RlciA9IDA7Ci0JCURFQlVHKHByaW50ayhDQVJEX0lORk8gImRlY29kZXIgZGV0YWNoZWRcbiIsQ0FSRCkpOwotCQlicmVhazsKLQkgY2FzZSBJMkNfRFJJVkVSSURfVFVORVI6Ci0JCXp0di0+aGF2ZV90dW5lciA9IDA7Ci0JCURFQlVHKHByaW50ayhDQVJEX0lORk8gInR1bmVyIGRldGFjaGVkXG4iLENBUkQpKTsKLQkJYnJlYWs7Ci0JIGRlZmF1bHQ6Ci0JCURFQlVHKHByaW50ayhDQVJEX0lORk8gImRldGFjaF9pbmZvcm07IHVua25vd24gZGV2aWNlIGlkPSVkXG4iLENBUkQsaWQpKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdHJ1Y3QgaTJjX2J1cyB6b3Jhbl9pMmNfYnVzX3RlbXBsYXRlID0KLXsKLQkiWlIzNjEyMCIsCi0JSTJDX0JVU0lEX1pPUkFOLAotCU5VTEwsCi0KLQlTUElOX0xPQ0tfVU5MT0NLRUQsCi0KLQlhdHRhY2hfaW5mb3JtLAotCWRldGFjaF9pbmZvcm0sCi0KLQlpMmNfc2V0bGluZXMsCi0JaTJjX2dldGRhdGFsaW5lLAotCU5VTEwsCi0JTlVMTAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMF9tZW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMF9tZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2ZWFhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pyMzYxMjBfbWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICAgIHpyMzYxMjBfbWVtLmMgLSBab3JhbiAzNjEyMC8zNjEyNSBiYXNlZCBmcmFtZWdyYWJiZXJzCi0KLSAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSBQYXVsaW5lIE1pZGRlbGluayA8bWlkZGVsaW5AcG9seXdhcmUubmw+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpZmRlZiBDT05GSUdfQklHUEhZU19BUkVBCi0jaW5jbHVkZSA8bGludXgvYmlncGh5c2FyZWEuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAienIzNjEyMC5oIgotI2luY2x1ZGUgInpyMzYxMjBfbWVtLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogTWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCogYm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCogbWVtOwotI2lmZGVmIENPTkZJR19CSUdQSFlTX0FSRUEKLQltZW0gPSBiaWdwaHlzYXJlYV9hbGxvY19wYWdlcyhzaXplL1BBR0VfU0laRSwgMSwgR0ZQX0tFUk5FTCk7Ci0jZWxzZQotCS8qCi0JICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBnb3QgYSBsb3Qgb2YgbWVtb3J5IGF0IGJvb3R0aW1lLAotCSAqIHNvIHdlIGtub3cgaXRzIGFsd2F5cyB0aGVyZS4uLgotCSAqLwotCW1lbSA9ICh2b2lkKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9VU0VSfEdGUF9ETUEsZ2V0X29yZGVyKHNpemUpKTsKLSNlbmRpZgotCWlmIChtZW0pIHsKLQkJdW5zaWduZWQgbG9uZyBhZHIgPSAodW5zaWduZWQgbG9uZyltZW07Ci0JCXdoaWxlIChzaXplID4gMCkgewotCQkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShwaHlzX3RvX3ZpcnQoYWRyKSkpOwotCQkJYWRyICs9IFBBR0VfU0laRTsKLQkJCXNpemUgLT0gUEFHRV9TSVpFOwotCQl9Ci0JfQotCXJldHVybiBtZW07Ci19Ci0KLXZvaWQgYmZyZWUodm9pZCogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaWYgKG1lbSkgewotCQl1bnNpZ25lZCBsb25nIGFkciA9ICh1bnNpZ25lZCBsb25nKW1lbTsKLQkJdW5zaWduZWQgbG9uZyBzaXogPSBzaXplOwotCQl3aGlsZSAoc2l6ID4gMCkgewotCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHBoeXNfdG9fdmlydChhZHIpKSk7Ci0JCQlhZHIgKz0gUEFHRV9TSVpFOwotCQkJc2l6IC09IFBBR0VfU0laRTsKLQkJfQotI2lmZGVmIENPTkZJR19CSUdQSFlTX0FSRUEKLQkJYmlncGh5c2FyZWFfZnJlZV9wYWdlcyhtZW0pOwotI2Vsc2UKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyltZW0sZ2V0X29yZGVyKHNpemUpKTsKLSNlbmRpZgotCX0KLX0KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwX21lbS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2MTIwX21lbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQxMTdhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjEyMF9tZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogZWl0aGVyIGttYWxsb2MoKSBvciBiaWdwaHlzYXJlYSgpIGFsbG9jZWQgbWVtb3J5IC0gY29udGludW91cyAqLwotdm9pZCoJYm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOwotdm9pZAliZnJlZSh2b2lkKiBtZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCmluZGV4IGU1YzcyNzEuLjZlMDY4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCkBAIC0zNDcsNyArMzQ3LDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJbXB0X2ludGVycnVwdCAtIE1QVCBhZGFwdGVyIChJT0MpIHNwZWNpZmljIGludGVycnVwdCBoYW5kbGVyLgogICoJQGlycTogaXJxIG51bWJlciAobm90IHVzZWQpCiAgKglAYnVzX2lkOiBidXMgaWRlbnRpZmllciBjb29raWUgPT0gcG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKQEAgLTM4NywxNCArMzg3LDE2IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCi0gKgltcHRfYmFzZV9yZXBseSAtIE1QVCBiYXNlIGRyaXZlcidzIGNhbGxiYWNrIHJvdXRpbmU7IGFsbCBiYXNlIGRyaXZlcgotICoJImludGVybmFsIiByZXF1ZXN0L3JlcGx5IHByb2Nlc3NpbmcgaXMgcm91dGVkIGhlcmUuCi0gKglDdXJyZW50bHkgdXNlZCBmb3IgRXZlbnROb3RpZmljYXRpb24gYW5kIEV2ZW50QWNrIGhhbmRsaW5nLgorLyoqCisgKgltcHRfYmFzZV9yZXBseSAtIE1QVCBiYXNlIGRyaXZlcidzIGNhbGxiYWNrIHJvdXRpbmUKICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKglAbWY6IFBvaW50ZXIgdG8gb3JpZ2luYWwgTVBUIHJlcXVlc3QgZnJhbWUKICAqCUByZXBseTogUG9pbnRlciB0byBNUFQgcmVwbHkgZnJhbWUgKE5VTEwgaWYgVHVyYm9SZXBseSkKICAqCisgKglNUFQgYmFzZSBkcml2ZXIncyBjYWxsYmFjayByb3V0aW5lOyBhbGwgYmFzZSBkcml2ZXIKKyAqCSJpbnRlcm5hbCIgcmVxdWVzdC9yZXBseSBwcm9jZXNzaW5nIGlzIHJvdXRlZCBoZXJlLgorICoJQ3VycmVudGx5IHVzZWQgZm9yIEV2ZW50Tm90aWZpY2F0aW9uIGFuZCBFdmVudEFjayBoYW5kbGluZy4KKyAqCiAgKglSZXR1cm5zIDEgaW5kaWNhdGluZyBvcmlnaW5hbCBhbGxvYydkIHJlcXVlc3QgZnJhbWUgcHRyCiAgKglzaG91bGQgYmUgZnJlZWQsIG9yIDAgaWYgaXQgc2hvdWxkbid0LgogICovCkBAIC01MzAsNyArNTMyLDcgQEAKICAqCUBkY2xhc3M6IFByb3RvY29sIGRyaXZlcidzIGNsYXNzICglTVBUX0RSSVZFUl9DTEFTUyBlbnVtIHZhbHVlKQogICoKICAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgYSBwcm90b2NvbC1zcGVjaWZpYyBkcml2ZXIgKFNDU0kgaG9zdCwKLSAqCUxBTiwgU0NTSSB0YXJnZXQpIHRvIHJlZ2lzdGVyIGl0J3MgcmVwbHkgY2FsbGJhY2sgcm91dGluZS4gIEVhY2gKKyAqCUxBTiwgU0NTSSB0YXJnZXQpIHRvIHJlZ2lzdGVyIGl0cyByZXBseSBjYWxsYmFjayByb3V0aW5lLiAgRWFjaAogICoJcHJvdG9jb2wtc3BlY2lmaWMgZHJpdmVyIG11c3QgZG8gdGhpcyBiZWZvcmUgaXQgd2lsbCBiZSBhYmxlIHRvCiAgKgl1c2UgYW55IElPQyByZXNvdXJjZXMsIHN1Y2ggYXMgb2J0YWluaW5nIHJlcXVlc3QgZnJhbWVzLgogICoKQEAgLTU3Miw3ICs1NzQsNyBAQAogICoJbXB0X2RlcmVnaXN0ZXIgLSBEZXJlZ2lzdGVyIGEgcHJvdG9jb2wgZHJpdmVycyByZXNvdXJjZXMuCiAgKglAY2JfaWR4OiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFuZGxlCiAgKgotICoJRWFjaCBwcm90b2NvbC1zcGVjaWZpYyBkcml2ZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIHdoZW4gaXQncworICoJRWFjaCBwcm90b2NvbC1zcGVjaWZpYyBkcml2ZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIHdoZW4gaXRzCiAgKgltb2R1bGUgaXMgdW5sb2FkZWQuCiAgKi8KIHZvaWQKQEAgLTYxNyw3ICs2MTksNyBAQAogICoKICAqCUVhY2ggcHJvdG9jb2wtc3BlY2lmaWMgZHJpdmVyIHNob3VsZCBjYWxsIHRoaXMgcm91dGluZQogICoJd2hlbiBpdCBkb2VzIG5vdCAob3IgY2FuIG5vIGxvbmdlcikgaGFuZGxlIGV2ZW50cywKLSAqCW9yIHdoZW4gaXQncyBtb2R1bGUgaXMgdW5sb2FkZWQuCisgKglvciB3aGVuIGl0cyBtb2R1bGUgaXMgdW5sb2FkZWQuCiAgKi8KIHZvaWQKIG1wdF9ldmVudF9kZXJlZ2lzdGVyKGludCBjYl9pZHgpCkBAIC02NTYsNyArNjU4LDcgQEAKICAqCiAgKglFYWNoIHByb3RvY29sLXNwZWNpZmljIGRyaXZlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUKICAqCXdoZW4gaXQgZG9lcyBub3QgKG9yIGNhbiBubyBsb25nZXIpIGhhbmRsZSBJT0MgcmVzZXQgaGFuZGxpbmcsCi0gKglvciB3aGVuIGl0J3MgbW9kdWxlIGlzIHVubG9hZGVkLgorICoJb3Igd2hlbiBpdHMgbW9kdWxlIGlzIHVubG9hZGVkLgogICovCiB2b2lkCiBtcHRfcmVzZXRfZGVyZWdpc3RlcihpbnQgY2JfaWR4KQpAQCAtNjcwLDYgKzY3Miw4IEBACiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAvKioKICAqCW1wdF9kZXZpY2VfZHJpdmVyX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgZGV2aWNlIGRyaXZlciBob29rcworICoJQGRkX2NiZnVuYzogZHJpdmVyIGNhbGxiYWNrcyBzdHJ1Y3QKKyAqCUBjYl9pZHg6IE1QVCBwcm90b2NvbCBkcml2ZXIgaW5kZXgKICAqLwogaW50CiBtcHRfZGV2aWNlX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgbXB0X3BjaV9kcml2ZXIgKiBkZF9jYmZ1bmMsIGludCBjYl9pZHgpCkBAIC02OTYsNiArNzAwLDcgQEAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qKgogICoJbXB0X2RldmljZV9kcml2ZXJfZGVyZWdpc3RlciAtIERlUmVnaXN0ZXIgZGV2aWNlIGRyaXZlciBob29rcworICoJQGNiX2lkeDogTVBUIHByb3RvY29sIGRyaXZlciBpbmRleAogICovCiB2b2lkCiBtcHRfZGV2aWNlX2RyaXZlcl9kZXJlZ2lzdGVyKGludCBjYl9pZHgpCkBAIC04ODcsOCArODkyLDcgQEAKIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogLyoqCi0gKgltcHRfc2VuZF9oYW5kc2hha2VfcmVxdWVzdCAtIFNlbmQgTVBUIHJlcXVlc3QgdmlhIGRvb3JiZWxsCi0gKgloYW5kc2hha2UgbWV0aG9kLgorICoJbXB0X3NlbmRfaGFuZHNoYWtlX3JlcXVlc3QgLSBTZW5kIE1QVCByZXF1ZXN0IHZpYSBkb29yYmVsbCBoYW5kc2hha2UgbWV0aG9kLgogICoJQGhhbmRsZTogSGFuZGxlIG9mIHJlZ2lzdGVyZWQgTVBUIHByb3RvY29sIGRyaXZlcgogICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCUByZXFCeXRlczogU2l6ZSBvZiB0aGUgcmVxdWVzdCBpbiBieXRlcwpAQCAtOTgxLDEwICs5ODUsMTMgQEAKIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogLyoqCi0gKiBtcHRfaG9zdF9wYWdlX2FjY2Vzc19jb250cm9sIC0gcHJvdmlkZXMgbWVjaGFuaXNtIGZvciB0aGUgaG9zdAotICogZHJpdmVyIHRvIGNvbnRyb2wgdGhlIElPQydzIEhvc3QgUGFnZSBCdWZmZXIgYWNjZXNzLgorICogbXB0X2hvc3RfcGFnZV9hY2Nlc3NfY29udHJvbCAtIGNvbnRyb2wgdGhlIElPQydzIEhvc3QgUGFnZSBCdWZmZXIgYWNjZXNzCiAgKiBAaW9jOiBQb2ludGVyIHRvIE1QVCBhZGFwdGVyIHN0cnVjdHVyZQogICogQGFjY2Vzc19jb250cm9sX3ZhbHVlOiBkZWZpbmUgYml0cyBiZWxvdworICogQHNsZWVwRmxhZzogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHByb2Nlc3MgY2FuIHNsZWVwCisgKgorICogUHJvdmlkZXMgbWVjaGFuaXNtIGZvciB0aGUgaG9zdCBkcml2ZXIgdG8gY29udHJvbCB0aGUgSU9DJ3MKKyAqIEhvc3QgUGFnZSBCdWZmZXIgYWNjZXNzLgogICoKICAqIEFjY2VzcyBDb250cm9sIFZhbHVlIC0gYml0c1sxNToxMl0KICAqIDBoIFJlc2VydmVkCkBAIC0xMDIyLDEwICsxMDI5LDEwIEBACiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAvKioKICAqCW1wdF9ob3N0X3BhZ2VfYWxsb2MgLSBhbGxvY2F0ZSBzeXN0ZW0gbWVtb3J5IGZvciB0aGUgZncKLSAqCUlmIHdlIGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSBpbiBwYXN0LCB0aGVuIHJlc2VuZCB0aGUgc2FtZSBwb2ludGVyLgotICoJaW9jQDogUG9pbnRlciB0byBwb2ludGVyIHRvIElPQyBhZGFwdGVyCi0gKglpb2NfaW5pdEA6IFBvaW50ZXIgdG8gaW9jIGluaXQgY29uZmlnIHBhZ2UKKyAqCUBpb2M6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBJT0MgYWRhcHRlcgorICoJQGlvY19pbml0OiBQb2ludGVyIHRvIGlvYyBpbml0IGNvbmZpZyBwYWdlCiAgKgorICoJSWYgd2UgYWxyZWFkeSBhbGxvY2F0ZWQgbWVtb3J5IGluIHBhc3QsIHRoZW4gcmVzZW5kIHRoZSBzYW1lIHBvaW50ZXIuCiAgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50CkBAIC0xMDkxLDEyICsxMDk4LDE1IEBACiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qKgotICoJbXB0X3ZlcmlmeV9hZGFwdGVyIC0gR2l2ZW4gYSB1bmlxdWUgSU9DIGlkZW50aWZpZXIsIHNldCBwb2ludGVyIHRvCi0gKgl0aGUgYXNzb2NpYXRlZCBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKgltcHRfdmVyaWZ5X2FkYXB0ZXIgLSBHaXZlbiBJT0MgaWRlbnRpZmllciwgc2V0IHBvaW50ZXIgdG8gaXRzIGFkYXB0ZXIgc3RydWN0dXJlLgogICoJQGlvY2lkOiBJT0MgdW5pcXVlIGlkZW50aWZpZXIgKGludGVnZXIpCiAgKglAaW9jcHA6IFBvaW50ZXIgdG8gcG9pbnRlciB0byBJT0MgYWRhcHRlcgogICoKLSAqCVJldHVybnMgaW9jaWQgYW5kIHNldHMgaW9jcHAuCisgKglHaXZlbiBhIHVuaXF1ZSBJT0MgaWRlbnRpZmllciwgc2V0IHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgTVBUCisgKglhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zIGlvY2lkIGFuZCBzZXRzIGlvY3BwIGlmIGlvY2lkIGlzIGZvdW5kLgorICoJUmV0dXJucyAtMSBpZiBpb2NpZCBpcyBub3QgZm91bmQuCiAgKi8KIGludAogbXB0X3ZlcmlmeV9hZGFwdGVyKGludCBpb2NpZCwgTVBUX0FEQVBURVIgKippb2NwcCkKQEAgLTExMTUsOSArMTEyNSwxMCBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKgltcHRfYXR0YWNoIC0gSW5zdGFsbCBhIFBDSSBpbnRlbGxpZ2VudCBNUFQgYWRhcHRlci4KICAqCUBwZGV2OiBQb2ludGVyIHRvIHBjaV9kZXYgc3RydWN0dXJlCisgKglAaWQ6IFBDSSBkZXZpY2UgSUQgaW5mb3JtYXRpb24KICAqCiAgKglUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYWxsIHRoZSBzdGVwcyBuZWNlc3NhcnkgdG8gYnJpbmcgdGhlIElPQyBvZgogICoJYSBNUFQgYWRhcHRlciB0byBhIE9QRVJBVElPTkFMIHN0YXRlLiAgVGhpcyBpbmNsdWRlcyByZWdpc3RlcmluZwpAQCAtMTQxNywxMCArMTQyOCw5IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCW1wdF9kZXRhY2ggLSBSZW1vdmUgYSBQQ0kgaW50ZWxsaWdlbnQgTVBUIGFkYXB0ZXIuCiAgKglAcGRldjogUG9pbnRlciB0byBwY2lfZGV2IHN0cnVjdHVyZQotICoKICAqLwogCiB2b2lkCkBAIC0xNDY2LDEwICsxNDc2LDEwIEBACiAgKi8KICNpZmRlZiBDT05GSUdfUE0KIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCW1wdF9zdXNwZW5kIC0gRnVzaW9uIE1QVCBiYXNlIGRyaXZlciBzdXNwZW5kIHJvdXRpbmUuCi0gKgotICoKKyAqCUBwZGV2OiBQb2ludGVyIHRvIHBjaV9kZXYgc3RydWN0dXJlCisgKglAc3RhdGU6IG5ldyBzdGF0ZSB0byBlbnRlcgogICovCiBpbnQKIG1wdF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC0xNTA1LDEwICsxNTE1LDkgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJbXB0X3Jlc3VtZSAtIEZ1c2lvbiBNUFQgYmFzZSBkcml2ZXIgcmVzdW1lIHJvdXRpbmUuCi0gKgotICoKKyAqCUBwZGV2OiBQb2ludGVyIHRvIHBjaV9kZXYgc3RydWN0dXJlCiAgKi8KIGludAogbXB0X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKQEAgLTE1NjYsNyArMTU3NSw3IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCW1wdF9kb19pb2NfcmVjb3ZlcnkgLSBJbml0aWFsaXplIG9yIHJlY292ZXIgTVBUIGFkYXB0ZXIuCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVCBhZGFwdGVyIHN0cnVjdHVyZQogICoJQHJlYXNvbjogRXZlbnQgd29yZCAvIHJlYXNvbgpAQCAtMTg5MiwxMyArMTkwMSwxNSBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgotICoJbXB0X2RldGVjdF9ib3VuZF9wb3J0cyAtIFNlYXJjaCBmb3IgUENJIGJ1cy9kZXZfZnVuY3Rpb24KLSAqCXdoaWNoIG1hdGNoZXMgUENJIGJ1cy9kZXZfZnVuY3Rpb24gKCsvLTEpIGZvciBuZXdseSBkaXNjb3ZlcmVkIDkyOSwKLSAqCTkyOVgsIDEwMzAgb3IgMTAzNS4KKy8qKgorICoJbXB0X2RldGVjdF9ib3VuZF9wb3J0cyAtIFNlYXJjaCBmb3IgbWF0Y2hpbmcgUENJIGJ1cy9kZXZfZnVuY3Rpb24KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUIGFkYXB0ZXIgc3RydWN0dXJlCiAgKglAcGRldjogUG9pbnRlciB0byAoc3RydWN0IHBjaV9kZXYpIHN0cnVjdHVyZQogICoKKyAqCVNlYXJjaCBmb3IgUENJIGJ1cy9kZXZfZnVuY3Rpb24gd2hpY2ggbWF0Y2hlcworICoJUENJIGJ1cy9kZXZfZnVuY3Rpb24gKCsvLTEpIGZvciBuZXdseSBkaXNjb3ZlcmVkIDkyOSwKKyAqCTkyOVgsIDEwMzAgb3IgMTAzNS4KKyAqCiAgKglJZiBtYXRjaCBvbiBQQ0kgZGV2X2Z1bmN0aW9uICsvLTEgaXMgZm91bmQsIGJpbmQgdGhlIHR3byBNUFQgYWRhcHRlcnMKICAqCXVzaW5nIGFsdF9pb2MgcG9pbnRlciBmaWVsZHMgaW4gdGhlaXIgJU1QVF9BREFQVEVSIHN0cnVjdHVyZXMuCiAgKi8KQEAgLTE5NDUsOSArMTk1Niw5IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCW1wdF9hZGFwdGVyX2Rpc2FibGUgLSBEaXNhYmxlIG1pc2JlaGF2aW5nIE1QVCBhZGFwdGVyLgotICoJQHRoaXM6IFBvaW50ZXIgdG8gTVBUIGFkYXB0ZXIgc3RydWN0dXJlCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVCBhZGFwdGVyIHN0cnVjdHVyZQogICovCiBzdGF0aWMgdm9pZAogbXB0X2FkYXB0ZXJfZGlzYWJsZShNUFRfQURBUFRFUiAqaW9jKQpAQCAtMjA0Niw5ICsyMDU3LDggQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKLSAqCW1wdF9hZGFwdGVyX2Rpc3Bvc2UgLSBGcmVlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgTVBUCi0gKglhZGFwdGVyLgorLyoqCisgKgltcHRfYWRhcHRlcl9kaXNwb3NlIC0gRnJlZSBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhbiBNUFQgYWRhcHRlcgogICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCiAgKglUaGlzIHJvdXRpbmUgdW5yZWdpc3RlcnMgaC93IHJlc291cmNlcyBhbmQgZnJlZXMgYWxsIGFsbG9jJ2QgbWVtb3J5CkBAIC0yMDk5LDggKzIxMDksOCBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgotICoJTXB0RGlzcGxheUlvY0NhcGFiaWxpdGllcyAtIERpc3BseSBJT0MncyBjYXBhY2lsaXRpZXMuCisvKioKKyAqCU1wdERpc3BsYXlJb2NDYXBhYmlsaXRpZXMgLSBEaXNwbHkgSU9DJ3MgY2FwYWJpbGl0aWVzLgogICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKICAqLwogc3RhdGljIHZvaWQKQEAgLTIxNDIsNyArMjE1Miw3IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCU1ha2VJb2NSZWFkeSAtIEdldCBJT0MgdG8gYSBSRUFEWSBzdGF0ZSwgdXNpbmcgS2lja1N0YXJ0IGlmIG5lZWRlZC4KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKglAZm9yY2U6IEZvcmNlIGhhcmQgS2lja1N0YXJ0IG9mIElPQwpAQCAtMjI3OSw3ICsyMjg5LDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJbXB0X0dldElvY1N0YXRlIC0gR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgTVBUIGFkYXB0ZXIuCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQGNvb2tlZDogUmVxdWVzdCByYXcgb3IgY29va2VkIElPQyBzdGF0ZQpAQCAtMjMwNCw3ICsyMzE0LDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJR2V0SW9jRmFjdHMgLSBTZW5kIElPQ0ZhY3RzIHJlcXVlc3QgdG8gTVBUIGFkYXB0ZXIuCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQHNsZWVwRmxhZzogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHByb2Nlc3MgY2FuIHNsZWVwCkBAIC0yNDc4LDcgKzI0ODgsNyBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKglHZXRQb3J0RmFjdHMgLSBTZW5kIFBvcnRGYWN0cyByZXF1ZXN0IHRvIE1QVCBhZGFwdGVyLgogICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKICAqCUBwb3J0bnVtOiBQb3J0IG51bWJlcgpAQCAtMjU0NSw3ICsyNTU1LDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJU2VuZElvY0luaXQgLSBTZW5kIElPQ0luaXQgcmVxdWVzdCB0byBNUFQgYWRhcHRlci4KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKQEAgLTI2MzAsNyArMjY0MCw3IEBACiAJfQogCiAJLyogTm8gbmVlZCB0byBieXRlIHN3YXAgdGhlIG11bHRpYnl0ZSBmaWVsZHMgaW4gdGhlIHJlcGx5Ci0JICogc2luY2Ugd2UgZG9uJ3QgZXZlbiBsb29rIGF0IGl0J3MgY29udGVudHMuCisJICogc2luY2Ugd2UgZG9uJ3QgZXZlbiBsb29rIGF0IGl0cyBjb250ZW50cy4KIAkgKi8KIAogCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBQb3J0RW5hYmxlIChyZXEgQCAlcClcbiIsCkBAIC0yNjcyLDcgKzI2ODIsNyBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKglTZW5kUG9ydEVuYWJsZSAtIFNlbmQgUG9ydEVuYWJsZSByZXF1ZXN0IHRvIE1QVCBhZGFwdGVyIHBvcnQuCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQHBvcnRudW06IFBvcnQgbnVtYmVyIHRvIGVuYWJsZQpAQCAtMjcyMyw5ICsyNzMzLDEzIEBACiAJcmV0dXJuIHJjOwogfQogCi0vKgotICoJaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQotICogICAgICBzaXplIC0gdG90YWwgRlcgYnl0ZXMKKy8qKgorICoJbXB0X2FsbG9jX2Z3X21lbW9yeSAtIGFsbG9jYXRlIGZpcm13YXJlIG1lbW9yeQorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqICAgICAgQHNpemU6IHRvdGFsIEZXIGJ5dGVzCisgKgorICoJSWYgbWVtb3J5IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCB0aGUgc2FtZSAoY2FjaGVkKSB2YWx1ZQorICoJaXMgcmV0dXJuZWQuCiAgKi8KIHZvaWQKIG1wdF9hbGxvY19md19tZW1vcnkoTVBUX0FEQVBURVIgKmlvYywgaW50IHNpemUpCkBAIC0yNzQyLDkgKzI3NTYsMTIgQEAKIAkJCWlvYy0+YWxsb2NfdG90YWwgKz0gc2l6ZTsKIAl9CiB9Ci0vKgotICogSWYgYWx0X2ltZyBpcyBOVUxMLCBkZWxldGUgZnJvbSBpb2Mgc3RydWN0dXJlLgotICogRWxzZSwgZGVsZXRlIGEgc2Vjb25kYXJ5IGltYWdlIGluIHNhbWUgZm9ybWF0LgorLyoqCisgKgltcHRfZnJlZV9md19tZW1vcnkgLSBmcmVlIGZpcm13YXJlIG1lbW9yeQorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCisgKglJZiBhbHRfaW1nIGlzIE5VTEwsIGRlbGV0ZSBmcm9tIGlvYyBzdHJ1Y3R1cmUuCisgKglFbHNlLCBkZWxldGUgYSBzZWNvbmRhcnkgaW1hZ2UgaW4gc2FtZSBmb3JtYXQuCiAgKi8KIHZvaWQKIG1wdF9mcmVlX2Z3X21lbW9yeShNUFRfQURBUFRFUiAqaW9jKQpAQCAtMjc2Myw3ICsyNzgwLDcgQEAKIAogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKgltcHRfZG9fdXBsb2FkIC0gQ29uc3RydWN0IGFuZCBTZW5kIEZXVXBsb2FkIHJlcXVlc3QgdG8gTVBUIGFkYXB0ZXIgcG9ydC4KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKQEAgLTI4NjUsMTAgKzI4ODIsMTAgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJbXB0X2Rvd25sb2FkYm9vdCAtIERvd25sb2FkQm9vdCBjb2RlCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQotICoJQGZsYWc6IFNwZWNpZnkgd2hpY2ggcGFydCBvZiBJT0MgbWVtb3J5IGlzIHRvIGJlIHVwbG9hZGVkLgorICoJQHBGd0hlYWRlcjogUG9pbnRlciB0byBmaXJtd2FyZSBoZWFkZXIgaW5mbwogICoJQHNsZWVwRmxhZzogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHByb2Nlc3MgY2FuIHNsZWVwCiAgKgogICoJRndEb3dubG9hZEJvb3QgcmVxdWlyZXMgUHJvZ3JhbW1lZCBJTyBhY2Nlc3MuCkBAIC0zMDcxLDcgKzMwODgsNyBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKglLaWNrU3RhcnQgLSBQZXJmb3JtIGhhcmQgcmVzZXQgb2YgTVBUIGFkYXB0ZXIuCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQGZvcmNlOiBGb3JjZSBoYXJkIHJlc2V0CkBAIC0zMTQ1LDEyICszMTYyLDEyIEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCW1wdF9kaWFnX3Jlc2V0IC0gUGVyZm9ybSBoYXJkIHJlc2V0IG9mIHRoZSBhZGFwdGVyLgogICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKICAqCUBpZ25vcmU6IFNldCBpZiB0byBob25vciBhbmQgY2xlYXIgdG8gaWdub3JlCiAgKgkJdGhlIHJlc2V0IGhpc3RvcnkgYml0Ci0gKglAc2xlZXBmbGFnOiBDQU5fU0xFRVAgaWYgY2FsbGVkIGluIGEgbm9uLWludGVycnVwdCB0aHJlYWQsCisgKglAc2xlZXBGbGFnOiBDQU5fU0xFRVAgaWYgY2FsbGVkIGluIGEgbm9uLWludGVycnVwdCB0aHJlYWQsCiAgKgkJZWxzZSBzZXQgdG8gTk9fU0xFRVAgKHVzZSBtZGVsYXkgaW5zdGVhZCkKICAqCiAgKglUaGlzIHJvdXRpbmUgcGxhY2VzIHRoZSBhZGFwdGVyIGluIGRpYWdub3N0aWMgbW9kZSB2aWEgdGhlCkBAIC0zNDM2LDExICszNDUzLDEyIEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCVNlbmRJb2NSZXNldCAtIFNlbmQgSU9DUmVzZXQgcmVxdWVzdCB0byBNUFQgYWRhcHRlci4KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKglAcmVzZXRfdHlwZTogcmVzZXQgdHlwZSwgZXhwZWN0ZWQgdmFsdWVzIGFyZQogICoJJU1QSV9GVU5DVElPTl9JT0NfTUVTU0FHRV9VTklUX1JFU0VUIG9yICVNUElfRlVOQ1RJT05fSU9fVU5JVF9SRVNFVAorICoJQHNsZWVwRmxhZzogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHByb2Nlc3MgY2FuIHNsZWVwCiAgKgogICoJU2VuZCBJT0NSZXNldCByZXF1ZXN0IHRvIHRoZSBNUFQgYWRhcHRlci4KICAqCkBAIC0zNDk0LDExICszNTEyLDEyIEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCi0gKglpbml0Q2hhaW5CdWZmZXJzIC0gQWxsb2NhdGUgbWVtb3J5IGZvciBhbmQgaW5pdGlhbGl6ZQotICoJY2hhaW4gYnVmZmVycywgY2hhaW4gYnVmZmVyIGNvbnRyb2wgYXJyYXlzIGFuZCBzcGlubG9jay4KLSAqCUBoZDogUG9pbnRlciB0byBNUFRfU0NTSV9IT1NUIHN0cnVjdHVyZQotICoJQGluaXQ6IElmIHNldCwgaW5pdGlhbGl6ZSB0aGUgc3BpbiBsb2NrLgorLyoqCisgKglpbml0Q2hhaW5CdWZmZXJzIC0gQWxsb2NhdGUgbWVtb3J5IGZvciBhbmQgaW5pdGlhbGl6ZSBjaGFpbiBidWZmZXJzCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoKKyAqCUFsbG9jYXRlcyBtZW1vcnkgZm9yIGFuZCBpbml0aWFsaXplcyBjaGFpbiBidWZmZXJzLAorICoJY2hhaW4gYnVmZmVyIGNvbnRyb2wgYXJyYXlzIGFuZCBzcGlubG9jay4KICAqLwogc3RhdGljIGludAogaW5pdENoYWluQnVmZmVycyhNUFRfQURBUFRFUiAqaW9jKQpAQCAtMzU5NCw3ICszNjEzLDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJUHJpbWVJb2NGaWZvcyAtIEluaXRpYWxpemUgSU9DIHJlcXVlc3QgYW5kIHJlcGx5IEZJRk9zLgogICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKICAqCkBAIC0zODkxLDE1ICszOTEwLDE1IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCi0gKglXYWl0Rm9yRG9vcmJlbGxBY2sgLSBXYWl0IGZvciBJT0MgdG8gY2xlYXIgdGhlIElPUF9ET09SQkVMTF9TVEFUVVMgYml0Ci0gKglpbiBpdCdzIEludFN0YXR1cyByZWdpc3Rlci4KKy8qKgorICoJV2FpdEZvckRvb3JiZWxsQWNrIC0gV2FpdCBmb3IgSU9DIGRvb3JiZWxsIGhhbmRzaGFrZSBhY2tub3dsZWRnZQogICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKICAqCUBob3dsb25nOiBIb3cgbG9uZyB0byB3YWl0IChpbiBzZWNvbmRzKQogICoJQHNsZWVwRmxhZzogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHByb2Nlc3MgY2FuIHNsZWVwCiAgKgogICoJVGhpcyByb3V0aW5lIHdhaXRzICh1cCB0byB+MiBzZWNvbmRzIG1heCkgZm9yIElPQyBkb29yYmVsbAotICoJaGFuZHNoYWtlIEFDS25vd2xlZGdlLgorICoJaGFuZHNoYWtlIEFDS25vd2xlZGdlLCBpbmRpY2F0ZWQgYnkgdGhlIElPUF9ET09SQkVMTF9TVEFUVVMKKyAqCWJpdCBpbiBpdHMgSW50U3RhdHVzIHJlZ2lzdGVyIGJlaW5nIGNsZWFyLgogICoKICAqCVJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLCBlbHNlIHdhaXQgbG9vcCBjb3VudC4KICAqLwpAQCAtMzk0MiwxNCArMzk2MSwxNCBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgotICoJV2FpdEZvckRvb3JiZWxsSW50IC0gV2FpdCBmb3IgSU9DIHRvIHNldCB0aGUgSElTX0RPT1JCRUxMX0lOVEVSUlVQVCBiaXQKLSAqCWluIGl0J3MgSW50U3RhdHVzIHJlZ2lzdGVyLgorLyoqCisgKglXYWl0Rm9yRG9vcmJlbGxJbnQgLSBXYWl0IGZvciBJT0MgdG8gc2V0IGl0cyBkb29yYmVsbCBpbnRlcnJ1cHQgYml0CiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQGhvd2xvbmc6IEhvdyBsb25nIHRvIHdhaXQgKGluIHNlY29uZHMpCiAgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKICAqCi0gKglUaGlzIHJvdXRpbmUgd2FpdHMgKHVwIHRvIH4yIHNlY29uZHMgbWF4KSBmb3IgSU9DIGRvb3JiZWxsIGludGVycnVwdC4KKyAqCVRoaXMgcm91dGluZSB3YWl0cyAodXAgdG8gfjIgc2Vjb25kcyBtYXgpIGZvciBJT0MgZG9vcmJlbGwgaW50ZXJydXB0CisgKgkoTVBJX0hJU19ET09SQkVMTF9JTlRFUlJVUFQpIHRvIGJlIHNldCBpbiB0aGUgSW50U3RhdHVzIHJlZ2lzdGVyLgogICoKICAqCVJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLCBlbHNlIHdhaXQgbG9vcCBjb3VudC4KICAqLwpAQCAtMzk5MSw4ICs0MDEwLDggQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKLSAqCVdhaXRGb3JEb29yYmVsbFJlcGx5IC0gV2FpdCBmb3IgYW5kIGNhcHR1cmUgYSBJT0MgaGFuZHNoYWtlIHJlcGx5LgorLyoqCisgKglXYWl0Rm9yRG9vcmJlbGxSZXBseSAtIFdhaXQgZm9yIGFuZCBjYXB0dXJlIGFuIElPQyBoYW5kc2hha2UgcmVwbHkuCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQGhvd2xvbmc6IEhvdyBsb25nIHRvIHdhaXQgKGluIHNlY29uZHMpCiAgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKQEAgLTQwNzcsNyArNDA5Niw3IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCUdldExhbkNvbmZpZ1BhZ2VzIC0gRmV0Y2ggTEFOQ29uZmlnIHBhZ2VzLgogICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKICAqCkBAIC00MTg4LDEyICs0MjA3LDkgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKLSAqCW1wdGJhc2Vfc2FzX3BlcnNpc3Rfb3BlcmF0aW9uIC0gUGVyZm9ybSBvcGVyYXRpb24gb24gU0FTIFBlcnNpdGVudCBUYWJsZQorLyoqCisgKgltcHRiYXNlX3Nhc19wZXJzaXN0X29wZXJhdGlvbiAtIFBlcmZvcm0gb3BlcmF0aW9uIG9uIFNBUyBQZXJzaXN0ZW50IFRhYmxlCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQotICoJQHNhc19hZGRyZXNzOiA2NGJpdCBTQVMgQWRkcmVzcyBmb3Igb3BlcmF0aW9uLgotICoJQHRhcmdldF9pZDogc3BlY2lmaWVkIHRhcmdldCBmb3Igb3BlcmF0aW9uCi0gKglAYnVzOiBzcGVjaWZpZWQgYnVzIGZvciBvcGVyYXRpb24KICAqCUBwZXJzaXN0X29wY29kZTogc2VlIGJlbG93CiAgKgogICoJTVBJX1NBU19PUF9DTEVBUl9OT1RfUFJFU0VOVCAtIEZyZWUgYWxsIHBlcnNpc3QgVGFyZ2V0SUQgbWFwcGluZ3MgZm9yCkBAIC00MjAyLDcgKzQyMTgsNyBAQAogICoKICAqCU5PVEU6IERvbid0IHVzZSBub3QgdGhpcyBmdW5jdGlvbiBkdXJpbmcgaW50ZXJydXB0IHRpbWUuCiAgKgotICoJUmV0dXJuczogMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZXJyb3IKKyAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZXJyb3IKICAqLwogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCkBAIC00Mzk5LDcgKzQ0MTUsNyBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKglHZXRJb1VuaXRQYWdlMiAtIFJldHJpZXZlIEJJT1MgdmVyc2lvbiBhbmQgYm9vdCBvcmRlciBpbmZvcm1hdGlvbi4KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKgpAQCAtNDQ1Nyw3ICs0NDczLDggQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoJbXB0X0dldFNjc2lQb3J0U2V0dGluZ3MgLSByZWFkIFNDU0kgUG9ydCBQYWdlIDAgYW5kIDIKKy8qKgorICoJbXB0X0dldFNjc2lQb3J0U2V0dGluZ3MgLSByZWFkIFNDU0kgUG9ydCBQYWdlIDAgYW5kIDIKICAqCUBpb2M6IFBvaW50ZXIgdG8gYSBBZGFwdGVyIFN0cnVjdXRyZQogICoJQHBvcnRudW06IElPQyBwb3J0IG51bWJlcgogICoKQEAgLTQ2NDQsNyArNDY2MSw4IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCW1wdF9yZWFkU2NzaURldmljZVBhZ2VIZWFkZXJzIC0gc2F2ZSB2ZXJzaW9uIGFuZCBsZW5ndGggb2YgU0RQMQorLyoqCisgKgltcHRfcmVhZFNjc2lEZXZpY2VQYWdlSGVhZGVycyAtIHNhdmUgdmVyc2lvbiBhbmQgbGVuZ3RoIG9mIFNEUDEKICAqCUBpb2M6IFBvaW50ZXIgdG8gYSBBZGFwdGVyIFN0cnVjdXRyZQogICoJQHBvcnRudW06IElPQyBwb3J0IG51bWJlcgogICoKQEAgLTQ5OTYsOSArNTAxNCw4IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCi0gKglTZW5kRXZlbnROb3RpZmljYXRpb24gLSBTZW5kIEV2ZW50Tm90aWZpY2F0aW9uIChvbiBvciBvZmYpIHJlcXVlc3QKLSAqCXRvIE1QVCBhZGFwdGVyLgorLyoqCisgKglTZW5kRXZlbnROb3RpZmljYXRpb24gLSBTZW5kIEV2ZW50Tm90aWZpY2F0aW9uIChvbiBvciBvZmYpIHJlcXVlc3QgdG8gYWRhcHRlcgogICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKICAqCUBFdlN3aXRjaDogRXZlbnQgc3dpdGNoIGZsYWdzCiAgKi8KQEAgLTUwNjIsOCArNTA3OSw4IEBACiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAvKioKICAqCW1wdF9jb25maWcgLSBHZW5lcmljIGZ1bmN0aW9uIHRvIGlzc3VlIGNvbmZpZyBtZXNzYWdlCi0gKglAaW9jIC0gUG9pbnRlciB0byBhbiBhZGFwdGVyIHN0cnVjdHVyZQotICoJQGNmZyAtIFBvaW50ZXIgdG8gYSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS4gU3RydWN0IGNvbnRhaW5zCisgKglAaW9jOiAgIFBvaW50ZXIgdG8gYW4gYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCUBwQ2ZnOiAgUG9pbnRlciB0byBhIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLiBTdHJ1Y3QgY29udGFpbnMKICAqCQlhY3Rpb24sIHBhZ2UgYWRkcmVzcywgZGlyZWN0aW9uLCBwaHlzaWNhbCBhZGRyZXNzCiAgKgkJYW5kIHBvaW50ZXIgdG8gYSBjb25maWd1cmF0aW9uIHBhZ2UgaGVhZGVyCiAgKgkJUGFnZSBoZWFkZXIgaXMgdXBkYXRlZC4KQEAgLTUxODgsOCArNTIwNSw4IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCi0gKgltcHRfdGltZXJfZXhwaXJlZCAtIENhbGwgYmFjayBmb3IgdGltZXIgcHJvY2Vzcy4KKy8qKgorICoJbXB0X3RpbWVyX2V4cGlyZWQgLSBDYWxsYmFjayBmb3IgdGltZXIgcHJvY2Vzcy4KICAqCVVzZWQgb25seSBpbnRlcm5hbCBjb25maWcgZnVuY3Rpb25hbGl0eS4KICAqCUBkYXRhOiBQb2ludGVyIHRvIE1QVF9TQ1NJX0hPU1QgcmVjYXN0IGFzIGFuIHVuc2lnbmVkIGxvbmcKICAqLwpAQCAtNTIxNCwxMiArNTIzMSwxMiBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKgltcHRfaW9jX3Jlc2V0IC0gQmFzZSBjbGVhbnVwIGZvciBoYXJkIHJlc2V0CiAgKglAaW9jOiBQb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQogICoJQHJlc2V0X3BoYXNlOiBJbmRpY2F0ZXMgcHJlLSBvciBwb3N0LXJlc2V0IGZ1bmN0aW9uYWxpdHkKICAqCi0gKglSZW1hcms6IEZyZWUncyByZXNvdXJjZXMgd2l0aCBpbnRlcm5hbGx5IGdlbmVyYXRlZCBjb21tYW5kcy4KKyAqCVJlbWFyazogRnJlZXMgcmVzb3VyY2VzIHdpdGggaW50ZXJuYWxseSBnZW5lcmF0ZWQgY29tbWFuZHMuCiAgKi8KIHN0YXRpYyBpbnQKIG1wdF9pb2NfcmVzZXQoTVBUX0FEQVBURVIgKmlvYywgaW50IHJlc2V0X3BoYXNlKQpAQCAtNTI3MSw3ICs1Mjg4LDcgQEAKICAqCXByb2NmcyAoJU1QVF9QUk9DRlNfTVBUQkFTRURJUi8uLi4pIHN1cHBvcnQgc3R1ZmYuLi4KICAqLwogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJcHJvY21wdF9jcmVhdGUgLSBDcmVhdGUgJU1QVF9QUk9DRlNfTVBUQkFTRURJUiBlbnRyaWVzLgogICoKICAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCkBAIC01Mjk3LDcgKzUzMTQsNyBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKglwcm9jbXB0X2Rlc3Ryb3kgLSBUZWFyIGRvd24gJU1QVF9QUk9DRlNfTVBUQkFTRURJUiBlbnRyaWVzLgogICoKICAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCkBAIC01MzExLDE2ICs1MzI4LDE2IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCi0gKglwcm9jbXB0X3N1bW1hcnlfcmVhZCAtIEhhbmRsZSByZWFkIHJlcXVlc3QgZnJvbSAvcHJvYy9tcHQvc3VtbWFyeQotICoJb3IgZnJvbSAvcHJvYy9tcHQvaW9jTi9zdW1tYXJ5LgorLyoqCisgKglwcm9jbXB0X3N1bW1hcnlfcmVhZCAtIEhhbmRsZSByZWFkIHJlcXVlc3Qgb2YgYSBzdW1tYXJ5IGZpbGUKICAqCUBidWY6IFBvaW50ZXIgdG8gYXJlYSB0byB3cml0ZSBpbmZvcm1hdGlvbgogICoJQHN0YXJ0OiBQb2ludGVyIHRvIHN0YXJ0IHBvaW50ZXIKICAqCUBvZmZzZXQ6IE9mZnNldCB0byBzdGFydCB3cml0aW5nCi0gKglAcmVxdWVzdDoKKyAqCUByZXF1ZXN0OiBBbW91bnQgb2YgcmVhZCBkYXRhIHJlcXVlc3RlZAogICoJQGVvZjogUG9pbnRlciB0byBFT0YgaW50ZWdlcgogICoJQGRhdGE6IFBvaW50ZXIKICAqCisgKglIYW5kbGVzIHJlYWQgcmVxdWVzdCBmcm9tIC9wcm9jL21wdC9zdW1tYXJ5IG9yIC9wcm9jL21wdC9pb2NOL3N1bW1hcnkuCiAgKglSZXR1cm5zIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gdG8gcHJvY2VzcyBwZXJmb3JtaW5nIHRoZSByZWFkLgogICovCiBzdGF0aWMgaW50CkBAIC01MzU1LDEyICs1MzcyLDEyIEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCXByb2NtcHRfdmVyc2lvbl9yZWFkIC0gSGFuZGxlIHJlYWQgcmVxdWVzdCBmcm9tIC9wcm9jL21wdC92ZXJzaW9uLgogICoJQGJ1ZjogUG9pbnRlciB0byBhcmVhIHRvIHdyaXRlIGluZm9ybWF0aW9uCiAgKglAc3RhcnQ6IFBvaW50ZXIgdG8gc3RhcnQgcG9pbnRlcgogICoJQG9mZnNldDogT2Zmc2V0IHRvIHN0YXJ0IHdyaXRpbmcKLSAqCUByZXF1ZXN0OgorICoJQHJlcXVlc3Q6IEFtb3VudCBvZiByZWFkIGRhdGEgcmVxdWVzdGVkCiAgKglAZW9mOiBQb2ludGVyIHRvIEVPRiBpbnRlZ2VyCiAgKglAZGF0YTogUG9pbnRlcgogICoKQEAgLTU0MTEsMTIgKzU0MjgsMTIgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJcHJvY21wdF9pb2NpbmZvX3JlYWQgLSBIYW5kbGUgcmVhZCByZXF1ZXN0IGZyb20gL3Byb2MvbXB0L2lvY04vaW5mby4KICAqCUBidWY6IFBvaW50ZXIgdG8gYXJlYSB0byB3cml0ZSBpbmZvcm1hdGlvbgogICoJQHN0YXJ0OiBQb2ludGVyIHRvIHN0YXJ0IHBvaW50ZXIKICAqCUBvZmZzZXQ6IE9mZnNldCB0byBzdGFydCB3cml0aW5nCi0gKglAcmVxdWVzdDoKKyAqCUByZXF1ZXN0OiBBbW91bnQgb2YgcmVhZCBkYXRhIHJlcXVlc3RlZAogICoJQGVvZjogUG9pbnRlciB0byBFT0YgaW50ZWdlcgogICoJQGRhdGE6IFBvaW50ZXIKICAqCkBAIC01NTc3LDE2ICs1NTk0LDE3IEBACiAgKi8KIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qKgotICoJbXB0X0hhcmRSZXNldEhhbmRsZXIgLSBHZW5lcmljIHJlc2V0IGhhbmRsZXIsIGlzc3VlIFNDU0kgVGFzawotICoJTWFuYWdlbWVudCBjYWxsIGJhc2VkIG9uIGlucHV0IGFyZyB2YWx1ZXMuICBJZiBUYXNrTWdtdCBmYWlscywKLSAqCXJldHVybiBhc3NvY2lhdGVkIFNDU0kgcmVxdWVzdC4KKyAqCW1wdF9IYXJkUmVzZXRIYW5kbGVyIC0gR2VuZXJpYyByZXNldCBoYW5kbGVyCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQHNsZWVwRmxhZzogSW5kaWNhdGVzIGlmIHNsZWVwIG9yIHNjaGVkdWxlIG11c3QgYmUgY2FsbGVkLgogICoKKyAqCUlzc3VlcyBTQ1NJIFRhc2sgTWFuYWdlbWVudCBjYWxsIGJhc2VkIG9uIGlucHV0IGFyZyB2YWx1ZXMuCisgKglJZiBUYXNrTWdtdCBmYWlscywgcmV0dXJucyBhc3NvY2lhdGVkIFNDU0kgcmVxdWVzdC4KKyAqCiAgKglSZW1hcms6IF9IYXJkUmVzZXRIYW5kbGVyIGNhbiBiZSBpbnZva2VkIGZyb20gYW4gaW50ZXJydXB0IHRocmVhZCAodGltZXIpCiAgKglvciBhIG5vbi1pbnRlcnJ1cHQgdGhyZWFkLiAgSW4gdGhlIGZvcm1lciwgbXVzdCBub3QgY2FsbCBzY2hlZHVsZSgpLgogICoKLSAqCVJlbWFyazogQSByZXR1cm4gb2YgLTEgaXMgYSBGQVRBTCBlcnJvciBjYXNlLCBhcyBpdCBtZWFucyBhCisgKglOb3RlOiBBIHJldHVybiBvZiAtMSBpcyBhIEZBVEFMIGVycm9yIGNhc2UsIGFzIGl0IG1lYW5zIGEKICAqCUZXIHJlbG9hZC9pbml0aWFsaXphdGlvbiBmYWlsZWQuCiAgKgogICoJUmV0dXJucyAwIGZvciBTVUNDRVNTIG9yIC0xIGlmIEZBSUxFRC4KQEAgLTU5MzUsMTMgKzU5NTMsMTQgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKLSAqCVByb2Nlc3NFdmVudE5vdGlmaWNhdGlvbiAtIFJvdXRlIGEgcmVjZWl2ZWQgRXZlbnROb3RpZmljYXRpb25SZXBseSB0bwotICoJYWxsIGN1cnJlbnRseSByZWdlaXN0ZXJlZCBldmVudCBoYW5kbGVycy4KKy8qKgorICoJUHJvY2Vzc0V2ZW50Tm90aWZpY2F0aW9uIC0gUm91dGUgRXZlbnROb3RpZmljYXRpb25SZXBseSB0byBhbGwgZXZlbnQgaGFuZGxlcnMKICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKglAcEV2ZW50UmVwbHk6IFBvaW50ZXIgdG8gRXZlbnROb3RpZmljYXRpb24gcmVwbHkgZnJhbWUKICAqCUBldkhhbmRsZXJzOiBQb2ludGVyIHRvIGludGVnZXIsIG51bWJlciBvZiBldmVudCBoYW5kbGVycwogICoKKyAqCVJvdXRlcyBhIHJlY2VpdmVkIEV2ZW50Tm90aWZpY2F0aW9uUmVwbHkgdG8gYWxsIGN1cnJlbnRseSByZWdpc3RlcmVkCisgKglldmVudCBoYW5kbGVycy4KICAqCVJldHVybnMgc3VtIG9mIGV2ZW50IGhhbmRsZXJzIHJldHVybiB2YWx1ZXMuCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTYwNTYsNyArNjA3NSw3IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCW1wdF9mY19sb2dfaW5mbyAtIExvZyBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIEZpYnJlIENoYW5uZWwgSU9DLgogICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKICAqCUBsb2dfaW5mbzogVTMyIExvZ0luZm8gcmVwbHkgd29yZCBmcm9tIHRoZSBJT0MKQEAgLTYwNzcsNyArNjA5Niw3IEBACiB9CiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KLS8qCisvKioKICAqCW1wdF9zcGlfbG9nX2luZm8gLSBMb2cgaW5mb3JtYXRpb24gcmV0dXJuZWQgZnJvbSBTQ1NJIFBhcmFsbGVsIElPQy4KICAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCiAgKglAbXI6IFBvaW50ZXIgdG8gTVBUIHJlcGx5IGZyYW1lCkBAIC02MTg1LDcgKzYyMDQsNyBAQAogCQkiQWJvcnQiLAkJCQkJLyogMTJoICovCiAJCSJJTyBOb3QgWWV0IEV4ZWN1dGVkIiwJCQkJLyogMTNoICovCiAJCSJJTyBFeGVjdXRlZCIsCQkJCQkvKiAxNGggKi8KLQkJIlBlcnNpc3RhbnQgUmVzZXJ2YXRpb24gT3V0IE5vdCBBZmZpbGlhdGlvbiBPd25lciIsIC8qIDE1aCAqLworCQkiUGVyc2lzdGVudCBSZXNlcnZhdGlvbiBPdXQgTm90IEFmZmlsaWF0aW9uIE93bmVyIiwgLyogMTVoICovCiAJCSJPcGVuIFRyYW5zbWl0IERNQSBBYm9ydCIsCQkJLyogMTZoICovCiAJCSJJTyBEZXZpY2UgTWlzc2luZyBEZWxheSBSZXRyeSIsCQkvKiAxN2ggKi8KIAkJTlVMTCwJCQkJCQkvKiAxOGggKi8KQEAgLTYyMDAsNyArNjIxOSw3IEBACiAJfTsKIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJbXB0X3Nhc19sb2dfaW5mbyAtIExvZyBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIFNBUyBJT0MuCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQGxvZ19pbmZvOiBVMzIgTG9nSW5mbyByZXBseSB3b3JkIGZyb20gdGhlIElPQwpAQCAtNjI1NSw3ICs2Mjc0LDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJbXB0X3NwX2lvY19pbmZvIC0gSU9DIGluZm9ybWF0aW9uIHJldHVybmVkIGZyb20gU0NTSSBQYXJhbGxlbCBJT0MuCiAgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQogICoJQGlvY19zdGF0dXM6IFUzMiBJT0NTdGF0dXMgd29yZCBmcm9tIElPQwpAQCAtNjQxNiw3ICs2NDM1LDcgQEAKIEVYUE9SVF9TWU1CT0wobXB0YmFzZV9zYXNfcGVyc2lzdF9vcGVyYXRpb24pOwogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi0vKgorLyoqCiAgKglmdXNpb25faW5pdCAtIEZ1c2lvbiBNUFQgYmFzZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gcm91dGluZS4KICAqCiAgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgpAQCAtNjQ1Niw3ICs2NDc1LDcgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotLyoKKy8qKgogICoJZnVzaW9uX2V4aXQgLSBQZXJmb3JtIGRyaXZlciB1bmxvYWQgY2xlYW51cC4KICAqCiAgKglUaGlzIHJvdXRpbmUgZnJlZXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBNUFQgYWRhcHRlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAppbmRleCBjNTM3ZDcxLi5hNGFmYWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaApAQCAtNzUsOCArNzUsOCBAQAogI2RlZmluZSBDT1BZUklHSFQJIkNvcHlyaWdodCAoYykgMTk5OS0yMDA1ICIgTU9EVUxFQVVUSE9SCiAjZW5kaWYKIAotI2RlZmluZSBNUFRfTElOVVhfVkVSU0lPTl9DT01NT04JIjMuMDQuMDEiCi0jZGVmaW5lIE1QVF9MSU5VWF9QQUNLQUdFX05BTUUJCSJAKCMpbXB0bGludXgtMy4wNC4wMSIKKyNkZWZpbmUgTVBUX0xJTlVYX1ZFUlNJT05fQ09NTU9OCSIzLjA0LjAyIgorI2RlZmluZSBNUFRfTElOVVhfUEFDS0FHRV9OQU1FCQkiQCgjKW1wdGxpbnV4LTMuMDQuMDIiCiAjZGVmaW5lIFdIQVRfTUFHSUNfU1RSSU5HCQkiQCIgIigiICIjIiAiKSIKIAogI2RlZmluZSBzaG93X21wdG1vZF92ZXIocyx2ZXIpICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKaW5kZXggZTU3YmIwMy4uY2EyZjkxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwpAQCAtOTYsNiArOTYsMTAgQEAKIHN0YXRpYyB2b2lkIG1wdGZjX3RhcmdldF9kZXN0cm95KHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCk7CiBzdGF0aWMgdm9pZCBtcHRmY19zZXRfcnBvcnRfbG9zc190bW8oc3RydWN0IGZjX3Jwb3J0ICpycG9ydCwgdWludDMyX3QgdGltZW91dCk7CiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgbXB0ZmNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgbXB0ZmNfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCBtcHRmY19kZXZfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCBtcHRmY19idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCBtcHRmY19ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbXB0ZmNfZHJpdmVyX3RlbXBsYXRlID0gewogCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKQEAgLTExMCwxMCArMTE0LDEwIEBACiAJLnRhcmdldF9kZXN0cm95CQkJPSBtcHRmY190YXJnZXRfZGVzdHJveSwKIAkuc2xhdmVfZGVzdHJveQkJCT0gbXB0c2NzaWhfc2xhdmVfZGVzdHJveSwKIAkuY2hhbmdlX3F1ZXVlX2RlcHRoIAkJPSBtcHRzY3NpaF9jaGFuZ2VfcXVldWVfZGVwdGgsCi0JLmVoX2Fib3J0X2hhbmRsZXIJCT0gbXB0c2NzaWhfYWJvcnQsCi0JLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gbXB0c2NzaWhfZGV2X3Jlc2V0LAotCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBtcHRzY3NpaF9idXNfcmVzZXQsCi0JLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBtcHRzY3NpaF9ob3N0X3Jlc2V0LAorCS5laF9hYm9ydF9oYW5kbGVyCQk9IG1wdGZjX2Fib3J0LAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlcgk9IG1wdGZjX2Rldl9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gbXB0ZmNfYnVzX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIJCT0gbXB0ZmNfaG9zdF9yZXNldCwKIAkuYmlvc19wYXJhbQkJCT0gbXB0c2NzaWhfYmlvc19wYXJhbSwKIAkuY2FuX3F1ZXVlCQkJPSBNUFRfRkNfQ0FOX1FVRVVFLAogCS50aGlzX2lkCQkJPSAtMSwKQEAgLTE3MSw2ICsxNzUsNzcgQEAKIAkuc2hvd19ob3N0X3N5bWJvbGljX25hbWUgPSAxLAogfTsKIAorc3RhdGljIGludAorbXB0ZmNfYmxvY2tfZXJyb3JfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCSAgaW50ICgqZnVuYykoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpLAorCQkJICBjb25zdCBjaGFyICpjYWxsZXIpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlCSpzZGV2ID0gU0NwbnQtPmRldmljZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpzaG9zdCA9IHNkZXYtPmhvc3Q7CisJc3RydWN0IGZjX3Jwb3J0CQkqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KHNkZXYpKTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlyZWFkeTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoKHJlYWR5ID0gZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpID4+IDE2KSA9PSBESURfSU1NX1JFVFJZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQlkZmNwcmludGsgKChNWUlPQ19zX0lORk9fRk1UCisJCQkibXB0ZmNfYmxvY2tfZXJyb3JfaGFuZGxlci4lZDogJWQ6JWQsIHBvcnQgc3RhdHVzIGlzICIKKwkJCSJESURfSU1NX1JFVFJZLCBkZWZlcnJpbmcgJXMgcmVjb3ZlcnkuXG4iLAorCQkJKChNUFRfU0NTSV9IT1NUICopIHNob3N0LT5ob3N0ZGF0YSktPmlvYy0+bmFtZSwKKwkJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPnNoLT5ob3N0X25vLAorCQkJU0NwbnQtPmRldmljZS0+aWQsU0NwbnQtPmRldmljZS0+bHVuLGNhbGxlcikpOworCQltc2xlZXAoMTAwMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAocmVhZHkgPT0gRElEX05PX0NPTk5FQ1QgfHwgIVNDcG50LT5kZXZpY2UtPmhvc3RkYXRhKSB7CisJCWRmY3ByaW50ayAoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCSIlcy4lZDogJWQ6JWQsIGZhaWxpbmcgcmVjb3ZlcnksICIKKwkJCSJwb3J0IHN0YXRlICVkLCB2ZGV2ICVwLlxuIiwgY2FsbGVyLAorCQkJKChNUFRfU0NTSV9IT1NUICopIHNob3N0LT5ob3N0ZGF0YSktPmlvYy0+bmFtZSwKKwkJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPnNoLT5ob3N0X25vLAorCQkJU0NwbnQtPmRldmljZS0+aWQsU0NwbnQtPmRldmljZS0+bHVuLHJlYWR5LAorCQkJU0NwbnQtPmRldmljZS0+aG9zdGRhdGEpKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJZGZjcHJpbnRrICgoTVlJT0Nfc19JTkZPX0ZNVAorCQkiJXMuJWQ6ICVkOiVkLCBleGVjdXRpbmcgcmVjb3ZlcnkuXG4iLCBjYWxsZXIsCisJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPm5hbWUsCisJCSgoTVBUX1NDU0lfSE9TVCAqKSBzaG9zdC0+aG9zdGRhdGEpLT5pb2MtPnNoLT5ob3N0X25vLAorCQlTQ3BudC0+ZGV2aWNlLT5pZCxTQ3BudC0+ZGV2aWNlLT5sdW4pKTsKKwlyZXR1cm4gKCpmdW5jKShTQ3BudCk7Cit9CisKK3N0YXRpYyBpbnQKK21wdGZjX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXJldHVybgorCSAgICBtcHRmY19ibG9ja19lcnJvcl9oYW5kbGVyKFNDcG50LCBtcHRzY3NpaF9hYm9ydCwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIGludAorbXB0ZmNfZGV2X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXJldHVybgorCSAgICBtcHRmY19ibG9ja19lcnJvcl9oYW5kbGVyKFNDcG50LCBtcHRzY3NpaF9kZXZfcmVzZXQsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3N0YXRpYyBpbnQKK21wdGZjX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlyZXR1cm4KKwkgICAgbXB0ZmNfYmxvY2tfZXJyb3JfaGFuZGxlcihTQ3BudCwgbXB0c2NzaWhfYnVzX3Jlc2V0LCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgaW50CittcHRmY19ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXJldHVybgorCSAgICBtcHRmY19ibG9ja19lcnJvcl9oYW5kbGVyKFNDcG50LCBtcHRzY3NpaF9ob3N0X3Jlc2V0LCBfX0ZVTkNUSU9OX18pOworfQorCiBzdGF0aWMgdm9pZAogbXB0ZmNfc2V0X3Jwb3J0X2xvc3NfdG1vKHN0cnVjdCBmY19ycG9ydCAqcnBvcnQsIHVpbnQzMl90IHRpbWVvdXQpCiB7CkBAIC01NjIsNiArNjM3LDEyIEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmICghU0NwbnQtPmRldmljZS0+aG9zdGRhdGEpIHsJLyogdmRldiAqLworCQlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWRvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBkZF9kYXRhIGlzIG51bGwgdW50aWwgZmluaXNoZWQgYWRkaW5nIHRhcmdldCAqLwogCXJpID0gKigoc3RydWN0IG1wdGZjX3Jwb3J0X2luZm8gKiopcnBvcnQtPmRkX2RhdGEpOwogCWlmICh1bmxpa2VseSghcmkpKSB7CkBAIC05MzcsOSArMTAxOCwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotbXB0ZmNfc2V0dXBfcmVzZXQodm9pZCAqYXJnKQorbXB0ZmNfc2V0dXBfcmVzZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCU1QVF9BREFQVEVSCQkqaW9jID0gKE1QVF9BREFQVEVSICopYXJnOworCU1QVF9BREFQVEVSCQkqaW9jID0KKwkJY29udGFpbmVyX29mKHdvcmssIE1QVF9BREFQVEVSLCBmY19zZXR1cF9yZXNldF93b3JrKTsKIAl1NjQJCQlwbjsKIAlzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqcmk7CiAKQEAgLTk2Miw5ICsxMDQ0LDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1tcHRmY19yZXNjYW5fZGV2aWNlcyh2b2lkICphcmcpCittcHRmY19yZXNjYW5fZGV2aWNlcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JTVBUX0FEQVBURVIJCSppb2MgPSAoTVBUX0FEQVBURVIgKilhcmc7CisJTVBUX0FEQVBURVIJCSppb2MgPQorCQljb250YWluZXJfb2Yod29yaywgTVBUX0FEQVBURVIsIGZjX3Jlc2Nhbl93b3JrKTsKIAlpbnQJCQlpaTsKIAl1NjQJCQlwbjsKIAlzdHJ1Y3QgbXB0ZmNfcnBvcnRfaW5mbyAqcmk7CkBAIC0xMDczLDggKzExNTYsOCBAQAogICAgICAgICB9CiAKIAlzcGluX2xvY2tfaW5pdCgmaW9jLT5mY19yZXNjYW5fd29ya19sb2NrKTsKLQlJTklUX1dPUksoJmlvYy0+ZmNfcmVzY2FuX3dvcmssIG1wdGZjX3Jlc2Nhbl9kZXZpY2VzLCh2b2lkICopaW9jKTsKLQlJTklUX1dPUksoJmlvYy0+ZmNfc2V0dXBfcmVzZXRfd29yaywgbXB0ZmNfc2V0dXBfcmVzZXQsICh2b2lkICopaW9jKTsKKwlJTklUX1dPUksoJmlvYy0+ZmNfcmVzY2FuX3dvcmssIG1wdGZjX3Jlc2Nhbl9kZXZpY2VzKTsKKwlJTklUX1dPUksoJmlvYy0+ZmNfc2V0dXBfcmVzZXRfd29yaywgbXB0ZmNfc2V0dXBfcmVzZXQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CiAKQEAgLTEzMTIsOCArMTM5NSw3IEBACiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qKgotICoJbXB0ZmNfaW5pdCAtIFJlZ2lzdGVyIE1QVCBhZGFwdGVyKHMpIGFzIFNDU0kgaG9zdChzKSB3aXRoCi0gKglsaW51eCBzY3NpIG1pZC1sYXllci4KKyAqCW1wdGZjX2luaXQgLSBSZWdpc3RlciBNUFQgYWRhcHRlcihzKSBhcyBTQ1NJIGhvc3Qocykgd2l0aCBTQ1NJIG1pZC1sYXllci4KICAqCiAgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCkBAIC0xMzU3LDcgKzE0MzksNyBAQAogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAvKioKLSAqCW1wdGZjX3JlbW92ZSAtIFJlbW92ZWQgZmMgaW5mcmFzdHJ1Y3R1cmUgZm9yIGRldmljZXMKKyAqCW1wdGZjX3JlbW92ZSAtIFJlbW92ZSBmYyBpbmZyYXN0cnVjdHVyZSBmb3IgZGV2aWNlcwogICoJQHBkZXY6IFBvaW50ZXIgdG8gcGNpX2RldiBzdHJ1Y3R1cmUKICAqCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCmluZGV4IDMxNGMzYTIuLmI3YzQ0MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwpAQCAtMTExLDcgKzExMSw4IEBACiAJdTMyIHRvdGFsX3JlY2VpdmVkOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBQZXIgZGV2aWNlIHN0YXRpc3RpY3MgKi8KIAotCXN0cnVjdCB3b3JrX3N0cnVjdCBwb3N0X2J1Y2tldHNfdGFzazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHBvc3RfYnVja2V0c190YXNrOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJdW5zaWduZWQgbG9uZyBwb3N0X2J1Y2tldHNfYWN0aXZlOwogfTsKIApAQCAtMTMyLDcgKzEzMyw3IEBACiBzdGF0aWMgaW50ICBtcHRfbGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICBtcHRfbGFuX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAgbXB0X2xhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIG1wdF9sYW5fcG9zdF9yZWNlaXZlX2J1Y2tldHModm9pZCAqZGV2X2lkKTsKK3N0YXRpYyB2b2lkIG1wdF9sYW5fcG9zdF9yZWNlaXZlX2J1Y2tldHMoc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdik7CiBzdGF0aWMgdm9pZCBtcHRfbGFuX3dha2VfcG9zdF9idWNrZXRzX3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICAgaW50IHByaW9yaXR5KTsKIHN0YXRpYyBpbnQgIG1wdF9sYW5fcmVjZWl2ZV9wb3N0X3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0bXNnKTsKQEAgLTM0NSw3ICszNDYsNyBAQAogCQkJcHJpdi0+bXB0X3J4ZmlkeFsrK3ByaXYtPm1wdF9yeGZpZHhfdGFpbF0gPSBpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeGZpZHhfbG9jaywgZmxhZ3MpOwogCX0gZWxzZSB7Ci0JCW1wdF9sYW5fcG9zdF9yZWNlaXZlX2J1Y2tldHMoZGV2KTsKKwkJbXB0X2xhbl9wb3N0X3JlY2VpdmVfYnVja2V0cyhwcml2KTsKIAkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogCX0KIApAQCAtNDQxLDcgKzQ0Miw3IEBACiAKIAlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICIvbG86IEZpbmlzaGVkIGluaXRpYWxpemluZyBSY3ZDdGxcbiIpKTsKIAotCW1wdF9sYW5fcG9zdF9yZWNlaXZlX2J1Y2tldHMoZGV2KTsKKwltcHRfbGFuX3Bvc3RfcmVjZWl2ZV9idWNrZXRzKHByaXYpOwogCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogJXMvJXM6IGludGVyZmFjZSB1cCAmIGFjdGl2ZVxuIiwKIAkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpKTsKIApAQCAtODU0LDcgKzg1NSw3IEBACiAJCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnByaXYtPnBvc3RfYnVja2V0c19hY3RpdmUpID09IDApIHsKIAkJaWYgKHByaW9yaXR5KSB7Ci0JCQlzY2hlZHVsZV93b3JrKCZwcml2LT5wb3N0X2J1Y2tldHNfdGFzayk7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPnBvc3RfYnVja2V0c190YXNrLCAwKTsKIAkJfSBlbHNlIHsKIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+cG9zdF9idWNrZXRzX3Rhc2ssIDEpOwogCQkJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogcG9zdF9idWNrZXRzIHF1ZXVlZCBvbiAiCkBAIC0xMTg4LDEwICsxMTg5LDkgQEAKIC8qIFNpbXBsZSBTR0UncyBvbmx5IGF0IHRoZSBtb21lbnQgKi8KIAogc3RhdGljIHZvaWQKLW1wdF9sYW5fcG9zdF9yZWNlaXZlX2J1Y2tldHModm9pZCAqZGV2X2lkKQorbXB0X2xhbl9wb3N0X3JlY2VpdmVfYnVja2V0cyhzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7Ci0Jc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+ZGV2OwogCU1QVF9BREFQVEVSICptcHRfZGV2ID0gcHJpdi0+bXB0X2RldjsKIAlNUFRfRlJBTUVfSERSICptZjsKIAlMQU5SZWNlaXZlUG9zdFJlcXVlc3RfdCAqcFJlY3ZSZXE7CkBAIC0xMzM1LDYgKzEzMzUsMTMgQEAKIAljbGVhcl9iaXQoMCwgJnByaXYtPnBvc3RfYnVja2V0c19hY3RpdmUpOwogfQogCitzdGF0aWMgdm9pZAorbXB0X2xhbl9wb3N0X3JlY2VpdmVfYnVja2V0c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwltcHRfbGFuX3Bvc3RfcmVjZWl2ZV9idWNrZXRzKGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXB0X2xhbl9wcml2LAorCQkJCQkJICBwb3N0X2J1Y2tldHNfdGFzay53b3JrKSk7Cit9CisKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqCiBtcHRfcmVnaXN0ZXJfbGFuX2RldmljZSAoTVBUX0FEQVBURVIgKm1wdF9kZXYsIGludCBwbnVtKQpAQCAtMTM1MCwxMSArMTM1NywxMyBAQAogCiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKKwlwcml2LT5kZXYgPSBkZXY7CiAJcHJpdi0+bXB0X2RldiA9IG1wdF9kZXY7CiAJcHJpdi0+cG51bSA9IHBudW07CiAKLQltZW1zZXQoJnByaXYtPnBvc3RfYnVja2V0c190YXNrLCAwLCBzaXplb2Yoc3RydWN0IHdvcmtfc3RydWN0KSk7Ci0JSU5JVF9XT1JLKCZwcml2LT5wb3N0X2J1Y2tldHNfdGFzaywgbXB0X2xhbl9wb3N0X3JlY2VpdmVfYnVja2V0cywgZGV2KTsKKwltZW1zZXQoJnByaXYtPnBvc3RfYnVja2V0c190YXNrLCAwLCBzaXplb2YocHJpdi0+cG9zdF9idWNrZXRzX3Rhc2spKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+cG9zdF9idWNrZXRzX3Rhc2ssCisJCQkgIG1wdF9sYW5fcG9zdF9yZWNlaXZlX2J1Y2tldHNfd29yayk7CiAJcHJpdi0+cG9zdF9idWNrZXRzX2FjdGl2ZSA9IDA7CiAKIAlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICJAJWQ6IGJ1Y2tldGxlbiA9ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKaW5kZXggYjc1MmE0Ny4uNGYwYzUzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCkBAIC0yMDA2LDkgKzIwMDYsMTAgQEAKICAqKE11dGV4IExPQ0tFRCkKICAqLwogc3RhdGljIHZvaWQKLW1wdHNhc19kaXNjb3Zlcnlfd29yayh2b2lkICogYXJnKQorbXB0c2FzX2Rpc2NvdmVyeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbXB0c2FzX2Rpc2NvdmVyeV9ldmVudCAqZXYgPSBhcmc7CisJc3RydWN0IG1wdHNhc19kaXNjb3ZlcnlfZXZlbnQgKmV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtcHRzYXNfZGlzY292ZXJ5X2V2ZW50LCB3b3JrKTsKIAlNUFRfQURBUFRFUiAqaW9jID0gZXYtPmlvYzsKIAogCW11dGV4X2xvY2soJmlvYy0+c2FzX2Rpc2NvdmVyeV9tdXRleCk7CkBAIC0yMDY4LDkgKzIwNjksOSBAQAogICogV29yayBxdWV1ZSB0aHJlYWQgdG8gY2xlYXIgdGhlIHBlcnNpdGVuY3kgdGFibGUKICAqLwogc3RhdGljIHZvaWQKLW1wdHNhc19wZXJzaXN0X2NsZWFyX3RhYmxlKHZvaWQgKiBhcmcpCittcHRzYXNfcGVyc2lzdF9jbGVhcl90YWJsZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JTVBUX0FEQVBURVIgKmlvYyA9IChNUFRfQURBUFRFUiAqKWFyZzsKKwlNUFRfQURBUFRFUiAqaW9jID0gY29udGFpbmVyX29mKHdvcmssIE1QVF9BREFQVEVSLCBzYXNfcGVyc2lzdF90YXNrKTsKIAogCW1wdGJhc2Vfc2FzX3BlcnNpc3Rfb3BlcmF0aW9uKGlvYywgTVBJX1NBU19PUF9DTEVBUl9OT1RfUFJFU0VOVCk7CiB9CkBAIC0yMDkzLDkgKzIwOTQsMTAgQEAKICAqIFdvcmsgcXVldWUgdGhyZWFkIHRvIGhhbmRsZSBTQVMgaG90cGx1ZyBldmVudHMKICAqLwogc3RhdGljIHZvaWQKLW1wdHNhc19ob3RwbHVnX3dvcmsodm9pZCAqYXJnKQorbXB0c2FzX2hvdHBsdWdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG1wdHNhc19ob3RwbHVnX2V2ZW50ICpldiA9IGFyZzsKKwlzdHJ1Y3QgbXB0c2FzX2hvdHBsdWdfZXZlbnQgKmV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtcHRzYXNfaG90cGx1Z19ldmVudCwgd29yayk7CiAJTVBUX0FEQVBURVIgKmlvYyA9IGV2LT5pb2M7CiAJc3RydWN0IG1wdHNhc19waHlpbmZvICpwaHlfaW5mbzsKIAlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHk7CkBAIC0yMzQxLDcgKzIzNDMsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlJTklUX1dPUksoJmV2LT53b3JrLCBtcHRzYXNfaG90cGx1Z193b3JrLCBldik7CisJCUlOSVRfV09SSygmZXYtPndvcmssIG1wdHNhc19ob3RwbHVnX3dvcmspOwogCQlldi0+aW9jID0gaW9jOwogCQlldi0+aGFuZGxlID0gbGUxNl90b19jcHUoc2FzX2V2ZW50X2RhdGEtPkRldkhhbmRsZSk7CiAJCWV2LT5wYXJlbnRfaGFuZGxlID0KQEAgLTIzNjYsNyArMjM2OCw3IEBACiAJICogUGVyc2lzdGVudCB0YWJsZSBpcyBmdWxsLgogCSAqLwogCQlJTklUX1dPUksoJmlvYy0+c2FzX3BlcnNpc3RfdGFzaywKLQkJICAgIG1wdHNhc19wZXJzaXN0X2NsZWFyX3RhYmxlLCAodm9pZCAqKWlvYyk7CisJCSAgICBtcHRzYXNfcGVyc2lzdF9jbGVhcl90YWJsZSk7CiAJCXNjaGVkdWxlX3dvcmsoJmlvYy0+c2FzX3BlcnNpc3RfdGFzayk7CiAJCWJyZWFrOwogCWNhc2UgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19TTUFSVF9EQVRBOgpAQCAtMjM5NSw3ICsyMzk3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCUlOSVRfV09SSygmZXYtPndvcmssIG1wdHNhc19ob3RwbHVnX3dvcmssIGV2KTsKKwlJTklUX1dPUksoJmV2LT53b3JrLCBtcHRzYXNfaG90cGx1Z193b3JrKTsKIAlldi0+aW9jID0gaW9jOwogCWV2LT5pZCA9IHJhaWRfZXZlbnRfZGF0YS0+Vm9sdW1lSUQ7CiAJZXYtPmV2ZW50X3R5cGUgPSBNUFRTQVNfSUdOT1JFX0VWRU5UOwpAQCAtMjQ3NCw3ICsyNDc2LDcgQEAKIAlldiA9IGt6YWxsb2Moc2l6ZW9mKCpldiksIEdGUF9BVE9NSUMpOwogCWlmICghZXYpCiAJCXJldHVybjsKLQlJTklUX1dPUksoJmV2LT53b3JrLCBtcHRzYXNfZGlzY292ZXJ5X3dvcmssIGV2KTsKKwlJTklUX1dPUksoJmV2LT53b3JrLCBtcHRzYXNfZGlzY292ZXJ5X3dvcmspOwogCWV2LT5pb2MgPSBpb2M7CiAJc2NoZWR1bGVfd29yaygmZXYtPndvcmspOwogfTsKQEAgLTI1MTEsOCArMjUxMyw3IEBACiAJCWJyZWFrOwogCWNhc2UgTVBJX0VWRU5UX1BFUlNJU1RFTlRfVEFCTEVfRlVMTDoKIAkJSU5JVF9XT1JLKCZpb2MtPnNhc19wZXJzaXN0X3Rhc2ssCi0JCSAgICBtcHRzYXNfcGVyc2lzdF9jbGVhcl90YWJsZSwKLQkJICAgICh2b2lkICopaW9jKTsKKwkJICAgIG1wdHNhc19wZXJzaXN0X2NsZWFyX3RhYmxlKTsKIAkJc2NoZWR1bGVfd29yaygmaW9jLT5zYXNfcGVyc2lzdF90YXNrKTsKIAkJYnJlYWs7CiAJIGNhc2UgTVBJX0VWRU5UX1NBU19ESVNDT1ZFUlk6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKaW5kZXggMzA1MjRkYy4uMmM3MmMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpAQCAtMTIzMCwxNSArMTIzMCwxNSBAQAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogLyoqCiAgKgltcHRzY3NpaF9wcm9jX2luZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgTVBUIGFkYXB0ZXIKKyAqIAlAaG9zdDogICBzY3NpIGhvc3Qgc3RydWN0CisgKiAJQGJ1ZmZlcjogaWYgd3JpdGUsIHVzZXIgZGF0YTsgaWYgcmVhZCwgYnVmZmVyIGZvciB1c2VyCisgKglAc3RhcnQ6IHJldHVybnMgdGhlIGJ1ZmZlciBhZGRyZXNzCisgKiAJQG9mZnNldDogaWYgd3JpdGUsIDA7IGlmIHJlYWQsIHRoZSBjdXJyZW50IG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZnJvbQorICogCQkgdGhlIHByZXZpb3VzIHJlYWQuCisgKiAJQGxlbmd0aDogaWYgd3JpdGUsIHJldHVybiBsZW5ndGg7CisgKglAZnVuYzogICB3cml0ZSA9IDE7IHJlYWQgPSAwCiAgKgogICoJKGxpbnV4IHNjc2lfaG9zdF90ZW1wbGF0ZS5pbmZvIHJvdXRpbmUpCi0gKgotICogCWJ1ZmZlcjogaWYgd3JpdGUsIHVzZXIgZGF0YTsgaWYgcmVhZCwgYnVmZmVyIGZvciB1c2VyCi0gKiAJbGVuZ3RoOiBpZiB3cml0ZSwgcmV0dXJuIGxlbmd0aDsKLSAqIAlvZmZzZXQ6IGlmIHdyaXRlLCAwOyBpZiByZWFkLCB0aGUgY3VycmVudCBvZmZzZXQgaW50byB0aGUgYnVmZmVyIGZyb20KLSAqIAkJdGhlIHByZXZpb3VzIHJlYWQuCi0gKiAJaG9zdG5vOiBzY3NpIGhvc3QgbnVtYmVyCi0gKglmdW5jOiAgIGlmIHdyaXRlID0gMTsgaWYgcmVhZCA9IDAKICAqLwogaW50CiBtcHRzY3NpaF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKQEAgLTE5MDIsOCArMTkwMiw3IEBACiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qKgotICoJbXB0c2NzaWhfaG9zdF9yZXNldCAtIFBlcmZvcm0gYSBTQ1NJIGhvc3QgYWRhcHRlciBSRVNFVCEKLSAqCW5ld19laCB2YXJpYW50CisgKgltcHRzY3NpaF9ob3N0X3Jlc2V0IC0gUGVyZm9ybSBhIFNDU0kgaG9zdCBhZGFwdGVyIFJFU0VUIChuZXdfZWggdmFyaWFudCkKICAqCUBTQ3BudDogUG9pbnRlciB0byBzY3NpX2NtbmQgc3RydWN0dXJlLCBJTyB3aGljaCByZXNldCBpcyBkdWUgdG8KICAqCiAgKgkobGludXggc2NzaV9ob3N0X3RlbXBsYXRlLmVoX2hvc3RfcmVzZXRfaGFuZGxlciByb3V0aW5lKQpAQCAtMTk0OSw4ICsxOTQ4LDcgQEAKIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogLyoqCi0gKgltcHRzY3NpaF90bV9wZW5kaW5nX3dhaXQgLSB3YWl0IGZvciBwZW5kaW5nIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IHRvCi0gKgkJY29tcGxldGUuCisgKgltcHRzY3NpaF90bV9wZW5kaW5nX3dhaXQgLSB3YWl0IGZvciBwZW5kaW5nIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IHRvIGNvbXBsZXRlCiAgKglAaGQ6IFBvaW50ZXIgdG8gTVBUIGhvc3Qgc3RydWN0dXJlLgogICoKICAqCVJldHVybnMge1NVQ0NFU1MsRkFJTEVEfS4KQEAgLTE5ODIsNiArMTk4MCw3IEBACiAvKioKICAqCW1wdHNjc2loX3RtX3dhaXRfZm9yX2NvbXBsZXRpb24gLSB3YWl0IGZvciBjb21wbGV0aW9uIG9mIFRNIHRhc2sKICAqCUBoZDogUG9pbnRlciB0byBNUFQgaG9zdCBzdHJ1Y3R1cmUuCisgKglAdGltZW91dDogdGltZW91dCBpbiBzZWNvbmRzCiAgKgogICoJUmV0dXJucyB7U1VDQ0VTUyxGQUlMRUR9LgogICovCkBAIC0zNDI5LDggKzM0MjgsNyBAQAogLyoqCiAgKgltcHRzY3NpaF9zeW5jaHJvbml6ZV9jYWNoZSAtIFNlbmQgU1lOQ0hST05JWkVfQ0FDSEUgdG8gYWxsIGRpc2tzLgogICoJQGhkOiBQb2ludGVyIHRvIGEgU0NTSSBIT1NUIHN0cnVjdHVyZQotICoJQHZ0YXJnZXQ6IHBlciBkZXZpY2UgcHJpdmF0ZSBkYXRhCi0gKglAbHVuOiBsdW4KKyAqCUB2ZGV2aWNlOiB2aXJ0dWFsIHRhcmdldCBkZXZpY2UKICAqCiAgKglVc2VzIHRoZSBJU1IsIGJ1dCB3aXRoIHNwZWNpYWwgcHJvY2Vzc2luZy4KICAqCU1VU1QgYmUgc2luZ2xlLXRocmVhZGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKaW5kZXggZTRjYzNkZC4uMzY2NDFkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCkBAIC02NDYsOSArNjQ2LDEwIEBACiAJaW50CQkJZGlzazsKIH07CiAKLXN0YXRpYyB2b2lkIG1wdF93b3JrX3dyYXBwZXIodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIG1wdF93b3JrX3dyYXBwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB3b3JrX3F1ZXVlX3dyYXBwZXIgKndxdyA9IChzdHJ1Y3Qgd29ya19xdWV1ZV93cmFwcGVyICopZGF0YTsKKwlzdHJ1Y3Qgd29ya19xdWV1ZV93cmFwcGVyICp3cXcgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHdvcmtfcXVldWVfd3JhcHBlciwgd29yayk7CiAJc3RydWN0IF9NUFRfU0NTSV9IT1NUICpoZCA9IHdxdy0+aGQ7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBoZC0+aW9jLT5zaDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CkBAIC02OTUsNyArNjk2LDcgQEAKIAkJCSAgIGRpc2spOwogCQlyZXR1cm47CiAJfQotCUlOSVRfV09SSygmd3F3LT53b3JrLCBtcHRfd29ya193cmFwcGVyLCB3cXcpOworCUlOSVRfV09SSygmd3F3LT53b3JrLCBtcHRfd29ya193cmFwcGVyKTsKIAl3cXctPmhkID0gaGQ7CiAJd3F3LT5kaXNrID0gZGlzazsKIApAQCAtNzg0LDkgKzc4NSwxMCBAQAogICogcmVuZWdvdGlhdGUgZm9yIGEgZ2l2ZW4gdGFyZ2V0CiAgKi8KIHN0YXRpYyB2b2lkCi1tcHRzcGlfZHZfcmVuZWdvdGlhdGVfd29yayh2b2lkICpkYXRhKQorbXB0c3BpX2R2X3JlbmVnb3RpYXRlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB3b3JrX3F1ZXVlX3dyYXBwZXIgKndxdyA9IChzdHJ1Y3Qgd29ya19xdWV1ZV93cmFwcGVyICopZGF0YTsKKwlzdHJ1Y3Qgd29ya19xdWV1ZV93cmFwcGVyICp3cXcgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHdvcmtfcXVldWVfd3JhcHBlciwgd29yayk7CiAJc3RydWN0IF9NUFRfU0NTSV9IT1NUICpoZCA9IHdxdy0+aGQ7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCkBAIC04MDQsNyArODA2LDcgQEAKIAlpZiAoIXdxdykKIAkJcmV0dXJuOwogCi0JSU5JVF9XT1JLKCZ3cXctPndvcmssIG1wdHNwaV9kdl9yZW5lZ290aWF0ZV93b3JrLCB3cXcpOworCUlOSVRfV09SSygmd3F3LT53b3JrLCBtcHRzcGlfZHZfcmVuZWdvdGlhdGVfd29yayk7CiAJd3F3LT5oZCA9IGhkOwogCiAJc2NoZWR1bGVfd29yaygmd3F3LT53b3JrKTsKQEAgLTEwOTgsOCArMTEwMCw3IEBACiAKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qKgotICoJbXB0c3BpX2luaXQgLSBSZWdpc3RlciBNUFQgYWRhcHRlcihzKSBhcyBTQ1NJIGhvc3Qocykgd2l0aAotICoJbGludXggc2NzaSBtaWQtbGF5ZXIuCisgKgltcHRzcGlfaW5pdCAtIFJlZ2lzdGVyIE1QVCBhZGFwdGVyKHMpIGFzIFNDU0kgaG9zdChzKSB3aXRoIFNDU0kgbWlkLWxheWVyLgogICoKICAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAgKi8KQEAgLTExMzMsNyArMTEzNCw2IEBACiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAvKioKICAqCW1wdHNwaV9leGl0IC0gVW5yZWdpc3RlcnMgTVBUIGFkYXB0ZXIocykKLSAqCiAgKi8KIHN0YXRpYyB2b2lkIF9fZXhpdAogbXB0c3BpX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vYnVzLW9zbS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9idXMtb3NtLmMKaW5kZXggYWMwNmYxMC4uYzQ2M2RjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9idXMtb3NtLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9idXMtb3NtLmMKQEAgLTU2LDYgKzU2LDkgQEAKIC8qKgogICoJaTJvX2J1c19zdG9yZV9zY2FuIC0gU2NhbiB0aGUgSTJPIEJ1cyBBZGFwdGVyCiAgKglAZDogZGV2aWNlIHdoaWNoIHNob3VsZCBiZSBzY2FubmVkCisgKglAYXR0cjogZGV2aWNlX2F0dHJpYnV0ZQorICoJQGJ1Zjogb3V0cHV0IGJ1ZmZlcgorICoJQGNvdW50OiBidWZmZXIgc2l6ZQogICoKICAqCVJldHVybnMgY291bnQuCiAgKi8KQEAgLTgwLDE4ICs4MywyNiBAQAogICoJQGRldjogZGV2aWNlIHRvIHZlcmlmeSBpZiBpdCBpcyBhIEkyTyBCdXMgQWRhcHRlciBkZXZpY2UKICAqCiAgKglCZWNhdXNlIHdlIHdhbnQgYWxsIEJ1cyBBZGFwdGVycyBhbHdheXMgcmV0dXJuIDAuCisgKglFeGNlcHQgd2hlbiB3ZSBmYWlsLiAgVGhlbiB3ZSBhcmUgc2FkLgogICoKLSAqCVJldHVybnMgMC4KKyAqCVJldHVybnMgMCwgZXhjZXB0IHdoZW4gd2UgZmFpbCB0byBleGNlbC4KICAqLwogc3RhdGljIGludCBpMm9fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZ2V0X2RldmljZShkZXYpKTsKKwlpbnQgcmM7CiAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc2Nhbik7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc2Nhbik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CiAKIAlvc21faW5mbygiZGV2aWNlIGFkZGVkIChUSUQ6ICUwM3gpXG4iLCBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOwogCiAJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJcHV0X2RldmljZShkZXYpOworCXJldHVybiByYzsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9jb3JlLmggYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2NvcmUuaAppbmRleCBkYzM4OGEzLi5jYmUzODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2NvcmUuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2NvcmUuaApAQCAtMTgsNyArMTgsNyBAQAogZXh0ZXJuIGludCBpMm9fZXhlY19sY3RfZ2V0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqKTsKIAogZXh0ZXJuIGludCBfX2luaXQgaTJvX2V4ZWNfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIF9fZXhpdCBpMm9fZXhlY19leGl0KHZvaWQpOworZXh0ZXJuIHZvaWQgaTJvX2V4ZWNfZXhpdCh2b2lkKTsKIAogLyogZHJpdmVyICovCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIGkyb19idXNfdHlwZTsKQEAgLTI2LDcgKzI2LDcgQEAKIGV4dGVybiBpbnQgaTJvX2RyaXZlcl9kaXNwYXRjaChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKiwgdTMyKTsKIAogZXh0ZXJuIGludCBfX2luaXQgaTJvX2RyaXZlcl9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgX19leGl0IGkyb19kcml2ZXJfZXhpdCh2b2lkKTsKK2V4dGVybiB2b2lkIGkyb19kcml2ZXJfZXhpdCh2b2lkKTsKIAogLyogUENJICovCiBleHRlcm4gaW50IF9faW5pdCBpMm9fcGNpX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwppbmRleCBlZTE4MzA1Li5iOWRmMTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKQEAgLTU0LDggKzU0LDggQEAKICAqCUBkZXY6IEkyTyBkZXZpY2UgdG8gY2xhaW0KICAqCUBkcnY6IEkyTyBkcml2ZXIgd2hpY2ggd2FudHMgdG8gY2xhaW0gdGhlIGRldmljZQogICoKLSAqCURvIHRoZSBsZWcgd29yayB0byBhc3NpZ24gYSBkZXZpY2UgdG8gYSBnaXZlbiBPU00uIElmIHRoZSBjbGFpbSBzdWNjZWVkCi0gKgl0aGUgb3duZXIgb2YgdGhlIHJpbWFyeS4gSWYgdGhlIGF0dGVtcHQgZmFpbHMgYSBuZWdhdGl2ZSBlcnJubyBjb2RlCisgKglEbyB0aGUgbGVnIHdvcmsgdG8gYXNzaWduIGEgZGV2aWNlIHRvIGEgZ2l2ZW4gT1NNLiBJZiB0aGUgY2xhaW0gc3VjY2VlZHMsCisgKgl0aGUgb3duZXIgaXMgdGhlIHByaW1hcnkuIElmIHRoZSBhdHRlbXB0IGZhaWxzIGEgbmVnYXRpdmUgZXJybm8gY29kZQogICoJaXMgcmV0dXJuZWQuIE9uIHN1Y2Nlc3MgemVybyBpcyByZXR1cm5lZC4KICAqLwogaW50IGkyb19kZXZpY2VfY2xhaW0oc3RydWN0IGkyb19kZXZpY2UgKmRldikKQEAgLTIwOCwyNCArMjA4LDIzIEBACiAKIC8qKgogICoJaTJvX2RldmljZV9hZGQgLSBhbGxvY2F0ZSBhIG5ldyBJMk8gZGV2aWNlIGFuZCBhZGQgaXQgdG8gdGhlIElPUAotICoJQGlvcDogSTJPIGNvbnRyb2xsZXIgd2hlcmUgdGhlIGRldmljZSBpcyBvbgorICoJQGM6IEkyTyBjb250cm9sbGVyIHRoYXQgdGhlIGRldmljZSBpcyBvbgogICoJQGVudHJ5OiBMQ1QgZW50cnkgb2YgdGhlIEkyTyBkZXZpY2UKICAqCiAgKglBbGxvY2F0ZSBhIG5ldyBJMk8gZGV2aWNlIGFuZCBpbml0aWFsaXplIGl0IHdpdGggdGhlIExDVCBlbnRyeS4gVGhlCiAgKglkZXZpY2UgaXMgYXBwZW5kZWQgdG8gdGhlIGRldmljZSBsaXN0IG9mIHRoZSBjb250cm9sbGVyLgogICoKLSAqCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBJMk8gZGV2aWNlIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQotICoJb24gZmFpbHVyZS4KKyAqCVJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciBhIC12ZSBlcnJuby4KICAqLwotc3RhdGljIHN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2aWNlX2FkZChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsCi0JCQkJCSBpMm9fbGN0X2VudHJ5ICogZW50cnkpCitzdGF0aWMgaW50IGkyb19kZXZpY2VfYWRkKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgaTJvX2xjdF9lbnRyeSAqZW50cnkpCiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYsICp0bXA7CisJaW50IHJjOwogCiAJaTJvX2RldiA9IGkyb19kZXZpY2VfYWxsb2MoKTsKIAlpZiAoSVNfRVJSKGkyb19kZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaTJvOiB1bmFibGUgdG8gYWxsb2NhdGUgaTJvIGRldmljZVxuIik7Ci0JCXJldHVybiBpMm9fZGV2OworCQlyZXR1cm4gUFRSX0VSUihpMm9fZGV2KTsKIAl9CiAKIAlpMm9fZGV2LT5sY3RfZGF0YSA9ICplbnRyeTsKQEAgLTIzNiw3ICsyMzUsOSBAQAogCWkyb19kZXYtPmlvcCA9IGM7CiAJaTJvX2Rldi0+ZGV2aWNlLnBhcmVudCA9ICZjLT5kZXZpY2U7CiAKLQlkZXZpY2VfcmVnaXN0ZXIoJmkyb19kZXYtPmRldmljZSk7CisJcmMgPSBkZXZpY2VfcmVnaXN0ZXIoJmkyb19kZXYtPmRldmljZSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKIAogCWxpc3RfYWRkX3RhaWwoJmkyb19kZXYtPmxpc3QsICZjLT5kZXZpY2VzKTsKIApAQCAtMjcwLDEyICsyNzEsMTYgQEAKIAogCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyBhZGRlZFxuIiwgaTJvX2Rldi0+ZGV2aWNlLmJ1c19pZCk7CiAKLQlyZXR1cm4gaTJvX2RldjsKKwlyZXR1cm4gMDsKKworZXJyOgorCWtmcmVlKGkyb19kZXYpOworCXJldHVybiByYzsKIH0KIAogLyoqCiAgKglpMm9fZGV2aWNlX3JlbW92ZSAtIHJlbW92ZSBhbiBJMk8gZGV2aWNlIGZyb20gdGhlIEkyTyBjb3JlCi0gKglAZGV2OiBJMk8gZGV2aWNlIHdoaWNoIHNob3VsZCBiZSByZWxlYXNlZAorICoJQGkyb19kZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIHJlbGVhc2VkCiAgKgogICoJSXMgdXNlZCBvbiBJMk8gY29udHJvbGxlciByZW1vdmFsIG9yIExDVCBtb2RpZmljYXRpb24sIHdoZW4gdGhlIGRldmljZQogICoJaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0uIE5vdGUgdGhhdCB0aGUgZGV2aWNlIGNvdWxkIHN0aWxsIGhhbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RyaXZlci5jCmluZGV4IDY0MTMwMjIuLmQzMjM1ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYwpAQCAtMzQsOSArMzQsNyBAQAogc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyICoqaTJvX2RyaXZlcnM7CiAKIC8qKgotICoJaTJvX2J1c19tYXRjaCAtIFRlbGwgaWYgYSBJMk8gZGV2aWNlIGNsYXNzIGlkIG1hdGNoIHRoZSBjbGFzcyBpZHMgb2YKLSAqCQkJdGhlIEkyTyBkcml2ZXIgKE9TTSkKLSAqCisgKglpMm9fYnVzX21hdGNoIC0gVGVsbCBpZiBJMk8gZGV2aWNlIGNsYXNzIGlkIG1hdGNoZXMgdGhlIGNsYXNzIGlkcyBvZiB0aGUgSTJPIGRyaXZlciAoT1NNKQogICoJQGRldjogZGV2aWNlIHdoaWNoIHNob3VsZCBiZSB2ZXJpZmllZAogICoJQGRydjogdGhlIGRyaXZlciB0byBtYXRjaCBhZ2FpbnN0CiAgKgpAQCAtMjMyLDcgKzIzMCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCUlOSVRfV09SSygmZXZ0LT53b3JrLCAodm9pZCAoKikodm9pZCAqKSlkcnYtPmV2ZW50LCBldnQpOworCQlJTklUX1dPUksoJmV2dC0+d29yaywgZHJ2LT5ldmVudCk7CiAJCXF1ZXVlX3dvcmsoZHJ2LT5ldmVudF9xdWV1ZSwgJmV2dC0+d29yayk7CiAJCXJldHVybiAxOwogCX0KQEAgLTI0OCw3ICsyNDYsNyBAQAogCiAvKioKICAqCWkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfYWRkX2FsbCAtIFNlbmQgbm90aWZ5IG9mIGFkZGVkIGNvbnRyb2xsZXIKLSAqCQkJCQkgICAgICAgdG8gYWxsIEkyTyBkcml2ZXJzCisgKglAYzogbmV3bHkgYWRkZWQgY29udHJvbGxlcgogICoKICAqCVNlbmQgbm90aWZpY2F0aW9ucyB0byBhbGwgcmVnaXN0ZXJlZCBkcml2ZXJzIHRoYXQgYSBuZXcgY29udHJvbGxlciB3YXMKICAqCWFkZGVkLgpAQCAtMjY3LDggKzI2NSw4IEBACiB9CiAKIC8qKgotICoJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9yZW1vdmVfYWxsIC0gU2VuZCBub3RpZnkgb2YgcmVtb3ZlZAotICoJCQkJCQkgIGNvbnRyb2xsZXIgdG8gYWxsIEkyTyBkcml2ZXJzCisgKglpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZV9hbGwgLSBTZW5kIG5vdGlmeSBvZiByZW1vdmVkIGNvbnRyb2xsZXIKKyAqCUBjOiBjb250cm9sbGVyIHRoYXQgaXMgYmVpbmcgcmVtb3ZlZAogICoKICAqCVNlbmQgbm90aWZpY2F0aW9ucyB0byBhbGwgcmVnaXN0ZXJlZCBkcml2ZXJzIHRoYXQgYSBjb250cm9sbGVyIHdhcwogICoJcmVtb3ZlZC4KQEAgLTI4Nyw4ICsyODUsOCBAQAogfQogCiAvKioKLSAqCWkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9hZGRfYWxsIC0gU2VuZCBub3RpZnkgb2YgYWRkZWQgZGV2aWNlIHRvIGFsbAotICoJCQkJCSAgIEkyTyBkcml2ZXJzCisgKglpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfYWRkX2FsbCAtIFNlbmQgbm90aWZ5IG9mIGFkZGVkIGRldmljZQorICoJQGkyb19kZXY6IG5ld2x5IGFkZGVkIEkyTyBkZXZpY2UKICAqCiAgKglTZW5kIG5vdGlmaWNhdGlvbnMgdG8gYWxsIHJlZ2lzdGVyZWQgZHJpdmVycyB0aGF0IGEgZGV2aWNlIHdhcyBhZGRlZC4KICAqLwpAQCAtMzA2LDggKzMwNCw4IEBACiB9CiAKIC8qKgotICoJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX3JlbW92ZV9hbGwgLSBTZW5kIG5vdGlmeSBvZiByZW1vdmVkIGRldmljZSB0bwotICoJCQkJCSAgICAgIGFsbCBJMk8gZHJpdmVycworICoJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX3JlbW92ZV9hbGwgLSBTZW5kIG5vdGlmeSBvZiByZW1vdmVkIGRldmljZQorICoJQGkyb19kZXY6IGRldmljZSB0aGF0IGlzIGJlaW5nIHJlbW92ZWQKICAqCiAgKglTZW5kIG5vdGlmaWNhdGlvbnMgdG8gYWxsIHJlZ2lzdGVyZWQgZHJpdmVycyB0aGF0IGEgZGV2aWNlIHdhcyByZW1vdmVkLgogICovCkBAIC0zNjIsOSArMzYwLDkgQEAKIC8qKgogICoJaTJvX2RyaXZlcl9leGl0IC0gY2xlYW4gdXAgSTJPIGRyaXZlcnMgKE9TTXMpCiAgKgotICoJVW5yZWdpc3RlcnMgdGhlIEkyTyBidXMgYW5kIGZyZWUgZHJpdmVyIGFycmF5LgorICoJVW5yZWdpc3RlcnMgdGhlIEkyTyBidXMgYW5kIGZyZWVzIGRyaXZlciBhcnJheS4KICAqLwotdm9pZCBfX2V4aXQgaTJvX2RyaXZlcl9leGl0KHZvaWQpCit2b2lkIGkyb19kcml2ZXJfZXhpdCh2b2lkKQogewogCWJ1c191bnJlZ2lzdGVyKCZpMm9fYnVzX3R5cGUpOwogCWtmcmVlKGkyb19kcml2ZXJzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwppbmRleCA3YmQ0ZDg1Li5hNTM5ZDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCkBAIC05NCw4ICs5NCw4IEBACiB9OwogCiAvKioKLSAqCWkyb19leGVjX3dhaXRfZnJlZSAtIEZyZWUgYSBpMm9fZXhlY193YWl0IHN0cnVjdAotICoJQGkyb19leGVjX3dhaXQ6IEkyTyB3YWl0IGRhdGEgd2hpY2ggc2hvdWxkIGJlIGNsZWFuZWQgdXAKKyAqCWkyb19leGVjX3dhaXRfZnJlZSAtIEZyZWUgYW4gaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QKKyAqCUB3YWl0OiBJMk8gd2FpdCBkYXRhIHdoaWNoIHNob3VsZCBiZSBjbGVhbmVkIHVwCiAgKi8KIHN0YXRpYyB2b2lkIGkyb19leGVjX3dhaXRfZnJlZShzdHJ1Y3QgaTJvX2V4ZWNfd2FpdCAqd2FpdCkKIHsKQEAgLTEwNSw3ICsxMDUsNyBAQAogLyoqCiAgKiAJaTJvX21zZ19wb3N0X3dhaXRfbWVtIC0gUG9zdCBhbmQgd2FpdCBhIG1lc3NhZ2Ugd2l0aCBETUEgYnVmZmVycwogICoJQGM6IGNvbnRyb2xsZXIKLSAqCUBtOiBtZXNzYWdlIHRvIHBvc3QKKyAqCUBtc2c6IG1lc3NhZ2UgdG8gcG9zdAogICoJQHRpbWVvdXQ6IHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0CiAgKglAZG1hOiBpMm9fZG1hIHN0cnVjdCBvZiB0aGUgRE1BIGJ1ZmZlciB0byBmcmVlIG9uIGZhaWx1cmUKICAqCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogaW50IGkyb19tc2dfcG9zdF93YWl0X21lbShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnLAogCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXQsIHN0cnVjdCBpMm9fZG1hICpkbWEpCiB7Ci0JREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod3EpOworCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sod3EpOwogCXN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0OwogCXN0YXRpYyB1MzIgdGNudHh0ID0gMHg4MDAwMDAwMDsKLQlsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjID0gMDsKIAogCXdhaXQgPSBpMm9fZXhlY193YWl0X2FsbG9jKCk7CkBAIC0yNjksNiArMjY5LDcgQEAKIC8qKgogICoJaTJvX2V4ZWNfc2hvd192ZW5kb3JfaWQgLSBEaXNwbGF5cyBWZW5kb3IgSUQgb2YgY29udHJvbGxlcgogICoJQGQ6IGRldmljZSBvZiB3aGljaCB0aGUgVmVuZG9yIElEIHNob3VsZCBiZSBkaXNwbGF5ZWQKKyAqCUBhdHRyOiBkZXZpY2VfYXR0cmlidXRlIHRvIGRpc3BsYXkKICAqCUBidWY6IGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBWZW5kb3IgSUQgc2hvdWxkIGJlIHByaW50ZWQKICAqCiAgKglSZXR1cm5zIG51bWJlciBvZiBieXRlcyBwcmludGVkIGludG8gYnVmZmVyLgpAQCAtMjkwLDYgKzI5MSw3IEBACiAvKioKICAqCWkyb19leGVjX3Nob3dfcHJvZHVjdF9pZCAtIERpc3BsYXlzIFByb2R1Y3QgSUQgb2YgY29udHJvbGxlcgogICoJQGQ6IGRldmljZSBvZiB3aGljaCB0aGUgUHJvZHVjdCBJRCBzaG91bGQgYmUgZGlzcGxheWVkCisgKglAYXR0cjogZGV2aWNlX2F0dHJpYnV0ZSB0byBkaXNwbGF5CiAgKglAYnVmOiBidWZmZXIgaW50byB3aGljaCB0aGUgUHJvZHVjdCBJRCBzaG91bGQgYmUgcHJpbnRlZAogICoKICAqCVJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgaW50byBidWZmZXIuCkBAIC0zMjUsMTMgKzMyNywyNCBAQAogc3RhdGljIGludCBpMm9fZXhlY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CisJaW50IHJjOwogCi0JaTJvX2V2ZW50X3JlZ2lzdGVyKGkyb19kZXYsICZpMm9fZXhlY19kcml2ZXIsIDAsIDB4ZmZmZmZmZmYpOworCXJjID0gaTJvX2V2ZW50X3JlZ2lzdGVyKGkyb19kZXYsICZpMm9fZXhlY19kcml2ZXIsIDAsIDB4ZmZmZmZmZmYpOworCWlmIChyYykgZ290byBlcnJfb3V0OwogCi0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZlbmRvcl9pZCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3Byb2R1Y3RfaWQpOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZlbmRvcl9pZCk7CisJaWYgKHJjKSBnb3RvIGVycl9ldnRyZWc7CisJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcHJvZHVjdF9pZCk7CisJaWYgKHJjKSBnb3RvIGVycl92aWQ7CiAKIAlyZXR1cm4gMDsKKworZXJyX3ZpZDoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdmVuZG9yX2lkKTsKK2Vycl9ldnRyZWc6CisJaTJvX2V2ZW50X3JlZ2lzdGVyKHRvX2kyb19kZXZpY2UoZGV2KSwgJmkyb19leGVjX2RyaXZlciwgMCwgMCk7CitlcnJfb3V0OgorCXJldHVybiByYzsKIH07CiAKIC8qKgpAQCAtMzU0LDE0ICszNjcsMTYgQEAKIAogLyoqCiAgKglpMm9fZXhlY19sY3RfbW9kaWZpZWQgLSBDYWxsZWQgb24gTENUIE5PVElGWSByZXBseQotICoJQGM6IEkyTyBjb250cm9sbGVyIG9uIHdoaWNoIHRoZSBMQ1QgaGFzIG1vZGlmaWVkCisgKglAd29yazogd29yayBzdHJ1Y3QgZm9yIGEgc3BlY2lmaWMgY29udHJvbGxlcgogICoKICAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhc3luY2hyb251cyBMQ1QgTk9USUZZIHJlcGxpZXMuIEl0IHBhcnNlcyB0aGUKICAqCW5ldyBMQ1QgYW5kIGlmIHRoZSBidWZmZXIgZm9yIHRoZSBMQ1Qgd2FzIHRvIHNtYWxsIHNlbmRzIGEgTENUIE5PVElGWQogICoJYWdhaW4sIG90aGVyd2lzZSBzZW5kIExDVCBOT1RJRlkgdG8gZ2V0IGluZm9ybWVkIG9uIG5leHQgTENUIGNoYW5nZS4KICAqLwotc3RhdGljIHZvaWQgaTJvX2V4ZWNfbGN0X21vZGlmaWVkKHN0cnVjdCBpMm9fZXhlY19sY3Rfbm90aWZ5X3dvcmsgKndvcmspCitzdGF0aWMgdm9pZCBpMm9fZXhlY19sY3RfbW9kaWZpZWQoc3RydWN0IHdvcmtfc3RydWN0ICpfd29yaykKIHsKKwlzdHJ1Y3QgaTJvX2V4ZWNfbGN0X25vdGlmeV93b3JrICp3b3JrID0KKwkJY29udGFpbmVyX29mKF93b3JrLCBzdHJ1Y3QgaTJvX2V4ZWNfbGN0X25vdGlmeV93b3JrLCB3b3JrKTsKIAl1MzIgY2hhbmdlX2luZCA9IDA7CiAJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gd29yay0+YzsKIApAQCAtNDI4LDggKzQ0Myw3IEBACiAKIAkJd29yay0+YyA9IGM7CiAKLQkJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCAodm9pZCAoKikodm9pZCAqKSlpMm9fZXhlY19sY3RfbW9kaWZpZWQsCi0JCQkgIHdvcmspOworCQlJTklUX1dPUksoJndvcmstPndvcmssIGkyb19leGVjX2xjdF9tb2RpZmllZCk7CiAJCXF1ZXVlX3dvcmsoaTJvX2V4ZWNfZHJpdmVyLmV2ZW50X3F1ZXVlLCAmd29yay0+d29yayk7CiAJCXJldHVybiAxOwogCX0KQEAgLTQ0OSwxMyArNDYzLDE1IEBACiAKIC8qKgogICoJaTJvX2V4ZWNfZXZlbnQgLSBFdmVudCBoYW5kbGluZyBmdW5jdGlvbgotICoJQGV2dDogRXZlbnQgd2hpY2ggb2NjdXJzCisgKglAd29yazogV29yayBpdGVtIGluIG9jY3VycmluZyBldmVudAogICoKICAqCUhhbmRsZXMgZXZlbnRzIHNlbmQgYnkgdGhlIEV4ZWN1dGl2ZSBkZXZpY2UuIEF0IHRoZSBtb21lbnQgZG9lcyBub3QgZG8KICAqCWFueXRoaW5nIHVzZWZ1bC4KICAqLwotc3RhdGljIHZvaWQgaTJvX2V4ZWNfZXZlbnQoc3RydWN0IGkyb19ldmVudCAqZXZ0KQorc3RhdGljIHZvaWQgaTJvX2V4ZWNfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBpMm9fZXZlbnQgKmV2dCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaTJvX2V2ZW50LCB3b3JrKTsKKwogCWlmIChsaWtlbHkoZXZ0LT5pMm9fZGV2KSkKIAkJb3NtX2RlYnVnKCJFdmVudCByZWNlaXZlZCBmcm9tIGRldmljZTogJWRcbiIsCiAJCQkgIGV2dC0+aTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKQEAgLTU3OSw3ICs1OTUsNyBAQAogICoKICAqCVVucmVnaXN0ZXJzIHRoZSBFeGVjIE9TTSBmcm9tIHRoZSBJMk8gY29yZS4KICAqLwotdm9pZCBfX2V4aXQgaTJvX2V4ZWNfZXhpdCh2b2lkKQordm9pZCBpMm9fZXhlY19leGl0KHZvaWQpCiB7CiAJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fZXhlY19kcml2ZXIpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCmluZGV4IGVhYmE4MWIuLmRhOTg1OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwpAQCAtMjU5LDcgKzI1OSw3IEBACiAvKioKICAqCWkyb19ibG9ja19kZXZpY2VfcG93ZXIgLSBQb3dlciBtYW5hZ2VtZW50IGZvciBkZXZpY2UgZGV2CiAgKglAZGV2OiBJMk8gZGV2aWNlIHdoaWNoIHNob3VsZCByZWNlaXZlIHRoZSBwb3dlciBtYW5hZ2VtZW50IHJlcXVlc3QKLSAqCUBvcGVyYXRpb246IE9wZXJhdGlvbiB3aGljaCBzaG91bGQgYmUgc2VuZAorICoJQG9wOiBPcGVyYXRpb24gdG8gc2VuZAogICoKICAqCVNlbmQgYSBwb3dlciBtYW5hZ2VtZW50IHJlcXVlc3QgdG8gdGhlIGRldmljZSBkZXYuCiAgKgpAQCAtMzE1LDcgKzMxNSw3IEBACiAgKglpMm9fYmxvY2tfcmVxdWVzdF9mcmVlIC0gRnJlZXMgYSBJMk8gYmxvY2sgcmVxdWVzdAogICoJQGlyZXE6IEkyTyBibG9jayByZXF1ZXN0IHdoaWNoIHNob3VsZCBiZSBmcmVlZAogICoKLSAqCUZyZXMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKGdpdmUgaXQgYmFjayB0byB0aGUgcmVxdWVzdCBtZW1wb29sKS4KKyAqCUZyZWVzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IChnaXZlIGl0IGJhY2sgdG8gdGhlIHJlcXVlc3QgbWVtcG9vbCkuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpMm9fYmxvY2tfcmVxdWVzdF9mcmVlKHN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSkKIHsKQEAgLTMyNiw2ICszMjYsNyBAQAogICoJaTJvX2Jsb2NrX3NnbGlzdF9hbGxvYyAtIEFsbG9jYXRlIHRoZSBTRyBsaXN0IGFuZCBtYXAgaXQKICAqCUBjOiBJMk8gY29udHJvbGxlciB0byB3aGljaCB0aGUgcmVxdWVzdCBiZWxvbmdzCiAgKglAaXJlcTogSTJPIGJsb2NrIHJlcXVlc3QKKyAqCUBtcHRyOiBtZXNzYWdlIGJvZHkgcG9pbnRlcgogICoKICAqCUJ1aWxkcyB0aGUgU0cgbGlzdCBhbmQgbWFwIGl0IHRvIGJlIGFjY2Vzc2FibGUgYnkgdGhlIGNvbnRyb2xsZXIuCiAgKgpAQCAtNDE5LDE2ICs0MjAsMTggQEAKIAogLyoqCiAgKglpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0X2ZuIC0gZGVsYXllZCByZXF1ZXN0IHF1ZXVlIGZ1bmN0aW9uCi0gKglkZWxheWVkX3JlcXVlc3Q6IHRoZSBkZWxheWVkIHJlcXVlc3Qgd2l0aCB0aGUgcXVldWUgdG8gc3RhcnQKKyAqCUB3b3JrOiB0aGUgZGVsYXllZCByZXF1ZXN0IHdpdGggdGhlIHF1ZXVlIHRvIHN0YXJ0CiAgKgogICoJSWYgdGhlIHJlcXVlc3QgcXVldWUgaXMgc3RvcHBlZCBmb3IgYSBkaXNrLCBhbmQgdGhlcmUgaXMgbm8gb3BlbgogICoJcmVxdWVzdCwgYSBuZXcgZXZlbnQgaXMgY3JlYXRlZCwgd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBzdGFydAogICoJdGhlIHF1ZXVlIGFmdGVyIEkyT19CTE9DS19SRVFVRVNUX1RJTUUuIE90aGVyd2lzZSB0aGUgcXVldWUgd2lsbCBuZXZlcgogICoJYmUgc3RhcnRlZCBhZ2Fpbi4KICAqLwotc3RhdGljIHZvaWQgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdF9mbih2b2lkICpkZWxheWVkX3JlcXVlc3QpCitzdGF0aWMgdm9pZCBpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0X2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdCAqZHJlcSA9IGRlbGF5ZWRfcmVxdWVzdDsKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdCAqZHJlcSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdCwKKwkJCSAgICAgd29yay53b3JrKTsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyZXEtPnF1ZXVlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTQ4OCw3ICs0OTEsNyBAQAogICoJaTJvX2Jsb2NrX3JlcGx5IC0gQmxvY2sgT1NNIHJlcGx5IGhhbmRsZXIuCiAgKglAYzogSTJPIGNvbnRyb2xsZXIgZnJvbSB3aGljaCB0aGUgbWVzc2FnZSBhcnJpdmVzCiAgKglAbTogbWVzc2FnZSBpZCBvZiByZXBseQotICoJcW1zZzogdGhlIGFjdHVhbGwgSTJPIG1lc3NhZ2UgcmVwbHkKKyAqCUBtc2c6IHRoZSBhY3R1YWwgSTJPIG1lc3NhZ2UgcmVwbHkKICAqCiAgKglUaGlzIGZ1bmN0aW9uIGdldHMgYWxsIHRoZSBtZXNzYWdlIHJlcGxpZXMuCiAgKgpAQCAtNTM4LDggKzU0MSw5IEBACiAJcmV0dXJuIDE7CiB9OwogCi1zdGF0aWMgdm9pZCBpMm9fYmxvY2tfZXZlbnQoc3RydWN0IGkyb19ldmVudCAqZXZ0KQorc3RhdGljIHZvaWQgaTJvX2Jsb2NrX2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgaTJvX2V2ZW50ICpldnQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGkyb19ldmVudCwgd29yayk7CiAJb3NtX2RlYnVnKCJldmVudCByZWNlaXZlZFxuIik7CiAJa2ZyZWUoZXZ0KTsKIH07CkBAIC01OTksNiArNjAzLDggQEAKIAogLyoqCiAgKglpMm9fYmxvY2tfb3BlbiAtIE9wZW4gdGhlIGJsb2NrIGRldmljZQorICoJQGlub2RlOiBpbm9kZSBmb3IgYmxvY2sgZGV2aWNlIGJlaW5nIG9wZW5lZAorICoJQGZpbGU6IGZpbGUgdG8gb3BlbgogICoKICAqCVBvd2VyIHVwIHRoZSBkZXZpY2UsIG1vdW50IGFuZCBsb2NrIHRoZSBtZWRpYS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsCiAgKglpZiB0aGUgYmxvY2sgZGV2aWNlIGlzIG9wZW5lZCBmb3IgYWNjZXNzLgpAQCAtNjI2LDYgKzYzMiw4IEBACiAKIC8qKgogICoJaTJvX2Jsb2NrX3JlbGVhc2UgLSBSZWxlYXNlIHRoZSBJMk8gYmxvY2sgZGV2aWNlCisgKglAaW5vZGU6IGlub2RlIGZvciBibG9jayBkZXZpY2UgYmVpbmcgcmVsZWFzZWQKKyAqCUBmaWxlOiBmaWxlIHRvIGNsb3NlCiAgKgogICoJVW5sb2NrIGFuZCB1bm1vdW50IHRoZSBtZWRpYSwgYW5kIHBvd2VyIGRvd24gdGhlIGRldmljZS4gR2V0cyBjYWxsZWQgaWYKICAqCXRoZSBibG9jayBkZXZpY2UgaXMgY2xvc2VkLgpAQCAtNjcyLDYgKzY4MCw4IEBACiAKIC8qKgogICoJaTJvX2Jsb2NrX2lvY3RsIC0gSXNzdWUgZGV2aWNlIHNwZWNpZmljIGlvY3RsIGNhbGxzLgorICoJQGlub2RlOiBpbm9kZSBmb3IgYmxvY2sgZGV2aWNlIGlvY3RsCisgKglAZmlsZTogZmlsZSBmb3IgaW9jdGwKICAqCUBjbWQ6IGlvY3RsIGNvbW1hbmQKICAqCUBhcmc6IGFyZwogICoKQEAgLTg5OSw3ICs5MDksNyBAQAogCiAvKioKICAqCWkyb19ibG9ja19yZXF1ZXN0X2ZuIC0gcmVxdWVzdCBxdWV1ZSBoYW5kbGluZyBmdW5jdGlvbgotICoJcTogcmVxdWVzdCBxdWV1ZSBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IGNvdWxkIGJlIGZldGNoZWQKKyAqCUBxOiByZXF1ZXN0IHF1ZXVlIGZyb20gd2hpY2ggdGhlIHJlcXVlc3QgY291bGQgYmUgZmV0Y2hlZAogICoKICAqCVRha2VzIHRoZSBuZXh0IHJlcXVlc3QgZnJvbSB0aGUgcXVldWUsIHRyYW5zZmVycyBpdCBhbmQgaWYgbm8gZXJyb3IKICAqCW9jY3VycyBkZXF1ZXVlIGl0IGZyb20gdGhlIHF1ZXVlLiBPbiBhcnJpdmFsIG9mIHRoZSByZXBseSB0aGUgbWVzc2FnZQpAQCAtOTM4LDggKzk0OCw4IEBACiAJCQkJY29udGludWU7CiAKIAkJCWRyZXEtPnF1ZXVlID0gcTsKLQkJCUlOSVRfV09SSygmZHJlcS0+d29yaywgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdF9mbiwKLQkJCQkgIGRyZXEpOworCQkJSU5JVF9ERUxBWUVEX1dPUksoJmRyZXEtPndvcmssCisJCQkJCSAgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdF9mbik7CiAKIAkJCWlmICghcXVldWVfZGVsYXllZF93b3JrKGkyb19ibG9ja19kcml2ZXIuZXZlbnRfcXVldWUsCiAJCQkJCQkmZHJlcS0+d29yaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmggYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5oCmluZGV4IDRmZGFhNWIuLjY3ZjkyMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suaApAQCAtNjQsNyArNjQsNyBAQAogCiAvKiBJMk8gQmxvY2sgT1NNIG1lbXBvb2wgc3RydWN0ICovCiBzdHJ1Y3QgaTJvX2Jsb2NrX21lbXBvb2wgewotCWttZW1fY2FjaGVfdCAqc2xhYjsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqc2xhYjsKIAltZW1wb29sX3QgKnBvb2w7CiB9OwogCkBAIC05Niw3ICs5Niw3IEBACiAKIC8qIEkyTyBCbG9jayBkZXZpY2UgZGVsYXllZCByZXF1ZXN0ICovCiBzdHJ1Y3QgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdCB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKaW5kZXggN2QyM2UwOC4uZTMzZDQ0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOWElPOwogCi0Jb3BzID0gKHU4ICopIGttYWxsb2Moa2NtZC5vcGxlbiwgR0ZQX0tFUk5FTCk7CisJb3BzID0ga21hbGxvYyhrY21kLm9wbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW9wcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE5OSw3ICsxOTksNyBAQAogCSAqIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIF92ZXJ5XyBsYXJnZSB0YWJsZQogCSAqIGFuZCB0aGF0IHRoZSB1c2VyIGFza3MgZm9yIGFsbCBvZiBpdCBhdCBvbmNlLi4uCiAJICovCi0JcmVzID0gKHU4ICopIGttYWxsb2MoNjU1MzYsIEdGUF9LRVJORUwpOworCXJlcyA9IGttYWxsb2MoNjU1MzYsIEdGUF9LRVJORUwpOwogCWlmICghcmVzKSB7CiAJCWtmcmVlKG9wcyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjY1LDcgKzI2NSwxMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlfX2NvcHlfZnJvbV91c2VyKGJ1ZmZlci52aXJ0LCBreGZlci5idWYsIGZyYWdzaXplKTsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcihidWZmZXIudmlydCwga3hmZXIuYnVmLCBmcmFnc2l6ZSkpIHsKKwkJaTJvX21zZ19ub3AoYywgbXNnKTsKKwkJaTJvX2RtYV9mcmVlKCZjLT5wZGV2LT5kZXYsICZidWZmZXIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAKIAltc2ctPnUuaGVhZFswXSA9IGNwdV90b19sZTMyKE5JTkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNyk7CiAJbXNnLT51LmhlYWRbMV0gPQpAQCAtNTE2LDcgKzUyMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogc3RhdGljIGludCBpMm9fY2ZnX3Bhc3N0aHJ1MzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtbmQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKQEAgLTc1OSw2ICs3NjIsNyBAQAogCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUMKIHN0YXRpYyBpbnQgaTJvX2NmZ19wYXNzdGhydSh1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydSBfX3VzZXIgKmNtZCA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMKaW5kZXggM2QyZTc2ZS4uYTYxY2IxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAgKglpMm9fZ2V0X2NsYXNzX25hbWUgLSAJZG8gaTJvIGNsYXNzIG5hbWUgbG9va3VwCiAgKglAY2xhc3M6IGNsYXNzIG51bWJlcgogICoKLSAqCVJldHVybiBhIGRlc2NyaXB0aXZlIHN0cmluZyBmb3IgYW4gaTJvIGNsYXNzCisgKglSZXR1cm4gYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIGFuIGkybyBjbGFzcy4KICAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmkyb19nZXRfY2xhc3NfbmFtZShpbnQgY2xhc3MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19zY3NpLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19zY3NpLmMKaW5kZXggNmViZjM4Mi4uMTA0NWM4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYwpAQCAtMjIwLDcgKzIyMCw3IEBACiAJdTMyIGlkID0gLTE7CiAJdTY0IGx1biA9IC0xOwogCWludCBjaGFubmVsID0gLTE7Ci0JaW50IGk7CisJaW50IGksIHJjOwogCiAJaTJvX3Nob3N0ID0gaTJvX3Njc2lfZ2V0X2hvc3QoYyk7CiAJaWYgKCFpMm9fc2hvc3QpCkBAIC0zMDQsMTQgKzMwNCwyMCBAQAogCQlyZXR1cm4gUFRSX0VSUihzY3NpX2Rldik7CiAJfQogCi0Jc3lzZnNfY3JlYXRlX2xpbmsoJmkyb19kZXYtPmRldmljZS5rb2JqLCAmc2NzaV9kZXYtPnNkZXZfZ2VuZGV2LmtvYmosCi0JCQkgICJzY3NpIik7CisJcmMgPSBzeXNmc19jcmVhdGVfbGluaygmaTJvX2Rldi0+ZGV2aWNlLmtvYmosCisJCQkgICAgICAgJnNjc2lfZGV2LT5zZGV2X2dlbmRldi5rb2JqLCAic2NzaSIpOworCWlmIChyYykKKwkJZ290byBlcnI7CiAKIAlvc21faW5mbygiZGV2aWNlIGFkZGVkIChUSUQ6ICUwM3gpIGNoYW5uZWw6ICVkLCBpZDogJWQsIGx1bjogJWxkXG4iLAogCQkgaTJvX2Rldi0+bGN0X2RhdGEudGlkLCBjaGFubmVsLCBsZTMyX3RvX2NwdShpZCksCiAJCSAobG9uZyB1bnNpZ25lZCBpbnQpbGU2NF90b19jcHUobHVuKSk7CiAKIAlyZXR1cm4gMDsKKworZXJyOgorCXNjc2lfcmVtb3ZlX2RldmljZShzY3NpX2Rldik7CisJcmV0dXJuIHJjOwogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmkyb19zY3NpX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqU0Nob3N0KQpAQCAtNDA1LDggKzQxMSw3IEBACiB9OwogCiAvKioKLSAqCWkyb19zY3NpX25vdGlmeV9kZXZpY2VfcmVtb3ZlIC0gUmV0cmlldmUgbm90aWZpY2F0aW9ucyBvZiByZW1vdmVkCi0gKgkJCQkgICAgICAgIGRldmljZXMKKyAqCWkyb19zY3NpX25vdGlmeV9kZXZpY2VfcmVtb3ZlIC0gUmV0cmlldmUgbm90aWZpY2F0aW9ucyBvZiByZW1vdmVkIGRldmljZXMKICAqCUBpMm9fZGV2OiB0aGUgSTJPIGRldmljZSB3aGljaCB3YXMgcmVtb3ZlZAogICoKICAqCUlmIGEgSTJPIGRldmljZSBpcyByZW1vdmVkLCB3ZSBjYXRjaCB0aGUgbm90aWZpY2F0aW9uIHRvIHJlbW92ZSB0aGUKQEAgLTQyNiw4ICs0MzEsNyBAQAogfTsKIAogLyoqCi0gKglpMm9fc2NzaV9ub3RpZnlfY29udHJvbGxlcl9hZGQgLSBSZXRyaWV2ZSBub3RpZmljYXRpb25zIG9mIGFkZGVkCi0gKgkJCQkJIGNvbnRyb2xsZXJzCisgKglpMm9fc2NzaV9ub3RpZnlfY29udHJvbGxlcl9hZGQgLSBSZXRyaWV2ZSBub3RpZmljYXRpb25zIG9mIGFkZGVkIGNvbnRyb2xsZXJzCiAgKglAYzogdGhlIGNvbnRyb2xsZXIgd2hpY2ggd2FzIGFkZGVkCiAgKgogICoJSWYgYSBJMk8gY29udHJvbGxlciBpcyBhZGRlZCwgd2UgY2F0Y2ggdGhlIG5vdGlmaWNhdGlvbiB0byBhZGQgYQpAQCAtNDU3LDggKzQ2MSw3IEBACiB9OwogCiAvKioKLSAqCWkyb19zY3NpX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZSAtIFJldHJpZXZlIG5vdGlmaWNhdGlvbnMgb2YgcmVtb3ZlZAotICoJCQkJCSAgICBjb250cm9sbGVycworICoJaTJvX3Njc2lfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlIC0gUmV0cmlldmUgbm90aWZpY2F0aW9ucyBvZiByZW1vdmVkIGNvbnRyb2xsZXJzCiAgKglAYzogdGhlIGNvbnRyb2xsZXIgd2hpY2ggd2FzIHJlbW92ZWQKICAqCiAgKglJZiBhIEkyTyBjb250cm9sbGVyIGlzIHJlbW92ZWQsIHdlIGNhdGNoIHRoZSBub3RpZmljYXRpb24gdG8gcmVtb3ZlIHRoZQpAQCAtNzQ1LDcgKzc0OCw3IEBACiAgKglAY2FwYWNpdHk6IHNpemUgaW4gc2VjdG9ycwogICoJQGlwOiBnZW9tZXRyeSBhcnJheQogICoKLSAqCVRoaXMgaXMgYW55b25lcyBndWVzcyBxdWl0ZSBmcmFua2x5LiBXZSB1c2UgdGhlIHNhbWUgcnVsZXMgZXZlcnlvbmUKKyAqCVRoaXMgaXMgYW55b25lJ3MgZ3Vlc3MgcXVpdGUgZnJhbmtseS4gV2UgdXNlIHRoZSBzYW1lIHJ1bGVzIGV2ZXJ5b25lCiAgKgllbHNlIGFwcGVhcnMgdG8gYW5kIGhvcGUuIEl0IHNlZW1zIHRvIHdvcmsuCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKaW5kZXggNjJmMWFjMC4uMzY2MWU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCkBAIC0yNTksNiArMjU5LDcgQEAKIAogLyoqCiAgKglpMm9fcGNpX2lycV9lbmFibGUgLSBBbGxvY2F0ZSBpbnRlcnJ1cHQgZm9yIEkyTyBjb250cm9sbGVyCisgKglAYzogaTJvX2NvbnRyb2xsZXIgdGhhdCB0aGUgcmVxdWVzdCBpcyBmb3IKICAqCiAgKglBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgZm9yIHRoZSBJMk8gY29udHJvbGxlciwgYW5kIGFjdGl2YXRlIGludGVycnVwdHMKICAqCW9uIHRoZSBJMk8gY29udHJvbGxlci4KQEAgLTMwNSw3ICszMDYsNyBAQAogCiAvKioKICAqCWkyb19wY2lfcHJvYmUgLSBQcm9iZSB0aGUgUENJIGRldmljZSBmb3IgYW4gSTJPIGNvbnRyb2xsZXIKLSAqCUBkZXY6IFBDSSBkZXZpY2UgdG8gdGVzdAorICoJQHBkZXY6IFBDSSBkZXZpY2UgdG8gdGVzdAogICoJQGlkOiBpZCB3aGljaCBtYXRjaGVkIHdpdGggdGhlIFBDSSBkZXZpY2UgaWQgdGFibGUKICAqCiAgKglQcm9iZSB0aGUgUENJIGRldmljZSBmb3IgYW55IGRldmljZSB3aGljaCBpcyBhIG1lbW9yeSBvZiB0aGUKQEAgLTMyMCw3ICszMjEsNiBAQAogCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKIAlpbnQgcmM7CiAJc3RydWN0IHBjaV9kZXYgKmk5NjAgPSBOVUxMOwotCWludCBlbmFibGVkID0gcGRldi0+aXNfZW5hYmxlZDsKIAogCXByaW50ayhLRVJOX0lORk8gImkybzogQ2hlY2tpbmcgZm9yIFBDSSBJMk8gY29udHJvbGxlcnMuLi5cbiIpOwogCkBAIC0zMzAsMTIgKzMzMCwxMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoIWVuYWJsZWQpCi0JCWlmICgocmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogY291bGRuJ3QgZW5hYmxlIGRldmljZSAlc1xuIiwKLQkJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KKwlpZiAoKHJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogY291bGRuJ3QgZW5hYmxlIGRldmljZSAlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIHJjOworCX0KIAogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IG5vIHN1aXRhYmxlIERNQSBmb3VuZCBmb3IgJXNcbiIsCkBAIC00NDIsMTUgKzQ0MSwxNCBAQAogCWkyb19pb3BfZnJlZShjKTsKIAogICAgICAgZGlzYWJsZToKLQlpZiAoIWVuYWJsZWQpCi0JCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAKIAlyZXR1cm4gcmM7CiB9CiAKIC8qKgogICoJaTJvX3BjaV9yZW1vdmUgLSBSZW1vdmVzIGEgSTJPIGNvbnRyb2xsZXIgZnJvbSB0aGUgc3lzdGVtCi0gKglwZGV2OiBJMk8gY29udHJvbGxlciB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAorICoJQHBkZXY6IEkyTyBjb250cm9sbGVyIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkCiAgKgogICoJUmVzZXQgdGhlIEkyTyBjb250cm9sbGVyLCBkaXNhYmxlIGludGVycnVwdHMgYW5kIHJlbW92ZSBhbGwgYWxsb2NhdGVkCiAgKglyZXNvdXJjZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMgYi9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKaW5kZXggODI5MzhhZC4uY2UxYTQ4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jCisrKyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IDNkZjBlN2EuLjAwZGIzMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC0yOCw2ICsyOCwxOCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU0dJX0lPQzQKKwl0cmlzdGF0ZSAiU0dJIElPQzQgQmFzZSBJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBiYXNpYyBzdXBwb3J0IGZvciB0aGUgSU9DNCBjaGlwIG9uIGNlcnRhaW4KKwkgIFNHSSBJTyBjb250cm9sbGVyIGNhcmRzIChJTzksIElPMTAsIGFuZCBQQ0ktUlQpLiAgVGhpcyBvcHRpb24KKwkgIGRvZXMgbm90IGVuYWJsZSBhbnkgc3BlY2lmaWMgZnVuY3Rpb25zIG9uIHN1Y2ggYSBjYXJkLCBidXQgcHJvdmlkZXMKKwkgIG5lY2Vzc2FyeSBpbmZyYXN0cnVjdHVyZSBmb3Igb3RoZXIgZHJpdmVycyB0byB1dGlsaXplLgorCisJICBJZiB5b3UgaGF2ZSBhbiBTR0kgQWx0aXggd2l0aCBhbiBJT0M0LWJhc2VkIGNhcmQgc2F5IFkuCisJICBPdGhlcndpc2Ugc2F5IE4uCisKIGNvbmZpZyBUSUZNX0NPUkUKIAl0cmlzdGF0ZSAiVEkgRmxhc2ggTWVkaWEgaW50ZXJmYWNlIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKQEAgLTU3LDQgKzY5LDIzIEBACiAgICAgICAgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCiAJICBiZSBjYWxsZWQgdGlmbV83eHgxLgogCitjb25maWcgTVNJX0xBUFRPUAorICAgICAgICB0cmlzdGF0ZSAiTVNJIExhcHRvcCBFeHRyYXMiCisgICAgICAgIGRlcGVuZHMgb24gWDg2CisgICAgICAgIGRlcGVuZHMgb24gQUNQSV9FQworICAgICAgICBkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKyAgICAgICAgLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbGFwdG9wcyBidWlsdCBieSBNU0kgKE1JQ1JPLVNUQVIKKwkgIElOVEVSTkFUSU9OQUwpOgorCisJICBNU0kgTWVnYUJvb2sgUzI3MCAoTVMtMTAxMykKKwkgIEN5dHJvbi9UQ00vTWVkaW9uL1RjaGlibyBNRDk2MTAwL1NBTTIwMDAKKworCSAgSXQgYWRkcyBzdXBwb3J0IGZvciBCbHVldG9vdGgsIFdMQU4gYW5kIExDRCBicmlnaHRuZXNzIGNvbnRyb2wuCisKKwkgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgaXMgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovLzBwb2ludGVyLmRlL2xlbm5hcnQvdGNoaWJvLmh0bWw+LgorCisJICBJZiB5b3UgaGF2ZSBhbiBNU0kgUzI3MCBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCmluZGV4IGQ2NWVjZTcuLmM5ZTk4YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKQEAgLTUsNiArNSw4IEBACiAKIG9iai0kKENPTkZJR19JQk1fQVNNKQkJKz0gaWJtYXNtLwogb2JqLSQoQ09ORklHX0hEUFVfRkVBVFVSRVMpCSs9IGhkcHVmdHJzLworb2JqLSQoQ09ORklHX01TSV9MQVBUT1ApICAgICArPSBtc2ktbGFwdG9wLm8KIG9iai0kKENPTkZJR19MS0RUTSkJCSs9IGxrZHRtLm8KIG9iai0kKENPTkZJR19USUZNX0NPUkUpICAgICAgIAkrPSB0aWZtX2NvcmUubwogb2JqLSQoQ09ORklHX1RJRk1fN1hYMSkgICAgICAgCSs9IHRpZm1fN3h4MS5vCitvYmotJChDT05GSUdfU0dJX0lPQzQpCQkrPSBpb2M0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pb2M0LmMgYi9kcml2ZXJzL21pc2MvaW9jNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTVhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvaW9jNC5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1hc3RlciBkcml2ZXIgbW9kdWxlIGZvciB1c2UgYnkgU0dJIElPQzQgc3ViZHJpdmVycy4KKyAqCisgKiBJdCBhbGxvY2F0ZXMgYW55IHJlc291cmNlcyBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBzdWJkZXZpY2VzLCBhbmQKKyAqIHByb3ZpZGVzIGFjY2Vzc29yIGZ1bmN0aW9ucyAod2hlcmUgbmVlZGVkKSBhbmQgdGhlIGxpa2UgZm9yIHRob3NlCisgKiByZXNvdXJjZXMuICBJdCBhbHNvIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB0aGUgc3ViZGV2aWNlIG1vZHVsZXMKKyAqIHRvIHN1cHBvcnQgbG9hZGluZyBhbmQgdW5sb2FkaW5nLgorICoKKyAqIE5vbi1zaGFyZWQgcmVzb3VyY2VzIChlLmcuIGV4dGVybmFsIGludGVycnVwdCBBX0lOVF9PVVQgcmVnaXN0ZXIgcGFnZQorICogYWxpYXMsIHNlcmlhbCBwb3J0IGFuZCBVQVJUIHJlZ2lzdGVycykgYXJlIGhhbmRsZWQgYnkgdGhlIHN1YmRldmljZQorICogbW9kdWxlcyB0aGVtc2VsdmVzLgorICoKKyAqIFRoaXMgaXMgYWxsIG5lY2Vzc2FyeSBiZWNhdXNlIElPQzQgaXMgbm90IGltcGxlbWVudGVkIGFzIGEgbXVsdGktZnVuY3Rpb24KKyAqIFBDSSBkZXZpY2UsIGJ1dCBhbiBhbWFsZ2FtYXRpb24gb2YgZGlzcGFyYXRlIHJlZ2lzdGVycyBmb3Igc2V2ZXJhbAorICogdHlwZXMgb2YgZGV2aWNlIChBVEEsIHNlcmlhbCwgZXh0ZXJuYWwgaW50ZXJydXB0cykuICBUaGUgbm9ybWFsCisgKiByZXNvdXJjZSBtYW5hZ2VtZW50IGluIHRoZSBrZXJuZWwgZG9lc24ndCBoYXZlIHF1aXRlIHRoZSByaWdodCBpbnRlcmZhY2VzCisgKiB0byBoYW5kbGUgdGhpcyBzaXR1YXRpb24gKGUuZy4gbXVsdGlwbGUgbW9kdWxlcyBjYW4ndCBjbGFpbSB0aGUgc2FtZQorICogUENJIElEKSwgdGh1cyB0aGlzIElPQzQgbWFzdGVyIG1vZHVsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2M0Lmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoqKioqKioqKioqKioqKgorICogRGVmaW5pdGlvbnMgKgorICoqKioqKioqKioqKioqKi8KKworLyogVHdlYWthYmxlIHZhbHVlcyAqLworCisvKiBQQ0kgYnVzIHNwZWVkIGRldGVjdGlvbi9jYWxpYnJhdGlvbiAqLworI2RlZmluZSBJT0M0X0NBTElCUkFURV9DT1VOVCA2MwkJLyogQ2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCisjZGVmaW5lIElPQzRfQ0FMSUJSQVRFX0NZQ0xFUyAyNTYJLyogQXZlcmFnZSBvdmVyIHRoaXMgbWFueSBjeWNsZXMgKi8KKyNkZWZpbmUgSU9DNF9DQUxJQlJBVEVfRElTQ0FSRCAyCS8qIERpc2NhcmQgZmlyc3QgZmV3IGN5Y2xlcyAqLworI2RlZmluZSBJT0M0X0NBTElCUkFURV9MT1dfTUhaIDI1CS8qIExvd2VyIGJvdW5kIG9uIGJ1cyBzcGVlZCBzYW5pdHkgKi8KKyNkZWZpbmUgSU9DNF9DQUxJQlJBVEVfSElHSF9NSFogNzUJLyogVXBwZXIgYm91bmQgb24gYnVzIHNwZWVkIHNhbml0eSAqLworI2RlZmluZSBJT0M0X0NBTElCUkFURV9ERUZBVUxUX01IWiA2NgkvKiBBc3N1bWVkIGlmIHNhbml0eSBjaGVjayBmYWlscyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdWJtb2R1bGUgbWFuYWdlbWVudCAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgREVGSU5FX01VVEVYKGlvYzRfbXV0ZXgpOworCitzdGF0aWMgTElTVF9IRUFEKGlvYzRfZGV2aWNlcyk7CitzdGF0aWMgTElTVF9IRUFEKGlvYzRfc3VibW9kdWxlcyk7CisKKy8qIFJlZ2lzdGVyIGFuIElPQzQgc3VibW9kdWxlICovCitpbnQKK2lvYzRfcmVnaXN0ZXJfc3VibW9kdWxlKHN0cnVjdCBpb2M0X3N1Ym1vZHVsZSAqaXMpCit7CisJc3RydWN0IGlvYzRfZHJpdmVyX2RhdGEgKmlkZDsKKworCW11dGV4X2xvY2soJmlvYzRfbXV0ZXgpOworCWxpc3RfYWRkKCZpcy0+aXNfbGlzdCwgJmlvYzRfc3VibW9kdWxlcyk7CisKKwkvKiBJbml0aWFsaXplIHN1Ym1vZHVsZSBmb3IgZWFjaCBJT0M0ICovCisJaWYgKCFpcy0+aXNfcHJvYmUpCisJCWdvdG8gb3V0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpZGQsICZpb2M0X2RldmljZXMsIGlkZF9saXN0KSB7CisJCWlmIChpcy0+aXNfcHJvYmUoaWRkKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogSU9DNCBzdWJtb2R1bGUgJXMgcHJvYmUgZmFpbGVkICIKKwkJCSAgICAgICAiZm9yIHBjaV9kZXYgJXMiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgbW9kdWxlX25hbWUoaXMtPmlzX293bmVyKSwKKwkJCSAgICAgICBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSk7CisJCX0KKwl9Cisgb3V0OgorCW11dGV4X3VubG9jaygmaW9jNF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFVucmVnaXN0ZXIgYW4gSU9DNCBzdWJtb2R1bGUgKi8KK3ZvaWQKK2lvYzRfdW5yZWdpc3Rlcl9zdWJtb2R1bGUoc3RydWN0IGlvYzRfc3VibW9kdWxlICppcykKK3sKKwlzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkOworCisJbXV0ZXhfbG9jaygmaW9jNF9tdXRleCk7CisJbGlzdF9kZWwoJmlzLT5pc19saXN0KTsKKworCS8qIFJlbW92ZSBzdWJtb2R1bGUgZm9yIGVhY2ggSU9DNCAqLworCWlmICghaXMtPmlzX3JlbW92ZSkKKwkJZ290byBvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlkZCwgJmlvYzRfZGV2aWNlcywgaWRkX2xpc3QpIHsKKwkJaWYgKGlzLT5pc19yZW1vdmUoaWRkKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogSU9DNCBzdWJtb2R1bGUgJXMgcmVtb3ZlIGZhaWxlZCAiCisJCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZHVsZV9uYW1lKGlzLT5pc19vd25lciksCisJCQkgICAgICAgcGNpX25hbWUoaWRkLT5pZGRfcGRldikpOworCQl9CisJfQorIG91dDoKKwltdXRleF91bmxvY2soJmlvYzRfbXV0ZXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZpY2UgbWFuYWdlbWVudCAqCisgKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElPQzRfQ0FMSUJSQVRFX0xPV19MSU1JVCBcCisJKDEwMDAqSU9DNF9FWFRJTlRfQ09VTlRfRElWSVNPUi9JT0M0X0NBTElCUkFURV9MT1dfTUhaKQorI2RlZmluZSBJT0M0X0NBTElCUkFURV9ISUdIX0xJTUlUIFwKKwkoMTAwMCpJT0M0X0VYVElOVF9DT1VOVF9ESVZJU09SL0lPQzRfQ0FMSUJSQVRFX0hJR0hfTUhaKQorI2RlZmluZSBJT0M0X0NBTElCUkFURV9ERUZBVUxUIFwKKwkoMTAwMCpJT0M0X0VYVElOVF9DT1VOVF9ESVZJU09SL0lPQzRfQ0FMSUJSQVRFX0RFRkFVTFRfTUhaKQorCisjZGVmaW5lIElPQzRfQ0FMSUJSQVRFX0VORCBcCisJKElPQzRfQ0FMSUJSQVRFX0NZQ0xFUyArIElPQzRfQ0FMSUJSQVRFX0RJU0NBUkQpCisKKyNkZWZpbmUgSU9DNF9JTlRfT1VUX01PREVfVE9HR0xFIDB4NwkvKiBUb2dnbGUgSU5UX09VVCBldmVyeSBDT1VOVCsxIHRpY2tzICovCisKKy8qIERldGVybWluZXMgZXh0ZXJuYWwgaW50ZXJydXB0IG91dHB1dCBjbG9jayBwZXJpb2Qgb2YgdGhlIFBDSSBidXMgYW4KKyAqIElPQzQgaXMgYXR0YWNoZWQgdG8uICBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgUENJCisgKiBidXMgc3BlZWQuCisgKgorICogSU9DNCBoYXMgYSBkZXNpZ24gZmVhdHVyZSB0aGF0IHZhcmlvdXMgaW50ZXJuYWwgdGltZXJzIGFyZSBkZXJpdmVkIGZyb20KKyAqIHRoZSBQQ0kgYnVzIGNsb2NrLiAgVGhpcyBjYXVzZXMgSU9DNCBkZXZpY2UgZHJpdmVycyB0byBuZWVkIHRvIHRha2UgdGhlCisgKiBidXMgc3BlZWQgaW50byBhY2NvdW50IHdoZW4gc2V0dGluZyB2YXJpb3VzIHJlZ2lzdGVyIHZhbHVlcyAoZS5nLiBJTlRfT1VUCisgKiByZWdpc3RlciBDT1VOVCBmaWVsZCwgVUFSVCBkaXZpc29ycywgZXRjKS4gIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMKKyAqIG5lZWRlZCBieSBzZXZlcmFsIHN1YmRyaXZlcnMsIGl0IGlzIGRldGVybWluZWQgYnkgdGhlIG1haW4gSU9DNCBkcml2ZXIsCisgKiBldmVuIHRob3VnaCB0aGUgZm9sbG93aW5nIGNvZGUgdXRpbGl6ZXMgZXh0ZXJuYWwgaW50ZXJydXB0IHJlZ2lzdGVycworICogdG8gcGVyZm9ybSB0aGUgc3BlZWQgY2FsY3VsYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitpb2M0X2Nsb2NrX2NhbGlicmF0ZShzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkKQoreworCXVuaW9uIGlvYzRfaW50X291dCBpbnRfb3V0OworCXVuaW9uIGlvYzRfZ3BjciBncGNyOworCXVuc2lnbmVkIGludCBzdGF0ZSwgbGFzdF9zdGF0ZSA9IDE7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0X3RzLCBlbmRfdHM7CisJdWludDY0X3Qgc3RhcnQsIGVuZCwgcGVyaW9kOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisKKwkvKiBFbmFibGUgb3V0cHV0ICovCisJZ3Bjci5yYXcgPSAwOworCWdwY3IuZmllbGRzLmRpciA9IElPQzRfR1BDUl9ESVJfMDsKKwlncGNyLmZpZWxkcy5pbnRfb3V0X2VuID0gMTsKKwl3cml0ZWwoZ3Bjci5yYXcsICZpZGQtPmlkZF9taXNjX3JlZ3MtPmdwY3Jfcy5yYXcpOworCisJLyogUmVzZXQgdG8gcG93ZXItb24gc3RhdGUgKi8KKwl3cml0ZWwoMCwgJmlkZC0+aWRkX21pc2NfcmVncy0+aW50X291dC5yYXcpOworCW1taW93YigpOworCisJLyogU2V0IHVwIHNxdWFyZSB3YXZlICovCisJaW50X291dC5yYXcgPSAwOworCWludF9vdXQuZmllbGRzLmNvdW50ID0gSU9DNF9DQUxJQlJBVEVfQ09VTlQ7CisJaW50X291dC5maWVsZHMubW9kZSA9IElPQzRfSU5UX09VVF9NT0RFX1RPR0dMRTsKKwlpbnRfb3V0LmZpZWxkcy5kaWFnID0gMDsKKwl3cml0ZWwoaW50X291dC5yYXcsICZpZGQtPmlkZF9taXNjX3JlZ3MtPmludF9vdXQucmF3KTsKKwltbWlvd2IoKTsKKworCS8qIENoZWNrIHNxdWFyZSB3YXZlIHBlcmlvZCBhdmVyYWdlZCBvdmVyIHNvbWUgbnVtYmVyIG9mIGN5Y2xlcyAqLworCWRvIHsKKwkJaW50X291dC5yYXcgPSByZWFkbCgmaWRkLT5pZGRfbWlzY19yZWdzLT5pbnRfb3V0LnJhdyk7CisJCXN0YXRlID0gaW50X291dC5maWVsZHMuaW50X291dDsKKwkJaWYgKCFsYXN0X3N0YXRlICYmIHN0YXRlKSB7CisJCQljb3VudCsrOworCQkJaWYgKGNvdW50ID09IElPQzRfQ0FMSUJSQVRFX0VORCkgeworCQkJCWt0aW1lX2dldF90cygmZW5kX3RzKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoY291bnQgPT0gSU9DNF9DQUxJQlJBVEVfRElTQ0FSRCkKKwkJCQlrdGltZV9nZXRfdHMoJnN0YXJ0X3RzKTsKKwkJfQorCQlsYXN0X3N0YXRlID0gc3RhdGU7CisJfSB3aGlsZSAoMSk7CisKKwkvKiBDYWxjdWxhdGlvbiByZWFycmFuZ2VkIHRvIHByZXNlcnZlIGludGVybWVkaWF0ZSBwcmVjaXNpb24uCisJICogTG9naWNhbGx5OgorCSAqIDEuICJlbmQgLSBzdGFydCIgZ2l2ZXMgdXMgdGhlIG1lYXN1cmVtZW50IHBlcmlvZCBvdmVyIGFsbAorCSAqICAgIHRoZSBzcXVhcmUgd2F2ZSBjeWNsZXMuCisJICogMi4gRGl2aWRlIGJ5IG51bWJlciBvZiBzcXVhcmUgd2F2ZSBjeWNsZXMgdG8gZ2V0IHRoZSBwZXJpb2QKKwkgKiAgICBvZiBhIHNxdWFyZSB3YXZlIGN5Y2xlLgorCSAqIDMuIERpdmlkZSBieSAyKihpbnRfb3V0LmZpZWxkcy5jb3VudCsxKSwgd2hpY2ggaXMgdGhlIGZvcm11bGEKKwkgKiAgICBieSB3aGljaCB0aGUgSU9DNCBnZW5lcmF0ZXMgdGhlIHNxdWFyZSB3YXZlLCB0byBnZXQgdGhlCisJICogICAgcGVyaW9kIG9mIGFuIElPQzQgSU5UX09VVCBjb3VudC4KKwkgKi8KKwllbmQgPSBlbmRfdHMudHZfc2VjICogTlNFQ19QRVJfU0VDICsgZW5kX3RzLnR2X25zZWM7CisJc3RhcnQgPSBzdGFydF90cy50dl9zZWMgKiBOU0VDX1BFUl9TRUMgKyBzdGFydF90cy50dl9uc2VjOworCXBlcmlvZCA9IChlbmQgLSBzdGFydCkgLworCQkoSU9DNF9DQUxJQlJBVEVfQ1lDTEVTICogMiAqIChJT0M0X0NBTElCUkFURV9DT1VOVCArIDEpKTsKKworCS8qIEJvdW5kcyBjaGVjayB0aGUgcmVzdWx0LiAqLworCWlmIChwZXJpb2QgPiBJT0M0X0NBTElCUkFURV9MT1dfTElNSVQgfHwKKwkgICAgcGVyaW9kIDwgSU9DNF9DQUxJQlJBVEVfSElHSF9MSU1JVCkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiSU9DNCAlczogQ2xvY2sgY2FsaWJyYXRpb24gZmFpbGVkLiAgQXNzdW1pbmciCisJCSAgICAgICAiUENJIGNsb2NrIGlzICVkIG5zLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGlkZC0+aWRkX3BkZXYpLAorCQkgICAgICAgSU9DNF9DQUxJQlJBVEVfREVGQVVMVCAvIElPQzRfRVhUSU5UX0NPVU5UX0RJVklTT1IpOworCQlwZXJpb2QgPSBJT0M0X0NBTElCUkFURV9ERUZBVUxUOworCX0gZWxzZSB7CisJCXU2NCBucyA9IHBlcmlvZDsKKworCQlkb19kaXYobnMsIElPQzRfRVhUSU5UX0NPVU5UX0RJVklTT1IpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIklPQzQgJXM6IFBDSSBjbG9jayBpcyAlbGx1IG5zLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGlkZC0+aWRkX3BkZXYpLCAodW5zaWduZWQgbG9uZyBsb25nKW5zKTsKKwl9CisKKwkvKiBSZW1lbWJlciByZXN1bHRzLiAgV2Ugc3RvcmUgdGhlIGV4dGludCBjbG9jayBwZXJpb2QgcmF0aGVyCisJICogdGhhbiB0aGUgUENJIGNsb2NrIHBlcmlvZCBzbyB0aGF0IGdyZWF0ZXIgcHJlY2lzaW9uIGlzCisJICogcmV0YWluZWQuICBEaXZpZGUgYnkgSU9DNF9FWFRJTlRfQ09VTlRfRElWSVNPUiB0byBnZXQKKwkgKiBQQ0kgY2xvY2sgcGVyaW9kLgorCSAqLworCWlkZC0+Y291bnRfcGVyaW9kID0gcGVyaW9kOworfQorCisvKiBUaGVyZSBhcmUgdGhyZWUgdmFyaWFudHMgb2YgSU9DNCBjYXJkczogSU85LCBJTzEwLCBhbmQgUENJLVJULgorICogRWFjaCBicmluZ3Mgb3V0IGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgSU9DNCBzaWduYWxzLCB0aHVzLgorICogdGhlIElPQzQgc3ViZHJpdmVycyBuZWVkIHRvIGtub3cgdG8gd2hpY2ggd2UncmUgYXR0YWNoZWQuCisgKgorICogV2UgbG9vayBmb3IgdGhlIHByZXNlbmNlIG9mIGEgU0NTSSAoSU85KSBvciBTQVRBIChJTzEwKSBjb250cm9sbGVyCisgKiBvbiB0aGUgc2FtZSBQQ0kgYnVzIGF0IHNsb3QgbnVtYmVyIDMgdG8gZGlmZmVyZW50aWF0ZSBJTzkgZnJvbSBJTzEwLgorICogSWYgbmVpdGhlciBpcyBwcmVzZW50LCBpdCdzIGEgUENJLVJULgorICovCitzdGF0aWMgdW5zaWduZWQgaW50Citpb2M0X3ZhcmlhbnQoc3RydWN0IGlvYzRfZHJpdmVyX2RhdGEgKmlkZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKworCS8qIElPOTogTG9vayBmb3IgYSBRTG9naWMgSVNQIDEyMTYwIGF0IHRoZSBzYW1lIGJ1cyBhbmQgc2xvdCAzLiAqLworCWRvIHsKKwkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUUxPR0lDLAorCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyMTYwLCBwZGV2KTsKKwkJaWYgKHBkZXYgJiYKKwkJICAgIGlkZC0+aWRkX3BkZXYtPmJ1cy0+bnVtYmVyID09IHBkZXYtPmJ1cy0+bnVtYmVyICYmCisJCSAgICAzID09IFBDSV9TTE9UKHBkZXYtPmRldmZuKSkKKwkJCWZvdW5kID0gMTsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJfSB3aGlsZSAocGRldiAmJiAhZm91bmQpOworCWlmIChOVUxMICE9IHBkZXYpCisJCXJldHVybiBJT0M0X1ZBUklBTlRfSU85OworCisJLyogSU8xMDogTG9vayBmb3IgYSBWaXRlc3NlIFZTQyA3MTc0IGF0IHRoZSBzYW1lIGJ1cyBhbmQgc2xvdCAzLiAqLworCXBkZXYgPSBOVUxMOworCWRvIHsKKwkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklURVNTRSwKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX1ZJVEVTU0VfVlNDNzE3NCwgcGRldik7CisJCWlmIChwZGV2ICYmCisJCSAgICBpZGQtPmlkZF9wZGV2LT5idXMtPm51bWJlciA9PSBwZGV2LT5idXMtPm51bWJlciAmJgorCQkgICAgMyA9PSBQQ0lfU0xPVChwZGV2LT5kZXZmbikpCisJCQlmb3VuZCA9IDE7CisJCXBjaV9kZXZfcHV0KHBkZXYpOworCX0gd2hpbGUgKHBkZXYgJiYgIWZvdW5kKTsKKwlpZiAoTlVMTCAhPSBwZGV2KQorCQlyZXR1cm4gSU9DNF9WQVJJQU5UX0lPMTA7CisKKwkvKiBQQ0ktUlQ6IE5vIFNDU0kvU0FUQSBjb250cm9sbGVyIHdpbGwgYmUgcHJlc2VudCAqLworCXJldHVybiBJT0M0X1ZBUklBTlRfUENJX1JUOworfQorCisvKiBBZGRzIGEgbmV3IGluc3RhbmNlIG9mIGFuIElPQzQgY2FyZCAqLworc3RhdGljIGludAoraW9jNF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkOworCXN0cnVjdCBpb2M0X3N1Ym1vZHVsZSAqaXM7CisJdWludDMyX3QgcGNtZDsKKwlpbnQgcmV0OworCisJLyogRW5hYmxlIElPQzQgYW5kIHRha2Ugb3duZXJzaGlwIG9mIGl0ICovCisJaWYgKChyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gZW5hYmxlIElPQzQgZGV2aWNlIGZvciBwY2lfZGV2ICVzLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUocGRldikpOworCQlnb3RvIG91dDsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBTZXQgdXAgcGVyLUlPQzQgZGF0YSAqLworCWlkZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb2M0X2RyaXZlcl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZGQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgSU9DNCBkYXRhIGZvciBwY2lfZGV2ICVzLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUocGRldikpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9pZGQ7CisJfQorCWlkZC0+aWRkX3BkZXYgPSBwZGV2OworCWlkZC0+aWRkX3BjaV9pZCA9IHBjaV9pZDsKKworCS8qIE1hcCBJT0M0IG1pc2MgcmVnaXN0ZXJzLiAgVGhlc2UgYXJlIHNoYXJlZCBiZXR3ZWVuIHN1YmRldmljZXMKKwkgKiBzbyB0aGUgbWFpbiBJT0M0IG1vZHVsZSBtYW5hZ2VzIHRoZW0uCisJICovCisJaWRkLT5pZGRfYmFyMCA9IHBjaV9yZXNvdXJjZV9zdGFydChpZGQtPmlkZF9wZGV2LCAwKTsKKwlpZiAoIWlkZC0+aWRkX2JhcjApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBVbmFibGUgdG8gZmluZCBJT0M0IG1pc2MgcmVzb3VyY2UgIgorCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUoaWRkLT5pZGRfcGRldikpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9wY2k7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oaWRkLT5pZGRfYmFyMCwgc2l6ZW9mKHN0cnVjdCBpb2M0X21pc2NfcmVncyksCisJCQkgICAgImlvYzRfbWlzYyIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogVW5hYmxlIHRvIHJlcXVlc3QgSU9DNCBtaXNjIHJlZ2lvbiAiCisJCSAgICAgICAiZm9yIHBjaV9kZXYgJXMuXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3BjaTsKKwl9CisJaWRkLT5pZGRfbWlzY19yZWdzID0gaW9yZW1hcChpZGQtPmlkZF9iYXIwLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpb2M0X21pc2NfcmVncykpOworCWlmICghaWRkLT5pZGRfbWlzY19yZWdzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogVW5hYmxlIHRvIHJlbWFwIElPQzQgbWlzYyByZWdpb24gIgorCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUoaWRkLT5pZGRfcGRldikpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9taXNjX3JlZ2lvbjsKKwl9CisKKwkvKiBGYWlsc2FmZSBwb3J0aW9uIG9mIHBlci1JT0M0IGluaXRpYWxpemF0aW9uICovCisKKwkvKiBEZXRlY3QgY2FyZCB2YXJpYW50ICovCisJaWRkLT5pZGRfdmFyaWFudCA9IGlvYzRfdmFyaWFudChpZGQpOworCXByaW50ayhLRVJOX0lORk8gIklPQzQgJXM6ICVzIGNhcmQgZGV0ZWN0ZWQuXG4iLCBwY2lfbmFtZShwZGV2KSwKKwkgICAgICAgaWRkLT5pZGRfdmFyaWFudCA9PSBJT0M0X1ZBUklBTlRfSU85ID8gIklPOSIgOgorCSAgICAgICBpZGQtPmlkZF92YXJpYW50ID09IElPQzRfVkFSSUFOVF9QQ0lfUlQgPyAiUENJLVJUIiA6CisJICAgICAgIGlkZC0+aWRkX3ZhcmlhbnQgPT0gSU9DNF9WQVJJQU5UX0lPMTAgPyAiSU8xMCIgOiAidW5rbm93biIpOworCisJLyogSW5pdGlhbGl6ZSBJT0M0ICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlkZC0+aWRkX3BkZXYsIFBDSV9DT01NQU5ELCAmcGNtZCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpZGQtPmlkZF9wZGV2LCBQQ0lfQ09NTUFORCwKKwkJCSAgICAgICBwY21kIHwgUENJX0NPTU1BTkRfUEFSSVRZIHwgUENJX0NPTU1BTkRfU0VSUik7CisKKwkvKiBEZXRlcm1pbmUgUENJIGNsb2NrICovCisJaW9jNF9jbG9ja19jYWxpYnJhdGUoaWRkKTsKKworCS8qIERpc2FibGUvY2xlYXIgYWxsIGludGVycnVwdHMuICBOZWVkIHRvIGRvIHRoaXMgaGVyZSBsZXN0CisJICogb25lIHN1Ym1vZHVsZSByZXF1ZXN0IHRoZSBzaGFyZWQgSU9DNCBJUlEsIGJ1dCBpbnRlcnJ1cHQKKwkgKiBpcyBnZW5lcmF0ZWQgYnkgYSBkaWZmZXJlbnQgc3ViZGV2aWNlLgorCSAqLworCS8qIERpc2FibGUgKi8KKwl3cml0ZWwofjAsICZpZGQtPmlkZF9taXNjX3JlZ3MtPm90aGVyX2llYy5yYXcpOworCXdyaXRlbCh+MCwgJmlkZC0+aWRkX21pc2NfcmVncy0+c2lvX2llYyk7CisJLyogQ2xlYXIgKGkuZS4gYWNrbm93bGVkZ2UpICovCisJd3JpdGVsKH4wLCAmaWRkLT5pZGRfbWlzY19yZWdzLT5vdGhlcl9pci5yYXcpOworCXdyaXRlbCh+MCwgJmlkZC0+aWRkX21pc2NfcmVncy0+c2lvX2lyKTsKKworCS8qIFRyYWNrIFBDSS1kZXZpY2Ugc3BlY2lmaWMgZGF0YSAqLworCWlkZC0+aWRkX3NlcmlhbF9kYXRhID0gTlVMTDsKKwlwY2lfc2V0X2RydmRhdGEoaWRkLT5pZGRfcGRldiwgaWRkKTsKKworCW11dGV4X2xvY2soJmlvYzRfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmlkZC0+aWRkX2xpc3QsICZpb2M0X2RldmljZXMpOworCisJLyogQWRkIHRoaXMgSU9DNCB0byBhbGwgc3VibW9kdWxlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXMsICZpb2M0X3N1Ym1vZHVsZXMsIGlzX2xpc3QpIHsKKwkJaWYgKGlzLT5pc19wcm9iZSAmJiBpcy0+aXNfcHJvYmUoaWRkKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogSU9DNCBzdWJtb2R1bGUgMHglcyBwcm9iZSBmYWlsZWQgIgorCQkJICAgICAgICJmb3IgcGNpX2RldiAlcy5cbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBtb2R1bGVfbmFtZShpcy0+aXNfb3duZXIpLAorCQkJICAgICAgIHBjaV9uYW1lKGlkZC0+aWRkX3BkZXYpKTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmlvYzRfbXV0ZXgpOworCisJcmV0dXJuIDA7CisKK291dF9taXNjX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpZGQtPmlkZF9iYXIwLCBzaXplb2Yoc3RydWN0IGlvYzRfbWlzY19yZWdzKSk7CitvdXRfcGNpOgorCWtmcmVlKGlkZCk7CitvdXRfaWRkOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZW1vdmVzIGEgcGFydGljdWxhciBpbnN0YW5jZSBvZiBhbiBJT0M0IGNhcmQuICovCitzdGF0aWMgdm9pZAoraW9jNF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGlvYzRfc3VibW9kdWxlICppczsKKwlzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkOworCisJaWRkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogUmVtb3ZlIHRoaXMgSU9DNCBmcm9tIGFsbCBzdWJtb2R1bGVzICovCisJbXV0ZXhfbG9jaygmaW9jNF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpcywgJmlvYzRfc3VibW9kdWxlcywgaXNfbGlzdCkgeworCQlpZiAoaXMtPmlzX3JlbW92ZSAmJiBpcy0+aXNfcmVtb3ZlKGlkZCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IElPQzQgc3VibW9kdWxlIDB4JXMgcmVtb3ZlIGZhaWxlZCAiCisJCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZHVsZV9uYW1lKGlzLT5pc19vd25lciksCisJCQkgICAgICAgcGNpX25hbWUoaWRkLT5pZGRfcGRldikpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaW9jNF9tdXRleCk7CisKKwkvKiBSZWxlYXNlIHJlc291cmNlcyAqLworCWlvdW5tYXAoaWRkLT5pZGRfbWlzY19yZWdzKTsKKwlpZiAoIWlkZC0+aWRkX2JhcjApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBVbmFibGUgdG8gZ2V0IElPQzQgbWlzYyBtYXBwaW5nIGZvciBwY2lfZGV2ICVzLiAiCisJCSAgICAgICAiRGV2aWNlIHJlbW92YWwgbWF5IGJlIGluY29tcGxldGUuXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSk7CisJfQorCXJlbGVhc2VfcmVnaW9uKGlkZC0+aWRkX2JhcjAsIHNpemVvZihzdHJ1Y3QgaW9jNF9taXNjX3JlZ3MpKTsKKworCS8qIERpc2FibGUgSU9DNCBhbmQgcmVsaW5xdWlzaCAqLworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCS8qIFJlbW92ZSBhbmQgZnJlZSBkcml2ZXIgZGF0YSAqLworCW11dGV4X2xvY2soJmlvYzRfbXV0ZXgpOworCWxpc3RfZGVsKCZpZGQtPmlkZF9saXN0KTsKKwltdXRleF91bmxvY2soJmlvYzRfbXV0ZXgpOworCWtmcmVlKGlkZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpb2M0X2lkX3RhYmxlW10gPSB7CisJe1BDSV9WRU5ET1JfSURfU0dJLCBQQ0lfREVWSUNFX0lEX1NHSV9JT0M0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAweDBiNDAwMCwgMHhGRkZGRkZ9LAorCXswfQorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlvYzRfZHJpdmVyID0geworCS5uYW1lID0gIklPQzQiLAorCS5pZF90YWJsZSA9IGlvYzRfaWRfdGFibGUsCisJLnByb2JlID0gaW9jNF9wcm9iZSwKKwkucmVtb3ZlID0gaW9jNF9yZW1vdmUsCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW9jNF9pZF90YWJsZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZHVsZSBtYW5hZ2VtZW50ICoKKyAqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1vZHVsZSBsb2FkICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAoraW9jNF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlvYzRfZHJpdmVyKTsKK30KKworLyogTW9kdWxlIHVubG9hZCAqLworc3RhdGljIHZvaWQgX19kZXZleGl0Citpb2M0X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvYzRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW9jNF9pbml0KTsKK21vZHVsZV9leGl0KGlvYzRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJyZW50IENhc2F2YW50IC0gU2lsaWNvbiBHcmFwaGljcywgSW5jLiA8YmNhc2F2YW5Ac2dpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtYXN0ZXIgbW9kdWxlIGZvciBTR0kgSU9DNCBCYXNlLUlPIENhcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChpb2M0X3JlZ2lzdGVyX3N1Ym1vZHVsZSk7CitFWFBPUlRfU1lNQk9MKGlvYzRfdW5yZWdpc3Rlcl9zdWJtb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xrZHRtLmMgYi9kcml2ZXJzL21pc2MvbGtkdG0uYwppbmRleCBiYmRiYTdiLi5kYjlkN2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGtkdG0uYworKysgYi9kcml2ZXJzL21pc2MvbGtkdG0uYwpAQCAtNDQsMTIgKzQ0LDE0IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogCiAjaWZkZWYgQ09ORklHX0lERQpAQCAtMTE2LDE2ICsxMTgsMTYgQEAKIHN0YXRpYyBpbnQgY291bnQgPSBERUZBVUxUX0NPVU5UOwogCiBtb2R1bGVfcGFyYW0ocmVjdXJfY291bnQsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJlY3VyX2NvdW50LCAiUmVjdXJjaW9uIGxldmVsIGZvciB0aGUgc3RhY2sgb3ZlcmZsb3cgdGVzdCxcCi0JCQkJIGRlZmF1bHQgaXMgMTAiKTsKK01PRFVMRV9QQVJNX0RFU0MocmVjdXJfY291bnQsICIgUmVjdXJzaW9uIGxldmVsIGZvciB0aGUgc3RhY2sgb3ZlcmZsb3cgdGVzdCwgIlwKKwkJCQkgImRlZmF1bHQgaXMgMTAiKTsKIG1vZHVsZV9wYXJhbShjcG9pbnRfbmFtZSwgY2hhcnAsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhjcG9pbnRfbmFtZSwgIkNyYXNoIFBvaW50LCB3aGVyZSBrZXJuZWwgaXMgdG8gYmUgY3Jhc2hlZCIpOwotbW9kdWxlX3BhcmFtKGNwb2ludF90eXBlLCBjaGFycCwgMDY0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhjcG9pbnRfdHlwZSwgIkNyYXNoIFBvaW50IFR5cGUsIGFjdGlvbiB0byBiZSB0YWtlbiBvblwKLQkJCQloaXR0aW5nIHRoZSBjcmFzaCBwb2ludCIpOwotbW9kdWxlX3BhcmFtKGNwb2ludF9jb3VudCwgaW50LCAwNjQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNwb2ludF9jb3VudCwgIkNyYXNoIFBvaW50IENvdW50LCBudW1iZXIgb2YgdGltZXMgdGhlIFwKLQkJCQljcmFzaCBwb2ludCBpcyB0byBiZSBoaXQgdG8gdHJpZ2dlciBhY3Rpb24iKTsKK01PRFVMRV9QQVJNX0RFU0MoY3BvaW50X25hbWUsICIgQ3Jhc2ggUG9pbnQsIHdoZXJlIGtlcm5lbCBpcyB0byBiZSBjcmFzaGVkIik7Cittb2R1bGVfcGFyYW0oY3BvaW50X3R5cGUsIGNoYXJwLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY3BvaW50X3R5cGUsICIgQ3Jhc2ggUG9pbnQgVHlwZSwgYWN0aW9uIHRvIGJlIHRha2VuIG9uICJcCisJCQkJImhpdHRpbmcgdGhlIGNyYXNoIHBvaW50Iik7Cittb2R1bGVfcGFyYW0oY3BvaW50X2NvdW50LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjcG9pbnRfY291bnQsICIgQ3Jhc2ggUG9pbnQgQ291bnQsIG51bWJlciBvZiB0aW1lcyB0aGUgIlwKKwkJCQkiY3Jhc2ggcG9pbnQgaXMgdG8gYmUgaGl0IHRvIHRyaWdnZXIgYWN0aW9uIik7CiAKIHVuc2lnbmVkIGludCBqcF9kb19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKQEAgLTE1NSw4ICsxNTcsOCBAQAogCiBzdHJ1Y3Qgc2Nhbl9jb250cm9sOwogCi11bnNpZ25lZCBsb25nIGpwX3Nocmlua19wYWdlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqcGFnZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQordW5zaWduZWQgbG9uZyBqcF9zaHJpbmtfaW5hY3RpdmVfbGlzdCh1bnNpZ25lZCBsb25nIG1heF9zY2FuLAorCQkJCXN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIHsKIAlsa2R0bV9oYW5kbGVyKCk7CiAJanByb2JlX3JldHVybigpOwpAQCAtMjk1LDggKzI5Nyw4IEBACiAJCWxrZHRtLmVudHJ5ID0gKGtwcm9iZV9vcGNvZGVfdCopIGpwX2xsX3J3X2Jsb2NrOwogCQlicmVhazsKIAljYXNlIE1FTV9TV0FQT1VUOgotCQlsa2R0bS5rcC5zeW1ib2xfbmFtZSA9ICJzaHJpbmtfcGFnZV9saXN0IjsKLQkJbGtkdG0uZW50cnkgPSAoa3Byb2JlX29wY29kZV90KikganBfc2hyaW5rX3BhZ2VfbGlzdDsKKwkJbGtkdG0ua3Auc3ltYm9sX25hbWUgPSAic2hyaW5rX2luYWN0aXZlX2xpc3QiOworCQlsa2R0bS5lbnRyeSA9IChrcHJvYmVfb3Bjb2RlX3QqKSBqcF9zaHJpbmtfaW5hY3RpdmVfbGlzdDsKIAkJYnJlYWs7CiAJY2FzZSBUSU1FUkFERDoKIAkJbGtkdG0ua3Auc3ltYm9sX25hbWUgPSAiaHJ0aW1lcl9zdGFydCI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbXNpLWxhcHRvcC5jIGIvZHJpdmVycy9taXNjL21zaS1sYXB0b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGI3MTUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL21zaS1sYXB0b3AuYwpAQCAtMCwwICsxLDM5NSBAQAorLyotKi1saW51eC1jLSotKi8KKworLyoKKyAgQ29weXJpZ2h0IChDKSAyMDA2IExlbm5hcnQgUG9ldHRlcmluZyA8bXp4cmVhcnkgKGF0KSAwcG9pbnRlciAoZG90KSBkZT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoKKyAqIG1zaS1sYXB0b3AuYyAtIE1TSSBTMjcwIGxhcHRvcCBzdXBwb3J0LiBUaGlzIGxhcHRvcCBpcyBzb2xkIHVuZGVyCisgKiB2YXJpb3VzIGJyYW5kcywgaW5jbHVkaW5nICJDeXRyb24vVENNL01lZGlvbi9UY2hpYm8gTUQ5NjEwMCIuCisgKgorICogVGhpcyBkcml2ZXIgZXhwb3J0cyBhIGZldyBmaWxlcyBpbiAvc3lzL2RldmljZXMvcGxhdGZvcm0vbXNpLWxhcHRvcC1wZi86CisgKgorICogICBsY2RfbGV2ZWwgLSBTY3JlZW4gYnJpZ2h0bmVzczogY29udGFpbnMgYSBzaW5nbGUgaW50ZWdlciBpbiB0aGUKKyAqICAgcmFuZ2UgMC4uOC4gKHJ3KQorICoKKyAqICAgYXV0b19icmlnaHRuZXNzIC0gRW5hYmxlIGF1dG9tYXRpYyBicmlnaHRuZXNzIGNvbnRyb2w6IGNvbnRhaW5zCisgKiAgIGVpdGhlciAwIG9yIDEuIElmIHNldCB0byAxIHRoZSBoYXJkd2FyZSBhZGp1c3RzIHRoZSBzY3JlZW4KKyAqICAgYnJpZ2h0bmVzcyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBvd2VyIGNvcmQgaXMKKyAqICAgcGx1Z2dlZC91bnBsdWdnZWQuIChydykKKyAqCisgKiAgIHdsYW4gLSBXTEFOIHN1YnN5c3RlbSBlbmFibGVkOiBjb250YWlucyBlaXRoZXIgMCBvciAxLiAocm8pCisgKgorICogICBibHVldG9vdGggLSBCbHVldG9vdGggc3Vic3lzdGVtIGVuYWJsZWQ6IGNvbnRhaW5zIGVpdGhlciAwIG9yIDEKKyAqICAgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGZpbGUgaXMgY29uc3RhbnRseSAwIGlmIG5vIEJsdWV0b290aAorICogICBoYXJkd2FyZSBpcyBhdmFpbGFibGUuIChybykKKyAqCisgKiBJbiBhZGRpdGlvbiB0byB0aGVzZSBwbGF0Zm9ybSBkZXZpY2UgYXR0cmlidXRlcyB0aGUgZHJpdmVyCisgKiByZWdpc3RlcnMgaXRzZWxmIGluIHRoZSBMaW51eCBiYWNrbGlnaHQgY29udHJvbCBzdWJzeXN0ZW0gYW5kIGlzCisgKiBhdmFpbGFibGUgdG8gdXNlcnNwYWNlIHVuZGVyIC9zeXMvY2xhc3MvYmFja2xpZ2h0L21zaS1sYXB0b3AtYmwvLgorICoKKyAqIFRoaXMgZHJpdmVyIG1pZ2h0IHdvcmsgb24gb3RoZXIgbGFwdG9wcyBwcm9kdWNlZCBieSBNU0kuIElmIHlvdQorICogd2FudCB0byB0cnkgaXQgeW91IGNhbiBwYXNzIGZvcmNlPTEgYXMgYXJndW1lbnQgdG8gdGhlIG1vZHVsZSB3aGljaAorICogd2lsbCBmb3JjZSBpdCB0byBsb2FkIGV2ZW4gd2hlbiB0aGUgRE1JIGRhdGEgZG9lc24ndCBpZGVudGlmeSB0aGUKKyAqIGxhcHRvcCBhcyBNU0kgUzI3MC4gWU1NVi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPgorCisjZGVmaW5lIE1TSV9EUklWRVJfVkVSU0lPTiAiMC41IgorCisjZGVmaW5lIE1TSV9MQ0RfTEVWRUxfTUFYIDkKKworI2RlZmluZSBNU0lfRUNfQ09NTUFORF9XSVJFTEVTUyAweDEwCisjZGVmaW5lIE1TSV9FQ19DT01NQU5EX0xDRF9MRVZFTCAweDExCisKK3N0YXRpYyBpbnQgZm9yY2U7Cittb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZSwgIkZvcmNlIGRyaXZlciBsb2FkLCBpZ25vcmUgRE1JIGRhdGEiKTsKKworc3RhdGljIGludCBhdXRvX2JyaWdodG5lc3M7Cittb2R1bGVfcGFyYW0oYXV0b19icmlnaHRuZXNzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhdXRvX2JyaWdodG5lc3MsICJFbmFibGUgYXV0b21hdGljIGJyaWdodG5lc3MgY29udHJvbCAoMDogZGlzYWJsZWQ7IDE6IGVuYWJsZWQ7IDI6IGRvbid0IHRvdWNoKSIpOworCisvKiBIYXJkd2FyZSBhY2Nlc3MgKi8KKworc3RhdGljIGludCBzZXRfbGNkX2xldmVsKGludCBsZXZlbCkKK3sKKwl1OCBidWZbMl07CisKKwlpZiAobGV2ZWwgPCAwIHx8IGxldmVsID49IE1TSV9MQ0RfTEVWRUxfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZlswXSA9IDB4ODA7CisJYnVmWzFdID0gKHU4KSAobGV2ZWwqMzEpOworCisJcmV0dXJuIGVjX3RyYW5zYWN0aW9uKE1TSV9FQ19DT01NQU5EX0xDRF9MRVZFTCwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2xjZF9sZXZlbCh2b2lkKQoreworCXU4IHdkYXRhID0gMCwgcmRhdGE7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGVjX3RyYW5zYWN0aW9uKE1TSV9FQ19DT01NQU5EX0xDRF9MRVZFTCwgJndkYXRhLCAxLCAmcmRhdGEsIDEpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJcmV0dXJuIChpbnQpIHJkYXRhIC8gMzE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2F1dG9fYnJpZ2h0bmVzcyh2b2lkKQoreworCXU4IHdkYXRhID0gNCwgcmRhdGE7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGVjX3RyYW5zYWN0aW9uKE1TSV9FQ19DT01NQU5EX0xDRF9MRVZFTCwgJndkYXRhLCAxLCAmcmRhdGEsIDEpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJcmV0dXJuICEhKHJkYXRhICYgOCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2F1dG9fYnJpZ2h0bmVzcyhpbnQgZW5hYmxlKQoreworCXU4IHdkYXRhWzJdLCByZGF0YTsKKwlpbnQgcmVzdWx0OworCisJd2RhdGFbMF0gPSA0OworCisJcmVzdWx0ID0gZWNfdHJhbnNhY3Rpb24oTVNJX0VDX0NPTU1BTkRfTENEX0xFVkVMLCB3ZGF0YSwgMSwgJnJkYXRhLCAxKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXdkYXRhWzBdID0gMHg4NDsKKwl3ZGF0YVsxXSA9IChyZGF0YSAmIDB4RjcpIHwgKGVuYWJsZSA/IDggOiAwKTsKKworCXJldHVybiBlY190cmFuc2FjdGlvbihNU0lfRUNfQ09NTUFORF9MQ0RfTEVWRUwsIHdkYXRhLCAyLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBnZXRfd2lyZWxlc3Nfc3RhdGUoaW50ICp3bGFuLCBpbnQgKmJsdWV0b290aCkKK3sKKwl1OCB3ZGF0YSA9IDAsIHJkYXRhOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBlY190cmFuc2FjdGlvbihNU0lfRUNfQ09NTUFORF9XSVJFTEVTUywgJndkYXRhLCAxLCAmcmRhdGEsIDEpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAod2xhbikKKwkJKndsYW4gPSAhIShyZGF0YSAmIDgpOworCisJaWYgKGJsdWV0b290aCkKKwkJKmJsdWV0b290aCA9ICEhKHJkYXRhICYgMTI4KTsKKworCXJldHVybiAwOworfQorCisvKiBCYWNrbGlnaHQgZGV2aWNlIHN0dWZmICovCisKK3N0YXRpYyBpbnQgYmxfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmIpCit7CisJcmV0dXJuIGdldF9sY2RfbGV2ZWwoKTsKK30KKworCitzdGF0aWMgaW50IGJsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmIpCit7CisJcmV0dXJuIHNldF9sY2RfbGV2ZWwoYi0+cHJvcHMtPmJyaWdodG5lc3MpOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIG1zaWJsX3Byb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZ2V0X2JyaWdodG5lc3MgPSBibF9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cyAgPSBibF91cGRhdGVfc3RhdHVzLAorCS5tYXhfYnJpZ2h0bmVzcyA9IE1TSV9MQ0RfTEVWRUxfTUFYLTEsCit9OworCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKm1zaWJsX2RldmljZTsKKworLyogUGxhdGZvcm0gZGV2aWNlICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfd2xhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKworCWludCByZXQsIGVuYWJsZWQ7CisKKwlyZXQgPSBnZXRfd2lyZWxlc3Nfc3RhdGUoJmVuYWJsZWQsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIGVuYWJsZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2JsdWV0b290aChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKworCWludCByZXQsIGVuYWJsZWQ7CisKKwlyZXQgPSBnZXRfd2lyZWxlc3Nfc3RhdGUoTlVMTCwgJmVuYWJsZWQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIGVuYWJsZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2xjZF9sZXZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfbGNkX2xldmVsKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgcmV0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfbGNkX2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisKKwlpbnQgbGV2ZWwsIHJldDsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmbGV2ZWwpICE9IDEgfHwgKGxldmVsIDwgMCB8fCBsZXZlbCA+PSBNU0lfTENEX0xFVkVMX01BWCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gc2V0X2xjZF9sZXZlbChsZXZlbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYXV0b19icmlnaHRuZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCisJaW50IHJldDsKKworCXJldCA9IGdldF9hdXRvX2JyaWdodG5lc3MoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCByZXQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9hdXRvX2JyaWdodG5lc3Moc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKworCWludCBlbmFibGUsIHJldDsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmZW5hYmxlKSAhPSAxIHx8IChlbmFibGUgIT0gKGVuYWJsZSAmIDEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBzZXRfYXV0b19icmlnaHRuZXNzKGVuYWJsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihsY2RfbGV2ZWwsIDA2NDQsIHNob3dfbGNkX2xldmVsLCBzdG9yZV9sY2RfbGV2ZWwpOworc3RhdGljIERFVklDRV9BVFRSKGF1dG9fYnJpZ2h0bmVzcywgMDY0NCwgc2hvd19hdXRvX2JyaWdodG5lc3MsIHN0b3JlX2F1dG9fYnJpZ2h0bmVzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmx1ZXRvb3RoLCAwNDQ0LCBzaG93X2JsdWV0b290aCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIod2xhbiwgMDQ0NCwgc2hvd193bGFuLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1zaXBmX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfbGNkX2xldmVsLmF0dHIsCisJJmRldl9hdHRyX2F1dG9fYnJpZ2h0bmVzcy5hdHRyLAorCSZkZXZfYXR0cl9ibHVldG9vdGguYXR0ciwKKwkmZGV2X2F0dHJfd2xhbi5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1zaXBmX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBtc2lwZl9hdHRyaWJ1dGVzCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc2lwZl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNpLWxhcHRvcC1wZiIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptc2lwZl9kZXZpY2U7CisKKy8qIEluaXRpYWxpemF0aW9uICovCisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIG1zaV9kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5pZGVudCA9ICJNU0kgUzI3MCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTUlDUk8tU1RBUiBJTlQnTCBDTy4sTFREIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1TLTEwMTMiKSwKKwkJfQorCX0sCisJeworCQkuaWRlbnQgPSAiTWVkaW9uIE1EOTYxMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk5PVEVCT09LIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlNBTTIwMDAiKSwKKwkJfQorCX0sCisJeyB9Cit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG1zaV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghZm9yY2UgJiYgIWRtaV9jaGVja19zeXN0ZW0obXNpX2RtaV90YWJsZSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGF1dG9fYnJpZ2h0bmVzcyA8IDAgfHwgYXV0b19icmlnaHRuZXNzID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSZWdpc3RlciBiYWNrbGlnaHQgc3R1ZmYgKi8KKworCW1zaWJsX2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoIm1zaS1sYXB0b3AtYmwiLCBOVUxMLCAmbXNpYmxfcHJvcHMpOworCWlmIChJU19FUlIobXNpYmxfZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIobXNpYmxfZGV2aWNlKTsKKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNpcGZfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfYmFja2xpZ2h0OworCisJLyogUmVnaXN0ZXIgcGxhdGZvcm0gc3R1ZmYgKi8KKworCW1zaXBmX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygibXNpLWxhcHRvcC1wZiIsIC0xKTsKKwlpZiAoIW1zaXBmX2RldmljZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfcGxhdGZvcm1fZHJpdmVyOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQobXNpcGZfZGV2aWNlKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfcGxhdGZvcm1fZGV2aWNlMTsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmbXNpcGZfZGV2aWNlLT5kZXYua29iaiwgJm1zaXBmX2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RldmljZTI7CisKKwkvKiBEaXNhYmxlIGF1dG9tYXRpYyBicmlnaHRuZXNzIGNvbnRyb2wgYnkgZGVmYXVsdCBiZWNhdXNlCisJICogdGhpcyBtb2R1bGUgd2FzIHByb2JhYmx5IGxvYWRlZCB0byBkbyBicmlnaHRuZXNzIGNvbnRyb2wgaW4KKwkgKiBzb2Z0d2FyZS4gKi8KKworCWlmIChhdXRvX2JyaWdodG5lc3MgIT0gMikKKwkJc2V0X2F1dG9fYnJpZ2h0bmVzcyhhdXRvX2JyaWdodG5lc3MpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibXNpLWxhcHRvcDogZHJpdmVyICJNU0lfRFJJVkVSX1ZFUlNJT04iIHN1Y2Nlc3NmdWxseSBsb2FkZWQuXG4iKTsKKworCXJldHVybiAwOworCitmYWlsX3BsYXRmb3JtX2RldmljZTI6CisKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKG1zaXBmX2RldmljZSk7CisKK2ZhaWxfcGxhdGZvcm1fZGV2aWNlMToKKworCXBsYXRmb3JtX2RldmljZV9wdXQobXNpcGZfZGV2aWNlKTsKKworZmFpbF9wbGF0Zm9ybV9kcml2ZXI6CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNpcGZfZHJpdmVyKTsKKworZmFpbF9iYWNrbGlnaHQ6CisKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIobXNpYmxfZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc2lfY2xlYW51cCh2b2lkKQoreworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZtc2lwZl9kZXZpY2UtPmRldi5rb2JqLCAmbXNpcGZfYXR0cmlidXRlX2dyb3VwKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihtc2lwZl9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc2lwZl9kcml2ZXIpOworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihtc2libF9kZXZpY2UpOworCisJLyogRW5hYmxlIGF1dG9tYXRpYyBicmlnaHRuZXNzIGNvbnRyb2wgYWdhaW4gKi8KKwlpZiAoYXV0b19icmlnaHRuZXNzICE9IDIpCisJCXNldF9hdXRvX2JyaWdodG5lc3MoMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJtc2ktbGFwdG9wOiBkcml2ZXIgdW5sb2FkZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQobXNpX2luaXQpOworbW9kdWxlX2V4aXQobXNpX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJMZW5uYXJ0IFBvZXR0ZXJpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVNJIExhcHRvcCBTdXBwb3J0Iik7CitNT0RVTEVfVkVSU0lPTihNU0lfRFJJVkVSX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jIGIvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jCmluZGV4IDFiYTg3NTQuLjJhYjdhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYworKysgYi9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMKQEAgLTMzLDkgKzMzLDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm0tPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgdGlmbV83eHgxX3JlbW92ZV9tZWRpYSh2b2lkICphZGFwdGVyKQorc3RhdGljIHZvaWQgdGlmbV83eHgxX3JlbW92ZV9tZWRpYShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHRpZm1fYWRhcHRlciAqZm0gPSBhZGFwdGVyOworCXN0cnVjdCB0aWZtX2FkYXB0ZXIgKmZtID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0aWZtX2FkYXB0ZXIsIG1lZGlhX3JlbW92ZXIpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNudDsKIAlzdHJ1Y3QgdGlmbV9kZXYgKnNvY2s7CkBAIC0xNjksOSArMTcwLDEwIEBACiAJcmV0dXJuIGJhc2VfYWRkciArICgoc29ja19udW0gKyAxKSA8PCAxMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHRpZm1fN3h4MV9pbnNlcnRfbWVkaWEodm9pZCAqYWRhcHRlcikKK3N0YXRpYyB2b2lkIHRpZm1fN3h4MV9pbnNlcnRfbWVkaWEoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB0aWZtX2FkYXB0ZXIgKmZtID0gYWRhcHRlcjsKKwlzdHJ1Y3QgdGlmbV9hZGFwdGVyICpmbSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdGlmbV9hZGFwdGVyLCBtZWRpYV9pbnNlcnRlcik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl0aWZtX21lZGlhX2lkIG1lZGlhX2lkOwogCWNoYXIgKmNhcmRfbmFtZSA9ICJ4eCI7CkBAIC0yNjEsNyArMjYzLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbS0+bG9jaywgZmxhZ3MpOwogCWZsdXNoX3dvcmtxdWV1ZShmbS0+d3EpOwogCi0JdGlmbV83eHgxX3JlbW92ZV9tZWRpYShmbSk7CisJdGlmbV83eHgxX3JlbW92ZV9tZWRpYSgmZm0tPm1lZGlhX3JlbW92ZXIpOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EM2hvdCk7CiAgICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShkZXYpOwpAQCAtMzI4LDggKzMzMCw4IEBACiAJaWYgKCFmbS0+c29ja2V0cykKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAKLQlJTklUX1dPUksoJmZtLT5tZWRpYV9pbnNlcnRlciwgdGlmbV83eHgxX2luc2VydF9tZWRpYSwgZm0pOwotCUlOSVRfV09SSygmZm0tPm1lZGlhX3JlbW92ZXIsIHRpZm1fN3h4MV9yZW1vdmVfbWVkaWEsIGZtKTsKKwlJTklUX1dPUksoJmZtLT5tZWRpYV9pbnNlcnRlciwgdGlmbV83eHgxX2luc2VydF9tZWRpYSk7CisJSU5JVF9XT1JLKCZmbS0+bWVkaWFfcmVtb3ZlciwgdGlmbV83eHgxX3JlbW92ZV9tZWRpYSk7CiAJZm0tPmVqZWN0ID0gdGlmbV83eHgxX2VqZWN0OwogCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIGZtKTsKIApAQCAtMzg0LDcgKzM4Niw3IEBACiAKIAlmbHVzaF93b3JrcXVldWUoZm0tPndxKTsKIAotCXRpZm1fN3h4MV9yZW1vdmVfbWVkaWEoZm0pOworCXRpZm1fN3h4MV9yZW1vdmVfbWVkaWEoJmZtLT5tZWRpYV9yZW1vdmVyKTsKIAogCXdyaXRlbChUSUZNX0lSUV9TRVRBTEwsIGZtLT5hZGRyICsgRk1fQ0xFQVJfSU5URVJSVVBUX0VOQUJMRSk7CiAJZnJlZV9pcnEoZGV2LT5pcnEsIGZtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYyBiL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYwppbmRleCBlZTMyNjEzLi5kNjFkZjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMKKysrIGIvZHJpdmVycy9taXNjL3RpZm1fY29yZS5jCkBAIC0yMTksOCArMjE5LDkgQEAKIAlzdHJ1Y3QgdGlmbV9kcml2ZXIgKmRydiA9IGZtX2Rldi0+ZHJ2OwogCiAJaWYgKGRydikgewotCQlpZiAoZHJ2LT5yZW1vdmUpIGRydi0+cmVtb3ZlKGZtX2Rldik7Ci0JCWZtX2Rldi0+ZHJ2ID0gMDsKKwkJaWYgKGRydi0+cmVtb3ZlKQorCQkJZHJ2LT5yZW1vdmUoZm1fZGV2KTsKKwkJZm1fZGV2LT5kcnYgPSBOVUxMOwogCX0KIAogCXB1dF9kZXZpY2UoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL0tjb25maWcgYi9kcml2ZXJzL21tYy9LY29uZmlnCmluZGV4IGVhNDE4NTIuLjQyMjQ2ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvS2NvbmZpZwpAQCAtNDAsNyArNDAsNyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIE1NQ19QWEEKLQl0cmlzdGF0ZSAiSW50ZWwgUFhBMjU1IE11bHRpbWVkaWEgQ2FyZCBJbnRlcmZhY2Ugc3VwcG9ydCIKKwl0cmlzdGF0ZSAiSW50ZWwgUFhBMjV4LzI2eC8yN3ggTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9QWEEgJiYgTU1DCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBJbnRlbChSKSBQWEEoUikgTXVsdGltZWRpYSBjYXJkIEludGVyZmFjZS4KQEAgLTkxLDExICs5MSwxMSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgTU1DX0FUOTFSTTkyMDAKLQl0cmlzdGF0ZSAiQVQ5MVJNOTIwMCBTRC9NTUMgQ2FyZCBJbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfQVQ5MVJNOTIwMCAmJiBNTUMKK2NvbmZpZyBNTUNfQVQ5MQorCXRyaXN0YXRlICJBVDkxIFNEL01NQyBDYXJkIEludGVyZmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9BVDkxICYmIE1NQwogCWhlbHAKLQkgIFRoaXMgc2VsZWN0cyB0aGUgQVQ5MVJNOTIwMCBNQ0kgY29udHJvbGxlci4KKwkgIFRoaXMgc2VsZWN0cyB0aGUgQVQ5MSBNQ0kgY29udHJvbGxlci4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvTWFrZWZpbGUgYi9kcml2ZXJzL21tYy9NYWtlZmlsZQppbmRleCBhY2ZkNGRlLi44M2ZmYjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21tYy9NYWtlZmlsZQpAQCAtMjIsNyArMjIsNyBAQAogb2JqLSQoQ09ORklHX01NQ19XQlNEKQkJKz0gd2JzZC5vCiBvYmotJChDT05GSUdfTU1DX0FVMVgpCQkrPSBhdTF4bW1jLm8KIG9iai0kKENPTkZJR19NTUNfT01BUCkJCSs9IG9tYXAubwotb2JqLSQoQ09ORklHX01NQ19BVDkxUk05MjAwKQkrPSBhdDkxX21jaS5vCitvYmotJChDT05GSUdfTU1DX0FUOTEpCQkrPSBhdDkxX21jaS5vCiBvYmotJChDT05GSUdfTU1DX1RJRk1fU0QpCSs9IHRpZm1fc2QubwogCiBtbWNfY29yZS15IDo9IG1tYy5vIG1tY19zeXNmcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9hdDkxX21jaS5jIGIvZHJpdmVycy9tbWMvYXQ5MV9tY2kuYwppbmRleCA0OTRiMjNmLi4wOGEzM2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9hdDkxX21jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2F0OTFfbWNpLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2RyaXZlcnMvbW1jL2F0OTFfbWNpLmMgLSBBVE1FTCBBVDkxUk05MjAwIE1DSSBEcml2ZXIKKyAqICBsaW51eC9kcml2ZXJzL21tYy9hdDkxX21jaS5jIC0gQVRNRUwgQVQ5MSBNQ0kgRHJpdmVyCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNSBDb3VnYXIgQ3JlZWsgQ29tcHV0aW5nIERldmljZXMgTHRkLCBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKgpAQCAtMTEsNyArMTEsNyBAQAogICovCiAKIC8qCi0gICBUaGlzIGlzIHRoZSBBVDkxUk05MjAwIE1DSSBkcml2ZXIgdGhhdCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBib3RoIE1NQyBjYXJkcworICAgVGhpcyBpcyB0aGUgQVQ5MSBNQ0kgZHJpdmVyIHRoYXQgaGFzIGJlZW4gdGVzdGVkIHdpdGggYm90aCBNTUMgY2FyZHMKICAgIGFuZCBTRC1jYXJkcy4gIEJvYXJkcyB0aGF0IHN1cHBvcnQgd3JpdGUgcHJvdGVjdCBhcmUgbm93IHN1cHBvcnRlZC4KICAgIFRoZSBDQ0FUOTFTQkMwMDEgYm9hcmQgZG9lcyBub3Qgc3VwcG9ydCBTRCBjYXJkcy4KIApAQCAtMzgsOCArMzgsOCBAQAogICAgICBjb250cm9sbGVyIHRvIG1hbmFnZSB0aGUgdHJhbnNmZXJzLgogCiAgICAgIEEgcmVhZCBpcyBkb25lIGZyb20gdGhlIGNvbnRyb2xsZXIgZGlyZWN0bHkgdG8gdGhlIHNjYXR0ZXJsaXN0IHBhc3NlZCBpbiBmcm9tIHRoZSByZXF1ZXN0LgotICAgICBEdWUgdG8gYSBidWcgaW4gdGhlIGNvbnRyb2xsZXIsIHdoZW4gYSByZWFkIGlzIGNvbXBsZXRlZCwgYWxsIHRoZSB3b3JkcyBhcmUgYnl0ZQotICAgICBzd2FwcGVkIGluIHRoZSBzY2F0dGVybGlzdCBidWZmZXJzLgorICAgICBEdWUgdG8gYSBidWcgaW4gdGhlIEFUOTFSTTkyMDAgY29udHJvbGxlciwgd2hlbiBhIHJlYWQgaXMgY29tcGxldGVkLCBhbGwgdGhlIHdvcmRzIGFyZSBieXRlCisgICAgIHN3YXBwZWQgaW4gdGhlIHNjYXR0ZXJsaXN0IGJ1ZmZlcnMuICBBVDkxU0FNOTI2eCBhcmUgbm90IGFmZmVjdGVkIGJ5IHRoaXMgYnVnLgogCiAgICAgIFRoZSBzZXF1ZW5jZSBvZiByZWFkIGludGVycnVwdHMgaXM6IEVORFJYLCBSWEJVRkYsIENNRFJEWQogCkBAIC03Miw0MiArNzIsMjcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbW1jLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MXJtOTIwMF9tY2kuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9hdDkxcm05MjAwX3BkYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfbWNpLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9wZGMuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYXQ5MV9tY2kiCiAKICN1bmRlZglTVVBQT1JUXzRXSVJFCiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICptY2lfY2xrOworI2RlZmluZSBGTF9TRU5UX0NPTU1BTkQJKDEgPDwgMCkKKyNkZWZpbmUgRkxfU0VOVF9TVE9QCSgxIDw8IDEpCiAKLSNkZWZpbmUgRkxfU0VOVF9DT01NQU5EICgxIDw8IDApCi0jZGVmaW5lIEZMX1NFTlRfU1RPUCAoMSA8PCAxKQorI2RlZmluZSBBVDkxX01DSV9FUlJPUlMJKEFUOTFfTUNJX1JJTkRFIHwgQVQ5MV9NQ0lfUkRJUkUgfCBBVDkxX01DSV9SQ1JDRQlcCisJCXwgQVQ5MV9NQ0lfUkVOREUgfCBBVDkxX01DSV9SVE9FIHwgQVQ5MV9NQ0lfRENSQ0UJCVwKKwkJfCBBVDkxX01DSV9EVE9FIHwgQVQ5MV9NQ0lfT1ZSRSB8IEFUOTFfTUNJX1VOUkUpCQkJCiAKKyNkZWZpbmUgYXQ5MV9tY2lfcmVhZChob3N0LCByZWcpCV9fcmF3X3JlYWRsKChob3N0KS0+YmFzZWFkZHIgKyAocmVnKSkKKyNkZWZpbmUgYXQ5MV9tY2lfd3JpdGUoaG9zdCwgcmVnLCB2YWwpCV9fcmF3X3dyaXRlbCgodmFsKSwgKGhvc3QpLT5iYXNlYWRkciArIChyZWcpKQogCiAKIC8qCi0gKiBSZWFkIGZyb20gYSBNQ0kgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxX21jaV9yZWFkKHVuc2lnbmVkIGludCByZWcpCi17Ci0Jdm9pZCBfX2lvbWVtICptY2lfYmFzZSA9ICh2b2lkIF9faW9tZW0gKilBVDkxX1ZBX0JBU0VfTUNJOwotCi0JcmV0dXJuIF9fcmF3X3JlYWRsKG1jaV9iYXNlICsgcmVnKTsKLX0KLQotLyoKLSAqIFdyaXRlIHRvIGEgTUNJIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYXQ5MV9tY2lfd3JpdGUodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLSAgICAgICAgdm9pZCBfX2lvbWVtICptY2lfYmFzZSA9ICh2b2lkIF9faW9tZW0gKilBVDkxX1ZBX0JBU0VfTUNJOwotCi0gICAgICAgIF9fcmF3X3dyaXRlbCh2YWx1ZSwgbWNpX2Jhc2UgKyByZWcpOwotfQotCi0vKgogICogTG93IGxldmVsIHR5cGUgZm9yIHRoaXMgZHJpdmVyCiAgKi8KIHN0cnVjdCBhdDkxbWNpX2hvc3QKQEAgLTExNiw5ICsxMDEsMTQgQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsKIAlzdHJ1Y3QgbW1jX3JlcXVlc3QgKnJlcXVlc3Q7CiAKKwl2b2lkIF9faW9tZW0gKmJhc2VhZGRyOworCWludCBpcnE7CisKIAlzdHJ1Y3QgYXQ5MV9tbWNfZGF0YSAqYm9hcmQ7CiAJaW50IHByZXNlbnQ7CiAKKwlzdHJ1Y3QgY2xrICptY2lfY2xrOworCiAJLyoKIAkgKiBGbGFnIGluZGljYXRpbmcgd2hlbiB0aGUgY29tbWFuZCBoYXMgYmVlbiBzZW50LiBUaGlzIGlzIHVzZWQgdG8KIAkgKiB3b3JrIG91dCB3aGV0aGVyIG9yIG5vdCB0byBzZW5kIHRoZSBzdG9wCkBAIC0xNTgsNyArMTQ4LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKIAkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAkJaW50IGFtb3VudDsKLQkJaW50IGluZGV4OwogCQl1bnNpZ25lZCBpbnQgKnNnYnVmZmVyOwogCiAJCXNnID0gJmRhdGEtPnNnW2ldOwpAQCAtMTY2LDEwICsxNTUsMTUgQEAKIAkJc2didWZmZXIgPSBrbWFwX2F0b21pYyhzZy0+cGFnZSwgS01fQklPX1NSQ19JUlEpICsgc2ctPm9mZnNldDsKIAkJYW1vdW50ID0gbWluKHNpemUsIHNnLT5sZW5ndGgpOwogCQlzaXplIC09IGFtb3VudDsKLQkJYW1vdW50IC89IDQ7CiAKLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYW1vdW50OyBpbmRleCsrKQotCQkJKmRtYWJ1ZisrID0gc3dhYjMyKHNnYnVmZmVyW2luZGV4XSk7CisJCWlmIChjcHVfaXNfYXQ5MXJtOTIwMCgpKSB7CS8qIEFUOTFSTTkyMDAgZXJyYXRhICovCisJCQlpbnQgaW5kZXg7CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IChhbW91bnQgLyA0KTsgaW5kZXgrKykKKwkJCQkqZG1hYnVmKysgPSBzd2FiMzIoc2didWZmZXJbaW5kZXhdKTsKKwkJfQorCQllbHNlCisJCQltZW1jcHkoZG1hYnVmLCBzZ2J1ZmZlciwgYW1vdW50KTsKIAogCQlrdW5tYXBfYXRvbWljKHNnYnVmZmVyLCBLTV9CSU9fU1JDX0lSUSk7CiAKQEAgLTIxNywxMyArMjExLDEzIEBACiAKIAkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgbmVlZHMgZmlsbGluZyAqLwogCQlpZiAoaSA9PSAwKSB7Ci0JCQlpZiAoYXQ5MV9tY2lfcmVhZChBVDkxX1BEQ19SQ1IpICE9IDApIHsKKwkJCWlmIChhdDkxX21jaV9yZWFkKGhvc3QsIEFUOTFfUERDX1JDUikgIT0gMCkgewogCQkJCXByX2RlYnVnKCJUcmFuc2ZlciBhY3RpdmUgaW4gY3VycmVudFxuIik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KIAkJZWxzZSB7Ci0JCQlpZiAoYXQ5MV9tY2lfcmVhZChBVDkxX1BEQ19STkNSKSAhPSAwKSB7CisJCQlpZiAoYXQ5MV9tY2lfcmVhZChob3N0LCBBVDkxX1BEQ19STkNSKSAhPSAwKSB7CiAJCQkJcHJfZGVidWcoIlRyYW5zZmVyIGFjdGl2ZSBpbiBuZXh0XG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTI0MCwxMiArMjM0LDEyIEBACiAJCXByX2RlYnVnKCJkbWEgYWRkcmVzcyA9ICUwOFgsIGxlbmd0aCA9ICVkXG4iLCBzZy0+ZG1hX2FkZHJlc3MsIHNnLT5sZW5ndGgpOwogCiAJCWlmIChpID09IDApIHsKLQkJCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1JQUiwgc2ctPmRtYV9hZGRyZXNzKTsKLQkJCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1JDUiwgc2ctPmxlbmd0aCAvIDQpOworCQkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9QRENfUlBSLCBzZy0+ZG1hX2FkZHJlc3MpOworCQkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9QRENfUkNSLCBzZy0+bGVuZ3RoIC8gNCk7CiAJCX0KIAkJZWxzZSB7Ci0JCQlhdDkxX21jaV93cml0ZShBVDkxX1BEQ19STlBSLCBzZy0+ZG1hX2FkZHJlc3MpOwotCQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9QRENfUk5DUiwgc2ctPmxlbmd0aCAvIDQpOworCQkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9QRENfUk5QUiwgc2ctPmRtYV9hZGRyZXNzKTsKKwkJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfUERDX1JOQ1IsIHNnLT5sZW5ndGggLyA0KTsKIAkJfQogCX0KIApAQCAtMjc2LDggKzI3MCw2IEBACiAKIAl3aGlsZSAoaG9zdC0+aW5fdXNlX2luZGV4IDwgaG9zdC0+dHJhbnNmZXJfaW5kZXgpIHsKIAkJdW5zaWduZWQgaW50ICpidWZmZXI7Ci0JCWludCBpbmRleDsKLQkJaW50IGxlbjsKIAogCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCkBAIC0yOTUsMTEgKzI4NywxMyBAQAogCiAJCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBzZy0+bGVuZ3RoOwogCi0JCWxlbiA9IHNnLT5sZW5ndGggLyA0OworCQlpZiAoY3B1X2lzX2F0OTFybTkyMDAoKSkgewkvKiBBVDkxUk05MjAwIGVycmF0YSAqLworCQkJaW50IGluZGV4OwogCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgaW5kZXgrKykgewotCQkJYnVmZmVyW2luZGV4XSA9IHN3YWIzMihidWZmZXJbaW5kZXhdKTsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IChzZy0+bGVuZ3RoIC8gNCk7IGluZGV4KyspCisJCQkJYnVmZmVyW2luZGV4XSA9IHN3YWIzMihidWZmZXJbaW5kZXhdKTsKIAkJfQorCiAJCWt1bm1hcF9hdG9taWMoYnVmZmVyLCBLTV9CSU9fU1JDX0lSUSk7CiAJCWZsdXNoX2RjYWNoZV9wYWdlKHNnLT5wYWdlKTsKIAl9CkBAIC0zMDgsOCArMzAyLDggQEAKIAlpZiAoaG9zdC0+dHJhbnNmZXJfaW5kZXggPCBkYXRhLT5zZ19sZW4pCiAJCWF0OTFtY2lfcHJlX2RtYV9yZWFkKGhvc3QpOwogCWVsc2UgewotCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRVIsIEFUOTFfTUNJX1JYQlVGRik7Ci0JCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1BUQ1IsIEFUOTFfUERDX1JYVERJUyB8IEFUOTFfUERDX1RYVERJUyk7CisJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX0lFUiwgQVQ5MV9NQ0lfUlhCVUZGKTsKKwkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9QRENfUFRDUiwgQVQ5MV9QRENfUlhURElTIHwgQVQ5MV9QRENfVFhURElTKTsKIAl9CiAKIAlwcl9kZWJ1ZygicG9zdCBkbWEgcmVhZCBkb25lXG4iKTsKQEAgLTMyNiwxMSArMzIwLDExIEBACiAJcHJfZGVidWcoIkhhbmRsaW5nIHRoZSB0cmFuc21pdFxuIik7CiAKIAkvKiBEaXNhYmxlIHRoZSB0cmFuc2ZlciAqLwotCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1BUQ1IsIEFUOTFfUERDX1JYVERJUyB8IEFUOTFfUERDX1RYVERJUyk7CisJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9QRENfUFRDUiwgQVQ5MV9QRENfUlhURElTIHwgQVQ5MV9QRENfVFhURElTKTsKIAogCS8qIE5vdyB3YWl0IGZvciBjbWQgcmVhZHkgKi8KLQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRFIsIEFUOTFfTUNJX1RYQlVGRSk7Ci0JYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfSUVSLCBBVDkxX01DSV9OT1RCVVNZKTsKKwlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9JRFIsIEFUOTFfTUNJX1RYQlVGRSk7CisJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9NQ0lfSUVSLCBBVDkxX01DSV9OT1RCVVNZKTsKIAogCWNtZCA9IGhvc3QtPmNtZDsKIAlpZiAoIWNtZCkgcmV0dXJuOwpAQCAtMzQ0LDIxICszMzgsMjMgQEAKIC8qCiAgKiBFbmFibGUgdGhlIGNvbnRyb2xsZXIKICAqLwotc3RhdGljIHZvaWQgYXQ5MV9tY2lfZW5hYmxlKHZvaWQpCitzdGF0aWMgdm9pZCBhdDkxX21jaV9lbmFibGUoc3RydWN0IGF0OTFtY2lfaG9zdCAqaG9zdCkKIHsKLQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9DUiwgQVQ5MV9NQ0lfTUNJRU4pOwotCWF0OTFfbWNpX3dyaXRlKEFUOTFfTUNJX0lEUiwgMHhGRkZGRkZGRik7Ci0JYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfRFRPUiwgQVQ5MV9NQ0lfRFRPTVVMXzFNIHwgQVQ5MV9NQ0lfRFRPQ1lDKTsKLQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9NUiwgMHg4MzRBKTsKLQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9TRENSLCAweDApOworCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX0NSLCBBVDkxX01DSV9NQ0lFTik7CisJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9NQ0lfSURSLCAweGZmZmZmZmZmKTsKKwlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9EVE9SLCBBVDkxX01DSV9EVE9NVUxfMU0gfCBBVDkxX01DSV9EVE9DWUMpOworCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX01SLCBBVDkxX01DSV9QRENNT0RFIHwgMHgzNGEpOworCisJLyogdXNlIFNsb3QgQSBvciBCIChvbmx5IG9uZSBhdCBzYW1lIHRpbWUpICovCisJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9NQ0lfU0RDUiwgaG9zdC0+Ym9hcmQtPnNsb3RfYik7CiB9CiAKIC8qCiAgKiBEaXNhYmxlIHRoZSBjb250cm9sbGVyCiAgKi8KLXN0YXRpYyB2b2lkIGF0OTFfbWNpX2Rpc2FibGUodm9pZCkKK3N0YXRpYyB2b2lkIGF0OTFfbWNpX2Rpc2FibGUoc3RydWN0IGF0OTFtY2lfaG9zdCAqaG9zdCkKIHsKLQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9DUiwgQVQ5MV9NQ0lfTUNJRElTIHwgQVQ5MV9NQ0lfU1dSU1QpOworCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX0NSLCBBVDkxX01DSV9NQ0lESVMgfCBBVDkxX01DSV9TV1JTVCk7CiB9CiAKIC8qCkBAIC0zNzgsMTMgKzM3NCwxMyBAQAogCiAJLyogTm90IHN1cmUgaWYgdGhpcyBpcyBuZWVkZWQgKi8KICNpZiAwCi0JaWYgKChhdDkxX21jaV9yZWFkKEFUOTFfTUNJX1NSKSAmIEFUOTFfTUNJX1JUT0UpICYmIChjbWQtPm9wY29kZSA9PSAxKSkgeworCWlmICgoYXQ5MV9tY2lfcmVhZChob3N0LCBBVDkxX01DSV9TUikgJiBBVDkxX01DSV9SVE9FKSAmJiAoY21kLT5vcGNvZGUgPT0gMSkpIHsKIAkJcHJfZGVidWcoIkNsZWFyaW5nIHRpbWVvdXRcbiIpOwotCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9BUkdSLCAwKTsKLQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfQ01EUiwgQVQ5MV9NQ0lfT1BEQ01EKTsKLQkJd2hpbGUgKCEoYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9TUikgJiBBVDkxX01DSV9DTURSRFkpKSB7CisJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX0FSR1IsIDApOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9DTURSLCBBVDkxX01DSV9PUERDTUQpOworCQl3aGlsZSAoIShhdDkxX21jaV9yZWFkKGhvc3QsIEFUOTFfTUNJX1NSKSAmIEFUOTFfTUNJX0NNRFJEWSkpIHsKIAkJCS8qIHNwaW4gKi8KLQkJCXByX2RlYnVnKCJDbGVhcmluZzogU1IgPSAlMDhYXG4iLCBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX1NSKSk7CisJCQlwcl9kZWJ1ZygiQ2xlYXJpbmc6IFNSID0gJTA4WFxuIiwgYXQ5MV9tY2lfcmVhZChob3N0LCBBVDkxX01DSV9TUikpOwogCQl9CiAJfQogI2VuZGlmCkBAIC00MzEsMzIgKzQyNywzMiBAQAogCS8qCiAJICogU2V0IHRoZSBhcmd1bWVudHMgYW5kIHNlbmQgdGhlIGNvbW1hbmQKIAkgKi8KLQlwcl9kZWJ1ZygiU2VuZGluZyBjb21tYW5kICVkIGFzICUwOFgsIGFyZyA9ICUwOFgsIGJsb2NrcyA9ICVkLCBsZW5ndGggPSAlZCAoTVIgPSAlMDhsWClcbiIsCi0JCWNtZC0+b3Bjb2RlLCBjbWRyLCBjbWQtPmFyZywgYmxvY2tzLCBibG9ja19sZW5ndGgsIGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfTVIpKTsKKwlwcl9kZWJ1ZygiU2VuZGluZyBjb21tYW5kICVkIGFzICUwOFgsIGFyZyA9ICUwOFgsIGJsb2NrcyA9ICVkLCBsZW5ndGggPSAlZCAoTVIgPSAlMDhYKVxuIiwKKwkJY21kLT5vcGNvZGUsIGNtZHIsIGNtZC0+YXJnLCBibG9ja3MsIGJsb2NrX2xlbmd0aCwgYXQ5MV9tY2lfcmVhZChob3N0LCBBVDkxX01DSV9NUikpOwogCiAJaWYgKCFkYXRhKSB7Ci0JCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1BUQ1IsIEFUOTFfUERDX1RYVERJUyB8IEFUOTFfUERDX1JYVERJUyk7Ci0JCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1JQUiwgMCk7Ci0JCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1JDUiwgMCk7Ci0JCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1JOUFIsIDApOwotCQlhdDkxX21jaV93cml0ZShBVDkxX1BEQ19STkNSLCAwKTsKLQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9QRENfVFBSLCAwKTsKLQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9QRENfVENSLCAwKTsKLQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9QRENfVE5QUiwgMCk7Ci0JCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1ROQ1IsIDApOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX1BEQ19QVENSLCBBVDkxX1BEQ19UWFRESVMgfCBBVDkxX1BEQ19SWFRESVMpOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX1BEQ19SUFIsIDApOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX1BEQ19SQ1IsIDApOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX1BEQ19STlBSLCAwKTsKKwkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9QRENfUk5DUiwgMCk7CisJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfUERDX1RQUiwgMCk7CisJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfUERDX1RDUiwgMCk7CisJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfUERDX1ROUFIsIDApOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX1BEQ19UTkNSLCAwKTsKIAotCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9BUkdSLCBjbWQtPmFyZyk7Ci0JCWF0OTFfbWNpX3dyaXRlKEFUOTFfTUNJX0NNRFIsIGNtZHIpOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9BUkdSLCBjbWQtPmFyZyk7CisJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX0NNRFIsIGNtZHIpOwogCQlyZXR1cm4gQVQ5MV9NQ0lfQ01EUkRZOwogCX0KIAotCW1yID0gYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9NUikgJiAweDdmZmY7CS8qIHplcm8gYmxvY2sgbGVuZ3RoIGFuZCBQREMgbW9kZSAqLwotCWF0OTFfbWNpX3dyaXRlKEFUOTFfTUNJX01SLCBtciB8IChibG9ja19sZW5ndGggPDwgMTYpIHwgQVQ5MV9NQ0lfUERDTU9ERSk7CisJbXIgPSBhdDkxX21jaV9yZWFkKGhvc3QsIEFUOTFfTUNJX01SKSAmIDB4N2ZmZjsJLyogemVybyBibG9jayBsZW5ndGggYW5kIFBEQyBtb2RlICovCisJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9NQ0lfTVIsIG1yIHwgKGJsb2NrX2xlbmd0aCA8PCAxNikgfCBBVDkxX01DSV9QRENNT0RFKTsKIAogCS8qCiAJICogRGlzYWJsZSB0aGUgUERDIGNvbnRyb2xsZXIKIAkgKi8KLQlhdDkxX21jaV93cml0ZShBVDkxX1BEQ19QVENSLCBBVDkxX1BEQ19SWFRESVMgfCBBVDkxX1BEQ19UWFRESVMpOworCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfUERDX1BUQ1IsIEFUOTFfUERDX1JYVERJUyB8IEFUOTFfUERDX1RYVERJUyk7CiAKIAlpZiAoY21kciAmIEFUOTFfTUNJX1RSQ01EX1NUQVJUKSB7CiAJCWRhdGEtPmJ5dGVzX3hmZXJlZCA9IDA7CkBAIC00ODUsOCArNDgxLDggQEAKIAogCQkJcHJfZGVidWcoIlRyYW5zbWl0dGluZyAlZCBieXRlc1xuIiwgaG9zdC0+dG90YWxfbGVuZ3RoKTsKIAotCQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9QRENfVFBSLCBob3N0LT5waHlzaWNhbF9hZGRyZXNzKTsKLQkJCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1RDUiwgaG9zdC0+dG90YWxfbGVuZ3RoIC8gNCk7CisJCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX1BEQ19UUFIsIGhvc3QtPnBoeXNpY2FsX2FkZHJlc3MpOworCQkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9QRENfVENSLCBob3N0LT50b3RhbF9sZW5ndGggLyA0KTsKIAkJCWllciA9IEFUOTFfTUNJX1RYQlVGRTsKIAkJfQogCX0KQEAgLTQ5NiwxNCArNDkyLDE0IEBACiAJICogdGhlIGRhdGEgc2hlZXQgc2F5cwogCSAqLwogCi0JYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfQVJHUiwgY21kLT5hcmcpOwotCWF0OTFfbWNpX3dyaXRlKEFUOTFfTUNJX0NNRFIsIGNtZHIpOworCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX0FSR1IsIGNtZC0+YXJnKTsKKwlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9DTURSLCBjbWRyKTsKIAogCWlmIChjbWRyICYgQVQ5MV9NQ0lfVFJDTURfU1RBUlQpIHsKIAkJaWYgKGNtZHIgJiBBVDkxX01DSV9UUkRJUikKLQkJCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1BUQ1IsIEFUOTFfUERDX1JYVEVOKTsKKwkJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfUERDX1BUQ1IsIEFUOTFfUERDX1JYVEVOKTsKIAkJZWxzZQotCQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9QRENfUFRDUiwgQVQ5MV9QRENfVFhURU4pOworCQkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9QRENfUFRDUiwgQVQ5MV9QRENfVFhURU4pOwogCX0KIAlyZXR1cm4gaWVyOwogfQpAQCAtNTIwLDcgKzUxNiw3IEBACiAJcHJfZGVidWcoInNldHRpbmcgaWVyIHRvICUwOFhcbiIsIGllcik7CiAKIAkvKiBTdG9wIG9uIGVycm9ycyBvciB0aGUgcmVxdWlyZWQgdmFsdWUgKi8KLQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRVIsIDB4ZmZmZjAwMDAgfCBpZXIpOworCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX0lFUiwgQVQ5MV9NQ0lfRVJST1JTIHwgaWVyKTsKIH0KIAogLyoKQEAgLTU0OCwxOSArNTQ0LDE5IEBACiAJc3RydWN0IG1tY19jb21tYW5kICpjbWQgPSBob3N0LT5jbWQ7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAotCWF0OTFfbWNpX3dyaXRlKEFUOTFfTUNJX0lEUiwgMHhmZmZmZmZmZik7CisJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9NQ0lfSURSLCAweGZmZmZmZmZmKTsKIAotCWNtZC0+cmVzcFswXSA9IGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfUlNQUigwKSk7Ci0JY21kLT5yZXNwWzFdID0gYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9SU1BSKDEpKTsKLQljbWQtPnJlc3BbMl0gPSBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX1JTUFIoMikpOwotCWNtZC0+cmVzcFszXSA9IGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfUlNQUigzKSk7CisJY21kLT5yZXNwWzBdID0gYXQ5MV9tY2lfcmVhZChob3N0LCBBVDkxX01DSV9SU1BSKDApKTsKKwljbWQtPnJlc3BbMV0gPSBhdDkxX21jaV9yZWFkKGhvc3QsIEFUOTFfTUNJX1JTUFIoMSkpOworCWNtZC0+cmVzcFsyXSA9IGF0OTFfbWNpX3JlYWQoaG9zdCwgQVQ5MV9NQ0lfUlNQUigyKSk7CisJY21kLT5yZXNwWzNdID0gYXQ5MV9tY2lfcmVhZChob3N0LCBBVDkxX01DSV9SU1BSKDMpKTsKIAogCWlmIChob3N0LT5idWZmZXIpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgaG9zdC0+dG90YWxfbGVuZ3RoLCBob3N0LT5idWZmZXIsIGhvc3QtPnBoeXNpY2FsX2FkZHJlc3MpOwogCQlob3N0LT5idWZmZXIgPSBOVUxMOwogCX0KIAotCXN0YXR1cyA9IGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfU1IpOworCXN0YXR1cyA9IGF0OTFfbWNpX3JlYWQoaG9zdCwgQVQ5MV9NQ0lfU1IpOwogCiAJcHJfZGVidWcoIlN0YXR1cyA9ICUwOFggWyUwOFggJTA4WCAlMDhYICUwOFhdXG4iLAogCQkgc3RhdHVzLCBjbWQtPnJlc3BbMF0sIGNtZC0+cmVzcFsxXSwgY21kLT5yZXNwWzJdLCBjbWQtPnJlc3BbM10pOwpAQCAtNjExLDE4ICs2MDcsMTggQEAKIHsKIAlpbnQgY2xrZGl2OwogCXN0cnVjdCBhdDkxbWNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwotCXVuc2lnbmVkIGxvbmcgYXQ5MV9tYXN0ZXJfY2xvY2sgPSBjbGtfZ2V0X3JhdGUobWNpX2Nsayk7CisJdW5zaWduZWQgbG9uZyBhdDkxX21hc3Rlcl9jbG9jayA9IGNsa19nZXRfcmF0ZShob3N0LT5tY2lfY2xrKTsKIAogCWhvc3QtPmJ1c19tb2RlID0gaW9zLT5idXNfbW9kZTsKIAogCWlmIChpb3MtPmNsb2NrID09IDApIHsKIAkJLyogRGlzYWJsZSB0aGUgTUNJIGNvbnRyb2xsZXIgKi8KLQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfQ1IsIEFUOTFfTUNJX01DSURJUyk7CisJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX0NSLCBBVDkxX01DSV9NQ0lESVMpOwogCQljbGtkaXYgPSAwOwogCX0KIAllbHNlIHsKIAkJLyogRW5hYmxlIHRoZSBNQ0kgY29udHJvbGxlciAqLwotCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9DUiwgQVQ5MV9NQ0lfTUNJRU4pOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9DUiwgQVQ5MV9NQ0lfTUNJRU4pOwogCiAJCWlmICgoYXQ5MV9tYXN0ZXJfY2xvY2sgJSAoaW9zLT5jbG9jayAqIDIpKSA9PSAwKQogCQkJY2xrZGl2ID0gKChhdDkxX21hc3Rlcl9jbG9jayAvIGlvcy0+Y2xvY2spIC8gMikgLSAxOwpAQCAtNjM0LDI1ICs2MzAsMjUgQEAKIAl9CiAJaWYgKGlvcy0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfNCAmJiBob3N0LT5ib2FyZC0+d2lyZTQpIHsKIAkJcHJfZGVidWcoIk1NQzogU2V0dGluZyBjb250cm9sbGVyIGJ1cyB3aWR0aCB0byA0XG4iKTsKLQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfU0RDUiwgYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9TRENSKSB8IEFUOTFfTUNJX1NEQ0JVUyk7CisJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX1NEQ1IsIGF0OTFfbWNpX3JlYWQoaG9zdCwgQVQ5MV9NQ0lfU0RDUikgfCBBVDkxX01DSV9TRENCVVMpOwogCX0KIAllbHNlIHsKIAkJcHJfZGVidWcoIk1NQzogU2V0dGluZyBjb250cm9sbGVyIGJ1cyB3aWR0aCB0byAxXG4iKTsKLQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfU0RDUiwgYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9TRENSKSAmIH5BVDkxX01DSV9TRENCVVMpOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9TRENSLCBhdDkxX21jaV9yZWFkKGhvc3QsIEFUOTFfTUNJX1NEQ1IpICYgfkFUOTFfTUNJX1NEQ0JVUyk7CiAJfQogCiAJLyogU2V0IHRoZSBjbG9jayBkaXZpZGVyICovCi0JYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfTVIsIChhdDkxX21jaV9yZWFkKEFUOTFfTUNJX01SKSAmIH5BVDkxX01DSV9DTEtESVYpIHwgY2xrZGl2KTsKKwlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9NUiwgKGF0OTFfbWNpX3JlYWQoaG9zdCwgQVQ5MV9NQ0lfTVIpICYgfkFUOTFfTUNJX0NMS0RJVikgfCBjbGtkaXYpOwogCiAJLyogbWF5YmUgc3dpdGNoIHBvd2VyIHRvIHRoZSBjYXJkICovCiAJaWYgKGhvc3QtPmJvYXJkLT52Y2NfcGluKSB7CiAJCXN3aXRjaCAoaW9zLT5wb3dlcl9tb2RlKSB7CiAJCQljYXNlIE1NQ19QT1dFUl9PRkY6Ci0JCQkJYXQ5MV9zZXRfZ3Bpb19vdXRwdXQoaG9zdC0+Ym9hcmQtPnZjY19waW4sIDApOworCQkJCWF0OTFfc2V0X2dwaW9fdmFsdWUoaG9zdC0+Ym9hcmQtPnZjY19waW4sIDApOwogCQkJCWJyZWFrOwogCQkJY2FzZSBNTUNfUE9XRVJfVVA6CiAJCQljYXNlIE1NQ19QT1dFUl9PTjoKLQkJCQlhdDkxX3NldF9ncGlvX291dHB1dChob3N0LT5ib2FyZC0+dmNjX3BpbiwgMSk7CisJCQkJYXQ5MV9zZXRfZ3Bpb192YWx1ZShob3N0LT5ib2FyZC0+dmNjX3BpbiwgMSk7CiAJCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC02NjUsMzkgKzY2MSw0MCBAQAogewogCXN0cnVjdCBhdDkxbWNpX2hvc3QgKmhvc3QgPSBkZXZpZDsKIAlpbnQgY29tcGxldGVkID0gMDsKKwl1bnNpZ25lZCBpbnQgaW50X3N0YXR1cywgaW50X21hc2s7CiAKLQl1bnNpZ25lZCBpbnQgaW50X3N0YXR1czsKKwlpbnRfc3RhdHVzID0gYXQ5MV9tY2lfcmVhZChob3N0LCBBVDkxX01DSV9TUik7CisJaW50X21hc2sgPSBhdDkxX21jaV9yZWFkKGhvc3QsIEFUOTFfTUNJX0lNUik7CisJCisJcHJfZGVidWcoIk1DSSBpcnE6IHN0YXR1cyA9ICUwOFgsICUwOFgsICUwOFhcbiIsIGludF9zdGF0dXMsIGludF9tYXNrLAorCQlpbnRfc3RhdHVzICYgaW50X21hc2spOworCQorCWludF9zdGF0dXMgPSBpbnRfc3RhdHVzICYgaW50X21hc2s7CiAKLQlpbnRfc3RhdHVzID0gYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9TUik7Ci0JcHJfZGVidWcoIk1DSSBpcnE6IHN0YXR1cyA9ICUwOFgsICUwOGxYLCAlMDhsWFxuIiwgaW50X3N0YXR1cywgYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9JTVIpLAotCQlpbnRfc3RhdHVzICYgYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9JTVIpKTsKLQotCWlmICgoaW50X3N0YXR1cyAmIGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfSU1SKSkgJiAweGZmZmYwMDAwKQorCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfRVJST1JTKSB7CiAJCWNvbXBsZXRlZCA9IDE7CisJCQorCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1VOUkUpCisJCQlwcl9kZWJ1ZygiTU1DOiBVbmRlcnJ1biBlcnJvclxuIik7CisJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfT1ZSRSkKKwkJCXByX2RlYnVnKCJNTUM6IE92ZXJydW4gZXJyb3JcbiIpOworCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX0RUT0UpCisJCQlwcl9kZWJ1ZygiTU1DOiBEYXRhIHRpbWVvdXRcbiIpOworCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX0RDUkNFKQorCQkJcHJfZGVidWcoIk1NQzogQ1JDIGVycm9yIGluIGRhdGFcbiIpOworCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1JUT0UpCisJCQlwcl9kZWJ1ZygiTU1DOiBSZXNwb25zZSB0aW1lb3V0XG4iKTsKKwkJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SRU5ERSkKKwkJCXByX2RlYnVnKCJNTUM6IFJlc3BvbnNlIGVuZCBiaXQgZXJyb3JcbiIpOworCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1JDUkNFKQorCQkJcHJfZGVidWcoIk1NQzogUmVzcG9uc2UgQ1JDIGVycm9yXG4iKTsKKwkJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SRElSRSkKKwkJCXByX2RlYnVnKCJNTUM6IFJlc3BvbnNlIGRpcmVjdGlvbiBlcnJvclxuIik7CisJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfUklOREUpCisJCQlwcl9kZWJ1ZygiTU1DOiBSZXNwb25zZSBpbmRleCBlcnJvclxuIik7CisJfSBlbHNlIHsKKwkJLyogT25seSBjb250aW51ZSBwcm9jZXNzaW5nIGlmIG5vIGVycm9ycyAqLwogCi0JaW50X3N0YXR1cyAmPSBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX0lNUik7Ci0KLQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1VOUkUpCi0JCXByX2RlYnVnKCJNTUM6IFVuZGVycnVuIGVycm9yXG4iKTsKLQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX09WUkUpCi0JCXByX2RlYnVnKCJNTUM6IE92ZXJydW4gZXJyb3JcbiIpOwotCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfRFRPRSkKLQkJcHJfZGVidWcoIk1NQzogRGF0YSB0aW1lb3V0XG4iKTsKLQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX0RDUkNFKQotCQlwcl9kZWJ1ZygiTU1DOiBDUkMgZXJyb3IgaW4gZGF0YVxuIik7Ci0JaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SVE9FKQotCQlwcl9kZWJ1ZygiTU1DOiBSZXNwb25zZSB0aW1lb3V0XG4iKTsKLQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1JFTkRFKQotCQlwcl9kZWJ1ZygiTU1DOiBSZXNwb25zZSBlbmQgYml0IGVycm9yXG4iKTsKLQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1JDUkNFKQotCQlwcl9kZWJ1ZygiTU1DOiBSZXNwb25zZSBDUkMgZXJyb3JcbiIpOwotCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfUkRJUkUpCi0JCXByX2RlYnVnKCJNTUM6IFJlc3BvbnNlIGRpcmVjdGlvbiBlcnJvclxuIik7Ci0JaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SSU5ERSkKLQkJcHJfZGVidWcoIk1NQzogUmVzcG9uc2UgaW5kZXggZXJyb3JcbiIpOwotCi0JLyogT25seSBjb250aW51ZSBwcm9jZXNzaW5nIGlmIG5vIGVycm9ycyAqLwotCWlmICghY29tcGxldGVkKSB7CiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfVFhCVUZFKSB7CiAJCQlwcl9kZWJ1ZygiVFggYnVmZmVyIGVtcHR5XG4iKTsKIAkJCWF0OTFfbWNpX2hhbmRsZV90cmFuc21pdHRlZChob3N0KTsKQEAgLTcwNSwxMiArNzAyLDExIEBACiAKIAkJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SWEJVRkYpIHsKIAkJCXByX2RlYnVnKCJSWCBidWZmZXIgZnVsbFxuIik7Ci0JCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRVIsIEFUOTFfTUNJX0NNRFJEWSk7CisJCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9JRVIsIEFUOTFfTUNJX0NNRFJEWSk7CiAJCX0KIAotCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX0VORFRYKSB7CisJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfRU5EVFgpCiAJCQlwcl9kZWJ1ZygiVHJhbnNtaXQgaGFzIGVuZGVkXG4iKTsKLQkJfQogCiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfRU5EUlgpIHsKIAkJCXByX2RlYnVnKCJSZWNlaXZlIGhhcyBlbmRlZFxuIik7CkBAIC03MTksMzcgKzcxNSwzMyBAQAogCiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfTk9UQlVTWSkgewogCQkJcHJfZGVidWcoIkNhcmQgaXMgcmVhZHlcbiIpOwotCQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfSUVSLCBBVDkxX01DSV9DTURSRFkpOworCQkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9NQ0lfSUVSLCBBVDkxX01DSV9DTURSRFkpOwogCQl9CiAKLQkJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9EVElQKSB7CisJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfRFRJUCkKIAkJCXByX2RlYnVnKCJEYXRhIHRyYW5zZmVyIGluIHByb2dyZXNzXG4iKTsKLQkJfQogCi0JCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfQkxLRSkgeworCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX0JMS0UpCiAJCQlwcl9kZWJ1ZygiQmxvY2sgdHJhbnNmZXIgaGFzIGVuZGVkXG4iKTsKLQkJfQogCi0JCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfVFhSRFkpIHsKKwkJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9UWFJEWSkKIAkJCXByX2RlYnVnKCJSZWFkeSB0byB0cmFuc21pdFxuIik7Ci0JCX0KIAotCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1JYUkRZKSB7CisJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfUlhSRFkpCiAJCQlwcl9kZWJ1ZygiUmVhZHkgdG8gcmVjZWl2ZVxuIik7Ci0JCX0KIAogCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX0NNRFJEWSkgewogCQkJcHJfZGVidWcoIkNvbW1hbmQgcmVhZHlcbiIpOwogCQkJY29tcGxldGVkID0gMTsKIAkJfQogCX0KLQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRFIsIGludF9zdGF0dXMpOwogCiAJaWYgKGNvbXBsZXRlZCkgewogCQlwcl9kZWJ1ZygiQ29tcGxldGVkIGNvbW1hbmRcbiIpOwotCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRFIsIDB4ZmZmZmZmZmYpOworCQlhdDkxX21jaV93cml0ZShob3N0LCBBVDkxX01DSV9JRFIsIDB4ZmZmZmZmZmYpOwogCQlhdDkxbWNpX2NvbXBsZXRlZF9jb21tYW5kKGhvc3QpOwotCX0KKwl9IGVsc2UKKwkJYXQ5MV9tY2lfd3JpdGUoaG9zdCwgQVQ5MV9NQ0lfSURSLCBpbnRfc3RhdHVzKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTc2OSw3ICs3NjEsNyBAQAogCQkJcHJlc2VudCA/ICJpbnNlcnQiIDogInJlbW92ZSIpOwogCQlpZiAoIXByZXNlbnQpIHsKIAkJCXByX2RlYnVnKCIqKioqKiogUmVzZXR0aW5nIFNELWNhcmQgYnVzIHdpZHRoICoqKioqKlxuIik7Ci0JCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9TRENSLCAwKTsKKwkJCWF0OTFfbWNpX3dyaXRlKGhvc3QsIEFUOTFfTUNJX1NEQ1IsIGF0OTFfbWNpX3JlYWQoaG9zdCwgQVQ5MV9NQ0lfU0RDUikgJiB+QVQ5MV9NQ0lfU0RDQlVTKTsKIAkJfQogCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CiAJfQpAQCAtNzkzLDcgKzc4NSw3IEBACiAJcmV0dXJuIHJlYWRfb25seTsKIH0KIAotc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgYXQ5MV9tY2lfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgYXQ5MV9tY2lfb3BzID0gewogCS5yZXF1ZXN0CT0gYXQ5MV9tY2lfcmVxdWVzdCwKIAkuc2V0X2lvcwk9IGF0OTFfbWNpX3NldF9pb3MsCiAJLmdldF9ybwkJPSBhdDkxX21jaV9nZXRfcm8sCkBAIC04MDYsMTUgKzc5OCwyMiBAQAogewogCXN0cnVjdCBtbWNfaG9zdCAqbW1jOwogCXN0cnVjdCBhdDkxbWNpX2hvc3QgKmhvc3Q7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldDsKIAogCXByX2RlYnVnKCJQcm9iZSBNQ0kgZGV2aWNlc1xuIik7Ci0JYXQ5MV9tY2lfZGlzYWJsZSgpOwotCWF0OTFfbWNpX2VuYWJsZSgpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsIERSSVZFUl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCW1tYyA9IG1tY19hbGxvY19ob3N0KHNpemVvZihzdHJ1Y3QgYXQ5MW1jaV9ob3N0KSwgJnBkZXYtPmRldik7CiAJaWYgKCFtbWMpIHsKIAkJcHJfZGVidWcoIkZhaWxlZCB0byBhbGxvY2F0ZSBtbWMgaG9zdFxuIik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04MzMsMzAgKzgzMiw1MSBAQAogI2lmZGVmIFNVUFBPUlRfNFdJUkUKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfNF9CSVRfREFUQTsKICNlbHNlCi0JCXByaW50aygiTU1DOiA0IHdpcmUgYnVzIG1vZGUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAtIHVzaW5nIDEgd2lyZVxuIik7CisJCXByaW50aygiQVQ5MSBNTUM6IDQgd2lyZSBidXMgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyIC0gdXNpbmcgMSB3aXJlXG4iKTsKICNlbmRpZgogCX0KIAogCS8qCiAJICogR2V0IENsb2NrCiAJICovCi0JbWNpX2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1jaV9jbGsiKTsKLQlpZiAoSVNfRVJSKG1jaV9jbGspKSB7CisJaG9zdC0+bWNpX2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1jaV9jbGsiKTsKKwlpZiAoSVNfRVJSKGhvc3QtPm1jaV9jbGspKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQVQ5MSBNTUM6IG5vIGNsb2NrIGRlZmluZWQuXG4iKTsKIAkJbW1jX2ZyZWVfaG9zdChtbWMpOworCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQljbGtfZW5hYmxlKG1jaV9jbGspOwkJCS8qIEVuYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9jayAqLworCisJLyoKKwkgKiBNYXAgSS9PIHJlZ2lvbgorCSAqLworCWhvc3QtPmJhc2VhZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlpZiAoIWhvc3QtPmJhc2VhZGRyKSB7CisJCWNsa19wdXQoaG9zdC0+bWNpX2Nsayk7CisJCW1tY19mcmVlX2hvc3QobW1jKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFJlc2V0IGhhcmR3YXJlCisJICovCisJY2xrX2VuYWJsZShob3N0LT5tY2lfY2xrKTsJCS8qIEVuYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9jayAqLworCWF0OTFfbWNpX2Rpc2FibGUoaG9zdCk7CisJYXQ5MV9tY2lfZW5hYmxlKGhvc3QpOwogCiAJLyoKIAkgKiBBbGxvY2F0ZSB0aGUgTUNJIGludGVycnVwdAogCSAqLwotCXJldCA9IHJlcXVlc3RfaXJxKEFUOTFSTTkyMDBfSURfTUNJLCBhdDkxX21jaV9pcnEsIElSUUZfU0hBUkVELCBEUklWRVJfTkFNRSwgaG9zdCk7CisJaG9zdC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlyZXQgPSByZXF1ZXN0X2lycShob3N0LT5pcnEsIGF0OTFfbWNpX2lycSwgSVJRRl9TSEFSRUQsIERSSVZFUl9OQU1FLCBob3N0KTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlcXVlc3QgTUNJIGludGVycnVwdFxuIik7Ci0JCWNsa19kaXNhYmxlKG1jaV9jbGspOwotCQljbGtfcHV0KG1jaV9jbGspOworCQlwcmludGsoS0VSTl9FUlIgIkFUOTEgTU1DOiBGYWlsZWQgdG8gcmVxdWVzdCBNQ0kgaW50ZXJydXB0XG4iKTsKKwkJY2xrX2Rpc2FibGUoaG9zdC0+bWNpX2Nsayk7CisJCWNsa19wdXQoaG9zdC0+bWNpX2Nsayk7CiAJCW1tY19mcmVlX2hvc3QobW1jKTsKKwkJaW91bm1hcChob3N0LT5iYXNlYWRkcik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTg3OSwxMCArODk5LDEwIEBACiAJCXJldCA9IHJlcXVlc3RfaXJxKGhvc3QtPmJvYXJkLT5kZXRfcGluLCBhdDkxX21tY19kZXRfaXJxLAogCQkJCTAsIERSSVZFUl9OQU1FLCBob3N0KTsKIAkJaWYgKHJldCkKLQkJCXByaW50ayhLRVJOX0VSUiAiY291bGRuJ3QgYWxsb2NhdGUgTU1DIGRldGVjdCBpcnFcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJBVDkxIE1NQzogQ291bGRuJ3QgYWxsb2NhdGUgTU1DIGRldGVjdCBpcnFcbiIpOwogCX0KIAotCXByX2RlYnVnKEtFUk5fSU5GTyAiQWRkZWQgTUNJIGRyaXZlclxuIik7CisJcHJfZGVidWcoIkFkZGVkIE1DSSBkcml2ZXJcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04OTQsNiArOTE0LDcgQEAKIHsKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdDkxbWNpX2hvc3QgKmhvc3Q7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlpZiAoIW1tYykKIAkJcmV0dXJuIC0xOwpAQCAtOTA1LDE2ICs5MjYsMTkgQEAKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaG9zdC0+bW1jLT5kZXRlY3QpOwogCX0KIAorCWF0OTFfbWNpX2Rpc2FibGUoaG9zdCk7CiAJbW1jX3JlbW92ZV9ob3N0KG1tYyk7Ci0JYXQ5MV9tY2lfZGlzYWJsZSgpOwotCWZyZWVfaXJxKEFUOTFSTTkyMDBfSURfTUNJLCBob3N0KTsKKwlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCisJY2xrX2Rpc2FibGUoaG9zdC0+bWNpX2Nsayk7CQkJLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9jayAqLworCWNsa19wdXQoaG9zdC0+bWNpX2Nsayk7CisKKwlpb3VubWFwKGhvc3QtPmJhc2VhZGRyKTsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwogCW1tY19mcmVlX2hvc3QobW1jKTsKLQotCWNsa19kaXNhYmxlKG1jaV9jbGspOwkJCQkvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrICovCi0JY2xrX3B1dChtY2lfY2xrKTsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCiAJcHJfZGVidWcoIk1DSSBSZW1vdmVkXG4iKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvYXUxeG1tYy5jIGIvZHJpdmVycy9tbWMvYXUxeG1tYy5jCmluZGV4IDUzZmZjYmIuLjgwMDUyN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2F1MXhtbWMuYworKysgYi9kcml2ZXJzL21tYy9hdTF4bW1jLmMKQEAgLTg3NSw3ICs4NzUsNyBAQAogCWhvc3QtPnJ4X2NoYW4gPSByeGNoYW47CiB9CiAKLXN0cnVjdCBtbWNfaG9zdF9vcHMgYXUxeG1tY19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBhdTF4bW1jX29wcyA9IHsKIAkucmVxdWVzdAk9IGF1MXhtbWNfcmVxdWVzdCwKIAkuc2V0X2lvcwk9IGF1MXhtbWNfc2V0X2lvcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9pbXhtbWMuYyBiL2RyaXZlcnMvbW1jL2lteG1tYy5jCmluZGV4IDY1OWQ0YTguLjA2ZTdmY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2lteG1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2lteG1tYy5jCkBAIC04NzcsNyArODc3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGlteG1jaV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1tY19ob3N0X29wcyBpbXhtY2lfb3BzID0gewogCS5yZXF1ZXN0CT0gaW14bWNpX3JlcXVlc3QsCiAJLnNldF9pb3MJPSBpbXhtY2lfc2V0X2lvcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWMuYyBiL2RyaXZlcnMvbW1jL21tYy5jCmluZGV4IGVlODg2M2MuLjZmMmEyODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL21tYy5jCkBAIC00LDYgKzQsNyBAQAogICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFJ1c3NlbGwgS2luZywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqICBTRCBzdXBwb3J0IENvcHlyaWdodCAoQykgMjAwNCBJYW4gTW9sdG9uLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogIFNEIHN1cHBvcnQgQ29weXJpZ2h0IChDKSAyMDA1IFBpZXJyZSBPc3NtYW4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgTU1DdjQgc3VwcG9ydCBDb3B5cmlnaHQgKEMpIDIwMDYgUGhpbGlwIExhbmdkYWxlLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMzk2LDIzICszOTcsMjMgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qCi0JICogRGVmYXVsdCBidXMgd2lkdGggaXMgMSBiaXQuCi0JICovCi0JaG9zdC0+aW9zLmJ1c193aWR0aCA9IE1NQ19CVVNfV0lEVEhfMTsKLQotCS8qCi0JICogV2UgY2FuIG9ubHkgY2hhbmdlIHRoZSBidXMgd2lkdGggb2YgdGhlIHNlbGVjdGVkCi0JICogY2FyZCBzbyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBwdXQgdGhlIGhhbmRsaW5nCisJICogV2UgY2FuIG9ubHkgY2hhbmdlIHRoZSBidXMgd2lkdGggb2YgU0QgY2FyZHMgd2hlbgorCSAqIHRoZXkgYXJlIHNlbGVjdGVkIHNvIHdlIGhhdmUgdG8gcHV0IHRoZSBoYW5kbGluZwogCSAqIGhlcmUuCisJICoKKwkgKiBUaGUgY2FyZCBpcyBpbiAxIGJpdCBtb2RlIGJ5IGRlZmF1bHQgc28KKwkgKiB3ZSBvbmx5IG5lZWQgdG8gY2hhbmdlIGlmIGl0IHN1cHBvcnRzIHRoZQorCSAqIHdpZGVyIHZlcnNpb24uCiAJICovCi0JaWYgKGhvc3QtPmNhcHMgJiBNTUNfQ0FQXzRfQklUX0RBVEEpIHsKKwlpZiAobW1jX2NhcmRfc2QoY2FyZCkgJiYKKwkJKGNhcmQtPnNjci5idXNfd2lkdGhzICYgU0RfU0NSX0JVU19XSURUSF80KSkgeworCiAJCS8qCi0JCSAqIFRoZSBjYXJkIGlzIGluIDEgYml0IG1vZGUgYnkgZGVmYXVsdCBzbwotCQkgKiB3ZSBvbmx5IG5lZWQgdG8gY2hhbmdlIGlmIGl0IHN1cHBvcnRzIHRoZQotCQkgKiB3aWRlciB2ZXJzaW9uLgotCQkgKi8KLQkJaWYgKG1tY19jYXJkX3NkKGNhcmQpICYmCi0JCQkoY2FyZC0+c2NyLmJ1c193aWR0aHMgJiBTRF9TQ1JfQlVTX1dJRFRIXzQpKSB7CisJCSogRGVmYXVsdCBidXMgd2lkdGggaXMgMSBiaXQuCisJCSovCisJCWhvc3QtPmlvcy5idXNfd2lkdGggPSBNTUNfQlVTX1dJRFRIXzE7CisKKwkJaWYgKGhvc3QtPmNhcHMgJiBNTUNfQ0FQXzRfQklUX0RBVEEpIHsKIAkJCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CiAJCQljbWQub3Bjb2RlID0gU0RfQVBQX1NFVF9CVVNfV0lEVEg7CiAJCQljbWQuYXJnID0gU0RfQlVTX1dJRFRIXzQ7CkBAIC00NTMsMTEgKzQ1NCwxMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbW1jX2RlbGF5KHVuc2lnbmVkIGludCBtcykKIHsKLQlpZiAobXMgPCBIWiAvIDEwMDApIHsKLQkJeWllbGQoKTsKKwlpZiAobXMgPCAxMDAwIC8gSFopIHsKKwkJY29uZF9yZXNjaGVkKCk7CiAJCW1kZWxheShtcyk7CiAJfSBlbHNlIHsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUgKG1zKTsKKwkJbXNsZWVwKG1zKTsKIAl9CiB9CiAKQEAgLTQ3NSw3ICs0NzYsNyBAQAogCWlmIChiaXQpIHsKIAkJYml0IC09IDE7CiAKLQkJb2NyID0gMyA8PCBiaXQ7CisJCW9jciAmPSAzIDw8IGJpdDsKIAogCQlob3N0LT5pb3MudmRkID0gYml0OwogCQltbWNfc2V0X2lvcyhob3N0KTsKQEAgLTk1Myw2ICs5NTQsMTM3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBtbWNfcHJvY2Vzc19leHRfY3NkcyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQ7CisKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgbXJxOworCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJc3RydWN0IG1tY19kYXRhIGRhdGE7CisKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwkvKgorCSAqIEFzIHRoZSBleHRfY3NkIGlzIHNvIGxhcmdlIGFuZCBtb3N0bHkgdW51c2VkLCB3ZSBkb24ndCBzdG9yZSB0aGUKKwkgKiByYXcgYmxvY2sgaW4gbW1jX2NhcmQuCisJICovCisJdTggKmV4dF9jc2Q7CisJZXh0X2NzZCA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV4dF9jc2QpIHsKKwkJcHJpbnRrKCIlczogY291bGQgbm90IGFsbG9jYXRlIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGV4dF9jc2QuIgorCQkgICAgICAgIm1tYyB2NCBjYXJkcyB3aWxsIGJlIHRyZWF0ZWQgYXMgdjMuXG4iLAorCQkJbW1jX2hvc3RuYW1lKGhvc3QpKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FyZCwgJmhvc3QtPmNhcmRzLCBub2RlKSB7CisJCWlmIChjYXJkLT5zdGF0ZSAmIChNTUNfU1RBVEVfREVBRHxNTUNfU1RBVEVfUFJFU0VOVCkpCisJCQljb250aW51ZTsKKwkJaWYgKG1tY19jYXJkX3NkKGNhcmQpKQorCQkJY29udGludWU7CisJCWlmIChjYXJkLT5jc2QubW1jYV92c24gPCBDU0RfU1BFQ19WRVJfNCkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IG1tY19zZWxlY3RfY2FyZChob3N0LCBjYXJkKTsKKwkJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpIHsKKwkJCW1tY19jYXJkX3NldF9kZWFkKGNhcmQpOworCQkJY29udGludWU7CisJCX0KKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfY29tbWFuZCkpOworCisJCWNtZC5vcGNvZGUgPSBNTUNfU0VORF9FWFRfQ1NEOworCQljbWQuYXJnID0gMDsKKwkJY21kLmZsYWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQURUQzsKKworCQltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2RhdGEpKTsKKworCQltbWNfc2V0X2RhdGFfdGltZW91dCgmZGF0YSwgY2FyZCwgMCk7CisKKwkJZGF0YS5ibGtzeiA9IDUxMjsKKwkJZGF0YS5ibG9ja3MgPSAxOworCQlkYXRhLmZsYWdzID0gTU1DX0RBVEFfUkVBRDsKKwkJZGF0YS5zZyA9ICZzZzsKKwkJZGF0YS5zZ19sZW4gPSAxOworCisJCW1lbXNldCgmbXJxLCAwLCBzaXplb2Yoc3RydWN0IG1tY19yZXF1ZXN0KSk7CisKKwkJbXJxLmNtZCA9ICZjbWQ7CisJCW1ycS5kYXRhID0gJmRhdGE7CisKKwkJc2dfaW5pdF9vbmUoJnNnLCBleHRfY3NkLCA1MTIpOworCisJCW1tY193YWl0X2Zvcl9yZXEoaG9zdCwgJm1ycSk7CisKKwkJaWYgKGNtZC5lcnJvciAhPSBNTUNfRVJSX05PTkUgfHwgZGF0YS5lcnJvciAhPSBNTUNfRVJSX05PTkUpIHsKKwkJCW1tY19jYXJkX3NldF9kZWFkKGNhcmQpOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKGV4dF9jc2RbRVhUX0NTRF9DQVJEX1RZUEVdKSB7CisJCWNhc2UgRVhUX0NTRF9DQVJEX1RZUEVfNTIgfCBFWFRfQ1NEX0NBUkRfVFlQRV8yNjoKKwkJCWNhcmQtPmV4dF9jc2QuaHNfbWF4X2R0ciA9IDUyMDAwMDAwOworCQkJYnJlYWs7CisJCWNhc2UgRVhUX0NTRF9DQVJEX1RZUEVfMjY6CisJCQljYXJkLT5leHRfY3NkLmhzX21heF9kdHIgPSAyNjAwMDAwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogTU1DIHY0IHNwZWMgc2F5cyB0aGlzIGNhbm5vdCBoYXBwZW4gKi8KKwkJCXByaW50aygiJXM6IGNhcmQgaXMgbW1jIHY0IGJ1dCBkb2Vzbid0IHN1cHBvcnQgIgorCQkJICAgICAgICJhbnkgaGlnaC1zcGVlZCBtb2Rlcy5cbiIsCisJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKKwkJCW1tY19jYXJkX3NldF9iYWQoY2FyZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEFjdGl2YXRlIGhpZ2hzcGVlZCBzdXBwb3J0LiAqLworCQljbWQub3Bjb2RlID0gTU1DX1NXSVRDSDsKKwkJY21kLmFyZyA9IChNTUNfU1dJVENIX01PREVfV1JJVEVfQllURSA8PCAyNCkgfAorCQkJICAoRVhUX0NTRF9IU19USU1JTkcgPDwgMTYpIHwKKwkJCSAgKDEgPDwgOCkgfAorCQkJICBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMOworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxQiB8IE1NQ19DTURfQUM7CisKKwkJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChob3N0LCAmY21kLCBDTURfUkVUUklFUyk7CisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CisJCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gc3dpdGNoIGNhcmQgdG8gbW1jIHY0ICIKKwkJCSAgICAgICAiaGlnaC1zcGVlZCBtb2RlLlxuIiwKKwkJCSAgICAgICBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOworCQkJY29udGludWU7CisJCX0KKworCQltbWNfY2FyZF9zZXRfaGlnaHNwZWVkKGNhcmQpOworCisJCS8qIENoZWNrIGZvciBob3N0IHN1cHBvcnQgZm9yIHdpZGUtYnVzIG1vZGVzLiAqLworCQlpZiAoIShob3N0LT5jYXBzICYgTU1DX0NBUF80X0JJVF9EQVRBKSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBBY3RpdmF0ZSA0LWJpdCBzdXBwb3J0LiAqLworCQljbWQub3Bjb2RlID0gTU1DX1NXSVRDSDsKKwkJY21kLmFyZyA9IChNTUNfU1dJVENIX01PREVfV1JJVEVfQllURSA8PCAyNCkgfAorCQkJICAoRVhUX0NTRF9CVVNfV0lEVEggPDwgMTYpIHwKKwkJCSAgKEVYVF9DU0RfQlVTX1dJRFRIXzQgPDwgOCkgfAorCQkJICBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMOworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxQiB8IE1NQ19DTURfQUM7CisKKwkJZXJyID0gbW1jX3dhaXRfZm9yX2NtZChob3N0LCAmY21kLCBDTURfUkVUUklFUyk7CisJCWlmIChlcnIgIT0gTU1DX0VSUl9OT05FKSB7CisJCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gc3dpdGNoIGNhcmQgdG8gIgorCQkJICAgICAgICJtbWMgdjQgNC1iaXQgYnVzIG1vZGUuXG4iLAorCQkJICAgICAgIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWhvc3QtPmlvcy5idXNfd2lkdGggPSBNTUNfQlVTX1dJRFRIXzQ7CisJfQorCisJa2ZyZWUoZXh0X2NzZCk7CisKKwltbWNfZGVzZWxlY3RfY2FyZHMoaG9zdCk7Cit9CisKIHN0YXRpYyB2b2lkIG1tY19yZWFkX3NjcnMoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewogCWludCBlcnI7CkBAIC0xMDI1LDE0ICsxMTU3LDEzMyBAQAogCW1tY19kZXNlbGVjdF9jYXJkcyhob3N0KTsKIH0KIAorc3RhdGljIHZvaWQgbW1jX3JlYWRfc3dpdGNoX2NhcHMoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCWludCBlcnI7CisJc3RydWN0IG1tY19jYXJkICpjYXJkOworCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnE7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKKwlzdHJ1Y3QgbW1jX2RhdGEgZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpzdGF0dXM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCisJc3RhdHVzID0ga21hbGxvYyg2NCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yICIKKwkJCSJyZWFkaW5nIHN3aXRjaCBjYXBhYmlsaXRpZXMuXG4iLAorCQkJbW1jX2hvc3RuYW1lKGhvc3QpKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FyZCwgJmhvc3QtPmNhcmRzLCBub2RlKSB7CisJCWlmIChjYXJkLT5zdGF0ZSAmIChNTUNfU1RBVEVfREVBRHxNTUNfU1RBVEVfUFJFU0VOVCkpCisJCQljb250aW51ZTsKKwkJaWYgKCFtbWNfY2FyZF9zZChjYXJkKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2FyZC0+c2NyLnNkYV92c24gPCBTQ1JfU1BFQ19WRVJfMSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IG1tY19zZWxlY3RfY2FyZChob3N0LCBjYXJkKTsKKwkJaWYgKGVyciAhPSBNTUNfRVJSX05PTkUpIHsKKwkJCW1tY19jYXJkX3NldF9kZWFkKGNhcmQpOworCQkJY29udGludWU7CisJCX0KKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfY29tbWFuZCkpOworCisJCWNtZC5vcGNvZGUgPSBTRF9TV0lUQ0g7CisJCWNtZC5hcmcgPSAweDAwRkZGRkYxOworCQljbWQuZmxhZ3MgPSBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BRFRDOworCisJCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfZGF0YSkpOworCisJCW1tY19zZXRfZGF0YV90aW1lb3V0KCZkYXRhLCBjYXJkLCAwKTsKKworCQlkYXRhLmJsa3N6ID0gNjQ7CisJCWRhdGEuYmxvY2tzID0gMTsKKwkJZGF0YS5mbGFncyA9IE1NQ19EQVRBX1JFQUQ7CisJCWRhdGEuc2cgPSAmc2c7CisJCWRhdGEuc2dfbGVuID0gMTsKKworCQltZW1zZXQoJm1ycSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfcmVxdWVzdCkpOworCisJCW1ycS5jbWQgPSAmY21kOworCQltcnEuZGF0YSA9ICZkYXRhOworCisJCXNnX2luaXRfb25lKCZzZywgc3RhdHVzLCA2NCk7CisKKwkJbW1jX3dhaXRfZm9yX3JlcShob3N0LCAmbXJxKTsKKworCQlpZiAoY21kLmVycm9yICE9IE1NQ19FUlJfTk9ORSB8fCBkYXRhLmVycm9yICE9IE1NQ19FUlJfTk9ORSkgeworCQkJbW1jX2NhcmRfc2V0X2RlYWQoY2FyZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdGF0dXNbMTNdICYgMHgwMikKKwkJCWNhcmQtPnN3X2NhcHMuaHNfbWF4X2R0ciA9IDUwMDAwMDAwOworCisJCW1lbXNldCgmY21kLCAwLCBzaXplb2Yoc3RydWN0IG1tY19jb21tYW5kKSk7CisKKwkJY21kLm9wY29kZSA9IFNEX1NXSVRDSDsKKwkJY21kLmFyZyA9IDB4ODBGRkZGRjE7CisJCWNtZC5mbGFncyA9IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FEVEM7CisKKwkJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IG1tY19kYXRhKSk7CisKKwkJbW1jX3NldF9kYXRhX3RpbWVvdXQoJmRhdGEsIGNhcmQsIDApOworCisJCWRhdGEuYmxrc3ogPSA2NDsKKwkJZGF0YS5ibG9ja3MgPSAxOworCQlkYXRhLmZsYWdzID0gTU1DX0RBVEFfUkVBRDsKKwkJZGF0YS5zZyA9ICZzZzsKKwkJZGF0YS5zZ19sZW4gPSAxOworCisJCW1lbXNldCgmbXJxLCAwLCBzaXplb2Yoc3RydWN0IG1tY19yZXF1ZXN0KSk7CisKKwkJbXJxLmNtZCA9ICZjbWQ7CisJCW1ycS5kYXRhID0gJmRhdGE7CisKKwkJc2dfaW5pdF9vbmUoJnNnLCBzdGF0dXMsIDY0KTsKKworCQltbWNfd2FpdF9mb3JfcmVxKGhvc3QsICZtcnEpOworCisJCWlmIChjbWQuZXJyb3IgIT0gTU1DX0VSUl9OT05FIHx8IGRhdGEuZXJyb3IgIT0gTU1DX0VSUl9OT05FKSB7CisJCQltbWNfY2FyZF9zZXRfZGVhZChjYXJkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChzdGF0dXNbMTZdICYgMHhGKSAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvYmxlbSBzd2l0Y2hpbmcgY2FyZCAiCisJCQkJImludG8gaGlnaC1zcGVlZCBtb2RlIVxuIiwKKwkJCQltbWNfaG9zdG5hbWUoaG9zdCkpOworCQkJY29udGludWU7CisJCX0KKworCQltbWNfY2FyZF9zZXRfaGlnaHNwZWVkKGNhcmQpOworCX0KKworCWtmcmVlKHN0YXR1cyk7CisKKwltbWNfZGVzZWxlY3RfY2FyZHMoaG9zdCk7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbW1jX2NhbGN1bGF0ZV9jbG9jayhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IG1tY19jYXJkICpjYXJkOwogCXVuc2lnbmVkIGludCBtYXhfZHRyID0gaG9zdC0+Zl9tYXg7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhcmQsICZob3N0LT5jYXJkcywgbm9kZSkKLQkJaWYgKCFtbWNfY2FyZF9kZWFkKGNhcmQpICYmIG1heF9kdHIgPiBjYXJkLT5jc2QubWF4X2R0cikKLQkJCW1heF9kdHIgPSBjYXJkLT5jc2QubWF4X2R0cjsKKwkJaWYgKCFtbWNfY2FyZF9kZWFkKGNhcmQpKSB7CisJCQlpZiAobW1jX2NhcmRfaGlnaHNwZWVkKGNhcmQpICYmIG1tY19jYXJkX3NkKGNhcmQpKSB7CisJCQkJaWYgKG1heF9kdHIgPiBjYXJkLT5zd19jYXBzLmhzX21heF9kdHIpCisJCQkJCW1heF9kdHIgPSBjYXJkLT5zd19jYXBzLmhzX21heF9kdHI7CisJCQl9IGVsc2UgaWYgKG1tY19jYXJkX2hpZ2hzcGVlZChjYXJkKSAmJiAhbW1jX2NhcmRfc2QoY2FyZCkpIHsKKwkJCQlpZiAobWF4X2R0ciA+IGNhcmQtPmV4dF9jc2QuaHNfbWF4X2R0cikKKwkJCQkJbWF4X2R0ciA9IGNhcmQtPmV4dF9jc2QuaHNfbWF4X2R0cjsKKwkJCX0gZWxzZSBpZiAobWF4X2R0ciA+IGNhcmQtPmNzZC5tYXhfZHRyKSB7CisJCQkJbWF4X2R0ciA9IGNhcmQtPmNzZC5tYXhfZHRyOworCQkJfQorCQl9CiAKIAlwcl9kZWJ1ZygiJXM6IHNlbGVjdGVkICVkLiUwM2RNSHogdHJhbnNmZXIgcmF0ZVxuIiwKIAkJIG1tY19ob3N0bmFtZShob3N0KSwKQEAgLTExNTAsOCArMTQwMSwxMSBAQAogCiAJbW1jX3JlYWRfY3Nkcyhob3N0KTsKIAotCWlmIChob3N0LT5tb2RlID09IE1NQ19NT0RFX1NEKQorCWlmIChob3N0LT5tb2RlID09IE1NQ19NT0RFX1NEKSB7CiAJCW1tY19yZWFkX3NjcnMoaG9zdCk7CisJCW1tY19yZWFkX3N3aXRjaF9jYXBzKGhvc3QpOworCX0gZWxzZQorCQltbWNfcHJvY2Vzc19leHRfY3Nkcyhob3N0KTsKIH0KIAogCkBAIC0xMTY1LDI3ICsxNDE5LDQwIEBACiAgKi8KIHZvaWQgbW1jX2RldGVjdF9jaGFuZ2Uoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBsb25nIGRlbGF5KQogewotCWlmIChkZWxheSkKLQkJbW1jX3NjaGVkdWxlX2RlbGF5ZWRfd29yaygmaG9zdC0+ZGV0ZWN0LCBkZWxheSk7Ci0JZWxzZQotCQltbWNfc2NoZWR1bGVfd29yaygmaG9zdC0+ZGV0ZWN0KTsKKwltbWNfc2NoZWR1bGVfZGVsYXllZF93b3JrKCZob3N0LT5kZXRlY3QsIGRlbGF5KTsKIH0KIAogRVhQT1JUX1NZTUJPTChtbWNfZGV0ZWN0X2NoYW5nZSk7CiAKIAotc3RhdGljIHZvaWQgbW1jX3Jlc2Nhbih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgbW1jX3Jlc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG1tY19ob3N0ICpob3N0ID0gZGF0YTsKKwlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1tY19ob3N0LCBkZXRlY3Qud29yayk7CiAJc3RydWN0IGxpc3RfaGVhZCAqbCwgKm47CisJdW5zaWduZWQgY2hhciBwb3dlcl9tb2RlOwogCiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAKLQlpZiAoaG9zdC0+aW9zLnBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09OKQorCS8qCisJICogQ2hlY2sgZm9yIHJlbW92ZWQgY2FyZHMgYW5kIG5ld2x5IGluc2VydGVkIG9uZXMuIFdlIGNoZWNrIGZvcgorCSAqIHJlbW92ZWQgY2FyZHMgZmlyc3Qgc28gd2UgY2FuIGludGVsbGlnZW50bHkgcmUtc2VsZWN0IHRoZSBWREQuCisJICovCisJcG93ZXJfbW9kZSA9IGhvc3QtPmlvcy5wb3dlcl9tb2RlOworCWlmIChwb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PTikKIAkJbW1jX2NoZWNrX2NhcmRzKGhvc3QpOwogCiAJbW1jX3NldHVwKGhvc3QpOwogCisJLyoKKwkgKiBTb21lIGJyb2tlbiBjYXJkcyBwcm9jZXNzIENNRDEgZXZlbiBpbiBzdGFuZC1ieSBzdGF0ZS4gVGhlcmUgaXMKKwkgKiBubyByZXBseSwgYnV0IGFuIElMTEVHQUxfQ09NTUFORCBlcnJvciBpcyBjYWNoZWQgYW5kIHJldHVybmVkCisJICogYWZ0ZXIgbmV4dCBjb21tYW5kLiBXZSBwb2xsIGZvciBjYXJkIHN0YXR1cyBoZXJlIHRvIGNsZWFyIGFueQorCSAqIHBvc3NpYmx5IHBlbmRpbmcgZXJyb3IuCisJICovCisJaWYgKHBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX09OKQorCQltbWNfY2hlY2tfY2FyZHMoaG9zdCk7CisKIAlpZiAoIWxpc3RfZW1wdHkoJmhvc3QtPmNhcmRzKSkgewogCQkvKgogCQkgKiAoUmUtKWNhbGN1bGF0ZSB0aGUgZmFzdGVzdCBjbG9jayByYXRlIHdoaWNoIHRoZQpAQCAtMTI0NCw3ICsxNTExLDcgQEAKIAkJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZob3N0LT53cSk7CiAJCUlOSVRfTElTVF9IRUFEKCZob3N0LT5jYXJkcyk7Ci0JCUlOSVRfV09SSygmaG9zdC0+ZGV0ZWN0LCBtbWNfcmVzY2FuLCBob3N0KTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJmhvc3QtPmRldGVjdCwgbW1jX3Jlc2Nhbik7CiAKIAkJLyoKIAkJICogQnkgZGVmYXVsdCwgaG9zdHMgZG8gbm90IHN1cHBvcnQgU0dJTyBvciBsYXJnZSByZXF1ZXN0cy4KQEAgLTEzNDIsNyArMTYwOSw3IEBACiAgKi8KIGludCBtbWNfcmVzdW1lX2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewotCW1tY19yZXNjYW4oaG9zdCk7CisJbW1jX3Jlc2NhbigmaG9zdC0+ZGV0ZWN0LndvcmspOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWMuaCBiL2RyaXZlcnMvbW1jL21tYy5oCmluZGV4IGNkNWUwYWIuLjE0OWFmZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tYy5oCisrKyBiL2RyaXZlcnMvbW1jL21tYy5oCkBAIC0yMCw2ICsyMCw2IEBACiB2b2lkIG1tY19mcmVlX2hvc3Rfc3lzZnMoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKIAogaW50IG1tY19zY2hlZHVsZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1pbnQgbW1jX3NjaGVkdWxlX2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpOworaW50IG1tY19zY2hlZHVsZV9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaywgdW5zaWduZWQgbG9uZyBkZWxheSk7CiB2b2lkIG1tY19mbHVzaF9zY2hlZHVsZWRfd29yayh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwppbmRleCBmOTAyN2M4Li44NzcxMzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfYmxvY2suYworKysgYi9kcml2ZXJzL21tYy9tbWNfYmxvY2suYwpAQCAtODMsNyArODMsNiBAQAogCW1kLT51c2FnZS0tOwogCWlmIChtZC0+dXNhZ2UgPT0gMCkgewogCQlwdXRfZGlzayhtZC0+ZGlzayk7Ci0JCW1tY19jbGVhbnVwX3F1ZXVlKCZtZC0+cXVldWUpOwogCQlrZnJlZShtZCk7CiAJfQogCW11dGV4X3VubG9jaygmb3Blbl9sb2NrKTsKQEAgLTIyNSwxMCArMjI0LDEwIEBACiAJc3RydWN0IG1tY19ibGtfZGF0YSAqbWQgPSBtcS0+ZGF0YTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBtZC0+cXVldWUuY2FyZDsKIAlzdHJ1Y3QgbW1jX2Jsa19yZXF1ZXN0IGJycTsKLQlpbnQgcmV0OworCWludCByZXQgPSAxOwogCiAJaWYgKG1tY19jYXJkX2NsYWltX2hvc3QoY2FyZCkpCi0JCWdvdG8gY21kX2VycjsKKwkJZ290byBmbHVzaF9xdWV1ZTsKIAogCWRvIHsKIAkJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKQEAgLTM0NSw4ICszNDQsNiBAQAogCXJldHVybiAxOwogCiAgY21kX2VycjoKLQlyZXQgPSAxOwotCiAgCS8qCiAgCSAqIElmIHRoaXMgaXMgYW4gU0QgY2FyZCBhbmQgd2UncmUgd3JpdGluZywgd2UgY2FuIGZpcnN0CiAgCSAqIG1hcmsgdGhlIGtub3duIGdvb2Qgc2VjdG9ycyBhcyBvay4KQEAgLTM4MCw2ICszNzcsNyBAQAogCiAJbW1jX2NhcmRfcmVsZWFzZV9ob3N0KGNhcmQpOwogCitmbHVzaF9xdWV1ZToKIAlzcGluX2xvY2tfaXJxKCZtZC0+bG9jayk7CiAJd2hpbGUgKHJldCkgewogCQlyZXQgPSBlbmRfdGhhdF9yZXF1ZXN0X2NodW5rKHJlcSwgMCwKQEAgLTU1MywxMiArNTUxLDExIEBACiAJaWYgKG1kKSB7CiAJCWludCBkZXZpZHg7CiAKKwkJLyogU3RvcCBuZXcgcmVxdWVzdHMgZnJvbSBnZXR0aW5nIGludG8gdGhlIHF1ZXVlICovCiAJCWRlbF9nZW5kaXNrKG1kLT5kaXNrKTsKIAotCQkvKgotCQkgKiBJIHRoaW5rIHRoaXMgaXMgbmVlZGVkLgotCQkgKi8KLQkJbWQtPmRpc2stPnF1ZXVlID0gTlVMTDsKKwkJLyogVGhlbiBmbHVzaCBvdXQgYW55IGFscmVhZHkgaW4gdGhlcmUgKi8KKwkJbW1jX2NsZWFudXBfcXVldWUoJm1kLT5xdWV1ZSk7CiAKIAkJZGV2aWR4ID0gbWQtPmRpc2stPmZpcnN0X21pbm9yID4+IE1NQ19TSElGVDsKIAkJX19jbGVhcl9iaXQoZGV2aWR4LCBkZXZfdXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL21tY19xdWV1ZS5jIGIvZHJpdmVycy9tbWMvbW1jX3F1ZXVlLmMKaW5kZXggNGNjZGQ4Mi4uM2UzNWE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvbW1jX3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvbW1jX3F1ZXVlLmMKQEAgLTEwLDEzICsxMCwxMyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgIm1tY19xdWV1ZS5oIgogCi0jZGVmaW5lIE1NQ19RVUVVRV9FWElUCQkoMSA8PCAwKQotI2RlZmluZSBNTUNfUVVFVUVfU1VTUEVOREVECSgxIDw8IDEpCisjZGVmaW5lIE1NQ19RVUVVRV9TVVNQRU5ERUQJKDEgPDwgMCkKIAogLyoKICAqIFByZXBhcmUgYSBNTUMgcmVxdWVzdC4gIEVzc2VudGlhbGx5LCB0aGlzIG1lYW5zIHBhc3NpbmcgdGhlCkBAIC01OSw3ICs1OSw2IEBACiB7CiAJc3RydWN0IG1tY19xdWV1ZSAqbXEgPSBkOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbXEtPnF1ZXVlOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCiAJLyoKIAkgKiBTZXQgaW90aHJlYWQgdG8gZW5zdXJlIHRoYXQgd2UgYXJlbid0IHB1dCB0byBzbGVlcCBieQpAQCAtNjcsMTIgKzY2LDcgQEAKIAkgKi8KIAljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQ3xQRl9OT0ZSRUVaRTsKIAotCWRhZW1vbml6ZSgibW1jcWQiKTsKLQotCWNvbXBsZXRlKCZtcS0+dGhyZWFkX2NvbXBsZXRlKTsKLQogCWRvd24oJm1xLT50aHJlYWRfc2VtKTsKLQlhZGRfd2FpdF9xdWV1ZSgmbXEtPnRocmVhZF93cSwgJndhaXQpOwogCWRvIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJlcSA9IE5VTEw7CiAKQEAgLTg0LDggKzc4LDEwIEBACiAJCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCQlpZiAoIXJlcSkgewotCQkJaWYgKG1xLT5mbGFncyAmIE1NQ19RVUVVRV9FWElUKQorCQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCQkJYnJlYWs7CisJCQl9CiAJCQl1cCgmbXEtPnRocmVhZF9zZW0pOwogCQkJc2NoZWR1bGUoKTsKIAkJCWRvd24oJm1xLT50aHJlYWRfc2VtKTsKQEAgLTk1LDEwICs5MSw4IEBACiAKIAkJbXEtPmlzc3VlX2ZuKG1xLCByZXEpOwogCX0gd2hpbGUgKDEpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZtcS0+dGhyZWFkX3dxLCAmd2FpdCk7CiAJdXAoJm1xLT50aHJlYWRfc2VtKTsKIAotCWNvbXBsZXRlX2FuZF9leGl0KCZtcS0+dGhyZWFkX2NvbXBsZXRlLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExLDkgKzEwNSwyMiBAQAogc3RhdGljIHZvaWQgbW1jX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCXN0cnVjdCBtbWNfcXVldWUgKm1xID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJaW50IHJldDsKKworCWlmICghbXEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNTUM6IGtpbGxpbmcgcmVxdWVzdHMgZm9yIGRlYWQgcXVldWVcbiIpOworCQl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpIHsKKwkJCWRvIHsKKwkJCQlyZXQgPSBlbmRfdGhhdF9yZXF1ZXN0X2NodW5rKHJlcSwgMCwKKwkJCQkJcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgPDwgOSk7CisJCQl9IHdoaWxlIChyZXQpOworCQl9CisJCXJldHVybjsKKwl9CiAKIAlpZiAoIW1xLT5yZXEpCi0JCXdha2VfdXAoJm1xLT50aHJlYWRfd3EpOworCQl3YWtlX3VwX3Byb2Nlc3MobXEtPnRocmVhZCk7CiB9CiAKIC8qKgpAQCAtMTMwLDggKzEzNyw4IEBACiAJdTY0IGxpbWl0ID0gQkxLX0JPVU5DRV9ISUdIOwogCWludCByZXQ7CiAKLQlpZiAoaG9zdC0+ZGV2LT5kbWFfbWFzayAmJiAqaG9zdC0+ZGV2LT5kbWFfbWFzaykKLQkJbGltaXQgPSAqaG9zdC0+ZGV2LT5kbWFfbWFzazsKKwlpZiAobW1jX2Rldihob3N0KS0+ZG1hX21hc2sgJiYgKm1tY19kZXYoaG9zdCktPmRtYV9tYXNrKQorCQlsaW1pdCA9ICptbWNfZGV2KGhvc3QpLT5kbWFfbWFzazsKIAogCW1xLT5jYXJkID0gY2FyZDsKIAltcS0+cXVldWUgPSBibGtfaW5pdF9xdWV1ZShtbWNfcmVxdWVzdCwgbG9jayk7CkBAIC0xNTIsMzYgKzE1OSw0MCBAQAogCQkJIEdGUF9LRVJORUwpOwogCWlmICghbXEtPnNnKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gY2xlYW51cDsKKwkJZ290byBjbGVhbnVwX3F1ZXVlOwogCX0KIAotCWluaXRfY29tcGxldGlvbigmbXEtPnRocmVhZF9jb21wbGV0ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbXEtPnRocmVhZF93cSk7CiAJaW5pdF9NVVRFWCgmbXEtPnRocmVhZF9zZW0pOwogCi0JcmV0ID0ga2VybmVsX3RocmVhZChtbWNfcXVldWVfdGhyZWFkLCBtcSwgQ0xPTkVfS0VSTkVMKTsKLQlpZiAocmV0ID49IDApIHsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmbXEtPnRocmVhZF9jb21wbGV0ZSk7Ci0JCWluaXRfY29tcGxldGlvbigmbXEtPnRocmVhZF9jb21wbGV0ZSk7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0OworCW1xLT50aHJlYWQgPSBrdGhyZWFkX3J1bihtbWNfcXVldWVfdGhyZWFkLCBtcSwgIm1tY3FkIik7CisJaWYgKElTX0VSUihtcS0+dGhyZWFkKSkgeworCQlyZXQgPSBQVFJfRVJSKG1xLT50aHJlYWQpOworCQlnb3RvIGZyZWVfc2c7CiAJfQogCi0gY2xlYW51cDoKKwlyZXR1cm4gMDsKKworIGZyZWVfc2c6CiAJa2ZyZWUobXEtPnNnKTsKIAltcS0+c2cgPSBOVUxMOwotCisgY2xlYW51cF9xdWV1ZToKIAlibGtfY2xlYW51cF9xdWV1ZShtcS0+cXVldWUpOwotIG91dDoKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChtbWNfaW5pdF9xdWV1ZSk7CiAKIHZvaWQgbW1jX2NsZWFudXBfcXVldWUoc3RydWN0IG1tY19xdWV1ZSAqbXEpCiB7Ci0JbXEtPmZsYWdzIHw9IE1NQ19RVUVVRV9FWElUOwotCXdha2VfdXAoJm1xLT50aHJlYWRfd3EpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1xLT50aHJlYWRfY29tcGxldGUpOworCXJlcXVlc3RfcXVldWVfdCAqcSA9IG1xLT5xdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTWFyayB0aGF0IHdlIHNob3VsZCBzdGFydCB0aHJvd2luZyBvdXQgc3RyYWdnbGVycyAqLworCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlxLT5xdWV1ZWRhdGEgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJLyogVGhlbiB0ZXJtaW5hdGUgb3VyIHdvcmtlciB0aHJlYWQgKi8KKwlrdGhyZWFkX3N0b3AobXEtPnRocmVhZCk7CiAKIAlrZnJlZShtcS0+c2cpOwogCW1xLT5zZyA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWNfcXVldWUuaCBiL2RyaXZlcnMvbW1jL21tY19xdWV1ZS5oCmluZGV4IDcxODJkMmYuLmM5ZjEzOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY19xdWV1ZS5oCisrKyBiL2RyaXZlcnMvbW1jL21tY19xdWV1ZS5oCkBAIC02LDggKzYsNyBAQAogCiBzdHJ1Y3QgbW1jX3F1ZXVlIHsKIAlzdHJ1Y3QgbW1jX2NhcmQJCSpjYXJkOwotCXN0cnVjdCBjb21wbGV0aW9uCXRocmVhZF9jb21wbGV0ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdAl0aHJlYWRfd3E7CisJc3RydWN0IHRhc2tfc3RydWN0CSp0aHJlYWQ7CiAJc3RydWN0IHNlbWFwaG9yZQl0aHJlYWRfc2VtOwogCXVuc2lnbmVkIGludAkJZmxhZ3M7CiAJc3RydWN0IHJlcXVlc3QJCSpyZXE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYyBiL2RyaXZlcnMvbW1jL21tY19zeXNmcy5jCmluZGV4IDEwY2M5NzMuLmUzMzRhY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY19zeXNmcy5jCisrKyBiL2RyaXZlcnMvbW1jL21tY19zeXNmcy5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfY2FyZCkpOwogCWNhcmQtPmhvc3QgPSBob3N0OwogCWRldmljZV9pbml0aWFsaXplKCZjYXJkLT5kZXYpOwotCWNhcmQtPmRldi5wYXJlbnQgPSBjYXJkLT5ob3N0LT5kZXY7CisJY2FyZC0+ZGV2LnBhcmVudCA9IG1tY19kZXYoaG9zdCk7CiAJY2FyZC0+ZGV2LmJ1cyA9ICZtbWNfYnVzX3R5cGU7CiAJY2FyZC0+ZGV2LnJlbGVhc2UgPSBtbWNfcmVsZWFzZV9jYXJkOwogfQpAQCAtMjQyLDcgKzI0Miw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgbW1jX2hvc3RfY2xhc3NkZXZfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBtbWNfaG9zdF9jbGFzc2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QgPSBjbHNfZGV2X3RvX21tY19ob3N0KGRldik7CiAJa2ZyZWUoaG9zdCk7CkBAIC0yNTAsNyArMjUwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGFzcyBtbWNfaG9zdF9jbGFzcyA9IHsKIAkubmFtZQkJPSAibW1jX2hvc3QiLAotCS5yZWxlYXNlCT0gbW1jX2hvc3RfY2xhc3NkZXZfcmVsZWFzZSwKKwkuZGV2X3JlbGVhc2UJPSBtbWNfaG9zdF9jbGFzc2Rldl9yZWxlYXNlLAogfTsKIAogc3RhdGljIERFRklORV9JRFIobW1jX2hvc3RfaWRyKTsKQEAgLTI2NywxMCArMjY3LDEwIEBACiAJaWYgKGhvc3QpIHsKIAkJbWVtc2V0KGhvc3QsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2hvc3QpICsgZXh0cmEpOwogCi0JCWhvc3QtPmRldiA9IGRldjsKLQkJaG9zdC0+Y2xhc3NfZGV2LmRldiA9IGhvc3QtPmRldjsKKwkJaG9zdC0+cGFyZW50ID0gZGV2OworCQlob3N0LT5jbGFzc19kZXYucGFyZW50ID0gZGV2OwogCQlob3N0LT5jbGFzc19kZXYuY2xhc3MgPSAmbW1jX2hvc3RfY2xhc3M7Ci0JCWNsYXNzX2RldmljZV9pbml0aWFsaXplKCZob3N0LT5jbGFzc19kZXYpOworCQlkZXZpY2VfaW5pdGlhbGl6ZSgmaG9zdC0+Y2xhc3NfZGV2KTsKIAl9CiAKIAlyZXR1cm4gaG9zdDsKQEAgLTI5MiwxMCArMjkyLDEwIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXNucHJpbnRmKGhvc3QtPmNsYXNzX2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsCisJc25wcmludGYoaG9zdC0+Y2xhc3NfZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCiAJCSAibW1jJWQiLCBob3N0LT5pbmRleCk7CiAKLQlyZXR1cm4gY2xhc3NfZGV2aWNlX2FkZCgmaG9zdC0+Y2xhc3NfZGV2KTsKKwlyZXR1cm4gZGV2aWNlX2FkZCgmaG9zdC0+Y2xhc3NfZGV2KTsKIH0KIAogLyoKQEAgLTMwMyw3ICszMDMsNyBAQAogICovCiB2b2lkIG1tY19yZW1vdmVfaG9zdF9zeXNmcyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7Ci0JY2xhc3NfZGV2aWNlX2RlbCgmaG9zdC0+Y2xhc3NfZGV2KTsKKwlkZXZpY2VfZGVsKCZob3N0LT5jbGFzc19kZXYpOwogCiAJc3Bpbl9sb2NrKCZtbWNfaG9zdF9sb2NrKTsKIAlpZHJfcmVtb3ZlKCZtbWNfaG9zdF9pZHIsIGhvc3QtPmluZGV4KTsKQEAgLTMxNSwyMyArMzE1LDE1IEBACiAgKi8KIHZvaWQgbW1jX2ZyZWVfaG9zdF9zeXNmcyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7Ci0JY2xhc3NfZGV2aWNlX3B1dCgmaG9zdC0+Y2xhc3NfZGV2KTsKKwlwdXRfZGV2aWNlKCZob3N0LT5jbGFzc19kZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKIAogLyoKLSAqIEludGVybmFsIGZ1bmN0aW9uLiBTY2hlZHVsZSB3b3JrIGluIHRoZSBNTUMgd29yayBxdWV1ZS4KLSAqLwotaW50IG1tY19zY2hlZHVsZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlyZXR1cm4gcXVldWVfd29yayh3b3JrcXVldWUsIHdvcmspOwotfQotCi0vKgogICogSW50ZXJuYWwgZnVuY3Rpb24uIFNjaGVkdWxlIGRlbGF5ZWQgd29yayBpbiB0aGUgTU1DIHdvcmsgcXVldWUuCiAgKi8KLWludCBtbWNfc2NoZWR1bGVfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgdW5zaWduZWQgbG9uZyBkZWxheSkKK2ludCBtbWNfc2NoZWR1bGVfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7CiAJcmV0dXJuIHF1ZXVlX2RlbGF5ZWRfd29yayh3b3JrcXVldWUsIHdvcmssIGRlbGF5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL21tY2kuYyBiL2RyaXZlcnMvbW1jL21tY2kuYwppbmRleCA4Mjg1MDNjLi5lOWI4MGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNpLmMKKysrIGIvZHJpdmVycy9tbWMvbW1jaS5jCkBAIC00NDMsNyArNDQzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIG1tY2lfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgbW1jaV9vcHMgPSB7CiAJLnJlcXVlc3QJPSBtbWNpX3JlcXVlc3QsCiAJLnNldF9pb3MJPSBtbWNpX3NldF9pb3MsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvb21hcC5jIGIvZHJpdmVycy9tbWMvb21hcC5jCmluZGV4IDc2MmZhMjguLjQzNWQzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL29tYXAuYworKysgYi9kcml2ZXJzL21tYy9vbWFwLmMKQEAgLTM4LDcgKzM4LDU3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RwczY1MDEwLmg+CiAKLSNpbmNsdWRlICJvbWFwLmgiCisjZGVmaW5lCU9NQVBfTU1DX1JFR19DTUQJMHgwMAorI2RlZmluZQlPTUFQX01NQ19SRUdfQVJHTAkweDA0CisjZGVmaW5lCU9NQVBfTU1DX1JFR19BUkdICTB4MDgKKyNkZWZpbmUJT01BUF9NTUNfUkVHX0NPTgkweDBjCisjZGVmaW5lCU9NQVBfTU1DX1JFR19TVEFUCTB4MTAKKyNkZWZpbmUJT01BUF9NTUNfUkVHX0lFCQkweDE0CisjZGVmaW5lCU9NQVBfTU1DX1JFR19DVE8JMHgxOAorI2RlZmluZQlPTUFQX01NQ19SRUdfRFRPCTB4MWMKKyNkZWZpbmUJT01BUF9NTUNfUkVHX0RBVEEJMHgyMAorI2RlZmluZQlPTUFQX01NQ19SRUdfQkxFTgkweDI0CisjZGVmaW5lCU9NQVBfTU1DX1JFR19OQkxLCTB4MjgKKyNkZWZpbmUJT01BUF9NTUNfUkVHX0JVRgkweDJjCisjZGVmaW5lIE9NQVBfTU1DX1JFR19TRElPCTB4MzQKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1JFVgkweDNjCisjZGVmaW5lCU9NQVBfTU1DX1JFR19SU1AwCTB4NDAKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDEJMHg0NAorI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQMgkweDQ4CisjZGVmaW5lCU9NQVBfTU1DX1JFR19SU1AzCTB4NGMKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDQJMHg1MAorI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQNQkweDU0CisjZGVmaW5lCU9NQVBfTU1DX1JFR19SU1A2CTB4NTgKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDcJMHg1YworI2RlZmluZQlPTUFQX01NQ19SRUdfSU9TUgkweDYwCisjZGVmaW5lCU9NQVBfTU1DX1JFR19TWVNDCTB4NjQKKyNkZWZpbmUJT01BUF9NTUNfUkVHX1NZU1MJMHg2OAorCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfQ0FSRF9FUlIJCSgxIDw8IDE0KQorI2RlZmluZQlPTUFQX01NQ19TVEFUX0NBUkRfSVJRCQkoMSA8PCAxMykKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9PQ1JfQlVTWQkJKDEgPDwgMTIpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfQV9FTVBUWQkJKDEgPDwgMTEpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfQV9GVUxMCQkoMSA8PCAxMCkKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9DTURfQ1JDCQkoMSA8PCAgOCkKKyNkZWZpbmUJT01BUF9NTUNfU1RBVF9DTURfVE9VVAkJKDEgPDwgIDcpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfREFUQV9DUkMJCSgxIDw8ICA2KQorI2RlZmluZQlPTUFQX01NQ19TVEFUX0RBVEFfVE9VVAkJKDEgPDwgIDUpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfRU5EX0JVU1kJCSgxIDw8ICA0KQorI2RlZmluZQlPTUFQX01NQ19TVEFUX0VORF9PRl9EQVRBCSgxIDw8ICAzKQorI2RlZmluZQlPTUFQX01NQ19TVEFUX0NBUkRfQlVTWQkJKDEgPDwgIDIpCisjZGVmaW5lCU9NQVBfTU1DX1NUQVRfRU5EX09GX0NNRAkoMSA8PCAgMCkKKworI2RlZmluZSBPTUFQX01NQ19SRUFEKGhvc3QsIHJlZykJX19yYXdfcmVhZHcoKGhvc3QpLT52aXJ0X2Jhc2UgKyBPTUFQX01NQ19SRUdfIyNyZWcpCisjZGVmaW5lIE9NQVBfTU1DX1dSSVRFKGhvc3QsIHJlZywgdmFsKQlfX3Jhd193cml0ZXcoKHZhbCksIChob3N0KS0+dmlydF9iYXNlICsgT01BUF9NTUNfUkVHXyMjcmVnKQorCisvKgorICogQ29tbWFuZCB0eXBlcworICovCisjZGVmaW5lIE9NQVBfTU1DX0NNRFRZUEVfQkMJMAorI2RlZmluZSBPTUFQX01NQ19DTURUWVBFX0JDUgkxCisjZGVmaW5lIE9NQVBfTU1DX0NNRFRZUEVfQUMJMgorI2RlZmluZSBPTUFQX01NQ19DTURUWVBFX0FEVEMJMworCiAKICNkZWZpbmUgRFJJVkVSX05BTUUgIm1tY2ktb21hcCIKICNkZWZpbmUgUlNQX1RZUEUoeCkJKCh4KSAmIH4oTU1DX1JTUF9CVVNZfE1NQ19SU1BfT1BDT0RFKSkKQEAgLTYwLDggKzExMCw5IEBACiAJdW5zaWduZWQgY2hhcgkJaWQ7IC8qIDE2eHggY2hpcHMgaGF2ZSAyIE1NQyBibG9ja3MgKi8KIAlzdHJ1Y3QgY2xrICoJCWljbGs7CiAJc3RydWN0IGNsayAqCQlmY2xrOwotCXN0cnVjdCByZXNvdXJjZQkJKnJlczsKLQl2b2lkIF9faW9tZW0JCSpiYXNlOworCXN0cnVjdCByZXNvdXJjZQkJKm1lbV9yZXM7CisJdm9pZCBfX2lvbWVtCQkqdmlydF9iYXNlOworCXVuc2lnbmVkIGludAkJcGh5c19iYXNlOwogCWludAkJCWlycTsKIAl1bnNpZ25lZCBjaGFyCQlidXNfbW9kZTsKIAl1bnNpZ25lZCBjaGFyCQlod19idXNfbW9kZTsKQEAgLTE5MSwxNiArMjQyLDE2IEBACiAKIAljbGtfZW5hYmxlKGhvc3QtPmZjbGspOwogCi0JT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgQ1RPLCAyMDApOwotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEFSR0wsIGNtZC0+YXJnICYgMHhmZmZmKTsKLQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBBUkdILCBjbWQtPmFyZyA+PiAxNik7Ci0JT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgSUUsCisJT01BUF9NTUNfV1JJVEUoaG9zdCwgQ1RPLCAyMDApOworCU9NQVBfTU1DX1dSSVRFKGhvc3QsIEFSR0wsIGNtZC0+YXJnICYgMHhmZmZmKTsKKwlPTUFQX01NQ19XUklURShob3N0LCBBUkdILCBjbWQtPmFyZyA+PiAxNik7CisJT01BUF9NTUNfV1JJVEUoaG9zdCwgSUUsCiAJCSAgICAgICBPTUFQX01NQ19TVEFUX0FfRU1QVFkgICAgfCBPTUFQX01NQ19TVEFUX0FfRlVMTCAgICB8CiAJCSAgICAgICBPTUFQX01NQ19TVEFUX0NNRF9DUkMgICAgfCBPTUFQX01NQ19TVEFUX0NNRF9UT1VUICB8CiAJCSAgICAgICBPTUFQX01NQ19TVEFUX0RBVEFfQ1JDICAgfCBPTUFQX01NQ19TVEFUX0RBVEFfVE9VVCB8CiAJCSAgICAgICBPTUFQX01NQ19TVEFUX0VORF9PRl9DTUQgfCBPTUFQX01NQ19TVEFUX0NBUkRfRVJSICB8CiAJCSAgICAgICBPTUFQX01NQ19TVEFUX0VORF9PRl9EQVRBKTsKLQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBDTUQsIGNtZHJlZyk7CisJT01BUF9NTUNfV1JJVEUoaG9zdCwgQ01ELCBjbWRyZWcpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjk2LDIyICszNDcsMjIgQEAKIAkJaWYgKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQXzEzNikgewogCQkJLyogcmVzcG9uc2UgdHlwZSAyICovCiAJCQljbWQtPnJlc3BbM10gPQotCQkJCU9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQMCkgfAotCQkJCShPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFJTUDEpIDw8IDE2KTsKKwkJCQlPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDApIHwKKwkJCQkoT01BUF9NTUNfUkVBRChob3N0LCBSU1AxKSA8PCAxNik7CiAJCQljbWQtPnJlc3BbMl0gPQotCQkJCU9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQMikgfAotCQkJCShPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFJTUDMpIDw8IDE2KTsKKwkJCQlPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDIpIHwKKwkJCQkoT01BUF9NTUNfUkVBRChob3N0LCBSU1AzKSA8PCAxNik7CiAJCQljbWQtPnJlc3BbMV0gPQotCQkJCU9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQNCkgfAotCQkJCShPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFJTUDUpIDw8IDE2KTsKKwkJCQlPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDQpIHwKKwkJCQkoT01BUF9NTUNfUkVBRChob3N0LCBSU1A1KSA8PCAxNik7CiAJCQljbWQtPnJlc3BbMF0gPQotCQkJCU9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQNikgfAotCQkJCShPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFJTUDcpIDw8IDE2KTsKKwkJCQlPTUFQX01NQ19SRUFEKGhvc3QsIFJTUDYpIHwKKwkJCQkoT01BUF9NTUNfUkVBRChob3N0LCBSU1A3KSA8PCAxNik7CiAJCX0gZWxzZSB7CiAJCQkvKiByZXNwb25zZSB0eXBlcyAxLCAxYiwgMywgNCwgNSwgNiAqLwogCQkJY21kLT5yZXNwWzBdID0KLQkJCQlPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFJTUDYpIHwKLQkJCQkoT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBSU1A3KSA8PCAxNik7CisJCQkJT01BUF9NTUNfUkVBRChob3N0LCBSU1A2KSB8CisJCQkJKE9NQVBfTU1DX1JFQUQoaG9zdCwgUlNQNykgPDwgMTYpOwogCQl9CiAJfQogCkBAIC0zNTQsOSArNDA1LDkgQEAKIAlob3N0LT5kYXRhLT5ieXRlc194ZmVyZWQgKz0gbjsKIAogCWlmICh3cml0ZSkgewotCQlfX3Jhd193cml0ZXN3KGhvc3QtPmJhc2UgKyBPTUFQX01NQ19SRUdfREFUQSwgaG9zdC0+YnVmZmVyLCBuKTsKKwkJX19yYXdfd3JpdGVzdyhob3N0LT52aXJ0X2Jhc2UgKyBPTUFQX01NQ19SRUdfREFUQSwgaG9zdC0+YnVmZmVyLCBuKTsKIAl9IGVsc2UgewotCQlfX3Jhd19yZWFkc3coaG9zdC0+YmFzZSArIE9NQVBfTU1DX1JFR19EQVRBLCBob3N0LT5idWZmZXIsIG4pOworCQlfX3Jhd19yZWFkc3coaG9zdC0+dmlydF9iYXNlICsgT01BUF9NTUNfUkVHX0RBVEEsIGhvc3QtPmJ1ZmZlciwgbik7CiAJfQogfQogCkBAIC0zODYsMTEgKzQzNywxMSBAQAogCWludCB0cmFuc2Zlcl9lcnJvcjsKIAogCWlmIChob3N0LT5jbWQgPT0gTlVMTCAmJiBob3N0LT5kYXRhID09IE5VTEwpIHsKLQkJc3RhdHVzID0gT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBTVEFUKTsKKwkJc3RhdHVzID0gT01BUF9NTUNfUkVBRChob3N0LCBTVEFUKTsKIAkJZGV2X2luZm8obW1jX2Rldihob3N0LT5tbWMpLCJzcHVyaW91cyBpcnEgMHglMDR4XG4iLCBzdGF0dXMpOwogCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIFNUQVQsIHN0YXR1cyk7Ci0JCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBJRSwgMCk7CisJCQlPTUFQX01NQ19XUklURShob3N0LCBTVEFULCBzdGF0dXMpOworCQkJT01BUF9NTUNfV1JJVEUoaG9zdCwgSUUsIDApOwogCQl9CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CkBAIC0zOTksOCArNDUwLDggQEAKIAllbmRfdHJhbnNmZXIgPSAwOwogCXRyYW5zZmVyX2Vycm9yID0gMDsKIAotCXdoaWxlICgoc3RhdHVzID0gT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBTVEFUKSkgIT0gMCkgewotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBTVEFULCBzdGF0dXMpOworCXdoaWxlICgoc3RhdHVzID0gT01BUF9NTUNfUkVBRChob3N0LCBTVEFUKSkgIT0gMCkgeworCQlPTUFQX01NQ19XUklURShob3N0LCBTVEFULCBzdGF0dXMpOwogI2lmZGVmIENPTkZJR19NTUNfREVCVUcKIAkJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJNTUMgSVJRICUwNHggKENNRCAlZCk6ICIsCiAJCQlzdGF0dXMsIGhvc3QtPmNtZCAhPSBOVUxMID8gaG9zdC0+Y21kLT5vcGNvZGUgOiAtMSk7CkBAIC00NzAsOCArNTIxLDggQEAKIAogCQlpZiAoc3RhdHVzICYgT01BUF9NTUNfU1RBVF9DQVJEX0VSUikgewogCQkJaWYgKGhvc3QtPmNtZCAmJiBob3N0LT5jbWQtPm9wY29kZSA9PSBNTUNfU1RPUF9UUkFOU01JU1NJT04pIHsKLQkJCQl1MzIgcmVzcG9uc2UgPSBPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFJTUDYpCi0JCQkJCXwgKE9NQVBfTU1DX1JFQUQoaG9zdC0+YmFzZSwgUlNQNykgPDwgMTYpOworCQkJCXUzMiByZXNwb25zZSA9IE9NQVBfTU1DX1JFQUQoaG9zdCwgUlNQNikKKwkJCQkJfCAoT01BUF9NTUNfUkVBRChob3N0LCBSU1A3KSA8PCAxNik7CiAJCQkJLyogU1RPUCBzb21ldGltZXMgc2V0cyBtdXN0LWlnbm9yZSBiaXRzICovCiAJCQkJaWYgKCEocmVzcG9uc2UgJiAoUjFfQ0NfRVJST1IKIAkJCQkJCQkJfCBSMV9JTExFR0FMX0NPTU1BTkQKQEAgLTUzMCwxMiArNTgxLDYgQEAKIAlzY2hlZHVsZV93b3JrKCZob3N0LT5zd2l0Y2hfd29yayk7CiB9CiAKLS8qIEZJWE1FOiBIYW5kbGUgY2FyZCBpbnNlcnRpb24gYW5kIHJlbW92YWwgcHJvcGVybHkuIE1heWJlIHVzZSBhIG1hc2sKLSAqIGZvciBNTUMgc3RhdGU/ICovCi1zdGF0aWMgdm9pZCBtbWNfb21hcF9zd2l0Y2hfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhLCB1OCBtbWNfbWFzaykKLXsKLX0KLQogc3RhdGljIHZvaWQgbW1jX29tYXBfc3dpdGNoX2hhbmRsZXIodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbW1jX29tYXBfaG9zdCAqaG9zdCA9IChzdHJ1Y3QgbW1jX29tYXBfaG9zdCAqKSBkYXRhOwpAQCAtNTgxLDcgKzYyNiw3IEBACiAJaW50IGRzdF9wb3J0ID0gMDsKIAlpbnQgc3luY19kZXYgPSAwOwogCi0JZGF0YV9hZGRyID0gaW9fdjJwKCh1MzIpIGhvc3QtPmJhc2UpICsgT01BUF9NTUNfUkVHX0RBVEE7CisJZGF0YV9hZGRyID0gaG9zdC0+cGh5c19iYXNlICsgT01BUF9NTUNfUkVHX0RBVEE7CiAJZnJhbWUgPSBkYXRhLT5ibGtzejsKIAljb3VudCA9IHNnX2RtYV9sZW4oc2cpOwogCkBAIC02NDAsMTAgKzY4NSw5IEBACiAJfQogCiAJLyogTWF4IGxpbWl0IGZvciBETUEgZnJhbWUgY291bnQgaXMgMHhmZmZmICovCi0JaWYgKHVubGlrZWx5KGNvdW50ID4gMHhmZmZmKSkKLQkJQlVHKCk7CisJQlVHX09OKGNvdW50ID4gMHhmZmZmKTsKIAotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEJVRiwgYnVmKTsKKwlPTUFQX01NQ19XUklURShob3N0LCBCVUYsIGJ1Zik7CiAJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhkbWFfY2gsIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCiAJCQkJICAgICBmcmFtZSwgY291bnQsIE9NQVBfRE1BX1NZTkNfRlJBTUUsCiAJCQkJICAgICBzeW5jX2RldiwgMCk7CkBAIC03MjgsMTEgKzc3MiwxMSBAQAogewogCXUxNiByZWc7CiAKLQlyZWcgPSBPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFNESU8pOworCXJlZyA9IE9NQVBfTU1DX1JFQUQoaG9zdCwgU0RJTyk7CiAJcmVnICY9IH4oMSA8PCA1KTsKLQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBTRElPLCByZWcpOworCU9NQVBfTU1DX1dSSVRFKGhvc3QsIFNESU8sIHJlZyk7CiAJLyogU2V0IG1heGltdW0gdGltZW91dCAqLwotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIENUTywgMHhmZik7CisJT01BUF9NTUNfV1JJVEUoaG9zdCwgQ1RPLCAweGZmKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9kYXRhX3RpbWVvdXQoc3RydWN0IG1tY19vbWFwX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxKQpAQCAtNzQ2LDE0ICs3OTAsMTQgQEAKIAl0aW1lb3V0ID0gcmVxLT5kYXRhLT50aW1lb3V0X2Nsa3MgKyByZXEtPmRhdGEtPnRpbWVvdXRfbnMgLyA1MDA7CiAKIAkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHVzZSB0aW1lb3V0IG11bHRpcGxpZXIgcmVnaXN0ZXIgKi8KLQlyZWcgPSBPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIFNESU8pOworCXJlZyA9IE9NQVBfTU1DX1JFQUQoaG9zdCwgU0RJTyk7CiAJaWYgKHRpbWVvdXQgPiAweGZmZmYpIHsKIAkJcmVnIHw9ICgxIDw8IDUpOwogCQl0aW1lb3V0IC89IDEwMjQ7CiAJfSBlbHNlCiAJCXJlZyAmPSB+KDEgPDwgNSk7Ci0JT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgU0RJTywgcmVnKTsKLQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBEVE8sIHRpbWVvdXQpOworCU9NQVBfTU1DX1dSSVRFKGhvc3QsIFNESU8sIHJlZyk7CisJT01BUF9NTUNfV1JJVEUoaG9zdCwgRFRPLCB0aW1lb3V0KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTc2NSwxOSArODA5LDE4IEBACiAKIAlob3N0LT5kYXRhID0gZGF0YTsKIAlpZiAoZGF0YSA9PSBOVUxMKSB7Ci0JCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEJMRU4sIDApOwotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBOQkxLLCAwKTsKLQkJT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgQlVGLCAwKTsKKwkJT01BUF9NTUNfV1JJVEUoaG9zdCwgQkxFTiwgMCk7CisJCU9NQVBfTU1DX1dSSVRFKGhvc3QsIE5CTEssIDApOworCQlPTUFQX01NQ19XUklURShob3N0LCBCVUYsIDApOwogCQlob3N0LT5kbWFfaW5fdXNlID0gMDsKIAkJc2V0X2NtZF90aW1lb3V0KGhvc3QsIHJlcSk7CiAJCXJldHVybjsKIAl9CiAKLQogCWJsb2NrX3NpemUgPSBkYXRhLT5ibGtzejsKIAotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIE5CTEssIGRhdGEtPmJsb2NrcyAtIDEpOwotCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEJMRU4sIGJsb2NrX3NpemUgLSAxKTsKKwlPTUFQX01NQ19XUklURShob3N0LCBOQkxLLCBkYXRhLT5ibG9ja3MgLSAxKTsKKwlPTUFQX01NQ19XUklURShob3N0LCBCTEVOLCBibG9ja19zaXplIC0gMSk7CiAJc2V0X2RhdGFfdGltZW91dChob3N0LCByZXEpOwogCiAJLyogY29wZSB3aXRoIGNhbGxpbmcgbGF5ZXIgY29uZnVzaW9uOyBpdCBpc3N1ZXMgInNpbmdsZQpAQCAtODE5LDcgKzg2Miw3IEBACiAKIAkvKiBSZXZlcnQgdG8gUElPPyAqLwogCWlmICghdXNlX2RtYSkgewotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBCVUYsIDB4MWYxZik7CisJCU9NQVBfTU1DX1dSSVRFKGhvc3QsIEJVRiwgMHgxZjFmKTsKIAkJaG9zdC0+dG90YWxfYnl0ZXNfbGVmdCA9IGRhdGEtPmJsb2NrcyAqIGJsb2NrX3NpemU7CiAJCWhvc3QtPnNnX2xlbiA9IHNnX2xlbjsKIAkJbW1jX29tYXBfc2dfdG9fYnVmKGhvc3QpOwpAQCAtODQ1LDcgKzg4OCw2IEBACiBzdGF0aWMgdm9pZCBpbm5vdmF0b3JfZnBnYV9zb2NrZXRfcG93ZXIoaW50IG9uKQogewogI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1WFgpCi0KIAlpZiAob24pIHsKIAkJZnBnYV93cml0ZShmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUikgfCAoMSA8PCAzKSwKIAkJICAgICBPTUFQMTUxMF9GUEdBX1BPV0VSKTsKQEAgLTg3MSw4ICs5MTMsOCBAQAogCQkJLyogR1BJTyA0IG9mIFRQUzY1MDEwIHNlbmRzIFNEX0VOIHNpZ25hbCAqLwogCQkJdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU80LCBISUdIKTsKIAkJZWxzZSBpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKLQkJCXUxNiByZWcgPSBPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIENPTik7Ci0JCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBDT04sIHJlZyB8ICgxIDw8IDExKSk7CisJCQl1MTYgcmVnID0gT01BUF9NTUNfUkVBRChob3N0LCBDT04pOworCQkJT01BUF9NTUNfV1JJVEUoaG9zdCwgQ09OLCByZWcgfCAoMSA8PCAxMSkpOwogCQl9IGVsc2UKIAkJCWlmIChob3N0LT5wb3dlcl9waW4gPj0gMCkKIAkJCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoaG9zdC0+cG93ZXJfcGluLCAxKTsKQEAgLTg4NCw4ICs5MjYsOCBAQAogCQllbHNlIGlmIChtYWNoaW5lX2lzX29tYXBfaDMoKSkKIAkJCXRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPNCwgTE9XKTsKIAkJZWxzZSBpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKLQkJCXUxNiByZWcgPSBPTUFQX01NQ19SRUFEKGhvc3QtPmJhc2UsIENPTik7Ci0JCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBDT04sIHJlZyAmIH4oMSA8PCAxMSkpOworCQkJdTE2IHJlZyA9IE9NQVBfTU1DX1JFQUQoaG9zdCwgQ09OKTsKKwkJCU9NQVBfTU1DX1dSSVRFKGhvc3QsIENPTiwgcmVnICYgfigxIDw8IDExKSk7CiAJCX0gZWxzZQogCQkJaWYgKGhvc3QtPnBvd2VyX3BpbiA+PSAwKQogCQkJCW9tYXBfc2V0X2dwaW9fZGF0YW91dChob3N0LT5wb3dlcl9waW4sIDApOwpAQCAtOTI3LDcgKzk2OSw3IEBACiAJY2FzZSBNTUNfUE9XRVJfVVA6CiAJY2FzZSBNTUNfUE9XRVJfT046CiAJCW1tY19vbWFwX3Bvd2VyKGhvc3QsIDEpOwotCQlkc29yIHw9IDE8PDExOworCQlkc29yIHw9IDEgPDwgMTE7CiAJCWJyZWFrOwogCX0KIApAQCAtOTQxLDE0ICs5ODMsMTQgQEAKIAkgKiB3aGljaCByZXN1bHRzIGluIHRoZSB3aGlsZSBsb29wIGJlbG93IGdldHRpbmcgc3R1Y2suCiAJICogV3JpdGluZyB0byB0aGUgQ09OIHJlZ2lzdGVyIHR3aWNlIHNlZW1zIHRvIGRvIHRoZSB0cmljay4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBDT04sIGRzb3IpOworCQlPTUFQX01NQ19XUklURShob3N0LCBDT04sIGRzb3IpOwogCWlmIChpb3MtPnBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX1VQKSB7CiAJCS8qIFNlbmQgY2xvY2sgY3ljbGVzLCBwb2xsIGNvbXBsZXRpb24gKi8KLQkJT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgSUUsIDApOwotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBTVEFULCAweGZmZmYpOwotCQlPTUFQX01NQ19XUklURShob3N0LT5iYXNlLCBDTUQsIDE8PDcpOwotCQl3aGlsZSAoMCA9PSAoT01BUF9NTUNfUkVBRChob3N0LT5iYXNlLCBTVEFUKSAmIDEpKTsKLQkJT01BUF9NTUNfV1JJVEUoaG9zdC0+YmFzZSwgU1RBVCwgMSk7CisJCU9NQVBfTU1DX1dSSVRFKGhvc3QsIElFLCAwKTsKKwkJT01BUF9NTUNfV1JJVEUoaG9zdCwgU1RBVCwgMHhmZmZmKTsKKwkJT01BUF9NTUNfV1JJVEUoaG9zdCwgQ01ELCAxIDw8IDcpOworCQl3aGlsZSAoKE9NQVBfTU1DX1JFQUQoaG9zdCwgU1RBVCkgJiAxKSA9PSAwKTsKKwkJT01BUF9NTUNfV1JJVEUoaG9zdCwgU1RBVCwgMSk7CiAJfQogCWNsa19kaXNhYmxlKGhvc3QtPmZjbGspOwogfQpAQCAtOTYwLDcgKzEwMDIsNyBAQAogCXJldHVybiBob3N0LT53cF9waW4gJiYgb21hcF9nZXRfZ3Bpb19kYXRhaW4oaG9zdC0+d3BfcGluKTsKIH0KIAotc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgbW1jX29tYXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgbW1jX29tYXBfb3BzID0gewogCS5yZXF1ZXN0CT0gbW1jX29tYXBfcmVxdWVzdCwKIAkuc2V0X2lvcwk9IG1tY19vbWFwX3NldF9pb3MsCiAJLmdldF9ybwkJPSBtbWNfb21hcF9nZXRfcm8sCkBAIC05NzEsMjUgKzEwMTMsMjkgQEAKIAlzdHJ1Y3Qgb21hcF9tbWNfY29uZiAqbWluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKIAlzdHJ1Y3QgbW1jX29tYXBfaG9zdCAqaG9zdCA9IE5VTEw7Ci0Jc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQgPSAwOwogCWludCBpcnE7Ci0JCi0JciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlpZiAobWluZm8gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybSBkYXRhIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoIXIgfHwgaXJxIDwgMCkKKwlpZiAocmVzID09IE5VTEwgfHwgaXJxIDwgMCkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCXIgPSByZXF1ZXN0X21lbV9yZWdpb24ocGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCi0JCQkJcGRldi0+cmVzb3VyY2VbMF0uZW5kIC0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQgKyAxLAotCQkJICAgICAgIHBkZXYtPm5hbWUpOwotCWlmICghcikKKwlyZXMgPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSwKKwkJCSAgICAgICAgIHBkZXYtPm5hbWUpOworCWlmIChyZXMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCW1tYyA9IG1tY19hbGxvY19ob3N0KHNpemVvZihzdHJ1Y3QgbW1jX29tYXBfaG9zdCksICZwZGV2LT5kZXYpOwotCWlmICghbW1jKSB7CisJaWYgKG1tYyA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworCQlnb3RvIGVycl9mcmVlX21lbV9yZWdpb247CiAJfQogCiAJaG9zdCA9IG1tY19wcml2KG1tYyk7CkBAIC0xMDAxLDEzICsxMDQ3LDEzIEBACiAJaG9zdC0+ZG1hX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaG9zdDsKIAogCWhvc3QtPmlkID0gcGRldi0+aWQ7Ci0JaG9zdC0+cmVzID0gcjsKKwlob3N0LT5tZW1fcmVzID0gcmVzOwogCWhvc3QtPmlycSA9IGlycTsKIAogCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewogCQlob3N0LT5pY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAibW1jX2ljayIpOwogCQlpZiAoSVNfRVJSKGhvc3QtPmljbGspKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIGVycl9mcmVlX21tY19ob3N0OwogCQljbGtfZW5hYmxlKGhvc3QtPmljbGspOwogCX0KIApAQCAtMTAxOCw3ICsxMDY0LDcgQEAKIAogCWlmIChJU19FUlIoaG9zdC0+ZmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihob3N0LT5mY2xrKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyX2ZyZWVfaWNsazsKIAl9CiAKIAkvKiBSRVZJU0lUOgpAQCAtMTAzMSwxNCArMTA3NywxNSBAQAogCWhvc3QtPnVzZV9kbWEgPSAxOwogCWhvc3QtPmRtYV9jaCA9IC0xOwogCi0JaG9zdC0+aXJxID0gcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQ7Ci0JaG9zdC0+YmFzZSA9ICh2b2lkIF9faW9tZW0qKUlPX0FERFJFU1Moci0+c3RhcnQpOworCWhvc3QtPmlycSA9IGlycTsKKwlob3N0LT5waHlzX2Jhc2UgPSBob3N0LT5tZW1fcmVzLT5zdGFydDsKKwlob3N0LT52aXJ0X2Jhc2UgPSAodm9pZCBfX2lvbWVtICopIElPX0FERFJFU1MoaG9zdC0+cGh5c19iYXNlKTsKIAogCW1tYy0+b3BzID0gJm1tY19vbWFwX29wczsKIAltbWMtPmZfbWluID0gNDAwMDAwOwogCW1tYy0+Zl9tYXggPSAyNDAwMDAwMDsKLQltbWMtPm9jcl9hdmFpbCA9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNDsKLQltbWMtPmNhcHMgPSBNTUNfQ0FQX0JZVEVCTE9DSzsKKwltbWMtPm9jcl9hdmFpbCA9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OworCW1tYy0+Y2FwcyA9IE1NQ19DQVBfTVVMVElXUklURSB8IE1NQ19DQVBfQllURUJMT0NLOwogCiAJaWYgKG1pbmZvLT53aXJlNCkKIAkJIG1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzRfQklUX0RBVEE7CkBAIC0xMDU2LDIwICsxMTAzLDE4IEBACiAJCWlmICgocmV0ID0gb21hcF9yZXF1ZXN0X2dwaW8oaG9zdC0+cG93ZXJfcGluKSkgIT0gMCkgewogCQkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksCiAJCQkJIlVuYWJsZSB0byBnZXQgR1BJTyBwaW4gZm9yIE1NQyBwb3dlclxuIik7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZXJyX2ZyZWVfZmNsazsKIAkJfQogCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihob3N0LT5wb3dlcl9waW4sIDApOwogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgbW1jX29tYXBfaXJxLCAwLCBEUklWRVJfTkFNRSwgaG9zdCk7CiAJaWYgKHJldCkKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyX2ZyZWVfcG93ZXJfZ3BpbzsKIAogCWhvc3QtPmRldiA9ICZwZGV2LT5kZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CiAKLQltbWNfYWRkX2hvc3QobW1jKTsKLQogCWlmIChob3N0LT5zd2l0Y2hfcGluID49IDApIHsKIAkJSU5JVF9XT1JLKCZob3N0LT5zd2l0Y2hfd29yaywgbW1jX29tYXBfc3dpdGNoX2hhbmRsZXIsIGhvc3QpOwogCQlpbml0X3RpbWVyKCZob3N0LT5zd2l0Y2hfdGltZXIpOwpAQCAtMTEwNywxMCArMTE1MiwxMSBAQAogCQkJc2NoZWR1bGVfd29yaygmaG9zdC0+c3dpdGNoX3dvcmspOwogCX0KIAotbm9fc3dpdGNoOgorCW1tY19hZGRfaG9zdChtbWMpOworCiAJcmV0dXJuIDA7CiAKLW91dDoKK25vX3N3aXRjaDoKIAkvKiBGSVhNRTogRnJlZSBvdGhlciByZXNvdXJjZXMgdG9vLiAqLwogCWlmIChob3N0KSB7CiAJCWlmIChob3N0LT5pY2xrICYmICFJU19FUlIoaG9zdC0+aWNsaykpCkBAIC0xMTE5LDYgKzExNjUsMjAgQEAKIAkJCWNsa19wdXQoaG9zdC0+ZmNsayk7CiAJCW1tY19mcmVlX2hvc3QoaG9zdC0+bW1jKTsKIAl9CitlcnJfZnJlZV9wb3dlcl9ncGlvOgorCWlmIChob3N0LT5wb3dlcl9waW4gPj0gMCkKKwkJb21hcF9mcmVlX2dwaW8oaG9zdC0+cG93ZXJfcGluKTsKK2Vycl9mcmVlX2ZjbGs6CisJY2xrX3B1dChob3N0LT5mY2xrKTsKK2Vycl9mcmVlX2ljbGs6CisJaWYgKGhvc3QtPmljbGsgIT0gTlVMTCkgeworCQljbGtfZGlzYWJsZShob3N0LT5pY2xrKTsKKwkJY2xrX3B1dChob3N0LT5pY2xrKTsKKwl9CitlcnJfZnJlZV9tbWNfaG9zdDoKKwltbWNfZnJlZV9ob3N0KGhvc3QtPm1tYyk7CitlcnJfZnJlZV9tZW1fcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTI4LDMwICsxMTg4LDMxIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAotCWlmIChob3N0KSB7Ci0JCW1tY19yZW1vdmVfaG9zdChob3N0LT5tbWMpOwotCQlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCUJVR19PTihob3N0ID09IE5VTEwpOwogCi0JCWlmIChob3N0LT5wb3dlcl9waW4gPj0gMCkKLQkJCW9tYXBfZnJlZV9ncGlvKGhvc3QtPnBvd2VyX3Bpbik7Ci0JCWlmIChob3N0LT5zd2l0Y2hfcGluID49IDApIHsKLQkJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlX3BvbGwpOwotCQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jb3Zlcl9zd2l0Y2gpOwotCQkJZnJlZV9pcnEoT01BUF9HUElPX0lSUShob3N0LT5zd2l0Y2hfcGluKSwgaG9zdCk7Ci0JCQlvbWFwX2ZyZWVfZ3Bpbyhob3N0LT5zd2l0Y2hfcGluKTsKLQkJCWhvc3QtPnN3aXRjaF9waW4gPSAtMTsKLQkJCWRlbF90aW1lcl9zeW5jKCZob3N0LT5zd2l0Y2hfdGltZXIpOwotCQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQkJfQotCQlpZiAoaG9zdC0+aWNsayAmJiAhSVNfRVJSKGhvc3QtPmljbGspKQotCQkJY2xrX3B1dChob3N0LT5pY2xrKTsKLQkJaWYgKGhvc3QtPmZjbGsgJiYgIUlTX0VSUihob3N0LT5mY2xrKSkKLQkJCWNsa19wdXQoaG9zdC0+ZmNsayk7Ci0JCW1tY19mcmVlX2hvc3QoaG9zdC0+bW1jKTsKKwltbWNfcmVtb3ZlX2hvc3QoaG9zdC0+bW1jKTsKKwlmcmVlX2lycShob3N0LT5pcnEsIGhvc3QpOworCisJaWYgKGhvc3QtPnBvd2VyX3BpbiA+PSAwKQorCQlvbWFwX2ZyZWVfZ3Bpbyhob3N0LT5wb3dlcl9waW4pOworCWlmIChob3N0LT5zd2l0Y2hfcGluID49IDApIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGVfcG9sbCk7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfY292ZXJfc3dpdGNoKTsKKwkJZnJlZV9pcnEoT01BUF9HUElPX0lSUShob3N0LT5zd2l0Y2hfcGluKSwgaG9zdCk7CisJCW9tYXBfZnJlZV9ncGlvKGhvc3QtPnN3aXRjaF9waW4pOworCQlob3N0LT5zd2l0Y2hfcGluID0gLTE7CisJCWRlbF90aW1lcl9zeW5jKCZob3N0LT5zd2l0Y2hfdGltZXIpOworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCX0KKwlpZiAoaG9zdC0+aWNsayAmJiAhSVNfRVJSKGhvc3QtPmljbGspKQorCQljbGtfcHV0KGhvc3QtPmljbGspOworCWlmIChob3N0LT5mY2xrICYmICFJU19FUlIoaG9zdC0+ZmNsaykpCisJCWNsa19wdXQoaG9zdC0+ZmNsayk7CiAKIAlyZWxlYXNlX21lbV9yZWdpb24ocGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCi0JCQlwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDEpOworCQkJICAgcGRldi0+cmVzb3VyY2VbMF0uZW5kIC0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQgKyAxKTsKKworCW1tY19mcmVlX2hvc3QoaG9zdC0+bW1jKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvb21hcC5oIGIvZHJpdmVycy9tbWMvb21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTU0ZDM1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbW1jL29tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSNpZm5kZWYJRFJJVkVSU19NRURJQV9NTUNfT01BUF9ICi0jZGVmaW5lCURSSVZFUlNfTUVESUFfTU1DX09NQVBfSAotCi0jZGVmaW5lCU9NQVBfTU1DX1JFR19DTUQJMHgwMAotI2RlZmluZQlPTUFQX01NQ19SRUdfQVJHTAkweDA0Ci0jZGVmaW5lCU9NQVBfTU1DX1JFR19BUkdICTB4MDgKLSNkZWZpbmUJT01BUF9NTUNfUkVHX0NPTgkweDBjCi0jZGVmaW5lCU9NQVBfTU1DX1JFR19TVEFUCTB4MTAKLSNkZWZpbmUJT01BUF9NTUNfUkVHX0lFCQkweDE0Ci0jZGVmaW5lCU9NQVBfTU1DX1JFR19DVE8JMHgxOAotI2RlZmluZQlPTUFQX01NQ19SRUdfRFRPCTB4MWMKLSNkZWZpbmUJT01BUF9NTUNfUkVHX0RBVEEJMHgyMAotI2RlZmluZQlPTUFQX01NQ19SRUdfQkxFTgkweDI0Ci0jZGVmaW5lCU9NQVBfTU1DX1JFR19OQkxLCTB4MjgKLSNkZWZpbmUJT01BUF9NTUNfUkVHX0JVRgkweDJjCi0jZGVmaW5lIE9NQVBfTU1DX1JFR19TRElPCTB4MzQKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1JFVgkweDNjCi0jZGVmaW5lCU9NQVBfTU1DX1JFR19SU1AwCTB4NDAKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDEJMHg0NAotI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQMgkweDQ4Ci0jZGVmaW5lCU9NQVBfTU1DX1JFR19SU1AzCTB4NGMKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDQJMHg1MAotI2RlZmluZQlPTUFQX01NQ19SRUdfUlNQNQkweDU0Ci0jZGVmaW5lCU9NQVBfTU1DX1JFR19SU1A2CTB4NTgKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1JTUDcJMHg1YwotI2RlZmluZQlPTUFQX01NQ19SRUdfSU9TUgkweDYwCi0jZGVmaW5lCU9NQVBfTU1DX1JFR19TWVNDCTB4NjQKLSNkZWZpbmUJT01BUF9NTUNfUkVHX1NZU1MJMHg2OAotCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfQ0FSRF9FUlIJCSgxIDw8IDE0KQotI2RlZmluZQlPTUFQX01NQ19TVEFUX0NBUkRfSVJRCQkoMSA8PCAxMykKLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9PQ1JfQlVTWQkJKDEgPDwgMTIpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfQV9FTVBUWQkJKDEgPDwgMTEpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfQV9GVUxMCQkoMSA8PCAxMCkKLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9DTURfQ1JDCQkoMSA8PCAgOCkKLSNkZWZpbmUJT01BUF9NTUNfU1RBVF9DTURfVE9VVAkJKDEgPDwgIDcpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfREFUQV9DUkMJCSgxIDw8ICA2KQotI2RlZmluZQlPTUFQX01NQ19TVEFUX0RBVEFfVE9VVAkJKDEgPDwgIDUpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfRU5EX0JVU1kJCSgxIDw8ICA0KQotI2RlZmluZQlPTUFQX01NQ19TVEFUX0VORF9PRl9EQVRBCSgxIDw8ICAzKQotI2RlZmluZQlPTUFQX01NQ19TVEFUX0NBUkRfQlVTWQkJKDEgPDwgIDIpCi0jZGVmaW5lCU9NQVBfTU1DX1NUQVRfRU5EX09GX0NNRAkoMSA8PCAgMCkKLQotI2RlZmluZSBPTUFQX01NQ19SRUFEKGJhc2UsIHJlZykJX19yYXdfcmVhZHcoKGJhc2UpICsgT01BUF9NTUNfUkVHXyMjcmVnKQotI2RlZmluZSBPTUFQX01NQ19XUklURShiYXNlLCByZWcsIHZhbCkJX19yYXdfd3JpdGV3KCh2YWwpLCAoYmFzZSkgKyBPTUFQX01NQ19SRUdfIyNyZWcpCi0KLS8qCi0gKiBDb21tYW5kIHR5cGVzCi0gKi8KLSNkZWZpbmUgT01BUF9NTUNfQ01EVFlQRV9CQwkwCi0jZGVmaW5lIE9NQVBfTU1DX0NNRFRZUEVfQkNSCTEKLSNkZWZpbmUgT01BUF9NTUNfQ01EVFlQRV9BQwkyCi0jZGVmaW5lIE9NQVBfTU1DX0NNRFRZUEVfQURUQwkzCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvcHhhbWNpLmMgYi9kcml2ZXJzL21tYy9weGFtY2kuYwppbmRleCBhNTI2Njk4Li40NWE5MjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9weGFtY2kuYworKysgYi9kcml2ZXJzL21tYy9weGFtY2kuYwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJc3RydWN0IHB4YW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAogCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+Z2V0X3JvKQotCQlyZXR1cm4gaG9zdC0+cGRhdGEtPmdldF9ybyhtbWMtPmRldik7CisJCXJldHVybiBob3N0LT5wZGF0YS0+Z2V0X3JvKG1tY19kZXYobW1jKSk7CiAJLyogSG9zdCBkb2Vzbid0IHN1cHBvcnQgcmVhZCBvbmx5IGRldGVjdGlvbiBzbyBhc3N1bWUgd3JpdGVhYmxlICovCiAJcmV0dXJuIDA7CiB9CkBAIC0zODMsNyArMzgzLDcgQEAKIAkJaG9zdC0+cG93ZXJfbW9kZSA9IGlvcy0+cG93ZXJfbW9kZTsKIAogCQlpZiAoaG9zdC0+cGRhdGEgJiYgaG9zdC0+cGRhdGEtPnNldHBvd2VyKQotCQkJaG9zdC0+cGRhdGEtPnNldHBvd2VyKG1tYy0+ZGV2LCBpb3MtPnZkZCk7CisJCQlob3N0LT5wZGF0YS0+c2V0cG93ZXIobW1jX2RldihtbWMpLCBpb3MtPnZkZCk7CiAKIAkJaWYgKGlvcy0+cG93ZXJfbW9kZSA9PSBNTUNfUE9XRVJfT04pCiAJCQlob3N0LT5jbWRhdCB8PSBDTURBVF9JTklUOwpAQCAtMzkzLDcgKzM5Myw3IEBACiAJCSBob3N0LT5jbGtydCwgaG9zdC0+Y21kYXQpOwogfQogCi1zdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBweGFtY2lfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgcHhhbWNpX29wcyA9IHsKIAkucmVxdWVzdAk9IHB4YW1jaV9yZXF1ZXN0LAogCS5nZXRfcm8JCT0gcHhhbWNpX2dldF9ybywKIAkuc2V0X2lvcwk9IHB4YW1jaV9zZXRfaW9zLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvc2RoY2kuYyBiL2RyaXZlcnMvbW1jL3NkaGNpLmMKaW5kZXggOWE3ZDM5Yi4uYzJkMTNkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvc2RoY2kuYworKysgYi9kcml2ZXJzL21tYy9zZGhjaS5jCkBAIC02MTYsNiArNjE2LDcgQEAKIHN0YXRpYyB2b2lkIHNkaGNpX3NldF9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IGNsb2NrKQogewogCWludCBkaXY7CisJdTggY3RybDsKIAl1MTYgY2xrOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIApAQCAtNjI0LDYgKzYyNSwxMyBAQAogCiAJd3JpdGV3KDAsIGhvc3QtPmlvYWRkciArIFNESENJX0NMT0NLX0NPTlRST0wpOwogCisJY3RybCA9IHJlYWRiKGhvc3QtPmlvYWRkciArIFNESENJX0hPU1RfQ09OVFJPTCk7CisJaWYgKGNsb2NrID4gMjUwMDAwMDApCisJCWN0cmwgfD0gU0RIQ0lfQ1RSTF9ISVNQRDsKKwllbHNlCisJCWN0cmwgJj0gflNESENJX0NUUkxfSElTUEQ7CisJd3JpdGViKGN0cmwsIGhvc3QtPmlvYWRkciArIFNESENJX0hPU1RfQ09OVFJPTCk7CisKIAlpZiAoY2xvY2sgPT0gMCkKIAkJZ290byBvdXQ7CiAKQEAgLTc4NCw3ICs3OTIsNyBAQAogCXJldHVybiAhKHByZXNlbnQgJiBTREhDSV9XUklURV9QUk9URUNUKTsKIH0KIAotc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgc2RoY2lfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgc2RoY2lfb3BzID0gewogCS5yZXF1ZXN0CT0gc2RoY2lfcmVxdWVzdCwKIAkuc2V0X2lvcwk9IHNkaGNpX3NldF9pb3MsCiAJLmdldF9ybwkJPSBzZGhjaV9nZXRfcm8sCkBAIC0xMTYyLDggKzExNzAsOCBAQAogCX0KIAogCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGZpcnN0X2JhciArIHNsb3QpICE9IDB4MTAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBJbnZhbGlkIGlvbWVtIHNpemUuIEFib3J0aW5nLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogSW52YWxpZCBpb21lbSBzaXplLiAiCisJCQkiWW91IG1heSBleHBlcmllbmNlIHByb2JsZW1zLlxuIik7CiAJfQogCiAJaWYgKChwZGV2LT5jbGFzcyAmIDB4MDAwMEZGKSA9PSBQQ0lfU0RIQ0lfSUZWRU5ET1IpIHsKQEAgLTEyOTEsNiArMTI5OSwxMyBAQAogCWVsc2UgaWYgKGNhcHMgJiBTREhDSV9DQU5fVkREXzE4MCkKIAkJbW1jLT5vY3JfYXZhaWwgfD0gTU1DX1ZERF8xN18xOHxNTUNfVkREXzE4XzE5OwogCisJaWYgKChob3N0LT5tYXhfY2xrID4gMjUwMDAwMDApICYmICEoY2FwcyAmIFNESENJX0NBTl9ET19ISVNQRCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ29udHJvbGxlciByZXBvcnRzID4gMjUgTUh6IGJhc2UgY2xvY2ssIgorCQkJIiBidXQgbm8gaGlnaCBzcGVlZCBzdXBwb3J0LlxuIiwKKwkJCWhvc3QtPnNsb3RfZGVzY3IpOworCQltbWMtPmZfbWF4ID0gMjUwMDAwMDA7CisJfQorCiAJaWYgKG1tYy0+b2NyX2F2YWlsID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFyZHdhcmUgZG9lc24ndCByZXBvcnQgYW55ICIKIAkJCSJzdXBwb3J0IHZvbHRhZ2VzLlxuIiwgaG9zdC0+c2xvdF9kZXNjcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9zZGhjaS5oIGIvZHJpdmVycy9tbWMvc2RoY2kuaAppbmRleCA3MmE2NzkzLi5mOWQxYTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9zZGhjaS5oCisrKyBiL2RyaXZlcnMvbW1jL3NkaGNpLmgKQEAgLTcxLDYgKzcxLDcgQEAKICNkZWZpbmUgU0RIQ0lfSE9TVF9DT05UUk9MIAkweDI4CiAjZGVmaW5lICBTREhDSV9DVFJMX0xFRAkJMHgwMQogI2RlZmluZSAgU0RIQ0lfQ1RSTF80QklUQlVTCTB4MDIKKyNkZWZpbmUgIFNESENJX0NUUkxfSElTUEQJMHgwNAogCiAjZGVmaW5lIFNESENJX1BPV0VSX0NPTlRST0wJMHgyOQogI2RlZmluZSAgU0RIQ0lfUE9XRVJfT04JCTB4MDEKQEAgLTEzOCw2ICsxMzksNyBAQAogI2RlZmluZSAgU0RIQ0lfQ0xPQ0tfQkFTRV9TSElGVAk4CiAjZGVmaW5lICBTREhDSV9NQVhfQkxPQ0tfTUFTSwkweDAwMDMwMDAwCiAjZGVmaW5lICBTREhDSV9NQVhfQkxPQ0tfU0hJRlQgIDE2CisjZGVmaW5lICBTREhDSV9DQU5fRE9fSElTUEQJMHgwMDIwMDAwMAogI2RlZmluZSAgU0RIQ0lfQ0FOX0RPX0RNQQkweDAwNDAwMDAwCiAjZGVmaW5lICBTREhDSV9DQU5fVkREXzMzMAkweDAxMDAwMDAwCiAjZGVmaW5lICBTREhDSV9DQU5fVkREXzMwMAkweDAyMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy90aWZtX3NkLmMgYi9kcml2ZXJzL21tYy90aWZtX3NkLmMKaW5kZXggMmJhY2ZmNi4uZjE4YWQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvdGlmbV9zZC5jCisrKyBiL2RyaXZlcnMvbW1jL3RpZm1fc2QuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9wcm90b2NvbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJ0aWZtX3NkIgogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC42IgpAQCAtOTgsNyArOTksNyBAQAogCiAJc3RydWN0IG1tY19yZXF1ZXN0ICAgICpyZXE7CiAJc3RydWN0IHdvcmtfc3RydWN0ICAgIGNtZF9oYW5kbGVyOwotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICBhYm9ydF9oYW5kbGVyOworCXN0cnVjdCBkZWxheWVkX3dvcmsgICBhYm9ydF9oYW5kbGVyOwogCXdhaXRfcXVldWVfaGVhZF90ICAgICBjYW5fZWplY3Q7CiAKIAlzaXplX3QgICAgICAgICAgICAgICAgd3JpdHRlbl9ibG9ja3M7CkBAIC0zODYsNyArMzg3LDcgQEAKIAogCXdyaXRlbChUSUZNX0ZJRk9fSU5UX1NFVEFMTCwKIAkJc29jay0+YWRkciArIFNPQ0tfRE1BX0ZJRk9fSU5UX0VOQUJMRV9DTEVBUik7Ci0Jd3JpdGVsKGxvbmdfbG9nMihjbWQtPmRhdGEtPmJsa3N6KSAtIDIsCisJd3JpdGVsKGlsb2cyKGNtZC0+ZGF0YS0+Ymxrc3opIC0gMiwKIAkJCXNvY2stPmFkZHIgKyBTT0NLX0ZJRk9fUEFHRV9TSVpFKTsKIAl3cml0ZWwoVElGTV9GSUZPX0VOQUJMRSwgc29jay0+YWRkciArIFNPQ0tfRklGT19DT05UUk9MKTsKIAl3cml0ZWwoVElGTV9GSUZPX0lOVE1BU0ssIHNvY2stPmFkZHIgKyBTT0NLX0RNQV9GSUZPX0lOVF9FTkFCTEVfU0VUKTsKQEAgLTQ5NSw5ICs0OTYsOSBAQAogCW1tY19yZXF1ZXN0X2RvbmUobW1jLCBtcnEpOwogfQogCi1zdGF0aWMgdm9pZCB0aWZtX3NkX2VuZF9jbWQodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHRpZm1fc2RfZW5kX2NtZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHRpZm1fc2QgKmhvc3QgPSBkYXRhOworCXN0cnVjdCB0aWZtX3NkICpob3N0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0aWZtX3NkLCBjbWRfaGFuZGxlcik7CiAJc3RydWN0IHRpZm1fZGV2ICpzb2NrID0gaG9zdC0+ZGV2OwogCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gdGlmbV9nZXRfZHJ2ZGF0YShzb2NrKTsKIAlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycTsKQEAgLTYwNyw5ICs2MDgsOSBAQAogCW1tY19yZXF1ZXN0X2RvbmUobW1jLCBtcnEpOwogfQogCi1zdGF0aWMgdm9pZCB0aWZtX3NkX2VuZF9jbWRfbm9kbWEodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHRpZm1fc2RfZW5kX2NtZF9ub2RtYShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHRpZm1fc2QgKmhvc3QgPSAoc3RydWN0IHRpZm1fc2QqKWRhdGE7CisJc3RydWN0IHRpZm1fc2QgKmhvc3QgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRpZm1fc2QsIGNtZF9oYW5kbGVyKTsKIAlzdHJ1Y3QgdGlmbV9kZXYgKnNvY2sgPSBob3N0LT5kZXY7CiAJc3RydWN0IG1tY19ob3N0ICptbWMgPSB0aWZtX2dldF9kcnZkYXRhKHNvY2spOwogCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOwpAQCAtNjYwLDExICs2NjEsMTQgQEAKIAltbWNfcmVxdWVzdF9kb25lKG1tYywgbXJxKTsKIH0KIAotc3RhdGljIHZvaWQgdGlmbV9zZF9hYm9ydCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgdGlmbV9zZF9hYm9ydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IHRpZm1fc2QgKmhvc3QgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHRpZm1fc2QsIGFib3J0X2hhbmRsZXIud29yayk7CisKIAlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUKIAkJIjogY2FyZCBmYWlsZWQgdG8gcmVzcG9uZCBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lIik7Ci0JdGlmbV9lamVjdCgoKHN0cnVjdCB0aWZtX3NkKilkYXRhKS0+ZGV2KTsKKwl0aWZtX2VqZWN0KGhvc3QtPmRldik7CiB9CiAKIHN0YXRpYyB2b2lkIHRpZm1fc2RfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQpAQCAtNzYxLDkgKzc2NSw5IEBACiAJLmdldF9ybyAgPSB0aWZtX3NkX3JvCiB9OwogCi1zdGF0aWMgdm9pZCB0aWZtX3NkX3JlZ2lzdGVyX2hvc3Qodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHRpZm1fc2RfcmVnaXN0ZXJfaG9zdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHRpZm1fc2QgKmhvc3QgPSAoc3RydWN0IHRpZm1fc2QqKWRhdGE7CisJc3RydWN0IHRpZm1fc2QgKmhvc3QgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRpZm1fc2QsIGNtZF9oYW5kbGVyKTsKIAlzdHJ1Y3QgdGlmbV9kZXYgKnNvY2sgPSBob3N0LT5kZXY7CiAJc3RydWN0IG1tY19ob3N0ICptbWMgPSB0aWZtX2dldF9kcnZkYXRhKHNvY2spOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC03NzEsOCArNzc1LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc29jay0+bG9jaywgZmxhZ3MpOwogCWhvc3QtPmZsYWdzIHw9IEhPU1RfUkVHOwogCVBSRVBBUkVfV09SSygmaG9zdC0+Y21kX2hhbmRsZXIsCi0JCQlub19kbWEgPyB0aWZtX3NkX2VuZF9jbWRfbm9kbWEgOiB0aWZtX3NkX2VuZF9jbWQsCi0JCQlkYXRhKTsKKwkJCW5vX2RtYSA/IHRpZm1fc2RfZW5kX2NtZF9ub2RtYSA6IHRpZm1fc2RfZW5kX2NtZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29jay0+bG9jaywgZmxhZ3MpOwogCWRldl9kYmcoJnNvY2stPmRldiwgImFkZGluZyBob3N0XG4iKTsKIAltbWNfYWRkX2hvc3QobW1jKTsKQEAgLTc5OCw4ICs4MDEsOCBAQAogCWhvc3QtPmRldiA9IHNvY2s7CiAJaG9zdC0+Y2xrX2RpdiA9IDYxOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhvc3QtPmNhbl9lamVjdCk7Ci0JSU5JVF9XT1JLKCZob3N0LT5jbWRfaGFuZGxlciwgdGlmbV9zZF9yZWdpc3Rlcl9ob3N0LCBob3N0KTsKLQlJTklUX1dPUksoJmhvc3QtPmFib3J0X2hhbmRsZXIsIHRpZm1fc2RfYWJvcnQsIGhvc3QpOworCUlOSVRfV09SSygmaG9zdC0+Y21kX2hhbmRsZXIsIHRpZm1fc2RfcmVnaXN0ZXJfaG9zdCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmhvc3QtPmFib3J0X2hhbmRsZXIsIHRpZm1fc2RfYWJvcnQpOwogCiAJdGlmbV9zZXRfZHJ2ZGF0YShzb2NrLCBtbWMpOwogCXNvY2stPnNpZ25hbF9pcnEgPSB0aWZtX3NkX3NpZ25hbF9pcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy93YnNkLmMgYi9kcml2ZXJzL21tYy93YnNkLmMKaW5kZXggY2VkMzA5Yi4uN2EyODI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvd2JzZC5jCisrKyBiL2RyaXZlcnMvbW1jL3dic2QuYwpAQCAtMTAyMSw3ICsxMDIxLDcgQEAKIAlyZXR1cm4gY3NyICYgV0JTRF9XUlBUOwogfQogCi1zdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyB3YnNkX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHdic2Rfb3BzID0gewogCS5yZXF1ZXN0CT0gd2JzZF9yZXF1ZXN0LAogCS5zZXRfaW9zCT0gd2JzZF9zZXRfaW9zLAogCS5nZXRfcm8JCT0gd2JzZF9nZXRfcm8sCkBAIC0xNDg4LDcgKzE0ODgsNyBAQAogCS8qCiAJICogVHJhbnNsYXRlIHRoZSBhZGRyZXNzIHRvIGEgcGh5c2ljYWwgYWRkcmVzcy4KIAkgKi8KLQlob3N0LT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYnVmZmVyLAorCWhvc3QtPmRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUobW1jX2Rldihob3N0LT5tbWMpLCBob3N0LT5kbWFfYnVmZmVyLAogCQlXQlNEX0RNQV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CiAKIAkvKgpAQCAtMTUxMiw3ICsxNTEyLDcgQEAKIAkgKi8KIAlCVUdfT04oMSk7CiAKLQlkbWFfdW5tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYWRkciwKKwlkbWFfdW5tYXBfc2luZ2xlKG1tY19kZXYoaG9zdC0+bW1jKSwgaG9zdC0+ZG1hX2FkZHIsCiAJCVdCU0RfRE1BX1NJWkUsIERNQV9CSURJUkVDVElPTkFMKTsKIAlob3N0LT5kbWFfYWRkciA9IChkbWFfYWRkcl90KU5VTEw7CiAKQEAgLTE1MzAsNyArMTUzMCw3IEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9yZWxlYXNlX2RtYShzdHJ1Y3Qgd2JzZF9ob3N0ICpob3N0KQogewogCWlmIChob3N0LT5kbWFfYWRkcikgewotCQlkbWFfdW5tYXBfc2luZ2xlKGhvc3QtPm1tYy0+ZGV2LCBob3N0LT5kbWFfYWRkciwKKwkJZG1hX3VubWFwX3NpbmdsZShtbWNfZGV2KGhvc3QtPm1tYyksIGhvc3QtPmRtYV9hZGRyLAogCQkJV0JTRF9ETUFfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOwogCX0KIAlrZnJlZShob3N0LT5kbWFfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKaW5kZXggN2VhNDlhMC4uMjk2MTU5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKQEAgLTEwODcsNyArMTA4Nyw3IEBACiAJCX0KIAkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAotCQlpZiAoY2hpcC0+c3RhdGUgIT0gY2hpcF9zdGF0ZSkgeworCQl3aGlsZSAoY2hpcC0+c3RhdGUgIT0gY2hpcF9zdGF0ZSkgewogCQkJLyogU29tZW9uZSdzIHN1c3BlbmRlZCB0aGUgb3BlcmF0aW9uOiBzbGVlcCAqLwogCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwppbmRleCBlZjRhNzMxLi4zMzRlMDc4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCkBAIC00NTEsNyArNDUxLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZmxhc2ggPSBremFsbG9jKHNpemVvZiAqZmxhc2gsIFNMQUJfS0VSTkVMKTsKKwlmbGFzaCA9IGt6YWxsb2Moc2l6ZW9mICpmbGFzaCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmbGFzaCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKaW5kZXggNWRiNzE2MC4uMGE3ZTg2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogCXN0cnVjdCBtdGRfaW5mbwkJCSpkZXZpY2U7CiAJc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEJKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCXByaXYgPSAoc3RydWN0IGRhdGFmbGFzaCAqKSBremFsbG9jKHNpemVvZiAqcHJpdiwgR0ZQX0tFUk5FTCk7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mICpwcml2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKaW5kZXggMjQ3NDdiZC4uZDEzMmVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwpAQCAtNjA3LDcgKzYwNyw3IEBACiAJZGVmYXVsdCAiNCIKIAogY29uZmlnIE1URF9TSEFSUF9TTAotCWJvb2wgIlJPTSBtYXBlZCBvbiBTaGFycCBTTCBTZXJpZXMiCisJYm9vbCAiUk9NIG1hcHBlZCBvbiBTaGFycCBTTCBTZXJpZXMiCiAJZGVwZW5kcyBvbiBNVEQgJiYgQVJDSF9QWEEKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBmbGFzaCBjaGlwIG9uIHRoZSBTaGFycCBTTCBTZXJpZXMgb2YgUERBcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvY2ZpX2ZsYWdhZG0uYyBiL2RyaXZlcnMvbXRkL21hcHMvY2ZpX2ZsYWdhZG0uYwppbmRleCA5MmI1ZDg4Li42NWU1ZWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2NmaV9mbGFnYWRtLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9jZmlfZmxhZ2FkbS5jCkBAIC04MCw3ICs4MCw3IEBACiAJCS5zaXplID0JCUZMQVNIX1BBUlRJVElPTjJfU0laRQogCX0sCiAJewotCQkubmFtZSA9CQkiUGVyc2lzdGFudCBzdG9yYWdlIiwKKwkJLm5hbWUgPQkJIlBlcnNpc3RlbnQgc3RvcmFnZSIsCiAJCS5vZmZzZXQgPQlGTEFTSF9QQVJUSVRJT04zX0FERFIsCiAJCS5zaXplID0JCUZMQVNIX1BBUlRJVElPTjNfU0laRQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IGJhZWNlNjEuLjQxYmZjYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtMTQ3OSw2ICsxNDc5LDcgQEAKICAqIEBidWY6CXRoZSBkYXRhIHRvIHdyaXRlCiAgKiBAcGFnZToJcGFnZSBudW1iZXIgdG8gd3JpdGUKICAqIEBjYWNoZWQ6CWNhY2hlZCBwcm9ncmFtbWluZworICogQHJhdzoJdXNlIF9yYXcgdmVyc2lvbiBvZiB3cml0ZV9wYWdlCiAgKi8KIHN0YXRpYyBpbnQgbmFuZF93cml0ZV9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAogCQkJICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgcGFnZSwgaW50IGNhY2hlZCwgaW50IHJhdykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3JmZF9mdGwuYyBiL2RyaXZlcnMvbXRkL3JmZF9mdGwuYwppbmRleCBmYTQzNjJmLi4wZjNiYWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9yZmRfZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvcmZkX2Z0bC5jCkBAIC03NjgsNyArNzY4LDcgQEAKIAlpZiAobXRkLT50eXBlICE9IE1URF9OT1JGTEFTSCkKIAkJcmV0dXJuOwogCi0JcGFydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwYXJ0aXRpb24pLCBHRlBfS0VSTkVMKTsKKwlwYXJ0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhcnRpdGlvbiksIEdGUF9LRVJORUwpOwogCWlmICghcGFydCkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwMS5jIGIvZHJpdmVycy9uZXQvM2M1MDEuYwppbmRleCAxMWQxNzBhLi4wNmUzMzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwMS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTAxLmMKQEAgLTkyMiw3ICs5MjIsNyBAQAogICogYW5kIHRoZW4gZnJlZSB1cCB0aGUgcmVzb3VyY2VzIHdlIHRvb2sgd2hlbiB0aGUgY2FyZCB3YXMgZm91bmQuCiAgKi8KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2XzNjNTAxOwogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwMy5jIGIvZHJpdmVycy9uZXQvM2M1MDMuYwppbmRleCBhMzRiMjIwLi43ZTM0YzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwMy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTAzLmMKQEAgLTcyNiw3ICs3MjYsNyBAQAogCQlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOwogfQogCi12b2lkCit2b2lkIF9fZXhpdAogY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgdGhpc19kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwNS5jIGIvZHJpdmVycy9uZXQvM2M1MDUuYwppbmRleCA0NThjYjljLi43MDJiZmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwNS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA1LmMKQEAgLTE2NzAsNyArMTY3MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3ZvaWQgX19leGl0IGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHRoaXNfZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwNy5jIGIvZHJpdmVycy9uZXQvM2M1MDcuYwppbmRleCBhYTQzNTYzLi41NGUxZDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwNy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA3LmMKQEAgLTk0MCw3ICs5NDAsNyBAQAogCXJldHVybiBJU19FUlIoZGV2XzNjNTA3KSA/IFBUUl9FUlIoZGV2XzNjNTA3KSA6IDA7CiB9CiAKLXZvaWQKK3ZvaWQgX19leGl0CiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfM2M1MDc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUyMy5jIGIvZHJpdmVycy9uZXQvM2M1MjMuYwppbmRleCA5MTg0OTQ2Li4xN2Q2MWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUyMy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKQEAgLTEzMDIsNyArMTMwMiw3IEBACiAJfSBlbHNlIHJldHVybiAwOwogfQogCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit2b2lkIF9fZXhpdCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCB0aGlzX2RldjsKIAlmb3IgKHRoaXNfZGV2PTA7IHRoaXNfZGV2PE1BWF8zQzUyM19DQVJEUzsgdGhpc19kZXYrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjcuYyBiL2RyaXZlcnMvbmV0LzNjNTI3LmMKaW5kZXggZjRhY2E1My4uNmM3NDM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MjcuYworKysgYi9kcml2ZXJzL25ldC8zYzUyNy5jCkBAIC0xNjU5LDcgKzE2NTksNyBAQAogICoJdHJhbnNtaXQgb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBzdGFydCBzY3JpYmJsaW5nIGludG8gbWVtb3J5LgogICovCiAKLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3ZvaWQgX19leGl0IGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl9uZXRkZXYodGhpc19kZXZpY2UpOwogCWNsZWFudXBfY2FyZCh0aGlzX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC83OTkwLmMgYi9kcml2ZXJzL25ldC83OTkwLmMKaW5kZXggNzczMzY5Ny4uMmQ1YmEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvNzk5MC5jCisrKyBiL2RyaXZlcnMvbmV0Lzc5OTAuYwpAQCAtNTAwLDcgKzUwMCw3IEBACiAJaW50IHJlczsKIAogICAgICAgICAvKiBJbnN0YWxsIHRoZSBJbnRlcnJ1cHQgaGFuZGxlci4gT3Igd2UgY291bGQgc2h1bnQgdGhpcyBvdXQgdG8gc3BlY2lmaWMgZHJpdmVycz8gKi8KLSAgICAgICAgaWYgKHJlcXVlc3RfaXJxKGxwLT5pcnEsIGxhbmNlX2ludGVycnVwdCwgMCwgbHAtPm5hbWUsIGRldikpCisgICAgICAgIGlmIChyZXF1ZXN0X2lycShscC0+aXJxLCBsYW5jZV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBscC0+bmFtZSwgZGV2KSkKICAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKIAogICAgICAgICByZXMgPSBsYW5jZV9yZXNldChkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOXRvby5jIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCmluZGV4IGQwMmVkNTEuLjM1YWQ1Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgxMzl0b28uYworKysgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKQEAgLTU5NCw3ICs1OTQsNyBAQAogCXUzMiByeF9jb25maWc7CiAJc3RydWN0IHJ0bF9leHRyYV9zdGF0cyB4c3RhdHM7CiAKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZWFkOworCXN0cnVjdCBkZWxheWVkX3dvcmsgdGhyZWFkOwogCiAJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKIAl1bnNpZ25lZCBpbnQgcmVnc19sZW47CkBAIC02MzYsOCArNjM2LDggQEAKIHN0YXRpYyB2b2lkIHJ0bDgxMzlfc2V0X3J4X21vZGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgX19zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBydGw4MTM5X2h3X3N0YXJ0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHJ0bDgxMzlfdGhyZWFkICh2b2lkICpfZGF0YSk7Ci1zdGF0aWMgdm9pZCBydGw4MTM5X3R4X3RpbWVvdXRfdGFzayh2b2lkICpfZGF0YSk7CitzdGF0aWMgdm9pZCBydGw4MTM5X3RocmVhZCAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfdHhfdGltZW91dF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHJ0bDgxMzlfZXRodG9vbF9vcHM7CiAKIC8qIHdyaXRlIE1NSU8gcmVnaXN0ZXIsIHdpdGggZmx1c2ggKi8KQEAgLTEwMTAsNyArMTAxMCw3IEBACiAJCShkZWJ1ZyA8IDAgPyBSVEw4MTM5X0RFRl9NU0dfRU5BQkxFIDogKCgxIDw8IGRlYnVnKSAtIDEpKTsKIAlzcGluX2xvY2tfaW5pdCAoJnRwLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCAoJnRwLT5yeF9sb2NrKTsKLQlJTklUX1dPUksoJnRwLT50aHJlYWQsIHJ0bDgxMzlfdGhyZWFkLCBkZXYpOworCUlOSVRfREVMQVlFRF9XT1JLKCZ0cC0+dGhyZWFkLCBydGw4MTM5X3RocmVhZCk7CiAJdHAtPm1paS5kZXYgPSBkZXY7CiAJdHAtPm1paS5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CiAJdHAtPm1paS5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKQEAgLTE1OTYsMTUgKzE1OTYsMTYgQEAKIAkJIFJUTF9SOCAoQ29uZmlnMSkpOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTM5X3RocmVhZCAodm9pZCAqX2RhdGEpCitzdGF0aWMgdm9pZCBydGw4MTM5X3RocmVhZCAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBfZGF0YTsKLQlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSwgdGhyZWFkLndvcmspOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+bWlpLmRldjsKIAl1bnNpZ25lZCBsb25nIHRocl9kZWxheSA9IG5leHRfdGljazsKIAogCWlmICh0cC0+d2F0Y2hkb2dfZmlyZWQpIHsKIAkJdHAtPndhdGNoZG9nX2ZpcmVkID0gMDsKLQkJcnRsODEzOV90eF90aW1lb3V0X3Rhc2soX2RhdGEpOworCQlydGw4MTM5X3R4X3RpbWVvdXRfdGFzayh3b3JrKTsKIAl9IGVsc2UgaWYgKHJ0bmxfdHJ5bG9jaygpKSB7CiAJCXJ0bDgxMzlfdGhyZWFkX2l0ZXIgKGRldiwgdHAsIHRwLT5tbWlvX2FkZHIpOwogCQlydG5sX3VubG9jayAoKTsKQEAgLTE2NDYsMTAgKzE2NDcsMTEgQEAKIAkvKiBYWFggYWNjb3VudCBmb3IgdW5zZW50IFR4IHBhY2tldHMgaW4gdHAtPnN0YXRzLnR4X2Ryb3BwZWQgKi8KIH0KIAotc3RhdGljIHZvaWQgcnRsODEzOV90eF90aW1lb3V0X3Rhc2sgKHZvaWQgKl9kYXRhKQorc3RhdGljIHZvaWQgcnRsODEzOV90eF90aW1lb3V0X3Rhc2sgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gX2RhdGE7Ci0Jc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGw4MTM5X3ByaXZhdGUsIHRocmVhZC53b3JrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPm1paS5kZXY7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOwogCWludCBpOwogCXU4IHRtcDg7CkBAIC0xNjk1LDcgKzE2OTcsNyBAQAogCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmICghdHAtPmhhdmVfdGhyZWFkKSB7Ci0JCUlOSVRfV09SSygmdHAtPnRocmVhZCwgcnRsODEzOV90eF90aW1lb3V0X3Rhc2ssIGRldik7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZ0cC0+dGhyZWFkLCBydGw4MTM5X3R4X3RpbWVvdXRfdGFzayk7CiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHAtPnRocmVhZCwgbmV4dF90aWNrKTsKIAl9IGVsc2UKIAkJdHAtPndhdGNoZG9nX2ZpcmVkID0gMTsKQEAgLTIxMjksMTQgKzIxMzEsMTUgQEAKIAl9CiAKIAlpZiAoZG9uZSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQkvKgogCQkgKiBPcmRlciBpcyBpbXBvcnRhbnQgc2luY2UgZGF0YSBjYW4gZ2V0IGludGVycnVwdGVkCiAJCSAqIGFnYWluIHdoZW4gd2UgdGhpbmsgd2UgYXJlIGRvbmUuCiAJCSAqLwotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCVJUTF9XMTZfRihJbnRyTWFzaywgcnRsODEzOV9pbnRyX21hc2spOwogCQlfX25ldGlmX3J4X2NvbXBsZXRlKGRldik7Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIAlzcGluX3VubG9jaygmdHAtPnJ4X2xvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MzkwLmMgYi9kcml2ZXJzL25ldC84MzkwLmMKaW5kZXggM2QxYzU5OS4uYTgyODA3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODM5MC5jCisrKyBiL2RyaXZlcnMvbmV0LzgzOTAuYwpAQCAtMSwxMTA0ICsxLDQwIEBACi0vKiA4MzkwLmM6IEEgZ2VuZXJhbCBOUzgzOTAgZXRoZXJuZXQgZHJpdmVyIGNvcmUgZm9yIGxpbnV4LiAqLwotLyoKLQlXcml0dGVuIDE5OTItOTQgYnkgRG9uYWxkIEJlY2tlci4KLQotCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKLQlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgotCi0JVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcwotCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0KLQlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTwotCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgotCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCi0JQW5uYXBvbGlzIE1EIDIxNDAzCi0KLQotICBUaGlzIGlzIHRoZSBjaGlwLXNwZWNpZmljIGNvZGUgZm9yIG1hbnkgODM5MC1iYXNlZCBldGhlcm5ldCBhZGFwdG9ycy4KLSAgVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBkcml2ZXIsIGl0IG11c3QgYmUgY29tYmluZWQgd2l0aCBib2FyZC1zcGVjaWZpYwotICBjb2RlIHN1Y2ggYXMgbmUuYywgd2QuYywgM2M1MDMuYywgZXRjLgotCi0gIFNlZWluZyBob3cgYXQgbGVhc3QgZWlnaHQgZHJpdmVycyB1c2UgdGhpcyBjb2RlLCAobm90IGNvdW50aW5nIHRoZQotICBQQ01DSUEgb25lcyBlaXRoZXIpIGl0IGlzIGVhc3kgdG8gYnJlYWsgc29tZSBjYXJkIGJ5IHdoYXQgc2VlbXMgbGlrZQotICBhIHNpbXBsZSBpbm5vY2VudCBjaGFuZ2UuIFBsZWFzZSBjb250YWN0IG1lIG9yIERvbmFsZCBpZiB5b3UgdGhpbmsKLSAgeW91IGhhdmUgZm91bmQgc29tZXRoaW5nIHRoYXQgbmVlZHMgY2hhbmdpbmcuIC0tIFBHCi0KLQotICBDaGFuZ2Vsb2c6Ci0KLSAgUGF1bCBHb3J0bWFrZXIJOiByZW1vdmUgc2V0X2JpdCBsb2NrLCBvdGhlciBjbGVhbnVwcy4KLSAgUGF1bCBHb3J0bWFrZXIJOiBhZGQgZWlfZ2V0XzgzOTBfaGRyKCkgc28gd2UgY2FuIHBhc3Mgc2tiJ3MgdG8KLQkJCSAgZWlfYmxvY2tfaW5wdXQoKSBmb3IgZXRoX2lvX2NvcHlfYW5kX3N1bSgpLgotICBQYXVsIEdvcnRtYWtlcgk6IGV4Y2hhbmdlIHN0YXRpYyBpbnQgZWlfcGluZ3BvbmcgZm9yIGEgI2RlZmluZSwKLQkJCSAgYWxzbyBhZGQgYmV0dGVyIFR4IGVycm9yIGhhbmRsaW5nLgotICBQYXVsIEdvcnRtYWtlcgk6IHJld3JpdGUgUnggb3ZlcnJ1biBoYW5kbGluZyBhcyBwZXIgTlMgc3BlY3MuCi0gIEFsZXhleSBLdXpuZXRzb3YJOiB1c2UgdGhlIDgzOTAncyBzaXggYml0IGhhc2ggbXVsdGljYXN0IGZpbHRlci4KLSAgUGF1bCBHb3J0bWFrZXIJOiB0d2VhayBBTksncyBhYm92ZSBtdWx0aWNhc3QgY2hhbmdlcyBhIGJpdC4KLSAgUGF1bCBHb3J0bWFrZXIJOiB1cGRhdGUgcGFja2V0IHN0YXRpc3RpY3MgZm9yIHYyLjEueAotICBBbGFuIENveAkJOiBzdXBwb3J0IGFyYml0YXJ5IHN0dXBpZCBwb3J0IG1hcHBpbmdzIG9uIHRoZQotICAJCQkgIDY4SyBNYWNpbnRvc2guIFN1cHBvcnQgPjE2Yml0IEkvTyBzcGFjZXMKLSAgUGF1bCBHb3J0bWFrZXIJOiBhZGQga21vZCBzdXBwb3J0IGZvciBhdXRvLWxvYWRpbmcgb2YgdGhlIDgzOTAKLQkJCSAgbW9kdWxlIGJ5IGFsbCBkcml2ZXJzIHRoYXQgcmVxdWlyZSBpdC4KLSAgQWxhbiBDb3gJCTogU3BpbmxvY2tpbmcgd29yaywgYWRkZWQgJ0JVR184M0M2OTAnCi0gIFBhdWwgR29ydG1ha2VyCTogU2VwYXJhdGUgb3V0IFR4IHRpbWVvdXQgY29kZSBmcm9tIFR4IHBhdGguCi0gIFBhdWwgR29ydG1ha2VyCTogUmVtb3ZlIG9sZCB1bnVzZWQgc2luZ2xlIFR4IGJ1ZmZlciBjb2RlLgotICBIYXlhdG8gRnVqaXdhcmEJOiBBZGQgbTMyciBzdXBwb3J0LgotICBQYXVsIEdvcnRtYWtlcgk6IHVzZSBza2JfcGFkdG8oKSBpbnN0ZWFkIG9mIHN0YWNrIHNjcmF0Y2ggYXJlYQotCi0gIFNvdXJjZXM6Ci0gIFRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExBTiBEYXRhYm9vaywgYW5kIHRoZSAzQ29tIDNjNTAzIGRhdGFib29rLgotCi0gICovCisvKiA4MzkwIGNvcmUgZm9yIHVzdWFsIGRyaXZlcnMgKi8KIAogc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KICAgICAiODM5MC5jOnYxLjEwY3ZzIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSAibGliODM5MC5jIgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLQotI2RlZmluZSBOUzgzOTBfQ09SRQotI2luY2x1ZGUgIjgzOTAuaCIKLQotI2RlZmluZSBCVUdfODNDNjkwCi0KLS8qIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9uYWwgZnVuY3Rpb24gaW50ZXJmYWNlcyB0byBib2FyZC1zcGVjaWZpYwotICAgcm91dGluZXMuCi0Jdm9pZCByZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi0JCVJlc2V0cyB0aGUgYm9hcmQgYXNzb2NpYXRlZCB3aXRoIERFViwgaW5jbHVkaW5nIGEgaGFyZHdhcmUgcmVzZXQgb2YKLQkJdGhlIDgzOTAuICBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSB0cmFuc21pdCB0aW1lb3V0LCBhbmQKLQkJaXQgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IDgzOTBfaW5pdCgpLgotCXZvaWQgYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJCQkgIGludCBzdGFydF9wYWdlKQotCQlXcml0ZSB0aGUgQ09VTlQgYnl0ZXMgb2YgQlVGIHRvIHRoZSBwYWNrZXQgYnVmZmVyIGF0IFNUQVJUX1BBR0UuICBUaGUKLQkJInBhZ2UiIHZhbHVlIHVzZXMgdGhlIDgzOTAncyAyNTYtYnl0ZSBwYWdlcy4KLQl2b2lkIGdldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCi0JCVJlYWQgdGhlIDQgYnl0ZSwgcGFnZSBhbGlnbmVkIDgzOTAgaGVhZGVyLiAqSWYqIHRoZXJlIGlzIGEKLQkJc3Vic2VxdWVudCByZWFkLCBpdCB3aWxsIGJlIG9mIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQuCi0Jdm9pZCBibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKLQkJUmVhZCBDT1VOVCBieXRlcyBmcm9tIHRoZSBwYWNrZXQgYnVmZmVyIGludG8gdGhlIHNrYiBkYXRhIGFyZWEuIFN0YXJ0Ci0JCXJlYWRpbmcgZnJvbSBSSU5HX09GRlNFVCwgdGhlIGFkZHJlc3MgYXMgdGhlIDgzOTAgc2VlcyBpdC4gIFRoaXMgd2lsbCBhbHdheXMKLQkJZm9sbG93IHRoZSByZWFkIG9mIHRoZSA4MzkwIGhlYWRlci4KLSovCi0jZGVmaW5lIGVpX3Jlc2V0XzgzOTAgKGVpX2xvY2FsLT5yZXNldF84MzkwKQotI2RlZmluZSBlaV9ibG9ja19vdXRwdXQgKGVpX2xvY2FsLT5ibG9ja19vdXRwdXQpCi0jZGVmaW5lIGVpX2Jsb2NrX2lucHV0IChlaV9sb2NhbC0+YmxvY2tfaW5wdXQpCi0jZGVmaW5lIGVpX2dldF84MzkwX2hkciAoZWlfbG9jYWwtPmdldF84MzkwX2hkcikKLQotLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCi0jaWZuZGVmIGVpX2RlYnVnCi1pbnQgZWlfZGVidWcgPSAxOwotI2VuZGlmCi0KLS8qIEluZGV4IHRvIGZ1bmN0aW9ucy4gKi8KLXN0YXRpYyB2b2lkIGVpX3R4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBlaV90eF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBlaV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgZWlfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGVpX3J4X292ZXJydW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KLS8qIFJvdXRpbmVzIGdlbmVyaWMgdG8gTlM4MzkwLWJhc2VkIGJvYXJkcy4gKi8KLXN0YXRpYyB2b2lkIE5TODM5MF90cmlnZ2VyX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGxlbmd0aCwKLQkJCQkJCQkJaW50IHN0YXJ0X3BhZ2UpOwotc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgZG9fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi0vKgotICoJU01QIGFuZCB0aGUgODM5MCBzZXR1cC4KLSAqCi0gKglUaGUgODM5MCBpc250IGV4YWN0bHkgZGVzaWduZWQgdG8gYmUgbXVsdGl0aHJlYWRlZCBvbiBSWC9UWC4gVGhlcmUgaXMKLSAqCWEgcGFnZSByZWdpc3RlciB0aGF0IGNvbnRyb2xzIGJhbmsgYW5kIHBhY2tldCBidWZmZXIgYWNjZXNzLiBXZSBndWFyZAotICoJdGhpcyB3aXRoIGVpX2xvY2FsLT5wYWdlX2xvY2suIE5vYm9keSBzaG91bGQgYXNzdW1lIG9yIHNldCB0aGUgcGFnZSBvdGhlcgotICoJdGhhbiB6ZXJvIHdoZW4gdGhlIGxvY2sgaXMgbm90IGhlbGQuIExvY2sgaG9sZGVycyBtdXN0IHJlc3RvcmUgcGFnZSAwCi0gKgliZWZvcmUgdW5sb2NraW5nLiBFdmVuIHB1cmUgcmVhZGVycyBtdXN0IHRha2UgdGhlIGxvY2sgdG8gcHJvdGVjdCBpbgotICoJcGFnZSAwLgotICoKLSAqCVRvIG1ha2UgbGlmZSBkaWZmaWN1bHQgdGhlIGNoaXAgY2FuIGFsc28gYmUgdmVyeSBzbG93LiBXZSB0aGVyZWZvcmUgY2FuJ3QKLSAqCWp1c3QgdXNlIHNwaW5sb2Nrcy4gRm9yIHRoZSBsb25nZXIgbG9ja3VwcyB3ZSBkaXNhYmxlIHRoZSBpcnEgdGhlIGRldmljZQotICoJc2l0cyBvbiBhbmQgaG9sZCB0aGUgbG9jay4gV2UgbXVzdCBob2xkIHRoZSBsb2NrIGJlY2F1c2UgdGhlcmUgaXMgYSBkdWFsCi0gKglwcm9jZXNzb3IgY2FzZSBvdGhlciB0aGFuIGludGVycnVwdHMgKGdldCBzdGF0cy9zZXQgbXVsdGljYXN0IGxpc3QgaW4KLSAqCXBhcmFsbGVsIHdpdGggZWFjaCBvdGhlciBhbmQgdHJhbnNtaXQpLgotICoKLSAqCU5vdGU6IGluIHRoZW9yeSB3ZSBjYW4ganVzdCBkaXNhYmxlIHRoZSBpcnEgb24gdGhlIGNhcmQgX2J1dF8gdGhlcmUgaXMKLSAqCWEgbGF0ZW5jeSBvbiBTTVAgaXJxIGRlbGl2ZXJ5LiBTbyB3ZSBjYW4gZWFzaWx5IGdvICJkaXNhYmxlIGlycSIgInN5bmMgaXJxcyIKLSAqCWVudGVyIGxvY2ssIHRha2UgdGhlIHF1ZXVlZCBpcnEuIFNvIHdlIHdhZGRsZSBpbnN0ZWFkIG9mIGZseWluZy4KLSAqCi0gKglGaW5hbGx5IGJ5IHNwZWNpYWwgYXJyYW5nZW1lbnQgZm9yIHRoZSBwdXJwb3NlIG9mIGJlaW5nIGdlbmVyYWxseQotICoJYW5ub3lpbmcgdGhlIHRyYW5zbWl0IGZ1bmN0aW9uIGlzIGNhbGxlZCBiaCBhdG9taWMuIFRoYXQgcGxhY2VzCi0gKglyZXN0cmljdGlvbnMgb24gdGhlIHVzZXIgY29udGV4dCBjYWxsZXJzIGFzIGRpc2FibGVfaXJxIHdvbid0IHNhdmUKLSAqCXRoZW0uCi0gKi8KLQotCi0KLS8qKgotICogZWlfb3BlbiAtIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuCi0gKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBpbml0aWFsaXplCi0gKgotICogVGhpcyByb3V0aW5lIGdvZXMgYWxsLW91dCwgc2V0dGluZyBldmVyeXRoaW5nCi0gKiB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbiB0aG91Z2ggbWFueSBvZiB0aGVzZSByZWdpc3RlcnMgc2hvdWxkIG9ubHkKLSAqIG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdC4KLSAqLwogaW50IGVpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKLQotCS8qIFRoZSBjYXJkIEkvTyBwYXJ0IG9mIHRoZSBkcml2ZXIgKGUuZy4gM2M1MDMpIGNhbiBob29rIGEgVHggdGltZW91dAotCSAgICB3cmFwcGVyIHRoYXQgZG9lcyBlLmcuIG1lZGlhIGNoZWNrICYgdGhlbiBjYWxscyBlaV90eF90aW1lb3V0LiAqLwotCWlmIChkZXYtPnR4X3RpbWVvdXQgPT0gTlVMTCkKLQkJIGRldi0+dHhfdGltZW91dCA9IGVpX3R4X3RpbWVvdXQ7Ci0JaWYgKGRldi0+d2F0Y2hkb2dfdGltZW8gPD0gMCkKLQkJIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwotCi0JLyoKLQkgKglHcmFiIHRoZSBwYWdlIGxvY2sgc28gd2Ugb3duIHRoZSByZWdpc3RlciBzZXQsIHRoZW4gY2FsbAotCSAqCXRoZSBpbml0IGZ1bmN0aW9uLgotCSAqLwotCi0gICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKLQlOUzgzOTBfaW5pdChkZXYsIDEpOwotCS8qIFNldCB0aGUgZmxhZyBiZWZvcmUgd2UgZHJvcCB0aGUgbG9jaywgVGhhdCB3YXkgdGhlIElSUSBhcnJpdmVzCi0JICAgYWZ0ZXIgaXRzIHNldCBhbmQgd2UgZ2V0IG5vIHNpbGx5IHdhcm5pbmdzICovCi0JbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLSAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7Ci0JZWlfbG9jYWwtPmlycWxvY2sgPSAwOwotCXJldHVybiAwOworCXJldHVybiBfX2VpX29wZW4oZGV2KTsKIH0KIAotLyoqCi0gKiBlaV9jbG9zZSAtIHNodXQgZG93biBuZXR3b3JrIGRldmljZQotICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gY2xvc2UKLSAqCi0gKiBPcHBvc2l0ZSBvZiBlaV9vcGVuKCkuIE9ubHkgdXNlZCB3aGVuICJpZmNvbmZpZyA8ZGV2bmFtZT4gZG93biIgaXMgZG9uZS4KLSAqLwogaW50IGVpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKgotCSAqCUhvbGQgdGhlIHBhZ2UgbG9jayBkdXJpbmcgY2xvc2UKLQkgKi8KLQotICAgICAgCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7Ci0JTlM4MzkwX2luaXQoZGV2LCAwKTsKLSAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7Ci0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCXJldHVybiAwOworCXJldHVybiBfX2VpX2Nsb3NlKGRldik7CiB9CiAKLS8qKgotICogZWlfdHhfdGltZW91dCAtIGhhbmRsZSB0cmFuc21pdCB0aW1lIG91dCBjb25kaXRpb24KLSAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIGhhcyBhcHBhcmVudGx5IGZhbGxlbiBhc2xlZXAKLSAqCi0gKiBDYWxsZWQgYnkga2VybmVsIHdoZW4gZGV2aWNlIG5ldmVyIGFja25vd2xlZGdlcyBhIHRyYW5zbWl0IGhhcwotICogY29tcGxldGVkIChvciBmYWlsZWQpIC0gaS5lLiBuZXZlciBwb3N0ZWQgYSBUeCByZWxhdGVkIGludGVycnVwdC4KLSAqLwotCi12b2lkIGVpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0JaW50IHR4c3IsIGlzciwgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19NMzJSKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0JdW5zaWduZWQgbG9uZyBpY3VjcjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpY3VjciA9IGlubChNMzJSX0lDVV9DUjFfUE9SVEwpOwotCWljdWNyIHw9IE0zMlJfSUNVQ1JfSVNNT0QxMTsKLQlvdXRsKGljdWNyLCBNMzJSX0lDVV9DUjFfUE9SVEwpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLSNlbmRpZgotCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKLQl0eHNyID0gaW5iKGU4MzkwX2Jhc2UrRU4wX1RTUik7Ci0JaXNyID0gaW5iKGU4MzkwX2Jhc2UrRU4wX0lTUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCB0aW1lZCBvdXQsICVzIFRTUj0lIzJ4LCBJU1I9JSMyeCwgdD0lZC5cbiIsCi0JCWRldi0+bmFtZSwgKHR4c3IgJiBFTlRTUl9BQlQpID8gImV4Y2VzcyBjb2xsaXNpb25zLiIgOgotCQkoaXNyKSA/ICJsb3N0IGludGVycnVwdD8iIDogImNhYmxlIHByb2JsZW0/IiwgdHhzciwgaXNyLCB0aWNrc3NvZmFyKTsKLQotCWlmICghaXNyICYmICFlaV9sb2NhbC0+c3RhdC50eF9wYWNrZXRzKQotCXsKLQkJLyogVGhlIDgzOTAgcHJvYmFibHkgaGFzbid0IGdvdHRlbiBvbiB0aGUgY2FibGUgeWV0LiAqLwotCQllaV9sb2NhbC0+aW50ZXJmYWNlX251bSBePSAxOyAgIC8qIFRyeSBhIGRpZmZlcmVudCB4Y3ZyLiAgKi8KLQl9Ci0KLQkvKiBVZ2x5IGJ1dCBhIHJlc2V0IGNhbiBiZSBzbG93LCB5ZXQgbXVzdCBiZSBwcm90ZWN0ZWQgKi8KLQotCWRpc2FibGVfaXJxX25vc3luY19sb2NrZGVwKGRldi0+aXJxKTsKLQlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOwotCi0JLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGNhcmQuICBQZXJoYXBzIHRoZSB1c2VyIGhhcyBmaXhlZCBzb21ldGhpbmcuICovCi0JZWlfcmVzZXRfODM5MChkZXYpOwotCU5TODM5MF9pbml0KGRldiwgMSk7Ci0KLQlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7Ci0JZW5hYmxlX2lycV9sb2NrZGVwKGRldi0+aXJxKTsKLQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci19Ci0KLS8qKgotICogZWlfc3RhcnRfeG1pdCAtIGJlZ2luIHBhY2tldCB0cmFuc21pc3Npb24KLSAqIEBza2I6IHBhY2tldCB0byBiZSBzZW50Ci0gKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byB3aGljaCBwYWNrZXQgaXMgc2VudAotICoKLSAqIFNlbmRzIGEgcGFja2V0IHRvIGFuIDgzOTAgbmV0d29yayBkZXZpY2UuCi0gKi8KLQotc3RhdGljIGludCBlaV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBzZW5kX2xlbmd0aCA9IHNrYi0+bGVuLCBvdXRwdXRfcGFnZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNoYXIgYnVmW0VUSF9aTEVOXTsKLQljaGFyICpkYXRhID0gc2tiLT5kYXRhOwotCi0JaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKLQkJbWVtc2V0KGJ1ZiwgMCwgRVRIX1pMRU4pOwkvKiBtb3JlIGVmZmljaWVudCB0aGFuIGRvaW5nIGp1c3QgdGhlIG5lZWRlZCBiaXRzICovCi0JCW1lbWNweShidWYsIGRhdGEsIHNrYi0+bGVuKTsKLQkJc2VuZF9sZW5ndGggPSBFVEhfWkxFTjsKLQkJZGF0YSA9IGJ1ZjsKLQl9Ci0KLQkvKiBNYXNrIGludGVycnVwdHMgZnJvbSB0aGUgZXRoZXJjYXJkLgotCSAgIFNNUDogV2UgaGF2ZSB0byBncmFiIHRoZSBsb2NrIGhlcmUgb3RoZXJ3aXNlIHRoZSBJUlEgaGFuZGxlcgotCSAgIG9uIGFub3RoZXIgQ1BVIGNhbiBmbGlwIHdpbmRvdyBhbmQgcmFjZSB0aGUgSVJRIG1hc2sgc2V0LiBXZSBlbmQKLQkgICB1cCB0cmFzaGluZyB0aGUgbWNhc3QgZmlsdGVyIG5vdCBkaXNhYmxpbmcgaXJxcyBpZiB3ZSBkb24ndCBsb2NrICovCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwotCW91dGJfcCgweDAwLCBlODM5MF9iYXNlICsgRU4wX0lNUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwotCi0KLQkvKgotCSAqCVNsb3cgcGhhc2Ugd2l0aCBsb2NrIGhlbGQuCi0JICovCi0KLQlkaXNhYmxlX2lycV9ub3N5bmNfbG9ja2RlcF9pcnFzYXZlKGRldi0+aXJxLCAmZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKLQotCWVpX2xvY2FsLT5pcnFsb2NrID0gMTsKLQotCS8qCi0JICogV2UgaGF2ZSB0d28gVHggc2xvdHMgYXZhaWxhYmxlIGZvciB1c2UuIEZpbmQgdGhlIGZpcnN0IGZyZWUKLQkgKiBzbG90LCBhbmQgdGhlbiBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gV2l0aCB0d28gVHggYnVmcywKLQkgKiB5b3UgZ2V0IHZlcnkgY2xvc2UgdG8gdHJhbnNtaXR0aW5nIGJhY2stdG8tYmFjayBwYWNrZXRzLiBXaXRoCi0JICogb25seSBvbmUgVHggYnVmLCB0aGUgdHJhbnNtaXR0ZXIgc2l0cyBpZGxlIHdoaWxlIHlvdSByZWxvYWQgdGhlCi0JICogY2FyZCwgbGVhdmluZyBhIHN1YnN0YW50aWFsIGdhcCBiZXR3ZWVuIGVhY2ggdHJhbnNtaXR0ZWQgcGFja2V0LgotCSAqLwotCi0JaWYgKGVpX2xvY2FsLT50eDEgPT0gMCkKLQl7Ci0JCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2U7Ci0JCWVpX2xvY2FsLT50eDEgPSBzZW5kX2xlbmd0aDsKLQkJaWYgKGVpX2RlYnVnICAmJiAgZWlfbG9jYWwtPnR4MiA+IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlkbGUgdHJhbnNtaXR0ZXIgdHgyPSVkLCBsYXN0dHg9JWQsIHR4aW5nPSVkLlxuIiwKLQkJCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eGluZyk7Ci0JfQotCWVsc2UgaWYgKGVpX2xvY2FsLT50eDIgPT0gMCkKLQl7Ci0JCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UgKyBUWF9QQUdFUy8yOwotCQllaV9sb2NhbC0+dHgyID0gc2VuZF9sZW5ndGg7Ci0JCWlmIChlaV9kZWJ1ZyAgJiYgIGVpX2xvY2FsLT50eDEgPiAwKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpZGxlIHRyYW5zbWl0dGVyLCB0eDE9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAotCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKLQl9Ci0JZWxzZQotCXsJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLwotCQlpZiAoZWlfZGVidWcpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIFR4IGJ1ZmZlcnMgZnJlZSEgdHgxPSVkIHR4Mj0lZCBsYXN0PSVkXG4iLAotCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCk7Ci0JCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKLQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7Ci0JCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKLQkJZW5hYmxlX2lycV9sb2NrZGVwX2lycXJlc3RvcmUoZGV2LT5pcnEsICZmbGFncyk7Ci0JCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKgotCSAqIE9rYXksIG5vdyB1cGxvYWQgdGhlIHBhY2tldCBhbmQgdHJpZ2dlciBhIHNlbmQgaWYgdGhlIHRyYW5zbWl0dGVyCi0JICogaXNuJ3QgYWxyZWFkeSBzZW5kaW5nLiBJZiBpdCBpcyBidXN5LCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbAotCSAqIHRyaWdnZXIgdGhlIHNlbmQgbGF0ZXIsIHVwb24gcmVjZWl2aW5nIGEgVHggZG9uZSBpbnRlcnJ1cHQuCi0JICovCi0KLQllaV9ibG9ja19vdXRwdXQoZGV2LCBzZW5kX2xlbmd0aCwgZGF0YSwgb3V0cHV0X3BhZ2UpOwotCi0JaWYgKCEgZWlfbG9jYWwtPnR4aW5nKQotCXsKLQkJZWlfbG9jYWwtPnR4aW5nID0gMTsKLQkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIHNlbmRfbGVuZ3RoLCBvdXRwdXRfcGFnZSk7Ci0JCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQlpZiAob3V0cHV0X3BhZ2UgPT0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UpCi0JCXsKLQkJCWVpX2xvY2FsLT50eDEgPSAtMTsKLQkJCWVpX2xvY2FsLT5sYXN0dHggPSAtMTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWVpX2xvY2FsLT50eDIgPSAtMTsKLQkJCWVpX2xvY2FsLT5sYXN0dHggPSAtMjsKLQkJfQotCX0KLQllbHNlIGVpX2xvY2FsLT50eHF1ZXVlKys7Ci0KLQlpZiAoZWlfbG9jYWwtPnR4MSAgJiYgIGVpX2xvY2FsLT50eDIpCi0JCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQllbHNlCi0JCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0KLQkvKiBUdXJuIDgzOTAgaW50ZXJydXB0cyBiYWNrIG9uLiAqLwotCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKLQlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7Ci0KLQlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7Ci0JZW5hYmxlX2lycV9sb2NrZGVwX2lycXJlc3RvcmUoZGV2LT5pcnEsICZmbGFncyk7Ci0KLQlkZXZfa2ZyZWVfc2tiIChza2IpOwotCWVpX2xvY2FsLT5zdGF0LnR4X2J5dGVzICs9IHNlbmRfbGVuZ3RoOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZWlfaW50ZXJydXB0IC0gaGFuZGxlIHRoZSBpbnRlcnJ1cHRzIGZyb20gYW4gODM5MAotICogQGlycTogaW50ZXJydXB0IG51bWJlcgotICogQGRldl9pZDogYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlCi0gKgotICogSGFuZGxlIHRoZSBldGhlciBpbnRlcmZhY2UgaW50ZXJydXB0cy4gV2UgcHVsbCBwYWNrZXRzIGZyb20KLSAqIHRoZSA4MzkwIHZpYSB0aGUgY2FyZCBzcGVjaWZpYyBmdW5jdGlvbnMgYW5kIGZpcmUgdGhlbSBhdCB0aGUgbmV0d29ya2luZwotICogc3RhY2suIFdlIGFsc28gaGFuZGxlIHRyYW5zbWl0IGNvbXBsZXRpb25zIGFuZCB3YWtlIHRoZSB0cmFuc21pdCBwYXRoIGlmCi0gKiBuZWNlc3NhcnkuIFdlIGFsc28gdXBkYXRlIHRoZSBjb3VudGVycyBhbmQgZG8gb3RoZXIgaG91c2VrZWVwaW5nIGFzCi0gKiBuZWVkZWQuCi0gKi8KLQogaXJxcmV0dXJuX3QgZWlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOwotCWxvbmcgZTgzOTBfYmFzZTsKLQlpbnQgaW50ZXJydXB0cywgbnJfc2VydmljZWQgPSAwOwotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsOwotCi0JZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOwotCWVpX2xvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCS8qCi0JICoJUHJvdGVjdCB0aGUgaXJxIHRlc3QgdG9vLgotCSAqLwotCi0Jc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKLQotCWlmIChlaV9sb2NhbC0+aXJxbG9jaykKLQl7Ci0jaWYgMSAvKiBUaGlzIG1pZ2h0IGp1c3QgYmUgYW4gaW50ZXJydXB0IGZvciBhIFBDSSBkZXZpY2Ugc2hhcmluZyB0aGlzIGxpbmUgKi8KLQkJLyogVGhlICJpcnFsb2NrIiBjaGVjayBpcyBvbmx5IGZvciB0ZXN0aW5nLiAqLwotCQlwcmludGsoZWlfbG9jYWwtPmlycWxvY2sKLQkJCSAgID8gIiVzOiBJbnRlcnJ1cHRlZCB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQhIGlzcj0lIzJ4IGltcj0lIzJ4LlxuIgotCQkJICAgOiAiJXM6IFJlZW50ZXJpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyISBpc3I9JSMyeCBpbXI9JSMyeC5cbiIsCi0JCQkgICBkZXYtPm5hbWUsIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSwKLQkJCSAgIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSU1SKSk7Ci0jZW5kaWYKLQkJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JLyogQ2hhbmdlIHRvIHBhZ2UgMCBhbmQgcmVhZCB0aGUgaW50ciBzdGF0dXMgcmVnLiAqLwotCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7Ci0JaWYgKGVpX2RlYnVnID4gMykKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQoaXNyPSUjMi4yeCkuXG4iLCBkZXYtPm5hbWUsCi0JCQkgICBpbmJfcChlODM5MF9iYXNlICsgRU4wX0lTUikpOwotCi0JLyogISFBc3N1bXB0aW9uISEgLS0gd2Ugc3RheSBpbiBwYWdlIDAuCSBEb24ndCBicmVhayB0aGlzLiAqLwotCXdoaWxlICgoaW50ZXJydXB0cyA9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSkgIT0gMAotCQkgICAmJiArK25yX3NlcnZpY2VkIDwgTUFYX1NFUlZJQ0UpCi0JewotCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdCBmcm9tIHN0b3BwZWQgY2FyZFxuIiwgZGV2LT5uYW1lKTsKLQkJCS8qIHJtayAtIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHRzICovCi0JCQlvdXRiX3AoaW50ZXJydXB0cywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOwotCQkJaW50ZXJydXB0cyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaW50ZXJydXB0cyAmIEVOSVNSX09WRVIpCi0JCQllaV9yeF9vdmVycnVuKGRldik7Ci0JCWVsc2UgaWYgKGludGVycnVwdHMgJiAoRU5JU1JfUlgrRU5JU1JfUlhfRVJSKSkKLQkJewotCQkJLyogR290IGEgZ29vZCAoPykgcGFja2V0LiAqLwotCQkJZWlfcmVjZWl2ZShkZXYpOwotCQl9Ci0JCS8qIFB1c2ggdGhlIG5leHQgdG8tdHJhbnNtaXQgcGFja2V0IHRocm91Z2guICovCi0JCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfVFgpCi0JCQllaV90eF9pbnRyKGRldik7Ci0JCWVsc2UgaWYgKGludGVycnVwdHMgJiBFTklTUl9UWF9FUlIpCi0JCQllaV90eF9lcnIoZGV2KTsKLQotCQlpZiAoaW50ZXJydXB0cyAmIEVOSVNSX0NPVU5URVJTKQotCQl7Ci0JCQllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMCk7Ci0JCQllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMSk7Ci0JCQllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMik7Ci0JCQlvdXRiX3AoRU5JU1JfQ09VTlRFUlMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCi0JCX0KLQotCQkvKiBJZ25vcmUgYW55IFJEQyBpbnRlcnJ1cHRzIHRoYXQgbWFrZSBpdCBiYWNrIHRvIGhlcmUuICovCi0JCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfUkRDKQotCQl7Ci0JCQlvdXRiX3AoRU5JU1JfUkRDLCBlODM5MF9iYXNlICsgRU4wX0lTUik7Ci0JCX0KLQotCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwotCX0KLQotCWlmIChpbnRlcnJ1cHRzICYmIGVpX2RlYnVnKQotCXsKLQkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKLQkJaWYgKG5yX3NlcnZpY2VkID49IE1BWF9TRVJWSUNFKQotCQl7Ci0JCQkvKiAweEZGIGlzIHZhbGlkIGZvciBhIGNhcmQgcmVtb3ZhbCAqLwotCQkJaWYoaW50ZXJydXB0cyE9MHhGRikKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsIHN0YXR1cyAlIzIuMnhcbiIsCi0JCQkJICAgZGV2LT5uYW1lLCBpbnRlcnJ1cHRzKTsKLQkJCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrLiBtb3N0IGludHJzLiAqLwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gaW50ZXJydXB0ICUjMnhcbiIsIGRldi0+bmFtZSwgaW50ZXJydXB0cyk7Ci0JCQlvdXRiX3AoMHhmZiwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2suIGFsbCBpbnRycy4gKi8KLQkJfQotCX0KLQlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7Ci0JcmV0dXJuIElSUV9SRVRWQUwobnJfc2VydmljZWQgPiAwKTsKKwlyZXR1cm4gX19laV9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQpOwogfQogCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHZvaWQgZWlfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWRpc2FibGVfaXJxX2xvY2tkZXAoZGV2LT5pcnEpOwotCWVpX2ludGVycnVwdChkZXYtPmlycSwgZGV2KTsKLQllbmFibGVfaXJxX2xvY2tkZXAoZGV2LT5pcnEpOworCV9fZWlfcG9sbChkZXYpOwogfQogI2VuZGlmCiAKLS8qKgotICogZWlfdHhfZXJyIC0gaGFuZGxlIHRyYW5zbWl0dGVyIGVycm9yCi0gKiBAZGV2OiBuZXR3b3JrIGRldmljZSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uCi0gKgotICogQSB0cmFuc21pdHRlciBlcnJvciBoYXMgaGFwcGVuZWQuIE1vc3QgbGlrZWx5IGV4Y2VzcyBjb2xsaXNpb25zICh3aGljaAotICogaXMgYSBmYWlybHkgbm9ybWFsIGNvbmRpdGlvbikuIElmIHRoZSBlcnJvciBpcyBvbmUgd2hlcmUgdGhlIFR4IHdpbGwKLSAqIGhhdmUgYmVlbiBhYm9ydGVkLCB3ZSB0cnkgYW5kIHNlbmQgYW5vdGhlciBvbmUgcmlnaHQgYXdheSwgaW5zdGVhZCBvZgotICogbGV0dGluZyB0aGUgZmFpbGVkIHBhY2tldCBzaXQgYW5kIGNvbGxlY3QgZHVzdCBpbiB0aGUgVHggYnVmZmVyLiBUaGlzCi0gKiBpcyBhIG11Y2ggYmV0dGVyIHNvbHV0aW9uIGFzIGl0IGF2b2lkcyBrZXJuZWwgYmFzZWQgVHggdGltZW91dHMsIGFuZAotICogYW4gdW5uZWNlc3NhcnkgY2FyZCByZXNldC4KLSAqCi0gKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuCi0gKi8KLQotc3RhdGljIHZvaWQgZWlfdHhfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGNoYXIgdHhzciA9IGluYl9wKGU4MzkwX2Jhc2UrRU4wX1RTUik7Ci0JdW5zaWduZWQgY2hhciB0eF93YXNfYWJvcnRlZCA9IHR4c3IgJiAoRU5UU1JfQUJUK0VOVFNSX0ZVKTsKLQotI2lmZGVmIFZFUkJPU0VfRVJST1JfRFVNUAotCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXR0ZXIgZXJyb3IgKCUjMngpOiAiLCBkZXYtPm5hbWUsIHR4c3IpOwotCWlmICh0eHNyICYgRU5UU1JfQUJUKQotCQlwcmludGsoImV4Y2Vzcy1jb2xsaXNpb25zICIpOwotCWlmICh0eHNyICYgRU5UU1JfTkQpCi0JCXByaW50aygibm9uLWRlZmVycmFsICIpOwotCWlmICh0eHNyICYgRU5UU1JfQ1JTKQotCQlwcmludGsoImxvc3QtY2FycmllciAiKTsKLQlpZiAodHhzciAmIEVOVFNSX0ZVKQotCQlwcmludGsoIkZJRk8tdW5kZXJydW4gIik7Ci0JaWYgKHR4c3IgJiBFTlRTUl9DREgpCi0JCXByaW50aygibG9zdC1oZWFydGJlYXQgIik7Ci0JcHJpbnRrKCJcbiIpOwotI2VuZGlmCi0KLQlvdXRiX3AoRU5JU1JfVFhfRVJSLCBlODM5MF9iYXNlICsgRU4wX0lTUik7IC8qIEFjayBpbnRyLiAqLwotCi0JaWYgKHR4X3dhc19hYm9ydGVkKQotCQllaV90eF9pbnRyKGRldik7Ci0JZWxzZQotCXsKLQkJZWlfbG9jYWwtPnN0YXQudHhfZXJyb3JzKys7Ci0JCWlmICh0eHNyICYgRU5UU1JfQ1JTKSBlaV9sb2NhbC0+c3RhdC50eF9jYXJyaWVyX2Vycm9ycysrOwotCQlpZiAodHhzciAmIEVOVFNSX0NESCkgZWlfbG9jYWwtPnN0YXQudHhfaGVhcnRiZWF0X2Vycm9ycysrOwotCQlpZiAodHhzciAmIEVOVFNSX09XQykgZWlfbG9jYWwtPnN0YXQudHhfd2luZG93X2Vycm9ycysrOwotCX0KLX0KLQotLyoqCi0gKiBlaV90eF9pbnRyIC0gdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIKLSAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0eCBpbnRyIGlzIGhhbmRsZWQKLSAqCi0gKiBXZSBoYXZlIGZpbmlzaGVkIGEgdHJhbnNtaXQ6IGNoZWNrIGZvciBlcnJvcnMgYW5kIHRoZW4gdHJpZ2dlciB0aGUgbmV4dAotICogcGFja2V0IHRvIGJlIHNlbnQuIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KLSAqLwotCi1zdGF0aWMgdm9pZCBlaV90eF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBzdGF0dXMgPSBpbmIoZTgzOTBfYmFzZSArIEVOMF9UU1IpOwotCi0Jb3V0Yl9wKEVOSVNSX1RYLCBlODM5MF9iYXNlICsgRU4wX0lTUik7IC8qIEFjayBpbnRyLiAqLwotCi0JLyoKLQkgKiBUaGVyZSBhcmUgdHdvIFR4IGJ1ZmZlcnMsIHNlZSB3aGljaCBvbmUgZmluaXNoZWQsIGFuZCB0cmlnZ2VyCi0JICogdGhlIHNlbmQgb2YgYW5vdGhlciBvbmUgaWYgaXQgZXhpc3RzLgotCSAqLwotCWVpX2xvY2FsLT50eHF1ZXVlLS07Ci0KLQlpZiAoZWlfbG9jYWwtPnR4MSA8IDApCi0JewotCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAxICYmIGVpX2xvY2FsLT5sYXN0dHggIT0gLTEpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgxPSVkLlxuIiwKLQkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4MSk7Ci0JCWVpX2xvY2FsLT50eDEgPSAwOwotCQlpZiAoZWlfbG9jYWwtPnR4MiA+IDApCi0JCXsKLQkJCWVpX2xvY2FsLT50eGluZyA9IDE7Ci0JCQlOUzgzOTBfdHJpZ2dlcl9zZW5kKGRldiwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UgKyA2KTsKLQkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQkJZWlfbG9jYWwtPnR4MiA9IC0xLAotCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDI7Ci0JCX0KLQkJZWxzZSBlaV9sb2NhbC0+bGFzdHR4ID0gMjAsIGVpX2xvY2FsLT50eGluZyA9IDA7Ci0JfQotCWVsc2UgaWYgKGVpX2xvY2FsLT50eDIgPCAwKQotCXsKLQkJaWYgKGVpX2xvY2FsLT5sYXN0dHggIT0gMiAgJiYgIGVpX2xvY2FsLT5sYXN0dHggIT0gLTIpCi0JCQlwcmludGsoIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgyPSVkLlxuIiwKLQkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4Mik7Ci0JCWVpX2xvY2FsLT50eDIgPSAwOwotCQlpZiAoZWlfbG9jYWwtPnR4MSA+IDApCi0JCXsKLQkJCWVpX2xvY2FsLT50eGluZyA9IDE7Ci0JCQlOUzgzOTBfdHJpZ2dlcl9zZW5kKGRldiwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UpOwotCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCQllaV9sb2NhbC0+dHgxID0gLTE7Ci0JCQllaV9sb2NhbC0+bGFzdHR4ID0gMTsKLQkJfQotCQllbHNlCi0JCQllaV9sb2NhbC0+bGFzdHR4ID0gMTAsIGVpX2xvY2FsLT50eGluZyA9IDA7Ci0JfQotLy8JZWxzZSBwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5leHBlY3RlZCBUWC1kb25lIGludGVycnVwdCwgbGFzdHR4PSVkLlxuIiwKLS8vCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+bGFzdHR4KTsKLQotCS8qIE1pbmltaXplIFR4IGxhdGVuY3k6IHVwZGF0ZSB0aGUgc3RhdGlzdGljcyBhZnRlciB3ZSByZXN0YXJ0IFRYaW5nLiAqLwotCWlmIChzdGF0dXMgJiBFTlRTUl9DT0wpCi0JCWVpX2xvY2FsLT5zdGF0LmNvbGxpc2lvbnMrKzsKLQlpZiAoc3RhdHVzICYgRU5UU1JfUFRYKQotCQllaV9sb2NhbC0+c3RhdC50eF9wYWNrZXRzKys7Ci0JZWxzZQotCXsKLQkJZWlfbG9jYWwtPnN0YXQudHhfZXJyb3JzKys7Ci0JCWlmIChzdGF0dXMgJiBFTlRTUl9BQlQpCi0JCXsKLQkJCWVpX2xvY2FsLT5zdGF0LnR4X2Fib3J0ZWRfZXJyb3JzKys7Ci0JCQllaV9sb2NhbC0+c3RhdC5jb2xsaXNpb25zICs9IDE2OwotCQl9Ci0JCWlmIChzdGF0dXMgJiBFTlRTUl9DUlMpCi0JCQllaV9sb2NhbC0+c3RhdC50eF9jYXJyaWVyX2Vycm9ycysrOwotCQlpZiAoc3RhdHVzICYgRU5UU1JfRlUpCi0JCQllaV9sb2NhbC0+c3RhdC50eF9maWZvX2Vycm9ycysrOwotCQlpZiAoc3RhdHVzICYgRU5UU1JfQ0RIKQotCQkJZWlfbG9jYWwtPnN0YXQudHhfaGVhcnRiZWF0X2Vycm9ycysrOwotCQlpZiAoc3RhdHVzICYgRU5UU1JfT1dDKQotCQkJZWlfbG9jYWwtPnN0YXQudHhfd2luZG93X2Vycm9ycysrOwotCX0KLQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci19Ci0KLS8qKgotICogZWlfcmVjZWl2ZSAtIHJlY2VpdmUgc29tZSBwYWNrZXRzCi0gKiBAZGV2OiBuZXR3b3JrIGRldmljZSB3aXRoIHdoaWNoIHJlY2VpdmUgd2lsbCBiZSBydW4KLSAqCi0gKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4KLSAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KLSAqLwotCi1zdGF0aWMgdm9pZCBlaV9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7Ci0Jc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGNoYXIgcnhpbmdfcGFnZSwgdGhpc19mcmFtZSwgbmV4dF9mcmFtZTsKLQl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X29mZnNldDsKLQlpbnQgcnhfcGt0X2NvdW50ID0gMDsKLQlzdHJ1Y3QgZTgzOTBfcGt0X2hkciByeF9mcmFtZTsKLQlpbnQgbnVtX3J4X3BhZ2VzID0gZWlfbG9jYWwtPnN0b3BfcGFnZS1laV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsKLQotCXdoaWxlICgrK3J4X3BrdF9jb3VudCA8IDEwKQotCXsKLQkJaW50IHBrdF9sZW4sIHBrdF9zdGF0OwotCi0JCS8qIEdldCB0aGUgcnggcGFnZSAoaW5jb21pbmcgcGFja2V0IHBvaW50ZXIpLiAqLwotCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTEsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwotCQlyeGluZ19wYWdlID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9DVVJQQUcpOwotCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwotCi0JCS8qIFJlbW92ZSBvbmUgZnJhbWUgZnJvbSB0aGUgcmluZy4gIEJvdW5kYXJ5IGlzIGFsd2F5cyBhIHBhZ2UgYmVoaW5kLiAqLwotCQl0aGlzX2ZyYW1lID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9CT1VOREFSWSkgKyAxOwotCQlpZiAodGhpc19mcmFtZSA+PSBlaV9sb2NhbC0+c3RvcF9wYWdlKQotCQkJdGhpc19mcmFtZSA9IGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOwotCi0JCS8qIFNvbWVkYXkgd2UnbGwgb21pdCB0aGUgcHJldmlvdXMsIGlmZiB3ZSBuZXZlciBnZXQgdGhpcyBtZXNzYWdlLgotCQkgICAoVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNsb25lIGNsYWltZWQgdG8gaGF2ZSBhIHByb2JsZW0uKQotCi0JCSAgIEtlZXAgcXVpZXQgaWYgaXQgbG9va3MgbGlrZSBhIGNhcmQgcmVtb3ZhbC4gT25lIHByb2JsZW0gaGVyZQotCQkgICBpcyB0aGF0IHNvbWUgY2xvbmVzIGNyYXNoIGluIHJvdWdobHkgdGhlIHNhbWUgd2F5LgotCQkgKi8KLQkJaWYgKGVpX2RlYnVnID4gMCAgJiYgIHRoaXNfZnJhbWUgIT0gZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSAmJiAodGhpc19mcmFtZSE9MHgwIHx8IHJ4aW5nX3BhZ2UhPTB4RkYpKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWlzbWF0Y2hlZCByZWFkIHBhZ2UgcG9pbnRlcnMgJTJ4IHZzICUyeC5cbiIsCi0JCQkJICAgZGV2LT5uYW1lLCB0aGlzX2ZyYW1lLCBlaV9sb2NhbC0+Y3VycmVudF9wYWdlKTsKLQotCQlpZiAodGhpc19mcmFtZSA9PSByeGluZ19wYWdlKQkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLwotCQkJYnJlYWs7CQkJCS8qIERvbmUgZm9yIG5vdyAqLwotCi0JCWN1cnJlbnRfb2Zmc2V0ID0gdGhpc19mcmFtZSA8PCA4OwotCQllaV9nZXRfODM5MF9oZHIoZGV2LCAmcnhfZnJhbWUsIHRoaXNfZnJhbWUpOwotCi0JCXBrdF9sZW4gPSByeF9mcmFtZS5jb3VudCAtIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik7Ci0JCXBrdF9zdGF0ID0gcnhfZnJhbWUuc3RhdHVzOwotCi0JCW5leHRfZnJhbWUgPSB0aGlzX2ZyYW1lICsgMSArICgocGt0X2xlbis0KT4+OCk7Ci0KLQkJLyogQ2hlY2sgZm9yIGJvZ29zaXR5IHdhcm5lZCBieSAzYzUwMyBib29rOiB0aGUgc3RhdHVzIGJ5dGUgaXMgbmV2ZXIKLQkJICAgd3JpdHRlbi4gIFRoaXMgaGFwcGVuZWQgYSBsb3QgZHVyaW5nIHRlc3RpbmchIFRoaXMgY29kZSBzaG91bGQgYmUKLQkJICAgY2xlYW5lZCB1cCBzb21lZGF5LiAqLwotCQlpZiAocnhfZnJhbWUubmV4dCAhPSBuZXh0X2ZyYW1lCi0JCQkmJiByeF9mcmFtZS5uZXh0ICE9IG5leHRfZnJhbWUgKyAxCi0JCQkmJiByeF9mcmFtZS5uZXh0ICE9IG5leHRfZnJhbWUgLSBudW1fcnhfcGFnZXMKLQkJCSYmIHJ4X2ZyYW1lLm5leHQgIT0gbmV4dF9mcmFtZSArIDEgLSBudW1fcnhfcGFnZXMpIHsKLQkJCWVpX2xvY2FsLT5jdXJyZW50X3BhZ2UgPSByeGluZ19wYWdlOwotCQkJb3V0YihlaV9sb2NhbC0+Y3VycmVudF9wYWdlLTEsIGU4MzkwX2Jhc2UrRU4wX0JPVU5EQVJZKTsKLQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Vycm9ycysrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAocGt0X2xlbiA8IDYwICB8fCAgcGt0X2xlbiA+IDE1MTgpCi0JCXsKLQkJCWlmIChlaV9kZWJ1ZykKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJvZ3VzIHBhY2tldCBzaXplOiAlZCwgc3RhdHVzPSUjMnggbnhwZz0lIzJ4LlxuIiwKLQkJCQkJICAgZGV2LT5uYW1lLCByeF9mcmFtZS5jb3VudCwgcnhfZnJhbWUuc3RhdHVzLAotCQkJCQkgICByeF9mcmFtZS5uZXh0KTsKLQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Vycm9ycysrOwotCQkJZWlfbG9jYWwtPnN0YXQucnhfbGVuZ3RoX2Vycm9ycysrOwotCQl9Ci0JCSBlbHNlIGlmICgocGt0X3N0YXQgJiAweDBGKSA9PSBFTlJTUl9SWE9LKQotCQl7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7Ci0JCQlpZiAoc2tiID09IE5VTEwpCi0JCQl7Ci0JCQkJaWYgKGVpX2RlYnVnID4gMSkKLQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsCi0JCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4pOwotCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Ryb3BwZWQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCi0JCQkJc2tiLT5kZXYgPSBkZXY7Ci0JCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KLQkJCQllaV9ibG9ja19pbnB1dChkZXYsIHBrdF9sZW4sIHNrYiwgY3VycmVudF9vZmZzZXQgKyBzaXplb2YocnhfZnJhbWUpKTsKLQkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwotCQkJCW5ldGlmX3J4KHNrYik7Ci0JCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkJCQllaV9sb2NhbC0+c3RhdC5yeF9wYWNrZXRzKys7Ci0JCQkJZWlfbG9jYWwtPnN0YXQucnhfYnl0ZXMgKz0gcGt0X2xlbjsKLQkJCQlpZiAocGt0X3N0YXQgJiBFTlJTUl9QSFkpCi0JCQkJCWVpX2xvY2FsLT5zdGF0Lm11bHRpY2FzdCsrOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKGVpX2RlYnVnKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0OiBzdGF0dXM9JSMyeCBueHBnPSUjMnggc2l6ZT0lZFxuIiwKLQkJCQkJICAgZGV2LT5uYW1lLCByeF9mcmFtZS5zdGF0dXMsIHJ4X2ZyYW1lLm5leHQsCi0JCQkJCSAgIHJ4X2ZyYW1lLmNvdW50KTsKLQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Vycm9ycysrOwotCQkJLyogTkI6IFRoZSBOSUMgY291bnRzIENSQywgZnJhbWUgYW5kIG1pc3NlZCBlcnJvcnMuICovCi0JCQlpZiAocGt0X3N0YXQgJiBFTlJTUl9GTykKLQkJCQllaV9sb2NhbC0+c3RhdC5yeF9maWZvX2Vycm9ycysrOwotCQl9Ci0JCW5leHRfZnJhbWUgPSByeF9mcmFtZS5uZXh0OwotCi0JCS8qIFRoaXMgX3Nob3VsZF8gbmV2ZXIgaGFwcGVuOiBpdCdzIGhlcmUgZm9yIGF2b2lkaW5nIGJhZCBjbG9uZXMuICovCi0JCWlmIChuZXh0X2ZyYW1lID49IGVpX2xvY2FsLT5zdG9wX3BhZ2UpIHsKLQkJCXByaW50aygiJXM6IG5leHQgZnJhbWUgaW5jb25zaXN0ZW5jeSwgJSMyeFxuIiwgZGV2LT5uYW1lLAotCQkJCSAgIG5leHRfZnJhbWUpOwotCQkJbmV4dF9mcmFtZSA9IGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOwotCQl9Ci0JCWVpX2xvY2FsLT5jdXJyZW50X3BhZ2UgPSBuZXh0X2ZyYW1lOwotCQlvdXRiX3AobmV4dF9mcmFtZS0xLCBlODM5MF9iYXNlK0VOMF9CT1VOREFSWSk7Ci0JfQotCi0JLyogV2UgdXNlZCB0byBhbHNvIGFjayBFTklTUl9PVkVSIGhlcmUsIGJ1dCB0aGF0IHdvdWxkIHNvbWV0aW1lcyBtYXNrCi0JICAgYSByZWFsIG92ZXJydW4sIGxlYXZpbmcgdGhlIDgzOTAgaW4gYSBzdG9wcGVkIHN0YXRlIHdpdGggcmVjJ3ZyIG9mZi4gKi8KLQlvdXRiX3AoRU5JU1JfUlgrRU5JU1JfUlhfRVJSLCBlODM5MF9iYXNlK0VOMF9JU1IpOwotCXJldHVybjsKLX0KLQotLyoqCi0gKiBlaV9yeF9vdmVycnVuIC0gaGFuZGxlIHJlY2VpdmVyIG92ZXJydW4KLSAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIHRocmV3IGV4Y2VwdGlvbgotICoKLSAqIFdlIGhhdmUgYSByZWNlaXZlciBvdmVycnVuOiB3ZSBoYXZlIHRvIGtpY2sgdGhlIDgzOTAgdG8gZ2V0IGl0IHN0YXJ0ZWQKLSAqIGFnYWluLiBQcm9ibGVtIGlzIHRoYXQgeW91IGhhdmUgdG8ga2ljayBpdCBleGFjdGx5IGFzIE5TIHByZXNjcmliZXMgaW4KLSAqIHRoZSB1cGRhdGVkIGRhdGFzaGVldHMsIG9yICJ0aGUgTklDIG1heSBhY3QgaW4gYW4gdW5wcmVkaWN0YWJsZSBtYW5uZXIuIgotICogVGhpcyBpbmNsdWRlcyBjYXVzaW5nICJ0aGUgTklDIHRvIGRlZmVyIGluZGVmaW5pdGVseSB3aGVuIGl0IGlzIHN0b3BwZWQKLSAqIG9uIGEgYnVzeSBuZXR3b3JrLiIgIFVnaC4KLSAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4gRG9uJ3QgY2FsbCB0aGlzIHdpdGggdGhlIGludGVycnVwdHMgb2ZmIG9yIHlvdXIKLSAqIGNvbXB1dGVyIHdpbGwgaGF0ZSB5b3UgLSBpdCB0YWtlcyAxMG1zIG9yIHNvLgotICovCi0KLXN0YXRpYyB2b2lkIGVpX3J4X292ZXJydW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQl1bnNpZ25lZCBjaGFyIHdhc190eGluZywgbXVzdF9yZXNlbmQgPSAwOwotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKLQotCS8qCi0JICogUmVjb3JkIHdoZXRoZXIgYSBUeCB3YXMgaW4gcHJvZ3Jlc3MgYW5kIHRoZW4gaXNzdWUgdGhlCi0JICogc3RvcCBjb21tYW5kLgotCSAqLwotCXdhc190eGluZyA9IGluYl9wKGU4MzkwX2Jhc2UrRTgzOTBfQ01EKSAmIEU4MzkwX1RSQU5TOwotCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7Ci0KLQlpZiAoZWlfZGVidWcgPiAxKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmVyIG92ZXJydW4uXG4iLCBkZXYtPm5hbWUpOwotCWVpX2xvY2FsLT5zdGF0LnJ4X292ZXJfZXJyb3JzKys7Ci0KLQkvKgotCSAqIFdhaXQgYSBmdWxsIFR4IHRpbWUgKDEuMm1zKSArIHNvbWUgZ3VhcmQgdGltZSwgTlMgc2F5cyAxLjZtcyB0b3RhbC4KLQkgKiBFYXJseSBkYXRhc2hlZXRzIHNhaWQgdG8gcG9sbCB0aGUgcmVzZXQgYml0LCBidXQgbm93IHRoZXkgc2F5IHRoYXQKLQkgKiBpdCAiaXMgbm90IGEgcmVsaWFibGUgaW5kaWNhdG9yIGFuZCBzdWJzZXF1ZW50bHkgc2hvdWxkIGJlIGlnbm9yZWQuIgotCSAqIFdlIHdhaXQgYXQgbGVhc3QgMTBtcy4KLQkgKi8KLQotCW1kZWxheSgxMCk7Ci0KLQkvKgotCSAqIFJlc2V0IFJCQ1JbMDFdIGJhY2sgdG8gemVybyBhcyBwZXIgbWFnaWMgaW5jYW50YXRpb24uCi0JICovCi0Jb3V0Yl9wKDB4MDAsIGU4MzkwX2Jhc2UrRU4wX1JDTlRMTyk7Ci0Jb3V0Yl9wKDB4MDAsIGU4MzkwX2Jhc2UrRU4wX1JDTlRISSk7Ci0KLQkvKgotCSAqIFNlZSBpZiBhbnkgVHggd2FzIGludGVycnVwdGVkIG9yIG5vdC4gQWNjb3JkaW5nIHRvIE5TLCB0aGlzCi0JICogc3RlcCBpcyB2aXRhbCwgYW5kIHNraXBwaW5nIGl0IHdpbGwgY2F1c2Ugbm8gZW5kIG9mIGhhdm9jLgotCSAqLwotCi0JaWYgKHdhc190eGluZykKLQl7Ci0JCXVuc2lnbmVkIGNoYXIgdHhfY29tcGxldGVkID0gaW5iX3AoZTgzOTBfYmFzZStFTjBfSVNSKSAmIChFTklTUl9UWCtFTklTUl9UWF9FUlIpOwotCQlpZiAoIXR4X2NvbXBsZXRlZCkKLQkJCW11c3RfcmVzZW5kID0gMTsKLQl9Ci0KLQkvKgotCSAqIEhhdmUgdG8gZW50ZXIgbG9vcGJhY2sgbW9kZSBhbmQgdGhlbiByZXN0YXJ0IHRoZSBOSUMgYmVmb3JlCi0JICogeW91IGFyZSBhbGxvd2VkIHRvIHNsdXJwIHBhY2tldHMgdXAgb2ZmIHRoZSByaW5nLgotCSAqLwotCW91dGJfcChFODM5MF9UWE9GRiwgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsKLQlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJULCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKLQotCS8qCi0JICogQ2xlYXIgdGhlIFJ4IHJpbmcgb2YgYWxsIHRoZSBkZWJyaXMsIGFuZCBhY2sgdGhlIGludGVycnVwdC4KLQkgKi8KLQllaV9yZWNlaXZlKGRldik7Ci0Jb3V0Yl9wKEVOSVNSX09WRVIsIGU4MzkwX2Jhc2UrRU4wX0lTUik7Ci0KLQkvKgotCSAqIExlYXZlIGxvb3BiYWNrIG1vZGUsIGFuZCByZXNlbmQgYW55IHBhY2tldCB0aGF0IGdvdCBzdG9wcGVkLgotCSAqLwotCW91dGJfcChFODM5MF9UWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsKLQlpZiAobXVzdF9yZXNlbmQpCi0gICAgCQlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJUICsgRTgzOTBfVFJBTlMsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwotfQotCi0vKgotICoJQ29sbGVjdCB0aGUgc3RhdHMuIFRoaXMgaXMgY2FsbGVkIHVubG9ja2VkIGFuZCBmcm9tIHNldmVyYWwgY29udGV4dHMuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwotCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogSWYgdGhlIGNhcmQgaXMgc3RvcHBlZCwganVzdCByZXR1cm4gdGhlIHByZXNlbnQgc3RhdHMuICovCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCi0JCXJldHVybiAmZWlfbG9jYWwtPnN0YXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jayxmbGFncyk7Ci0JLyogUmVhZCB0aGUgY291bnRlciByZWdpc3RlcnMsIGFzc3VtaW5nIHdlIGFyZSBpbiBwYWdlIDAuICovCi0JZWlfbG9jYWwtPnN0YXQucnhfZnJhbWVfZXJyb3JzICs9IGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMCk7Ci0JZWlfbG9jYWwtPnN0YXQucnhfY3JjX2Vycm9ycyAgICs9IGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMSk7Ci0JZWlfbG9jYWwtPnN0YXQucnhfbWlzc2VkX2Vycm9ycys9IGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKLX0KLQotLyoKLSAqIEZvcm0gdGhlIDY0IGJpdCA4MzkwIG11bHRpY2FzdCB0YWJsZSBmcm9tIHRoZSBsaW5rZWQgbGlzdCBvZiBhZGRyZXNzZXMKLSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldiBzdHJ1Y3R1cmUuCi0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkIG1ha2VfbWNfYml0cyh1OCAqYml0cywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKLQotCWZvciAoZG1pPWRldi0+bWNfbGlzdDsgZG1pOyBkbWk9ZG1pLT5uZXh0KQotCXsKLQkJdTMyIGNyYzsKLQkJaWYgKGRtaS0+ZG1pX2FkZHJsZW4gIT0gRVRIX0FMRU4pCi0JCXsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIG11bHRpY2FzdCBhZGRyZXNzIGxlbmd0aCBnaXZlbi5cbiIsIGRldi0+bmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQljcmMgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGRtaS0+ZG1pX2FkZHIpOwotCQkvKgotCQkgKiBUaGUgODM5MCB1c2VzIHRoZSA2IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUKLQkJICogQ1JDIHRvIGluZGV4IHRoZSBtdWx0aWNhc3QgdGFibGUuCi0JCSAqLwotCQliaXRzW2NyYz4+MjldIHw9ICgxPDwoKGNyYz4+MjYpJjcpKTsKLQl9Ci19Ci0KLS8qKgotICogZG9fc2V0X211bHRpY2FzdF9saXN0IC0gc2V0L2NsZWFyIG11bHRpY2FzdCBmaWx0ZXIKLSAqIEBkZXY6IG5ldCBkZXZpY2UgZm9yIHdoaWNoIG11bHRpY2FzdCBmaWx0ZXIgaXMgYWRqdXN0ZWQKLSAqCi0gKglTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4gTWF5IGJlIGNhbGxlZAotICoJZnJvbSBhIEJIIGluIDIuMS54LiBNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KLSAqLwotCi1zdGF0aWMgdm9pZCBkb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQlpbnQgaTsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlKiluZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKCEoZGV2LT5mbGFncyYoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkpCi0JewotCQltZW1zZXQoZWlfbG9jYWwtPm1jZmlsdGVyLCAwLCA4KTsKLQkJaWYgKGRldi0+bWNfbGlzdCkKLQkJCW1ha2VfbWNfYml0cyhlaV9sb2NhbC0+bWNmaWx0ZXIsIGRldik7Ci0JfQotCWVsc2UKLQkJbWVtc2V0KGVpX2xvY2FsLT5tY2ZpbHRlciwgMHhGRiwgOCk7CS8qIG1jYXN0IHNldCB0byBhY2NlcHQtYWxsICovCi0KLQkvKgotCSAqIERQODM5MCBtYW51YWxzIGRvbid0IHNwZWNpZnkgYW55IG1hZ2ljIHNlcXVlbmNlIGZvciBhbHRlcmluZwotCSAqIHRoZSBtdWx0aWNhc3QgcmVncyBvbiBhbiBhbHJlYWR5IHJ1bm5pbmcgY2FyZC4gVG8gYmUgc2FmZSwgd2UKLQkgKiBlbnN1cmUgbXVsdGljYXN0IG1vZGUgaXMgb2ZmIHByaW9yIHRvIGxvYWRpbmcgdXAgdGhlIG5ldyBoYXNoCi0JICogdGFibGUuIElmIHRoaXMgcHJvdmVzIHRvIGJlIG5vdCBlbm91Z2gsIHdlIGNhbiBhbHdheXMgcmVzb3J0Ci0JICogdG8gc3RvcHBpbmcgdGhlIE5JQywgbG9hZGluZyB0aGUgdGFibGUgYW5kIHRoZW4gcmVzdGFydGluZy4KLQkgKgotCSAqIEJ1ZyBBbGVydCEgIFRoZSBNQyByZWdzIG9uIHRoZSBTTUMgODNDNjkwIChTTUMgRWxpdGUgYW5kIFNNQwotCSAqIEVsaXRlMTYpIGFwcGVhciB0byBiZSB3cml0ZS1vbmx5LiBUaGUgTlMgODM5MCBkYXRhIHNoZWV0IGxpc3RzCi0JICogdGhlbSBhcyByL3cgc28gdGhpcyBpcyBhIGJ1Zy4gIFRoZSBTTUMgODNDNzkwIChTTUMgVWx0cmEgYW5kCi0JICogVWx0cmEzMiBFSVNBKSBhcHBlYXJzIHRvIGhhdmUgdGhpcyBidWcgZml4ZWQuCi0JICovCi0KLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQotCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7Ci0Jb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTEsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOwotCWZvcihpID0gMDsgaSA8IDg7IGkrKykKLQl7Ci0JCW91dGJfcChlaV9sb2NhbC0+bWNmaWx0ZXJbaV0sIGU4MzkwX2Jhc2UgKyBFTjFfTVVMVF9TSElGVChpKSk7Ci0jaWZuZGVmIEJVR184M0M2OTAKLQkJaWYoaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9NVUxUX1NISUZUKGkpKSE9ZWlfbG9jYWwtPm1jZmlsdGVyW2ldKQotCQkJcHJpbnRrKEtFUk5fRVJSICJNdWx0aWNhc3QgZmlsdGVyIHJlYWQvd3JpdGUgbWlzbWFwICVkXG4iLGkpOwotI2VuZGlmCi0JfQotCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKLQotICAJaWYoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKLSAgCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcgfCAweDE4LCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOwotCWVsc2UgaWYoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkgfHwgZGV2LT5tY19saXN0KQotICAJCW91dGJfcChFODM5MF9SWENPTkZJRyB8IDB4MDgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7Ci0gIAllbHNlCi0gIAkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOwotIH0KLQotLyoKLSAqCUNhbGxlZCB3aXRob3V0IGxvY2sgaGVsZC4gVGhpcyBpcyBpbnZva2VkIGZyb20gdXNlciBjb250ZXh0IGFuZCBtYXkKLSAqCWJlIHBhcmFsbGVsIHRvIGp1c3QgYWJvdXQgZXZlcnl0aGluZyBlbHNlLiBJdHMgYWxzbyBmYWlybHkgcXVpY2sgYW5kCi0gKglub3QgY2FsbGVkIHRvbyBvZnRlbi4gTXVzdCBwcm90ZWN0IGFnYWluc3QgYm90aCBiaCBhbmQgaXJxIHVzZXJzCi0gKi8KLQotc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlKiluZXRkZXZfcHJpdihkZXYpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKLQlkb19zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKgotICogZXRoZGV2X3NldHVwIC0gaW5pdCByZXN0IG9mIDgzOTAgZGV2aWNlIHN0cnVjdAotICogQGRldjogbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIHRvIGluaXQKLSAqCi0gKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSA4MzkwIGRldmljZSBzdHJ1Y3R1cmUuICBEbyBOT1QgX19pbml0Ci0gKiB0aGlzLCBhcyBpdCBpcyB1c2VkIGJ5IDgzOTAgYmFzZWQgbW9kdWxhciBkcml2ZXJzIHRvby4KLSAqLwotCi1zdGF0aWMgdm9pZCBldGhkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0JaWYgKGVpX2RlYnVnID4gMSkKLQkJcHJpbnRrKHZlcnNpb24pOwotCi0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZWlfc3RhcnRfeG1pdDsKLQlkZXYtPmdldF9zdGF0cwk9IGdldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7Ci0KLQlldGhlcl9zZXR1cChkZXYpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmVpX2xvY2FsLT5wYWdlX2xvY2spOwotfQotCi0vKioKLSAqIGFsbG9jX2VpX25ldGRldiAtIGFsbG9jX2V0aGVyZGV2IGNvdW50ZXJwYXJ0IGZvciA4MzkwCi0gKiBAc2l6ZTogZXh0cmEgYnl0ZXMgdG8gYWxsb2NhdGUKLSAqCi0gKiBBbGxvY2F0ZSA4MzkwLXNwZWNpZmljIG5ldF9kZXZpY2UuCi0gKi8KIHN0cnVjdCBuZXRfZGV2aWNlICpfX2FsbG9jX2VpX25ldGRldihpbnQgc2l6ZSkKIHsKLQlyZXR1cm4gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgZWlfZGV2aWNlKSArIHNpemUsICJldGglZCIsCi0JCQkJZXRoZGV2X3NldHVwKTsKKwlyZXR1cm4gX19fX2FsbG9jX2VpX25ldGRldihzaXplKTsKIH0KIAotCi0KLQotLyogVGhpcyBwYWdlIG9mIGZ1bmN0aW9ucyBzaG91bGQgYmUgODM5MCBnZW5lcmljICovCi0vKiBGb2xsb3cgTmF0aW9uYWwgU2VtaSdzIHJlY29tbWVuZGF0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIHRoZSAiTklDIi4gKi8KLQotLyoqCi0gKiBOUzgzOTBfaW5pdCAtIGluaXRpYWxpemUgODM5MCBoYXJkd2FyZQotICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gaW5pdGlhbGl6ZQotICogQHN0YXJ0cDogYm9vbGVhbi4gIG5vbi16ZXJvIHZhbHVlIHRvIGluaXRpYXRlIGNoaXAgcHJvY2Vzc2luZwotICoKLSAqCU11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgotICovCi0KIHZvaWQgTlM4MzkwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCkKIHsKLQlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7Ci0JaW50IGk7Ci0JaW50IGVuZGNmZyA9IGVpX2xvY2FsLT53b3JkMTYKLQkgICAgPyAoMHg0OCB8IEVORENGR19XVFMgfCAoZWlfbG9jYWwtPmJpZ2VuZGlhbiA/IEVORENGR19CT1MgOiAwKSkKLQkgICAgOiAweDQ4OwotCi0JaWYoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSE9NCkKLSAgICAJCXBhbmljKCI4MzkwLmM6IGhlYWRlciBzdHJ1Y3QgbWlzcGFja2VkXG4iKTsKLQkvKiBGb2xsb3cgTmF0aW9uYWwgU2VtaSdzIHJlY29tbWVuZGF0aW9ucyBmb3IgaW5pdGluZyB0aGUgRFA4MzkwMi4gKi8KLQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOyAvKiAweDIxICovCi0Jb3V0Yl9wKGVuZGNmZywgZTgzOTBfYmFzZSArIEVOMF9EQ0ZHKTsJLyogMHg0OCBvciAweDQ5ICovCi0JLyogQ2xlYXIgdGhlIHJlbW90ZSBieXRlIGNvdW50IHJlZ2lzdGVycy4gKi8KLQlvdXRiX3AoMHgwMCwgIGU4MzkwX2Jhc2UgKyBFTjBfUkNOVExPKTsKLQlvdXRiX3AoMHgwMCwgIGU4MzkwX2Jhc2UgKyBFTjBfUkNOVEhJKTsKLQkvKiBTZXQgdG8gbW9uaXRvciBhbmQgbG9vcGJhY2sgbW9kZSAtLSB0aGlzIGlzIHZpdGFsIS4gKi8KLQlvdXRiX3AoRTgzOTBfUlhPRkYsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7IC8qIDB4MjAgKi8KLQlvdXRiX3AoRTgzOTBfVFhPRkYsIGU4MzkwX2Jhc2UgKyBFTjBfVFhDUik7IC8qIDB4MDIgKi8KLQkvKiBTZXQgdGhlIHRyYW5zbWl0IHBhZ2UgYW5kIHJlY2VpdmUgcmluZy4gKi8KLQlvdXRiX3AoZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfVFBTUik7Ci0JZWlfbG9jYWwtPnR4MSA9IGVpX2xvY2FsLT50eDIgPSAwOwotCW91dGJfcChlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9TVEFSVFBHKTsKLQlvdXRiX3AoZWlfbG9jYWwtPnN0b3BfcGFnZS0xLCBlODM5MF9iYXNlICsgRU4wX0JPVU5EQVJZKTsJLyogM2M1MDMgc2F5cyAweDNmLE5TMHgyNiovCi0JZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOwkJLyogYXNzZXJ0IGJvdW5kYXJ5KzEgKi8KLQlvdXRiX3AoZWlfbG9jYWwtPnN0b3BfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9TVE9QUEcpOwotCS8qIENsZWFyIHRoZSBwZW5kaW5nIGludGVycnVwdHMgYW5kIG1hc2suICovCi0Jb3V0Yl9wKDB4RkYsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKLQlvdXRiX3AoMHgwMCwgIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKLQotCS8qIENvcHkgdGhlIHN0YXRpb24gYWRkcmVzcyBpbnRvIHRoZSBEUzgzOTAgcmVnaXN0ZXJzLiAqLwotCi0Jb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTEgKyBFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7IC8qIDB4NjEgKi8KLQlmb3IoaSA9IDA7IGkgPCA2OyBpKyspCi0JewotCQlvdXRiX3AoZGV2LT5kZXZfYWRkcltpXSwgZTgzOTBfYmFzZSArIEVOMV9QSFlTX1NISUZUKGkpKTsKLQkJaWYgKGVpX2RlYnVnID4gMSAmJiBpbmJfcChlODM5MF9iYXNlICsgRU4xX1BIWVNfU0hJRlQoaSkpIT1kZXYtPmRldl9hZGRyW2ldKQotCQkJcHJpbnRrKEtFUk5fRVJSICJIdy4gYWRkcmVzcyByZWFkL3dyaXRlIG1pc21hcCAlZFxuIixpKTsKLQl9Ci0KLQlvdXRiX3AoZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjFfQ1VSUEFHKTsKLQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOwotCi0JbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLQllaV9sb2NhbC0+dHgxID0gZWlfbG9jYWwtPnR4MiA9IDA7Ci0JZWlfbG9jYWwtPnR4aW5nID0gMDsKLQotCWlmIChzdGFydHApCi0JewotCQlvdXRiX3AoMHhmZiwgIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKLQkJb3V0Yl9wKEVOSVNSX0FMTCwgIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKLQkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7Ci0JCW91dGJfcChFODM5MF9UWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsgLyogeG1pdCBvbi4gKi8KLQkJLyogM2M1MDMgVGVjaE1hbiBzYXlzIHJ4Y29uZmlnIG9ubHkgYWZ0ZXIgdGhlIE5JQyBpcyBzdGFydGVkLiAqLwotCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7IC8qIHJ4IG9uLCAgKi8KLQkJZG9fc2V0X211bHRpY2FzdF9saXN0KGRldik7CS8qIChyZSlsb2FkIHRoZSBtY2FzdCB0YWJsZSAqLwotCX0KLX0KLQotLyogVHJpZ2dlciBhIHRyYW5zbWl0IHN0YXJ0LCBhc3N1bWluZyB0aGUgbGVuZ3RoIGlzIHZhbGlkLgotICAgQWx3YXlzIGNhbGxlZCB3aXRoIHRoZSBwYWdlIGxvY2sgaGVsZCAqLwotCi1zdGF0aWMgdm9pZCBOUzgzOTBfdHJpZ2dlcl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCi0JCQkJCQkJCWludCBzdGFydF9wYWdlKQotewotCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOwotIAlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCBfX2F0dHJpYnV0ZSgodW51c2VkKSkgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwotCi0Jb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7Ci0KLQlpZiAoaW5iX3AoZTgzOTBfYmFzZSArIEU4MzkwX0NNRCkgJiBFODM5MF9UUkFOUykKLQl7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmlnZ2VyX3NlbmQoKSBjYWxsZWQgd2l0aCB0aGUgdHJhbnNtaXR0ZXIgYnVzeS5cbiIsCi0JCQlkZXYtPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCW91dGJfcChsZW5ndGggJiAweGZmLCBlODM5MF9iYXNlICsgRU4wX1RDTlRMTyk7Ci0Jb3V0Yl9wKGxlbmd0aCA+PiA4LCBlODM5MF9iYXNlICsgRU4wX1RDTlRISSk7Ci0Jb3V0Yl9wKHN0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfVFBTUik7Ci0Jb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1RSQU5TK0U4MzkwX1NUQVJULCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7CisJcmV0dXJuIF9fTlM4MzkwX2luaXQoZGV2LCBzdGFydHApOwogfQogCiBFWFBPUlRfU1lNQk9MKGVpX29wZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODM5MC5oIGIvZHJpdmVycy9uZXQvODM5MC5oCmluZGV4IGY0NGYxMjIuLjQxNGRlNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgzOTAuaAorKysgYi9kcml2ZXJzL25ldC84MzkwLmgKQEAgLTEwNywzNSArMTA3LDE0IEBACiAgKiAgICAgIC0gcmVtb3ZlZCBBTUlHQV9QQ01DSUEgZnJvbSB0aGlzIGxpc3QsIGhhbmRsZWQgYXMgSVNBIGlvIG5vdwogICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NQUMpIHx8ICBcCi0gICAgZGVmaW5lZChDT05GSUdfWk9SUk84MzkwKSB8fCBkZWZpbmVkKENPTkZJR19aT1JSTzgzOTBfTU9EVUxFKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSFlEUkEpIHx8IGRlZmluZWQoQ09ORklHX0hZRFJBX01PRFVMRSkKLSNkZWZpbmUgRUlfU0hJRlQoeCkJKGVpX2xvY2FsLT5yZWdfb2Zmc2V0W3hdKQotI3VuZGVmIGluYgotI3VuZGVmIGluYl9wCi0jdW5kZWYgb3V0YgotI3VuZGVmIG91dGJfcAorI2lmbmRlZiBlaV9pbmIKKyNkZWZpbmUgZWlfaW5iKF9wKQlpbmIoX3ApCisjZGVmaW5lIGVpX291dGIoX3YsX3ApCW91dGIoX3YsX3ApCisjZGVmaW5lIGVpX2luYl9wKF9wKQlpbmJfcChfcCkKKyNkZWZpbmUgZWlfb3V0Yl9wKF92LF9wKSBvdXRiX3AoX3YsX3ApCisjZW5kaWYKIAotI2RlZmluZSBpbmIocG9ydCkgICBpbl84KHBvcnQpCi0jZGVmaW5lIG91dGIodmFsLHBvcnQpICBvdXRfOChwb3J0LHZhbCkKLSNkZWZpbmUgaW5iX3AocG9ydCkgICBpbl84KHBvcnQpCi0jZGVmaW5lIG91dGJfcCh2YWwscG9ydCkgIG91dF84KHBvcnQsdmFsKQotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUk1fRVRIRVJIKSB8fCBkZWZpbmVkKENPTkZJR19BUk1fRVRIRVJIX01PRFVMRSkKLSNkZWZpbmUgRUlfU0hJRlQoeCkJKGVpX2xvY2FsLT5yZWdfb2Zmc2V0W3hdKQotI3VuZGVmIGluYgotI3VuZGVmIGluYl9wCi0jdW5kZWYgb3V0YgotI3VuZGVmIG91dGJfcAotCi0jZGVmaW5lIGluYihfcCkJCXJlYWRiKF9wKQotI2RlZmluZSBvdXRiKF92LF9wKQl3cml0ZWIoX3YsX3ApCi0jZGVmaW5lIGluYl9wKF9wKQlpbmIoX3ApCi0jZGVmaW5lIG91dGJfcChfdixfcCkJb3V0YihfdixfcCkKLQotI2VsaWYgZGVmaW5lZChDT05GSUdfTkVfSDgzMDApIHx8IGRlZmluZWQoQ09ORklHX05FX0g4MzAwX01PRFVMRSkKLSNkZWZpbmUgRUlfU0hJRlQoeCkJKGVpX2xvY2FsLT5yZWdfb2Zmc2V0W3hdKQotI2Vsc2UKKyNpZm5kZWYgRUlfU0hJRlQKICNkZWZpbmUgRUlfU0hJRlQoeCkJKHgpCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggYWI5MmNjNy4uOGFhOGRkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0zMiw3ICszMiw3IEBACiAJdHJpc3RhdGUgIkludGVybWVkaWF0ZSBGdW5jdGlvbmFsIEJsb2NrIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRfQ0xTX0FDVAogCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYW4gaW50ZXJtaWRpYXRlIGRyaXZlciB0aGF0IGFsbG93cyBzaGFyaW5nIG9mCisJICBUaGlzIGlzIGFuIGludGVybWVkaWF0ZSBkcml2ZXIgdGhhdCBhbGxvd3Mgc2hhcmluZyBvZgogCSAgcmVzb3VyY2VzLgogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaWZiLiAgSWYgeW91IHdhbnQgdG8gdXNlIG1vcmUgdGhhbiBvbmUgaWZiCkBAIC0xODgsNiArMTg4LDE3IEBACiAJICBvciBpbnRlcm5hbCBkZXZpY2UuICBJdCBpcyBzYWZlIHRvIHNheSBZIG9yIE0gaGVyZSBldmVuIGlmIHlvdXIKIAkgIGV0aGVybmV0IGNhcmQgbGFjayBNSUkuCiAKK2NvbmZpZyBNQUNCCisJdHJpc3RhdGUgIkF0bWVsIE1BQ0Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBBVlIzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBUaGUgQXRtZWwgTUFDQiBldGhlcm5ldCBpbnRlcmZhY2UgaXMgZm91bmQgb24gbWFueSBBVDMyIGFuZCBBVDkxCisJICBwYXJ0cy4gU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgTUFDQiBjaGlwLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYWNiLgorCiBzb3VyY2UgImRyaXZlcnMvbmV0L2FybS9LY29uZmlnIgogCiBjb25maWcgTUFDRQpAQCAtNDg2LDcgKzQ5Nyw3IEBACiAKIGNvbmZpZyBNSVBTX1NJTV9ORVQKIAl0cmlzdGF0ZSAiTUlQUyBzaW11bGF0b3IgTmV0d29yayBkZXZpY2UgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIE1JUFNfU0lNICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gTUlQU19TSU0gJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhlIE1JUFNORVQgZGV2aWNlIGlzIGEgc2ltcGxlIEV0aGVybmV0IG5ldHdvcmsgZGV2aWNlIHdoaWNoIGlzCiAJICBlbXVsYXRlZCBieSB0aGUgTUlQUyBTaW11bGF0b3IuCkBAIC0xNzY5LDggKzE3ODAsOCBAQAogCSAgaW5mb3JtYXRpb24uCiAKIGNvbmZpZyBMQU5fU0FBOTczMAotCWJvb2wgIlBoaWxpcHMgU0FBOTczMCBFdGhlcm5ldCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBFWFBFUklNRU5UQUwgJiYgTUlQUworCWJvb2wgIlBoaWxpcHMgU0FBOTczMCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kgJiYgTUlQU19BVExBUwogCWhlbHAKIAkgIFRoZSBTQUE5NzMwIGlzIGEgY29tYmluZWQgbXVsdGltZWRpYSBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVyIHVzZWQKIAkgIGluIHRoaW4gY2xpZW50cywgSW50ZXJuZXQgYWNjZXNzIHRlcm1pbmFscywgYW5kIGRpc2tsZXNzCkBAIC0yMTEyLDcgKzIxMjMsNyBAQAogCiBjb25maWcgU0tZMgogCXRyaXN0YXRlICJTeXNLb25uZWN0IFl1a29uMiBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gUENJCiAJc2VsZWN0IENSQzMyCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgR2lnYWJpdCBFdGhlcm5ldCBhZGFwdGVycyBiYXNlZCBvbiB0aGUKQEAgLTIxMjAsOCArMjEzMSw4IEBACiAJICBNYXJ2ZWxsIDg4RTgwMjEvODhFODAyMi84OEU4MDM1Lzg4RTgwMzYvODhFODAzOC84OEU4MDUwLzg4RTgwNTIvCiAJICA4OEU4MDUzLzg4RTgwNTUvODhFODA2MS84OEU4MDYyLCBTeXNLb25uZWN0IFNLLTlFMjFEL1NLLTlTMjEKIAotCSAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3JpZ2luYWwgWXVrb24gY2hpcHNldDogYSBzZXBlcmF0ZQotCSAgZHJpdmVyLCBza2dlLCBpcyBwcm92aWRlZCBmb3IgWXVrb24tYmFzZWQgYWRhcHRlcnMuCisJICBUaGVyZSBpcyBjb21wYW5pb24gZHJpdmVyIGZvciB0aGUgb2xkZXIgTWFydmVsbCBZdWtvbiBhbmQKKwkgIEdlbmVzaXMgYmFzZWQgYWRhcHRlcnM6IHNrZ2UuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNreTIuICBUaGlzIGlzIHJlY29tbWVuZGVkLgpAQCAtMjEzNiw3ICsyMTQ3LDcgQEAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBvcmlnaW5hbCBZdWtvbiBjaGlwc2V0LiBBIGNsZWFuZXIgZHJpdmVyIGlzIAogCSAgYWxzbyBhdmFpbGFibGUgKHNrZ2UpIHdoaWNoIHNlZW1zIHRvIHdvcmsgYmV0dGVyIHRoYW4gdGhpcyBvbmUuCiAKLQkgIFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIG5ld2VyIFl1a29uMiBjaGlwc2V0LiBBIHNlcGVyYXRlCisJICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBuZXdlciBZdWtvbjIgY2hpcHNldC4gQSBzZXBhcmF0ZQogCSAgZHJpdmVyLCBza3kyLCBpcyBwcm92aWRlZCB0byBzdXBwb3J0IFl1a29uMi1iYXNlZCBhZGFwdGVycy4KIAogCSAgVGhlIGZvbGxvd2luZyBhZGFwdGVycyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOgpAQCAtMjI1MSw2ICsyMjYyLDE0IEBACiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgR2lnYWJpdCBFdGhlcm5ldCBjaGlwcyBwcmVzZW50IG9uIHRoZQogCSAgQ2VsbCBQcm9jZXNzb3ItQmFzZWQgQmxhZGVzIGZyb20gSUJNLgogCitjb25maWcgVFNJMTA4X0VUSAorCSAgIHRyaXN0YXRlICJUdW5kcmEgVFNJMTA4IGdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCIKKwkgICBkZXBlbmRzIG9uIFRTSTEwOF9CUklER0UKKwkgICBoZWxwCisJICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyBUdW5kcmEgVFNJMTA4IGdpZ2FiaXQgRXRoZXJuZXQgcG9ydHMuCisJICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICAgICB3aWxsIGJlIGNhbGxlZCB0c2kxMDhfZXRoLgorCiBjb25maWcgR0lBTkZBUgogCXRyaXN0YXRlICJHaWFuZmFyIEV0aGVybmV0IgogCWRlcGVuZHMgb24gODV4eCB8fCA4M3h4IHx8IFBQQ184Nnh4CkBAIC0yMjg4LDcgKzIzMDcsNyBAQAogCiBjb25maWcgVUdFVEhfSEFTX0dJR0EKIAlib29sCi0JZGVwZW5kcyBvbiBVQ0NfR0VUSCAmJiBNUEM4MzZ4CisJZGVwZW5kcyBvbiBVQ0NfR0VUSCAmJiBQUENfTVBDODM2eAogCiBjb25maWcgTVY2NDNYWF9FVEgKIAl0cmlzdGF0ZSAiTVYtNjQzWFggRXRoZXJuZXQgc3VwcG9ydCIKQEAgLTIzNDEsMTAgKzIzNjAsMTEgQEAKIGNvbmZpZyBDSEVMU0lPX1QxCiAgICAgICAgIHRyaXN0YXRlICJDaGVsc2lvIDEwR2IgRXRoZXJuZXQgc3VwcG9ydCIKICAgICAgICAgZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgQ1JDMzIKICAgICAgICAgaGVscAotICAgICAgICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIENoZWxzaW8gTjExMCBhbmQgTjIxMCBtb2RlbHMgMTBHYiBFdGhlcm5ldAotICAgICAgICAgIGNhcmRzLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGFkYXB0ZXIgZmVhdHVyZXMgYW5kIHBlcmZvcm1hbmNlCi0gICAgICAgICAgdHVuaW5nIGlzIGluIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9jeGdiLnR4dD4uCisgICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgQ2hlbHNpbyBnaWdhYml0IGFuZCAxMC1naWdhYml0CisgICAgICAgICAgRXRoZXJuZXQgY2FyZHMuIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYWRhcHRlciBmZWF0dXJlcyBhbmQKKwkgIHBlcmZvcm1hbmNlIHR1bmluZyBpcyBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3hnYi50eHQ+LgogCiAgICAgICAgICAgRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgQ2hlbHNpbyBhbmQgb3VyIHByb2R1Y3RzLCB2aXNpdAogICAgICAgICAgIG91ciB3ZWJzaXRlIGF0IDxodHRwOi8vd3d3LmNoZWxzaW8uY29tPi4KQEAgLTIzNTcsNiArMjM3NywyMSBAQAogICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBjeGdiLgogCitjb25maWcgQ0hFTFNJT19UMV8xRworICAgICAgICBib29sICJDaGVsc2lvIGdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBDSEVMU0lPX1QxCisgICAgICAgIGhlbHAKKyAgICAgICAgICBFbmFibGVzIHN1cHBvcnQgZm9yIENoZWxzaW8ncyBnaWdhYml0IEV0aGVybmV0IFBDSSBjYXJkcy4gIElmIHlvdQorICAgICAgICAgIGFyZSB1c2luZyBvbmx5IDEwRyBjYXJkcyBzYXkgJ04nIGhlcmUuCisKK2NvbmZpZyBDSEVMU0lPX1QxX05BUEkKKwlib29sICJVc2UgUnggUG9sbGluZyAoTkFQSSkiCisJZGVwZW5kcyBvbiBDSEVMU0lPX1QxCisJZGVmYXVsdCB5CisJaGVscAorCSAgTkFQSSBpcyBhIGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKKwkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuCisKIGNvbmZpZyBFSEVBCiAJdHJpc3RhdGUgImVIRUEgRXRoZXJuZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElCTUVCVVMKQEAgLTI0NDcsNiArMjQ4MiwxMiBAQAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBteXJpMTBnZS4KIAorY29uZmlnIE5FVFhFTl9OSUMKKwl0cmlzdGF0ZSAiTmV0WGVuIE11bHRpIHBvcnQgKDEvMTApIEdpZ2FiaXQgRXRoZXJuZXQgTklDIgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciBOZXRYZW4ncyBHaWdhYml0IEV0aGVybmV0IGNhcmQuCisKIGVuZG1lbnUKIAogc291cmNlICJkcml2ZXJzL25ldC90b2tlbnJpbmcvS2NvbmZpZyIKQEAgLTI0NjcsNyArMjUwOCw3IEBACiAKIGNvbmZpZyBSSU9ORVQKIAl0cmlzdGF0ZSAiUmFwaWRJTyBFdGhlcm5ldCBvdmVyIG1lc3NhZ2luZyBkcml2ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgUkFQSURJTworCWRlcGVuZHMgb24gUkFQSURJTwogCiBjb25maWcgUklPTkVUX1RYX1NJWkUKIAlpbnQgIk51bWJlciBvZiBvdXRib3VuZCBxdWV1ZSBlbnRyaWVzIgpAQCAtMjcxNyw2ICsyNzU4LDcgQEAKICAgICAgICBzZWxlY3QgQ1JZUFRPCiAgICAgICAgc2VsZWN0IENSWVBUT19TSEExCiAgICAgICAgc2VsZWN0IENSWVBUT19BUkM0CisgICAgICAgc2VsZWN0IENSWVBUT19FQ0IKICAgICAgICAtLS1oZWxwLS0tCiAgICAgICAgICBTdXBwb3J0IGZvciB0aGUgTVBQRSBFbmNyeXB0aW9uIHByb3RvY29sLCBhcyBlbXBsb3llZCBieSB0aGUKIAkgTWljcm9zb2Z0IFBvaW50LXRvLVBvaW50IFR1bm5lbGluZyBQcm90b2NvbC4KQEAgLTI4MzIsNyArMjg3NCw3IEBACiAJICAiU0NTSSBnZW5lcmljIHN1cHBvcnQiLgogCiBjb25maWcgU0hBUEVSCi0JdHJpc3RhdGUgIlRyYWZmaWMgU2hhcGVyIChFWFBFUklNRU5UQUwpIgorCXRyaXN0YXRlICJUcmFmZmljIFNoYXBlciAoT0JTT0xFVEUpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgVGhlIHRyYWZmaWMgc2hhcGVyIGlzIGEgdmlydHVhbCBuZXR3b3JrIGRldmljZSB0aGF0IGFsbG93cyB5b3UgdG8KQEAgLTI4NDEsOSArMjg4Myw5IEBACiAJICB0aGVzZSB2aXJ0dWFsIGRldmljZXMuIFNlZQogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NoYXBlci50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi0JICBBbiBhbHRlcm5hdGl2ZSB0byB0aGlzIHRyYWZmaWMgc2hhcGVyIGlzIHRoZSBleHBlcmltZW50YWwKLQkgIENsYXNzLUJhc2VkIFF1ZXVpbmcgKENCUSkgc2NoZWR1bGluZyBzdXBwb3J0IHdoaWNoIHlvdSBnZXQgaWYgeW91Ci0JICBzYXkgWSB0byAiUW9TIGFuZC9vciBmYWlyIHF1ZXVpbmciIGFib3ZlLgorCSAgQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyB0cmFmZmljIHNoYXBlciBhcmUgdHJhZmZpYyBzY2hlZHVsZXJzIHdoaWNoCisJICB5b3UnbGwgZ2V0IGlmIHlvdSBzYXkgWSB0byAiUW9TIGFuZC9vciBmYWlyIHF1ZXVpbmciIGluCisJICAiTmV0d29ya2luZyBvcHRpb25zIi4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2hhcGVyLiAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggZjI3MGJjNC4uNGMwZDRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTgyLDcgKzgyLDcgQEAKIG9iai0kKENPTkZJR19ORVQpICs9IFNwYWNlLm8gbG9vcGJhY2subwogb2JqLSQoQ09ORklHX1NFRVE4MDA1KSArPSBzZWVxODAwNS5vCiBvYmotJChDT05GSUdfTkVUX1NCMTAwMCkgKz0gc2IxMDAwLm8KLW9iai0kKENPTkZJR19NQUM4MzkwKSArPSBtYWM4MzkwLm8gODM5MC5vCitvYmotJChDT05GSUdfTUFDODM5MCkgKz0gbWFjODM5MC5vCiBvYmotJChDT05GSUdfQVBORSkgKz0gYXBuZS5vIDgzOTAubwogb2JqLSQoQ09ORklHX1BDTUNJQV9QQ05FVCkgKz0gODM5MC5vCiBvYmotJChDT05GSUdfU0hBUEVSKSArPSBzaGFwZXIubwpAQCAtOTAsNyArOTAsNiBAQAogb2JqLSQoQ09ORklHX1NNQzkxOTQpICs9IHNtYzkxOTQubwogb2JqLSQoQ09ORklHX0ZFQykgKz0gZmVjLm8KIG9iai0kKENPTkZJR182ODM2MF9FTkVUKSArPSA2ODM2MGVuZXQubwotb2JqLSQoQ09ORklHX0FSTV9FVEhFUkgpICs9IDgzOTAubwogb2JqLSQoQ09ORklHX1dEODB4MykgKz0gd2QubyA4MzkwLm8KIG9iai0kKENPTkZJR19FTDIpICs9IDNjNTAzLm8gODM5MC5vCiBvYmotJChDT05GSUdfTkUyMDAwKSArPSBuZS5vIDgzOTAubwpAQCAtMTA3LDggKzEwNiw5IEBACiBvYmotJChDT05GSUdfTkVUX1NCMTI1MF9NQUMpICs9IHNiMTI1MC1tYWMubwogb2JqLSQoQ09ORklHX0I0NCkgKz0gYjQ0Lm8KIG9iai0kKENPTkZJR19GT1JDRURFVEgpICs9IGZvcmNlZGV0aC5vCi1vYmotJChDT05GSUdfTkVfSDgzMDApICs9IG5lLWg4MzAwLm8gODM5MC5vCitvYmotJChDT05GSUdfTkVfSDgzMDApICs9IG5lLWg4MzAwLm8KIAorb2JqLSQoQ09ORklHX1RTSTEwOF9FVEgpICs9IHRzaTEwOF9ldGgubwogb2JqLSQoQ09ORklHX01WNjQzWFhfRVRIKSArPSBtdjY0M3h4X2V0aC5vCiBvYmotJChDT05GSUdfUUxBM1hYWCkgKz0gcWxhM3h4eC5vCiAKQEAgLTE2NSw3ICsxNjUsNyBAQAogb2JqLSQoQ09ORklHX0xQNDg2RSkgKz0gbHA0ODZlLm8KIAogb2JqLSQoQ09ORklHX0VUSDE2SSkgKz0gZXRoMTZpLm8KLW9iai0kKENPTkZJR19aT1JSTzgzOTApICs9IHpvcnJvODM5MC5vIDgzOTAubworb2JqLSQoQ09ORklHX1pPUlJPODM5MCkgKz0gem9ycm84MzkwLm8KIG9iai0kKENPTkZJR19IUExBTkNFKSArPSBocGxhbmNlLm8gNzk5MC5vCiBvYmotJChDT05GSUdfTVZNRTE0N19ORVQpICs9IG12bWUxNDcubyA3OTkwLm8KIG9iai0kKENPTkZJR19FUVVBTElaRVIpICs9IGVxbC5vCkBAIC0xNzgsNyArMTc4LDcgQEAKIG9iai0kKENPTkZJR19BVEFSSV9CSU9ORVQpICs9IGF0YXJpX2Jpb25ldC5vCiBvYmotJChDT05GSUdfQVRBUklfUEFNU05FVCkgKz0gYXRhcmlfcGFtc25ldC5vCiBvYmotJChDT05GSUdfQTIwNjUpICs9IGEyMDY1Lm8KLW9iai0kKENPTkZJR19IWURSQSkgKz0gaHlkcmEubyA4MzkwLm8KK29iai0kKENPTkZJR19IWURSQSkgKz0gaHlkcmEubwogb2JqLSQoQ09ORklHX0FSSUFETkUpICs9IGFyaWFkbmUubwogb2JqLSQoQ09ORklHX0NTODl4MCkgKz0gY3M4OXgwLm8KIG9iai0kKENPTkZJR19NQUNTT05JQykgKz0gbWFjc29uaWMubwpAQCAtMTk3LDYgKzE5Nyw4IEBACiBvYmotJChDT05GSUdfRE05MDAwKSArPSBkbTkwMDAubwogb2JqLSQoQ09ORklHX0ZFQ184WFgpICs9IGZlY184eHgvCiAKK29iai0kKENPTkZJR19NQUNCKSArPSBtYWNiLm8KKwogb2JqLSQoQ09ORklHX0FSTSkgKz0gYXJtLwogb2JqLSQoQ09ORklHX0RFVl9BUFBMRVRBTEspICs9IGFwcGxldGFsay8KIG9iai0kKENPTkZJR19UUikgKz0gdG9rZW5yaW5nLwpAQCAtMjE0LDMgKzIxNiw0IEBACiAKIG9iai0kKENPTkZJR19GU19FTkVUKSArPSBmc19lbmV0LwogCitvYmotJChDT05GSUdfTkVUWEVOX05JQykgKz0gbmV0eGVuLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvU3BhY2UuYyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKaW5kZXggYTY3ZjVlZi4uNjAyZWQzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvU3BhY2UuYworKysgYi9kcml2ZXJzL25ldC9TcGFjZS5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L2RpdmVydC5oPgogCiAvKiBBIHVuaWZpZWQgZXRoZXJuZXQgZGV2aWNlIHByb2JlLiAgVGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gaGF2ZSBldmVyeQogICAgZXRoZXJuZXQgYWRhcHRvciBoYXZlIHRoZSBuYW1lICJldGhbMDEyMy4uLl0iLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWMzMjAwLmMgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwppbmRleCAwZGNhOGJiLi5jMDFmODdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hYzMyMDAuYworKysgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwpAQCAtNDA1LDcgKzQwNSw3IEBACiAJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKIH0KIAotdm9pZAordm9pZCBfX2V4aXQKIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHRoaXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYW1kODExMWUuYyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKaW5kZXggZWY2NWU1OS4uMTg4OTZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYW1kODExMWUuYworKysgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCkBAIC0xNDkwLDMyICsxNDkwLDcgQEAKIAlidWZbMTJdID0gcmVhZGwobW1pbyArIFNUQVQwKTsKIH0KIAotLyoKLWFtZDgxMTFlIGNyYyBnZW5lcmF0b3IgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIGtlcm5lbAotZXRoZXJfY3JjKCkgZnVuY3Rpb24uCi0qLwotc3RhdGljIGludCBhbWQ4MTExZV9ldGhlcl9jcmMoaW50IGxlbiwgY2hhciogbWFjX2FkZHIpCi17Ci0JaW50IGksYnl0ZTsKLQl1bnNpZ25lZCBjaGFyIG9jdGV0OwotCXUzMiBjcmM9IElOSVRDUkM7CiAKLQlmb3IoYnl0ZT0wOyBieXRlIDwgbGVuOyBieXRlKyspewotCQlvY3RldCA9IG1hY19hZGRyW2J5dGVdOwotCQlmb3IoIGk9MDtpIDwgODsgaSsrKXsKLQkJCS8qSWYgdGhlIG5leHQgYml0IGZvcm0gdGhlIGlucHV0IHN0cmVhbSBpcyAxLHN1YnRyYWN0CQkJCSB0aGUgZGl2aXNvciAoQ1JDMzIpIGZyb20gdGhlIGRpdmlkZW5kKGNyYykuKi8KLQkJCWlmKCAob2N0ZXQgJiAweDEpIF4gKGNyYyAmIDB4MSkgKXsKLQkJCQljcmMgPj49IDE7Ci0JCQkJY3JjIF49IENSQzMyOwotCQkJfQotCQkJZWxzZQotCQkJCWNyYyA+Pj0gMTsKLQotCQkJb2N0ZXQgPj49IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNyYzsKLX0KIC8qCiBUaGlzIGZ1bmN0aW9uIHNldHMgcHJvbWlzY3VvcyBtb2RlLCBhbGwtbXVsdGkgbW9kZSBvciB0aGUgbXVsdGljYXN0IGFkZHJlc3MKIGxpc3QgdG8gdGhlIGRldmljZS4KQEAgLTE1NTYsNyArMTUzMSw3IEBACiAJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKIAlmb3IgKGkgPSAwLCBtY19wdHIgPSBkZXYtPm1jX2xpc3Q7IG1jX3B0ciAmJiBpIDwgZGV2LT5tY19jb3VudDsKIAkJICAgICBpKyssIG1jX3B0ciA9IG1jX3B0ci0+bmV4dCkgewotCQliaXRfbnVtID0gKCBhbWQ4MTExZV9ldGhlcl9jcmMoRVRIX0FMRU4sbWNfcHRyLT5kbWlfYWRkcikJCQkJCQkJID4+IDI2ICkgJiAweDNmOworCQliaXRfbnVtID0gKGV0aGVyX2NyY19sZShFVEhfQUxFTiwgbWNfcHRyLT5kbWlfYWRkcikgPj4gMjYpICYgMHgzZjsKIAkJbWNfZmlsdGVyW2JpdF9udW0gPj4gNV0gfD0gMSA8PCAoYml0X251bSAmIDMxKTsKIAl9CiAJYW1kODExMWVfd3JpdGVxKCoodTY0KiltY19maWx0ZXIsbHAtPm1taW8rIExBRFJGKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmggYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5oCmluZGV4IDc3MjdkMzIuLjIwMDc1MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmgKKysrIGIvZHJpdmVycy9uZXQvYW1kODExMWUuaApAQCAtNjUxLDEwICs2NTEsNiBAQAogLyogZHJpdmVyIGlvY3RsIHBhcmFtZXRlcnMgKi8KICNkZWZpbmUgQU1EODExMUVfUkVHX0RVTVBfTEVOCSAxMypzaXplb2YodTMyKQogCi0vKiBjcmMgZ2VuZXJhdG9yIGNvbnN0YW50cyAqLwotI2RlZmluZSBDUkMzMiAweGVkYjg4MzIwCi0jZGVmaW5lIElOSVRDUkMgMHhGRkZGRkZGRgotCiAvKiBhbWQ4MTExZSBkZXNyaXB0b3IgZm9ybWF0ICovCiAKIHN0cnVjdCBhbWQ4MTExZV90eF9kcnsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwbmUuYyBiL2RyaXZlcnMvbmV0L2FwbmUuYwppbmRleCA5MTY0ZDhjLi45NTQxOTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcG5lLmMKKysrIGIvZHJpdmVycy9uZXQvYXBuZS5jCkBAIC0zMTEsOSArMzExLDEwIEBACiAjZW5kaWYKIAogICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworICAgIGRldi0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOwogCiAgICAgLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBpID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhcG5lX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBkZXYpOworICAgIGkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgYXBuZV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBEUlZfTkFNRSwgZGV2KTsKICAgICBpZiAoaSkgcmV0dXJuIGk7CiAKICAgICBmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CkBAIC01NjgsNyArNTY5LDcgQEAKICNpZmRlZiBNT0RVTEUKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYXBuZV9kZXY7CiAKLWludCBpbml0X21vZHVsZSh2b2lkKQoraW50IF9faW5pdCBpbml0X21vZHVsZSh2b2lkKQogewogCWFwbmVfZGV2ID0gYXBuZV9wcm9iZSgtMSk7CiAJaWYgKElTX0VSUihhcG5lX2RldikpCkBAIC01NzYsNyArNTc3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX25ldGRldihhcG5lX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jCmluZGV4IGNjMWEyN2UuLmRiYTVlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYwpAQCAtMTA0MSw3ICsxMDQxLDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3ZvaWQgX19leGl0IGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoY29wc19kZXYpOwogCWNsZWFudXBfY2FyZChjb3BzX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuYyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCmluZGV4IGI5ODU5MmEuLmYyMmU0NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCkBAIC0xODYsNyArMTg2LDcgQEAKICAqLwogc3RhdGljIGludCBpcGRkcF9jcmVhdGUoc3RydWN0IGlwZGRwX3JvdXRlICpuZXdfcnQpCiB7Ci0gICAgICAgIHN0cnVjdCBpcGRkcF9yb3V0ZSAqcnQgPShzdHJ1Y3QgaXBkZHBfcm91dGUqKSBrbWFsbG9jKHNpemVvZigqcnQpLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgc3RydWN0IGlwZGRwX3JvdXRlICpydCA9IGttYWxsb2Moc2l6ZW9mKCpydCksIEdGUF9LRVJORUwpOwogCiAgICAgICAgIGlmIChydCA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAuYwppbmRleCAwZGM3MGM3Li5hYTlkZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAuYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAuYwpAQCAtMzM3LDEzICszMzcsMTYgQEAKIAl9CiB9CiAKLSNpZmRlZiBNT0RVTEUKLQorI2lmIGRlZmluZWQoQ09ORklHX0FSQ05FVF9DT00yMDAyMF9QQ0lfTU9EVUxFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQVJDTkVUX0NPTTIwMDIwX0lTQV9NT0RVTEUpCiBFWFBPUlRfU1lNQk9MKGNvbTIwMDIwX2NoZWNrKTsKIEVYUE9SVF9TWU1CT0woY29tMjAwMjBfZm91bmQpOworI2VuZGlmCiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAorI2lmZGVmIE1PRFVMRQorCiBpbnQgaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlCVUdMVkwoRF9OT1JNQUwpIHByaW50ayhWRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMgYi9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jCmluZGV4IGI1NGI4NTcuLmZhZGExNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYwpAQCAtNDEsOSArNDEsNiBAQAogI2RlZmluZSBEUlZfTkFNRQkiYXQ5MV9ldGhlciIKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICphdDkxX2RldjsKLQotc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGNoZWNrX3RpbWVyOwogI2RlZmluZSBMSU5LX1BPTExfSU5URVJWQUwJKEhaKQogCiAvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KQEAgLTE0Niw3ICsxNDMsNyBAQAogICovCiBzdGF0aWMgdm9pZCB1cGRhdGVfbGlua3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzaWxlbnQpCiB7Ci0Jc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGF0OTFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGludCBibXNyLCBibWNyLCBscGEsIG1hY19jZmc7CiAJdW5zaWduZWQgaW50IHNwZWVkLCBkdXBsZXg7CiAKQEAgLTE5OSw3ICsxOTYsNyBAQAogc3RhdGljIGlycXJldHVybl90IGF0OTFldGhlcl9waHlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKLQlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IChzdHJ1Y3QgYXQ5MV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgaW50IHBoeTsKIAogCS8qCkBAIC0yNDIsNyArMjM5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZW5hYmxlX3BoeWlycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgZHNpbnRyLCBpcnFfbnVtYmVyOwogCWludCBzdGF0dXM7CiAKQEAgLTI1Miw4ICsyNDksNyBAQAogCQkgKiBQSFkgZG9lc24ndCBoYXZlIGFuIElSUSBwaW4gKFJUTDgyMDEsIERQODM4NDcsIEFDMTAxTCksCiAJCSAqIG9yIGJvYXJkIGRvZXMgbm90IGhhdmUgaXQgY29ubmVjdGVkLgogCQkgKi8KLQkJY2hlY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBMSU5LX1BPTExfSU5URVJWQUw7Ci0JCWFkZF90aW1lcigmY2hlY2tfdGltZXIpOworCQltb2RfdGltZXIoJmxwLT5jaGVja190aW1lciwgamlmZmllcyArIExJTktfUE9MTF9JTlRFUlZBTCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI5NCwxMyArMjkwLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGRpc2FibGVfcGh5aXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGF0OTFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGludCBkc2ludHI7CiAJdW5zaWduZWQgaW50IGlycV9udW1iZXI7CiAKIAlpcnFfbnVtYmVyID0gbHAtPmJvYXJkX2RhdGEucGh5X2lycV9waW47CiAJaWYgKCFpcnFfbnVtYmVyKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZjaGVja190aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZscC0+Y2hlY2tfdGltZXIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNDAsNyArMzM2LDcgQEAKICNpZiAwCiBzdGF0aWMgdm9pZCByZXNldF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IChzdHJ1Y3QgYXQ5MV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgaW50IGJtY3I7CiAKIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CkBAIC0zNjIsMTMgKzM1OCwxMyBAQAogc3RhdGljIHZvaWQgYXQ5MWV0aGVyX2NoZWNrX2xpbmsodW5zaWduZWQgbG9uZyBkZXZfaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJZW5hYmxlX21kaSgpOwogCXVwZGF0ZV9saW5rc3BlZWQoZGV2LCAxKTsKIAlkaXNhYmxlX21kaSgpOwogCi0JY2hlY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBMSU5LX1BPTExfSU5URVJWQUw7Ci0JYWRkX3RpbWVyKCZjaGVja190aW1lcik7CisJbW9kX3RpbWVyKCZscC0+Y2hlY2tfdGltZXIsIGppZmZpZXMgKyBMSU5LX1BPTExfSU5URVJWQUwpOwogfQogCiAvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIEFERFJFU1MgTUFOQUdFTUVOVCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KQEAgLTU5MCw3ICs1ODYsNyBAQAogCiBzdGF0aWMgaW50IGF0OTFldGhlcl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7Ci0Jc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGF0OTFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByZXQ7CiAKIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CkBAIC02MTEsNyArNjA3LDcgQEAKIAogc3RhdGljIGludCBhdDkxZXRoZXJfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewotCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwpAQCAtNjI3LDcgKzYyMyw3IEBACiAKIHN0YXRpYyBpbnQgYXQ5MWV0aGVyX253YXlyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwpAQCAtNjU4LDcgKzY1NCw3IEBACiAKIHN0YXRpYyBpbnQgYXQ5MWV0aGVyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7Ci0Jc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGF0OTFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByZXM7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKQEAgLTY4MCw3ICs2NzYsNyBAQAogICovCiBzdGF0aWMgdm9pZCBhdDkxZXRoZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IChzdHJ1Y3QgYXQ5MV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHJlY3ZfZGVzY19idWZzICpkbGlzdCwgKmRsaXN0X3BoeXM7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBjdGw7CkBAIC03MTIsNyArNzA4LDcgQEAKICAqLwogc3RhdGljIGludCBhdDkxZXRoZXJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGN0bDsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKQEAgLTc1Miw3ICs3NDgsNyBAQAogICovCiBzdGF0aWMgaW50IGF0OTFldGhlcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGN0bDsKIAogCS8qIERpc2FibGUgUmVjZWl2ZXIgYW5kIFRyYW5zbWl0dGVyICovCkBAIC03NzksNyArNzc1LDcgQEAKICAqLwogc3RhdGljIGludCBhdDkxZXRoZXJfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IChzdHJ1Y3QgYXQ5MV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAoYXQ5MV9lbWFjX3JlYWQoQVQ5MV9FTUFDX1RTUikgJiBBVDkxX0VNQUNfVFNSX0JOUSkgewogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CkBAIC04MTEsNyArODA3LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdDkxZXRoZXJfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IChzdHJ1Y3QgYXQ5MV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGFsZSwgbGVuZXJyLCBzZXFlLCBsY29sLCBlY29sOwogCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewpAQCAtODQ3LDcgKzg0Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGF0OTFldGhlcl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcmVjdl9kZXNjX2J1ZnMgKmRsaXN0OwogCXVuc2lnbmVkIGNoYXIgKnBfcmVjdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtODU3LDE0ICs4NTMsMTMgQEAKIAl3aGlsZSAoZGxpc3QtPmRlc2NyaXB0b3JzW2xwLT5yeEJ1ZmZJbmRleF0uYWRkciAmIEVNQUNfREVTQ19ET05FKSB7CiAJCXBfcmVjdiA9IGRsaXN0LT5yZWN2X2J1ZltscC0+cnhCdWZmSW5kZXhdOwogCQlwa3RsZW4gPSBkbGlzdC0+ZGVzY3JpcHRvcnNbbHAtPnJ4QnVmZkluZGV4XS5zaXplICYgMHg3ZmY7CS8qIExlbmd0aCBvZiBmcmFtZSBpbmNsdWRpbmcgRkNTICovCi0JCXNrYiA9IGFsbG9jX3NrYihwa3RsZW4gKyAyLCBHRlBfQVRPTUlDKTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RsZW4gKyAyKTsKIAkJaWYgKHNrYiAhPSBOVUxMKSB7CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwogCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RsZW4pLCBwX3JlY3YsIHBrdGxlbik7CiAKIAkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLQkJCXNrYi0+bGVuID0gcGt0bGVuOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CiAJCQluZXRpZl9yeChza2IpOwpAQCAtODkxLDcgKzg4Niw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MWV0aGVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7Ci0Jc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGF0OTFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgaW50c3RhdHVzLCBjdGw7CiAKIAkvKiBNQUMgSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlciBpbmRpY2F0ZXMgd2hhdCBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nLgpAQCAtOTI3LDYgKzkyMiwxNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBhdDkxZXRoZXJfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlhdDkxZXRoZXJfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKyNlbmRpZgorCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlCiAgKi8KQEAgLTkzOSw5ICs5NDUsNiBAQAogCXVuc2lnbmVkIGludCB2YWw7CiAJaW50IHJlczsKIAotCWlmIChhdDkxX2RldikJCQkvKiBhbHJlYWR5IGluaXRpYWxpemVkICovCi0JCXJldHVybiAwOwotCiAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhdDkxX3ByaXZhdGUpKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC05NTcsNyArOTYwLDcgQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIERNQSBSZWNlaXZlIGRlc2NyaXB0b3JzICovCi0JbHAgPSAoc3RydWN0IGF0OTFfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CiAJbHAtPmRsaXN0ID0gKHN0cnVjdCByZWN2X2Rlc2NfYnVmcyAqKSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2l6ZW9mKHN0cnVjdCByZWN2X2Rlc2NfYnVmcyksIChkbWFfYWRkcl90ICopICZscC0+ZGxpc3RfcGh5cywgR0ZQX0tFUk5FTCk7CiAJaWYgKGxwLT5kbGlzdCA9PSBOVUxMKSB7CiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwpAQCAtOTc5LDYgKzk4Miw5IEBACiAJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBzZXRfbWFjX2FkZHJlc3M7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZhdDkxZXRoZXJfZXRodG9vbF9vcHM7CiAJZGV2LT5kb19pb2N0bCA9IGF0OTFldGhlcl9pb2N0bDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gYXQ5MWV0aGVyX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgogCiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIApAQCAtMTAyNCw3ICsxMDMwLDYgQEAKIAkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2l6ZW9mKHN0cnVjdCByZWN2X2Rlc2NfYnVmcyksIGxwLT5kbGlzdCwgKGRtYV9hZGRyX3QpbHAtPmRsaXN0X3BoeXMpOwogCQlyZXR1cm4gcmVzOwogCX0KLQlhdDkxX2RldiA9IGRldjsKIAogCS8qIERldGVybWluZSBjdXJyZW50IGxpbmsgc3BlZWQgKi8KIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CkBAIC0xMDM2LDkgKzEwNDEsOSBAQAogCiAJLyogSWYgYm9hcmQgaGFzIG5vIFBIWSBJUlEsIHVzZSBhIHRpbWVyIHRvIHBvbGwgdGhlIFBIWSAqLwogCWlmICghbHAtPmJvYXJkX2RhdGEucGh5X2lycV9waW4pIHsKLQkJaW5pdF90aW1lcigmY2hlY2tfdGltZXIpOwotCQljaGVja190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OwotCQljaGVja190aW1lci5mdW5jdGlvbiA9IGF0OTFldGhlcl9jaGVja19saW5rOworCQlpbml0X3RpbWVyKCZscC0+Y2hlY2tfdGltZXIpOworCQlscC0+Y2hlY2tfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwkJbHAtPmNoZWNrX3RpbWVyLmZ1bmN0aW9uID0gYXQ5MWV0aGVyX2NoZWNrX2xpbms7CiAJfQogCiAJLyogRGlzcGxheSBldGhlcm5ldCBiYW5uZXIgKi8KQEAgLTExMTUsMTUgKzExMjAsMTYgQEAKIAogc3RhdGljIGludCBfX2RldmV4aXQgYXQ5MWV0aGVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgYXQ5MV9kZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXVucmVnaXN0ZXJfbmV0ZGV2KGF0OTFfZGV2KTsKLQlmcmVlX2lycShhdDkxX2Rldi0+aXJxLCBhdDkxX2Rldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzaXplb2Yoc3RydWN0IHJlY3ZfZGVzY19idWZzKSwgbHAtPmRsaXN0LCAoZG1hX2FkZHJfdClscC0+ZGxpc3RfcGh5cyk7CiAJY2xrX3B1dChscC0+ZXRoZXJfY2xrKTsKIAotCWZyZWVfbmV0ZGV2KGF0OTFfZGV2KTsKLQlhdDkxX2RldiA9IE5VTEw7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzMSw4ICsxMTM3LDggQEAKIAogc3RhdGljIGludCBhdDkxZXRoZXJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKLQlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IChzdHJ1Y3QgYXQ5MV9wcml2YXRlICopIGF0OTFfZGV2LT5wcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlpbnQgcGh5X2lycSA9IGxwLT5ib2FyZF9kYXRhLnBoeV9pcnFfcGluOwogCiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0X2RldikpIHsKQEAgLTExNDksOCArMTE1NSw4IEBACiAKIHN0YXRpYyBpbnQgYXQ5MWV0aGVyX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgYXQ5MV9kZXYtPnByaXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCWludCBwaHlfaXJxID0gbHAtPmJvYXJkX2RhdGEucGh5X2lycV9waW47CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZXRfZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuaCBiL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmgKaW5kZXggZDFlNzJlMC4uYjZiNjY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuaAorKysgYi9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5oCkBAIC04Nyw2ICs4Nyw3IEBACiAJc3BpbmxvY2tfdCBsb2NrOwkJCS8qIGxvY2sgZm9yIE1ESSBpbnRlcmZhY2UgKi8KIAlzaG9ydCBwaHlfbWVkaWE7CQkJLyogbWVkaWEgaW50ZXJmYWNlIHR5cGUgKi8KIAl1bnNpZ25lZCBzaG9ydCBwaHlfYWRkcmVzczsJCS8qIDUtYml0IE1ESSBhZGRyZXNzIG9mIFBIWSAoMC4uMzEpICovCisJc3RydWN0IHRpbWVyX2xpc3QgY2hlY2tfdGltZXI7CQkvKiBQb2xsIGxpbmsgc3RhdHVzICovCiAKIAkvKiBUcmFuc21pdCAqLwogCXN0cnVjdCBza19idWZmICpza2I7CQkJLyogaG9sZHMgc2tiIHVudGlsIHhtaXQgaW50ZXJydXB0IGNvbXBsZXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYyBiL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKaW5kZXggMTI3NTYxYy4uOGViZDY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCkBAIC0xOTMsMTIgKzE5Myw5IEBACiBzdGF0aWMgaW50IGVwOTN4eF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKIHsKIAlzdHJ1Y3QgZXA5M3h4X3ByaXYgKmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgdGFpbF9vZmZzZXQ7CiAJaW50IHJ4X2RvbmU7CiAJaW50IHByb2Nlc3NlZDsKIAotCXRhaWxfb2Zmc2V0ID0gcmRsKGVwLCBSRUdfUlhTVFNRQ1VSQUREKSAtIGVwLT5kZXNjc19kbWFfYWRkcjsKLQogCXJ4X2RvbmUgPSAwOwogCXByb2Nlc3NlZCA9IDA7CiAJd2hpbGUgKCpidWRnZXQgPiAwKSB7CkBAIC0yMTEsMzYgKzIwOCwyOCBAQAogCiAJCWVudHJ5ID0gZXAtPnJ4X3BvaW50ZXI7CiAJCXJzdGF0ID0gZXAtPmRlc2NzLT5yc3RhdCArIGVudHJ5OwotCQlpZiAoKHZvaWQgKilyc3RhdCAtICh2b2lkICopZXAtPmRlc2NzID09IHRhaWxfb2Zmc2V0KSB7CisKKwkJcnN0YXQwID0gcnN0YXQtPnJzdGF0MDsKKwkJcnN0YXQxID0gcnN0YXQtPnJzdGF0MTsKKwkJaWYgKCEocnN0YXQwICYgUlNUQVQwX1JGUCkgfHwgIShyc3RhdDEgJiBSU1RBVDFfUkZQKSkgewogCQkJcnhfZG9uZSA9IDE7CiAJCQlicmVhazsKIAkJfQogCi0JCXJzdGF0MCA9IHJzdGF0LT5yc3RhdDA7Ci0JCXJzdGF0MSA9IHJzdGF0LT5yc3RhdDE7CiAJCXJzdGF0LT5yc3RhdDAgPSAwOwogCQlyc3RhdC0+cnN0YXQxID0gMDsKIAotCQlpZiAoIShyc3RhdDAgJiBSU1RBVDBfUkZQKSkKLQkJCXByaW50ayhLRVJOX0NSSVQgImVwOTN4eF9yeDogYnVmZmVyIG5vdCBkb25lICIKLQkJCQkJICIgJS44eCAlLjh4XG4iLCByc3RhdDAsIHJzdGF0MSk7CiAJCWlmICghKHJzdGF0MCAmIFJTVEFUMF9FT0YpKQogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiZXA5M3h4X3J4OiBub3QgZW5kLW9mLWZyYW1lICIKIAkJCQkJICIgJS44eCAlLjh4XG4iLCByc3RhdDAsIHJzdGF0MSk7CiAJCWlmICghKHJzdGF0MCAmIFJTVEFUMF9FT0IpKQogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiZXA5M3h4X3J4OiBub3QgZW5kLW9mLWJ1ZmZlciAiCiAJCQkJCSAiICUuOHggJS44eFxuIiwgcnN0YXQwLCByc3RhdDEpOwotCQlpZiAoIShyc3RhdDEgJiBSU1RBVDFfUkZQKSkKLQkJCXByaW50ayhLRVJOX0NSSVQgImVwOTN4eF9yeDogYnVmZmVyMSBub3QgZG9uZSAiCi0JCQkJCSAiICUuOHggJS44eFxuIiwgcnN0YXQwLCByc3RhdDEpOwogCQlpZiAoKHJzdGF0MSAmIFJTVEFUMV9CVUZGRVJfSU5ERVgpID4+IDE2ICE9IGVudHJ5KQogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiZXA5M3h4X3J4OiBlbnRyeSBtaXNtYXRjaCAiCiAJCQkJCSAiICUuOHggJS44eFxuIiwgcnN0YXQwLCByc3RhdDEpOwogCiAJCWlmICghKHJzdGF0MCAmIFJTVEFUMF9SV0UpKSB7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgImVwOTN4eF9yeDogcmVjZWl2ZSBlcnJvciAiCi0JCQkJCSAiICUuOHggJS44eFxuIiwgcnN0YXQwLCByc3RhdDEpOwotCiAJCQllcC0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlpZiAocnN0YXQwICYgUlNUQVQwX09FKQogCQkJCWVwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwpAQCAtMzAxLDEzICsyOTAsOCBAQAogCiBzdGF0aWMgaW50IGVwOTN4eF9oYXZlX21vcmVfcngoc3RydWN0IGVwOTN4eF9wcml2ICplcCkKIHsKLQlzdHJ1Y3QgZXA5M3h4X3JzdGF0ICpyc3RhdDsKLQlpbnQgdGFpbF9vZmZzZXQ7Ci0KLQlyc3RhdCA9IGVwLT5kZXNjcy0+cnN0YXQgKyBlcC0+cnhfcG9pbnRlcjsKLQl0YWlsX29mZnNldCA9IHJkbChlcCwgUkVHX1JYU1RTUUNVUkFERCkgLSBlcC0+ZGVzY3NfZG1hX2FkZHI7Ci0KLQlyZXR1cm4gISgodm9pZCAqKXJzdGF0IC0gKHZvaWQgKillcC0+ZGVzY3MgPT0gdGFpbF9vZmZzZXQpOworCXN0cnVjdCBlcDkzeHhfcnN0YXQgKnJzdGF0ID0gZXAtPmRlc2NzLT5yc3RhdCArIGVwLT5yeF9wb2ludGVyOworCXJldHVybiAhISgocnN0YXQtPnJzdGF0MCAmIFJTVEFUMF9SRlApICYmIChyc3RhdC0+cnN0YXQxICYgUlNUQVQxX1JGUCkpOwogfQogCiBzdGF0aWMgaW50IGVwOTN4eF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQpAQCAtMzQ3LDcgKzMzMSw3IEBACiAJc3RydWN0IGVwOTN4eF9wcml2ICplcCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGVudHJ5OwogCi0JaWYgKHVubGlrZWx5KHNrYi0+bGVuKSA+IE1BWF9QS1RfU0laRSkgeworCWlmICh1bmxpa2VseShza2ItPmxlbiA+IE1BWF9QS1RfU0laRSkpIHsKIAkJZXAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtMzc5LDEwICszNjMsOCBAQAogc3RhdGljIHZvaWQgZXA5M3h4X3R4X2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGVwOTN4eF9wcml2ICplcCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHRhaWxfb2Zmc2V0OwogCWludCB3YWtlOwogCi0JdGFpbF9vZmZzZXQgPSByZGwoZXAsIFJFR19UWFNUU1FDVVJBREQpIC0gZXAtPmRlc2NzX2RtYV9hZGRyOwogCXdha2UgPSAwOwogCiAJc3Bpbl9sb2NrKCZlcC0+dHhfcGVuZGluZ19sb2NrKTsKQEAgLTM5MywxNSArMzc1LDEzIEBACiAKIAkJZW50cnkgPSBlcC0+dHhfY2xlYW5fcG9pbnRlcjsKIAkJdHN0YXQgPSBlcC0+ZGVzY3MtPnRzdGF0ICsgZW50cnk7Ci0JCWlmICgodm9pZCAqKXRzdGF0IC0gKHZvaWQgKillcC0+ZGVzY3MgPT0gdGFpbF9vZmZzZXQpCi0JCQlicmVhazsKIAogCQl0c3RhdDAgPSB0c3RhdC0+dHN0YXQwOworCQlpZiAoISh0c3RhdDAgJiBUU1RBVDBfVFhGUCkpCisJCQlicmVhazsKKwogCQl0c3RhdC0+dHN0YXQwID0gMDsKIAotCQlpZiAoISh0c3RhdDAgJiBUU1RBVDBfVFhGUCkpCi0JCQlwcmludGsoS0VSTl9DUklUICJlcDkzeHhfdHhfY29tcGxldGU6IGJ1ZmZlciBub3QgZG9uZSAiCi0JCQkJCSAiICUuOHhcbiIsIHRzdGF0MCk7CiAJCWlmICh0c3RhdDAgJiBUU1RBVDBfRkEpCiAJCQlwcmludGsoS0VSTl9DUklUICJlcDkzeHhfdHhfY29tcGxldGU6IGZyYW1lIGFib3J0ZWQgIgogCQkJCQkgIiAlLjh4XG4iLCB0c3RhdDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5jIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5jCmluZGV4IGYzNDc4YTMuLmQ2ZGEzY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIxLmMKQEAgLTI1NCw3ICsyNTQsNyBAQAogCX0gd2hpbGUgKHRoaXNsZW4pOwogfQogCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIGV0aGVyMV9yYW10ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYnl0ZSkKIHsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBrbWFsbG9jIChCVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CkBAIC0zMDgsNyArMzA4LDcgQEAKIAlyZXR1cm4gQlVTXzE2OwogfQogCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIGV0aGVyMV9pbml0XzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlpbnQgaTsKQEAgLTk4Niw3ICs5ODYsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBldGhlcjFfYmFubmVyKHZvaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZXRoZXIxX2Jhbm5lcih2b2lkKQogewogCXN0YXRpYyB1bnNpZ25lZCBpbnQgdmVyc2lvbl9wcmludGVkID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5jIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5jCmluZGV4IDg0Njg2YzguLjRmYzIzNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogICogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBzdHJpbmcgZnJvbSB0aGUgb24gYm9hcmQgcm9tLgogICogVGhpcyBpcyBhbiBhc2NpaSBzdHJpbmchISEKICAqLwotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQgX19kZXZpbml0CiBldGhlcjNfYWRkcihjaGFyICphZGRyLCBzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQogewogCXN0cnVjdCBpbl9jaHVua19kaXIgY2Q7CkBAIC0yMjMsNyArMjIzLDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50IF9fZGV2aW5pdAogZXRoZXIzX3JhbXRlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBieXRlKQogewogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IGttYWxsb2MoUlhfRU5ELCBHRlBfS0VSTkVMKTsKQEAgLTI3Miw3ICsyNzIsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgX19pbml0IGV0aGVyM19pbml0XzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGV0aGVyM19pbml0XzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlpbnQgaTsKIApAQCAtNzY1LDcgKzc2NSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZXRoZXIzX2Jhbm5lcih2b2lkKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGV0aGVyM19iYW5uZXIodm9pZCkKIHsKIAlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCmluZGV4IDRhZTk4OTcuLmYzZmFhNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMKQEAgLTUyLDcgKzUyLDEyIEBACiAjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlICIuLi84MzkwLmgiCisjZGVmaW5lIEVJX1NISUZUKHgpCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKKworI2RlZmluZSBlaV9pbmIoX3ApCSByZWFkYigodm9pZCBfX2lvbWVtICopX3ApCisjZGVmaW5lIGVpX291dGIoX3YsX3ApCSB3cml0ZWIoX3YsKHZvaWQgX19pb21lbSAqKV9wKQorI2RlZmluZSBlaV9pbmJfcChfcCkJIHJlYWRiKCh2b2lkIF9faW9tZW0gKilfcCkKKyNkZWZpbmUgZWlfb3V0Yl9wKF92LF9wKSB3cml0ZWIoX3YsKHZvaWQgX19pb21lbSAqKV9wKQogCiAjZGVmaW5lIE5FVF9ERUJVRyAgMAogI2RlZmluZSBERUJVR19JTklUIDIKQEAgLTYwLDYgKzY1LDExIEBACiAjZGVmaW5lIERSVl9OQU1FCSJldGhlcmgiCiAjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjExIgogCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CisJIkV0aGVySC9FdGhlck0gRHJpdmVyIChjKSAyMDAyLTIwMDQgUnVzc2VsbCBLaW5nICIgRFJWX1ZFUlNJT04gIlxuIjsKKworI2luY2x1ZGUgIi4uL2xpYjgzOTAuYyIKKwogc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CiAKIHN0cnVjdCBldGhlcmhfcHJpdiB7CkBAIC04Nyw5ICs5Nyw2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkV0aGVySC9FdGhlck0gZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0KLQkiRXRoZXJIL0V0aGVyTSBEcml2ZXIgKGMpIDIwMDItMjAwNCBSdXNzZWxsIEtpbmcgIiBEUlZfVkVSU0lPTiAiXG4iOwotCiAjZGVmaW5lIEVUSEVSSDUwMF9EQVRBUE9SVAkweDgwMAkvKiBNRU1DICovCiAjZGVmaW5lIEVUSEVSSDUwMF9OUzgzOTAJMHgwMDAJLyogTUVNQyAqLwogI2RlZmluZSBFVEhFUkg1MDBfQ1RSTFBPUlQJMHg4MDAJLyogSU9DICAqLwpAQCAtMTc3LDcgKzE4NCw3IEBACiAJc3dpdGNoIChldGhlcmhfcHJpdihkZXYpLT5pZCkgewogCWNhc2UgUFJPRF9JM19FVEhFUkxBTjYwMDoKIAljYXNlIFBST0RfSTNfRVRIRVJMQU42MDBBOgotCQlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkciArIEVOMF9SQ05USEk7CisJCWFkZHIgPSAodm9pZCBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHIgKyBFTjBfUkNOVEhJOwogCiAJCXN3aXRjaCAoZGV2LT5pZl9wb3J0KSB7CiAJCWNhc2UgSUZfUE9SVF8xMEJBU0UyOgpAQCAtMjE4LDcgKzIyNSw3IEBACiAJc3dpdGNoIChldGhlcmhfcHJpdihkZXYpLT5pZCkgewogCWNhc2UgUFJPRF9JM19FVEhFUkxBTjYwMDoKIAljYXNlIFBST0RfSTNfRVRIRVJMQU42MDBBOgotCQlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkciArIEVOMF9SQ05USEk7CisJCWFkZHIgPSAodm9pZCBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHIgKyBFTjBfUkNOVEhJOwogCQlzd2l0Y2ggKGRldi0+aWZfcG9ydCkgewogCQljYXNlIElGX1BPUlRfMTBCQVNFMjoKIAkJCXN0YXQgPSAxOwpAQCAtMjgxLDcgKzI4OCw3IEBACiBldGhlcmhfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IG5ldGRldl9wcml2KGRldik7Ci0Jdm9pZCBfX2lvbWVtICphZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSAodm9pZCBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CiAKIAl3cml0ZWIoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgYWRkcik7CiAKQEAgLTMyNyw3ICszMzQsNyBAQAogCiAJZWlfbG9jYWwtPmRtYWluZyA9IDE7CiAKLQlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKKwlhZGRyID0gKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyOwogCWRtYV9iYXNlID0gZXRoZXJoX3ByaXYoZGV2KS0+ZG1hX2Jhc2U7CiAKIAljb3VudCA9IChjb3VudCArIDEpICYgfjE7CkBAIC0zNjAsNyArMzY3LDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVFggUkRDXG4iLAogCQkJCWRldi0+bmFtZSk7CiAJCQlldGhlcmhfcmVzZXQgKGRldik7Ci0JCQlOUzgzOTBfaW5pdCAoZGV2LCAxKTsKKwkJCV9fTlM4MzkwX2luaXQgKGRldiwgMSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0zODcsNyArMzk0LDcgQEAKIAogCWVpX2xvY2FsLT5kbWFpbmcgPSAxOwogCi0JYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CisJYWRkciA9ICh2b2lkIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcjsKIAlkbWFfYmFzZSA9IGV0aGVyaF9wcml2KGRldiktPmRtYV9iYXNlOwogCiAJYnVmID0gc2tiLT5kYXRhOwpAQCAtNDI3LDcgKzQzNCw3IEBACiAKIAllaV9sb2NhbC0+ZG1haW5nID0gMTsKIAotCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyOworCWFkZHIgPSAodm9pZCBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CiAJZG1hX2Jhc2UgPSBldGhlcmhfcHJpdihkZXYpLT5kbWFfYmFzZTsKIAogCXdyaXRlYiAoRTgzOTBfTk9ETUEgfCBFODM5MF9QQUdFMCB8IEU4MzkwX1NUQVJULCBhZGRyICsgRTgzOTBfQ01EKTsKQEAgLTQ2NSw3ICs0NzIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKQorCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgX19laV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAkvKgpAQCAtNDkxLDcgKzQ5OCw3IEBACiAJCWV0aGVyaF9zZXRpZihkZXYpOwogCiAJZXRoZXJoX3Jlc2V0KGRldik7Ci0JZWlfb3BlbihkZXYpOworCV9fZWlfb3BlbihkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDIsNyArNTA5LDcgQEAKIHN0YXRpYyBpbnQKIGV0aGVyaF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWVpX2Nsb3NlIChkZXYpOworCV9fZWlfY2xvc2UgKGRldik7CiAJZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOwogCXJldHVybiAwOwogfQpAQCAtNjUwLDcgKzY1Nyw3IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQlkZXYgPSBfX2FsbG9jX2VpX25ldGRldihzaXplb2Yoc3RydWN0IGV0aGVyaF9wcml2KSk7CisJZGV2ID0gX19fX2FsbG9jX2VpX25ldGRldihzaXplb2Yoc3RydWN0IGV0aGVyaF9wcml2KSk7CiAJaWYgKCFkZXYpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byByZWxlYXNlOwpAQCAtNzM2LDcgKzc0Myw3IEBACiAJZWlfbG9jYWwtPmludGVyZmFjZV9udW0gPSAwOwogCiAJZXRoZXJoX3Jlc2V0KGRldik7Ci0JTlM4MzkwX2luaXQoZGV2LCAwKTsKKwlfX05TODM5MF9pbml0KGRldiwgMCk7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXQxNzAwLmMgYi9kcml2ZXJzL25ldC9hdDE3MDAuYwppbmRleCA4NjIwYTViLi41NmFlOGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdDE3MDAuYworKysgYi9kcml2ZXJzL25ldC9hdDE3MDAuYwpAQCAtOTA4LDcgKzkwOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKK3ZvaWQgX19leGl0CiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9hdDE3MDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jIGIvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jCmluZGV4IGQ3OTQ4OWUuLjdlMzdhYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKQEAgLTExNzksNyArMTE3OSw3IEBACiAjaWZkZWYgTU9EVUxFCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmF0YXJpbGFuY2VfZGV2OwogCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKK2ludCBfX2luaXQgaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlhdGFyaWxhbmNlX2RldiA9IGF0YXJpbGFuY2VfcHJvYmUoLTEpOwogCWlmIChJU19FUlIoYXRhcmlsYW5jZV9kZXYpKQpAQCAtMTE4Nyw3ICsxMTg3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX25ldGRldihhdGFyaWxhbmNlX2Rldik7CiAJZnJlZV9pcnEoYXRhcmlsYW5jZV9kZXYtPmlycSwgYXRhcmlsYW5jZV9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCmluZGV4IDQ4NzNkYzYuLmYwYjY4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYworKysgYi9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogLy8gZXh0ZXJucwogZXh0ZXJuIGludCBnZXRfZXRoZXJuZXRfYWRkcihjaGFyICpldGhlcm5ldF9hZGRyKTsKIGV4dGVybiB2b2lkIHN0cjJlYWRkcih1bnNpZ25lZCBjaGFyICplYSwgdW5zaWduZWQgY2hhciAqc3RyKTsKLWV4dGVybiBjaGFyICogX19pbml0IHByb21fZ2V0Y21kbGluZSh2b2lkKTsKK2V4dGVybiBjaGFyICogcHJvbV9nZXRjbWRsaW5lKHZvaWQpOwogCiAvKgogICogVGhlb3J5IG9mIG9wZXJhdGlvbgpAQCAtMzYwLDcgKzM2MCw4IEBACiAJQlVHX09OKCFwaHlkZXYpOwogCUJVR19PTihwaHlkZXYtPmF0dGFjaGVkX2Rldik7CiAKLQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeWRldi0+ZGV2LmJ1c19pZCwgJmF1MTAwMF9hZGp1c3RfbGluaywgMCk7CisJcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlkZXYtPmRldi5idXNfaWQsICZhdTEwMDBfYWRqdXN0X2xpbmssIDAsCisJCQlQSFlfSU5URVJGQUNFX01PREVfTUlJKTsKIAogCWlmIChJU19FUlIocGh5ZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIiwgZGV2LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5jIGIvZHJpdmVycy9uZXQvYjQ0LmMKaW5kZXggMWVjMjE3NC4uNDc0YTRlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2I0NC5jCisrKyBiL2RyaXZlcnMvbmV0L2I0NC5jCkBAIC05MDgsOCArOTA4LDkgQEAKIAlpc3RhdCA9IGJyMzIoYnAsIEI0NF9JU1RBVCk7CiAJaW1hc2sgPSBicjMyKGJwLCBCNDRfSU1BU0spOwogCi0JLyogPz8/IFdoYXQgdGhlIGZ1Y2sgaXMgdGhlIHB1cnBvc2Ugb2YgdGhlIGludGVycnVwdCBtYXNrCi0JICogPz8/IHJlZ2lzdGVyIGlmIHdlIGhhdmUgdG8gbWFzayBpdCBvdXQgYnkgaGFuZCBhbnl3YXlzPworCS8qIFRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciBjb250cm9scyB3aGljaCBpbnRlcnJ1cHQgYml0cworCSAqIHdpbGwgYWN0dWFsbHkgcmFpc2UgYW4gaW50ZXJydXB0IHRvIHRoZSBDUFUgd2hlbiBzZXQgYnkgaHcvZmlybXdhcmUsCisJICogYnV0IGRvZXNuJ3QgbWFzayBvZmYgdGhlIGJpdHMuCiAJICovCiAJaXN0YXQgJj0gaW1hc2s7CiAJaWYgKGlzdGF0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyLmMgYi9kcml2ZXJzL25ldC9ibngyLmMKaW5kZXggMDFiNzZkM2EuLjdkODI0Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ibngyLmMKQEAgLTUzLDExICs1MywxMiBAQAogCiAjaW5jbHVkZSAiYm54Mi5oIgogI2luY2x1ZGUgImJueDJfZncuaCIKKyNpbmNsdWRlICJibngyX2Z3Mi5oIgogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImJueDIiCiAjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgotI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuNC40NSIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJTZXB0ZW1iZXIgMjksIDIwMDYiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS41LjEiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiTm92ZW1iZXIgMTUsIDIwMDYiCiAKICNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQogCkBAIC04NSw2ICs4Niw3IEBACiAJTkMzNzBGLAogCUJDTTU3MDgsCiAJQkNNNTcwOFMsCisJQkNNNTcwOSwKIH0gYm9hcmRfdDsKIAogLyogaW5kZXhlZCBieSBib2FyZF90LCBhYm92ZSAqLwpAQCAtOTgsNiArMTAwLDcgQEAKIAl7ICJIUCBOQzM3MEYgTXVsdGlmdW5jdGlvbiBHaWdhYml0IFNlcnZlciBBZGFwdGVyIiB9LAogCXsgIkJyb2FkY29tIE5ldFh0cmVtZSBJSSBCQ001NzA4IDEwMDBCYXNlLVQiIH0sCiAJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3MDggMTAwMEJhc2UtU1giIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3MDkgMTAwMEJhc2UtVCIgfSwKIAl9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYm54Ml9wY2lfdGJsW10gPSB7CkBAIC0xMTUsNiArMTE4LDggQEAKIAkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDZTIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX05YMl81NzA4UywKIAkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEJDTTU3MDhTIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX05YMl81NzA5LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQkNNNTcwOSB9LAogCXsgMCwgfQogfTsKIApAQCAtMjM2LDggKzI0MSwyMyBAQAogYm54Ml9jdHhfd3Ioc3RydWN0IGJueDIgKmJwLCB1MzIgY2lkX2FkZHIsIHUzMiBvZmZzZXQsIHUzMiB2YWwpCiB7CiAJb2Zmc2V0ICs9IGNpZF9hZGRyOwotCVJFR19XUihicCwgQk5YMl9DVFhfREFUQV9BRFIsIG9mZnNldCk7Ci0JUkVHX1dSKGJwLCBCTlgyX0NUWF9EQVRBLCB2YWwpOworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkgeworCQlpbnQgaTsKKworCQlSRUdfV1IoYnAsIEJOWDJfQ1RYX0NUWF9EQVRBLCB2YWwpOworCQlSRUdfV1IoYnAsIEJOWDJfQ1RYX0NUWF9DVFJMLAorCQkgICAgICAgb2Zmc2V0IHwgQk5YMl9DVFhfQ1RYX0NUUkxfV1JJVEVfUkVRKTsKKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJdTMyIHZhbDsKKwkJCXZhbCA9IFJFR19SRChicCwgQk5YMl9DVFhfQ1RYX0NUUkwpOworCQkJaWYgKCh2YWwgJiBCTlgyX0NUWF9DVFhfQ1RSTF9XUklURV9SRVEpID09IDApCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoNSk7CisJCX0KKwl9IGVsc2UgeworCQlSRUdfV1IoYnAsIEJOWDJfQ1RYX0RBVEFfQURSLCBvZmZzZXQpOworCQlSRUdfV1IoYnAsIEJOWDJfQ1RYX0RBVEEsIHZhbCk7CisJfQogfQogCiBzdGF0aWMgaW50CkBAIC00MDMsNiArNDIzLDE0IEBACiB7CiAJaW50IGk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgYnAtPmN0eF9wYWdlczsgaSsrKSB7CisJCWlmIChicC0+Y3R4X2Jsa1tpXSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChicC0+cGRldiwgQkNNX1BBR0VfU0laRSwKKwkJCQkJICAgIGJwLT5jdHhfYmxrW2ldLAorCQkJCQkgICAgYnAtPmN0eF9ibGtfbWFwcGluZ1tpXSk7CisJCQlicC0+Y3R4X2Jsa1tpXSA9IE5VTEw7CisJCX0KKwl9CiAJaWYgKGJwLT5zdGF0dXNfYmxrKSB7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYnAtPnBkZXYsIGJwLT5zdGF0dXNfc3RhdHNfc2l6ZSwKIAkJCQkgICAgYnAtPnN0YXR1c19ibGssIGJwLT5zdGF0dXNfYmxrX21hcHBpbmcpOwpAQCAtNDgxLDYgKzUwOSwxOCBAQAogCiAJYnAtPnN0YXRzX2Jsa19tYXBwaW5nID0gYnAtPnN0YXR1c19ibGtfbWFwcGluZyArIHN0YXR1c19ibGtfc2l6ZTsKIAorCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkgeworCQlicC0+Y3R4X3BhZ2VzID0gMHgyMDAwIC8gQkNNX1BBR0VfU0laRTsKKwkJaWYgKGJwLT5jdHhfcGFnZXMgPT0gMCkKKwkJCWJwLT5jdHhfcGFnZXMgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgYnAtPmN0eF9wYWdlczsgaSsrKSB7CisJCQlicC0+Y3R4X2Jsa1tpXSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGJwLT5wZGV2LAorCQkJCQkJQkNNX1BBR0VfU0laRSwKKwkJCQkJCSZicC0+Y3R4X2Jsa19tYXBwaW5nW2ldKTsKKwkJCWlmIChicC0+Y3R4X2Jsa1tpXSA9PSBOVUxMKQorCQkJCWdvdG8gYWxsb2NfbWVtX2VycjsKKwkJfQorCX0KIAlyZXR1cm4gMDsKIAogYWxsb2NfbWVtX2VycjoKQEAgLTgwMywxMyArODQzLDEzIEBACiAKIAl2YWwgJj0gfihCTlgyX0VNQUNfTU9ERV9QT1JUIHwgQk5YMl9FTUFDX01PREVfSEFMRl9EVVBMRVggfAogCQlCTlgyX0VNQUNfTU9ERV9NQUNfTE9PUCB8IEJOWDJfRU1BQ19NT0RFX0ZPUkNFX0xJTksgfAotCQlCTlgyX0VNQUNfTU9ERV8yNUcpOworCQlCTlgyX0VNQUNfTU9ERV8yNUdfTU9ERSk7CiAKIAlpZiAoYnAtPmxpbmtfdXApIHsKIAkJc3dpdGNoIChicC0+bGluZV9zcGVlZCkgewogCQkJY2FzZSBTUEVFRF8xMDoKLQkJCQlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDgpIHsKLQkJCQkJdmFsIHw9IEJOWDJfRU1BQ19NT0RFX1BPUlRfTUlJXzEwOworCQkJCWlmIChDSElQX05VTShicCkgIT0gQ0hJUF9OVU1fNTcwNikgeworCQkJCQl2YWwgfD0gQk5YMl9FTUFDX01PREVfUE9SVF9NSUlfMTBNOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJLyogZmFsbCB0aHJvdWdoICovCkBAIC04MTcsNyArODU3LDcgQEAKIAkJCQl2YWwgfD0gQk5YMl9FTUFDX01PREVfUE9SVF9NSUk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNQRUVEXzI1MDA6Ci0JCQkJdmFsIHw9IEJOWDJfRU1BQ19NT0RFXzI1RzsKKwkJCQl2YWwgfD0gQk5YMl9FTUFDX01PREVfMjVHX01PREU7CiAJCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCQljYXNlIFNQRUVEXzEwMDA6CiAJCQkJdmFsIHw9IEJOWDJfRU1BQ19NT0RFX1BPUlRfR01JSTsKQEAgLTg2MCw3ICs5MDAsNyBAQAogCXUzMiBibXNyOwogCXU4IGxpbmtfdXA7CiAKLQlpZiAoYnAtPmxvb3BiYWNrID09IE1BQ19MT09QQkFDSykgeworCWlmIChicC0+bG9vcGJhY2sgPT0gTUFDX0xPT1BCQUNLIHx8IGJwLT5sb29wYmFjayA9PSBQSFlfTE9PUEJBQ0spIHsKIAkJYnAtPmxpbmtfdXAgPSAxOwogCQlyZXR1cm4gMDsKIAl9CkBAIC05MDIsNiArOTQyLDcgQEAKIAkJCXUzMiBibWNyOwogCiAJCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOworCQkJYm1jciAmPSB+QkNNNTcwOFNfQk1DUl9GT1JDRV8yNTAwOwogCQkJaWYgKCEoYm1jciAmIEJNQ1JfQU5FTkFCTEUpKSB7CiAJCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBibWNyIHwKIAkJCQkJQk1DUl9BTkVOQUJMRSk7CkBAIC05ODgsNyArMTAyOSwyMSBAQAogCQl1MzIgbmV3X2JtY3I7CiAJCWludCBmb3JjZV9saW5rX2Rvd24gPSAwOwogCi0JCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOCkgeworCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQURWRVJUSVNFLCAmYWR2KTsKKwkJYWR2ICY9IH4oQURWRVJUSVNFXzEwMDBYRlVMTCB8IEFEVkVSVElTRV8xMDAwWEhBTEYpOworCisJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7CisJCW5ld19ibWNyID0gYm1jciAmIH4oQk1DUl9BTkVOQUJMRSB8IEJDTTU3MDhTX0JNQ1JfRk9SQ0VfMjUwMCk7CisJCW5ld19ibWNyIHw9IEJNQ1JfU1BFRUQxMDAwOworCQlpZiAoYnAtPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzI1MDApIHsKKwkJCW5ld19ibWNyIHw9IEJDTTU3MDhTX0JNQ1JfRk9SQ0VfMjUwMDsKKwkJCWJueDJfcmVhZF9waHkoYnAsIEJDTTU3MDhTX1VQMSwgJnVwMSk7CisJCQlpZiAoISh1cDEgJiBCQ001NzA4U19VUDFfMkc1KSkgeworCQkJCXVwMSB8PSBCQ001NzA4U19VUDFfMkc1OworCQkJCWJueDJfd3JpdGVfcGh5KGJwLCBCQ001NzA4U19VUDEsIHVwMSk7CisJCQkJZm9yY2VfbGlua19kb3duID0gMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOCkgewogCQkJYm54Ml9yZWFkX3BoeShicCwgQkNNNTcwOFNfVVAxLCAmdXAxKTsKIAkJCWlmICh1cDEgJiBCQ001NzA4U19VUDFfMkc1KSB7CiAJCQkJdXAxICY9IH5CQ001NzA4U19VUDFfMkc1OwpAQCAtOTk3LDEyICsxMDUyLDYgQEAKIAkJCX0KIAkJfQogCi0JCWJueDJfcmVhZF9waHkoYnAsIE1JSV9BRFZFUlRJU0UsICZhZHYpOwotCQlhZHYgJj0gfihBRFZFUlRJU0VfMTAwMFhGVUxMIHwgQURWRVJUSVNFXzEwMDBYSEFMRik7Ci0KLQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKLQkJbmV3X2JtY3IgPSBibWNyICYgfkJNQ1JfQU5FTkFCTEU7Ci0JCW5ld19ibWNyIHw9IEJNQ1JfU1BFRUQxMDAwOwogCQlpZiAoYnAtPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKIAkJCWFkdiB8PSBBRFZFUlRJU0VfMTAwMFhGVUxMOwogCQkJbmV3X2JtY3IgfD0gQk1DUl9GVUxMRFBMWDsKQEAgLTEwMjMsNiArMTA3Miw3IEBACiAJCQkJYnAtPmxpbmtfdXAgPSAwOwogCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOwogCQkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgbmV3X2JtY3IpOworCQkJCWJueDJfcmVwb3J0X2xpbmsoYnApOwogCQkJfQogCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9BRFZFUlRJU0UsIGFkdik7CiAJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIG5ld19ibWNyKTsKQEAgLTEwNDgsMzAgKzEwOTgsMjYgQEAKIAlpZiAoKGFkdiAhPSBuZXdfYWR2KSB8fCAoKGJtY3IgJiBCTUNSX0FORU5BQkxFKSA9PSAwKSkgewogCQkvKiBGb3JjZSBhIGxpbmsgZG93biB2aXNpYmxlIG9uIHRoZSBvdGhlciBzaWRlICovCiAJCWlmIChicC0+bGlua191cCkgewotCQkJaW50IGk7Ci0KIAkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQk1DUiwgQk1DUl9MT09QQkFDSyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTEwOyBpKyspIHsKLQkJCQl1ZGVsYXkoMTAwKTsKLQkJCX0KKwkJCXNwaW5fdW5sb2NrX2JoKCZicC0+cGh5X2xvY2spOworCQkJbXNsZWVwKDIwKTsKKwkJCXNwaW5fbG9ja19iaCgmYnAtPnBoeV9sb2NrKTsKIAkJfQogCiAJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKIAkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBibWNyIHwgQk1DUl9BTlJFU1RBUlQgfAogCQkJQk1DUl9BTkVOQUJMRSk7Ci0JCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikgewotCQkJLyogU3BlZWQgdXAgbGluay11cCB0aW1lIHdoZW4gdGhlIGxpbmsgcGFydG5lcgotCQkJICogZG9lcyBub3QgYXV0b25lZ290aWF0ZSB3aGljaCBpcyB2ZXJ5IGNvbW1vbgotCQkJICogaW4gYmxhZGUgc2VydmVycy4gU29tZSBibGFkZSBzZXJ2ZXJzIHVzZQotCQkJICogSVBNSSBmb3Iga2VyYm9hcmQgaW5wdXQgYW5kIGl0J3MgaW1wb3J0YW50Ci0JCQkgKiB0byBtaW5pbWl6ZSBsaW5rIGRpc3J1cHRpb25zLiBBdXRvbmVnLiBpbnZvbHZlcwotCQkJICogZXhjaGFuZ2luZyBiYXNlIHBhZ2VzIHBsdXMgMyBuZXh0IHBhZ2VzIGFuZAotCQkJICogbm9ybWFsbHkgY29tcGxldGVzIGluIGFib3V0IDEyMCBtc2VjLgotCQkJICovCi0JCQlicC0+Y3VycmVudF9pbnRlcnZhbCA9IFNFUkRFU19BTl9USU1FT1VUOwotCQkJYnAtPnNlcmRlc19hbl9wZW5kaW5nID0gMTsKLQkJCW1vZF90aW1lcigmYnAtPnRpbWVyLCBqaWZmaWVzICsgYnAtPmN1cnJlbnRfaW50ZXJ2YWwpOwotCQl9CisJCS8qIFNwZWVkIHVwIGxpbmstdXAgdGltZSB3aGVuIHRoZSBsaW5rIHBhcnRuZXIKKwkJICogZG9lcyBub3QgYXV0b25lZ290aWF0ZSB3aGljaCBpcyB2ZXJ5IGNvbW1vbgorCQkgKiBpbiBibGFkZSBzZXJ2ZXJzLiBTb21lIGJsYWRlIHNlcnZlcnMgdXNlCisJCSAqIElQTUkgZm9yIGtlcmJvYXJkIGlucHV0IGFuZCBpdCdzIGltcG9ydGFudAorCQkgKiB0byBtaW5pbWl6ZSBsaW5rIGRpc3J1cHRpb25zLiBBdXRvbmVnLiBpbnZvbHZlcworCQkgKiBleGNoYW5naW5nIGJhc2UgcGFnZXMgcGx1cyAzIG5leHQgcGFnZXMgYW5kCisJCSAqIG5vcm1hbGx5IGNvbXBsZXRlcyBpbiBhYm91dCAxMjAgbXNlYy4KKwkJICovCisJCWJwLT5jdXJyZW50X2ludGVydmFsID0gU0VSREVTX0FOX1RJTUVPVVQ7CisJCWJwLT5zZXJkZXNfYW5fcGVuZGluZyA9IDE7CisJCW1vZF90aW1lcigmYnAtPnRpbWVyLCBqaWZmaWVzICsgYnAtPmN1cnJlbnRfaW50ZXJ2YWwpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTE1Myw3ICsxMTk5LDYgQEAKIAl9CiAJaWYgKG5ld19ibWNyICE9IGJtY3IpIHsKIAkJdTMyIGJtc3I7Ci0JCWludCBpID0gMDsKIAogCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1TUiwgJmJtc3IpOwogCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1TUiwgJmJtc3IpOwpAQCAtMTE2MSwxMiArMTIwNiwxMiBAQAogCQlpZiAoYm1zciAmIEJNU1JfTFNUQVRVUykgewogCQkJLyogRm9yY2UgbGluayBkb3duICovCiAJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIEJNQ1JfTE9PUEJBQ0spOwotCQkJZG8gewotCQkJCXVkZWxheSgxMDApOwotCQkJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTVNSLCAmYm1zcik7Ci0JCQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNU1IsICZibXNyKTsKLQkJCQlpKys7Ci0JCQl9IHdoaWxlICgoYm1zciAmIEJNU1JfTFNUQVRVUykgJiYgKGkgPCA2MjApKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZicC0+cGh5X2xvY2spOworCQkJbXNsZWVwKDUwKTsKKwkJCXNwaW5fbG9ja19iaCgmYnAtPnBoeV9sb2NrKTsKKworCQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNU1IsICZibXNyKTsKKwkJCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTVNSLCAmYm1zcik7CiAJCX0KIAogCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIG5ld19ibWNyKTsKQEAgLTEyNTgsOSArMTMwMyw4IEBACiB7CiAJYnAtPnBoeV9mbGFncyAmPSB+UEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHOwogCi0JaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA2KSB7Ci0gICAgICAgIAlSRUdfV1IoYnAsIEJOWDJfTUlTQ19VTlVTRUQwLCAweDMwMCk7Ci0JfQorCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikKKyAgICAgICAgCVJFR19XUihicCwgQk5YMl9NSVNDX0dQX0hXX0NUTDAsIDB4MzAwKTsKIAogCWlmIChicC0+ZGV2LT5tdHUgPiAxNTAwKSB7CiAJCXUzMiB2YWw7CkBAIC0xMzk3LDEzICsxNDQxLDEzIEBACiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKIAkJaWYgKGJueDJfdGVzdF9saW5rKGJwKSA9PSAwKQogCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCk7CisJCW1zbGVlcCgxMDApOwogCX0KIAogCW1hY19tb2RlID0gUkVHX1JEKGJwLCBCTlgyX0VNQUNfTU9ERSk7CiAJbWFjX21vZGUgJj0gfihCTlgyX0VNQUNfTU9ERV9QT1JUIHwgQk5YMl9FTUFDX01PREVfSEFMRl9EVVBMRVggfAogCQkgICAgICBCTlgyX0VNQUNfTU9ERV9NQUNfTE9PUCB8IEJOWDJfRU1BQ19NT0RFX0ZPUkNFX0xJTksgfAotCQkgICAgICBCTlgyX0VNQUNfTU9ERV8yNUcpOworCQkgICAgICBCTlgyX0VNQUNfTU9ERV8yNUdfTU9ERSk7CiAKIAltYWNfbW9kZSB8PSBCTlgyX0VNQUNfTU9ERV9QT1JUX0dNSUk7CiAJUkVHX1dSKGJwLCBCTlgyX0VNQUNfTU9ERSwgbWFjX21vZGUpOwpAQCAtMTQ1NCw2ICsxNDk4LDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK2JueDJfaW5pdF81NzA5X2NvbnRleHQoc3RydWN0IGJueDIgKmJwKQoreworCWludCBpLCByZXQgPSAwOworCXUzMiB2YWw7CisKKwl2YWwgPSBCTlgyX0NUWF9DT01NQU5EX0VOQUJMRUQgfCBCTlgyX0NUWF9DT01NQU5EX01FTV9JTklUIHwgKDEgPDwgMTIpOworCXZhbCB8PSAoQkNNX1BBR0VfQklUUyAtIDgpIDw8IDE2OworCVJFR19XUihicCwgQk5YMl9DVFhfQ09NTUFORCwgdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgYnAtPmN0eF9wYWdlczsgaSsrKSB7CisJCWludCBqOworCisJCVJFR19XUihicCwgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9EQVRBMCwKKwkJICAgICAgIChicC0+Y3R4X2Jsa19tYXBwaW5nW2ldICYgMHhmZmZmZmZmZikgfAorCQkgICAgICAgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9EQVRBMF9WQUxJRCk7CisJCVJFR19XUihicCwgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9EQVRBMSwKKwkJICAgICAgICh1NjQpIGJwLT5jdHhfYmxrX21hcHBpbmdbaV0gPj4gMzIpOworCQlSRUdfV1IoYnAsIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfQ1RSTCwgaSB8CisJCSAgICAgICBCTlgyX0NUWF9IT1NUX1BBR0VfVEJMX0NUUkxfV1JJVEVfUkVRKTsKKwkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspIHsKKworCQkJdmFsID0gUkVHX1JEKGJwLCBCTlgyX0NUWF9IT1NUX1BBR0VfVEJMX0NUUkwpOworCQkJaWYgKCEodmFsICYgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9DVFJMX1dSSVRFX1JFUSkpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoNSk7CisJCX0KKwkJaWYgKHZhbCAmIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfQ1RSTF9XUklURV9SRVEpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkCiBibngyX2luaXRfY29udGV4dChzdHJ1Y3QgYm54MiAqYnApCiB7CkBAIC0xNTc2LDkgKzE2NTQsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAodW5saWtlbHkoKGFsaWduID0gKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YSAmIDB4NykpKSB7Ci0JCXNrYl9yZXNlcnZlKHNrYiwgOCAtIGFsaWduKTsKLQl9CisJaWYgKHVubGlrZWx5KChhbGlnbiA9ICh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEgJiAoQk5YMl9SWF9BTElHTiAtIDEpKSkpCisJCXNrYl9yZXNlcnZlKHNrYiwgQk5YMl9SWF9BTElHTiAtIGFsaWduKTsKIAogCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShicC0+cGRldiwgc2tiLT5kYXRhLCBicC0+cnhfYnVmX3VzZV9zaXplLAogCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMjA0MCw3ICsyMTE3LDggQEAKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CiAJCS8qIFByb21pc2N1b3VzIG1vZGUuICovCiAJCXJ4X21vZGUgfD0gQk5YMl9FTUFDX1JYX01PREVfUFJPTUlTQ1VPVVM7Ci0JCXNvcnRfbW9kZSB8PSBCTlgyX1JQTV9TT1JUX1VTRVIwX1BST01fRU47CisJCXNvcnRfbW9kZSB8PSBCTlgyX1JQTV9TT1JUX1VTRVIwX1BST01fRU4gfAorCQkJICAgICBCTlgyX1JQTV9TT1JUX1VTRVIwX1BST01fVkxBTjsKIAl9CiAJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgewogCQlmb3IgKGkgPSAwOyBpIDwgTlVNX01DX0hBU0hfUkVHSVNURVJTOyBpKyspIHsKQEAgLTIyMDgsMTEgKzIyODYsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBsb2FkX2NwdV9mdyhzdHJ1Y3QgYm54MiAqYnAsIHN0cnVjdCBjcHVfcmVnICpjcHVfcmVnLCBzdHJ1Y3QgZndfaW5mbyAqZncpCiB7CiAJdTMyIG9mZnNldDsKIAl1MzIgdmFsOworCWludCByYzsKIAogCS8qIEhhbHQgdGhlIENQVS4gKi8KIAl2YWwgPSBSRUdfUkRfSU5EKGJwLCBjcHVfcmVnLT5tb2RlKTsKQEAgLTIyMjIsNyArMjMwMSwxOCBAQAogCiAJLyogTG9hZCB0aGUgVGV4dCBhcmVhLiAqLwogCW9mZnNldCA9IGNwdV9yZWctPnNwYWRfYmFzZSArIChmdy0+dGV4dF9hZGRyIC0gY3B1X3JlZy0+bWlwc192aWV3X2Jhc2UpOwotCWlmIChmdy0+dGV4dCkgeworCWlmIChmdy0+Z3pfdGV4dCkgeworCQl1MzIgdGV4dF9sZW47CisJCXZvaWQgKnRleHQ7CisKKwkJcmMgPSBibngyX2d1bnppcChicCwgZnctPmd6X3RleHQsIGZ3LT5nel90ZXh0X2xlbiwgJnRleHQsCisJCQkJICZ0ZXh0X2xlbik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlmdy0+dGV4dCA9IHRleHQ7CisJfQorCWlmIChmdy0+Z3pfdGV4dCkgewogCQlpbnQgajsKIAogCQlmb3IgKGogPSAwOyBqIDwgKGZ3LT50ZXh0X2xlbiAvIDQpOyBqKyssIG9mZnNldCArPSA0KSB7CkBAIC0yMjgwLDEzICsyMzcwLDE1IEBACiAJdmFsICY9IH5jcHVfcmVnLT5tb2RlX3ZhbHVlX2hhbHQ7CiAJUkVHX1dSX0lORChicCwgY3B1X3JlZy0+c3RhdGUsIGNwdV9yZWctPnN0YXRlX3ZhbHVlX2NsZWFyKTsKIAlSRUdfV1JfSU5EKGJwLCBjcHVfcmVnLT5tb2RlLCB2YWwpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGJueDJfaW5pdF9jcHVzKHN0cnVjdCBibngyICpicCkKIHsKIAlzdHJ1Y3QgY3B1X3JlZyBjcHVfcmVnOwotCXN0cnVjdCBmd19pbmZvIGZ3OworCXN0cnVjdCBmd19pbmZvICpmdzsKIAlpbnQgcmMgPSAwOwogCXZvaWQgKnRleHQ7CiAJdTMyIHRleHRfbGVuOwpAQCAtMjMyMyw0NCArMjQxNSwxNSBAQAogCWNwdV9yZWcuc3BhZF9iYXNlID0gQk5YMl9SWFBfU0NSQVRDSDsKIAljcHVfcmVnLm1pcHNfdmlld19iYXNlID0gMHg4MDAwMDAwOwogCi0JZncudmVyX21ham9yID0gYm54Ml9SWFBfYjA2RndSZWxlYXNlTWFqb3I7Ci0JZncudmVyX21pbm9yID0gYm54Ml9SWFBfYjA2RndSZWxlYXNlTWlub3I7Ci0JZncudmVyX2ZpeCA9IGJueDJfUlhQX2IwNkZ3UmVsZWFzZUZpeDsKLQlmdy5zdGFydF9hZGRyID0gYm54Ml9SWFBfYjA2RndTdGFydEFkZHI7CisJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA5KQorCQlmdyA9ICZibngyX3J4cF9md18wOTsKKwllbHNlCisJCWZ3ID0gJmJueDJfcnhwX2Z3XzA2OwogCi0JZncudGV4dF9hZGRyID0gYm54Ml9SWFBfYjA2RndUZXh0QWRkcjsKLQlmdy50ZXh0X2xlbiA9IGJueDJfUlhQX2IwNkZ3VGV4dExlbjsKLQlmdy50ZXh0X2luZGV4ID0gMDsKLQotCXJjID0gYm54Ml9ndW56aXAoYnAsIGJueDJfUlhQX2IwNkZ3VGV4dCwgc2l6ZW9mKGJueDJfUlhQX2IwNkZ3VGV4dCksCi0JCQkgJnRleHQsICZ0ZXh0X2xlbik7CisJcmMgPSBsb2FkX2NwdV9mdyhicCwgJmNwdV9yZWcsIGZ3KTsKIAlpZiAocmMpCiAJCWdvdG8gaW5pdF9jcHVfZXJyOwogCi0JZncudGV4dCA9IHRleHQ7Ci0KLQlmdy5kYXRhX2FkZHIgPSBibngyX1JYUF9iMDZGd0RhdGFBZGRyOwotCWZ3LmRhdGFfbGVuID0gYm54Ml9SWFBfYjA2RndEYXRhTGVuOwotCWZ3LmRhdGFfaW5kZXggPSAwOwotCWZ3LmRhdGEgPSBibngyX1JYUF9iMDZGd0RhdGE7Ci0KLQlmdy5zYnNzX2FkZHIgPSBibngyX1JYUF9iMDZGd1Nic3NBZGRyOwotCWZ3LnNic3NfbGVuID0gYm54Ml9SWFBfYjA2RndTYnNzTGVuOwotCWZ3LnNic3NfaW5kZXggPSAwOwotCWZ3LnNic3MgPSBibngyX1JYUF9iMDZGd1Nic3M7Ci0KLQlmdy5ic3NfYWRkciA9IGJueDJfUlhQX2IwNkZ3QnNzQWRkcjsKLQlmdy5ic3NfbGVuID0gYm54Ml9SWFBfYjA2RndCc3NMZW47Ci0JZncuYnNzX2luZGV4ID0gMDsKLQlmdy5ic3MgPSBibngyX1JYUF9iMDZGd0JzczsKLQotCWZ3LnJvZGF0YV9hZGRyID0gYm54Ml9SWFBfYjA2RndSb2RhdGFBZGRyOwotCWZ3LnJvZGF0YV9sZW4gPSBibngyX1JYUF9iMDZGd1JvZGF0YUxlbjsKLQlmdy5yb2RhdGFfaW5kZXggPSAwOwotCWZ3LnJvZGF0YSA9IGJueDJfUlhQX2IwNkZ3Um9kYXRhOwotCi0JbG9hZF9jcHVfZncoYnAsICZjcHVfcmVnLCAmZncpOwotCiAJLyogSW5pdGlhbGl6ZSB0aGUgVFggUHJvY2Vzc29yLiAqLwogCWNwdV9yZWcubW9kZSA9IEJOWDJfVFhQX0NQVV9NT0RFOwogCWNwdV9yZWcubW9kZV92YWx1ZV9oYWx0ID0gQk5YMl9UWFBfQ1BVX01PREVfU09GVF9IQUxUOwpAQCAtMjM3NSw0NCArMjQzOCwxNSBAQAogCWNwdV9yZWcuc3BhZF9iYXNlID0gQk5YMl9UWFBfU0NSQVRDSDsKIAljcHVfcmVnLm1pcHNfdmlld19iYXNlID0gMHg4MDAwMDAwOwogCi0JZncudmVyX21ham9yID0gYm54Ml9UWFBfYjA2RndSZWxlYXNlTWFqb3I7Ci0JZncudmVyX21pbm9yID0gYm54Ml9UWFBfYjA2RndSZWxlYXNlTWlub3I7Ci0JZncudmVyX2ZpeCA9IGJueDJfVFhQX2IwNkZ3UmVsZWFzZUZpeDsKLQlmdy5zdGFydF9hZGRyID0gYm54Ml9UWFBfYjA2RndTdGFydEFkZHI7CisJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA5KQorCQlmdyA9ICZibngyX3R4cF9md18wOTsKKwllbHNlCisJCWZ3ID0gJmJueDJfdHhwX2Z3XzA2OwogCi0JZncudGV4dF9hZGRyID0gYm54Ml9UWFBfYjA2RndUZXh0QWRkcjsKLQlmdy50ZXh0X2xlbiA9IGJueDJfVFhQX2IwNkZ3VGV4dExlbjsKLQlmdy50ZXh0X2luZGV4ID0gMDsKLQotCXJjID0gYm54Ml9ndW56aXAoYnAsIGJueDJfVFhQX2IwNkZ3VGV4dCwgc2l6ZW9mKGJueDJfVFhQX2IwNkZ3VGV4dCksCi0JCQkgJnRleHQsICZ0ZXh0X2xlbik7CisJcmMgPSBsb2FkX2NwdV9mdyhicCwgJmNwdV9yZWcsIGZ3KTsKIAlpZiAocmMpCiAJCWdvdG8gaW5pdF9jcHVfZXJyOwogCi0JZncudGV4dCA9IHRleHQ7Ci0KLQlmdy5kYXRhX2FkZHIgPSBibngyX1RYUF9iMDZGd0RhdGFBZGRyOwotCWZ3LmRhdGFfbGVuID0gYm54Ml9UWFBfYjA2RndEYXRhTGVuOwotCWZ3LmRhdGFfaW5kZXggPSAwOwotCWZ3LmRhdGEgPSBibngyX1RYUF9iMDZGd0RhdGE7Ci0KLQlmdy5zYnNzX2FkZHIgPSBibngyX1RYUF9iMDZGd1Nic3NBZGRyOwotCWZ3LnNic3NfbGVuID0gYm54Ml9UWFBfYjA2RndTYnNzTGVuOwotCWZ3LnNic3NfaW5kZXggPSAwOwotCWZ3LnNic3MgPSBibngyX1RYUF9iMDZGd1Nic3M7Ci0KLQlmdy5ic3NfYWRkciA9IGJueDJfVFhQX2IwNkZ3QnNzQWRkcjsKLQlmdy5ic3NfbGVuID0gYm54Ml9UWFBfYjA2RndCc3NMZW47Ci0JZncuYnNzX2luZGV4ID0gMDsKLQlmdy5ic3MgPSBibngyX1RYUF9iMDZGd0JzczsKLQotCWZ3LnJvZGF0YV9hZGRyID0gYm54Ml9UWFBfYjA2RndSb2RhdGFBZGRyOwotCWZ3LnJvZGF0YV9sZW4gPSBibngyX1RYUF9iMDZGd1JvZGF0YUxlbjsKLQlmdy5yb2RhdGFfaW5kZXggPSAwOwotCWZ3LnJvZGF0YSA9IGJueDJfVFhQX2IwNkZ3Um9kYXRhOwotCi0JbG9hZF9jcHVfZncoYnAsICZjcHVfcmVnLCAmZncpOwotCiAJLyogSW5pdGlhbGl6ZSB0aGUgVFggUGF0Y2gtdXAgUHJvY2Vzc29yLiAqLwogCWNwdV9yZWcubW9kZSA9IEJOWDJfVFBBVF9DUFVfTU9ERTsKIAljcHVfcmVnLm1vZGVfdmFsdWVfaGFsdCA9IEJOWDJfVFBBVF9DUFVfTU9ERV9TT0ZUX0hBTFQ7CkBAIC0yNDI3LDQ0ICsyNDYxLDE1IEBACiAJY3B1X3JlZy5zcGFkX2Jhc2UgPSBCTlgyX1RQQVRfU0NSQVRDSDsKIAljcHVfcmVnLm1pcHNfdmlld19iYXNlID0gMHg4MDAwMDAwOwogCi0JZncudmVyX21ham9yID0gYm54Ml9UUEFUX2IwNkZ3UmVsZWFzZU1ham9yOwotCWZ3LnZlcl9taW5vciA9IGJueDJfVFBBVF9iMDZGd1JlbGVhc2VNaW5vcjsKLQlmdy52ZXJfZml4ID0gYm54Ml9UUEFUX2IwNkZ3UmVsZWFzZUZpeDsKLQlmdy5zdGFydF9hZGRyID0gYm54Ml9UUEFUX2IwNkZ3U3RhcnRBZGRyOworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkKKwkJZncgPSAmYm54Ml90cGF0X2Z3XzA5OworCWVsc2UKKwkJZncgPSAmYm54Ml90cGF0X2Z3XzA2OwogCi0JZncudGV4dF9hZGRyID0gYm54Ml9UUEFUX2IwNkZ3VGV4dEFkZHI7Ci0JZncudGV4dF9sZW4gPSBibngyX1RQQVRfYjA2RndUZXh0TGVuOwotCWZ3LnRleHRfaW5kZXggPSAwOwotCi0JcmMgPSBibngyX2d1bnppcChicCwgYm54Ml9UUEFUX2IwNkZ3VGV4dCwgc2l6ZW9mKGJueDJfVFBBVF9iMDZGd1RleHQpLAotCQkJICZ0ZXh0LCAmdGV4dF9sZW4pOworCXJjID0gbG9hZF9jcHVfZncoYnAsICZjcHVfcmVnLCBmdyk7CiAJaWYgKHJjKQogCQlnb3RvIGluaXRfY3B1X2VycjsKIAotCWZ3LnRleHQgPSB0ZXh0OwotCi0JZncuZGF0YV9hZGRyID0gYm54Ml9UUEFUX2IwNkZ3RGF0YUFkZHI7Ci0JZncuZGF0YV9sZW4gPSBibngyX1RQQVRfYjA2RndEYXRhTGVuOwotCWZ3LmRhdGFfaW5kZXggPSAwOwotCWZ3LmRhdGEgPSBibngyX1RQQVRfYjA2RndEYXRhOwotCi0JZncuc2Jzc19hZGRyID0gYm54Ml9UUEFUX2IwNkZ3U2Jzc0FkZHI7Ci0JZncuc2Jzc19sZW4gPSBibngyX1RQQVRfYjA2RndTYnNzTGVuOwotCWZ3LnNic3NfaW5kZXggPSAwOwotCWZ3LnNic3MgPSBibngyX1RQQVRfYjA2RndTYnNzOwotCi0JZncuYnNzX2FkZHIgPSBibngyX1RQQVRfYjA2RndCc3NBZGRyOwotCWZ3LmJzc19sZW4gPSBibngyX1RQQVRfYjA2RndCc3NMZW47Ci0JZncuYnNzX2luZGV4ID0gMDsKLQlmdy5ic3MgPSBibngyX1RQQVRfYjA2RndCc3M7Ci0KLQlmdy5yb2RhdGFfYWRkciA9IGJueDJfVFBBVF9iMDZGd1JvZGF0YUFkZHI7Ci0JZncucm9kYXRhX2xlbiA9IGJueDJfVFBBVF9iMDZGd1JvZGF0YUxlbjsKLQlmdy5yb2RhdGFfaW5kZXggPSAwOwotCWZ3LnJvZGF0YSA9IGJueDJfVFBBVF9iMDZGd1JvZGF0YTsKLQotCWxvYWRfY3B1X2Z3KGJwLCAmY3B1X3JlZywgJmZ3KTsKLQogCS8qIEluaXRpYWxpemUgdGhlIENvbXBsZXRpb24gUHJvY2Vzc29yLiAqLwogCWNwdV9yZWcubW9kZSA9IEJOWDJfQ09NX0NQVV9NT0RFOwogCWNwdV9yZWcubW9kZV92YWx1ZV9oYWx0ID0gQk5YMl9DT01fQ1BVX01PREVfU09GVF9IQUxUOwpAQCAtMjQ3OSw0NCArMjQ4NCwzNiBAQAogCWNwdV9yZWcuc3BhZF9iYXNlID0gQk5YMl9DT01fU0NSQVRDSDsKIAljcHVfcmVnLm1pcHNfdmlld19iYXNlID0gMHg4MDAwMDAwOwogCi0JZncudmVyX21ham9yID0gYm54Ml9DT01fYjA2RndSZWxlYXNlTWFqb3I7Ci0JZncudmVyX21pbm9yID0gYm54Ml9DT01fYjA2RndSZWxlYXNlTWlub3I7Ci0JZncudmVyX2ZpeCA9IGJueDJfQ09NX2IwNkZ3UmVsZWFzZUZpeDsKLQlmdy5zdGFydF9hZGRyID0gYm54Ml9DT01fYjA2RndTdGFydEFkZHI7CisJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA5KQorCQlmdyA9ICZibngyX2NvbV9md18wOTsKKwllbHNlCisJCWZ3ID0gJmJueDJfY29tX2Z3XzA2OwogCi0JZncudGV4dF9hZGRyID0gYm54Ml9DT01fYjA2RndUZXh0QWRkcjsKLQlmdy50ZXh0X2xlbiA9IGJueDJfQ09NX2IwNkZ3VGV4dExlbjsKLQlmdy50ZXh0X2luZGV4ID0gMDsKLQotCXJjID0gYm54Ml9ndW56aXAoYnAsIGJueDJfQ09NX2IwNkZ3VGV4dCwgc2l6ZW9mKGJueDJfQ09NX2IwNkZ3VGV4dCksCi0JCQkgJnRleHQsICZ0ZXh0X2xlbik7CisJcmMgPSBsb2FkX2NwdV9mdyhicCwgJmNwdV9yZWcsIGZ3KTsKIAlpZiAocmMpCiAJCWdvdG8gaW5pdF9jcHVfZXJyOwogCi0JZncudGV4dCA9IHRleHQ7CisJLyogSW5pdGlhbGl6ZSB0aGUgQ29tbWFuZCBQcm9jZXNzb3IuICovCisJY3B1X3JlZy5tb2RlID0gQk5YMl9DUF9DUFVfTU9ERTsKKwljcHVfcmVnLm1vZGVfdmFsdWVfaGFsdCA9IEJOWDJfQ1BfQ1BVX01PREVfU09GVF9IQUxUOworCWNwdV9yZWcubW9kZV92YWx1ZV9zc3RlcCA9IEJOWDJfQ1BfQ1BVX01PREVfU1RFUF9FTkE7CisJY3B1X3JlZy5zdGF0ZSA9IEJOWDJfQ1BfQ1BVX1NUQVRFOworCWNwdV9yZWcuc3RhdGVfdmFsdWVfY2xlYXIgPSAweGZmZmZmZjsKKwljcHVfcmVnLmdwcjAgPSBCTlgyX0NQX0NQVV9SRUdfRklMRTsKKwljcHVfcmVnLmV2bWFzayA9IEJOWDJfQ1BfQ1BVX0VWRU5UX01BU0s7CisJY3B1X3JlZy5wYyA9IEJOWDJfQ1BfQ1BVX1BST0dSQU1fQ09VTlRFUjsKKwljcHVfcmVnLmluc3QgPSBCTlgyX0NQX0NQVV9JTlNUUlVDVElPTjsKKwljcHVfcmVnLmJwID0gQk5YMl9DUF9DUFVfSFdfQlJFQUtQT0lOVDsKKwljcHVfcmVnLnNwYWRfYmFzZSA9IEJOWDJfQ1BfU0NSQVRDSDsKKwljcHVfcmVnLm1pcHNfdmlld19iYXNlID0gMHg4MDAwMDAwOwogCi0JZncuZGF0YV9hZGRyID0gYm54Ml9DT01fYjA2RndEYXRhQWRkcjsKLQlmdy5kYXRhX2xlbiA9IGJueDJfQ09NX2IwNkZ3RGF0YUxlbjsKLQlmdy5kYXRhX2luZGV4ID0gMDsKLQlmdy5kYXRhID0gYm54Ml9DT01fYjA2RndEYXRhOworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkgeworCQlmdyA9ICZibngyX2NwX2Z3XzA5OwogCi0JZncuc2Jzc19hZGRyID0gYm54Ml9DT01fYjA2RndTYnNzQWRkcjsKLQlmdy5zYnNzX2xlbiA9IGJueDJfQ09NX2IwNkZ3U2Jzc0xlbjsKLQlmdy5zYnNzX2luZGV4ID0gMDsKLQlmdy5zYnNzID0gYm54Ml9DT01fYjA2RndTYnNzOwotCi0JZncuYnNzX2FkZHIgPSBibngyX0NPTV9iMDZGd0Jzc0FkZHI7Ci0JZncuYnNzX2xlbiA9IGJueDJfQ09NX2IwNkZ3QnNzTGVuOwotCWZ3LmJzc19pbmRleCA9IDA7Ci0JZncuYnNzID0gYm54Ml9DT01fYjA2RndCc3M7Ci0KLQlmdy5yb2RhdGFfYWRkciA9IGJueDJfQ09NX2IwNkZ3Um9kYXRhQWRkcjsKLQlmdy5yb2RhdGFfbGVuID0gYm54Ml9DT01fYjA2RndSb2RhdGFMZW47Ci0JZncucm9kYXRhX2luZGV4ID0gMDsKLQlmdy5yb2RhdGEgPSBibngyX0NPTV9iMDZGd1JvZGF0YTsKLQotCWxvYWRfY3B1X2Z3KGJwLCAmY3B1X3JlZywgJmZ3KTsKLQorCQlyYyA9IGxvYWRfY3B1X2Z3KGJwLCAmY3B1X3JlZywgZncpOworCQlpZiAocmMpCisJCQlnb3RvIGluaXRfY3B1X2VycjsKKwl9CiBpbml0X2NwdV9lcnI6CiAJYm54Ml9ndW56aXBfZW5kKGJwKTsKIAlyZXR1cm4gcmM7CkBAIC0zMjg4LDMxICszMjg1LDQ0IEBACiAJICogYmVmb3JlIHdlIGlzc3VlIGEgcmVzZXQuICovCiAJdmFsID0gUkVHX1JEKGJwLCBCTlgyX01JU0NfSUQpOwogCi0JdmFsID0gQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRIHwKLQkgICAgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19SRUdfV0lORE9XX0VOQSB8Ci0JICAgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfVEFSR0VUX01CX1dPUkRfU1dBUDsKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpIHsKKwkJUkVHX1dSKGJwLCBCTlgyX01JU0NfQ09NTUFORCwgQk5YMl9NSVNDX0NPTU1BTkRfU1dfUkVTRVQpOworCQlSRUdfUkQoYnAsIEJOWDJfTUlTQ19DT01NQU5EKTsKKwkJdWRlbGF5KDUpOwogCi0JLyogQ2hpcCByZXNldC4gKi8KLQlSRUdfV1IoYnAsIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHLCB2YWwpOworCQl2YWwgPSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19SRUdfV0lORE9XX0VOQSB8CisJCSAgICAgIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX1RBUkdFVF9NQl9XT1JEX1NXQVA7CiAKLQlpZiAoKENISVBfSUQoYnApID09IENISVBfSURfNTcwNl9BMCkgfHwKLQkgICAgKENISVBfSUQoYnApID09IENISVBfSURfNTcwNl9BMSkpCi0JCW1zbGVlcCgxNSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnAtPnBkZXYsIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHLCB2YWwpOwogCi0JLyogUmVzZXQgdGFrZXMgYXBwcm94aW1hdGUgMzAgdXNlYyAqLwotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCXZhbCA9IFJFR19SRChicCwgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUcpOwotCQlpZiAoKHZhbCAmIChCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9SRVEgfAotCQkJICAgIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0NPUkVfUlNUX0JTWSkpID09IDApIHsKLQkJCWJyZWFrOworCX0gZWxzZSB7CisJCXZhbCA9IEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0NPUkVfUlNUX1JFUSB8CisJCSAgICAgIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX1JFR19XSU5ET1dfRU5BIHwKKwkJICAgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfVEFSR0VUX01CX1dPUkRfU1dBUDsKKworCQkvKiBDaGlwIHJlc2V0LiAqLworCQlSRUdfV1IoYnAsIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHLCB2YWwpOworCisJCWlmICgoQ0hJUF9JRChicCkgPT0gQ0hJUF9JRF81NzA2X0EwKSB8fAorCQkgICAgKENISVBfSUQoYnApID09IENISVBfSURfNTcwNl9BMSkpIHsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJCQlzY2hlZHVsZV90aW1lb3V0KEhaIC8gNTApOwogCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQogCi0JaWYgKHZhbCAmIChCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9SRVEgfAotCQkgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9CU1kpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIkNoaXAgcmVzZXQgZGlkIG5vdCBjb21wbGV0ZVxuIik7Ci0JCXJldHVybiAtRUJVU1k7CisJCS8qIFJlc2V0IHRha2VzIGFwcHJveGltYXRlIDMwIHVzZWMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCXZhbCA9IFJFR19SRChicCwgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUcpOworCQkJaWYgKCh2YWwgJiAoQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRIHwKKwkJCQkgICAgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfQlNZKSkgPT0gMCkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQlpZiAodmFsICYgKEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0NPUkVfUlNUX1JFUSB8CisJCQkgICBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9CU1kpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDaGlwIHJlc2V0IGRpZCBub3QgY29tcGxldGVcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQogCX0KIAogCS8qIE1ha2Ugc3VyZSBieXRlIHN3YXBwaW5nIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuICovCkBAIC0zMzkwLDcgKzM0MDAsMTAgQEAKIAogCS8qIEluaXRpYWxpemUgY29udGV4dCBtYXBwaW5nIGFuZCB6ZXJvIG91dCB0aGUgcXVpY2sgY29udGV4dHMuICBUaGUKIAkgKiBjb250ZXh0IGJsb2NrIG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gZW5hYmxlZC4gKi8KLQlibngyX2luaXRfY29udGV4dChicCk7CisJaWYgKENISVBfTlVNKGJwKSA9PSBDSElQX05VTV81NzA5KQorCQlibngyX2luaXRfNTcwOV9jb250ZXh0KGJwKTsKKwllbHNlCisJCWJueDJfaW5pdF9jb250ZXh0KGJwKTsKIAogCWlmICgocmMgPSBibngyX2luaXRfY3B1cyhicCkpICE9IDApCiAJCXJldHVybiByYzsKQEAgLTM1MDEsMTIgKzM1MTQsNDAgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyB2b2lkCitibngyX2luaXRfdHhfY29udGV4dChzdHJ1Y3QgYm54MiAqYnAsIHUzMiBjaWQpCit7CisJdTMyIHZhbCwgb2Zmc2V0MCwgb2Zmc2V0MSwgb2Zmc2V0Miwgb2Zmc2V0MzsKKworCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOSkgeworCQlvZmZzZXQwID0gQk5YMl9MMkNUWF9UWVBFX1hJOworCQlvZmZzZXQxID0gQk5YMl9MMkNUWF9DTURfVFlQRV9YSTsKKwkJb2Zmc2V0MiA9IEJOWDJfTDJDVFhfVEJEUl9CSEFERFJfSElfWEk7CisJCW9mZnNldDMgPSBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0xPX1hJOworCX0gZWxzZSB7CisJCW9mZnNldDAgPSBCTlgyX0wyQ1RYX1RZUEU7CisJCW9mZnNldDEgPSBCTlgyX0wyQ1RYX0NNRF9UWVBFOworCQlvZmZzZXQyID0gQk5YMl9MMkNUWF9UQkRSX0JIQUREUl9ISTsKKwkJb2Zmc2V0MyA9IEJOWDJfTDJDVFhfVEJEUl9CSEFERFJfTE87CisJfQorCXZhbCA9IEJOWDJfTDJDVFhfVFlQRV9UWVBFX0wyIHwgQk5YMl9MMkNUWF9UWVBFX1NJWkVfTDI7CisJQ1RYX1dSKGJwLCBHRVRfQ0lEX0FERFIoY2lkKSwgb2Zmc2V0MCwgdmFsKTsKKworCXZhbCA9IEJOWDJfTDJDVFhfQ01EX1RZUEVfVFlQRV9MMiB8ICg4IDw8IDE2KTsKKwlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihjaWQpLCBvZmZzZXQxLCB2YWwpOworCisJdmFsID0gKHU2NCkgYnAtPnR4X2Rlc2NfbWFwcGluZyA+PiAzMjsKKwlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihjaWQpLCBvZmZzZXQyLCB2YWwpOworCisJdmFsID0gKHU2NCkgYnAtPnR4X2Rlc2NfbWFwcGluZyAmIDB4ZmZmZmZmZmY7CisJQ1RYX1dSKGJwLCBHRVRfQ0lEX0FERFIoY2lkKSwgb2Zmc2V0MywgdmFsKTsKK30KIAogc3RhdGljIHZvaWQKIGJueDJfaW5pdF90eF9yaW5nKHN0cnVjdCBibngyICpicCkKIHsKIAlzdHJ1Y3QgdHhfYmQgKnR4YmQ7Ci0JdTMyIHZhbDsKKwl1MzIgY2lkOwogCiAJYnAtPnR4X3dha2VfdGhyZXNoID0gYnAtPnR4X3Jpbmdfc2l6ZSAvIDI7CiAKQEAgLTM1MjAsMTkgKzM1NjEsMTEgQEAKIAlicC0+aHdfdHhfY29ucyA9IDA7CiAJYnAtPnR4X3Byb2RfYnNlcSA9IDA7CiAKLQl2YWwgPSBCTlgyX0wyQ1RYX1RZUEVfVFlQRV9MMjsKLQl2YWwgfD0gQk5YMl9MMkNUWF9UWVBFX1NJWkVfTDI7Ci0JQ1RYX1dSKGJwLCBHRVRfQ0lEX0FERFIoVFhfQ0lEKSwgQk5YMl9MMkNUWF9UWVBFLCB2YWwpOworCWNpZCA9IFRYX0NJRDsKKwlicC0+dHhfYmlkeF9hZGRyID0gTUJfR0VUX0NJRF9BRERSKGNpZCkgKyBCTlgyX0wyQ1RYX1RYX0hPU1RfQklEWDsKKwlicC0+dHhfYnNlcV9hZGRyID0gTUJfR0VUX0NJRF9BRERSKGNpZCkgKyBCTlgyX0wyQ1RYX1RYX0hPU1RfQlNFUTsKIAotCXZhbCA9IEJOWDJfTDJDVFhfQ01EX1RZUEVfVFlQRV9MMjsKLQl2YWwgfD0gOCA8PCAxNjsKLQlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihUWF9DSUQpLCBCTlgyX0wyQ1RYX0NNRF9UWVBFLCB2YWwpOwotCi0JdmFsID0gKHU2NCkgYnAtPnR4X2Rlc2NfbWFwcGluZyA+PiAzMjsKLQlDVFhfV1IoYnAsIEdFVF9DSURfQUREUihUWF9DSUQpLCBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0hJLCB2YWwpOwotCi0JdmFsID0gKHU2NCkgYnAtPnR4X2Rlc2NfbWFwcGluZyAmIDB4ZmZmZmZmZmY7Ci0JQ1RYX1dSKGJwLCBHRVRfQ0lEX0FERFIoVFhfQ0lEKSwgQk5YMl9MMkNUWF9UQkRSX0JIQUREUl9MTywgdmFsKTsKKwlibngyX2luaXRfdHhfY29udGV4dChicCwgY2lkKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM1NDUsOCArMzU3OCw4IEBACiAKIAkvKiA4IGZvciBDUkMgYW5kIFZMQU4gKi8KIAlicC0+cnhfYnVmX3VzZV9zaXplID0gYnAtPmRldi0+bXR1ICsgRVRIX0hMRU4gKyBicC0+cnhfb2Zmc2V0ICsgODsKLQkvKiA4IGZvciBhbGlnbm1lbnQgKi8KLQlicC0+cnhfYnVmX3NpemUgPSBicC0+cnhfYnVmX3VzZV9zaXplICsgODsKKwkvKiBodyBhbGlnbm1lbnQgKi8KKwlicC0+cnhfYnVmX3NpemUgPSBicC0+cnhfYnVmX3VzZV9zaXplICsgQk5YMl9SWF9BTElHTjsKIAogCXJpbmdfcHJvZCA9IHByb2QgPSBicC0+cnhfcHJvZCA9IDA7CiAJYnAtPnJ4X2NvbnMgPSAwOwpAQCAtMzcxMiw3ICszNzQ1LDkgQEAKIAlpZiAoKHJjID0gYm54Ml9yZXNldF9uaWMoYnAsIEJOWDJfRFJWX01TR19DT0RFX1JFU0VUKSkgIT0gMCkKIAkJcmV0dXJuIHJjOwogCisJc3Bpbl9sb2NrX2JoKCZicC0+cGh5X2xvY2spOwogCWJueDJfaW5pdF9waHkoYnApOworCXNwaW5fdW5sb2NrX2JoKCZicC0+cGh5X2xvY2spOwogCWJueDJfc2V0X2xpbmsoYnApOwogCXJldHVybiAwOwogfQpAQCAtMzk1Miw3ICszOTg3LDcgQEAKIAkJYm54Ml9zZXRfbWFjX2xvb3BiYWNrKGJwKTsKIAl9CiAJZWxzZSBpZiAobG9vcGJhY2tfbW9kZSA9PSBCTlgyX1BIWV9MT09QQkFDSykgewotCQlicC0+bG9vcGJhY2sgPSAwOworCQlicC0+bG9vcGJhY2sgPSBQSFlfTE9PUEJBQ0s7CiAJCWJueDJfc2V0X3BoeV9sb29wYmFjayhicCk7CiAJfQogCWVsc2UKQEAgLTM5OTIsOCArNDAyNyw4IEBACiAJYnAtPnR4X3Byb2QgPSBORVhUX1RYX0JEKGJwLT50eF9wcm9kKTsKIAlicC0+dHhfcHJvZF9ic2VxICs9IHBrdF9zaXplOwogCi0JUkVHX1dSMTYoYnAsIE1CX1RYX0NJRF9BRERSICsgQk5YMl9MMkNUWF9UWF9IT1NUX0JJRFgsIGJwLT50eF9wcm9kKTsKLQlSRUdfV1IoYnAsIE1CX1RYX0NJRF9BRERSICsgQk5YMl9MMkNUWF9UWF9IT1NUX0JTRVEsIGJwLT50eF9wcm9kX2JzZXEpOworCVJFR19XUjE2KGJwLCBicC0+dHhfYmlkeF9hZGRyLCBicC0+dHhfcHJvZCk7CisJUkVHX1dSKGJwLCBicC0+dHhfYnNlcV9hZGRyLCBicC0+dHhfcHJvZF9ic2VxKTsKIAogCXVkZWxheSgxMDApOwogCkBAIC00MTYyLDYgKzQxOTcsOTYgQEAKIH0KIAogc3RhdGljIHZvaWQKK2JueDJfNTcwNl9zZXJkZXNfdGltZXIoc3RydWN0IGJueDIgKmJwKQoreworCXNwaW5fbG9jaygmYnAtPnBoeV9sb2NrKTsKKwlpZiAoYnAtPnNlcmRlc19hbl9wZW5kaW5nKQorCQlicC0+c2VyZGVzX2FuX3BlbmRpbmctLTsKKwllbHNlIGlmICgoYnAtPmxpbmtfdXAgPT0gMCkgJiYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19TUEVFRCkpIHsKKwkJdTMyIGJtY3I7CisKKwkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBicC0+dGltZXJfaW50ZXJ2YWw7CisKKwkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKKworCQlpZiAoYm1jciAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJCXUzMiBwaHkxLCBwaHkyOworCisJCQlibngyX3dyaXRlX3BoeShicCwgMHgxYywgMHg3YzAwKTsKKwkJCWJueDJfcmVhZF9waHkoYnAsIDB4MWMsICZwaHkxKTsKKworCQkJYm54Ml93cml0ZV9waHkoYnAsIDB4MTcsIDB4MGYwMSk7CisJCQlibngyX3JlYWRfcGh5KGJwLCAweDE1LCAmcGh5Mik7CisJCQlibngyX3dyaXRlX3BoeShicCwgMHgxNywgMHgwZjAxKTsKKwkJCWJueDJfcmVhZF9waHkoYnAsIDB4MTUsICZwaHkyKTsKKworCQkJaWYgKChwaHkxICYgMHgxMCkgJiYJLyogU0lHTkFMIERFVEVDVCAqLworCQkJCSEocGh5MiAmIDB4MjApKSB7CS8qIG5vIENPTkZJRyAqLworCisJCQkJYm1jciAmPSB+Qk1DUl9BTkVOQUJMRTsKKwkJCQlibWNyIHw9IEJNQ1JfU1BFRUQxMDAwIHwgQk1DUl9GVUxMRFBMWDsKKwkJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIGJtY3IpOworCQkJCWJwLT5waHlfZmxhZ3MgfD0gUEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKChicC0+bGlua191cCkgJiYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19TUEVFRCkgJiYKKwkJIChicC0+cGh5X2ZsYWdzICYgUEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHKSkgeworCQl1MzIgcGh5MjsKKworCQlibngyX3dyaXRlX3BoeShicCwgMHgxNywgMHgwZjAxKTsKKwkJYm54Ml9yZWFkX3BoeShicCwgMHgxNSwgJnBoeTIpOworCQlpZiAocGh5MiAmIDB4MjApIHsKKwkJCXUzMiBibWNyOworCisJCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOworCQkJYm1jciB8PSBCTUNSX0FORU5BQkxFOworCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBibWNyKTsKKworCQkJYnAtPnBoeV9mbGFncyAmPSB+UEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHOworCQl9CisJfSBlbHNlCisJCWJwLT5jdXJyZW50X2ludGVydmFsID0gYnAtPnRpbWVyX2ludGVydmFsOworCisJc3Bpbl91bmxvY2soJmJwLT5waHlfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitibngyXzU3MDhfc2VyZGVzX3RpbWVyKHN0cnVjdCBibngyICpicCkKK3sKKwlpZiAoKGJwLT5waHlfZmxhZ3MgJiBQSFlfMl81R19DQVBBQkxFX0ZMQUcpID09IDApIHsKKwkJYnAtPnNlcmRlc19hbl9wZW5kaW5nID0gMDsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9jaygmYnAtPnBoeV9sb2NrKTsKKwlpZiAoYnAtPnNlcmRlc19hbl9wZW5kaW5nKQorCQlicC0+c2VyZGVzX2FuX3BlbmRpbmctLTsKKwllbHNlIGlmICgoYnAtPmxpbmtfdXAgPT0gMCkgJiYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19TUEVFRCkpIHsKKwkJdTMyIGJtY3I7CisKKwkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKKworCQlpZiAoYm1jciAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJCWJtY3IgJj0gfkJNQ1JfQU5FTkFCTEU7CisJCQlibWNyIHw9IEJNQ1JfRlVMTERQTFggfCBCQ001NzA4U19CTUNSX0ZPUkNFXzI1MDA7CisJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIGJtY3IpOworCQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBTRVJERVNfRk9SQ0VEX1RJTUVPVVQ7CisJCX0gZWxzZSB7CisJCQlibWNyICY9IH4oQk1DUl9GVUxMRFBMWCB8IEJDTTU3MDhTX0JNQ1JfRk9SQ0VfMjUwMCk7CisJCQlibWNyIHw9IEJNQ1JfQU5FTkFCTEU7CisJCQlibngyX3dyaXRlX3BoeShicCwgTUlJX0JNQ1IsIGJtY3IpOworCQkJYnAtPnNlcmRlc19hbl9wZW5kaW5nID0gMjsKKwkJCWJwLT5jdXJyZW50X2ludGVydmFsID0gYnAtPnRpbWVyX2ludGVydmFsOworCQl9CisKKwl9IGVsc2UKKwkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBicC0+dGltZXJfaW50ZXJ2YWw7CisKKwlzcGluX3VubG9jaygmYnAtPnBoeV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQKIGJueDJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBibngyICpicCA9IChzdHJ1Y3QgYm54MiAqKSBkYXRhOwpAQCAtNDE3OCw2NCArNDMwMywxMSBAQAogCiAJYnAtPnN0YXRzX2Jsay0+c3RhdF9Gd1J4RHJvcCA9IFJFR19SRF9JTkQoYnAsIEJOWDJfRldfUlhfRFJPUF9DT1VOVCk7CiAKLQlpZiAoKGJwLT5waHlfZmxhZ3MgJiBQSFlfU0VSREVTX0ZMQUcpICYmCi0JICAgIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikpIHsKLQotCQlzcGluX2xvY2soJmJwLT5waHlfbG9jayk7Ci0JCWlmIChicC0+c2VyZGVzX2FuX3BlbmRpbmcpIHsKLQkJCWJwLT5zZXJkZXNfYW5fcGVuZGluZy0tOwotCQl9Ci0JCWVsc2UgaWYgKChicC0+bGlua191cCA9PSAwKSAmJiAoYnAtPmF1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSkgewotCQkJdTMyIGJtY3I7Ci0KLQkJCWJwLT5jdXJyZW50X2ludGVydmFsID0gYnAtPnRpbWVyX2ludGVydmFsOwotCi0JCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQk1DUiwgJmJtY3IpOwotCi0JCQlpZiAoYm1jciAmIEJNQ1JfQU5FTkFCTEUpIHsKLQkJCQl1MzIgcGh5MSwgcGh5MjsKLQotCQkJCWJueDJfd3JpdGVfcGh5KGJwLCAweDFjLCAweDdjMDApOwotCQkJCWJueDJfcmVhZF9waHkoYnAsIDB4MWMsICZwaHkxKTsKLQotCQkJCWJueDJfd3JpdGVfcGh5KGJwLCAweDE3LCAweDBmMDEpOwotCQkJCWJueDJfcmVhZF9waHkoYnAsIDB4MTUsICZwaHkyKTsKLQkJCQlibngyX3dyaXRlX3BoeShicCwgMHgxNywgMHgwZjAxKTsKLQkJCQlibngyX3JlYWRfcGh5KGJwLCAweDE1LCAmcGh5Mik7Ci0KLQkJCQlpZiAoKHBoeTEgJiAweDEwKSAmJgkvKiBTSUdOQUwgREVURUNUICovCi0JCQkJCSEocGh5MiAmIDB4MjApKSB7CS8qIG5vIENPTkZJRyAqLwotCi0JCQkJCWJtY3IgJj0gfkJNQ1JfQU5FTkFCTEU7Ci0JCQkJCWJtY3IgfD0gQk1DUl9TUEVFRDEwMDAgfAotCQkJCQkJQk1DUl9GVUxMRFBMWDsKLQkJCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBibWNyKTsKLQkJCQkJYnAtPnBoeV9mbGFncyB8PQotCQkJCQkJUEhZX1BBUkFMTEVMX0RFVEVDVF9GTEFHOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmICgoYnAtPmxpbmtfdXApICYmIChicC0+YXV0b25lZyAmIEFVVE9ORUdfU1BFRUQpICYmCi0JCQkoYnAtPnBoeV9mbGFncyAmIFBIWV9QQVJBTExFTF9ERVRFQ1RfRkxBRykpIHsKLQkJCXUzMiBwaHkyOwotCi0JCQlibngyX3dyaXRlX3BoeShicCwgMHgxNywgMHgwZjAxKTsKLQkJCWJueDJfcmVhZF9waHkoYnAsIDB4MTUsICZwaHkyKTsKLQkJCWlmIChwaHkyICYgMHgyMCkgewotCQkJCXUzMiBibWNyOwotCi0JCQkJYm54Ml9yZWFkX3BoeShicCwgTUlJX0JNQ1IsICZibWNyKTsKLQkJCQlibWNyIHw9IEJNQ1JfQU5FTkFCTEU7Ci0JCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9CTUNSLCBibWNyKTsKLQotCQkJCWJwLT5waHlfZmxhZ3MgJj0gflBIWV9QQVJBTExFTF9ERVRFQ1RfRkxBRzsKLQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWJwLT5jdXJyZW50X2ludGVydmFsID0gYnAtPnRpbWVyX2ludGVydmFsOwotCi0JCXNwaW5fdW5sb2NrKCZicC0+cGh5X2xvY2spOworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX1NFUkRFU19GTEFHKSB7CisJCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikKKwkJCWJueDJfNTcwNl9zZXJkZXNfdGltZXIoYnApOworCQllbHNlIGlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOCkKKwkJCWJueDJfNTcwOF9zZXJkZXNfdGltZXIoYnApOwogCX0KIAogYm54Ml9yZXN0YXJ0X3RpbWVyOgpAQCAtNDMzOSw5ICs0NDExLDkgQEAKIH0KIAogc3RhdGljIHZvaWQKLWJueDJfcmVzZXRfdGFzayh2b2lkICpkYXRhKQorYm54Ml9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYm54MiAqYnAgPSBkYXRhOworCXN0cnVjdCBibngyICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54MiwgcmVzZXRfdGFzayk7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtPmRldikpCiAJCXJldHVybjsKQEAgLTQ1MDgsOCArNDU4MCw4IEBACiAJcHJvZCA9IE5FWFRfVFhfQkQocHJvZCk7CiAJYnAtPnR4X3Byb2RfYnNlcSArPSBza2ItPmxlbjsKIAotCVJFR19XUjE2KGJwLCBNQl9UWF9DSURfQUREUiArIEJOWDJfTDJDVFhfVFhfSE9TVF9CSURYLCBwcm9kKTsKLQlSRUdfV1IoYnAsIE1CX1RYX0NJRF9BRERSICsgQk5YMl9MMkNUWF9UWF9IT1NUX0JTRVEsIGJwLT50eF9wcm9kX2JzZXEpOworCVJFR19XUjE2KGJwLCBicC0+dHhfYmlkeF9hZGRyLCBwcm9kKTsKKwlSRUdfV1IoYnAsIGJwLT50eF9ic2VxX2FkZHIsIGJwLT50eF9wcm9kX2JzZXEpOwogCiAJbW1pb3diKCk7CiAKQEAgLTQ3NDMsMTAgKzQ4MTUsMTQgQEAKIAl9CiAJZWxzZSB7CiAJCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX1NFUkRFU19GTEFHKSB7Ci0JCQlpZiAoKGNtZC0+c3BlZWQgIT0gU1BFRURfMTAwMCkgfHwKLQkJCQkoY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKSB7CisJCQlpZiAoKGNtZC0+c3BlZWQgIT0gU1BFRURfMTAwMCAmJgorCQkJICAgICBjbWQtPnNwZWVkICE9IFNQRUVEXzI1MDApIHx8CisJCQkgICAgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KKworCQkJaWYgKGNtZC0+c3BlZWQgPT0gU1BFRURfMjUwMCAmJgorCQkJICAgICEoYnAtPnBoeV9mbGFncyAmIFBIWV8yXzVHX0NBUEFCTEVfRkxBRykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJZWxzZSBpZiAoY21kLT5zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ5MDMsMTEgKzQ5NzksMTAgQEAKIAkJbXNsZWVwKDIwKTsKIAogCQlzcGluX2xvY2tfYmgoJmJwLT5waHlfbG9jayk7Ci0JCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwNikgewotCQkJYnAtPmN1cnJlbnRfaW50ZXJ2YWwgPSBTRVJERVNfQU5fVElNRU9VVDsKLQkJCWJwLT5zZXJkZXNfYW5fcGVuZGluZyA9IDE7Ci0JCQltb2RfdGltZXIoJmJwLT50aW1lciwgamlmZmllcyArIGJwLT5jdXJyZW50X2ludGVydmFsKTsKLQkJfQorCisJCWJwLT5jdXJyZW50X2ludGVydmFsID0gU0VSREVTX0FOX1RJTUVPVVQ7CisJCWJwLT5zZXJkZXNfYW5fcGVuZGluZyA9IDE7CisJCW1vZF90aW1lcigmYnAtPnRpbWVyLCBqaWZmaWVzICsgYnAtPmN1cnJlbnRfaW50ZXJ2YWwpOwogCX0KIAogCWJueDJfcmVhZF9waHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7CkBAIC01Mjg4LDYgKzUzNjMsOCBAQAogCiAJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKHU2NCkgKiBCTlgyX05VTV9URVNUUyk7CiAJaWYgKGV0ZXN0LT5mbGFncyAmIEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKKwkJaW50IGk7CisKIAkJYm54Ml9uZXRpZl9zdG9wKGJwKTsKIAkJYm54Ml9yZXNldF9jaGlwKGJwLCBCTlgyX0RSVl9NU0dfQ09ERV9ESUFHKTsKIAkJYm54Ml9mcmVlX3NrYnMoYnApOwpAQCAtNTMxMiw5ICs1Mzg5LDExIEBACiAJCX0KIAogCQkvKiB3YWl0IGZvciBsaW5rIHVwICovCi0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDMwMDApOwotCQlpZiAoKCFicC0+bGlua191cCkgJiYgIShicC0+cGh5X2ZsYWdzICYgUEhZX1NFUkRFU19GTEFHKSkKLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDQwMDApOworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCQlpZiAoYnAtPmxpbmtfdXApCisJCQkJYnJlYWs7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKKwkJfQogCX0KIAogCWlmIChibngyX3Rlc3RfbnZyYW0oYnApICE9IDApIHsKQEAgLTU2MDQsMTMgKzU2ODMsNiBAQAogCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKIAl9CiAKLQlicC0+cGNpeF9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUENJWCk7Ci0JaWYgKGJwLT5wY2l4X2NhcCA9PSAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBmaW5kIFBDSVggY2FwYWJpbGl0eSwgYWJvcnRpbmcuXG4iKTsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKLQl9Ci0KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykgPT0gMCkgewogCQlicC0+ZmxhZ3MgfD0gVVNJTkdfREFDX0ZMQUc7CiAJCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spICE9IDApIHsKQEAgLTU2MzAsMTAgKzU3MDIsMTAgQEAKIAlicC0+cGRldiA9IHBkZXY7CiAKIAlzcGluX2xvY2tfaW5pdCgmYnAtPnBoeV9sb2NrKTsKLQlJTklUX1dPUksoJmJwLT5yZXNldF90YXNrLCBibngyX3Jlc2V0X3Rhc2ssIGJwKTsKKwlJTklUX1dPUksoJmJwLT5yZXNldF90YXNrLCBibngyX3Jlc2V0X3Rhc2spOwogCiAJZGV2LT5iYXNlX2FkZHIgPSBkZXYtPm1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKLQltZW1fbGVuID0gTUJfR0VUX0NJRF9BRERSKDE3KTsKKwltZW1fbGVuID0gTUJfR0VUX0NJRF9BRERSKFRYX1RTU19DSUQgKyAxKTsKIAlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIG1lbV9sZW47CiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAKQEAgLTU2NTcsNiArNTcyOSwxNiBAQAogCiAJYnAtPmNoaXBfaWQgPSBSRUdfUkQoYnAsIEJOWDJfTUlTQ19JRCk7CiAKKwlpZiAoQ0hJUF9OVU0oYnApICE9IENISVBfTlVNXzU3MDkpIHsKKwkJYnAtPnBjaXhfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BDSVgpOworCQlpZiAoYnAtPnBjaXhfY2FwID09IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ2Fubm90IGZpbmQgUENJWCBjYXBhYmlsaXR5LCBhYm9ydGluZy5cbiIpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJfb3V0X3VubWFwOworCQl9CisJfQorCiAJLyogR2V0IGJ1cyBpbmZvcm1hdGlvbi4gKi8KIAlyZWcgPSBSRUdfUkQoYnAsIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTKTsKIAlpZiAocmVnICYgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVNfUENJWF9ERVQpIHsKQEAgLTU3NzYsMTAgKzU4NTgsMTUgQEAKIAlicC0+cGh5X2FkZHIgPSAxOwogCiAJLyogRGlzYWJsZSBXT0wgc3VwcG9ydCBpZiB3ZSBhcmUgcnVubmluZyBvbiBhIFNFUkRFUyBjaGlwLiAqLwotCWlmIChDSElQX0JPTkRfSUQoYnApICYgQ0hJUF9CT05EX0lEX1NFUkRFU19CSVQpIHsKKwlpZiAoQ0hJUF9OVU0oYnApID09IENISVBfTlVNXzU3MDkpIHsKKwkJaWYgKENISVBfQk9ORF9JRChicCkgIT0gQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9CT05EX0lEX0MpCisJCQlicC0+cGh5X2ZsYWdzIHw9IFBIWV9TRVJERVNfRkxBRzsKKwl9IGVsc2UgaWYgKENISVBfQk9ORF9JRChicCkgJiBDSElQX0JPTkRfSURfU0VSREVTX0JJVCkKIAkJYnAtPnBoeV9mbGFncyB8PSBQSFlfU0VSREVTX0ZMQUc7CisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9TRVJERVNfRkxBRykgewogCQlicC0+ZmxhZ3MgfD0gTk9fV09MX0ZMQUc7Ci0JCWlmIChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTcwOCkgeworCQlpZiAoQ0hJUF9OVU0oYnApICE9IENISVBfTlVNXzU3MDYpIHsKIAkJCWJwLT5waHlfYWRkciA9IDI7CiAJCQlyZWcgPSBSRUdfUkRfSU5EKGJwLCBicC0+c2htZW1fYmFzZSArCiAJCQkJCSBCTlgyX1NIQVJFRF9IV19DRkdfQ09ORklHKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDIuaCBiL2RyaXZlcnMvbmV0L2JueDIuaAppbmRleCBjYTMxOTA0Li4xM2I2ZjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyLmgKKysrIGIvZHJpdmVycy9uZXQvYm54Mi5oCkBAIC01Niw2ICs1Niw3IEBACiAKIH07CiAKKyNkZWZpbmUgQk5YMl9SWF9BTElHTgkJCTE2CiAKIC8qCiAgKiAgc3RhdHVzX2Jsb2NrIGRlZmluaXRpb24KQEAgLTkwLDYgKzkxLDcgQEAKIAkJI2RlZmluZSBTVEFUVVNfQVRUTl9CSVRTX0RNQUVfQUJPUlQJCSgxTDw8MjUpCiAJCSNkZWZpbmUgU1RBVFVTX0FUVE5fQklUU19GTFNIX0FCT1JUCQkoMUw8PDI2KQogCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfR1JDX0FCT1JUCQkoMUw8PDI3KQorCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfRVBCX0VSUk9SCQkoMUw8PDMwKQogCQkjZGVmaW5lIFNUQVRVU19BVFROX0JJVFNfUEFSSVRZX0VSUk9SCQkoMUw8PDMxKQogCiAJdTMyIHN0YXR1c19hdHRuX2JpdHNfYWNrOwpAQCAtMTE3LDcgKzExOSw4IEBACiAJdTE2IHN0YXR1c19jb21wbGV0aW9uX3Byb2R1Y2VyX2luZGV4OwogCXUxNiBzdGF0dXNfY21kX2NvbnN1bWVyX2luZGV4OwogCXUxNiBzdGF0dXNfaWR4OwotCXUxNiBzdGF0dXNfdW51c2VkOworCXU4IHN0YXR1c191bnVzZWQ7CisJdTggc3RhdHVzX2Jsa19udW07CiAjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKIAl1MTYgc3RhdHVzX3R4X3F1aWNrX2NvbnN1bWVyX2luZGV4MTsKIAl1MTYgc3RhdHVzX3R4X3F1aWNrX2NvbnN1bWVyX2luZGV4MDsKQEAgLTE0MSw3ICsxNDQsOCBAQAogCXUxNiBzdGF0dXNfcnhfcXVpY2tfY29uc3VtZXJfaW5kZXgxNDsKIAl1MTYgc3RhdHVzX2NtZF9jb25zdW1lcl9pbmRleDsKIAl1MTYgc3RhdHVzX2NvbXBsZXRpb25fcHJvZHVjZXJfaW5kZXg7Ci0JdTE2IHN0YXR1c191bnVzZWQ7CisJdTggc3RhdHVzX2Jsa19udW07CisJdTggc3RhdHVzX3VudXNlZDsKIAl1MTYgc3RhdHVzX2lkeDsKICNlbmRpZgogfTsKQEAgLTMwMSw2ICszMDUsMTAgQEAKICNkZWZpbmUgQk5YMl9MMkNUWF9UWFBfQklEWAkJCQkweDAwMDAwMGE4CiAjZGVmaW5lIEJOWDJfTDJDVFhfVFhQX0JTRVEJCQkJMHgwMDAwMDBhYwogCisjZGVmaW5lIEJOWDJfTDJDVFhfVFlQRV9YSQkJCQkweDAwMDAwMDgwCisjZGVmaW5lIEJOWDJfTDJDVFhfQ01EX1RZUEVfWEkJCQkJMHgwMDAwMDI0MAorI2RlZmluZSBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0hJX1hJCQkJMHgwMDAwMDI1OAorI2RlZmluZSBCTlgyX0wyQ1RYX1RCRFJfQkhBRERSX0xPX1hJCQkJMHgwMDAwMDI1YwogCiAvKgogICogIGwyX2JkX2NoYWluX2NvbnRleHQgZGVmaW5pdGlvbgpAQCAtMzI4LDExICszMzYsMTUgQEAKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUcJCQkJMHgwMDAwMDA2OAogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19UQVJHRVRfQllURV9TV0FQCSAoMUw8PDIpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX1RBUkdFVF9NQl9XT1JEX1NXQVAJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfUkVTRVJWRUQxCQkgKDFMPDw0KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DTE9DS19DVExfRU5BCQkgKDFMPDw1KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19UQVJHRVRfR1JDX1dPUkRfU1dBUAkgKDFMPDw2KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19SRUdfV0lORE9XX0VOQQkJICgxTDw8NykKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQ09SRV9SU1RfUkVRCQkgKDFMPDw4KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX0NPTkZJR19DT1JFX1JTVF9CU1kJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0dSQ19XSU4xX1NXQVBfRU4JICgxTDw8MTApCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0dSQ19XSU4yX1NXQVBfRU4JICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0dSQ19XSU4zX1NXQVBfRU4JICgxTDw8MTIpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfQ09ORklHX0FTSUNfTUVUQUxfUkVWCQkgKDB4ZmZMPDwxNikKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQVNJQ19CQVNFX1JFVgkJICgweGZMPDwyNCkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19DT05GSUdfQVNJQ19JRAkJCSAoMHhmTDw8MjgpCkBAIC0zNDcsNiArMzU5LDcgQEAKICNkZWZpbmUgQk5YMl9QQ0lDRkdfTUlTQ19TVEFUVVNfUENJWF9TUEVFRF8xMDAJCSAoMUw8PDQpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX1BDSVhfU1BFRURfMTMzCQkgKDJMPDw0KQogI2RlZmluZSBCTlgyX1BDSUNGR19NSVNDX1NUQVRVU19QQ0lYX1NQRUVEX1BDSV9NT0RFCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX01JU0NfU1RBVFVTX0JBRF9NRU1fV1JJVEVfQkUJICgxTDw8OCkKIAogI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTCQkweDAwMDAwMDcwCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUENJX0NMS19TUERfREVUCSAoMHhmTDw8MCkKQEAgLTM2Niw3ICszNzksNyBAQAogI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX0FMVF9TUkNfMTIJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzYJICgyTDw8OCkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzYyCSAoNEw8PDgpCi0jZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUExBWV9ERUFECSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX01JTl9QT1dFUgkgKDFMPDwxMSkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRUQJICgweGZMPDwxMikKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfMTAwCSAoMEw8PDEyKQogI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF84MAkgKDFMPDwxMikKQEAgLTM3NCwxOCArMzg3LDIxIEBACiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzQwCSAoNEw8PDEyKQogI2RlZmluZSBCTlgyX1BDSUNGR19QQ0lfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF8yNQkgKDhMPDwxMikKICNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1RPUAkgKDFMPDwxNikKLSNkZWZpbmUgQk5YMl9QQ0lDRkdfUENJX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfUExMX1NUT1AJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRURfMTcJICgxTDw8MTcpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRURfMTgJICgxTDw8MTgpCi0jZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfVVNFX1NQRF9ERVQJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRURfMTkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1BDSV9DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRUQJICgweGZmZkw8PDIwKQogCiAjZGVmaW5lIEJOWDJfUENJQ0ZHX1JFR19XSU5ET1dfQUREUkVTUwkJCTB4MDAwMDAwNzgKKyNkZWZpbmUgQk5YMl9QQ0lDRkdfUkVHX1dJTkRPV19BRERSRVNTX1ZBTAkJICgweGZmZmZmTDw8MikKKwogI2RlZmluZSBCTlgyX1BDSUNGR19SRUdfV0lORE9XCQkJCTB4MDAwMDAwODAKICNkZWZpbmUgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTUQJCQkJMHgwMDAwMDA4NAogI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9JTkRFWAkJCSAoMHhmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9QQ0lDRkdfSU5UX0FDS19DTURfSU5ERVhfVkFMSUQJCSAoMUw8PDE2KQogI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9VU0VfSU5UX0hDX1BBUkFNCSAoMUw8PDE3KQogI2RlZmluZSBCTlgyX1BDSUNGR19JTlRfQUNLX0NNRF9NQVNLX0lOVAkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUENJQ0ZHX0lOVF9BQ0tfQ01EX0lOVEVSUlVQVF9OVU0JCSAoMHhmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9QQ0lDRkdfU1RBVFVTX0JJVF9TRVRfQ01ECQkJMHgwMDAwMDA4OAogI2RlZmluZSBCTlgyX1BDSUNGR19TVEFUVVNfQklUX0NMRUFSX0NNRAkJMHgwMDAwMDA4YwpAQCAtMzk4LDkgKzQxNCwxMSBAQAogICogIG9mZnNldDogMHg0MDAKICAqLwogI2RlZmluZSBCTlgyX1BDSV9HUkNfV0lORE9XX0FERFIJCQkweDAwMDAwNDAwCi0jZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1dfQUREUl9QQ0lfR1JDX1dJTkRPV19BRERSX1ZBTFVFCSAoMHgzZmZmZkw8PDgpCisjZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1dfQUREUl9WQUxVRQkJCSAoMHgxZmZMPDwxMykKKyNkZWZpbmUgQk5YMl9QQ0lfR1JDX1dJTkRPV19BRERSX1NFUF9XSU4JCSAoMUw8PDMxKQogCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18xCQkJCTB4MDAwMDA0MDQKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVTRVJWRUQwCQkJICgweGZmTDw8MCkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWQkJCSAoMHg3TDw8OCkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfUkVBRF9CT1VOREFSWV9PRkYJCSAoMEw8PDgpCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18xX1JFQURfQk9VTkRBUllfMTYJCSAoMUw8PDgpCkBAIC00MTksNiArNDM3LDcgQEAKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfMjU2CQkgKDVMPDwxMSkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfNTEyCQkgKDZMPDwxMSkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzFfV1JJVEVfQk9VTkRBUllfMTAyNAkJICg3TDw8MTEpCisjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18xX1JFU0VSVkVEMQkJCSAoMHgzZmZmZkw8PDE0KQogCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yCQkJCTB4MDAwMDA0MDgKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQkFSMV9TSVpFCQkJICgweGZMPDwwKQpAQCAtNDY4LDkgKzQ4NywxMyBAQAogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9GT1JDRV8zMl9CSVRfTVNUUgkJICgxTDw8MjMpCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18yX0ZPUkNFXzMyX0JJVF9UR1QJCSAoMUw8PDI0KQogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9LRUVQX1JFUV9BU1NFUlQJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMl9SRVNFUlZFRDAJCQkgKDB4M2ZMPDwyNikKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfQkFSX1BSRUZFVENIX1hJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzJfUkVTRVJWRUQwX1hJCQkJICgweDdmZmZMPDwxNykKIAogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfMwkJCQkweDAwMDAwNDBjCiAjZGVmaW5lIEJOWDJfUENJX0NPTkZJR18zX1NUSUNLWV9CWVRFCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzNfUkVHX1NUSUNLWV9CWVRFCQkgKDB4ZmZMPDw4KQogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfM19GT1JDRV9QTUUJCQkgKDFMPDwyNCkKICNkZWZpbmUgQk5YMl9QQ0lfQ09ORklHXzNfUE1FX1NUQVRVUwkJCSAoMUw8PDI1KQogI2RlZmluZSBCTlgyX1BDSV9DT05GSUdfM19QTUVfRU5BQkxFCQkJICgxTDw8MjYpCkBAIC01MDEsOCArNTI0LDEwIEBACiAjZGVmaW5lIEJOWDJfUENJX1ZQRF9JTlRGX0lOVEZfUkVRCQkJICgxTDw8MCkKIAogI2RlZmluZSBCTlgyX1BDSV9WUERfQUREUl9GTEFHCQkJCTB4MDAwMDA0MmMKLSNkZWZpbmUgQk5YMl9QQ0lfVlBEX0FERFJfRkxBR19BRERSRVNTCQkJICgweDFmZmY8PDIpCi0jZGVmaW5lIEJOWDJfUENJX1ZQRF9BRERSX0ZMQUdfV1IJCQkgKDE8PDE1KQorI2RlZmluZSBCTlgyX1BDSV9WUERfQUREUl9GTEFHX01TSwkJCTB4MDAwMGZmZmYKKyNkZWZpbmUgQk5YMl9QQ0lfVlBEX0FERFJfRkxBR19TTAkJCTBMCisjZGVmaW5lIEJOWDJfUENJX1ZQRF9BRERSX0ZMQUdfQUREUkVTUwkJCSAoMHgxZmZmTDw8MikKKyNkZWZpbmUgQk5YMl9QQ0lfVlBEX0FERFJfRkxBR19XUgkJCSAoMUw8PDE1KQogCiAjZGVmaW5lIEJOWDJfUENJX1ZQRF9EQVRBCQkJCTB4MDAwMDA0MzAKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMMQkJCQkweDAwMDAwNDM0CkBAIC01MzUsMTkgKzU2MCwyNiBAQAogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X0NBUF9FTkFfMTMJCQkgKDEzTDw8MCkKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9DQVBfRU5BXzE0CQkJICgxNEw8PDApCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfQ0FQX0VOQV8xNQkJCSAoMTVMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X1JFU0VSVkVEMAkJCSAoMHgzTDw8NCkKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9QTV9TQ0FMRV9QUkcJCQkgKDB4M0w8PDYpCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfUE1fU0NBTEVfUFJHXzAJCQkgKDBMPDw2KQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X1BNX1NDQUxFX1BSR18xCQkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9QTV9TQ0FMRV9QUkdfMgkJCSAoMkw8PDYpCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfUE1fU0NBTEVfUFJHXzMJCQkgKDNMPDw2KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01TSV9QVl9NQVNLX0NBUAkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NU0lfTElNSVQJCQkgKDB4N0w8PDkpCi0jZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTVNJX0FEVkVSVElaRQkJCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTVVMVElfTVNHX0NBUAkJCSAoMHg3TDw8MTIpCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTVNJX0VOQUJMRQkJCSAoMUw8PDE1KQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF82NF9BRFZFUlRJWkUJCSAoMUw8PDE2KQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF8xMzNfQURWRVJUSVpFCQkgKDFMPDwxNykKLSNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NQVhfTUVNX1JFQURfU0laRQkJICgweDNMPDwyMSkKLSNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NQVhfU1BMSVRfU0laRQkJCSAoMHg3TDw8MjMpCi0jZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTUFYX0NVTVVMQVRJVkVfU0laRQkJICgweDdMPDwyNikKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9SRVNFUlZFRDIJCQkgKDB4N0w8PDE4KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF9DVU1VTEFUSVZFX1NJWkVfQjIxCSAoMHgzTDw8MjEpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfTUFYX1NQTElUX1NJWkVfQjIxCQkgKDB4M0w8PDIzKQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF9DVU1VTEFUSVZFX1NJWkVfQjAJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw0X01BWF9NRU1fUkVBRF9TSVpFX0IxMAkJICgweDNMPDwyNikKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9NQVhfU1BMSVRfU0laRV9CMAkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDRfUkVTRVJWRUQzCQkJICgweDdMPDwyOSkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNF9SRVNFUlZFRDNfWEkJCQkgKDB4ZmZmZkw8PDE2KQogCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDUJCQkJMHgwMDAwMDQ0NAogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X0QxX1NVUFBPUlQJCQkgKDFMPDwwKQpAQCAtNTU2LDYgKzU4OCwxMCBAQAogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X1BNRV9JTl9EMQkJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDVfUE1FX0lOX0QyCQkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNV9QTUVfSU5fRDNfSE9UCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNV9SRVNFUlZFRDBfVEUJCQkgKDB4M2ZmZmZmZkw8PDYpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDVfUE1fVkVSU0lPTl9YSQkJCSAoMHg3TDw8NikKKyNkZWZpbmUgQk5YMl9QQ0lfSURfVkFMNV9OT19TT0ZUX1JFU0VUX1hJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw1X1JFU0VSVkVEMF9YSQkJCSAoMHgzZmZmZmZMPDwxMCkKIAogI2RlZmluZSBCTlgyX1BDSV9QQ0lYX0VYVEVOREVEX1NUQVRVUwkJCTB4MDAwMDA0NDgKICNkZWZpbmUgQk5YMl9QQ0lfUENJWF9FWFRFTkRFRF9TVEFUVVNfTk9fU05PT1AJCSAoMUw8PDgpCkBAIC01NjcsMTIgKzYwMyw5MSBAQAogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw2X01BWF9MQVQJCQkgKDB4ZmZMPDwwKQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw2X01JTl9HTlQJCQkgKDB4ZmZMPDw4KQogI2RlZmluZSBCTlgyX1BDSV9JRF9WQUw2X0JJU1QJCQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUENJX0lEX1ZBTDZfUkVTRVJWRUQwCQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9QQ0lfTVNJX0RBVEEJCQkJMHgwMDAwMDQ1MAotI2RlZmluZSBCTlgyX1BDSV9NU0lfREFUQV9QQ0lfTVNJX0RBVEEJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUENJX01TSV9EQVRBX01TSV9EQVRBCQkJICgweGZmZmZMPDwwKQogCiAjZGVmaW5lIEJOWDJfUENJX01TSV9BRERSX0gJCQkJMHgwMDAwMDQ1NAogI2RlZmluZSBCTlgyX1BDSV9NU0lfQUREUl9MCQkJCTB4MDAwMDA0NTgKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJX0FERFJfTF9WQUwJCQkJICgweDNmZmZmZmZmTDw8MikKKworI2RlZmluZSBCTlgyX1BDSV9DRkdfQUNDRVNTX0NNRAkJCQkweDAwMDAwNDVjCisjZGVmaW5lIEJOWDJfUENJX0NGR19BQ0NFU1NfQ01EX0FEUgkJCSAoMHgzZkw8PDIpCisjZGVmaW5lIEJOWDJfUENJX0NGR19BQ0NFU1NfQ01EX1JEX1JFUQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1BDSV9DRkdfQUNDRVNTX0NNRF9XUl9SRVEJCQkgKDB4Zkw8PDI4KQorCisjZGVmaW5lIEJOWDJfUENJX0NGR19BQ0NFU1NfREFUQQkJCTB4MDAwMDA0NjAKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJX01BU0sJCQkJMHgwMDAwMDQ2NAorI2RlZmluZSBCTlgyX1BDSV9NU0lfTUFTS19NU0lfTUFTSwkJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJX1BFTkQJCQkJMHgwMDAwMDQ2OAorI2RlZmluZSBCTlgyX1BDSV9NU0lfUEVORF9NU0lfUEVORAkJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9QQ0lfUE1fREFUQV9DCQkJCTB4MDAwMDA0NmMKKyNkZWZpbmUgQk5YMl9QQ0lfUE1fREFUQV9DX1BNX0RBVEFfOF9QUkcJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUENJX1BNX0RBVEFfQ19SRVNFUlZFRDAJCQkgKDB4ZmZmZmZmTDw8OCkKKworI2RlZmluZSBCTlgyX1BDSV9NU0lYX0NPTlRST0wJCQkJMHgwMDAwMDRjMAorI2RlZmluZSBCTlgyX1BDSV9NU0lYX0NPTlRST0xfTVNJWF9UQkxfU0laCQkgKDB4N2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfTVNJWF9DT05UUk9MX1JFU0VSVkVEMAkJCSAoMHgxZmZmZmZMPDwxMSkKKworI2RlZmluZSBCTlgyX1BDSV9NU0lYX1RCTF9PRkZfQklSCQkJMHgwMDAwMDRjNAorI2RlZmluZSBCTlgyX1BDSV9NU0lYX1RCTF9PRkZfQklSX01TSVhfVEJMX0JJUgkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9NU0lYX1RCTF9PRkZfQklSX01TSVhfVEJMX09GRgkJICgweDFmZmZmZmZmTDw8MykKKworI2RlZmluZSBCTlgyX1BDSV9NU0lYX1BCQV9PRkZfQklUCQkJMHgwMDAwMDRjOAorI2RlZmluZSBCTlgyX1BDSV9NU0lYX1BCQV9PRkZfQklUX01TSVhfUEJBX0JJUgkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9NU0lYX1BCQV9PRkZfQklUX01TSVhfUEJBX09GRgkJICgweDFmZmZmZmZmTDw8MykKKworI2RlZmluZSBCTlgyX1BDSV9QQ0lFX0NBUEFCSUxJVFkJCQkweDAwMDAwNGQwCisjZGVmaW5lIEJOWDJfUENJX1BDSUVfQ0FQQUJJTElUWV9JTlRFUlJVUFRfTVNHX05VTQkgKDB4MWZMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9QQ0lFX0NBUEFCSUxJVFlfQ09NUExZX1BDSUVfMV8xCSAoMUw8PDUpCisKKyNkZWZpbmUgQk5YMl9QQ0lfREVWSUNFX0NBUEFCSUxJVFkJCQkweDAwMDAwNGQ0CisjZGVmaW5lIEJOWDJfUENJX0RFVklDRV9DQVBBQklMSVRZX01BWF9QTF9TSVpfU1VQUE9SVEVECSAoMHg3TDw8MCkKKyNkZWZpbmUgQk5YMl9QQ0lfREVWSUNFX0NBUEFCSUxJVFlfRVhURU5ERURfVEFHX1NVUFBPUlQJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9QQ0lfREVWSUNFX0NBUEFCSUxJVFlfTDBTX0FDQ0VQVEFCTEVfTEFURU5DWQkgKDB4N0w8PDYpCisjZGVmaW5lIEJOWDJfUENJX0RFVklDRV9DQVBBQklMSVRZX0wxX0FDQ0VQVEFCTEVfTEFURU5DWQkgKDB4N0w8PDkpCisjZGVmaW5lIEJOWDJfUENJX0RFVklDRV9DQVBBQklMSVRZX1JPTEVfQkFTRURfRVJSX1JQVAkgKDFMPDwxNSkKKworI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFkJCQkweDAwMDAwNGRjCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9NQVhfTElOS19TUEVFRAkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTUFYX0xJTktfU1BFRURfMDAwMQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTUFYX0xJTktfU1BFRURfMDAxMAkgKDFMPDwwKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTUFYX0xJTktfV0lEVEgJCSAoMHgxZkw8PDQpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9DTEtfUE9XRVJfTUdNVAkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9QQ0lfTElOS19DQVBBQklMSVRZX0FTUE1fU1VQUE9SVAkJICgweDNMPDwxMCkKKyNkZWZpbmUgQk5YMl9QQ0lfTElOS19DQVBBQklMSVRZX0wwU19FWElUX0xBVAkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9QQ0lfTElOS19DQVBBQklMSVRZX0wwU19FWElUX0xBVF8xMDEJICg1TDw8MTIpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMFNfRVhJVF9MQVRfMTEwCSAoNkw8PDEyKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDFfRVhJVF9MQVQJCSAoMHg3TDw8MTUpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMV9FWElUX0xBVF8wMDEJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMV9FWElUX0xBVF8wMTAJICgyTDw8MTUpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMFNfRVhJVF9DT01NX0xBVAkgKDB4N0w8PDE4KQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDBTX0VYSVRfQ09NTV9MQVRfMTAxCSAoNUw8PDE4KQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDBTX0VYSVRfQ09NTV9MQVRfMTEwCSAoNkw8PDE4KQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDFfRVhJVF9DT01NX0xBVAkgKDB4N0w8PDIxKQorI2RlZmluZSBCTlgyX1BDSV9MSU5LX0NBUEFCSUxJVFlfTDFfRVhJVF9DT01NX0xBVF8wMDEJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfUENJX0xJTktfQ0FQQUJJTElUWV9MMV9FWElUX0NPTU1fTEFUXzAxMAkgKDJMPDwyMSkKKyNkZWZpbmUgQk5YMl9QQ0lfTElOS19DQVBBQklMSVRZX1BPUlRfTlVNCQkgKDB4ZmZMPDwyNCkKKworI2RlZmluZSBCTlgyX1BDSV9QQ0lFX0RFVklDRV9DQVBBQklMSVRZXzIJCTB4MDAwMDA0ZTQKKyNkZWZpbmUgQk5YMl9QQ0lfUENJRV9ERVZJQ0VfQ0FQQUJJTElUWV8yX0NNUExfVE9fUkFOR0VfU1VQUAkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfUENJX1BDSUVfREVWSUNFX0NBUEFCSUxJVFlfMl9DTVBMX1RPX0RJU0FCTF9TVVBQCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfUENJX1BDSUVfREVWSUNFX0NBUEFCSUxJVFlfMl9SRVNFUlZFRAkgKDB4N2ZmZmZmZkw8PDUpCisKKyNkZWZpbmUgQk5YMl9QQ0lfUENJRV9MSU5LX0NBUEFCSUxJVFlfMgkJCTB4MDAwMDA0ZTgKKyNkZWZpbmUgQk5YMl9QQ0lfUENJRV9MSU5LX0NBUEFCSUxJVFlfMl9SRVNFUlZFRAkgKDB4ZmZmZmZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1cxX0FERFIJCQkweDAwMDAwNjEwCisjZGVmaW5lIEJOWDJfUENJX0dSQ19XSU5ET1cxX0FERFJfVkFMVUUJCQkgKDB4MWZmTDw8MTMpCisKKyNkZWZpbmUgQk5YMl9QQ0lfR1JDX1dJTkRPVzJfQUREUgkJCTB4MDAwMDA2MTQKKyNkZWZpbmUgQk5YMl9QQ0lfR1JDX1dJTkRPVzJfQUREUl9WQUxVRQkJCSAoMHgxZmZMPDwxMykKKworI2RlZmluZSBCTlgyX1BDSV9HUkNfV0lORE9XM19BRERSCQkJMHgwMDAwMDYxOAorI2RlZmluZSBCTlgyX1BDSV9HUkNfV0lORE9XM19BRERSX1ZBTFVFCQkJICgweDFmZkw8PDEzKQogCiAKIC8qCkBAIC01ODIsMTMgKzY5NywyMyBAQAogI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORAkJCQkweDAwMDAwODAwCiAjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0VOQUJMRV9BTEwJCQkgKDFMPDwwKQogI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9ESVNBQkxFX0FMTAkJCSAoMUw8PDEpCi0jZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0NPUkVfUkVTRVQJCQkgKDFMPDw0KQotI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9IQVJEX1JFU0VUCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfU1dfUkVTRVQJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9QT1JfUkVTRVQJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9IRF9SRVNFVAkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0NNTl9TV19SRVNFVAkJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX1BBUl9FUlJPUgkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DT01NQU5EX0NTMTZfRVJSCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfQ1MxNl9FUlJfTE9DCQkJICgweGZMPDwxMikKICNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfUEFSX0VSUl9SQU0JCQkgKDB4N2ZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfUE9XRVJET1dOX0VWRU5UCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfU1dfU0hVVERPV04JCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfU0hVVERPV05fRU4JCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfRElOVEVHX0FUVE5fRU4JCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfQ09NTUFORF9QQ0lFX0xJTktfSU5fTDIzCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX0NPTU1BTkRfUENJRV9ESVMJCQkgKDFMPDwyOCkKIAogI2RlZmluZSBCTlgyX01JU0NfQ0ZHCQkJCQkweDAwMDAwODA0Ci0jZGVmaW5lIEJOWDJfTUlTQ19DRkdfUENJX0dSQ19UTU9VVAkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfR1JDX1RNT1VUCQkJCSAoMUw8PDApCiAjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTlZNX1dSX0VOCQkJCSAoMHgzTDw8MSkKICNkZWZpbmUgQk5YMl9NSVNDX0NGR19OVk1fV1JfRU5fUFJPVEVDVAkJCSAoMEw8PDEpCiAjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTlZNX1dSX0VOX1BDSQkJCSAoMUw8PDEpCkBAIC01OTYsMTYgKzcyMSw0NSBAQAogI2RlZmluZSBCTlgyX01JU0NfQ0ZHX05WTV9XUl9FTl9BTExPVzIJCQkgKDNMPDwxKQogI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0JJU1RfRU4JCQkJICgxTDw8MykKICNkZWZpbmUgQk5YMl9NSVNDX0NGR19DSzI1X09VVF9BTFRfU1JDCQkJICgxTDw8NCkKLSNkZWZpbmUgQk5YMl9NSVNDX0NGR19CWVBBU1NfQlNDQU4JCQkgKDFMPDw1KQotI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0JZUEFTU19FSlRBRwkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfUkVTRVJWRUQ1X1RFCQkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19SRVNFUlZFRDZfVEUJCQkgKDFMPDw2KQogI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0NMS19DVExfT1ZFUlJJREUJCQkgKDFMPDw3KQotI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREUJCQkJICgweDNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREUJCQkJICgweDdMPDw4KQogI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfTUFDCQkJICgwTDw8OCkKLSNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX0dQSFkxCQkJICgxTDw8OCkKLSNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX0dQSFkyCQkJICgyTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTFfVEUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZMl9URQkJCSAoMkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFkzX1RFCQkJICgzTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTRfVEUJCQkgKDRMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZNV9URQkJCSAoNUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFk2X1RFCQkJICg2TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTdfVEUJCQkgKDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX01DUF9HUkNfVE1PVVRfVEUJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19EQlVfR1JDX1RNT1VUX1RFCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9YSQkJCSAoMHhmTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX01BQ19YSQkJCSAoMEw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFkxX1hJCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTJfWEkJCQkgKDJMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZM19YSQkJCSAoM0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9NQUMyX1hJCQkJICg0TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1BIWTRfWEkJCQkgKDVMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZNV9YSQkJCSAoNkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFk2X1hJCQkJICg3TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX01BQzNfWEkJCQkgKDhMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZN19YSQkJCSAoOUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFk4X1hJCQkJICgxMEw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFk5X1hJCQkJICgxMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9NQUM0X1hJCQkJICgxMkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfTEVETU9ERV9QSFkxMF9YSQkJCSAoMTNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX0xFRE1PREVfUEhZMTFfWEkJCQkgKDE0TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NGR19MRURNT0RFX1VOVVNFRF9YSQkJCSAoMTVMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ0ZHX1BPUlRfU0VMRUNUX1hJCQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUlTQ19DRkdfUEFSSVRZX01PREVfWEkJCQkgKDFMPDwxNCkKIAogI2RlZmluZSBCTlgyX01JU0NfSUQJCQkJCTB4MDAwMDA4MDgKICNkZWZpbmUgQk5YMl9NSVNDX0lEX0JPTkRfSUQJCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfSURfQk9ORF9JRF9YCQkJCSAoMEw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19JRF9CT05EX0lEX0MJCQkJICgzTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0lEX0JPTkRfSURfUwkJCQkgKDEyTDw8MCkKICNkZWZpbmUgQk5YMl9NSVNDX0lEX0NISVBfTUVUQUwJCQkJICgweGZmTDw8NCkKICNkZWZpbmUgQk5YMl9NSVNDX0lEX0NISVBfUkVWCQkJCSAoMHhmTDw8MTIpCiAjZGVmaW5lIEJOWDJfTUlTQ19JRF9DSElQX05VTQkJCQkgKDB4ZmZmZkw8PDE2KQpAQCAtNjM5LDYgKzc5Myw4IEBACiAjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfVElNRVJfRU5BQkxFCSAoMUw8PDI1KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX0RNQV9FTkdJTkVfRU5BQkxFCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1VNUF9FTkFCTEUJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NUQVRVU19CSVRTX1JWMlBfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU1RBVFVTX0JJVFNfUlNWRF9GVVRVUkVfRU5BQkxFCSAoMHg3TDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUUwkJCTB4MDAwMDA4MTAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19UWF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDApCkBAIC02NjksNiArODI1LDggQEAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9TRVRfQklUU19USU1FUl9FTkFCTEUJCSAoMUw8PDI1KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX0RNQV9FTkdJTkVfRU5BQkxFCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1VNUF9FTkFCTEUJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX1NFVF9CSVRTX1JWMlBfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfU0VUX0JJVFNfUlNWRF9GVVRVUkVfRU5BQkxFCSAoMHg3TDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUUwkJCTB4MDAwMDA4MTQKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19UWF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDApCkBAIC02OTksNiArODU3LDggQEAKICNkZWZpbmUgQk5YMl9NSVNDX0VOQUJMRV9DTFJfQklUU19USU1FUl9FTkFCTEUJCSAoMUw8PDI1KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX0RNQV9FTkdJTkVfRU5BQkxFCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1VNUF9FTkFCTEUJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfRU5BQkxFX0NMUl9CSVRTX1JWMlBfQ01EX1NDSEVEVUxFUl9FTkFCTEUJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19FTkFCTEVfQ0xSX0JJVFNfUlNWRF9GVVRVUkVfRU5BQkxFCSAoMHg3TDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUUwkJCTB4MDAwMDA4MTgKICNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19QQ0lfQ0xLX1NQRF9ERVQJICgweGZMPDwwKQpAQCAtNzE4LDMwICs4NzgsNDEgQEAKICNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfU1JDXzEyCSAoMUw8PDgpCiAjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUX1NSQ182CSAoMkw8PDgpCiAjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfQUxUX1NSQ182MgkgKDRMPDw4KQotI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BMQVlfREVBRAkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfUkVTRVJWRUQwX1hJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19NSU5fUE9XRVIJCSAoMUw8PDExKQogI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRAkgKDB4Zkw8PDEyKQogI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF8xMDAJICgwTDw8MTIpCiAjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzgwCSAoMUw8PDEyKQogI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TUEVFRF81MAkgKDJMPDwxMikKICNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfNDAJICg0TDw8MTIpCiAjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1NQRUVEXzI1CSAoOEw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEMV9YSQkgKDB4Zkw8PDEyKQogI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX0NPUkVfQ0xLX1BMTF9TVE9QCSAoMUw8PDE2KQotI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1BDSV9QTExfU1RPUAkgKDFMPDwxNykKLSNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19SRVNFUlZFRF8xOAkgKDFMPDwxOCkKLSNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19VU0VfU1BEX0RFVAkgKDFMPDwxOSkKLSNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19SRVNFUlZFRAkJICgweGZmZkw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEXzE3X1RFCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEXzE4X1RFCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEXzE5X1RFCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEX1RFCSAoMHhmZmZMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19BTFRfTUdNVF9YSQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19SRVNFUlZFRDJfWEkJICgweDNmTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19DTE9DS19DT05UUk9MX0JJVFNfQ09SRV9DTEtfUExMX1ZDT19YSQkgKDB4N0w8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfQ0xPQ0tfQ09OVFJPTF9CSVRTX1JFU0VSVkVEM19YSQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX0NMT0NLX0NPTlRST0xfQklUU19DT1JFX0NMS19QTExfU1BFRURfWEkJICgweGZMPDwyOCkKIAotI2RlZmluZSBCTlgyX01JU0NfR1BJTwkJCQkJMHgwMDAwMDgxYwotI2RlZmluZSBCTlgyX01JU0NfR1BJT19WQUxVRQkJCQkgKDB4ZmZMPDwwKQotI2RlZmluZSBCTlgyX01JU0NfR1BJT19TRVQJCQkJICgweGZmTDw8OCkKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fQ0xSCQkJCSAoMHhmZkw8PDE2KQotI2RlZmluZSBCTlgyX01JU0NfR1BJT19GTE9BVAkJCQkgKDB4ZmZMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU8JCQkJCTB4MDAwMDA4MWMKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fVkFMVUUJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fU0VUCQkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0NMUgkJCQkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fRkxPQVQJCQkJICgweGZmTDw8MjQpCiAKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fSU5UCQkJCTB4MDAwMDA4MjAKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fSU5UX0lOVF9TVEFURQkJCSAoMHhmTDw8MCkKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fSU5UX09MRF9WQUxVRQkJCSAoMHhmTDw8OCkKLSNkZWZpbmUgQk5YMl9NSVNDX0dQSU9fSU5UX09MRF9TRVQJCQkgKDB4Zkw8PDE2KQotI2RlZmluZSBCTlgyX01JU0NfR1BJT19JTlRfT0xEX0NMUgkJCSAoMHhmTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVAkJCQkweDAwMDAwODIwCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9JTlRfU1RBVEVfVEUJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9PTERfVkFMVUVfVEUJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9PTERfU0VUX1RFCQkJICgweGZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fSU5UX09MRF9DTFJfVEUJCQkgKDB4Zkw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfU1BJT19JTlRfSU5UX1NUQVRFX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NQSU9fSU5UX09MRF9WQUxVRV9YSQkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9PTERfU0VUX1hJCQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0lOVF9PTERfQ0xSX1hJCQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0NPTkZJR19MRlNSCQkJCTB4MDAwMDA4MjQKICNkZWZpbmUgQk5YMl9NSVNDX0NPTkZJR19MRlNSX0RJVgkJCSAoMHhmZmZmTDw8MCkKQEAgLTc3NSw2ICs5NDYsOCBAQAogI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfVElNRVJfRU5BQkxFCQkgKDFMPDwyNSkKICNkZWZpbmUgQk5YMl9NSVNDX0xGU1JfTUFTS19CSVRTX0RNQV9FTkdJTkVfRU5BQkxFCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfVU1QX0VOQUJMRQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfTUlTQ19MRlNSX01BU0tfQklUU19SVjJQX0NNRF9TQ0hFRFVMRVJfRU5BQkxFCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX01JU0NfTEZTUl9NQVNLX0JJVFNfUlNWRF9GVVRVUkVfRU5BQkxFCSAoMHg3TDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVEwCQkJCTB4MDAwMDA4MmMKICNkZWZpbmUgQk5YMl9NSVNDX0FSQl9SRVExCQkJCTB4MDAwMDA4MzAKQEAgLTgzMSwyMiArMTAwNCwxMiBAQAogI2RlZmluZSBCTlgyX01JU0NfQVJCX0dOVDNfMzAJCQkJICgweDdMPDwyNCkKICNkZWZpbmUgQk5YMl9NSVNDX0FSQl9HTlQzXzMxCQkJCSAoMHg3TDw8MjgpCiAKLSNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfQ09OVFJPTAkJCQkweDAwMDAwODc4Ci0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfRU4JCQkgKDFMPDwwKQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX1JTVEIJCQkgKDFMPDwxKQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX0lOVgkJCSAoMUw8PDIpCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfRVJSX0NMUgkJCSAoMUw8PDMpCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVIJCQkgKDB4M0w8PDQpCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVJfN1RICQkgKDBMPDw0KQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19DT05UUk9MX09SREVSXzE1VEgJCSAoMUw8PDQpCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX0NPTlRST0xfT1JERVJfMjNSRAkJICgyTDw8NCkKLSNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfQ09OVFJPTF9PUkRFUl8zMVNUCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUkVTRVJWRUQxCQkJCTB4MDAwMDA4NzgKKyNkZWZpbmUgQk5YMl9NSVNDX1JFU0VSVkVEMV9NSVNDX1JFU0VSVkVEMV9WQUxVRQkgKDB4M2ZMPDwwKQogCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX1NUQVRVUwkJCQkweDAwMDAwODdjCi0jZGVmaW5lIEJOWDJfTUlTQ19QUkJTX1NUQVRVU19MT0NLCQkJICgxTDw8MCkKLSNkZWZpbmUgQk5YMl9NSVNDX1BSQlNfU1RBVFVTX1NUS1kJCQkgKDFMPDwxKQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19TVEFUVVNfRVJST1JTCQkJICgweDNmZmZMPDwyKQotI2RlZmluZSBCTlgyX01JU0NfUFJCU19TVEFUVVNfU1RBVEUJCQkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfUkVTRVJWRUQyCQkJCTB4MDAwMDA4N2MKKyNkZWZpbmUgQk5YMl9NSVNDX1JFU0VSVkVEMl9QQ0lFX0RJUwkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19SRVNFUlZFRDJfTElOS19JTl9MMjMJCQkgKDFMPDwxKQogCiAjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTAkJCTB4MDAwMDA4ODAKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX0FTRl9SU1QJCSAoMUw8PDApCkBAIC04NTcsMTMgKzEwMjAsMTUgQEAKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1BMX1RPCQkJICgxTDw8NSkKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1JUX1RPCQkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9FVkVOVAkJICgxTDw8NykKLSNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1JFUwkJCSAoMHhmTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NUUkVUQ0hfRU4JCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9TVFJFVENIX1BVTFNFCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfUkVTCQkJICgweDNMPDwxMCkKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9FTgkJCSAoMUw8PDEyKQogI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfU01CX0JCX0VOCQkgKDFMPDwxMykKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9OT19BRERSX0ZJTFQJICgxTDw8MTQpCiAjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9TTUJfQVVUT1JFQUQJCSAoMUw8PDE1KQotI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfTklDX1NNQl9BRERSMQkJICgweDNmTDw8MTYpCi0jZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9OSUNfU01CX0FERFIyCQkgKDB4M2ZMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX05JQ19TTUJfQUREUjEJCSAoMHg3Zkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfU01fQVNGX0NPTlRST0xfTklDX1NNQl9BRERSMgkJICgweDdmTDw8MjMpCiAjZGVmaW5lIEJOWDJfTUlTQ19TTV9BU0ZfQ09OVFJPTF9FTl9OSUNfU01CX0FERFJfMAkgKDFMPDwzMCkKICNkZWZpbmUgQk5YMl9NSVNDX1NNX0FTRl9DT05UUk9MX1NNQl9FQVJMWV9BVFROCQkgKDFMPDwzMSkKIApAQCAtODkxLDEzICsxMDU2LDEzIEBACiAjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTCQkgKDB4Zkw8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19PSwkJICgwTDw8MjApCiAjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX0ZJUlNUX05BQ0sJICgxTDw8MjApCi0jZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX1NVQl9OQUNLCSAoOUw8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19VRkxPVwkJICgyTDw8MjApCiAjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfU1RBVFVTX1NUT1AJCSAoM0w8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19USU1FT1VUCSAoNEw8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19GSVJTVF9MT1NUCSAoNUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19CQURBQ0sJCSAoNkw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NUQVRVU19TVUJfTkFDSwkgKDlMPDwyMCkKICNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX09VVF9TVEFUVVNfU1VCX0xPU1QJICgweGRMPDwyMCkKLSNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX09VVF9TVEFUVVNfQkFEQUNLCQkgKDB4Nkw8PDIwKQogI2RlZmluZSBCTlgyX01JU0NfU01CX09VVF9TTUJfT1VUX1NMQVZFTU9ERQkJICgxTDw8MjQpCiAjZGVmaW5lIEJOWDJfTUlTQ19TTUJfT1VUX1NNQl9PVVRfREFUX0VOCQkgKDFMPDwyNSkKICNkZWZpbmUgQk5YMl9NSVNDX1NNQl9PVVRfU01CX09VVF9EQVRfSU4JCSAoMUw8PDI2KQpAQCAtOTU1LDYgKzExMjAsMzggQEAKICNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SREVfTUlTQ19SUEMJCSAoMUw8PDI5KQogI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JERV9NSVNDX1JQTQkJICgxTDw8MzApCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfUlYyUF9NSVNDX0NCMFJFR1MJCSAoMUw8PDMxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NPTV9ETUFFX1BFUlJfRU5fWEkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ1BfRE1BRV9QRVJSX0VOX1hJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JQTV9BQ1BJQkVNRU1fUEVSUl9FTl9YSQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NUWF9VU0FHRV9DTlRfUEVSUl9FTl9YSQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NUWF9QR1RCTF9QRVJSX0VOX1hJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ1RYX0NBQ0hFX1BFUlJfRU5fWEkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DVFhfTUlSUk9SX1BFUlJfRU5fWEkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DT01fQ1RYQ19QRVJSX0VOX1hJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NPTV9TQ1BBRF9QRVJSX0VOX1hJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfQ1BfQ1RYQ19QRVJSX0VOX1hJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX0NQX1NDUEFEX1BFUlJfRU5fWEkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JYUF9SQlVGQ19QRVJSX0VOX1hJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JYUF9DVFhDX1BFUlJfRU5fWEkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JYUF9TQ1BBRF9QRVJSX0VOX1hJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1RQQVRfU0NQQURfUEVSUl9FTl9YSQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9UWFBfQ1RYQ19QRVJSX0VOX1hJCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9UWFBfU0NQQURfUEVSUl9FTl9YSQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9DU19UTUVNX1BFUlJfRU5fWEkJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX01RX0NUWF9QRVJSX0VOX1hJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SUE1fREZJRk9NRU1fUEVSUl9FTl9YSQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SUENfREZJRk9NRU1fUEVSUl9FTl9YSQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SQlVGX1BUUk1FTV9QRVJSX0VOX1hJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JCVUZfREFUQU1FTV9QRVJSX0VOX1hJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1JWMlBfUDJJUkFNX1BFUlJfRU5fWEkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfUlYyUF9QMUlSQU1fUEVSUl9FTl9YSQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SVjJQX0NCMVJFR1NfUEVSUl9FTl9YSQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9SVjJQX0NCMFJFR1NfUEVSUl9FTl9YSQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9UUEJVRl9QRVJSX0VOX1hJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9USEJVRl9QRVJSX0VOX1hJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMF9URE1BX1BFUlJfRU5fWEkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEwX1RCRENfUEVSUl9FTl9YSQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTBfVFNDSF9MUl9QRVJSX0VOX1hJCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExCQkJCTB4MDAwMDA4YTgKICNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9SVjJQX01JU0NfQ0IxUkVHUwkJICgxTDw8MCkKQEAgLTk4OSw2ICsxMTg2LDM1IEBACiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQUV9NSVNDCQkJICgxTDw8MjkpCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQQ1FfTUlTQwkJCSAoMUw8PDMwKQogI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JMVVBRX01JU0MJCQkgKDFMPDwzMSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9SQkRDX1BFUlJfRU5fWEkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUkRNQV9ERklGT19QRVJSX0VOX1hJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfSENfU1RBVFNfUEVSUl9FTl9YSQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9IQ19NU0lYX1BFUlJfRU5fWEkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfSENfUFJPRFVDU1RCX1BFUlJfRU5fWEkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9IQ19DT05TVU1TVEJfUEVSUl9FTl9YSQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RQQVRRX1BFUlJfRU5fWEkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfTUNQUV9QRVJSX0VOX1hJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RETUFRX1BFUlJfRU5fWEkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVFhQUV9QRVJSX0VOX1hJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9DT01UUV9QRVJSX0VOX1hJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9DT01RX1BFUlJfRU5fWEkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JMVVBRX1BFUlJfRU5fWEkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JYUFFfUEVSUl9FTl9YSQkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUFBRX1BFUlJfRU5fWEkJCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JETUFRX1BFUlJfRU5fWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1RBU1FfUEVSUl9FTl9YSQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVEJEUlFfUEVSUl9FTl9YSQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfVFNDSFFfUEVSUl9FTl9YSQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfQ09NWFFfUEVSUl9FTl9YSQkJICgxTDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlhQQ1FfUEVSUl9FTl9YSQkJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUFRRX1BFUlJfRU5fWEkJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JWMlBNUV9QRVJSX0VOX1hJCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9DUFFfUEVSUl9FTl9YSQkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfQ1NRX1BFUlJfRU5fWEkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JMVVBfQ0lEX1BFUlJfRU5fWEkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkExX1JWMlBDU19UTUVNX1BFUlJfRU5fWEkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTFfUlYyUENTUV9QRVJSX0VOX1hJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMV9NUV9JRFhfUEVSUl9FTl9YSQkJICgxTDw8MjkpCiAKICNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMgkJCQkweDAwMDAwOGFjCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfQ09NUV9NSVNDCQkJICgxTDw8MCkKQEAgLTEwMDAsMTkgKzEyMjYsNDk4IEBACiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVERNQVFfTUlTQwkJCSAoMUw8PDYpCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVFBBVFFfTUlTQwkJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX0VOQTJfVEFTUV9NSVNDCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMl9UR1RfRklGT19QRVJSX0VOX1hJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1VNUF9UWF9QRVJSX0VOX1hJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1VNUF9SWF9QRVJSX0VOX1hJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX01DUF9ST01fUEVSUl9FTl9YSQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfRU5BMl9NQ1BfU0NQQURfUEVSUl9FTl9YSQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX0hCX01FTV9QRVJSX0VOX1hJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9FTkEyX1BDSUVfUkVQTEFZX1BFUlJfRU5fWEkJICgxTDw8NikKIAogI2RlZmluZSBCTlgyX01JU0NfREVCVUdfVkVDVE9SX1NFTAkJCTB4MDAwMDA4YjAKICNkZWZpbmUgQk5YMl9NSVNDX0RFQlVHX1ZFQ1RPUl9TRUxfMAkJCSAoMHhmZmZMPDwwKQogI2RlZmluZSBCTlgyX01JU0NfREVCVUdfVkVDVE9SX1NFTF8xCQkJICgweGZmZkw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfREVCVUdfVkVDVE9SX1NFTF8xX1hJCQkJICgweGZmZkw8PDE1KQogCiAjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0wJCQkJMHgwMDAwMDhiNAogI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMgkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUFJTl9YSQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVMxNF9YSQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVMxMl9YSQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVMxMF9YSQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVM4X1hJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01BSU5fUExVUzZfWEkJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUFJTl9QTFVTNF9YSQkgKDVMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX1BMVVMyX1hJCSAoNkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01BSU5fTk9NX1hJCQkgKDdMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX01JTlVTMl9YSQkgKDhMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX01JTlVTNF9YSQkgKDlMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX01JTlVTNl9YSQkgKDEwTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUFJTl9NSU5VUzhfWEkJICgxMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01BSU5fTUlOVVMxMF9YSQkgKDEyTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUFJTl9NSU5VUzEyX1hJCSAoMTNMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NQUlOX01JTlVTMTRfWEkJICgxNEw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01BSU5fTUlOVVMxNl9YSQkgKDE1TDw8MCkKICNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzUJCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X1BMVVMxNAkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfUExVUzEyCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9QTFVTMTAJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X1BMVVM4CQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9QTFVTNgkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfUExVUzQJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X1BMVVMyCQkgKDZMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9OT00JCQkgKDdMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9NSU5VUzIJCSAoOEw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X01JTlVTNAkJICg5TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfTUlOVVM2CQkgKDEwTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfTUlOVVM4CQkgKDExTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfTUlOVVMxMAkJICgxMkw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMl81X01JTlVTMTIJCSAoMTNMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzJfNV9NSU5VUzE0CQkgKDE0TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8yXzVfTUlOVVMxNgkJICgxNUw8PDQpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVQJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzE0CQkgKDBMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX1BMVVMxMgkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUdNVF9QTFVTMTAJCSAoMkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzgJCSAoM0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzYJCSAoNEw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzQJCSAoNUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfUExVUzIJCSAoNkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfTk9NCQkgKDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMgkJICg4TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUdNVF9NSU5VUzQJCSAoOUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19WUkVHX0NPTlRST0xfMV8wX01HTVRfTUlOVVM2CQkgKDEwTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1ZSRUdfQ09OVFJPTF8xXzBfTUdNVF9NSU5VUzgJCSAoMTFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMTAJCSAoMTJMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMTIJCSAoMTNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMTQJCSAoMTRMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVlJFR19DT05UUk9MXzFfMF9NR01UX01JTlVTMTYJCSAoMTVMPDw4KQogCiAjZGVmaW5lIEJOWDJfTUlTQ19GSU5BTF9DTEtfQ1RMX1ZBTAkJCTB4MDAwMDA4YjgKICNkZWZpbmUgQk5YMl9NSVNDX0ZJTkFMX0NMS19DVExfVkFMX01JU0NfRklOQUxfQ0xLX0NUTF9WQUwJICgweDNmZmZmZmZMPDw2KQogCi0jZGVmaW5lIEJOWDJfTUlTQ19VTlVTRUQwCQkJCTB4MDAwMDA4YmMKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDAJCQkJMHgwMDAwMDhiYworI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9UWF9EUklWRQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX1JNSUlfTU9ERQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX1JNSUlfQ1JTRFZfU0VMCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9SVk1JSV9NT0RFCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfRkxBU0hfU0FNUF9TQ0xLX05FR0VER0VfVEUJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfSElEREVOX1JFVklTSU9OX0lEX1RFCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX0hDX0NOVExfVE1PVVRfQ1RSX1JTVF9URQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9SRVNFUlZFRDFfWEkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfRU5BX0NPUkVfUlNUX09OX01BSU5fUFdSX0dPSU5HX0FXQVkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfRU5BX1NFTF9WQVVYX0JfSU5fTDJfVEUJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfR1JDX0JOS19GUkVFX0ZJWF9URQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9MRURfQUNUX1NFTF9URQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX1JFU0VSVkVEMl9YSQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9VUDFfREVGMAkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9GSUJFUl9NT0RFX0RJU19ERUYJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9GT1JDRTI1MDBfREVGCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfQVVUT0RFVEVDVF9ESVNfREVGCQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfUEFSQUxMRUxfREVURUNUX0RFRgkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9EQUkJCSAoMHhmTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfREFJXzNNQQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfREFJXzJQNU1BCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9EQUlfMlAwTUEJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX0RBSV8xUDVNQQkJICg1TDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfREFJXzFQME1BCQkgKDdMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9EQUlfUFdSRE4JCSAoMTVMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9QUkUyRElTCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9QUkUxRElTCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9DVEFUCQkgKDB4M0w8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX0NUQVRfTTZQCQkgKDBMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9DVEFUX00wUAkJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfQ1RBVF9QMFAJCSAoMkw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX0NUQVRfUDZQCQkgKDNMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9QVEFUCQkgKDB4M0w8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1BUQVRfTTZQCQkgKDBMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9QVEFUX00wUAkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfUFRBVF9QMFAJCSAoMkw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1BUQVRfUDZQCQkgKDNMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESgkJICgweDNMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESl8yNDBVQQkgKDBMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESl8xNjBVQQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESl80MDBVQQkgKDJMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQU1QX0FESl8zMjBVQQkgKDNMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQ0JVRl9BREoJCSAoMHgzTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfSUNCVUZfQURKXzI0MFVBCSAoMEw8PDI4KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX0lDQlVGX0FESl8xNjBVQQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9JQ0JVRl9BREpfNDAwVUEJICgyTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfSUNCVUZfQURKXzMyMFVBCSAoM0w8PDI4KQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1hUQUxfQURKCQkgKDB4M0w8PDMwKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1hUQUxfQURKXzFQNTcJICgwTDw8MzApCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwwX09TQ0NUUkxfWFRBTF9BREpfMVA0NQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDBfT1NDQ1RSTF9YVEFMX0FESl8xUDYyCSAoMkw8PDMwKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMF9PU0NDVFJMX1hUQUxfQURKXzFQNjYJICgzTDw8MzApCisKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDEJCQkJMHgwMDAwMDhjMAorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMV8xX0FUVE5fQlROX1BSU05UX1RFCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwxXzFfQVRUTl9JTkRfUFJTTlRfVEUJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDFfMV9QV1JfSU5EX1BSU05UX1RFCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfR1BfSFdfQ1RMMV8wX1BDSUVfTE9PUEJBQ0tfVEUJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19HUF9IV19DVEwxX1JFU0VSVkVEX1NPRlRfWEkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0dQX0hXX0NUTDFfUkVTRVJWRURfSEFSRF9YSQkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfTkVXX0hXX0NUTAkJCQkweDAwMDAwOGM0CisjZGVmaW5lIEJOWDJfTUlTQ19ORVdfSFdfQ1RMX01BSU5fUE9SX0JZUEFTUwkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX05FV19IV19DVExfUklOR09TQ19FTkFCTEUJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19ORVdfSFdfQ1RMX1JJTkdPU0NfU0VMMAkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX05FV19IV19DVExfUklOR09TQ19TRUwxCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTkVXX0hXX0NUTF9SRVNFUlZFRF9TSEFSRUQJCSAoMHhmZmZMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfTkVXX0hXX0NUTF9SRVNFUlZFRF9TUExJVAkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfTkVXX0NPUkVfQ1RMCQkJCTB4MDAwMDA4YzgKKyNkZWZpbmUgQk5YMl9NSVNDX05FV19DT1JFX0NUTF9MSU5LX0hPTERPRkZfU1VDQ0VTUwkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfTkVXX0NPUkVfQ1RMX0xJTktfSE9MRE9GRl9SRVEJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19ORVdfQ09SRV9DVExfUkVTRVJWRURfQ01OCQkgKDB4M2ZmZkw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19ORVdfQ09SRV9DVExfUkVTRVJWRURfVEMJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0VDT19IV19DVEwJCQkJMHgwMDAwMDhjYworI2RlZmluZSBCTlgyX01JU0NfRUNPX0hXX0NUTF9MQVJHRV9HUkNfVE1PVVRfRU4JCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19FQ09fSFdfQ1RMX1JFU0VSVkVEX1NPRlQJCSAoMHg3ZmZmTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0VDT19IV19DVExfUkVTRVJWRURfSEFSRAkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfRUNPX0NPUkVfQ1RMCQkJCTB4MDAwMDA4ZDAKKyNkZWZpbmUgQk5YMl9NSVNDX0VDT19DT1JFX0NUTF9SRVNFUlZFRF9TT0ZUCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19FQ09fQ09SRV9DVExfUkVTRVJWRURfSEFSRAkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfUFBJTwkJCQkJMHgwMDAwMDhkNAorI2RlZmluZSBCTlgyX01JU0NfUFBJT19WQUxVRQkJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX1NFVAkJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0NMUgkJCQkgKDB4Zkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfUFBJT19GTE9BVAkJCQkgKDB4Zkw8PDI0KQorCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0lOVAkJCQkweDAwMDAwOGQ4CisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0lOVF9JTlRfU1RBVEUJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0lOVF9PTERfVkFMVUUJCQkgKDB4Zkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19QUElPX0lOVF9PTERfU0VUCQkJICgweGZMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BQSU9fSU5UX09MRF9DTFIJCQkgKDB4Zkw8PDI0KQorCisjZGVmaW5lIEJOWDJfTUlTQ19SRVNFVF9OVU1TCQkJCTB4MDAwMDA4ZGMKKyNkZWZpbmUgQk5YMl9NSVNDX1JFU0VUX05VTVNfTlVNX0hBUkRfUkVTRVRTCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19SRVNFVF9OVU1TX05VTV9QQ0lFX1JFU0VUUwkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUkVTRVRfTlVNU19OVU1fUEVSU1RCX1JFU0VUUwkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfUkVTRVRfTlVNU19OVU1fQ01OX1JFU0VUUwkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX1JFU0VUX05VTVNfTlVNX1BPUlRfUkVTRVRTCQkgKDB4N0w8PDE2KQorCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUgkJCQkweDAwMDAwOGUwCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9FTkFfUENJCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX0VOQV9SRE1BCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX0VOQV9URE1BCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX0VOQV9FTUFDCQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX0VOQV9DVFgJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfRU5BX1RCRFIJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfRU5BX1JCREMJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfRU5BX0NPTQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9FTkFfQ1AJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfU1RBX1BDSQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfU1RBX1JETUEJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX1NUQV9URE1BCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9TVEFfRU1BQwkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfU1RBX0NUWAkJCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfQ1MxNl9FUlJfU1RBX1RCRFIJCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0NTMTZfRVJSX1NUQV9SQkRDCQkJICgxTDw8MjIpCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9TVEFfQ09NCQkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19DUzE2X0VSUl9TVEFfQ1AJCQkgKDFMPDwyNCkKKworI2RlZmluZSBCTlgyX01JU0NfU1BJT19FVkVOVAkJCQkweDAwMDAwOGU0CisjZGVmaW5lIEJOWDJfTUlTQ19TUElPX0VWRU5UX0VOQUJMRQkJCSAoMHhmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9NSVNDX1BQSU9fRVZFTlQJCQkJMHgwMDAwMDhlOAorI2RlZmluZSBCTlgyX01JU0NfUFBJT19FVkVOVF9FTkFCTEUJCQkgKDB4Zkw8PDApCisKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTAkJCTB4MDAwMDA4ZWMKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9CT05EX0lECQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX0JPTkRfSURfWAkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9CT05EX0lEX0MJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfQk9ORF9JRF9TCQkgKDEyTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9QSFlfQ1RSTF9TVFJBUAkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfUE9SVF9TV0FQX1BJTgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfU0VSREVTMV9TSUdERVQJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfU0VSREVTMF9TSUdERVQJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfUEhZMV9TSUdERVQJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWTBfU0lHREVUCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9MQ1BMTF9SU1QJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1NFUkRFUzFfUlNUCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9TRVJERVMwX1JTVAkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfUEhZMV9SU1QJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWTBfUlNUCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9QSFlfQ1RSTAkJICgweDdMPDwyMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9QT1JUX1NXQVAJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1NUUkFQX09WRVJSSURFCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWV9TRVJERVNfSUREUQkgKDB4Zkw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWV9TRVJERVNfSUREUV9TRVIxX0lERFEJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfTUlTQ19EVUFMX01FRElBX0NUUkxfUEhZX1NFUkRFU19JRERRX1NFUjBfSUREUQkgKDJMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0RVQUxfTUVESUFfQ1RSTF9QSFlfU0VSREVTX0lERFFfUEhZMV9JRERRCSAoNEw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfRFVBTF9NRURJQV9DVFJMX1BIWV9TRVJERVNfSUREUV9QSFkwX0lERFEJICg4TDw8MjYpCisKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxCQkJCTB4MDAwMDA4ZjAKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX0ZNT0RFCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfRk1PREVfSURMRQkJCSAoMEw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9GTU9ERV9XUklURQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9GTU9ERV9JTklUCQkJICgyTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX0ZNT0RFX1NFVAkJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9GTU9ERV9SU1QJCQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfRk1PREVfVkVSSUZZCQkJICg1TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX0ZNT0RFX1JFU0VSVkVEMAkJICg2TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX0ZNT0RFX1JFU0VSVkVEMQkJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX1VTRVBJTlMJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfUFJPR1NFTAkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9QUk9HU1RBUlQJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX1BDT1VOVAkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMV9QQllQCQkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfVlNFTAkJCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfVE0JCQkJICgweDdMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9DTUQxX1NBREJZUAkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDFfREVCVUcJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDIJCQkJMHgwMDAwMDhmNAorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDJfT1RQX1JPTV9BRERSCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfQ01EMl9ET1NFTAkJCSAoMHg3Zkw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDJfRE9TRUxfMAkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDJfRE9TRUxfMQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX0NNRDJfRE9TRUxfMTI3CQkJICgxMjdMPDwxNikKKworI2RlZmluZSBCTlgyX01JU0NfT1RQX1NUQVRVUwkJCQkweDAwMDAwOGY4CisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU1RBVFVTX0RBVEEJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX1NUQVRVU19WQUxJRAkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU1RBVFVTX0JVU1kJCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfT1RQX1NUQVRVU19CVVNZU00JCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TVEFUVVNfRE9ORQkJCSAoMUw8PDExKQorCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQxX0NNRAkJCTB4MDAwMDA4ZmMKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDFfQ01EX1JFU0VUX01PREVfTgkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDFfQ01EX1NISUZUX0RPTkUJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQxX0NNRF9TSElGVF9TVEFSVAkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDFfQ01EX0xPQURfREFUQQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDFfQ01EX1NISUZUX1NFTEVDVAkJICgweDFmTDw8OCkKKworI2RlZmluZSBCTlgyX01JU0NfT1RQX1NISUZUMV9EQVRBCQkJMHgwMDAwMDkwMAorI2RlZmluZSBCTlgyX01JU0NfT1RQX1NISUZUMl9DTUQJCQkweDAwMDAwOTA0CisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQyX0NNRF9SRVNFVF9NT0RFX04JCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQyX0NNRF9TSElGVF9ET05FCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfT1RQX1NISUZUMl9DTURfU0hJRlRfU1RBUlQJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQyX0NNRF9MT0FEX0RBVEEJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19PVFBfU0hJRlQyX0NNRF9TSElGVF9TRUxFQ1QJCSAoMHgxZkw8PDgpCisKKyNkZWZpbmUgQk5YMl9NSVNDX09UUF9TSElGVDJfREFUQQkJCTB4MDAwMDA5MDgKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MwCQkJCTB4MDAwMDA5MGMKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MwX01CSVNUX0VOCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MwX0JJU1RfU0VUVVAJCQkgKDB4M0w8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMF9NQklTVF9BU1lOQ19SRVNFVAkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MwX01CSVNUX0RPTkUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzBfTUJJU1RfR08JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzBfQklTVF9PVkVSUklERQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfTUVNU1RBVFVTMAkJCTB4MDAwMDA5MTAKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MxCQkJCTB4MDAwMDA5MTQKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MxX01CSVNUX0VOCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MxX0JJU1RfU0VUVVAJCQkgKDB4M0w8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMV9NQklTVF9BU1lOQ19SRVNFVAkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MxX01CSVNUX0RPTkUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzFfTUJJU1RfR08JCQkgKDFMPDw5KQorCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX01FTVNUQVRVUzEJCQkweDAwMDAwOTE4CisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMgkJCQkweDAwMDAwOTFjCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMl9NQklTVF9FTgkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMl9CSVNUX1NFVFVQCQkJICgweDNMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzJfTUJJU1RfQVNZTkNfUkVTRVQJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTMl9NQklTVF9ET05FCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MyX01CSVNUX0dPCQkJICgxTDw8OSkKKworI2RlZmluZSBCTlgyX01JU0NfQklTVF9NRU1TVEFUVVMyCQkJMHgwMDAwMDkyMAorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzMJCQkJMHgwMDAwMDkyNAorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzNfTUJJU1RfRU4JCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzNfQklTVF9TRVRVUAkJCSAoMHgzTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1MzX01CSVNUX0FTWU5DX1JFU0VUCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzNfTUJJU1RfRE9ORQkJCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTM19NQklTVF9HTwkJCSAoMUw8PDkpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfTUVNU1RBVFVTMwkJCTB4MDAwMDA5MjgKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M0CQkJCTB4MDAwMDA5MmMKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M0X01CSVNUX0VOCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M0X0JJU1RfU0VUVVAJCQkgKDB4M0w8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNF9NQklTVF9BU1lOQ19SRVNFVAkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M0X01CSVNUX0RPTkUJCQkgKDFMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzRfTUJJU1RfR08JCQkgKDFMPDw5KQorCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX01FTVNUQVRVUzQJCQkweDAwMDAwOTMwCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNQkJCQkweDAwMDAwOTM0CisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNV9NQklTVF9FTgkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNV9CSVNUX1NFVFVQCQkJICgweDNMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfQklTVF9DUzVfTUJJU1RfQVNZTkNfUkVTRVQJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19CSVNUX0NTNV9NQklTVF9ET05FCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0JJU1RfQ1M1X01CSVNUX0dPCQkJICgxTDw8OSkKKworI2RlZmluZSBCTlgyX01JU0NfQklTVF9NRU1TVEFUVVM1CQkJMHgwMDAwMDkzOAorI2RlZmluZSBCTlgyX01JU0NfTUVNX1RNMAkJCQkweDAwMDAwOTNjCisjZGVmaW5lIEJOWDJfTUlTQ19NRU1fVE0wX1BDSUVfUkVQTEFZX1RNCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19NRU1fVE0wX01DUF9TQ1BBRAkJCSAoMHhmTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX01FTV9UTTBfVU1QX1RNCQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19NRU1fVE0wX0hCX01FTV9UTQkJCSAoMHhmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkwJCQkJMHgwMDAwMDk0MAorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9QSF9ERVRfRElTCQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkxfRlJFUV9ERVRfRElTCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9MQ1BYCQkJICgweDNmTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkxfUlgJCQkJICgweDNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9WQ19FTgkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9WQ09fTUcJCQkgKDB4M0w8PDExKQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9LVkNPX1hGCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkxfS1ZDT19YUwkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX1RFU1REX0VOCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX1RFU1REX1NFTAkJCSAoMHg3TDw8MjApCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX1RFU1RBX0VOCQkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX1RFU1RBX1NFTAkJCSAoMHgzTDw8MjQpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX0FUVEVOX0ZSRUYJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX1VTUExMX0NUUkxfRElHSVRBTF9SU1QJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfVVNQTExfQ1RSTF9BTkFMT0dfUlNUCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19VU1BMTF9DVFJMX0xPQ0sJCQkgKDFMPDwyOSkKKworI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwCQkJCTB4MDAwMDA5NDQKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DT01fRE1BRV9QRVJSCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX0NQX0RNQUVfUEVSUgkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SUE1fQUNQSUJFTUVNX1BFUlIJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DVFhfVVNBR0VfQ05UX1BFUlIJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DVFhfUEdUQkxfUEVSUgkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DVFhfQ0FDSEVfUEVSUgkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DVFhfTUlSUk9SX1BFUlIJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzBfQ09NX0NUWENfUEVSUgkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DT01fU0NQQURfUEVSUgkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DUF9DVFhDX1BFUlIJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzBfQ1BfU0NQQURfUEVSUgkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzBfUlhQX1JCVUZDX1BFUlIJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1JYUF9DVFhDX1BFUlIJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1JYUF9TQ1BBRF9QRVJSCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9UUEFUX1NDUEFEX1BFUlIJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1RYUF9DVFhDX1BFUlIJCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1RYUF9TQ1BBRF9QRVJSCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9DU19UTUVNX1BFUlIJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX01RX0NUWF9QRVJSCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SUE1fREZJRk9NRU1fUEVSUgkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SUENfREZJRk9NRU1fUEVSUgkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SQlVGX1BUUk1FTV9QRVJSCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SQlVGX0RBVEFNRU1fUEVSUgkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SVjJQX1AySVJBTV9QRVJSCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SVjJQX1AxSVJBTV9QRVJSCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SVjJQX0NCMVJFR1NfUEVSUgkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9SVjJQX0NCMFJFR1NfUEVSUgkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9UUEJVRl9QRVJSCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9USEJVRl9QRVJSCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMF9URE1BX1BFUlIJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMwX1RCRENfUEVSUgkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzBfVFNDSF9MUl9QRVJSCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxCQkJCTB4MDAwMDA5NDgKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9SQkRDX1BFUlIJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfUkRNQV9ERklGT19QRVJSCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX0hDX1NUQVRTX1BFUlIJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfSENfTVNJWF9QRVJSCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX0hDX1BST0RVQ1NUQl9QRVJSCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfSENfQ09OU1VNU1RCX1BFUlIJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9UUEFUUV9QRVJSCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX01DUFFfUEVSUgkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9URE1BUV9QRVJSCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1RYUFFfUEVSUgkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfQ09NVFFfUEVSUgkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfQ09NUV9QRVJSCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9STFVQUV9QRVJSCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9SWFBRX1BFUlIJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JWMlBQUV9QRVJSCQkgKDFMPDwxNSkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9SRE1BUV9QRVJSCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9UQVNRX1BFUlIJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1RCRFJRX1BFUlIJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1RTQ0hRX1BFUlIJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX0NPTVhRX1BFUlIJCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JYUENRX1BFUlIJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JWMlBUUV9QRVJSCQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9SVjJQTVFfUEVSUgkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfQ1BRX1BFUlIJCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX1BFUlJfU1RBVFVTMV9DU1FfUEVSUgkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JMVVBfQ0lEX1BFUlIJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JWMlBDU19UTUVNX1BFUlIJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMxX1JWMlBDU1FfUEVSUgkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzFfTVFfSURYX1BFUlIJCSAoMUw8PDI5KQorCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzIJCQkJMHgwMDAwMDk0YworI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMyX1RHVF9GSUZPX1BFUlIJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzJfVU1QX1RYX1BFUlIJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzJfVU1QX1JYX1BFUlIJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfTUlTQ19QRVJSX1NUQVRVUzJfTUNQX1JPTV9QRVJSCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMyX01DUF9TQ1BBRF9QRVJSCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMyX0hCX01FTV9QRVJSCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfUEVSUl9TVEFUVVMyX1BDSUVfUkVQTEFZX1BFUlIJCSAoMUw8PDYpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwCQkJCTB4MDAwMDA5NTAKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX09BQwkJCSAoMHg3TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX09BQ19ORUdUV0VOVFkJCSAoMEw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9PQUNfWkVSTwkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9PQUNfVFdFTlRZCQkgKDNMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfT0FDX0ZPUlRZCQkJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX0lDUF9DVFJMCQkJICgweDdMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfSUNQX0NUUkxfMzYwCQkgKDBMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfSUNQX0NUUkxfNDgwCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfSUNQX0NUUkxfNjAwCQkgKDNMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfSUNQX0NUUkxfNzIwCQkgKDdMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfQklBU19DVFJMCQkJICgweDNMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfUExMX09CU0VSVkUJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1ZUSF9DVFJMCQkJICgweDNMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1ZUSF9DVFJMXzAJCSAoMEw8PDExKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfVlRIX0NUUkxfMQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9WVEhfQ1RSTF8yCQkgKDJMPDwxMSkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1BMTFNFUVNUQVJUCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1JFU0VSVkVECQkJICgxTDw8MTQpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9DQVBSRVRSWV9FTgkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9GUkVRTU9OSVRPUl9FTgkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9GUkVRREVUUkVTVEFSVF9FTgkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9GUkVRREVUUkVUUllfRU4JCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfUExMRk9SQ0VGRE9ORV9FTgkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9QTExGT1JDRUZET05FCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1BMTEZPUkNFRlBBU1MJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfUExMRk9SQ0VDQVBET05FX0VOCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDBfUExMRk9SQ0VDQVBET05FCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1BMTEZPUkNFQ0FQUEFTU19FTgkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX1BMTEZPUkNFQ0FQUEFTUwkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMF9DQVBSRVNUQVJUCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwwX0NBUFNFTEVDVE1fRU4JCSAoMUw8PDI3KQorCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMQkJCQkweDAwMDAwOTU0CisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9DVFJMMV9DQVBTRUxFQ1RNCQkgKDB4MWZMPDwwKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDFfQ0FQRk9SQ0VTTE9XRE9XTl9FTgkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfQ1RSTDFfQ0FQRk9SQ0VTTE9XRE9XTgkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX0NUUkwxX1NMT1dETl9YT1IJCSAoMUw8PDcpCisKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX1NUQVRVUwkJCQkweDAwMDAwOTU4CisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfRlJFUURPTkVfU00JCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfRlJFUVBBU1NfU00JCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfUExMU0VRRE9ORQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NSVNDX0xDUExMX1NUQVRVU19QTExTRVFQQVNTCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfU1RBVFVTX1BMTFNUQVRFCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfU1RBVFVTX0NBUFNUQVRFCQkJICgweDdMPDw3KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfU1RBVFVTX0NBUFNFTEVDVAkJICgweDFmTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfU0xPV0ROX0lORElDQVRPUgkJICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfTUlTQ19MQ1BMTF9TVEFUVVNfU0xPV0ROX0lORElDQVRPUl8wCSAoMEw8PDE1KQorI2RlZmluZSBCTlgyX01JU0NfTENQTExfU1RBVFVTX1NMT1dETl9JTkRJQ0FUT1JfMQkgKDFMPDwxNSkKKworI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTAkJCQkweDAwMDAwOTVjCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0ZSRVFfTU9OCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9GUkVRX01PTl9PRkYJCSAoMEw8PDUpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0ZSRVFfTU9OX09OCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9YVEFMX0FESkNNCQkgKDB4M0w8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX1hUQUxfQURKQ01fMAkJICgwTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfWFRBTF9BREpDTV8xCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9YVEFMX0FESkNNXzIJCSAoMkw8PDYpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX1hUQUxfQURKQ01fMwkJICgzTDw8NikKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfSUNCVUZfQURKCQkgKDB4M0w8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0lDQlVGX0FESl8wCQkgKDBMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9JQ0JVRl9BREpfMQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfSUNCVUZfQURKXzIJCSAoMkw8PDgpCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0lDQlVGX0FESl8zCQkgKDNMPDw4KQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9JQU1QX0FESgkJICgweDNMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfSUFNUF9BREpfMAkJICgwTDw8MTApCisjZGVmaW5lIEJOWDJfTUlTQ19PU0NGVU5EU19DVFJMX0lBTVBfQURKXzEJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX01JU0NfT1NDRlVORFNfQ1RSTF9JQU1QX0FESl8yCQkgKDJMPDwxMCkKKyNkZWZpbmUgQk5YMl9NSVNDX09TQ0ZVTkRTX0NUUkxfSUFNUF9BREpfMwkJICgzTDw8MTApCiAKIAogLyoKQEAgLTEwMzEsMTEgKzE3MzYsMzUgQEAKICNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9XUkRJCQkJCSAoMUw8PDE3KQogI2RlZmluZSBCTlgyX05WTV9DT01NQU5EX0VXU1IJCQkJICgxTDw8MTgpCiAjZGVmaW5lIEJOWDJfTlZNX0NPTU1BTkRfV1JTUgkJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9SRF9JRAkJCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9SRF9TVEFUVVMJCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9OVk1fQ09NTUFORF9NT0RFXzI1NgkJCSAoMUw8PDIyKQogCiAjZGVmaW5lIEJOWDJfTlZNX1NUQVRVUwkJCQkJMHgwMDAwNjQwNAogI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfUElfRlNNX1NUQVRFCQkJICgweGZMPDwwKQogI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfRUVfRlNNX1NUQVRFCQkJICgweGZMPDw0KQogI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfRVFfRlNNX1NUQVRFCQkJICgweGZMPDw4KQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9YSQkJICgweDFmTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0lETEVfWEkJICgwTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0NNRDBfWEkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0NNRDFfWEkJICgyTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0NNRF9GSU5JU0gwX1hJCSAoM0w8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9DTURfRklOSVNIMV9YSQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfQUREUjBfWEkJICg1TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1dSSVRFX0RBVEEwX1hJCSAoNkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9XUklURV9EQVRBMV9YSQkgKDdMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfV1JJVEVfREFUQTJfWEkJICg4TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1JFQURfREFUQTBfWEkJICg5TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1JFQURfREFUQTFfWEkJICgxMEw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9SRUFEX0RBVEEyX1hJCSAoMTFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfUkVBRF9TVEFUVVNfUkRJRDBfWEkJICgxMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9SRUFEX1NUQVRVU19SRElEMV9YSQkgKDEzTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1JFQURfU1RBVFVTX1JESUQyX1hJCSAoMTRMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfUkVBRF9TVEFUVVNfUkRJRDNfWEkJICgxNUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1NUQVRVU19TUElfRlNNX1NUQVRFX1NQSV9SRUFEX1NUQVRVU19SRElENF9YSQkgKDE2TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX0NIRUNLX0JVU1kwX1hJCSAoMTdMPDwwKQorI2RlZmluZSBCTlgyX05WTV9TVEFUVVNfU1BJX0ZTTV9TVEFURV9TUElfU1RfV1JFTl9YSQkgKDE4TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fU1RBVFVTX1NQSV9GU01fU1RBVEVfU1BJX1dBSVRfWEkJICgxOUw8PDApCiAKICNkZWZpbmUgQk5YMl9OVk1fV1JJVEUJCQkJCTB4MDAwMDY0MDgKICNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFCQkJICgweGZmZmZmZmZmTDw8MCkKQEAgLTEwNDYsNiArMTc3NSwxMCBAQAogI2RlZmluZSBCTlgyX05WTV9XUklURV9OVk1fV1JJVEVfVkFMVUVfQ1NfQgkJICg4TDw8MCkKICNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFX1NPCQkgKDE2TDw8MCkKICNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFX1NJCQkgKDMyTDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fV1JJVEVfTlZNX1dSSVRFX1ZBTFVFX1NJX1hJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9XUklURV9OVk1fV1JJVEVfVkFMVUVfU09fWEkJCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1dSSVRFX05WTV9XUklURV9WQUxVRV9DU19CX1hJCQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX05WTV9XUklURV9OVk1fV1JJVEVfVkFMVUVfU0NMS19YSQkJICg4TDw8MCkKIAogI2RlZmluZSBCTlgyX05WTV9BRERSCQkJCQkweDAwMDA2NDBjCiAjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUUJCQkgKDB4ZmZmZmZmTDw8MCkKQEAgLTEwNTYsNiArMTc4OSwxMCBAQAogI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX0NTX0IJCSAoOEw8PDApCiAjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUVfU08JCQkgKDE2TDw8MCkKICNkZWZpbmUgQk5YMl9OVk1fQUREUl9OVk1fQUREUl9WQUxVRV9TSQkJCSAoMzJMPDwwKQorI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX1NJX1hJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX1NPX1hJCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX05WTV9BRERSX05WTV9BRERSX1ZBTFVFX0NTX0JfWEkJCSAoNEw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0FERFJfTlZNX0FERFJfVkFMVUVfU0NMS19YSQkJICg4TDw8MCkKIAogI2RlZmluZSBCTlgyX05WTV9SRUFECQkJCQkweDAwMDA2NDEwCiAjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUUJCQkgKDB4ZmZmZmZmZmZMPDwwKQpAQCAtMTA2Niw2ICsxODAzLDEwIEBACiAjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfQ1NfQgkJICg4TDw8MCkKICNkZWZpbmUgQk5YMl9OVk1fUkVBRF9OVk1fUkVBRF9WQUxVRV9TTwkJCSAoMTZMPDwwKQogI2RlZmluZSBCTlgyX05WTV9SRUFEX05WTV9SRUFEX1ZBTFVFX1NJCQkJICgzMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfU0lfWEkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfU09fWEkJCSAoMkw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQURfTlZNX1JFQURfVkFMVUVfQ1NfQl9YSQkJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fUkVBRF9OVk1fUkVBRF9WQUxVRV9TQ0xLX1hJCQkgKDhMPDwwKQogCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzEJCQkJCTB4MDAwMDY0MTQKICNkZWZpbmUgQk5YMl9OVk1fQ0ZHMV9GTEFTSF9NT0RFCQkJICgxTDw8MCkKQEAgLTEwNzcsMTQgKzE4MTgsMjEgQEAKICNkZWZpbmUgQk5YMl9OVk1fQ0ZHMV9TVEFUVVNfQklUX0JVRkZFUl9SRFkJCSAoN0w8PDQpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU1BJX0NMS19ESVYJCQkgKDB4Zkw8PDcpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU0VFX0NMS19ESVYJCQkgKDB4N2ZmTDw8MTEpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfU1RSQVBfQ09OVFJPTF8wCQkJICgxTDw8MjMpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzFfUFJPVEVDVF9NT0RFCQkJICgxTDw8MjQpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzFfRkxBU0hfU0laRQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX05WTV9DRkcxX0ZXX1VTVFJBUF8xCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfRldfVVNUUkFQXzAJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHMV9GV19VU1RSQVBfMgkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX05WTV9DRkcxX0ZXX1VTVFJBUF8zCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzFfRldfRkxBU0hfVFlQRV9FTgkJCSAoMUw8PDMwKQogI2RlZmluZSBCTlgyX05WTV9DRkcxX0NPTVBBVF9CWVBBU1NTCQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9OVk1fQ0ZHMgkJCQkJMHgwMDAwNjQxOAogI2RlZmluZSBCTlgyX05WTV9DRkcyX0VSQVNFX0NNRAkJCQkgKDB4ZmZMPDwwKQogI2RlZmluZSBCTlgyX05WTV9DRkcyX0RVTU1ZCQkJCSAoMHhmZkw8PDgpCiAjZGVmaW5lIEJOWDJfTlZNX0NGRzJfU1RBVFVTX0NNRAkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX05WTV9DRkcyX1JFQURfSUQJCQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9OVk1fQ0ZHMwkJCQkJMHgwMDAwNjQxYwogI2RlZmluZSBCTlgyX05WTV9DRkczX0JVRkZFUl9SRF9DTUQJCQkgKDB4ZmZMPDwwKQpAQCAtMTExOSw2ICsxODY3LDM1IEBACiAjZGVmaW5lIEJOWDJfTlZNX1dSSVRFMV9XUkRJX0NNRAkJCSAoMHhmZkw8PDgpCiAjZGVmaW5lIEJOWDJfTlZNX1dSSVRFMV9TUl9EQVRBCQkJCSAoMHhmZkw8PDE2KQogCisjZGVmaW5lIEJOWDJfTlZNX0NGRzQJCQkJCTB4MDAwMDY0MmMKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9GTEFTSF9TSVpFCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfMU1CSVQJCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfMk1CSVQJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfNE1CSVQJCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfOE1CSVQJCQkgKDNMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfMTZNQklUCQkJICg0TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9GTEFTSF9TSVpFXzMyTUJJVAkJCSAoNUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX0NGRzRfRkxBU0hfU0laRV82NE1CSVQJCQkgKDZMPDwwKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1NJWkVfMTI4TUJJVAkJICg3TDw8MCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9GTEFTSF9WRU5ET1IJCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X0ZMQVNIX1ZFTkRPUl9TVAkJCSAoMEw8PDMpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzRfRkxBU0hfVkVORE9SX0FUTUVMCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX05WTV9DRkc0X01PREVfMjU2X0VNUFRZX0JJVF9MT0MJCSAoMHgzTDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9NT0RFXzI1Nl9FTVBUWV9CSVRfTE9DX0JJVDgJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9NT0RFXzI1Nl9FTVBUWV9CSVRfTE9DX0JJVDkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9OVk1fQ0ZHNF9NT0RFXzI1Nl9FTVBUWV9CSVRfTE9DX0JJVDEwCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzRfTU9ERV8yNTZfRU1QVFlfQklUX0xPQ19CSVQxMQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX05WTV9DRkc0X1NUQVRVU19CSVRfUE9MQVJJVFkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfTlZNX0NGRzRfUkVTRVJWRUQJCQkJICgweDFmZmZmZmZMPDw3KQorCisjZGVmaW5lIEJOWDJfTlZNX1JFQ09ORklHCQkJCTB4MDAwMDY0MzAKKyNkZWZpbmUgQk5YMl9OVk1fUkVDT05GSUdfT1JJR19TVFJBUF9WQUxVRQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX05WTV9SRUNPTkZJR19PUklHX1NUUkFQX1ZBTFVFX1NUCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX05WTV9SRUNPTkZJR19PUklHX1NUUkFQX1ZBTFVFX0FUTUVMCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfTlZNX1JFQ09ORklHX1JFQ09ORklHX1NUUkFQX1ZBTFVFCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfTlZNX1JFQ09ORklHX1JFU0VSVkVECQkJICgweDdmZmZmZkw8PDgpCisjZGVmaW5lIEJOWDJfTlZNX1JFQ09ORklHX1JFQ09ORklHX0RPTkUJCQkgKDFMPDwzMSkKKwogCiAKIC8qCkBAIC0xMTQwLDYgKzE5MTcsOCBAQAogI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfQklHX1dSSVRFX1RSQU5TRkVSU19TVEFUCSAoMUw8PDIzKQogI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfQklHX1dSSVRFX0RFTEFZX1BDSV9DTEtTX1NUQVQJICgxTDw8MjQpCiAjZGVmaW5lIEJOWDJfRE1BX1NUQVRVU19CSUdfV1JJVEVfUkVUUllfQUZURVJfREFUQV9TVEFUCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX0RNQV9TVEFUVVNfR0xPQkFMX0VSUl9YSQkJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1NUQVRVU19CTUVfWEkJCQkJICgxTDw8NCkKIAogI2RlZmluZSBCTlgyX0RNQV9DT05GSUcJCQkJCTB4MDAwMDBjMDgKICNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX0RBVEFfQllURV9TV0FQCQkJICgxTDw8MCkKQEAgLTExNjEsODUgKzE5NDAsMzE1IEBACiAjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19CSUdfU0laRV8xMjgJCQkgKDB4Mkw8PDI0KQogI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfQklHX1NJWkVfMjU2CQkJICgweDRMPDwyNCkKICNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX0JJR19TSVpFXzUxMgkJCSAoMHg4TDw8MjQpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19EQVRfV0JTV0FQX01PREVfWEkJCSAoMHgzTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX0NUTF9XQlNXQVBfTU9ERV9YSQkJICgweDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1BMX1hJCQkJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX01BWF9QTF8xMjhCX1hJCQkJICgwTDw8MTIpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19NQVhfUExfMjU2Ql9YSQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1BMXzUxMkJfWEkJCQkgKDJMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX01BWF9QTF9FTl9YSQkJCSAoMUw8PDE1KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1JSU19YSQkJCSAoMHg3TDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19NQVhfUlJTXzEyOEJfWEkJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX01BWF9SUlNfMjU2Ql9YSQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1JSU181MTJCX1hJCQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19NQVhfUlJTXzEwMjRCX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9ETUFfQ09ORklHX01BWF9SUlNfMjA0OEJfWEkJCSAoNEw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9DT05GSUdfTUFYX1JSU180MDk2Ql9YSQkJICg1TDw8MTYpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19NQVhfUlJTX0VOX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfRE1BX0NPTkZJR19OT182NFNXQVBfRU5fWEkJCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX0RNQV9CTEFDS09VVAkJCQkweDAwMDAwYzBjCiAjZGVmaW5lIEJOWDJfRE1BX0JMQUNLT1VUX1JEX1JFVFJZX0JMQUNLT1VUCQkgKDB4ZmZMPDwwKQogI2RlZmluZSBCTlgyX0RNQV9CTEFDS09VVF8yTkRfUkRfUkVUUllfQkxBQ0tPVVQJCSAoMHhmZkw8PDgpCiAjZGVmaW5lIEJOWDJfRE1BX0JMQUNLT1VUX1dSX1JFVFJZX0JMQUNLT1VUCQkgKDB4ZmZMPDwxNikKIAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUCQkJCTB4MDAwMDBjMzAKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9DT01QX0NPREVfMAkJCSAoMHg3TDw8MCkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzAJCQkgKDFMPDwzKQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV8xCQkJICgweDdMPDw0KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX1BBUl9FUlJfMQkJCSAoMUw8PDcpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfQ09NUF9DT0RFXzIJCQkgKDB4N0w8PDgpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfUEFSX0VSUl8yCQkJICgxTDw8MTEpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfQ09NUF9DT0RFXzMJCQkgKDB4N0w8PDEyKQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX1BBUl9FUlJfMwkJCSAoMUw8PDE1KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV80CQkJICgweDdMPDwxNikKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzQJCQkgKDFMPDwxOSkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9DT01QX0NPREVfNQkJCSAoMHg3TDw8MjApCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfUEFSX0VSUl81CQkJICgxTDw8MjMpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfQ09NUF9DT0RFXzYJCQkgKDB4N0w8PDI0KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX1BBUl9FUlJfNgkJCSAoMUw8PDI3KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUX0NPTVBfQ09ERV83CQkJICgweDdMPDwyOCkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF9QQVJfRVJSXzcJCQkgKDFMPDwzMSkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wCQkJMHgwMDAwMGMxMAorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVEJEQ19OT19TTk9PUAkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVEJEQ19SRUxBWF9PUkRFUgkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVEJEQ19QUklPUklUWQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVEJEQ19UUkFGRklDX0NMQVNTCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1RCRENfUEFSQU1fRU4JICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1JCRENfTk9fU05PT1AJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1JCRENfUkVMQVhfT1JERVIJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1JCRENfUFJJT1JJVFkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9SQkRDX1RSQUZGSUNfQ0xBU1MJICgweDdMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1JCRENfUEFSQU1fRU4JICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9URE1BX05PX1NOT09QCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfVERNQV9SRUxBWF9PUkRFUgkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1RETUFfUFJJT1JJVFkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9URE1BX1RSQUZGSUNfQ0xBU1MJICgweDdMPDwyMCkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18wX1RETUFfUEFSQU1fRU4JICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9DVFhfTk9fU05PT1AJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9DVFhfUkVMQVhfT1JERVIJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9DVFhfUFJJT1JJVFkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMF9DVFhfVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDI4KQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzBfQ1RYX1BBUkFNX0VOCSAoMUw8PDMxKQogCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVQJCQkJMHgwMDAwMGMzNAotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX0NPTVBfQ09ERV8wCQkJICgweDdMPDwwKQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX1BBUl9FUlJfMAkJCSAoMUw8PDMpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfQ09NUF9DT0RFXzEJCQkgKDB4N0w8PDQpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl8xCQkJICgxTDw8NykKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfMgkJCSAoMHg3TDw8OCkKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9QQVJfRVJSXzIJCQkgKDFMPDwxMSkKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfMwkJCSAoMHg3TDw8MTIpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl8zCQkJICgxTDw8MTUpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfQ09NUF9DT0RFXzQJCQkgKDB4N0w8PDE2KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX1BBUl9FUlJfNAkJCSAoMUw8PDE5KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX0NPTVBfQ09ERV81CQkJICgweDdMPDwyMCkKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9QQVJfRVJSXzUJCQkgKDFMPDwyMykKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fU1RBVF9DT01QX0NPREVfNgkJCSAoMHg3TDw8MjQpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfUEFSX0VSUl82CQkJICgxTDw8MjcpCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX1NUQVRfQ09NUF9DT0RFXzcJCQkgKDB4N0w8PDI4KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9TVEFUX1BBUl9FUlJfNwkJCSAoMUw8PDMxKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzEJCQkweDAwMDAwYzE0CisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DT01fTk9fU05PT1AJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18xX0NPTV9SRUxBWF9PUkRFUgkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzFfQ09NX1BSSU9SSVRZCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DT01fVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DT01fUEFSQU1fRU4JICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfUkVBRF9NQVNURVJfU0VUVElOR18xX0NQX05PX1NOT09QCSAoMUw8PDgpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DUF9SRUxBWF9PUkRFUgkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9SRUFEX01BU1RFUl9TRVRUSU5HXzFfQ1BfUFJJT1JJVFkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DUF9UUkFGRklDX0NMQVNTCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfRE1BX1JFQURfTUFTVEVSX1NFVFRJTkdfMV9DUF9QQVJBTV9FTgkgKDFMPDwxNSkKIAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UCQkJMHgwMDAwMGMzOAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzAJCQkgKDB4Zkw8PDApCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX0FTU0lHTk1FTlRfMQkJCSAoMHhmTDw8NCkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fQVNTSUdOTUVOVF8yCQkJICgweGZMPDw4KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzMJCQkgKDB4Zkw8PDEyKQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzQJCQkgKDB4Zkw8PDE2KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzUJCQkgKDB4Zkw8PDIwKQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzYJCQkgKDB4Zkw8PDI0KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9BU1NJR05NRU5UXzcJCQkgKDB4Zkw8PDI4KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wCQkJMHgwMDAwMGMxOAorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0hDX05PX1NOT09QCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzBfSENfUkVMQVhfT1JERVIJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMF9IQ19QUklPUklUWQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0hDX0NTX1ZMRAkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0hDX1RSQUZGSUNfQ0xBU1MJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0hDX1BBUkFNX0VOCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzBfUkRNQV9OT19TTk9PUAkgKDFMPDw4KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX1JETUFfUkVMQVhfT1JERVIJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMF9SRE1BX1BSSU9SSVRZCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX1JETUFfQ1NfVkxECSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX1JETUFfVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDEyKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX1JETUFfUEFSQU1fRU4JICgxTDw8MTUpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzBfQ1RYX05PX1NOT09QCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0NUWF9SRUxBWF9PUkRFUgkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMF9DVFhfUFJJT1JJVFkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzBfQ1RYX0NTX1ZMRAkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMF9DVFhfVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDI4KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18wX0NUWF9QQVJBTV9FTgkgKDFMPDwzMSkKIAotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UCQkJMHgwMDAwMGMzYwotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzAJCQkgKDB4Zkw8PDApCi0jZGVmaW5lIEJOWDJfRE1BX1dDSEFOX0FTU0lHTk1FTlRfMQkJCSAoMHhmTDw8NCkKLSNkZWZpbmUgQk5YMl9ETUFfV0NIQU5fQVNTSUdOTUVOVF8yCQkJICgweGZMPDw4KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzMJCQkgKDB4Zkw8PDEyKQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzQJCQkgKDB4Zkw8PDE2KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzUJCQkgKDB4Zkw8PDIwKQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzYJCQkgKDB4Zkw8PDI0KQotI2RlZmluZSBCTlgyX0RNQV9XQ0hBTl9BU1NJR05NRU5UXzcJCQkgKDB4Zkw8PDI4KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xCQkJMHgwMDAwMGMxYworI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NPTV9OT19TTk9PUAkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NPTV9SRUxBWF9PUkRFUgkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NPTV9QUklPUklUWQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NPTV9DU19WTEQJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMV9DT01fVFJBRkZJQ19DTEFTUwkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzFfQ09NX1BBUkFNX0VOCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzFfQ1BfTk9fU05PT1AJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMV9DUF9SRUxBWF9PUkRFUgkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NQX1BSSU9SSVRZCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0RNQV9XUklURV9NQVNURVJfU0VUVElOR18xX0NQX0NTX1ZMRAkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9ETUFfV1JJVEVfTUFTVEVSX1NFVFRJTkdfMV9DUF9UUkFGRklDX0NMQVNTCSAoMHg3TDw8MTIpCisjZGVmaW5lIEJOWDJfRE1BX1dSSVRFX01BU1RFUl9TRVRUSU5HXzFfQ1BfUEFSQU1fRU4JICgxTDw8MTUpCiAKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8wMAkJCQkweDAwMDAwYzQwCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDBfUkNIQU5fU1RBX0hPU1RfQUREUl9MT1cJICgweGZmZmZmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUgkJCQkweDAwMDAwYzIwCisjZGVmaW5lIEJOWDJfRE1BX0FSQklURVJfTlVNX1JFQURTCQkJICgweDdMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9BUkJJVEVSX1dSX0FSQl9NT0RFCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9XUl9BUkJfTU9ERV9TVFJJQ1QJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX0FSQklURVJfV1JfQVJCX01PREVfUk5EX1JCTgkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9SRF9BUkJfTU9ERQkJCSAoMHgzTDw8NSkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9SRF9BUkJfTU9ERV9TVFJJQ1QJCSAoMEw8PDUpCisjZGVmaW5lIEJOWDJfRE1BX0FSQklURVJfUkRfQVJCX01PREVfUk5EX1JCTgkJICgxTDw8NSkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9SRF9BUkJfTU9ERV9XR1RfUk5EX1JCTgkgKDJMPDw1KQorI2RlZmluZSBCTlgyX0RNQV9BUkJJVEVSX0FMVF9NT0RFX0VOCQkJICgxTDw8OCkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9SUl9NT0RFCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfQVJCSVRFUl9USU1FUl9NT0RFCQkJICgxTDw8MTApCisjZGVmaW5lIEJOWDJfRE1BX0FSQklURVJfT1VTVERfUkVBRF9SRVEJCQkgKDB4Zkw8PDEyKQogCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDEJCQkJMHgwMDAwMGM0NAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzAxX1JDSEFOX1NUQV9IT1NUX0FERFJfSElHSAkgKDB4ZmZmZmZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9BUkJfVElNRVJTCQkJCTB4MDAwMDBjMjQKKyNkZWZpbmUgQk5YMl9ETUFfQVJCX1RJTUVSU19SRF9EUlJfV0FJVF9USU1FCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9BUkJfVElNRVJTX1RNX01JTl9USU1FT1VUCQkgKDB4ZmZMPDwxMikKKyNkZWZpbmUgQk5YMl9ETUFfQVJCX1RJTUVSU19UTV9NQVhfVElNRU9VVAkJICgweGZmZkw8PDIwKQogCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDIJCQkJMHgwMDAwMGM0OAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzAyX0xFTkdUSAkJCSAoMHhmZmZmTDw8MCkKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8wMl9XT1JEX1NXQVAJCSAoMUw8PDE2KQotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzAyX0JZVEVfU1dBUAkJICgxTDw8MTcpCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMDJfUFJJT1JJVFlfTFZMCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9ETUFfREVCVUdfVkVDVF9QRUVLCQkJMHgwMDAwMGMyYworI2RlZmluZSBCTlgyX0RNQV9ERUJVR19WRUNUX1BFRUtfMV9WQUxVRQkJICgweDdmZkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX0RFQlVHX1ZFQ1RfUEVFS18xX1BFRUtfRU4JCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0RNQV9ERUJVR19WRUNUX1BFRUtfMV9TRUwJCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX0RNQV9ERUJVR19WRUNUX1BFRUtfMl9WQUxVRQkJICgweDdmZkw8PDE2KQorI2RlZmluZSBCTlgyX0RNQV9ERUJVR19WRUNUX1BFRUtfMl9QRUVLX0VOCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9ETUFfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKIAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzEwCQkJCTB4MDAwMDBjNGMKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8xMQkJCQkweDAwMDAwYzUwCi0jZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMTIJCQkJMHgwMDAwMGM1NAotI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzIwCQkJCTB4MDAwMDBjNTgKLSNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8yMQkJCQkweDAwMDAwYzVjCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDAJCQkJMHgwMDAwMGMzMAorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAwX0NIQU5ORUwJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfTUFTVEVSCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAwX01BU1RFUl9DVFgJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAwX01BU1RFUl9SQkRDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMF9NQVNURVJfVEJEQwkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfTUFTVEVSX0NPTQkJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfTUFTVEVSX0NQCQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMF9NQVNURVJfVERNQQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfU1dBUAkJCSAoMHgzTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMF9TV0FQX0NPTkZJRwkJCSAoMEw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfU1dBUF9EQVRBCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMF9TV0FQX0NPTlRST0wJCSAoMkw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDBfRlVOQ1RJT04JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAwX1ZBTElECQkJICgxTDw8MTApCisKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMQkJCQkweDAwMDAwYzM0CisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDFfQ0hBTk5FTAkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9NQVNURVIJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDFfTUFTVEVSX0NUWAkJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDFfTUFTVEVSX1JCREMJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAxX01BU1RFUl9UQkRDCQkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9NQVNURVJfQ09NCQkJICgzTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9NQVNURVJfQ1AJCQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAxX01BU1RFUl9URE1BCQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9TV0FQCQkJICgweDNMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAxX1NXQVBfQ09ORklHCQkJICgwTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9TV0FQX0RBVEEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAxX1NXQVBfQ09OVFJPTAkJICgyTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMV9GVU5DVElPTgkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDFfVkFMSUQJCQkgKDFMPDwxMCkKKworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyCQkJCTB4MDAwMDBjMzgKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMl9DSEFOTkVMCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX01BU1RFUgkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMl9NQVNURVJfQ1RYCQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMl9NQVNURVJfUkJEQwkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDJfTUFTVEVSX1RCREMJCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX01BU1RFUl9DT00JCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX01BU1RFUl9DUAkJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDJfTUFTVEVSX1RETUEJCQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX1NXQVAJCQkgKDB4M0w8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDJfU1dBUF9DT05GSUcJCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX1NXQVBfREFUQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDJfU1dBUF9DT05UUk9MCQkgKDJMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAyX0ZVTkNUSU9OCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wMl9WQUxJRAkJCSAoMUw8PDEwKQorCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDMJCQkJMHgwMDAwMGMzYworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAzX0NIQU5ORUwJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfTUFTVEVSCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAzX01BU1RFUl9DVFgJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAzX01BU1RFUl9SQkRDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wM19NQVNURVJfVEJEQwkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfTUFTVEVSX0NPTQkJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfTUFTVEVSX0NQCQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wM19NQVNURVJfVERNQQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfU1dBUAkJCSAoMHgzTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wM19TV0FQX0NPTkZJRwkJCSAoMEw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfU1dBUF9EQVRBCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wM19TV0FQX0NPTlRST0wJCSAoMkw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDNfRlVOQ1RJT04JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzAzX1ZBTElECQkJICgxTDw8MTApCisKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNAkJCQkweDAwMDAwYzQwCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDRfQ0hBTk5FTAkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9NQVNURVIJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDRfTUFTVEVSX0NUWAkJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDRfTUFTVEVSX1JCREMJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA0X01BU1RFUl9UQkRDCQkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9NQVNURVJfQ09NCQkJICgzTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9NQVNURVJfQ1AJCQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA0X01BU1RFUl9URE1BCQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9TV0FQCQkJICgweDNMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA0X1NXQVBfQ09ORklHCQkJICgwTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9TV0FQX0RBVEEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA0X1NXQVBfQ09OVFJPTAkJICgyTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNF9GVU5DVElPTgkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDRfVkFMSUQJCQkgKDFMPDwxMCkKKworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1CQkJCTB4MDAwMDBjNDQKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNV9DSEFOTkVMCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X01BU1RFUgkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNV9NQVNURVJfQ1RYCQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNV9NQVNURVJfUkJEQwkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDVfTUFTVEVSX1RCREMJCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X01BU1RFUl9DT00JCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X01BU1RFUl9DUAkJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDVfTUFTVEVSX1RETUEJCQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X1NXQVAJCQkgKDB4M0w8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDVfU1dBUF9DT05GSUcJCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X1NXQVBfREFUQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDVfU1dBUF9DT05UUk9MCQkgKDJMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA1X0ZVTkNUSU9OCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNV9WQUxJRAkJCSAoMUw8PDEwKQorCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDYJCQkJMHgwMDAwMGM0OAorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA2X0NIQU5ORUwJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfTUFTVEVSCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA2X01BU1RFUl9DVFgJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA2X01BU1RFUl9SQkRDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNl9NQVNURVJfVEJEQwkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfTUFTVEVSX0NPTQkJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfTUFTVEVSX0NQCQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNl9NQVNURVJfVERNQQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfU1dBUAkJCSAoMHgzTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNl9TV0FQX0NPTkZJRwkJCSAoMEw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfU1dBUF9EQVRBCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNl9TV0FQX0NPTlRST0wJCSAoMkw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDZfRlVOQ1RJT04JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA2X1ZBTElECQkJICgxTDw8MTApCisKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wNwkJCQkweDAwMDAwYzRjCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDdfQ0hBTk5FTAkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19NQVNURVIJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDdfTUFTVEVSX0NUWAkJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDdfTUFTVEVSX1JCREMJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA3X01BU1RFUl9UQkRDCQkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19NQVNURVJfQ09NCQkJICgzTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19NQVNURVJfQ1AJCQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA3X01BU1RFUl9URE1BCQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19TV0FQCQkJICgweDNMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA3X1NXQVBfQ09ORklHCQkJICgwTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19TV0FQX0RBVEEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA3X1NXQVBfQ09OVFJPTAkJICgyTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wN19GVU5DVElPTgkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDdfVkFMSUQJCQkgKDFMPDwxMCkKKworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4CQkJCTB4MDAwMDBjNTAKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOF9DSEFOTkVMCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X01BU1RFUgkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOF9NQVNURVJfQ1RYCQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOF9NQVNURVJfUkJEQwkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDhfTUFTVEVSX1RCREMJCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X01BU1RFUl9DT00JCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X01BU1RFUl9DUAkJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDhfTUFTVEVSX1RETUEJCQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X1NXQVAJCQkgKDB4M0w8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDhfU1dBUF9DT05GSUcJCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X1NXQVBfREFUQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDhfU1dBUF9DT05UUk9MCQkgKDJMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA4X0ZVTkNUSU9OCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOF9WQUxJRAkJCSAoMUw8PDEwKQorCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDkJCQkJMHgwMDAwMGM1NAorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA5X0NIQU5ORUwJCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfTUFTVEVSCQkJICgweDdMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA5X01BU1RFUl9DVFgJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA5X01BU1RFUl9SQkRDCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOV9NQVNURVJfVEJEQwkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfTUFTVEVSX0NPTQkJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfTUFTVEVSX0NQCQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOV9NQVNURVJfVERNQQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfU1dBUAkJCSAoMHgzTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOV9TV0FQX0NPTkZJRwkJCSAoMEw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfU1dBUF9EQVRBCQkJICgxTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8wOV9TV0FQX0NPTlRST0wJCSAoMkw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMDlfRlVOQ1RJT04JCQkgKDFMPDw5KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzA5X1ZBTElECQkJICgxTDw8MTApCisKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMAkJCQkweDAwMDAwYzU4CisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTBfQ0hBTk5FTAkJCSAoMHhmTDw8MCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9NQVNURVIJCQkgKDB4N0w8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTBfTUFTVEVSX0NUWAkJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTBfTUFTVEVSX1JCREMJCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzEwX01BU1RFUl9UQkRDCQkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9NQVNURVJfQ09NCQkJICgzTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9NQVNURVJfQ1AJCQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzEwX01BU1RFUl9URE1BCQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9TV0FQCQkJICgweDNMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzEwX1NXQVBfQ09ORklHCQkJICgwTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9TV0FQX0RBVEEJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzEwX1NXQVBfQ09OVFJPTAkJICgyTDw8NykKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMF9GVU5DVElPTgkJCSAoMUw8PDkpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTBfVkFMSUQJCQkgKDFMPDwxMCkKKworI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExCQkJCTB4MDAwMDBjNWMKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMV9DSEFOTkVMCQkJICgweGZMPDwwKQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX01BU1RFUgkJCSAoMHg3TDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMV9NQVNURVJfQ1RYCQkJICgwTDw8NCkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMV9NQVNURVJfUkJEQwkJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTFfTUFTVEVSX1RCREMJCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX01BU1RFUl9DT00JCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX01BU1RFUl9DUAkJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTFfTUFTVEVSX1RETUEJCQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX1NXQVAJCQkgKDB4M0w8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTFfU1dBUF9DT05GSUcJCQkgKDBMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX1NXQVBfREFUQQkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfRE1BX1RBR19SQU1fMTFfU1dBUF9DT05UUk9MCQkgKDJMPDw3KQorI2RlZmluZSBCTlgyX0RNQV9UQUdfUkFNXzExX0ZVTkNUSU9OCQkJICgxTDw8OSkKKyNkZWZpbmUgQk5YMl9ETUFfVEFHX1JBTV8xMV9WQUxJRAkJCSAoMUw8PDEwKQorCiAjZGVmaW5lIEJOWDJfRE1BX1JDSEFOX1NUQVRfMjIJCQkJMHgwMDAwMGM2MAogI2RlZmluZSBCTlgyX0RNQV9SQ0hBTl9TVEFUXzMwCQkJCTB4MDAwMDBjNjQKICNkZWZpbmUgQk5YMl9ETUFfUkNIQU5fU1RBVF8zMQkJCQkweDAwMDAwYzY4CkBAIC0xMzM2LDYgKzIzNDUsMjUgQEAKICAqLwogI2RlZmluZSBCTlgyX0NUWF9DT01NQU5ECQkJCTB4MDAwMDEwMDAKICNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9ESVNBQkxFX1VTQUdFX0NOVAkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9ESVNBQkxFX1BMUlUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX0RJU0FCTEVfQ09NQklORV9SRUFECQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX0ZMVVNIX0FIRUFECQkJICgweDFmTDw8OCkKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9NRU1fSU5JVAkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRQkJCSAoMHhmTDw8MTYpCisjZGVmaW5lIEJOWDJfQ1RYX0NPTU1BTkRfUEFHRV9TSVpFXzI1NgkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV81MTIJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfMUsJCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfMksJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfNEsJCQkgKDRMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfOEsJCQkgKDVMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfMTZLCQkJICg2TDw8MTYpCisjZGVmaW5lIEJOWDJfQ1RYX0NPTU1BTkRfUEFHRV9TSVpFXzMySwkJCSAoN0w8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV82NEsJCQkgKDhMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ09NTUFORF9QQUdFX1NJWkVfMTI4SwkJCSAoOUw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV8yNTZLCQkJICgxMEw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV81MTJLCQkJICgxMUw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9DT01NQU5EX1BBR0VfU0laRV8xTQkJCSAoMTJMPDwxNikKIAogI2RlZmluZSBCTlgyX0NUWF9TVEFUVVMJCQkJCTB4MDAwMDEwMDQKICNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0xPQ0tfV0FJVAkJCSAoMUw8PDApCkBAIC0xMzQzLDYgKzIzNzEsMTMgQEAKICNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX1dSSVRFX1NUQVQJCQkgKDFMPDwxNykKICNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0FDQ19TVEFMTF9TVEFUCQkJICgxTDw8MTgpCiAjZGVmaW5lIEJOWDJfQ1RYX1NUQVRVU19MT0NLX1NUQUxMX1NUQVQJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0VYVF9SRUFEX1NUQVQJCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0VYVF9XUklURV9TVEFUCQkJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfQ1RYX1NUQVRVU19NSVNTX1NUQVQJCQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0hJVF9TVEFUCQkJICgxTDw8MjMpCisjZGVmaW5lIEJOWDJfQ1RYX1NUQVRVU19ERUFEX0xPQ0sJCQkgKDFMPDwyNCkKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX1VTQUdFX0NOVF9FUlIJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9DVFhfU1RBVFVTX0lOVkFMSURfUEFHRQkJCSAoMUw8PDI2KQogCiAjZGVmaW5lIEJOWDJfQ1RYX1ZJUlRfQUREUgkJCQkweDAwMDAxMDA4CiAjZGVmaW5lIEJOWDJfQ1RYX1ZJUlRfQUREUl9WSVJUX0FERFIJCQkgKDB4N2ZmZkw8PDYpCkBAIC0xMzU3LDEwICsyMzkyLDE1IEBACiAjZGVmaW5lIEJOWDJfQ1RYX0xPQ0sJCQkJCTB4MDAwMDEwMTgKICNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFCQkJCSAoMHg3TDw8MCkKICNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFX0xPQ0tfVFlQRV9WT0lECQkgKDB4MEw8PDApCi0jZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfVFlQRV9MT0NLX1RZUEVfQ09NUExFVEUJCSAoMHg3TDw8MCkKICNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFX0xPQ0tfVFlQRV9QUk9UT0NPTAkJICgweDFMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfTE9DS19UWVBFX1RYCQkJICgweDJMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfTE9DS19UWVBFX1RJTUVSCQkgKDB4NEw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfVFlQRV9MT0NLX1RZUEVfQ09NUExFVEUJCSAoMHg3TDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfTE9DS19UWVBFX1ZPSURfWEkJCQkgKDBMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfUFJPVE9DT0xfWEkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfVFhfWEkJCQkgKDJMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfVElNRVJfWEkJCQkgKDRMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9MT0NLX1RZUEVfQ09NUExFVEVfWEkJCQkgKDdMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9MT0NLX0NJRF9WQUxVRQkJCQkgKDB4M2ZmZkw8PDcpCiAjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfR1JBTlRFRAkJCQkgKDFMPDwyNikKICNkZWZpbmUgQk5YMl9DVFhfTE9DS19NT0RFCQkJCSAoMHg3TDw8MjcpCkBAIC0xMzcwLDIxICsyNDEwLDg5IEBACiAjZGVmaW5lIEJOWDJfQ1RYX0xPQ0tfU1RBVFVTCQkJCSAoMUw8PDMwKQogI2RlZmluZSBCTlgyX0NUWF9MT0NLX1JFUQkJCQkgKDFMPDwzMSkKIAorI2RlZmluZSBCTlgyX0NUWF9DVFhfQ1RSTAkJCQkweDAwMDAxMDFjCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9DVFJMX0NUWF9BRERSCQkJICgweDdmZmZmTDw8MikKKyNkZWZpbmUgQk5YMl9DVFhfQ1RYX0NUUkxfTU9EX1VTQUdFX0NOVAkJCSAoMHgzTDw8MjEpCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9DVFJMX05PX1JBTV9BQ0MJCQkgKDFMPDwyMykKKyNkZWZpbmUgQk5YMl9DVFhfQ1RYX0NUUkxfUFJFRkVUQ0hfU0laRQkJCSAoMHgzTDw8MjQpCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9DVFJMX0FUVFIJCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9DVFJMX1dSSVRFX1JFUQkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX0NUWF9DVFhfQ1RSTF9SRUFEX1JFUQkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfQ1RYX0NUWF9EQVRBCQkJCTB4MDAwMDEwMjAKICNkZWZpbmUgQk5YMl9DVFhfQUNDRVNTX1NUQVRVUwkJCQkweDAwMDAxMDQwCiAjZGVmaW5lIEJOWDJfQ1RYX0FDQ0VTU19TVEFUVVNfTUFTVEVSRU5DT0RFRAkJICgweGZMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX0FDQ0VTU01FTU9SWVNNCQkgKDB4M0w8PDEwKQogI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX1BBR0VUQUJMRUlOSVRTTQkJICgweDNMPDwxMikKICNkZWZpbmUgQk5YMl9DVFhfQUNDRVNTX1NUQVRVU19BQ0NFU1NNRU1PUllJTklUU00JICgweDNMPDwxNCkKICNkZWZpbmUgQk5YMl9DVFhfQUNDRVNTX1NUQVRVU19RVUFMSUZJRURfUkVRVUVTVAkgKDB4N2ZmTDw8MTcpCisjZGVmaW5lIEJOWDJfQ1RYX0FDQ0VTU19TVEFUVVNfQ0FNTUFTVEVSRU5DT0RFRF9YSQkgKDB4MWZMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX0NBQ0hFTUFTVEVSRU5DT0RFRF9YSQkgKDB4MWZMPDw1KQorI2RlZmluZSBCTlgyX0NUWF9BQ0NFU1NfU1RBVFVTX1JFUVVFU1RfWEkJCSAoMHgzZmZmZmZMPDwxMCkKIAogI2RlZmluZSBCTlgyX0NUWF9EQkdfTE9DS19TVEFUVVMJCQkweDAwMDAxMDQ0CiAjZGVmaW5lIEJOWDJfQ1RYX0RCR19MT0NLX1NUQVRVU19TTQkJCSAoMHgzZmZMPDwwKQogI2RlZmluZSBCTlgyX0NUWF9EQkdfTE9DS19TVEFUVVNfTUFUQ0gJCQkgKDB4M2ZmTDw8MjIpCiAKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVMJCQkweDAwMDAxMDQ4CisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JGSUZPX09WRVJGTE9XCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX0lOVkFMSURfUkVBRF9DT01QCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX0ZMVVNIX1NUQVJUCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19GUkVFX0VOVFJZX0NOVAkgKDB4M2ZMPDw3KQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19DQUNIRV9FTlRSWV9ORUVERUQJICgweDNmTDw8MTMpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JEX0NIQU4wX0FDVElWRQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVNfUkRfQ0hBTjFfQUNUSVZFCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19SRF9DSEFOMl9BQ1RJVkUJICgxTDw8MjEpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JEX0NIQU4zX0FDVElWRQkgKDFMPDwyMikKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVNfUkRfQ0hBTjRfQUNUSVZFCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19SRF9DSEFONV9BQ1RJVkUJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JEX0NIQU42X0FDVElWRQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVNfUkRfQ0hBTjdfQUNUSVZFCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NUQVRVU19SRF9DSEFOOF9BQ1RJVkUJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU1RBVFVTX1JEX0NIQU45X0FDVElWRQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TVEFUVVNfUkRfQ0hBTjEwX0FDVElWRQkgKDFMPDwyOSkKKworI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NNX1NUQVRVUwkJCTB4MDAwMDEwNGMKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TTV9TVEFUVVNfQ1NfRFdDCQkgKDB4N0w8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX0NUUkxfU01fU1RBVFVTX0NTX1dGSUZPQwkJICgweDdMPDwzKQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NNX1NUQVRVU19DU19SVEFHQwkJICgweDdMPDw2KQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9DVFJMX1NNX1NUQVRVU19DU19SRklGT0MJCSAoMHg3TDw8OSkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfQ1RSTF9TTV9TVEFUVVNfSU5WQUxJRF9CTEtfQUREUgkgKDB4N2ZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX1NUQVRVUwkJCQkweDAwMDAxMDUwCisjZGVmaW5lIEJOWDJfQ1RYX0NBQ0hFX1NUQVRVU19IRUxEX0VOVFJJRVMJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9DQUNIRV9TVEFUVVNfTUFYX0hFTERfRU5UUklFUwkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfQ1RYX0RNQV9TVEFUVVMJCQkJMHgwMDAwMTA1NAorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU4wX1NUQVRVUwkJICgweDNMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU4xX1NUQVRVUwkJICgweDNMPDwyKQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU4yX1NUQVRVUwkJICgweDNMPDw0KQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU4zX1NUQVRVUwkJICgweDNMPDw2KQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU40X1NUQVRVUwkJICgweDNMPDw4KQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU41X1NUQVRVUwkJICgweDNMPDwxMCkKKyNkZWZpbmUgQk5YMl9DVFhfRE1BX1NUQVRVU19SRF9DSEFONl9TVEFUVVMJCSAoMHgzTDw8MTIpCisjZGVmaW5lIEJOWDJfQ1RYX0RNQV9TVEFUVVNfUkRfQ0hBTjdfU1RBVFVTCQkgKDB4M0w8PDE0KQorI2RlZmluZSBCTlgyX0NUWF9ETUFfU1RBVFVTX1JEX0NIQU44X1NUQVRVUwkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfRE1BX1NUQVRVU19SRF9DSEFOOV9TVEFUVVMJCSAoMHgzTDw8MTgpCisjZGVmaW5lIEJOWDJfQ1RYX0RNQV9TVEFUVVNfUkRfQ0hBTjEwX1NUQVRVUwkJICgweDNMPDwyMCkKKworI2RlZmluZSBCTlgyX0NUWF9SRVBfU1RBVFVTCQkJCTB4MDAwMDEwNTgKKyNkZWZpbmUgQk5YMl9DVFhfUkVQX1NUQVRVU19FUlJPUl9FTlRSWQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0NUWF9SRVBfU1RBVFVTX0VSUk9SX0NMSUVOVF9JRAkJICgweDFmTDw8MTApCisjZGVmaW5lIEJOWDJfQ1RYX1JFUF9TVEFUVVNfVVNBR0VfQ05UX01BWF9FUlIJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0NUWF9SRVBfU1RBVFVTX1VTQUdFX0NOVF9NSU5fRVJSCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9DVFhfUkVQX1NUQVRVU19VU0FHRV9DTlRfTUlTU19FUlIJCSAoMUw8PDE4KQorCisjZGVmaW5lIEJOWDJfQ1RYX0NLU1VNX0VSUk9SX1NUQVRVUwkJCTB4MDAwMDEwNWMKKyNkZWZpbmUgQk5YMl9DVFhfQ0tTVU1fRVJST1JfU1RBVFVTX0NBTENVTEFURUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfQ0tTVU1fRVJST1JfU1RBVFVTX0VYUEVDVEVECQkgKDB4ZmZmZkw8PDE2KQorCiAjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMAkJCTB4MDAwMDEwODAKICNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU18wX0NJRAkJCSAoMHgzZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU18wX1RZUEUJCSAoMHgzTDw8MTQpCiAjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMF9NT0RFCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU18wX01PREVfWEkJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzBfVFlQRV9YSQkJICgweDdMPDwxNSkKIAogI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzEJCQkweDAwMDAxMDg0CiAjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfMgkJCTB4MDAwMDEwODgKQEAgLTEzOTQsNiArMjUwMiwyNiBAQAogI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzYJCQkweDAwMDAxMDk4CiAjZGVmaW5lIEJOWDJfQ1RYX0NITkxfTE9DS19TVEFUVVNfNwkJCTB4MDAwMDEwOWMKICNkZWZpbmUgQk5YMl9DVFhfQ0hOTF9MT0NLX1NUQVRVU184CQkJMHgwMDAwMTBhMAorI2RlZmluZSBCTlgyX0NUWF9DSE5MX0xPQ0tfU1RBVFVTXzkJCQkweDAwMDAxMGE0CisKKyNkZWZpbmUgQk5YMl9DVFhfQ0FDSEVfREFUQQkJCQkweDAwMDAxMGM0CisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfQ1RSTAkJCTB4MDAwMDEwYzgKKyNkZWZpbmUgQk5YMl9DVFhfSE9TVF9QQUdFX1RCTF9DVFJMX1BBR0VfVEJMX0FERFIJICgweDFmZkw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfQ1RSTF9XUklURV9SRVEJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX0NUWF9IT1NUX1BBR0VfVEJMX0NUUkxfUkVBRF9SRVEJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTAJCQkweDAwMDAxMGNjCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTBfVkFMSUQJCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTBfVkFMVUUJCSAoMHhmZmZmZmZMPDw4KQorCisjZGVmaW5lIEJOWDJfQ1RYX0hPU1RfUEFHRV9UQkxfREFUQTEJCQkweDAwMDAxMGQwCisjZGVmaW5lIEJOWDJfQ1RYX0NBTV9DVFJMCQkJCTB4MDAwMDEwZDQKKyNkZWZpbmUgQk5YMl9DVFhfQ0FNX0NUUkxfQ0FNX0FERFIJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FNX0NUUkxfUkVTRVQJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfQ1RYX0NBTV9DVFJMX0lOVkFMSURBVEUJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9DVFhfQ0FNX0NUUkxfU0VBUkNICQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfQ1RYX0NBTV9DVFJMX1dSSVRFX1JFUQkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX0NUWF9DQU1fQ1RSTF9SRUFEX1JFUQkJCSAoMUw8PDMxKQogCiAKIC8qCkBAIC0xNDA3LDE0ICsyNTM1LDE2IEBACiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlRfTk9ORQkJCSAoMEw8PDIpCiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlRfTUlJCQkJCSAoMUw8PDIpCiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlRfR01JSQkJCSAoMkw8PDIpCi0jZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1BPUlRfTUlJXzEwCQkJICgzTDw8MikKKyNkZWZpbmUgQk5YMl9FTUFDX01PREVfUE9SVF9NSUlfMTBNCQkJICgzTDw8MikKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfTUFDX0xPT1AJCQkJICgxTDw8NCkKLSNkZWZpbmUgQk5YMl9FTUFDX01PREVfMjVHCQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfRU1BQ19NT0RFXzI1R19NT0RFCQkJCSAoMUw8PDUpCiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX1RBR0dFRF9NQUNfQ1RMCQkJICgxTDw8NykKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfVFhfQlVSU1QJCQkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfTUFYX0RFRkVSX0RST1BfRU5BCQkgKDFMPDw5KQogI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9FWFRfTElOS19QT0wJCQkgKDFMPDwxMCkKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfRk9SQ0VfTElOSwkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9TRVJERVNfTU9ERQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX0VNQUNfTU9ERV9CT05EX09WUkQJCQkgKDFMPDwxMykKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfTVBLVAkJCQkgKDFMPDwxOCkKICNkZWZpbmUgQk5YMl9FTUFDX01PREVfTVBLVF9SQ1ZECQkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfRU1BQ19NT0RFX0FDUElfUkNWRAkJCSAoMUw8PDIwKQpAQCAtMTQyMiw2ICsyNTUyLDExIEBACiAjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVMJCQkJMHgwMDAwMTQwNAogI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX0xJTksJCQkJICgxTDw8MTEpCiAjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVNfTElOS19DSEFOR0UJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19TRVJERVNfQVVUT05FR19DT01QTEVURQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19TRVJERVNfQVVUT05FR19DSEFOR0UJCSAoMUw8PDE0KQorI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX1NFUkRFU19OWFRfUEdfQ0hBTkdFCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19TRVJERVNfUlhfQ09ORklHX0lTXzAJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0VNQUNfU1RBVFVTX1NFUkRFU19SWF9DT05GSUdfSVNfMF9DSEFOR0UJICgxTDw8MTgpCiAjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVNfTUlfQ09NUExFVEUJCQkgKDFMPDwyMikKICNkZWZpbmUgQk5YMl9FTUFDX1NUQVRVU19NSV9JTlQJCQkJICgxTDw8MjMpCiAjZGVmaW5lIEJOWDJfRU1BQ19TVEFUVVNfQVBfRVJST1IJCQkgKDFMPDwyNCkKQEAgLTE0MjksNiArMjU2NCw5IEBACiAKICNkZWZpbmUgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkEJCQkJMHgwMDAwMTQwOAogI2RlZmluZSBCTlgyX0VNQUNfQVRURU5USU9OX0VOQV9MSU5LCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX0FVVE9ORUdfQ0hBTkdFCQkgKDFMPDwxNCkKKyNkZWZpbmUgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkFfTlhUX1BHX0NIQU5HRQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX1NFUkRFU19SWF9DT05GSUdfSVNfMF9DSEFOR0UJICgxTDw8MTgpCiAjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX01JX0NPTVBMRVRFCQkgKDFMPDwyMikKICNkZWZpbmUgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkFfTUlfSU5UCQkJICgxTDw8MjMpCiAjZGVmaW5lIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX0FQX0VSUk9SCQkgKDFMPDwyNCkKQEAgLTE0NDUsNiArMjU4MywxMyBAQAogI2RlZmluZSBCTlgyX0VNQUNfTEVEXzEwME1CCQkJCSAoMUw8PDgpCiAjZGVmaW5lIEJOWDJfRU1BQ19MRURfMTBNQgkJCQkgKDFMPDw5KQogI2RlZmluZSBCTlgyX0VNQUNfTEVEX1RSQUZGSUNfU1RBVAkJCSAoMUw8PDEwKQorI2RlZmluZSBCTlgyX0VNQUNfTEVEXzI1MDBNQgkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF8yNTAwTUJfT1ZFUlJJREUJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF9BQ1RJVklUWV9TRUwJCQkgKDB4M0w8PDE3KQorI2RlZmluZSBCTlgyX0VNQUNfTEVEX0FDVElWSVRZX1NFTF8wCQkJICgwTDw8MTcpCisjZGVmaW5lIEJOWDJfRU1BQ19MRURfQUNUSVZJVFlfU0VMXzEJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9FTUFDX0xFRF9BQ1RJVklUWV9TRUxfMgkJCSAoMkw8PDE3KQorI2RlZmluZSBCTlgyX0VNQUNfTEVEX0FDVElWSVRZX1NFTF8zCQkJICgzTDw8MTcpCiAjZGVmaW5lIEJOWDJfRU1BQ19MRURfQkxOS19SQVRFCQkJCSAoMHhmZmZMPDwxOSkKICNkZWZpbmUgQk5YMl9FTUFDX0xFRF9CTE5LX1JBVEVfRU5BCQkJICgxTDw8MzEpCiAKQEAgLTE1MTUsOSArMjY2MCwxNSBAQAogI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX1BIWV9BRERSCQkJICgweDFmTDw8MjEpCiAjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORAkJCSAoMHgzTDw8MjYpCiAjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9VTkRFRklORURfMAkJICgwTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9BRERSRVNTCQkgKDBMPDwyNikKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9DT01NQU5EX1dSSVRFCQkgKDFMPDwyNikKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9DT01NQU5EX1JFQUQJCSAoMkw8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEVfMjJfWEkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEVfNDVfWEkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0NPTU1BTkRfUkVBRF8yMl9YSQkJICgyTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fQ09NTUFORF9SRUFEX0lOQ180NV9YSQkgKDJMPDwyNikKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9DT01NQU5EX1VOREVGSU5FRF8zCQkgKDNMPDwyNikKKyNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9DT01NQU5EX1JFQURfNDUJCSAoM0w8PDI2KQogI2RlZmluZSBCTlgyX0VNQUNfTURJT19DT01NX0ZBSUwJCQkgKDFMPDwyOCkKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZCQkJICgxTDw8MjkpCiAjZGVmaW5lIEJOWDJfRU1BQ19NRElPX0NPTU1fRElTRVhUCQkJICgxTDw8MzApCkBAIC0xNTM0LDEzICsyNjg1LDE3IEBACiAjZGVmaW5lIEJOWDJfRU1BQ19NRElPX01PREVfTURJT19PRQkJCSAoMUw8PDEwKQogI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX01EQwkJCQkgKDFMPDwxMSkKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fTU9ERV9NRElOVAkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX0VYVF9NRElOVAkJCSAoMUw8PDEzKQogI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX0NMT0NLX0NOVAkJCSAoMHgxZkw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfTURJT19NT0RFX0NMT0NLX0NOVF9YSQkJICgweDNmTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1X1hJCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX0VNQUNfTURJT19BVVRPX1NUQVRVUwkJCTB4MDAwMDE0YjgKICNkZWZpbmUgQk5YMl9FTUFDX01ESU9fQVVUT19TVEFUVVNfQVVUT19FUlIJCSAoMUw8PDApCiAKICNkZWZpbmUgQk5YMl9FTUFDX1RYX01PREUJCQkJMHgwMDAwMTRiYwogI2RlZmluZSBCTlgyX0VNQUNfVFhfTU9ERV9SRVNFVAkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0VNQUNfVFhfTU9ERV9DUzE2X1RFU1QJCQkgKDFMPDwyKQogI2RlZmluZSBCTlgyX0VNQUNfVFhfTU9ERV9FWFRfUEFVU0VfRU4JCQkgKDFMPDwzKQogI2RlZmluZSBCTlgyX0VNQUNfVFhfTU9ERV9GTE9XX0VOCQkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9FTUFDX1RYX01PREVfQklHX0JBQ0tPRkYJCQkgKDFMPDw1KQpAQCAtMTU1Myw2ICsyNzA4LDcgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRVU19YT05fU0VOVAkJCSAoMUw8PDIpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUVVNfTElOS19VUAkJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUVVNfVU5ERVJSVU4JCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVFVTX0NTMTZfRVJST1IJCQkgKDFMPDw1KQogCiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9MRU5HVEhTCQkJCTB4MDAwMDE0YzQKICNkZWZpbmUgQk5YMl9FTUFDX1RYX0xFTkdUSFNfU0xPVAkJCSAoMHhmZkw8PDApCkBAIC0xNTg2LDYgKzI3NDIsMTAgQEAKICNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINQkJCTB4MDAwMDE0ZTQKICNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINgkJCTB4MDAwMDE0ZTgKICNkZWZpbmUgQk5YMl9FTUFDX01VTFRJQ0FTVF9IQVNINwkJCTB4MDAwMDE0ZWMKKyNkZWZpbmUgQk5YMl9FTUFDX0NLU1VNX0VSUk9SX1NUQVRVUwkJCTB4MDAwMDE0ZjAKKyNkZWZpbmUgQk5YMl9FTUFDX0NLU1VNX0VSUk9SX1NUQVRVU19DQUxDVUxBVEVECQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfRU1BQ19DS1NVTV9FUlJPUl9TVEFUVVNfRVhQRUNURUQJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfSUZIQ0lOT0NURVRTCQkJMHgwMDAwMTUwMAogI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9JRkhDSU5CQURPQ1RFVFMJCTB4MDAwMDE1MDQKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU0ZSQUdNRU5UUwkJMHgwMDAwMTUwOApAQCAtMTYwOCw3ICsyNzY4LDcgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMyNTZPQ1RFVFNUTzUxMU9DVEVUUwkweDAwMDAxNTRjCiAjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0VUSEVSU1RBVFNQS1RTNTEyT0NURVRTVE8xMDIzT0NURVRTCTB4MDAwMDE1NTAKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMxMDI0T0NURVRTVE8xNTIyT0NURVRTCTB4MDAwMDE1NTQKLSNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFMxNTIzT0NURVRTVE85MDIyT0NURVRTCTB4MDAwMDE1NTgKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRVRIRVJTVEFUU1BLVFNPVkVSMTUyMk9DVEVUUwkweDAwMDAxNTU4CiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzAJCQkJMHgwMDAwMTU1YwogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUcxCQkJCTB4MDAwMDE1NjAKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHMV9MRU5HVEhfTkVfQllURV9DT1VOVAkgKDFMPDwwKQpAQCAtMTY2MSw5ICsyODIxLDkgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1VNQUMyCQkgKDB4MUw8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfVU1BQzMJCSAoMHgyTDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9VTkkJCSAoMHgzTDw8MTYpCi0jZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9NTUFDMgkJICgweDdMPDwxNikKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX01NQUMzCQkgKDB4NUw8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfUFNBMQkJICgweDZMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX01NQUMyCQkgKDB4N0w8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X0ZJTFRfU1RBVEVfUFNBMgkJICgweDdMPDwxNikKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GSUxUX1NUQVRFX1BTQTMJCSAoMHg4TDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfRklMVF9TVEFURV9NQzIJCSAoMHg5TDw8MTYpCkBAIC0xNzAxLDcgKzI4NjEsNyBAQAogI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X1NMT1RfRklMTEVECQkgKDFMPDwyMykKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9GQUxTRV9DQVJSSUVSCQkgKDFMPDwyNCkKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9MQVNUX0RBVEEJCSAoMUw8PDI1KQotI2RlZmluZSBCTlgyX0VNQUNfUlhNQUNfREVCVUc0X3NmZF9GT1VORAkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfU0ZEX0ZPVU5ECQkgKDFMPDwyNikKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNF9BRFZBTkNFCQkJICgxTDw8MjcpCiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzRfU1RBUlQJCQkgKDFMPDwyOCkKIApAQCAtMTczMyw2ICsyODkzLDcgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1JYTUFDX0RFQlVHNV9JRElfUlBNX0FDQ0VQVAkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19ERUJVRzVfRk1MRU4JCQkgKDB4ZmZmTDw8MjApCiAKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfRkFMU0VDQVJSSUVSRVJST1JTCQkweDAwMDAxNTc0CiAjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMAkJCQkweDAwMDAxNTgwCiAjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMQkJCQkweDAwMDAxNTg0CiAjZGVmaW5lIEJOWDJfRU1BQ19SWF9TVEFUX0FDMgkJCQkweDAwMDAxNTg4CkBAIC0xNzU3LDYgKzI5MTgsNyBAQAogI2RlZmluZSBCTlgyX0VNQUNfUlhfU1RBVF9BQzIxCQkJCTB4MDAwMDE1ZDQKICNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfQUMyMgkJCQkweDAwMDAxNWQ4CiAjZGVmaW5lIEJOWDJfRU1BQ19SWE1BQ19TVUNfREJHX09WRVJSVU5WRUMJCTB4MDAwMDE1ZGMKKyNkZWZpbmUgQk5YMl9FTUFDX1JYX1NUQVRfQUNfMjgJCQkJMHgwMDAwMTVmNAogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9JRkhDT1VUT0NURVRTCQkJMHgwMDAwMTYwMAogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9JRkhDT1VUQkFET0NURVRTCQkweDAwMDAxNjA0CiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0VUSEVSU1RBVFNDT0xMSVNJT05TCQkweDAwMDAxNjA4CkBAIC0xNzc3LDcgKzI5MzksNyBAQAogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUUzI1Nk9DVEVUU1RPNTExT0NURVRTCTB4MDAwMDE2NDQKICNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRVRIRVJTVEFUU1BLVFM1MTJPQ1RFVFNUTzEwMjNPQ1RFVFMJMHgwMDAwMTY0OAogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUUzEwMjRPQ1RFVFNUTzE1MjJPQ1RFVFMJMHgwMDAwMTY0YwotI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUUzE1MjNPQ1RFVFNUTzkwMjJPQ1RFVFMJMHgwMDAwMTY1MAorI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9FVEhFUlNUQVRTUEtUU09WRVIxNTIyT0NURVRTCTB4MDAwMDE2NTAKICNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfRE9UM1NUQVRTSU5URVJOQUxNQUNUUkFOU01JVEVSUk9SUwkweDAwMDAxNjU0CiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzAJCQkJMHgwMDAwMTY1OAogI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUcxCQkJCTB4MDAwMDE2NWMKQEAgLTE4NDMsMTYgKzMwMDUsMTYgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9JRExFCQkgKDB4MEw8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX01DQTEJCSAoMHgyTDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfTUNBMgkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9TUkMzCQkgKDB4NEw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1NSQzIJCSAoMHg1TDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfTUNBMwkJICgweDZMPDwxNikKICNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9TUkMxCQkgKDB4N0w8PDE2KQotI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1NSQzIJCSAoMHg1TDw8MTYpCi0jZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfU1JDMwkJICgweDRMPDwxNikKLSNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9UWVBFCQkgKDB4Y0w8PDE2KQotI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX0NNRAkJICgweGVMPDwxNikKLSNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9USU1FCQkgKDB4YUw8PDE2KQogI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX0NSQzEJCSAoMHg4TDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfQ1JDMgkJICgweDlMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9USU1FCQkgKDB4YUw8PDE2KQorI2RlZmluZSBCTlgyX0VNQUNfVFhNQUNfREVCVUc0X1BBVVNFX1NUQVRFX1RZUEUJCSAoMHhjTDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfUEFVU0VfU1RBVEVfV0FJVAkJICgweGRMPDwxNikKKyNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9QQVVTRV9TVEFURV9DTUQJCSAoMHhlTDw8MTYpCiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19ERUJVRzRfU1RBVFMwX1ZBTElECQkgKDFMPDwyMCkKICNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9BUFBFTkRfQ1JDCQkgKDFMPDwyMSkKICNkZWZpbmUgQk5YMl9FTUFDX1RYTUFDX0RFQlVHNF9TTE9UX0ZJTExFRAkJICgxTDw8MjIpCkBAIC0xODg3LDggKzMwNDksMTEgQEAKICNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfQUMxOAkJCQkweDAwMDAxNmM4CiAjZGVmaW5lIEJOWDJfRU1BQ19UWF9TVEFUX0FDMTkJCQkJMHgwMDAwMTZjYwogI2RlZmluZSBCTlgyX0VNQUNfVFhfU1RBVF9BQzIwCQkJCTB4MDAwMDE2ZDAKLSNkZWZpbmUgQk5YMl9FTUFDX1RYX1NUQVRfQUMyMQkJCQkweDAwMDAxNmQ0CiAjZGVmaW5lIEJOWDJfRU1BQ19UWE1BQ19TVUNfREJHX09WRVJSVU5WRUMJCTB4MDAwMDE2ZDgKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1JBVEVfTElNSVRfQ1RSTAkJCTB4MDAwMDE2ZmMKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1JBVEVfTElNSVRfQ1RSTF9UWF9USFJPVFRMRV9JTkMJICgweDdmTDw8MCkKKyNkZWZpbmUgQk5YMl9FTUFDX1RYX1JBVEVfTElNSVRfQ1RSTF9UWF9USFJPVFRMRV9OVU0JICgweDdmTDw8MTYpCisjZGVmaW5lIEJOWDJfRU1BQ19UWF9SQVRFX0xJTUlUX0NUUkxfUkFURV9MSU1JVEVSX0VOCSAoMUw8PDMxKQogCiAKIC8qCkBAIC0xOTA5LDggKzMwNzQsMTUgQEAKICNkZWZpbmUgQk5YMl9SUE1fQ09ORklHX0FDUElfS0VFUAkJCSAoMUw8PDIpCiAjZGVmaW5lIEJOWDJfUlBNX0NPTkZJR19NUF9LRUVQCQkJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfUlBNX0NPTkZJR19TT1JUX1ZFQ1RfVkFMCQkJICgweGZMPDw0KQorI2RlZmluZSBCTlgyX1JQTV9DT05GSUdfRElTQUJMRV9XT0xfQVNTRVJUCQkgKDFMPDwzMCkKICNkZWZpbmUgQk5YMl9SUE1fQ09ORklHX0lHTk9SRV9WTEFOCQkJICgxTDw8MzEpCiAKKyNkZWZpbmUgQk5YMl9SUE1fTUdNVF9QS1RfQ1RSTAkJCQkweDAwMDAxODBjCisjZGVmaW5lIEJOWDJfUlBNX01HTVRfUEtUX0NUUkxfTUdNVF9TT1JUCQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX01HTVRfUEtUX0NUUkxfTUdNVF9SVUxFCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfUlBNX01HTVRfUEtUX0NUUkxfTUdNVF9ESVNDQVJEX0VOCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fTUdNVF9QS1RfQ1RSTF9NR01UX0VOCQkJICgxTDw8MzEpCisKICNkZWZpbmUgQk5YMl9SUE1fVkxBTl9NQVRDSDAJCQkJMHgwMDAwMTgxMAogI2RlZmluZSBCTlgyX1JQTV9WTEFOX01BVENIMF9SUE1fVkxBTl9NVENIMF9WQUxVRQkgKDB4ZmZmTDw8MCkKIApAQCAtMTkzMSw2ICszMTAzLDcgQEAKICNkZWZpbmUgQk5YMl9SUE1fU09SVF9VU0VSMF9QUk9NX0VOCQkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfVkxBTl9FTgkJCSAoMHhmTDw8MjApCiAjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfUFJPTV9WTEFOCQkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfVkxBTl9OT1RNQVRDSAkJICgxTDw8MjUpCiAjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjBfRU5BCQkJCSAoMUw8PDMxKQogCiAjZGVmaW5lIEJOWDJfUlBNX1NPUlRfVVNFUjEJCQkJMHgwMDAwMTgyNApAQCAtMTk2OCwxMSArMzE0MSwxODcgQEAKICNkZWZpbmUgQk5YMl9SUE1fU1RBVF9JRklORlRRRElTQ0FSRFMJCQkweDAwMDAxODQ4CiAjZGVmaW5lIEJOWDJfUlBNX1NUQVRfSUZJTk1CVUZESVNDQVJECQkJMHgwMDAwMTg0YwogI2RlZmluZSBCTlgyX1JQTV9TVEFUX1JVTEVfQ0hFQ0tFUl9QNF9ISVQJCTB4MDAwMDE4NTAKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMAkJMHgwMDAwMTg1NAorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04wX05FWFRfSEVBREVSX0xFTgkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04wX05FWFRfSEVBREVSCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04wX05FWFRfSEVBREVSX0xFTl9UWVBFCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04wX05FWFRfSEVBREVSX0VOCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjEJCTB4MDAwMDE4NTgKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMV9ORVhUX0hFQURFUl9MRU4JICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMV9ORVhUX0hFQURFUgkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMV9ORVhUX0hFQURFUl9MRU5fVFlQRQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMV9ORVhUX0hFQURFUl9FTgkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04yCQkweDAwMDAxODVjCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjJfTkVYVF9IRUFERVJfTEVOCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjJfTkVYVF9IRUFERVIJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjJfTkVYVF9IRUFERVJfTEVOX1RZUEUJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjJfTkVYVF9IRUFERVJfRU4JICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9OMwkJMHgwMDAwMTg2MAorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04zX05FWFRfSEVBREVSX0xFTgkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04zX05FWFRfSEVBREVSCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04zX05FWFRfSEVBREVSX0xFTl9UWVBFCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT04zX05FWFRfSEVBREVSX0VOCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjQJCTB4MDAwMDE4NjQKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONF9ORVhUX0hFQURFUl9MRU4JICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONF9ORVhUX0hFQURFUgkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONF9ORVhUX0hFQURFUl9MRU5fVFlQRQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONF9ORVhUX0hFQURFUl9FTgkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT041CQkweDAwMDAxODY4CisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjVfTkVYVF9IRUFERVJfTEVOCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjVfTkVYVF9IRUFERVIJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjVfTkVYVF9IRUFERVJfTEVOX1RZUEUJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjVfTkVYVF9IRUFERVJfRU4JICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ONgkJMHgwMDAwMTg2YworI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT042X05FWFRfSEVBREVSX0xFTgkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT042X05FWFRfSEVBREVSCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT042X05FWFRfSEVBREVSX0xFTl9UWVBFCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9JUFY2X1BST0dSQU1NQUJMRV9FWFRFTlNJT042X05FWFRfSEVBREVSX0VOCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0lQVjZfUFJPR1JBTU1BQkxFX0VYVEVOU0lPTjcJCTB4MDAwMDE4NzAKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ON19ORVhUX0hFQURFUl9MRU4JICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ON19ORVhUX0hFQURFUgkgKDB4ZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ON19ORVhUX0hFQURFUl9MRU5fVFlQRQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9SUE1fSVBWNl9QUk9HUkFNTUFCTEVfRVhURU5TSU9ON19ORVhUX0hFQURFUl9FTgkgKDFMPDwzMSkKKwogI2RlZmluZSBCTlgyX1JQTV9TVEFUX0FDMAkJCQkweDAwMDAxODgwCiAjZGVmaW5lIEJOWDJfUlBNX1NUQVRfQUMxCQkJCTB4MDAwMDE4ODQKICNkZWZpbmUgQk5YMl9SUE1fU1RBVF9BQzIJCQkJMHgwMDAwMTg4OAogI2RlZmluZSBCTlgyX1JQTV9TVEFUX0FDMwkJCQkweDAwMDAxODhjCiAjZGVmaW5lIEJOWDJfUlBNX1NUQVRfQUM0CQkJCTB4MDAwMDE4OTAKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNgkJCQkweDAwMDAxOGUwCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfT0ZGU0VUCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9DTEFTUwkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9QUklPUklUWQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X1A0CQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X0hEUl9UWVBFCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9IRFJfVFlQRV9TVEFSVAkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfSERSX1RZUEVfSVAJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9IRFJfVFlQRV9UQ1AJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X0hEUl9UWVBFX1VEUAkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfSERSX1RZUEVfREFUQQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfSERSX1RZUEVfVENQX1VEUAkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfSERSX1RZUEVfSUNNUFY2CQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9DT01QCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9DT01QX0VRVUFMCQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfQ09NUF9ORVFVQUwJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9DT01QX0dSRUFURVIJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X0NPTVBfTEVTUwkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X01BUAkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9TQklUCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfQ01EU0VMCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTZfRElTQ0FSRAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE2X01BU0sJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9QMQkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9QMgkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9QMwkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNl9OQklUCQkJICgxTDw8MzApCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNgkJCTB4MDAwMDE4ZTQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNl9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNl9NQVNLCQkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3CQkJCTB4MDAwMDE4ZTgKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19PRkZTRVQJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0NMQVNTCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1BSSU9SSVRZCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfUDQJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfSERSX1RZUEUJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0hEUl9UWVBFX1NUQVJUCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19IRFJfVFlQRV9JUAkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0hEUl9UWVBFX1RDUAkJICgyTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfSERSX1RZUEVfVURQCQkgKDNMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19IRFJfVFlQRV9EQVRBCQkgKDRMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19IRFJfVFlQRV9UQ1BfVURQCQkgKDVMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19IRFJfVFlQRV9JQ01QVjYJCSAoNkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0NPTVAJCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0NPTVBfRVFVQUwJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19DT01QX05FUVVBTAkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X0NPTVBfR1JFQVRFUgkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfQ09NUF9MRVNTCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfTUFQCQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1NCSVQJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19DTURTRUwJCQkgKDB4MWZMPDwyMCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xN19ESVNDQVJECQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTdfTUFTSwkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1AxCQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1AyCQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X1AzCQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE3X05CSVQJCQkgKDFMPDwzMCkKKworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzE3CQkJMHgwMDAwMThlYworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzE3X1ZBTFVFCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzE3X01BU0sJCQkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTgJCQkJMHgwMDAwMThmMAorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X09GRlNFVAkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfQ0xBU1MJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfUFJJT1JJVFkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9QNAkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9IRFJfVFlQRQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfSERSX1RZUEVfU1RBUlQJCSAoMEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0hEUl9UWVBFX0lQCQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfSERSX1RZUEVfVENQCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9IRFJfVFlQRV9VRFAJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0hEUl9UWVBFX0RBVEEJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0hEUl9UWVBFX1RDUF9VRFAJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0hEUl9UWVBFX0lDTVBWNgkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfQ09NUAkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfQ09NUF9FUVVBTAkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0NPTVBfTkVRVUFMCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfQ09NUF9HUkVBVEVSCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9DT01QX0xFU1MJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9NQVAJCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfU0JJVAkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0NNRFNFTAkJCSAoMHgxZkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE4X0RJU0NBUkQJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOF9NQVNLCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfUDEJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfUDIJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfUDMJCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMThfTkJJVAkJCSAoMUw8PDMwKQorCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMTgJCQkweDAwMDAxOGY0CisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMThfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMThfTUFTSwkJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOQkJCQkweDAwMDAxOGY4CisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfT0ZGU0VUCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9DTEFTUwkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9QUklPUklUWQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X1A0CQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X0hEUl9UWVBFCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9IRFJfVFlQRV9TVEFSVAkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfSERSX1RZUEVfSVAJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9IRFJfVFlQRV9UQ1AJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X0hEUl9UWVBFX1VEUAkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfSERSX1RZUEVfREFUQQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfSERSX1RZUEVfVENQX1VEUAkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfSERSX1RZUEVfSUNNUFY2CQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9DT01QCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9DT01QX0VRVUFMCQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfQ09NUF9ORVFVQUwJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9DT01QX0dSRUFURVIJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X0NPTVBfTEVTUwkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X01BUAkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9TQklUCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfQ01EU0VMCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTlfRElTQ0FSRAkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE5X01BU0sJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9QMQkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9QMgkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9QMwkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xOV9OQklUCQkJICgxTDw8MzApCisKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xOQkJCTB4MDAwMDE4ZmMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xOV9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xOV9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzAJCQkJMHgwMDAwMTkwMAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfT0ZGU0VUCQkJICgweGZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0NMQVNTCQkJICgweDdMPDw4KQpAQCAtMTk4NCwxNCArMzMzMywxOCBAQAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfSERSX1RZUEVfVENQCQkJICgyTDw8MTMpCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9IRFJfVFlQRV9VRFAJCQkgKDNMPDwxMykKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0hEUl9UWVBFX0RBVEEJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfSERSX1RZUEVfVENQX1VEUAkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9IRFJfVFlQRV9JQ01QVjYJCSAoNkw8PDEzKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUAkJCQkgKDB4M0w8PDE2KQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUF9FUVVBTAkJCSAoMEw8PDE2KQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUF9ORVFVQUwJCQkgKDFMPDwxNikKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX0NPTVBfR1JFQVRFUgkJCSAoMkw8PDE2KQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ09NUF9MRVNTCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9NQVBfWEkJCQkgKDFMPDwxOCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8wX1NCSVQJCQkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9DTURTRUwJCQkgKDB4Zkw8PDIwKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfTUFQCQkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9ESVNDQVJECQkJICgxTDw8MjUpCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMF9NQVNLCQkJCSAoMUw8PDI2KQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzBfUDEJCQkJICgxTDw8MjcpCkBAIC0yMDA2LDgxICszMzU5LDUxOCBAQAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEJCQkJMHgwMDAwMTkwOAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQQkJCQkgKDB4M2ZmZmZMPDwwKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9PRkZTRVRfWEkJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQ0xBU1NfWEkJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfUDRfWEkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX1hJCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX0lQX1hJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX1RDUF9YSQkJICgyTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfSERSX1RZUEVfREFUQV9YSQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9IRFJfVFlQRV9UQ1BfVURQX1hJCQkgKDVMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9DT01QX1hJCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0NPTVBfRVFVQUxfWEkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfQ09NUF9HUkVBVEVSX1hJCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0NPTVBfTEVTU19YSQkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfTUFQX1hJCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9DTURTRUxfWEkJCQkgKDB4MWZMPDwyMCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX0RJU0NBUkRfWEkJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX1AxX1hJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMV9QMl9YSQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzFfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xX05CSVRfWEkJCQkgKDFMPDwzMCkKIAogI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzEJCQkweDAwMDAxOTBjCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMV9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xX01BU0sJCQkgKDB4ZmZmZkw8PDE2KQorCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMgkJCQkweDAwMDAxOTEwCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9CCQkJCSAoMHhmZmZMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX09GRlNFVF9YSQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX1BSSU9SSVRZX1hJCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9QNF9YSQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfU1RBUlRfWEkJCSAoMEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfSVBfWEkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX0hEUl9UWVBFX1VEUF9YSQkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9IRFJfVFlQRV9EQVRBX1hJCQkgKDRMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfSERSX1RZUEVfSUNNUFY2X1hJCQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX0NPTVBfWEkJCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9DT01QX05FUVVBTF9YSQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9DT01QX0dSRUFURVJfWEkJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfQ09NUF9MRVNTX1hJCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX1NCSVRfWEkJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX0NNRFNFTF9YSQkJCSAoMHgxZkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfTUFTS19YSQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfUDFfWEkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8yX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMl9QM19YSQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzJfTkJJVF9YSQkJCSAoMUw8PDMwKQogCiAjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfMgkJCTB4MDAwMDE5MTQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18yX1ZBTFVFCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzJfTUFTSwkJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zCQkJCTB4MDAwMDE5MTgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0EJCQkJICgweDNmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0IJCQkJICgweGZmZkw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0NMQVNTX1hJCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfUFJJT1JJVFlfWEkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9YSQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9TVEFSVF9YSQkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9UQ1BfWEkJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfSERSX1RZUEVfVURQX1hJCQkgKDNMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfSERSX1RZUEVfVENQX1VEUF9YSQkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19IRFJfVFlQRV9JQ01QVjZfWEkJCSAoNkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19DT01QX0VRVUFMX1hJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0NPTVBfTkVRVUFMX1hJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19DT01QX0xFU1NfWEkJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX01BUF9YSQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfU0JJVF9YSQkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19ESVNDQVJEX1hJCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19NQVNLX1hJCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzNfUDJfWEkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8zX1AzX1hJCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfM19OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18zCQkJMHgwMDAwMTkxYworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzNfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfM19NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzQJCQkJMHgwMDAwMTkyMAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQQkJCQkgKDB4M2ZmZmZMPDwwKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9PRkZTRVRfWEkJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQ0xBU1NfWEkJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfUDRfWEkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX1hJCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX0lQX1hJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX1RDUF9YSQkJICgyTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfSERSX1RZUEVfREFUQV9YSQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9IRFJfVFlQRV9UQ1BfVURQX1hJCQkgKDVMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9DT01QX1hJCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0NPTVBfRVFVQUxfWEkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfQ09NUF9HUkVBVEVSX1hJCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0NPTVBfTEVTU19YSQkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfTUFQX1hJCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9DTURTRUxfWEkJCQkgKDB4MWZMPDwyMCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X0RJU0NBUkRfWEkJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X1AxX1hJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNF9QMl9YSQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzRfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF80X05CSVRfWEkJCQkgKDFMPDwzMCkKIAogI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzQJCQkweDAwMDAxOTI0CisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfNF9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS180X01BU0sJCQkgKDB4ZmZmZkw8PDE2KQorCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNQkJCQkweDAwMDAxOTI4CiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9CCQkJCSAoMHhmZmZMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X09GRlNFVF9YSQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X1BSSU9SSVRZX1hJCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9QNF9YSQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfU1RBUlRfWEkJCSAoMEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfSVBfWEkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X0hEUl9UWVBFX1VEUF9YSQkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9IRFJfVFlQRV9EQVRBX1hJCQkgKDRMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfSERSX1RZUEVfSUNNUFY2X1hJCQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X0NPTVBfWEkJCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9DT01QX05FUVVBTF9YSQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9DT01QX0dSRUFURVJfWEkJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfQ09NUF9MRVNTX1hJCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X1NCSVRfWEkJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X0NNRFNFTF9YSQkJCSAoMHgxZkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfTUFTS19YSQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfUDFfWEkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF81X1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNV9QM19YSQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzVfTkJJVF9YSQkJCSAoMUw8PDMwKQogCiAjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfNQkJCTB4MDAwMDE5MmMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS181X1ZBTFVFCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzVfTUFTSwkJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82CQkJCTB4MDAwMDE5MzAKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0EJCQkJICgweDNmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0IJCQkJICgweGZmZkw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0NMQVNTX1hJCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfUFJJT1JJVFlfWEkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9YSQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9TVEFSVF9YSQkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9UQ1BfWEkJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfSERSX1RZUEVfVURQX1hJCQkgKDNMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfSERSX1RZUEVfVENQX1VEUF9YSQkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9IRFJfVFlQRV9JQ01QVjZfWEkJCSAoNkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9DT01QX0VRVUFMX1hJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0NPTVBfTkVRVUFMX1hJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9DT01QX0xFU1NfWEkJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X01BUF9YSQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfU0JJVF9YSQkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9ESVNDQVJEX1hJCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9NQVNLX1hJCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzZfUDJfWEkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF82X1AzX1hJCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfNl9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS182CQkJMHgwMDAwMTkzNAorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzZfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfNl9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzcJCQkJMHgwMDAwMTkzOAogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQQkJCQkgKDB4M2ZmZmZMPDwwKQogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19PRkZTRVRfWEkJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQ0xBU1NfWEkJCQkgKDB4N0w8PDgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfUDRfWEkJCQkgKDFMPDwxMikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX1hJCQkJICgweDdMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX0lQX1hJCQkgKDFMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX1RDUF9YSQkJICgyTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfSERSX1RZUEVfREFUQV9YSQkJICg0TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19IRFJfVFlQRV9UQ1BfVURQX1hJCQkgKDVMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19DT01QX1hJCQkJICgweDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0NPTVBfRVFVQUxfWEkJCSAoMEw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfQ09NUF9HUkVBVEVSX1hJCQkgKDJMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0NPTVBfTEVTU19YSQkJCSAoM0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfTUFQX1hJCQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19DTURTRUxfWEkJCQkgKDB4MWZMPDwyMCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X0RJU0NBUkRfWEkJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X1AxX1hJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfN19QMl9YSQkJCSAoMUw8PDI4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzdfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF83X05CSVRfWEkJCQkgKDFMPDwzMCkKIAogI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzcJCQkweDAwMDAxOTNjCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfN19WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS183X01BU0sJCQkgKDB4ZmZmZkw8PDE2KQorCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOAkJCQkweDAwMDAxOTQwCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9CCQkJCSAoMHhmZmZMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X09GRlNFVF9YSQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X1BSSU9SSVRZX1hJCQkJICgxTDw8MTEpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9QNF9YSQkJCSAoMUw8PDEyKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfU1RBUlRfWEkJCSAoMEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfSVBfWEkJCSAoMUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X0hEUl9UWVBFX1VEUF9YSQkJICgzTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9IRFJfVFlQRV9EQVRBX1hJCQkgKDRMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfSERSX1RZUEVfSUNNUFY2X1hJCQkgKDZMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X0NPTVBfWEkJCQkgKDB4M0w8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9DT01QX05FUVVBTF9YSQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9DT01QX0dSRUFURVJfWEkJCSAoMkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfQ09NUF9MRVNTX1hJCQkJICgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X1NCSVRfWEkJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X0NNRFNFTF9YSQkJCSAoMHgxZkw8PDIwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfTUFTS19YSQkJCSAoMUw8PDI2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfUDFfWEkJCQkgKDFMPDwyNykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF84X1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOF9QM19YSQkJCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzhfTkJJVF9YSQkJCSAoMUw8PDMwKQogCiAjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfOAkJCTB4MDAwMDE5NDQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS184X1ZBTFVFCQkJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzhfTUFTSwkJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85CQkJCTB4MDAwMDE5NDgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0EJCQkJICgweDNmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0IJCQkJICgweGZmZkw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0NMQVNTX1hJCQkJICgweDdMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfUFJJT1JJVFlfWEkJCQkgKDFMPDwxMSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9YSQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9TVEFSVF9YSQkJICgwTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9UQ1BfWEkJCSAoMkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfSERSX1RZUEVfVURQX1hJCQkgKDNMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfSERSX1RZUEVfVENQX1VEUF9YSQkJICg1TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9IRFJfVFlQRV9JQ01QVjZfWEkJCSAoNkw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9DT01QX0VRVUFMX1hJCQkgKDBMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0NPTVBfTkVRVUFMX1hJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9DT01QX0xFU1NfWEkJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X01BUF9YSQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfU0JJVF9YSQkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9ESVNDQVJEX1hJCQkJICgxTDw8MjUpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9NQVNLX1hJCQkJICgxTDw8MjYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzlfUDJfWEkJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF85X1AzX1hJCQkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfOV9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS185CQkJMHgwMDAwMTk0YworI2RlZmluZSBCTlgyX1JQTV9SQ19WQUxVRV9NQVNLXzlfVkFMVUUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX1ZBTFVFX01BU0tfOV9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwCQkJCTB4MDAwMDE5NTAKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEwX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTBfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMF9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMAkJCTB4MDAwMDE5NTQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMF9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMF9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExCQkJCTB4MDAwMDE5NTgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzExX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTFfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMV9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMQkJCTB4MDAwMDE5NWMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMV9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMV9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyCQkJCTB4MDAwMDE5NjAKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEyX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTJfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xMl9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMgkJCTB4MDAwMDE5NjQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMl9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMl9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzCQkJCTB4MDAwMDE5NjgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzEzX1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTNfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xM19OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xMwkJCTB4MDAwMDE5NmMKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xM19WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xM19NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0CQkJCTB4MDAwMDE5NzAKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE0X1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTRfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNF9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNAkJCTB4MDAwMDE5NzQKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNF9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNF9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1CQkJCTB4MDAwMDE5NzgKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9BCQkJCSAoMHgzZmZmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQgkJCQkgKDB4ZmZmTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfT0ZGU0VUX1hJCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9DTEFTU19YSQkJCSAoMHg3TDw8OCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9QUklPUklUWV9YSQkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X1A0X1hJCQkJICgxTDw8MTIpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfSERSX1RZUEVfWEkJCQkgKDB4N0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0hEUl9UWVBFX1NUQVJUX1hJCQkgKDBMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9IRFJfVFlQRV9JUF9YSQkJICgxTDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfSERSX1RZUEVfVENQX1hJCQkgKDJMPDwxMykKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9IRFJfVFlQRV9VRFBfWEkJCSAoM0w8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0hEUl9UWVBFX0RBVEFfWEkJCSAoNEw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0hEUl9UWVBFX1RDUF9VRFBfWEkJCSAoNUw8PDEzKQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0hEUl9UWVBFX0lDTVBWNl9YSQkJICg2TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ09NUF9YSQkJCSAoMHgzTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ09NUF9FUVVBTF9YSQkJICgwTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ09NUF9ORVFVQUxfWEkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X0NPTVBfR1JFQVRFUl9YSQkJICgyTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ09NUF9MRVNTX1hJCQkgKDNMPDwxNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9NQVBfWEkJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9TQklUX1hJCQkJICgxTDw8MTkpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfQ01EU0VMX1hJCQkJICgweDFmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfRElTQ0FSRF9YSQkJCSAoMUw8PDI1KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X01BU0tfWEkJCQkgKDFMPDwyNikKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9QMV9YSQkJCSAoMUw8PDI3KQorI2RlZmluZSBCTlgyX1JQTV9SQ19DTlRMXzE1X1AyX1hJCQkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NOVExfMTVfUDNfWEkJCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfQ05UTF8xNV9OQklUX1hJCQkJICgxTDw8MzApCiAKICNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNQkJCTB4MDAwMDE5N2MKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNV9WQUxVRQkJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fUkNfVkFMVUVfTUFTS18xNV9NQVNLCQkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX1JQTV9SQ19DT05GSUcJCQkJMHgwMDAwMTk4MAogI2RlZmluZSBCTlgyX1JQTV9SQ19DT05GSUdfUlVMRV9FTkFCTEUJCQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NPTkZJR19SVUxFX0VOQUJMRV9YSQkJICgweGZmZmZmTDw8MCkKICNkZWZpbmUgQk5YMl9SUE1fUkNfQ09ORklHX0RFRl9DTEFTUwkJCSAoMHg3TDw8MjQpCisjZGVmaW5lIEJOWDJfUlBNX1JDX0NPTkZJR19LTlVNX09WRVJXUklURQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9SUE1fREVCVUcwCQkJCQkweDAwMDAxOTg0CiAjZGVmaW5lIEJOWDJfUlBNX0RFQlVHMF9GTV9CQ05UCQkJCSAoMHhmZmZmTDw8MCkKQEAgLTIyMzYsNiArNDAyNiwxNiBAQAogI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfSU5GSUZPX09WRVJSVU5fT0NDVVJSRUQJCSAoMUw8PDI5KQogI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfQUNQSV9NQVRDSF9JTlQJCQkgKDFMPDwzMCkKICNkZWZpbmUgQk5YMl9SUE1fREVCVUc5X0FDUElfRU5BQkxFX1NZTgkJCSAoMUw8PDMxKQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfQkVNRU1fUl9YSQkJCSAoMHgxZkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9FT19YSQkJCQkgKDFMPDw1KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfQUVPRl9ERV9YSQkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9TT19YSQkJCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX1JQTV9ERUJVRzlfV0Q2NF9DVF9YSQkJCSAoMHgxZkw8PDgpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9FT0ZfVkxEQllURV9YSQkJCSAoMHg3TDw8MTMpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9BQ1BJX1JERV9QQVRfSURfWEkJCSAoMHhmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9DQUxDUkNfUkVTVUxUX1hJCQkgKDB4M2ZmTDw8MjApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9EQVRBX0lOX1ZMX1hJCQkJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfUlBNX0RFQlVHOV9DQUxDUkNfQlVGRkVSX1ZMRF9YSQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9SUE1fQUNQSV9EQkdfQlVGX1cwMAkJCTB4MDAwMDE5YzAKICNkZWZpbmUgQk5YMl9SUE1fQUNQSV9EQkdfQlVGX1cwMQkJCTB4MDAwMDE5YzQKQEAgLTIyNTMsNiArNDA1Myw1NiBAQAogI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMxCQkJMHgwMDAwMTlmNAogI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMyCQkJMHgwMDAwMTlmOAogI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0RCR19CVUZfVzMzCQkJMHgwMDAwMTlmYworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0JZVEVfRU5BQkxFX0NUUkwJCQkweDAwMDAxYTAwCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfQllURV9FTkFCTEVfQ1RSTF9CWVRFX0FERFJFU1MJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0JZVEVfRU5BQkxFX0NUUkxfREVCVUdSRAkJICgxTDw8MjgpCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfQllURV9FTkFCTEVfQ1RSTF9NT0RFCQkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9CWVRFX0VOQUJMRV9DVFJMX0lOSVQJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX0JZVEVfRU5BQkxFX0NUUkxfV1IJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DVFJMCQkJMHgwMDAwMWEwNAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1RSTF9QQVRURVJOX0lECQkgKDB4Zkw8PDApCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DVFJMX0NSQ19TTV9DTFIJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1RSTF9XUgkJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfREFUQQkJCQkweDAwMDAxYTA4CisjZGVmaW5lIEJOWDJfUlBNX0FDUElfREFUQV9QQVRURVJOX0JFCQkJICgweGZmZmZmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fTEVOMAkJCTB4MDAwMDFhMGMKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0xFTjBfUEFUVEVSTl9MRU4zCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fTEVOMF9QQVRURVJOX0xFTjIJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9MRU4wX1BBVFRFUk5fTEVOMQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9MRU4wX1BBVFRFUk5fTEVOMAkJICgweGZmTDw8MjQpCisKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0xFTjEJCQkweDAwMDAxYTEwCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9MRU4xX1BBVFRFUk5fTEVONwkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0xFTjFfUEFUVEVSTl9MRU42CQkgKDB4ZmZMPDw4KQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fTEVOMV9QQVRURVJOX0xFTjUJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fTEVOMV9QQVRURVJOX0xFTjQJCSAoMHhmZkw8PDI0KQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkMwCQkJMHgwMDAwMWExOAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDMF9QQVRURVJOX0NSQzAJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzEJCQkweDAwMDAxYTFjCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkMxX1BBVFRFUk5fQ1JDMQkJICgweGZmZmZmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDMgkJCTB4MDAwMDFhMjAKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzJfUEFUVEVSTl9DUkMyCQkgKDB4ZmZmZmZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkMzCQkJMHgwMDAwMWEyNAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDM19QQVRURVJOX0NSQzMJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzQJCQkweDAwMDAxYTI4CisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkM0X1BBVFRFUk5fQ1JDNAkJICgweGZmZmZmZmZmTDw8MCkKKworI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDNQkJCTB4MDAwMDFhMmMKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzVfUEFUVEVSTl9DUkM1CQkgKDB4ZmZmZmZmZmZMPDwwKQorCisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkM2CQkJMHgwMDAwMWEzMAorI2RlZmluZSBCTlgyX1JQTV9BQ1BJX1BBVFRFUk5fQ1JDNl9QQVRURVJOX0NSQzYJCSAoMHhmZmZmZmZmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9SUE1fQUNQSV9QQVRURVJOX0NSQzcJCQkweDAwMDAxYTM0CisjZGVmaW5lIEJOWDJfUlBNX0FDUElfUEFUVEVSTl9DUkM3X1BBVFRFUk5fQ1JDNwkJICgweGZmZmZmZmZmTDw8MCkKIAogCiAvKgpAQCAtMjI2MywxNSArNDExMywyMCBAQAogI2RlZmluZSBCTlgyX1JCVUZfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKICNkZWZpbmUgQk5YMl9SQlVGX0NPTU1BTkRfRlJFRV9JTklUCQkJICgxTDw8MSkKICNkZWZpbmUgQk5YMl9SQlVGX0NPTU1BTkRfUkFNX0lOSVQJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX1JCVUZfQ09NTUFORF9QS1RfT0ZGU0VUX09WRkwJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX09WRVJfRlJFRQkJCSAoMUw8PDQpCiAjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0FMTE9DX1JFUQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0VOX1BSSV9DSE5HRV9URQkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9SQlVGX0NPTU1BTkRfQ1VfSVNPTEFURV9YSQkJCSAoMUw8PDUpCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0VOX1BSSV9DSEFOR0VfWEkJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfUkJVRl9DT01NQU5EX0dSQ19FTkRJQU5fQ09OVl9ESVNfWEkJICgxTDw8NykKIAogI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMQkJCQkweDAwMjAwMDA0CiAjZGVmaW5lIEJOWDJfUkJVRl9TVEFUVVMxX0ZSRUVfQ09VTlQJCQkgKDB4M2ZmTDw8MCkKIAogI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMgkJCQkweDAwMjAwMDA4Ci0jZGVmaW5lIEJOWDJfUkJVRl9TVEFUVVMyX0ZSRUVfVEFJTAkJCSAoMHgzZmZMPDwwKQotI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMl9GUkVFX0hFQUQJCQkgKDB4M2ZmTDw8MTYpCisjZGVmaW5lIEJOWDJfUkJVRl9TVEFUVVMyX0ZSRUVfVEFJTAkJCSAoMHgxZmZMPDwwKQorI2RlZmluZSBCTlgyX1JCVUZfU1RBVFVTMl9GUkVFX0hFQUQJCQkgKDB4MWZmTDw8MTYpCiAKICNkZWZpbmUgQk5YMl9SQlVGX0NPTkZJRwkJCQkweDAwMjAwMDBjCiAjZGVmaW5lIEJOWDJfUkJVRl9DT05GSUdfWE9GRl9UUklQCQkJICgweDNmZkw8PDApCkBAIC0yMjc5LDE2ICs0MTM0LDIxIEBACiAKICNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9BTExPQwkJCQkweDAwMjAwMDEwCiAjZGVmaW5lIEJOWDJfUkJVRl9GV19CVUZfQUxMT0NfVkFMVUUJCQkgKDB4MWZmTDw8NykKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9BTExPQ19UWVBFCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfUkJVRl9GV19CVUZfQUxMT0NfQUxMT0NfUkVRCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0ZSRUUJCQkJMHgwMDIwMDAxNAogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0ZSRUVfQ09VTlQJCQkgKDB4N2ZMPDwwKQogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0ZSRUVfVEFJTAkJCSAoMHgxZmZMPDw3KQogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX0ZSRUVfSEVBRAkJCSAoMHgxZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9GUkVFX1RZUEUJCQkgKDFMPDwyNSkKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9GUkVFX0ZSRUVfUkVRCQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9TRUwJCQkJMHgwMDIwMDAxOAogI2RlZmluZSBCTlgyX1JCVUZfRldfQlVGX1NFTF9DT1VOVAkJCSAoMHg3Zkw8PDApCiAjZGVmaW5lIEJOWDJfUkJVRl9GV19CVUZfU0VMX1RBSUwJCQkgKDB4MWZmTDw8NykKICNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9TRUxfSEVBRAkJCSAoMHgxZmZMPDwxNikKKyNkZWZpbmUgQk5YMl9SQlVGX0ZXX0JVRl9TRUxfU0VMX1JFUQkJCSAoMUw8PDMxKQogCiAjZGVmaW5lIEJOWDJfUkJVRl9DT05GSUcyCQkJCTB4MDAyMDAwMWMKICNkZWZpbmUgQk5YMl9SQlVGX0NPTkZJRzJfTUFDX0RST1BfVFJJUAkJCSAoMHgzZmZMPDwwKQpAQCAtMjM3Niw2ICs0MjM2LDggQEAKICNkZWZpbmUgQk5YMl9SVjJQX0lOU1RSX0hJR0hfSElHSAkJCSAoMHgxZkw8PDApCiAKICNkZWZpbmUgQk5YMl9SVjJQX0lOU1RSX0xPVwkJCQkweDAwMDAyODM0CisjZGVmaW5lIEJOWDJfUlYyUF9JTlNUUl9MT1dfTE9XCQkJCSAoMHhmZmZmZmZmZkw8PDApCisKICNkZWZpbmUgQk5YMl9SVjJQX1BST0MxX0FERFJfQ01ECQkJMHgwMDAwMjgzOAogI2RlZmluZSBCTlgyX1JWMlBfUFJPQzFfQUREUl9DTURfQURECQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfUlYyUF9QUk9DMV9BRERSX0NNRF9SRFdSCQkJICgxTDw8MzEpCkBAIC0yMzk1LDcgKzQyNTcsMjkgQEAKICNkZWZpbmUgQk5YMl9SVjJQX0RFQlVHX1ZFQ1RfUEVFS18yX1BFRUtfRU4JCSAoMUw8PDI3KQogI2RlZmluZSBCTlgyX1JWMlBfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKIAotI2RlZmluZSBCTlgyX1JWMlBfUEZUUV9EQVRBCQkJCTB4MDAwMDJiNDAKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTAkJCQkweDAwMDAyYWZjCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfSU5DX1VTQUdFX0NOVAkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRQkJCSAoMHhmTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV8wCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzEJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfMgkJICgyTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV8zCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzQJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfNQkJICg1TDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV82CQkgKDZMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzcJCSAoN0w8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfOAkJICg4TDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV85CQkgKDlMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzEwCQkgKDEwTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV8xMQkJICgxMUw8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfMTIJCSAoMTJMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9TSVpFXzEzCQkgKDEzTDw8NCkKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9QRkVfU0laRV8xNAkJICgxNEw8PDQpCisjZGVmaW5lIEJOWDJfUlYyUF9NUEZFX1BGRV9DVExfUEZFX1NJWkVfMTUJCSAoMTVMPDw0KQorI2RlZmluZSBCTlgyX1JWMlBfTVBGRV9QRkVfQ1RMX1BGRV9DT1VOVAkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9SVjJQX01QRkVfUEZFX0NUTF9PRkZTRVQJCQkgKDB4MWZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SVjJQX1JWMlBQUQkJCQkweDAwMDAyYjQwCiAjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NNRAkJCQkweDAwMDAyYjc4CiAjZGVmaW5lIEJOWDJfUlYyUF9QRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMjQxNiw3ICs0MzAwLDcgQEAKICNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ1RMX01BWF9ERVBUSAkJCSAoMHgzZmZMPDwxMikKICNkZWZpbmUgQk5YMl9SVjJQX1BGVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKIAotI2RlZmluZSBCTlgyX1JWMlBfVEZUUV9EQVRBCQkJCTB4MDAwMDJiODAKKyNkZWZpbmUgQk5YMl9SVjJQX1JWMlBUUQkJCQkweDAwMDAyYjgwCiAjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRAkJCQkweDAwMDAyYmI4CiAjZGVmaW5lIEJOWDJfUlYyUF9URlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMjQzNyw3ICs0MzIxLDcgQEAKICNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ1RMX01BWF9ERVBUSAkJCSAoMHgzZmZMPDwxMikKICNkZWZpbmUgQk5YMl9SVjJQX1RGVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKIAotI2RlZmluZSBCTlgyX1JWMlBfTUZUUV9EQVRBCQkJCTB4MDAwMDJiYzAKKyNkZWZpbmUgQk5YMl9SVjJQX1JWMlBNUQkJCQkweDAwMDAyYmMwCiAjZGVmaW5lIEJOWDJfUlYyUF9NRlRRX0NNRAkJCQkweDAwMDAyYmY4CiAjZGVmaW5lIEJOWDJfUlYyUF9NRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9SVjJQX01GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMjQ2NiwxOCArNDM1MCwyNiBAQAogICovCiAjZGVmaW5lIEJOWDJfTVFfQ09NTUFORAkJCQkJMHgwMDAwM2MwMAogI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfRU5BQkxFRAkJCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfSU5JVAkJCQkgKDFMPDwxKQogI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfT1ZFUkZMT1cJCQkgKDFMPDw0KQogI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfV1JfRVJST1IJCQkgKDFMPDw1KQogI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfUkRfRVJST1IJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfSURCX0NGR19FUlJPUgkJCSAoMUw8PDcpCisjZGVmaW5lIEJOWDJfTVFfQ09NTUFORF9JREJfT1ZFUkZMT1cJCQkgKDFMPDwxMCkKKyNkZWZpbmUgQk5YMl9NUV9DT01NQU5EX05PX0JJTl9FUlJPUgkJCSAoMUw8PDExKQorI2RlZmluZSBCTlgyX01RX0NPTU1BTkRfTk9fTUFQX0VSUk9SCQkJICgxTDw8MTIpCiAKICNkZWZpbmUgQk5YMl9NUV9TVEFUVVMJCQkJCTB4MDAwMDNjMDQKICNkZWZpbmUgQk5YMl9NUV9TVEFUVVNfQ1RYX0FDQ0VTU19TVEFUCQkJICgxTDw8MTYpCiAjZGVmaW5lIEJOWDJfTVFfU1RBVFVTX0NUWF9BQ0NFU1M2NF9TVEFUCQkgKDFMPDwxNykKICNkZWZpbmUgQk5YMl9NUV9TVEFUVVNfUENJX1NUQUxMX1NUQVQJCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9NUV9TVEFUVVNfSURCX09GTE9XX1NUQVQJCQkgKDFMPDwxOSkKIAogI2RlZmluZSBCTlgyX01RX0NPTkZJRwkJCQkJMHgwMDAwM2MwOAogI2RlZmluZSBCTlgyX01RX0NPTkZJR19UWF9ISUdIX1BSSQkJCSAoMUw8PDApCiAjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0hBTFRfRElTCQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0JJTl9NUV9NT0RFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9NUV9DT05GSUdfRElTX0lEQl9EUk9QCQkJICgxTDw8MykKICNkZWZpbmUgQk5YMl9NUV9DT05GSUdfS05MX0JZUF9CTEtfU0laRQkJCSAoMHg3TDw8NCkKICNkZWZpbmUgQk5YMl9NUV9DT05GSUdfS05MX0JZUF9CTEtfU0laRV8yNTYJCSAoMEw8PDQpCiAjZGVmaW5lIEJOWDJfTVFfQ09ORklHX0tOTF9CWVBfQkxLX1NJWkVfNTEyCQkgKDFMPDw0KQpAQCAtMjUzMyw2ICs0NDI1LDcgQEAKIAogI2RlZmluZSBCTlgyX01RX01FTV9XUl9EQVRBMgkJCQkweDAwMDAzYzgwCiAjZGVmaW5lIEJOWDJfTVFfTUVNX1dSX0RBVEEyX1ZBTFVFCQkJICgweDNmZmZmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NUV9NRU1fV1JfREFUQTJfVkFMVUVfWEkJCQkgKDB4N2ZmZmZmZmZMPDwwKQogCiAjZGVmaW5lIEJOWDJfTVFfTUVNX1JEX0FERFIJCQkJMHgwMDAwM2M4NAogI2RlZmluZSBCTlgyX01RX01FTV9SRF9BRERSX1ZBTFVFCQkJICgweDNmTDw8MCkKQEAgLTI1NDUsNiArNDQzOCwxNiBAQAogCiAjZGVmaW5lIEJOWDJfTVFfTUVNX1JEX0RBVEEyCQkJCTB4MDAwMDNjOTAKICNkZWZpbmUgQk5YMl9NUV9NRU1fUkRfREFUQTJfVkFMVUUJCQkgKDB4M2ZmZmZmZmZMPDwwKQorI2RlZmluZSBCTlgyX01RX01FTV9SRF9EQVRBMl9WQUxVRV9YSQkJCSAoMHg3ZmZmZmZmZkw8PDApCisKKworLyoKKyAqICB0c2NoX3JlZyBkZWZpbml0aW9uCisgKiAgb2Zmc2V0OiAweDRjMDAKKyAqLworI2RlZmluZSBCTlgyX1RTQ0hfVFNTX0NGRwkJCQkweDAwMDA0YzFjCisjZGVmaW5lIEJOWDJfVFNDSF9UU1NfQ0ZHX1RTU19TVEFSVF9DSUQJCQkgKDB4N2ZmTDw8OCkKKyNkZWZpbmUgQk5YMl9UU0NIX1RTU19DRkdfTlVNX09GX1RTU19DT04JCSAoMHhmTDw8MjQpCiAKIAogCkBAIC0yNTk0LDcgKzQ0OTcsMTEgQEAKICNkZWZpbmUgQk5YMl9UQkRSX0RFQlVHX1ZFQ1RfUEVFS18yX1BFRUtfRU4JCSAoMUw8PDI3KQogI2RlZmluZSBCTlgyX1RCRFJfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKIAotI2RlZmluZSBCTlgyX1RCRFJfRlRRX0RBVEEJCQkJMHgwMDAwNTNjMAorI2RlZmluZSBCTlgyX1RCRFJfQ0tTVU1fRVJST1JfU1RBVFVTCQkJMHgwMDAwNTAxMAorI2RlZmluZSBCTlgyX1RCRFJfQ0tTVU1fRVJST1JfU1RBVFVTX0NBTENVTEFURUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9UQkRSX0NLU1VNX0VSUk9SX1NUQVRVU19FWFBFQ1RFRAkJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX1RCRFJfVEJEUlEJCQkJCTB4MDAwMDUzYzAKICNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9DTUQJCQkJMHgwMDAwNTNmOAogI2RlZmluZSBCTlgyX1RCRFJfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9UQkRSX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCkBAIC0yNjI0LDcgKzQ1MzEsMTUgQEAKICNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkQJCQkJMHgwMDAwNWMwMAogI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9FTkFCTEVECQkJICgxTDw8MCkKICNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkRfTUFTVEVSX0FCT1JUCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTU1BTkRfQ1MxNl9FUlIJCQkgKDFMPDw1KQogI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9CQURfTDJfTEVOR1RIX0FCT1JUCQkgKDFMPDw3KQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9NQVNLX0NTMQkJCSAoMUw8PDIwKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9NQVNLX0NTMgkJCSAoMUw8PDIxKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9NQVNLX0NTMwkJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9NQVNLX0NTNAkJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9GT1JDRV9JTE9DS19DS0VSUgkJICgxTDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT01NQU5EX09GSUZPX0NMUgkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1RETUFfQ09NTUFORF9JRklGT19DTFIJCQkgKDFMPDwzMSkKIAogI2RlZmluZSBCTlgyX1RETUFfU1RBVFVTCQkJCTB4MDAwMDVjMDQKICNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19ETUFfV0FJVAkJCSAoMUw8PDApCkBAIC0yNjMzLDEwICs0NTQ4LDE4IEBACiAjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfTE9DS19XQUlUCQkJICgxTDw8MykKICNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19GVFFfRU5UUllfQ05UCQkJICgxTDw8MTYpCiAjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfQlVSU1RfQ05UCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfVERNQV9TVEFUVVNfTUFYX0lGSUZPX0RFUFRICQkgKDB4M2ZMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX1NUQVRVU19PRklGT19PVkVSRkxPVwkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX1RETUFfU1RBVFVTX0lGSUZPX09WRVJGTE9XCQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9URE1BX0NPTkZJRwkJCQkweDAwMDA1YzA4CiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfT05FX0RNQQkJCSAoMUw8PDApCiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfT05FX1JFQ09SRAkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTlVNX0RNQV9DSEFOCQkJICgweDNMPDwyKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX05VTV9ETUFfQ0hBTl8wCQkJICgwTDw8MikKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19OVU1fRE1BX0NIQU5fMQkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTlVNX0RNQV9DSEFOXzIJCQkgKDJMPDwyKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX05VTV9ETUFfQ0hBTl8zCQkJICgzTDw8MikKICNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19MSU1JVF9TWgkJCSAoMHhmTDw8NCkKICNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19MSU1JVF9TWl82NAkJCSAoMEw8PDQpCiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElNSVRfU1pfMTI4CQkJICgweDRMPDw0KQpAQCAtMjY0OSw3ICs0NTcyLDM1IEBACiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTElORV9TWl81MTIJCQkgKDhMPDw4KQogI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0FMSUdOX0VOQQkJCSAoMUw8PDE1KQogI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0NIS19MMl9CRAkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0NNUExfRU5UUlkJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19PRklGT19DTVAJCQkgKDFMPDwxOSkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19PRklGT19DTVBfMwkJCSAoMEw8PDE5KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX09GSUZPX0NNUF8yCQkJICgxTDw8MTkpCiAjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfRklGT19DTVAJCQkgKDB4Zkw8PDIwKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0lGSUZPX0RFUFRIX1hJCQkJICgweDdMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19JRklGT19ERVBUSF8wX1hJCQkgKDBMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19JRklGT19ERVBUSF80X1hJCQkgKDFMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19JRklGT19ERVBUSF84X1hJCQkgKDJMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19JRklGT19ERVBUSF8xNl9YSQkJICgzTDw8MjApCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfSUZJRk9fREVQVEhfMzJfWEkJCSAoNEw8PDIwKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0lGSUZPX0RFUFRIXzY0X1hJCQkgKDVMPDwyMCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19GSUZPX0NNUF9FTl9YSQkJCSAoMUw8PDIzKQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0JZVEVTX09TVF9YSQkJCSAoMHg3TDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfQllURVNfT1NUXzUxMl9YSQkJICgwTDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfQllURVNfT1NUXzEwMjRfWEkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0JZVEVTX09TVF8yMDQ4X1hJCQkgKDJMPDwyNCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19CWVRFU19PU1RfNDA5Nl9YSQkJICgzTDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfQllURVNfT1NUXzgxOTJfWEkJCSAoNEw8PDI0KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0JZVEVTX09TVF8xNjM4NF9YSQkJICg1TDw8MjQpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfSENfQllQQVNTX1hJCQkJICgxTDw8MjcpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTENMX01SUlNfWEkJCQkgKDB4N0w8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTXzEyOF9YSQkJICgwTDw8MjgpCisjZGVmaW5lIEJOWDJfVERNQV9DT05GSUdfTENMX01SUlNfMjU2X1hJCQkgKDFMPDwyOCkKKyNkZWZpbmUgQk5YMl9URE1BX0NPTkZJR19MQ0xfTVJSU181MTJfWEkJCSAoMkw8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTXzEwMjRfWEkJCSAoM0w8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTXzIwNDhfWEkJCSAoNEw8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTXzQwOTZfWEkJCSAoNUw8PDI4KQorI2RlZmluZSBCTlgyX1RETUFfQ09ORklHX0xDTF9NUlJTX0VOX1hJCQkJICgxTDw8MzEpCiAKICNkZWZpbmUgQk5YMl9URE1BX1BBWUxPQURfUFJPRAkJCQkweDAwMDA1YzBjCiAjZGVmaW5lIEJOWDJfVERNQV9QQVlMT0FEX1BST0RfVkFMVUUJCQkgKDB4MWZmZkw8PDMpCkBAIC0yNjg1LDcgKzQ2MzYsMjIgQEAKICNkZWZpbmUgQk5YMl9URE1BX0RSX0lOVEZfU1RBVFVTX05YVF9QTlRSCQkgKDB4Zkw8PDEyKQogI2RlZmluZSBCTlgyX1RETUFfRFJfSU5URl9TVEFUVVNfQllURV9DT1VOVAkJICgweDdMPDwxNikKIAotI2RlZmluZSBCTlgyX1RETUFfRlRRX0RBVEEJCQkJMHgwMDAwNWZjMAorI2RlZmluZSBCTlgyX1RETUFfUFVTSF9GU00JCQkJMHgwMDAwNWM5MAorI2RlZmluZSBCTlgyX1RETUFfQkRfSUZfREVCVUcJCQkJMHgwMDAwNWM5NAorI2RlZmluZSBCTlgyX1RETUFfRE1BRF9JRl9ERUJVRwkJCQkweDAwMDA1Yzk4CisjZGVmaW5lIEJOWDJfVERNQV9DVFhfSUZfREVCVUcJCQkJMHgwMDAwNWM5YworI2RlZmluZSBCTlgyX1RETUFfVFBCVUZfSUZfREVCVUcJCQkweDAwMDA1Y2EwCisjZGVmaW5lIEJOWDJfVERNQV9EUl9JRl9ERUJVRwkJCQkweDAwMDA1Y2E0CisjZGVmaW5lIEJOWDJfVERNQV9UUEFUUV9JRl9ERUJVRwkJCTB4MDAwMDVjYTgKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFfSUxPQ0tfQ0tTVU0JCQkweDAwMDA1Y2FjCisjZGVmaW5lIEJOWDJfVERNQV9URE1BX0lMT0NLX0NLU1VNX0NBTENVTEFURUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFfSUxPQ0tfQ0tTVU1fRVhQRUNURUQJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFfUENJRV9DS1NVTQkJCTB4MDAwMDVjYjAKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFfUENJRV9DS1NVTV9DQUxDVUxBVEVECQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfVERNQV9URE1BX1BDSUVfQ0tTVU1fRVhQRUNURUQJCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9URE1BX1RETUFRCQkJCQkweDAwMDA1ZmMwCiAjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01ECQkJCTB4MDAwMDVmZjgKICNkZWZpbmUgQk5YMl9URE1BX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfVERNQV9GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMjcyNCw2ICs0NjkwLDggQEAKICNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX0ZPUkNFX0lOVF9MT1cJCQkgKDJMPDwxOSkKICNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX0ZPUkNFX0lOVF9GUkVFCQkJICgzTDw8MTkpCiAjZGVmaW5lIEJOWDJfSENfQ09NTUFORF9DTFJfU1RBVF9OT1cJCQkgKDFMPDwyMSkKKyNkZWZpbmUgQk5YMl9IQ19DT01NQU5EX01BSU5fUFdSX0lOVAkJCSAoMUw8PDIyKQorI2RlZmluZSBCTlgyX0hDX0NPTU1BTkRfQ09BTF9PTl9ORVhUX0VWRU5UCQkgKDFMPDwyNykKIAogI2RlZmluZSBCTlgyX0hDX1NUQVRVUwkJCQkJMHgwMDAwNjgwNAogI2RlZmluZSBCTlgyX0hDX1NUQVRVU19NQVNURVJfQUJPUlQJCQkgKDFMPDwwKQpAQCAtMjc0Niw2ICs0NzE0LDIzIEBACiAjZGVmaW5lIEJOWDJfSENfQ09ORklHX1NUQVRJU1RJQ19QUklPUklUWQkJICgxTDw8NSkKICNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU1RBVFVTX1BSSU9SSVRZCQkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU1RBVF9NRU1fQUREUgkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1BFUl9NT0RFCQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19PTkVfU0hPVAkJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfVVNFX0lOVF9QQVJBTQkJCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TRVRfTUFTS19BVF9SRAkJCSAoMUw8PDE5KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19QRVJfQ09MTEVDVF9MSU1JVAkJICgweGZMPDwyMCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU0JfQUREUl9JTkMJCQkgKDB4N0w8PDI0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TQl9BRERSX0lOQ182NEIJCQkgKDBMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU0JfQUREUl9JTkNfMTI4QgkJCSAoMUw8PDI0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TQl9BRERSX0lOQ18yNTZCCQkJICgyTDw8MjQpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1NCX0FERFJfSU5DXzUxMkIJCQkgKDNMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU0JfQUREUl9JTkNfMTAyNEIJCSAoNEw8PDI0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19TQl9BRERSX0lOQ18yMDQ4QgkJICg1TDw8MjQpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1NCX0FERFJfSU5DXzQwOTZCCQkgKDZMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfU0JfQUREUl9JTkNfODE5MkIJCSAoN0w8PDI0KQorI2RlZmluZSBCTlgyX0hDX0NPTkZJR19HRU5fU1RBVF9BVkdfSU5UUgkJICgxTDw8MjkpCisjZGVmaW5lIEJOWDJfSENfQ09ORklHX1VOTUFTS19BTEwJCQkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9IQ19DT05GSUdfVFhfU0VMCQkJCSAoMUw8PDMxKQogCiAjZGVmaW5lIEJOWDJfSENfQVRUTl9CSVRTX0VOQUJMRQkJCTB4MDAwMDY4MGMKICNkZWZpbmUgQk5YMl9IQ19TVEFUVVNfQUREUl9MCQkJCTB4MDAwMDY4MTAKQEAgLTI3ODIsNiArNDc2Nyw3IEBACiAKICNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLUwkJCQkweDAwMDA2ODNjCiAjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfSENfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTX0hDX0lOVF9QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDE2KQogCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9DT0xMRUNUX1RJQ0tTCQkJMHgwMDAwNjg0MAogI2RlZmluZSBCTlgyX0hDX1NUQVRfQ09MTEVDVF9USUNLU19IQ19TVEFUX0NPTExfVElDS1MJICgweGZmTDw8NCkKQEAgLTI3ODksNiArNDc3NSwxMCBAQAogI2RlZmluZSBCTlgyX0hDX1NUQVRTX1RJQ0tTCQkJCTB4MDAwMDY4NDQKICNkZWZpbmUgQk5YMl9IQ19TVEFUU19USUNLU19IQ19TVEFUX1RJQ0tTCQkgKDB4ZmZmZkw8PDgpCiAKKyNkZWZpbmUgQk5YMl9IQ19TVEFUU19JTlRFUlJVUFRfU1RBVFVTCQkJMHgwMDAwNjg0OAorI2RlZmluZSBCTlgyX0hDX1NUQVRTX0lOVEVSUlVQVF9TVEFUVVNfU0JfU1RBVFVTCSAoMHgxZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRTX0lOVEVSUlVQVF9TVEFUVVNfSU5UX1NUQVRVUwkgKDB4MWZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9IQ19TVEFUX01FTV9EQVRBCQkJCTB4MDAwMDY4NGMKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMAkJCQkweDAwMDA2ODUwCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wCQkgKDB4N2ZMPDwwKQpAQCAtMjkxNywyNCArNDkwNywxMDggQEAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzEJCSAoMHg3Zkw8PDgpCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8yCQkgKDB4N2ZMPDwxNikKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzMJCSAoMHg3Zkw8PDI0KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9YSQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU1QX1JYX0ZSQU1FX0RST1BfWEkJICg1Mkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1VOVVNFRF9TMF9YSQkgKDU3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU5VU0VEX1MxX1hJCSAoNThMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9VTlVTRURfUzJfWEkJICg4NUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1VOVVNFRF9TM19YSQkgKDg2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU5VU0VEX1M0X1hJCSAoODdMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9VTlVTRURfUzVfWEkJICg4OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1VOVVNFRF9TNl9YSQkgKDg5TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU5VU0VEX1M3X1hJCSAoOTBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9VTlVTRURfUzhfWEkJICg5MUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1VOVVNFRF9TOV9YSQkgKDkyTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfVU5VU0VEX1MxMF9YSQkgKDkzTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfTVFfSURCX09GTE9XX1hJCSAoOTRMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DVFhfQkxLX1JEX0NOVF9YSQkgKDEyM0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0NUWF9CTEtfV1JfQ05UX1hJCSAoMTI0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfQ1RYX0hJVFNfWEkJICgxMjVMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9DVFhfTUlTU0VTX1hJCSAoMTI2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX1NUQVRVU19CTE9DS1NfVkVDMV9YSQkgKDEyOEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfR0VOX1ZFQzFfWEkJICgxMjlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX01CT1hfV1JfVkVDMV9YSQkgKDEzMEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19IV19JTlRBQ0tfVkVDMV9YSQkgKDEzMUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19TV19JTlRBQ0tfVkVDMV9YSQkgKDEzMkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19EVVJJTkdfU1dfSU5UQUNLX1ZFQzFfWEkJICgxMzNMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fU1RBVFVTX0JMT0NLU19WRUMyX1hJCSAoMTM0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9HRU5fVkVDMl9YSQkgKDEzNUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfTUJPWF9XUl9WRUMyX1hJCSAoMTM2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX0hXX0lOVEFDS19WRUMyX1hJCSAoMTM3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX1NXX0lOVEFDS19WRUMyX1hJCSAoMTM4TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX0RVUklOR19TV19JTlRBQ0tfVkVDMl9YSQkgKDEzOUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9TVEFUVVNfQkxPQ0tTX1ZFQzNfWEkJICgxNDBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX0dFTl9WRUMzX1hJCSAoMTQxTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9NQk9YX1dSX1ZFQzNfWEkJICgxNDJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fSFdfSU5UQUNLX1ZFQzNfWEkJICgxNDNMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fU1dfSU5UQUNLX1ZFQzNfWEkJICgxNDRMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfRFVSSU5HX1NXX0lOVEFDS19WRUMzX1hJCSAoMTQ1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX1NUQVRVU19CTE9DS1NfVkVDNF9YSQkgKDE0Nkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfR0VOX1ZFQzRfWEkJICgxNDdMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX01CT1hfV1JfVkVDNF9YSQkgKDE0OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19IV19JTlRBQ0tfVkVDNF9YSQkgKDE0OUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19TV19JTlRBQ0tfVkVDNF9YSQkgKDE1MEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19EVVJJTkdfU1dfSU5UQUNLX1ZFQzRfWEkJICgxNTFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fU1RBVFVTX0JMT0NLU19WRUM1X1hJCSAoMTUyTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9HRU5fVkVDNV9YSQkgKDE1M0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfTUJPWF9XUl9WRUM1X1hJCSAoMTU0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX0hXX0lOVEFDS19WRUM1X1hJCSAoMTU1TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX1NXX0lOVEFDS19WRUM1X1hJCSAoMTU2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX0RVUklOR19TV19JTlRBQ0tfVkVDNV9YSQkgKDE1N0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9TVEFUVVNfQkxPQ0tTX1ZFQzZfWEkJICgxNThMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX0dFTl9WRUM2X1hJCSAoMTU5TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9NQk9YX1dSX1ZFQzZfWEkJICgxNjBMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fSFdfSU5UQUNLX1ZFQzZfWEkJICgxNjFMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfVE9fU1dfSU5UQUNLX1ZFQzZfWEkJICgxNjJMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19DT1JFX0NMS1NfRFVSSU5HX1NXX0lOVEFDS19WRUM2X1hJCSAoMTYzTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX1NUQVRVU19CTE9DS1NfVkVDN19YSQkgKDE2NEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfR0VOX1ZFQzdfWEkJICgxNjVMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fSU5UX01CT1hfV1JfVkVDN19YSQkgKDE2Nkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19IV19JTlRBQ0tfVkVDN19YSQkgKDE2N0w8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19UT19TV19JTlRBQ0tfVkVDN19YSQkgKDE2OEw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX0NPUkVfQ0xLU19EVVJJTkdfU1dfSU5UQUNLX1ZFQzdfWEkJICgxNjlMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMF9IQ19OVU1fU1RBVFVTX0JMT0NLU19WRUM4X1hJCSAoMTcwTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfTlVNX0lOVF9HRU5fVkVDOF9YSQkgKDE3MUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX0hDX05VTV9JTlRfTUJPWF9XUl9WRUM4X1hJCSAoMTcyTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX0hXX0lOVEFDS19WRUM4X1hJCSAoMTczTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX1RPX1NXX0lOVEFDS19WRUM4X1hJCSAoMTc0TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfSENfQ09SRV9DTEtTX0RVUklOR19TV19JTlRBQ0tfVkVDOF9YSQkgKDE3NUw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzBfR0VOX1NFTF8wX1JWMlBDU19DTURfQ05UX1hJCSAoMTc2TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUENTX1NMT1RfQ05UX1hJCSAoMTc3TDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzBfUlYyUENTUV9WQUxJRF9DTlRfWEkJICgxNzhMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfMV9YSQkJICgweGZmTDw8OCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMF9HRU5fU0VMXzJfWEkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8wX0dFTl9TRUxfM19YSQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMQkJCQkweDAwMDA2ODU0CiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzFfR0VOX1NFTF80CQkgKDB4N2ZMPDwwKQogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfNQkJICgweDdmTDw8OCkKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMV9HRU5fU0VMXzYJCSAoMHg3Zkw8PDE2KQogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfNwkJICgweDdmTDw8MjQpCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzFfR0VOX1NFTF80X1hJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfNV9YSQkJICgweGZmTDw8OCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMV9HRU5fU0VMXzZfWEkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8xX0dFTl9TRUxfN19YSQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMgkJCQkweDAwMDA2ODU4CiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzJfR0VOX1NFTF84CQkgKDB4N2ZMPDwwKQogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yX0dFTl9TRUxfOQkJICgweDdmTDw8OCkKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMl9HRU5fU0VMXzEwCQkgKDB4N2ZMPDwxNikKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMl9HRU5fU0VMXzExCQkgKDB4N2ZMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfMl9HRU5fU0VMXzhfWEkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzJfR0VOX1NFTF85X1hJCQkgKDB4ZmZMPDw4KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yX0dFTl9TRUxfMTBfWEkJCSAoMHhmZkw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8yX0dFTl9TRUxfMTFfWEkJCSAoMHhmZkw8PDI0KQogCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzMJCQkJMHgwMDAwNjg1YwogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8zX0dFTl9TRUxfMTIJCSAoMHg3Zkw8PDApCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzNfR0VOX1NFTF8xMwkJICgweDdmTDw8OCkKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfM19HRU5fU0VMXzE0CQkgKDB4N2ZMPDwxNikKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfM19HRU5fU0VMXzE1CQkgKDB4N2ZMPDwyNCkKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TRUxfM19HRU5fU0VMXzEyX1hJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NFTF8zX0dFTl9TRUxfMTNfWEkJCSAoMHhmZkw8PDgpCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzNfR0VOX1NFTF8xNF9YSQkJICgweGZmTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU0VMXzNfR0VOX1NFTF8xNV9YSQkJICgweGZmTDw8MjQpCiAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUMAkJCQkweDAwMDA2ODg4CiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVDEJCQkJMHgwMDAwNjg4YwpAQCAtMjk2OCw2ICs1MDQyLDcgQEAKICNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDMTMJCQkweDAwMDA2OGZjCiAjZGVmaW5lIEJOWDJfSENfU1RBVF9HRU5fU1RBVF9BQzE0CQkJMHgwMDAwNjkwMAogI2RlZmluZSBCTlgyX0hDX1NUQVRfR0VOX1NUQVRfQUMxNQkJCTB4MDAwMDY5MDQKKyNkZWZpbmUgQk5YMl9IQ19TVEFUX0dFTl9TVEFUX0FDCQkJMHgwMDAwNjhjOAogI2RlZmluZSBCTlgyX0hDX1ZJUwkJCQkJMHgwMDAwNjkwOAogI2RlZmluZSBCTlgyX0hDX1ZJU19TVEFUX0JVSUxEX1NUQVRFCQkJICgweGZMPDwwKQogI2RlZmluZSBCTlgyX0hDX1ZJU19TVEFUX0JVSUxEX1NUQVRFX0lETEUJCSAoMEw8PDApCkBAIC0zMDM4LDYgKzUxMTMsMzQ5IEBACiAjZGVmaW5lIEJOWDJfSENfREVCVUdfVkVDVF9QRUVLXzJfUEVFS19FTgkJICgxTDw8MjcpCiAjZGVmaW5lIEJOWDJfSENfREVCVUdfVkVDVF9QRUVLXzJfU0VMCQkJICgweGZMPDwyOCkKIAorI2RlZmluZSBCTlgyX0hDX0NPQUxFU0NFX05PVwkJCQkweDAwMDA2OTE0CisjZGVmaW5lIEJOWDJfSENfQ09BTEVTQ0VfTk9XX0NPQUxfTk9XCQkJICgweDFmZkw8PDEpCisjZGVmaW5lIEJOWDJfSENfQ09BTEVTQ0VfTk9XX0NPQUxfTk9XX1dPX0lOVAkJICgweDFmZkw8PDExKQorI2RlZmluZSBCTlgyX0hDX0NPQUxFU0NFX05PV19DT0FMX09OX05YVF9FVkVOVAkJICgweDFmZkw8PDIxKQorCisjZGVmaW5lIEJOWDJfSENfTVNJWF9CSVRfVkVDVE9SCQkJCTB4MDAwMDY5MTgKKyNkZWZpbmUgQk5YMl9IQ19NU0lYX0JJVF9WRUNUT1JfVkFMCQkJICgweDFmZkw8PDApCisKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMQkJCQkweDAwMDA2YTAwCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzFfUlhfVE1SX01PREUJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18xX1RYX1RNUl9NT0RFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMV9DT01fVE1SX01PREUJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzFfQ01EX1RNUl9NT0RFCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18xX1BFUl9NT0RFCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzFfT05FX1NIT1QJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMV9VU0VfSU5UX1BBUkFNCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMV9QRVJfQ09MTEVDVF9MSU1JVAkJICgweGZMPDwyMCkKKworI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF8xCQkJMHgwMDAwNmEwNAorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF8xX1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF8xX0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF8xCQkJMHgwMDAwNmEwOAorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzFfVkFMVUUJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzFfSU5UCQkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfMQkJCTB4MDAwMDZhMGMKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfMV9WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfMV9JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfMQkJCQkweDAwMDA2YTEwCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfMV9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzFfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzEJCQkJMHgwMDAwNmExNAorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzFfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU18xX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfMQkJCQkweDAwMDA2YTE4CisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzFfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfMV9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzEJCQkJMHgwMDAwNmExYworI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU18xX1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzFfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzEJCQkweDAwMDA2YTIwCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfMV9IQ19QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfMV9IQ19JTlRfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18yCQkJCTB4MDAwMDZhMjQKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMl9SWF9UTVJfTU9ERQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzJfVFhfVE1SX01PREUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18yX0NPTV9UTVJfTU9ERQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMl9DTURfVE1SX01PREUJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzJfUEVSX01PREUJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfMl9PTkVfU0hPVAkJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18yX1VTRV9JTlRfUEFSQU0JCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18yX1BFUl9DT0xMRUNUX0xJTUlUCQkgKDB4Zkw8PDIwKQorCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzIJCQkweDAwMDA2YTI4CisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzJfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzJfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzIJCQkweDAwMDA2YTJjCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfMl9WQUxVRQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfMl9JTlQJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF8yCQkJMHgwMDAwNmEzMAorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF8yX1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF8yX0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU18yCQkJCTB4MDAwMDZhMzQKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU18yX1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfMl9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfMgkJCQkweDAwMDA2YTM4CisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfMl9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzJfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU18yCQkJCTB4MDAwMDZhM2MKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfMl9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU18yX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfMgkJCQkweDAwMDA2YTQwCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzJfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfMl9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfMgkJCTB4MDAwMDZhNDQKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU18yX0hDX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU18yX0hDX0lOVF9QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzMJCQkJMHgwMDAwNmE0OAorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18zX1JYX1RNUl9NT0RFCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfM19UWF9UTVJfTU9ERQkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzNfQ09NX1RNUl9NT0RFCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18zX0NNRF9UTVJfTU9ERQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfM19QRVJfTU9ERQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR18zX09ORV9TSE9UCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzNfVVNFX0lOVF9QQVJBTQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzNfUEVSX0NPTExFQ1RfTElNSVQJCSAoMHhmTDw8MjApCisKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfMwkJCTB4MDAwMDZhNGMKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfM19WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfM19JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfMwkJCTB4MDAwMDZhNTAKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF8zX1ZBTFVFCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF8zX0lOVAkJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzMJCQkweDAwMDA2YTU0CisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzNfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzNfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzMJCQkJMHgwMDAwNmE1OAorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzNfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU18zX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU18zCQkJCTB4MDAwMDZhNWMKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU18zX1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfM19JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzMJCQkJMHgwMDAwNmE2MAorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU18zX1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzNfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU18zCQkJCTB4MDAwMDZhNjQKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfM19WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU18zX0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU18zCQkJMHgwMDAwNmE2OAorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzNfSENfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzNfSENfSU5UX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNAkJCQkweDAwMDA2YTZjCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzRfUlhfVE1SX01PREUJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR180X1RYX1RNUl9NT0RFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNF9DT01fVE1SX01PREUJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzRfQ01EX1RNUl9NT0RFCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR180X1BFUl9NT0RFCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzRfT05FX1NIT1QJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNF9VU0VfSU5UX1BBUkFNCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNF9QRVJfQ09MTEVDVF9MSU1JVAkJICgweGZMPDwyMCkKKworI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF80CQkJMHgwMDAwNmE3MAorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF80X1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF80X0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF80CQkJMHgwMDAwNmE3NAorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzRfVkFMVUUJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzRfSU5UCQkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfNAkJCTB4MDAwMDZhNzgKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfNF9WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfNF9JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfNAkJCQkweDAwMDA2YTdjCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfNF9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzRfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzQJCQkJMHgwMDAwNmE4MAorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzRfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU180X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfNAkJCQkweDAwMDA2YTg0CisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzRfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfNF9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzQJCQkJMHgwMDAwNmE4OAorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU180X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzRfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzQJCQkweDAwMDA2YThjCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfNF9IQ19QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfNF9IQ19JTlRfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR181CQkJCTB4MDAwMDZhOTAKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNV9SWF9UTVJfTU9ERQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzVfVFhfVE1SX01PREUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR181X0NPTV9UTVJfTU9ERQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNV9DTURfVE1SX01PREUJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzVfUEVSX01PREUJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNV9PTkVfU0hPVAkJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR181X1VTRV9JTlRfUEFSQU0JCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR181X1BFUl9DT0xMRUNUX0xJTUlUCQkgKDB4Zkw8PDIwKQorCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzUJCQkweDAwMDA2YTk0CisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzVfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzVfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzUJCQkweDAwMDA2YTk4CisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfNV9WQUxVRQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfNV9JTlQJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF81CQkJMHgwMDAwNmE5YworI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF81X1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF81X0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU181CQkJCTB4MDAwMDZhYTAKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU181X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfNV9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfNQkJCQkweDAwMDA2YWE0CisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfNV9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzVfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU181CQkJCTB4MDAwMDZhYTgKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfNV9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU181X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfNQkJCQkweDAwMDA2YWFjCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzVfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfNV9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfNQkJCTB4MDAwMDZhYjAKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU181X0hDX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU181X0hDX0lOVF9QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzYJCQkJMHgwMDAwNmFiNAorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR182X1JYX1RNUl9NT0RFCQkJICgxTDw8MSkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNl9UWF9UTVJfTU9ERQkJCSAoMUw8PDIpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzZfQ09NX1RNUl9NT0RFCQkgKDFMPDwzKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR182X0NNRF9UTVJfTU9ERQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNl9QRVJfTU9ERQkJCSAoMUw8PDE2KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR182X09ORV9TSE9UCQkJICgxTDw8MTcpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzZfVVNFX0lOVF9QQVJBTQkJICgxTDw8MTgpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzZfUEVSX0NPTExFQ1RfTElNSVQJCSAoMHhmTDw8MjApCisKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfNgkJCTB4MDAwMDZhYjgKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfNl9WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9RVUlDS19DT05TX1RSSVBfNl9JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfNgkJCTB4MDAwMDZhYmMKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF82X1ZBTFVFCQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF82X0lOVAkJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzYJCQkweDAwMDA2YWMwCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzZfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfUVVJQ0tfQ09OU19UUklQXzZfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzYJCQkJMHgwMDAwNmFjNAorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzZfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU182X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU182CQkJCTB4MDAwMDZhYzgKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU182X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfNl9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzYJCQkJMHgwMDAwNmFjYworI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU182X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzZfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU182CQkJCTB4MDAwMDZhZDAKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfNl9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU182X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU182CQkJMHgwMDAwNmFkNAorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzZfSENfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzZfSENfSU5UX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfNwkJCQkweDAwMDA2YWQ4CisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzdfUlhfVE1SX01PREUJCQkgKDFMPDwxKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR183X1RYX1RNUl9NT0RFCQkJICgxTDw8MikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfN19DT01fVE1SX01PREUJCSAoMUw8PDMpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzdfQ01EX1RNUl9NT0RFCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR183X1BFUl9NT0RFCQkJICgxTDw8MTYpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzdfT05FX1NIT1QJCQkgKDFMPDwxNykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfN19VU0VfSU5UX1BBUkFNCQkgKDFMPDwxOCkKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfN19QRVJfQ09MTEVDVF9MSU1JVAkJICgweGZMPDwyMCkKKworI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF83CQkJMHgwMDAwNmFkYworI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF83X1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1FVSUNLX0NPTlNfVFJJUF83X0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01QX1BST0RfVFJJUF83CQkJMHgwMDAwNmFlMAorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzdfVkFMVUUJCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzdfSU5UCQkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfNwkJCTB4MDAwMDZhZTQKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfN19WQUxVRQkJICgweGZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19SWF9RVUlDS19DT05TX1RSSVBfN19JTlQJCSAoMHhmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfNwkJCQkweDAwMDA2YWU4CisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfN19WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1RJQ0tTXzdfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzcJCQkJMHgwMDAwNmFlYworI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzdfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19UWF9USUNLU183X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfNwkJCQkweDAwMDA2YWYwCisjZGVmaW5lIEJOWDJfSENfQ09NX1RJQ0tTXzdfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfN19JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzcJCQkJMHgwMDAwNmFmNAorI2RlZmluZSBCTlgyX0hDX0NNRF9USUNLU183X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzdfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1BFUklPRElDX1RJQ0tTXzcJCQkweDAwMDA2YWY4CisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfN19IQ19QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfN19IQ19JTlRfUEVSSU9ESUNfVElDS1MJICgweGZmZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR184CQkJCTB4MDAwMDZhZmMKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfOF9SWF9UTVJfTU9ERQkJCSAoMUw8PDEpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzhfVFhfVE1SX01PREUJCQkgKDFMPDwyKQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR184X0NPTV9UTVJfTU9ERQkJICgxTDw8MykKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfOF9DTURfVE1SX01PREUJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfSENfU0JfQ09ORklHXzhfUEVSX01PREUJCQkgKDFMPDwxNikKKyNkZWZpbmUgQk5YMl9IQ19TQl9DT05GSUdfOF9PTkVfU0hPVAkJCSAoMUw8PDE3KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR184X1VTRV9JTlRfUEFSQU0JCSAoMUw8PDE4KQorI2RlZmluZSBCTlgyX0hDX1NCX0NPTkZJR184X1BFUl9DT0xMRUNUX0xJTUlUCQkgKDB4Zkw8PDIwKQorCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzgJCQkweDAwMDA2YjAwCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzhfVkFMVUUJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfVFhfUVVJQ0tfQ09OU19UUklQXzhfSU5UCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTVBfUFJPRF9UUklQXzgJCQkweDAwMDA2YjA0CisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfOF9WQUxVRQkJCSAoMHhmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfQ09NUF9QUk9EX1RSSVBfOF9JTlQJCQkgKDB4ZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF84CQkJMHgwMDAwNmIwOAorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF84X1ZBTFVFCQkgKDB4ZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1JYX1FVSUNLX0NPTlNfVFJJUF84X0lOVAkJICgweGZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU184CQkJCTB4MDAwMDZiMGMKKyNkZWZpbmUgQk5YMl9IQ19SWF9USUNLU184X1ZBTFVFCQkJICgweDNmZkw8PDApCisjZGVmaW5lIEJOWDJfSENfUlhfVElDS1NfOF9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfOAkJCQkweDAwMDA2YjEwCisjZGVmaW5lIEJOWDJfSENfVFhfVElDS1NfOF9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX1RYX1RJQ0tTXzhfSU5UCQkJCSAoMHgzZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU184CQkJCTB4MDAwMDZiMTQKKyNkZWZpbmUgQk5YMl9IQ19DT01fVElDS1NfOF9WQUxVRQkJCSAoMHgzZmZMPDwwKQorI2RlZmluZSBCTlgyX0hDX0NPTV9USUNLU184X0lOVAkJCQkgKDB4M2ZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfOAkJCQkweDAwMDA2YjE4CisjZGVmaW5lIEJOWDJfSENfQ01EX1RJQ0tTXzhfVkFMVUUJCQkgKDB4M2ZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19DTURfVElDS1NfOF9JTlQJCQkJICgweDNmZkw8PDE2KQorCisjZGVmaW5lIEJOWDJfSENfUEVSSU9ESUNfVElDS1NfOAkJCTB4MDAwMDZiMWMKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU184X0hDX1BFUklPRElDX1RJQ0tTCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9IQ19QRVJJT0RJQ19USUNLU184X0hDX0lOVF9QRVJJT0RJQ19USUNLUwkgKDB4ZmZmZkw8PDE2KQogCiAKIC8qCkBAIC0zMDYzLDcgKzU0ODEsNyBAQAogI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQogI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfUEFHRV8wX0lOU1RfSEFMVEVECQkgKDFMPDw0KQogI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfQkFEX0RBVEFfQUREUl9IQUxURUQJCSAoMUw8PDUpCi0jZGVmaW5lIEJOWDJfVFhQX0NQVV9TVEFURV9CQURfcGNfSEFMVEVECQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfQkFEX1BDX0hBTFRFRAkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9UWFBfQ1BVX1NUQVRFX0FMSUdOX0hBTFRFRAkJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfVFhQX0NQVV9TVEFURV9GSU9fQUJPUlRfSEFMVEVECQkgKDFMPDw4KQogI2RlZmluZSBCTlgyX1RYUF9DUFVfU1RBVEVfU09GVF9IQUxURUQJCQkgKDFMPDwxMCkKQEAgLTMxMTEsNyArNTUyOSw3IEBACiAjZGVmaW5lIEJOWDJfVFhQX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX1RYUF9DUFVfUkVHX0ZJTEUJCQkJMHgwMDA0NTIwMAotI2RlZmluZSBCTlgyX1RYUF9GVFFfREFUQQkJCQkweDAwMDQ1M2MwCisjZGVmaW5lIEJOWDJfVFhQX1RYUFEJCQkJCTB4MDAwNDUzYzAKICNkZWZpbmUgQk5YMl9UWFBfRlRRX0NNRAkJCQkweDAwMDQ1M2Y4CiAjZGVmaW5lIEJOWDJfVFhQX0ZUUV9DTURfT0ZGU0VUCQkJCSAoMHgzZmZMPDwwKQogI2RlZmluZSBCTlgyX1RYUF9GVFFfQ01EX1dSX1RPUAkJCQkgKDFMPDwxMCkKQEAgLTMxNTgsNyArNTU3Niw3IEBACiAjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQogI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX1BBR0VfMF9JTlNUX0hBTFRFRAkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9CQURfREFUQV9BRERSX0hBTFRFRAkgKDFMPDw1KQotI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1NUQVRFX0JBRF9wY19IQUxURUQJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfQkFEX1BDX0hBTFRFRAkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9BTElHTl9IQUxURUQJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfVFBBVF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9UUEFUX0NQVV9TVEFURV9TT0ZUX0hBTFRFRAkJCSAoMUw8PDEwKQpAQCAtMzIwNiw3ICs1NjI0LDcgQEAKICNkZWZpbmUgQk5YMl9UUEFUX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX1RQQVRfQ1BVX1JFR19GSUxFCQkJCTB4MDAwODUyMDAKLSNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9EQVRBCQkJCTB4MDAwODUzYzAKKyNkZWZpbmUgQk5YMl9UUEFUX1RQQVRRCQkJCQkweDAwMDg1M2MwCiAjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ01ECQkJCTB4MDAwODUzZjgKICNkZWZpbmUgQk5YMl9UUEFUX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfVFBBVF9GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMzI1Myw3ICs1NjcxLDcgQEAKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX1BBR0VfMF9EQVRBX0hBTFRFRAkJICgxTDw8MykKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX1BBR0VfMF9JTlNUX0hBTFRFRAkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX0JBRF9EQVRBX0FERFJfSEFMVEVECQkgKDFMPDw1KQotI2RlZmluZSBCTlgyX1JYUF9DUFVfU1RBVEVfQkFEX3BjX0hBTFRFRAkJICgxTDw8NikKKyNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX0JBRF9QQ19IQUxURUQJCSAoMUw8PDYpCiAjZGVmaW5lIEJOWDJfUlhQX0NQVV9TVEFURV9BTElHTl9IQUxURUQJCQkgKDFMPDw3KQogI2RlZmluZSBCTlgyX1JYUF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX1NUQVRFX1NPRlRfSEFMVEVECQkJICgxTDw8MTApCkBAIC0zMzAxLDcgKzU3MTksMjkgQEAKICNkZWZpbmUgQk5YMl9SWFBfQ1BVX0xBU1RfQlJBTkNIX0FERFJfTEJBCQkgKDB4M2ZmZmZmZmZMPDwyKQogCiAjZGVmaW5lIEJOWDJfUlhQX0NQVV9SRUdfRklMRQkJCQkweDAwMGM1MjAwCi0jZGVmaW5lIEJOWDJfUlhQX0NGVFFfREFUQQkJCQkweDAwMGM1MzgwCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMCQkJCTB4MDAwYzUzN2MKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfSU5DX1VTQUdFX0NOVAkJICgxTDw8MCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkUJCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzAJCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV8xCQkJICgxTDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfMgkJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzMJCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV80CQkJICg0TDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfNQkJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzYJCQkgKDZMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV83CQkJICg3TDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfOAkJCSAoOEw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzkJCQkgKDlMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMAkJICgxMEw8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzExCQkgKDExTDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTIJCSAoMTJMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMwkJICgxM0w8PDQpCisjZGVmaW5lIEJOWDJfUlhQX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzE0CQkgKDE0TDw8NCkKKyNkZWZpbmUgQk5YMl9SWFBfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTUJCSAoMTVMPDw0KQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9QRkVfQ09VTlQJCQkgKDB4Zkw8PDEyKQorI2RlZmluZSBCTlgyX1JYUF9QRkVfUEZFX0NUTF9PRkZTRVQJCQkgKDB4MWZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9SWFBfUlhQQ1EJCQkJCTB4MDAwYzUzODAKICNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9DTUQJCQkJMHgwMDBjNTNiOAogI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9SWFBfQ0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCkBAIC0zMzIyLDcgKzU3NjIsNyBAQAogI2RlZmluZSBCTlgyX1JYUF9DRlRRX0NUTF9NQVhfREVQVEgJCQkgKDB4M2ZmTDw8MTIpCiAjZGVmaW5lIEJOWDJfUlhQX0NGVFFfQ1RMX0NVUl9ERVBUSAkJCSAoMHgzZmZMPDwyMikKIAotI2RlZmluZSBCTlgyX1JYUF9GVFFfREFUQQkJCQkweDAwMGM1M2MwCisjZGVmaW5lIEJOWDJfUlhQX1JYUFEJCQkJCTB4MDAwYzUzYzAKICNkZWZpbmUgQk5YMl9SWFBfRlRRX0NNRAkJCQkweDAwMGM1M2Y4CiAjZGVmaW5lIEJOWDJfUlhQX0ZUUV9DTURfT0ZGU0VUCQkJCSAoMHgzZmZMPDwwKQogI2RlZmluZSBCTlgyX1JYUF9GVFFfQ01EX1dSX1RPUAkJCQkgKDFMPDwxMCkKQEAgLTMzNTAsNiArNTc5MCwxMCBAQAogICogIGNvbV9yZWcgZGVmaW5pdGlvbgogICogIG9mZnNldDogMHgxMDAwMDAKICAqLworI2RlZmluZSBCTlgyX0NPTV9DS1NVTV9FUlJPUl9TVEFUVVMJCQkweDAwMTAwMDAwCisjZGVmaW5lIEJOWDJfQ09NX0NLU1VNX0VSUk9SX1NUQVRVU19DQUxDVUxBVEVECQkgKDB4ZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfQ09NX0NLU1VNX0VSUk9SX1NUQVRVU19FWFBFQ1RFRAkJICgweGZmZmZMPDwxNikKKwogI2RlZmluZSBCTlgyX0NPTV9DUFVfTU9ERQkJCQkweDAwMTA1MDAwCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX0xPQ0FMX1JTVAkJCSAoMUw8PDApCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9NT0RFX1NURVBfRU5BCQkJICgxTDw8MSkKQEAgLTMzNjksNyArNTgxMyw3IEBACiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9QQUdFXzBfREFUQV9IQUxURUQJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9QQUdFXzBfSU5TVF9IQUxURUQJCSAoMUw8PDQpCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9CQURfREFUQV9BRERSX0hBTFRFRAkJICgxTDw8NSkKLSNkZWZpbmUgQk5YMl9DT01fQ1BVX1NUQVRFX0JBRF9wY19IQUxURUQJCSAoMUw8PDYpCisjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9CQURfUENfSEFMVEVECQkgKDFMPDw2KQogI2RlZmluZSBCTlgyX0NPTV9DUFVfU1RBVEVfQUxJR05fSEFMVEVECQkJICgxTDw8NykKICNkZWZpbmUgQk5YMl9DT01fQ1BVX1NUQVRFX0ZJT19BQk9SVF9IQUxURUQJCSAoMUw8PDgpCiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9TVEFURV9TT0ZUX0hBTFRFRAkJCSAoMUw8PDEwKQpAQCAtMzQxNyw3ICs1ODYxLDI5IEBACiAjZGVmaW5lIEJOWDJfQ09NX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX0NPTV9DUFVfUkVHX0ZJTEUJCQkJMHgwMDEwNTIwMAotI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfREFUQQkJCQkweDAwMTA1MzQwCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMCQkJMHgwMDEwNTJiYworI2RlZmluZSBCTlgyX0NPTV9DT01UUV9QRkVfUEZFX0NUTF9JTkNfVVNBR0VfQ05UCSAoMUw8PDApCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFCQkgKDB4Zkw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzAJCSAoMEw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzEJCSAoMUw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzIJCSAoMkw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzMJCSAoM0w8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzQJCSAoNEw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzUJCSAoNUw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzYJCSAoNkw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzcJCSAoN0w8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzgJCSAoOEw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzkJCSAoOUw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzEwCQkgKDEwTDw8NCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTEJCSAoMTFMPDw0KQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMgkJICgxMkw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzEzCQkgKDEzTDw8NCkKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTQJCSAoMTRMPDw0KQorI2RlZmluZSBCTlgyX0NPTV9DT01UUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xNQkJICgxNUw8PDQpCisjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX1BGRV9QRkVfQ1RMX1BGRV9DT1VOVAkJICgweGZMPDwxMikKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFFfUEZFX1BGRV9DVExfT0ZGU0VUCQkgKDB4MWZmTDw8MTYpCisKKyNkZWZpbmUgQk5YMl9DT01fQ09NWFEJCQkJCTB4MDAxMDUzNDAKICNkZWZpbmUgQk5YMl9DT01fQ09NWFFfRlRRX0NNRAkJCQkweDAwMTA1Mzc4CiAjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfQ09NX0NPTVhRX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCkBAIC0zNDM4LDcgKzU5MDQsNyBAQAogI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfQ1RMX01BWF9ERVBUSAkJICgweDNmZkw8PDEyKQogI2RlZmluZSBCTlgyX0NPTV9DT01YUV9GVFFfQ1RMX0NVUl9ERVBUSAkJICgweDNmZkw8PDIyKQogCi0jZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9EQVRBCQkJCTB4MDAxMDUzODAKKyNkZWZpbmUgQk5YMl9DT01fQ09NVFEJCQkJCTB4MDAxMDUzODAKICNkZWZpbmUgQk5YMl9DT01fQ09NVFFfRlRRX0NNRAkJCQkweDAwMTA1M2I4CiAjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfQ09NX0NPTVRRX0ZUUV9DTURfV1JfVE9QCQkJICgxTDw8MTApCkBAIC0zNDU5LDcgKzU5MjUsNyBAQAogI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ1RMX01BWF9ERVBUSAkJICgweDNmZkw8PDEyKQogI2RlZmluZSBCTlgyX0NPTV9DT01UUV9GVFFfQ1RMX0NVUl9ERVBUSAkJICgweDNmZkw8PDIyKQogCi0jZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0RBVEEJCQkJMHgwMDEwNTNjMAorI2RlZmluZSBCTlgyX0NPTV9DT01RCQkJCQkweDAwMTA1M2MwCiAjZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0NNRAkJCQkweDAwMTA1M2Y4CiAjZGVmaW5lIEJOWDJfQ09NX0NPTVFfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9DT01fQ09NUV9GVFFfQ01EX1dSX1RPUAkJCSAoMUw8PDEwKQpAQCAtMzQ4OSw2ICs1OTU1LDEwIEBACiAgKiAgY3BfcmVnIGRlZmluaXRpb24KICAqICBvZmZzZXQ6IDB4MTgwMDAwCiAgKi8KKyNkZWZpbmUgQk5YMl9DUF9DS1NVTV9FUlJPUl9TVEFUVVMJCQkweDAwMTgwMDAwCisjZGVmaW5lIEJOWDJfQ1BfQ0tTVU1fRVJST1JfU1RBVFVTX0NBTENVTEFURUQJCSAoMHhmZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9DUF9DS1NVTV9FUlJPUl9TVEFUVVNfRVhQRUNURUQJCSAoMHhmZmZmTDw8MTYpCisKICNkZWZpbmUgQk5YMl9DUF9DUFVfTU9ERQkJCQkweDAwMTg1MDAwCiAjZGVmaW5lIEJOWDJfQ1BfQ1BVX01PREVfTE9DQUxfUlNUCQkJICgxTDw8MCkKICNkZWZpbmUgQk5YMl9DUF9DUFVfTU9ERV9TVEVQX0VOQQkJCSAoMUw8PDEpCkBAIC0zNTA4LDcgKzU5NzgsNyBAQAogI2RlZmluZSBCTlgyX0NQX0NQVV9TVEFURV9QQUdFXzBfREFUQV9IQUxURUQJCSAoMUw8PDMpCiAjZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFX1BBR0VfMF9JTlNUX0hBTFRFRAkJICgxTDw8NCkKICNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfQkFEX0RBVEFfQUREUl9IQUxURUQJCSAoMUw8PDUpCi0jZGVmaW5lIEJOWDJfQ1BfQ1BVX1NUQVRFX0JBRF9wY19IQUxURUQJCQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX0NQX0NQVV9TVEFURV9CQURfUENfSEFMVEVECQkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfQUxJR05fSEFMVEVECQkJICgxTDw8NykKICNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfRklPX0FCT1JUX0hBTFRFRAkJICgxTDw8OCkKICNkZWZpbmUgQk5YMl9DUF9DUFVfU1RBVEVfU09GVF9IQUxURUQJCQkgKDFMPDwxMCkKQEAgLTM1NTYsNyArNjAyNiwyOSBAQAogI2RlZmluZSBCTlgyX0NQX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX0NQX0NQVV9SRUdfRklMRQkJCQkweDAwMTg1MjAwCi0jZGVmaW5lIEJOWDJfQ1BfQ1BRX0ZUUV9EQVRBCQkJCTB4MDAxODUzYzAKKyNkZWZpbmUgQk5YMl9DUF9DUFFfUEZFX1BGRV9DVEwJCQkJMHgwMDE4NTNiYworI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9JTkNfVVNBR0VfQ05UCQkgKDFMPDwwKQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRQkJICgweGZMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8wCQkgKDBMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xCQkgKDFMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8yCQkgKDJMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8zCQkgKDNMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV80CQkgKDRMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV81CQkgKDVMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV82CQkgKDZMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV83CQkgKDdMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV84CQkgKDhMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV85CQkgKDlMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMAkJICgxMEw8PDQpCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzExCQkgKDExTDw8NCkKKyNkZWZpbmUgQk5YMl9DUF9DUFFfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTIJCSAoMTJMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfU0laRV8xMwkJICgxM0w8PDQpCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX1BGRV9QRkVfQ1RMX1BGRV9TSVpFXzE0CQkgKDE0TDw8NCkKKyNkZWZpbmUgQk5YMl9DUF9DUFFfUEZFX1BGRV9DVExfUEZFX1NJWkVfMTUJCSAoMTVMPDw0KQorI2RlZmluZSBCTlgyX0NQX0NQUV9QRkVfUEZFX0NUTF9QRkVfQ09VTlQJCSAoMHhmTDw8MTIpCisjZGVmaW5lIEJOWDJfQ1BfQ1BRX1BGRV9QRkVfQ1RMX09GRlNFVAkJCSAoMHgxZmZMPDwxNikKKworI2RlZmluZSBCTlgyX0NQX0NQUQkJCQkJMHgwMDE4NTNjMAogI2RlZmluZSBCTlgyX0NQX0NQUV9GVFFfQ01ECQkJCTB4MDAxODUzZjgKICNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NNRF9PRkZTRVQJCQkgKDB4M2ZmTDw8MCkKICNkZWZpbmUgQk5YMl9DUF9DUFFfRlRRX0NNRF9XUl9UT1AJCQkgKDFMPDwxMCkKQEAgLTM1ODQsNiArNjA3Niw1OSBAQAogICogIG1jcF9yZWcgZGVmaW5pdGlvbgogICogIG9mZnNldDogMHgxNDAwMDAKICAqLworI2RlZmluZSBCTlgyX01DUF9NQ1BfQ09OVFJPTAkJCQkweDAwMTQwMDgwCisjZGVmaW5lIEJOWDJfTUNQX01DUF9DT05UUk9MX1NNQlVTX1NFTAkJCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX01DUF9NQ1BfQ09OVFJPTF9NQ1BfSVNPTEFURQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0FUVEVOVElPTl9TVEFUVVMJCQkweDAwMTQwMDg0CisjZGVmaW5lIEJOWDJfTUNQX01DUF9BVFRFTlRJT05fU1RBVFVTX0RSVl9ET09SQkVMTAkgKDFMPDwyOSkKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0FUVEVOVElPTl9TVEFUVVNfV0FUQ0hET0dfVElNRU9VVAkgKDFMPDwzMCkKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0FUVEVOVElPTl9TVEFUVVNfQ1BVX0VWRU5UCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9NQ1BfSEVBUlRCRUFUX0NPTlRST0wJCQkweDAwMTQwMDg4CisjZGVmaW5lIEJOWDJfTUNQX01DUF9IRUFSVEJFQVRfQ09OVFJPTF9NQ1BfSEVBUlRCRUFUX0VOQUJMRQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9NQ1BfSEVBUlRCRUFUX1NUQVRVUwkJCTB4MDAxNDAwOGMKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0hFQVJUQkVBVF9TVEFUVVNfTUNQX0hFQVJUQkVBVF9QRVJJT0QJICgweDdmZkw8PDApCisjZGVmaW5lIEJOWDJfTUNQX01DUF9IRUFSVEJFQVRfU1RBVFVTX1ZBTElECQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9NQ1BfSEVBUlRCRUFUCQkJCTB4MDAxNDAwOTAKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQX0hFQVJUQkVBVF9NQ1BfSEVBUlRCRUFUX0NPVU5UCSAoMHgzZmZmZmZmZkw8PDApCisjZGVmaW5lIEJOWDJfTUNQX01DUF9IRUFSVEJFQVRfTUNQX0hFQVJUQkVBVF9JTkMJICgxTDw8MzApCisjZGVmaW5lIEJOWDJfTUNQX01DUF9IRUFSVEJFQVRfTUNQX0hFQVJUQkVBVF9SRVNFVAkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19SRVNFVAkJCQkweDAwMTQwMDk0CisjZGVmaW5lIEJOWDJfTUNQX1dBVENIRE9HX1JFU0VUX1dBVENIRE9HX1JFU0VUCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MCQkJMHgwMDE0MDA5OAorI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MX1dBVENIRE9HX1RJTUVPVVQJICgweGZmZmZmZmZMPDwwKQorI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MX1dBVENIRE9HX0FUVE4JCSAoMUw8PDI5KQorI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MX01DUF9SU1RfRU5BQkxFCSAoMUw8PDMwKQorI2RlZmluZSBCTlgyX01DUF9XQVRDSERPR19DT05UUk9MX1dBVENIRE9HX0VOQUJMRQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9BQ0NFU1NfTE9DSwkJCQkweDAwMTQwMDljCisjZGVmaW5lIEJOWDJfTUNQX0FDQ0VTU19MT0NLX0xPQ0sJCQkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9UT0VfSUQJCQkJCTB4MDAxNDAwYTAKKyNkZWZpbmUgQk5YMl9NQ1BfVE9FX0lEX0ZVTkNUSU9OX0lECQkJICgxTDw8MzEpCisKKyNkZWZpbmUgQk5YMl9NQ1BfTUFJTEJPWF9DRkcJCQkJMHgwMDE0MDBhNAorI2RlZmluZSBCTlgyX01DUF9NQUlMQk9YX0NGR19NQUlMQk9YX09GRlNFVAkJICgweDNmZmZMPDwwKQorI2RlZmluZSBCTlgyX01DUF9NQUlMQk9YX0NGR19NQUlMQk9YX1NJWkUJCSAoMHhmZmZMPDwyMCkKKworI2RlZmluZSBCTlgyX01DUF9NQUlMQk9YX0NGR19PVEhFUl9GVU5DCQkJMHgwMDE0MDBhOAorI2RlZmluZSBCTlgyX01DUF9NQUlMQk9YX0NGR19PVEhFUl9GVU5DX01BSUxCT1hfT0ZGU0VUCSAoMHgzZmZmTDw8MCkKKyNkZWZpbmUgQk5YMl9NQ1BfTUFJTEJPWF9DRkdfT1RIRVJfRlVOQ19NQUlMQk9YX1NJWkUJICgweGZmZkw8PDIwKQorCisjZGVmaW5lIEJOWDJfTUNQX01DUF9ET09SQkVMTAkJCQkweDAwMTQwMGFjCisjZGVmaW5lIEJOWDJfTUNQX01DUF9ET09SQkVMTF9NQ1BfRE9PUkJFTEwJCSAoMUw8PDMxKQorCisjZGVmaW5lIEJOWDJfTUNQX0RSSVZFUl9ET09SQkVMTAkJCTB4MDAxNDAwYjAKKyNkZWZpbmUgQk5YMl9NQ1BfRFJJVkVSX0RPT1JCRUxMX0RSSVZFUl9ET09SQkVMTAkgKDFMPDwzMSkKKworI2RlZmluZSBCTlgyX01DUF9EUklWRVJfRE9PUkJFTExfT1RIRVJfRlVOQwkJMHgwMDE0MDBiNAorI2RlZmluZSBCTlgyX01DUF9EUklWRVJfRE9PUkJFTExfT1RIRVJfRlVOQ19EUklWRVJfRE9PUkJFTEwJICgxTDw8MzEpCisKICNkZWZpbmUgQk5YMl9NQ1BfQ1BVX01PREUJCQkJMHgwMDE0NTAwMAogI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9MT0NBTF9SU1QJCQkgKDFMPDwwKQogI2RlZmluZSBCTlgyX01DUF9DUFVfTU9ERV9TVEVQX0VOQQkJCSAoMUw8PDEpCkBAIC0zNjAzLDcgKzYxNDgsNyBAQAogI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfUEFHRV8wX0RBVEFfSEFMVEVECQkgKDFMPDwzKQogI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfUEFHRV8wX0lOU1RfSEFMVEVECQkgKDFMPDw0KQogI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfQkFEX0RBVEFfQUREUl9IQUxURUQJCSAoMUw8PDUpCi0jZGVmaW5lIEJOWDJfTUNQX0NQVV9TVEFURV9CQURfcGNfSEFMVEVECQkgKDFMPDw2KQorI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfQkFEX1BDX0hBTFRFRAkJICgxTDw8NikKICNkZWZpbmUgQk5YMl9NQ1BfQ1BVX1NUQVRFX0FMSUdOX0hBTFRFRAkJCSAoMUw8PDcpCiAjZGVmaW5lIEJOWDJfTUNQX0NQVV9TVEFURV9GSU9fQUJPUlRfSEFMVEVECQkgKDFMPDw4KQogI2RlZmluZSBCTlgyX01DUF9DUFVfU1RBVEVfU09GVF9IQUxURUQJCQkgKDFMPDwxMCkKQEAgLTM2NTEsNyArNjE5Niw3IEBACiAjZGVmaW5lIEJOWDJfTUNQX0NQVV9MQVNUX0JSQU5DSF9BRERSX0xCQQkJICgweDNmZmZmZmZmTDw8MikKIAogI2RlZmluZSBCTlgyX01DUF9DUFVfUkVHX0ZJTEUJCQkJMHgwMDE0NTIwMAotI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9EQVRBCQkJCTB4MDAxNDUzYzAKKyNkZWZpbmUgQk5YMl9NQ1BfTUNQUQkJCQkJMHgwMDE0NTNjMAogI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTUQJCQkJMHgwMDE0NTNmOAogI2RlZmluZSBCTlgyX01DUF9NQ1BRX0ZUUV9DTURfT0ZGU0VUCQkJICgweDNmZkw8PDApCiAjZGVmaW5lIEJOWDJfTUNQX01DUFFfRlRRX0NNRF9XUl9UT1AJCQkgKDFMPDwxMCkKQEAgLTM2OTYsNiArNjI0MSw4IEBACiAKIC8qIDU3MDggU2VyZGVzIFBIWSByZWdpc3RlcnMgKi8KIAorI2RlZmluZSBCQ001NzA4U19CTUNSX0ZPUkNFXzI1MDAJCTB4MjAKKwogI2RlZmluZSBCQ001NzA4U19VUDEJCQkJMHhiCiAKICNkZWZpbmUgQkNNNTcwOFNfVVAxXzJHNQkJCTB4MQpAQCAtMzgwNCw2ICs2MzUxLDcgQEAKICNkZWZpbmUgSU5WQUxJRF9DSURfQUREUiAgICAgICAgICAgIDB4ZmZmZmZmZmYKIAogI2RlZmluZSBUWF9DSUQJCTE2CisjZGVmaW5lIFRYX1RTU19DSUQJMzIKICNkZWZpbmUgUlhfQ0lECQkwCiAKICNkZWZpbmUgTUJfVFhfQ0lEX0FERFIJTUJfR0VUX0NJRF9BRERSKFRYX0NJRCkKQEAgLTM4ODksNiArNjQzNyw4IEBACiAKIAl1MzIJCXR4X3Byb2RfYnNlcSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKEwxX0NBQ0hFX0JZVEVTKSkpOwogCXUxNgkJdHhfcHJvZDsKKwl1MzIJCXR4X2JpZHhfYWRkcjsKKwl1MzIJCXR4X2JzZXFfYWRkcjsKIAogCXUxNgkJdHhfY29ucyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKEwxX0NBQ0hFX0JZVEVTKSkpOwogCXUxNgkJaHdfdHhfY29uczsKQEAgLTM5NDUsNiArNjQ5NSw3IEBACiAjZGVmaW5lIENISVBfTlVNKGJwKQkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweGZmZmYwMDAwKQogI2RlZmluZSBDSElQX05VTV81NzA2CQkJMHg1NzA2MDAwMAogI2RlZmluZSBDSElQX05VTV81NzA4CQkJMHg1NzA4MDAwMAorI2RlZmluZSBDSElQX05VTV81NzA5CQkJMHg1NzA5MDAwMAogCiAjZGVmaW5lIENISVBfUkVWKGJwKQkJCSgoKGJwKS0+Y2hpcF9pZCkgJiAweDAwMDBmMDAwKQogI2RlZmluZSBDSElQX1JFVl9BeAkJCTB4MDAwMDAwMDAKQEAgLTQwMDcsNiArNjU1OCwxMCBAQAogCXN0cnVjdCBzdGF0aXN0aWNzX2Jsb2NrCSpzdGF0c19ibGs7CiAJZG1hX2FkZHJfdAkJc3RhdHNfYmxrX21hcHBpbmc7CiAKKwlpbnQJCQljdHhfcGFnZXM7CisJdm9pZAkJCSpjdHhfYmxrWzRdOworCWRtYV9hZGRyX3QJCWN0eF9ibGtfbWFwcGluZ1s0XTsKKwogCXUzMgkJCWhjX2NtZDsKIAl1MzIJCQlyeF9tb2RlOwogCkBAIC00MDM4LDYgKzY1OTMsNyBAQAogCiAJdTgJCQlzZXJkZXNfYW5fcGVuZGluZzsKICNkZWZpbmUgU0VSREVTX0FOX1RJTUVPVVQJKEhaIC8gMykKKyNkZWZpbmUgU0VSREVTX0ZPUkNFRF9USU1FT1VUCShIWiAvIDEwKQogCiAJdTgJCQltYWNfYWRkcls4XTsKIApAQCAtNDEwNCw0MSArNjY2MCw0MyBAQAogfTsKIAogc3RydWN0IGZ3X2luZm8gewotCXUzMiB2ZXJfbWFqb3I7Ci0JdTMyIHZlcl9taW5vcjsKLQl1MzIgdmVyX2ZpeDsKKwljb25zdCB1MzIgdmVyX21ham9yOworCWNvbnN0IHUzMiB2ZXJfbWlub3I7CisJY29uc3QgdTMyIHZlcl9maXg7CiAKLQl1MzIgc3RhcnRfYWRkcjsKKwljb25zdCB1MzIgc3RhcnRfYWRkcjsKIAogCS8qIFRleHQgc2VjdGlvbi4gKi8KLQl1MzIgdGV4dF9hZGRyOwotCXUzMiB0ZXh0X2xlbjsKLQl1MzIgdGV4dF9pbmRleDsKKwljb25zdCB1MzIgdGV4dF9hZGRyOworCWNvbnN0IHUzMiB0ZXh0X2xlbjsKKwljb25zdCB1MzIgdGV4dF9pbmRleDsKIAl1MzIgKnRleHQ7CisJdTggKmd6X3RleHQ7CisJY29uc3QgdTMyIGd6X3RleHRfbGVuOwogCiAJLyogRGF0YSBzZWN0aW9uLiAqLwotCXUzMiBkYXRhX2FkZHI7Ci0JdTMyIGRhdGFfbGVuOwotCXUzMiBkYXRhX2luZGV4OwotCXUzMiAqZGF0YTsKKwljb25zdCB1MzIgZGF0YV9hZGRyOworCWNvbnN0IHUzMiBkYXRhX2xlbjsKKwljb25zdCB1MzIgZGF0YV9pbmRleDsKKwljb25zdCB1MzIgKmRhdGE7CiAKIAkvKiBTQlNTIHNlY3Rpb24uICovCi0JdTMyIHNic3NfYWRkcjsKLQl1MzIgc2Jzc19sZW47Ci0JdTMyIHNic3NfaW5kZXg7Ci0JdTMyICpzYnNzOworCWNvbnN0IHUzMiBzYnNzX2FkZHI7CisJY29uc3QgdTMyIHNic3NfbGVuOworCWNvbnN0IHUzMiBzYnNzX2luZGV4OworCWNvbnN0IHUzMiAqc2JzczsKIAogCS8qIEJTUyBzZWN0aW9uLiAqLwotCXUzMiBic3NfYWRkcjsKLQl1MzIgYnNzX2xlbjsKLQl1MzIgYnNzX2luZGV4OwotCXUzMiAqYnNzOworCWNvbnN0IHUzMiBic3NfYWRkcjsKKwljb25zdCB1MzIgYnNzX2xlbjsKKwljb25zdCB1MzIgYnNzX2luZGV4OworCWNvbnN0IHUzMiAqYnNzOwogCiAJLyogUmVhZC1vbmx5IHNlY3Rpb24uICovCi0JdTMyIHJvZGF0YV9hZGRyOwotCXUzMiByb2RhdGFfbGVuOwotCXUzMiByb2RhdGFfaW5kZXg7Ci0JdTMyICpyb2RhdGE7CisJY29uc3QgdTMyIHJvZGF0YV9hZGRyOworCWNvbnN0IHUzMiByb2RhdGFfbGVuOworCWNvbnN0IHUzMiByb2RhdGFfaW5kZXg7CisJY29uc3QgdTMyICpyb2RhdGE7CiB9OwogCiAjZGVmaW5lIFJWMlBfUFJPQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyX2Z3LmggYi9kcml2ZXJzL25ldC9ibngyX2Z3LmgKaW5kZXggMmQ3NTNkYy4uMjFkMzY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54Ml9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDJfZncuaApAQCAtMTQsMjAgKzE0LDYgQEAKICAqIGFjY29tcGFueWluZyBpdC4KICAqLwogCi1zdGF0aWMgY29uc3QgaW50IGJueDJfQ09NX2IwNkZ3UmVsZWFzZU1ham9yID0gMHgxOwotc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd1JlbGVhc2VNaW5vciA9IDB4MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndSZWxlYXNlRml4ID0gMHgwOwotc3RhdGljIGNvbnN0IHUzMiBibngyX0NPTV9iMDZGd1N0YXJ0QWRkciA9IDB4MDgwMDA4YjQ7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3VGV4dEFkZHIgPSAweDA4MDAwMDAwOwotc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd1RleHRMZW4gPSAweDU3YmM7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3RGF0YUFkZHIgPSAweDA4MDA1ODQwOwotc3RhdGljIGNvbnN0IGludCBibngyX0NPTV9iMDZGd0RhdGFMZW4gPSAweDA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfQ09NX2IwNkZ3Um9kYXRhQWRkciA9IDB4MDgwMDU3YzA7Ci1zdGF0aWMgY29uc3QgaW50IGJueDJfQ09NX2IwNkZ3Um9kYXRhTGVuID0gMHg1ODsKLXN0YXRpYyBjb25zdCB1MzIgYm54Ml9DT01fYjA2RndCc3NBZGRyID0gMHgwODAwNTg2MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndCc3NMZW4gPSAweDg4Owotc3RhdGljIGNvbnN0IHUzMiBibngyX0NPTV9iMDZGd1Nic3NBZGRyID0gMHgwODAwNTg0MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9DT01fYjA2RndTYnNzTGVuID0gMHgxYzsKIHN0YXRpYyB1OCBibngyX0NPTV9iMDZGd1RleHRbXSA9IHsKIAkweDFmLCAweDhiLCAweDA4LCAweDA4LCAweDA5LCAweDgzLCAweDQxLCAweDQ0LCAweDAwLCAweDAzLCAweDc0LCAweDY1LAogCTB4NzMsIDB4NzQsIDB4MzEsIDB4MmUsIDB4NjIsIDB4NjksIDB4NmUsIDB4MDAsIDB4ZWMsIDB4NWIsIDB4N2QsIDB4NmMsCkBAIC02NzMsMzg5ICs2NTksNzUyIEBACiBzdGF0aWMgdTMyIGJueDJfQ09NX2IwNkZ3QnNzWygweDg4LzQpICsgMV0gPSB7IDB4MCB9Owogc3RhdGljIHUzMiBibngyX0NPTV9iMDZGd1Nic3NbKDB4MWMvNCkgKyAxXSA9IHsgMHgwIH07CiAKLXN0YXRpYyBpbnQgYm54Ml9SWFBfYjA2RndSZWxlYXNlTWFqb3IgPSAweDE7Ci1zdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3UmVsZWFzZU1pbm9yID0gMHgwOwotc3RhdGljIGludCBibngyX1JYUF9iMDZGd1JlbGVhc2VGaXggPSAweDA7Ci1zdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3U3RhcnRBZGRyID0gMHgwODAwMzE4NDsKLXN0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndUZXh0QWRkciA9IDB4MDgwMDAwMDA7Ci1zdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3VGV4dExlbiA9IDB4NTg4YzsKLXN0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndEYXRhQWRkciA9IDB4MDgwMDU4ZTA7Ci1zdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3RGF0YUxlbiA9IDB4MDsKLXN0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndSb2RhdGFBZGRyID0gMHgwODAwNTg5MDsKLXN0YXRpYyBpbnQgYm54Ml9SWFBfYjA2RndSb2RhdGFMZW4gPSAweDI4Owotc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd0Jzc0FkZHIgPSAweDA4MDA1OTAwOwotc3RhdGljIGludCBibngyX1JYUF9iMDZGd0Jzc0xlbiA9IDB4MTNhNDsKLXN0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndTYnNzQWRkciA9IDB4MDgwMDU4ZTA7Ci1zdGF0aWMgaW50IGJueDJfUlhQX2IwNkZ3U2Jzc0xlbiA9IDB4MWM7CitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9jb21fZndfMDYgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgxLAorCS52ZXJfbWlub3IJCQk9IDB4MCwKKwkudmVyX2ZpeAkJCT0gMHgwLAorCisJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDA4YjQsCisKKwkudGV4dF9hZGRyCQkJPSAweDA4MDAwMDAwLAorCS50ZXh0X2xlbgkJCT0gMHg1N2JjLAorCS50ZXh0X2luZGV4CQkJPSAweDAsCisJLmd6X3RleHQJCQk9IGJueDJfQ09NX2IwNkZ3VGV4dCwKKwkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX0NPTV9iMDZGd1RleHQpLAorCisJLmRhdGFfYWRkcgkJCT0gMHgwODAwNTg0MCwKKwkuZGF0YV9sZW4JCQk9IDB4MCwKKwkuZGF0YV9pbmRleAkJCT0gMHgwLAorCS5kYXRhCQkJCT0gYm54Ml9DT01fYjA2RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwNTg0MCwKKwkuc2Jzc19sZW4JCQk9IDB4MWMsCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfQ09NX2IwNkZ3U2JzcywKKworCS5ic3NfYWRkcgkJCT0gMHgwODAwNTg2MCwKKwkuYnNzX2xlbgkJCT0gMHg4OCwKKwkuYnNzX2luZGV4CQkJPSAweDAsCisJLmJzcwkJCQk9IGJueDJfQ09NX2IwNkZ3QnNzLAorCisJLnJvZGF0YV9hZGRyCQkJPSAweDA4MDA1N2MwLAorCS5yb2RhdGFfbGVuCQkJPSAweDU4LAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9DT01fYjA2RndSb2RhdGEsCit9OworCiBzdGF0aWMgdTggYm54Ml9SWFBfYjA2RndUZXh0W10gPSB7Ci0JMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHgwNywgMHg4NywgMHg0MSwgMHg0NCwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKLQkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGVkLCAweDVjLCAweDVkLCAweDZjLAotCTB4MWMsIDB4ZDcsIDB4NzUsIDB4M2UsIDB4ZjMsIDB4NDMsIDB4NzEsIDB4NDksIDB4OTEsIDB4ZDQsIDB4NzAsIDB4YjksCi0JMHg2MiwgMHg1NywgMHgxMiwgMHg2NSwgMHhlZCwgMHg4YSwgMHg0MywgMHg3MSwgMHg2ZCwgMHgzMSwgMHhjZSwgMHg1MCwKLQkweDU4LCAweGRiLCAweDgyLCAweGIxLCAweDQ4LCAweGM3LCAweGIzLCAweGE0LCAweGM4LCAweDI0LCAweDAyLCAweDQyLAotCTB4MWIsIDB4NDIsIDB4YWIsIDB4YTQsIDB4YTksIDB4YzEsIDB4OTAsIDB4NzIsIDB4OTEsIDB4MjIsIDB4MmMsIDB4YTAsCi0JMHgxYSwgMHg3OSwgMHhmMCwgMHg0MywgMHgxMCwgMHgyZiwgMHg1NiwgMHgzZiwgMHhhNiwgMHhkMSwgMHg4ZCwgMHg5NiwKLQkweGI2LCAweDFjLCAweDUzLCAweDA4LCAweDgyLCAweDgyLCAweGU1LCAweDUyLCAweDUyLCAweDBiLCAweDJjLCAweGI0LAotCTB4OTYsIDB4ZWQsIDB4MzYsIDB4N2UsIDB4YTgsIDB4MjMsIDB4OWEsIDB4OTIsIDB4OGQsIDB4YTYsIDB4NjgsIDB4ODEsCi0JMHgyMiwgMHhhZCwgMHhkMSwgMHhmNCwgMHg0ZCwgMHg5NSwgMHg5YSwgMHg0YSwgMHg3NSwgMHg1ZiwgMHhkNCwgMHhhMiwKLQkweDQ4LCAweGRhLCAweDQ2LCAweGNkLCAweGY0LCAweGZiLCAweGVlLCAweGNjLCAweDg4LCAweGQ0LCAweDlhLCAweGIyLAotCTB4MmMsIDB4M2IsIDB4MGQsIDB4NjIsIDB4NzQsIDB4MGUsIDB4MzAsIDB4ZDgsIDB4YjksIDB4N2YsIDB4ZTcsIDB4ZWYsCi0JMHg5ZSwgMHg3MywgMHhlZSwgMHgzOSwgMHg3NywgMHgyOCwgMHg3ZCwgMHhhNSwgMHg0MywgMHhkYSwgMHgyNSwgMHg4NCwKLQkweDRlLCAweDNjLCAweDk5LCAweGMzLCAweGNmLCAweDNjLCAweGZkLCAweGUwLCAweGMzLCAweDBmLCAweGVlLCAweGMxLAotCTB4ZWIsIDB4YjAsIDB4YTEsIDB4NmQsIDB4ZDAsIDB4YTMsIDB4ZmUsIDB4MTgsIDB4NjIsIDB4ODgsIDB4MjEsIDB4ODYsCi0JMHgxOCwgMHg2MiwgMHg4OCwgMHgyMSwgMHg4NiwgMHgxOCwgMHg2MiwgMHg4OCwgMHgyMSwgMHg4NiwgMHgxOCwgMHg2MiwKLQkweDg4LCAweDIxLCAweDg2LCAweDE4LCAweDYyLCAweDg4LCAweDIxLCAweDg2LCAweDE4LCAweDYyLCAweDg4LCAweDIxLAotCTB4ODYsIDB4MTgsIDB4NjIsIDB4ODgsIDB4MjEsIDB4ODYsIDB4MTgsIDB4NjIsIDB4ODgsIDB4MjEsIDB4ODYsIDB4MTgsCi0JMHg2MiwgMHg4OCwgMHgyMSwgMHg4NiwgMHgxOCwgMHg2MiwgMHg4OCwgMHgyMSwgMHg4NiwgMHgxOCwgMHg2MiwgMHg4OCwKLQkweDIxLCAweDg2LCAweDE4LCAweDYyLCAweDg4LCAweDIxLCAweDg2LCAweGZmLCAweGVmLCAweDYwLCAweDg4LCAweDU4LAotCTB4ZmMsIDB4ZWQsIDB4MGMsIDB4MWYsIDB4NDksIDB4ZTgsIDB4ODUsIDB4Y2IsIDB4MDcsIDB4M2QsIDB4NWIsIDB4MTIsCi0JMHg0NiwgMHg2MSwgMHg2OSwgMHg2NiwgMHhkYSwgMHgxNiwgMHg3MSwgMHhlYiwgMHhiYiwgMHgzMywgMHg0NSwgMHhmOSwKLQkweDFmLCAweGJmLCAweDk0LCAweDMyLCAweDg1LCAweGZkLCAweGRiLCAweDBiLCAweDM3LCAweDlmLCAweDdkLCAweGYzLAotCTB4OTEsIDB4ZWMsIDB4OGQsIDB4MDUsIDB4NDMsIDB4MTIsIDB4NTYsIDB4ZTEsIDB4ZTgsIDB4YjAsIDB4YjUsIDB4NGIsCi0JMHgxMiwgMHg3ZCwgMHg1OCwgMHhmMywgMHhkZCwgMHhjMSwgMHhjZiwgMHg1OSwgMHhkMiwgMHgxNSwgMHhlMSwgMHhiYSwKLQkweGVlLCAweGJmLCAweDM5LCAweDY4LCAweGM5LCAweDJiLCAweDhkLCAweDk0LCAweDVjLCAweDY4LCAweDZjLCAweGRmLAotCTB4MjQsIDB4NWQsIDB4ZDksIDB4NTIsIDB4MDksIDB4ZmQsIDB4NmUsIDB4OGEsIDB4ZTMsIDB4OTYsIDB4OTQsIDB4YWIsCi0JMHgyZCwgMHhlMiwgMHgyYSwgMHhiYSwgMHg3ZCwgMHg1YSwgMHg3MSwgMHhmZSwgMHgzZSwgMHhjZCwgMHg5YiwgMHg3ZiwKLQkweDllLCAweGZmLCAweDFlLCAweDI0LCAweGE1LCAweGNiLCAweDdkLCAweDY4LCAweGY3LCAweGExLCAweGNkLCAweGY3LAotCTB4ODEsIDB4ZjQsIDB4OTQsIDB4OTgsIDB4NzIsIDB4YTQsIDB4OTEsIDB4OTAsIDB4YTMsIDB4ZDUsIDB4OGMsIDB4ZTgsCi0JMHgwNSwgMHg3MSwgMHhiZCwgMHhiYywgMHg5ZCwgMHgyZSwgMHhhMywgMHg2ZiwgMHhlYSwgMHgwMCwgMHhkYiwgMHgyOSwKLQkweGUwLCAweGY5LCAweDBlLCAweGQ3LCAweDU5LCAweDVlLCAweDVlLCAweDRhLCAweGI3LCAweGM2LCAweDE0LCAweDBkLAotCTB4OGUsIDB4YjEsIDB4MGYsIDB4YmYsIDB4NTgsIDB4NWYsIDB4YWUsIDB4NzYsIDB4MDAsIDB4NmYsIDB4ZDYsIDB4NzEsCi0JMHg0MSwgMHhkYywgMHg3MywgMHgyYywgMHhkMCwgMHhmNiwgMHhmZCwgMHhkZiwgMHg3NSwgMHgzMiwgMHhiMiwgMHhlMiwKLQkweDc0LCAweDgxLCAweGE3LCAweDE2LCAweDY5LCAweGI1LCAweGM1LCAweGQyLCAweDBiLCAweGI2LCAweGI1LCAweDIyLAotCTB4NmQsIDB4MWMsIDB4ZWIsIDB4MzQsIDB4MGEsIDB4YmUsIDB4M2YsIDB4OWQsIDB4OTcsIDB4YWUsIDB4YTAsIDB4NmYsCi0JMHhiNywgMHhlMiwgMHg2MywgMHg3MiwgMHg0MiwgMHhjMywgMHhiYywgMHg1NywgMHg0OSwgMHgwZiwgMHgzYSwgMHhlMiwKLQkweDNiLCAweDdmLCAweGYzLCAweDUyLCAweGFjLCAweDZjLCAweDk3LCAweGM5LCAweDU0LCAweGY2LCAweGEwLCAweDFiLAotCTB4ZDAsIDB4NzQsIDB4M2QsIDB4NjcsIDB4MmIsIDB4NzAsIDB4NmEsIDB4ZTAsIDB4NGYsIDB4ZGIsIDB4ODEsIDB4ZjUsCi0JMHhlZSwgMHgwYSwgMHg2OCwgMHgxYSwgMHg4NSwgMHhjZCwgMHg2MiwgMHg2YywgMHg2NiwgMHg5ZiwgMHhlOCwgMHgzYiwKLQkweDg3LCAweDkzLCAweGUxLCAweDc4LCAweDk3LCAweDM2LCAweDMyLCAweDZmLCAweDg4LCAweDZlLCAweGZmLCAweDgxLAotCTB4ZTYsIDB4ZDUsIDB4N2EsIDB4ZTUsIDB4ZDgsIDB4YmMsIDB4OGUsIDB4NzcsIDB4NWQsIDB4YWUsIDB4ZTYsIDB4NGIsCi0JMHg5YSwgMHhkYiwgMHhhOCwgMHg2OCwgMHhkZSwgMHhkOSwgMHg1OSwgMHhhZCwgMHg3OCwgMHhkNiwgMHg5NCwgMHhhMywKLQkweGI2LCAweDdmLCAweGUxLCAweGI0LCAweDczLCAweDQyLCAweDFiLCAweDM5LCAweDdiLCAweDQ2LCAweDFiLCAweDNkLAotCTB4ZmIsIDB4ODYsIDB4MzYsIDB4ZGUsIDB4ZDgsIDB4YjIsIDB4NDksIDB4ZGEsIDB4YjMsIDB4ZDAsIDB4MWUsIDB4NzEsCi0JMHg5MCwgMHhiZiwgMHg0ZiwgMHg4NywgMHhiYSwgMHhlYywgMHhhMiwgMHhkZSwgMHg0YSwgMHhlNCwgMHg3ZCwgMHg5ZiwKLQkweGYzLCAweDg2LCAweGU2LCAweDU1LCAweDZkLCAweDhiLCAweGZiLCAweGU2LCAweGE2LCAweDIyLCAweDFhLCAweGVkLAotCTB4NzIsIDB4NzQsIDB4ZGUsIDB4OTQsIDB4NjMsIDB4ZDUsIDB4OTQsIDB4M2MsIDB4NTcsIDB4MmQsIDB4MjksIDB4NWEsCi0JMHg4NiwgMHg1ZCwgMHhkMiwgMHhiYywgMHgwNiwgMHhjNywgMHgyYiwgMHhhMCwgMHg3NSwgMHg0MiwgMHhkYiwgMHgwNywKLQkweDlhLCAweGRlLCAweDU5LCAweDI5LCAweDVkLCAweDcxLCAweGU2LCAweDQwLCAweGFmLCAweDAzLCAweDc4LCAweGZmLAotCTB4NTgsIDB4MWIsIDB4NmQsIDB4ZjQsIDB4NmEsIDB4ZGUsIDB4YzksIDB4OWIsIDB4ZTIsIDB4MzksIDB4NTksIDB4ZWIsCi0JMHg0YiwgMHg2MiwgMHhiYSwgMHhiMCwgMHgwMSwgMHhjOCwgMHgwYywgMHhmZCwgMHgzOCwgMHhkMCwgMHg0OSwgMHhjYSwKLQkweGY3LCAweGY1LCAweDgyLCAweGZmLCAweDJjLCAweDc0LCAweDZmLCAweDVkLCAweGExLCAweGZjLCAweDhkLCAweDVlLAotCTB4MjksIDB4Y2YsIDB4NTMsIDB4ZDcsIDB4YTYsIDB4MzYsIDB4NTIsIDB4ZjUsIDB4MmYsIDB4NzgsIDB4OGUsIDB4ZjQsCi0JMHgxOSwgMHhlMiwgMHhmYiwgMHg0NywgMHg5ZCwgMHg4MSwgMHhmNCwgMHgyMSwgMHgzOSwgMHgwMywgMHhkYywgMHg3NSwKLQkweGFkLCAweGQ4LCAweGEwLCAweGFlLCAweGMxLCAweGRmLCAweDJkLCAweDM5LCAweDAyLCAweGJkLCAweDE1LCAweDlkLAotCTB4NWUsIDB4OTksIDB4YjQsIDB4YjIsIDB4MmUsIDB4ZjYsIDB4NjgsIDB4NTMsIDB4MjAsIDB4NTcsIDB4MzIsIDB4YjQsCi0JMHgxNywgMHhkMiwgMHhlNywgMHhkZSwgMHg2NywgMHhkMywgMHg5ZSwgMHhhMSwgMHhjYiwgMHg1MywgMHgyZiwgMHgzZCwKLQkweGRmLCAweGIzLCAweDM4LCAweGI0LCAweDkxLCAweDMyLCAweDQzLCAweGZmLCAweGYyLCAweDQ1LCAweGNmLCAweGY2LAotCTB4YjYsIDB4YjQsIDB4NDgsIDB4MjksIDB4NmQsIDB4NDgsIDB4MTYsIDB4ZmIsIDB4YjQsIDB4NDMsIDB4NGUsIDB4M2IsCi0JMHgyMiwgMHg4NywgMHgyYSwgMHhkMCwgMHg4ZCwgMHg2ZCwgMHg1YSwgMHg4YiwgMHg2MiwgMHg2NywgMHhjYSwgMHgzMiwKLQkweDUwLCAweDMyLCAweDc1LCAweDc0LCAweDI2LCAweDQ5LCAweDk3LCAweDNhLCAweGQyLCAweGU1LCAweDdhLCAweDllLAotCTB4N2EsIDB4YTIsIDB4M2QsIDB4N2YsIDB4MjgsIDB4NWQsIDB4NjksIDB4YWIsIDB4YmEsIDB4NWEsIDB4ZDUsIDB4ZDMsCi0JMHhmOCwgMHgyZiwgMHg1ZCwgMHg0ZiwgMHhkNCwgMHhjOSwgMHg3MiwgMHgyOCwgMHhiNywgMHgwMywgMHhkYywgMHg4ZiwKLQkweDQwLCAweDVmLCAweGUyLCAweGVhLCAweGMzLCAweDBmLCAweGIxLCAweDZmLCAweDkzLCAweDUxLCAweGIwLCAweGQzLAotCTB4MTcsIDB4NjEsIDB4MTQsIDB4N2EsIDB4NjEsIDB4MzcsIDB4NjQsIDB4MTksIDB4YTYsIDB4ZWUsIDB4ZTAsIDB4YzMsCi0JMHgxZiwgMHg0OSwgMHg1ZSwgMHhmOSwgMHhkNSwgMHg5MCwgMHg5NywgMHhmYywgMHhkYiwgMHgzMiwgMHg1NSwgMHg0OSwKLQkweDgwLCAweDA2LCAweDY1LCAweGQ0LCAweGU1LCAweGJkLCAweDdjLCAweDY0LCAweDFiLCAweDdiLCAweDIwLCAweDVmLAotCTB4NWUsIDB4YTYsIDB4YmUsIDB4NDUsIDB4N2YsIDB4YTIsIDB4ZmQsIDB4ZjMsIDB4OWQsIDB4YjIsIDB4ZmUsIDB4Y2MsCi0JMHhiZiwgMHhlZSwgMHg3YywgMHg5MiwgMHhmNiwgMHg5NiwgMHg3YywgMHgyNywgMHhlNCwgMHg3OCwgMHgzNSwgMHhjOSwKLQkweDNkLCAweGQ0LCAweDU2LCAweDU0LCAweDZjLCAweDhhLCAweDY0LCAweDE0LCAweGRkLCAweDI4LCAweDc0LCAweDQ4LAotCTB4NTEsIDB4ZWQsIDB4ZjcsIDB4NWUsIDB4ZDAsIDB4NDMsIDB4MmMsIDB4YTgsIDB4ZjIsIDB4YmQsIDB4YTAsIDB4NjQsCi0JMHg5YiwgMHhiNiwgMHhlZCwgMHhjYywgMHgxMSwgMHhjOSwgMHhjMiwgMHhiZSwgMHg0NSwgMHg4ZSwgMHhjYywgMHg5OSwKLQkweDMyLCAweDZkLCAweGZmLCAweDYzLCAweGE3LCAweGI0LCAweDJmLCAweGRmLCAweDZmLCAweGE4LCAweGI4LCAweGFlLAotCTB4ZjcsIDB4NmUsIDB4OTAsIDB4NGQsIDB4ZTAsIDB4NzcsIDB4ZjksIDB4N2UsIDB4NWQsIDB4ZTQsIDB4YTYsIDB4NTksCi0JMHhjOCwgMHg1YSwgMHgyMywgMHgwOCwgMHhmNiwgMHg0NiwgMHg4MSwgMHhiMSwgMHg0YywgMHg0MywgMHgyYywgMHg5MywKLQkweDQ0LCAweDhiLCAweDRkLCAweDdkLCAweGY5LCAweGZlLCAweGY4LCAweGYwLCAweGRkLCAweGY1LCAweDc1LCAweDY0LAotCTB4OWUsIDB4YjQsIDB4YTksIDB4MmYsIDB4YzYsIDB4YTgsIDB4MTIsIDB4ZjQsIDB4YzEsIDB4ZjgsIDB4NzQsIDB4YmIsCi0JMHhhZSwgMHg4YSwgMHhhMSwgMHhhZSwgMHg0NiwgMHhmZSwgMHhlZiwgMHhlZCwgMHhjMiwgMHhmNSwgMHhhYSwgMHhhMiwKLQkweDc5LCAweGNlLCAweGJiLCAweGExLCAweDJmLCAweGQ4LCAweDMyLCAweDAyLCAweDdmLCAweDM3LCAweGVjLCAweDRmLAotCTB4Y2IsIDB4OTEsIDB4NTQsIDB4NzYsIDB4YzIsIDB4OTUsIDB4YzAsIDB4ZTYsIDB4YWYsIDB4YWQsIDB4YjEsIDB4ZjksCi0JMHhkMSwgMHhiYiwgMHhjOCwgMHg3NSwgMHgzYywgMHg5NCwgMHhjYiwgMHgwZCwgMHhlNSwgMHgxYSwgMHg4NSwgMHg1YywKLQkweDYzLCAweDkwLCAweDZiLCAweGU1LCAweDIzLCAweGM4LCAweGI1LCAweGYyLCAweDkxLCAweGU1LCAweGQyLCAweGE0LAotCTB4ZWMsIDB4M2MsIDB4MDgsIDB4NWEsIDB4YTYsIDB4ZmMsIDB4YWIsIDB4MTMsIDB4ZDgsIDB4ZjIsIDB4YmYsIDB4MzgsCi0JMHg5ZiwgMHgxNCwgMHgxOSwgMHg3YywgMHg3ZiwgMHg3MCwgMHhkOCwgMHgxNiwgMHhlZiwgMHg1YiwgMHhlMCwgMHhkNSwKLQkweDcxLCAweDQwLCAweDhiLCAweGVmLCAweGVmLCAweDk3LCAweGUxLCAweDZlLCAweGZlLCAweDM4LCAweDhiLCAweDdkLAotCTB4NWQsIDB4Y2YsIDB4MWYsIDB4MjksIDB4ODcsIDB4M2UsIDB4N2MsIDB4ZWYsIDB4ZmUsIDB4YTgsIDB4NmIsIDB4MWYsCi0JMHg1NSwgMHgwZSwgMHhjNiwgMHg5YywgMHg0ZiwgMHgzNSwgMHg5ZCwgMHhhYiwgMHgxZiwgMHg1NiwgMHg4NiwgMHhmNSwKLQkweDYzLCAweGNhLCAweDJmLCAweDRmLCAweDg2LCAweGM3LCAweDY0LCAweDcyLCAweDMzLCAweGVkLCAweGE5LCAweGE0LAotCTB4OGQsIDB4MGMsIDB4OTIsIDB4ZWYsIDB4YjUsIDB4ZmMsIDB4NGEsIDB4MjYsIDB4ZTAsIDB4MGQsIDB4MzksIDB4ZDEsCi0JMHhkMiwgMHg0NiwgMHgzOSwgMHhiMiwgMHg2MCwgMHg0OSwgMHg2OSwgMHhlOSwgMHg0ZSwgMHg3MSwgMHg1NywgMHgwMywKLQkweDZmLCAweGI0LCAweDQ3LCAweGY2LCAweDdkLCAweGQyLCAweDdjLCAweDJhLCAweGM4LCAweDJiLCAweDJlLCAweDU0LAotCTB4OTEsIDB4ODMsIDB4NTYsIDB4MTMsIDB4NzIsIDB4ZDksIDB4NDgsIDB4Y2IsIDB4OWIsIDB4ODMsIDB4ODcsIDB4ZTUsCi0JMHhmMywgMHhkNSwgMHgyNCwgMHhlOCwgMHgzMSwgMHg5ZiwgMHgyYywgMHhlNywgMHgxMCwgMHgxNywgMHhiNSwgMHhiMiwKLQkweDYzLCAweDA4LCAweDc5LCAweGFmLCAweGQ5LCAweDljLCAweDEzLCAweGM0LCAweDk2LCAweDcyLCAweDEwLCAweDgzLAotCTB4NWQsIDB4NmYsIDB4NTAsIDB4ZTUsIDB4MTQsIDB4OTAsIDB4NGYsIDB4NjQsIDB4MGMsIDB4YjEsIDB4YjcsIDB4NjYsCi0JMHhiMywgMHhjZCwgMHhmZSwgMHhhMCwgMHhlZiwgMHhiMywgMHg5NSwgMHg1ZSwgMHhhZCwgMHhjOCwgMHhiYywgMHg2NCwKLQkweGYwLCAweGE2LCAweDRjLCAweDNiLCAweDQxLCAweGRmLCAweGU3LCAweDJhLCAweGEzLCAweDliLCAweDk4LCAweDFmLAotCTB4MWEsIDB4MDUsIDB4YzksIDB4OTQsIDB4OWQsIDB4ZjcsIDB4N2MsIDB4ZDcsIDB4YmEsIDB4N2QsIDB4Y2QsIDB4ZmEsCi0JMHg3OCwgMHhiMiwgMHgxMywgMHg4MSwgMHhjZSwgMHg0NSwgMHhmYiwgMHhhYSwgMHhhZCwgMHhmNywgMHhiNiwgMHg0YSwKLQkweDA5LCAweDI3LCAweDVkLCAweGQ2LCAweDFhLCAweDQ3LCAweGU3LCAweGJlLCAweDRhLCAweDc5LCAweDViLCAweGFiLAotCTB4ZGMsIDB4MzQsIDB4ODAsIDB4M2YsIDB4NmQsIDB4NjgsIDB4NjIsIDB4MWUsIDB4YWEsIDB4OTQsIDB4YmIsIDB4ZDksCi0JMHhhNiwgMHhiZSwgMHg3NCwgMHg0ZCwgMHgxMiwgMHhhMywgMHgxNSwgMHg1ZiwgMHhhZSwgMHgzYSwgMHg0MSwgMHhlZSwKLQkweDYzLCAweDY4LCAweDdhLCAweDZmLCAweDViLCAweGI4LCAweDU2LCAweGQ3LCAweDc2LCAweDM5LCAweDk3LCAweDQ0LAotCTB4M2EsIDB4MGUsIDB4NTUsIDB4YzQsIDB4MmEsIDB4NTYsIDB4NzYsIDB4MzksIDB4NmYsIDB4NGIsIDB4YjksIDB4YTcsCi0JMHg2ZCwgMHg3NSwgMHg1ZCwgMHg4YSwgMHhlYiwgMHg3NiwgMHgwZSwgMHhhZiwgMHg5ZCwgMHhiYiwgMHhjYiwgMHhiOSwKLQkweDI4LCAweGU1LCAweDJkLCAweDZkLCAweGFiLCAweGI0LCAweGQyLCAweDU4LCAweGRiLCAweDE3LCAweGFjLCAweGU1LAotCTB4ZjgsIDB4NjYsIDB4NzEsIDB4YmIsIDB4MzksIDB4NDcsIDB4ZWYsIDB4NmQsIDB4YmYsIDB4NDUsIDB4NDMsIDB4MzIsCi0JMHhjNSwgMHg0YSwgMHhiOSwgMHhhNywgMHg3ZCwgMHgxNSwgMHhhZiwgMHg0ZCwgMHhiYywgMHhkZSwgMHgxYSwgMHhiYywKLQkweGM0LCAweGQ5LCAweGJlLCAweDhhLCAweDMzLCAweDA3LCAweDljLCAweDQzLCAweGFiLCAweDM4LCAweDM5LCAweDdlLAotCTB4NTgsIDB4OGEsIDB4MzgsIDB4ZDMsIDB4NWEsIDB4MGEsIDB4MzIsIDB4YmMsIDB4NTQsIDB4YzksIDB4NDgsIDB4NzksCi0JMHgyOCwgMHgwMSwgMHhkZCwgMHhmNywgMHgxZiwgMHhmYywgMHg5YSwgMHhhYSwgMHg0MywgMHhjYywgMHg2MSwgMHgwZiwKLQkweGJhLCAweDMyLCAweDU1LCAweDVlLCAweDg3LCAweGQ4LCAweDA4LCAweGRiLCAweGY4LCAweDVhLCAweDVkLCAweDg2LAotCTB4MTcsIDB4ZWIsIDB4YTYsIDB4MWMsIDB4NmYsIDB4NzAsIDB4YmYsIDB4OTgsIDB4ZTMsIDB4MDUsIDB4NzUsIDB4YzYsCi0JMHg4NSwgMHg0NiwgMHg0ZSwgMHhkYiwgMHg4NywgMHhiZCwgMHg2NiwgMHg5ZCwgMHhiMCwgMHhhZiwgMHg2MSwgMHg2YSwKLQkweGEzLCAweDNjLCAweDFmLCAweDgwLCAweDk3LCAweDc2LCAweDdlLCAweGFjLCAweDQxLCAweGRiLCAweDc5LCAweDAzLAotCTB4YjYsIDB4NDEsIDB4Y2UsIDB4YTMsIDB4OWMsIDB4YmQsIDB4OTUsIDB4YjksIDB4NTMsIDB4NjYsIDB4ZDEsIDB4NTEsCi0JMHg3NSwgMHg4OCwgMHg1NiwgMHhjYiwgMHg3NywgMHgyMCwgMHgwNywgMHg0ZCwgMHhhMCwgMHhkNiwgMHg4MCwgMHhjZCwKLQkweGRiLCAweDc4LCAweDZmLCAweDcwLCAweGRlLCAweDMyLCAweGU2LCAweDZkLCAweGUwLCAweDNjLCAweGVjLCAweGNkLAotCTB4MjUsIDB4ZTUsIDB4MGYsIDB4YTYsIDB4Y2QsIDB4ZjEsIDB4NzcsIDB4YjEsIDB4YzcsIDB4NjgsIDB4ZDcsIDB4NTksCi0JMHg1NywgMHg1OCwgMHgwMiwgMHg1ZiwgMHhjMSwgMHgzZSwgMHhhMiwgMHg2ZSwgMHg0OCwgMHhlZCwgMHg2MCwgMHg3ZSwKLQkweDhmLCAweGI5LCAweDE5LCAweGNjLCAweGNkLCAweDY2LCAweDE4LCAweGNmLCAweDNkLCAweGZiLCAweDk5LCAweDBlLAotCTB4ZTksIDB4NDIsIDB4YmIsIDB4Y2UsIDB4MzUsIDB4ZDksIDB4MGMsIDB4NzIsIDB4NWIsIDB4ZGYsIDB4Y2IsIDB4YjcsCi0JMHhjOSwgMHg0YSwgMHhjYSwgMHhiZiwgMHg2MCwgMHhkOCwgMHhkMSwgMHhkYywgMHgwOCwgMHg2ZiwgMHhmMywgMHg1YywKLQkweGU2LCAweGM1LCAweGM0LCAweGJkLCAweDIxLCAweGNjLCAweDgzLCAweGM3LCAweGM1LCAweDZkLCAweGZjLCAweDQ5LAotCTB4YjcsIDB4NzQsIDB4YjksIDB4ZjgsIDB4OGQsIDB4ZTYsIDB4NGMsIDB4NmYsIDB4MGUsIDB4NmEsIDB4MmUsIDB4YmUsCi0JMHhiNywgMHg1MCwgMHgzZSwgMHgxNywgMHhlNywgMHhhMSwgMHg1NiwgMHhhYywgMHg2NiwgMHgyNiwgMHg1OSwgMHgxZiwKLQkweDE1LCAweGViLCAweDZjLCAweGVmLCAweDg1LCAweDNmLCAweDA0LCAweDc1LCAweGQ3LCAweDg1LCAweDViLCAweGJlLAotCTB4NzAsIDB4MTksIDB4N2EsIDB4NGIsIDB4NDMsIDB4NmYsIDB4MjksIDB4MzksIDB4ZGYsIDB4NjAsIDB4OWQsIDB4ZTYsCi0JMHg0MiwgMHg1ZiwgMHgxOSwgMHhmMSwgMHgxYSwgMHhlMywgMHg1OCwgMHgyYiwgMHg4NywgMHg4MSwgMHgwMywgMHgzYSwKLQkweDE3LCAweDQ3LCAweDJmLCAweDY0LCAweDY1LCAweGNhLCAweGRhLCAweDFkLCAweGYxLCAweDAwLCAweDVjLCAweDg4LAotCTB4MWYsIDB4ODUsIDB4MzYsIDB4ZjQsIDB4ZjEsIDB4MWQsIDB4OWEsIDB4NTMsIDB4ZmYsIDB4ODYsIDB4N2YsIDB4OTQsCi0JMHhlZCwgMHgwOSwgMHhiZCwgMHgzMCwgMHhkNiwgMHhkNCwgMHhiZiwgMHg2ZSwgMHhmYywgMHhhMSwgMHgxYywgMHg2OCwKLQkweDMzLCAweDA2LCAweDMxLCAweGZlLCAweGU4LCAweGE4LCAweGYzLCAweDE4LCAweDhiLCAweDQ4LCAweGQ3LCAweDkyLAotCTB4MjMsIDB4NGIsIDB4MjMsIDB4ZGMsIDB4MzcsIDB4OGIsIDB4ZjEsIDB4YTcsIDB4NWMsIDB4ZTcsIDB4OWUsIDB4MjksCi0JMHg1YywgMHhjMCwgMHgxOSwgMHhhZCwgMHhmMSwgMHhmZCwgMHgxMSwgMHg4NywgMHg2YiwgMHg3YywgMHg5OSwgMHg3MCwKLQkweDNhLCAweGM0LCAweDQ4LCAweDk2LCAweGI0LCAweGM3LCAweDA3LCAweDExLCAweDdiLCAweDFlLCAweGUwLCAweDNlLAotCTB4MzIsIDB4MDYsIDB4NmQsIDB4MTcsIDB4YjAsIDB4ZWEsIDB4YjQsIDB4M2MsIDB4M2MsIDB4YzgsIDB4NzUsIDB4YTAsCi0JMHhkZCwgMHgyYSwgMHg3YSwgMHg5MiwgMHgzNCwgMHhmMywgMHgyMSwgMHg0ZiwgMHg0MywgMHhkZCwgMHg4MSwgMHhiZSwKLQkweDA2LCAweGFjLCAweDQwLCAweDdmLCAweDlmLCAweGU5LCAweDVlLCAweGQ1LCAweDFmLCAweGQ3LCAweDM1LCAweGYzLAotCTB4Y2IsIDB4MTgsIDB4OTYsIDB4OTAsIDB4ODEsIDB4MzMsIDB4MWIsIDB4NjUsIDB4ZTcsIDB4YTIsIDB4MjUsIDB4ZjYsCi0JMHg5OSwgMHg1NSwgMHhmZSwgMHg3NiwgMHg5ZSwgMHg1YiwgMHhjYiwgMHg1ZiwgMHhmNCwgMHg3ZiwgMHgxNSwgMHg1YywKLQkweGQwLCAweGM1LCAweDhlLCAweGZhLCAweDFlLCAweDRiLCAweDA1LCAweGI4LCAweGEzLCAweGY2LCAweDdiLCAweGUxLAotCTB4NWUsIDB4ZjEsIDB4ZmQsIDB4OTksIDB4NzAsIDB4NGYsIDB4YjAsIDB4MDcsIDB4ODgsIDB4OTUsIDB4ZTcsIDB4NmYsCi0JMHhjNSwgMHhhOSwgMHgwYywgMHhmNiwgMHgwNiwgMHhiNiwgMHhhNywgMHhlMiwgMHgxMSwgMHhlMywgMHgxOCwgMHhlZCwKLQkweGJiLCAweDYzLCAweGQyLCAweDJjLCAweGIwLCAweDhlLCAweGU2LCAweDNlLCAweGM5LCAweDQ0LCAweGI5LCAweDIyLAotCTB4YTUsIDB4YWQsIDB4ODUsIDB4NjcsIDB4N2QsIDB4ZDgsIDB4Y2YsIDB4YTQsIDB4YTUsIDB4NmMsIDB4YWYsIDB4NjMsCi0JMHhhZiwgMHg5NywgMHgzNywgMHhhMCwgMHgxYiwgMHg4YywgMHhjMSwgMHgyNiwgMHhmNSwgMHg0MiwgMHg0MiwgMHg4YSwKLQkweDhkLCAweDQ0LCAweGMyLCAweDNjLCAweDMxLCAweGYwLCAweDIzLCAweGNmLCAweDQ4LCAweDI0LCAweGY0LCAweDEzLAotCTB4ODEsIDB4OWQsIDB4NGQsIDB4ZDYsIDB4NmYsIDB4MjAsIDB4NTYsIDB4NmEsIDB4NzIsIDB4NzQsIDB4ZTgsIDB4ODYsCi0JMHhjZiwgMHgxYSwgMHhkOCwgMHhkYiwgMHgwYiwgMHg5YiwgMHgxYiwgMHg4MiwgMHhjZiwgMHg4MCwgMHg4ZiwgMHg3MiwKLQkweGEzLCAweGEzLCAweDM3LCAweGUwLCAweGVkLCAweDJiLCAweDExLCAweDhmLCAweGE2LCAweDhlLCAweGRjLCAweGQzLAotCTB4Y2IsIDB4ZmIsIDB4YmUsIDB4NTEsIDB4ZDgsIDB4OTAsIDB4OTgsIDB4Y2UsIDB4OGYsIDB4NmYsIDB4ZDEsIDB4Y2YsCi0JMHhlZCwgMHhkZiwgMHg2MiwgMHg5YywgMHgyYiwgMHg2ZCwgMHgwMSwgMHgzZSwgMHhkZCwgMHhjYiwgMHhlMywgMHhmNywKLQkweDljLCAweGM4LCAweDQ0LCAweDE1LCAweDNhLCAweGRmLCAweDAzLCAweDNkLCAweDU5LCAweGYwLCAweGM1LCAweDNkLAotCTB4YTYsIDB4Y2EsIDB4ZDEsIDB4ZjUsIDB4M2QsIDB4MmYsIDB4NmUsIDB4MGEsIDB4NzAsIDB4ZjAsIDB4ZmQsIDB4MjcsCi0JMHg3ZSwgMHg3MCwgMHg4NiwgMHg1ZSwgMHgwZSwgMHhmYiwgMHg3ZSwgMHgzZiwgMHhkYywgMHg4NywgMHg1ZiwgMHg0NSwKLQkweGI5LCAweDc4LCAweDVlLCAweDQ0LCAweGIyLCAweGFkLCAweDNkLCAweDM3LCAweGIyLCAweGUzLCAweDI1LCAweDljLAotCTB4MzMsIDB4YTcsIDB4MWQsIDB4ZGYsIDB4N2YsIDB4MDcsIDB4Y2YsIDB4MzUsIDB4YTcsIDB4ZDksIDB4NDYsIDB4ZGUsCi0JMHg3ZiwgMHhmNiwgMHgzMSwgMHgwNywgMHhmOCwgMHgyYywgMHhjZSwgMHhiZCwgMHhkMSwgMHhhNiwgMHhiMywgMHhmZiwKLQkweDVlLCAweGNmLCAweGJkLCAweDdiLCAweDNmLCAweGZiLCAweGM5LCAweGYzLCAweDFkLCAweDdkLCAweGVmLCAweDAzLAotCTB4Y2UsIDB4ZmUsIDB4MGYsIDB4NWMsIDB4NzcsIDB4MGYsIDB4M2UsIDB4MWIsIDB4ZDgsIDB4NmQsIDB4YjEsIDB4ZDEsCi0JMHgxYywgMHg1ZiwgMHhlZSwgMHhkNSwgMHg3ZiwgMHg3ZiwgMHhhZCwgMHhmYiwgMHg3NiwgMHhmZiwgMHhiNSwgMHhiYiwKLQkweDZmLCAweGY3LCAweGRmLCAweGNkLCAweGRkLCAweGJmLCAweDE4LCAweGZmLCAweGNkLCAweDAxLCAweDBmLCAweDdkLAotCTB4NzAsIDB4YWQsIDB4ZmYsIDB4YWUsIDB4ZTcsIDB4OTMsIDB4ZDQsIDB4ZjcsIDB4ZjMsIDB4M2QsIDB4ZTUsIDB4YTEsCi0JMHhjZSwgMHgzMCwgMHgxZiwgMHg1MiwgMHhlNywgMHhmNSwgMHgxNywgMHhhNywgMHg2ZCwgMHhlZiwgMHg3ZSwgMHg1MywKLQkweDRhLCAweGI5LCAweDE2LCAweGM5LCAweGU2LCAweDZhLCAweGIyLCAweDQzLCAweDhlLCAweDNiLCAweDIyLCAweDRiLAotCTB4YWEsIDB4MTYsIDB4MzEsIDB4NTEsIDB4OGIsIDB4MGYsIDB4YTAsIDB4M2UsIDB4MGIsIDB4ZjQsIDB4YmEsIDB4YTQsCi0JMHhmNCwgMHhmMiwgMHgwMiwgMHg3OCwgMHg4OSwgMHhmMCwgMHg3NCwgMHhkZCwgMHgwNSwgMHgwZiwgMHg3MSwgMHgxMCwKLQkweDE3LCAweGYxLCAweDBjLCAweGUyLCAweDdjLCAweGI3LCAweGQ3LCAweGMxLCAweDg1LCAweDczLCAweGVhLCAweDI1LAotCTB4ZDQsIDB4NjQsIDB4YjYsIDB4ZGUsIDB4YTMsIDB4MDcsIDB4NjcsIDB4YjIsIDB4NWIsIDB4OTYsIDB4ZGQsIDB4ZTksCi0JMHhlYiwgMHhmMiwgMHgwNSwgMHg5ZSwgMHg1OSwgMHgwYSwgMHhhZSwgMHhjZSwgMHgyMSwgMHg1NiwgMHgwZiwgMHg4ZCwKLQkweDg1LCAweDc1LCAweGQyLCAweGRjLCAweDQxLCAweGNmLCAweDhlLCAweGVlLCAweDQ5LCAweDc4LCAweDQ3LCAweDkyLAotCTB4OTAsIDB4OTIsIDB4OWEsIDB4YjUsIDB4MDQsIDB4MWQsIDB4NjgsIDB4NzIsIDB4MGQsIDB4NjcsIDB4ZDAsIDB4ZDUsCi0JMHhiOSwgMHg3NiwgMHhlMCwgMHg0NSwgMHhlZSwgMHg3NywgMHgyMCwgMHhiYiwgMHg1NywgMHhiNCwgMHg3ZSwgMHhhYiwKLQkweDU1LCAweDZiLCAweDg3LCAweDJmLCAweDY1LCAweGM0LCAweDU1LCAweDZkLCAweDllLCAweGQzLCAweGE3LCAweDY2LAotCTB4MTYsIDB4MmIsIDB4YzgsIDB4MDMsIDB4NmQsIDB4OWMsIDB4YWYsIDB4NzksIDB4YmMsIDB4ZDcsIDB4NDksIDB4NDMsCi0JMHg5MywgMHgyYiwgMHg3MywgMHhiYSwgMHhmYywgMHhkMywgMHg5YywgMHgyMSwgMHhmZiwgMHg4YywgMHgzYSwgMHhmNCwKLQkweDlhLCAweDdkLCAweDZhLCAweGU2LCAweGI0LCAweDJkLCAweGY3LCAweDgxLCAweGQ1LCAweGYwLCAweDBlLCAweDRmLAotCTB4NzYsIDB4OWEsIDB4NDIsIDB4NWIsIDB4MWQsIDB4NDgsIDB4ZmYsIDB4OGUsIDB4MjAsIDB4ZmYsIDB4YzEsIDB4OWEsCi0JMHgyYiwgMHg3MywgMHhhNCwgMHhiNSwgMHg3NiwgMHg4ZCwgMHhmNCwgMHgyMiwgMHgxZiwgMHg4MywgMHg1ZCwgMHgwZiwKLQkweDMwLCAweDI3LCAweGUyLCAweDdjLCAweGQ0LCAweGFiLCAweDAzLCAweGQ2LCAweDNlLCAweGM1LCAweDViLCAweDQyLAotCTB4MTYsIDB4ZWIsIDB4OWMsIDB4NmYsIDB4ODIsIDB4YjcsIDB4MmUsIDB4OWMsIDB4MzEsIDB4NTksIDB4NmIsIDB4NTIsCi0JMHhmZSwgMHhiMCwgMHg1YiwgMHhlNSwgMHhhYSwgMHgxYSwgMHhmYiwgMHgwZCwgMHhiNSwgMHhjNywgMHhlZiwgMHhlZiwKLQkweGU3LCAweGRlLCAweDFiLCAweDMyLCAweDk1LCAweDYyLCAweDliLCAweDYzLCAweDU5LCAweGQ0LCAweDljLCAweGM0LAotCTB4OTcsIDB4ZGQsIDB4ZWIsIDB4MGEsIDB4NzksIDB4MGUsIDB4ZGUsIDB4YWYsIDB4MDgsIDB4NjUsIDB4ZGIsIDB4NmQsCi0JMHg1ZCwgMHg5NywgMHhkNywgMHg3ZCwgMHhmNywgMHgwMCwgMHhlNSwgMHg4OSwgMHg3MiwgMHg4YiwgMHgzOSwgMHg5ZiwKLQkweGIxLCAweGQ4LCAweDI4LCAweGNjLCAweGMwLCAweDhlLCAweGJmLCAweDJhLCAweGRmLCAweDZmLCAweDFjLCAweDkyLAotCTB4ZWYsIDB4MzUsIDB4MjYsIDB4ZTUsIDB4Y2YsIDB4MWEsIDB4NWYsIDB4OTYsIDB4M2YsIDB4NmQsIDB4MWMsIDB4OTQsCi0JMHhkNywgMHgxYiwgMHgwNywgMHhlNCwgMHhiNSwgMHhjNiwgMHg4NCwgMHhiYywgMHhkYSwgMHhkOCwgMHgwZiwgMHgxYiwKLQkweDFmLCAweDg3LCAweDhkLCAweDlmLCAweDlhLCAweDk5LCAweGFjLCAweGY3LCAweGNiLCAweGQ0LCAweDQ5LCAweGM0LAotCTB4MjAsIDB4ZTcsIDB4MWIsIDB4YmEsIDB4YmEsIDB4ZTMsIDB4YjMsIDB4ZTksIDB4ZTcsIDB4MmQsIDB4MzIsIDB4YWQsCi0JMHhlZSwgMHhhZiwgMHgzNCwgMHhlNCwgMHg4OSwgMHgyZCwgMHhiYywgMHgyYiwgMHg3YywgMHhjNSwgMHgzMywgMHgyZSwKLQkweDg3LCAweGYxLCAweGU4LCAweGUxLCAweDk0LCAweGI0LCAweDAzLCAweGJmLCAweGNhLCAweDRiLCAweDRkLCAweDllLAotCTB4ZGIsIDB4NjIsIDB4ODYsIDB4ZjcsIDB4OWMsIDB4ODcsIDB4MjQsIDB4YzksIDB4ZmIsIDB4YjAsIDB4OWMsIDB4NjcsCi0JMHhhMCwgMHhkZSwgMHg1ZSwgMHhkNywgMHgyNywgMHg3MywgMHhiNCwgMHg2NSwgMHhlOCwgMHhjNiwgMHg5NSwgMHg0MywKLQkweGIwLCAweDUzLCAweGMzLCAweDdlLCAweGNiLCAweGE1LCAweDFlLCAweDE2LCAweDk3LCAweDI4LCAweGY3LCAweDQ2LAotCTB4NTksIDB4NWMsIDB4YTAsIDB4NmYsIDB4ZmYsIDB4MWIsIDB4NjQsIDB4NmMsIDB4OTcsIDB4ZGEsIDB4ODIsIDB4ODksCi0JMHhiOSwgMHg2ZSwgMHg5OCwgMHhhYiwgMHg2YywgMHhhNywgMHgzZCwgMHgwMCwgMHgxZiwgMHhmMSwgMHg3ZSwgMHgxMCwKLQkweDRlLCAweGFiLCAweDA5LCAweDI3LCAweGYxLCAweDI0LCAweDU0LCAweDBjLCAweDA4LCAweDcwLCAweDViLCAweDUyLAotCTB4NWIsIDB4NGEsIDB4Y2EsIDB4YzIsIDB4NDIsIDB4MGYsIDB4OWUsIDB4OTQsIDB4MmMsIDB4ZDQsIDB4NmQsIDB4M2MsCi0JMHgzOSwgMHgzYywgMHg0MywgMHg3OCwgMHhkMiwgMHhiMCwgMHg1MywgMHhjYSwgMHhjOCwgMHhkOCwgMHgxMiwgMHhjOSwKLQkweDg4LCAweDc4LCAweDVjLCAweGVkLCAweDBkLCAweDZiLCAweDJhLCAweGYyLCAweGEzLCAweDg1LCAweGZjLCAweDc0LAotCTB4ODcsIDB4N2QsIDB4MWQsIDB4NTIsIDB4YWIsIDB4MzgsIDB4MzIsIDB4NTUsIDB4ZmQsIDB4OTQsIDB4M2UsIDB4YTUsCi0JMHg3NCwgMHgwNywgMHhmYywgMHg5NSwgMHgyMSwgMHhiNCwgMHhlZiwgMHgwZiwgMHhkYiwgMHg4ZiwgMHhjYSwgMHhmNCwKLQkweGJjLCAweGM4LCAweGNhLCAweGNiLCAweDAzLCAweDdhLCAweDUxLCAweGI1LCAweGY3LCAweGEyLCAweGFkLCAweGEzLAotCTB4OWQsIDB4MGQsIDB4ZGIsIDB4Y2MsIDB4OGYsIDB4MGUsIDB4ZTAsIDB4NzEsIDB4ZDUsIDB4ZjMsIDB4ZjUsIDB4ZWEsCi0JMHhiOCwgMHgzYywgMHg1NSwgMHhlZCwgMHg3NywgMHg1ZSwgMHg4NywgMHhjZCwgMHhiZCwgMHg2NSwgMHg0NiwgMHhmNywKLQkweGQyLCAweDA0LCAweDI0LCAweDc5LCAweGY2LCAweDU2LCAweDc1LCAweGY3LCAweGYxLCAweDA0LCAweGUyLCAweGFkLAotCTB4OWIsIDB4MzQsIDB4ZTUsIDB4NmYsIDB4NGYsIDB4NjQsIDB4YWQsIDB4YTcsIDB4ZjUsIDB4NWMsIDB4NTIsIDB4ZGEsCi0JMHg3ZCwgMHhmZiwgMHg3MSwgMHgzYiwgMHgzYiwgMHgzYiwgMHhhOSwgMHg3NywgMHhjYSwgMHhkZiwgMHhiZiwgMHg5OCwKLQkweDkxLCAweDg1LCAweGIzLCAweDViLCAweDY1LCAweGExLCAweDA2LCAweDk5LCAweDFhLCAweGJmLCAweDhlLCAweDdkLAotCTB4MzUsIDB4ZTUsIDB4ZWEsIDB4OWUsIDB4NDcsIDB4YjEsIDB4MjcsIDB4OGMsIDB4NWQsIDB4NDksIDB4ZTQsIDB4NmMsCi0JMHgxYiwgMHhjNCwgMHhlYywgMHgyNSwgMHg1ZCwgMHg0OSwgMHg5OCwgMHg4NSwgMHg5YywgMHgxYywgMHg4MSwgMHhkZiwKLQkweDRmLCAweGRiLCAweGI5LCAweDFlLCAweDY5LCAweGM3LCAweDdiLCAweDdkLCAweDA0LCAweDdjLCAweDViLCAweDMyLAotCTB4ZDUsIDB4NmIsIDB4YzksIDB4OTksIDB4YzEsIDB4NjgsIDB4ZmYsIDB4YjYsIDB4NjIsIDB4NmUsIDB4NDYsIDB4MTYsCi0JMHhjZiwgMHg2NiwgMHhmMCwgMHg5YiwgMHg4MywgMHhmZCwgMHhlYywgMHg5NCwgMHg1NywgMHg2YSwgMHhmZCwgMHhiMiwKLQkweDU0LCAweGRiLCAweDJhLCAweDhiLCAweGI1LCAweGU2LCAweDdkLCAweGU4LCAweGVjLCAweDA5LCAweGUyLCAweDFkLAotCTB4ZjEsIDB4ZjQsIDB4NWIsIDB4NTMsIDB4ZmEsIDB4NTYsIDB4NzEsIDB4Y2QsIDB4N2UsIDB4ZWIsIDB4MjksIDB4ZmQsCi0JMHgxZiwgMHhlNCwgMHgzMSwgMHgzMywgMHhhMCwgMHhhOSwgMHgxNywgMHg3ZSwgMHhhNCwgMHhlZSwgMHg4NCwgMHgyNiwKLQkweDc5LCAweGY2LCAweDJhLCAweGJjLCAweDRmLCAweDI2LCAweDQ5LCAweGZiLCAweGY1LCAweGM2LCAweDA3LCAweGQxLAotCTB4NTksIDB4Y2IsIDB4Y2YsIDB4OWQsIDB4NjgsIDB4NTIsIDB4MDYsIDB4ZTIsIDB4ZWMsIDB4YmYsIDB4NzEsIDB4NTIsCi0JMHhlZiwgMHg5NSwgMHhlNSwgMHg2ZCwgMHgwZiwgMHg1OCwgMHg0ZiwgMHhlYSwgMHhhZCwgMHg4OCwgMHgwMSwgMHgzZiwKLQkweDk3LCAweDlmLCAweGVlLCAweGQ5LCAweDI0LCAweDNmLCAweGZjLCAweGNkLCAweGVjLCAweGE5LCAweDZmLCAweDIyLAotCTB4ZDksIDB4YmYsIDB4YjIsIDB4YTcsIDB4ODMsIDB4NzEsIDB4MDEsIDB4ZWYsIDB4ZWMsIDB4Y2YsIDB4ZGUsIDB4NzAsCi0JMHg3NSwgMHhlYSwgMHhlMSwgMHgyZiwgMHhhMCwgMHg4NywgMHhlYywgMHg5YywgMHhiYSwgMHg5YiwgMHg1NiwgMHgzYywKLQkweDkwLCAweDNlLCAweGY1LCAweDUyLCAweDA2LCAweDZmLCAweDE4LCAweGFiLCAweGY3LCAweDAzLCAweDU3LCAweDU5LAotCTB4ZTksIDB4ZjksIDB4MDksIDB4MjcsIDB4N2IsIDB4MDMsIDB4ZTksIDB4YjAsIDB4YmYsIDB4NjgsIDB4ZjcsIDB4YTcsCi0JMHg3NywgMHhlYSwgMHgzYiwgMHg2NCwgMHgzMiwgMHhmZCwgMHg4MCwgMHhmNSwgMHhiNCwgMHg2YywgMHgyMSwgMHhjZSwKLQkweGQ5LCAweDA1LCAweGMxLCAweGRhLCAweDc5LCAweGUyLCAweGZiLCAweDJiLCAweGUwLCAweDBiLCAweDcwLCAweDI4LAotCTB4ZmYsIDB4NTEsIDB4MzgsIDB4NzcsIDB4NTksIDB4NWYsIDB4ZDcsIDB4NzksIDB4YzYsIDB4NjMsIDB4MGMsIDB4NzEsCi0JMHhlMSwgMHhlMiwgMHgxMCwgMHg2NSwgMHg0MCwgMHg4MiwgMHg5NSwgMHhjYSwgMHhhNiwgMHg1ZCwgMHhmZCwgMHhjMywKLQkweGM4LCAweDQ3LCAweGZjLCAweGZkLCAweDU2LCAweDUxLCAweDI3LCAweDBmLCAweGU3LCAweGMwLCAweGNiLCAweDRmLAotCTB4YzAsIDB4N2YsIDB4M2YsIDB4NzAsIDB4YTIsIDB4ZjYsIDB4NDgsIDB4NDcsIDB4NzQsIDB4ZmYsIDB4NGUsIDB4ZDEsCi0JMHg3ZCwgMHhhZCwgMHgyMSwgMHhlNiwgMHgyYSwgMHg1ZCwgMHhmNCwgMHhkNSwgMHg3NSwgMHhjOCwgMHhkZCwgMHgwNywKLQkweDdiLCAweGI1LCAweGYwLCAweGNiLCAweGJkLCAweGU5LCAweDBjLCAweGY3LCAweDk4LCAweGViLCAweDIyLCAweGJhLAotCTB4MTEsIDB4YmYsIDB4NWMsIDB4NzMsIDB4MjcsIDB4MWUsIDB4ZWUsIDB4NzUsIDB4M2UsIDB4ZWEsIDB4ZDQsIDB4MDMsCi0JMHgwOSwgMHg3OSwgMHhmNywgMHg0NCwgMHhiNCwgMHgzNywgMHgwNywgMHg2NCwgMHhiYSwgMHgwYSwgMHhkZCwgMHhlZCwKLQkweGVhLCAweDBmLCAweGZjLCAweDI3LCAweDFkLCAweGYxLCAweDQwLCAweGRlLCAweGZmLCAweDA2LCAweGJjLCAweDA3LAotCTB4YjgsIDB4NWIsIDB4MGIsIDB4Y2QsIDB4YmEsIDB4YzMsIDB4NTgsIDB4M2QsIDB4YTAsIDB4MzEsIDB4YjYsIDB4MGUsCi0JMHg0ZiwgMHg1NywgMHhmNiwgMHg0NCwgMHhiZSwgMHg5OCwgMHg4NCwgMHg1ZiwgMHhlZCwgMHhiNiwgMHg5ZSwgMHgxMCwKLQkweGQ2LCAweDYzLCAweGM0LCAweDliLCAweDk0LCAweDFmLCAweGJlLCAweDBjLCAweDFlLCAweDkyLCAweGY0LCAweDkzLAotCTB4N2YsIDB4NWYsIDB4ZTMsIDB4MjcsIDB4MWMsIDB4ZGIsIDB4MmEsIDB4MzUsIDB4ZDQsIDB4ZDQsIDB4NWUsIDB4ZGUsCi0JMHg5NCwgMHg2OSwgMHgyNSwgMHgwMywgMHhkYSwgMHgzNSwgMHhmYSwgMHg3NywgMHgyOSwgMHhmNCwgMHhlZiwgMHg0NywKLQkweDgwLCAweGEzLCAweDVkLCAweDhjLCAweDQ3LCAweDFmLCAweGM3LCAweDU5LCAweDlkLCAweGNkLCAweDJjLCAweGViLAotCTB4Y2MsIDB4MDMsIDB4NzYsIDB4NGIsIDB4NTEsIDB4ZGQsIDB4NGYsIDB4ZGYsIDB4OGIsIDB4ZWUsIDB4YTIsIDB4ZDgsCi0JMHg5NCwgMHg5NiwgMHg4YiwgMHg5NSwgMHgyOCwgMHgyZSwgMHhhNSwgMHg3MSwgMHg5ZSwgMHhiNCwgMHhjYiwgMHhhNSwKLQkweGI5LCAweDI4LCAweGU2LCAweGI1LCAweGNiLCAweDEyLCAweGYyLCAweDlhLCAweDk1LCAweDk3LCAweDJjLCAweDhjLAotCTB4MjUsIDB4ZTUsIDB4ZTIsIDB4NWMsIDB4MTIsIDB4MzEsIDB4YWIsIDB4NDcsIDB4NTYsIDB4ZTYsIDB4N2EsIDB4MzAsCi0JMHg5NiwgMHhjMiwgMHhiYSwgMHgxNCwgMHhlNiwgMHhkYiwgMHhiMiwgMHg1MiwgMHhiMSwgMHg4MSwgMHgyNywgMHg4NywKLQkweDc2LCAweDBlLCAweGVkLCAweDIxLCAweGI5LCAweGE0LCAweGJlLCAweDE3LCAweDMwLCAweDJmLCAweDE4LCAweDQyLAotCTB4ZGMsIDB4NjIsIDB4NWUsIDB4MzAsIDB4ODIsIDB4MTgsIDB4MzIsIDB4ODEsIDB4MjcsIDB4OGEsIDB4NWQsIDB4YTcsCi0JMHg2NiwgMHhhNiwgMHgyYSwgMHhiYywgMHg3MywgMHg4NCwgMHgwZSwgMHhhYywgMHg1MywgMHgzMywgMHhkMywgMHhiNiwKLQkweDg5LCAweGJhLCAweGVkLCAweDFiLCAweGRhLCAweDU0LCAweDgzLCAweDcyLCAweDQxLCAweGI3LCAweDQzLCAweDFkLAotCTB4YTIsIDB4M2YsIDB4NGEsIDB4OWIsIDB4ZTQsIDB4NzksIDB4NjcsIDB4MjAsIDB4YzYsIDB4NzcsIDB4MDEsIDB4OWYsCi0JMHgyMywgMHhmYSwgMHg2ZiwgMHhkMCwgMHgxNywgMHhhMCwgMHhjMywgMHgyNywgMHhiYSwgMHhlNCwgMHhkMiwgMHhjYiwKLQkweDhjLCAweDM1LCAweGFlLCAweGJjLCAweDdhLCAweDk2LCAweDNhLCAweDJjLCAweGY2LCAweGFjLCAweGVhLCAweDkwLAotCTB4NjMsIDB4MGYsIDB4ZTEsIDB4OGMsIDB4ZDgsIDB4MGYsIDB4N2IsIDB4MzIsIDB4MzMsIDB4ODcsIDB4OTAsIDB4Y2IsCi0JMHg3YywgMHgxYiwgMHhmNiwgMHg1OSwgMHg2NiwgMHhjZCwgMHg5ZCwgMHgwZSwgMHg2YSwgMHg4NCwgMHgyMCwgMHgwNiwKLQkweGEwLCAweGRkLCAweDQ3LCAweDVkLCAweGIxLCAweGRkLCAweDA3LCAweGJiLCAweGUzLCAweDU4LCAweDlmLCAweDFhLAotCTB4NWIsIDB4MDQsIDB4OGUsIDB4NjAsIDB4OGMsIDB4ZWQsIDB4Y2QsIDB4YjIsIDB4YTgsIDB4YzYsIDB4MGUsIDB4YWEsCi0JMHhiMSwgMHhiMiwgMHhiMiwgMHgwZiwgMHg4ZSwgMHgxZCwgMHg1MiwgMHhiMSwgMHhlOSwgMHg3YywgMHgyMywgMHhlYSwKLQkweGRmLCAweDg4LCAweDU4LCAweGMyLCAweDdlLCAweGY2LCAweGU1LCAweDYxLCAweGViLCAweDdiLCAweDcxLCAweGFlLAotCTB4MTUsIDB4NjQsIDB4YTksIDB4ODEsIDB4M2EsIDB4MzAsIDB4ZmYsIDB4N2IsIDB4OTgsIDB4Y2IsIDB4M2QsIDB4YzgsCi0JMHg5ZSwgMHgyYSwgMHhlOSwgMHhlNCwgMHhmMSwgMHgyMCwgMHhjZSwgMHg4MywgMHhmZCwgMHgyMSwgMHhhZCwgMHhiNiwKLQkweDkwLCAweGFmLCAweDAzLCAweDYxLCAweGJiLCAweDI1LCAweGE0LCAweDRkLCAweDNjLCAweDM2LCAweDcwLCAweDFjLAotCTB4YzMsIDB4NWEsIDB4MTcsIDB4MzgsIDB4MTgsIDB4NjMsIDB4MTEsIDB4MjMsIDB4NTIsIDB4MjksIDB4ZTgsIDB4ODIsCi0JMHgzNCwgMHhkYiwgMHhhNCwgMHhhYywgMHhkZSwgMHhmNywgMHhjMywgMHg3NiwgMHhiOSwgMHgxNiwgMHgzYSwgMHhiNCwKLQkweGEyLCAweDc1LCAweGE1LCAweDcwLCAweGNmLCAweDUzLCAweGVhLCAweDljLCAweGQxLCAweDkzLCAweDliLCAweGMzLAotCTB4OWMsIDB4MTAsIDB4N2EsIDB4NDUsIDB4OWMsIDB4ZDUsIDB4OTMsIDB4OGMsIDB4MzcsIDB4ZWYsIDB4ODQsIDB4NzYsCi0JMHhkYSwgMHg4YiwgMHhiZSwgMHg4NywgMHg0NCwgMHhlZiwgMHg2NSwgMHhkZiwgMHg1MSwgMHhlMCwgMHg2MSwgMHhlZCwKLQkweDNjLCAweDBjLCAweDk5LCAweGQ5LCAweGU2LCAweGZhLCAweDZjLCAweGQzLCAweGZhLCAweGM0LCAweDNhLCAweGViLAotCTB4M2IsIDB4OWEsIDB4ZmEsIDB4MzIsIDB4NTIsIDB4OWIsIDB4ZWYsIDB4NTIsIDB4ZjEsIDB4ZjIsIDB4N2MsIDB4MTgsCi0JMHgyZiwgMHgxNywgMHg2YiwgMHg5NCwgMHgwNSwgMHg3ZSwgMHg5NiwgMHg3ZiwgMHg1YiwgMHhlOSwgMHhhMiwgMHg3NiwKLQkweDM2LCAweGIwLCAweGY1LCAweGE1LCAweDkzLCAweDNjLCAweDE3LCAweDU3LCAweGU3LCAweGQ1LCAweGQ0LCAweGJjLAotCTB4ZGYsIDB4MDYsIDB4ZmYsIDB4YmEsIDB4MWMsIDB4NTUsIDB4MzIsIDB4NzAsIDB4M2UsIDB4ZTYsIDB4ZDUsIDB4MDIsCi0JMHhiZiwgMHgzMSwgMHg2YywgMHhjZSwgMHhhMSwgMHg4ZiwgMHg0NCwgMHg2YiwgMHgzOCwgMHhmZiwgMHhlNywgMHhhOCwKLQkweDU1LCAweGJlLCAweGFjLCAweGQ2LCAweGFjLCAweGZhLCAweDBjLCAweGY5LCAweDcxLCAweDQyLCAweDllLCAweDdiLAotCTB4YzAsIDB4NWYsIDB4NjcsIDB4MjgsIDB4NDMsIDB4N2IsIDB4MjgsIDB4MDMsIDB4ZjEsIDB4ZmQsIDB4MjcsIDB4NzAsCi0JMHhiNywgMHg2MSwgMHgxZSwgMHg3OSwgMHhkZCwgMHg4NiwgMHgzZSwgMHhiZSwgMHhmZiwgMHgxNywgMHhmYSwgMHg3NiwKLQkweDIzLCAweGZmLCAweDIzLCAweDZmLCAweDg5LCAweDI2LCAweGRlLCAweGZlLCAweDAzLCAweDYzLCAweDNkLCAweDRhLAotCTB4YjcsIDB4MzUsIDB4ZDQsIDB4MjYsIDB4NTMsIDB4YmMsIDB4ZWYsIDB4NDgsIDB4ZTEsIDB4MWMsIDB4MzgsIDB4YjksCi0JMHg0ZCwgMHhkMSwgMHhhZCwgMHg5ZCwgMHhiZCwgMHg4NiwgMHhmMSwgMHg1ZSwgMHhhYywgMHg4OSwgMHhkYSwgMHhjZCwKLQkweGIyLCAweGU5LCAweDU4LCAweGZiLCAweDUzLCAweDI1LCAweGNmLCAweDYyLCAweGVkLCAweDRlLCAweGYyLCAweDZmLAotCTB4NWIsIDB4MjMsIDB4M2IsIDB4ZTUsIDB4MjYsIDB4NGYsIDB4ZTQsIDB4YTcsIDB4MWYsIDB4NGYsIDB4MmIsIDB4NzIsCi0JMHgyMSwgMHhkOCwgMHg2ZCwgMHhkMiwgMHg5MCwgMHhkMSwgMHg3YywgMHg5YSwgMHhkZiwgMHhmOSwgMHgxMiwgMHhiYywKLQkweDE3LCAweDFkLCAweDE5LCAweGU0LCAweDllLCAweGExLCAweGRkLCAweDYwLCAweDRlLCAweDQ3LCAweDdmLCAweDRiLAotCTB4YzgsIDB4MzEsIDB4ZDQsIDB4MjQsIDB4ZTUsIDB4ODUsIDB4OGMsIDB4NTYsIDB4M2MsIDB4OTksIDB4NDUsIDB4MTYsCi0JMHhhZCwgMHhiZSwgMHhkNSwgMHhjOSwgMHg4YiwgMHg0YiwgMHhiNiwgMHg3YywgMHgxYiwgMHg3ZSwgMHg3YSwgMHhiMiwKLQkweDllLCAweDRkLCAweDdmLCAweDEzLCAweGY5LCAweGMxLCAweDkxLCAweDI1LCAweGU2LCAweDEzLCAweDNkLCAweDI5LAotCTB4NjUsIDB4OWIsIDB4ZjMsIDB4OWEsIDB4NmMsIDB4NjAsIDB4NGMsIDB4OWIsIDB4NDcsIDB4N2UsIDB4NmEsIDB4ZGQsCi0JMHgyZCwgMHg0NywgMHg4MiwgMHg5ZiwgMHg1NywgMHhkNywgMHhjNiwgMHgwYywgMHhjYSwgMHhiMSwgMHgzNiwgMHg2NiwKLQkweDEwLCAweDBmLCAweDYzLCAweGM2LCAweDRlLCAweGVjLCAweDEzLCAweDYzLCAweDA2LCAweGY2LCAweGZmLCAweDI0LAotCTB4NjMsIDB4ODYsIDB4OGQsIDB4NzUsIDB4OGMsIDB4MTksIDB4NzksIDB4NTksIDB4YWMsIDB4MzIsIDB4NjYsIDB4ZWMsCi0JMHg0NSwgMHg5YiwgMHgzMSwgMHhhMywgMHg4MCwgMHg3NiwgMHgxMCwgMHgyZiwgMHgxNiwgMHg1NSwgMHhiYywgMHhjOCwKLQkweDVhLCAweGNiLCAweGMyLCAweDM4LCAweDgxLCAweDNjLCAweGIxLCAweDhhLCAweDNjLCAweGIxLCAweDhhLCAweDNjLAotCTB4YjEsIDB4OGEsIDB4M2MsIDB4YjEsIDB4OGEsIDB4M2MsIDB4MTEsIDB4YjYsIDB4ZmUsIDB4NWEsIDB4MTUsIDB4NzksCi0JMHgyMiwgMHhmYywgMHhlNywgMHgzYywgMHg3MiwgMHg5MiwgMHhhMCwgMHhhNiwgMHgzOCwgMHg4YywgMHg5YSwgMHhjMiwKLQkweGQ1LCAweGM2LCAweGFhLCAweGUzLCAweGRhLCAweGJlLCAweDJhLCAweDZhLCAweDQzLCAweGY1LCAweDlkLCAweDU4LAotCTB4MWYsIDB4ZGEsIDB4ODAsIDB4YmEsIDB4YTgsIDB4ZTYsIDB4NmMsIDB4MDEsIDB4NWYsIDB4ZDcsIDB4ZTAsIDB4MWIsCi0JMHhkNCwgMHhkMywgMHg1NiwgMHg5OSwgMHhjYSwgMHhlZCwgMHg4MCwgMHg3YywgMHhkOCwgMHg3ZiwgMHhmYiwgMHhmYiwKLQkweGU4LCAweDQzLCAweDNlLCAweDlmLCAweDYzLCAweDBkLCAweGMyLCAweDc4LCAweGI1LCAweDBmLCAweDZkLCAweDFkLAotCTB4NmQsIDB4ZWMsIDB4ZTksIDB4MDQsIDB4N2MsIDB4YzQsIDB4N2UsIDB4OTAsIDB4ZjksIDB4NjIsIDB4N2EsIDB4NDEsCi0JMHg5ZSwgMHhkYywgMHgxYywgMHhkOCwgMHhmNCwgMHg2ZiwgMHgzMSwgMHgyNywgMHg1ZSwgMHhkMywgMHhkZSwgMHg4OCwKLQkweDM5LCAweGYwLCAweDE3LCAweGQ4LCAweDk3LCAweDVhLCAweDAzLCAweDVjLCAweGJhLCAweGZkLCAweGU3LCAweGM0LAotCTB4ZDEsIDB4YjcsIDB4ZTEsIDB4ZDYsIDB4MWMsIDB4ZGEsIDB4ZDUsIDB4ZjcsIDB4OWEsIDB4ZmEsIDB4YjIsIDB4OTgsCi0JMHhjZiwgMHhlZiwgMHhlMiwgMHgzYiwgMHhmMCwgMHhmYiwgMHgxNiwgMHg3ZSwgMHg2MSwgMHg3NywgMHhmNiwgMHgwNSwKLQkweGNjLCAweGU5LCAweGMzLCAweGVmLCAweDc3LCAweDlhLCAweGU2LCAweDQyLCAweDBhLCAweGZiLCAweDJmLCAweGQxLAotCTB4NzcsIDB4MzEsIDB4YTQsIDB4YzEsIDB4NmYsIDB4ODksIDB4NWYsIDB4NmEsIDB4ZTIsIDB4ZTMsIDB4MDcsIDB4ZTgsCi0JMHhmYiwgMHg2YiwgMHhmNCwgMHhmOSwgMHhmZSwgMHhkYiwgMHg0ZSwgMHhkNCwgMHgyNywgMHhhNSwgMHg5NiwgMHg3MCwKLQkweGVmLCAweDQ2LCAweGQ1LCAweGRlLCAweDY5LCAweGNhLCAweGU2LCAweDhmLCAweDJjLCAweGU5LCAweGFhLCAweDBlLAotCTB4N2EsIDB4YWUsIDB4OGUsIDB4ZWEsIDB4MDgsIDB4NzEsIDB4YmUsIDB4YmMsIDB4MTAsIDB4ZDQsIDB4YWQsIDB4YzcsCi0JMHg1MSwgMHg3MywgMHgxNiwgMHhhYiwgMHhiNCwgMHg5MSwgMHgxYywgMHhmYSwgMHg2ZCwgMHg5YywgMHg2OSwgMHgzMiwKLQkweDY5LCAweGRjLCAweGFhLCAweDYzLCAweDEzLCAweDg5LCAweGM5LCAweDdhLCAweDliLCAweDQ4LCAweDM3LCAweDY5LAotCTB4MzIsIDB4NGYsIDB4MjIsIDB4OGUsIDB4ZDksIDB4OTksIDB4ZTIsIDB4YzIsIDB4ZWMsIDB4OGMsIDB4MDcsIDB4OWMsCi0JMHg2MywgMHg3NSwgMHhhZSwgMHhlNSwgMHgzYywgMHg5MywgMHhmNywgMHg2MywgMHg0ZCwgMHg3NCwgMHg2OSwgMHgxMywKLQkweDYwLCAweDA2LCAweGY0LCAweDllLCAweGFiLCAweDkzLCAweDdlLCAweDQwLCAweGIzLCAweGFjLCAweDY4LCAweGRhLAotCTB4ZTgsIDB4OGYsIDB4ZWEsIDB4YzcsIDB4MWMsIDB4NmEsIDB4NWQsIDB4OTksIDB4NjQsIDB4ZWQsIDB4NWMsIDB4MGMsCi0JMHg2OSwgMHhiYSwgMHg3NSwgMHg0OSwgMHgyNCwgMHgwYSwgMHhjZCwgMHhmOCwgMHg4MiwgMHg4YywgMHhmMywgMHhiOSwKLQkweGZhLCAweGVjLCAweDhjLCAweGZlLCAweDQyLCAweDM2LCAweGM3LCAweDNiLCAweDExLCAweGQ3LCAweDlhLCAweDlkLAotCTB4NjksIDB4MWQsIDB4NDgsIDB4YzgsIDB4OGYsIDB4OTEsIDB4YmIsIDB4MWQsIDB4NTMsIDB4MzQsIDB4NjYsIDB4NjcsCi0JMHg4YywgMHgxNywgMHgwMiwgMHg1YiwgMHgwYywgMHhlOCwgMHhlMCwgMHgzYywgMHhjOSwgMHhiNywgMHg0MywgMHg0ZSwKLQkweGQyLCAweDYyLCAweDRkLCAweDFkLCAweDhjLCAweDRmLCAweGFhLCAweDdhLCAweGQxLCAweDk0LCAweDJiLCAweDE1LAotCTB4NDUsIDB4M2IsIDB4YWMsIDB4ZGIsIDB4YzksIDB4YzMsIDB4ZWMsIDB4OGMsIDB4ZmMsIDB4ZDEsIDB4MmQsIDB4MWUsCi0JMHhkNiwgMHg5MSwgMHg4NywgMHg3OCwgMHg0OSwgMHgyNywgMHhkMCwgMHg1YiwgMHhjMCwgMHg3ZiwgMHgxMiwgMHhmNSwKLQkweDdiLCAweDU0LCAweGFiLCAweGZiLCAweGZlLCAweDhhLCAweDkzLCAweDQzLCAweDVjLCAweGUwLCAweDNlLCAweGI2LAotCTB4YTgsIDB4M2MsIDB4ZDcsIDB4NzMsIDB4MzIsIDB4YmMsIDB4ZWYsIDB4OWIsIDB4ZTMsIDB4ZGYsIDB4MzksIDB4NzgsCi0JMHhmOSwgMHgwMSwgMHhkNCwgMHg0ZCwgMHhiYywgMHgxYiwgMHhhNCwgMHg3ZiwgMHhlMSwgMHhmNywgMHgzNiwgMHhmZiwKLQkweGUyLCAweDdjLCAweGY2LCAweDkzLCAweGU3LCAweDgxLCAweGY0LCAweDU1LCAweGYwLCAweGU3LCAweGU1LCAweGQxLAotCTB4ODcsIDB4NTgsIDB4NTEsIDB4NmMsIDB4NDQsIDB4YjgsIDB4NzgsIDB4YzcsIDB4Y2UsIDB4MzksIDB4MmEsIDB4ZmYsCi0JMHg2ZSwgMHhmMiwgMHhkMSwgMHg5NiwgMHhmMCwgMHhkYywgMHhhNSwgMHg4ZSwgMHhjOCwgMHgyNywgMHhmOSwgMHhlOSwKLQkweDg0LCAweDRkLCAweDkwLCAweDE3LCAweGNlLCAweDhmLCAweGVlLCAweDI1LCAweGQ4LCAweGZlLCAweGI4LCAweDM2LAotCTB4MTIsIDB4ZGQsIDB4YTksIDB4N2QsIDB4OWMsIDB4M2QsIDB4OGYsIDB4NzQsIDB4NzYsIDB4MzcsIDB4N2UsIDB4ODgsCi0JMHg4MywgMHhiNCwgMHgyMywgMHhiZSwgMHgyMiwgMHg5ZSwgMHg4OCwgMHg4ZiwgMHhmYywgMHg0NCwgMHhiYywgMHgyOCwKLQkweDFiLCAweDVkLCAweDk3LCAweDlmLCAweDYwLCAweDVkLCAweGMwLCAweDRmLCAweDY5LCAweDIxLCAweDBkLCAweDlkLAotCTB4OTAsIDB4YTcsIDB4MTEsIDB4NmQsIDB4YTQsIDB4YmEsIDB4ZGUsIDB4MWQsIDB4YzcsIDB4MGYsIDB4NWMsIDB4YzYsCi0JMHhkNSwgMHhiMSwgMHgwNiwgMHhlZiwgMHhhMSwgMHg0OCwgMHg5NywgMHg3ZiwgMHgzYiwgMHhiMiwgMHhhNCwgMHg4ZCwKLQkweDM0LCAweGY4LCAweDlkLCAweGE5LCAweGFlLCAweGI5LCAweDhkLCAweDg4LCAweGRlLCAweDVhLCAweDlkLCAweDQ2LAotCTB4YmYsIDB4YmMsIDB4MmIsIDB4ZmYsIDB4MGMsIDB4ZjYsIDB4YTksIDB4M2IsIDB4ZjgsIDB4YmIsIDB4MTQsIDB4NTUsCi0JMHg0NywgMHhiMSwgMHg2ZiwgMHhiOSwgMHhkNSwgMHg3MywgMHhhMiwgMHhiZiwgMHhkMywgMHhkOSwgMHgxZiwgMHhlNiwKLQkweDQzLCAweDUxLCAweDZkLCAweDFjLCAweGQ1LCAweDU5LCAweGVhLCAweDllLCAweDdkLCAweGFmLCAweGU3LCAweDY4LAotCTB4YzgsIDB4NGYsIDB4OTksIDB4MzMsIDB4MDUsIDB4M2EsIDB4MDgsIDB4ZjEsIDB4ZGUsIDB4OTEsIDB4Y2YsIDB4OTEsCi0JMHgyNiwgMHgzZSwgMHg0NywgMHhjMSwgMHhlNywgMHgzZSwgMHhmMCwgMHgzOSwgMHg3NiwgMHg4YiwgMHhjZiwgMHg1YiwKLQkweGI2LCAweDk3LCAweDI5LCAweGMzLCAweGY2LCAweDQ2LCAweGQ2LCAweGI1LCAweGJkLCAweDU1LCAweDNhLCAweGFiLAotCTB4NzMsIDB4ODMsIDB4ZmIsIDB4OWEsIDB4OTEsIDB4ODYsIDB4MmYsIDB4YzcsIDB4OWQsIDB4OGYsIDB4NTMsIDB4MzcsCi0JMHhiNywgMHhjYiwgMHg5OSwgMHg4NSwgMHhiYiwgMHhkNSwgMHhiNywgMHgxMSwgMHhhZiwgMHgyYSwgMHg3NywgMHg5NCwKLQkweDRiLCAweGY1LCAweDgwLCAweDlmLCAweDFmLCAweDJmLCAweGIxLCAweDNkLCAweDEyLCAweGVhLCAweDhhLCAweDNhLAotCTB4Y2IsIDB4M2EsIDB4MjUsIDB4YjksIDB4MWIsIDB4MmYsIDB4YmYsIDB4ZjgsIDB4OWMsIDB4NzYsIDB4YTUsIDB4MTIsCi0JMHg5ZCwgMHg0ZiwgMHg1YSwgMHg3OCwgMHhjNiwgMHhhZSwgMHhlNSwgMHgyOSwgMHhmYSwgMHg2ZSwgMHgzMiwgMHg2NiwKLQkweDQ1LCAweGY3LCAweDY3LCAweDIyLCAweGZjLCAweGZlLCAweGMwLCAweGVmLCAweDc1LCAweDZiLCAweGJmLCAweDEzLAotCTB4ZjAsIDB4N2MsIDB4OGEsIDB4NzgsIDB4ZDcsIDB4NTMsIDB4M2MsIDB4OWYsIDB4YzYsIDB4OWMsIDB4NjYsIDB4MTksCi0JMHg1YywgMHhkOCwgMHhhNCwgMHg5ZSwgMHhlNCwgMHg5OCwgMHhlNywgMHhkMCwgMHgyZiwgMHg0YywgMHhkMCwgMHgwYywKLQkweGVlLCAweGRkLCAweDZhLCAweDRiLCAweGJlLCAweDVjLCAweDc0LCAweDM2LCAweDA2LCAweGU3LCAweDI4LCAweDY0LAotCTB4YmEsIDB4NmMsIDB4ZjEsIDB4ZmUsIDB4MGEsIDB4MzEsIDB4OGMsIDB4NjcsIDB4ODMsIDB4YjIsIDB4YjUsIDB4MTYsCi0JMHhmNSwgMHg1YywgMHgzOSwgMHhkMCwgMHgwZSwgMHgxZCwgMHhiMywgMHhkZCwgMHhkNiwgMHhjYiwgMHhmYiwgMHgwYSwKLQkweGNhLCAweGJjLCAweGEwLCAweGY2LCAweDIxLCAweGQyLCAweDcxLCAweGY0LCAweDdkLCAweGFlLCAweDU1LCAweDk2LAotCTB4YzMsIDB4YmIsIDB4YWQsIDB4YzUsIDB4OGEsIDB4ZWYsIDB4YmYsIDB4ODMsIDB4M2MsIDB4ZmMsIDB4MzQsIDB4NzQsCi0JMHg1ZiwgMHhhZSwgMHhmZiwgMHhjYywgMHg1ZiwgMHg0ZSwgMHhmMSwgMHg2ZiwgMHhhNSwgMHgyMiwgMHg5YiwgMHhkOCwKLQkweGQxLCAweGNiLCAweDdiLCAweDIwLCAweGY4LCAweDk2LCAweDFjLCAweGFmLCAweDg3LCAweDY1LCAweGJmLCAweDcwLAotCTB4OWMsIDB4N2QsIDB4ZmYsIDB4MGQsIDB4YmUsIDB4N2QsIDB4ZmYsIDB4ZjQsIDB4YWEsIDB4OWQsIDB4MDIsIDB4ZmUsCi0JMHgxNywgMHgzMywgMHhlMSwgMHg5YiwgMHhkZCwgMHg5MCwgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCTB4MWYsIDB4OGIsIDB4MDgsIDB4MDgsIDB4Y2IsIDB4YTMsIDB4NDYsIDB4NDUsIDB4MDAsIDB4MDMsIDB4NzQsIDB4NjUsCisJMHg3MywgMHg3NCwgMHgzMSwgMHgyZSwgMHg2MiwgMHg2OSwgMHg2ZSwgMHgwMCwgMHhlYywgMHg1YywgMHg2ZiwgMHg2YywKKwkweDFjLCAweGM3LCAweDc1LCAweDdmLCAweDNiLCAweGJiLCAweGE0LCAweDRlLCAweGQ0LCAweDkxLCAweDVjLCAweDFlLAorCTB4NGYsIDB4ZjQsIDB4NDksIDB4NjYsIDB4OTQsIDB4NWQsIDB4NzEsIDB4MjUsIDB4NWUsIDB4MmQsIDB4YzYsIDB4NWQsCisJMHgzMSwgMHg1NywgMHg5YiwgMHgwOCwgMHhjZSwgMHhmMSwgMHg3OSwgMHhlZiwgMHg2NCwgMHhiMSwgMHg4NiwgMHgwYSwKKwkweDUxLCAweDBkLCAweDFkLCAweDFiLCAweDg1LCAweDZiLCAweGIwLCAweDQ3LCAweDM5LCAweGFlLCAweGRiLCAweDdlLAorCTB4OTAsIDB4NjUsIDB4MWIsIDB4MzAsIDB4ZGEsIDB4MTAsIDB4YmUsIDB4MWMsIDB4ZTksIDB4NDYsIDB4NzUsIDB4MmYsCisJMHhkYywgMHg4YiwgMHhjNCwgMHg5OCwgMHgwNiwgMHhmYSwgMHgwNywgMHg1NywgMHg5MiwgMHhmYSwgMHg4MywgMHhlMCwKKwkweGEwLCAweDkzLCAweGUyLCAweDI2LCAweGY1LCAweDE3LCAweDU3LCAweDg0LCAweDJhLCAweGM3LCAweGY5LCAweGUwLAorCTB4MDIsIDB4NGUsIDB4NjMsIDB4MjAsIDB4MDYsIDB4ZWEsIDB4MTYsIDB4YWEsIDB4ZWMsIDB4ZDgsIDB4NDYsIDB4ODEsCisJMHhhMiwgMHg0MiwgMHgxYywgMHhkOCwgMHg0NiwgMHhmYywgMHg2NywgMHhmYiwgMHg3YiwgMHgzMywgMHhiYiwgMHhkNCwKKwkweDkxLCAweDk2LCAweDZkLCAweGEwLCAweDFmLCAweGZhLCAweGE1LCAweDNiLCAweGMwLCAweDYxLCAweDY3LCAweDY2LAorCTB4ZTcsIDB4YmQsIDB4NzksIDB4ZjMsIDB4ZmUsIDB4YmYsIDB4NTksIDB4NGEsIDB4N2YsIDB4OTAsIDB4YTQsIDB4MmUsCisJMHgwYSwgMHg1YiwgMHgzNywgMHg3ZSwgMHhkNiwgMHg5MSwgMHhjNywgMHg4ZiwgMHhkZSwgMHgzYywgMHg3NiwgMHhmMywKKwkweDI4LCAweGQxLCAweDk3LCAweDQ3LCAweGY1LCAweDFiLCAweDEyLCAweDIyLCAweDlhLCAweDhmLCAweDViLCAweGRjLAorCTB4ZTIsIDB4MTYsIDB4YjcsIDB4YjgsIDB4YzUsIDB4MmQsIDB4NmUsIDB4NzEsIDB4OGIsIDB4NWIsIDB4ZGMsIDB4ZTIsCisJMHgxNiwgMHhiNywgMHhiOCwgMHhjNSwgMHgyZCwgMHg2ZSwgMHg3MSwgMHg4YiwgMHg1YiwgMHhkYywgMHhlMiwgMHgxNiwKKwkweGI3LCAweGI4LCAweGM1LCAweDJkLCAweDZlLCAweDcxLCAweDhiLCAweDViLCAweGRjLCAweGUyLCAweDE2LCAweGI3LAorCTB4YjgsIDB4YzUsIDB4MmQsIDB4NmUsIDB4NzEsIDB4OGIsIDB4NWIsIDB4ZGMsIDB4ZTIsIDB4MTYsIDB4YjcsIDB4YjgsCisJMHhjNSwgMHgyZCwgMHg2ZSwgMHg3MSwgMHg4YiwgMHg1YiwgMHhkYywgMHhlMiwgMHgxNiwgMHhiNywgMHhiOCwgMHhjNSwKKwkweDJkLCAweDZlLCAweDcxLCAweGZiLCAweGZmLCAweGRlLCAweDc0LCAweDIyLCAweDkzLCAweDlmLCAweGRkLCAweGUxLAorCTB4OGYsIDB4MTIsIDB4MjIsIDB4YmYsIDB4ZmEsIDB4OTAsIDB4ZTcsIDB4NTAsIDB4NDIsIDB4Y2YsIDB4YmYsIDB4MzQsCisJMHgzMywgMHhlZCwgMHgxMCwgMHgxNSwgMHg5YSwgMHg3YiwgMHhhYywgMHgyMiwgMHg3ZCwgMHgxNCwgMHg1NCwgMHhkMiwKKwkweDA2LCAweGYxLCAweGZjLCAweDE3LCAweGYyLCAweDFmLCAweDNlLCAweGYxLCAweGZjLCAweGFkLCAweGY2LCAweGQ1LAorCTB4ODYsIDB4NGUsIDB4MDksIDB4MzMsIDB4M2YsIDB4YjcsIDB4ZDcsIDB4ZGMsIDB4NGQsIDB4ODksIDB4NDEsIDB4YzAsCisJMHhmYywgMHhmNSwgMHhmMCwgMHg3ZiwgMHhmNCwgMHg1MCwgMHgwZiwgMHg1ZCwgMHhjMywgMHhlMywgMHgyNCwgMHhlOCwKKwkweGIyLCAweGZlLCAweDljLCAweGU2LCAweGI1LCAweDgyLCAweGUwLCAweGE0LCAweDFiLCAweDA0LCAweDNmLCAweGM2LAorCTB4ZWYsIDB4MmQsIDB4MTcsIDB4NjMsIDB4ZmYsIDB4ZTMsIDB4YTAsIDB4NjAsIDB4ZTgsIDB4MjQsIDB4OWMsIDB4YmYsCisJMHhkNCwgMHhiYywgMHhlNSwgMHgyZSwgMHhhYSwgMHgyZSwgMHgxYSwgMHgzNCwgMHhlYiwgMHhhNywgMHhlOSwgMHg5OCwKKwkweDVmLCAweGQxLCAweDRhLCAweGFkLCAweDlhLCAweGI2LCAweGVmLCAweGY0LCAweGJjLCAweDc2LCAweGU3LCAweGU5LAorCTB4NjMsIDB4ZGEsIDB4ZmUsIDB4ZDMsIDB4NzUsIDB4Y2QsIDB4M2IsIDB4NGQsIDB4MTUsIDB4YjEsIDB4MzcsIDB4NDksCisJMHgwNSwgMHhmMywgMHg4YywgMHg1NiwgMHg2YywgMHgwZCwgMHg2OCwgMHhkZSwgMHg4OSwgMHgwZiwgMHhjOSwgMHg3MywKKwkweDZkLCAweGYzLCAweGY3LCAweGM4LCAweDI4LCAweDgwLCAweDE2LCAweGYyLCAweDZhLCAweDQxLCAweGUwLCAweGI5LAorCTB4MDYsIDB4MTUsIDB4ZDIsIDB4NDEsIDB4MjAsIDB4ZjIsIDB4YzEsIDB4MTMsIDB4NWUsIDB4Y2UsIDB4MzEsIDB4ODUsCisJMHg5NiwgMHhhNiwgMHg2YSwgMHg2YiwgMHgwMCwgMHg3OCwgMHg5MywgMHg1YSwgMHg3MSwgMHhkMSwgMHhkMCwgMHg0YSwKKwkweDdlLCAweDcwLCAweGMxLCAweDczLCAweDY5LCAweDUwLCAweGE3LCAweDIwLCAweDk4LCAweDczLCAweDc3LCAweDY1LAorCTB4MGUsIDB4ZDMsIDB4MjksIDB4ZTAsIDB4NmQsIDB4MDIsIDB4MWYsIDB4OTksIDB4MjIsIDB4Y2YsIDB4ZjQsIDB4MzEsCisJMHg5ZCwgMHg0YywgMHg3MiwgMHg0NSwgMHgyYiwgMHgwZSwgMHg0NywgMHhmNCwgMHg5MSwgMHhjNSwgMHhmNCwgMHg5NywKKwkweDU3LCAweDA0LCAweGU4LCAweGRjLCAweDQyLCAweGU1LCAweDg2LCAweDQ5LCAweDUzLCAweDJiLCAweDFiLCAweGQ3LAorCTB4NWYsIDB4MGUsIDB4OWUsIDB4MWYsIDB4MzYsIDB4ZTksIDB4NWMsIDB4Y2IsIDB4YWUsIDB4NTQsIDB4MjgsIDB4NDEsCisJMHg3MywgMHhiZSwgMHg0NSwgMHgyMiwgMHg0ZiwgMHgwNSwgMHgyZiwgMHgzNywgMHg0OCwgMHgxNywgMHg1YSwgMHgxOSwKKwkweGZhLCAweDQxLCAweGNiLCAweGM5LCAweDU0LCAweDY5LCAweDEzLCAweDk1LCAweGQzLCAweDY5LCAweDNhLCAweGRmLAorCTB4NGEsIDB4ZTMsIDB4OGMsIDB4YzEsIDB4MDUsIDB4ZTEsIDB4MzgsIDB4NjYsIDB4MTUsIDB4NmIsIDB4YWIsIDB4YWQsCisJMHg5NywgMHhmOCwgMHhkZiwgMHhiZiwgMHg5OCwgMHhkMywgMHgzOSwgMHgwOSwgMHg1MywgMHgwMSwgMHhkZCwgMHhlMSwKKwkweDVhLCAweDNlLCAweDg3LCAweDVjLCAweDJiLCAweGNmLCAweGEyLCAweGQ2LCAweDUyLCAweDY1LCAweDNhLCAweDg3LAorCTB4YjksIDB4ZDYsIDB4MWQsIDB4NmIsIDB4ZmMsIDB4MmQsIDB4YTQsIDB4ZjksIDB4NjksIDB4NTIsIDB4ZDUsIDB4ZWYsCisJMHgwMCwgMHg2ZiwgMHhiOCwgMHgzZiwgMHg4OCwgMHhiMywgMHhlZSwgMHhkMCwgMHhiYywgMHhjNSwgMHg3ZiwgMHg2NSwKKwkweGJjLCAweDY5LCAweDQxLCAweDNiLCAweDMwLCAweDFlLCAweGM0LCAweDk4LCAweGZiLCAweGJiLCAweDMyLCAweDY1LAorCTB4MDIsIDB4OGYsIDB4NWIsIDB4NDksIDB4OGMsIDB4OTksIDB4Y2UsIDB4MjAsIDB4ZDgsIDB4ZWYsIDB4OTIsIDB4NTksCisJMHg3NSwgMHg3YiwgMHgwMSwgMHg2YiwgMHg1MSwgMHhkNSwgMHhlZCwgMHgwMSwgMHhiZSwgMHgwZSwgMHhlYSwgMHg3MywKKwkweGY4LCAweDdjLCAweGJjLCAweGU3LCAweDY2LCAweGNjLCAweDA3LCAweGRkLCAweDdhLCAweDNlLCAweDA4LCAweGE2LAorCTB4NzMsIDB4ZDQsIDB4YTMsIDB4ZTYsIDB4ZjYsIDB4NDgsIDB4MWMsIDB4NTMsIDB4MTMsIDB4MWEsIDB4ZDYsIDB4YmQsCisJMHhjMywgMHg3YiwgMHgyNCwgMHg1MiwgMHg3OSwgMHhlZSwgMHhmMywgMHgzMywgMHg0NywgMHhkZSwgMHhmYywgMHg4ZSwKKwkweDkwLCAweGE2LCAweDBjLCAweDY4LCAweGJhLCAweDMxLCAweGVjLCAweDQzLCAweDBlLCAweDNlLCAweGY4LCAweGUxLAorCTB4ZGUsIDB4ODAsIDB4YjEsIDB4ZjYsIDB4NDUsIDB4ZTAsIDB4YzksIDB4NTYsIDB4ODksIDB4ZjcsIDB4ZTgsIDB4YTcsCisJMHhhNSwgMHgzNCwgMHg4OSwgMHgyYiwgMHg2ZSwgMHg1ZiwgMHhiOCwgMHhhZSwgMHgwNywgMHhiNCwgMHg0NiwgMHhmYSwKKwkweDMwLCAweDQwLCAweDczLCAweDhiLCAweGNjLCAweGYzLCAweDFhLCAweDY0LCAweDI0LCAweDY4LCAweGU3LCAweDJkLAorCTB4MTUsIDB4YWQsIDB4ZDAsIDB4M2EsIDB4ODYsIDB4YmUsIDB4NDEsIDB4ZDMsIDB4NGUsIDB4NzAsIDB4NjEsIDB4Y2UsCisJMHg5ZCwgMHhkNywgMHg4YSwgMHhhNywgMHg0ZiwgMHg2OSwgMHhhNSwgMHhkMywgMHhjZiwgMHg2OSwgMHhmYiwgMHg1YSwKKwkweDJmLCAweDc2LCAweDUzLCAweDk3LCAweDhkLCAweGQzLCAweDI3LCAweGU4LCAweDQ5LCAweDVmLCAweDIzLCAweGE2LAorCTB4NzMsIDB4MDksIDB4M2MsIDB4MmMsIDB4OTgsIDB4MTUsIDB4MzIsIDB4OWMsIDB4MWUsIDB4ZWQsIDB4NGUsIDB4ZTAsCisJMHhlOSwgMHg3MCwgMHhmZSwgMHgyYywgMHg0OSwgMHgzZCwgMHgzYSwgMHg2ZCwgMHg3MiwgMHhhMiwgMHhiNSwgMHg2OSwKKwkweGZhLCAweDczLCAweGQwLCAweDc0LCAweGQxLCAweGRkLCAweGNhLCAweDdjLCAweGViLCAweDU1LCAweDMwLCAweGE5LAorCTB4OTAsIDB4MGUsIDB4ZDYsIDB4MmYsIDB4OTYsIDB4OWYsIDB4NmQsIDB4N2EsIDB4YmEsIDB4YTAsIDB4ZDIsIDB4YzIsCisJMHg1ZiwgMHhmNCwgMHg1NywgMHg0NywgMHhiNiwgMHhmMCwgMHgzYSwgMHhkOCwgMHhjMiwgMHhkNSwgMHg4NywgMHhhNiwKKwkweDFkLCAweGFmLCAweGNmLCAweGEwLCAweDhhLCAweDI5LCAweGM4LCAweDM2LCAweDhiLCAweGY0LCAweDQ1LCAweDlhLAorCTB4NzMsIDB4ODksIDB4OGEsIDB4MzUsIDB4ZWMsIDB4ZWIsIDB4MTgsIDB4ZTAsIDB4OGYsIDB4MDMsIDB4ZmUsIDB4ZWMsCisJMHhhYSwgMHhlOCwgMHhlMiwgMHgxZSwgMHhhMCwgMHhhOSwgMHg2OCwgMHg0NiwgMHhjOCwgMHhjYiwgMHgyNSwgMHhiYSwKKwkweDRiLCAweGMyLCAweDhiLCAweGJjLCAweDBiLCAweDVkLCAweGVkLCAweGUyLCAweDNlLCAweGY2LCAweDRlLCAweGM4LAorCTB4YmQsIDB4ZjUsIDB4YmMsIDB4OTMsIDB4NTksIDB4MjYsIDB4ZDIsIDB4NDQsIDB4N2UsIDB4MGYsIDB4ZjAsIDB4YjEsCisJMHgwZSwgMHhmMywgMHhiYSwgMHg3OSwgMHhkMCwgMHhjOSwgMHhmNCwgMHg3MywgMHhkZiwgMHgwMSwgMHg0YywgMHgwMiwKKwkweGZhLCAweGRlLCAweGRkLCAweDQ2LCAweDJiLCAweGU4LCAweDQ5LCAweDMzLCAweGJmLCAweDk5LCAweDdmLCAweGYyLAorCTB4YWMsIDB4ZGEsIDB4YjUsIDB4YjMsIDB4N2UsIDB4MTAsIDB4MGMsIDB4OGYsIDB4MWEsIDB4ZjQsIDB4NjMsIDB4NzksCisJMHg2NiwgMHhiNiwgMHgzNywgMHg1ZSwgMHg5NywgMHgwZSwgMHhmNSwgMHgyMywgMHgwMSwgMHg5ZCwgMHgyMiwgMHhhZCwKKwkweGVjLCAweDlhLCAweDZiLCAweGI4LCAweGNhLCAweDQ0LCAweDQyLCAweGNmLCAweDI3LCAweGE5LCAweDI4LCAweGU5LAorCTB4MWIsIDB4YzMsIDB4NWUsIDB4NmMsIDB4ODcsIDB4YjAsIDB4MjcsIDB4ODcsIDB4Y2YsIDB4YzIsIDB4NzMsIDB4NzksCisJMHhkOCwgMHhiYiwgMHhjZCwgMHg3ZCwgMHgyYSwgMHhkNywgMHhkOSwgMHhmNiwgMHg5OSwgMHhiNiwgMHg1NSwgMHg1YiwKKwkweGZlLCAweGQzLCAweDJjLCAweDg5LCAweDRmLCAweDBjLCAweGU4LCAweGQ0LCAweDRiLCAweDEzLCAweGVlLCAweDg3LAorCTB4ODEsIDB4ZDgsIDB4OGQsIDB4ZjcsIDB4MjMsIDB4MTksIDB4ZDAsIDB4NjYsIDB4NWIsIDB4YjAsIDB4Y2EsIDB4OTQsCisJMHg0ZSwgMHgxYSwgMHhlOCwgMHhkZSwgMHg5MywgMHgzMSwgMHhjOSwgMHhjMSwgMHhkOSwgMHhjMCwgMHhkZiwgMHg4OSwKKwkweDU1LCAweDMwLCAweGZmLCAweGQzLCAweGU4LCAweDU0LCAweDc4LCAweDQxLCAweDY2LCAweGMxLCAweDAzLCAweDhkLAorCTB4OWUsIDB4ZmIsIDB4NjUsIDB4YzksIDB4MzMsIDB4MTMsIDB4ZTcsIDB4ZDcsIDB4ZTcsIDB4OTksIDB4YmYsIDB4NWQsCisJMHhiMCwgMHgwYiwgMHg4ZCwgMHhjYSwgMHgyZSwgMHhlMywgMHg4ZSwgMHg3MCwgMHgwOCwgMHgxYSwgMHhiZSwgMHhhNSwKKwkweDFkLCAweDQ3LCAweDI0LCAweDVmLCAweGQ2LCAweDVkLCAweDgzLCAweDQ2LCAweDQ3LCAweDc5LCAweDJkLCAweGFmLAorCTB4ZTMsIDB4ZjUsIDB4ZjYsIDB4OTgsIDB4MjUsIDB4M2UsIDB4MDgsIDB4ZjYsIDB4YWUsIDB4ZGIsIDB4ZDMsIDB4MjEsCisJMHgzMSwgMHgwZiwgMHg5YSwgMHg5NSwgMHgyYywgMHhjMCwgMHhjMywgMHhjZiwgMHg1YiwgMHhjYiwgMHg3MiwgMHhkOCwKKwkweGM4LCAweDZmLCAweDVlLCAweGRiLCAweGJlLCAweDBlLCAweGZhLCAweDNjLCAweGMwLCAweDM0LCAweDljLCAweDRjLAorCTB4MmEsIDB4M2IsIDB4OGQsIDB4NjgsIDB4OGEsIDB4NjQsIDB4YTksIDB4ODUsIDB4MzgsIDB4M2UsIDB4ZWIsIDB4MWMsCisJMHhiYywgMHgxZSwgMHhmZSwgMHhjMywgMHg4NywgMHhmZiwgMHg4MCwgMHg0ZiwgMHgzYywgMHhlZiwgMHhjMywgMHhiZiwKKwkweGY4LCAweGVjLCAweDZmLCAweDJjLCAweDdhLCAweDdlLCAweDE4LCAweGZlLCAweGYxLCAweDlhLCAweDdmLCAweDQyLAorCTB4MWIsIDB4NDcsIDB4NWYsIDB4OTAsIDB4MGUsIDB4ZmYsIDB4MzQsIDB4ZGIsIDB4MTAsIDB4YjAsIDB4NzMsIDB4ZjgsCisJMHg4YSwgMHgxNSwgMHg5ZSwgMHg4MywgMHg1ZiwgMHg1OCwgMHgyOSwgMHhlMSwgMHhlOSwgMHg1MCwgMHhiNSwgMHhjOSwKKwkweDdhLCAweDE4LCAweGY5LCAweDYxLCAweGY2LCAweDU3LCAweDE5LCAweGY4LCAweDI2LCAweGY2LCAweDQ3LCAweGVjLAorCTB4YjcsIDB4NzgsIDB4NmQsIDB4MTAsIDB4OTQsIDB4NWMsIDB4ODYsIDB4MGQsIDB4MjAsIDB4NDcsIDB4YjYsIDB4YmIsCisJMHgyNCwgMHg4OSwgMHg1NCwgMHg0NSwgMHgzYiwgMHgzNCwgMHgwYywgMHg3YiwgMHhiYywgMHg4OSwgMHg3ZCwgMHgwYiwKKwkweGRiLCAweGU1LCAweDhkLCAweDQ0LCAweDlkLCAweGJjLCAweGRmLCAweGFmLCAweGJiLCAweGQ1LCAweGJmLCAweGQ5LAorCTB4ZGIsIDB4ODQsIDB4MzUsIDB4ZjIsIDB4ZDksIDB4YTMsIDB4YzYsIDB4NjYsIDB4ZTgsIDB4OTcsIDB4ZjgsIDB4YmQsCisJMHg2ZCwgMHgxNSwgMHg2OCwgMHg1NywgMHgzOCwgMHhlNiwgMHhmZSwgMHgxYSwgMHhiZCwgMHhhZSwgMHhiOCwgMHgyNSwKKwkweDQxLCAweDNiLCAweDRmLCAweDI5LCAweDdmLCAweGJhLCAweDczLCAweDA5LCAweDlhLCAweDcxLCAweDRhLCAweGQxLAorCTB4YjgsIDB4ZjMsIDB4NmMsIDB4ZTQsIDB4NTcsIDB4OTMsIDB4YzAsIDB4MDcsIDB4ZmEsIDB4ZmMsIDB4YjUsIDB4MTgsCisJMHg4MiwgMHhmNiwgMHg5ZSwgMHgwNiwgMHhkMywgMHhjMiwgMHhkYywgMHg0NiwgMHg1ZSwgMHhiMCwgMHgyZiwgMHg2NywKKwkweGZiLCAweDM0LCAweGRiLCAweGVkLCAweDczLCAweDJmLCAweGVjLCAweGQzLCAweGVkLCAweDI0LCAweGRiLCAweGZkLAorCTB4MjcsIDB4ZDgsIDB4ZTcsIDB4YjcsIDB4NWQsIDB4MGQsIDB4YmMsIDB4MjEsIDB4YmEsIDB4NTQsIDB4Y2IsIDB4YzAsCisJMHgzZiwgMHgxOCwgMHg5OSwgMHhkNywgMHg2OSwgMHg5NywgMHgzNSwgMHgwYiwgMHhiZCwgMHgzYywgMHhjOSwgMHg3MywKKwkweDRkLCAweGNjLCAweDQ5LCAweDNmLCAweGFlLCAweGZjLCAweGM3LCAweDY1LCAweGZkLCAweGJiLCAweGEwLCAweDJiLAorCTB4MDgsIDB4NjYsIDB4ODEsIDB4YjMsIDB4M2MsIDB4YTIsIDB4ODcsIDB4YjYsIDB4MTgsIDB4Y2QsIDB4NWYsIDB4NDUsCisJMHgzYywgMHhmNCwgMHg3ZSwgMHg0MywgMHhhNywgMHg0YSwgMHhiNiwgMHg4MywgMHhlYywgMHhlYywgMHgxMiwgMHg3MCwKKwkweDRmLCAweGJiLCAweGNhLCAweGVlLCAweGQ5LCAweDM2LCAweDk2LCAweDgxLCAweDdmLCAweGNlLCAweDFmLCAweDg2LAorCTB4NWYsIDB4NjAsIDB4YmIsIDB4MDEsIDB4NWQsIDB4YzAsIDB4YmYsIDB4MGMsIDB4ZmMsIDB4NzMsIDB4YWQsIDB4MGUsCisJMHhmYSwgMHg5NiwgMHgxMSwgMHhjNSwgMHhkOSwgMHhlOCwgMHgzYywgMHhkYiwgMHhiMCwgMHgyYywgMHhkYSwgMHhmNywKKwkweDA4LCAweGRkLCAweGU1LCAweGE3LCAweGUwLCAweDczLCAweGQ4LCAweDI3LCAweDU3LCAweGIzLCAweGIwLCAweDJiLAorCTB4YWQsIDB4ZWEsIDB4ZjIsIDB4ZGUsIDB4M2EsIDB4MmQsIDB4YWYsIDB4YWQsIDB4YTEsIDB4NDIsIDB4NTUsIDB4ZDksCisJMHg2YywgMHhjMSwgMHgxYiwgMHhhZSwgMHg2NCwgMHg3NCwgMHhlOSwgMHg3YiwgMHg4OCwgMHhlZSwgMHg4NCwgMHhhZCwKKwkweDJlLCAweDNiLCAweDNjLCAweGU2LCAweDc5LCAweDM1LCAweDM3LCAweDVlLCAweDFiLCAweGQwLCAweDhhLCAweGVjLAorCTB4YmYsIDB4ODYsIDB4M2YsIDB4MDQsIDB4N2QsIDB4NmEsIDB4ZWUsIDB4YjcsIDB4NmIsIDB4MGYsIDB4YjEsIDB4OGMsCisJMHg3MCwgMHgxNiwgMHhiMiwgMHhhYSwgMHhlZSwgMHg3ZiwgMHgwNiwgMHhkMCwgMHhkZiwgMHg3NSwgMHgzMCwgMHhkNywKKwkweGM3LCAweDYzLCAweDhmLCAweDJiLCAweDlkLCAweDI1LCAweDZkLCAweGJmLCAweDIzLCAweDA2LCAweDNhLCAweDQzLAorCTB4OWYsIDB4YjcsIDB4MWYsIDB4OTMsIDB4ZmIsIDB4NmEsIDB4ZDUsIDB4ZmUsIDB4NGUsIDB4ZmEsIDB4NTAsIDB4ZTcsCisJMHgxOCwgMHg3YywgMHg4NSwgMHhjOCwgMHhmMCwgMHg2YSwgMHhiYiwgMHhjMSwgMHg4ZiwgMHg2YSwgMHg1ZiwgMHhkYiwKKwkweDVjLCAweGEyLCAweDU0LCAweDBiLCAweGU4LCAweGEyLCAweGFiLCAweDYwLCAweDMwLCAweDRlLCAweDE2LCAweDZiLAorCTB4NjIsIDB4MjAsIDB4NDEsIDB4NmIsIDB4NjMsIDB4OTMsIDB4NjEsIDB4NTYsIDB4NjgsIDB4NzcsIDB4NzYsIDB4OTksCisJMHgyNCwgMHg2YywgMHg3ZiwgMHhlMiwgMHgxYSwgMHg2YywgMHhiYSwgMHg1NCwgMHhhYiwgMHhmNiwgMHhiNSwgMHg4ZCwKKwkweDMzLCAweDQ1LCAweGUwLCAweDEyLCAweDdiLCAweGQ3LCAweDYwLCAweDA3LCAweGFmLCAweGMxLCAweDZlLCAweDI1LAorCTB4YWIsIDB4OGYsIDB4ZTEsIDB4YzUsIDB4YzAsIDB4ZTYsIDB4NmIsIDB4YjgsIDB4YWQsIDB4OTAsIDB4OWUsIDB4ZmUsCisJMHhjZCwgMHhkNywgMHg3MCwgMHgzOCwgMHg4YywgMHhiMywgMHg2ZCwgMHg5YywgMHg2NSwgMHg5YywgMHgzYiwgMHhhZiwKKwkweGUxLCAweDFjLCAweDU5LCAweDRmLCAweGNmLCAweDExLCAweDgyLCAweDBmLCAweDRhLCAweDc0LCAweGU2LCAweDY5LAorCTB4ZWYsIDB4YTUsIDB4ZGEsIDB4ZDAsIDB4YzQsIDB4NWQsIDB4ODQsIDB4ZjgsIDB4MzgsIDB4YjIsIDB4MjksIDB4ZjQsCisJMHhlMSwgMHhjNiwgMHg1ZSwgMHgwZiwgMHhiYywgMHgzMiwgMHg4OCwgMHg3ZCwgMHhhMiwgMHg0NiwgMHg1NSwgMHhjOCwKKwkweGY5LCAweDhmLCAweDlhLCAweGI0LCAweGY3LCAweDYyLCAweGQzLCAweDA4LCAweDc1LCAweDg5LCAweDc1LCAweGUyLAorCTB4NmQsIDB4ZDgsIDB4NTgsIDB4NzIsIDB4Y2EsIDB4NDAsIDB4MGMsIDB4YmYsIDB4MjAsIDB4NmQsIDB4OGMsIDB4MjYsCisJMHhhYSwgMHgzNSwgMHhhYSwgMHg2YywgMHhjZiwgMHgzZiwgMHgxMSwgMHg0MCwgMHgxNywgMHhhNywgMHhlMCwgMHhkMywKKwkweGMwLCAweGUzLCAweGU0LCAweDk4LCAweDk3LCAweGMzLCAweDdjLCAweDkzLCAweDZkLCAweDBiLCAweDdlLCAweDA1LAorCTB4YjAsIDB4ZDAsIDB4YjUsIDB4ODQsIDB4M2UsIDB4YmYsIDB4ZWIsIDB4NTUsIDB4NGYsIDB4ZTcsIDB4N2QsIDB4MmMsCisJMHhlNCwgMHg1YywgMHg4OSwgMHg4NCwgMHg5OCwgMHhiZiwgMHgxYSwgMHhiMCwgMHg5ZSwgMHg0ZCwgMHg4ZiwgMHg1YywKKwkweDQ1LCAweDhlLCAweDYzLCAweDkyLCAweDM3LCAweDA2LCAweGZmLCAweDAxLCAweDdkLCAweDlmLCAweDZkLCAweDExLAorCTB4NzIsIDB4ODIsIDB4M2YsIDB4ZWQsIDB4NTUsIDB4MzYsIDB4ZjYsIDB4OWQsIDB4YWQsIDB4ZWEsIDB4NDksIDB4MDYsCisJMHhmYiwgMHhmMiwgMHhlOSwgMHgxYywgMHhlNywgMHgwZiwgMHg5ZCwgMHgwOSwgMHgyZiwgMHgzNywgMHhiZSwgMHg0ZCwKKwkweDNmLCAweDdiLCAweDYwLCAweDliLCAweDM4LCAweDViLCAweGQ5LCAweDI2LCAweDEwLCAweDAzLCAweDYwLCAweDUzLAorCTB4YzIsIDB4Y2IsIDB4YTEsIDB4N2YsIDB4MzYsIDB4YjIsIDB4YTEsIDB4MGMsIDB4NmMsIDB4ODgsIDB4NjksIDB4NjUsCisJMHgzYSwgMHg3ZiwgMHgwNCwgMHg3YiwgMHg5NSwgMHhiNCwgMHhkMiwgMHg4NCwgMHgwZiwgMHg5YSwgMHg0NiwgMHgzZiwKKwkweDgyLCAweDllLCAweGUwLCAweDJjLCAweGYwLCAweDgxLCAweDA1LCAweDcwLCAweDQ5LCAweDhjLCAweGZlLCAweDJhLAorCTB4YjQsIDB4NjcsIDB4ZWUsIDB4YmYsIDB4MWIsIDB4YTgsIDB4NzgsIDB4NzIsIDB4MzAsIDB4ZGMsIDB4ZmYsIDB4MTcsCisJMHhhMSwgMHgwZiwgMHg4OCwgMHg3MCwgMHgzMSwgMHg5ZSwgMHhhYywgMHgzNiwgMHg4MSwgMHg1YywgMHg2OCwgMHhhMiwKKwkweDY1LCAweDY4LCAweGVjLCAweGNmLCAweDhiLCAweDNlLCAweGU3LCAweDMwLCAweDljLCAweGJmLCAweDNjLCAweDFlLAorCTB4ZmEsIDB4NDUsIDB4Y2UsIDB4NWIsIDB4OTIsIDB4MjEsIDB4NGYsIDB4NzMsIDB4NTEsIDB4NWMsIDB4OTQsIDB4ZjYsCisJMHg4NiwgMHgxOCwgMHg2NSwgMHg5NSwgMHg1ZCwgMHg5OSwgMHhkMywgMHg2OCwgMHhkMywgMHhiOSwgMHgyNCwgMHhkNiwKKwkweDYxLCAweGFlLCAweDg1LCAweDczLCAweGMzLCAweDJmLCAweDIxLCAweDBmLCAweGUyLCAweGRjLCAweDE0LCAweGViLAorCTB4M2IsIDB4NDMsIDB4OWIsIDB4YmYsIDB4NDQsIDB4NjUsIDB4ZjgsIDB4NTQsIDB4YzMsIDB4ZTEsIDB4ZjcsIDB4NWUsCisJMHgyZiwgMHg3NSwgMHg2MSwgMHhkYywgMHhjNCwgMHg1ZSwgMHhmMCwgMHgxMywgMHhiYSwgMHhlNCwgMHgzMywgMHg2MiwKKwkweDQxLCAweGZhLCAweDA2LCAweGNlLCAweGFmLCAweGIwLCAweGQ2LCAweGMyLCAweDVhLCAweGY2LCAweGJiLCAweGJjLAorCTB4ZjYsIDB4M2MsIDB4ZTgsIDB4YzAsIDB4YjgsIDB4YzksIDB4MzAsIDB4ZWMsIDB4YTMsIDB4ODIsIDB4ZjcsIDB4YmMsCisJMHhkYywgMHgxZSwgMHg3MywgMHg4MiwgMHgxMiwgMHgyMSwgMHg1ZSwgMHhhYiwgMHgwZCwgMHhlZiwgMHhjNiwgMHhiNSwKKwkweDljLCAweGQzLCAweDA0LCAweDE3LCAweDc0LCAweDg3LCAweGYxLCAweDQ3LCAweDc5LCAweDE4LCAweGQxLCAweGY0LAorCTB4MDksIDB4ZTQsIDB4NzEsIDB4NGUsIDB4MDcsIDB4ZTIsIDB4MTQsIDB4OGYsIDB4ODYsIDB4NGMsIDB4NzUsIDB4Y2UsCisJMHgwOCwgMHhlNiwgMHg4MSwgMHhmZSwgMHhmNSwgMHhlMywgMHhiYiwgMHg1MywgMHhkNywgMHhmYywgMHgyMywgMHg1YiwKKwkweDE3LCAweDE1LCAweDEwLCAweDFmLCAweGMwLCAweDI3LCAweDZiLCAweDhhLCAweDczLCAweGJmLCAweDYyLCAweDUzLAorCTB4YTIsIDB4YzQsIDB4ZGMsIDB4MTgsIDB4N2MsIDB4YTIsIDB4Y2EsIDB4YTMsIDB4MmUsIDB4ZjgsIDB4MWIsIDB4ZTUsCisJMHg2NiwgMHg4MiwgMHhkNywgMHgwNSwgMHhmMCwgMHhkNywgMHg4MiwgMHhmZSwgMHg4YywgMHgwMywgMHg5NiwgMHg4ZSwKKwkweDAwLCAweDA3LCAweGM3LCAweDZhLCAweDU3LCAweGU0LCAweDUzLCAweDU0LCAweDM2LCAweDM5LCAweGE3LCAweGU4LAorCTB4NjQsIDB4ZmEsIDB4MGEsIDB4NmMsIDB4ZmIsIDB4MjIsIDB4YmYsIDB4MTksIDB4NzMsIDB4ZGMsIDB4N2YsIDB4YWMsCisJMHg1NywgMHhjOSwgMHhhYiwgMHg5YiwgMHhjNywgMHgxMywgMHgyMiwgMHhkZiwgMHhiYiwgMHg2MSwgMHhmZSwgMHg5ZiwKKwkweGJiLCAweDE1LCAweDZkLCAweDcyLCAweDhjLCAweGY5LCAweDdmLCAweGRiLCAweDMwLCAweGZlLCAweGUzLCAweGQ0LAorCTB4ZmEsIDB4ZjEsIDB4ZGQsIDB4ZGIsIDB4NDIsIDB4ZmQsIDB4NDMsIDB4ZmYsIDB4ZjEsIDB4OTAsIDB4NWUsIDB4ZDAsCisJMHhiNiwgMHg0NiwgMHg2YiwgMHg5NCwgMHgyYiwgMHg1MywgMHg1ZCwgMHgyMCwgMHg1ZiwgMHhmNCwgMHg3MiwgMHhiYiwKKwkweGFjLCAweDJhLCAweDZjLCAweGFhLCAweGQ0LCAweDAyLCAweGRkLCAweDZiLCAweDcxLCAweDZjLCAweDZkLCAweDRkLAorCTB4ZTUsIDB4ZGEsIDB4MWEsIDB4ZTUsIDB4ZTcsIDB4NGIsIDB4YWQsIDB4MDAsIDB4NzksIDB4NTYsIDB4N2IsIDB4Y2MsCisJMHhjYiwgMHhhMiwgMHg1ZiwgMHhjMSwgMHgzZSwgMHgwNSwgMHg5YSwgMHhmNiwgMHgyZiwgMHgxNiwgMHg4NCwgMHg3MywKKwkweDRjLCAweGU2LCAweDg5LCAweGMyLCAweDc5LCAweDRhLCAweDJiLCAweDJkLCAweDczLCAweGZlLCAweDA4LCAweDViLAorCTB4NzIsIDB4NjQsIDB4ZGQsIDB4ODAsIDB4OTgsIDB4NzIsIDB4NWMsIDB4MmIsIDB4OWMsIDB4NWUsIDB4NDAsIDB4ZmUsCisJMHhiOCwgMHg4MiwgMHhkZiwgMHgxOSwgMHhmYywgMHg5YSwgMHhmOCwgMHg0NSwgMHhmOSwgMHhmYiwgMHgzMywgMHhjOCwKKwkweGZmLCAweGE1LCAweDdmLCAweDQ1LCAweDJjLCAweDUwLCAweGZiLCAweGZmLCAweDYyLCAweDA1LCAweDNhLCAweGI2LAorCTB4OTAsIDB4YTYsIDB4NmYsIDB4M2IsIDB4YTIsIDB4NWYsIDB4MjgsIDB4OWYsIDB4NTIsIDB4NDAsIDB4ZGUsIDB4NmIsCisJMHhiZSwgMHg0ZCwgMHhiZiwgMHgxMywgMHhlNiwgMHg1MCwgMHg0NCwgMHhhZiwgMHhkNywgMHhjMSwgMHhjNywgMHg5MSwKKwkweGZkLCAweGExLCAweGJlLCAweDY2LCAweDFmLCAweGY0LCAweGE0LCAweGVmLCAweDBjLCAweDczLCAweDI0LCAweGU0LAorCTB4NmEsIDB4MDUsIDB4YjksIDB4ZWEsIDB4ZmIsIDB4ZTAsIDB4OGQsIDB4NDYsIDB4NmYsIDB4NDEsIDB4N2YsIDB4NWUsCisJMHhhZiwgMHg3NywgMHg4MSwgMHgxZSwgMHg4NywgMHhjYSwgMHg5MywgMHhmNiwgMHgxOCwgMHg2OSwgMHg0MywgMHhlNiwKKwkweDI2LCAweGFkLCAweDBiLCAweDM2LCAweDBjLCAweGZiLCAweDk2LCAweDYzLCAweDRhLCAweDc0LCAweGU0LCAweGNmLAorCTB4Y2QsIDB4MmMsIDB4ZDUsIDB4MDQsIDB4ZDYsIDB4MjIsIDB4ZWYsIDB4YzksIDB4YTEsIDB4MGYsIDB4ZDksIDB4NWYsCisJMHhhOSwgMHgzMywgMHg5YywgMHhhMCwgMHgzNywgMHhlYSwgMHgzYSwgMHhiZCwgMHg4OSwgMHhiYywgMHhlYiwgMHgyZCwKKwkweGU3LCAweGRjLCAweDBjLCAweDYyLCAweGQ2LCAweDAwLCAweGUyLCAweDAzLCAweDZhLCAweDk4LCAweDVkLCAweGVjLAorCTB4YTMsIDB4NzcsIDB4MWEsIDB4NzgsIDB4OTYsIDB4ZjAsIDB4YmIsIDB4MTMsIDB4NzksIDB4ZTMsIDB4ZjUsIDB4NjEsCisJMHgzZSwgMHg2ZCwgMHgzZCwgMHhkMywgMHg5NiwgMHgwMCwgMHgwYywgMHhhZiwgMHgzNywgMHg0MCwgMHg1YiwgMHgwZiwKKwkweGU0LCAweDZmLCAweDliLCAweDUzLCAweGY0LCAweGNiLCAweDVlLCAweDk5LCAweGFiLCAweDY4LCAweDNjLCAweGFmLAorCTB4ZmMsIDB4ZDIsIDB4MjcsIDB4ZTcsIDB4OTksIDB4Y2YsIDB4M2EsIDB4NzQsIDB4OWMsIDB4YzcsIDB4ZmMsIDB4OGUsCisJMHhmZCwgMHgyNywgMHhlMywgMHhiMywgMHhjNywgMHgwYSwgMHgzOCwgMHhjYywgMHg5NSwgMHhiYSwgMHhlYSwgMHg0NywKKwkweDczLCAweGE0LCAweDQ1LCAweDMxLCAweDhjLCAweGZkLCAweDYyLCAweDg5LCAweDBhLCAweDkyLCAweGVmLCAweDEzLAorCTB4MjQsIDB4NjUsIDB4YjAsIDB4NGUsIDB4OWUsIDB4OTQsIDB4MzAsIDB4ZjIsIDB4ZjUsIDB4OTksIDB4MzksIDB4ODcsCisJMHhlNSwgMHgwYSwgMHhmZiwgMHg1NiwgMHg4YiwgMHhlNCwgMHhjYSwgMHgzMiwgMHhlYSwgMHhhNCwgMHg2YSwgMHhmZCwKKwkweDI5LCAweGM4LCAweDU1LCAweDg0LCAweGY1LCAweDAxLCAweGVjLCAweDdiLCAweDgxLCAweGU1LCAweDhiLCAweGJhLAorCTB4YjEsIDB4OGUsIDB4YmMsIDB4YTcsIDB4NGUsIDB4MjksIDB4NTUsIDB4ZGYsIDB4MWMsIDB4NDcsIDB4NWQsIDB4MDAsCisJMHhmOSwgMHhkNSwgMHgxNiwgMHg4MCwgMHgwMywgMHgzNiwgMHg1YSwgMHg1YiwgMHhjMSwgMHgxMywgMHhiNSwgMHg0OCwKKwkweGVkLCAweDBjLCAweDllLCAweDgzLCAweDc4LCAweDM2LCAweDU5LCAweDM3LCAweGMzLCAweDNjLCAweGUzLCAweDEzLAorCTB4ZjQsIDB4YzAsIDB4OWUsIDB4NGEsIDB4NmMsIDB4NGYsIDB4ZjQsIDB4OGYsIDB4YWQsIDB4M2MsIDB4ZmQsIDB4NDMsCisJMHg2YiwgMHg4YywgMHg3ZSwgMHhkNCwgMHhjYSwgMHhkMSwgMHgwZiwgMHg1YiwgMHgyZSwgMHhmZCwgMHg3ZCwgMHg2YiwKKwkweDg0LCAweDllLCAweDZkLCAweDY1LCAweGI5LCAweDk2LCAweDQzLCAweGNlLCAweDY0LCAweDcxLCAweGNlLCAweDQ0LAorCTB4MGYsIDB4ZmEsIDB4YjcsIDB4YzMsIDB4ZGUsIDB4NTksIDB4ZmUsIDB4ZTcsIDB4NjYsIDB4MGEsIDB4Y2QsIDB4MjEsCisJMHgyYSwgMHg5ZiwgMHg4MCwgMHg2ZiwgMHg3NiwgMHg2ZiwgMHhlMywgMHgxYSwgMHg5NCwgMHgxZSwgMHg3MywgMHhiOSwKKwkweDg2LCAweGU4LCAweGUwLCAweGY3LCAweGE4LCAweDIzLCAweGUwLCAweGJiLCAweGUxLCAweGNiLCAweGE2LCAweGQyLAorCTB4ZjYsIDB4MzksIDB4NGYsIDB4MWYsIDB4MDgsIDB4N2QsIDB4YzAsIDB4NWQsIDB4MjksIDB4ZWEsIDB4YzIsIDB4NWUsCisJMHhmMCwgMHg3ZiwgMHgxNywgMHg5ZiwgMHg4NiwgMHgwZCwgMHhjOCwgMHgxYSwgMHgyOCwgMHgwMSwgMHg1ZiwgMHhjMywKKwkweDc5LCAweDgwLCAweGMxLCAweDc2LCAweGNjLCAweGY1LCAweDg3LCAweGU1LCAweGU5LCAweDVjLCAweDE3LCAweGIyLAorCTB4M2QsIDB4ZWIsIDB4MDgsIDB4MWEsIDB4MGMsIDB4MzcsIDB4NjksIDB4YjIsIDB4ZGMsIDB4MGMsIDB4ODcsIDB4N2QsCisJMHg2YSwgMHgyMSwgMHhmNCwgMHg2ZiwgMHg4OSwgMHg1MCwgMHgyZiwgMHg0ZCwgMHhjYywgMHgzZiwgMHgxNSwgMHhmYSwKKwkweGUzLCAweDhkLCAweGZiLCAweDIwLCAweDU2LCAweDIwLCAweDk3LCAweDU0LCAweGViLCAweDE4LCAweDU2LCAweDBiLAorCTB4NjEsIDB4ZmIsIDB4YzMsIDB4YjksIDB4MjQsIDB4ZjgsIDB4ZWQsIDB4NTIsIDB4ZDksIDB4N2YsIDB4NDMsIDB4ZTMsCisJMHgxYywgMHg1YiwgMHgzOCwgMHhjYywgMHhmZiwgMHgxMSwgMHg4YywgMHgyZiwgMHg4NywgMHhlMywgMHhhZiwgMHhkMCwKKwkweGY0LCAweDIyLCAweDgxLCAweGQ2LCAweGQ3LCAweGI0LCAweGEyLCAweDFjLCAweDhmLCAweDYxLCAweDJjLCAweDMwLAorCTB4ZDYsIDB4YjksIDB4NmUsIDB4ZTAsIDB4MGMsIDB4MjMsIDB4YzUsIDB4YmEsIDB4MmUsIDB4OWMsIDB4NzEsIDB4ZjAsCisJMHg3MSwgMHgxMiwgMHhiZiwgMHg4MiwgMHhmYywgMHgzZCwgMHhlMiwgMHgwZiwgMHgxNSwgMHhkZSwgMHg0MSwgMHhiYywKKwkweGQwLCAweDNhLCAweGEyLCAweGRjLCAweDY3LCAweDNiLCAweDZhLCAweGNmLCAweDIwLCAweDM4LCAweDg0LCAweDVhLAorCTB4ZGQsIDB4NGEsIDB4MTksIDB4ZjQsIDB4MmYsIDB4ZjMsIDB4YjYsIDB4NzksIDB4NDgsIDB4Y2MsIDB4ZTEsIDB4NGMsCisJMHg0MSwgMHgzMCwgMHhlMSwgMHhkOCwgMHg5NSwgMHg4MiwgMHhlOCwgMHhhNiwgMHg5ZiwgMHgxZiwgMHhlNywgMHhiOCwKKwkweDViLCAweDlmLCAweDc5LCAweDAxLCAweGJhLCAweGQ3LCAweDU4LCAweGU5LCAweGE0LCAweDQ2LCAweGMzLCAweGEwLAorCTB4MmIsIDB4YTMsIDB4NDMsIDB4YTAsIDB4ZDMsIDB4YTQsIDB4NDYsIDB4MzMsIDB4ODUsIDB4NWMsIDB4NmUsIDB4MzMsCisJMHhhMSwgMHgzYywgMHg5NCwgMHgwZSwgMHg0MywgMHhjZiwgMHg2NywgMHhhNSwgMHg4ZiwgMHhmNiwgMHgxYywgMHgzYywKKwkweDliLCAweDFmLCAweGY0LCAweGFlLCAweDNmLCAweDczLCAweDA5LCAweGY0LCAweGY3LCAweGEwLCAweDBhLCAweGQ5LAorCTB4MmUsIDB4ZTUsIDB4NWMsIDB4ZjYsIDB4ODcsIDB4NGMsIDB4NGYsIDB4MjAsIDB4NmUsIDB4MTksIDB4NDMsIDB4ZTYsCisJMHg3ZSwgMHhmMSwgMHhhYiwgMHhlMCwgMHgwZSwgMHg4MywgMHg2NSwgMHhmNywgMHhhYSwgMHhhYywgMHg3NywgMHg2NCwKKwkweDljLCAweGMzLCAweDdlLCAweDRiLCAweDJiLCAweGFmLCAweDgxLCAweDE2LCAweDkzLCAweDllLCAweDZkLCAweDZlLAorCTB4MGYsIDB4YzcsIDB4OTYsIDB4ZTQsIDB4YzUsIDB4YjMsIDB4Y2QsIDB4MmUsIDB4ZmEsIDB4NjEsIDB4NjMsIDB4MGIsCisJMHgyZCwgMHgzNywgMHhmOCwgMHg3ZCwgMHgyNywgMHgyZCwgMHgzNSwgMHg4NiwgMHhhZSwgMHgxZSwgMHgxNSwgMHgwMywKKwkweGI0LCAweDdhLCAweGUzLCAweDRkLCAweGU2LCAweDU3LCAweDA1LCAweGYyLCAweDgyLCAweGM5LCAweDhmLCAweGU5LAorCTB4YmQsIDB4ZDEsIDB4NWUsIDB4ZmEsIDB4ZTksIDB4M2QsIDB4NzYsIDB4ZmQsIDB4N2UsIDB4MDEsIDB4MWIsIDB4MTgsCisJMHg0ZCwgMHhiMiwgMHg2ZCwgMHhhMywgMHhjZiwgMHhmMywgMHhmNiwgMHg1NSwgMHg0YiwgMHhiMCwgMHg2ZSwgMHhmZiwKKwkweDA0LCAweDNjLCAweGI1LCAweDhmLCAweDI5LCAweDNiLCAweDYwLCAweGRjLCAweDhjLCAweDE3LCAweGJhLCAweGUxLAorCTB4YmMsIDB4MDgsIDB4OWMsIDB4NzgsIDB4ZDcsIDB4MWMsIDB4MDIsIDB4YWUsIDB4MTcsIDB4MjUsIDB4MmYsIDB4MGUsCisJMHhiOSwgMHhmNiwgMHg1NSwgMHg0MiwgMHgwZSwgMHg3OSwgMHhjNSwgMHgxOSwgMHhjYSwgMHgwYSwgMHhiMSwgMHg5ZCwKKwkweDFhLCAweDk5LCAweDliLCAweGNjLCAweGYzLCAweGYwLCAweGZmLCAweGE4LCAweGFiLCAweDJhLCAweDk3LCAweGE5LAorCTB4M2UsIDB4NzMsIDB4YzksIDB4NjEsIDB4ZmQsIDB4NjcsIDB4YmYsIDB4ZjEsIDB4MTIsIDB4ZjIsIDB4NGUsIDB4OTMsCisJMHg0ZSwgMHgzNCwgMHhkOSwgMHg1ZiwgMHgzMiwgMHgyZSwgMHhjZSwgMHhmZCwgMHg3NywgMHg5YiwgMHg1ZiwgMHgxMywKKwkweDljLCAweDIzLCAweGUwLCAweDFkLCAweGU2LCAweGY1LCAweDJmLCAweGIxLCAweDljLCAweDNiLCAweDE4LCAweDM2LAorCTB4NmIsIDB4ODksIDB4NjAsIDB4MDMsIDB4OGYsIDB4ODYsIDB4Y2MsIDB4NWQsIDB4ODIsIDB4ZjcsIDB4ZmIsIDB4NmYsCisJMHhlYywgMHhmYiwgMHgyZSwgMHg2OCwgMHgxZCwgMHgwMiwgMHgyYywgMHhlMiwgMHg2NSwgMHhhNiwgMHg3ZCwgMHg4ZiwKKwkweDU3LCAweGU0LCAweDFlLCAweGM3LCAweDliLCAweGM4LCAweGYzLCAweGQ2LCAweGY2LCAweGMwLCAweDVjLCAweDUzLAorCTB4ZTAsIDB4OWMsIDB4ODYsIDB4OTQsIDB4Y2IsIDB4OTUsIDB4NTEsIDB4ZTYsIDB4ZWYsIDB4NmQsIDB4N2QsIDB4OWMsCisJMHg2MywgMHhlYSwgMHhmOSwgMHhiZiwgMHgwOSwgMHhhMiwgMHg1YSwgMHhmMywgMHg5NSwgMHhmOSwgMHg0OSwgMHhmOCwKKwkweGU3LCAweDIwLCAweGE4LCAweGVlLCAweDFlLCAweDUyLCAweDcxLCAweDY4LCAweDkwLCAweGRmLCAweDFmLCAweDkwLAorCTB4YjIsIDB4YTgsIDB4OGEsIDB4NGUsIDB4YmEsIDB4YzMsIDB4YjAsIDB4MDAsIDB4Y2IsIDB4NzMsIDB4MmYsIDB4ODcsCisJMHg3MiwgMHg4NCwgMHgxMSwgMHg3NSwgMHhhMSwgMHhkZiwgMHg4YywgMHhmNCwgMHgzMiwgMHgwNSwgMHgxZCwgMHhkYiwKKwkweDYzLCAweDFlLCAweDBhLCAweDYzLCAweDMyLCAweGM3LCAweGI0LCAweDlmLCAweDQyLCAweGU3LCAweGFjLCAweDE0LAorCTB4ZWIsIDB4NGQsIDB4YWEsIDB4ZWYsIDB4OWEsIDB4ZGUsIDB4ZjAsIDB4YmIsIDB4ZmEsIDB4OGMsIDB4MDcsIDB4ZGEsCisJMHg4YSwgMHgwYiwgMHg5ZCwgMHg1NCwgMHhhYSwgMHgyNywgMHg5MCwgMHgwMywgMHgxOSwgMHgzNCwgMHg5NywgMHhjMywKKwkweDE4LCAweDNhLCAweDU0LCAweDZhLCAweGIwLCAweGNlLCAweDU3LCAweDQyLCAweDlkLCAweDRmLCAweDg2LCAweGI4LAorCTB4NGYsIDB4ODIsIDB4MTcsIDB4YjYsIDB4YjUsIDB4MmEsIDB4YjgsIDB4NzYsIDB4ZGEsIDB4MjYsIDB4ZWIsIDB4NWYsCisJMHgxZCwgMHhiNiwgMHg1YywgMHhhZSwgMHg3MSwgMHhlZCwgMHg4OSwgMHhmYywgMHhkYiwgMHgzYywgMHgzNywgMHgzMywKKwkweGVkLCAweDE4LCAweGEwLCAweDZiLCAweDQ0LCAweDJiLCAweGI3LCAweDFjLCAweGFkLCAweGVjLCAweDMzLCAweDdkLAorCTB4YmIsIDB4NDEsIDB4YjcsIDB4MjYsIDB4NmIsIDB4ZGMsIDB4YTUsIDB4ZDYsIDB4N2IsIDB4YzEsIDB4ZDIsIDB4ZWUsCisJMHg0ZCwgMHhlOCwgMHg0MywgMHhlNywgMHgyNywgMHg1OCwgMHhhZSwgMHg1ZiwgMHg2MCwgMHhiYSwgMHhhYywgMHg4MiwKKwkweDYwLCAweDNlLCAweGE3LCAweGU5LCAweGQ0LCAweGYwLCAweGRmLCAweGY1LCAweDcyLCAweDNlLCAweDc1LCAweDdhLAorCTB4OTgsIDB4ZjEsIDB4ODMsIDB4OGUsIDB4NzQsIDB4OWEsIDB4OTYsIDB4N2QsIDB4ZGUsIDB4YTMsIDB4M2UsIDB4YzMsCisJMHgzYywgMHgyYywgMHgyZiwgMHg5OCwgMHhmNCwgMHg4OCwgMHg5NCwgMHhkYiwgMHg2YiwgMHhkMiwgMHhhNiwgMHhjYiwKKwkweDJiLCAweGIwLCAweGE1LCAweGQ0LCAweDkwLCAweDc5LCAweDk0LCAweGVjLCAweGFiLCAweDE3LCAweDc1LCAweGJiLAorCTB4M2UsIDB4MDUsIDB4N2IsIDB4NWUsIDB4NWEsIDB4ZDQsIDB4NjksIDB4YTcsIDB4YWMsIDB4YjEsIDB4NTgsIDB4MzYsCisJMHhmNiwgMHgzMSwgMHg1OCwgMHg3YywgMHg3OCwgMHhmNiwgMHg0MywgMHg2ZCwgMHg2NywgMHhlZiwgMHhhMSwgMHg0YiwKKwkweDRmLCAweGZmLCAweDE2LCAweDdjLCAweDBkLCAweGYzLCAweGQ1LCAweGIwLCAweDBlLCAweDIzLCAweDlmLCAweDU4LAorCTB4NDAsIDB4ZWUsIDB4NTEsIDB4NDUsIDB4NmUsIDB4NWMsIDB4YzgsIDB4MzAsIDB4NmMsIDB4YzQsIDB4ZWYsIDB4YWQsCisJMHg5MiwgMHhmZiwgMHg0MiwgMHhmMiwgMHg3ZiwgMHgwNywgMHg1NSwgMHhhNSwgMHgwZCwgMHg2NSwgMHhlNCwgMHgzYiwKKwkweDAxLCAweDFjLCAweGVhLCAweDFkLCAweDhmLCAweDkxLCAweDJiLCAweGM5LCAweDc3LCAweGY3LCAweDJhLCAweDM4LAorCTB4ZjYsIDB4MTEsIDB4MTksIDB4N2UsIDB4NzcsIDB4MTQsIDB4N2IsIDB4MzIsIDB4OGYsIDB4YTMsIDB4ZjksIDB4NmUsCisJMHg1MiwgMHgzNiwgMHgxNCwgMHhmMSwgMHgxZCwgMHg4OSwgMHg0NCwgMHgzMywgMHg0ZCwgMHhiZiwgMHg4YiwgMHg5YSwKKwkweDY3LCAweGIyLCAweDM5LCAweDQ4LCAweGE1LCAweGE2LCAweDA1LCAweDE5LCAweGNjLCAweGY0LCAweGYxLCAweGQ5LAorCTB4OGEsIDB4MmIsIDB4MzgsIDB4OGYsIDB4NjAsIDB4NWEsIDB4ZWYsIDB4YTUsIDB4YzMsIDB4N2UsIDB4NDQsIDB4NGYsCisJMHgzMiwgMHhhNCwgMHg2ZiwgMHgzMiwgMHgxYywgMHgyNywgMHg0MiwgMHgxYSwgMHhkYSwgMHhmMSwgMHgyNSwgMHg4MSwKKwkweDBiLCAweDMxLCAweDNlLCAweGY3LCAweDU3LCAweDIxLCAweDFlLCAweGY2LCAweDFmLCAweGEwLCAweDc1LCAweDMyLAorCTB4NDMsIDB4MmIsIDB4M2UsIDB4ZDMsIDB4YjEsIDB4ODUsIDB4YWEsIDB4NjksIDB4ZWUsIDB4MWYsIDB4ODAsIDB4OWUsCisJMHgzMSwgMHg5ZSwgMHg0ZCwgMHg5YywgMHhjNywgMHhhYywgMHhlMywgMHhmMSwgMHg5MSwgMHg2NiwgMHgwNSwgMHgzYywKKwkweDY2LCAweGZlLCAweGYyLCAweGJhLCAweDI0LCAweDJkLCAweDdkLCAweDg1LCAweGU1LCAweGI3LCAweDA3LCAweGY5LAorCTB4M2IsIDB4ZWIsIDB4YzIsIDB4OTYsIDB4NTAsIDB4YWYsIDB4ZDQsIDB4OWUsIDB4YTUsIDB4ODUsIDB4MWUsIDB4YzgsCisJMHg4YSwgMHhmNywgMHhlZCwgMHhhMiwgMHhiYiwgMHg2MSwgMHhlZiwgMHhjNSwgMHgwNiwgMHhlZiwgMHgzZiwgMHgwOSwKKwkweDNkLCAweDdhLCAweDU5LCAweGVlLCAweDVmLCAweDVhLCAweDE5LCAweDA4LCAweGUxLCAweDE5LCAweGI2LCAweDY3LAorCTB4MDMsIDB4NmMsIDB4MjcsIDB4ZWQsIDB4YWIsIDB4OWIsIDB4ZDcsIDB4ODEsIDB4ZmYsIDB4N2QsIDB4YzAsIDB4MGIsCisJMHgzYSwgMHg5OSwgMHg2MywgMHg3OCwgMHhjNiwgMHg4MywgMHg3NSwgMHg4ZCwgMHhmNCwgMHg2NywgMHhlMCwgMHg0OSwKKwkweGM5LCAweDVhLCAweGJlLCAweGQ4LCAweGU4LCAweGE0LCAweDYyLCAweDNkLCAweGMyLCAweGM1LCAweDc4LCAweDNlLAorCTB4NDYsIDB4YWQsIDB4N2IsIDB4OWYsIDB4YzQsIDB4MzUsIDB4MmQsIDB4NzEsIDB4ZTEsIDB4N2QsIDB4ODMsIDB4N2QsCisJMHhjZCwgMHhhZCwgMHg4MCwgMHg0NywgMHhiZCwgMHhlZSwgMHg4MCwgMHhiNiwgMHg1NCwgMHgzNywgMHgyZCwgMHhjOSwKKwkweDdhLCAweGJkLCAweDRiLCAweGY5LCAweDk4LCAweGQ0LCAweDY2LCAweGJjLCAweGRmLCAweDAyLCAweDViLCAweGRmLAorCTB4ODMsIDB4M2MsIDB4YTYsIDB4MDcsIDB4NzMsIDB4ZDYsIDB4ODYsIDB4YjksIDB4OGQsIDB4ZjQsIDB4MjcsIDB4MzYsCisJMHhkMCwgMHhkZiwgMHg4OSwgMHg3NSwgMHhmZCwgMHhkOCwgMHg1MywgMHhhZCwgMHgyYiwgMHg2MSwgMHhkZCwgMHhlYywKKwkweDAyLCAweDZjLCAweDgyLCAweDczLCAweGYzLCAweDM0LCAweGM3LCAweGU0LCAweDFiLCAweDI1LCAweDJkLCAweGIzLAorCTB4MmIsIDB4ZWYsIDB4ZTEsIDB4NWMsIDB4MDMsIDB4ODAsIDB4OGQsIDB4YzYsIDB4OGEsIDB4MGYsIDB4NzUsIDB4ZTAsCisJMHhmOSwgMHg1ZSwgMHg0MywgMHhkZSwgMHg0YiwgMHg0MCwgMHgwNiwgMHg5YiwgMHg1MywgMHg3YywgMHhmNiwgMHg2YSwKKwkweGUzLCAweGYzLCAweDc4LCAweDc2LCAweDYzLCAweDFiLCAweGJmLCAweDk4LCAweDU3LCAweDRjLCAweDJmLCAweGQzLAorCTB4MGEsIDB4M2QsIDB4MjUsIDB4ZDgsIDB4OWIsIDB4OGIsIDB4OWEsIDB4MmYsIDB4YTUsIDB4NTMsIDB4MjksIDB4ODcsCisJMHg3OCwgMHhlZSwgMHhmMywgMHg1ZCwgMHgyZCwgMHhkYiwgMHhlNSwgMHhhMCwgMHhhYSwgMHgwYiwgMHgxYywgMHg4ZSwKKwkweGViLCAweDg2LCAweDNjLCAweGZiLCAweGUxLCAweDE1LCAweGJlLCAweGFmLCAweGI1LCAweDEwLCAweDRmLCAweGVkLAorCTB4MmMsIDB4ZTEsIDB4ZWMsIDB4MGYsIDB4YWYsIDB4MzgsIDB4ZjQsIDB4NjgsIDB4MzMsIDB4NGIsIDB4NDcsIDB4OWIsCisJMHhiNiwgMHg3OSwgMHgzZiwgMHg3YywgMHg0MCwgMHg3OSwgMHhlZCwgMHgxZSwgMHg3NywgMHg1NywgMHg4YSwgMHhmZCwKKwkweDk2LCAweDgxLCAweDljLCAweGIzLCAweGMzLCAweDUxLCAweDM5LCAweDQ4LCAweDk1LCAweGViLCAweGIxLCAweDA1LAorCTB4OWIsIDB4ZWYsIDB4NjgsIDB4Y2MsIDB4MDYsIDB4NmQsIDB4Y2MsIDB4NTMsIDB4ZmUsIDB4MmYsIDB4NzMsIDB4MTQsCisJMHhkZSwgMHg5ZiwgMHhmZCwgMHgzNCwgMHg3MiwgMHgxMiwgMHgxZiwgMHgzOSwgMHg4OSwgMHg4ZiwgMHg5YywgMHhjNCwKKwkweDQ3LCAweDRlLCAweGUyLCAweDIzLCAweDI3LCAweGYxLCAweDkxLCAweDkzLCAweGY4LCAweGM4LCAweDQ5LCAweDdjLAorCTB4ZTQsIDB4MjQsIDB4YzgsIDB4ZmYsIDB4NTUsIDB4NWQsIDB4MzAsIDB4OGUsIDB4NWMsIDB4MWIsIDB4ZmUsIDB4Y2IsCisJMHhmZiwgMHg2YSwgMHg5OCwgMHg1MywgMHg0NCwgMHgzMSwgMHg5OSwgMHhlNywgMHg1NiwgMHgzNywgMHg3OSwgMHg2ZSwKKwkweDc0LCAweDRmLCAweDdjLCAweDAwLCAweDczLCAweDEzLCAweDYxLCAweGVlLCAweGMzLCAweDZiLCAweGEyLCAweDk4LAorCTB4Y2QsIDB4ZWIsIDB4NjgsIDB4Y2MsIDB4NDMsIDB4YmQsIDB4NTksIDB4OTgsIDB4ZTQsIDB4ZGMsIDB4NDgsIDB4YzUsCisJMHgyYSwgMHg5NSwgMHg5NywgMHhiZiwgMHg4YSwgMHhmYywgMHhjOCwgMHg0MiwgMHg3ZSwgMHgzNCwgMHg4OCwgMHg1YywKKwkweDg4LCAweGVmLCAweGI1LCAweGEzLCAweGZiLCAweGEzLCAweDgyLCAweDc2LCAweGM4LCAweDFmLCAweGQ3LCAweGJlLAorCTB4ZTYsIDB4NzMsIDB4ZGUsIDB4ZWUsIDB4NTgsIDB4NjUsIDB4MjEsIDB4MTYsIDB4ZmEsIDB4MjksIDB4YTAsIDB4ZTIsCisJMHhlOCwgMHhiNywgMHg5MCwgMHgyMywgMHg3ZiwgMHg0ZiwgMHhkZSwgMHg5NSwgMHg0ZCwgMHgwYywgMHhiMywgMHhjYywKKwkweDI3LCAweDNlLCAweDI1LCAweDRmLCAweDhlLCAweGY4LCAweGFiLCAweGVlLCAweGY4LCAweGM0LCAweDEyLCAweGYzLAorCTB4OGYsIDB4YTgsIDB4ZWYsIDB4MmMsIDB4MTgsIDB4N2UsIDB4MzYsIDB4NDEsIDB4YTksIDB4NTMsIDB4NWIsIDB4MzAsCisJMHg2NywgMHg1MiwgMHhiZiwgMHhiYywgMHgyNywgMHg4MiwgMHgyOCwgMHhjZiwgMHhmZSwgMHgxYSwgMHhmMiwgMHg3MiwKKwkweDQ4LCAweDljLCAweGU1LCAweGRiLCAweDA0LCAweGM2LCAweGNiLCAweGZlLCAweGI1LCAweDMyLCAweDUzLCAweDZjLAorCTB4NTQsIDB4YTQsIDB4NGUsIDB4MWQsIDB4NmEsIDB4OTYsIDB4OTAsIDB4M2YsIDB4ZjUsIDB4ZjYsIDB4NTMsIDB4OTcsCisJMHg4MSwgMHgxYSwgMHgyYSwgMHhjMiwgMHhjZCwgMHgzOCwgMHg3ZiwgMHg5OSwgMHg5MiwgMHhiNSwgMHhjZCwgMHhkOSwKKwkweDM1LCAweDc5LCAweDQyLCAweGQ2LCAweGJjLCAweDRmLCAweDY1LCAweGE2LCAweDVhLCAweGI3LCAweDMzLCAweDVjLAorCTB4ZDcsIDB4ODIsIDB4ZDYsIDB4OTksIDB4MjcsIDB4ODEsIDB4NjMsIDB4MTksIDB4MzksIDB4ODEsIDB4MmUsIDB4ZjcsCisJMHhhZSwgMHhjYywgMHhjYywgMHhkNiwgMHhkNSwgMHg1ZCwgMHg5NSwgMHhhMiwgMHgwMSwgMHhmMSwgMHgyZiwgMHhkNywKKwkweDQ1LCAweGZhLCAweDkyLCAweGJhLCAweGIzLCAweDEyLCAweDEyLCAweDk2LCAweGUxLCAweDE4LCAweGRlLCAweDAwLAorCTB4MWMsIDB4Y2IsIDB4MmQsIDB4MGIsIDB4NTgsIDB4OTYsIDB4MWQsIDB4ZDMsIDB4NTAsIDB4OTksIDB4YTksIDB4MzQsCisJMHhkYSwgMHg2OSwgMHg2MCwgMHgzYywgMHg4YywgMHgzNywgMHgzYSwgMHgwZiwgMHg5ZiwgMHgyNSwgMHg0NSwgMHhlMiwKKwkweDU0LCAweDEwLCAweDk0LCAweDQ3LCAweDA3LCAweGMzLCAweDNhLCAweDEyLCAweGY1LCAweGUzLCAweDA5LCAweDQzLAorCTB4ZWEsIDB4YjksIDB4MWEsIDB4N2YsIDB4NTMsIDB4YzYsIDB4MjksIDB4NGIsIDB4ZjAsIDB4M2MsIDB4M2YsIDB4ZjEsCisJMHgyZSwgMHhmNywgMHgyNCwgMHhlNiwgMHgzMCwgMHg1ZSwgMHg4ZSwgMHhkNiwgMHg4YSwgMHg3MCwgMHg2ZCwgMHg3NywKKwkweDFiLCAweDNmLCAweDNiLCAweGMyLCAweGZkLCAweDk4LCAweDI2LCAweDNlLCAweGU3LCAweDY1LCAweGVjLCAweGM1LAorCTB4NzQsIDB4ZjEsIDB4MWEsIDB4MTMsIDB4YjQsIDB4NDEsIDB4OTYsIDB4ZmUsIDB4ZmYsIDB4OTYsIDB4ZjcsIDB4ZWQsCisJMHg2NywgMHg2MiwgMHg5ZSwgMHgxYSwgMHg4MCwgMHhlMSwgMHhmNSwgMHg4YywgMHgyMywgMHg4MiwgMHhjMSwgMHg4YiwKKwkweGIzLCAweDBhLCAweDRlLCAweGFjLCAweGRkLCAweGVkLCAweDdkLCAweGQ2LCAweGJlLCAweGVkLCAweGI0LCAweDQ2LAorCTB4ZmIsIDB4NDcsIDB4NzgsIDB4YjIsIDB4NGEsIDB4NmUsIDB4NmIsIDB4ZjAsIDB4ZjIsIDB4ZmYsIDB4MGEsIDB4YzMsCisJMHgxMywgMHhiYSwgMHhmOCwgMHg4OSwgMHgzYiwgMHhkMiwgMHg2YywgMHg1YiwgMHg2ZCwgMHgxYywgMHhkZCwgMHgzNSwKKwkweDcwLCAweGNkLCAweGNmLCAweDM1LCAweDNjLCAweDdmLCAweDQ3LCAweDY4LCAweGFmLCAweDRiLCAweDRiLCAweDYxLAorCTB4MmMsIDB4ODMsIDB4MmUsIDB4YWEsIDB4YmIsIDB4ZDQsIDB4NzAsIDB4NmMsIDB4NzAsIDB4NmMsIDB4NDMsIDB4ZTMsCisJMHgxYywgMHgzZiwgMHhiMiwgMHg5MSwgMHhmNiwgMHg3YiwgMHg0MiwgMHg5NSwgMHg5YiwgMHg5YywgMHg1OSwgMHg4YywKKwkweDdjLCAweDBlLCAweGZjLCAweGMxLCAweGIwLCAweDExLCAweGZhLCAweGVkLCAweDI0LCAweGZjLCAweDU2LCAweDBmLAorCTB4ZWQsIDB4ODMsIDB4YmYsIDB4YjksIDB4MTMsIDB4ZmUsIDB4NjYsIDB4M2YsIDB4ZWEsIDB4Y2EsIDB4ZjEsIDB4OTUsCisJMHhmNiwgMHhmYiwgMHg1NywgMHhhZSwgMHg2NSwgMHhhYiwgMHg3NCwgMHg1OCwgMHhjYSwgMHhhZSwgMHgxMiwgMHhlOCwKKwkweGNlLCAweGM3LCAweDkwLCAweGRmLCAweDJlLCAweDk5LCAweGEzLCAweDI5LCAweDc5LCAweGMyLCAweDU3LCAweGJhLAorCTB4ZmMsIDB4MmQsIDB4NjIsIDB4ZTMsIDB4M2QsIDB4NmYsIDB4MTYsIDB4N2EsIDB4ZGQsIDB4NTUsIDB4MTAsIDB4MzIsCisJMHhmZiwgMHg1MiwgMHg3YywgMHhhYiwgMHgzNiwgMHgxNCwgMHhkZiwgMHhlMCwgMHg1MywgMHg4MSwgMHhkZiwgMHhhMCwKKwkweDRhLCAweGQzLCAweGE0LCAweDBhLCAweGY2LCAweGFkLCAweDYwLCAweGRmLCAweDBhLCAweGVhLCAweGMxLCAweGQ5LAorCTB4NjYsIDB4ZmIsIDB4NzcsIDB4YWEsIDB4ZWUsIDB4YjAsIDB4YzYsIDB4NjYsIDB4ZDgsIDB4YTgsIDB4NmYsIDB4ODYsCisJMHhlNywgMHhkMiwgMHhkYSwgMHg5ZSwgMHhjNywgMHhjMCwgMHhiYiwgMHg0NywgMHhjMSwgMHhiYiwgMHgyMywgMHhhOCwKKwkweDgzLCAweGZlLCAweDA0LCAweDc1LCAweGQwLCAweDFmLCAweGEyLCAweDBlLCAweDNhLCAweDhjLCAweDNhLCAweDY4LAorCTB4MGEsIDB4NzUsIDB4ZDAsIDB4N2QsIDB4YjAsIDB4ZmQsIDB4N2IsIDB4NjEsIDB4ZmIsIDB4OTMsIDB4YjAsIDB4ZmQsCisJMHgwOSwgMHg3OSwgMHhjNywgMHg3MywgMHhjOCwgMHhkZiwgMHg3OCwgMHhlZiwgMHgxMSwgMHhlZCwgMHhjNSwgMHhlZCwKKwkweDRkLCAweDIyLCAweDg4LCAweGFmLCAweDdjLCAweDYyLCAweDljLCAweDFhLCAweDJkLCAweGFlLCAweDg3LCAweDVjLAorCTB4NzksIDB4N2YsIDB4MzUsIDB4ZWQsIDB4NGUsIDB4NmEsIDB4NTMsIDB4YzgsIDB4YjksIDB4ZWYsIDB4MWYsIDB4ZTEsCisJMHgzYSwgMHgyOSwgMHhhNSwgMHhlZSwgMHgyYiwgMHg3MywgMHhmNiwgMHg3MywgMHgxZSwgMHhkMiwgMHgyZSwgMHhlNCwKKwkweDZkLCAweDM4LCAweGIzLCAweDdkLCAweGE2LCAweGE4LCAweDQ3LCAweDM1LCAweDRhLCAweGRmLCAweDVhLCAweDhkLAorCTB4YjIsIDB4M2MsIDB4Y2YsIDB4MzUsIDB4Y2EsIDB4YWIsIDB4NmIsIDB4MzUsIDB4Y2EsIDB4ZjIsIDB4M2MsIDB4ZDcsCisJMHgyOCwgMHhhZiwgMHhhYywgMHhhYiwgMHg1MSwgMHhhZSwgMHgzYywgMHhmZCwgMHhmMiwgMHhiYSwgMHgxYSwgMHhlNSwKKwkweGNhLCAweGQzLCAweDJmLCAweDg1LCAweDYzLCAweGE2LCAweDAzLCAweDdlLCAweGM5LCAweDBkLCAweDY5LCAweDM1LAorCTB4NWQsIDB4M2MsIDB4N2IsIDB4YzMsIDB4N2MsIDB4ZTEsIDB4ZmIsIDB4ZmQsIDB4ZWIsIDB4ZmYsIDB4MWYsIDB4M2EsCisJMHg2ZSwgMHg5ZCwgMHgxYSwgMHgzOSwgMHhkZiwgMHhkOCwgMHhhYSwgMHhlYSwgMHg5YSwgMHhmNiwgMHhmOSwgMHhkZSwKKwkweGI2LCAweGY5LCAweDU1LCAweGY5LCAweDZkLCAweGI0LCAweDVjLCAweGRiLCAweGZjLCAweDNlLCAweGJjLCAweDI3LAorCTB4YWQsIDB4MGMsIDB4ZGIsIDB4ZjUsIDB4MDIsIDB4N2QsIDB4MWMsIDB4ZjAsIDB4ZjcsIDB4M2QsIDB4NGYsIDB4NzQsCisJMHhjOSwgMHhlZiwgMHg2YSwgMHg5ZSwgMHhjYywgMHg5MSwgMHg2MSwgMHhhMywgMHhhMywgMHg0NywgMHhiNywgMHgyYSwKKwkweDNiLCAweGU2LCAweDdlLCAweDVhLCAweDUzLCAweGJlLCAweGY5LCAweDQxLCAweGUwLCAweDAxLCAweGFmLCAweDdkLAorCTB4NDMsIDB4ZGUsIDB4ZTEsIDB4YTgsIDB4ZjMsIDB4YWEsIDB4YmIsIDB4NmMsIDB4MjMsIDB4YmYsIDB4OGEsIDB4MzgsCisJMHgwMywgMHg1OSwgMHg0YiwgMHhkYywgMHg1YywgMHhmMywgMHg3MSwgMHg5ZCwgMHgxOCwgMHhmOSwgMHhlZiwgMHgwOCwKKwkweGQ3LCAweGNmLCAweGQyLCAweDhhLCAweGVlLCAweGRiLCAweDUwLCAweGVmLCAweGYxLCAweDlhLCAweDY4LCAweGRjLAorCTB4NWUsIDB4MWYsIDB4MjYsIDB4YzMsIDB4ZmIsIDB4YWMsIDB4NTUsIDB4OTUsIDB4MTMsIDB4NDksIDB4N2MsIDB4NDYsCisJMHg4OCwgMHhlZiwgMHhiZiwgMHgwMiwgMHhlNSwgMHgzNywgMHgxOCwgMHhkZSwgMHg2YywgMHg4MywgMHgxZiwgMHg0NywKKwkweDllLCAweGM2LCAweDc3LCAweDJiLCAweDljLCAweDZmLCAweDE5LCAweGY0LCAweGVlLCAweDdjLCAweDM3LCAweGJkLAorCTB4NzMsIDB4MWMsIDB4ZjksIDB4YTYsIDB4NmIsIDB4NjcsIDB4NWYsIDB4NDYsIDB4YmQsIDB4NzAsIDB4OGEsIDB4ZjMsCisJMHhlMiwgMHg1MSwgMHhhNiwgMHg3MywgMHhjOCwgMHg5YSwgMHgyNSwgMHhhYiwgMHg1ZiwgMHhlNSwgMHhkMSwgMHg0NywKKwkweGI0LCAweDRmLCAweGQyLCAweDJkLCAweGMyLCAweDdkLCAweDdlLCAweGQ2LCAweGI2LCAweDhmLCAweGQ1LCAweGI2LAorCTB4NGYsIDB4ODEsIDB4ZWQsIDB4YWQsIDB4ZjEsIDB4NzUsIDB4OWMsIDB4YjksIDB4YjIsIDB4ZmQsIDB4MjYsIDB4MzMsCisJMHgxZCwgMHhkNiwgMHg1MiwgMHg4ZiwgMHg4YywgMHg2ZSwgMHhhNiwgMHhmYSwgMHg4MCwgMHg3ZCwgMHhlZSwgMHgxNSwKKwkweGU0LCAweGRhLCAweGU1LCAweDUxLCAweGNjLCAweGE1LCAweDg3LCAweGYwLCAweDhlLCAweGU3LCAweGVkLCAweDA2LAorCTB4MDksIDB4ZmIsIDB4NWMsIDB4ODMsIDB4OTAsIDB4NGMsIDB4NzcsIDB4ZDksIDB4MTUsIDB4YmUsIDB4NjMsIDB4NGIsCisJMHgwYiwgMHhlZSwgMHg0YiwgMHhkYSwgMHgxYSwgMHhhMSwgMHhmZCwgMHg2NiwgMHgyZSwgMHhlMiwgMHhjYywgMHg1MywKKwkweGE4LCAweDk5LCAweDhlLCAweGE4LCAweGJiLCAweGFmLCAweDcwLCAweDlmLCAweDViLCAweGI0LCAweDhiLCAweDMyLAorCTB4YWYsIDB4Y2QsIDB4NjksIDB4OTUsIDB4YjQsIDB4M2EsIDB4ZTMsIDB4MzcsIDB4NjAsIDB4ZWIsIDB4YmEsIDB4NjAsCisJMHhkOCwgMHg3NywgMHg4MSwgMHg1YiwgMHhhMywgMHhhNSwgMHhlMywgMHhiYSwgMHhiYywgMHhlYiwgMHgyYywgMHg4ZiwKKwkweGIyLCAweGFjLCAweGY5LCAweDc5LCAweDNkLCAweGRlLCAweDQ1LCAweDY3LCAweGZhLCAweGRiLCAweGYwLCAweDRjLAorCTB4NWYsIDB4MGEsIDB4NmIsIDB4ZWQsIDB4ZTgsIDB4NGMsIDB4MDksIDB4N2EsIDB4NjMsIDB4ZGUsIDB4MDQsIDB4ZWMsCisJMHgwOCwgMHhmOCwgMHg1MSwgMHhhMiwgMHg5NSwgMHg5NiwgMHhmNSwgMHgzOSwgMHg3OCwgMHg2YSwgMHg2ZCwgMHhiYywKKwkweDMxLCAweDM2LCAweGM4LCAweDMwLCAweGFhLCAweDU5LCAweGMwLCAweDgzLCAweDg5LCAweDBjLCAweGVjLCAweDcwLAorCTB4YmEsIDB4M2YsIDB4YmEsIDB4ODMsIDB4ZDUsIDB4MWQsIDB4YTEsIDB4YTksIDB4ZGEsIDB4OWIsIDB4ZTcsIDB4MDcsCisJMHg2MSwgMHg4YiwgMHgxNiwgMHhlYywgMHg5MywgMHhmMywgMHg5ZCwgMHgxMiwgMHhkNywgMHgxOSwgMHhlMSwgMHhmNywKKwkweDRiLCAweGRiLCAweDljLCAweGE0LCAweDJjLCAweDZhLCAweDE1LCAweDNlLCAweDdmLCAweDllLCAweDk2LCAweDViLAorCTB4MTEsIDB4MGQsIDB4MzksIDB4ZDgsIDB4ZTMsIDB4MTgsIDB4N2UsIDB4MjMsIDB4NzgsIDB4ZTcsIDB4ZTIsIDB4YzcsCisJMHg3NSwgMHg0ZSwgMHg4MSwgMHgxZSwgMHg5MywgMHg3OSwgMHgzNCwgMHhmMiwgMHhlNCwgMHg2MSwgMHhhNiwgMHhlZiwKKwkweDAwLCAweGQ2LCAweGIzLCAweDNlLCAweGIzLCAweDllLCAweDFlLCAweDIwLCAweDZmLCAweDgwLCAweDdkLCAweDQ1LAorCTB4MDYsIDB4YjgsIDB4MDEsIDB4ZTMsIDB4YmYsIDB4MGUsIDB4NWIsIDB4MWYsIDB4YzQsIDB4ZDMsIDB4MzYsIDB4Y2IsCisJMHhjYywgMHg1YiwgMHg4OSwgMHgzZiwgMHgwOCwgMHhmNCwgMHgxYywgMHg3ZiwgMHgzYiwgMHgxOCwgMHgwZiwgMHhjNywKKwkweDQzLCAweGU2LCAweGRkLCAweGFjLCAweDdiLCAweDk5LCAweDFkLCAweDc0LCAweDZlLCAweDMxLCAweDhhLCAweDYxLAorCTB4MzMsIDB4YjAsIDB4NDEsIDB4YmUsIDB4NTMsIDB4MWQsIDB4MDcsIDB4NWYsIDB4NzgsIDB4YWMsIDB4ODUsIDB4YjEsCisJMHgwYywgMHhmMywgMHhjYiwgMHgwYiwgMHgzOCwgMHg3NywgMHg5ZSwgMHg0ZSwgMHhhMSwgMHg2NiwgMHhhNywgMHgwMSwKKwkweDdlLCAweDIyLCAweDU3LCAweGY1LCAweGI3LCAweDg0LCAweGZhLCAweGJlLCAweDFlLCAweDVlLCAweDc3LCAweGI4LAorCTB4M2YsIDB4MGUsIDB4ZmEsIDB4OGMsIDB4MzYsIDB4NzgsIDB4ODYsIDB4NTEsIDB4YjUsIDB4YzUsIDB4NDUsIDB4NDIsCisJMHgyYywgMHhjZCwgMHgwNCwgMHhiNywgMHg4YiwgMHhmYywgMHg3ZCwgMHhmNCwgMHg4MCwgMHgzYywgMHg1MywgMHg5ZSwKKwkweDBlLCAweDJmLCAweDA2LCAweDgxLCAweDk3LCAweDFiLCAweGNhLCAweDJlLCAweDkzLCAweDlkLCAweDdkLCAweDkyLAorCTB4ZjYsIDB4OTgsIDB4ZmIsIDB4NDgsIDB4OTcsIDB4ZGYsIDB4ZTAsIDB4NTAsIDB4MTMsIDB4ZGYsIDB4ZGUsIDB4OTEsCisJMHgwZiwgMHg4MiwgMHg5MywgMHhhMCwgMHhmZCwgMHgwNSwgMHhiOSwgMHhjZiwgMHg3ZCwgMHhhMCwgMHgxZiwgMHhiYywKKwkweDkyLCAweGY1LCAweDA0LCAweGQzLCAweDBhLCAweGRlLCAweGE0LCAweDk5LCAweGRlLCAweDI0LCAweDFkLCAweDZlLAorCTB4OWQsIDB4MGYsIDB4NjUsIDB4ZjMsIDB4MjgsIDB4NzksIDB4ZmUsIDB4ZGIsIDB4M2EsIDB4ZGYsIDB4NDcsIDB4OTcsCisJMHg1YiwgMHg0ZiwgMHg4NiwgMHhiNCwgMHhlNSwgMHg0MSwgMHgyZiwgMHhmNiwgMHg2ZiwgMHhiZCwgMHg5MCwgMHg2NiwKKwkweGRmLCAweGMwLCAweDMyLCAweGY3LCAweDkwLCAweGYxLCAweDc5LCAweGEzLCAweGNmLCAweDQwLCAweDA3LCAweDNmLAorCTB4Y2QsIDB4MGYsIDB4YTQsIDB4NjgsIDB4YmQsIDB4MWYsIDB4NjAsIDB4YjgsIDB4ZDQsIDB4NzUsIDB4NzQsIDB4ODUsCisJMHhlOSwgMHgyMCwgMHhlOSwgMHgzZiwgMHg4NSwgMHhiMywgMHgxOSwgMHhmNCwgMHgzMCwgMHgzZSwgMHg3ZCwgMHg4MywKKwkweDJmLCAweGE4LCAweGM4LCAweGU3LCAweGFhLCAweGNlLCAweGJlLCAweDg5LCAweGUzLCAweDE0LCAweGViLCAweDcwLAorCTB4MGYsIDB4ZmMsIDB4MWYsIDB4NzQsIDB4MTAsIDB4NzYsIDB4NWMsIDB4NWMsIDB4ZTQsIDB4M2IsIDB4ODUsIDB4NjEsCisJMHhiZSwgMHg4NywgMHgzYSwgMHg1MywgMHg4MiwgMHg2YywgMHg5NywgMHhmOCwgMHhiYiwgMHg2MCwgMHg1YSwgMHhlNSwKKwkweDgyLCAweGFhLCAweDc2LCAweGIyLCAweGQ4LCAweDE3LCAweDMyLCAweGFmLCAweGE1LCAweDlmLCAweDJjLCAweGM5LAorCTB4ZWYsIDB4ODAsIDB4MjksIDB4YWMsIDB4MDksIDB4ZjAsIDB4NmMsIDB4ZmYsIDB4OWIsIDB4ODgsIDB4OWYsIDB4MTQsCisJMHhkNCwgMHhkZiwgMHg0NCwgMHg4NCwgMHhkZiwgMHg2NCwgMHgxYiwgMHgyYSwgMHgwNywgMHg3OCwgMHhiOCwgMHg2OSwKKwkweGQwLCAweDU0LCAweDMzLCAweGZhLCAweDFiLCAweDA5LCAweDk2LCAweDgzLCAweDgzLCAweDNhLCAweDNlLCAweDhhLAorCTB4ZmIsIDB4ODEsIDB4OGMsIDB4MmYsIDB4ZDUsIDB4NzUsIDB4YjIsIDB4ZmMsIDB4NjYsIDB4OTgsIDB4Y2YsIDB4NzAsCisJMHhmZSwgMHhjZSwgMHgzYywgMHhjNCwgMHg3OCwgMHg1OSwgMHhjOSwgMHg2ZiwgMHg0OSwgMHhlYywgMHg4NCwgMHhmYywKKwkweGMwLCAweDczLCAweGRmLCAweDgwLCAweDJkLCAweDY1LCAweGMyLCAweDk4LCAweDZjLCAweDcyLCAweDdkLCAweDE4LAorCTB4ZDYsIDB4YWMsIDB4ZGIsIDB4YTksIDB4M2EsIDB4YzksIDB4ZWYsIDB4MTMsIDB4ZjQsIDB4ZmEsIDB4ZmMsIDB4YTAsCisJMHg3YywgMHg1ZiwgMHhhNiwgMHg0NCwgMHhmOCwgMHg5ZSwgMHhjNywgMHgyOSwgMHgyYSwgMHhjYiwgMHhmNywgMHhmNywKKwkweDg2LCAweGY4LCAweDUwLCAweDYzLCAweGRkLCAweDFiLCAweDhkLCAweDMzLCAweDkwLCAweGEzLCAweDgyLCAweDliLAorCTB4NDYsIDB4MmMsIDB4N2IsIDB4MGMsIDB4NzEsIDB4NmMsIDB4MWEsIDB4N2MsIDB4MmYsIDB4NGUsIDB4NTQsIDB4NjgsCisJMHg4NywgMHhjMywgMHgzYSwgMHgwZSwgMHg5OSwgMHhhNSwgMHg1OCwgMHhjNywgMHg1OCwgMHhiZiwgMHgxOCwgMHhhNiwKKwkweDE3LCAweDc5LCAweDI2LCAweGNlLCAweDNiLCAweDRhLCAweDUzLCAweDdhLCAweGZlLCAweGZkLCAweDgzLCAweGU1LAorCTB4OWEsIDB4NmQsIDB4MTYsIDB4ZTgsIDB4YTMsIDB4YzAsIDB4MzMsIDB4NzgsIDB4YmMsIDB4N2EsIDB4ZjAsIDB4NjEsCisJMHg3NSwgMHg0ZiwgMHgyZiwgMHg0NCwgMHhmZSwgMHhkMiwgMHhjMSwgMHhiMiwgMHhlYSwgMHhlMywgMHhjYywgMHhlZiwKKwkweDg3LCAweDdkLCAweDg2LCAweGQzLCAweGU1LCAweGY3LCAweGQzLCAweDdmLCAweGJmLCAweGQ1LCAweGEwLCAweDhiLAorCTB4YjcsIDB4MDYsIDB4YzEsIDB4ZmQsIDB4ZmMsIDB4MGQsIDB4MjcsIDB4YWMsIDB4NDEsIDB4ZDUsIDB4NzcsIDB4NzEsCisJMHg4ZSwgMHgxMywgMHhhOCwgMHgzNywgMHg0NiwgMHgyZCwgMHhhZCwgMHgwNCwgMHhkYiwgMHgzZCwgMHhlNSwgMHhhMywKKwkweDVlLCAweDExLCAweGY2LCAweGQ4LCAweGFhLCAweDMwLCAweDExLCAweDdmLCAweGI5LCAweDk2LCAweGZmLCAweGNkLAorCTB4N2UsIDB4ZmUsIDB4MjYsIDB4M2MsIDB4ZTcsIDB4ZjIsIDB4OWEsIDB4NmQsIDB4ZWEsIDB4YWUsIDB4ZWEsIDB4ZTYsCisJMHhkYiwgMHhhNCwgMHhjZiwgMHgyNSwgMHgwYSwgMHhlMywgMHhkMCwgMHhjZCwgMHhlZCwgMHhmNiwgMHhkMSwgMHg5ZSwKKwkweDIzLCAweGIyLCAweDVkLCAweGQwLCAweDk0LCAweDAxLCAweDdhLCAweGFhLCAweGI1LCAweDI4LCAweGRmLCAweGUyLAorCTB4ZWYsIDB4ZmQsIDB4YWIsIDB4MDcsIDB4YmYsIDB4ZGIsIDB4YmMsIDB4NzQsIDB4NzAsIDB4MTYsIDB4ZjIsIDB4ZTEsCisJMHgzMywgMHhjZCwgMHgzNiwgMHgyMywgMHhmZCwgMHg4YiwgMHg3MiwgMHg3ZSwgMHhlZSwgMHgyMywgMHhmZSwgMHhmYiwKKwkweDg4LCAweGZmLCAweDNlLCAweGUyLCAweGJmLCAweDhmLCAweGY4LCAweGVmLCAweDIzLCAweGZlLCAweGZiLCAweDg4LAorCTB4ZmYsIDB4ZTAsIDB4ZTEsIDB4MGYsIDB4YTAsIDB4MmYsIDB4ZTcsIDB4ZmQsIDB4ODksIDB4MzAsIDB4ZGYsIDB4N2EsCisJMHg3YywgMHgyZCwgMHhkZiwgMHgzYSwgMHhkNywgMHhlMiwgMHg2ZiwgMHgzZiwgMHg5MiwgMHg5NiwgMHg0YSwgMHg4NSwKKwkweDU0LCAweGJlLCAweDRhLCAweDgyLCAweGYzLCAweDliLCAweDI4LCAweDVmLCAweGJkLCAweGZlLCAweDM3LCAweDBjLAorCTB4MDUsIDB4YzcsIDB4YjksIDB4MWEsIDB4YzMsIDB4NTUsIDB4MzQsIDB4ZTEsIDB4MzAsIDB4OWMsIDB4Y2EsIDB4ZDcsCisJMHhiOCwgMHg0NiwgMHg1YSwgMHgwZiwgMHhjMywgMHhkZiwgMHhjOSwgMHhkOCwgMHhiNywgMHhhOSwgMHg2ZiwgMHgzNCwKKwkweGVhLCAweDdiLCAweGQwLCAweGUzLCAweDVmLCAweGY3LCAweDEwLCAweDhiLCAweGNiLCAweDRkLCAweDE5LCAweDhmLAorCTB4MzEsIDB4N2UsIDB4MDYsIDB4NjMsIDB4ODMsIDB4ZjUsIDB4OGYsIDB4ZGYsIDB4ZGQsIDB4YzMsIDB4NzUsIDB4NDEsCisJMHhiOSwgMHg4OSwgMHhiYywgMHg2OCwgMHgzOSwgMHhjYSwgMHg4NSwgMHgwMCwgMHhlNywgMHhiZiwgMHhhOSwgMHg5NSwKKwkweGVhLCAweDJjLCAweDY3LCAweDQxLCAweGIzLCAweDY5LCAweDMwLCAweGM1LCAweDY5LCAweGFmLCAweDc1LCAweDVlLAorCTB4OTYsIDB4YjUsIDB4OGUsIDB4ZmEsIDB4OWIsIDB4OWUsIDB4MTEsIDB4ZDAsIDB4MTYsIDB4ZGQsIDB4ZmQsIDB4MTIsCisJMHhlOSwgMHhmMywgMHg2OSwgMHhmOSwgMHg3NywgMHgwMCwgMHgyOSwgMHg2NywgMHg1OCwgMHhmZSwgMHgzZCwgMHg0MiwKKwkweDFmLCAweGY2LCAweDExLCAweGYzLCAweDNiLCAweGRiLCAweGVlLCAweDU2LCAweGE5LCAweGEwLCAweDdjLCAweDc2LAorCTB4YTcsIDB4ZmEsIDB4M2IsIDB4MDgsIDB4OTEsIDB4ODYsIDB4ZWQsIDB4ZGUsIDB4YjYsIDB4MGQsIDB4NjcsIDB4ODMsCisJMHg1YywgMHg1ZiwgMHhkZCwgMHgyYSwgMHhmMywgMHg2NywgMHhmOCwgMHhkMSwgMHg5MywgMHhjMywgMHg3ZCwgMHgwMywKKwkweGQ0LCAweGIzLCAweDlkLCAweDRlLCAweDBkLCAweDczLCAweGFkLCAweGI1LCAweDE5LCAweGY4LCAweDc4LCAweGFkLAorCTB4OWQsIDB4MmQsIDB4ODgsIDB4ZWQsIDB4NzQsIDB4N2EsIDB4MTEsIDB4N2UsIDB4NzYsIDB4ZDEsIDB4NzYsIDB4NTksCisJMHg5NywgMHg5NywgMHg4NiwgMHhkMywgMHhmMCwgMHhjZiwgMHg2MywgMHgwMywgMHgxYywgMHg5ZiwgMHg5NywgMHg1YiwKKwkweGFjLCAweDJiLCAweDdkLCAweDgwLCAweDFmLCAweDg0LCAweDVlLCAweDZlLCAweDgyLCAweDNkLCAweDA5LCAweGVjLAorCTB4MWYsIDB4ZTEsIDB4ZmUsIDB4YjksIDB4YzQsIDB4ZGQsIDB4ZTcsIDB4ZWMsIDB4ZDksIDB4MjYsIDB4NzUsIDB4NDMsCisJMHhkOCwgMHhhNiwgMHgyNSwgMHg0MCwgMHhmYiwgMHgyNywgMHg2YSwgMHg0NCwgMHg5NywgMHhmOCwgMHg2YywgMHhiMywKKwkweDdlLCAweGZiLCAweGI3LCAweGJhLCAweDM3LCAweGI1LCAweDcyLCAweDlkLCAweGZmLCAweDBlLCAweDYxLCAweDk4LAorCTB4ZjYsIDB4NDEsIDB4YmYsIDB4NGMsIDB4ZTcsIDB4NGQsIDB4ZWQsIDB4ODEsIDB4YzYsIDB4ZmYsIDB4MTQsIDB4NmUsCisJMHg3NSwgMHhiMSwgMHg3MSwgMHg1YywgMHg1NSwgMHhmOCwgMHhkYywgMHg1OSwgMHhhZiwgMHhlZCwgMHgzOCwgMHg2YiwKKwkweDY3LCAweGUyLCAweDZjLCAweGVjLCAweGI1LCAweDE1LCAweGM0LCAweGNlLCAweDdhLCAweDEyLCAweDRmLCAweGI1LAorCTB4OGUsIDB4M2EsIDB4YjYsIDB4MTIsIDB4YjQsIDB4NDIsIDB4OTYsIDB4NTgsIDB4ZWQsIDB4N2EsIDB4NWQsIDB4ODcsCisJMHg5MiwgMHhiMiwgMHg4NSwgMHg1MCwgMHgwNSwgMHgwOSwgMHg1NSwgMHg5NiwgMHg5ZCwgMHhkMiwgMHg1NCwgMHg4MCwKKwkweDkwLCAweGZhLCAweDgwLCAweDc4LCAweGNiLCAweDZhLCAweDZkLCAweDg3LCAweGE0LCAweGVjLCAweDc2LCAweDZkLAorCTB4NjIsIDB4ZDcsIDB4MmYsIDB4M2MsIDB4MmMsIDB4ZWIsIDB4NzUsIDB4NmEsIDB4YmIsIDB4OWIsIDB4YWMsIDB4NDIsCisJMHhmYiwgMHg1MCwgMHg5ZSwgMHg2MiwgMHg5OSwgMHg5MiwgMHhjMiwgMHg0YiwgMHg4NSwgMHhjNCwgMHgwMywgMHgwMiwKKwkweDU0LCAweGE5LCAweDRhLCAweGRhLCAweDM0LCAweDBmLCAweDI1LCAweDExLCAweGJjLCAweDUwLCAweDBhLCAweGQyLAorCTB4ZjAsIDB4N2QsIDB4NzcsIDB4NjYsIDB4MWQsIDB4MjcsIDB4NTAsIDB4NjEsIDB4NjksIDB4MzUsIDB4NzcsIDB4ZWUsCisJMHhkYywgMHgzYiwgMHg3MywgMHg3ZiwgMHhjZSwgMHhmOSwgMHhjZSwgMHg3NywgMHhjZSwgMHgzZCwgMHg2NiwgMHgxYiwKKwkweDFiLCAweDY1LCAweGZhLCAweGQzLCAweGFiLCAweDZhLCAweGE2LCAweGRhLCAweDJiLCAweDBiLCAweDkwLCAweGUzLAorCTB4ZTIsIDB4NDgsIDB4MzgsIDB4ODgsIDB4OTcsIDB4NzYsIDB4MDUsIDB4ZmEsIDB4MGMsIDB4YzcsIDB4ZGYsIDB4YjcsCisJMHg1NywgMHg5YSwgMHg1NywgMHgxNiwgMHhjZCwgMHg0ZSwgMHhjZCwgMHhhYiwgMHgxZSwgMHg3ZCwgMHg3NiwgMHgwYSwKKwkweDYzLCAweDhhLCAweDYxLCAweDFkLCAweGJhLCAweGZiLCAweDM0LCAweDM2LCAweDE5LCAweGJjLCAweGVmLCAweDdmLAorCTB4ZWMsIDB4YmUsIDB4ZWYsIDB4YjEsIDB4ZmIsIDB4YzMsIDB4ZmYsIDB4YTMsIDB4M2QsIDB4Y2IsIDB4OGYsIDB4Y2IsCisJMHgwMywgMHhjNywgMHg2OSwgMHhhNSwgMHhmOCwgMHg5NSwgMHg2MiwgMHhjOSwgMHgzNiwgMHg2NiwgMHg0YiwgMHg1NiwKKwkweDlhLCAweGJjLCAweDIwLCAweDJiLCAweDllLCAweGNhLCAweGJhLCAweGVkLCAweGMwLCAweGJiLCAweDc2LCAweDk5LAorCTB4NWYsIDB4ODYsIDB4Y2MsIDB4NjMsIDB4MWUsIDB4MWQsIDB4MzYsIDB4Y2YsIDB4YjQsIDB4MTMsIDB4N2QsIDB4ZDQsCisJMHg5OSwgMHg0ZSwgMHg2YywgMHg4MywgMHg2MSwgMHgwZiwgMHhjNSwgMHhkMCwgMHhjZSwgMHg3YiwgMHhjOSwgMHg0ZCwKKwkweDlhLCAweGU3LCAweDc0LCAweDFjLCAweDg2LCAweDdjLCAweGM2LCAweDUzLCAweDQ1LCAweDlkLCAweDlmLCAweGMxLAorCTB4MzYsIDB4NmQsIDB4NzIsIDB4YzcsIDB4Y2UsIDB4ZjQsIDB4MDYsIDB4ZjksIDB4M2UsIDB4ZjAsIDB4NWIsIDB4YzcsCisJMHhmYSwgMHhjOCwgMHgzNSwgMHg1ZSwgMHg3NCwgMHg3NywgMHhlYiwgMHhjYywgMHhkYiwgMHhjMiwgMHgzYywgMHgyYSwKKwkweDA4LCAweGNkLCAweGIzLCAweDIyLCAweGQ1LCAweGJhLCAweGM4LCAweGViLCAweGY4LCAweGZkLCAweGFlLCAweDFlLAorCTB4ZjgsIDB4MGEsIDB4OGEsIDB4M2UsIDB4ZjMsIDB4YjgsIDB4NmMsIDB4NTUsIDB4YmUsIDB4MmMsIDB4MGQsIDB4ZDgsCisJMHg5ZiwgMHg0ZCwgMHhkNywgMHhmMywgMHhlZSwgMHhiOSwgMHg3MSwgMHhiZCwgMHhlNiwgMHgzZiwgMHgyOSwgMHgyOSwKKwkweDQ5LCAweDhjLCAweGQyLCAweGJlLCAweGI1LCAweGNiLCAweDRmLCAweDk3LCAweGRiLCAweDY0LCAweGRiLCAweGI0LAorCTB4Y2MsIDB4N2IsIDB4YzIsIDB4NWMsIDB4YjYsIDB4OTgsIDB4NGMsIDB4NDUsIDB4NDMsIDB4OWEsIDB4YTMsIDB4Y2EsCisJMHhiNywgMHhjMCwgMHhhMCwgMHhmMSwgMHhlYywgMHhlZSwgMHhmMiwgMHgzMywgMHg3ZCwgMHg4YywgMHg5ZCwgMHg3YywKKwkweGI0LCAweGNjLCAweDdiLCAweDAzLCAweDU3LCAweDQzLCAweDc2LCAweGVjLCAweDEwLCAweGI4LCAweDJjLCAweDQwLAorCTB4YzgsIDB4ZTQsIDB4YmEsIDB4NzMsIDB4YmUsIDB4Y2YsIDB4NzEsIDB4NmMsIDB4YTgsIDB4YTMsIDB4MmYsIDB4ZGEsCisJMHgyZSwgMHhjNSwgMHhhMywgMHhjMCwgMHg0NCwgMHgzNSwgMHhhNCwgMHg3MywgMHg4YSwgMHg3NiwgMHhhMiwgMHgxYSwKKwkweGEzLCAweDQzLCAweDM1LCAweGU2LCAweGM4LCAweDk5LCAweGZiLCAweDM1LCAweDVlLCAweDY3LCAweGFlLCAweDdkLAorCTB4NWYsIDB4Y2YsIDB4MDUsIDB4ZTUsIDB4NDIsIDB4Y2QsIDB4YTUsIDB4YWMsIDB4OWEsIDB4YjIsIDB4MDksIDB4NWQsCisJMHhkYiwgMHg2OCwgMHgyZSwgMHhmNSwgMHg3MywgMHhhZiwgMHhiNiwgMHg5YSwgMHgzZiwgMHhlOCwgMHhmMywgMHg3ZCwKKwkweDJkLCAweGQ2LCAweGZkLCAweGIwLCAweGNmLCAweGFmLCAweDhiLCAweDA3LCAweGJlLCAweDEzLCAweDdkLCAweGFjLAorCTB4MmEsIDB4ZTYsIDB4ZjYsIDB4YjIsIDB4MzQsIDB4NTcsIDB4N2YsIDB4MmMsIDB4NmYsIDB4NTcsIDB4N2UsIDB4MjQsCisJMHhiZiwgMHg1YSwgMHgzZCwgMHgwYiwgMHhmZSwgMHg2MSwgMHg1NSwgMHgwYiwgMHhiMCwgMHgyNywgMHgzNywgMHg5YSwKKwkweDllLCAweDc3LCAweGMzLCAweDNkLCAweDAzLCAweDVmLCAweGMxLCAweGYzLCAweGZlLCAweGUwLCAweDZlLCAweDRiLAorCTB4NjIsIDB4ZWMsIDB4M2IsIDB4OTgsIDB4NzMsIDB4MWUsIDB4M2EsIDB4NDQsIDB4MmMsIDB4OWMsIDB4ODIsIDB4YmMsCisJMHgyNSwgMHhmYiwgMHhhNSwgMHgyYiwgMHhhMiwgMHhlNSwgMHg2NCwgMHg2OCwgMHgyYywgMHg4YywgMHgzOSwgMHgxOCwKKwkweDAxLCAweDI3LCAweGU3LCAweDVjLCAweDQ2LCAweGZhLCAweDI5LCAweDMzLCAweDQ2LCAweGYzLCAweDE1LCAweDdjLAorCTB4M2YsIDB4MGMsIDB4YmQsIDB4ZDgsIDB4OGYsIDB4OWYsIDB4OTIsIDB4N2IsIDB4YTMsIDB4MTgsIDB4ZWIsIDB4MjgsCisJMHg2NSwgMHgyZiwgMHgyYywgMHg4OSwgMHgyNywgMHgzMSwgMHg4ZiwgMHg3YywgMHg5YiwgMHhkYywgMHgyZiwgMHg1ZCwKKwkweGU5LCAweDYzLCAweDVjLCAweGVlLCAweDdlLCAweDg5LCAweDY1LCAweGUzLCAweDRiLCAweDNkLCAweGUyLCAweDQ5LAorCTB4MWIsIDB4NmMsIDB4ZjksIDB4ZmMsIDB4MDksIDB4OWYsIDB4MzcsIDB4ZmQsIDB4NWEsIDB4MGQsIDB4YTMsIDB4YmQsCisJMHg1ZCwgMHg3OCwgMHg0NywgMHg5MSwgMHhlNywgMHgxNSwgMHhiYywgMHgzMCwgMHg3OCwgMHg3OSwgMHgwZSwgMHg3YywKKwkweDI4LCAweGQzLCAweGJjLCAweDIwLCAweDNiLCAweGEzLCAweDExLCAweGI0LCAweDIxLCAweDVmLCAweGQxLCAweDU4LAorCTB4MjIsIDB4ZDksIDB4MTIsIDB4NzMsIDB4YjAsIDB4OTgsIDB4MGYsIDB4ODUsIDB4MzEsIDB4OWUsIDB4MjEsIDB4NmUsCisJMHg3MCwgMHg4YywgMHhlZCwgMHgzYywgMHhiNywgMHgwYiwgMHhlYSwgMHg2YywgMHhjOCwgMHgwOCwgMHhlYiwgMHgyOCwKKwkweGRmLCAweDY5LCAweGNkLCAweGE5LCAweDYwLCAweDQzLCAweGYxLCAweGJlLCAweDExLCAweGM5LCAweGU4LCAweDcyLAorCTB4MGYsIDB4ZGUsIDB4NzcsIDB4NDEsIDB4ZTcsIDB4MjUsIDB4ZmEsIDB4ZWYsIDB4NGMsIDB4YTEsIDB4MGQsIDB4NzEsCisJMHgyNiwgMHgwNSwgMHgyZSwgMHhmMSwgMHhhMSwgMHg5YSwgMHgwMCwgMHhiZCwgMHg5OSwgMHgyOSwgMHhmNSwgMHhjOSwKKwkweDg0LCAweGI5LCAweDZmLCAweGNmLCAweDFjLCAweDBiLCAweGRhLCAweDU3LCAweDMwLCAweDhjLCAweDkxLCAweDYwLAorCTB4NGMsIDB4M2QsIDB4N2IsIDB4YzYsIDB4YzQsIDB4ZmUsIDB4ZjgsIDB4YzEsIDB4YzcsIDB4Y2QsIDB4MmMsIDB4MmYsCisJMHgwMiwgMHhhNywgMHgxNiwgMHg3ZiwgMHg5YiwgMHg3MSwgMHg5ZiwgMHg5NywgMHg2YywgMHhiNCwgMHg1ZCwgMHhmYiwKKwkweDM2LCAweDM1LCAweGVjLCAweDRiLCAweGI2LCAweGM0LCAweDc4LCAweGQ0LCAweGI3LCAweDgxLCAweDQzLCAweGZiLAorCTB4ODIsIDB4M2EsIDB4YjYsIDB4MTUsIDB4MjMsIDB4ODMsIDB4YjUsIDB4NGYsIDB4NmIsIDB4M2QsIDB4NjQsIDB4ZGQsCisJMHgxNywgMHgyNSwgMHhiMywgMHg5OCwgMHg5NywgMHg0OSwgMHhkZCwgMHg4ZiwgMHg2YiwgMHgzOCwgMHhhOCwgMHg3OSwKKwkweDA4LCAweDc1LCAweDM1LCAweDcxLCAweDA4LCAweDZiLCAweDk5LCAweDBjLCAweDA3LCAweDZkLCAweGY3LCAweDkxLAorCTB4YzksIDB4ZTMsIDB4ZWYsIDB4ZDMsIDB4NDAsIDB4NjcsIDB4ZjEsIDB4ZWMsIDB4MTAsIDB4ZjcsIDB4YTgsIDB4NWQsCisJMHgxMiwgMHhkZiwgMHg4NCwgMHhiZCwgMHgyYywgMHhiNSwgMHhlYSwgMHgyMywgMHhmMiwgMHg0OSwgMHhlOSwgMHhiMywKKwkweDNlLCAweDllLCAweDkzLCAweGZjLCAweGI1LCAweDY0LCAweGNhLCAweDQ3LCAweDI1LCAweDdkLCAweDdlLCAweDNhLAorCTB4MWQsIDB4MTIsIDB4ZWIsIDB4YmMsIDB4ZWYsIDB4NjcsIDB4MWYsIDB4OWQsIDB4OWUsIDB4NTcsIDB4N2MsIDB4N2UsCisJMHhmNCwgMHhmYywgMHhiYSwgMHhlYSwgMHg0NCwgMHhkYiwgMHgwOCwgMHhkYSwgMHg3MSwgMHgxYywgMHhhNiwgMHhlNCwKKwkweDRhLCAweDdmLCAweGY3LCAweDY2LCAweDhlLCAweDc5LCAweGRlLCAweGE0LCAweGNlLCAweGUxLCAweDRhLCAweDlhLAorCTB4ZjMsIDB4YWEsIDB4YzUsIDB4Y2YsIDB4MWQsIDB4MjksIDB4NDUsIDB4M2IsIDB4ZjAsIDB4YWQsIDB4YTQsIDB4YjksCisJMHhhZSwgMHg4ZSwgMHg2MiwgMHgzYywgMHgyYywgMHgxZiwgMHhhMiwgMHg0ZSwgMHhjNCwgMHhiNiwgMHg4NSwgMHhlZiwKKwkweGI3LCAweGE2LCAweGQ2LCAweDU0LCAweDMyLCAweDNlLCAweGE0LCAweGFjLCAweDc0LCAweDExLCAweGJmLCAweDM2LAorCTB4YTUsIDB4Y2YsIDB4MWUsIDB4NjMsIDB4NzEsIDB4MDUsIDB4ZGQsIDB4YzUsIDB4OWMsIDB4ZWMsIDB4ZTMsIDB4OWUsCisJMHgzNywgMHg2NSwgMHhiMywgMHgzZSwgMHg2OSwgMHg0NiwgMHgxNCwgMHhlMywgMHgyNiwgMHg1ZCwgMHhmYSwgMHg4YywKKwkweGYyLCAweGQyLCAweGUxLCAweGE0LCAweDc5LCAweDVjLCAweDFkLCAweDBjLCAweGVlLCAweDUzLCAweGMwLCAweGNjLAorCTB4ZGQsIDB4ZjcsIDB4OWQsIDB4NWQsIDB4NTMsIDB4YTYsIDB4NWMsIDB4MmUsIDB4MjUsIDB4ZTMsIDB4YjMsIDB4Y2EsCisJMHhjYSwgMHhlMywgMHg5ZCwgMHhmOSwgMHgwOSwgMHg0NSwgMHhkYywgMHg0OCwgMHg5YSwgMHg1ZCwgMHg4YSwgMHhiMSwKKwkweGNkLCAweDBlLCAweDNkLCAweGVmLCAweDI5LCAweGY0LCAweDRmLCAweGFhLCAweGI2LCAweDYwLCAweDNjLCAweGRjLAorCTB4YWYsIDB4Y2IsIDB4ZmQsIDB4YmUsIDB4Y2UsIDB4MTAsIDB4NzMsIDB4MDYsIDB4OGMsIDB4OTksIDB4NDUsIDB4ZTYsCisJMHg4MywgMHhlOSwgMHgzYywgMHg4NCwgMHg3NCwgMHg2MiwgMHg4YywgMHhmNywgMHg4NiwgMHgzYywgMHgzOCwgMHhmOSwKKwkweDBmLCAweGQ0LCAweGExLCAweDVjLCAweDY1LCAweDlkLCAweDEzLCAweGU4LCAweGRiLCAweDMxLCAweGNkLCAweDlmLAorCTB4MWYsIDB4OWMsIDB4MmMsIDB4ZTgsIDB4ZmMsIDB4YzQsIDB4MWQsIDB4OTUsIDB4MDgsIDB4ZTYsIDB4YmQsIDB4YmIsCisJMHg2NywgMHhmMSwgMHg4YywgMHhmYiwgMHgwNSwgMHhiZSwgMHg2NywgMHgzMSwgMHgzNCwgMHhkZSwgMHgyMSwgMHhjYywKKwkweDA3LCAweGNkLCAweDU1LCAweDVhLCAweGIyLCAweGMxLCAweGQ4LCAweDAwLCAweGNmLCAweGY3LCAweDViLCAweDY3LAorCTB4ZTUsIDB4MTcsIDB4YzQsIDB4MTgsIDB4ZWIsIDB4ZGMsIDB4MjMsIDB4MjcsIDB4ZTAsIDB4OWQsIDB4ZTAsIDB4YWIsCisJMHg3NSwgMHhiYywgMHhhNywgMHhiOCwgMHgyYywgMHgwNSwgMHhiZiwgMHhiZiwgMHg3NCwgMHgzMiwgMHhmZiwgMHhiNCwKKwkweDU4LCAweGZmLCAweGJjLCAweDc3LCAweGY4LCAweDM2LCAweDMwLCAweDg3LCAweGZiLCAweDA3LCAweDI3LCAweDI5LAorCTB4OWYsIDB4NWMsIDB4OWIsIDB4YjgsIDB4OWEsIDB4YmMsIDB4YzIsIDB4ZjEsIDB4MGMsIDB4NGEsIDB4NmUsIDB4MTksCisJMHhkYywgMHgwOCwgMHhiZiwgMHhmOSwgMHg2NSwgMHg3ZiwgMHhkZiwgMHhkNiwgMHhjMSwgMHhiMywgMHg3MywgMHgyNSwKKwkweDUzLCAweGViLCAweGViLCAweGFjLCAweGNiLCAweGIzLCAweDBmLCAweGU4LCAweDhhLCAweGNlLCAweDdiLCAweDYyLAorCTB4NWYsIDB4ZTYsIDB4MGEsIDB4MWUsIDB4YTEsIDB4N2QsIDB4NzQsIDB4NmEsIDB4MTIsIDB4NDUsIDB4NWIsIDB4NzIsCisJMHg1NiwgMHhkNiwgMHg4MywgMHhiZiwgMHhjMywgMHg2NiwgMHgxNiwgMHg1ZiwgMHg4ZCwgMHgwOCwgMHgzMCwgMHgzOSwKKwkweDE1LCAweDBmLCAweDFkLCAweDkwLCAweDc5LCAweGQ3LCAweDk1LCAweDQ2LCAweGYzLCAweDg0LCAweDVjLCAweDZiLAorCTB4M2EsIDB4ZmEsIDB4MTksIDB4ZWQsIDB4ZDksIDB4YzIsIDB4NmIsIDB4ZmEsIDB4NWMsIDB4M2EsIDB4ZmUsIDB4YTEsCisJMHhiMiwgMHg5YywgMHhhYiwgMHhmMCwgMHg2YiwgMHhiZSwgMHg3YiwgMHg4YywgMHg3OSwgMHhjMiwgMHhlMSwgMHg4MSwKKwkweDg3LCAweDc5LCAweDcwLCAweGMwLCAweDBlLCAweDcwLCAweDhlLCAweGI3LCAweGMwLCAweDM5LCAweGRlLCAweDA0LAorCTB4ZTcsIDB4ZjgsIDB4MjUsIDB4MzgsIDB4ZjYsIDB4OGQsIDB4Y2EsIDB4NTQsIDB4ODAsIDB4ZmYsIDB4ZDMsIDB4YzAsCisJMHgyMSwgMHhkYSwgMHg2YSwgMHhlYiwgMHgyYywgMHhmNiwgMHg3NCwgMHhiYSwgMHgwMCwgMHgxOSwgMHhmYywgMHgwMCwKKwkweGZlLCAweGM3LCAweDU2LCAweDI1LCAweDIzLCAweDFiLCAweGFiLCAweDkzLCAweGIyLCAweGI5LCAweGVhLCAweGU3LAorCTB4MWMsIDB4YmYsIDB4Y2IsIDB4M2MsIDB4YWQsIDB4NTEsIDB4ZWUsIDB4OTMsIDB4MDMsIDB4MWMsIDB4ZGEsIDB4MjcsCisJMHg4OSwgMHhlMywgMHhjNCwgMHg4ZiwgMHg0ZSwgMHg1OSwgMHgyYiwgMHhhZiwgMHg2OSwgMHgxYywgMHg1YSwgMHgyYiwKKwkweGIzLCAweDFjLCAweDEyLCAweDlkLCAweGYzLCAweDc1LCAweDY2LCAweDViLCAweDZhLCAweGVlLCAweDE2LCAweGVhLAorCTB4YmIsIDB4OTksIDB4ZGIsIDB4MTUsIDB4YzQsIDB4ZDYsIDB4ODksIDB4OTcsIDB4N2YsIDB4MGUsIDB4ZjYsIDB4NWUsCisJMHhlOSwgMHg1YywgMHhiOCwgMHgxOSwgMHhmMywgMHgwMCwgMHhkYSwgMHhiNSwgMHhiMCwgMHg2YiwgMHhjOCwgMHgzZiwKKwkweDI3LCAweDU3LCAweDdmLCAweDQxLCAweDFiLCAweDdjLCAweDAzLCAweDljLCAweGYxLCAweDJhLCAweDZjLCAweGM4LAorCTB4OGUsIDB4NzMsIDB4NDAsIDB4NzMsIDB4YmYsIDB4MWQsIDB4ZTcsIDB4ODgsIDB4Y2UsIDB4YWQsIDB4ZTUsIDB4N2IsCisJMHg4YSwgMHg2NSwgMHg1YiwgMHhlNiwgMHhjYSwgMHg1NiwgMHhiYywgMHgwMCwgMHhmOSwgMHhiYiwgMHgwNiwgMHhiZiwKKwkweDZkLCAweDAzLCAweDdiLCAweGIwLCAweDg5LCAweGI1LCAweGQ4LCAweDZhLCAweGQyLCAweGNlLCAweGJmLCAweGFmLAorCTB4YjEsIDB4NzcsIDB4YWQsIDB4ZjksIDB4MjcsIDB4YmMsIDB4YzcsIDB4M2EsIDB4OWIsIDB4OTYsIDB4M2YsIDB4ZjYsCisJMHgxMywgMHgwMywgMHg5OSwgMHg4ZiwgMHg5NywgMHhkNSwgMHhmZCwgMHhmZCwgMHg3ZSwgMHgxYiwgMHg2OCwgMHhiYiwKKwkweGQ5LCAweDI0LCAweDFlLCAweDhiLCAweDVjLCAweDJjLCAweGQ5LCAweGIwLCAweDI1LCAweDE3LCAweDYzLCAweGU0LAorCTB4MDAsIDB4NTUsIDB4ZDUsIDB4ZWEsIDB4ZTcsIDB4MDUsIDB4NjMsIDB4ZjYsIDB4YmMsIDB4ZmQsIDB4MzYsIDB4YzcsCisJMHhlNSwgMHgwNCwgMHhiOCwgMHg0ZCwgMHhkYiwgMHhiZiwgMHhhZCwgMHhiOSwgMHg0ZCwgMHhhOSwgMHhmMiwgMHhiYywKKwkweDVjLCAweDVmLCAweDRkLCAweDA1LCAweDFjLCAweDI3LCAweDJmLCAweDZmLCAweDgwLCAweGUzLCAweDM1LCAweDJiLAorCTB4YWQsIDB4MWMsIDB4ZWQsIDB4NzEsIDB4YWMsIDB4NTMsIDB4NDUsIDB4Y2QsIDB4MmQsIDB4NzUsIDB4YzksIDB4YTUsCisJMHg5NSwgMHhhMiwgMHhiYSwgMHhiYywgMHg1MiwgMHg1MiwgMHhhZiwgMHgyYywgMHg5NSwgMHg1NSwgMHg3MSwgMHhjOSwKKwkweGYzLCAweGZlLCAweGU5LCAweGNlLCAweGM4LCAweGRiLCAweGFiLCAweDllLCAweDljLCAweDc2LCAweDhkLCAweDgxLAorCTB4OTAsIDB4YjQsIDB4ZjIsIDB4ZGYsIDB4M2MsIDB4YWYsIDB4MTMsIDB4ZDgsIDB4YmMsIDB4NzUsIDB4ZDgsIDB4ZjMsCisJMHg5ZSwgMHgxOCwgMHgxZCwgMHgxNSwgMHhlNywgMHgzMCwgMHgzOSwgMHhjYSwgMHg3MCwgMHg4YywgMHgzOSwgMHhhYywKKwkweGM0LCAweDljLCAweDhjLCAweDZkLCAweDlmLCAweGFmLCAweDI5LCAweDA1LCAweDdjLCAweDNiLCAweGUwLCAweGYzLAorCTB4OTcsIDB4MjcsIDB4YmIsIDB4ODMsIDB4MzMsIDB4OGYsIDB4YjMsIDB4MmYsIDB4MzEsIDB4MjYsIDB4MWMsIDB4ZmIsCisJMHhhZiwgMHg5OCwgMHhiMCwgMHgyOSwgMHhlNywgMHhjYSwgMHg1OCwgMHg4OCwgMHhhZSwgMHhhOCwgMHg3YywgMHhhZiwKKwkweDFjLCAweDc5LCAweGFjLCAweDZjLCAweGUyLCAweGVhLCAweDE4LCAweGM1LCAweGYyLCAweDdkLCAweDZmLCAweDQ4LAorCTB4YzcsIDB4ZmUsIDB4YzEsIDB4NDksIDB4NGMsIDB4Y2YsIDB4OWIsIDB4NzUsIDB4ZjksIDB4YmQsIDB4MDMsIDB4OGMsCisJMHhjOSwgMHg5OCwgMHhkZCwgMHhiMCwgMHhmZiwgMHhhNywgMHhiNSwgMHg3ZCwgMHhhZSwgMHhhYSwgMHg4YywgMHg0ZCwKKwkweGZkLCAweDhlLCAweGNhLCAweDQ0LCAweDE5LCAweDM2LCAweDVlLCAweDMxLCAweDJmLCAweDk0LCAweDVjLCAweGMxLAorCTB4OGEsIDB4Y2QsIDB4MDIsIDB4M2IsIDB4NjYsIDB4ODAsIDB4MzcsIDB4NGYsIDB4ZWIsIDB4YjMsIDB4ZDEsIDB4NDMsCisJMHgxYSwgMHg3YiwgMHhlNiwgMHg1OCwgMHhjZSwgMHg0YiwgMHhiYSwgMHhlNiwgMHhmNiwgMHhlYSwgMHhmNSwgMHhiYiwKKwkweDdkLCAweGFkLCAweDE4LCAweGYzLCAweGY3LCAweDFjLCAweDdhLCAweDljLCAweGU3LCAweGY5LCAweDQwLCAweGFmLAorCTB4NjQsIDB4ZDcsIDB4Y2YsIDB4NDAsIDB4MjcsIDB4NjIsIDB4NTgsIDB4ZGIsIDB4YjAsIDB4ZDYsIDB4ODcsIDB4MWQsCisJMHhkOCwgMHhlZiwgMHgxZCwgMHgyNywgMHgxYywgMHg2MCwgMHg2YSwgMHgyNywgMHhlZSwgMHhkOSwgMHg2ZSwgMHgxMiwKKwkweGZkLCAweDNhLCAweDI0LCAweGIzLCAweGQ0LCAweGFlLCAweDcxLCAweGY1LCAweGQxLCAweGJhLCAweDM0LCAweDc4LAorCTB4NDgsIDB4MGUsIDB4ZTUsIDB4MTAsIDB4ZWEsIDB4ZTIsIDB4NDEsIDB4OTksIDB4ZGMsIDB4NmIsIDB4MWEsIDB4ZTUsCisJMHgzNiwgMHg1YywgMHhkOSwgMHhlNiwgMHgyOCwgMHg3OCwgMHgwNSwgMHhhZSwgMHhiZiwgMHhjMCwgMHhmYiwgMHg0NiwKKwkweDMxLCAweGU2LCAweGJjLCAweDI5LCAweGVmLCAweDlkLCAweGE0LCAweDJkLCAweDcxLCAweDBjLCAweGU2LCAweDFhLAorCTB4Y2YsIDB4ZGEsIDB4YjgsIDB4MzYsIDB4Y2EsIDB4MmEsIDB4YmIsIDB4YzgsIDB4MzIsIDB4YWUsIDB4NTUsIDB4ZmYsCisJMHhmOSwgMHgyMywgMHg5OCwgMHg4NCwgMHgzZSwgMHg5OSwgMHgxNSwgMHgxZiwgMHg5MywgMHhkZSwgMHhkYiwgMHhjNSwKKwkweDI0LCAweGQ2LCAweDc1LCAweGM4LCAweGM0LCAweDUyLCAweDVjLCAweDlkLCAweGJhLCAweDYyLCAweDQyLCAweGRlLAorCTB4YmEsIDB4MjQsIDB4YmIsIDB4MTIsIDB4ZDUsIDB4N2MsIDB4YjQsIDB4MDYsIDB4NTksIDB4NWMsIDB4ODcsIDB4NWMsCisJMHhhZCwgMHg0MSwgMHhhNiwgMHgzMiwgMHg2NSwgMHgyYiwgMHgzNSwgMHhhZCwgMHhlMiwgMHgzYSwgMHgyZSwgMHgzMCwKKwkweDA1LCAweDc5LCAweDBkLCAweGJmLCAweDRhLCAweDJlLCAweDRhLCAweGZkLCAweDc1LCAweGQwLCAweDQ2LCAweDY4LAorCTB4NDcsIDB4ZDMsIDB4NjEsIDB4NjUsIDB4NDMsIDB4MGUsIDB4MjEsIDB4OTcsIDB4NjUsIDB4NWYsIDB4N2YsIDB4ZGYsCisJMHg1MSwgMHgxYSwgMHg1NywgMHg1MywgMHg3NywgMHgyNCwgMHhlOSwgMHhkYywgMHgxMSwgMHhjYiwgMHhkZCwgMHhjMSwKKwkweGVmLCAweDM3LCAweGUyLCAweGNhLCAweDU1LCAweGU4LCAweGZiLCAweGViLCAweGY4LCAweDRlLCAweGY4LCAweDM1LAorCTB4NDMsIDB4OGUsIDB4MGQsIDB4NmIsIDB4OWQsIDB4NGUsIDB4NDksIDB4YzgsIDB4NzIsIDB4MzYsIDB4YzUsIDB4ZDcsCisJMHhmMSwgMHg3NSwgMHhhZCwgMHhlMywgMHg5MCwgMHgzNywgMHg2MCwgMHg5MCwgMHhhZiwgMHhkMywgMHhlOSwgMHg0MCwKKwkweDQ2LCAweGJmLCAweDAxLCAweGZkLCAweGI1LCAweGUwLCAweDk1LCAweGM1LCAweDY1LCAweDFlLCAweGZhLCAweDdmLAorCTB4MTUsIDB4Y2YsIDB4NmYsIDB4MzYsIDB4M2YsIDB4NTYsIDB4NzMsIDB4OGIsIDB4MmEsIDB4YzgsIDB4M2YsIDB4NzksCisJMHgwZSwgMHgzYywgMHhmOSwgMHhmNywgMHg1OCwgMHhiYiwgMHgxZSwgMHhjZCwgMHhkZCwgMHgxMywgMHhhMywgMHgzYywKKwkweDA3LCAweGZiLCAweGI3LCAweGJhLCAweDY0LCAweDFmLCAweDk3LCAweGRiLCAweDIzLCAweDI3LCAweDUwLCAweGVlLAorCTB4YzYsIDB4ZDUsIDB4YzAsIDB4M2EsIDB4NDQsIDB4ZjQsIDB4ZjksIDB4ZjUsIDB4NWEsIDB4NjksIDB4YzQsIDB4MjgsCisJMHhlYSwgMHgzMywgMHhlNiwgMHgzMSwgMHhmNCwgMHgyNSwgMHg5NiwgMHgxZCwgMHhjNiwgMHg3MywgMHhjNiwgMHg2NSwKKwkweDM4LCAweDM3LCAweDcwLCAweDI2LCAweDE1LCAweGQzLCAweDM5LCAweGExLCAweDM1LCAweDcwLCAweDg5LCAweDc1LAorCTB4YmMsIDB4ZWYsIDB4MTYsIDB4ZTMsIDB4N2EsIDB4MGQsIDB4ZTgsIDB4ZjAsIDB4YzgsIDB4NjcsIDB4NWUsIDB4M2EsCisJMHhjYSwgMHhiYywgMHhmMywgMHhmNywgMHg2MywgMHhiZSwgMHhmZCwgMHhmYiwgMHhjNCwgMHhiYiwgMHg2ZCwgMHhjZiwKKwkweGE1LCAweDBjLCAweGRjLCAweDdjLCAweDYwLCAweDAyLCAweGVmLCAweGM4LCAweGRiLCAweDYxLCAweDhiLCAweGFhLAorCTB4NWEsIDB4N2UsIDB4ZDksIDB4Y2UsIDB4ZWYsIDB4NWIsIDB4NmMsIDB4MjQsIDB4Y2QsIDB4NzcsIDB4YzUsIDB4ZWYsCisJMHgzYiwgMHg2ZiwgMHhkMywgMHhlZSwgMHg3NCwgMHgwMCwgMHg1ZiwgMHhlMiwgMHg5YSwgMHg1NywgMHhkZSwgMHhiMiwKKwkweDBiLCAweDQwLCAweDA1LCAweDJiLCAweDNlLCAweDA1LCAweDE5LCAweDZkLCAweDE3LCAweGNiLCAweGM5LCAweGM5LAorCTB4YzMsIDB4ZWYsIDB4Y2UsIDB4ZWEsIDB4YmUsIDB4NmMsIDB4ZGIsIDB4ZWEsIDB4ZGIsIDB4ZmEsIDB4MmUsIDB4YzcsCisJMHhjZiwgMHhiOSwgMHg3MCwgMHgwZSwgMHhmMCwgMHg2ZCwgMHg0YywgMHg1MywgMHhjYiwgMHhlOCwgMHg0ZSwgMHhjMywKKwkweDE4LCAweGYwLCAweDY1LCAweGI0LCAweDM1LCAweDhmLCAweGU4LCAweGZmLCAweDk5LCAweDA3LCAweGU1LCAweDY0LAorCTB4YzQsIDB4ZjAsIDB4Y2YsIDB4ZGIsIDB4NzEsIDB4NmQsIDB4NzAsIDB4M2QsIDB4M2YsIDB4MDYsIDB4YmYsIDB4ZGYsCisJMHgyYiwgMHgzZiwgMHhhZCwgMHgzOCwgMHhhMywgMHgyZiwgMHgzZiwgMHg0ZiwgMHhlYywgMHhjYSwgMHgwZiwgMHg3ZCwKKwkweGQ0LCAweDJlLCAweGM5LCAweGFkLCAweGQ4LCAweDMyLCAweDU5LCAweGQ2LCAweGZiLCAweDBkLCAweGFlLCAweGM5LAorCTB4ZjgsIDB4ZDEsIDB4MDksIDB4YzgsIDB4MGQsIDB4NjUsIDB4OWQsIDB4YmEsIDB4NjUsIDB4NGEsIDB4MTUsIDB4NzIsCisJMHg1NCwgMHgwNSwgMHgzZSwgMHg1NSwgMHgyMSwgMHg1MywgMHhlNCwgMHg0MCwgMHg1NSwgMHhlMCwgMHg1YiwgMHhiNSwKKwkweDY5LCAweDM5LCAweDc1LCAweGNjLCAweDk5LCAweDM2LCAweDdiLCAweDFkLCAweDcyLCAweDc0LCAweGI1LCAweGM5LAorCTB4ZmQsIDB4ZDcsIDB4NjMsIDB4MzYsIDB4NjksIDB4MDcsIDB4NmYsIDB4ZWUsIDB4ZWUsIDB4ZmQsIDB4YTcsIDB4ZDgsCisJMHhmYiwgMHgyMywgMHg3MiwgMHgwZCwgMHg3ZSwgMHhjYiwgMHhmNSwgMHhjYSwgMHgwOCwgMHgzMCwgMHg0OSwgMHg4MCwKKwkweDUxLCAweDJlLCAweDY0LCAweDIzLCAweDI1LCAweDFiLCAweDk1LCAweDcxLCAweGQ5LCAweDg0LCAweDdkLCAweGRhLAorCTB4NWEsIDB4NGQsIDB4ODAsIDB4NGYsIDB4MDMsIDB4NDcsIDB4YWYsIDB4MWMsIDB4OTMsIDB4MzcsIDB4NTYsIDB4OTUsCisJMHhjYywgMHhkOCwgMHhiMCwgMHgzMywgMHg2YiwgMHg4YywgMHhjMSwgMHg0MywgMHg5ZSwgMHhhYiwgMHg1ZCwgMHhmYSwKKwkweGJjLCAweDdkLCAweGEyLCAweGVlLCAweGM3LCAweGUyLCAweDczLCAweGY1LCAweDFlLCAweDk5LCAweGFjLCAweDliLAorCTB4ZjIsIDB4NTQsIDB4YmQsIDB4NTcsIDB4YmUsIDB4NWEsIDB4OGYsIDB4Y2EsIDB4ZTksIDB4NDYsIDB4NGMsIDB4YmUsCisJMHg1NiwgMHgxZiwgMHg5NCwgMHhhNywgMHhlYiwgMHg0NywgMHhlNCwgMHg5OSwgMHg0NiwgMHg1YywgMHhiZSwgMHgwZSwKKwkweGJmLCAweDMwLCAweGRmLCAweDcwLCAweDY0LCAweGFhLCAweDMxLCAweDIyLCAweGE3LCAweDFhLCAweDhjLCAweGIxLAorCTB4ZTMsIDB4N2IsIDB4ZjgsIDB4NjUsIDB4NzcsIDB4NjMsIDB4MTcsIDB4MWMsIDB4NTcsIDB4MjcsIDB4YzYsIDB4ZTUsCisJMHhhOCwgMHg5YywgMHgzZSwgMHg2ZiwgMHg5NCwgMHhiYywgMHgxZiwgMHhmZiwgMHgxMCwgMHg3OSwgMHgwMSwgMHg3ZCwKKwkweDE3LCAweGFlLCAweDI4LCAweGE5LCAweGU5LCAweGVmLCAweGI3LCAweGZlLCAweDQ3LCAweDI0LCAweGEyLCAweDdkLAorCTB4YTMsIDB4MTcsIDB4YWEsIDB4ODMsIDB4NjgsIDB4NjMsIDB4ZDMsIDB4MjcsIDB4MDksIDB4ZTIsIDB4MjAsIDB4YWQsCisJMHhmOCwgMHg3ZiwgMHhjYiwgMHhmNywgMHgzMiwgMHg3NCwgMHgwYywgMHhmYiwgMHgyNiwgMHg3ZCwgMHgyZiwgMHhiZCwKKwkweGY2LCAweGM0LCAweDBmLCAweGZhLCAweDM5LCAweGY0LCAweGI1LCAweGY2LCAweDllLCAweDUxLCAweGI0LCAweGJlLAorCTB4YmIsIDB4OTAsIDB4N2YsIDB4ZjQsIDB4N2YsIDB4NTEsIDB4ZmMsIDB4YjMsIDB4YTYsIDB4NzMsIDB4OGQsIDB4NDEsCisJMHhmZSwgMHg0ZiwgMHgwYSwgMHhjNiwgMHhmMiwgMHhmOSwgMHhmOSwgMHhkZCwgMHg5MywgMHg5NSwgMHgwOSwgMHhmNSwKKwkweDU0LCAweDg1LCAweDhjLCAweGM2LCAweDkzLCAweDg1LCAweGRkLCAweDNjLCAweGJhLCAweGFmLCAweGM4LCAweDlhLAorCTB4MWIsIDB4ZDEsIDB4NjMsIDB4ZjAsIDB4ZTMsIDB4ZjYsIDB4NjksIDB4OWQsIDB4NTMsIDB4MzcsIDB4MzEsIDB4NGMsCisJMHhmOSwgMHhlMywgMHgxOSwgMHg1YSwgMHg0ZiwgMHg3MCwgMHhiNiwgMHgwMCwgMHg2ZSwgMHhlYiwgMHg5YSwgMHg3MiwKKwkweGIxLCAweGVlLCAweGM3LCAweGFmLCAweGU2LCAweGI0LCAweGJjLCAweDVjLCAweDg3LCAweGNjLCAweGYxLCAweGZjLAorCTB4YzEsIDB4YmYsIDB4MTYsIDB4YWEsIDB4N2UsIDB4ZGYsIDB4ZWMsIDB4YjAsIDB4NDMsIDB4N2YsIDB4MWMsIDB4ZjMsCisJMHgzNSwgMHg3YSwgMHhmOSwgMHgyZCwgMHhmZSwgMHg0ZiwgMHgwZSwgMHhjYSwgMHhjMSwgMHg3OCwgMHg5OSwgMHgwZiwKKwkweDZjLCAweDZiLCAweDU5LCAweGY0LCAweGNmLCAweDY3LCAweDFkLCAweDc5LCAweDExLCAweDdiLCAweDUxLCAweDMzLAorCTB4MzksIDB4ZmUsIDB4NGUsIDB4YTksIDB4MzksIDB4ZjQsIDB4NmQsIDB4ODksIDB4ZGYsIDB4YzMsIDB4NTIsIDB4YzUsCisJMHg3NywgMHg2YSwgMHg0ZSwgMHgyYiwgMHgzNiwgMHhlNiwgMHhlMywgMHg2YywgMHhjZCwgMHg3YywgMHhmOCwgMHhkZCwKKwkweGU5LCAweGVhLCAweDQxLCAweGRjLCAweGEzLCAweGNlLCAweDAxLCAweDY3LCAweDNhLCAweGMzLCAweGZiLCAweDA1LAorCTB4OTQsIDB4MTksIDB4MWIsIDB4OTksIDB4YzMsIDB4MzUsIDB4MTYsIDB4ZDQsIDB4ZmQsIDB4N2MsIDB4NDAsIDB4NzMsCisJMHhmNSwgMHhmMSwgMHg4NywgMHhmZCwgMHg2NiwgMHhhYSwgMHg1NiwgMHgyMSwgMHgxMywgMHhiYSwgMHhhYiwgMHg4YywKKwkweDlmLCAweGFkLCAweDBmLCAweDEwLCAweDczLCAweDBmLCAweGRhLCAweGZjLCAweDQ1LCAweGU0LCAweDZmLCAweGE2LAorCTB4OGUsIDB4MjksIDB4MDQsIDB4Y2YsIDB4ZjYsIDB4YzksIDB4YjMsIDB4MjYsIDB4NzMsIDB4Y2QsIDB4ZDMsIDB4NmEsCisJMHhhMiwgMHhmMiwgMHg3MiwgMHg5MCwgMHg1NywgMHg3YiwgMHg1NywgMHgxZCwgMHhhYywgMHgzNSwgMHgwNywgMHhmYywKKwkweGJjLCAweDc0LCAweGJlLCAweDdiLCAweDZmLCAweDJlLCAweGZhLCAweDVlLCAweDM5LCAweDYxLCAweDRlLCAweDdhLAorCTB4MDcsIDB4NzgsIDB4YWIsIDB4MzYsIDB4NjIsIDB4ZDAsIDB4NDEsIDB4ZTAsIDB4OWQsIDB4ZGQsIDB4YTYsIDB4ZjUsCisJMHhiMSwgMHhkOCwgMHhmOCwgMHg5NywgMHhiNywgMHhhZCwgMHhmNSwgMHhiOSwgMHgxNSwgMHg2MywgMHhiOCwgMHgzNSwKKwkweDQwLCAweGRmLCAweDk2LCAweGI4LCAweDcxLCAweGQxLCAweDhmLCAweDFiLCAweDY5LCAweDFmLCAweDFhLCAweDU4LAorCTB4ODEsIDB4M2EsIDB4ZWEsIDB4MmEsIDB4ZjQsIDB4NjQsIDB4YjcsIDB4MmQsIDB4ZmYsIDB4ZmUsIDB4MDMsIDB4N2QsCisJMHhlNywgMHg5NSwgMHhmMCwgMHgyYywgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCB9OwogCiBzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Owotc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd1JvZGF0YVsoMHgyOC80KSArIDFdID0gewotCTB4MDgwMDQ2OGMsIDB4MDgwMDQ1OGMsIDB4MDgwMDQ2MzAsIDB4MDgwMDQ2NDgsIDB4MDgwMDQ2NjAsIDB4MDgwMDQ2ODAsCi0JMHgwODAwNDY4YywgMHgwODAwNDY4YywgMHgwODAwNDU5NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9Owotc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd0Jzc1soMHgxM2E0LzQpICsgMV0gPSB7IDB4MCB9Owotc3RhdGljIHUzMiBibngyX1JYUF9iMDZGd1Nic3NbKDB4MWMvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfUlhQX2IwNkZ3Um9kYXRhWygweDI3OC80KSArIDFdID0geworCTB4MDgwMDNmZGMsIDB4MDgwMDNlZGMsIDB4MDgwMDNmODAsIDB4MDgwMDNmOTgsIDB4MDgwMDNmYjAsIDB4MDgwMDNmZDAsCisJMHgwODAwM2ZkYywgMHgwODAwM2ZkYywgMHgwODAwM2VlNCwgMHgwMDAwMDAwMCwgMHgwODAwNGEwNCwgMHgwODAwNGEzYywKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YTc0LCAweDA4MDA0YzM4LAorCTB4MDgwMDRiODAsIDB4MDgwMDRiYjgsIDB4MDgwMDRjMzgsIDB4MDgwMDRiMDgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGJiOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YmY4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRiZjgsIDB4MDgwMDRiODAsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRiZjgsCisJMHgwODAwNGJmOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LCAweDA4MDA0YzM4LAorCTB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsIDB4MDgwMDRjMzgsCisJMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwgMHgwODAwNGMzOCwKKwkweDA4MDA0YWU0LCAweDAwMDAwMDAwLCAweDA4MDA2MDE4LCAweDA4MDA2MDMwLCAweDA4MDA2MDMwLCAweDA4MDA2MDMwLAorCTB4MDgwMDYwMTgsIDB4MDgwMDYwMzAsIDB4MDgwMDYwMzAsIDB4MDgwMDYwMzAsIDB4MDgwMDYwMTgsIDB4MDgwMDYwMzAsCisJMHgwODAwNjAzMCwgMHgwODAwNjAzMCwgMHgwODAwNjAxOCwgMHgwODAwNjAzMCwgMHgwODAwNjAzMCwgMHgwODAwNjAzMCwKKwkweDA4MDA2MDI0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH07CisKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndCc3NbKDB4MTNkYy80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA2RndTYnNzWygweDJjLzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9yeHBfZndfMDYgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgyLAorCS52ZXJfbWlub3IJCQk9IDB4OCwKKwkudmVyX2ZpeAkJCT0gMHgxNywKKworCS5zdGFydF9hZGRyCQkJPSAweDA4MDAzMTg0LAorCisJLnRleHRfYWRkcgkJCT0gMHgwODAwMDAwMCwKKwkudGV4dF9sZW4JCQk9IDB4NjcyOCwKKwkudGV4dF9pbmRleAkJCT0gMHgwLAorCS5nel90ZXh0CQkJPSBibngyX1JYUF9iMDZGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9SWFBfYjA2RndUZXh0KSwKKworCS5kYXRhX2FkZHIJCQk9IDB4MDgwMDY5YzAsCisJLmRhdGFfbGVuCQkJPSAweDAsCisJLmRhdGFfaW5kZXgJCQk9IDB4MCwKKwkuZGF0YQkJCQk9IGJueDJfUlhQX2IwNkZ3RGF0YSwKKworCS5zYnNzX2FkZHIJCQk9IDB4MDgwMDY5YzAsCisJLnNic3NfbGVuCQkJPSAweDJjLAorCS5zYnNzX2luZGV4CQkJPSAweDAsCisJLnNic3MJCQkJPSBibngyX1JYUF9iMDZGd1Nic3MsCisKKwkuYnNzX2FkZHIJCQk9IDB4MDgwMDY5ZjAsCisJLmJzc19sZW4JCQk9IDB4MTNkYywKKwkuYnNzX2luZGV4CQkJPSAweDAsCisJLmJzcwkJCQk9IGJueDJfUlhQX2IwNkZ3QnNzLAorCisJLnJvZGF0YV9hZGRyCQkJPSAweDA4MDA2NzI4LAorCS5yb2RhdGFfbGVuCQkJPSAweDI3OCwKKwkucm9kYXRhX2luZGV4CQkJPSAweDAsCisJLnJvZGF0YQkJCQk9IGJueDJfUlhQX2IwNkZ3Um9kYXRhLAorfTsKIAogc3RhdGljIHU4IGJueDJfcnYycF9wcm9jMVtdID0gewogCTB4MWYsIDB4OGIsIDB4MDgsIDB4MDgsIDB4NWUsIDB4ZDAsIDB4NDEsIDB4NDQsIDB4MDAsIDB4MDMsIDB4NzQsIDB4NjUsCkBAIC0xMzE2LDIwICsxNjY1LDYgQEAKIAkweDYzLCAweGQ2LCAweDExLCAweDhmLCAweDQ3LCAweGQ1LCAweDVmLCAweDNmLCAweDk3LCAweDhmLCAweDMxLCAweGQ4LAogCTB4MTcsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndSZWxlYXNlTWFqb3IgPSAweDE7Ci1zdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd1JlbGVhc2VNaW5vciA9IDB4MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9UUEFUX2IwNkZ3UmVsZWFzZUZpeCA9IDB4MDsKLXN0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3U3RhcnRBZGRyID0gMHgwODAwMDg2MDsKLXN0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3VGV4dEFkZHIgPSAweDA4MDAwODAwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndUZXh0TGVuID0gMHgxMjJjOwotc3RhdGljIGNvbnN0IHUzMiBibngyX1RQQVRfYjA2RndEYXRhQWRkciA9IDB4MDgwMDFhNjA7Ci1zdGF0aWMgY29uc3QgaW50IGJueDJfVFBBVF9iMDZGd0RhdGFMZW4gPSAweDA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFBBVF9iMDZGd1JvZGF0YUFkZHIgPSAweDAwMDAwMDAwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndSb2RhdGFMZW4gPSAweDA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFBBVF9iMDZGd0Jzc0FkZHIgPSAweDA4MDAxYWEwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndCc3NMZW4gPSAweDI1MDsKLXN0YXRpYyBjb25zdCB1MzIgYm54Ml9UUEFUX2IwNkZ3U2Jzc0FkZHIgPSAweDA4MDAxYTYwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RQQVRfYjA2RndTYnNzTGVuID0gMHgzNDsKIHN0YXRpYyB1OCBibngyX1RQQVRfYjA2RndUZXh0W10gPSB7CiAJMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHg0NywgMHhkMiwgMHg0MSwgMHg0NCwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKIAkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGM1LCAweDU3LCAweDRkLCAweDY4LApAQCAtMTUyOSwyMCArMTg2NCw0MCBAQAogc3RhdGljIHUzMiBibngyX1RQQVRfYjA2RndCc3NbKDB4MjUwLzQpICsgMV0gPSB7IDB4MCB9Owogc3RhdGljIHUzMiBibngyX1RQQVRfYjA2RndTYnNzWygweDM0LzQpICsgMV0gPSB7IDB4MCB9OwogCi1zdGF0aWMgY29uc3QgaW50IGJueDJfVFhQX2IwNkZ3UmVsZWFzZU1ham9yID0gMHgxOwotc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd1JlbGVhc2VNaW5vciA9IDB4MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9UWFBfYjA2RndSZWxlYXNlRml4ID0gMHgwOwotc3RhdGljIGNvbnN0IHUzMiBibngyX1RYUF9iMDZGd1N0YXJ0QWRkciA9IDB4MDgwMDM0YjA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3VGV4dEFkZHIgPSAweDA4MDAwMDAwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd1RleHRMZW4gPSAweDU3NDg7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3RGF0YUFkZHIgPSAweDA4MDA1NzYwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd0RhdGFMZW4gPSAweDA7Ci1zdGF0aWMgY29uc3QgdTMyIGJueDJfVFhQX2IwNkZ3Um9kYXRhQWRkciA9IDB4MDAwMDAwMDA7Ci1zdGF0aWMgY29uc3QgaW50IGJueDJfVFhQX2IwNkZ3Um9kYXRhTGVuID0gMHgwOwotc3RhdGljIGNvbnN0IHUzMiBibngyX1RYUF9iMDZGd0Jzc0FkZHIgPSAweDA4MDA1N2EwOwotc3RhdGljIGNvbnN0IGludCBibngyX1RYUF9iMDZGd0Jzc0xlbiA9IDB4MWM0Owotc3RhdGljIGNvbnN0IHUzMiBibngyX1RYUF9iMDZGd1Nic3NBZGRyID0gMHgwODAwNTc2MDsKLXN0YXRpYyBjb25zdCBpbnQgYm54Ml9UWFBfYjA2RndTYnNzTGVuID0gMHgzODsKK3N0YXRpYyBzdHJ1Y3QgZndfaW5mbyBibngyX3RwYXRfZndfMDYgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgxLAorCS52ZXJfbWlub3IJCQk9IDB4MCwKKwkudmVyX2ZpeAkJCT0gMHgwLAorCisJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDA4NjAsCisKKwkudGV4dF9hZGRyCQkJPSAweDA4MDAwODAwLAorCS50ZXh0X2xlbgkJCT0gMHgxMjJjLAorCS50ZXh0X2luZGV4CQkJPSAweDAsCisJLmd6X3RleHQJCQk9IGJueDJfVFBBVF9iMDZGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9UUEFUX2IwNkZ3VGV4dCksCisKKwkuZGF0YV9hZGRyCQkJPSAweDA4MDAxYTYwLAorCS5kYXRhX2xlbgkJCT0gMHgwLAorCS5kYXRhX2luZGV4CQkJPSAweDAsCisJLmRhdGEJCQkJPSBibngyX1RQQVRfYjA2RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwMWE2MCwKKwkuc2Jzc19sZW4JCQk9IDB4MzQsCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfVFBBVF9iMDZGd1Nic3MsCisKKwkuYnNzX2FkZHIJCQk9IDB4MDgwMDFhYTAsCisJLmJzc19sZW4JCQk9IDB4MjUwLAorCS5ic3NfaW5kZXgJCQk9IDB4MCwKKwkuYnNzCQkJCT0gYm54Ml9UUEFUX2IwNkZ3QnNzLAorCisJLnJvZGF0YV9hZGRyCQkJPSAweDAwMDAwMDAwLAorCS5yb2RhdGFfbGVuCQkJPSAweDAsCisJLnJvZGF0YV9pbmRleAkJCT0gMHgwLAorCS5yb2RhdGEJCQkJPSBibngyX1RQQVRfYjA2RndSb2RhdGEsCit9OworCiBzdGF0aWMgdTggYm54Ml9UWFBfYjA2RndUZXh0W10gPSB7CiAJMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHgyMSwgMHhkMywgMHg0MSwgMHg0NCwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKIAkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGVkLCAweDVjLCAweDZkLCAweDZjLApAQCAtMTk2NCwzICsyMzE5LDM4IEBACiBzdGF0aWMgdTMyIGJueDJfVFhQX2IwNkZ3Um9kYXRhWygweDAvNCkgKyAxXSA9IHsgMHgwIH07CiBzdGF0aWMgdTMyIGJueDJfVFhQX2IwNkZ3QnNzWygweDFjNC80KSArIDFdID0geyAweDAgfTsKIHN0YXRpYyB1MzIgYm54Ml9UWFBfYjA2RndTYnNzWygweDM4LzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml90eHBfZndfMDYgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgxLAorCS52ZXJfbWlub3IJCQk9IDB4MCwKKwkudmVyX2ZpeAkJCT0gMHgwLAorCisJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDM0YjAsCisKKwkudGV4dF9hZGRyCQkJPSAweDA4MDAwMDAwLAorCS50ZXh0X2xlbgkJCT0gMHg1NzQ4LAorCS50ZXh0X2luZGV4CQkJPSAweDAsCisJLmd6X3RleHQJCQk9IGJueDJfVFhQX2IwNkZ3VGV4dCwKKwkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX1RYUF9iMDZGd1RleHQpLAorCisJLmRhdGFfYWRkcgkJCT0gMHgwODAwNTc2MCwKKwkuZGF0YV9sZW4JCQk9IDB4MCwKKwkuZGF0YV9pbmRleAkJCT0gMHgwLAorCS5kYXRhCQkJCT0gYm54Ml9UWFBfYjA2RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwNTc2MCwKKwkuc2Jzc19sZW4JCQk9IDB4MzgsCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfVFhQX2IwNkZ3U2JzcywKKworCS5ic3NfYWRkcgkJCT0gMHgwODAwNTdhMCwKKwkuYnNzX2xlbgkJCT0gMHgxYzQsCisJLmJzc19pbmRleAkJCT0gMHgwLAorCS5ic3MJCQkJPSBibngyX1RYUF9iMDZGd0JzcywKKworCS5yb2RhdGFfYWRkcgkJCT0gMHgwMDAwMDAwMCwKKwkucm9kYXRhX2xlbgkJCT0gMHgwLAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9UWFBfYjA2RndSb2RhdGEsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyX2Z3Mi5oIGIvZHJpdmVycy9uZXQvYm54Ml9mdzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBjNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm54Ml9mdzIuaApAQCAtMCwwICsxLDQwODYgQEAKKy8qIGJueDJfZncyLmg6IEJyb2FkY29tIE5YMiBuZXR3b3JrIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGV4Y2VwdCBhcyBub3RlZCBiZWxvdy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZmlybXdhcmUgZGF0YSBkZXJpdmVkIGZyb20gcHJvcHJpZXRhcnkgdW5wdWJsaXNoZWQKKyAqIHNvdXJjZSBjb2RlLCBDb3B5cmlnaHQgKGMpIDIwMDYgQnJvYWRjb20gQ29ycG9yYXRpb24uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpcm13YXJlIGRhdGEKKyAqIGluIGhleGFkZWNpbWFsIG9yIGVxdWl2YWxlbnQgZm9ybWF0LCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMKKyAqIGFjY29tcGFueWluZyBpdC4KKyAqLworCitzdGF0aWMgdTggYm54Ml9DT01fYjA5RndUZXh0W10gPSB7CisJMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHhhYywgMHhmYiwgMHgyZiwgMHg0NSwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKKwkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGRjLCAweDViLCAweDZiLCAweDcwLAorCTB4MWIsIDB4ZDcsIDB4NzUsIDB4M2UsIDB4ZmIsIDB4MDAsIDB4MDksIDB4OTEsIDB4MTAsIDB4YjUsIDB4YTQsIDB4NjAsCisJMHgxYSwgMHg5NiwgMHg2OCwgMHgwNywgMHgyMCwgMHg1NywgMHgyMiwgMHg2YSwgMHhiMSwgMHgyOSwgMHg0YywgMHgzMywKKwkweDE2LCAweDliLCAweGMyLCAweDEyLCAweDAyLCAweDUwLCAweGFlLCAweDI2LCAweGMzLCAweDNhLCAweDk0LCAweGNkLAorCTB4ZDgsIDB4NGEsIDB4YWEsIDB4YzksIDB4MzAsIDB4MDAsIDB4YTUsIDB4ZjQsIDB4NjEsIDB4YjcsIDB4OTIsIDB4YWIsCisJMHhhOSwgMHg1ZCwgMHhkNywgMHhhYSwgMHgyMSwgMHg5MiwgMHg2YSwgMHhmNSwgMHg4MywgMHhlNSwgMHgyYSwgMHgxNiwKKwkweDQzLCAweGE5LCAweGQzLCAweDc0LCAweGMyLCAweDEyLCAweDU2LCAweGFjLCAweDRlLCAweDMxLCAweDg1LCAweGZjLAorCTB4ZDYsIDB4MzgsIDB4YjEsIDB4YzksIDB4NGEsIDB4NzYsIDB4ZWIsIDB4ZjQsIDB4ZTEsIDB4YTYsIDB4MzMsIDB4Y2QsCisJMHhhMywgMHg5ZCwgMHgzNiwgMHhmNiwgMHhhOCwgMHgzZiwgMHhlYSwgMHhlOSwgMHhkMywgMHgzMywgMHg2ZSwgMHhhNywKKwkweGVhLCAweGQ4LCAweDBlLCAweGZhLCAweDdkLCAweDc3LCAweDc3LCAweDgxLCAweDI1LCAweDQ4LCAweGJkLCAweGZjLAorCTB4YzgsIDB4OGYsIDB4NzAsIDB4MDYsIDB4YjMsIDB4N2IsIDB4ZWYsIDB4ZGUsIDB4YmQsIDB4ZjcsIDB4ZGMsIDB4ZjMsCisJMHhmOCwgMHhjZSwgMHg2MywgMHgyZiwgMHhmYiwgMHg0NCwgMHg1YSwgMHhjNCwgMHhmYiwgMHg1YiwgMHg4YiwgMHg1ZiwKKwkweGZjLCAweGZlLCAweDVmLCAweDJkLCAweDdjLCAweDdjLCAweGYwLCAweGUzLCAweGZkLCAweDIyLCAweGI3LCAweGRjLAorCTB4YTIsIDB4YjcsIDB4ODYsIDB4NzUsIDB4ZjYsIDB4MWIsIDB4ZjgsIDB4NDUsIDB4ZjEsIDB4ZWIsIDB4ZjcsIDB4ZWUsCisJMHg1NywgMHhmYiwgMHhiMywgMHhmMCwgMHg3YiwgMHgxMywgMHgwZiwgMHhjNywgMHhmZSwgMHg1NSwgMHg0NCwgMHhiYiwKKwkweGM0LCAweDk4LCAweGUwLCAweDVmLCAweGI1LCAweDdhLCAweGY5LCAweGU3LCAweDVjLCAweDM4LCAweDdlLCAweDg5LAorCTB4NjcsIDB4ODYsIDB4YmIsIDB4OWMsIDB4YTIsIDB4OTcsIDB4M2YsIDB4MDksIDB4ZWIsIDB4NjksIDB4MzksIDB4OTQsCisJMHhiNSwgMHgyNSwgMHg2YywgMHhhNCwgMHhkZiwgMHgzYywgMHg1NCwgMHhiMCwgMHg0NSwgMHgzMiwgMHhlNSwgMHgyZCwKKwkweGYxLCAweDljLCAweGJjLCAweDU3LCAweDJkLCAweDQ2LCAweDRkLCAweDYxLCAweGZmLCAweDhkLCAweGU5LCAweDc3LAorCTB4YmYsIDB4ZjYsIDB4ZTIsIDB4ZDYsIDB4YzQsIDB4NWIsIDB4ZjMsIDB4ODYsIDB4ODQsIDB4YWQsIDB4ZjQsIDB4MTksCisJMHhiMSwgMHgzNiwgMHg0YiwgMHhiOCwgMHgwYiwgMHhlZiwgMHg3YywgMHhiNSwgMHhmNywgMHgzZCwgMHg5MSwgMHgzNiwKKwkweDdmLCAweGFlLCAweDM3LCAweGFiLCAweDJmLCAweGY2LCAweDRhLCAweDcxLCAweDQzLCAweDNhLCAweDJjLCAweDdhLAorCTB4N2EsIDB4ZDMsIDB4ZjcsIDB4YjMsIDB4ODYsIDB4MzUsIDB4NjYsIDB4YTQsIDB4MmQsIDB4NTksIDB4YWMsIDB4YzgsCisJMHhjOCwgMHhkZSwgMHg2OSwgMHgwOSwgMHg4NywgMHhkMywgMHg0NywgMHg5YiwgMHg5YiwgMHgzNywgMHg0OSwgMHhkOCwKKwkweDRjLCAweDhmLCAweDFkLCAweGZhLCAweDZkLCAweGZiLCAweGQxLCAweGFhLCAweDZlLCAweGRiLCAweGM5LCAweDA1LAorCTB4ODksIDB4MGMsIDB4OWUsIDB4MWEsIDB4YzAsIDB4ZjMsIDB4NzIsIDB4MjIsIDB4MjksIDB4YjIsIDB4NTUsIDB4NzQsCisJMHhiYiwgMHgxOCwgMHgzMSwgMHhlYywgMHhiMCwgMHg2NCwgMHgyYiwgMHhiNiwgMHhlNCwgMHgyYSwgMHgyMiwgMHg3ZiwKKwkweDVlLCAweGQ2LCAweGU0LCAweDk0LCAweGRkLCAweDI5LCAweDBiLCAweDdkLCAweGVmLCAweDU2LCAweDMzLCAweGEwLAorCTB4ZTUsIDB4Y2YsIDB4ZWMsIDB4YjEsIDB4NDMsIDB4NTMsIDB4MzYsIDB4ZTksIDB4OWQsIDB4NmQsIDB4NzYsIDB4ZTksCisJMHg5ZCwgMHg2YSwgMHgyYSwgMHhkOCwgMHhhNiwgMHg0YywgMHg5NCwgMHhkOSwgMHgzNywgMHhhMiwgMHhiMywgMHgyZiwKKwkweDk0LCAweDdlLCAweDY4LCAweGNkLCAweDI5LCAweDNiLCAweGUyLCAweGY1LCAweGVkLCAweGRjLCAweDllLCAweGM1LAorCTB4N2MsIDB4OTMsIDB4NjUsIDB4OGUsIDB4M2QsIDB4OTMsIDB4MmEsIDB4ZDgsIDB4NTEsIDB4YWYsIDB4M2YsIDB4NzksCisJMHg1YiwgMHhkNiwgMHg4ZSwgMHhhMSwgMHhiZiwgMHhjYiwgMHg3YiwgMHg3NiwgMHhmMiwgMHhiZSwgMHg4MiwgMHg2ZCwKKwkweDdiLCAweGNmLCAweGJlLCAweDhhLCAweGI5LCAweDkzLCAweDVlLCAweGZmLCAweDdkLCAweGRiLCAweDBhLCAweDc2LAorCTB4OWYsIDB4ZDcsIDB4M2YsIDB4YmQsIDB4MmQsIDB4NmIsIDB4YTcsIDB4YmMsIDB4ZmUsIDB4ZTQsIDB4ZWUsIDB4ODIsCisJMHgzZCwgMHhlMCwgMHhmNSwgMHg5ZiwgMHhiZCwgMHgzZCwgMHg2YiwgMHgwZiwgMHg3YSwgMHhmZCwgMHgwZiwgMHg2ZCwKKwkweDJkLCAweGQ4LCAweDY5LCAweGY0LCAweDFmLCAweDZkLCAweGQ2LCAweDM3LCAweDU5LCAweDcyLCAweGE0LCAweDFjLAorCTB4YzcsIDB4MmYsIDB4ODMsIDB4NjcsIDB4NDMsIDB4ZTgsIDB4ZGIsIDB4ODksIDB4ZGYsIDB4MzAsIDB4N2UsIDB4YmYsCisJMHhiOCwgMHg0ZSwgMHhkYSwgMHg0NiwgMHg3MCwgMHhmZCwgMHhjNiwgMHg0NiwgMHg5NywgMHg3NywgMHhlMCwgMHg5MSwKKwkweDEzLCAweDk2LCAweDM3LCAweDhjLCAweDk4LCAweGJjLCAweGQ4LCAweGZiLCAweDA2LCAweDc4LCAweDY4LCAweGM5LAorCTB4OTksIDB4OGEsIDB4NjgsIDB4MjMsIDB4YmQsIDB4MzEsIDB4ZjAsIDB4MmUsIDB4MmEsIDB4NGYsIDB4NTYsIDB4NWEsCisJMHhjNSwgMHg3OCwgMHhjYywgMHgwMCwgMHg2ZiwgMHgzZSwgMHgyZiwgMHhmOSwgMHg2OCwgMHg1OCwgMHhkYSwgMHhlNywKKwkweDM0LCAweGU5LCAweGVlLCAweDBmLCAweDRiLCAweGM2LCAweDUyLCAweDcyLCAweDEzLCAweDdkLCAweDI2LCAweDJhLAorCTB4YzYsIDB4NWMsIDB4NjYsIDB4YmQsIDB4MmUsIDB4OWIsIDB4YWMsIDB4OWMsIDB4MTQsIDB4YzEsIDB4YmIsIDB4ZWYsCisJMHg1MSwgMHgyNywgMHhmMSwgMHgyYywgMHgyZSwgMHhiOSwgMHhlOSwgMHg5YiwgMHg2NSwgMHhjYywgMHgyMiwgMHg1ZCwKKwkweDNiLCAweDZmLCAweDc0LCAweGQ3LCAweDBhLCAweDZiLCAweGQ5LCAweDEzLCAweDIzLCAweDcyLCAweGM0LCAweDg5LAorCTB4NjgsIDB4YjksIDB4MTMsIDB4ZGIsIDB4MjQsIDB4OWIsIDB4OTIsIDB4MjgsIDB4ZGUsIDB4OGIsIDB4ZTUsIDB4ZjEsCisJMHhhNCwgMHg1NCwgMHgxZSwgMHg5MSwgMHgyOSwgMHg0NywgMHhiNCwgMHhhYywgMHg0MywgMHg3ZSwgMHg3NiwgMHhlMiwKKwkweDc5LCAweDliLCAweDFhLCAweDhiLCAweGJlLCAweDJlLCAweDQzLCAweGNkLCAweDFkLCAweDQ2LCAweGJmLCAweDg1LAorCTB4ZmUsIDB4MGUsIDB4NmQsIDB4NDgsIDB4Y2QsIDB4YTEsIDB4ZmEsIDB4ZTMsIDB4OTMsIDB4MTIsIDB4OTEsIDB4YzcsCisJMHhjYiwgMHg1MSwgMHg2ZiwgMHg2YywgMHhiNSwgMHg5YSwgMHg0ZCwgMHg1OSwgMHgxOCwgMHgzNywgMHgyMiwgMHg5MywKKwkweDRlLCAweDU0LCAweGM2LCAweDcwLCAweDlkLCAweDcwLCAweGI4LCAweDdlLCAweDBjLCAweDNhLCAweGY1LCAweGRhLAorCTB4YTEsIDB4ZmMsIDB4YWMsIDB4OWEsIDB4MmYsIDB4NmUsIDB4YTQsIDB4MzksIDB4NWYsIDB4MTcsIDB4YzYsIDB4NGQsCisJMHg4MCwgMHgyZSwgMHg0ZCwgMHg0YywgMHgyNSwgMHhjYiwgMHg4YywgMHhlNCwgMHhhNywgMHgzNSwgMHhlOCwgMHgxYiwKKwkweGFlLCAweDhhLCAweGFmLCAweDQzLCAweGEwLCAweGRmLCAweDE0LCAweGJiLCAweDVmLCAweDkzLCAweDAyLCAweDY0LAorCTB4NTUsIDB4YjQsIDB4ZDAsIDB4MmUsIDB4OWYsIDB4ZDUsIDB4YjMsIDB4NGUsIDB4YjMsIDB4ZTQsIDB4Y2MsIDB4YjgsCisJMHgxOCwgMHgzMywgMHg0YSwgMHg5NywgMHg2NCwgMHgxMiwgMHhlZiwgMHhlOCwgMHgzNiwgMHhjNywgMHg1YywgMHhjNCwKKwkweGJlLCAweGM3LCAweDk0LCAweDFjLCAweDlhLCAweGQyLCAweDQ1LCAweDNkLCAweDU3LCAweGU5LCAweDE0LCAweDdkLAorCTB4NmUsIDB4OGYsIDB4YmMsIDB4M2MsIDB4MmQsIDB4OTYsIDB4OTEsIDB4N2UsIDB4YjcsIDB4OWEsIDB4YjUsIDB4YTcsCisJMHhmNCwgMHhlYywgMHgxMywgMHhhNiwgMHg4NCwgMHg2NiwgMHgzNCwgMHg5OSwgMHhiMiwgMHgxMywgMHhiMCwgMHg4MCwKKwkweGEzLCAweGZhLCAweDhlLCAweGNhLCAweDU5LCAweDhjLCAweGUzLCAweDdiLCAweDE4LCAweDU3LCAweGQ2LCAweGMxLAorCTB4NTcsIDB4ZGUsIDB4NmYsIDB4YjEsIDB4NzQsIDB4YTUsIDB4Y2YsIDB4MWMsIDB4MDMsIDB4MTksIDB4NjAsIDB4MWYsCisJMHg0ZiwgMHgzYSwgMHg5MCwgMHg4OSwgMHg5MiwgMHg1MSwgMHgxYywgMHgzMiwgMHg3YSwgMHgxNSwgMHgzMiwgMHgxYSwKKwkweDgwLCAweDZjLCAweDUyLCAweGYyLCAweDUyLCAweGE1LCAweDRmLCAweDllLCAweGFmLCAweDI0LCAweGU1LCAweDM5LAorCTB4ZTgsIDB4ZWIsIDB4YjMsIDB4OTUsIDB4YjgsIDB4M2MsIDB4NTMsIDB4ZTksIDB4OTIsIDB4YTcsIDB4MmIsIDB4MzEsCisJMHg3OSwgMHg0YSwgMHhjOSwgMHgyZCwgMHgwNywgMHhkYiwgMHg1MCwgMHhiMiwgMHgwYywgMHg1ZiwgMHg5ZiwgMHg5NiwKKwkweDcwLCAweDI3LCAweGU0LCAweGQxLCAweDAxLCAweGZkLCAweDY5LCAweDg3LCAweDZlLCAweDdlLCAweGE1LCAweDM3LAorCTB4MmMsIDB4YjMsIDB4YmQsIDB4OTIsIDB4NTksIDB4OGYsIDB4ZmUsIDB4OWIsIDB4ZDIsIDB4YTYsIDB4ZTIsIDB4OTEsCisJMHg4OSwgMHhlNywgMHg5MywgMHhkMywgMHgyMSwgMHhjOSwgMHg1OSwgMHg4ZiwgMHhjYiwgMHg4NSwgMHgxOSwgMHg1MywKKwkweDI2LCAweDJiLCAweGRiLCAweDZmLCAweDcyLCAweDY1LCAweGM2LCAweGY2LCAweGJjLCAweDljLCAweDlmLCAweDY5LAorCTB4YzIsIDB4YjMsIDB4NzksIDB4NzksIDB4NzksIDB4YjMsIDB4MmUsIDB4MTMsIDB4YjMsIDB4NmYsIDB4ODksIDB4MDksCisJMHgxZSwgMHgwZSwgMHgyOSwgMHg3OSwgMHgzZiwgMHgyZSwgMHhmZiwgMHhmYywgMHgyNywgMHgyMiwgMHgyMywgMHhlMCwKKwkweDhiLCAweGRlLCAweGZmLCAweGVmLCAweGQ1LCAweDhjLCAweDA1LCAweDdlLCAweGY0LCAweGY3LCAweDQxLCAweDNmLAorCTB4NzQsIDB4NWMsIDB4MjksIDB4Y2YsIDB4MzgsIDB4YzYsIDB4OTgsIDB4NWEsIDB4Y2UsIDB4MzksIDB4MGQsIDB4OWIsCisJMHg2YSwgMHhkNSwgMHhiMiwgMHhjNywgMHg0NSwgMHgwYSwgMHhjNywgMHhhYiwgMHg1MiwgMHg0OCwgMHg4NSwgMHhlNCwKKwkweDAxLCAweGFiLCAweDJhLCAweDQzLCAweGE5LCAweDI2LCAweDM5LCAweDYwLCAweDc1LCAweGNhLCAweDQ0LCAweGRmLAorCTB4Y2YsIDB4NjgsIDB4M2UsIDB4OTYsIDB4N2QsIDB4YTUsIDB4OTIsIDB4YzYsIDB4M2QsIDB4ZmIsIDB4NDQsIDB4NjYsCisJMHhkNSwgMHhiZCwgMHhkYiwgMHg1ZiwgMHhhYywgMHg4NCwgMHgyNCwgMHgxMywgMHgyZCwgMHhjNiwgMHg0YywgMHhiOSwKKwkweGEwLCAweGI5LCAweGI0LCAweGVkLCAweGY0LCAweDlmLCAweDQxLCAweDVlLCAweDYzLCAweGMwLCAweDkwLCAweDg0LAorCTB4ZDIsIDB4YTUsIDB4ZmMsIDB4ZjQsIDB4OWEsIDB4OGIsIDB4MTksIDB4ZDUsIDB4MWQsIDB4NTIsIDB4N2EsIDB4NmEsCisJMHhhNCwgMHg0ZCwgMHhkMiwgMHgzMSwgMHhhNiwgMHhhNSwgMHhhMywgMHhkMiwgMHhhZCwgMHhlYywgMHg2NCwgMHgwMCwKKwkweDYzLCAweDA2LCAweGI1LCAweGJiLCAweDJiLCAweDk0LCAweDM3LCAweGVlLCAweGNiLCAweGE0LCAweDc1LCAweDAzLAorCTB4YzYsIDB4OWEsIDB4YjgsIDB4NjYsIDB4M2MsIDB4OWEsIDB4ODMsIDB4NzQsIDB4NzIsIDB4MmUsIDB4ZDIsIDB4YzksCisJMHhlYiwgMHhkZSwgMHgwMCwgMHg5ZCwgMHhmYiwgMHg2YSwgMHhmNywgMHhiMywgMHg4MSwgMHhmYiwgMHg2MiwgMHhlNSwKKwkweGQ3LCAweDViLCAweDVjLCAweGZhLCAweGM4LCAweGQ3LCAweDQxLCAweDk5LCAweDk4LCAweDdlLCAweGM4LCAweDViLAorCTB4MGIsIDB4ZjcsIDB4NjUsIDB4YWUsIDB4YjEsIDB4MDAsIDB4M2UsIDB4YTksIDB4OTEsIDB4NTcsIDB4NTgsIDB4YWIsCisJMHgxOCwgMHg1OCwgMHhlYiwgMHg3MCwgMHg2MCwgMHhhZCwgMHhjMywgMHg4MSwgMHhiNSwgMHg4YSwgMHhlMCwgMHhhZCwKKwkweGFjLCAweGQzLCAweDgxLCAweDMzLCAweDc5LCAweGMyLCAweGJjLCAweDFjLCAweGM1LCAweDljLCAweDZmLCAweDg4LAorCTB4OTEsIDB4YTYsIDB4MmQsIDB4ZjgsIDB4MzYsIDB4ZjksIDB4MDcsIDB4MTgsIDB4OWYsIDB4OTYsIDB4NzMsIDB4MGUsCisJMHg3OCwgMHg3MywgMHgzYywgMHgyNCwgMHg3NywgMHhhOSwgMHg3MSwgMHhmZiwgMHhiMSwgMHhjNiwgMHhhNSwgMHgzMSwKKwkweGY4LCAweDJjLCAweDJjLCAweGJiLCAweGEyLCAweGJjLCAweGY3LCAweDlmLCAweDk5LCAweGUwLCAweDM3LCAweGRiLAorCTB4OTMsIDB4MzcsIDB4YjgsIDB4NmQsIDB4ZGUsIDB4OWYsIDB4ZjUsIDB4ZjYsIDB4ZDIsIDB4ZWUsIDB4YmUsIDB4NTcsCisJMHg3OSwgMHg1MywgMHg2MSwgMHhjNiwgMHg2MiwgMHg4NSwgMHhiNiwgMHgyZCwgMHgyOSwgMHhjMywgMHg5NiwgMHhmZCwKKwkweDQzLCAweGE5LCAweDRlLCAweDk5LCAweGI0LCAweGI0LCAweGQ0LCAweDQ0LCAweGIyLCAweDk5LCAweGZjLCAweGNmLAorCTB4ZTgsIDB4NzYsIDB4MmIsIDB4ZWMsIDB4NDcsIDB4ZTIsIDB4M2EsIDB4NzEsIDB4NTEsIDB4ZWQsIDB4ZWIsIDB4NWIsCisJMHgxZSwgMHhmZCwgMHgxNiwgMHhkYiwgMHgyMywgMHhiYSwgMHhkZCwgMHhkMSwgMHhkMCwgMHg0ZiwgMHhmZCwgMHhmZiwKKwkweDRiLCAweGRjLCAweGQzLCAweDA2LCAweGZhLCAweDc1LCAweDc3LCAweGVkLCAweGJmLCAweDQyLCAweDliLCAweDU4LAorCTB4MTUsIDB4ZjEsIDB4ZGEsIDB4ZmUsIDB4ZjMsIDB4ZmYsIDB4MzIsIDB4OTYsIDB4YjcsIDB4OGYsIDB4NmQsIDB4NWMsCisJMHhkZSwgMHhmNiwgMHg2ZCwgMHgyOSwgMHg4OCwgMHg3MywgMHhkYywgMHgyYiwgMHg2YywgMHhkOCwgMHhhNiwgMHhmZSwKKwkweDg1LCAweDQwLCAweDZiLCAweDBhLCAweDM2LCAweGRjLCAweGVjLCAweGQxLCAweGYwLCAweGJhLCAweDQ3LCAweDAzLAorCTB4NjgsIDB4YzUsIDB4YjgsIDB4ODksIDB4MGEsIDB4ZGYsIDB4NTEsIDB4YTIsIDB4NmMsIDB4NjgsIDB4OTMsIDB4ZjcsCisJMHhmZSwgMHhmZCwgMHg1YSwgMHhmNSwgMHhmYywgMHgwZCwgMHg4MywgMHhlYiwgMHhmOCwgMHg1NywgMHhkMSwgMHg4NiwKKwkweDYwLCAweDY3LCAweDkzLCAweGIzLCAweGE2LCAweGU0LCAweDUzLCAweDMxLCAweDY1LCAweDBmLCAweGY5LCAweDU0LAorCTB4MWQsIDB4M2YsIDB4MjYsIDB4YTcsIDB4MWIsIDB4ZjEsIDB4ODMsIDB4ZWYsIDB4MTEsIDB4M2YsIDB4NWMsIDB4ZWMsCisJMHg5OCwgMHg5OCwgMHgyNSwgMHg4ZSwgMHhkNCwgMHg3MSwgMHhlMywgMHhjOCwgMHhiNCwgMHg4ZiwgMHgyNSwgMHg5YywKKwkweDliLCAweDE4LCAweGUyLCAweGUzLCAweDA3LCAweGRmLCAweDIzLCAweDdlLCAweDE4LCAweDkwLCAweDE1LCAweGU3LAorCTB4ZjQsIDB4ZDcsIDB4OWYsIDB4NmEsIDB4OTgsIDB4N2IsIDB4NGEsIDB4NjEsIDB4OTMsIDB4OGIsIDB4Y2IsIDB4NmYsCisJMHgwNiwgMHg3MCwgMHhiZSwgMHgwYiwgMHgxOCwgMHgxZCwgMHg4NSwgMHhmYywgMHg3YywgMHg4YywgMHgyNiwgMHg3NiwKKwkweGM2LCAweDgwLCAweGViLCAweGUwLCAweDkxLCAweGMyLCAweGU0LCAweDA4LCAweDcwLCAweGNjLCAweGY0LCAweDMwLAorCTB4MzUsIDB4ZWMsIDB4NjEsIDB4NmEsIDB4MDQsIDB4NzgsIDB4Y2EsIDB4YjYsIDB4ZTUsIDB4YjUsIDB4YTMsIDB4NWUsCisJMHgzYiwgMHg4NiwgMHgzNiwgMHhmYywgMHhlZiwgMHgxYywgMHg2ZCwgMHhlYywgMHhiNSwgMHg0MywgMHhlMywgMHhiMywKKwkweDBhLCAweGE3LCAweDg5LCAweGYxLCAweGMwLCAweDBhLCAweGUyLCAweDJjLCAweGYxLCAweGI2LCAweDRiLCAweDE2LAorCTB4Y2EsIDB4NTgsIDB4YWYsIDB4ODYsIDB4NjksIDB4OTQsIDB4NDcsIDB4OTAsIDB4MWUsIDB4ZDIsIDB4YjIsIDB4NDYsCisJMHhmNCwgMHhjNywgMHhkYywgMHhmZCwgMHhlOCwgMHhlOSwgMHhjZiwgMHhlYiwgMHhkMiwgMHhjMiwgMHg3ZCwgMHg5MCwKKwkweGVlLCAweDFiLCAweDQxLCAweDJiLCAweGY3LCAweGY2LCAweGEzLCAweGE0LCAweDk1LCAweGViLCAweDM1LCAweGQyLAorCTB4N2IsIDB4MWEsIDB4ZjQsIDB4NjYsIDB4ODAsIDB4YjcsIDB4YTIsIDB4OGQsIDB4ZjYsIDB4OGUsIDB4ODIsIDB4ZGUsCisJMHgxMSwgMHg2MCwgMHhmMSwgMHgzMCwgMHhiMCwgMHg3OCwgMHgyNywgMHhiMCwgMHg3OCwgMHgwOCwgMHg1OCwgMHg5YywKKwkweDA2LCAweDBlLCAweDBmLCAweDAyLCAweDg3LCAweDA3LCAweDgwLCAweGMzLCAweDI5LCAweGVjLCAweDJiLCAweDJhLAorCTB4ZjMsIDB4YzAsIDB4ZTUsIDB4NzksIDB4ZTAsIDB4ZjMsIDB4M2MsIDB4ZTQsIDB4MzUsIDB4MzEsIDB4MjcsIDB4ZGEsCisJMHgxNywgMHhiMCwgMHhmZSwgMHg2MywgMHgzMywgMHg4OSwgMHhkMywgMHhkMCwgMHhjZCwgMHg1OCwgMHg1MSwgMHg4NywKKwkweDNkLCAweGE1LCAweDA2LCAweGExLCAweDIzLCAweDQ5LCAweDI5LCAweDU1LCAweDQ2LCAweGE1LCAweDQwLCAweDNmLAorCTB4YjYsIDB4YjksIDB4MDcsIDB4YjYsIDB4MGIsIDB4ZmIsIDB4ODksIDB4ZjksIDB4NzEsIDB4ZDMsIDB4NWEsIDB4ZWYsCisJMHhmYSwgMHhmNywgMHgyMiwgMHhmNiwgMHgxZiwgMHg4MywgMHgyNywgMHg4OSwgMHhiOCwgMHhjOCwgMHhiMCwgMHhlNCwKKwkweDlkLCAweDFlLCAweDJiLCAweGFiLCAweDI3LCAweDMxLCAweDhlLCAweGVkLCAweGI4LCAweGI2LCAweGY3LCAweDc4LAorCTB4NDIsIDB4MWIsIDB4M2YsIDB4Y2UsIDB4M2QsIDB4NGQsIDB4MDMsIDB4ZTMsIDB4YWEsIDB4MzIsIDB4OTUsIDB4YTIsCisJMHhhZCwgMHg1NiwgMHhlNSwgMHg1NCwgMHgyYSwgMHgzMSwgMHg1OCwgMHg5NCwgMHg1NiwgMHgzOSwgMHgxMiwgMHg5ZCwKKwkweDU2LCAweGZlLCAweGNkLCAweDRjLCAweDFmLCAweDUzLCAweGZhLCAweDUxLCAweGIwLCAweDcxLCAweDJkLCAweDc3LAorCTB4NmIsIDB4ZjksIDB4ZTMsIDB4ZjQsIDB4M2IsIDB4M2QsIDB4ZjgsIDB4ODUsIDB4NDAsIDB4MGIsIDB4ZTcsIDB4MzcsCisJMHg2NSwgMHg2OCwgMHg0MCwgMHhiNCwgMHg3ZCwgMHhiZCwgMHg0NSwgMHhhMCwgMHg2MiwgMHhjMiwgMHgzYSwgMHg4NywKKwkweDk1LCAweDczLCAweGQzLCAweDNkLCAweGIxLCAweDljLCAweDZlLCAweGNhLCAweDk4LCAweGE5LCAweGM5LCAweDA0LAorCTB4ZWMsIDB4NjUsIDB4MjgsIDB4ZjUsIDB4N2YsIDB4ZDUsIDB4MjMsIDB4NTEsIDB4M2UsIDB4NmYsIDB4OTYsIDB4ZGYsCisJMHg1MSwgMHgzOCwgMHg4YiwgMHhiNSwgMHg0YiwgMHhiMywgMHg1OCwgMHgzNywgMHgwNCwgMHhmZSwgMHg3MSwgMHg1ZCwKKwkweGNlLCAweDgzLCAweDM2LCAweDMwLCAweGNmLCAweGI0LCAweDEzLCAweGE3LCAweDhiLCAweGIyLCAweDFkLCAweDc2LAorCTB4YjcsIDB4NGUsIDB4YjIsIDB4N2QsIDB4NGQsIDB4OTIsIDB4MTksIDB4ODksIDB4Y2IsIDB4YzQsIDB4Y2MsIDB4NzYsCisJMHhlMCwgMHgxZSwgMHg2NCwgMHg2MCwgMHhiNywgMHg0OCwgMHg3ZSwgMHgzNCwgMHgyZSwgMHg1ZiwgMHg5ZSwgMHg2MSwKKwkweDVmLCAweDA2LCAweGZiLCAweDRmLCAweDFjLCAweGNkLCAweDA4LCAweGY3LCAweDFmLCAweDUyLCAweGZiLCAweDhhLAorCTB4ZWIsIDB4MTksIDB4MzksIDB4ZTAsIDB4YmMsIDB4YTQsIDB4YmIsIDB4NzYsIDB4ZTksIDB4YjYsIDB4ZjcsIDB4NDIsCisJMHgxZSwgMHhhNywgMHhjMCwgMHhlZiwgMHhiYywgMHg2MywgMHhjYiwgMHgwMiwgMHhmYywgMHg0YSwgMHhlZSwgMHgzOCwKKwkweDcwLCAweGQ1LCAweDZlLCAweDAzLCAweDA2LCAweDI2LCAweGNlLCAweGQyLCAweDNlLCAweDBjLCAweGM0LCAweDVhLAorCTB4MjUsIDB4YzUsIDB4ZWIsIDB4MmUsIDB4MzksIDB4M2UsIDB4YTMsIDB4Y2IsIDB4YjMsIDB4YjcsIDB4YzUsIDB4ZDEsCisJMHgwNiwgMHhkNiwgMHhhNiwgMHgxMiwgMHg2NywgMHhjNiwgMHhmNCwgMHgyZSwgMHhiOSwgMHhiNSwgMHgyMywgMHg4NiwKKwkweGY3LCAweDUyLCAweDVhLCAweGRlLCAweGY5LCAweDM3LCAweGYyLCAweGYyLCAweDY0LCAweDVjLCAweGU3LCAweDU4LAorCTB4NWQsIDB4NzIsIDB4MjksIDB4MDMsIDB4M2EsIDB4NTYsIDB4YzQsIDB4ZjgsIDB4N2YsIDB4NDAsIDB4N2YsIDB4OTcsCisJMHhjYywgMHgyMSwgMHhiZSwgMHg5OSwgMHgwMywgMHg0ZCwgMHhkOSwgMHgxNCwgMHhiMSwgMHgzMCwgMHg3MSwgMHg3MiwKKwkweDQ5LCAweDA3LCAweDY2LCAweGNkLCAweDQxLCAweDM3LCAweDQ3LCAweDExLCAweDNmLCAweGNjLCAweGZjLCAweDM3LAorCTB4YzYsIDB4YzQsIDB4MjEsIDB4ZDMsIDB4MWUsIDB4NmIsIDB4MDIsIDB4ZjgsIDB4OTIsIDB4ZTksIDB4ZTIsIDB4M2QsCisJMHhlNywgMHhiNCwgMHhlNSwgMHg5NCwgMHg0MywgMHgxZCwgMHg4YSwgMHhjYiwgMHhlMywgMHgxNSwgMHhiZSwgMHhkNywKKwkweDczLCAweGY2LCAweDY5LCAweGIxLCAweGU1LCAweDQxLCAweGU3LCAweDdmLCAweDMwLCAweGZlLCAweDFkLCAweGM0LAorCTB4OWUsIDB4OTYsIDB4OTQsIDB4MjAsIDB4YjcsIDB4MDIsIDB4NzgsIDB4OTksIDB4ODksIDB4YjksIDB4ZWQsIDB4ODksCisJMHhiOSwgMHhjNCwgMHhkOSwgMHgwYiwgMHgzYSwgMHhlZiwgMHhlZCwgMHhlMiwgMHg4MiwgMHg3ZSwgMHhiMywgMHg0OCwKKwkweDA3LCAweGY5LCAweDk5LCAweDAyLCAweDJmLCAweDZkLCAweDRiLCAweGQ3LCAweDM3LCAweDdiLCAweGYxLCAweDE2LAorCTB4NmQsIDB4YzAsIDB4MDYsIDB4N2QsIDB4YTYsIDB4MmMsIDB4ZjQsIDB4MDcsIDB4NmQsIDB4ODAsIDB4N2UsIDB4ZDYsCisJMHhiNywgMHg4MSwgMHg0NCwgMHg2YywgMHg0OSwgMHhkNywgMHhmMSwgMHhkYywgMHg5NCwgMHg2MywgMHhhYSwgMHhhZCwKKwkweDgxLCAweGQ2LCAweDQ0LCAweDhjLCAweGZiLCAweDliLCAweDJjLCAweDI3LCAweGU1LCAweDcxLCAweDg3LCAweGUzLAorCTB4YzEsIDB4ZTcsIDB4ZTksIDB4ODgsIDB4MzcsIDB4MWUsIDB4ZjEsIDB4OGUsIDB4YzMsIDB4OTgsIDB4MjksIDB4MDksCisJMHg5YSwgMHg1ZCwgMHhiYiwgMHg1OCwgMHg5OCwgMHg4ZSwgMHhhYSwgMHg2NywgMHg0NywgMHgxYywgMHgzNywgMHgzNiwKKwkweGQyLCAweDExLCAweDNmLCAweGNkLCAweDIzLCAweDdlLCAweGNhLCAweDI5LCAweDFiLCAweGIxLCAweDMyLCAweDg4LAorCTB4YWYsIDB4ZTEsIDB4NjcsIDB4NWQsIDB4ZmIsIDB4MjgsIDB4OTUsIDB4NDksIDB4Y2IsIDB4M2QsIDB4YTAsIDB4MmYsCisJMHg1MSwgMHgwNCwgMHgzMSwgMHhjNywgMHg3NCwgMHhiOCwgMHhlYiwgMHhlYywgMHg4MCwgMHgxNCwgMHgxOSwgMHg2MywKKwkweDlkLCAweDMzLCAweDFlLCAweDkxLCAweGIxLCAweDEyLCAweGZkLCAweDFiLCAweDdlLCAweDhlLCAweDZkLCAweDMxLAorCTB4YTYsIDB4Y2YsIDB4MjgsIDB4ZGYsIDB4ZDMsIDB4MDMsIDB4M2QsIDB4ODAsIDB4NWYsIDB4NGEsIDB4YjUsIDB4OGIsCisJMHhlYiwgMHgwNywgMHhmNywgMHg0MCwgMHg5ZSwgMHhjMywgMHg5MCwgMHg3YiwgMHg1YSwgMHhjNiwgMHg0ZiwgMHg4YywKKwkweDUzLCAweGE3LCAweDkzLCAweDI1LCAweDQ5LCAweDI0LCAweDhmLCAweGM4LCAweDE2LCAweDZiLCAweDAxLCAweGJlLAorCTB4MzAsIDB4MzMsIDB4NWEsIDB4ZGQsIDB4YWUsIDB4YTcsIDB4ZjksIDB4Y2UsIDB4YTMsIDB4NzgsIDB4MDcsIDB4ZDcsCisJMHhkMiwgMHhiOCwgMHgzYywgMHg1MCwgMHg2MSwgMHhkZiwgMHg5ZCwgMHg4NiwgMHhiNCwgMHhjMCwgMHg1NiwgMHgwNiwKKwkweGY2LCAweDc4LCAweDc2LCAweDgwLCAweGY5LCAweDRjLCAweDdmLCAweGJlLCAweDcxLCAweDZmLCAweDNlLCAweDhlLAorCTB4ZTMsIDB4MTgsIDB4YmUsIDB4NTMsIDB4OWYsIDB4NzcsIDB4MDcsIDB4N2QsIDB4MWIsIDB4YjAsIDB4NjQsIDB4ODcsCisJMHg1ZSwgMHhkZCwgMHgxZSwgMHhjMiwgMHhmMywgMHg1MywgMHgwMywgMHhiYywgMHhjNywgMHgzYywgMHhmMCwgMHg2ZCwKKwkweDk2LCAweDNkLCAweDhjLCAweGIxLCAweGEzLCAweDk4LCAweDczLCAweDhkLCAweDY0LCAweDNiLCAweDdkLCAweDdhLAorCTB4YTksIDB4MDMsIDB4OGMsIDB4M2YsIDB4ZDgsIDB4OGUsIDB4YWUsIDB4NzcsIDB4NzksIDB4ZmYsIDB4MjUsIDB4YzMsCisJMHhkNSwgMHhjOSwgMHgxMSwgMHhiNCwgMHg2OSwgMHg3ZiwgMHgwNywgMHgyNSwgMHhlNywgMHgyNCwgMHhiMCwgMHg0ZiwKKwkweGYwLCAweGI2LCAweDMyLCAweGUxLCAweGVkLCAweDExLCAweGZjLCAweDFmLCAweDM5LCAweDBjLCAweDNlLCAweDQ4LAorCTB4ZDEsIDB4ZTUsIDB4MGQsIDB4ZjksIDB4NDIsIDB4OWUsIDB4ZmMsIDB4MTYsIDB4NzQsIDB4ZmYsIDB4NjEsIDB4OGMsCisJMHg4MSwgMHg3ZiwgMHg1MCwgMHgzYywgMHg1OCwgMHhlYSwgMHg3MCwgMHg2MywgMHhkMSwgMHg0NCwgMHgzMSwgMHhjMywKKwkweGZjLCAweGE5LCAweDgzLCAweDk4LCAweDA3LCAweGZjLCAweGE5LCAweDQwLCAweGIxLCAweDMwLCAweGY3LCAweDkyLAorCTB4YmUsIDB4ODYsIDB4ZjQsIDB4YzYsIDB4OTcsIDB4MGMsIDB4ODMsIDB4ZWQsIDB4ZTQsIDB4MTIsIDB4NzQsIDB4YjgsCisJMHgwNCwgMHhmOSwgMHg2NCwgMHhmYiwgMHg2OCwgMHhiMywgMHgzNiwgMHhlNCwgMHgzMSwgMHg2MywgMHg1MCwgMHg1ZiwKKwkweDRiLCAweDg4LCAweDA1LCAweGYzLCAweGNlLCAweDE2LCAweGViLCAweDVlLCAweGYyLCAweGNkLCAweGIyLCAweGU0LAorCTB4NjksIDB4MjcsIDB4ODgsIDB4MWQsIDB4M2IsIDB4MzAsIDB4OTQsIDB4N2EsIDB4MTgsIDB4ODUsIDB4MWUsIDB4OTgsCisJMHhmMCwgMHhjOSwgMHgzMSwgMHhjOCwgMHhmYywgMHhjNSwgMHgwZSwgMHg3NywgMHgyZiwgMHhiYywgMHgzNywgMHg2NSwKKwkweGRlLCAweGMyLCAweDlhLCAweGNlLCAweGVmLCAweGFmLCAweDczLCAweGZiLCAweDc4LCAweGNmLCAweGI4LCAweGM4LAorCTB4OTcsIDB4YWIsIDB4NGYsIDB4M2IsIDB4ZTUsIDB4ZGIsIDB4MjgsIDB4ZDMsIDB4NDMsIDB4ZDgsIDB4MGIsIDB4ZmIsCisJMHg3MSwgMHgyZCwgMHgxZCwgMHg5NCwgMHg3MSwgMHhkMCwgMHg1NiwgMHgxOCwgMHhkOCwgMHgxNCwgMHgzYiwgMHg4ZiwKKwkweGYxLCAweDM5LCAweGUwLCAweDc5LCAweGQxLCAweGU0LCAweGIzLCAweDhiLCAweDVhLCAweGZkLCAweDFkLCAweGM0LAorCTB4NWMsIDB4MzYsIDB4ZmQsIDB4ZDksIDB4OTIsIDB4ZjYsIDB4ODUsIDB4Y2EsIDB4Y2IsIDB4NWEsIDB4YjYsIDB4NzQsCisJMHg1MSwgMHhjYiwgMHg0MSwgMHg0ZiwgMHg0YSwgMHgwZSwgMHg3MywgMHgwNiwgMHhkYSwgMHg4ZiwgMHg4NSwgMHhiNSwKKwkweDEzLCAweGIxLCAweGI3LCAweGY1LCAweDllLCAweGY4LCAweDAyLCAweGIwLCAweDYwLCAweDJmLCAweDZjLCAweDNhLAorCTB4NjcsIDB4ZWUsIDB4OTQsIDB4MDIsIDB4YjAsIDB4MzUsIDB4N2YsIDB4NjIsIDB4MGIsIDB4ZWMsIDB4MmQsIDB4MWUsCisJMHhhMCwgMHg4YiwgMHg3OCwgMHg1NiwgMHhhNCwgMHg0ZiwgMHhkNSwgMHg3NiwgMHgzOCwgMHg1MiwgMHg2YywgMHg0YSwKKwkweDEzLCAweGQ3LCAweDM2LCAweDQxLCAweDc3LCAweGQwLCAweDU3LCAweGFlLCAweGViLCAweGRmLCAweDFkLCAweDJiLAorCTB4NjgsIDB4NDUsIDB4N2UsIDB4MzksIDB4YjAsIDB4OWMsIDB4ZGUsIDB4OTIsIDB4NWMsIDB4OTksIDB4ZGUsIDB4MWQsCisJMHgzNSwgMHg3YSwgMHg4OSwgMHgxOSwgMHhjMCwgMHg3ZiwgMHhkOCwgMHhjZCwgMHg0YiwgMHhkMCwgMHhkZiwgMHhlNywKKwkweDFkLCAweGUwLCAweGJmLCAweDAzLCAweGZjLCAweDg3LCAweDRkLCAweDNkLCAweDAzLCAweGRkLCAweDdiLCAweGRhLAorCTB4ODEsIDB4MGYsIDB4NzAsIDB4ZTAsIDB4MDMsIDB4MWMsIDB4ZjgsIDB4MDAsIDB4MjcsIDB4MGIsIDB4MzksIDB4MTEsCisJMHhlNywgMHhlOSwgMHg0MywgMHg3NiwgMHhkNywgMHg3YywgMHg5ZSwgMHgxYiwgMHgzNywgMHhkZCwgMHhlMCwgMHhjNSwKKwkweDIyLCAweGEzLCAweDg4LCAweDQ1LCAweDM2LCAweGM4LCAweDQ0LCAweGYyLCAweDdhLCAweGVjLCAweGFkLCAweDA1LAorCTB4ZDcsIDB4NTYsIDB4NWMsIDB4YjEsIDB4NDYsIDB4ZjIsIDB4NzYsIDB4Y2YsIDB4NGUsIDB4MWUsIDB4MDYsIDB4NWQsCisJMHg4OCwgMHhiZiwgMHg5MywgMHgzZiwgMHgwZCwgMHgzZCwgMHg2YywgMHgwMiwgMHgzZCwgMHgzZiwgMHhlNSwgMHhjNSwKKwkweDJjLCAweDBmLCAweDlhLCAweGFlLCAweDFlLCAweGI2LCAweGEyLCAweGVmLCAweDkzLCAweGU4LCAweDZiLCAweGM1LAorCTB4OTgsIDB4MDMsIDB4MTgsIDB4YzMsIDB4OTgsIDB4YTcsIDB4Y2QsIDB4ZWIsIDB4MGIsIDB4OGUsIDB4NjMsIDB4ZWMsCisJMHhmMywgMHgxOSwgMHhhYywgMHg5NSwgMHhjMCwgMHhiOCwgMHgzNiwgMHhjYywgMHhkZCwgMHg4NSwgMHgzMSwgMHhkYiwKKwkweDMwLCAweGU2LCAweDQ2LCAweGI0LCAweDE5LCAweDMzLCAweDZmLCAweDQ0LCAweGZiLCAweDEzLCAweDBkLCAweGVmLAorCTB4N2MsIDB4MGMsIDB4N2QsIDB4YjcsIDB4MzcsIDB4ZjQsIDB4OWQsIDB4NDMsIDB4MWYsIDB4ZjIsIDB4NTAsIDB4ZWIsCisJMHhiYywgMHhmNywgMHg1ZSwgMHgxMSwgMHhlZCwgMHhjZSwgMHg4NiwgMHgzMSwgMHhhZiwgMHhhMiwgMHgwZiwgMHg3MSwKKwkweGFmLCAweGY1LCAweDJkLCAweDVjLCAweDkxLCAweDdmLCAweDVhLCAweGE0LCAweGM5LCAweDdmLCAweGM2LCAweGI4LAorCTB4MzcsIDB4OGUsIDB4ZmUsIDB4OTAsIDB4MTcsIDB4YmIsIDB4ZmUsIDB4YTYsIDB4MDksIDB4YmQsIDB4ZDMsIDB4ODYsCisJMHg5YywgMHhkZiwgMHgzMCwgMHhkZCwgMHg1OCwgMHhlZiwgMHg0ZSwgMHhjYiwgMHhkNSwgMHg0MywgMHhiZiwgMHhmZCwKKwkweDcwLCAweDQzLCAweDliLCAweDYzLCAweDE3LCAweDFhLCAweGZhLCAweGZlLCAweGE1LCAweGExLCAweGZkLCAweGRkLAorCTB4ZDAsIDB4Y2EsIDB4NzcsIDB4MDYsIDB4ZGIsIDB4OTcsIDB4ZjcsIDB4MTUsIDB4M2EsIDB4OTYsIDB4YjcsIDB4ZWQsCisJMHhhNiwgMHg5NSwgMHhlZiwgMHhlOCwgMHhlYiwgMHg5NiwgMHhmNywgMHhkZCwgMHhiOCwgMHhiZSwgMHg2MSwgMHgwYywKKwkweDc0LCAweDJhLCAweDhhLCAweDFjLCAweGM5LCAweDFmLCAweDFmLCAweGJlLCAweGNlLCAweDdkLCAweDRlLCAweGZlLAorCTB4MzYsIDB4ZWEsIDB4OTIsIDB4ZGEsIDB4M2EsIDB4ZGEsIDB4M2EsIDB4ZTQsIDB4YjAsIDB4YTQsIDB4YzEsIDB4OWUsCisJMHgyYywgMHgzZCwgMHhmZCwgMHhiMiwgMHg5NiwgMHg4MywgMHg0ZSwgMHg2NSwgMHgyYiwgMHhmZSwgMHg3YywgMHhiNCwKKwkweGQ5LCAweGM2LCAweGRjLCAweGRjLCAweGNmLCAweGM5LCAweDE5LCAweDJiLCAweDQ1LCAweGEwLCAweDM3LCAweGY3LAorCTB4ZDAsIDB4MjcsIDB4MWQsIDB4MmQsIDB4NGEsIDB4ZGQsIDB4M2UsIDB4YmIsIDB4ZjUsIDB4NGIsIDB4ZDksIDB4ZTcsCisJMHhlZCwgMHgxZSwgMHg0NiwgMHgxZCwgMHgwNiwgMHg5ZCwgMHg1NSwgMHgxOSwgMHg0OSwgMHgzNSwgMHhkMywgMHhjNywKKwkweDc4LCAweGQ4LCAweDQ1LCAweGRjLCAweGE5LCAweDU2LCAweDhkLCAweGNkLCAweDU1LCAweGQ5LCAweDlmLCAweDdhLAorCTB4YTcsIDB4MmEsIDB4MGEsIDB4ZjMsIDB4MDYsIDB4MTUsIDB4ZWUsIDB4YzQsIDB4ZjUsIDB4MWUsIDB4YzgsIDB4YzgsCisJMHg0MiwgMHg2ZSwgMHg4MiwgMHg3YywgMHgzYSwgMHg0YSwgMHg5ZiwgMHg3NCwgMHg5MCwgMHhmMSwgMHhjOSwgMHhhMywKKwkweDJlLCAweGE2LCAweDEyLCAweDc3LCAweGQwLCAweDQ2LCAweDVlLCAweDk2LCAweDNmLCAweGNlLCAweGY1LCAweDcxLAorCTB4MmQsIDB4MTEsIDB4YzcsIDB4NDcsIDB4OTUsIDB4NGYsIDB4YzksIDB4NWIsIDB4OWMsIDB4NzcsIDB4MzUsIDB4NmMsCisJMHgzYywgMHg2YiwgMHgzMiwgMHhhNiwgMHgzMywgMHhlZCwgMHhkMywgMHhmMCwgMHg2ZiwgMHg3YywgMHhjNiwgMHg1OCwKKwkweGUxLCAweDM0LCAweGUzLCAweDkyLCAweDAwLCAweDU2LCAweDZkLCAweDM1LCAweGUwLCAweDMyLCAweDhiLCAweGNiLAorCTB4ZjcsIDB4YjUsIDB4ODEsIDB4NzksIDB4YzQsIDB4NTUsIDB4ZWMsIDB4NzUsIDB4NzUsIDB4MmMsIDB4ZWEsIDB4ZDEsCisJMHhhZiwgMHg2YywgMHhkYiwgMHhiYiwgMHg2YSwgMHhiNiwgMHhlZCwgMHhlYiwgMHhkZSwgMHg2YSwgMHgzOSwgMHhmOCwKKwkweGY3LCAweDk1LCAweDJjLCAweDllLCAweGFhLCAweDI0LCAweDhlLCAweDE1LCAweDYxLCAweDRiLCAweDhiLCAweDJhLAorCTB4ZWYsIDB4ZjYsIDB4ZTUsIDB4YzIsIDB4MTgsIDB4MjcsIDB4NzEsIDB4NzIsIDB4MWUsIDB4NmYsIDB4OGUsIDB4YWIsCisJMHgxYywgMHg4MywgMHhmOSwgMHg0NSwgMHg1NSwgMHg3NiwgMHhhNCwgMHg1YSwgMHhhMywgMHhlNCwgMHg0MywgMHg0NiwKKwkweGZmLCAweDc2LCAweDg4LCAweDMxLCAweGMzLCAweGEyLCAweDQzLCAweDllLCAweGE1LCAweGYwLCAweDNjLCAweDA1LAorCTB4NGMsIDB4ZjgsIDB4MjcsIDB4YzksIDB4NDUsIDB4ZDksIDB4ZjcsIDB4NzYsIDB4NzUsIDB4MDEsIDB4NzEsIDB4OTUsCisJMHg4YSwgMHg4ZiwgMHg5NCwgMHhiZiwgMHg2NywgMHg3YywgMHhiNywgMHgxZiwgMHhmYywgMHgyMiwgMHg0ZiwgMHg0NywKKwkweGMwLCAweDY3LCAweDNmLCAweDA2LCAweDc4LCAweDhkLCAweDc1LCAweDE1LCAweDU5LCAweDFlLCAweDA3LCAweDhiLAorCTB4M2MsIDB4NTAsIDB4N2UsIDB4MTksIDB4NzMsIDB4ZWEsIDB4NmUsIDB4YWMsIDB4YzIsIDB4M2MsIDB4ZGMsIDB4NjYsCisJMHg3ZiwgMHg0NywgMHg4OCwgMHhiMSwgMHg5YywgMHhlYiwgMHhlYiwgMHgwZCwgMHhhYywgMHg4NywgMHhkYywgMHhiZSwKKwkweGZjLCAweDhmLCAweDJhLCAweDZlLCAweDJhLCAweDI4LCAweDc5LCAweDIwLCAweDg2LCAweGFhLCAweGYwLCAweDE5LAorCTB4ZmIsIDB4YzIsIDB4NWUsIDB4ZWMsIDB4MWMsIDB4ZjEsIDB4NjIsIDB4NjUsIDB4Y2IsIDB4OGIsIDB4OTUsIDB4NDksCisJMHgwNywgMHg2YiwgMHg2ZiwgMHg3ZSwgMHg1YywgMHg0MCwgMHg5OSwgMHgyZCwgMHgxZCwgMHhkMiwgMHgzNywgMHgzMywKKwkweDJlLCAweDY4LCAweDkzLCAweGQ1LCAweGUzLCAweDAyLCAweDlmLCAweGE2LCAweDZkLCAweGEwLCAweDg5LCAweDcxLAorCTB4OWUsIDB4YWEsIDB4YmQsIDB4NzQsIDB4YjgsIDB4ZjUsIDB4MWUsIDB4ZDIsIDB4ZTAsIDB4ZmIsIDB4NDcsIDB4ZTUsCisJMHg4NywgMHg4ZiwgMHhjMiwgMHhlNSwgMHg2MSwgMHg2ZiwgMHg2OSwgMHhkMCwgMHhiYSwgMHg1MywgMHhiMiwgMHhkMywKKwkweGRiLCAweDNjLCAweDdmLCAweGNiLCAweDFjLCAweDgwLCAweGYxLCAweGI3LCAweGFiLCAweGIzLCAweGQ5LCAweGQ0LAorCTB4ODQsIDB4M2YsIDB4NGYsIDB4MjcsIDB4M2MsIDB4NjQsIDB4YTAsIDB4MmUsIDB4YzQsIDB4YjUsIDB4MTgsIDB4YzcsCisJMHhmOCwgMHgzMSwgMHhjZCwgMHg0ZSwgMHgyZiwgMHhhNiwgMHgxOSwgMHg5NiwgMHhmZCwgMHg4ZSwgMHgxYiwgMHhmMywKKwkweDhmLCAweGEwLCAweDNmLCAweGVmLCAweDI4LCAweGRhLCAweDYzLCAweDhjLCAweDJkLCAweDc1LCAweGM0LCAweGRjLAorCTB4OTksIDB4M2QsIDB4MDksIDB4MjQsIDB4MGYsIDB4ZWUsIDB4NWUsIDB4YmEsIDB4YjEsIDB4OTcsIDB4NTIsIDB4NmQsCisJMHgyZiwgMHhhZCwgMHg0YiwgMHhjYiwgMHhmNywgMHgzMiwgMHhhYSwgMHhkZSwgMHg5ZCwgMHg1YSwgMHhmMSwgMHhhZSwKKwkweDYwLCAweDFmLCAweGJiLCAweDJmLCAweGYxLCAweDhjLCAweDdiLCAweDY0LCAweGRjLCAweDYwLCAweDc5LCAweDdiLAorCTB4ZjQsIDB4ZTUsIDB4NzQsIDB4MDAsIDB4N2IsIDB4NGMsIDB4NmEsIDB4NzksIDB4MTUsIDB4NmIsIDB4ZWQsIDB4NTEsCisJMHgzYywgMHhjZiwgMHg5NywgMHhjNywgMHg3MCwgMHhhNSwgMHg3ZCwgMHhhOCwgMHg3OSwgMHg5NCwgMHg4ZCwgMHg0YywKKwkweDI4LCAweDNlLCAweDhmLCAweGFiLCAweDdkLCAweDJjLCAweDk0LCAweDdmLCAweDQxLCAweDBhLCAweDI3LCAweDdlLAorCTB4MDksIDB4N2UsIDB4MmYsIDB4NTgsIDB4MGYsIDB4NjMsIDB4MmQsIDB4OTEsIDB4ZmMsIDB4MjgsIDB4MDYsIDB4ZjAsCisJMHg5MywgMHg3YiwgMHg2NSwgMHhhZCwgMHhlYiwgMHgwZiwgMHg0MywgMHg2ZSwgMHg3ZSwgMHgxMCwgMHg4MSwgMHg4YywKKwkweDM1LCAweGY3LCAweGI5LCAweDVhLCAweGRmLCAweGU3LCAweDZiLCAweDUzLCAweDgwLCAweDllLCAweDJhLCAweDYyLAorCTB4Y2UsIDB4MTgsIDB4NjgsIDB4MDgsIDB4YmUsIDB4NzMsIDB4NTAsIDB4ODYsIDB4MWMsIDB4Y2EsIDB4YTMsIDB4MjcsCisJMHgzNiwgMHgyZSwgMHhiNiwgMHg5NSwgMHgxNywgMHgzZiwgMHhjZSwgMHhlMCwgMHhmYSwgMHhiNCwgMHhmOSwgMHg1YywKKwkweGNjLCAweDEwLCAweGQ2LCAweDJmLCAweDdkLCAweGRlLCAweGY5LCAweDdjLCAweDhiLCAweDJjLCAweDM1LCAweGVhLAorCTB4YzAsIDB4MTQsIDB4ZTgsIDB4MjksIDB4MzgsIDB4ZTQsIDB4OTMsIDB4YWYsIDB4OWIsIDB4ZmUsIDB4ZGEsIDB4YWYsCisJMHhhYSwgMHhmZCwgMHg0YywgMHhhYSwgMHg5YSwgMHhkZCwgMHg3MywgMHgzNSwgMHgxZCwgMHg5ZCwgMHg0MCwgMHgwYywKKwkweGUyLCAweGVhLCAweGRjLCAweDdkLCAweDFlLCAweDZmLCAweDdjLCAweGRkLCAweDhjLCAweDc4LCAweDcyLCAweDY2LAorCTB4MWUsIDB4NDcsIDB4ZGIsIDB4ZjEsIDB4ZjUsIDB4NjAsIDB4OTMsIDB4NzUsIDB4YjcsIDB4ZTIsIDB4MDUsIDB4OWYsCisJMHgxMSwgMHg1MywgMHg1YywgMHg1OSwgMHg4ZSwgMHhkNSwgMHg2NCwgMHhiOSwgMHhiNiwgMHg0MSwgMHgyZiwgMHhiZiwKKwkweGI3LCAweGNlLCAweGI1LCAweDQzLCAweGRhLCAweDFiLCAweGVjLCAweDE2LCAweGY0LCAweDNkLCAweGI1LCAweGNjLAorCTB4YmUsIDB4OTMsIDB4OTcsIDB4YTgsIDB4ODMsIDB4NDYsIDB4YzQsIDB4OTgsIDB4ZmIsIDB4NTMsIDB4ZjAsIDB4ZjIsCisJMHg2MywgMHhjOCwgMHg1NSwgMHg0NCwgMHhjYywgMHgxOSwgMHhlMiwgMHgxMCwgMHhlMywgMHg4ZCwgMHg3YSwgMHhiYywKKwkweGJiLCAweDIwLCAweGFiLCAweGM1LCAweGJhLCAweDU3LCAweDhhLCAweDM1LCAweDdlLCAweGYyLCAweDJhLCAweDYzLAorCTB4OGQsIDB4NzgsIDB4OTMsIDB4YjQsIDB4MTAsIDB4OGIsIDB4ODYsIDB4MTEsIDB4ZGIsIDB4NmEsIDB4ZDIsIDB4NjQsCisJMHgzZiwgMHgwOCwgMHgxZiwgMHg3NiwgMHhjNiwgMHg2YywgMHhiNiwgMHg3ZCwgMHg0YywgMHg4OCwgMHg0OCwgMHhmYiwKKwkweGRjLCAweDA2LCAweDg1LCAweDBiLCAweGQ2LCAweDRjLCAweDFkLCAweDE3LCAweDI2LCAweGMwLCAweGZiLCAweDExLAorCTB4YjcsIDB4YjYsIDB4MWEsIDB4NmQsIDB4OTcsIDB4YWIsIDB4Y2QsIDB4OGQsIDB4ZWIsIDB4NzEsIDB4ZmYsIDB4NTgsCisJMHgyZCwgMHhlZSwgMHhiZiwgMHhhMSwgMHg4MSwgMHg4ZiwgMHhhYiwgMHhlMSwgMHhlMiwgMHgxOSwgMHhmMCwgMHgyZCwKKwkweDhkLCAweGZjLCAweDk3LCAweDc5LCAweGVkLCAweDEwLCAweGYyLCAweDYxLCAweGU2LCAweDYyLCAweDE5LCAweGU0LAorCTB4YzQsIDB4ODksIDB4MzMsIDB4YzAsIDB4MmEsIDB4ZTQsIDB4YzgsIDB4ODksIDB4YjcsIDB4ZTAsIDB4NTcsIDB4OTAsCisJMHgzNywgMHgyNywgMHhlNiwgMHg5OSwgMHhiYiwgMHgyZSwgMHgyMiwgMHgzZiwgMHg3ZSwgMHgxYSwgMHhmOSwgMHhmMSwKKwkweDUzLCAweDk1LCAweDNlLCAweGYwLCAweDM3LCAweGE5LCAweGIwLCAweDczLCAweGVmLCAweDcxLCAweGQxLCAweGVlLAorCTB4NTIsIDB4ZjUsIDB4NjEsIDB4ZGEsIDB4NzMsIDB4MTQsIDB4N2UsIDB4YjQsIDB4NWEsIDB4M2QsIDB4OTAsIDB4ZWEsCisJMHg0MSwgMHg0ZSwgMHgxZSwgMHg5NywgMHg0ZiwgMHg5OSwgMHhjYywgMHg2MywgMHgzNSwgMHhiMywgMHhiYiwgMHg3ZiwKKwkweGMxLCAweDA4LCAweGM2LCAweGE0LCAweGQ5LCAweDJiLCAweGZhLCAweDgxLCAweDk1LCAweGJjLCAweGNmLCAweDI5LAorCTB4NWYsIDB4NzAsIDB4Y2MsIDB4YjgsIDB4MWMsIDB4ZWYsIDB4ZWYsIDB4YWEsIDB4ZjEsIDB4ZmUsIDB4YzIsIDB4MWEsCisJMHg2OSwgMHgxOSwgMHg1NiwgMHgzNSwgMHg4MCwgMHhlZSwgMHhmZSwgMHgwMywgMHhjNCwgMHhhYiwgMHgxNCwgMHhmYywKKwkweDNhLCAweGZjLCAweDZmLCAweDU1LCAweGVlLCAweDQ4LCAweDVkLCAweGFjLCAweDllLCAweGI3LCAweGQ3LCAweDQ5LAorCTB4YmUsIDB4ZWYsIDB4OGIsIDB4MWUsIDB4NjYsIDB4OGYsIDB4M2QsIDB4OTIsIDB4YjUsIDB4OGIsIDB4YjAsIDB4MGYsCisJMHhiNywgMHgxNiwgMHgzOSwgMHgzZSwgMHgxZCwgMHg0NiwgMHgxNCwgMHhjYSwgMHhiZiwgMHgwZSwgMHg1OSwgMHgxOCwKKwkweGZjLCAweDFiLCAweGM4LCAweDcwLCAweGNiLCAweDY5LCAweDE2LCAweGIwLCAweDc0LCAweGUwLCAweGYwLCAweDQyLAorCTB4MzQsIDB4YTIsIDB4ZWEsIDB4MzMsIDB4ZDcsIDB4ZDksIDB4ZWMsIDB4YjcsIDB4MjAsIDB4ZDMsIDB4NTEsIDB4NTksCisJMHg0MCwgMHhmYywgMHg1MCwgMHgxYSwgMHgwNCwgMHg4ZCwgMHg3ZCwgMHg5ZCwgMHgxOCwgMHg0ZiwgMHhiYiwgMHgyMywKKwkweGNmLCAweDQ3LCAweGUxLCAweDdiLCAweGM5LCAweGQzLCAweDI4LCAweGM2LCAweGVmLCAweGMyLCAweDk4LCAweDBlLAorCTB4NWMsIDB4YmYsIDB4NjgsIDB4MmMsIDB4NTgsIDB4Y2MsIDB4OWQsIDB4N2YsIDB4MGUsIDB4NmQsIDB4Y2UsIDB4MTEsCisJMHhmNCwgMHg5ZCwgMHg5ZiwgMHgwZSwgMHg4OSwgMHg5YSwgMHg5MywgMHhlZiwgMHg3NCwgMHgyYSwgMHhmYiwgMHhhZiwKKwkweGFmLCAweGM1LCAweDc1LCAweGY4LCAweGVjLCAweGJkLCAweGVhLCAweDJkLCAweGZkLCAweDgzLCAweDgxLCAweGY1LAorCTB4ZGEsIDB4MDIsIDB4ZWIsIDB4MGQsIDB4MDYsIDB4ZDYsIDB4MjMsIDB4OWQsIDB4MWQsIDB4MDEsIDB4M2EsIDB4M2IsCisJMHhmMCwgMHg3ZSwgMHgwZSwgMHg2YiwgMHgwZiwgMHhhYiwgMHg5OCwgMHhhNywgMHhiZSwgMHhlNiwgMHhmZCwgMHg4MSwKKwkweDM1LCAweGZkLCAweGZkLCAweDc1LCAweDA2LCAweGRlLCAweDdiLCAweDA3LCAweGViLCAweGIxLCAweDJmLCAweDFhLAorCTB4ZTgsIDB4MjMsIDB4MGQsIDB4ZWIsIDB4ZDEsIDB4YzcsIDB4NzYsIDB4NDcsIDB4ODAsIDB4MmUsIDB4ZDIsIDB4YmEsCisJMHgxNiwgMHhmZCwgMHgyYSwgMHg3ZSwgMHgwMiwgMHg5ZiwgMHg1YiwgMHhlMCwgMHhiNywgMHg3NCwgMHhmOCwgMHgwZSwKKwkweGQ2LCAweGEwLCAweDFiLCAweGY3LCAweGZhLCAweDY1LCAweGFjLCAweGViLCAweGNmLCAweDE3LCAweGM1LCAweDFjLAorCTB4MWMsIDB4Y2YsIDB4YjEsIDB4ODYsIDB4ZjcsIDB4M2UsIDB4ZmIsIDB4ZjksIDB4ZmMsIDB4MWIsIDB4ZDUsIDB4YWYsCisJMHgyYiwgMHhiZSwgMHhhZCwgMHgwNywgMHhlZCwgMHhhYSwgMHhlZSwgMHgyMiwgMHhmMywgMHgxZCwgMHgyNiwgMHhlNCwKKwkweGM5LCAweGZjLCAweDU4LCAweDkzLCAweDliLCAweDZjLCAweDVkLCAweGViLCAweGU5LCAweGE3LCAweGVjLCAweGQ3LAorCTB4NzksIDB4NTgsIDB4ZGEsIDB4YTIsIDB4NjUsIDB4OGYsIDB4YjMsIDB4NWUsIDB4ZDAsIDB4ZWEsIDB4ZTUsIDB4N2MsCisJMHhjOCwgMHgzZCwgMHg5NCwgMHg4ZiwgMHgzMSwgMHhiZCwgMHhlNywgMHhmNCwgMHgzMSwgMHg4YywgMHg1YiwgMHhlOCwKKwkweDNmLCAweDMzLCAweGRlLCAweDNkLCAweGFlLCAweGQwLCAweGUxLCAweDdkLCAweGE1LCAweDBlLCAweDM5LCAweGFmLAorCTB4NzgsIDB4NmEsIDB4YzksIDB4YjksIDB4MWEsIDB4NGYsIDB4NDMsIDB4ZGUsIDB4YjcsIDB4OTAsIDB4ODMsIDB4ZGUsCisJMHg3NywgMHgwNiwgMHgwMywgMHg3MSwgMHgxMSwgMHhlZSwgMHhjYiwgMHgxOSwgMHhkMCwgMHgxMCwgMHg5NywgMHg5ZSwKKwkweDdlLCAweGU2LCAweDZlLCAweDQ1LCAweDVjLCAweDU5LCAweGE3LCAweGQwLCAweDcwLCAweDc1LCAweGViLCAweDE3LAorCTB4M2QsIDB4ZmQsIDB4ZjAsIDB4NGIsIDB4YzAsIDB4YTEsIDB4OWUsIDB4ZmUsIDB4ZWYsIDB4YTgsIDB4N2MsIDB4YWUsCisJMHg1NCwgMHhiMSwgMHhiNCwgMHgzYiwgMHgxYywgMHhiNywgMHg0NiwgMHg3NCwgMHhjZSwgMHhiZSwgMHg1YywgMHg4ZCwKKwkweDY4LCAweGEwLCAweDk5LCAweDc1LCAweDBkLCAweGJmLCAweDQ2LCAweDc0LCAweDRlLCAweDU0LCAweDhkLCAweGU4LAorCTB4ZTQsIDB4MTUsIDB4NmEsIDB4NDQsIDB4OTksIDB4YWIsIDB4YWYsIDB4MTEsIDB4NzEsIDB4N2UsIDB4NTMsIDB4ZWUsCisJMHgxZSwgMHgxMCwgMHhlZCwgMHg0YiwgMHg1ZSwgMHg4ZCwgMHhlOCwgMHg4MiwgMHhiOCwgMHgzNSwgMHhhMiwgMHhmMywKKwkweGIyLCAweDdhLCAweDhkLCAweGU4LCAweDY4LCAweDQzLCAweDhkLCAweDY4LCAweGJkLCAweGFhLCAweDExLCAweDcxLAorCTB4MWUsIDB4YjcsIDB4NDYsIDB4YzQsIDB4NzYsIDB4YmUsIDB4N2YsIDB4MzAsIDB4NTAsIDB4ZWIsIDB4MDAsIDB4ZmUsCisJMHgzYSwgMHhiNywgMHg4MiwgMHg2ZiwgMHg5NiwgMHgzNiwgMHhlYSwgMHhmOCwgMHg5OCwgMHg0NiwgMHhlYywgMHhiZiwKKwkweGJlLCAweGU2LCAweGJmLCAweGVhLCAweGY4LCAweGE2LCAweDI5LCAweDlkLCAweGJiLCAweDEyLCAweGJlLCAweDhkLAorCTB4YmEsIDB4NzEsIDB4YzksIDB4MzIsIDB4NmMsIDB4OWIsIDB4YWEsIDB4YzUsIDB4MmUsIDB4YmYsIDB4ZGMsIDB4Y2MsCisJMHgxYywgMHg3YSwgMHhiMiwgMHg1YywgMHg5ZiwgMHg3NywgMHgxMiwgMHhmMiwgMHgxZSwgMHhhYiwgMHhkNSwgMHg0OSwKKwkweDJlLCAweDE1LCAweDFmLCAweDQ1LCAweGU1LCAweGUwLCAweGFhLCAweGRmLCAweDlhLCAweDYyLCAweDk5LCAweDk1LAorCTB4ZGYsIDB4OWEsIDB4MzQsIDB4ODksIDB4ODIsIDB4Y2UsIDB4N2MsIDB4N2YsIDB4NWUsIDB4ZTUsIDB4NWQsIDB4MGIsCisJMHhjZSwgMHhjZiwgMHhjYiwgMHhkMiwgMHhiZCwgMHgxNiwgMHhmMCwgMHhjNywgMHhhZiwgMHg5ZiwgMHg1MCwgMHhiZSwKKwkweDc1LCAweDlmLCAweDkyLCAweGQ1LCAweDNmLCAweGJhLCAweDFhLCAweGNhLCAweDNlLCAweDU1LCAweDQzLCAweGY5LAorCTB4NWEsIDB4NzMsIDB4YjAsIDB4ODYsIDB4NzIsIDB4NGUsIDB4MmUsIDB4NWYsIDB4NDMsIDB4ZDksIDB4YjcsIDB4NGEsCisJMHgwZCwgMHhlNSwgMHgxNSwgMHhhOSwgMHhkNywgMHg1MCwgMHg1ZSwgMHgxMSwgMHhiZiwgMHg4NiwgMHg2MiwgMHhjOCwKKwkweGQyLCAweDdhLCAweGNlLCAweGIzLCAweDFmLCAweGVmLCAweDhjLCAweGUwLCAweDM3LCAweDhjLCAweDlmLCAweDViLAorCTB4NTMsIDB4MzksIDB4NTcsIDB4YTMsIDB4N2YsIDB4YjUsIDB4OWEsIDB4Y2EsIDB4MzcsIDB4OWIsIDB4ZGYsIDB4NGYsCisJMHg0ZCwgMHhjNSwgMHhmNSwgMHgwMSwgMHg3ZSwgMHg0ZCwgMHhhNSwgMHgwNSwgMHhmMSwgMHgwZSwgMHg3YywgMHg4ZSwKKwkweDFlLCAweGFjLCAweGE5LCAweGZjLCAweDJkLCAweGVkLCAweDAxLCAweDdkLCAweDJhLCAweDQ2LCAweDQwLCAweDNmLAorCTB4ZWMsIDB4MDIsIDB4N2UsIDB4MjksIDB4YTMsIDB4NmEsIDB4MWMsIDB4OWYsIDB4ZjYsIDB4NzgsIDB4YjgsIDB4MWIsCisJMHg3YiwgMHg4ZSwgMHg0MywgMHgxNiwgMHhlNCwgMHg2MywgMHg4ZiwgMHg4YSwgMHgyZCwgMHgzMywgMHg2NiwgMHg0YywKKwkweGNiLCAweGY2LCAweGMyLCAweDliLCAweDRkLCAweGYzLCAweDViLCAweDc0LCAweDRjLCAweGM2LCAweDJiLCAweGQ0LAorCTB4ZjEsIDB4MmUsIDB4YzQsIDB4ZTIsIDB4MjYsIDB4ZmEsIDB4NzYsIDB4YTMsIDB4ZWQsIDB4YzcsIDB4NTQsIDB4ZmQsCisJMHhiNSwgMHgzOSwgMHg2OCwgMHg5YiwgMHgwYiwgMHhjMCwgMHg1OSwgMHhlMCwgMHhjNCwgMHg1NSwgMHhmOCwgMHhhOCwKKwkweDZkLCAweGEwLCAweDM5LCAweGI4LCAweDhmLCAweDIyLCAweGZjLCAweDEzLCAweGZhLCAweDk0LCAweGNjLCAweDE5LAorCTB4NWIsIDB4ZmEsIDB4YjQsIDB4YzQsIDB4NjksIDB4ZTcsIDB4NTcsIDB4MzEsIDB4MWYsIDB4ZmIsIDB4YjYsIDB4YTksCisJMHg3YywgMHhhYywgMHgzMCwgMHhjMCwgMHhiZCwgMHhkMiwgMHhkNywgMHgyZCwgMHg4MiwgMHgzZSwgMHhmNCwgMHg5NSwKKwkweDk4LCAweDAzLCAweGQyLCAweGVmLCAweGY5LCAweDM5LCAweDVhLCAweDQ0LCAweGU1LCAweDY4LCAweDlkLCAweDhhLAorCTB4MWYsIDB4ZTQsIDB4ZjUsIDB4OGQsIDB4NjEsIDB4NjIsIDB4NjUsIDB4YTcsIDB4Y2QsIDB4M2QsIDB4MGMsIDB4N2IsCisJMHg1OCwgMHhjNywgMHhiNiwgMHg5YiwgMHgwYiwgMHg2NiwgMHg3NCwgMHhkZSwgMHgzZiwgMHgwMiwgMHhiOSwgMHhiMiwKKwkweDRlLCAweGUzLCAweGNiLCAweGVmLCAweDIxLCAweDZmLCAweGRmLCAweDgzLCAweDUyLCAweGVjLCAweDk0LCAweGYwLAorCTB4N2EsIDB4ZDAsIDB4OTMsIDB4OWYsIDB4NjEsIDB4ZGMsIDB4ZmQsIDB4MDksIDB4OTUsIDB4ODMsIDB4NDQsIDB4ZWQsCisJMHg0YiwgMHhkYiwgMHhlZCwgMHg1ZCwgMHhkNywgMHg2MCwgMHhiNywgMHgyMywgMHg5NywgMHhiNSwgMHhkYiwgMHhjZiwKKwkweDg1LCAweDgzLCAweDc2LCAweDdiLCAweGQ3LCAweDM1LCAweGQ4LCAweGVkLCAweGZlLCAweDZiLCAweGIyLCAweDViLAorCTB4ZWUsIDB4OGQsIDB4OTgsIDB4ZTQsIDB4ZDcsIDB4YzQsIDB4NTYsIDB4YzYsIDB4NTksIDB4ZmUsIDB4YmEsIDB4MTMsCisJMHg1OCwgMHgzMywgMHg3MywgMHg4OSwgMHgzNSwgMHhjNywgMHgyZSwgMHg1OSwgMHg1YiwgMHg2ZCwgMHg4YywgMHhiMSwKKwkweGFlLCAweDQ2LCAweGRlLCAweGNjLCAweGFkLCAweGU4LCAweDZmLCAweDIzLCAweDllLCAweDVmLCAweGJhLCAweGRkLAorCTB4Y2IsIDB4ZTcsIDB4ZmQsIDB4YmMsIDB4M2UsIDB4NjgsIDB4M2YsIDB4ZDQsIDB4MGIsIDB4ZWEsIDB4YzIsIDB4NjMsCisJMHhlMCwgMHgxNywgMHhmNSwgMHhjMSwgMHhiNywgMHhiOSwgMHg5ZSwgMHgwNiwgMHgxZCwgMHg1YywgMHg0NCwgMHhiZSwKKwkweGRmLCAweGUzLCAweGU5LCAweDIwLCAweDY1LCAweGRkLCAweGFiLCAweGJlLCAweDExLCAweDk1LCAweDljLCAweDQ3LAorCTB4ZGMsIDB4M2MsIDB4MWYsIDB4M2EsIDB4OTAsIDB4MmYsIDB4ZjksIDB4YjYsIDB4MDYsIDB4OWUsIDB4NDQsIDB4ZmQsCisJMHg2NywgMHhlNCwgMHhhMywgMHg4ZCwgMHg5OCwgMHg2NywgMHgwYiwgMHhlMiwgMHgzNSwgMHhmMCwgMHg0OCwgMHhmNSwKKwkweDJmLCAweGFmLCAweDA5LCAweDVmLCAweDFlLCAweGNmLCAweGE0LCAweDE4LCAweGMyLCAweGQ4LCAweDUzLCAweDAzLAorCTB4YjAsIDB4ZjEsIDB4MDEsIDB4NjIsIDB4NTQsIDB4MWEsIDB4NzksIDB4MGYsIDB4ZjUsIDB4OTAsIDB4YmEsIDB4YjksCisJMHgyOSwgMHhiOSwgMHg0MywgMHg2NywgMHg0YywgMHhiNSwgMHgwNywgMHhiNiwgMHg0NywgMHg3ZCwgMHg4ZCwgMHhjYiwKKwkweDhlLCAweGNhLCAweGE2LCAweDMzLCAweGU3LCAweDc0LCAweGFlLCAweDUxLCAweGFkLCAweGU2LCAweDk5LCAweDJiLAorCTB4NWEsIDB4YTIsIDB4NzcsIDB4ZjcsIDB4ZmYsIDB4NDUsIDB4OTgsIDB4N2UsIDB4ZTksIDB4N2EsIDB4ZGIsIDB4ZjAsCisJMHg3NCwgMHgyZCwgMHg4MywgMHg3YiwgMHhlYSwgMHhlZCwgMHhlYiwgMHhmMCwgMHhmNywgMHhmYywgMHhjNiwgMHhmZSwKKwkweDAzLCAweGY0LCAweGM3LCAweDYwLCAweGYzLCAweGY0LCAweGVmLCAweGNjLCAweDQ3LCAweGI2LCAweDdhLCAweGUzLAorCTB4N2EsIDB4ZDQsIDB4ZjcsIDB4Y2YsIDB4NmMsIDB4ZWEsIDB4NTYsIDB4ZWYsIDB4YmIsIDB4MTMsIDB4ZmQsIDB4NGYsCisJMHg4MiwgMHgzZSwgMHg3YiwgMHg5OSwgMHg5YywgMHg3OSwgMHg0NiwgMHgyMSwgMHhhNywgMHhmMiwgMHgxOSwgMHhiZSwKKwkweGFmLCAweDc0LCAweDEyLCAweDM5LCAweDg4LCAweDE5LCAweGE4LCAweGE1LCAweDg3LCAweGJkLCAweGRjLCAweDhkLAorCTB4MzYsIDB4MTYsIDB4ODEsIDB4MGMsIDB4YjcsIDB4N2IsIDB4YjksIDB4MGEsIDB4ZjMsIDB4ZDcsIDB4ZTUsIDB4NjcsCisJMHgxMywgMHg1NiwgMHhkNywgMHg4MSwgMHgwZCwgMHhlZiwgMHg0MywgMHgwNywgMHgxYSwgMHhlNSwgMHgxNywgMHg4NiwKKwkweGVkLCAweGZiLCAweGYyLCAweGYzLCAweGUzLCAweDk4LCAweDc5LCAweDZmLCAweGRmLCAweDNkLCAweGFlLCAweDBjLAorCTB4N2YsIDB4MmMsIDB4ZjYsIDB4YTksIDB4MDUsIDB4ZjYsIDB4ZTksIDB4ZTMsIDB4ZDEsIDB4M2UsIDB4NmYsIDB4OWYsCisJMHg1YiwgMHgxYiwgMHhmMCwgMHg2OCwgMHhhNCwgMHhjMSwgMHg2NiwgMHgzZiwgMHg0YSwgMHgzYywgMHgzYSwgMHhiNCwKKwkweGU2LCAweGEzLCAweGM3LCAweDIzLCAweGVlLCAweDZiLCAweGUzLCAweGFhLCAweDM4LCAweGU0LCAweGVlLCAweGUzLAorCTB4NzcsIDB4NDUsIDB4NGYsIDB4N2YsIDB4OTgsIDB4ZjksIDB4ZGUsIDB4ZmIsIDB4OTEsIDB4NGYsIDB4MTAsIDB4NDcsCisJMHgyOCwgMHg5MywgMHgzNiwgMHgxNSwgMHhjMywgMHhiYSwgMHhiNiwgMHgwNywgMHg1ZiwgMHg1ZSwgMHgwYSwgMHhjOSwKKwkweDFiLCAweGY3LCAweDg0LCAweGU1LCAweDdmLCAweDZmLCAweGUzLCAweGY3LCAweDMwLCAweGQzLCAweGFiLCAweDY5LAorCTB4YjEsIDB4ZmQsIDB4YzIsIDB4MWEsIDB4ZDcsIDB4MGYsIDB4YmQsIDB4ZDAsIDB4ZWUsIDB4ZmEsIDB4MWQsIDB4YmUsCisJMHhlMywgMHhkYiwgMHhiMywgMHg4NSwgMHhlNywgMHg3YywgMHhiNiwgMHg5MSwgMHg1ZiwgMHg0YywgMHhhZSwgMHgyMSwKKwkweDA3LCAweGRjLCAweDY0LCAweDVkLCAweGQwLCAweDU3LCAweGNiLCAweDAxLCAweDJmLCAweDVmLCAweDBmLCAweGFjLAorCTB4ZTcsIDB4ODAsIDB4YzQsIDB4ZDksIDB4MGUsIDB4YTUsIDB4MWIsIDB4ZjksIDB4MjgsIDB4NzMsIDB4MWYsIDB4YzMsCisJMHhjMywgMHg0ZSwgMHhkZSwgMHgyMywgMHhiNywgMHg3NSwgMHg5MCwgMHhlZiwgMHg0MiwgMHhiNiwgMHhjZiwgMHgyMSwKKwkweDVlLCAweDdhLCAweGQ2LCAweDQxLCAweDhlLCAweGViLCAweDIwLCAweGI3LCAweDc1LCAweDkwLCAweGRiLCAweDNhLAorCTB4YzgsIDB4NmQsIDB4OWQsIDB4YTQsIDB4OTcsIDB4MjMsIDB4OGYsIDB4NzgsIDB4NzUsIDB4N2YsIDB4N2UsIDB4ZTMsCisJMHg2NiwgMHg3ZCwgMHhhMSwgMHgwOCwgMHg1ZiwgMHgzMiwgMHhjNSwgMHg3MywgMHgxMywgMHg3YSwgMHgzNiwgMHhiNSwKKwkweGM2LCAweGRiLCAweDlmLCAweDVmLCAweDEzLCAweGVmLCAweGYyLCAweDZhLCAweDM2LCAweGRmLCAweDU0LCAweDc1LAorCTB4NDMsIDB4ZDEsIDB4MWYsIDB4NjgsIDB4NzEsIDB4YmYsIDB4ODMsIDB4ZjMsIDB4N2MsIDB4YzcsIDB4YWYsIDB4MjEsCisJMHgyZSwgMHg1MSwgMHg2NywgMHg4OCwgMHg2OCwgMHhhMywgMHg1NSwgMHgzZCwgMHhjZCwgMHg5YSwgMHg4YywgMHhlOCwKKwkweDdhLCAweGZhLCAweDE2LCAweGJjLCAweGIzLCAweGM1LCAweGNkLCAweDA5LCAweGEyLCAweDYyLCAweGU4LCAweGU5LAorCTB4NTYsIDB4ZjIsIDB4NTQsIDB4ZDMsIDB4ZDMsIDB4NmIsIDB4YmQsIDB4YjksIDB4ZjYsIDB4YjcsIDB4YjgsIDB4YjEsCisJMHg1NSwgMHgyZiwgMHhkYiwgMHhhNiwgMHhjZSwgMHgzOCwgMHg0MSwgMHhjNSwgMHhkYSwgMHg3ZSwgMHhmZiwgMHhjNSwKKwkweGY2LCAweGU1LCAweDZiLCAweDg1LCAweDE0LCAweGJlLCAweDY3LCAweDUzLCAweGY3LCAweDYyLCAweDNlLCAweGI2LAorCTB4ZWIsIDB4ZmMsIDB4ZDYsIDB4MmYsIDB4YzksIDB4ZWYsIDB4OTAsIDB4YzcsIDB4NmYsIDB4OTcsIDB4YzcsIDB4MDYsCisJMHhjNywgMHhhOSwgMHhiYSwgMHgzMCwgMHg3OSwgMHhlZCwgMHhjZiwgMHhhNywgMHhlYSwgMHg3YSwgMHg1OCwgMHg0NywKKwkweDlkLCAweGNkLCAweGMwLCAweGY1LCAweDA3LCAweGE2LCAweGI0LCAweDhkLCAweGVlLCAweDBlLCAweGQ5LCAweGMxLAorCTB4NzUsIDB4ZmQsIDB4NmYsIDB4ZTIsIDB4NTcsIDB4YjMsIDB4NjYsIDB4OGYsIDB4ZmEsIDB4OGUsIDB4ZTYsIDB4ZmEsCisJMHg4YywgMHg5MCwgMHhkMiwgMHg0MSwgMHgzMywgMHhjZCwgMHg3ZCwgMHhmZCwgMHg1MCwgMHg5ZCwgMHhhOSwgMHhhMSwKKwkweGZlLCAweGU1LCAweDkwLCAweGM3LCAweDRjLCAweDBkLCAweDZjLCAweDhhLCAweDliLCAweGZhLCAweDQ4LCAweDBiLAorCTB4ZWIsIDB4YWYsIDB4NDMsIDB4MTUsIDB4MWYsIDB4ZjcsIDB4YjgsIDB4NWUsIDB4YTMsIDB4MWYsIDB4NjcsIDB4NWQsCisJMHhjZCwgMHhjNywgMHgzMywgMHhkOSwgMHhlMCwgMHhkNiwgMHhkYiwgMHgzZSwgMHg4OCwgMHgyZCwgMHhiNSwgMHgzNCwKKwkweGQ4LCAweDkyLCAweGJmLCAweDRmLCAweGVlLCAweDlmLCAweGQ3LCAweGQ1LCAweGNmLCAweDQzLCAweDJjLCAweDU2LAorCTB4MDIsIDB4ZGYsIDB4NDcsIDB4NmEsIDB4YmEsIDB4YzEsIDB4YjMsIDB4MmEsIDB4OWYsIDB4ODUsIDB4MGUsIDB4ZjIsCisJMHhkYiwgMHhjMCwgMHg0ZSwgMHhkOCwgMHg1MSwgMHhiNSwgMHgzYSwgMHhjNCwgMHgxYSwgMHg3MywgMHhkZiwgMHg2NywKKwkweDU0LCAweDdlLCAweGE5LCAweGE3LCAweGU3LCAweDU1LCAweGZkLCAweGMxLCAweDVjLCAweDUxLCAweDdmLCAweDE4LAorCTB4ODIsIDB4YWUsIDB4MjAsIDB4MDYsIDB4NzAsIDB4ZGEsIDB4NTQsIDB4NGMsIDB4YTcsIDB4ZTIsIDB4ODUsIDB4NGEsCisJMHhlMywgMHhmNywgMHg5NywgMHhmYiwgMHg1YiwgMHg1ZCwgMHgzZSwgMHhmYywgMHg1ZCwgMHg4YiwgMHhmYiwgMHgwZCwKKwkweGUyLCAweDhmLCAweGEyLCAweGNiLCAweGRiLCAweDdjLCAweGZmLCAweGFmLCAweDViLCAweGZjLCAweGIzLCAweDNiLAorCTB4ODUsIDB4MTMsIDB4NDMsIDB4ZDAsIDB4NDUsIDB4ZTQsIDB4ZTQsIDB4NmEsIDB4M2UsIDB4YzQsIDB4YmIsIDB4NGYsCisJMHhjYywgMHg3NiwgMHgyYywgMHgxZiwgMHg4ZiwgMHhiZSwgMHgxMywgMHhmZSwgMHhmOCwgMHg4ZSwgMHg4NiwgMHhmMSwKKwkweDFkLCAweDE4LCAweGZmLCAweDdiLCAweDBkLCAweGUzLCAweDNiLCAweDAyLCAweGUzLCAweGEzLCAweDBkLCAweGUzLAorCTB4YTMsIDB4MTgsIDB4ZmYsIDB4N2MsIDB4YzMsIDB4ZjgsIDB4NjgsIDB4NjAsIDB4N2MsIDB4NjcsIDB4YzMsIDB4ZjgsCisJMHg0ZSwgMHg4YywgMHg3ZiwgMHhhMSwgMHg2MSwgMHgzYywgMHhmYSwgMHg0ZSwgMHgzNCwgMHg3OSwgMHhkZiwgMHhjNSwKKwkweDg4LCAweGIxLCAweGZiLCAweGJkLCAweDVjLCAweDFjLCAweGQ3LCAweDcyLCAweGUzLCAweGI3LCAweDE2LCAweGVhLAorCTB4NWQsIDB4MTcsIDB4NjQsIDB4ZTAsIDB4OWYsIDB4YTcsIDB4YTMsIDB4YmQsIDB4NjYsIDB4NjAsIDB4YWYsIDB4ZjUsCisJMHg1OCwgMHhjNiwgMHhkNSwgMHhjNywgMHhhMCwgMHgyZSwgMHgxMiwgMHgxZiwgMHg4YSwgMHg2MiwgMHhkOCwgMHhkMCwKKwkweDlkLCAweDEyLCAweDc0LCAweGE4LCAweGU0LCAweGZiLCAweDI0LCAweDllLCAweDgzLCAweGUyLCAweDE5LCAweDUzLAorCTB4ZDcsIDB4ZjcsIDB4ODYsIDB4ZWMsIDB4NDUsIDB4MmYsIDB4MDcsIDB4N2IsIDB4OWIsIDB4YjQsIDB4MDMsIDB4MmYsCisJMHg3ZCwgMHhjYywgMHg5NCwgMHg2MywgMHhhZSwgMHhkZCwgMHg1MCwgMHg3ZiwgMHgzOSwgMHhiZiwgMHg2NywgMHgzZiwKKwkweGQ0LCAweDU1LCAweDZmLCAweDlkLCAweGExLCAweDE1LCAweGI4LCAweDE2LCAweDVmLCAweDUxLCAweGRiLCAweDMyLAorCTB4YWUsIDB4MDIsIDB4ZDcsIDB4NDYsIDB4NmEsIDB4YjgsIDB4ZjYsIDB4NTksIDB4OTksIDB4YWYsIDB4ZTUsIDB4ZGIsCisJMHhjMywgMHg3MiwgMHhjMCwgMHhkOSwgMHhjNSwgMHgzMywgMHgzNiwgMHhjNywgMHgzMiwgMHhmMiwgMHhlMSwgMHhlNCwKKwkweGRiLCAweGJiLCAweDZhLCAweDdlLCAweDkyLCAweDY3LCAweDNhLCAweDk2LCAweDBlLCAweDMxLCAweDg3LCAweGYyLAorCTB4NmIsIDB4YjMsIDB4NTMsIDB4Y2UsIDB4Y2YsIDB4YjYsIDB4NDIsIDB4MmUsIDB4YjAsIDB4OGQsIDB4NmIsIDB4Y2QsCisJMHhiNywgMHgzOSwgMHg1ZiwgMHg1NCwgMHgwZSwgMHhiOCwgMHhlNywgMHgxZCwgMHg2YSwgMHhmMywgMHgxNiwgMHg2YiwKKwkweGYzLCAweGM2LCAweDNjLCAweDdiLCAweGEzLCAweDBmLCAweGFlLCAweGZiLCAweGNiLCAweDFjLCAweGZjLCAweGU1LAorCTB4MTgsIDB4NzIsIDB4ZWUsIDB4NDUsIDB4NjcsIDB4YjUsIDB4ZmEsIDB4ZTgsIDB4YjUsIDB4ZmEsIDB4Y2IsIDB4YzYsCisJMHgzYSwgMHg3MywgMHhhMywgMHhiZiwgMHhlNCwgMHgzYSwgMHg4ZCwgMHhiNSwgMHhlNSwgMHg3OCwgMHgwMywgMHhmZSwKKwkweDUzLCAweDlmLCAweDBlLCAweDdiLCAweDMxLCAweDM1LCAweGFlLCAweGE1LCAweGMzLCAweGIwLCAweDQ3LCAweDVkLAorCTB4YzYsIDB4OTQsIDB4ZmUsIDB4YjIsIDB4ZWQsIDB4ZTcsIDB4OTYsIDB4YmIsIDB4NmIsIDB4YjksIDB4NjUsIDB4M2QsCisJMHgxZiwgMHg0NCwgMHhlYywgMHg5YSwgMHhmYywgMHhhNCwgMHg4NywgMHg4ZiwgMHg4YywgMHg5MSwgMHhhNywgMHhkMCwKKwkweDdmLCAweDBjLCAweDNhLCAweGMwLCAweDY3LCAweGFjLCAweDk3LCAweGRlLCAweDJjLCAweDlmLCAweDMyLCAweDVkLAorCTB4ZmYsIDB4ZTQsIDB4ZDYsIDB4YTYsIDB4NzYsIDB4YWIsIDB4ZjgsIDB4OWYsIDB4ZGYsIDB4MGIsIDB4MGEsIDB4YTksCisJMHg3NiwgMHgyZiwgMHhkZSwgMHhiYiwgMHgxMiwgMHhhZSwgMHgyZSwgMHhjZiwgMHg0ZCwgMHg3NSwgMHhmZCwgMHg1MSwKKwkweGJjLCAweGNiLCAweGRjLCAweGQ0LCAweDhjLCAweDEwLCAweDQzLCAweGIzLCAweDk1LCAweGNiLCAweGJlLCAweDVmLAorCTB4YTQsIDB4N2YsIDB4MjksIDB4YTgsIDB4ZWYsIDB4ODIsIDB4MmEsIDB4MGYsIDB4YzUsIDB4YjgsIDB4NDUsIDB4ZWYsCisJMHg3ZCwgMHgzNywgMHgwZiwgMHhjZCwgMHg1NiwgMHhiZSwgMHhkZCwgMHhlYSwgMHhlMiwgMHhlMCwgMHhlNSwgMHg3MiwKKwkweDk2LCAweDlmLCAweDg4LCAweGIwLCAweGFlLCAweGI3LCAweGU4LCAweDVjLCAweDg5LCAweGQ2LCAweDk1LCAweDc5LAorCTB4YWYsIDB4YjEsIDB4MjIsIDB4ZWYsIDB4MWQsIDB4ZjUsIDB4ZjIsIDB4ZGEsIDB4Y2YsIDB4YTksIDB4YmMsIDB4ZDcsCisJMHhlNSwgMHgzMSwgMHhmNywgMHgxMiwgMHhjYywgMHhhMywgMHg2YywgMHg2MCwgMHgyMSwgMHhiZiwgMHhhOSwgMHgxMCwKKwkweDFmLCAweDI2LCAweDk0LCAweGRmLCAweGNhLCAweDRmLCAweGRmLCAweDA5LCAweDNlLCAweDQ3LCAweDU3LCAweGQxLAorCTB4OWIsIDB4OGYsIDB4ZGEsIDB4NGYsIDB4ZjgsIDB4N2IsIDB4M2YsIDB4MmMsIDB4NmUsIDB4YmQsIDB4NmUsIDB4MjcsCisJMHg2OCwgMHg2MSwgMHg2ZSwgMHgxNSwgMHhmMiwgMHhmNCwgMHhlMSwgMHhiYiwgMHhkZSwgMHgzOSwgMHg1MywgMHg3ZiwKKwkweDljLCAweDlmLCAweGM3LCAweGQ3LCAweGJlLCAweGJiLCAweDE2LCAweDMzLCAweGNiLCAweGVhLCAweDI3LCAweDFiLAorCTB4MDksIDB4YzMsIDB4OTAsIDB4N2IsIDB4ZTYsIDB4MWEsIDB4YmUsIDB4NWIsIDB4N2MsIDB4OTAsIDB4ZjMsIDB4MTEsCisJMHg4ZCwgMHg3ZSwgMHg4ZCwgMHhkZiwgMHg0ZCwgMHhmOSwgMHhhZCwgMHg1NCwgMHhiNCwgMHhiYiwgMHg3YiwgMHg2ZCwKKwkweGQ4LCAweDAwLCAweGNmLCAweDJjLCAweDA3LCAweGYxLCAweDM1LCAweDJjLCAweGY5LCAweDM5LCAweDA5LCAweDQ3LAorCTB4ZDMsIDB4ZmMsIDB4MDYsIDB4NDAsIDB4ZmYsIDB4ZmYsIDB4YmEsIDB4YjcsIDB4Y2YsIDB4OTgsIDB4ZWMsIDB4OWYsCisJMHg3MSwgMHg2YiwgMHg5ZSwgMHhmYSwgMHg2NSwgMHhjZiwgMHhjNSwgMHgxZCwgMHgwMCwgMHgxZiwgMHgxMiwgMHg0NywKKwkweGZkLCAweDlhLCAweGE3LCAweGVlLCAweDllLCAweDhiLCAweDNiLCAweGZhLCAweGUxLCAweDlkLCAweDhiLCAweGUzLAorCTB4ZmMsIDB4YTYsIDB4ZWMsIDB4NWEsIDB4ZTUsIDB4NWMsIDB4OWMsIDB4NzEsIDB4OTUsIDB4ZTcsIDB4ZTIsIDB4ZGEsCisJMHg1NSwgMHhjZCwgMHg5MywgMHhmMywgMHhiOCwgMHgzNSwgMHg0ZiwgMHhiNiwgMHhiYiwgMHhmYiwgMHg1OSwgMHgyYiwKKwkweGUxLCAweGQ5LCAweGI3LCAweDAxLCAweDc1LCAweDA2LCAweGI5LCAweGJiLCAweGZmLCAweDQ3LCAweDkxLCAweGEzLAorCTB4N2MsIDB4M2QsIDB4ZjIsIDB4ZDEsIDB4ZTcsIDB4MjgsIDB4ZGMsIDB4Y2IsIDB4YWYsIDB4YjgsIDB4ZGYsIDB4NzcsCisJMHhlNSwgMHg1YSwgMHhlYSwgMHgwMCwgMHgxZiwgMHhhYywgMHhhZSwgMHhiOSwgMHg1ZiwgMHhkNSwgMHgzNSwgMHhiZiwKKwkweDEzLCAweDA5LCAweGQ2LCAweDM1LCAweGY1LCAweDJiLCAweDljLCAweDBkLCAweGRiLCAweGJmLCAweDRhLCAweDVkLAorCTB4MzMsIDB4MTQsIDB4MzgsIDB4MWIsIDB4MTYsIDB4ZjIsIDB4Y2UsIDB4ODYsIDB4YjUsIDB4ZGIsIDB4YzgsIDB4MjUsCisJMHhiZCwgMHgzYSwgMHhhNiwgMHg3ZSwgMHhkOSwgMHhiMywgMHg2MSwgMHhmZiwgMHgxOSwgMHhmOSwgMHhlMCwgMHg3NSwKKwkweGNjLCAweDE1LCAweDY3LCAweGMzLCAweGUwLCAweGViLCAweDM2LCAweDQ4LCAweGZjLCAweDlhLCAweGYyLCAweDllLAorCTB4MGYsIDB4OTIsIDB4ZjMsIDB4ZjAsIDB4YmMsIDB4N2UsIDB4MTMsIDB4ZjYsIDB4MWMsIDB4OTIsIDB4NWQsIDB4NTEsCisJMHhlYSwgMHgyNywgMHhjZiwgMHgzNiwgMHhmNiwgMHhjMiwgMHgxNiwgMHg3MCwgMHhhZCwgMHhiMCwgMHg5ZCwgMHhhNCwKKwkweDhjLCAweGI0LCAweDkxLCAweGRlLCAweGU1LCAweGU3LCAweDEwLCAweGVhLCAweGU3LCAweDcxLCAweGMzLCAweGI1LAorCTB4ZjMsIDB4YjgsIDB4NDcsIDB4YTAsIDB4MzcsIDB4ZmEsIDB4NGMsIDB4NTgsIDB4MTYsIDB4MDIsIDB4M2EsIDB4MzUsCisJMHg4NSwgMHg3OCwgMHg0ZiwgMHg5ZiwgMHhiMywgMHhiYywgMHhlNywgMHhmYywgMHg5ZiwgMHg4YSwgMHgyOCwgMHgzMCwKKwkweDhmLCAweDY3LCAweDc4LCAweGRiLCAweGM0LCAweDk4LCAweDczLCAweGJmLCAweDU5LCAweGJhLCAweGZmLCAweDU3LAorCTB4MTIsIDB4YzMsIDB4MTgsIDB4OWUsIDB4ZjEsIDB4MGMsIDB4YzksIDB4MDEsIDB4NTUsIDB4YjMsIDB4ZjAsIDB4NzUsCisJMHg3OSwgMHhjNywgMHg1YSwgMHg2OSwgMHg1OSwgMHg5ZiwgMHhhOSwgMHhiNywgMHhhMywgMHhhYiwgMHhmOCwgMHg3ZCwKKwkweGM0LCAweDkxLCAweDMzLCAweGQ0LCAweGU3LCAweDViLCAweDI1LCAweGU3LCAweGQ1LCAweDgzLCAweDBhLCAweDk1LAorCTB4NmQsIDB4NWUsIDB4N2UsIDB4YTEsIDB4YmUsIDB4ZWQsIDB4ODAsIDB4OTcsIDB4ZGQsIDB4OWUsIDB4MGYsIDB4YzYsCisJMHhiNSwgMHhkNCwgMHg0ZCwgMHg5ZiwgMHg4NywgMHgzNSwgMHg0ZSwgMHhjYSwgMHhkMCwgMHhmNCwgMHg5NiwgMHhkOCwKKwkweDM4LCAweGYwLCAweDZlLCAweDRjLCAweGFkLCAweDc5LCAweDJkLCAweDNjLCAweGQ3LCAweDJlLCAweGYxLCAweGJkLAorCTB4ZjEsIDB4NmEsIDB4ZjksIDB4ZWUsIDB4YzcsIDB4YzcsIDB4OGYsIDB4NjIsIDB4N2YsIDB4ZGQsIDB4ZDAsIDB4OGYsCisJMHg4NywgMHgyNSwgMHg3NywgMHhlMiwgMHg2NiwgMHgxOSwgMHg5YSwgMHg0ZCwgMHg4MCwgMHg5ZSwgMHgxZiwgMHg1NiwKKwkweDBiLCAweDI5LCAweGM0LCAweGQyLCAweDRmLCAweGYwLCAweGRjLCAweDE4LCAweDMwLCAweDE0LCAweDdjLCAweDdiLAorCTB4NjYsIDB4YzUsIDB4NzcsIDB4ZWMsIDB4ZTAsIDB4NTksIDB4YjMsIDB4NjQsIDB4ZWQsIDB4ZWMsIDB4ZDAsIDB4NTMsCisJMHgxNSwgMHgwOSwgMHg3NywgMHg5MCwgMHhlNiwgMHg5OSwgMHhmYSwgMHhkOSwgMHhlZiwgMHhjNSwgMHhjYSwgMHgwZSwKKwkweGU1LCAweGRiLCAweDllLCAweGFjLCAweDJjLCAweGFiLCAweGZkLCAweDI4LCAweDE5LCAweDRlLCAweDk0LCAweDlmLAorCTB4MDQsIDB4MmYsIDB4NWUsIDB4NTEsIDB4ZmUsIDB4ZWQsIDB4ODgsIDB4MjMsIDB4MzcsIDB4MTksIDB4NDIsIDB4NzksCisJMHg4OCwgMHgwNiwgMHgxZSwgMHhhOCwgMHgzMywgMHgxYywgMHhlZSwgMHhmNywgMHhmZCwgMHgyZSwgMHgyNSwgMHg1NywKKwkweDE3LCAweDJiLCAweDc2LCAweDA2LCAweGNlLCAweDYwLCAweGQ0LCAweDY1LCAweGViLCAweDllLCAweGNkLCAweDcwLAorCTB4NjUsIDB4ZTEsIDB4OWUsIDB4MWYsIDB4MjEsIDB4M2YsIDB4OTcsIDB4MGUsIDB4ZWQsIDB4YjIsIDB4ZGQsIDB4ZjMsCisJMHgyMywgMHgzZCwgMHg3MywgMHhlYywgMHhlYiwgMHg2YywgMHhmMCwgMHg3ZCwgMHg2MSwgMHhlOCwgMHgwMCwgMHhjZiwKKwkweDFkLCAweGYxLCAweGNjLCAweDM3LCAweDY5LCAweDU2LCAweGI1LCAweDhlLCAweDU1LCAweGJmLCAweDZkLCAweDVmLAorCTB4NWIsIDB4Y2QsIDB4ZDUsIDB4NWQsIDB4YjMsIDB4NWIsIDB4YWQsIDB4NzksIDB4OWQsIDB4ODcsIDB4NTksIDB4ZmUsCisJMHg1OSwgMHhlZiwgMHg5NCwgMHhmNiwgMHhmZiwgMHhkNCwgMHg1ZCwgMHg3YiwgMHg2YywgMHgxYiwgMHhmNywgMHg3ZCwKKwkweGZmLCAweGYyLCAweDQ4LCAweDNkLCAweGFjLCAweGU3LCAweDQ5LCAweGE2LCAweDY0LCAweDVhLCAweDUyLCAweDk0LAorCTB4M2IsIDB4ZTksIDB4NjQsIDB4MjksIDB4YjEsIDB4MTIsIDB4NzAsIDB4OWUsIDB4YmEsIDB4MGEsIDB4ODgsIDB4OWEsCisJMHhiMCwgMHgyNCwgMHhmZCwgMHg1OCwgMHgxMCwgMHgwYywgMHhiNCwgMHhhZCwgMHg2NCwgMHhlZSwgMHg5MiwgMHhhZCwKKwkweDBlLCAweDI1LCAweGE3LCAweDFkLCAweDMwLCAweDYwLCAweDZlLCAweGQ2LCAweDAyLCAweDY5LCAweDA3LCAweGM3LAorCTB4MGMsIDB4NjUsIDB4MjcsIDB4YzYsIDB4YWEsIDB4ODgsIDB4NGMsIDB4Y2MsIDB4NmEsIDB4MWQsIDB4YjAsIDB4NjIsCisJMHgxYywgMHhhNSwgMHgzOCwgMHg2OSwgMHhhNywgMHg4MCwgMHg2OSwgMHhkYSwgMHgwNCwgMHhjNSwgMHhmZSwgMHhiMSwKKwkweDI2LCAweDNiLCAweDdiLCAweDYxLCAweDdmLCAweDA0LCAweGRiLCAweDgwLCAweDFhLCAweDViLCAweDgxLCAweGJhLAorCTB4NzYsIDB4OGEsIDB4NjUsIDB4MWIsIDB4ZTAsIDB4MzQsIDB4ZGIsIDB4YjAsIDB4NzUsIDB4NTgsIDB4MGIsIDB4ZWUsCisJMHhmYiwgMHhmOSwgMHgzZCwgMHhjOCwgMHgyMywgMHg3OSwgMHhkNCwgMHhjMywgMHg3MSwgMHgwNiwgMHg0YywgMHg4MCwKKwkweDQwLCAweGRlLCAweGYxLCAweDc3LCAweDc3LCAweGJmLCAweGRmLCAweGY3LCAweGY3LCAweDdkLCAweGJmLCAweDZlLAorCTB4MmUsIDB4MzMsIDB4MWUsIDB4ZjIsIDB4MzMsIDB4N2UsIDB4Y2YsIDB4MTUsIDB4NjEsIDB4NWYsIDB4MzcsIDB4ZDIsCisJMHhlMSwgMHgzNiwgMHg4MywgMHg2NywgMHhhNCwgMHgwZSwgMHg5ZSwgMHhkNSwgMHgzNCwgMHhjMSwgMHhmNiwgMHg3OCwKKwkweDk5LCAweDc3LCAweDRiLCAweGQ4LCAweGM5LCAweGYzLCAweGM4LCAweDYzLCAweGQ3LCAweDM5LCAweDBlLCAweDEyLAorCTB4NzYsIDB4NjUsIDB4MWEsIDB4NWEsIDB4NzIsIDB4ZTcsIDB4MzcsIDB4NTQsIDB4NjAsIDB4NzcsIDB4YjIsIDB4MGMsCisJMHhiYiwgMHgzZCwgMHhmZiwgMHg4ZiwgMHg2MCwgMHg3NywgMHg0ZCwgMHhlOCwgMHhiZiwgMHhkZiwgMHgyZSwgMHgyMiwKKwkweDZmLCAweDRkLCAweGViLCAweDAwLCAweGJhLCAweDZlLCAweDA5LCAweDcwLCAweDA0LCAweDNmLCAweGI1LCAweGYzLAorCTB4ZWIsIDB4MDQsIDB4OWUsIDB4OGEsIDB4YmMsIDB4ZTIsIDB4NTIsIDB4ZTksIDB4M2IsIDB4ZTEsIDB4YjIsIDB4OWYsCisJMHg5MiwgMHhlZCwgMHgxMiwgMHhkOCwgMHgyNywgMHhmMCwgMHhlNywgMHgzNSwgMHg5NiwgMHg5MSwgMHg0NywgMHg2ZiwKKwkweDRiLCAweDQ2LCAweDQyLCAweDU3LCAweGFhLCAweGI1LCAweDRmLCAweDdlLCAweGJiLCAweGNiLCAweDZkLCAweDlmLAorCTB4MWMsIDB4ZGQsIDB4YTEsIDB4N2QsIDB4NzIsIDB4NWEsIDB4ZGEsIDB4MjcsIDB4YTksIDB4ZWQsIDB4ZGIsIDB4MjcsCisJMHgwMywgMHg3NSwgMHg3OSwgMHg1ZCwgMHg5NSwgMHhmNSwgMHhlYywgMHhkYywgMHgzZSwgMHgzMSwgMHgzNiwgMHhiNSwKKwkweDRmLCAweDQ2LCAweDVkLCAweGJlLCAweDE4LCAweGNjLCAweGY3LCAweDU3LCAweDI5LCAweDc1LCAweDBjLCAweDNjLAorCTB4NGUsIDB4YzMsIDB4MTksIDB4MzAsIDB4M2UsIDB4NTYsIDB4ZTMsIDB4MTcsIDB4ZmUsIDB4MzgsIDB4NjEsIDB4ZmQsCisJMHhkNywgMHhmZiwgMHhjNywgMHhiMCwgMHgxZSwgMHhhYywgMHhmMywgMHg3OSwgMHg1NywgMHhkNiwgMHgwMywgMHgyMSwKKwkweGZlLCAweDUxLCAweDYwLCAweDNkLCAweGQ4LCAweGQwLCAweDc3LCAweGRhLCAweDM4LCAweDY3LCAweGIxLCAweGRhLAorCTB4NzcsIDB4M2EsIDB4NjIsIDB4MzQsIDB4ZTIsIDB4ZWQsIDB4N2YsIDB4ZTQsIDB4ZjIsIDB4YTksIDB4YmEsIDB4ZjksCisJMHgzYiwgMHg2OCwgMHg4YSwgMHg3YywgMHg0NywgMHhjNywgMHhmNSwgMHhiMywgMHg0MCwgMHg0YiwgMHg3NiwgMHgyYSwKKwkweDQ1LCAweGIwLCAweDk5LCAweGYwLCAweGJjLCAweDkwLCAweGEwLCAweGI1LCAweDFhLCAweDdkLCAweDhiLCAweDlmLAorCTB4YzcsIDB4ZWIsIDB4N2IsIDB4ZjUsIDB4MDksIDB4MjEsIDB4YTcsIDB4YTQsIDB4ZmYsIDB4MDEsIDB4ZTMsIDB4MjcsCisJMHg3YywgMHhmMywgMHg2MiwgMHhhYywgMHhjYywgMHg2ZiwgMHg1MiwgMHhmZSwgMHgwOCwgMHhhNSwgMHhmYiwgMHgzNywKKwkweGYyLCAweDQzLCAweGQ0LCAweGNiLCAweGJjLCAweDlkLCAweGQ5LCAweDBhLCAweDlhLCAweGM2LCAweGVmLCAweGU2LAorCTB4N2QsIDB4MDksIDB4NTUsIDB4ZDksIDB4NWEsIDB4ZTAsIDB4OWYsIDB4YTcsIDB4NTksIDB4MmYsIDB4MTgsIDB4MjksCisJMHhlYiwgMHgwNCwgMHhkNSwgMHg3YiwgMHg3MywgMHg0ZSwgMHhkOCwgMHg3NCwgMHg5YSwgMHg3NywgMHgyNiwgMHg2NCwKKwkweGVlLCAweGE5LCAweDM4LCAweDBmLCAweDNkLCAweDRkLCAweGYzLCAweGNlLCAweDVhLCAweDNkLCAweGY4LCAweDZlLAorCTB4MGYsIDB4YmMsIDB4ZjAsIDB4Y2EsIDB4NjksIDB4MmEsIDB4ZWYsIDB4OWQsIDB4ODUsIDB4OWMsIDB4ZjMsIDB4YjgsCisJMHhlNywgMHhkZSwgMHg5NSwgMHg2YiwgMHhjMiwgMHg1MiwgMHg5NSwgMHhiMSwgMHhmMiwgMHhmYSwgMHhiOCwgMHg1OCwKKwkweGQ3LCAweDBmLCAweDhlLCAweDQ0LCAweDUxLCAweGZiLCAweDU2LCAweGFlLCAweDE3LCAweGFiLCAweGFkLCAweDc3LAorCTB4ODIsIDB4MWMsIDB4ZDAsIDB4NzQsIDB4YTgsIDB4NmIsIDB4YTIsIDB4MDEsIDB4OGIsIDB4NjEsIDB4OGYsIDB4N2EsCisJMHgyNywgMHhiNywgMHgyYywgMHhjMSwgMHg3NSwgMHhiNSwgMHhiMCwgMHhhOCwgMHhjOCwgMHg5MSwgMHhmMywgMHg0YSwKKwkweDhlLCAweDE0LCAweDVjLCAweDdjLCAweGJjLCAweDVlLCAweDZmLCAweGVmLCAweGY1LCAweGQwLCAweGRiLCAweGJkLAorCTB4NmEsIDB4OWUsIDB4MzAsIDB4YTcsIDB4NjcsIDB4NTgsIDB4MGYsIDB4YjksIDB4MWYsIDB4N2EsIDB4ODgsIDB4ODksCisJMHhiYSwgMHgyNSwgMHhhOSwgMHg4YiwgMHhlMCwgMHg3NywgMHg5NiwgMHgzNSwgMHhhZiwgMHg4NiwgMHgxOCwgMHg1NywKKwkweDhlLCAweGQwLCAweDUzLCAweGFjLCAweDZiLCAweDVmLCAweGEyLCAweDdiLCAweDk0LCAweDdkLCAweDE2LCAweDcxLAorCTB4ZTUsIDB4OTksIDB4MjIsIDB4OGYsIDB4ZGYsIDB4NDcsIDB4YTksIDB4MjcsIDB4ZWMsIDB4ODksIDB4MDgsIDB4MWQsCisJMHhhMSwgMHg1MywgMHgyMiwgMHg2NywgMHgwNiwgMHhmMSwgMHgzZCwgMHhlNCwgMHgxYywgMHhkYywgMHgyYiwgMHg5ZSwKKwkweDJmLCAweDdkLCAweDE5LCAweDc3LCAweDIyLCAweGE3LCAweDZlLCAweGZiLCAweGY5LCAweGZiLCAweGJhLCAweDU2LAorCTB4MmYsIDB4MmEsIDB4OWUsIDB4YjksIDB4YWEsIDB4NjgsIDB4NGEsIDB4OWMsIDB4ZTMsIDB4ZWIsIDB4OWYsIDB4MzEsCisJMHhlYSwgMHhhZiwgMHg4ZiwgMHgxOCwgMHhmMSwgMHg2MiwgMHhkYywgMHg4OCwgMHhhZSwgMHg2MCwgMHhkYywgMHgzMywKKwkweDQ2LCAweGFjLCAweDA4LCAweDFiLCAweDUyLCAweGUzLCAweDg4LCAweDFkLCAweDA2LCAweGJkLCAweDZkLCAweGQwLAorCTB4ZDYsIDB4YjEsIDB4ODgsIDB4MDIsIDB4ZDUsIDB4ZDQsIDB4NDksIDB4NmMsIDB4NjMsIDB4ZGUsIDB4ODcsIDB4YWEsCisJMHhlNiwgMHhhZCwgMHhlMSwgMHg4YiwgMHhlZiwgMHhmMCwgMHhmNywgMHg0NCwgMHgxOCwgMHhhNiwgMHg1YSwgMHhhZiwKKwkweDZkLCAweDgzLCAweDdmLCAweDdkLCAweDIyLCAweDQ1LCAweDliLCAweGU5LCAweGI1LCAweDc2LCAweDlkLCAweDVlLAorCTB4NWIsIDB4ZDgsIDB4NzIsIDB4ZGUsIDB4MWYsIDB4OTUsIDB4YzYsIDB4NjUsIDB4M2QsIDB4YTIsIDB4ZGYsIDB4MTEsCisJMHhmYSwgMHgyYiwgMHhjZiwgMHhiYiwgMHg0YSwgMHhiNywgMHhhZCwgMHhjMSwgMHgyOSwgMHg4YywgMHhkMSwgMHg3ZSwKKwkweDcwLCAweGVkLCAweDA3LCAweGViLCAweDUyLCAweGY5LCAweGMwLCAweDNhLCAweDNmLCAweGExLCAweDBkLCAweGY1LAorCTB4NWUsIDB4YTYsIDB4Y2MsIDB4NmIsIDB4ODUsIDB4OGQsIDB4YjUsIDB4Y2UsIDB4ZjMsIDB4ODMsIDB4YmQsIDB4ZjUsCisJMHhhMCwgMHg5OCwgMHgyMywgMHhkYiwgMHg1YiwgMHg1NiwgMHg4YywgMHhhNCwgMHhhZiwgMHg3YiwgMHhiZSwgMHg1OCwKKwkweDU1LCAweGZmLCAweGU5LCAweDUxLCAweDA3LCAweDM5LCAweGUyLCAweDUxLCAweDA3LCAweGU5LCAweGE2LCAweGI1LAorCTB4ODAsIDB4OGIsIDB4ZDYsIDB4NDIsIDB4MmUsIDB4YmQsIDB4NmQsIDB4ODgsIDB4ZWQsIDB4OTYsIDB4MGUsIDB4ZTYsCisJMHgyMSwgMHhiMCwgMHg1YiwgMHhkYSwgMHhjOCwgMHhmZiwgMHhiMiwgMHhkYiwgMHg2ZSwgMHhhOSwgMHhhZCwgMHg0NSwKKwkweDA3LCAweGRkLCAweDQxLCAweDM3LCAweDkzLCAweDM2LCAweDRjLCAweDNjLCAweDU3LCAweGFlLCAweDYzLCAweGU3LAorCTB4NzUsIDB4NTcsIDB4NmEsIDB4MGUsIDB4NTcsIDB4ZWEsIDB4ZWEsIDB4MjMsIDB4YmQsIDB4ZTYsIDB4M2IsIDB4NWMsCisJMHgzNywgMHg1ZiwgMHhjOCwgMHhhZiwgMHg0OCwgMHg0MywgMHg5ZCwgMHhjZSwgMHhjYiwgMHhhZSwgMHhiYSwgMHg1MywKKwkweGYzLCAweGFiLCAweGU1LCAweDY3LCAweDc4LCAweGQ2LCAweDg4LCAweGYwLCAweDc5LCAweGE3LCAweGNhLCAweGJjLAorCTB4NmMsIDB4NWEsIDB4Y2UsIDB4MzcsIDB4NTMsIDB4NmQsIDB4NjcsIDB4ZjgsIDB4OTcsIDB4NDgsIDB4YzEsIDB4Y2UsCisJMHg5YiwgMHhiNywgMHhlZiwgMHhjYywgMHg3ZiwgMHhkNiwgMHg1ZSwgMHgyMywgMHg3NywgMHhkZiwgMHgzMywgMHhhNSwKKwkweDVmLCAweGFjLCAweDQ5LCAweGU1LCAweDYxLCAweGY3LCAweDI5LCAweDdiLCAweDZmLCAweDJiLCAweDdjLCAweGM3LAorCTB4YjksIDB4MjYsIDB4ZTUsIDB4NGIsIDB4YjQsIDB4YWQsIDB4M2MsIDB4MDEsIDB4Y2YsIDB4OGYsIDB4OWQsIDB4NjgsCisJMHg3MiwgMHg0YywgMHgxNSwgMHhjYiwgMHg0MiwgMHhiYywgMHgwYSwgMHg3OCwgMHhhZiwgMHhlZiwgMHgwZiwgMHg5ZSwKKwkweGJkLCAweDlkLCAweDNkLCAweGIzLCAweGVhLCAweGY2LCAweDRjLCAweGUyLCAweDE1LCAweDZjLCAweDJkLCAweGU0LAorCTB4MTcsIDB4NGYsIDB4ZDYsIDB4ZTQsIDB4NzgsIDB4N2YsIDB4MTQsIDB4NTgsIDB4NzQsIDB4NzksIDB4ZTQsIDB4M2QsCisJMHgyMywgMHg2ZiwgMHhiOSwgMHhkMSwgMHgzYywgMHhhZiwgMHhiYiwgMHhmNCwgMHg3MiwgMHhjYywgMHhiNywgMHg1NCwKKwkweDdhLCAweDIzLCAweDNjLCAweDIwLCAweDY1LCAweDcxLCAweGQxLCAweDViLCAweDQ3LCAweDMyLCAweGI3LCAweDNkLAorCTB4YmYsIDB4NWEsIDB4ZDksIDB4YmIsIDB4NzcsIDB4OWIsIDB4YjIsIDB4NTcsIDB4ZjQsIDB4ZjQsIDB4ZjAsIDB4MWQsCisJMHgxNCwgMHgzYywgMHhhMCwgMHg4MywgMHg1NiwgMHg3MiwgMHhjOCwgMHhiZiwgMHhmZSwgMHgwNSwgMHhkMCwgMHgzYywKKwkweGYzLCAweDU5LCAweDU3LCAweDRkLCAweDlhLCAweGY3LCAweDNlLCAweDk2LCAweDYzLCAweDJhLCAweDgxLCAweDE5LAorCTB4YzQsIDB4ZmUsIDB4OTAsIDB4NWIsIDB4ZDIsIDB4Y2IsIDB4YmMsIDB4MDcsIDB4ZTMsIDB4YzcsIDB4YWMsIDB4YWIsCisJMHhmMCwgMHhmNywgMHgyYSwgMHhmZiwgMHg1MywgMHg1YywgMHhjOSwgMHg5NywgMHg4MywgMHhkYiwgMHg4OCwgMHhhZCwKKwkweGVjLCAweDhjLCAweDRmLCAweGRiLCAweGQ2LCAweDNhLCAweDIxLCAweGVlLCAweDgzLCAweDdjLCAweGUxLCAweGZiLAorCTB4YmEsIDB4YTgsIDB4ZWIsIDB4MzMsIDB4MmQsIDB4MmQsIDB4Y2UsIDB4OTcsIDB4N2EsIDB4NjQsIDB4MmMsIDB4MGEsCisJMHhiZiwgMHg3NSwgMHhkMCwgMHgyYiwgMHgzOSwgMHhlNCwgMHg3MiwgMHhlMywgMHhiNywgMHhkZiwgMHhlMCwgMHhkZiwKKwkweGJjLCAweDc4LCAweDk0LCAweGNlLCAweDQ1LCAweDg3LCAweDJlLCAweDI3LCAweGY3LCAweDI3LCAweDRmLCAweGIwLAorCTB4OTUsIDB4NGEsIDB4ZjQsIDB4YjcsIDB4ZTEsIDB4NWYsIDB4OTQsIDB4ZjEsIDB4OGMsIDB4ZTIsIDB4OWQsIDB4OGUsCisJMHhkNSwgMHg3OCwgMHhmOSwgMHgwYiwgMHhkZiwgMHhlYywgMHhiOSwgMHhkZCwgMHhkYywgMHhjOCwgMHgyZiwgMHg2YywKKwkweGNiLCAweDVmLCAweDg4LCAweDM4LCAweGZmLCAweDc2LCAweDYyLCAweDI2LCAweDNhLCAweDM2LCAweDNjLCAweDI1LAorCTB4NmEsIDB4NGUsIDB4ZGQsIDB4NzgsIDB4NzAsIDB4NjcsIDB4ZTIsIDB4YzMsIDB4YzAsIDB4ODcsIDB4ZTEsIDB4M2EsCisJMHg1ZSwgMHhmNSwgMHhkMSwgMHhmZCwgMHhmZCwgMHhiNSwgMHg3MCwgMHg2ZCwgMHhmMywgMHhmNCwgMHg1NSwgMHg3OSwKKwkweGM3LCAweDgxLCAweDExLCAweGYzLCAweDg3LCAweDlmLCAweGZhLCAweDIxLCAweDlhLCAweGJmLCAweDA4LCAweDFjLAorCTB4MzYsIDB4MTgsIDB4ZGIsIDB4NDYsIDB4NjksIDB4MjEsIDB4ODgsIDB4YmEsIDB4MjIsIDB4NTEsIDB4OWIsIDB4YTMsCisJMHhlMiwgMHg4NiwgMHhiMiwgMHg1NiwgMHg2OCwgMHg1ZSwgMHhkNCwgMHg0MCwgMHg4ZSwgMHg4NSwgMHg2ZSwgMHhmMiwKKwkweGJjLCAweGU3LCAweDhiLCAweDI5LCAweDNhLCAweGM1LCAweDMyLCAweGY2LCAweGQ0LCAweDRhLCAweDQ1LCAweDc3LAorCTB4YWYsIDB4YWYsIDB4ODMsIDB4YWMsIDB4YzYsIDB4ZjEsIDB4OWIsIDB4MDIsIDB4YzcsIDB4ODcsIDB4MzYsIDB4YzUsCisJMHhmMSwgMHhjMywgMHg2NSwgMHgxYywgMHhmZiwgMHg0NCwgMHhhZiwgMHhjNCwgMHhlNywgMHg2NywgMHhmOSwgMHg1ZSwKKwkweDVkLCAweDc0LCAweDUwLCAweGRjLCAweDM3LCAweGM1LCAweGRmLCAweGRiLCAweGU5LCAweGEwLCAweGVjLCAweDYxLAorCTB4YzEsIDB4Y2YsIDB4NjYsIDB4MWUsIDB4OWYsIDB4NDksIDB4ZDEsIDB4NTMsIDB4MTcsIDB4NTMsIDB4YmUsIDB4YjgsCisJMHhhOCwgMHg1ZiwgMHg3MCwgMHhmNywgMHhlOCwgMHhkMCwgMHhkNywgMHg2MywgMHg1YywgMHgyMywgMHhmYywgMHhkNywKKwkweDdjLCAweDQ5LCAweGQ2LCAweDVjLCAweGU1LCAweDI1LCAweDdmLCAweGEyLCAweDc3LCAweGMzLCAweDgzLCAweDM1LAorCTB4ZjgsIDB4NWYsIDB4NmQsIDB4M2IsIDB4OWUsIDB4NTYsIDB4MzIsIDB4ZjAsIDB4ZDgsIDB4MjYsIDB4N2UsIDB4OGQsCisJMHg3YSwgMHhiYywgMHhlYywgMHhmMSwgMHhkMCwgMHg4NywgMHg3ZiwgMHhiZCwgMHg1NywgMHhjNiwgMHhhOSwgMHgzNiwKKwkweGYzLCAweDZiLCAweGI4LCAweDcxLCAweGI0LCAweDJhLCAweDZlLCAweGNmLCAweDdjLCAweGZmLCAweGJmLCAweDU1LAorCTB4MWMsIDB4ZmQsIDB4YTUsIDB4NWUsIDB4MjksIDB4MmYsIDB4NTAsIDB4MWYsIDB4OTgsIDB4NjAsIDB4MzgsIDB4OWMsCisJMHg2NCwgMHg1ZCwgMHg2NSwgMHg5MCwgMHg5YSwgMHg1ZiwgMHhkNiwgMHg2YiwgMHgxZCwgMHgxNCwgMHhmYywgMHhkNiwKKwkweGVkLCAweGE3LCAweDM5LCAweGE3LCAweDZhLCAweGJiLCAweGQzLCAweGFlLCAweDM1LCAweDlkLCAweDEzLCAweDM2LAorCTB4NGUsIDB4NjMsIDB4N2EsIDB4NmIsIDB4OWMsIDB4NzMsIDB4MzUsIDB4NTQsIDB4MjMsIDB4MTMsIDB4NmEsIDB4ZjEsCisJMHgwZCwgMHhiZCwgMHg0ZiwgMHhiMCwgMHhiZiwgMHg2NCwgMHg0OCwgMHgzZCwgMHg3OCwgMHg5YSwgMHhmNSwgMHhkYiwKKwkweDlkLCAweGM2LCAweDhiLCAweDNlLCAweGFhLCAweDhlLCAweDU4LCAweGRiLCAweDUzLCAweGEzLCAweGY2LCAweDNiLAorCTB4ZjYsIDB4NDEsIDB4ZGEsIDB4MWMsIDB4YzksIDB4NTcsIDB4MWYsIDB4MTIsIDB4YmMsIDB4ZTAsIDB4ZGMsIDB4NjQsCisJMHg4OSwgMHg2MiwgMHhlMSwgMHg0ZSwgMHg0YSwgMHg0ZSwgMHhmMiwgMHhiMywgMHhhNywgMHgxZCwgMHhiNiwgMHhiZCwKKwkweGZjLCAweDk0LCAweDYyLCAweGZhLCAweDRkLCAweDRlLCAweGVlLCAweDUyLCAweGZhLCAweGEyLCAweGY2LCAweGE3LAorCTB4YjcsIDB4YTgsIDB4M2MsIDB4ODcsIDB4NjcsIDB4NDUsIDB4NWMsIDB4NTIsIDB4ZjYsIDB4YzYsIDB4ZTAsIDB4ZWYsCisJMHgyYiwgMHhmYSwgMHhkZSwgMHhjZiwgMHg4YSwgMHhmOCwgMHg2OCwgMHhmMiwgMHg2MiwgMHhiMywgMHgxYSwgMHhkNywKKwkweGVlLCAweDFhLCAweDg3LCAweDMxLCAweGVkLCAweDZhLCAweDJjLCAweGVlLCAweGE5LCAweDc1LCAweDhhLCAweDU2LAorCTB4YzUsIDB4NmYsIDB4MWYsIDB4MTEsIDB4NzUsIDB4NjAsIDB4YjIsIDB4NTYsIDB4MGYsIDB4YmYsIDB4OWYsIDB4YTYsCisJMHhiOSwgMHhmMiwgMHg1YSwgMHhkYSwgMHg3OSwgMHhlYywgMHhjZiwgMHg0YSwgMHgxMSwgMHg2MSwgMHhjYiwgMHhiNSwKKwkweGIzLCAweGNlLCAweDhiLCAweDc5LCAweGQ3LCAweGNmLCAweDA5LCAweDZiLCAweGYxLCAweDhiLCAweGY4LCAweDEwLAorCTB4N2YsIDB4NTcsIDB4Y2YsIDB4MzksIDB4NTksIDB4OWUsIDB4MTMsIDB4NzIsIDB4MzQsIDB4ZWMsIDB4OTAsIDB4YmMsCisJMHg5NywgMHgxZSwgMHhkNywgMHhlZSwgMHgxYSwgMHhhNywgMHg3OSwgMHg4NSwgMHg4ZSwgMHgzZiwgMHhmYywgMHg4MCwKKwkweGU3LCAweGYxLCAweDM3LCAweDJhLCAweDg3LCAweGQ3LCAweDE0LCAweGYxLCAweDUzLCAweDk5LCAweGEzLCAweGExLAorCTB4YmYsIDB4YzMsIDB4YmYsIDB4OGMsIDB4OWMsIDB4MGEsIDB4ZTQsIDB4NDksIDB4YjgsIDB4ZjksIDB4OGQsIDB4NWMsCisJMHg2ZiwgMHgwMCwgMHhiMiwgMHhhOCwgMHg4OCwgMHhiOCwgMHgyOSwgMHhlMiwgMHgxNSwgMHg4ZCwgMHg3NCwgMHhlNywKKwkweGJkLCAweGM4LCAweGNkLCAweGRmLCAweDgxLCAweDBlLCAweGJhLCAweDFkLCAweGZhLCAweGIzLCAweDNjLCAweGU4LAorCTB4Y2YsIDB4ZmQsIDB4N2MsIDB4ZDQsIDB4YzEsIDB4YTEsIDB4MWUsIDB4MmUsIDB4MzUsIDB4NjEsIDB4NTAsIDB4ODksCisJMHg2ZCwgMHgwNSwgMHg4MywgMHhmMiwgMHhhNiwgMHg4ZiwgMHg5ZSwgMHg3MiwgMHhlYywgMHhmMCwgMHgwYSwgMHhjOSwKKwkweDlhLCAweGM5LCAweGQ4LCAweGEyLCAweDNkLCAweGIxLCAweDRlLCAweGZiLCAweDQ1LCAweGNkLCAweDM4LCAweDdhLAorCTB4MWYsIDB4ZTQsIDB4NTksIDB4MDYsIDB4OWYsIDB4YTQsIDB4MDksIDB4YjYsIDB4OGYsIDB4ZDgsIDB4ZmUsIDB4OWMsCisJMHg0NSwgMHhiYywgMHg0NSwgMHhlZiwgMHgwYiwgMHg2YSwgMHhlMCwgMHhmMSwgMHgzOSwgMHhjMSwgMHg3MCwgMHg3YSwKKwkweDZjLCAweDM3LCAweGI1LCAweDQ1LCAweGY4LCAweDllLCAweDEzLCAweGUwLCAweDRmLCAweGU4LCAweGU3LCAweDQ1LAorCTB4NTEsIDB4YjYsIDB4OTMsIDB4NjAsIDB4YjMsIDB4OWUsIDB4OWMsIDB4YjUsIDB4Y2QsIDB4M2MsIDB4MTksIDB4M2MsCisJMHgxNiwgMHhiNiwgMHgyYiwgMHhlZSwgMHg4MywgMHhlYiwgMHgyMywgMHg2NiwgMHgxMywgMHhkNSwgMHhkNiwgMHhlNCwKKwkweDNlLCAweDJiLCAweGVhLCAweDE0LCAweGRmLCAweDBkLCAweGRmLCAweDQ3LCAweDQ2LCAweDNmLCAweGY4LCAweDE1LAorCTB4ZjYsIDB4ZWQsIDB4NWUsIDB4MTUsIDB4MjcsIDB4M2EsIDB4Y2IsIDB4ZGYsIDB4YzcsIDB4ZDUsIDB4ZjcsIDB4YWYsCisJMHg4OCwgMHhmZCwgMHg5NCwgMHhkZiwgMHgzNSwgMHg3ZSwgMHhlMywgMHhlZiwgMHg1ZiwgMHg1YSwgMHhjOCwgMHhmOSwKKwkweGExLCAweGNhLCAweDU5LCAweGE5LCAweGNhLCAweDA1LCAweDA5LCAweDhkLCAweDFhLCAweDVmLCAweGExLCAweGQzLAorCTB4MmIsIDB4OWIsIDB4ZjksIDB4NWYsIDB4YmMsIDB4NmEsIDB4NWQsIDB4YmIsIDB4YjcsIDB4NTksIDB4ZWIsIDB4ZmEsCisJMHgwNywgMHhiYiwgMHg2NSwgMHg2ZCwgMHg5OSwgMHg3YiwgMHgyZSwgMHhmZiwgMHhjOSwgMHg3MywgMHhmMSwgMHhkMiwKKwkweGM5LCAweGVhLCAweGY0LCAweDQ0LCAweDVlLCAweDZmLCAweDg5LCAweGZlLCAweDI5LCAweGZjLCAweDQ5LCAweGJhLAorCTB4MWUsIDB4MGMsIDB4YTksIDB4OWMsIDB4MjUsIDB4ZTQsIDB4MjgsIDB4ZGQsIDB4YTcsIDB4ZjAsIDB4NWEsIDB4ZjMsCisJMHg3ZSwgMHhmMiwgMHhlMCwgMHhmZCwgMHg4ZiwgMHg4OSwgMHg1YywgMHg0ZCwgMHgyOSwgMHgzYiwgMHgwNiwgMHgxNSwKKwkweDNjLCAweDAwLCAweGIzLCAweDkwLCAweDBiLCAweDY2LCAweDdkLCAweDJlLCAweDk4LCAweDE5LCAweGVhLCAweDdiLAorCTB4YTcsIDB4MzgsIDB4M2UsIDB4YmQsIDB4ZjIsIDB4OTksIDB4NmUsIDB4NTksIDB4MmYsIDB4OGUsIDB4NTgsIDB4ZTIsCisJMHhiYywgMHhmYSwgMHhiZSwgMHhkNSwgMHg3YSwgMHg3ZiwgMHhjZSwgMHg2YiwgMHgxNSwgMHhmZSwgMHgyNiwgMHhkNywKKwkweDVhLCAweDVmLCAweDI3LCAweDcyLCAweDVhLCAweDgyLCAweGY1LCAweDMwLCAweGY4LCAweDhlLCAweGViLCAweDNjLAorCTB4ZTYsIDB4MzgsIDB4ZTYsIDB4OWEsIDB4ZTMsIDB4ODgsIDB4NmIsIDB4OGUsIDB4NzcsIDB4MzcsIDB4OTgsIDB4MjMsCisJMHhmMywgMHhmOCwgMHhlMiwgMHg2OSwgMHhmZSwgMHhiZiwgMHhkZCwgMHhiOSwgMHhjYSwgMHg3OSwgMHhjZSwgMHgwYiwKKwkweDc4LCAweGI2LCAweDUzLCAweDNhLCAweDE4LCAweDUyLCAweGIyLCAweGUzLCAweGZiLCAweGFhLCAweDE2LCAweGRkLAorCTB4NmIsIDB4Y2UsIDB4ZmYsIDB4NDAsIDB4OGQsIDB4ZjcsIDB4Y2QsIDB4OGQsIDB4YWIsIDB4ZWUsIDB4ZmEsIDB4ZTMsCisJMHg5NywgMHgyOCwgMHgyNiwgMHhlYiwgMHhjOCwgMHgxNSwgMHg2ZCwgMHg3ZiwgMHhiNSwgMHg4MSwgMHgxZiwgMHhmYSwKKwkweDQxLCAweGExLCAweGZmLCAweGNjLCAweGNiLCAweDc4LCAweGQwLCAweDgwLCAweGVjLCAweGJmLCAweDE2LCAweGEwLAorCTB4ZDUsIDB4NzIsIDB4MmQsIDB4YWYsIDB4NWYsIDB4ZDUsIDB4ZWUsIDB4ZGMsIDB4MWYsIDB4YmMsIDB4YjMsIDB4NzUsCisJMHhiYywgMHgzOCwgMHhmZiwgMHg4OCwgMHhmMCwgMHhlNSwgMHhjOSwgMHhmOCwgMHg1MSwgMHg0MiwgMHhkNSwgMHgyMywKKwkweGRiLCAweDE2LCAweDcyLCAweDAzLCAweDBhLCAweDZiLCAweGYwLCAweGJmLCAweDM2LCAweGFhLCAweGRkLCAweGM1LAorCTB4YjUsIDB4ZjAsIDB4MDMsIDB4NmEsIDB4M2IsIDB4ZmUsIDB4ODQsIDB4ZTAsIDB4ODksIDB4ZDIsIDB4M2YsIDB4MjYsCisJMHhlYiwgMHg2ZiwgMHgwYiwgMHg2YiwgMHgyNywgMHg0NSwgMHhjZCwgMHg2YiwgMHg1NCwgMHhkNSwgMHhmMSwgMHgyNiwKKwkweGE5LCAweDQzLCAweGU4LCAweGI5LCAweGI3LCAweDVmLCAweDdmLCAweGZiLCAweDVjLCAweDcwLCAweGU3LCAweGY1LAorCTB4YjcsIDB4ZWUsIDB4NmIsIDB4NzYsIDB4NTYsIDB4N2YsIDB4NmIsIDB4ZjIsIDB4ZGEsIDB4OGQsIDB4NjUsIDB4NTksCisJMHg3ZiwgMHg1YiwgMHgxZCwgMHg5MywgMHg5MSwgMHhmZSwgMHhjMCwgMHhhNCwgMHg0YiwgMHg3ZiwgMHg5MCwgMHhmYSwKKwkweGZhLCAweDZmLCAweGI5LCAweGYyLCAweGI3LCAweDY1LCAweDZkLCAweDZkLCAweGExLCAweGFjLCAweGIzLCAweGNhLAorCTB4ZGEsIDB4NWEsIDB4OTksIDB4ZWYsIDB4ZWQsIDB4ZWUsIDB4MDMsIDB4MjMsIDB4NjMsIDB4M2YsIDB4ZjIsIDB4MzksCisJMHg5ZCwgMHgzNSwgMHhiMSwgMHgxZiwgMHg1OSwgMHg1MywgMHg2YiwgMHgxOSwgMHg4ZCwgMHg2YywgMHgzOCwgMHhkMSwKKwkweGU3LCAweGEyLCAweDhmLCAweGJhLCAweDIyLCAweDhjLCAweGJiLCAweGVkLCAweDBkLCAweGZhLCAweDIxLCAweDQ0LAorCTB4MWEsIDB4ZjQsIDB4NDMsIDB4NzAsIDB4ZjMsIDB4N2UsIDB4YjcsIDB4OGUsIDB4MDUsIDB4OWQsIDB4MTgsIDB4YjIsCisJMHgxMSwgMHhiYSwgMHgzMCwgMHhmYSwgMHgxOSwgMHg4NCwgMHhlOSwgMHg3NCwgMHg1OSwgMHhmNywgMHhiYywgMHg4ZiwKKwkweDEyLCAweDRhLCAweGY3LCAweDNjLCAweGJkLCAweGEyLCAweGY5LCAweGQxLCAweDQ4LCAweDBkLCAweDNmLCAweGYyLAorCTB4ZDIsIDB4NDUsIDB4NmQsIDB4OTUsIDB4ZTcsIDB4YTMsIDB4ZTksIDB4MzUsIDB4ZTUsIDB4YTIsIDB4ZDcsIDB4OTQsCisJMHgwNywgMHhiZCwgMHg4YSwgMHg2NywgMHgzNCwgMHg5OCwgMHhmNywgMHhmNywgMHhkNSwgMHgzNSwgMHhmOCwgMHg0ZiwKKwkweDg0LCAweGQwLCAweGIzLCAweDg1LCAweDc5LCAweDZhLCAweDUwLCAweGU5LCAweDdmLCAweDJlLCAweDdhLCAweDNkLAorCTB4YzUsIDB4ZjQsIDB4YWEsIDB4Y2YsIDB4NjMsIDB4YmUsIDB4MGQsIDB4NzMsIDB4NDEsIDB4OTUsIDB4Y2UsIDB4MzgsCisJMHhlOCwgMHgzYiwgMHg3NCwgMHhmMSwgMHgxYiwgMHgyMiwgMHg0ZiwgMHhhYSwgMHhkYSwgMHg1ZSwgMHhkNCwgMHhmYSwKKwkweGM0LCAweDNlLCAweDQxLCAweDRiLCAweGQ3LCAweGZkLCAweGM4LCAweDViLCAweGQxLCAweGU3LCAweDRjLCAweGU1LAorCTB4MjcsIDB4ZDMsIDB4YjAsIDB4NjgsIDB4YWUsIDB4ZDIsIDB4MzksIDB4MmEsIDB4ZmEsIDB4ODYsIDB4YzgsIDB4ZjEsCisJMHg3NSwgMHhjZCwgMHhlZCwgMHg0MywgMHg5ZSwgMHg5YiwgMHgzZSwgMHhhZiwgMHg2NSwgMHhlNiwgMHhiNSwgMHgyYSwKKwkweDdmLCAweGM2LCAweGU1LCAweGFhLCAweDllLCAweDgzLCAweGYwLCAweDFkLCAweDc1LCAweDI2LCAweDBjLCAweDI3LAorCTB4MmUsIDB4NzIsIDB4NGMsIDB4N2IsIDB4MWMsIDB4ZjgsIDB4YzksIDB4YTIsIDB4NGMsIDB4ZmIsIDB4M2QsIDB4MDksCisJMHhlNCwgMHgzMywgMHhmNywgMHgyYywgMHg1OSwgMHg3NCwgMHgzYywgMHg3MywgMHhmZiwgMHg1ZCwgMHgxMiwgMHg1NywKKwkweGNlLCAweDhhLCAweDNlLCAweDkyLCAweGU4LCAweDY3LCAweDE2LCAweDYzLCAweGY5LCAweDFjLCAweGY1LCAweDRmLAorCTB4ZDMsIDB4ZjksIDB4NjIsIDB4MGIsIDB4MTUsIDB4NTgsIDB4YmIsIDB4ZjcsIDB4M2IsIDB4NzksIDB4ZTEsIDB4ZWIsCisJMHg2MywgMHg5ZSwgMHg5NCwgMHg0NSwgMHgyZiwgMHg1MSwgMHg2MywgMHhiOSwgMHg5OSwgMHhlZiwgMHhkYiwgMHg0ZiwKKwkweGFiLCAweGI5LCAweDMxLCAweGQxLCAweDEzLCAweDRhLCAweGY2LCAweDE3LCAweGMxLCAweDU4LCAweDFmLCAweGY1LAorCTB4M2EsIDB4MDcsIDB4ZmIsIDB4YTgsIDB4ZWQsIDB4YjMsIDB4MjIsIDB4YzcsIDB4YjIsIDB4OTAsIDB4M2QsIDB4MmIsCisJMHgzZiwgMHhmMywgMHgwZiwgMHhhOCwgMHg2NywgMHhmMCwgMHhmMywgMHg4YSwgMHg3ZiwgMHg0YSwgMHg5MSwgMHg1ZSwKKwkweGNiLCAweDY1LCAweGNiLCAweGI5LCAweGZmLCAweGJjLCAweGY1LCAweDk1LCAweGEzLCAweDNiLCAweGQyLCAweDU3LAorCTB4NTIsIDB4ODksIDB4OGEsIDB4YmUsIDB4ZTIsIDB4YmUsIDB4NzcsIDB4MzksIDB4MDcsIDB4YTYsIDB4NWYsIDB4ZjYsCisJMHg3YiwgMHgwMCwgMHgwYywgMHhkYSwgMHhhMSwgMHg4YiwgMHgyNSwgMHgwMCwgMHg0YiwgMHg2MywgMHhjNiwgMHgwZSwKKwkweDQ1LCAweGZkLCAweDUzLCAweGI0LCAweDUwLCAweDFjLCAweDMyLCAweDkyLCAweDU5LCAweGU4LCAweGNjLCAweGZjLAorCTB4OTksIDB4OGYsIDB4ZWUsIDB4OTEsIDB4M2UsIDB4MWEsIDB4N2QsIDB4MGQsIDB4ZjgsIDB4Y2EsIDB4NmUsIDB4MWUsCisJMHhmZiwgMHg3YSwgMHhiZiwgMHhjYywgMHhjYiwgMHg3NiwgMHg5ZiwgMHhlZiwgMHhlMiwgMHhmMywgMHg3YiwgMHg0MiwKKwkweGQ1LCAweGU3LCAweDc3LCAweGYxLCAweGY5LCAweGRlLCAweDA0LCAweGY2LCAweGQwLCAweDU4LCAweDgyLCAweDVmLAorCTB4ZDIsIDB4YTEsIDB4MzQsIDB4ZWYsIDB4Y2QsIDB4NDIsIDB4OTEsIDB4NjUsIDB4ZWIsIDB4Y2IsIDB4Y2MsIDB4NDcsCisJMHg1NywgMHhmNCwgMHhiOCwgMHgzZSwgMHhkNCwgMHhlYywgMHg4OCwgMHgzZCwgMHgzMSwgMHg3OCwgMHhjYywgMHhiOSwKKwkweGNjLCAweDA0LCAweDhmLCAweDFiLCAweDI0LCAweGZmLCAweGNiLCAweDZjLCAweDhiLCAweGFlLCAweDY4LCAweDVjLAorCTB4ZDUsIDB4ZjksIDB4ZjYsIDB4ZGYsIDB4ZTgsIDB4OTMsIDB4MzksIDB4NTUsIDB4ZGYsIDB4ZGQsIDB4MjMsIDB4ZTEsCisJMHhlNywgMHgwOCwgMHg5ZSwgMHg3MiwgMHg5ZSwgMHhlMSwgMHhmMiwgMHhiYywgMHhjMCwgMHg0MywgMHg3YiwgMHhkYSwKKwkweDJhLCAweDNmLCAweGJmLCAweDEzLCAweDc4LCAweGQ1LCAweDhhLCAweGJjLCAweGQ5LCAweGMwLCAweDEyLCAweGYzLAorCTB4YzUsIDB4MTksIDB4YzcsIDB4NGMsIDB4OTcsIDB4NzMsIDB4ZDUsIDB4MWUsIDB4MWYsIDB4OTAsIDB4ZDcsIDB4YmYsCisJMHhkOSwgMHgyNywgMHhmYiwgMHg4MywgMHg3ZSwgMHg2YiwgMHg0MCwgMHhmNywgMHg0OCwgMHg5NCwgMHgzMiwgMHgwNywKKwkweGY5LCAweGNiLCAweDNlLCAweDAxLCAweDFiLCAweGZmLCAweDMyLCAweGY4LCAweGE1LCAweGMxLCAweGRmLCAweDc5LAorCTB4M2QsIDB4MDksIDB4Y2MsIDB4ZjEsIDB4NGEsIDB4OWYsIDB4ZWUsIDB4MTcsIDB4MjMsIDB4ZDcsIDB4MTUsIDB4ZTcsCisJMHhmOSwgMHg0NiwgMHg3OCwgMHg1ZCwgMHhmYSwgMHhmYywgMHgwYywgMHgxZiwgMHg3YiwgMHhlZCwgMHgyZiwgMHhlZSwKKwkweGQ1LCAweDk2LCAweDkwLCAweGZkLCAweGM1LCAweGRhLCAweDEyLCAweGM5LCAweDA5LCAweGI5LCAweGNmLCAweDE1LAorCTB4OWYsIDB4NmUsIDB4YTgsIDB4ZWMsIDB4ZDMsIDB4M2QsIDB4OWYsIDB4YjksIDB4ZDUsIDB4MDcsIDB4ZmYsIDB4ODYsCisJMHhiMSwgMHhjNCwgMHhmYiwgMHgxZCwgMHg3YywgMHg5ZSwgMHhjNywgMHhhMiwgMHg1NiwgMHgyMSwgMHhjZCwgMHg5ZiwKKwkweDFkLCAweDJhLCAweGFmLCAweGE3LCAweDFlLCAweDU3LCAweDY0LCAweDllLCAweDg0LCAweDk2LCAweDViLCAweGI4LAorCTB4ZjYsIDB4NDMsIDB4YmUsIDB4ODcsIDB4OTQsIDB4NWQsIDB4OGQsIDB4OWYsIDB4NDMsIDB4NzUsIDB4NzksIDB4MzAsCisJMHhmNSwgMHgzOCwgMHhiNiwgMHg5OSwgMHgxZiwgMHg1NiwgMHhjNCwgMHgxMywgMHgzZCwgMHhmMCwgMHg2YywgMHhiMywKKwkweDdlLCAweDA2LCAweGQ3LCAweDg0LCAweDFmLCAweDJkLCAweDU2LCAweDQ3LCAweGFmLCAweGEwLCAweGUzLCAweDAwLAorCTB4ZmQsIDB4Y2UsIDB4NjIsIDB4OGEsIDB4NzYsIDB4ZjEsIDB4NWUsIDB4ZmQsIDB4YTYsIDB4ZjEsIDB4MDAsIDB4ZTIsCisJMHhlZCwgMHgyNCwgMHg3MywgMHg5ZSwgMHgxOCwgMHhjNiwgMHgxOSwgMHg2NywgMHhlMiwgMHg5NCwgMHgxMSwgMHgwMSwKKwkweGJmLCAweDJjLCAweDA1LCAweDljLCAweDBlLCAweDZhLCAweDY2LCAweDVhLCAweGZkLCAweDY1LCAweDFhLCAweDY1LAorCTB4ZmIsIDB4MGYsIDB4MzQsIDB4ZWIsIDB4ODQsIDB4ZTIsIDB4MDQsIDB4N2EsIDB4YjMsIDB4Y2QsIDB4NDMsIDB4YWMsCisJMHgxMywgMHhjNywgMHg4YSwgMHhjMCwgMHg2NywgMHg4MywgMHgzZSwgMHg5ZiwgMHgyMywgMHhmYSwgMHg1YywgMHg2ZSwKKwkweGQ0LCAweGZjLCAweDI2LCAweDM5LCAweDU2LCAweGU1LCAweDc3LCAweGRiLCAweDhjLCAweGYyLCAweDNjLCAweGUyLAorCTB4YzUsIDB4MmYsIDB4ZDMsIDB4ZmIsIDB4YTIsIDB4Y2YsIDB4MDksIDB4ZTAsIDB4YTgsIDB4ZjcsIDB4ZmQsIDB4NGIsCisJMHg3NCwgMHgzMiwgMHg4MSwgMHg3OSwgMHg2ZiwgMHg5ZiwgMHgzZSwgMHg4ZiwgMHhlZiwgMHg4OCwgMHgzZSwgMHhkYiwKKwkweDNjLCAweGU4LCAweGYzLCAweGM1LCAweDdlLCAweDg5LCAweDM3LCAweDI1LCAweGM2LCAweGQxLCAweDM2LCAweDlhLAorCTB4Y2IsIDB4MjIsIDB4MDcsIDB4ZWMsIDB4ZDMsIDB4ZTgsIDB4M2IsIDB4OTUsIDB4NGQsIDB4MzIsIDB4NWYsIDB4NGEsCisJMHg1NiwgMHhmOCwgMHhkMiwgMHg4NSwgMHgyOCwgMHgxYiwgMHhjMywgMHg0YywgMHhlMywgMHhlOCwgMHhjYiwgMHhhNiwKKwkweGYyLCAweDdlLCAweGIwLCAweDhlLCAweDAxLCAweDFhLCAweDVkLCAweDZlLCAweGU3LCAweDZiLCAweDY5LCAweDNkLAorCTB4M2EsIDB4MTUsIDB4NTEsIDB4YjUsIDB4ZmUsIDB4YjYsIDB4MTUsIDB4NjMsIDB4ZmUsIDB4NzgsIDB4OWUsIDB4NjksCisJMHgzOSwgMHg5ZCwgMHhiZCwgMHg5NywgMHgwYSwgMHhjMSwgMHgyMSwgMHgxYSwgMHg1OSwgMHhkNiwgMHhmZCwgMHg0ZCwKKwkweDQ0LCAweGNlLCAweGM2LCAweGEwLCAweGU0LCAweDQ5LCAweDdhLCAweGRkLCAweDlmLCAweDEwLCAweGJlLCAweDBiLAorCTB4ZWIsIDB4ZDIsIDB4YzcsIDB4YjUsIDB4ZWUsIDB4ZjYsIDB4MmQsIDB4ZjgsIDB4ZDIsIDB4MjUsIDB4NDUsIDB4YjMsCisJMHhhNSwgMHhjYiwgMHhkMSwgMHgzMCwgMHhhNSwgMHhhMiwgMHg1MywgMHhhZiwgMHhmNCwgMHgwMywgMHhmZiwgMHg0NywKKwkweDJlLCAweGMxLCAweDBmLCAweDA3LCAweDFlLCAweDZkLCAweDUxLCAweDIyLCAweDUzLCAweDBiLCAweDhiLCAweDIxLAorCTB4NWUsIDB4MzcsIDB4N2UsIDB4MmYsIDB4N2QsIDB4MzAsIDB4MTcsIDB4N2UsIDB4NDAsIDB4YzgsIDB4ZmUsIDB4ZDEsCisJMHg0YiwgMHgzYywgMHg0ZSwgMHhjYSwgMHgyNiwgMHhjNSwgMHgzNywgMHhiYywgMHhmMCwgMHg1MCwgMHhmNywgMHhjNSwKKwkweGQ0LCAweGI4LCAweDI4LCAweDczLCAweDNkLCAweDU5LCAweDdmLCAweDMzLCAweDEzLCAweGZlLCAweDVhLCAweDljLAorCTB4YmMsIDB4ZTYsIDB4M2IsIDB4YmEsIDB4NjgsIDB4ZDEsIDB4YjEsIDB4OGMsIDB4ZmQsIDB4ZjUsIDB4MTQsIDB4NGQsCisJMHgzMSwgMHg1ZCwgMHhiYiwgMHhlNSwgMHgwNSwgMHg4ZiwgMHgyNywgMHhlMCwgMHhkOSwgMHgzNCwgMHhkMywgMHgzZSwKKwkweGRiLCAweGNkLCAweDU5LCAweDRiLCAweGU2LCAweGRkLCAweDg5LCAweGRlLCAweDczLCAweDM4LCAweDQ2LCAweGRkLAorCTB4ZjEsIDB4NWYsIDB4ZjUsIDB4NmIsIDB4NzksIDB4OTAsIDB4Y2MsIDB4YTIsIDB4OGUsIDB4OTAsIDB4M2YsIDB4ZjMsCisJMHgzYywgMHgxZSwgMHhiOSwgMHhmZiwgMHgzOSwgMHhkYywgMHgwNywgMHhmMiwgMHgwZSwgMHg3MywgMHhlNywgMHhlMywKKwkweDU1LCAweGI5LCAweGFmLCAweDIzLCAweDdjLCAweDZmLCAweGQ0LCAweGRkLCAweDFmLCAweDJiLCAweDRlLCAweGYyLAorCTB4ZmUsIDB4NzYsIDB4MDksIDB4ZGUsIDB4MmMsIDB4ZjcsIDB4NzMsIDB4OWEsIDB4Y2UsIDB4NzksIDB4ZjIsIDB4MTUsCisJMHhiOSwgMHgyZiwgMHg0OSwgMHgxNywgMHg3ZCwgMHgyNywgMHgwNSwgMHg3ZCwgMHg0ZiwgMHg4YiwgMHhmZCwgMHg0OCwKKwkweGU2LCAweDBjLCAweGQ2LCAweGQ3LCAweGI0LCAweGVmLCAweDgxLCAweGVkLCAweGVjLCAweDVjLCAweDQwLCAweGU3LAorCTB4MDYsIDB4ZjIsIDB4ZjcsIDB4MGYsIDB4ZmIsIDB4NDUsIDB4NWUsIDB4MjIsIDB4ZWMsIDB4ZWYsIDB4MWMsIDB4M2UsCisJMHhhNywgMHhlOSwgMHg3OSwgMHg5NiwgMHhlYiwgMHgyZiwgMHg2NCwgMHg1YSwgMHhlOCwgMHg2YSwgMHhiNiwgMHg4NSwKKwkweGRlLCAweGM5LCAweDBlLCAweGQxLCAweDk1LCAweGM1LCAweDZlLCAweDNhLCAweGM3LCAweDNhLCAweGYzLCAweDM5LAorCTB4MjcsIDB4NjAsIDB4YTUsIDB4YTksIDB4MWIsIDB4ZjEsIDB4NDUsIDB4ZTQsIDB4MGMsIDB4MzEsIDB4ZGQsIDB4NjEsCisJMHgzYywgMHhmNCwgMHhiZiwgMHhlOCwgMHg1ZSwgMHhjNiwgMHgzOSwgMHhkNiwgMHhiZCwgMHg1YiwgMHhlOSwgMHgzZCwKKwkweDdlLCAweDY2LCAweDNhLCAweGEzLCAweDczLCAweDFkLCAweGUwLCAweDkzLCAweDFmLCAweDJiLCAweGViLCAweGFmLAorCTB4NWIsIDB4ZTMsIDB4ODgsIDB4YjksIDB4MDUsIDB4OGUsIDB4NGMsIDB4OGIsIDB4ZjgsIDB4ZDYsIDB4YzIsIDB4MjIsCisJMHhmZiwgMHhiZSwgMHgwOCwgMHhmZiwgMHgzOSwgMHhjMywgMHg5YiwgMHhmOSwgMHhmMywgMHg5MywgMHgwMSwgMHg4YywKKwkweGM3LCAweDM5LCAweDQ3LCAweGU2LCAweDRhLCAweDhhLCAweGI1LCAweDg1LCAweGY4LCAweGQ4LCAweDI3LCAweDZhLAorCTB4YTQsIDB4MjUsIDB4MWMsIDB4NWEsIDB4NzksIDB4N2QsIDB4M2UsIDB4MzEsIDB4M2UsIDB4YjksIDB4ZGEsIDB4NGEsCisJMHhmMywgMHgzOSwgMHhkNiwgMHg0MSwgMHg3MiwgMHg3ZSwgMHhiNiwgMHg2MSwgMHgzMCwgMHhmNiwgMHhlZiwgMHg1NCwKKwkweDZmLCAweDYxLCAweGRjLCAweGJmLCAweDhiLCAweGQyLCAweDYyLCAweDFjLCAweDdmLCAweGFlLCAweDc2LCAweGQxLAorCTB4NDIsIDB4YWUsIDB4NDMsIDB4MWQsIDB4ZGYsIDB4MmIsIDB4NzIsIDB4ZGMsIDB4NjUsIDB4MWYsIDB4MjMsIDB4ZmMsCisJMHhiNiwgMHgxOSwgMHg3ZiwgMHg3YiwgMHg5NywgMHg3MSwgMHgwYSwgMHgzMiwgMHg1NSwgMHhkYSwgMHhhNSwgMHhlMCwKKwkweDM1LCAweDk3LCAweGViLCAweDdhLCAweDIyLCAweDAzLCAweGU3LCAweGE2LCAweGU4LCAweDI1LCAweDk2LCAweGI3LAorCTB4MjMsIDB4MmYsIDB4YzMsIDB4N2YsIDB4ZmMsIDB4MzgsIDB4ZjAsIDB4MjYsIDB4OWYsIDB4YTIsIDB4NDEsIDB4M2UsCisJMHg0NiwgMHg1ZiwgMHgyNCwgMHhiZiwgMHhhOCwgMHg3MywgMHg4YSwgMHgwNSwgMHgyNywgMHg0NCwgMHg2ZCwgMHg4OCwKKwkweGE0LCAweGQxLCAweDU5LCAweGQxLCAweDhiLCAweGVlLCAweDJkLCAweGMxLCAweDliLCAweGVjLCAweDk0LCAweDY1LAorCTB4NDAsIDB4MWYsIDB4ODEsIDB4MGYsIDB4NDYsIDB4ZTYsIDB4NjAsIDB4MWQsIDB4NzcsIDB4N2EsIDB4ZGUsIDB4ZWQsCisJMHg5YiwgMHgxOSwgMHhhNywgMHg0OCwgMHgzZiwgMHhmMCwgMHg1ZSwgMHhkMiwgMHhhYywgMHhlYSwgMHgyZiwgMHgyMCwKKwkweGY4LCAweGJkLCAweGI5LCAweDRmLCAweGQ3LCAweDRiLCAweGVhLCAweDYzLCAweDJkLCAweDJiLCAweGY0LCAweDcxLAorCTB4NDcsIDB4Y2QsIDB4ZWYsIDB4NjYsIDB4Y2QsIDB4ZWYsIDB4ZTUsIDB4N2MsIDB4MzksIDB4OTYsIDB4NzksIDB4MmMsCisJMHhlNywgMHg0OSwgMHhmNiwgMHgyOCwgMHg0YSwgMHgyZSwgMHg0YiwgMHhmYywgMHgzMywgMHhmNywgMHg4ZCwgMHg5OSwKKwkweDhmLCAweDJhLCAweDFkLCAweDNjLCAweGI5LCAweDM2LCAweDFhLCAweGVhLCAweDMxLCAweDI2LCAweDhjLCAweGU0LAorCTB4ZTQsIDB4M2YsIDB4OTYsIDB4MjIsIDB4MDksIDB4ZTgsIDB4NDUsIDB4NGYsIDB4ZWUsIDB4NTEsIDB4ZjksIDB4YTcsCisJMHgzYywgMHhhZiwgMHg1NCwgMHgxOCwgMHhhYSwgMHhkYiwgMHhlYywgMHg1YSwgMHgwNywgMHhhZCwgMHg4YiwgMHg5ZSwKKwkweDVjLCAweDQyLCAweGM3LCAweGUwLCAweGViLCAweDcxLCAweDlmLCAweDk0LCAweGQ5LCAweDQ0LCAweGU4LCAweDczLAorCTB4MGUsIDB4MWEsIDB4ZGYsIDB4MWYsIDB4YmEsIDB4YzQsIDB4ZmIsIDB4MTksIDB4NWYsIDB4ZmIsIDB4NjksIDB4ZTksCisJMHhhNCwgMHhlOCwgMHg3MSwgMHg4MywgMHhiMSwgMHg1ZCwgMHgzNCwgMHgyNywgMHg3NCwgMHg3ZSwgMHhkNiwgMHg1ZiwKKwkweGFhLCAweGVjLCAweGFhLCAweDI5LCAweGNjLCAweDMzLCAweDg1LCAweGQ4LCAweDhhLCAweGUxLCAweGZjLCAweGJlLAorCTB4MmYsIDB4OTksIDB4OTcsIDB4YjEsIDB4ZjIsIDB4NzgsIDB4NGQsIDB4YWMsIDB4N2MsIDB4NTYsIDB4YzQsIDB4Y2EsCisJMHgxMSwgMHgyNywgMHgwNywgMHg1YywgMHgwMSwgMHg0YiwgMHhhZiwgMHg5YywgMHgxNiwgMHhlYywgMHg2MywgMHg5OCwKKwkweDkwLCAweDFiLCAweDdlLCAweGVlLCAweGEyLCAweGUwLCAweDM3LCAweGUxLCAweDk4LCAweDVmLCAweGU2LCAweDU3LAorCTB4YzcsIDB4NzksIDB4YzYsIDB4MDYsIDB4NWQsIDB4NjAsIDB4N2MsIDB4YjAsIDB4MjcsIDB4MzYsIDB4NTgsIDB4OTcsCisJMHg1OCwgMHhjOSwgMHg3ZSwgMHg5OSwgMHhhZSwgMHhlNCwgMHg5YiwgMHg1OCwgMHhkNywgMHg1YiwgMHhhMCwgMHg4ZCwKKwkweDNjLCAweGIxLCAweDRlLCAweGQ4LCAweDRkLCAweDBiLCAweDYxLCAweGM2LCAweGIxLCAweDg5LCAweDM2LCAweGRlLAorCTB4NGYsIDB4ZDYsIDB4NmIsIDB4MjcsIDB4OTgsIDB4ZWUsIDB4NzgsIDB4ZWUsIDB4MmIsIDB4YjksIDB4ZDIsIDB4OGYsCisJMHhkMiwgMHhlMSwgMHg4OCwgMHgxNSwgMHg5ZCwgMHhlYSwgMHg2MCwgMHhiYiwgMHhjNSwgMHhlNCwgMHg3ZiwgMHg4NywKKwkweGZmLCAweDc3LCAweDg1LCAweDAwLCAweDkzLCAweGMyLCAweDJhLCAweDdlLCAweDY3LCAweDlkLCAweDI3LCAweDUzLAorCTB4ZmEsIDB4ZDEsIDB4MWMsIDB4OGYsIDB4OTksIDB4OWIsIDB4ODIsIDB4ZmQsIDB4MDMsIDB4M2IsIDB4Y2YsIDB4ZTEsCisJMHg3ZiwgMHgzOSwgMHg2NiwgMHg2NSwgMHg5NSwgMHhmMSwgMHhmYiwgMHg2MiwgMHgyYSwgMHg2NCwgMHgwOCwgMHhkZSwKKwkweGJlLCAweGNlLCAweDNjLCAweGZlLCAweDAyLCAweGNkLCAweGYxLCAweDFjLCAweGFlLCAweDEwLCAweGFlLCAweGI1LAorCTB4MjgsIDB4MTksIDB4ZGUsIDB4YzcsIDB4NzgsIDB4ZGYsIDB4Y2QsIDB4OWYsIDB4YTgsIDB4YmYsIDB4NmEsIDB4YTcsCisJMHg4NSwgMHhjOSwgMHgzMSwgMHg1NSwgMHg3ZiwgMHhmNSwgMHhiZCwgMHgwNiwgMHhmNSwgMHg1NywgMHhiOCwgMHg4ZSwKKwkweGU1LCAweGZlLCAweDYyLCAweGU5LCAweGU2LCAweDVjLCAweGQ4LCAweGZkLCAweDNjLCAweDMyLCAweDkyLCAweGUxLAorCTB4NGUsIDB4YTEsIDB4MjMsIDB4YWQsIDB4YWMsIDB4ZmEsIDB4ZjgsIDB4ZDksIDB4MTEsIDB4MmIsIDB4MzksIDB4YzUsCisJMHg3MywgMHhjYywgMHhiOSwgMHhlNywgMHg1ZCwgMHhiYSwgMHgxOSwgMHgwYiwgMHg2MywgMHg5YywgMHhiZiwgMHg2NiwKKwkweDFjLCAweGRiLCAweGNhLCAweDUzLCAweDcyLCAweDNkLCAweDg1LCAweDVjLCAweGU5LCAweGU3LCAweGQxLCAweGIwLAorCTB4NWUsIDB4OWYsIDB4ZmIsIDB4NWEsIDB4YWMsIDB4MDMsIDB4ZjQsIDB4YzQsIDB4OWYsIDB4MmIsIDB4NWQsIDB4YmUsCisJMHgyYiwgMHg1OSwgMHhkOCwgMHhkZiwgMHgwNiwgMHhlMywgMHgzOSwgMHg2NiwgMHgzNCwgMHg0NCwgMHhhOSwgMHgxNSwKKwkweGE2LCAweGVmLCAweDhiLCAweDFkLCAweGJlLCAweDhkLCAweGVjLCAweDk1LCAweDUyLCAweGIyLCAweDJhLCAweDk3LAorCTB4YTUsIDB4ZGEsIDB4ZWYsIDB4MmUsIDB4NmQsIDB4YWUsIDB4MjEsIDB4NzIsIDB4OTYsIDB4MjAsIDB4MzMsIDB4MjEsCisJMHgyZiwgMHg1MywgMHgyNSwgMHhiZiwgMHgwMywgMHhmZCwgMHgwZSwgMHhiNiwgMHhkMCwgMHg1OSwgMHhlNiwgMHg1NywKKwkweDMyLCAweDFmLCAweDg5LCAweDc5LCAweDI3LCAweGYzLCAweDJjLCAweDQ5LCAweDJmLCAweGYxLCAweGFhLCAweGQ3LAorCTB4MGQsIDB4NDgsIDB4OWMsIDB4MWQsIDB4YTksIDB4ZTQsIDB4NDEsIDB4YmEsIDB4ZTIsIDB4ZTksIDB4MDEsIDB4NTcsCisJMHgzYywgMHhkZCwgMHg3NCwgMHhlNSwgMHg0MSwgMHgwNiwgMHg4NSwgMHgzZSwgMHg1NiwgMHhkMSwgMHhhMSwgMHg4MiwKKwkweDRhLCAweDg3LCAweDgyLCAweGFlLCAweDI1LCAweDc5LCAweDU5LCAweGExLCAweGNjLCAweGNiLCAweDc2LCAweDZmLAorCTB4YzEsIDB4Y2IsIDB4YmMsIDB4NmMsIDB4ZDMsIDB4NzUsIDB4YzUsIDB4MzcsIDB4ZWMsIDB4MzAsIDB4ZTQsIDB4ZmMsCisJMHhlNSwgMHhlMiwgMHgzNCwgMHhiZCwgMHhjZCwgMHgzYywgMHhlMiwgMHhhZCwgMHg2MiwgMHg5OCwgMHhmOSwgMHhjNiwKKwkweDI0LCAweGYzLCAweDhkLCAweDA5LCAweGU2LCAweDFiLCAweDBlLCAweGMzLCAweGMwLCAweGUyLCAweGI1LCAweDVmLAorCTB4ZjMsIDB4NWQsIDB4NTksIDB4ODQsIDB4YmMsIDB4OTgsIDB4YTIsIDB4ZTcsIDB4OGIsIDB4ZTAsIDB4YzEsIDB4OTMsCisJMHhhYywgMHhmMywgMHg1YywgMHhmMywgMHg2ZCwgMHgyYywgMHg3NiwgMHgzMSwgMHhiZSwgMHg0YSwgMHgzZCwgMHhhNywKKwkweGRhLCAweDhlLCAweDQxLCAweGFmLCAweDE1LCAweGY4LCAweDg3LCAweGFmLCAweDgyLCAweGNmLCAweGJjLCAweDkxLAorCTB4YTIsIDB4NGUsIDB4ODYsIDB4M2QsIDB4ZTAsIDB4YmMsIDB4OGUsIDB4ZGUsIDB4MTQsIDB4YWYsIDB4ODEsIDB4OTYsCisJMHhkMSwgMHgxMywgMHhmOCwgMHhiYiwgMHhlMywgMHg1MywgMHgzYywgMHhmNywgMHg0ZSwgMHhkZiwgMHgwMiwgMHhlZiwKKwkweGNiLCAweGQzLCAweGUxLCAweDk0LCAweGQ5LCAweGNiLCAweDM4LCAweDdmLCAweGFjLCAweDgyLCAweGYzLCAweGE5LAorCTB4MzQsIDB4YWYsIDB4YTAsIDB4NjcsIDB4YjksIDB4OWIsIDB4YzYsIDB4MGUsIDB4NDQsIDB4ZjcsIDB4ZjYsIDB4MzAsCisJMHg5ZCwgMHgyMiwgMHgzNywgMHhhMiwgMHhkMiwgMHhhNywgMHhjNywgMHg0ZiwgMHgyNywgMHg4MywgMHg2ZCwgMHhhYSwKKwkweGJmLCAweDhmLCAweGM1LCAweGYyLCAweGYxLCAweDAzLCAweGJlLCAweGNmLCAweDJkLCAweDVmLCAweDNhLCAweGZiLAorCTB4MmEsIDB4M2YsIDB4MDMsIDB4YzcsIDB4NWYsIDB4ODUsIDB4ZmYsIDB4OTMsIDB4ZWQsIDB4ODMsIDB4NTYsIDB4ZTEsCisJMHgzZiwgMHgyYSwgMHg4OCwgMHhiMSwgMHgzOCwgMHhiNiwgMHgyNywgMHg5OCwgMHg5NywgMHg4NSwgMHhkNywgMHgwZCwKKwkweDdiLCAweDNhLCAweDYyLCAweDMwLCAweGQxLCAweDc1LCAweDk5LCAweGJjLCAweGRlLCAweGQyLCAweGEwLCAweDhjLAorCTB4YzEsIDB4ZWQsIDB4ZGQsIDB4MmIsIDB4ZjksIDB4MDYsIDB4ZTMsIDB4NjYsIDB4MzAsIDB4MjIsIDB4NmMsIDB4YjQsCisJMHhhNiwgMHgyNSwgMHgyOSwgMHgyNywgMHgwYiwgMHhiYywgMHhjZiwgMHgyYiwgMHhlMSwgMHgwOSwgMHhkZSwgMHhlNywKKwkweDBlLCAweDI1LCAweDIzLCAweDUzLCAweGZjLCAweGJiLCAweDkwLCAweGJmLCAweDJjLCAweDJiLCAweDg3LCAweGQwLAorCTB4YjMsIDB4ZGEsIDB4MTQsIDB4ZmQsIDB4MjAsIDB4NjYsIDB4ZDEsIDB4NmYsIDB4YTcsIDB4ODMsIDB4ZWYsIDB4NmIsCisJMHgzMywgMHhkNiwgMHg4MiwgMHg0ZiwgMHg3YywgMHhlMCwgMHg0YiwgMHg2NiwgMHhmMSwgMHg1YywgMHhlMCwgMHgyMSwKKwkweDdmLCAweGNmLCAweDRmLCAweGQxLCAweDg1LCAweDhjLCAweDllLCAweGMzLCAweDgwLCAweDYxLCAweGJjLCAweDg0LAorCTB4NzksIDB4ZjgsIDB4NjgsIDB4YjcsIDB4ZjMsIDB4NDMsIDB4ODYsIDB4MTcsIDB4MWYsIDB4ZmYsIDB4NzEsIDB4ZWQsCisJMHg5YywgMHg4NiwgMHhkNSwgMHg5YywgMHhkMCwgMHhkMywgMHhiMiwgMHgwNSwgMHgzZCwgMHg3YywgMHgwOCwgMHhiZCwKKwkweDhmLCAweDBhLCAweGEyLCAweGU3LCAweDY0LCAweGIzLCAweGIwLCAweDRkLCAweDBiLCAweGMyLCAweGM2LCAweDI4LAorCTB4ODUsIDB4MmEsIDB4N2QsIDB4MzAsIDB4ZWYsIDB4YTksIDB4MzksIDB4ZjcsIDB4MTMsIDB4NWYsIDB4N2EsIDB4ZjEsCisJMHhhMCwgMHhkMCwgMHhjNSwgMHg0NiwgMHgwZSwgMHhlYywgMHg1NSwgMHhmNSwgMHhhNywgMHg1ZCwgMHhlMiwgMHhiZSwKKwkweGM2LCAweDMyLCAweDdlLCAweDdiLCAweDUwLCAweGZkLCAweGY2LCAweDQ5LCAweGExLCAweDAzLCAweDIzLCAweDJmLAorCTB4MmUsIDB4YjAsIDB4MjQsIDB4ZjAsIDB4OWMsIDB4ZjcsIDB4ZDcsIDB4OTksIDB4NjAsIDB4M2MsIDB4MGYsIDB4YWQsCisJMHhjMCwgMHg3NywgMHgyZiwgMHhlMCwgMHhhOSwgMHhlMSwgMHgwMSwgMHg1OCwgMHgwMCwgMHhmNywgMHgzYiwgMHgxNCwKKwkweGRlLCAweGRiLCAweDU2LCAweGRjLCAweGFmLCAweGQ3LCAweGRkLCAweDA4LCAweGNlLCAweGFjLCAweGQzLCAweDY0LAorCTB4YjAsIDB4NTYsIDB4YWMsIDB4NjksIDB4OGYsIDB4MmYsIDB4OTIsIDB4YjcsIDB4OGMsIDB4ZjQsIDB4MjIsIDB4NmMsCisJMHgxYSwgMHhkNCwgMHhiNSwgMHhkYywgMHg4NSwgMHhiYywgMHgyOSwgMHg5ZSwgMHhjMywgMHgxZSwgMHg4YSwgMHgyNCwKKwkweDMwLCAweDJmLCAweDhjLCAweGQzLCAweDMwLCAweGY4LCAweGI3LCAweDFhLCAweDU4LCAweGI4LCAweGFmLCAweGViLAorCTB4NTYsIDB4ZDcsIDB4YjUsIDB4OGEsIDB4YmQsIDB4MjAsIDB4MDMsIDB4Y2YsIDB4ZDEsIDB4Y2YsIDB4YzYsIDB4NzMsCisJMHhmMSwgMHg3YywgMHg1YywgMHg4NywgMHhmYiwgMHhjOSwgMHhmYiwgMHhmNiwgMHgzMSwgMHg3ZiwgMHg4ZSwgMHg0ZSwKKwkweGM5LCAweDdiLCAweDE5LCAweDk3LCAweGU0LCAweDZmLCAweDdkLCAweDhlLCAweGY3LCAweDdjLCAweGU1LCAweGZlLAorCTB4ZjksIDB4NTQsIDB4YmYsIDB4MWUsIDB4ZWMsIDB4NWYsIDB4MzcsIDB4ZTUsIDB4ODUsIDB4OGYsIDB4MTMsIDB4YmYsCisJMHg3NSwgMHg4YSwgMHhkZiwgMHhhMiwgMHg0ZSwgMHhhNywgMHhkOCwgMHhkNywgMHhmMywgMHg3YywgMHgzYywgMHg5ZiwKKwkweGVkLCAweGYyLCAweGMxLCAweDM2LCAweDRmLCAweDI3LCAweDNhLCAweDdkLCAweGY5LCAweDNjLCAweGQ2LCAweGRiLAorCTB4ZTksIDB4OGIsIDB4MzMsIDB4ZWUsIDB4YzcsIDB4YjIsIDB4ZjEsIDB4ZDIsIDB4ODIsIDB4ZTAsIDB4MzEsIDB4YWMsCisJMHhkMywgMHhmNiwgMHhkYSwgMHhlNiwgMHg0OSwgMHhlMywgMHg0ZiwgMHg4NiwgMHg2NCwgMHg2ZiwgMHg1YiwgMHg3YywKKwkweDY3LCAweGZhLCAweGNiLCAweDMwLCAweGZkLCAweDY1LCAweDk4LCAweGZlLCAweDMyLCAweDRjLCAweDdmLCAweDE5LAorCTB4YTYsIDB4M2YsIDB4YjYsIDB4NGIsIDB4ZGYsIDB4NjQsIDB4OTksIDB4ZjEsIDB4NmQsIDB4OTYsIDB4MTksIDB4OTIsCisJMHg2NiwgMHgyMywgMHhjYSwgMHg4ZiwgMHhhOSwgMHg2OSwgMHhiNiwgMHhiNiwgMHgzZSwgMHg1MywgMHhkMywgMHgyOCwKKwkweGU0LCAweDM0LCAweGY5LCAweDBlLCAweDhmLCAweDU3LCAweGQzLCAweGVhLCAweDU1LCAweGE2LCAweGQ1LCAweGE2LAorCTB4OTksIDB4N2UsIDB4YmEsIDB4OTEsIDB4YzMsIDB4OWUsIDB4ZDksIDB4ZDYsIDB4NzksIDB4ZTYsIDB4ZDEsIDB4NzEsCisJMHgzZiwgMHg3NCwgMHhhYSwgMHgwMCwgMHhkMywgMHgxMywgMHg3NCwgMHg0YSwgMHg5YiwgMHhlMSwgMHhkZSwgMHg0ZiwKKwkweDM3LCAweDk5LCAweDRmLCAweGRmLCAweGM4LCAweDgxLCAweDc2LCAweGVmLCAweDUyLCAweGM3LCAweDE5LCAweGE2LAorCTB4NWQsIDB4YzgsIDB4YjksIDB4MjUsIDB4ZGYsIDB4ZDUsIDB4YWMsIDB4YzEsIDB4YmEsIDB4NTcsIDB4YzAsIDB4NGMsCisJMHgxMiwgMHhmOCwgMHhhOCwgMHhkMCwgMHhjNywgMHg3OCwgMHhkZiwgMHhkNywgMHg5OSwgMHhkZiwgMHhjMywgMHg1NywKKwkweDg3LCAweGJlLCAweDVmLCAweDc5LCAweDFmLCAweGNiLCAweDg5LCAweGQwLCAweDE1LCAweGU2LCAweGEzLCAweGE3LAorCTB4NzMsIDB4NGIsIDB4NGMsIDB4ZWYsIDB4YmQsIDB4ZjQsIDB4ODUsIDB4MWMsIDB4ZTQsIDB4MzEsIDB4NjAsIDB4YzQsCisJMHhjNywgMHg3OSwgMHgxMiwgMHgzZSwgMHgzMCwgMHg2MywgMHgwNiwgMHg2YiwgMHgxZiwgMHg0YiwgMHgxOSwgMHgwMiwKKwkweDRmLCAweDllLCAweDAxLCAweDFjLCAweDE4LCAweGY2LCAweDY3LCAweGY2LCAweGEyLCAweDY3LCAweDdkLCAweGM0LAorCTB4NjgsIDB4NTYsIDB4M2UsIDB4NDUsIDB4N2MsIDB4YzcsIDB4NzgsIDB4OGMsIDB4MDUsIDB4ZGMsIDB4NzAsIDB4ZGMsCisJMHgyOCwgMHhmZSwgMHg4OCwgMHhmNywgMHg0MiwgMHg4NCwgMHgxOSwgMHgxZSwgMHhiNSwgMHg3YywgMHhlYiwgMHgwMiwKKwkweDdhLCAweDkxLCAweDAyLCAweDVlLCAweGQzLCAweDUxLCAweDNmLCAweDZhLCAweGM1LCAweGU5LCAweDM5LCAweGJjLAorCTB4ZmYsIDB4ZTAsIDB4ODUsIDB4MjIsIDB4ZTYsIDB4YmQsIDB4NDgsIDB4MGIsIDB4NDEsIDB4ZjAsIDB4MjEsIDB4M2IsCisJMHg3YywgMHg5ZCwgMHgyNCwgMHhlYywgMHg1YSwgMHg1OSwgMHhiZiwgMHhmYywgMHhiYywgMHgzNywgMHg2ZiwgMHhiMywKKwkweGEyLCAweDQyLCAweDFmLCAweDZlLCAweDYxLCAweGZiLCAweDA2LCAweGIwLCAweDc5LCAweDhiLCAweDcxLCAweDJkLAorCTB4MGMsIDB4OWIsIDB4NWYsIDB4ZjEsIDB4YjUsIDB4MzcsIDB4OTksIDB4ZTcsIDB4NjAsIDB4Y2YsIDB4M2EsIDB4ODUsCisJMHg4YywgMHhmMSwgMHhlMiwgMHg2NSwgMHgxYiwgMHg4YSwgMHg5NywgMHgzOSwgMHgyZSwgMHg1ZSwgMHg5NiwgMHgyZSwKKwkweGYzLCAweDMyLCAweGM2LCAweDA5LCAweGMxLCAweGMzLCAweGMwLCAweGEzLCAweDY2LCAweDU5LCAweDRmLCAweDk0LAorCTB4ZGYsIDB4YTEsIDB4ZmYsIDB4ZWQsIDB4MTYsIDB4M2MsIDB4OGIsIDB4NzksIDB4M2QsIDB4ZGIsIDB4MGQsIDB4ODUsCisJMHg2MiwgMHhjYSwgMHg3NywgMHg0OCwgMHhmMCwgMHgwZSwgMHg4ZCwgMHhkNywgMHhmZiwgMHhhMywgMHhlOCwgMHhhMSwKKwkweDU1LCAweGYwLCAweDgxLCAweGY0LCAweDJjLCAweGY4LCAweDk1LCAweGQ3LCAweGY4LCAweGZmLCAweDAyLCAweDZjLAorCTB4NzksIDB4YmMsIDB4MTMsIDB4N2EsIDB4OGQsIDB4ZjksIDB4NTgsIDB4MjEsIDB4MGMsIDB4OWIsIDB4YjUsIDB4NDMsCisJMHhkOSwgMHgzNiwgMHhlOCwgMHhiYiwgMHhiNSwgMHgwNywgMHhiOSwgMHg5NiwgMHg1NiwgMHhiNCwgMHhjYywgMHhjNywKKwkweDc2LCAweDJiLCAweGJmLCAweDA1LCAweGZjLCAweDhjLCAweGQ4LCAweGViLCAweDNhLCAweDVkLCAweGMwLCAweDgyLAorCTB4MmUsIDB4YzAsIDB4NjMsIDB4MDMsIDB4MGMsIDB4MWYsIDB4ZDEsIDB4MWIsIDB4OWMsIDB4ZTgsIDB4MTYsIDB4YzMsCisJMHgwMSwgMHhmYiwgMHg3YywgMHgwYiwgMHhmYiwgMHhjYywgMHhiYSwgMHgyYywgMHgwNSwgMHhlNiwgMHhhNiwgMHgwMiwKKwkweDAzLCAweDk4LCAweGRmLCAweGMyLCAweDZhLCAweDg1LCAweDFmLCAweDllLCAweGNmLCAweDBjLCAweDE4LCAweDg1LAorCTB4YWMsIDB4OWMsIDB4ZTMsIDB4Y2EsIDB4YjgsIDB4ZTQsIDB4NzksIDB4ODUsIDB4M2MsIDB4N2EsIDB4N2IsIDB4ODksCisJMHhiOSwgMHhmMiwgMHgxYywgMHhmNSwgMHhmYSwgMHgwNCwgMHhmZiwgMHg1MiwgMHg3NCwgMHhiZiwgMHgxZCwgMHg1YSwKKwkweDRiLCAweDMwLCAweDVkLCAweDYxLCAweDRmLCAweDUyLCAweDJlLCAweDljLCAweDc5LCAweDk0LCAweDlmLCAweDhmLAorCTB4NzMsIDB4OGQsIDB4ZDcsIDB4NzEsIDB4YjMsIDB4YmMsIDB4OGUsIDB4MDgsIDB4YWYsIDB4MDMsIDB4NjMsIDB4NmYsCisJMHhmOSwgMHg2ZSwgMHhhOCwgMHg3NSwgMHhkYywgMHgyOCwgMHhhZiwgMHg2MywgMHg1NiwgMHhhZCwgMHg4MywgMHhkMiwKKwkweGM2LCAweGNjLCAweDZlLCAweGE1LCAweGM3LCAweDZmLCAweDc5LCAweGNmLCAweGQ2LCAweDI4LCAweGViLCAweDI3LAorCTB4ZTksIDB4NTUsIDB4YzAsIDB4ZjMsIDB4MWUsIDB4ODUsIDB4MmYsIDB4NmUsIDB4N2YsIDB4YTgsIDB4N2IsIDB4NmUsCisJMHhmNiwgMHhjNCwgMHg3NSwgMHhmYSwgMHg1ZCwgMHhiYSwgMHgyOSwgMHhmNCwgMHg5MywgMHg2MSwgMHhkNiwgMHg0ZiwKKwkweDcwLCAweDllLCAweDE2LCAweGMwLCAweDg3LCAweGQzLCAweDQxLCAweGY0LCAweDliLCAweDFkLCAweDY0LCAweDk4LAorCTB4YjEsIDB4NWQsIDB4MzUsIDB4YzUsIDB4OWYsIDB4YzIsIDB4NGYsIDB4ODYsIDB4ZmIsIDB4ZTgsIDB4ZWIsIDB4YmYsCisJMHg0OCwgMHgzNywgMHgxNywgMHhjMSwgMHhhYiwgMHhhMSwgMHg4ZiwgMHhjYSwgMHg5ZSwgMHhiNCwgMHgzNywgMHhkNywKKwkweGE0LCAweDlmLCAweDM2LCAweGVlLCAweGU5LCAweGE3LCAweDg1LCAweDhmLCAweDM2LCAweDBjLCAweDdkLCAweGRkLAorCTB4ODQsIDB4M2YsIDB4MzcsIDB4MjYsIDB4ZGUsIDB4NjcsIDB4YzEsIDB4YzcsIDB4NDUsIDB4ZGMsIDB4Y2IsIDB4OGIsCisJMHhlZiwgMHg0YywgMHhiYiwgMHg3MiwgMHhkYywgMHg5MCwgMHg3MywgMHg5MiwgMHg2MiwgMHgzZSwgMHhlMiwgMHg5OCwKKwkweDRkLCAweDg2LCAweGFjLCAweDlkLCAweGI5LCAweDVjLCAweGQ0LCAweDNhLCAweDUxLCAweDljLCAweGY3LCAweGM4LAorCTB4MDksIDB4MWIsIDB4NDYsIDB4NDQsIDB4ZjgsIDB4MGMsIDB4NWEsIDB4OWQsIDB4MGUsIDB4NmEsIDB4NjEsIDB4MzksCisJMHg3OSwgMHg4YSwgMHhkMCwgMHgxMywgMHhjZCwgMHhiNiwgMHhlMCwgMHhjYiwgMHhiZiwgMHhjMCwgMHhiOCwgMHhiNywKKwkweDEwLCAweGI2LCAweDQzLCAweDlmLCAweDEzLCAweGY2LCAweDI1LCAweGU0LCAweDA3LCAweGRlLCAweGE3LCAweDAyLAorCTB4MTgsIDB4NjMsIDB4MGUsIDB4ZmMsIDB4N2QsIDB4MTUsIDB4ZmQsIDB4MzAsIDB4YzMsIDB4YmMsIDB4N2UsIDB4ZjgsCisJMHg4MSwgMHg0NywgMHhhZCwgMHg3NywgMHg1OCwgMHhlZSwgMHg1YywgMHgxMCwgMHhmZSwgMHg5NSwgMHhiMywgMHg5NCwKKwkweDY2LCAweDNhLCAweDNjLCAweDJjLCAweGU4LCAweGQwLCAweDE4LCAweDY2LCAweDZhLCAweDYxLCAweGZhLCAweDQxLAorCTB4OGUsIDB4YzEsIDB4OTgsIDB4ZTgsIDB4YmYsIDB4MjMsIDB4NmQsIDB4MTYsIDB4NWUsIDB4ZTUsIDB4OWEsIDB4ZWEsCisJMHg2YiwgMHg5MCwgMHgwMCwgMHg2ZiwgMHhkOCwgMHhiZSwgMHg2ZiwgMHgyMSwgMHhmMSwgMHg5MSwgMHg3ZCwgMHgyYSwKKwkweDZlLCAweDVkLCAweGFiLCAweGQ2LCAweDg3LCAweDBkLCAweGZiLCAweGNjLCAweDEyLCAweDdkLCAweDFmLCAweDAxLAorCTB4M2IsIDB4ZTEsIDB4MTcsIDB4MzQsIDB4MjYsIDB4MTksIDB4NmUsIDB4ZmEsIDB4ZGQsIDB4MzUsIDB4NmUsIDB4ZmIsCisJMHhmZiwgMHgyOSwgMHg1MSwgMHg5ZiwgMHhmZiwgMHg0NiwgMHg1MSwgMHhjYSwgMHhkOCwgMHgzNCwgMHhkYiwgMHhlNiwKKwkweDBiLCAweDA3LCAweGRjLCAweDNhLCAweDg3LCAweDlkLCAweDhkLCAweDA5LCAweDlmLCAweGNjLCAweDAwLCAweDQ1LAorCTB4OTcsIDB4MjcsIDB4ZTksIDB4YjEsIDB4MGMsIDB4NzgsIDB4MTQsIDB4NWQsIDB4OGYsIDB4M2EsIDB4NzgsIDB4YzMsCisJMHgwNiwgMHg2OCwgMHg3OSwgMHg5MiwgMHhlMiwgMHg0NSwgMHhjMCwgMHhjOCwgMHg0NywgMHgwYiwgMHgyYywgMHgwNSwKKwkweGQyLCAweDU5LCAweGM0LCAweGVlLCAweGY5LCAweDdiLCAweDFlLCAweGVmLCAweDU3LCAweGY5LCAweDE1LCAweGU1LAorCTB4ZjcsIDB4MWUsIDB4YTIsIDB4ZDgsIDB4MzIsIDB4YTUsIDB4OTIsIDB4ZTEsIDB4ODcsIDB4NDUsIDB4Y2YsIDB4ZWEsCisJMHg2NCwgMHg3OCwgMHg1YywgMHhmOSwgMHg2OCwgMHg0MiwgMHg3YywgMHgxZSwgMHg3ZSwgMHgyZiwgMHg4YiwgMHgxZSwKKwkweGNkLCAweGQ4LCAweGE5LCAweDI0LCAweDQ5LCAweGRmLCAweDAzLCAweGYxLCAweDFjLCAweDBjLCAweDk2LCAweGFkLAorCTB4YmIsIDB4OTksIDB4NTcsIDB4MWMsIDB4MTcsIDB4ZmUsIDB4MDcsIDB4ZDYsIDB4NDQsIDB4MTYsIDB4MzEsIDB4MWUsCisJMHhiZSwgMHg4MywgMHg1ZSwgMHg4MiwgMHhiZCwgMHg5NSwgMHhjYywgMHgzZSwgMHhhMCwgMHhjNiwgMHg5NiwgMHhjOCwKKwkweDY0LCAweDVjLCAweDMwLCAweDdmLCAweGM5LCAweDQ5LCAweDg1LCAweDhkLCAweGNhLCAweGY1LCAweGYwLCAweDVkLAorCTB4MWMsIDB4MTcsIDB4ZmEsIDB4ZTEsIDB4MzAsIDB4ZGIsIDB4MzAsIDB4NjIsIDB4NWMsIDB4NjksIDB4NGUsIDB4ZjgsCisJMHgyMSwgMHhmOCwgMHgzOCwgMHhmZiwgMHhkMywgMHgwMSwgMHhmZCwgMHg2ZSwgMHgwMywgMHg5YywgMHg5NywgMHhmZSwKKwkweDA5LCAweGJlLCAweDY3LCAweDllLCAweGU3LCAweDUxLCAweDk1LCAweDE3LCAweDNmLCAweDQ0LCAweDkxLCAweDFkLAorCTB4ZjgsIDB4OGIsIDB4NjYsIDB4ZWYsIDB4YTgsIDB4YmYsIDB4ODgsIDB4NjEsIDB4Y2QsIDB4YjIsIDB4ZTUsIDB4MzIsCisJMHhkMywgMHhjNiwgMHhkYiwgMHg1YiwgMHhkYSwgMHg3MSwgMHhlZiwgMHg2YiwgMHgxOSwgMHhjZCwgMHhiMCwgMHgzMiwKKwkweGM1LCAweGZiLCAweDJmLCAweGQwLCAweGViLCAweDczLCAweGExLCAweGY4LCAweDI5LCAweGJjLCAweDQ3LCAweGM2LAorCTB4OTcsIDB4MTAsIDB4M2EsIDB4NmYsIDB4ODgsIDB4NzUsIDB4MTcsIDB4ZTgsIDB4MzAsIDB4YTMsIDB4MjIsIDB4YmUsCisJMHgxNSwgMHg3OSwgMHhjMiwgMHgzMiwgMHgxNiwgMHhkNiwgMHhmYSwgMHhjOSwgMHgwZiwgMHhiZiwgMHg5YSwgMHhhMywKKwkweDczLCAweDIyLCAweDVhLCAweDQ1LCAweGZlLCAweGJhLCAweDhjLCAweDJiLCAweDQyLCAweGZlLCAweDgyLCAweDA3LAorCTB4ZmUsIDB4YzQsIDB4OTcsIDB4NWMsIDB4ZjMsIDB4ZjcsIDB4ZTksIDB4N2MsIDB4YjcsIDB4NDgsIDB4YjAsIDB4OWMsCisJMHg0ZiwgMHhhMywgMHg3OCwgMHg4YSwgMHhjNiwgMHgzZCwgMHgxZCwgMHhiMywgMHg3MCwgMHhiZiwgMHhkNywgMHgwYSwKKwkweGI0LCAweGViLCAweGQ2LCAweDE5LCAweGUwLCAweDY3LCAweDEyLCAweDdiLCAweDc0LCAweDAxLCAweDcxLCAweDVjLAorCTB4YTMsIDB4MmEsIDB4MWUsIDB4ZDEsIDB4YzIsIDB4ZmIsIDB4MDQsIDB4M2IsIDB4MGYsIDB4ZmUsIDB4YmIsIDB4Y2YsCisJMHhmMiwgMHgyNywgMHhlMiwgMHgwYSwgMHgyNywgMHgwNywgMHhhMSwgMHgyNywgMHhmNSwgMHgzOCwgMHg4YywgMHgzMywKKwkweDUzLCAweDM4LCAweGVlLCAweDY3LCAweGJiLCAweDRiLCAweGViLCAweGI1LCAweGQyLCAweGE3LCAweGM0LCAweGI2LAorCTB4OTgsIDB4ZGEsIDB4MmYsIDB4ZjgsIDB4OTMsIDB4NDYsIDB4NTQsIDB4YmYsIDB4MDEsIDB4OWIsIDB4YWMsIDB4NWUsCisJMHhjMCwgMHhlOSwgMHhlMywgMHhhMiwgMHhjNywgMHhhZCwgMHg2MiwgMHgxMCwgMHhkYiwgMHhjOSwgMHg1OSwgMHhjMiwKKwkweDNiLCAweGI3LCAweGQwLCAweDc3LCAweGYzLCAweDZlLCAweGMwLCAweDllLCAweGY3LCAweGM4LCAweDFkLCAweGEzLAorCTB4ZjgsIDB4OTQsIDB4N2EsIDB4ZmYsIDB4Y2YsIDB4OWQsIDB4ZGEsIDB4YjcsIDB4NWQsIDB4MWUsIDB4ZmIsIDB4ZjYsCisJMHhiZCwgMHg0MSwgMHgxOSwgMHgwMywgMHhiYiwgMHg0YiwgMHg4ZCwgMHhmMSwgMHhjYSwgMHg1MywgMHhmZCwgMHhmYiwKKwkweGE3LCAweGUxLCAweDRmLCAweGFhLCAweGQ0LCAweDUxLCAweDVjLCAweDEzLCAweDdjLCAweGE1LCAweGRlLCAweGE3LAorCTB4MWQsIDB4NjIsIDB4N2UsIDB4MmEsIDB4ZTksIDB4ZjgsIDB4YjgsIDB4MDcsIDB4MWQsIDB4ZjcsIDB4Y2UsIDB4NDAsCisJMHgyZiwgMHhiOSwgMHg3ZCwgMHgzYSwgMHgzZSwgMHhkNiwgMHg5MCwgMHg4ZSwgMHhmZiwgMHg3NSwgMHg1MCwgMHhmYSwKKwkweDU0LCAweGViLCAweGU5LCAweDE4LCAweGI1LCAweDNjLCAweGM3LCAweDhiLCAweDhkLCAweGZjLCAweDU3LCAweGQ4LAorCTB4MDcsIDB4ZDQsIDB4YTQsIDB4YzMsIDB4ZTcsIDB4MDEsIDB4NTgsIDB4NjksIDB4YmYsIDB4MDcsIDB4ZTIsIDB4N2UsCisJMHhjMCwgMHg0NywgMHhjNCwgMHg0ZSwgMHhmZSwgMHg5MCwgMHhlMiwgMHg4YiwgMHhiNSwgMHhiMSwgMHhkMCwgMHhjZCwKKwkweGFlLCAweGY5LCAweDk2LCAweGM3LCAweDM1LCAweGQwLCAweGM1LCAweDQxLCAweDBiLCAweDc2LCAweDQ4LCAweGRhLAorCTB4ZjQsIDB4MWEsIDB4NWUsIDB4ZWYsIDB4ZjksIDB4MGUsIDB4ZTUsIDB4ZWMsIDB4NTQsIDB4OWUsIDB4ZTAsIDB4YTMsCisJMHgwZSwgMHhkMiwgMHg1MywgMHg4OCwgMHgyYiwgMHgyYiwgMHgxZiwgMHhmMCwgMHhkMSwgMHg4YywgMHg1YywgMHhiNywKKwkweDc5LCAweDQwLCAweGUwLCAweDAzLCAweGY0LCAweGQ1LCAweDUwLCAweGMyLCAweDlmLCAweGUwLCAweDNkLCAweDk1LAorCTB4ZmUsIDB4ZGYsIDB4ZTQsIDB4NmEsIDB4NDgsIDB4ZWQsIDB4MTMsIDB4OGYsIDB4YzUsIDB4ZmQsIDB4M2MsIDB4ZWIsCisJMHhmYywgMHhiMCwgMHgzZiwgMHhmNiwgMHhkNywgMHhkNywgMHhjYiwgMHg3OSwgMHhjNSwgMHg5MCwgMHgwNSwgMHgyNSwKKwkweGZhLCAweDBmLCAweDk2LCAweDczLCAweGZlLCAweDAzLCAweGE2LCAweGU4LCAweGI5LCAweDcwLCAweGI5LCAweDc4LAorCTB4ODAsIDB4ZjUsIDB4NDcsIDB4ZWMsIDB4MjEsIDB4N2MsIDB4ODcsIDB4ZGEsIDB4YjcsIDB4ZmIsIDB4ZjYsIDB4MzAsCisJMHg3NSwgMHhlZCwgMHg2NywgMHhhOSwgMHg2ZiwgMHg5MCwgMHhjMywgMHg3YSwgMHhhMywgMHg3MSwgMHgwMCwgMHhmOSwKKwkweGUxLCAweDE2LCAweDVmLCAweDgzLCAweDVlLCAweDUxLCAweDYzLCAweDU2LCAweDljLCAweDNhLCAweGUwLCAweDRmLAorCTB4NDAsIDB4MGYsIDB4NjgsIDB4MmIsIDB4NWQsIDB4NDUsIDB4NTMsIDB4YjMsIDB4ODIsIDB4YTYsIDB4ZTIsIDB4NmIsCisJMHhiMywgMHg4YSwgMHhhNiwgMHg2NiwgMHg5NSwgMHhmZiwgMHg3YywgMHg1NiwgMHhkMSwgMHhkNCwgMHhhYywgMHhhMiwKKwkweGE5LCAweDU5LCAweDQ1LCAweDUzLCAweGIzLCAweDhjLCAweGQ3LCAweGEzLCAweGFjLCAweGFmLCAweDQyLCAweGY3LAorCTB4ZDAsIDB4ZmUsIDB4Y2IsIDB4MmUsIDB4NGEsIDB4ZTYsIDB4NzAsIDB4MWUsIDB4ZjIsIDB4YjgsIDB4OTYsIDB4YWUsCisJMHg3ZSwgMHg2ZCwgMHg1OCwgMHhmYiwgMHg0NywgMHgwYiwgMHgzMiwgMHhjZiwgMHg4ZSwgMHg5ZiwgMHg4NSwgMHgzZCwKKwkweDc4LCAweDk4LCAweGUxLCAweDc3LCAweGNkLCAweDM3LCAweGJmLCAweDg4LCAweGI5LCAweGZhLCAweDI4LCAweDI2LAorCTB4N2EsIDB4YzAsIDB4MzYsIDB4NTEsIDB4ZDQsIDB4YWQsIDB4ZTMsIDB4OWEsIDB4YTgsIDB4ZWIsIDB4OTIsIDB4YjYsCisJMHg1YywgMHhhYSwgMHg2MSwgMHg4ZCwgMHg5NywgMHhjNiwgMHg4YiwgMHg2OSwgMHhiNSwgMHg1ZiwgMHhiNSwgMHg3NiwKKwkweDRlLCAweDBiLCAweDI1LCAweGIyLCAweDgwLCAweDJiLCAweDcyLCAweDIxLCAweDJkLCAweGRlLCAweDFiLCAweDAxLAorCTB4YTcsIDB4OTQsIDB4ZTksIDB4MDEsIDB4ODMsIDB4YTMsIDB4MGEsIDB4MDYsIDB4NGYsIDB4OGIsIDB4MzUsIDB4MjIsCisJMHg5NywgMHgxMCwgMHgzZSwgMHhjOCwgMHhjNiwgMHg3MCwgMHg0OCwgMHg2NywgMHg0NiwgMHhmOSwgMHgzZSwgMHg4YywKKwkweGZiLCAweDA3LCAweDQyLCAweGNjLCAweDgzLCAweGI2LCAweDBiLCAweDA3LCAweGY3LCAweGRhLCAweDFiLCAweGYxLAorCTB4OWEsIDB4ZWQsIDB4ZDYsIDB4ZDMsIDB4NWMsIDB4NzcsIDB4YzksIDB4OGUsIDB4OTAsIDB4OTIsIDB4MWIsIDB4NTIsCisJMHhlZiwgMHhkZCwgMHhlNSwgMHhkOCwgMHg4OSwgMHgxNCwgMHhjZiwgMHhlZCwgMHgyZiwgMHhjMiwgMHg3ZiwgMHgzOSwKKwkweDQ0LCAweDZkLCAweDI1LCAweDNhLCAweDEyLCAweDA2LCAweDNlLCAweDc3LCAweGIxLCAweDVkLCAweGM5LCAweDczLAorCTB4MTgsIDB4MmIsIDB4ZDEsIDB4ODUsIDB4ZjAsIDB4M2UsIDB4YjYsIDB4NWQsIDB4ZjYsIDB4YjMsIDB4MGUsIDB4M2EsCisJMHhjYSwgMHhmZiwgMHg0ZSwgMHhjNCwgMHhlZiwgMHhjMywgMHhiYywgMHgzYSwgMHhmOCwgMHhkYSwgMHg3ZSwgMHgzMiwKKwkweDdhLCAweDUyLCAweDY2LCAweDJiLCAweGViLCAweDA3LCAweDQ3LCAweDJhLCAweGY2LCAweDg4LCAweDA1LCAweGZmLAorCTB4MWMsIDB4ZWIsIDB4YjYsIDB4YzYsIDB4NWMsIDB4YjgsIDB4NWIsIDB4ZDUsIDB4OWMsIDB4YzEsIDB4ODcsIDB4OGQsCisJMHhmOCwgMHhkNiwgMHgzZiwgMHg5NywgMHg2NCwgMHhhZiwgMHg4MCwgMHgyMSwgMHg3NSwgMHhmYywgMHhlMywgMHg1MiwKKwkweDY0LCAweDA4LCAweGM3LCAweDc4LCAweGU3LCAweDkwLCAweDNkLCAweDExLCAweGYxLCAweGZkLCAweDU4LCAweGVhLAorCTB4ZjIsIDB4M2UsIDB4ZmIsIDB4ODgsIDB4N2MsIDB4M2YsIDB4ODAsIDB4NmQsIDB4NWEsIDB4M2UsIDB4MmYsIDB4YmMsCisJMHg5NywgMHgzYSwgMHg0ZiwgMHgyNSwgMHg1ZiwgMHgxNSwgMHg3NCwgMHg1MCwgMHhhMiwgMHg3ZiwgMHg2NywgMHg5YSwKKwkweDM1LCAweDA5LCAweGIxLCAweDhjLCAweDI5LCAweDUxLCAweDBiLCAweDhkLCAweDdjLCAweGU1LCAweGY5LCAweDQ1LAorCTB4M2QsIDB4MmYsIDB4NDcsIDB4ZWQsIDB4ZjUsIDB4ZmQsIDB4YzgsIDB4MzcsIDB4Y2IsIDB4MTYsIDB4NjgsIDB4NzMsCisJMHg5OSwgMHgwMSwgMHgzZiwgMHhkYSwgMHhlOCwgMHhmMiwgMHg0NiwgMHg0ZiwgMHg1MCwgMHhkNCwgMHg2NiwgMHg3NywKKwkweGIzLCAweDhlLCAweGEzLCAweGYzLCAweDkyLCAweGM3LCAweGY4LCAweGZlLCAweDAxLCAweGYxLCAweGJlLCAweGI5LAorCTB4ZDgsIDB4MTIsIDB4YzYsIDB4MzUsIDB4ZDMsIDB4YzgsIDB4NzIsIDB4ZTksIDB4MjEsIDB4ZmUsIDB4NWQsIDB4YzQsCisJMHgxMSwgMHg5MywgMHhkNCwgMHhhYSwgMHg2MiwgMHgwNCwgMHgxZCwgMHgyYSwgMHhhZSwgMHgxNCwgMHg2MiwgMHg1YSwKKwkweGFhLCAweGQ0LCAweDFjLCAweDhmLCAweDk0LCAweDdkLCAweDZkLCAweGMwLCAweGYxLCAweDVhLCAweDVmLCAweGRiLAorCTB4NzMsIDB4NWIsIDB4YzgsIDB4OWIsIDB4YWQsIDB4ZjAsIDB4MWEsIDB4MzksIDB4YTUsIDB4MmQsIDB4YTQsIDB4N2MsCisJMHg4OCwgMHhkNiwgMHgwMiwgMHg2ZCwgMHhiNywgMHhiNiwgMHg2ZSwgMHhjNywgMHhkNywgMHhiNCwgMHgzNiwgMHhjZiwKKwkweGFjLCAweDlmLCAweDc5LCAweGM3LCAweDY5LCAweDUzLCAweGY4LCAweGQ0LCAweDRjLCAweGYzLCAweGI5LCAweDM2LAorCTB4OTYsIDB4ZDksIDB4YTgsIDB4OTcsIDB4MDIsIDB4YmMsIDB4ZmMsIDB4NDMsIDB4YTgsIDB4MzcsIDB4NzksIDB4MzIsCisJMHhkMCwgMHg0YywgMHhhYiwgMHhhYiwgMHhjOCwgMHg3OSwgMHg3OCwgMHhmYywgMHgyZSwgMHg5OSwgMHhlNywgMHhmYiwKKwkweDA4LCAweGMzLCAweDY1LCAweDNmLCAweGNiLCAweDM3LCAweDQzLCAweGM1LCAweDcwLCAweDcwLCAweDBlLCAweGJjLAorCTB4NDEsIDB4ZjQsIDB4ZmQsIDB4MGMsIDB4M2MsIDB4M2MsIDB4ZGUsIDB4YzYsIDB4N2EsIDB4YmQsIDB4OGMsIDB4MDEsCisJMHgxYywgMHhlNCwgMHg3YiwgMHg3ZiwgMHgzMywgMHhmNywgMHgwOCwgMHhmYywgMHg1OSwgMHhlNiwgMHg2MSwgMHhiZSwKKwkweDdmLCAweDhjLCAweGY1LCAweDgxLCAweDA4LCAweDM1LCAweGQzLCAweGNhLCAweDZhLCAweDMzLCAweGViLCAweGY1LAorCTB4Y2QsIDB4YWMsIDB4MGYsIDB4OGMsIDB4OWEsIDB4MjMsIDB4M2UsIDB4ZjEsIDB4MmMsIDB4NTEsIDB4ZGIsIDB4ZjIsCisJMHhlOSwgMHhjMCwgMHg3ZSwgMHhjNiwgMHg0MSwgMHgzYywgMHhlYiwgMHg4YiwgMHhlYSwgMHg1OSwgMHhiNSwgMHhjZiwKKwkweGI4LCAweDU1LCAweGMyLCAweGYxLCAweDYxLCAweGZmLCAweGZhLCAweDk5LCAweGFiLCAweDc4LCAweDJmLCAweGQ0LAorCTB4ZTIsIDB4MzQsIDB4ZWIsIDB4YmUsIDB4NDEsIDB4ZjEsIDB4NmUsIDB4NDYsIDB4NjMsIDB4NjYsIDB4ODYsIDB4ZWQsCisJMHg4MCwgMHgzMCwgMHgxZiwgMHgxZiwgMHhhMSwgMHg1NCwgMHgzMSwgMHg0MSwgMHhiZiwgMHg1NywgMHg3NCwgMHhmYiwKKwkweDZhLCAweDhmLCAweGYwLCAweDljLCAweDY1LCAweDZkLCAweDdkLCAweDBiLCAweGNmLCAweGViLCAweDdkLCAweGE3LAorCTB4OTYsIDB4NjcsIDB4YjQsIDB4OTEsIDB4ZmYsIDB4NmIsIDB4NDEsIDB4NmEsIDB4N2UsIDB4MTEsIDB4YmUsIDB4OTEsCisJMHgxMiwgMHg2NSwgMHhjMywgMHhmNiwgMHg4NSwgMHhlYiwgMHhlMiwgMHhiZCwgMHgxYiwgMHgxNiwgMHhiZCwgMHgyMiwKKwkweGYyLCAweDViLCAweGY5LCAweDdhLCAweGJlLCAweGU3LCAweDc5LCAweDhjLCAweDdiLCAweGM1LCAweGEyLCAweDJiLAorCTB4OGUsIDB4ODQsIDB4ZjcsIDB4OWYsIDB4MDUsIDB4ODIsIDB4ZTQsIDB4N2YsIDB4MWQsIDB4MzksIDB4NDgsIDB4ZDAsCisJMHhiNSwgMHhkNiwgMHhjZiwgMHgzOCwgMHhmYiwgMHg5OCwgMHg1ZiwgMHhiZiwgMHg4OCwgMHhlYiwgMHhmOCwgMHhmMywKKwkweDc1LCAweDFjLCAweGI3LCAweGYxLCAweDNhLCAweDIxLCAweDZmLCAweDkxLCAweDc3LCAweDAyLCAweDNlLCAweGI3LAorCTB4M2YsIDB4NjQsIDB4MGEsIDB4ZmMsIDB4M2IsIDB4YzIsIDB4MzgsIDB4ZDUsIDB4MjQsIDB4N2MsIDB4ODEsIDB4YmQsCisJMHgxOCwgMHhlYiwgMHgwYywgMHhiMiwgMHg2ZSwgMHhiMCwgMHg3ZSwgMHg2NiwgMHg3YywgMHgxZiwgMHg4ZSwgMHgyMywKKwkweDNkLCAweDdlLCAweDg2LCAweDkxLCAweGM0LCAweGExLCAweGIwLCAweDc4LCAweGZmLCAweGExLCAweGViLCAweDJmLAorCTB4NzAsIDB4NzAsIDB4OWMsIDB4NzgsIDB4M2YsIDB4YTEsIDB4M2YsIDB4ZjAsIDB4N2UsIDB4OWEsIDB4ZTgsIDB4YjMsCisJMHhkNCwgMHg0NiwgMHg3MSwgMHg3ZSwgMHg0NiwgMHgyYywgMHgyNywgMHhkNywgMHg3ZCwgMHhiZSwgMHhlOCwgMHgyNywKKwkweGU5LCAweDQ3LCAweDZhLCAweDFlLCAweGQ2LCAweGVmLCAweDI5LCAweGE0LCAweDdlLCAweGRjLCAweDViLCAweGQzLAorCTB4MGEsIDB4YmUsIDB4NzcsIDB4ZDEsIDB4OGQsIDB4NWMsIDB4MDcsIDB4ZGQsIDB4NTQsIDB4YjEsIDB4YTUsIDB4MWIsCisJMHhjMiwgMHhhZSwgMHg2MiwgMHg5ZSwgMHg5YywgMHhlOCwgMHhhMiwgMHhlYiwgMHhhYiwgMHg0ZCwgMHg0NCwgMHhiZCwKKwkweDZkLCAweDIyLCAweGY2LCAweDdiLCAweDIzLCAweDk3LCAweGM3LCAweGYzLCAweDg3LCAweGE1LCAweGRmLCAweGE1LAorCTB4ODIsIDB4MjMsIDB4MzcsIDB4M2MsIDB4NzAsIDB4ZTQsIDB4M2QsIDB4ODEsIDB4MjMsIDB4ZWYsIDB4NmQsIDB4ODEsCisJMHgyMywgMHg3YiwgMHg5NSwgMHgyZCwgMHhkMSwgMHg0NiwgMHhjZCwgMHgwYSwgMHgzZiwgMHg1ZSwgMHg2MywgMHhmYywKKwkweDc4LCAweDgxLCAweGYxLCAweGUzLCAweDUwLCAweDAzLCAweGZjLCAweDMwLCAweDZhLCAweGYwLCAweGUzLCAweGIwLAorCTB4YzAsIDB4OGYsIDB4OWYsIDB4NmQsIDB4OGEsIDB4MWYsIDB4ODcsIDB4ZmMsIDB4OWIsIDB4ZjksIDB4ODIsIDB4MzQsCisJMHg2ZSwgMHgwZSwgMHhkMCwgMHg0YSwgMHhjZSwgMHhhMSwgMHhkNSwgMHg0NSwgMHg5YiwgMHgyZCwgMHg3YiwgMHhkOCwKKwkweGU2LCAweDg4LCAweDE5LCAweGNlLCAweDg4LCAweDdhLCAweDk3LCAweDgyLCAweGMwLCAweDJiLCAweDk2LCAweGUzLAorCTB4MzMsIDB4YTgsIDB4NjksIDB4YWEsIDB4ZGIsIDB4MDMsIDB4MTIsIDB4ZWYsIDB4YTUsIDB4MTQsIDB4ZjAsIDB4OTcsCisJMHg3YiwgMHgxMiwgMHhjYiwgMHhhYywgMHg5ZiwgMHhmOSwgMHg3MywgMHhkZSwgMHhjNywgMHgyYiwgMHg2YiwgMHg4MSwKKwkweDAwLCAweDdlLCAweGYzLCAweGNmLCAweDA0LCAweDY5LCAweDYzLCAweDhkLCAweGVkLCAweDU0LCAweGM2LCAweGIxLAorCTB4YWIsIDB4YjksIDB4MjEsIDB4YmEsIDB4OTIsIDB4MWIsIDB4YTAsIDB4OGQsIDB4ZGMsIDB4MzAsIDB4YmQsIDB4OTMsCisJMHhjMywgMHgzMywgMHgwMCwgMHg3MywgMHgzZSwgMHgxNiwgMHgzMCwgMHgzNywgMHhlOCwgMHg2MCwgMHg5MCwgMHhjNywKKwkweGFjLCAweDBlLCAweGQwLCAweGZhLCAweGFhLCAweGM2LCAweDU3LCAweGUwLCAweDJhLCAweGY2LCAweDNmLCAweGQyLAorCTB4MjMsIDB4ZWIsIDB4ZDAsIDB4ZWEsIDB4NzEsIDB4MjAsIDB4NTYsIDB4ODUsIDB4MDMsIDB4ZjIsIDB4MWEsIDB4ZWMsCisJMHhmZCwgMHg0MiwgMHg3ZCwgMHgwZCwgMHg2ZCwgMHhhYiwgMHgzOSwgMHg4MywgMHgxYywgMHhiOCwgMHgzNiwgMHhiNiwKKwkweGM5LCAweDZkLCAweGUxLCAweDczLCAweDNkLCAweGU4LCAweDg3LCAweDRlLCAweDZiLCAweGRjLCAweDRkLCAweDVkLAorCTB4YmMsIDB4MDcsIDB4MGUsIDB4ZjIsIDB4ODcsIDB4ODYsIDB4NTksIDB4M2YsIDB4ZWQsIDB4MTYsIDB4ZmEsIDB4NjgsCisJMHhkNCwgMHgwOSwgMHg4NCwgMHg2MiwgMHg1NCwgMHgzYSwgMHg2YiwgMHgzOCwgMHhlOCwgMHg5MywgMHhmOCwgMHgwOCwKKwkweGRmLCAweGNmLCAweDUwLCAweDdlLCAweDllLCAweDRlLCAweDE3LCAweDNlLCAweGQ1LCAweGVhLCAweDllLCAweDg4LAorCTB4ZDEsIDB4OWUsIDB4ZTAsIDB4MzksIDB4NDMsIDB4NGUsIDB4NTYsIDB4ZTIsIDB4MjIsIDB4NTQsIDB4OGUsIDB4OGIsCisJMHhiNCwgMHhmMiwgMHhiYSwgMHgyNSwgMHgyZCwgMHhjZCwgMHgzOSwgMHgzYywgMHhhZSwgMHhjOCwgMHhlMywgMHg4YSwKKwkweDg4LCAweGE5LCAweGYxLCAweGY5LCAweDU1LCAweGM0LCAweDczLCAweDg3LCAweDY4LCAweDYzLCAweDExLCAweDM0LAorCTB4MDcsIDB4ZmYsIDB4NDQsIDB4MjUsIDB4ODYsIDB4YmEsIDB4YjEsIDB4ODYsIDB4ZjMsIDB4ZjAsIDB4NTEsIDB4NTQsCisJMHg2MiwgMHhhOCwgMHgxYiwgMHgyYSwgMHg4NiwgMHhiYSwgMHhiMSwgMHgzNiwgMHgyZCwgMHhmOCwgMHhmMCwgMHg0MiwKKwkweDhlLCAweDc5LCAweDQwLCAweGNlLCAweGFmLCAweGYyLCAweDA3LCAweGY3LCAweGE5LCAweDc3LCAweGY2LCAweDljLAorCTB4MTAsIDB4M2UsIDB4ZTQsIDB4MWUsIDB4NjcsIDB4NzMsIDB4MTgsIDB4MWUsIDB4YWMsIDB4ODMsIDB4ZTEsIDB4YjQsCisJMHhkMCwgMHg4MywgMHhlMiwgMHg3YywgMHhjZiwgMHg1OCwgMHhlZSwgMHgwNCwgMHhjMywgMHg3MywgMHg5NiwgMHg2OSwKKwkweDY5LCAweGI3LCAweGEyLCAweDI1LCAweDFkLCAweDkzLCAweGVkLCAweDI2LCAweGY1LCAweGZlLCAweDFmLCAweGExLAorCTB4ZWIsIDB4NGIsIDB4ZmUsIDB4MzMsIDB4NTQsIDB4YzMsIDB4N2YsIDB4MjgsIDB4MTAsIDB4MWQsIDB4OTcsIDB4ZDcsCisJMHhhNywgMHg4YiwgMHhhZiwgMHgwYywgMHg2YiwgMHhmZiwgMHg1YiwgMHg5YSwgMHhlZiwgMHhiYiwgMHg5MCwgMHhkYiwKKwkweDQ5LCAweDRjLCAweDk3LCAweGU1LCAweGE2LCAweDY3LCAweGNlLCAweGUwLCAweDc2LCAweDlmLCAweGFkLCAweDcxLAorCTB4ZTEsIDB4YzQsIDB4NmQsIDB4ZTAsIDB4OTMsIDB4YmMsIDB4NDcsIDB4MDUsIDB4OWYsIDB4ZmUsIDB4NzcsIDB4MTYsCisJMHhjMCwgMHhiMiwgMHg5MywgMHgwNSwgMHg5OCwgMHg1NywgMHg4NCwgMHg4MCwgMHhmNSwgMHgwMywgMHgwMywgMHhiNCwKKwkweDhlLCAweDM5LCAweDAwLCAweDFlLCAweDUzLCAweDY4LCAweDAyLCAweGU2LCAweDE5LCAweGE3LCAweGY1LCAweDQwLAorCTB4ZmIsIDB4ZmIsIDB4OTUsIDB4YzEsIDB4ZWIsIDB4NWQsIDB4MWIsIDB4YTAsIDB4NjcsIDB4NGYsIDB4MmQsIDB4ZWEsCisJMHg3OSwgMHgyYywgMHgwNywgMHhjYSwgMHhhMywgMHg0ZSwgMHgyYSwgMHgwYywgMHgyNCwgMHhlNiwgMHgyNywgMHg5MCwKKwkweGZmLCAweDgwLCAweGZlLCAweDAwLCAweGY5LCAweDExLCAweDk4LCAweDlmLCAweDljLCAweDgxLCAweDcyLCAweGEwLAorCTB4MzUsIDB4NTMsIDB4Y2QsIDB4NmIsIDB4NDAsIDB4ZmEsIDB4NDAsIDB4NjEsIDB4MDgsIDB4MmEsIDB4NTMsIDB4NDEsCisJMHg2MywgMHgxZCwgMHg0MCwgMHhmNiwgMHgxMiwgMHgyMSwgMHg2OCwgMHhkOCwgMHgwMSwgMHg2OSwgMHgyMCwgMHhiYiwKKwkweDc5LCAweDhhLCAweDA4LCAweDk4LCAweDlmLCAweDE0LCAweDIwLCAweGM0LCAweGQwLCAweDAwLCAweGNmLCAweDRmLAorCTB4ZWMsIDB4NDAsIDB4OTcsIDB4YzIsIDB4ZGMsIDB4ZjQsIDB4ZmYsIDB4ZmYsIDB4MzEsIDB4MTUsIDB4MTYsIDB4NjAsCisJMHhkYSwgMHgwMywgMHhhZCwgMHhmOSwgMHhmYywgMHhmZCwgMHhmZiwgMHg4MCwgMHgwOCwgMHgwYiwgMHg0MywgMHgwYiwKKwkweDdjLCAweGVkLCAweDllLCAweGIwLCAweDNjLCAweGE4LCAweDljLCAweDViLCAweDAwLCAweDY0LCAweGI1LCAweGMxLAorCTB4ZWIsIDB4NmQsIDB4MTYsIDB4ZjAsIDB4N2QsIDB4YzQsIDB4MGIsIDB4MTgsIDB4N2UsIDB4MDEsIDB4Y2IsIDB4OTUsCisJMHhmZiwgMHhmZiwgMHg5NywgMHhjMiwgMHhkNSwgMHg4MiwgMHgwMCwgMHgwMCwgMHhkNCwgMHhjMiwgMHhjYiwgMHg0MiwKKwkweDYwLCAweDdjLCAweDAwLCAweDAwLCAweDAwIH07CitzdGF0aWMgdTMyIGJueDJfQ09NX2IwOUZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Oworc3RhdGljIHUzMiBibngyX0NPTV9iMDlGd1JvZGF0YVsoMHg4OC80KSArIDFdID0geworCTB4MDgwMDFhZDgsIDB4MDgwMDFiMTQsIDB4MDgwMDFiMTQsIDB4MDgwMDFiMTQsIDB4MDgwMDFiMTQsIDB4MDgwMDFiMTQsCisJMHgwODAwMWEyNCwgMHgwODAwMWIxNCwgMHgwODAwMWE5OCwgMHgwODAwMWIxNCwgMHgwODAwMTlhYywgMHgwODAwMWIxNCwKKwkweDA4MDAxYjE0LCAweDA4MDAxYjE0LCAweDA4MDAxOWI4LCAweDAsIDB4MDgwMDJhMmMsIDB4MDgwMDJhN2MsCisJMHgwODAwMmFhYywgMHgwODAwMmFkYywgMHgwODAwMmIwYywgMHgwLCAweDA4MDA1ZmFjLCAweDA4MDA1ZmFjLAorCTB4MDgwMDVmYWMsIDB4MDgwMDVmYWMsIDB4MDgwMDVmYWMsIDB4MDgwMDVmZDgsIDB4MDgwMDVmZDgsIDB4MDgwMDYwMTgsCisJMHgwODAwNjAyNCwgMHgwODAwNjAyNCwgMHgwODAwNWZhYywgMHgwLCAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9DT01fYjA5RndCc3NbKDB4ODgvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfQ09NX2IwOUZ3U2Jzc1soMHg1Yy80KSArIDFdID0geyAweDAgfTsKKworc3RhdGljIHN0cnVjdCBmd19pbmZvIGJueDJfY29tX2Z3XzA5ID0geworCS52ZXJfbWFqb3IJCQk9IDB4MSwKKwkudmVyX21pbm9yCQkJPSAweDAsCisJLnZlcl9maXgJCQk9IDB4MCwKKworCS5zdGFydF9hZGRyCQkJPSAweDA4MDAwMGIwLAorCisJLnRleHRfYWRkcgkJCT0gMHgwODAwMDAwMCwKKwkudGV4dF9sZW4JCQk9IDB4N2M1YywKKwkudGV4dF9pbmRleAkJCT0gMHgwLAorCS5nel90ZXh0CQkJPSBibngyX0NPTV9iMDlGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9DT01fYjA5RndUZXh0KSwKKworCS5kYXRhX2FkZHIJCQk9IDB4MDgwMDdkMDAsCisJLmRhdGFfbGVuCQkJPSAweDAsCisJLmRhdGFfaW5kZXgJCQk9IDB4MCwKKwkuZGF0YQkJCQk9IGJueDJfQ09NX2IwOUZ3RGF0YSwKKworCS5zYnNzX2FkZHIJCQk9IDB4MDgwMDdkMDAsCisJLnNic3NfbGVuCQkJPSAweDVjLAorCS5zYnNzX2luZGV4CQkJPSAweDAsCisJLnNic3MJCQkJPSBibngyX0NPTV9iMDlGd1Nic3MsCisKKwkuYnNzX2FkZHIJCQk9IDB4MDgwMDdkNjAsCisJLmJzc19sZW4JCQk9IDB4ODgsCisJLmJzc19pbmRleAkJCT0gMHgwLAorCS5ic3MJCQkJPSBibngyX0NPTV9iMDlGd0JzcywKKworCS5yb2RhdGFfYWRkcgkJCT0gMHgwODAwN2M2MCwKKwkucm9kYXRhX2xlbgkJCT0gMHg4OCwKKwkucm9kYXRhX2luZGV4CQkJPSAweDAsCisJLnJvZGF0YQkJCQk9IGJueDJfQ09NX2IwOUZ3Um9kYXRhLAorfTsKKworc3RhdGljIHU4IGJueDJfQ1BfYjA5RndUZXh0W10gPSB7CisJMHgxZiwgMHg4YiwgMHgwOCwgMHgwOCwgMHg4ZSwgMHhmYywgMHgyZiwgMHg0NSwgMHgwMCwgMHgwMywgMHg3NCwgMHg2NSwKKwkweDczLCAweDc0LCAweDMxLCAweDJlLCAweDYyLCAweDY5LCAweDZlLCAweDAwLCAweGJkLCAweDdkLCAweDBkLCAweDc0LAorCTB4NWMsIDB4NTcsIDB4N2QsIDB4ZTcsIDB4ZmYsIDB4ZGQsIDB4NzksIDB4OTIsIDB4YzYsIDB4YjIsIDB4MmMsIDB4M2YsCisJMHhjYiwgMHg2MywgMHg2NSwgMHgyMiwgMHgwYiwgMHg3YiwgMHg0NiwgMHg3YSwgMHhiMiwgMHg5NSwgMHg1OCwgMHg2NCwKKwkweGM3LCAweGFlLCAweDAwLCAweDZkLCAweDNiLCAweDg1LCAweGU5LCAweDQ4LCAweGIyLCAweDlkLCAweDBmLCAweDhhLAorCTB4NGMsIDB4NDQsIDB4NGYsIDB4NWEsIDB4ZTgsIDB4MjIsIDB4YzYsIDB4NzYsIDB4NDgsIDB4ODAsIDB4YjIsIDB4NGUsCisJMHgwOSwgMHg2OSwgMHg4MCwgMHgwNCwgMHgwZiwgMHgyMywgMHhmOSwgMHg4MywgMHg3NCwgMHhlYywgMHg1MSwgMHgxMiwKKwkweGM1LCAweDc2LCAweDRmLCAweDczLCAweDU4LCAweDU1LCAweDkyLCAweDFkLCAweDQzLCAweGE3LCAweDFlLCAweDI3LAorCTB4NzEsIDB4NjgsIDB4ZjYsIDB4NmMsIDB4NjgsIDB4YjQsIDB4NGEsIDB4ZTIsIDB4YTYsIDB4M2QsIDB4ZDksIDB4ZDYsCisJMHhmNCwgMHg4NCwgMHg2ZSwgMHhkYSwgMHg0MywgMHg3NywgMHg4NSwgMHg3MSwgMHg4OCwgMHg0YiwgMHhiMywgMHg0YiwKKwkweGY4LCAweDY4LCAweDYxLCAweGExLCAweGU1LCAweGVkLCAweGVmLCAweDc3LCAweGVmLCAweDdkLCAweGQyLCAweGU4LAorCTB4YzMsIDB4MDksIDB4YTEsIDB4YmIsIDB4ZjUsIDB4MzksIDB4Y2YsIDB4NmYsIDB4ZGUsIDB4ZmQsIDB4ZmMsIDB4ZGYsCisJMHhmZiwgMHhmZCwgMHg3ZiwgMHhkZiwgMHgwZiwgMHhhZCwgMHgxNywgMHhhOSwgMHgxNywgMHhmYiwgMHg2ZiwgMHgxNSwKKwkweDllLCAweDZkLCAweDg5LCAweDdkLCAweGJiLCAweGI3LCAweDVlLCAweGQ3LCAweDczLCAweDFkLCAweDdlLCAweDZlLAorCTB4NzUsIDB4NTcsIDB4NDYsIDB4OTUsIDB4YmMsIDB4ODksIDB4N2YsIDB4ODksIDB4OWYsIDB4YTEsIDB4NGMsIDB4NDQsCisJMHhjNCwgMHgwYiwgMHhmYiwgMHhlMiwgMHgyMywgMHg1MSwgMHg5NSwgMHgxZSwgMHhmYywgMHg2NCwgMHhkNiwgMHg5NywKKwkweDY4LCAweDI0LCAweDdkLCAweGY2LCAweGIzLCAweGJiLCAweDdkLCAweDkxLCAweDRjLCAweDc5LCAweDRiLCAweGEyLAorCTB4NTcsIDB4ZmUsIDB4MjUsIDB4YzgsIDB4YzcsIDB4NWMsIDB4NjEsIDB4ZmEsIDB4NWIsIDB4ZDIsIDB4ZmYsIDB4ZmMsCisJMHg5ZiwgMHhiZSwgMHhmMiwgMHg4ZSwgMHhlNCwgMHg2YiwgMHhlMywgMHgxMSwgMHg4OSwgMHg3YSwgMHhlOSwgMHg4ZiwKKwkweDg5LCAweGI3LCAweDQ5LCAweGEyLCAweGFkLCAweGU5LCAweDgxLCAweDRmLCAweDNlLCAweGJjLCAweGY5LCAweDZmLAorCTB4NDQsIDB4MWEsIDB4YzMsIDB4YjYsIDB4MmUsIDB4MDcsIDB4NWYsIDB4ZDksIDB4MmMsIDB4ZjksIDB4OTYsIDB4NzQsCisJMHg3YywgMHhjOCwgMHg0ZCwgMHg3YiwgMHhmMiwgMHg3NCwgMHg0NSwgMHgwNiwgMHgwYSwgMHhjNSwgMHhhOCwgMHg0NCwKKwkweGQyLCAweDFkLCAweDJmLCAweGY1LCAweDQ2LCAweGY2LCAweDA3LCAweDExLCAweGRmLCAweGY3LCAweDdhLCAweGE1LAorCTB4YTEsIDB4MjcsIDB4ZGIsIDB4OGQsIDB4ZjQsIDB4ZjIsIDB4NTYsIDB4NTEsIDB4N2UsIDB4NTQsIDB4YjIsIDB4MTUsCisJMHg2OSwgMHg1MCwgMHhiZSwgMHg4ZiwgMHg3NywgMHhiZCwgMHhhOCwgMHg3NCwgMHhkMiwgMHhjYiwgMHg0NiwgMHg1YywKKwkweDI5LCAweDU0LCAweDJlLCAweGFjLCAweDMwLCAweDZkLCAweDk2LCAweGVjLCAweGZiLCAweDZmLCAweGEyLCAweGU2LAorCTB4OGQsIDB4MzYsIDB4NGIsIDB4NTEsIDB4OTksIDB4OGQsIDB4YzQsIDB4MDUsIDB4ZmQsIDB4MDAsIDB4ZTYsIDB4MDYsCisJMHgxOSwgMHgyZSwgMHgyNSwgMHgyNCwgMHg1YiwgMHg2NCwgMHhiZiwgMHhhZSwgMHhlNCwgMHgzYywgMHhmNiwgMHhkOSwKKwkweDgwLCAweGZhLCAweDJiLCAweDlkLCAweGU1LCAweGNiLCAweGIzLCAweGVjLCAweDRiLCAweDI4LCAweDliLCAweDQwLAorCTB4YjksIDB4NTYsIDB4NzksIDB4YmMsIDB4MTIsIDB4OTcsIDB4YzcsIDB4MmEsIDB4MzEsIDB4NzksIDB4YjQsIDB4NzIsCisJMHg4NywgMHg2NCwgMHg1MCwgMHhmNywgMHg2YywgMHgwNSwgMHg3ZCwgMHg5NywgMHg2YSwgMHhhNSwgMHg3NywgMHhhYywKKwkweDVlLCAweGIyLCAweDYzLCAweGVkLCAweGYxLCAweDljLCAweDA0LCAweGMxLCAweDI3LCAweDUyLCAweDFmLCAweDk1LAorCTB4YTEsIDB4MjYsIDB4OTQsIDB4MmYsIDB4MzEsIDB4MmYsIDB4YmUsIDB4MjAsIDB4MmYsIDB4OTcsIDB4ZGEsIDB4ZTIsCisJMHhlNSwgMHg5NCwgMHgyMywgMHg5OSwgMHhjMSwgMHg2NCwgMHg3YywgMHg0OCwgMHhmMSwgMHhiYiwgMHg0NiwgMHhiMiwKKwkweDVkLCAweGY4LCAweDFlLCAweDcwLCAweDI1LCAweGUyLCAweDA3LCAweGMxLCAweDFkLCAweGE5LCAweDI2LCAweGMwLAorCTB4OTEsIDB4NGMsIDB4MjQsIDB4MTQsIDB4ZWIsIDB4YjIsIDB4NWUsIDB4MzIsIDB4OWYsIDB4NTAsIDB4NTEsIDB4YzksCisJMHg1NywgMHhhZSwgMHg5MywgMHg0NCwgMHg1MywgMHgxMCwgMHhiYywgMHgzNywgMHhlNSwgMHgyMSwgMHg1ZCwgMHhhNCwKKwkweGI3LCAweDI4LCAweGZiLCAweDU0LCAweGRhLCAweDQ3LCAweDliLCAweDkyLCAweDUyLCAweGU5LCAweGI1LCAweDE4LAorCTB4YzcsIDB4MTYsIDB4ZTAsIDB4YTksIDB4NTYsIDB4MzIsIDB4MzEsIDB4YzksIDB4YTgsIDB4YjQsIDB4MjQsIDB4NTQsCisJMHg3YSwgMHgwNSwgMHhkMiwgMHgxYywgMHhhOSwgMHhmMSwgMHhhNywgMHgyYywgMHg5ZCwgMHhhYywgMHhjNiwgMHhiNywKKwkweDBjLCAweGE4LCAweDc0LCAweGQzLCAweGEyLCAweGY0LCAweDY0LCAweDQyLCAweGQ0LCAweDhmLCAweGVhLCAweGQwLAorCTB4NjcsIDB4NjcsIDB4NDYsIDB4MzEsIDB4MGQsIDB4NmYsIDB4OWQsIDB4NzYsIDB4ZmQsIDB4MzIsIDB4NjksIDB4MWYsCisJMHg3NCwgMHgxNiwgMHhhNiwgMHgzZCwgMHhiNSwgMHg4YSwgMHhiMCwgMHg4YSwgMHhlMiwgMHhlZiwgMHgyOCwgMHhlMCwKKwkweDZhLCAweDQxLCAweGZmLCAweGVkLCAweDVlLCAweDBkLCAweGM2LCAweDM1LCAweDkwLCAweDRhLCAweDdhLCAweGZkLAorCTB4ZWEsIDB4YzUsIDB4NDAsIDB4OWEsIDB4MDksIDB4MzMsIDB4ZjMsIDB4MTQsIDB4ZjIsIDB4NTAsIDB4MzQsIDB4OWQsCisJMHhjMiwgMHhiYywgMHhiOSwgMHg3MiwgMHgwOCwgMHg2MywgMHhiYiwgMHgzOCwgMHg5NiwgMHhmNCwgMHhkYSwgMHgxNCwKKwkweGRlLCAweDUzLCAweGZjLCAweGRkLCAweDM0LCAweDE0LCAweDQ5LCAweDA3LCAweDQxLCAweDM2LCAweDM1LCAweDJlLAorCTB4YjksIDB4NzIsIDB4ZDIsIDB4OWIsIDB4MDUsIDB4NzAsIDB4YmQsIDB4NjMsIDB4NzEsIDB4OGMsIDB4MWYsIDB4ZTMsCisJMHg4OCwgMHg2NSwgMHg5MiwgMHg2YiwgMHhhNCwgMHhjYiwgMHhjZSwgMHhjZiwgMHg1ZiwgMHhhMiwgMHhlZiwgMHg3NiwKKwkweGVmLCAweDBlLCAweGQ1LCAweGVlLCAweGE1LCAweDU0LCAweGQyLCAweDliLCAweDkwLCAweDNmLCAweGM0LCAweDc3LAorCTB4MTAsIDB4ZWMsIDB4NGEsIDB4MjUsIDB4ZTMsIDB4NzksIDB4Y2MsIDB4ZGQsIDB4YTUsIDB4NjIsIDB4NGMsIDB4NWUsCisJMHgyZSwgMHgyNiwgMHg0MSwgMHhhOSwgMHhjOSwgMHhjZSwgMHg0OSwgMHhkOSwgMHg5MiwgMHg5YSwgMHgwNCwgMHhkYywKKwkweDA1LCAweDNjLCAweDA3LCAweDk5LCAweDU3LCAweDQ2LCAweDVlLCAweDk5LCAweDc1LCAweDgzLCAweGUwLCAweGU2LAorCTB4ZDQsIDB4ODksIDB4NjAsIDB4YTgsIDB4ZDksIDB4ZDAsIDB4ZmUsIDB4ZDMsIDB4MjUsIDB4Y2MsIDB4MmIsIDB4ZTYsCisJMHhlOSwgMHhiMSwgMHgxMiwgMHhlNiwgMHhiNSwgMHg4NCwgMHgzOSwgMHhkNSwgMHhmMywgMHhkZiwgMHg4OSwgMHhmOSwKKwkweDI3LCAweDhkLCAweDkwLCAweDNlLCAweGI2LCAweDU5LCAweDdhLCAweDdkLCAweGI3LCAweDdkLCAweDhiLCAweDY0LAorCTB4NGIsIDB4OGUsIDB4NjQsIDB4NTMsIDB4M2YsIDB4MDksIDB4MzIsIDB4OWEsIDB4MjcsIDB4YzQsIDB4ZTksIDB4MmQsCisJMHg5MSwgMHgyNiwgMHg2YiwgMHgwMCwgMHgyYiwgMHgzZiwgMHg3ZiwgMHhkZCwgMHg5NiwgMHg4YiwgMHgzYSwgMHgxOCwKKwkweDA2LCAweGU3LCAweDgzLCAweGY5LCAweDUxLCAweGU1LCAweGQ3LCAweGQ5LCAweGZjLCAweDkwLCAweGY2LCAweGY5LAorCTB4MGYsIDB4NzQsIDB4ZTcsIDB4Y2YsIDB4OTcsIDB4Y2IsIDB4OTIsIDB4MzYsIDB4MmIsIDB4MjIsIDB4YjksIDB4MDcsCisJMHgwMywgMHhlOSwgMHg0ZCwgMHgwMSwgMHg1ZiwgMHg2YywgMHhkMywgMHg0YiwgMHg4OSwgMHhhZSwgMHhlYiwgMHhiMSwKKwkweDhjLCAweDJlLCAweDhiLCAweDdmLCAweDNmLCAweGFlLCAweDQxLCAweDFmLCAweDRlLCAweDVmLCAweDY5LCAweGJlLAorCTB4NmUsIDB4NWYsIDB4ZTksIDB4ODUsIDB4OTgsIDB4ODUsIDB4MGYsIDB4ZGYsIDB4M2QsIDB4NGUsIDB4YjYsIDB4ZjIsCisJMHg3NywgMHg3NiwgMHg4ZSwgMHhjMywgMHg3MSwgMHg3NCwgMHgyZCwgMHg0MywgMHhlMywgMHgyZSwgMHhmOCwgMHhjMSwKKwkweDkzLCAweDVjLCAweGIxLCAweDA3LCAweGZkLCAweGM2LCAweGYwLCAweDBlLCAweDgyLCAweDkxLCAweDU0LCAweDI2LAorCTB4ZTksIDB4NGEsIDB4MWEsIDB4ZGYsIDB4MDMsIDB4OTgsIDB4YWYsIDB4MGUsIDB4ZTAsIDB4NGYsIDB4ZGMsIDB4ZWMsCisJMHhlNiwgMHg5NCwgMHhmNCwgMHg1NSwgMHg0MCwgMHg3YiwgMHg5NSwgMHgzNywgMHg5NiwgMHgxNCwgMHg3YSwgMHgwYywKKwkweGE5LCAweDdmLCAweGIxLCAweGI4LCAweDYxLCAweDNmLCAweDdjLCAweGJiLCAweDMyLCAweDAyLCAweGZhLCAweDI4LAorCTB4OGMsIDB4ZjksIDB4MzIsIDB4NWMsIDB4OWMsIDB4ZjYsIDB4OTQsIDB4MjQsIDB4NDEsIDB4YmIsIDB4NjksIDB4ZTksCisJMHhhZCwgMHhmOCwgMHg1MiwgMHgyOCwgMHhlMiwgMHg1ZCwgMHg2YSwgMHgwNywgMHhmZCwgMHhiYSwgMHg5MiwgMHg4OSwKKwkweDliLCAweDM5LCAweDI5LCAweDE0LCAweDdmLCAweDA5LCAweGUzLCAweDAyLCAweDhlLCAweDdkLCAweGZlLCAweGVlLAorCTB4YjEsIDB4YjAsIDB4ODAsIDB4ZjcsIDB4YmIsIDB4NTMsIDB4MWEsIDB4M2YsIDB4NmYsIDB4MGUsIDB4MDYsIDB4ZjYsCisJMHg4ZCwgMHgzMSwgMHg2MCwgMHg5YywgMHg4NSwgMHhiMiwgMHg4YiwgMHg3NywgMHgwYywgMHhlZiwgMHg5MCwgMHgxNiwKKwkweGUzLCAweDgwLCAweGE5LCAweDU1LCAweDg2LCAweDQxLCAweDhiLCAweGJkLCAweDgyLCAweGRmLCAweDUzLCAweDg0LAorCTB4OTEsIDB4ZmQsIDB4YjYsIDB4ZTgsIDB4ZGYsIDB4YzMsIDB4NjMsIDB4MWIsIDB4ZjQsIDB4NzcsIDB4NmUsIDB4YTAsCisJMHg0NSwgMHhmMiwgMHg1MywgMHhlMSwgMHg1OCwgMHgyOCwgMHgwZiwgMHgyOCwgMHgwMywgMHg5MiwgMHg4NywgMHg0NSwKKwkweDI4LCAweDEzLCAweDgyLCAweGUwLCAweGMxLCAweDE0LCAweGU1LCAweDQyLCAweDEwLCAweDNjLCAweDk2LCAweGEyLAorCTB4OWMsIDB4MzgsIDB4MDcsIDB4ZmUsIDB4YTcsIDB4NmMsIDB4MjAsIDB4YWYsIDB4YWUsIDB4NTUsIDB4OWMsIDB4ODMsCisJMHg2YywgMHgxMSwgMHg3ZCwgMHg0MCwgMHg0ZSwgMHhlNCwgMHhiYSwgMHg0ZSwgMHg0MCwgMHg2ZSwgMHg1MCwgMHhhZSwKKwkweDVjLCAweGY4LCAweDQ0LCAweGQ2LCAweGNmLCAweGM3LCAweDIzLCAweDFhLCAweDBmLCAweDk4LCAweDZmLCAweGM4LAorCTB4YmMsIDB4OGMsIDB4ODYsIDB4YmMsIDB4NGQsIDB4MGEsIDB4NWQsIDB4YTMsIDB4YjYsIDB4Y2MsIDB4NjUsIDB4NWQsCisJMHhjNiwgMHg1ZCwgMHg1MiwgMHhlNiwgMHg3NiwgMHg2NSwgMHhmOCwgMHhhZSwgMHgxNSwgMHhmMywgMHhiMSwgMHg0MiwKKwkweDExLCAweDRmLCAweDZkLCAweDliLCAweGY4LCAweDJkLCAweGQxLCAweDlhLCAweGY0LCAweDk3LCAweDkwLCAweDM3LAorCTB4N2QsIDB4ZDcsIDB4NDksIDB4N2YsIDB4YjksIDB4YmMsIDB4NTksIDB4NzcsIDB4NjksIDB4ZGUsIDB4ODgsIDB4YjgsCisJMHg3ZSwgMHhiMiwgMHg3MywgMHg5NywgMHg5YSwgMHgwMSwgMHgzZCwgMHgwNSwgMHhjMSwgMHhjOSwgMHg1NCwgMHg5OCwKKwkweGZlLCAweDhmLCAweGVlLCAweGQyLCAweDNlLCAweDEyLCAweDM1LCAweDRiLCAweGQzLCAweGVlLCAweDVkLCAweDI2LAorCTB4ZWQsIDB4YzQsIDB4MzIsIDB4NjksIDB4MWIsIDB4NmEsIDB4OTcsIDB4YTYsIDB4YmQsIDB4N2YsIDB4OTksIDB4YjQsCisJMHhmYiwgMHg5NywgMHg0OSwgMHhmYiwgMHg1ZiwgMHhjYiwgMHhhNCwgMHg3ZCwgMHg2NywgMHg5OSwgMHhiNCwgMHhlZiwKKwkweDJkLCAweDkzLCAweGQ2LCAweDUyLCAweGI3LCAweDM0LCAweGNkLCAweDA1LCAweDNmLCAweDZkLCAweDkyLCAweDQyLAorCTB4ZWMsIDB4NzMsIDB4MWMsIDB4YmIsIDB4YzUsIDB4Y2QsIDB4ZmUsIDB4YzgsIDB4NTIsIDB4ZGMsIDB4ZDQsIDB4YTAsCisJMHg1YywgMHhlYiwgMHhhMiwgMHg3MiwgMHg1MywgMHhjYiwgMHg5NCwgMHhhYiwgMHg0NSwgMHhiOSwgMHhhNiwgMHg0NSwKKwkweGU1LCAweDkyLCAweGNiLCAweGUwLCAweGJhLCAweDRlLCAweGViLCAweGFmLCAweDg1LCAweGU1LCAweDBhLCAweGNiLAorCTB4OTQsIDB4NjMsIDB4ZmEsIDB4MWUsIDB4ZGIsIDB4Y2YsIDB4MTYsIDB4NjgsIDB4OTksIDB4ZDcsIDB4OWIsIDB4YWYsCisJMHg1YSwgMHg5MSwgMHg2NiwgMHhhNiwgMHhiNywgMHg0MiwgMHg0NywgMHhhYywgMHg1MCwgMHg4NiwgMHhkZiwgMHgyOSwKKwkweDViLCAweDk4LCAweGU2LCAweDgxLCAweGVlLCAweGEzLCAweGEwLCAweDNiLCAweGNhLCAweDQ3LCAweGYwLCAweDkxLAorCTB4NGYsIDB4ZmUsIDB4NWQsIDB4MjUsIDB4NDMsIDB4YjEsIDB4MmQsIDB4ZGUsIDB4MmYsIDB4YTgsIDB4MDYsIDB4ZDAsCisJMHg1OCwgMHhkMiwgMHg0YiwgMHgyOCwgMHhmMiwgMHg5NywgMHhlNCwgMHgyMywgMHg2OSwgMHgzZiwgMHhkZiwgMHgyYiwKKwkweDJhLCAweGE2LCAweDI0LCAweDkwLCAweGJlLCAweDk0LCAweDZhLCAweDUyLCAweGIyLCAweDFmLCAweGZjLCAweDkzLAorCTB4ODEsIDB4NGUsIDB4ZGEsIDB4MTUsIDB4ZjQsIDB4NmEsIDB4MWUsIDB4MzIsIDB4NjUsIDB4YWYsIDB4MmMsIDB4MmIsCisJMHg3ZCwgMHgzOSwgMHg0OCwgMHgxOSwgMHg5NywgMHhjZSwgMHhkYywgMHg5NSwgMHhmNSwgMHhhNywgMHg3YiwgMHg2YSwKKwkweDQxLCAweGIzLCAweDE3LCAweDUxLCAweDY3LCAweDA3LCAweDZhLCAweGVlLCAweDJkLCAweGJiLCAweGQyLCAweDU3LAorCTB4ZWUsIDB4MDQsIDB4MmYsIDB4MzgsIDB4NzIsIDB4ZGUsIDB4NWYsIDB4MmQsIDB4ZTcsIDB4NTMsIDB4MjgsIDB4NWIsCisJMHg4OSwgMHhjOCwgMHg0YywgMHhjYywgMHg5MSwgMHgxOSwgMHg3YywgMHg2NywgMHg1MywgMHhjOCwgMHhhYiwgMHg4NCwKKwkweGJjLCAweGQ1LCAweDI5LCAweDA3LCAweDRhLCAweGJlLCAweDFjLCAweDJlLCAweGZkLCAweDkyLCAweDBhLCAweGY1LAorCTB4NTYsIDB4N2YsIDB4NmEsIDB4YTUsIDB4OWMsIDB4ZjYsIDB4NGMsIDB4ZGIsIDB4M2IsIDB4ZmMsIDB4NjksIDB4NjgsCisJMHg0YywgMHg1NywgMHgyZSwgMHhmYSwgMHhjOSwgMHhmOCwgMHg4YywgMHhlNiwgMHg4OSwgMHgxZiwgMHgwNiwgMHg3ZCwKKwkweDY4LCAweDY3LCAweGMyLCAweDRmLCAweDdhLCAweDdmLCAweDhhLCAweGVmLCAweGExLCAweDMyLCAweGVkLCAweDkwLAorCTB4ZjksIDB4YjYsIDB4ODYsIDB4ZDEsIDB4ZDYsIDB4YTEsIDB4ZDIsIDB4MmEsIDB4ZjksIDB4YjAsIDB4YWQsIDB4YmYsCisJMHhkZCwgMHg5ZiwgMHhlZSwgMHgwNCwgMHhjZiwgMHg3OSwgMHhhNywgMHgyOCwgMHgyMywgMHg4YSwgMHg4MCwgMHg2YiwKKwkweDEwLCAweGJjLCAweDhkLCAweGJhLCAweGNmLCAweDY5LCAweDM5LCAweDA1LCAweGJiLCAweGE1LCAweGI4LCAweDFhLAorCTB4NzIsIDB4ZjcsIDB4MWYsIDB4ODMsIDB4MGYsIDB4YzcsIDB4NTgsIDB4OWUsIDB4NjksIDB4ZDQsIDB4MjUsIDB4MzIsCisJMHhhYSwgMHhkMiwgMHg5MCwgMHgwOSwgMHhkZCwgMHg5NCwgMHg4NSwgMHgwOSwgMHhjOCwgMHg0MSwgMHhjOCwgMHg5NiwKKwkweGQyLCAweDRmLCAweDgzLCAweDhjLCAweDViLCAweDJkLCAweGRmLCAweDI0LCAweDNmLCAweDVmLCAweDg2LCAweDY5LAorCTB4MDksIDB4MjMsIDB4MmYsIDB4NGIsIDB4YjMsIDB4NzMsIDB4YjIsIDB4MjIsIDB4MGYsIDB4ZjksIDB4ZjIsIDB4NzQsCisJMHg4NSwgMHg3MiwgMHhlMSwgMHg3YSwgMHhmMCwgMHg2OCwgMHhhYiwgMHhmNCwgMHgxNSwgMHg5MywgMHhmOSwgMHg4YywKKwkweDZjLCAweGMyLCAweGZjLCAweDdkLCAweDFlLCAweDczLCAweGVhLCAweGUyLCAweGI5LCAweGFmLCAweDVlLCAweDFhLAorCTB4NTMsIDB4ZDAsIDB4Y2QsIDB4NGMsIDB4NDcsIDB4YTMsIDB4Y2QsIDB4NTEsIDB4YzgsIDB4YTgsIDB4ZGYsIDB4MDMsCisJMHgxZSwgMHg4NiwgMHgzOSwgMHhlNywgMHhmMSwgMHg2YywgMHhjNCwgMHgxOSwgMHhhMCwgMHgzZCwgMHgzMiwgMHg0MCwKKwkweGZkLCAweDUwLCAweDY2LCAweGRiLCAweDg0LCAweDM3LCAweDZlLCAweDdmLCAweDQ3LCAweGI1LCAweDhjLCAweDMxLAorCTB4YmYsIDB4MWIsIDB4ZjAsIDB4M2IsIDB4NjEsIDB4N2YsIDB4N2IsIDB4ZjgsIDB4ZWQsIDB4ZGIsIDB4ZGYsIDB4MzEsCisJMHhmYywgMHhlZSwgMHhiNCwgMHhiZiwgMHhhMSwgMHg1YiwgMHg4YiwgMHg1ZCwgMHhmYSwgMHhmNywgMHg0OCwgMHg2OSwKKwkweGZiLCAweDc2LCAweGU1LCAweDVmLCAweDI3LCAweGI5LCAweGE5LCAweDU2LCAweDM5LCAweDUwLCAweGY0LCAweGFkLAorCTB4NmMsIDB4YzEsIDB4MjMsIDB4NGYsIDB4M2EsIDB4NjYsIDB4OWMsIDB4ODAsIDB4OWIsIDB4YjIsIDB4YjMsIDB4OTQsCisJMHg3NywgMHgwNiwgMHgwOCwgMHgzZiwgMHg2OCwgMHhhMCwgMHhiNywgMHhiOCwgMHhjNSwgMHg1YiwgMHgyMywgMHhhNCwKKwkweDgxLCAweDExLCAweGE3LCAweGI3LCAweGUyLCAweDY0LCAweDYwLCAweGFmLCAweGM1LCAweDg3LCAweGU1LCAweDMwLAorCTB4N2UsIDB4OGIsIDB4MTcsIDB4NDksIDB4M2YsIDB4ODksIDB4YjcsIDB4YzEsIDB4MDEsIDB4ZjUsIDB4Y2UsIDB4NzAsCisJMHg4OSwgMHhmMiwgMHhkMiwgMHhjNywgMHhkOCwgMHgxMywgMHg3MiwgMHg2ZSwgMHg4MSwgMHgwZCwgMHg0NSwgMHg1YywKKwkweDI4LCAweGM5LCAweDhkLCAweDI1LCAweDRmLCAweGU0LCAweDI1LCAweDk5LCAweDFmLCAweDA3LCAweDQzLCAweGVjLAorCTB4NGEsIDB4YjksIDB4ZjIsIDB4ZGUsIDB4MTQsIDB4NjgsIDB4ZjcsIDB4M2EsIDB4NDcsIDB4YjYsIDB4NWYsIDB4ZTcsCisJMHhjMiwgMHhlNiwgMHhmMSwgMHhjNywgMHhiNywgMHg4MywgMHhmZSwgMHgzMSwgMHhjZiwgMHg5YSwgMHgxZSwgMHhkNCwKKwkweDE5LCAweDgxLCAweDlkLCAweDA4LCAweDZjLCAweDlmLCAweGU5LCAweGVhLCAweDFiLCAweDJlLCAweGU2LCAweDNlLAorCTB4YTYsIDB4ZDIsIDB4ZmIsIDB4M2UsIDB4OTUsIDB4ZWQsIDB4YmUsIDB4NDYsIDB4NzIsIDB4ODMsIDB4MGEsIDB4MzgsCisJMHg2YSwgMHgxZSwgMHg4MiwgMHgxZSwgMHhjNCwgMHhiOCwgMHg4MiwgMHgwMCwgMHhmNCwgMHgwYywgMHg3OSwgMHg3ZSwKKwkweGYzLCAweGNkLCAweDkxLCAweDc0LCAweDhkLCAweGY0LCAweDBlLCAweDM2LCAweGEzLCAweDBlLCAweGYzLCAweDg4LAorCTB4YWYsIDB4YWYsIDB4YTIsIDB4OWQsIDB4NjQsIDB4YTIsIDB4NGYsIDB4ZTQsIDB4OWUsIDB4OTEsIDB4ZWUsIDB4NTksCisJMHg2NywgMHg3OCwgMHhmNCwgMHgzNywgMHhjMCwgMHg5MywgMHg1YiwgMHg1MSwgMHhmZiwgMHgwMSwgMHhkNCwgMHg3ZiwKKwkweGNkLCAweDI5LCAweDhjLCAweGZkLCAweGM4LCAweDE5LCAweDFlLCAweGZiLCAweDllLCAweDMzLCAweDMyLCAweGI2LAorCTB4NjEsIDB4NDMsIDB4N2YsIDB4Y2YsIDB4ODYsIDB4MGQsIDB4YmIsIDB4N2IsIDB4NWMsIDB4OTksIDB4MDAsIDB4OGYsCisJMHg2NSwgMHhiYywgMHgwZCwgMHgxYiwgMHg0NiwgMHg3YSwgMHhiYSwgMHg4MCwgMHg4MywgMHgyZCwgMHg1ZSwgMHg5ZiwKKwkweGY4LCAweGRlLCAweDc2LCAweDAxLCAweGZmLCAweGM0LCAweGQ4LCAweDY3LCAweDE0LCAweGY5LCAweDQ5LCAweGU0LAorCTB4YjMsIDB4N2UsIDB4NWMsIDB4ZTcsIDB4ZjcsIDB4Y2EsIDB4OTYsIDB4NzgsIDB4OTMsIDB4YjAsIDB4ZmYsIDB4ODgsCisJMHgyZCwgMHg1MywgMHgxMywgMHg5MSwgMHhmYSwgMHgwNywgMHhlYywgMHhmYywgMHg2NiwgMHg5YywgMHgxYSwgMHg5ZiwKKwkweGU5LCAweDFjLCAweDBiLCAweGQzLCAweDM5LCAweGI3LCAweDdmLCAweDY3LCAweDZkLCAweGQ1LCAweGQ1LCAweDQ4LAorCTB4ZTcsIDB4MzcsIDB4NzEsIDB4NDYsIDB4YmMsIDB4ZDAsIDB4YzYsIDB4YTgsIDB4ZDEsIDB4YjYsIDB4NjEsIDB4YWUsCisJMHg0OCwgMHg5YSwgMHg3MSwgMHg2NSwgMHg0ZiwgMHhkMSwgMHg0MSwgMHgxZCwgMHhkMCwgMHhjNSwgMHgxOSwgMHhmYiwKKwkweDFjLCAweDA1LCAweDZjLCAweDgzLCAweDY4LCAweGViLCAweGU4LCAweDIxLCAweGQ0LCAweGEzLCAweGNjLCAweDQ4LAorCTB4NzYsIDB4OGEsIDB4ZmEsIDB4MDAsIDB4Y2EsIDB4NmMsIDB4ZjEsIDB4ZDYsIDB4MGEsIDB4NmQsIDB4ODksIDB4M2IsCisJMHgyNSwgMHg1NywgMHgyMiwgMHg3ZiwgMHg3NywgMHgwMCwgMHg5ZSwgMHhhOCwgMHgyNCwgMHg5YSwgMHhmMSwgMHg1ZCwKKwkweDgxLCAweDRkLCAweGYxLCAweDYwLCAweDhkLCAweDU4LCAweGRiLCAweDQ1LCAweGU2LCAweDZkLCAweDkxLCAweDNiLAorCTB4OTQsIDB4YzAsIDB4ZGUsIDB4MTgsIDB4OWEsIDB4NWMsIDB4OGYsIDB4NzIsIDB4MGUsIDB4ZjAsIDB4NDIsIDB4ZmIsCisJMHgwMywgMHhiNCwgMHgzNiwgMHg5OSwgMHg5MSwgMHhlYywgMHgyNiwgMHhmMCwgMHhjOSwgMHhhNCwgMHg4NywgMHg2ZiwKKwkweGMwLCAweDM1LCAweGY5LCAweDE2LCAweGJjLCAweDIzLCAweGZhLCAweGRiLCAweGMwLCAweDA5LCAweGJjLCAweGE2LAorCTB4MjIsIDB4NTYsIDB4NjcsIDB4NzUsIDB4YTEsIDB4ZWYsIDB4ZjcsIDB4NDgsIDB4NzYsIDB4MzQsIDB4NGUsIDB4NWIsCisJMHg2MiwgMHg3NSwgMHhkNiwgMHhjZiwgMHg0MCwgMHhkNywgMHgyYiwgMHgyOCwgMHg0MSwgMHg4YywgMHg2MSwgMHhkMiwKKwkweDgxLCAweDNjLCAweGE5LCAweDk1LCAweGRkLCAweDhmLCAweGUwLCAweGY3LCAweDgzLCAweGM2LCAweGU2LCAweGRkLAorCTB4M2QsIDB4YzksIDB4N2UsIDB4MWEsIDB4MDAsIDB4MTMsIDB4NmMsIDB4OTAsIDB4NDcsIDB4NjAsIDB4OWIsIDB4M2UsCisJMHgwMiwgMHgxYiwgMHhlNCwgMHg5MSwgMHg2NiwgMHgzYywgMHgxYywgMHgxYiwgMHhkYiwgMHg5ZiwgMHg1OSwgMHgwMywKKwkweDMxLCAweGE5LCAweGJmLCAweDczLCAweGE0LCAweDU3LCAweGQ4LCAweGVhLCAweGI5LCAweDYyLCAweGNhLCAweDk0LAorCTB4MmYsIDB4NzYsIDB4ZWIsIDB4YjcsIDB4YTEsIDB4ZWIsIDB4MWUsIDB4ZmIsIDB4M2IsIDB4YWUsIDB4ZjksIDB4M2EsCisJMHhkZiwgMHgwNCwgMHg5YSwgMHhhZiwgMHg3NCwgMHg2OSwgMHg5OSwgMHg5MywgMHhmNSwgMHhmMSwgMHg4NiwgMHhjZCwKKwkweDk5LCAweDY5LCAweGUyLCAweDE4LCAweGUzLCAweDM2LCAweDJkLCAweGFlLCAweGQzLCAweDEyLCAweDRkLCAweGQ2LAorCTB4ZGUsIDB4MjgsIDB4NTksIDB4NWIsIDB4MDMsIDB4YjgsIDB4MTksIDB4NmEsIDB4MDYsIDB4YzQsIDB4OTQsIDB4Y2YsCisJMHgxMiwgMHhlMiwgMHg5MywgMHgzMiwgMHgwMCwgMHhmNCwgMHgwYiwgMHg5YiwgMHhlMiwgMHhkYywgMHgxNSwgMHhlNSwKKwkweGRmLCAweGFjLCAweGI2LCAweGIxLCAweGNlLCAweDU2LCAweDQ4LCAweGM3LCAweGE0LCAweGVkLCAweDIwLCAweGI4LAorCTB4M2YsIDB4NTUsIDB4ODcsIDB4ZjYsIDB4YzksIDB4ZjMsIDB4YjAsIDB4NDAsIDB4OGUsIDB4MDIsIDB4MjYsIDB4NjAsCisJMHhhMiwgMHhjNiwgMHgzZiwgMHhhYiwgMHg2OSwgMHhhMCwgMHhkNiwgMHgyNywgMHgwZCwgMHg1NywgMHhmMywgMHg5NywKKwkweGU4LCAweGYxLCAweDllLCAweDA1LCAweDhmLCAweGMxLCAweGJlLCAweDgxLCAweGZkLCAweGQ2LCAweDAxLCAweGRiLAorCTB4OTgsIDB4N2QsIDB4MWMsIDB4ZTYsIDB4YjcsIDB4YTcsIDB4YzAsIDB4NTMsIDB4ZDksIDB4MzksIDB4OWUsIDB4MTIsCisJMHg5OSwgMHgyOCwgMHgxMiwgMHgzNywgMHhhMSwgMHg1ZCwgMHhjNywgMHg3OSwgMHgyNiwgMHg3ZSwgMHgzMiwgMHgxOCwKKwkweDMzLCAweGRmLCAweDdkLCAweDE2LCAweDRmLCAweDNiLCAweDJkLCAweDllLCAweDZlLCAweGIyLCAweGVmLCAweDExLAorCTB4YmMsIDB4NjksIDB4ZTMsIDB4MGQsIDB4ZTAsIDB4Y2QsIDB4ZjksIDB4MTksIDB4YzQsIDB4OWIsIDB4YmMsIDB4NzUsCisJMHgwYiwgMHhkZSwgMHgyOCwgMHg1YiwgMHhjYSwgMHhjOCwgMHg2ZSwgMHg2ZCwgMHg4NywgMHg0NSwgMHhlNCwgMHg1NywKKwkweGI0LCAweDZjLCAweGZiLCAweDAyLCAweGU2LCAweGIyLCAweDQ4LCAweGZhLCAweDk1LCAweDdjLCAweDJjLCAweDAyLAorCTB4OWMsIDB4MTQsIDB4ZjAsIDB4ZmIsIDB4NGUsIDB4ZDcsIDB4ZDAsIDB4MmEsIDB4NzEsIDB4YjIsIDB4YzAsIDB4NTcsCisJMHhhYSwgMHg4MiwgMHgyOSwgMHg2NiwgMHhlNSwgMHg1YywgMHg0MiwgMHhkYiwgMHhmYSwgMHhiOSwgMHhlMiwgMHgwNywKKwkweDM0LCAweDVjLCAweGI3LCAweDQyLCAweGRlLCAweGU1LCAweDQ1LCAweDM1LCAweDQzLCAweDM3LCAweDgwLCAweDE2LAorCTB4NTQsIDB4MGMsIDB4OWEsIDB4MmIsIDB4NzgsIDB4MDYsIDB4N2EsIDB4MjksIDB4MzcsIDB4NDksIDB4ZGIsIDB4YjgsCisJMHg4ZCwgMHg3ZSwgMHg0OSwgMHgzNCwgMHhkNywgMHhkNSwgMHg0OCwgMHgzYSwgMHg1MiwgMHgwYSwgMHhmNiwgMHgxNywKKwkweGJlLCAweDU1LCAweGFlLCAweDRiLCAweGQzLCAweGE5LCAweGEzLCAweGZjLCAweDk4LCAweGI2LCAweDdmLCAweDVkLAorCTB4MWYsIDB4ZDIsIDB4ZDYsIDB4ZjgsIDB4YmQsIDB4YWUsIDB4ZjIsIDB4ZDcsIDB4MmUsIDB4NGUsIDB4NGIsIDB4NTAsCisJMHgwZiwgMHhhMywgMHg1ZSwgMHgyMiwgMHhkNywgMHhkNSwgMHg0YywgMHgxZSwgMHhmMywgMHg0MCwgMHhiZiwgMHgxOSwKKwkweGU1LCAweDZiLCAweGRmLCAweDI3LCAweGFmLCAweGJhLCAweDU3LCAweDJmLCAweDJhLCAweGFmLCAweGRmLCAweDhlLAorCTB4ZmQsIDB4NzYsIDB4ZWQsIDB4ZGIsIDB4YjMsIDB4ZWYsIDB4ODQsIDB4N2QsIDB4ZTcsIDB4ZGQsIDB4NmUsIDB4YmUsCisJMHgxZCwgMHg3MSwgMHhkMywgMHg3YywgMHg4MywgMHg5MiwgMHhkMywgMHg2YywgMHg0MywgMHhmMywgMHg5NSwgMHg5NSwKKwkweDMzLCAweDFkLCAweDVlLCAweDQxLCAweGM4LCAweDU3LCAweDlmLCAweDkzLCAweDViLCAweDI3LCAweDhkLCAweGZjLAorCTB4ZGQsIDB4MGUsIDB4MTksIDB4MDQsIDB4ZmYsIDB4Y2MsIDB4OWIsIDB4MTEsIDB4YzAsIDB4M2YsIDB4OTgsIDB4OTYsCisJMHg1YiwgMHgyYiwgMHhjNCwgMHhkYiwgMHhlZiwgMHgwMiwgMHg3ZiwgMHg2MCwgMHhlMiwgMHg3YSwgMHhlYSwgMHg3NCwKKwkweGNhLCAweGRkLCAweDNiLCAweDYxLCAweGY3LCAweGEyLCAweDdjLCAweDkxLCAweDM4LCAweDFmLCAweGQyLCAweDczLAorCTB4NTMsIDB4MjgsIDB4ZWUsIDB4ZDEsIDB4NzMsIDB4NzMsIDB4YjAsIDB4MzgsIDB4MDMsIDB4ZmMsIDB4ZGMsIDB4MDYsCisJMHhiYSwgMHgwZiwgMHg4MiwgMHg5OSwgMHg1NCwgMHgwMSwgMHg5NCwgMHhmMywgMHgxMSwgMHhmYywgMHg4NiwgMHgxZCwKKwkweDUwLCAweGZjLCAweDE4LCAweGYyLCAweDFiLCAweGE1LCAweDMwLCAweDRhLCAweDllLCAweDczLCAweDJkLCAweDBmLAorCTB4YmYsIDB4MTMsIDB4ZmMsIDB4MTQsIDB4NDUsIDB4YmIsIDB4NDgsIDB4ZWIsIDB4ZTYsIDB4ZWYsIDB4OWYsIDB4MjAsCisJMHgwZiwgMHhlZiwgMHg0OSwgMHg0YywgMHg2MiwgMHgzMywgMHg2ZCwgMHgxZCwgMHhmNiwgMHhjZCwgMHhiOSwgMHhlMywKKwkweDljLCAweGM1LCAweGI0LCAweDJjLCAweDNmLCAweDNiLCAweDM3LCAweDZmLCAweDk3LCAweGU3LCAweGU4LCAweDM2LAorCTB4NGYsIDB4MWYsIDB4OGYsIDB4ZjksIDB4MWEsIDB4NTYsIDB4ZDIsIDB4ZmQsIDB4YjcsIDB4YjQsIDB4NWMsIDB4NzIsCisJMHg4ZiwgMHhjZSwgMHhhYywgMHgzMCwgMHhlZiwgMHhjNSwgMHg3NSwgMHgzOSwgMHhlNywgMHhkNSwgMHgzNCwgMHg0OCwKKwkweGJmLCAweDI1LCAweGQ5LCAweDkzLCAweDA3LCAweDNmLCAweDYxLCAweDljLCAweGQyLCAweGE3LCAweDdkLCAweDFkLAorCTB4ZDIsIDB4MDQsIDB4NjksIDB4NjAsIDB4ZGMsIDB4ZDIsIDB4ZTYsIDB4OTQsIDB4YTUsIDB4Y2QsIDB4MjcsIDB4ZjEsCisJMHhjNiwgMHg1MywgMHhiYSwgMHg2MCwgMHg2OSwgMHhmMywgMHgyOSwgMHhiYywgMHhmMSwgMHg5NCwgMHg1ZSwgMHg5YywKKwkweGUzLCAweGUzLCAweDVlLCAweGY4LCAweDcyLCAweGRiLCAweGExLCAweGRmLCAweDc2LCAweDU3LCAweDQwLCAweGJmLAorCTB4ZTAsIDB4YmIsIDB4MWMsIDB4N2MsIDB4ODAsIDB4NWMsIDB4NjksIDB4MWYsIDB4ZGUsIDB4ZWMsIDB4NjcsIDB4YTMsCisJMHg2ZCwgMHgzZiwgMHgyMywgMHg3YiwgMHg0YSwgMHgwMSwgMHhjNiwgMHg3OCwgMHgzNywgMHhjNiwgMHhmYiwgMHgzOSwKKwkweGJjLCAweDNmLCAweGEzLCAweGU1LCAweDhjLCAweGYyLCAweDBmLCAweDViLCAweDc5LCAweGY1LCAweDc5LCAweGJjLAorCTB4ZGIsIDB4ZTMsIDB4MDcsIDB4YTUsIDB4ZGQsIDB4OGIsIDB4YzgsIDB4MzQsIDB4ZGEsIDB4ZmEsIDB4YmEsIDB4ZWMsCisJMHhhOSwgMHhjYywgMHhlMiwgMHhiOSwgMHg4NCwgMHhlNywgMHg1NSwgMHgzYywgMHg5NywgMHhkMSwgMHhkZSwgMHgwYiwKKwkweDQ4LCAweDVmLCAweDI5LCAweGQzLCAweDVlLCAweDNkLCAweGNhLCAweGJmLCAweDg2LCAweGRmLCAweGNmLCAweGNiLAorCTB4ZDAsIDB4MjMsIDB4MmYsIDB4ZTEsIDB4ZjksIDB4MDEsIDB4ZjIsIDB4OWYsIDB4NDUsIDB4ZmQsIDB4NjAsIDB4ZjUsCisJMHg4YywgMHg0ZiwgMHgxOSwgMHhmNiwgMHg5YywgMHg2ZCwgMHgzYiwgMHhlNSwgMHhlNCwgMHgyYSwgMHhhMCwgMHhlOSwKKwkweGQyLCAweDAwLCAweGZhLCAweGRlLCAweGEzLCAweDc5LCAweGE2LCAweDBmLCAweDMyLCAweDNmLCAweDA3LCAweDE5LAorCTB4MzcsIDB4YTQsIDB4NjEsIDB4NmEsIDB4MDcsIDB4N2MsIDB4NzksIDB4Y2MsIDB4MDUsIDB4ZGUsIDB4OTMsIDB4YjUsCisJMHgzMiwgMHgxYiwgMHhhMywgMHgxZCwgMHg3OSwgMHg5MywgMHgyZSwgMHg5ZiwgMHgyYiwgMHgzNSwgMHg2OSwgMHhiYiwKKwkweDdhLCAweDdjLCAweDA5LCAweGZmLCAweGQwLCAweGVmLCAweDBhLCAweGU1LCAweDgxLCAweDkxLCAweGM2LCAweDEzLAorCTB4NDUsIDB4Y2EsIDB4MDIsIDB4ZTgsIDB4OWYsIDB4ZTIsIDB4MDgsIDB4ZGUsIDB4YjUsIDB4NWEsIDB4MjYsIDB4MTQsCisJMHgyNCwgMHg5NCwgMHgwNywgMHhhYywgMHg0NywgMHg5OSwgMHg1MCwgMHgyZCwgMHg3NywgMHgyOCwgMHg2YiwgMHgyOCwKKwkweDdiLCAweDI4LCAweDRiLCAweGNjLCAweDdjLCAweGVjLCAweDdlLCAweDkwLCAweDMyLCAweDFjLCAweGI0LCAweDEwLAorCTB4YTMsIDB4ZmQsIDB4ZTEsIDB4MTksIDB4MWYsIDB4NjQsIDB4ZWMsIDB4M2UsIDB4MmIsIDB4NGYsIDB4NDcsIDB4ZjUsCisJMHg1YywgMHhlYywgMHgyOSwgMHhhYSwgMHg5OCwgMHgyYiwgMHhhNywgMHg5MSwgMHg4NiwgMHhlNywgMHhmOCwgMHhjMywKKwkweDc4LCAweDdmLCAweDQ5LCAweGY2LCAweGUwLCAweGM5LCAweDFkLCAweGZmLCAweDAyLCAweDdlLCAweDczLCAweDZlLAorCTB4Y2EsIDB4MjgsIDB4ODcsIDB4YTcsIDB4NzQsIDB4MDIsIDB4NmYsIDB4M2MsIDB4YTUsIDB4MzEsIDB4MmIsIDB4NDcsCisJMHhjNiwgMHhhZCwgMHgxYywgMHhlMSwgMHg5YywgMHhkZSwgMHgwNCwgMHgzYywgMHg3MCwgMHg3YywgMHg0YSwgMHhjNywKKwkweDE3LCAweGMwLCAweGNmLCAweDRlLCAweDZlLCAweGYyLCAweDVkLCAweGQ2LCAweDhmLCAweDZkLCAweDE0LCAweGMzLAorCTB4ODMsIDB4NzgsIDB4M2EsIDB4YzksIDB4Y2YsIDB4MGQsIDB4ZGEsIDB4MGUsIDB4Y2UsIDB4NjksIDB4ZGEsIDB4ZmQsCisJMHgyYiwgMHhkNywgMHhmMCwgMHg2MiwgMHhjYywgMHhlOCwgMHgxNCwgMHhhZiwgMHg1OSwgMHgzNCwgMHhlZiwgMHhjZiwKKwkweGUxLCAweDMxLCAweDYzLCAweGYxLCAweGM4LCAweGRmLCAweGNhLCAweGZlLCAweDg2LCAweGRjLCAweDgyLCAweDRkLAorCTB4OWIsIDB4ZjUsIDB4N2QsIDB4Y2MsIDB4MDMsIDB4YzYsIDB4NzIsIDB4N2MsIDB4MTQsIDB4N2QsIDB4M2IsIDB4YjIsCisJMHhkYiwgMHhhNywgMHgwYywgMHg2NywgMHgwYywgMHg4MSwgMHhlMywgMHg2MywgMHhiYiwgMHg0OCwgMHhkNywgMHgzOCwKKwkweDQ4LCAweGM5LCAweGJjLCAweDZmLCAweDdlLCAweDEzLCAweGU2LCAweDJjLCAweDIzLCAweDdiLCAweDRiLCAweGY3LAorCTB4NmEsIDB4NWYsIDB4YjksIDB4ZjYsIDB4NjgsIDB4OTMsIDB4ZjUsIDB4NzMsIDB4YzIsIDB4NzIsIDB4YTAsIDB4ZDUsCisJMHgxOCwgMHg2ZCwgMHg5YiwgMHgyZiwgMHhjNSwgMHgwYywgMHhjZCwgMHhmMywgMHgzNywgMHhlNSwgMHg3MywgMHhiNSwKKwkweGJjLCAweDM3LCAweDc2LCAweDRkLCAweDYxLCAweDgxLCAweGFjLCAweGEzLCAweDZkLCAweDgxLCAweDM5LCAweDJiLAorCTB4NTcsIDB4ZTMsIDB4OWQsIDB4YmUsIDB4M2IsIDB4ZjksIDB4OGEsIDB4ZmMsIDB4NzQsIDB4MTAsIDB4M2MsIDB4ZjEsCisJMHg1ZCwgMHhjYiwgMHhmYiwgMHhmNCwgMHgzNSwgMHhkOCwgMHhlNywgMHg2MiwgMHg3ZSwgMHhmMiwgMHg2MCwgMHhmYiwKKwkweGJhLCAweDcyLCAweDBhLCAweGI2LCAweGRiLCAweGY2LCAweGI5LCAweDM2LCAweGFlLCAweDA2LCAweDNjLCAweDUxLAorCTB4NzksIDB4YTQsIDB4ZDgsIDB4MjAsIDB4OTMsIDB4NDUsIDB4ZDUsIDB4MWMsIDB4YjEsIDB4YjIsIDB4MzMsIDB4MjIsCisJMHgwOSwgMHg0ZCwgMHhkZiwgMHhiNCwgMHhlZiwgMHg3YSwgMHhjNywgMHgyMiwgMHg5NiwgMHhlZSwgMHhkNiwgMHhkNSwKKwkweDQ4LCAweGZkLCAweGVmLCAweDQyLCAweGM3LCAweGE2LCAweGExLCAweDYzLCAweDFiLCAweGExLCAweDgzLCAweDE3LAorCTB4Y2IsIDB4ODgsIDB4MzUsIDB4MzUsIDB4NGIsIDB4NjUsIDB4MDQsIDB4ZWIsIDB4MjQsIDB4ZTEsIDB4NzUsIDB4MWYsCisJMHg0NCwgMHhiZCwgMHg5MCwgMHhmZSwgMHhhMiwgMHg5YSwgMHhkNiwgMHg3MiwgMHg5MiwgMHg3NywgMHhiNiwgMHg1NywKKwkweDQ2LCAweDljLCAweDFkLCAweDk1LCAweGM1LCAweDNhLCAweDY4LCAweDhiLCAweGU3LCAweDhhLCAweDgxLCAweGY1LAorCTB4OTEsIDB4MjIsIDB4NmQsIDB4ZDQsIDB4NjQsIDB4MmEsIDB4MGIsIDB4OWMsIDB4ZWMsIDB4MDAsIDB4Y2MsIDB4Y2YsCisJMHg4YywgMHhjMiwgMHg0ZiwgMHhhNywgMHg1YywgMHgwNiwgMHhjYywgMHhhNywgMHgwMSwgMHhmMywgMHhjNCwgMHhhOCwKKwkweDEzLCAweGRhLCAweDA2LCAweGMyLCAweGEwLCAweGM4LCAweGM0LCAweDU4LCAweDk3LCAweGNjLCAweDRjLCAweDkxLAorCTB4MGUsIDB4MjEsIDB4MDMsIDB4NDYsIDB4MzEsIDB4OWYsIDB4YTksIDB4MTUsIDB4YjAsIDB4MDMsIDB4ZDgsIDB4M2YsCisJMHhlNCwgMHhmNiwgMHg1OCwgMHg4YiwgMHhjZSwgMHgzMywgMHhmYSwgMHhiYywgMHg1NSwgMHg2NiwgMHhjYSwgMHg2OSwKKwkweDBiLCAweGRiLCAweGUxLCAweDJhLCAweGQ4LCAweDU2LCAweGNjLCAweGMxLCAweGI2LCAweDAzLCAweGIwLCAweGVkLAorCTB4NWMsIDB4MTYsIDB4YjYsIDB4ZTUsIDB4NzQsIDB4NzEsIDB4MWIsIDB4NmMsIDB4MWEsIDB4YTMsIDB4OGIsIDB4MGQsCisJMHg1ZSwgMHg5YiwgMHgyZCwgMHgzZCwgMHhiYywgMHhkZiwgMHhkYSwgMHhiYiwgMHhiNCwgMHg4OSwgMHg3ZSwgMHgwYSwKKwkweDc4LCAweDQ4LCAweDYzLCAweGY4LCAweDNkLCAweDc5LCAweDJmLCAweDY1LCAweDE5LCAweGQyLCAweGY5LCAweGJkLAorCTB4MDcsIDB4NjUsIDB4ZjAsIDB4M2QsIDB4ZjksIDB4NjcsIDB4MmIsIDB4NGMsIDB4ZDksIDB4YmIsIDB4MmQsIDB4MmMsCisJMHhiNCwgMHgxMywgMHgzMiwgMHhiMCwgMHg4OSwgMHhmYiwgMHg5YywgMHhlYywgMHgyNCwgMHg2MSwgMHhmOCwgMHg4ZiwKKwkweDgwLCAweDE3LCAweDc5LCAweDk1LCAweGVhLCAweDM2LCAweGY5LCAweDY2LCAweGJiLCAweGQ3LCAweGRhLCAweDc2LAorCTB4ZDgsIDB4NzYsIDB4MzgsIDB4OTYsIDB4OTUsIDB4NTYsIDB4Y2YsIDB4ODcsIDB4ZjQsIDB4MTUsIDB4ZGEsIDB4ZDcsCisJMHgyMywgMHg0ZSwgMHg2NiwgMHhjOSwgMHhiOCwgMHhhYSwgMHg2OSwgMHg4ZSwgMHhmMiwgMHhkNiwgMHg5NSwgMHg3ZSwKKwkweGQwLCAweDQ5LCAweGZmLCAweDAyLCAweDVhLCAweDMzLCAweDcyLCAweGMzLCAweGQwLCAweGYxLCAweDBhLCAweDNiLAorCTB4YmUsIDB4MWEsIDB4YzMsIDB4MzcsIDB4YTksIDB4MjgsIDB4ZjQsIDB4MjEsIDB4ZTUsIDB4Y2QsIDB4MGUsIDB4ZTMsCisJMHg5YiwgMHhjYiwgMHg0MywgMHg4MCwgMHgzNSwgMHhmYywgMHgzZSwgMHhhOCwgMHg2ZCwgMHhjZSwgMHhhNywgMHg0YiwKKwkweDk0LCAweDQ5LCAweGYzLCAweGI0LCAweDY4LCAweDdjLCAweDk3LCAweDU2LCAweGY0LCAweDU1LCAweDZkLCAweGFmLAorCTB4YmIsIDB4MzIsIDB4NjAsIDB4ZTYsIDB4ZmMsIDB4MzAsIDB4ZTcsIDB4OWMsIDB4YmUsIDB4NDgsIDB4ZmIsIDB4MDMsCisJMHgwMywgMHg5NiwgMHhiZiwgMHg5MiwgMHhhMywgMHg3OSwgMHg3OSwgMHhiYiwgMHgxZCwgMHhmYiwgMHgxZiwgMHgyZSwKKwkweDMzLCAweDc3LCAweDhkLCAweDczLCAweDczLCAweDM3LCAweDUwLCAweDU5LCAweDNjLCAweDQ2LCAweDkxLCAweGI2LAorCTB4MDcsIDB4NTgsIDB4Y2YsIDB4ODUsIDB4OGQsIDB4OTQsIDB4OTIsIDB4NWEsIDB4OWYsIDB4ZjIsIDB4OTMsIDB4YjYsCisJMHgxMiwgMHhkMiwgMHgyNywgMHhiNiwgMHg3OCwgMHg0ZCwgMHhmMCwgMHgwMSwgMHg5ZSwgMHg1ZSwgMHg2MiwgMHg3NywKKwkweDI1LCAweGFjLCAweGRjLCAweGE0LCAweDFmLCAweDFjLCAweGY2LCAweDkxLCAweGI3LCAweDcyLCAweDMyLCAweDhmLAorCTB4ZjYsIDB4NDcsIDB4OWMsIDB4ZmUsIDB4Y2EsIDB4NzIsIDB4ZjIsIDB4MzIsIDB4OTQsIDB4OTMsIDB4MWMsIDB4OGYsCisJMHgyMywgMHg3NywgMHgzYywgMHg0OCwgMHgxZSwgMHg3ZCwgMHhiZiwgMHhiNiwgMHhhZiwgMHhiNywgMHg2ZSwgMHhhYiwKKwkweDAxLCAweGZlLCAweDA4LCAweGM3LCAweGNjLCAweDFhLCAweGEyLCAweDMzLCAweGY3LCAweDA4LCAweDZjLCAweDIyLAorCTB4M2IsIDB4NmYsIDB4YmIsIDB4ZTcsIDB4ZTYsIDB4NWYsIDB4ZDMsIDB4MDUsIDB4N2UsIDB4MzMsIDB4OGUsIDB4NmEsCisJMHg2OCwgMHhhNCwgMHhjNiwgMHg3NywgMHgzNCwgMHgyZCwgMHhkNCwgMHgyZSwgMHhiMSwgMHg2NSwgMHgzOSwgMHgwNiwKKwkweGRhLCAweGIzLCAweGI1LCAweGM2LCAweDE2LCAweDJjLCAweGQxLCAweGZlLCAweGE0LCAweGVjLCAweGEyLCAweGZkLAorCTB4ZjksIDB4NDMsIDB4ZTAsIDB4ODgsIDB4ZTMsIDB4ZTksIDB4YjIsIDB4NjksIDB4YjQsIDB4NTMsIDB4MTcsIDB4OGYsCisJMHg2ZiwgMHhiMSwgMHhmZiwgMHg0OCwgMHgzOCwgMHgwOSwgMHhiNywgMHhhMSwgMHhhZCwgMHg4NCwgMHgyMiwgMHg2YywKKwkweDgxLCAweDBjLCAweDgwLCAweDk3LCAweDM5LCAweDA3LCAweDhhLCAweGI2LCAweGViLCAweGI2LCAweGJmLCAweGE4LAorCTB4MzEsIDB4MzEsIDB4ZTQsIDB4ZDUsIDB4YjUsIDB4NTIsIDB4Y2YsIDB4M2UsIDB4YzksIDB4N2YsIDB4N2MsIDB4YWYsCisJMHhkMiwgMHhmNiwgMHhlZiwgMHg1MiwgMHg1OSwgMHg1NiwgMHhhZCwgMHg3YiwgMHhhZSwgMHg5ZSwgMHhjMywgMHg1ZiwKKwkweGZmLCAweDgyLCAweDM5LCAweDBhLCAweGYxLCAweDE3LCAweGQyLCAweDQ1LCAweDM1LCAweDBlLCAweDQ5LCAweDEzLAorCTB4ODYsIDB4MTYsIDB4MGMsIDB4MmQsIDB4NmUsIDB4YjQsIDB4ZmEsIDB4MjYsIDB4YTQsIDB4YmQsIDB4YWIsIDB4NDAsCisJMHg3YiwgMHhmNywgMHg4MSwgMHhjNiwgMHgyOCwgMHhjMywgMHgxOSwgMHg5NywgMHg1YiwgMHg4YiwgMHhlZiwgMHgyMywKKwkweGY4LCAweDBlLCAweGY5LCAweGU0LCAweDRhLCAweDMyLCAweDljLCAweGYyLCAweDliLCAweDc1LCAweGIyLCAweDU2LAorCTB4ZWUsIDB4ODcsIDB4N2UsIDB4MmUsIDB4ZWIsIDB4NzAsIDB4ZGMsIDB4OTQsIDB4ZmYsIDB4ZmYsIDB4MTUsIDB4ZWQsCisJMHhhYywgMHhhZCwgMHgzNSwgMHhmNiwgMHhjYSwgMHg4ZCwgMHhiNSwgMHg5NCwgMHhhZiwgMHg2YiwgMHhlNCwgMHg2MCwKKwkweDU1LCAweGRhLCAweDk1LCAweGU0LCAweDc3LCAweGY1LCAweDk4LCAweGQ3LCAweGZmLCAweDNmLCAweDE4LCAweDczLAorCTB4N2MsIDB4ZDEsIDB4OTgsIDB4M2QsIDB4M2IsIDB4ZTYsIDB4NzcsIDB4MjEsIDB4YmYsIDB4YzksIDB4ZjgsIDB4MzgsCisJMHgxZSwgMHhmOSwgMHgyZSwgMHgxYywgMHhiMywgMHhjNSwgMHg4NSwgMHgxZSwgMHg1NywgMHhiNSwgMHg5YywgMHgwOCwKKwkweDY1LCAweDA0LCAweGM3LCAweDM1LCAweDYwLCAweGM3LCAweGYwLCAweGI5LCAweGFhLCAweDcxLCAweDBkLCAweGJjLAorCTB4ODksIDB4NzEsIDB4YjUsIDB4MmUsIDB4MTgsIDB4ZDcsIDB4ZjYsIDB4MmIsIDB4OGUsIDB4NmIsIDB4MzksIDB4MWUsCisJMHgyNywgMHgyZiwgMHg4NywgMHhlMywgMHg4YiwgMHhjYSwgMHhhZSwgMHgyMiwgMHhjNywgMHhkOCwgMHg4ZiwgMHgzMSwKKwkweDFlLCAweGQ0LCAweGZlLCAweDgwLCAweDE5LCAweDYzLCAweGRhLCAweDhlLCAweDUxLCAweDU0LCAweGRiLCAweGI2LAorCTB4N2YsIDB4OGYsIDB4ZGYsIDB4ZDUsIDB4ZTMsIDB4YTMsIDB4ZWUsIDB4ZmYsIDB4M2UsIDB4NjgsIDB4YmEsIDB4NGUsCisJMHhiMiwgMHg1ZCwgMHg3NSwgMHg1NiwgMHhmZSwgMHhkZiwgMHgyNCwgMHgxZiwgMHgyZSwgMHg3MSwgMHhhZSwgMHg5MywKKwkweDE5LCAweDkxLCAweDUxLCAweGU4LCAweGUwLCAweGZmLCAweDVjLCAweGNiLCAweGQ4LCAweGZkLCAweGY2LCAweDk0LAorCTB4ZDUsIDB4NjMsIDB4ZDAsIDB4MTcsIDB4M2IsIDB4NjAsIDB4ZjMsIDB4ZjUsIDB4MTcsIDB4NTUsIDB4NzcsIDB4NDQsCisJMHg4MiwgMHhlMCwgMHhiNiwgMHhkNCwgMHhhNywgMHhkMSwgMHhmNywgMHg3ZSwgMHhlZCwgMHhhYiwgMHgyZSwgMHg4ZCwKKwkweDliLCAweDNmLCAweDU3LCAweDJiLCAweDNlLCAweGVkLCAweDBkLCAweGVhLCAweDczLCAweGU4LCAweGJiLCAweGUzLAorCTB4YjQsIDB4YzEsIDB4YjIsIDB4YjAsIDB4OTMsIDB4MzMsIDB4ZjEsIDB4ODgsIDB4YjYsIDB4YzUsIDB4YTgsIDB4MTMsCisJMHg5MywgMHhmMSwgMHg4YywgMHhhNCwgMHhkMSwgMHg1ZiwgMHgyNiwgMHhhZSwgMHg4NCwgMHg3ZCwgMHhjMCwgMHg1NiwKKwkweDgzLCAweDBkLCAweGY5LCAweGUxLCAweGNhLCAweDNlLCAweDNjLCAweDBmLCAweGNiLCAweGFkLCAweGIwLCAweDc3LAorCTB4NmUsIDB4N2QsIDB4ZTQsIDB4MGIsIDB4NzIsIDB4MWIsIDB4NmMsIDB4OWQsIDB4ZGIsIDB4MWUsIDB4MTksIDB4OTMsCisJMHhiZCwgMHhiMCwgMHg2ZCwgMHhmNiwgMHhjMiwgMHhjZSwgMHhkOSwgMHg1YiwgMHhhMSwgMHhlZCwgMHgzOSwgMHg4ZSwKKwkweGIyLCAweGFkLCAweDU1LCAweGI0LCAweDQ2LCAweDFiLCAweDg3LCAweGUzLCAweDIzLCAweGVlLCAweDBmLCAweDcyLAorCTB4MGUsIDB4NTIsIDB4MDksIDB4ZjUsIDB4OGEsIDB4OWUsIDB4OTcsIDB4YTYsIDB4MDUsIDB4NjksIDB4YWYsIDB4MjcsCisJMHhhYiwgMHg0MiwgMHhmZCwgMHhiNCwgMHhjYSwgMHhjNiwgMHg4ZCwgMHg4YywgMHgwZCwgMHg3OCwgMHg2NSwgMHhkYSwKKwkweDIyLCAweDhkLCAweDc4LCAweGMwLCAweDMzLCAweGYxLCAweDQ3LCAweGRhLCAweGFhLCAweDFlLCAweDdmLCAweDYzLAorCTB4OWQsIDB4ZjgsIDB4MmIsIDB4ZWIsIDB4YTQsIDB4ZmUsIDB4NzMsIDB4OTAsIDB4YWYsIDB4ZDUsIDB4MzQsIDB4YzUsCisJMHhiNywgMHg2NywgMHg3NSwgMHgwZCwgMHg2OSwgMHg4YiwgMHgzMiwgMHgzOCwgMHhhNCwgMHg4NywgMHg4ZCwgMHhhZiwKKwkweDIzLCAweDdmLCAweGFmLCAweDQ4LCAweDRmLCAweGZiLCAweGI5LCAweDJlLCAweGIzLCAweGJiLCAweDViLCAweDU2LAorCTB4MzMsIDB4MWUsIDB4OTAsIDB4YWQsIDB4Y2MsIDB4YzcsIDB4MDQsIDB4OTQsIDB4NWYsIDB4MWQsIDB4MTMsIDB4YTAsCisJMHg5ZiwgMHhmNSwgMHgwMSwgMHhlMCwgMHhlYywgMHgxNiwgMHgzYywgMHhmYiwgMHg2NCwgMHg4OCwgMHg3MSwgMHg4NywKKwkweDRhLCAweDY4LCAweDk3LCAweDdmLCAweGQ1LCAweGRhLCAweGU1LCAweDIxLCAweDFjLCAweDA5LCAweGMwLCAweDYxLAorCTB4ZTQsIDB4ZjMsIDB4NTIsIDB4M2QsIDB4YjcsIDB4NTAsIDB4N2YsIDB4ZTcsIDB4ZTcsIDB4NmMsIDB4ZGEsIDB4ODQsCisJMHhlYywgMHgyYSwgMHg3MSwgMHhkYywgMHg5NCwgMHhjMSwgMHhjNCwgMHg0ZCwgMHhiNSwgMHgwYywgMHg4ZSwgMHg1YiwKKwkweDNiLCAweDBhLCAweDY1LCAweGI0LCAweGZjLCAweDVjLCAweDJhLCAweDNiLCAweDI5LCAweGY3LCAweDE4LCAweDlmLAorCTB4N2YsIDB4MjAsIDB4NDUsIDB4NWEsIDB4N2YsIDB4YjcsIDB4NjQsIDB4ZTYsIDB4ZTIsIDB4ZjMsIDB4MDIsIDB4N2EsCisJMHg5MywgMHg1NCwgMHgyNCwgMHhhZCwgMHhkNywgMHhkMywgMHhiYywgMHgwOSwgMHhkOSwgMHgyMSwgMHhiZCwgMHgzMSwKKwkweGM2LCAweDNhLCAweDE5LCAweGNmLCAweGYzLCAweGYzLCAweDEzLCAweGIwLCAweDFmLCAweDg2LCAweDRiLCAweDBhLAorCTB4MTYsIDB4N2MsIDB4YWQsIDB4MGMsIDB4NzksIDB4ODEsIDB4NmMsIDB4NGYsIDB4MzksIDB4M2EsIDB4NzYsIDB4NmMsCisJMHg3NCwgMHg2ZCwgMHhhOSwgMHhjZSwgMHhkOCwgMHhhZSwgMHg4ZSwgMHg4ZSwgMHhmZiwgMHhjZSwgMHg4MCwgMHhmYSwKKwkweDY2LCAweGI0LCAweDdkLCAweGFiLCAweGI0LCAweGZlLCAweDlkLCAweGQ2LCAweDY1LCAweDQ2LCAweGViLCAweGMyLAorCTB4MzgsIDB4ZTYsIDB4OGMsIDB4MTcsIDB4YjEsIDB4ZTUsIDB4YWEsIDB4ZDMsIDB4YTcsIDB4ZWEsIDB4NDIsIDB4NWIsCisJMHhiMCwgMHg1MCwgMHgwOSwgMHhkMywgMHg5ZSwgMHg1YywgMHgyNiwgMHhlZCwgMHg4NSwgMHg2NSwgMHhkMiwgMHhmZSwKKwkweDc2LCAweDk5LCAweDM0LCAweDEzLCAweDE3LCAweGVjLCAweDJmLCAweDVlLCAweDQ2LCAweGRlLCAweDg4LCAweGU2LAorCTB4NTUsIDB4NjksIDB4MzYsIDB4ZjYsIDB4NzUsIDB4N2UsIDB4YWUsIDB4Y2MsIDB4MmEsIDB4ZWIsIDB4OTcsIDB4MzEsCisJMHg0NiwgMHg2YywgMHg2MiwgMHhjMywgMHgzOSwgMHgxZCwgMHgxYiwgMHhkZSwgMHhlMiwgMHg2ZCwgMHg1MywgMHg4YywKKwkweDc1LCAweDExLCAweDE3LCAweDA5LCAweGQ5LCAweGFiLCAweGYxLCAweDQyLCAweDljLCAweDdjLCAweDg1LCAweDMxLAorCTB4ZTAsIDB4M2MsIDB4ZDcsIDB4NWEsIDB4MTMsIDB4ZWEsIDB4NGEsIDB4YjQsIDB4M2QsIDB4NmYsIDB4OWIsIDB4OTgsCisJMHg3OSwgMHg4YiwgMHhlOSwgMHg3NSwgMHhkNSwgMHgzZSwgMHhkOCwgMHgwYSwgMHhmZCwgMHhjNSwgMHgyNiwgMHhkOSwKKwkweDNlLCAweDk2LCAweDU4LCAweDQxLCAweGJkLCAweGI1LCAweDYzLCAweGNjLCAweGY4LCAweDgzLCAweDdiLCAweGMxLAorCTB4NTcsIDB4MTksIDB4MjEsIDB4OGMsIDB4YzksIDB4OTQsIDB4MDgsIDB4NmQsIDB4ZTIsIDB4YTUsIDB4YjYsIDB4ZjAsCisJMHhlYiwgMHhiNywgMHhkNywgMHg3YiwgMHg4NSwgMHhmNiwgMHgxYywgMHhkOCwgMHgwZSwgMHgzZiwgMHg2YiwgMHg3YiwKKwkweGY1LCAweGQyLCAweDM3LCAweDE2LCAweGUyLCAweDRhLCAweGZkLCAweDljLCAweGY1LCAweDIyLCAweDU3LCAweGE4LAorCTB4YTcsIDB4ZWQsIDB4MTIsIDB4NzksIDB4NjYsIDB4NGUsIDB4MTYsIDB4NmYsIDB4ODQsIDB4Y2QsIDB4MjQsIDB4NDEsCisJMHhiNiwgMHg1YiwgMHg1YSwgMHgyMywgMHhhMiwgMHg2MywgMHgzYywgMHgyOSwgMHgyMywgMHg5YiwgMHgzYiwgMHhiOCwKKwkweGI2LCAweDAzLCAweGZhLCAweDM3LCAweGI2LCAweDhhLCAweDg5LCAweDliLCAweDg2LCAweDc2LCAweGNhLCAweDcyLAorCTB4YjQsIDB4N2IsIDB4YmQsIDB4YTUsIDB4NWQsIDB4YWUsIDB4YTksIDB4ZWUsIDB4YTAsIDB4Y2MsIDB4YzUsIDB4OWMsCisJMHgxOCwgMHgzYSwgMHhkZSwgMHg1ZSwgMHg5NCwgMHg0NCwgMHg0OCwgMHhjNywgMHgzMywgMHhmMCwgMHg4YiwgMHhhYiwKKwkweGU5LCAweDc4LCAweDQ2LCAweDUyLCAweDlhLCAweDhlLCAweDZiLCAweDE3LCAweGQwLCAweDcxLCAweGFiLCAweGE1LAorCTB4ZTMsIDB4NzcsIDB4NDQsIDB4MGQsIDB4NWQsIDB4MjgsIDB4YWQsIDB4YTcsIDB4NDgsIDB4YTcsIDB4ODYsIDB4OGUsCisJMHgxZCwgMHg0ZCwgMHhjNywgMHgzMywgMHg3OCwgMHhiYiwgMHg3ZSwgMHg4ZiwgMHgyZCwgMHgxMywgMHhiMSwgMHg2OSwKKwkweGZjLCAweDFkLCAweGE2LCAweDUxLCAweDJlLCAweGZlLCAweDY2LCAweGQ0LCAweGU4LCAweGE1LCAweDE0LCAweGU4LAorCTB4MjgsIDB4NGMsIDB4ZmYsIDB4NjAsIDB4ZDQsIDB4ZDAsIDB4NjcsIDB4NzUsIDB4OWEsIDB4ODksIDB4OGYsIDB4ZjQsCisJMHgxNywgMHhkZiwgMHgxMywgMHg1ZCwgMHg0OCwgMHg5ZiwgMHgyOSwgMHhkMCwgMHg2NywgMHg1OCwgMHhlNiwgMHhmNSwKKwkweGU4LCAweGIzLCAweGRlLCAweGFlLCAweDViLCAweDQ0LCAweGY1LCAweGJhLCAweDdiLCAweDI2LCAweDY2LCAweDY4LAorCTB4ZjUsIDB4NTYsIDB4M2QsIDB4NzYsIDB4OGUsIDB4ZmIsIDB4ZDksIDB4OWYsIDB4ODEsIDB4NTYsIDB4Y2QsIDB4ZGMsCisJMHg5YywgMHg5ZiwgMHhmNywgMHhiNywgMHgxOSwgMHg4YiwgMHg0YSwgMHg5OCwgMHgxOCwgMHgzNiwgMHhlMywgMHhhNCwKKwkweDU3LCAweGIyLCAweDFkLCAweDhkLCAweDdjLCAweGFhLCAweGQxLCAweGYyLCAweGE5LCAweDcxLCAweDQ4LCAweGE1LAorCTB4YWIsIDB4NjUsIDB4NzYsIDB4MzcsIDB4NzQsIDB4MDUsIDB4NmQsIDB4NmMsIDB4MmQsIDB4YTcsIDB4OTEsIDB4ZDcsCisJMHg5YSwgMHhjOCwgMHgxNiwgMHhmZiwgMHhkOSwgMHhlZSwgMHg1ZiwgMHhlMCwgMHhiYSwgMHg4MCwgMHgwYywgMHgzOSwKKwkweDQ4LCAweDZiLCAweDJiLCAweDliLCAweDcxLCAweDI5LCAweGJmLCAweDExLCAweGRmLCAweGRkLCAweGQyLCAweDU2LAorCTB4NTYsIDB4NzIsIDB4ZmIsIDB4NTgsIDB4ODMsIDB4ZWMsIDB4MmIsIDB4YmEsIDB4ZjIsIDB4NTEsIDB4ZDQsIDB4ZmYsCisJMHg0OCwgMHhkMSwgMHg4MywgMHgzZiwgMHgzZSwgMHgxZSwgMHhhNSwgMHg1ZCwgMHhiOCwgMHhiNywgMHhjOCwgMHhmNSwKKwkweDQ5LCAweGM3LCAweGFjLCAweDE5LCAweDJkLCAweDU4LCAweGYzLCAweDhjLCAweDQ4LCAweDViLCAweDQ3LCAweDAxLAorCTB4OWUsIDB4OGEsIDB4YjgsIDB4M2IsIDB4MDEsIDB4NDcsIDB4NWQsIDB4M2EsIDB4MmQsIDB4YWYsIDB4NzQsIDB4MGYsCisJMHgzOCwgMHhkYSwgMHg5NywgMHg3MCwgMHg3YSwgMHhlNCwgMHhjNiwgMHg0YSwgMHg1YSwgMHg2ZSwgMHhhOCwgMHg5OCwKKwkweDc1LCAweGQyLCAweGY5LCAweDc1LCAweGQwLCAweGE0LCAweDM3LCAweDBkLCAweDlkLCAweDkzLCAweGYxLCAweDgyLAorCTB4ZTAsIDB4M2MsIDB4ZTQsIDB4YjcsIDB4M2EsIDB4ZTIsIDB4NGEsIDB4YjQsIDB4MjMsIDB4MTksIDB4OWYsIDB4MTYsCisJMHhmMywgMHg3ZCwgMHhiMSwgMHhmYywgMHhlMywgMHg2MCwgMHgyOCwgMHhlNiwgMHhjYSwgMHgyYiwgMHgzZSwgMHhjNywKKwkweGQ1LCAweDIzLCAweGQ3LCAweDk3LCAweGFiLCAweGZiLCAweGUzLCAweDVhLCAweGU5LCAweDEzLCAweDUxLCAweGFlLAorCTB4NGQsIDB4NjQsIDB4MmIsIDB4ZTUsIDB4MjgsIDB4ZTMsIDB4ZTcsIDB4MjIsIDB4NzksIDB4NjksIDB4N2IsIDB4MmIsCisJMHg3YywgMHgzNywgMHg0OCwgMHhlYiwgMHhiNiwgMHhiNywgMHg4MiwgMHg1NiwgMHg2MiwgMHhkMCwgMHhmMywgMHg1YiwKKwkweDAxLCAweGQ3LCAweDU2LCAweGM2LCAweGJiLCAweDE4LCAweGU3LCAweGUyLCAweGY3LCAweDVmLCAweGEyLCAweDVmLAorCTB4ZDYsIDB4ZmQsIDB4NWQsIDB4YmQsIDB4NjYsIDB4MjUsIDB4OGEsIDB4NzMsIDB4NmUsIDB4ZjgsIDB4NjUsIDB4NzksCisJMHg1ZCwgMHhkMywgMHgzOCwgMHgxNCwgMHg0ZCwgMHg4YiwgMHgxMywgMHg3ZCwgMHg1YiwgMHg1YywgMHg1NiwgMHhmOCwKKwkweGQ1LCAweGZkLCAweDczLCAweGVkLCAweDU3LCAweDE0LCAweDcwLCAweGU4LCAweGVlLCAweGQ4LCAweGRjLCAweDIzLAorCTB4N2QsIDB4MTgsIDB4NWYsIDB4ZmYsIDB4OTIsIDB4ZjEsIDB4ZWQsIDB4MTcsIDB4YzYsIDB4NTQsIDB4MmYsIDB4MTYsCisJMHgzOSwgMHg4NiwgMHhmOSwgMHg3MSwgMHhhOSwgMHgzZiwgMHgzMiwgMHhlMywgMHg4YSwgMHg3NiwgMHgyYywgMHgxZSwKKwkweDhmLCAweGFlLCAweGFmLCAweDRlLCAweDAxLCAweDk2LCAweGU3LCAweGY0LCAweDFlLCAweDgxLCAweDIwLCAweGI4LAorCTB4YTYsIDB4ZTMsIDB4NjIsIDB4OTAsIDB4NTgsIDB4OTcsIDB4ZWMsIDB4OWMsIDB4OWUsIDB4NWYsIDB4ZDMsIDB4MTksCisJMHg4YSwgMHhhNCwgMHgzMywgMHgxYSwgMHhmZiwgMHhmOCwgMHg0ZSwgMHhlNCwgMHhjYSwgMHhkZCwgMHg5OCwgMHgzYiwKKwkweDcxLCAweDczLCAweDVkLCAweGFlLCAweGU2LCAweDhkLCAweDljLCAweGRmLCAweDZkLCAweGQ3LCAweGFkLCAweDQyLAorCTB4YmYsIDB4MjksIDB4MDgsIDB4OTQsIDB4YmYsIDB4NTgsIDB4NTYsIDB4NTAsIDB4NDcsIDB4NjEsIDB4ZWMsIDB4YjIsCisJMHhkYiwgMHhlZSwgMHg0YiwgMHg0OSwgMHgzMSwgMHg2ZSwgMHgzOCwgMHhlNCwgMHhhNiwgMHhhMywgMHg4OSwgMHg0MiwKKwkweGI5LCAweDBiLCAweGJmLCAweDFiLCAweGYwLCAweGZlLCAweDQ1LCAweGQ4LCAweDI4LCAweDNkLCAweGIwLCAweDYxLAorCTB4MjQsIDB4YTYsIDB4OGMsIDB4M2MsIDB4MDAsIDB4ZmQsIDB4NzYsIDB4ZTQsIDB4OTUsIDB4MjIsIDB4M2YsIDB4N2EsCisJMHg4OSwgMHhlMSwgMHg3MiwgMHgyYywgMHgzMSwgMHg1YSwgMHhkZSwgMHhjYiwgMHhmYSwgMHgyOCwgMHg3YiwgMHhhNSwKKwkweGY4LCAweDFkLCAweGZiLCAweDYyLCAweDFmLCAweGY0LCAweDc5LCAweDdmLCAweDk2LCAweDNlLCAweDVjLCAweGRiLAorCTB4MzYsIDB4ZGIsIDB4MGMsIDB4ZjEsIDB4ZTIsIDB4ZDIsIDB4MGQsIDB4YzcsIDB4YmYsIDB4NmUsIDB4ZWIsIDB4OGYsCisJMHg3MCwgMHg3YywgMHg3YiwgMHgyZCwgMHhkYywgMHg4YiwgMHhmYiwgMHg3ZCwgMHg0OSwgMHhkYiwgMHgyYywgMHg4ZiwKKwkweDU1LCAweDY4LCAweDI3LCAweDcyLCAweDRkLCAweDI3LCAweDc5LCAweDYyLCAweDVjLCAweDA4LCAweDQ3LCAweDEwLAorCTB4NWMsIDB4NDgsIDB4MTksIDB4N2QsIDB4ZmQsIDB4NzQsIDB4ODUsIDB4ZWIsIDB4MWEsIDB4NDEsIDB4ZjAsIDB4NWQsCisJMHhkYSwgMHhjMiwgMHg4MywgMHgyNSwgMHhmNCwgMHgxNywgMHhlMiwgMHg2MCwgMHg2MywgMHhkZSwgMHg4NSwgMHgyYywKKwkweDFjLCAweGU5LCAweDI2LCAweDdlLCAweDA1LCAweDVlLCAweDY5LCAweDg3LCAweGI3LCAweDRiLCAweGEyLCAweDg5LAorCTB4ZGYsIDB4MmUsIDB4MzcsIDB4MjQsIDB4M2UsIDB4NTEsIDB4ZjYsIDB4ODAsIDB4NjcsIDB4OGUsIDB4M2IsIDB4OTYsCisJMHhkOCwgMHg2MywgMHhjNywgMHhjYywgMHhmZCwgMHgyMCwgMHhhZiwgMHhiZiwgMHg0ZiwgMHhlMywgMHhhNSwgMHgwNSwKKwkweDNlLCAweDEyLCAweDYxLCAweDlhLCAweDg3LCAweDg1LCAweGIwLCAweDI1LCAweDJjLCAweDZlLCAweDgyLCAweGUwLAorCTB4ZmIsIDB4MjksIDB4ZjYsIDB4ZDksIDB4Y2QsIDB4ZmQsIDB4MDAsIDB4MjMsIDB4ZTgsIDB4MzcsIDB4YmYsIDB4NTYsCisJMHgxMSwgMHgwZiwgMHhkMSwgMHhjNCwgMHgxZCwgMHhlOCwgMHhmYiwgMHhiNywgMHhkMSwgMHhmNywgMHhiZSwgMHgzMiwKKwkweGZiLCAweDgzLCAweDdjLCAweGMwLCAweGQ4LCAweDQ3LCAweDJhLCAweDIxLCAweGJjLCAweGNiLCAweGY1LCAweDFkLAorCTB4Y2UsIDB4NzksIDB4YTcsIDB4YjUsIDB4ZWIsIDB4YzIsIDB4NmYsIDB4OGQsIDB4NDgsIDB4NGYsIDB4YzEsIDB4OTcsCisJMHhjYiwgMHg1NiwgMHg2NiwgMHhkNiwgMHhiOCwgMHhmMiwgMHgyZSwgMHhjOCwgMHhkYSwgMHg0MCwgMHg0ZSwgMHg0MiwKKwkweDg2LCAweGNkLCAweDY4LCAweGJhLCAweGM5LCAweGFlLCAweGU3LCAweGZmLCAweDExLCAweGY5LCAweGU0LCAweDBhLAorCTB4YzYsIDB4OTQsIDB4N2IsIDB4N2QsIDB4ZGEsIDB4YWIsIDB4YjMsIDB4YzEsIDB4OGMsIDB4NGYsIDB4OTksIDB4YmMsCisJMHg0YSwgMHhjNiwgMHhiZCwgMHg3YywgMHgyNywgMHhmNCwgMHgwMywgMHhkMiwgMHgxYSwgMHhlOSwgMHg2MywgMHgyNywKKwkweGIyLCAweDkxLCAweDY0LCAweDYyLCAweDU4LCAweGI4LCAweGM3LCAweDg5LCAweGZiLCAweDEzLCAweGI4LCAweGVmLAorCTB4ODcsIDB4ZjIsIDB4YzAsIDB4ODUsIDB4OWMsIDB4ZTMsIDB4MWMsIDB4OWEsIDB4ZmUsIDB4ODYsIDB4Y2IsIDB4ZjMsCisJMHg2NSwgMHgwZiwgMHgwOCwgMHhkNywgMHgwOSwgMHg5MywgMHhmMSwgMHhiZCwgMHhkYSwgMHgyNiwgMHgwMSwgMHhkNSwKKwkweDE1LCAweDU5LCAweDc2LCAweDMzLCAweDJjLCAweDEyLCAweGJmLCAweGFhLCAweGJjLCAweGRlLCAweDczLCAweDA1LAorCTB4M2UsIDB4NjcsIDB4MWMsIDB4MjEsIDB4MWEsIDB4Y2QsIDB4MTYsIDB4ZTUsIDB4YjUsIDB4NDgsIDB4YjcsIDB4YmMsCisJMHg5NiwgMHg0ZCwgMHhkNSwgMHg0YiwgMHhhZiwgMHg5NiwgMHhmOSwgMHhjYywgMHhkMywgMHhlOSwgMHhiMywgMHgyNiwKKwkweGRkLCAweDg1LCAweDJlLCAweGUxLCAweDljLCAweGY0LCAweDQwLCAweDQ2LCAweDRmLCAweDAwLCAweDZlLCAweGUyLAorCTB4YjAsIDB4ODcsIDB4MzIsIDB4ODksIDB4ZjMsIDB4YTcsIDB4NTQsIDB4M2EsIDB4MTYsIDB4Y2QsIDB4OTUsIDB4YTUsCisJMHgyZiwgMHg1NywgMHhiNCwgMHhiMSwgMHg5ZSwgMHgwMSwgMHg4ZSwgMHg3ZiwgMHg5NSwgMHhjNSwgMHg0MywgMHhhMywKKwkweGI4LCAweDgwLCAweGFkLCAweDJmLCAweDkyLCAweDcwLCAweGUwLCAweDJiLCAweDQzLCAweGQ3LCAweDNmLCAweGJhLAorCTB4NGEsIDB4MWEsIDB4ODksIDB4OWIsIDB4MWUsIDB4ZjAsIDB4NTIsIDB4MGQsIDB4NzQsIDB4ZDEsIDB4ZmQsIDB4Y2QsCisJMHg1YywgMHgzNywgMHhkNSwgMHgzNiwgMHg2NCwgMHhlYywgMHg2MywgMHhiZiwgMHhhYywgMHhkMiwgMHg3ZiwgMHgxYiwKKwkweDU3LCAweGU5LCAweDUxLCAweDJiLCAweDJmLCAweGEzLCAweDdkLCAweDk0LCAweDk3LCAweDRmLCAweDk3LCAweDA4LAorCTB4OGYsIDB4NzgsIDB4MTEsIDB4M2YsIDB4ZDEsIDB4ZDcsIDB4NWIsIDB4MTYsIDB4MTUsIDB4NDksIDB4N2IsIDB4ZDEsCisJMHhkZSwgMHhmMiwgMHg0MiwgMHhmYSwgMHg3ZiwgMHhiYSwgMHhmMiwgMHg2MSwgMHg2YiwgMHgwYiwgMHg1NiwgMHhjNywKKwkweDU0LCAweGFiLCAweGYzLCAweGM4LCAweDgzLCAweGNiLCAweGU1LCAweDExLCAweDI2LCAweDg5LCAweGFlLCAweDQ4LAorCTB4NWYsIDB4ZjgsIDB4NTQsIDB4N2IsIDB4NDcsIDB4ZGUsIDB4YWIsIDB4MTUsIDB4ZTIsIDB4MzksIDB4ODAsIDB4ZGMsCisJMHgwNiwgMHhhZSwgMHhjYiwgMHg1YywgMHhhZiwgMHhkZSwgMHg4ZiwgMHg3OSwgMHhmYiwgMHgzZiwgMHg0MSwgMHgyNiwKKwkweGM2LCAweDdjLCAweDRmLCAweGVhLCAweGUwLCAweGRiLCAweGJlLCAweDBjLCAweGRkLCAweGY5LCAweDhhLCAweDdmLAorCTB4ZTEsIDB4NTMsIDB4OWQsIDB4MWQsIDB4NDEsIDB4ZjAsIDB4YWMsIDB4OWYsIDB4NGYsIDB4YjgsIDB4OTAsIDB4MWYsCisJMHg4NywgMHgyZCwgMHhiZSwgMHg4NywgMHg4MSwgMHhlZiwgMHg4OSwgMHgzOSwgMHg3YywgMHgyNywgMHhlNCwgMHg2MiwKKwkweGQ3LCAweGY3LCAweDAzLCAweGFlLCAweGY1LCAweDBkLCAweDk3LCAweDZmLCAweGJkLCAweDU1LCAweGE1LCAweDNmLAorCTB4ZmUsIDB4YTEsIDB4NmMsIDB4MzcsIDB4ZmIsIDB4MWIsIDB4OTEsIDB4YzMsIDB4OTUsIDB4OWIsIDB4ODgsIDB4YmYsCisJMHgyOCwgMHhjNiwgMHg3YSwgMHg0ZiwgMHg5ZiwgMHg2ZiwgMHhmYSwgMHhlZCwgMHg1YiwgMHhkMCwgMHgyZiwgMHhlOSwKKwkweGU1LCAweDQ3LCAweGFjLCAweDhiLCAweDMyLCAweGQ1LCAweDc1LCAweDMzLCAweGEwLCAweGNiLCAweGJjLCAweGFkLAorCTB4M2IsIDB4NzAsIDB4ODUsIDB4YmEsIDB4ZGUsIDB4MTUsIDB4ZWEsIDB4MWUsIDB4NDYsIDB4ZGQsIDB4M2QsIDB4YjYsCisJMHhlZSwgMHg4NSwgMHhjZiwgMHhiYywgMHhiOSwgMHg3ZSwgMHgwNywgMHhiOCwgMHhjNywgMHgwZSwgMHgzZSwgMHg4MCwKKwkweGI4LCAweDExLCAweGZmLCAweDM2LCAweGZjLCAweGJlLCAweDg1LCAweGVkLCAweDI4LCAweGRhLCAweGY3LCAweDIzLAorCTB4OTUsIDB4MjEsIDB4MTksIDB4YWUsIDB4ZWMsIDB4YzQsIDB4MzMsIDB4ODgsIDB4YjQsIDB4M2UsIDB4M2MsIDB4ZmIsCisJMHhmMCwgMHgzYiwgMHg4ZCwgMHg0NywgMHhhMiwgMHg2ZSwgMHhmYSwgMHhjMiwgMHg1ZCwgMHhjMywgMHg3ZSwgMHg4OCwKKwkweDU3LCAweGFlLCAweGNkLCAweGIzLCAweDBmLCAweGQ4LCAweDE3LCAweDVkLCAweDNmLCAweDQxLCAweDFmLCAweDYxLAorCTB4ZmEsIDB4MDcsIDB4NTAsIDB4NjcsIDB4MWEsIDB4NjksIDB4MmIsIDB4NjksIDB4N2IsIDB4NjIsIDB4YWUsIDB4YWIsCisJMHhlYiwgMHg1NCwgMHhjMywgMHgzNiwgMHgxZCwgMHhjZSwgMHgwNSwgMHhmMiwgMHgwZCwgMHg4ZCwgMHhmNiwgMHgxNiwKKwkweDQzLCAweDE4LCAweGVmLCAweDQ0LCAweDFiLCAweGUzLCAweDU3LCAweDI5LCAweGZmLCAweDFlLCAweGMyLCAweDE1LAorCTB4NTcsIDB4ZmUsIDB4YzcsIDB4ZjAsIDB4N2UsIDB4MmQsIDB4ZDgsIDB4OWQsIDB4NjIsIDB4NGMsIDB4OWUsIDB4ZjMsCisJMHg3ZSwgMHhkZCwgMHhhYSwgMHhhNSwgMHg3YiwgMHg5ZiwgMHg0MiwgMHgxYSwgMHhlOCwgMHg4NCwgMHg0ZSwgMHg2OSwKKwkweGIwLCAweDc0LCAweDVhLCAweDgwLCAweGU1LCAweDQzLCAweDFhLCAweGU1LCAweDk4LCAweDE3LCAweDk3LCAweDRkLAorCTB4NzYsIDB4ZTYsIDB4YTUsIDB4MDcsIDB4YmEsIDB4OGMsIDB4YjIsIDB4ZjYsIDB4ZDMsIDB4ZjUsIDB4MjYsIDB4MGUsCisJMHgwMywgMHhjYiwgMHhkMSwgMHhlZiwgMHgwNCwgMHgzZCwgMHgzNywgMHg4OCwgMHg4NywgMHhmYSwgMHgwMywgMHgxMSwKKwkweDBmLCAweDM0LCAweDE4LCAweGQ2LCAweDRmLCAweDdhLCAweDAzLCAweDExLCAweDhlLCAweDE5LCAweDFjLCAweDVmLAorCTB4ZTYsIDB4YmEsIDB4MzQsIDB4NmQsIDB4NmIsIDB4ZDYsIDB4MGYsIDB4NmQsIDB4MWMsIDB4ZmUsIDB4N2IsIDB4NTksCisJMHhjNCwgMHg2NywgMHgxYSwgMHhkYiwgMHgwYiwgMHhkZSwgMHg1NSwgMHhlMywgMHgyZiwgMHg1OSwgMHg2MywgMHhjMSwKKwkweDM4LCAweGYzLCAweDQ5LCAweDY4LCAweDMwLCAweGFmLCAweDRmLCAweGNiLCAweGU5LCAweGZjLCAweDM1LCAweDM1LAorCTB4ZDIsIDB4ZTAsIDB4ZjUsIDB4ZWIsIDB4ZGYsIDB4MmMsIDB4ZDMsIDB4ZTAsIDB4ODEsIDB4NGYsIDB4MTcsIDB4OTUsCisJMHg2MSwgMHgxYSwgMHhmMywgMHgwYSwgMHg2YiwgMHg5NCwgMHhkZSwgMHhhYiwgMHhhNCwgMHhmNywgMHgyOCwgMHhjOSwKKwkweDgzLCAweGE5LCAweDY0LCAweDYyLCAweDQ4LCAweDI1LCAweGJkLCAweDcxLCAweGQ5LCAweDBmLCAweGI5LCAweDQzLAorCTB4MzksIDB4MzksIDB4NzMsIDB4N2YsIDB4NDQsIDB4YjgsIDB4OWYsIDB4ZWYsIDB4NWQsIDB4OTIsIDB4ZjUsIDB4MjksCisJMHgzZiwgMHgwYiwgMHg5ZiwgMHg1NywgMHg5NCwgMHg3NSwgMHg5NSwgMHg5NywgMHgxYSwgMHhjYywgMHhkOCwgMHhiOCwKKwkweDBmLCAweDAxLCAweDcwLCAweDM2LCAweGQxLCAweDg2LCAweGJiLCAweGI1LCAweDgxLCAweDNjLCAweDk0LCAweDUwLAorCTB4MTEsIDB4ZDksIDB4NDUsIDB4M2YsIDB4NWYsIDB4N2QsIDB4YjEsIDB4NWUsIDB4ZWEsIDB4YTcsIDB4ZDcsIDB4NzgsCisJMHg1MiwgMHhkMSwgMHhlOSwgMHg2NiwgMHg3ZiwgMHg2MCwgMHhiMiwgMHg3MywgMHg0OCwgMHg4OSwgMHgxZSwgMHg3YiwKKwkweDQ2LCAweGJkLCAweDkxLCAweGNjLCAweDllLCAweGI1LCAweGZhLCAweDIzLCAweDkwLCAweGM3LCAweGI0LCAweGJlLAorCTB4OTgsIDB4ZjksIDB4YmMsIDB4MmIsIDB4MTcsIDB4ODIsIDB4YjYsIDB4NGQsIDB4MTcsIDB4ZGEsIDB4YjMsIDB4NWQsCisJMHhiNCwgMHg3MywgMHg1NywgMHhkOSwgMHhmZCwgMHg5NSwgMHg4YywgMHg2MywgMHhiZCwgMHg0YiwgMHg5ZSwgMHhmMywKKwkweDBiLCAweDE4LCAweGY3LCAweDdlLCAweGI5LCAweGUwLCAweGIzLCAweGJmLCAweDk5LCAweGNmLCAweDc5LCAweGMyLAorCTB4NzQsIDB4YzIsIDB4NmUsIDB4ZmEsIDB4MTMsIDB4ZjUsIDB4YTcsIDB4ODAsIDB4ODcsIDB4N2QsIDB4NTIsIDB4MDcsCisJMHg1ZiwgMHhjOSwgMHhlZSwgMHg0YiwgMHgwZSwgMHhlNCwgMHg0NSwgMHhjZiwgMHg0YiwgMHg4ZiwgMHhhMCwgMHhhZCwKKwkweDE1LCAweDNlLCAweGY4LCAweDEwLCAweDc2LCAweDczLCAweGNkLCAweDkxLCAweGFiLCAweDIxLCAweDc3LCAweDFkLAorCTB4YmQsIDB4YzcsIDB4MDIsIDB4OTMsIDB4ZTEsIDB4NGQsIDB4NjEsIDB4ZGUsIDB4MzMsIDB4MDMsIDB4MmMsIDB4NTcsCisJMHgyZiwgMHhkMywgMHgzMSwgMHhmMiwgMHhiYSwgMHhlNiwgMHg5NywgMHg0ZiwgMHg2NSwgMHhmZCwgMHg3NiwgMHg0ZiwKKwkweDM5LCAweGMzLCAweDhjLCAweDMxLCAweDAwLCAweGFmLCAweGE0LCAweGNkLCAweDU0LCAweDZjLCAweGJiLCAweGNmLAorCTB4YjYsIDB4NTgsIDB4ZTYsIDB4MmEsIDB4ZjksIDB4ZjYsIDB4YzAsIDB4ODUsIDB4N2YsIDB4NzgsIDB4ZDYsIDB4ZmYsCisJMHg3YiwgMHhjMCwgMHg5MSwgMHg4MSwgMHg0YywgMHhlMCwgMHhmMywgMHg2YSwgMHg5MCwgMHg4ZiwgMHgzMSwgMHhhNiwKKwkweGY1LCAweGJmLCAweGViLCAweGFkLCAweDlkLCAweGFjLCAweDc5LCAweDdmLCAweDU4LCAweGVmLCAweDkzLCAweDc5LAorCTB4ZmUsIDB4MzMsIDB4NTksIDB4YWUsIDB4NzcsIDB4YzAsIDB4MzYsIDB4YzksIDB4NjksIDB4YjksIDB4MTgsIDB4ZmQsCisJMHg2OSwgMHgwZSwgMHhmMCwgMHgxNCwgMHgyYSwgMHhiNCwgMHg0MywgMHhmZSwgMHgwNiwgMHg3NiwgMHg4OCwgMHhkNiwKKwkweDkzLCAweGYyLCAweGVkLCAweDQxLCAweGU2LCAweGIxLCAweGRkLCAweGVjLCAweGQ1LCAweGFlLCAweGQ2LCAweDBiLAorCTB4MjEsIDB4MmMsIDB4YzksIDB4Y2UsIDB4MWMsIDB4ZjIsIDB4NDcsIDB4YjQsIDB4MWQsIDB4ZWYsIDB4YzksIDB4YWMsCisJMHhlNywgMHhlYSwgMHg3ZCwgMHgyNywgMHhmOSwgMHhjMSwgMHgyMCwgMHg3OCwgMHhjNSwgMHg3NywgMHhlNSwgMHhhNCwKKwkweDg2LCAweGY5LCAweDA1LCAweGY0LCAweGUxLCAweGM4LCAweGM0LCAweDgwLCAweGZiLCAweGQzLCAweDkzLCAweDNlLAorCTB4YzcsIDB4YzcsIDB4M2MsIDB4YWUsIDB4MmIsIDB4NmQsIDB4OGUsIDB4MWIsIDB4ZjgsIDB4NjgsIDB4OWIsIDB4N2UsCisJMHgyZiwgMHg5OCwgMHg4ZCwgMHg3MSwgMHhkZCwgMHgwMiwgMHgzYywgMHg1ZCwgMHg2YSwgMHhmNywgMHg2ZSwgMHg5MCwKKwkweGRiLCAweGU2LCAweDZjLCAweDlhLCAweDY5LCAweDMxLCAweDM2LCAweGEzLCAweGQxLCAweDY5LCAweDE3LCAweGZlLAorCTB4NjEsIDB4YzQsIDB4YmYsIDB4YjAsIDB4YmEsIDB4ODAsIDB4YjksIDB4ODEsIDB4MGUsIDB4NWIsIDB4MGMsIDB4NGIsCisJMHg4YSwgMHhiMCwgMHgwYywgMHg2YiwgMHg1OCwgMHg2MiwgMHhjMCwgMHhhNSwgMHgwYiwgMHhkOSwgMHg3NywgMHg5YiwKKwkweDFjLCAweDAyLCAweGRlLCAweDg3LCAweDA2LCAweDQ1LCAweDllLCAweDg1LCAweDRkLCAweDc2LCAweGJlLCAweDBhLAorCTB4OWUsIDB4MTksIDB4YzAsIDB4NzMsIDB4ZGUsIDB4ZTcsIDB4NWUsIDB4MDAsIDB4ZTYsIDB4ZjksIDB4ZGUsIDB4YjAsCisJMHg3MCwgMHgyZiwgMHgwMCwgMHg3MSwgMHhkOCwgMHg4MSwgMHhkZiwgMHgyMiwgMHgzMywgMHhkMCwgMHhiZiwgMHgyNywKKwkweGZkLCAweGQ3LCAweDgyLCAweGYxLCAweDE4LCAweDc1LCAweDIzLCAweGRhLCAweDk5LCAweGRiLCAweDFiLCAweDE0LAorCTB4YzgsIDB4ZTcsIDB4NTMsIDB4ZDQsIDB4NDMsIDB4YjUsIDB4ZDIsIDB4YjYsIDB4OGUsIDB4N2UsIDB4ODgsIDB4OTEsCisJMHg5ZiwgMHgzNywgMHhmOCwgMHgxOSwgMHhmNCwgMHhmNSwgMHg1YiwgMHgyYiwgMHhhNSwgMHgzZSwgMHgyZiwgMHhmZCwKKwkweDFkLCAweDc1LCAweGM4LCAweDczLCAweDZkLCAweGRlLCAweDgwLCAweGNlLCAweGViLCAweGVmLCAweDM4LCAweDhjLAorCTB4ZmMsIDB4OGYsIDB4YWYsIDB4NjQsIDB4YmMsIDB4ZGIsIDB4ZjUsIDB4ZDcsIDB4NGIsIDB4ZGIsIDB4MWEsIDB4ZTYsCisJMHg1NSwgMHhmMywgMHhlMCwgMHhhYiwgMHhkYywgMHg4MywgMHg2OSwgMHg3NSwgMHgzOCwgMHg2NCwgMHg1OSwgMHgyOSwKKwkweGVmLCAweDcxLCAweGE3LCAweGRkLCAweDIxLCAweGNjLCAweGM1LCAweDZlLCAweDlmLCAweGIyLCAweGVkLCAweGJmLAorCTB4YTMsIDB4NmUsIDB4NGEsIDB4NmUsIDB4ZjQsIDB4MDcsIDB4OTEsIDB4MzcsIDB4OGQsIDB4YmMsIDB4YzMsIDB4MzYsCisJMHg2ZiwgMHhkMCwgMHhlNiwgMHg2ZCwgMHg0MywgMHhkZSwgMHgzZSwgMHhlMCwgMHhlZiwgMHg2ZSwgMHg5ZCwgMHg5ZSwKKwkweGU1LCAweDZmLCAweDUzLCAweGM3LCAweDViLCAweGQ5LCAweDcxLCAweGUxLCAweDMzLCAweDM3LCAweGY4LCAweDg0LAorCTB4MGIsIDB4NzksIDB4MjUsIDB4YWUsIDB4OGIsIDB4ZGUsIDB4MjYsIDB4NzksIDB4MmYsIDB4NzksIDB4MGIsIDB4N2IsCisJMHhmZCwgMHg2NiwgMHhiMSwgMHgwZSwgMHhiMiwgMHg4OSwgMHg3YiwgMHg4MCwgMHg2OSwgMHhiMywgMHg2ZSwgMHhmMSwKKwkweDVlLCAweDk2LCAweGZmLCAweDQwLCAweGJhLCAweGViLCAweGM5LCAweDM4LCAweDVmLCAweDViLCAweGM5LCAweGI4LAorCTB4ZDgsIDB4ODgsIDB4NGYsIDB4ZmIsIDB4M2EsIDB4OTAsIDB4OWMsIDB4NWUsIDB4M2YsIDB4YTEsIDB4N2YsIDB4NWIsCisJMHg0NCwgMHgzYSwgMHhlOSwgMHg0MSwgMHgzNSwgMHg0NSwgMHhmNCwgMHgzZSwgMHgyZCwgMHg3ZSwgMHg0NywgMHg2MSwKKwkweGY3LCAweDA2LCAweDQyLCAweDlmLCAweDhmLCAweDM2LCAweDVkLCAweGM2LCAweGUzLCAweGRhLCAweDUwLCAweDk4LAorCTB4ZTcsIDB4MjEsIDB4NGYsIDB4NmQsIDB4OGEsIDB4YzAsIDB4MjYsIDB4YWEsIDB4ZjUsIDB4MWQsIDB4MWQsIDB4YTMsCisJMHgyZSwgMHhlOCwgMHg3NSwgMHgwMCwgMHhjNiwgMHhkZiwgMHgzMiwgMHhmMCwgMHg2MywgMHgwMiwgMHhlOSwgMHg0NywKKwkweGRmLCAweGE0LCAweGZkLCAweDY4LCAweDg3LCAweGVmLCAweDFkLCAweDEwLCAweGVlLCAweDY3LCAweDY1LCAweDdhLAorCTB4YmIsIDB4ZjcsIDB4NmQsIDB4OTksIDB4YTcsIDB4ZjMsIDB4MTksIDB4NDksIDB4NjYsIDB4OTQsIDB4MDMsIDB4ZmYsCisJMHg3NSwgMHhhYiwgMHgyMywgMHhmNSwgMHhiMCwgMHgzZCwgMHg2ZSwgMHgzMCwgMHhmYSwgMHhjZCwgMHhlMywgMHg5ZSwKKwkweGM0LCAweDhiLCAweGRhLCAweDU2LCAweDZiLCAweGI0LCAweGYzLCAweDkxLCAweDA1LCAweDZlLCAweGI4LCAweDFmLAorCTB4N2MsIDB4ZTAsIDB4OWUsIDB4ZGQsIDB4N2UsIDB4MjEsIDB4MDksIDB4NmEsIDB4ZDQsIDB4YmEsIDB4NzEsIDB4MTgsCisJMHhiNCwgMHg5MSwgMHg0ZCwgMHgxOSwgMHhkZCwgMHg3OCwgMHhjMywgMHg5YywgMHg2ZSwgMHhmYywgMHhmMywgMHg5NSwKKwkweGU0LCAweDg5LCAweGUxLCAweDcyLCAweDFjLCAweDc1LCAweGY1LCAweDNhLCAweDRhLCAweDgyLCAweDc1LCAweDZiLAorCTB4MzEsIDB4OWYsIDB4ZTcsIDB4ZmQsIDB4ZWMsIDB4MzUsIDB4YTAsIDB4MmYsIDB4YzgsIDB4ZTEsIDB4NjQsIDB4ZTcsCisJMHgyOSwgMHhkNCwgMHgyZCwgMHhhMCwgMHhlZSwgMHhlNCwgMHg1YywgMHg1ZCwgMHg0NywgMHg0NiwgMHg3YywgMHhiZCwKKwkweGVmLCAweDU5LCAweDI2LCAweGNiLCAweDIxLCAweDFkLCAweDI2LCAweGUzLCAweGI3LCAweDZhLCAweDVlLCAweGUwLAorCTB4N2UsIDB4MzAsIDB4MzcsIDB4NzEsIDB4OWYsIDB4NmMsIDB4ZDYsIDB4YjQsIDB4ZGQsIDB4MjcsIDB4ZGMsIDB4MjcsCisJMHhjNSwgMHhiNiwgMHhlZiwgMHgwYiwgMHhkYSwgMHhkNiwgMHgxMCwgMHhiZSwgMHgxMiwgMHhkZSwgMHhhNCwgMHg4ZCwKKwkweDMxLCAweGJjLCAweGMzLCAweGY5LCAweDM3LCAweGYzLCAweDNlLCAweGU0LCAweDEwLCAweGRmLCAweGJmLCAweDFmLAorCTB4ZTQsIDB4MDcsIDB4MzksIDB4MmYsIDB4ZmMsIDB4OWUsIDB4YTcsIDB4YjksIDB4MTEsIDB4ZDAsIDB4NWMsIDB4YzQsCisJMHg3ZiwgMHhiYiwgMHgwYywgMHhlYiwgMHgzZCwgMHgxMCwgMHgyOSwgMHg5OSwgMHhkMCwgMHhmMSwgMHhjYywgMHgwYiwKKwkweGMxLCAweDIzLCAweDBiLCAweGU0LCAweGY4LCAweDQ3LCAweDk0LCAweGExLCAweDIxLCAweGZlLCAweDJlLCAweDI0LAorCTB4ZWEsIDB4NjQsIDB4NjYsIDB4NGQsIDB4OWQsIDB4ZGUsIDB4ZjEsIDB4NDEsIDB4N2MsIDB4OGMsIDB4ZGUsIDB4NzMsCisJMHgzYiwgMHhmOCwgMHhmNSwgMHhmYSwgMHhiOSwgMHhiMSwgMHgwMCwgMHhkZiwgMHhjMCwgMHhlMywgMHg0ZSwgMHg2MywKKwkweGViLCAweDYzLCAweDFjLCAweDE5LCAweGVkLCAweGJmLCAweDY3LCAweDhiLCAweDRhLCAweGVmLCAweDBiLCAweGEyLAorCTB4OGUsIDB4M2YsIDB4MDAsIDB4OWQsIDB4NmEsIDB4ZjYsIDB4YTQsIDB4ZTAsIDB4NWQsIDB4ZTEsIDB4YmMsIDB4MjksCisJMHhlZCwgMHg3MywgMHgxYywgMHgwNCwgMHgwZiwgMHgxZiwgMHhmNCwgMHhiMywgMHg2YiwgMHg2YSwgMHg3NSwgMHhkYiwKKwkweDQ5LCAweGVmLCAweDdhLCAweDZkLCAweDEzLCAweDZlLCAweDk0LCAweDk5LCAweDE0LCAweGRiLCAweDIzLCAweDVlLAorCTB4ZmUsIDB4NDcsIDB4MzAsIDB4ZTQsIDB4Y2QsIDB4YTAsIDB4N2YsIDB4NDMsIDB4ZmYsIDB4NTksIDB4NWYsIDB4YjUsCisJMHhkNCwgMHg0OSwgMHhmNSwgMHgzZSwgMHg1MywgMHhlMiwgMHhjOSwgMHg4NSwgMHhiZCwgMHhkMiwgMHgwMSwgMHhmYywKKwkweDE4LCAweDc4LCAweDczLCAweGU1LCAweGI3LCAweDQ5LCAweDIxLCAweGU2LCAweGRhLCAweGIxLCAweDQ1LCAweGI0LAorCTB4MmYsIDB4MzcsIDB4OTEsIDB4YWEsIDB4ODMsIDB4MmQsIDB4ZjgsIDB4MTcsIDB4YzEsIDB4ZTQsIDB4ODIsIDB4MzEsCisJMHgxZSwgMHhhYywgMHgxYSwgMHhlMywgMHg0YywgMHgwMiwgMHhkOCwgMHg2OCwgMHg4OSwgMHhjYywgMHhjOSwgMHgwMSwKKwkweGY2LCAweDY1LCAweDY0LCAweDUyLCAweDM4LCAweGM2LCAweDNhLCAweDhjLCAweDcxLCAweGM3LCAweGRjLCAweDE4LAorCTB4MGYsIDB4MmYsIDB4MWEsIDB4ZTMsIDB4NjEsIDB4OGMsIDB4MTEsIDB4ZjYsIDB4NDIsIDB4MjksIDB4ZDMsIDB4ZTksCisJMHhjZSwgMHhjZiwgMHhmYiwgMHhkNSwgMHgzNSwgMHg3MywgMHhmMywgMHgyOSwgMHhkYywgMHhlYiwgMHg4NCwgMHhmMSwKKwkweGQzLCAweGE2LCAweGQ4LCAweDA4LCAweDc4LCAweDc0LCAweDViLCAweDkwLCAweDcxLCAweDBlLCAweDY0LCAweDViLAorCTB4NzYsIDB4NGQsIDB4OGQsIDB4MWQsIDB4ZmYsIDB4NzYsIDB4OTYsIDB4MmIsIDB4MWIsIDB4MWMsIDB4OWMsIDB4NGMsCisJMHhiOSwgMHg5ZCwgMHg4ZiwgMHhhMCwgMHhiZiwgMHhiZCwgMHg3NiwgMHg1YywgMHhiZCwgMHhlNSwgMHhhYiwgMHgzMSwKKwkweGFlLCAweDBiLCAweGRmLCAweGMxLCAweDE4LCAweGUwLCAweGIzLCAweDlkLCAweGEwLCAweDBmLCAweDljLCAweDE4LAorCTB4OTIsIDB4MDUsIDB4YjIsIDB4ZWIsIDB4MzMsIDB4ZjMsIDB4NzIsIDB4ZDQsIDB4YzAsIDB4NGMsIDB4ZGIsIDB4YmEsCisJMHgzMCwgMHgwNywgMHhmMywgMHhkZCwgMHg4YiwgMHg2MCwgMHhiZSwgMHgxYiwgMHgzMCwgMHhlZiwgMHhiMywgMHhmMywKKwkweGIyLCAweGFmLCAweDZhLCAweGNmLCAweDYyLCAweDQ4LCAweDQ3LCAweGZjLCAweGZkLCAweGJjLCAweGY1LCAweDQ1LAorCTB4M2UsIDB4MjAsIDB4ZjcsIDB4OTcsIDB4M2EsIDB4ZTUsIDB4Y2IsIDB4OTUsIDB4ZTQsIDB4NTksIDB4YzYsIDB4ZDEsCisJMHhjZiwgMHg1NSwgMHg5MiwgMHhlMywgMHgyMiwgMHg1ZCwgMHhmMiwgMHhjNywgMHhiMCwgMHg3MywgMHhhZSwgMHg4MiwKKwkweDZmLCAweGYxLCAweDM0LCAweGZjLCAweGQ3LCAweDNmLCAweGE5LCAweGY4LCAweGYyLCAweGM0LCAweGRjLCAweDdlLAorCTB4MzgsIDB4ZWEsIDB4YmEsIDB4YjQsIDB4OWMsIDB4ODQsIDB4NGYsIDB4YmIsIDB4ZWQsIDB4NjgsIDB4MWIsIDB4ZjcsCisJMHgyYSwgMHgxMSwgMHhiZSwgMHhiYiwgMHhhOCwgMHg3MywgMHhkYSwgMHg5NCwgMHhlNiwgMHhjNSwgMHhlZiwgMHg2MiwKKwkweGJjLCAweGE3LCAweGE5LCAweDZiLCAweGQ2LCAweGZhLCAweGJlLCAweDc3LCAweGIzLCAweDVhLCAweDQ3LCAweDk5LAorCTB4OTAsIDB4ZmYsIDB4NWEsIDB4ZTQsIDB4MDMsIDB4ZjUsIDB4MjYsIDB4YzYsIDB4OTIsIDB4ZjEsIDB4OWEsIDB4YzksCisJMHgxYiwgMHhkYiwgMHgzYSwgMHgxMiwgMHg3ZCwgMHg0MiwgMHg1YiwgMHg4MiwgMHhmZSwgMHgzNiwgMHg2YywgMHhhMSwKKwkweGQyLCAweGU2LCAweGY4LCAweDVhLCAweGExLCAweDRjLCAweGEyLCAweDVkLCAweDk0LCAweDk2LCAweDA5LCAweGMwLAorCTB4M2UsIDB4MDYsIDB4ODksIDB4NTAsIDB4NjgsIDB4ZjYsIDB4NDcsIDB4N2IsIDB4ZDUsIDB4NDQsIDB4MDMsIDB4NzksCisJMHg3MCwgMHhkYiwgMHgxOSwgMHhkMCwgMHhkNywgMHgzNiwgMHg4YywgMHhhOSwgMHgyYiwgMHg3OSwgMHg3NiwgMHg0NiwKKwkweDY1LCAweDRlLCAweGFjLCAweDk1LCAweDU3LCAweDgyLCAweGExLCAweDY2LCAweDQ3LCAweDllLCAweGQ4LCAweGM0LAorCTB4M2MsIDB4MmQsIDB4YjcsIDB4M2YsIDB4ZDUsIDB4MGIsIDB4ZjksIDB4ZDQsIDB4Y2UsIDB4NzMsIDB4MGIsIDB4MDMsCisJMHhmMiwgMHgyZiwgMHg3NywgMHg4MCwgMHgwNiwgMHg3ZiwgMHhiOCwgMHhlOSwgMHg2YiwgMHhjMSwgMHg2YywgMHhiMywKKwkweDJiLCAweDViLCAweDM3LCAweDI1LCAweGJkLCAweGJjLCAweGMyLCAweDc4LCAweDRhLCAweDE4LCAweDRmLCAweDA5LAorCTB4ZTMsIDB4ZTMsIDB4OTgsIDB4NGIsIDB4MTgsIDB4ZDcsIDB4MTUsIDB4ZjcsIDB4NGEsIDB4ZjUsIDB4MmMsIDB4ODgsCisJMHhjYiwgMHgxYSwgMHgzZiwgMHgyZCwgMHg5MywgMHg3NywgMHg2NSwgMHg4MywgMHhkZCwgMHgyYiwgMHgzNSwgMHg1YywKKwkweDFmLCAweGFlLCAweGIxLCAweDY1LCAweDY0LCAweDNjLCAweDI4LCAweGY4LCAweDdmLCAweDcwLCAweDU1LCAweGI2LAorCTB4MmIsIDB4YjYsIDB4NTgsIDB4ZTcsIDB4ZGMsIDB4MzUsIDB4YWYsIDB4NzMsIDB4NDQsIDB4OWUsIDB4MzMsIDB4ZjMsCisJMHg4NiwgMHgzOSwgMHhmMywgMHhiZCwgMHg0OSwgMHg2ZSwgMHg4NiwgMHg4NywgMHgwZSwgMHhkYywgMHhhYSwgMHhmNywKKwkweDNjLCAweDc3LCAweGUwLCAweDliLCAweDM2LCAweGQ1LCAweGE3LCAweGY1LCAweDNhLCAweGUyLCAweDRjLCAweGY5LAorCTB4MWUsIDB4M2IsIDB4NzcsIDB4ZjcsIDB4NjgsIDB4M2QsIDB4YmIsIDB4NzUsIDB4ZDMsIDB4YTUsIDB4ODAsIDB4ZmIsCisJMHhkYywgMHhiYywgMHg0ZCwgMHhjYiwgMHhjNSwgMHgyMiwgMHg2OCwgMHhlZiwgMHhkNSwgMHg2OSwgMHhkZSwgMHhlNywKKwkweDdhLCAweDc2LCAweDQxLCAweDlmLCAweDEzLCAweDAxLCAweGRlLCAweGU2LCAweGUyLCAweDYyLCAweGY1LCAweDQ4LAorCTB4YTMsIDB4YmUsIDB4ZjgsIDB4NjksIDB4ODMsIDB4NTksIDB4NDcsIDB4YTUsIDB4NmMsIDB4NTgsIDB4ODMsIDB4MzQsCisJMHhkNywgMHhlYywgMHgwNSwgMHg1ZSwgMHg5MCwgMHhmNywgMHhkZiwgMHhlYSwgMHhjZCwgMHg5ZSwgMHg4ZiwgMHhlYSwKKwkweGIyLCAweGUwLCAweDMxLCAweGJkLCAweDJmLCAweDg0LCAweGZiLCAweDAzLCAweDdmLCAweDc5LCAweGE1LCAweGIxLAorCTB4NGQsIDB4YzMsIDB4N2MsIDB4YTYsIDB4ZmYsIDB4MzgsIDB4OTgsIDB4ZDAsIDB4MzEsIDB4MzYsIDB4ZjYsIDB4ZjUsCisJMHg0MywgMHhmYywgMHg1ZSwgMHhiYywgMHg1ZiwgMHgyNCwgMHhiNCwgMHg1ZCwgMHhlYiwgMHg0MCwgMHhmNywgMHhkYSwKKwkweDVmLCAweDE2LCAweDk0LCAweDg5LCAweGU3LCAweDI1LCAweDIyLCAweDEzLCAweDU1LCAweDMwLCAweDRlLCAweDEwLAorCTB4ZWUsIDB4NTIsIDB4ZDcsIDB4YWEsIDB4ZjksIDB4ZDgsIDB4ZGQsIDB4NmEsIDB4YTQsIDB4MTEsIDB4YzYsIDB4NzUsCisJMHg4YiwgMHhmMiwgMHhjOCwgMHgxYiwgMHhhZCwgMHgyYiwgMHg0OSwgMHgzNywgMHhkMywgMHhjMiwgMHhiNCwgMHhmOSwKKwkweDMxLCAweGNkLCAweDY4LCAweGZiLCAweGI5LCAweDZkLCAweDk1LCAweGRlLCAweGZiLCAweGM0LCAweDM1LCAweDQ2LAorCTB4YzYsIDB4MDgsIDB4NjMsIDB4MjYsIDB4ZGYsIDB4ZjUsIDB4ZmYsIDB4NTYsIDB4ZDcsIDB4MTksIDB4OWEsIDB4YWIsCisJMHhhMywgMHhlNywgMHgwMiwgMHhmOSwgMHg2ZSwgMHg1NSwgMHg1ZSwgMHgzNSwgMHhkYywgMHhkNCwgMHg1ZiwgMHg0MywKKwkweDlkLCAweDc1LCAweGQwLCAweDg5LCAweDE3LCAweDUzLCAweGFiLCAweGMzLCAweGJkLCAweGYwLCAweGIwLCAweDIxLAorCTB4YjIsIDB4ZDcsIDB4ZDQsIDB4NWEsIDB4OTksIDB4M2YsIDB4ODEsIDB4NzksIDB4N2QsIDB4MjYsIDB4NjUsIDB4NzgsCisJMHg1MSwgMHhmMywgMHg2MSwgMHhmMSwgMHgzNiwgMHhmOCwgMHhlYiwgMHhhMSwgMHhkZSwgMHhhMCwgMHg5YywgMHgyNiwKKwkweDZmLCAweDIyLCAweGFkLCAweDQyLCAweDlmLCAweGUwLCAweGMyLCAweGVhLCAweDk5LCAweGFlLCAweDU3LCAweDAzLAorCTB4ZWUsIDB4YjMsIDB4N2MsIDB4NDUsIDB4ZGIsIDB4NTEsIDB4NDMsIDB4YjIsIDB4YjAsIDB4ZWQsIDB4ZDEsIDB4N2IsCisJMHg1ZSwgMHhiZiwgMHhlZCwgMHhhMSwgMHg2NSwgMHhkYSwgMHgxZSwgMHhiMiwgMHg2ZCwgMHg4YiwgMHg2YiwgMHhkYSwKKwkweDhlLCAweDVlLCAweGExLCAweGVkLCAweDgxLCAweDM3LCAweDY4LCAweDdiLCAweDcwLCAweDk5LCAweGI2LCAweDA3LAorCTB4YzMsIDB4YjYsIDB4OTUsIDB4NjksIDB4ZGIsIDB4MGIsIDB4ZGIsIDB4NGUsIDB4MmMsIDB4YzIsIDB4YzksIDB4NjcsCisJMHg1ZSwgMHhiZiwgMHhlZCwgMHg3ZCwgMHhjYiwgMHhiNCwgMHhiZCwgMHg2ZiwgMHgxMSwgMHhkYywgMHhjNCwgMHg0OSwKKwkweDJkLCAweDc0LCAweGZmLCAweDNkLCAweGRhLCAweGU2LCAweGFjLCAweDAzLCAweGRmLCAweDVjLCAweDg0LCAweGZjLAorCTB4MzYsIDB4ZmUsIDB4YzgsIDB4ODUsIDB4YmIsIDB4NjYsIDB4Y2IsIDB4ZTAsIDB4MmIsIDB4ZjgsIDB4ZDcsIDB4OTksCisJMHg3MiwgMHgwMywgMHg5ZSwgMHg3MSwgMHhkOCwgMHgzMywgMHgyOCwgMHgwNywgMHg3YiwgMHhiYywgMHgyNiwgMHgxZCwKKwkweGM4LCAweGM5LCAweDZlLCAweDk2LCAweGNkLCAweGM3LCAweDZiLCAweGU3LCAweGY0LCAweGM2LCAweDNkLCAweGU4LAorCTB4OGYsIDB4NmQsIDB4ZmIsIDB4NWUsIDB4YmYsIDB4YmMsIDB4YTYsIDB4ZmIsIDB4Y2IsIDB4OTUsIDB4ZTksIDB4OGYsCisJMHgyMSwgMHhiZCwgMHg0MiwgMHgxZiwgMHg5NywgMHhmNSwgMHg0MiwgMHgxOSwgMHg1OCwgMHg2NywgMHhkNywgMHgzZSwKKwkweDY4LCAweDZiLCAweDMyLCAweDBlLCAweGE3LCAweGVkLCAweDUxLCAweDI5LCAweDk0LCAweDdmLCAweDEyLCAweDRjLAorCTB4ODMsIDB4MmUsIDB4NDYsIDB4ZTYsIDB4NzQsIDB4YzgsIDB4OTMsIDB4YWIsIDB4NjgsIDB4YjMsIDB4OGYsIDB4NTMsCisJMHhiMywgMHg1NCwgMHhjNSwgMHhhMCwgMHg0NiwgMHg3YywgMHhhNiwgMHhmZCwgMHg5OCwgMHg2ZCwgMHhjMiwgMHgwZSwKKwkweDBjLCAweGNiLCAweDMyLCAweDZlLCAweDZjLCAweDYyLCAweDRlLCAweDY3LCAweDIxLCAweDMzLCAweGNkLCAweDllLAorCTB4MGUsIDB4ZmEsIDB4MmEsIDB4NGYsIDB4ODEsIDB4OTcsIDB4ZjcsIDB4NDMsIDB4NzYsIDB4MjQsIDB4ZjMsIDB4MjIsCisJMHgzZCwgMHg4ZCwgMHhlNiwgMHhhYywgMHg0NSwgMHg0YywgMHg3MiwgMHg1ZCwgMHhiZiwgMHg2OSwgMHhmMSwgMHhiOCwKKwkweGVmLCAweGNlLCAweGU1LCAweGNmLCAweDU5LCAweDQwLCAweDNlLCAweDM4LCAweDk0LCAweDkxLCAweGQ3LCAweDM3LAorCTB4OWEsIDB4NzUsIDB4YmIsIDB4YjcsIDB4MzYsIDB4MzIsIDB4MWUsIDB4YTMsIDB4MzYsIDB4NzUsIDB4YWYsIDB4ZDYsCisJMHhmMiwgMHhjNywgMHgwOSwgMHhiZiwgMHhiZiwgMHhiMiwgMHhlOCwgMHgzYiwgMHhhYywgMHhmNywgMHg5MywgMHhkNSwKKwkweDBiLCAweGViLCAweDg1LCAweGU5LCAweDcwLCAweDRkLCAweDE2LCAweGE0LCAweDFmLCAweDU4LCAweGIzLCAweGIwLAorCTB4N2UsIDB4YWMsIDB4NjksIDB4ZTEsIDB4ZjcsIDB4ZTAsIDB4YTIsIDB4ZWYsIDB4Y2YsIDB4MmMsIDB4ZmEsIDB4N2UsCisJMHg2MSwgMHhkMSwgMHhmNywgMHg3NSwgMHg2YiwgMHgxNywgMHg5NSwgMHg1ZiwgMHhmNCwgMHhmZCwgMHhlNSwgMHhiNSwKKwkweGNiLCAweGMzLCAweGZiLCAweDU3LCAweDZiLCAweDE3LCAweGMyLCAweGY1LCAweDk0LCAweDVlLCAweDczLCAweDFkLAorCTB4YWYsIDB4YjgsIDB4YjIsIDB4YmQsIDB4ODgsIDB4N2MsIDB4ZTcsIDB4ZDYsIDB4MTgsIDB4ZjIsIDB4ZTEsIDB4Y2IsCisJMHg1NCwgMHhlNywgMHg3MywgMHg4ZCwgMHhlMywgMHgxZCwgMHhiMSwgMHg4NSwgMHhlZCwgMHhjZCwgMHhkNywgMHhkYiwKKwkweDMxLCAweDVmLCAweDJmLCAweDM1LCAweDVmLCAweGNmLCAweGY4LCAweDIzLCAweDEzLCAweDE1LCAweGU2LCAweDMxLAorCTB4M2QsIDB4NmMsIDB4ZDcsIDB4ZDQsIDB4MWQsIDB4MjksIDB4NzksIDB4ZmEsIDB4M2MsIDB4YzIsIDB4ODAsIDB4M2UsCisJMHg4ZiwgMHg5MCwgMHg4MCwgMHg2ZiwgMHhmNCwgMHg5NCwgMHg4ZSwgMHhlYiwgMHhhZiwgMHg1MSwgMHg0OCwgMHhhZiwKKwkweDM0LCAweGVhLCAweGQ4LCAweGJlLCAweGU4LCAweDMzLCAweDA5LCAweDAzLCAweGIwLCAweGI5LCAweDc4LCAweDBlLAorCTB4MjEsIDB4OTAsIDB4OWQsIDB4MjksIDB4ZjMsIDB4MzYsIDB4ZTcsIDB4MTIsIDB4MGUsIDB4MDcsIDB4YmQsIDB4NWUsCisJMHgxMCwgMHgwYywgMHhmYiwgMHg2NywgMHhhZCwgMHgyYywgMHhjNywgMHhiYiwgMHg2MiwgMHhlYSwgMHhkMCwgMHhkNywKKwkweDdjLCAweDE0LCAweGZhLCAweDY2LCAweGRlLCAweGM3LCAweDdjLCAweDhhLCAweGY2LCAweDNhLCAweDY4LCAweGE2LAorCTB4MWIsIDB4N2EsIDB4MzcsIDB4ZjksIDB4YTQsIDB4NjgsIDB4ZGQsIDB4ZDEsIDB4MDUsIDB4OWQsIDB4ZWIsIDB4ZGQsCisJMHhmYiwgMHgzZSwgMHhkOCwgMHgzYSwgMHg1ZiwgMHgwNiwgMHhhZCwgMHgxZiwgMHg0YiwgMHhmNSwgMHg2OCwgMHhmZiwKKwkweGZmLCAweDFjLCAweDc0LCAweDMxLCAweGUzLCAweDg0LCAweDhmLCAweDY5LCAweGRhLCAweDIyLCAweDhkLCAweDM1LAorCTB4ZTgsIDB4YjMsIDB4NTAsIDB4MjcsIDB4NTMsIDB4NGUsIDB4MzQsIDB4ZGIsIDB4NzUsIDB4ZGUsIDB4YzQsIDB4Y2QsCisJMHg1MywgMHhlZCwgMHhkZSwgMHg3MywgMHhlMCwgMHhiNSwgMHg3ZSwgMHg3ZiwgMHgwMywgMHg2YywgMHg2NiwgMHhkMSwKKwkweDNhLCAweGJmLCAweDUwLCAweDVhLCAweDZmLCAweDZkLCAweDgzLCAweDY2LCAweDE5LCAweDc3LCAweGI5LCAweDU2LAorCTB4OTMsIDB4ZWMsIDB4MTksIDB4MzIsIDB4M2UsIDB4NjYsIDB4M2MsIDB4YTEsIDB4MTgsIDB4MjMsIDB4ZTYsIDB4ZmEsCisJMHgwNSwgMHhjZiwgMHgzOSwgMHg3MCwgMHg5ZCwgMHg5YiwgMHhmMSwgMHg5MCwgMHhmMSwgMHg3YiwgMHg0NywgMHhmYywKKwkweGJjLCAweDE3LCAweGIxLCAweDY3LCAweDIzLCAweGIyLCAweDQ1LCAweDQzLCAweDliLCAweDdiLCAweGI0LCAweGFkLAorCTB4MWEsIDB4MDUsIDB4M2YsIDB4N2QsIDB4MGYsIDB4NzQsIDB4Y2YsIDB4YmEsIDB4YTQsIDB4ZmQsIDB4ZWYsIDB4MDQsCisJMHg5MywgMHhhZSwgMHg4OSwgMHg0ZiwgMHgyOSwgMHhkNCwgMHhjYiwgMHg2YSwgMHg1YywgMHgzZCwgMHgyNSwgMHgwNywKKwkweDRhLCAweGU0LCAweGZmLCAweGE4LCAweDk2LCAweGU1LCAweGJiLCAweDUzLCAweDk0LCAweDA3LCAweDUxLCAweGUwLAorCTB4NzEsIDB4MGEsIDB4ZjgsIDB4NmIsIDB4OTAsIDB4ZGQsIDB4NWQsIDB4NDUsIDB4OTQsIDB4ODksIDB4YzgsIDB4ZDAsCisJMHg0MCwgMHgwMywgMHg3OCwgMHg4ZiwgMHg3NiwgMHgwOSwgMHhkZiwgMHgyZSwgMHhjYSwgMHg3YiwgMHgzMiwgMHg1NSwKKwkweDFjLCAweGQ3LCAweDdiLCAweDllLCAweDFmLCAweDQzLCAweGRkLCAweGM3LCAweGYxLCAweDRjLCAweDE0LCAweGNiLAorCTB4YTgsIDB4ZjMsIDB4YjAsIDB4MmUsIDB4M2YsIDB4MzEsIDB4Y2EsIDB4NzMsIDB4MjIsIDB4MDIsIDB4N2IsIDB4ZmYsCisJMHg0OSwgMHgyOSwgMHg0YywgMHhiNiwgMHhjMSwgMHgyZiwgMHg5OSwgMHgxZSwgMHg3NywgMHhlNywgMHhlMiwgMHhlNCwKKwkweGZmLCAweGE1LCAweDkxLCAweGViLCAweGNjLCAweDg1LCAweGViLCAweGI4LCAweDI3LCAweDQ3LCAweGRjLCAweDgxLAorCTB4Y2QsIDB4YWEsIDB4YjMsIDB4NDksIDB4YWYsIDB4ZjksIDB4ZjQsIDB4NDgsIDB4M2YsIDB4NmMsIDB4OGEsIDB4OWIsCisJMHgyYiwgMHhjZiwgMHhjNCwgMHhjYywgMHhkYSwgMHhjMCwgMHg4MiwgMHhmNSwgMHg4NiwgMHhjMywgMHhjNCwgMHg4YSwKKwkweDNhLCAweGVhLCAweGYyLCAweGRjLCAweGE3LCAweDRjLCAweDljLCAweDgxLCAweGY2LCAweDM5LCAweDFhLCAweGFlLAorCTB4ZTcsIDB4MzAsIDB4Y2QsIDB4OTMsIDB4YjYsIDB4ZWIsIDB4MDAsIDB4ZDcsIDB4OTksIDB4N2YsIDB4ZDIsIDB4ZjIsCisJMHhmNSwgMHg4OSwgMHg0ZCwgMHg2MSwgMHg1ZiwgMHhmOSwgMHg2MCwgMHg2YywgMHg1MywgMHg1ZSwgMHgzZSwgMHg4MSwKKwkweDI3LCAweDc3LCAweDVkLCAweDcyLCAweDM0LCAweGFiLCAweGQ4LCAweGVmLCAweDM3LCAweDAyLCAweGM2LCAweDAyLAorCTB4NTQsIDB4YmEsIDB4NTUsIDB4ZjIsIDB4NGQsIDB4ZDUsIDB4ZmQsIDB4MzMsIDB4YWQsIDB4YzMsIDB4MmIsIDB4YTgsCisJMHhkNywgMHg4MywgMHg2MywgMHgyNiwgMHgxMSwgMHgwMywgMHgwZSwgMHhmMiwgMHg2ZiwgMHgwOCwgMHhjZiwgMHgxNiwKKwkweGNmLCAweDU3LCAweGNiLCAweGMxLCAweDczLCAweGMyLCAweGFlLCAweGQ3LCAweDcwLCAweDBkLCAweDY2LCAweDA1LAorCTB4ZjAsIDB4ZDIsIDB4ODAsIDB4ZjQsIDB4MDksIDB4MTksIDB4MzksIDB4ZmUsIDB4M2IsIDB4MzEsIDB4ZWUsIDB4MTcsCisJMHhhYSwgMHhkMSwgMHg3ZSwgMHhmNSwgMHg3ZCwgMHhmNSwgMHgyNiwgMHgwNiwgMHhmMiwgMHgyYywgMHhjYSwgMHgzMCwKKwkweDdmLCAweDFjLCAweDc1LCAweDkyLCAweGY5LCAweDZjLCAweDY0LCAweGFkLCAweDBjLCAweGU5LCAweDdlLCAweDgzLAorCTB4NDgsIDB4ZGIsIDB4YjYsIDB4N2EsIDB4YmQsIDB4NGYsIDB4NWYsIDB4Y2UsIDB4MzAsIDB4NmUsIDB4MTEsIDB4ZDYsCisJMHg3ZCwgMHg1NiwgMHhlZiwgMHg4MywgMHg3MywgMHhkMywgMHhjOSwgMHg3YywgMHg1ZiwgMHg4NCwgMHhmMiwgMHhhOSwKKwkweDUzLCAweDdhLCAweGI5LCAweGNlLCAweDczLCAweDY2LCAweDVjLCAweGQzLCAweDc2LCAweGZiLCAweDI2LCAweDllLAorCTB4MDcsIDB4ZGQsIDB4MDIsIDB4ZmIsIDB4ZWYsIDB4M2IsIDB4ODAsIDB4ODksIDB4MzAsIDB4OWUsIDB4NDAsIDB4M2EsCisJMHg3YywgMHhjMiwgMHhkNywgMHg4NSwgMHg2MSwgMHhmYSwgMHg0ZCwgMHhjMiwgMHgzMCwgMHhmZCwgMHgyNiwgMHg2MSwKKwkweDIwLCAweDJlLCAweDAwLCAweDQ3LCAweGE1LCAweDdkLCAweDc1LCAweDY4LCAweDUzLCAweDVjLCAweDg1LCAweDcxLAorCTB4MWMsIDB4MmMsIDB4NGQsIDB4YzMsIDB4YmYsIDB4ZDUsIDB4MzEsIDB4OTQsIDB4Y2UsIDB4NjksIDB4NDUsIDB4OWUsCisJMHhmNywgMHhjMCwgMHg3MywgMHhlMCwgMHhhZCwgMHgxMiwgMHg3OCwgMHgwZiwgMHhiNiwgMHhlMSwgMHg5NywgMHg2MSwKKwkweDFiLCAweDNlLCAweDAxLCAweGRiLCAweGYwLCAweDFjLCAweDZjLCAweGMzLCAweGM3LCAweDMxLCAweDM3LCAweDhmLAorCTB4MmQsIDB4ZTAsIDB4ZDUsIDB4OGMsIDB4ZTYsIDB4ZDUsIDB4NDIsIDB4ZTksIDB4MDIsIDB4NzgsIDB4YjUsIDB4ZWIsCisJMHgwYSwgMHhmYywgMHhlOCwgMHhjMiwgMHhjNiwgMHhhNywgMHgwZCwgMHhlZCwgMHhjMCwgMHg5NiwgMHhmZiwgMHhiOCwKKwkweGY2LCAweDhiLCAweDFmLCAweDRjLCAweDhkLCAweGIxLCAweDBlLCAweDY4LCAweDM4LCAweDQ5LCAweDlmLCAweDE2LAorCTB4ZjIsIDB4M2YsIDB4OTksIDB4MDcsIDB4ZWYsIDB4NjEsIDB4YWMsIDB4OGUsIDB4YTMsIDB4YWUsIDB4NWIsIDB4MjMsCisJMHhkNCwgMHgxZiwgMHhlZSwgMHgzNiwgMHhlZSwgMHhlZiwgMHhlNiwgMHg1OCwgMHgxMywgMHg4YiwgMHhmMCwgMHg2NCwKKwkweGY4LCAweDczLCAweDhmLCAweDRmLCAweDNkLCAweDQyLCAweGJlLCAweDRjLCAweDdjLCAweDc2LCAweGM0LCAweGFmLAorCTB4ZTYsIDB4YzUsIDB4MWQsIDB4MWMsIDB4NWYsIDB4ZTAsIDB4NmQsIDB4NWEsIDB4YWUsIDB4ZWUsIDB4N2MsIDB4ZjksCisJMHgzNSwgMHg3MywgMHhlNSwgMHg3NSwgMHhmZiwgMHhhMywgMHhlNCwgMHgzNywgMHhlOCwgMHg2ZSwgMHhlMiwgMHgzZSwKKwkweDkxLCAweDhkLCAweDZjLCAweGIwLCAweGI4LCAweGRmLCAweDJmLCAweDZkLCAweGRiLCAweDYwLCAweGFmLCAweDBmLAorCTB4ODIsIDB4N2UsIDB4YTcsIDB4MDIsIDB4ZjEsIDB4YjcsIDB4ODUsIDB4NmQsIDB4Y2UsIDB4YjcsIDB4ZTMsIDB4ZDksCisJMHg3NiwgMHg3NiwgMHhjMywgMHg5NiwgMHhlZCwgMHhkYiwgMHhjNCwgMHhiNSwgMHg1ZSwgMHhkOCwgMHhmMiwgMHhhOSwKKwkweDcwLCAweDNlLCAweDYwLCAweGY5LCAweGVhLCAweDM5LCAweGE3LCAweDBjLCAweGE1LCAweGVjLCAweDZjLCAweGIwLAorCTB4ZjEsIDB4N2UsIDB4YjYsIDB4NzcsIDB4NjEsIDB4ZDEsIDB4M2MsIDB4NWQsIDB4MGEsIDB4NzgsIDB4Y2UsIDB4NzYsCisJMHhjNCwgMHgxZiwgMHhhYiwgMHhhMiwgMHg5NSwgMHhiZiwgMHhiMiwgMHhiNCwgMHhhMiwgMHgxNiwgMHg4ZCwgMHhlMywKKwkweDljLCAweGE1LCAweDk1LCAweDEwLCAweGRlLCAweDU4LCAweDQ4LCAweDJiLCAweDc1LCAweDIxLCAweGFkLCAweGU0LAorCTB4YzcsIDB4NDMsIDB4NWEsIDB4NjEsIDB4ZGQsIDB4NzMsIDB4MjEsIDB4YWQsIDB4MjQsIDB4YWEsIDB4NjksIDB4MjUsCisJMHgzZiwgMHhlZSwgMHhlMCwgMHg1OSwgMHgwYywgMHgwNywgMHhlOSwgMHg4NSwgMHhlZCwgMHg5MCwgMHg1ZSwgMHgwMCwKKwkweDRiLCAweGE1LCAweDMyLCAweDQ3LCAweDJmLCAweDMxLCAweGI0LCAweDczLCAweGE4LCAweGE0LCAweDM0LCAweGFkLAorCTB4MGMsIDB4YTksIDB4NTAsIDB4NDcsIDB4NzgsIDB4OTgsIDB4NzMsIDB4Y2MsIDB4ZmQsIDB4MTUsIDB4NjksIDB4MjQsCisJMHg2NSwgMHg2OSwgMHg2NCwgMHhmZSwgMHgyYywgMHhkMSwgMHgyMiwgMHhkYSwgMHgwMCwgMHhlZSwgMHg3OSwgMHg1ZSwKKwkweDYwLCAweGIzLCAweGE2LCAweDhkLCAweGZiLCAweDUzLCAweDJmLCAweGEwLCAweGVjLCAweDI4LCAweDY4LCAweDIzLAorCTB4YzQsIDB4YzEsIDB4MDMsIDB4MTYsIDB4MDcsIDB4OGIsIDB4ZTcsIDB4ZjIsIDB4YjQsIDB4YzUsIDB4YzEsIDB4YTgsCisJMHhjNSwgMHg4MSwgMHhlNiwgMHg5NywgMHgzYywgMHhlNywgMHg0YywgMHg2OSwgMHgxYywgMHhkNCwgMHg2OSwgMHgxYywKKwkweDg4LCAweDBhLCAweGViLCAweDllLCAweDVlLCAweDA2LCAweDA3LCAweDJjLCAweDMzLCAweGFhLCAweGM3LCAweDFmLAorCTB4YzEsIDB4ZjgsIDB4ZjcsIDB4NjEsIDB4ZmMsIDB4NGEsIDB4OGYsIDB4OWYsIDB4ZjMsIDB4YzAsIDB4ZjEsIDB4MDMsCisJMHg5NiwgMHhjYSwgMHg3NywgMHhlNiwgMHhjNiwgMHhkZiwgMHg4NCwgMHgzNiwgMHgwZSwgMHg2YSwgMHhkYiwgMHg5OSwKKwkweGYxLCAweDU0LCAweGVhLCAweDQ2LCAweDMzLCAweGZlLCAweGM3LCAweDJhLCAweGU2LCAweDhjLCAweGM5LCAweDYzLAorCTB4NGIsIDB4ZjQsIDB4ZDgsIDB4MGIsIDB4OTYsIDB4MzcsIDB4N2MsIDB4YmQsIDB4Y2UsIDB4YzYsIDB4NzMsIDB4NmQsCisJMHhlNywgMHhhMCwgMHhiYiwgMHhjNiwgMHg1MiwgMHgwOSwgMHg3YiwgMHhlNiwgMHhkNCwgMHhkOCwgMHg0MywgMHg1ZiwKKwkweDRkLCAweDkxLCAweDc3LCAweDNlLCAweGFhLCAweGY3LCAweGZhLCAweDlkLCAweGE1LCAweDVkLCAweDU0LCAweDZhLAorCTB4OTIsIDB4YmUsIDB4YjEsIDB4NmEsIDB4YjgsIDB4MDksIDB4NmYsIDB4M2UsIDB4NTAsIDB4M2UsIDB4NjMsIDB4MzcsCisJMHhmYiwgMHhhMSwgMHgzYiwgMHg0YywgMHhkYywgMHgxYSwgMHhiNCwgMHg4NCwgMHhmNCwgMHg2NCwgMHhiZSwgMHgzNywKKwkweDUyLCAweDI3LCAweGVhLCAweDgxLCAweDBmLCAweDYwLCAweGNjLCAweDJlLCAweDdjLCAweGNjLCAweDc2LCAweDZmLAorCTB4OWIsIDB4YTIsIDB4YWUsIDB4YmIsIDB4YmEsIDB4NGEsIDB4ZDcsIDB4MzUsIDB4NWIsIDB4NWQsIDB4YjcsIDB4ODYsCisJMHhiYSwgMHgwZSwgMHg3MCwgMHgzZiwgMHgyNSwgMHg4NywgMHg0YiwgMHg5YywgMHhiZiwgMHg3YywgMHhhMiwgMHg0ZSwKKwkweGM3LCAweDQwLCAweDFkLCAweDFiLCAweGU3LCAweDRiLCAweGM2LCAweDBmLCAweDZiLCAweDVhLCAweGE2LCAweGNlLAorCTB4NGEsIDB4ZWEsIDB4YjgsIDB4ZTQsIDB4NGMsIDB4ZDcsIDB4M2YsIDB4ZDksIDB4NzUsIDB4MTAsIDB4ZWEsIDB4YjUsCisJMHhlZiwgMHgwNywgMHg3ZiwgMHhiMCwgMHg4YywgMHg1ZSwgMHg4MywgMHhmZSwgMHhkMSwgMHhmNiwgMHg1OSwgMHgwZCwKKwkweDY0LCAweGFkLCAweDljLCAweDZhLCAweGM2LCAweGIzLCAweDlhLCAweGU3LCAweGMxLCAweDNhLCAweDNiLCAweDU0LAorCTB4YmQsIDB4ZDQsIDB4OWMsIDB4NmEsIDB4OTQsIDB4M2QsIDB4NjMsIDB4N2EsIDB4ZGQsIDB4NWMsIDB4ZDQsIDB4MjksCisJMHhlMCwgMHhmZiwgMHgxNCwgMHhjZiwgMHgxNCwgMHg4OCwgMHgzZSwgMHgwMywgMHg5NSwgMHgxYiwgMHg4NSwgMHgzZiwKKwkweDMzLCAweGYxLCAweDk0LCAweGQ5LCAweDFiLCAweDM4LCAweDU2LCAweGEzLCAweDdmLCAweGQzLCAweGM2LCAweDI4LAorCTB4YTQsIDB4MzIsIDB4ZmEsIDB4ZWMsIDB4ZDAsIDB4MWUsIDB4YjQsIDB4ZDksIDB4YmUsIDB4YTksIDB4MTYsIDB4NjMsCisJMHg4ZSwgMHhhMSwgMHgyZSwgMHhmNywgMHgxNiwgMHhhYSwgMHgzNiwgMHg1NywgMHg2YSwgMHhjNSwgMHg5ZCwgMHg4OCwKKwkweGVhLCAweGYzLCAweDRiLCAweDNjLCAweDdmLCAweDlmLCAweGVkLCAweDY5LCAweDQyLCAweDVlLCAweDQ0LCAweGFmLAorCTB4MTUsIDB4ZDQsIDB4OWMsIDB4OWEsIDB4M2YsIDB4YTcsIDB4YWUsIDB4OGUsIDB4OGEsIDB4NWQsIDB4YzMsIDB4NGYsCisJMHg2YiwgMHhiZCwgMHgxMiwgMHgzOSwgMHg0YSwgMHg5ZCwgMHhjMywgMHhmZCwgMHg1NSwgMHgzZCwgMHg5OCwgMHhmNywKKwkweGU1LCAweGY0LCAweDhkLCAweDMxLCAweDYyLCAweGIzLCAweDk4LCAweDNmLCAweDc1LCAweDg2LCAweDY3LCAweDhkLAorCTB4NWIsIDB4ZjEsIDB4MGUsIDB4ZGIsIDB4MGIsIDB4ZjUsIDB4MDgsIDB4NzQsIDB4ZGYsIDB4ZGIsIDB4M2YsIDB4ZTEsCisJMHg0OSwgMHgzZCwgMHhmMCwgMHgzZCwgMHhhMSwgMHg4MCwgMHg2YiwgMHg1NywgMHhkMywgMHg0MiwgMHg1ZSwgMHg4NSwKKwkweGIxLCAweDY5LCAweDQzLCAweDBmLCAweDhmLCAweGJmLCAweDIxLCAweDNmLCAweDkwLCAweDI2LCAweDNhLCAweDZkLAorCTB4NmMsIDB4YzEsIDB4YjcsIDB4MzEsIDB4N2UsIDB4ZDIsIDB4YjYsIDB4YTEsIDB4ODcsIDB4NDcsIDB4NTMsIDB4MTksCisJMHhjNSwgMHhiZCwgMHg1MSwgMHg2NiwgMHgxZCwgMHg5NCwgMHhiNCwgMHg0MSwgMHg5YSwgMHg0ZiwgMHhlOCwgMHhmNSwKKwkweGQxLCAweDhjLCAweGJjLCAweDJjLCAweDk5LCAweGE2LCAweDc2LCAweGQ4LCAweDVkLCAweGZmLCAweGI2LCAweDczLAorCTB4NmMsIDB4ZWUsIDB4MmUsIDB4ZDAsIDB4MzQsIDB4MDcsIDB4ZGQsIDB4YzQsIDB4N2QsIDB4Y2EsIDB4OWQsIDB4ZjIsCisJMHg1ZSwgMHg5ZSwgMHg1NywgMHg5OCwgMHg3MCwgMHhhMCwgMHg5NCwgMHg5ZiwgMHhkMiwgMHg3YiwgMHhiZiwgMHg3NywKKwkweDE0LCAweDU3LCAweGNiLCAweGFkLCAweGE5LCAweGE4LCAweDVkLCAweGU3LCAweGFjLCAweDA1LCAweDFkLCAweDQwLAorCTB4NTAsIDB4OWYsIDB4YWEsIDB4YzUsIDB4MTMsIDB4NzUsIDB4MzgsIDB4N2YsIDB4MTcsIDB4NTMsIDB4OTksIDB4YTQsCisJMHgyMiwgMHhiMywgMHhjMywgMHhlNywgMHg5ZiwgMHg5MSwgMHgyZCwgMHhkZSwgMHgxZSwgMHg3ZCwgMHhjZSwgMHg0ZSwKKwkweDljLCAweGJhLCAweDUzLCAweDdmLCAweGU5LCAweGQxLCAweDA2LCAweDI1LCAweGZkLCAweGNjLCAweGY4LCAweGI1LAorCTB4N2EsIDB4NWQsIDB4YWIsIDB4M2YsIDB4MTUsIDB4MDQsIDB4MzksIDB4Y2MsIDB4NWYsIDB4NDEsIDB4NGMsIDB4ZmMsCisJMHg2YywgMHhjMiwgMHg2NywgMHgxYSwgMHhmZCwgMHhkYSwgMHgwNiwgMHhhNywgMHhmNiwgMHg0YywgMHhhMywgMHg2MywKKwkweDY4LCAweDQ1LCAweDIyLCAweDJhLCAweDVkLCAweGVmLCAweGQ0LCAweDljLCAweGJhLCAweDkzLCAweDczLCAweDA2LAorCTB4YmEsIDB4ZjIsIDB4MWMsIDB4NDMsIDB4NTcsIDB4MzEsIDB4NjcsIDB4OWUsIDB4YWUsIDB4ZDYsIDB4ZDksIDB4ZGYsCisJMHgyYSwgMHg1ZCwgMHgyNywgMHg5OSwgMHg2NCwgMHgxZCwgMHhjNiwgMHhkYiwgMHg1YiwgMHgwYywgMHg2MSwgMHgzYywKKwkweDBjLCAweGI4LCAweDA4LCAweGNmLCAweGRkLCAweDE4LCAweGMzLCAweDMwLCAweDllLCAweDNjLCAweDYwLCAweDAxLAorCTB4YjMsIDB4OWYsIDB4MmEsIDB4MDAsIDB4ZTYsIDB4ODMsIDB4NzgsIDB4MTgsIDB4MjcsIDB4NmIsIDB4NzYsIDB4MjIsCisJMHgxMywgMHhkNSwgMHhmMCwgMHgxMiwgMHhjNiwgMHgxZiwgMHg1YiwgMHg3OCwgMHg1ZiwgMHgwZiwgMHg1NiwgMHg0ZiwKKwkweDY2LCAweGJhLCAweDhiLCAweDgwLCAweDg3LCAweDcwLCAweGRlLCAweDA3LCAweDE4LCAweDY5LCAweDk3LCAweDhlLAorCTB4ZTIsIDB4ZGIsIDB4MDMsIDB4N2MsIDB4NjMsIDB4MTYsIDB4MjYsIDB4ZDAsIDB4ZTMsIDB4ZDgsIDB4NDMsIDB4ZjMsCisJMHhiZiwgMHg4YiwgMHhiNCwgMHg5MywgMHg4ZiwgMHhkOSwgMHhlZiwgMHhkNiwgMHg0NSwgMHgzMiwgMHhlMCwgMHgxNSwKKwkweDg3LCAweDc4LCAweDFlLCAweDI5LCAweGJkLCAweGU2LCAweGMwLCAweDBlLCAweDAwLCAweGRmLCAweGJmLCAweGU0LAorCTB4NDQsIDB4Y2UsIDB4YzQsIDB4ZTUsIDB4NTAsIDB4OTEsIDB4MzEsIDB4ODQsIDB4ZTMsIDB4MGUsIDB4ZTcsIDB4NDEsCisJMHhmOSwgMHg1NywgMHhhMSwgMHg0YywgMHg1YywgMHhjOSwgMHhjNCwgMHhkNSwgMHg3OCwgMHhkZSwgMHg4MiwgMHg2NywKKwkweDAzLCAweDllLCAweDhkLCAweDc4LCAweGQ2LCAweGUzLCAweDY5LCAweGM1LCAweGYzLCAweDJkLCAweDk0LCAweDUzLAorCTB4YjEsIDB4M2EsIDB4ZTEsIDB4N2UsIDB4ZDUsIDB4MTYsIDB4YTUsIDB4MzQsIDB4MWYsIDB4NzEsIDB4Y2YsIDB4YzIsCisJMHg2NSwgMHhjMCwgMHhlNSwgMHgyYiwgMHhkMCwgMHgzYiwgMHgxZSwgMHg5ZSwgMHhmMSwgMHhmOCwgMHgzYSwgMHhmYSwKKwkweDk4LCAweGM1LCAweGQzLCAweGE5LCAweGU0LCAweDRjLCAweDE3LCAweDllLCAweDE0LCAweDllLCAweDZlLCAweDNjLAorCTB4M2QsIDB4NzgsIDB4ZDIsIDB4NzgsIDB4NWUsIDB4NzUsIDB4MGMsIDB4Y2YsIDB4NWQsIDB4MDIsIDB4YmUsIDB4NDIsCisJMHgxZSwgMHgwMSwgMHhjZSwgMHgxNywgMHhmMCwgMHg5YywgMHhlNywgMHhiYywgMHgwOSwgMHg5ZSwgMHg3MywgMHgyYywKKwkweGNmLCAweDM5LCAweGYzLCAweDNjLCAweDU3LCAweGViLCAweGE4LCAweDYzLCAweGY1LCAweDRlLCAweGU0LCAweDE4LAorCTB4N2QsIDB4ODUsIDB4NWEsIDB4YzcsIDB4ZjAsIDB4N2YsIDB4NDQsIDB4N2EsIDB4MDcsIDB4NDEsIDB4NGIsIDB4YzcsCisJMHgzMCwgMHg2NywgMHhjNywgMHg0OCwgMHg1NywgMHgyZSwgMHhkMiwgMHhjNywgMHgxNiwgMHhmNSwgMHgzYiwgMHhmYSwKKwkweDI2LCAweGZhLCAweDNkLCAweDYxLCAweGZiLCAweDdkLCAweGI4LCAweGFhLCAweGRmLCAweDgzLCAweDY4LCAweGZiLAorCTB4M2UsIDB4ZGIsIDB4ZWYsIDB4YzEsIDB4YWEsIDB4N2UsIDB4NDEsIDB4MmIsIDB4YzcsIDB4ZjIsIDB4NzgsIDB4NDgsCisJMHgxNywgMHgyMywgMHg0OCwgMHgwZiwgMHg2NSwgMHhjMiwgMHhkZCwgMHg2YiwgMHhhNCwgMHhiZSwgMHg0NiwgMHg5ZiwKKwkweDI3LCAweDhkLCAweGY5LCAweDM1LCAweDczLCAweGJhLCAweDMxLCAweDUzLCAweGE1LCAweDFmLCAweDdlLCAweDE2LAorCTB4ZmQsIDB4MzgsIDB4NWMsIDB4YTIsIDB4OGQsIDB4MzgsIDB4NWQsIDB4MjUsIDB4MTcsIDB4ZTgsIDB4ZmIsIDB4MDQsCisJMHg3MiwgMHg1YywgMHhmYiwgMHgzOSwgMHhmNCwgMHg3OSwgMHhlOCwgMHhmZiwgMHgyYywgMHhiNiwgMHhhZCwgMHgzZSwKKwkweGFlLCAweGY3LCAweGU3LCAweGRlLCAweDU1LCAweDZjLCAweDk1LCAweDRmLCAweDE0LCAweDY5LCAweDEzLCAweDkyLAorCTB4NWUsIDB4ODIsIDB4NjAsIDB4Y2YsIDB4MzYsIDB4ZGEsIDB4YTcsIDB4ZjksIDB4NjAsIDB4OWQsIDB4OWYsIDB4ZDQsCisJMHhiMSwgMHhiNSwgMHg0ZiwgMHgyZSwgMHhkNSwgMHgxOSwgMHhhMywgMHhiZCwgMHhmMCwgMHhjZCwgMHhiMywgMHg0NywKKwkweDNmLCAweDA4LCAweDlkLCAweDUxLCAweDAzLCAweGI4LCAweDlmLCAweGQyLCAweDc3LCAweDgwLCAweGVjLCAweDFhLAorCTB4NTUsIDB4MjMsIDB4NmIsIDB4MjUsIDB4MmUsIDB4MzcsIDB4MTcsIDB4NmIsIDB4NjEsIDB4ZjcsIDB4MzAsIDB4NTYsCisJMHg1ZSwgMHgyZiwgMHhlZCwgMHhkYiwgMHhhMiwgMHhlNiwgMHg2YywgMHg4ZCwgMHgxNywgMHhjMywgMHg2ZiwgMHhjZiwKKwkweDljLCAweGY1LCAweDg5LCAweGM1LCAweDkxLCAweDFmLCAweDY5LCAweGEyLCAweDFjLCAweDhjLCAweGY5LCAweGVmLAorCTB4ZDQsIDB4ZmIsIDB4MjYsIDB4ZGIsIDB4YjYsIDB4ZDEsIDB4NmUsIDB4YjksIDB4NDEsIDB4ZWIsIDB4NzAsIDB4NzcsCisJMHg4OSwgMHg5ZCwgMHhhNCwgMHg1YSwgMHgzYywgMHg5OSwgMHhiNywgMHhkMSwgMHg3NiwgMHgxNywgMHg5MywgMHgwOSwKKwkweGMyLCAweGY1LCAweDkwLCAweDcwLCAweDNmLCAweGMxLCAweDdlLCAweDI5LCAweGE0LCAweDFhLCAweDI1LCAweDkyLAorCTB4ZTYsIDB4YmEsIDB4NWMsIDB4YjIsIDB4OTMsIDB4YjYsIDB4ZDEsIDB4YzQsIDB4OTgsIDB4NjcsIDB4Y2YsIDB4OWUsCisJMHhhYywgMHg5NiwgMHgwYiwgMHhiYSwgMHg5ZiwgMHg1YSwgMHgwZCwgMHhhMywgMHgzOSwgMHg4ZiwgMHhjNiwgMHgzNSwKKwkweDJmLCAweDllLCAweDgxLCAweDcyLCAweGYxLCAweDZlLCAweGQwLCAweDdhLCAweDY3LCAweGEyLCAweGNjLCAweGIzLAorCTB4NGUsIDB4ZjAsIDB4OTcsIDB4Y2EsIDB4MzEsIDB4N2QsIDB4YzYsIDB4ZDQsIDB4N2IsIDB4M2IsIDB4ZmMsIDB4ZDgsCisJMHhmMiwgMHgwNiwgMHhkOSwgMHgzZCwgMHhiNiwgMHg4MiwgMHhlYiwgMHgyOCwgMHhiMSwgMHhiNSwgMHhkMCwgMHgxZiwKKwkweGFjLCAweGQzLCAweGI2LCAweDBkLCAweGZlLCAweGRmLCAweGY4LCAweDQ2LCAweDc5LCAweDdjLCAweDljLCAweDZkLAorCTB4YjcsIDB4YzgsIDB4ZTQsIDB4OTQsIDB4MzgsIDB4ZGUsIDB4ZGIsIDB4NTcsIDB4YTIsIDB4OGMsIDB4YzcsIDB4ZjEsCisJMHgwOCwgMHhmNywgMHgzYywgMHhiNSwgMHg2ZCwgMHgxMywgMHhlNSwgMHhiZCwgMHhkZCwgMHg5NSwgMHhmMywgMHhkZCwKKwkweDExLCAweGJkLCAweDI2LCAweGUzLCAweDgyLCAweDRlLCAweGQ4LCAweGRlLCAweGY5LCAweGVlLCAweDU2LCAweDM5LAorCTB4M2IsIDB4MDUsIDB4OWEsIDB4ODAsIDB4ZGMsIDB4ZWYsIDB4M2IsIDB4NDUsIDB4OTgsIDB4NDQsIDB4YjYsIDB4NGYsCisJMHhjMCwgMHg1ZSwgMHg5MCwgMHg3NiwgMHgzYywgMHhhMCwgMHgwZiwgMHhjOCwgMHhlZiwgMHg1YiwgMHhiYiwgMHhkOSwKKwkweDE3LCAweGY0LCAweDEyLCAweDc0LCAweDVjLCAweGRiLCAweDM2LCAweDIzLCAweDBiLCAweDMyLCAweDEzLCAweDM1LAorCTB4NDgsIDB4NjcsIDB4YmIsIDB4ZjAsIDB4MGYsIDB4MDcsIDB4ZDksIDB4NGUsIDB4NTgsIDB4NTcsIDB4NjEsIDB4NGMsCisJMHhiNSwgMHg5YSwgMHg1ZSwgMHg2NiwgMHgxNywgMHhlOSwgMHg4ZiwgMHg3MywgMHgzZiwgMHg5NywgMHhmZCwgMHhjZCwKKwkweDM2LCAweDNhLCAweDQxLCAweDJiLCAweGJlLCAweGRlLCAweGMzLCAweDYzLCAweDZjLCAweDJiLCAweGNlLCAweDA5LAorCTB4NmQsIDB4MjIsIDB4ZGEsIDB4NTUsIDB4ZDcsIDB4NmEsIDB4ZmIsIDB4NjIsIDB4YjIsIDB4YzIsIDB4MTksIDB4ZTQsCisJMHhkYSwgMHg0OCwgMHgzOCwgMHg0NywgMHg3MSwgMHgzOSwgMHg1OSwgMHg5YSwgMHg5YiwgMHhhNywgMHgwZCwgMHgzNSwKKwkweDBiLCAweGU3LCAweDg5LCAweGI0LCAweDkyLCAweDFhLCAweGIyLCAweGI2LCAweGM3LCAweDhjLCAweDNjLCAweDBmLAorCTB4YmIsIDB4YWMsIDB4NTMsIDB4Y2YsIDB4ZDksIDB4MGMsIDB4NmMsIDB4NTksIDB4M2IsIDB4NjcsIDB4ZGEsIDB4OWUsCisJMHgyZCwgMHg4NCwgMHg3MywgMHgzNiwgMHgwMCwgMHg4ZCwgMHg1MywgMHhiZSwgMHg0MSwgMHhjZiwgMHg5OSwgMHgwNywKKwkweGJhLCAweGM5LCAweDAzLCAweGVmLCAweDc5LCAweGNjLCAweDUzLCAweDFlLCAweDczLCAweDk0LCAweDJmLCAweGI3LAorCTB4YzgsIDB4YzQsIDB4NzEsIDB4ZDUsIDB4NWEsIDB4MjMsIDB4OTIsIDB4ZDgsIDB4ZWQsIDB4YjcsIDB4YzgsIDB4ZjAsCisJMHgxNCwgMHg2MywgMHgwNSwgMHgxYiwgMHg2MCwgMHg4MywgMHg2ZCwgMHhjNCwgMHhkMywgMHg4YSwgMHg2ZiwgMHhkNiwKKwkweGUzLCAweDFkLCAweDFmLCAweDBhLCAweDc1LCAweGViLCAweDk2LCAweGQ4LCAweDU5LCAweDY3LCAweGQxLCAweGY3LAorCTB4ZDMsIDB4YzAsIDB4YzMsIDB4YTMsIDB4YzAsIDB4YzMsIDB4M2MsIDB4ZWYsIDB4YmMsIDB4NTAsIDB4MTUsIDB4NWYsCisJMHhlMiwgMHg1OCwgMHhiNSwgMHgwZSwgMHhjNSwgMHg3OCwgMHg2MywgMHg3YSwgMHgzZSwgMHg3NSwgMHg5YywgMHhhOSwKKwkweDU0LCAweGZiLCAweDY2LCAweGVjLCAweGE5LCAweDM4LCAweGVkLCAweGE5LCAweGRjLCAweGE4LCAweDY3LCAweGNlLAorCTB4NjAsIDB4MGQsIDB4YzAsIDB4NzcsIDB4ZjIsIDB4ZjcsIDB4NjksIDB4NWEsIDB4MWYsIDB4MWEsIDB4MjcsIDB4NWMsCisJMHhkMSwgMHgxMCwgMHhhZSwgMHgwNSwgMHg3MywgMHhjNiwgMHgzMywgMHhiMywgMHg0YiwgMHhlMywgMHgxOCwgMHgyZiwKKwkweGNjLCAweGVkLCAweDExLCAweDg3LCAweDJlLCAweDk3LCAweGQxLCAweDE0LCAweGUzLCAweDI0LCAweGFkLCAweGNiLAorCTB4YzAsIDB4ZjQsIDB4OTQsIDB4YjYsIDB4NjEsIDB4NDUsIDB4OWQsIDB4OTYsIDB4MDMsIDB4MjUsIDB4OWUsIDB4YjcsCisJMHhlNSwgMHgxYSwgMHhjYywgMHhlZiwgMHgzMSwgMHg3ZSwgMHhkNCwgMHgzOSwgMHgyMSwgMHhjNywgMHhkMCwgMHgzNywKKwkweGQ3LCAweGM1LCAweDk1LCAweDhkLCAweGNmLCAweGFjLCAweGIyLCAweDdiLCAweGYyLCAweGFhLCAweDYzLCAweDM0LAorCTB4NjYsIDB4ZGQsIDB4N2MsIDB4ZTEsIDB4ZDksIDB4OTMsIDB4ZTQsIDB4YzAsIDB4YWMsIDB4NWUsIDB4NzcsIDB4ZTUsCisJMHg5YSwgMHhhMSwgMHg4YywgMHg0NiwgMHhhMCwgMHhmZCwgMHg3NiwgMHg3NywgMHgyNywgMHg3YiwgMHhjYywgMHg1OSwKKwkweGMzLCAweDg0LCAweGY0LCAweDk3LCAweGNjLCAweGY4LCAweDJmLCAweGVhLCAweDdkLCAweDkzLCAweDY2LCAweDdmLAorCTB4YjgsIDB4ZDksIDB4NTMsIDB4YjksIDB4NWYsIDB4MmUsIDB4YTYsIDB4YTIsIDB4NTUsIDB4NzMsIDB4NWIsIDB4MjcsCisJMHhjMywgMHhjMCwgMHg4NSwgMHg1ZSwgMHhjYiwgMHg4NCwgMHg1ZCwgMHg5YywgMHhlYiwgMHg3ZSwgMHhiYywgMHg4OSwKKwkweDY3LCAweGQxLCAweGEyLCAweDk4LCAweDlmLCAweGMyLCAweDM4LCAweGNmLCAweGE3LCAweGIzLCAweGRkLCAweDJiLAorCTB4YjUsIDB4NDUsIDB4MzEsIDB4Y2IsIDB4YjMsIDB4NGUsIDB4OTAsIDB4OTUsIDB4NmYsIDB4ZGQsIDB4MTIsIDB4YWYsCisJMHhkNywgMHhmOSwgMHgyYiwgMHhlYywgMHg5OSwgMHgxNiwgMHhkOCwgMHgwZCwgMHhiYiwgMHgwMiwgMHhmOSwgMHgzMywKKwkweGU4LCAweGM5LCAweGQzLCAweDc2LCAweDRjLCAweDA5LCAweDFkLCAweDkzLCAweDkyLCAweGUwLCAweDdjLCAweDJhLAorCTB4NmUsIDB4ZTMsIDB4Y2UsIDB4MWMsIDB4Y2IsIDB4OTgsIDB4YTUsIDB4NmYsIDB4NjMsIDB4ZmYsIDB4Y2MsIDB4ZGIsCisJMHhkMCwgMHg1ZCwgMHg5YSwgMHhkNiwgMHgxZiwgMHhkNywgMHhiMiwgMHhiMCwgMHhjYiwgMHhkYSwgMHhjZSwgMHgzYSwKKwkweDhlLCAweDczLCAweDQyLCAweGY0LCAweDFlLCAweGFjLCAweGQwLCAweDM3LCAweGVhLCAweGE4LCAweGYyLCAweDBiLAorCTB4OGMsIDB4MmYsIDB4NTcsIDB4MTgsIDB4NWIsIDB4NGUsIDB4NDYsIDB4Y2QsIDB4ZmIsIDB4ODQsIDB4ZjQsIDB4ZTUsCisJMHhmNiwgMHg2YywgMHhlMiwgMHhkZCwgMHgzMCwgMHhhMSwgMHgyZiwgMHhkNywgMHg2NSwgMHg3ZCwgMHhiOSwgMHg0NiwKKwkweGVkLCAweGNiLCAweDk5LCAweGQ4LCAweDQzLCAweGUzLCAweDljLCAweDJmLCAweDU3LCAweDE4LCAweGNiLCAweDgzLAorCTB4NTYsIDB4NmEsIDB4ZWQsIDB4NTksIDB4MDksIDB4NjMsIDB4MGIsIDB4MGQsIDB4MTcsIDB4NWQsIDB4YmQsIDB4NmYsCisJMHgyNCwgMHgzNywgMHhhMCwgMHhlMCwgMHgzNywgMHgxOCwgMHgxZiwgMHg4YiwgMHhiMSwgMHgwYSwgMHhhNSwgMHhmZSwKKwkweGNlLCAweGZhLCAweDE3LCAweDFiLCAweDI0LCAweGQzLCAweGJjLCAweDAyLCAweGUzLCAweDdlLCAweDRhLCAweGNmLAorCTB4YjksIDB4NTksIDB4YzMsIDB4ODIsIDB4NWMsIDB4MWIsIDB4NjQsIDB4Y2MsIDB4ODcsIDB4NjcsIDB4NDcsIDB4MzUsCisJMHg3ZiwgMHgyNSwgMHg3YSwgMHgyMywgMHg5ZCwgMHhjNiwgMHg5ZSwgMHhmNSwgMHgxMywgMHg2YiwgMHhhNSwgMHhmZSwKKwkweGI4LCAweDUzLCAweDE4LCAweDhmLCAweGRhLCAweDdlLCAweDEzLCAweDgwLCAweGE5LCAweDA2LCAweDczLCAweGYzLAorCTB4NGUsIDB4MmIsIDB4OTMsIDB4ZDksIDB4ZjcsIDB4M2IsIDB4ZWEsIDB4MTgsIDB4MWIsIDB4OTgsIDB4MmEsIDB4OWEsCisJMHgxOCwgMHg2MCwgMHg1ZiwgMHgzMSwgMHgxMiwgMHg5ZSwgMHg1YiwgMHg1NywgMHg1YywgMHg0NywgMHhjZSwgMHgwYywKKwkweGFlLCAweDAwLCAweDJjLCAweDJiLCAweDk2LCAweGI1LCAweDU5LCAweDFmLCAweDdiLCAweDQzLCAweDFkLCAweDQ1LAorCTB4OWEsIDB4N2EsIDB4NGEsIDB4ZWYsIDB4MmYsIDB4NWMsIDB4ZDksIDB4OWQsIDB4ZGMsIDB4YTksIDB4Y2YsIDB4MjMsCisJMHhlOSwgMHg1OCwgMHg2MiwgMHg1ZSwgMHhiOCwgMHg3ZiwgMHhmNywgMHg5YiwgMHhmMiwgMHgzNiwgMHgyZCwgMHhmYiwKKwkweDBmLCAweGE0LCAweGE4LCAweGM3LCAweGI2LCAweGU5LCAweGRmLCAweGI1LCAweGU5LCAweDIwLCAweDM4LCAweGRmLAorCTB4ZmQsIDB4MmMsIDB4NmMsIDB4MTYsIDB4ZGYsIDB4ZmIsIDB4OTYsIDB4YjQsIDB4YzcsIDB4N2IsIDB4YjUsIDB4MGQsCisJMHg4NSwgMHhiOSwgMHgxYSwgMHhhYywgMHg5NywgMHgxNSwgMHhmZSwgMHhiOCwgMHhkZCwgMHhhYiwgMHg2OCwgMHhkNiwKKwkweDAzLCAweDBiLCAweGMyLCAweGZiLCAweDE3LCAweDNhLCAweDZjLCAweDVlLCAweDNlLCAweGE4LCAweDA3LCAweDNkLAorCTB4N2QsIDB4NDQsIDB4OGMsIDB4YWMsIDB4YzksIDB4Y2QsIDB4Y2IsIDB4MWEsIDB4ZWUsIDB4YTcsIDB4Y2IsIDB4OTAsCisJMHhhMCwgMHhkZCwgMHgyMywgMHg5MiwgMHhlNCwgMHhkZCwgMHg0OSwgMHhlYywgMHhiYiwgMHgyMCwgMHg1NywgMHg0MSwKKwkweDNmLCAweGIzLCAweDFlLCAweDZkLCAweDU2LCAweDdlLCAweDczLCAweDBmLCAweDhhLCAweGVmLCAweDFkLCAweDg0LAorCTB4OGUsIDB4YjksIDB4NjEsIDB4YTksIDB4OGUsIDB4ODksIDB4ZDMsIDB4YmYsIDB4Y2YsIDB4OGQsIDB4ZDIsIDB4NDcsCisJMHg1YywgMHg4OSwgMHgzYSwgMHgyZCwgMHhmMiwgMHhkMSwgMHhiMSwgMHhkZiwgMHg1YSwgMHg0YiwgMHgxZSwgMHgxYiwKKwkweDgyLCAweDdjLCAweDU3LCAweGY3LCAweDg3LCAweGU3LCAweDJlLCAweDk5LCAweGM2LCAweDdjLCAweGI2LCAweDViLAorCTB4MjcsIDB4ODksIDB4ZjcsIDB4NzksIDB4ZjIsIDB4YzUsIDB4NGEsIDB4MzIsIDB4MzEsIDB4MGIsIDB4MWQsIDB4MzUsCisJMHhlNCwgMHgwYywgMHhiNywgMHg5YSwgMHhkOCwgMHhlOSwgMHhhNywgMHhkNiwgMHg5YSwgMHg3MywgMHg1YSwgMHhmNSwKKwkweGMwLCAweDY5LCAweDE4LCAweDRmLCAweGFkLCAweGE2LCAweGRkLCAweDU5LCAweDJiLCAweDk3LCAweDgzLCAweGEwLAorCTB4YmUsIDB4NWIsIDB4Y2IsIDB4ZTIsIDB4OWQsIDB4OTQsIDB4YzUsIDB4MDcsIDB4NTIsIDB4MWQsIDB4ODYsIDB4MDcsCisJMHhiNCwgMHhlZiwgMHhjNCwgMHgzZCwgMHgwMCwgMHhjMCwgMHg0MywgMHhiNywgMHhjYiwgMHhiZCwgMHhkMCwgMHg5NiwKKwkweDRmLCAweGZkLCAweGNjLCAweDhjLCAweDk1LCAweDRmLCAweGNhLCAweDU5LCAweGNhLCAweDlmLCAweDZhLCAweDZiLAorCTB4NzQsIDB4ODEsIDB4ZWMsIDB4M2QsIDB4MzQsIDB4NDYsIDB4YmQsIDB4OWMsIDB4OWEsIDB4ZmUsIDB4MjYsIDB4ZTQsCisJMHg1NSwgMHg0ZSwgMHhlMywgMHhhMSwgMHg0NSwgMHhlZSwgMHgxYiwgMHg5MywgMHhjYywgMHg0NSwgMHhlOCwgMHhhYywKKwkweGMyLCAweGQ0LCAweDQyLCAweDFlLCAweDVkLCAweGRhLCAweDFlLCAweGM3LCAweDdhLCAweDdhLCAweGFkLCAweGYxLAorCTB4NzEsIDB4MTcsIDB4OGUsIDB4NzUsIDB4OWEsIDB4N2IsIDB4OGMsIDB4ZjQsIDB4NTgsIDB4YjksIDB4MzcsIDB4ZmYsCisJMHg5YywgMHgxZCwgMHhlYiwgMHhjYSwgMHg3MCwgMHhhYywgMHgzZCwgMHgwYiwgMHhjNywgMHgxYSwgMHhmYSwgMHhmOCwKKwkweGExLCAweGZjLCAweDRkLCAweGU4LCAweGIzLCAweDQ5LCAweGZhLCAweDRjLCAweGNjLCAweGQ4LCAweDRhLCAweGU5LAorCTB4MWQsIDB4NmQsIDB4YjQsIDB4NzIsIDB4ZDMsIDB4ODMsIDB4MGUsIDB4ZTIsIDB4NzksIDB4YTEsIDB4ZTksIDB4Y2YsCisJMHg3OSwgMHg2MiwgMHg3MSwgMHhhNiwgMHg4OCwgMHgwNywgMHhjYSwgMHhkYywgMHgyNiwgMHg3ZCwgMHg5ZSwgMHg3MSwKKwkweDAyLCAweDdlLCAweGQ2LCAweDg3LCAweDhiLCAweDJjLCAweDFiLCAweGU2LCAweDVmLCAweDI5LCAweDQ2LCAweDFjLAorCTB4ZmEsIDB4ZDYsIDB4ZjQsIDB4OWYsIDB4M2EsIDB4OTcsIDB4YzQsIDB4MTYsIDB4NGMsIDB4MWMsIDB4OTgsIDB4ZjEsCisJMHg1ZiwgMHg3MywgMHhjZiwgMHgwMiwgMHhmNywgMHg3ZCwgMHhkZiwgMHgwMSwgMHhkZSwgMHhmYSwgMHhlZCwgMHg2MiwKKwkweGIyLCAweDI3LCAweDFiLCAweGExLCAweDNjLCAweDlkLCAweDk1LCAweDQzLCAweDk1LCAweDNlLCAweDY5LCAweGQzLAorCTB4NjcsIDB4ZWQsIDB4ZGYsIDB4MzAsIDB4NDYsIDB4OWMsIDB4YTksIDB4OGUsIDB4MTEsIDB4OGIsIDB4NjMsIDB4NjIsCisJMHhjNCwgMHgzYiwgMHg3ZiwgMHg4ZSwgMHgxOCwgMHhiMSwgMHgzOCwgMHgyNiwgMHg0NiwgMHhiYywgMHg5YywgMHg5ZiwKKwkweDM1LCAweDUyLCAweDlhLCAweGM1LCAweGI4LCAweGVhLCAweDIxLCAweDUzLCAweDk0LCAweDkzLCAweDliLCAweDZhLAorCTB4YzAsIDB4YmIsIDB4MTYsIDB4NmYsIDB4YzAsIDB4MzIsIDB4NTYsIDB4YzAsIDB4ZGIsIDB4YzMsIDB4ZmIsIDB4MjAsCisJMHhkZSwgMHgzMSwgMHgxOSwgMHg5OSwgMHhkMywgMHgxZCwgMHhiMywgMHg5MCwgMHgxZiwgMHhkNCwgMHg2OSwgMHhhYywKKwkweDZiLCAweGZjLCAweDgyLCAweGM5LCAweDcyLCAweDMzLCAweGNhLCAweDVkLCAweDcyLCAweDI2LCAweDU4LCAweGFmLAorCTB4ZDQsIDB4MjgsIDB4YzMsIDB4NjMsIDB4OTQsIDB4ZGQsIDB4NGQsIDB4MzIsIDB4M2EsIDB4MTYsIDB4ZGEsIDB4YjgsCisJMHg5ZiwgMHg1ZCwgMHhjZiwgMHhiNSwgMHg4MSwgMHgyMSwgMHgwOSwgMHg2ZCwgMHhkOCwgMHg2NywgMHhkNiwgMHg5YiwKKwkweGI1LCAweGRiLCAweDJkLCAweDMxLCAweGE5LCAweDVmLCAweDhkLCAweDM5LCAweDM4LCAweGVlLCAweDVjLCAweDFjLAorCTB4NWYsIDB4YmQsIDB4YzAsIDB4OTYsIDB4NGQsIDB4ZDgsIDB4ZDgsIDB4ZTAsIDB4YjgsIDB4ZDUsIDB4YzEsIDB4Y2IsCisJMHhjYiwgMHg4OCwgMHhlYSwgMHhmOSwgMHg4ZiwgMHhkYiwgMHg3MywgMHhiYywgMHg1MSwgMHg3YiwgMHhkNywgMHg1ZiwKKwkweDQyLCAweGNmLCAweGNmLCAweDQwLCAweDY1LCAweDE2LCAweGZkLCAweGFkLCAweDU3LCAweDk5LCAweDcxLCAweDhlLAorCTB4NzMsIDB4ZWUsIDB4N2UsIDB4MWUsIDB4YzgsIDB4YzUsIDB4NTYsIDB4MzUsIDB4MzQsIDB4YmUsIDB4ODAsIDB4MmUsCisJMHg0MSwgMHhiNywgMHgxYywgMHg5YiwgMHgwMywgMHhkYSwgMHhiZCwgMHg1NywgMHgyNiwgMHg0NiwgMHgwOSwgMHg1ZiwKKwkweDQ3LCAweDNjLCAweGEyLCAweGNmLCAweGY1LCAweGUyLCAweDdiLCAweGRjLCAweDljLCAweDI3LCAweGVhLCAweGFkLAorCTB4ODQsIDB4NjcsIDB4N2EsIDB4ZDcsIDB4MDAsIDB4ZGUsIDB4YzUsIDB4ZTcsIDB4N2EsIDB4YWQsIDB4OWUsIDB4ZDYsCisJMHgzNiwgMHgwNCwgMHhjZiwgMHhmNywgMHg4NiwgMHg2MywgMHg1OCwgMHg4ZSwgMHg5ZSwgMHgwMiwgMHgxOSwgMHhkNiwKKwkweGZiLCAweDdkLCAweGQ3LCAweGNhLCAweGU5LCAweDA3LCAweGU3LCAweGNlLCAweDE3LCAweDM0LCAweGMxLCAweDU2LAorCTB4NjksIDB4ODUsIDB4YTksIDB4M2MsIDB4ZTAsIDB4YTYsIDB4YjksIDB4ZWYsIDB4ODIsIDB4ZmIsIDB4MGIsIDB4M2EsCisJMHhlMiwgMHhiNywgMHhlOSwgMHg3MywgMHgxZiwgMHhmMywgMHg2NywgMHhhYywgMHhlNywgMHhjZiwgMHg3ZSwgMHg4NCwKKwkweDY3LCAweDVhLCAweGUzLCAweGQyLCAweDA3LCAweDNhLCAweGVjLCAweGQ3LCAweGU5LCAweDMxLCAweDhjLCAweDg3LAorCTB4NmIsIDB4YmUsIDB4MWEsIDB4MGYsIDB4OTAsIDB4M2QsIDB4NWMsIDB4ZmIsIDB4YzUsIDB4ZDgsIDB4MmIsIDB4MmQsCisJMHgyYSwgMHhhNywgMHhjZiwgMHg1OCwgMHg0NywgMHgyZCwgMHg4ZCwgMHg1ZCwgMHg3NiwgMHhmNiwgMHg5NCwgMHgxMywKKwkweDZhLCAweDRmLCAweGQ5LCAweDU3LCAweDdiLCAweGNiLCAweDM2LCAweGFmLCAweGZiLCAweDAxLCAweGNjLCAweDA3LAorCTB4N2UsIDB4OGYsIDB4MTcsIDB4OWQsIDB4MjEsIDB4ZTAsIDB4YWIsIDB4NTAsIDB4M2EsIDB4ZTIsIDB4NjQsIDB4ZjQsCisJMHhmYiwgMHhhOCwgMHg3ZCwgMHg0MywgMHgwZSwgMHg2MCwgMHhhZSwgMHg3YSwgMHhjNywgMHhhMywgMHg1YSwgMHhkZSwKKwkweGNmLCAweGRmLCAweGQzLCAweDE3LCAweGNlLCAweGViLCAweDBiLCAweDdhLCAweDBkLCAweDY4LCAweDVhLCAweDg4LAorCTB4NmIsIDB4Y2YsIDB4ZGEsIDB4MTAsIDB4YzcsIDB4OWQsIDB4OWMsIDB4YzYsIDB4M2QsIDB4Y2IsIDB4N2MsIDB4NGIsCisJMHhmZiwgMHgwNiwgMHg5ZCwgMHgyYiwgMHhkMywgMHg1ZSwgMHgyYiwgMHhkZSwgMHg4YiwgMHhmNywgMHg0ZCwgMHg4NiwKKwkweGZhLCAweDg2LCAweDcwLCAweGRmLCAweDA5LCAweGJkLCAweDE2LCAweGVjLCAweDM3LCAweGYyLCAweDZhLCAweDU2LAorCTB4NDYsIDB4MmEsIDB4NWMsIDB4YzMsIDB4NjQsIDB4M2IsIDB4NDgsIDB4MmYsIDB4ZDcsIDB4YzAsIDB4MWUsIDB4NTgsCisJMHg3OCwgMHhiZSwgMHhiYSwgMHg3ZiwgMHg3ZSwgMHgxZSwgMHgxMiwgMHhlMywgMHg0MiwgMHg1OCwgMHhlZSwgMHhkNiwKKwkweDY3LCAweDE3LCAweGFiLCAweGVmLCAweDFlLCAweGI5LCAweGYyLCAweGJmLCAweDcwLCAweGZkLCAweGQwLCAweGM4LAorCTB4NTAsIDB4MGIsIDB4NDcsIDB4ODYsIDB4ZjIsIDB4Y2UsIDB4YzgsIDB4OTUsIDB4YWYsIDB4Y2IsIDB4NDEsIDB4ZTAsCisJMHhmMSwgMHgzMCwgMHg2MCwgMHg1MiwgMHhmNywgMHhmMywgMHhjZSwgMHhhYiwgMHg1NywgMHhhNSwgMHgzMCwgMHg1OSwKKwkweDJmLCAweGVhLCAweGExLCAweDgyLCAweGUzLCAweDNlLCAweDU0LCAweDJiLCAweDkxLCAweDg3LCAweDk0LCAweDUzLAorCTB4ZjMsIDB4NTAsIDB4YmIsIDB4ZjYsIDB4Y2YsIDB4NzcsIDB4YTQsIDB4ZGEsIDB4ZTMsIDB4N2IsIDB4ZTUsIDB4YjgsCisJMHhlMywgMHhkZSwgMHhhZiwgMHhmNCwgMHg1OSwgMHhkYiwgMHg4MiwgMHhjNywgMHg1OCwgMHhkZiwgMHg3MSwgMHgyNywKKwkweDcyLCAweDdmLCAweGQ0LCAweDllLCAweGQzLCAweDM3LCAweGYxLCAweGJkLCAweDU5LCAweGNkLCAweGY3LCAweGRmLAorCTB4NTgsIDB4NDcsIDB4OWMsIDB4Y2QsIDB4MGEsIDB4ZjEsIDB4ZjEsIDB4NTksIDB4YzgsIDB4YWQsIDB4NGYsIDB4NGIsCisJMHg3NiwgMHgzNCwgMHgzMSwgMHg1NywgMHhjNiwgMHhlYywgMHhiMywgMHhkZiwgMHhiMCwgMHhjZSwgMHhmMCwgMHgwYiwKKwkweGNiLCAweGJjLCAweGUyLCAweGYwLCAweGNlLCAweDFjLCAweGEzLCAweDMzLCAweDNlLCAweGRmLCAweDEyLCAweGVlLAorCTB4YjksIDB4MzcsIDB4NzMsIDB4Y2EsIDB4ZmMsIDB4YzYsIDB4NzUsIDB4NTIsIDB4ZmYsIDB4MGEsIDB4ZTYsIDB4OGIsCisJMHhmZCwgMHgxMSwgMHg1NywgMHhhYiwgMHhmNCwgMHgzZCwgMHgwNSwgMHg5ZSwgMHg2YywgMHg4OSwgMHhkNywgMHhjZCwKKwkweGQ5LCAweDQzLCAweDQ2LCAweGY2LCAweGQ2LCAweDAxLCAweDZlLCAweGMwLCAweDZmLCAweGVjLCAweDNiLCAweDIxLAorCTB4OWQsIDB4MGEsIDB4MjQsIDB4MzcsIDB4NjksIDB4YjYsIDB4YTMsIDB4NjcsIDB4ODcsIDB4OTgsIDB4MzksIDB4MzMsCisJMHgzNCwgMHhiMywgMHhjMiwgMHhkOCwgMHg5MSwgMHhmOCwgMHgzNiwgMHg3NCwgMHhhMSwgMHg2NCwgMHhmYiwgMHhkOCwKKwkweDRiLCAweDRlLCAweDNmLCAweGNmLCAweDNjLCAweDhhLCAweGI2LCAweDFiLCAweDk3LCAweGIzLCAweDA5LCAweGMxLAorCTB4NGIsIDB4Y2YsIDB4NWIsIDB4ZmYsIDB4MzIsIDB4MDgsIDB4YzYsIDB4NTIsIDB4MjksIDB4ZGUsIDB4MmIsIDB4YjgsCisJMHg4YywgMHg0ZiwgMHhiOSwgMHhjYSwgMHg5OSwgMHgxYywgMHg2ZCwgMHg3MCwgMHgyNiwgMHg0NiwgMHgwMywgMHhkOSwKKwkweDkzLCAweGUyLCAweDlkLCAweDQ5LCAweGRjLCAweDkzLCAweGEwLCAweGUzLCAweGUzLCAweDQ4LCAweDZiLCAweDg3LAorCTB4NmUsIDB4N2QsIDB4YzcsIDB4M2EsIDB4ZWUsIDB4NzEsIDB4YmIsIDB4ZDksIDB4NmYsIDB4YjQsIDB4ZTUsIDB4ODgsCisJMHg2MywgMHhmYSwgMHhjYSwgMHhlZCwgMHgyNywgMHg3MiwgMHhjMiwgMHhiYiwgMHg4YiwgMHhiNiwgMHhjNCwgMHg2MywKKwkweDdhLCAweDdmLCAweGUyLCAweDE3LCAweDUwLCAweDBmLCAweDdkLCAweDk0LCAweGQ4LCAweGFmLCAweGViLCAweDRjLAorCTB4NDAsIDB4OWUsIDB4NGQsIDB4OGUsIDB4ZjEsIDB4YmUsIDB4MTQsIDB4OWUsIDB4NjMsIDB4ODgsIDB4YjQsIDB4MmEsCisJMHhiOSwgMHhkNiwgMHgxYiwgMHhiNiwgMHhmNywgMHg2OSwgMHhlNiwgMHhlMSwgMHgwYSwgMHg0NSwgMHg3NCwgMHhkYSwKKwkweDE2LCAweDZmLCAweGY3LCAweGRjLCAweDFkLCAweDliLCAweDYxLCAweDVhLCAweDc4LCAweGQ3LCAweGE2LCAweGQyLAorCTB4NjcsIDB4NTYsIDB4ZTAsIDB4ZDMsIDB4OWUsIDB4MWUsIDB4OTIsIDB4YjgsIDB4MzMsIDB4NTUsIDB4NmMsIDB4NzUsCisJMHg0ZSwgMHgxNiwgMHgzMywgMHg1YiwgMHhkNywgMHg4MSwgMHgzZSwgMHhjZSwgMHhhNywgMHgzZSwgMHg0NiwgMHhmOSwKKwkweDA1LCAweGRiLCAweGVmLCAweDQ1LCAweGM5LCAweDU3LCAweDNlLCAweDI0LCAweGUzLCAweDJkLCAweGVkLCAweGRlLAorCTB4ZmQsIDB4N2EsIDB4NmUsIDB4MmUsIDB4MDMsIDB4NjcsIDB4MmQsIDB4MmEsIDB4M2IsIDB4ZmEsIDB4YzQsIDB4M2EsCisJMHhlYSwgMHhiNywgMHhkZCwgMHg0NSwgMHgwNSwgMHg1ZSwgMHg1NiwgMHhiZiwgMHg4OCwgMHgwNywgMHgzNiwgMHg2ZSwKKwkweGFkLCAweGI2LCAweDUxLCAweGY2LCAweGE2LCAweDU4LCAweGFlLCAweGMxLCAweGU5LCAweDFkLCAweDVkLCAweDg1LAorCTB4NzksIDB4ZGMsIDB4MDUsIDB4ZmQsIDB4ZTksIDB4YzAsIDB4NDYsIDB4MjIsIDB4YWUsIDB4MWIsIDB4OWMsIDB4M2QsCisJMHhhMywgMHg3OSwgMHhmNCwgMHhjOCwgMHg3ZCwgMHhkNiwgMHhiYywgMHhmNywgMHhmMCwgMHgzMCwgMHhjNiwgMHhhOCwKKwkweGU1LCAweDJiLCAweDc4LCAweGY3LCAweDEyLCAweGQ3LCAweGRiLCAweDgzLCAweDQ5LCAweGQ4LCAweDA2LCAweGI5LAorCTB4YWUsIDB4N2YsIDB4NjcsIDB4ZDcsIDB4YWIsIDB4YTcsIDB4YWYsIDB4YjAsIDB4NWUsIDB4ZWQsIDB4YzksIDB4MjMsCisJMHgxNSwgMHg3ZCwgMHg2ZiwgMHg0OCwgMHhlNywgMHhiOCwgMHhlMiwgMHgzYSwgMHg2ZSwgMHhmMywgMHg1NSwgMHg3YSwKKwkweDdlLCAweDU0LCAweDg3LCAweGRkLCAweDFiLCAweDc4LCAweDcyLCAweDlkLCAweGJkLCAweGQzLCAweDA2LCAweDcwLAorCTB4NWMsIDB4MDUsIDB4MTgsIDB4MzYsIDB4NjIsIDB4ZmMsIDB4ODQsIDB4YzEsIDB4ZDQsIDB4MTEsIDB4NzUsIDB4NGIsCisJMHg5YywgMHgzYSwgMHg3MCwgMHg1NiwgMHg0ZSwgMHhhZiwgMHgwYiwgMHhmNywgMHg3YiwgMHhhMCwgMHgxZCwgMHhjOCwKKwkweGI1LCAweDQ3LCAweGUzLCAweDQ2LCAweDM3LCAweGFlLCAweDVkLCAweGE2LCAweDlkLCAweDcwLCAweDNjLCAweDhlLAorCTB4MWQsIDB4MGYsIDB4NjksIDB4NzUsIDB4NDMsIDB4MGIsIDB4ZmQsIDB4ODksIDB4NTksIDB4YTksIDB4NWIsIDB4NTQsCisJMHg5ZSwgMHhmMSwgMHhmYywgMHg1ZCwgMHhhZCwgMHg2NiwgMHhkZiwgMHgxMSwgMHhjYiwgMHg3YSwgMHhiMCwgMHg0YiwKKwkweDY5LCAweGUzLCAweDEyLCAweDc3LCAweDdhLCAweGFlLCAweDhhLCAweGRjLCAweDViLCAweDljLCAweGYzLCAweDJmLAorCTB4NDMsIDB4OWUsIDB4NWMsIDB4ZWIsIDB4YmQsIDB4NGQsIDB4OTEsIDB4ZjYsIDB4NDIsIDB4ZmMsIDB4MTIsIDB4YjcsCisJMHgwOSwgMHhlMCwgMHg5NSwgMHg3MSwgMHg5NSwgMHhkMywgMHg0MSwgMHg2NiwgMHg4MCwgMHg3YywgMHhjNSwgMHgzNiwKKwkweDk4LCAweGZmLCAweGEyLCAweDhlLCAweGU1LCAweDBlLCAweGE2LCAweDE4LCAweDI3LCAweDZhLCAweDNmLCAweDcxLAorCTB4ODcsIDB4MGEsIDB4NjUsIDB4ZDMsIDB4MmMsIDB4ZDcsIDB4MTAsIDB4MWMsIDB4ZGUsIDB4MjEsIDB4YmEsIDB4MGIsCisJMHgxZCwgMHg1ZSwgMHg5YywgMHg1MiwgMHhjZSwgMHgzNywgMHhjNywgMHg1YywgMHg3YywgMHhkNywgMHhkOCwgMHhmYiwKKwkweDQyLCAweDhkLCAweDZlLCAweDEyLCAweGY5LCAweGViLCAweDcwLCAweGJjLCAweGYxLCAweDNjLCAweGU2LCAweGZiLAorCTB4MTIsIDB4ZTYsIDB4N2IsIDB4ZjksIDB4ZmIsIDB4NDEsIDB4OTEsIDB4NTcsIDB4NDYsIDB4NWUsIDB4ZjksIDB4NDMsCisJMHg0MSwgMHhhNiwgMHg4OSwgMHhmNCwgMHg0NywgMHg5YSwgMHg3YiwgMHgzZCwgMHg5ZiwgMHg1OSwgMHhlZiwgMHg2MywKKwkweDAyLCAweDZjLCAweDY3LCAweGMxLCAweDBiLCAweDE5LCAweGFlLCAweDI1LCAweDA3LCAweGM3LCAweDUyLCAweDM3LAorCTB4ODEsIDB4MTcsIDB4NzYsIDB4Y2EsIDB4OWYsIDB4YzAsIDB4MTYsIDB4ZjgsIDB4ZTMsIDB4NGEsIDB4MWEsIDB4M2MsCisJMHhkMSwgMHgwMywgMHgxZSwgMHhlOSwgMHgwNiwgMHg1ZiwgMHhhNCwgMHhiNCwgMHg1ZCwgMHhmYywgMHgyOCwgMHg3NCwKKwkweGRlLCAweGQ5LCAweDRhLCAweGM5LCAweGQ5LCAweDNiLCAweDVhLCAweDc0LCAweDcyLCAweGEzLCAweDQ3LCAweDQxLAorCTB4MTcsIDB4ZGMsIDB4MDMsIDB4YWIsIDB4YWUsIDB4YTksIDB4MTEsIDB4MzcsIDB4M2UsIDB4MjksIDB4YTQsIDB4ZmYsCisJMHg3NiwgMHhlZSwgMHhlZCwgMHg2OCwgMHgwNiwgMHhhZSwgMHhjZSwgMHgxMCwgMHg1NywgMHg5MywgMHg5NSwgMHgyZCwKKwkweGRlLCAweDNhLCAweGYwLCAweDQxLCAweGIzLCAweGU2LCAweDgzLCAweDQ2LCAweDI3LCAweGUzLCAweGRkLCAweDY0LAorCTB4ZjksIDB4NjAsIDB4MDQsIDB4N2MsIDB4NTAsIDB4NTgsIDB4YzIsIDB4MDcsIDB4Y2YsIDB4NTgsIDB4OWEsIDB4OWYsCisJMHhhZSwgMHhlMiwgMHg4MywgMHg0OSwgMHg5YiwgMHgzNiwgMHg3ZSwgMHgwNSwgMHgzZSwgMHhiOCwgMHhjYSwgMHg0ZiwKKwkweDNlLCAweDM5LCAweDI0LCAweDI3LCAweGMwLCAweDA3LCAweDBmLCAweDZiLCAweDNlLCAweGI4LCAweDRhLCAweGYzLAorCTB4MDEsIDB4ZTMsIDB4NDYsIDB4ZTQsIDB4ODUsIDB4NTYsIDB4YzgsIDB4MGUsIDB4ZjIsIDB4YzIsIDB4YjMsIDB4MzIsCisJMHgwYiwgMHg1ZSwgMHg3OCwgMHg1MSwgMHhiMSwgMHhlZiwgMHhjYiwgMHhiNCwgMHgwZiwgMHg0NiwgMHhlOSwgMHg4ZiwKKwkweDlkLCAweDJhLCAweDE1LCAweGMxLCAweGJiLCAweDRhLCAweGJlLCAweDMwLCAweDE2LCAweDA0LCAweDMzLCAweGYwLAorCTB4ZDEsIDB4MWYsIDB4ODQsIDB4MGQsIDB4ZWYsIDB4ZWEsIDB4M2IsIDB4NjksIDB4YTcsIDB4NjEsIDB4YmIsIDB4MTAsCisJMHgzNiwgMHhkYSwgMHhlNCwgMHhlMywgMHgwZSwgMHhlOCwgMHhmZCwgMHhmMCwgMHgwNCwgMHhjNiwgMHhiMCwgMHg0NywKKwkweGZkLCAweDNlLCAweGZjLCAweDYwLCAweDBmLCAweGYzLCAweDRhLCAweGRiLCAweGZlLCAweGI4LCAweGU2LCAweDliLAorCTB4MWEsIDB4ZTgsIDB4ODAsIDB4OTMsIDB4ZGQsIDB4OGMsIDB4MzMsIDB4ZjksIDB4ZGUsIDB4NWUsIDB4ZDUsIDB4OWUsCisJMHhlZiwgMHgwMywgMHhjYywgMHgxMSwgMHg3NSwgMHhiZiwgMHgzMCwgMHhjNiwgMHhkMSwgMHhiNCwgMHhjOCwgMHhiNiwKKwkweGE3LCAweDVjLCAweDE4LCAweDkwLCAweGZiLCAweDZjLCAweDVlLCAweDNlLCAweGE4LCAweDgzLCAweDFkLCAweDVhLAorCTB4YTcsIDB4OGMsIDB4NWQsIDB4YWUsIDB4YjYsIDB4MjUsIDB4YmQsIDB4ZGYsIDB4ODAsIDB4ZDAsIDB4YWMsIDB4NGQsCisJMHg5YiwgMHgzZCwgMHg4MSwgMHg3ZCwgMHhjNSwgMHg2YSwgMHhiYiwgMHhmZSwgMHg1ZSwgMHhkOCwgMHhmNSwgMHhhYywKKwkweDIzLCAweGFlLCAweGIxLCAweGViLCAweGVmLCAweGIyLCAweGJjLCAweGM2LCAweGRmLCAweDllLCAweGI2LCAweGYxLAorCTB4MGYsIDB4MDAsIDB4YmUsIDB4MWQsIDB4NzMsIDB4MzYsIDB4M2UsIDB4ZGIsIDB4YTAsIDB4YWQsIDB4MjEsIDB4NzIsCisJMHgwMywgMHhlYywgMHhiYywgMHgxYiwgMHhjMSwgMHg4MywgMHgzNywgMHhjMSwgMHg4ZiwgMHg3YSwgMHg3NywgMHhkMSwKKwkweDkzLCAweDlkLCAweGM1LCAweDY2LCAweGY4LCAweGRiLCAweGFkLCAweGYyLCAweGFiLCAweDYzLCAweDFiLCAweGE1LAorCTB4N2YsIDB4ZjQsIDB4NzcsIDB4OWEsIDB4YTEsIDB4NTcsIDB4NjEsIDB4OTcsIDB4YmUsIDB4MDgsIDB4MzgsIDB4MjMsCisJMHg1NiwgMHg1NiwgMHg0NywgMHhjMSwgMHgwMywgMHhlZCwgMHg4OSwgMHgxZiwgMHhhOCwgMHg0NCwgMHhhYiwgMHg5MSwKKwkweGVkLCAweDNjLCAweDRiLCAweGJlLCAweDVjLCAweDNiLCAweDMxLCAweGQ0LCAweDY3LCAweDFjLCAweGE1LCAweDQ1LAorCTB4Y2UsIDB4MWMsIDB4YTcsIDB4ZTcsIDB4OTUsIDB4ODAsIDB4MmQsIDB4OWUsIDB4ODIsIDB4MWQsIDB4YjIsIDB4MDEsCisJMHhlZCwgMHgzMSwgMHg5NiwgMHhiYywgMHg1YSwgMHg5ZSwgMHhkOSwgMHhlYSwgMHhkZSwgMHg5ZCwgMHhkMywgMHg3YywKKwkweDc4LCAweGM5LCAweGM5LCAweDhlLCAweGRkLCAweDI0LCAweDg1LCAweGMxLCAweDI4LCAweGM2LCAweGEwLCAweDlhLAorCTB4ZDcsIDB4Y2EsIDB4ZjUsIDB4ZDIsIDB4YWYsIDB4YzcsIDB4NzMsIDB4NTksIDB4MGUsIDB4NDIsIDB4MWYsIDB4ZmYsCisJMHg2OSwgMHhiMSwgMHg1ZiwgMHg2NiwgMHgwNywgMHg5YSwgMHhmMCwgMHgxZCwgMHg5NSwgMHg2NywgMHg4YSwgMHg1YiwKKwkweGUwLCAweGVmLCAweGZjLCAweDBhLCAweDcwLCAweDU0LCAweDhiLCAweGVmLCAweDVhLCAweGU5LCAweDVkLCAweDQ3LAorCTB4NWUsIDB4NmQsIDB4OTAsIDB4MTksIDB4YTQsIDB4ZGYsIDB4MjgsIDB4YmYsIDB4NjQsIDB4ZDMsIDB4OTksIDB4NDYsCisJMHhkZSwgMHg2OCwgMHg0MCwgMHhkZCwgMHhhOCwgMHg5YywgMHgyZiwgMHhkMiwgMHg5NiwgMHhkNCwgMHgzYywgMHhkMSwKKwkweGYzLCAweGIyLCAweDZjLCAweGM5LCAweGJjLCAweDBjLCAweGRiLCAweGY0LCAweDU5LCAweDNjLCAweGNmLCAweDRiLAorCTB4NzIsIDB4ZTcsIDB4NmUsIDB4NjcsIDB4NGIsIDB4YTIsIDB4ZGQsIDB4ODEsIDB4YmUsIDB4YzQsIDB4ZTMsIDB4M2EsCisJMHg1YiwgMHhiYywgMHg1YSwgMHhlNywgMHg1YSwgMHhkYiwgMHg0NiwgMHg4ZCwgMHgzYywgMHgzZiwgMHhhOCwgMHhlMiwKKwkweDBkLCAweDk4LCAweDkzLCAweGNkLCAweDRlLCAweDg3LCAweDRkLCAweGUzLCAweGI3LCAweGJlLCAweDJmLCAweDUxLAorCTB4ZGEsIDB4Y2YsIDB4YTgsIDB4MGQsIDB4YWIsIDB4NDQsIDB4ZGEsIDB4MWEsIDB4NjAsIDB4ZTcsIDB4ZWMsIDB4MTEsCisJMHhkNSwgMHhkYywgMHgyMCwgMHhhZSwgMHhiNCwgMHg0ZiwgMHhhOCwgMHg1NiwgMHhhNCwgMHhmOSwgMHgzNiwgMHgyZCwKKwkweGQ2LCAweDAwLCAweDlkLCAweDgwLCAweGI0LCAweDE2LCAweGE0LCAweDZkLCAweGIyLCAweDY5LCAweDRkLCAweDBkLAorCTB4NTIsIDB4OGIsIDB4YjQsIDB4Y2IsIDB4OWEsIDB4ZTcsIDB4MmYsIDB4NzYsIDB4ZjgsIDB4NWUsIDB4Y2UsIDB4YTksCisJMHg5NywgMHhiNiwgMHg1MywgMHgwZCwgMHg5MCwgMHgwZCwgMHhhYiwgMHg2NSwgMHg2NiwgMHg2YiwgMHg5ZCwgMHhiNCwKKwkweDIxLCAweDhmLCAweDMxLCAweGVlLCAweGQ0LCAweGE5LCAweGE4LCAweGJjLCAweGYzLCAweDU0LCAweDdiLCAweGZjLAorCTB4YTMsIDB4MTgsIDB4NDMsIDB4ZmIsIDB4MTksIDB4YzYsIDB4YmMsIDB4ZmYsIDB4YWMsIDB4OTksIDB4MzEsIDB4OWYsCisJMHhiNiwgMHgzMywgMHg3YywgMHhkNywgMHg2OSwgMHhmOSwgMHg0MywgMHg3YywgMHg5OCwgMHgzYiwgMHhkZiwgMHg2MCwKKwkweDYzLCAweDk0LCAweDhlLCAweDNiLCAweGMzLCAweGEzLCAweGQ0LCAweGRiLCAweGVkLCAweGY2LCAweDdlLCAweGEyLAorCTB4ZmYsIDB4ZDksIDB4NGMsIDB4NWYsIDB4NmQsIDB4ODIsIDB4MzYsIDB4NTQsIDB4ODksIDB4ZmMsIDB4NDgsIDB4ZGQsCisJMHg4MywgMHhmNywgMHhiOCwgMHgyMywgMHg4NSwgMHg3OSwgMHg5OSwgMHgzNSwgMHg0NSwgMHhiZSwgMHgzYSwgMHhhZSwKKwkweGI4LCAweDRmLCAweDA1LCAweDY5LCAweDk1LCAweDc3LCAweDA1LCAweDY2LCAweDhlLCAweGM5LCAweDBiLCAweDQ2LAorCTB4MmUsIDB4ZmQsIDB4OWEsIDB4OTEsIDB4NGIsIDB4YTcsIDB4Y2YsIDB4MmQsIDB4OTAsIDB4NGIsIDB4MDUsIDB4MmQsCisJMHg5NywgMHgwNiwgMHgwNSwgMHhlZiwgMHhhOSwgMHgwMiwgMHhlNCwgMHhkMiwgMHgwOCwgMHhiZSwgMHgzZCwgMHgyZCwKKwkweDk3LCAweDYyLCAweDYyLCAweDZkLCAweDY0LCAweDg5LCAweDVlLCAweGM1LCAweGZlLCAweDI3LCAweDRiLCAweGFlLAorCTB4YjYsIDB4YTUsIDB4MGEsIDB4ZTMsIDB4YjAsIDB4NDMsIDB4NGEsIDB4MjMsIDB4NTYsIDB4NjcsIDB4NGIsIDB4YmEsCisJMHg0OSwgMHgzYSwgMHg3YSwgMHg3ZSwgMHgyYSwgMHhhMSwgMHg5ZCwgMHgzOSwgMHhkYiwgMHhjYywgMHgzYiwgMHg4ZiwKKwkweDVmLCAweDU0LCAweDk0LCAweDYxLCAweDI3LCAweDIwLCAweGMzLCAweDFlLCAweGJlLCAweDgyLCAweDBjLCAweDQzLAorCTB4NWUsIDB4MTksIDB4NzksIDB4NjUsIDB4YjYsIDB4ZmIsIDB4ZGQsIDB4OWYsIDB4MGUsIDB4NzksIDB4OTQsIDB4MWYsCisJMHg5NCwgMHgxOSwgMHg5MCwgMHg0OSwgMHgyNSwgMHhjOCwgMHhhNCwgMHgxMiwgMHhlNCwgMHg1NCwgMHgwOSwgMHg3MiwKKwkweGE5LCAweDA0LCAweGI5LCAweDU0LCAweDgyLCAweDVjLCAweDJhLCAweDQxLCAweDJlLCAweDQxLCAweGM2LCAweDNkLAorCTB4MGEsIDB4MTksIDB4NjcsIDB4NjQsIDB4ZGEsIDB4MDAsIDB4ZWQsIDB4MzUsIDB4YjksIDB4Y2YsIDB4ZWEsIDB4NzcsCisJMHgxMywgMHgyNywgMHhlOSwgMHhiMiwgMHg3ZSwgMHg5MSwgMHhkOSwgMHhiMywgMHg3YSwgMHhhZSwgMHgyYSwgMHgyZSwKKwkweGI4LCAweGViLCAweDg4LCAweGU2LCAweDc3LCAweGNmLCAweDU3LCAweGQ3LCAweDNhLCAweGRjLCAweDFmLCAweGYzLAorCTB4MDMsIDB4ZWQsIDB4YjMsIDB4NmYsIDB4ZTYsIDB4NmYsIDB4YTksIDB4MDMsIDB4NWYsIDB4YmYsIDB4NjIsIDB4ZjksCisJMHg3YSwgMHhmMywgMHgxYywgMHg1ZiwgMHgyNywgMHgxZCwgMHhjNiwgMHg4OSwgMHg5NywgMHhlNywgMHhlYiwgMHgxNiwKKwkweDliLCAweDk3LCAweDBmLCAweDU2LCAweDgwLCAweGFmLCAweDU3LCAweDJjLCAweGUyLCAweGViLCAweDI4LCAweGY4LAorCTB4N2EsIDB4ZTcsIDB4MTIsIDB4YmUsIDB4NWUsIDB4ZTUsIDB4ZjQsIDB4ZWEsIDB4M2EsIDB4M2MsIDB4ODMsIDB4YzYsCisJMHhlZiwgMHg1YSwgMHg2NywgMHg5ZSwgMHhhZiwgMHhmNywgMHg2YiwgMHhiZSwgMHgzZSwgMHgwNCwgMHhiZSwgMHhiZSwKKwkweGJlLCAweDhhLCAweGFmLCAweDc3LCAweDRhLCAweGYyLCAweDk2LCAweDZjLCAweDY0LCAweGEzLCAweGVjLCAweGJlLAorCTB4NWYsIDB4MzUsIDB4YWYsIDB4OTEsIDB4N2YsIDB4MTEsIDB4NTMsIDB4ZGYsIDB4ZjAsIDB4NTgsIDB4ZWYsIDB4NTgsCisJMHhiMywgMHhlNCwgMHgxZSwgMHhmYSwgMHgxMSwgMHhkNywgMHgwNiwgMHhjOCwgMHgyMywgMHg0MywgMHgxOSwgMHhjNywKKwkweDkzLCAweDgzLCAweDQ3LCAweDdlLCAweDIwLCAweGQzLCAweDlhLCAweGI3LCAweDQ0LCAweGY2LCAweDFjLCAweDg5LAorCTB4Y2EsIDB4ZjAsIDB4MTEsIDB4YzYsIDB4MWUsIDB4YmUsIDB4NjMsIDB4ZTksIDB4YmQsIDB4NGUsIDB4ODYsIDB4MDcsCisJMHhiOSwgMHg1ZiwgMHhkMiwgMHg5NSwgMHhkZCwgMHg0NywgMHhlMCwgMHg2MywgMHgxZCwgMHg2MSwgMHhlYywgMHhlMSwKKwkweGYyLCAweDFjLCAweDhmLCAweDRkLCAweDQzLCAweGI2LCAweGVjLCAweDNlLCAweGEyLCAweGU3LCAweDFhLCAweGVkLAorCTB4MzQsIDB4YzgsIDB4YTEsIDB4MjMsIDB4MjIsIDB4YjcsIDB4MWQsIDB4NzEsIDB4ZTUsIDB4ZjYsIDB4MjMsIDB4NzMsCisJMHhiYywgMHgzNiwgMHgxMCwgMHhmMiwgMHhkYSwgMHg5ZiwgMHg4MywgMHhkNywgMHhkYSwgMHgyZCwgMHhhZiwgMHhhOSwKKwkweDM5LCAweDVlLCAweGZiLCAweDVhLCAweDE1LCAweGFmLCAweGIxLCAweDNlLCAweDc5LCAweGVkLCAweDgyLCAweDRkLAorCTB4ZTMsIDB4YjcsIDB4MmIsIDB4N2IsIDB4OGYsIDB4YjQsIDB4Y2EsIDB4ZWUsIDB4ODcsIDB4ZGUsIDB4MjIsIDB4N2IsCisJMHhlZSwgMHgyNywgMHhhYywgMHhlNiwgMHg5ZSwgMHgzYywgMHhkYSwgMHg1ZiwgMHhlMywgMHg5NSwgMHg3NiwgMHhiNCwKKwkweDFmLCAweGVlLCAweDBmLCAweGQyLCAweDc3LCAweDY1LCAweDc1LCAweDRlLCAweDQ4LCAweDMyLCAweGNmLCAweGZlLAorCTB4NmEsIDB4ZTEsIDB4M2IsIDB4OWYsIDB4ODIsIDB4NGYsIDB4YjEsIDB4MTcsIDB4MzAsIDB4ZGQsIDB4N2EsIDB4NDQsCisJMHg5MiwgMHhhZSwgMHhiYywgMHgyNiwgMHgyMywgMHhhOSwgMHg0NywgMHg1YiwgMHg4ZCwgMHgzZCwgMHg3MSwgMHgwOSwKKwkweGJjLCAweDQyLCAweGZhLCAweGNmLCAweDQ4LCAweGVlLCAweGVkLCAweDgxLCAweGY2LCAweDJiLCAweDQ2LCAweGNiLAorCTB4NDIsIDB4ZmYsIDB4OWYsIDB4MzEsIDB4NzMsIDB4YzcsIDB4ZGMsIDB4NzcsIDB4YzcsIDB4ZjMsIDB4YmUsIDB4MzUsCisJMHhmYSwgMHhiYywgMHg5YiwgMHg4ZSwgMHhkNywgMHg3NiwgMHgzMywgMHhiZiwgMHg0NiwgMHhlZiwgMHgzNywgMHhjZCwKKwkweGU5LCAweGIzLCAweGRjLCAweGFjLCAweGNmLCAweDc2LCAweDYyLCAweDNhLCAweDllLCAweDVlLCAweDI4LCAweGYzLAorCTB4OGUsIDB4MzAsIDB4ZGUsIDB4YmQsIDB4Y2MsIDB4YmIsIDB4MDYsIDB4ZmYsIDB4ZjgsIDB4MmEsIDB4MTMsIDB4OWIsCisJMHgyNSwgMHhkZiwgMHg3ZCwgMHhkZCwgMHhjOSwgMHgxNSwgMHgyZiwgMHhlOSwgMHg3ZCwgMHg4NSwgMHg1OSwgMHgxZiwKKwkweGJmLCAweGNiLCAweGZjLCAweDY2LCAweGY5LCAweDRiLCAweDhjLCAweDcxLCAweDI0LCAweDEyLCAweGVhLCAweDgxLAorCTB4NTYsIDB4ZWUsIDB4M2IsIDB4MTgsIDB4OWMsIDB4MzIsIDB4NzYsIDB4OTQsIDB4ZTEsIDB4ZDEsIDB4MDYsIDB4ZWQsCisJMHg2YiwgMHg4YywgMHhlMCwgMHg3YiwgMHhmNywgMHg2OCwgMHhhMywgMHg1MywgMHhhMCwgMHg2ZCwgMHgzMiwgMHhkMCwKKwkweGUwLCAweGU0LCAweGM3LCAweGY3LCAweGI0LCAweDFhLCAweDliLCAweDc5LCAweDIwLCAweGNlLCAweDNkLCAweDg1LAorCTB4MTksIDB4YjUsIDB4NTQsIDB4MjYsIDB4OWYsIDB4OTIsIDB4NTAsIDB4MjYsIDB4MjcsIDB4NmYsIDB4YzksIDB4YzAsCisJMHhiNiwgMHhjZSwgMHgxZCwgMHhkMSwgMHhmNywgMHhmNywgMHgyNSwgMHhkYSwgMHgxNSwgMHhjNywgMHhmNCwgMHgwOSwKKwkweGM4LCAweGQ3LCAweDkwLCAweDE2LCAweGUyLCAweGYyLCAweGYxLCAweDIzLCAweGE0LCAweDA3LCAweDE1LCAweDZiLAorCTB4OTQsIDB4ZGYsIDB4YjIsIDB4ZjQsIDB4NzAsIDB4NTksIDB4OGEsIDB4OTAsIDB4M2IsIDB4NDcsIDB4OGUsIDB4ZGMsCisJMHgyZSwgMHhlMywgMHhiYiwgMHgxNiwgMHhkMywgMHhjMywgMHg5ZSwgMHg3OSwgMHg3YSwgMHg4OCwgMHhjMSwgMHgzZSwKKwkweDczLCAweGFhLCAweGU5LCAweGUxLCAweDM3LCAweGU3LCAweGU4LCAweDYxLCAweGRjLCAweGY5LCAweGQ3LCAweGQyLAorCTB4YzMsIDB4MGQsIDB4MGIsIDB4ZTgsIDB4NjEsIDB4NDQsIDB4ZDMsIDB4NDMsIDB4ZmYsIDB4MWMsIDB4M2QsIDB4OGMsCisJMHgxYywgMHg2MSwgMHhiZiwgMHg3YSwgMHg1ZCwgMHhkNCwgMHg5YiwgMHg3MSwgMHgzOCwgMHhlNywgMHg3MywgMHhiNCwKKwkweDkwLCAweDE4LCAweGQ2LCAweGZiLCAweDQ0LCAweDkzLCAweDc5LCAweDllLCAweDI1LCAweDVkLCAweGE1LCAweDE4LAorCTB4MWIsIDB4OTksIDB4OWYsIDB4ZmYsIDB4YzYsIDB4N2YsIDB4ZDMsIDB4ZjksIDB4N2YsIDB4NDcsIDB4ZmMsIDB4ZmYsCisJMHhlZiwgMHhmYywgMHg1ZiwgMHg4ZiwgMHhmNiwgMHgyOSwgMHg4YiwgMHg0MywgMHg3OSwgMHgxYywgMHhkMiwgMHhjMywKKwkweDdiLCAweGUyLCAweDQ2LCAweDJmLCAweDcwLCAweDhlLCAweGY5LCAweDZkLCAweGY2LCAweGFjLCAweDlmLCAweDgzLAorCTB4ZmMsIDB4N2IsIDB4MWMsIDB4ZjIsIDB4ZWYsIDB4YjEsIDB4MDUsIDB4ZWIsIDB4MDEsIDB4M2QsIDB4MzYsIDB4MDYsCisJMHgxMSwgMHhjOCwgMHhjMSwgMHhkNCwgMHgzYywgMHgzZSwgMHg2NiwgMHhiYSwgMHg4OSwgMHgwZiwgMHhiMywgMHhmNywKKwkweGU0LCAweDZjLCAweDY1LCAweDMxLCAweDRlLCAweDVjLCAweGJkLCAweGRmLCAweGU4LCAweDY0LCAweGFhLCAweDFhLAorCTB4MjcsIDB4ODQsIDB4N2IsIDB4YjYsIDB4NmEsIDB4OGMsIDB4ZjgsIDB4NWQsIDB4ZTYsIDB4ZjcsIDB4NjUsIDB4YmQsCisJMHg4NywgMHhhNCwgMHhhMCwgMHhkNywgMHg5ZiwgMHg4OCwgMHgxNywgMHhhZSwgMHgzZiwgMHgxMSwgMHgyNywgMHhhZSwKKwkweGI2LCAweGY3LCAweDBiLCAweGU1LCAweDNhLCAweGJkLCAweDJmLCAweGZjLCAweGMwLCAweDU0LCAweDRjLCAweDY2LAorCTB4NjIsIDB4OGMsIDB4ZWIsIDB4ZjEsIDB4ZGUsIDB4NTcsIDB4ZmEsIDB4Y2EsIDB4N2UsIDB4YmMsIDB4MjAsIDB4NzksCisJMHg3YiwgMHhkNiwgMHg2NywgMHg5NSwgMHhhNSwgMHg2ZCwgMHhjNiwgMHgwMywgMHg3OSwgMHgyNywgMHg0MiwgMHhiOCwKKwkweDBlLCAweGQxLCAweDY5LCAweDY1LCAweDVkLCAweDQzLCAweDU1LCAweDljLCAweDEyLCAweDc4LCAweDFmLCAweDkzLAorCTB4NDQsIDB4YjYsIDB4MWIsIDB4ZWYsIDB4MjksIDB4ZjYsIDB4ZmQsIDB4YTQsIDB4OGMsIDB4M2MsIDB4NTgsIDB4ODYsCisJMHgyZCwgMHhmNywgMHgzMCwgMHg3NCwgMHg4ZSwgMHgyMywgMHgxMCwgMHg5MywgMHhmYSwgMHgyZSwgMHgxNCwgMHhjMiwKKwkweDMwLCAweGExLCAweGVmLCAweGY1LCAweGEzLCAweGRmLCAweDQ3LCAweDdhLCAweDg4LCAweGUzLCAweGZiLCAweGIyLAorCTB4OGQsIDB4MjUsIDB4YzUsIDB4YTUsIDB4NTAsIDB4ZmMsIDB4MDEsIDB4ZTAsIDB4ZTcsIDB4MWQsIDB4OTQsIDB4M2YsCisJMHhjMiwgMHhmYiwgMHg4ZCwgMHhlNiwgMHhjMywgMHhmOCwgMHgyMSwgMHgwMywgMHhmYSwgMHhjZCwgMHhiOSwgMHg3OSwKKwkweGNkLCAweGM5LCAweDk0LCAweGNkLCAweGZlLCAweDk2LCAweGFhLCAweGZiLCAweGY1LCAweGU1LCAweGIwLCAweGI2LAorCTB4OWYsIDB4ZDMsIDB4NzYsIDB4NWYsIDB4MGIsIDB4Y2YsIDB4ZTcsIDB4MTksIDB4MWIsIDB4ZmEsIDB4Y2IsIDB4YjAsCisJMHhhMSwgMHg5ZiwgMHhhOCwgMHg2NCwgMHhmNCwgMHgxYSwgMHhkNiwgMHg2MywgMHhiMCwgMHhhMSwgMHgxZiwgMHg4NSwKKwkweGVlLCAweGExLCAweGNlLCAweDg5LCAweDU5LCAweDlkLCAweDMzLCAweGEyLCAweDc2LCAweDY5LCAweDlkLCAweGYzLAorCTB4ZDcsIDB4NWEsIDB4ZTcsIDB4ZmMsIDB4ZWEsIDB4MTIsIDB4OWQsIDB4NzMsIDB4NDgsIDB4YjUsIDB4OGYsIDB4NTIsCisJMHhlNywgMHhmNCwgMHhhYSwgMHg5ZCwgMHgwZSwgMHhlZCwgMHhjNSwgMHhiNSwgMHhjYiwgMHhlOCwgMHg5YywgMHhmNywKKwkweGNhLCAweGFmLCAweGQ4LCAweGJjLCAweGZkLCAweGYyLCAweGJlLCAweDZkLCAweDdhLCAweGRkLCAweGM2LCAweDliLAorCTB4NTAsIDB4YmMsIDB4Y2IsIDB4Y2UsIDB4ZTgsIDB4YTAsIDB4ZWIsIDB4NTUsIDB4YTcsIDB4NWUsIDB4ZWYsIDB4ZmQsCisJMHg2YSwgMHg5NSwgMHhjZSwgMHg2OSwgMHg1MywgMHhkZCwgMHg0ZSwgMHhhZiwgMHhhZSwgMHhjMywgMHg3OCwgMHgwNCwKKwkweGJmLCAweDUzLCAweDRlLCAweDY2LCAweGEwLCAweDBlLCAweGRmLCAweDcxLCAweDg5LCAweDFjLCAweGMxLCAweGQ4LAorCTB4Y2QsIDB4N2QsIDB4N2IsIDB4Y2EsIDB4ZTQsIDB4NWQsIDB4NjMsIDB4ZjMsIDB4NTQsIDB4OTgsIDB4ZWUsIDB4OWEsCisJMHhmNCwgMHg3NiwgMHg5YiwgMHg2ZSwgMHg3NCwgMHg1NSwgMHg5YiwgMHg2YSwgMHhkNSwgMHhiYSwgMHg2YSwgMHgzMywKKwkweDE4LCAweDZhLCAweDAyLCAweGZhLCAweDc1LCAweGEyLCAweDE0LCAweGVhLCAweDJjLCAweGZlLCAweDY2LCAweGJjLAorCTB4OTksIDB4NzEsIDB4ODksIDB4MzAsIDB4NmUsIDB4OWQsIDB4NDAsIDB4MTksIDB4M2MsIDB4YTUsIDB4ZDAsIDB4YTYsCisJMHhlNCwgMHg2ZiwgMHhmOCwgMHgwYSwgMHg3OCwgMHhhNiwgMHg4MCwgMHhkNywgMHg1YiwgMHhjMCwgMHgzZiwgMHhiZiwKKwkweDVlLCAweDY0LCAweGRjLCAweGIzLCAweDU5LCAweDhlLCAweDhlLCAweDU1LCAweGU3LCAweGI1LCAweGNhLCAweGJiLAorCTB4YzcsIDB4MzYsIDB4YzgsIDB4YmUsIDB4NTEsIDB4ZmYsIDB4NmEsIDB4YTksIDB4ZGYsIDB4MjgsIDB4MjMsIDB4YTMsCisJMHgyZiwgMHhlYSwgMHhmYiwgMHg0MCwgMHhkNiwgMHhlOCwgMHg3YiwgMHg5MiwgMHg3OCwgMHg3ZiwgMHg5OCwgMHg5MSwKKwkweDkxLCAweGZkLCAweDhlLCAweDkxLCAweDkxLCAweDE5LCAweDM1LCAweDZmLCAweGIzLCAweDg2LCAweDZkLCAweGYyLAorCTB4NmUsIDB4YTYsIDB4YmUsIDB4ZDEsIDB4YjgsIDB4YmUsIDB4NDMsIDB4N2EsIDB4YTIsIDB4NzIsIDB4YWQsIDB4ZmMsCisJMHhkMSwgMHg3MSwgMHg3NSwgMHhhNywgMHg5YSwgMHhiZiwgMHg0YiwgMHg0MSwgMHhkYiwgMHhhYywgMHg5MywgMHgwYiwKKwkweDZjLCAweGQ2LCAweGJmLCAweDk3LCAweDk5LCAweGY3LCAweDQ1LCAweDMxLCAweDRlLCAweGQwLCAweGYwLCAweDc1LAorCTB4MmYsIDB4NzMsIDB4MWQsIDB4YjQsIDB4MzksIDB4MjYsIDB4OTcsIDB4YTQsIDB4NGYsIDB4ZTMsIDB4OGYsIDB4ZjIsCisJMHhiNCwgMHgwMSwgMHg3MiwgMHg3MCwgMHg1NiwgMHhlYiwgMHhkNywgMHhiNSwgMHhiYywgMHhmMywgMHhmOCwgMHgwOCwKKwkweDZkLCAweGQ3LCAweGFmLCAweDZiLCAweDc5LCAweGI2LCAweGQ2LCAweGRhLCAweGFlLCAweGQzLCAweDkwLCAweGQzLAorCTB4OTQsIDB4YTMsIDB4MzcsIDB4Y2EsIDB4NWYsIDB4ZGIsIDB4NzQsIDB4YTYsIDB4MjUsIDB4ZTMsIDB4YjMsIDB4NDIsCisJMHg3ZCwgMHgxNywgMHg4MywgMHgwYywgMHhhNSwgMHgzYywgMHhmZCwgMHg1OSwgMHg2ZCwgMHhkNywgMHhlNywgMHg2YywKKwkweDFiLCAweDk0LCAweDlmLCAweDQ2LCAweDc2LCAweDZmLCAweDc2LCAweGE2LCAweDZkLCAweDFhLCAweGJmLCAweGMzLAorCTB4MTgsIDB4YmEsIDB4OWYsIDB4YzksIDB4NTksIDB4M2UsIDB4NTMsIDB4Y2UsIDB4OTMsIDB4YzgsIDB4NWYsIDB4ODMsCisJMHg3YywgMHhmMiwgMHhkOSwgMHg2MywgMHg5YSwgMHhjZiwgMHhiNCwgMHg3ZCwgMHhlMiwgMHg3NCwgMHhkOSwgMHgzNSwKKwkweDg1LCAweGI5LCAweGY1LCAweDgwLCAweDNjLCAweGY5LCAweDRjLCAweDFkLCAweGY1LCAweGE2LCAweDhkLCAweDNjLAorCTB4ZjAsIDB4OTAsIDB4ZmUsIDB4NDUsIDB4ZTgsIDB4MGUsIDB4ZDYsIDB4NDUsIDB4ZmEsIDB4YjEsIDB4MGMsIDB4ZTYsCisJMHhmMCwgMHgyNCwgMHhmYywgMHg5ZiwgMHg0NiwgMHg3YywgMHgzNywgMHhlMywgMHg3YiwgMHg0MiwgMHg3ZSwgMHg3NSwKKwkweDMwLCAweGFhLCAweGM3LCAweDNkLCAweDgyLCAweDcxLCAweDFjLCAweDM4LCAweDgyLCAweDMxLCAweDM5LCAweGM2LAorCTB4NzYsIDB4NzYsIDB4Y2YsIDB4YjgsIDB4NTIsIDB4NzMsIDB4ODYsIDB4N2MsIDB4YzcsIDB4MzMsIDB4ODYsIDB4NDEsCisJMHhiMCwgMHhiNywgMHg4YiwgMHg3NCwgMHg5YiwgMHhmNCwgMHhmYSwgMHhmNSwgMHhmOSwgMHhiNywgMHhjZCwgMHhmMSwKKwkweDA4LCAweDcwLCAweDcyLCAweDAwLCAweGYzLCAweDMxLCAweDUyLCAweGY0LCAweGJkLCAweGFjLCAweGUzLCAweGM3LAorCTB4MzEsIDB4NGUsIDB4ZDgsIDB4ODAsIDB4ZWQsIDB4YjAsIDB4MDUsIDB4ZGIsIDB4NjEsIDB4MDcsIDB4YjYsIDB4YzMsCisJMHgwZSwgMHg1YywgMHgyZCwgMHhhNywgMHhiNiwgMHg3MiwgMHg3ZiwgMHg0OSwgMHhmZSwgMHg5ZCwgMHhiYywgMHg3NywKKwkweGY5LCAweDFiLCAweDNhLCAweDM2LCAweDVmLCAweDdiLCAweDRiLCAweDFmLCAweDdjLCAweDc2LCAweGYxLCAweDkyLAorCTB4MDMsIDB4ZGMsIDB4NjMsIDB4M2YsIDB4ZWIsIDB4ZDUsIDB4ZGUsIDB4ZDIsIDB4MmYsIDB4ZWQsIDB4M2QsIDB4YzgsCisJMHhlZiwgMHhiOSwgMHgyNCwgMHgxZCwgMHhiNywgMHg3YywgMHhkOCwgMHhhOSwgMHgxZCwgMHhlOCwgMHgwMywgMHgxZSwKKwkweDMzLCAweDRlLCAweDMyLCAweDNlLCAweGU0LCAweDMwLCAweDRlLCAweDkxLCAweGRkLCAweDFjLCAweGQxLCAweDY3LAorCTB4YzQsIDB4YTYsIDB4MTksIDB4OGIsIDB4YjgsIDB4YTUsIDB4M2QsIDB4YjIsIDB4MjUsIDB4YjEsIDB4ZGIsIDB4NDksCisJMHgwZSwgMHhhOCwgMHg0OCwgMHg3MiwgMHhhMCwgMHhjZiwgMHgwOSwgMHhjYiwgMHhmMSwgMHgwZSwgMHg2YSwgMHhjOCwKKwkweDE5LCAweGMwLCAweDdhLCAweGEwLCAweGY0LCAweDc1LCAweGQwLCAweGQzLCAweDc5LCAweDI5LCAweDFjLCAweDZmLAorCTB4OTAsIDB4YTksIDB4NjIsIDB4YmIsIDB4OTcsIDB4NTUsIDB4MzEsIDB4ZTEsIDB4YmUsIDB4MTIsIDB4NzUsIDB4MGEsCisJMHg0NCwgMHg3ZiwgMHgyNiwgMHgyYSwgMHgxMywgMHhhMywgMHgxYiwgMHg0NSwgMHg2OSwgMHhkYiwgMHhiZCwgMHg0NSwKKwkweGIyLCAweDYzLCAweGEzLCAweDcyLCAweGJlLCAweDViLCAweDlhLCAweDE0LCAweGRhLCAweGU3LCAweGRkLCAweGRlLAorCTB4ZWEsIDB4MTQsIDB4ZDcsIDB4MTEsIDB4NDMsIDB4NWUsIDB4NTgsIDB4NGYsIDB4M2UsIDB4MTksIDB4MDUsIDB4MGUsCisJMHg0MSwgMHhiNywgMHg4YywgMHhlYiwgMHhkNiwgMHgwOSwgMHhlNSwgMHhkZSwgMHhlZCwgMHgzYSwgMHg2NiwgMHhjYSwKKwkweDM4LCAweDZkLCAweGY1LCAweDdhLCAweDAzLCAweGY5LCAweDIzLCAweGJhLCAweDJjLCAweDdmLCAweDRjLCAweDk2LAorCTB4YjgsIDB4MzYsIDB4MjMsIDB4NzksIDB4OTcsIDB4NzEsIDB4NjEsIDB4MWYsIDB4YmYsIDB4YzcsIDB4NTksIDB4YjYsCisJMHg0ZSwgMHg0NiwgMHhiYSwgMHhmMywgMHg3NiwgMHg4ZiwgMHhjNywgMHgzNywgMHhjMSwgMHgwNywgMHgxYywgMHg5ZiwKKwkweDVlLCAweDI3LCAweDAxLCAweGFmLCAweDJmLCAweDVlLCAweGNmLCAweDg4LCAweDU2LCAweGM5LCAweDAzLCAweDQ3LAorCTB4NjYsIDB4NDYsIDB4YzMsIDB4ZjUsIDB4MGYsIDB4YjYsIDB4ODcsIDB4ZWYsIDB4NzEsIDB4MjMsIDB4NmYsIDB4YjMsCisJMHg0YiwgMHhlYSwgMHgxMSwgMHgyZSwgMHhhZSwgMHg1NSwgMHgyZSwgMHg5NCwgMHhiMSwgMHg0YSwgMHg5ZiwgMHgxMywKKwkweGY2LCAweGI0LCAweDdjLCAweDNkLCAweDVkLCAweDMxLCAweGIyLCAweDc1LCAweGJjLCAweDEyLCAweGVhLCAweDk2LAorCTB4YTgsIDB4ZDEsIDB4YTUsIDB4NGIsIDB4ZjQsIDB4ODksIDB4ODksIDB4NjAsIDB4Y2UsIDB4ZWIsIDB4OTMsIDB4NGIsCisJMHgzYSwgMHg0NiwgMHhmNywgMHg2YiwgMHg1MywgMHgyZCwgMHhlMiwgMHgxZSwgMHg5MywgMHhkOSwgMHgxMSwgMHhmZiwKKwkweDU0LCAweDJiLCAweGY3LCAweDY5LCAweDhjLCAweGE0LCAweGRlLCAweDhjLCAweDdlLCAweDhjLCAweGI1LCAweDUwLAorCTB4MWYsIDB4MGUsIDB4YTksIDB4YjUsIDB4NzgsIDB4YWYsIDB4ZDEsIDB4ZjQsIDB4MDcsIDB4OWUsIDB4YzIsIDB4YjcsCisJMHhmMSwgMHgxMywgMHhiZSwgMHgwYywgMHgzZiwgMHhlMSwgMHgwOSwgMHhlOCwgMHhiYSwgMHg3MywgMHhmMCwgMHgxMywKKwkweDFlLCAweDg3LCAweDlmLCAweGYwLCAweDE4LCAweGZjLCAweDg0LCAweDQ3LCAweGExLCAweDI3LCAweGFiLCAweGZkLAorCTB4ODMsIDB4ZTEsIDB4MDUsIDB4ZmUsIDB4NDEsIDB4YTAsIDB4ZjksIDB4OWYsIDB4MzEsIDB4YzAsIDB4YzcsIDB4YWIsCisJMHg3YywgMHg4MywgMHhiZCwgMHg0NiwgMHg1ZiwgMHhjMSwgMHhlZiwgMHgzNywgMHg3YywgMHhkNCwgMHhhNiwgMHg2ZSwKKwkweGQ2LCAweGZhLCAweGQxLCAweGVjLCAweGQ5LCAweDFkLCAweDk4LCAweGQzLCAweDU3LCAweDZkLCAweGNhLCAweGU4LAorCTB4YWIsIDB4ODksIDB4NzksIDB4N2QsIDB4NjUsIDB4ZjgsIDB4ZTgsIDB4ZDgsIDB4YTgsIDB4NDQsIDB4ZmMsIDB4ZDEsCisJMHhlOSwgMHg2YywgMHg2YSwgMHhiYiwgMHhlNiwgMHhhMSwgMHgyNiwgMHg3ZiwgMHhhMywgMHg0NCwgMHgxZSwgMHg1MCwKKwkweGNkLCAweDM1LCAweDkyLCAweGI1LCAweGRmLCAweGEwLCAweGFmLCAweGEzLCAweDVmLCAweDQ3LCAweDViLCAweGVmLAorCTB4OTQsIDB4OWMsIDB4YjYsIDB4Y2YsIDB4YWUsIDB4OGMsIDB4ZWYsIDB4NDcsIDB4MTcsIDB4ZTEsIDB4YmIsIDB4NTAsCisJMHg3YSwgMHg1NiwgMHhlMywgMHhmYywgMHg3ZSwgMHg3ZCwgMHgyNiwgMHhiZiwgMHg0MSwgMHg4NiwgMHhjYiwgMHgyMSwKKwkweGNlLCAweDc5LCAweDA2LCAweDhlLCAweGZiLCAweDMwLCAweDVhLCAweDI1LCAweDcyLCAweGFjLCAweDQ1LCAweGZhLAorCTB4NTMsIDB4YTIsIDB4NzIsIDB4YTksIDB4OTUsIDB4N2EsIDB4ZmYsIDB4Y2EsIDB4YTksIDB4NmUsIDB4ODksIDB4ZTcsCisJMHhiYSwgMHg0OSwgMHhhYiwgMHhmNywgMHhjOSwgMHg4NCwgMHg5ZSwgMHg4YiwgMHgxNiwgMHhhOSwgMHgzOSwgMHg0NiwKKwkweDFiLCAweDI1LCAweDVjLCAweGMzLCAweGJiLCAweGJkLCAweGM1LCAweGRlLCAweDQxLCAweDFkLCAweDM1LCAweGU1LAorCTB4NDQsIDB4MGUsIDB4ZWEsIDB4ZjksIDB4OWEsIDB4ZDUsIDB4N2IsIDB4MGMsIDB4NmYsIDB4OWUsIDB4NjIsIDB4MmMsCisJMHg5ZSwgMHhmNywgMHhmZCwgMHgzMSwgMHgwZSwgMHhmZiwgMHhhZiwgMHg5OSwgMHhiZiwgMHg0MiwgMHg4YiwgMHhiMSwKKwkweDY3LCAweGQ2LCAweDU4LCAweDNiLCAweGM2LCAweGM0LCAweGE5LCAweDk2LCAweGI3LCAweDYxLCAweGQ4LCAweDRlLAorCTB4ZjUsIDB4MWQsIDB4YjUsIDB4YWIsIDB4ZTAsIDB4MDMsIDB4MzcsIDB4YTAsIDB4NGQsIDB4YWUsIDB4NjMsIDB4ZGIsCisJMHhiZiwgMHgxNywgMHhlNCwgMHhmZCwgMHhiMywgMHg3MywgMHhjMCwgMHg1ZiwgMHg4NSwgMHhiNCwgMHgwNiwgMHhlNCwKKwkweDMxLCAweDY2LCAweGYzLCAweDg1LCAweDE2LCAweGM2LCAweDY1LCAweGIzLCAweDdlLCAweGEzLCAweDRkLCAweDViLAorCTB4ZTUsIDB4OGMsIDB4OGMsIDB4YjYsIDB4YzMsIDB4MzcsIDB4ZTcsIDB4MzksIDB4NzYsIDB4ZTYsIDB4ZjcsIDB4NzMsCisJMHhlZSwgMHg4NCwgMHg3ZiwgMHhhYiwgMHg2OSwgMHgxMiwgMHhmMiwgMHg2NywgMHg4ZiwgMHg1YywgMHg2YiwgMHhlMywKKwkweGNlLCAweGQ0LCAweGMzLCAweGJmLCAweGI4LCAweDYwLCAweGJkLCAweGY2LCAweDEwLCAweGY0LCAweGQ4LCAweGFkLAorCTB4OTAsIDB4NDcsIDB4ZDQsIDB4YzMsIDB4ODcsIDB4ZTQsIDB4MTcsIDB4MmMsIDB4M2QsIDB4MmYsIDB4ZDQsIDB4YzMsCisJMHgxNywgMHg4NSwgMHhiMSwgMHhlMSwgMHgyZSwgMHhlNCwgMHhlNSwgMHg4MywgMHgyOCwgMHhlOCwgMHhlMSwgMHg3MCwKKwkweDk1LCAweGFmLCAweDQ2LCAweGJmLCAweGFmLCAweDJlLCAweDZkLCAweGQ2LCAweGMwLCAweDE2LCAweGZhLCAweDdkLAorCTB4OTAsIDB4MDMsIDB4YjEsIDB4ZDAsIDB4Y2YsIDB4YWIsIDB4OWQsIDB4NWIsIDB4YTMsIDB4ZGQsIDB4NjksIDB4ZWIsCisJMHg4ZSwgMHhhNCwgMHg1ZSwgMHgyMiwgMHg4ZSwgMHgxMiwgMHg4NywgMHhlNCwgMHhmNiwgMHhmNSwgMHhiYywgMHgyNiwKKwkweGNmLCAweGY1LCAweGJmLCAweGE1LCAweDcxLCAweDI2LCAweDhhLCAweGI0LCAweGI3LCAweDQ2LCAweGMzLCAweDY4LAorCTB4ZTUsIDB4N2MsIDB4MjIsIDB4ZGMsIDB4YmYsIDB4NTEsIDB4YjAsIDB4NzUsIDB4ZjcsIDB4ZDgsIDB4ZjUsIDB4ZjgsCisJMHg4MiwgMHg3YywgMHg5YiwgMHg3MSwgMHhjZSwgMHg0NCwgMHg1ZiwgMHg2NCwgMHgyNSwgMHhjZiwgMHg2NCwgMHhhMywKKwkweGVlLCAweGVkLCAweGRhLCAweDZmLCAweGNmLCAweDQ4LCAweGQ4LCAweDE2LCAweGJmLCAweDZiLCAweGFhLCAweGRhLAorCTB4YTYsIDB4MWQsIDB4YzUsIDB4ZjcsIDB4ZTIsIDB4ZmIsIDB4MWIsIDB4OWUsIDB4ZDcsIDB4NmIsIDB4OGIsIDB4ZTYsCisJMHg2ZSwgMHg5YSwgMHg5MCwgMHg0ZiwgMHhjOCwgMHgzYiwgMHgwOSwgMHg3ZCwgMHg4ZSwgMHhjOSwgMHgzZiwgMHg0NiwKKwkweGJiLCAweDg3LCAweGViLCAweGFlLCAweGRlLCAweGY0LCAweDcwLCAweGVhLCAweDIzLCAweGZhLCAweDBlLCAweGQ1LAorCTB4NzEsIDB4MTEsIDB4YTcsIDB4OTAsIDB4ZGEsIDB4YWIsIDB4ZjcsIDB4OWQsIDB4MTQsIDB4NzQsIDB4N2MsIDB4MzksCisJMHg4ZiwgMHhmNywgMHhiYywgMHg4ZiwgMHhkYSwgMHg3NiwgMHg4YywgMHg3ZiwgMHgwYiwgMHg4OCwgMHg2OSwgMHgxZiwKKwkweDA0LCAweDZjLCAweGQ0LCAweDIxLCAweDk0LCAweGJkLCAweDMxLCAweDY5LCAweDNiLCAweGZhLCAweDdlLCAweGNkLAorCTB4MGIsIDB4NmIsIDB4ZTEsIDB4MGIsIDB4ZjQsIDB4MWUsIDB4ODUsIDB4YWUsIDB4M2UsIDB4MWEsIDB4OTcsIDB4ZmUsCisJMHhhMywgMHg1YSwgMHgzNywgMHg2NiwgMHg5NiwgMHhjNiwgMHgwYSwgMHhiNiwgMHg3OCwgMHgyZSwgMHhmZCwgMHg4OSwKKwkweDk4LCAweDI3LCAweGQ3LCAweDFjLCAweDhkLCAweGM4LCAweGUxLCAweGQ4LCAweDE2LCAweGFmLCAweGMzLCAweGI5LAorCTB4ZDEsIDB4ZWEsIDB4NDIsIDB4NDMsIDB4N2YsIDB4YTAsIDB4MTUsIDB4ZDQsIDB4MzcsIDB4ZWIsIDB4OTAsIDB4YmQsCisJMHhmMywgMHhiMSwgMHg2YiwgMHhkNCwgMHg3ZiwgMHg0OSwgMHg0NiwgMHhjOCwgMHg0YiwgMHg5NSwgMHg4OCwgMHg4YywKKwkweDBmLCAweGI2LCAweDAyLCAweDllLCAweGI3LCAweGFlLCAweDA3LCAweDBlLCAweDQwLCAweDUzLCAweDk4LCAweDFmLAorCTB4ZmQsIDB4ZjcsIDB4M2MsIDB4ZGMsIDB4MzgsIDB4ZTUsIDB4NTcsIDB4MWIsIDB4ZmEsIDB4ZWYsIDB4M2IsIDB4NGEsCisJMHgxZCwgMHhlNiwgMHg2YiwgMHhiZSwgMHg0NiwgMHhiZiwgMHg1ZSwgMHg4ZCwgMHhmNiwgMHgzZCwgMHhjOCwgMHg4YiwKKwkweDZmLCAweDExLCAweGZmLCAweDAxLCAweGM4LCAweGI1LCAweGEzLCAweDUxLCAweGU5LCAweDM4LCAweGRhLCAweDIwLAorCTB4OWIsIDB4OGUsIDB4ZDIsIDB4ZjcsIDB4YTgsIDB4ZjYsIDB4NDUsIDB4NjksIDB4OGIsIDB4NWUsIDB4YzIsIDB4YjgsCisJMHg2ZSwgMHgzNCwgMHhmNywgMHgwZCwgMHg0ZSwgMHg0NSwgMHg2NSwgMHgxZiwgMHhmOSwgMHgxNSwgMHg2NSwgMHg3MywKKwkweGIwLCAweDkzLCAweGIzLCAweDQ3LCAweDNkLCAweGJkLCAweDE2LCAweDlhLCAweGM1LCAweDM4LCAweGY5LCAweDM3LAorCTB4MmMsIDB4ZmEsIDB4OGUsIDB4MWEsIDB4MzksIDB4NTMsIDB4YTAsIDB4NmYsIDB4MzIsIDB4ZDAsIDB4MDIsIDB4YmMsCisJMHgzZSwgMHg2MCwgMHhmOSwgMHhlNSwgMHgzZCwgMHhlYiwgMHgyZCwgMHg1ZiwgMHhmZSwgMHg5YywgMHhmYywgMHg5NiwKKwkweDViLCAweDZmLCAweGU0LCAweGU1LCAweDg3LCAweGQ2LCAweDczLCAweDJmLCAweGQyLCAweDVhLCAweDlmLCAweGVmLAorCTB4M2EsIDB4NmQsIDB4NDMsIDB4MTgsIDB4YjksIDB4ZjksIDB4N2EsIDB4ZmMsIDB4MjcsIDB4YzAsIDB4NTEsIDB4YjgsCisJMHhmZSwgMHg0NCwgMHgzZSwgMHhlNCwgMHgxYSwgMHhiMiwgMHgzZSwgMHhiMywgMHg5MiwgMHg5YSwgMHhkMSwgMHg3ZiwKKwkweDUzLCAweDg5LCAweDZiLCAweDYxLCAweGYzLCAweGY3LCAweDU5LCAweDZkLCAweGFmLCAweDMwLCAweDM2LCAweGZlLAorCTB4NGMsIDB4ZjgsIDB4MzcsIDB4OWMsIDB4YWEsIDB4ZjYsIDB4MTksIDB4NTYsIDB4YWYsIDB4NzUsIDB4MzEsIDB4YmUsCisJMHgzNCwgMHhiNywgMHgxNywgMHgyOCwgMHgxOCwgMHhkNSwgMHg3NywgMHhjMiwgMHhjNSwgMHg5YywgMHg4YiwgMHhjNSwKKwkweDVhLCAweGU3LCAweDliLCAweDYzLCAweDEyLCAweGI4LCAweDdlLCAweGRjLCAweGY5LCAweDk2LCAweGNmLCAweGI1LAorCTB4NzEsIDB4Y2YsIDB4NzksIDB4YjksIDB4ZTgsIDB4ODMsIDB4ZjcsIDB4ZmUsIDB4MDIsIDB4ZTMsIDB4NjgsIDB4NzUsCisJMHg1ZSwgMHhjMSwgMHg5YywgMHgxZSwgMHgyYywgMHg2NSwgMHg5MiwgMHg5ZSwgMHg4ZCwgMHg4MywgMHgzZiwgMHg1YiwKKwkweDZjLCAweDc1LCAweDllLCAweDliLCAweDhmLCAweDIxLCAweGY1LCAweDg0LCAweDc0LCAweDcxLCAweDg4LCAweDc5LAorCTB4NjUsIDB4ZTQsIDB4OTUsIDB4MTksIDB4ZWIsIDB4YWQsIDB4NzcsIDB4MjYsIDB4YzcsIDB4ZWMsIDB4N2UsIDB4MTIsCisJMHhhMywgMHg4YiwgMHhlNiwgMHhkNiwgMHg1ZiwgMHgwNiwgMHhmNCwgMHhmYSwgMHg4NCwgMHhlYiwgMHg0YywgMHg0ZSwKKwkweDRkLCAweGFmLCAweDM3LCAweGZiLCAweDhhLCAweDZhLCAweDkxLCAweDY3LCAweGY2LCAweDU4LCAweDRlLCAweDRjLAorCTB4ZDUsIDB4YTIsIDB4NGMsIDB4YmQsIDB4MzMsIDB4YTEsIDB4NjMsIDB4NWUsIDB4ZGEsIDB4ZjYsIDB4NzAsIDB4YzYsCisJMHhhNywgMHhlYSwgMHg5ZCwgMHgyOSwgMHhiZCwgMHhkNiwgMHgxYywgMHg3NSwgMHg0ZSwgMHg4ZSwgMHhiMSwgMHhlZCwKKwkweDI4LCAweGNhLCAweDg4LCAweDczLCAweDBhLCAweGVkLCAweDRkLCAweDhkLCAweGI1LCAweGM3LCAweGY3LCAweDQ5LAorCTB4M2IsIDB4NmMsIDB4MDEsIDB4ZmUsIDB4OGQsIDB4MzQsIDB4ZGUsIDB4MTcsIDB4ZTAsIDB4M2EsIDB4NTMsIDB4NzMsCisJMHhlZCwgMHgyYSwgMHhiNCwgMHhjMywgMHhiMiwgMHhhNCwgMHg0MSwgMHhmNiwgMHhlYiwgMHhhMiwgMHhmZCwgMHhhNSwKKwkweDZiLCAweDUyLCAweDRiLCAweDcxLCAweDMyLCAweDA2LCAweDljLCAweDFjLCAweGI0LCAweDM4LCAweDM5LCAweDYxLAorCTB4NzEsIDB4MzIsIDB4NWEsIDB4ODUsIDB4OTMsIDB4ODcsIDB4MTcsIDB4ZTEsIDB4ZTQsIDB4MDQsIDB4NzAsIDB4ZjIsCisJMHhmMCwgMHgxNSwgMHg3MCwgMHg4MiwgMHhiYywgMHhmMiwgMHhjMywgMHgxNiwgMHgyNywgMHhmNywgMHgyZCwgMHhjMiwKKwkweDQ5LCAweDdlLCAweDJlLCAweDE2LCAweDZmLCAweDcwLCAweDMyLCAweDAyLCAweDljLCAweGQ0LCAweGI0LCAweDFhLAorCTB4ZDgsIDB4MGYsIDB4NWEsIDB4OWMsIDB4ZTAsIDB4M2QsIDB4NzUsIDB4MTAsIDB4NjUsIDB4ZWUsIDB4YWIsIDB4YzIsCisJMHhjOSwgMHg0MSwgMHhlMCwgMHhlNCwgMHgzZSwgMHg4YiwgMHg5MywgMHhjMywgMHgxNiwgMHgyNywgMHg4NywgMHg1MSwKKwkweDI2LCAweDBmLCAweDljLCAweDE0LCAweDk2LCAweGMxLCAweGM5LCAweDA4LCAweDcwLCAweDEyLCAweGI2LCAweDViLAorCTB4NDAsIDB4M2IsIDB4ODcsIDB4YWIsIDB4NzAsIDB4MzIsIDB4YjIsIDB4MGMsIDB4NGUsIDB4YjgsIDB4ZTYsIDB4MWEsCisJMHhlZSwgMHhlMSwgMHhiZSwgMHhmYywgMHgwNiwgMHg3YiwgMHhiOCwgMHg1MywgMHg5ZiwgMHg3ZCwgMHhlMywgMHgzZCwKKwkweGRjLCAweDJjLCAweDczLCAweGI5LCAweGVhLCAweGNjLCAweGZiLCAweGIzLCAweDc2LCAweDRmLCAweDlhLCAweGQ5LAorCTB4ZmIsIDB4MzcsIDB4N2YsIDB4MGYsIDB4NWUsIDB4M2IsIDB4ZjgsIDB4YmMsIDB4OTAsIDB4ZjcsIDB4YzQsIDB4ZWMsCisJMHgyMSwgMHg3NSwgMHhiNywgMHg0ZCwgMHg4MSwgMHhkNywgMHg4ZSwgMHhjYSwgMHg4MSwgMHhlMywgMHhiNSwgMHg4NywKKwkweDczLCAweDM2LCAweGNkLCAweGRmLCAweGQ2LCAweDllLCAweDU3LCAweDhhLCAweDc5LCAweGUxLCAweGRlLCAweDgzLAorCTB4MTcsIDB4Y2QsIDB4NWQsIDB4NTAsIDB4MzEsIDB4OWUsIDB4YzcsIDB4YTgsIDB4NWUsIDB4N2IsIDB4N2UsIDB4ZDEsCisJMHhkZSwgMHg1NSwgMHhlNCwgMHhkZCwgMHg5YiwgMHhmNSwgMHhhNywgMHgxMywgMHhkYywgMHg1NywgMHg1NSwgMHhkMCwKKwkweGYwLCAweDcyLCAweDJkLCAweGFkLCAweDQ3LCAweGVmLCAweGE1LCAweGNhLCAweDE2LCAweDY5LCAweDY3LCAweDI3LAorCTB4YjgsIDB4MjcsIDB4MGQsIDB4ZjYsIDB4MzEsIDB4ZjcsIDB4ZWQsIDB4OWEsIDB4N2QsIDB4YmEsIDB4YmQsIDB4MGIsCisJMHhmNiwgMHhlOSwgMHg1NiwgMHg5ZiwgMHhlZiwgMHgyNiwgMHhkZiwgMHhjZCwgMHhkMywgMHhjZCwgMHhjMSwgMHhiOSwKKwkweGJiLCAweDU3LCAweDhmLCAweDNiLCAweGNmLCAweGU4LCAweGY4LCAweDcwLCAweDNkLCAweGU2LCAweDI3LCAweDA4LAorCTB4NGUsIDB4YTcsIDB4NGMsIDB4NWMsIDB4NzYsIDB4NDYsIDB4YzcsIDB4NjUsIDB4MDUsIDB4MWUsIDB4ZjgsIDB4YjAsCisJMHg4ZCwgMHhjZCwgMHg3NiwgMHhmNCwgMHg1YywgMHg5ZSwgMHg4YiwgMHhjYiwgMHgyZSwgMHhkOCwgMHhhMywgMHhhMywKKwkweGVmLCAweGZmLCAweGM4LCAweDhlLCAweDVlLCAweGQyLCAweDdiLCAweDcxLCAweGZhLCAweDUyLCAweDhlLCAweDE0LAorCTB4MjAsIDB4MjMsIDB4ZjYsIDB4OGMsIDB4YmYsIDB4MmEsIDB4YzMsIDB4MGYsIDB4ZjIsIDB4OWIsIDB4M2EsIDB4MmQsCisJMHgwMiwgMHhiZCwgMHg0NSwgMHhiOSwgMHg5ZCwgMHg5NywgMHg2YywgMHgwZiwgMHhkMywgMHg0YywgMHg5ZCwgMHgzZSwKKwkweGVkLCAweDIzLCAweDFmLCAweDc3LCAweDdhLCAweGU3LCAweGZhLCAweDI3LCAweDdlLCAweGMzLCAweDM1LCAweDcwLAorCTB4ZmUsIDB4YTYsIDB4OWQsIDB4OTMsIDB4NzEsIDB4YjIsIDB4MTUsIDB4ZTYsIDB4ODcsIDB4NmIsIDB4ZTEsIDB4NzcsCisJMHhkYiwgMHhmYiwgMHgwOCwgMHg5OSwgMHg1ZiwgMHg3ZCwgMHhmZiwgMHhiNSwgMHhlMSwgMHhkMywgMHhhYywgMHhmZSwKKwkweDNiLCAweDIyLCAweDIzLCAweDRlLCAweDFmLCAweGVhLCAweDRjLCAweDdiLCAweDBkLCAweDAzLCAweDJhLCAweDdkLAorCTB4ZDMsIDB4MDAsIDB4Y2YsIDB4Y2EsIDB4NGQsIDB4MmMsIDB4ZjksIDB4ZmIsIDB4MDEsIDB4ZjMsIDB4YmEsIDB4YjAsCisJMHhhMCwgMHhlNywgMHg5NCwgMHhmYiwgMHhiMCwgMHhhNiwgMHg0MSwgMHg4YiwgMHg5YSwgMHhiNiwgMHgzNCwgMHhmZCwKKwkweDFmLCAweDk4LCAweGQzLCAweDkxLCAweGQ0LCAweGFkLCAweGQ0LCAweDkzLCAweGExLCAweDhlLCAweDRjLCAweGM2LAorCTB4ZmIsIDB4NzgsIDB4N2YsIDB4ODQsIDB4YTYsIDB4NzEsIDB4N2IsIDB4OTcsIDB4YzQsIDB4ZDQsIDB4MzksIDB4YWQsCisJMHhkZiwgMHg0NywgMHg1MiwgMHhiYywgMHg1ZiwgMHg2NiwgMHg5OSwgMHhiMiwgMHhhMywgMHg1NSwgMHg2NSwgMHhmNSwKKwkweGI4LCAweDNkLCAweGY5LCAweDQzLCAweGNjLCAweGNkLCAweDE3LCAweDYxLCAweDZmLCAweGY2LCAweDhlLCAweGJkLAorCTB4MGEsIDB4OWYsIDB4MzEsIDB4MmUsIDB4NWYsIDB4MmEsIDB4YmQsIDB4MDQsIDB4N2EsIDB4Y2QsIDB4YWYsIDB4YjUsCisJMHg3NywgMHhlMSwgMHg2NSwgMHgwMSwgMHgzNywgMHhjZiwgMHgzOCwgMHhlYiwgMHhmZCwgMHhjMywgMHg5MSwgMHgzZiwKKwkweDAyLCAweDVkLCAweGZjLCAweGMxLCAweDRiLCAweGVjLCAweDAzLCAweGIwLCAweDQ0LCAweDYwLCAweGNmLCAweGMzLAorCTB4MzYsIDB4MTgsIDB4N2YsIDB4NDksIDB4ZWYsIDB4OTUsIDB4YmIsIDB4YmUsIDB4ZmMsIDB4OTIsIDB4OGUsIDB4NTMsCisJMHhmNCwgMHg5NywgMHg1YiwgMHg2NSwgMHg3YiwgMHhiOSwgMHg0MSwgMHg3NiwgMHg0MCwgMHgyZiwgMHhlYywgMHgyOCwKKwkweGZiLCAweDc4LCAweGEyLCAweDcyLCAweDYzLCAweGQ5LCAweGNjLCAweGQzLCAweDQ3LCAweGNhLCAweDljLCAweGVmLAorCTB4NmQsIDB4MzIsIDB4NzEsIDB4YmMsIDB4OWEsIDB4NjYsIDB4YTcsIDB4ZWQsIDB4ZGUsIDB4MzEsIDB4ZDIsIDB4MGYsCisJMHg5ZSwgMHg1MiwgMHgzMiwgMHgzZiwgMHhhZCwgMHhjNywgMHhjZSwgMHg1ZCwgMHhhYywgMHhjOSwgMHhjMywgMHhiMywKKwkweGMyLCAweGJkLCAweGY4LCAweGZjLCAweDFiLCAweDc0LCAweGRmLCAweDY4LCAweGU1LCAweDE5LCAweDc3LCAweGRlLAorCTB4OGYsIDB4ZDgsIDB4NWYsIDB4MDksIDB4ZjcsIDB4ODYsIDB4YmYsIDB4ZmUsIDB4MTksIDB4MTAsIDB4ZmQsIDB4NzcsCisJMHg1ZCwgMHhmNCwgMHhkZSwgMHg3MCwgMHg0ZCwgMHg3YiwgMHhkMiwgMHg3NiwgMHgyNiwgMHhhNiwgMHg3NSwgMHg4NCwKKwkweGExLCAweGYxLCAweGY5LCAweGJmLCAweGU3LCAweDIyLCAweGYyLCAweDdmLCAweDAxLCAweDk1LCAweGY2LCAweDJkLAorCTB4NTgsIDB4ZDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9DUF9iMDlGd0RhdGFbKDB4NTAvNCkgKyAxXSA9IHsKKwkweDAwMDEwMDMwLCAweDAwMDAwMDMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAxLCAweDAwMDEwZmQwLCAweDAwMDAwZmQwLAorCTB4MDAwMDE0MzAsIDB4MDAwMDAwN2YsIDB4MDAwMzA0MDAsIDB4MDAwMDEwMDAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMjAsCisJMHgwMDA1MDIwMCwgMHgwMDAwMTAwMCwgMHgwMDAwMDAzMCwgMHgwMDAwMDAxMCwgMHgwMDAxMDQwMCwgMHgwMDAwMDQwMCwKKwkweDAwMDAxMDMwLCAweDAwMDAwMDIwLCAweDAwMDAwMDAwIH07CitzdGF0aWMgdTMyIGJueDJfQ1BfYjA5RndSb2RhdGFbKDB4MTE4LzQpICsgMV0gPSB7CisJMHgwODAwMDVkOCwgMHgwODAwMDdmOCwgMHgwODAwMDczYywgMHgwODAwMDc2NCwgMHgwODAwMDc4YywgMHgwODAwMDdiNCwKKwkweDA4MDAwNjEwLCAweDA4MDAwNWZjLCAweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwNjJjLCAweDA4MDAwNjQ4LAorCTB4MDgwMDA2NDgsIDB4MDgwMDA4MjAsIDB4MDgwMDA2NjAsIDB4MDgwMDA2NzQsIDB4MDgwMDA4MjAsIDB4MDgwMDA2ODgsCisJMHgwODAwMDgyMCwgMHgwODAwMDgyMCwgMHgwODAwMDY5YywgMHgwODAwMDgyMCwgMHgwODAwMDgyMCwgMHgwODAwMDgyMCwKKwkweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwODIwLCAweDA4MDAwODIwLAorCTB4MDgwMDA4MjAsIDB4MDgwMDA2YjAsIDB4MDgwMDA4MjAsIDB4MDgwMDA2YzQsIDB4MDgwMDA2ZDgsIDB4MDgwMDA2ZWMsCisJMHgwODAwMDgyMCwgMHgwODAwMDcwMCwgMHgwODAwMDcxNCwgMHgwODAwMDcyOCwgMHgwODAwMzc0MCwgMHgwODAwMzc1OCwKKwkweDA4MDAzNzY4LCAweDA4MDAzNzc4LCAweDA4MDAzNzkwLCAweDA4MDAzN2E4LCAweDA4MDAzN2I4LCAweDA4MDAzN2M4LAorCTB4MDgwMDM3ZTgsIDB4MDgwMDM3ZjgsIDB4MDgwMDM4MDgsIDB4MDgwMDM4OTgsIDB4MDgwMDM3ZDgsIDB4MDgwMDM4MTgsCisJMHgwODAwMzgyOCwgMHgwODAwMzg0MCwgMHgwODAwMzg2MCwgMHgwODAwMzg5OCwgMHgwODAwMzg3OCwgMHgwODAwMzg3OCwKKwkweDA4MDA1NWYwLCAweDA4MDA1NWYwLCAweDA4MDA1NWYwLCAweDA4MDA1NWYwLCAweDA4MDA1NWYwLCAweDA4MDA1NjE4LAorCTB4MDgwMDU2MTgsIDB4MDgwMDU2NDAsIDB4MDgwMDU2OTAsIDB4MDgwMDU2NjAsIDB4MDAwMDAwMDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9DUF9iMDlGd0Jzc1soMHg4NzAvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfQ1BfYjA5RndTYnNzWygweGU5LzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9jcF9md18wOSA9IHsKKwkudmVyX21ham9yCQkJPSAweDEsCisJLnZlcl9taW5vcgkJCT0gMHgwLAorCS52ZXJfZml4CQkJPSAweDAsCisKKwkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDA2YywKKworCS50ZXh0X2FkZHIJCQk9IDB4MDgwMDAwMDAsCisJLnRleHRfbGVuCQkJPSAweDczY2MsCisJLnRleHRfaW5kZXgJCQk9IDB4MCwKKwkuZ3pfdGV4dAkJCT0gYm54Ml9DUF9iMDlGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9DUF9iMDlGd1RleHQpLAorCisJLmRhdGFfYWRkcgkJCT0gMHgwODAwNzUwMCwKKwkuZGF0YV9sZW4JCQk9IDB4NTAsCisJLmRhdGFfaW5kZXgJCQk9IDB4MCwKKwkuZGF0YQkJCQk9IGJueDJfQ1BfYjA5RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwNzU1NCwKKwkuc2Jzc19sZW4JCQk9IDB4ZTksCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfQ1BfYjA5RndTYnNzLAorCisJLmJzc19hZGRyCQkJPSAweDA4MDA3NjQwLAorCS5ic3NfbGVuCQkJPSAweDg3MCwKKwkuYnNzX2luZGV4CQkJPSAweDAsCisJLmJzcwkJCQk9IGJueDJfQ1BfYjA5RndCc3MsCisKKwkucm9kYXRhX2FkZHIJCQk9IDB4MDgwMDczZDAsCisJLnJvZGF0YV9sZW4JCQk9IDB4MTE4LAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9DUF9iMDlGd1JvZGF0YSwKK307CisKK3N0YXRpYyB1OCBibngyX1JYUF9iMDlGd1RleHRbXSA9IHsKKwkweDFmLCAweDhiLCAweDA4LCAweDA4LCAweDE5LCAweGZkLCAweDJmLCAweDQ1LCAweDAwLCAweDAzLCAweDc0LCAweDY1LAorCTB4NzMsIDB4NzQsIDB4MzEsIDB4MmUsIDB4NjIsIDB4NjksIDB4NmUsIDB4MDAsIDB4ZWMsIDB4NWMsIDB4NmIsIDB4NmMsCisJMHgxYywgMHhkNywgMHg3NSwgMHgzZSwgMHhmMywgMHgyMCwgMHhiNSwgMHhhMiwgMHhmOCwgMHgxOCwgMHgyZSwgMHg1NywKKwkweGNjLCAweDRhLCAweDY2LCAweGVjLCAweDVkLCAweDcxLCAweDI0LCAweGIyLCAweDE2LCAweDZiLCAweDhjLCAweGQ4LAorCTB4YWQsIDB4NGQsIDB4MDQsIDB4NmIsIDB4N2IsIDB4MzMsIDB4YmIsIDB4OTIsIDB4OTgsIDB4NTQsIDB4ODUsIDB4MjksCisJMHg4NywgMHg3NSwgMHgwYywgMHhjMywgMHg3NSwgMHhkOSwgMHhhNSwgMHgxYSwgMHhiYiwgMHhhZSwgMHg1MSwgMHhjOCwKKwkweDhmLCAweGM0LCAweDA2LCAweDZhLCAweGQ2LCAweDliLCAweDI1LCAweGRkLCAweGE4LCAweGU5LCAweDgyLCAweDQzLAorCTB4NGIsIDB4YWEsIDB4ZTksIDB4MDIsIDB4NjksIDB4YmIsIDB4MjAsIDB4YTksIDB4YzcsIDB4OGYsIDB4ODUsIDB4NTYsCisJMHg3NiwgMHg1MiwgMHhjNywgMHhmOSwgMHhlMSwgMHg0OCwgMHg1MCwgMHg5NSwgMHgyMCwgMHgyOCwgMHgwYywgMHg0MywKKwkweDQ4LCAweDhkLCAweGQ2LCAweDNmLCAweGRhLCAweDQwLCAweDk1LCAweDlmLCAweDY4LCAweDkyLCAweDQyLCAweDQxLAorCTB4MGIsIDB4YzcsIDB4NjgsIDB4NmMsIDB4NGYsIDB4YmYsIDB4ZWYsIDB4Y2UsIDB4MGMsIDB4YjksIDB4YTQsIDB4NWYsCisJMHg0MCwgMHg3ZiwgMHhmNCwgMHg0ZiwgMHhlNywgMHgwMiwgMHg4YiwgMHhiOSwgMHhmNywgMHhjZSwgMHgzZCwgMHhlNywKKwkweDllLCAweDdiLCAweGRlLCAweGU3LCAweDBlLCAweGE1LCAweGRmLCAweGVmLCAweDk0LCAweDBlLCAweDA5LCAweDViLAorCTB4MTcsIDB4N2UsIDB4OTksIDB4YzMsIDB4OGYsIDB4M2QsIDB4NzQsIDB4YzMsIDB4ZDgsIDB4MGQsIDB4YTMsIDB4MjIsCisJMHg3YiwgMHhmNiwgMHgxOCwgMHg1YiwgMHgxMiwgMHg3YSwgMHgzNCwgMHgxZiwgMHhiNywgMHhiOCwgMHhjNSwgMHgyZCwKKwkweDZlLCAweDcxLCAweDhiLCAweDViLCAweGRjLCAweGUyLCAweDE2LCAweGI3LCAweGI4LCAweGM1LCAweDJkLCAweDZlLAorCTB4NzEsIDB4OGIsIDB4NWIsIDB4ZGMsIDB4ZTIsIDB4MTYsIDB4YjcsIDB4YjgsIDB4YzUsIDB4MmQsIDB4NmUsIDB4NzEsCisJMHg4YiwgMHg1YiwgMHhkYywgMHhlMiwgMHgxNiwgMHhiNywgMHhiOCwgMHhjNSwgMHgyZCwgMHg2ZSwgMHg3MSwgMHg4YiwKKwkweDViLCAweGRjLCAweGUyLCAweDE2LCAweGI3LCAweGI4LCAweGM1LCAweDJkLCAweDZlLCAweDcxLCAweDhiLCAweDViLAorCTB4ZGMsIDB4ZTIsIDB4MTYsIDB4YjcsIDB4YjgsIDB4YzUsIDB4MmQsIDB4NmUsIDB4NzEsIDB4OGIsIDB4NWIsIDB4ZGMsCisJMHhlMiwgMHhmNiwgMHhmZiwgMHhiZCwgMHgxOSwgMHgyMiwgMHgxNiwgMHg5ZiwgMHg1ZCwgMHhlMSwgMHg0ZiwgMHgxMiwKKwkweDdhLCAweGZlLCAweGYyLCAweDFmLCAweGJhLCAweGI2LCAweDI0LCAweDhjLCAweGZjLCAweGNmLCAweDY2LCAweGE2LAorCTB4NmQsIDB4OTEsIDB4NDIsIDB4NjMsIDB4NzcsIDB4YTYsIDB4MjgsIDB4ZWYsIDB4ZmIsIDB4OTUsIDB4OTQsIDB4MjksCisJMHg5YywgMHhmZiwgMHg2YywgMHhmZSwgMHhiZCwgMHhiZiwgMHg3ZCwgMHhmMSwgMHhhNiwgMHhlYywgMHhkNSwgMHhiYSwKKwkweDIxLCAweDA5LCAweDJiLCAweDNmLCAweGI3LCAweGM3LCAweGRhLCAweDI1LCAweDg5LCAweDAxLCAweGMwLCAweDdjLAorCTB4NmIsIDB4ZTgsIDB4YzcsIDB4ZGQsIDB4ZDIsIDB4MmQsIDB4NmIsIDB4NzgsIDB4ZWMsIDB4ODQsIDB4NWMsIDB4MzYsCisJMHg1ZSwgMHhkMCwgMHhkYywgMHhhNiwgMHhlZiwgMHg5ZiwgMHg3MCwgMHg3YywgMHhmZiwgMHg4NywgMHhmOCwgMHhiZCwKKwkweGU1LCAweDYwLCAweGVjLCAweDdkLCAweGUwLCAweDE3LCAweDRjLCAweDQzLCAweDc0LCAweGZiLCAweDJmLCAweDM0LAorCTB4NzcsIDB4YjksIDB4NDMsIDB4YWEsIDB4OGIsIDB4YTYsIDB4Y2MsIDB4N2EsIDB4MjksIDB4MzksIDB4ZTIsIDB4NTUsCisJMHhiNCwgMHg1MiwgMHhiMywgMHhhNiwgMHhlZCwgMHgzZCwgMHgzNSwgMHhhZiwgMHhlZCwgMHgzYiwgMHg3NSwgMHg0NCwKKwkweGRiLCAweDdmLCAweDZhLCAweDQxLCAweDczLCAweDRmLCAweDQ5LCAweDQ1LCAweGRmLCAweGQzLCAweDI5LCAweDA1LAorCTB4ZWIsIDB4YjQsIDB4NTYsIDB4NmMsIDB4ZjYsIDB4NmIsIDB4ZWUsIDB4ZTIsIDB4N2IsIDB4YmUsIDB4ZWIsIDB4NjQsCisJMHhhZCwgMHhiYiwgMHhjNCwgMHgyYywgMHg4MCwgMHgxNiwgMHg3MSwgMHg2YiwgMHgzZSwgMHhjNiwgMHhhNiwgMHgxNCwKKwkweDUyLCAweGJlLCAweGFmLCAweGU3LCAweGZkLCAweDI3LCAweGRjLCAweDljLCAweDZkLCAweGU5LCAweDVhLCAweDRhLAorCTB4YWEsIDB4Y2QsIDB4N2UsIDB4ZTAsIDB4ZWQsIDB4ZDQsIDB4OGEsIDB4OGIsIDB4YTYsIDB4NTYsIDB4ZjIsIDB4ZmMsCisJMHg3MywgMHhhZSwgMHgyMywgMHgwMywgMHg4NiwgMHhmOCwgMHhmZSwgMHg5YywgMHhiMywgMHgzMywgMHg3ZCwgMHg0OCwKKwkweDRlLCAweDAyLCAweDZmLCAweDAzLCAweGY4LCAweGM0LCAweGQyLCAweGYzLCAweGE0LCAweDhmLCAweDc0LCAweDkyLAorCTB4ZTQsIDB4OGEsIDB4NTYsIDB4MWMsIDB4OGEsIDB4ZTgsIDB4OTMsIDB4MGMsIDB4ZTksIDB4MmYsIDB4YWYsIDB4ZTgsCisJMHhhMCwgMHg3MywgMHg4YiwgMHg5NCwgMHhlYiwgMHg5NiwgMHg0YywgMHhhZCwgMHg2YywgMHg1YywgMHg3ZiwgMHhkOSwKKwkweDdmLCAweDcxLCAweDI4LCAweDI1LCAweGNmLCAweDM2LCAweGIzLCAweDQ3LCAweDJhLCAweDkyLCAweDkwLCAweDM5LAorCTB4MmYsIDB4MjMsIDB4N2EsIDB4NWUsIDB4MGEsIDB4NmUsIDB4NmUsIDB4NDAsIDB4Y2UsIDB4MzUsIDB4ZDMsIDB4ZjIsCisJMHg1YywgMHhkMywgMHg0ZSwgMHg1NywgMHg2NSwgMHg5MywgMHg5NCwgMHg1MywgMHg5NiwgMHg5YywgMHg2ZCwgMHhhNiwKKwkweDcwLCAweDQ2LCAweGZmLCAweDljLCAweDZlLCAweGRiLCAweDU2LCAweDE1LCAweDZiLCAweGFiLCAweGNkLCAweDk3LAorCTB4ZjgsIDB4ZWYsIDB4NWYsIDB4YWMsIDB4ZTksIDB4OWMsIDB4ODIsIDB4YTksIDB4ODAsIDB4ZWUsIDB4NzAsIDB4MmQsCisJMHhjZiwgMHhhMSwgMHhkNiwgMHhhYSwgMHhiMywgMHgwNCwgMHg2YiwgMHhhNSwgMHgzMiwgMHg5ZCwgMHhjMywgMHg1YywKKwkweDczLCAweDM0LCAweGU0LCAweGVmLCAweDE2LCAweDljLCAweDk3LCAweDRmLCAweDRiLCAweGFhLCAweDllLCAweDAxLAorCTB4ZGUsIDB4YjAsIDB4ZmYsIDB4Y2YsIDB4YzAsIDB4MzcsIDB4ODAsIDB4ZjMsIDB4NWUsIDB4YWIsIDB4N2UsIDB4ZWUsCisJMHhhMiwgMHhhNCwgMHg3NCwgMHhkOSwgMHg5OSwgMHgyZSwgMHgwYiwgMHg3OCwgMHhkYiwgMHhlYywgMHhjNCwgMHg5OCwKKwkweGY0LCAweGY5LCAweGZlLCAweDdlLCAweDQ3LCAweGFjLCAweGFhLCAweGQzLCAweDAzLCAweDk4LCAweDhjLCAweDU0LAorCTB4OWQsIDB4NmUsIDB4ZTAsIDB4NjksIDB4MTMsIDB4Y2IsIDB4ZTYsIDB4YjksIDB4YjgsIDB4ZDcsIDB4NjYsIDB4Y2MsCisJMHhmYiwgMHg1ZCwgMHg0NiwgMHhkZSwgMHhmNywgMHhhNywgMHg3MywgMHhkMiwgMHgxZCwgMHhjYywgMHhlZCwgMHg1NiwKKwkweDM4LCAweGE2LCAweDI2LCAweDM0LCAweGFjLCAweGZiLCAweDA1LCAweDY5LCAweDRlLCAweDI0LCAweGYzLCAweGVjLAorCTB4ZjMsIDB4OTksIDB4MTMsIDB4NzcsIDB4ZmUsIDB4ZGEsIDB4OTAsIDB4OTYsIDB4MzQsIDB4NjgsIDB4YjksIDB4MjYsCisJMHhlYywgMHg4MywgMHhmZiwgMHgxZSwgMHhmOCwgMHhlMCwgMHg3YywgMHgwNiwgMHg2MywgMHhlZCwgMHgzYSwgMHhlMCwKKwkweDE5LCAweGFlLCAweDBhLCAweGY3LCAweGU4LCAweDkzLCAweGE1LCAweDk0LCAweGU4LCAweDU3LCAweDljLCAweGRlLAorCTB4NzAsIDB4NWQsIDB4MzcsIDB4NjgsIDB4OGQsIDB4ZjQsIDB4YTAsIDB4NWYsIDB4ZTYsIDB4MTYsIDB4YzksIDB4ZWIsCisJMHgxYSwgMHg2NCwgMHg4MywgMHhlNywgMHg4ZCwgMHgxNSwgMHhhZCwgMHhkMCwgMHgzYywgMHg4MiwgMHhiZSwgMHgyOSwKKwkweGQzLCAweGI2LCAweDdmLCAweDZlLCAweGNlLCAweDk5LCAweGQ3LCAweDhhLCAweGE3LCAweDRlLCAweDZhLCAweGE1LAorCTB4NTMsIDB4MmYsIDB4NjgsIDB4N2IsIDB4OWIsIDB4MmYsIDB4NzQsIDB4NDksIDB4NDcsIDB4MTYsIDB4YTcsIDB4NGUsCisJMHhjOCwgMHg5MywgMHg5ZSwgMHgyNiwgMHhhNCwgMHg3MywgMHgwOSwgMHhiYywgMHgyYiwgMHg1OCwgMHgxNSwgMHgzMSwKKwkweGVkLCAweDZlLCAweDZkLCAweDFmLCAweGYwLCAweGI0LCAweGQ5LCAweDdmLCAweGQyLCAweDI5LCAweGRkLCAweDg2LAorCTB4NmMsIDB4YjIsIDB4YTMsIDB4YjUsIDB4MjksIDB4ZjksIDB4MzMsIDB4ZDAsIDB4NzQsIDB4YzEsIDB4NDksIDB4OTEsCisJMHg1ZiwgMHgzZCwgMHgwMSwgMHg0YywgMHg0NCwgMHgwNywgMHhmNSwgMHg4YSwgMHgzYSwgMHhhNSwgMHgxNywgMHg0YSwKKwkweGM3LCAweGZmLCAweGJjLCAweGFmLCAweDNhLCAweGIyLCAweDg1LCAweDZiLCAweGEwLCAweGZmLCAweGQ2LCAweGZkLAorCTB4ZDMsIDB4YjYsIDB4ZGIsIDB4NmIsIDB4NGEsIDB4YzUsIDB4ZDIsIDB4MjUsIDB4NmIsIDB4MTUsIDB4ZTUsIDB4M2EsCisJMHg5OSwgMHg3MywgMHg0NCwgMHg4YSwgMHgzNSwgMHhlYywgMHg2OSwgMHg5YiwgMHhlMCwgMHg4ZCwgMHgwZCwgMHhkZSwKKwkweGVjLCAweDNjLCAweDMyLCAweGE4LCAweGZmLCAweDk2LCAweDY0LCAweGZhLCAweDJiLCAweDlhLCAweDE5LCAweGYyLAorCTB4NzEsIDB4NDksIDB4NmUsIDB4NTEsIDB4ZjAsIDB4N2EsIDB4ZGUsIDB4ODEsIDB4N2UsIDB4NzYsIDB4YjAsIDB4OGYsCisJMHg3ZCwgMHgxMywgMHg2YSwgMHg1ZiwgMHgyMywgMHg2ZiwgMHhhNywgMHg5NywgMHg0NSwgMHgzNCwgMHgzZCwgMHhiZiwKKwkweDFiLCAweGY4LCAweGE4LCAweGI3LCAweDVjLCAweGY3LCAweDA0LCAweDY4LCAweDI0LCAweGVkLCAweGVjLCAweGRiLAorCTB4ODAsIDB4NDksIDB4ODgsIDB4ZWIsIDB4NzQsIDB4YjUsIDB4ZDAsIDB4NDksIDB4NzksIDB4OTMsIDB4ZDcsIDB4ZTQsCisJMHg5ZCwgMHgzYSwgMHhhNywgMHhiNiwgMHg3NiwgMHhjZSwgMHg1ZiwgMHhmOSwgMHg5YiwgMHg0NiwgMHg0ZCwgMHhmOSwKKwkweGExLCAweDNhLCAweDJmLCAweDZkLCAweDhjLCAweGViLCAweDUyLCAweGExLCAweDRlLCAweDI0LCAweGEwLCAweDQ3LAorCTB4YTIsIDB4OTUsIDB4MWQsIDB4NmIsIDB4MTUsIDB4NTcsIDB4NTksIDB4NDQsIDB4MzcsIDB4ZjIsIDB4OWQsIDB4NTIsCisJMHg1NCwgMHhmNCwgMHg4ZCwgMHg2MSwgMHgyZiwgMHhkYSwgMHgxZSwgMHg2YywgMHhjOCwgMHhlNiwgMHg1OSwgMHgzOCwKKwkweDk3LCAweDg3LCAweDhkLCAweDY3LCAweGQ5LCAweDk3LCAweGYyLCAweDAyLCAweGVkLCAweDlkLCAweGI0LCAweDlkLAorCTB4Y2YsIDB4YWEsIDB4N2YsIDB4OGUsIDB4NDUsIDB4NWQsIDB4M2MsIDB4ZDYsIDB4MDMsIDB4ZGEsIDB4MzgsIDB4ODYsCisJMHgxZCwgMHhkYSwgMHg3OCwgMHgzZiwgMHhhMiwgMHg4OSwgMHgzYiwgMHgzNiwgMHgwOCwgMHhmZSwgMHg3MCwgMHg5ZCwKKwkweDlkLCAweDgxLCAweDljLCAweDBiLCAweDJlLCAweGY2LCAweDc0LCAweDlkLCAweGRmLCAweDUwLCAweDNjLCAweGU4LAorCTB4YzUsIDB4NzksIDB4MDYsIDB4ZTcsIDB4YzksIDB4YWYsIDB4MGUsIDB4ZTgsIDB4YjYsIDB4MjYsIDB4NjUsIDB4MjcsCisJMHg5YiwgMHhhMSwgMHhkYywgMHgwMywgMHhkYSwgMHg3NSwgMHhkOSwgMHg3NCwgMHg2MywgMHgyYiwgMHhlZCwgMHg5MSwKKwkweGFjLCAweGE4LCAweDg3LCAweGE2LCAweDI0LCAweDQ3LCAweGI5LCAweDk2LCAweGViLCAweGI4LCAweDNlLCAweDNiLAorCTB4MjYsIDB4ZmEsIDB4YWYsIDB4N2MsIDB4NmIsIDB4ZGQsIDB4NTksIDB4NmQsIDB4ZDksIDB4MzEsIDB4MGYsIDB4MWEsCisJMHgwMiwgMHhkZSwgMHg4MiwgMHgyNywgMHg5ZiwgMHhiNiwgMHg5NiwgMHg3YywgMHhkZCwgMHhjOCwgMHgzZiwgMHhhZSwKKwkweDZkLCAweDVkLCAweDA3LCAweDlkLCAweGU4LCAweDI3LCAweDBkLCAweDI3LCAweDNhLCAweDAzLCAweDViLCAweDhiLAorCTB4NjgsIDB4OGEsIDB4NjQsIDB4YTMsIDB4ODUsIDB4MzgsIDB4M2UsIDB4ZTksIDB4MWMsIDB4NWMsIDB4MGYsIDB4MWYsCisJMHhlMCwgMHhjMSwgMHgwNywgMHhjMCwgMHhhZiwgMHgzZCwgMHhlYiwgMHhjMSwgMHhmZSwgMHgzZCwgMHhmYSwgMHg4YywKKwkweDhjLCAweGJjLCAweDM4LCAweDA0LCAweDFmLCAweGI3LCAweGU2LCAweDYzLCAweGQwLCAweGM2LCAweGQxLCAweGQ3LAorCTB4YzUsIDB4ODAsIDB4OGYsIDB4OTksIDB4YWQsIDB4ZWIsIDB4YjAsIDB4NTksIDB4ZjAsIDB4NzgsIDB4ODUsIDB4NzMsCisJMHhiMCwgMHhlZCwgMHg5NSwgMHgxMiwgMHg5ZSwgMHhiNiwgMHg1NCwgMHgxYiwgMHhkNCwgMHhhYiwgMHhjOCwgMHg5NywKKwkweGQyLCAweGU3LCAweGE0LCAweGUxLCAweDVmLCAweGU4LCAweDc3LCAweGU4LCAweDU3LCAweGI4LCAweGQ2LCAweGY3LAorCTB4NGIsIDB4MGUsIDB4NjEsIDB4N2QsIDB4OTksIDB4NzAsIDB4NjgsIDB4NDMsIDB4OWQsIDB4YTIsIDB4MjcsIDB4MmIsCisJMHhkYSwgMHhjMSwgMHgyMSwgMHhkOCwgMHhkNiwgMHhmNSwgMHg2ZCwgMHhhMCwgMHg5NSwgMHgzNiwgMHg3NiwgMHg4ZCwKKwkweDQ4LCAweDNiLCAweGY3LCAweGZiLCAweDY5LCAweDU3LCAweGYwLCAweGVmLCAweGVlLCAweDM2LCAweDYxLCAweDBkLAorCTB4OWYsIDB4ZWYsIDB4ODYsIDB4NjMsIDB4MmQsIDB4ZjQsIDB4MmQsIDB4N2MsIDB4OWYsIDB4Y2QsIDB4MTQsIDB4YTQsCisJMHgzZiwgMHgxYywgMHhiMywgMHhiZiwgMHg0YSwgMHhhZiwgMHhhMywgMHhkZiwgMHg5OCwgMHg5MCwgMHgxZCwgMHgyNywKKwkweDAzLCAweDlmLCAweGI4LCAweDYzLCAweGM5LCAweDEyLCAweGZiLCAweDY0LCAweDQwLCAweGUzLCAweDhlLCAweDMzLAorCTB4OTEsIDB4NmYsIDB4N2MsIDB4MWYsIDB4ZjAsIDB4YTAsIDB4Y2YsIDB4NWIsIDB4OGQsIDB4MDMsIDB4NjgsIDB4M2YsCisJMHhkMywgMHg2MCwgMHgyYSwgMHg5OCwgMHhkYiwgMHhjOCwgMHgwYiwgMHhmYSwgMHg2MywgMHhkYSwgMHg5YiwgMHhkNSwKKwkweDZhLCAweDZmLCAweDdiLCAweDYwLCAweDZmLCAweDRlLCAweGJiLCAweDY0LCAweDlkLCAweGJmLCAweDg3LCAweGJkLAorCTB4N2QsIDB4YzMsIDB4ZDEsIDB4YzAsIDB4MWIsIDB4OTEsIDB4OGIsIDB4YjUsIDB4MzQsIDB4NmMsIDB4ZGQsIDB4NGMsCisJMHhiZiwgMHgyNiwgMHgzYiwgMHgzMywgMHhiMywgMHhhMiwgMHhjOSwgMHgwOSwgMHhjZSwgMHgzNSwgMHgzMCwgMHhhNywKKwkweDdjLCAweDcxLCAweGUwLCAweDBiLCAweDJlLCAweDFiLCAweDRmLCAweDgxLCAweDJlLCAweGRmLCAweDlmLCAweDA1LAorCTB4Y2UsIDB4ZjIsIDB4ODgsIDB4MTEsIDB4ZGEsIDB4NTYsIDB4MzQsIDB4NmYsIDB4ZGQsIDB4ZWYsIDB4ZGEsIDB4ZWUsCisJMHhhZiwgMHgxOSwgMHg1MiwgMHgxOSwgMHg2ZSwgMHg5MywgMHhlYywgMHhmMCwgMHgxMiwgMHg3MCwgMHg0ZiwgMHgzYiwKKwkweDgxLCAweDFkLCAweDUzLCAweGQ3LCAweDk3LCAweDgxLCAweDdmLCAweGNlLCAweDFiLCAweDgyLCAweDFlLCAweGQzLAorCTB4MGUsIDB4NDAsIDB4MTcsIDB4ZjAsIDB4MmYsIDB4MDMsIDB4ZmYsIDB4NWMsIDB4YjMsIDB4NGQsIDB4YmUsIDB4NmUsCisJMHg0NiwgMHhiMSwgMHgzMiwgMHgzYSwgMHg0ZiwgMHgzNywgMHg5NiwgMHg0NSwgMHhmYiwgMHgxZSwgMHg5NiwgMHgyZiwKKwkweDdhLCAweDQ5LCAweGNkLCAweDNkLCAweDQ2LCAweGZmLCAweDVhLCAweDFkLCAweDg2LCAweDlkLCAweDY4LCAweDU1LAorCTB4ODcsIDB4N2IsIDB4MWIsIDB4YjIsIDB4YmMsIDB4YmEsIDB4NDYsIDB4MGEsIDB4ZDUsIDB4YzAsIDB4MDYsIDB4MGIsCisJMHhlZSwgMHg1MCwgMHgyNSwgMHg2ZCwgMHgyOCwgMHg1ZiwgMHgyMiwgMHhiMiwgMHgwZiwgMHhiNiwgMHhiNywgMHg2YywKKwkweDczLCAweGNjLCAweGY5LCAweDYwLCAweDZlLCAweGJjLCAweGQ2LCAweDBmLCAweDlmLCAweGM4LCAweGYxLCAweDdiLAorCTB4ZmUsIDB4YjQsIDB4MTMsIDB4Y2MsIDB4N2QsIDB4YTEsIDB4NzYsIDB4NTcsIDB4MzcsIDB4ZmQsIDB4MmUsIDB4ZTIsCisJMHg0NCwgMHhhNiwgMHhlYSwgMHhmYywgMHhiYiwgMHgwZiwgMHhmZCwgMHg1ZCwgMHgwNywgMHhmMywgMHhkMSwgMHg3OCwKKwkweGIyLCAweGUzLCAweDgxLCAweGNlLCAweDhhLCAweGI2LCAweGRmLCAweGQ2LCAweGZiLCAweGRiLCAweDQzLCAweDFmLAorCTB4YjYsIDB4MWYsIDB4OTMsIDB4N2IsIDB4NmIsIDB4ZDUsIDB4YmUsIDB4NzYsIDB4NzksIDB4Y2YsIDB4NjAsIDB4MWMsCisJMHhiZCwgMHgyMiwgMHg2MiwgMHhiYSwgMHhiNSwgMHg1ZCwgMHhlMCwgMHg0NywgMHhiNSwgMHhiNywgMHg2NSwgMHgyZSwKKwkweDUxLCAweGFhLCAweGY5LCAweDcyLCAweGMxLCAweDA5LCAweDYwLCAweDMwLCAweGVlLCAweDJjLCAweGQ2LCAweGY0LAorCTB4ZmUsIDB4ODQsIDB4YWMsIDB4OGUsIDB4MmQsIDB4YzIsIDB4YWMsIDB4YzgsIDB4YWUsIDB4ZTEsIDB4NjUsIDB4NTEsCisJMHhiMCwgMHg3ZCwgMHg4OSwgMHgzNSwgMHhkOCwgMHg1NCwgMHhhOSwgMHg1NiwgMHhlZCwgMHg2ZCwgMHgxOSwgMHhhNywKKwkweDhiLCAweGMwLCAweGE1LCAweGVmLCAweDU5LCAweDg1LCAweDFkLCAweDU4LCAweDgzLCAweGRkLCAweDJhLCAweDk5LAorCTB4NWUsIDB4YzIsIDB4ZWIsIDB4ZmQsIDB4OWIsIDB4ZDcsIDB4NzAsIDB4NjcsIDB4NDIsIDB4N2EsIDB4ZmEsIDB4MzYsCisJMHhhZiwgMHhlMSwgMHhiMCwgMHg4OSwgMHhiMywgMHg2NSwgMHgzYywgMHg0YywgMHg5YywgMHgzYiwgMHhkNiwgMHg3MCwKKwkweDhlLCAweGFjLCAweGE3LCAweGU3LCAweGIwLCAweGMwLCAweDA3LCAweDI1LCAweGRhLCAweGYzLCAweGIyLCAweGU3LAorCTB4NjIsIDB4NmQsIDB4NzAsIDB4ZTIsIDB4OGIsIDB4ODIsIDB4NTgsIDB4MzcsIDB4YjIsIDB4MjksIDB4ZjQsIDB4YzksCisJMHhlNiwgMHgxZSwgMHgxNywgMHhiYywgMHgzMiwgMHg4NSwgMHgzZSwgMHg0ZSwgMHg5MywgMHgyYSwgMHhlNCwgMHg3YywKKwkweDdmLCAweDQzLCAweGY2LCAweDVjLCAweDY4LCAweDk4LCAweGExLCAweDJlLCAweDUxLCAweDI3LCAweGRlLCAweDg2LAorCTB4OGQsIDB4NzUsIDB4NGUsIDB4OTksIDB4ODgsIDB4YzMsIDB4ZTcsIDB4OTQsIDB4OGQsIDB4YzksIDB4NDQsIDB4YjUsCisJMHgyNiwgMHg5NSwgMHhlZCwgMHhmOSwgMHgyNywgMHg3YywgMHhlOCwgMHhlMiwgMHg5NCwgMHgwNSwgMHgzZiwgMHg1YSwKKwkweDk0LCAweGNlLCAweDMxLCAweDM3LCAweDg3LCAweGY5LCAweDA2LCAweDZkLCAweDBiLCAweDdlLCAweDA1LCAweGIwLAorCTB4ZDAsIDB4YjUsIDB4ODQsIDB4MzEsIDB4YmYsIDB4ZjMsIDB4NTUsIDB4ZDcsIDB4ZTAsIDB4M2UsIDB4MTksIDB4ZTQsCisJMHg0ZCwgMHg4OSwgMHg4NCwgMHgzZSwgMHg3ZiwgMHhkNSwgMHhhNywgMHg5ZSwgMHg0ZCwgMHg4ZiwgMHg1YywgMHg0NSwKKwkweDllLCAweDYyLCAweGMxLCAweDU3LCAweGMyLCAweDdmLCAweDQwLCAweGRmLCAweDY3LCAweDliLCAweDgyLCAweGI4LAorCTB4ZmUsIDB4NDAsIDB4NGYsIDB4NjAsIDB4NjMsIDB4NDcsIDB4YjcsIDB4MDYsIDB4NGYsIDB4MzEsIDB4ZTksIDB4OWIsCisJMHhhNywgMHg3MywgMHhjYywgMHgwMSwgMHhkYSwgMHgxMywgMHg2ZSwgMHg2ZSwgMHg3YywgMHg5YiwgMHg3MSwgMHhlNiwKKwkweGMwLCAweDM2LCAweGZkLCAweDRjLCAweDY1LCAweDliLCAweDBlLCAweDlmLCAweDBlLCAweDliLCAweGQyLCAweGRkLAorCTB4MWMsIDB4ZmEsIDB4NjcsIDB4MjIsIDB4MWIsIDB4NGEsIDB4YzMsIDB4ODYsIDB4ZGUsIDB4NTYsIDB4MzksIDB4YzgsCisJMHhiOSwgMHhlNiwgMHgyOSwgMHhkOCwgMHhhYiwgMHhhMiwgMHg1NSwgMHgyNiwgMHg5MCwgMHgxMywgMHhlOCwgMHhhMywKKwkweGVmLCAweDQzLCAweDRmLCAweDcwLCAweDE2LCAweGY4LCAweGMwLCAweDAyLCAweGI4LCAweGE0LCAweDhmLCAweGJlLAorCTB4MTEsIDB4ZGEsIDB4MzMsIDB4ZmIsIDB4ZWYsIDB4ZjgsIDB4NDEsIDB4N2MsIDB4ZjgsIDB4N2MsIDB4YjgsIDB4ZmYsCisJMHgzZiwgMHg3NSwgMHgwNywgMHgzZSwgMHgyMCwgMHhjMiwgMHg0NSwgMHgzYywgMHhjMywgMHhkYSwgMHgwNCwgMHhmMiwKKwkweDk5LCAweDg5LCAweGE2LCAweGE5LCAweGQxLCAweDlmLCAweDE3LCAweDNkLCAweGU2LCAweDIxLCAweGNjLCAweDQxLAorCTB4MWUsIDB4MGIsIDB4ZmQsIDB4MjIsIDB4NzMsIDB4OGYsIDB4Y2UsIDB4OTAsIDB4YTcsIDB4YjksIDB4MjgsIDB4Y2UsCisJMHgyOSwgMHg3YiwgMHg0MywgMHhjYywgMHhjOSwgMHg5NCwgMHg5ZCwgMHgzNiwgMHhlNSwgMHg5MywgMHhhNywgMHg3MywKKwkweDlkLCAweDU4LCAweDg3LCAweGI5LCAweDI2LCAweGNlLCAweDBkLCAweGJmLCAweDg0LCAweDVjLCAweDA2LCAweDZiLAorCTB4Y2UsIDB4NjMsIDB4N2QsIDB4N2IsIDB4NjgsIDB4ZjMsIDB4MTcsIDB4YTUsIDB4MGMsIDB4OWYsIDB4NmEsIDB4ZGEsCisJMHg3YywgMHg5ZiwgMHhlYiwgMHg5MSwgMHgwZSwgMHg4YywgMHgxYiwgMHhkOCwgMHgwYiwgMHg3ZSwgMHhjMiwgMHg1MCwKKwkweDdjLCAweDQ2LCAweDJjLCAweDQ4LCAweDVkLCAweGM3LCAweDFjLCAweDA5LCAweDZiLCAweDMzLCAweDU4LCAweDRiLAorCTB4YmYsIDB4Y2IsIDB4YjUsIDB4Y2YsIDB4ODIsIDB4MGUsIDB4OGMsIDB4MWIsIDB4ODQsIDB4YTEsIDB4OGYsIDB4MTIsCisJMHhkZiwgMHhjZCwgMHg2ZCwgMHg4NiwgMHgyNiwgMHhmOSwgMHhlNywgMHgwYywgMHgzYiwgMHg1YSwgMHgxYiwgMHhlMSwKKwkweGRkLCAweGI4LCAweDk2LCAweGY5LCAweDA5LCAweDcxLCAweGY3LCAweDg0LCAweGYxLCAweDdmLCAweDVjLCAweDBhLAorCTB4Y2QsIDB4MDIsIDB4N2UsIDB4MjIsIDB4ZDMsIDB4YzcsIDB4OTAsIDB4OGYsIDB4ZDksIDB4NmQsIDB4ODgsIDB4NTUsCisJMHg5YywgMHhkZiwgMHg2YSwgMHgwNSwgMHg2NywgMHg4ZCwgMHhlMCwgMHhlZSwgMHhlZiwgMHg1YiwgMHgzZiwgMHhmZSwKKwkweDQyLCAweDcyLCAweGNkLCAweDQ3LCAweGQyLCAweGMyLCAweGE0LCAweDgwLCAweDE4LCAweDAxLCAweDVlLCAweDY1LAorCTB4YTYsIDB4OTgsIDB4YzMsIDB4MTUsIDB4MWIsIDB4NGEsIDB4YTYsIDB4OTgsIDB4MWIsIDB4ODMsIDB4NWYsIDB4MGMsCisJMHhmMiwgMHhhMiwgMHg3MywgMHhkZSwgMHg0NiwgMHhkOSwgMHg1OSwgMHhlMCwgMHg3NywgMHgwMSwgMHgzYywgMHhjZSwKKwkweDQwLCAweDg3LCAweGM2LCAweDAxLCAweDJiLCAweDg3LCAweDgxLCAweDgzLCAweGYxLCAweGQ3LCAweGQxLCAweGYzLAorCTB4NDksIDB4MjksIDB4NWIsIDB4Y2MsIDB4MTMsIDB4ZGEsIDB4NDksIDB4NjcsIDB4ODEsIDB4ZjYsIDB4YWYsIDB4ZTcsCisJMHgzNywgMHg2MywgMHg4ZSwgMHhmZCwgMHg3YiwgMHg3YiwgMHgwMiwgMHg5OSwgMHg3NSwgMHg3MSwgMHgzYywgMHhhMSwKKwkweGU3LCAweDdiLCAweDM2LCAweGNjLCAweDdmLCAweGJmLCAweDJiLCAweGEwLCAweDRkLCAweDhkLCAweDMxLCAweGZmLAorCTB4ZjIsIDB4ODYsIDB4ZjEsIDB4ZWYsIDB4MjUsIDB4ZDcsIDB4OGYsIDB4ZWYsIDB4ZGEsIDB4MTYsIDB4ZWEsIDB4MjAsCisJMHhmYSwgMHg4ZiwgMHg4NSwgMHhmNCwgMHg4MiwgMHhiNiwgMHg1NSwgMHg1YSwgMHhhMywgMHg5YywgMHg1NywgMHgxNiwKKwkweDc0LCAweGU0LCAweDdmLCAweDZlLCAweDZlLCAweDI3LCAweDYyLCAweDdkLCAweDQ2LCAweDRhLCAweDRkLCAweGQwLAorCTB4YmQsIDB4MWEsIDB4Y2IsIDB4NTYsIDB4ZDcsIDB4NTQsIDB4ZDYsIDB4ZDYsIDB4MDQsIDB4YmUsIDB4YmUsIDB4ZDQsCisJMHhmNCwgMHg5MSwgMHgzYiwgMHhiNSwgMHhjNiwgMHhiZCwgMHg2MSwgMHhmNCwgMHgyYiwgMHhkOCwgMHhhNywgMHgyMCwKKwkweGQzLCAweGRlLCAweDg1LCAweDgyLCAweDZlLCAweDFmLCAweDA5LCAweGYyLCAweDNlLCAweGZiLCAweDliLCAweDVhLAorCTB4NjksIDB4OTksIDB4ZjksIDB4MjAsIDB4ZWMsIDB4YzksIDB4NTYsIDB4ZjksIDB4M2YsIDB4ZTIsIDB4Y2EsIDB4NTEsCisJMHhhZCwgMHg3MCwgMHhlYSwgMHgzOCwgMHhmMiwgMHhjMSwgMHgxNSwgMHhmYywgMHg0ZSwgMHhlMywgMHhkNywgMHhjMCwKKwkweDJmLCAweGNhLCAweGMzLCAweDlmLCAweDQxLCAweDFlLCAweGFmLCAweDdjLCAweDJjLCAweGUyLCAweDQxLCAweGIwLAorCTB4ZmYsIDB4MWIsIDB4MmIsIDB4ZDAsIDB4YjMsIDB4ZTMsIDB4MjksIDB4ZjksIDB4ODYsIDB4YWQsIDB4ZjcsIDB4ZTksCisJMHg4MSwgMHg1ZiwgMHgyOSwgMHgyMCwgMHg4ZiwgMHhiNSwgMHhkZSwgMHg5NiwgMHhkZiwgMHgwZSwgMHhmMywgMHgyMiwKKwkweDkxLCAweGQ3LCAweDE2LCAweGMwLCAweGM3LCAweDkxLCAweGZkLCAweGExLCAweGNlLCAweDE2LCAweGVlLCAweDc1LAorCTB4OTUsIDB4ZmYsIDB4MGMsIDB4ZjMsIDB4MWUsIDB4ZTQsIDB4NWYsIDB4MDUsIDB4YjUsIDB4ZWEsIDB4NWIsIDB4ZTAsCisJMHg4ZCwgMHgyNiwgMHg2ZiwgMHg0MSwgMHg4NywgMHg1ZSwgMHg1YiwgMHhlOCwgMHgwMCwgMHgzZCwgMHhiNiwgMHg5NCwKKwkweDI3LCAweDkxLCAweDJmLCAweDY4LCAweDgzLCAweGQ2LCAweDI2LCAweGFkLCAweDAzLCAweDc2LCAweDBjLCAweDFiLAorCTB4NTcsIDB4NjMsIDB4NDksIDB4YjQsIDB4ZTUsIDB4MmYsIDB4Y2QsIDB4MmMsIDB4ZDUsIDB4NzQsIDB4YWMsIDB4NDUsCisJMHhlZSwgMHg5MywgMHg0MywgMHgxZiwgMHhiMiwgMHhiZiwgMHhiMiwgMHg0MCwgMHgzOCwgMHg1ZCwgMHg1ZSwgMHg1ZiwKKwkweDMwLCAweGU0LCAweDRkLCAweGU0LCAweDUyLCAweDZmLCAweGQ5LCAweDk3LCAweDY2LCAweDEwLCAweGI3LCAweGZhLAorCTB4MTEsIDB4MjMsIDB4NTAsIDB4OGIsIDB4ZWMsIDB4YTQsIDB4OWYsIDB4ZGUsIDB4NjEsIDB4ZTIsIDB4NTksIDB4YzIsCisJMHg2ZiwgMHgxZiwgMHg3MiwgMHhjMSwgMHg4ZiwgMHg4NiwgMHhmOSwgMHhiOCwgMHhmNSwgMHhhNCwgMHgyZCwgMHgwMSwKKwkweDE4LCAweGFlLCAweDM3LCAweDQxLCAweDViLCAweDM3LCAweGU0LCAweDlmLCAweGI1LCAweGE2LCAweGU0LCAweGY1LAorCTB4MWUsIDB4OTUsIDB4YWYsIDB4NjgsIDB4OWMsIDB4MGYsIDB4N2MsIDB4ZDMsIDB4ODcsIDB4ZTcsIDB4YzksIDB4NjcsCisJMHgwMywgMHgzYSwgMHhjZSwgMHgzMSwgMHhkZiwgMHhkMSwgMHg4NywgMHgxMiwgMHg1ZiwgMHg3NiwgMHhhYywgMHg4MCwKKwkweGMzLCAweDVjLCAweDU5LCAweDA4LCAweGZhLCAweGQxLCAweDljLCAweDY4LCAweDUxLCAweDFjLCAweGEzLCAweDZmLAorCTB4MmMsIDB4YzEsIDB4NGUsIDB4MzgsIDB4OWUsIDB4MTAsIDB4MjUsIDB4ODMsIDB4NzUsIDB4ZjIsIDB4OTQsIDB4ODQsCisJMHg5OSwgMHgzZiwgMHgzYiwgMHgzMywgMHg2NywgMHg1MywgMHhhZSwgMHhmMCwgMHg3MSwgMHhiNSwgMHg0OCwgMHhhZSwKKwkweDk0LCAweDUxLCAweGJiLCAweDU0LCAweDE3LCAweGJlLCAweDA5LCAweGI5LCAweGVhLCAweDYxLCAweGJlLCAweDBmLAorCTB4MWIsIDB4M2YsIDB4NGUsIDB4ZjksIDB4YTIsIDB4ZmUsIDB4NWIsIDB4NDAsIDB4ZWUsIDB4YjMsIDB4MjAsIDB4YzksCisJMHhhMCwgMHg1ZSwgMHgzOSwgMHg4YSwgMHgzYywgMHgxZiwgMHhmMiwgMHhhYiwgMHgxZCwgMHgwNywgMHgwZSwgMHhkOCwKKwkweDY5LCAweDZkLCAweDA1LCAweDRmLCAweGQ0LCAweDE2LCAweGI1LCAweGQzLCAweDc4LCAweDBlLCAweGUwLCAweGQ5LAorCTB4YTAsIDB4NmUsIDB4ODYsIDB4YjksIDB4YzYsIDB4ODcsIDB4ZTgsIDB4ODEsIDB4M2QsIDB4OTUsIDB4NjgsIDB4NGYsCisJMHhmMiwgMHhmZCwgMHg2NiwgMHg1ZSwgMHhiZSwgMHhkYiwgMHgxYywgMHg5MywgMHhlNywgMHg5YiwgMHgzOSwgMHhmOSwKKwkweGJiLCAweGE2LCAweDIzLCAweGRmLCAweDY5LCAweDhlLCAweGM4LCAweGI3LCAweDliLCAweGMzLCAweGFjLCAweGM5LAorCTB4OTAsIDB4MzcsIDB4NjUsIDB4OTgsIDB4MzcsIDB4YzksIDB4YmQsIDB4ZGUsIDB4YWQsIDB4YjAsIDB4NzcsIDB4Y2EsCisJMHhmZiwgMHhkMiwgMHg0YywgMHhhMSwgMHgzMSwgMHgyOCwgMHhlNSwgMHg2MywgMHhmMCwgMHhjZiwgMHhjZSwgMHhjZCwKKwkweGFjLCAweDI1LCAweGU1LCAweDExLCAweDg3LCAweDM1LCAweDQxLCAweDFiLCAweGRmLCAweGEzLCAweGNlLCAweDg0LAorCTB4ZmYsIDB4ODYsIDB4M2YsIDB4OWIsIDB4NGEsIDB4NjUsIDB4NGYsIDB4YmIsIDB4NDYsIDB4NDcsIDB4ZTgsIDB4MDMsCisJMHg2ZSwgMHg0OSwgMHg0YSwgMHgwNywgMHhmNiwgMHg4MiwgMHgwZiwgMHg1YywgMHg3YSwgMHgxYSwgMHgzNiwgMHhhMCwKKwkweDZhLCAweDlhLCAweDA0LCAweGZjLCAweDBkLCAweDczLCAweDAxLCAweDkzLCAweDc2LCAweDhjLCAweDNhLCAweDMwLAorCTB4OWIsIDB4NzEsIDB4MGQsIDB4ZDYsIDB4NzcsIDB4YjQsIDB4NjcsIDB4MDMsIDB4ODEsIDB4ODMsIDB4NzAsIDB4ZmIsCisJMHgyYywgMHhjYSwgMHhjZCwgMHhiNCwgMHhlOSwgMHg1NywgMHgwYiwgMHhhMSwgMHg4ZiwgMHg0YiwgMHg4NCwgMHg3YSwKKwkweDY5LCAweDYxLCAweGZlLCAweGYxLCAweGQwLCAweDI3LCAweDZmLCAweGRjLCAweDA3LCAweGYxLCAweDAyLCAweGY5LAorCTB4NjQsIDB4YjAsIDB4OGUsIDB4YjAsIDB4NWEsIDB4MDgsIDB4ZGIsIDB4MTcsIDB4Y2UsIDB4NzUsIDB4ODIsIDB4ZGYsCisJMHg4ZSwgMHg5NCwgMHhiZCwgMHgzNywgMHgzNSwgMHhlNiwgMHhkOSwgMHhjOCwgMHg3NywgMHgzMCwgMHgxZSwgMHhjMSwKKwkweGY4LCAweDRhLCAweDM4LCAweGZlLCAweDljLCAweDRjLCAweDJmLCAweDBhLCAweDY4LCAweGZkLCAweDg5LCAweDU2LAorCTB4NTQsIDB4ZTMsIDB4MzEsIDB4OGMsIDB4NzUsIDB4OGMsIDB4MGQsIDB4ZDYsIDB4MDIsIDB4NjgsIDB4MzcsIDB4MjcsCisJMHhhOSwgMHhlYiwgMHhiYSwgMHg0ZCwgMHg1ZiwgMHgzOCwgMHgxOSwgMHhmYSwgMHhjMywgMHg4MiwgMHgxYywgMHhmNiwKKwkweDA2LCAweDBiLCAweDU3LCAweDExLCAweDMzLCAweGI0LCAweGI2LCAweDI4LCAweGZmLCAweGQ5LCAweDBlLCAweGJlLAorCTB4ZjgsIDB4ZmUsIDB4ZWQsIDB4YWMsIDB4YjksIDB4OTMsIDB4YTYsIDB4N2MsIDB4N2IsIDB4M2UsIDB4NmIsIDB4M2QsCisJMHhhNCwgMHg3ZiwgMHgwZCwgMHg2NywgMHhmMiwgMHhmZCwgMHg4MywgMHg3NiwgMHhmNiwgMHhjOCwgMHg5NCwgMHhkZSwKKwkweDI1LCAweGRmLCAweDNkLCAweGNhLCAweGQ4LCAweDdiLCAweDc2LCAweGU2LCAweDA3LCAweGQwLCAweGJkLCAweGZhLAorCTB4NGEsIDB4YmIsIDB4ZDQsIDB4ZWIsIDB4YTYsIDB4NWMsIDB4MTksIDB4MWQsIDB4MDQsIDB4OWQsIDB4OTYsIDB4ZDQsCisJMHgxYiwgMHg0OSwgMHhlNCwgMHg3MywgMHg5YiwgMHg2NSwgMHhiNiwgMHg1ZiwgMHgxOSwgMHgxOCwgMHhmYywgMHhmNCwKKwkweGIwLCAweGYyLCAweGQzLCAweGFlLCAweDhkLCAweDY3LCAweGUzLCAweGU3LCAweDNkLCAweGViLCAweGNmLCAweDVjLAorCTB4MDIsIDB4ZmQsIDB4ZDAsIDB4ZWIsIDB4ZTQsIDB4NzYsIDB4MjUsIDB4ZTcsIDB4YjIsIDB4MzcsIDB4NjgsIDB4OTUsCisJMHg3NSwgMHhjNCwgMHgyZSwgMHg3MywgMHhkMCwgMHhiYSwgMHg1NywgMHhmZiwgMHgyZiwgMHhmZiwgMHhmMywgMHgyNiwKKwkweDY1LCAweGY3LCAweGFhLCAweGFhLCAweDYxLCAweDU0LCAweGFjLCAweGMzLCAweDdlLCAweDRiLCAweDJiLCAweDJmLAorCTB4ODMsIDB4MTYsIDB4ZjgsIDB4ZDgsIDB4YzYsIDB4ZjYsIDB4NzAsIDB4OWMsIDB4NTEsIDB4YmMsIDB4MzgsIDB4ZGIsCisJMHhlOCwgMHg5MCwgMHhlZiwgMHhkNCwgMHhiNywgMHhjOCwgMHg3MiwgMHg5ZCwgMHhlZiwgMHhkYiwgMHg2NSwgMHhhOSwKKwkweDNlLCAweDc4LCAweGI1LCAweDRmLCAweGVmLCAweDk3LCAweGYzLCAweGQ3LCAweDVjLCAweDZmLCAweGRkLCAweGEzLAorCTB4MjMsIDB4MzcsIDB4OTgsIDB4ZmMsIDB4NDAsIDB4N2UsIDB4MzksIDB4ZGEsIDB4MjMsIDB4M2YsIDB4ZmUsIDB4NzIsCisJMHhmNiwgMHg5OSwgMHgzZiwgMHhkNSwgMHg2MSwgMHgwMywgMHhhMywgMHg5ZCwgMHhiNCwgMHg2ZCwgMHhmNCwgMHgzOSwKKwkweDlmLCAweGJkLCAweDVhLCAweGQwLCAweGE5LCAweGRiLCAweDNmLCAweDAyLCAweDRmLCAweGIzLCAweDBiLCAweDgxLAorCTB4MWQsIDB4MTAsIDB4MzcsIDB4ZjEsIDB4NDIsIDB4MzcsIDB4ZWMsIDB4ZWYsIDB4MDEsIDB4MjcsIDB4ZGUsIDB4MzUsCisJMHgwNiwgMHg4MSwgMHhlYiwgMHg3YiwgMHg4YSwgMHgxNywgMHhiNywgMHgzYiwgMHhkOSwgMHhhYiwgMHgwOCwgMHg0OSwKKwkweGZlLCAweDE1LCAweDdiLCAweDcwLCAweDc4LCAweDg3LCAweGJlLCAweDVkLCAweGVhLCAweGU5LCAweGViLCAweGFkLAorCTB4ZTcsIDB4ZTAsIDB4ZmYsIDB4MGIsIDB4YTksIDB4ZWMsIDB4OTEsIDB4Y2IsIDB4NzIsIDB4NzYsIDB4ZTYsIDB4YTIsCisJMHg0ZCwgMHhmZCwgMHhhNywgMHhkZiwgMHg3OCwgMHgwOSwgMHhiOSwgMHhhNywgMHgyNSwgMHgwYiwgMHgwZCwgMHhmYSwKKwkweDRiLCAweGUyLCAweDYyLCAweGZlLCAweGJmLCAweGNiLCAweDNhLCAweGFjLCAweDMzLCAweDRmLCAweGMwLCAweDNiLAorCTB4Y2MsIDB4MWIsIDB4YmYsIDB4NGUsIDB4MzksIDB4YjcsIDB4MTEsIDB4NzYsIDB4YjgsIDB4YTAsIDB4ZmYsIDB4NjIsCisJMHgwMywgMHg4ZiwgMHgwNiwgMHhhZCwgMHhiZCwgMHgzYSwgMHhmNywgMHhmYiwgMHgzNywgMHhlYywgMHhmYiwgMHgwZSwKKwkweDY4LCAweDFkLCAweDA0LCAweDJjLCAweDYyLCAweDY2LCAweGJhLCAweDc1LCAweDhmLCAweDU3LCAweGQ0LCAweDFlLAorCTB4YzcsIDB4MWEsIDB4YzgsIDB4ZjUsIDB4NTYsIDB4ZjcsIDB4YzAsIDB4NWMsIDB4NDMsIDB4YzcsIDB4MzksIDB4NGQsCisJMHgyNSwgMHg5NywgMHgyYiwgMHhhMywgMHhlNCwgMHhlZiwgMHg5ZSwgMHg1ZSwgMHhlNiwgMHg5OSwgMHg0NiwgMHhmZSwKKwkweGFmLCAweGZkLCAweGE4LCAweDdlLCAweDdjLCAweDdlLCAweDdlLCAweDEyLCAweGZlLCAweGQ5LCAweGY3LCAweDJmLAorCTB4ZWMsIDB4MWEsIDB4MDQsIDB4MGQsIDB4YTgsIDB4NDMsIDB4ZDMsIDB4ZTQsIDB4ZjksIDB4ZDksIDB4MTksIDB4MTcsCisJMHgzOCwgMHg4YSwgMHgwYSwgMHhmNywgMHgyNSwgMHg1OSwgMHgwMSwgMHhlZSwgMHgwOSwgMHhmMiwgMHgwMSwgMHhiOCwKKwkweGU3LCAweDM4LCAweGFmLCAweDY0LCAweDgwLCAweGY5LCAweDQ2LCAweDA2LCAweDc4LCAweDIzLCAweGZkLCAweDRjLAorCTB4NDIsIDB4ZDcsIDB4NzYsIDB4NWIsIDB4YjcsIDB4MDcsIDB4YmEsIDB4OWUsIDB4NjAsIDB4NmMsIDB4N2IsIDB4MGUsCisJMHhiYSwgMHg1NywgMHg0OCwgMHg1MiwgMHg3ZiwgMHhkYSwgMHg3YiwgMHhkNywgMHhmNCwgMHhhNywgMHgxNSwgMHg3ZiwKKwkweGJiLCAweDk0LCAweDE2LCAweDEyLCAweGMwLCAweDZiLCAweGNhLCAweDVjLCAweDhlLCAweDc4LCAweDMxLCAweGFlLAorCTB4NTMsIDB4ZjcsIDB4MmIsIDB4YTEsIDB4ZWUsIDB4NzcsIDB4ODYsIDB4YjgsIDB4MTcsIDB4YzEsIDB4OTMsIDB4NmMsCisJMHhhNiwgMHhhZSwgMHhiMywgMHg4ZSwgMHhkYSwgMHhhNiwgMHg2YSwgMHg1YiwgMHgwMywgMHgzNiwgMHg1ZCwgMHhhZSwKKwkweGIxLCAweDBlLCAweGU1LCAweGZkLCAweGM4LCAweGE1LCAweDk5LCAweDY5LCAweGQ0LCAweGFhLCAweGU1LCAweGRhLAorCTB4ODgsIDB4NTYsIDB4NmUsIDB4ZGEsIDB4NWEsIDB4ZDksIDB4YTMsIDB4YmUsIDB4ZWQsIDB4YjIsIDB4MmUsIDB4MjgsCisJMHgxZSwgMHhhNywgMHg2NSwgMHhhOSwgMHhmOSwgMHg0YiwgMHhiZiwgMHhiYSwgMHg2YiwgMHgxMywgMHhmYSwgMHhkMCwKKwkweGZkLCAweDA5LCAweGNhLCAweGY3LCAweGIzLCAweGE0LCAweDBiLCAweDQxLCAweDljLCAweGZjLCAweDRlLCAweGM5LAorCTB4YzksIDB4MjEsIDB4MTQsIDB4YmQsIDB4YzgsIDB4YWQsIDB4NGUsIDB4MGQsIDB4MTEsIDB4M2YsIDB4ZTgsIDB4NDgsCisJMHhhNSwgMHg2NCwgMHhkOSwgMHhlMywgMHgxZSwgMHg2NywgMHg2NywgMHhjOCwgMHhjYiwgMHhmMiwgMHg3MSwgMHg0YiwKKwkweDBlLCAweDJiLCAweGY5LCAweGJkLCAweGFjLCAweDZjLCAweGJiLCAweGJjLCAweDYyLCAweGM4LCAweDc0LCAweDcyLAorCTB4ZDAsIDB4N2EsIDB4NTgsIDB4YjIsIDB4NTcsIDB4MmYsIDB4MTgsIDB4ZDksIDB4NjcsIDB4YTYsIDB4NjAsIDB4ZDcsCisJMHg0YiwgMHg4YiwgMHg4NiwgMHhiOCwgMHhhYSwgMHhkZSwgMHhhMiwgMHg4YywgMHhiMiwgMHgwYiwgMHhiMCwgMHhmYywKKwkweGYwLCAweGVjLCAweDdiLCAweDViLCAweGNlLCAweGRlLCAweDJkLCAweDJiLCAweDRmLCAweGZmLCAweDI2LCAweDdjLAorCTB4Y2UsIDB4MDEsIDB4YzgsIDB4YzIsIDB4Y2MsIDB4MWMsIDB4NDIsIDB4NWUsIDB4ZjEsIDB4YjQsIDB4MGMsIDB4NWEsCisJMHg1NSwgMHhlNCwgMHhjOSwgMHhlMCwgMHgzYiwgMHhkYSwgMHgwMSwgMHg2NSwgMHgwMywgMHgxNywgMHg3NCwgMHg4YywKKwkweDA3LCAweGM4LCAweDI3LCAweDhlLCAweGFmLCAweDk1LCAweDBiLCAweGNhLCAweDk2LCAweGQyLCAweGVhLCAweGRkLAorCTB4MGUsIDB4ZTAsIDB4MDgsIDB4ZGUsIDB4NzEsIDB4ZmMsIDB4MTksIDB4ZDksIDB4YTEsIDB4ZGUsIDB4ZGQsIDB4YTksCisJMHhkZSwgMHg1NSwgMHhlOSwgMHgyYiwgMHg5NCwgMHhmYywgMHhiZSwgMHg4MiwgMHgzZCwgMHhjOSwgMHhlMywgMHg2OCwKKwkweGJlLCAweDRiLCAweDAyLCAweDViLCAweDhhLCAweGY4LCAweDZlLCAweGM5LCAweGMxLCAweDQ2LCAweDRhLCAweGJlLAorCTB4ODQsIDB4ZmEsIDB4ZTcsIDB4OGUsIDB4YzYsIDB4ODAsIDB4OTQsIDB4MjAsIDB4YzcsIDB4ZTksIDB4ZGMsIDB4ODMsCisJMHhiZCwgMHgzYywgMHg1YiwgMHg3MSwgMHgyNSwgMHhmYiwgMHg4YywgMHhlOCwgMHhhNCwgMHhmNSwgMHg0ZSwgMHgzOSwKKwkweGU0LCAweDQ1LCAweGY0LCAweDc0LCAweDg2LCAweGY0LCAweDRkLCAweDg2LCAweGUzLCAweDQ0LCAweDQ4LCAweDQzLAorCTB4MmIsIDB4YmUsIDB4NGUsIDB4ZTAsIDB4NDIsIDB4YWMsIDB4Y2YsIDB4NzksIDB4MjEsIDB4MWUsIDB4ZmEsIDB4MTEsCisJMHhkMCwgMHgzYSwgMHg5OSwgMHg5NiwgMHgxNSwgMHg4ZiwgMHg3NCwgMHg2YywgMHg5MSwgMHg2YSwgMHg4YSwgMHhmZCwKKwkweDAzLCAweGQwLCAweDM3LCAweGUyLCAweGQ5LCAweGM0LCAweDdjLCAweDY2LCAweDFkLCAweDhmLCAweDFmLCAweDZjLAorCTB4NTQsIDB4YzAsIDB4NjMsIDB4ZjIsIDB4OTcsIDB4ZWIsIDB4MTAsIDB4MjMsIDB4M2UsIDB4NDcsIDB4ZjksIDB4ZWQsCisJMHg0NiwgMHgyZSwgMHg2ZiwgMHgwNywgMHhiYSwgMHg2OSwgMHhhZCwgMHhlZCwgMHg1OSwgMHgzYSwgMHhkZSwgMHgwZCwKKwkweDU5LCAweDcxLCAweGRmLCAweDBlLCAweDk5LCAweDg0LCAweGRkLCAweDE3LCAweGViLCAweGRjLCAweDdmLCAweDEyLAorCTB4N2EsIDB4NzQsIDB4NTEsIDB4ZWQsIDB4NWYsIDB4NWEsIDB4ZTksIDB4MGYsIDB4ZTEsIDB4MDksIDB4ZGIsIDB4YmQsCisJMHgwMSwgMHhiNiwgMHg1ZCwgMHhmNiwgMHgyZSwgMHg1OCwgMHgxZiwgMHgwMSwgMHhmZiwgMHhiYiwgMHg4MCwgMHhkNywKKwkweGU1LCAweDQ0LCAweDhlLCAweGYwLCAweGM0LCAweDgzLCAweDc1LCAweGY1LCAweGQ0LCAweDI3LCAweGUwLCAweDQ5LAorCTB4YWEsIDB4YmEsIDB4YmUsIDB4NTgsIDB4NmYsIDB4OTcsIDB4ZTIsIDB4NDIsIDB4ODQsIDB4OGIsIDB4NzgsIDB4M2UsCisJMHg0MCwgMHhkZCwgMHg3YiwgMHhiNywgMHhjMiwgMHgzNSwgMHhhZCwgMHg3MCwgMHhlMSwgMHg3ZCwgMHg5ZCwgMHgzZSwKKwkweGU3LCAweDI2LCAweGMwLCAweGEzLCAweDc2LCAweGI3LCAweDQxLCAweDViLCAweGIyLCAweDRiLCAweGFhLCAweGFhLAorCTB4NzYsIDB4ZWYsIDB4NTAsIDB4YmUsIDB4YTYsIDB4OWEsIDB4ZGMsIDB4OGMsIDB4ZjcsIDB4M2UsIDB4ZjYsIDB4ZGMsCisJMHg4ZCwgMHg3YywgMHhhNiwgMHgxYiwgMHg3MywgMHg5OSwgMHgwZCwgMHg3MywgMHgxYiwgMHhlOSwgMHg0ZiwgMHg2YywKKwkweGEwLCAweGZmLCAweGJmLCAweDdiLCAweDE5LCAweDUyLCAweGU2LCAweDcyLCAweGMxLCAweGJhLCAweDEyLCAweGQ2LAorCTB4Y2QsIDB4MWUsIDB4ODcsIDB4NGQsIDB4MzAsIDB4NGYsIDB4NGYsIDB4MzEsIDB4MzYsIDB4NWYsIDB4YTMsIDB4NjgsCisJMHg5OSwgMHg1ZCwgMHhmOSwgMHgyOSwgMHhkNiwgMHhmNSwgMHgwMywgMHgzNiwgMHgxYSwgMHgwNywgMHg3YywgMHg3OCwKKwkweDBhLCAweDc4LCAweDhlLCAweGQ3LCAweGQ1LCAweDFkLCAweDA1LCAweDY0LCAweGYwLCAweGJlLCAweDNhLCAweDdiLAorCTB4YjUsIDB4ZmUsIDB4NjksIDB4M2MsIDB4YmIsIDB4YTYsIDB4ODUsIDB4NWYsIDB4ZTQsIDB4MTUsIDB4ZTksIDB4MjUsCisJMHhhZCwgMHhiYywgMHgyZiwgMHg4MiwgMHhiZCwgMHgzOSwgMHhkMCwgMHhlMywgMHhhNCwgMHgyMSwgMHhhNSwgMHgxYywKKwkweGUyLCAweGJhLCAweGM3LCAweGJiLCAweDU3LCAweGRhLCAweGU1LCAweDQwLCAweDUwLCAweDIzLCAweGQ4LCAweDhjLAorCTB4ZWYsIDB4YTYsIDB4M2EsIDB4ZmIsIDB4YTEsIDB4MTUsIDB4ZGUsIDB4YmYsIDB4NjYsIDB4NzgsIDB4NDcsIDB4MzcsCisJMHg4YywgMHhkYSwgMHg1YiwgMHgxZSwgMHg1YSwgMHhiMSwgMHhlNSwgMHg2YiwgMHg4ZCwgMHg2MSwgMHg3OSwgMHhiOCwKKwkweDkxLCAweGI1LCAweGVlLCAweDgxLCAweDBmLCAweDI4LCAweGFmLCAweGRlLCAweGNiLCAweDZlLCAweDRiLCAweGQyLAorCTB4N2YsIDB4OTksIDB4YzgsIDB4M2QsIDB4ZGIsIDB4ZWMsIDB4MjAsIDB4MTcsIDB4YTksIDB4YjIsIDB4MzYsIDB4M2IsCisJMHg5ZSwgMHhlNSwgMHg3ZCwgMHg4ZCwgMHg1NSwgMHg5NywgMHg4ZCwgMHhmOSwgMHhjYSwgMHhmZiwgMHg2NSwgMHhhZSwKKwkweGMyLCAweGZkLCAweGU5LCAweGFmLCAweDkxLCAweDliLCAweDc4LCAweGM4LCAweDRkLCAweDNjLCAweGU0LCAweDI2LAorCTB4MWUsIDB4NzIsIDB4MTMsIDB4MGYsIDB4YjksIDB4ODksIDB4ODcsIDB4ZGMsIDB4YzQsIDB4NDMsIDB4NmUsIDB4ZTIsCisJMHgyMSwgMHgzNywgMHg0MSwgMHgxZCwgMHgxMCwgMHhkNCwgMHgwNywgMHhlMywgMHhjOCwgMHhiOSwgMHhlMSwgMHhiZiwKKwkweGJjLCAweDViLCAweGMyLCAweGRjLCAweDIyLCAweDhhLCAweGNkLCAweDljLCAweDNiLCAweGJmLCAweGM5LCAweDBkLAorCTB4ZWEsIDB4MmIsIDB4ZTUsIDB4MTMsIDB4MGEsIDB4Y2QsIDB4ODksIDB4MzAsIDB4MDcsIDB4ZTIsIDB4OWEsIDB4MjgsCisJMHg3NiwgMHg3MywgMHg5ZCwgMHg4YywgMHhiOSwgMHhhOCwgMHgzZCwgMHgwYiwgMHg5MywgMHhjYywgMHg5MSwgMHg4MiwKKwkweDk4LCAweDE1LCAweGU0LCAweGU3LCAweGFmLCAweDIyLCAweDRmLCAweGNhLCAweDIwLCAweDRmLCAweDFhLCAweDQwLAorCTB4NGUsIDB4YzQsIDB4N2IsIDB4ZWEsIDB4ZTgsIDB4MmUsIDB4YTksIDB4YTAsIDB4MWQsIDB4ZjQsIDB4YzYsIDB4YjUsCisJMHgyZiwgMHg3OSwgMHhjYywgMHhkZiwgMHhlZCwgMHg0YywgMHg1OSwgMHhkNywgMHg4ZiwgMHhmNywgMHg4OSwgMHgyZiwKKwkweGM1LCAweGQxLCAweGFmLCAweDIzLCAweDU3LCAweGZlLCAweDRiLCAweDc1LCAweDZmLCAweDM2LCAweDMxLCAweDQ0LAorCTB4OTksIDB4ZGYsIDB4ZjcsIDB4MzEsIDB4ZjksIDB4NzIsIDB4YzQsIDB4ZGYsIDB4ZTAsIDB4YmUsIDB4NGYsIDB4NWYsCisJMHgyMiwgMHhmZiwgMHg0NCwgMHg3YSwgMHhjZiwgMHg4MCwgMHhlMSwgMHg2NywgMHgxMiwgMHg5MiwgMHgzYywgMHhiOSwKKwkweDA1LCAweDczLCAweDk2LCAweGY0LCAweGE5LCAweDNiLCAweDIzLCAweDg4LCAweGYyLCAweGNjLCAweDdmLCAweDQwLAorCTB4NWUsIDB4YjYsIDB4ZTgsIDB4NjcsIDB4NzgsIDB4YjMsIDB4NDAsIDB4YmMsIDB4ZjQsIDB4YWYsIDB4ZjUsIDB4OTksCisJMHg2MiwgMHhiZCwgMHhhZSwgMHg3NCwgMHhlYSwgMHg2MCwgMHhhMywgMHg4NCwgMHgzYywgMHhjYSwgMHhlOCwgMHg5MywKKwkweDBlLCAweDEzLCAweGI1LCAweDU0LCAweDg0LCAweDliLCAweDM4LCAweGRmLCAweDRjLCAweGFhLCAweDFhLCAweGU3LAorCTB4Y2MsIDB4YWEsIDB4M2MsIDB4MjEsIDB4NmIsIDB4ZWUsIDB4NTMsIDB4OWYsIDB4YTksIDB4MmUsIDB4NjQsIDB4ZDMsCisJMHhhYywgMHg3MSwgMHgwYiwgMHg1NiwgMHg3ZCwgMHhlNiwgMHg0OSwgMHhlMCwgMHg1OCwgMHg0NiwgMHg2ZSwgMHg2MCwKKwkweGE4LCAweGJkLCAweGViLCAweDMzLCAweGIzLCAweDBiLCAweGMxLCAweGJkLCAweDU1LCAweDQwLCAweDAzLCAweGUzLAorCTB4NTUsIDB4ODcsIDB4MTgsIDB4NGIsIDB4YzEsIDB4ZmQsIDB4OTUsIDB4YWUsIDB4NjAsIDB4MDksIDB4NDcsIDB4NzgsCisJMHgxMywgMHg3MCwgMHg5NCwgMHhkYiwgMHgzMCwgMHg2MCwgMHgyOSwgMHgzYiwgMHhkMiwgMHg1MCwgMHg5ZiwgMHhhOSwKKwkweGQ0LCAweDViLCAweDY5LCAweDIwLCAweDFlLCAweGUyLCAweDhkLCAweGNlLCAweGMzLCAweGIzLCAweDI0LCAweDQ1LAorCTB4M2YsIDB4ZTksIDB4ZmIsIDB4ZTUsIDB4ZDEsIDB4ODEsIDB4YjAsIDB4YWUsIDB4NDQsIDB4MWQsIDB4NzksIDB4Y2MsCisJMHgwYywgMHhmNCwgMHg1YywgMHg4ZCwgMHhmZiwgMHg1OCwgMHhjNSwgMHhhOSwgMHg4YywgMHhjZSwgMHg3OSwgMHgzZSwKKwkweGYxLCAweDJlLCAweGY3LCAweDI4LCAweGU2LCAweDMwLCAweDVlLCAweDhlLCAweGQ2LCAweGVhLCAweGUxLCAweGRhLAorCTB4YWUsIDB4MTYsIDB4N2UsIDB4YjYsIDB4ODUsIDB4ZmIsIDB4OTEsIDB4MjYsIDB4OWUsIDB4ZjMsIDB4MTUsIDB4ZWMsCisJMHg0NSwgMHhiYSwgMHhiOCwgMHhjNiwgMHgwNCwgMHg2ZCwgMHg5MCwgMHhhNSwgMHhmNywgMHhiZiwgMHhlNSwgMHg3ZCwKKwkweGViLCAweDk5LCAweGM4LCAweDUzLCAweDEzLCAweDMwLCAweDVjLCAweDRmLCAweDFjLCAweDExLCAweDBjLCAweDVlLAorCTB4OWMsIDB4MDksIDB4ZTAsIDB4ZjQsIDB4ZDUsIDB4N2IsIDB4YmUsIDB4NGYsIDB4ZGEsIDB4YjcsIDB4OTUsIDB4ZDYsCisJMHg2OCwgMHhmZiwgMHgwOCwgMHhjZiwgMHg3MCwgMHgyMCwgMHhiNywgMHg1NSwgMHg3OCwgMHhmNSwgMHg3ZiwgMHg3ZiwKKwkweGUxLCAweDA5LCAweDVkLCAweGZjLCAweGQwLCAweDdkLCAweGU5LCAweDcwLCAweDRiLCAweDhkLCAweDFjLCAweGRkLAorCTB4M2IsIDB4YjAsIDB4ZmUsIDB4NjcsIDB4M2QsIDB4Y2YsIDB4ZWYsIDB4MDMsIDB4YWQsIDB4ZjUsIDB4NjksIDB4MjksCisJMHg4YywgMHg2NSwgMHhkYiwgMHhhNCwgMHg2MCwgMHhiMiwgMHg1NiwgMHgxOSwgMHgwZiwgMHhjNywgMHg1YiwgMHgxMSwKKwkweGRiLCAweDM4LCAweGJlLCAweDE1LCAweGZjLCAweDg1LCAweDJlLCAweDNiLCAweDFkLCAweDYxLCAweGFkLCAweDk0LAorCTB4MGMsIDB4YmUsIDB4ZWIsIDB4MGMsIDB4ZDMsIDB4OGUsIDB4NTgsIDB4NmIsIDB4NmUsIDB4MGUsIDB4ZTcsIDB4MjIsCisJMHgzYiwgMHhhMiwgMHgxZiwgMHgzNiwgMHhjMywgMHgzOSwgMHhmYSwgMHg1YiwgMHgxZCwgMHhmNSwgMHgxMiwgMHhmYiwKKwkweGMwLCAweGIzLCAweGRjLCAweDZhLCAweDRiLCAweGQxLCAweDMzLCAweDI5LCAweGE3LCAweDE3LCAweDIzLCAweGJmLAorCTB4MDUsIDB4OWYsIDB4MzIsIDB4NjQsIDB4ODYsIDB4YmUsIDB4YmYsIDB4MTMsIDB4YmUsIDB4YWYsIDB4NWIsIDB4ZjYsCisJMHhjMiwgMHg2NywgMHhlZCwgMHg4MywgMHhjZiwgMHhkYSwgMHg4ZiwgMHgxYSwgMHg3NSwgMHg3YywgMHhhNSwgMHhmNSwKKwkweDNlLCAweDk3LCAweDc1LCAweDcxLCAweDU1LCAweDBlLCAweDI5LCAweGY5LCAweDU3LCAweDdjLCAweGMzLCAweGZlLAorCTB4MDAsIDB4M2EsIDB4YjAsIDB4NTMsIDB4ZTUsIDB4N2IsIDB4ODEsIDB4NGUsIDB4YzAsIDB4ZGYsIDB4M2EsIDB4NDksCisJMHhlOCwgMHhjNCwgMHhjNiwgMHg3YiwgMHhlMywgMHg2MSwgMHhkOCwgMHg0NiwgMHg0NywgMHg0MSwgMHhjNSwgMHg4NiwKKwkweDk1LCAweDgwLCAweGY3LCAweGQ1LCAweDdhLCAweGMwLCAweDdiLCAweGY4LCAweDY1LCAweGUwLCAweDM3LCAweGE1LAorCTB4ZDIsIDB4YjAsIDB4YTQsIDB4ODIsIDB4N2QsIDB4MmIsIDB4ZDgsIDB4YjcsIDB4ODIsIDB4ZGEsIDB4NzIsIDB4YjYsCisJMHhkMSwgMHhmYSwgMHhlZCwgMHhhYSwgMHgyYiwgMHhhNCwgMHg5ZCwgMHhiMCwgMHg1MSwgMHhkZiwgMHg2YSwgMHgzOSwKKwkweDdmLCAweGY0LCAweDNjLCAweDAyLCAweGZlLCAweDNmLCAweDAyLCAweGZlLCAweDFmLCAweDQ2LCAweDRkLCAweGY1LAorCTB4MDAsIDB4NmEsIDB4YWEsIDB4ZmIsIDB4NTAsIDB4NTMsIDB4MWQsIDB4NDIsIDB4NGQsIDB4MzUsIDB4ODUsIDB4OWEsCisJMHhlYSwgMHg2ZSwgMHhmOCwgMHg4ZiwgMHgzYiwgMHhlMSwgMHgzZiwgMHgyNiwgMHhlMSwgMHgzZiwgMHgyNiwgMHhkNCwKKwkweDlkLCAweGQxLCAweDQxLCAweDZmLCAweGUzLCAweDFkLCAweDRhLCAweGI0LCAweDE3LCAweGRiLCAweDFiLCAweDIyLAorCTB4NTAsIDB4ODEsIDB4ZjIsIDB4YjEsIDB4NzEsIDB4YTksIDB4MzcsIDB4NTksIDB4NWIsIDB4MzksIDB4ZWEsIDB4M2UsCisJMHg2YywgMHhkYSwgMHg5OSwgMHhkNCwgMHhhNiwgMHg5MCwgMHhiZiwgMHhkZiwgMHgzMywgMHhjMiwgMHg5YSwgMHgyYiwKKwkweGE5LCAweDE1LCAweDU1LCAweGNkLCAweDk1LCAweDdkLCAweGMxLCAweDQ1LCAweDhhLCAweDg0LCAweGRjLCAweDBmLAorCTB4NjcsIDB4Y2UsIDB4OWUsIDB4MmUsIDB4MWEsIDB4NTEsIDB4YmQsIDB4ZDMsIDB4YmIsIDB4NWEsIDB4ZWYsIDB4MmMsCisJMHhjZiwgMHhiMywgMHhkZSwgMHg3OSwgMHg3NSwgMHhiNSwgMHhkZSwgMHg1OSwgMHg5ZSwgMHg2NywgMHhiZCwgMHhmMywKKwkweGNhLCAweGJhLCAweDdhLCAweGU3LCAweGNhLCAweGQzLCAweDk3LCAweGQ2LCAweGQ1LCAweDNiLCAweDU3LCAweDllLAorCTB4N2UsIDB4MjksIDB4MWMsIDB4NGIsIDB4YTgsIDB4MGYsIDB4MjEsIDB4YWQsIDB4OTYsIDB4ODMsIDB4NjcsIDB4NGYsCisJMHg5OCwgMHg3MywgMHgzNCwgMHhmYiwgMHhkNiwgMHhmZiwgMHhkZiwgMHg3NCwgMHhjYSwgMHg5NiwgMHgzNSwgMHhiMSwKKwkweGZmLCAweDY4LCAweDZiLCAweDUwLCAweDIzLCAweGI1LCAweGNlLCAweDc3LCAweGI3LCAweGNjLCAweDVmLCAweDU2LAorCTB4ZGYsIDB4NGIsIDB4Y2IsIDB4YjUsIDB4Y2QsIDB4ZWYsIDB4YzIsIDB4MDMsIDB4Y2IsIDB4Y2EsIDB4MTAsIDB4ZjMsCisJMHhiYywgMHgwZiwgMHg3YywgMHg3ZSwgMHhmMywgMHg3MywgMHhmNSwgMHgwZSwgMHhmNSwgMHhjZCwgMHhjZCwgMHg1NSwKKwkweGY5LCAweDM2LCAweGVjLCAweDdjLCAweGY0LCAweGQxLCAweGFkLCAweDgxLCAweDJmLCAweDYwLCAweDNmLCAweGE1LAorCTB4MDUsIDB4ZmUsIDB4ZmQsIDB4MDEsIDB4ZTAsIDB4MDEsIDB4YWYsIDB4M2QsIDB4NTMsIDB4ZGQsIDB4MDcsIDB4MDUsCisJMHhlNywgMHgwZCwgMHhlZSwgMHhjNiwgMHhjZCwgMHhmYywgMHhlNSwgMHgxOSwgMHhlNiwgMHhkNiwgMHg1NSwgMHg4NSwKKwkweDliLCAweGY1LCAweDIzLCAweDZiLCAweGNlLCAweDI4LCAweDA2LCAweDQ0LCAweGI4LCAweDVlLCAweDRkLCAweDA1LAorCTB4NzQsIDB4YmIsIDB4YTgsIDB4MWQsIDB4YjksIDB4MjYsIDB4MWEsIDB4YjcsIDB4ZDYsIDB4OWEsIDB4OWQsIDB4ZTEsCisJMHhiZCwgMHhkYiwgMHhlNSwgMHgyMCwgMHhhZiwgMHg1MiwgMHhmOCwgMHhjYywgMHgxMCwgMHhkZiwgMHhjZiwgMHhmZCwKKwkweGMwLCAweGY3LCAweDEwLCAweGRlLCAweDZhLCAweDgxLCAweDFmLCAweDQ3LCAweGFlLCAweGM3LCAweDdiLCAweDFhLAorCTB4ZTYsIDB4NmMsIDB4YTYsIDB4YmMsIDB4MzMsIDB4ZGYsIDB4MjUsIDB4ZmYsIDB4NzksIDB4ZDQsIDB4ZjcsIDB4MjcsCisJMHg5YywgMHhlYywgMHhmMCwgMHgyNSwgMHhkNCwgMHgxZSwgMHgyNywgMHg2OSwgMHgyNywgMHhhMywgMHhhNCwgMHg3MywKKwkweDMwLCAweDMzLCAweDJiLCAweGE5LCAweDNlLCAweGQyLCAweDcyLCAweDVlLCAweDNmLCAweGFjLCAweDdkLCAweDk4LAorCTB4NmUsIDB4M2QsIDB4ZGMsIDB4ZTcsIDB4MWYsIDB4NWIsIDB4ZjYsIDB4YzksIDB4YjQsIDB4ZWMsIDB4NTMsIDB4YTAsCisJMHhjZCwgMHhkNiwgMHhlZiwgMHhjMCwgMHg5OSwgMHgyYiwgMHhkYiwgMHhhZiwgMHhiNywgMHg1MiwgMHg2MSwgMHg1ZCwKKwkweGY2LCAweGYwLCAweGU4LCAweDY2LCAweDU5LCAweGU4LCAweGNmLCAweDllLCAweDdkLCAweDA1LCAweGY5LCAweDdhLAorCTB4NzksIDB4MTQsIDB4NzMsIDB4YTksIDB4NDEsIDB4YmMsIDB4ZTMsIDB4N2MsIDB4YjYsIDB4OGUsIDB4NWMsIDB4ZjQsCisJMHg2YywgMHg1ZCwgMHhiNiwgMHgwMSwgMHgzZSwgMHg1YiwgMHgxMSwgMHhlMSwgMHgzYywgMHhmYiwgMHg4YSwgMHhiNiwKKwkweDdhLCAweGU4LCAweDAzLCAweGQyLCAweDE3LCAweDcwLCAweGU2LCAweDI5LCAweGQ0LCAweDVmLCAweDg3LCAweDgzLAorCTB4N2IsIDB4YjQsIDB4NzAsIDB4OWYsIDB4MWIsIDB4YjUsIDB4MjAsIDB4NmYsIDB4Y2UsIDB4NjksIDB4OTUsIDB4ZjAsCisJMHgwZSwgMHhmMCwgMHgyYiwgMHhmMCwgMHgxNywgMHg4NiwgMHg0ZSwgMHhkOCwgMHg3NywgMHg4MCwgMHg1YiwgMHg5MywKKwkweGE1LCAweGEzLCAweDg2LCAweGJhLCAweDNiLCAweDJkLCAweDhmLCAweDUyLCAweGQ2LCAweDdjLCAweDdlLCAweDE0LAorCTB4ZWYsIDB4YTIsIDB4MzMsIDB4ZmQsIDB4NGQsIDB4NzgsIDB4YTYsIDB4ZDEsIDB4YjAsIDB4NmUsIDB4OGYsIDB4Y2UsCisJMHg5NCwgMHg5MCwgMHhkNywgMHhlNywgMHgyZCwgMHhjMCwgMHg4ZSwgMHg4MCwgMHgxZiwgMHgyNSwgMHg1OSwgMHg2OSwKKwkweDY2LCAweDNlLCAweDA1LCAweDRmLCAweGFkLCAweDg1LCAweDM3LCAweGU2LCAweDA2LCAweDE5LCAweDQ2LCAweDc1LAorCTB4MGYsIDB4NzgsIDB4MzAsIDB4OTEsIDB4ODYsIDB4MWQsIDB4ZGUsIDB4ZDcsIDB4MTcsIDB4ZGQsIDB4ZTksIDB4MWEsCisJMHhiNiwgMHhhZSwgMHgwNSwgMHg3NSwgMHgzYywgMHhlNywgMHgwNywgMHg2MCwgMHg4YiwgMHgxOSwgMHhkOCwgMHgyNywKKwkweDczLCAweGE2LCAweDEyLCAweDZiLCAweDE1LCAweGRhLCAweDkzLCAweGU1LCAweDFhLCAweDU5LCAweDZiLCAweDUyLAorCTB4ODYsIDB4NTEsIDB4ZWYsIDB4ZjAsIDB4ZmMsIDB4NzksIDB4NTksIDB4NmUsIDB4NDYsIDB4MzQsIDB4ZTQsIDB4NjAsCisJMHg4ZiwgMHg2MywgMHhmOCwgMHg4ZCwgMHhlMCwgMHg5ZCwgMHg4MywgMHgxZiwgMHg2YiwgMHhhNSwgMHg4MiwgMHg3YywKKwkweDU1LCAweGU1LCAweGUyLCAweGM4LCAweGI1LCAweDg3LCAweDQ4LCAweGRmLCAweDAxLCAweGFjLCAweGE3LCAweDNlLAorCTB4NTMsIDB4NGYsIDB4MGYsIDB4ODgsIDB4ZGIsIDB4NGYsIDB4NWYsIDB4OTEsIDB4MDYsIDB4NmUsIDB4YzAsIDB4NzgsCisJMHhhZiwgMHhjMSwgMHhkNiwgMHgwNywgMHhmMCwgMHhjYywgMHg1YSwgMHg2NSwgMHhmMiwgMHg1NiwgMHhlMSwgMHhmNywKKwkweDdkLCAweDIzLCAweGM3LCAweDZmLCAweDExLCAweGUzLCAweGUxLCAweDc4LCAweGQwLCAweGZhLCAweDFkLCAweGVhLAorCTB4NWUsIDB4ZmEsIDB4NWEsIDB4MzksIDB4YmIsIDB4MTgsIDB4YzUsIDB4YzEsIDB4MTksIDB4ZDgsIDB4MjAsIDB4ZWYsCisJMHg2OCwgMHhjNywgMHhjMSwgMHgxNywgMHg4ZSwgMHhiNSwgMHgzMCwgMHgxZSwgMHg2MiwgMHg3ZSwgMHhmOSwgMHhhZiwKKwkweDcwLCAweGVlLCAweGJjLCAweDljLCAweDQ0LCAweGZkLCAweDJmLCAweGZkLCAweDdjLCAweDY2LCAweDgwLCAweDdmLAorCTB4NGIsIDB4YTgsIDB4ZWYsIDB4ZWIsIDB4ZTEsIDB4MGQsIDB4OWIsIDB4ZmQsIDB4NzEsIDB4ZDAsIDB4NjcsIDB4YjYsCisJMHhjMCwgMHgxMywgMHgyNiwgMHhhYywgMHg0ZiwgMHgwNCwgMHhmMSwgMHgzOCwgMHhlZCwgMHhkZiwgMHhhYSwgMHhlNywKKwkweGVmLCAweDk2LCAweDNmLCAweDUwLCAweDY3LCAweGNhLCAweGNiLCAweGExLCAweDQ1LCAweGRmLCAweDc3LCAweDczLAorCTB4ODMsIDB4YzMsIDB4Y2IsIDB4OTIsIDB4MWQsIDB4N2UsIDB4NTIsIDB4NzYsIDB4NWIsIDB4N2IsIDB4NTksIDB4OGYsCisJMHg1OSwgMHhjNCwgMHhlMywgMHhkZiwgMHhkYSwgMHg5NiwgMHhmNywgMHhmZCwgMHgxMywgMHhhMCwgMHhmZCwgMHgwNywKKwkweDZhLCAweDlmLCAweGJiLCAweDQxLCAweDNmLCAweDc4LCAweGE1LCAweDZhLCAweDEyLCAweGQyLCAweDBhLCAweGRlLAorCTB4YTQsIDB4NDgsIDB4NmYsIDB4YTcsIDB4MWMsIDB4NmEsIDB4M2UsIDB4MWYsIDB4Y2EsIDB4ZTYsIDB4MTEsIDB4NzEsCisJMHhiZCwgMHhiNywgMHgwZCwgMHhkZSwgMHg2ZiwgMHg5NywgMHg5YiwgMHg4ZiwgMHg4NiwgMHhiNCwgMHhlNSwgMHg0MSwKKwkweDJmLCAweGY2LCAweDZmLCAweGZlLCAweDQzLCAweDhhLCAweGJlLCAweDgxLCAweDMyLCAweDc3LCAweDkxLCAweDM1LAorCTB4YmEsIDB4YTMsIDB4Y2YsIDB4NDAsIDB4MDcsIDB4M2YsIDB4Y2UsIDB4MGYsIDB4MjQsIDB4NjUsIDB4YmQsIDB4MWYsCisJMHgyMCwgMHg1YywgMHhmMiwgMHgyMywgMHg3NCwgMHg4NSwgMHg3NCwgMHg4OCwgMHhmMiwgMHg5ZiwgMHgyYSwgMHg2ZSwKKwkweDI5LCAweDdjLCAweGM2LCAweDA2LCAweDVmLCAweGYwLCAweGE0LCAweDdhLCAweDllLCAweDM3LCAweGU4LCAweDliLAorCTB4MTgsIDB4ZmYsIDB4YTgsIDB4YzMsIDB4ZGQsIDB4ZjAsIDB4N2YsIDB4ZDAsIDB4NDEsIDB4ZDgsIDB4NzEsIDB4NzEsCisJMHg5MSwgMHhmNywgMHgxMywgMHg0MywgMHhlYSwgMHg0ZSwgMHhhYiwgMHgwNCwgMHhkOSwgMHgyZSwgMHhmMSwgMHgzYiwKKwkweDYzLCAweDJhLCAweGM4LCAweDI3LCAweDgzLCAweGZhLCAweDJiLCAweDQzLCAweDVmLCAweDg4LCAweGY2LCAweGI4LAorCTB4ZjIsIDB4OTMsIDB4MjUsIDB4ZjUsIDB4NWQsIDB4MzEsIDB4ODksIDB4MzUsIDB4M2UsIDB4OWUsIDB4YWQsIDB4N2YsCisJMHgyNywgMHhmMSwgMHhhMywgMHg0MiwgMHhmMCwgMHg3NywgMHgxMiwgMHhlMSwgMHgzNywgMHhkZSwgMHg3YSwgMHg5MCwKKwkweDQ3LCAweDNjLCAweGQ4LCAweDMwLCAweDY1LCAweGFhLCAweDExLCAweGZkLCAweGRkLCAweDA0LCAweGU1LCAweDYwLAorCTB4NGIsIDB4YjksIDB4MTEsIDB4ZTUsIDB4MGUsIDB4N2UsIDB4NTAsIDB4ZDMsIDB4YWMsIDB4OTMsIDB4ZTUsIDB4ZTMsCisJMHg2MSwgMHg0ZSwgMHhjNCwgMHgxYSwgMHg4MCwgMHgzYywgMHhjNCwgMHg3OCwgMHgzOSwgMHg5MCwgMHhkZiwgMHg5MiwKKwkweGJlLCAweDAzLCAweGYyLCAweDAzLCAweGNmLCAweDNkLCAweDEzLCAweGI2LCAweDk0LCAweDBlLCAweGUzLCAweGJhLAorCTB4YzUsIDB4MWEsIDB4MzMsIDB4YWMsIDB4N2IsIDB4YjcsIDB4NGIsIDB4NzUsIDB4OTIsIDB4ZWYsIDB4MTMsIDB4ZjIsCisJMHhkYSwgMHhmYywgMHg0MCwgMHg3MCwgMHg0ZiwgMHgyNCwgMHg4OSwgMHhmMCwgMHgzZCwgMHhjNywgMHg0OSwgMHgyOSwKKwkweGFiLCAweGY3LCAweDc3LCAweDg2LCAweGY4LCAweDUwLCAweGE3LCAweGRkLCAweDE5LCAweDhkLCAweGQzLCAweDkwLAorCTB4NjMsIDB4MDAsIDB4MzcsIDB4OGQsIDB4NTgsIDB4ZjYsIDB4NTUsIDB4YzQsIDB4YjEsIDB4NjksIDB4ZjAsIDB4YmQsCisJMHgzOCwgMHg1MSwgMHg5MSwgMHg2YiwgMHg2ZCwgMHg0YiwgMHhjNSwgMHg3ZCwgMHgzNywgMHg0OSwgMHgxZCwgMHhhMywKKwkweDdlLCAweDExLCAweGE2LCAweDA3LCAweGI5LCAweDJhLCAweGNlLCAweDNiLCAweDJhLCAweDUzLCAweDQ2LCAweGZlLAorCTB4ZGQsIDB4ZGIsIDB4Y2EsIDB4YjUsIDB4YWMsIDB4NTUsIDB4OTAsIDB4ZjcsIDB4N2QsIDB4ZDcsIDB4ZTQsIDB4ZjgsCisJMHhmYywgMHg2ZCwgMHgwZiwgMHgwNiwgMHg3NywgMHhmZSwgMHhiYSwgMHg5ZSwgMHhiZiwgMHg3OCwgMHg1YiwgMHgzOSwKKwkweGU4LCAweGUzLCAweGNjLCAweGVmLCAweDg2LCAweDdkLCAweGMyLCAweDE5LCAweGVhLCAweDdiLCAweGVjLCAweDRmLAorCTB4NmUsIDB4MzIsIDB4ZTUsIDB4YzIsIDB4NGQsIDB4YmUsIDB4N2YsIDB4MGYsIDB4YmYsIDB4MDksIDB4ODUsIDB4NzUsCisJMHhhYywgMHhhNSwgMHhlYSwgMHhkOCwgMHgwZSwgMHg5NSwgMHg4ZiwgMHhiOCwgMHhhMywgMHgxOSwgMHhhZCwgMHgwNCwKKwkweGRiLCAweDNkLCAweGU5LCAweGExLCAweGU2LCAweGQxLCAweGIzLCAweDYzLCAweGU3LCAweDc1LCAweDBiLCAweGYxLAorCTB4MzcsIDB4OWIsIDB4MzksIDB4MmUsIDB4YjksIDB4M2UsIDB4N2UsIDB4NjMsIDB4OWUsIDB4NzMsIDB4YjgsIDB4NjYsCisJMHg1YiwgMHg3MCwgMHhlZiwgMHg3NSwgMHg4MywgMHhhYiwgMHg3YywgMHhhZSwgMHg0OCwgMHgxOCwgMHg4NywgMHg2ZSwKKwkweDY4LCAweGI1LCAweDhmLCAweGQ2LCAweDNjLCAweDkzLCAweDc2LCAweDIxLCAweDUzLCAweDI2LCAweGU4LCAweGE5LAorCTB4ZDYsIDB4YTIsIDB4OWMsIDB4OGQsIDB4N2YsIDB4MGYsIDB4NzAsIDB4ZmUsIDB4YjYsIDB4YTcsIDB4MWEsIDB4MTcsCisJMHg2ZiwgMHg5YiwgMHg4NSwgMHg3YywgMHg3OCwgMHhhNiwgMHhkOSwgMHg0NiwgMHhhNCwgMHg3ZiwgMHg1MSwgMHhkZCwKKwkweGMwLCAweDNlLCAweGUyLCAweGJmLCAweDg3LCAweGY4LCAweGVmLCAweDIxLCAweGZlLCAweDdiLCAweDg4LCAweGZmLAorCTB4MWUsIDB4ZTIsIDB4YmYsIDB4ODcsIDB4ZjgsIDB4MGYsIDB4MWUsIDB4M2UsIDB4MDcsIDB4N2QsIDB4NzksIDB4ZDYsCisJMHg5YiwgMHgwOCwgMHg3MywgMHhiNiwgMHhjNywgMHg1NiwgMHg3MywgMHgzNiwgMHhmZSwgMHhjZCwgMHhjYiwgMHhiOSwKKwkweGE2LCAweGEyLCAweGE1LCAweDUyLCAweDkxLCAweDIwLCAweGU3LCAweDE1LCAweDlkLCAweGY5LCAweDRkLCAweDk0LAorCTB4ZjMsIDB4N2UsIDB4ZjQsIDB4ZjcsIDB4OTAsIDB4MDAsIDB4OGUsIDB4ZjksIDB4MWUsIDB4ZTEsIDB4MmEsIDB4OWEsCisJMHg2ZSwgMHgxMywgMHgyZSwgMHhjOCwgMHhmOSwgMHg1OCwgMHg2NywgMHhhZCwgMHg4NywgMHhlMSwgMHg3NywgMHgzNywKKwkweGZhLCAweGI2LCAweGUwLCAweDliLCAweDRmLCAweGYwLCAweDdkLCAweGE5LCAweDc2LCAweDg3LCAweDhiLCAweDU4LAorCTB4NWMsIDB4NmUsIDB4YTgsIDB4NzgsIDB4OGMsIDB4NzEsIDB4ZTMsIDB4MGUsIDB4ZmUsIDB4YWQsIDB4MDIsIDB4NjQsCisJMHhjMCwgMHg3NywgMHg1ZiwgMHg2NiwgMHg2ZCwgMHg1MSwgMHg2ZSwgMHgyMCwgMHgyZiwgMHg1YSwgMHg4ZSwgMHg3MiwKKwkweDIxLCAweGMwLCAweDc5LCAweDZmLCAweDZhLCAweGE1LCAweDA1LCAweGNhLCAweDU5LCAweDk3LCAweGQ5LCAweDE0LAorCTB4OTgsIDB4NjIsIDB4YjcsIDB4ZTYsIDB4NzgsIDB4OTcsIDB4NTQsIDB4YmQsIDB4NzQsIDB4YjYsIDB4NDksIDB4N2EsCisJMHg0NiwgMHg0MCwgMHg1YiwgMHg3NCwgMHg4ZiwgMHgyYywgMHg2MiwgMHhjYywgMHhhNywgMHg0NCwgMHg5ZiwgMHg0NywKKwkweDdlLCAweDZiLCAweDBmLCAweGE5LCAweGJmLCAweDZmLCAweGU4LCAweGM1LCAweDNlLCAweGZhLCAweGZjLCAweDhlLAorCTB4OTYsIDB4N2IsIDB4NWEsIDB4MjksIDB4MDQsIDB4M2UsIDB4OWIsIDB4YjEsIDB4ODcsIDB4ZTcsIDB4NDgsIDB4YzEsCisJMHg3NiwgMHhkZCwgMHg2ZCwgMHgzOCwgMHgxYiwgMHhlNCwgMHhmYSwgMHhhZiwgMHg1YiwgMHg1NSwgMHgwZSwgMHgwZSwKKwkweDNmLCAweDdhLCAweDYyLCAweGE4LCAweGJmLCAweDVmLCAweGJhLCAweGI3LCAweGNiLCAweGM5LCAweDIxLCAweGQ2LAorCTB4NmIsIDB4OWIsIDB4ODEsIDB4OGYsIDB4NmIsIDB4NzksIDB4ZmYsIDB4YjQsIDB4NWQsIDB4NGUsIDB4MmQsIDB4YzIsCisJMHhjZiwgMHgyZSwgMHg2NiwgMHgxZCwgMHhlYSwgMHhmMiwgMHhkMiwgMHg1MCwgMHgwYSwgMHhmZSwgMHhmOSwgMHhlNiwKKwkweDdlLCAweGM2LCAweGU3LCAweGU1LCAweDI2LCAweDc1LCAweGE1LCAweDE3LCAweGYwLCAweDAzLCAweGQwLCAweGNiLAorCTB4NGQsIDB4YjAsIDB4MjcsIDB4MWQsIDB4ZmIsIDB4NDcsIDB4YjgsIDB4ZmYsIDB4NDUsIDB4ZTEsIDB4ZWUsIDB4YjUsCisJMHg5ZCwgMHg2ZCwgMHg0YSwgMHgzNywgMHhmNCwgMHhhYywgMHg5NSwgMHhkMSwgMHg0MSwgMHhmYiwgMHhmZiwgMHgxNCwKKwkweDZlLCAweDZkLCAweDMxLCAweDcxLCAweDVjLCAweDY3LCAweGY4LCAweDNmLCAweGIzLCAweGRjLCAweDhjLCAweGQ3LAorCTB4MzAsIDB4ODYsIDB4ZjUsIDB4YjIsIDB4NTgsIDB4YWUsIDB4YmEsIDB4MDMsIDB4NjMsIDB4MzMsIDB4ZDEsIDB4NjIsCisJMHg2NSwgMHhiMCwgMHhlYywgMHgxNiwgMHg1NSwgMHg5NiwgMHhiYSwgMHhkYSwgMHgwNSwgMHg0MiwgMHhlMiwgMHgzYSwKKwkweGRkLCAweDI0LCAweGI0LCAweDcyLCAweGQ1LCAweDJhLCAweDQyLCAweDYwLCAweDM3LCAweDhlLCAweGZhLCAweGQyLAorCTB4NDYsIDB4NTUsIDB4ZGIsIDB4MzcsIDB4YWYsIDB4MTYsIDB4ZWMsIDB4MzgsIDB4Y2QsIDB4YWMsIDB4MTcsIDB4MzcsCisJMHgzOCwgMHhmNCwgMHg3MSwgMHhiMywgMHgyYywgMHgwZSwgMHg5MCwgMHg3NSwgMHg1NiwgMHg2ZSwgMHhmMiwgMHg5MCwKKwkweDNlLCAweDE5LCAweDZkLCAweGEyLCAweDI0LCAweDU1LCAweGE1LCAweGJjLCAweDU0LCAweDdkLCAweGFiLCAweDVhLAorCTB4MGIsIDB4MjcsIDB4YzQsIDB4MGYsIDB4YTksIDB4YWQsIDB4ZjYsIDB4YTUsIDB4NzcsIDB4NGQsIDB4YmYsIDB4ZWYsCisJMHhjYywgMHgyYywgMHhjNiwgMHhhNCwgMHg1MSwgMHg5MSwgMHg1NiwgMHg3MywgMHhlNiwgMHhjYywgMHhiOSwgMHg5ZiwKKwkweGZmLCAweGYyLCAweGZkLCAweDE3LCAweDNlLCAweDY3LCAweDY3LCAweGJhLCAweGMyLCAweGJkLCAweGNkLCAweDk1LAorCTB4NzYsIDB4YzYsIDB4ZmUsIDB4YjYsIDB4ZDQsIDB4Y2MsIDB4MDIsIDB4ZjMsIDB4MWEsIDB4ODYsIDB4NjQsIDB4ZGMsCisJMHg2NCwgMHhhZSwgMHhjZiwgMHg5NiwgMHgzYSwgMHg1NywgMHg2NiwgMHgxYiwgMHgxYiwgMHg2NSwgMHhkYSwgMHhlNCwKKwkweDRiLCAweDZhLCAweGE2LCAweGRjLCAweDIzLCAweDE3LCAweDQxLCAweGM3LCAweDg1LCAweGUxLCAweGQ2LCAweGQwLAorCTB4ZjcsIDB4ZGEsIDB4MTksIDB4ZjIsIDB4NzMsIDB4NzcsIDB4M2MsIDB4ZDQsIDB4NTcsIDB4MWEsIDB4NTcsIDB4MTYsCisJMHgzNCwgMHhiNiwgMHhlZSwgMHhkZSwgMHhmNSwgMHhlZCwgMHg0OSwgMHhhYywgMHgyOSwgMHg0MSwgMHg1ZiwgMHg3OSwKKwkweDVjLCAweGNiLCAweDI2LCAweDgzLCAweGVmLCAweDdkLCAweGJiLCAweGRlLCAweGUzLCAweGJiLCAweGRlLCAweDBmLAorCTB4ZmMsIDB4OGYsIDB4ZjYsIDB4MmMsIDB4ZWYsIDB4YTYsIDB4MDcsIDB4YWUsIDB4ZDMsIDB4MWEsIDB4ZTUsIDB4MmMsCisJMHgwNSwgMHhjZiwgMHgzNiwgMHg2NiwgMHgzZCwgMHgyYiwgMHg0ZCwgMHg1YywgMHg5MCwgMHgxNSwgMHg1ZiwgMHg2NSwKKwkweGRkLCAweDM2LCAweGM4LCAweGJiLCAweDM2LCAweDk5LCAweDVmLCAweDA0LCAweGNkLCAweDYzLCAweDFmLCAweGVkLAorCTB4MzYsIDB4NjMsIDB4ZTQsIDB4NDMsIDB4NzEsIDB4ZjIsIDB4NGMsIDB4MDcsIDB4YWUsIDB4YzEsIDB4YjAsIDB4MDcsCisJMHgxMywgMHg2OCwgMHhlNywgMHgzZiwgMHhlZiwgMHhhNiwgMHhjYywgMHhiMywgMHhkYSwgMHg5NywgMHg0MywgMHgzYywKKwkweGUzLCAweGFiLCAweDgyLCAweGNlLCAweGY3LCAweDYwLCAweDliLCAweDE2LCAweGI5LCAweDYzLCAweDY3LCAweDdhLAorCTB4YzIsIDB4N2MsIDB4MjAsIDB4ZDgsIDB4YmUsIDB4NWYsIDB4OGQsIDB4MTMsIDB4NmIsIDB4M2MsIDB4ZTcsIDB4NmUsCisJMHhkNywgMHg5OSwgMHg5YiwgMHhjMiwgMHgxYywgMHgyYiwgMHgxMCwgMHhjZCwgMHg1MywgMHgyMiwgMHhlNSwgMHhhYSwKKwkweGM4LCAweGViLCAweGY4LCAweGZkLCAweGE2LCAweDFhLCAweGM2LCAweDRmLCAweDE0LCAweGVkLCAweGVlLCAweDkzLAorCTB4YjIsIDB4NWUsIDB4ZmEsIDB4OWEsIDB4ZDQsIDB4YTAsIDB4N2YsIDB4ZDYsIDB4NWMsIDB4ZGYsIDB4YmYsIDB4ZWIsCisJMHgyNiwgMHhmNSwgMHg5OSwgMHhiZiwgMHhlOCwgMHgyOSwgMHgxOSwgMHgxOCwgMHhhMSwgMHg3ZSwgMHg2YiwgMHg5MywKKwkweDk3LCAweDE3LCAweDViLCAweDY0LCAweGMzLCAweGI0LCAweGNjLCAweGJiLCAweDQ0LCAweDAxLCAweDVlLCAweDQyLAorCTB4MjYsIDB4NjMsIDB4MTEsIDB4OGQsIDB4NTEsIDB4ZTUsIDB4NWIsIDB4MjIsIDB4NWIsIDB4ZjgsIDB4YjYsIDB4YjUsCisJMHhmOCwgMHg0YywgMHg5YywgMHhmZSwgMHg5NywgMHg0ZiwgMHgxNiwgMHhmOSwgMHg2ZSwgMHhlMCwgMHg2OSwgMHg0OCwKKwkweGMzLCAweDhlLCAweDAwLCAweGNiLCAweDQyLCAweDA4LCAweDk5LCAweDNjLCAweDc3LCAweGVlLCAweGY3LCAweGJiLAorCTB4NWMsIDB4MWIsIDB4ZWEsIDB4NjgsIDB4Y2YsIDB4YjYsIDB4NDksIDB4ZTEsIDB4MzAsIDB4NjQsIDB4YTIsIDB4MWEsCisJMHhkNCwgMHgzOSwgMHg0NywgMHg4ZCwgMHg5OCwgMHg5NiwgMHhkMSwgMHg5MSwgMHgwYSwgMHg3ZCwgMHhmOCwgMHhlNiwKKwkweDVlLCAweDJkLCAweGFmLCAweDMzLCAweDM3LCAweDdlLCAweGE0LCAweGY3LCAweDgyLCAweDcyLCAweGJlLCAweGUyLAorCTB4OTIsIDB4NTYsIDB4NGQsIDB4NTksIDB4MDMsIDB4YWYsIDB4YWQsIDB4ZDYsIDB4NWYsIDB4ZWQsIDB4ZTMsIDB4NWQsCisJMHhhZCwgMHhkNywgMHg1ZiwgMHg4OCwgMHgwNywgMHhmNiwgMHgxYSwgMHhlYiwgMHg3ZSwgMHgxYywgMHgwZiwgMHhlYSwKKwkweDkyLCAweGExLCAweGZkLCAweDQ1LCAweDNiLCAweGFkLCAweDhjLCAweGJkLCAweGJkLCAweDIwLCAweGY1LCAweGE1LAorCTB4OWYsIDB4YzksIDB4M2IsIDB4YTUsIDB4OWYsIDB4YzgsIDB4YWYsIDB4OTcsIDB4Y2UsIDB4MDAsIDB4N2YsIDB4NTgsCisJMHhlNSwgMHgzYywgMHhmNCwgMHhjOSwgMHhjZCwgMHhiYSwgMHhlZiwgMHhkZiwgMHg3NCwgMHhhNywgMHg2MCwgMHgyYiwKKwkweGY4LCAweGZlLCAweGVmLCAweGRjLCAweDBkLCAweDE5LCAweDM4LCAweGY2LCAweDNkLCAweGVjLCAweDM5LCAweDA3LAorCTB4MWUsIDB4YTIsIDB4MmMsIDB4OWMsIDB4MDQsIDB4YmQsIDB4YjksIDB4N2QsIDB4ZDIsIDB4MTksIDB4ZDUsIDB4NzQsCisJMHgzMiwgMHg3OCwgMHhhYywgMHgxNSwgMHg3YiwgMHgzMCwgMHg0MiwgMHg0YywgMHhjZSwgMHhiZCwgMHg4YywgMHhmNCwKKwkweDkxLCAweDY2LCAweDhjLCAweDdhLCAweDA5LCAweGYzLCAweGI3LCAweDgyLCAweDJmLCAweGY2LCAweGUyLCAweGE3LAorCTB4ZTQsIDB4ZWUsIDB4MDgsIDB4ZDYsIDB4M2EsIDB4NDIsIDB4ZGEsIDB4NmIsIDB4OTUsIDB4ODEsIDB4NDcsIDB4YjEsCisJMHg4ZiwgMHg1YywgMHg4YiwgMHhkYywgMHhmMywgMHg3ZSwgMHgxOSwgMHhhNywgMHg2ZiwgMHhlZiwgMHg5ZSwgMHhjNywKKwkweGIyLCAweGYxLCAweDk1LCAweDJlLCAweGYxLCAweGE1LCAweDA1LCAweGJhLCAweDdjLCAweGZlLCAweDc4LCAweDgwLAorCTB4OWIsIDB4ZGUsIDB4NTUsIDB4NDMsIDB4NjgsIDB4NmYsIDB4ZTcsIDB4ZGYsIDB4NTMsIDB4YzQsIDB4NzksIDB4NzksCisJMHhiZiwgMHgxNSwgMHhiOCwgMHg3YywgMHgxYywgMHg3OCwgMHgyOCwgMHg1MywgMHhiZiwgMHgyMCwgMHg4ZCwgMHg5MSwKKwkweDI4LCAweGRhLCAweDEwLCAweGFmLCAweDY4LCAweDU5LCAweDIyLCAweDU5LCAweDhmLCAweDM5LCAweDVhLCAweGNjLAorCTB4OTcsIDB4YzIsIDB4MWEsIDB4YTcsIDB4NzQsIDB4MmUsIDB4NTcsIDB4MWYsIDB4Y2YsIDB4OWMsIDB4NTgsIDB4M2UsCisJMHhhOCwgMHhiMywgMHg0MSwgMHgyMywgMHhhYywgMHgyMywgMHg3ZCwgMHhhNywgMHgzNSwgMHhhNiwgMHg4MiwgMHgwZSwKKwkweGM1LCAweDc4LCAweGMzLCAweDkyLCAweGQxLCAweGU1LCAweDJlLCAweDhjLCAweDc3LCAweDQxLCAweDMyLCAweDZlLAorCTB4NzMsIDB4Y2MsIDB4NTEsIDB4YjQsIDB4YTEsIDB4OWMsIDB4MTksIDB4MDUsIDB4OTYsIDB4ZjgsIDB4NTgsIDB4OGQsCisJMHgyZCwgMHhjNiwgMHhhMCwgMHhjYiwgMHhlMywgMHgzMiwgMHg2NiwgMHhlZSwgMHhkOSwgMHhiMSwgMHhjNywgMHhiYywKKwkweGI2LCAweDE1LCAweDBjLCAweDYzLCAweDM4LCAweDVjLCAweDUzLCAweGQ3LCAweDhlLCAweDM1LCAweGIxLCAweDNmLAorCTB4N2UsIDB4YjAsIDB4OTMsIDB4MzMsIDB4OGIsIDB4MGIsIDB4OTAsIDB4NTMsIDB4MGIsIDB4MWYsIDB4NjYsIDB4ZGMsCisJMHg2NywgMHgyNSwgMHgxYiwgMHg2YiwgMHhkMywgMHhiNiwgMHg0ZCwgMHgwNSwgMHhmNywgMHg5MiwgMHhmNSwgMHhlOCwKKwkweGQzLCAweGZhLCAweDBlLCAweGU0LCAweGQwLCAweDllLCAweGIwLCAweDhlLCAweDZkLCAweGM1LCAweGM4LCAweGUwLAorCTB4ZWMsIDB4MDMsIDB4MWIsIDB4OTcsIDB4NzUsIDB4NWYsIDB4OTYsIDB4Y2MsIDB4NDIsIDB4NGUsIDB4MjYsIDB4NzQsCisJMHgzZiwgMHg5ZSwgMHhlMSwgMHg0MSwgMHg4ZCwgMHg0MywgMHhjOCwgMHhhYiwgMHgwMywgMHhiZCwgMHgzOCwgMHhjYiwKKwkweGQ0LCAweDAzLCAweDdiLCAweDM4LCAweGQ5LCAweDRiLCAweDJlLCAweGZhLCAweDRmLCAweGM4LCAweGIzLCAweGY4LAorCTB4ZDYsIDB4Y2IsIDB4M2IsIDB4NmEsIDB4OTMsIDB4ODEsIDB4NjcsIDB4YTAsIDB4MmYsIDB4YmQsIDB4NjYsIDB4N2QsCisJMHg1NCwgMHgzZSwgMHhmMywgMHhmYywgMHgzOCwgMHg2MywgMHgyZSwgMHg3ZiwgMHhmNiwgMHg0YywgMHhmOSwgMHhjNCwKKwkweGQzLCAweGIxLCAweGQ4LCAweGU5LCAweDg4LCAweDU4LCAweGU3LCAweDAzLCAweDViLCAweGZkLCAweGYwLCAweGY0LAorCTB4YmMsIDB4ZTIsIDB4ZjcsIDB4YzMsIDB4ZTcsIDB4NTcsIDB4NTQsIDB4MDcsIDB4ZGEsIDB4NDYsIDB4ZDEsIDB4OGUsCisJMHhlYiwgMHgzMCwgMHg2NSwgMHhkYywgMHhmYiwgMHhhYiwgMHgzZiwgMHg3MywgMHhjNCwgMHhmNywgMHgyNywgMHg3NCwKKwkweDRlLCAweDU4LCAweGNhLCAweDljLCAweDU3LCAweDRkLCAweDdjLCAweGVlLCAweDg4LCAweDE3LCAweDZiLCAweGM3LAorCTB4NWMsIDB4MjksIDB4NzMsIDB4NDUsIDB4MWQsIDB4YzYsIDB4N2EsIDB4NTgsIDB4ZWUsIDB4MjUsIDB4NGYsIDB4MjQsCisJMHgzNiwgMHg4NCwgMHhlMywgMHg1YiwgMHg5MywgMHhjYiwgMHgyYSwgMHg5NSwgMHgxYywgMHg1NCwgMHg1NiwgMHhiYSwKKwkweDgwLCAweDVmLCAweDhiLCAweGQyLCAweDcxLCAweGNjLCAweDQ0LCAweDUyLCAweDgxLCAweDc3LCAweGIxLCAweDI3LAorCTB4ZmIsIDB4YTgsIDB4ZWYsIDB4NGYsIDB4ZGEsIDB4YWMsIDB4NGYsIDB4OTksIDB4NTEsIDB4NDUsIDB4ZGYsIDB4NGIsCisJMHhhNywgMHg4ZSwgMHg3NywgMHg1ZSwgMHgzZSwgMHg5MCwgMHgzMiwgMHg4ZiwgMHhhYSwgMHhmZCwgMHhlMSwgMHhmYiwKKwkweDI4LCAweDY0LCAweGU2LCAweGY2LCAweDc4LCAweDY3LCAweDk2LCAweDk1LCAweDI5LCAweDJmLCAweDc5LCAweGE5LAorCTB4ZTQsIDB4YWMsIDB4YjIsIDB4NzIsIDB4MTgsIDB4MzMsIDB4MzcsIDB4YTYsIDB4MjgsIDB4MzcsIDB4NTIsIDB4NjYsCisJMHhhNywgMHhhMiwgMHg3ZiwgMHhiNCwgMHg1ZCwgMHhlZiwgMHg3YiwgMHgxMiwgMHhmZCwgMHg1MywgMHhhYSwgMHgyNSwKKwkweDVjLCAweDBmLCAweGVmLCAweGViLCAweDRhLCAweDVmLCAweGMwLCAweDMzLCAweDk0LCAweDM5LCAweGZkLCAweGM2LAorCTB4Y2MsIDB4MDIsIDB4ZjMsIDB4Y2IsIDB4NzQsIDB4NWUsIDB4NDMsIDB4N2EsIDB4ZTAsIDB4MTgsIDB4ZGYsIDB4MGQsCisJMHhiOSwgMHg3ZiwgMHhlMiwgMHg2ZiwgMHhhOCwgMHg0MywgMHhiOSwgMHhjYywgMHgzYSwgMHgyNywgMHhlNCwgMHhiNywKKwkweDIzLCAweDFhLCAweDNmLCAweGRmLCAweDNmLCAweDkxLCAweGQ3LCAweGI5LCAweDhiLCAweDBkLCAweDM1LCAweDEwLAorCTB4ZWUsIDB4N2IsIDB4ZmIsIDB4Y2UsIDB4OTIsIDB4MTksIDB4ZjcsIDB4NGIsIDB4MWMsIDB4NjcsIDB4MjEsIDB4NzIsCisJMHhiMiwgMHg1ZCwgMHg5OCwgMHgyMywgMHgzYSwgMHg1ZSwgMHg2YSwgMHhkMiwgMHgwNiwgMHg3ZCwgMHgwMywgMHhjYywKKwkweDE1LCAweDY4LCAweGM2LCAweGRkLCAweDJmLCAweDg4LCAweDcxLCAweGFjLCAweDYzLCAweDA3LCAweDlkLCAweDAwLAorCTB4NzcsIDB4MDIsIDB4YWYsIDB4NTYsIDB4MzEsIDB4NGUsIDB4NjEsIDB4NTEsIDB4ZjIsIDB4NDEsIDB4N2YsIDB4ZTksCisJMHg2MCwgMHg0ZSwgMHg2YSwgMHhhMSwgMHhmYSwgMHg0NSwgMHg2MywgMHgwNCwgMHgzYSwgMHg3MCwgMHgxYywgMHhlZiwKKwkweGY3LCAweDRmLCAweDkwLCAweDNlLCAweDc5LCAweDM2LCAweDQ5LCAweDM1LCAweGJlLCAweGM0LCAweGY1LCAweDFjLAorCTB4OTQsIDB4ODksIDB4NDUsIDB4NjAsIDB4MjMsIDB4ZmMsIDB4ZTYsIDB4MTcsIDB4ODMsIDB4N2IsIDB4YmIsIDB4MGUsCisJMHg5YywgMHgzZCwgMHhlMSwgMHg5OSwgMHg5YSwgMHg1ZiwgMHg2NywgMHg1ZCwgMHhjNiwgMHg0ZiwgMHhjMCwgMHgyYiwKKwkweDNhLCAweDhmLCAweDhhLCAweDdkLCAweDk5LCAweDRiLCAweDc4LCAweDg4LCAweGZhLCAweGQxLCAweDZkLCAweDQ4LAorCTB4MGMsIDB4NmQsIDB4ODksIDB4NTksIDB4NTksIDB4NmYsIDB4OGQsIDB4MjYsIDB4MjMsIDB4ZGQsIDB4MzIsIDB4MGYsCisJMHg3OSwgMHg1NywgMHg4MSwgMHhlZSwgMHgyYywgMHg1YywgMHg4OSwgMHhjYSwgMHhhYywgMHhhNywgMHhlMywgMHhkOSwKKwkweGM5LCAweDhmLCAweDk1LCAweDJiLCAweGI1LCAweGZhLCAweDcxLCAweGI5LCAweDUxLCAweDc3LCAweGY0LCAweDM3LAorCTB4ZWEsIDB4YjUsIDB4YzIsIDB4YWIsIDB4ODYsIDB4N2MsIDB4ZmYsIDB4ODgsIDB4Y2UsIDB4YTUsIDB4NzMsIDB4MmEsCisJMHhkMiwgMHhkOSwgMHg0ZiwgMHhjYywgMHhiMywgMHhhMiwgMHhmMywgMHhlYSwgMHgyMCwgMHgzYiwgMHg4MCwgMHgzOSwKKwkweGRlLCAweDA2LCAweGU2LCAweDc4LCAweDBiLCAweDk4LCAweGUzLCAweDU3LCAweGMwLCAweGQ4LCAweDM3LCAweDRiLAorCTB4OTMsIDB4YTEsIDB4ZmMsIDB4OWYsIDB4ODYsIDB4MWMsIDB4YTIsIDB4YWUsIDB4YjYsIDB4Y2UsIDB4ZTAsIDB4NGUsCisJMHhhNywgMHhmMywgMHhhMCwgMHhjMSwgMHhkYiwgMHhiMCwgMHgzZiwgMHhkNiwgMHg0YiwgMHgxOSwgMHg1OSwgMHg1ZCwKKwkweDlhLCAweDkwLCAweGI1LCAweGE1LCAweDIwLCAweDBmLCAweGY5LCAweDAzLCAweGU2LCAweDdkLCAweDhkLCAweGYwLAorCTB4OWUsIDB4MWMsIDB4YzgsIDB4YTEsIDB4M2QsIDB4MzIsIDB4NzAsIDB4OTQsIDB4ZjIsIDB4YTMsIDB4NDMsIDB4OTYsCisJMHg4YiwgMHhhYiwgMHg1YSwgMHgwZSwgMHgyZCwgMHgxNywgMHg1OSwgMHg4ZSwgMHg4OCwgMHhjZSwgMHgyMSwgMHg5YiwKKwkweGRhLCAweDkwLCAweDhhLCAweDViLCAweDQ3LCAweGZkLCAweDNlLCAweGVkLCAweDBmLCAweDBhLCAweGZjLCAweGYzLAorCTB4OTQsIDB4OTcsIDB4N2YsIDB4MGEsIDB4ZWYsIDB4NWUsIDB4ZTksIDB4ZGMsIDB4YmEsIDB4MTksIDB4YjMsIDB4MWIsCisJMHhlZCwgMHg5YSwgMHhiMiwgMHg2YiwgMHgzMCwgMHg4OCwgMHhiOSwgMHhhYiwgMHhkYiwgMHg2OCwgMHg4MywgMHgzOSwKKwkweDgwLCAweDE5LCAweGFmLCAweDQzLCAweDg3LCAweDM0LCAweDljLCAweDZlLCAweDhkLCAweGZkLCAweDFhLCAweGNlLAorCTB4MjEsIDB4OWQsIDB4NzcsIDB4Y2IsIDB4NzEsIDB4MGEsIDB4NDUsIDB4NWIsIDB4ZTYsIDB4OGEsIDB4NTYsIDB4MzIsCisJMHgwZiwgMHhmYSwgMHhiYiwgMHgwMSwgMHhiYiwgMHg2ZCwgMHgxNSwgMHg3NywgMHhiMCwgMHg4NiwgMHgzMywgMHg1OCwKKwkweGFmLCAweDUzLCAweGNmLCAweDZmLCAweDZhLCAweGQ5LCAweGJiLCAweDVjLCAweGZmLCAweDIzLCAweGM2LCAweGIxLAorCTB4Y2UsIDB4YTQsIDB4ZTUsIDB4MGYsIDB4N2QsIDB4OTQsIDB4ODEsIDB4ZjQsIDB4NGQsIDB4NjUsIDB4NzUsIDB4ZmYsCisJMHhhMCwgMHhkZiwgMHgyYSwgMHhkYSwgMHhhZSwgMHhkNSwgMHgyOSwgMHg4ZiwgMHg0NSwgMHgyZSwgMHg3OSwgMHgzNiwKKwkweDc0LCAweGM5LCAweGNiLCAweDA5LCAweDYyLCAweDgwLCAweGIyLCAweDZhLCAweGY2LCAweGYzLCAweGMzLCAweDM1LAorCTB4ZmIsIDB4ZmUsIDB4NWUsIDB4OWIsIDB4ZWIsIDB4NzIsIDB4NDIsIDB4YjksIDB4NGQsIDB4ZGQsIDB4YmYsIDB4YTEsCisJMHhiMSwgMHg4ZCwgMHg1NywgMHg3YSwgMHg1NiwgMHhkZSwgMHhjNCwgMHg3ZCwgMHgwNywgMHgxOCwgMHgyNywgMHgyNywKKwkweDZmLCAweDAwLCAweGUzLCAweGQ1LCAweDRiLCAweGNkLCAweGJjLCAweGVkLCAweDkzLCAweDM4LCAweGE3LCAweDkyLAorCTB4OWEsIDB4YmIsIDB4ZGEsIDB4MjksIDB4OTcsIDB4YWYsIDB4MTUsIDB4ZDQsIDB4NGIsIDB4ZDcsIDB4M2MsIDB4ZjUsCisJMHhmMywgMHhhYiwgMHg0NSwgMHg1NSwgMHhiOCwgMHhlYSwgMHhmYiwgMHhmZiwgMHg3MCwgMHg2NywgMHhlNCwgMHg5ZCwKKwkweDI1LCAweDVmLCAweDRlLCAweGJiLCAweDQ2LCAweDdmLCAweDQ0LCAweDlhLCAweGY5LCAweDc0LCAweGJlLCAweGRmLAorCTB4MDEsIDB4ZDksIDB4YmMsIDB4N2UsIDB4YzAsIDB4ZjcsIDB4MWYsIDB4MTksIDB4MTksIDB4MTEsIDB4ZTcsIDB4MDAsCisJMHgzMSwgMHhjYSwgMHg3MCwgMHg4MiwgMHgzOSwgMHhhZSwgMHg5NCwgMHgzOSwgMHgxOSwgMHhkYiwgMHgzZSwgMHg1ZiwKKwkweDUxLCAweDBhLCAweGYyLCAweGFkLCAweDNiLCAweGMwLCAweDJmLCAweDhmLCAweGVlLCAweDBiLCAweGUzLCAweDI2LAorCTB4M2YsIDB4N2MsIDB4OWUsIDB4N2UsIDB4ZTUsIDB4YzQsIDB4ZTcsIDB4ZmMsIDB4Y2EsIDB4YTYsIDB4OWMsIDB4MmQsCisJMHhmNiwgMHhhMiwgMHg3ZiwgMHg0YywgMHg3ZSwgMHg1MCwgMHg4YywgMHhlZSwgMHgyYSwgMHg5YiwgMHg3OCwgMHgzYSwKKwkweDQ2LCAweGExLCAweDc4LCAweGNmLCAweDFmLCAweGQ0LCAweGYxLCAweDAzLCAweDYwLCAweDEyLCAweGQzLCAweGY3LAorCTB4NjcsIDB4NWQsIDB4Y2UsIDB4ZDcsIDB4OGQsIDB4ZjksIDB4MzYsIDB4Y2MsIDB4N2QsIDB4ZDAsIDB4ZmYsIDB4YTcsCisJMHhiNSwgMHg3ZSwgMHgyZSwgMHgyYiwgMHhkOCwgMHhjMSwgMHhlMCwgMHhlZiwgMHg5OCwgMHg4YywgMHgxNSwgMHhhMSwKKwkweGUzLCAweDE1LCAweGYzLCAweDRjLCAweDg5LCAweDE1LCAweGFjLCAweGM0LCAweDJjLCAweDY0LCAweGM3LCAweDBjLAorCTB4ZTQsIDB4Y2QsIDB4MjksIDB4MWQsIDB4NjcsIDB4ZWQsIDB4ZDUsIDB4YjIsIDB4NjcsIDB4OGUsIDB4ZTUsIDB4OWMsCisJMHhhNCwgMHgyYiwgMHg2ZSwgMHg4ZiwgMHgzZSwgMHhiZiwgMHhjZCwgMHgxYiwgMHgyZiwgMHgyNiwgMHg4MiwgMHgzYiwKKwkweDA3LCAweDFmLCAweGU3LCAweDk0LCAweGI0LCAweGMxLCAweDFlLCAweGNhLCAweGFlLCAweDRjLCAweDgxLCAweDI3LAorCTB4MTIsIDB4MzgsIDB4ZGIsIDB4NTYsIDB4Y2QsIDB4MGYsIDB4MGQsIDB4ZTgsIDB4ZWYsIDB4ODYsIDB4ZjYsIDB4MjksCisJMHgwNiwgMHhiMSwgMHg4YiwgMHg4NiwgMHhjOSwgMHg3NiwgMHhhNywgMHhkMCwgMHhhZiwgMHg1ZCwgMHgzMiwgMHg1NywKKwkweGRiLCAweGI0LCAweDVjLCAweDdkLCAweGI4LCAweDJlLCAweDBkLCAweDFjLCAweGYyLCAweDA0LCAweGNhLCAweDExLAorCTB4ZDQsIDB4MjUsIDB4YzMsIDB4YjIsIDB4ODEsIDB4ZjIsIDB4MzQsIDB4Y2EsIDB4MmQsIDB4NzgsIDB4YjIsIDB4Y2QsCisJMHg2MSwgMHhlMCwgMHgwYSwgMHgzYywgMHg1ZiwgMHhjMywgMHg3OCwgMHgyMywgMHg1OCwgMHg3MywgMHhjZSwgMHg5NCwKKwkweDhmLCAweDRlLCAweDUwLCAweDk3LCAweDM4LCAweDA2LCAweDczLCAweDkxLCAweDY3LCAweDZkLCAweDNjLCAweDZiLAorCTB4NDUsIDB4OTUsIDB4NWQsIDB4NjAsIDB4MTksIDB4Y2YsIDB4NzIsIDB4ZjAsIDB4ZmQsIDB4MjEsIDB4OTksIDB4ODQsCisJMHgzZSwgMHg5OSwgMHg2YiwgMHg4MSwgMHg0YywgMHhmYSwgMHg2OCwgMHg1YiwgMHgyNiwgMHhiMSwgMHhhZSwgMHg1ZCwKKwkweGM2LCAweGFlLCAweDkyLCAweGQ3LCAweDRkLCAweGQwLCAweDViLCAweGE3LCAweDY0LCAweGFmLCAweGM1LCAweDM0LAorCTB4MWUsIDB4YWQsIDB4ODAsIDB4MTYsIDB4YWYsIDB4ODMsIDB4YWUsIDB4OTYsIDB4NDEsIDB4NTMsIDB4OTksIDB4YTIsCisJMHgzNSwgMHgzYSwgMHhhZCwgMHg5MiwgMHhkYSwgMHgyZiwgMHhmMCwgMHgzOCwgMHhlOCwgMHhiNSwgMHhlMywgMHgwYSwKKwkweGIxLCAweDI4LCAweDc5LCAweGQ5LCAweDAxLCAweGVkLCAweDg5LCAweGRmLCAweDYxLCAweGRiLCAweDkzLCAweDhlLAorCTB4YjIsIDB4NDEsIDB4ODMsIDB4YTAsIDB4Y2IsIDB4NjIsIDB4YzAsIDB4ZDMsIDB4ZWYsIDB4MjksIDB4MmQsIDB4NTcsCisJMHg0NywgMHhlZiwgMHg0OCwgMHgyYSwgMHg3ZCwgMHg0NywgMHgyYywgMHhjOCwgMHgwMiwgMHhjYiwgMHhmZCwgMHg1MCwKKwkweDVjLCAweDhjLCAweDc5LCAweDVjLCAweDVlLCAweGM3LCAweDNjLCAweDA2LCAweGY4LCAweGZiLCAweGM4LCAweDkwLAorCTB4ZTYsIDB4ZWYsIDB4NTEsIDB4ODksIDB4ZWMsIDB4ZTYsIDB4NzEsIDB4ZDAsIDB4MWIsIDB4NjQsIDB4NTAsIDB4YzAsCisJMHhkMywgMHhlOSwgMHg5MCwgMHg0NiwgMHg5ZiwgMHgwNiwgMHhmZiwgMHg1YSwgMHhiMCwgMHhjYSwgMHg5MiwgMHgzMiwKKwkweDBmLCAweGZlLCAweGJmLCAweDhlLCAweGVmLCAweGI3LCAweGVhLCAweDlmLCAweGFhLCAweGI5LCAweDA1LCAweDE1LAorCTB4ZTYsIDB4YjIsIDB4N2MsIDB4MWIsIDB4MzgsIDB4ZjksIDB4ZjcsIDB4MzgsIDB4YmIsIDB4MmUsIDB4OGQsIDB4ZGQsCisJMHgwNywgMHg0NiwgMHgxOCwgMHg0YiwgMHhmYiwgMHhiNywgMHhiYSwgMHg2YywgMHgxZiwgMHg5NSwgMHhjZCwgMHhlMSwKKwkweGUzLCAweDI4LCAweGVmLCAweGMzLCAweGQzLCAweGMwLCAweDM5LCAweDQ0LCAweDc1LCAweDJjLCAweDdjLCAweGQ5LAorCTB4MWIsIDB4MzYsIDB4MGEsIDB4M2EsIDB4ZWYsIDB4ZTAsIDB4OTgsIDB4Y2UsIDB4Y2YsIDB4MzcsIDB4ZWMsIDB4MDMsCisJMHhmOCwgMHg0ZSwgMHhiZiwgMHgwYywgMHhmNywgMHgwNiwgMHhjYywgMHhhNCwgMHgxMiwgMHgzYSwgMHhjNywgMHhiNCwKKwkweDAyLCAweDJjLCAweGIxLCAweDgyLCAweGYxLCAweGRlLCAweGE3LCAweDVmLCAweGFmLCAweDA2LCAweDFlLCAweDFlLAorCTB4ZmUsIDB4YTcsIDB4OWYsIDB4OGUsIDB4MzEsIDB4MjcsIDB4N2QsIDB4MzMsIDB4MTEsIDB4ZTgsIDB4YmYsIDB4Y2YsCisJMHhmYywgMHg0ZCwgMHg3YiwgMHg2ZSwgMHhkNCwgMHhjMCwgMHhjYiwgMHg2ZCwgMHgzMywgMHg4NiwgMHhiNiwgMHhkMCwKKwkweDY1LCAweGQwLCAweDQ1LCAweDY1LCAweDRkLCAweGJmLCAweDZjLCAweDE3LCAweGY0LCAweDJkLCAweGQ0LCAweDUyLAorCTB4ZTYsIDB4MDcsIDB4MTIsIDB4ZjQsIDB4OWQsIDB4YjcsIDB4YTksIDB4NzcsIDB4ZGEsIDB4MjEsIDB4NWYsIDB4OTIsCisJMHgxYSwgMHg1NywgMHhiZSwgMHg2ZiwgMHhlNywgMHgyMSwgMHgxNSwgMHhhYywgMHhlNCwgMHgyNCwgMHg2OCwgMHhiNCwKKwkweDRkLCAweDJjLCAweDY3LCAweDVjLCAweDFlLCAweGNjLCAweDNiLCAweGFiLCAweGZiLCAweGIyLCAweDZkLCAweGIzLAorCTB4NmYsIDB4NzMsIDB4NWUsIDB4YWUsIDB4OWYsIDB4N2IsIDB4ZTEsIDB4MWUsIDB4ZTgsIDB4YTcsIDB4MzYsIDB4MzUsCisJMHg4ZCwgMHgzNiwgMHg2YSwgMHhlZCwgMHhmZCwgMHgwMSwgMHg4ZCwgMHgzNiwgMHhmNywgMHgxMSwgMHhmYiwgMHgzZiwKKwkweGZiLCAweDIwLCAweDlkLCAweDBjLCAweDFiLCAweDQxLCAweDBlLCAweDA2LCAweDllLCAweDM1LCAweDllLCAweGU3LAorCTB4YTcsIDB4YzAsIDB4ZjcsIDB4M2IsIDB4ZTksIDB4YTcsIDB4ZTksIDB4NjcsIDB4MGMsIDB4ZTgsIDB4ZTcsIDB4OTEsCisJMHg2ZCwgMHhmYSwgMHgyMSwgMHhkZCwgMHg3NCwgMHhjYSwgMHhkOCwgMHgzNSwgMHg1YiwgMHgyNiwgMHg4YSwgMHhmYSwKKwkweGJlLCAweDgxLCAweDM1LCAweGU5LCAweDNmLCAweDNhLCAweDBlLCAweGJhLCAweDIxLCAweGFkLCAweDkzLCAweGI3LAorCTB4NGMsIDB4MjksIDB4ODMsIDB4OGUsIDB4Y2EsIDB4OTAsIDB4NGYsIDB4NjUsIDB4ZDAsIDB4MTQsIDB4MzEsIDB4NTAsCisJMHgxOSwgMHhmMiwgMHhhZCwgMHg1YywgMHhiNywgMHg5YywgMHgyYSwgMHhmNiwgMHg0YywgMHg5ZCwgMHhiZCwgMHgwMiwKKwkweDNhLCAweGJhLCAweDVlLCAweGU3LCAweGZkLCAweGViLCAweDM1LCAweDliLCAweGQ0LCAweDgzLCAweGI3LCAweGI2LAorCTB4ZWYsIDB4ZmUsIDB4ZWYsIDB4YjgsIDB4ZmIsIDB4NDMsIDB4NzIsIDB4MDMsIDB4NzYsIDB4Y2IsIDB4OWIsIDB4YTUsCisJMHg2MSwgMHhjOCwgMHgyNCwgMHgyMSwgMHg1ZSwgMHgwNCwgMHg2ZCwgMHg4YywgMHhjYSwgMHg2YSwgMHhlOSwgMHhhNCwKKwkweGFjLCAweDQxLCAweDNmLCAweGFkLCAweDJmLCAweDBkLCAweDAwLCAweDRmLCAweDQzLCAweDhlLCAweGJlLCAweDcyLAorCTB4NDQsIDB4ZGUsIDB4NTgsIDB4NTIsIDB4MzIsIDB4NjMsIDB4NDMsIDB4YmYsIDB4MmMsIDB4ZDMsIDB4MDcsIDB4MGYsCisJMHg3YSwgMHgyZSwgMHg3NywgMHhlYSwgMHg5OCwgMHhmZCwgMHg1OCwgMHgzNSwgMHhmMCwgMHhjNSwgMHg4ZiwgMHg1NywKKwkweGJiLCAweDY0LCAweGEyLCAweDZhLCAweGNhLCAweDYzLCAweGQ1LCAweDFlLCAweDc5LCAweGEyLCAweDFhLCAweDkzLAorCTB4ZDMsIDB4YjUsIDB4ODQsIDB4N2MsIDB4YTMsIDB4N2EsIDB4NTAsIDB4NGUsIDB4NTUsIDB4MGYsIDB4YzksIDB4OTMsCisJMHhiNSwgMHhhNCwgMHg3YywgMHgxMywgMHg3NiwgMHg2MSwgMHhhZSwgMHhlNiwgMHhjOCwgMHg2NCwgMHg2ZCwgMHg1OCwKKwkweDFlLCAweGFmLCAweGQxLCAweGM3LCAweDhlLCAweGY5LCAweGYwLCAweGNiLCAweDZlLCAweGZiLCAweDJlLCAweGI4LAorCTB4YWUsIDB4MGUsIDB4YWMsIDB4Y2IsIDB4NTEsIDB4ZTMsIDB4M2EsIDB4NjYsIDB4MjksIDB4YjksIDB4YzAsIDB4ZmYsCisJMHgyMSwgMHg3MiwgMHgwZSwgMHg3ZCwgMHgyZiwgMHhiZSwgMHhhMiwgMHhhNCwgMHhhMiwgMHhlNywgMHg2ZiwgMHhmZSwKKwkweGRmLCAweDQ4LCAweDU0LCAweGRiLCAweDQ2LCAweGU3LCAweGNhLCAweDA3LCAweGQxLCAweGM2LCAweGE2LCAweDRkLAorCTB4MTIsIDB4ZmEsIDB4NDEsIDB4OWEsIDB4ZmUsIDB4ZmYsIDB4YTYsIDB4ZWQsIDB4NjUsIDB4NjgsIDB4MWYsIDB4ZjYsCisJMHgyZCwgMHhkYSwgMHg1ZSwgMHhmYSwgMHhlYywgMHgyOSwgMHgzZiwgMHg2OCwgMHhlNywgMHhkMCwgMHhkNiwgMHhkYSwKKwkweDE5LCAweGU3LCAweDY4LCAweGNlLCAweDdiLCAweDMxLCAweGY3LCAweGYwLCAweGZmLCAweGE3LCAweDA0LCAweGYxLAorCTB4YWEsIDB4YjMsIDB4YjUsIDB4ODMsIDB4ZmMsIDB4M2YsIDB4MTUsIDB4YWMsIDB4ZTUsIDB4OGIsIDB4ZjMsIDB4YzUsCisJMHgyNywgMHg0YSwgMHg2MywgMHhlYSwgMHhiMSwgMHgxMiwgMHgxMSwgMHg4ZCwgMHgyZiwgMHgxNywgMHhiNywgMHg3MywKKwkweGYyLCAweGJlLCAweDJlLCAweGNiLCAweDZlLCAweDU0LCAweGFmLCAweDIxLCAweGYwLCAweGRiLCAweGE3LCAweDc1LAorCTB4N2UsIDB4ZGUsIDB4ZDgsIDB4MTAsIDB4ZTksIDB4OGYsIDB4NzEsIDB4YjgsIDB4YWUsIDB4MzAsIDB4YjYsIDB4MDAsCisJMHg2YywgMHhlYiwgMHg5YSwgMHg3MiwgMHhhOSwgMHgxYSwgMHhmOCwgMHhhZiwgMHhlNiwgMHgzNCwgMHhiZCwgMHhiYywKKwkweDA1LCAweDlhLCAweDYzLCAweGZjLCAweDIxLCAweDc4LCAweGU2LCAweGNiLCAweDQxLCAweGRmLCAweGVjLCAweDkwLAorCTB4NDMsIDB4N2IsIDB4MWMsIDB4ZmIsIDB4MzUsIDB4N2EsIDB4MzgsIDB4MTcsIDB4ZmYsIDB4NGYsIDB4MDcsIDB4ZTUsCisJMHg3MCwgMHhiZCwgMHhjYywgMHgyZiwgMHhiNiwgMHgzNSwgMHgyZCwgMHgwNiwgMHgzMSwgMHg1ZSwgMHg0NywgMHg5ZSwKKwkweGMzLCAweDVkLCAweDU0LCAweDRjLCAweGFlLCAweGJmLCAweDQzLCAweDJhLCAweDBlLCAweDZkLCAweDViLCAweGNhLAorCTB4ZWYsIDB4MjEsIDB4MjksIDB4NjMsIDB4OWUsIDB4OGEsIDB4ZDMsIDB4ZjQsIDB4OGQsIDB4MDUsIDB4NzIsIDB4YjYsCisJMHg2MiwgMHgzZSwgMHg5OCwgMHg3NywgMHhiYSwgMHhiYywgMHgxZiwgMHhlZiwgMHhhOCwgMHg3MywgMHg4MCwgMHg5OSwKKwkweGE2LCAweGY4LCAweDdlLCAweDExLCAweDY1LCAweGZhLCAweDQ2LCAweGU2LCAweGYwLCAweDRjLCAweDg0LCAweDc1LAorCTB4YWYsIDB4ZjUsIDB4NmIsIDB4YWMsIDB4N2UsIDB4ZjIsIDB4NDEsIDB4YmYsIDB4OTksIDB4YjIsIDB4OTUsIDB4Y2YsCisJMHg0NCwgMHhiNiwgMHg5NCwgMHhmMSwgMHg4YiwgMHhmNSwgMHg3ZSwgMHhjYSwgMHhkYywgMHhmZCwgMHgzNiwgMHg3ZiwKKwkweDUxLCAweGY5LCAweDhiLCAweGE5LCAweDdkLCAweDBhLCAweGUxLCAweGI3LCAweDNkLCAweGYyLCAweDk0LCAweGM5LAorCTB4ZGMsIDB4ZjUsIDB4YjQsIDB4MWEsIDB4MmIsIDB4ZmQsIDB4MzQsIDB4Y2MsIDB4ZDMsIDB4ZGQsIDB4NTIsIDB4ZmIsCisJMHgyYiwgMHg2ZiwgMHhmNywgMHgwNywgMHg3OSwgMHhlZSwgMHgxYywgMHg3YiwgMHg2NywgMHg2ZSwgMHhmYiwgMHg0ZSwKKwkweDNhLCAweDYxLCAweDhlLCAweDdiLCAweDNiLCAweDcwLCAweGFiLCAweDU2LCAweDYyLCAweGUwLCAweDQxLCAweGM4LAorCTB4M2IsIDB4YmIsIDB4NDUsIDB4ZjMsIDB4NjMsIDB4YTEsIDB4ZjYsIDB4MmYsIDB4N2YsIDB4NDMsIDB4ZjMsIDB4NzMsCisJMHhkMywgMHhjNywgMHhmMCwgMHhkYiwgMHg3ZSwgMHhkYSwgMHhiNiwgMHg5NCwgMHgxYiwgMHg5NywgMHgwMiwgMHhiZiwKKwkweDkxLCAweGI2LCAweGExLCAweDIxLCAweDJiLCAweDUwLCAweDQ3LCAweDVlLCAweDA1LCAweDlmLCAweDZjLCAweGI3LAorCTB4ZTUsIDB4ZGYsIDB4N2YsIDB4MDEsIDB4OTksIDB4ZTcsIDB4ZDMsIDB4NDYsIDB4NDAsIDB4NjcsIDB4MDAsIDB4MDAsCisJMHgwMCB9Oworc3RhdGljIHUzMiBibngyX1JYUF9iMDlGd0RhdGFbKDB4MC80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA5RndSb2RhdGFbKDB4Mjc4LzQpICsgMV0gPSB7CisJMHgwODAwM2ZhNCwgMHgwODAwM2VhNCwgMHgwODAwM2Y0OCwgMHgwODAwM2Y2MCwgMHgwODAwM2Y3OCwgMHgwODAwM2Y5OCwKKwkweDA4MDAzZmE0LCAweDA4MDAzZmE0LCAweDA4MDAzZWFjLCAweDAwMDAwMDAwLCAweDA4MDA0OWQ0LCAweDA4MDA0YTBjLAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRhNDQsIDB4MDgwMDRjMDgsCisJMHgwODAwNGI1MCwgMHgwODAwNGI4OCwgMHgwODAwNGMwOCwgMHgwODAwNGFkOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0Yjg4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRiYzgsCisJMHgwODAwNGMwOCwgMHgwODAwNGJjOCwgMHgwODAwNGI1MCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGJjOCwKKwkweDA4MDA0YmM4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsIDB4MDgwMDRjMDgsCisJMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwgMHgwODAwNGMwOCwKKwkweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LCAweDA4MDA0YzA4LAorCTB4MDgwMDRhYjQsIDB4MDAwMDAwMDAsIDB4MDgwMDYwMmMsIDB4MDgwMDYwNDQsIDB4MDgwMDYwNDQsIDB4MDgwMDYwNDQsCisJMHgwODAwNjAyYywgMHgwODAwNjA0NCwgMHgwODAwNjA0NCwgMHgwODAwNjA0NCwgMHgwODAwNjAyYywgMHgwODAwNjA0NCwKKwkweDA4MDA2MDQ0LCAweDA4MDA2MDQ0LCAweDA4MDA2MDJjLCAweDA4MDA2MDQ0LCAweDA4MDA2MDQ0LCAweDA4MDA2MDQ0LAorCTB4MDgwMDYwMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA5RndCc3NbKDB4MTNkYy80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9SWFBfYjA5RndTYnNzWygweDJjLzQpICsgMV0gPSB7IDB4MCB9OworCitzdGF0aWMgc3RydWN0IGZ3X2luZm8gYm54Ml9yeHBfZndfMDkgPSB7CisJLnZlcl9tYWpvcgkJCT0gMHgxLAorCS52ZXJfbWlub3IJCQk9IDB4MCwKKwkudmVyX2ZpeAkJCT0gMHgwLAorCisJLnN0YXJ0X2FkZHIJCQk9IDB4MDgwMDMxODQsCisKKwkudGV4dF9hZGRyCQkJPSAweDA4MDAwMDAwLAorCS50ZXh0X2xlbgkJCT0gMHg2NzNjLAorCS50ZXh0X2luZGV4CQkJPSAweDAsCisJLmd6X3RleHQJCQk9IGJueDJfUlhQX2IwOUZ3VGV4dCwKKwkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX1JYUF9iMDlGd1RleHQpLAorCisJLmRhdGFfYWRkcgkJCT0gMHgwODAwNjllMCwKKwkuZGF0YV9sZW4JCQk9IDB4MCwKKwkuZGF0YV9pbmRleAkJCT0gMHgwLAorCS5kYXRhCQkJCT0gYm54Ml9SWFBfYjA5RndEYXRhLAorCisJLnNic3NfYWRkcgkJCT0gMHgwODAwNjllMCwKKwkuc2Jzc19sZW4JCQk9IDB4MmMsCisJLnNic3NfaW5kZXgJCQk9IDB4MCwKKwkuc2JzcwkJCQk9IGJueDJfUlhQX2IwOUZ3U2JzcywKKworCS5ic3NfYWRkcgkJCT0gMHgwODAwNmExMCwKKwkuYnNzX2xlbgkJCT0gMHgxM2RjLAorCS5ic3NfaW5kZXgJCQk9IDB4MCwKKwkuYnNzCQkJCT0gYm54Ml9SWFBfYjA5RndCc3MsCisKKwkucm9kYXRhX2FkZHIJCQk9IDB4MDgwMDY3NDAsCisJLnJvZGF0YV9sZW4JCQk9IDB4Mjc4LAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9SWFBfYjA5RndSb2RhdGEsCit9OworCitzdGF0aWMgdTggYm54Ml9UUEFUX2IwOUZ3VGV4dFtdID0geworCTB4MWYsIDB4OGIsIDB4MDgsIDB4MDgsIDB4ZGIsIDB4ZmQsIDB4MmYsIDB4NDUsIDB4MDAsIDB4MDMsIDB4NzQsIDB4NjUsCisJMHg3MywgMHg3NCwgMHgzMSwgMHgyZSwgMHg2MiwgMHg2OSwgMHg2ZSwgMHgwMCwgMHhjNSwgMHg1OCwgMHg1ZCwgMHg2YywKKwkweDFjLCAweDU3LCAweDE1LCAweDNlLCAweGYzLCAweGJiLCAweDEzLCAweDc3LCAweGVkLCAweGJkLCAweDQ5LCAweDk3LAorCTB4NmEsIDB4MTMsIDB4YjksIDB4NzQsIDB4YzYsIDB4MWUsIDB4M2IsIDB4OGIsIDB4MWMsIDB4MzUsIDB4OTMsIDB4YjAsCisJMHgyNCwgMHgxNiwgMHg1YSwgMHhkMSwgMHhjOSwgMHhjYywgMHhhZSwgMHg2YiwgMHhlNSwgMHgyOSwgMHg4NiwgMHhiYywKKwkweGYxLCAweGIyLCAweGFjLCAweGVkLCAweDQ2LCAweDU0LCAweDQ4LCAweDRkLCAweDUxLCAweDg0LCAweDIyLCAweDgxLAorCTB4OTQsIDB4NjUsIDB4NzYsIDB4NTMsIDB4NDAsIDB4NWEsIDB4NjUsIDB4YzEsIDB4YTAsIDB4MDQsIDB4MjEsIDB4ODQsCisJMHgyMiwgMHg5YiwgMHg2NiwgMHg5MSwgMHg1OCwgMHgzYywgMHg0ZCwgMHhlOSwgMHg2YiwgMHg5NCwgMHhiYywgMHg5MCwKKwkweDk2LCAweDE3LCAweDllLCAweDRiLCAweDllLCAweGFjLCAweDAyLCAweDEyLCAweDBmLCAweGE4LCAweDhhLCAweDc4LAorCTB4NDAsIDB4MTUsIDB4MGQsIDB4MWUsIDB4YmUsIDB4MzMsIDB4M2YsIDB4OWIsIDB4NWQsIDB4ZDcsIDB4MjksIDB4NzksCisJMHhhOCwgMHg4NCwgMHhhNSwgMHhmMSwgMHhjYywgMHhmZCwgMHgzOSwgMHhmNywgMHhlNywgMHg3YywgMHhkZiwgMHg3NywKKwkweGVlLCAweGI5LCAweDViLCAweDkyLCAweDY5LCAweDgyLCAweGQyLCAweGJmLCAweDQ5LCAweDNjLCAweDk3LCAweGJlLAorCTB4NzEsIDB4ZjEsIDB4ZDIsIDB4ZTIsIDB4OGIsIDB4MjcsIDB4NGQsIDB4M2EsIDB4NzEsIDB4ZTIsIDB4NDUsIDB4ZTksCisJMHgxOSwgMHg0MywgMHhhNiwgMHhjZiwgMHhlMCwgMHg0ZiwgMHgyMSwgMHgxMiwgMHhkOSwgMHhmOCwgMHhmYywgMHg5MCwKKwkweDIxLCAweDU3LCAweDZmLCAweDRlLCAweDdiLCAweDM2LCAweDE5LCAweDRhLCAweGQ1LCAweDc5LCAweDYxLCAweGQ1LAorCTB4MjYsIDB4NzIsIDB4MDcsIDB4MGIsIDB4YTYsIDB4NGYsIDB4ZmYsIDB4ODksIDB4NWEsIDB4NDUsIDB4OTUsIDB4YjgsCisJMHhmZSwgMHhmOSwgMHhlYSwgMHhhMywgMHhlMywgMHg3NywgMHg0ZSwgMHg1YiwgMHgwZiwgMHg2ZiwgMHgyYSwgMHg2NCwKKwkweDg4LCAweDZhLCAweGMzLCAweDEwLCAweGYzLCAweDY0LCAweDRjLCAweGMzLCAweGU2LCAweDk3LCAweDQ3LCAweDU3LAorCTB4MzQsIDB4OWEsIDB4Y2EsIDB4YzYsIDB4MTIsIDB4MTQsIDB4ZjQsIDB4MGMsIDB4YWEsIDB4NzcsIDB4MzEsIDB4OGUsCisJMHg3ZCwgMHg1OSwgMHhmMiwgMHg0MywgMHg1NSwgMHhmMiwgMHg2ZiwgMHgxOCwgMHgyNCwgMHg1NywgMHg1ZCwgMHhjOSwKKwkweDBiLCAweDZkLCAweGI0LCAweDQ5LCAweGU0LCAweDM5LCAweDM5LCAweDcyLCAweDQ1LCAweDE0LCAweDdkLCAweGQzLAorCTB4OTEsIDB4NDksIDB4YjYsIDB4NzcsIDB4YTMsIDB4ZDksIDB4YjksIDB4MjUsIDB4YzksIDB4ZWIsIDB4MmYsIDB4NGIsCisJMHg3ZSwgMHhkZiwgMHhlMywgMHg3ZCwgMHg2MywgMHgxZCwgMHg0YiwgMHg5MiwgMHhkYiwgMHhlNywgMHg3NywgMHhkNSwKKwkweGYwLCAweGJiLCAweDUzLCAweGQ0LCAweDI4LCAweDUyLCAweDQxLCAweGI2LCAweGQ5LCAweGQ2LCAweDI0LCAweGRmLAorCTB4NTksIDB4MjgsIDB4MjksIDB4MzQsIDB4OGIsIDB4ZTcsIDB4MDAsIDB4YWQsIDB4M2IsIDB4OTQsIDB4ZjcsIDB4MWMsCisJMHg1MiwgMHgxNSwgMHg1YiwgMHgyNiwgMHhiZiwgMHgyOCwgMHhkMSwgMHhhZiwgMHgyYiwgMHgxYSwgMHg5ZSwgMHhiMywKKwkweDUyLCAweGFkLCAweGJmLCAweDk2LCAweDhlLCAweDUzLCAweGE0LCAweDM2LCAweGQ2LCAweGQyLCAweDJjLCAweGYyLAorCTB4ZGEsIDB4MTIsIDB4N2IsIDB4Y2YsIDB4NTksIDB4MTAsIDB4MzIsIDB4Y2QsIDB4ZTIsIDB4OTksIDB4YzQsIDB4NzcsCisJMHgxMywgMHhmZCwgMHgzNCwgMHhmMiwgMHgyYSwgMHg3YiwgMHhkYiwgMHgwZSwgMHhlMCwgMHgxYiwgMHhlYiwgMHhjNCwKKwkweDU4LCAweDVlLCAweGJjLCAweDBlLCAweDEzLCAweGViLCAweGIwLCAweGE5LCAweGQzLCAweDViLCAweGM2LCAweDNlLAorCTB4ZTYsIDB4NGEsIDB4NGQsIDB4ZDIsIDB4YTksIDB4MTMsIDB4YWYsIDB4N2QsIDB4OTIsIDB4MDIsIDB4YTEsIDB4NTAsCisJMHg3MCwgMHg0YywgMHgyMywgMHhmNywgMHg5YywgMHg4YSwgMHhmMiwgMHgyMSwgMHg2YSwgMHgwOSwgMHgwOSwgMHg3ZCwKKwkweDNhLCAweDI5LCAweDdlLCAweDM5LCAweGI0LCAweGViLCAweGE4LCAweDJmLCAweDUwLCAweDUwLCAweDNjLCAweDI4LAorCTB4YzksIDB4ZDUsIDB4ZWYsIDB4YTEsIDB4N2UsIDB4NGUsIDB4MzQsIDB4ZTksIDB4YmIsIDB4NzgsIDB4NGIsIDB4MjgsCisJMHgxZiwgMHhlNCwgMHhmMSwgMHg1MCwgMHg5NiwgMHg0OCwgMHhiMSwgMHg0OSwgMHg3OCwgMHhhMSwgMHg0OSwgMHhlZCwKKwkweDMwLCAweGIzLCAweGU1LCAweGZhLCAweGE0LCAweGFlLCAweDE1LCAweGVlLCAweGM1LCAweDBlLCAweGZkLCAweDdhLAorCTB4NzUsIDB4NmEsIDB4MDgsIDB4NmEsIDB4YTksIDB4NTUsIDB4ZjQsIDB4ZTksIDB4ZDksIDB4YTIsIDB4MDYsIDB4OWMsCisJMHhkYywgMHgxOCwgMHhjZiwgMHg5NywgMHhiOCwgMHg5ZSwgMHhmZiwgMHg1MCwgMHg2ZiwgMHg5MiwgMHg1MiwgMHhiNSwKKwkweDg1LCAweDRmLCAweDVmLCAweGE2LCAweGE0LCAweDhkLCAweGY3LCAweDI5LCAweDYzLCAweDZmLCAweGE3LCAweGQyLAorCTB4NzIsIDB4NTEsIDB4NzgsIDB4MzcsIDB4YmUsIDB4NDgsIDB4NmUsIDB4ZWMsIDB4MWYsIDB4MDMsIDB4ZGYsIDB4MDIsCisJMHg3YiwgMHhkNCwgMHg4MSwgMHg3NSwgMHhlMCwgMHhjYSwgMHhkNCwgMHgyYSwgMHgxOSwgMHg2NCwgMHgyZCwgMHhhZSwKKwkweGExLCAweGU1LCAweDZmLCAweDVkLCAweDA1LCAweDdlLCAweDY3LCAweGRjLCAweGQ0LCAweGQ0LCAweDhlLCAweDcxLAorCTB4ZmUsIDB4MjMsIDB4ZDYsIDB4ZDksIDB4MTIsIDB4MDYsIDB4ZjAsIDB4NmUsIDB4OWMsIDB4OGYsIDB4YTIsIDB4MzcsCisJMHg5ZCwgMHgyOCwgMHhkMiwgMHhhYiwgMHg3NiwgMHhmOSwgMHgxNiwgMHgyZCwgMHg5NCwgMHgzNCwgMHg5YSwgMHgxNywKKwkweDc4LCAweGMzLCAweDhmLCAweDM2LCAweDdjLCAweGE1LCAweDY1LCAweGViLCAweGM5LCAweDc4LCAweDg2LCAweGJmLAorCTB4Y2IsIDB4MTIsIDB4OTYsIDB4NDIsIDB4MWYsIDB4NzQsIDB4ZGYsIDB4NjMsIDB4N2YsIDB4OTQsIDB4OTcsIDB4NjIsCisJMHg5YiwgMHgyOCwgMHhkYSwgMHg1YywgMHhmYywgMHgzNCwgMHg5YiwgMHhlZiwgMHhhNywgMHgzNiwgMHg1MSwgMHg1NCwKKwkweGFmLCAweGYwLCAweGJjLCAweDE2LCAweGY2LCAweGNjLCAweDVjLCAweDI1LCAweGFhLCAweDBmLCAweDFjLCAweGEzLAorCTB4ZDksIDB4YzUsIDB4ZmEsIDB4NmMsIDB4YmMsIDB4MDcsIDB4MjUsIDB4ZWMsIDB4YzEsIDB4MmEsIDB4OWIsIDB4OTIsCisJMHg0MSwgMHg4MSwgMHgxZCwgMHhiZCwgMHgwMCwgMHg3ZSwgMHhiOCwgMHhiZSwgMHg2ZCwgMHhiZCwgMHhlZiwgMHgyYiwKKwkweDA1LCAweGRhLCAweDcyLCAweGYyLCAweGQ0LCAweDA5LCAweDRiLCAweDE0LCAweDg0LCAweDFkLCAweGYyLCAweDQyLAorCTB4MTksIDB4NzMsIDB4MTQsIDB4NjgsIDB4ZDMsIDB4N2UsIDB4MTgsIDB4ZDUsIDB4MWQsIDB4MDcsIDB4N2UsIDB4MjEsCisJMHhiNiwgMHgyYiwgMHhkNSwgMHg2OSwgMHgxYSwgMHhlZCwgMHgwYiwgMHg2MiwgMHg4ZCwgMHgxYywgMHg2MCwgMHgyMSwKKwkweGMzLCAweDM3LCAweGIzLCAweGYxLCAweDc3LCAweDEwLCAweDNhLCAweDY4LCAweGE3LCAweDk2LCAweDVjLCAweGIxLAorCTB4NDQsIDB4NDAsIDB4NTYsIDB4YzksIDB4NTMsIDB4NDgsIDB4YzgsIDB4NTUsIDB4ODEsIDB4M2UsIDB4MmQsIDB4YWEsCisJMHg4NSwgMHgwNiwgMHhlZCwgMHgyOCwgMHg5NywgMHg2MywgMHg3ZSwgMHhiNywgMHg3YiwgMHgzYiwgMHhkMSwgMHg5ZCwKKwkweGEzLCAweDI1LCAweGJhLCAweDFiLCAweDE2LCAweGU5LCAweDc2LCAweDQ4LCAweDcyLCAweGQzLCAweDAxLCAweDM3LAorCTB4OGEsIDB4ODIsIDB4ZGUsIDB4MGEsIDB4NDcsIDB4ZjcsIDB4ZjIsIDB4MWIsIDB4ZWMsIDB4MjUsIDB4MzgsIDB4YTIsCisJMHg0MCwgMHg4MywgMHhhYiwgMHhjZSwgMHgzZCwgMHgzMCwgMHhjOCwgMHgwMiwgMHg0NiwgMHgyZCwgMHhlYywgMHgzZCwKKwkweDdiLCAweGYzLCAweGJlLCAweDc2LCAweGE2LCAweDU3LCAweDZkLCAweGViLCAweDg3LCAweDNlLCAweGEzLCAweDc2LAorCTB4NGQsIDB4NDMsIDB4ZWQsIDB4NWUsIDB4N2YsIDB4MGMsIDB4MzAsIDB4ODYsIDB4YTAsIDB4YWIsIDB4ZDAsIDB4OTMsCisJMHgwYywgMHhiZiwgMHhjYywgMHg2YywgMHgxYiwgMHhkNCwgMHhlZiwgMHhlNiwgMHhjOCwgMHhkYywgMHg1NCwgMHhhOSwKKwkweGQ5LCAweDJiLCAweDkyLCAweDMzLCAweDZmLCAweDk5LCAweDI0LCAweGNiLCAweDQ1LCAweDk5LCAweDU0LCAweDlhLAorCTB4ZDksIDB4OGMsIDB4NjgsIDB4MDksIDB4ZWIsIDB4YjgsIDB4NmYsIDB4ZmYsIDB4NDgsIDB4YTcsIDB4YTksIDB4YzAsCisJMHhkMSwgMHg4OSwgMHhmYiwgMHgxOCwgMHgzNCwgMHg3MywgMHhjYiwgMHg5MCwgMHhmYywgMHgxZSwgMHhlZiwgMHg4MywKKwkweDdkLCAweDZlLCAweGE0LCAweDNlLCAweDU3LCAweDI1LCAweGVmLCAweDQ2LCAweDhlLCAweDY2LCAweDM3LCAweGZlLAorCTB4MTEsIDB4NzksIDB4MzYsIDB4N2MsIDB4MGQsIDB4OWUsIDB4YWYsIDB4NTYsIDB4YmUsIDB4YTAsIDB4ZDAsIDB4MDQsCisJMHhlYSwgMHgzNiwgMHhiOSwgMHhlZCwgMHg2MSwgMHg1YSwgMHhjZiwgMHg2MywgMHg0NCwgMHg5MSwgMHhlNywgMHgzYywKKwkweDRiLCAweDFlLCAweGYzLCAweGZmLCAweDNjLCAweGRiLCAweGU0LCAweDY4LCAweDY2LCAweDgzLCAweDc1LCAweDgzLAorCTB4ZjcsIDB4MjYsIDB4OTcsIDB4NzksIDB4NmQsIDB4MDcsIDB4YTgsIDB4ODksIDB4MWQsIDB4MzUsIDB4Y2IsIDB4NDUsCisJMHhmOCwgMHg0MSwgMHg4ZSwgMHgzNSwgMHhkMiwgMHhjNCwgMHg4ZSwgMHg2NSwgMHg3YiwgMHgwMiwgMHg2ZiwgMHg5ZSwKKwkweGVmLCAweGFjLCAweDkyLCAweGYwLCAweDlkLCAweGUzLCAweDQ2LCAweDllLCAweDdjLCAweGUwLCAweGFiLCAweDYyLAorCTB4M2QsIDB4NmIsIDB4MzQsIDB4NTcsIDB4NWEsIDB4OGYsIDB4ZGIsIDB4NTAsIDB4MzcsIDB4ZTAsIDB4MzYsIDB4YjEsCisJMHhhNywgMHgwZCwgMHhlNSwgMHg0MSwgMHhiNiwgMHgwNiwgMHg3MCwgMHhkYSwgMHg2ZSwgMHg2MywgMHgxNiwgMHgyZCwKKwkweGRlLCAweDZiLCAweGRkLCAweGUxLCAweGZlLCAweGRjLCAweGI3LCAweDU1LCAweGQ2LCAweGM4LCAweDJhLCAweDZmLAorCTB4NjIsIDB4ZjQsIDB4N2UsIDB4MTcsIDB4ZmIsIDB4YmQsIDB4Y2UsIDB4YjEsIDB4YzgsIDB4MzYsIDB4ZmYsIDB4NGEsCisJMHhkYywgMHg3ZiwgMHgxNiwgMHg3YiwgMHg5ZSwgMHg1YiwgMHg2YywgMHg3MywgMHhkYiwgMHg0MCwgMHgyMywgMHg3YiwKKwkweGEzLCAweDI1LCAweDU0LCAweGY4LCAweDVmLCAweDg2LCAweGYzLCAweGZkLCAweDFmLCAweGZmLCAweDJiLCAweGQyLAorCTB4YWEsIDB4ZTAsIDB4NzQsIDB4YTUsIDB4MDAsIDB4N2MsIDB4MmMsIDB4YjMsIDB4MGQsIDB4YmQsIDB4ZGIsIDB4MTgsCisJMHgzNywgMHg3MCwgMHgxNCwgMHhkOCwgMHgyNSwgMHgzOCwgMHg3MSwgMHhiZiwgMHhhNSwgMHg2ZSwgMHg0NCwgMHhlZCwKKwkweDc4LCAweGFlLCAweDJiLCAweDNjLCAweDE3LCAweDYyLCAweDkyLCAweGJkLCAweGY4LCAweDA3LCAweDcwLCAweGEzLAorCTB4NDksIDB4NzksIDB4OWEsIDB4ZGYsIDB4Y2UsIDB4ZDMsIDB4ODUsIDB4NDEsIDB4OWUsIDB4NjYsIDB4YWUsIDB4ZTksCisJMHhmMCwgMHg0MywgMHgxNCwgMHg3NSwgMHgyYSwgMHhhYywgMHg1MSwgMHhlMCwgMHg2ZCwgMHg3MywgMHgzZiwgMHhhYiwKKwkweGE0LCAweGM4LCAweGJjLCAweDBlLCAweGI0LCAweDZmLCAweDEzLCAweGFkLCAweDBkLCAweDc0LCAweGY4LCAweDRkLAorCTB4MWQsIDB4MTksIDB4NWIsIDB4YTYsIDB4OTcsIDB4N2YsIDB4NDYsIDB4ZjQsIDB4ZjIsIDB4ODAsIDB4NmQsIDB4NzksCisJMHhmYywgMHhjNCwgMHhhNiwgMHg4OSwgMHgzZCwgMHhjYiwgMHhjMCwgMHhmYywgMHhjMiwgMHg0MCwgMHg0NiwgMHhiYywKKwkweDQwLCAweDNjLCAweGVkLCAweDdiLCAweDg4LCAweDkzLCAweDM1LCAweDNjLCAweDRiLCAweDg4LCAweDlkLCAweDhjLAorCTB4MGQsIDB4YzcsIDB4OTEsIDB4NWQsIDB4ZTAsIDB4YjMsIDB4OGMsIDB4YjYsIDB4YjMsIDB4YTgsIDB4NGIsIDB4ZjQsCisJMHhhZSwgMHhkOCwgMHgzYSwgMHhkNSwgMHg5YywgMHg0OSwgMHg2YSwgMHg2NywgMHhiMSwgMHg0YSwgMHg3MCwgMHhhYywKKwkweDNhLCAweDA4LCAweDRlLCAweDFkLCAweDQwLCAweGZjLCAweGY5LCAweDlkLCAweDMyLCAweDFlLCAweGFiLCAweDEwLAorCTB4ZDMsIDB4OGEsIDB4ODcsIDB4MTEsIDB4OWIsIDB4ZmEsIDB4YTgsIDB4ZTcsIDB4ZjEsIDB4NmUsIDB4ZTEsIDB4N2QsCisJMHgwMCwgMHhlNSwgMHhjMywgMHhlOCwgMHgzYiwgMHgxYSwgMHhhNywgMHgzMiwgMHhiYiwgMHgyNywgMHhjNSwgMHgyOCwKKwkweGYwLCAweDZlLCAweGMzLCAweDQwLCAweDdmLCAweDEzLCAweGJhLCAweDYxLCAweDdmLCAweGU3LCAweDEwLCAweDNmLAorCTB4ZDgsIDB4ZTcsIDB4MzksIDB4ZjgsIDB4NTQsIDB4YzcsIDB4ZGMsIDB4ODIsIDB4NjYsIDB4YjcsIDB4YTksIDB4YTUsCisJMHhhNCwgMHhmMSwgMHhjYiwgMHgxZiwgMHhjNiwgMHhhZiwgMHg1MiwgMHhjYywgMHg4MywgMHgyMCwgMHgxNCwgMHhiMCwKKwkweDYxLCAweGZkLCAweDY2LCAweDdhLCAweDY1LCAweGVjLCAweGM4LCAweGY1LCAweGEwLCAweDY1LCAweDRmLCAweDg5LAorCTB4YTIsIDB4NTUsIDB4YTcsIDB4NDAsIDB4NGQsIDB4ZTAsIDB4ZWUsIDB4NDIsIDB4YzMsIDB4NGQsIDB4NjgsIDB4ZDgsCisJMHgxZiwgMHhkMSwgMHhiMCwgMHhmZiwgMHgzZiwgMHgzNSwgMHgwYywgMHg3ZCwgMHg0MiwgMHgyMywgMHhiNywgMHhjMSwKKwkweGE5LCAweGI3LCAweDdhLCAweGZiLCAweGU5LCAweDk5LCAweGI1LCAweGNjLCAweDlhLCAweDM2LCAweGU5LCAweGNlLAorCTB4ZDEsIDB4YTcsIDB4ZDUsIDB4NzQsIDB4NDksIDB4N2UsIDB4NGEsIDB4NGQsIDB4YjcsIDB4NTgsIDB4ZDMsIDB4MmEsCisJMHg2YiwgMHhiYSwgMHhiOCwgMHg1NywgMHhkMywgMHhkMywgMHgxOCwgMHgyMywgMHhkMSwgMHhlNiwgMHgxOSwgMHhiNSwKKwkweDQ4LCAweGRhLCAweDNjLCAweGYwLCAweGQ4LCAweGM4LCAweDkzLCAweDcyLCAweGVkLCAweDMxLCAweGVmLCAweDk4LAorCTB4Y2IsIDB4ZmUsIDB4MDAsIDB4ZmYsIDB4YjYsIDB4MzUsIDB4YjQsIDB4NDksIDB4ZTMsIDB4ZjUsIDB4ODgsIDB4ODEsCisJMHg2YSwgMHhkNSwgMHgyYSwgMHhhZCwgMHhjNSwgMHg3ZCwgMHg1NCwgMHhkMiwgMHhlMSwgMHhmZiwgMHhkNywgMHg4ZiwKKwkweDVhLCAweGE2LCAweDI5LCAweDhmLCAweDZhLCAweDFmLCAweGVhLCAweGRmLCAweDg4LCAweGFlLCAweDY4LCAweDU1LAorCTB4OWUsIDB4YTcsIDB4NjUsIDB4ODIsIDB4ZjMsIDB4ZTYsIDB4NGYsIDB4ODAsIDB4NTUsIDB4YmIsIDB4Y2IsIDB4N2MsCisJMHhiNywgMHg0NSwgMHgzZCwgMHhlNiwgMHgxOSwgMHhjYSwgMHhkMCwgMHg4NCwgMHgwNiwgMHhkZSwgMHhlNiwgMHhkMCwKKwkweDRmLCAweGRkLCAweDQ4LCAweDc0LCAweDc0LCAweDFiLCAweGUzLCAweDZlLCAweDc1LCAweDk5LCAweDY3LCAweDA2LAorCTB4ZTksIDB4ZDcsIDB4ZWQsIDB4ZDIsIDB4ODUsIDB4MzgsIDB4MDYsIDB4Y2YsIDB4OGEsIDB4MjUsIDB4NjIsIDB4MGQsCisJMHhmMiwgMHhiOSwgMHg4OCwgMHhmNiwgMHg0MSwgMHg4ZSwgMHg5NCwgMHg1OCwgMHhmNywgMHgxMywgMHhhOSwgMHhlZSwKKwkweDlmLCAweDg3LCAweGFmLCAweDI2LCAweDUwLCAweDY2LCAweGVkLCAweDFmLCAweDRlLCAweGI1LCAweDNmLCAweDg1LAorCTB4MzcsIDB4ZDcsIDB4YWQsIDB4YTgsIDB4MDksIDB4ODcsIDB4YzAsIDB4YzcsIDB4MGQsIDB4YzYsIDB4MzcsIDB4OGYsCisJMHg1OCwgMHhjNywgMHhmMywgMHhmZiwgMHgzMywgMHg1YSwgMHhiNSwgMHgxOSwgMHg2MywgMHhkYiwgMHhmYywgMHgwMSwKKwkweGNkLCAweDQxLCAweDdmLCAweGE4LCAweGRmLCAweGU2LCAweGJlLCAweDZjLCAweDkzLCAweGY1LCAweDE1LCAweDY5LAorCTB4ZGYsIDB4MGYsIDB4ZjcsIDB4ZjQsIDB4NDUsIDB4ZmQsIDB4MzYsIDB4ZjcsIDB4NjMsIDB4N2QsIDB4MWMsIDB4MjIsCisJMHhlNSwgMHgzYSwgMHg5ZiwgMHhkYiwgMHgxZSwgMHhlYiwgMHgwMywgMHg3NiwgMHgzNSwgMHhkNCwgMHg3MSwgMHg2ZSwKKwkweGMxLCAweGY2LCAweDdjLCAweDg2LCAweGYzLCAweDNhLCAweDM5LCAweGVmLCAweGUwLCAweDczLCAweDdlLCAweGNmLAorCTB4NzksIDB4M2UsIDB4ZDQsIDB4YzgsIDB4MTksIDB4ZjAsIDB4ZmUsIDB4M2IsIDB4ZWEsIDB4MjcsIDB4MzUsIDB4YjIsCisJMHgwMiwgMHg0ZCwgMHg1YywgMHg1NCwgMHgxMywgMHg4ZCwgMHhiYywgMHg4NiwgMHhmNywgMHgxOSwgMHg5NCwgMHg1NywKKwkweGY2LCAweDY4LCAweDI0LCAweGIzLCAweDdiLCAweGYyLCAweDM5LCAweDFlLCAweGY0LCAweDRhLCAweGYxLCAweDk5LAorCTB4Y2IsIDB4ZjMsIDB4MjksIDB4MWIsIDB4ZDQsIDB4ZDIsIDB4NTIsIDB4M2QsIDB4ZDQsIDB4ODcsIDB4N2EsIDB4OTgsCisJMHg0MCwgMHhjYywgMHhjOCwgMHhhNSwgMHg1YywgMHhjNywgMHhkYiwgMHhmZSwgMHg0OCwgMHhmMSwgMHgxZCwgMHg0YiwKKwkweGI0LCAweDg5LCAweGI1LCAweDMxLCAweDdhLCAweDllLCAweGZkLCAweGJmLCAweGY0LCAweDQxLCAweGUwLCAweDUxLAorCTB4M2MsIDB4MzcsIDB4NzIsIDB4MTEsIDB4M2UsIDB4MTcsIDB4YTIsIDB4ZTgsIDB4MTUsIDB4MDcsIDB4ZWQsIDB4NTksCisJMHg0ZSwgMHgxMiwgMHg2MywgMHg5ZiwgMHhjMywgMHhkOSwgMHhjYiwgMHg3OCwgMHgyMCwgMHgwZiwgMHhiNCwgMHg2NywKKwkweGExLCAweDA3LCAweDhlLCAweDA1LCAweGJiLCAweGQxLCAweDk2LCAweGVkLCAweGExLCAweGFlLCAweDA2LCAweGZmLAorCTB4MzMsIDB4MjYsIDB4Y2IsIDB4ZDIsIDB4NTIsIDB4ZGYsIDB4NjAsIDB4M2IsIDB4ZTgsIDB4NmQsIDB4YmYsIDB4NWMsCisJMHg0YywgMHg4NywgMHhhZSwgMHgxZSwgMHhlMywgMHhjNCwgMHgzYywgMHg2YSwgMHg4ZSwgMHhlMCwgMHhkNCwgMHg4OCwKKwkweDcxLCAweGRhLCAweDE5LCAweGUyLCAweGQ0LCAweDRjLCAweDcxLCAweDZhLCAweGM2LCAweDM4LCAweDNkLCAweDQ4LAorCTB4NzEsIDB4ZmEsIDB4ZjMsIDB4MTMsIDB4NzAsIDB4ZGEsIDB4NzksIDB4MGEsIDB4OWMsIDB4MGMsIDB4ZGEsIDB4YjIsCisJMHg0YiwgMHgzOCwgMHg2ZiwgMHhmNSwgMHgzOCwgMHg3NywgMHhiZCwgMHhlZiwgMHhlYywgMHg5NywgMHg3YiwgMHhiMSwKKwkweGRmLCAweGM3LCAweGIwLCAweDhhLCAweDE4LCAweGFiLCAweDJkLCAweDFhLCAweGNkLCAweDQzLCAweDJjLCAweGYzLAorCTB4MWUsIDB4MTUsIDB4NzAsIDB4NmUsIDB4ZTQsIDB4ZTksIDB4ZWEsIDB4OWUsIDB4NWMsIDB4MjQsIDB4MDAsIDB4NGUsCisJMHhiNSwgMHgxNCwgMHhhNywgMHhhYiwgMHhjMCwgMHhhOSwgMHg5NiwgMHhlMiwgMHhiNCwgMHgzZSwgMHg4MiwgMHhkMywKKwkweGZhLCAweDE4LCAweDRlLCAweDFjLCAweDUzLCAweDJhLCAweGM2LCAweDdhLCAweDM3LCAweGMzLCAweDI4LCAweGMzLAorCTB4NDcsIDB4YTcsIDB4OWIsIDB4NjIsIDB4MGEsIDB4ZmIsIDB4M2YsIDB4NGUsIDB4ZWQsIDB4OWYsIDB4YWEsIDB4OWMsCisJMHhmZiwgMHgwMiwgMHhiYiwgMHg5NywgMHg1NCwgMHgzOSwgMHgzZSwgMHgxNywgMHhmOCwgMHhmYiwgMHg3MSwgMHhiZSwKKwkweDgyLCAweGI5LCAweDVjLCAweGNmLCAweGUxLCAweDNkLCAweDIxLCAweGNmLCAweGI1LCAweDQ3LCAweDYzLCAweGQxLAorCTB4MDcsIDB4ODgsIDB4NDUsIDB4NWMsIDB4YzcsIDB4ZmQsIDB4NTQsIDB4YTksIDB4MDYsIDB4Y2QsIDB4MmIsIDB4YzgsCisJMHhlMSwgMHhmZCwgMHg2MSwgMHgwZSwgMHg5ZiwgMHhmOCwgMHhlMSwgMHg2YSwgMHg5YSwgMHhjMywgMHg2ZiwgMHhkOSwKKwkweDljLCAweGMzLCAweDlmLCAweGQwLCAweDY4LCAweDYyLCAweDM5LCAweGM1LCAweDkzLCAweDc5LCAweDNkLCAweDg5LAorCTB4YjYsIDB4YjMsIDB4MzEsIDB4ZWUsIDB4NmQsIDB4YzQsIDB4ZjIsIDB4NTUsIDB4ZjgsIDB4YTAsIDB4MTksIDB4ZjMsCisJMHgxMywgMHg3OSwgMHg1NywgMHhjYSwgMHg1ZCwgMHhlNCwgMHhiYiwgMHhlNCwgMHg4NywgMHgwOSwgMHg0ZiwgMHgzZiwKKwkweGRiLCAweDVjLCAweGVjLCAweGVmLCAweDg4LCAweGQ5LCAweDQ2LCAweDQzLCAweGM1LCAweDFkLCAweGUwLCAweDZlLAorCTB4MTgsIDB4YzcsIDB4ZWEsIDB4NzMsIDB4NDEsIDB4OTcsIDB4NWEsIDB4NDcsIDB4YWEsIDB4NTcsIDB4MjIsIDB4ZTAsCisJMHhlZSwgMHg3ZSwgMHhmZCwgMHgzNCwgMHg5ZiwgMHgzOSwgMHhmOSwgMHg0NSwgMHhhZiwgMHg4MiwgMHhmYSwgMHg4MSwKKwkweDQxLCAweGM4LCAweDgzLCAweDcwLCAweGE3LCAweGExLCAweDk2LCAweDc3LCAweDVhLCAweDQyLCAweGJlLCAweDgzLAorCTB4MzIsIDB4NmMsIDB4ODIsIDB4NzAsIDB4YmEsIDB4MjEsIDB4NTcsIDB4NGIsIDB4ZTAsIDB4NDMsIDB4OGIsIDB4NWMsCisJMHhhYywgMHhkMywgMHgwZCwgMHhlMywgMHg3YiwgMHg0ZCwgMHg0MywgMHhhOSwgMHgxYSwgMHhjOCwgMHgzNywgMHhjOSwKKwkweGMwLCAweDk5LCAweDBmLCAweDlmLCAweDk4LCAweDQ2LCAweDdiLCAweDgwLCAweDljLCAweDA4LCAweDc5LCAweDgwLAorCTB4YjcsIDB4MDgsIDB4YmYsIDB4MWMsIDB4MDMsIDB4NzYsIDB4YTEsIDB4MGEsIDB4ZGIsIDB4NmYsIDB4ZTksIDB4YzksCisJMHg5ZCwgMHg4OCwgMHhjOCwgMHg4YiwgMHhmZCwgMHhmNSwgMHg3MSwgMHhjYSwgMHg5MSwgMHgzOCwgMHhlNywgMHg5MiwKKwkweDZhLCAweDNkLCAweDMyLCAweDliLCAweDBlLCAweGI4LCAweDhlLCAweDMzLCAweGE1LCAweDEzLCAweDcyLCAweDVlLAorCTB4N2QsIDB4Y2MsIDB4OTAsIDB4YWYsIDB4NzEsIDB4M2MsIDB4N2YsIDB4MDAsIDB4MWYsIDB4ZTIsIDB4N2IsIDB4OWIsCisJMHhjZiwgMHgxOSwgMHg4NSwgMHg3MywgMHg3MywgMHhkYywgMHg3ZCwgMHhjYSwgMHg4OCwgMHgzNywgMHgzNCwgMHg4OSwKKwkweGQ4LCAweDg3LCAweGQ4LCAweDNiLCAweGNkLCAweDU4LCAweGI5LCAweGM5LCAweDE5LCAweGM0LCAweGUzLCAweDFkLAorCTB4OTcsIDB4OTMsIDB4NzksIDB4ZmUsIDB4YTQsIDB4MjUsIDB4MWMsIDB4YzYsIDB4N2QsIDB4MDcsIDB4ZmUsIDB4NWIsCisJMHhlZCwgMHgzOSwgMHgxYywgMHg3MywgMHgzZiwgMHhhZiwgMHhkMCwgMHg0MywgMHg4YSwgMHgzOSwgMHgyOSwgMHg0ZSwKKwkweDIwLCAweDE2LCAweDlmLCAweDg2LCAweDhkLCAweDFiLCAweGViLCAweDMxLCAweGM5LCAweGJkLCAweDMyLCAweDliLAorCTB4MGYsIDB4ZjcsIDB4OGMsIDB4ZjEsIDB4MTcsIDB4NjUsIDB4YmMsIDB4ZWMsIDB4ODIsIDB4ZDMsIDB4OTUsIDB4NzQsCisJMHhiZSwgMHg1MSwgMHg4ZSwgMHgyYywgMHgyMCwgMHhlNSwgMHg3OSwgMHhhMCwgMHgwZCwgMHhmMywgMHhiNywgMHhhMiwKKwkweDhlLCAweDdlLCAweGJjLCAweDQ2LCAweGQ2LCAweDI1LCAweGRiLCAweDFjLCAweGQxLCAweGM2LCAweGM3LCAweDk5LAorCTB4ZGQsIDB4NjcsIDB4OGMsIDB4ZWEsIDB4YzgsIDB4MTgsIDB4NDUsIDB4ZGUsIDB4OWIsIDB4NjgsIDB4M2EsIDB4Y2YsCisJMHhhNCwgMHhmNywgMHgwYywgMHg4ZSwgMHgyZCwgMHgwMiwgMHgzYSwgMHg5NSwgMHg5ZiwgMHg5MywgMHhiMSwgMHgwZiwKKwkweDBmLCAweDdiLCAweGY2LCAweGUzLCAweGZhLCAweDVmLCAweGU5LCAweGUzLCAweGUzLCAweGZlLCAweDU2LCAweDRkLAorCTB4Y2EsIDB4YzcsIDB4MTIsIDB4NmUsIDB4ZGEsIDB4NzgsIDB4ODcsIDB4MGYsIDB4NDYsIDB4ZDYsIDB4YWUsIDB4ZWQsCisJMHgzMywgMHhlZiwgMHhkNywgMHgzOCwgMHg1ZCwgMHg0MywgMHhiYywgMHgyMSwgMHg1NywgMHhjMSwgMHgxZCwgMHhjYywKKwkweDI3LCAweDdjLCAweDg3LCAweGFmLCAweDY3LCAweDNlLCAweDA0LCAweDZmLCAweGU4LCAweDVjLCAweDNiLCAweGU1LAorCTB4OGIsIDB4OWMsIDB4ZjAsIDB4ODUsIDB4ZjMsIDB4YmEsIDB4YzUsIDB4NTUsIDB4ZjAsIDB4YTUsIDB4MGQsIDB4YmUsCisJMHhjMCwgMHhhZSwgMHhhMSwgMHg1NSwgMHhhNywgMHhjMSwgMHgwNSwgMHg4ZSwgMHg0ZCwgMHgyOCwgMHg4NywgMHhjYywKKwkweDFkLCAweGU2LCAweDBhLCAweGYzLCAweGU2LCAweDMxLCAweDVmLCAweDVlLCAweGU5LCAweDFhLCAweGM2LCAweGU2LAorCTB4YTcsIDB4NzAsIDB4ZTUsIDB4OGQsIDB4OTgsIDB4MmIsIDB4Y2MsIDB4ZDksIDB4MjQsIDB4N2UsIDB4NzQsIDB4ODAsCisJMHg1NSwgMHg5MCwgMHhjNiwgMHg4ZiwgMHgwMCwgMHhmMSwgMHhhMywgMHhjNiwgMHhmOSwgMHg0ZiwgMHgxYywgMHgwYiwKKwkweDEyLCAweGZkLCAweGFjLCAweDQxLCAweDNmLCAweDM1LCAweDg1LCAweGYzLCAweDIzLCAweGQ2LCAweDBlLCAweGRiLAorCTB4YjEsIDB4N2UsIDB4ZDgsIDB4YWUsIDB4OTAsIDB4ZGEsIDB4OGQsIDB4YzcsIDB4OTEsIDB4NzYsIDB4Y2YsIDB4MzIsCisJMHhiMywgMHgzOCwgMHhkMiwgMHg4NiwgMHg3NiwgMHgzYSwgMHhhOSwgMHg4ZSwgMHhkYSwgMHhhOSwgMHg4ZSwgMHhkMCwKKwkweGE3LCAweGE1LCAweDU0LCAweGY4LCAweDRjLCAweGIwLCAweDRjLCAweDFmLCAweGYxLCAweGEzLCAweDEzLCAweDhmLAorCTB4ZDksIDB4YTIsIDB4ZTQsIDB4MmUsIDB4YzMsIDB4ZGEsIDB4ZTYsIDB4YjgsIDB4M2IsIDB4MTIsIDB4NmYsIDB4ZDMsCisJMHg3YiwgMHg2ZSwgMHgyMywgMHhiZSwgMHhlNywgMHg3ZSwgMHg0NSwgMHgxZiwgMHg4ZiwgMHhiNywgMHgzOCwgMHg2YiwKKwkweGUyLCAweDdiLCAweGVlLCAweDI5LCAweDlkLCAweGVmLCAweGI5LCAweDAxLCAweDdkLCAweDQ5LCAweDFmLCAweGJkLAorCTB4ZTcsIDB4MDYsIDB4NjMsIDB4ZjcsIDB4ZGMsIDB4Y2MsIDB4OTYsIDB4ZWIsIDB4ZjcsIDB4OGIsIDB4YmIsIDB4OTksCisJMHg0ZiwgMHgzOCwgMHhmNiwgMHgzMiwgMHg5ZiwgMHhmNiwgMHhjYiwgMHgxNSwgMHhiMywgMHgzZSwgMHgxYywgMHg5MywKKwkweDU4LCAweGVmLCAweDFjLCAweGNiLCAweDkyLCAweGRjLCAweGVjLCAweDZlLCAweDk4LCAweGU5LCAweGUyLCAweDU1LAorCTB4Y2MsIDB4ODMsIDB4NzIsIDB4NmYsIDB4M2YsIDB4NWQsIDB4MTgsIDB4YTksIDB4MmUsIDB4MjYsIDB4MTMsIDB4OWIsCisJMHhkZSwgMHhhOCwgMHgzNiwgMHg1ZSwgMHhkNSwgMHhjNywgMHhiNSwgMHg5MSwgMHg4ZCwgMHg5MywgMHg2OSwgMHgyMywKKwkweDE5LCAweDczLCAweDQ3LCAweDI5LCAweGUxLCAweDBjLCAweDJjLCAweDIzLCAweDFlLCAweDA5LCAweGJlLCAweGEzLAorCTB4MjEsIDB4NWUsIDB4NTQsIDB4ZjMsIDB4YjgsIDB4YTcsIDB4MTQsIDB4NzgsIDB4ZWMsIDB4NzYsIDB4ZjgsIDB4MmMsCisJMHgzNSwgMHg4YSwgMHg4YywgMHgwYiwgMHhhZiwgMHhmZiwgMHg2MSwgMHg3YywgMHg3ZiwgMHhjMCwgMHhiYSwgMHgwYiwKKwkweDAxLCAweGZmLCAweGZlLCAweGYxLCAweDA5LCAweDNlLCAweGJlLCAweDA2LCAweDNlLCAweDY2LCAweGZiLCAweDE5LAorCTB4YWQsIDB4YmYsIDB4MzQsIDB4NTIsIDB4NWYsIDB4NGUsIDB4MzEsIDB4NGYsIDB4N2MsIDB4N2UsIDB4MmYsIDB4ZDUsCisJMHhjOCwgMHgyNiwgMHg3MiwgMHhiNywgMHhmYiwgMHhjOCwgMHg4YiwgMHhkZSwgMHg0NCwgMHhmYywgMHgwZSwgMHgwNiwKKwkweDFmLCAweDQ3LCAweGY3LCAweDhhLCAweDJhLCAweDc1LCAweDg2LCAweDM2LCAweGJmLCAweGMwLCAweGJhLCAweDJkLAorCTB4NzEsIDB4MTMsIDB4NWYsIDB4NmYsIDB4MGMsIDB4YjIsIDB4YjEsIDB4YjksIDB4OWQsIDB4ZWIsIDB4ZmUsIDB4OGQsCisJMHhmMywgMHgxOSwgMHg3OSwgMHhkZiwgMHhiMCwgMHhlZiwgMHhmYiwgMHgxMSwgMHhlNywgMHhiYiwgMHg3NywgMHg4MSwKKwkweGM1LCAweDNiLCAweGUxLCAweDM0LCAweGZkLCAweDFlLCAweDFjLCAweDdiLCAweDNiLCAweGNlLCAweDc5LCAweDkzLAorCTB4NWMsIDB4MTcsIDB4ZmUsIDB4YzMsIDB4OTksIDB4YzcsIDB4NjcsIDB4YmQsIDB4ZjcsIDB4MzksIDB4OTksIDB4MmUsCisJMHhkMywgMHg1NywgMHgxZCwgMHhhZSwgMHg5MywgMHhhOSwgMHg3ZSwgMHgyYSwgMHg4YSwgMHgyZSwgMHhlMiwgMHhkYywKKwkweDVmLCAweDE5LCAweDNiLCAweGY3LCAweDcxLCAweDA3LCAweDNjLCAweGM5LCAweGY5LCAweDdmLCAweDk2LCAweGYzLAorCTB4ZWYsIDB4NDYsIDB4MzMsIDB4ZjMsIDB4ZDYsIDB4NGQsIDB4OTcsIDB4NWMsIDB4YTksIDB4ZGUsIDB4ZTcsIDB4N2MsCisJMHg2YywgMHg5OCwgMHg4YiwgMHgxMSwgMHgxZCwgMHg3YSwgMHgxNCwgMHhjOSwgMHhmMywgMHg3YywgMHgzNiwgMHhiZCwKKwkweDliLCAweGZhLCAweDFjLCAweDZkLCAweDM3LCAweDFlLCAweGUxLCAweDFlLCAweDUzLCAweDhiLCAweDdmLCAweDE3LAorCTB4NzIsIDB4ZmIsIDB4M2MsIDB4MGYsIDB4OTcsIDB4ZjEsIDB4MGUsIDB4MzksIDB4NDcsIDB4NzgsIDB4ZDIsIDB4NmYsCisJMHgzNSwgMHgyYSwgMHhmMCwgMHhiNSwgMHhjYywgMHg3NSwgMHg4NSwgMHhlMiwgMHg3YiwgMHgyMSwgMHhlZSwgMHg2ZSwKKwkweDNmLCAweDZmLCAweDUzLCAweDEyLCAweDNiLCAweDZhLCAweGNlLCAweDM5LCAweGFjLCAweDA1LCAweDk4LCAweDg4LAorCTB4MDYsIDB4MzAsIDB4OWUsIDB4NDcsIDB4YWMsIDB4YjIsIDB4Y2MsIDB4OTMsIDB4NzIsIDB4ZjIsIDB4NWIsIDB4ZDUsCisJMHgxYSwgMHhjNiwgMHg1NiwgMHg0ZSwgMHg3MiwgMHgyZSwgMHhmOSwgMHg1MSwgMHhiNCwgMHgzNiwgMHg4OCwgMHhjZiwKKwkweDQ0LCAweDg3LCAweGI5LCAweGU2LCAweDg3LCAweDA3LCAweDY1LCAweDdlLCAweGJiLCAweDIxLCAweDdmLCAweGViLAorCTB4OTgsIDB4YzcsIDB4N2MsIDB4MDIsIDB4MGYsIDB4OGIsIDB4YTIsIDB4NzYsIDB4YzMsIDB4MTQsIDB4ZjUsIDB4OWUsCisJMHgyOSwgMHg5NiwgMHg3YSwgMHgzMiwgMHg1NCwgMHg1MiwgMHhjOCwgMHhkMSwgMHgxNCwgMHhlNywgMHgwOCwgMHgzYSwKKwkweGQxLCAweDczLCAweDU4LCAweGNiLCAweDJkLCAweDUzLCAweGY4LCAweGM4LCAweGEzLCAweGJlLCAweGFkLCAweDU4LAorCTB4NjIsIDB4ODUsIDB4NzYsIDB4YjEsIDB4YzcsIDB4NDcsIDB4NTEsIDB4NzIsIDB4YTcsIDB4MzUsIDB4NDUsIDB4NmQsCisJMHgzOCwgMHhmNywgMHgyMywgMHhjYywgMHhjZCwgMHg2YiwgMHg2MiwgMHgyZCwgMHhmMywgMHg3OSwgMHhiNiwgMHgyYywKKwkweDlkLCAweDgzLCAweDhmLCAweGNlLCAweGY3LCAweDc3LCAweDExLCAweDQzLCAweGY5LCAweDNjLCAweGNiLCAweDIzLAorCTB4ZTYsIDB4NTksIDB4MjYsIDB4NWYsIDB4ZjYsIDB4ZWYsIDB4NjIsIDB4ZmYsIDB4ZWYsIDB4ZjQsIDB4ODAsIDB4MGYsCisJMHg3MiwgMHhjNywgMHhiNywgMHg4NywgMHg3OSwgMHgxYSwgMHg2MywgMHg1OCwgMHgwNiwgMHgxNywgMHhkOSwgMHgzZSwKKwkweDhhLCAweDgyLCAweGM1LCAweDM4LCAweDQ3LCAweGMxLCAweDVhLCAweGU2LCAweGNhLCAweGI3LCAweDkwLCAweGE3LAorCTB4ZDcsIDB4NjksIDB4YTEsIDB4NWMsIDB4OGYsIDB4ZGYsIDB4MTEsIDB4NzIsIDB4MTIsIDB4ZmUsIDB4NWQsIDB4YzAsCisJMHgxMiwgMHg0ZCwgMHg3YywgMHhkNywgMHhkMiwgMHhlZiwgMHg4MCwgMHg3MywgMHhmOCwgMHg0NSwgMHgxZSwgMHg4MywKKwkweDczLCAweDc5LCAweGQ2LCAweGUxLCAweDdmLCAweDAxLCAweDE3LCAweGM2LCAweGYxLCAweGIyLCAweDg0LCAweDE0LAorCTB4MDAsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UUEFUX2IwOUZ3RGF0YVsoMHgwLzQpICsgMV0gPSB7IDB4MCB9Oworc3RhdGljIHUzMiBibngyX1RQQVRfYjA5RndSb2RhdGFbKDB4MC80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UUEFUX2IwOUZ3QnNzWygweDI1MC80KSArIDFdID0geyAweDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UUEFUX2IwOUZ3U2Jzc1soMHgzNC80KSArIDFdID0geyAweDAgfTsKKworc3RhdGljIHN0cnVjdCBmd19pbmZvIGJueDJfdHBhdF9md18wOSA9IHsKKwkudmVyX21ham9yCQkJPSAweDEsCisJLnZlcl9taW5vcgkJCT0gMHgwLAorCS52ZXJfZml4CQkJPSAweDAsCisKKwkuc3RhcnRfYWRkcgkJCT0gMHgwODAwMDg2MCwKKworCS50ZXh0X2FkZHIJCQk9IDB4MDgwMDA4MDAsCisJLnRleHRfbGVuCQkJPSAweDE0ODAsCisJLnRleHRfaW5kZXgJCQk9IDB4MCwKKwkuZ3pfdGV4dAkJCT0gYm54Ml9UUEFUX2IwOUZ3VGV4dCwKKwkuZ3pfdGV4dF9sZW4JCQk9IHNpemVvZihibngyX1RQQVRfYjA5RndUZXh0KSwKKworCS5kYXRhX2FkZHIJCQk9IDB4MDgwMDFjYTAsCisJLmRhdGFfbGVuCQkJPSAweDAsCisJLmRhdGFfaW5kZXgJCQk9IDB4MCwKKwkuZGF0YQkJCQk9IGJueDJfVFBBVF9iMDlGd0RhdGEsCisKKwkuc2Jzc19hZGRyCQkJPSAweDA4MDAxY2EwLAorCS5zYnNzX2xlbgkJCT0gMHgzNCwKKwkuc2Jzc19pbmRleAkJCT0gMHgwLAorCS5zYnNzCQkJCT0gYm54Ml9UUEFUX2IwOUZ3U2JzcywKKworCS5ic3NfYWRkcgkJCT0gMHgwODAwMWNlMCwKKwkuYnNzX2xlbgkJCT0gMHgyNTAsCisJLmJzc19pbmRleAkJCT0gMHgwLAorCS5ic3MJCQkJPSBibngyX1RQQVRfYjA5RndCc3MsCisKKwkucm9kYXRhX2FkZHIJCQk9IDB4MDAwMDAwMDAsCisJLnJvZGF0YV9sZW4JCQk9IDB4MCwKKwkucm9kYXRhX2luZGV4CQkJPSAweDAsCisJLnJvZGF0YQkJCQk9IGJueDJfVFBBVF9iMDlGd1JvZGF0YSwKK307CisKK3N0YXRpYyB1OCBibngyX1RYUF9iMDlGd1RleHRbXSA9IHsKKwkweDFmLCAweDhiLCAweDA4LCAweDA4LCAweDUxLCAweGZlLCAweDJmLCAweDQ1LCAweDAwLCAweDAzLCAweDc0LCAweDY1LAorCTB4NzMsIDB4NzQsIDB4MzEsIDB4MmUsIDB4NjIsIDB4NjksIDB4NmUsIDB4MDAsIDB4Y2QsIDB4N2IsIDB4N2YsIDB4NzAsCisJMHgxYiwgMHhlNywgMHg5OSwgMHhkZSwgMHhiYiwgMHgwYiwgMHg4MCwgMHgwNCwgMHgyOSwgMHg4YSwgMHg1YSwgMHgzMSwKKwkweDMwLCAweDgzLCAweDM4LCAweGI0LCAweDhkLCAweDE1LCAweDE3LCAweDM0LCAweDZkLCAweGYyLCAweDFjLCAweDU4LAorCTB4ZTUsIDB4ZjksIDB4ZDgsIDB4MDYsIDB4YjUsIDB4ZDcsIDB4YzAsIDB4OTIsIDB4YTIsIDB4NjMsIDB4MjYsIDB4NDcsCisJMHhiYiwgMHhjYywgMHg5ZCwgMHg5MiwgMHg1MSwgMHg3ZCwgMHgyOCwgMHg0OCwgMHgyOSwgMHg2ZSwgMHhlMywgMHhiNCwKKwkweGFhLCAweGUzLCAweDNmLCAweDM0LCAweDRkLCAweDViLCAweGMzLCAweDAwLCAweDI1LCAweGNiLCAweDJlLCAweDQ0LAorCTB4ZDAsIDB4MTYsIDB4NjMsIDB4YTUsIDB4MzMsIDB4MzcsIDB4NTMsIDB4MTgsIDB4ODAsIDB4MjgsIDB4ZTcsIDB4YmEsCisJMHgyNCwgMHhkYywgMHhlNCwgMHgyZSwgMHhlOSwgMHgxZiwgMHhjOSwgMHg5OSwgMHhhNSwgMHg2YywgMHhjNSwgMHg2ZCwKKwkweGFlLCAweDMzLCAweGJlLCAweDNmLCAweGRhLCAweGE2LCAweDM3LCAweGQ3LCAweDE5LCAweDhkLCAweGZjLCAweDIzLAorCTB4Y2UsIDB4OGYsIDB4YjksIDB4YjgsIDB4NjksIDB4N2EsIDB4NTYsIDB4NWIsIDB4ZDksIDB4ZTgsIDB4ZjMsIDB4N2MsCisJMHhiYiwgMHg0YiwgMHg4MiwgMHgzMiwgMHgxNSwgMHg1YiwgMHhkNywgMHg3NiwgMHhhNiwgMHg5YywgMHhjMSwgMHgxMCwKKwkweGZiLCAweGVkLCAweGI3LCAweGRmLCAweGY3LCAweGZlLCAweDdlLCAweGRmLCAweGU3LCAweGZkLCAweDE2LCAweDcxLAorCTB4OTEsIDB4NmUsIDB4ZjEsIDB4ZmYsIDB4NzYsIDB4ZTMsIDB4OTMsIDB4MzgsIDB4N2EsIDB4ZWMsIDB4YjEsIDB4M2IsCisJMHhjNiwgMHhlZiwgMHhkOCwgMHgyZiwgMHg3MiwgMHhlNywgMHg5ZCwgMHhiMiwgMHgyYiwgMHhhYSwgMHhmMywgMHhlNiwKKwkweGRiLCAweDIxLCAweDkxLCAweGRjLCAweDRmLCAweGU1LCAweGFmLCAweGZjLCAweDg3LCAweGM3LCAweDhkLCAweDYwLAorCTB4N2QsIDB4N2UsIDB4MjQsIDB4YWEsIDB4YTcsIDB4NWYsIDB4Y2MsIDB4NjQsIDB4MmMsIDB4ODksIDB4ODYsIDB4ZDIsCisJMHgzMywgMHg5ZiwgMHg5ZCwgMHhiMywgMHg0NCwgMHg2YywgMHg3NywgMHgyNCwgMHg5MSwgMHg5NSwgMHhmNywgMHg1YSwKKwkweDg1LCAweDU4LCAweDU4LCAweDM4LCAweDdlLCAweDUzLCAweGZhLCAweGNhLCAweGUzLCAweGRmLCAweGZmLCAweDJkLAorCTB4ZjMsIDB4OWQsIDB4NmEsIDB4NDgsIDB4YTIsIDB4NDYsIDB4M2EsIDB4MjcsIDB4YzYsIDB4OTAsIDB4NDQsIDB4MDcsCisJMHhmMCwgMHhjYywgMHhlZiwgMHhkZiwgMHgzYSwgMHhhNSwgMHg0YiwgMHg2ZiwgMHhiMCwgMHg1NiwgMHg1YywgMHgxNiwKKwkweDJhLCAweDZmLCAweGI3LCAweGJlLCAweDdmLCAweDZiLCAweDRjLCAweGZlLCAweDU1LCAweGQzLCAweDkwLCAweDE3LAorCTB4OWIsIDB4NjEsIDB4NmQsIDB4YjIsIDB4ZDIsIDB4MjMsIDB4YTUsIDB4OGEsIDB4MmIsIDB4YzcsIDB4Y2IsIDB4MDUsCisJMHhjOSwgMHgzNiwgMHg1ZiwgMHg5MCwgMHhlMiwgMHhiMiwgMHhkMSwgMHg5YiwgMHgzOSwgMHhmNywgMHgwNywgMHg1MiwKKwkweDVhLCAweGVlLCAweGViLCAweGNkLCAweDllLCAweDczLCAweGE1LCAweDU4LCAweDhlLCAweGY3LCAweDY2LCAweDlhLAorCTB4NDYsIDB4NmYsIDB4ZjYsIDB4NGMsIDB4MGMsIDB4ZDcsIDB4N2QsIDB4YmQsIDB4OTksIDB4MzMsIDB4NjYsIDB4NDEsCisJMHhhNCwgMHgxZiwgMHg3MywgMHhlMiwgMHhiZCwgMHhkOSwgMHg4YSwgMHg5OSwgMHgxMywgMHgxOSwgMHg0YywgMHhiZCwKKwkweDIyLCAweDAzLCAweGJkLCAweGQ5LCAweDY2LCAweDRkLCAweDViLCAweDM3LCAweDM0LCAweDI5LCAweGZlLCAweDg2LAorCTB4MTgsIDB4YmQsIDB4ZTksIDB4Y2IsIDB4YWQsIDB4NGYsIDB4NTgsIDB4ODYsIDB4ZWMsIDB4YjUsIDB4NjQsIDB4Y2YsCisJMHgxZSwgMHg0YiwgMHg5ZSwgMHg4OCwgMHhhNywgMHhhMywgMHg5MiwgMHgzZiwgMHhkZCwgMHgyNSwgMHhiNiwgMHhlMiwKKwkweGM5LCAweDkwLCAweGZjLCAweDk5LCAweDExLCAweDYzLCAweDQzLCAweDIyLCAweDYyLCAweGM3LCAweDgyLCAweGViLAorCTB4NTYsIDB4MmIsIDB4OTMsIDB4ZmEsIDB4MDIsIDB4ZTUsIDB4OGEsIDB4YmQsIDB4YTQsIDB4NzcsIDB4YjIsIDB4MjksCisJMHg5MiwgMHhhOSwgMHg0NCwgMHgyNSwgMHg5MywgMHg3YSwgMHhhZiwgMHhlNSwgMHgzZCwgMHgxMywgMHhjNSwgMHhiZSwKKwkweGUxLCAweGRlLCAweDg5LCAweDRhLCAweGFiLCAweGU1LCAweGE0LCAweGIwLCAweDQ3LCAweDJhLCAweDc4LCAweDM2LAorCTB4MjIsIDB4ZDUsIDB4OTgsIDB4NWQsIDB4MmQsIDB4YTUsIDB4NGMsIDB4ZGQsIDB4ZDMsIDB4MDksIDB4NzksIDB4ZTQsCisJMHhiNSwgMHgyZCwgMHhiYSwgMHhmNSwgMHhkYiwgMHg5MiwgMHg4ZiwgMHg0OSwgMHhiNSwgMHg5OCwgMHhiYSwgMHg0YiwKKwkweDllLCAweDRlLCAweDE5LCAweDcyLCAweDEyLCAweGViLCAweDNkLCAweDk1LCAweDgyLCAweDFjLCAweGFkLCAweDYzLAorCTB4NWEsIDB4YTYsIDB4NjksIDB4YzYsIDB4NDUsIDB4N2IsIDB4NWEsIDB4MzIsIDB4NjcsIDB4MDYsIDB4OGQsIDB4YWMsCisJMHg2MCwgMHg2ZiwgMHhhYiwgMHg3NSwgMHg0YiwgMHgyNiwgMHg4NSwgMHhmZCwgMHg0NiwgMHhmZiwgMHg2NywgMHhjYiwKKwkweDhlLCAweDk5LCAweGI5LCAweGFhLCAweDBjLCAweDQ4LCAweGIxLCAweDMyLCAweDk4LCAweGZhLCAweDEzLCAweGQxLAorCTB4YTQsIDB4ZDMsIDB4YTIsIDB4N2MsIDB4NWEsIDB4NzIsIDB4M2YsIDB4ZjYsIDB4Y2QsIDB4NTgsIDB4MTgsIDB4NmYsCisJMHg4YSwgMHhhZCwgMHgyNywgMHgyMywgMHhmMiwgMHgwZiwgMHgwYywgMHgzMywgMHg5MSwgMHgwOSwgMHhmNSwgMHg0YiwKKwkweGYxLCAweDc0LCAweDI3LCAweGU4LCAweGI0LCAweGZiLCAweDc0LCAweGNjLCAweDNkLCAweDMwLCAweDI2LCAweGIxLAorCTB4NWQsIDB4MjIsIDB4NWEsIDB4MjgsIDB4OWQsIDB4YzQsIDB4YmEsIDB4MjIsIDB4NDUsIDB4NzcsIDB4MDAsIDB4Y2YsCisJMHgyNiwgMHhjNywgMHg3ZiwgMHgyYSwgMHg3YiwgMHgyNCwgMHhiMSwgMHgzNywgMHgyYywgMHgyNSwgMHhiNywgMHgxYiwKKwkweDcyLCAweDM0LCAweGEwLCAweDgzLCAweGU0LCAweGY4LCAweDVmLCAweDQwLCAweDI5LCAweGJhLCAweDk1LCAweDhjLAorCTB4MWYsIDB4OTMsIDB4OWMsIDB4OTYsIDB4NmQsIDB4NzYsIDB4NDgsIDB4MjksIDB4MTksIDB4OTUsIDB4MDUsIDB4ZDAsCisJMHhiMSwgMHg5MCwgMHhmYSwgMHhhMiwgMHg5NiwgMHgzOSwgMHg3NywgMHg1MCwgMHhjYiwgMHg5ZSwgMHhjMywgMHhiYywKKwkweDY2LCAweGRkLCAweGI3LCAweDM1LCAweDAzLCAweGViLCAweGU4LCAweDUyLCAweDRjLCAweDFlLCAweGM0LCAweGJkLAorCTB4YTgsIDB4Y2MsIDB4NjEsIDB4ZGUsIDB4MWMsIDB4NzgsIDB4MmEsIDB4MzUsIDB4ZjcsIDB4YzgsIDB4ZmEsIDB4NmMsCisJMHhhYywgMHgzNywgMHgwMywgMHgxZCwgMHgxNiwgMHg3MSwgMHhmZiwgMHhiNywgMHg2NywgMHgzNCwgMHgzMSwgMHgyYywKKwkweDViLCAweDdlLCAweDNjLCAweDA2LCAweDFkLCAweDllLCAweDgxLCAweGZlLCAweGNlLCAweGM0LCAweGU1LCAweDc4LAorCTB4NDUsIDB4NjIsIDB4YmEsIDB4MjQsIDB4ZTMsIDB4NzksIDB4NzksIDB4NDEsIDB4ZWEsIDB4MmUsIDB4ZjUsIDB4MGYsCisJMHg3ZCwgMHg0MiwgMHhkZiwgMHg0NSwgMHg5NywgMHhjZiwgMHg0MSwgMHg2ZiwgMHgxNSwgMHgwNywgMHhmMiwgMHg5OCwKKwkweDAyLCAweDBkLCAweDBmLCAweDZhLCAweGY3LCAweGQ3LCAweDY3LCAweGI1LCAweDAzLCAweGNkLCAweDFmLCAweDZiLAorCTB4ZDIsIDB4N2QsIDB4NGMsIDB4ZmIsIDB4NWMsIDB4ZjMsIDB4ODgsIDB4ZTYsIDB4Y2IsIDB4MWUsIDB4YmEsIDB4OGIsCisJMHg4YSwgMHgzZCwgMHgxMywgMHg5NSwgMHg5NSwgMHhhNiwgMHhhNywgMHhiYiwgMHgxYSwgMHhlYywgMHhkMywgMHgzNiwKKwkweDZjLCAweGU4LCAweGUxLCAweDZmLCAweDZmLCAweGNlLCAweDU5LCAweDY5LCAweGM2LCAweDY0LCAweDAxLCAweGI0LAorCTB4MWQsIDB4NmYsIDB4NzIsIDB4ZmUsIDB4ZWYsIDB4NDEsIDB4M2YsIDB4NTEsIDB4NzEsIDB4NmYsIDB4ZWQsIDB4OTEsCisJMHgxYywgMHhjNiwgMHg4YiwgMHg2NywgMHhjNCwgMHhjZSwgMHhhNCwgMHg3NCwgMHgzYywgMHhkMywgMHgyYiwgMHgyMSwKKwkweGFiLCAweDFmLCAweDlmLCAweDZlLCAweDk5LCAweGFiLCAweDc3LCAweGRhLCAweDIxLCAweDJiLCAweDI2LCAweDczLAorCTB4NGQsIDB4Y2EsIDB4MTAsIDB4ZmYsIDB4MmIsIDB4ODEsIDB4MWMsIDB4NDksIDB4MmIsIDB4YzcsIDB4ZjksIDB4MWMsCisJMHhjNywgMHgwZCwgMHg4YywgMHhiNywgMHg4ZiwgMHhkMSwgMHgyZSwgMHg3YSwgMHg0MSwgMHg4ZiwgMHgzOSwgMHgyYywKKwkweDE4LCAweGNiLCAweDU3LCAweDkyLCAweGM2LCAweGU3LCAweGY4LCAweGJmLCAweDQ5LCAweGQ5LCAweDA2LCAweDMyLAorCTB4MGQsIDB4NjMsIDB4YWUsIDB4MmUsIDB4ZjksIDB4M2EsIDB4ZjYsIDB4MzksIDB4N2QsIDB4YTUsIDB4MTUsIDB4MTksCisJMHhjMywgMHhiNSwgMHhmNSwgMHg0YiwgMHhjOCwgMHg5MiwgMHhmYiwgMHg4NiwgMHg0MSwgMHg5MywgMHgyZSwgMHhiOSwKKwkweDNhLCAweGQ3LCAweGUyLCAweDdkLCAweDgxLCAweGVlLCAweDhiLCAweDdiLCAweDc1LCAweDE5LCAweDg2LCAweDdlLAorCTB4NGQsIDB4ZWMsIDB4ZDMsIDB4ODUsIDB4MzksIDB4M2QsIDB4OTAsIDB4MWYsIDB4NzgsIDB4M2QsIDB4ODcsIDB4ZWYsCisJMHhlMCwgMHg1ZCwgMHhiNywgMHg3NCwgMHgzYywgMHhkZiwgMHgyOSwgMHg3MywgMHgyOSwgMHhkYSwgMHgwYiwgMHhlOSwKKwkweGRjLCAweDg1LCAweGI1LCAweGJiLCAweDY0LCAweGZlLCAweDM0LCAweGU1LCAweDAxLCAweGJiLCAweGFhLCAweGM0LAorCTB4YTQsIDB4NzQsIDB4YzYsIDB4MzQsIDB4MWMsIDB4MzEsIDB4MjEsIDB4MWIsIDB4MWIsIDB4ZjMsIDB4M2EsIDB4MjUsCisJMHg2NywgMHhiNCwgMHg1YSwgMHgxMywgMHhhOSwgMHgxMSwgMHhlMywgMHg5YiwgMHhjYSwgMHhjZSwgMHg0NywgMHg4YywKKwkweGE0LCAweDI2LCAweDg1LCAweDhlLCAweGY0LCAweDEwLCAweDY0LCAweDZiLCAweDFlLCAweDE0LCAweGUxLCAweGY1LAorCTB4MGYsIDB4YzQsIDB4OWUsIDB4YTUsIDB4ZmYsIDB4YzQsIDB4YjgsIDB4MTcsIDB4ZmMsIDB4YTksIDB4MWYsIDB4ZjQsCisJMHhkMywgMHhlNywgMHgwNiwgMHhhMCwgMHg5NywgMHhiOCwgMHhmMiwgMHg4MywgMHg4OSwgMHgxZCwgMHhmZCwgMHhjMCwKKwkweDljLCAweGFhLCAweDgyLCAweGRmLCAweGUyLCAweGI5LCAweDMwLCAweGZkLCAweDJmLCAweDA1LCAweDczLCAweDkzLAorCTB4NWQsIDB4NTYsIDB4MTQsIDB4YjYsIDB4NDAsIDB4NWEsIDB4YzYsIDB4YjEsIDB4N2UsIDB4YWIsIDB4ZjUsIDB4ZDksCisJMHg5NCwgMHg0NywgMHg1MywgMHhmMSwgMHg4YywgMHg4ZCwgMHg2NywgMHhjMywgMHg5MCwgMHhiYiwgMHhmOSwgMHg3MCwKKwkweDQyLCAweGVkLCAweDNmLCAweGVlLCAweGVmLCAweDZmLCAweGM4LCAweDFjLCAweGU4LCAweDJlLCAweDU2LCAweDQyLAorCTB4OTIsIDB4MzUsIDB4YjgsIDB4YzYsIDB4OWYsIDB4NzEsIDB4M2MsIDB4ZTcsIDB4YWQsIDB4MDUsIDB4YmIsIDB4M2QsCisJMHgzNSwgMHg2OCwgMHhkYywgMHgwNywgMHg1ZiwgMHhhMiwgMHg4ZiwgMHgxNSwgMHg1NywgMHgyOSwgMHg2MywgMHhhYywKKwkweDMzLCAweDQ2LCAweDE5LCAweDFiLCAweDhhLCAweGM2LCAweGNjLCAweDE5LCAweGRhLCAweDkxLCAweDBjLCAweDg0LAorCTB4ODQsIDB4NzYsIDB4OGUsIDB4OTgsIDB4MDEsIDB4YmIsIDB4MmEsIDB4ZjksIDB4NzYsIDB4OTUsIDB4NzcsIDB4YTksCisJMHhmZiwgMHhiYiwgMHg3ZCwgMHhmZiwgMHhkNCwgMHg2NSwgMHgyOCwgMHg0OSwgMHg3YiwgMHg3ZiwgMHg1YSwgMHhiMiwKKwkweGYwLCAweGYxLCAweDM5LCAweGVjLCAweDU0LCAweDA3LCAweDRmLCAweGI1LCAweGNhLCAweDIwLCAweDY0LCAweDE1LAorCTB4ZjgsIDB4MWQsIDB4ZjQsIDB4M2IsIDB4ZmEsIDB4NmUsIDB4MmIsIDB4ODgsIDB4MDUsIDB4YzUsIDB4MGEsIDB4N2QsCisJMHhhNiwgMHg2OCwgMHhlOCwgMHg1MiwgMHhjMCwgMHgwNywgMHg3NiwgMHg2MywgMHg5OSwgMHhjMywgMHg5OSwgMHg5MCwKKwkweDM5LCAweDkzLCAweDAzLCAweDZkLCAweGIwLCAweDdiLCAweGM5LCAweGRjLCAweDQ5LCAweDdiLCAweGM2LCAweDljLAorCTB4YTYsIDB4ZWMsIDB4MGYsIDB4ZmMsIDB4YWMsIDB4ZTYsIDB4NTIsIDB4NGYsIDB4ZGQsIDB4ZDgsIDB4MzcsIDB4YTAsCisJMHgyOSwgMHg4YywgMHgzMSwgMHhhZSwgMHgxMywgMHg4NSwgMHhjZCwgMHgwNywgMHgzNiwgMHg0MywgMHhmYiwgMHgzMywKKwkweGVkLCAweDc1LCAweGU5LCAweDkwLCAweGUxLCAweDI0LCAweDYyLCAweGQ5LCAweDE5LCAweDFkLCAweGZhLCAweDFiLAorCTB4NDAsIDB4NGMsIDB4MDksIDB4Y2IsIDB4MTEsIDB4YzgsIDB4ZWEsIDB4NGIsIDB4MTUsIDB4ZDIsIDB4ZTcsIDB4YzAsCisJMHhlZiwgMHgxMCwgMHhkYiwgMHhjZSwgMHg0YywgMHhjMiwgMHhjZiwgMHhhNiwgMHhiNCwgMHgwOSwgMHhmOCwgMHhjNCwKKwkweDY3LCAweGVhLCAweGE0LCAweGE5LCAweDI1LCAweGY0LCAweDRiLCAweGU3LCAweDVjLCAweDRlLCAweDliLCAweDZjLAorCTB4MWUsIDB4ZDQsIDB4YTYsIDB4Y2UsIDB4ZDEsIDB4NGYsIDB4ZTgsIDB4MjMsIDB4YTYsIDB4ZjEsIDB4ODAsIDB4NzgsCisJMHgzYywgMHgxNCwgMHg5YiwgMHhhZiwgMHg2OCwgMHhmNCwgMHhkNSwgMHhlMiwgMHhhOSwgMHgyZSwgMHhkMCwgMHhiMSwKKwkweDBiLCAweGY0LCAweDE4LCAweGYwLCAweDNkLCAweGQ4LCAweDk3LCAweDY1LCAweGNlLCAweGQwLCAweDY2LCAweDljLAorCTB4YTQsIDB4OTUsIDB4ZjgsIDB4ZTcsIDB4ZjIsIDB4NDEsIDB4MzksIDB4NGMsIDB4NmMsIDB4Y2EsIDB4NjEsIDB4MDQsCisJMHgzMiwgMHhkOSwgMHgyZSwgMHg4NywgMHg4NSwgMHgwZiwgMHhjYSwgMHhjMSwgMHgyZSwgMHg0MCwgMHgwZSwgMHgwYiwKKwkweDg4LCAweDQzLCAweDBiLCAweDRkLCAweGYyLCAweGRjLCAweDEyLCAweGZkLCAweDRlLCAweDgxLCAweDc1LCAweGNhLAorCTB4YmQsIDB4N2EsIDB4OWEsIDB4MzYsIDB4NGEsIDB4M2YsIDB4NDksIDB4MjYsIDB4NGEsIDB4NTgsIDB4YTEsIDB4ZTEsCisJMHhmNiwgMHgyOCwgMHhkZiwgMHg5OCwgMHg1NCwgMHhiMiwgMHhmOCwgMHgzMCwgMHg3ZSwgMHhjOSwgMHhkZiwgMHgxNiwKKwkweGNmLCAweDUzLCAweDc1LCAweGM2LCAweDFiLCAweGQ4LCAweDc5LCAweGQyLCAweDMyLCAweGJlLCAweDIwLCAweDViLAorCTB4N2MsIDB4ZGYsIDB4YjcsIDB4YzUsIDB4MzcsIDB4ZjYsIDB4MDksIDB4NjIsIDB4MTAsIDB4NzksIDB4MGUsIDB4ZTIsCisJMHgzMSwgMHg2ZCwgMHhlNSwgMHhhNSwgMHg1NiwgMHhjOCwgMHhiMiwgMHhhMCwgMHgwMywgMHhkYSwgMHgwYiwgMHg2OSwKKwkweDMwLCAweDhkLCAweGNmLCAweDBhLCAweGZlLCAweDIzLCAweDJlLCAweGQwLCAweDk3LCAweDcyLCAweDZhLCAweDVlLAorCTB4ODcsIDB4ZTQsIDB4ZjYsIDB4N2EsIDB4ZjMsIDB4ZTcsIDB4MmEsIDB4YWQsIDB4NWYsIDB4ZTgsIDB4ZTksIDB4ZjcsCisJMHg1YiwgMHg5OSwgMHgzMSwgMHhjYiwgMHhmNywgMHhmMSwgMHhhOCwgMHg3YywgMHhiOSwgMHg2ZSwgMHhlNiwgMHgxMiwKKwkweDVhLCAweDhmLCAweDE0LCAweDZlLCAweDQwLCAweDVjLCAweGE5LCAweGQwLCAweDNmLCAweGZhLCAweGFmLCAweDExLAorCTB4Y2IsIDB4MDYsIDB4ZmMsIDB4NTgsIDB4ZjYsIDB4MTMsIDB4YzgsIDB4OWUsIDB4YjksIDB4ZTcsIDB4ZjAsIDB4ZmIsCisJMHhlYiwgMHgzMSwgMHhmZSwgMHg0ZiwgMHgxYSwgMHgzMywgMHhmMiwgMHgwNSwgMHhlNiwgMHg5YiwgMHgzZCwgMHhiYSwKKwkweDhhLCAweGRmLCAweDE2LCAweDczLCAweDQxLCAweDIxLCAweDljLCAweGVlLCAweDk2LCAweGMyLCAweDVlLCAweDI5LAorCTB4ODQsIDB4ZDIsIDB4ZjQsIDB4MjMsIDB4ZmEsIDB4NDYsIDB4ODcsIDB4NGYsIDB4NzcsIDB4OTAsIDB4M2IsIDB4ZjgsCisJMHg3NywgMHg0YywgMHgxNywgMHg4YiwgMHg3MywgMHg5MCwgMHgyNywgMHgyYSwgMHhlNCwgMHhlMywgMHhiZCwgMHg0MCwKKwkweDI3LCAweDc4LCAweDQ2LCAweDIyLCAweDllLCAweGNkLCAweDRkLCAweDIzLCAweDY2LCAweDUyLCAweGE2LCAweGVkLAorCTB4ZjYsIDB4YzIsIDB4NTgsIDB4MmEsIDB4MDksIDB4ZGQsIDB4NjIsIDB4MmMsIDB4MTUsIDB4MjMsIDB4OTQsIDB4N2UsCisJMHg1MCwgMHhiMywgMHhlYiwgMHg1ZiwgMHhkNCwgMHg2YywgMHhjOCwgMHhjZSwgMHg4NiwgMHhlYywgMHg2YywgMHhjOCwKKwkweDJlLCAweDAzLCAweGQ5LCAweDY1LCAweDliLCAweGE0LCAweDg3LCAweGI0LCAweDc4LCAweGViLCAweDNiLCAweGRlLAorCTB4ZmEsIDB4YTAsIDB4YjMsIDB4NWYsIDB4ZjIsIDB4Y2EsIDB4YzcsIDB4YzksIDB4MmYsIDB4NjIsIDB4YjIsIDB4OGEsCisJMHgwNywgMHg5MywgMHg5YSwgMHgxNywgMHgwZiwgMHhiOCwgMHhkZSwgMHgxNCwgMHg5ZSwgMHhiZiwgMHgxYiwgMHg3OSwKKwkweGNlLCAweGQ2LCAweDc1LCAweDZiLCAweDRiLCAweDI2LCAweDBiLCAweDZkLCAweDMyLCAweDI5LCAweGI5LCAweDk0LAorCTB4MTEsIDB4ZTcsIDB4ZDMsIDB4OTcsIDB4NWQsIDB4ZTgsIDB4M2QsIDB4OTAsIDB4Y2IsIDB4MzQsIDB4NjgsIDB4ZTgsCisJMHgyNCwgMHhlZiwgMHgzZSwgMHgxZiwgMHg1YywgMHhiZiwgMHhjZiwgMHg1ZiwgMHhmZiwgMHhkMywgMHg1OCwgMHg5MywKKwkweGJlLCAweGJiLCAweGQzLCAweGJlLCAweGRjLCAweDkzLCAweGI5LCAweGY0LCAweGQ3LCAweGYxLCAweDgzLCAweDVhLAorCTB4MDIsIDB4MzEsIDB4ZmEsIDB4NDUsIDB4ZjgsIDB4ZGEsIDB4YzUsIDB4NTAsIDB4NWMsIDB4YmUsIDB4N2YsIDB4ZWIsCisJMHg2YiwgMHhhOCwgMHgyZiwgMHhhNCwgMHg3MCwgMHg2MywgMHhiYSwgMHg5NSwgMHgwOCwgMHhhNywgMHhkZiwgMHg2YiwKKwkweDJkLCAweDhjLCAweDIxLCAweDdlLCAweGE2LCAweGNkLCAweDc4LCAweDI2LCAweDM0LCAweDJhLCAweDJmLCAweDM1LAorCTB4ODcsIDB4ZTUsIDB4M2IsIDB4NGQsIDB4NGIsIDB4ZmUsIDB4YTgsIDB4OTksIDB4OTAsIDB4M2YsIDB4NmMsIDB4MGUsCisJMHhjOCwgMHhiNywgMHg5YiwgMHg3MSwgMHhmOSwgMHg1NiwgMHgzMywgMHhhOCwgMHg0NSwgMHhlMiwgMHhiNCwgMHhhNSwKKwkweDVlLCAweGE3LCAweGI5LCAweDUzLCAweDNkLCAweDA0LCAweDNiLCAweGM3LCAweDVhLCAweDk5LCAweGIxLCAweDcwLAorCTB4MmUsIDB4OTQsIDB4NTYsIDB4MzUsIDB4YzIsIDB4Y2MsIDB4ZDEsIDB4ZjIsIDB4ZTMsIDB4MmQsIDB4ZGQsIDB4YjIsCisJMHgwYSwgMHhiYSwgMHhkZSwgMHgzMywgMHg2ZSwgMHhkYywgMHgyNSwgMHgzOSwgMHgzZCwgMHg4ZCwgMHgzMSwgMHg3NywKKwkweDNjLCAweGVjLCAweDk0LCAweGJiLCAweDkwLCAweDVmLCAweGEyLCAweGE4LCAweDY1LCAweDA2LCAweGE0LCAweDgwLAorCTB4NzUsIDB4MGIsIDB4Y2QsIDB4NTYsIDB4NmIsIDB4MjksIDB4ZjUsIDB4MGYsIDB4M2YsIDB4NjUsIDB4ZmMsIDB4OGQsCisJMHg3ZiwgMHhkOSwgMHgyOSwgMHhiZCwgMHhkZiwgMHg1ZSwgMHgzNywgMHg4NiwgMHhmZSwgMHhiYiwgMHg1ZiwgMHgwZiwKKwkweGExLCAweGM2LCAweGVhLCAweDU3LCAweDhiLCAweGU3LCAweGI0LCAweGY0LCAweGE4LCAweDkzLCAweDcwLCAweDM3LAorCTB4NzAsIDB4NWYsIDB4YTIsIDB4ZmQsIDB4ZDYsIDB4Y2YsIDB4NTEsIDB4ODUsIDB4YzgsIDB4ZWUsIDB4OTgsIDB4YzUsCisJMHg5YSwgMHg2YiwgMHgyNiwgMHhmYiwgMHg3OSwgMHhmYywgMHhmZiwgMHg1OCwgMHg1YSwgMHhmNiwgMHhmNCwgMHhlMSwKKwkweGZmLCAweGRlLCAweDM0LCAweDRjLCAweDJhLCAweGNkLCAweDk4LCAweGFjLCAweGI1LCAweGM1LCAweDY0LCAweGQxLAorCTB4MWMsIDB4ZTQsIDB4ZGYsIDB4MDUsIDB4ZjAsIDB4ZTQsIDB4NDAsIDB4MWUsIDB4YmYsIDB4ZDMsIDB4OGMsIDB4NmEsCisJMHhkOSwgMHhkMywgMHhmZCwgMHg1MiwgMHhhYSwgMHgzMywgMHhhZiwgMHg3MSwgMHg1ZSwgMHhkNCwgMHhhZiwgMHg3YiwKKwkweDc4LCAweGRkLCAweDgxLCAweDZiLCAweDQxLCAweGFlLCAweGY5LCAweDk0LCAweDQ4LCAweGFmLCAweGY5LCAweGEzLAorCTB4Y2YsIDB4NGIsIDB4ZGQsIDB4YWYsIDB4NWIsIDB4MjIsIDB4YjIsIDB4YWMsIDB4NmMsIDB4OGMsIDB4ZTMsIDB4YWYsCisJMHg2NSwgMHhiZiwgMHgzNiwgMHhiNCwgMHgzNSwgMHhmZSwgMHhlYywgMHhlNiwgMHhmOCwgMHgzYiwgMHhkOSwgMHg0ZiwKKwkweDZmLCAweDhlLCAweDc3LCAweDg3LCAweDNkLCAweDFlLCAweGM2LCAweGI1LCAweDk5LCAweDY2LCAweGMxLCAweDFmLAorCTB4YmIsIDB4MGMsIDB4YjksIDB4YjcsIDB4NWEsIDB4MGIsIDB4YzgsIDB4M2QsIDB4NDUsIDB4ZWIsIDB4MzIsIDB4ZWEsCisJMHgyNCwgMHhjNiwgMHg5ZiwgMHhlYiwgMHg4OSwgMHgzNywgMHhkYiwgMHg2MiwgMHg4ZCwgMHg5MSwgMHgwOSwgMHg1MSwKKwkweDlmLCAweDUxLCAweGYxLCAweGQ2LCAweGU0LCAweGZkLCAweDRlLCAweGM0LCAweDlkLCAweGNiLCAweGY4LCAweGNlLAorCTB4M2MsIDB4MTcsIDB4YzQsIDB4M2MsIDB4Y2UsIDB4ZTEsIDB4ZjMsIDB4NmYsIDB4NWYsIDB4NDMsIDB4ZTcsIDB4MzEsCisJMHhlOCwgMHhmYywgMHhmZiwgMHgxYiwgMHhkZCwgMHhlMiwgMHg0ZiwgMHhlOSwgMHg1NiwgMHhjNSwgMHg5ZCwgMHg5NywKKwkweGI2LCAweGQ5LCAweDJjLCAweGU5LCAweGVmLCAweGY2LCAweDY5LCAweDk2LCAweDY4LCAweDM4LCAweDZkLCAweDM4LAorCTB4MGIsIDB4ZDYsIDB4OGQsIDB4MTIsIDB4NDEsIDB4MGQsIDB4NGIsIDB4OWIsIDB4MmQsIDB4MzUsIDB4YmYsIDB4OGIsCisJMHhlNywgMHg5OSwgMHgyNywgMHgyNSwgMHgxYSwgMHg0OSwgMHhkMywgMHgyZSwgMHhkNiwgMHgwNywgMHgzMiwgMHhkNiwKKwkweDMxLCAweGE3LCAweGU2LCAweDFlLCAweDczLCAweGNlLCAweDJhLCAweDNiLCAweDU5LCAweGJmLCAweGM5LCAweGFiLAorCTB4Y2QsIDB4N2YsIDB4NzQsIDB4MTMsIDB4NmEsIDB4NzMsIDB4M2MsIDB4Y2YsIDB4OTgsIDB4Y2IsIDB4ZjEsIDB4NDYsCisJMHg0ZiwgMHhjNiwgMHg2MiwgMHgwZSwgMHg1YSwgMHg3MiwgMHg4YSwgMHhmOCwgMHgyYywgMHhhOCwgMHhiOSwgMHhhZiwKKwkweDBlLCAweDcwLCAweDZlLCAweDY3LCAweDNhLCAweDc2LCAweGQzLCAweDhmLCAweGYxLCAweGJmLCAweDIzLCAweGZkLAorCTB4Y2UsIDB4NGQsIDB4MTcsIDB4MmMsIDB4YWUsIDB4M2IsIDB4NzUsIDB4ZDMsIDB4NTksIDB4YjUsIDB4NDYsIDB4MTgsCisJMHhmMSwgMHg4YywgMHhmMywgMHgyZSwgMHhkZiwgMHhjNCwgMHg2NywgMHg5ZiwgMHg0NCwgMHgxYywgMHgzZiwgMHhlMSwKKwkweDQyLCAweDk3LCAweGVlLCAweDhiLCAweDRlLCAweDFlLCAweDlmLCAweDM5LCAweGQyLCAweDU0LCAweGUxLCAweDdkLAorCTB4ZTMsIDB4ZTYsIDB4OGMsIDB4MTUsIDB4NTYsIDB4ZjksIDB4ZjYsIDB4NGIsIDB4OTgsIDB4NzMsIDB4MDQsIDB4NzMsCisJMHgwZSwgMHhiYiwgMHgwMSwgMHgzZiwgMHhlYSwgMHhiZSwgMHg5MywgMHhjNSwgMHhmZCwgMHhjMywgMHg2NSwgMHhjMywKKwkweDcxLCAweGNhLCAweGU2LCAweDM4LCAweDZhLCAweDhlLCAweGY4LCAweDcxLCAweGU0LCAweGUzLCAweDFjLCAweDcyLAorCTB4YTAsIDB4MmQsIDB4ZTYsIDB4NzAsIDB4NDEsIDB4ZDIsIDB4NWQsIDB4OTMsIDB4YTgsIDB4ZTUsIDB4NTYsIDB4OTAsCisJMHg0ZiwgMHg1MCwgMHg4NywgMHhhNCwgMHhhYSwgMHgzMiwgMHhkOCwgMHg5NSwgMHgzOSwgMHhhZCwgMHhjMywgMHgzZSwKKwkweGVmLCAweDgwLCAweGJkLCAweDFhLCAweDhlLCAweDllLCAweDQ0LCAweDVjLCAweDQ3LCAweGRjLCAweDVjLCAweGE4LAorCTB4NTgsIDB4NWEsIDB4YjYsIDB4M2MsIDB4NjgsIDB4OTQsIDB4ZTQsIDB4NTYsIDB4NTksIDB4MzcsIDB4Y2MsIDB4ZjgsCisJMHhhNCwgMHhlYywgMHg5MiwgMHg2YywgMHgxOCwgMHhmMywgMHg4NiwgMHgzZiwgMHgyZSwgMHhiOSwgMHhiOCwgMHg4NiwKKwkweGQ4LCAweDcwLCAweDAzLCAweGUyLCAweDE2LCAweGViLCAweGU0LCAweGY2LCAweDE4LCAweGZhLCAweDBiLCAweDExLAorCTB4ZWIsIDB4OGIsIDB4MjEsIDB4YzYsIDB4OWUsIDB4NGUsIDB4OGIsIDB4NzUsIDB4M2YsIDB4ZTcsIDB4ZWQsIDB4OTIsCisJMHg4ZCwgMHgwZiwgMHhjYywgMHg3YiwgMHhiNywgMHg2ZCwgMHg1ZSwgMHhmYiwgMHhmOCwgMHg3YiwgMHgxOCwgMHhkZiwKKwkweDI1LCAweDE3LCAweDQxLCAweDQ3LCAweDM4LCAweDM5LCAweDI2LCAweDI1LCAweGYwLCAweDEwLCAweDM5LCAweGQ1LAorCTB4NmEsIDB4NWQsIDB4MDAsIDB4M2YsIDB4M2EsIDB4ZjgsIDB4MmYsIDB4NTYsIDB4NTksIDB4MGIsIDB4ODQsIDB4YTQsCisJMHg2YSwgMHhlMCwgMHg5ZSwgMHhkYiwgMHg2YSwgMHhkNSwgMHgxMCwgMHg0NiwgMHhmNSwgMHg1NSwgMHhkMiwgMHgxYywKKwkweDk1LCAweDQ5LCAweDc3LCAweDQ4LCAweGVjLCAweDA2LCAweGU1LCAweDYwLCAweGMyLCAweGViLCAweGZlLCAweGFjLAorCTB4MmIsIDB4N2IsIDB4ODYsIDB4MzksIDB4MTMsIDB4MTYsIDB4YjEsIDB4ZmEsIDB4ZTcsIDB4NWQsIDB4MTksIDB4ZTQsCisJMHgzZSwgMHg3ZCwgMHhmNSwgMHg2MiwgMHg1NywgMHgxNiwgMHg3YSwgMHgwZiwgMHhhZCwgMHhmZSwgMHhlNywgMHgyZSwKKwkweGU3LCAweDM0LCAweGU5LCAweDBhLCAweDIxLCAweGY3LCAweGRkLCAweDIyLCAweDQ1LCAweGEzLCAweDI1LCAweGRmLAorCTB4NDQsIDB4OGQsIDB4NTAsIDB4MWMsIDB4NDYsIDB4MmUsIDB4ODMsIDB4MTcsIDB4ZTgsIDB4YTAsIDB4YmIsIDB4NjAsCisJMHg0OCwgMHhiNCwgMHgzYiwgMHhmZCwgMHg3ZCwgMHhkMCwgMHgzNywgMHgwNiwgMHhkOSwgMHhlYywgMHhjMiwgMHg5YywKKwkweDEwLCAweGM2LCAweDg3LCAweGYwLCAweGJmLCAweDdkLCAweGZjLCAweDhkLCAweDJlLCAweGU0LCAweDA1LCAweGM0LAorCTB4NjAsIDB4ODksIDB4NjYsIDB4YzYsIDB4N2EsIDB4YjAsIDB4ZmUsIDB4ZjcsIDB4MzAsIDB4OGUsIDB4MDksIDB4YzksCisJMHhjZCwgMHhmMSwgMHgyNywgMHhiYywgMHhmMSwgMHhiNywgMHg0MSwgMHgwYiwgMHg5ZiwgMHg2MywgMHg4ZCwgMHgyMiwKKwkweGQxLCAweGI5LCAweDMxLCAweDAzLCAweDM0LCAweDcwLCAweDZlLCAweDRjLCAweGNkLCAweDc1LCAweGNlLCAweGQwLAorCTB4MDYsIDB4MGMsIDB4YTcsIDB4NjYsIDB4ZGQsIDB4MmMsIDB4ZDksIDB4ZTUsIDB4N2UsIDB4OTksIDB4NWMsIDB4ZWUsCisJMHg5MywgMHgwMywgMHhjYiwgMHhlNiwgMHg0YywgMHg5NSwgMHhkOCwgMHgwZiwgMHgzYywgMHgwYiwgMHhlYSwgMHgzMCwKKwkweDdkLCAweDU1LCAweDIwLCAweDAxLCAweDMzLCAweDdlLCAweDQ0LCAweDA2LCAweGUzLCAweDVmLCAweDkyLCAweDVmLAorCTB4YjYsIDB4OTAsIDB4ZWYsIDB4OTEsIDB4ZWIsIDB4N2IsIDB4MjQsIDB4YWMsIDB4ZDYsIDB4ODksIDB4MDcsIDB4N2IsCisJMHhkMiwgMHg0NiwgMHhiNywgMHhlZCwgMHhlYiwgMHg5YywgMHhiOSwgMHhkNiwgMHhiYSwgMHg3MCwgMHhmZSwgMHhkNSwKKwkweGY4LCAweDU1LCAweGViLCAweGZlLCAweDg1LCAweGJmLCAweGFlLCAweDgxLCAweDc1LCAweDA3LCAweGIwLCAweDI2LAorCTB4NzksIDB4MzQsIDB4YmIsIDB4MjYsIDB4NGUsIDB4OGIsIDB4ZGQsIDB4MDksIDB4ZmEsIDB4OWMsIDB4ZTQsIDB4OGQsCisJMHhjMCwgMHg4NiwgMHhmZCwgMHg3MiwgMHg2MiwgMHg5OSwgMHhmMSwgMHg0MiwgMHhmYSwgMHhmMSwgMHgxOSwgMHg4ZCwKKwkweDQ4LCAweDcyLCAweGY4LCAweDFjLCAweGVhLCAweGFlLCAweDA5LCAweGI1LCAweDg2LCAweDU3LCAweDkzLCAweGU5LAorCTB4YWIsIDB4MjksIDB4ZDQsIDB4YzQsIDB4M2YsIDB4MDUsIDB4M2QsIDB4YWMsIDB4MTUsIDB4YzgsIDB4NzMsIDB4MTgsCisJMHhmYywgMHhhNiwgMHg1MCwgMHg4YiwgMHgxMSwgMHg0NywgMHhiNSwgMHgxZSwgMHhjZiwgMHhhNCwgMHhmMCwgMHhmZCwKKwkweDVjLCAweGEyLCAweDJiLCAweDhiLCAweDk4LCAweDA4LCAweGZmLCAweGJlLCAweDM5LCAweGE0LCAweDcyLCAweDE4LAorCTB4ZjUsIDB4MzIsIDB4ZGEsIDB4NDUsIDB4M2MsIDB4ODMsIDB4ZTcsIDB4YTEsIDB4MjcsIDB4Y2EsIDB4NjgsIDB4YmMsCisJMHhjYiwgMHhhOSwgMHg1MCwgMHg0NiwgMHgwMiwgMHg3YSwgMHgyYywgMHhkOCwgMHg2NCwgMHg1OCwgMHg2MSwgMHgyOSwKKwkweDdkLCAweGQ1LCAweGM2LCAweGJjLCAweGI3LCAweDQyLCAweGFjLCAweDc3LCAweDMzLCAweDE2LCAweGJmLCAweDIzLAorCTB4ZTYsIDB4YWMsIDB4NGUsIDB4NjEsIDB4MmUsIDB4YmYsIDB4ZGYsIDB4ODUsIDB4NzUsIDB4MDcsIDB4ODcsIDB4OGIsCisJMHhkMiwgMHgzMSwgMHg3YywgMHgxOCwgMHhmMSwgMHg0ZSwgMHgxZiwgMHgxYiwgMHgwMSwgMHg2ZCwgMHhiNCwgMHhmMywKKwkweDE2LCAweGIwLCAweGMwLCAweDZmLCAweDgxLCAweDFmLCAweGY4LCAweDQ2LCAweGQyLCAweDkyLCAweGY5LCAweDI1LAorCTB4Y2EsIDB4NTUsIDB4M2UsIDB4MGUsIDB4MWUsIDB4YzAsIDB4N2YsIDB4MTIsIDB4NzEsIDB4OGQsIDB4M2MsIDB4NzAsCisJMHg2ZiwgMHg0MSwgMHg4ZSwgMHhiZSwgMHg1YiwgMHhmMiwgMHg0YiwgMHg1MSwgMHg1NSwgMHhlYiwgMHhkYiwgMHgwNiwKKwkweGY3LCAweGQ3LCAweDM0LCAweDNkLCAweGRkLCAweDBkLCAweDFkLCAweDkzLCAweGI3LCAweDFjLCAweDY4LCAweDdiLAorCTB4MGMsIDB4NzksIDB4ODAsIDB4YmMsIDB4OTEsIDB4MmYsIDB4ZmEsIDB4Y2EsIDB4MjgsIDB4ZmMsIDB4ODQsIDB4ZjQsCisJMHhmYiwgMHhiNiwgMHhhNywgMHhhZCwgMHgyMywgMHhhNiwgMHhhOCwgMHgzOCwgMHg5OCwgMHhjYSwgMHgyMCwgMHhiMCwKKwkweGJkLCAweGQ0LCAweDFjLCAweDk3LCAweDNmLCAweDZlLCAweDhlLCAweGM5LCAweDc3LCAweDliLCAweDI5LCAweGU0LAorCTB4YzAsIDB4NTEsIDB4ZTQsIDB4YzAsIDB4NjEsIDB4ZTQsIDB4NDAsIDB4MGIsIDB4MzksIDB4MzAsIDB4ODEsIDB4MWMsCisJMHgzOCwgMHg4MCwgMHgxYywgMHgxOCwgMHg0NywgMHg5YywgMHgxNCwgMHgzOSwgMHhhMSwgMHhmMiwgMHg2ZCwgMHgyYywKKwkweDBhLCAweGNjLCAweDFkLCAweGI1LCAweDliLCAweDBlLCAweDc4LCAweDk5LCAweGMxLCAweDVlLCAweGIzLCAweGUwLAorCTB4ZWIsIDB4NTAsIDB4ZDcsIDB4NDQsIDB4NjUsIDB4MWMsIDB4MzEsIDB4ZDcsIDB4NDIsIDB4M2MsIDB4NGEsIDB4MjAsCisJMHhkZiwgMHg4YywgMHgwMSwgMHg2YiwgMHg4OSwgMHg2YywgMHgyYywgMHgyNSwgMHgxMCwgMHgxMywgMHg1YiwgMHhlMiwKKwkweDAwLCAweDEzLCAweDk3LCAweDhjLCAweDE0LCAweDllLCAweGRkLCAweGFiLCAweGVjLCAweDMzLCAweDk0LCAweGJlLAorCTB4M2IsIDB4MmMsIDB4ZGQsIDB4YTMsIDB4OTIsIDB4MmYsIDB4OWYsIDB4YzQsIDB4NTgsIDB4MWMsIDB4ZWIsIDB4NzUsCisJMHgyMSwgMHgyZiwgMHgzMSwgMHgyZSwgMHgzMCwgMHgwNiwgMHgyYywgMHgzOSwgMHhiZiwgMHg2YiwgMHhkMSwgMHhkNywKKwkweGJhLCAweGI1LCAweGNjLCAweGU5LCAweDgyLCAweDMwLCAweDk2LCAweDIzLCAweDBmLCAweGMwLCAweDFlLCAweDM4LAorCTB4MzYsIDB4ODksIDB4ZTcsIDB4ZjgsIDB4ZmQsIDB4MmYsIDB4ZmQsIDB4OTgsIDB4ZjksIDB4YjEsIDB4NGUsIDB4ODEsCisJMHhkMSwgMHhiZSwgMHhjNCwgMHg5YywgMHg2NywgMHg2MSwgMHgzZCwgMHhiNywgMHhkZCwgMHg0ZiwgMHg5ZiwgMHg0NywKKwkweGFkLCAweDE0LCAweGRjLCAweDI3LCAweGFlLCAweDY2LCAweDNmLCAweGUxLCAweDI0LCAweDY4LCAweDFlLCAweDA0LAorCTB4YmUsIDB4NDcsIDB4NmQsIDB4NzUsIDB4YjAsIDB4OGEsIDB4ZWYsIDB4ZWQsIDB4ZjMsIDB4NWQsIDB4Y2MsIDB4NTcsCisJMHg2MywgMHg1MSwgMHgyMywgMHg2ZCwgMHhiMSwgMHg5ZSwgMHg0MywgMHhhYywgMHgzYywgMHg4NiwgMHhiOCwgMHg2OCwKKwkweDNiLCAweGZhLCAweDVhLCAweDAzLCAweDdjLCAweDQyLCAweDhlLCAweDY1LCAweGRiLCAweDA5LCAweDBmLCAweGJkLAorCTB4ZDYsIDB4N2EsIDB4ZDYsIDB4MWEsIDB4OTYsIDB4ODksIDB4YjUsIDB4MzEsIDB4YzksIDB4YWUsIDB4MGQsIDB4YzYsCisJMHhjZiwgMHg0YiwgMHhkNywgMHg2NSwgMHg1YiwgMHg1ZSwgMHg2YiwgMHg5NSwgMHg1YywgMHhmMywgMHhhNCwgMHgwZCwKKwkweGJiLCAweGRjLCAweGI3LCAweGRmLCAweDkwLCAweDFhLCAweDMwLCAweGRjLCAweGJlLCAweGZkLCAweDlkLCAweGFjLAorCTB4ZTksIDB4NWYsIDB4MTQsIDB4M2QsIDB4MjEsIDB4OTksIDB4NDUsIDB4NWIsIDB4YzYsIDB4ZjYsIDB4MDcsIDB4YjUsCisJMHhlNywgMHgyZiwgMHgzYiwgMHhhNCwgMHgxYiwgMHg2MywgMHg2YiwgMHgwOSwgMHhjYywgMHg2MSwgMHhkZCwgMHhhZiwKKwkweGZhLCAweDI3LCAweGUwLCAweDU5LCAweGYzLCAweDllLCAweDUxLCAweDM5LCAweDhmLCAweDk4LCAweDE5LCAweGJjLAorCTB4MzcsIDB4NmQsIDB4ZTcsIDB4ZmMsIDB4MjIsIDB4NzAsIDB4MGQsIDB4ZTQsIDB4OTksIDB4NTksIDB4MjQsIDB4ZWUsCisJMHhkYSwgMHgwNSwgMHgzOSwgMHg0NSwgMHg2MCwgMHgyMywgMHhkNCwgMHhmZCwgMHgyMCwgMHg5ZSwgMHg2ZCwgMHhjOSwKKwkweDU3LCAweDUzLCAweGI0LCAweDg3LCAweGM3LCAweDIwLCAweDRiLCAweGFjLCAweDE1LCAweDBlLCAweGY4LCAweGY5LAorCTB4OWEsIDB4Y2MsIDB4MmQsIDB4NTEsIDB4N2UsIDB4NzEsIDB4ZDQsIDB4OTYsIDB4ZGMsIDB4NWIsIDB4YTIsIDB4NWQsCisJMHhlOSwgMHhhYiwgMHhlYiwgMHg0NiwgMHhkYiwgMHhkOSwgMHg1OCwgMHhjNCwgMHhmYSwgMHg0MywgMHhjNCwgMHhkOCwKKwkweDg4LCAweGQ1LCAweDY1LCAweGY2LCAweDA2LCAweDU4LCAweDUzLCAweDFkLCAweDgwLCAweDRlLCAweGE2LCAweDE1LAorCTB4ZTYsIDB4Y2UsIDB4ZDQsIDB4NTMsIDB4NjIsIDB4OWQsIDB4NjIsIDB4YWMsIDB4OTIsIDB4NDQsIDB4YzgsIDB4MjIsCisJMHhiZSwgMHgxNywgMHg0MywgMHg0ZiwgMHhjZiwgMHhlMiwgMHgxZSwgMHhlNSwgMHhjOSwgMHg1YSwgMHgxZiwgMHhmNywKKwkweDU3LCAweGZmLCAweGEzLCAweGQyLCAweDQ5LCAweDA4LCAweGJhLCAweGNiLCAweGVmLCAweDY3LCAweDExLCAweDIyLAorCTB4NGIsIDB4YTEsIDB4MzQsIDB4NjIsIDB4ZTAsIDB4MTgsIDB4NzksIDB4NTAsIDB4N2IsIDB4YTMsIDB4OWUsIDB4YTQsCisJMHhkZiwgMHg4MSwgMHg2NywgMHhkOCwgMHg0NiwgMHg1YiwgMHg1ZCwgMHhhOSwgMHhmZSwgMHg0YSwgMHg5NSwgMHgwOCwKKwkweDZjLCAweDU5LCAweDBhLCAweDkxLCAweDM0LCAweDc4LCAweDFhLCAweGMzLCAweDc3LCAweDM4LCAweGZmLCAweDA5LAorCTB4ZTgsIDB4ZjMsIDB4MmMsIDB4OWUsIDB4NWYsIDB4MDAsIDB4NWYsIDB4MWIsIDB4NjUsIDB4ZDIsIDB4OWQsIDB4NGMsCisJMHgxYywgMHg1NywgMHhiZSwgMHg4YiwgMHg2YiwgMHg5NywgMHhiNSwgMHhjYywgMHhkNywgMHhlNCwgMHhiYywgMHhlMiwKKwkweGVmLCAweDEzLCAweGFjLCAweDlkLCAweGExLCAweGE3LCAweGViLCAweGUxLCAweDZmLCAweGYyLCAweDNhLCAweGY5LAorCTB4ZjMsIDB4ZDYsIDB4NjcsIDB4Y2UsIDB4Y2EsIDB4NTgsIDB4MDksIDB4YzksIDB4OTYsIDB4NWYsIDB4NmEsIDB4ODUsCisJMHgyZCwgMHgyYiwgMHgzZSwgMHhlZiwgMHhlYiwgMHgzMSwgMHhlYiwgMHg0NiwgMHg0MSwgMHgwNywgMHhmYiwgMHgwMCwKKwkweGZiLCAweDk1LCAweDJlLCAweDQxLCAweDA3LCAweDZkLCAweGE3LCAweDEwLCAweDRkLCAweDNmLCAweDJlLCAweDJiLAorCTB4NGIsIDB4ZmYsIDB4NTQsIDB4NmEsIDB4NGIsIDB4MDUsIDB4YTksIDB4MmYsIDB4ZmQsIDB4MjMsIDB4MzksIDB4YjcsCisJMHhkNCwgMHg5MiwgMHgwYiwgMHgyOSwgMHgxNSwgMHg5MywgMHhhYywgMHgwZSwgMHhlNSwgMHhjZiwgMHg3MiwgMHhhMywKKwkweDg3LCAweDA3LCAweDkzLCAweGUzLCAweDk3LCAweDIwLCAweGMwLCAweDk1LCAweGFhLCAweDQ3LCAweGZiLCAweDU0LAorCTB4MWIsIDB4ZWQsIDB4MTcsIDB4NjAsIDB4NmIsIDB4YWYsIDB4NTgsIDB4YTQsIDB4N2YsIDB4NGMsIDB4NmEsIDB4NjUsCisJMHhkMiwgMHhmZSwgMHhhMCwgMHhhMiwgMHhmZCwgMHhjMCwgMHgyNiwgMHhlZCwgMHg5MiwgMHgwYiwgMHg1OSwgMHhhNCwKKwkweDdmLCAweDI3LCAweGRhLCAweDgxLCAweGYzLCAweGZiLCAweDQ5LCAweDdmLCAweDAyLCAweGNmLCAweDdlLCAweGQwLAorCTB4ZmUsIDB4NmEsIDB4ZWUsIDB4NmIsIDB4YWQsIDB4OGQsIDB4NzIsIDB4NDQsIDB4ZDEsIDB4MWMsIDB4NGEsIDB4OGYsCisJMHg0MSwgMHgzZSwgMHhhZiwgMHhiNSwgMHhkNiwgMHg1ZCwgMHhmYSwgMHgxMSwgMHhiZSwgMHhiYiwgMHhmNywgMHgyMCwKKwkweDQ2LCAweGY1LCAweDYxLCAweGFmLCAweDVlLCAweGM5LCAweGNmLCAweDQ2LCAweDExLCAweDI3LCAweGM3LCAweGExLAorCTB4ZGIsIDB4MmUsIDB4ZTUsIDB4ODcsIDB4MDgsIDB4MTcsIDB4ZDAsIDB4ZDksIDB4MzQsIDB4ZTYsIDB4MWYsIDB4YTIsCisJMHhiZiwgMHgyOSwgMHhiOSwgMHgzOCwgMHg5MCwgMHg0YiwgMHhiMSwgMHg5YywgMHg4ZSwgMHhhMCwgMHhmZSwgMHhjNywKKwkweDNlLCAweDg2LCAweDkzLCAweDczLCAweGY5LCAweGNjLCAweDAwLCAweDYyLCAweDFhLCAweGZmLCAweDdmLCAweDY0LAorCTB4N2IsIDB4MjgsIDB4MjAsIDB4ZDYsIDB4NDIsIDB4ZTcsIDB4M2QsIDB4OTAsIDB4MWYsIDB4ZTgsIDB4MTgsIDB4OWIsCisJMHg0MSwgMHg2ZSwgMHg0ZCwgMHgwZSwgMHhkNywgMHg1NCwgMHg3ZiwgMHg5MSwgMHg3MSwgMHhlNSwgMHgyOCwgMHhmMiwKKwkweGU5LCAweDIxLCAweDdjLCAweGJjLCAweGZkLCAweDI2LCAweDlhLCAweGRjLCAweDczLCAweDNiLCAweDRmLCAweDQ1LAorCTB4NzcsIDB4N2QsIDB4MmYsIDB4MDEsIDB4NTIsIDB4YTYsIDB4YzksIDB4N2QsIDB4MGIsIDB4MTIsIDB4NGEsIDB4ODcsCisJMHhiMCwgMHgyZiwgMHhjNywgMHg3YSwgMHgxMCwgMHg2MywgMHgwNiwgMHhhMiwgMHhkOSwgMHhlNiwgMHhjZiwgMHgzMSwKKwkweDRlLCAweDVmLCAweDY2LCAweDdjLCAweDBmLCAweDY4LCAweDFmLCAweGM1LCAweDlhLCAweDhjLCAweGJiLCAweDYzLAorCTB4ZTAsIDB4OTksIDB4MzUsIDB4MjYsIDB4ZTMsIDB4MjYsIDB4ZjIsIDB4NDgsIDB4ZTMsIDB4NDcsIDB4Y2MsIDB4MmQsCisJMHhmOCwgMHgzZSwgMHhlMCwgMHg3ZiwgMHhlNywgMHg3ZCwgMHg4OSwgMHhkZSwgMHg5YywgMHgzNiwgMHhhYiwgMHgwNSwKKwkweDMxLCAweGIxLCAweDI3LCAweDc0LCAweDZlLCAweGM1LCAweGE1LCAweGQ4LCAweDMwLCAweDVmLCAweDIwLCAweDY2LAorCTB4ZDQsIDB4MjksIDB4ODMsIDB4MzUsIDB4Y2EsIDB4ODksIDB4ZmQsIDB4MjcsIDB4ZDQsIDB4N2YsIDB4YjUsIDB4ZTcsCisJMHgyMSwgMHg4ZiwgMHhhOCwgMHhlYywgMHhiNSwgMHgwZSwgMHgyMiwgMHhhNiwgMHg4MCwgMHhmZSwgMHhjYSwgMHgxOCwKKwkweDc4LCAweDYzLCAweDhmLCAweDY2LCAweDEwLCAweGY5LCAweDJiLCAweDA0LCAweDIxLCAweGEwLCAweDk2LCAweDVhLAorCTB4MGIsIDB4YzksIDB4YmQsIDB4ZTEsIDB4MTEsIDB4YTMsIDB4MjgsIDB4OGYsIDB4NDYsIDB4NTgsIDB4MzYsIDB4MTcsCisJMHhkNiwgMHg5OCwgMHgwNywgMHhjMiwgMHhiMiwgMHhiMCwgMHgyNiwgMHg3MiwgMHg2OSwgMHg5MSwgMHg3MSwgMHg0NSwKKwkweGZkLCAweDQxLCAweGU2LCAweDg2LCAweDMzLCAweDhmLCAweDNjLCAweDViLCAweDVhLCAweDYyLCAweDhjLCAweDYxLAorCTB4OWMsIDB4YjgsIDB4MDEsIDB4YmEsIDB4NDgsIDB4N2UsIDB4ZTMsIDB4YWIsIDB4YzgsIDB4NDksIDB4YTUsIDB4ZjIsCisJMHgyMCwgMHg2MiwgMHhhNiwgMHhhYywgMHhlYiwgMHg5MCwgMHgyOSwgMHg3MiwgMHgxOSwgMHg2YiwgMHhkNCwgMHgxZCwKKwkweGZhLCAweDMyLCAweDQxLCAweDRmLCAweDI2LCAweDJhLCAweGM1LCAweDQ1LCAweGY2LCAweDYzLCAweGEyLCAweGEwLAorCTB4ODUsIDB4MzUsIDB4NzYsIDB4NDgsIDB4ZDUsIDB4M2YsIDB4MzcsIDB4YTgsIDB4ZDgsIDB4Y2EsIDB4ZmYsIDB4ZTEsCisJMHhiNiwgMHg3ZCwgMHg5MywgMHgyNywgMHhmNywgMHhlOSwgMHg4YywgMHg2MywgMHgzNywgMHg4YiwgMHgzZCwgMHg2MywKKwkweDc3LCAweDFkLCAweGE4LCAweDc0LCAweDQ4LCAweGI1LCAweDhmLCAweDc2LCAweDQ5LCAweGZkLCAweGJmLCAweGEwLAorCTB4NjIsIDB4ZWQsIDB4MDIsIDB4NzgsIDB4MmEsIDB4MmUsIDB4MTIsIDB4ZTMsIDB4ODYsIDB4MzEsIDB4MmYsIDB4ZTYsCisJMHhjZiwgMHhhMywgMHg1YywgMHhmZiwgMHg4OSwgMHhjYywgMHhlZCwgMHg3ZiwgMHgxNywgMHg3NCwgMHg3OSwgMHg3MSwKKwkweDJkLCAweGJmLCAweDFmLCAweGYxLCAweDc2LCAweDQ2LCAweDk3LCAweDNiLCAweGVmLCAweDFhLCAweGM3LCAweGIzLAorCTB4Y2MsIDB4ODEsIDB4ZWYsIDB4ZjgsIDB4NzgsIDB4OTIsIDB4NjMsIDB4ZWMsIDB4NjEsIDB4ODEsIDB4YmUsIDB4MTUsCisJMHgwMywgMHhmZiwgMHhmYiwgMHhhNCwgMHhiMCwgMHgxMiwgMHg4NSwgMHgxYywgMHg5MCwgMHg0YiwgMHg2YiwgMHhkZSwKKwkweDVhLCAweGFjLCAweDc3LCAweDRmLCAweDQyLCAweDQ3LCAweGZhLCAweGE5LCAweGE4LCAweDQ0LCAweDRlLCAweGY1LAorCTB4NDksIDB4ZjgsIDB4ZWIsIDB4ZGQsIDB4ZDIsIDB4ZjEsIDB4ZjUsIDB4MjEsIDB4MDksIDB4N2QsIDB4ZGQsIDB4NjQsCisJMHg0ZSwgMHg0ZiwgMHg5YywgMHg4MCwgMHhiZSwgMHhlNiwgMHg2NSwgMHg1YywgMHg5ZSwgMHg0NCwgMHhkZSwgMHg2MiwKKwkweDVlLCAweDU3LCAweDc2LCAweDZhLCAweGY0LCAweDRiLCAweDA4LCAweDA1LCAweGFiLCAweGZlLCAweDhjLCAweDJkLAorCTB4OGYsIDB4ZWUsIDB4ZmYsIDB4ODUsIDB4ZWEsIDB4MzMsIDB4MDEsIDB4YzMsIDB4OGIsIDB4ZmUsIDB4ZmMsIDB4OTQsCisJMHhkOCwgMHhjZCwgMHg3NywgMHgyMSwgMHg2YiwgMHhjMywgMHg3OSwgMHhlZCwgMHhkNiwgMHhhMCwgMHhhNiwgMHgxYywKKwkweDU2LCAweGZkLCAweGMyLCAweDQ3LCAweGY3LCAweDdiLCAweDM1LCAweDI1LCAweGYwLCAweGI4LCAweGU2LCAweGE4LAorCTB4OWEsIDB4MTIsIDB4ZjEsIDB4MzUsIDB4Y2MsIDB4NzksIDB4ZmQsIDB4YTIsIDB4NjMsIDB4YWYsIDB4YmMsIDB4MGMsCisJMHg0MiwgMHg0ZiwgMHhiNywgMHg4OCwgMHg3ZCwgMHgwOCwgMHg3ZSwgMHhmMSwgMHg5YywgMHgyYywgMHhlOSwgMHg2OSwKKwkweDRkLCAweGFkLCAweDE5LCAweDdhLCAweDg2LCAweDcxLCAweDhhLCAweGYxLCAweDhiLCAweDM2LCAweDllLCAweDRjLAorCTB4MTQsIDB4NjEsIDB4N2YsIDB4YTEsIDB4ZTcsIDB4MTksIDB4YTMsIDB4M2MsIDB4ZGIsIDB4OWUsIDB4NjgsIDB4OGIsCisJMHg3NSwgMHgwYiwgMHg5NSwgMHg3YiwgMHhhMCwgMHg0MywgMHhkNCwgMHhmMiwgMHgxNiwgMHhlMiwgMHg5YywgMHg4MSwKKwkweDVjLCAweDZlLCAweGYxLCAweGRhLCAweGViLCAweGUxLCAweGU1LCAweDYzLCAweDMxLCAweDc1LCAweDVkLCAweGFjLAorCTB4N2EsIDB4MTgsIDB4ZGMsIDB4NWIsIDB4OWYsIDB4NzUsIDB4MDcsIDB4NjIsIDB4NGMsIDB4OTMsIDB4NzQsIDB4NzAsCisJMHhkZiwgMHgwMSwgMHgwOSwgMHgzZCwgMHgxNywgMHg5MywgMHhmMCwgMHg3MywgMHhiNCwgMHgzZiwgMHgzMywgMHhlMSwKKwkweDQwLCAweDdlLCAweDBiLCAweDE2LCAweDMxLCAweGQwLCAweDBhLCAweGIwLCAweGM1LCAweGNkLCAweGEyLCAweGFmLAorCTB4MGMsIDB4YzAsIDB4NzcsIDB4Y2MsIDB4NzgsIDB4NTUsIDB4OTIsIDB4MTIsIDB4YWEsIDB4NDUsIDB4ZTUsIDB4YWQsCisJMHg0NSwgMHgzMywgMHg0MSwgMHg3YiwgMHgzOSwgMHg2YiwgMHg2MSwgMHhiYywgMHhkOSwgMHg3NSwgMHg3OSwgMHg1ZCwKKwkweDUxLCAweGMxLCAweGIxLCAweDJmLCAweDg3LCAweDgwLCAweDE5LCAweDg2LCAweDZkLCAweGJkLCAweDQ3LCAweDVlLAorCTB4ODcsIDB4YmUsIDB4NzMsIDB4NmEsIDB4ZWMsIDB4NjYsIDB4YWMsIDB4MGIsIDB4MWEsIDB4OWUsIDB4MzMsIDB4YzEsCisJMHgwMywgMHhkNywgMHhmZCwgMHgxZSwgMHhkNiwgMHg1NCwgMHhmOCwgMHhjYSwgMHhkOSwgMHg2MCwgMHg0ZCwgMHhiYSwKKwkweDQ4LCAweGRiLCAweGVkLCAweDgzLCAweGRkLCAweGUxLCAweGJhLCAweGQ5LCAweDIxLCAweGI5LCAweGQ5LCAweDg0LAorCTB4ZTgsIDB4OGIsIDB4OWYsIDB4OTEsIDB4YzEsIDB4ZmQsIDB4YmEsIDB4YzcsIDB4OGYsIDB4ZTIsIDB4OTEsIDB4NjMsCisJMHhlYywgMHhjNywgMHhkZCwgMHhhZSwgMHhmYywgMHg1MSwgMHg1ZiwgMHg4MywgMHhjZCwgMHgzYywgMHg0OCwgMHgxZCwKKwkweDIzLCAweGY3LCAweDIzLCAweDhmLCAweDMxLCAweDhlLCAweDg1LCAweDkwLCAweGM3LCAweGIyLCAweDRkLCAweDRmLAorCTB4ZWYsIDB4ZDUsIDB4MDcsIDB4ZmIsIDB4ZTUsIDB4YzksIDB4ZTcsIDB4NjgsIDB4NGYsIDB4YjgsIDB4YjcsIDB4NjksCisJMHg1MywgMHg0MSwgMHgwZiwgMHg5OCwgMHhmNywgMHgyYywgMHgzOSwgMHhmOSwgMHg2YywgMHg1MCwgMHg3MywgMHhiMCwKKwkweGJlLCAweDMyLCAweGUzLCAweDA3LCAweGMwLCAweDhmLCAweDdlLCAweDI3LCAweGUzLCAweDgxLCAweGFlLCAweDZjLAorCTB4MzcsIDB4NmYsIDB4NTksIDB4NWUsIDB4ZGQsIDB4NTEsIDB4NDksIDB4YjAsIDB4MmYsIDB4NmUsIDB4YjAsIDB4NGUsCisJMHhiMywgMHhlMywgMHg5ZSwgMHhiYywgMHg4YiwgMHgxOCwgMHgyYiwgMHgzNSwgMHg2NywgMHgxMSwgMHhhMywgMHgyMywKKwkweDcyLCAweDcxLCAweGQ2LCAweDg2LCAweGVlLCAweDNmLCAweDBiLCAweGJhLCAweDBlLCAweDc1LCAweDExLCAweDIzLAorCTB4NWYsIDB4OWMsIDB4NzUsIDB4NzAsIDB4N2QsIDB4NDgsIDB4ZDUsIDB4NjYsIDB4YTEsIDB4M2IsIDB4NjEsIDB4YzcsCisJMHhjZCwgMHg3ZSwgMHhmYSwgMHg5MSwgMHhhZiwgMHhhNywgMHg4NCwgMHg1NiwgMHg1YywgMHgzMiwgMHhiNSwgMHgxMiwKKwkweDYyLCAweGY2LCAweDY0LCAweDhhLCAweDM5LCAweGJlLCAweDUzLCAweGY1LCAweDRkLCAweGQ5LCAweGFmLCAweGM5LAorCTB4MmIsIDB4YmMsIDB4YjAsIDB4NGYsIDB4MmIsIDB4NTYsIDB4MTksIDB4ZTcsIDB4MGIsIDB4ZjEsIDB4MGUsIDB4MjEsCisJMHgwZSwgMHgxMSwgMHhhZCwgMHg2NiwgMHg1MSwgMHgyNywgMHg5YSwgMHg5YywgMHg1NywgMHhiZCwgMHg1OCwgMHgxMSwKKwkweGM3LCAweDNkLCAweDQyLCAweDE5LCAweDY4LCAweGY1LCAweGVhLCAweDNlLCAweGFkLCAweDUwLCAweDBkLCAweGM5LAorCTB4YzUsIDB4MTgsIDB4ZTksIDB4NGUsIDB4YTgsIDB4ZmEsIDB4N2QsIDB4YmYsIDB4YjIsIDB4YjUsIDB4MWUsIDB4ZTQsCisJMHgxMiwgMHhkOCwgMHg0YywgMHhlYSwgMHg5MywgMHhkOCwgMHg1NywgMHg4ZCwgMHhjMSwgMHhhNiwgMHhhOCwgMHg3YiwKKwkweGVhLCAweDVkLCAweGM1LCAweDQ4LCAweDVmLCAweGY3LCAweDNiLCAweGU1LCAweDRjLCAweGQwLCAweDUxLCAweDI2LAorCTB4N2UsIDB4ZWYsIDB4ZjQsIDB4ZjEsIDB4ZmIsIDB4YTIsIDB4NWYsIDB4MGYsIDB4M2QsIDB4MjYsIDB4YWMsIDB4NTMsCisJMHgxNiwgMHgyYSwgMHhhNCwgMHgwNSwgMHhmMSwgMHhkNiwgMHhkZCwgMHhjOSwgMHg5NiwgMHgyOCwgMHg0NywgMHgyZiwKKwkweGE2LCAweDFjLCAweDQ1LCAweDFkLCAweGEzLCAweGFmLCAweDE5LCAweGJlLCAweDBkLCAweGYwLCAweDZmLCAweDE0LAorCTB4ZjcsIDB4YmMsIDB4NWEsIDB4YWEsIDB4ZDgsIDB4OGMsIDB4YzAsIDB4ZGYsIDB4YTcsIDB4MjEsIDB4MjMsIDB4ZWEsCisJMHgwNiwgMHhmYSwgMHg1YiwgMHhlMywgMHg5OSwgMHgwYSwgMHhmNCwgMHhiNywgMHhmNiwgMHhmMiwgMHhmYiwgMHg3NiwKKwkweDFmLCAweDYzLCAweGRlLCAweGIwLCAweDNjLCAweDg5LCAweGYxLCAweDEzLCAweDY3LCAweDQ4LCAweGNmLCAweGI4LAorCTB4OGYsIDB4YzcsIDB4MTIsIDB4OTAsIDB4MDksIDB4NjMsIDB4ZmMsIDB4YTgsIDB4YmMsIDB4ZDUsIDB4NzAsIDB4MTQsCisJMHhmZSwgMHhkYiwgMHhiNywgMHg3ZiwgMHg0NiwgMHhlNiwgMHhkZCwgMHg1OSwgMHhlMCwgMHgzZiwgMHhjOCwgMHhkZiwKKwkweDQ4LCAweGMwLCAweDNmLCAweGUzLCAweDJhLCAweDNlLCAweDFlLCAweGZlLCAweDY4LCAweDM1LCAweDQ5LCAweGQ4LAorCTB4Y2IsIDB4ZDksIDB4ZjcsIDB4NWUsIDB4NjcsIDB4Y2UsIDB4ZGUsIDB4MGQsIDB4ZmMsIDB4ZjUsIDB4OTEsIDB4ZDYsCisJMHgwZiwgMHg3OSwgMHhlYiwgMHhmZiwgMHgxNywgMHhlOCwgMHhlYSwgMHg3MywgMHhkOCwgMHgyMywgMHgwYSwgMHhmYSwKKwkweGZhLCAweDI5LCAweGQzLCAweDBmLCAweDdiLCAweDRlLCAweGY3LCAweDllLCAweGJiLCAweGZmLCAweDNhLCAweGU5LAorCTB4MzIsIDB4YTQsIDB4MDEsIDB4OGMsIDB4NTAsIDB4NTAsIDB4NzksIDB4OTQsIDB4YjUsIDB4NjIsIDB4YzQsIDB4ZDcsCisJMHhkZiwgMHgzMSwgMHg2MCwgMHg2NywgMHhhZSwgMHgxYiwgMHhjNCwgMHhkZSwgMHg0ZSwgMHgyOSwgMHhmNCwgMHgwNSwKKwkweGY1LCAweDI3LCAweDYyLCAweGY2LCAweGU2LCAweDc4LCAweDUwLCAweGNmLCAweGYyLCAweGY5LCAweDk0LCAweDkzLAorCTB4MmYsIDB4YjMsIDB4NGYsIDB4YzgsIDB4NWMsIDB4YzAsIDB4MzEsIDB4NjUsIDB4ODcsIDB4MWYsIDB4NDIsIDB4YjcsCisJMHgwOSwgMHhjZiwgMHgyMCwgMHhkZCwgMHhmNywgMHgyOSwgMHhiYSwgMHgxZCwgMHg0NSwgMHgzNywgMHhmZCwgMHg4YiwKKwkweDY3LCAweDNhLCAweGVjLCAweGEzLCAweDA1LCAweDdkLCAweDMzLCAweGFlLCAweDA3LCAweDRjLCAweDAwLCAweDdkLAorCTB4N2YsIDB4MTcsIDB4M2EsIDB4ZmUsIDB4NGUsIDB4MDUsIDB4OTgsIDB4YTAsIDB4MDIsIDB4NGMsIDB4ODAsIDB4M2QsCisJMHhiZSwgMHgwZCwgMHgxZCwgMHg3ZiwgMHhhYiwgMHgwMiwgMHg0YywgMHg1MCwgMHg4OSwgMHhmYiwgMHgzZCwgMHgwYSwKKwkweDliLCAweDk4LCAweGZlLCAweDIzLCAweGRhLCAweDZlLCAweGQwLCAweDkzLCAweGI5LCAweGRhLCAweDJlLCAweDM5LAorCTB4Y2UsIDB4ZjksIDB4MDEsIDB4MzYsIDB4OGUsIDB4YzIsIDB4OGUsIDB4NzgsIDB4NmUsIDB4MTEsIDB4ZjQsIDB4M2IsCisJMHhmYywgMHgxYywgMHhkMSwgMHhlMCwgMHhiOSwgMHgwMCwgMHg3MiwgMHg0NCwgMHg4MywgMHhlNywgMHgxOCwgMHgyMywKKwkweGYxLCAweDEwLCAweDMwLCAweDYxLCAweDQ4LCAweGUyLCAweGMyLCAweDVlLCAweGVmLCAweGRjLCAweDE4LCAweGQ2LAorCTB4MWEsIDB4MWQsIDB4ODQsIDB4MjcsIDB4NzUsIDB4YTgsIDB4YmUsIDB4ZDYsIDB4NzEsIDB4ZDUsIDB4NmYsIDB4NDAsCisJMHg1YywgMHhhOCwgMHgwNiwgMHhiNSwgMHg1YiwgMHg1MiwgMHgyNiwgMHg5NiwgMHg4OCwgMHgzMywgMHg2NSwgMHhhZiwKKwkweDllLCAweDg2LCAweDBlLCAweDVjLCAweDYyLCAweGMzLCAweGNkLCAweGJlLCAweGY0LCAweDcwLCAweDFkLCAweDdiLAorCTB4MTYsIDB4MmQsIDB4OGYsIDB4YmUsIDB4ZTMsIDB4ZWUsIDB4ZDYsIDB4MzMsIDB4MDcsIDB4MTAsIDB4OWYsIDB4YTcsCisJMHhjYSwgMHgwOSwgMHg5OSwgMHgyYywgMHg3YiwgMHg5OCwgMHgwMCwgMHhmNSwgMHhjZiwgMHg1NSwgMHhmZCwgMHg1MSwKKwkweDliLCAweDdhLCAweDgwLCAweGZlLCAweDM2LCAweDZkLCAweDIzLCAweDcxLCAweDNlLCAweDQ1LCAweDE5LCAweDUzLAorCTB4ZmYsIDB4ZDMsIDB4YWEsIDB4NjcsIDB4N2QsIDB4YTAsIDB4ZWUsIDB4ZjUsIDB4ZTUsIDB4MjcsIDB4OTUsIDB4MmQsCisJMHg4NCwgMHgxOSwgMHg2NywgMHhhOCwgMHgzZiwgMHhjZiwgMHg4NywgMHg2MSwgMHgxNywgMHg3OSwgMHgzNywgMHg5MCwKKwkweDRiLCAweDNiLCAweDFlLCAweGY5LCAweGJjLCAweDI2LCAweGQ2LCAweDRlLCAweGUzLCAweGI5LCAweGI2LCAweGYxLAorCTB4Y2QsIDB4ZmIsIDB4M2UsIDB4YmQsIDB4ODgsIDB4N2QsIDB4OWIsIDB4M2QsIDB4MDYsIDB4YzYsIDB4YTksIDB4YWQsCisJMHhmMSwgMHgxMCwgMHhlYSwgMHg4NywgMHhiMCwgMHhiYSwgMHg4ZiwgMHgxOCwgMHhkZSwgMHg4OCwgMHg0OSwgMHhiNiwKKwkweDYxLCAweDg5LCAweDUzLCAweGU1LCAweDNjLCAweGY2LCAweDJkLCAweDE4LCAweDhmLCAweDllLCAweDkwLCAweGVjLAorCTB4NTIsIDB4YWYsIDB4ZTQsIDB4NjIsIDB4NjYsIDB4Y2EsIDB4OTYsIDB4YmYsIDB4MjcsIDB4MWIsIDB4Y2IsIDB4ODUsCisJMHgwNCwgMHhjZiwgMHgwZCwgMHgwYiwgMHgzMywgMHgxYSwgMHg5ZSwgMHg3YiwgMHgxOCwgMHhkNywgMHhhNCwgMHhkOSwKKwkweDkyLCAweGMzLCAweDY1LCAweGU2LCAweDlkLCAweDkxLCAweDc4LCAweDAzLCAweGY3LCAweDcyLCAweGIzLCAweGVjLAorCTB4ZDUsIDB4NTQsIDB4NjEsIDB4OTMsIDB4NjYsIDB4YTIsIDB4OGEsIDB4NzgsIDB4ZjAsIDB4NzIsIDB4OTksIDB4ZmIsCisJMHgwMSwgMHgxYiwgMHg5NSwgMHhkOSwgMHhjZiwgMHgwOSwgMHhlZSwgMHgzZiwgMHgwMSwgMHgxYywgMHg4OCwgMHg1OCwKKwkweDFkLCAweGYzLCAweGU3LCAweDI4LCAweDVlLCAweDZkLCAweDIzLCAweDJjLCAweDgxLCAweGFlLCAweDNiLCAweDY1LAorCTB4ZGQsIDB4OGYsIDB4YmIsIDB4YjUsIDB4YjIsIDB4ZDcsIDB4NDcsIDB4MzksIDB4NGIsIDB4N2EsIDB4ZGMsIDB4ZmYsCisJMHhkNSwgMHg1YSwgMHg4ZiwgMHhhMSwgMHgxNiwgMHhkYSwgMHhlNCwgMHhmNSwgMHg4ZiwgMHhiOSwgMHg4ZiwgMHg4MSwKKwkweGIwLCAweDJiLCAweDI3LCAweGRjLCAweDQwLCAweDI2LCAweGJjLCAweGNmLCAweDMxLCAweDllLCAweDhkLCAweGI2LAorCTB4NWEsIDB4NjcsIDB4YWQsIDB4ZjYsIDB4OWUsIDB4ZGYsIDB4ZjUsIDB4ZjQsIDB4Y2MsIDB4ZGUsIDB4YjgsIDB4MmQsCisJMHg2MywgMHhiZCwgMHhlNiwgMHhhMCwgMHgyNiwgMHhmNiwgMHg3YiwgMHg2NiwgMHg4NywgMHg0NiwgMHhiYywgMHg5ZSwKKwkweGQ5LCAweGZjLCAweGM4LCAweGY2LCAweDllLCAweGQ5LCAweGNmLCAweDZmLCAweGYzLCAweDdhLCAweDY2LCAweDE3LAorCTB4OWQsIDB4MjIsIDB4M2UsIDB4NWUsIDB4Y2YsIDB4NmMsIDB4ZjgsIDB4NzYsIDB4YWYsIDB4NjcsIDB4ZjYsIDB4ZjAsCisJMHhlZCwgMHg1ZSwgMHhjZiwgMHhlYywgMHg5MSwgMHgxMSwgMHhhZiwgMHg2NywgMHhmNiwgMHhmYiwgMHhiNywgMHg2ZiwKKwkweGVmLCAweDk5LCAweDNkLCAweDM2LCAweGIyLCAweGJkLCAweDY3LCAweDI2LCAweDEzLCAweGM4LCAweDc3LCAweDEzLAorCTB4NWIsIDB4M2QsIDB4YjMsIDB4ZjIsIDB4YzgsIDB4YjUsIDB4N2IsIDB4NjYsIDB4YWYsIDB4MDYsIDB4NzgsIDB4MWQsCisJMHhmYywgMHg4YywgMHg4MSwgMHg4NywgMHgxNCwgMHhmMCwgMHhmYSwgMHgyOCwgMHhmMCwgMHhmYSwgMHhhZiwgMHhlYiwKKwkweDU5LCAweDg3LCAweGMxLCAweGU3LCAweGNkLCAweDdlLCAweDVlLCAweGI4LCAweDFlLCAweGRjLCAweDdlLCAweGJiLAorCTB4ZmYsIDB4OGMsIDB4YTAsIDB4ZGUsIDB4NGQsIDB4ZjgsIDB4YjUsIDB4MGEsIDB4YjEsIDB4ZmIsIDB4MWUsIDB4YmYsCisJMHg2NiwgMHhmYiwgMHg2YiwgMHhkMSwgMHhhZCwgMHhmMywgMHhlYywgMHhmNiwgMHhmZiwgMHgzNywgMHhhMCwgMHhmNCwKKwkweDBlLCAweGYwLCAweDNjLCAweGY5LCAweDc5LCAweDBkLCAweGI1LCAweDFmLCAweGY5LCAweDQ3LCAweGEyLCAweGVmLAorCTB4YmUsIDB4ZTgsIDB4N2MsIDB4ZDUsIDB4MjIsIDB4YzYsIDB4N2YsIDB4MWMsIDB4YmUsIDB4NmEsIDB4ZWYsIDB4MGQsCisJMHhjOSwgMHgzYSwgMHhmYywgMHg5NiwgMHgzOSwgMHhlYSwgMHhhNCwgMHg2NCwgMHgzMSwgMHgzZiwgMHhhYiwgMHhlNiwKKwkweDI3LCAweDI2LCAweGI2LCAweGU2LCAweGE3LCAweDI2LCAweGJlLCAweGFhLCAweDZhLCAweDUyLCAweGYzLCAweDVmLAorCTB4ZTMsIDB4ZjMsIDB4MGQsIDB4NjUsIDB4ZGYsIDB4OTYsIDB4ODcsIDB4ZTEsIDB4OWQsIDB4NGEsIDB4ODAsIDB4YjcsCisJMHhjMiwgMHgzZSwgMHg3NiwgMHgzNiwgMHgxYywgMHhkYiwgMHg5ZCwgMHhjMCwgMHgzMywgMHhlNiwgMHg4YiwgMHhiNiwKKwkweDM0LCAweDE0LCAweDdlLCAweDBmLCAweGE1LCAweGNkLCAweDE3LCAweDczLCAweGFhLCAweDVlLCAweDMzLCAweDljLAorCTB4YmMsIDB4MWIsIDB4ZDQsIDB4ZGYsIDB4YTgsIDB4YTEsIDB4ODYsIDB4MDYsIDB4ZDUsIDB4ZjksIDB4OWIsIDB4YmUsCisJMHgzNiwgMHg4YywgMHgzYywgMHhkNiwgMHg1ZSwgMHg2MywgMHhiMywgMHhhZSwgMHhkNiwgMHhmZCwgMHhiYSwgMHhkYSwKKwkweDkwLCAweGJiLCAweGY3LCAweGI3LCAweDYzLCAweDczLCAweDk5LCAweGY4LCAweDViLCAweDBhLCAweDliLCAweGVmLAorCTB4NDIsIDB4NmQsIDB4NGUsIDB4ZWMsIDB4NGQsIDB4MWMsIDB4NDMsIDB4MGMsIDB4NDEsIDB4N2MsIDB4Y2UsIDB4N2UsCisJMHgwMSwgMHhlYiwgMHgxOSwgMHhlNiwgMHg0NiwgMHhkNiwgMHgzNywgMHgzMSwgMHg3YywgMHhmOCwgMHhiZSwgMHg0MSwKKwkweDgwLCAweGQxLCAweDNiLCAweGZjLCAweGY4LCAweGNlLCAweGJhLCAweDI4LCAweGMwLCAweDJhLCAweDc3LCAweDc1LAorCTB4N2IsIDB4YjUsIDB4ZDEsIDB4MmUsIDB4Y2QsIDB4YWIsIDB4M2YsIDB4MTMsIDB4ZmUsIDB4OWMsIDB4ZjAsIDB4MjYsCisJMHgxNiwgMHgwZSwgMHg2ZiwgMHg2MiwgMHhlMSwgMHg2ZCwgMHhlNywgMHgzMCwgMHhhMiwgMHhkZSwgMHg2ZCwgMHg1MCwKKwkweGU3LCAweDM5LCAweDNjLCAweGRmLCAweDExLCAweDRkLCAweDRmLCAweGYzLCAweDhjLCAweDA3LCAweDM4LCAweGM3LAorCTB4ZTIsIDB4OTksIDB4MGYsIDB4N2QsIDB4ZTksIDB4NDEsIDB4MmQsIDB4NWIsIDB4MzcsIDB4MTAsIDB4ZWYsIDB4OTksCisJMHg3ZiwgMHg5MCwgMHg2YiwgMHhjYiwgMHhjMSwgMHhkOSwgMHg2MiwgMHhhMCwgMHgyNywgMHhjYSwgMHg4ZSwgMHg2MywKKwkweDdmLCAweGFhLCAweGExLCAweGU2LCAweDRkLCAweDQ1LCAweGFjLCAweDQzLCAweGEwLCAweDY1LCAweDBhLCAweGZmLAorCTB4MDMsIDB4OTksIDB4ZGUsIDB4YTMsIDB4NzIsIDB4NWYsIDB4MjcsIDB4NmMsIDB4ZjYsIDB4NzgsIDB4ODUsIDB4ZDgsCisJMHhmNSwgMHg3MSwgMHg2OSwgMHhmOCwgMHhmOCwgMHg3NSwgMHg2NSwgMHhjOSwgMHhjMywgMHhhZSwgMHhlMSwgMHhlZCwKKwkweGQ4LCAweDM1LCAweGI1LCAweDIxLCAweDFlLCAweDhkLCAweDA3LCAweDc2LCAweGE0LCAweGQxLCAweDcwLCAweDVlLAorCTB4MTksIDB4MjIsIDB4NjYsIDB4MjUsIDB4OWQsIDB4Y2MsIDB4M2QsIDB4ZDMsIDB4ODgsIDB4ODEsIDB4Y2MsIDB4MzksCisJMHhjYywgMHgzNywgMHhjNCwgMHhhNSwgMHhkNywgMHhhMiwgMHg0ZiwgMHg4ZCwgMHgxZCwgMHhlZCwgMHhiMCwgMHhhMiwKKwkweGY4LCAweGNjLCAweDgzLCAweDhlLCAweDE5LCAweDNjLCAweDkzLCAweDk2LCAweDg1LCAweGQzLCAweDVmLCAweGQxLAorCTB4OWMsIDB4ZmEsIDB4M2MsIDB4ZTgsIDB4OTksIDB4NDIsIDB4YWUsIDB4YTMsIDB4MmQsIDB4MTUsIDB4MGMsIDB4Y2YsCisJMHg4ZSwgMHhkNiwgMHgxMSwgMHhmNywgMHg1ZCwgMHhjNiwgMHgwMiwgMHhkNCwgMHhhZSwgMHhhOCwgMHg0NywgMHhjYSwKKwkweDhjLCAweGJkLCAweDNjLCAweGViLCAweDBhLCAweDYyLCAweDJlLCAweGZiLCAweDI2LCAweGE4LCAweDU5LCAweDU5LAorCTB4YmIsIDB4MmUsIDB4NzIsIDB4ZGYsIDB4ZWQsIDB4YmEsIDB4YTgsIDB4YjksIDB4YzQsIDB4NWQsIDB4ODYsIDB4YjMsCisJMHhiZSwgMHg0NiwgMHhkYywgMHhmOCwgMHg1MSwgMHgzMSwgMHhhNCwgMHhlMSwgMHhiYywgMHgzYywgMHg0NCwgMHgxYywKKwkweDc5LCAweDNkLCAweGY4LCAweGQxLCAweDg0LCAweDM0LCAweGNkLCAweDE3LCAweGQ2LCAweGY1LCAweDc2LCAweGZjLAorCTB4ZTgsIDB4NjEsIDB4YzcsIDB4Y2MsIDB4ZGEsIDB4NDEsIDB4YWMsIDB4YzksIDB4ZGEsIDB4OGMsIDB4MzgsIDB4ZDEsCisJMHg0NCwgMHg5OCwgMHgxYiwgMHhjNCwgMHhiMywgMHg4MywgMHhlMCwgMHhjNywgMHhjMywgMHg4YSwgMHg1OSwgMHg2MCwKKwkweGM1LCAweGJmLCAweDAzLCAweGFjLCAweDU4LCAweDkyLCAweGY3LCAweGEyLCAweGM0LCAweDhhLCAweGI2LCAweDhmLAorCTB4MTUsIDB4MWQsIDB4ZDgsIDB4NzEsIDB4N2UsIDB4OWIsIDB4MWQsIDB4NmIsIDB4YWEsIDB4MDcsIDB4YzUsIDB4N2IsCisJMHg3OSwgMHg2MCwgMHhiZCwgMHhlYywgMHhhMiwgMHg3OSwgMHgxZCwgMHhmOCwgMHg1MCwgMHg5MywgMHg5OCwgMHgzYSwKKwkweGFmLCAweDBmLCAweGI3LCAweGFkLCAweDE5LCAweGUwLCAweGMwLCAweDdkLCAweDBhLCAweGRmLCAweGRkLCAweDU3LAorCTB4ZDksIDB4ODUsIDB4ZGEsIDB4NDQsIDB4ZTEsIDB4M2QsIDB4ZmYsIDB4OWMsIDB4MmYsIDB4N2MsIDB4ZDUsIDB4ZDksCisJMHg2NywgMHhiOCwgMHhlZCwgMHhlYywgMHg3MywgMHgwYiwgMHgxNywgMHhlMiwgMHgzOSwgMHhiZiwgMHhjNywgMHgxNywKKwkweDgxLCAweGRlLCAweGZlLCAweDA3LCAweDY5LCAweDgyLCAweDVmLCAweGQxLCAweDA3LCAweDM0LCAweGNmLCAweDRmLAorCTB4YjYsIDB4ZTEsIDB4YzMsIDB4ZmYsIDB4N2EsIDB4MTUsIDB4M2UsIDB4NDQsIDB4Y2UsIDB4NWEsIDB4ODksIDB4NDksCisJMHgwNiwgMHhkOCwgMHhkMCwgMHg1ZSwgMHhlMywgMHg1YSwgMHhmNCwgMHhlNSwgMHg1MSwgMHhlOSwgMHgwMCwgMHg3ZiwKKwkweDlkLCAweDhiLCAweDdkLCAweGMwLCAweDQ0LCAweGRkLCAweDEyLCAweDA1LCAweDM2LCAweDhhLCAweDI4LCAweDZjLAorCTB4MzQsIDB4NDQsIDB4MGMsIDB4MzMsIDB4N2MsIDB4MTgsIDB4OTgsIDB4YTYsIDB4YjEsIDB4ODksIDB4OGYsIDB4Y2MsCisJMHhkNCwgMHgwZiwgMHhhMCwgMHg5NywgMHg4NywgMHg5NSwgMHhhZCwgMHg4YywgMHhjYiwgMHg1MywgMHg4OCwgMHg5ZCwKKwkweDFkLCAweDZiLCAweGMwLCAweDc1LCAweDJiLCAweDFlLCAweDZlLCAweDhhLCAweDVjLCAweDg1LCAweDliLCAweDhlLAorCTB4ZWMsIDB4ODgsIDB4OWIsIDB4NTQsIDB4YmYsIDB4N2UsIDB4OWMsIDB4MzIsIDB4NzksIDB4ZGQsIDB4ZjUsIDB4ZmEsCisJMHhmNSwgMHg5NywgMHg1YywgMHhhZiwgMHg1ZiwgMHhmZiwgMHhiYSwgMHhkYiwgMHhkZSwgMHhhZiwgMHhiZiwgMHg0OSwKKwkweDhhLCAweDg2LCAweDY5LCAweDVmLCAweDk0LCAweGFiLCAweGZhLCAweGY1LCAweDMzLCAweGVjLCAweDdmLCAweDU3LAorCTB4YmIsIDB4YmMsIDB4YmUsIDB4N2MsIDB4YjcsIDB4ZGYsIDB4YWYsIDB4MzcsIDB4YTUsIDB4YjgsIDB4NmQsIDB4ZGMsCisJMHg5MCwgMHhiNywgMHhhZCwgMHhhMCwgMHg1ZiwgMHhmZiwgMHgyZiwgMHgzMCwgMHhkNiwgMHg4MywgMHgzZCwgMHhiNiwKKwkweGY3LCAweGVhLCAweDJmLCAweGI5LCAweGVjLCAweGQ1LCAweGM3LCAweDM4LCAweGNmLCAweGVmLCAweGQ1LCAweDczLAorCTB4MWUsIDB4NmEsIDB4NzgsIDB4OTcsIDB4N2QsIDB4ZmEsIDB4OWIsIDB4MjEsIDB4OGIsIDB4N2UsIDB4YzgsIDB4YTEsCisJMHg0ZiwgMHgzYSwgMHg5ZSwgMHg4YiwgMHg3MywgMHg4ZSwgMHhlYSwgMHhjZiwgMHg1ZiwgMHg3NCwgMHg2MywgMHg3OCwKKwkweGNlLCAweGViLCAweGEzLCAweDFmLCAweDg2LCAweDVkLCAweDFkLCAweGQ5LCAweGVjLCAweGNmLCAweDdiLCAweDdiLAorCTB4YmMsIDB4ZTEsIDB4NmUsIDB4NWYsIDB4N2YsIDB4ZmIsIDB4M2EsIDB4MDMsIDB4ZmUsIDB4M2EsIDB4MzEsIDB4YWMsCisJMHgxMywgMHhiZiwgMHg2YSwgMHg5ZCwgMHhhZCwgMHg3ZSwgMHhmYywgMHgxYiwgMHhhZSwgMHhkNywgMHg4YiwgMHg3NywKKwkweDRlLCAweDhiLCAweGRkLCAweDgxLCAweDk4LCAweGZjLCAweGUyLCAweGQwLCAweDhkLCAweGZlLCAweDFhLCAweDliLAorCTB4YmQsIDB4NzgsIDB4YzYsIDB4MGUsIDB4ZTAsIDB4NzUsIDB4YzYsIDB4MGYsIDB4M2UsIDB4ZmYsIDB4ZmYsIDB4YmUsCisJMHgxNywgMHhjZiwgMHgzZSwgMHhiYywgMHg3NywgMHg5ZSwgMHg0MiwgMHhmZiwgMHgwNCwgMHgyZSwgMHg3ZiwgMHhkNiwKKwkweGViLCAweGMxLCAweDRmLCAweDU0LCAweDgyLCAweGRlLCAweDNhLCAweGViLCAweGM2LCAweGUwLCAweGJkLCAweDhjLAorCTB4YzEsIDB4YzQsIDB4NzEsIDB4YTEsIDB4YWQsIDB4OTAsIDB4M2UsIDB4YWUsIDB4ZGIsIDB4MjMsIDB4NzMsIDB4MGEsCisJMHgxNywgMHhjMSwgMHhhNiwgMHg5MiwgMHhkNywgMHhjNiwgMHhjNiwgMHhiNSwgMHhjNSwgMHgwMCwgMHgxYiwgMHhjNywKKwkweDE0LCAweDM2LCAweGFlLCAweGFkLCAweDA1LCAweGQ4LCAweDM4LCAweDczLCAweDBkLCAweDZjLCAweGZjLCAweGRmLAorCTB4YmEsIDB4YmMsIDB4ZjgsIDB4MWYsIDB4OTUsIDB4ODIsIDB4YzIsIDB4YzYsIDB4ZDcsIDB4N2EsIDB4YzcsIDB4ODYsCisJMHhmNywgMHhiYSwgMHg4OSwgMHgwMywgMHhjNCwgMHgzYiwgMHgxNywgMHhlZiwgMHhiYiwgMHg4NiwgMHhhZiwgMHgwNSwKKwkweDc4LCAweDk5LCAweGI5LCAweGJlLCAweDVmLCAweDY2LCAweDllLCAweGRiLCAweGMyLCAweGNiLCAweDFlLCAweDI2LAorCTB4MzYsIDB4MTMsIDB4NDcsIDB4NTUsIDB4MmUsIDB4MDQsIDB4M2UsIDB4NjgsIDB4YjIsIDB4ZWYsIDB4N2QsIDB4NDgsCisJMHhkOSwgMHg2ZSwgMHhhOSwgMHgzMiwgMHhhYiwgMHg3MCwgMHg1OSwgMHgxZSwgMHhiNSwgMHg2ZCwgMHg1MSwgMHhlMSwKKwkweDYwLCAweDYyLCAweGUwLCAweDJlLCAweDkxLCAweGJlLCAweDIwLCAweDE3LCAweDA1LCAweDE4LCAweDMzLCAweGVjLAorCTB4YzcsIDB4NjcsIDB4OWUsIDB4MjksIDB4YmMsIDB4MWQsIDB4Y2EsIDB4MTAsIDB4MDMsIDB4YmIsIDB4NDEsIDB4OGQsCisJMHg0MCwgMHgzOSwgMHgwZiwgMHgyMywgMHg3NiwgMHgxOSwgMHhiZSwgMHhhYywgMHgzYywgMHg5ZiwgMHhkZCwgMHhiNywKKwkweGZmLCAweDg3LCAweGVmLCAweGRiLCAweDA2LCAweGUzLCAweDVhLCAweDgwLCAweDExLCAweDUxLCAweDAzLCAweDU1LAorCTB4YzYsIDB4ZDUsIDB4YmIsIDB4MGUsIDB4MWUsIDB4NDYsIDB4ZjQsIDB4ZjAsIDB4NjEsIDB4ZDYsIDB4OWQsIDB4MDEsCisJMHg0ZSwgMHg5ZSwgMHg5NSwgMHgwOSwgMHhlMCwgMHhmMywgMHhmNSwgMHhkZiwgMHg2NSwgMHhlZiwgMHgyOSwgMHhjMCwKKwkweDQ0LCAweDM2LCAweGZlLCAweGI3LCAweGY3LCAweGEyLCAweDc4LCAweGRkLCAweGExLCAweGNlLCAweGZlLCAweGNlLAorCTB4MGYsIDB4NDUsIDB4ZGIsIDB4YzYsIDB4ZmYsIDB4M2UsIDB4ZTIsIDB4MzcsIDB4ZWEsIDB4YTEsIDB4MGEsIDB4NzMsCisJMHgxZCwgMHhiMSwgMHhkMCwgMHg2ZiwgMHg0MCwgMHgwNywgMHg2MywgMHhkNywgMHhjMCwgMHg0MiwgMHg1NywgMHhlNywKKwkweDI2LCAweGU2LCAweGNiLCAweGFkLCAweGJjLCAweGU0LCAweDZjLCAweGU2LCAweDI1LCAweGVlLCAweGYxLCAweGViLAorCTB4NzIsIDB4MjcsIDB4YzcsIDB4NmMsIDB4MjMsIDB4NjIsIDB4NGQsIDB4ZTEsIDB4MzMsIDB4OGYsIDB4N2MsIDB4YmQsCisJMHgzZCwgMHgzNywgMHhjZCwgMHg1ZCwgMHg0NywgMHg2ZSwgMHg5YSwgMHg1MCwgMHhiOSwgMHg4OSwgMHhmNCwgMHhhMiwKKwkweDllLCAweDgzLCAweDRjLCAweGJlLCAweDBiLCAweDU5LCAweDdlLCAweDA3LCAweGI0LCAweGZmLCAweDExLCAweGY4LAorCTB4ZjksIDB4NDMsIDB4NjAsIDB4YWMsIDB4NmYsIDB4MDMsIDB4NjMsIDB4N2QsIDB4YWIsIDB4ZDIsIDB4ZmUsIDB4MGUsCisJMHhjMywgMHhiOCwgMHhiMCwgMHgwZSwgMHhmNCwgMHhlYSwgMHg2NiwgMHgwZiwgMHhjMywgMHgxZiwgMHg4NiwgMHg1NywKKwkweDM1LCAweGNhLCAweDg2LCAweDMzLCAweDU3LCAweDFlLCAweDMxLCAweGU2LCAweGJkLCAweGYzLCAweGQyLCAweDQ0LAorCTB4NGUsIDB4ZDIsIDB4ODgsIDB4MTEsIDB4Y2MsIDB4MTUsIDB4ZWEsIDB4M2EsIDB4Y2UsIDB4N2UsIDB4MjUsIDB4YjEsCisJMHg0MiwgMHg1ZCwgMHhkNSwgMHg5MywgMHg0MywgMHg1MiwgMHg2ZCwgMHg3OCwgMHhmOCwgMHg2YSwgMHhlMSwgMHg4YywKKwkweGI3LCAweGM2LCAweDljLCAweDhmLCAweGFmLCAweGYyLCAweDNlLCAweGJlLCAweGNhLCAweDM1LCAweDM2LCAweDEyLAorCTB4YWMsIDB4Y2YsIDB4MTcsIDB4NTIsIDB4ZGIsIDB4MzEsIDB4ZDUsIDB4NjEsIDB4MWYsIDB4NTMsIDB4Y2QsIDB4ZmYsCisJMHgxNSwgMHgzMSwgMHgxNSwgMHhmNywgMHhjYSwgMHhlMywgMHg5OSwgMHhjOSwgMHhhNSwgMHg4NCwgMHgxYywgMHg4MCwKKwkweDdjLCAweDI3LCAweGNhLCAweGQ0LCAweDkzLCAweDY5LCAweGMzLCAweDZlLCAweDNlLCAweDQ0LCAweDU3LCAweDhlLAorCTB4ZDIsIDB4NGIsIDB4MjgsIDB4ZTksIDB4ZTksIDB4NjksIDB4MTIsIDB4N2EsIDB4OWEsIDB4ZjgsIDB4YjUsIDB4ZjUsCisJMHg4ZCwgMHgxYSwgMHgzMywgMHhkZSwgMHgxYywgMHg4YiwgMHhlMiwgMHhmMywgMHg3ZiwgMHhhYSwgMHgyMywgMHhkMiwKKwkweDRmLCAweDNkLCAweDVkLCAweDhkLCAweGI5LCAweGFlLCAweDA3LCAweDdiLCAweDZkLCAweGM3LCAweDVkLCAweGI2LAorCTB4YzIsIDB4NWQsIDB4MWQsIDB4ZmUsIDB4OWMsIDB4OTksIDB4ODksIDB4NDksIDB4ZTgsIDB4ZjAsIDB4ZGYsIDB4NjMsCisJMHhjZSwgMHg5ZiwgMHhjMCwgMHhiNywgMHg3ZSwgMHg4OCwgMHg3OCwgMHhmZCwgMHhlZiwgMHhhMCwgMHg4YiwgMHg3ZiwKKwkweDhiLCAweGRhLCAweGUwLCAweDU1LCAweGU0LCAweDlmLCAweDFmLCAweDYwLCAweDZjLCAweDBiLCAweGM3LCAweGE4LAorCTB4MzMsIDB4ZmEsIDB4ZDEsIDB4OGMsIDB4OTUsIDB4OTgsIDB4MjgsIDB4YmEsIDB4ODksIDB4MDksIDB4MGYsIDB4N2YsCisJMHhmYywgMHhlYSwgMHg2ZiwgMHg2NiwgMHhhYywgMHgyOSwgMHhiZSwgMHhjMywgMHgwMCwgMHhmOSwgMHhmZSwgMHhmOSwKKwkweGRkLCAweDczLCAweDBhLCAweDdiLCAweDA0LCAweDk4LCAweDIzLCAweDY3LCAweDczLCAweGZmLCAweDkyLCAweDliLAorCTB4OWEsIDB4YTgsIDB4ZTEsIDB4ZTMsIDB4NjEsIDB4OWIsIDB4ZWYsIDB4ZDksIDB4MWUsIDB4YjYsIDB4NTksIDB4ZmEsCisJMHhlYiwgMHhkNCwgMHhiYiwgMHg4NywgMHg2YiwgMHgxZSwgMHg0ZSwgMHhkMywgMHhhZiwgMHhlYiwgMHhjMCwgMHgxYywKKwkweDM1LCAweGY4LCAweDY0LCAweGExLCAweDY5LCAweGFiLCAweGNmLCAweGYxLCAweDhhLCAweDZkLCAweDQ2LCAweDIwLAorCTB4MWYsIDB4ZjYsIDB4NTgsIDB4NGYsIDB4ZDEsIDB4MGIsIDB4NWQsIDB4ZDMsIDB4MjgsIDB4MTMsIDB4ODEsIDB4YmEsCisJMHg2NiwgMHhmYywgMHg5ZiwgMHhmOSwgMHhkNywgMHg0ZiwgMHhmYiwgMHhkNywgMHg0ZiwgMHhmOSwgMHhkNywgMHgyNywKKwkweDkxLCAweDc3LCAweDlmLCAweDU0LCAweGI5LCAweDkzLCAweGUzLCAweDFjLCAweDgzLCAweDcyLCAweDVkLCAweGFjLAorCTB4ODUsIDB4ZjUsIDB4Y2UsIDB4OGUsIDB4ZmUsIDB4YjQsIDB4NTUsIDB4OGQsIDB4NzksIDB4ZmUsIDB4NWMsIDB4NjgsCisJMHgzYSwgMHhmOCwgMHhmYywgMHg2MywgMHg3YywgMHgwZSwgMHhlMiwgMHgzMywgMHg4ZCwgMHhjZiwgMHg2MywgMHhmOCwKKwkweDZjLCAweGNhLCAweDU0LCAweGNiLCAweDU2LCAweGE4LCAweGEzLCAweDYxLCAweGM5LCAweDYyLCAweGJjLCAweDg4LAorCTB4M2EsIDB4MzQsIDB4OTMsIDB4N2EsIDB4NDQsIDB4OGEsIDB4ZjUsIDB4OTIsIDB4OTQsIDB4OTYsIDB4MzQsIDB4ZTksCisJMHhiNiwgMHhkMiwgMHg1MiwgMHhhYSwgMHgxZiwgMHg5MywgMHhlMywgMHg0YiwgMHhkZSwgMHhiOSwgMHg2MSwgMHg1NywKKwkweGRhLCAweGM2LCAweGRjLCAweDk2LCAweDNjLCAweDljLCAweDdhLCAweDVjLCAweGY0LCAweDNiLCAweDhmLCAweDYxLAorCTB4OWUsIDB4ZTgsIDB4YzUsIDB4ZDEsIDB4ZGIsIDB4ZDQsIDB4ZjksIDB4NTgsIDB4M2QsIDB4ZTUsIDB4YzksIDB4ZjgsCisJMHg4MCwgMHg2NSwgMHg5YiwgMHhjOCwgMHg1YiwgMHhjMywgMHg0ZiwgMHg2MiwgMHhlZCwgMHg4YywgMHg3YSwgMHgzZiwKKwkweDMwLCAweDJkLCAweDI3LCAweDRlLCAweDZmLCAweGVjLCAweGY1LCAweDYyLCAweGE5LCAweDY5LCAweGJjLCAweDgxLAorCTB4NGQsIDB4ZWIsIDB4ZTAsIDB4YzMsIDB4NDYsIDB4ZWMsIDB4OWIsIDB4ODIsIDB4OWQsIDB4MWYsIDB4NzEsIDB4YzMsCisJMHhkYSwgMHgwNCwgMHg2MiwgMHhlMCwgMHg4NCwgMHhhYiwgMHg2YSwgMHgzZCwgMHhjNCwgMHgyYSwgMHhjMywgMHg0OSwKKwkweDllLCAweDhhLCAweGUxLCAweDlhLCAweGVmLCAweGQwLCAweDIwLCAweDBmLCAweDJhLCAweDViLCAweGQ5LCAweDAwLAorCTB4OGUsIDB4ZDEsIDB4NTQsIDB4YmYsIDB4YWYsIDB4YjQsIDB4NzksIDB4MGUsIDB4YTQsIDB4ZmEsIDB4ZmYsIDB4NGUsCisJMHgzMiwgMHhhOSwgMHg0YiwgMHg3ZSwgMHg4YywgMHgzOCwgMHhkNiwgMHg1NiwgMHhiOSwgMHhhOCwgMHg1MSwgMHhiNiwKKwkweDNmLCAweGMxLCAweGRhLCAweGYwLCAweDc1LCAweDYxLCAweDVlLCAweGJiLCAweDA3LCAweGYzLCAweDA2LCAweDEwLAorCTB4N2YsIDB4NzEsIDB4YWYsIDB4MDksIDB4NWUsIDB4NGUsIDB4OTMsIDB4NTcsIDB4M2UsIDB4ODMsIDB4ZGEsIDB4YjYsCisJMHhmYSwgMHg0OSwgMHhiZCwgMHhiOCwgMHhlNCwgMHhkNywgMHg0NCwgMHhhYSwgMHg3NiwgMHg0OCwgMHg0OCwgMHg3ZCwKKwkweGYzLCAweGNjLCAweGM5LCAweGViLCAweDkzLCAweGQ0LCAweGRkLCAweDAwLCAweDNiLCAweGY0LCAweDYwLCAweDBlLAorCTB4ZWIsIDB4MDgsIDB4YzgsIDB4YzgsIDB4M2IsIDB4MjcsIDB4NTMsIDB4NjcsIDB4NjQsIDB4NDUsIDB4ZjcsIDB4OTMsCisJMHg3YSwgMHg2OSwgMHgyOSwgMHg4MywgMHg3MSwgMHhmNiwgMHhhNCwgMHhmMSwgMHhiZCwgMHhhYSwgMHgyYiwgMHhlYywKKwkweDdmLCAweDMxLCAweDc0LCAweDU4LCAweDFhLCAweGQ1LCAweDE2LCAweGU4LCAweDQ1LCAweDhlLCAweGRkLCAweDdiLAorCTB4NTgsIDB4NmEsIDB4ZDUsIDB4NzksIDB4NzksIDB4YTEsIDB4YmEsIDB4YjEsIDB4MGIsIDB4ZDgsIDB4MDksIDB4MzIsCisJMHgyNSwgMHhmZCwgMHgzZCwgMHgzZSwgMHhmZCwgMHg1NCwgMHg0MSwgMHgzMCwgMHgwZSwgMHg3OSwgMHg5ZSwgMHgyZSwKKwkweGM0LCAweGJkLCAweGJhLCAweDk2LCAweGI4LCAweGVkLCAweDI0LCAweGRmLCAweDFiLCAweDhjLCAweGYzLCAweDNkLAorCTB4YmUsIDB4MjMsIDB4Y2IsIDB4YjQsIDB4YzksIDB4OGIsIDB4ZjcsIDB4MmUsIDB4NTgsIDB4OWYsIDB4OTIsIDB4MGIsCisJMHhhOSwgMHgzZCwgMHhiMiwgMHg5MSwgMHg1MiwgMHhmNSwgMHgyZiwgMHhmMSwgMHgwMSwgMHg3YywgMHhkYiwgMHgzNCwKKwkweGQ2LCAweGU1LCAweDZlLCAweDM5LCAweDAxLCAweDNmLCAweGJkLCAweDkwLCAweGNhLCAweGE5LCAweGYzLCAweDliLAorCTB4ZTMsIDB4NGQsIDB4NjIsIDB4ZmIsIDB4NzksIDB4ZDYsIDB4NTQsIDB4YjIsIDB4YWUsIDB4N2EsIDB4NjAsIDB4YWQsCisJMHhkNiwgMHg2NCwgMHg4YSwgMHhiMSwgMHhhNywgMHg0MywgMHgzNiwgMHgxNCwgMHhkNiwgMHhmMiwgMHg3YSwgMHhlMywKKwkweDFiLCAweGIzLCAweDllLCAweDZmLCAweDg0LCAweDk0LCAweGJkLCAweGZmLCAweDFiLCAweGQwLCAweDcxLCAweDBjLAorCTB4MzYsIDB4MWIsIDB4NTEsIDB4NzMsIDB4NDIsIDB4ZTksIDB4NGUsIDB4N2YsIDB4OGUsIDB4YzIsIDB4NjYsIDB4NmQsCisJMHg3MywgMHhjNiwgMHhjNywgMHgzMywgMHg5NiwgMHhmMSwgMHhhOSwgMHg4YywgMHgzNSwgMHgzNiwgMHhlMSwgMHhmNSwKKwkweDUzLCAweDRjLCAweGMzLCAweGQ2LCAweDJlLCAweGI2LCAweDgyLCAweGY3LCAweDRkLCAweGE2LCAweGUwLCAweDRmLAorCTB4MmYsIDB4NmQsIDB4NjIsIDB4NjMsIDB4MTgsIDB4ZTcsIDB4ZjMsIDB4MGIsIDB4ZDAsIDB4NmIsIDB4NTgsIDB4M2EsCisJMHg0ZSwgMHhiNSwgMHhlZSwgMHg5OSwgMHg0YiwgMHg4ZCwgMHgyNCwgMHg4ZSwgMHgwOCwgMHhkZiwgMHgzMCwgMHg2MiwKKwkweGZkLCAweDZjLCAweDgyLCAweGRhLCAweDA1LCAweGU0LCAweGMzLCAweDJiLCAweGM0LCAweDA4LCAweGMzLCAweGU3LAorCTB4ZTUsIDB4Y2EsIDB4M2QsIDB4OTksIDB4ZDQsIDB4N2UsIDB4YWQsIDB4MzYsIDB4OGIsIDB4ZWEsIDB4ZTQsIDB4ZjksCisJMHgyOSwgMHhlNiwgMHhkMywgMHhhMywgMHhlYywgMHg3ZCwgMHg4NiwgMHg0ZSwgMHhiZCwgMHhhZCwgMHgzOSwgMHg2NSwKKwkweGY1LCAweDhlLCAweDM5LCAweGY0LCAweGQyLCAweGQyLCAweGU2LCAweDIxLCAweDM3LCAweDNjLCAweDNmLCAweGMzLAorCTB4MDQsIDB4YTgsIDB4NWIsIDB4ODMsIDB4MDksIDB4NDcsIDB4NzIsIDB4ZWMsIDB4NzEsIDB4NDksIDB4N2UsIDB4NTksCisJMHhmNiwgMHg2NSwgMHgxMCwgMHg0NywgMHhlZCwgMHg5OSwgMHgwZSwgMHg5OSwgMHg2ZiwgMHgxOCwgMHhjZSwgMHhlMCwKKwkweGUyLCAweDUxLCAweGFjLCAweDMxLCAweDg3LCAweGI1LCAweGE2LCAweDUxLCAweDgzLCAweGNjLCAweDIyLCAweDI3LAorCTB4NTMsIDB4YWUsIDB4OGMsIDB4ZDUsIDB4MGYsIDB4NDMsIDB4NDYsIDB4MzcsIDB4ZjEsIDB4Y2MsIDB4NzgsIDB4M2MsCisJMHgyNywgMHhlNiwgMHg0YywgMHg0MSwgMHhhZCwgMHhmYiwgMHg5ZSwgMHg5NiwgMHgxZiwgMHhmZCwgMHgxOCwgMHg3MiwKKwkweDVhLCAweDU4LCAweDBlLCAweDI0LCAweDQ1LCAweDlmLCAweDRlLCAweDg2LCAweGRmLCAweDlmLCAweGIzLCAweDM4LAorCTB4MTYsIDB4ZTUsIDB4OTgsIDB4OGUsIDB4YjEsIDB4ZjAsIDB4ZTcsIDB4OTIsIDB4NTEsIDB4M2QsIDB4OTMsIDB4MzQsCisJMHhjNywgMHhkOSwgMHhlZiwgMHgwZCwgMHg1OSwgMHg3MywgMHgxMiwgMHg3YSwgMHhiZSwgMHhiNywgMHg0NywgMHhiYSwKKwkweGE3LCAweGE1LCAweDc3LCAweGQ1LCAweDFjLCAweDdmLCAweDFkLCAweGI0LCAweDg0LCAweDU1LCAweDZjLCAweDlmLAorCTB4MTMsIDB4ZGQsIDB4MWYsIDB4ZWYsIDB4ZDksIDB4MWMsIDB4MGYsIDB4ZmIsIDB4ZTMsIDB4ZDMsIDB4ZDIsIDB4YmQsCisJMHgzYSwgMHg2MiwgMHhiYywgMHgyOSwgMHg4NywgMHhiMSwgMHg2NiwgMHg0OCwgMHgyZSwgMHhhMSwgMHhhNiwgMHhiMSwKKwkweDg2LCAweGU2LCAweGUwLCAweDczLCAweDBmLCAweDkxLCAweDk2LCAweDgzLCAweGMwLCAweDE0LCAweGYwLCAweDA5LAorCTB4ZDQsIDB4ZDksIDB4ZDYsIDB4MjcsIDB4ZTUsIDB4NGIsIDB4NDYsIDB4OTcsIDB4ZTQsIDB4NTUsIDB4NGQsIDB4MWIsCisJMHhmNiwgMHg3YSwgMHhhNSwgMHhiMCwgMHhmMywgMHg1YiwgMHg4NywgMHhhNiwgMHg3NywgMHg3YiwgMHhmZCwgMHgwMCwKKwkweDllLCAweDY3LCAweDhjLCAweDYyLCAweGVjLCAweDRhLCAweDZiLCAweGM1LCAweGUyLCAweDE4LCAweGVmLCAweDVkLAorCTB4NjksIDB4ZDUsIDB4YWQsIDB4MTEsIDB4MjMsIDB4YWIsIDB4NDUsIDB4ZmQsIDB4NzMsIDB4ZWQsIDB4NzksIDB4YzUsCisJMHg3YiwgMHhhMSwgMHgzYSwgMHg2OCwgMHhkNCwgMHhlNCwgMHgxNiwgMHgyZCwgMHg3YiwgMHgwMywgMHhmMiwgMHg4MywKKwkweGZiLCAweDE5LCAweGNjLCAweGJkLCAweGQyLCAweGNhLCAweDU4LCAweGYzLCAweGFhLCAweDdmLCAweDVmLCAweDkzLAorCTB4ZTAsIDB4OWEsIDB4ZWIsIDB4OGMsIDB4MTgsIDB4OTMsIDB4ZWEsIDB4ZDksIDB4MTEsIDB4ZTMsIDB4ODQsIDB4ZDYsCisJMHhmZSwgMHhhYywgMHhhMSwgMHg0ZCwgMHg2ZSwgMHg3YiwgMHhiNiwgMHg1YiwgMHhjOSwgMHgyOCwgMHg2NCwgMHg3OSwKKwkweDczLCAweDRhLCAweGQ1LCAweDY5LCAweDc5LCAweGRhLCAweGU1LCAweGJjLCAweDJiLCAweGFkLCAweGFjLCAweDE1LAorCTB4ZDEsIDB4NGUsIDB4ZGMsIDB4YzAsIDB4MTgsIDB4YzgsIDB4YjksIDB4OTcsIDB4YWYsIDB4ZGEsIDB4ODcsIDB4ZDcsCisJMHhkNywgMHhkYSwgMHhlMywgMHg1ZCwgMHhkOSwgMHhiZSwgMHhjNywgMHgyZSwgMHgzNSwgMHhlNywgMHg4MiwgMHg5YSwKKwkweDEzLCAweDU2LCAweGIyLCAweGRlLCAweGJlLCAweGNmLCAweGNmLCAweDY0LCAweGZiLCAweDNlLCAweGRkLCAweDliLAorCTB4M2MsIDB4OTcsIDB4YjAsIDB4ZTYsIDB4OTMsIDB4OTgsIDB4NWIsIDB4NzYsIDB4MDcsIDB4ZTMsIDB4NzUsIDB4YjksCisJMHhkYywgMHhjYSwgMHg1YiwgMHgxNywgMHhlNSwgMHhjMiwgMHhlNiwgMHhkYSwgMHhiZiwgMHhjMiwgMHg3NSwgMHgzYiwKKwkweDRkLCAweGJmLCAweGYyLCAweDY5LCAweGU0LCAweDc3LCAweDhlLCAweDNkLCAweGFhLCAweGU0LCAweGJkLCAweGRiLAorCTB4MWEsIDB4M2MsIDB4NTgsIDB4ZDMsIDB4Y2MsIDB4ZjEsIDB4OWYsIDB4MDksIDB4NzUsIDB4NzUsIDB4NDQsIDB4YzUsCisJMHg5OCwgMHhkYiwgMHhhMCwgMHhhNywgMHg3ZCwgMHhjZiwgMHhjMCwgMHg2NywgMHg0NywgMHg2ZCwgMHgzNSwgMHhlNywKKwkweDkyLCAweDM1LCAweDJkLCAweGZiLCAweDRlLCAweDBkLCAweDFhLCAweDk3LCAweDEwLCAweGRiLCAweDljLCAweDE4LAorCTB4YWYsIDB4NTEsIDB4MmIsIDB4NTksIDB4N2MsIDB4MjcsIDB4ZmUsIDB4NGUsIDB4ZDYsIDB4MDEsIDB4ZDAsIDB4ZTUsCisJMHhlMCwgMHhmMCwgMHhjZiwgMHhlNCwgMHhhOCwgMHg5YywgMHhhOCwgMHgxYywgMHg0MywgMHgyZSwgMHg5YywgMHg5MywKKwkweGUxLCAweDY3LCAweDkwLCAweDM3LCAweDJhLCAweDA1LCAweDNjLCAweDQ5LCAweDlmLCAweGY1LCAweDcyLCAweGUwLAorCTB4OWMsIDB4N2EsIDB4Y2YsIDB4ZmMsIDB4MjQsIDB4ZWEsIDB4NjQsIDB4ZDgsIDB4NmUsIDB4NzksIDB4NzAsIDB4NzgsCisJMHgwNSwgMHhjZiwgMHhiYywgMHhhMCwgMHg3MCwgMHhhOCwgMHgyYiwgMHgwZCwgMHhmOCwgMHg0MCwgMHhlMiwgMHhmOSwKKwkweDNkLCAweGIyLCAweGZiLCAweDAxLCAweGRhLCAweDIyLCAweDMyLCAweGZkLCAweDZkLCAweDExLCAweGY1LCAweGVlLAorCTB4YmQsIDB4NmUsIDB4NzUsIDB4OGEsIDB4ZWMsIDB4YTUsIDB4ZGQsIDB4MzQsIDB4NjEsIDB4NjMsIDB4NzMsIDB4ZGUsCisJMHg5OSwgMHhkNiwgMHhiNiwgMHg2YiwgMHg3MywgMHhlNiwgMHhhMiwgMHhhYywgMHgyYSwgMHhmYiwgMHhiYiwgMHg3ZCwKKwkweGQ1LCAweGZiLCAweDNmLCAweGJhLCAweDhhLCAweDcyLCAweDM4LCAweDM5LCAweDJkLCAweDc3LCAweGFjLCAweDdhLAorCTB4ZjYsIDB4NTYsIDB4NWEsIDB4M2EsIDB4YWEsIDB4ZTQsIDB4M2EsIDB4YTcsIDB4ZTQsIDB4ZGEsIDB4OTIsIDB4YzMsCisJMHgyOSwgMHhjYSwgMHg5YywgMHhiYywgMHhmMCwgMHhiZCwgMHg0MCwgMHg0ZiwgMHgxNiwgMHhmNywgMHhmYiwgMHhmNiwKKwkweDMzLCAweGY4LCAweDBjLCAweDdmLCAweDU3LCAweDQyLCAweGQ5LCAweGIwLCAweGVlLCAweGJlLCAweDdmLCAweDM3LAorCTB4Y2YsIDB4NTksIDB4ZjcsIDB4YWQsIDB4OTIsIDB4Y2YsIDB4MWIsIDB4YjcsIDB4ZjEsIDB4ZjksIDB4MTQsIDB4NjIsCisJMHhlYSwgMHhkMCwgMHg5MCwgMHhjNywgMHhlYiwgMHhhYiwgMHg0YiwgMHgxZiwgMHhjZSwgMHhlYiwgMHgzNywgMHgzNywKKwkweDc5LCAweDBkLCAweDQ5LCAweDQzLCAweGQ1LCAweGFmLCAweDVkLCAweGJkLCAweGQyLCAweDhkLCAweGE4LCAweDA3LAorCTB4N2IsIDB4ZjgsIDB4MDksIDB4ZjYsIDB4OWEsIDB4MTIsIDB4ZDIsIDB4ZTAsIDB4ZWQsIDB4YjcsIDB4ZTEsIDB4OTIsCisJMHg5NiwgMHg4MCwgMHg3NiwgMHhkMiwgMHg3MywgMHg5ZiwgMHhhZiwgMHgyZiwgMHhlZSwgMHg3ZiwgMHg3NCwgMHhjNywKKwkweDdiLCAweDk3LCAweGM0LCAweDcwLCAweDg2LCAweDMxLCAweGE2LCAweDJiLCAweDlkLCAweDY1LCAweDdkLCAweGZmLAorCTB4OWEsIDB4MTYsIDB4NWQsIDB4ZTksIDB4Y2MsIDB4ZGUsIDB4ZDQsIDB4ZDksIDB4ZWIsIDB4ZDAsIDB4NTksIDB4NWQsCisJMHg3ZSwgMHgxMywgMHhiYywgMHhjMCwgMHg5ZiwgMHg5ZiwgMHgxOSwgMHgzMSwgMHgwZSwgMHgxMywgMHg1YiwgMHgxOCwKKwkweDVjLCAweDBmLCAweDMxLCAweGQ0LCAweGQ3LCAweDVkLCAweGM3LCAweDQ3LCAweGQwLCAweGRkLCAweDliLCAweGEyLAorCTB4ZjQsIDB4MDcsIDB4N2UsIDB4OTAsIDB4N2YsIDB4ZDQsIDB4ZjMsIDB4OGMsIDB4NjEsIDB4ZTQsIDB4YTksIDB4NDMsCisJMHhmOSwgMHgzZSwgMHg2OSwgMHg1MywgMHg2NywgMHhmYywgMHgzMywgMHg5ZSwgMHgzZSwgMHg5NSwgMHg2ZiwgMHhmYiwKKwkweGZhLCAweGNjLCAweGNkLCAweDUwLCAweDY3LCAweGU2LCAweDZlLCAweDRmLCAweDdmLCAweDlkLCAweDZhLCAweGNlLAorCTB4NjIsIDB4MzIsIDB4YTEsIDB4ZmMsIDB4ZGEsIDB4MWEsIDB4YmEsIDB4NjUsIDB4MzcsIDB4NzUsIDB4ZjgsIDB4YjQsCisJMHhlYiwgMHhmZCwgMHgyZiwgMHhiYiwgMHhkMywgMHhiMiwgMHhlOCwgMHg3ZSwgMHg5OCwgMHgxZSwgMHgzZCwgMHgxZCwKKwkweDRlLCAweDg4LCAweGU3LCAweDNmLCAweDU3LCAweGViLCAweDRmLCAweDVmLCAweDBkLCAweDJiLCAweDViLCAweDlkLAorCTB4ODAsIDB4ZWMsIDB4NGUsIDB4NTYsIDB4M2UsIDB4ZTYsIDB4ZGIsIDB4YjcsIDB4YzcsIDB4ZWIsIDB4ZDAsIDB4ODcsCisJMHhmMCwgMHg3YSwgMHhiOCwgMHgzYywgMHg2OCwgMHhiYywgMHg4ZCwgMHhiNSwgMHgyNiwgMHgxNSwgMHg4NiwgMHg4YiwKKwkweDg4LCAweGUzLCAweGYzLCAweDlhLCAweGQ4LCAweGU0LCAweDM1LCAweGEwLCAweGNkLCAweDliLCAweDk3LCAweDY1LAorCTB4NWQsIDB4ZWEsIDB4MzIsIDB4M2UsIDB4M2QsIDB4YWEsIDB4ZGUsIDB4YmYsIDB4N2YsIDB4YTMsIDB4Y2MsIDB4YjgsCisJMHgwYywgMHhjYywgMHgxMywgMHhlYiwgMHg5MywgMHg0YiwgMHg4ZCwgMHg4NCwgMHg1YywgMHgyMiwgMHg5NiwgMHgxOCwKKwkweGMzLCAweDdmLCAweGY3LCAweDk4LCAweDlmLCAweDliLCAweGEzLCAweGYyLCAweDY2LCAweGI5LCAweGJkLCAweDU2LAorCTB4MWMsIDB4OTUsIDB4ZDcsIDB4Y2IsIDB4NDEsIDB4YmQsIDB4NDgsIDB4MmMsIDB4Y2IsIDB4ZmMsIDB4M2YsIDB4MjcsCisJMHg2ZiwgMHgyZCwgMHgwZCwgMHhjYSwgMHhmYSwgMHgwYywgMHhmMiwgMHhmOCwgMHgxMCwgMHg2NSwgMHgzMCwgMHg2MiwKKwkweDdjLCAweDQ2LCAweGZkLCAweGJlLCAweGUyLCAweDRhLCAweGViLCAweGJjLCAweDg1LCAweDc1LCAweDk3LCAweDViLAorCTB4NzIsIDB4ODQsIDB4ZTcsIDB4ZDAsIDB4ZmMsIDB4ZGUsIDB4ZjgsIDB4MDQsIDB4NTYsIDB4ZTEsIDB4YmMsIDB4M2UsCisJMHhhOSwgMHgyZCwgMHhhMywgMHgyZSwgMHgyZiwgMHg3MywgMHg1ZCwgMHhjYSwgMHg2OSwgMHg1YSwgMHg3ZCwgMHg5ZiwKKwkweGM0LCAweDNlLCAweGY3LCAweGYzLCAweGJkLCAweGY0LCAweDE4LCAweDc1LCAweDcxLCAweGE1LCAweGI1LCAweDYxLAorCTB4ZjEsIDB4MWMsIDB4NzIsIDB4NGUsIDB4MWEsIDB4ZDAsIDB4ZDcsIDB4OTcsIDB4OTMsIDB4M2MsIDB4MjcsIDB4Y2YsCisJMHgwYiwgMHg3ZiwgMHg5ZiwgMHg1MiwgMHg2YiwgMHhjYywgMHhhMCwgMHgxNiwgMHhiOCwgMHhkMiwgMHg1YSwgMHhiMCwKKwkweDllLCAweDUyLCAweDdhLCAweDZhLCAweDU0LCAweDFmLCAweGYwLCAweGM3LCAweDc5LCAweGNkLCAweDdiLCAweDg2LAorCTB4YjMsIDB4NmYsIDB4ODgsIDB4ZjUsIDB4ZTcsIDB4MDMsIDB4YzgsIDB4ZmYsIDB4YWMsIDB4M2QsIDB4ODksIDB4YjcsCisJMHgyOCwgMHg4YiwgMHgwNCwgMHg2YSwgMHg1YywgMHhhZSwgMHhjNSwgMHhkZiwgMHgwNCwgMHgyNSwgMHg4NywgMHhmMywKKwkweDMyLCAweDA5LCAweDdhLCAweDgwLCAweGNiLCAweDVjLCAweGM2LCAweGZkLCAweDViLCAweDY1LCAweDIzLCAweGU2LAorCTB4YzUsIDB4NzcsIDB4YmUsIDB4YWYsIDB4YjUsIDB4ODEsIDB4OTgsIDB4YmYsIDB4YjEsIDB4MTksIDB4ZjMsIDB4ZmIsCisJMHg3MSwgMHg2ZCwgMHgzOCwgMHhhOSwgMHhhMSwgMHhmZiwgMHg4NCwgMHhmNSwgMHhkOSwgMHg3NywgMHg2MSwgMHhjYywKKwkweDFmLCAweGM3LCAweDdjLCAweDhlLCAweGY1LCAweDQ5LCAweDY5LCAweDU5LCAweDZjLCAweGY2LCAweDk5LCAweDZhLAorCTB4YzIsIDB4NzcsIDB4MzEsIDB4NzIsIDB4YjIsIDB4ZDgsIDB4MTgsIDB4OGMsIDB4OWYsIDB4ZDcsIDB4MWMsIDB4ZjUsCisJMHhjZSwgMHg0NiwgMHg3MiwgMHg4OCwgMHg3ZCwgMHhiNywgMHgzZSwgMHg2OSwgMHgyYywgMHg0YiwgMHgyMiwgMHg5NCwKKwkweDdlLCAweDQ4LCAweGRjLCAweDg2LCAweDg3LCAweGI5LCAweDE3LCAweDM0LCAweGY2LCAweGRmLCAweDZjLCAweDY5LAorCTB4NmMsIDB4OWYsIDB4NjMsIDB4ODQsIDB4ZDIsIDB4ODcsIDB4ZTQsIDB4MGYsIDB4ZmMsIDB4MzksIDB4OGUsIDB4OWEsCisJMHhmMywgMHgxZiwgMHg3NiwgMHhmMywgMHhlYywgMHhhYiwgMHhlMSwgMHhmNiwgMHg4MiwgMHgwNiwgMHhkMiwgMHg3NiwKKwkweDYzLCAweGZiLCAweGJlLCAweDg5LCAweGFkLCAweDdkLCAweGI5LCAweDI3LCAweDZhLCAweDk4LCAweGJkLCAweDM2LAorCTB4ZjYsIDB4N2QsIDB4MTUsIDB4Y2YsIDB4M2MsIDB4MDQsIDB4M2EsIDB4YWUsIDB4ODQsIDB4NzQsIDB4ZWIsIDB4MjEsCisJMHgyOSwgMHgzNiwgMHhhZSwgMHhkZSwgMHhhMywgMHg5ZCwgMHgwNiwgMHgzZSwgMHhjMywgMHhmNSwgMHhiOSwgMHhjZiwKKwkweDIxLCAweGQwLCAweDc3LCAweDQ1LCAweGQzLCAweGFkLCAweDQzLCAweDkwLCAweGE1LCAweGI3LCAweDQ3LCAweGU4LAorCTB4MzksIDB4ZDMsIDB4ZjgsIDB4YTEsIDB4MGMsIDB4ODksIDB4YmUsIDB4YTIsIDB4MjksIDB4ZjksIDB4ZWIsIDB4YjUsCisJMHg1MSwgMHgzOCwgMHhjNCwgMHg5NCwgMHg3NCwgMHhhZiwgMHhjZCwgMHg0YSwgMHg2OCwgMHg4ZCwgMHgzZCwgMHgwMCwKKwkweGRhLCAweDIyLCAweGY1LCAweGI4LCAweDBiLCAweDdlLCAweDJjLCAweDc2LCAweGQ4LCAweDIyLCAweGRlLCAweDY3LAorCTB4MWYsIDB4NzcsIDB4YjUsIDB4NTcsIDB4N2EsIDB4ODksIDB4ZjcsIDB4NTksIDB4MGYsIDB4MWMsIDB4YzQsIDB4N2YsCisJMHhkNiwgMHgwNCwgMHgyZiwgMHhiNSwgMHgzMiwgMHhhOSwgMHg3NywgMHg1NCwgMHhkZSwgMHhjYywgMHgzNywgMHg3OCwKKwkweGRmLCAweDRjLCAweDg4LCAweGYwLCAweDFlLCAweGUzLCAweDQzLCAweDlmLCAweDQ0LCAweGJlLCAweDNlLCAweDhjLAorCTB4OTgsIDB4OTAsIDB4MDMsIDB4NzYsIDB4YzYsIDB4YmEsIDB4YTcsIDB4ODYsIDB4MjQsIDB4ZWMsIDB4YmQsIDB4ZWIsCisJMHhhMCwgMHhmYSwgMHgyNSwgMHg2ZiwgMHgyZCwgMHg5YiwgMHhmZSwgMHhlZiwgMHg1MywgMHg2NCwgMHhkZiwgMHhmOSwKKwkweDE0LCAweDdiLCAweDlhLCAweDAzLCAweGIwLCAweDUzLCAweGQ2LCAweDIzLCAweGEyLCAweDZmLCAweGEwLCAweGRlLAorCTB4YmMsIDB4ZDQsIDB4ODgsIDB4ZjYsIDB4ZjIsIDB4N2QsIDB4Y2IsIDB4ZDcsIDB4NWQsIDB4NWMsIDB4MTMsIDB4YmIsCisJMHhjNywgMHgxNCwgMHg1NiwgMHhmNCwgMHhlZiwgMHhmMSwgMHgzYiwgMHhlYSwgMHhhMCwgMHg2ZCwgMHg5OCwgMHgzMiwKKwkweDAxLCAweDRjLCAweGM5LCAweDNhLCAweDY5LCAweGNhLCAweDdmLCAweGU3LCAweGNkLCAweDcwLCAweDRlLCAweDZjLAorCTB4YWIsIDB4OTUsIDB4ODYsIDB4NjUsIDB4MDMsIDB4MzgsIDB4NmIsIDB4ZGQsIDB4YjUsIDB4MTAsIDB4MDcsIDB4ZGYsCisJMHhkNiwgMHhlYSwgMHg2NSwgMHhmNSwgMHhiYiwgMHgzNCwgMHhlZCwgMHgwMSwgMHg2MCwgMHhhYywgMHg0NCwgMHg5ZiwKKwkweGFhLCAweDc1LCAweDRlLCAweDNlLCAweDIwLCAweDllLCAweGJkLCAweGMzLCAweGNhLCAweDU0LCAweGNjLCAweDVhLAorCTB4YWYsIDB4N2EsIDB4YjUsIDB4YzUsIDB4NDYsIDB4NzUsIDB4NGEsIDB4ZmUsIDB4ZDQsIDB4NWQsIDB4NTAsIDB4YmQsCisJMHhkMiwgMHgyNSwgMHhkNCwgMHgxYiwgMHhlMSwgMHg0NSwgMHg1NSwgMHg2YiwgMHhiNSwgMHhlMSwgMHg1NCwgMHhjNCwKKwkweGI3LCAweDY3LCAweDhmLCAweGMwLCAweDA3LCAweDRkLCAweGY1LCAweDZlLCAweDgxLCAweGJlLCAweGQyLCAweDZhLAorCTB4NjUsIDB4MTEsIDB4MmYsIDB4NzQsIDB4Y2IsIDB4MzIsIDB4OGEsIDB4YzgsIDB4NzMsIDB4NTksIDB4ZjUsIDB4N2UsCisJMHgwYSwgMHhmZCwgMHhmNywgMHhmNywgMHg1NCwgMHgxYywgMHg5NiwgMHgxYSwgMHg2NCwgMHhmMywgMHg1YywgMHgwMiwKKwkweGViLCAweDY4LCAweGNhLCAweDNlLCAweDQzLCAweDRhLCAweDBmLCAweDBmLCAweDI4LCAweGVjLCAweDFhLCAweDVhLAorCTB4NDEsIDB4ODAsIDB4NWEsIDB4MWIsIDB4MTIsIDB4NTksIDB4ODEsIDB4YmYsIDB4YzIsIDB4NzcsIDB4YzMsIDB4NmIsCisJMHhkNCwgMHgwMSwgMHg2NSwgMHgzYiwgMHgyYiwgMHgxMSwgMHhjOCwgMHg5ZSwgMHg1OCwgMHgyMiwgMHhiNCwgMHg0OCwKKwkweDE5LCAweGM3LCAweDYxLCAweDE3LCAweDVjLCAweDA3LCAweDMyLCAweGU2LCAweGJiLCAweDJjLCAweGNiLCAweDFkLAorCTB4ZjIsIDB4NGMsIDB4YzMsIDB4ZjQsIDB4ZGYsIDB4M2QsIDB4N2YsIDB4ODksIDB4ZWYsIDB4YTMsIDB4ZWIsIDB4NzMsCisJMHg2MywgMHgwMywgMHhjNCwgMHg0ZiwgMHg1MiwgMHg2YSwgMHgwMCwgMHg2MywgMHg5YywgMHg2NiwgMHgwZCwgMHhjZSwKKwkweDE4LCAweDUwLCAweDg4LCAweDQ3LCAweDk0LCAweGFmLCAweGIzLCAweDA2LCAweGY2LCAweDdjLCAweDlmLCAweGY4LAorCTB4M2EsIDB4NjIsIDB4MTEsIDB4ZGIsIDB4OGUsIDB4NjIsIDB4OGYsIDB4OWQsIDB4ZTQsIDB4ZWEsIDB4ZDUsIDB4OWUsCisJMHg5MywgMHhhMCwgMHhmMywgMHhmYywgMHg5MiwgMHgzOSwgMHg1NSwgMHg5MCwgMHgxNCwgMHhkZiwgMHg3MSwgMHg5ZSwKKwkweGIxLCAweGMxLCAweGY3LCAweDA2LCAweGUyLCAweGU0LCAweDQyLCAweDg1LCAweGVmLCAweDMzLCAweDE3LCAweGUxLAorCTB4NTksIDB4NTMsIDB4NzIsIDB4YmUsIDB4Y2MsIDB4MWEsIDB4ZjAsIDB4NzYsIDB4ZTgsIDB4OGIsIDB4ZDcsIDB4YzUsCisJMHhmMSwgMHgxMCwgMHhmYywgMHhmZiwgMHhhMiwgMHhjMSwgMHhkZiwgMHg5MSwgMHhmMSwgMHg3NywgMHg0MSwgMHg2NiwKKwkweDJhLCAweGExLCAweDFkLCAweDg0LCAweDhlLCAweDBiLCAweDQ2LCAweGM0LCAweGI3LCAweDAzLCAweGE3LCAweDRjLAorCTB4OGMsIDB4MzUsIDB4NjIsIDB4OWMsIDB4YzMsIDB4ZjcsIDB4OTcsIDB4ZGQsIDB4Y2IsIDB4MmQsIDB4ZDYsIDB4M2YsCisJMHgxNywgMHgxMCwgMHhlNywgMHhhNiwgMHg5MiwgMHg1MywgMHhiMCwgMHg5ZCwgMHg0MiwgMHhiYywgMHgxMywgMHhiNCwKKwkweGZlLCAweDVkLCAweGRjLCAweGNiLCAweGJiLCAweGRjLCAweGM3LCAweDRjLCAweDVkLCAweDk0LCAweDIyLCAweDMwLAorCTB4ZmQsIDB4NDgsIDB4ZTIsIDB4NjUsIDB4ZDksIDB4ODMsIDB4M2EsIDB4NTUsIDB4OTMsIDB4MzcsIDB4MmQsIDB4NzMsCisJMHg1YywgMHgzNCwgMHhiNSwgMHhkZSwgMHhmMCwgMHg3ZCwgMHhiMCwgMHhiZCwgMHgzNywgMHgxMCwgMHhkZiwgMHgzYSwKKwkweGZjLCAweGRhLCAweDNkLCAweDViLCAweDI2LCAweDE2LCAweDNhLCAweGFhLCAweGRlLCAweDA1LCAweGI4LCAweDYwLAorCTB4YjEsIDB4N2YsIDB4YzcsIDB4ZGYsIDB4NDQsIDB4ZmUsIDB4YTUsIDB4ZGEsIDB4NjMsIDB4ZWIsIDB4OGMsIDB4OGQsCisJMHhmZCwgMHg2MywgMHhkMiwgMHhlNywgMHhmMSwgMHg3OCwgMHhjMCwgMHhmMiwgMHg2OCwgMHhlNCwgMHgzYSwgMHg5MSwKKwkweGI2LCAweDc1LCAweGNlLCAweGZiLCAweGViLCAweDljLCAweGY1LCAweGQ3LCAweGE5LCAweGY5LCAweGViLCAweDVjLAorCTB4ZDgsIDB4NWMsIDB4ZTcsIDB4NmUsIDB4ZTgsIDB4YmYsIDB4ZDUsIDB4N2EsIDB4MGEsIDB4ZjgsIDB4MjEsIDB4OTMsCisJMHg2YSwgMHhiNSwgMHgxYywgMHhkNCwgMHg1OSwgMHhhNSwgMHhkMSwgMHg3OSwgMHg3NSwgMHg0NiwgMHhhYSwgMHhhNywKKwkweGJmLCAweDcxLCAweDZmLCAweGM2LCAweDJhLCAweGM0LCAweGMzLCAweDBhLCAweDdiLCAweGEwLCAweDkyLCAweDgyLAorCTB4MWQsIDB4MTYsIDB4YzQsIDB4YzMsIDB4ZGMsIDB4M2MsIDB4YjcsIDB4ZjMsIDB4Y2UsIDB4ZjUsIDB4YmEsIDB4YTEsCisJMHhjMywgMHgxYywgMHg3MiwgMHg4NiwgMHg5MSwgMHgzOSwgMHg2NywgMHg0OSwgMHg2MSwgMHhkZiwgMHg2ZiwgMHhlYSwKKwkweGIwLCAweGYzLCAweDVlLCAweGU0LCAweDg3LCAweDlmLCAweGMwLCAweDY2LCAweDhjLCAweDRjLCAweGJkLCAweDkxLAorCTB4NDMsIDB4YmQsIDB4YzMsIDB4ZjksIDB4NzcsIDB4NDAsIDB4OGYsIDB4ODUsIDB4NGMsIDB4YWQsIDB4NTEsIDB4YzgsCisJMHg5YywgMHhlNSwgMHg3OSwgMHgwZSwgMHhlNiwgMHhkNSwgMHgxYSwgMHgzZCwgMHg5MCwgMHg3YiwgMHg4ZiwgMHhlYSwKKwkweDhiLCAweGJjLCAweDVjLCAweDhlLCAweDMxLCAweDA2LCAweGMxLCAweGQ2LCAweDYzLCAweDE4LCAweDhiLCAweGFiLAorCTB4ZGYsIDB4NjgsIDB4ZDUsIDB4ZGQsIDB4NjUsIDB4ZjgsIDB4NzQsIDB4MDIsIDB4ZTMsIDB4ZDUsIDB4YWUsIDB4NDksCisJMHg4NSwgMHg0NywgMHgyZCwgMHg1OSwgMHg3MSwgMHg3ZiwgMHhhNSwgMHgxNSwgMHhjYiwgMHg5NywgMHhiNSwgMHg1MiwKKwkweDc5LCAweDE4LCAweDczLCAweDQ2LCAweGY5LCAweDViLCAweDlmLCAweDNkLCAweGMwLCAweDQ5LCAweDUzLCAweGQ1LAorCTB4MWQsIDB4NjksIDB4NGEsIDB4ODAsIDB4MjYsIDB4YmQsIDB4OGQsIDB4YTYsIDB4MDQsIDB4ZTgsIDB4NDEsIDB4Y2MsCisJMHgzYywgMHhjNSwgMHhkZSwgMHhmMSwgMHhhOCwgMHg5YywgMHgyOCwgMHhmMywgMHg5ZCwgMHgyNiwgMHhmZSwgMHg0NiwKKwkweGQ1LCAweDkwLCAweDMwLCAweGIwLCAweDY1LCAweGU0LCAweDk0LCAweDE5LCAweDVmLCAweDU3LCAweGJkLCAweDFhLAorCTB4NzMsIDB4YjgsIDB4MmUsIDB4MjMsIDB4YTksIDB4YmEsIDB4YTgsIDB4ZmMsIDB4OTIsIDB4MzgsIDB4ODEsIDB4N2MsCisJMHhmNSwgMHg4NiwgMHhkYiwgMHgyMywgMHg2ZiwgMHhmYSwgMHg3YiwgMHg1ZCwgMHgxNCwgMHg5ZSwgMHgzMywgMHg2ZSwKKwkweGRmLCAweGViLCAweGM5LCAweDRhLCAweDJhLCAweGYzLCAweDhhLCAweDE1LCAweGYyLCAweGY5LCAweGVhLCAweGMzLAorCTB4NWUsIDB4N2IsIDB4MzAsIDB4MzcsIDB4OTUsIDB4MzksIDB4ZGYsIDB4ZDgsIDB4NjksIDB4YWUsIDB4ODMsIDB4YjksCisJMHg5MSwgMHhiNiwgMHhiOSwgMHgwZSwgMHhlNiwgMHhmNSwgMHgyMCwgMHhlZiwgMHhmNSwgMHgyOCwgMHg5ZSwgMHg0YSwKKwkweGEwLCAweGViLCAweDUyLCAweDk5LCAweDNjLCAweGYxLCAweDBjLCAweDgyLCAweDdiLCAweDFhLCAweGM0LCAweGM2LAorCTB4NTMsIDB4ZTIsIDB4OWYsIDB4ZDksIDB4ZjIsIDB4ZjcsIDB4N2EsIDB4NTcsIDB4ZjUsIDB4NmIsIDB4OTQsIDB4MGQsCisJMHg0YywgMHg1OCwgMHgzYywgMHg5YiwgMHg5OSwgMHhkMSwgMHhiMiwgMHhmNSwgMHgzYywgMHg3MiwgMHhkNSwgMHg4ZCwKKwkweGM0LCAweDQzLCAweDI5LCAweDFiLCAweGI5LCAweDkyLCAweGU3LCAweDNjLCAweDhkLCAweDcyLCAweDgxLCAweGVmLAorCTB4M2QsIDB4YzMsIDB4MmUsIDB4ZGUsIDB4MjEsIDB4NWUsIDB4YmUsIDB4MzEsIDB4YTQsIDB4ZGUsIDB4NDMsIDB4NzAsCisJMHhmYywgMHg3MywgMHgyMCwgMHgzMSwgMHgzMiwgMHg2MywgMHg3YywgMHhmNywgMHhlMCwgMHg2ZSwgMHhhOSwgMHgyZiwKKwkweDdmLCAweDExLCAweDYzLCAweDE5LCAweGU0LCAweGM1LCAweDQzLCAweDVhLCAweGU2LCAweGRjLCAweDI0LCAweGFlLAorCTB4MWYsIDB4YzIsIDB4MzUsIDB4ZTIsIDB4ZjAsIDB4NzIsIDB4MGUsIDB4ZjcsIDB4MWYsIDB4YzIsIDB4ZjUsIDB4YmMsCisJMHg5NiwgMHg2ZCwgMHhlNiwgMHg3MCwgMHhmZCwgMHgzMCwgMHhhZSwgMHgyNywgMHg0OCwgMHg5YiwgMHhmMywgMHg4YSwKKwkweDM1LCAweGE1LCAweGQ5LCAweDU4LCAweGNiLCAweDNlLCAweDM3LCAweDg5LCAweDRmLCAweGZiLCAweDdhLCAweGJjLAorCTB4MDcsIDB4M2QsIDB4OTUsIDB4NzksIDB4M2UsIDB4OTYsIDB4MDQsIDB4NGQsIDB4MGYsIDB4NmEsIDB4NGUsIDB4YmQsCisJMHgxYiwgMHg2YiwgMHgwYywgMHhlMSwgMHg3OSwgMHhkYSwgMHg1NCwgMHhmYiwgMHgzOSwgMHhkNCwgMHg2ZCwgMHhhYSwKKwkweDY3LCAweDE0LCAweDRhLCAweGE3LCAweDgxLCAweDc3LCAweDFmLCAweDQxLCAweGRlLCAweGQ3LCAweGM0LCAweGIxLAorCTB4MWUsIDB4OTcsIDB4NjIsIDB4MmEsIDB4MmQsIDB4MGIsIDB4ZjUsIDB4OTAsIDB4NjQsIDB4NjMsIDB4MDUsIDB4N2MsCisJMHgyZiwgMHg0OCwgMHg2NiwgMHgxYywgMHhmNywgMHhlYiwgMHhiNCwgMHgwNSwgMHhjZSwgMHgyYiwgMHg0OSwgMHhiMSwKKwkweDRhLCAweGZjLCAweGNlLCAweDdlLCAweGQxLCAweDU3LCAweGMwLCAweDM3LCAweGZiLCAweDQ0LCAweDc5LCAweGM4LAorCTB4MjAsIDB4NDYsIDB4ZmIsIDB4ZGQsIDB4YTEsIDB4YTcsIDB4ZTUsIDB4YmQsIDB4ZDMsIDB4OGMsIDB4N2MsIDB4YWMsCisJMHg2NSwgMHhlYSwgMHhmZSwgMHg1OSwgMHg5ZCwgMHhjNSwgMHhkZiwgMHgyYiwgMHhiMSwgMHg0NywgMHgyNSwgMHhjNSwKKwkweDUwLCAweDlhLCAweDdkLCAweDBlLCAweGQ1LCAweDE3LCAweDRmLCAweDc5LCAweDY3LCAweDdhLCAweGVkLCAweGVmLAorCTB4OTAsIDB4MDQsIDB4ZmUsIDB4YzIsIDB4N2QsIDB4YmYsIDB4ODIsIDB4ZTcsIDB4YmQsIDB4YmUsIDB4NTQsIDB4YjYsCisJMHhmOSwgMHg0MSwgMHg1ZCwgMHhmMCwgMHg1ZCwgMHhmZCwgMHgxNSwgMHhlOCwgMHhlMiwgMHhmYywgMHg4NywgMHhmNiwKKwkweGI5LCAweGQ4LCAweGUzLCAweDlhLCAweDQ3LCAweDJjLCAweDYyLCAweDdmLCAweDJjLCAweDkwLCAweGRmLCAweGQ1LAorCTB4MzQsIDB4OTIsIDB4YmUsIDB4YzMsIDB4NTgsIDB4NGIsIDB4NTIsIDB4OGMsIDB4YjMsIDB4YjksIDB4NTgsIDB4NDIsCisJMHhkNSwgMHhiZSwgMHgxYiwgMHg0YiwgMHhmMiwgMHhjNCwgMHgxNiwgMHhiZCwgMHhhNCwgMHg5NSwgMHg3MiwgMHg3OCwKKwkweDA0LCAweGY1LCAweDFhLCAweDdmLCAweGZmLCAweGYwLCAweGI4LCAweGU0LCAweDUzLCAweGVjLCAweGQxLCAweDg0LAorCTB4OTAsIDB4MGIsIDB4MGIsIDB4ZjgsIDB4YmUsIDB4MjUsIDB4YjcsIDB4OTIsIDB4MmYsIDB4YjcsIDB4N2MsIDB4ZjUsCisJMHg1YiwgMHg0YSwgMHg3NywgMHgzNSwgMHg4YiwgMHhmYiwgMHgwNSwgMHhiZCwgMHg4YiwgMHg2OSwgMHhhNSwgMHhiMywKKwkweDlhLCAweDdhLCAweGNmLCAweDM2LCAweGUwLCAweDNkLCAweGU4LCAweGJmLCAweGVkLCAweDZjLCAweDczLCAweDkzLAorCTB4MTYsIDB4NjksIDB4ZmIsIDB4MzgsIDB4ZGYsIDB4NWIsIDB4MTgsIDB4YjYsIDB4ODUsIDB4ZjQsIDB4OTMsIDB4MGYsCisJMHhlNiwgMHhhYywgMHhlMCwgMHg1YywgMHgzNCwgMHhlMCwgMHgyMSwgMHhlMCwgMHhmMywgMHhhMywgMHhjYSwgMHg4NSwKKwkweDc0LCAweGVlLCAweDMxLCAweGE0LCAweDdiLCAweGNhLCAweDA4LCAweDU5LCAweGNjLCAweDAxLCAweDlmLCAweGY2LAorCTB4ZmIsIDB4ZjgsIDB4ZmYsIDB4MzcsIDB4ZTUsIDB4ZWEsIDB4ZjEsIDB4MWUsIDB4ODYsIDB4YTgsIDB4ZmMsIDB4ZGYsCisJMHg4YiwgMHhlZSwgMHhhMCwgMHhmNywgMHhhYiwgMHhjZiwgMHg4MCwgMHgwZCwgMHhlNywgMHhhYywgMHhiNSwgMHhjNSwKKwkweDY3LCAweDZkLCAweDA3LCAweDNlLCAweDZiLCAweDNlLCAweDlmLCAweDFmLCAweDdlLCAweDRlLCAweGVhLCAweGQxLAorCTB4NTksIDB4NWIsIDB4YjIsIDB4YzEsIDB4MjMsIDB4NmQsIDB4NmEsIDB4MjcsIDB4N2IsIDB4ZTMsIDB4NmYsIDB4OWMsCisJMHhkNCwgMHhlZiwgMHhhZCwgMHhhMiwgMHhiNiwgMHg3YiwgMHhhZCwgMHg1ZSwgMHgyNywgMHhlYiwgMHg2NCwgMHhjZiwKKwkweGVlLCAweGNlLCAweDIyLCAweGQ3LCAweDU1LCAweGFiLCAweDVlLCAweGNkLCAweDVjLCAweDc1LCAweGQ5LCAweDZiLAorCTB4ZGUsIDB4NjksIDB4NmYsIDB4MGQsIDB4MzQsIDB4ZmYsIDB4OGUsIDB4N2EsIDB4ZWYsIDB4YTQsIDB4ZTQsIDB4N2EsCisJMHg3ZCwgMHhhOSwgMHg2YSwgMHhiNSwgMHgzZCwgMHg1NywgMHhkZSwgMHhjMCwgMHgzYywgMHgzOSwgMHg1YywgMHg5MCwKKwkweDE5LCAweGU4LCAweDMxLCAweDg5LCAweGViLCAweDliLCAweGU1LCAweGU1LCAweDY1LCAweDc1LCAweDg2LCAweGU0LAorCTB4OWYsIDB4ZDUsIDB4ZjAsIDB4MGMsIDB4NDYsIDB4OWQsIDB4NDMsIDB4MjMsIDB4NWUsIDB4Y2QsIDB4YWEsIDB4NzgsCisJMHhiZCwgMHhiMSwgMHhhYywgMHhlZSwgMHhhOSwgMHhkZiwgMHgzYywgMHhkNCwgMHhkZCwgMHgxOSwgMHhjNCwgMHg3MywKKwkweGQ0LCAweDA2LCAweGQ2LCAweDZlLCAweDI5LCAweGEyLCAweDg2LCAweDNlLCAweDZiLCAweGNkLCAweDE4LCAweGM0LAorCTB4MjksIDB4NWMsIDB4NmIsIDB4MDMsIDB4NmIsIDB4OWQsIDB4NWYsIDB4OTYsIDB4YmQsIDB4N2MsIDB4YTcsIDB4YTMsCisJMHhhYSwgMHhjZSwgMHhiZCwgMHhiYywgMHg3ZSwgMHhmNSwgMHhiYywgMHgwNCwgMHhiZiwgMHhkNywgMHg4ZCwgMHhmYSwKKwkweDM5LCAweDhlLCAweGVmLCAweDk1LCAweGYwLCAweGI3LCAweGE3LCAweDhjLCAweDAxLCAweGE4LCAweDZiLCAweDY2LAorCTB4MGEsIDB4NTgsIDB4YWYsIDB4ZDUsIDB4ZjIsIDB4ZmEsIDB4ZDksIDB4MmQsIDB4ZDgsIDB4N2QsIDB4ODQsIDB4YmYsCisJMHg2NSwgMHhjMCwgMHhkZiwgMHgyMywgMHhiMCwgMHgxMywgMHhmOCwgMHhjMSwgMHhlNiwgMHgzOCwgMHhhZiwgMHg1OSwKKwkweDRiLCAweDA0LCAweGQ3LCAweDRjLCAweDU4LCAweGZmLCAweDFiLCAweGVkLCAweGNjLCAweGZhLCAweGExLCAweDk4LAorCTB4NDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UWFBfYjA5RndEYXRhWygweGQwLzQpICsgMV0gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxNCwgMHgwMDAwMDAxMCwKKwkweDAwMDAwMDMwLCAweDAwMDAwMDMwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDEwLAorCTB4MDAwMDgwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDgwMDIsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDA1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfTsKK3N0YXRpYyB1MzIgYm54Ml9UWFBfYjA5RndSb2RhdGFbKDB4MzAvNCkgKyAxXSA9IHsKKwkweDA4MDAzYmU4LCAweDA4MDAzYzE0LCAweDA4MDAzYzVjLCAweDA4MDAzYzVjLCAweDA4MDAzYWU4LCAweDA4MDAzYjE0LAorCTB4MDgwMDNiMTQsIDB4MDgwMDNjNWMsIDB4MDgwMDNjNWMsIDB4MDgwMDNjNWMsIDB4MDgwMDNiN2MsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCB9Oworc3RhdGljIHUzMiBibngyX1RYUF9iMDlGd0Jzc1soMHhhMjAvNCkgKyAxXSA9IHsgMHgwIH07CitzdGF0aWMgdTMyIGJueDJfVFhQX2IwOUZ3U2Jzc1soMHg4MC80KSArIDFdID0geyAweDAgfTsKKworc3RhdGljIHN0cnVjdCBmd19pbmZvIGJueDJfdHhwX2Z3XzA5ID0geworCS52ZXJfbWFqb3IJCQk9IDB4MSwKKwkudmVyX21pbm9yCQkJPSAweDAsCisJLnZlcl9maXgJCQk9IDB4MCwKKworCS5zdGFydF9hZGRyCQkJPSAweDA4MDAwMDYwLAorCisJLnRleHRfYWRkcgkJCT0gMHgwODAwMDAwMCwKKwkudGV4dF9sZW4JCQk9IDB4NDE5NCwKKwkudGV4dF9pbmRleAkJCT0gMHgwLAorCS5nel90ZXh0CQkJPSBibngyX1RYUF9iMDlGd1RleHQsCisJLmd6X3RleHRfbGVuCQkJPSBzaXplb2YoYm54Ml9UWFBfYjA5RndUZXh0KSwKKworCS5kYXRhX2FkZHIJCQk9IDB4MDgwMDQxZTAsCisJLmRhdGFfbGVuCQkJPSAweGQwLAorCS5kYXRhX2luZGV4CQkJPSAweDAsCisJLmRhdGEJCQkJPSBibngyX1RYUF9iMDlGd0RhdGEsCisKKwkuc2Jzc19hZGRyCQkJPSAweDA4MDA0MmIwLAorCS5zYnNzX2xlbgkJCT0gMHg4MCwKKwkuc2Jzc19pbmRleAkJCT0gMHgwLAorCS5zYnNzCQkJCT0gYm54Ml9UWFBfYjA5RndTYnNzLAorCisJLmJzc19hZGRyCQkJPSAweDA4MDA0MzMwLAorCS5ic3NfbGVuCQkJPSAweGEyMCwKKwkuYnNzX2luZGV4CQkJPSAweDAsCisJLmJzcwkJCQk9IGJueDJfVFhQX2IwOUZ3QnNzLAorCisJLnJvZGF0YV9hZGRyCQkJPSAweDA4MDA0MTk4LAorCS5yb2RhdGFfbGVuCQkJPSAweDMwLAorCS5yb2RhdGFfaW5kZXgJCQk9IDB4MCwKKwkucm9kYXRhCQkJCT0gYm54Ml9UWFBfYjA5RndSb2RhdGEsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwppbmRleCBjMGJiZGRhLi42NDgyYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKQEAgLTEzMzYsNiArMTMzNiwxMyBAQAogCQlnb3RvIGVycl91bmRvX2ZsYWdzOwogCX0KIAorCWlmIChzbGF2ZV9kZXYtPmdldF9zdGF0cyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX05PVElDRSBEUlZfTkFNRQorCQkJIjogJXM6IHRoZSBkcml2ZXIgZm9yIHNsYXZlIGRldmljZSAlcyBkb2VzIG5vdCBwcm92aWRlICIKKwkJCSJnZXRfc3RhdHMgZnVuY3Rpb24sIG5ldHdvcmsgc3RhdGlzdGljcyB3aWxsIGJlICIKKwkJCSJpbmFjY3VyYXRlLlxuIiwgYm9uZF9kZXYtPm5hbWUsIHNsYXZlX2Rldi0+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+bG9jayk7CkBAIC0zNjc1LDcgKzM2ODQsNyBAQAogCQkJbWlpLT52YWxfb3V0ID0gMDsKIAkJCXJlYWRfbG9ja19iaCgmYm9uZC0+bG9jayk7CiAJCQlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7Ci0JCQlpZiAoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKGJvbmQtPmRldikpIHsKIAkJCQltaWktPnZhbF9vdXQgPSBCTVNSX0xTVEFUVVM7CiAJCQl9CiAJCQlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKQEAgLTQ2OTIsNiArNDcwMSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgYm9uZGluZ19uZXRkZXZfeG1pdF9sb2NrX2tleTsKKwogLyogQ3JlYXRlIGEgbmV3IGJvbmQgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBib25kaW5nIHBhcmFtZXRlcnMuCiAgKiBDYWxsZXIgbXVzdCBOT1QgaG9sZCBydG5sX2xvY2s7IHdlIG5lZWQgdG8gcmVsZWFzZSBpdCBoZXJlIGJlZm9yZSB3ZQogICogc2V0IHVwIG91ciBzeXNmcyBlbnRyaWVzLgpAQCAtNDcyNyw2ICs0NzM4LDkgQEAKIAlpZiAocmVzIDwgMCkgewogCQlnb3RvIG91dF9ib25kOwogCX0KKworCWxvY2tkZXBfc2V0X2NsYXNzKCZib25kX2Rldi0+X3htaXRfbG9jaywgJmJvbmRpbmdfbmV0ZGV2X3htaXRfbG9ja19rZXkpOworCiAJaWYgKG5ld2JvbmQpCiAJCSpuZXdib25kID0gYm9uZF9kZXYtPnByaXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JzZF9jb21wLmMgYi9kcml2ZXJzL25ldC9ic2RfY29tcC5jCmluZGV4IGJhZTFkZTEuLjc4NDVlYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JzZF9jb21wLmMKKysrIGIvZHJpdmVycy9uZXQvYnNkX2NvbXAuYwpAQCAtMzk1LDcgKzM5NSw3IEBACiAgKiBBbGxvY2F0ZSB0aGUgbWFpbiBjb250cm9sIHN0cnVjdHVyZSBmb3IgdGhpcyBpbnN0YW5jZS4KICAqLwogICAgIG1heG1heGNvZGUgPSBNQVhDT0RFKGJpdHMpOwotICAgIGRiICAgICAgICAgPSAoc3RydWN0IGJzZF9kYiAqKSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBic2RfZGIpLAorICAgIGRiICAgICAgICAgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGJzZF9kYiksCiAJCQkJCSAgICBHRlBfS0VSTkVMKTsKICAgICBpZiAoIWRiKQogICAgICAgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5jCmluZGV4IDUyMWM1YjcuLmM4MTI2NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYworKysgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKQEAgLTI4MjUsNyArMjgyNSw3IEBACiAJCXU2NCBjc3VtX3N0YXJ0X29mZiwgY3N1bV9zdHVmZl9vZmY7CiAKIAkJY3N1bV9zdGFydF9vZmYgPSAodTY0KSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JCWNzdW1fc3R1ZmZfb2ZmID0gKHU2NCkgKChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YSk7CisJCWNzdW1fc3R1ZmZfb2ZmID0gY3N1bV9zdGFydF9vZmYgKyBza2ItPmNzdW1fb2Zmc2V0OwogCiAJCWN0cmwgPSAgVFhfREVTQ19DU1VNX0VOIHwKIAkJCUNBU19CQVNFKFRYX0RFU0NfQ1NVTV9TVEFSVCwgY3N1bV9zdGFydF9vZmYpIHwKQEAgLTQwNjYsOSArNDA2Niw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNhc19yZXNldF90YXNrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBjYXNfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGNhcyAqY3AgPSAoc3RydWN0IGNhcyAqKSBkYXRhOworCXN0cnVjdCBjYXMgKmNwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjYXMsIHJlc2V0X3Rhc2spOwogI2lmIDAKIAlpbnQgcGVuZGluZyA9IGF0b21pY19yZWFkKCZjcC0+cmVzZXRfdGFza19wZW5kaW5nKTsKICNlbHNlCkBAIC01MDA2LDcgKzUwMDYsNyBAQAogCWF0b21pY19zZXQoJmNwLT5yZXNldF90YXNrX3BlbmRpbmdfc3BhcmUsIDApOwogCWF0b21pY19zZXQoJmNwLT5yZXNldF90YXNrX3BlbmRpbmdfbXR1LCAwKTsKICNlbmRpZgotCUlOSVRfV09SSygmY3AtPnJlc2V0X3Rhc2ssIGNhc19yZXNldF90YXNrLCBjcCk7CisJSU5JVF9XT1JLKCZjcC0+cmVzZXRfdGFzaywgY2FzX3Jlc2V0X3Rhc2spOwogCiAJLyogRGVmYXVsdCBsaW5rIHBhcmFtZXRlcnMgKi8KIAlpZiAobGlua19tb2RlID49IDAgJiYgbGlua19tb2RlIDw9IDYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvY2hlbHNpby9NYWtlZmlsZQppbmRleCA1NGM3OGQ5Li4zODJkMjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vTWFrZWZpbGUKQEAgLTEsMTEgKzEsMTEgQEAKICMKLSMgQ2hlbHNpbyAxMEdiIE5JQyBkcml2ZXIgZm9yIExpbnV4LgorIyBDaGVsc2lvIFQxIGRyaXZlcgogIwogCiBvYmotJChDT05GSUdfQ0hFTFNJT19UMSkgKz0gY3hnYi5vCiAKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbmV0L2NoZWxzaW8gJChERUJVR19GTEFHUykKK2N4Z2ItJChDT05GSUdfQ0hFTFNJT19UMV8xRykgKz0gaXhmMTAxMC5vIG1hYy5vIG12ODhlMXh4eC5vIHZzYzczMjYubyB2c2M4MjQ0Lm8KK2N4Z2Itb2JqcyA6PSBjeGdiMi5vIGVzcGkubyB0cC5vIHBtMzM5My5vIHNnZS5vIHN1YnIubyBcCisJICAgICBtdjg4eDIwMXgubyBteTMxMjYubyAkKGN4Z2IteSkKIAogCi1jeGdiLW9ianMgOj0gY3hnYjIubyBlc3BpLm8gcG0zMzkzLm8gc2dlLm8gc3Vici5vIG12ODh4MjAxeC5vCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NvbW1vbi5oCmluZGV4IDVkOWRkMTQuLjc0NzU4ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaApAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTUzLDEzICs1NCwzMCBAQAogCiAjZGVmaW5lIERSVl9ERVNDUklQVElPTiAiQ2hlbHNpbyAxMEdiIEV0aGVybmV0IERyaXZlciIKICNkZWZpbmUgRFJWX05BTUUgImN4Z2IiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIyLjEuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjIuMiIKICNkZWZpbmUgUEZYICAgICAgRFJWX05BTUUgIjogIgogCiAjZGVmaW5lIENIX0VSUihmbXQsIC4uLikgICBwcmludGsoS0VSTl9FUlIgUEZYIGZtdCwgIyMgX19WQV9BUkdTX18pCiAjZGVmaW5lIENIX1dBUk4oZm10LCAuLi4pICBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCBmbXQsICMjIF9fVkFfQVJHU19fKQogI2RlZmluZSBDSF9BTEVSVChmbXQsIC4uLikgcHJpbnRrKEtFUk5fQUxFUlQgUEZYIGZtdCwgIyMgX19WQV9BUkdTX18pCiAKKy8qCisgKiBNb3JlIHBvd2VyZnVsIG1hY3JvIHRoYXQgc2VsZWN0aXZlbHkgcHJpbnRzIG1lc3NhZ2VzIGJhc2VkIG9uIG1zZ19lbmFibGUuCisgKiBGb3IgaW5mbyBhbmQgZGVidWdnaW5nIG1lc3NhZ2VzLgorICovCisjZGVmaW5lIENIX01TRyhhZGFwdGVyLCBsZXZlbCwgY2F0ZWdvcnksIGZtdCwgLi4uKSBkbyB7IFwKKwlpZiAoKGFkYXB0ZXIpLT5tc2dfZW5hYmxlICYgTkVUSUZfTVNHXyMjY2F0ZWdvcnkpIFwKKwkJcHJpbnRrKEtFUk5fIyNsZXZlbCBQRlggIiVzOiAiIGZtdCwgKGFkYXB0ZXIpLT5uYW1lLCBcCisJCSAgICAgICAjIyBfX1ZBX0FSR1NfXyk7IFwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgQ0hfREJHKGFkYXB0ZXIsIGNhdGVnb3J5LCBmbXQsIC4uLikgXAorCUNIX01TRyhhZGFwdGVyLCBERUJVRywgY2F0ZWdvcnksIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorIyBkZWZpbmUgQ0hfREJHKGZtdCwgLi4uKQorI2VuZGlmCisKICNkZWZpbmUgQ0hfREVWSUNFKGRldmlkLCBzc2lkLCBpZHgpIFwKIAl7IFBDSV9WRU5ET1JfSURfQ0hFTFNJTywgZGV2aWQsIFBDSV9BTllfSUQsIHNzaWQsIDAsIDAsIGlkeCB9CiAKQEAgLTcxLDEwICs4OSw2IEBACiAKIHR5cGVkZWYgc3RydWN0IGFkYXB0ZXIgYWRhcHRlcl90OwogCi12b2lkIHQxX2VsbWVyMF9leHRfaW50cihhZGFwdGVyX3QgKmFkYXB0ZXIpOwotdm9pZCB0MV9saW5rX2NoYW5nZWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcG9ydF9pZCwgaW50IGxpbmtfc3RhdHVzLAotCQkJaW50IHNwZWVkLCBpbnQgZHVwbGV4LCBpbnQgZmMpOwotCiBzdHJ1Y3QgdDFfcnhfbW9kZSB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1MzIgaWR4OwpAQCAtOTcsMjYgKzExMSw1MyBAQAogfQogCiAjZGVmaW5lCU1BWF9OUE9SVFMgNAorI2RlZmluZSBQT1JUX01BU0sgKCgxIDw8IE1BWF9OUE9SVFMpIC0gMSkKKyNkZWZpbmUgTk1UVVMgICAgICA4CisjZGVmaW5lIFRDQl9TSVpFICAgMTI4CiAKICNkZWZpbmUgU1BFRURfSU5WQUxJRCAweGZmZmYKICNkZWZpbmUgRFVQTEVYX0lOVkFMSUQgMHhmZgogCiBlbnVtIHsKIAlDSEJUX0JPQVJEX04xMTAsCi0JQ0hCVF9CT0FSRF9OMjEwCisJQ0hCVF9CT0FSRF9OMjEwLAorCUNIQlRfQk9BUkRfNzUwMCwKKwlDSEJUX0JPQVJEXzgwMDAsCisJQ0hCVF9CT0FSRF9DSFQxMDEsCisJQ0hCVF9CT0FSRF9DSFQxMTAsCisJQ0hCVF9CT0FSRF9DSFQyMTAsCisJQ0hCVF9CT0FSRF9DSFQyMDQsCisJQ0hCVF9CT0FSRF9DSFQyMDRWLAorCUNIQlRfQk9BUkRfQ0hUMjA0RSwKKwlDSEJUX0JPQVJEX0NITjIwNCwKKwlDSEJUX0JPQVJEX0NPVUdBUiwKKwlDSEJUX0JPQVJEXzY4MDAsCisJQ0hCVF9CT0FSRF9TSU1VTCwKIH07CiAKIGVudW0geworCUNIQlRfVEVSTV9GUEdBLAogCUNIQlRfVEVSTV9UMSwKLQlDSEJUX1RFUk1fVDIKKwlDSEJUX1RFUk1fVDIsCisJQ0hCVF9URVJNX1QzCiB9OwogCiBlbnVtIHsKKwlDSEJUX01BQ19DSEVMU0lPX0EsCisJQ0hCVF9NQUNfSVhGMTAxMCwKIAlDSEJUX01BQ19QTTMzOTMsCisJQ0hCVF9NQUNfVlNDNzMyMSwKKwlDSEJUX01BQ19EVU1NWQogfTsKIAogZW51bSB7CisJQ0hCVF9QSFlfODhFMTA0MSwKKwlDSEJUX1BIWV84OEUxMTExLAogCUNIQlRfUEhZXzg4WDIwMTAsCisJQ0hCVF9QSFlfWFBBSywKKwlDSEJUX1BIWV9NWTMxMjYsCisJQ0hCVF9QSFlfODI0NCwKKwlDSEJUX1BIWV9EVU1NWQogfTsKIAogZW51bSB7CkBAIC0xNTAsMTYgKzE5MSw0NCBAQAogCXVuc2lnbmVkIGNoYXIgIGlzX3BjaXg7CiB9OwogCitzdHJ1Y3QgdHBfcGFyYW1zIHsKKwl1bnNpZ25lZCBpbnQgcG1fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgY21fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcG1fcnhfYmFzZTsKKwl1bnNpZ25lZCBpbnQgcG1fdHhfYmFzZTsKKwl1bnNpZ25lZCBpbnQgcG1fcnhfcGdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcG1fdHhfcGdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcG1fcnhfbnVtX3BnczsKKwl1bnNpZ25lZCBpbnQgcG1fdHhfbnVtX3BnczsKKwl1bnNpZ25lZCBpbnQgcnhfY29hbGVzY2luZ19zaXplOworCXVuc2lnbmVkIGludCB1c2VfNXR1cGxlX21vZGU7Cit9OworCitzdHJ1Y3QgbWM1X3BhcmFtcyB7CisJdW5zaWduZWQgaW50IG1vZGU7ICAgICAgIC8qIHNlbGVjdHMgTUM1IHdpZHRoICovCisJdW5zaWduZWQgaW50IG5zZXJ2ZXJzOyAgIC8qIHNpemUgb2Ygc2VydmVyIHJlZ2lvbiAqLworCXVuc2lnbmVkIGludCBucm91dGVzOyAgICAvKiBzaXplIG9mIHJvdXRpbmcgcmVnaW9uICovCit9OworCisvKiBEZWZhdWx0IE1DNSByZWdpb24gc2l6ZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9TRVJWRVJfUkVHSU9OX0xFTiAyNTYKKyNkZWZpbmUgREVGQVVMVF9SVF9SRUdJT05fTEVOIDEwMjQKKwogc3RydWN0IGFkYXB0ZXJfcGFyYW1zIHsKIAlzdHJ1Y3Qgc2dlX3BhcmFtcyBzZ2U7CisJc3RydWN0IG1jNV9wYXJhbXMgbWM1OworCXN0cnVjdCB0cF9wYXJhbXMgIHRwOwogCXN0cnVjdCBjaGVsc2lvX3BjaV9wYXJhbXMgcGNpOwogCiAJY29uc3Qgc3RydWN0IGJvYXJkX2luZm8gKmJyZF9pbmZvOwogCisJdW5zaWduZWQgc2hvcnQgbXR1c1tOTVRVU107CiAJdW5zaWduZWQgaW50ICAgbnBvcnRzOyAgICAgICAgICAvKiAjIG9mIGV0aGVybmV0IHBvcnRzICovCiAJdW5zaWduZWQgaW50ICAgc3RhdHNfdXBkYXRlX3BlcmlvZDsKIAl1bnNpZ25lZCBzaG9ydCBjaGlwX3JldmlzaW9uOwogCXVuc2lnbmVkIGNoYXIgIGNoaXBfdmVyc2lvbjsKKwl1bnNpZ25lZCBjaGFyICBpc19hc2ljOworCXVuc2lnbmVkIGNoYXIgIGhhc19tc2k7CiB9OwogCiBzdHJ1Y3QgbGlua19jb25maWcgewpAQCAtMjA3LDE3ICsyNzYsMjAgQEAKIAkvKiBUZXJtaW5hdG9yIG1vZHVsZXMuICovCiAJc3RydWN0IHNnZSAgICAqc2dlOwogCXN0cnVjdCBwZWVzcGkgKmVzcGk7CisJc3RydWN0IHBldHAgICAqdHA7CiAKIAlzdHJ1Y3QgcG9ydF9pbmZvIHBvcnRbTUFYX05QT1JUU107Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHN0YXRzX3VwZGF0ZV90YXNrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgc3RhdHNfdXBkYXRlX3Rhc2s7CiAJc3RydWN0IHRpbWVyX2xpc3Qgc3RhdHNfdXBkYXRlX3RpbWVyOwogCi0Jc3RydWN0IHNlbWFwaG9yZSBtaWJfbXV0ZXg7CiAJc3BpbmxvY2tfdCB0cGlfbG9jazsKIAlzcGlubG9ja190IHdvcmtfbG9jazsKKwlzcGlubG9ja190IG1hY19sb2NrOworCiAJLyogZ3VhcmRzIGFzeW5jIG9wZXJhdGlvbnMgKi8KIAlzcGlubG9ja190IGFzeW5jX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCXUzMiBzbG93X2ludHJfbWFzazsKKwlpbnQgdDFwb3dlcnNhdmU7CiB9OwogCiBlbnVtIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRlciBmbGFncyAqLwpAQCAtMjU2LDYgKzMyOCwxMSBAQAogCWNvbnN0IGNoYXIgICAgICAgICAgICAgKmRlc2M7CiB9OwogCitzdGF0aWMgaW5saW5lIGludCB0MV9pc19hc2ljKGNvbnN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwlyZXR1cm4gYWRhcHRlci0+cGFyYW1zLmlzX2FzaWM7Cit9CisKIGV4dGVybiBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0MV9wY2lfdGJsW107CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFkYXB0ZXJfbWF0Y2hlc190eXBlKGNvbnN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKQEAgLTI4NSwxMyArMzYyLDE1IEBACiAJcmV0dXJuIGJvYXJkX2luZm8oYWRhcCktPmNsb2NrX2NvcmUgLyAxMDAwMDAwOwogfQogCitleHRlcm4gaW50IF9fdDFfdHBpX3JlYWQoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTMyICp2YWxwKTsKK2V4dGVybiBpbnQgX190MV90cGlfd3JpdGUoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIHZhbHVlKTsKIGV4dGVybiBpbnQgdDFfdHBpX3dyaXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiB2YWx1ZSk7CiBleHRlcm4gaW50IHQxX3RwaV9yZWFkKGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiAqdmFsdWUpOwogCiBleHRlcm4gdm9pZCB0MV9pbnRlcnJ1cHRzX2VuYWJsZShhZGFwdGVyX3QgKmFkYXB0ZXIpOwogZXh0ZXJuIHZvaWQgdDFfaW50ZXJydXB0c19kaXNhYmxlKGFkYXB0ZXJfdCAqYWRhcHRlcik7CiBleHRlcm4gdm9pZCB0MV9pbnRlcnJ1cHRzX2NsZWFyKGFkYXB0ZXJfdCAqYWRhcHRlcik7Ci1leHRlcm4gaW50IGVsbWVyMF9leHRfaW50cl9oYW5kbGVyKGFkYXB0ZXJfdCAqYWRhcHRlcik7CitleHRlcm4gaW50IHQxX2VsbWVyMF9leHRfaW50cl9oYW5kbGVyKGFkYXB0ZXJfdCAqYWRhcHRlcik7CiBleHRlcm4gaW50IHQxX3Nsb3dfaW50cl9oYW5kbGVyKGFkYXB0ZXJfdCAqYWRhcHRlcik7CiAKIGV4dGVybiBpbnQgdDFfbGlua19zdGFydChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgY21hYyAqbWFjLCBzdHJ1Y3QgbGlua19jb25maWcgKmxjKTsKQEAgLTMwNSw5ICszODQsNyBAQAogZXh0ZXJuIGludCB0MV9pbml0X3N3X21vZHVsZXMoYWRhcHRlcl90ICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYm9hcmRfaW5mbyAqYmkpOwogZXh0ZXJuIHZvaWQgdDFfZnJlZV9zd19tb2R1bGVzKGFkYXB0ZXJfdCAqYWRhcHRlcik7CiBleHRlcm4gdm9pZCB0MV9mYXRhbF9lcnIoYWRhcHRlcl90ICphZGFwdGVyKTsKLQotZXh0ZXJuIHZvaWQgdDFfdHBfc2V0X3VkcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGVuYWJsZSk7Ci1leHRlcm4gdm9pZCB0MV90cF9zZXRfdGNwX2NoZWNrc3VtX29mZmxvYWQoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgZW5hYmxlKTsKLWV4dGVybiB2b2lkIHQxX3RwX3NldF9pcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGVuYWJsZSk7Ci0KK2V4dGVybiB2b2lkIHQxX2xpbmtfY2hhbmdlZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwb3J0X2lkKTsKK2V4dGVybiB2b2lkIHQxX2xpbmtfbmVnb3RpYXRlZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwb3J0X2lkLCBpbnQgbGlua19zdGF0LAorCQkJICAgIGludCBzcGVlZCwgaW50IGR1cGxleCwgaW50IHBhdXNlKTsKICNlbmRpZiAvKiBfQ1hHQl9DT01NT05fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BoeS5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmgKaW5kZXggMzQxMjM0Mi4uY2Y5MTQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmgKQEAgLTUyLDcgKzUyLDE0IEBACiAvKiBQSFkgaW50ZXJydXB0IHR5cGVzICovCiBlbnVtIHsKIAljcGh5X2NhdXNlX2xpbmtfY2hhbmdlID0gMHgxLAotCWNwaHlfY2F1c2VfZXJyb3IgPSAweDIKKwljcGh5X2NhdXNlX2Vycm9yID0gMHgyLAorCWNwaHlfY2F1c2VfZmlmb19lcnJvciA9IDB4MworfTsKKworZW51bSB7CisJUEhZX0xJTktfVVAgPSAweDEsCisJUEhZX0FVVE9ORUdfUkRZID0gMHgyLAorCVBIWV9BVVRPTkVHX0VOID0gMHg0CiB9OwogCiBzdHJ1Y3QgY3BoeTsKQEAgLTgxLDcgKzg4LDE4IEBACiAvKiBBIFBIWSBpbnN0YW5jZSAqLwogc3RydWN0IGNwaHkgewogCWludCBhZGRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSFkgYWRkcmVzcyAqLworCWludCBzdGF0ZTsJLyogTGluayBzdGF0dXMgc3RhdGUgbWFjaGluZSAqLwogCWFkYXB0ZXJfdCAqYWRhcHRlcjsgICAgICAgICAgICAgICAgICAvKiBhc3NvY2lhdGVkIGFkYXB0ZXIgKi8KKworCXN0cnVjdCBkZWxheWVkX3dvcmsgcGh5X3VwZGF0ZTsKKworCXUxNiBibXNyOworCWludCBjb3VudDsKKwlpbnQgYWN0X2NvdW50OworCWludCBhY3Rfb247CisKKwl1MzIgZWxtZXJfZ3BvOworCiAJc3RydWN0IGNwaHlfb3BzICpvcHM7ICAgICAgICAgICAgICAgIC8qIFBIWSBvcGVyYXRpb25zICovCiAJaW50ICgqbWRpb19yZWFkKShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLAogCQkJIGludCByZWdfYWRkciwgdW5zaWduZWQgaW50ICp2YWwpOwpAQCAtMTQyLDYgKzE2MCwxMCBAQAogCWludCAoKnJlc2V0KShhZGFwdGVyX3QgKmFkYXB0ZXIpOwogfTsKIAorZXh0ZXJuIHN0cnVjdCBncGh5IHQxX215MzEyNl9vcHM7CitleHRlcm4gc3RydWN0IGdwaHkgdDFfbXY4OGUxeHh4X29wczsKK2V4dGVybiBzdHJ1Y3QgZ3BoeSB0MV92c2M4MjQ0X29wczsKK2V4dGVybiBzdHJ1Y3QgZ3BoeSB0MV94cGFrX29wczsKIGV4dGVybiBzdHJ1Y3QgZ3BoeSB0MV9tdjg4eDIwMXhfb3BzOwogZXh0ZXJuIHN0cnVjdCBncGh5IHQxX2R1bW15X3BoeV9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BsNV9jbWQuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BsNV9jbWQuaAppbmRleCA1YjM1N2Q5Li4zNWY1NjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2NwbDVfY21kLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jcGw1X2NtZC5oCkBAIC00NiwyNCArNDYsMzg1IEBACiAjZW5kaWYKIAogZW51bSBDUExfb3Bjb2RlIHsKKwlDUExfUEFTU19PUEVOX1JFUSAgICAgPSAweDEsCisJQ1BMX1BBU1NfT1BFTl9SUEwgICAgID0gMHgyLAorCUNQTF9QQVNTX0VTVEFCTElTSCAgICA9IDB4MywKKwlDUExfUEFTU19BQ0NFUFRfUkVRICAgPSAweEUsCisJQ1BMX1BBU1NfQUNDRVBUX1JQTCAgID0gMHg0LAorCUNQTF9BQ1RfT1BFTl9SRVEgICAgICA9IDB4NSwKKwlDUExfQUNUX09QRU5fUlBMICAgICAgPSAweDYsCisJQ1BMX0NMT1NFX0NPTl9SRVEgICAgID0gMHg3LAorCUNQTF9DTE9TRV9DT05fUlBMICAgICA9IDB4OCwKKwlDUExfQ0xPU0VfTElTVFNSVl9SRVEgPSAweDksCisJQ1BMX0NMT1NFX0xJU1RTUlZfUlBMID0gMHhBLAorCUNQTF9BQk9SVF9SRVEgICAgICAgICA9IDB4QiwKKwlDUExfQUJPUlRfUlBMICAgICAgICAgPSAweEMsCisJQ1BMX1BFRVJfQ0xPU0UgICAgICAgID0gMHhELAorCUNQTF9BQ1RfRVNUQUJMSVNIICAgICA9IDB4MTcsCisKKwlDUExfR0VUX1RDQiAgICAgICAgICAgPSAweDI0LAorCUNQTF9HRVRfVENCX1JQTCAgICAgICA9IDB4MjUsCisJQ1BMX1NFVF9UQ0IgICAgICAgICAgID0gMHgyNiwKKwlDUExfU0VUX1RDQl9GSUVMRCAgICAgPSAweDI3LAorCUNQTF9TRVRfVENCX1JQTCAgICAgICA9IDB4MjgsCisJQ1BMX1BDTUQgICAgICAgICAgICAgID0gMHgyOSwKKworCUNQTF9QQ01EX1JFQUQgICAgICAgICA9IDB4MzEsCisJQ1BMX1BDTURfUkVBRF9SUEwgICAgID0gMHgzMiwKKworCisJQ1BMX1JYX0RBVEEgICAgICAgICAgID0gMHhBMCwKKwlDUExfUlhfREFUQV9ERFAgICAgICAgPSAweEExLAorCUNQTF9SWF9EQVRBX0FDSyAgICAgICA9IDB4QTMsCiAJQ1BMX1JYX1BLVCAgICAgICAgICAgID0gMHhBRCwKKwlDUExfUlhfSVNDU0lfSERSICAgICAgPSAweEFGLAorCUNQTF9UWF9EQVRBX0FDSyAgICAgICA9IDB4QjAsCisJQ1BMX1RYX0RBVEEgICAgICAgICAgID0gMHhCMSwKIAlDUExfVFhfUEtUICAgICAgICAgICAgPSAweEIyLAogCUNQTF9UWF9QS1RfTFNPICAgICAgICA9IDB4QjYsCisKKwlDUExfUlRFX0RFTEVURV9SRVEgICAgPSAweEMwLAorCUNQTF9SVEVfREVMRVRFX1JQTCAgICA9IDB4QzEsCisJQ1BMX1JURV9XUklURV9SRVEgICAgID0gMHhDMiwKKwlDUExfUlRFX1dSSVRFX1JQTCAgICAgPSAweEQzLAorCUNQTF9SVEVfUkVBRF9SRVEgICAgICA9IDB4QzMsCisJQ1BMX1JURV9SRUFEX1JQTCAgICAgID0gMHhDNCwKKwlDUExfTDJUX1dSSVRFX1JFUSAgICAgPSAweEM1LAorCUNQTF9MMlRfV1JJVEVfUlBMICAgICA9IDB4RDQsCisJQ1BMX0wyVF9SRUFEX1JFUSAgICAgID0gMHhDNiwKKwlDUExfTDJUX1JFQURfUlBMICAgICAgPSAweEM3LAorCUNQTF9TTVRfV1JJVEVfUkVRICAgICA9IDB4QzgsCisJQ1BMX1NNVF9XUklURV9SUEwgICAgID0gMHhENSwKKwlDUExfU01UX1JFQURfUkVRICAgICAgPSAweEM5LAorCUNQTF9TTVRfUkVBRF9SUEwgICAgICA9IDB4Q0EsCisJQ1BMX0FSUF9NSVNTX1JFUSAgICAgID0gMHhDRCwKKwlDUExfQVJQX01JU1NfUlBMICAgICAgPSAweENFLAorCUNQTF9NSUdSQVRFX0MyVF9SRVEgICA9IDB4REMsCisJQ1BMX01JR1JBVEVfQzJUX1JQTCAgID0gMHhERCwKKwlDUExfRVJST1IgICAgICAgICAgICAgPSAweEQ3LAorCisgICAgLyogaW50ZXJuYWw6IGRyaXZlciAtPiBUT00gKi8KKwlDUExfTVNTX0NIQU5HRSAgICAgICAgPSAweEUxCiB9OwogCi1lbnVtIHsgICAgICAgICAgICAgICAgLyogVFhfUEtUX0xTTyBldGhlcm5ldCB0eXBlcyAqLworI2RlZmluZSBOVU1fQ1BMX0NNRFMgMjU2CisKK2VudW0gQ1BMX2Vycm9yIHsKKwlDUExfRVJSX05PTkUgICAgICAgICAgICAgICA9IDAsCisJQ1BMX0VSUl9UQ0FNX1BBUklUWSAgICAgICAgPSAxLAorCUNQTF9FUlJfVENBTV9GVUxMICAgICAgICAgID0gMywKKwlDUExfRVJSX0NPTk5fUkVTRVQgICAgICAgICA9IDIwLAorCUNQTF9FUlJfQ09OTl9FWElTVCAgICAgICAgID0gMjIsCisJQ1BMX0VSUl9BUlBfTUlTUyAgICAgICAgICAgPSAyMywKKwlDUExfRVJSX0JBRF9TWU4gICAgICAgICAgICA9IDI0LAorCUNQTF9FUlJfQ09OTl9USU1FRE9VVCAgICAgID0gMzAsCisJQ1BMX0VSUl9YTUlUX1RJTUVET1VUICAgICAgPSAzMSwKKwlDUExfRVJSX1BFUlNJU1RfVElNRURPVVQgICA9IDMyLAorCUNQTF9FUlJfRklOV0FJVDJfVElNRURPVVQgID0gMzMsCisJQ1BMX0VSUl9LRUVQQUxJVkVfVElNRURPVVQgPSAzNCwKKwlDUExfRVJSX0FCT1JUX0ZBSUxFRCAgICAgICA9IDQyLAorCUNQTF9FUlJfR0VORVJBTCAgICAgICAgICAgID0gOTkKK307CisKK2VudW0geworCUNQTF9DT05OX1BPTElDWV9BVVRPID0gMCwKKwlDUExfQ09OTl9QT0xJQ1lfQVNLICA9IDEsCisJQ1BMX0NPTk5fUE9MSUNZX0RFTlkgPSAzCit9OworCitlbnVtIHsKKwlVTFBfTU9ERV9OT05FICAgPSAwLAorCVVMUF9NT0RFX1RDUEREUCA9IDEsCisJVUxQX01PREVfSVNDU0kgID0gMiwKKwlVTFBfTU9ERV9JV0FSUCAgPSAzLAorCVVMUF9NT0RFX1NTTCAgICA9IDQKK307CisKK2VudW0geworCUNQTF9QQVNTX09QRU5fQUNDRVBULAorCUNQTF9QQVNTX09QRU5fUkVKRUNUCit9OworCitlbnVtIHsKKwlDUExfQUJPUlRfU0VORF9SU1QgPSAwLAorCUNQTF9BQk9SVF9OT19SU1QsCisJQ1BMX0FCT1JUX1BPU1RfQ0xPU0VfUkVRID0gMgorfTsKKworZW51bSB7ICAgICAgICAgICAgICAgIC8vIFRYX1BLVF9MU08gZXRoZXJuZXQgdHlwZXMKIAlDUExfRVRIX0lJLAogCUNQTF9FVEhfSUlfVkxBTiwKIAlDUExfRVRIXzgwMl8zLAogCUNQTF9FVEhfODAyXzNfVkxBTgogfTsKIAotc3RydWN0IGNwbF9yeF9kYXRhIHsKK3VuaW9uIG9wY29kZV90aWQgeworICAgIHUzMiBvcGNvZGVfdGlkOworICAgIHU4IG9wY29kZTsKK307CisKKyNkZWZpbmUgU19PUENPREUgMjQKKyNkZWZpbmUgVl9PUENPREUoeCkgKCh4KSA8PCBTX09QQ09ERSkKKyNkZWZpbmUgR19PUENPREUoeCkgKCgoeCkgPj4gU19PUENPREUpICYgMHhGRikKKyNkZWZpbmUgR19USUQoeCkgICAgKCh4KSAmIDB4RkZGRkZGKQorCisvKiB0aWQgaXMgYXNzdW1lZCB0byBiZSAyNC1iaXRzICovCisjZGVmaW5lIE1LX09QQ09ERV9USUQob3Bjb2RlLCB0aWQpIChWX09QQ09ERShvcGNvZGUpIHwgKHRpZCkpCisKKyNkZWZpbmUgT1BDT0RFX1RJRChjbWQpICgoY21kKS0+b3Qub3Bjb2RlX3RpZCkKKworLyogZXh0cmFjdCB0aGUgVElEIGZyb20gYSBDUEwgY29tbWFuZCAqLworI2RlZmluZSBHRVRfVElEKGNtZCkgKEdfVElEKG50b2hsKE9QQ09ERV9USUQoY21kKSkpKQorCitzdHJ1Y3QgdGNwX29wdGlvbnMgeworCXUxNiBtc3M7CisJdTggd3NmOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXU4IHJzdmQ6NDsKKwl1OCBlY246MTsKKwl1OCBzYWNrOjE7CisJdTggdHN0YW1wOjE7CisjZWxzZQorCXU4IHRzdGFtcDoxOworCXU4IHNhY2s6MTsKKwl1OCBlY246MTsKKwl1OCByc3ZkOjQ7CisjZW5kaWYKK307CisKK3N0cnVjdCBjcGxfcGFzc19vcGVuX3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MTYgbG9jYWxfcG9ydDsKKwl1MTYgcGVlcl9wb3J0OworCXUzMiBsb2NhbF9pcDsKKwl1MzIgcGVlcl9pcDsKKwl1MzIgb3B0MGg7CisJdTMyIG9wdDBsOworCXUzMiBwZWVyX25ldG1hc2s7CisJdTMyIG9wdDE7Cit9OworCitzdHJ1Y3QgY3BsX3Bhc3Nfb3Blbl9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IGxvY2FsX3BvcnQ7CisJdTE2IHBlZXJfcG9ydDsKKwl1MzIgbG9jYWxfaXA7CisJdTMyIHBlZXJfaXA7CisJdTggcmVzdmRbN107CisJdTggc3RhdHVzOworfTsKKworc3RydWN0IGNwbF9wYXNzX2VzdGFibGlzaCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MTYgbG9jYWxfcG9ydDsKKwl1MTYgcGVlcl9wb3J0OworCXUzMiBsb2NhbF9pcDsKKwl1MzIgcGVlcl9pcDsKKwl1MzIgdG9zX3RpZDsKKwl1OCAgbDJ0X2lkeDsKKwl1OCAgcnN2ZFszXTsKKwl1MzIgc25kX2lzbjsKKwl1MzIgcmN2X2lzbjsKK307CisKK3N0cnVjdCBjcGxfcGFzc19hY2NlcHRfcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUxNiBsb2NhbF9wb3J0OworCXUxNiBwZWVyX3BvcnQ7CisJdTMyIGxvY2FsX2lwOworCXUzMiBwZWVyX2lwOworCXUzMiB0b3NfdGlkOworICAgIHN0cnVjdCB0Y3Bfb3B0aW9ucyB0Y3Bfb3B0aW9uczsKKwl1OCAgZHN0X21hY1s2XTsKKwl1MTYgdmxhbl90YWc7CisJdTggIHNyY19tYWNbNl07CisJdTggIHJzdmRbMl07CisJdTMyIHJjdl9pc247CisJdTMyIHVua25vd25fdGNwX29wdGlvbnM7Cit9OworCitzdHJ1Y3QgY3BsX3Bhc3NfYWNjZXB0X3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKIAl1MzIgcnN2ZDA7CisJdTMyIHJzdmQxOworCXUzMiBwZWVyX2lwOworCXUzMiBvcHQwaDsKKwl1bmlvbiB7CisJdTMyIG9wdDBsOworCXN0cnVjdCB7CisJICAgIHU4IHJzdmRbM107CisJICAgIHU4IHN0YXR1czsKKwl9OworICAgIH07Cit9OworCitzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MTYgbG9jYWxfcG9ydDsKKwl1MTYgcGVlcl9wb3J0OworCXUzMiBsb2NhbF9pcDsKKwl1MzIgcGVlcl9pcDsKKwl1MzIgb3B0MGg7CisJdTMyIG9wdDBsOworCXUzMiBpZmZfdmxhbnRhZzsKKwl1MzIgcnN2ZDsKK307CisKK3N0cnVjdCBjcGxfYWN0X29wZW5fcnBsIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUxNiBsb2NhbF9wb3J0OworCXUxNiBwZWVyX3BvcnQ7CisJdTMyIGxvY2FsX2lwOworCXUzMiBwZWVyX2lwOworCXUzMiBuZXdfdGlkOworCXU4ICByc3ZkWzNdOworCXU4ICBzdGF0dXM7Cit9OworCitzdHJ1Y3QgY3BsX2FjdF9lc3RhYmxpc2ggeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IGxvY2FsX3BvcnQ7CisJdTE2IHBlZXJfcG9ydDsKKwl1MzIgbG9jYWxfaXA7CisJdTMyIHBlZXJfaXA7CisJdTMyIHRvc190aWQ7CisJdTMyIHJzdmQ7CisJdTMyIHNuZF9pc247CisJdTMyIHJjdl9pc247Cit9OworCitzdHJ1Y3QgY3BsX2dldF90Y2IgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIHJzdmQ7Cit9OworCitzdHJ1Y3QgY3BsX2dldF90Y2JfcnBsIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUxNiBsZW47CisJdTggcnN2ZDsKKwl1OCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgY3BsX3NldF90Y2IgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTE2IGxlbjsKKwl1MTYgcnN2ZDsKK307CisKK3N0cnVjdCBjcGxfc2V0X3RjYl9maWVsZCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCByc3ZkWzNdOworCXU4IG9mZnNldDsKKwl1MzIgbWFzazsKKwl1MzIgdmFsOworfTsKKworc3RydWN0IGNwbF9zZXRfdGNiX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCByc3ZkWzNdOworCXU4IHN0YXR1czsKK307CisKK3N0cnVjdCBjcGxfcGNtZCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MTYgZGxlbl9pbjsKKwl1MTYgZGxlbl9vdXQ7CisJdTMyIHBjbWRfcGFybVsyXTsKK307CisKK3N0cnVjdCBjcGxfcGNtZF9yZWFkIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiByc3ZkMTsKKwl1MTYgcnN2ZDI7CisJdTMyIGFkZHI7CisJdTE2IGxlbjsKK307CisKK3N0cnVjdCBjcGxfcGNtZF9yZWFkX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MTYgbGVuOworfTsKKworc3RydWN0IGNwbF9jbG9zZV9jb25fcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiByc3ZkOworfTsKKworc3RydWN0IGNwbF9jbG9zZV9jb25fcnBsIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXU4IHJzdmRbM107CisJdTggc3RhdHVzOworCXUzMiBzbmRfbnh0OworCXUzMiByY3Zfbnh0OworfTsKKworc3RydWN0IGNwbF9jbG9zZV9saXN0c2Vydl9yZXEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIHJzdmQ7Cit9OworCitzdHJ1Y3QgY3BsX2Nsb3NlX2xpc3RzZXJ2X3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCByc3ZkWzNdOworCXU4IHN0YXR1czsKK307CisKK3N0cnVjdCBjcGxfYWJvcnRfcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiByc3ZkMDsKKwl1OCAgcnN2ZDE7CisJdTggIGNtZDsKKwl1OCAgcnN2ZDJbNl07Cit9OworCitzdHJ1Y3QgY3BsX2Fib3J0X3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcnN2ZDA7CisJdTggIHJzdmQxOworCXU4ICBzdGF0dXM7CisJdTggIHJzdmQyWzZdOworfTsKKworc3RydWN0IGNwbF9wZWVyX2Nsb3NlIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiByc3ZkOworfTsKKworc3RydWN0IGNwbF90eF9kYXRhIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiBsZW47CisJdTMyIHJzdmQwOworCXUxNiB1cmc7CisJdTE2IGZsYWdzOworfTsKKworc3RydWN0IGNwbF90eF9kYXRhX2FjayB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgYWNrX3NlcTsKK307CisKK3N0cnVjdCBjcGxfcnhfZGF0YSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKIAl1MzIgbGVuOwogCXUzMiBzZXE7CiAJdTE2IHVyZzsKLQl1OCAgcnN2ZDE7CisJdTggIHJzdmQ7CisJdTggIHN0YXR1czsKK307CisKK3N0cnVjdCBjcGxfcnhfZGF0YV9hY2sgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIGNyZWRpdDsKK307CisKK3N0cnVjdCBjcGxfcnhfZGF0YV9kZHAgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIGxlbjsKKwl1MzIgc2VxOworCXUzMiBueHRfc2VxOworCXUzMiB1bHBfY3JjOworCXUxNiBkZHBfc3RhdHVzOworCXU4ICByc3ZkOwogCXU4ICBzdGF0dXM7CiB9OwogCkBAIC05OSw5ICs0NjAsOSBAQAogCXU4IGlwX2NzdW1fZGlzOjE7CiAJdTggbDRfY3N1bV9kaXM6MTsKIAl1OCB2bGFuX3ZhbGlkOjE7Ci0JdTggcnN2ZDoxOworCXU4IDoxOwogI2Vsc2UKLQl1OCByc3ZkOjE7CisJdTggOjE7CiAJdTggdmxhbl92YWxpZDoxOwogCXU4IGw0X2NzdW1fZGlzOjE7CiAJdTggaXBfY3N1bV9kaXM6MTsKQEAgLTExMCw4ICs0NzEsNyBAQAogCXUxNiB2bGFuOwogCV9fYmUzMiBsZW47CiAKLQl1MzIgcnN2ZDI7Ci0JdTggcnN2ZDM7CisJdTggcnN2ZFs1XTsKICNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKIAl1OCB0Y3BfaGRyX3dvcmRzOjQ7CiAJdTggaXBfaGRyX3dvcmRzOjQ7CkBAIC0xMzgsOCArNDk4LDE0MiBAQAogCXU4IGlmZjo0OwogI2VuZGlmCiAJdTE2IGNzdW07Ci0JX19iZTE2IHZsYW47CisJdTE2IHZsYW47CiAJdTE2IGxlbjsKIH07CiAKK3N0cnVjdCBjcGxfbDJ0X3dyaXRlX3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcGFyYW1zOworCXU4IHJzdmQxWzJdOworCXU4IGRzdF9tYWNbNl07Cit9OworCitzdHJ1Y3QgY3BsX2wydF93cml0ZV9ycGwgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTggc3RhdHVzOworCXU4IHJzdmRbM107Cit9OworCitzdHJ1Y3QgY3BsX2wydF9yZWFkX3JlcSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCByc3ZkWzNdOworCXU4IGwydF9pZHg7Cit9OworCitzdHJ1Y3QgY3BsX2wydF9yZWFkX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgcGFyYW1zOworCXU4IHJzdmQxWzJdOworCXU4IGRzdF9tYWNbNl07Cit9OworCitzdHJ1Y3QgY3BsX3NtdF93cml0ZV9yZXEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTggcnN2ZDA7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdTggcnN2ZDE6MTsKKwl1OCBtdHVfaWR4OjM7CisJdTggaWZmOjQ7CisjZWxzZQorCXU4IGlmZjo0OworCXU4IG10dV9pZHg6MzsKKwl1OCByc3ZkMToxOworI2VuZGlmCisJdTE2IHJzdmQyOworCXUxNiByc3ZkMzsKKwl1OCAgc3JjX21hYzFbNl07CisJdTE2IHJzdmQ0OworCXU4ICBzcmNfbWFjMFs2XTsKK307CisKK3N0cnVjdCBjcGxfc210X3dyaXRlX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCBzdGF0dXM7CisJdTggcnN2ZFszXTsKK307CisKK3N0cnVjdCBjcGxfc210X3JlYWRfcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXU4IHJzdmQwOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXU4IHJzdmQxOjQ7CisJdTggaWZmOjQ7CisjZWxzZQorCXU4IGlmZjo0OworCXU4IHJzdmQxOjQ7CisjZW5kaWYKKwl1MTYgcnN2ZDI7Cit9OworCitzdHJ1Y3QgY3BsX3NtdF9yZWFkX3JwbCB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1OCBzdGF0dXM7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJdTggcnN2ZDE6MTsKKwl1OCBtdHVfaWR4OjM7CisJdTggcnN2ZDA6NDsKKyNlbHNlCisJdTggcnN2ZDA6NDsKKwl1OCBtdHVfaWR4OjM7CisJdTggcnN2ZDE6MTsKKyNlbmRpZgorCXUxNiByc3ZkMjsKKwl1MTYgcnN2ZDM7CisJdTggIHNyY19tYWMxWzZdOworCXUxNiByc3ZkNDsKKwl1OCAgc3JjX21hYzBbNl07Cit9OworCitzdHJ1Y3QgY3BsX3J0ZV9kZWxldGVfcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiBwYXJhbXM7Cit9OworCitzdHJ1Y3QgY3BsX3J0ZV9kZWxldGVfcnBsIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXU4IHN0YXR1czsKKwl1OCByc3ZkWzNdOworfTsKKworc3RydWN0IGNwbF9ydGVfd3JpdGVfcmVxIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXUzMiBwYXJhbXM7CisJdTMyIG5ldG1hc2s7CisJdTMyIGZhZGRyOworfTsKKworc3RydWN0IGNwbF9ydGVfd3JpdGVfcnBsIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXU4IHN0YXR1czsKKwl1OCByc3ZkWzNdOworfTsKKworc3RydWN0IGNwbF9ydGVfcmVhZF9yZXEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJdTMyIHBhcmFtczsKK307CisKK3N0cnVjdCBjcGxfcnRlX3JlYWRfcnBsIHsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCXU4IHN0YXR1czsKKwl1OCByc3ZkMFsyXTsKKwl1OCBsMnRfaWR4OworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCXU4IHJzdmQxOjc7CisJdTggc2VsZWN0OjE7CisjZWxzZQorCXU4IHNlbGVjdDoxOworCXU4IHJzdmQxOjc7CisjZW5kaWYKKwl1OCByc3ZkMlszXTsKKwl1MzIgYWRkcjsKK307CisKK3N0cnVjdCBjcGxfbXNzX2NoYW5nZSB7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwl1MzIgbXNzOworfTsKKwogI2VuZGlmIC8qIF9DWEdCX0NQTDVfQ01EX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3hnYjIuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3hnYjIuYwppbmRleCBhZDdmZjk2Li5mZDVkODIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3hnYjIuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtNTQsMzYgKzUzLDEwIEBACiAjaW5jbHVkZSAiZ21hYy5oIgogI2luY2x1ZGUgImNwaHkuaCIKICNpbmNsdWRlICJzZ2UuaCIKKyNpbmNsdWRlICJ0cC5oIgogI2luY2x1ZGUgImVzcGkuaCIKKyNpbmNsdWRlICJlbG1lcjAuaCIKIAotI2lmZGVmIHdvcmtfc3RydWN0Ci0jaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+Ci0jZGVmaW5lIElOSVRfV09SSyBJTklUX1RRVUVVRQotI2RlZmluZSBzY2hlZHVsZV93b3JrIHNjaGVkdWxlX3Rhc2sKLSNkZWZpbmUgZmx1c2hfc2NoZWR1bGVkX3dvcmsgZmx1c2hfc2NoZWR1bGVkX3Rhc2tzCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZHVsZV9tYWNfc3RhdHNfdXBkYXRlKHN0cnVjdCBhZGFwdGVyICphcCwgaW50IHNlY3MpCi17Ci0JbW9kX3RpbWVyKCZhcC0+c3RhdHNfdXBkYXRlX3RpbWVyLCBqaWZmaWVzICsgc2VjcyAqIEhaKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNhbmNlbF9tYWNfc3RhdHNfdXBkYXRlKHN0cnVjdCBhZGFwdGVyICphcCkKLXsKLQlkZWxfdGltZXJfc3luYygmYXAtPnN0YXRzX3VwZGF0ZV90aW1lcik7Ci0JZmx1c2hfc2NoZWR1bGVkX3Rhc2tzKCk7Ci19Ci0KLS8qCi0gKiBTdGF0cyB1cGRhdGUgdGltZXIgZm9yIDIuNC4gIEl0IHNjaGVkdWxlcyBhIHRhc2sgdG8gZG8gdGhlIGFjdHVhbCB1cGRhdGUgYXMKLSAqIHdlIG5lZWQgdG8gYWNjZXNzIE1BQyBzdGF0aXN0aWNzIGluIHByb2Nlc3MgY29udGV4dC4KLSAqLwotc3RhdGljIHZvaWQgbWFjX3N0YXRzX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYXAgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwotCi0Jc2NoZWR1bGVfdGFzaygmYXAtPnN0YXRzX3VwZGF0ZV90YXNrKTsKLX0KLSNlbHNlCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZHVsZV9tYWNfc3RhdHNfdXBkYXRlKHN0cnVjdCBhZGFwdGVyICphcCwgaW50IHNlY3MpCkBAIC05NSw3ICs2OCw2IEBACiB7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmYXAtPnN0YXRzX3VwZGF0ZV90YXNrKTsKIH0KLSNlbmRpZgogCiAjZGVmaW5lIE1BWF9DTURRX0VOVFJJRVMgMTYzODQKICNkZWZpbmUgTUFYX0NNRFExX0VOVFJJRVMgMTAyNApAQCAtMTAzLDEwICs3NSw5IEBACiAjZGVmaW5lIE1BWF9SWF9KVU1CT19CVUZGRVJTIDE2Mzg0CiAjZGVmaW5lIE1BWF9UWF9CVUZGRVJTX0hJR0gJMTYzODRVCiAjZGVmaW5lIE1BWF9UWF9CVUZGRVJTX0xPVwkxNTM2VQorI2RlZmluZSBNQVhfVFhfQlVGRkVSUwkJMTQ2MFUKICNkZWZpbmUgTUlOX0ZMX0VOVFJJRVMgMzIKIAotI2RlZmluZSBQT1JUX01BU0sgKCgxIDw8IE1BWF9OUE9SVFMpIC0gMSkKLQogI2RlZmluZSBERkxUX01TR19FTkFCTEUgKE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSyB8IFwKIAkJCSBORVRJRl9NU0dfVElNRVIgfCBORVRJRl9NU0dfSUZET1dOIHwgTkVUSUZfTVNHX0lGVVAgfFwKIAkJCSBORVRJRl9NU0dfUlhfRVJSIHwgTkVUSUZfTVNHX1RYX0VSUikKQEAgLTEyNCw4ICs5NSwyMSBAQAogc3RhdGljIGludCBkZmx0X21zZ19lbmFibGUgPSBERkxUX01TR19FTkFCTEU7CiAKIG1vZHVsZV9wYXJhbShkZmx0X21zZ19lbmFibGUsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRmbHRfbXNnX2VuYWJsZSwgIkNoZWxzaW8gVDEgbWVzc2FnZSBlbmFibGUgYml0bWFwIik7CitNT0RVTEVfUEFSTV9ERVNDKGRmbHRfbXNnX2VuYWJsZSwgIkNoZWxzaW8gVDEgZGVmYXVsdCBtZXNzYWdlIGVuYWJsZSBiaXRtYXAiKTsKIAorI2RlZmluZSBIQ0xPQ0sgMHgwCisjZGVmaW5lIExDTE9DSyAweDEKKworLyogVDEgY2FyZHMgcG93ZXJzYXZlIG1vZGUgKi8KK3N0YXRpYyBpbnQgdDFfY2xvY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBtb2RlKTsKK3N0YXRpYyBpbnQgdDFwb3dlcnNhdmUgPSAxOwkvKiBIVyBkZWZhdWx0IGlzIHBvd2Vyc2F2ZSBtb2RlLiAqLworCittb2R1bGVfcGFyYW0odDFwb3dlcnNhdmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHQxcG93ZXJzYXZlLCAiRW5hYmxlL0Rpc2FibGUgVDEgcG93ZXJzYXZpbmcgbW9kZSIpOworCitzdGF0aWMgaW50IGRpc2FibGVfbXNpID0gMDsKK21vZHVsZV9wYXJhbShkaXNhYmxlX21zaSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9tc2ksICJEaXNhYmxlIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0IChNU0kpIik7CiAKIHN0YXRpYyBjb25zdCBjaGFyIHBjaV9zcGVlZFtdWzRdID0gewogCSIzMyIsICI2NiIsICIxMDAiLCAiMTMzIgpAQCAtMTQ5LDcgKzEzMyw3IEBACiBzdGF0aWMgdm9pZCBsaW5rX3JlcG9ydChzdHJ1Y3QgcG9ydF9pbmZvICpwKQogewogCWlmICghbmV0aWZfY2Fycmllcl9vayhwLT5kZXYpKQotICAgICAgICAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgcC0+ZGV2LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgcC0+ZGV2LT5uYW1lKTsKIAllbHNlIHsKIAkJY29uc3QgY2hhciAqcyA9ICIxME1icHMiOwogCkBAIC0xNTksMTMgKzE0MywxMyBAQAogCQkJY2FzZSBTUEVFRF8xMDA6ICAgcyA9ICIxMDBNYnBzIjsgYnJlYWs7CiAJCX0KIAotICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cCwgJXMsICVzLWR1cGxleFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cCwgJXMsICVzLWR1cGxleFxuIiwKIAkJICAgICAgIHAtPmRldi0+bmFtZSwgcywKIAkJICAgICAgIHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBEVVBMRVhfRlVMTCA/ICJmdWxsIiA6ICJoYWxmIik7CiAJfQogfQogCi12b2lkIHQxX2xpbmtfY2hhbmdlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnRfaWQsIGludCBsaW5rX3N0YXQsCit2b2lkIHQxX2xpbmtfbmVnb3RpYXRlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnRfaWQsIGludCBsaW5rX3N0YXQsCiAJCQlpbnQgc3BlZWQsIGludCBkdXBsZXgsIGludCBwYXVzZSkKIHsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gJmFkYXB0ZXItPnBvcnRbcG9ydF9pZF07CkBAIC0xNzcsNiArMTYxLDIyIEBACiAJCQluZXRpZl9jYXJyaWVyX29mZihwLT5kZXYpOwogCQlsaW5rX3JlcG9ydChwKTsKIAorCQkvKiBtdWx0aS1wb3J0czogaW5mb3JtIHRvZSAqLworCQlpZiAoKHNwZWVkID4gMCkgJiYgKGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgPiAxKSkgeworCQkJdW5zaWduZWQgaW50IHNjaGVkX3NwZWVkID0gMTA7CisJCQlzd2l0Y2ggKHNwZWVkKSB7CisJCQljYXNlIFNQRUVEXzEwMDA6CisJCQkJc2NoZWRfc3BlZWQgPSAxMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBTUEVFRF8xMDA6CisJCQkJc2NoZWRfc3BlZWQgPSAxMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFNQRUVEXzEwOgorCQkJCXNjaGVkX3NwZWVkID0gMTA7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0MV9zY2hlZF91cGRhdGVfcGFybXMoYWRhcHRlci0+c2dlLCBwb3J0X2lkLCAwLCBzY2hlZF9zcGVlZCk7CisJCX0KIAl9CiB9CiAKQEAgLTE5NSw4ICsxOTUsMTAgQEAKIHN0YXRpYyB2b2lkIGVuYWJsZV9od19jc3VtKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWlmIChhZGFwdGVyLT5mbGFncyAmIFRTT19DQVBBQkxFKQotCQl0MV90cF9zZXRfaXBfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyLCAxKTsgLyogZm9yIFRTTyBvbmx5ICovCi0JdDFfdHBfc2V0X3RjcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXIsIDEpOworCQl0MV90cF9zZXRfaXBfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyLT50cCwgMSk7CS8qIGZvciBUU08gb25seSAqLworCWlmIChhZGFwdGVyLT5mbGFncyAmIFVEUF9DU1VNX0NBUEFCTEUpCisJCXQxX3RwX3NldF91ZHBfY2hlY2tzdW1fb2ZmbG9hZChhZGFwdGVyLT50cCwgMSk7CisJdDFfdHBfc2V0X3RjcF9jaGVja3N1bV9vZmZsb2FkKGFkYXB0ZXItPnRwLCAxKTsKIH0KIAogLyoKQEAgLTIxNywxMSArMjE5LDE4IEBACiAJfQogCiAJdDFfaW50ZXJydXB0c19jbGVhcihhZGFwdGVyKTsKLQlpZiAoKGVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwKLQkJCSAgICAgICB0MV9zZWxlY3RfaW50cl9oYW5kbGVyKGFkYXB0ZXIpLCBJUlFGX1NIQVJFRCwKLQkJCSAgICAgICBhZGFwdGVyLT5uYW1lLCBhZGFwdGVyKSkpIHsKKworCWFkYXB0ZXItPnBhcmFtcy5oYXNfbXNpID0gIWRpc2FibGVfbXNpICYmICFwY2lfZW5hYmxlX21zaShhZGFwdGVyLT5wZGV2KTsKKwllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIHQxX2ludGVycnVwdCwKKwkJCSAgYWRhcHRlci0+cGFyYW1zLmhhc19tc2kgPyAwIDogSVJRRl9TSEFSRUQsCisJCQkgIGFkYXB0ZXItPm5hbWUsIGFkYXB0ZXIpOworCWlmIChlcnIpIHsKKwkJaWYgKGFkYXB0ZXItPnBhcmFtcy5oYXNfbXNpKQorCQkJcGNpX2Rpc2FibGVfbXNpKGFkYXB0ZXItPnBkZXYpOworCiAJCWdvdG8gb3V0X2VycjsKIAl9CisKIAl0MV9zZ2Vfc3RhcnQoYWRhcHRlci0+c2dlKTsKIAl0MV9pbnRlcnJ1cHRzX2VuYWJsZShhZGFwdGVyKTsKICBvdXRfZXJyOgpAQCAtMjM2LDYgKzI0NSw4IEBACiAJdDFfc2dlX3N0b3AoYWRhcHRlci0+c2dlKTsKIAl0MV9pbnRlcnJ1cHRzX2Rpc2FibGUoYWRhcHRlcik7CiAJZnJlZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBhZGFwdGVyKTsKKwlpZiAoYWRhcHRlci0+cGFyYW1zLmhhc19tc2kpCisJCXBjaV9kaXNhYmxlX21zaShhZGFwdGVyLT5wZGV2KTsKIH0KIAogc3RhdGljIGludCBjeGdiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI5MCw3ICszMDEsNyBAQAogCiAJLyogRG8gYSBmdWxsIHVwZGF0ZSBvZiB0aGUgTUFDIHN0YXRzICovCiAJcHN0YXRzID0gcC0+bWFjLT5vcHMtPnN0YXRpc3RpY3NfdXBkYXRlKHAtPm1hYywKLQkJCQkJCSAgICAgIE1BQ19TVEFUU19VUERBVEVfRlVMTCk7CisJCQkJCQlNQUNfU1RBVFNfVVBEQVRFX0ZVTEwpOwogCiAJbnMtPnR4X3BhY2tldHMgPSBwc3RhdHMtPlR4VW5pY2FzdEZyYW1lc09LICsKIAkJcHN0YXRzLT5UeE11bHRpY2FzdEZyYW1lc09LICsgcHN0YXRzLT5UeEJyb2FkY2FzdEZyYW1lc09LOwpAQCAtMzQ0LDQ3ICszNTUsNTMgQEAKIH0KIAogc3RhdGljIGNoYXIgc3RhdHNfc3RyaW5nc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7Ci0gICAgICAgICJUeE9jdGV0c09LIiwKLSAgICAgICAgIlR4T2N0ZXRzQmFkIiwKLSAgICAgICAgIlR4VW5pY2FzdEZyYW1lc09LIiwKLSAgICAgICAgIlR4TXVsdGljYXN0RnJhbWVzT0siLAotICAgICAgICAiVHhCcm9hZGNhc3RGcmFtZXNPSyIsCi0gICAgICAgICJUeFBhdXNlRnJhbWVzIiwKLSAgICAgICAgIlR4RnJhbWVzV2l0aERlZmVycmVkWG1pc3Npb25zIiwKLSAgICAgICAgIlR4TGF0ZUNvbGxpc2lvbnMiLAotICAgICAgICAiVHhUb3RhbENvbGxpc2lvbnMiLAotICAgICAgICAiVHhGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxpc2lvbnMiLAotICAgICAgICAiVHhVbmRlcnJ1biIsCi0gICAgICAgICJUeExlbmd0aEVycm9ycyIsCi0gICAgICAgICJUeEludGVybmFsTUFDWG1pdEVycm9yIiwKLSAgICAgICAgIlR4RnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsIiwKLSAgICAgICAgIlR4RkNTRXJyb3JzIiwKKwkiVHhPY3RldHNPSyIsCisJIlR4T2N0ZXRzQmFkIiwKKwkiVHhVbmljYXN0RnJhbWVzT0siLAorCSJUeE11bHRpY2FzdEZyYW1lc09LIiwKKwkiVHhCcm9hZGNhc3RGcmFtZXNPSyIsCisJIlR4UGF1c2VGcmFtZXMiLAorCSJUeEZyYW1lc1dpdGhEZWZlcnJlZFhtaXNzaW9ucyIsCisJIlR4TGF0ZUNvbGxpc2lvbnMiLAorCSJUeFRvdGFsQ29sbGlzaW9ucyIsCisJIlR4RnJhbWVzQWJvcnRlZER1ZVRvWFNDb2xsaXNpb25zIiwKKwkiVHhVbmRlcnJ1biIsCisJIlR4TGVuZ3RoRXJyb3JzIiwKKwkiVHhJbnRlcm5hbE1BQ1htaXRFcnJvciIsCisJIlR4RnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsIiwKKwkiVHhGQ1NFcnJvcnMiLAogCi0gICAgICAgICJSeE9jdGV0c09LIiwKLSAgICAgICAgIlJ4T2N0ZXRzQmFkIiwKLSAgICAgICAgIlJ4VW5pY2FzdEZyYW1lc09LIiwKLSAgICAgICAgIlJ4TXVsdGljYXN0RnJhbWVzT0siLAotICAgICAgICAiUnhCcm9hZGNhc3RGcmFtZXNPSyIsCi0gICAgICAgICJSeFBhdXNlRnJhbWVzIiwKLSAgICAgICAgIlJ4RkNTRXJyb3JzIiwKLSAgICAgICAgIlJ4QWxpZ25FcnJvcnMiLAotICAgICAgICAiUnhTeW1ib2xFcnJvcnMiLAotICAgICAgICAiUnhEYXRhRXJyb3JzIiwKLSAgICAgICAgIlJ4U2VxdWVuY2VFcnJvcnMiLAotICAgICAgICAiUnhSdW50RXJyb3JzIiwKLSAgICAgICAgIlJ4SmFiYmVyRXJyb3JzIiwKLSAgICAgICAgIlJ4SW50ZXJuYWxNQUNSY3ZFcnJvciIsCi0gICAgICAgICJSeEluUmFuZ2VMZW5ndGhFcnJvcnMiLAotICAgICAgICAiUnhPdXRPZlJhbmdlTGVuZ3RoRmllbGQiLAotICAgICAgICAiUnhGcmFtZVRvb0xvbmdFcnJvcnMiLAorCSJSeE9jdGV0c09LIiwKKwkiUnhPY3RldHNCYWQiLAorCSJSeFVuaWNhc3RGcmFtZXNPSyIsCisJIlJ4TXVsdGljYXN0RnJhbWVzT0siLAorCSJSeEJyb2FkY2FzdEZyYW1lc09LIiwKKwkiUnhQYXVzZUZyYW1lcyIsCisJIlJ4RkNTRXJyb3JzIiwKKwkiUnhBbGlnbkVycm9ycyIsCisJIlJ4U3ltYm9sRXJyb3JzIiwKKwkiUnhEYXRhRXJyb3JzIiwKKwkiUnhTZXF1ZW5jZUVycm9ycyIsCisJIlJ4UnVudEVycm9ycyIsCisJIlJ4SmFiYmVyRXJyb3JzIiwKKwkiUnhJbnRlcm5hbE1BQ1JjdkVycm9yIiwKKwkiUnhJblJhbmdlTGVuZ3RoRXJyb3JzIiwKKwkiUnhPdXRPZlJhbmdlTGVuZ3RoRmllbGQiLAorCSJSeEZyYW1lVG9vTG9uZ0Vycm9ycyIsCiAKLQkiVFNPIiwKLQkiVkxBTmV4dHJhY3Rpb25zIiwKLQkiVkxBTmluc2VydGlvbnMiLAorCS8qIFBvcnQgc3RhdHMgKi8KKwkiUnhQYWNrZXRzIiwKIAkiUnhDc3VtR29vZCIsCisJIlR4UGFja2V0cyIsCiAJIlR4Q3N1bU9mZmxvYWQiLAotCSJSeERyb3BzIgorCSJUeFRzbyIsCisJIlJ4VmxhbiIsCisJIlR4VmxhbiIsCiAKKwkvKiBJbnRlcnJ1cHQgc3RhdHMgKi8KKwkicnggZHJvcHMiLAorCSJwdXJlX3JzcHMiLAorCSJ1bmhhbmRsZWQgaXJxcyIsCiAJInJlc3BRX2VtcHR5IiwKIAkicmVzcFFfb3ZlcmZsb3ciLAogCSJmcmVlbGlzdFFfZW1wdHkiLApAQCAtMzkyLDExICs0MDksNyBAQAogCSJwa3RfbWlzbWF0Y2giLAogCSJjbWRRX2Z1bGwwIiwKIAkiY21kUV9mdWxsMSIsCi0JInR4X2lwZnJhZ3MiLAotCSJ0eF9yZWdfcGt0cyIsCi0JInR4X2xzb19wa3RzIiwKLQkidHhfZG9fY2tzdW0iLAotCQorCiAJImVzcGlfRElQMlBhcml0eUVyciIsCiAJImVzcGlfRElQNEVyciIsCiAJImVzcGlfUnhEcm9wcyIsCkBAIC00MDQsNyArNDE3LDcgQEAKIAkiZXNwaV9SeE92ZmwiLAogCSJlc3BpX1Bhcml0eUVyciIKIH07Ci0gCisKICNkZWZpbmUgVDJfUkVHTUFQX1NJWkUgKDMgKiAxMDI0KQogCiBzdGF0aWMgaW50IGdldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNDM5LDY1ICs0NTIsNzcgQEAKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgY21hYyAqbWFjID0gYWRhcHRlci0+cG9ydFtkZXYtPmlmX3BvcnRdLm1hYzsKIAljb25zdCBzdHJ1Y3QgY21hY19zdGF0aXN0aWNzICpzOwotCWNvbnN0IHN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqc3M7CiAJY29uc3Qgc3RydWN0IHNnZV9pbnRyX2NvdW50cyAqdDsKKwlzdHJ1Y3Qgc2dlX3BvcnRfc3RhdHMgc3M7CiAKIAlzID0gbWFjLT5vcHMtPnN0YXRpc3RpY3NfdXBkYXRlKG1hYywgTUFDX1NUQVRTX1VQREFURV9GVUxMKTsKLQlzcyA9IHQxX3NnZV9nZXRfcG9ydF9zdGF0cyhhZGFwdGVyLT5zZ2UsIGRldi0+aWZfcG9ydCk7CisKKwkqZGF0YSsrID0gcy0+VHhPY3RldHNPSzsKKwkqZGF0YSsrID0gcy0+VHhPY3RldHNCYWQ7CisJKmRhdGErKyA9IHMtPlR4VW5pY2FzdEZyYW1lc09LOworCSpkYXRhKysgPSBzLT5UeE11bHRpY2FzdEZyYW1lc09LOworCSpkYXRhKysgPSBzLT5UeEJyb2FkY2FzdEZyYW1lc09LOworCSpkYXRhKysgPSBzLT5UeFBhdXNlRnJhbWVzOworCSpkYXRhKysgPSBzLT5UeEZyYW1lc1dpdGhEZWZlcnJlZFhtaXNzaW9uczsKKwkqZGF0YSsrID0gcy0+VHhMYXRlQ29sbGlzaW9uczsKKwkqZGF0YSsrID0gcy0+VHhUb3RhbENvbGxpc2lvbnM7CisJKmRhdGErKyA9IHMtPlR4RnJhbWVzQWJvcnRlZER1ZVRvWFNDb2xsaXNpb25zOworCSpkYXRhKysgPSBzLT5UeFVuZGVycnVuOworCSpkYXRhKysgPSBzLT5UeExlbmd0aEVycm9yczsKKwkqZGF0YSsrID0gcy0+VHhJbnRlcm5hbE1BQ1htaXRFcnJvcjsKKwkqZGF0YSsrID0gcy0+VHhGcmFtZXNXaXRoRXhjZXNzaXZlRGVmZXJyYWw7CisJKmRhdGErKyA9IHMtPlR4RkNTRXJyb3JzOworCisJKmRhdGErKyA9IHMtPlJ4T2N0ZXRzT0s7CisJKmRhdGErKyA9IHMtPlJ4T2N0ZXRzQmFkOworCSpkYXRhKysgPSBzLT5SeFVuaWNhc3RGcmFtZXNPSzsKKwkqZGF0YSsrID0gcy0+UnhNdWx0aWNhc3RGcmFtZXNPSzsKKwkqZGF0YSsrID0gcy0+UnhCcm9hZGNhc3RGcmFtZXNPSzsKKwkqZGF0YSsrID0gcy0+UnhQYXVzZUZyYW1lczsKKwkqZGF0YSsrID0gcy0+UnhGQ1NFcnJvcnM7CisJKmRhdGErKyA9IHMtPlJ4QWxpZ25FcnJvcnM7CisJKmRhdGErKyA9IHMtPlJ4U3ltYm9sRXJyb3JzOworCSpkYXRhKysgPSBzLT5SeERhdGFFcnJvcnM7CisJKmRhdGErKyA9IHMtPlJ4U2VxdWVuY2VFcnJvcnM7CisJKmRhdGErKyA9IHMtPlJ4UnVudEVycm9yczsKKwkqZGF0YSsrID0gcy0+UnhKYWJiZXJFcnJvcnM7CisJKmRhdGErKyA9IHMtPlJ4SW50ZXJuYWxNQUNSY3ZFcnJvcjsKKwkqZGF0YSsrID0gcy0+UnhJblJhbmdlTGVuZ3RoRXJyb3JzOworCSpkYXRhKysgPSBzLT5SeE91dE9mUmFuZ2VMZW5ndGhGaWVsZDsKKwkqZGF0YSsrID0gcy0+UnhGcmFtZVRvb0xvbmdFcnJvcnM7CisKKwl0MV9zZ2VfZ2V0X3BvcnRfc3RhdHMoYWRhcHRlci0+c2dlLCBkZXYtPmlmX3BvcnQsICZzcyk7CisJKmRhdGErKyA9IHNzLnJ4X3BhY2tldHM7CisJKmRhdGErKyA9IHNzLnJ4X2Nzb19nb29kOworCSpkYXRhKysgPSBzcy50eF9wYWNrZXRzOworCSpkYXRhKysgPSBzcy50eF9jc287CisJKmRhdGErKyA9IHNzLnR4X3RzbzsKKwkqZGF0YSsrID0gc3Mudmxhbl94dHJhY3Q7CisJKmRhdGErKyA9IHNzLnZsYW5faW5zZXJ0OworCiAJdCA9IHQxX3NnZV9nZXRfaW50cl9jb3VudHMoYWRhcHRlci0+c2dlKTsKKwkqZGF0YSsrID0gdC0+cnhfZHJvcHM7CisJKmRhdGErKyA9IHQtPnB1cmVfcnNwczsKKwkqZGF0YSsrID0gdC0+dW5oYW5kbGVkX2lycXM7CisJKmRhdGErKyA9IHQtPnJlc3BRX2VtcHR5OworCSpkYXRhKysgPSB0LT5yZXNwUV9vdmVyZmxvdzsKKwkqZGF0YSsrID0gdC0+ZnJlZWxpc3RRX2VtcHR5OworCSpkYXRhKysgPSB0LT5wa3RfdG9vX2JpZzsKKwkqZGF0YSsrID0gdC0+cGt0X21pc21hdGNoOworCSpkYXRhKysgPSB0LT5jbWRRX2Z1bGxbMF07CisJKmRhdGErKyA9IHQtPmNtZFFfZnVsbFsxXTsKIAotICAgICAgICAqZGF0YSsrID0gcy0+VHhPY3RldHNPSzsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4T2N0ZXRzQmFkOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhVbmljYXN0RnJhbWVzT0s7Ci0gICAgICAgICpkYXRhKysgPSBzLT5UeE11bHRpY2FzdEZyYW1lc09LOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhCcm9hZGNhc3RGcmFtZXNPSzsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4UGF1c2VGcmFtZXM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5UeEZyYW1lc1dpdGhEZWZlcnJlZFhtaXNzaW9uczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4TGF0ZUNvbGxpc2lvbnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5UeFRvdGFsQ29sbGlzaW9uczsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4RnJhbWVzQWJvcnRlZER1ZVRvWFNDb2xsaXNpb25zOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhVbmRlcnJ1bjsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4TGVuZ3RoRXJyb3JzOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhJbnRlcm5hbE1BQ1htaXRFcnJvcjsKLSAgICAgICAgKmRhdGErKyA9IHMtPlR4RnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsOwotICAgICAgICAqZGF0YSsrID0gcy0+VHhGQ1NFcnJvcnM7CisJaWYgKGFkYXB0ZXItPmVzcGkpIHsKKwkJY29uc3Qgc3RydWN0IGVzcGlfaW50cl9jb3VudHMgKmU7CiAKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4T2N0ZXRzT0s7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeE9jdGV0c0JhZDsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4VW5pY2FzdEZyYW1lc09LOwotICAgICAgICAqZGF0YSsrID0gcy0+UnhNdWx0aWNhc3RGcmFtZXNPSzsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4QnJvYWRjYXN0RnJhbWVzT0s7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeFBhdXNlRnJhbWVzOwotICAgICAgICAqZGF0YSsrID0gcy0+UnhGQ1NFcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeEFsaWduRXJyb3JzOwotICAgICAgICAqZGF0YSsrID0gcy0+UnhTeW1ib2xFcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeERhdGFFcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeFNlcXVlbmNlRXJyb3JzOwotICAgICAgICAqZGF0YSsrID0gcy0+UnhSdW50RXJyb3JzOwotICAgICAgICAqZGF0YSsrID0gcy0+UnhKYWJiZXJFcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeEludGVybmFsTUFDUmN2RXJyb3I7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeEluUmFuZ2VMZW5ndGhFcnJvcnM7Ci0gICAgICAgICpkYXRhKysgPSBzLT5SeE91dE9mUmFuZ2VMZW5ndGhGaWVsZDsKLSAgICAgICAgKmRhdGErKyA9IHMtPlJ4RnJhbWVUb29Mb25nRXJyb3JzOwotCi0JKmRhdGErKyA9IHNzLT50c287Ci0JKmRhdGErKyA9IHNzLT52bGFuX3h0cmFjdDsKLQkqZGF0YSsrID0gc3MtPnZsYW5faW5zZXJ0OwotCSpkYXRhKysgPSBzcy0+cnhfY3NvX2dvb2Q7Ci0JKmRhdGErKyA9IHNzLT50eF9jc287Ci0JKmRhdGErKyA9IHNzLT5yeF9kcm9wczsKLQotCSpkYXRhKysgPSAodTY0KXQtPnJlc3BRX2VtcHR5OwotCSpkYXRhKysgPSAodTY0KXQtPnJlc3BRX292ZXJmbG93OwotCSpkYXRhKysgPSAodTY0KXQtPmZyZWVsaXN0UV9lbXB0eTsKLQkqZGF0YSsrID0gKHU2NCl0LT5wa3RfdG9vX2JpZzsKLQkqZGF0YSsrID0gKHU2NCl0LT5wa3RfbWlzbWF0Y2g7Ci0JKmRhdGErKyA9ICh1NjQpdC0+Y21kUV9mdWxsWzBdOwotCSpkYXRhKysgPSAodTY0KXQtPmNtZFFfZnVsbFsxXTsKLQkqZGF0YSsrID0gKHU2NCl0LT50eF9pcGZyYWdzOwotCSpkYXRhKysgPSAodTY0KXQtPnR4X3JlZ19wa3RzOwotCSpkYXRhKysgPSAodTY0KXQtPnR4X2xzb19wa3RzOwotCSpkYXRhKysgPSAodTY0KXQtPnR4X2RvX2Nrc3VtOworCQllID0gdDFfZXNwaV9nZXRfaW50cl9jb3VudHMoYWRhcHRlci0+ZXNwaSk7CisJCSpkYXRhKysgPSBlLT5ESVAyX3Bhcml0eV9lcnI7CisJCSpkYXRhKysgPSBlLT5ESVA0X2VycjsKKwkJKmRhdGErKyA9IGUtPnJ4X2Ryb3BzOworCQkqZGF0YSsrID0gZS0+dHhfZHJvcHM7CisJCSpkYXRhKysgPSBlLT5yeF9vdmZsdzsKKwkJKmRhdGErKyA9IGUtPnBhcml0eV9lcnI7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVnX2Jsb2NrX2R1bXAoc3RydWN0IGFkYXB0ZXIgKmFwLCB2b2lkICpidWYsCkBAIC01MjEsNiArNTQ2LDE1IEBACiAKIAltZW1zZXQoYnVmLCAwLCBUMl9SRUdNQVBfU0laRSk7CiAJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgMCwgQV9TR19SRVNQQUNDVVRJTUVSKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCBBX01DM19DRkcsIEFfTUM0X0lOVF9DQVVTRSk7CisJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgQV9UUElfQUREUiwgQV9UUElfUEFSKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCBBX1RQX0lOX0NPTkZJRywgQV9UUF9UWF9EUk9QX0NPVU5UKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCBBX1JBVF9ST1VURV9DT05UUk9MLCBBX1JBVF9JTlRSX0NBVVNFKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCBBX0NTUElfUlhfQUVfV00sIEFfQ1NQSV9JTlRSX0VOQUJMRSk7CisJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgQV9FU1BJX1NDSF9UT0tFTjAsIEFfRVNQSV9HT1NUQVQpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIEFfVUxQX1VMSU1JVCwgQV9VTFBfUElPX0NUUkwpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIEFfUExfRU5BQkxFLCBBX1BMX0NBVVNFKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCBBX01DNV9DT05GSUcsIEFfTUM1X01BU0tfV1JJVEVfQ01EKTsKIH0KIAogc3RhdGljIGludCBnZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCkBAIC01MzksMTIgKzU3MywxMiBAQAogCQljbWQtPmR1cGxleCA9IC0xOwogCX0KIAotICAgICAgICBjbWQtPnBvcnQgPSAoY21kLT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfVFApID8gUE9SVF9UUCA6IFBPUlRfRklCUkU7Ci0gICAgICAgIGNtZC0+cGh5X2FkZHJlc3MgPSBwLT5waHktPmFkZHI7Ci0gICAgICAgIGNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwotICAgICAgICBjbWQtPmF1dG9uZWcgPSBwLT5saW5rX2NvbmZpZy5hdXRvbmVnOwotICAgICAgICBjbWQtPm1heHR4cGt0ID0gMDsKLSAgICAgICAgY21kLT5tYXhyeHBrdCA9IDA7CisJY21kLT5wb3J0ID0gKGNtZC0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX1RQKSA/IFBPUlRfVFAgOiBQT1JUX0ZJQlJFOworCWNtZC0+cGh5X2FkZHJlc3MgPSBwLT5waHktPmFkZHI7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJY21kLT5hdXRvbmVnID0gcC0+bGlua19jb25maWcuYXV0b25lZzsKKwljbWQtPm1heHR4cGt0ID0gMDsKKwljbWQtPm1heHJ4cGt0ID0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzE1LDcgKzc0OSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCi0gICAgICAgIHJldHVybiAtRUJVU1k7CisJcmV0dXJuIC1FQlVTWTsKIAogCWFkYXB0ZXItPnBhcmFtcy5zZ2UuZnJlZWxRX3NpemVbIWp1bWJvX2ZsXSA9IGUtPnJ4X3BlbmRpbmc7CiAJYWRhcHRlci0+cGFyYW1zLnNnZS5mcmVlbFFfc2l6ZVtqdW1ib19mbF0gPSBlLT5yeF9qdW1ib19wZW5kaW5nOwpAQCAtNzI5LDE4ICs3NjMsNyBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwogCi0JLyoKLQkgKiBJZiBSWCBjb2FsZXNjaW5nIGlzIHJlcXVlc3RlZCB3ZSB1c2UgTkFQSSwgb3RoZXJ3aXNlIGludGVycnVwdHMuCi0JICogVGhpcyBjaG9pY2UgY2FuIGJlIG1hZGUgb25seSB3aGVuIGFsbCBwb3J0cyBhbmQgdGhlIFRPRSBhcmUgb2ZmLgotCSAqLwotCWlmIChhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgPT0gMCkKLQkJYWRhcHRlci0+cGFyYW1zLnNnZS5wb2xsaW5nID0gYy0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlOwotCi0JaWYgKGFkYXB0ZXItPnBhcmFtcy5zZ2UucG9sbGluZykgewotCQlhZGFwdGVyLT5wYXJhbXMuc2dlLnJ4X2NvYWxlc2NlX3VzZWNzID0gMDsKLQl9IGVsc2UgewotCQlhZGFwdGVyLT5wYXJhbXMuc2dlLnJ4X2NvYWxlc2NlX3VzZWNzID0gYy0+cnhfY29hbGVzY2VfdXNlY3M7Ci0JfQorCWFkYXB0ZXItPnBhcmFtcy5zZ2UucnhfY29hbGVzY2VfdXNlY3MgPSBjLT5yeF9jb2FsZXNjZV91c2VjczsKICAJYWRhcHRlci0+cGFyYW1zLnNnZS5jb2FsZXNjZV9lbmFibGUgPSBjLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2U7CiAJYWRhcHRlci0+cGFyYW1zLnNnZS5zYW1wbGVfaW50ZXJ2YWxfdXNlY3MgPSBjLT5yYXRlX3NhbXBsZV9pbnRlcnZhbDsKIAl0MV9zZ2Vfc2V0X2NvYWxlc2NlX3BhcmFtcyhhZGFwdGVyLT5zZ2UsICZhZGFwdGVyLT5wYXJhbXMuc2dlKTsKQEAgLTc1OSw3ICs3ODIsOSBAQAogCiBzdGF0aWMgaW50IGdldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgcmV0dXJuIEVFUFJPTV9TSVpFOworIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworIAlyZXR1cm4gdDFfaXNfYXNpYyhhZGFwdGVyKSA/IEVFUFJPTV9TSVpFIDogMDsKIH0KIAogI2RlZmluZSBFRVBST01fTUFHSUMoYXApIFwKQEAgLTgwOSw0NyArODM0LDM2IEBACiAJLnNldF90c28gICAgICAgICAgID0gc2V0X3RzbywKIH07CiAKLXN0YXRpYyB2b2lkIGN4Z2JfcHJvY19jbGVhbnVwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAotCQkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcikKLXsKLQljb25zdCBjaGFyICpuYW1lOwotCW5hbWUgPSBhZGFwdGVyLT5uYW1lOwotCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIGRpcik7Ci19Ci0vLyNkZWZpbmUgY2h0b2Vfc2V0dXBfdG9lZGV2KGFkYXB0ZXIpIE5VTEwKLSNkZWZpbmUgdXBkYXRlX210dV90YWIoYWRhcHRlcikKLSNkZWZpbmUgd3JpdGVfc210X2VudHJ5KGFkYXB0ZXIsIGlkeCkKLQogc3RhdGljIGludCB0MV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJlcSwgaW50IGNtZCkKIHsKLSAgICAgICAgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7Ci0gICAgICAgIHN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShyZXEpOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShyZXEpOwogCiAJc3dpdGNoIChjbWQpIHsKLSAgICAgICAgY2FzZSBTSU9DR01JSVBIWToKLSAgICAgICAgICAgICAgICBkYXRhLT5waHlfaWQgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ucGh5LT5hZGRyOwotICAgICAgICAgICAgICAgIC8qIEZBTExUSFJVICovCi0gICAgICAgIGNhc2UgU0lPQ0dNSUlSRUc6IHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQlkYXRhLT5waHlfaWQgPSBhZGFwdGVyLT5wb3J0W2Rldi0+aWZfcG9ydF0ucGh5LT5hZGRyOworCQkvKiBGQUxMVEhSVSAqLworCWNhc2UgU0lPQ0dNSUlSRUc6IHsKIAkJc3RydWN0IGNwaHkgKnBoeSA9IGFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XS5waHk7CiAJCXUzMiB2YWw7CiAKIAkJaWYgKCFwaHktPm1kaW9fcmVhZCkKLSAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwkgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwogCQlwaHktPm1kaW9fcmVhZChhZGFwdGVyLCBkYXRhLT5waHlfaWQsIDAsIGRhdGEtPnJlZ19udW0gJiAweDFmLAogCQkJICAgICAgICZ2YWwpOwotICAgICAgICAgICAgICAgIGRhdGEtPnZhbF9vdXQgPSB2YWw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWRhdGEtPnZhbF9vdXQgPSB2YWw7CisJCWJyZWFrOwogCX0KLSAgICAgICAgY2FzZSBTSU9DU01JSVJFRzogeworCWNhc2UgU0lPQ1NNSUlSRUc6IHsKIAkJc3RydWN0IGNwaHkgKnBoeSA9IGFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XS5waHk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJICAgIHJldHVybiAtRVBFUk07CiAJCWlmICghcGh5LT5tZGlvX3dyaXRlKQotICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCSAgICByZXR1cm4gLUVPUE5PVFNVUFA7CiAJCXBoeS0+bWRpb193cml0ZShhZGFwdGVyLCBkYXRhLT5waHlfaWQsIDAsIGRhdGEtPnJlZ19udW0gJiAweDFmLAogCQkJICAgICAgICBkYXRhLT52YWxfaW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQlicmVhazsKIAl9CiAKIAlkZWZhdWx0OgpAQCAtODY1LDkgKzg3OSw5IEBACiAJc3RydWN0IGNtYWMgKm1hYyA9IGFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XS5tYWM7CiAKIAlpZiAoIW1hYy0+b3BzLT5zZXRfbXR1KQotICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIC1FT1BOT1RTVVBQOwogCWlmIChuZXdfbXR1IDwgNjgpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCXJldHVybiAtRUlOVkFMOwogCWlmICgocmV0ID0gbWFjLT5vcHMtPnNldF9tdHUobWFjLCBuZXdfbXR1KSkpCiAJCXJldHVybiByZXQ7CiAJZGV2LT5tdHUgPSBuZXdfbXR1OwpAQCAtOTE4LDcgKzkzMiw3IEBACiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0gICAgICAgIHQxX3NlbGVjdF9pbnRyX2hhbmRsZXIoYWRhcHRlcikoYWRhcHRlci0+cGRldi0+aXJxLCBhZGFwdGVyKTsKKwl0MV9pbnRlcnJ1cHQoYWRhcHRlci0+cGRldi0+aXJxLCBhZGFwdGVyKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAjZW5kaWYKQEAgLTkyNywxMCArOTQxLDExIEBACiAgKiBQZXJpb2RpYyBhY2N1bXVsYXRpb24gb2YgTUFDIHN0YXRpc3RpY3MuICBUaGlzIGlzIHVzZWQgb25seSBpZiB0aGUgTUFDCiAgKiBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciB3YXkgdG8gcHJldmVudCBzdGF0cyBjb3VudGVyIG92ZXJmbG93LgogICovCi1zdGF0aWMgdm9pZCBtYWNfc3RhdHNfdGFzayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgbWFjX3N0YXRzX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCBpOwotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGF0YTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWRhcHRlciwgc3RhdHNfdXBkYXRlX3Rhc2sud29yayk7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKIAkJc3RydWN0IHBvcnRfaW5mbyAqcCA9ICZhZGFwdGVyLT5wb3J0W2ldOwpAQCAtOTUxLDE4ICs5NjYsMTkgQEAKIC8qCiAgKiBQcm9jZXNzZXMgZWxtZXIwIGV4dGVybmFsIGludGVycnVwdHMgaW4gcHJvY2VzcyBjb250ZXh0LgogICovCi1zdGF0aWMgdm9pZCBleHRfaW50cl90YXNrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBleHRfaW50cl90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRhdGE7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFkYXB0ZXIsIGV4dF9pbnRyX2hhbmRsZXJfdGFzayk7CiAKLQllbG1lcjBfZXh0X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKwl0MV9lbG1lcjBfZXh0X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKIAogCS8qIE5vdyByZWVuYWJsZSBleHRlcm5hbCBpbnRlcnJ1cHRzICovCiAJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+YXN5bmNfbG9jayk7CiAJYWRhcHRlci0+c2xvd19pbnRyX21hc2sgfD0gRl9QTF9JTlRSX0VYVDsKIAl3cml0ZWwoRl9QTF9JTlRSX0VYVCwgYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOwogCXdyaXRlbChhZGFwdGVyLT5zbG93X2ludHJfbWFzayB8IEZfUExfSU5UUl9TR0VfREFUQSwKLSAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCQkgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOwogCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+YXN5bmNfbG9jayk7CiB9CiAKQEAgLTk3OCw3ICs5OTQsNyBAQAogCSAqLwogCWFkYXB0ZXItPnNsb3dfaW50cl9tYXNrICY9IH5GX1BMX0lOVFJfRVhUOwogCXdyaXRlbChhZGFwdGVyLT5zbG93X2ludHJfbWFzayB8IEZfUExfSU5UUl9TR0VfREFUQSwKLSAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCQkgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOwogCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPmV4dF9pbnRyX2hhbmRsZXJfdGFzayk7CiB9CiAKQEAgLTEwMTEsNyArMTAyNyw3IEBACiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAoZXJyKQotICAgICAgICByZXR1cm4gZXJyOworCQlyZXR1cm4gZXJyOwogCiAJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CiAJCUNIX0VSUigiJXM6IGNhbm5vdCBmaW5kIFBDSSBkZXZpY2UgbWVtb3J5IGJhc2UgYWRkcmVzc1xuIiwKQEAgLTEwNDMsNyArMTA1OSw3IEBACiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAotICAgIG1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CiAJYmkgPSB0MV9nZXRfYm9hcmRfaW5mbyhlbnQtPmRyaXZlcl9kYXRhKTsKIApAQCAtMTA4MSwyMSArMTA5NywxNSBAQAogCQkJYWRhcHRlci0+bXNnX2VuYWJsZSA9IGRmbHRfbXNnX2VuYWJsZTsKIAkJCWFkYXB0ZXItPm1taW9fbGVuID0gbW1pb19sZW47CiAKLQkJCWluaXRfTVVURVgoJmFkYXB0ZXItPm1pYl9tdXRleCk7CiAJCQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dHBpX2xvY2spOwogCQkJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPndvcmtfbG9jayk7CiAJCQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+YXN5bmNfbG9jayk7CisJCQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bWFjX2xvY2spOwogCiAJCQlJTklUX1dPUksoJmFkYXB0ZXItPmV4dF9pbnRyX2hhbmRsZXJfdGFzaywKLQkJCQkgIGV4dF9pbnRyX3Rhc2ssIGFkYXB0ZXIpOwotCQkJSU5JVF9XT1JLKCZhZGFwdGVyLT5zdGF0c191cGRhdGVfdGFzaywgbWFjX3N0YXRzX3Rhc2ssCi0JCQkJICBhZGFwdGVyKTsKLSNpZmRlZiB3b3JrX3N0cnVjdAotCQkJaW5pdF90aW1lcigmYWRhcHRlci0+c3RhdHNfdXBkYXRlX3RpbWVyKTsKLQkJCWFkYXB0ZXItPnN0YXRzX3VwZGF0ZV90aW1lci5mdW5jdGlvbiA9IG1hY19zdGF0c190aW1lcjsKLQkJCWFkYXB0ZXItPnN0YXRzX3VwZGF0ZV90aW1lci5kYXRhID0KLQkJCQkodW5zaWduZWQgbG9uZylhZGFwdGVyOwotI2VuZGlmCisJCQkJICBleHRfaW50cl90YXNrKTsKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZhZGFwdGVyLT5zdGF0c191cGRhdGVfdGFzaywKKwkJCQkJICBtYWNfc3RhdHNfdGFzayk7CiAKIAkJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZXRkZXYpOwogCQl9CkBAIC0xMTIyLDE2ICsxMTMyLDE5IEBACiAJCQluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSB2bGFuX3J4X3JlZ2lzdGVyOwogCQkJbmV0ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gdmxhbl9yeF9raWxsX3ZpZDsKICNlbmRpZgotCQkJYWRhcHRlci0+ZmxhZ3MgfD0gVFNPX0NBUEFCTEU7Ci0JCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworCisJCQkvKiBUMjA0OiBkaXNhYmxlIFRTTyAqLworCQkJaWYgKCEoaXNfVDIoYWRhcHRlcikpIHx8IGJpLT5wb3J0X251bWJlciAhPSA0KSB7CisJCQkJYWRhcHRlci0+ZmxhZ3MgfD0gVFNPX0NBUEFCTEU7CisJCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKwkJCX0KIAkJfQogCiAJCW5ldGRldi0+b3BlbiA9IGN4Z2Jfb3BlbjsKIAkJbmV0ZGV2LT5zdG9wID0gY3hnYl9jbG9zZTsKIAkJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0MV9zdGFydF94bWl0OwogCQluZXRkZXYtPmhhcmRfaGVhZGVyX2xlbiArPSAoYWRhcHRlci0+ZmxhZ3MgJiBUU09fQ0FQQUJMRSkgPwotCQkJc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0X2xzbykgOgotCQkJc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0KTsKKwkJCXNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdF9sc28pIDogc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0KTsKIAkJbmV0ZGV2LT5nZXRfc3RhdHMgPSB0MV9nZXRfc3RhdHM7CiAJCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdDFfc2V0X3J4bW9kZTsKIAkJbmV0ZGV2LT5kb19pb2N0bCA9IHQxX2lvY3RsOwpAQCAtMTE0MCw5ICsxMTUzLDEyIEBACiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSB0MV9uZXRwb2xsOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfTkFQSQogCQluZXRkZXYtPndlaWdodCA9IDY0OworCQluZXRkZXYtPnBvbGwgPSB0MV9wb2xsOworI2VuZGlmCiAKLSAgICAgICAgU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnQxX2V0aHRvb2xfb3BzKTsKKwkJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnQxX2V0aHRvb2xfb3BzKTsKIAl9CiAKIAlpZiAodDFfaW5pdF9zd19tb2R1bGVzKGFkYXB0ZXIsIGJpKSA8IDApIHsKQEAgLTExNjksNyArMTE4NSw3IEBACiAJCQlpZiAoIWFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkKIAkJCQlhZGFwdGVyLT5uYW1lID0gYWRhcHRlci0+cG9ydFtpXS5kZXYtPm5hbWU7CiAKLSAgICAgICAgICAgICAgICBfX3NldF9iaXQoaSwgJmFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCk7CisJCQlfX3NldF9iaXQoaSwgJmFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCk7CiAJCX0KIAl9CiAJaWYgKCFhZGFwdGVyLT5yZWdpc3RlcmVkX2RldmljZV9tYXApIHsKQEAgLTExODIsMTggKzExOTgsMjggQEAKIAkgICAgICAgYmktPmRlc2MsIGFkYXB0ZXItPnBhcmFtcy5jaGlwX3JldmlzaW9uLAogCSAgICAgICBhZGFwdGVyLT5wYXJhbXMucGNpLmlzX3BjaXggPyAiUENJWCIgOiAiUENJIiwKIAkgICAgICAgYWRhcHRlci0+cGFyYW1zLnBjaS5zcGVlZCwgYWRhcHRlci0+cGFyYW1zLnBjaS53aWR0aCk7CisKKwkvKgorCSAqIFNldCB0aGUgVDFCIEFTSUMgYW5kIG1lbW9yeSBjbG9ja3MuCisJICovCisJaWYgKHQxcG93ZXJzYXZlKQorCQlhZGFwdGVyLT50MXBvd2Vyc2F2ZSA9IExDTE9DSzsJLyogSFcgZGVmYXVsdCBpcyBwb3dlcnNhdmUgbW9kZS4gKi8KKwllbHNlCisJCWFkYXB0ZXItPnQxcG93ZXJzYXZlID0gSENMT0NLOworCWlmICh0MV9pc19UMUIoYWRhcHRlcikpCisJCXQxX2Nsb2NrKGFkYXB0ZXIsIHQxcG93ZXJzYXZlKTsKKwogCXJldHVybiAwOwogCiAgb3V0X3JlbGVhc2VfYWRhcHRlcl9yZXM6CiAJdDFfZnJlZV9zd19tb2R1bGVzKGFkYXB0ZXIpOwogIG91dF9mcmVlX2RldjoKIAlpZiAoYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci0+cmVncykgaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKKwkJaWYgKGFkYXB0ZXItPnJlZ3MpCisJCQlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOwogCQlmb3IgKGkgPSBiaS0+cG9ydF9udW1iZXIgLSAxOyBpID49IDA7IC0taSkKLQkJCWlmIChhZGFwdGVyLT5wb3J0W2ldLmRldikgewotCQkJCWN4Z2JfcHJvY19jbGVhbnVwKGFkYXB0ZXIsIHByb2Nfcm9vdF9kcml2ZXIpOwotCQkJCWtmcmVlKGFkYXB0ZXItPnBvcnRbaV0uZGV2KTsKLQkJCX0KKwkJCWlmIChhZGFwdGVyLT5wb3J0W2ldLmRldikKKwkJCQlmcmVlX25ldGRldihhZGFwdGVyLT5wb3J0W2ldLmRldik7CiAJfQogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAgb3V0X2Rpc2FibGVfcGRldjoKQEAgLTEyMDIsNiArMTIyOCwxNTUgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdm9pZCBiaXRfYmFuZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGJpdGRhdGEsIGludCBuYml0cykKK3sKKwlpbnQgZGF0YTsKKwlpbnQgaTsKKwl1MzIgdmFsOworCisJZW51bSB7CisJCVNfQ0xPQ0sgPSAxIDw8IDMsCisJCVNfREFUQSA9IDEgPDwgNAorCX07CisKKwlmb3IgKGkgPSAobmJpdHMgLSAxKTsgaSA+IC0xOyBpLS0pIHsKKworCQl1ZGVsYXkoNTApOworCisJCWRhdGEgPSAoKGJpdGRhdGEgPj4gaSkgJiAweDEpOworCQlfX3QxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisKKwkJaWYgKGRhdGEpCisJCQl2YWwgfD0gU19EQVRBOworCQllbHNlCisJCQl2YWwgJj0gflNfREFUQTsKKworCQl1ZGVsYXkoNTApOworCisJCS8qIFNldCBTQ0xPQ0sgbG93ICovCisJCXZhbCAmPSB+U19DTE9DSzsKKwkJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCisJCXVkZWxheSg1MCk7CisKKwkJLyogV3JpdGUgU0NMT0NLIGhpZ2ggKi8KKwkJdmFsIHw9IFNfQ0xPQ0s7CisJCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKworCX0KK30KKworc3RhdGljIGludCB0MV9jbG9jayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IG1vZGUpCit7CisJdTMyIHZhbDsKKwlpbnQgTV9DT1JFX1ZBTDsKKwlpbnQgTV9NRU1fVkFMOworCisJZW51bSB7CisJCU1fQ09SRV9CSVRTID0gOSwKKwkJVF9DT1JFX1ZBTCA9IDAsCisJCVRfQ09SRV9CSVRTID0gMiwKKwkJTl9DT1JFX1ZBTCA9IDAsCisJCU5fQ09SRV9CSVRTID0gMiwKKwkJTV9NRU1fQklUUyA9IDksCisJCVRfTUVNX1ZBTCA9IDAsCisJCVRfTUVNX0JJVFMgPSAyLAorCQlOX01FTV9WQUwgPSAwLAorCQlOX01FTV9CSVRTID0gMiwKKwkJTlBfTE9BRCA9IDEgPDwgMTcsCisJCVNfTE9BRF9NRU0gPSAxIDw8IDUsCisJCVNfTE9BRF9DT1JFID0gMSA8PCA2LAorCQlTX0NMT0NLID0gMSA8PCAzCisJfTsKKworCWlmICghdDFfaXNfVDFCKGFkYXB0ZXIpKQorCQlyZXR1cm4gLUVOT0RFVjsJLyogQ2FuJ3QgcmUtY2xvY2sgdGhpcyBjaGlwLiAqLworCisJaWYgKG1vZGUgJiAyKSB7CisJCXJldHVybiAwOwkvKiBzaG93IGN1cnJlbnQgbW9kZS4gKi8KKwl9CisKKwlpZiAoKGFkYXB0ZXItPnQxcG93ZXJzYXZlICYgMSkgPT0gKG1vZGUgJiAxKSkKKwkJcmV0dXJuIC1FQUxSRUFEWTsJLyogQVNJQyBhbHJlYWR5IHJ1bm5pbmcgaW4gbW9kZS4gKi8KKworCWlmICgobW9kZSAmIDEpID09IEhDTE9DSykgeworCQlNX0NPUkVfVkFMID0gMHgxNDsKKwkJTV9NRU1fVkFMID0gMHgxODsKKwkJYWRhcHRlci0+dDFwb3dlcnNhdmUgPSBIQ0xPQ0s7CS8qIG92ZXJjbG9jayAqLworCX0gZWxzZSB7CisJCU1fQ09SRV9WQUwgPSAweGU7CisJCU1fTUVNX1ZBTCA9IDB4MTA7CisJCWFkYXB0ZXItPnQxcG93ZXJzYXZlID0gTENMT0NLOwkvKiB1bmRlcmNsb2NrICovCisJfQorCisJLyogRG9uJ3QgaW50ZXJydXB0IHRoaXMgc2VyaWFsIHN0cmVhbSEgKi8KKwlzcGluX2xvY2soJmFkYXB0ZXItPnRwaV9sb2NrKTsKKworCS8qIEluaXRpYWxpemUgZm9yIEFTSUMgY29yZSAqLworCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgfD0gTlBfTE9BRDsKKwl1ZGVsYXkoNTApOworCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKwl1ZGVsYXkoNTApOworCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgJj0gflNfTE9BRF9DT1JFOworCXZhbCAmPSB+U19DTE9DSzsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJdWRlbGF5KDUwKTsKKworCS8qIFNlcmlhbCBwcm9ncmFtIHRoZSBBU0lDIGNsb2NrIHN5bnRoZXNpemVyICovCisJYml0X2JhbmcoYWRhcHRlciwgVF9DT1JFX1ZBTCwgVF9DT1JFX0JJVFMpOworCWJpdF9iYW5nKGFkYXB0ZXIsIE5fQ09SRV9WQUwsIE5fQ09SRV9CSVRTKTsKKwliaXRfYmFuZyhhZGFwdGVyLCBNX0NPUkVfVkFMLCBNX0NPUkVfQklUUyk7CisJdWRlbGF5KDUwKTsKKworCS8qIEZpbmlzaCBBU0lDIGNvcmUgKi8KKwlfX3QxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisJdmFsIHw9IFNfTE9BRF9DT1JFOworCXVkZWxheSg1MCk7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCXVkZWxheSg1MCk7CisJX190MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZ2YWwpOworCXZhbCAmPSB+U19MT0FEX0NPUkU7CisJdWRlbGF5KDUwKTsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJdWRlbGF5KDUwKTsKKworCS8qIEluaXRpYWxpemUgZm9yIG1lbW9yeSAqLworCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgfD0gTlBfTE9BRDsKKwl1ZGVsYXkoNTApOworCV9fdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKwl1ZGVsYXkoNTApOworCV9fdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwl2YWwgJj0gflNfTE9BRF9NRU07CisJdmFsICY9IH5TX0NMT0NLOworCXVkZWxheSg1MCk7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCXVkZWxheSg1MCk7CisKKwkvKiBTZXJpYWwgcHJvZ3JhbSB0aGUgbWVtb3J5IGNsb2NrIHN5bnRoZXNpemVyICovCisJYml0X2JhbmcoYWRhcHRlciwgVF9NRU1fVkFMLCBUX01FTV9CSVRTKTsKKwliaXRfYmFuZyhhZGFwdGVyLCBOX01FTV9WQUwsIE5fTUVNX0JJVFMpOworCWJpdF9iYW5nKGFkYXB0ZXIsIE1fTUVNX1ZBTCwgTV9NRU1fQklUUyk7CisJdWRlbGF5KDUwKTsKKworCS8qIEZpbmlzaCBtZW1vcnkgKi8KKwlfX3QxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisJdmFsIHw9IFNfTE9BRF9NRU07CisJdWRlbGF5KDUwKTsKKwlfX3QxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJdWRlbGF5KDUwKTsKKwlfX3QxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisJdmFsICY9IH5TX0xPQURfTUVNOworCXVkZWxheSg1MCk7CisJX190MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnRwaV9sb2NrKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdDFfc3dfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBBX1BDSUNGR19QTV9DU1IsIDMpOwpAQCAtMTIyMywxMCArMTM5OCw5IEBACiAJCXQxX2ZyZWVfc3dfbW9kdWxlcyhhZGFwdGVyKTsKIAkJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKIAkJd2hpbGUgKC0taSA+PSAwKQotCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0uZGV2KSB7Ci0JCQkJY3hnYl9wcm9jX2NsZWFudXAoYWRhcHRlciwgcHJvY19yb290X2RyaXZlcik7Ci0JCQkJa2ZyZWUoYWRhcHRlci0+cG9ydFtpXS5kZXYpOwotCQkJfQorCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0uZGV2KQorCQkJCWZyZWVfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0uZGV2KTsKKwogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZWxtZXIwLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2VsbWVyMC5oCmluZGV4IDU1OTBjYjIuLjllYmVjYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZWxtZXIwLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lbG1lcjAuaApAQCAtMzksNiArMzksMTIgQEAKICNpZm5kZWYgX0NYR0JfRUxNRVIwX0hfCiAjZGVmaW5lIF9DWEdCX0VMTUVSMF9IXwogCisvKiBFTE1FUjAgZmxhdm9ycyAqLworZW51bSB7CisJRUxNRVIwX1hDMlMzMDBFXzZGVDI1Nl9DLAorCUVMTUVSMF9YQzJTMTAwRV82VFExNDRfQworfTsKKwogLyogRUxNRVIwIHJlZ2lzdGVycyAqLwogI2RlZmluZSBBX0VMTUVSMF9WRVJTSU9OIDB4MTAwMDAwCiAjZGVmaW5lIEFfRUxNRVIwX1BIWV9DRkcgMHgxMDAwMDQKQEAgLTE0OSwzICsxNTUsNCBAQAogI2RlZmluZSBNSTFfT1BfSU5ESVJFQ1RfUkVBRCAgICAgMwogCiAjZW5kaWYgLyogX0NYR0JfRUxNRVIwX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZXNwaS5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMKaW5kZXggNTQyZTVlMC4uNDE5MmYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMKQEAgLTgxLDQ2ICs4MSwzNiBAQAogCXJldHVybiBidXN5OwogfQogCi0vKiAxLiBEZWFzc2VydCByeF9yZXNldF9jb3JlLiAqLwotLyogMi4gUHJvZ3JhbSBUUklDTl9DTkZHIHJlZ2lzdGVycy4gKi8KLS8qIDMuIERlYXNzZXJ0IHJ4X3Jlc2V0X2xpbmsgKi8KIHN0YXRpYyBpbnQgdHJpY25faW5pdChhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7Ci0JaW50ICAgICBpICAgICAgICAgICAgICAgPSAwOwotCWludCAgICAgc3RhdCAgICAgICAgICAgID0gMDsKLQlpbnQgICAgIHRpbWVvdXQgICAgICAgICA9IDA7Ci0JaW50ICAgICBpc19yZWFkeSAgICAgICAgPSAwOworCWludCBpLCBzbWUgPSAxOwogCi0JLyogMSAqLwotCXRpbWVvdXQ9MTAwMDsKLQlkbyB7Ci0JCXN0YXQgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX1JFU0VUKTsKLQkJaXNfcmVhZHkgPSAoc3RhdCAmIDB4NCk7Ci0JCXRpbWVvdXQtLTsKLQkJdWRlbGF5KDUpOwotCX0gd2hpbGUgKCFpc19yZWFkeSB8fCAodGltZW91dD09MCkpOwotCXdyaXRlbCgweDIsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfUkVTRVQpOwotCWlmICh0aW1lb3V0PT0wKQotCXsKLQkJQ0hfRVJSKCJFU1BJIDogRVJST1IgOiBUaW1lb3V0IHRyaWNuX2luaXQoKSBcbiIpOwotCQl0MV9mYXRhbF9lcnIoYWRhcHRlcik7CisJaWYgKCEocmVhZGwoYWRhcHRlci0+cmVncyArIEFfRVNQSV9SWF9SRVNFVCkgICYgRl9SWF9DTEtfU1RBVFVTKSkgeworCQlDSF9FUlIoIiVzOiBFU1BJIGNsb2NrIG5vdCByZWFkeVxuIiwgYWRhcHRlci0+bmFtZSk7CisJCXJldHVybiAtMTsKIAl9CiAKLQkvKiAyICovCi0JdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMCwgMCwgVFJJQ05fQ05GRywgMHg4MSk7Ci0JdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMSwgMCwgVFJJQ05fQ05GRywgMHg4MSk7Ci0JdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgMCwgVFJJQ05fQ05GRywgMHg4MSk7Ci0JZm9yIChpPTE7IGk8PSA4OyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDAsIGksIFRSSUNOX0NORkcsIDB4ZjEpOwotCWZvciAoaT0xOyBpPD0gMjsgaSsrKSB0cmljbl93cml0ZShhZGFwdGVyLCAwLCAxLCBpLCBUUklDTl9DTkZHLCAweGYxKTsKLQlmb3IgKGk9MTsgaTw9IDM7IGkrKykgdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgaSwgVFJJQ05fQ05GRywgMHhlMSk7Ci0JZm9yIChpPTQ7IGk8PSA0OyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIGksIFRSSUNOX0NORkcsIDB4ZjEpOwotCWZvciAoaT01OyBpPD0gNTsgaSsrKSB0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCBpLCBUUklDTl9DTkZHLCAweGUxKTsKLQlmb3IgKGk9NjsgaTw9IDY7IGkrKykgdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgaSwgVFJJQ05fQ05GRywgMHhmMSk7Ci0JZm9yIChpPTc7IGk8PSA3OyBpKyspIHRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIGksIFRSSUNOX0NORkcsIDB4ODApOwotCWZvciAoaT04OyBpPD0gODsgaSsrKSB0cmljbl93cml0ZShhZGFwdGVyLCAwLCAyLCBpLCBUUklDTl9DTkZHLCAweGYxKTsKKwl3cml0ZWwoRl9FU1BJX1JYX0NPUkVfUlNULCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX1JFU0VUKTsKIAotCS8qIDMgKi8KLQl3cml0ZWwoMHgzLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX1JFU0VUKTsKKwlpZiAoc21lKSB7CisJCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDAsIDAsIFRSSUNOX0NORkcsIDB4ODEpOworCQl0cmljbl93cml0ZShhZGFwdGVyLCAwLCAxLCAwLCBUUklDTl9DTkZHLCAweDgxKTsKKwkJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMiwgMCwgVFJJQ05fQ05GRywgMHg4MSk7CisJfQorCWZvciAoaSA9IDE7IGkgPD0gODsgaSsrKQorCQl0cmljbl93cml0ZShhZGFwdGVyLCAwLCAwLCBpLCBUUklDTl9DTkZHLCAweGYxKTsKKwlmb3IgKGkgPSAxOyBpIDw9IDI7IGkrKykKKwkJdHJpY25fd3JpdGUoYWRhcHRlciwgMCwgMSwgaSwgVFJJQ05fQ05GRywgMHhmMSk7CisJZm9yIChpID0gMTsgaSA8PSAzOyBpKyspCisJCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIGksIFRSSUNOX0NORkcsIDB4ZTEpOworCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIDQsIFRSSUNOX0NORkcsIDB4ZjEpOworCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIDUsIFRSSUNOX0NORkcsIDB4ZTEpOworCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIDYsIFRSSUNOX0NORkcsIDB4ZjEpOworCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIDcsIFRSSUNOX0NORkcsIDB4ODApOworCXRyaWNuX3dyaXRlKGFkYXB0ZXIsIDAsIDIsIDgsIFRSSUNOX0NORkcsIDB4ZjEpOworCisJd3JpdGVsKEZfRVNQSV9SWF9DT1JFX1JTVCB8IEZfRVNQSV9SWF9MTktfUlNULAorCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX1JFU0VUKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQzLDYgKzEzMyw3IEBACiAKIHZvaWQgdDFfZXNwaV9pbnRyX2NsZWFyKHN0cnVjdCBwZWVzcGkgKmVzcGkpCiB7CisJcmVhZGwoZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9ESVAyX0VSUl9DT1VOVCk7CiAJd3JpdGVsKDB4ZmZmZmZmZmYsIGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfSU5UUl9TVEFUVVMpOwogCXdyaXRlbChGX1BMX0lOVFJfRVNQSSwgZXNwaS0+YWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOwogfQpAQCAtMTU3LDcgKzE0OCw2IEBACiAKIGludCB0MV9lc3BpX2ludHJfaGFuZGxlcihzdHJ1Y3QgcGVlc3BpICplc3BpKQogewotCXUzMiBjbnQ7CiAJdTMyIHN0YXR1cyA9IHJlYWRsKGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfSU5UUl9TVEFUVVMpOwogCiAJaWYgKHN0YXR1cyAmIEZfRElQNEVSUikKQEAgLTE3Nyw3ICsxNjcsNyBAQAogCQkgKiBNdXN0IHJlYWQgdGhlIGVycm9yIGNvdW50IHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQKIAkJICogdGhhdCBpdCBjYXVzZXMuCiAJCSAqLwotCQljbnQgPSByZWFkbChlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0RJUDJfRVJSX0NPVU5UKTsKKwkJcmVhZGwoZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9ESVAyX0VSUl9DT1VOVCk7CiAJfQogCiAJLyoKQEAgLTE5Miw3ICsxODIsNyBAQAogCiBjb25zdCBzdHJ1Y3QgZXNwaV9pbnRyX2NvdW50cyAqdDFfZXNwaV9nZXRfaW50cl9jb3VudHMoc3RydWN0IHBlZXNwaSAqZXNwaSkKIHsKLSAgICByZXR1cm4gJmVzcGktPmludHJfY250OworCXJldHVybiAmZXNwaS0+aW50cl9jbnQ7CiB9CiAKIHN0YXRpYyB2b2lkIGVzcGlfc2V0dXBfZm9yX3BtMzM5MyhhZGFwdGVyX3QgKmFkYXB0ZXIpCkBAIC0yMTAsMTcgKzIwMCw0NSBAQAogCXdyaXRlbChWX1JYX05QT1JUUygxKSB8IFZfVFhfTlBPUlRTKDEpLCBhZGFwdGVyLT5yZWdzICsgQV9QT1JUX0NPTkZJRyk7CiB9CiAKLS8qIFQyIEluaXQgcGFydCAtLSAgKi8KLS8qIDEuIFNldCBUX0VTUElfTUlTQ0NUUkxfQUREUiAqLwotLyogMi4gSW5pdCBFU1BJIHJlZ2lzdGVycy4gKi8KLS8qIDMuIEluaXQgVHJpQ04gSGFyZCBNYWNybyAqLworc3RhdGljIHZvaWQgZXNwaV9zZXR1cF9mb3JfdnNjNzMyMShhZGFwdGVyX3QgKmFkYXB0ZXIpCit7CisgICAgICAgIHdyaXRlbCgweDFmNCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9TQ0hfVE9LRU4wKTsKKyAgICAgICAgd3JpdGVsKDB4MWY0MDFmNCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9TQ0hfVE9LRU4xKTsKKyAgICAgICAgd3JpdGVsKDB4MWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjIpOworCXdyaXRlbCgweGEwMCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9SWF9GSUZPX0FMTU9TVF9GVUxMX1dBVEVSTUFSSyk7CisJd3JpdGVsKDB4MWZmLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0VNUFRZX1dBVEVSTUFSSyk7CisJd3JpdGVsKDEsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfQ0FMRU5EQVJfTEVOR1RIKTsKKwl3cml0ZWwoVl9SWF9OUE9SVFMoNCkgfCBWX1RYX05QT1JUUyg0KSwgYWRhcHRlci0+cmVncyArIEFfUE9SVF9DT05GSUcpOworCisJd3JpdGVsKDB4MDgwMDAwMDgsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfVFJBSU4pOworfQorCisvKgorICogTm90ZSB0aGF0IFQxQiByZXF1aXJlcyBhdCBsZWFzdCAyIHBvcnRzIGZvciBJWEYxMDEwIGR1ZSB0byBhIEhXIGJ1Zy4KKyAqLworc3RhdGljIHZvaWQgZXNwaV9zZXR1cF9mb3JfaXhmMTAxMChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBucG9ydHMpCit7CisJd3JpdGVsKDEsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfQ0FMRU5EQVJfTEVOR1RIKTsKKwlpZiAobnBvcnRzID09IDQpIHsKKwkJaWYgKGlzX1QyKGFkYXB0ZXIpKSB7CisJCQl3cml0ZWwoMHhmMDAsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfRklGT19BTE1PU1RfRlVMTF9XQVRFUk1BUkspOworCQkJd3JpdGVsKDB4M2MwLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0VNUFRZX1dBVEVSTUFSSyk7CisJCX0gZWxzZSB7CisJCQl3cml0ZWwoMHg3ZmYsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfUlhfRklGT19BTE1PU1RfRlVMTF9XQVRFUk1BUkspOworCQkJd3JpdGVsKDB4MWZmLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0VNUFRZX1dBVEVSTUFSSyk7CisJCX0KKwl9IGVsc2UgeworCQl3cml0ZWwoMHgxZmZmLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0ZVTExfV0FURVJNQVJLKTsKKwkJd3JpdGVsKDB4N2ZmLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0VNUFRZX1dBVEVSTUFSSyk7CisJfQorCXdyaXRlbChWX1JYX05QT1JUUyhucG9ydHMpIHwgVl9UWF9OUE9SVFMobnBvcnRzKSwgYWRhcHRlci0+cmVncyArIEFfUE9SVF9DT05GSUcpOworCit9CisKIGludCB0MV9lc3BpX2luaXQoc3RydWN0IHBlZXNwaSAqZXNwaSwgaW50IG1hY190eXBlLCBpbnQgbnBvcnRzKQogewotCXUzMiBjbnQ7Ci0KIAl1MzIgc3RhdHVzX2VuYWJsZV9leHRyYSA9IDA7CiAJYWRhcHRlcl90ICphZGFwdGVyID0gZXNwaS0+YWRhcHRlcjsKLQl1MzIgc3RhdHVzLCBidXJzdHZhbCA9IDB4ODAwMTAwOwogCiAJLyogRGlzYWJsZSBFU1BJIHRyYWluaW5nLiAgTUFDcyB0aGF0IGNhbiBoYW5kbGUgaXQgZW5hYmxlIGl0IGJlbG93LiAqLwogCXdyaXRlbCgwLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1RSQUlOKTsKQEAgLTIyOSwzOCArMjQ3LDIwIEBACiAJCXdyaXRlbChWX09VVF9PRl9TWU5DX0NPVU5UKDQpIHwKIAkJICAgICAgIFZfRElQMl9QQVJJVFlfRVJSX1RIUkVTKDMpIHwKIAkJICAgICAgIFZfRElQNF9USFJFUygxKSwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOwotCQlpZiAobnBvcnRzID09IDQpIHsKLQkJCS8qIFQyMDQ6IG1heGJ1cnN0MSA9IDB4NDAsIG1heGJ1cnN0MiA9IDB4MjAgKi8KLQkJCWJ1cnN0dmFsID0gMHgyMDAwNDA7Ci0JCX0KLQl9Ci0Jd3JpdGVsKGJ1cnN0dmFsLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01BWEJVUlNUMV9NQVhCVVJTVDIpOworICAgICAgICAJd3JpdGVsKG5wb3J0cyA9PSA0ID8gMHgyMDAwNDAgOiAweDEwMDAwODAsCisJCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01BWEJVUlNUMV9NQVhCVVJTVDIpOworCX0gZWxzZQorICAgICAgICAJd3JpdGVsKDB4ODAwMTAwLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01BWEJVUlNUMV9NQVhCVVJTVDIpOwogCi0Jc3dpdGNoIChtYWNfdHlwZSkgewotCWNhc2UgQ0hCVF9NQUNfUE0zMzkzOgorCWlmIChtYWNfdHlwZSA9PSBDSEJUX01BQ19QTTMzOTMpCiAJCWVzcGlfc2V0dXBfZm9yX3BtMzM5MyhhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKKwllbHNlIGlmIChtYWNfdHlwZSA9PSBDSEJUX01BQ19WU0M3MzIxKQorCQllc3BpX3NldHVwX2Zvcl92c2M3MzIxKGFkYXB0ZXIpOworCWVsc2UgaWYgKG1hY190eXBlID09IENIQlRfTUFDX0lYRjEwMTApIHsKKwkJc3RhdHVzX2VuYWJsZV9leHRyYSA9IEZfSU5URUwxMDEwTU9ERTsKKwkJZXNwaV9zZXR1cF9mb3JfaXhmMTAxMChhZGFwdGVyLCBucG9ydHMpOworCX0gZWxzZQogCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHN1cmUgYW55IHBlbmRpbmcgaW50ZXJydXB0cyBmcm9tIHRoZSBTUEkgYXJlCi0JICogQ2xlYXJlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIGludGVycnVwdC4KLQkgKi8KLQl3cml0ZWwoRVNQSV9JTlRSX01BU0ssIGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfSU5UUl9FTkFCTEUpOwotCXN0YXR1cyA9IHJlYWRsKGVzcGktPmFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfSU5UUl9TVEFUVVMpOwotCWlmIChzdGF0dXMgJiBGX0RJUDJQQVJJVFlFUlIpIHsKLQkJY250ID0gcmVhZGwoZXNwaS0+YWRhcHRlci0+cmVncyArIEFfRVNQSV9ESVAyX0VSUl9DT1VOVCk7Ci0JfQotCi0JLyoKLQkgKiBGb3IgVDFCIHdlIG5lZWQgdG8gd3JpdGUgMSB0byBjbGVhciBFU1BJIGludGVycnVwdHMuICBGb3IgVDIrIHdlCi0JICogd3JpdGUgdGhlIHN0YXR1cyBhcyBpcy4KLQkgKi8KLQlpZiAoc3RhdHVzICYmIHQxX2lzX1QxQihlc3BpLT5hZGFwdGVyKSkKLQkJc3RhdHVzID0gMTsKLQl3cml0ZWwoc3RhdHVzLCBlc3BpLT5hZGFwdGVyLT5yZWdzICsgQV9FU1BJX0lOVFJfU1RBVFVTKTsKIAogCXdyaXRlbChzdGF0dXNfZW5hYmxlX2V4dHJhIHwgRl9SWFNUQVRVU0VOQUJMRSwKIAkgICAgICAgYWRhcHRlci0+cmVncyArIEFfRVNQSV9GSUZPX1NUQVRVU19FTkFCTEUpOwpAQCAtMjcxLDkgKzI3MSwxMSBAQAogCQkgKiBBbHdheXMgcG9zaXRpb24gdGhlIGNvbnRyb2wgYXQgdGhlIDFzdCBwb3J0IGVncmVzcyBJTgogCQkgKiAoc29wLGVvcCkgY291bnRlciB0byByZWR1Y2UgUElPcyBmb3IgVC9OMjEwIHdvcmthcm91bmQuCiAJCSAqLwotCQllc3BpLT5taXNjX2N0cmwgPSAocmVhZGwoYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpCi0JCQkJICAgJiB+TU9OX01BU0spIHwgKEZfTU9OSVRPUkVEX0RJUkVDVElPTgotCQkJCSAgIHwgRl9NT05JVE9SRURfSU5URVJGQUNFKTsKKwkJZXNwaS0+bWlzY19jdHJsID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOworCQllc3BpLT5taXNjX2N0cmwgJj0gfk1PTl9NQVNLOworCQllc3BpLT5taXNjX2N0cmwgfD0gRl9NT05JVE9SRURfRElSRUNUSU9OOworCQlpZiAoYWRhcHRlci0+cGFyYW1zLm5wb3J0cyA9PSAxKQorCQkJZXNwaS0+bWlzY19jdHJsIHw9IEZfTU9OSVRPUkVEX0lOVEVSRkFDRTsKIAkJd3JpdGVsKGVzcGktPm1pc2NfY3RybCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOwogCQlzcGluX2xvY2tfaW5pdCgmZXNwaS0+bG9jayk7CiAJfQpAQCAtMjk5LDggKzMwMSw3IEBACiB7CiAJc3RydWN0IHBlZXNwaSAqZXNwaSA9IGFkYXB0ZXItPmVzcGk7CiAKLQlpZiAoIWlzX1QyKGFkYXB0ZXIpKQotCQlyZXR1cm47CisJaWYgKCFpc19UMihhZGFwdGVyKSkgcmV0dXJuOwogCXNwaW5fbG9jaygmZXNwaS0+bG9jayk7CiAJZXNwaS0+bWlzY19jdHJsID0gKHZhbCAmIH5NT05fTUFTSykgfAogCQkJICAoZXNwaS0+bWlzY19jdHJsICYgTU9OX01BU0spOwpAQCAtMzEwLDI3ICszMTEsNjEgQEAKIAogdTMyIHQxX2VzcGlfZ2V0X21vbihhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1OCB3YWl0KQogewotCXUzMiBzZWw7Ci0KIAlzdHJ1Y3QgcGVlc3BpICplc3BpID0gYWRhcHRlci0+ZXNwaTsKKwl1MzIgc2VsOwogCiAJaWYgKCFpc19UMihhZGFwdGVyKSkKIAkJcmV0dXJuIDA7CisKIAlzZWwgPSBWX01PTklUT1JFRF9QT1JUX05VTSgoYWRkciAmIDB4M2MpID4+IDIpOwogCWlmICghd2FpdCkgewogCQlpZiAoIXNwaW5fdHJ5bG9jaygmZXNwaS0+bG9jaykpCiAJCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlzcGluX2xvY2soJmVzcGktPmxvY2spOworCiAJaWYgKChzZWwgIT0gKGVzcGktPm1pc2NfY3RybCAmIE1PTl9NQVNLKSkpIHsKIAkJd3JpdGVsKCgoZXNwaS0+bWlzY19jdHJsICYgfk1PTl9NQVNLKSB8IHNlbCksCiAJCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7CiAJCXNlbCA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfU0NIX1RPS0VOMyk7CiAJCXdyaXRlbChlc3BpLT5taXNjX2N0cmwsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUlTQ19DT05UUk9MKTsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlzZWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjMpOwogCXNwaW5fdW5sb2NrKCZlc3BpLT5sb2NrKTsKIAlyZXR1cm4gc2VsOwogfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgVDIwNCBvbmx5LgorICogY29tcGFyZSB3aXRoIHQxX2VzcGlfZ2V0X21vbigpLCBpdCByZWFkcyBlc3BpSW5UeFNvcFswIH4gM10gaW4KKyAqIG9uZSBzaG90LCBzaW5jZSB0aGVyZSBpcyBubyBwZXIgcG9ydCBjb3VudGVyIG9uIHRoZSBvdXQgc2lkZS4KKyAqLworaW50Cit0MV9lc3BpX2dldF9tb25fdDIwNChhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiAqdmFscCwgdTggd2FpdCkKK3sKKyAgICAgICAgc3RydWN0IHBlZXNwaSAqZXNwaSA9IGFkYXB0ZXItPmVzcGk7CisJdTggaSwgbnBvcnQgPSAodTgpYWRhcHRlci0+cGFyYW1zLm5wb3J0czsKKworICAgICAgICBpZiAoIXdhaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNwaW5fdHJ5bG9jaygmZXNwaS0+bG9jaykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmZXNwaS0+bG9jayk7CisKKwlpZiAoIChlc3BpLT5taXNjX2N0cmwgJiBNT05fTUFTSykgIT0gRl9NT05JVE9SRURfRElSRUNUSU9OICkgeworCQllc3BpLT5taXNjX2N0cmwgPSAoZXNwaS0+bWlzY19jdHJsICYgfk1PTl9NQVNLKSB8CisJCQkJCUZfTU9OSVRPUkVEX0RJUkVDVElPTjsKKyAgICAgICAgICAgICAgICB3cml0ZWwoZXNwaS0+bWlzY19jdHJsLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7CisgCX0KKwlmb3IgKGkgPSAwIDsgaSA8IG5wb3J0OyBpKyssIHZhbHArKykgeworCQlpZiAoaSkgeworCQkJd3JpdGVsKGVzcGktPm1pc2NfY3RybCB8IFZfTU9OSVRPUkVEX1BPUlRfTlVNKGkpLAorCQkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUlTQ19DT05UUk9MKTsKKwkJfQorICAgICAgICAgICAgICAgICp2YWxwID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfRVNQSV9TQ0hfVE9LRU4zKTsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlbChlc3BpLT5taXNjX2N0cmwsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUlTQ19DT05UUk9MKTsKKyAgICAgICAgc3Bpbl91bmxvY2soJmVzcGktPmxvY2spOworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZXNwaS5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmgKaW5kZXggYzkwZTM3Zi4uODRmMmM5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmgKQEAgLTY0LDUgKzY0LDYgQEAKIAogdm9pZCB0MV9lc3BpX3NldF9taXNjX2N0cmwoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgdmFsKTsKIHUzMiB0MV9lc3BpX2dldF9tb24oYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTggd2FpdCk7CitpbnQgdDFfZXNwaV9nZXRfbW9uX3QyMDQoYWRhcHRlcl90ICosIHUzMiAqLCB1OCk7CiAKICNlbmRpZiAvKiBfQ1hHQl9FU1BJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL2ZwZ2FfZGVmcy5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9mcGdhX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2EzYzJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9mcGdhX2RlZnMuaApAQCAtMCwwICsxLDIzMiBAQAorLyogJERhdGU6IDIwMDUvMDMvMDcgMjM6NTk6MDUgJCAkUkNTZmlsZTogZnBnYV9kZWZzLmgsdiAkICRSZXZpc2lvbjogMS40ICQgKi8KKworLyoKKyAqIEZQR0Egc3BlY2lmaWMgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmIF9fQ0hFTFNJT19GUEdBX0RFRlNfSF9fCisjZGVmaW5lIF9fQ0hFTFNJT19GUEdBX0RFRlNfSF9fCisKKyNkZWZpbmUgRlBHQV9QQ0lYX0FERFJfVkVSU0lPTiAgICAgICAgICAgICAgIDB4QTA4CisjZGVmaW5lIEZQR0FfUENJWF9BRERSX1NUQVQgICAgICAgICAgICAgICAgICAweEEwQworCisvKiBGUEdBIG1hc3RlciBpbnRlcnJ1cHQgQ2F1c2UvRW5hYmxlIGJpdHMgKi8KKyNkZWZpbmUgRlBHQV9QQ0lYX0lOVEVSUlVQVF9TR0VfRVJST1IgICAgICAgIDB4MQorI2RlZmluZSBGUEdBX1BDSVhfSU5URVJSVVBUX1NHRV9EQVRBICAgICAgICAgMHgyCisjZGVmaW5lIEZQR0FfUENJWF9JTlRFUlJVUFRfVFAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgRlBHQV9QQ0lYX0lOVEVSUlVQVF9NQzMgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBGUEdBX1BDSVhfSU5URVJSVVBUX0dNQUMgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBGUEdBX1BDSVhfSU5URVJSVVBUX1BDSVggICAgICAgICAgICAgMHgyMAorCisvKiBUUCBpbnRlcnJ1cHQgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIEZQR0FfVFBfQUREUl9JTlRFUlJVUFRfRU5BQkxFICAgICAgICAweEExMAorI2RlZmluZSBGUEdBX1RQX0FERFJfSU5URVJSVVBUX0NBVVNFICAgICAgICAgMHhBMTQKKyNkZWZpbmUgRlBHQV9UUF9BRERSX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4QTE4CisKKy8qIFRQIGludGVycnVwdCBDYXVzZS9FbmFibGUgYml0cyAqLworI2RlZmluZSBGUEdBX1RQX0lOVEVSUlVQVF9NQzQgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIEZQR0FfVFBfSU5URVJSVVBUX01DNSAgICAgICAgICAgICAgICAweDIKKworLyoKKyAqIFBNIGludGVycnVwdCByZWdpc3RlciBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBGUEdBX01DM19SRUdfSU5UUkVOQUJMRSAgICAgICAgICAgICAgMHhBMjAKKyNkZWZpbmUgRlBHQV9NQzNfUkVHX0lOVFJDQVVTRSAgICAgICAgICAgICAgIDB4QTI0CisjZGVmaW5lIEZQR0FfTUMzX1JFR19WRVJTSU9OICAgICAgICAgICAgICAgICAweEEyOAorCisvKgorICogR01BQyBpbnRlcnJ1cHQgcmVnaXN0ZXIgYWRkcmVzc2VzCisgKi8KKyNkZWZpbmUgRlBHQV9HTUFDX0FERFJfSU5URVJSVVBUX0VOQUJMRSAgICAgIDB4QTMwCisjZGVmaW5lIEZQR0FfR01BQ19BRERSX0lOVEVSUlVQVF9DQVVTRSAgICAgICAweEEzNAorI2RlZmluZSBGUEdBX0dNQUNfQUREUl9WRVJTSU9OICAgICAgICAgICAgICAgMHhBMzgKKworLyogR01BQyBDYXVzZS9FbmFibGUgYml0cyAqLworI2RlZmluZSBGUEdBX0dNQUNfSU5URVJSVVBUX1BPUlQwICAgICAgICAgICAgMHgxCisjZGVmaW5lIEZQR0FfR01BQ19JTlRFUlJVUFRfUE9SVDEgICAgICAgICAgICAweDIKKyNkZWZpbmUgRlBHQV9HTUFDX0lOVEVSUlVQVF9QT1JUMiAgICAgICAgICAgIDB4NAorI2RlZmluZSBGUEdBX0dNQUNfSU5URVJSVVBUX1BPUlQzICAgICAgICAgICAgMHg4CisKKy8qIE1JMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQV9NSTBfQ0xLIDB4YjAwCisKKyNkZWZpbmUgU19NSTBfQ0xLX0RJViAgICAwCisjZGVmaW5lIE1fTUkwX0NMS19ESVYgICAgMHhmZgorI2RlZmluZSBWX01JMF9DTEtfRElWKHgpICgoeCkgPDwgU19NSTBfQ0xLX0RJVikKKyNkZWZpbmUgR19NSTBfQ0xLX0RJVih4KSAoKCh4KSA+PiBTX01JMF9DTEtfRElWKSAmIE1fTUkwX0NMS19ESVYpCisKKyNkZWZpbmUgU19NSTBfQ0xLX0NOVCAgICA4CisjZGVmaW5lIE1fTUkwX0NMS19DTlQgICAgMHhmZgorI2RlZmluZSBWX01JMF9DTEtfQ05UKHgpICgoeCkgPDwgU19NSTBfQ0xLX0NOVCkKKyNkZWZpbmUgR19NSTBfQ0xLX0NOVCh4KSAoKCh4KSA+PiBTX01JMF9DTEtfQ05UKSAmIE1fTUkwX0NMS19DTlQpCisKKyNkZWZpbmUgQV9NSTBfQ1NSIDB4YjA0CisKKyNkZWZpbmUgU19NSTBfQ1NSX1BPTEwgICAgMAorI2RlZmluZSBWX01JMF9DU1JfUE9MTCh4KSAoKHgpIDw8IFNfTUkwX0NTUl9QT0xMKQorI2RlZmluZSBGX01JMF9DU1JfUE9MTCAgICBWX01JMF9DU1JfUE9MTCgxVSkKKworI2RlZmluZSBTX01JMF9QUkVBTUJMRSAgICAxCisjZGVmaW5lIFZfTUkwX1BSRUFNQkxFKHgpICgoeCkgPDwgU19NSTBfUFJFQU1CTEUpCisjZGVmaW5lIEZfTUkwX1BSRUFNQkxFICAgIFZfTUkwX1BSRUFNQkxFKDFVKQorCisjZGVmaW5lIFNfTUkwX0lOVFJfRU5BQkxFICAgIDIKKyNkZWZpbmUgVl9NSTBfSU5UUl9FTkFCTEUoeCkgKCh4KSA8PCBTX01JMF9JTlRSX0VOQUJMRSkKKyNkZWZpbmUgRl9NSTBfSU5UUl9FTkFCTEUgICAgVl9NSTBfSU5UUl9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NSTBfQlVTWSAgICAzCisjZGVmaW5lIFZfTUkwX0JVU1koeCkgKCh4KSA8PCBTX01JMF9CVVNZKQorI2RlZmluZSBGX01JMF9CVVNZICAgIFZfTUkwX0JVU1koMVUpCisKKyNkZWZpbmUgU19NSTBfTURJTyAgICA0CisjZGVmaW5lIFZfTUkwX01ESU8oeCkgKCh4KSA8PCBTX01JMF9NRElPKQorI2RlZmluZSBGX01JMF9NRElPICAgIFZfTUkwX01ESU8oMVUpCisKKyNkZWZpbmUgQV9NSTBfQUREUiAweGIwOAorCisjZGVmaW5lIFNfTUkwX1BIWV9SRUdfQUREUiAgICAwCisjZGVmaW5lIE1fTUkwX1BIWV9SRUdfQUREUiAgICAweDFmCisjZGVmaW5lIFZfTUkwX1BIWV9SRUdfQUREUih4KSAoKHgpIDw8IFNfTUkwX1BIWV9SRUdfQUREUikKKyNkZWZpbmUgR19NSTBfUEhZX1JFR19BRERSKHgpICgoKHgpID4+IFNfTUkwX1BIWV9SRUdfQUREUikgJiBNX01JMF9QSFlfUkVHX0FERFIpCisKKyNkZWZpbmUgU19NSTBfUEhZX0FERFIgICAgNQorI2RlZmluZSBNX01JMF9QSFlfQUREUiAgICAweDFmCisjZGVmaW5lIFZfTUkwX1BIWV9BRERSKHgpICgoeCkgPDwgU19NSTBfUEhZX0FERFIpCisjZGVmaW5lIEdfTUkwX1BIWV9BRERSKHgpICgoKHgpID4+IFNfTUkwX1BIWV9BRERSKSAmIE1fTUkwX1BIWV9BRERSKQorCisjZGVmaW5lIEFfTUkwX0RBVEFfRVhUIDB4YjBjCisjZGVmaW5lIEFfTUkwX0RBVEFfSU5UIDB4YjEwCisKKy8qIEdNQUMgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFfR01BQ19NQUNJRF9MTyAweDI4CisjZGVmaW5lIEFfR01BQ19NQUNJRF9ISSAweDJjCisjZGVmaW5lIEFfR01BQ19DU1IgMHgzMAorCisjZGVmaW5lIFNfSU5URVJGQUNFICAgIDAKKyNkZWZpbmUgTV9JTlRFUkZBQ0UgICAgMHgzCisjZGVmaW5lIFZfSU5URVJGQUNFKHgpICgoeCkgPDwgU19JTlRFUkZBQ0UpCisjZGVmaW5lIEdfSU5URVJGQUNFKHgpICgoKHgpID4+IFNfSU5URVJGQUNFKSAmIE1fSU5URVJGQUNFKQorCisjZGVmaW5lIFNfTUFDX1RYX0VOQUJMRSAgICAyCisjZGVmaW5lIFZfTUFDX1RYX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX1RYX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfVFhfRU5BQkxFICAgIFZfTUFDX1RYX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01BQ19SWF9FTkFCTEUgICAgMworI2RlZmluZSBWX01BQ19SWF9FTkFCTEUoeCkgKCh4KSA8PCBTX01BQ19SWF9FTkFCTEUpCisjZGVmaW5lIEZfTUFDX1JYX0VOQUJMRSAgICBWX01BQ19SWF9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NQUNfTEJfRU5BQkxFICAgIDQKKyNkZWZpbmUgVl9NQUNfTEJfRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfTEJfRU5BQkxFKQorI2RlZmluZSBGX01BQ19MQl9FTkFCTEUgICAgVl9NQUNfTEJfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFDX1NQRUVEICAgIDUKKyNkZWZpbmUgTV9NQUNfU1BFRUQgICAgMHgzCisjZGVmaW5lIFZfTUFDX1NQRUVEKHgpICgoeCkgPDwgU19NQUNfU1BFRUQpCisjZGVmaW5lIEdfTUFDX1NQRUVEKHgpICgoKHgpID4+IFNfTUFDX1NQRUVEKSAmIE1fTUFDX1NQRUVEKQorCisjZGVmaW5lIFNfTUFDX0hEX0ZDX0VOQUJMRSAgICA3CisjZGVmaW5lIFZfTUFDX0hEX0ZDX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX0hEX0ZDX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfSERfRkNfRU5BQkxFICAgIFZfTUFDX0hEX0ZDX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01BQ19IQUxGX0RVUExFWCAgICA4CisjZGVmaW5lIFZfTUFDX0hBTEZfRFVQTEVYKHgpICgoeCkgPDwgU19NQUNfSEFMRl9EVVBMRVgpCisjZGVmaW5lIEZfTUFDX0hBTEZfRFVQTEVYICAgIFZfTUFDX0hBTEZfRFVQTEVYKDFVKQorCisjZGVmaW5lIFNfTUFDX1BST01JU0MgICAgOQorI2RlZmluZSBWX01BQ19QUk9NSVNDKHgpICgoeCkgPDwgU19NQUNfUFJPTUlTQykKKyNkZWZpbmUgRl9NQUNfUFJPTUlTQyAgICBWX01BQ19QUk9NSVNDKDFVKQorCisjZGVmaW5lIFNfTUFDX01DX0VOQUJMRSAgICAxMAorI2RlZmluZSBWX01BQ19NQ19FTkFCTEUoeCkgKCh4KSA8PCBTX01BQ19NQ19FTkFCTEUpCisjZGVmaW5lIEZfTUFDX01DX0VOQUJMRSAgICBWX01BQ19NQ19FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NQUNfUkVTRVQgICAgMTEKKyNkZWZpbmUgVl9NQUNfUkVTRVQoeCkgKCh4KSA8PCBTX01BQ19SRVNFVCkKKyNkZWZpbmUgRl9NQUNfUkVTRVQgICAgVl9NQUNfUkVTRVQoMVUpCisKKyNkZWZpbmUgU19NQUNfUlhfUEFVU0VfRU5BQkxFICAgIDEyCisjZGVmaW5lIFZfTUFDX1JYX1BBVVNFX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX1JYX1BBVVNFX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfUlhfUEFVU0VfRU5BQkxFICAgIFZfTUFDX1JYX1BBVVNFX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01BQ19UWF9QQVVTRV9FTkFCTEUgICAgMTMKKyNkZWZpbmUgVl9NQUNfVFhfUEFVU0VfRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfVFhfUEFVU0VfRU5BQkxFKQorI2RlZmluZSBGX01BQ19UWF9QQVVTRV9FTkFCTEUgICAgVl9NQUNfVFhfUEFVU0VfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFDX0xXTV9FTkFCTEUgICAgMTQKKyNkZWZpbmUgVl9NQUNfTFdNX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX0xXTV9FTkFCTEUpCisjZGVmaW5lIEZfTUFDX0xXTV9FTkFCTEUgICAgVl9NQUNfTFdNX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX01BQ19NQUdJQ19QS1RfRU5BQkxFICAgIDE1CisjZGVmaW5lIFZfTUFDX01BR0lDX1BLVF9FTkFCTEUoeCkgKCh4KSA8PCBTX01BQ19NQUdJQ19QS1RfRU5BQkxFKQorI2RlZmluZSBGX01BQ19NQUdJQ19QS1RfRU5BQkxFICAgIFZfTUFDX01BR0lDX1BLVF9FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NQUNfSVNMX0VOQUJMRSAgICAxNgorI2RlZmluZSBWX01BQ19JU0xfRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfSVNMX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfSVNMX0VOQUJMRSAgICBWX01BQ19JU0xfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFDX0pVTUJPX0VOQUJMRSAgICAxNworI2RlZmluZSBWX01BQ19KVU1CT19FTkFCTEUoeCkgKCh4KSA8PCBTX01BQ19KVU1CT19FTkFCTEUpCisjZGVmaW5lIEZfTUFDX0pVTUJPX0VOQUJMRSAgICBWX01BQ19KVU1CT19FTkFCTEUoMVUpCisKKyNkZWZpbmUgU19NQUNfUlhfUEFEX0VOQUJMRSAgICAxOAorI2RlZmluZSBWX01BQ19SWF9QQURfRU5BQkxFKHgpICgoeCkgPDwgU19NQUNfUlhfUEFEX0VOQUJMRSkKKyNkZWZpbmUgRl9NQUNfUlhfUEFEX0VOQUJMRSAgICBWX01BQ19SWF9QQURfRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfTUFDX1JYX0NSQ19FTkFCTEUgICAgMTkKKyNkZWZpbmUgVl9NQUNfUlhfQ1JDX0VOQUJMRSh4KSAoKHgpIDw8IFNfTUFDX1JYX0NSQ19FTkFCTEUpCisjZGVmaW5lIEZfTUFDX1JYX0NSQ19FTkFCTEUgICAgVl9NQUNfUlhfQ1JDX0VOQUJMRSgxVSkKKworI2RlZmluZSBBX0dNQUNfSUZTIDB4MzQKKworI2RlZmluZSBTX01BQ19JRlMyICAgIDAKKyNkZWZpbmUgTV9NQUNfSUZTMiAgICAweDNmCisjZGVmaW5lIFZfTUFDX0lGUzIoeCkgKCh4KSA8PCBTX01BQ19JRlMyKQorI2RlZmluZSBHX01BQ19JRlMyKHgpICgoKHgpID4+IFNfTUFDX0lGUzIpICYgTV9NQUNfSUZTMikKKworI2RlZmluZSBTX01BQ19JRlMxICAgIDgKKyNkZWZpbmUgTV9NQUNfSUZTMSAgICAweDdmCisjZGVmaW5lIFZfTUFDX0lGUzEoeCkgKCh4KSA8PCBTX01BQ19JRlMxKQorI2RlZmluZSBHX01BQ19JRlMxKHgpICgoKHgpID4+IFNfTUFDX0lGUzEpICYgTV9NQUNfSUZTMSkKKworI2RlZmluZSBBX0dNQUNfSlVNQk9fRlJBTUVfTEVOIDB4MzgKKyNkZWZpbmUgQV9HTUFDX0xOS19ETFkgMHgzYworI2RlZmluZSBBX0dNQUNfUEFVU0VUSU1FIDB4NDAKKyNkZWZpbmUgQV9HTUFDX01DQVNUX0xPIDB4NDQKKyNkZWZpbmUgQV9HTUFDX01DQVNUX0hJIDB4NDgKKyNkZWZpbmUgQV9HTUFDX01DQVNUX01BU0tfTE8gMHg0YworI2RlZmluZSBBX0dNQUNfTUNBU1RfTUFTS19ISSAweDUwCisjZGVmaW5lIEFfR01BQ19STVRfQ05UIDB4NTQKKyNkZWZpbmUgQV9HTUFDX1JNVF9EQVRBIDB4NTgKKyNkZWZpbmUgQV9HTUFDX0JBQ0tPRkZfU0VFRCAweDVjCisjZGVmaW5lIEFfR01BQ19UWEZfVEhSRVMgMHg2MAorCisjZGVmaW5lIFNfVFhGX1JFQURfVEhSRVNIT0xEICAgIDAKKyNkZWZpbmUgTV9UWEZfUkVBRF9USFJFU0hPTEQgICAgMHhmZgorI2RlZmluZSBWX1RYRl9SRUFEX1RIUkVTSE9MRCh4KSAoKHgpIDw8IFNfVFhGX1JFQURfVEhSRVNIT0xEKQorI2RlZmluZSBHX1RYRl9SRUFEX1RIUkVTSE9MRCh4KSAoKCh4KSA+PiBTX1RYRl9SRUFEX1RIUkVTSE9MRCkgJiBNX1RYRl9SRUFEX1RIUkVTSE9MRCkKKworI2RlZmluZSBTX1RYRl9XUklURV9USFJFU0hPTEQgICAgMTYKKyNkZWZpbmUgTV9UWEZfV1JJVEVfVEhSRVNIT0xEICAgIDB4ZmYKKyNkZWZpbmUgVl9UWEZfV1JJVEVfVEhSRVNIT0xEKHgpICgoeCkgPDwgU19UWEZfV1JJVEVfVEhSRVNIT0xEKQorI2RlZmluZSBHX1RYRl9XUklURV9USFJFU0hPTEQoeCkgKCgoeCkgPj4gU19UWEZfV1JJVEVfVEhSRVNIT0xEKSAmIE1fVFhGX1dSSVRFX1RIUkVTSE9MRCkKKworI2RlZmluZSBNQUNfUkVHX0JBU0UgMHg2MDAKKyNkZWZpbmUgTUFDX1JFR19BRERSKGlkeCwgcmVnKSAoTUFDX1JFR19CQVNFICsgKGlkeCkgKiAxMjggKyAocmVnKSkKKworI2RlZmluZSBNQUNfUkVHX0lETE8oaWR4KSAgICAgICAgICAgICAgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX01BQ0lEX0xPKQorI2RlZmluZSBNQUNfUkVHX0lESEkoaWR4KSAgICAgICAgICAgICAgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX01BQ0lEX0hJKQorI2RlZmluZSBNQUNfUkVHX0NTUihpZHgpICAgICAgICAgICAgICAgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX0NTUikKKyNkZWZpbmUgTUFDX1JFR19JRlMoaWR4KSAgICAgICAgICAgICAgIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19JRlMpCisjZGVmaW5lIE1BQ19SRUdfTEFSR0VGUkFNRUxFTkdUSChpZHgpIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19KVU1CT19GUkFNRV9MRU4pCisjZGVmaW5lIE1BQ19SRUdfTElOS0RMWShpZHgpICAgICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfTE5LX0RMWSkKKyNkZWZpbmUgTUFDX1JFR19QQVVTRVRJTUUoaWR4KSAgICAgICAgIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19QQVVTRVRJTUUpCisjZGVmaW5lIE1BQ19SRUdfQ0FTVExPKGlkeCkgICAgICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfTUNBU1RfTE8pCisjZGVmaW5lIE1BQ19SRUdfTUNBU1RISShpZHgpICAgICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfTUNBU1RfSEkpCisjZGVmaW5lIE1BQ19SRUdfQ0FTVE1BU0tMTyhpZHgpICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfTUNBU1RfTUFTS19MTykKKyNkZWZpbmUgTUFDX1JFR19NQ0FTVE1BU0tISShpZHgpICAgICAgIE1BQ19SRUdfQUREUihpZHgsIEFfR01BQ19NQ0FTVF9NQVNLX0hJKQorI2RlZmluZSBNQUNfUkVHX1JNQ05UKGlkeCkgICAgICAgICAgICAgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX1JNVF9DTlQpCisjZGVmaW5lIE1BQ19SRUdfUk1EQVRBKGlkeCkgICAgICAgICAgICBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfUk1UX0RBVEEpCisjZGVmaW5lIE1BQ19SRUdfR01SQU5EQkFDS09GRlNFRUQoaWR4KSBNQUNfUkVHX0FERFIoaWR4LCBBX0dNQUNfQkFDS09GRl9TRUVEKQorI2RlZmluZSBNQUNfUkVHX1RYRlRIUkVTSE9MRFMoaWR4KSAgICAgTUFDX1JFR19BRERSKGlkeCwgQV9HTUFDX1RYRl9USFJFUykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL2dtYWMuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vZ21hYy5oCmluZGV4IDc0NmIwZWUuLmEyYjhhZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZ21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vZ21hYy5oCkBAIC02Miw2ICs2Miw4IEBACiAJdTY0IFR4SW50ZXJuYWxNQUNYbWl0RXJyb3I7CiAJdTY0IFR4RnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsOwogCXU2NCBUeEZDU0Vycm9yczsKKwl1NjQgVHhKdW1ib0ZyYW1lc09LOworCXU2NCBUeEp1bWJvT2N0ZXRzT0s7CiAKIAkvKiBSZWNlaXZlICovCiAJdTY0IFJ4T2N0ZXRzT0s7CkBAIC04MSw2ICs4Myw4IEBACiAJdTY0IFJ4SW5SYW5nZUxlbmd0aEVycm9yczsKIAl1NjQgUnhPdXRPZlJhbmdlTGVuZ3RoRmllbGQ7CiAJdTY0IFJ4RnJhbWVUb29Mb25nRXJyb3JzOworCXU2NCBSeEp1bWJvRnJhbWVzT0s7CisJdTY0IFJ4SnVtYm9PY3RldHNPSzsKIH07CiAKIHN0cnVjdCBjbWFjX29wcyB7CkBAIC0xMjgsNiArMTMyLDcgQEAKIGV4dGVybiBzdHJ1Y3QgZ21hYyB0MV9wbTMzOTNfb3BzOwogZXh0ZXJuIHN0cnVjdCBnbWFjIHQxX2NoZWxzaW9fbWFjX29wczsKIGV4dGVybiBzdHJ1Y3QgZ21hYyB0MV92c2M3MzIxX29wczsKK2V4dGVybiBzdHJ1Y3QgZ21hYyB0MV92c2M3MzI2X29wczsKIGV4dGVybiBzdHJ1Y3QgZ21hYyB0MV9peGYxMDEwX29wczsKIGV4dGVybiBzdHJ1Y3QgZ21hYyB0MV9kdW1teV9tYWNfb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL2l4ZjEwMTAuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vaXhmMTAxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOGYxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2l4ZjEwMTAuYwpAQCAtMCwwICsxLDQ4NSBAQAorLyogJERhdGU6IDIwMDUvMTEvMTIgMDI6MTM6NDkgJCAkUkNTZmlsZTogaXhmMTAxMC5jLHYgJCAkUmV2aXNpb246IDEuMzYgJCAqLworI2luY2x1ZGUgImdtYWMuaCIKKyNpbmNsdWRlICJlbG1lcjAuaCIKKworLyogVXBkYXRlIGZhc3QgY2hhbmdpbmcgc3RhdGlzdGljcyBldmVyeSAxNSBzZWNvbmRzICovCisjZGVmaW5lIFNUQVRTX1RJQ0tfU0VDUyAxNQorLyogMzAgbWludXRlcyBmb3IgZnVsbCBzdGF0aXN0aWNzIHVwZGF0ZSAqLworI2RlZmluZSBNQUpPUl9VUERBVEVfVElDS1MgKDE4MDAgLyBTVEFUU19USUNLX1NFQ1MpCisKKy8qCisgKiBUaGUgSVhGMTAxMCBjYW4gaGFuZGxlIGZyYW1lcyB1cCB0byAxNjM4MyBieXRlcyBidXQgaXQncyBvcHRpbWl6ZWQgZm9yCisgKiBmcmFtZXMgdXAgdG8gOTgzMSAoMHgyNjY3KSBieXRlcywgc28gd2UgbGltaXQganVtYm8gZnJhbWUgc2l6ZSB0byB0aGlzLgorICogVGhpcyBsZW5ndGggaW5jbHVkZXMgZXRoZXJuZXQgaGVhZGVyIGFuZCBGQ1MuCisgKi8KKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgMHgyNjY3CisKKy8qIE1BQyByZWdpc3RlcnMgKi8KK2VudW0geworCS8qIFBlci1wb3J0IHJlZ2lzdGVycyAqLworCVJFR19NQUNBRERSX0xPVyA9IDAsCisJUkVHX01BQ0FERFJfSElHSCA9IDB4NCwKKwlSRUdfRkRGQ19UWVBFID0gMHhDLAorCVJFR19GQ19UWF9USU1FUl9WQUxVRSA9IDB4MWMsCisJUkVHX0lQR19SWF9USU1FMSA9IDB4MjgsCisJUkVHX0lQR19SWF9USU1FMiA9IDB4MmMsCisJUkVHX0lQR19UWF9USU1FID0gMHgzMCwKKwlSRUdfUEFVU0VfVEhSRVMgPSAweDM4LAorCVJFR19NQVhfRlJBTUVfU0laRSA9IDB4M2MsCisJUkVHX1JHTUlJX1NQRUVEID0gMHg0MCwKKwlSRUdfRkNfRU5BQkxFID0gMHg0OCwKKwlSRUdfRElTQ0FSRF9DVFJMX0ZSQU1FUyA9IDB4NTQsCisJUkVHX0RJVkVSU0VfQ09ORklHID0gMHg2MCwKKwlSRUdfUlhfRklMVEVSID0gMHg2NCwKKwlSRUdfTUNfQUREUl9MT1cgPSAweDY4LAorCVJFR19NQ19BRERSX0hJR0ggPSAweDZjLAorCisJUkVHX1JYX09DVEVUU19PSyA9IDB4ODAsCisJUkVHX1JYX09DVEVUU19CQUQgPSAweDg0LAorCVJFR19SWF9VQ19QS1RTID0gMHg4OCwKKwlSRUdfUlhfTUNfUEtUUyA9IDB4OGMsCisJUkVHX1JYX0JDX1BLVFMgPSAweDkwLAorCVJFR19SWF9GQ1NfRVJSID0gMHhiMCwKKwlSRUdfUlhfVEFHR0VEID0gMHhiNCwKKwlSRUdfUlhfREFUQV9FUlIgPSAweGI4LAorCVJFR19SWF9BTElHTl9FUlIgPSAweGJjLAorCVJFR19SWF9MT05HX0VSUiA9IDB4YzAsCisJUkVHX1JYX0pBQkJFUl9FUlIgPSAweGM0LAorCVJFR19SWF9QQVVTRV9GUkFNRVMgPSAweGM4LAorCVJFR19SWF9VTktOT1dOX0NUUkxfRlJBTUVTID0gMHhjYywKKwlSRUdfUlhfVkVSWV9MT05HX0VSUiA9IDB4ZDAsCisJUkVHX1JYX1JVTlRfRVJSID0gMHhkNCwKKwlSRUdfUlhfU0hPUlRfRVJSID0gMHhkOCwKKwlSRUdfUlhfU1lNQk9MX0VSUiA9IDB4ZTQsCisKKwlSRUdfVFhfT0NURVRTX09LID0gMHgxMDAsCisJUkVHX1RYX09DVEVUU19CQUQgPSAweDEwNCwKKwlSRUdfVFhfVUNfUEtUUyA9IDB4MTA4LAorCVJFR19UWF9NQ19QS1RTID0gMHgxMGMsCisJUkVHX1RYX0JDX1BLVFMgPSAweDExMCwKKwlSRUdfVFhfRVhDRVNTSVZFX0xFTl9EUk9QID0gMHgxNGMsCisJUkVHX1RYX1VOREVSUlVOID0gMHgxNTAsCisJUkVHX1RYX1RBR0dFRCA9IDB4MTU0LAorCVJFR19UWF9QQVVTRV9GUkFNRVMgPSAweDE1QywKKworCS8qIEdsb2JhbCByZWdpc3RlcnMgKi8KKwlSRUdfUE9SVF9FTkFCTEUgPSAweDE0MDAsCisKKwlSRUdfSlRBR19JRCA9IDB4MTQzMCwKKworCVJYX0ZJRk9fSElHSF9XQVRFUk1BUktfQkFTRSA9IDB4MTYwMCwKKwlSWF9GSUZPX0xPV19XQVRFUk1BUktfQkFTRSA9IDB4MTYyOCwKKwlSWF9GSUZPX0ZSQU1FU19SRU1PVkVEX0JBU0UgPSAweDE2NTAsCisKKwlSRUdfUlhfRVJSX0RST1AgPSAweDE2N2MsCisJUkVHX1JYX0ZJRk9fT1ZFUkZMT1dfRVZFTlQgPSAweDE2ODAsCisKKwlUWF9GSUZPX0hJR0hfV0FURVJNQVJLX0JBU0UgPSAweDE4MDAsCisJVFhfRklGT19MT1dfV0FURVJNQVJLX0JBU0UgPSAweDE4MjgsCisJVFhfRklGT19YRkVSX1RIUkVTX0JBU0UgPSAweDE4NTAsCisKKwlSRUdfVFhfRklGT19PVkVSRkxPV19FVkVOVCA9IDB4MTg3OCwKKwlSRUdfVFhfRklGT19PT1NfRVZFTlQgPSAweDE4ODQsCisKKwlUWF9GSUZPX0ZSQU1FU19SRU1PVkVEX0JBU0UgPSAweDE4ODgsCisKKwlSRUdfU1BJX1JYX0JVUlNUID0gMHgxYzAwLAorCVJFR19TUElfUlhfVFJBSU5JTkcgPSAweDFjMDQsCisJUkVHX1NQSV9SWF9DQUxFTkRBUiA9IDB4MWMwOCwKKwlSRUdfU1BJX1RYX1NZTkMgPSAweDFjMGMKK307CisKK2VudW0geyAgICAgICAgICAgICAgICAgICAgIC8qIFJNT04gcmVnaXN0ZXJzICovCisJUkVHX1J4T2N0ZXRzVG90YWxPSyA9IDB4ODAsCisJUkVHX1J4T2N0ZXRzQmFkID0gMHg4NCwKKwlSRUdfUnhVQ1BrdHMgPSAweDg4LAorCVJFR19SeE1DUGt0cyA9IDB4OGMsCisJUkVHX1J4QkNQa3RzID0gMHg5MCwKKwlSRUdfUnhKdW1ib1BrdHMgPSAweGFjLAorCVJFR19SeEZDU0Vycm9ycyA9IDB4YjAsCisJUkVHX1J4RGF0YUVycm9ycyA9IDB4YjgsCisJUkVHX1J4QWxpZ25FcnJvcnMgPSAweGJjLAorCVJFR19SeExvbmdFcnJvcnMgPSAweGMwLAorCVJFR19SeEphYmJlckVycm9ycyA9IDB4YzQsCisJUkVHX1J4UGF1c2VNYWNDb250cm9sQ291bnRlciA9IDB4YzgsCisJUkVHX1J4VmVyeUxvbmdFcnJvcnMgPSAweGQwLAorCVJFR19SeFJ1bnRFcnJvcnMgPSAweGQ0LAorCVJFR19SeFNob3J0RXJyb3JzID0gMHhkOCwKKwlSRUdfUnhTZXF1ZW5jZUVycm9ycyA9IDB4ZTAsCisJUkVHX1J4U3ltYm9sRXJyb3JzID0gMHhlNCwKKworCVJFR19UeE9jdGV0c1RvdGFsT0sgPSAweDEwMCwKKwlSRUdfVHhPY3RldHNCYWQgPSAweDEwNCwKKwlSRUdfVHhVQ1BrdHMgPSAweDEwOCwKKwlSRUdfVHhNQ1BrdHMgPSAweDEwYywKKwlSRUdfVHhCQ1BrdHMgPSAweDExMCwKKwlSRUdfVHhKdW1ib1BrdHMgPSAweDEyQywKKwlSRUdfVHhUb3RhbENvbGxpc2lvbnMgPSAweDEzNCwKKwlSRUdfVHhFeGNlc3NpdmVMZW5ndGhEcm9wID0gMHgxNGMsCisJUkVHX1R4VW5kZXJydW4gPSAweDE1MCwKKwlSRUdfVHhDUkNFcnJvcnMgPSAweDE1OCwKKwlSRUdfVHhQYXVzZUZyYW1lcyA9IDB4MTVjCit9OworCitlbnVtIHsKKwlESVZFUlNFX0NPTkZJR19QQURfRU5BQkxFID0gMHg4MCwKKwlESVZFUlNFX0NPTkZJR19DUkNfQUREID0gMHg0MAorfTsKKworI2RlZmluZSBNQUNSRUdfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFDUkVHKG1hYywgbWFjX3JlZykgICAoKG1hYyktPmluc3RhbmNlLT5tYWNfYmFzZSArIChtYWNfcmVnKSkKKworc3RydWN0IF9jbWFjX2luc3RhbmNlIHsKKwl1MzIgbWFjX2Jhc2U7CisJdTMyIGluZGV4OworCXUzMiB2ZXJzaW9uOworCXUzMiB0aWNrczsKK307CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfcG9ydChzdHJ1Y3QgY21hYyAqbWFjKQoreworCXUzMiB2YWw7CisKKwl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIFJFR19QT1JUX0VOQUJMRSwgJnZhbCk7CisJdmFsICY9IH4oMSA8PCBtYWMtPmluc3RhbmNlLT5pbmRleCk7CisJdDFfdHBpX3dyaXRlKG1hYy0+YWRhcHRlciwgUkVHX1BPUlRfRU5BQkxFLCB2YWwpOworfQorCisjZGVmaW5lIFJNT05fVVBEQVRFKG1hYywgbmFtZSwgc3RhdF9uYW1lKSBcCisJdDFfdHBpX3JlYWQoKG1hYyktPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR18jI25hbWUpLCAmdmFsKTsgXAorCShtYWMpLT5zdGF0cy5zdGF0X25hbWUgKz0gdmFsOworCisvKgorICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIFJNT04gY291bnRlcnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjdW11bGF0aXZlCisgKiBwb3J0IHN0YXRpc3RpY3MuICBUaGUgSFcgUk1PTiBjb3VudGVycyBhcmUgY2xlYXJlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcG9ydF9zdGF0c191cGRhdGUoc3RydWN0IGNtYWMgKm1hYykKK3sKKwl1MzIgdmFsOworCisJLyogUnggc3RhdHMgKi8KKwlSTU9OX1VQREFURShtYWMsIFJ4T2N0ZXRzVG90YWxPSywgUnhPY3RldHNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBSeE9jdGV0c0JhZCwgUnhPY3RldHNCYWQpOworCVJNT05fVVBEQVRFKG1hYywgUnhVQ1BrdHMsIFJ4VW5pY2FzdEZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4TUNQa3RzLCBSeE11bHRpY2FzdEZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4QkNQa3RzLCBSeEJyb2FkY2FzdEZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4SnVtYm9Qa3RzLCBSeEp1bWJvRnJhbWVzT0spOworCVJNT05fVVBEQVRFKG1hYywgUnhGQ1NFcnJvcnMsIFJ4RkNTRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4QWxpZ25FcnJvcnMsIFJ4QWxpZ25FcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhMb25nRXJyb3JzLCBSeEZyYW1lVG9vTG9uZ0Vycm9ycyk7CisJUk1PTl9VUERBVEUobWFjLCBSeFZlcnlMb25nRXJyb3JzLCBSeEZyYW1lVG9vTG9uZ0Vycm9ycyk7CisJUk1PTl9VUERBVEUobWFjLCBSeFBhdXNlTWFjQ29udHJvbENvdW50ZXIsIFJ4UGF1c2VGcmFtZXMpOworCVJNT05fVVBEQVRFKG1hYywgUnhEYXRhRXJyb3JzLCBSeERhdGFFcnJvcnMpOworCVJNT05fVVBEQVRFKG1hYywgUnhKYWJiZXJFcnJvcnMsIFJ4SmFiYmVyRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4UnVudEVycm9ycywgUnhSdW50RXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4U2hvcnRFcnJvcnMsIFJ4UnVudEVycm9ycyk7CisJUk1PTl9VUERBVEUobWFjLCBSeFNlcXVlbmNlRXJyb3JzLCBSeFNlcXVlbmNlRXJyb3JzKTsKKwlSTU9OX1VQREFURShtYWMsIFJ4U3ltYm9sRXJyb3JzLCBSeFN5bWJvbEVycm9ycyk7CisKKwkvKiBUeCBzdGF0cyAoc2tpcCBjb2xsaXNpb24gc3RhdHMgYXMgd2UgYXJlIGZ1bGwtZHVwbGV4IG9ubHkpICovCisJUk1PTl9VUERBVEUobWFjLCBUeE9jdGV0c1RvdGFsT0ssIFR4T2N0ZXRzT0spOworCVJNT05fVVBEQVRFKG1hYywgVHhPY3RldHNCYWQsIFR4T2N0ZXRzQmFkKTsKKwlSTU9OX1VQREFURShtYWMsIFR4VUNQa3RzLCBUeFVuaWNhc3RGcmFtZXNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBUeE1DUGt0cywgVHhNdWx0aWNhc3RGcmFtZXNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBUeEJDUGt0cywgVHhCcm9hZGNhc3RGcmFtZXNPSyk7CisJUk1PTl9VUERBVEUobWFjLCBUeEp1bWJvUGt0cywgVHhKdW1ib0ZyYW1lc09LKTsKKwlSTU9OX1VQREFURShtYWMsIFR4UGF1c2VGcmFtZXMsIFR4UGF1c2VGcmFtZXMpOworCVJNT05fVVBEQVRFKG1hYywgVHhFeGNlc3NpdmVMZW5ndGhEcm9wLCBUeExlbmd0aEVycm9ycyk7CisJUk1PTl9VUERBVEUobWFjLCBUeFVuZGVycnVuLCBUeFVuZGVycnVuKTsKKwlSTU9OX1VQREFURShtYWMsIFR4Q1JDRXJyb3JzLCBUeEZDU0Vycm9ycyk7Cit9CisKKy8qIE5vLW9wIGludGVycnVwdCBvcGVyYXRpb24gYXMgdGhpcyBNQUMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcnJ1cHRzICovCitzdGF0aWMgaW50IG1hY19pbnRyX29wKHN0cnVjdCBjbWFjICptYWMpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIEV4cGVjdCBNQUMgYWRkcmVzcyB0byBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCitzdGF0aWMgaW50IG1hY19zZXRfYWRkcmVzcyhzdHJ1Y3QgY21hYyAqbWFjLCB1OCBhZGRyWzZdKQoreworCXUzMiBhZGRyX2xvLCBhZGRyX2hpOworCisJYWRkcl9sbyA9IGFkZHJbMl07CisJYWRkcl9sbyA9IChhZGRyX2xvIDw8IDgpIHwgYWRkclszXTsKKwlhZGRyX2xvID0gKGFkZHJfbG8gPDwgOCkgfCBhZGRyWzRdOworCWFkZHJfbG8gPSAoYWRkcl9sbyA8PCA4KSB8IGFkZHJbNV07CisKKwlhZGRyX2hpID0gYWRkclswXTsKKwlhZGRyX2hpID0gKGFkZHJfaGkgPDwgOCkgfCBhZGRyWzFdOworCisJdDFfdHBpX3dyaXRlKG1hYy0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX01BQ0FERFJfTE9XKSwgYWRkcl9sbyk7CisJdDFfdHBpX3dyaXRlKG1hYy0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX01BQ0FERFJfSElHSCksIGFkZHJfaGkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19nZXRfYWRkcmVzcyhzdHJ1Y3QgY21hYyAqbWFjLCB1OCBhZGRyWzZdKQoreworCXUzMiBhZGRyX2xvLCBhZGRyX2hpOworCisJdDFfdHBpX3JlYWQobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfTUFDQUREUl9MT1cpLCAmYWRkcl9sbyk7CisJdDFfdHBpX3JlYWQobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfTUFDQUREUl9ISUdIKSwgJmFkZHJfaGkpOworCisJYWRkclswXSA9ICh1OCkgKGFkZHJfaGkgPj4gOCk7CisJYWRkclsxXSA9ICh1OCkgYWRkcl9oaTsKKwlhZGRyWzJdID0gKHU4KSAoYWRkcl9sbyA+PiAyNCk7CisJYWRkclszXSA9ICh1OCkgKGFkZHJfbG8gPj4gMTYpOworCWFkZHJbNF0gPSAodTgpIChhZGRyX2xvID4+IDgpOworCWFkZHJbNV0gPSAodTgpIGFkZHJfbG87CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgaW50ZW5kZWQgdG8gcmVzZXQgYSBwb3J0LCBub3QgdGhlIHdob2xlIE1BQyAqLworc3RhdGljIGludCBtYWNfcmVzZXQoc3RydWN0IGNtYWMgKm1hYykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfc2V0X3J4X21vZGUoc3RydWN0IGNtYWMgKm1hYywgc3RydWN0IHQxX3J4X21vZGUgKnJtKQoreworCXUzMiB2YWwsIG5ld19tb2RlOworCWFkYXB0ZXJfdCAqYWRhcHRlciA9IG1hYy0+YWRhcHRlcjsKKwl1MzIgYWRkcl9sbywgYWRkcl9oaTsKKwl1OCAqYWRkcjsKKworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19SWF9GSUxURVIpLCAmdmFsKTsKKwluZXdfbW9kZSA9IHZhbCAmIH43OworCWlmICghdDFfcnhfbW9kZV9wcm9taXNjKHJtKSAmJiBtYWMtPmluc3RhbmNlLT52ZXJzaW9uID4gMCkKKwkJbmV3X21vZGUgfD0gMTsgICAgIC8qIG9ubHkgc2V0IGlmIHZlcnNpb24gPiAwIGR1ZSB0byBlcnJhdHVtICovCisJaWYgKCF0MV9yeF9tb2RlX3Byb21pc2Mocm0pICYmICF0MV9yeF9tb2RlX2FsbG11bHRpKHJtKQorCSAgICAgJiYgdDFfcnhfbW9kZV9tY19jbnQocm0pIDw9IDEpCisJCW5ld19tb2RlIHw9IDI7CisJaWYgKG5ld19tb2RlICE9IHZhbCkKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19SWF9GSUxURVIpLCBuZXdfbW9kZSk7CisJc3dpdGNoICh0MV9yeF9tb2RlX21jX2NudChybSkpIHsKKwljYXNlIDA6CisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfTUNfQUREUl9MT1cpLCAwKTsKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQ19BRERSX0hJR0gpLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlhZGRyID0gdDFfZ2V0X25leHRfbWNhZGRyKHJtKTsKKwkJYWRkcl9sbyA9IChhZGRyWzJdIDw8IDI0KSB8IChhZGRyWzNdIDw8IDE2KSB8IChhZGRyWzRdIDw8IDgpIHwKKwkJCWFkZHJbNV07CisJCWFkZHJfaGkgPSAoYWRkclswXSA8PCA4KSB8IGFkZHJbMV07CisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfTUNfQUREUl9MT1cpLCBhZGRyX2xvKTsKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQ19BRERSX0hJR0gpLCBhZGRyX2hpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19zZXRfbXR1KHN0cnVjdCBjbWFjICptYWMsIGludCBtdHUpCit7CisJLyogTUFYX0ZSQU1FX1NJWkUgaW5sdWRlcyBoZWFkZXIgKyBGQ1MsIG10dSBkb2Vzbid0ICovCisJaWYgKG10dSA+IChNQVhfRlJBTUVfU0laRSAtIDE0IC0gNCkpIHJldHVybiAtRUlOVkFMOworCXQxX3RwaV93cml0ZShtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQVhfRlJBTUVfU0laRSksCisJCSAgICAgbXR1ICsgMTQgKyA0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfc2V0X3NwZWVkX2R1cGxleF9mYyhzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgc3BlZWQsIGludCBkdXBsZXgsCisJCQkJICAgaW50IGZjKQoreworCXUzMiB2YWw7CisKKwlpZiAoc3BlZWQgPj0gMCAmJiBzcGVlZCAhPSBTUEVFRF8xMDAgJiYgc3BlZWQgIT0gU1BFRURfMTAwMCkKKwkJcmV0dXJuIC0xOworCWlmIChkdXBsZXggPj0gMCAmJiBkdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCXJldHVybiAtMTsKKworCWlmIChzcGVlZCA+PSAwKSB7CisJCXZhbCA9IHNwZWVkID09IFNQRUVEXzEwMCA/IDEgOiAyOworCQl0MV90cGlfd3JpdGUobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfUkdNSUlfU1BFRUQpLCB2YWwpOworCX0KKworCXQxX3RwaV9yZWFkKG1hYy0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX0ZDX0VOQUJMRSksICZ2YWwpOworCXZhbCAmPSB+MzsKKwlpZiAoZmMgJiBQQVVTRV9SWCkKKwkJdmFsIHw9IDE7CisJaWYgKGZjICYgUEFVU0VfVFgpCisJCXZhbCB8PSAyOworCXQxX3RwaV93cml0ZShtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19GQ19FTkFCTEUpLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19nZXRfc3BlZWRfZHVwbGV4X2ZjKHN0cnVjdCBjbWFjICptYWMsIGludCAqc3BlZWQsIGludCAqZHVwbGV4LAorCQkJCSAgIGludCAqZmMpCit7CisJdTMyIHZhbDsKKworCWlmIChkdXBsZXgpCisJCSpkdXBsZXggPSBEVVBMRVhfRlVMTDsKKwlpZiAoc3BlZWQpIHsKKwkJdDFfdHBpX3JlYWQobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfUkdNSUlfU1BFRUQpLAorCQkJICZ2YWwpOworCQkqc3BlZWQgPSAodmFsICYgMikgPyBTUEVFRF8xMDAwIDogU1BFRURfMTAwOworCX0KKwlpZiAoZmMpIHsKKwkJdDFfdHBpX3JlYWQobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfRkNfRU5BQkxFKSwgJnZhbCk7CisJCSpmYyA9IDA7CisJCWlmICh2YWwgJiAxKQorCQkJKmZjIHw9IFBBVVNFX1JYOworCQlpZiAodmFsICYgMikKKwkJCSpmYyB8PSBQQVVTRV9UWDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9wb3J0KHN0cnVjdCBjbWFjICptYWMpCit7CisJdTMyIHZhbDsKKwl1MzIgaW5kZXggPSBtYWMtPmluc3RhbmNlLT5pbmRleDsKKwlhZGFwdGVyX3QgKmFkYXB0ZXIgPSBtYWMtPmFkYXB0ZXI7CisKKwl0MV90cGlfcmVhZChhZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfRElWRVJTRV9DT05GSUcpLCAmdmFsKTsKKwl2YWwgfD0gRElWRVJTRV9DT05GSUdfQ1JDX0FERCB8IERJVkVSU0VfQ09ORklHX1BBRF9FTkFCTEU7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19ESVZFUlNFX0NPTkZJRyksIHZhbCk7CisJaWYgKG1hYy0+aW5zdGFuY2UtPnZlcnNpb24gPiAwKQorCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX1JYX0ZJTFRFUiksIDMpOworCWVsc2UgLyogRG9uJ3QgZW5hYmxlIHVuaWNhc3QgYWRkcmVzcyBmaWx0ZXJpbmcgZHVlIHRvIElYRjEwMTAgYnVnICovCisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfUlhfRklMVEVSKSwgMik7CisKKwl0MV90cGlfcmVhZChhZGFwdGVyLCBSRUdfUlhfRVJSX0RST1AsICZ2YWwpOworCXZhbCB8PSAoMSA8PCBpbmRleCk7CisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJFR19SWF9FUlJfRFJPUCwgdmFsKTsKKworCS8qCisJICogQ2xlYXIgdGhlIHBvcnQgUk1PTiByZWdpc3RlcnMgYnkgYWRkaW5nIHRoZWlyIGN1cnJlbnQgdmFsdWVzIHRvIHRoZQorCSAqIGN1bXVsYXRpY2UgcG9ydCBzdGF0cyBhbmQgdGhlbiBjbGVhcmluZyB0aGUgc3RhdHMuICBSZWFsbHkuCisJICovCisJcG9ydF9zdGF0c191cGRhdGUobWFjKTsKKwltZW1zZXQoJm1hYy0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgY21hY19zdGF0aXN0aWNzKSk7CisJbWFjLT5pbnN0YW5jZS0+dGlja3MgPSAwOworCisJdDFfdHBpX3JlYWQoYWRhcHRlciwgUkVHX1BPUlRfRU5BQkxFLCAmdmFsKTsKKwl2YWwgfD0gKDEgPDwgaW5kZXgpOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBSRUdfUE9SVF9FTkFCTEUsIHZhbCk7CisKKyAgICAgICAJaW5kZXggPDw9IDI7CisgICAgICAgIGlmIChpc19UMihhZGFwdGVyKSkgeworCQkvKiBUMjA0OiBzZXQgdGhlIEZpZm8gd2F0ZXIgbGV2ZWwgJiB0aHJlc2hvbGQgKi8KKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJYX0ZJRk9fSElHSF9XQVRFUk1BUktfQkFTRSArIGluZGV4LCAweDc0MCk7CisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBSWF9GSUZPX0xPV19XQVRFUk1BUktfQkFTRSArIGluZGV4LCAweDczMCk7CisJCXQxX3RwaV93cml0ZShhZGFwdGVyLCBUWF9GSUZPX0hJR0hfV0FURVJNQVJLX0JBU0UgKyBpbmRleCwgMHg2MDApOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgVFhfRklGT19MT1dfV0FURVJNQVJLX0JBU0UgKyBpbmRleCwgMHgxZDApOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgVFhfRklGT19YRkVSX1RIUkVTX0JBU0UgKyBpbmRleCwgMHgxMTAwKTsKKwl9IGVsc2UgeworCS8qCisJICogU2V0IHRoZSBUWCBGaWZvIFRocmVzaG9sZCB0byAweDQwMCBpbnN0ZWFkIG9mIDB4MTAwIHRvIHdvcmsgYXJvdW5kCisJICogVW5kZXJydW4gcHJvYmxlbS4gSW50ZWwgaGFzIGJsZXNzZWQgdGhpcyBzb2x1dGlvbi4KKwkgKi8KKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFRYX0ZJRk9fWEZFUl9USFJFU19CQVNFICsgaW5kZXgsIDB4NDAwKTsKKwl9Cit9CisKKy8qIElYRjEwMTAgcG9ydHMgZG8gbm90IGhhdmUgc2VwYXJhdGUgZW5hYmxlcyBmb3IgVFggYW5kIFJYICovCitzdGF0aWMgaW50IG1hY19lbmFibGUoc3RydWN0IGNtYWMgKm1hYywgaW50IHdoaWNoKQoreworCWlmICh3aGljaCAmIChNQUNfRElSRUNUSU9OX1JYIHwgTUFDX0RJUkVDVElPTl9UWCkpCisJCWVuYWJsZV9wb3J0KG1hYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFjX2Rpc2FibGUoc3RydWN0IGNtYWMgKm1hYywgaW50IHdoaWNoKQoreworCWlmICh3aGljaCAmIChNQUNfRElSRUNUSU9OX1JYIHwgTUFDX0RJUkVDVElPTl9UWCkpCisJCWRpc2FibGVfcG9ydChtYWMpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGFjY3VtdWxhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZQorICogUk1PTiBjb3VudGVycyBpbnRvIHRoZSBwb3J0IHN0YXRpc3RpY3MuICBTaW5jZSB0aGUgY291bnRlcnMgYXJlIG9ubHkgMzIgYml0cworICogc29tZSBvZiB0aGVtIGNhbiBvdmVyZmxvdyBpbiBsZXNzIHRoYW4gYSBtaW51dGUgYXQgR2lnRSBzcGVlZHMsIHNvIHRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgMzAgc2Vjb25kcyBvciBzby4KKyAqCisgKiBUbyBjdXQgZG93biBvbiByZWFkaW5nIGNvc3RzIHdlIHVwZGF0ZSBvbmx5IHRoZSBvY3RldCBjb3VudGVycyBhdCBlYWNoIHRpY2sKKyAqIGFuZCBkbyBhIGZ1bGwgdXBkYXRlIGF0IG1ham9yIHRpY2tzLCB3aGljaCBjYW4gYmUgZXZlcnkgMzAgbWludXRlcyBvciBtb3JlLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNtYWNfc3RhdGlzdGljcyAqbWFjX3VwZGF0ZV9zdGF0aXN0aWNzKHN0cnVjdCBjbWFjICptYWMsCisJCQkJCQkJICAgaW50IGZsYWcpCit7CisJaWYgKGZsYWcgPT0gTUFDX1NUQVRTX1VQREFURV9GVUxMIHx8CisJICAgIE1BSk9SX1VQREFURV9USUNLUyA8PSBtYWMtPmluc3RhbmNlLT50aWNrcykgeworCQlwb3J0X3N0YXRzX3VwZGF0ZShtYWMpOworCQltYWMtPmluc3RhbmNlLT50aWNrcyA9IDA7CisJfSBlbHNlIHsKKwkJdTMyIHZhbDsKKworCQlSTU9OX1VQREFURShtYWMsIFJ4T2N0ZXRzVG90YWxPSywgUnhPY3RldHNPSyk7CisJCVJNT05fVVBEQVRFKG1hYywgVHhPY3RldHNUb3RhbE9LLCBUeE9jdGV0c09LKTsKKwkJbWFjLT5pbnN0YW5jZS0+dGlja3MrKzsKKwl9CisJcmV0dXJuICZtYWMtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBtYWNfZGVzdHJveShzdHJ1Y3QgY21hYyAqbWFjKQoreworCWtmcmVlKG1hYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY21hY19vcHMgaXhmMTAxMF9vcHMgPSB7CisJLmRlc3Ryb3kgICAgICAgICAgICAgICAgICA9IG1hY19kZXN0cm95LAorCS5yZXNldCAgICAgICAgICAgICAgICAgICAgPSBtYWNfcmVzZXQsCisJLmludGVycnVwdF9lbmFibGUgICAgICAgICA9IG1hY19pbnRyX29wLAorCS5pbnRlcnJ1cHRfZGlzYWJsZSAgICAgICAgPSBtYWNfaW50cl9vcCwKKwkuaW50ZXJydXB0X2NsZWFyICAgICAgICAgID0gbWFjX2ludHJfb3AsCisJLmVuYWJsZSAgICAgICAgICAgICAgICAgICA9IG1hY19lbmFibGUsCisJLmRpc2FibGUgICAgICAgICAgICAgICAgICA9IG1hY19kaXNhYmxlLAorCS5zZXRfbXR1ICAgICAgICAgICAgICAgICAgPSBtYWNfc2V0X210dSwKKwkuc2V0X3J4X21vZGUgICAgICAgICAgICAgID0gbWFjX3NldF9yeF9tb2RlLAorCS5zZXRfc3BlZWRfZHVwbGV4X2ZjICAgICAgPSBtYWNfc2V0X3NwZWVkX2R1cGxleF9mYywKKwkuZ2V0X3NwZWVkX2R1cGxleF9mYyAgICAgID0gbWFjX2dldF9zcGVlZF9kdXBsZXhfZmMsCisJLnN0YXRpc3RpY3NfdXBkYXRlICAgICAgICA9IG1hY191cGRhdGVfc3RhdGlzdGljcywKKwkubWFjYWRkcmVzc19nZXQgICAgICAgICAgID0gbWFjX2dldF9hZGRyZXNzLAorCS5tYWNhZGRyZXNzX3NldCAgICAgICAgICAgPSBtYWNfc2V0X2FkZHJlc3MsCit9OworCitzdGF0aWMgaW50IGl4ZjEwMTBfbWFjX3Jlc2V0KGFkYXB0ZXJfdCAqYWRhcHRlcikKK3sKKwl1MzIgdmFsOworCisJdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKKwlpZiAoKHZhbCAmIDEpICE9IDApIHsKKwkJdmFsICY9IH4xOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCQl1ZGVsYXkoMik7CisJfQorCXZhbCB8PSAxOworCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CisJdWRlbGF5KDIpOworCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJFR19QT1JUX0VOQUJMRSwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY21hYyAqaXhmMTAxMF9tYWNfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGluZGV4KQoreworCXN0cnVjdCBjbWFjICptYWM7CisJdTMyIHZhbDsKKworCWlmIChpbmRleCA+IDkpIHJldHVybiBOVUxMOworCisJbWFjID0ga3phbGxvYyhzaXplb2YoKm1hYykgKyBzaXplb2YoY21hY19pbnN0YW5jZSksIEdGUF9LRVJORUwpOworCWlmICghbWFjKSByZXR1cm4gTlVMTDsKKworCW1hYy0+b3BzID0gJml4ZjEwMTBfb3BzOworCW1hYy0+aW5zdGFuY2UgPSAoY21hY19pbnN0YW5jZSAqKShtYWMgKyAxKTsKKworCW1hYy0+aW5zdGFuY2UtPm1hY19iYXNlID0gTUFDUkVHX0JBU0UgKyAoaW5kZXggKiAweDIwMCk7CisJbWFjLT5pbnN0YW5jZS0+aW5kZXggICAgPSBpbmRleDsKKwltYWMtPmFkYXB0ZXIgID0gYWRhcHRlcjsKKwltYWMtPmluc3RhbmNlLT50aWNrcyAgICA9IDA7CisKKwl0MV90cGlfcmVhZChhZGFwdGVyLCBSRUdfSlRBR19JRCwgJnZhbCk7CisJbWFjLT5pbnN0YW5jZS0+dmVyc2lvbiA9IHZhbCA+PiAyODsKKwlyZXR1cm4gbWFjOworfQorCitzdHJ1Y3QgZ21hYyB0MV9peGYxMDEwX29wcyA9IHsKKwlTVEFUU19USUNLX1NFQ1MsCisJaXhmMTAxMF9tYWNfY3JlYXRlLAorCWl4ZjEwMTBfbWFjX3Jlc2V0Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9tYWMuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmMzlkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbWFjLmMKQEAgLTAsMCArMSwzNjggQEAKKy8qICREYXRlOiAyMDA1LzEwLzIyIDAwOjQyOjU5ICQgJFJDU2ZpbGU6IG1hYy5jLHYgJCAkUmV2aXNpb246IDEuMzIgJCAqLworI2luY2x1ZGUgImdtYWMuaCIKKyNpbmNsdWRlICJyZWdzLmgiCisjaW5jbHVkZSAiZnBnYV9kZWZzLmgiCisKKyNkZWZpbmUgTUFDX0NTUl9JTlRFUkZBQ0VfR01JSSAgICAgIDB4MAorI2RlZmluZSBNQUNfQ1NSX0lOVEVSRkFDRV9UQkkgICAgICAgMHgxCisjZGVmaW5lIE1BQ19DU1JfSU5URVJGQUNFX01JSSAgICAgICAweDIKKyNkZWZpbmUgTUFDX0NTUl9JTlRFUkZBQ0VfUk1JSSAgICAgIDB4MworCisvKiBDaGVsc2lvJ3MgTUFDIHN0YXRpc3RpY3MuICovCitzdHJ1Y3QgbWFjX3N0YXRpc3RpY3MgeworCisJLyogVHJhbnNtaXQgKi8KKwl1MzIgVHhGcmFtZXNUcmFuc21pdHRlZE9LOworCXUzMiBUeFJlc2VydmVkMTsKKwl1MzIgVHhSZXNlcnZlZDI7CisJdTMyIFR4T2N0ZXRzVHJhbnNtaXR0ZWRPSzsKKwl1MzIgVHhGcmFtZXNXaXRoRGVmZXJyZWRYbWlzc2lvbnM7CisJdTMyIFR4TGF0ZUNvbGxpc2lvbnM7CisJdTMyIFR4RnJhbWVzQWJvcnRlZER1ZVRvWFNDb2xsaXNpb25zOworCXUzMiBUeEZyYW1lc0xvc3REdWVUb0ludE1BQ1htaXRFcnJvcjsKKwl1MzIgVHhSZXNlcnZlZDM7CisJdTMyIFR4TXVsdGljYXN0RnJhbWVYbWl0dGVkT0s7CisJdTMyIFR4QnJvYWRjYXN0RnJhbWVzWG1pdHRlZE9LOworCXUzMiBUeEZyYW1lc1dpdGhFeGNlc3NpdmVEZWZlcnJhbDsKKwl1MzIgVHhQQVVTRU1BQ0N0cmxGcmFtZXNUcmFuc21pdHRlZDsKKworCS8qIFJlY2VpdmUgKi8KKwl1MzIgUnhGcmFtZXNSZWNlaXZlZE9LOworCXUzMiBSeEZyYW1lQ2hlY2tTZXF1ZW5jZUVycm9yczsKKwl1MzIgUnhBbGlnbm1lbnRFcnJvcnM7CisJdTMyIFJ4T2N0ZXRzUmVjZWl2ZWRPSzsKKwl1MzIgUnhGcmFtZXNMb3N0RHVlVG9JbnRNQUNSY3ZFcnJvcjsKKwl1MzIgUnhNdWx0aWNhc3RGcmFtZXNSZWNlaXZlZE9LOworCXUzMiBSeEJyb2FkY2FzdEZyYW1lc1JlY2VpdmVkT0s7CisJdTMyIFJ4SW5SYW5nZUxlbmd0aEVycm9yczsKKwl1MzIgUnhUeE91dE9mUmFuZ2VMZW5ndGhGaWVsZDsKKwl1MzIgUnhGcmFtZVRvb0xvbmdFcnJvcnM7CisJdTMyIFJ4UEFVU0VNQUNDdHJsRnJhbWVzUmVjZWl2ZWQ7Cit9OworCitzdGF0aWMgaW50IHN0YXRpY19hUG9ydHNbXSA9IHsKKwlGUEdBX0dNQUNfSU5URVJSVVBUX1BPUlQwLAorCUZQR0FfR01BQ19JTlRFUlJVUFRfUE9SVDEsCisJRlBHQV9HTUFDX0lOVEVSUlVQVF9QT1JUMiwKKwlGUEdBX0dNQUNfSU5URVJSVVBUX1BPUlQzCit9OworCitzdHJ1Y3QgX2NtYWNfaW5zdGFuY2UgeworCXUzMiBpbmRleDsKK307CisKK3N0YXRpYyBpbnQgbWFjX2ludHJfZW5hYmxlKHN0cnVjdCBjbWFjICptYWMpCit7CisJdTMyIG1hY19pbnRyOworCisJaWYgKHQxX2lzX2FzaWMobWFjLT5hZGFwdGVyKSkgeworCQkvKiBBU0lDICovCisKKwkJLyogV2UgZG9uJ3QgdXNlIHRoZSBvbiBjaGlwIE1BQyBmb3IgQVNJQyBwcm9kdWN0cy4gKi8KKwl9IGVsc2UgeworCQkvKiBGUEdBICovCisKKwkJLyogU2V0IHBhcmVudCBnbWFjIGludGVycnVwdC4gKi8KKwkJbWFjX2ludHIgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisJCW1hY19pbnRyIHw9IEZQR0FfUENJWF9JTlRFUlJVUFRfR01BQzsKKwkJd3JpdGVsKG1hY19pbnRyLCBtYWMtPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisKKwkJbWFjX2ludHIgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MgKyBGUEdBX0dNQUNfQUREUl9JTlRFUlJVUFRfRU5BQkxFKTsKKwkJbWFjX2ludHIgfD0gc3RhdGljX2FQb3J0c1ttYWMtPmluc3RhbmNlLT5pbmRleF07CisJCXdyaXRlbChtYWNfaW50ciwKKwkJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIEZQR0FfR01BQ19BRERSX0lOVEVSUlVQVF9FTkFCTEUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19pbnRyX2Rpc2FibGUoc3RydWN0IGNtYWMgKm1hYykKK3sKKwl1MzIgbWFjX2ludHI7CisKKwlpZiAodDFfaXNfYXNpYyhtYWMtPmFkYXB0ZXIpKSB7CisJCS8qIEFTSUMgKi8KKworCQkvKiBXZSBkb24ndCB1c2UgdGhlIG9uIGNoaXAgTUFDIGZvciBBU0lDIHByb2R1Y3RzLiAqLworCX0gZWxzZSB7CisJCS8qIEZQR0EgKi8KKworCQkvKiBTZXQgcGFyZW50IGdtYWMgaW50ZXJydXB0LiAqLworCQltYWNfaW50ciA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKKwkJbWFjX2ludHIgJj0gfkZQR0FfUENJWF9JTlRFUlJVUFRfR01BQzsKKwkJd3JpdGVsKG1hY19pbnRyLCBtYWMtPmFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisKKwkJbWFjX2ludHIgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MgKyBGUEdBX0dNQUNfQUREUl9JTlRFUlJVUFRfRU5BQkxFKTsKKwkJbWFjX2ludHIgJj0gfihzdGF0aWNfYVBvcnRzW21hYy0+aW5zdGFuY2UtPmluZGV4XSk7CisJCXdyaXRlbChtYWNfaW50ciwKKwkJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIEZQR0FfR01BQ19BRERSX0lOVEVSUlVQVF9FTkFCTEUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19pbnRyX2NsZWFyKHN0cnVjdCBjbWFjICptYWMpCit7CisJdTMyIG1hY19pbnRyOworCisJaWYgKHQxX2lzX2FzaWMobWFjLT5hZGFwdGVyKSkgeworCQkvKiBBU0lDICovCisKKwkJLyogV2UgZG9uJ3QgdXNlIHRoZSBvbiBjaGlwIE1BQyBmb3IgQVNJQyBwcm9kdWN0cy4gKi8KKwl9IGVsc2UgeworCQkvKiBGUEdBICovCisKKwkJLyogU2V0IHBhcmVudCBnbWFjIGludGVycnVwdC4gKi8KKwkJd3JpdGVsKEZQR0FfUENJWF9JTlRFUlJVUFRfR01BQywKKwkJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArICBBX1BMX0NBVVNFKTsKKwkJbWFjX2ludHIgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MgKyBGUEdBX0dNQUNfQUREUl9JTlRFUlJVUFRfQ0FVU0UpOworCQltYWNfaW50ciB8PSAoc3RhdGljX2FQb3J0c1ttYWMtPmluc3RhbmNlLT5pbmRleF0pOworCQl3cml0ZWwobWFjX2ludHIsCisJCSAgICAgICBtYWMtPmFkYXB0ZXItPnJlZ3MgKyBGUEdBX0dNQUNfQUREUl9JTlRFUlJVUFRfQ0FVU0UpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19nZXRfYWRkcmVzcyhzdHJ1Y3QgY21hYyAqbWFjLCB1OCBhZGRyWzZdKQoreworCXUzMiBkYXRhMzJfbG8sIGRhdGEzMl9oaTsKKworCWRhdGEzMl9sbyA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncworCQkJICArIE1BQ19SRUdfSURMTyhtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCWRhdGEzMl9oaSA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncworCQkJICArIE1BQ19SRUdfSURISShtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCisJYWRkclswXSA9ICh1OCkgKChkYXRhMzJfaGkgPj4gOCkgJiAweEZGKTsKKwlhZGRyWzFdID0gKHU4KSAoKGRhdGEzMl9oaSkgJiAweEZGKTsKKwlhZGRyWzJdID0gKHU4KSAoKGRhdGEzMl9sbyA+PiAyNCkgJiAweEZGKTsKKwlhZGRyWzNdID0gKHU4KSAoKGRhdGEzMl9sbyA+PiAxNikgJiAweEZGKTsKKwlhZGRyWzRdID0gKHU4KSAoKGRhdGEzMl9sbyA+PiA4KSAmIDB4RkYpOworCWFkZHJbNV0gPSAodTgpICgoZGF0YTMyX2xvKSAmIDB4RkYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19yZXNldChzdHJ1Y3QgY21hYyAqbWFjKQoreworCXUzMiBkYXRhMzI7CisJaW50IG1hY19pbl9yZXNldCwgdGltZV9vdXQgPSAxMDA7CisJaW50IGlkeCA9IG1hYy0+aW5zdGFuY2UtPmluZGV4OworCisJZGF0YTMyID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzICsgTUFDX1JFR19DU1IoaWR4KSk7CisJd3JpdGVsKGRhdGEzMiB8IEZfTUFDX1JFU0VULAorCSAgICAgICBtYWMtPmFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0NTUihpZHgpKTsKKworCWRvIHsKKwkJZGF0YTMyID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzICsgTUFDX1JFR19DU1IoaWR4KSk7CisKKwkJbWFjX2luX3Jlc2V0ID0gZGF0YTMyICYgRl9NQUNfUkVTRVQ7CisJCWlmIChtYWNfaW5fcmVzZXQpCisJCQl1ZGVsYXkoMSk7CisJfSB3aGlsZSAobWFjX2luX3Jlc2V0ICYmIC0tdGltZV9vdXQpOworCisJaWYgKG1hY19pbl9yZXNldCkgeworCQlDSF9FUlIoIiVzOiBNQUMgJWQgcmVzZXQgdGltZWQgb3V0XG4iLAorCQkgICAgICAgbWFjLT5hZGFwdGVyLT5uYW1lLCBpZHgpOworCQlyZXR1cm4gMjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfc2V0X3J4X21vZGUoc3RydWN0IGNtYWMgKm1hYywgc3RydWN0IHQxX3J4X21vZGUgKnJtKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MKKwkJCSAgICArIE1BQ19SRUdfQ1NSKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJdmFsICY9IH4oRl9NQUNfUFJPTUlTQyB8IEZfTUFDX01DX0VOQUJMRSk7CisJdmFsIHw9IFZfTUFDX1BST01JU0ModDFfcnhfbW9kZV9wcm9taXNjKHJtKSAhPSAwKTsKKwl2YWwgfD0gVl9NQUNfTUNfRU5BQkxFKHQxX3J4X21vZGVfYWxsbXVsdGkocm0pICE9IDApOworCXdyaXRlbCh2YWwsCisJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIE1BQ19SRUdfQ1NSKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfc2V0X3NwZWVkX2R1cGxleF9mYyhzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgc3BlZWQsIGludCBkdXBsZXgsCisJCQkJICAgaW50IGZjKQoreworCXUzMiBkYXRhMzI7CisKKwlkYXRhMzIgPSByZWFkbChtYWMtPmFkYXB0ZXItPnJlZ3MKKwkJCSAgICAgICArIE1BQ19SRUdfQ1NSKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJZGF0YTMyICY9IH4oRl9NQUNfSEFMRl9EVVBMRVggfCBWX01BQ19TUEVFRChNX01BQ19TUEVFRCkgfAorCQlWX0lOVEVSRkFDRShNX0lOVEVSRkFDRSkgfCBGX01BQ19UWF9QQVVTRV9FTkFCTEUgfAorCQlGX01BQ19SWF9QQVVTRV9FTkFCTEUpOworCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgU1BFRURfMTA6CisJY2FzZSBTUEVFRF8xMDA6CisJCWRhdGEzMiB8PSBWX0lOVEVSRkFDRShNQUNfQ1NSX0lOVEVSRkFDRV9NSUkpOworCQlkYXRhMzIgfD0gVl9NQUNfU1BFRUQoc3BlZWQgPT0gU1BFRURfMTAgPyAwIDogMSk7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMDoKKwkJZGF0YTMyIHw9IFZfSU5URVJGQUNFKE1BQ19DU1JfSU5URVJGQUNFX0dNSUkpOworCQlkYXRhMzIgfD0gVl9NQUNfU1BFRUQoMik7CisJCWJyZWFrOworCX0KKworCWlmIChkdXBsZXggPj0gMCkKKwkJZGF0YTMyIHw9IFZfTUFDX0hBTEZfRFVQTEVYKGR1cGxleCA9PSBEVVBMRVhfSEFMRik7CisKKwlpZiAoZmMgPj0gMCkgeworCQlkYXRhMzIgfD0gVl9NQUNfUlhfUEFVU0VfRU5BQkxFKChmYyAmIFBBVVNFX1JYKSAhPSAwKTsKKwkJZGF0YTMyIHw9IFZfTUFDX1RYX1BBVVNFX0VOQUJMRSgoZmMgJiBQQVVTRV9UWCkgIT0gMCk7CisJfQorCisJd3JpdGVsKGRhdGEzMiwKKwkgICAgICAgbWFjLT5hZGFwdGVyLT5yZWdzICsgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNfZW5hYmxlKHN0cnVjdCBjbWFjICptYWMsIGludCB3aGljaCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzCisJCQkgICAgKyBNQUNfUkVHX0NTUihtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fUlgpCisJCXZhbCB8PSBGX01BQ19SWF9FTkFCTEU7CisJaWYgKHdoaWNoICYgTUFDX0RJUkVDVElPTl9UWCkKKwkJdmFsIHw9IEZfTUFDX1RYX0VOQUJMRTsKKwl3cml0ZWwodmFsLAorCSAgICAgICBtYWMtPmFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0NTUihtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19kaXNhYmxlKHN0cnVjdCBjbWFjICptYWMsIGludCB3aGljaCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwobWFjLT5hZGFwdGVyLT5yZWdzCisJCQkgICAgKyBNQUNfUkVHX0NTUihtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fUlgpCisJCXZhbCAmPSB+Rl9NQUNfUlhfRU5BQkxFOworCWlmICh3aGljaCAmIE1BQ19ESVJFQ1RJT05fVFgpCisJCXZhbCAmPSB+Rl9NQUNfVFhfRU5BQkxFOworCXdyaXRlbCh2YWwsCisJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIE1BQ19SRUdfQ1NSKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IG1hY19zZXRfaWZzKHN0cnVjdCBjbWFjICptYWMsIHUzMiBtb2RlKQoreworCXQxX3dyaXRlX3JlZ180KG1hYy0+YWRhcHRlciwKKwkJICAgICAgIE1BQ19SRUdfSUZTKG1hYy0+aW5zdGFuY2UtPmluZGV4KSwKKwkJICAgICAgIG1vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY19lbmFibGVfaXNsKHN0cnVjdCBjbWFjICptYWMpCit7CisJdTMyIGRhdGEzMiA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncworCQkJCSAgICsgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwlkYXRhMzIgfD0gRl9NQUNfUlhfRU5BQkxFIHwgRl9NQUNfVFhfRU5BQkxFOworCXQxX3dyaXRlX3JlZ180KG1hYy0+YWRhcHRlciwKKwkJICAgICAgIE1BQ19SRUdfQ1NSKG1hYy0+aW5zdGFuY2UtPmluZGV4KSwKKwkJICAgICAgIGRhdGEzMik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtYWNfc2V0X210dShzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgbXR1KQoreworCWlmIChtdHUgPiA5NjAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl3cml0ZWwobXR1ICsgRVRIX0hMRU4gKyBWTEFOX0hMRU4sCisJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIE1BQ19SRUdfTEFSR0VGUkFNRUxFTkdUSChtYWMtPmluc3RhbmNlLT5pbmRleCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21hY19zdGF0aXN0aWNzICptYWNfdXBkYXRlX3N0YXRpc3RpY3Moc3RydWN0IGNtYWMgKm1hYywKKwkJCQkJCQkgICBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgbWFjX3N0YXRpc3RpY3Mgc3Q7CisJdTMyICpwID0gKHUzMiAqKSAmIHN0LCBpOworCisJd3JpdGVsKDAsCisJICAgICAgIG1hYy0+YWRhcHRlci0+cmVncyArIE1BQ19SRUdfUk1DTlQobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3QpIC8gc2l6ZW9mKHUzMik7IGkrKykKKwkJKnArKyA9IHJlYWRsKG1hYy0+YWRhcHRlci0+cmVncworCQkJICAgICArIE1BQ19SRUdfUk1EQVRBKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisKKwkvKiBYWFggY29udmVydCBzdGF0cyAqLworCXJldHVybiAmbWFjLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgbWFjX2Rlc3Ryb3koc3RydWN0IGNtYWMgKm1hYykKK3sKKwlrZnJlZShtYWMpOworfQorCitzdGF0aWMgc3RydWN0IGNtYWNfb3BzIGNoZWxzaW9fbWFjX29wcyA9IHsKKwkuZGVzdHJveSAgICAgICAgICAgICAgICAgPSBtYWNfZGVzdHJveSwKKwkucmVzZXQgICAgICAgICAgICAgICAgICAgPSBtYWNfcmVzZXQsCisJLmludGVycnVwdF9lbmFibGUgICAgICAgID0gbWFjX2ludHJfZW5hYmxlLAorCS5pbnRlcnJ1cHRfZGlzYWJsZSAgICAgICA9IG1hY19pbnRyX2Rpc2FibGUsCisJLmludGVycnVwdF9jbGVhciAgICAgICAgID0gbWFjX2ludHJfY2xlYXIsCisJLmVuYWJsZSAgICAgICAgICAgICAgICAgID0gbWFjX2VuYWJsZSwKKwkuZGlzYWJsZSAgICAgICAgICAgICAgICAgPSBtYWNfZGlzYWJsZSwKKwkuc2V0X210dSAgICAgICAgICAgICAgICAgPSBtYWNfc2V0X210dSwKKwkuc2V0X3J4X21vZGUgICAgICAgICAgICAgPSBtYWNfc2V0X3J4X21vZGUsCisJLnNldF9zcGVlZF9kdXBsZXhfZmMgICAgID0gbWFjX3NldF9zcGVlZF9kdXBsZXhfZmMsCisJLm1hY2FkZHJlc3NfZ2V0ICAgICAgICAgID0gbWFjX2dldF9hZGRyZXNzLAorCS5zdGF0aXN0aWNzX3VwZGF0ZSAgICAgICA9IG1hY191cGRhdGVfc3RhdGlzdGljcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY21hYyAqbWFjX2NyZWF0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgY21hYyAqbWFjOworCXUzMiBkYXRhMzI7CisKKwlpZiAoaW5kZXggPj0gNCkKKwkJcmV0dXJuIE5VTEw7CisKKwltYWMgPSBremFsbG9jKHNpemVvZigqbWFjKSArIHNpemVvZihjbWFjX2luc3RhbmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYWMpCisJCXJldHVybiBOVUxMOworCisJbWFjLT5vcHMgPSAmY2hlbHNpb19tYWNfb3BzOworCW1hYy0+aW5zdGFuY2UgPSAoY21hY19pbnN0YW5jZSAqKSAobWFjICsgMSk7CisKKwltYWMtPmluc3RhbmNlLT5pbmRleCA9IGluZGV4OworCW1hYy0+YWRhcHRlciA9IGFkYXB0ZXI7CisKKwlkYXRhMzIgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwlkYXRhMzIgJj0gfihGX01BQ19SRVNFVCB8IEZfTUFDX1BST01JU0MgfCBGX01BQ19QUk9NSVNDIHwKKwkJICAgIEZfTUFDX0xCX0VOQUJMRSB8IEZfTUFDX1JYX0VOQUJMRSB8IEZfTUFDX1RYX0VOQUJMRSk7CisJZGF0YTMyIHw9IEZfTUFDX0pVTUJPX0VOQUJMRTsKKwl3cml0ZWwoZGF0YTMyLCBhZGFwdGVyLT5yZWdzICsgTUFDX1JFR19DU1IobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSBiYWNrb2ZmIHNlZWQuICovCisJZGF0YTMyID0gMHg1NWFhICsgKDMgKiBpbmRleCk7CisJd3JpdGVsKGRhdGEzMiwKKwkgICAgICAgYWRhcHRlci0+cmVncyArIE1BQ19SRUdfR01SQU5EQkFDS09GRlNFRUQobWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjIGFkZHJlc3MgbmVlZHMgdG8gYmUgc2V0IG1hbnVhbGx5LiAqLworCWRhdGEzMiA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBNQUNfUkVHX0lETE8obWFjLT5pbnN0YW5jZS0+aW5kZXgpKTsKKwlpZiAoZGF0YTMyID09IDAgfHwgZGF0YTMyID09IDB4ZmZmZmZmZmYpIHsKKwkJLyoKKwkJICogQWRkIGEgZGVmYXVsdCBNQUMgYWRkcmVzcyBpZiB3ZSBjYW4ndCByZWFkIG9uZS4KKwkJICovCisJCXdyaXRlbCgweDQzRkZGRkZGIC0gaW5kZXgsCisJCSAgICAgICBhZGFwdGVyLT5yZWdzICsgTUFDX1JFR19JRExPKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJCXdyaXRlbCgweDAwMDcsCisJCSAgICAgICBhZGFwdGVyLT5yZWdzICsgTUFDX1JFR19JREhJKG1hYy0+aW5zdGFuY2UtPmluZGV4KSk7CisJfQorCisJKHZvaWQpIG1hY19zZXRfbXR1KG1hYywgMTUwMCk7CisJcmV0dXJuIG1hYzsKK30KKworc3RydWN0IGdtYWMgdDFfY2hlbHNpb19tYWNfb3BzID0geworCS5jcmVhdGUgPSBtYWNfY3JlYXRlCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4ZTF4eHguYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OGUxeHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhYzkzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OGUxeHh4LmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qICREYXRlOiAyMDA1LzEwLzI0IDIzOjE4OjEzICQgJFJDU2ZpbGU6IG12ODhlMXh4eC5jLHYgJCAkUmV2aXNpb246IDEuNDkgJCAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIm12ODhlMXh4eC5oIgorI2luY2x1ZGUgImNwaHkuaCIKKyNpbmNsdWRlICJlbG1lcjAuaCIKKworLyogTVY4OEUxWFhYIE1ESSBjcm9zc292ZXIgcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lIENST1NTT1ZFUl9NREkgICAwCisjZGVmaW5lIENST1NTT1ZFUl9NRElYICAxCisjZGVmaW5lIENST1NTT1ZFUl9BVVRPICAzCisKKyNkZWZpbmUgSU5UUl9FTkFCTEVfTUFTSyAweDZDQTAKKworLyoKKyAqIFNldCB0aGUgYml0cyBnaXZlbiBieSAnYml0dmFsJyBpbiBQSFkgcmVnaXN0ZXIgJ3JlZycuCisgKi8KK3N0YXRpYyB2b2lkIG1kaW9fc2V0X2JpdChzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IHJlZywgdTMyIGJpdHZhbCkKK3sKKwl1MzIgdmFsOworCisJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgcmVnLCAmdmFsKTsKKwkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUoY3BoeSwgcmVnLCB2YWwgfCBiaXR2YWwpOworfQorCisvKgorICogQ2xlYXIgdGhlIGJpdHMgZ2l2ZW4gYnkgJ2JpdHZhbCcgaW4gUEhZIHJlZ2lzdGVyICdyZWcnLgorICovCitzdGF0aWMgdm9pZCBtZGlvX2NsZWFyX2JpdChzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IHJlZywgdTMyIGJpdHZhbCkKK3sKKwl1MzIgdmFsOworCisJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgcmVnLCAmdmFsKTsKKwkodm9pZCkgc2ltcGxlX21kaW9fd3JpdGUoY3BoeSwgcmVnLCB2YWwgJiB+Yml0dmFsKTsKK30KKworLyoKKyAqIE5BTUU6ICAgcGh5X3Jlc2V0CisgKgorICogREVTQzogICBSZXNldCB0aGUgZ2l2ZW4gUEhZJ3MgcG9ydC4gTk9URTogVGhpcyBpcyBub3QgYSBnbG9iYWwKKyAqICAgICAgICAgY2hpcCByZXNldC4KKyAqCisgKiBQQVJBTVM6IGNwaHkgICAgIC0gUG9pbnRlciB0byBQSFkgaW5zdGFuY2UgZGF0YS4KKyAqCisgKiBSRVRVUk46ICAwIC0gU3VjY2Vzc2Z1bGwgcmVzZXQuCisgKiAgICAgICAgIC0xIC0gVGltZW91dC4KKyAqLworc3RhdGljIGludCBtdjg4ZTF4eHhfcmVzZXQoc3RydWN0IGNwaHkgKmNwaHksIGludCB3YWl0KQoreworCXUzMiBjdGw7CisJaW50IHRpbWVfb3V0ID0gMTAwMDsKKworCW1kaW9fc2V0X2JpdChjcGh5LCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisKKwlkbyB7CisJCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9CTUNSLCAmY3RsKTsKKwkJY3RsICY9IEJNQ1JfUkVTRVQ7CisJCWlmIChjdGwpCisJCQl1ZGVsYXkoMSk7CisJfSB3aGlsZSAoY3RsICYmIC0tdGltZV9vdXQpOworCisJcmV0dXJuIGN0bCA/IC0xIDogMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwkvKiBFbmFibGUgUEhZIGludGVycnVwdHMuICovCisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksIE1WODhFMVhYWF9JTlRFUlJVUFRfRU5BQkxFX1JFR0lTVEVSLAorCQkgICBJTlRSX0VOQUJMRV9NQVNLKTsKKworCS8qIEVuYWJsZSBNYXJ2ZWxsIGludGVycnVwdHMgdGhyb3VnaCBFbG1lcjAuICovCisJaWYgKHQxX2lzX2FzaWMoY3BoeS0+YWRhcHRlcikpIHsKKwkJdTMyIGVsbWVyOworCisJCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7CisJCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQxOworCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpIHsKKwkJICAgIGVsbWVyIHw9IEVMTUVSMF9HUF9CSVQyfEVMTUVSMF9HUF9CSVQzfEVMTUVSMF9HUF9CSVQ0OworICAgICAgICAgICAgICAgIH0KKwkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2ludGVycnVwdF9kaXNhYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCS8qIERpc2FibGUgYWxsIHBoeSBpbnRlcnJ1cHRzLiAqLworCSh2b2lkKSBzaW1wbGVfbWRpb193cml0ZShjcGh5LCBNVjg4RTFYWFhfSU5URVJSVVBUX0VOQUJMRV9SRUdJU1RFUiwgMCk7CisKKwkvKiBEaXNhYmxlIE1hcnZlbGwgaW50ZXJydXB0cyB0aHJvdWdoIEVsbWVyMC4gKi8KKwlpZiAodDFfaXNfYXNpYyhjcGh5LT5hZGFwdGVyKSkgeworCQl1MzIgZWxtZXI7CisKKwkJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgJmVsbWVyKTsKKwkJZWxtZXIgJj0gfkVMTUVSMF9HUF9CSVQxOworCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpIHsKKwkJICAgIGVsbWVyICY9IH4oRUxNRVIwX0dQX0JJVDJ8RUxNRVIwX0dQX0JJVDN8RUxNRVIwX0dQX0JJVDQpOworICAgICAgICAgICAgICAgIH0KKwkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2ludGVycnVwdF9jbGVhcihzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwl1MzIgZWxtZXI7CisKKwkvKiBDbGVhciBQSFkgaW50ZXJydXB0cyBieSByZWFkaW5nIHRoZSByZWdpc3Rlci4gKi8KKwkodm9pZCkgc2ltcGxlX21kaW9fcmVhZChjcGh5LAorCQkJTVY4OEUxWFhYX0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIsICZlbG1lcik7CisKKwkvKiBDbGVhciBNYXJ2ZWxsIGludGVycnVwdHMgdGhyb3VnaCBFbG1lcjAuICovCisJaWYgKHQxX2lzX2FzaWMoY3BoeS0+YWRhcHRlcikpIHsKKwkJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0NBVVNFLCAmZWxtZXIpOworCQllbG1lciB8PSBFTE1FUjBfR1BfQklUMTsKKwkJaWYgKGlzX1QyKGNwaHktPmFkYXB0ZXIpKSB7CisJCSAgICBlbG1lciB8PSBFTE1FUjBfR1BfQklUMnxFTE1FUjBfR1BfQklUM3xFTE1FUjBfR1BfQklUNDsKKyAgICAgICAgICAgICAgICB9CisJCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsIGVsbWVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdGhlIFBIWSBzcGVlZCBhbmQgZHVwbGV4LiAgVGhpcyBhbHNvIGRpc2FibGVzIGF1dG8tbmVnb3RpYXRpb24sIGV4Y2VwdAorICogZm9yIDFHYi9zLCB3aGVyZSBhdXRvLW5lZ290aWF0aW9uIGlzIG1hbmRhdG9yeS4KKyAqLworc3RhdGljIGludCBtdjg4ZTF4eHhfc2V0X3NwZWVkX2R1cGxleChzdHJ1Y3QgY3BoeSAqcGh5LCBpbnQgc3BlZWQsIGludCBkdXBsZXgpCit7CisJdTMyIGN0bDsKKworCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKHBoeSwgTUlJX0JNQ1IsICZjdGwpOworCWlmIChzcGVlZCA+PSAwKSB7CisJCWN0bCAmPSB+KEJNQ1JfU1BFRUQxMDAgfCBCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfQU5FTkFCTEUpOworCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJY3RsIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCQljdGwgfD0gQk1DUl9TUEVFRDEwMDA7CisJfQorCWlmIChkdXBsZXggPj0gMCkgeworCQljdGwgJj0gfihCTUNSX0ZVTExEUExYIHwgQk1DUl9BTkVOQUJMRSk7CisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQljdGwgfD0gQk1DUl9GVUxMRFBMWDsKKwl9CisJaWYgKGN0bCAmIEJNQ1JfU1BFRUQxMDAwKSAgLyogYXV0by1uZWdvdGlhdGlvbiByZXF1aXJlZCBmb3IgMUdiL3MgKi8KKwkJY3RsIHw9IEJNQ1JfQU5FTkFCTEU7CisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2Nyb3Nzb3Zlcl9zZXQoc3RydWN0IGNwaHkgKmNwaHksIGludCBjcm9zc292ZXIpCit7CisJdTMyIGRhdGEzMjsKKworCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKGNwaHksCisJCQlNVjg4RTFYWFhfU1BFQ0lGSUNfQ05UUkxfUkVHSVNURVIsICZkYXRhMzIpOworCWRhdGEzMiAmPSB+Vl9QU0NSX01ESV9YT1ZFUl9NT0RFKE1fUFNDUl9NRElfWE9WRVJfTU9ERSk7CisJZGF0YTMyIHw9IFZfUFNDUl9NRElfWE9WRVJfTU9ERShjcm9zc292ZXIpOworCSh2b2lkKSBzaW1wbGVfbWRpb193cml0ZShjcGh5LAorCQkJTVY4OEUxWFhYX1NQRUNJRklDX0NOVFJMX1JFR0lTVEVSLCBkYXRhMzIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ODhlMXh4eF9hdXRvbmVnX2VuYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwl1MzIgY3RsOworCisJKHZvaWQpIG12ODhlMXh4eF9jcm9zc292ZXJfc2V0KGNwaHksIENST1NTT1ZFUl9BVVRPKTsKKworCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9CTUNSLCAmY3RsKTsKKwkvKiByZXN0YXJ0IGF1dG9uZWcgZm9yIGNoYW5nZSB0byB0YWtlIGVmZmVjdCAqLworCWN0bCB8PSBCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQ7CisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksIE1JSV9CTUNSLCBjdGwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ODhlMXh4eF9hdXRvbmVnX2Rpc2FibGUoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJdTMyIGN0bDsKKworCS8qCisJICogQ3Jvc3NvdmVyICptdXN0KiBiZSBzZXQgdG8gbWFudWFsIGluIG9yZGVyIHRvIGRpc2FibGUgYXV0by1uZWcuCisJICogVGhlIEFsYXNrYSBGQVFzIGRvY3VtZW50IGhpZ2hsaWdodHMgdGhpcyBwb2ludC4KKwkgKi8KKwkodm9pZCkgbXY4OGUxeHh4X2Nyb3Nzb3Zlcl9zZXQoY3BoeSwgQ1JPU1NPVkVSX01ESSk7CisKKwkvKgorCSAqIE11c3QgaW5jbHVkZSBhdXRvbmVnIHJlc2V0IHdoZW4gZGlzYWJsaW5nIGF1dG8tbmVnLiBUaGlzCisJICogaXMgZGVzY3JpYmVkIGluIHRoZSBBbGFza2EgRkFRIGRvY3VtZW50LgorCSAqLworCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9CTUNSLCAmY3RsKTsKKwljdGwgJj0gfkJNQ1JfQU5FTkFCTEU7CisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksIE1JSV9CTUNSLCBjdGwgfCBCTUNSX0FOUkVTVEFSVCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2F1dG9uZWdfcmVzdGFydChzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwltZGlvX3NldF9iaXQoY3BoeSwgTUlJX0JNQ1IsIEJNQ1JfQU5SRVNUQVJUKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfYWR2ZXJ0aXNlKHN0cnVjdCBjcGh5ICpwaHksIHVuc2lnbmVkIGludCBhZHZlcnRpc2VfbWFwKQoreworCXUzMiB2YWwgPSAwOworCisJaWYgKGFkdmVydGlzZV9tYXAgJgorCSAgICAoQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpKSB7CisJCSh2b2lkKSBzaW1wbGVfbWRpb19yZWFkKHBoeSwgTUlJX0dCQ1IsICZ2YWwpOworCQl2YWwgJj0gfihHQkNSX0FEVl8xMDAwSEFMRiB8IEdCQ1JfQURWXzEwMDBGVUxMKTsKKwkJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQorCQkJdmFsIHw9IEdCQ1JfQURWXzEwMDBIQUxGOworCQlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCisJCQl2YWwgfD0gR0JDUl9BRFZfMTAwMEZVTEw7CisJfQorCSh2b2lkKSBzaW1wbGVfbWRpb193cml0ZShwaHksIE1JSV9HQkNSLCB2YWwpOworCisJdmFsID0gMTsKKwlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQl2YWwgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQl2YWwgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJdmFsIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChhZHZlcnRpc2VfbWFwICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQl2YWwgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEX1BBVVNFKQorCQl2YWwgfD0gQURWRVJUSVNFX1BBVVNFOworCWlmIChhZHZlcnRpc2VfbWFwICYgQURWRVJUSVNFRF9BU1lNX1BBVVNFKQorCQl2YWwgfD0gQURWRVJUSVNFX1BBVVNFX0FTWU07CisJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKHBoeSwgTUlJX0FEVkVSVElTRSwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfc2V0X2xvb3BiYWNrKHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgb24pCit7CisJaWYgKG9uKQorCQltZGlvX3NldF9iaXQoY3BoeSwgTUlJX0JNQ1IsIEJNQ1JfTE9PUEJBQ0spOworCWVsc2UKKwkJbWRpb19jbGVhcl9iaXQoY3BoeSwgTUlJX0JNQ1IsIEJNQ1JfTE9PUEJBQ0spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ODhlMXh4eF9nZXRfbGlua19zdGF0dXMoc3RydWN0IGNwaHkgKmNwaHksIGludCAqbGlua19vaywKKwkJCQkgICAgIGludCAqc3BlZWQsIGludCAqZHVwbGV4LCBpbnQgKmZjKQoreworCXUzMiBzdGF0dXM7CisJaW50IHNwID0gLTEsIGRwbHggPSAtMSwgcGF1c2UgPSAwOworCisJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwKKwkJCU1WODhFMVhYWF9TUEVDSUZJQ19TVEFUVVNfUkVHSVNURVIsICZzdGF0dXMpOworCWlmICgoc3RhdHVzICYgVl9QU1NSX1NUQVRVU19SRVNPTFZFRCkgIT0gMCkgeworCQlpZiAoc3RhdHVzICYgVl9QU1NSX1JYX1BBVVNFKQorCQkJcGF1c2UgfD0gUEFVU0VfUlg7CisJCWlmIChzdGF0dXMgJiBWX1BTU1JfVFhfUEFVU0UpCisJCQlwYXVzZSB8PSBQQVVTRV9UWDsKKwkJZHBseCA9IChzdGF0dXMgJiBWX1BTU1JfRFVQTEVYKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCXNwID0gR19QU1NSX1NQRUVEKHN0YXR1cyk7CisJCWlmIChzcCA9PSAwKQorCQkJc3AgPSBTUEVFRF8xMDsKKwkJZWxzZSBpZiAoc3AgPT0gMSkKKwkJCXNwID0gU1BFRURfMTAwOworCQllbHNlCisJCQlzcCA9IFNQRUVEXzEwMDA7CisJfQorCWlmIChsaW5rX29rKQorCQkqbGlua19vayA9IChzdGF0dXMgJiBWX1BTU1JfTElOSykgIT0gMDsKKwlpZiAoc3BlZWQpCisJCSpzcGVlZCA9IHNwOworCWlmIChkdXBsZXgpCisJCSpkdXBsZXggPSBkcGx4OworCWlmIChmYykKKwkJKmZjID0gcGF1c2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2Rvd25zaGlmdF9zZXQoc3RydWN0IGNwaHkgKmNwaHksIGludCBkb3duc2hpZnRfZW5hYmxlKQoreworCXUzMiB2YWw7CisKKwkodm9pZCkgc2ltcGxlX21kaW9fcmVhZChjcGh5LAorCQlNVjg4RTFYWFhfRVhUX1BIWV9TUEVDSUZJQ19DTlRSTF9SRUdJU1RFUiwgJnZhbCk7CisKKwkvKgorCSAqIFNldCB0aGUgZG93bnNoaWZ0IGNvdW50ZXIgdG8gMiBzbyB3ZSB0cnkgdG8gZXN0YWJsaXNoIEdiIGxpbmsKKwkgKiB0d2ljZSBiZWZvcmUgZG93bnNoaWZ0aW5nLgorCSAqLworCXZhbCAmPSB+KFZfRE9XTlNISUZUX0VOQUJMRSB8IFZfRE9XTlNISUZUX0NOVChNX0RPV05TSElGVF9DTlQpKTsKKworCWlmIChkb3duc2hpZnRfZW5hYmxlKQorCQl2YWwgfD0gVl9ET1dOU0hJRlRfRU5BQkxFIHwgVl9ET1dOU0hJRlRfQ05UKDIpOworCSh2b2lkKSBzaW1wbGVfbWRpb193cml0ZShjcGh5LAorCQkJTVY4OEUxWFhYX0VYVF9QSFlfU1BFQ0lGSUNfQ05UUkxfUkVHSVNURVIsIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGUxeHh4X2ludGVycnVwdF9oYW5kbGVyKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCWludCBjcGh5X2NhdXNlID0gMDsKKwl1MzIgc3RhdHVzOworCisJLyoKKwkgKiBMb29wIHVudGlsIGNhdXNlIHJlYWRzIHplcm8uIE5lZWQgdG8gaGFuZGxlIGJvdW5jaW5nIGludGVycnVwdHMuCisgICAgICAgICAqLworCXdoaWxlICgxKSB7CisJCXUzMiBjYXVzZTsKKworCQkodm9pZCkgc2ltcGxlX21kaW9fcmVhZChjcGh5LAorCQkJCU1WODhFMVhYWF9JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSLAorCQkJCSZjYXVzZSk7CisJCWNhdXNlICY9IElOVFJfRU5BQkxFX01BU0s7CisJCWlmICghY2F1c2UpIGJyZWFrOworCisJCWlmIChjYXVzZSAmIE1WODhFMVhYWF9JTlRSX0xJTktfQ0hORykgeworCQkJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwKKwkJCQlNVjg4RTFYWFhfU1BFQ0lGSUNfU1RBVFVTX1JFR0lTVEVSLCAmc3RhdHVzKTsKKworCQkJaWYgKHN0YXR1cyAmIE1WODhFMVhYWF9JTlRSX0xJTktfQ0hORykgeworCQkJCWNwaHktPnN0YXRlIHw9IFBIWV9MSU5LX1VQOworCQkJfSBlbHNlIHsKKwkJCQljcGh5LT5zdGF0ZSAmPSB+UEhZX0xJTktfVVA7CisJCQkJaWYgKGNwaHktPnN0YXRlICYgUEhZX0FVVE9ORUdfRU4pCisJCQkJCWNwaHktPnN0YXRlICY9IH5QSFlfQVVUT05FR19SRFk7CisJCQkJY3BoeV9jYXVzZSB8PSBjcGh5X2NhdXNlX2xpbmtfY2hhbmdlOworCQkJfQorCQl9CisKKwkJaWYgKGNhdXNlICYgTVY4OEUxWFhYX0lOVFJfQVVUT05FR19ET05FKQorCQkJY3BoeS0+c3RhdGUgfD0gUEhZX0FVVE9ORUdfUkRZOworCisJCWlmICgoY3BoeS0+c3RhdGUgJiAoUEhZX0xJTktfVVAgfCBQSFlfQVVUT05FR19SRFkpKSA9PQorCQkJKFBIWV9MSU5LX1VQIHwgUEhZX0FVVE9ORUdfUkRZKSkKKwkJCQljcGh5X2NhdXNlIHw9IGNwaHlfY2F1c2VfbGlua19jaGFuZ2U7CisJfQorCXJldHVybiBjcGh5X2NhdXNlOworfQorCitzdGF0aWMgdm9pZCBtdjg4ZTF4eHhfZGVzdHJveShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwlrZnJlZShjcGh5KTsKK30KKworc3RhdGljIHN0cnVjdCBjcGh5X29wcyBtdjg4ZTF4eHhfb3BzID0geworCS5kZXN0cm95ICAgICAgICAgICAgICA9IG12ODhlMXh4eF9kZXN0cm95LAorCS5yZXNldCAgICAgICAgICAgICAgICA9IG12ODhlMXh4eF9yZXNldCwKKwkuaW50ZXJydXB0X2VuYWJsZSAgICAgPSBtdjg4ZTF4eHhfaW50ZXJydXB0X2VuYWJsZSwKKwkuaW50ZXJydXB0X2Rpc2FibGUgICAgPSBtdjg4ZTF4eHhfaW50ZXJydXB0X2Rpc2FibGUsCisJLmludGVycnVwdF9jbGVhciAgICAgID0gbXY4OGUxeHh4X2ludGVycnVwdF9jbGVhciwKKwkuaW50ZXJydXB0X2hhbmRsZXIgICAgPSBtdjg4ZTF4eHhfaW50ZXJydXB0X2hhbmRsZXIsCisJLmF1dG9uZWdfZW5hYmxlICAgICAgID0gbXY4OGUxeHh4X2F1dG9uZWdfZW5hYmxlLAorCS5hdXRvbmVnX2Rpc2FibGUgICAgICA9IG12ODhlMXh4eF9hdXRvbmVnX2Rpc2FibGUsCisJLmF1dG9uZWdfcmVzdGFydCAgICAgID0gbXY4OGUxeHh4X2F1dG9uZWdfcmVzdGFydCwKKwkuYWR2ZXJ0aXNlICAgICAgICAgICAgPSBtdjg4ZTF4eHhfYWR2ZXJ0aXNlLAorCS5zZXRfbG9vcGJhY2sgICAgICAgICA9IG12ODhlMXh4eF9zZXRfbG9vcGJhY2ssCisJLnNldF9zcGVlZF9kdXBsZXggICAgID0gbXY4OGUxeHh4X3NldF9zcGVlZF9kdXBsZXgsCisJLmdldF9saW5rX3N0YXR1cyAgICAgID0gbXY4OGUxeHh4X2dldF9saW5rX3N0YXR1cywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeSAqbXY4OGUxeHh4X3BoeV9jcmVhdGUoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsCisJCQkJCSBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQoreworCXN0cnVjdCBjcGh5ICpjcGh5ID0ga3phbGxvYyhzaXplb2YoKmNwaHkpLCBHRlBfS0VSTkVMKTsKKworCWlmICghY3BoeSkgcmV0dXJuIE5VTEw7CisKKwljcGh5X2luaXQoY3BoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZtdjg4ZTF4eHhfb3BzLCBtZGlvX29wcyk7CisKKwkvKiBDb25maWd1cmUgcGFydGljdWxhciBQSFkncyB0byBydW4gaW4gYSBkaWZmZXJlbnQgbW9kZS4gKi8KKwlpZiAoKGJvYXJkX2luZm8oYWRhcHRlciktPmNhcHMgJiBTVVBQT1JURURfVFApICYmCisJICAgIGJvYXJkX2luZm8oYWRhcHRlciktPmNoaXBfcGh5ID09IENIQlRfUEhZXzg4RTExMTEpIHsKKwkJLyoKKwkJICogQ29uZmlndXJlIHRoZSBQSFkgdHJhbnNtaXR0ZXIgYXMgY2xhc3MgQSB0byByZWR1Y2UgRU1JLgorCQkgKi8KKwkJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksCisJCQkJTVY4OEUxWFhYX0VYVEVOREVEX0FERFJfUkVHSVNURVIsIDB4Qik7CisJCSh2b2lkKSBzaW1wbGVfbWRpb193cml0ZShjcGh5LAorCQkJCU1WODhFMVhYWF9FWFRFTkRFRF9SRUdJU1RFUiwgMHg4MDA0KTsKKwl9CisJKHZvaWQpIG12ODhlMXh4eF9kb3duc2hpZnRfc2V0KGNwaHksIDEpOyAgIC8qIEVuYWJsZSBkb3duc2hpZnQgKi8KKworICAgICAgICAvKiBMRUQgKi8KKwlpZiAoaXNfVDIoYWRhcHRlcikpIHsKKwkJKHZvaWQpIHNpbXBsZV9tZGlvX3dyaXRlKGNwaHksCisJCQkJTVY4OEUxWFhYX0xFRF9DT05UUk9MX1JFR0lTVEVSLCAweDEpOworICAgICAgICB9CisKKwlyZXR1cm4gY3BoeTsKK30KKworc3RhdGljIGludCBtdjg4ZTF4eHhfcGh5X3Jlc2V0KGFkYXB0ZXJfdCogYWRhcHRlcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdwaHkgdDFfbXY4OGUxeHh4X29wcyA9IHsKKwltdjg4ZTF4eHhfcGh5X2NyZWF0ZSwKKwltdjg4ZTF4eHhfcGh5X3Jlc2V0Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4ZTF4eHguaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OGUxeHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3Y2M0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OGUxeHh4LmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qICREYXRlOiAyMDA1LzAzLzA3IDIzOjU5OjA1ICQgJFJDU2ZpbGU6IG12ODhlMXh4eC5oLHYgJCAkUmV2aXNpb246IDEuMTMgJCAqLworI2lmbmRlZiBDSEVMU0lPX01WOEUxWFhYX0gKKyNkZWZpbmUgQ0hFTFNJT19NVjhFMVhYWF9ICisKKyNpZm5kZWYgQk1DUl9TUEVFRDEwMDAKKyMgZGVmaW5lIEJNQ1JfU1BFRUQxMDAwIDB4NDAKKyNlbmRpZgorCisjaWZuZGVmIEFEVkVSVElTRV9QQVVTRQorIyBkZWZpbmUgQURWRVJUSVNFX1BBVVNFIDB4NDAwCisjZW5kaWYKKyNpZm5kZWYgQURWRVJUSVNFX1BBVVNFX0FTWU0KKyMgZGVmaW5lIEFEVkVSVElTRV9QQVVTRV9BU1lNIDB4ODAwCisjZW5kaWYKKworLyogR2lnYWJpdCBNSUkgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1JSV9HQkNSIDkgICAgICAgLyogMTAwMEJhc2UtVCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9HQlNSIDEwICAgICAgLyogMTAwMEJhc2UtVCBzdGF0dXMgcmVnaXN0ZXIgKi8KKworLyogMTAwMEJhc2UtVCBjb250cm9sIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBHQkNSX0FEVl8xMDAwSEFMRiAgICAgICAgIDB4MTAwCisjZGVmaW5lIEdCQ1JfQURWXzEwMDBGVUxMICAgICAgICAgMHgyMDAKKyNkZWZpbmUgR0JDUl9QUkVGRVJfTUFTVEVSICAgICAgICAweDQwMAorI2RlZmluZSBHQkNSX01BTlVBTF9BU19NQVNURVIgICAgIDB4ODAwCisjZGVmaW5lIEdCQ1JfTUFOVUFMX0NPTkZJR19FTkFCTEUgMHgxMDAwCisKKy8qIDEwMDBCYXNlLVQgc3RhdHVzIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBHQlNSX0xQXzEwMDBIQUxGICAweDQwMAorI2RlZmluZSBHQlNSX0xQXzEwMDBGVUxMICAweDgwMAorI2RlZmluZSBHQlNSX1JFTU9URV9PSyAgICAweDEwMDAKKyNkZWZpbmUgR0JTUl9MT0NBTF9PSyAgICAgMHgyMDAwCisjZGVmaW5lIEdCU1JfTE9DQUxfTUFTVEVSIDB4NDAwMAorI2RlZmluZSBHQlNSX01BU1RFUl9GQVVMVCAweDgwMDAKKworLyogTWFydmVsbCBQSFkgaW50ZXJydXB0IHN0YXR1cyBiaXRzLiAqLworI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9KQUJCRVIgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX1BPTEFSSVRZX0NITkcgICAweDAwMDIKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfRU5HX0RFVEVDVF9DSE5HIDB4MDAxMAorI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9ET1dOU0hJRlQgICAgICAgMHgwMDIwCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX01ESV9YT1ZFUl9DSE5HICAweDAwNDAKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfRklGT19PVkVSX1VOREVSIDB4MDA4MAorI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9GQUxTRV9DQVJSSUVSICAgMHgwMTAwCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX1NZTUJPTF9FUlJPUiAgICAweDAyMDAKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfTElOS19DSE5HICAgICAgIDB4MDQwMAorI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9BVVRPTkVHX0RPTkUgICAgMHgwODAwCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX1BBR0VfUkVDViAgICAgICAweDEwMDAKKyNkZWZpbmUgTVY4OEUxWFhYX0lOVFJfRFVQTEVYX0NITkcgICAgIDB4MjAwMAorI2RlZmluZSBNVjg4RTFYWFhfSU5UUl9TUEVFRF9DSE5HICAgICAgMHg0MDAwCisjZGVmaW5lIE1WODhFMVhYWF9JTlRSX0FVVE9ORUdfRVJSICAgICAweDgwMDAKKworLyogTWFydmVsbCBQSFkgc3BlY2lmaWMgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBNVjg4RTFYWFhfU1BFQ0lGSUNfQ05UUkxfUkVHSVNURVIgICAgICAgICAgICAgICAxNgorI2RlZmluZSBNVjg4RTFYWFhfU1BFQ0lGSUNfU1RBVFVTX1JFR0lTVEVSICAgICAgICAgICAgICAxNworI2RlZmluZSBNVjg4RTFYWFhfSU5URVJSVVBUX0VOQUJMRV9SRUdJU1RFUiAgICAgICAgICAgICAxOAorI2RlZmluZSBNVjg4RTFYWFhfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUiAgICAgICAgICAgICAxOQorI2RlZmluZSBNVjg4RTFYWFhfRVhUX1BIWV9TUEVDSUZJQ19DTlRSTF9SRUdJU1RFUiAgICAgICAyMAorI2RlZmluZSBNVjg4RTFYWFhfUkVDVl9FUlJfQ05UUl9SRUdJU1RFUiAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBNVjg4RTFYWFhfUkVTX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBNVjg4RTFYWFhfR0xPQkFMX1NUQVRVU19SRUdJU1RFUiAgICAgICAgICAgICAgICAyMworI2RlZmluZSBNVjg4RTFYWFhfTEVEX0NPTlRST0xfUkVHSVNURVIgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBNVjg4RTFYWFhfTUFOVUFMX0xFRF9PVkVSUklERV9SRUdJU1RFUiAgICAgICAgICAyNQorI2RlZmluZSBNVjg4RTFYWFhfRVhUX1BIWV9TUEVDSUZJQ19DTlRSTF8yX1JFR0lTVEVSICAgICAyNgorI2RlZmluZSBNVjg4RTFYWFhfRVhUX1BIWV9TUEVDSUZJQ19TVEFUVVNfUkVHSVNURVIgICAgICAyNworI2RlZmluZSBNVjg4RTFYWFhfVklSVFVBTF9DQUJMRV9URVNURVJfUkVHSVNURVIgICAgICAgICAyOAorI2RlZmluZSBNVjg4RTFYWFhfRVhURU5ERURfQUREUl9SRUdJU1RFUiAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBNVjg4RTFYWFhfRVhURU5ERURfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAzMAorCisvKiBQSFkgc3BlY2lmaWMgY29udHJvbCByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgU19QU0NSX01ESV9YT1ZFUl9NT0RFICAgIDUKKyNkZWZpbmUgTV9QU0NSX01ESV9YT1ZFUl9NT0RFICAgIDB4MworI2RlZmluZSBWX1BTQ1JfTURJX1hPVkVSX01PREUoeCkgKCh4KSA8PCBTX1BTQ1JfTURJX1hPVkVSX01PREUpCisjZGVmaW5lIEdfUFNDUl9NRElfWE9WRVJfTU9ERSh4KSAoKCh4KSA+PiBTX1BTQ1JfTURJX1hPVkVSX01PREUpICYgTV9QU0NSX01ESV9YT1ZFUl9NT0RFKQorCisvKiBFeHRlbmRlZCBQSFkgc3BlY2lmaWMgY29udHJvbCByZWdpc3RlciBmaWVsZHMgKi8KKyNkZWZpbmUgU19ET1dOU0hJRlRfRU5BQkxFIDgKKyNkZWZpbmUgVl9ET1dOU0hJRlRfRU5BQkxFICgxIDw8IFNfRE9XTlNISUZUX0VOQUJMRSkKKworI2RlZmluZSBTX0RPV05TSElGVF9DTlQgICAgOQorI2RlZmluZSBNX0RPV05TSElGVF9DTlQgICAgMHg3CisjZGVmaW5lIFZfRE9XTlNISUZUX0NOVCh4KSAoKHgpIDw8IFNfRE9XTlNISUZUX0NOVCkKKyNkZWZpbmUgR19ET1dOU0hJRlRfQ05UKHgpICgoKHgpID4+IFNfRE9XTlNISUZUX0NOVCkgJiBNX0RPV05TSElGVF9DTlQpCisKKy8qIFBIWSBzcGVjaWZpYyBzdGF0dXMgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIFNfUFNTUl9KQUJCRVIgMAorI2RlZmluZSBWX1BTU1JfSkFCQkVSICgxIDw8IFNfUFNTUl9KQUJCRVIpCisKKyNkZWZpbmUgU19QU1NSX1BPTEFSSVRZIDEKKyNkZWZpbmUgVl9QU1NSX1BPTEFSSVRZICgxIDw8IFNfUFNTUl9QT0xBUklUWSkKKworI2RlZmluZSBTX1BTU1JfUlhfUEFVU0UgMgorI2RlZmluZSBWX1BTU1JfUlhfUEFVU0UgKDEgPDwgU19QU1NSX1JYX1BBVVNFKQorCisjZGVmaW5lIFNfUFNTUl9UWF9QQVVTRSAzCisjZGVmaW5lIFZfUFNTUl9UWF9QQVVTRSAoMSA8PCBTX1BTU1JfVFhfUEFVU0UpCisKKyNkZWZpbmUgU19QU1NSX0VORVJHWV9ERVRFQ1QgNAorI2RlZmluZSBWX1BTU1JfRU5FUkdZX0RFVEVDVCAoMSA8PCBTX1BTU1JfRU5FUkdZX0RFVEVDVCkKKworI2RlZmluZSBTX1BTU1JfRE9XTlNISUZUX1NUQVRVUyA1CisjZGVmaW5lIFZfUFNTUl9ET1dOU0hJRlRfU1RBVFVTICgxIDw8IFNfUFNTUl9ET1dOU0hJRlRfU1RBVFVTKQorCisjZGVmaW5lIFNfUFNTUl9NREkgNgorI2RlZmluZSBWX1BTU1JfTURJICgxIDw8IFNfUFNTUl9NREkpCisKKyNkZWZpbmUgU19QU1NSX0NBQkxFX0xFTiAgICA3CisjZGVmaW5lIE1fUFNTUl9DQUJMRV9MRU4gICAgMHg3CisjZGVmaW5lIFZfUFNTUl9DQUJMRV9MRU4oeCkgKCh4KSA8PCBTX1BTU1JfQ0FCTEVfTEVOKQorI2RlZmluZSBHX1BTU1JfQ0FCTEVfTEVOKHgpICgoKHgpID4+IFNfUFNTUl9DQUJMRV9MRU4pICYgTV9QU1NSX0NBQkxFX0xFTikKKworI2RlZmluZSBTX1BTU1JfTElOSyAxMAorI2RlZmluZSBWX1BTU1JfTElOSyAoMSA8PCBTX1BTU1JfTElOSykKKworI2RlZmluZSBTX1BTU1JfU1RBVFVTX1JFU09MVkVEIDExCisjZGVmaW5lIFZfUFNTUl9TVEFUVVNfUkVTT0xWRUQgKDEgPDwgU19QU1NSX1NUQVRVU19SRVNPTFZFRCkKKworI2RlZmluZSBTX1BTU1JfUEFHRV9SRUNFSVZFRCAxMgorI2RlZmluZSBWX1BTU1JfUEFHRV9SRUNFSVZFRCAoMSA8PCBTX1BTU1JfUEFHRV9SRUNFSVZFRCkKKworI2RlZmluZSBTX1BTU1JfRFVQTEVYIDEzCisjZGVmaW5lIFZfUFNTUl9EVVBMRVggKDEgPDwgU19QU1NSX0RVUExFWCkKKworI2RlZmluZSBTX1BTU1JfU1BFRUQgICAgMTQKKyNkZWZpbmUgTV9QU1NSX1NQRUVEICAgIDB4MworI2RlZmluZSBWX1BTU1JfU1BFRUQoeCkgKCh4KSA8PCBTX1BTU1JfU1BFRUQpCisjZGVmaW5lIEdfUFNTUl9TUEVFRCh4KSAoKCh4KSA+PiBTX1BTU1JfU1BFRUQpICYgTV9QU1NSX1NQRUVEKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OHgyMDF4LmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL212ODh4MjAxeC5jCmluZGV4IGRiNTAzNDI4Li5jOGU4OTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL212ODh4MjAxeC5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OHgyMDF4LmMKQEAgLTg1LDI5ICs4NSwzMyBAQAogCiBzdGF0aWMgaW50IG12ODh4MjAxeF9pbnRlcnJ1cHRfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQogewotCXUzMiBlbG1lcjsKLQogCS8qIEVuYWJsZSBQSFkgTEFTSSBpbnRlcnJ1cHRzLiAqLwogCW1kaW9fd3JpdGUoY3BoeSwgMHgxLCAweDkwMDIsIDB4MSk7CiAKIAkvKiBFbmFibGUgTWFydmVsbCBpbnRlcnJ1cHRzIHRocm91Z2ggRWxtZXIwLiAqLwotCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7Ci0JZWxtZXIgfD0gRUxNRVIwX0dQX0JJVDY7Ci0JdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKKwlpZiAodDFfaXNfYXNpYyhjcGh5LT5hZGFwdGVyKSkgeworCQl1MzIgZWxtZXI7CisKKwkJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgJmVsbWVyKTsKKwkJZWxtZXIgfD0gRUxNRVIwX0dQX0JJVDY7CisJCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCBlbG1lcik7CisJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG12ODh4MjAxeF9pbnRlcnJ1cHRfZGlzYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKIHsKLQl1MzIgZWxtZXI7Ci0KIAkvKiBEaXNhYmxlIFBIWSBMQVNJIGludGVycnVwdHMuICovCiAJbWRpb193cml0ZShjcGh5LCAweDEsIDB4OTAwMiwgMHgwKTsKIAogCS8qIERpc2FibGUgTWFydmVsbCBpbnRlcnJ1cHRzIHRocm91Z2ggRWxtZXIwLiAqLwotCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7Ci0JZWxtZXIgJj0gfkVMTUVSMF9HUF9CSVQ2OwotCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCBlbG1lcik7CisJaWYgKHQxX2lzX2FzaWMoY3BoeS0+YWRhcHRlcikpIHsKKwkJdTMyIGVsbWVyOworCisJCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7CisJCWVsbWVyICY9IH5FTE1FUjBfR1BfQklUNjsKKwkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MCw5ICsxNDQsMTEgQEAKICNlbmRpZgogCiAJLyogQ2xlYXIgTWFydmVsbCBpbnRlcnJ1cHRzIHRocm91Z2ggRWxtZXIwLiAqLwotCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgJmVsbWVyKTsKLQllbG1lciB8PSBFTE1FUjBfR1BfQklUNjsKLQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0NBVVNFLCBlbG1lcik7CisJaWYgKHQxX2lzX2FzaWMoY3BoeS0+YWRhcHRlcikpIHsKKwkJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0NBVVNFLCAmZWxtZXIpOworCQllbG1lciB8PSBFTE1FUjBfR1BfQklUNjsKKwkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgZWxtZXIpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA1LDExICsyMTEsMTEgQEAKIAkJCQkJIHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCiB7CiAJdTMyIHZhbDsKLQlzdHJ1Y3QgY3BoeSAqY3BoeSA9IGttYWxsb2Moc2l6ZW9mKCpjcGh5KSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IGNwaHkgKmNwaHkgPSBremFsbG9jKHNpemVvZigqY3BoeSksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFjcGh5KQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoY3BoeSwgMCwgc2l6ZW9mKCpjcGh5KSk7CisKIAljcGh5X2luaXQoY3BoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZtdjg4eDIwMXhfb3BzLCBtZGlvX29wcyk7CiAKIAkvKiBDb21tYW5kcyB0aGUgUEhZIHRvIGVuYWJsZSBYRlAncyBjbG9jay4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXkzMTI2LmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL215MzEyNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NzMxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL215MzEyNi5jCkBAIC0wLDAgKzEsMjA2IEBACisvKiAkRGF0ZTogMjAwNS8xMS8xMiAwMjoxMzo0OSAkICRSQ1NmaWxlOiBteTMxMjYuYyx2ICQgJFJldmlzaW9uOiAxLjE1ICQgKi8KKyNpbmNsdWRlICJjcGh5LmgiCisjaW5jbHVkZSAiZWxtZXIwLmgiCisjaW5jbHVkZSAic3VuaTF4MTBnZXhwX3JlZ3MuaCIKKworLyogUG9ydCBSZXNldCAqLworc3RhdGljIGludCBteTMxMjZfcmVzZXQoc3RydWN0IGNwaHkgKmNwaHksIGludCB3YWl0KQoreworCS8qCisJICogVGhpcyBjYW4gYmUgZG9uZSB0aHJvdWdoIHJlZ2lzdGVycy4gIEl0IGlzIG5vdCByZXF1aXJlZCBzaW5jZQorCSAqIGEgZnVsbCBjaGlwIHJlc2V0IGlzIHVzZWQuCisJICovCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBteTMxMjZfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNwaHktPnBoeV91cGRhdGUsIEhaLzMwKTsKKwl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZjcGh5LT5lbG1lcl9ncG8pOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbXkzMTI2X2ludGVycnVwdF9kaXNhYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmNwaHktPnBoeV91cGRhdGUpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgbXkzMTI2X2ludGVycnVwdF9jbGVhcihzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwlyZXR1cm4gKDApOworfQorCisjZGVmaW5lIE9GRlNFVChSRUdfQUREUikgICAgKFJFR19BRERSIDw8IDIpCisKK3N0YXRpYyBpbnQgbXkzMTI2X2ludGVycnVwdF9oYW5kbGVyKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXUzMiB2YWw7CisJdTE2IHZhbDE2OworCXUxNiBzdGF0dXM7CisJdTMyIGFjdF9jb3VudDsKKwlhZGFwdGVyX3QgKmFkYXB0ZXI7CisJYWRhcHRlciA9IGNwaHktPmFkYXB0ZXI7CisKKwlpZiAoY3BoeS0+Y291bnQgPT0gNTApIHsKKwkJbWRpb19yZWFkKGNwaHksIDB4MSwgMHgxLCAmdmFsKTsKKwkJdmFsMTYgPSAodTE2KSB2YWw7CisJCXN0YXR1cyA9IGNwaHktPmJtc3IgXiB2YWwxNjsKKworCQlpZiAoc3RhdHVzICYgQk1TUl9MU1RBVFVTKQorCQkJdDFfbGlua19jaGFuZ2VkKGFkYXB0ZXIsIDApOworCQljcGh5LT5ibXNyID0gdmFsMTY7CisKKwkJLyogV2UgaGF2ZSBvbmx5IGVuYWJsZWQgbGluayBjaGFuZ2UgaW50ZXJydXB0cyBzbyBpdAorCQkgICBtdXN0IGJlIHRoYXQKKwkJICovCisJCWNwaHktPmNvdW50ID0gMDsKKwl9CisKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgT0ZGU0VUKFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09OVFJPTCksCisJCVNVTkkxeDEwR0VYUF9CSVRNU0tfTVNUQVRfU05BUCk7CisJdDFfdHBpX3JlYWQoYWRhcHRlciwKKwkJT0ZGU0VUKFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8xX0xPVyksICZhY3RfY291bnQpOworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsCisJCU9GRlNFVChTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMzNfTE9XKSwgJnZhbCk7CisJYWN0X2NvdW50ICs9IHZhbDsKKworCS8qIFBvcHVsYXRlIGVsbWVyX2dwbyB3aXRoIHRoZSByZWdpc3RlciB2YWx1ZSAqLworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisJY3BoeS0+ZWxtZXJfZ3BvID0gdmFsOworCisJaWYgKCAodmFsICYgKDEgPDwgOCkpIHx8ICh2YWwgJiAoMSA8PCAxOSkpIHx8CisJICAgICAoY3BoeS0+YWN0X2NvdW50ID09IGFjdF9jb3VudCkgfHwgY3BoeS0+YWN0X29uICkgeworCQlpZiAoaXNfVDIoYWRhcHRlcikpCisJCQl2YWwgfD0gKDEgPDwgOSk7CisJCWVsc2UgaWYgKHQxX2lzX1QxQihhZGFwdGVyKSkKKwkJCXZhbCB8PSAoMSA8PCAyMCk7CisJCWNwaHktPmFjdF9vbiA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKGlzX1QyKGFkYXB0ZXIpKQorCQkJdmFsICY9IH4oMSA8PCA5KTsKKwkJZWxzZSBpZiAodDFfaXNfVDFCKGFkYXB0ZXIpKQorCQkJdmFsICY9IH4oMSA8PCAyMCk7CisJCWNwaHktPmFjdF9vbiA9IDE7CisJfQorCisJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgdmFsKTsKKworCWNwaHktPmVsbWVyX2dwbyA9IHZhbDsKKwljcGh5LT5hY3RfY291bnQgPSBhY3RfY291bnQ7CisJY3BoeS0+Y291bnQrKzsKKworCXJldHVybiBjcGh5X2NhdXNlX2xpbmtfY2hhbmdlOworfQorCitzdGF0aWMgdm9pZCBteTMyMTZfcG9sbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNwaHkgKmNwaHkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNwaHksIHBoeV91cGRhdGUud29yayk7CisKKwlteTMxMjZfaW50ZXJydXB0X2hhbmRsZXIoY3BoeSk7Cit9CisKK3N0YXRpYyBpbnQgbXkzMTI2X3NldF9sb29wYmFjayhzdHJ1Y3QgY3BoeSAqY3BoeSwgaW50IG9uKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qIFRvIGNoZWNrIHRoZSBhY3Rpdml0eSBMRUQgKi8KK3N0YXRpYyBpbnQgbXkzMTI2X2dldF9saW5rX3N0YXR1cyhzdHJ1Y3QgY3BoeSAqY3BoeSwKKwkJCWludCAqbGlua19vaywgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsIGludCAqZmMpCit7CisJdTMyIHZhbDsKKwl1MTYgdmFsMTY7CisJYWRhcHRlcl90ICphZGFwdGVyOworCisJYWRhcHRlciA9IGNwaHktPmFkYXB0ZXI7CisJbWRpb19yZWFkKGNwaHksIDB4MSwgMHgxLCAmdmFsKTsKKwl2YWwxNiA9ICh1MTYpIHZhbDsKKworCS8qIFBvcHVsYXRlIGVsbWVyX2dwbyB3aXRoIHRoZSByZWdpc3RlciB2YWx1ZSAqLworCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJnZhbCk7CisJY3BoeS0+ZWxtZXJfZ3BvID0gdmFsOworCisJKmxpbmtfb2sgPSAodmFsMTYgJiBCTVNSX0xTVEFUVVMpOworCisJaWYgKCpsaW5rX29rKSB7CisJCS8qIFR1cm4gb24gdGhlIExFRC4gKi8KKwkJaWYgKGlzX1QyKGFkYXB0ZXIpKQorCQkJIHZhbCAmPSB+KDEgPDwgOCk7CisJCWVsc2UgaWYgKHQxX2lzX1QxQihhZGFwdGVyKSkKKwkJCSB2YWwgJj0gfigxIDw8IDE5KTsKKwl9IGVsc2UgeworCQkvKiBUdXJuIG9mZiB0aGUgTEVELiAqLworCQlpZiAoaXNfVDIoYWRhcHRlcikpCisJCQkgdmFsIHw9ICgxIDw8IDgpOworCQllbHNlIGlmICh0MV9pc19UMUIoYWRhcHRlcikpCisJCQkgdmFsIHw9ICgxIDw8IDE5KTsKKwl9CisKKwl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOworCWNwaHktPmVsbWVyX2dwbyA9IHZhbDsKKwkqc3BlZWQgPSBTUEVFRF8xMDAwMDsKKwkqZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisKKwkvKiBuZWVkIHRvIGFkZCBmbG93IGNvbnRyb2wgKi8KKwlpZiAoZmMpCisJCSpmYyA9IFBBVVNFX1JYIHwgUEFVU0VfVFg7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZCBteTMxMjZfZGVzdHJveShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwlrZnJlZShjcGh5KTsKK30KKworc3RhdGljIHN0cnVjdCBjcGh5X29wcyBteTMxMjZfb3BzID0geworCS5kZXN0cm95CQk9IG15MzEyNl9kZXN0cm95LAorCS5yZXNldAkJCT0gbXkzMTI2X3Jlc2V0LAorCS5pbnRlcnJ1cHRfZW5hYmxlCT0gbXkzMTI2X2ludGVycnVwdF9lbmFibGUsCisJLmludGVycnVwdF9kaXNhYmxlCT0gbXkzMTI2X2ludGVycnVwdF9kaXNhYmxlLAorCS5pbnRlcnJ1cHRfY2xlYXIJPSBteTMxMjZfaW50ZXJydXB0X2NsZWFyLAorCS5pbnRlcnJ1cHRfaGFuZGxlcgk9IG15MzEyNl9pbnRlcnJ1cHRfaGFuZGxlciwKKwkuZ2V0X2xpbmtfc3RhdHVzCT0gbXkzMTI2X2dldF9saW5rX3N0YXR1cywKKwkuc2V0X2xvb3BiYWNrCQk9IG15MzEyNl9zZXRfbG9vcGJhY2ssCit9OworCitzdGF0aWMgc3RydWN0IGNwaHkgKm15MzEyNl9waHlfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwKKwkJCWludCBwaHlfYWRkciwgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKK3sKKwlzdHJ1Y3QgY3BoeSAqY3BoeSA9IGt6YWxsb2Moc2l6ZW9mICgqY3BoeSksIEdGUF9LRVJORUwpOworCisJaWYgKGNwaHkpCisJCWNwaHlfaW5pdChjcGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJm15MzEyNl9vcHMsIG1kaW9fb3BzKTsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZjcGh5LT5waHlfdXBkYXRlLCBteTMyMTZfcG9sbCk7CisJY3BoeS0+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+IFNfUENJX01PREVfQ0xLKSAmIE1fUENJX01PREVfQ0xLKQogCiAjZW5kaWYgLyogX0NYR0JfUkVHU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKaW5kZXggOTc5OWMxMi4uNjU5Y2IyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jCkBAIC00MiwxMiArNDIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+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+cmVncyArIEFfU0dfRE9PUkJFTEwpOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKK30KIAogLyoqCiAgKglzZ2VfcnggLSBwcm9jZXNzIGFuIGluZ3Jlc3MgZXRoZXJuZXQgcGFja2V0CkBAIC05NTQsNDEgKzEzODAsNTMgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBjcGxfcnhfcGt0ICpwOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gc2dlLT5hZGFwdGVyOworCXN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqc3Q7CiAKLQlzZ2UtPnN0YXRzLmV0aGVybmV0X3BrdHMrKzsKIAlza2IgPSBnZXRfcGFja2V0KGFkYXB0ZXItPnBkZXYsIGZsLCBsZW4gLSBzZ2UtPnJ4X3BrdF9wYWQsCiAJCQkgc2dlLT5yeF9wa3RfcGFkLCAyLCBTR0VfUlhfQ09QWV9USFJFUywKIAkJCSBTR0VfUlhfRFJPUF9USFJFUyk7Ci0JaWYgKCFza2IpIHsKLQkJc2dlLT5wb3J0X3N0YXRzWzBdLnJ4X2Ryb3BzKys7IC8qIGNoYXJnZSBvbmx5IHBvcnQgMCBmb3Igbm93ICovCisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCXNnZS0+c3RhdHMucnhfZHJvcHMrKzsKIAkJcmV0dXJuIDA7CiAJfQogCiAJcCA9IChzdHJ1Y3QgY3BsX3J4X3BrdCAqKXNrYi0+ZGF0YTsKIAlza2JfcHVsbChza2IsIHNpemVvZigqcCkpOworCWlmIChwLT5pZmYgPj0gYWRhcHRlci0+cGFyYW1zLm5wb3J0cykgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc2tiLT5kZXYgPSBhZGFwdGVyLT5wb3J0W3AtPmlmZl0uZGV2OwogCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlzdCA9IHBlcl9jcHVfcHRyKHNnZS0+cG9ydF9zdGF0c1twLT5pZmZdLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXN0LT5yeF9wYWNrZXRzKys7CisKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CiAJaWYgKChhZGFwdGVyLT5mbGFncyAmIFJYX0NTVU1fRU5BQkxFRCkgJiYgcC0+Y3N1bSA9PSAweGZmZmYgJiYKIAkgICAgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgJiYKIAkgICAgKHNrYi0+ZGF0YVs5XSA9PSBJUFBST1RPX1RDUCB8fCBza2ItPmRhdGFbOV0gPT0gSVBQUk9UT19VRFApKSB7Ci0JCXNnZS0+cG9ydF9zdGF0c1twLT5pZmZdLnJ4X2Nzb19nb29kKys7CisJCSsrc3QtPnJ4X2Nzb19nb29kOwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0gZWxzZQogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAlpZiAodW5saWtlbHkoYWRhcHRlci0+dmxhbl9ncnAgJiYgcC0+dmxhbl92YWxpZCkpIHsKLQkJc2dlLT5wb3J0X3N0YXRzW3AtPmlmZl0udmxhbl94dHJhY3QrKzsKLQkJaWYgKGFkYXB0ZXItPnBhcmFtcy5zZ2UucG9sbGluZykKKwkJc3QtPnZsYW5feHRyYWN0Kys7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfTkFQSQogCQkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgYWRhcHRlci0+dmxhbl9ncnAsCiAJCQkJCQkgbnRvaHMocC0+dmxhbikpOwotCQllbHNlCisjZWxzZQogCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgYWRhcHRlci0+dmxhbl9ncnAsCiAJCQkJCW50b2hzKHAtPnZsYW4pKTsKLQl9IGVsc2UgaWYgKGFkYXB0ZXItPnBhcmFtcy5zZ2UucG9sbGluZykKKyNlbmRpZgorCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfTkFQSQogCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwotCWVsc2UKKyNlbHNlCiAJCW5ldGlmX3J4KHNrYik7CisjZW5kaWYKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMzksMTggKzE0NzcsMjQgQEAKIAlzdHJ1Y3QgY21kUSAqY21kcSA9ICZzZ2UtPmNtZFFbMF07CiAKIAljbWRxLT5wcm9jZXNzZWQgKz0gcHIwOwotCisJaWYgKGZsYWdzICYgKEZfRkwwX0VOQUJMRSB8IEZfRkwxX0VOQUJMRSkpIHsKKwkJZnJlZWxRc19lbXB0eShzZ2UpOworCQlmbGFncyAmPSB+KEZfRkwwX0VOQUJMRSB8IEZfRkwxX0VOQUJMRSk7CisJfQogCWlmIChmbGFncyAmIEZfQ01EUTBfRU5BQkxFKSB7CiAJCWNsZWFyX2JpdChDTURRX1NUQVRfUlVOTklORywgJmNtZHEtPnN0YXR1cyk7Ci0JCisKIAkJaWYgKGNtZHEtPmNsZWFuZWQgKyBjbWRxLT5pbl91c2UgIT0gY21kcS0+cHJvY2Vzc2VkICYmCiAJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChDTURRX1NUQVRfTEFTVF9QS1RfREIsICZjbWRxLT5zdGF0dXMpKSB7CiAJCQlzZXRfYml0KENNRFFfU1RBVF9SVU5OSU5HLCAmY21kcS0+c3RhdHVzKTsKIAkJCXdyaXRlbChGX0NNRFEwX0VOQUJMRSwgYWRhcHRlci0+cmVncyArIEFfU0dfRE9PUkJFTEwpOwogCQl9Ci0JIAlmbGFncyAmPSB+Rl9DTURRMF9FTkFCTEU7CisJCWlmIChzZ2UtPnR4X3NjaGVkKQorCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmc2dlLT50eF9zY2hlZC0+c2NoZWRfdHNrKTsKKworCQlmbGFncyAmPSB+Rl9DTURRMF9FTkFCTEU7CiAJfQotCQorCiAJaWYgKHVubGlrZWx5KHNnZS0+c3RvcHBlZF90eF9xdWV1ZXMgIT0gMCkpCiAJCXJlc3RhcnRfdHhfcXVldWVzKHNnZSk7CiAKQEAgLTExMzIsNiArMTU3Niw3IEBACiAJcmV0dXJuIGJ1ZGdldDsKIH0KIAorI2lmZGVmIENPTkZJR19DSEVMU0lPX1QxX05BUEkKIC8qCiAgKiBBIHNpbXBsZXIgdmVyc2lvbiBvZiBwcm9jZXNzX3Jlc3BvbnNlcygpIHRoYXQgaGFuZGxlcyBvbmx5IHB1cmUgKGkuZS4sCiAgKiBub24gZGF0YS1jYXJyeWluZykgcmVzcG9uc2VzLiAgU3VjaCByZXNwb25lcyBhcmUgdG9vIGxpZ2h0LXdlaWdodCB0byBqdXN0aWZ5CkBAIC0xMTc5LDkxICsxNjI0LDc2IEBACiAgKiBvciBwcm90ZWN0aW9uIGZyb20gaW50ZXJydXB0cyBhcyBkYXRhIGludGVycnVwdHMgYXJlIG9mZiBhdCB0aGlzIHBvaW50IGFuZAogICogb3RoZXIgYWRhcHRlciBpbnRlcnJ1cHRzIGRvIG5vdCBpbnRlcmZlcmUuCiAgKi8KLXN0YXRpYyBpbnQgdDFfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK2ludCB0MV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwogCWludCBlZmZlY3RpdmVfYnVkZ2V0ID0gbWluKCpidWRnZXQsIGRldi0+cXVvdGEpOwotCiAJaW50IHdvcmtfZG9uZSA9IHByb2Nlc3NfcmVzcG9uc2VzKGFkYXB0ZXIsIGVmZmVjdGl2ZV9idWRnZXQpOworCiAJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CiAJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CiAKIAlpZiAod29ya19kb25lID49IGVmZmVjdGl2ZV9idWRnZXQpCiAJCXJldHVybiAxOwogCisgCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPmFzeW5jX2xvY2spOwogCV9fbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKLQotCS8qCi0JICogQmVjYXVzZSB3ZSBkb24ndCBhdG9taWNhbGx5IGZsdXNoIHRoZSBmb2xsb3dpbmcgd3JpdGUgaXQgaXMKLQkgKiBwb3NzaWJsZSB0aGF0IGluIHZlcnkgcmFyZSBjYXNlcyBpdCBjYW4gcmVhY2ggdGhlIGRldmljZSBpbiBhIHdheQotCSAqIHRoYXQgcmFjZXMgd2l0aCBhIG5ldyByZXNwb25zZSBiZWluZyB3cml0dGVuIHBsdXMgYW4gZXJyb3IgaW50ZXJydXB0Ci0JICogY2F1c2luZyB0aGUgTkFQSSBpbnRlcnJ1cHQgaGFuZGxlciBiZWxvdyB0byByZXR1cm4gdW5oYW5kbGVkIHN0YXR1cwotCSAqIHRvIHRoZSBPUy4gIFRvIHByb3RlY3QgYWdhaW5zdCB0aGlzIHdvdWxkIHJlcXVpcmUgZmx1c2hpbmcgdGhlIHdyaXRlCi0JICogYW5kIGRvaW5nIGJvdGggdGhlIHdyaXRlIGFuZCB0aGUgZmx1c2ggd2l0aCBpbnRlcnJ1cHRzIG9mZi4gIFdheSB0b28KLQkgKiBleHBlbnNpdmUgYW5kIHVuanVzdGlmaWFibGUgZ2l2ZW4gdGhlIHJhcml0eSBvZiB0aGUgcmFjZS4KLQkgKi8KIAl3cml0ZWwoYWRhcHRlci0+c2dlLT5yZXNwUS5jaWR4LCBhZGFwdGVyLT5yZWdzICsgQV9TR19TTEVFUElORyk7Ci0JcmV0dXJuIDA7Ci19CisJd3JpdGVsKGFkYXB0ZXItPnNsb3dfaW50cl9tYXNrIHwgRl9QTF9JTlRSX1NHRV9EQVRBLAorCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworIAlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmFzeW5jX2xvY2spOwogCi0vKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIHBvbGxpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5hcGlfaXNfc2NoZWR1bGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIHRlc3RfYml0KF9fTElOS19TVEFURV9SWF9TQ0hFRCwgJmRldi0+c3RhdGUpOworCXJldHVybiAwOwogfQogCiAvKgogICogTkFQSSB2ZXJzaW9uIG9mIHRoZSBtYWluIGludGVycnVwdCBoYW5kbGVyLgogICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgdDFfaW50ZXJydXB0X25hcGkoaW50IGlycSwgdm9pZCAqZGF0YSkKK2lycXJldHVybl90IHQxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewotCWludCBoYW5kbGVkOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGF0YTsKKyAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPnNnZS0+bmV0ZGV2OwogCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKLQlzdHJ1Y3QgcmVzcFEgKnEgPSAmYWRhcHRlci0+c2dlLT5yZXNwUTsKKyAJdTMyIGNhdXNlOworCWludCBoYW5kbGVkID0gMDsKIAotCS8qCi0JICogQ2xlYXIgdGhlIFNHRV9EQVRBIGludGVycnVwdCBmaXJzdCB0aGluZy4gIE5vcm1hbGx5IHRoZSBOQVBJCi0JICogaGFuZGxlciBoYXMgY29udHJvbCBvZiB0aGUgcmVzcG9uc2UgcXVldWUgYW5kIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgotCSAqIGNhbiBsb29rIGF0IHRoZSBxdWV1ZSByZWxpYWJseSBvbmx5IG9uY2UgaXQga25vd3MgTkFQSSBpcyBvZmYuCi0JICogV2UgY2FuJ3Qgd2FpdCB0aGF0IGxvbmcgdG8gY2xlYXIgdGhlIFNHRV9EQVRBIGludGVycnVwdCBiZWNhdXNlIHdlCi0JICogY291bGQgcmFjZSB3aXRoIHQxX3BvbGwgcmVhcm1pbmcgdGhlIFNHRSBpbnRlcnJ1cHQsIHNvIHdlIG5lZWQgdG8KLQkgKiBjbGVhciB0aGUgaW50ZXJydXB0IHNwZWN1bGF0aXZlbHkgYW5kIHJlYWxseSBlYXJseSBvbi4KLQkgKi8KLQl3cml0ZWwoRl9QTF9JTlRSX1NHRV9EQVRBLCBhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CisJY2F1c2UgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CisJaWYgKGNhdXNlID09IDAgfHwgY2F1c2UgPT0gfjApCisJCXJldHVybiBJUlFfTk9ORTsKIAogCXNwaW5fbG9jaygmYWRhcHRlci0+YXN5bmNfbG9jayk7Ci0JaWYgKCFuYXBpX2lzX3NjaGVkdWxlZChzZ2UtPm5ldGRldikpIHsKKyAJaWYgKGNhdXNlICYgRl9QTF9JTlRSX1NHRV9EQVRBKSB7CisJCXN0cnVjdCByZXNwUSAqcSA9ICZhZGFwdGVyLT5zZ2UtPnJlc3BROwogCQlzdHJ1Y3QgcmVzcFFfZSAqZSA9ICZxLT5lbnRyaWVzW3EtPmNpZHhdOwogCi0JCWlmIChlLT5HZW5lcmF0aW9uQml0ID09IHEtPmdlbmJpdCkgewotCQkJaWYgKGUtPkRhdGFWYWxpZCB8fAotCQkJICAgIHByb2Nlc3NfcHVyZV9yZXNwb25zZXMoYWRhcHRlciwgZSkpIHsKLQkJCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcChzZ2UtPm5ldGRldikpKQotCQkJCQlfX25ldGlmX3J4X3NjaGVkdWxlKHNnZS0+bmV0ZGV2KTsKLQkJCQllbHNlCi0JCQkJCXByaW50ayhLRVJOX0NSSVQKLQkJCQkJICAgICAgICJOQVBJIHNjaGVkdWxlIGZhaWx1cmUhXG4iKTsKLQkJCX0gZWxzZQotCQkJd3JpdGVsKHEtPmNpZHgsIGFkYXB0ZXItPnJlZ3MgKyBBX1NHX1NMRUVQSU5HKTsKLQkJCWhhbmRsZWQgPSAxOwotCQkJZ290byB1bmxvY2s7Ci0JCX0gZWxzZQorIAkJaGFuZGxlZCA9IDE7CisgCQl3cml0ZWwoRl9QTF9JTlRSX1NHRV9EQVRBLCBhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSk7CisKKwkJaWYgKGUtPkdlbmVyYXRpb25CaXQgPT0gcS0+Z2VuYml0ICYmCisJCSAgICBfX25ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQkJaWYgKGUtPkRhdGFWYWxpZCB8fCBwcm9jZXNzX3B1cmVfcmVzcG9uc2VzKGFkYXB0ZXIsIGUpKSB7CisJCQkJLyogbWFzayBvZmYgZGF0YSBJUlEgKi8KKwkJCQl3cml0ZWwoYWRhcHRlci0+c2xvd19pbnRyX21hc2ssCisJCQkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0VOQUJMRSk7CisJCQkJX19uZXRpZl9yeF9zY2hlZHVsZShzZ2UtPm5ldGRldik7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CisJCQkvKiBubyBkYXRhLCBubyBOQVBJIG5lZWRlZCAqLworCQkJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKworCQl9CiAJCXdyaXRlbChxLT5jaWR4LCBhZGFwdGVyLT5yZWdzICsgQV9TR19TTEVFUElORyk7Ci0JfSAgZWxzZQotCWlmIChyZWFkbChhZGFwdGVyLT5yZWdzICsgQV9QTF9DQVVTRSkgJiBGX1BMX0lOVFJfU0dFX0RBVEEpCi0JCXByaW50ayhLRVJOX0VSUiAiZGF0YSBpbnRlcnJ1cHQgd2hpbGUgTkFQSSBydW5uaW5nXG4iKTsKLQkKLQloYW5kbGVkID0gdDFfc2xvd19pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisJfSBlbHNlCisJCWhhbmRsZWQgPSB0MV9zbG93X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKwogCWlmICghaGFuZGxlZCkKIAkJc2dlLT5zdGF0cy51bmhhbmRsZWRfaXJxcysrOwotIHVubG9jazoKK3VubG9jazoKIAlzcGluX3VubG9jaygmYWRhcHRlci0+YXN5bmNfbG9jayk7CiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCAhPSAwKTsKIH0KIAorI2Vsc2UKIC8qCiAgKiBNYWluIGludGVycnVwdCBoYW5kbGVyLCBvcHRpbWl6ZWQgYXNzdW1pbmcgdGhhdCB3ZSB0b29rIGEgJ0RBVEEnCiAgKiBpbnRlcnJ1cHQuCkBAIC0xMjc5LDcgKzE3MDksNyBAQAogICogNS4gSWYgd2UgdG9vayBhbiBpbnRlcnJ1cHQsIGJ1dCBubyB2YWxpZCByZXNwUSBkZXNjcmlwdG9ycyB3YXMgZm91bmQgd2UKICAqICAgICAgbGV0IHRoZSBzbG93X2ludHJfaGFuZGxlciBydW4gYW5kIGRvIGVycm9yIGhhbmRsaW5nLgogICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgdDFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmNvb2tpZSkKK2lycXJldHVybl90IHQxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpjb29raWUpCiB7CiAJaW50IHdvcmtfZG9uZTsKIAlzdHJ1Y3QgcmVzcFFfZSAqZTsKQEAgLTEzMTEsMTEgKzE3NDEsNyBAQAogCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5hc3luY19sb2NrKTsKIAlyZXR1cm4gSVJRX1JFVFZBTCh3b3JrX2RvbmUgIT0gMCk7CiB9Ci0KLWlycV9oYW5kbGVyX3QgdDFfc2VsZWN0X2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIGFkYXB0ZXItPnBhcmFtcy5zZ2UucG9sbGluZyA/IHQxX2ludGVycnVwdF9uYXBpIDogdDFfaW50ZXJydXB0OwotfQorI2VuZGlmCiAKIC8qCiAgKiBFbnF1ZXVlcyB0aGUgc2tfYnVmZiBvbnRvIHRoZSBjbWRRW3FpZF0gYW5kIGhhcyBoYXJkd2FyZSBmZXRjaCBpdC4KQEAgLTEzMzUsMzQgKzE3NjEsNTkgQEAKIHsKIAlzdHJ1Y3Qgc2dlICpzZ2UgPSBhZGFwdGVyLT5zZ2U7CiAJc3RydWN0IGNtZFEgKnEgPSAmc2dlLT5jbWRRW3FpZF07Ci0JdW5zaWduZWQgaW50IGNyZWRpdHMsIHBpZHgsIGdlbmJpdCwgY291bnQ7CisJdW5zaWduZWQgaW50IGNyZWRpdHMsIHBpZHgsIGdlbmJpdCwgY291bnQsIHVzZV9zY2hlZF9za2IgPSAwOwogCi0Jc3Bpbl9sb2NrKCZxLT5sb2NrKTsKKwlpZiAoIXNwaW5fdHJ5bG9jaygmcS0+bG9jaykpCisJCXJldHVybiBORVRERVZfVFhfTE9DS0VEOworCiAJcmVjbGFpbV9jb21wbGV0ZWRfdHgoc2dlLCBxKTsKIAogCXBpZHggPSBxLT5waWR4OwogCWNyZWRpdHMgPSBxLT5zaXplIC0gcS0+aW5fdXNlOwogCWNvdW50ID0gMSArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJY291bnQgKz0gY29tcHV0ZV9sYXJnZV9wYWdlX3R4X2Rlc2NzKHNrYik7CiAKLQl7CS8qIEV0aGVybmV0IHBhY2tldCAqLwotCSAJaWYgKHVubGlrZWx5KGNyZWRpdHMgPCBjb3VudCkpIHsKKwkvKiBFdGhlcm5ldCBwYWNrZXQgKi8KKwlpZiAodW5saWtlbHkoY3JlZGl0cyA8IGNvdW50KSkgeworCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgewogCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQkJc2V0X2JpdChkZXYtPmlmX3BvcnQsICZzZ2UtPnN0b3BwZWRfdHhfcXVldWVzKTsKIAkJCXNnZS0+c3RhdHMuY21kUV9mdWxsWzJdKys7Ci0JCQlzcGluX3VubG9jaygmcS0+bG9jayk7Ci0JCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKLQkJCQlDSF9FUlIoIiVzOiBUeCByaW5nIGZ1bGwgd2hpbGUgcXVldWUgYXdha2UhXG4iLAotCQkJCSAgICAgICBhZGFwdGVyLT5uYW1lKTsKLQkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwkJCUNIX0VSUigiJXM6IFR4IHJpbmcgZnVsbCB3aGlsZSBxdWV1ZSBhd2FrZSFcbiIsCisJCQkgICAgICAgYWRhcHRlci0+bmFtZSk7CiAJCX0KLQkJaWYgKHVubGlrZWx5KGNyZWRpdHMgLSBjb3VudCA8IHEtPnN0b3BfdGhyZXMpKSB7Ci0JCQlzZ2UtPnN0YXRzLmNtZFFfZnVsbFsyXSsrOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQkJc2V0X2JpdChkZXYtPmlmX3BvcnQsICZzZ2UtPnN0b3BwZWRfdHhfcXVldWVzKTsKLQkJfQorCQlzcGluX3VubG9jaygmcS0+bG9jayk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CisKKwlpZiAodW5saWtlbHkoY3JlZGl0cyAtIGNvdW50IDwgcS0+c3RvcF90aHJlcykpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzZXRfYml0KGRldi0+aWZfcG9ydCwgJnNnZS0+c3RvcHBlZF90eF9xdWV1ZXMpOworCQlzZ2UtPnN0YXRzLmNtZFFfZnVsbFsyXSsrOworCX0KKworCS8qIFQyMDQgY21kUTAgc2ticyB0aGF0IGFyZSBkZXN0aW5lZCBmb3IgYSBjZXJ0YWluIHBvcnQgaGF2ZSB0byBnbworCSAqIHRocm91Z2ggdGhlIHNjaGVkdWxlci4KKwkgKi8KKwlpZiAoc2dlLT50eF9zY2hlZCAmJiAhcWlkICYmIHNrYi0+ZGV2KSB7CisJdXNlX3NjaGVkOgorCQl1c2Vfc2NoZWRfc2tiID0gMTsKKwkJLyogTm90ZSB0aGF0IHRoZSBzY2hlZHVsZXIgbWlnaHQgcmV0dXJuIGEgZGlmZmVyZW50IHNrYiB0aGFuCisJCSAqIHRoZSBvbmUgcGFzc2VkIGluLgorCQkgKi8KKwkJc2tiID0gc2NoZWRfc2tiKHNnZSwgc2tiLCBjcmVkaXRzKTsKKwkJaWYgKCFza2IpIHsKKwkJCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKKwkJCXJldHVybiBORVRERVZfVFhfT0s7CisJCX0KKwkJcGlkeCA9IHEtPnBpZHg7CisJCWNvdW50ID0gMSArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCWNvdW50ICs9IGNvbXB1dGVfbGFyZ2VfcGFnZV90eF9kZXNjcyhza2IpOworCX0KKwogCXEtPmluX3VzZSArPSBjb3VudDsKIAlnZW5iaXQgPSBxLT5nZW5iaXQ7CisJcGlkeCA9IHEtPnBpZHg7CiAJcS0+cGlkeCArPSBjb3VudDsKIAlpZiAocS0+cGlkeCA+PSBxLT5zaXplKSB7CiAJCXEtPnBpZHggLT0gcS0+c2l6ZTsKQEAgLTEzODgsNiArMTgzOSwxNCBAQAogCQkJd3JpdGVsKEZfQ01EUTBfRU5BQkxFLCBhZGFwdGVyLT5yZWdzICsgQV9TR19ET09SQkVMTCk7CiAJCX0KIAl9CisKKwlpZiAodXNlX3NjaGVkX3NrYikgeworCQlpZiAoc3Bpbl90cnlsb2NrKCZxLT5sb2NrKSkgeworCQkJY3JlZGl0cyA9IHEtPnNpemUgLSBxLT5pbl91c2U7CisJCQlza2IgPSBOVUxMOworCQkJZ290byB1c2Vfc2NoZWQ7CisJCX0KKwl9CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApAQCAtMTQxMiwxNiArMTg3MSwyMCBAQAogaW50IHQxX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKLQlzdHJ1Y3Qgc2dlX3BvcnRfc3RhdHMgKnN0ID0gJmFkYXB0ZXItPnNnZS0+cG9ydF9zdGF0c1tkZXYtPmlmX3BvcnRdOwogCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKKwlzdHJ1Y3Qgc2dlX3BvcnRfc3RhdHMgKnN0ID0gcGVyX2NwdV9wdHIoc2dlLT5wb3J0X3N0YXRzW2Rldi0+aWZfcG9ydF0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJc3RydWN0IGNwbF90eF9wa3QgKmNwbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqb3JpZ19za2IgPSBza2I7CisJaW50IHJldDsKIAotI2lmZGVmIE5FVElGX0ZfVFNPCi0JaWYgKHNrYl9pc19nc28oc2tiKSkgeworCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0NQTDUpKQorCQlnb3RvIHNlbmQ7CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgewogCQlpbnQgZXRoX3R5cGU7CiAJCXN0cnVjdCBjcGxfdHhfcGt0X2xzbyAqaGRyOwogCi0JCXN0LT50c28rKzsKKwkJKytzdC0+dHhfdHNvOwogCiAJCWV0aF90eXBlID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEgPT0gRVRIX0hMRU4gPwogCQkJQ1BMX0VUSF9JSSA6IENQTF9FVEhfSUlfVkxBTjsKQEAgLTE0MzIsMTMgKzE4OTUsMTAgQEAKIAkJaGRyLT5pcF9oZHJfd29yZHMgPSBza2ItPm5oLmlwaC0+aWhsOwogCQloZHItPnRjcF9oZHJfd29yZHMgPSBza2ItPmgudGgtPmRvZmY7CiAJCWhkci0+ZXRoX3R5cGVfbXNzID0gaHRvbnMoTUtfRVRIX1RZUEVfTVNTKGV0aF90eXBlLAotCQkJCQkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkpOworCQkJCQkJCSAgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkpOwogCQloZHItPmxlbiA9IGh0b25sKHNrYi0+bGVuIC0gc2l6ZW9mKCpoZHIpKTsKIAkJY3BsID0gKHN0cnVjdCBjcGxfdHhfcGt0ICopaGRyOwotCQlzZ2UtPnN0YXRzLnR4X2xzb19wa3RzKys7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7CisJfSBlbHNlIHsKIAkJLyoKIAkgCSAqIFBhY2tldHMgc2hvcnRlciB0aGFuIEVUSF9ITEVOIGNhbiBicmVhayB0aGUgTUFDLCBkcm9wIHRoZW0KIAkJICogZWFybHkuICBBbHNvLCB3ZSBtYXkgZ2V0IG92ZXJzaXplZCBwYWNrZXRzIGJlY2F1c2Ugc29tZQpAQCAtMTQ0Nyw2ICsxOTA3LDggQEAKIAkJICovCiAJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IEVUSF9ITEVOIHx8CiAJCQkgICAgIHNrYi0+bGVuID4gZGV2LT5tdHUgKyBldGhfaGRyX2xlbihza2ItPmRhdGEpKSkgeworCQkJcHJfZGVidWcoIiVzOiBwYWNrZXQgc2l6ZSAlZCBoZHIgJWQgbXR1JWRcbiIsIGRldi0+bmFtZSwKKwkJCQkgc2tiLT5sZW4sIGV0aF9oZHJfbGVuKHNrYi0+ZGF0YSksIGRldi0+bXR1KTsKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCQl9CkBAIC0xNDU2LDkgKzE5MTgsOSBAQAogCQkgKiBjb21wb25lbnRzLCBzdWNoIGFzIHBrdGdlbiwgZG8gbm90IGhhbmRsZSBpdCByaWdodC4KIAkJICogQ29tcGxhaW4gd2hlbiB0aGlzIGhhcHBlbnMgYnV0IHRyeSB0byBmaXggdGhpbmdzIHVwLgogCQkgKi8KLQkJaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbShza2IpIDwKLQkJCSAgICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBFVEhfSExFTikpIHsKLQkJCXN0cnVjdCBza19idWZmICpvcmlnX3NrYiA9IHNrYjsKKwkJaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbShza2IpIDwgZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBFVEhfSExFTikpIHsKKwkJCXByX2RlYnVnKCIlczogaGVhZHJvb20gJWQgaGVhZGVyX2xlbiAlZFxuIiwgZGV2LT5uYW1lLAorCQkJCSBza2JfaGVhZHJvb20oc2tiKSwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOwogCiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGluYWRlcXVhdGUgaGVhZHJvb20gaW4gIgpAQCAtMTQ3MSwxOSArMTkzMywyMSBAQAogCiAJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgVURQX0NTVU1fQ0FQQUJMRSkgJiYKIAkJICAgIHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwgJiYKLQkJICAgIHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJICAgIHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgewogCQkJaWYgKHVubGlrZWx5KHNrYl9jaGVja3N1bV9oZWxwKHNrYikpKSB7CisJCQkJcHJfZGVidWcoIiVzOiB1bmFibGUgdG8gZG8gdWRwIGNoZWNrc3VtXG4iLCBkZXYtPm5hbWUpOwogCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJCX0KKwkJfQogCiAJCS8qIEhtbW0sIGFzc3VtaW5nIHRvIGNhdGNoIHRoZSBncmF0aW91cyBhcnAuLi4gYW5kIHdlJ2xsIHVzZQogCQkgKiBpdCB0byBmbHVzaCBvdXQgc3R1Y2sgZXNwaSBwYWNrZXRzLi4uCi0JCSAgKi8KLQkJaWYgKHVubGlrZWx5KCFhZGFwdGVyLT5zZ2UtPmVzcGlidWdfc2tiKSkgeworCQkgKi8KKwkJaWYgKCh1bmxpa2VseSghYWRhcHRlci0+c2dlLT5lc3BpYnVnX3NrYltkZXYtPmlmX3BvcnRdKSkpIHsKIAkJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0FSUCkgJiYKIAkJCSAgICBza2ItPm5oLmFycGgtPmFyX29wID09IGh0b25zKEFSUE9QX1JFUVVFU1QpKSB7Ci0JCQkJYWRhcHRlci0+c2dlLT5lc3BpYnVnX3NrYiA9IHNrYjsKKwkJCQlhZGFwdGVyLT5zZ2UtPmVzcGlidWdfc2tiW2Rldi0+aWZfcG9ydF0gPSBza2I7CiAJCQkJLyogV2Ugd2FudCB0byByZS11c2UgdGhpcyBza2IgbGF0ZXIuIFdlCiAJCQkJICogc2ltcGx5IGJ1bXAgdGhlIHJlZmVyZW5jZSBjb3VudCBhbmQgaXQKIAkJCQkgKiB3aWxsIG5vdCBiZSBmcmVlZC4uLgpAQCAtMTQ5OSw4ICsxOTYzLDYgQEAKIAkJLyogdGhlIGxlbmd0aCBmaWVsZCBpc24ndCB1c2VkIHNvIGRvbid0IGJvdGhlciBzZXR0aW5nIGl0ICovCiAKIAkJc3QtPnR4X2NzbyArPSAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCk7Ci0JCXNnZS0+c3RhdHMudHhfZG9fY2tzdW0gKz0gKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpOwotCQlzZ2UtPnN0YXRzLnR4X3JlZ19wa3RzKys7CiAJfQogCWNwbC0+aWZmID0gZGV2LT5pZl9wb3J0OwogCkBAIC0xNTEzLDggKzE5NzUsMTkgQEAKICNlbmRpZgogCQljcGwtPnZsYW5fdmFsaWQgPSAwOwogCitzZW5kOgorCXN0LT50eF9wYWNrZXRzKys7CiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JcmV0dXJuIHQxX3NnZV90eChza2IsIGFkYXB0ZXIsIDAsIGRldik7CisJcmV0ID0gdDFfc2dlX3R4KHNrYiwgYWRhcHRlciwgMCwgZGV2KTsKKworCS8qIElmIHRyYW5zbWl0IGJ1c3ksIGFuZCB3ZSByZWFsbG9jYXRlZCBza2IncyBkdWUgdG8gaGVhZHJvb20gbGltaXQsCisJICogdGhlbiBzaWxlbnRseSBkaXNjYXJkIHRvIGF2b2lkIGxlYWsuCisJICovCisJaWYgKHVubGlrZWx5KHJldCAhPSBORVRERVZfVFhfT0sgJiYgc2tiICE9IG9yaWdfc2tiKSkgeworIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0ID0gTkVUREVWX1RYX09LOworIAl9CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTE1MzIsMTAgKzIwMDUsOSBAQAogCQkJY29udGludWU7CiAKIAkJcmVjbGFpbV9jb21wbGV0ZWRfdHgoc2dlLCBxKTsKLQkJaWYgKGkgPT0gMCAmJiBxLT5pbl91c2UpICAgLyogZmx1c2ggcGVuZGluZyBjcmVkaXRzICovCi0JCQl3cml0ZWwoRl9DTURRMF9FTkFCTEUsCi0JCQkJc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19ET09SQkVMTCk7Ci0KKwkJaWYgKGkgPT0gMCAmJiBxLT5pbl91c2UpIHsgICAgLyogZmx1c2ggcGVuZGluZyBjcmVkaXRzICovCisJCQl3cml0ZWwoRl9DTURRMF9FTkFCTEUsIHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfRE9PUkJFTEwpOworCQl9CiAJCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKIAl9CiAJbW9kX3RpbWVyKCZzZ2UtPnR4X3JlY2xhaW1fdGltZXIsIGppZmZpZXMgKyBUWF9SRUNMQUlNX1BFUklPRCk7CkBAIC0xNTQ2LDcgKzIwMTgsNiBAQAogICovCiBpbnQgdDFfc2dlX3NldF9jb2FsZXNjZV9wYXJhbXMoc3RydWN0IHNnZSAqc2dlLCBzdHJ1Y3Qgc2dlX3BhcmFtcyAqcCkKIHsKLQlzZ2UtPm5ldGRldi0+cG9sbCA9IHQxX3BvbGw7CiAJc2dlLT5maXhlZF9pbnRydGltZXIgPSBwLT5yeF9jb2FsZXNjZV91c2VjcyAqCiAJCWNvcmVfdGlja3NfcGVyX3VzZWMoc2dlLT5hZGFwdGVyKTsKIAl3cml0ZWwoc2dlLT5maXhlZF9pbnRydGltZXIsIHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfSU5UUlRJTUVSKTsKQEAgLTE1ODIsMTEgKzIwNTMsMjAgQEAKICAqLwogdm9pZCB0MV9zZ2Vfc3RvcChzdHJ1Y3Qgc2dlICpzZ2UpCiB7CisJaW50IGk7CiAJd3JpdGVsKDAsIHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7Ci0JKHZvaWQpIHJlYWRsKHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7IC8qIGZsdXNoICovCisJcmVhZGwoc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19DT05UUk9MKTsgLyogZmx1c2ggKi8KKwogCWlmIChpc19UMihzZ2UtPmFkYXB0ZXIpKQogCQlkZWxfdGltZXJfc3luYygmc2dlLT5lc3BpYnVnX3RpbWVyKTsKKwogCWRlbF90aW1lcl9zeW5jKCZzZ2UtPnR4X3JlY2xhaW1fdGltZXIpOworCWlmIChzZ2UtPnR4X3NjaGVkKQorCQl0eF9zY2hlZF9zdG9wKHNnZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05QT1JUUzsgaSsrKQorCQlpZiAoc2dlLT5lc3BpYnVnX3NrYltpXSkKKwkJCWtmcmVlX3NrYihzZ2UtPmVzcGlidWdfc2tiW2ldKTsKIH0KIAogLyoKQEAgLTE1OTksNDQgKzIwNzksODIgQEAKIAogCXdyaXRlbChzZ2UtPnNnZV9jb250cm9sLCBzZ2UtPmFkYXB0ZXItPnJlZ3MgKyBBX1NHX0NPTlRST0wpOwogCWRvb3JiZWxsX3BpbyhzZ2UtPmFkYXB0ZXIsIEZfRkwwX0VOQUJMRSB8IEZfRkwxX0VOQUJMRSk7Ci0JKHZvaWQpIHJlYWRsKHNnZS0+YWRhcHRlci0+cmVncyArIEFfU0dfQ09OVFJPTCk7IC8qIGZsdXNoICovCisJcmVhZGwoc2dlLT5hZGFwdGVyLT5yZWdzICsgQV9TR19DT05UUk9MKTsgLyogZmx1c2ggKi8KIAogCW1vZF90aW1lcigmc2dlLT50eF9yZWNsYWltX3RpbWVyLCBqaWZmaWVzICsgVFhfUkVDTEFJTV9QRVJJT0QpOwogCi0JaWYgKGlzX1QyKHNnZS0+YWRhcHRlcikpIAorCWlmIChpc19UMihzZ2UtPmFkYXB0ZXIpKQogCQltb2RfdGltZXIoJnNnZS0+ZXNwaWJ1Z190aW1lciwgamlmZmllcyArIHNnZS0+ZXNwaWJ1Z190aW1lb3V0KTsKIH0KIAogLyoKICAqIENhbGxiYWNrIGZvciB0aGUgVDIgRVNQSSAnc3R1Y2sgcGFja2V0IGZlYXR1cmUnIHdvcmthb3J1bmQKICAqLwotc3RhdGljIHZvaWQgZXNwaWJ1Z193b3JrYXJvdW5kKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBlc3BpYnVnX3dvcmthcm91bmRfdDIwNCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOworCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKKwl1bnNpZ25lZCBpbnQgbnBvcnRzID0gYWRhcHRlci0+cGFyYW1zLm5wb3J0czsKKwl1MzIgc2VvcFtNQVhfTlBPUlRTXTsKKworCWlmIChhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgJiBQT1JUX01BU0spIHsKKwkJaW50IGk7CisJCWlmICh0MV9lc3BpX2dldF9tb25fdDIwNChhZGFwdGVyLCAmKHNlb3BbMF0pLCAwKSA8IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnBvcnRzOyBpKyspIHsKKwkgICAgICAgIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2dlLT5lc3BpYnVnX3NrYltpXTsKKwkJCWlmICggKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+cG9ydFtpXS5kZXYpKSAmJgorCQkJICAgICAhKG5ldGlmX3F1ZXVlX3N0b3BwZWQoYWRhcHRlci0+cG9ydFtpXS5kZXYpKSAmJgorCQkJICAgICAoc2VvcFtpXSAmJiAoKHNlb3BbaV0gJiAweGZmZikgPT0gMCkpICYmCisJCQkgICAgIHNrYiApIHsKKwkgICAgICAgICAgICAgICAgCWlmICghc2tiLT5jYlswXSkgeworCSAgICAgICAgICAgICAgICAgICAgICAgIAl1OCBjaF9tYWNfYWRkcltFVEhfQUxFTl0gPQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJezB4MCwgMHg3LCAweDQzLCAweDAsIDB4MCwgMHgwfTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAJbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAljaF9tYWNfYWRkciwgRVRIX0FMRU4pOworCSAgICAgICAgICAgICAgICAgICAgICAgIAltZW1jcHkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSAxMCwKKwkJCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgCXNrYi0+Y2JbMF0gPSAweGZmOworCSAgICAgICAgICAgICAgICAJfQorCisJICAgICAgICAgICAgICAgIAkvKiBidW1wIHRoZSByZWZlcmVuY2UgY291bnQgdG8gYXZvaWQgZnJlZWluZyBvZgorCSAgICAgICAgICAgICAgICAgCSAqIHRoZSBza2Igb25jZSB0aGUgRE1BIGhhcyBjb21wbGV0ZWQuCisJICAgICAgICAgICAgICAgICAJICovCisJICAgICAgICAgICAgICAgIAlza2IgPSBza2JfZ2V0KHNrYik7CisJICAgICAgICAgICAgICAgIAl0MV9zZ2VfdHgoc2tiLCBhZGFwdGVyLCAwLCBhZGFwdGVyLT5wb3J0W2ldLmRldik7CisJCQl9CisJCX0KKwl9CisJbW9kX3RpbWVyKCZzZ2UtPmVzcGlidWdfdGltZXIsIGppZmZpZXMgKyBzZ2UtPmVzcGlidWdfdGltZW91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcGlidWdfd29ya2Fyb3VuZCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKIAogCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPnBvcnRbMF0uZGV2KSkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2dlLT5lc3BpYnVnX3NrYjsKKwkgICAgICAgIHN0cnVjdCBza19idWZmICpza2IgPSBzZ2UtPmVzcGlidWdfc2tiWzBdOworCSAgICAgICAgdTMyIHNlb3AgPSB0MV9lc3BpX2dldF9tb24oYWRhcHRlciwgMHg5MzAsIDApOwogCi0JCXUzMiBzZW9wID0gdDFfZXNwaV9nZXRfbW9uKGFkYXB0ZXIsIDB4OTMwLCAwKTsKKwkgICAgICAgIGlmICgoc2VvcCAmIDB4ZmZmMGZmZikgPT0gMHhmZmYgJiYgc2tiKSB7CisJICAgICAgICAgICAgICAgIGlmICghc2tiLT5jYlswXSkgeworCSAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNoX21hY19hZGRyW0VUSF9BTEVOXSA9CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAsIDB4NywgMHg0MywgMHgwLCAweDAsIDB4MH07CisJICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX21hY19hZGRyLCBFVEhfQUxFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gMTAsIGNoX21hY19hZGRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVEhfQUxFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5jYlswXSA9IDB4ZmY7CisJICAgICAgICAgICAgICAgIH0KIAotCQlpZiAoKHNlb3AgJiAweGZmZjBmZmYpID09IDB4ZmZmICYmIHNrYikgewotCQkJaWYgKCFza2ItPmNiWzBdKSB7Ci0JCQkJdTggY2hfbWFjX2FkZHJbRVRIX0FMRU5dID0KLQkJCQkgICAgezB4MCwgMHg3LCAweDQzLCAweDAsIDB4MCwgMHgwfTsKLQkJCQltZW1jcHkoc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0KSwKLQkJCQkgICAgY2hfbWFjX2FkZHIsIEVUSF9BTEVOKTsKLQkJCQltZW1jcHkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSAxMCwgY2hfbWFjX2FkZHIsCi0JCQkJICAgIEVUSF9BTEVOKTsKLQkJCQlza2ItPmNiWzBdID0gMHhmZjsKLQkJCX0KLQotCQkJLyogYnVtcCB0aGUgcmVmZXJlbmNlIGNvdW50IHRvIGF2b2lkIGZyZWVpbmcgb2YgdGhlCi0JCQkgKiBza2Igb25jZSB0aGUgRE1BIGhhcyBjb21wbGV0ZWQuCi0JCQkgKi8KLQkJCXNrYiA9IHNrYl9nZXQoc2tiKTsKLQkJCXQxX3NnZV90eChza2IsIGFkYXB0ZXIsIDAsIGFkYXB0ZXItPnBvcnRbMF0uZGV2KTsKLQkJfQorCSAgICAgICAgICAgICAgICAvKiBidW1wIHRoZSByZWZlcmVuY2UgY291bnQgdG8gYXZvaWQgZnJlZWluZyBvZiB0aGUKKwkgICAgICAgICAgICAgICAgICogc2tiIG9uY2UgdGhlIERNQSBoYXMgY29tcGxldGVkLgorCSAgICAgICAgICAgICAgICAgKi8KKwkgICAgICAgICAgICAgICAgc2tiID0gc2tiX2dldChza2IpOworCSAgICAgICAgICAgICAgICB0MV9zZ2VfdHgoc2tiLCBhZGFwdGVyLCAwLCBhZGFwdGVyLT5wb3J0WzBdLmRldik7CisJICAgICAgICB9CiAJfQogCW1vZF90aW1lcigmc2dlLT5lc3BpYnVnX3RpbWVyLCBqaWZmaWVzICsgc2dlLT5lc3BpYnVnX3RpbWVvdXQpOwogfQpAQCAtMTY0NywyNiArMjE2NSw0MiBAQAogc3RydWN0IHNnZSAqIF9fZGV2aW5pdCB0MV9zZ2VfY3JlYXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJCSAgICAgc3RydWN0IHNnZV9wYXJhbXMgKnApCiB7Ci0Jc3RydWN0IHNnZSAqc2dlID0ga21hbGxvYyhzaXplb2YoKnNnZSksIEdGUF9LRVJORUwpOworCXN0cnVjdCBzZ2UgKnNnZSA9IGt6YWxsb2Moc2l6ZW9mKCpzZ2UpLCBHRlBfS0VSTkVMKTsKKwlpbnQgaTsKIAogCWlmICghc2dlKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoc2dlLCAwLCBzaXplb2YoKnNnZSkpOwogCiAJc2dlLT5hZGFwdGVyID0gYWRhcHRlcjsKIAlzZ2UtPm5ldGRldiA9IGFkYXB0ZXItPnBvcnRbMF0uZGV2OwogCXNnZS0+cnhfcGt0X3BhZCA9IHQxX2lzX1QxQihhZGFwdGVyKSA/IDAgOiAyOwogCXNnZS0+anVtYm9fZmwgPSB0MV9pc19UMUIoYWRhcHRlcikgPyAxIDogMDsKIAorCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQlzZ2UtPnBvcnRfc3RhdHNbaV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHNnZV9wb3J0X3N0YXRzKTsKKwkJaWYgKCFzZ2UtPnBvcnRfc3RhdHNbaV0pCisJCQlnb3RvIG5vbWVtX3BvcnQ7CisJfQorCiAJaW5pdF90aW1lcigmc2dlLT50eF9yZWNsYWltX3RpbWVyKTsKIAlzZ2UtPnR4X3JlY2xhaW1fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNnZTsKIAlzZ2UtPnR4X3JlY2xhaW1fdGltZXIuZnVuY3Rpb24gPSBzZ2VfdHhfcmVjbGFpbV9jYjsKIAogCWlmIChpc19UMihzZ2UtPmFkYXB0ZXIpKSB7CiAJCWluaXRfdGltZXIoJnNnZS0+ZXNwaWJ1Z190aW1lcik7Ci0JCXNnZS0+ZXNwaWJ1Z190aW1lci5mdW5jdGlvbiA9ICh2b2lkICopJmVzcGlidWdfd29ya2Fyb3VuZDsKKworCQlpZiAoYWRhcHRlci0+cGFyYW1zLm5wb3J0cyA+IDEpIHsKKwkJCXR4X3NjaGVkX2luaXQoc2dlKTsKKwkJCXNnZS0+ZXNwaWJ1Z190aW1lci5mdW5jdGlvbiA9IGVzcGlidWdfd29ya2Fyb3VuZF90MjA0OworCQl9IGVsc2UgeworCQkJc2dlLT5lc3BpYnVnX3RpbWVyLmZ1bmN0aW9uID0gZXNwaWJ1Z193b3JrYXJvdW5kOworCQl9CiAJCXNnZS0+ZXNwaWJ1Z190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2dlLT5hZGFwdGVyOworCiAJCXNnZS0+ZXNwaWJ1Z190aW1lb3V0ID0gMTsKKwkJLyogZm9yIFQyMDQsIGV2ZXJ5IDEwbXMgKi8KKwkJaWYgKGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgPiAxKQorCQkJc2dlLT5lc3BpYnVnX3RpbWVvdXQgPSBIWi8xMDA7CiAJfQogCSAKIApAQCAtMTY3NCwxMCArMjIwOCwyNCBAQAogCXAtPmNtZFFfc2l6ZVsxXSA9IFNHRV9DTURRMV9FX047CiAJcC0+ZnJlZWxRX3NpemVbIXNnZS0+anVtYm9fZmxdID0gU0dFX0ZSRUVMX1NJWkU7CiAJcC0+ZnJlZWxRX3NpemVbc2dlLT5qdW1ib19mbF0gPSBTR0VfSlVNQk9fRlJFRUxfU0laRTsKLQlwLT5yeF9jb2FsZXNjZV91c2VjcyA9ICA1MDsKKwlpZiAoc2dlLT50eF9zY2hlZCkgeworCQlpZiAoYm9hcmRfaW5mbyhzZ2UtPmFkYXB0ZXIpLT5ib2FyZCA9PSBDSEJUX0JPQVJEX0NIVDIwNCkKKwkJCXAtPnJ4X2NvYWxlc2NlX3VzZWNzID0gMTU7CisJCWVsc2UKKwkJCXAtPnJ4X2NvYWxlc2NlX3VzZWNzID0gNTA7CisJfSBlbHNlCisJCXAtPnJ4X2NvYWxlc2NlX3VzZWNzID0gNTA7CisKIAlwLT5jb2FsZXNjZV9lbmFibGUgPSAwOwogCXAtPnNhbXBsZV9pbnRlcnZhbF91c2VjcyA9IDA7Ci0JcC0+cG9sbGluZyA9IDA7CiAKIAlyZXR1cm4gc2dlOworbm9tZW1fcG9ydDoKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWZyZWVfcGVyY3B1KHNnZS0+cG9ydF9zdGF0c1tpXSk7CisJCS0taTsKKwl9CisJa2ZyZWUoc2dlKTsKKwlyZXR1cm4gTlVMTDsKKwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmgKaW5kZXggOTFhZjQ3Yi4uZDEzMmEwZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuaApAQCAtNDQsNiArNDQsOSBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogc3RydWN0IHNnZV9pbnRyX2NvdW50cyB7CisJdW5zaWduZWQgaW50IHJ4X2Ryb3BzOyAgICAgICAgLyogIyBvZiBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIG5vIG1lbSAqLworCXVuc2lnbmVkIGludCBwdXJlX3JzcHM7ICAgICAgICAvKiAjIG9mIG5vbi1wYXlsb2FkIHJlc3BvbnNlcyAqLworCXVuc2lnbmVkIGludCB1bmhhbmRsZWRfaXJxczsgICAvKiAjIG9mIHVuaGFuZGxlZCBpbnRlcnJ1cHRzICovCiAJdW5zaWduZWQgaW50IHJlc3BRX2VtcHR5OyAgICAgIC8qICMgdGltZXMgcmVzcFEgZW1wdHkgKi8KIAl1bnNpZ25lZCBpbnQgcmVzcFFfb3ZlcmZsb3c7ICAgLyogIyByZXNwUSBvdmVyZmxvdyAoZmF0YWwpICovCiAJdW5zaWduZWQgaW50IGZyZWVsaXN0UV9lbXB0eTsgIC8qICMgdGltZXMgZnJlZWxpc3QgZW1wdHkgKi8KQEAgLTUxLDI0ICs1NCwxNiBAQAogCXVuc2lnbmVkIGludCBwa3RfbWlzbWF0Y2g7CiAJdW5zaWduZWQgaW50IGNtZFFfZnVsbFszXTsgICAgIC8qIG5vdCBIVyBJUlEsIGhvc3QgY21kUVtdIGZ1bGwgKi8KIAl1bnNpZ25lZCBpbnQgY21kUV9yZXN0YXJ0ZWRbM107LyogIyBvZiB0aW1lcyBjbWRRIFggd2FzIHJlc3RhcnRlZCAqLwotCXVuc2lnbmVkIGludCBldGhlcm5ldF9wa3RzOyAgICAvKiAjIG9mIEV0aGVybmV0IHBhY2tldHMgcmVjZWl2ZWQgKi8KLQl1bnNpZ25lZCBpbnQgb2ZmbG9hZF9wa3RzOyAgICAgLyogIyBvZiBvZmZsb2FkIHBhY2tldHMgcmVjZWl2ZWQgKi8KLQl1bnNpZ25lZCBpbnQgb2ZmbG9hZF9idW5kbGVzOyAgLyogIyBvZiBvZmZsb2FkIHBrdCBidW5kbGVzIGRlbGl2ZXJlZCAqLwotCXVuc2lnbmVkIGludCBwdXJlX3JzcHM7ICAgICAgICAvKiAjIG9mIG5vbi1wYXlsb2FkIHJlc3BvbnNlcyAqLwotCXVuc2lnbmVkIGludCB1bmhhbmRsZWRfaXJxczsgICAvKiAjIG9mIHVuaGFuZGxlZCBpbnRlcnJ1cHRzICovCi0JdW5zaWduZWQgaW50IHR4X2lwZnJhZ3M7Ci0JdW5zaWduZWQgaW50IHR4X3JlZ19wa3RzOwotCXVuc2lnbmVkIGludCB0eF9sc29fcGt0czsKLQl1bnNpZ25lZCBpbnQgdHhfZG9fY2tzdW07CiB9OwogCiBzdHJ1Y3Qgc2dlX3BvcnRfc3RhdHMgewotCXVuc2lnbmVkIGxvbmcgcnhfY3NvX2dvb2Q7ICAgICAvKiAjIG9mIHN1Y2Nlc3NmdWwgUlggY3N1bSBvZmZsb2FkcyAqLwotCXVuc2lnbmVkIGxvbmcgdHhfY3NvOyAgICAgICAgICAvKiAjIG9mIFRYIGNoZWNrc3VtIG9mZmxvYWRzICovCi0JdW5zaWduZWQgbG9uZyB2bGFuX3h0cmFjdDsgICAgIC8qICMgb2YgVkxBTiB0YWcgZXh0cmFjdGlvbnMgKi8KLQl1bnNpZ25lZCBsb25nIHZsYW5faW5zZXJ0OyAgICAgLyogIyBvZiBWTEFOIHRhZyBleHRyYWN0aW9ucyAqLwotCXVuc2lnbmVkIGxvbmcgdHNvOyAgICAgICAgICAgICAvKiAjIG9mIFRTTyByZXF1ZXN0cyAqLwotCXVuc2lnbmVkIGxvbmcgcnhfZHJvcHM7ICAgICAgICAvKiAjIG9mIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbm8gbWVtICovCisJdTY0IHJ4X3BhY2tldHM7ICAgICAgLyogIyBvZiBFdGhlcm5ldCBwYWNrZXRzIHJlY2VpdmVkICovCisJdTY0IHJ4X2Nzb19nb29kOyAgICAgLyogIyBvZiBzdWNjZXNzZnVsIFJYIGNzdW0gb2ZmbG9hZHMgKi8KKwl1NjQgdHhfcGFja2V0czsgICAgICAvKiAjIG9mIFRYIHBhY2tldHMgKi8KKwl1NjQgdHhfY3NvOyAgICAgICAgICAvKiAjIG9mIFRYIGNoZWNrc3VtIG9mZmxvYWRzICovCisJdTY0IHR4X3RzbzsgICAgICAgICAgLyogIyBvZiBUU08gcmVxdWVzdHMgKi8KKwl1NjQgdmxhbl94dHJhY3Q7ICAgICAvKiAjIG9mIFZMQU4gdGFnIGV4dHJhY3Rpb25zICovCisJdTY0IHZsYW5faW5zZXJ0OyAgICAgLyogIyBvZiBWTEFOIHRhZyBpbnNlcnRpb25zICovCiB9OwogCiBzdHJ1Y3Qgc2tfYnVmZjsKQEAgLTgxLDcgKzc2LDkgQEAKIGludCB0MV9zZ2VfY29uZmlndXJlKHN0cnVjdCBzZ2UgKiwgc3RydWN0IHNnZV9wYXJhbXMgKik7CiBpbnQgdDFfc2dlX3NldF9jb2FsZXNjZV9wYXJhbXMoc3RydWN0IHNnZSAqLCBzdHJ1Y3Qgc2dlX3BhcmFtcyAqKTsKIHZvaWQgdDFfc2dlX2Rlc3Ryb3koc3RydWN0IHNnZSAqKTsKLWlycV9oYW5kbGVyX3QgdDFfc2VsZWN0X2ludHJfaGFuZGxlcihhZGFwdGVyX3QgKmFkYXB0ZXIpOworaXJxcmV0dXJuX3QgdDFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmNvb2tpZSk7CitpbnQgdDFfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgKik7CisKIGludCB0MV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCB0MV9zZXRfdmxhbl9hY2NlbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IG9uX29mZik7CiB2b2lkIHQxX3NnZV9zdGFydChzdHJ1Y3Qgc2dlICopOwpAQCAtOTAsNyArODcsMTEgQEAKIHZvaWQgdDFfc2dlX2ludHJfZW5hYmxlKHN0cnVjdCBzZ2UgKik7CiB2b2lkIHQxX3NnZV9pbnRyX2Rpc2FibGUoc3RydWN0IHNnZSAqKTsKIHZvaWQgdDFfc2dlX2ludHJfY2xlYXIoc3RydWN0IHNnZSAqKTsKLWNvbnN0IHN0cnVjdCBzZ2VfaW50cl9jb3VudHMgKnQxX3NnZV9nZXRfaW50cl9jb3VudHMoc3RydWN0IHNnZSAqc2dlKTsKLWNvbnN0IHN0cnVjdCBzZ2VfcG9ydF9zdGF0cyAqdDFfc2dlX2dldF9wb3J0X3N0YXRzKHN0cnVjdCBzZ2UgKnNnZSwgaW50IHBvcnQpOworY29uc3Qgc3RydWN0IHNnZV9pbnRyX2NvdW50cyAqdDFfc2dlX2dldF9pbnRyX2NvdW50cyhjb25zdCBzdHJ1Y3Qgc2dlICpzZ2UpOwordm9pZCB0MV9zZ2VfZ2V0X3BvcnRfc3RhdHMoY29uc3Qgc3RydWN0IHNnZSAqc2dlLCBpbnQgcG9ydCwgc3RydWN0IHNnZV9wb3J0X3N0YXRzICopOwordm9pZCB0MV9zY2hlZF9zZXRfbWF4X2F2YWlsX2J5dGVzKHN0cnVjdCBzZ2UgKiwgdW5zaWduZWQgaW50KTsKK3ZvaWQgdDFfc2NoZWRfc2V0X2RyYWluX2JpdHNfcGVyX3VzKHN0cnVjdCBzZ2UgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwordW5zaWduZWQgaW50IHQxX3NjaGVkX3VwZGF0ZV9wYXJtcyhzdHJ1Y3Qgc2dlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCQkJICAgdW5zaWduZWQgaW50KTsKIAogI2VuZGlmIC8qIF9DWEdCX1NHRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zdWJyLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYwppbmRleCAxMmU0ZTk2Li4yMmVkOWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgImdtYWMuaCIKICNpbmNsdWRlICJjcGh5LmgiCiAjaW5jbHVkZSAic2dlLmgiCisjaW5jbHVkZSAidHAuaCIKICNpbmNsdWRlICJlc3BpLmgiCiAKIC8qKgpAQCAtNTksNyArNjAsNyBAQAogICoJb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW50IHQxX3dhaXRfb3BfZG9uZShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCByZWcsIHUzMiBtYXNrLCBpbnQgcG9sYXJpdHksCi0JCSAgICBpbnQgYXR0ZW1wdHMsIGludCBkZWxheSkKKwkJCSAgIGludCBhdHRlbXB0cywgaW50IGRlbGF5KQogewogCXdoaWxlICgxKSB7CiAJCXUzMiB2YWwgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgcmVnKSAmIG1hc2s7CkBAIC03OCw3ICs3OSw3IEBACiAvKgogICogV3JpdGUgYSByZWdpc3RlciBvdmVyIHRoZSBUUEkgaW50ZXJmYWNlICh1bmxvY2tlZCBhbmQgbG9ja2VkIHZlcnNpb25zKS4KICAqLwotc3RhdGljIGludCBfX3QxX3RwaV93cml0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgdmFsdWUpCitpbnQgX190MV90cGlfd3JpdGUoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIHZhbHVlKQogewogCWludCB0cGlfYnVzeTsKIApAQCAtOTgsMTYgKzk5LDE2IEBACiB7CiAJaW50IHJldDsKIAotCXNwaW5fbG9jaygmKGFkYXB0ZXIpLT50cGlfbG9jayk7CisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50cGlfbG9jayk7CiAJcmV0ID0gX190MV90cGlfd3JpdGUoYWRhcHRlciwgYWRkciwgdmFsdWUpOwotCXNwaW5fdW5sb2NrKCYoYWRhcHRlciktPnRwaV9sb2NrKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+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+IFNfUFNTUl9TUEVFRCkgJiBNX1BTU1JfU1BFRUQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3Jpcy9ldGhfdjEwLmMgYi9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYwppbmRleCA5NjZiNTYzLi5hMDNkNzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYworKysgYi9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYwpAQCAtNTA5LDYgKzUwOSw4IEBACiAJCSAqIGRvZXMgbm90IHNoYXJlIGNhY2hlbGluZSB3aXRoIGFueSBvdGhlciBkYXRhICh0byBhdm9pZCBjYWNoZSBidWcpCiAJCSAqLwogCQlSeERlc2NMaXN0W2ldLnNrYiA9IGRldl9hbGxvY19za2IoTUFYX01FRElBX0RBVEFfU0laRSArIDIgKiBMMV9DQUNIRV9CWVRFUyk7CisJCWlmICghUnhEZXNjTGlzdFtpXS5za2IpCisJCQlyZXR1cm4gLUVOT01FTTsKIAkJUnhEZXNjTGlzdFtpXS5kZXNjci5jdHJsICAgPSAwOwogCQlSeERlc2NMaXN0W2ldLmRlc2NyLnN3X2xlbiA9IE1BWF9NRURJQV9EQVRBX1NJWkU7CiAJCVJ4RGVzY0xpc3RbaV0uZGVzY3IubmV4dCAgID0gdmlydF90b19waHlzKCZSeERlc2NMaXN0W2kgKyAxXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuYyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCmluZGV4IDRmZmM5YjQuLjQ2MTJmNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NzODl4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCkBAIC01ODgsMTAgKzU4OCwxMCBAQAogCQkJCWdvdG8gb3V0MjsKIAkJCX0KIAl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlBQX2FkZHIgYXQgJXhbJXhdOiAweCV4XG4iLAotCQkJaW9hZGRyLCBBRERfUE9SVCwgcmVhZHdvcmQoaW9hZGRyLCBBRERfUE9SVCkpOwogCiAJaW9hZGRyICY9IH4zOworCXByaW50ayhLRVJOX0RFQlVHICJQUF9hZGRyIGF0ICV4WyV4XTogMHgleFxuIiwKKwkJCWlvYWRkciwgQUREX1BPUlQsIHJlYWR3b3JkKGlvYWRkciwgQUREX1BPUlQpKTsKIAl3cml0ZXdvcmQoaW9hZGRyLCBBRERfUE9SVCwgUFBfQ2hpcElEKTsKIAogCXRtcCA9IHJlYWR3b3JkKGlvYWRkciwgREFUQV9QT1JUKTsKQEAgLTE5NzQsNyArMTk3NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZAordm9pZCBfX2V4aXQKIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2NzODl4MCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZTYwMC5jIGIvZHJpdmVycy9uZXQvZGU2MDAuYwppbmRleCA2OTBiYjQwLi44Mzk2ZTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZTYwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlNjAwLmMKQEAgLTQzLDcgKzQzLDYgQEAKICAqIG1vZGlmeSB0aGUgZm9sbG93aW5nICIjZGVmaW5lIjogKHNlZSA8YXNtL2lvLmg+IGZvciBtb3JlIGluZm8pCiAjZGVmaW5lIFJFQUxMWV9TTE9XX0lPCiAgKi8KLSNkZWZpbmUgU0xPV19JT19CWV9KVU1QSU5HIC8qIExvb2tzICJiZXR0ZXIiIHRoYW4gZHVtbXkgd3JpdGUgdG8gcG9ydCAweDgwIDotKSAqLwogCiAvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KICNpZmRlZiBERTYwMF9ERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGVjbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2RlY2xhbmNlLmMKaW5kZXggMDBlMmE4YS4uNGFlMGZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGVjbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9kZWNsYW5jZS5jCkBAIC00MCw2ICs0MCwxMCBAQAogICoKICAqICAgICAgdjAuMDA5OiBNb2R1bGUgc3VwcG9ydCBmaXhlcywgbXVsdGlwbGUgaW50ZXJmYWNlcyBzdXBwb3J0LCB2YXJpb3VzCiAgKiAgICAgICAgICAgICAgYml0cy4gbWFjcm8KKyAqCisgKiAgICAgIHYwLjAxMDogRml4ZXMgZm9yIHRoZSBQTUFEIG1hcHBpbmcgb2YgdGhlIExBTkNFIGJ1ZmZlciBhbmQgZm9yIHRoZQorICogICAgICAgICAgICAgIFBNQVggcmVxdWlyZW1lbnQgdG8gb25seSB1c2UgaGFsZndvcmQgYWNjZXNzZXMgdG8gdGhlCisgKiAgICAgICAgICAgICAgYnVmZmVyLiBtYWNybwogICovCiAKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgpAQCAtNTQsNiArNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC02Nyw3ICs3Miw3IEBACiAjaW5jbHVkZSA8YXNtL2RlYy90Yy5oPgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9Ci0iZGVjbGFuY2UuYzogdjAuMDA5IGJ5IExpbnV4IE1JUFMgREVDc3RhdGlvbiB0YXNrIGZvcmNlXG4iOworImRlY2xhbmNlLmM6IHYwLjAxMCBieSBMaW51eCBNSVBTIERFQ3N0YXRpb24gdGFzayBmb3JjZVxuIjsKIAogTU9EVUxFX0FVVEhPUigiTGludXggTUlQUyBERUNzdGF0aW9uIHRhc2sgZm9yY2UiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiREVDIExBTkNFIChERUNzdGF0aW9uIG9uYm9hcmQsIFBNQUQteHgpIGRyaXZlciIpOwpAQCAtMTEwLDI0ICsxMTUsMjUgQEAKICNkZWZpbmUJTEVfQzNfQkNPTgkweDEJLyogQnl0ZSBjb250cm9sICovCiAKIC8qIFJlY2VpdmUgbWVzc2FnZSBkZXNjcmlwdG9yIDEgKi8KLSNkZWZpbmUgTEVfUjFfT1dOICAgICAgIDB4ODAJLyogV2hvIG93bnMgdGhlIGVudHJ5ICovCi0jZGVmaW5lIExFX1IxX0VSUiAgICAgICAweDQwCS8qIEVycm9yOiBpZiBGUkEsIE9GTCwgQ1JDIG9yIEJVRiBpcyBzZXQgKi8KLSNkZWZpbmUgTEVfUjFfRlJBICAgICAgIDB4MjAJLyogRlJBOiBGcmFtZSBlcnJvciAqLwotI2RlZmluZSBMRV9SMV9PRkwgICAgICAgMHgxMAkvKiBPRkw6IEZyYW1lIG92ZXJmbG93ICovCi0jZGVmaW5lIExFX1IxX0NSQyAgICAgICAweDA4CS8qIENSQyBlcnJvciAqLwotI2RlZmluZSBMRV9SMV9CVUYgICAgICAgMHgwNAkvKiBCVUY6IEJ1ZmZlciBlcnJvciAqLwotI2RlZmluZSBMRV9SMV9TT1AgICAgICAgMHgwMgkvKiBTdGFydCBvZiBwYWNrZXQgKi8KLSNkZWZpbmUgTEVfUjFfRU9QICAgICAgIDB4MDEJLyogRW5kIG9mIHBhY2tldCAqLwotI2RlZmluZSBMRV9SMV9QT0sgICAgICAgMHgwMwkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworI2RlZmluZSBMRV9SMV9PV04JMHg4MDAwCS8qIFdobyBvd25zIHRoZSBlbnRyeSAqLworI2RlZmluZSBMRV9SMV9FUlIJMHg0MDAwCS8qIEVycm9yOiBpZiBGUkEsIE9GTCwgQ1JDIG9yIEJVRiBpcyBzZXQgKi8KKyNkZWZpbmUgTEVfUjFfRlJBCTB4MjAwMAkvKiBGUkE6IEZyYW1lIGVycm9yICovCisjZGVmaW5lIExFX1IxX09GTAkweDEwMDAJLyogT0ZMOiBGcmFtZSBvdmVyZmxvdyAqLworI2RlZmluZSBMRV9SMV9DUkMJMHgwODAwCS8qIENSQyBlcnJvciAqLworI2RlZmluZSBMRV9SMV9CVUYJMHgwNDAwCS8qIEJVRjogQnVmZmVyIGVycm9yICovCisjZGVmaW5lIExFX1IxX1NPUAkweDAyMDAJLyogU3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIExFX1IxX0VPUAkweDAxMDAJLyogRW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9SMV9QT0sJMHgwMzAwCS8qIFBhY2tldCBpcyBjb21wbGV0ZTogU09QICsgRU9QICovCiAKLSNkZWZpbmUgTEVfVDFfT1dOICAgICAgIDB4ODAJLyogTGFuY2Ugb3ducyB0aGUgcGFja2V0ICovCi0jZGVmaW5lIExFX1QxX0VSUiAgICAgICAweDQwCS8qIEVycm9yIHN1bW1hcnkgKi8KLSNkZWZpbmUgTEVfVDFfRU1PUkUgICAgIDB4MTAJLyogRXJyb3I6IG1vcmUgdGhhbiBvbmUgcmV0cnkgbmVlZGVkICovCi0jZGVmaW5lIExFX1QxX0VPTkUgICAgICAweDA4CS8qIEVycm9yOiBvbmUgcmV0cnkgbmVlZGVkICovCi0jZGVmaW5lIExFX1QxX0VERUYgICAgICAweDA0CS8qIEVycm9yOiBkZWZlcnJlZCAqLwotI2RlZmluZSBMRV9UMV9TT1AgICAgICAgMHgwMgkvKiBTdGFydCBvZiBwYWNrZXQgKi8KLSNkZWZpbmUgTEVfVDFfRU9QICAgICAgIDB4MDEJLyogRW5kIG9mIHBhY2tldCAqLwotI2RlZmluZSBMRV9UMV9QT0sJMHgwMwkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworLyogVHJhbnNtaXQgbWVzc2FnZSBkZXNjcmlwdG9yIDEgKi8KKyNkZWZpbmUgTEVfVDFfT1dOCTB4ODAwMAkvKiBMYW5jZSBvd25zIHRoZSBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfVDFfRVJSCTB4NDAwMAkvKiBFcnJvciBzdW1tYXJ5ICovCisjZGVmaW5lIExFX1QxX0VNT1JFCTB4MTAwMAkvKiBFcnJvcjogbW9yZSB0aGFuIG9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgTEVfVDFfRU9ORQkweDA4MDAJLyogRXJyb3I6IG9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgTEVfVDFfRURFRgkweDA0MDAJLyogRXJyb3I6IGRlZmVycmVkICovCisjZGVmaW5lIExFX1QxX1NPUAkweDAyMDAJLyogU3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VPUAkweDAxMDAJLyogRW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9UMV9QT0sJMHgwMzAwCS8qIFBhY2tldCBpcyBjb21wbGV0ZTogU09QICsgRU9QICovCiAKICNkZWZpbmUgTEVfVDNfQlVGICAgICAgIDB4ODAwMAkvKiBCdWZmZXIgZXJyb3IgKi8KICNkZWZpbmUgTEVfVDNfVUZMICAgICAgIDB4NDAwMAkvKiBFcnJvciB1bmRlcmZsb3cgKi8KQEAgLTE1Niw2OSArMTYyLDU3IEBACiAjdW5kZWYgVEVTVF9ISVRTCiAjZGVmaW5lIFpFUk8gMAogCi0vKiBUaGUgRFMyMDAwLzMwMDAgaGF2ZSBhIGxpbmVhciA2NCBLQiBidWZmZXIuCi0KLSAqIFRoZSBQTUFELUFBIGhhcyAxMjgga2IgYnVmZmVyIG9uLWJvYXJkLgorLyoKKyAqIFRoZSBEUzIxMDAvMzEwMCBoYXZlIGEgbGluZWFyIDY0IGtCIGJ1ZmZlciB3aGljaCBzdXBwb3J0cyBoYWxmd29yZAorICogYWNjZXNzZXMgb25seS4gIEVhY2ggaGFsZndvcmQgb2YgdGhlIGJ1ZmZlciBpcyB3b3JkLWFsaWduZWQgaW4gdGhlCisgKiBDUFUgYWRkcmVzcyBzcGFjZS4KICAqCi0gKiBUaGUgSU9BU0lDIExBTkNFIGRldmljZXMgdXNlIGEgc2hhcmVkIG1lbW9yeSByZWdpb24uIFRoaXMgcmVnaW9uIGFzIHNlZW4KLSAqIGZyb20gdGhlIENQVSBpcyAobWF4KSAxMjggS0IgbG9uZyBhbmQgaGFzIHRvIGJlIG9uIGFuIDEyOCBLQiBib3VuZGFyeS4KLSAqIFRoZSBMQU5DRSBzZWVzIHRoaXMgYXMgYSA2NCBLQiBsb25nIGNvbnRpbnVvdXMgbWVtb3J5IHJlZ2lvbi4KKyAqIFRoZSBQTUFELUFBIGhhcyBhIDEyOCBrQiBidWZmZXIgb24tYm9hcmQuCiAgKgotICogVGhlIExBTkNFJ3MgRE1BIGFkZHJlc3MgaXMgdXNlZCBhcyBhbiBpbmRleCBpbiB0aGlzIGJ1ZmZlciBhbmQgRE1BIHRha2VzCi0gKiBwbGFjZSBpbiBidXJzdHMgb2YgZWlnaHQgMTYtQml0IHdvcmRzIHdoaWNoIGFyZSBwYWNrZWQgaW50byBmb3VyIDMyLUJpdCB3b3JkcwotICogYnkgdGhlIElPQVNJQy4gVGhpcyBsZWFkcyB0byBhIHN0cmFuZ2UgcGFkZGluZzogMTYgYnl0ZXMgb2YgdmFsaWQgZGF0YSBmb2xsb3dlZAotICogYnkgYSAxNiBieXRlIGdhcCA6LSguCisgKiBUaGUgSU9BU0lDIExBTkNFIGRldmljZXMgdXNlIGEgc2hhcmVkIG1lbW9yeSByZWdpb24uICBUaGlzIHJlZ2lvbgorICogYXMgc2VlbiBmcm9tIHRoZSBDUFUgaXMgKG1heCkgMTI4IGtCIGxvbmcgYW5kIGhhcyB0byBiZSBvbiBhbiAxMjgga0IKKyAqIGJvdW5kYXJ5LiAgVGhlIExBTkNFIHNlZXMgdGhpcyBhcyBhIDY0IGtCIGxvbmcgY29udGludW91cyBtZW1vcnkKKyAqIHJlZ2lvbi4KKyAqCisgKiBUaGUgTEFOQ0UncyBETUEgYWRkcmVzcyBpcyB1c2VkIGFzIGFuIGluZGV4IGluIHRoaXMgYnVmZmVyIGFuZCBETUEKKyAqIHRha2VzIHBsYWNlIGluIGJ1cnN0cyBvZiBlaWdodCAxNi1iaXQgd29yZHMgd2hpY2ggYXJlIHBhY2tlZCBpbnRvCisgKiBmb3VyIDMyLWJpdCB3b3JkcyBieSB0aGUgSU9BU0lDLiAgVGhpcyBsZWFkcyB0byBhIHN0cmFuZ2UgcGFkZGluZzoKKyAqIDE2IGJ5dGVzIG9mIHZhbGlkIGRhdGEgZm9sbG93ZWQgYnkgYSAxNiBieXRlIGdhcCA6LSguCiAgKi8KIAogc3RydWN0IGxhbmNlX3J4X2Rlc2MgewogCXVuc2lnbmVkIHNob3J0IHJtZDA7CQkvKiBsb3cgYWRkcmVzcyBvZiBwYWNrZXQgKi8KLQlzaG9ydCBnYXAwOwotCXVuc2lnbmVkIGNoYXIgcm1kMV9oYWRyOwkvKiBoaWdoIGFkZHJlc3Mgb2YgcGFja2V0ICovCi0JdW5zaWduZWQgY2hhciBybWQxX2JpdHM7CS8qIGRlc2NyaXB0b3IgYml0cyAqLwotCXNob3J0IGdhcDE7CisJdW5zaWduZWQgc2hvcnQgcm1kMTsJCS8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQKKwkJCQkJICAgYW5kIGRlc2NyaXB0b3IgYml0cyAqLwogCXNob3J0IGxlbmd0aDsJCQkvKiAycyBjb21wbGVtZW50IChuZWdhdGl2ZSEpCiAJCQkJCSAgIG9mIGJ1ZmZlciBsZW5ndGggKi8KLQlzaG9ydCBnYXAyOwogCXVuc2lnbmVkIHNob3J0IG1ibGVuZ3RoOwkvKiBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkICovCi0Jc2hvcnQgZ2FwMzsKIH07CiAKIHN0cnVjdCBsYW5jZV90eF9kZXNjIHsKIAl1bnNpZ25lZCBzaG9ydCB0bWQwOwkJLyogbG93IGFkZHJlc3Mgb2YgcGFja2V0ICovCi0Jc2hvcnQgZ2FwMDsKLQl1bnNpZ25lZCBjaGFyIHRtZDFfaGFkcjsJLyogaGlnaCBhZGRyZXNzIG9mIHBhY2tldCAqLwotCXVuc2lnbmVkIGNoYXIgdG1kMV9iaXRzOwkvKiBkZXNjcmlwdG9yIGJpdHMgKi8KLQlzaG9ydCBnYXAxOworCXVuc2lnbmVkIHNob3J0IHRtZDE7CQkvKiBoaWdoIGFkZHJlc3Mgb2YgcGFja2V0CisJCQkJCSAgIGFuZCBkZXNjcmlwdG9yIGJpdHMgKi8KIAlzaG9ydCBsZW5ndGg7CQkJLyogMnMgY29tcGxlbWVudCAobmVnYXRpdmUhKQogCQkJCQkgICBvZiBidWZmZXIgbGVuZ3RoICovCi0Jc2hvcnQgZ2FwMjsKIAl1bnNpZ25lZCBzaG9ydCBtaXNjOwotCXNob3J0IGdhcDM7CiB9OwogCiAKIC8qIEZpcnN0IHBhcnQgb2YgdGhlIExBTkNFIGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCiBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CiAJdW5zaWduZWQgc2hvcnQgbW9kZTsJCS8qIHByZS1zZXQgbW9kZSAocmVnLiAxNSkgKi8KLQlzaG9ydCBnYXAwOwogCi0JdW5zaWduZWQgY2hhciBwaHlzX2FkZHJbMTJdOwkvKiBwaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzCi0JCQkJCSAgIG9ubHkgMCwgMSwgNCwgNSwgOCwgOSBhcmUgdmFsaWQKLQkJCQkJICAgMiwgMywgNiwgNywgMTAsIDExIGFyZSBnYXBzICovCi0JdW5zaWduZWQgc2hvcnQgZmlsdGVyWzhdOwkvKiBtdWx0aWNhc3QgZmlsdGVyCi0JCQkJCSAgIG9ubHkgMCwgMiwgNCwgNiBhcmUgdmFsaWQKLQkJCQkJICAgMSwgMywgNSwgNyBhcmUgZ2FwcyAqLworCXVuc2lnbmVkIHNob3J0IHBoeXNfYWRkclszXTsJLyogcGh5c2ljYWwgZXRoZXJuZXQgYWRkcmVzcyAqLworCXVuc2lnbmVkIHNob3J0IGZpbHRlcls0XTsJLyogbXVsdGljYXN0IGZpbHRlciAqLwogCiAJLyogUmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZyBiYXNlLCBhbG9uZyB3aXRoIGV4dHJhIGJpdHMuICovCiAJdW5zaWduZWQgc2hvcnQgcnhfcHRyOwkJLyogcmVjZWl2ZSBkZXNjcmlwdG9yIGFkZHIgKi8KLQlzaG9ydCBnYXAxOwogCXVuc2lnbmVkIHNob3J0IHJ4X2xlbjsJCS8qIHJlY2VpdmUgbGVuIGFuZCBoaWdoIGFkZHIgKi8KLQlzaG9ydCBnYXAyOwogCXVuc2lnbmVkIHNob3J0IHR4X3B0cjsJCS8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYWRkciAqLwotCXNob3J0IGdhcDM7CiAJdW5zaWduZWQgc2hvcnQgdHhfbGVuOwkJLyogdHJhbnNtaXQgbGVuIGFuZCBoaWdoIGFkZHIgKi8KLQlzaG9ydCBnYXA0OwotCXNob3J0IGdhcDVbOF07CisKKwlzaG9ydCBnYXBbNF07CiAKIAkvKiBUaGUgYnVmZmVyIGRlc2NyaXB0b3JzICovCiAJc3RydWN0IGxhbmNlX3J4X2Rlc2MgYnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKQEAgLTIyNiwxNSArMjIwLDI4IEBACiB9OwogCiAjZGVmaW5lIEJVRl9PRkZTRVRfQ1BVIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jaykKLSNkZWZpbmUgQlVGX09GRlNFVF9MTkMgKHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayk+PjEpCisjZGVmaW5lIEJVRl9PRkZTRVRfTE5DIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jaykKIAotI2RlZmluZSBsaWJkZXNjX29mZnNldChydCwgZWxlbSkgXAotKChfX3UzMikoKCh1bnNpZ25lZCBsb25nKSgmKCgoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikwKS0+cnRbZWxlbV0pKSkpKQorI2RlZmluZSBzaGlmdF9vZmYob2ZmLCB0eXBlKQkJCQkJCVwKKwkodHlwZSA9PSBBU0lDX0xBTkNFIHx8IHR5cGUgPT0gUE1BWF9MQU5DRSA/IG9mZiA8PCAxIDogb2ZmKQogCi0vKgotICogVGhpcyB3b3JrcyAqb25seSogZm9yIHRoZSByaW5nIGRlc2NyaXB0b3JzCi0gKi8KLSNkZWZpbmUgTEFOQ0VfQUREUih4KSAoQ1BIWVNBRERSKHgpID4+IDEpCisjZGVmaW5lIGxpYl9vZmYocnQsIHR5cGUpCQkJCQkJXAorCXNoaWZ0X29mZihvZmZzZXRvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jaywgcnQpLCB0eXBlKQorCisjZGVmaW5lIGxpYl9wdHIoaWIsIHJ0LCB0eXBlKSAJCQkJCQlcCisJKCh2b2xhdGlsZSB1MTYgKikoKHU4ICopKGliKSArIGxpYl9vZmYocnQsIHR5cGUpKSkKKworI2RlZmluZSByZHNfb2ZmKHJ0LCB0eXBlKQkJCQkJCVwKKwlzaGlmdF9vZmYob2Zmc2V0b2Yoc3RydWN0IGxhbmNlX3J4X2Rlc2MsIHJ0KSwgdHlwZSkKKworI2RlZmluZSByZHNfcHRyKHJkLCBydCwgdHlwZSkgCQkJCQkJXAorCSgodm9sYXRpbGUgdTE2ICopKCh1OCAqKShyZCkgKyByZHNfb2ZmKHJ0LCB0eXBlKSkpCisKKyNkZWZpbmUgdGRzX29mZihydCwgdHlwZSkJCQkJCQlcCisJc2hpZnRfb2ZmKG9mZnNldG9mKHN0cnVjdCBsYW5jZV90eF9kZXNjLCBydCksIHR5cGUpCisKKyNkZWZpbmUgdGRzX3B0cih0ZCwgcnQsIHR5cGUpIAkJCQkJCVwKKwkoKHZvbGF0aWxlIHUxNiAqKSgodTggKikodGQpICsgdGRzX29mZihydCwgdHlwZSkpKQogCiBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5leHQ7CkBAIC0yNDIsNyArMjQ5LDYgQEAKIAlpbnQgc2xvdDsKIAlpbnQgZG1hX2lycTsKIAl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGw7Ci0Jdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmluaXRfYmxvY2s7CiAKIAlzcGlubG9ja190CWxvY2s7CiAKQEAgLTI2MCw4ICsyNjYsOCBAQAogCWNoYXIgKnR4X2J1Zl9wdHJfY3B1W1RYX1JJTkdfU0laRV07CiAKIAkvKiBQb2ludGVycyB0byB0aGUgcmluZyBidWZmZXJzIGFzIHNlZW4gZnJvbSB0aGUgTEFOQ0UgKi8KLQljaGFyICpyeF9idWZfcHRyX2xuY1tSWF9SSU5HX1NJWkVdOwotCWNoYXIgKnR4X2J1Zl9wdHJfbG5jW1RYX1JJTkdfU0laRV07CisJdWludCByeF9idWZfcHRyX2xuY1tSWF9SSU5HX1NJWkVdOworCXVpbnQgdHhfYnVmX3B0cl9sbmNbVFhfUklOR19TSVpFXTsKIH07CiAKICNkZWZpbmUgVFhfQlVGRlNfQVZBSUwgKChscC0+dHhfb2xkPD1scC0+dHhfbmV3KT9cCkBAIC0yOTQsNyArMzAwLDcgQEAKIHN0YXRpYyB2b2lkIGxvYWRfY3NycyhzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCiB7CiAJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOwotCWludCBsZXB0cjsKKwl1aW50IGxlcHRyOwogCiAJLyogVGhlIGFkZHJlc3Mgc3BhY2UgYXMgc2VlbiBmcm9tIHRoZSBMQU5DRQogCSAqIGJlZ2lucyBhdCBhZGRyZXNzIDAuIEhLCkBAIC0zMTYsMTIgKzMyMiwxNCBAQAogICogT3VyIHNwZWNpYWxpemVkIGNvcHkgcm91dGluZXMKICAqCiAgKi8KLXZvaWQgY3BfdG9fYnVmKGNvbnN0IGludCB0eXBlLCB2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIGNwX3RvX2J1Zihjb25zdCBpbnQgdHlwZSwgdm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGludCBsZW4pCiB7CiAJdW5zaWduZWQgc2hvcnQgKnRwLCAqZnAsIGNsZW47CiAJdW5zaWduZWQgY2hhciAqcnRwLCAqcmZwOwogCi0JaWYgKHR5cGUgPT0gUE1BWF9MQU5DRSkgeworCWlmICh0eXBlID09IFBNQURfTEFOQ0UpIHsKKwkJbWVtY3B5KHRvLCBmcm9tLCBsZW4pOworCX0gZWxzZSBpZiAodHlwZSA9PSBQTUFYX0xBTkNFKSB7CiAJCWNsZW4gPSBsZW4gPj4gMTsKIAkJdHAgPSAodW5zaWduZWQgc2hvcnQgKikgdG87CiAJCWZwID0gKHVuc2lnbmVkIHNob3J0ICopIGZyb207CkBAIC0zNzAsMTIgKzM3OCwxNCBAQAogCWlvYigpOwogfQogCi12b2lkIGNwX2Zyb21fYnVmKGNvbnN0IGludCB0eXBlLCB2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIGNwX2Zyb21fYnVmKGNvbnN0IGludCB0eXBlLCB2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBzaG9ydCAqdHAsICpmcCwgY2xlbjsKIAl1bnNpZ25lZCBjaGFyICpydHAsICpyZnA7CiAKLQlpZiAodHlwZSA9PSBQTUFYX0xBTkNFKSB7CisJaWYgKHR5cGUgPT0gUE1BRF9MQU5DRSkgeworCQltZW1jcHkodG8sIGZyb20sIGxlbik7CisJfSBlbHNlIGlmICh0eXBlID09IFBNQVhfTEFOQ0UpIHsKIAkJY2xlbiA9IGxlbiA+PiAxOwogCQl0cCA9ICh1bnNpZ25lZCBzaG9ydCAqKSB0bzsKIAkJZnAgPSAodW5zaWduZWQgc2hvcnQgKikgZnJvbTsKQEAgLTQzMSwxMiArNDQxLDEwIEBACiBzdGF0aWMgdm9pZCBsYW5jZV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYjsKLQlpbnQgbGVwdHI7CisJdm9sYXRpbGUgdTE2ICppYiA9ICh2b2xhdGlsZSB1MTYgKilkZXYtPm1lbV9zdGFydDsKKwl1aW50IGxlcHRyOwogCWludCBpOwogCi0JaWIgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikgKGRldi0+bWVtX3N0YXJ0KTsKLQogCS8qIExvY2sgb3V0IG90aGVyIHByb2Nlc3NlcyB3aGlsZSBzZXR0aW5nIHVwIGhhcmR3YXJlICovCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCWxwLT5yeF9uZXcgPSBscC0+dHhfbmV3ID0gMDsKQEAgLTQ0NSw1NSArNDUzLDY0IEBACiAJLyogQ29weSB0aGUgZXRoZXJuZXQgYWRkcmVzcyB0byB0aGUgbGFuY2UgaW5pdCBibG9jay4KIAkgKiBYWFggYml0IDAgb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaXN0ZXJzIGhhcyB0byBiZSB6ZXJvCiAJICovCi0JaWItPnBoeXNfYWRkclswXSA9IGRldi0+ZGV2X2FkZHJbMF07Ci0JaWItPnBoeXNfYWRkclsxXSA9IGRldi0+ZGV2X2FkZHJbMV07Ci0JaWItPnBoeXNfYWRkcls0XSA9IGRldi0+ZGV2X2FkZHJbMl07Ci0JaWItPnBoeXNfYWRkcls1XSA9IGRldi0+ZGV2X2FkZHJbM107Ci0JaWItPnBoeXNfYWRkcls4XSA9IGRldi0+ZGV2X2FkZHJbNF07Ci0JaWItPnBoeXNfYWRkcls5XSA9IGRldi0+ZGV2X2FkZHJbNV07CisJKmxpYl9wdHIoaWIsIHBoeXNfYWRkclswXSwgbHAtPnR5cGUpID0gKGRldi0+ZGV2X2FkZHJbMV0gPDwgOCkgfAorCQkJCSAgICAgZGV2LT5kZXZfYWRkclswXTsKKwkqbGliX3B0cihpYiwgcGh5c19hZGRyWzFdLCBscC0+dHlwZSkgPSAoZGV2LT5kZXZfYWRkclszXSA8PCA4KSB8CisJCQkJICAgICBkZXYtPmRldl9hZGRyWzJdOworCSpsaWJfcHRyKGliLCBwaHlzX2FkZHJbMl0sIGxwLT50eXBlKSA9IChkZXYtPmRldl9hZGRyWzVdIDw8IDgpIHwKKwkJCQkgICAgIGRldi0+ZGV2X2FkZHJbNF07CiAJLyogU2V0dXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCiAKIAkvKiBTZXR1cCByeCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KLQlsZXB0ciA9IExBTkNFX0FERFIobGliZGVzY19vZmZzZXQoYnJ4X3JpbmcsIDApKTsKLQlpYi0+cnhfbGVuID0gKExBTkNFX0xPR19SWF9CVUZGRVJTIDw8IDEzKSB8IChsZXB0ciA+PiAxNik7Ci0JaWItPnJ4X3B0ciA9IGxlcHRyOworCWxlcHRyID0gb2Zmc2V0b2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2ssIGJyeF9yaW5nKTsKKwkqbGliX3B0cihpYiwgcnhfbGVuLCBscC0+dHlwZSkgPSAoTEFOQ0VfTE9HX1JYX0JVRkZFUlMgPDwgMTMpIHwKKwkJCQkJIChsZXB0ciA+PiAxNik7CisJKmxpYl9wdHIoaWIsIHJ4X3B0ciwgbHAtPnR5cGUpID0gbGVwdHI7CiAJaWYgKFpFUk8pCi0JCXByaW50aygiUlggcHRyOiAlOC44eCglOC44eClcbiIsIGxlcHRyLCBsaWJkZXNjX29mZnNldChicnhfcmluZywgMCkpOworCQlwcmludGsoIlJYIHB0cjogJTguOHgoJTguOHgpXG4iLAorCQkgICAgICAgbGVwdHIsIGxpYl9vZmYoYnJ4X3JpbmcsIGxwLT50eXBlKSk7CiAKIAkvKiBTZXR1cCB0eCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KLQlsZXB0ciA9IExBTkNFX0FERFIobGliZGVzY19vZmZzZXQoYnR4X3JpbmcsIDApKTsKLQlpYi0+dHhfbGVuID0gKExBTkNFX0xPR19UWF9CVUZGRVJTIDw8IDEzKSB8IChsZXB0ciA+PiAxNik7Ci0JaWItPnR4X3B0ciA9IGxlcHRyOworCWxlcHRyID0gb2Zmc2V0b2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2ssIGJ0eF9yaW5nKTsKKwkqbGliX3B0cihpYiwgdHhfbGVuLCBscC0+dHlwZSkgPSAoTEFOQ0VfTE9HX1RYX0JVRkZFUlMgPDwgMTMpIHwKKwkJCQkJIChsZXB0ciA+PiAxNik7CisJKmxpYl9wdHIoaWIsIHR4X3B0ciwgbHAtPnR5cGUpID0gbGVwdHI7CiAJaWYgKFpFUk8pCi0JCXByaW50aygiVFggcHRyOiAlOC44eCglOC44eClcbiIsIGxlcHRyLCBsaWJkZXNjX29mZnNldChidHhfcmluZywgMCkpOworCQlwcmludGsoIlRYIHB0cjogJTguOHgoJTguOHgpXG4iLAorCQkgICAgICAgbGVwdHIsIGxpYl9vZmYoYnR4X3JpbmcsIGxwLT50eXBlKSk7CiAKIAlpZiAoWkVSTykKIAkJcHJpbnRrKCJUWCByaW5nczpcbiIpOwogCiAJLyogU2V0dXAgdGhlIFR4IHJpbmcgZW50cmllcyAqLwogCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgewotCQlsZXB0ciA9IChpbnQpIGxwLT50eF9idWZfcHRyX2xuY1tpXTsKLQkJaWItPmJ0eF9yaW5nW2ldLnRtZDAgPSBsZXB0cjsKLQkJaWItPmJ0eF9yaW5nW2ldLnRtZDFfaGFkciA9IGxlcHRyID4+IDE2OwotCQlpYi0+YnR4X3JpbmdbaV0udG1kMV9iaXRzID0gMDsKLQkJaWItPmJ0eF9yaW5nW2ldLmxlbmd0aCA9IDB4ZjAwMDsJLyogVGhlIG9uZXMgcmVxdWlyZWQgYnkgdG1kMiAqLwotCQlpYi0+YnR4X3JpbmdbaV0ubWlzYyA9IDA7CisJCWxlcHRyID0gbHAtPnR4X2J1Zl9wdHJfbG5jW2ldOworCQkqbGliX3B0cihpYiwgYnR4X3JpbmdbaV0udG1kMCwgbHAtPnR5cGUpID0gbGVwdHI7CisJCSpsaWJfcHRyKGliLCBidHhfcmluZ1tpXS50bWQxLCBscC0+dHlwZSkgPSAobGVwdHIgPj4gMTYpICYKKwkJCQkJCQkgICAweGZmOworCQkqbGliX3B0cihpYiwgYnR4X3JpbmdbaV0ubGVuZ3RoLCBscC0+dHlwZSkgPSAweGYwMDA7CisJCQkJCQkvKiBUaGUgb25lcyByZXF1aXJlZCBieSB0bWQyICovCisJCSpsaWJfcHRyKGliLCBidHhfcmluZ1tpXS5taXNjLCBscC0+dHlwZSkgPSAwOwogCQlpZiAoaSA8IDMgJiYgWkVSTykKLQkJCXByaW50aygiJWQ6IDB4JTguOHgoMHglOC44eClcbiIsIGksIGxlcHRyLCAoaW50KSBscC0+dHhfYnVmX3B0cl9jcHVbaV0pOworCQkJcHJpbnRrKCIlZDogMHglOC44eCgweCU4Ljh4KVxuIiwKKwkJCSAgICAgICBpLCBsZXB0ciwgKHVpbnQpbHAtPnR4X2J1Zl9wdHJfY3B1W2ldKTsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgUnggcmluZyBlbnRyaWVzICovCiAJaWYgKFpFUk8pCiAJCXByaW50aygiUlggcmluZ3M6XG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKLQkJbGVwdHIgPSAoaW50KSBscC0+cnhfYnVmX3B0cl9sbmNbaV07Ci0JCWliLT5icnhfcmluZ1tpXS5ybWQwID0gbGVwdHI7Ci0JCWliLT5icnhfcmluZ1tpXS5ybWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKLQkJaWItPmJyeF9yaW5nW2ldLnJtZDFfYml0cyA9IExFX1IxX09XTjsKLQkJaWItPmJyeF9yaW5nW2ldLmxlbmd0aCA9IC1SWF9CVUZGX1NJWkUgfCAweGYwMDA7Ci0JCWliLT5icnhfcmluZ1tpXS5tYmxlbmd0aCA9IDA7CisJCWxlcHRyID0gbHAtPnJ4X2J1Zl9wdHJfbG5jW2ldOworCQkqbGliX3B0cihpYiwgYnJ4X3JpbmdbaV0ucm1kMCwgbHAtPnR5cGUpID0gbGVwdHI7CisJCSpsaWJfcHRyKGliLCBicnhfcmluZ1tpXS5ybWQxLCBscC0+dHlwZSkgPSAoKGxlcHRyID4+IDE2KSAmCisJCQkJCQkJICAgIDB4ZmYpIHwKKwkJCQkJCQkgICBMRV9SMV9PV047CisJCSpsaWJfcHRyKGliLCBicnhfcmluZ1tpXS5sZW5ndGgsIGxwLT50eXBlKSA9IC1SWF9CVUZGX1NJWkUgfAorCQkJCQkJCSAgICAgMHhmMDAwOworCQkqbGliX3B0cihpYiwgYnJ4X3JpbmdbaV0ubWJsZW5ndGgsIGxwLT50eXBlKSA9IDA7CiAJCWlmIChpIDwgMyAmJiBaRVJPKQotCQkJcHJpbnRrKCIlZDogMHglOC44eCgweCU4Ljh4KVxuIiwgaSwgbGVwdHIsIChpbnQpIGxwLT5yeF9idWZfcHRyX2NwdVtpXSk7CisJCQlwcmludGsoIiVkOiAweCU4Ljh4KDB4JTguOHgpXG4iLAorCQkJICAgICAgIGksIGxlcHRyLCAodWludClscC0+cnhfYnVmX3B0cl9jcHVbaV0pOwogCX0KIAlpb2IoKTsKIH0KQEAgLTUxMSwxMSArNTI4LDEzIEBACiAJCXVkZWxheSgxMCk7CiAJfQogCWlmICgoaSA9PSAxMDApIHx8IChsbC0+cmRwICYgTEVfQzBfRVJSKSkgewotCQlwcmludGsoIkxBTkNFIHVub3BlbmVkIGFmdGVyICVkIHRpY2tzLCBjc3IwPSU0LjR4LlxuIiwgaSwgbGwtPnJkcCk7CisJCXByaW50aygiTEFOQ0UgdW5vcGVuZWQgYWZ0ZXIgJWQgdGlja3MsIGNzcjA9JTQuNHguXG4iLAorCQkgICAgICAgaSwgbGwtPnJkcCk7CiAJCXJldHVybiAtMTsKIAl9CiAJaWYgKChsbC0+cmRwICYgTEVfQzBfRVJSKSkgewotCQlwcmludGsoIkxBTkNFIHVub3BlbmVkIGFmdGVyICVkIHRpY2tzLCBjc3IwPSU0LjR4LlxuIiwgaSwgbGwtPnJkcCk7CisJCXByaW50aygiTEFOQ0UgdW5vcGVuZWQgYWZ0ZXIgJWQgdGlja3MsIGNzcjA9JTQuNHguXG4iLAorCQkgICAgICAgaSwgbGwtPnJkcCk7CiAJCXJldHVybiAtMTsKIAl9CiAJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX0lET04pOwpAQCAtNTI4LDEyICs1NDcsMTEgQEAKIHN0YXRpYyBpbnQgbGFuY2Vfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYjsKLQl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcnhfZGVzYyAqcmQgPSAwOwotCXVuc2lnbmVkIGNoYXIgYml0czsKLQlpbnQgbGVuID0gMDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gMDsKLQlpYiA9IChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKSAoZGV2LT5tZW1fc3RhcnQpOworCXZvbGF0aWxlIHUxNiAqaWIgPSAodm9sYXRpbGUgdTE2ICopZGV2LT5tZW1fc3RhcnQ7CisJdm9sYXRpbGUgdTE2ICpyZDsKKwl1bnNpZ25lZCBzaG9ydCBiaXRzOworCWludCBlbnRyeSwgbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CiAKICNpZmRlZiBURVNUX0hJVFMKIAl7CkBAIC01NDIsMTkgKzU2MCwyMiBAQAogCQlwcmludGsoIlsiKTsKIAkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CiAJCQlpZiAoaSA9PSBscC0+cnhfbmV3KQotCQkJCXByaW50aygiJXMiLCBpYi0+YnJ4X3JpbmdbaV0ucm1kMV9iaXRzICYKKwkJCQlwcmludGsoIiVzIiwgKmxpYl9wdHIoaWIsIGJyeF9yaW5nW2ldLnJtZDEsCisJCQkJCQkgICAgICBscC0+dHlwZSkgJgogCQkJCQkgICAgIExFX1IxX09XTiA/ICJfIiA6ICJYIik7CiAJCQllbHNlCi0JCQkJcHJpbnRrKCIlcyIsIGliLT5icnhfcmluZ1tpXS5ybWQxX2JpdHMgJgorCQkJCXByaW50aygiJXMiLCAqbGliX3B0cihpYiwgYnJ4X3JpbmdbaV0ucm1kMSwKKwkJCQkJCSAgICAgIGxwLT50eXBlKSAmCiAJCQkJCSAgICAgTEVfUjFfT1dOID8gIi4iIDogIjEiKTsKIAkJfQogCQlwcmludGsoIl0iKTsKIAl9CiAjZW5kaWYKIAotCWZvciAocmQgPSAmaWItPmJyeF9yaW5nW2xwLT5yeF9uZXddOwotCSAgICAgISgoYml0cyA9IHJkLT5ybWQxX2JpdHMpICYgTEVfUjFfT1dOKTsKLQkgICAgIHJkID0gJmliLT5icnhfcmluZ1tscC0+cnhfbmV3XSkgeworCWZvciAocmQgPSBsaWJfcHRyKGliLCBicnhfcmluZ1tscC0+cnhfbmV3XSwgbHAtPnR5cGUpOworCSAgICAgISgoYml0cyA9ICpyZHNfcHRyKHJkLCBybWQxLCBscC0+dHlwZSkpICYgTEVfUjFfT1dOKTsKKwkgICAgIHJkID0gbGliX3B0cihpYiwgYnJ4X3JpbmdbbHAtPnJ4X25ld10sIGxwLT50eXBlKSkgeworCQllbnRyeSA9IGxwLT5yeF9uZXc7CiAKIAkJLyogV2UgZ290IGFuIGluY29tcGxldGUgZnJhbWU/ICovCiAJCWlmICgoYml0cyAmIExFX1IxX1BPSykgIT0gTEVfUjFfUE9LKSB7CkBAIC01NzUsMTYgKzU5NiwxOCBAQAogCQkJaWYgKGJpdHMgJiBMRV9SMV9FT1ApCiAJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQl9IGVsc2UgewotCQkJbGVuID0gKHJkLT5tYmxlbmd0aCAmIDB4ZmZmKSAtIDQ7CisJCQlsZW4gPSAoKnJkc19wdHIocmQsIG1ibGVuZ3RoLCBscC0+dHlwZSkgJiAweGZmZikgLSA0OwogCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKIAogCQkJaWYgKHNrYiA9PSAwKSB7CiAJCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAogCQkJCSAgICAgICBkZXYtPm5hbWUpOwogCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCQkJcmQtPm1ibGVuZ3RoID0gMDsKLQkJCQlyZC0+cm1kMV9iaXRzID0gTEVfUjFfT1dOOwotCQkJCWxwLT5yeF9uZXcgPSAobHAtPnJ4X25ldyArIDEpICYgUlhfUklOR19NT0RfTUFTSzsKKwkJCQkqcmRzX3B0cihyZCwgbWJsZW5ndGgsIGxwLT50eXBlKSA9IDA7CisJCQkJKnJkc19wdHIocmQsIHJtZDEsIGxwLT50eXBlKSA9CisJCQkJCSgobHAtPnJ4X2J1Zl9wdHJfbG5jW2VudHJ5XSA+PiAxNikgJgorCQkJCQkgMHhmZikgfCBMRV9SMV9PV047CisJCQkJbHAtPnJ4X25ldyA9IChlbnRyeSArIDEpICYgUlhfUklOR19NT0RfTUFTSzsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CkBAIC01OTQsOCArNjE3LDcgQEAKIAkJCXNrYl9wdXQoc2tiLCBsZW4pOwkvKiBtYWtlIHJvb20gKi8KIAogCQkJY3BfZnJvbV9idWYobHAtPnR5cGUsIHNrYi0+ZGF0YSwKLQkJCQkgICAgKGNoYXIgKilscC0+cnhfYnVmX3B0cl9jcHVbbHAtPnJ4X25ld10sCi0JCQkJICAgIGxlbik7CisJCQkJICAgIChjaGFyICopbHAtPnJ4X2J1Zl9wdHJfY3B1W2VudHJ5XSwgbGVuKTsKIAogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCW5ldGlmX3J4KHNrYik7CkBAIC02MDQsMTAgKzYyNiwxMSBAQAogCQl9CiAKIAkJLyogUmV0dXJuIHRoZSBwYWNrZXQgdG8gdGhlIHBvb2wgKi8KLQkJcmQtPm1ibGVuZ3RoID0gMDsKLQkJcmQtPmxlbmd0aCA9IC1SWF9CVUZGX1NJWkUgfCAweGYwMDA7Ci0JCXJkLT5ybWQxX2JpdHMgPSBMRV9SMV9PV047Ci0JCWxwLT5yeF9uZXcgPSAobHAtPnJ4X25ldyArIDEpICYgUlhfUklOR19NT0RfTUFTSzsKKwkJKnJkc19wdHIocmQsIG1ibGVuZ3RoLCBscC0+dHlwZSkgPSAwOworCQkqcmRzX3B0cihyZCwgbGVuZ3RoLCBscC0+dHlwZSkgPSAtUlhfQlVGRl9TSVpFIHwgMHhmMDAwOworCQkqcmRzX3B0cihyZCwgcm1kMSwgbHAtPnR5cGUpID0KKwkJCSgobHAtPnJ4X2J1Zl9wdHJfbG5jW2VudHJ5XSA+PiAxNikgJiAweGZmKSB8IExFX1IxX09XTjsKKwkJbHAtPnJ4X25ldyA9IChlbnRyeSArIDEpICYgUlhfUklOR19NT0RfTUFTSzsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC02MTUsMjQgKzYzOCwyNCBAQAogc3RhdGljIHZvaWQgbGFuY2VfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYjsKKwl2b2xhdGlsZSB1MTYgKmliID0gKHZvbGF0aWxlIHUxNiAqKWRldi0+bWVtX3N0YXJ0OwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKLQl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfdHhfZGVzYyAqdGQ7CisJdm9sYXRpbGUgdTE2ICp0ZDsKIAlpbnQgaSwgajsKIAlpbnQgc3RhdHVzOwotCWliID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopIChkZXYtPm1lbV9zdGFydCk7CisKIAlqID0gbHAtPnR4X29sZDsKIAogCXNwaW5fbG9jaygmbHAtPmxvY2spOwogCiAJZm9yIChpID0gajsgaSAhPSBscC0+dHhfbmV3OyBpID0gaikgewotCQl0ZCA9ICZpYi0+YnR4X3JpbmdbaV07CisJCXRkID0gbGliX3B0cihpYiwgYnR4X3JpbmdbaV0sIGxwLT50eXBlKTsKIAkJLyogSWYgd2UgaGl0IGEgcGFja2V0IG5vdCBvd25lZCBieSB1cywgc3RvcCAqLwotCQlpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX09XTikKKwkJaWYgKCp0ZHNfcHRyKHRkLCB0bWQxLCBscC0+dHlwZSkgJiBMRV9UMV9PV04pCiAJCQlicmVhazsKIAotCQlpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX0VSUikgewotCQkJc3RhdHVzID0gdGQtPm1pc2M7CisJCWlmICgqdGRzX3B0cih0ZCwgdG1kMSwgbHAtPnR5cGUpICYgTEVfVDFfRVJSKSB7CisJCQlzdGF0dXMgPSAqdGRzX3B0cih0ZCwgbWlzYywgbHAtPnR5cGUpOwogCiAJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQlpZiAoc3RhdHVzICYgTEVfVDNfUlRZKQpAQCAtNjY3LDE4ICs2OTAsMTkgQEAKIAkJCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfUE9LKSA9PSBMRV9UMV9QT0spIHsKKwkJfSBlbHNlIGlmICgoKnRkc19wdHIodGQsIHRtZDEsIGxwLT50eXBlKSAmIExFX1QxX1BPSykgPT0KKwkJCSAgIExFX1QxX1BPSykgewogCQkJLyoKIAkJCSAqIFNvIHdlIGRvbid0IGNvdW50IHRoZSBwYWNrZXQgbW9yZSB0aGFuIG9uY2UuCiAJCQkgKi8KLQkJCXRkLT50bWQxX2JpdHMgJj0gfihMRV9UMV9QT0spOworCQkJKnRkc19wdHIodGQsIHRtZDEsIGxwLT50eXBlKSAmPSB+KExFX1QxX1BPSyk7CiAKIAkJCS8qIE9uZSBjb2xsaXNpb24gYmVmb3JlIHBhY2tldCB3YXMgc2VudC4gKi8KLQkJCWlmICh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfRU9ORSkKKwkJCWlmICgqdGRzX3B0cih0ZCwgdG1kMSwgbHAtPnR5cGUpICYgTEVfVDFfRU9ORSkKIAkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOwogCiAJCQkvKiBNb3JlIHRoYW4gb25lIGNvbGxpc2lvbiwgYmUgb3B0aW1pc3RpYy4gKi8KLQkJCWlmICh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfRU1PUkUpCisJCQlpZiAoKnRkc19wdHIodGQsIHRtZDEsIGxwLT50eXBlKSAmIExFX1QxX0VNT1JFKQogCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IDI7CiAKIAkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CkBAIC03NTIsNyArNzc2LDcgQEAKIAogc3RhdGljIGludCBsYW5jZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopIChkZXYtPm1lbV9zdGFydCk7CisJdm9sYXRpbGUgdTE2ICppYiA9ICh2b2xhdGlsZSB1MTYgKilkZXYtPm1lbV9zdGFydDsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTc2OSwxMSArNzkzLDExIEBACiAJICoKIAkgKiBCVFcgaXQgaXMgY29tbW9uIGJ1ZyBpbiBhbGwgbGFuY2UgZHJpdmVycyEgLS1BTksKIAkgKi8KLQlpYi0+bW9kZSA9IDA7Ci0JaWItPmZpbHRlciBbMF0gPSAwOwotCWliLT5maWx0ZXIgWzJdID0gMDsKLQlpYi0+ZmlsdGVyIFs0XSA9IDA7Ci0JaWItPmZpbHRlciBbNl0gPSAwOworCSpsaWJfcHRyKGliLCBtb2RlLCBscC0+dHlwZSkgPSAwOworCSpsaWJfcHRyKGliLCBmaWx0ZXJbMF0sIGxwLT50eXBlKSA9IDA7CisJKmxpYl9wdHIoaWIsIGZpbHRlclsxXSwgbHAtPnR5cGUpID0gMDsKKwkqbGliX3B0cihpYiwgZmlsdGVyWzJdLCBscC0+dHlwZSkgPSAwOworCSpsaWJfcHRyKGliLCBmaWx0ZXJbM10sIGxwLT50eXBlKSA9IDA7CiAKIAlsYW5jZV9pbml0X3JpbmcoZGV2KTsKIAlsb2FkX2NzcnMobHApOwpAQCAtODc0LDEyICs4OTgsMTAgQEAKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKLQl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikgKGRldi0+bWVtX3N0YXJ0KTsKLQlpbnQgZW50cnksIHNrYmxlbiwgbGVuOworCXZvbGF0aWxlIHUxNiAqaWIgPSAodm9sYXRpbGUgdTE2ICopZGV2LT5tZW1fc3RhcnQ7CisJaW50IGVudHJ5LCBsZW47CiAKLQlza2JsZW4gPSBza2ItPmxlbjsKLQotCWxlbiA9IHNrYmxlbjsKKwlsZW4gPSBza2ItPmxlbjsKIAogCWlmIChsZW4gPCBFVEhfWkxFTikgewogCQlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQpAQCAtODg5LDIzICs5MTEsMTcgQEAKIAogCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CiAKLQllbnRyeSA9IGxwLT50eF9uZXcgJiBUWF9SSU5HX01PRF9NQVNLOwotCWliLT5idHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gKC1sZW4pOwotCWliLT5idHhfcmluZ1tlbnRyeV0ubWlzYyA9IDA7CisJZW50cnkgPSBscC0+dHhfbmV3OworCSpsaWJfcHRyKGliLCBidHhfcmluZ1tlbnRyeV0ubGVuZ3RoLCBscC0+dHlwZSkgPSAoLWxlbik7CisJKmxpYl9wdHIoaWIsIGJ0eF9yaW5nW2VudHJ5XS5taXNjLCBscC0+dHlwZSkgPSAwOwogCi0JY3BfdG9fYnVmKGxwLT50eXBlLCAoY2hhciAqKWxwLT50eF9idWZfcHRyX2NwdVtlbnRyeV0sIHNrYi0+ZGF0YSwKLQkJICBza2JsZW4pOwotCi0JLyogQ2xlYXIgdGhlIHNsYWNrIG9mIHRoZSBwYWNrZXQsIGRvIEkgbmVlZCB0aGlzPyAqLwotCS8qIEZvciBhIGZpcmV3YWxsIGl0J3MgYSBnb29kIGlkZWEgLSBBQyAqLwotLyoKLSAgIGlmIChsZW4gIT0gc2tibGVuKQotICAgbWVtc2V0ICgoY2hhciAqKSAmaWItPnR4X2J1ZiBbZW50cnldW3NrYmxlbl0sIDAsIChsZW4gLSBza2JsZW4pIDw8IDEpOwotICovCisJY3BfdG9fYnVmKGxwLT50eXBlLCAoY2hhciAqKWxwLT50eF9idWZfcHRyX2NwdVtlbnRyeV0sIHNrYi0+ZGF0YSwgbGVuKTsKIAogCS8qIE5vdywgZ2l2ZSB0aGUgcGFja2V0IHRvIHRoZSBsYW5jZSAqLwotCWliLT5idHhfcmluZ1tlbnRyeV0udG1kMV9iaXRzID0gKExFX1QxX1BPSyB8IExFX1QxX09XTik7Ci0JbHAtPnR4X25ldyA9IChscC0+dHhfbmV3ICsgMSkgJiBUWF9SSU5HX01PRF9NQVNLOworCSpsaWJfcHRyKGliLCBidHhfcmluZ1tlbnRyeV0udG1kMSwgbHAtPnR5cGUpID0KKwkJKChscC0+dHhfYnVmX3B0cl9sbmNbZW50cnldID4+IDE2KSAmIDB4ZmYpIHwKKwkJKExFX1QxX1BPSyB8IExFX1QxX09XTik7CisJbHAtPnR4X25ldyA9IChlbnRyeSArIDEpICYgVFhfUklOR19NT0RfTUFTSzsKIAogCWlmIChUWF9CVUZGU19BVkFJTCA8PSAwKQogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CkBAIC05MzAsOCArOTQ2LDggQEAKIAogc3RhdGljIHZvaWQgbGFuY2VfbG9hZF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikgKGRldi0+bWVtX3N0YXJ0KTsKLQl2b2xhdGlsZSB1MTYgKm1jYXN0X3RhYmxlID0gKHUxNiAqKSAmIGliLT5maWx0ZXI7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1MTYgKmliID0gKHZvbGF0aWxlIHUxNiAqKWRldi0+bWVtX3N0YXJ0OwogCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OwogCWNoYXIgKmFkZHJzOwogCWludCBpOwpAQCAtOTM5LDE3ICs5NTUsMTcgQEAKIAogCS8qIHNldCBhbGwgbXVsdGljYXN0IGJpdHMgKi8KIAlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgewotCQlpYi0+ZmlsdGVyWzBdID0gMHhmZmZmOwotCQlpYi0+ZmlsdGVyWzJdID0gMHhmZmZmOwotCQlpYi0+ZmlsdGVyWzRdID0gMHhmZmZmOwotCQlpYi0+ZmlsdGVyWzZdID0gMHhmZmZmOworCQkqbGliX3B0cihpYiwgZmlsdGVyWzBdLCBscC0+dHlwZSkgPSAweGZmZmY7CisJCSpsaWJfcHRyKGliLCBmaWx0ZXJbMV0sIGxwLT50eXBlKSA9IDB4ZmZmZjsKKwkJKmxpYl9wdHIoaWIsIGZpbHRlclsyXSwgbHAtPnR5cGUpID0gMHhmZmZmOworCQkqbGliX3B0cihpYiwgZmlsdGVyWzNdLCBscC0+dHlwZSkgPSAweGZmZmY7CiAJCXJldHVybjsKIAl9CiAJLyogY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KLQlpYi0+ZmlsdGVyWzBdID0gMDsKLQlpYi0+ZmlsdGVyWzJdID0gMDsKLQlpYi0+ZmlsdGVyWzRdID0gMDsKLQlpYi0+ZmlsdGVyWzZdID0gMDsKKwkqbGliX3B0cihpYiwgZmlsdGVyWzBdLCBscC0+dHlwZSkgPSAwOworCSpsaWJfcHRyKGliLCBmaWx0ZXJbMV0sIGxwLT50eXBlKSA9IDA7CisJKmxpYl9wdHIoaWIsIGZpbHRlclsyXSwgbHAtPnR5cGUpID0gMDsKKwkqbGliX3B0cihpYiwgZmlsdGVyWzNdLCBscC0+dHlwZSkgPSAwOwogCiAJLyogQWRkIGFkZHJlc3NlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKQEAgLTk2Miw3ICs5NzgsNyBAQAogCiAJCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgYWRkcnMpOwogCQljcmMgPSBjcmMgPj4gMjY7Ci0JCW1jYXN0X3RhYmxlWzIgKiAoY3JjID4+IDQpXSB8PSAxIDw8IChjcmMgJiAweGYpOworCQkqbGliX3B0cihpYiwgZmlsdGVyW2NyYyA+PiA0XSwgbHAtPnR5cGUpIHw9IDEgPDwgKGNyYyAmIDB4Zik7CiAJfQogCXJldHVybjsKIH0KQEAgLTk3MCwxMSArOTg2LDkgQEAKIHN0YXRpYyB2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYjsKKwl2b2xhdGlsZSB1MTYgKmliID0gKHZvbGF0aWxlIHUxNiAqKWRldi0+bWVtX3N0YXJ0OwogCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKIAotCWliID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopIChkZXYtPm1lbV9zdGFydCk7Ci0KIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuOwogCkBAIC05OTIsOSArMTAwNiw5IEBACiAJbGFuY2VfaW5pdF9yaW5nKGRldik7CiAKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7Ci0JCWliLT5tb2RlIHw9IExFX01PX1BST007CisJCSpsaWJfcHRyKGliLCBtb2RlLCBscC0+dHlwZSkgfD0gTEVfTU9fUFJPTTsKIAl9IGVsc2UgewotCQlpYi0+bW9kZSAmPSB+TEVfTU9fUFJPTTsKKwkJKmxpYl9wdHIoaWIsIG1vZGUsIGxwLT50eXBlKSAmPSB+TEVfTU9fUFJPTTsKIAkJbGFuY2VfbG9hZF9tdWx0aWNhc3QoZGV2KTsKIAl9CiAJbG9hZF9jc3JzKGxwKTsKQEAgLTEwNTEsNyArMTA2NSw2IEBACiAJbHAtPnR5cGUgPSB0eXBlOwogCWxwLT5zbG90ID0gc2xvdDsKIAlzd2l0Y2ggKHR5cGUpIHsKLSNpZmRlZiBDT05GSUdfVEMKIAljYXNlIEFTSUNfTEFOQ0U6CiAJCWRldi0+YmFzZV9hZGRyID0gQ0tTRUcxQUREUihkZWNfa25fc2xvdF9iYXNlICsgSU9BU0lDX0xBTkNFKTsKIApAQCAtMTA3MywyMCArMTA4NiwyMCBAQAogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CiAJCQlscC0+cnhfYnVmX3B0cl9jcHVbaV0gPQotCQkJCShjaGFyICopKGRldi0+bWVtX3N0YXJ0ICsgQlVGX09GRlNFVF9DUFUgKworCQkJCShjaGFyICopKGRldi0+bWVtX3N0YXJ0ICsgMiAqIEJVRl9PRkZTRVRfQ1BVICsKIAkJCQkJIDIgKiBpICogUlhfQlVGRl9TSVpFKTsKIAkJCWxwLT5yeF9idWZfcHRyX2xuY1tpXSA9Ci0JCQkJKGNoYXIgKikoQlVGX09GRlNFVF9MTkMgKyBpICogUlhfQlVGRl9TSVpFKTsKKwkJCQkoQlVGX09GRlNFVF9MTkMgKyBpICogUlhfQlVGRl9TSVpFKTsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKIAkJCWxwLT50eF9idWZfcHRyX2NwdVtpXSA9Ci0JCQkJKGNoYXIgKikoZGV2LT5tZW1fc3RhcnQgKyBCVUZfT0ZGU0VUX0NQVSArCisJCQkJKGNoYXIgKikoZGV2LT5tZW1fc3RhcnQgKyAyICogQlVGX09GRlNFVF9DUFUgKwogCQkJCQkgMiAqIFJYX1JJTkdfU0laRSAqIFJYX0JVRkZfU0laRSArCiAJCQkJCSAyICogaSAqIFRYX0JVRkZfU0laRSk7CiAJCQlscC0+dHhfYnVmX3B0cl9sbmNbaV0gPQotCQkJCShjaGFyICopKEJVRl9PRkZTRVRfTE5DICsKLQkJCQkJIFJYX1JJTkdfU0laRSAqIFJYX0JVRkZfU0laRSArCi0JCQkJCSBpICogVFhfQlVGRl9TSVpFKTsKKwkJCQkoQlVGX09GRlNFVF9MTkMgKworCQkJCSBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGX1NJWkUgKworCQkJCSBpICogVFhfQlVGRl9TSVpFKTsKIAkJfQogCiAJCS8qIFNldHVwIEkvTyBBU0lDIExBTkNFIERNQS4gICovCkBAIC0xMDk1LDExICsxMTA4LDEyIEBACiAJCQkgICAgIENQSFlTQUREUihkZXYtPm1lbV9zdGFydCkgPDwgMyk7CiAKIAkJYnJlYWs7Ci0KKyNpZmRlZiBDT05GSUdfVEMKIAljYXNlIFBNQURfTEFOQ0U6CiAJCWNsYWltX3RjX2NhcmQoc2xvdCk7CiAKIAkJZGV2LT5tZW1fc3RhcnQgPSBDS1NFRzFBRERSKGdldF90Y19iYXNlX2FkZHIoc2xvdCkpOworCQlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIDB4MTAwMDAwOwogCQlkZXYtPmJhc2VfYWRkciA9IGRldi0+bWVtX3N0YXJ0ICsgMHgxMDAwMDA7CiAJCWRldi0+aXJxID0gZ2V0X3RjX2lycV9ucihzbG90KTsKIAkJZXNhcl9iYXNlID0gZGV2LT5tZW1fc3RhcnQgKyAweDFjMDAwMjsKQEAgLTExMTAsNyArMTEyNCw3IEBACiAJCQkJKGNoYXIgKikoZGV2LT5tZW1fc3RhcnQgKyBCVUZfT0ZGU0VUX0NQVSArCiAJCQkJCSBpICogUlhfQlVGRl9TSVpFKTsKIAkJCWxwLT5yeF9idWZfcHRyX2xuY1tpXSA9Ci0JCQkJKGNoYXIgKikoQlVGX09GRlNFVF9MTkMgKyBpICogUlhfQlVGRl9TSVpFKTsKKwkJCQkoQlVGX09GRlNFVF9MTkMgKyBpICogUlhfQlVGRl9TSVpFKTsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKIAkJCWxwLT50eF9idWZfcHRyX2NwdVtpXSA9CkBAIC0xMTE4LDE4ICsxMTMyLDE4IEBACiAJCQkJCSBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGX1NJWkUgKwogCQkJCQkgaSAqIFRYX0JVRkZfU0laRSk7CiAJCQlscC0+dHhfYnVmX3B0cl9sbmNbaV0gPQotCQkJCShjaGFyICopKEJVRl9PRkZTRVRfTE5DICsKLQkJCQkJIFJYX1JJTkdfU0laRSAqIFJYX0JVRkZfU0laRSArCi0JCQkJCSBpICogVFhfQlVGRl9TSVpFKTsKKwkJCQkoQlVGX09GRlNFVF9MTkMgKworCQkJCSBSWF9SSU5HX1NJWkUgKiBSWF9CVUZGX1NJWkUgKworCQkJCSBpICogVFhfQlVGRl9TSVpFKTsKIAkJfQogCiAJCWJyZWFrOwogI2VuZGlmCi0KIAljYXNlIFBNQVhfTEFOQ0U6CiAJCWRldi0+aXJxID0gZGVjX2ludGVycnVwdFtERUNfSVJRX0xBTkNFXTsKIAkJZGV2LT5iYXNlX2FkZHIgPSBDS1NFRzFBRERSKEtOMDFfU0xPVF9CQVNFICsgS04wMV9MQU5DRSk7CiAJCWRldi0+bWVtX3N0YXJ0ID0gQ0tTRUcxQUREUihLTjAxX1NMT1RfQkFTRSArIEtOMDFfTEFOQ0VfTUVNKTsKKwkJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyBLTjAxX1NMT1RfU0laRTsKIAkJZXNhcl9iYXNlID0gQ0tTRUcxQUREUihLTjAxX1NMT1RfQkFTRSArIEtOMDFfRVNBUiArIDEpOwogCQlscC0+ZG1hX2lycSA9IC0xOwogCkBAIC0xMTM4LDIwICsxMTUyLDIwIEBACiAJCSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKIAkJCWxwLT5yeF9idWZfcHRyX2NwdVtpXSA9Ci0JCQkJKGNoYXIgKikoZGV2LT5tZW1fc3RhcnQgKyBCVUZfT0ZGU0VUX0NQVSArCisJCQkJKGNoYXIgKikoZGV2LT5tZW1fc3RhcnQgKyAyICogQlVGX09GRlNFVF9DUFUgKwogCQkJCQkgMiAqIGkgKiBSWF9CVUZGX1NJWkUpOwogCQkJbHAtPnJ4X2J1Zl9wdHJfbG5jW2ldID0KLQkJCQkoY2hhciAqKShCVUZfT0ZGU0VUX0xOQyArIGkgKiBSWF9CVUZGX1NJWkUpOworCQkJCShCVUZfT0ZGU0VUX0xOQyArIGkgKiBSWF9CVUZGX1NJWkUpOwogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgewogCQkJbHAtPnR4X2J1Zl9wdHJfY3B1W2ldID0KLQkJCQkoY2hhciAqKShkZXYtPm1lbV9zdGFydCArIEJVRl9PRkZTRVRfQ1BVICsKKwkJCQkoY2hhciAqKShkZXYtPm1lbV9zdGFydCArIDIgKiBCVUZfT0ZGU0VUX0NQVSArCiAJCQkJCSAyICogUlhfUklOR19TSVpFICogUlhfQlVGRl9TSVpFICsKIAkJCQkJIDIgKiBpICogVFhfQlVGRl9TSVpFKTsKIAkJCWxwLT50eF9idWZfcHRyX2xuY1tpXSA9Ci0JCQkJKGNoYXIgKikoQlVGX09GRlNFVF9MTkMgKwotCQkJCQkgUlhfUklOR19TSVpFICogUlhfQlVGRl9TSVpFICsKLQkJCQkJIGkgKiBUWF9CVUZGX1NJWkUpOworCQkJCShCVUZfT0ZGU0VUX0xOQyArCisJCQkJIFJYX1JJTkdfU0laRSAqIFJYX0JVRkZfU0laRSArCisJCQkJIGkgKiBUWF9CVUZGX1NJWkUpOwogCQl9CiAKIAkJYnJlYWs7CkBAIC0xMjc5LDEwICsxMjkzLDggQEAKIAkvKiBUaGVuIGhhbmRsZSBvbmJvYXJkIGRldmljZXMuICovCiAJaWYgKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9MQU5DRV0gPj0gMCkgewogCQlpZiAoZGVjX2ludGVycnVwdFtERUNfSVJRX0xBTkNFX01FUlJdID49IDApIHsKLSNpZmRlZiBDT05GSUdfVEMKIAkJCWlmIChkZWNfbGFuY2VfaW5pdChBU0lDX0xBTkNFLCAtMSkgPj0gMCkKIAkJCQljb3VudCsrOwotI2VuZGlmCiAJCX0gZWxzZSBpZiAoIVRVUkJPQ0hBTk5FTCkgewogCQkJaWYgKGRlY19sYW5jZV9pbml0KFBNQVhfTEFOQ0UsIC0xKSA+PSAwKQogCQkJCWNvdW50Kys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5jIGIvZHJpdmVycy9uZXQvZGVmeHguYwppbmRleCA4ZjUxNGNjLi5kYzNhYjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWZ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmMKQEAgLTE5Miw2ICsxOTIsNyBAQAogICoJCTA0IEF1ZyAyMDAzCW1hY3JvCQlDb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkuCiAgKgkJMTQgQXVnIDIwMDQJbWFjcm8JCUZpeCBkZXZpY2UgbmFtZXMgcmVwb3J0ZWQuCiAgKgkJMTQgSnVuIDIwMDUJbWFjcm8JCVVzZSBpcnFyZXR1cm5fdC4KKyAqCQkyMyBPY3QgMjAwNgltYWNybwkJQmlnLWVuZGlhbiBob3N0IHN1cHBvcnQuCiAgKi8KIAogLyogSW5jbHVkZSBmaWxlcyAqLwpAQCAtMjE4LDggKzIxOSw4IEBACiAKIC8qIFZlcnNpb24gaW5mb3JtYXRpb24gc3RyaW5nIHNob3VsZCBiZSB1cGRhdGVkIHByaW9yIHRvIGVhY2ggbmV3IHJlbGVhc2UhICAqLwogI2RlZmluZSBEUlZfTkFNRSAiZGVmeHgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICJ2MS4wOCIKLSNkZWZpbmUgRFJWX1JFTERBVEUgIjIwMDUvMDYvMTQiCisjZGVmaW5lIERSVl9WRVJTSU9OICJ2MS4wOSIKKyNkZWZpbmUgRFJWX1JFTERBVEUgIjIwMDYvMTAvMjMiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KIAlEUlZfTkFNRSAiOiAiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURQpAQCAtODU5LDYgKzg2MCw3IEBACiAJCSAgICAgICBwcmludF9uYW1lKTsKIAkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOwogCX0KKwlkYXRhID0gY3B1X3RvX2xlMzIoZGF0YSk7CiAJbWVtY3B5KCZicC0+ZmFjdG9yeV9tYWNfYWRkclswXSwgJmRhdGEsIHNpemVvZih1MzIpKTsKIAogCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwgUElfUENUUkxfTV9NTEEsIFBJX1BEQVRBX0FfTUxBX0tfSEksIDAsCkBAIC04NjcsNiArODY5LDcgQEAKIAkJICAgICAgIHByaW50X25hbWUpOwogCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CiAJfQorCWRhdGEgPSBjcHVfdG9fbGUzMihkYXRhKTsKIAltZW1jcHkoJmJwLT5mYWN0b3J5X21hY19hZGRyWzRdLCAmZGF0YSwgc2l6ZW9mKHUxNikpOwogCiAJLyoKQEAgLTEwODUsMjcgKzEwODgsMjMgQEAKIAkJfQogCiAJLyoKLQkgKiBTZXQgYmFzZSBhZGRyZXNzIG9mIERlc2NyaXB0b3IgQmxvY2sgYW5kIGJyaW5nIGFkYXB0ZXIgdG8gRE1BX0FWQUlMQUJMRSBzdGF0ZQorCSAqIFNldCB0aGUgYmFzZSBhZGRyZXNzIG9mIERlc2NyaXB0b3IgQmxvY2sgYW5kIGJyaW5nIGFkYXB0ZXIKKwkgKiB0byBETUFfQVZBSUxBQkxFIHN0YXRlLgogCSAqCi0JICogTm90ZTogV2UgYWxzbyBzZXQgdGhlIGxpdGVyYWwgYW5kIGRhdGEgc3dhcHBpbmcgcmVxdWlyZW1lbnRzIGluIHRoaXMKLQkgKgkgICAgIGNvbW1hbmQuICBTaW5jZSB0aGlzIGRyaXZlciBwcmVzZW50bHkgcnVucyBvbiBJbnRlbCBwbGF0Zm9ybXMKLQkgKgkJIHdoaWNoIGFyZSBMaXR0bGUgRW5kaWFuLCB3ZSdsbCB0ZWxsIHRoZSBhZGFwdGVyIHRvIGJ5dGUgc3dhcAotCSAqCQkgZGF0YSBvbmx5LiAgVGhpcyBjb2RlIHdpbGwgbmVlZCB0byBjaGFuZ2Ugd2hlbiB3ZSBzdXBwb3J0Ci0JICoJCSBCaWcgRW5kaWFuIHN5c3RlbXMgKGVnLiBQb3dlclBDKS4KKwkgKiBOb3RlOiBXZSBhbHNvIHNldCB0aGUgbGl0ZXJhbCBhbmQgZGF0YSBzd2FwcGluZyByZXF1aXJlbWVudHMKKwkgKiAgICAgICBpbiB0aGlzIGNvbW1hbmQuCiAJICoKLQkgKiBBc3N1bXB0aW9uOiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIGJsb2NrIGlzIDhLYnl0ZQotCSAqICAgICAgICAgICAgIGFsaWduZWQuICBUaGF0IGlzLCBiaXRzIDAtMTIgb2YgdGhlIGFkZHJlc3MgbXVzdCBiZSB6ZXJvLgorCSAqIEFzc3VtcHRpb246IDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgYmxvY2sKKwkgKiAgICAgICBpcyA4S2J5dGUgYWxpZ25lZC4KIAkgKi8KLQotCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwKLQkJCQkJCQlQSV9QQ1RSTF9NX0lOSVQsCi0JCQkJCQkJKHUzMikgKGJwLT5kZXNjcl9ibG9ja19waHlzIHwgUElfUERBVEFfQV9JTklUX01fQlNXQVBfREFUQSksCi0JCQkJCQkJMCwKLQkJCQkJCQlOVUxMKSAhPSBERlhfS19TVUNDRVNTKQotCQl7Ci0JCXByaW50aygiJXM6IENvdWxkIG5vdCBzZXQgZGVzY3JpcHRvciBibG9jayBhZGRyZXNzIVxuIiwgYnAtPmRldi0+bmFtZSk7Ci0JCXJldHVybihERlhfS19GQUlMVVJFKTsKLQkJfQorCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwgUElfUENUUkxfTV9JTklULAorCQkJCSAodTMyKShicC0+ZGVzY3JfYmxvY2tfcGh5cyB8CisJCQkJICAgICAgIFBJX1BEQVRBX0FfSU5JVF9NX0JTV0FQX0lOSVQpLAorCQkJCSAwLCBOVUxMKSAhPSBERlhfS19TVUNDRVNTKSB7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCBzZXQgZGVzY3JpcHRvciBibG9jayBhZGRyZXNzIVxuIiwKKwkJICAgICAgIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gREZYX0tfRkFJTFVSRTsKKwl9CiAKIAkvKiBTZXQgdHJhbnNtaXQgZmx1c2ggdGltZW91dCB2YWx1ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5oIGIvZHJpdmVycy9uZXQvZGVmeHguaAppbmRleCA4YjFlOWExLi4yY2U4Zjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWZ4eC5oCisrKyBiL2RyaXZlcnMvbmV0L2RlZnh4LmgKQEAgLTI1LDYgKzI1LDcgQEAKICAqCQkJCQkJCW1hY3JvcyB0byBERUZYWC5DLgogICoJCTEyLVNlcC05NglMVlMJCVJlbW92ZWQgcGFja2V0IHJlcXVlc3QgaGVhZGVyIHBvaW50ZXJzLgogICoJCTA0IEF1ZyAyMDAzCW1hY3JvCQlDb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkuCisgKgkJMjMgT2N0IDIwMDYJbWFjcm8JCUJpZy1lbmRpYW4gaG9zdCBzdXBwb3J0LgogICovCiAKICNpZm5kZWYgX0RFRlhYX0hfCkBAIC0xMzQ0LDcgKzEzNDUsNyBAQAogCiAvKiBSZWdpc3RlciBkZWZpbml0aW9uIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgZm9yIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIHN5c3RlbXMgKi8KIAotI2lmbmRlZiAgQklHX0VORElBTgorI2lmbmRlZiBfX0JJR19FTkRJQU4KIAogLyogTGl0dGxlIGVuZGlhbiBmb3JtYXQgb2YgVHlwZSAxIFByb2R1Y2VyIHJlZ2lzdGVyICovCiAKQEAgLTE0MDIsNyArMTQwMywxMSBAQAogCQl9IGluZGV4OwogCX0gUElfVFlQRV8yX0NPTlNVTUVSOwogCi0jZWxzZQorLyogRGVmaW5lIHN3YXBwaW5nIHJlcXVpcmVkIGJ5IERNQSB0cmFuc2ZlcnMuICAqLworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfTV9CU1dBUF9JTklUCVwKKwkoUElfUERBVEFfQV9JTklUX01fQlNXQVBfREFUQSkKKworI2Vsc2UgLyogX19CSUdfRU5ESUFOICovCiAKIC8qIEJpZyBlbmRpYW4gZm9ybWF0IG9mIFR5cGUgMSBQcm9kdWNlciByZWdpc3RlciAqLwogCkBAIC0xNDYwLDcgKzE0NjUsMTEgQEAKIAkJfSBpbmRleDsKIAl9IFBJX1RZUEVfMl9DT05TVU1FUjsKIAotI2VuZGlmCS8qICNpZm5kZWYgQklHX0VORElBTiAqLworLyogRGVmaW5lIHN3YXBwaW5nIHJlcXVpcmVkIGJ5IERNQSB0cmFuc2ZlcnMuICAqLworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfTV9CU1dBUF9JTklUCVwKKwkoUElfUERBVEFfQV9JTklUX01fQlNXQVBfREFUQSB8IFBJX1BEQVRBX0FfSU5JVF9NX0JTV0FQX0xJVEVSQUwpCisKKyNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KIAogLyogRGVmaW5lIEVJU0EgY29udHJvbGxlciByZWdpc3RlciBvZmZzZXRzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9kcml2ZXJzL25ldC9kZXBjYS5jCmluZGV4IGY4N2Y2ZTMuLjUxMTNlZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlcGNhLmMKKysrIGIvZHJpdmVycy9uZXQvZGVwY2EuYwpAQCAtMTI1MiwyNCArMTI1MiwyMiBAQAogCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscCA9IChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CiAJdV9sb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwogCi0JaWYgKGRldikgewotCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JCXdoaWxlIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpOwkvKiBXYWl0IGZvciB0aGUgcmluZyB0byBlbXB0eSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl3aGlsZSAobHAtPnR4X29sZCAhPSBscC0+dHhfbmV3KTsJLyogV2FpdCBmb3IgdGhlIHJpbmcgdG8gZW1wdHkgKi8KIAotCQlTVE9QX0RFUENBOwkvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBkZXBjYS4gICovCi0JCWRlcGNhX2luaXRfcmluZyhkZXYpOwkvKiBJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIHJpbmdzICovCisJU1RPUF9ERVBDQTsJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgZGVwY2EuICAqLworCWRlcGNhX2luaXRfcmluZyhkZXYpOwkvKiBJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIHJpbmdzICovCiAKLQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwotCQkJbHAtPmluaXRfYmxvY2subW9kZSB8PSBQUk9NOwotCQl9IGVsc2UgewotCQkJU2V0TXVsdGljYXN0RmlsdGVyKGRldik7Ci0JCQlscC0+aW5pdF9ibG9jay5tb2RlICY9IH5QUk9NOwkvKiBVbnNldCBwcm9taXNjdW91cyBtb2RlICovCi0JCX0KLQotCQlMb2FkQ1NScyhkZXYpOwkvKiBSZWxvYWQgQ1NSMyAqLwotCQlJbml0UmVzdGFydERlcGNhKGRldik7CS8qIFJlc3VtZSBub3JtYWwgb3BlcmF0aW9uLiAqLwotCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkvKiBVbmxvY2sgdGhlIFRYIHJpbmcgKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CS8qIFNldCBwcm9taXNjdW91cyBtb2RlICovCisJCWxwLT5pbml0X2Jsb2NrLm1vZGUgfD0gUFJPTTsKKwl9IGVsc2UgeworCQlTZXRNdWx0aWNhc3RGaWx0ZXIoZGV2KTsKKwkJbHAtPmluaXRfYmxvY2subW9kZSAmPSB+UFJPTTsJLyogVW5zZXQgcHJvbWlzY3VvdXMgbW9kZSAqLwogCX0KKworCUxvYWRDU1JzKGRldik7CS8qIFJlbG9hZCBDU1IzICovCisJSW5pdFJlc3RhcnREZXBjYShkZXYpOwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4gKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkvKiBVbmxvY2sgdGhlIFRYIHJpbmcgKi8KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAuYyBiL2RyaXZlcnMvbmV0L2UxMDAuYwppbmRleCAyN2Q1ZDJmLi5jMmFlMmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMC5jCkBAIC0xMjE1LDcgKzEyMTUsNyBAQAogKiAgdGhlIGxpdGVyYWwgaW4gdGhlIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgY29kZSBpcyBsb2FkZWQsIHRoZQogKiAgZHJpdmVyIGNhbiBjaGFuZ2UgdGhlIGFsZ29yaXRobS4KICoKLSogIElOVERFTEFZIC0gVGhpcyBsb2FkcyB0aGUgZGVhZC1tYW4gdGltZXIgd2l0aCBpdHMgaW5pdGFsIHZhbHVlLgorKiAgSU5UREVMQVkgLSBUaGlzIGxvYWRzIHRoZSBkZWFkLW1hbiB0aW1lciB3aXRoIGl0cyBpbml0aWFsIHZhbHVlLgogKiAgICBXaGVuIHRoaXMgdGltZXIgZXhwaXJlcyB0aGUgaW50ZXJydXB0IGlzIGFzc2VydGVkLCBhbmQgdGhlCiAqICAgIHRpbWVyIGlzIHJlc2V0IGVhY2ggdGltZSBhIG5ldyBwYWNrZXQgaXMgcmVjZWl2ZWQuICAoc2VlCiAqICAgIEJVTkRMRU1BWCBiZWxvdyB0byBzZXQgdGhlIGxpbWl0IG9uIG51bWJlciBvZiBjaGFpbmVkIHBhY2tldHMpCkBAIC0xOTMwLDkgKzE5MzAsOCBAQAogCW5pYy0+cnhfdG9fdXNlID0gbmljLT5yeF90b19jbGVhbiA9IE5VTEw7CiAJbmljLT5ydV9ydW5uaW5nID0gUlVfVU5JTklUSUFMSVpFRDsKIAotCWlmKCEobmljLT5yeHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcngpICogY291bnQsIEdGUF9BVE9NSUMpKSkKKwlpZighKG5pYy0+cnhzID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKHN0cnVjdCByeCksIEdGUF9BVE9NSUMpKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KG5pYy0+cnhzLCAwLCBzaXplb2Yoc3RydWN0IHJ4KSAqIGNvdW50KTsKIAogCWZvcihyeCA9IG5pYy0+cnhzLCBpID0gMDsgaSA8IGNvdW50OyByeCsrLCBpKyspIHsKIAkJcngtPm5leHQgPSAoaSArIDEgPCBjb3VudCkgPyByeCArIDEgOiBuaWMtPnJ4czsKQEAgLTIwMzksNyArMjAzOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgZTEwMF9hc2Yoc3RydWN0IG5pYyAqbmljKQogewogCS8qIEFTRiBjYW4gYmUgZW5hYmxlZCBmcm9tIGVlcHJvbSAqLwpAQCAtMjA0OCw3ICsyMDQ2LDYgQEAKIAkgICAhKG5pYy0+ZWVwcm9tW2VlcHJvbV9jb25maWdfYXNmXSAmIGVlcHJvbV9nY2wpICYmCiAJICAgKChuaWMtPmVlcHJvbVtlZXByb21fc21idXNfYWRkcl0gJiAweEZGKSAhPSAweEZFKSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCBlMTAwX3VwKHN0cnVjdCBuaWMgKm5pYykKIHsKQEAgLTIxMDQsOSArMjEwMSwxMCBAQAogCXNjaGVkdWxlX3dvcmsoJm5pYy0+dHhfdGltZW91dF90YXNrKTsKIH0KIAotc3RhdGljIHZvaWQgZTEwMF90eF90aW1lb3V0X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3N0YXRpYyB2b2lkIGUxMDBfdHhfdGltZW91dF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuaWMgKm5pYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmljLCB0eF90aW1lb3V0X3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBuaWMtPm5ldGRldjsKIAogCURQUklOVEsoVFhfRVJSLCBERUJVRywgInNjYi5zdGF0dXM9MHglMDJYXG4iLAogCQlyZWFkYigmbmljLT5jc3ItPnNjYi5zdGF0dXMpKTsKQEAgLTI2MzksOCArMjYzNyw3IEBACiAJbmljLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDBfYmxpbmtfbGVkOwogCW5pYy0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKW5pYzsKIAotCUlOSVRfV09SSygmbmljLT50eF90aW1lb3V0X3Rhc2ssCi0JCSh2b2lkICgqKSh2b2lkICopKWUxMDBfdHhfdGltZW91dF90YXNrLCBuZXRkZXYpOworCUlOSVRfV09SSygmbmljLT50eF90aW1lb3V0X3Rhc2ssIGUxMDBfdHhfdGltZW91dF90YXNrKTsKIAogCWlmKChlcnIgPSBlMTAwX2FsbG9jKG5pYykpKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkNhbm5vdCBhbGxvYyBkcml2ZXIgbWVtb3J5LCBhYm9ydGluZy5cbiIpOwpAQCAtMjcxNSwzNCArMjcxMiwzNSBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBlMTAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKKyNpZmRlZiBDT05GSUdfRTEwMF9OQVBJCiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJZTEwMF9kb3duKG5pYyk7Ci0JZTEwMF9od19yZXNldChuaWMpOwotCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKLQotI2lmZGVmIENPTkZJR19QTQotCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCWlmIChuaWMtPmZsYWdzICYgKHdvbF9tYWdpYyB8IGUxMDBfYXNmKG5pYykpKQotI2Vsc2UKLQlpZiAobmljLT5mbGFncyAmICh3b2xfbWFnaWMpKQorCQluZXRpZl9wb2xsX2Rpc2FibGUobmljLT5uZXRkZXYpOwogI2VuZGlmCi0JCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwgMSk7Ci0JZWxzZQotCQkvKiBkaXNhYmxlIFBNRSAqLwotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgMCwgMCk7CisJZGVsX3RpbWVyX3N5bmMoJm5pYy0+d2F0Y2hkb2cpOworCW5ldGlmX2NhcnJpZXJfb2ZmKG5pYy0+bmV0ZGV2KTsKKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJaWYgKChuaWMtPmZsYWdzICYgd29sX21hZ2ljKSB8IGUxMDBfYXNmKG5pYykpIHsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMSk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAxKTsKKwl9IGVsc2UgeworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCX0KIAogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBlMTAwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtMjc2NCw3ICsyNzYyLDI2IEBACiAKIHN0YXRpYyB2b2lkIGUxMDBfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JZTEwMF9zdXNwZW5kKHBkZXYsIFBNU0dfU1VTUEVORCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisjaWZkZWYgQ09ORklHX0UxMDBfTkFQSQorCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCW5ldGlmX3BvbGxfZGlzYWJsZShuaWMtPm5ldGRldik7CisjZW5kaWYKKwlkZWxfdGltZXJfc3luYygmbmljLT53YXRjaGRvZyk7CisJbmV0aWZfY2Fycmllcl9vZmYobmljLT5uZXRkZXYpOworCisJaWYgKChuaWMtPmZsYWdzICYgd29sX21hZ2ljKSB8IGUxMDBfYXNmKG5pYykpIHsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMSk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAxKTsKKwl9IGVsc2UgeworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCX0KKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBQQ0kgRXJyb3IgUmVjb3ZlcnkgaW5mcmFzdHJ1Y3R1cmUgIC0tLS0tLS0tLS0tLS0tICovCkBAIC0yODQ4LDkgKzI4NjUsOSBAQAogCS5pZF90YWJsZSA9ICAgICBlMTAwX2lkX3RhYmxlLAogCS5wcm9iZSA9ICAgICAgICBlMTAwX3Byb2JlLAogCS5yZW1vdmUgPSAgICAgICBfX2RldmV4aXRfcChlMTAwX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCiAJLyogUG93ZXIgTWFuYWdlbWVudCBob29rcyAqLwogCS5zdXNwZW5kID0gICAgICBlMTAwX3N1c3BlbmQsCi0jaWZkZWYgQ09ORklHX1BNCiAJLnJlc3VtZSA9ICAgICAgIGUxMDBfcmVzdW1lLAogI2VuZGlmCiAJLnNodXRkb3duID0gICAgIGUxMDBfc2h1dGRvd24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaAppbmRleCA3ZWNjZTQzLi5mMDkxMDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKQEAgLTU5LDYgKzU5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2lmZGVmIE5FVElGX0ZfVFNPNgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KQEAgLTI1NCw2ICsyNTcsMTcgQEAKIAlzcGlubG9ja190IHR4X3F1ZXVlX2xvY2s7CiAjZW5kaWYKIAlhdG9taWNfdCBpcnFfc2VtOworCXVuc2lnbmVkIGludCBkZXRlY3RfbGluazsKKwl1bnNpZ25lZCBpbnQgdG90YWxfdHhfYnl0ZXM7CisJdW5zaWduZWQgaW50IHRvdGFsX3R4X3BhY2tldHM7CisJdW5zaWduZWQgaW50IHRvdGFsX3J4X2J5dGVzOworCXVuc2lnbmVkIGludCB0b3RhbF9yeF9wYWNrZXRzOworCS8qIEludGVycnVwdCBUaHJvdHRsZSBSYXRlICovCisJdWludDMyX3QgaXRyOworCXVpbnQzMl90IGl0cl9zZXR0aW5nOworCXVpbnQxNl90IHR4X2l0cjsKKwl1aW50MTZfdCByeF9pdHI7CisKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfdGFzazsKIAl1aW50OF90IGZjX2F1dG9uZWc7CiAKQEAgLTI2Miw2ICsyNzYsNyBAQAogCiAJLyogVFggKi8KIAlzdHJ1Y3QgZTEwMDBfdHhfcmluZyAqdHhfcmluZzsgICAgICAvKiBPbmUgcGVyIGFjdGl2ZSBxdWV1ZSAqLworCXVuc2lnbmVkIGludCByZXN0YXJ0X3F1ZXVlOwogCXVuc2lnbmVkIGxvbmcgdHhfcXVldWVfbGVuOwogCXVpbnQzMl90IHR4ZF9jbWQ7CiAJdWludDMyX3QgdHhfaW50X2RlbGF5OwpAQCAtMzEwLDggKzMyNSw2IEBACiAJdWludDY0X3QgZ29yY2xfb2xkOwogCXVpbnQxNl90IHJ4X3BzX2JzaXplMDsKIAotCS8qIEludGVycnVwdCBUaHJvdHRsZSBSYXRlICovCi0JdWludDMyX3QgaXRyOwogCiAJLyogT1MgZGVmaW5lZCBzdHJ1Y3RzICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwppbmRleCA3NzM4MjFlLi5kYTQ1OWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCkBAIC04NSw2ICs4NSw3IEBACiAJeyAidHhfc2luZ2xlX2NvbGxfb2siLCBFMTAwMF9TVEFUKHN0YXRzLnNjYykgfSwKIAl7ICJ0eF9tdWx0aV9jb2xsX29rIiwgRTEwMDBfU1RBVChzdGF0cy5tY2MpIH0sCiAJeyAidHhfdGltZW91dF9jb3VudCIsIEUxMDAwX1NUQVQodHhfdGltZW91dF9jb3VudCkgfSwKKwl7ICJ0eF9yZXN0YXJ0X3F1ZXVlIiwgRTEwMDBfU1RBVChyZXN0YXJ0X3F1ZXVlKSB9LAogCXsgInJ4X2xvbmdfbGVuZ3RoX2Vycm9ycyIsIEUxMDAwX1NUQVQoc3RhdHMucm9jKSB9LAogCXsgInJ4X3Nob3J0X2xlbmd0aF9lcnJvcnMiLCBFMTAwMF9TVEFUKHN0YXRzLnJ1YykgfSwKIAl7ICJyeF9hbGlnbl9lcnJvcnMiLCBFMTAwMF9TVEFUKHN0YXRzLmFsZ25lcnJjKSB9LApAQCAtMTMzLDkgKzEzNCw3IEBACiAKIAkJaWYgKGh3LT5hdXRvbmVnID09IDEpIHsKIAkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKLQogCQkJLyogdGhlIGUxMDAwIGF1dG9uZWcgc2VlbXMgdG8gbWF0Y2ggZXRodG9vbCBuaWNlbHkgKi8KLQogCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZDsKIAkJfQogCkBAIC0yODUsNyArMjg0LDcgQEAKIAkJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwogCX0gZWxzZQogCQlyZXR2YWwgPSAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpID8KLQkJCSAgIGUxMDAwX3NldHVwX2xpbmsoaHcpIDogZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KSk7CisJCQkgIGUxMDAwX3NldHVwX2xpbmsoaHcpIDogZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KSk7CiAKIAljbGVhcl9iaXQoX19FMTAwMF9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTM1MCw2ICszNDksMTMgQEAKIAllbHNlCiAJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOwogCisjaWZkZWYgTkVUSUZfRl9UU082CisJaWYgKGRhdGEpCisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworCWVsc2UKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU082OworI2VuZGlmCisKIAlEUFJJTlRLKFBST0JFLCBJTkZPLCAiVFNPIGlzICVzXG4iLCBkYXRhID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CiAJYWRhcHRlci0+dHNvX2ZvcmNlID0gVFJVRTsKIAlyZXR1cm4gMDsKQEAgLTQ2MSw3ICs0NjcsOCBAQAogCXJlZ3NfYnVmZlsyNF0gPSAodWludDMyX3QpcGh5X2RhdGE7ICAvKiBwaHkgbG9jYWwgcmVjZWl2ZXIgc3RhdHVzICovCiAJcmVnc19idWZmWzI1XSA9IHJlZ3NfYnVmZlsyNF07ICAvKiBwaHkgcmVtb3RlIHJlY2VpdmVyIHN0YXR1cyAqLwogCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKLQkgICBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCSAgICBody0+bWFjX3R5cGUgPCBlMTAwMF84MjU3MSAmJgorCSAgICBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgewogCQlyZWdzX2J1ZmZbMjZdID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1BTkMpOwogCX0KIH0KQEAgLTc3Myw3ICs3ODAsNyBAQAogCS8qIFRoZSBzdGF0dXMgcmVnaXN0ZXIgaXMgUmVhZCBPbmx5LCBzbyBhIHdyaXRlIHNob3VsZCBmYWlsLgogCSAqIFNvbWUgYml0cyB0aGF0IGdldCB0b2dnbGVkIGFyZSBpZ25vcmVkLgogCSAqLwotICAgICAgICBzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CisJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgewogCS8qIHRoZXJlIGFyZSBzZXZlcmFsIGJpdHMgb24gbmV3ZXIgaGFyZHdhcmUgdGhhdCBhcmUgci93ICovCiAJY2FzZSBlMTAwMF84MjU3MToKIAljYXNlIGUxMDAwXzgyNTcyOgpAQCAtODAxLDEyICs4MDgsMTQgQEAKIAl9CiAJLyogcmVzdG9yZSBwcmV2aW91cyBzdGF0dXMgKi8KIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMsIGJlZm9yZSk7CisKIAlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewogCQlSRUdfUEFUVEVSTl9URVNUKEZDQUwsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOwogCQlSRUdfUEFUVEVSTl9URVNUKEZDQUgsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOwogCQlSRUdfUEFUVEVSTl9URVNUKEZDVCwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7CiAJCVJFR19QQVRURVJOX1RFU1QoVkVULCAweDAwMDBGRkZGLCAweEZGRkZGRkZGKTsKIAl9CisKIAlSRUdfUEFUVEVSTl9URVNUKFJEVFIsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOwogCVJFR19QQVRURVJOX1RFU1QoUkRCQUgsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOwogCVJFR19QQVRURVJOX1RFU1QoUkRMRU4sIDB4MDAwRkZGODAsIDB4MDAwRkZGRkYpOwpAQCAtODE5LDggKzgyOCw5IEBACiAJUkVHX1BBVFRFUk5fVEVTVChURExFTiwgMHgwMDBGRkY4MCwgMHgwMDBGRkZGRik7CiAKIAlSRUdfU0VUX0FORF9DSEVDSyhSQ1RMLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwKTsKKwogCWJlZm9yZSA9IChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuID8KLQkJCTB4MDZDM0IzM0UgOiAweDA2REZCM0ZFKTsKKwkgICAgICAgICAgMHgwNkMzQjMzRSA6IDB4MDZERkIzRkUpOwogCVJFR19TRVRfQU5EX0NIRUNLKFJDVEwsIGJlZm9yZSwgMHgwMDNGRkZGQik7CiAJUkVHX1NFVF9BTkRfQ0hFQ0soVENUTCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCk7CiAKQEAgLTgzMywxMCArODQzLDEwIEBACiAJCVJFR19QQVRURVJOX1RFU1QoVERCQUwsIDB4RkZGRkZGRjAsIDB4RkZGRkZGRkYpOwogCQlSRUdfUEFUVEVSTl9URVNUKFRJRFYsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYpOwogCQl2YWx1ZSA9IChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF9pY2g4bGFuID8KLQkJCQlFMTAwMF9SQVJfRU5UUklFU19JQ0g4TEFOIDogRTEwMDBfUkFSX0VOVFJJRVMpOworCQkgICAgICAgICBFMTAwMF9SQVJfRU5UUklFU19JQ0g4TEFOIDogRTEwMDBfUkFSX0VOVFJJRVMpOwogCQlmb3IgKGkgPSAwOyBpIDwgdmFsdWU7IGkrKykgewogCQkJUkVHX1BBVFRFUk5fVEVTVChSQSArICgoKGkgPDwgMSkgKyAxKSA8PCAyKSwgMHg4MDAzRkZGRiwKLQkJCQkJIDB4RkZGRkZGRkYpOworCQkJICAgICAgICAgICAgICAgICAweEZGRkZGRkZGKTsKIAkJfQogCiAJfSBlbHNlIHsKQEAgLTg4Miw4ICs4OTIsNyBAQAogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QKLWUxMDAwX3Rlc3RfaW50cihpbnQgaXJxLAotCQl2b2lkICpkYXRhKQorZTEwMDBfdGVzdF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOwogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTkwNCwxMSArOTEzLDExIEBACiAKIAkvKiBOT1RFOiB3ZSBkb24ndCB0ZXN0IE1TSSBpbnRlcnJ1cHRzIGhlcmUsIHlldCAqLwogCS8qIEhvb2sgdXAgdGVzdCBpbnRlcnJ1cHQgaGFuZGxlciBqdXN0IGZvciB0aGlzIHRlc3QgKi8KLQlpZiAoIXJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgSVJRRl9QUk9CRV9TSEFSRUQsCi0JCQkgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKQorCWlmICghcmVxdWVzdF9pcnEoaXJxLCAmZTEwMDBfdGVzdF9pbnRyLCBJUlFGX1BST0JFX1NIQVJFRCwgbmV0ZGV2LT5uYW1lLAorCSAgICAgICAgICAgICAgICAgbmV0ZGV2KSkKIAkJc2hhcmVkX2ludCA9IEZBTFNFOwogCWVsc2UgaWYgKHJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgSVJRRl9TSEFSRUQsCi0JCQkgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpIHsKKwkgICAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpIHsKIAkJKmRhdGEgPSAxOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtOTI0LDYgKzkzMyw3IEBACiAKIAkJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4gJiYgaSA9PSA4KQogCQkJY29udGludWU7CisKIAkJLyogSW50ZXJydXB0IHRvIHRlc3QgKi8KIAkJbWFzayA9IDEgPDwgaTsKIApAQCAtMTY3Myw3ICsxNjgzLDcgQEAKIAkJaWYgKGUxMDAwX2xpbmtfdGVzdChhZGFwdGVyLCAmZGF0YVs0XSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCi0JCS8qIE9mZmxpbmUgdGVzdHMgYXJlbid0IHJ1bjsgcGFzcyBieSBkZWZhdWx0ICovCisJCS8qIE9ubGluZSB0ZXN0cyBhcmVuJ3QgcnVuOyBwYXNzIGJ5IGRlZmF1bHQgKi8KIAkJZGF0YVswXSA9IDA7CiAJCWRhdGFbMV0gPSAwOwogCQlkYXRhWzJdID0gMDsKQEAgLTE2OTAsNiArMTcwMCw3IEBACiAJaW50IHJldHZhbCA9IDE7IC8qIGZhaWwgYnkgZGVmYXVsdCAqLwogCiAJc3dpdGNoIChody0+ZGV2aWNlX2lkKSB7CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDI6CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19GSUJFUjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0NPUFBFUjoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU0NEVJX0ZJQkVSOgpAQCAtMTcxNSw2ICsxNzI2LDcgQEAKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSX0xPV1BST0ZJTEU6CiAJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9RVUFEX0NPUFBFUl9LU1AzOgogCQkvKiBxdWFkIHBvcnQgYWRhcHRlcnMgb25seSBzdXBwb3J0IFdvTCBvbiBwb3J0IEEgKi8KIAkJaWYgKCFhZGFwdGVyLT5xdWFkX3BvcnRfYSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKaW5kZXggNjUwNzdmMy4uMzY1NWQ5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCkBAIC0zODUsNiArMzg1LDcgQEAKICAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX0ZJQkVSOgogICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTOgogICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUl9MT1dQUk9GSUxFOgogICAgICAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NzE7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTcyRUlfQ09QUEVSOgpAQCAtNDA4LDYgKzQwOSw4IEBACiAgICAgY2FzZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfQU1UOgogICAgIGNhc2UgRTEwMDBfREVWX0lEX0lDSDhfSUdQX0M6CiAgICAgY2FzZSBFMTAwMF9ERVZfSURfSUNIOF9JRkU6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfSUNIOF9JRkVfR1Q6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfSUNIOF9JRkVfRzoKICAgICBjYXNlIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NOgogICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF9pY2g4bGFuOwogICAgICAgICBicmVhazsKQEAgLTIzNjcsNiArMjM3MCw3IEBACiAKICAgICAgICAgLyogTmVlZCB0byByZXNldCB0aGUgUEhZIG9yIHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBpZ25vcmVkICovCiAgICAgICAgIG1paV9jdHJsX3JlZyB8PSBNSUlfQ1JfUkVTRVQ7CisKICAgICAvKiBEaXNhYmxlIE1ESS1YIHN1cHBvcnQgZm9yIDEwLzEwMCAqLwogICAgIH0gZWxzZSBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZmUpIHsKICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUZFX1BIWV9NRElYX0NPTlRST0wsICZwaHlfZGF0YSk7CkBAIC0yMzc5LDYgKzIzODMsNyBAQAogICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUZFX1BIWV9NRElYX0NPTlRST0wsIHBoeV9kYXRhKTsKICAgICAgICAgaWYgKHJldF92YWwpCiAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIENsZWFyIEF1dG8tQ3Jvc3NvdmVyIHRvIGZvcmNlIE1ESSBtYW51YWxseS4gIElHUCByZXF1aXJlcyBNREkKICAgICAgICAgICogZm9yY2VkIHdoZW5ldmVyIHNwZWVkIG9yIGR1cGxleCBhcmUgZm9yY2VkLgpAQCAtMzg2OCw3ICszODczLDcgQEAKICoKICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKICoKLSogU2V0cyBiaXQgMTUgb2YgdGhlIE1JSSBDb250cm9sIHJlZ2lzZXIKKyogU2V0cyBiaXQgMTUgb2YgdGhlIE1JSSBDb250cm9sIHJlZ2lzdGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQzMl90CiBlMTAwMF9waHlfcmVzZXQoc3RydWN0IGUxMDAwX2h3ICpodykKQEAgLTM5NDAsMTQgKzM5NDUsMTUgQEAKICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBQSFlfQ1RSTCwgcmVnIHwgRTEwMDBfUEhZX0NUUkxfR0JFX0RJU0FCTEUgfAogICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfUEhZX0NUUkxfTk9ORDBBX0dCRV9ESVNBQkxFKTsKIAotICAgICAgICAvKiBXcml0ZSBWUiBwb3dlci1kb3duIGVuYWJsZSAqLworICAgICAgICAvKiBXcml0ZSBWUiBwb3dlci1kb3duIGVuYWJsZSAtIGJpdHMgOTo4IHNob3VsZCBiZSAxMGIgKi8KICAgICAgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AzX1ZSX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDNfVlJfQ1RSTCwgcGh5X2RhdGEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDNfVlJfQ1RSTF9NT0RFX1NIVVQpOworICAgICAgICBwaHlfZGF0YSB8PSAoMSA8PCA5KTsKKyAgICAgICAgcGh5X2RhdGEgJj0gfigxIDw8IDgpOworICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AzX1ZSX0NUUkwsIHBoeV9kYXRhKTsKIAogICAgICAgICAvKiBSZWFkIGl0IGJhY2sgYW5kIHRlc3QgKi8KICAgICAgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AzX1ZSX0NUUkwsICZwaHlfZGF0YSk7Ci0gICAgICAgIGlmICgocGh5X2RhdGEgJiBJR1AzX1ZSX0NUUkxfTU9ERV9TSFVUKSB8fCByZXRyeSkKKyAgICAgICAgaWYgKCgocGh5X2RhdGEgJiBJR1AzX1ZSX0NUUkxfTU9ERV9NQVNLKSA9PSBJR1AzX1ZSX0NUUkxfTU9ERV9TSFVUKSB8fCByZXRyeSkKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIC8qIElzc3VlIFBIWSByZXNldCBhbmQgcmVwZWF0IGF0IG1vc3Qgb25lIG1vcmUgdGltZSAqLwpAQCAtNDU0OSw3ICs0NTU1LDcgQEAKICAgICBjYXNlIGUxMDAwX2ljaDhsYW46CiAgICAgICAgIHsKICAgICAgICAgaW50MzJfdCAgaSA9IDA7Ci0gICAgICAgIHVpbnQzMl90IGZsYXNoX3NpemUgPSBFMTAwMF9SRUFEX0lDSDhfUkVHKGh3LCBJQ0g4X0ZMQVNIX0dGUFJFRyk7CisgICAgICAgIHVpbnQzMl90IGZsYXNoX3NpemUgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcoaHcsIElDSF9GTEFTSF9HRlBSRUcpOwogCiAgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9pY2g4OwogICAgICAgICBlZXByb20tPnVzZV9lZXJkID0gRkFMU0U7CkBAIC00NTY1LDEyICs0NTcxLDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBody0+Zmxhc2hfYmFzZV9hZGRyID0gKGZsYXNoX3NpemUgJiBJQ0g4X0dGUFJFR19CQVNFX01BU0spICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDSDhfRkxBU0hfU0VDVE9SX1NJWkU7CisgICAgICAgIGh3LT5mbGFzaF9iYXNlX2FkZHIgPSAoZmxhc2hfc2l6ZSAmIElDSF9HRlBSRUdfQkFTRV9NQVNLKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ0hfRkxBU0hfU0VDVE9SX1NJWkU7CiAKLSAgICAgICAgaHctPmZsYXNoX2Jhbmtfc2l6ZSA9ICgoZmxhc2hfc2l6ZSA+PiAxNikgJiBJQ0g4X0dGUFJFR19CQVNFX01BU0spICsgMTsKLSAgICAgICAgaHctPmZsYXNoX2Jhbmtfc2l6ZSAtPSAoZmxhc2hfc2l6ZSAmIElDSDhfR0ZQUkVHX0JBU0VfTUFTSyk7Ci0gICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgKj0gSUNIOF9GTEFTSF9TRUNUT1JfU0laRTsKKyAgICAgICAgaHctPmZsYXNoX2Jhbmtfc2l6ZSA9ICgoZmxhc2hfc2l6ZSA+PiAxNikgJiBJQ0hfR0ZQUkVHX0JBU0VfTUFTSykgKyAxOworICAgICAgICBody0+Zmxhc2hfYmFua19zaXplIC09IChmbGFzaF9zaXplICYgSUNIX0dGUFJFR19CQVNFX01BU0spOworCisgICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgKj0gSUNIX0ZMQVNIX1NFQ1RPUl9TSVpFOworCiAgICAgICAgIGh3LT5mbGFzaF9iYW5rX3NpemUgLz0gMiAqIHNpemVvZih1aW50MTZfdCk7CiAKICAgICAgICAgYnJlYWs7CkBAIC01NjIwLDggKzU2MjgsOCBAQAogICAgICAgICAgICAgICAgICAqIHNpZ25hdHVyZSBpcyB2YWxpZC4gIFdlIHdhbnQgdG8gZG8gdGhpcyBhZnRlciB0aGUgd3JpdGUKICAgICAgICAgICAgICAgICAgKiBoYXMgY29tcGxldGVkIHNvIHRoYXQgd2UgZG9uJ3QgbWFyayB0aGUgc2VnbWVudCB2YWxpZAogICAgICAgICAgICAgICAgICAqIHdoaWxlIHRoZSB3cml0ZSBpcyBzdGlsbCBpbiBwcm9ncmVzcyAqLwotICAgICAgICAgICAgICAgIGlmIChpID09IEUxMDAwX0lDSDhfTlZNX1NJR19XT1JEKQotICAgICAgICAgICAgICAgICAgICBoaWdoX2J5dGUgPSBFMTAwMF9JQ0g4X05WTV9TSUdfTUFTSyB8IGhpZ2hfYnl0ZTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBFMTAwMF9JQ0hfTlZNX1NJR19XT1JEKQorICAgICAgICAgICAgICAgICAgICBoaWdoX2J5dGUgPSBFMTAwMF9JQ0hfTlZNX1NJR19NQVNLIHwgaGlnaF9ieXRlOwogCiAgICAgICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF92ZXJpZnlfd3JpdGVfaWNoOF9ieXRlKGh3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpIDw8IDEpICsgbmV3X2Jhbmtfb2Zmc2V0ICsgMSwgaGlnaF9ieXRlKTsKQEAgLTU2NDMsMTggKzU2NTEsMTggQEAKICAgICAgICAgICAgICAqIGVyYXNlIGFzIHdlbGwgc2luY2UgdGhlc2UgYml0cyBhcmUgMTEgdG8gc3RhcnQgd2l0aAogICAgICAgICAgICAgICogYW5kIHdlIG5lZWQgdG8gY2hhbmdlIGJpdCAxNCB0byAwYiAqLwogICAgICAgICAgICAgZTEwMDBfcmVhZF9pY2g4X2J5dGUoaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9JQ0g4X05WTV9TSUdfV09SRCAqIDIgKyAxICsgbmV3X2Jhbmtfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTEwMDBfSUNIX05WTV9TSUdfV09SRCAqIDIgKyAxICsgbmV3X2Jhbmtfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpZ2hfYnl0ZSk7CiAgICAgICAgICAgICBoaWdoX2J5dGUgJj0gMHhCRjsKICAgICAgICAgICAgIGVycm9yID0gZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShodywKLSAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0lDSDhfTlZNX1NJR19XT1JEICogMiArIDEgKyBuZXdfYmFua19vZmZzZXQsIGhpZ2hfYnl0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9JQ0hfTlZNX1NJR19XT1JEICogMiArIDEgKyBuZXdfYmFua19vZmZzZXQsIGhpZ2hfYnl0ZSk7CiAgICAgICAgICAgICAvKiBBbmQgaW52YWxpZGF0ZSB0aGUgcHJldmlvdXNseSB2YWxpZCBzZWdtZW50IGJ5IHNldHRpbmcKICAgICAgICAgICAgICAqIGl0cyBzaWduYXR1cmUgd29yZCAoMHgxMykgaGlnaF9ieXRlIHRvIDBiLiBUaGlzIGNhbiBiZQogICAgICAgICAgICAgICogZG9uZSB3aXRob3V0IGFuIGVyYXNlIGJlY2F1c2UgZmxhc2ggZXJhc2Ugc2V0cyBhbGwgYml0cwogICAgICAgICAgICAgICogdG8gMSdzLiBXZSBjYW4gd3JpdGUgMSdzIHRvIDAncyB3aXRob3V0IGFuIGVyYXNlICovCiAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gRTEwMDBfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgIGVycm9yID0gZTEwMDBfdmVyaWZ5X3dyaXRlX2ljaDhfYnl0ZShodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9JQ0g4X05WTV9TSUdfV09SRCAqIDIgKyAxICsgb2xkX2Jhbmtfb2Zmc2V0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9JQ0hfTlZNX1NJR19XT1JEICogMiArIDEgKyBvbGRfYmFua19vZmZzZXQsIDApOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBDbGVhciB0aGUgbm93IG5vdCB1c2VkIGVudHJ5IGluIHRoZSBjYWNoZSAqLwpAQCAtNTg0MSw2ICs1ODQ5LDcgQEAKICAgICBoYXNoX3JlZyA9IChoYXNoX3ZhbHVlID4+IDUpICYgMHg3RjsKICAgICBpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2ljaDhsYW4pCiAgICAgICAgIGhhc2hfcmVnICY9IDB4MUY7CisKICAgICBoYXNoX2JpdCA9IGhhc2hfdmFsdWUgJiAweDFGOwogCiAgICAgbXRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoaHcsIE1UQSwgaGFzaF9yZWcpOwpAQCAtNjAyNiw2ICs2MDM1LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgZWVwcm9tX2RhdGEgPSBJRF9MRURfREVGQVVMVDsKICAgICB9CisKICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgIHRlbXAgPSAoZWVwcm9tX2RhdGEgPj4gKGkgPDwgMikpICYgbGVkX21hc2s7CiAgICAgICAgIHN3aXRjaCAodGVtcCkgewpAQCAtODQ4Niw3ICs4NDk2LDcgQEAKIAogICAgIERFQlVHRlVOQygiZTEwMDBfaWNoOF9jeWNsZV9pbml0Iik7CiAKLSAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRlNUUyk7CisgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKIAogICAgIC8qIE1heSBiZSBjaGVjayB0aGUgRmxhc2ggRGVzIFZhbGlkIGJpdCBpbiBIdyBzdGF0dXMgKi8KICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxkZXN2YWxpZCA9PSAwKSB7CkBAIC04NDk5LDcgKzg1MDksNyBAQAogICAgIGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2VyciA9IDE7CiAgICAgaHNmc3RzLmhzZl9zdGF0dXMuZGFlbCA9IDE7CiAKLSAgICBFMTAwMF9XUklURV9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CisgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTLCBoc2ZzdHMucmVndmFsKTsKIAogICAgIC8qIEVpdGhlciB3ZSBzaG91bGQgaGF2ZSBhIGhhcmR3YXJlIFNQSSBjeWNsZSBpbiBwcm9ncmVzcyBiaXQgdG8gY2hlY2sKICAgICAgKiBhZ2FpbnN0LCBpbiBvcmRlciB0byBzdGFydCBhIG5ldyBjeWNsZSBvciBGRE9ORSBiaXQgc2hvdWxkIGJlIGNoYW5nZWQKQEAgLTg1MTQsMTMgKzg1MjQsMTMgQEAKICAgICAgICAgLyogVGhlcmUgaXMgbm8gY3ljbGUgcnVubmluZyBhdCBwcmVzZW50LCBzbyB3ZSBjYW4gc3RhcnQgYSBjeWNsZSAqLwogICAgICAgICAvKiBCZWdpbiBieSBzZXR0aW5nIEZsYXNoIEN5Y2xlIERvbmUuICovCiAgICAgICAgIGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUgPSAxOwotICAgICAgICBFMTAwMF9XUklURV9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CiAgICAgICAgIGVycm9yID0gRTEwMDBfU1VDQ0VTUzsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBvdGhlcndpc2UgcG9sbCBmb3Igc29tZXRpbWUgc28gdGhlIGN1cnJlbnQgY3ljbGUgaGFzIGEgY2hhbmNlCiAgICAgICAgICAqIHRvIGVuZCBiZWZvcmUgZ2l2aW5nIHVwLiAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSUNIOF9GTEFTSF9DT01NQU5EX1RJTUVPVVQ7IGkrKykgewotICAgICAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZTVFMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSUNIX0ZMQVNIX0NPTU1BTkRfVElNRU9VVDsgaSsrKSB7CisgICAgICAgICAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMpOwogICAgICAgICAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2lucHJvZyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZXJyb3IgPSBFMTAwMF9TVUNDRVNTOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtODUzMSw3ICs4NTQxLDcgQEAKICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgaW4gd2FpdGluZyBmb3IgcHJldmlvdXMgY3ljbGUgdG8gdGltZW91dCwKICAgICAgICAgICAgICAqIG5vdyBzZXQgdGhlIEZsYXNoIEN5Y2xlIERvbmUuICovCiAgICAgICAgICAgICBoc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID0gMTsKLSAgICAgICAgICAgIEUxMDAwX1dSSVRFX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGU1RTLCBoc2ZzdHMucmVndmFsKTsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBERUJVR09VVCgiRmxhc2ggY29udHJvbGxlciBidXN5LCBjYW5ub3QgZ2V0IGFjY2VzcyIpOwogICAgICAgICB9CkBAIC04NTUzLDEzICs4NTYzLDEzIEBACiAgICAgdWludDMyX3QgaSA9IDA7CiAKICAgICAvKiBTdGFydCBhIGN5Y2xlIGJ5IHdyaXRpbmcgMSBpbiBGbGFzaCBDeWNsZSBHbyBpbiBIdyBGbGFzaCBDb250cm9sICovCi0gICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGQ1RMKTsKKyAgICBoc2ZsY3RsLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMKTsKICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsY2dvID0gMTsKLSAgICBFMTAwMF9XUklURV9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOworICAgIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOwogCiAgICAgLyogd2FpdCB0aWxsIEZET05FIGJpdCBpcyBzZXQgdG8gMSAqLwogICAgIGRvIHsKLSAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZTVFMpOworICAgICAgICBoc2ZzdHMucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZTVFMpOwogICAgICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZG9uZSA9PSAxKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIHVkZWxheSgxKTsKQEAgLTg1OTMsMTAgKzg2MDMsMTAgQEAKICAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfaWNoOF9kYXRhIik7CiAKICAgICBpZiAoc2l6ZSA8IDEgIHx8IHNpemUgPiAyIHx8IGRhdGEgPT0gMHgwIHx8Ci0gICAgICAgIGluZGV4ID4gSUNIOF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLKQorICAgICAgICBpbmRleCA+IElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLKQogICAgICAgICByZXR1cm4gZXJyb3I7CiAKLSAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyA9IChJQ0g4X0ZMQVNIX0xJTkVBUl9BRERSX01BU0sgJiBpbmRleCkgKworICAgIGZsYXNoX2xpbmVhcl9hZGRyZXNzID0gKElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLICYgaW5kZXgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5mbGFzaF9iYXNlX2FkZHI7CiAKICAgICBkbyB7CkBAIC04NjA2LDI1ICs4NjE2LDI1IEBACiAgICAgICAgIGlmIChlcnJvciAhPSBFMTAwMF9TVUNDRVNTKQogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGQ1RMKTsKKyAgICAgICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCk7CiAgICAgICAgIC8qIDBiLzFiIGNvcnJlc3BvbmRzIHRvIDEgb3IgMiBieXRlIHNpemUsIHJlc3BlY3RpdmVseS4gKi8KICAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGRiY291bnQgPSBzaXplIC0gMTsKLSAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIOF9DWUNMRV9SRUFEOwotICAgICAgICBFMTAwMF9XUklURV9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOworICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsY3ljbGUgPSBJQ0hfQ1lDTEVfUkVBRDsKKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CiAKICAgICAgICAgLyogV3JpdGUgdGhlIGxhc3QgMjQgYml0cyBvZiBpbmRleCBpbnRvIEZsYXNoIExpbmVhciBhZGRyZXNzIGZpZWxkIGluCiAgICAgICAgICAqIEZsYXNoIEFkZHJlc3MgKi8KICAgICAgICAgLyogVE9ETzogVEJEIG1heWJlIGNoZWNrIHRoZSBpbmRleCBhZ2FpbnN0IHRoZSBzaXplIG9mIGZsYXNoICovCiAKLSAgICAgICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcoaHcsIElDSDhfRkxBU0hfRkFERFIsIGZsYXNoX2xpbmVhcl9hZGRyZXNzKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRyhodywgSUNIX0ZMQVNIX0ZBRERSLCBmbGFzaF9saW5lYXJfYWRkcmVzcyk7CiAKLSAgICAgICAgZXJyb3IgPSBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKGh3LCBJQ0g4X0ZMQVNIX0NPTU1BTkRfVElNRU9VVCk7CisgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShodywgSUNIX0ZMQVNIX0NPTU1BTkRfVElNRU9VVCk7CiAKICAgICAgICAgLyogQ2hlY2sgaWYgRkNFUlIgaXMgc2V0IHRvIDEsIGlmIHNldCB0byAxLCBjbGVhciBpdCBhbmQgdHJ5IHRoZSB3aG9sZQogICAgICAgICAgKiBzZXF1ZW5jZSBhIGZldyBtb3JlIHRpbWVzLCBlbHNlIHJlYWQgaW4gKHNoaWZ0IGluKSB0aGUgRmxhc2ggRGF0YTAsCiAgICAgICAgICAqIHRoZSBvcmRlciBpcyBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IG1zYiB0byBsc2IgKi8KICAgICAgICAgaWYgKGVycm9yID09IEUxMDAwX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGZsYXNoX2RhdGEgPSBFMTAwMF9SRUFEX0lDSDhfUkVHKGh3LCBJQ0g4X0ZMQVNIX0ZEQVRBMCk7CisgICAgICAgICAgICBmbGFzaF9kYXRhID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfRkRBVEEwKTsKICAgICAgICAgICAgIGlmIChzaXplID09IDEpIHsKICAgICAgICAgICAgICAgICAqZGF0YSA9ICh1aW50OF90KShmbGFzaF9kYXRhICYgMHgwMDAwMDBGRik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMikgewpAQCAtODYzNCw5ICs4NjQ0LDkgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIElmIHdlJ3ZlIGdvdHRlbiBoZXJlLCB0aGVuIHRoaW5ncyBhcmUgcHJvYmFibHkgY29tcGxldGVseSBob3NlZCwKICAgICAgICAgICAgICAqIGJ1dCBpZiB0aGUgZXJyb3IgY29uZGl0aW9uIGlzIGRldGVjdGVkLCBpdCB3b24ndCBodXJ0IHRvIGdpdmUKLSAgICAgICAgICAgICAqIGl0IGFub3RoZXIgdHJ5Li4uSUNIOF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgdGltZXMuCisgICAgICAgICAgICAgKiBpdCBhbm90aGVyIHRyeS4uLklDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgdGltZXMuCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGU1RTKTsKKyAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7CiAgICAgICAgICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyID09IDEpIHsKICAgICAgICAgICAgICAgICAvKiBSZXBlYXQgZm9yIHNvbWUgdGltZSBiZWZvcmUgZ2l2aW5nIHVwLiAqLwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtODY0NSw3ICs4NjU1LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gd2hpbGUgKGNvdW50KysgPCBJQ0g4X0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCk7CisgICAgfSB3aGlsZSAoY291bnQrKyA8IElDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQpOwogCiAgICAgcmV0dXJuIGVycm9yOwogfQpAQCAtODY3MiwxMCArODY4MiwxMCBAQAogICAgIERFQlVHRlVOQygiZTEwMDBfd3JpdGVfaWNoOF9kYXRhIik7CiAKICAgICBpZiAoc2l6ZSA8IDEgIHx8IHNpemUgPiAyIHx8IGRhdGEgPiBzaXplICogMHhmZiB8fAotICAgICAgICBpbmRleCA+IElDSDhfRkxBU0hfTElORUFSX0FERFJfTUFTSykKKyAgICAgICAgaW5kZXggPiBJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSykKICAgICAgICAgcmV0dXJuIGVycm9yOwogCi0gICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgPSAoSUNIOF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLICYgaW5kZXgpICsKKyAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyA9IChJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSyAmIGluZGV4KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBody0+Zmxhc2hfYmFzZV9hZGRyOwogCiAgICAgZG8gewpAQCAtODY4NSwzNCArODY5NSwzNCBAQAogICAgICAgICBpZiAoZXJyb3IgIT0gRTEwMDBfU1VDQ0VTUykKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRkNUTCk7CisgICAgICAgIGhzZmxjdGwucmVndmFsID0gRTEwMDBfUkVBRF9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwpOwogICAgICAgICAvKiAwYi8xYiBjb3JyZXNwb25kcyB0byAxIG9yIDIgYnl0ZSBzaXplLCByZXNwZWN0aXZlbHkuICovCiAgICAgICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxkYmNvdW50ID0gc2l6ZSAtMTsKLSAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIOF9DWUNMRV9XUklURTsKLSAgICAgICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKKyAgICAgICAgaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIX0NZQ0xFX1dSSVRFOworICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKIAogICAgICAgICAvKiBXcml0ZSB0aGUgbGFzdCAyNCBiaXRzIG9mIGluZGV4IGludG8gRmxhc2ggTGluZWFyIGFkZHJlc3MgZmllbGQgaW4KICAgICAgICAgICogRmxhc2ggQWRkcmVzcyAqLwotICAgICAgICBFMTAwMF9XUklURV9JQ0g4X1JFRyhodywgSUNIOF9GTEFTSF9GQUREUiwgZmxhc2hfbGluZWFyX2FkZHJlc3MpOworICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfRkFERFIsIGZsYXNoX2xpbmVhcl9hZGRyZXNzKTsKIAogICAgICAgICBpZiAoc2l6ZSA9PSAxKQogICAgICAgICAgICAgZmxhc2hfZGF0YSA9ICh1aW50MzJfdClkYXRhICYgMHgwMEZGOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBmbGFzaF9kYXRhID0gKHVpbnQzMl90KWRhdGE7CiAKLSAgICAgICAgRTEwMDBfV1JJVEVfSUNIOF9SRUcoaHcsIElDSDhfRkxBU0hfRkRBVEEwLCBmbGFzaF9kYXRhKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfSUNIX0ZMQVNIX1JFRyhodywgSUNIX0ZMQVNIX0ZEQVRBMCwgZmxhc2hfZGF0YSk7CiAKICAgICAgICAgLyogY2hlY2sgaWYgRkNFUlIgaXMgc2V0IHRvIDEgLCBpZiBzZXQgdG8gMSwgY2xlYXIgaXQgYW5kIHRyeSB0aGUgd2hvbGUKICAgICAgICAgICogc2VxdWVuY2UgYSBmZXcgbW9yZSB0aW1lcyBlbHNlIGRvbmUgKi8KLSAgICAgICAgZXJyb3IgPSBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKGh3LCBJQ0g4X0ZMQVNIX0NPTU1BTkRfVElNRU9VVCk7CisgICAgICAgIGVycm9yID0gZTEwMDBfaWNoOF9mbGFzaF9jeWNsZShodywgSUNIX0ZMQVNIX0NPTU1BTkRfVElNRU9VVCk7CiAgICAgICAgIGlmIChlcnJvciA9PSBFMTAwMF9TVUNDRVNTKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIElmIHdlJ3JlIGhlcmUsIHRoZW4gdGhpbmdzIGFyZSBtb3N0IGxpa2VseSBjb21wbGV0ZWx5IGhvc2VkLAogICAgICAgICAgICAgICogYnV0IGlmIHRoZSBlcnJvciBjb25kaXRpb24gaXMgZGV0ZWN0ZWQsIGl0IHdvbid0IGh1cnQgdG8gZ2l2ZQotICAgICAgICAgICAgICogaXQgYW5vdGhlciB0cnkuLi5JQ0g4X0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCB0aW1lcy4KKyAgICAgICAgICAgICAqIGl0IGFub3RoZXIgdHJ5Li4uSUNIX0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCB0aW1lcy4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZTVFMpOworICAgICAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIX0ZMQVNIX1JFRzE2KGh3LCBJQ0hfRkxBU0hfSFNGU1RTKTsKICAgICAgICAgICAgIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5mbGNlcnIgPT0gMSkgewogICAgICAgICAgICAgICAgIC8qIFJlcGVhdCBmb3Igc29tZSB0aW1lIGJlZm9yZSBnaXZpbmcgdXAuICovCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC04NzIxLDcgKzg3MzEsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSB3aGlsZSAoY291bnQrKyA8IElDSDhfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UKTsKKyAgICB9IHdoaWxlIChjb3VudCsrIDwgSUNIX0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCk7CiAKICAgICByZXR1cm4gZXJyb3I7CiB9CkBAIC04ODQwLDcgKzg4NTAsNyBAQAogICAgIGludDMyX3QgIGogPSAwOwogICAgIGludDMyX3QgIGVycm9yX2ZsYWcgPSAwOwogCi0gICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZTVFMpOworICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7CiAKICAgICAvKiBEZXRlcm1pbmUgSFcgU2VjdG9yIHNpemU6IFJlYWQgQkVSQVNFIGJpdHMgb2YgSHcgZmxhc2ggU3RhdHVzIHJlZ2lzdGVyICovCiAgICAgLyogMDA6IFRoZSBIdyBzZWN0b3IgaXMgMjU2IGJ5dGVzLCBoZW5jZSB3ZSBuZWVkIHRvIGVyYXNlIDE2CkBAIC04ODUzLDE5ICs4ODYzLDE0IEBACiAgICAgICogMTE6IFRoZSBIdyBzZWN0b3Igc2l6ZSBpcyA2NEsgYnl0ZXMgKi8KICAgICBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuYmVyYXNlc3ogPT0gMHgwKSB7CiAgICAgICAgIC8qIEh3IHNlY3RvciBzaXplIDI1NiAqLwotICAgICAgICBzdWJfc2VjdG9yX3NpemUgPSBJQ0g4X0ZMQVNIX1NFR19TSVpFXzI1NjsKLSAgICAgICAgYmFua19zaXplID0gSUNIOF9GTEFTSF9TRUNUT1JfU0laRTsKLSAgICAgICAgaXRlcmF0aW9uID0gSUNIOF9GTEFTSF9TRUNUT1JfU0laRSAvIElDSDhfRkxBU0hfU0VHX1NJWkVfMjU2OworICAgICAgICBzdWJfc2VjdG9yX3NpemUgPSBJQ0hfRkxBU0hfU0VHX1NJWkVfMjU2OworICAgICAgICBiYW5rX3NpemUgPSBJQ0hfRkxBU0hfU0VDVE9SX1NJWkU7CisgICAgICAgIGl0ZXJhdGlvbiA9IElDSF9GTEFTSF9TRUNUT1JfU0laRSAvIElDSF9GTEFTSF9TRUdfU0laRV8yNTY7CiAgICAgfSBlbHNlIGlmIChoc2ZzdHMuaHNmX3N0YXR1cy5iZXJhc2VzeiA9PSAweDEpIHsKLSAgICAgICAgYmFua19zaXplID0gSUNIOF9GTEFTSF9TRUdfU0laRV80SzsKLSAgICAgICAgaXRlcmF0aW9uID0gMTsKLSAgICB9IGVsc2UgaWYgKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF9pY2g4bGFuICYmCi0gICAgICAgICAgICAgICBoc2ZzdHMuaHNmX3N0YXR1cy5iZXJhc2VzeiA9PSAweDIpIHsKLSAgICAgICAgLyogOEsgZXJhc2Ugc2l6ZSBpbnZhbGlkIGZvciBJQ0g4IC0gYWRkZWQgaW4gZm9yIElDSDkgKi8KLSAgICAgICAgYmFua19zaXplID0gSUNIOV9GTEFTSF9TRUdfU0laRV84SzsKKyAgICAgICAgYmFua19zaXplID0gSUNIX0ZMQVNIX1NFR19TSVpFXzRLOwogICAgICAgICBpdGVyYXRpb24gPSAxOwogICAgIH0gZWxzZSBpZiAoaHNmc3RzLmhzZl9zdGF0dXMuYmVyYXNlc3ogPT0gMHgzKSB7Ci0gICAgICAgIGJhbmtfc2l6ZSA9IElDSDhfRkxBU0hfU0VHX1NJWkVfNjRLOworICAgICAgICBiYW5rX3NpemUgPSBJQ0hfRkxBU0hfU0VHX1NJWkVfNjRLOwogICAgICAgICBpdGVyYXRpb24gPSAxOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBlcnJvcjsKQEAgLTg4ODMsOSArODg4OCw5IEBACiAKICAgICAgICAgICAgIC8qIFdyaXRlIGEgdmFsdWUgMTEgKGJsb2NrIEVyYXNlKSBpbiBGbGFzaCBDeWNsZSBmaWVsZCBpbiBIdyBmbGFzaAogICAgICAgICAgICAgICogQ29udHJvbCAqLwotICAgICAgICAgICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSDhfUkVHMTYoaHcsIElDSDhfRkxBU0hfSFNGQ1RMKTsKLSAgICAgICAgICAgIGhzZmxjdGwuaHNmX2N0cmwuZmxjeWNsZSA9IElDSDhfQ1lDTEVfRVJBU0U7Ci0gICAgICAgICAgICBFMTAwMF9XUklURV9JQ0g4X1JFRzE2KGh3LCBJQ0g4X0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOworICAgICAgICAgICAgaHNmbGN0bC5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRkNUTCk7CisgICAgICAgICAgICBoc2ZsY3RsLmhzZl9jdHJsLmZsY3ljbGUgPSBJQ0hfQ1lDTEVfRVJBU0U7CisgICAgICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHMTYoaHcsIElDSF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKIAogICAgICAgICAgICAgLyogV3JpdGUgdGhlIGxhc3QgMjQgYml0cyBvZiBhbiBpbmRleCB3aXRoaW4gdGhlIGJsb2NrIGludG8gRmxhc2gKICAgICAgICAgICAgICAqIExpbmVhciBhZGRyZXNzIGZpZWxkIGluIEZsYXNoIEFkZHJlc3MuICBUaGlzIHByb2JhYmx5IG5lZWRzIHRvCkBAIC04ODkzLDE3ICs4ODk4LDE3IEBACiAgICAgICAgICAgICAgKiB0aGUgc29mdHdhcmUgYmFuayBzaXplICg0LCA4IG9yIDY0IEtCeXRlcykgKi8KICAgICAgICAgICAgIGZsYXNoX2xpbmVhcl9hZGRyZXNzID0gYmFuayAqIGJhbmtfc2l6ZSArIGogKiBzdWJfc2VjdG9yX3NpemU7CiAgICAgICAgICAgICBmbGFzaF9saW5lYXJfYWRkcmVzcyArPSBody0+Zmxhc2hfYmFzZV9hZGRyOwotICAgICAgICAgICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgJj0gSUNIOF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLOworICAgICAgICAgICAgZmxhc2hfbGluZWFyX2FkZHJlc3MgJj0gSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0s7CiAKLSAgICAgICAgICAgIEUxMDAwX1dSSVRFX0lDSDhfUkVHKGh3LCBJQ0g4X0ZMQVNIX0ZBRERSLCBmbGFzaF9saW5lYXJfYWRkcmVzcyk7CisgICAgICAgICAgICBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHKGh3LCBJQ0hfRkxBU0hfRkFERFIsIGZsYXNoX2xpbmVhcl9hZGRyZXNzKTsKIAotICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKGh3LCBJQ0g4X0ZMQVNIX0VSQVNFX1RJTUVPVVQpOworICAgICAgICAgICAgZXJyb3IgPSBlMTAwMF9pY2g4X2ZsYXNoX2N5Y2xlKGh3LCBJQ0hfRkxBU0hfRVJBU0VfVElNRU9VVCk7CiAgICAgICAgICAgICAvKiBDaGVjayBpZiBGQ0VSUiBpcyBzZXQgdG8gMS4gIElmIDEsIGNsZWFyIGl0IGFuZCB0cnkgdGhlIHdob2xlCiAgICAgICAgICAgICAgKiBzZXF1ZW5jZSBhIGZldyBtb3JlIHRpbWVzIGVsc2UgRG9uZSAqLwogICAgICAgICAgICAgaWYgKGVycm9yID09IEUxMDAwX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaHNmc3RzLnJlZ3ZhbCA9IEUxMDAwX1JFQURfSUNIOF9SRUcxNihodywgSUNIOF9GTEFTSF9IU0ZTVFMpOworICAgICAgICAgICAgICAgIGhzZnN0cy5yZWd2YWwgPSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihodywgSUNIX0ZMQVNIX0hTRlNUUyk7CiAgICAgICAgICAgICAgICAgaWYgKGhzZnN0cy5oc2Zfc3RhdHVzLmZsY2VyciA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIHJlcGVhdCBmb3Igc29tZSB0aW1lIGJlZm9yZSBnaXZpbmcgdXAgKi8KICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC04OTEyLDcgKzg5MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKChjb3VudCA8IElDSDhfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UKSAmJiAhZXJyb3JfZmxhZyk7CisgICAgICAgIH0gd2hpbGUgKChjb3VudCA8IElDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQpICYmICFlcnJvcl9mbGFnKTsKICAgICAgICAgaWYgKGVycm9yX2ZsYWcgPT0gMSkKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTkwMTMsNSArOTAxOCwzIEBACiAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiB9CiAKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaAppbmRleCAxMTI0NDdmLi4zMzIxZmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKQEAgLTEyOCwxMSArMTI4LDEzIEBACiAvKiBQQ0kgYnVzIHdpZHRocyAqLwogdHlwZWRlZiBlbnVtIHsKICAgICBlMTAwMF9idXNfd2lkdGhfdW5rbm93biA9IDAsCisgICAgLyogVGhlc2UgUENJZSB2YWx1ZXMgc2hvdWxkIGxpdGVyYWxseSBtYXRjaCB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcworICAgICAqIGZyb20gY29uZmlnIHNwYWNlICovCisgICAgZTEwMDBfYnVzX3dpZHRoX3BjaWV4XzEgPSAxLAorICAgIGUxMDAwX2J1c193aWR0aF9wY2lleF8yID0gMiwKKyAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfNCA9IDQsCiAgICAgZTEwMDBfYnVzX3dpZHRoXzMyLAogICAgIGUxMDAwX2J1c193aWR0aF82NCwKLSAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfMSwKLSAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfMiwKLSAgICBlMTAwMF9idXNfd2lkdGhfcGNpZXhfNCwKICAgICBlMTAwMF9idXNfd2lkdGhfcmVzZXJ2ZWQKIH0gZTEwMDBfYnVzX3dpZHRoOwogCkBAIC0zMjYsNiArMzI4LDcgQEAKIGludDMyX3QgZTEwMDBfcGh5X3Jlc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcpOwogaW50MzJfdCBlMTAwMF9waHlfZ2V0X2luZm8oc3RydWN0IGUxMDAwX2h3ICpodywgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbyk7CiBpbnQzMl90IGUxMDAwX3ZhbGlkYXRlX21kaV9zZXR0aW5nKHN0cnVjdCBlMTAwMF9odyAqaHcpOworCiB2b2lkIGUxMDAwX3BoeV9wb3dlcmRvd25fd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIAogLyogRUVQUk9NIEZ1bmN0aW9ucyAqLwpAQCAtMzkwLDcgKzM5Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoKTsKIGJvb2xlYW5fdCBlMTAwMF9jaGVja19tbmdfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGJvb2xlYW5fdCBlMTAwMF9lbmFibGVfdHhfcGt0X2ZpbHRlcmluZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKLQogaW50MzJfdCBlMTAwMF9yZWFkX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCByZWcsIHVpbnQxNl90IHdvcmRzLCB1aW50MTZfdCAqZGF0YSk7CiBpbnQzMl90IGUxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIGludDMyX3QgZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKQEAgLTQ3Myw2ICs0NzUsNyBAQAogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9GSUJFUiAgICAgICAweDEwNUYKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcxRUJfU0VSREVTICAgICAgMHgxMDYwCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSIDB4MTBBNAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzFFQl9RVUFEX0NPUFBFUl9MT1dQUk9GSUxFICAweDEwQkMKICNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTcyRUlfQ09QUEVSICAgICAgMHgxMDdECiAjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU3MkVJX0ZJQkVSICAgICAgIDB4MTA3RQogI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzJFSV9TRVJERVMgICAgICAweDEwN0YKQEAgLTQ5MCw2ICs0OTMsOCBAQAogI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JR1BfQU1UICAgICAgICAweDEwNEEKICNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUdQX0MgICAgICAgICAgMHgxMDRCCiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g4X0lGRSAgICAgICAgICAgIDB4MTA0QworI2RlZmluZSBFMTAwMF9ERVZfSURfSUNIOF9JRkVfR1QgICAgICAgICAweDEwQzQKKyNkZWZpbmUgRTEwMDBfREVWX0lEX0lDSDhfSUZFX0cgICAgICAgICAgMHgxMEM1CiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9JQ0g4X0lHUF9NICAgICAgICAgIDB4MTA0RAogCiAKQEAgLTU3Niw2ICs1ODEsNyBAQAogICogRTEwMDBfUkFSX0VOVFJJRVMgLSAxIG11bHRpY2FzdCBhZGRyZXNzZXMuCiAgKi8KICNkZWZpbmUgRTEwMDBfUkFSX0VOVFJJRVMgMTUKKwogI2RlZmluZSBFMTAwMF9SQVJfRU5UUklFU19JQ0g4TEFOICA2CiAKICNkZWZpbmUgTUlOX05VTUJFUl9PRl9ERVNDUklQVE9SUyAgOApAQCAtMTMzNSw5ICsxMzQxLDkgQEAKICAgICB1aW50NjRfdCBnb3RjaDsKICAgICB1aW50NjRfdCBybmJjOwogICAgIHVpbnQ2NF90IHJ1YzsKKyAgICB1aW50NjRfdCByZmM7CiAgICAgdWludDY0X3Qgcm9jOwogICAgIHVpbnQ2NF90IHJsZXJyYzsKLSAgICB1aW50NjRfdCByZmM7CiAgICAgdWludDY0X3QgcmpjOwogICAgIHVpbnQ2NF90IG1ncHJjOwogICAgIHVpbnQ2NF90IG1ncGRjOwpAQCAtMTU3Nyw4ICsxNTgzLDggQEAKICNkZWZpbmUgRTEwMDBfSElDUl9GV19SRVNFVCAgMHhDMAogCiAjZGVmaW5lIEUxMDAwX1NIQURPV19SQU1fV09SRFMgICAgIDIwNDgKLSNkZWZpbmUgRTEwMDBfSUNIOF9OVk1fU0lHX1dPUkQgICAgMHgxMwotI2RlZmluZSBFMTAwMF9JQ0g4X05WTV9TSUdfTUFTSyAgICAweEMwCisjZGVmaW5lIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQgICAgIDB4MTMKKyNkZWZpbmUgRTEwMDBfSUNIX05WTV9TSUdfTUFTSyAgICAgMHhDMAogCiAvKiBFRVBST00gUmVhZCAqLwogI2RlZmluZSBFMTAwMF9FRVJEX1NUQVJUICAgICAgMHgwMDAwMDAwMSAvKiBTdGFydCBSZWFkICovCkBAIC0xOTYxLDkgKzE5NjcsOSBAQAogI2RlZmluZSBFMTAwMF9SWERDVExfR1JBTiAgICAweDAxMDAwMDAwIC8qIFJYRENUTCBHcmFudWxhcml0eSAqLwogCiAvKiBUcmFuc21pdCBEZXNjcmlwdG9yIENvbnRyb2wgKi8KLSNkZWZpbmUgRTEwMDBfVFhEQ1RMX1BUSFJFU0ggMHgwMDAwMDBGRiAvKiBUWERDVEwgUHJlZmV0Y2ggVGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX1RYRENUTF9IVEhSRVNIIDB4MDAwMEZGMDAgLyogVFhEQ1RMIEhvc3QgVGhyZXNob2xkICovCi0jZGVmaW5lIEUxMDAwX1RYRENUTF9XVEhSRVNIIDB4MDBGRjAwMDAgLyogVFhEQ1RMIFdyaXRlYmFjayBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX1BUSFJFU0ggMHgwMDAwMDAzRiAvKiBUWERDVEwgUHJlZmV0Y2ggVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9IVEhSRVNIIDB4MDAwMDNGMDAgLyogVFhEQ1RMIEhvc3QgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1RYRENUTF9XVEhSRVNIIDB4MDAzRjAwMDAgLyogVFhEQ1RMIFdyaXRlYmFjayBUaHJlc2hvbGQgKi8KICNkZWZpbmUgRTEwMDBfVFhEQ1RMX0dSQU4gICAgMHgwMTAwMDAwMCAvKiBUWERDVEwgR3JhbnVsYXJpdHkgKi8KICNkZWZpbmUgRTEwMDBfVFhEQ1RMX0xXVEhSRVNIIDB4RkUwMDAwMDAgLyogVFhEQ1RMIExvdyBUaHJlc2hvbGQgKi8KICNkZWZpbmUgRTEwMDBfVFhEQ1RMX0ZVTExfVFhfREVTQ19XQiAweDAxMDEwMDAwIC8qIEdSQU49MSwgV1RIUkVTSD0xICovCkBAIC0zMTcyLDYgKzMxNzgsNyBAQAogI2RlZmluZSBJR1AzX1ZSX0NUUkwgXAogICAgICAgICBQSFlfUkVHKDc3NiwgMTgpIC8qIFZvbHRhZ2UgcmVndWxhdG9yIGNvbnRyb2wgcmVnaXN0ZXIgKi8KICNkZWZpbmUgSUdQM19WUl9DVFJMX01PREVfU0hVVCAgICAgICAweDAyMDAgLyogRW50ZXIgcG93ZXJkb3duLCBzaHV0ZG93biBWUnMgKi8KKyNkZWZpbmUgSUdQM19WUl9DVFJMX01PREVfTUFTSyAgICAgICAweDAzMDAgLyogU2h1dGRvd24gVlIgTWFzayAqLwogCiAjZGVmaW5lIElHUDNfQ0FQQUJJTElUWSBcCiAgICAgICAgIFBIWV9SRUcoNzc2LCAxOSkgLyogSUdQMyBDYXBhYmlsaXR5IFJlZ2lzdGVyICovCkBAIC0zMjU2LDQxICszMjYzLDQwIEBACiAjZGVmaW5lIElGRV9QU0NMX1BST0JFX0xFRFNfT0ZGICAgICAgICAgICAgICAweDAwMDYgIC8qIEZvcmNlIExFRHMgMCBhbmQgMiBvZmYgKi8KICNkZWZpbmUgSUZFX1BTQ0xfUFJPQkVfTEVEU19PTiAgICAgICAgICAgICAgIDB4MDAwNyAgLyogRm9yY2UgTEVEcyAwIGFuZCAyIG9uICovCiAKLSNkZWZpbmUgSUNIOF9GTEFTSF9DT01NQU5EX1RJTUVPVVQgICAgICAgICAgIDUwMDAgICAgLyogNTAwMCB1U2VjcyAtIGFkanVzdGVkICovCi0jZGVmaW5lIElDSDhfRkxBU0hfRVJBU0VfVElNRU9VVCAgICAgICAgICAgICAzMDAwMDAwIC8qIFVwIHRvIDMgc2Vjb25kcyAtIHdvcnN0IGNhc2UgKi8KLSNkZWZpbmUgSUNIOF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgICAgICAgIDEwICAgICAgLyogMTAgY3ljbGVzICovCi0jZGVmaW5lIElDSDhfRkxBU0hfU0VHX1NJWkVfMjU2ICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgSUNIOF9GTEFTSF9TRUdfU0laRV80SyAgICAgICAgICAgICAgIDQwOTYKLSNkZWZpbmUgSUNIOV9GTEFTSF9TRUdfU0laRV84SyAgICAgICAgICAgICAgIDgxOTIKLSNkZWZpbmUgSUNIOF9GTEFTSF9TRUdfU0laRV82NEsgICAgICAgICAgICAgIDY1NTM2CisjZGVmaW5lIElDSF9GTEFTSF9DT01NQU5EX1RJTUVPVVQgICAgICAgICAgICA1MDAwICAgIC8qIDUwMDAgdVNlY3MgLSBhZGp1c3RlZCAqLworI2RlZmluZSBJQ0hfRkxBU0hfRVJBU0VfVElNRU9VVCAgICAgICAgICAgICAgMzAwMDAwMCAvKiBVcCB0byAzIHNlY29uZHMgLSB3b3JzdCBjYXNlICovCisjZGVmaW5lIElDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgICAgICAgICAxMCAgICAgIC8qIDEwIGN5Y2xlcyAqLworI2RlZmluZSBJQ0hfRkxBU0hfU0VHX1NJWkVfMjU2ICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIElDSF9GTEFTSF9TRUdfU0laRV80SyAgICAgICAgICAgICAgICA0MDk2CisjZGVmaW5lIElDSF9GTEFTSF9TRUdfU0laRV82NEsgICAgICAgICAgICAgICA2NTUzNgogCi0jZGVmaW5lIElDSDhfQ1lDTEVfUkVBRCAgICAgICAgICAgICAgICAgICAgICAweDAKLSNkZWZpbmUgSUNIOF9DWUNMRV9SRVNFUlZFRCAgICAgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBJQ0g4X0NZQ0xFX1dSSVRFICAgICAgICAgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIElDSDhfQ1lDTEVfRVJBU0UgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgSUNIX0NZQ0xFX1JFQUQgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBJQ0hfQ1lDTEVfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIElDSF9DWUNMRV9XUklURSAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgSUNIX0NZQ0xFX0VSQVNFICAgICAgICAgICAgICAgICAgICAgIDB4MwogCi0jZGVmaW5lIElDSDhfRkxBU0hfR0ZQUkVHICAgMHgwMDAwCi0jZGVmaW5lIElDSDhfRkxBU0hfSFNGU1RTICAgMHgwMDA0Ci0jZGVmaW5lIElDSDhfRkxBU0hfSFNGQ1RMICAgMHgwMDA2Ci0jZGVmaW5lIElDSDhfRkxBU0hfRkFERFIgICAgMHgwMDA4Ci0jZGVmaW5lIElDSDhfRkxBU0hfRkRBVEEwICAgMHgwMDEwCi0jZGVmaW5lIElDSDhfRkxBU0hfRlJBQ0MgICAgMHgwMDUwCi0jZGVmaW5lIElDSDhfRkxBU0hfRlJFRzAgICAgMHgwMDU0Ci0jZGVmaW5lIElDSDhfRkxBU0hfRlJFRzEgICAgMHgwMDU4Ci0jZGVmaW5lIElDSDhfRkxBU0hfRlJFRzIgICAgMHgwMDVDCi0jZGVmaW5lIElDSDhfRkxBU0hfRlJFRzMgICAgMHgwMDYwCi0jZGVmaW5lIElDSDhfRkxBU0hfRlBSMCAgICAgMHgwMDc0Ci0jZGVmaW5lIElDSDhfRkxBU0hfRlBSMSAgICAgMHgwMDc4Ci0jZGVmaW5lIElDSDhfRkxBU0hfU1NGU1RTICAgMHgwMDkwCi0jZGVmaW5lIElDSDhfRkxBU0hfU1NGQ1RMICAgMHgwMDkyCi0jZGVmaW5lIElDSDhfRkxBU0hfUFJFT1AgICAgMHgwMDk0Ci0jZGVmaW5lIElDSDhfRkxBU0hfT1BUWVBFICAgMHgwMDk2Ci0jZGVmaW5lIElDSDhfRkxBU0hfT1BNRU5VICAgMHgwMDk4CisjZGVmaW5lIElDSF9GTEFTSF9HRlBSRUcgICAweDAwMDAKKyNkZWZpbmUgSUNIX0ZMQVNIX0hTRlNUUyAgIDB4MDAwNAorI2RlZmluZSBJQ0hfRkxBU0hfSFNGQ1RMICAgMHgwMDA2CisjZGVmaW5lIElDSF9GTEFTSF9GQUREUiAgICAweDAwMDgKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZEQVRBMCAgIDB4MDAxMAorI2RlZmluZSBJQ0hfRkxBU0hfRlJBQ0MgICAgMHgwMDUwCisjZGVmaW5lIElDSF9GTEFTSF9GUkVHMCAgICAweDAwNTQKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZSRUcxICAgIDB4MDA1OAorI2RlZmluZSBJQ0hfRkxBU0hfRlJFRzIgICAgMHgwMDVDCisjZGVmaW5lIElDSF9GTEFTSF9GUkVHMyAgICAweDAwNjAKKyNkZWZpbmUgSUNIX0ZMQVNIX0ZQUjAgICAgIDB4MDA3NAorI2RlZmluZSBJQ0hfRkxBU0hfRlBSMSAgICAgMHgwMDc4CisjZGVmaW5lIElDSF9GTEFTSF9TU0ZTVFMgICAweDAwOTAKKyNkZWZpbmUgSUNIX0ZMQVNIX1NTRkNUTCAgIDB4MDA5MgorI2RlZmluZSBJQ0hfRkxBU0hfUFJFT1AgICAgMHgwMDk0CisjZGVmaW5lIElDSF9GTEFTSF9PUFRZUEUgICAweDAwOTYKKyNkZWZpbmUgSUNIX0ZMQVNIX09QTUVOVSAgIDB4MDA5OAogCi0jZGVmaW5lIElDSDhfRkxBU0hfUkVHX01BUFNJWkUgICAgICAweDAwQTAKLSNkZWZpbmUgSUNIOF9GTEFTSF9TRUNUT1JfU0laRSAgICAgIDQwOTYKLSNkZWZpbmUgSUNIOF9HRlBSRUdfQkFTRV9NQVNLICAgICAgIDB4MUZGRgotI2RlZmluZSBJQ0g4X0ZMQVNIX0xJTkVBUl9BRERSX01BU0sgMHgwMEZGRkZGRgorI2RlZmluZSBJQ0hfRkxBU0hfUkVHX01BUFNJWkUgICAgICAweDAwQTAKKyNkZWZpbmUgSUNIX0ZMQVNIX1NFQ1RPUl9TSVpFICAgICAgNDA5NgorI2RlZmluZSBJQ0hfR0ZQUkVHX0JBU0VfTUFTSyAgICAgICAweDFGRkYKKyNkZWZpbmUgSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0sgMHgwMEZGRkZGRgogCiAvKiBJQ0g4IEdiRSBGbGFzaCBIYXJkd2FyZSBTZXF1ZW5jaW5nIEZsYXNoIFN0YXR1cyBSZWdpc3RlciBiaXQgYnJlYWtkb3duICovCiAvKiBPZmZzZXQgMDRoIEhTRlNUUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCmluZGV4IGNlMGQzNWYuLjczZjNhODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKQEAgLTI3LDYgKzI3LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJlMTAwMC5oIgorI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KIAogY2hhciBlMTAwMF9kcml2ZXJfbmFtZVtdID0gImUxMDAwIjsKIHN0YXRpYyBjaGFyIGUxMDAwX2RyaXZlcl9zdHJpbmdbXSA9ICJJbnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIERyaXZlciI7CkBAIC0zNSw3ICszNiw3IEBACiAjZWxzZQogI2RlZmluZSBEUklWRVJOQVBJICItTkFQSSIKICNlbmRpZgotI2RlZmluZSBEUlZfVkVSU0lPTiAiNy4yLjktazIiRFJJVkVSTkFQSQorI2RlZmluZSBEUlZfVkVSU0lPTiAiNy4zLjE1LWsyIkRSSVZFUk5BUEkKIGNoYXIgZTEwMDBfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogc3RhdGljIGNoYXIgZTEwMDBfY29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IChjKSAxOTk5LTIwMDYgSW50ZWwgQ29ycG9yYXRpb24uIjsKIApAQCAtMTAzLDYgKzEwNCw5IEBACiAJSU5URUxfRTEwMDBfRVRIRVJORVRfREVWSUNFKDB4MTBCOSksCiAJSU5URUxfRTEwMDBfRVRIRVJORVRfREVWSUNFKDB4MTBCQSksCiAJSU5URUxfRTEwMDBfRVRIRVJORVRfREVWSUNFKDB4MTBCQiksCisJSU5URUxfRTEwMDBfRVRIRVJORVRfREVWSUNFKDB4MTBCQyksCisJSU5URUxfRTEwMDBfRVRIRVJORVRfREVWSUNFKDB4MTBDNCksCisJSU5URUxfRTEwMDBfRVRIRVJORVRfREVWSUNFKDB4MTBDNSksCiAJLyogcmVxdWlyZWQgbGFzdCBlbnRyeSAqLwogCXswLH0KIH07CkBAIC0xNTQsNiArMTU4LDkgQEAKIHN0YXRpYyBpbnQgZTEwMDBfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSk7CiBzdGF0aWMgaW50IGUxMDAwX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgZTEwMDBfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKTsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorc3RhdGljIGlycXJldHVybl90IGUxMDAwX2ludHJfbXNpKGludCBpcnEsIHZvaWQgKmRhdGEpOworI2VuZGlmCiBzdGF0aWMgYm9vbGVhbl90IGUxMDAwX2NsZWFuX3R4X2lycShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlMTAwMF90eF9yaW5nICp0eF9yaW5nKTsKICNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQpAQCAtMTgzLDcgKzE5MCw3IEBACiBzdGF0aWMgdm9pZCBlMTAwMF9lbnRlcl84MjU0Ml9yc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIHZvaWQgZTEwMDBfbGVhdmVfODI1NDJfcnN0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKIHN0YXRpYyB2b2lkIGUxMDAwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBlMTAwMF9yZXNldF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZTEwMDBfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgZTEwMDBfc21hcnRzcGVlZChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CiBzdGF0aWMgaW50IGUxMDAwXzgyNTQ3X2ZpZm9fd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwpAQCAtMjg1LDcgKzI5Miw3IEBACiAKIAlmbGFncyA9IElSUUZfU0hBUkVEOwogI2lmZGVmIENPTkZJR19QQ0lfTVNJCi0JaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpIHsKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpIHsKIAkJYWRhcHRlci0+aGF2ZV9tc2kgPSBUUlVFOwogCQlpZiAoKGVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpKSkgewogCQkJRFBSSU5USyhQUk9CRSwgRVJSLApAQCAtMjkzLDggKzMwMCwxNCBAQAogCQkJYWRhcHRlci0+aGF2ZV9tc2kgPSBGQUxTRTsKIAkJfQogCX0KLQlpZiAoYWRhcHRlci0+aGF2ZV9tc2kpCisJaWYgKGFkYXB0ZXItPmhhdmVfbXNpKSB7CiAJCWZsYWdzICY9IH5JUlFGX1NIQVJFRDsKKwkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCAmZTEwMDBfaW50cl9tc2ksIGZsYWdzLAorCQkgICAgICAgICAgICAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldik7CisJCWlmIChlcnIpCisJCQlEUFJJTlRLKFBST0JFLCBFUlIsCisJCQkgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQgRXJyb3I6ICVkXG4iLCBlcnIpOworCX0gZWxzZQogI2VuZGlmCiAJaWYgKChlcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsICZlMTAwMF9pbnRyLCBmbGFncywKIAkgICAgICAgICAgICAgICAgICAgICAgIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkpCkBAIC0zNzUsNyArMzg4LDcgQEAKICAqIGUxMDAwX3JlbGVhc2VfaHdfY29udHJvbCByZXNldHMge0NUUkxfRVhUfEZXU019OkRSVl9MT0FEIGJpdC4KICAqIEZvciBBU0YgYW5kIFBhc3MgVGhyb3VnaCB2ZXJzaW9ucyBvZiBmL3cgdGhpcyBtZWFucyB0aGF0IHRoZQogICogZHJpdmVyIGlzIG5vIGxvbmdlciBsb2FkZWQuIEZvciBBTVQgdmVyc2lvbiAob25seSB3aXRoIDgyNTczKSBpCi0gKiBvZiB0aGUgZi93IHRoaXMgbWVhbnMgdGhhdCB0aGUgbmV0b3dyayBpL2YgaXMgY2xvc2VkLgorICogb2YgdGhlIGYvdyB0aGlzIG1lYW5zIHRoYXQgdGhlIG5ldHdvcmsgaS9mIGlzIGNsb3NlZC4KICAqCiAgKiovCiAKQEAgLTQxNiw3ICs0MjksNyBAQAogICogZTEwMDBfZ2V0X2h3X2NvbnRyb2wgc2V0cyB7Q1RSTF9FWFR8RldTTX06RFJWX0xPQUQgYml0LgogICogRm9yIEFTRiBhbmQgUGFzcyBUaHJvdWdoIHZlcnNpb25zIG9mIGYvdyB0aGlzIG1lYW5zIHRoYXQKICAqIHRoZSBkcml2ZXIgaXMgbG9hZGVkLiBGb3IgQU1UIHZlcnNpb24gKG9ubHkgd2l0aCA4MjU3MykKLSAqIG9mIHRoZSBmL3cgdGhpcyBtZWFucyB0aGF0IHRoZSBuZXRvd3JrIGkvZiBpcyBvcGVuLgorICogb2YgdGhlIGYvdyB0aGlzIG1lYW5zIHRoYXQgdGhlIG5ldHdvcmsgaS9mIGlzIG9wZW4uCiAgKgogICoqLwogCkBAIC00MjYsNiArNDM5LDcgQEAKIAl1aW50MzJfdCBjdHJsX2V4dDsKIAl1aW50MzJfdCBzd3NtOwogCXVpbnQzMl90IGV4dGNuZjsKKwogCS8qIExldCBmaXJtd2FyZSBrbm93IHRoZSBkcml2ZXIgaGFzIHRha2VuIG92ZXIgKi8KIAlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7CiAJY2FzZSBlMTAwMF84MjU3MToKQEAgLTYwMSw5ICs2MTUsNiBAQAogZTEwMDBfcmVzZXQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdWludDMyX3QgcGJhLCBtYW5jOwotI2lmZGVmIERJU0FCTEVfTVVMUgotCXVpbnQzMl90IHRjdGw7Ci0jZW5kaWYKIAl1aW50MTZfdCBmY19oaWdoX3dhdGVyX21hcmsgPSBFMTAwMF9GQ19ISUdIX0RJRkY7CiAKIAkvKiBSZXBhcnRpdGlvbiBQYmEgZm9yIGdyZWF0ZXIgdGhhbiA5ayBtdHUKQEAgLTY3MCwxMiArNjgxLDcgQEAKIAllMTAwMF9yZXNldF9odygmYWRhcHRlci0+aHcpOwogCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VDLCAwKTsKLSNpZmRlZiBESVNBQkxFX01VTFIKLQkvKiBkaXNhYmxlIE11bHRpcGxlIFJlYWRzIGluIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgZm9yIGRlYnVnZ2luZyAqLwotCXRjdGwgPSBFMTAwMF9SRUFEX1JFRyhodywgVENUTCk7Ci0JRTEwMDBfV1JJVEVfUkVHKGh3LCBUQ1RMLCB0Y3RsICYgfkUxMDAwX1RDVExfTVVMUik7CiAKLSNlbmRpZgogCWlmIChlMTAwMF9pbml0X2h3KCZhZGFwdGVyLT5odykpCiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkhhcmR3YXJlIEVycm9yXG4iKTsKIAllMTAwMF91cGRhdGVfbW5nX3ZsYW4oYWRhcHRlcik7CkBAIC02OTksNyArNzA1LDEwIEBACiAJCSAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOwogCX0KIAotCWlmICgoYWRhcHRlci0+ZW5fbW5nX3B0KSAmJiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSkpIHsKKwlpZiAoKGFkYXB0ZXItPmVuX21uZ19wdCkgJiYKKwkgICAgKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwKSAmJgorCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSkgJiYKKwkgICAgKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpKSB7CiAJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOwogCQltYW5jIHw9IChFMTAwMF9NQU5DX0FSUF9FTiB8IEUxMDAwX01BTkNfRU5fTU5HMkhPU1QpOwogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DLCBtYW5jKTsKQEAgLTg0OCw5ICs4NTcsOSBAQAogCSAgIChhZGFwdGVyLT5ody5tYWNfdHlwZSAhPSBlMTAwMF84MjU0NykpCiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CiAKLSNpZmRlZiBORVRJRl9GX1RTT19JUFY2CisjaWZkZWYgTkVUSUZfRl9UU082CiAJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpCi0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU09fSVBWNjsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzY7CiAjZW5kaWYKICNlbmRpZgogCWlmIChwY2lfdXNpbmdfZGFjKQpAQCAtOTA1LDggKzkxNCw3IEBACiAJYWRhcHRlci0+cGh5X2luZm9fdGltZXIuZnVuY3Rpb24gPSAmZTEwMDBfdXBkYXRlX3BoeV9pbmZvOwogCWFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlcjsKIAotCUlOSVRfV09SSygmYWRhcHRlci0+cmVzZXRfdGFzaywKLQkJKHZvaWQgKCopKHZvaWQgKikpZTEwMDBfcmVzZXRfdGFzaywgbmV0ZGV2KTsKKwlJTklUX1dPUksoJmFkYXB0ZXItPnJlc2V0X3Rhc2ssIGUxMDAwX3Jlc2V0X3Rhc2spOwogCiAJZTEwMDBfY2hlY2tfb3B0aW9ucyhhZGFwdGVyKTsKIApAQCAtOTY1LDYgKzk3Myw3IEBACiAJCWJyZWFrOwogCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfUVVBRF9DT1BQRVJfS1NQMzoKIAljYXNlIEUxMDAwX0RFVl9JRF84MjU3MUVCX1FVQURfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTcxRUJfUVVBRF9DT1BQRVJfTE9XUFJPRklMRToKIAkJLyogaWYgcXVhZCBwb3J0IGFkYXB0ZXIsIGRpc2FibGUgV29MIG9uIGFsbCBidXQgcG9ydCBBICovCiAJCWlmIChnbG9iYWxfcXVhZF9wb3J0X2EgIT0gMCkKIAkJCWFkYXB0ZXItPmVlcHJvbV93b2wgPSAwOwpAQCAtMTA3Niw4ICsxMDg1LDkgQEAKIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKLQlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSAmJgotCSAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwkgICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSAmJgorCSAgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CiAJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOwogCQlpZiAobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pIHsKIAkJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CkBAIC0xMjc1LDEyICsxMjg1LDEwIEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAkvKiBhbGxvY2F0ZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLwotCiAJaWYgKChlcnIgPSBlMTAwMF9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpKSkKIAkJZ290byBlcnJfc2V0dXBfdHg7CiAKIAkvKiBhbGxvY2F0ZSByZWNlaXZlIGRlc2NyaXB0b3JzICovCi0KIAlpZiAoKGVyciA9IGUxMDAwX3NldHVwX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcikpKQogCQlnb3RvIGVycl9zZXR1cF9yeDsKIApAQCAtMTU2NSw2ICsxNTczLDggQEAKIAogCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NzEgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTcyKSB7CiAJCXRhcmMgPSBFMTAwMF9SRUFEX1JFRyhodywgVEFSQzApOworCQkvKiBzZXQgdGhlIHNwZWVkIG1vZGUgYml0LCB3ZSdsbCBjbGVhciBpdCBpZiB3ZSdyZSBub3QgYXQKKwkJICogZ2lnYWJpdCBsaW5rIGxhdGVyICovCiAJCXRhcmMgfD0gKDEgPDwgMjEpOwogCQlFMTAwMF9XUklURV9SRUcoaHcsIFRBUkMwLCB0YXJjKTsKIAl9IGVsc2UgaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikgewpAQCAtMTU3OSw4ICsxNTg5LDExIEBACiAJZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKIAogCS8qIFNldHVwIFRyYW5zbWl0IERlc2NyaXB0b3IgU2V0dGluZ3MgZm9yIGVvcCBkZXNjcmlwdG9yICovCi0JYWRhcHRlci0+dHhkX2NtZCA9IEUxMDAwX1RYRF9DTURfSURFIHwgRTEwMDBfVFhEX0NNRF9FT1AgfAotCQlFMTAwMF9UWERfQ01EX0lGQ1M7CisJYWRhcHRlci0+dHhkX2NtZCA9IEUxMDAwX1RYRF9DTURfRU9QIHwgRTEwMDBfVFhEX0NNRF9JRkNTOworCisJLyogb25seSBzZXQgSURFIGlmIHdlIGFyZSBkZWxheWluZyBpbnRlcnJ1cHRzIHVzaW5nIHRoZSB0aW1lcnMgKi8KKwlpZiAoYWRhcHRlci0+dHhfaW50X2RlbGF5KQorCQlhZGFwdGVyLT50eGRfY21kIHw9IEUxMDAwX1RYRF9DTURfSURFOwogCiAJaWYgKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKQogCQlhZGFwdGVyLT50eGRfY21kIHw9IEUxMDAwX1RYRF9DTURfUlBTOwpAQCAtMTgwNCw5ICsxODE3LDExIEBACiAJICogZm9sbG93ZWQgYnkgdGhlIHBhZ2UgYnVmZmVycy4gIFRoZXJlZm9yZSwgc2tiLT5kYXRhIGlzCiAJICogc2l6ZWQgdG8gaG9sZCB0aGUgbGFyZ2VzdCBwcm90b2NvbCBoZWFkZXIuCiAJICovCisJLyogYWxsb2NhdGlvbnMgdXNpbmcgYWxsb2NfcGFnZSB0YWtlIHRvbyBsb25nIGZvciByZWd1bGFyIE1UVQorCSAqIHNvIG9ubHkgZW5hYmxlIHBhY2tldCBzcGxpdCBmb3IganVtYm8gZnJhbWVzICovCiAJcGFnZXMgPSBQQUdFX1VTRV9DT1VOVChhZGFwdGVyLT5uZXRkZXYtPm10dSk7Ci0JaWYgKChhZGFwdGVyLT5ody5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ3X3Jldl8yKSAmJiAocGFnZXMgPD0gMykgJiYKLQkgICAgUEFHRV9TSVpFIDw9IDE2Mzg0KQorCWlmICgoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpICYmIChwYWdlcyA8PSAzKSAmJgorCSAgICBQQUdFX1NJWkUgPD0gMTYzODQgJiYgKHJjdGwgJiBFMTAwMF9SQ1RMX0xQRSkpCiAJCWFkYXB0ZXItPnJ4X3BzX3BhZ2VzID0gcGFnZXM7CiAJZWxzZQogCQlhZGFwdGVyLT5yeF9wc19wYWdlcyA9IDA7CkBAIC0xODE1LDggKzE4MzAsMTEgQEAKIAkJLyogQ29uZmlndXJlIGV4dHJhIHBhY2tldC1zcGxpdCByZWdpc3RlcnMgKi8KIAkJcmZjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJGQ1RMKTsKIAkJcmZjdGwgfD0gRTEwMDBfUkZDVExfRVhURU47Ci0JCS8qIGRpc2FibGUgSVB2NiBwYWNrZXQgc3BsaXQgc3VwcG9ydCAqLwotCQlyZmN0bCB8PSBFMTAwMF9SRkNUTF9JUFY2X0RJUzsKKwkJLyogZGlzYWJsZSBwYWNrZXQgc3BsaXQgc3VwcG9ydCBmb3IgSVB2NiBleHRlbnNpb24gaGVhZGVycywKKwkJICogYmVjYXVzZSBzb21lIG1hbGZvcm1lZCBJUHY2IGhlYWRlcnMgY2FuIGhhbmcgdGhlIFJYICovCisJCXJmY3RsIHw9IChFMTAwMF9SRkNUTF9JUFY2X0VYX0RJUyB8CisJCSAgICAgICAgICBFMTAwMF9SRkNUTF9ORVdfSVBWNl9FWFRfRElTKTsKKwogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRkNUTCwgcmZjdGwpOwogCiAJCXJjdGwgfD0gRTEwMDBfUkNUTF9EVFlQX1BTOwpAQCAtMTg3OSw3ICsxODk3LDcgQEAKIAogCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDApIHsKIAkJRTEwMDBfV1JJVEVfUkVHKGh3LCBSQURWLCBhZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5KTsKLQkJaWYgKGFkYXB0ZXItPml0ciA+IDEpCisJCWlmIChhZGFwdGVyLT5pdHJfc2V0dGluZyAhPSAwKQogCQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJVFIsCiAJCQkJMTAwMDAwMDAwMCAvIChhZGFwdGVyLT5pdHIgKiAyNTYpKTsKIAl9CkBAIC0xODg5LDExICsxOTA3LDExIEBACiAJCS8qIFJlc2V0IGRlbGF5IHRpbWVycyBhZnRlciBldmVyeSBpbnRlcnJ1cHQgKi8KIAkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfSU5UX1RJTUVSX0NMUjsKICNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQotCQkvKiBBdXRvLU1hc2sgaW50ZXJydXB0cyB1cG9uIElDUiByZWFkLiAqLworCQkvKiBBdXRvLU1hc2sgaW50ZXJydXB0cyB1cG9uIElDUiBhY2Nlc3MgKi8KIAkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfSUFNRTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJQU0sIDB4ZmZmZmZmZmYpOwogI2VuZGlmCiAJCUUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKLQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJQU0sIH4wKTsKIAkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOwogCX0KIApAQCAtMTkzMiw2ICsxOTUwLDEyIEBACiAJCUUxMDAwX1dSSVRFX1JFRyhodywgUlhDU1VNLCByeGNzdW0pOwogCX0KIAorCS8qIGVuYWJsZSBlYXJseSByZWNlaXZlcyBvbiA4MjU3Mywgb25seSB0YWtlcyBlZmZlY3QgaWYgdXNpbmcgPiAyMDQ4CisJICogYnl0ZSB0b3RhbCBmcmFtZSBzaXplLiAgZm9yIGV4YW1wbGUgb25seSBmb3IganVtYm8gZnJhbWVzICovCisjZGVmaW5lIEUxMDAwX0VSVF8yMDQ4IDB4MTAwCisJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU3MykKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBFUlQsIEUxMDAwX0VSVF8yMDQ4KTsKKwogCS8qIEVuYWJsZSBSZWNlaXZlcyAqLwogCUUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgcmN0bCk7CiB9CkBAIC0xOTg1LDEwICsyMDA5LDEzIEBACiAJCQkJYnVmZmVyX2luZm8tPmRtYSwKIAkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLAogCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQlidWZmZXJfaW5mby0+ZG1hID0gMDsKIAl9Ci0JaWYgKGJ1ZmZlcl9pbmZvLT5za2IpCisJaWYgKGJ1ZmZlcl9pbmZvLT5za2IpIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmZmVyX2luZm8tPnNrYik7Ci0JbWVtc2V0KGJ1ZmZlcl9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikpOworCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwl9CisJLyogYnVmZmVyX2luZm8gbXVzdCBiZSBjb21wbGV0ZWx5IHNldCB1cCBpbiB0aGUgdHJhbnNtaXQgcGF0aCAqLwogfQogCiAvKioKQEAgLTI0MTIsNiArMjQzOSw3IEBACiAJCURQUklOVEsoTElOSywgSU5GTywKIAkJCSJHaWdhYml0IGhhcyBiZWVuIGRpc2FibGVkLCBkb3duZ3JhZGluZyBzcGVlZFxuIik7CiAJfQorCiAJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTczKSB7CiAJCWUxMDAwX2VuYWJsZV90eF9wa3RfZmlsdGVyaW5nKCZhZGFwdGVyLT5odyk7CiAJCWlmIChhZGFwdGVyLT5tbmdfdmxhbl9pZCAhPSBhZGFwdGVyLT5ody5tbmdfY29va2llLnZsYW5faWQpCkBAIC0yNDU2LDEzICsyNDg0LDEyIEBACiAJCQlpZiAoKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTcxIHx8CiAJCQkgICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTcyKSAmJgogCQkJICAgIHR4YjJiID09IDApIHsKLSNkZWZpbmUgU1BFRURfTU9ERV9CSVQgKDEgPDwgMjEpCiAJCQkJdWludDMyX3QgdGFyYzA7CiAJCQkJdGFyYzAgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRBUkMwKTsKLQkJCQl0YXJjMCAmPSB+U1BFRURfTU9ERV9CSVQ7CisJCQkJdGFyYzAgJj0gfigxIDw8IDIxKTsKIAkJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUQVJDMCwgdGFyYzApOwogCQkJfQotCQkJCQorCiAjaWZkZWYgTkVUSUZfRl9UU08KIAkJCS8qIGRpc2FibGUgVFNPIGZvciBwY2llIGFuZCAxMC8xMDAgc3BlZWRzLCB0byBhdm9pZAogCQkJICogc29tZSBoYXJkd2FyZSBpc3N1ZXMgKi8KQEAgLTI0NzQsOSArMjUwMSwxNSBAQAogCQkJCQlEUFJJTlRLKFBST0JFLElORk8sCiAJCQkJICAgICAgICAiMTAvMTAwIHNwZWVkOiBkaXNhYmxpbmcgVFNPXG4iKTsKIAkJCQkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087CisjaWZkZWYgTkVUSUZfRl9UU082CisJCQkJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPNjsKKyNlbmRpZgogCQkJCQlicmVhazsKIAkJCQljYXNlIFNQRUVEXzEwMDA6CiAJCQkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisjaWZkZWYgTkVUSUZfRl9UU082CisJCQkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OworI2VuZGlmCiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCS8qIG9vcHMgKi8KQEAgLTI1NDMsMTkgKzI1NzYsNiBAQAogCQl9CiAJfQogCi0JLyogRHluYW1pYyBtb2RlIGZvciBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZSAoSVRSKSAqLwotCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJiBhZGFwdGVyLT5pdHIgPT0gMSkgewotCQkvKiBTeW1tZXRyaWMgVHgvUnggZ2V0cyBhIHJlZHVjZWQgSVRSPTIwMDA7IFRvdGFsCi0JCSAqIGFzeW1tZXRyaWNhbCBUeCBvciBSeCBnZXRzIElUUj04MDAwOyBldmVyeW9uZQotCQkgKiBlbHNlIGlzIGJldHdlZW4gMjAwMC04MDAwLiAqLwotCQl1aW50MzJfdCBnb2MgPSAoYWRhcHRlci0+Z290Y2wgKyBhZGFwdGVyLT5nb3JjbCkgLyAxMDAwMDsKLQkJdWludDMyX3QgZGlmID0gKGFkYXB0ZXItPmdvdGNsID4gYWRhcHRlci0+Z29yY2wgPwotCQkJYWRhcHRlci0+Z290Y2wgLSBhZGFwdGVyLT5nb3JjbCA6Ci0JCQlhZGFwdGVyLT5nb3JjbCAtIGFkYXB0ZXItPmdvdGNsKSAvIDEwMDAwOwotCQl1aW50MzJfdCBpdHIgPSBnb2MgPiAwID8gKGRpZiAqIDYwMDAgLyBnb2MgKyAyMDAwKSA6IDgwMDA7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElUUiwgMTAwMDAwMDAwMCAvIChpdHIgKiAyNTYpKTsKLQl9Ci0KIAkvKiBDYXVzZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gZW5zdXJlIHJ4IHJpbmcgaXMgY2xlYW5lZCAqLwogCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElDUywgRTEwMDBfSUNTX1JYRE1UMCk7CiAKQEAgLTI1NzEsNiArMjU5MSwxMzUgQEAKIAltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgMiAqIEhaKTsKIH0KIAorZW51bSBsYXRlbmN5X3JhbmdlIHsKKwlsb3dlc3RfbGF0ZW5jeSA9IDAsCisJbG93X2xhdGVuY3kgPSAxLAorCWJ1bGtfbGF0ZW5jeSA9IDIsCisJbGF0ZW5jeV9pbnZhbGlkID0gMjU1Cit9OworCisvKioKKyAqIGUxMDAwX3VwZGF0ZV9pdHIgLSB1cGRhdGUgdGhlIGR5bmFtaWMgSVRSIHZhbHVlIGJhc2VkIG9uIHN0YXRpc3RpY3MKKyAqICAgICAgU3RvcmVzIGEgbmV3IElUUiB2YWx1ZSBiYXNlZCBvbiBwYWNrZXRzIGFuZCBieXRlCisgKiAgICAgIGNvdW50cyBkdXJpbmcgdGhlIGxhc3QgaW50ZXJydXB0LiAgVGhlIGFkdmFudGFnZSBvZiBwZXIgaW50ZXJydXB0CisgKiAgICAgIGNvbXB1dGF0aW9uIGlzIGZhc3RlciB1cGRhdGVzIGFuZCBtb3JlIGFjY3VyYXRlIElUUiBmb3IgdGhlIGN1cnJlbnQKKyAqICAgICAgdHJhZmZpYyBwYXR0ZXJuLiAgQ29uc3RhbnRzIGluIHRoaXMgZnVuY3Rpb24gd2VyZSBjb21wdXRlZAorICogICAgICBiYXNlZCBvbiB0aGVvcmV0aWNhbCBtYXhpbXVtIHdpcmUgc3BlZWQgYW5kIHRocmVzaG9sZHMgd2VyZSBzZXQgYmFzZWQKKyAqICAgICAgb24gdGVzdGluZyBkYXRhIGFzIHdlbGwgYXMgYXR0ZW1wdGluZyB0byBtaW5pbWl6ZSByZXNwb25zZSB0aW1lCisgKiAgICAgIHdoaWxlIGluY3JlYXNpbmcgYnVsayB0aHJvdWdocHV0LgorICogICAgICB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgY29udHJvbGxlZCBieSB0aGUgSW50ZXJydXB0VGhyb3R0bGVSYXRlIG1vZHVsZQorICogICAgICBwYXJhbWV0ZXIgKHNlZSBlMTAwMF9wYXJhbS5jKQorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gYWRhcHRlcgorICogQGl0cl9zZXR0aW5nOiBjdXJyZW50IGFkYXB0ZXItPml0cgorICogQHBhY2tldHM6IHRoZSBudW1iZXIgb2YgcGFja2V0cyBkdXJpbmcgdGhpcyBtZWFzdXJlbWVudCBpbnRlcnZhbAorICogQGJ5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGR1cmluZyB0aGlzIG1lYXN1cmVtZW50IGludGVydmFsCisgKiovCitzdGF0aWMgdW5zaWduZWQgaW50IGUxMDAwX3VwZGF0ZV9pdHIoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGl0cl9zZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzKQoreworCXVuc2lnbmVkIGludCByZXR2YWwgPSBpdHJfc2V0dGluZzsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJaWYgKHVubGlrZWx5KGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQwKSkKKwkJZ290byB1cGRhdGVfaXRyX2RvbmU7CisKKwlpZiAocGFja2V0cyA9PSAwKQorCQlnb3RvIHVwZGF0ZV9pdHJfZG9uZTsKKworCisJc3dpdGNoIChpdHJfc2V0dGluZykgeworCWNhc2UgbG93ZXN0X2xhdGVuY3k6CisJCWlmICgocGFja2V0cyA8IDUpICYmIChieXRlcyA+IDUxMikpCisJCQlyZXR2YWwgPSBsb3dfbGF0ZW5jeTsKKwkJYnJlYWs7CisJY2FzZSBsb3dfbGF0ZW5jeTogIC8qIDUwIHVzZWMgYWthIDIwMDAwIGludHMvcyAqLworCQlpZiAoYnl0ZXMgPiAxMDAwMCkgeworCQkJaWYgKChwYWNrZXRzIDwgMTApIHx8CisJCQkgICAgICgoYnl0ZXMvcGFja2V0cykgPiAxMjAwKSkKKwkJCQlyZXR2YWwgPSBidWxrX2xhdGVuY3k7CisJCQllbHNlIGlmICgocGFja2V0cyA+IDM1KSkKKwkJCQlyZXR2YWwgPSBsb3dlc3RfbGF0ZW5jeTsKKwkJfSBlbHNlIGlmIChwYWNrZXRzIDw9IDIgJiYgYnl0ZXMgPCA1MTIpCisJCQlyZXR2YWwgPSBsb3dlc3RfbGF0ZW5jeTsKKwkJYnJlYWs7CisJY2FzZSBidWxrX2xhdGVuY3k6IC8qIDI1MCB1c2VjIGFrYSA0MDAwIGludHMvcyAqLworCQlpZiAoYnl0ZXMgPiAyNTAwMCkgeworCQkJaWYgKHBhY2tldHMgPiAzNSkKKwkJCQlyZXR2YWwgPSBsb3dfbGF0ZW5jeTsKKwkJfSBlbHNlIHsKKwkJCWlmIChieXRlcyA8IDYwMDApCisJCQkJcmV0dmFsID0gbG93X2xhdGVuY3k7CisJCX0KKwkJYnJlYWs7CisJfQorCit1cGRhdGVfaXRyX2RvbmU6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZTEwMDBfc2V0X2l0cihzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVpbnQxNl90IGN1cnJlbnRfaXRyOworCXVpbnQzMl90IG5ld19pdHIgPSBhZGFwdGVyLT5pdHI7CisKKwlpZiAodW5saWtlbHkoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NDApKQorCQlyZXR1cm47CisKKwkvKiBmb3Igbm9uLWdpZ2FiaXQgc3BlZWRzLCBqdXN0IGZpeCB0aGUgaW50ZXJydXB0IHJhdGUgYXQgNDAwMCAqLworCWlmICh1bmxpa2VseShhZGFwdGVyLT5saW5rX3NwZWVkICE9IFNQRUVEXzEwMDApKSB7CisJCWN1cnJlbnRfaXRyID0gMDsKKwkJbmV3X2l0ciA9IDQwMDA7CisJCWdvdG8gc2V0X2l0cl9ub3c7CisJfQorCisJYWRhcHRlci0+dHhfaXRyID0gZTEwMDBfdXBkYXRlX2l0cihhZGFwdGVyLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT50eF9pdHIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnRvdGFsX3R4X3BhY2tldHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnRvdGFsX3R4X2J5dGVzKTsKKwlhZGFwdGVyLT5yeF9pdHIgPSBlMTAwMF91cGRhdGVfaXRyKGFkYXB0ZXIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnJ4X2l0ciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+dG90YWxfcnhfcGFja2V0cywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+dG90YWxfcnhfYnl0ZXMpOworCisJY3VycmVudF9pdHIgPSBtYXgoYWRhcHRlci0+cnhfaXRyLCBhZGFwdGVyLT50eF9pdHIpOworCisJLyogY29uc2VydmF0aXZlIG1vZGUgZWxpbWluYXRlcyB0aGUgbG93ZXN0X2xhdGVuY3kgc2V0dGluZyAqLworCWlmIChjdXJyZW50X2l0ciA9PSBsb3dlc3RfbGF0ZW5jeSAmJiAoYWRhcHRlci0+aXRyX3NldHRpbmcgPT0gMykpCisJCWN1cnJlbnRfaXRyID0gbG93X2xhdGVuY3k7CisKKwlzd2l0Y2ggKGN1cnJlbnRfaXRyKSB7CisJLyogY291bnRzIGFuZCBwYWNrZXRzIGluIHVwZGF0ZV9pdHIgYXJlIGRlcGVuZGVudCBvbiB0aGVzZSBudW1iZXJzICovCisJY2FzZSBsb3dlc3RfbGF0ZW5jeToKKwkJbmV3X2l0ciA9IDcwMDAwOworCQlicmVhazsKKwljYXNlIGxvd19sYXRlbmN5OgorCQluZXdfaXRyID0gMjAwMDA7IC8qIGFrYSBod2l0ciA9IH4yMDAgKi8KKwkJYnJlYWs7CisJY2FzZSBidWxrX2xhdGVuY3k6CisJCW5ld19pdHIgPSA0MDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKK3NldF9pdHJfbm93OgorCWlmIChuZXdfaXRyICE9IGFkYXB0ZXItPml0cikgeworCQkvKiB0aGlzIGF0dGVtcHRzIHRvIGJpYXMgdGhlIGludGVycnVwdCByYXRlIHRvd2FyZHMgQnVsaworCQkgKiBieSBhZGRpbmcgaW50ZXJtZWRpYXRlIHN0ZXBzIHdoZW4gaW50ZXJydXB0IHJhdGUgaXMKKwkJICogaW5jcmVhc2luZyAqLworCQluZXdfaXRyID0gbmV3X2l0ciA+IGFkYXB0ZXItPml0ciA/CisJCSAgICAgICAgICAgICBtaW4oYWRhcHRlci0+aXRyICsgKG5ld19pdHIgPj4gMiksIG5ld19pdHIpIDoKKwkJICAgICAgICAgICAgIG5ld19pdHI7CisJCWFkYXB0ZXItPml0ciA9IG5ld19pdHI7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgSVRSLCAxMDAwMDAwMDAwIC8gKG5ld19pdHIgKiAyNTYpKTsKKwl9CisKKwlyZXR1cm47Cit9CisKICNkZWZpbmUgRTEwMDBfVFhfRkxBR1NfQ1NVTQkJMHgwMDAwMDAwMQogI2RlZmluZSBFMTAwMF9UWF9GTEFHU19WTEFOCQkweDAwMDAwMDAyCiAjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX1RTTwkJMHgwMDAwMDAwNApAQCAtMjYxMSw3ICsyNzYwLDcgQEAKIAkJCQkJCSAgIDApOwogCQkJY21kX2xlbmd0aCA9IEUxMDAwX1RYRF9DTURfSVA7CiAJCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOwotI2lmZGVmIE5FVElGX0ZfVFNPX0lQVjYKKyNpZmRlZiBORVRJRl9GX1RTTzYKIAkJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKSB7CiAJCQlza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IDA7CiAJCQlza2ItPmgudGgtPmNoZWNrID0KQEAgLTI2NDcsNiArMjc5Niw3IEBACiAJCWNvbnRleHRfZGVzYy0+Y21kX2FuZF9sZW5ndGggPSBjcHVfdG9fbGUzMihjbWRfbGVuZ3RoKTsKIAogCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJCWJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoID0gaTsKIAogCQlpZiAoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKIAkJdHhfcmluZy0+bmV4dF90b191c2UgPSBpOwpAQCAtMjY3NSwxMiArMjgyNSwxMyBAQAogCQljb250ZXh0X2Rlc2MgPSBFMTAwMF9DT05URVhUX0RFU0MoKnR4X3JpbmcsIGkpOwogCiAJCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzcyA9IGNzczsKLQkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0gY3NzICsgc2tiLT5jc3VtOworCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc28gPSBjc3MgKyBza2ItPmNzdW1fb2Zmc2V0OwogCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc2UgPSAwOwogCQljb250ZXh0X2Rlc2MtPnRjcF9zZWdfc2V0dXAuZGF0YSA9IDA7CiAJCWNvbnRleHRfZGVzYy0+Y21kX2FuZF9sZW5ndGggPSBjcHVfdG9fbGUzMihFMTAwMF9UWERfQ01EX0RFWFQpOwogCiAJCWJ1ZmZlcl9pbmZvLT50aW1lX3N0YW1wID0gamlmZmllczsKKwkJYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2ggPSBpOwogCiAJCWlmICh1bmxpa2VseSgrK2kgPT0gdHhfcmluZy0+Y291bnQpKSBpID0gMDsKIAkJdHhfcmluZy0+bmV4dF90b191c2UgPSBpOwpAQCAtMjc0OSw2ICsyOTAwLDcgQEAKIAkJCQlzaXplLAogCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwogCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisJCWJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoID0gaTsKIAogCQlsZW4gLT0gc2l6ZTsKIAkJb2Zmc2V0ICs9IHNpemU7CkBAIC0yNzg4LDYgKzI5NDAsNyBAQAogCQkJCQlzaXplLAogCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKIAkJCWJ1ZmZlcl9pbmZvLT50aW1lX3N0YW1wID0gamlmZmllczsKKwkJCWJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoID0gaTsKIAogCQkJbGVuIC09IHNpemU7CiAJCQlvZmZzZXQgKz0gc2l6ZTsKQEAgLTI4NTMsNiArMzAwNiw5IEBACiAKIAl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7CiAJd3JpdGVsKGksIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyB0eF9yaW5nLT50ZHQpOworCS8qIHdlIG5lZWQgdGhpcyBpZiBtb3JlIHRoYW4gb25lIHByb2Nlc3NvciBjYW4gd3JpdGUgdG8gb3VyIHRhaWwKKwkgKiBhdCBhIHRpbWUsIGl0IHN5bmNyb25pemVzIElPIG9uIElBNjQvQWx0aXggc3lzdGVtcyAqLworCW1taW93YigpOwogfQogCiAvKioKQEAgLTI5NDYsNiArMzEwMiw3IEBACiAKIAkvKiBBIHJlcHJpZXZlISAqLwogCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisJKythZGFwdGVyLT5yZXN0YXJ0X3F1ZXVlOwogCXJldHVybiAwOwogfQogCkBAIC0yOTg2LDYgKzMxNDMsMTEgQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CiAKKwkvKiA4MjU3MSBhbmQgbmV3ZXIgZG9lc24ndCBuZWVkIHRoZSB3b3JrYXJvdW5kIHRoYXQgbGltaXRlZCBkZXNjcmlwdG9yCisJICogbGVuZ3RoIHRvIDRrQiAqLworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU3MSkKKwkJbWF4X3Blcl90eGQgPSA4MTkyOworCiAjaWZkZWYgTkVUSUZfRl9UU08KIAltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCS8qIFRoZSBjb250cm9sbGVyIGRvZXMgYSBzaW1wbGUgY2FsY3VsYXRpb24gdG8KQEAgLTI5OTksOSArMzE2MSw5IEBACiAJCW1heF9wZXJfdHhkID0gbWluKG1zcyA8PCAyLCBtYXhfcGVyX3R4ZCk7CiAJCW1heF90eGRfcHdyID0gZmxzKG1heF9wZXJfdHhkKSAtIDE7CiAKLQkvKiBUU08gV29ya2Fyb3VuZCBmb3IgODI1NzEvMi8zIENvbnRyb2xsZXJzIC0tIGlmIHNrYi0+ZGF0YQotCSAqIHBvaW50cyB0byBqdXN0IGhlYWRlciwgcHVsbCBhIGZldyBieXRlcyBvZiBwYXlsb2FkIGZyb20KLQkgKiBmcmFncyBpbnRvIHNrYi0+ZGF0YSAqLworCQkvKiBUU08gV29ya2Fyb3VuZCBmb3IgODI1NzEvMi8zIENvbnRyb2xsZXJzIC0tIGlmIHNrYi0+ZGF0YQorCQkqIHBvaW50cyB0byBqdXN0IGhlYWRlciwgcHVsbCBhIGZldyBieXRlcyBvZiBwYXlsb2FkIGZyb20KKwkJKiBmcmFncyBpbnRvIHNrYi0+ZGF0YSAqLwogCQloZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArIChza2ItPmgudGgtPmRvZmYgPDwgMikpOwogCQlpZiAoc2tiLT5kYXRhX2xlbiAmJiAoaGRyX2xlbiA9PSAoc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKSkpIHsKIAkJCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKQEAgLTMxNDMsOSArMzMwNSwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotZTEwMDBfcmVzZXRfdGFzayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorZTEwMDBfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlMTAwMF9hZGFwdGVyLCByZXNldF90YXNrKTsKIAogCWUxMDAwX3JlaW5pdF9sb2NrZWQoYWRhcHRlcik7CiB9CkBAIC0zMzA1LDEyICszNDY4LDEyIEBACiAJYWRhcHRlci0+c3RhdHMucm9jICs9IEUxMDAwX1JFQURfUkVHKGh3LCBST0MpOwogCiAJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlICE9IGUxMDAwX2ljaDhsYW4pIHsKLQlhZGFwdGVyLT5zdGF0cy5wcmM2NCArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDNjQpOwotCWFkYXB0ZXItPnN0YXRzLnByYzEyNyArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTI3KTsKLQlhZGFwdGVyLT5zdGF0cy5wcmMyNTUgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzI1NSk7Ci0JYWRhcHRlci0+c3RhdHMucHJjNTExICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkM1MTEpOwotCWFkYXB0ZXItPnN0YXRzLnByYzEwMjMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzEwMjMpOwotCWFkYXB0ZXItPnN0YXRzLnByYzE1MjIgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzE1MjIpOworCQlhZGFwdGVyLT5zdGF0cy5wcmM2NCArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDNjQpOworCQlhZGFwdGVyLT5zdGF0cy5wcmMxMjcgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzEyNyk7CisJCWFkYXB0ZXItPnN0YXRzLnByYzI1NSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMjU1KTsKKwkJYWRhcHRlci0+c3RhdHMucHJjNTExICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkM1MTEpOworCQlhZGFwdGVyLT5zdGF0cy5wcmMxMDIzICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxMDIzKTsKKwkJYWRhcHRlci0+c3RhdHMucHJjMTUyMiArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTUyMik7CiAJfQogCiAJYWRhcHRlci0+c3RhdHMuc3ltZXJycyArPSBFMTAwMF9SRUFEX1JFRyhodywgU1lNRVJSUyk7CkBAIC0zMzQxLDEyICszNTA0LDEyIEBACiAJYWRhcHRlci0+c3RhdHMudHByICs9IEUxMDAwX1JFQURfUkVHKGh3LCBUUFIpOwogCiAJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlICE9IGUxMDAwX2ljaDhsYW4pIHsKLQlhZGFwdGVyLT5zdGF0cy5wdGM2NCArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDNjQpOwotCWFkYXB0ZXItPnN0YXRzLnB0YzEyNyArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTI3KTsKLQlhZGFwdGVyLT5zdGF0cy5wdGMyNTUgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzI1NSk7Ci0JYWRhcHRlci0+c3RhdHMucHRjNTExICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEM1MTEpOwotCWFkYXB0ZXItPnN0YXRzLnB0YzEwMjMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzEwMjMpOwotCWFkYXB0ZXItPnN0YXRzLnB0YzE1MjIgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzE1MjIpOworCQlhZGFwdGVyLT5zdGF0cy5wdGM2NCArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDNjQpOworCQlhZGFwdGVyLT5zdGF0cy5wdGMxMjcgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzEyNyk7CisJCWFkYXB0ZXItPnN0YXRzLnB0YzI1NSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMjU1KTsKKwkJYWRhcHRlci0+c3RhdHMucHRjNTExICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEM1MTEpOworCQlhZGFwdGVyLT5zdGF0cy5wdGMxMDIzICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMxMDIzKTsKKwkJYWRhcHRlci0+c3RhdHMucHRjMTUyMiArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTUyMik7CiAJfQogCiAJYWRhcHRlci0+c3RhdHMubXB0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgTVBUQyk7CkBAIC0zMzcyLDE4ICszNTM1LDE3IEBACiAJCWFkYXB0ZXItPnN0YXRzLmljcnhvYyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWE9DKTsKIAogCQlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewotCQlhZGFwdGVyLT5zdGF0cy5pY3J4cHRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYUFRDKTsKLQkJYWRhcHRlci0+c3RhdHMuaWNyeGF0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSWEFUQyk7Ci0JCWFkYXB0ZXItPnN0YXRzLmljdHhwdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDVFhQVEMpOwotCQlhZGFwdGVyLT5zdGF0cy5pY3R4YXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYQVRDKTsKLQkJYWRhcHRlci0+c3RhdHMuaWN0eHFlYyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWFFFQyk7Ci0JCWFkYXB0ZXItPnN0YXRzLmljdHhxbXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYUU1UQyk7Ci0JCWFkYXB0ZXItPnN0YXRzLmljcnhkbXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYRE1UQyk7CisJCQlhZGFwdGVyLT5zdGF0cy5pY3J4cHRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYUFRDKTsKKwkJCWFkYXB0ZXItPnN0YXRzLmljcnhhdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUlhBVEMpOworCQkJYWRhcHRlci0+c3RhdHMuaWN0eHB0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgSUNUWFBUQyk7CisJCQlhZGFwdGVyLT5zdGF0cy5pY3R4YXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1RYQVRDKTsKKwkJCWFkYXB0ZXItPnN0YXRzLmljdHhxZWMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDVFhRRUMpOworCQkJYWRhcHRlci0+c3RhdHMuaWN0eHFtdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIElDVFhRTVRDKTsKKwkJCWFkYXB0ZXItPnN0YXRzLmljcnhkbXRjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1JYRE1UQyk7CiAJCX0KIAl9CiAKIAkvKiBGaWxsIG91dCB0aGUgT1Mgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KLQogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9wYWNrZXRzID0gYWRhcHRlci0+c3RhdHMuZ3ByYzsKIAlhZGFwdGVyLT5uZXRfc3RhdHMudHhfcGFja2V0cyA9IGFkYXB0ZXItPnN0YXRzLmdwdGM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2J5dGVzID0gYWRhcHRlci0+c3RhdHMuZ29yY2w7CkBAIC0zNDE1LDcgKzM1NzcsNiBAQAogCS8qIFR4IERyb3BwZWQgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCBlbHNld2hlcmUgKi8KIAogCS8qIFBoeSBTdGF0cyAqLwotCiAJaWYgKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CiAJCWlmICgoYWRhcHRlci0+bGlua19zcGVlZCA9PSBTUEVFRF8xMDAwKSAmJgogCQkgICAoIWUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV90bXApKSkgewpAQCAtMzQzMSw2ICszNTkyLDk1IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CiB9CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKworLyoqCisgKiBlMTAwMF9pbnRyX21zaSAtIEludGVycnVwdCBIYW5kbGVyCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGF0YTogcG9pbnRlciB0byBhIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljCitpcnFyZXR1cm5fdCBlMTAwMF9pbnRyX21zaShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkYXRhOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworI2lmbmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCWludCBpOworI2VuZGlmCisKKwkvKiB0aGlzIGNvZGUgYXZvaWRzIHRoZSByZWFkIG9mIElDUiBidXQgaGFzIHRvIGdldCAxMDAwIGludGVycnVwdHMKKwkgKiBhdCBldmVyeSBsaW5rIGNoYW5nZSBldmVudCBiZWZvcmUgaXQgd2lsbCBub3RpY2UgdGhlIGNoYW5nZSAqLworCWlmICgrK2FkYXB0ZXItPmRldGVjdF9saW5rID49IDEwMDApIHsKKwkJdWludDMyX3QgaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUik7CisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwkJLyogcmVhZCBJQ1IgZGlzYWJsZXMgaW50ZXJydXB0cyB1c2luZyBJQU0sIHNvIGtlZXAgdXAgd2l0aCBvdXIKKwkJICogZW5hYmxlL2Rpc2FibGUgYWNjb3VudGluZyAqLworCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKyNlbmRpZgorCQlhZGFwdGVyLT5kZXRlY3RfbGluayA9IDA7CisJCWlmICgoaWNyICYgKEUxMDAwX0lDUl9SWFNFUSB8IEUxMDAwX0lDUl9MU0MpKSAmJgorCQkgICAgKGljciAmIEUxMDAwX0lDUl9JTlRfQVNTRVJURUQpKSB7CisJCQlody0+Z2V0X2xpbmtfc3RhdHVzID0gMTsKKwkJCS8qIDgwMDAzRVMyTEFOIHdvcmthcm91bmQtLQorCQkJKiBGb3IgcGFja2V0IGJ1ZmZlciB3b3JrLWFyb3VuZCBvbiBsaW5rIGRvd24gZXZlbnQ7CisJCQkqIGRpc2FibGUgcmVjZWl2ZXMgaGVyZSBpbiB0aGUgSVNSIGFuZAorCQkJKiByZXNldCBhZGFwdGVyIGluIHdhdGNoZG9nCisJCQkqLworCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSAmJgorCQkJICAgIChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikpIHsKKwkJCQkvKiBkaXNhYmxlIHJlY2VpdmVzICovCisJCQkJdWludDMyX3QgcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKKwkJCQlFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTik7CisJCQl9CisJCQkvKiBndWFyZCBhZ2FpbnN0IGludGVycnVwdCB3aGVuIHdlJ3JlIGdvaW5nIGRvd24gKi8KKwkJCWlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQkJCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsCisJCQkJICAgICAgICAgIGppZmZpZXMgKyAxKTsKKwkJfQorCX0gZWxzZSB7CisJCUUxMDAwX1dSSVRFX1JFRyhodywgSUNSLCAoMHhmZmZmZmZmZiAmIH4oRTEwMDBfSUNSX1JYU0VRIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9JQ1JfTFNDKSkpOworCQkvKiBidW1tZXIgd2UgaGF2ZSB0byBmbHVzaCBoZXJlLCBidXQgdGhpbmdzIGJyZWFrIG90aGVyd2lzZSBhcworCQkgKiBzb21lIGV2ZW50IGFwcGVhcnMgdG8gYmUgbG9zdCBvciBkZWxheWVkIGFuZCB0aHJvdWdocHV0CisJCSAqIGRyb3BzLiAgSW4gYWxtb3N0IGFsbCB0ZXN0cyB0aGlzIGZsdXNoIGlzIHVuLW5lY2Vzc2FyeSAqLworCQlFMTAwMF9XUklURV9GTFVTSChodyk7CisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwkJLyogSW50ZXJydXB0IEF1dG8tTWFzayAoSUFNKS4uLnVwb24gd3JpdGluZyBJQ1IsIGludGVycnVwdHMgYXJlCisJCSAqIG1hc2tlZC4gIE5vIG5lZWQgZm9yIHRoZSBJTUMgd3JpdGUsIGJ1dCBpdCBkb2VzIG1lYW4gd2UKKwkJICogc2hvdWxkIGFjY291bnQgZm9yIGl0IEFTQVAuICovCisJCWF0b21pY19pbmMoJmFkYXB0ZXItPmlycV9zZW0pOworI2VuZGlmCisJfQorCisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwlpZiAobGlrZWx5KG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAobmV0ZGV2KSkpIHsKKwkJYWRhcHRlci0+dG90YWxfdHhfYnl0ZXMgPSAwOworCQlhZGFwdGVyLT50b3RhbF90eF9wYWNrZXRzID0gMDsKKwkJYWRhcHRlci0+dG90YWxfcnhfYnl0ZXMgPSAwOworCQlhZGFwdGVyLT50b3RhbF9yeF9wYWNrZXRzID0gMDsKKwkJX19uZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOworCX0gZWxzZQorCQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOworI2Vsc2UKKwlhZGFwdGVyLT50b3RhbF90eF9ieXRlcyA9IDA7CisJYWRhcHRlci0+dG90YWxfcnhfYnl0ZXMgPSAwOworCWFkYXB0ZXItPnRvdGFsX3R4X3BhY2tldHMgPSAwOworCWFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEUxMDAwX01BWF9JTlRSOyBpKyspCisJCWlmICh1bmxpa2VseSghYWRhcHRlci0+Y2xlYW5fcngoYWRhcHRlciwgYWRhcHRlci0+cnhfcmluZykgJgorCQkgICAhZTEwMDBfY2xlYW5fdHhfaXJxKGFkYXB0ZXIsIGFkYXB0ZXItPnR4X3JpbmcpKSkKKwkJCWJyZWFrOworCisJaWYgKGxpa2VseShhZGFwdGVyLT5pdHJfc2V0dGluZyAmIDMpKQorCQllMTAwMF9zZXRfaXRyKGFkYXB0ZXIpOworI2VuZGlmCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKIAogLyoqCiAgKiBlMTAwMF9pbnRyIC0gSW50ZXJydXB0IEhhbmRsZXIKQEAgLTM0NDcsNyArMzY5NywxNyBAQAogCXVpbnQzMl90IHJjdGwsIGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1IpOwogI2lmbmRlZiBDT05GSUdfRTEwMDBfTkFQSQogCWludCBpOwotI2Vsc2UKKyNlbmRpZgorCWlmICh1bmxpa2VseSghaWNyKSkKKwkJcmV0dXJuIElSUV9OT05FOyAgLyogTm90IG91ciBpbnRlcnJ1cHQgKi8KKworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJLyogSU1TIHdpbGwgbm90IGF1dG8tbWFzayBpZiBJTlRfQVNTRVJURUQgaXMgbm90IHNldCwgYW5kIGlmIGl0IGlzCisJICogbm90IHNldCwgdGhlbiB0aGUgYWRhcHRlciBkaWRuJ3Qgc2VuZCBhbiBpbnRlcnJ1cHQgKi8KKwlpZiAodW5saWtlbHkoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTcxICYmCisJICAgICAgICAgICAgICEoaWNyICYgRTEwMDBfSUNSX0lOVF9BU1NFUlRFRCkpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKIAkvKiBJbnRlcnJ1cHQgQXV0by1NYXNrLi4udXBvbiByZWFkaW5nIElDUiwKIAkgKiBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQuICBObyBuZWVkIGZvciB0aGUKIAkgKiBJTUMgd3JpdGUsIGJ1dCBpdCBkb2VzIG1lYW4gd2Ugc2hvdWxkCkBAIC0zNDU2LDE0ICszNzE2LDYgQEAKIAkJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7CiAjZW5kaWYKIAotCWlmICh1bmxpa2VseSghaWNyKSkgewotI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCi0JCWlmIChody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpCi0JCQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOwotI2VuZGlmCi0JCXJldHVybiBJUlFfTk9ORTsgIC8qIE5vdCBvdXIgaW50ZXJydXB0ICovCi0JfQotCiAJaWYgKHVubGlrZWx5KGljciAmIChFMTAwMF9JQ1JfUlhTRVEgfCBFMTAwMF9JQ1JfTFNDKSkpIHsKIAkJaHctPmdldF9saW5rX3N0YXR1cyA9IDE7CiAJCS8qIDgwMDAzRVMyTEFOIHdvcmthcm91bmQtLQpAQCAtMzQ4NCwxMyArMzczNiwyMCBAQAogCiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKIAlpZiAodW5saWtlbHkoaHctPm1hY190eXBlIDwgZTEwMDBfODI1NzEpKSB7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0cywgd2l0aG91dCB0aGUgc3luY2hyb25pemVfaXJxIGJpdCAqLwogCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKIAkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIH4wKTsKIAkJRTEwMDBfV1JJVEVfRkxVU0goaHcpOwogCX0KLQlpZiAobGlrZWx5KG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAobmV0ZGV2KSkpCisJaWYgKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldikpKSB7CisJCWFkYXB0ZXItPnRvdGFsX3R4X2J5dGVzID0gMDsKKwkJYWRhcHRlci0+dG90YWxfdHhfcGFja2V0cyA9IDA7CisJCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzID0gMDsKKwkJYWRhcHRlci0+dG90YWxfcnhfcGFja2V0cyA9IDA7CiAJCV9fbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2KTsKLQllbHNlCisJfSBlbHNlCisJCS8qIHRoaXMgcmVhbGx5IHNob3VsZCBub3QgaGFwcGVuISBpZiBpdCBkb2VzIGl0IGlzIGJhc2ljYWxseSBhCisJCSAqIGJ1ZywgYnV0IG5vdCBhIGhhcmQgZXJyb3IsIHNvIGVuYWJsZSBpbnRzIGFuZCBjb250aW51ZSAqLwogCQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOwogI2Vsc2UKIAkvKiBXcml0aW5nIElNQyBhbmQgSU1TIGlzIG5lZWRlZCBmb3IgODI1NDcuCkBAIC0zNTA4LDE2ICszNzY3LDIzIEBACiAJCUUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCB+MCk7CiAJfQogCisJYWRhcHRlci0+dG90YWxfdHhfYnl0ZXMgPSAwOworCWFkYXB0ZXItPnRvdGFsX3J4X2J5dGVzID0gMDsKKwlhZGFwdGVyLT50b3RhbF90eF9wYWNrZXRzID0gMDsKKwlhZGFwdGVyLT50b3RhbF9yeF9wYWNrZXRzID0gMDsKKwogCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9NQVhfSU5UUjsgaSsrKQogCQlpZiAodW5saWtlbHkoIWFkYXB0ZXItPmNsZWFuX3J4KGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3JpbmcpICYKIAkJICAgIWUxMDAwX2NsZWFuX3R4X2lycShhZGFwdGVyLCBhZGFwdGVyLT50eF9yaW5nKSkpCiAJCQlicmVhazsKIAorCWlmIChsaWtlbHkoYWRhcHRlci0+aXRyX3NldHRpbmcgJiAzKSkKKwkJZTEwMDBfc2V0X2l0cihhZGFwdGVyKTsKKwogCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKQogCQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOwogCiAjZW5kaWYKLQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMzU2MSw2ICszODI3LDggQEAKIAlpZiAoKCF0eF9jbGVhbmVkICYmICh3b3JrX2RvbmUgPT0gMCkpIHx8CiAJICAgIW5ldGlmX3J1bm5pbmcocG9sbF9kZXYpKSB7CiBxdWl0X3BvbGxpbmc6CisJCWlmIChsaWtlbHkoYWRhcHRlci0+aXRyX3NldHRpbmcgJiAzKSkKKwkJCWUxMDAwX3NldF9pdHIoYWRhcHRlcik7CiAJCW5ldGlmX3J4X2NvbXBsZXRlKHBvbGxfZGV2KTsKIAkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAkJcmV0dXJuIDA7CkBAIC0zNTg3LDYgKzM4NTUsNyBAQAogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAjZW5kaWYKIAlib29sZWFuX3QgY2xlYW5lZCA9IEZBTFNFOworCXVuc2lnbmVkIGludCB0b3RhbF90eF9ieXRlcz0wLCB0b3RhbF90eF9wYWNrZXRzPTA7CiAKIAlpID0gdHhfcmluZy0+bmV4dF90b19jbGVhbjsKIAllb3AgPSB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5uZXh0X3RvX3dhdGNoOwpAQCAtMzU5OCwxMyArMzg2NywxOSBAQAogCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCQljbGVhbmVkID0gKGkgPT0gZW9wKTsKIAorCQkJaWYgKGNsZWFuZWQpIHsKKwkJCQkvKiB0aGlzIHBhY2tldCBjb3VudCBpcyB3cm9uZyBmb3IgVFNPIGJ1dCBoYXMgYQorCQkJCSAqIHRlbmRlbmN5IHRvIG1ha2UgZHluYW1pYyBJVFIgY2hhbmdlIG1vcmUKKwkJCQkgKiB0b3dhcmRzIGJ1bGsgKi8KKwkJCQl0b3RhbF90eF9wYWNrZXRzKys7CisJCQkJdG90YWxfdHhfYnl0ZXMgKz0gYnVmZmVyX2luZm8tPnNrYi0+bGVuOworCQkJfQogCQkJZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoYWRhcHRlciwgYnVmZmVyX2luZm8pOwotCQkJbWVtc2V0KHR4X2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfZGVzYykpOworCQkJdHhfZGVzYy0+dXBwZXIuZGF0YSA9IDA7CiAKIAkJCWlmICh1bmxpa2VseSgrK2kgPT0gdHhfcmluZy0+Y291bnQpKSBpID0gMDsKIAkJfQogCi0KIAkJZW9wID0gdHhfcmluZy0+YnVmZmVyX2luZm9baV0ubmV4dF90b193YXRjaDsKIAkJZW9wX2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOwogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCkBAIC0zNjIzLDggKzM4OTgsMTAgQEAKIAkJICogc2VlcyB0aGUgbmV3IG5leHRfdG9fY2xlYW4uCiAJCSAqLwogCQlzbXBfbWIoKTsKLQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkgewogCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCQkJKythZGFwdGVyLT5yZXN0YXJ0X3F1ZXVlOworCQl9CiAJfQogCiAJaWYgKGFkYXB0ZXItPmRldGVjdF90eF9odW5nKSB7CkBAIC0zNjYyLDYgKzM5MzksOCBAQAogCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCQl9CiAJfQorCWFkYXB0ZXItPnRvdGFsX3R4X2J5dGVzICs9IHRvdGFsX3R4X2J5dGVzOworCWFkYXB0ZXItPnRvdGFsX3R4X3BhY2tldHMgKz0gdG90YWxfdHhfcGFja2V0czsKIAlyZXR1cm4gY2xlYW5lZDsKIH0KIApAQCAtMzc0MSw2ICs0MDIwLDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgY2xlYW5lZF9jb3VudCA9IDA7CiAJYm9vbGVhbl90IGNsZWFuZWQgPSBGQUxTRTsKKwl1bnNpZ25lZCBpbnQgdG90YWxfcnhfYnl0ZXM9MCwgdG90YWxfcnhfcGFja2V0cz0wOwogCiAJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CiAJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0MoKnJ4X3JpbmcsIGkpOwpAQCAtMzc0OSw2ICs0MDI5LDcgQEAKIAl3aGlsZSAocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfREQpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJdTggc3RhdHVzOworCiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKIAkJaWYgKCp3b3JrX2RvbmUgPj0gd29ya190b19kbykKIAkJCWJyZWFrOwpAQCAtMzc3NSw5ICs0MDU2LDYgQEAKIAogCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT5sZW5ndGgpOwogCi0JCS8qIGFkanVzdCBsZW5ndGggdG8gcmVtb3ZlIEV0aGVybmV0IENSQyAqLwotCQlsZW5ndGggLT0gNDsKLQogCQlpZiAodW5saWtlbHkoIShzdGF0dXMgJiBFMTAwMF9SWERfU1RBVF9FT1ApKSkgewogCQkJLyogQWxsIHJlY2VpdmVzIG11c3QgZml0IGludG8gYSBzaW5nbGUgYnVmZmVyICovCiAJCQlFMTAwMF9EQkcoIiVzOiBSZWNlaXZlIHBhY2tldCBjb25zdW1lZCBtdWx0aXBsZSIKQEAgLTM4MDUsNiArNDA4MywxNCBAQAogCQkJfQogCQl9CiAKKwkJLyogYWRqdXN0IGxlbmd0aCB0byByZW1vdmUgRXRoZXJuZXQgQ1JDLCB0aGlzIG11c3QgYmUKKwkJICogZG9uZSBhZnRlciB0aGUgVEJJX0FDQ0VQVCB3b3JrYXJvdW5kIGFib3ZlICovCisJCWxlbmd0aCAtPSA0OworCisJCS8qIHByb2JhYmx5IGEgbGl0dGxlIHNrZXdlZCBkdWUgdG8gcmVtb3ZpbmcgQ1JDICovCisJCXRvdGFsX3J4X2J5dGVzICs9IGxlbmd0aDsKKwkJdG90YWxfcnhfcGFja2V0cysrOworCiAJCS8qIGNvZGUgYWRkZWQgZm9yIGNvcHlicmVhaywgdGhpcyBzaG91bGQgaW1wcm92ZQogCQkgKiBwZXJmb3JtYW5jZSBmb3Igc21hbGwgcGFja2V0cyB3aXRoIGxhcmdlIGFtb3VudHMKIAkJICogb2YgcmVhc3NlbWJseSBiZWluZyBkb25lIGluIHRoZSBzdGFjayAqLwpAQCAtMzgyMCwxMiArNDEwNiwxMSBAQAogCQkJCS8qIHNhdmUgdGhlIHNrYiBpbiBidWZmZXJfaW5mbyBhcyBnb29kICovCiAJCQkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKIAkJCQlza2IgPSBuZXdfc2tiOwotCQkJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwogCQkJfQotCQl9IGVsc2UKLQkJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwotCisJCQkvKiBlbHNlIGp1c3QgY29udGludWUgd2l0aCB0aGUgb2xkIG9uZSAqLworCQl9CiAJCS8qIGVuZCBjb3B5YnJlYWsgY29kZSAqLworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKIAogCQkvKiBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgKi8KIAkJZTEwMDBfcnhfY2hlY2tzdW0oYWRhcHRlciwKQEAgLTM4NzQsNiArNDE1OSw4IEBACiAJaWYgKGNsZWFuZWRfY291bnQpCiAJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCByeF9yaW5nLCBjbGVhbmVkX2NvdW50KTsKIAorCWFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKKwlhZGFwdGVyLT50b3RhbF9yeF9ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKIAlyZXR1cm4gY2xlYW5lZDsKIH0KIApAQCAtMzkwMyw2ICs0MTkwLDcgQEAKIAl1aW50MzJfdCBsZW5ndGgsIHN0YXRlcnI7CiAJaW50IGNsZWFuZWRfY291bnQgPSAwOwogCWJvb2xlYW5fdCBjbGVhbmVkID0gRkFMU0U7CisJdW5zaWduZWQgaW50IHRvdGFsX3J4X2J5dGVzPTAsIHRvdGFsX3J4X3BhY2tldHM9MDsKIAogCWkgPSByeF9yaW5nLT5uZXh0X3RvX2NsZWFuOwogCXJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDX1BTKCpyeF9yaW5nLCBpKTsKQEAgLTM5ODcsNyArNDI3NSw3IEBACiAJCQlnb3RvIGNvcHlkb25lOwogCQl9IC8qIGlmICovCiAJCX0KLQkJCisKIAkJZm9yIChqID0gMDsgaiA8IGFkYXB0ZXItPnJ4X3BzX3BhZ2VzOyBqKyspIHsKIAkJCWlmICghKGxlbmd0aD0gbGUxNl90b19jcHUocnhfZGVzYy0+d2IudXBwZXIubGVuZ3RoW2pdKSkpCiAJCQkJYnJlYWs7CkBAIC00MDA3LDYgKzQyOTUsOSBAQAogCQlwc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOwogCiBjb3B5ZG9uZToKKwkJdG90YWxfcnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXRvdGFsX3J4X3BhY2tldHMrKzsKKwogCQllMTAwMF9yeF9jaGVja3N1bShhZGFwdGVyLCBzdGF0ZXJyLAogCQkJCSAgbGUxNl90b19jcHUocnhfZGVzYy0+d2IubG93ZXIuaGlfZHdvcmQuY3N1bV9pcC5jc3VtKSwgc2tiKTsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKQEAgLTQwNTUsNiArNDM0Niw4IEBACiAJaWYgKGNsZWFuZWRfY291bnQpCiAJCWFkYXB0ZXItPmFsbG9jX3J4X2J1ZihhZGFwdGVyLCByeF9yaW5nLCBjbGVhbmVkX2NvdW50KTsKIAorCWFkYXB0ZXItPnRvdGFsX3J4X3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKKwlhZGFwdGVyLT50b3RhbF9yeF9ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKIAlyZXR1cm4gY2xlYW5lZDsKIH0KIApAQCAtNDIyMiw3ICs0NTE1LDcgQEAKIAkJfQogCiAJCXNrYiA9IG5ldGRldl9hbGxvY19za2IobmV0ZGV2LAotCQkJCSAgICAgICBhZGFwdGVyLT5yeF9wc19ic2l6ZTAgKyBORVRfSVBfQUxJR04pOworCQkgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnJ4X3BzX2JzaXplMCArIE5FVF9JUF9BTElHTik7CiAKIAkJaWYgKHVubGlrZWx5KCFza2IpKSB7CiAJCQlhZGFwdGVyLT5hbGxvY19yeF9idWZmX2ZhaWxlZCsrOwpAQCAtNDQ5OSw3ICs0NzkyLDYgQEAKICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKIH0KIAotCiB2b2lkCiBlMTAwMF9pb193cml0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHBvcnQsIHVpbnQzMl90IHZhbHVlKQogewpAQCAtNDUyMiwxMiArNDgxNCwxMiBAQAogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMLCBjdHJsKTsKIAogCQlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewotCQkvKiBlbmFibGUgVkxBTiByZWNlaXZlIGZpbHRlcmluZyAqLwotCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKLQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1ZGRTsKLQkJcmN0bCAmPSB+RTEwMDBfUkNUTF9DRklFTjsKLQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7Ci0JCWUxMDAwX3VwZGF0ZV9tbmdfdmxhbihhZGFwdGVyKTsKKwkJCS8qIGVuYWJsZSBWTEFOIHJlY2VpdmUgZmlsdGVyaW5nICovCisJCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwkJCXJjdGwgfD0gRTEwMDBfUkNUTF9WRkU7CisJCQlyY3RsICY9IH5FMTAwMF9SQ1RMX0NGSUVOOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7CisJCQllMTAwMF91cGRhdGVfbW5nX3ZsYW4oYWRhcHRlcik7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwpAQCAtNDUzNiwxNCArNDgyOCwxNiBAQAogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMLCBjdHJsKTsKIAogCQlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfaWNoOGxhbikgewotCQkvKiBkaXNhYmxlIFZMQU4gZmlsdGVyaW5nICovCi0JCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOwotCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1ZGRTsKLQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7Ci0JCWlmIChhZGFwdGVyLT5tbmdfdmxhbl9pZCAhPSAodWludDE2X3QpRTEwMDBfTU5HX1ZMQU5fTk9ORSkgewotCQkJZTEwMDBfdmxhbl9yeF9raWxsX3ZpZChuZXRkZXYsIGFkYXB0ZXItPm1uZ192bGFuX2lkKTsKLQkJCWFkYXB0ZXItPm1uZ192bGFuX2lkID0gRTEwMDBfTU5HX1ZMQU5fTk9ORTsKLQkJfQorCQkJLyogZGlzYWJsZSBWTEFOIGZpbHRlcmluZyAqLworCQkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1ZGRTsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCQkJaWYgKGFkYXB0ZXItPm1uZ192bGFuX2lkICE9CisJCQkgICAgKHVpbnQxNl90KUUxMDAwX01OR19WTEFOX05PTkUpIHsKKwkJCQllMTAwMF92bGFuX3J4X2tpbGxfdmlkKG5ldGRldiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPm1uZ192bGFuX2lkKTsKKwkJCQlhZGFwdGVyLT5tbmdfdmxhbl9pZCA9IEUxMDAwX01OR19WTEFOX05PTkU7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTQ3NzMsOCArNTA2Nyw5IEBACiAJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsKIAl9CiAKLQlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSAmJgotCSAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwkgICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU3MSAmJgorCSAgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CiAJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOwogCQlpZiAobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pIHsKIAkJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CkBAIC00Nzg3LDYgKzUwODIsOSBAQAogCWlmIChhZGFwdGVyLT5ody5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwXzMpCiAJCWUxMDAwX3BoeV9wb3dlcmRvd25fd29ya2Fyb3VuZCgmYWRhcHRlci0+aHcpOwogCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJZTEwMDBfZnJlZV9pcnEoYWRhcHRlcik7CisKIAkvKiBSZWxlYXNlIGNvbnRyb2wgb2YgaC93IHRvIGYvdy4gIElmIGYvdyBpcyBBTVQgZW5hYmxlZCwgdGhpcwogCSAqIHdvdWxkIGhhdmUgYWxyZWFkeSBoYXBwZW5lZCBpbiBjbG9zZSBhbmQgaXMgcmVkdW5kYW50LiAqLwogCWUxMDAwX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKQEAgLTQ4MTcsNiArNTExNSwxMCBAQAogCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOwogCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNjb2xkLCAwKTsKIAorCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikgJiYgKGVyciA9IGUxMDAwX3JlcXVlc3RfaXJxKGFkYXB0ZXIpKSkKKwkJcmV0dXJuIGVycjsKKworCWUxMDAwX3Bvd2VyX3VwX3BoeShhZGFwdGVyKTsKIAllMTAwMF9yZXNldChhZGFwdGVyKTsKIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBXVVMsIH4wKTsKIApAQCAtNDgyNSw4ICs1MTI3LDkgQEAKIAogCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKIAotCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxICYmCi0JICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJgorCSAgICBhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxICYmCisJICAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKIAkJbWFuYyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTUFOQyk7CiAJCW1hbmMgJj0gfihFMTAwMF9NQU5DX0FSUF9FTik7CiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIE1BTkMsIG1hbmMpOwpAQCAtNDkxNCwxMCArNTIxNyw2IEBACiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwogCi0JLyogUGVyZm9ybSBjYXJkIHJlc2V0IG9ubHkgb24gb25lIGluc3RhbmNlIG9mIHRoZSBjYXJkICovCi0JaWYgKFBDSV9GVU5DIChwZGV2LT5kZXZmbikgIT0gMCkKLQkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKLQogCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOwogCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVUywgfjApOwogCkBAIC00OTQ4LDYgKzUyNDcsNyBAQAogCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKIAogCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCAmJgorCSAgICBhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTcxICYmCiAJICAgIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKIAkJbWFuYyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTUFOQyk7CiAJCW1hbmMgJj0gfihFMTAwMF9NQU5DX0FSUF9FTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaAppbmRleCBhNDY0Y2IyLi4xOGFmYzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX29zZGVwLmgKQEAgLTEwNywxNyArMTA3LDE2IEBACiAKICNkZWZpbmUgRTEwMDBfV1JJVEVfRkxVU0goYSkgRTEwMDBfUkVBRF9SRUcoYSwgU1RBVFVTKQogCi0jZGVmaW5lIEUxMDAwX1dSSVRFX0lDSDhfUkVHKGEsIHJlZywgdmFsdWUpICggXAorI2RlZmluZSBFMTAwMF9XUklURV9JQ0hfRkxBU0hfUkVHKGEsIHJlZywgdmFsdWUpICggXAogICAgIHdyaXRlbCgodmFsdWUpLCAoKGEpLT5mbGFzaF9hZGRyZXNzICsgcmVnKSkpCiAKLSNkZWZpbmUgRTEwMDBfUkVBRF9JQ0g4X1JFRyhhLCByZWcpICggXAorI2RlZmluZSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcoYSwgcmVnKSAoIFwKICAgICByZWFkbCgoYSktPmZsYXNoX2FkZHJlc3MgKyByZWcpKQogCi0jZGVmaW5lIEUxMDAwX1dSSVRFX0lDSDhfUkVHMTYoYSwgcmVnLCB2YWx1ZSkgKCBcCisjZGVmaW5lIEUxMDAwX1dSSVRFX0lDSF9GTEFTSF9SRUcxNihhLCByZWcsIHZhbHVlKSAoIFwKICAgICB3cml0ZXcoKHZhbHVlKSwgKChhKS0+Zmxhc2hfYWRkcmVzcyArIHJlZykpKQogCi0jZGVmaW5lIEUxMDAwX1JFQURfSUNIOF9SRUcxNihhLCByZWcpICggXAorI2RlZmluZSBFMTAwMF9SRUFEX0lDSF9GTEFTSF9SRUcxNihhLCByZWcpICggXAogICAgIHJlYWR3KChhKS0+Zmxhc2hfYWRkcmVzcyArIHJlZykpCiAKLQogI2VuZGlmIC8qIF9FMTAwMF9PU0RFUF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMKaW5kZXggOWMzYzFhYy4uY2JmY2Q3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCkBAIC00NCwxNiArNDQsNiBAQAogICovCiAKICNkZWZpbmUgRTEwMDBfUEFSQU1fSU5JVCB7IFswIC4uLiBFMTAwMF9NQVhfTklDXSA9IE9QVElPTl9VTlNFVCB9Ci0vKiBNb2R1bGUgUGFyYW1ldGVycyBhcmUgYWx3YXlzIGluaXRpYWxpemVkIHRvIC0xLCBzbyB0aGF0IHRoZSBkcml2ZXIKLSAqIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbm8gdXNlciBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlCi0gKiB1c2VyIGFza2luZyBmb3IgdGhlIGRlZmF1bHQgdmFsdWUuCi0gKiBUaGUgdHJ1ZSBkZWZhdWx0IHZhbHVlcyBhcmUgbG9hZGVkIGluIHdoZW4gZTEwMDBfY2hlY2tfb3B0aW9ucyBpcyBjYWxsZWQuCi0gKgotICogVGhpcyBpcyBhIEdDQyBleHRlbnNpb24gdG8gQU5TSSBDLgotICogU2VlIHRoZSBpdGVtICJMYWJlbGVkIEVsZW1lbnRzIGluIEluaXRpYWxpemVycyIgaW4gdGhlIHNlY3Rpb24KLSAqICJFeHRlbnNpb25zIHRvIHRoZSBDIExhbmd1YWdlIEZhbWlseSIgb2YgdGhlIEdDQyBkb2N1bWVudGF0aW9uLgotICovCi0KICNkZWZpbmUgRTEwMDBfUEFSQU0oWCwgZGVzYykgXAogCXN0YXRpYyBpbnQgX19kZXZpbml0ZGF0YSBYW0UxMDAwX01BWF9OSUMrMV0gPSBFMTAwMF9QQVJBTV9JTklUOyBcCiAJc3RhdGljIGludCBudW1fIyNYID0gMDsgXApAQCAtNjcsNyArNTcsNiBAQAogICoKICAqIERlZmF1bHQgVmFsdWU6IDI1NgogICovCi0KIEUxMDAwX1BBUkFNKFR4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMiKTsKIAogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIENvdW50CkBAIC03Nyw3ICs2Niw2IEBACiAgKgogICogRGVmYXVsdCBWYWx1ZTogMjU2CiAgKi8KLQogRTEwMDBfUEFSQU0oUnhEZXNjcmlwdG9ycywgIk51bWJlciBvZiByZWNlaXZlIGRlc2NyaXB0b3JzIik7CiAKIC8qIFVzZXIgU3BlY2lmaWVkIFNwZWVkIE92ZXJyaWRlCkBAIC05MCw3ICs3OCw2IEBACiAgKgogICogRGVmYXVsdCBWYWx1ZTogMAogICovCi0KIEUxMDAwX1BBUkFNKFNwZWVkLCAiU3BlZWQgc2V0dGluZyIpOwogCiAvKiBVc2VyIFNwZWNpZmllZCBEdXBsZXggT3ZlcnJpZGUKQEAgLTEwMiw3ICs4OSw2IEBACiAgKgogICogRGVmYXVsdCBWYWx1ZTogMAogICovCi0KIEUxMDAwX1BBUkFNKER1cGxleCwgIkR1cGxleCBzZXR0aW5nIik7CiAKIC8qIEF1dG8tbmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCBPdmVycmlkZQpAQCAtMTE5LDggKzEwNSw5IEBACiAgKgogICogRGVmYXVsdCBWYWx1ZTogMHgyRiAoY29wcGVyKTsgMHgyMCAoZmliZXIpCiAgKi8KLQogRTEwMDBfUEFSQU0oQXV0b05lZywgIkFkdmVydGlzZWQgYXV0by1uZWdvdGlhdGlvbiBzZXR0aW5nIik7CisjZGVmaW5lIEFVVE9ORUdfQURWX0RFRkFVTFQgIDB4MkYKKyNkZWZpbmUgQVVUT05FR19BRFZfTUFTSyAgICAgMHgyRgogCiAvKiBVc2VyIFNwZWNpZmllZCBGbG93IENvbnRyb2wgT3ZlcnJpZGUKICAqCkBAIC0xMzIsOCArMTE5LDggQEAKICAqCiAgKiBEZWZhdWx0IFZhbHVlOiBSZWFkIGZsb3cgY29udHJvbCBzZXR0aW5ncyBmcm9tIHRoZSBFRVBST00KICAqLwotCiBFMTAwMF9QQVJBTShGbG93Q29udHJvbCwgIkZsb3cgQ29udHJvbCBzZXR0aW5nIik7CisjZGVmaW5lIEZMT1dfQ09OVFJPTF9ERUZBVUxUIEZMT1dfQ09OVFJPTF9GVUxMCiAKIC8qIFhzdW1SWCAtIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGUvRGlzYWJsZQogICoKQEAgLTE0NCw1MyArMTMxLDU0IEBACiAgKgogICogRGVmYXVsdCBWYWx1ZTogMQogICovCi0KIEUxMDAwX1BBUkFNKFhzdW1SWCwgIkRpc2FibGUgb3IgZW5hYmxlIFJlY2VpdmUgQ2hlY2tzdW0gb2ZmbG9hZCIpOwogCiAvKiBUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkgaW4gdW5pdHMgb2YgMS4wMjQgbWljcm9zZWNvbmRzCisgKiAgVHggaW50ZXJydXB0IGRlbGF5IG5lZWRzIHRvIHR5cGljYWxseSBiZSBzZXQgdG8gc29tZXRoaW5nIG5vbiB6ZXJvCiAgKgogICogVmFsaWQgUmFuZ2U6IDAtNjU1MzUKLSAqCi0gKiBEZWZhdWx0IFZhbHVlOiA2NAogICovCi0KIEUxMDAwX1BBUkFNKFR4SW50RGVsYXksICJUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkiKTsKKyNkZWZpbmUgREVGQVVMVF9USURWICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTUFYX1RYREVMQVkgICAgICAgICAgICAgICAweEZGRkYKKyNkZWZpbmUgTUlOX1RYREVMQVkgICAgICAgICAgICAgICAgICAgIDAKIAogLyogVHJhbnNtaXQgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcwogICoKICAqIFZhbGlkIFJhbmdlOiAwLTY1NTM1Ci0gKgotICogRGVmYXVsdCBWYWx1ZTogMAogICovCi0KIEUxMDAwX1BBUkFNKFR4QWJzSW50RGVsYXksICJUcmFuc21pdCBBYnNvbHV0ZSBJbnRlcnJ1cHQgRGVsYXkiKTsKKyNkZWZpbmUgREVGQVVMVF9UQURWICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTUFYX1RYQUJTREVMQVkgICAgICAgICAgICAweEZGRkYKKyNkZWZpbmUgTUlOX1RYQUJTREVMQVkgICAgICAgICAgICAgICAgIDAKIAogLyogUmVjZWl2ZSBJbnRlcnJ1cHQgRGVsYXkgaW4gdW5pdHMgb2YgMS4wMjQgbWljcm9zZWNvbmRzCisgKiAgIGhhcmR3YXJlIHdpbGwgbGlrZWx5IGhhbmcgaWYgeW91IHNldCB0aGlzIHRvIGFueXRoaW5nIGJ1dCB6ZXJvLgogICoKICAqIFZhbGlkIFJhbmdlOiAwLTY1NTM1Ci0gKgotICogRGVmYXVsdCBWYWx1ZTogMAogICovCi0KIEUxMDAwX1BBUkFNKFJ4SW50RGVsYXksICJSZWNlaXZlIEludGVycnVwdCBEZWxheSIpOworI2RlZmluZSBERUZBVUxUX1JEVFIgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfUlhERUxBWSAgICAgICAgICAgICAgIDB4RkZGRgorI2RlZmluZSBNSU5fUlhERUxBWSAgICAgICAgICAgICAgICAgICAgMAogCiAvKiBSZWNlaXZlIEFic29sdXRlIEludGVycnVwdCBEZWxheSBpbiB1bml0cyBvZiAxLjAyNCBtaWNyb3NlY29uZHMKICAqCiAgKiBWYWxpZCBSYW5nZTogMC02NTUzNQotICoKLSAqIERlZmF1bHQgVmFsdWU6IDEyOAogICovCi0KIEUxMDAwX1BBUkFNKFJ4QWJzSW50RGVsYXksICJSZWNlaXZlIEFic29sdXRlIEludGVycnVwdCBEZWxheSIpOworI2RlZmluZSBERUZBVUxUX1JBRFYgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfUlhBQlNERUxBWSAgICAgICAgICAgIDB4RkZGRgorI2RlZmluZSBNSU5fUlhBQlNERUxBWSAgICAgICAgICAgICAgICAgMAogCiAvKiBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZSAoaW50ZXJydXB0cy9zZWMpCiAgKgotICogVmFsaWQgUmFuZ2U6IDEwMC0xMDAwMDAgKDA9b2ZmLCAxPWR5bmFtaWMpCi0gKgotICogRGVmYXVsdCBWYWx1ZTogODAwMAorICogVmFsaWQgUmFuZ2U6IDEwMC0xMDAwMDAgKDA9b2ZmLCAxPWR5bmFtaWMsIDM9ZHluYW1pYyBjb25zZXJ2YXRpdmUpCiAgKi8KLQogRTEwMDBfUEFSQU0oSW50ZXJydXB0VGhyb3R0bGVSYXRlLCAiSW50ZXJydXB0IFRocm90dGxpbmcgUmF0ZSIpOworI2RlZmluZSBERUZBVUxUX0lUUiAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNQVhfSVRSICAgICAgICAgICAgICAgICAgIDEwMDAwMAorI2RlZmluZSBNSU5fSVRSICAgICAgICAgICAgICAgICAgICAgIDEwMAogCiAvKiBFbmFibGUgU21hcnQgUG93ZXIgRG93biBvZiB0aGUgUEhZCiAgKgpAQCAtMTk4LDcgKzE4Niw2IEBACiAgKgogICogRGVmYXVsdCBWYWx1ZTogMCAoZGlzYWJsZWQpCiAgKi8KLQogRTEwMDBfUEFSQU0oU21hcnRQb3dlckRvd25FbmFibGUsICJFbmFibGUgUEhZIHNtYXJ0IHBvd2VyIGRvd24iKTsKIAogLyogRW5hYmxlIEt1bWVyYW4gTG9jayBMb3NzIHdvcmthcm91bmQKQEAgLTIwNywzMyArMTk0LDggQEAKICAqCiAgKiBEZWZhdWx0IFZhbHVlOiAxIChlbmFibGVkKQogICovCi0KIEUxMDAwX1BBUkFNKEt1bWVyYW5Mb2NrTG9zcywgIkVuYWJsZSBLdW1lcmFuIGxvY2sgbG9zcyB3b3JrYXJvdW5kIik7CiAKLSNkZWZpbmUgQVVUT05FR19BRFZfREVGQVVMVCAgMHgyRgotI2RlZmluZSBBVVRPTkVHX0FEVl9NQVNLICAgICAweDJGCi0jZGVmaW5lIEZMT1dfQ09OVFJPTF9ERUZBVUxUIEZMT1dfQ09OVFJPTF9GVUxMCi0KLSNkZWZpbmUgREVGQVVMVF9SRFRSICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTUFYX1JYREVMQVkgICAgICAgICAgICAgICAweEZGRkYKLSNkZWZpbmUgTUlOX1JYREVMQVkgICAgICAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBERUZBVUxUX1JBRFYgICAgICAgICAgICAgICAgIDEyOAotI2RlZmluZSBNQVhfUlhBQlNERUxBWSAgICAgICAgICAgIDB4RkZGRgotI2RlZmluZSBNSU5fUlhBQlNERUxBWSAgICAgICAgICAgICAgICAgMAotCi0jZGVmaW5lIERFRkFVTFRfVElEViAgICAgICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIE1BWF9UWERFTEFZICAgICAgICAgICAgICAgMHhGRkZGCi0jZGVmaW5lIE1JTl9UWERFTEFZICAgICAgICAgICAgICAgICAgICAwCi0KLSNkZWZpbmUgREVGQVVMVF9UQURWICAgICAgICAgICAgICAgICAgNjQKLSNkZWZpbmUgTUFYX1RYQUJTREVMQVkgICAgICAgICAgICAweEZGRkYKLSNkZWZpbmUgTUlOX1RYQUJTREVMQVkgICAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBERUZBVUxUX0lUUiAgICAgICAgICAgICAgICAgODAwMAotI2RlZmluZSBNQVhfSVRSICAgICAgICAgICAgICAgICAgIDEwMDAwMAotI2RlZmluZSBNSU5fSVRSICAgICAgICAgICAgICAgICAgICAgIDEwMAotCiBzdHJ1Y3QgZTEwMDBfb3B0aW9uIHsKIAllbnVtIHsgZW5hYmxlX29wdGlvbiwgcmFuZ2Vfb3B0aW9uLCBsaXN0X29wdGlvbiB9IHR5cGU7CiAJY2hhciAqbmFtZTsKQEAgLTUxMCwxNSArNDcyLDI3IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIDE6CiAJCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgIiVzIHNldCB0byBkeW5hbWljIG1vZGVcbiIsCi0JCQkJICAgICAgICBvcHQubmFtZSk7CisJCQkJCW9wdC5uYW1lKTsKKwkJCQlhZGFwdGVyLT5pdHJfc2V0dGluZyA9IGFkYXB0ZXItPml0cjsKKwkJCQlhZGFwdGVyLT5pdHIgPSAyMDAwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlEUFJJTlRLKFBST0JFLCBJTkZPLAorCQkJCSAgICAgICAgIiVzIHNldCB0byBkeW5hbWljIGNvbnNlcnZhdGl2ZSBtb2RlXG4iLAorCQkJCQlvcHQubmFtZSk7CisJCQkJYWRhcHRlci0+aXRyX3NldHRpbmcgPSBhZGFwdGVyLT5pdHI7CisJCQkJYWRhcHRlci0+aXRyID0gMjAwMDA7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+aXRyLCAmb3B0LAotCQkJCSAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyKTsKKwkJCQkgICAgICAgIGFkYXB0ZXIpOworCQkJCS8qIHNhdmUgdGhlIHNldHRpbmcsIGJlY2F1c2UgdGhlIGR5bmFtaWMgYml0cyBjaGFuZ2UgaXRyICovCisJCQkJYWRhcHRlci0+aXRyX3NldHRpbmcgPSBhZGFwdGVyLT5pdHI7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlhZGFwdGVyLT5pdHIgPSBvcHQuZGVmOworCQkJYWRhcHRlci0+aXRyX3NldHRpbmcgPSBvcHQuZGVmOworCQkJYWRhcHRlci0+aXRyID0gMjAwMDA7CiAJCX0KIAl9CiAJeyAvKiBTbWFydCBQb3dlciBEb3duICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMjEwMC5jIGIvZHJpdmVycy9uZXQvZTIxMDAuYwppbmRleCBkMzllODQ4Li5jNjJkOWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2UyMTAwLmMKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFMjFfSU9fRVhURU5UKTsKIH0KIAotdm9pZAordm9pZCBfX2V4aXQKIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHRoaXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWVwcm8uYyBiL2RyaXZlcnMvbmV0L2VlcHJvLmMKaW5kZXggYTRlYjBkYy4uYjQ0NjMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWVwcm8uYworKysgYi9kcml2ZXJzL25ldC9lZXByby5jCkBAIC0xODI3LDcgKzE4MjcsNyBAQAogCXJldHVybiBuX2VlcHJvID8gMCA6IC1FTk9ERVY7CiB9CiAKLXZvaWQKK3ZvaWQgX19leGl0CiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWV4cHJlc3MuYyBiL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKaW5kZXggZTE0YmUwMi4uNGE1MGZjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWV4cHJlc3MuYworKysgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCkBAIC0xNzE5LDcgKzE3MTksNyBAQAogCXJldHVybiAtRU5YSU87CiB9CiAKLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3ZvaWQgX19leGl0IGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHRoaXNfZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWEuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCmluZGV4IGI0MDcyNGYuLjM5YWQ5ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJImVoZWEiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSJFSEVBXzAwMzQiCisjZGVmaW5lIERSVl9WRVJTSU9OCSJFSEVBXzAwNDMiCiAKICNkZWZpbmUgRUhFQV9NU0dfREVGQVVMVCAoTkVUSUZfTVNHX0xJTksgfCBORVRJRl9NU0dfVElNRVIgXAogCXwgTkVUSUZfTVNHX1JYX0VSUiB8IE5FVElGX01TR19UWF9FUlIpCkBAIC0xMDUsOSArMTA1LDYgQEAKICNkZWZpbmUgRUhFQV9CQ01DX1ZMQU5JRF9BTEwJMHgwMQogI2RlZmluZSBFSEVBX0JDTUNfVkxBTklEX1NJTkdMRQkweDAwCiAKLS8qIFVzZSB0aGlzIGRlZmluZSB0byBrbWFsbG9jYXRlIHBIWVAgY29udHJvbCBibG9ja3MgKi8KLSNkZWZpbmUgSF9DQl9BTElHTk1FTlQJCTQwOTYKLQogI2RlZmluZSBFSEVBX0NBQ0hFX0xJTkUgICAgICAgICAgMTI4CiAKIC8qIE1lbW9yeSBSZWdpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX2V0aHRvb2wuYwppbmRleCA4MmViMmZiLi45ZjU3YzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9ldGh0b29sLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCWRhdGFbaSsrXSA9IHBvcnQtPnBvcnRfcmVzWzBdLnN3cWVfcmVmaWxsX3RoOwogCWRhdGFbaSsrXSA9IHBvcnQtPnJlc2V0czsKIAotCWNiNiA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWNiNiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNiNikgewogCQllaGVhX2Vycm9yKCJubyBtZW0gZm9yIGNiNiIpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwppbmRleCBlYjdkNDRkLi44M2ZhMzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAogCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOwogCi0JY2IyID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2IyID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2IyKSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSBmb3IgY2IyIik7CiAJCWdvdG8gb3V0OwpAQCAtNTg2LDggKzU4Niw4IEBACiAJdTY0IGhyZXQ7CiAJc3RydWN0IGhjcF9laGVhX3BvcnRfY2IwICpjYjA7CiAKLQljYjAgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNiMCkgeworCWNiMCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfQVRPTUlDKTsgICAvKiBNYXkgYmUgY2FsbGVkIHZpYSAqLworCWlmICghY2IwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlaGVhX25lcV90YXNrbGV0KCkgKi8KIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjAiKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC02NzAsNyArNjcwLDcgQEAKIAl1NjQgaHJldDsKIAlpbnQgcmV0ID0gMDsKIAotCWNiNCA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWNiNCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNiNCkgewogCQllaGVhX2Vycm9yKCJubyBtZW0gZm9yIGNiNCIpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtNzY1LDggKzc2NSw3IEBACiAKIAkJaWYgKEVIRUFfQk1BU0tfR0VUKE5FUUVfUE9SVF9VUCwgZXFlKSkgewogCQkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHBvcnQtPm5ldGRldikpIHsKLQkJCQlyZXQgPSBlaGVhX3NlbnNlX3BvcnRfYXR0cigKLQkJCQkJcG9ydCk7CisJCQkJcmV0ID0gZWhlYV9zZW5zZV9wb3J0X2F0dHIocG9ydCk7CiAJCQkJaWYgKHJldCkgewogCQkJCQllaGVhX2Vycm9yKCJmYWlsZWQgcmVzZW5zaW5nIHBvcnQgIgogCQkJCQkJICAgImF0dHJpYnV0ZXMiKTsKQEAgLTk4Niw3ICs5ODUsNyBAQAogCXN0cnVjdCBoY3BfZWhlYV9wb3J0X2NiMCAqY2IwOwogCiAJcmV0ID0gLUVOT01FTTsKLQljYjAgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwljYjAgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYjApCiAJCWdvdG8gb3V0OwogCkBAIC0xNDQ0LDcgKzE0NDMsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQljYjAgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwljYjAgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYjApIHsKIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjAiKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTE1MDIsNyArMTUwMSw3IEBACiAJaWYgKChlbmFibGUgJiYgcG9ydC0+cHJvbWlzYykgfHwgKCFlbmFibGUgJiYgIXBvcnQtPnByb21pc2MpKQogCQlyZXR1cm47CiAKLQljYjcgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwljYjcgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFjYjcpIHsKIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjciKTsKIAkJZ290byBvdXQ7CkBAIC0xNjA2LDcgKzE2MDUsNyBAQAogCXN0cnVjdCBlaGVhX21jX2xpc3QgKmVoZWFfbWNsX2VudHJ5OwogCXU2NCBocmV0OwogCi0JZWhlYV9tY2xfZW50cnkgPSBremFsbG9jKHNpemVvZigqZWhlYV9tY2xfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwllaGVhX21jbF9lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplaGVhX21jbF9lbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmICghZWhlYV9tY2xfZW50cnkpIHsKIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBtY2xfZW50cnkiKTsKIAkJcmV0dXJuOwpAQCAtMTg3MSw3ICsxODcwLDcgQEAKIAogCXBvcnQtPnZncnAgPSBncnA7CiAKLQljYjEgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwljYjEgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYjEpIHsKIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjEiKTsKIAkJZ290byBvdXQ7CkBAIC0xOTAwLDcgKzE4OTksNyBAQAogCWludCBpbmRleDsKIAl1NjQgaHJldDsKIAotCWNiMSA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWNiMSA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNiMSkgewogCQllaGVhX2Vycm9yKCJubyBtZW0gZm9yIGNiMSIpOwogCQlnb3RvIG91dDsKQEAgLTE5MzYsNyArMTkzNSw3IEBACiAJaWYgKHBvcnQtPnZncnApCiAJCXBvcnQtPnZncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKIAotCWNiMSA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWNiMSA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNiMSkgewogCQllaGVhX2Vycm9yKCJubyBtZW0gZm9yIGNiMSIpOwogCQlnb3RvIG91dDsKQEAgLTE5NjksNyArMTk2OCw3IEBACiAJdTY0IGR1bW15NjQgPSAwOwogCXN0cnVjdCBoY3BfbW9kaWZ5X3FwX2NiMCogY2IwOwogCi0JY2IwID0ga3phbGxvYyhIX0NCX0FMSUdOTUVOVCwgR0ZQX0tFUk5FTCk7CisJY2IwID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2IwKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtMjIyNSwxMSArMjIyNCwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGVoZWFfcmVzZXRfcG9ydCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZWhlYV9yZXNldF9wb3J0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGVoZWFfcG9ydCwgcmVzZXRfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnQtPm5ldGRldjsKIAogCXBvcnQtPnJlc2V0cysrOwogCWRvd24oJnBvcnQtPnBvcnRfbG9jayk7CkBAIC0yMjcwLDcgKzIyNzAsNyBAQAogCXU2NCBocmV0OwogCWludCByZXQ7CiAKLQljYiA9IGt6YWxsb2MoSF9DQl9BTElHTk1FTlQsIEdGUF9LRVJORUwpOworCWNiID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY2IpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC0yMzQxLDcgKzIzNDEsNyBAQAogCQlnb3RvIG91dDsKIAogCS8qIEVuYWJsZSBKdW1ibyBmcmFtZXMgKi8KLQljYjQgPSBremFsbG9jKEhfQ0JfQUxJR05NRU5ULCBHRlBfS0VSTkVMKTsKKwljYjQgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYjQpIHsKIAkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjQiKTsKIAl9IGVsc2UgewpAQCAtMjM4MCw3ICsyMzgwLDcgQEAKIAlkZXYtPnR4X3RpbWVvdXQgPSAmZWhlYV90eF93YXRjaGRvZzsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gRUhFQV9XQVRDSF9ET0dfVElNRU9VVDsKIAotCUlOSVRfV09SSygmcG9ydC0+cmVzZXRfdGFzaywgZWhlYV9yZXNldF9wb3J0LCBkZXYpOworCUlOSVRfV09SSygmcG9ydC0+cmVzZXRfdGFzaywgZWhlYV9yZXNldF9wb3J0KTsKIAogCWVoZWFfc2V0X2V0aHRvb2xfb3BzKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jCmluZGV4IDBiNTFhOGMuLjBjZmMyYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuYwpAQCAtNTA2LDcgKzUwNiw3IEBACiAJCQkgICAgIGNvbnN0IHU4IHBhZ2VzaXplLCBjb25zdCB1OCBxdWV1ZV90eXBlLAogCQkJICAgICBjb25zdCB1NjQgbG9nX3BhZ2VhZGRyLCBjb25zdCB1NjQgY291bnQpCiB7Ci0JaWYgKChjb3VudCA+IDEpICYmIChsb2dfcGFnZWFkZHIgJiAweGZmZikpIHsKKwlpZiAoKGNvdW50ID4gMSkgJiYgKGxvZ19wYWdlYWRkciAmIH5QQUdFX01BU0spKSB7CiAJCWVoZWFfZXJyb3IoIm5vdCBvbiBwYWdlYm91bmRhcnkiKTsKIAkJcmV0dXJuIEhfUEFSQU1FVEVSOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmggYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oCmluZGV4IGZhNTFlM2IuLjkxOWY5NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaApAQCAtODEsMTQgKzgxLDE2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaGNwX2VwYXNfY3RvcihzdHJ1Y3QgaF9lcGFzICplcGFzLCB1NjQgcGFkZHJfa2VybmVsLAogCQkJCSB1NjQgcGFkZHJfdXNlcikKIHsKLQllcGFzLT5rZXJuZWwuYWRkciA9IGlvcmVtYXAocGFkZHJfa2VybmVsLCBQQUdFX1NJWkUpOworCS8qIFRvIHN1cHBvcnQgNjRrIHBhZ2VzIHdlIG11c3Qgcm91bmQgdG8gNjRrIHBhZ2UgYm91bmRhcnkgKi8KKwllcGFzLT5rZXJuZWwuYWRkciA9IGlvcmVtYXAoKHBhZGRyX2tlcm5lbCAmIFBBR0VfTUFTSyksIFBBR0VfU0laRSkgKworCQkJICAgIChwYWRkcl9rZXJuZWwgJiB+UEFHRV9NQVNLKTsKIAllcGFzLT51c2VyLmFkZHIgPSBwYWRkcl91c2VyOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNwX2VwYXNfZHRvcihzdHJ1Y3QgaF9lcGFzICplcGFzKQogewogCWlmIChlcGFzLT5rZXJuZWwuYWRkcikKLQkJaW91bm1hcChlcGFzLT5rZXJuZWwuYWRkcik7CisJCWlvdW5tYXAoKHZvaWQgX19pb21lbSopKCh1NjQpZXBhcy0+a2VybmVsLmFkZHIgJiBQQUdFX01BU0spKTsKIAogCWVwYXMtPnVzZXIuYWRkciA9IDA7CiAJZXBhcy0+a2VybmVsLmFkZHIgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCmluZGV4IDNlMTg2MjMuLmYxNDNlMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKQEAgLTI2LDYgKzI2LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgImVoZWEuaCIKICNpbmNsdWRlICJlaGVhX3BoeXAuaCIKICNpbmNsdWRlICJlaGVhX3Ftci5oIgpAQCAtMjA5LDExICsyMTAsMTEgQEAKIHsKIAl1NjQgYWRhcHRlcl9oYW5kbGUsIGhyZXQ7CiAKLQlhZGFwdGVyX2hhbmRsZSA9IGNxLT5hZGFwdGVyLT5oYW5kbGU7Ci0KIAlpZiAoIWNxKQogCQlyZXR1cm4gMDsKIAorCWFkYXB0ZXJfaGFuZGxlID0gY3EtPmFkYXB0ZXItPmhhbmRsZTsKKwogCS8qIGRlcmVnaXN0ZXIgYWxsIHByZXZpb3VzIHJlZ2lzdGVyZWQgcGFnZXMgKi8KIAlocmV0ID0gZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlcl9oYW5kbGUsIGNxLT5md19oYW5kbGUpOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewpAQCAtNTEyLDcgKzUxMyw3IEBACiAKIAlzdGFydCA9IEtFUk5FTEJBU0U7CiAJZW5kID0gKHU2NCloaWdoX21lbW9yeTsKLQlucl9wYWdlcyA9IChlbmQgLSBzdGFydCkgLyBQQUdFX1NJWkU7CisJbnJfcGFnZXMgPSAoZW5kIC0gc3RhcnQpIC8gRUhFQV9QQUdFU0laRTsKIAogCXB0ID0gIGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXB0KSB7CkBAIC01MzgsOSArNTM5LDkgQEAKIAkJaWYgKG5yX3BhZ2VzID4gMSkgewogCQkJdTY0IG51bV9wYWdlcyA9IG1pbihucl9wYWdlcywgKHU2NCk1MTIpOwogCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKQotCQkJCXB0W2ldID0gdmlydF90b19hYnMoKHZvaWQqKSgoKHU2NClzdGFydCkKLQkJCQkJCQkgICAgICsgKChrKyspICoKLQkJCQkJCQkJUEFHRV9TSVpFKSkpOworCQkJCXB0W2ldID0gdmlydF90b19hYnMoKHZvaWQqKSgoKHU2NClzdGFydCkgKworCQkJCQkJCSAgICAoKGsrKykgKgorCQkJCQkJCSAgICAgRUhFQV9QQUdFU0laRSkpKTsKIAogCQkJaHJldCA9IGVoZWFfaF9yZWdpc3Rlcl9ycGFnZV9tcihhZGFwdGVyLT5oYW5kbGUsCiAJCQkJCQkJYWRhcHRlci0+bXIuaGFuZGxlLCAwLApAQCAtNTQ4LDggKzU0OSw5IEBACiAJCQkJCQkJbnVtX3BhZ2VzKTsKIAkJCW5yX3BhZ2VzIC09IG51bV9wYWdlczsKIAkJfSBlbHNlIHsKLQkJCXU2NCBhYnNfYWRyID0gdmlydF90b19hYnMoKHZvaWQqKSgoKHU2NClzdGFydCkKLQkJCQkJCQkgICArIChrICogUEFHRV9TSVpFKSkpOworCQkJdTY0IGFic19hZHIgPSB2aXJ0X3RvX2Ficygodm9pZCopKCgodTY0KXN0YXJ0KSArCisJCQkJCQkJICAoayAqIEVIRUFfUEFHRVNJWkUpKSk7CisKIAkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAogCQkJCQkJCWFkYXB0ZXItPm1yLmhhbmRsZSwgMCwKIAkJCQkJCQkwLCBhYnNfYWRyLDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXMzMjEwLmMgYi9kcml2ZXJzL25ldC9lczMyMTAuYwppbmRleCBmZDdiMzJhLi4yZDJlYTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lczMyMTAuYworKysgYi9kcml2ZXJzL25ldC9lczMyMTAuYwpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKIH0KIAotdm9pZAordm9pZCBfX2V4aXQKIGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHRoaXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoMTZpLmMgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwppbmRleCBiN2I4YmMyLi45MzI4M2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGgxNmkuYworKysgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwpAQCAtMTQ3NSw3ICsxNDc1LDcgQEAKIAlyZXR1cm4gLUVOWElPOwogfQogCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit2b2lkIF9fZXhpdCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCB0aGlzX2RldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCBjNWVkNjM1Li40MzlmNDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMTEwLDYgKzExMCw4IEBACiAgKgkwLjU1OiAyMiBNYXIgMjAwNjogQWRkIGZsb3cgY29udHJvbCAocGF1c2UgZnJhbWUpLgogICoJMC41NjogMjIgTWFyIDIwMDY6IEFkZGl0aW9uYWwgZXRodG9vbCBjb25maWcgYW5kIG1vZHVsZXBhcmFtIHN1cHBvcnQuCiAgKgkwLjU3OiAxNCBNYXkgMjAwNjogTWFjIGFkZHJlc3Mgc2V0IGluIHByb2JlL3JlbW92ZSBhbmQgb3JkZXIgY29ycmVjdGlvbnMuCisgKgkwLjU4OiAzMCBPY3QgMjAwNjogQWRkZWQgc3VwcG9ydCBmb3Igc2lkZWJhbmQgbWFuYWdlbWVudCB1bml0LgorICoJMC41OTogMzAgT2N0IDIwMDY6IEFkZGVkIHN1cHBvcnQgZm9yIHJlY292ZXJhYmxlIGVycm9yLgogICoKICAqIEtub3duIGJ1Z3M6CiAgKiBXZSBzdXNwZWN0IHRoYXQgb24gc29tZSBoYXJkd2FyZSBubyBUWCBkb25lIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZC4KQEAgLTEyNiw3ICsxMjgsNyBAQAogI2Vsc2UKICNkZWZpbmUgRFJJVkVSTkFQSQogI2VuZGlmCi0jZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC41NyIKKyNkZWZpbmUgRk9SQ0VERVRIX1ZFUlNJT04JCSIwLjU5IgogI2RlZmluZSBEUlZfTkFNRQkJCSJmb3JjZWRldGgiCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTE3NCwxMSArMTc2LDEyIEBACiAjZGVmaW5lIERFVl9IQVNfUEFVU0VGUkFNRV9UWCAgIDB4MDIwMCAgLyogZGV2aWNlIHN1cHBvcnRzIHR4IHBhdXNlIGZyYW1lcyAqLwogI2RlZmluZSBERVZfSEFTX1NUQVRJU1RJQ1MgICAgICAweDA0MDAgIC8qIGRldmljZSBzdXBwb3J0cyBodyBzdGF0aXN0aWNzICovCiAjZGVmaW5lIERFVl9IQVNfVEVTVF9FWFRFTkRFRCAgIDB4MDgwMCAgLyogZGV2aWNlIHN1cHBvcnRzIGV4dGVuZGVkIGRpYWdub3N0aWMgdGVzdCAqLworI2RlZmluZSBERVZfSEFTX01HTVRfVU5JVCAgICAgICAweDEwMDAgIC8qIGRldmljZSBzdXBwb3J0cyBtYW5hZ2VtZW50IHVuaXQgKi8KIAogZW51bSB7CiAJTnZSZWdJcnFTdGF0dXMgPSAweDAwMCwKICNkZWZpbmUgTlZSRUdfSVJRU1RBVF9NSUlFVkVOVAkweDA0MAotI2RlZmluZSBOVlJFR19JUlFTVEFUX01BU0sJCTB4MWZmCisjZGVmaW5lIE5WUkVHX0lSUVNUQVRfTUFTSwkJMHg4MWZmCiAJTnZSZWdJcnFNYXNrID0gMHgwMDQsCiAjZGVmaW5lIE5WUkVHX0lSUV9SWF9FUlJPUgkJMHgwMDAxCiAjZGVmaW5lIE5WUkVHX0lSUV9SWAkJCTB4MDAwMgpAQCAtMTg5LDE1ICsxOTIsMTYgQEAKICNkZWZpbmUgTlZSRUdfSVJRX0xJTksJCQkweDAwNDAKICNkZWZpbmUgTlZSRUdfSVJRX1JYX0ZPUkNFRAkJMHgwMDgwCiAjZGVmaW5lIE5WUkVHX0lSUV9UWF9GT1JDRUQJCTB4MDEwMAorI2RlZmluZSBOVlJFR19JUlFfUkVDT1ZFUl9FUlJPUgkJMHg4MDAwCiAjZGVmaW5lIE5WUkVHX0lSUU1BU0tfVEhST1VHSFBVVAkweDAwZGYKICNkZWZpbmUgTlZSRUdfSVJRTUFTS19DUFUJCTB4MDA0MAogI2RlZmluZSBOVlJFR19JUlFfVFhfQUxMCQkoTlZSRUdfSVJRX1RYX0VSUnxOVlJFR19JUlFfVFhfT0t8TlZSRUdfSVJRX1RYX0ZPUkNFRCkKICNkZWZpbmUgTlZSRUdfSVJRX1JYX0FMTAkJKE5WUkVHX0lSUV9SWF9FUlJPUnxOVlJFR19JUlFfUlh8TlZSRUdfSVJRX1JYX05PQlVGfE5WUkVHX0lSUV9SWF9GT1JDRUQpCi0jZGVmaW5lIE5WUkVHX0lSUV9PVEhFUgkJCShOVlJFR19JUlFfVElNRVJ8TlZSRUdfSVJRX0xJTkspCisjZGVmaW5lIE5WUkVHX0lSUV9PVEhFUgkJCShOVlJFR19JUlFfVElNRVJ8TlZSRUdfSVJRX0xJTkt8TlZSRUdfSVJRX1JFQ09WRVJfRVJST1IpCiAKICNkZWZpbmUgTlZSRUdfSVJRX1VOS05PV04JKH4oTlZSRUdfSVJRX1JYX0VSUk9SfE5WUkVHX0lSUV9SWHxOVlJFR19JUlFfUlhfTk9CVUZ8TlZSRUdfSVJRX1RYX0VSUnwgXAogCQkJCQlOVlJFR19JUlFfVFhfT0t8TlZSRUdfSVJRX1RJTUVSfE5WUkVHX0lSUV9MSU5LfE5WUkVHX0lSUV9SWF9GT1JDRUR8IFwKLQkJCQkJTlZSRUdfSVJRX1RYX0ZPUkNFRCkpCisJCQkJCU5WUkVHX0lSUV9UWF9GT1JDRUR8TlZSRUdfSVJRX1JFQ09WRVJfRVJST1IpKQogCiAJTnZSZWdVbmtub3duU2V0dXBSZWc2ID0gMHgwMDgsCiAjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNl9WQUwJCTMKQEAgLTIyMiw2ICsyMjYsMTUgQEAKICNkZWZpbmUgTlZSRUdfTUFDX1JFU0VUX0FTU0VSVAkweDBGMwogCU52UmVnVHJhbnNtaXR0ZXJDb250cm9sID0gMHgwODQsCiAjZGVmaW5lIE5WUkVHX1hNSVRDVExfU1RBUlQJMHgwMQorI2RlZmluZSBOVlJFR19YTUlUQ1RMX01HTVRfU1QJMHg0MDAwMDAwMAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX1NZTkNfTUFTSwkJMHgwMDBmMDAwMAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX1NZTkNfTk9UX1JFQURZCTB4MAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX1NZTkNfUEhZX0lOSVQJMHgwMDA0MDAwMAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX01HTVRfU0VNQV9NQVNLCTB4MDAwMDBmMDAKKyNkZWZpbmUgTlZSRUdfWE1JVENUTF9NR01UX1NFTUFfRlJFRQkweDAKKyNkZWZpbmUgTlZSRUdfWE1JVENUTF9IT1NUX1NFTUFfTUFTSwkweDAwMDBmMDAwCisjZGVmaW5lIE5WUkVHX1hNSVRDVExfSE9TVF9TRU1BX0FDUQkweDAwMDBmMDAwCisjZGVmaW5lIE5WUkVHX1hNSVRDVExfSE9TVF9MT0FERUQJMHgwMDAwNDAwMAogCU52UmVnVHJhbnNtaXR0ZXJTdGF0dXMgPSAweDA4OCwKICNkZWZpbmUgTlZSRUdfWE1JVFNUQVRfQlVTWQkweDAxCiAKQEAgLTMwNCw4ICszMTcsOCBAQAogI2RlZmluZSBOVlJFR19NSUlTVEFUX0xJTktDSEFOR0UJMHgwMDA4CiAjZGVmaW5lIE5WUkVHX01JSVNUQVRfTUFTSwkJMHgwMDBmCiAjZGVmaW5lIE5WUkVHX01JSVNUQVRfTUFTSzIJCTB4MDAwZgotCU52UmVnVW5rbm93blNldHVwUmVnNCA9IDB4MTg0LAotI2RlZmluZSBOVlJFR19VTktTRVRVUDRfVkFMCTgKKwlOdlJlZ01JSU1hc2sgPSAweDE4NCwKKyNkZWZpbmUgTlZSRUdfTUlJX0xJTktDSEFOR0UJCTB4MDAwOAogCiAJTnZSZWdBZGFwdGVyQ29udHJvbCA9IDB4MTg4LAogI2RlZmluZSBOVlJFR19BREFQVENUTF9TVEFSVAkweDAyCkBAIC03MDcsNiArNzIwLDcgQEAKIAl1bnNpZ25lZCBpbnQgcGh5X21vZGVsOwogCXUxNiBnaWdhYml0OwogCWludCBpbnRyX3Rlc3Q7CisJaW50IHJlY292ZXJfZXJyb3I7CiAKIAkvKiBHZW5lcmFsIGRhdGE6IFJPIGZpZWxkcyAqLwogCWRtYV9hZGRyX3QgcmluZ19hZGRyOwpAQCAtNzE5LDYgKzczMyw3IEBACiAJdTMyIGRyaXZlcl9kYXRhOwogCXUzMiByZWdpc3Rlcl9zaXplOwogCWludCByeF9jc3VtOworCXUzMiBtYWNfaW5fdXNlOwogCiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCkBAIC0yNDQzLDYgKzI0NTgsMjMgQEAKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZWQgaXJxIHdpdGggdW5rbm93biBldmVudHMgMHgleC4gUGxlYXNlIHJlcG9ydFxuIiwKIAkJCQkJCWRldi0+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+aW50ZXJydXB0VHJhbnNtaXQpOworCX0KK30KKyNlbmRpZgorCiAvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIGRldmljZXMgd2l0aCBvbmUgaW50ZXJydXB0ICovCiBzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5oIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5oCmluZGV4IDllODFhNTAuLjM5ZTllMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuaAorKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmgKQEAgLTE2MCw3ICsxNjAsMTAgQEAKIAogI2RlZmluZSBFQ05UUkxfSU5JVF9TRVRUSU5HUwkweDAwMDAxMDAwCiAjZGVmaW5lIEVDTlRSTF9UQklfTU9ERSAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUNOVFJMX1JFRFVDRURfTU9ERQkweDAwMDAwMDEwCiAjZGVmaW5lIEVDTlRSTF9SMTAwCQkweDAwMDAwMDA4CisjZGVmaW5lIEVDTlRSTF9SRURVQ0VEX01JSV9NT0RFCTB4MDAwMDAwMDQKKyNkZWZpbmUgRUNOVFJMX1NHTUlJX01PREUJMHgwMDAwMDAwMgogCiAjZGVmaW5lIE1SQkxSX0lOSVRfU0VUVElOR1MJREVGQVVMVF9SWF9CVUZGRVJfU0laRQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwppbmRleCA4NmIzYmI5Li43NjBkMDRhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCkBAIC0zMjUsMTEgKzMyNSw2IEBACiAKIHN0YXRpYyB2b2lkIHNwX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RhdGljIGNoYXIgYXgyNV9iY2FzdFtBWDI1X0FERFJfTEVOXSA9Ci0JCXsnUSc8PDEsJ1MnPDwxLCdUJzw8MSwnICc8PDEsJyAnPDwxLCcgJzw8MSwnMCc8PDF9OwotCXN0YXRpYyBjaGFyIGF4MjVfdGVzdFtBWDI1X0FERFJfTEVOXSA9Ci0JCXsnTCc8PDEsJ0knPDwxLCdOJzw8MSwnVSc8PDEsJ1gnPDwxLCcgJzw8MSwnMSc8PDF9OwotCiAJLyogRmluaXNoIHNldHRpbmcgdXAgdGhlIERFVklDRSBpbmZvLiAqLwogCWRldi0+bXR1CQk9IFNJWFBfTVRVOwogCWRldi0+aGFyZF9zdGFydF94bWl0CT0gc3BfeG1pdDsKQEAgLTM0Nyw4ICszNDIsOCBAQAogCWRldi0+dHhfdGltZW91dAkJPSBOVUxMOwogCiAJLyogT25seSBhY3RpdmF0ZWQgaW4gQVguMjUgbW9kZSAqLwotCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7Ci0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGF4MjVfdGVzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZheDI1X2RlZmFkZHIsIEFYMjVfQUREUl9MRU4pOwogCiAJU0VUX01PRFVMRV9PV05FUihkZXYpOwogCkBAIC05MTQsNyArOTA5LDcgQEAKIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIjZwYWNrOiBwcm90b2NvbCB2aW9sYXRpb25cbiIpOwogCQkJCWVsc2UKIAkJCQkJc3AtPnN0YXR1cyA9IDA7Ci0JCQkJY21kICY9ICFTSVhQX1JYX0RDRF9NQVNLOworCQkJCWNtZCAmPSB+U0lYUF9SWF9EQ0RfTUFTSzsKIAkJfQogCQlzcC0+c3RhdHVzID0gY21kICYgU0lYUF9QUklPX0RBVEFfTUFTSzsKIAl9IGVsc2UgeyAvKiBvdXRwdXQgd2F0Y2hkb2cgY2hhciBpZiBpZGxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fZXBwLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fZXBwLmMKaW5kZXggMWVkOWNjYy4uMTUzYjZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX2VwcC5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9lcHAuYwpAQCAtMTY4LDggKzE2OCw5IEBACiAJaW50IG1hZ2ljOwogCiAgICAgICAgIHN0cnVjdCBwYXJkZXZpY2UgKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBpbnQgd29ya19ydW5uaW5nOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBydW5fd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHJ1bl93b3JrOwogCXVuc2lnbmVkIGludCBtb2RlbTsKIAl1bnNpZ25lZCBpbnQgYml0cmF0ZTsKIAl1bnNpZ25lZCBjaGFyIHN0YXQ7CkBAIC02NTksMTYgKzY2MCwxOCBAQAogI2RlZmluZSBHRVRUSUNLKHgpCiAjZW5kaWYgLyogX19pMzg2X18gKi8KIAotc3RhdGljIHZvaWQgZXBwX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBlcHBfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CiAJc3RydWN0IHBhcnBvcnQgKnBwOwogCXVuc2lnbmVkIGNoYXIgc3RhdDsKIAl1bnNpZ25lZCBjaGFyIHRtcFsyXTsKIAl1bnNpZ25lZCBpbnQgdGltZTEgPSAwLCB0aW1lMiA9IDAsIHRpbWUzID0gMDsKIAlpbnQgY250LCBjbnQyOwotCQotCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWJjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiYXljb21fc3RhdGUsIHJ1bl93b3JrLndvcmspOworCWRldiA9IGJjLT5kZXY7CiAJaWYgKCFiYy0+d29ya19ydW5uaW5nKQogCQlyZXR1cm47CiAJYmF5Y29tX2ludF9mcmVxKGJjKTsKQEAgLTg4OSw3ICs4OTIsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgICAgIH0KICAgICAgICAgZGV2LT5pcnEgPSAvKnBwLT5pcnEqLyAwOwotCUlOSVRfV09SSygmYmMtPnJ1bl93b3JrLCAodm9pZCAqKSh2b2lkICopZXBwX2JoLCBkZXYpOworCUlOSVRfREVMQVlFRF9XT1JLKCZiYy0+cnVuX3dvcmssIGVwcF9iaCk7CiAJYmMtPndvcmtfcnVubmluZyA9IDE7CiAJYmMtPm1vZGVtID0gRVBQX0NPTlZFTlRJT05BTDsKIAlpZiAoZXBwY29uZmlnKGJjKSkKQEAgLTExMzgsMTIgKzExNDEsNiBAQAogICovCiBzdGF0aWMgdm9pZCBiYXljb21fcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdGF0aWMgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0gewotCQknUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMQotCX07Ci0Jc3RhdGljIGNoYXIgYXgyNV9ub2NhbGxbQVgyNV9BRERSX0xFTl0gPSB7Ci0JCSdMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsICcxJyA8PCAxCi0JfTsKIAljb25zdCBzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3BhcmFtcyBkZmx0X2NoX3BhcmFtcyA9IHsgCiAJCTIwLCAyLCAxMCwgNDAsIDAgCiAJfTsKQEAgLTExNzksOCArMTE3Niw4IEBACiAJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBBWDI1X01BWF9IRUFERVJfTEVOICsgQVgyNV9CUFFfSEVBREVSX0xFTjsKIAlkZXYtPm10dSA9IEFYMjVfREVGX1BBQ0xFTjsgICAgICAgIC8qIGV0aF9tdHUgaXMgdGhlIGRlZmF1bHQgKi8KIAlkZXYtPmFkZHJfbGVuID0gQVgyNV9BRERSX0xFTjsgICAgIC8qIHNpemVvZiBhbiBheC4yNSBhZGRyZXNzICovCi0JbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYXgyNV9ub2NhbGwsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgJmF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCAmbnVsbF9heDI1X2FkZHJlc3MsIEFYMjVfQUREUl9MRU4pOwogCWRldi0+dHhfcXVldWVfbGVuID0gMTY7CiAKIAkvKiBOZXcgc3R5bGUgZmxhZ3MgKi8KQEAgLTEyMTMsNiArMTIxMCw3IEBACiAJLyoKIAkgKiBpbml0aWFsaXplIHBhcnQgb2YgdGhlIGJheWNvbV9zdGF0ZSBzdHJ1Y3QKIAkgKi8KKwliYy0+ZGV2ID0gZGV2OwogCWJjLT5tYWdpYyA9IEJBWUNPTV9NQUdJQzsKIAliYy0+Y2ZnLmZjbGsgPSAxOTY2NjYwMDsKIAliYy0+Y2ZnLmJwcyA9IDk2MDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYwppbmRleCA4ODlmMzM4Li41Yjc4OGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKQEAgLTg4LDExICs4OCw2IEBACiAKIHN0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIkFYLjI1OiBicHFldGhlciBkcml2ZXIgdmVyc2lvbiAwMDRcbiI7CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGF4MjVfYmNhc3RbQVgyNV9BRERSX0xFTl0gPQotCXsnUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBheDI1X2RlZmFkZHJbQVgyNV9BRERSX0xFTl0gPQotCXsnTCcgPDwgMSwgJ0knIDw8IDEsICdOJyA8PCAxLCAnVScgPDwgMSwgJ1gnIDw8IDEsICcgJyA8PCAxLCAnMScgPDwgMX07Ci0KIHN0YXRpYyBjaGFyIGJjYXN0X2FkZHJbNl09ezB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGfTsKIAogc3RhdGljIGNoYXIgYnBxX2V0aF9hZGRyWzZdOwpAQCAtNDg3LDggKzQ4Miw4IEBACiAJZGV2LT5kb19pb2N0bAkgICAgID0gYnBxX2lvY3RsOwogCWRldi0+ZGVzdHJ1Y3RvcgkgICAgID0gZnJlZV9uZXRkZXY7CiAKLQltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOwotCW1lbWNweShkZXYtPmRldl9hZGRyLCAgYXgyNV9kZWZhZGRyLCBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsICZheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgICZheDI1X2RlZmFkZHIsIEFYMjVfQUREUl9MRU4pOwogCiAJZGV2LT5mbGFncyAgICAgID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vZG1hc2NjLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9kbWFzY2MuYwppbmRleCAwZjhiOWFmLi4wZmJiNDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9kbWFzY2MuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9kbWFzY2MuYwpAQCAtMjUyLDcgKzI1Miw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIHZvaWQgcnhfaXNyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CiBzdGF0aWMgdm9pZCBzcGVjaWFsX2NvbmRpdGlvbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByYyk7Ci1zdGF0aWMgdm9pZCByeF9iaCh2b2lkICphcmcpOworc3RhdGljIHZvaWQgcnhfYmgoc3RydWN0IHdvcmtfc3RydWN0ICopOwogc3RhdGljIHZvaWQgdHhfaXNyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CiBzdGF0aWMgdm9pZCBlc19pc3Ioc3RydWN0IHNjY19wcml2ICpwcml2KTsKIHN0YXRpYyB2b2lkIHRtX2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOwpAQCAtMjY0LDEyICsyNjQsNiBAQAogCiAvKiBCZXdhcmUhIGh3W10gaXMgYWxzbyB1c2VkIGluIGNsZWFudXBfbW9kdWxlKCkuICovCiBzdGF0aWMgc3RydWN0IHNjY19oYXJkd2FyZSBod1tOVU1fVFlQRVNdIF9faW5pdGRhdGFfb3JfbW9kdWxlID0gSEFSRFdBUkU7Ci1zdGF0aWMgY2hhciBheDI1X2Jyb2FkY2FzdFs3XSBfX2luaXRkYXRhID0KLSAgICB7ICdRJyA8PCAxLCAnUycgPDwgMSwgJ1QnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsCi0nMCcgPDwgMSB9Owotc3RhdGljIGNoYXIgYXgyNV90ZXN0WzddIF9faW5pdGRhdGEgPQotICAgIHsgJ0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwKLScxJyA8PCAxIH07CiAKIAogLyogR2xvYmFsIHZhcmlhYmxlcyAqLwpAQCAtNDQzLDggKzQzNyw4IEBACiAJZGV2LT5tdHUgPSAxNTAwOwogCWRldi0+YWRkcl9sZW4gPSBBWDI1X0FERFJfTEVOOwogCWRldi0+dHhfcXVldWVfbGVuID0gNjQ7Ci0JbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2Jyb2FkY2FzdCwgQVgyNV9BRERSX0xFTik7Ci0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGF4MjVfdGVzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZheDI1X2RlZmFkZHIsIEFYMjVfQUREUl9MRU4pOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZGFwdGVyKGludCBjYXJkX2Jhc2UsIGludCB0eXBlLCBpbnQgbikKQEAgLTU3OSw3ICs1NzMsNyBAQAogCQlwcml2LT5wYXJhbS5jbG9ja3MgPSBUQ1RSeENQIHwgUkNSVHhDUDsKIAkJcHJpdi0+cGFyYW0ucGVyc2lzdCA9IDI1NjsKIAkJcHJpdi0+cGFyYW0uZG1hID0gLTE7Ci0JCUlOSVRfV09SSygmcHJpdi0+cnhfd29yaywgcnhfYmgsIHByaXYpOworCQlJTklUX1dPUksoJnByaXYtPnJ4X3dvcmssIHJ4X2JoKTsKIAkJZGV2LT5wcml2ID0gcHJpdjsKIAkJc3ByaW50ZihkZXYtPm5hbWUsICJkbWFzY2MlaSIsIDIgKiBuICsgaSk7CiAJCWRldi0+YmFzZV9hZGRyID0gY2FyZF9iYXNlOwpAQCAtMTI3Miw5ICsxMjY2LDkgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCByeF9iaCh2b2lkICphcmcpCitzdGF0aWMgdm9pZCByeF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVnbGlfYXBpKQogewotCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGFyZzsKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YodWdsaV9hcGksIHN0cnVjdCBzY2NfcHJpdiwgcnhfd29yayk7CiAJaW50IGkgPSBwcml2LT5yeF90YWlsOwogCWludCBjYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jCmluZGV4IGRhY2M3NjguLjQ1Mjg3M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2hkbGNkcnYuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMKQEAgLTYzLDE4ICs2Myw2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKgotICogVGhlIG5hbWUgb2YgdGhlIGNhcmQuIElzIHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBpbiB0aGUgcmVxdWVzdHMgZm9yCi0gKiBpbyByZWdpb25zLCBpcnFzIGFuZCBkbWEgY2hhbm5lbHMKLSAqLwotCi1zdGF0aWMgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0KLXsnUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMX07Ci1zdGF0aWMgY2hhciBheDI1X25vY2FsbFtBWDI1X0FERFJfTEVOXSA9Ci17J0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwgJzEnIDw8IDF9OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogI2RlZmluZSBLSVNTX1ZFUkJPU0UKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03MDksOCArNjk3LDggQEAKIAlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEFYMjVfTUFYX0hFQURFUl9MRU4gKyBBWDI1X0JQUV9IRUFERVJfTEVOOwogCWRldi0+bXR1ID0gQVgyNV9ERUZfUEFDTEVOOyAgICAgICAgLyogZXRoX210dSBpcyB0aGUgZGVmYXVsdCAqLwogCWRldi0+YWRkcl9sZW4gPSBBWDI1X0FERFJfTEVOOyAgICAgLyogc2l6ZW9mIGFuIGF4LjI1IGFkZHJlc3MgKi8KLQltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOwotCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X25vY2FsbCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZheDI1X2RlZmFkZHIsIEFYMjVfQUREUl9MRU4pOwogCWRldi0+dHhfcXVldWVfbGVuID0gMTY7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5jCmluZGV4IGQ4NzE1YjIuLmQwOGZiYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYwpAQCAtNjcyLDExICs2NzIsNiBAQAogCiBzdGF0aWMgdm9pZCBheF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0YXRpYyBjaGFyIGF4MjVfYmNhc3RbQVgyNV9BRERSX0xFTl0gPQotCQl7J1EnPDwxLCdTJzw8MSwnVCc8PDEsJyAnPDwxLCcgJzw8MSwnICc8PDEsJzAnPDwxfTsKLQlzdGF0aWMgY2hhciBheDI1X3Rlc3RbQVgyNV9BRERSX0xFTl0gPQotCQl7J0wnPDwxLCdJJzw8MSwnTic8PDEsJ1UnPDwxLCdYJzw8MSwnICc8PDEsJzEnPDwxfTsKLQogCS8qIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBERVZJQ0UgaW5mby4gKi8KIAlkZXYtPm10dSAgICAgICAgICAgICA9IEFYX01UVTsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGF4X3htaXQ7CkBAIC02OTEsOCArNjg2LDggQEAKIAlkZXYtPmhhcmRfaGVhZGVyICAgICA9IGF4X2hlYWRlcjsKIAlkZXYtPnJlYnVpbGRfaGVhZGVyICA9IGF4X3JlYnVpbGRfaGVhZGVyOwogCi0JbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgIGF4MjVfdGVzdCwgIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgJmF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCAgJmF4MjVfZGVmYWRkciwgIEFYMjVfQUREUl9MRU4pOwogCiAJZGV2LT5mbGFncyAgICAgID0gSUZGX0JST0FEQ0FTVCB8IElGRl9NVUxUSUNBU1Q7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jCmluZGV4IGVjOWI2ZDkuLjJjZTA0N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jCkBAIC0xNTQwLDExICsxNTQwLDYgQEAKIC8qICoJCQkgICAgTmV0d29yayBkcml2ZXIgbWV0aG9kcwkJICAgICAgKiAqLwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXgyNV9iY2FzdFtBWDI1X0FERFJfTEVOXSA9Ci17J1EnIDw8IDEsICdTJyA8PCAxLCAnVCcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJzAnIDw8IDF9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXgyNV9ub2NhbGxbQVgyNV9BRERSX0xFTl0gPQoteydMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsICcxJyA8PCAxfTsKLQogLyogLS0tLT4gSW5pdGlhbGl6ZSBkZXZpY2UgPC0tLS0tICovCiAKIHN0YXRpYyB2b2lkIHNjY19uZXRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE1NjIsOCArMTU1Nyw4IEBACiAJZGV2LT5kb19pb2N0bCAgICAgICAgPSBzY2NfbmV0X2lvY3RsOwogCWRldi0+dHhfdGltZW91dCAgICAgID0gTlVMTDsKIAotCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgIEFYMjVfQUREUl9MRU4pOwotCW1lbWNweShkZXYtPmRldl9hZGRyLCAgYXgyNV9ub2NhbGwsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgJmF4MjVfYmNhc3QsICBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgICZheDI1X2RlZmFkZHIsIEFYMjVfQUREUl9MRU4pOwogIAogCWRldi0+ZmxhZ3MgICAgICA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKaW5kZXggM2M0NDU1Yi4uNmQ3NGYwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKQEAgLTE1NiwxMSArMTU2LDYgQEAKIAogc3RhdGljIHN0cnVjdCB5YW1fbWNzICp5YW1fZGF0YTsKIAotc3RhdGljIGNoYXIgYXgyNV9iY2FzdFs3XSA9Ci17J1EnIDw8IDEsICdTJyA8PCAxLCAnVCcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJzAnIDw8IDF9Owotc3RhdGljIGNoYXIgYXgyNV90ZXN0WzddID0KLXsnTCcgPDwgMSwgJ0knIDw8IDEsICdOJyA8PCAxLCAnVScgPDwgMSwgJ1gnIDw8IDEsICcgJyA8PCAxLCAnMScgPDwgMX07Ci0KIHN0YXRpYyBERUZJTkVfVElNRVIoeWFtX3RpbWVyLCBOVUxMLCAwLCAwKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMTE1LDggKzExMTAsOCBAQAogCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gQVgyNV9NQVhfSEVBREVSX0xFTjsKIAlkZXYtPm10dSA9IEFYMjVfTVRVOwogCWRldi0+YWRkcl9sZW4gPSBBWDI1X0FERFJfTEVOOwotCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7Ci0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGF4MjVfdGVzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZheDI1X2RlZmFkZHIsIEFYMjVfQUREUl9MRU4pOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB5YW1faW5pdF9kcml2ZXIodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwLXBsdXMuYyBiL2RyaXZlcnMvbmV0L2hwLXBsdXMuYwppbmRleCA2YWJjZmQyLi45OWEzNmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ocC1wbHVzLmMKKysrIGIvZHJpdmVycy9uZXQvaHAtcGx1cy5jCkBAIC00ODIsNyArNDgyLDcgQEAKIAlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQsIEhQX0lPX0VYVEVOVCk7CiB9CiAKLXZvaWQKK3ZvaWQgX19leGl0CiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCB0aGlzX2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwLmMgYi9kcml2ZXJzL25ldC9ocC5jCmluZGV4IDI5NDcwOTcuLjYzNWIxM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwLmMKKysrIGIvZHJpdmVycy9uZXQvaHAuYwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VULCBIUF9JT19FWFRFTlQpOwogfQogCi12b2lkCit2b2lkIF9fZXhpdAogY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgdGhpc19kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocGxhbmNlLmMgYi9kcml2ZXJzL25ldC9ocGxhbmNlLmMKaW5kZXggOWM2NDNmMi4uYzk5MWNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHBsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2hwbGFuY2UuYwpAQCAtNzcsNiArNzcsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IGVyciA9IC1FTk9NRU07CisJaW50IGk7CiAKIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhwbGFuY2VfcHJpdmF0ZSkpOwogCWlmICghZGV2KQpAQCAtOTMsNiArOTQsMTUgQEAKIAkJZ290byBvdXRfcmVsZWFzZV9tZW1fcmVnaW9uOwogCiAJZGlvX3NldF9kcnZkYXRhKGQsIGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXM7IHNlbGVjdCBjb2RlICVkLCBhZGRyICUyLjJ4IiwgZGV2LT5uYW1lLCBkLT5uYW1lLCBkLT5zY29kZSwgZGV2LT5kZXZfYWRkclswXSk7CisKKwlmb3IgKGk9MTsgaTw2OyBpKyspIHsKKwkJcHJpbnRrKCI6JTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisKKwlwcmludGsoIiwgaXJxICVkXG4iLCBkLT5pcGwpOworCiAJcmV0dXJuIDA7CiAKICBvdXRfcmVsZWFzZV9tZW1fcmVnaW9uOgpAQCAtMTE5LDggKzEyOSw2IEBACiAgICAgICAgIHN0cnVjdCBocGxhbmNlX3ByaXZhdGUgKmxwOwogICAgICAgICBpbnQgaTsKIAotICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogJXM7IHNlbGVjdCBjb2RlICVkLCBhZGRyIiwgZGV2LT5uYW1lLCBkLT5uYW1lLCBkLT5zY29kZSk7Ci0KICAgICAgICAgLyogcmVzZXQgdGhlIGJvYXJkICovCiAgICAgICAgIG91dF84KHZhK0RJT19JRE9GRiwgMHhmZik7CiAgICAgICAgIHVkZWxheSgxMDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyaWJhISBhcmliYSEgdWRlbGF5ISB1ZGVsYXkhICovCkBAIC0xNDMsNyArMTUxLDYgQEAKICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBkZXYtPmRldl9hZGRyW2ldID0gKChpbl84KHZhICsgSFBMQU5DRV9OVlJBTU9GRiArIGkqNCArIDEpICYgMHhGKSA8PCA0KQogICAgICAgICAgICAgICAgICAgICAgICAgfCAoaW5fOCh2YSArIEhQTEFOQ0VfTlZSQU1PRkYgKyBpKjQgKyAzKSAmIDB4Rik7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCIlYyUyLjJ4IiwgaSA9PSAwID8gJyAnIDogJzonLCBkZXYtPmRldl9hZGRyW2ldKTsKICAgICAgICAgfQogCiAgICAgICAgIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE2MCw3ICsxNjcsNiBAQAogICAgICAgICBscC0+bGFuY2UubGFuY2VfbG9nX3R4X2J1ZnMgPSBMQU5DRV9MT0dfVFhfQlVGRkVSUzsKICAgICAgICAgbHAtPmxhbmNlLnJ4X3JpbmdfbW9kX21hc2sgPSBSWF9SSU5HX01PRF9NQVNLOwogICAgICAgICBscC0+bGFuY2UudHhfcmluZ19tb2RfbWFzayA9IFRYX1JJTkdfTU9EX01BU0s7Ci0JcHJpbnRrKCIsIGlycSAlZFxuIiwgbHAtPmxhbmNlLmlycSk7CiB9CiAKIC8qIFRoaXMgaXMgZGlzZ3VzdGluZy4gV2UgaGF2ZSB0byBjaGVjayB0aGUgRElPIHN0YXR1cyByZWdpc3RlciBmb3IgYWNrIGV2ZXJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeWRyYS5jIGIvZHJpdmVycy9uZXQvaHlkcmEuYwppbmRleCA5MTMyNmVhLi5mOTcwYmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeWRyYS5jCisrKyBiL2RyaXZlcnMvbmV0L2h5ZHJhLmMKQEAgLTMxLDcgKzMxLDE2IEBACiAjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KICNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgogCi0jaW5jbHVkZSAiODM5MC5oIgorI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCisjZGVmaW5lIGVpX2luYihwb3J0KSAgIGluXzgocG9ydCkKKyNkZWZpbmUgZWlfb3V0Yih2YWwscG9ydCkgIG91dF84KHBvcnQsdmFsKQorI2RlZmluZSBlaV9pbmJfcChwb3J0KSAgIGluXzgocG9ydCkKKyNkZWZpbmUgZWlfb3V0Yl9wKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisgICAgIjgzOTAuYzp2MS4xMGN2cyA5LzIzLzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlICJsaWI4MzkwLmMiCiAKICNkZWZpbmUgTkVfRU4wX0RDRkcgICAgICgweDBlKjIpCiAKQEAgLTEwMCw3ICsxMDksNyBAQAogCTB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MWEsIDB4MWMsIDB4MWUsCiAgICAgfTsKIAotICAgIGRldiA9IGFsbG9jX2VpX25ldGRldigpOworICAgIGRldiA9IF9fX19hbGxvY19laV9uZXRkZXYoMCk7CiAgICAgaWYgKCFkZXYpCiAJcmV0dXJuIC1FTk9NRU07CiAgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOwpAQCAtMTE3LDcgKzEyNiw3IEBACiAgICAgZGV2LT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CiAKICAgICAvKiBJbnN0YWxsIHRoZSBJbnRlcnJ1cHQgaGFuZGxlciAqLwotICAgIGlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJIeWRyYSBFdGhlcm5ldCIsCisgICAgaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgX19laV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAiSHlkcmEgRXRoZXJuZXQiLAogCQkgICAgZGV2KSkgewogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIC1FQUdBSU47CkBAIC0xMzksMTAgKzE0OCwxMCBAQAogICAgIGRldi0+b3BlbiA9ICZoeWRyYV9vcGVuOwogICAgIGRldi0+c3RvcCA9ICZoeWRyYV9jbG9zZTsKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IF9fZWlfcG9sbDsKICNlbmRpZgogCi0gICAgTlM4MzkwX2luaXQoZGV2LCAwKTsKKyAgICBfX05TODM5MF9pbml0KGRldiwgMCk7CiAKICAgICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKICAgICBpZiAoZXJyKSB7CkBAIC0xNjQsNyArMTczLDcgQEAKIAogc3RhdGljIGludCBoeWRyYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgZWlfb3BlbihkZXYpOworICAgIF9fZWlfb3BlbihkZXYpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xNzIsNyArMTgxLDcgQEAKIHsKICAgICBpZiAoZWlfZGVidWcgPiAxKQogCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOwotICAgIGVpX2Nsb3NlKGRldik7CisgICAgX19laV9jbG9zZShkZXYpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19tYWwuaCBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX21hbC5oCmluZGV4IGY3M2YxMGEuLjQwN2QyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX21hbC5oCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX21hbC5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGNyLmg+CiAKIC8qCiAgKiBUaGVzZSBNQUwgInZlcnNpb25zIiBwcm9iYWJseSBhcmVuJ3QgdGhlIHJlYWwgdmVyc2lvbnMgSUJNIHVzZXMgZm9yIHRoZXNlIApAQCAtMTkxLDYgKzE5Miw3IEBACiAKIHN0cnVjdCBpYm1fb2NwX21hbCB7CiAJaW50CQkJZGNyYmFzZTsKKwlkY3JfaG9zdF90CQlkY3Job3N0OwogCiAJc3RydWN0IGxpc3RfaGVhZAlwb2xsX2xpc3Q7CiAJc3RydWN0IG5ldF9kZXZpY2UJcG9sbF9kZXY7CkBAIC0yMDcsMTIgKzIwOSwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHUzMiBnZXRfbWFsX2Rjcm4oc3RydWN0IGlibV9vY3BfbWFsICptYWwsIGludCByZWcpCiB7Ci0JcmV0dXJuIG1mZGNyKG1hbC0+ZGNyYmFzZSArIHJlZyk7CisJcmV0dXJuIGRjcl9yZWFkKG1hbC0+ZGNyaG9zdCwgbWFsLT5kY3JiYXNlICsgcmVnKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9tYWxfZGNybihzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCwgaW50IHJlZywgdTMyIHZhbCkKIHsKLQltdGRjcihtYWwtPmRjcmJhc2UgKyByZWcsIHZhbCk7CisJZGNyX3dyaXRlKG1hbC0+ZGNyaG9zdCwgbWFsLT5kY3JiYXNlICsgcmVnLCB2YWwpOwogfQogCiAvKiBSZWdpc3RlciBNQUwgZGV2aWNlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtdmV0aC5jIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5jCmluZGV4IDI4MDJkYjIuLjk5MzQzYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libXZldGguYworKysgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vdmlvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMjEyLDggKzIxMSw4IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWZyZWVfaW5kZXggPSBwb29sLT5jb25zdW1lcl9pbmRleCsrICUgcG9vbC0+c2l6ZTsKLQkJcG9vbC0+Y29uc3VtZXJfaW5kZXggPSBmcmVlX2luZGV4OworCQlmcmVlX2luZGV4ID0gcG9vbC0+Y29uc3VtZXJfaW5kZXg7CisJCXBvb2wtPmNvbnN1bWVyX2luZGV4ID0gKHBvb2wtPmNvbnN1bWVyX2luZGV4ICsgMSkgJSBwb29sLT5zaXplOwogCQlpbmRleCA9IHBvb2wtPmZyZWVfbWFwW2ZyZWVfaW5kZXhdOwogCiAJCWlibXZldGhfYXNzZXJ0KGluZGV4ICE9IElCTV9WRVRIX0lOVkFMSURfTUFQKTsKQEAgLTMyOSw4ICszMjgsMTAgQEAKIAkJCSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uYnVmZl9zaXplLAogCQkJIERNQV9GUk9NX0RFVklDRSk7CiAKLQlmcmVlX2luZGV4ID0gYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4KysgJSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uc2l6ZTsKLQlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0ucHJvZHVjZXJfaW5kZXggPSBmcmVlX2luZGV4OworCWZyZWVfaW5kZXggPSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0ucHJvZHVjZXJfaW5kZXg7CisJYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4CisJCT0gKGFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFtwb29sXS5wcm9kdWNlcl9pbmRleCArIDEpCisJCSUgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnNpemU7CiAJYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLmZyZWVfbWFwW2ZyZWVfaW5kZXhdID0gaW5kZXg7CiAKIAltYigpOwpAQCAtOTk4LDggKzk5OSw2IEBACiAJYWRhcHRlci0+bWFjX2FkZHIgPSAwOwogCW1lbWNweSgmYWRhcHRlci0+bWFjX2FkZHIsIG1hY19hZGRyX3AsIDYpOwogCi0JYWRhcHRlci0+bGlvYm4gPSBkZXYtPmlvbW11X3RhYmxlLT5pdF9pbmRleDsKLQogCW5ldGRldi0+aXJxID0gZGV2LT5pcnE7CiAJbmV0ZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBpYm12ZXRoX29wZW47CiAJbmV0ZGV2LT5wb2xsICAgICAgICAgICAgICAgPSBpYm12ZXRoX3BvbGw7CkBAIC0xMTEzLDcgKzExMTIsNiBAQAogCXNlcV9wcmludGYoc2VxLCAiJXMgJXNcblxuIiwgaWJtdmV0aF9kcml2ZXJfc3RyaW5nLCBpYm12ZXRoX2RyaXZlcl92ZXJzaW9uKTsKIAogCXNlcV9wcmludGYoc2VxLCAiVW5pdCBBZGRyZXNzOiAgICAweCV4XG4iLCBhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MpOwotCXNlcV9wcmludGYoc2VxLCAiTElPQk46ICAgICAgICAgICAweCVseFxuIiwgYWRhcHRlci0+bGlvYm4pOwogCXNlcV9wcmludGYoc2VxLCAiQ3VycmVudCBNQUM6ICAgICAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKIAkJICAgY3VycmVudF9tYWNbMF0sIGN1cnJlbnRfbWFjWzFdLCBjdXJyZW50X21hY1syXSwKIAkJICAgY3VycmVudF9tYWNbM10sIGN1cnJlbnRfbWFjWzRdLCBjdXJyZW50X21hY1s1XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm12ZXRoLmggYi9kcml2ZXJzL25ldC9pYm12ZXRoLmgKaW5kZXggZjViMjViZi4uYmI2OWNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtdmV0aC5oCisrKyBiL2RyaXZlcnMvbmV0L2libXZldGguaApAQCAtMTE4LDcgKzExOCw2IEBACiAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAgICAgdW5zaWduZWQgaW50IG1jYXN0RmlsdGVyU2l6ZTsKICAgICB1bnNpZ25lZCBsb25nIG1hY19hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgbGlvYm47CiAgICAgdm9pZCAqIGJ1ZmZlcl9saXN0X2FkZHI7CiAgICAgdm9pZCAqIGZpbHRlcl9saXN0X2FkZHI7CiAgICAgZG1hX2FkZHJfdCBidWZmZXJfbGlzdF9kbWE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jIGIvZHJpdmVycy9uZXQvaW9jMy1ldGguYwppbmRleCBlOTYzZGJmLi5mMGQzMGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pb2MzLWV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKQEAgLTU3LDcgKzU3LDYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xMDE3LDcgKzEwMTYsNyBAQAogCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOwogCi0JZGVsX3RpbWVyKCZpcC0+aW9jM190aW1lcik7CQkvKiBLaWxsIGlmIHJ1bm5pbmcJKi8KKwlkZWxfdGltZXJfc3luYygmaXAtPmlvYzNfdGltZXIpOwkvKiBLaWxsIGlmIHJ1bm5pbmcJKi8KIAogCWlvYzNfd19lbWNyKEVNQ1JfUlNUKTsJCQkvKiBSZXNldAkJKi8KIAkodm9pZCkgaW9jM19yX2VtY3IoKTsJCQkvKiBGbHVzaCBXQgkJKi8KQEAgLTEwODEsNyArMTA4MCw3IEBACiB7CiAJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JZGVsX3RpbWVyKCZpcC0+aW9jM190aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmlwLT5pb2MzX3RpbWVyKTsKIAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jCmluZGV4IDE2NjIwYmQuLjExYWYwYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKQEAgLTE2MDMsNyArMTYwMyw3IEBACiAgIGlyZGFfcW9zX2JpdHNfdG9fdmFsdWUgKCZzZWxmLT5xb3MpOwogCiAgIC8qIEFsbG9jYXRlIHR3aWNlIHRoZSBzaXplIHRvIGd1YXJhbnRlZSBhbGlnbm1lbnQgKi8KLSAgc2VsZi0+cmluZ2J1ZiA9ICh2b2lkICopIGttYWxsb2MgKE9CT0VfUklOR19MRU4gPDwgMSwgR0ZQX0tFUk5FTCk7CisgIHNlbGYtPnJpbmdidWYgPSBrbWFsbG9jKE9CT0VfUklOR19MRU4gPDwgMSwgR0ZQX0tFUk5FTCk7CiAgIGlmICghc2VsZi0+cmluZ2J1ZikKICAgICB7CiAgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IGNhbid0IGFsbG9jYXRlIERNQSBidWZmZXJzXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwppbmRleCAxNGJkYTc2Li4zY2ExMDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCkBAIC0xNzQ3LDcgKzE3NDcsNyBAQAogCS8qIERvbid0IGNoYW5nZSB0aGlzIGJ1ZmZlciBzaXplIGFuZCBhbGxvY2F0aW9uIHdpdGhvdXQgZG9pbmcKIAkgKiBzb21lIGhlYXZ5IGFuZCBjb21wbGV0ZSB0ZXN0aW5nLiBEb24ndCBhc2sgd2h5IDotKAogCSAqIEplYW4gSUkgKi8KLQlzZWxmLT5zcGVlZF9idWZmID0gKGNoYXIgKikga21hbGxvYyhJUkRBX1VTQl9TUEVFRF9NVFUsIEdGUF9LRVJORUwpOworCXNlbGYtPnNwZWVkX2J1ZmYgPSBrbWFsbG9jKElSREFfVVNCX1NQRUVEX01UVSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNlbGYtPnNwZWVkX2J1ZmYgPT0gTlVMTCkgCiAJCWdvdG8gZXJyX291dF8zOwogCkBAIC0xNzkzLDEwICsxNzkzLDggQEAKIGVycl9vdXRfMjoKIAl1c2JfZnJlZV91cmIoc2VsZi0+dHhfdXJiKTsKIGVycl9vdXRfMToKLQlmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bWF4X3J4X3VyYjsgaSsrKSB7Ci0JCWlmIChzZWxmLT5yeF91cmJbaV0pCi0JCQl1c2JfZnJlZV91cmIoc2VsZi0+cnhfdXJiW2ldKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IHNlbGYtPm1heF9yeF91cmI7IGkrKykKKwkJdXNiX2ZyZWVfdXJiKHNlbGYtPnJ4X3VyYltpXSk7CiAJZnJlZV9uZXRkZXYobmV0KTsKIGVycl9vdXQ6CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJwb3J0LmMgYi9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5jCmluZGV4IDY1NGE2OGIuLjMwOTg5NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJwb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJCiAJLyogQWxsb2NhdGUgbWVtb3J5IGlmIG5lZWRlZCAqLwogCWlmIChzZWxmLT50eF9idWZmLnRydWVzaXplID4gMCkgewotCQlzZWxmLT50eF9idWZmLmhlYWQgPSAoX191OCAqKSBrbWFsbG9jKHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsIAorCQlzZWxmLT50eF9idWZmLmhlYWQgPSBrbWFsbG9jKHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCiAJCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKIAkJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CiAJCQlJUkRBX0VSUk9SKCIlcygpLCBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2lydHR5LXNpci5jCmluZGV4IDZhOThiN2EuLmFkMTg1NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuYwpAQCAtMTE3LDcgKzExNyw3IEBACiB7CiAJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotICAgICAgICBzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvczsKKyAgICAgICAgc3RydWN0IGt0ZXJtaW9zIG9sZF90ZXJtaW9zOwogCWludCBjZmxhZzsKIAogCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CkBAIC0zMTgsNyArMzE4LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlydHR5X3N0b3BfcmVjZWl2ZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0b3ApCiB7Ci0Jc3RydWN0IHRlcm1pb3Mgb2xkX3Rlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zIG9sZF90ZXJtaW9zOwogCWludCBjZmxhZzsKIAogCWxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCmluZGV4IGIzMmM1MmUuLmYwYzYxZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCkBAIC01NjAsOSArNTYwLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBtY3Nfc3BlZWRfd29yayh2b2lkICphcmcpCitzdGF0aWMgdm9pZCBtY3Nfc3BlZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG1jc19jYiAqbWNzID0gYXJnOworCXN0cnVjdCBtY3NfY2IgKm1jcyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWNzX2NiLCB3b3JrKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gbWNzLT5uZXRkZXY7CiAKIAltY3Nfc3BlZWRfY2hhbmdlKG1jcyk7CkBAIC05MjcsNyArOTI3LDcgQEAKIAlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZtY3MtPnFvcyk7CiAKIAkvKiBTcGVlZCBjaGFuZ2Ugd29yayBpbml0aWFsaXNhdGlvbiovCi0JSU5JVF9XT1JLKCZtY3MtPndvcmssIG1jc19zcGVlZF93b3JrLCBtY3MpOworCUlOSVRfV09SSygmbWNzLT53b3JrLCBtY3Nfc3BlZWRfd29yayk7CiAKIAkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KIAluZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtY3NfaGFyZF94bWl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYwppbmRleCBmOWExYzg4Li45MTM3ZTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYwpAQCAtNzA0LDkgKzcwNCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHhhX2lyZGFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHB4YV9pcmRhX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKF9kZXYpOwogCXN0cnVjdCBweGFfaXJkYSAqc2k7CiAKIAlpZiAoZGV2ICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgewpAQCAtNzE4LDkgKzcxOCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHhhX2lyZGFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKl9kZXYpCitzdGF0aWMgaW50IHB4YV9pcmRhX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKF9kZXYpOwogCXN0cnVjdCBweGFfaXJkYSAqc2k7CiAKIAlpZiAoZGV2ICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgewpAQCAtNzQ2LDkgKzc0Niw4IEBACiAJcmV0dXJuIGlvLT5oZWFkID8gMCA6IC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgcHhhX2lyZGFfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKK3N0YXRpYyBpbnQgcHhhX2lyZGFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKF9kZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHB4YV9pcmRhICpzaTsKIAl1bnNpZ25lZCBpbnQgYmF1ZHJhdGVfbWFzazsKQEAgLTgyMiw5ICs4MjEsOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcHhhX2lyZGFfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCitzdGF0aWMgaW50IHB4YV9pcmRhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKF9kZXYpOwogCiAJaWYgKGRldikgewogCQlzdHJ1Y3QgcHhhX2lyZGEgKnNpID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTg0MCw5ICs4MzksMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHB4YV9pcl9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gInB4YTJ4eC1pciIsCi0JLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGFfaXJfZHJpdmVyID0geworCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJweGEyeHgtaXIiLAorCX0sCiAJLnByb2JlCQk9IHB4YV9pcmRhX3Byb2JlLAogCS5yZW1vdmUJCT0gcHhhX2lyZGFfcmVtb3ZlLAogCS5zdXNwZW5kCT0gcHhhX2lyZGFfc3VzcGVuZCwKQEAgLTg1MSwxMiArODUxLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHB4YV9pcmRhX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZweGFfaXJfZHJpdmVyKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZweGFfaXJfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHB4YV9pcmRhX2V4aXQodm9pZCkKIHsKLQlkcml2ZXJfdW5yZWdpc3RlcigmcHhhX2lyX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB4YV9pcl9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChweGFfaXJkYV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyLWRldi5oIGIvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmgKaW5kZXggOWZhMjk0YS4uMmE1N2JjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogc3RydWN0IHNpcl9mc20gewogCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIHdvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yawl3b3JrOwogCXVuc2lnbmVkCQlzdGF0ZSwgc3Vic3RhdGU7CiAJaW50CQkJcGFyYW07CiAJaW50CQkJcmVzdWx0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYwppbmRleCAzYjU4NTRkLi4xN2IwYzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYwpAQCAtMTAwLDkgKzEwMCw5IEBACiAgKiBCb3RoIG11c3QgYmUgdW5sb2NrZWQvcmVzdGFydGVkIG9uIGNvbXBsZXRpb24gLSBidXQgb25seSBvbiBmaW5hbCBleGl0LgogICovCiAKLXN0YXRpYyB2b2lkIHNpcmRldl9jb25maWdfZnNtKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzaXJkZXZfY29uZmlnX2ZzbShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNpcl9kZXYgKmRldiA9IGRhdGE7CisJc3RydWN0IHNpcl9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2lyX2RldiwgZnNtLndvcmsud29yayk7CiAJc3RydWN0IHNpcl9mc20gKmZzbSA9ICZkZXYtPmZzbTsKIAlpbnQgbmV4dF9zdGF0ZTsKIAlpbnQgcmV0ID0gLTE7CkBAIC0zMDksOCArMzA5LDggQEAKIAlmc20tPnBhcmFtID0gcGFyYW07CiAJZnNtLT5yZXN1bHQgPSAwOwogCi0JSU5JVF9XT1JLKCZmc20tPndvcmssIHNpcmRldl9jb25maWdfZnNtLCBkZXYpOwotCXF1ZXVlX3dvcmsoaXJkYV9zaXJfd3EsICZmc20tPndvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZmc20tPndvcmssIHNpcmRldl9jb25maWdfZnNtKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaXJkYV9zaXJfd3EsICZmc20tPndvcmssIDApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMgYi9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKaW5kZXggYmU4YTY2ZS4uYzE0YTc0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYwpAQCAtMTUsOCArMTUsNyBAQAogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgogKgogKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKQEAgLTUxLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgogI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKaW5kZXggMjI4NGUyYy4uZDZmNGYxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCiBzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gewogCUh2THBJbmRleCByZW1vdGVfbHA7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHN0YXRlbWFjaGluZV93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXRlbWFjaGluZV93cTsKIAlzdHJ1Y3QgdmV0aF9tc2cgKm1zZ3M7CiAJaW50IG51bV9ldmVudHM7CiAJc3RydWN0IHZldGhfY2FwX2RhdGEgbG9jYWxfY2FwczsKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdmV0aF9raWNrX3N0YXRlbWFjaGluZShzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCkKIHsKLQlzY2hlZHVsZV93b3JrKCZjbngtPnN0YXRlbWFjaGluZV93cSk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjbngtPnN0YXRlbWFjaGluZV93cSwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZldGhfdGFrZV9jYXAoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCkBAIC02MzgsOSArNjM4LDExIEBACiB9CiAKIC8qIEZJWE1FOiBUaGUgZ290b3MgaGVyZSBhcmUgYSBiaXQgZHViaW91cyAqLwotc3RhdGljIHZvaWQgdmV0aF9zdGF0ZW1hY2hpbmUodm9pZCAqcCkKK3N0YXRpYyB2b2lkIHZldGhfc3RhdGVtYWNoaW5lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCA9IChzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKilwOworCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiwKKwkJCSAgICAgc3RhdGVtYWNoaW5lX3dxLndvcmspOwogCWludCBybHAgPSBjbngtPnJlbW90ZV9scDsKIAlpbnQgcmM7CiAKQEAgLTgyNyw3ICs4MjksNyBAQAogCiAJY254LT5yZW1vdGVfbHAgPSBybHA7CiAJc3Bpbl9sb2NrX2luaXQoJmNueC0+bG9jayk7Ci0JSU5JVF9XT1JLKCZjbngtPnN0YXRlbWFjaGluZV93cSwgdmV0aF9zdGF0ZW1hY2hpbmUsIGNueCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmNueC0+c3RhdGVtYWNoaW5lX3dxLCB2ZXRoX3N0YXRlbWFjaGluZSk7CiAKIAlpbml0X3RpbWVyKCZjbngtPmFja190aW1lcik7CiAJY254LT5hY2tfdGltZXIuZnVuY3Rpb24gPSB2ZXRoX3RpbWVkX2FjazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCmluZGV4IGUwOWY1NzUuLmU2MjgxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYwpAQCAtMTA2LDcgKzEwNiw3IEBACiBzdGF0aWMgdm9pZCBpeGdiX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIGl4Z2Jfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogc3RhdGljIHZvaWQgaXhnYl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgaXhnYl90eF90aW1lb3V0X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpeGdiX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgaXhnYl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkJICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKTsKIHN0YXRpYyB2b2lkIGl4Z2Jfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CkBAIC00ODksOCArNDg5LDcgQEAKIAlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9ICZpeGdiX3dhdGNoZG9nOwogCWFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylhZGFwdGVyOwogCi0JSU5JVF9XT1JLKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2ssCi0JCSAgKHZvaWQgKCopKHZvaWQgKikpaXhnYl90eF90aW1lb3V0X3Rhc2ssIG5ldGRldik7CisJSU5JVF9XT1JLKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2ssIGl4Z2JfdHhfdGltZW91dF90YXNrKTsKIAogCXN0cmNweShuZXRkZXYtPm5hbWUsICJldGglZCIpOwogCWlmKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KSkpCkBAIC0xMjQ5LDcgKzEyNDgsNyBAQAogCWlmKGxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSkgewogCQlzdHJ1Y3QgaXhnYl9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogCQljc3MgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOwotCQljc28gPSAoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgLSBza2ItPmRhdGE7CisJCWNzbyA9IGNzcyArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAKIAkJaSA9IGFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2U7CiAJCWNvbnRleHRfZGVzYyA9IElYR0JfQ09OVEVYVF9ERVNDKGFkYXB0ZXItPnR4X3JpbmcsIGkpOwpAQCAtMTQ5Myw5ICsxNDkyLDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1peGdiX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoraXhnYl90eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGl4Z2JfYWRhcHRlciwgdHhfdGltZW91dF90YXNrKTsKIAogCWFkYXB0ZXItPnR4X3RpbWVvdXRfY291bnQrKzsKIAlpeGdiX2Rvd24oYWRhcHRlciwgVFJVRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sYW5jZS5jIGIvZHJpdmVycy9uZXQvbGFuY2UuYwppbmRleCA2ZWZiZDQ5Li5hMzg0MzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTM2Nyw3ICszNjgsNyBAQAogCWtmcmVlKGxwKTsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgdGhpc19kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYyBiL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYwppbmRleCBmNGQ4MTViLi5lYTM5MmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMKKysrIGIvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCkBAIC0xMTksMTQgKzExOSwxNCBAQAogI2RlZmluZSBERUIoeCx5KQlpZiAoaTU5Nl9kZWJ1ZyAmICh4KSkgeyB5OyB9CiAKIAotI2RlZmluZSAgQ0hFQ0tfV0JBQ0soYWRkcixsZW4pIFwKLQlkbyB7IGRtYV9jYWNoZV9zeW5jKCh2b2lkICopYWRkciwgbGVuLCBETUFfVE9fREVWSUNFKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgIENIRUNLX1dCQUNLKHByaXYsIGFkZHIsbGVuKSBcCisJZG8geyBkbWFfY2FjaGVfc3luYygocHJpdiktPmRldiwgKHZvaWQgKilhZGRyLCBsZW4sIERNQV9UT19ERVZJQ0UpOyB9IHdoaWxlICgwKQogCi0jZGVmaW5lICBDSEVDS19JTlYoYWRkcixsZW4pIFwKLQlkbyB7IGRtYV9jYWNoZV9zeW5jKCh2b2lkICopYWRkciwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOyB9IHdoaWxlKDApCisjZGVmaW5lICBDSEVDS19JTlYocHJpdiwgYWRkcixsZW4pIFwKKwlkbyB7IGRtYV9jYWNoZV9zeW5jKChwcml2KS0+ZGV2LCAodm9pZCAqKWFkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsgfSB3aGlsZSgwKQogCi0jZGVmaW5lICBDSEVDS19XQkFDS19JTlYoYWRkcixsZW4pIFwKLQlkbyB7IGRtYV9jYWNoZV9zeW5jKCh2b2lkICopYWRkciwgbGVuLCBETUFfQklESVJFQ1RJT05BTCk7IH0gd2hpbGUgKDApCisjZGVmaW5lICBDSEVDS19XQkFDS19JTlYocHJpdiwgYWRkcixsZW4pIFwKKwlkbyB7IGRtYV9jYWNoZV9zeW5jKChwcml2KS0+ZGV2LCAodm9pZCAqKWFkZHIsIGxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOyB9IHdoaWxlICgwKQogCiAKICNkZWZpbmUgUEFfSTgyNTk2X1JFU0VUCQkwCS8qIE9mZnNldHMgcmVsYXRpdmUgdG8gTEFTSS1MQU4tQWRkci4qLwpAQCAtNDQ5LDEwICs0NDksMTAgQEAKIAogc3RhdGljIGlubGluZSBpbnQgd2FpdF9pc3RhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCwgaW50IGRlbGNudCwgY2hhciAqc3RyKQogewotCUNIRUNLX0lOVigmKGxwLT5pc2NwKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X2lzY3ApKTsKKwlDSEVDS19JTlYobHAsICYobHAtPmlzY3ApLCBzaXplb2Yoc3RydWN0IGk1OTZfaXNjcCkpOwogCXdoaWxlICgtLWRlbGNudCAmJiBscC0+aXNjcC5zdGF0KSB7CiAJCXVkZWxheSgxMCk7Ci0JCUNIRUNLX0lOVigmKGxwLT5pc2NwKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X2lzY3ApKTsKKwkJQ0hFQ0tfSU5WKGxwLCAmKGxwLT5pc2NwKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X2lzY3ApKTsKIAl9CiAJaWYgKCFkZWxjbnQpIHsKIAkJcHJpbnRrKCIlczogJXMsIGlzY3Auc3RhdCAlMDR4LCBkaWRuJ3QgY2xlYXJcbiIsCkBAIC00NjYsMTAgKzQ2NiwxMCBAQAogCiBzdGF0aWMgaW5saW5lIGludCB3YWl0X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCwgaW50IGRlbGNudCwgY2hhciAqc3RyKQogewotCUNIRUNLX0lOVigmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisJQ0hFQ0tfSU5WKGxwLCAmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CiAJd2hpbGUgKC0tZGVsY250ICYmIGxwLT5zY2IuY29tbWFuZCkgewogCQl1ZGVsYXkoMTApOwotCQlDSEVDS19JTlYoJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCQlDSEVDS19JTlYobHAsICYobHAtPnNjYiksIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKIAl9CiAJaWYgKCFkZWxjbnQpIHsKIAkJcHJpbnRrKCIlczogJXMsIHN0YXR1cyAlNC40eCwgY21kICU0LjR4LlxuIiwKQEAgLTUyMiw3ICs1MjIsNyBAQAogCQkJcmJkLCByYmQtPmNvdW50LCByYmQtPmJfbmV4dCwgcmJkLT5iX2RhdGEsIHJiZC0+c2l6ZSk7CiAJCXJiZCA9IHJiZC0+dl9uZXh0OwogCX0gd2hpbGUgKHJiZCAhPSBscC0+cmJkX2hlYWQpOwotCUNIRUNLX0lOVihscCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpKTsKKwlDSEVDS19JTlYobHAsIGxwLCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOwogfQogCiAKQEAgLTU5Miw3ICs1OTIsNyBAQAogCXJmZC0+Yl9uZXh0ID0gV1NXQVByZmQodmlydF90b19kbWEobHAsbHAtPnJmZHMpKTsKIAlyZmQtPmNtZCA9IENNRF9FT0x8Q01EX0ZMRVg7CiAKLQlDSEVDS19XQkFDS19JTlYobHAsIHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSk7CisJQ0hFQ0tfV0JBQ0tfSU5WKGxwLCBscCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9yeF9idWZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC02MjksNyArNjI5LDcgQEAKIAlscC0+cmJkX2hlYWQgPSBscC0+cmJkczsKIAlscC0+cmZkc1swXS5yYmQgPSBXU1dBUHJiZCh2aXJ0X3RvX2RtYShscCxscC0+cmJkcykpOwogCi0JQ0hFQ0tfV0JBQ0tfSU5WKGxwLCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOworCUNIRUNLX1dCQUNLX0lOVihscCwgbHAsIHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSk7CiB9CiAKIApAQCAtNjYzLDggKzY2Myw4IEBACiAKIAlERUIoREVCX0lOSVQsIHByaW50aygiJXM6IHN0YXJ0aW5nIGk4MjU5Ni5cbiIsIGRldi0+bmFtZSkpOwogCi0JQ0hFQ0tfV0JBQ0soJihscC0+c2NwKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjcCkpOwotCUNIRUNLX1dCQUNLKCYobHAtPmlzY3ApLCBzaXplb2Yoc3RydWN0IGk1OTZfaXNjcCkpOworCUNIRUNLX1dCQUNLKGxwLCAmKGxwLT5zY3ApLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NwKSk7CisJQ0hFQ0tfV0JBQ0sobHAsICYobHAtPmlzY3ApLCBzaXplb2Yoc3RydWN0IGk1OTZfaXNjcCkpOwogCiAJTVBVX1BPUlQoZGV2LCBQT1JUX0FMVFNDUCwgdmlydF90b19kbWEobHAsJmxwLT5zY3ApKTsKIApAQCAtNjc4LDI1ICs2NzgsMjUgQEAKIAlyZWJ1aWxkX3J4X2J1ZnMoZGV2KTsKIAogCWxwLT5zY2IuY29tbWFuZCA9IDA7Ci0JQ0hFQ0tfV0JBQ0soJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCUNIRUNLX1dCQUNLKGxwLCAmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CiAKIAllbmFibGVfaXJxKGRldi0+aXJxKTsJLyogZW5hYmxlIElSUXMgZnJvbSBMQU4gKi8KIAogCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogcXVldWluZyBDbWRDb25maWd1cmVcbiIsIGRldi0+bmFtZSkpOwogCW1lbWNweShscC0+Y2ZfY21kLmk1OTZfY29uZmlnLCBpbml0X3NldHVwLCAxNCk7CiAJbHAtPmNmX2NtZC5jbWQuY29tbWFuZCA9IENtZENvbmZpZ3VyZTsKLQlDSEVDS19XQkFDSygmKGxwLT5jZl9jbWQpLCBzaXplb2Yoc3RydWN0IGNmX2NtZCkpOworCUNIRUNLX1dCQUNLKGxwLCAmKGxwLT5jZl9jbWQpLCBzaXplb2Yoc3RydWN0IGNmX2NtZCkpOwogCWk1OTZfYWRkX2NtZChkZXYsICZscC0+Y2ZfY21kLmNtZCk7CiAKIAlERUIoREVCX0lOSVQsIHByaW50aygiJXM6IHF1ZXVpbmcgQ21kU0FTZXR1cFxuIiwgZGV2LT5uYW1lKSk7CiAJbWVtY3B5KGxwLT5zYV9jbWQuZXRoX2FkZHIsIGRldi0+ZGV2X2FkZHIsIDYpOwogCWxwLT5zYV9jbWQuY21kLmNvbW1hbmQgPSBDbWRTQVNldHVwOwotCUNIRUNLX1dCQUNLKCYobHAtPnNhX2NtZCksIHNpemVvZihzdHJ1Y3Qgc2FfY21kKSk7CisJQ0hFQ0tfV0JBQ0sobHAsICYobHAtPnNhX2NtZCksIHNpemVvZihzdHJ1Y3Qgc2FfY21kKSk7CiAJaTU5Nl9hZGRfY21kKGRldiwgJmxwLT5zYV9jbWQuY21kKTsKIAogCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogcXVldWluZyBDbWRURFJcbiIsIGRldi0+bmFtZSkpOwogCWxwLT50ZHJfY21kLmNtZC5jb21tYW5kID0gQ21kVERSOwotCUNIRUNLX1dCQUNLKCYobHAtPnRkcl9jbWQpLCBzaXplb2Yoc3RydWN0IHRkcl9jbWQpKTsKKwlDSEVDS19XQkFDSyhscCwgJihscC0+dGRyX2NtZCksIHNpemVvZihzdHJ1Y3QgdGRyX2NtZCkpOwogCWk1OTZfYWRkX2NtZChkZXYsICZscC0+dGRyX2NtZC5jbWQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+bG9jaywgZmxhZ3MpOwpAQCAtNzA4LDcgKzcwOCw3IEBACiAJREVCKERFQl9JTklULCBwcmludGsoIiVzOiBJc3N1aW5nIFJYX1NUQVJUXG4iLCBkZXYtPm5hbWUpKTsKIAlscC0+c2NiLmNvbW1hbmQgPSBSWF9TVEFSVDsKIAlscC0+c2NiLnJmZCA9IFdTV0FQcmZkKHZpcnRfdG9fZG1hKGxwLGxwLT5yZmRzKSk7Ci0JQ0hFQ0tfV0JBQ0soJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCUNIRUNLX1dCQUNLKGxwLCAmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CiAKIAlDQShkZXYpOwogCkBAIC03NDAsMTMgKzc0MCwxMyBAQAogCiAJcmZkID0gbHAtPnJmZF9oZWFkOwkJLyogUmVmIG5leHQgZnJhbWUgdG8gY2hlY2sgKi8KIAotCUNIRUNLX0lOVihyZmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpKTsKKwlDSEVDS19JTlYobHAsIHJmZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3JmZCkpOwogCXdoaWxlICgocmZkLT5zdGF0KSAmIFNUQVRfQykgewkvKiBMb29wIHdoaWxlIGNvbXBsZXRlIGZyYW1lcyAqLwogCQlpZiAocmZkLT5yYmQgPT0gSTU5Nl9OVUxMKQogCQkJcmJkID0gTlVMTDsKIAkJZWxzZSBpZiAocmZkLT5yYmQgPT0gbHAtPnJiZF9oZWFkLT5iX2FkZHIpIHsKIAkJCXJiZCA9IGxwLT5yYmRfaGVhZDsKLQkJCUNIRUNLX0lOVihyYmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpKTsKKwkJCUNIRUNLX0lOVihscCwgcmJkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmJkKSk7CiAJCX0KIAkJZWxzZSB7CiAJCQlwcmludGsoIiVzOiByYmQgY2hhaW4gYnJva2VuIVxuIiwgZGV2LT5uYW1lKTsKQEAgLTc5MCw3ICs3OTAsNyBAQAogCQkJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUobHAtPmRldiwgbmV3c2tiLT5kYXRhLCBQS1RfQlVGX1NaLCBETUFfRlJPTV9ERVZJQ0UpOwogCQkJCXJiZC0+dl9kYXRhID0gbmV3c2tiLT5kYXRhOwogCQkJCXJiZC0+Yl9kYXRhID0gV1NXQVBjaGFyKGRtYV9hZGRyKTsKLQkJCQlDSEVDS19XQkFDS19JTlYocmJkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmJkKSk7CisJCQkJQ0hFQ0tfV0JBQ0tfSU5WKGxwLCByYmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpKTsKIAkJCX0KIAkJCWVsc2UKIAkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKQEAgLTg0Miw3ICs4NDIsNyBAQAogCQlpZiAocmJkICE9IE5VTEwgJiYgKHJiZC0+Y291bnQgJiAweDQwMDApKSB7CiAJCQlyYmQtPmNvdW50ID0gMDsKIAkJCWxwLT5yYmRfaGVhZCA9IHJiZC0+dl9uZXh0OwotCQkJQ0hFQ0tfV0JBQ0tfSU5WKHJiZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3JiZCkpOworCQkJQ0hFQ0tfV0JBQ0tfSU5WKGxwLCByYmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpKTsKIAkJfQogCiAJCS8qIFRpZHkgdGhlIGZyYW1lIGRlc2NyaXB0b3IsIG1hcmtpbmcgaXQgYXMgZW5kIG9mIGxpc3QgKi8KQEAgLTg2MCwxMCArODYwLDEwIEBACiAKIAkJbHAtPnNjYi5yZmQgPSByZmQtPmJfbmV4dDsKIAkJbHAtPnJmZF9oZWFkID0gcmZkLT52X25leHQ7Ci0JCUNIRUNLX1dCQUNLX0lOVihyZmQtPnZfcHJldiwgc2l6ZW9mKHN0cnVjdCBpNTk2X3JmZCkpOwotCQlDSEVDS19XQkFDS19JTlYocmZkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmZkKSk7CisJCUNIRUNLX1dCQUNLX0lOVihscCwgcmZkLT52X3ByZXYsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpKTsKKwkJQ0hFQ0tfV0JBQ0tfSU5WKGxwLCByZmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpKTsKIAkJcmZkID0gbHAtPnJmZF9oZWFkOwotCQlDSEVDS19JTlYocmZkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmZkKSk7CisJCUNIRUNLX0lOVihscCwgcmZkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmZkKSk7CiAJfQogCiAJREVCKERFQl9SWEZSQU1FLCBwcmludGsoImZyYW1lcyAlZFxuIiwgZnJhbWVzKSk7CkBAIC05MDIsMTIgKzkwMiwxMiBAQAogCQkJcHRyLT52X25leHQgPSBOVUxMOwogCQkJcHRyLT5iX25leHQgPSBJNTk2X05VTEw7CiAJCX0KLQkJQ0hFQ0tfV0JBQ0tfSU5WKHB0ciwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOworCQlDSEVDS19XQkFDS19JTlYobHAsIHB0ciwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOwogCX0KIAogCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImk1OTZfY2xlYW51cF9jbWQgdGltZWQgb3V0Iik7CiAJbHAtPnNjYi5jbWQgPSBJNTk2X05VTEw7Ci0JQ0hFQ0tfV0JBQ0soJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCUNIRUNLX1dCQUNLKGxwLCAmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CiB9CiAKIApAQCAtOTI1LDcgKzkyNSw3IEBACiAKIAkvKiBGSVhNRTogdGhpcyBjb21tYW5kIG1pZ2h0IGNhdXNlIGFuIGxwbWMgKi8KIAlscC0+c2NiLmNvbW1hbmQgPSBDVUNfQUJPUlQgfCBSWF9BQk9SVDsKLQlDSEVDS19XQkFDSygmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisJQ0hFQ0tfV0JBQ0sobHAsICYobHAtPnNjYiksIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKIAlDQShkZXYpOwogCiAJLyogd2FpdCBmb3Igc2h1dGRvd24gKi8KQEAgLTk1MSwyMCArOTUxLDIwIEBACiAJY21kLT5jb21tYW5kIHw9IChDTURfRU9MIHwgQ01EX0lOVFIpOwogCWNtZC0+dl9uZXh0ID0gTlVMTDsKIAljbWQtPmJfbmV4dCA9IEk1OTZfTlVMTDsKLQlDSEVDS19XQkFDSyhjbWQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKTsKKwlDSEVDS19XQkFDSyhscCwgY21kLCBzaXplb2Yoc3RydWN0IGk1OTZfY21kKSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmxwLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAobHAtPmNtZF9oZWFkICE9IE5VTEwpIHsKIAkJbHAtPmNtZF90YWlsLT52X25leHQgPSBjbWQ7CiAJCWxwLT5jbWRfdGFpbC0+Yl9uZXh0ID0gV1NXQVBjbWQodmlydF90b19kbWEobHAsJmNtZC0+c3RhdHVzKSk7Ci0JCUNIRUNLX1dCQUNLKGxwLT5jbWRfdGFpbCwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOworCQlDSEVDS19XQkFDSyhscCwgbHAtPmNtZF90YWlsLCBzaXplb2Yoc3RydWN0IGk1OTZfY21kKSk7CiAJfSBlbHNlIHsKIAkJbHAtPmNtZF9oZWFkID0gY21kOwogCQl3YWl0X2NtZChkZXYsIGxwLCAxMDAsICJpNTk2X2FkZF9jbWQgdGltZWQgb3V0Iik7CiAJCWxwLT5zY2IuY21kID0gV1NXQVBjbWQodmlydF90b19kbWEobHAsJmNtZC0+c3RhdHVzKSk7CiAJCWxwLT5zY2IuY29tbWFuZCA9IENVQ19TVEFSVDsKLQkJQ0hFQ0tfV0JBQ0soJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCQlDSEVDS19XQkFDSyhscCwgJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOwogCQlDQShkZXYpOwogCX0KIAlscC0+Y21kX3RhaWwgPSBjbWQ7CkBAIC05OTgsMTIgKzk5OCwxMiBAQAogCWRhdGEgPSB2aXJ0X3RvX2RtYShscCx0aW50KTsKIAogCXRpbnRbMV0gPSAtMTsKLQlDSEVDS19XQkFDSyh0aW50LFBBR0VfU0laRSk7CisJQ0hFQ0tfV0JBQ0sobHAsIHRpbnQsIFBBR0VfU0laRSk7CiAKIAlNUFVfUE9SVChkZXYsIDEsIGRhdGEpOwogCiAJZm9yKGRhdGEgPSAxMDAwMDAwOyBkYXRhOyBkYXRhLS0pIHsKLQkJQ0hFQ0tfSU5WKHRpbnQsUEFHRV9TSVpFKTsKKwkJQ0hFQ0tfSU5WKGxwLCB0aW50LCBQQUdFX1NJWkUpOwogCQlpZih0aW50WzFdICE9IC0xKQogCQkJYnJlYWs7CiAKQEAgLTEwNjEsNyArMTA2MSw3IEBACiAJCS8qIElzc3VlIGEgY2hhbm5lbCBhdHRlbnRpb24gc2lnbmFsICovCiAJCURFQihERUJfRVJST1JTLCBwcmludGsoIktpY2tpbmcgYm9hcmQuXG4iKSk7CiAJCWxwLT5zY2IuY29tbWFuZCA9IENVQ19TVEFSVCB8IFJYX1NUQVJUOwotCQlDSEVDS19XQkFDS19JTlYoJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCQlDSEVDS19XQkFDS19JTlYobHAsICYobHAtPnNjYiksIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKIAkJQ0EgKGRldik7CiAJCWxwLT5sYXN0X3Jlc3RhcnQgPSBscC0+c3RhdHMudHhfcGFja2V0czsKIAl9CkBAIC0xMTE4LDggKzExMTgsOCBAQAogCQl0YmQtPmRhdGEgPSBXU1dBUGNoYXIodHhfY21kLT5kbWFfYWRkcik7CiAKIAkJREVCKERFQl9UWEFERFIscHJpbnRfZXRoKHNrYi0+ZGF0YSwgInR4LXF1ZXVlZCIpKTsKLQkJQ0hFQ0tfV0JBQ0tfSU5WKHR4X2NtZCwgc2l6ZW9mKHN0cnVjdCB0eF9jbWQpKTsKLQkJQ0hFQ0tfV0JBQ0tfSU5WKHRiZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3RiZCkpOworCQlDSEVDS19XQkFDS19JTlYobHAsIHR4X2NtZCwgc2l6ZW9mKHN0cnVjdCB0eF9jbWQpKTsKKwkJQ0hFQ0tfV0JBQ0tfSU5WKGxwLCB0YmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl90YmQpKTsKIAkJaTU5Nl9hZGRfY21kKGRldiwgJnR4X2NtZC0+Y21kKTsKIAogCQlscC0+c3RhdHMudHhfcGFja2V0cysrOwpAQCAtMTIyOCw3ICsxMjI4LDcgQEAKIAlscC0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKIAlscC0+ZGV2ID0gZ2VuX2RldjsKIAotCUNIRUNLX1dCQUNLX0lOVihkZXYtPm1lbV9zdGFydCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpKTsKKwlDSEVDS19XQkFDS19JTlYobHAsIGRldi0+bWVtX3N0YXJ0LCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOwogCiAJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChpKSB7CkBAIC0xMjk1LDcgKzEyOTUsNyBAQAogCQkJREVCKERFQl9JTlRTLCBwcmludGsoIiVzOiBpNTk2IGludGVycnVwdCBjb21tYW5kIHVuaXQgaW5hY3RpdmUgJXguXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyAmIDB4MDcwMCkpOwogCiAJCXdoaWxlIChscC0+Y21kX2hlYWQgIT0gTlVMTCkgewotCQkJQ0hFQ0tfSU5WKGxwLT5jbWRfaGVhZCwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOworCQkJQ0hFQ0tfSU5WKGxwLCBscC0+Y21kX2hlYWQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKTsKIAkJCWlmICghKGxwLT5jbWRfaGVhZC0+c3RhdHVzICYgU1RBVF9DKSkKIAkJCQlicmVhazsKIApAQCAtMTM1OCw3ICsxMzU4LDcgQEAKIAkJCX0KIAkJCXB0ci0+dl9uZXh0ID0gTlVMTDsKIAkJICAgICAgICBwdHItPmJfbmV4dCA9IEk1OTZfTlVMTDsKLQkJCUNIRUNLX1dCQUNLKHB0ciwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOworCQkJQ0hFQ0tfV0JBQ0sobHAsIHB0ciwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOwogCQkJbHAtPmxhc3RfY21kID0gamlmZmllczsKIAkJfQogCkBAIC0xMzcyLDEzICsxMzcyLDEzIEBACiAKIAkJCXB0ci0+Y29tbWFuZCAmPSAweDFmZmY7CiAJCQlwdHIgPSBwdHItPnZfbmV4dDsKLQkJCUNIRUNLX1dCQUNLX0lOVihwcmV2LCBzaXplb2Yoc3RydWN0IGk1OTZfY21kKSk7CisJCQlDSEVDS19XQkFDS19JTlYobHAsIHByZXYsIHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKTsKIAkJfQogCiAJCWlmICgobHAtPmNtZF9oZWFkICE9IE5VTEwpKQogCQkJYWNrX2NtZCB8PSBDVUNfU1RBUlQ7CiAJCWxwLT5zY2IuY21kID0gV1NXQVBjbWQodmlydF90b19kbWEobHAsJmxwLT5jbWRfaGVhZC0+c3RhdHVzKSk7Ci0JCUNIRUNLX1dCQUNLX0lOVigmbHAtPnNjYiwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCQlDSEVDS19XQkFDS19JTlYobHAsICZscC0+c2NiLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CiAJfQogCWlmICgoc3RhdHVzICYgMHgxMDAwKSB8fCAoc3RhdHVzICYgMHg0MDAwKSkgewogCQlpZiAoKHN0YXR1cyAmIDB4NDAwMCkpCkBAIC0xMzk3LDcgKzEzOTcsNyBAQAogCX0KIAl3YWl0X2NtZChkZXYsIGxwLCAxMDAsICJpNTk2IGludGVycnVwdCwgdGltZW91dCIpOwogCWxwLT5zY2IuY29tbWFuZCA9IGFja19jbWQ7Ci0JQ0hFQ0tfV0JBQ0soJmxwLT5zY2IsIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKKwlDSEVDS19XQkFDSyhscCwgJmxwLT5zY2IsIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKIAogCS8qIERBTkdFUjogSSBzdXNwZWN0IHRoYXQgc29tZSBraW5kIG9mIGludGVycnVwdAogCSBhY2tub3dsZWRnZW1lbnQgYXNpZGUgZnJvbSBhY2tpbmcgdGhlIDgyNTk2IG1pZ2h0IGJlIG5lZWRlZApAQCAtMTQyNiw3ICsxNDI2LDcgQEAKIAogCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImNsb3NlMSB0aW1lZCBvdXQiKTsKIAlscC0+c2NiLmNvbW1hbmQgPSBDVUNfQUJPUlQgfCBSWF9BQk9SVDsKLQlDSEVDS19XQkFDSygmbHAtPnNjYiwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCUNIRUNLX1dCQUNLKGxwLCAmbHAtPnNjYiwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOwogCiAJQ0EoZGV2KTsKIApAQCAtMTQ4Niw3ICsxNDg2LDcgQEAKIAkJCSAgICAgICBkZXYtPm5hbWUpOwogCQllbHNlIHsKIAkJCWxwLT5jZl9jbWQuY21kLmNvbW1hbmQgPSBDbWRDb25maWd1cmU7Ci0JCQlDSEVDS19XQkFDS19JTlYoJmxwLT5jZl9jbWQsIHNpemVvZihzdHJ1Y3QgY2ZfY21kKSk7CisJCQlDSEVDS19XQkFDS19JTlYobHAsICZscC0+Y2ZfY21kLCBzaXplb2Yoc3RydWN0IGNmX2NtZCkpOwogCQkJaTU5Nl9hZGRfY21kKGRldiwgJmxwLT5jZl9jbWQuY21kKTsKIAkJfQogCX0KQEAgLTE1MTQsNyArMTUxNCw3IEBACiAJCQkJREVCKERFQl9NVUxUSSwgcHJpbnRrKCIlczogQWRkaW5nIGFkZHJlc3MgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCiAJCQkJCQlkZXYtPm5hbWUsIGNwWzBdLGNwWzFdLGNwWzJdLGNwWzNdLGNwWzRdLGNwWzVdKSk7CiAJCX0KLQkJQ0hFQ0tfV0JBQ0tfSU5WKCZscC0+bWNfY21kLCBzaXplb2Yoc3RydWN0IG1jX2NtZCkpOworCQlDSEVDS19XQkFDS19JTlYobHAsICZscC0+bWNfY21kLCBzaXplb2Yoc3RydWN0IG1jX2NtZCkpOwogCQlpNTk2X2FkZF9jbWQoZGV2LCAmY21kLT5jbWQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xpYjgzOTAuYyBiL2RyaXZlcnMvbmV0L2xpYjgzOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzI2YzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbGliODM5MC5jCkBAIC0wLDAgKzEsMTA5NyBAQAorLyogODM5MC5jOiBBIGdlbmVyYWwgTlM4MzkwIGV0aGVybmV0IGRyaXZlciBjb3JlIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkyLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisKKyAgVGhpcyBpcyB0aGUgY2hpcC1zcGVjaWZpYyBjb2RlIGZvciBtYW55IDgzOTAtYmFzZWQgZXRoZXJuZXQgYWRhcHRvcnMuCisgIFRoaXMgaXMgbm90IGEgY29tcGxldGUgZHJpdmVyLCBpdCBtdXN0IGJlIGNvbWJpbmVkIHdpdGggYm9hcmQtc3BlY2lmaWMKKyAgY29kZSBzdWNoIGFzIG5lLmMsIHdkLmMsIDNjNTAzLmMsIGV0Yy4KKworICBTZWVpbmcgaG93IGF0IGxlYXN0IGVpZ2h0IGRyaXZlcnMgdXNlIHRoaXMgY29kZSwgKG5vdCBjb3VudGluZyB0aGUKKyAgUENNQ0lBIG9uZXMgZWl0aGVyKSBpdCBpcyBlYXN5IHRvIGJyZWFrIHNvbWUgY2FyZCBieSB3aGF0IHNlZW1zIGxpa2UKKyAgYSBzaW1wbGUgaW5ub2NlbnQgY2hhbmdlLiBQbGVhc2UgY29udGFjdCBtZSBvciBEb25hbGQgaWYgeW91IHRoaW5rCisgIHlvdSBoYXZlIGZvdW5kIHNvbWV0aGluZyB0aGF0IG5lZWRzIGNoYW5naW5nLiAtLSBQRworCisKKyAgQ2hhbmdlbG9nOgorCisgIFBhdWwgR29ydG1ha2VyCTogcmVtb3ZlIHNldF9iaXQgbG9jaywgb3RoZXIgY2xlYW51cHMuCisgIFBhdWwgR29ydG1ha2VyCTogYWRkIGVpX2dldF84MzkwX2hkcigpIHNvIHdlIGNhbiBwYXNzIHNrYidzIHRvCisJCQkgIGVpX2Jsb2NrX2lucHV0KCkgZm9yIGV0aF9pb19jb3B5X2FuZF9zdW0oKS4KKyAgUGF1bCBHb3J0bWFrZXIJOiBleGNoYW5nZSBzdGF0aWMgaW50IGVpX3Bpbmdwb25nIGZvciBhICNkZWZpbmUsCisJCQkgIGFsc28gYWRkIGJldHRlciBUeCBlcnJvciBoYW5kbGluZy4KKyAgUGF1bCBHb3J0bWFrZXIJOiByZXdyaXRlIFJ4IG92ZXJydW4gaGFuZGxpbmcgYXMgcGVyIE5TIHNwZWNzLgorICBBbGV4ZXkgS3V6bmV0c292CTogdXNlIHRoZSA4MzkwJ3Mgc2l4IGJpdCBoYXNoIG11bHRpY2FzdCBmaWx0ZXIuCisgIFBhdWwgR29ydG1ha2VyCTogdHdlYWsgQU5LJ3MgYWJvdmUgbXVsdGljYXN0IGNoYW5nZXMgYSBiaXQuCisgIFBhdWwgR29ydG1ha2VyCTogdXBkYXRlIHBhY2tldCBzdGF0aXN0aWNzIGZvciB2Mi4xLngKKyAgQWxhbiBDb3gJCTogc3VwcG9ydCBhcmJpdGFyeSBzdHVwaWQgcG9ydCBtYXBwaW5ncyBvbiB0aGUKKyAgCQkJICA2OEsgTWFjaW50b3NoLiBTdXBwb3J0ID4xNmJpdCBJL08gc3BhY2VzCisgIFBhdWwgR29ydG1ha2VyCTogYWRkIGttb2Qgc3VwcG9ydCBmb3IgYXV0by1sb2FkaW5nIG9mIHRoZSA4MzkwCisJCQkgIG1vZHVsZSBieSBhbGwgZHJpdmVycyB0aGF0IHJlcXVpcmUgaXQuCisgIEFsYW4gQ294CQk6IFNwaW5sb2NraW5nIHdvcmssIGFkZGVkICdCVUdfODNDNjkwJworICBQYXVsIEdvcnRtYWtlcgk6IFNlcGFyYXRlIG91dCBUeCB0aW1lb3V0IGNvZGUgZnJvbSBUeCBwYXRoLgorICBQYXVsIEdvcnRtYWtlcgk6IFJlbW92ZSBvbGQgdW51c2VkIHNpbmdsZSBUeCBidWZmZXIgY29kZS4KKyAgSGF5YXRvIEZ1aml3YXJhCTogQWRkIG0zMnIgc3VwcG9ydC4KKyAgUGF1bCBHb3J0bWFrZXIJOiB1c2Ugc2tiX3BhZHRvKCkgaW5zdGVhZCBvZiBzdGFjayBzY3JhdGNoIGFyZWEKKworICBTb3VyY2VzOgorICBUaGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMQU4gRGF0YWJvb2ssIGFuZCB0aGUgM0NvbSAzYzUwMyBkYXRhYm9vay4KKworICAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+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+IDgsIGU4MzkwX2Jhc2UgKyBFTjBfVENOVEhJKTsKKwllaV9vdXRiX3Aoc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9UUFNSKTsKKwllaV9vdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfVFJBTlMrRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xuZTM5MC5jIGIvZHJpdmVycy9uZXQvbG5lMzkwLmMKaW5kZXggNTc5NWVlMS4uMGEwOGQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbG5lMzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbG5lMzkwLmMKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CiB9CiAKLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3ZvaWQgX19leGl0IGNsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHRoaXNfZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sb29wYmFjay5jIGIvZHJpdmVycy9uZXQvbG9vcGJhY2suYwppbmRleCA0MTc4YjRiMS4uODJjMTBkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbG9vcGJhY2suYworKysgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCkBAIC01OCw3ICs1OCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMsIGxvb3BiYWNrX3N0YXRzKTsKK3N0cnVjdCBwY3B1X2xzdGF0cyB7CisJdW5zaWduZWQgbG9uZyBwYWNrZXRzOworCXVuc2lnbmVkIGxvbmcgYnl0ZXM7Cit9Oworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwY3B1X2xzdGF0cywgcGNwdV9sc3RhdHMpOwogCiAjZGVmaW5lIExPT1BCQUNLX09WRVJIRUFEICgxMjggKyBNQVhfSEVBREVSICsgMTYgKyAxNikKIApAQCAtMTI4LDcgKzEzMiw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbG9vcGJhY2tfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYl9zdGF0czsKKwlzdHJ1Y3QgcGNwdV9sc3RhdHMgKmxiX3N0YXRzOwogCiAJc2tiX29ycGhhbihza2IpOwogCkBAIC0xNDksMTYgKzE1MywxNCBAQAogI2VuZGlmCiAJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAotCWxiX3N0YXRzID0gJnBlcl9jcHUobG9vcGJhY2tfc3RhdHMsIGdldF9jcHUoKSk7Ci0JbGJfc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCWxiX3N0YXRzLT50eF9ieXRlcyA9IGxiX3N0YXRzLT5yeF9ieXRlczsKLQlsYl9zdGF0cy0+cnhfcGFja2V0cysrOwotCWxiX3N0YXRzLT50eF9wYWNrZXRzID0gbGJfc3RhdHMtPnJ4X3BhY2tldHM7Ci0JcHV0X2NwdSgpOworCS8qIGl0J3MgT0sgdG8gdXNlIF9fZ2V0X2NwdV92YXIoKSBiZWNhdXNlIEJIcyBhcmUgb2ZmICovCisJbGJfc3RhdHMgPSAmX19nZXRfY3B1X3ZhcihwY3B1X2xzdGF0cyk7CisJbGJfc3RhdHMtPmJ5dGVzICs9IHNrYi0+bGVuOworCWxiX3N0YXRzLT5wYWNrZXRzKys7CiAKIAluZXRpZl9yeChza2IpOwogCi0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbG9vcGJhY2tfc3RhdHM7CkBAIC0xNjYsMjAgKzE2OCwyMSBAQAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbG9vcGJhY2tfc3RhdHM7CisJdW5zaWduZWQgbG9uZyBieXRlcyA9IDA7CisJdW5zaWduZWQgbG9uZyBwYWNrZXRzID0gMDsKIAlpbnQgaTsKIAotCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7Ci0KIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGJfc3RhdHM7CisJCWNvbnN0IHN0cnVjdCBwY3B1X2xzdGF0cyAqbGJfc3RhdHM7CiAKLQkJbGJfc3RhdHMgPSAmcGVyX2NwdShsb29wYmFja19zdGF0cywgaSk7Ci0JCXN0YXRzLT5yeF9ieXRlcyAgICs9IGxiX3N0YXRzLT5yeF9ieXRlczsKLQkJc3RhdHMtPnR4X2J5dGVzICAgKz0gbGJfc3RhdHMtPnR4X2J5dGVzOwotCQlzdGF0cy0+cnhfcGFja2V0cyArPSBsYl9zdGF0cy0+cnhfcGFja2V0czsKLQkJc3RhdHMtPnR4X3BhY2tldHMgKz0gbGJfc3RhdHMtPnR4X3BhY2tldHM7CisJCWxiX3N0YXRzID0gJnBlcl9jcHUocGNwdV9sc3RhdHMsIGkpOworCQlieXRlcyAgICs9IGxiX3N0YXRzLT5ieXRlczsKKwkJcGFja2V0cyArPSBsYl9zdGF0cy0+cGFja2V0czsKIAl9Ci0KKwlzdGF0cy0+cnhfcGFja2V0cyA9IHBhY2tldHM7CisJc3RhdHMtPnR4X3BhY2tldHMgPSBwYWNrZXRzOworCXN0YXRzLT5yeF9ieXRlcyA9IGJ5dGVzOworCXN0YXRzLT50eF9ieXRlcyA9IGJ5dGVzOwogCXJldHVybiBzdGF0czsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbHA0ODZlLmMgYi9kcml2ZXJzL25ldC9scDQ4NmUuYwppbmRleCBiODMzMDE2Li4xNzdjNTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9scDQ4NmUuYworKysgYi9kcml2ZXJzL25ldC9scDQ4NmUuYwpAQCAtODg0LDcgKzg4NCw3IEBACiAKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAotCXR4X2NtZCA9IChzdHJ1Y3QgdHhfY21kICopIGttYWxsb2MgKChzaXplb2YgKHN0cnVjdCB0eF9jbWQpICsgc2l6ZW9mIChzdHJ1Y3QgaTU5Nl90YmQpKSwgR0ZQX0FUT01JQyk7CisJdHhfY21kID0ga21hbGxvYygoc2l6ZW9mIChzdHJ1Y3QgdHhfY21kKSArIHNpemVvZiAoc3RydWN0IGk1OTZfdGJkKSksIEdGUF9BVE9NSUMpOwogCWlmICh0eF9jbWQgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaTU5Nl94bWl0IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOwogCQlscC0+c3RhdHMudHhfZHJvcHBlZCsrOwpAQCAtMTI2Niw3ICsxMjY2LDcgQEAKIAlpZiAoZGV2LT5tY19jb3VudCA+IDApIHsKIAkJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CiAJCWNoYXIgKmNwOwotCQljbWQgPSAoc3RydWN0IGk1OTZfY21kICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGk1OTZfY21kKSsyK2Rldi0+bWNfY291bnQqNiwgR0ZQX0FUT01JQyk7CisJCWNtZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkrMitkZXYtPm1jX2NvdW50KjYsIEdGUF9BVE9NSUMpOwogCQlpZiAoY21kID09IE5VTEwpIHsKIAkJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBzZXRfbXVsdGljYXN0IE1lbW9yeSBzcXVlZXplLlxuIiwgZGV2LT5uYW1lKTsKIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hYzgzOTAuYyBiL2RyaXZlcnMvbmV0L21hYzgzOTAuYwppbmRleCBhZGU2ZmY4Li5hMTJiYjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWM4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjODM5MC5jCkBAIC0zOSw3ICszOSwxNiBAQAogI2luY2x1ZGUgPGFzbS9od3Rlc3QuaD4KICNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgogCi0jaW5jbHVkZSAiODM5MC5oIgorc3RhdGljIGNoYXIgdmVyc2lvbltdID0KKwkibWFjODM5MC5jOiB2MC40IDIwMDEtMDUtMTUgRGF2aWQgSHVnZ2lucy1EYWluZXMgPGRoZEBkZWJpYW4ub3JnPiBhbmQgb3RoZXJzXG4iOworCisjZGVmaW5lIEVJX1NISUZUKHgpCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKKyNkZWZpbmUgZWlfaW5iKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBlaV9vdXRiKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCisjZGVmaW5lIGVpX2luYl9wKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBlaV9vdXRiX3AodmFsLHBvcnQpICBvdXRfOChwb3J0LHZhbCkKKworI2luY2x1ZGUgImxpYjgzOTAuYyIKIAogI2RlZmluZSBXRF9TVEFSVF9QRwkJCTB4MDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KICNkZWZpbmUgQ0FCTEVUUk9OX1JYX1NUQVJUX1BHCQkweDAwICAgIC8qIEZpcnN0IHBhZ2Ugb2YgUlggYnVmZmVyICovCkBAIC0xMTYsOSArMTI1LDYgQEAKIAkxLCAvKiBkYXluYS1sYyAqLwogfTsKIAotc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQotCSJtYWM4MzkwLmM6IHYwLjQgMjAwMS0wNS0xNSBEYXZpZCBIdWdnaW5zLURhaW5lcyA8ZGhkQGRlYmlhbi5vcmc+IGFuZCBvdGhlcnNcbiI7Ci0KIGV4dGVybiBlbnVtIG1hYzgzOTBfdHlwZSBtYWM4MzkwX2lkZW50KHN0cnVjdCBudWJ1c19kZXYgKiBkZXYpOwogZXh0ZXJuIGludCBtYWM4MzkwX21lbXNpemUodW5zaWduZWQgbG9uZyBtZW1iYXNlKTsKIGV4dGVybiBpbnQgbWFjODM5MF9tZW10ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKQEAgLTIzNyw3ICsyNDMsNyBAQAogCWlmICghTUFDSF9JU19NQUMpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCi0JZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJZGV2ID0gX19fX2FsbG9jX2VpX25ldGRldigwKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKQEAgLTQzOCw3ICs0NDQsNyBAQAogCWRldi0+b3BlbiA9ICZtYWM4MzkwX29wZW47CiAJZGV2LT5zdG9wID0gJm1hYzgzOTBfY2xvc2U7CiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBfX2VpX3BvbGw7CiAjZW5kaWYKIAogCS8qIEdBUiwgZWlfc3RhdHVzIGlzIGFjdHVhbGx5IGEgbWFjcm8gZXZlbiB0aG91Z2ggaXQgbG9va3MgZ2xvYmFsICovCkBAIC01MTAsNyArNTE2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JTlM4MzkwX2luaXQoZGV2LCAwKTsKKwlfX05TODM5MF9pbml0KGRldiwgMCk7CiAKIAkvKiBHb29kLCBkb25lLCBub3cgc3BpdCBvdXQgc29tZSBtZXNzYWdlcyAqLwogCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBpbiBzbG90ICVYICh0eXBlICVzKVxuIiwKQEAgLTUzMiw4ICs1MzgsOCBAQAogCiBzdGF0aWMgaW50IG1hYzgzOTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWVpX29wZW4oZGV2KTsKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgIjgzOTAgRXRoZXJuZXQiLCBkZXYpKSB7CisJX19laV9vcGVuKGRldik7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBfX2VpX2ludGVycnVwdCwgMCwgIjgzOTAgRXRoZXJuZXQiLCBkZXYpKSB7CiAJCXByaW50ayAoIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC01NDMsNyArNTQ5LDcgQEAKIHN0YXRpYyBpbnQgbWFjODM5MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCWVpX2Nsb3NlKGRldik7CisJX19laV9jbG9zZShkZXYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNiLmMgYi9kcml2ZXJzL25ldC9tYWNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViNTU5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21hY2IuYwpAQCAtMCwwICsxLDEyMTAgQEAKKy8qCisgKiBBdG1lbCBNQUNCIEV0aGVybmV0IENvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgQXRtZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+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+aHdfc3RhdHMucnhfcGF1c2VfZnJhbWVzOworCXUzMiAqZW5kID0gJmJwLT5od19zdGF0cy50eF9wYXVzZV9mcmFtZXMgKyAxOworCisJV0FSTl9PTigodW5zaWduZWQgbG9uZykoZW5kIC0gcCAtIDEpICE9IChNQUNCX1RQRiAtIE1BQ0JfUEZSKSAvIDQpOworCisJZm9yKDsgcCA8IGVuZDsgcCsrLCByZWcrKykKKwkJKnAgKz0gX19yYXdfcmVhZGwocmVnKTsKK30KKworc3RhdGljIHZvaWQgbWFjYl9wZXJpb2RpY190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1hY2IsIHBlcmlvZGljX3Rhc2sud29yayk7CisKKwltYWNiX3VwZGF0ZV9zdGF0cyhicCk7CisJbWFjYl9jaGVja19tZWRpYShicCwgMSwgMCk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5wZXJpb2RpY190YXNrLCBIWik7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2JfdHgoc3RydWN0IG1hY2IgKmJwKQoreworCXVuc2lnbmVkIGludCB0YWlsOworCXVuc2lnbmVkIGludCBoZWFkOworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSBtYWNiX3JlYWRsKGJwLCBUU1IpOworCW1hY2Jfd3JpdGVsKGJwLCBUU1IsIHN0YXR1cyk7CisKKwlkZXZfZGJnKCZicC0+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+d2VpZ2h0ID0gNjQ7CisJZGV2LT5ldGh0b29sX29wcyA9ICZtYWNiX2V0aHRvb2xfb3BzOworCisJZGV2LT5iYXNlX2FkZHIgPSByZWdzLT5zdGFydDsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZicC0+cGVyaW9kaWNfdGFzaywgbWFjYl9wZXJpb2RpY190YXNrKTsKKwltdXRleF9pbml0KCZicC0+bWRpb19tdXRleCk7CisJaW5pdF9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7CisKKwkvKiBTZXQgTUlJIG1hbmFnZW1lbnQgY2xvY2sgZGl2aWRlciAqLworCXBjbGtfaHogPSBjbGtfZ2V0X3JhdGUoYnAtPnBjbGspOworCWlmIChwY2xrX2h6IDw9IDIwMDAwMDAwKQorCQljb25maWcgPSBNQUNCX0JGKENMSywgTUFDQl9DTEtfRElWOCk7CisJZWxzZSBpZiAocGNsa19oeiA8PSA0MDAwMDAwMCkKKwkJY29uZmlnID0gTUFDQl9CRihDTEssIE1BQ0JfQ0xLX0RJVjE2KTsKKwllbHNlIGlmIChwY2xrX2h6IDw9IDgwMDAwMDAwKQorCQljb25maWcgPSBNQUNCX0JGKENMSywgTUFDQl9DTEtfRElWMzIpOworCWVsc2UKKwkJY29uZmlnID0gTUFDQl9CRihDTEssIE1BQ0JfQ0xLX0RJVjY0KTsKKwltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNvbmZpZyk7CisKKwlicC0+bWlpLmRldiA9IGRldjsKKwlicC0+bWlpLm1kaW9fcmVhZCA9IG1hY2JfbWRpb19yZWFkOworCWJwLT5taWkubWRpb193cml0ZSA9IG1hY2JfbWRpb193cml0ZTsKKwlicC0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlicC0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKwltYWNiX2dldF9od2FkZHIoYnApOworCWVyciA9IG1hY2JfcGh5X3Byb2JlKGJwKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBkZXRlY3QgUEhZLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9pcnE7CisJfQorCisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmlzX3JtaWkpCisJCW1hY2Jfd3JpdGVsKGJwLCBVU1JJTywgMCk7CisJZWxzZQorCQltYWNiX3dyaXRlbChicCwgVVNSSU8sIE1BQ0JfQklUKE1JSSkpOworCisJYnAtPnR4X3BlbmRpbmcgPSBERUZfVFhfUklOR19QRU5ESU5HOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfaXJxOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwltYWNiX3JlZ2lzdGVyX3N5c2ZzKGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQXRtZWwgTUFDQiBhdCAweCUwOGx4IGlycSAlZCAiCisJICAgICAgICIoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKGJwLT5yZWdzKTsKK2Vycl9vdXRfZGlzYWJsZV9jbG9ja3M6CisJY2xrX2Rpc2FibGUoYnAtPmhjbGspOworCWNsa19kaXNhYmxlKGJwLT5wY2xrKTsKKwljbGtfcHV0KGJwLT5oY2xrKTsKK2Vycl9vdXRfcHV0X3BjbGs6CisJY2xrX3B1dChicC0+cGNsayk7CitlcnJfb3V0X2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJfb3V0OgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1hY2JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbWFjYiAqYnA7CisKKwlkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYpIHsKKwkJYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCQltYWNiX3VucmVnaXN0ZXJfc3lzZnMoZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCWlvdW5tYXAoYnAtPnJlZ3MpOworCQljbGtfZGlzYWJsZShicC0+aGNsayk7CisJCWNsa19kaXNhYmxlKGJwLT5wY2xrKTsKKwkJY2xrX3B1dChicC0+aGNsayk7CisJCWNsa19wdXQoYnAtPnBjbGspOworCQlmcmVlX25ldGRldihkZXYpOworCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWFjYl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG1hY2JfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtYWNiX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJtYWNiIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWFjYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWFjYl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWFjYl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1hY2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobWFjYl9pbml0KTsKK21vZHVsZV9leGl0KG1hY2JfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXRtZWwgTUFDQiBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5oIGIvZHJpdmVycy9uZXQvbWFjYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmYwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tYWNiLmgKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBBdG1lbCBNQUNCIEV0aGVybmV0IENvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgQXRtZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9NQUNCX0gKKyNkZWZpbmUgX01BQ0JfSAorCisvKiBNQUNCIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgTUFDQl9OQ1IJCQkJMHgwMDAwCisjZGVmaW5lIE1BQ0JfTkNGR1IJCQkJMHgwMDA0CisjZGVmaW5lIE1BQ0JfTlNSCQkJCTB4MDAwOAorI2RlZmluZSBNQUNCX1RTUgkJCQkweDAwMTQKKyNkZWZpbmUgTUFDQl9SQlFQCQkJCTB4MDAxOAorI2RlZmluZSBNQUNCX1RCUVAJCQkJMHgwMDFjCisjZGVmaW5lIE1BQ0JfUlNSCQkJCTB4MDAyMAorI2RlZmluZSBNQUNCX0lTUgkJCQkweDAwMjQKKyNkZWZpbmUgTUFDQl9JRVIJCQkJMHgwMDI4CisjZGVmaW5lIE1BQ0JfSURSCQkJCTB4MDAyYworI2RlZmluZSBNQUNCX0lNUgkJCQkweDAwMzAKKyNkZWZpbmUgTUFDQl9NQU4JCQkJMHgwMDM0CisjZGVmaW5lIE1BQ0JfUFRSCQkJCTB4MDAzOAorI2RlZmluZSBNQUNCX1BGUgkJCQkweDAwM2MKKyNkZWZpbmUgTUFDQl9GVE8JCQkJMHgwMDQwCisjZGVmaW5lIE1BQ0JfU0NGCQkJCTB4MDA0NAorI2RlZmluZSBNQUNCX01DRgkJCQkweDAwNDgKKyNkZWZpbmUgTUFDQl9GUk8JCQkJMHgwMDRjCisjZGVmaW5lIE1BQ0JfRkNTRQkJCQkweDAwNTAKKyNkZWZpbmUgTUFDQl9BTEUJCQkJMHgwMDU0CisjZGVmaW5lIE1BQ0JfRFRGCQkJCTB4MDA1OAorI2RlZmluZSBNQUNCX0xDT0wJCQkJMHgwMDVjCisjZGVmaW5lIE1BQ0JfRVhDT0wJCQkJMHgwMDYwCisjZGVmaW5lIE1BQ0JfVFVORAkJCQkweDAwNjQKKyNkZWZpbmUgTUFDQl9DU0UJCQkJMHgwMDY4CisjZGVmaW5lIE1BQ0JfUlJFCQkJCTB4MDA2YworI2RlZmluZSBNQUNCX1JPVlIJCQkJMHgwMDcwCisjZGVmaW5lIE1BQ0JfUlNFCQkJCTB4MDA3NAorI2RlZmluZSBNQUNCX0VMRQkJCQkweDAwNzgKKyNkZWZpbmUgTUFDQl9SSkEJCQkJMHgwMDdjCisjZGVmaW5lIE1BQ0JfVVNGCQkJCTB4MDA4MAorI2RlZmluZSBNQUNCX1NURQkJCQkweDAwODQKKyNkZWZpbmUgTUFDQl9STEUJCQkJMHgwMDg4CisjZGVmaW5lIE1BQ0JfVFBGCQkJCTB4MDA4YworI2RlZmluZSBNQUNCX0hSQgkJCQkweDAwOTAKKyNkZWZpbmUgTUFDQl9IUlQJCQkJMHgwMDk0CisjZGVmaW5lIE1BQ0JfU0ExQgkJCQkweDAwOTgKKyNkZWZpbmUgTUFDQl9TQTFUCQkJCTB4MDA5YworI2RlZmluZSBNQUNCX1NBMkIJCQkJMHgwMGEwCisjZGVmaW5lIE1BQ0JfU0EyVAkJCQkweDAwYTQKKyNkZWZpbmUgTUFDQl9TQTNCCQkJCTB4MDBhOAorI2RlZmluZSBNQUNCX1NBM1QJCQkJMHgwMGFjCisjZGVmaW5lIE1BQ0JfU0E0QgkJCQkweDAwYjAKKyNkZWZpbmUgTUFDQl9TQTRUCQkJCTB4MDBiNAorI2RlZmluZSBNQUNCX1RJRAkJCQkweDAwYjgKKyNkZWZpbmUgTUFDQl9UUFEJCQkJMHgwMGJjCisjZGVmaW5lIE1BQ0JfVVNSSU8JCQkJMHgwMGMwCisjZGVmaW5lIE1BQ0JfV09MCQkJCTB4MDBjNAorCisvKiBCaXRmaWVsZHMgaW4gTkNSICovCisjZGVmaW5lIE1BQ0JfTEJfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgTUFDQl9MQl9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9MTEJfT0ZGU0VUCQkJCTEKKyNkZWZpbmUgTUFDQl9MTEJfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfUkVfT0ZGU0VUCQkJCTIKKyNkZWZpbmUgTUFDQl9SRV9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9URV9PRkZTRVQJCQkJMworI2RlZmluZSBNQUNCX1RFX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX01QRV9PRkZTRVQJCQkJNAorI2RlZmluZSBNQUNCX01QRV9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9DTFJTVEFUX09GRlNFVAkJCTUKKyNkZWZpbmUgTUFDQl9DTFJTVEFUX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfSU5DU1RBVF9PRkZTRVQJCQk2CisjZGVmaW5lIE1BQ0JfSU5DU1RBVF9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1dFU1RBVF9PRkZTRVQJCQk3CisjZGVmaW5lIE1BQ0JfV0VTVEFUX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfQlBfT0ZGU0VUCQkJCTgKKyNkZWZpbmUgTUFDQl9CUF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9UU1RBUlRfT0ZGU0VUCQkJOQorI2RlZmluZSBNQUNCX1RTVEFSVF9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1RIQUxUX09GRlNFVAkJCTEwCisjZGVmaW5lIE1BQ0JfVEhBTFRfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfTkNSX1RQRl9PRkZTRVQJCQkxMQorI2RlZmluZSBNQUNCX05DUl9UUEZfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9UWlFfT0ZGU0VUCQkJCTEyCisjZGVmaW5lIE1BQ0JfVFpRX1NJWkUJCQkJMQorCisvKiBCaXRmaWVsZHMgaW4gTkNGR1IgKi8KKyNkZWZpbmUgTUFDQl9TUERfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgTUFDQl9TUERfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfRkRfT0ZGU0VUCQkJCTEKKyNkZWZpbmUgTUFDQl9GRF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9CSVRfUkFURV9PRkZTRVQJCQkyCisjZGVmaW5lIE1BQ0JfQklUX1JBVEVfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9KRlJBTUVfT0ZGU0VUCQkJMworI2RlZmluZSBNQUNCX0pGUkFNRV9TSVpFCQkJMQorI2RlZmluZSBNQUNCX0NBRl9PRkZTRVQJCQkJNAorI2RlZmluZSBNQUNCX0NBRl9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9OQkNfT0ZGU0VUCQkJCTUKKyNkZWZpbmUgTUFDQl9OQkNfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfTkNGR1JfTVRJX09GRlNFVAkJCTYKKyNkZWZpbmUgTUFDQl9OQ0ZHUl9NVElfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9VTklfT0ZGU0VUCQkJCTcKKyNkZWZpbmUgTUFDQl9VTklfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfQklHX09GRlNFVAkJCQk4CisjZGVmaW5lIE1BQ0JfQklHX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0VBRV9PRkZTRVQJCQkJOQorI2RlZmluZSBNQUNCX0VBRV9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9DTEtfT0ZGU0VUCQkJCTEwCisjZGVmaW5lIE1BQ0JfQ0xLX1NJWkUJCQkJMgorI2RlZmluZSBNQUNCX1JUWV9PRkZTRVQJCQkJMTIKKyNkZWZpbmUgTUFDQl9SVFlfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfUEFFX09GRlNFVAkJCQkxMworI2RlZmluZSBNQUNCX1BBRV9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9SQk9GX09GRlNFVAkJCTE0CisjZGVmaW5lIE1BQ0JfUkJPRl9TSVpFCQkJCTIKKyNkZWZpbmUgTUFDQl9STENFX09GRlNFVAkJCTE2CisjZGVmaW5lIE1BQ0JfUkxDRV9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9EUkZDU19PRkZTRVQJCQkxNworI2RlZmluZSBNQUNCX0RSRkNTX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0VGUkhEX09GRlNFVAkJCTE4CisjZGVmaW5lIE1BQ0JfRUZSSERfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfSVJYRkNTX09GRlNFVAkJCTE5CisjZGVmaW5lIE1BQ0JfSVJYRkNTX1NJWkUJCQkxCisKKy8qIEJpdGZpZWxkcyBpbiBOU1IgKi8KKyNkZWZpbmUgTUFDQl9OU1JfTElOS19PRkZTRVQJCQkwCisjZGVmaW5lIE1BQ0JfTlNSX0xJTktfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9NRElPX09GRlNFVAkJCTEKKyNkZWZpbmUgTUFDQl9NRElPX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0lETEVfT0ZGU0VUCQkJMgorI2RlZmluZSBNQUNCX0lETEVfU0laRQkJCQkxCisKKy8qIEJpdGZpZWxkcyBpbiBUU1IgKi8KKyNkZWZpbmUgTUFDQl9VQlJfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgTUFDQl9VQlJfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfQ09MX09GRlNFVAkJCQkxCisjZGVmaW5lIE1BQ0JfQ09MX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1RTUl9STEVfT0ZGU0VUCQkJMgorI2RlZmluZSBNQUNCX1RTUl9STEVfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9UR09fT0ZGU0VUCQkJCTMKKyNkZWZpbmUgTUFDQl9UR09fU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfQkVYX09GRlNFVAkJCQk0CisjZGVmaW5lIE1BQ0JfQkVYX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0NPTVBfT0ZGU0VUCQkJNQorI2RlZmluZSBNQUNCX0NPTVBfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfVU5EX09GRlNFVAkJCQk2CisjZGVmaW5lIE1BQ0JfVU5EX1NJWkUJCQkJMQorCisvKiBCaXRmaWVsZHMgaW4gUlNSICovCisjZGVmaW5lIE1BQ0JfQk5BX09GRlNFVAkJCQkwCisjZGVmaW5lIE1BQ0JfQk5BX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1JFQ19PRkZTRVQJCQkJMQorI2RlZmluZSBNQUNCX1JFQ19TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9PVlJfT0ZGU0VUCQkJCTIKKyNkZWZpbmUgTUFDQl9PVlJfU0laRQkJCQkxCisKKy8qIEJpdGZpZWxkcyBpbiBJU1IvSUVSL0lEUi9JTVIgKi8KKyNkZWZpbmUgTUFDQl9NRkRfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgTUFDQl9NRkRfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfUkNPTVBfT0ZGU0VUCQkJMQorI2RlZmluZSBNQUNCX1JDT01QX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1JYVUJSX09GRlNFVAkJCTIKKyNkZWZpbmUgTUFDQl9SWFVCUl9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9UWFVCUl9PRkZTRVQJCQkzCisjZGVmaW5lIE1BQ0JfVFhVQlJfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfSVNSX1RVTkRfT0ZGU0VUCQkJNAorI2RlZmluZSBNQUNCX0lTUl9UVU5EX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfSVNSX1JMRV9PRkZTRVQJCQk1CisjZGVmaW5lIE1BQ0JfSVNSX1JMRV9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1RYRVJSX09GRlNFVAkJCTYKKyNkZWZpbmUgTUFDQl9UWEVSUl9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9UQ09NUF9PRkZTRVQJCQk3CisjZGVmaW5lIE1BQ0JfVENPTVBfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfSVNSX0xJTktfT0ZGU0VUCQkJOQorI2RlZmluZSBNQUNCX0lTUl9MSU5LX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfSVNSX1JPVlJfT0ZGU0VUCQkJMTAKKyNkZWZpbmUgTUFDQl9JU1JfUk9WUl9TSVpFCQkJMQorI2RlZmluZSBNQUNCX0hSRVNQX09GRlNFVAkJCTExCisjZGVmaW5lIE1BQ0JfSFJFU1BfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfUEZSX09GRlNFVAkJCQkxMgorI2RlZmluZSBNQUNCX1BGUl9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9QVFpfT0ZGU0VUCQkJCTEzCisjZGVmaW5lIE1BQ0JfUFRaX1NJWkUJCQkJMQorCisvKiBCaXRmaWVsZHMgaW4gTUFOICovCisjZGVmaW5lIE1BQ0JfREFUQV9PRkZTRVQJCQkwCisjZGVmaW5lIE1BQ0JfREFUQV9TSVpFCQkJCTE2CisjZGVmaW5lIE1BQ0JfQ09ERV9PRkZTRVQJCQkxNgorI2RlZmluZSBNQUNCX0NPREVfU0laRQkJCQkyCisjZGVmaW5lIE1BQ0JfUkVHQV9PRkZTRVQJCQkxOAorI2RlZmluZSBNQUNCX1JFR0FfU0laRQkJCQk1CisjZGVmaW5lIE1BQ0JfUEhZQV9PRkZTRVQJCQkyMworI2RlZmluZSBNQUNCX1BIWUFfU0laRQkJCQk1CisjZGVmaW5lIE1BQ0JfUldfT0ZGU0VUCQkJCTI4CisjZGVmaW5lIE1BQ0JfUldfU0laRQkJCQkyCisjZGVmaW5lIE1BQ0JfU09GX09GRlNFVAkJCQkzMAorI2RlZmluZSBNQUNCX1NPRl9TSVpFCQkJCTIKKworLyogQml0ZmllbGRzIGluIFVTUklPICovCisjZGVmaW5lIE1BQ0JfTUlJX09GRlNFVAkJCQkwCisjZGVmaW5lIE1BQ0JfTUlJX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0VBTV9PRkZTRVQJCQkJMQorI2RlZmluZSBNQUNCX0VBTV9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9UWF9QQVVTRV9PRkZTRVQJCQkyCisjZGVmaW5lIE1BQ0JfVFhfUEFVU0VfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9UWF9QQVVTRV9aRVJPX09GRlNFVAkJMworI2RlZmluZSBNQUNCX1RYX1BBVVNFX1pFUk9fU0laRQkJCTEKKworLyogQml0ZmllbGRzIGluIFdPTCAqLworI2RlZmluZSBNQUNCX0lQX09GRlNFVAkJCQkwCisjZGVmaW5lIE1BQ0JfSVBfU0laRQkJCQkxNgorI2RlZmluZSBNQUNCX01BR19PRkZTRVQJCQkJMTYKKyNkZWZpbmUgTUFDQl9NQUdfU0laRQkJCQkxCisjZGVmaW5lIE1BQ0JfQVJQX09GRlNFVAkJCQkxNworI2RlZmluZSBNQUNCX0FSUF9TSVpFCQkJCTEKKyNkZWZpbmUgTUFDQl9TQTFfT0ZGU0VUCQkJCTE4CisjZGVmaW5lIE1BQ0JfU0ExX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX1dPTF9NVElfT0ZGU0VUCQkJMTkKKyNkZWZpbmUgTUFDQl9XT0xfTVRJX1NJWkUJCQkxCisKKy8qIENvbnN0YW50cyBmb3IgQ0xLICovCisjZGVmaW5lIE1BQ0JfQ0xLX0RJVjgJCQkJMAorI2RlZmluZSBNQUNCX0NMS19ESVYxNgkJCQkxCisjZGVmaW5lIE1BQ0JfQ0xLX0RJVjMyCQkJCTIKKyNkZWZpbmUgTUFDQl9DTEtfRElWNjQJCQkJMworCisvKiBDb25zdGFudHMgZm9yIE1BTiByZWdpc3RlciAqLworI2RlZmluZSBNQUNCX01BTl9TT0YJCQkJMQorI2RlZmluZSBNQUNCX01BTl9XUklURQkJCQkxCisjZGVmaW5lIE1BQ0JfTUFOX1JFQUQJCQkJMgorI2RlZmluZSBNQUNCX01BTl9DT0RFCQkJCTIKKworLyogQml0IG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgTUFDQl9CSVQobmFtZSkJCQkJCVwKKwkoMSA8PCBNQUNCXyMjbmFtZSMjX09GRlNFVCkKKyNkZWZpbmUgTUFDQl9CRihuYW1lLHZhbHVlKQkJCQlcCisJKCgodmFsdWUpICYgKCgxIDw8IE1BQ0JfIyNuYW1lIyNfU0laRSkgLSAxKSkJXAorCSA8PCBNQUNCXyMjbmFtZSMjX09GRlNFVCkKKyNkZWZpbmUgTUFDQl9CRkVYVChuYW1lLHZhbHVlKVwKKwkoKCh2YWx1ZSkgPj4gTUFDQl8jI25hbWUjI19PRkZTRVQpCQlcCisJICYgKCgxIDw8IE1BQ0JfIyNuYW1lIyNfU0laRSkgLSAxKSkKKyNkZWZpbmUgTUFDQl9CRklOUyhuYW1lLHZhbHVlLG9sZCkJCQlcCisJKCgob2xkKSAmIH4oKCgxIDw8IE1BQ0JfIyNuYW1lIyNfU0laRSkgLSAxKQlcCisJCSAgICA8PCBNQUNCXyMjbmFtZSMjX09GRlNFVCkpCQlcCisJIHwgTUFDQl9CRihuYW1lLHZhbHVlKSkKKworLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSBtYWNiX3JlYWRsKHBvcnQscmVnKQkJCQlcCisJX19yYXdfcmVhZGwoKHBvcnQpLT5yZWdzICsgTUFDQl8jI3JlZykKKyNkZWZpbmUgbWFjYl93cml0ZWwocG9ydCxyZWcsdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyBNQUNCXyMjcmVnKQorCitzdHJ1Y3QgZG1hX2Rlc2MgeworCXUzMglhZGRyOworCXUzMgljdHJsOworfTsKKworLyogRE1BIGRlc2NyaXB0b3IgYml0ZmllbGRzICovCisjZGVmaW5lIE1BQ0JfUlhfVVNFRF9PRkZTRVQJCQkwCisjZGVmaW5lIE1BQ0JfUlhfVVNFRF9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX1dSQVBfT0ZGU0VUCQkJMQorI2RlZmluZSBNQUNCX1JYX1dSQVBfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9XQUREUl9PRkZTRVQJCQkyCisjZGVmaW5lIE1BQ0JfUlhfV0FERFJfU0laRQkJCTMwCisKKyNkZWZpbmUgTUFDQl9SWF9GUk1MRU5fT0ZGU0VUCQkJMAorI2RlZmluZSBNQUNCX1JYX0ZSTUxFTl9TSVpFCQkJMTIKKyNkZWZpbmUgTUFDQl9SWF9PRkZTRVRfT0ZGU0VUCQkJMTIKKyNkZWZpbmUgTUFDQl9SWF9PRkZTRVRfU0laRQkJCTIKKyNkZWZpbmUgTUFDQl9SWF9TT0ZfT0ZGU0VUCQkJMTQKKyNkZWZpbmUgTUFDQl9SWF9TT0ZfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9FT0ZfT0ZGU0VUCQkJMTUKKyNkZWZpbmUgTUFDQl9SWF9FT0ZfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9DRklfT0ZGU0VUCQkJMTYKKyNkZWZpbmUgTUFDQl9SWF9DRklfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9WTEFOX1BSSV9PRkZTRVQJCQkxNworI2RlZmluZSBNQUNCX1JYX1ZMQU5fUFJJX1NJWkUJCQkzCisjZGVmaW5lIE1BQ0JfUlhfUFJJX1RBR19PRkZTRVQJCQkyMAorI2RlZmluZSBNQUNCX1JYX1BSSV9UQUdfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9WTEFOX1RBR19PRkZTRVQJCQkyMQorI2RlZmluZSBNQUNCX1JYX1ZMQU5fVEFHX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfUlhfVFlQRUlEX01BVENIX09GRlNFVAkJMjIKKyNkZWZpbmUgTUFDQl9SWF9UWVBFSURfTUFUQ0hfU0laRQkJMQorI2RlZmluZSBNQUNCX1JYX1NBNF9NQVRDSF9PRkZTRVQJCTIzCisjZGVmaW5lIE1BQ0JfUlhfU0E0X01BVENIX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfUlhfU0EzX01BVENIX09GRlNFVAkJMjQKKyNkZWZpbmUgTUFDQl9SWF9TQTNfTUFUQ0hfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9TQTJfTUFUQ0hfT0ZGU0VUCQkyNQorI2RlZmluZSBNQUNCX1JYX1NBMl9NQVRDSF9TSVpFCQkJMQorI2RlZmluZSBNQUNCX1JYX1NBMV9NQVRDSF9PRkZTRVQJCTI2CisjZGVmaW5lIE1BQ0JfUlhfU0ExX01BVENIX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfUlhfRVhUX01BVENIX09GRlNFVAkJMjgKKyNkZWZpbmUgTUFDQl9SWF9FWFRfTUFUQ0hfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9SWF9VSEFTSF9NQVRDSF9PRkZTRVQJCTI5CisjZGVmaW5lIE1BQ0JfUlhfVUhBU0hfTUFUQ0hfU0laRQkJMQorI2RlZmluZSBNQUNCX1JYX01IQVNIX01BVENIX09GRlNFVAkJMzAKKyNkZWZpbmUgTUFDQl9SWF9NSEFTSF9NQVRDSF9TSVpFCQkxCisjZGVmaW5lIE1BQ0JfUlhfQlJPQURDQVNUX09GRlNFVAkJMzEKKyNkZWZpbmUgTUFDQl9SWF9CUk9BRENBU1RfU0laRQkJCTEKKworI2RlZmluZSBNQUNCX1RYX0ZSTUxFTl9PRkZTRVQJCQkwCisjZGVmaW5lIE1BQ0JfVFhfRlJNTEVOX1NJWkUJCQkxMQorI2RlZmluZSBNQUNCX1RYX0xBU1RfT0ZGU0VUCQkJMTUKKyNkZWZpbmUgTUFDQl9UWF9MQVNUX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfVFhfTk9DUkNfT0ZGU0VUCQkJMTYKKyNkZWZpbmUgTUFDQl9UWF9OT0NSQ19TSVpFCQkJMQorI2RlZmluZSBNQUNCX1RYX0JVRl9FWEhBVVNURURfT0ZGU0VUCQkyNworI2RlZmluZSBNQUNCX1RYX0JVRl9FWEhBVVNURURfU0laRQkJMQorI2RlZmluZSBNQUNCX1RYX1VOREVSUlVOX09GRlNFVAkJCTI4CisjZGVmaW5lIE1BQ0JfVFhfVU5ERVJSVU5fU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9UWF9FUlJPUl9PRkZTRVQJCQkyOQorI2RlZmluZSBNQUNCX1RYX0VSUk9SX1NJWkUJCQkxCisjZGVmaW5lIE1BQ0JfVFhfV1JBUF9PRkZTRVQJCQkzMAorI2RlZmluZSBNQUNCX1RYX1dSQVBfU0laRQkJCTEKKyNkZWZpbmUgTUFDQl9UWF9VU0VEX09GRlNFVAkJCTMxCisjZGVmaW5lIE1BQ0JfVFhfVVNFRF9TSVpFCQkJMQorCitzdHJ1Y3QgcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKKwlkbWFfYWRkcl90CQltYXBwaW5nOworfTsKKworLyoKKyAqIEhhcmR3YXJlLWNvbGxlY3RlZCBzdGF0aXN0aWNzLiBVc2VkIHdoZW4gdXBkYXRpbmcgdGhlIG5ldHdvcmsKKyAqIGRldmljZSBzdGF0cyBieSBhIHBlcmlvZGljIHRpbWVyLgorICovCitzdHJ1Y3QgbWFjYl9zdGF0cyB7CisJdTMyCXJ4X3BhdXNlX2ZyYW1lczsKKwl1MzIJdHhfb2s7CisJdTMyCXR4X3NpbmdsZV9jb2xzOworCXUzMgl0eF9tdWx0aXBsZV9jb2xzOworCXUzMglyeF9vazsKKwl1MzIJcnhfZmNzX2Vycm9yczsKKwl1MzIJcnhfYWxpZ25fZXJyb3JzOworCXUzMgl0eF9kZWZlcnJlZDsKKwl1MzIJdHhfbGF0ZV9jb2xzOworCXUzMgl0eF9leGNlc3NpdmVfY29sczsKKwl1MzIJdHhfdW5kZXJydW5zOworCXUzMgl0eF9jYXJyaWVyX2Vycm9yczsKKwl1MzIJcnhfcmVzb3VyY2VfZXJyb3JzOworCXUzMglyeF9vdmVycnVuczsKKwl1MzIJcnhfc3ltYm9sX2Vycm9yczsKKwl1MzIJcnhfb3ZlcnNpemVfcGt0czsKKwl1MzIJcnhfamFiYmVyczsKKwl1MzIJcnhfdW5kZXJzaXplX3BrdHM7CisJdTMyCXNxZV90ZXN0X2Vycm9yczsKKwl1MzIJcnhfbGVuZ3RoX21pc21hdGNoOworCXUzMgl0eF9wYXVzZV9mcmFtZXM7Cit9OworCitzdHJ1Y3QgbWFjYiB7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKworCXVuc2lnbmVkIGludAkJcnhfdGFpbDsKKwlzdHJ1Y3QgZG1hX2Rlc2MJCSpyeF9yaW5nOworCXZvaWQJCQkqcnhfYnVmZmVyczsKKworCXVuc2lnbmVkIGludAkJdHhfaGVhZCwgdHhfdGFpbDsKKwlzdHJ1Y3QgZG1hX2Rlc2MJCSp0eF9yaW5nOworCXN0cnVjdCByaW5nX2luZm8JKnR4X3NrYjsKKworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKKwlzdHJ1Y3QgY2xrCQkqcGNsazsKKwlzdHJ1Y3QgY2xrCQkqaGNsazsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCXN0cnVjdCBtYWNiX3N0YXRzCWh3X3N0YXRzOworCisJZG1hX2FkZHJfdAkJcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdAkJdHhfcmluZ19kbWE7CisJZG1hX2FkZHJfdAkJcnhfYnVmZmVyc19kbWE7CisKKwl1bnNpZ25lZCBpbnQJCXJ4X3BlbmRpbmcsIHR4X3BlbmRpbmc7CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXBlcmlvZGljX3Rhc2s7CisKKwlzdHJ1Y3QgbXV0ZXgJCW1kaW9fbXV0ZXg7CisJc3RydWN0IGNvbXBsZXRpb24JbWRpb19jb21wbGV0ZTsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8JbWlpOworfTsKKworI2VuZGlmIC8qIF9NQUNCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21ldGguYyBiL2RyaXZlcnMvbmV0L21ldGguYwppbmRleCBjMWFhNjBiLi5lMWQ5N2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbWV0aC5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8YXNtL2lwMzIvaXAzMl9pbnRzLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwppbmRleCA5OTk3MDgxLi5jNDFhZTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTI3Nyw5ICsyNzcsMTEgQEAKICAqCiAgKiBBY3R1YWwgcm91dGluZSB0byByZXNldCB0aGUgYWRhcHRlciB3aGVuIGEgdGltZW91dCBvbiBUeCBoYXMgb2NjdXJyZWQKICAqLwotc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF90eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp1Z2x5KQogewotCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IGNvbnRhaW5lcl9vZih1Z2x5LCBzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlLAorCQkJCQkJICB0eF90aW1lb3V0X3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtcC0+bWlpLmRldjsgLyogeXVjayAqLwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybjsKQEAgLTEwOTgsNyArMTEwMCw3IEBACiAJCQkJCSBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVDsKIAkJCW1wLT50eF9za2JbdHhfaW5kZXhdID0gc2tiOwogCQl9IGVsc2UKLQkJCW1wLT50eF9za2JbdHhfaW5kZXhdID0gMDsKKwkJCW1wLT50eF9za2JbdHhfaW5kZXhdID0gTlVMTDsKIAogCQlkZXNjID0gJm1wLT5wX3R4X2Rlc2NfYXJlYVt0eF9pbmRleF07CiAJCWRlc2MtPmw0aV9jaGsgPSAwOwpAQCAtMTEzNCw3ICsxMTM2LDcgQEAKIAkJZXRoX3R4X2ZpbGxfZnJhZ19kZXNjcyhtcCwgc2tiKTsKIAogCQlsZW5ndGggPSBza2JfaGVhZGxlbihza2IpOwotCQltcC0+dHhfc2tiW3R4X2luZGV4XSA9IDA7CisJCW1wLT50eF9za2JbdHhfaW5kZXhdID0gTlVMTDsKIAl9IGVsc2UgewogCQljbWRfc3RzIHw9IEVUSF9aRVJPX1BBRERJTkcgfAogCQkJICAgRVRIX1RYX0xBU1RfREVTQyB8CkBAIC0xMzYwLDggKzEzNjIsNyBAQAogI2VuZGlmCiAKIAkvKiBDb25maWd1cmUgdGhlIHRpbWVvdXQgdGFzayAqLwotCUlOSVRfV09SSygmbXAtPnR4X3RpbWVvdXRfdGFzaywKLQkJCSh2b2lkICgqKSh2b2lkICopKW12NjQzeHhfZXRoX3R4X3RpbWVvdXRfdGFzaywgZGV2KTsKKwlJTklUX1dPUksoJm1wLT50eF90aW1lb3V0X3Rhc2ssIG12NjQzeHhfZXRoX3R4X3RpbWVvdXRfdGFzayk7CiAKIAlzcGluX2xvY2tfaW5pdCgmbXAtPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tdm1lMTQ3LmMgYi9kcml2ZXJzL25ldC9tdm1lMTQ3LmMKaW5kZXggNTZhODJkOC4uZTI0NmQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXZtZTE0Ny5jCisrKyBiL2RyaXZlcnMvbmV0L212bWUxNDcuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X212bWUxNDdfbGFuY2U7Ci1pbnQgaW5pdF9tb2R1bGUodm9pZCkKK2ludCBfX2luaXQgaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlkZXZfbXZtZTE0N19sYW5jZSA9IG12bWUxNDdsYW5jZV9wcm9iZSgtMSk7CiAJaWYgKElTX0VSUihkZXZfbXZtZTE0N19sYW5jZSkpCkBAIC0xOTIsNyArMTkyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlzdHJ1Y3QgbTE0N2xhbmNlX3ByaXZhdGUgKmxwID0gZGV2X212bWUxNDdfbGFuY2UtPnByaXY7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X212bWUxNDdfbGFuY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKaW5kZXggZmRiYjBkNy4uOTRhYzE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC03MSw3ICs3MSw3IEBACiAjaW5jbHVkZSAibXlyaTEwZ2VfbWNwLmgiCiAjaW5jbHVkZSAibXlyaTEwZ2VfbWNwX2dlbl9oZWFkZXIuaCIKIAotI2RlZmluZSBNWVJJMTBHRV9WRVJTSU9OX1NUUiAiMS4wLjAiCisjZGVmaW5lIE1ZUkkxMEdFX1ZFUlNJT05fU1RSICIxLjEuMCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNeXJpY29tIDEwRyBkcml2ZXIgKDEwR2JFKSIpOwogTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogaGVscEBteXJpLmNvbSIpOwpAQCAtODksMTEgKzg5LDE2IEBACiAjZGVmaW5lIE1ZUkkxMEdFX0VFUFJPTV9TVFJJTkdTX1NJWkUgMjU2CiAjZGVmaW5lIE1ZUkkxMEdFX01BWF9TRU5EX0RFU0NfVFNPICgoNjU1MzYgLyAyMDQ4KSAqIDIpCiAKLSNkZWZpbmUgTVlSSTEwR0VfTk9fQ09ORklSTV9EQVRBIDB4ZmZmZmZmZmYKKyNkZWZpbmUgTVlSSTEwR0VfTk9fQ09ORklSTV9EQVRBIGh0b25sKDB4ZmZmZmZmZmYpCiAjZGVmaW5lIE1ZUkkxMEdFX05PX1JFU1BPTlNFX1JFU1VMVCAweGZmZmZmZmZmCiAKKyNkZWZpbmUgTVlSSTEwR0VfQUxMT0NfT1JERVIgMAorI2RlZmluZSBNWVJJMTBHRV9BTExPQ19TSVpFICgoMSA8PCBNWVJJMTBHRV9BTExPQ19PUkRFUikgKiBQQUdFX1NJWkUpCisjZGVmaW5lIE1ZUkkxMEdFX01BWF9GUkFHU19QRVJfRlJBTUUgKE1ZUkkxMEdFX01BWF9FVEhFUl9NVFUvTVlSSTEwR0VfQUxMT0NfU0laRSArIDEpCisKIHN0cnVjdCBteXJpMTBnZV9yeF9idWZmZXJfc3RhdGUgewotCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHBhZ2Vfb2Zmc2V0OwogCSBERUNMQVJFX1BDSV9VTk1BUF9BRERSKGJ1cykKIAkgREVDTEFSRV9QQ0lfVU5NQVBfTEVOKGxlbikKIH07CkBAIC0xMTYsOSArMTIxLDE0IEBACiAJdTggX19pb21lbSAqd2NfZmlmbzsJLyogdy9jIHJ4IGRtYSBhZGRyIGZpZm8gYWRkcmVzcyAqLwogCXN0cnVjdCBtY3Bfa3JlcV9ldGhlcl9yZWN2ICpzaGFkb3c7CS8qIGhvc3Qgc2hhZG93IG9mIHJlY3YgcmluZyAqLwogCXN0cnVjdCBteXJpMTBnZV9yeF9idWZmZXJfc3RhdGUgKmluZm87CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZG1hX2FkZHJfdCBidXM7CisJaW50IHBhZ2Vfb2Zmc2V0OwogCWludCBjbnQ7CisJaW50IGZpbGxfY250OwogCWludCBhbGxvY19mYWlsOwogCWludCBtYXNrOwkJLyogbnVtYmVyIG9mIHJ4IHNsb3RzIC0xICovCisJaW50IHdhdGNoZG9nX25lZWRlZDsKIH07CiAKIHN0cnVjdCBteXJpMTBnZV90eF9idWYgewpAQCAtMTUwLDE0ICsxNjAsMTUgQEAKIAlzdHJ1Y3QgbXlyaTEwZ2VfcnhfYnVmIHJ4X2JpZzsKIAlzdHJ1Y3QgbXlyaTEwZ2VfcnhfZG9uZSByeF9kb25lOwogCWludCBzbWFsbF9ieXRlczsKKwlpbnQgYmlnX2J5dGVzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJdTggX19pb21lbSAqc3JhbTsKIAlpbnQgc3JhbV9zaXplOwogCXVuc2lnbmVkIGxvbmcgYm9hcmRfc3BhbjsKIAl1bnNpZ25lZCBsb25nIGlvbWVtX2Jhc2U7Ci0JdTMyIF9faW9tZW0gKmlycV9jbGFpbTsKLQl1MzIgX19pb21lbSAqaXJxX2RlYXNzZXJ0OworCV9fYmUzMiBfX2lvbWVtICppcnFfY2xhaW07CisJX19iZTMyIF9faW9tZW0gKmlycV9kZWFzc2VydDsKIAljaGFyICptYWNfYWRkcl9zdHJpbmc7CiAJc3RydWN0IG1jcF9jbWRfcmVzcG9uc2UgKmNtZDsKIAlkbWFfYWRkcl90IGNtZF9idXM7CkBAIC0xNjUsMTAgKzE3NiwxMCBAQAogCWRtYV9hZGRyX3QgZndfc3RhdHNfYnVzOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCWludCBtc2lfZW5hYmxlZDsKLQl1bnNpZ25lZCBpbnQgbGlua19zdGF0ZTsKKwlfX2JlMzIgbGlua19zdGF0ZTsKIAl1bnNpZ25lZCBpbnQgcmRtYV90YWdzX2F2YWlsYWJsZTsKIAlpbnQgaW50cl9jb2FsX2RlbGF5OwotCXUzMiBfX2lvbWVtICppbnRyX2NvYWxfZGVsYXlfcHRyOworCV9fYmUzMiBfX2lvbWVtICppbnRyX2NvYWxfZGVsYXlfcHRyOwogCWludCBtdHJyOwogCWludCB3YWtlX3F1ZXVlOwogCWludCBzdG9wX3F1ZXVlOwpAQCAtMjM4LDExICsyNDksNiBAQAogTU9EVUxFX1BBUk1fREVTQyhteXJpMTBnZV9mb3JjZV9maXJtd2FyZSwKIAkJICJGb3JjZSBmaXJtd2FyZSB0byBhc3N1bWUgYWxpZ25lZCBjb21wbGV0aW9uc1xuIik7CiAKLXN0YXRpYyBpbnQgbXlyaTEwZ2Vfc2tiX2Nyb3NzXzRrID0gMDsKLW1vZHVsZV9wYXJhbShteXJpMTBnZV9za2JfY3Jvc3NfNGssIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhteXJpMTBnZV9za2JfY3Jvc3NfNGssCi0JCSAiQ2FuIGEgc21hbGwgc2tiIGNyb3NzIGEgNEtCIGJvdW5kYXJ5P1xuIik7Ci0KIHN0YXRpYyBpbnQgbXlyaTEwZ2VfaW5pdGlhbF9tdHUgPSBNWVJJMTBHRV9NQVhfRVRIRVJfTVRVIC0gRVRIX0hMRU47CiBtb2R1bGVfcGFyYW0obXlyaTEwZ2VfaW5pdGlhbF9tdHUsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG15cmkxMGdlX2luaXRpYWxfbXR1LCAiSW5pdGlhbCBNVFVcbiIpOwpAQCAtMjY2LDYgKzI3MiwxMCBAQAogbW9kdWxlX3BhcmFtKG15cmkxMGdlX2RlYnVnLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhteXJpMTBnZV9kZWJ1ZywgIkRlYnVnIGxldmVsICgwPW5vbmUsLi4uLDE2PWFsbCkiKTsKIAorc3RhdGljIGludCBteXJpMTBnZV9maWxsX3RocmVzaCA9IDI1NjsKK21vZHVsZV9wYXJhbShteXJpMTBnZV9maWxsX3RocmVzaCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG15cmkxMGdlX2ZpbGxfdGhyZXNoLCAiTnVtYmVyIG9mIGVtcHR5IHJ4IHNsb3RzIGFsbG93ZWRcbiIpOworCiAjZGVmaW5lIE1ZUkkxMEdFX0ZXX09GRlNFVCAxMDI0KjEwMjQKICNkZWZpbmUgTVlSSTEwR0VfSElHSFBBUlRfVE9fVTMyKFgpIFwKIChzaXplb2YgKFgpID09IDgpID8gKCh1MzIpKCh1NjQpKFgpID4+IDMyKSkgOiAoMCkKQEAgLTI3Myw2ICsyODMsMTEgQEAKIAogI2RlZmluZSBteXJpMTBnZV9waW9fY29weSh0byxmcm9tLHNpemUpIF9faW93cml0ZTY0X2NvcHkodG8sZnJvbSxzaXplLzgpCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfYmUzMihfX2JlMzIgdmFsLCBfX2JlMzIgX19pb21lbSAqIHApCit7CisJX19yYXdfd3JpdGVsKChfX2ZvcmNlIF9fdTMyKSB2YWwsIChfX2ZvcmNlIHZvaWQgX19pb21lbSAqKXApOworfQorCiBzdGF0aWMgaW50CiBteXJpMTBnZV9zZW5kX2NtZChzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwLCB1MzIgY21kLAogCQkgIHN0cnVjdCBteXJpMTBnZV9jbWQgKmRhdGEsIGludCBhdG9taWMpCkBAIC0yOTYsNyArMzExLDcgQEAKIAogCWJ1Zi0+cmVzcG9uc2VfYWRkci5sb3cgPSBodG9ubChkbWFfbG93KTsKIAlidWYtPnJlc3BvbnNlX2FkZHIuaGlnaCA9IGh0b25sKGRtYV9oaWdoKTsKLQlyZXNwb25zZS0+cmVzdWx0ID0gTVlSSTEwR0VfTk9fUkVTUE9OU0VfUkVTVUxUOworCXJlc3BvbnNlLT5yZXN1bHQgPSBodG9ubChNWVJJMTBHRV9OT19SRVNQT05TRV9SRVNVTFQpOwogCW1iKCk7CiAJbXlyaTEwZ2VfcGlvX2NvcHkoY21kX2FkZHIsIGJ1Ziwgc2l6ZW9mKCpidWYpKTsKIApAQCAtMzExLDE0ICszMjYsMTQgQEAKIAkJICogKDFtcyB3aWxsIGJlIGVub3VnaCBmb3IgdGhvc2UgY29tbWFuZHMpICovCiAJCWZvciAoc2xlZXBfdG90YWwgPSAwOwogCQkgICAgIHNsZWVwX3RvdGFsIDwgMTAwMAotCQkgICAgICYmIHJlc3BvbnNlLT5yZXN1bHQgPT0gTVlSSTEwR0VfTk9fUkVTUE9OU0VfUkVTVUxUOworCQkgICAgICYmIHJlc3BvbnNlLT5yZXN1bHQgPT0gaHRvbmwoTVlSSTEwR0VfTk9fUkVTUE9OU0VfUkVTVUxUKTsKIAkJICAgICBzbGVlcF90b3RhbCArPSAxMCkKIAkJCXVkZWxheSgxMCk7CiAJfSBlbHNlIHsKIAkJLyogdXNlIG1zbGVlcCBmb3IgbW9zdCBjb21tYW5kICovCiAJCWZvciAoc2xlZXBfdG90YWwgPSAwOwogCQkgICAgIHNsZWVwX3RvdGFsIDwgMTUKLQkJICAgICAmJiByZXNwb25zZS0+cmVzdWx0ID09IE1ZUkkxMEdFX05PX1JFU1BPTlNFX1JFU1VMVDsKKwkJICAgICAmJiByZXNwb25zZS0+cmVzdWx0ID09IGh0b25sKE1ZUkkxMEdFX05PX1JFU1BPTlNFX1JFU1VMVCk7CiAJCSAgICAgc2xlZXBfdG90YWwrKykKIAkJCW1zbGVlcCgxKTsKIAl9CkBAIC0zOTMsNyArNDA4LDcgQEAKIHN0YXRpYyB2b2lkIG15cmkxMGdlX2R1bW15X3JkbWEoc3RydWN0IG15cmkxMGdlX3ByaXYgKm1ncCwgaW50IGVuYWJsZSkKIHsKIAljaGFyIF9faW9tZW0gKnN1Ym1pdDsKLQl1MzIgYnVmWzE2XTsKKwlfX2JlMzIgYnVmWzE2XTsKIAl1MzIgZG1hX2xvdywgZG1hX2hpZ2g7CiAJaW50IGk7CiAKQEAgLTQxMCw3ICs0MjUsNyBAQAogCiAJYnVmWzBdID0gaHRvbmwoZG1hX2hpZ2gpOwkvKiBjb25maXJtIGFkZHIgTVNXICovCiAJYnVmWzFdID0gaHRvbmwoZG1hX2xvdyk7CS8qIGNvbmZpcm0gYWRkciBMU1cgKi8KLQlidWZbMl0gPSBodG9ubChNWVJJMTBHRV9OT19DT05GSVJNX0RBVEEpOwkvKiBjb25maXJtIGRhdGEgKi8KKwlidWZbMl0gPSBNWVJJMTBHRV9OT19DT05GSVJNX0RBVEE7CS8qIGNvbmZpcm0gZGF0YSAqLwogCWJ1ZlszXSA9IGh0b25sKGRtYV9oaWdoKTsJLyogZHVtbXkgYWRkciBNU1cgKi8KIAlidWZbNF0gPSBodG9ubChkbWFfbG93KTsJLyogZHVtbXkgYWRkciBMU1cgKi8KIAlidWZbNV0gPSBodG9ubChlbmFibGUpOwkvKiBlbmFibGU/ICovCkBAIC00NzksNyArNDk0LDcgQEAKIAl9CiAKIAkvKiBjaGVjayBpZCAqLwotCWhkcl9vZmZzZXQgPSBudG9obCgqKHUzMiAqKSAoZnctPmRhdGEgKyBNQ1BfSEVBREVSX1BUUl9PRkZTRVQpKTsKKwloZHJfb2Zmc2V0ID0gbnRvaGwoKihfX2JlMzIgKikgKGZ3LT5kYXRhICsgTUNQX0hFQURFUl9QVFJfT0ZGU0VUKSk7CiAJaWYgKChoZHJfb2Zmc2V0ICYgMykgfHwgaGRyX29mZnNldCArIHNpemVvZigqaGRyKSA+IGZ3LT5zaXplKSB7CiAJCWRldl9lcnIoZGV2LCAiQmFkIGZpcm13YXJlIGZpbGVcbiIpOwogCQlzdGF0dXMgPSAtRUlOVkFMOwpAQCAtNTUwLDcgKzU2NSw3IEBACiBzdGF0aWMgaW50IG15cmkxMGdlX2xvYWRfZmlybXdhcmUoc3RydWN0IG15cmkxMGdlX3ByaXYgKm1ncCkKIHsKIAljaGFyIF9faW9tZW0gKnN1Ym1pdDsKLQl1MzIgYnVmWzE2XTsKKwlfX2JlMzIgYnVmWzE2XTsKIAl1MzIgZG1hX2xvdywgZG1hX2hpZ2gsIHNpemU7CiAJaW50IHN0YXR1cywgaTsKIApAQCAtNjAwLDcgKzYxNSw3IEBACiAKIAlidWZbMF0gPSBodG9ubChkbWFfaGlnaCk7CS8qIGNvbmZpcm0gYWRkciBNU1cgKi8KIAlidWZbMV0gPSBodG9ubChkbWFfbG93KTsJLyogY29uZmlybSBhZGRyIExTVyAqLwotCWJ1ZlsyXSA9IGh0b25sKE1ZUkkxMEdFX05PX0NPTkZJUk1fREFUQSk7CS8qIGNvbmZpcm0gZGF0YSAqLworCWJ1ZlsyXSA9IE1ZUkkxMEdFX05PX0NPTkZJUk1fREFUQTsJLyogY29uZmlybSBkYXRhICovCiAKIAkvKiBGSVg6IEFsbCBuZXdlc3QgZmlybXdhcmUgc2hvdWxkIHVuLXByb3RlY3QgdGhlIGJvdHRvbSBvZgogCSAqIHRoZSBzcmFtIGJlZm9yZSBoYW5kb2ZmLiBIb3dldmVyLCB0aGUgdmVyeSBmaXJzdCBpbnRlcmZhY2VzCkBAIC03MDUsMjEgKzcyMCwyMSBAQAogCiAJc3RhdHVzIHw9CiAJICAgIG15cmkxMGdlX3NlbmRfY21kKG1ncCwgTVhHRUZXX0NNRF9HRVRfSVJRX0FDS19PRkZTRVQsICZjbWQsIDApOwotCW1ncC0+aXJxX2NsYWltID0gKF9faW9tZW0gdTMyICopIChtZ3AtPnNyYW0gKyBjbWQuZGF0YTApOworCW1ncC0+aXJxX2NsYWltID0gKF9faW9tZW0gX19iZTMyICopIChtZ3AtPnNyYW0gKyBjbWQuZGF0YTApOwogCWlmICghbWdwLT5tc2lfZW5hYmxlZCkgewogCQlzdGF0dXMgfD0gbXlyaTEwZ2Vfc2VuZF9jbWQKIAkJICAgIChtZ3AsIE1YR0VGV19DTURfR0VUX0lSUV9ERUFTU0VSVF9PRkZTRVQsICZjbWQsIDApOwotCQltZ3AtPmlycV9kZWFzc2VydCA9IChfX2lvbWVtIHUzMiAqKSAobWdwLT5zcmFtICsgY21kLmRhdGEwKTsKKwkJbWdwLT5pcnFfZGVhc3NlcnQgPSAoX19pb21lbSBfX2JlMzIgKikgKG1ncC0+c3JhbSArIGNtZC5kYXRhMCk7CiAKIAl9CiAJc3RhdHVzIHw9IG15cmkxMGdlX3NlbmRfY21kCiAJICAgIChtZ3AsIE1YR0VGV19DTURfR0VUX0lOVFJfQ09BTF9ERUxBWV9PRkZTRVQsICZjbWQsIDApOwotCW1ncC0+aW50cl9jb2FsX2RlbGF5X3B0ciA9IChfX2lvbWVtIHUzMiAqKSAobWdwLT5zcmFtICsgY21kLmRhdGEwKTsKKwltZ3AtPmludHJfY29hbF9kZWxheV9wdHIgPSAoX19pb21lbSBfX2JlMzIgKikgKG1ncC0+c3JhbSArIGNtZC5kYXRhMCk7CiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCWRldl9lcnIoJm1ncC0+cGRldi0+ZGV2LCAiZmFpbGVkIHNldCBpbnRlcnJ1cHQgcGFyYW1ldGVyc1xuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCV9fcmF3X3dyaXRlbChodG9ubChtZ3AtPmludHJfY29hbF9kZWxheSksIG1ncC0+aW50cl9jb2FsX2RlbGF5X3B0cik7CisJcHV0X2JlMzIoaHRvbmwobWdwLT5pbnRyX2NvYWxfZGVsYXkpLCBtZ3AtPmludHJfY29hbF9kZWxheV9wdHIpOwogCiAJLyogUnVuIGEgc21hbGwgRE1BIHRlc3QuCiAJICogVGhlIG1hZ2ljIG11bHRpcGxpZXJzIHRvIHRoZSBsZW5ndGggdGVsbCB0aGUgZmlybXdhcmUKQEAgLTc4NiwxNjQgKzgwMSwyNCBAQAogbXlyaTEwZ2Vfc3VibWl0XzhyeChzdHJ1Y3QgbWNwX2tyZXFfZXRoZXJfcmVjdiBfX2lvbWVtICogZHN0LAogCQkgICAgc3RydWN0IG1jcF9rcmVxX2V0aGVyX3JlY3YgKnNyYykKIHsKLQl1MzIgbG93OworCV9fYmUzMiBsb3c7CiAKIAlsb3cgPSBzcmMtPmFkZHJfbG93OwotCXNyYy0+YWRkcl9sb3cgPSBETUFfMzJCSVRfTUFTSzsKLQlteXJpMTBnZV9waW9fY29weShkc3QsIHNyYywgOCAqIHNpemVvZigqc3JjKSk7CisJc3JjLT5hZGRyX2xvdyA9IGh0b25sKERNQV8zMkJJVF9NQVNLKTsKKwlteXJpMTBnZV9waW9fY29weShkc3QsIHNyYywgNCAqIHNpemVvZigqc3JjKSk7CisJbWIoKTsKKwlteXJpMTBnZV9waW9fY29weShkc3QgKyA0LCBzcmMgKyA0LCA0ICogc2l6ZW9mKCpzcmMpKTsKIAltYigpOwogCXNyYy0+YWRkcl9sb3cgPSBsb3c7Ci0JX19yYXdfd3JpdGVsKGxvdywgJmRzdC0+YWRkcl9sb3cpOworCXB1dF9iZTMyKGxvdywgJmRzdC0+YWRkcl9sb3cpOwogCW1iKCk7CiB9CiAKLS8qCi0gKiBTZXQgb2Ygcm91dGluZXMgdG8gZ2V0IGEgbmV3IHJlY2VpdmUgYnVmZmVyLiAgQW55IGJ1ZmZlciB3aGljaAotICogY3Jvc3NlcyBhIDRLQiBib3VuZGFyeSBtdXN0IHN0YXJ0IG9uIGEgNEtCIGJvdW5kYXJ5IGR1ZSB0byBQQ0llCi0gKiB3ZG1hIHJlc3RyaWN0aW9ucy4gV2UgYWxzbyB0cnkgdG8gYWxpZ24gYW55IHNtYWxsZXIgYWxsb2NhdGlvbiB0bwotICogYXQgbGVhc3QgYSAxNiBieXRlIGJvdW5kYXJ5IGZvciBlZmZpY2llbmN5LiAgV2UgYXNzdW1lIHRoZSBsaW51eAotICogbWVtb3J5IGFsbG9jYXRvciB3b3JrcyBieSBwb3dlcnMgb2YgMiwgYW5kIHdpbGwgbm90IHJldHVybiBtZW1vcnkKLSAqIHNtYWxsZXIgdGhhbiAyS0Igd2hpY2ggY3Jvc3NlcyBhIDRLQiBib3VuZGFyeS4gIElmIGl0IGRvZXMsIHdlIGZhbGwKLSAqIGJhY2sgdG8gYWxsb2NhdGluZyAyeCBhcyBtdWNoIHNwYWNlIGFzIHJlcXVpcmVkLgotICoKLSAqIFdlIGludGVuZCB0byByZXBsYWNlIGxhcmdlICg+NEtCKSBza2IgYWxsb2NhdGlvbnMgYnkgdXNpbmcKLSAqIHBhZ2VzIGRpcmVjdGx5IGFuZCBidWlsZGluZyBhIGZyYWdsaXN0IGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpteXJpMTBnZV9hbGxvY19iaWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCSBpbnQgYnl0ZXMpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBsb25nIGRhdGEsIHJvdW5kdXA7Ci0KLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgYnl0ZXMgKyA0MDk2ICsgTVhHRUZXX1BBRCk7Ci0JaWYgKHNrYiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIENvcnJlY3Qgc2tiLT50cnVlc2l6ZSBzbyB0aGF0IHNvY2tldCBidWZmZXIKLQkgKiBhY2NvdW50aW5nIGlzIG5vdCBjb25mdXNlZCB0aGUgcm91bmRpbmcgd2UgbXVzdAotCSAqIGRvIHRvIHNhdGlzZnkgYWxpZ25tZW50IGNvbnN0cmFpbnRzLgotCSAqLwotCXNrYi0+dHJ1ZXNpemUgLT0gNDA5NjsKLQotCWRhdGEgPSAodW5zaWduZWQgbG9uZykoc2tiLT5kYXRhKTsKLQlyb3VuZHVwID0gKC1kYXRhKSAmICg0MDk1KTsKLQlza2JfcmVzZXJ2ZShza2IsIHJvdW5kdXApOwotCXJldHVybiBza2I7Ci19Ci0KLS8qIEFsbG9jYXRlIDJ4IGFzIG11Y2ggc3BhY2UgYXMgcmVxdWlyZWQgYW5kIHVzZSB3aGljaGV2ZXIgcG9ydGlvbgotICogZG9lcyBub3QgY3Jvc3MgYSA0S0IgYm91bmRhcnkgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm15cmkxMGdlX2FsbG9jX3NtYWxsX3NhZmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCQl1bnNpZ25lZCBpbnQgYnl0ZXMpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBsb25nIGRhdGEsIGJvdW5kYXJ5OwotCi0Jc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIDIgKiAoYnl0ZXMgKyBNWEdFRldfUEFEKSAtIDEpOwotCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCi0JLyogQ29ycmVjdCBza2ItPnRydWVzaXplIHNvIHRoYXQgc29ja2V0IGJ1ZmZlcgotCSAqIGFjY291bnRpbmcgaXMgbm90IGNvbmZ1c2VkIHRoZSByb3VuZGluZyB3ZSBtdXN0Ci0JICogZG8gdG8gc2F0aXNmeSBhbGlnbm1lbnQgY29uc3RyYWludHMuCi0JICovCi0Jc2tiLT50cnVlc2l6ZSAtPSBieXRlcyArIE1YR0VGV19QQUQ7Ci0KLQlkYXRhID0gKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSk7Ci0JYm91bmRhcnkgPSAoZGF0YSArIDQwOTVVTCkgJiB+NDA5NVVMOwotCWlmICgoYm91bmRhcnkgLSBkYXRhKSA+PSAoYnl0ZXMgKyBNWEdFRldfUEFEKSkKLQkJcmV0dXJuIHNrYjsKLQotCXNrYl9yZXNlcnZlKHNrYiwgYm91bmRhcnkgLSBkYXRhKTsKLQlyZXR1cm4gc2tiOwotfQotCi0vKiBBbGxvY2F0ZSBqdXN0IGVub3VnaCBzcGFjZSwgYW5kIHZlcmlmeSB0aGF0IHRoZSBhbGxvY2F0ZWQKLSAqIHNwYWNlIGRvZXMgbm90IGNyb3NzIGEgNEtCIGJvdW5kYXJ5ICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpteXJpMTBnZV9hbGxvY19zbWFsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJICAgaW50IGJ5dGVzKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgbG9uZyByb3VuZHVwLCBkYXRhLCBlbmQ7Ci0KLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgYnl0ZXMgKyAxNiArIE1YR0VGV19QQUQpOwotCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCi0JLyogUm91bmQgYWxsb2NhdGVkIGJ1ZmZlciB0byAxNiBieXRlIGJvdW5kYXJ5ICovCi0JZGF0YSA9ICh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEpOwotCXJvdW5kdXAgPSAoLWRhdGEpICYgMTVVTDsKLQlza2JfcmVzZXJ2ZShza2IsIHJvdW5kdXApOwotCS8qIFZlcmlmeSB0aGF0IHRoZSBkYXRhIGJ1ZmZlciBkb2VzIG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkgKi8KLQlkYXRhID0gKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSk7Ci0JZW5kID0gZGF0YSArIGJ5dGVzICsgTVhHRUZXX1BBRCAtIDE7Ci0JaWYgKHVubGlrZWx5KCgoZW5kID4+IDEyKSAhPSAoZGF0YSA+PiAxMikpICYmIChkYXRhICYgNDA5NVVMKSkpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAibXlyaTEwZ2VfYWxsb2Nfc21hbGw6IHNtYWxsIHNrYiBjcm9zc2VkIDRLQiBib3VuZGFyeVxuIik7Ci0JCW15cmkxMGdlX3NrYl9jcm9zc180ayA9IDE7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXNrYiA9IG15cmkxMGdlX2FsbG9jX3NtYWxsX3NhZmUoZGV2LCBieXRlcyk7Ci0JfQotCXJldHVybiBza2I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1teXJpMTBnZV9nZXRidWYoc3RydWN0IG15cmkxMGdlX3J4X2J1ZiAqcngsIHN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3AsCi0JCWludCBieXRlcywgaW50IGlkeCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWdwLT5kZXY7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBtZ3AtPnBkZXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlkbWFfYWRkcl90IGJ1czsKLQlpbnQgbGVuLCByZXR2YWwgPSAwOwotCi0JYnl0ZXMgKz0gVkxBTl9ITEVOOwkvKiBhY2NvdW50IGZvciA4MDIuMXEgdmxhbiB0YWcgKi8KLQotCWlmICgoYnl0ZXMgKyBNWEdFRldfUEFEKSA+ICg0MDk2IC0gMTYpIC8qIGxpbnV4IG92ZXJoZWFkICovICkKLQkJc2tiID0gbXlyaTEwZ2VfYWxsb2NfYmlnKGRldiwgYnl0ZXMpOwotCWVsc2UgaWYgKG15cmkxMGdlX3NrYl9jcm9zc180aykKLQkJc2tiID0gbXlyaTEwZ2VfYWxsb2Nfc21hbGxfc2FmZShkZXYsIGJ5dGVzKTsKLQllbHNlCi0JCXNrYiA9IG15cmkxMGdlX2FsbG9jX3NtYWxsKGRldiwgYnl0ZXMpOwotCi0JaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkgewotCQlyeC0+YWxsb2NfZmFpbCsrOwotCQlyZXR2YWwgPSAtRU5PQlVGUzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIHNldCBsZW4gc28gdGhhdCBpdCBvbmx5IGNvdmVycyB0aGUgYXJlYSB3ZQotCSAqIG5lZWQgbWFwcGVkIGZvciBETUEgKi8KLQlsZW4gPSBieXRlcyArIE1YR0VGV19QQUQ7Ci0KLQlidXMgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQlyeC0+aW5mb1tpZHhdLnNrYiA9IHNrYjsKLQlwY2lfdW5tYXBfYWRkcl9zZXQoJnJ4LT5pbmZvW2lkeF0sIGJ1cywgYnVzKTsKLQlwY2lfdW5tYXBfbGVuX3NldCgmcngtPmluZm9baWR4XSwgbGVuLCBsZW4pOwotCXJ4LT5zaGFkb3dbaWR4XS5hZGRyX2xvdyA9IGh0b25sKE1ZUkkxMEdFX0xPV1BBUlRfVE9fVTMyKGJ1cykpOwotCXJ4LT5zaGFkb3dbaWR4XS5hZGRyX2hpZ2ggPSBodG9ubChNWVJJMTBHRV9ISUdIUEFSVF9UT19VMzIoYnVzKSk7Ci0KLWRvbmU6Ci0JLyogY29weSA4IGRlc2NyaXB0b3JzICg2NC1ieXRlcykgdG8gdGhlIG1jcCBhdCBhIHRpbWUgKi8KLQlpZiAoKGlkeCAmIDcpID09IDcpIHsKLQkJaWYgKHJ4LT53Y19maWZvID09IE5VTEwpCi0JCQlteXJpMTBnZV9zdWJtaXRfOHJ4KCZyeC0+bGFuYWlbaWR4IC0gN10sCi0JCQkJCSAgICAmcngtPnNoYWRvd1tpZHggLSA3XSk7Ci0JCWVsc2UgewotCQkJbWIoKTsKLQkJCW15cmkxMGdlX3Bpb19jb3B5KHJ4LT53Y19maWZvLAotCQkJCQkgICZyeC0+c2hhZG93W2lkeCAtIDddLCA2NCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG15cmkxMGdlX3ZsYW5faXBfY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgaHdfY3N1bSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBteXJpMTBnZV92bGFuX2lwX2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgX193c3VtIGh3X2NzdW0pCiB7CiAJc3RydWN0IHZsYW5faGRyICp2aCA9IChzdHJ1Y3Qgdmxhbl9oZHIgKikoc2tiLT5kYXRhKTsKIAotCWlmICgoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF84MDIxUSkpICYmCisJaWYgKChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgJiYKIAkgICAgKHZoLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSB8fAogCSAgICAgdmgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVBWNikpKSB7CiAJCXNrYi0+Y3N1bSA9IGh3X2NzdW07CkBAIC05NTEsNTEgKzgyNiwxNzcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotbXlyaTEwZ2VfcnhfZG9uZShzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiAqbWdwLCBzdHJ1Y3QgbXlyaTEwZ2VfcnhfYnVmICpyeCwKLQkJIGludCBieXRlcywgaW50IGxlbiwgaW50IGNzdW0pCitzdGF0aWMgaW5saW5lIHZvaWQKK215cmkxMGdlX3J4X3NrYl9idWlsZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqIHZhLAorCQkgICAgICBzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpyeF9mcmFncywgaW50IGxlbiwgaW50IGhsZW4pCiB7Ci0JZG1hX2FkZHJfdCBidXM7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqc2tiX2ZyYWdzOworCisJc2tiLT5sZW4gPSBza2ItPmRhdGFfbGVuID0gbGVuOworCXNrYi0+dHJ1ZXNpemUgPSBsZW4gKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOworCS8qIGF0dGFjaCB0aGUgcGFnZShzKSAqLworCisJc2tiX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnczsKKwl3aGlsZSAobGVuID4gMCkgeworCQltZW1jcHkoc2tiX2ZyYWdzLCByeF9mcmFncywgc2l6ZW9mKCpza2JfZnJhZ3MpKTsKKwkJbGVuIC09IHJ4X2ZyYWdzLT5zaXplOworCQlza2JfZnJhZ3MrKzsKKwkJcnhfZnJhZ3MrKzsKKwkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncysrOworCX0KKworCS8qIHBza2JfbWF5X3B1bGwgaXMgbm90IGF2YWlsYWJsZSBpbiBpcnEgY29udGV4dCwgYnV0CisJICogc2tiX3B1bGwoKSAoZm9yIGV0aGVyX3BhZCBhbmQgZXRoX3R5cGVfdHJhbnMoKSkgcmVxdWlyZXMKKwkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgaW4gc2tiX2hlYWRsZW4oKSwgbW92ZSBpdAorCSAqIG1hbnVhbGx5ICovCisJbWVtY3B5KHNrYi0+ZGF0YSwgdmEsIGhsZW4pOworCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbMF0ucGFnZV9vZmZzZXQgKz0gaGxlbjsKKwlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnNpemUgLT0gaGxlbjsKKwlza2ItPmRhdGFfbGVuIC09IGhsZW47CisJc2tiLT50YWlsICs9IGhsZW47CisJc2tiX3B1bGwoc2tiLCBNWEdFRldfUEFEKTsKK30KKworc3RhdGljIHZvaWQKK215cmkxMGdlX2FsbG9jX3J4X3BhZ2VzKHN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3AsIHN0cnVjdCBteXJpMTBnZV9yeF9idWYgKnJ4LAorCQkJaW50IGJ5dGVzLCBpbnQgd2F0Y2hkb2cpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGlkeDsKKworCWlmICh1bmxpa2VseShyeC0+d2F0Y2hkb2dfbmVlZGVkICYmICF3YXRjaGRvZykpCisJCXJldHVybjsKKworCS8qIHRyeSB0byByZWZpbGwgZW50aXJlIHJpbmcgKi8KKwl3aGlsZSAocngtPmZpbGxfY250ICE9IChyeC0+Y250ICsgcngtPm1hc2sgKyAxKSkgeworCQlpZHggPSByeC0+ZmlsbF9jbnQgJiByeC0+bWFzazsKKworCQlpZiAoKGJ5dGVzIDwgTVlSSTEwR0VfQUxMT0NfU0laRSAvIDIpICYmCisJCSAgICAocngtPnBhZ2Vfb2Zmc2V0ICsgYnl0ZXMgPD0gTVlSSTEwR0VfQUxMT0NfU0laRSkpIHsKKwkJCS8qIHdlIGNhbiB1c2UgcGFydCBvZiBwcmV2aW91cyBwYWdlICovCisJCQlnZXRfcGFnZShyeC0+cGFnZSk7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBuZWVkIGEgbmV3IHBhZ2UgKi8KKwkJCXBhZ2UgPQorCQkJICAgIGFsbG9jX3BhZ2VzKEdGUF9BVE9NSUMgfCBfX0dGUF9DT01QLAorCQkJCQlNWVJJMTBHRV9BTExPQ19PUkRFUik7CisJCQlpZiAodW5saWtlbHkocGFnZSA9PSBOVUxMKSkgeworCQkJCWlmIChyeC0+ZmlsbF9jbnQgLSByeC0+Y250IDwgMTYpCisJCQkJCXJ4LT53YXRjaGRvZ19uZWVkZWQgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXJ4LT5wYWdlID0gcGFnZTsKKwkJCXJ4LT5wYWdlX29mZnNldCA9IDA7CisJCQlyeC0+YnVzID0gcGNpX21hcF9wYWdlKG1ncC0+cGRldiwgcGFnZSwgMCwKKwkJCQkJICAgICAgIE1ZUkkxMEdFX0FMTE9DX1NJWkUsCisJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQl9CisJCXJ4LT5pbmZvW2lkeF0ucGFnZSA9IHJ4LT5wYWdlOworCQlyeC0+aW5mb1tpZHhdLnBhZ2Vfb2Zmc2V0ID0gcngtPnBhZ2Vfb2Zmc2V0OworCQkvKiBub3RlIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlCisJCSAqIHBhZ2UgKi8KKwkJcGNpX3VubWFwX2FkZHJfc2V0KCZyeC0+aW5mb1tpZHhdLCBidXMsIHJ4LT5idXMpOworCQlyeC0+c2hhZG93W2lkeF0uYWRkcl9sb3cgPQorCQkgICAgaHRvbmwoTVlSSTEwR0VfTE9XUEFSVF9UT19VMzIocngtPmJ1cykgKyByeC0+cGFnZV9vZmZzZXQpOworCQlyeC0+c2hhZG93W2lkeF0uYWRkcl9oaWdoID0KKwkJICAgIGh0b25sKE1ZUkkxMEdFX0hJR0hQQVJUX1RPX1UzMihyeC0+YnVzKSk7CisKKwkJLyogc3RhcnQgbmV4dCBwYWNrZXQgb24gYSBjYWNoZWxpbmUgYm91bmRhcnkgKi8KKwkJcngtPnBhZ2Vfb2Zmc2V0ICs9IFNLQl9EQVRBX0FMSUdOKGJ5dGVzKTsKKwkJcngtPmZpbGxfY250Kys7CisKKwkJLyogY29weSA4IGRlc2NyaXB0b3JzIHRvIHRoZSBmaXJtd2FyZSBhdCBhIHRpbWUgKi8KKwkJaWYgKChpZHggJiA3KSA9PSA3KSB7CisJCQlpZiAocngtPndjX2ZpZm8gPT0gTlVMTCkKKwkJCQlteXJpMTBnZV9zdWJtaXRfOHJ4KCZyeC0+bGFuYWlbaWR4IC0gN10sCisJCQkJCQkgICAgJnJ4LT5zaGFkb3dbaWR4IC0gN10pOworCQkJZWxzZSB7CisJCQkJbWIoKTsKKwkJCQlteXJpMTBnZV9waW9fY29weShyeC0+d2NfZmlmbywKKwkJCQkJCSAgJnJ4LT5zaGFkb3dbaWR4IC0gN10sIDY0KTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitteXJpMTBnZV91bm1hcF9yeF9wYWdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkgICAgICAgc3RydWN0IG15cmkxMGdlX3J4X2J1ZmZlcl9zdGF0ZSAqaW5mbywgaW50IGJ5dGVzKQoreworCS8qIHVubWFwIHRoZSByZWN2ZCBwYWdlIGlmIHdlJ3JlIHRoZSBvbmx5IG9yIGxhc3QgdXNlciBvZiBpdCAqLworCWlmIChieXRlcyA+PSBNWVJJMTBHRV9BTExPQ19TSVpFIC8gMiB8fAorCSAgICAoaW5mby0+cGFnZV9vZmZzZXQgKyAyICogYnl0ZXMpID4gTVlSSTEwR0VfQUxMT0NfU0laRSkgeworCQlwY2lfdW5tYXBfcGFnZShwZGV2LCAocGNpX3VubWFwX2FkZHIoaW5mbywgYnVzKQorCQkJCSAgICAgICYgfihNWVJJMTBHRV9BTExPQ19TSVpFIC0gMSkpLAorCQkJICAgICAgIE1ZUkkxMEdFX0FMTE9DX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorfQorCisjZGVmaW5lIE1ZUkkxMEdFX0hMRU4gNjQJLyogVGhlIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gYQorCQkJCSAqIHBhZ2UgaW50byBhbiBza2IgKi8KKworc3RhdGljIGlubGluZSBpbnQKK215cmkxMGdlX3J4X2RvbmUoc3RydWN0IG15cmkxMGdlX3ByaXYgKm1ncCwgc3RydWN0IG15cmkxMGdlX3J4X2J1ZiAqcngsCisJCSBpbnQgYnl0ZXMsIGludCBsZW4sIF9fd3N1bSBjc3VtKQorewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IGlkeCwgdW5tYXBfbGVuOworCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgcnhfZnJhZ3NbTVlSSTEwR0VfTUFYX0ZSQUdTX1BFUl9GUkFNRV07CisJaW50IGksIGlkeCwgaGxlbiwgcmVtYWluZGVyOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gbWdwLT5wZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtZ3AtPmRldjsKKwl1OCAqdmE7CiAKKwlsZW4gKz0gTVhHRUZXX1BBRDsKIAlpZHggPSByeC0+Y250ICYgcngtPm1hc2s7Ci0JcngtPmNudCsrOworCXZhID0gcGFnZV9hZGRyZXNzKHJ4LT5pbmZvW2lkeF0ucGFnZSkgKyByeC0+aW5mb1tpZHhdLnBhZ2Vfb2Zmc2V0OworCXByZWZldGNoKHZhKTsKKwkvKiBGaWxsIHNrYl9mcmFnX3N0cnVjdChzKSB3aXRoIGRhdGEgZnJvbSBvdXIgcmVjZWl2ZSAqLworCWZvciAoaSA9IDAsIHJlbWFpbmRlciA9IGxlbjsgcmVtYWluZGVyID4gMDsgaSsrKSB7CisJCW15cmkxMGdlX3VubWFwX3J4X3BhZ2UocGRldiwgJnJ4LT5pbmZvW2lkeF0sIGJ5dGVzKTsKKwkJcnhfZnJhZ3NbaV0ucGFnZSA9IHJ4LT5pbmZvW2lkeF0ucGFnZTsKKwkJcnhfZnJhZ3NbaV0ucGFnZV9vZmZzZXQgPSByeC0+aW5mb1tpZHhdLnBhZ2Vfb2Zmc2V0OworCQlpZiAocmVtYWluZGVyIDwgTVlSSTEwR0VfQUxMT0NfU0laRSkKKwkJCXJ4X2ZyYWdzW2ldLnNpemUgPSByZW1haW5kZXI7CisJCWVsc2UKKwkJCXJ4X2ZyYWdzW2ldLnNpemUgPSBNWVJJMTBHRV9BTExPQ19TSVpFOworCQlyeC0+Y250Kys7CisJCWlkeCA9IHJ4LT5jbnQgJiByeC0+bWFzazsKKwkJcmVtYWluZGVyIC09IE1ZUkkxMEdFX0FMTE9DX1NJWkU7CisJfQogCi0JLyogc2F2ZSBhIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIHNrYiAqLwotCXNrYiA9IHJ4LT5pbmZvW2lkeF0uc2tiOwotCWJ1cyA9IHBjaV91bm1hcF9hZGRyKCZyeC0+aW5mb1tpZHhdLCBidXMpOwotCXVubWFwX2xlbiA9IHBjaV91bm1hcF9sZW4oJnJ4LT5pbmZvW2lkeF0sIGxlbik7CisJaGxlbiA9IE1ZUkkxMEdFX0hMRU4gPiBsZW4gPyBsZW4gOiBNWVJJMTBHRV9ITEVOOwogCi0JLyogdHJ5IHRvIHJlcGxhY2UgdGhlIHJlY2VpdmVkIHNrYiAqLwotCWlmIChteXJpMTBnZV9nZXRidWYocngsIG1ncCwgYnl0ZXMsIGlkeCkpIHsKLQkJLyogZHJvcCB0aGUgZnJhbWUgLS0gdGhlIG9sZCBza2J1ZiBpcyByZS1jeWNsZWQgKi8KLQkJbWdwLT5zdGF0cy5yeF9kcm9wcGVkICs9IDE7CisJLyogYWxsb2NhdGUgYW4gc2tiIHRvIGF0dGFjaCB0aGUgcGFnZShzKSB0by4gKi8KKworCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBNWVJJMTBHRV9ITEVOICsgMTYpOworCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpIHsKKwkJbWdwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRvIHsKKwkJCWktLTsKKwkJCXB1dF9wYWdlKHJ4X2ZyYWdzW2ldLnBhZ2UpOworCQl9IHdoaWxlIChpICE9IDApOwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiB1bm1hcCB0aGUgcmVjdmQgc2tiICovCi0JcGNpX3VubWFwX3NpbmdsZShtZ3AtPnBkZXYsIGJ1cywgdW5tYXBfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCS8qIEF0dGFjaCB0aGUgcGFnZXMgdG8gdGhlIHNrYiwgYW5kIHRyaW0gb2ZmIGFueSBwYWRkaW5nICovCisJbXlyaTEwZ2Vfcnhfc2tiX2J1aWxkKHNrYiwgdmEsIHJ4X2ZyYWdzLCBsZW4sIGhsZW4pOworCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnNpemUgPD0gMCkgeworCQlwdXRfcGFnZShza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2UpOworCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gMDsKKwl9CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwlza2ItPmRldiA9IGRldjsKIAotCS8qIG1jcCBpbXBsaWNpdGx5IHNraXBzIDFzdCBieXRlcyBzbyB0aGF0IHBhY2tldCBpcyBwcm9wZXJseQotCSAqIGFsaWduZWQgKi8KLQlza2JfcmVzZXJ2ZShza2IsIE1YR0VGV19QQUQpOwotCi0JLyogc2V0IHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lICovCi0Jc2tiX3B1dChza2IsIGxlbik7Ci0KLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBtZ3AtPmRldik7CiAJaWYgKG1ncC0+Y3N1bV9mbGFnKSB7Ci0JCWlmICgoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF9JUCkpIHx8Ci0JCSAgICAoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF9JUFY2KSkpIHsKLQkJCXNrYi0+Y3N1bSA9IG50b2hzKCh1MTYpIGNzdW0pOworCQlpZiAoKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB8fAorCQkgICAgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpKSB7CisJCQlza2ItPmNzdW0gPSBjc3VtOwogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKIAkJfSBlbHNlCi0JCQlteXJpMTBnZV92bGFuX2lwX2NzdW0oc2tiLCBudG9ocygodTE2KSBjc3VtKSk7CisJCQlteXJpMTBnZV92bGFuX2lwX2NzdW0oc2tiLCBjc3VtKTsKIAl9Ci0KIAluZXRpZl9yZWNlaXZlX3NrYihza2IpOwotCW1ncC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCXJldHVybiAxOwogfQogCkBAIC0xMDYwLDE5ICsxMDYxLDE5IEBACiAJaW50IGlkeCA9IHJ4X2RvbmUtPmlkeDsKIAlpbnQgY250ID0gcnhfZG9uZS0+Y250OwogCXUxNiBsZW5ndGg7Ci0JdTE2IGNoZWNrc3VtOworCV9fd3N1bSBjaGVja3N1bTsKIAogCXdoaWxlIChyeF9kb25lLT5lbnRyeVtpZHhdLmxlbmd0aCAhPSAwICYmICpsaW1pdCAhPSAwKSB7CiAJCWxlbmd0aCA9IG50b2hzKHJ4X2RvbmUtPmVudHJ5W2lkeF0ubGVuZ3RoKTsKIAkJcnhfZG9uZS0+ZW50cnlbaWR4XS5sZW5ndGggPSAwOwotCQljaGVja3N1bSA9IG50b2hzKHJ4X2RvbmUtPmVudHJ5W2lkeF0uY2hlY2tzdW0pOworCQljaGVja3N1bSA9IGNzdW1fdW5mb2xkKHJ4X2RvbmUtPmVudHJ5W2lkeF0uY2hlY2tzdW0pOwogCQlpZiAobGVuZ3RoIDw9IG1ncC0+c21hbGxfYnl0ZXMpCiAJCQlyeF9vayA9IG15cmkxMGdlX3J4X2RvbmUobWdwLCAmbWdwLT5yeF9zbWFsbCwKIAkJCQkJCSBtZ3AtPnNtYWxsX2J5dGVzLAogCQkJCQkJIGxlbmd0aCwgY2hlY2tzdW0pOwogCQllbHNlCiAJCQlyeF9vayA9IG15cmkxMGdlX3J4X2RvbmUobWdwLCAmbWdwLT5yeF9iaWcsCi0JCQkJCQkgbWdwLT5kZXYtPm10dSArIEVUSF9ITEVOLAorCQkJCQkJIG1ncC0+YmlnX2J5dGVzLAogCQkJCQkJIGxlbmd0aCwgY2hlY2tzdW0pOwogCQlyeF9wYWNrZXRzICs9IHJ4X29rOwogCQlyeF9ieXRlcyArPSByeF9vayAqICh1bnNpZ25lZCBsb25nKWxlbmd0aDsKQEAgLTEwODcsNiArMTA4OCwxNCBAQAogCXJ4X2RvbmUtPmNudCA9IGNudDsKIAltZ3AtPnN0YXRzLnJ4X3BhY2tldHMgKz0gcnhfcGFja2V0czsKIAltZ3AtPnN0YXRzLnJ4X2J5dGVzICs9IHJ4X2J5dGVzOworCisJLyogcmVzdG9jayByZWNlaXZlIHJpbmdzIGlmIG5lZWRlZCAqLworCWlmIChtZ3AtPnJ4X3NtYWxsLmZpbGxfY250IC0gbWdwLT5yeF9zbWFsbC5jbnQgPCBteXJpMTBnZV9maWxsX3RocmVzaCkKKwkJbXlyaTEwZ2VfYWxsb2NfcnhfcGFnZXMobWdwLCAmbWdwLT5yeF9zbWFsbCwKKwkJCQkJbWdwLT5zbWFsbF9ieXRlcyArIE1YR0VGV19QQUQsIDApOworCWlmIChtZ3AtPnJ4X2JpZy5maWxsX2NudCAtIG1ncC0+cnhfYmlnLmNudCA8IG15cmkxMGdlX2ZpbGxfdGhyZXNoKQorCQlteXJpMTBnZV9hbGxvY19yeF9wYWdlcyhtZ3AsICZtZ3AtPnJ4X2JpZywgbWdwLT5iaWdfYnl0ZXMsIDApOworCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBteXJpMTBnZV9jaGVja19zdGF0YmxvY2soc3RydWN0IG15cmkxMGdlX3ByaXYgKm1ncCkKQEAgLTExNDIsNyArMTE1MSw3IEBACiAKIAlpZiAocnhfZG9uZS0+ZW50cnlbcnhfZG9uZS0+aWR4XS5sZW5ndGggPT0gMCB8fCAhbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCW5ldGlmX3J4X2NvbXBsZXRlKG5ldGRldik7Ci0JCV9fcmF3X3dyaXRlbChodG9ubCgzKSwgbWdwLT5pcnFfY2xhaW0pOworCQlwdXRfYmUzMihodG9ubCgzKSwgbWdwLT5pcnFfY2xhaW0pOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CkBAIC0xMTY2LDcgKzExNzUsNyBAQAogCQluZXRpZl9yeF9zY2hlZHVsZShtZ3AtPmRldik7CiAKIAlpZiAoIW1ncC0+bXNpX2VuYWJsZWQpIHsKLQkJX19yYXdfd3JpdGVsKDAsIG1ncC0+aXJxX2RlYXNzZXJ0KTsKKwkJcHV0X2JlMzIoMCwgbWdwLT5pcnFfZGVhc3NlcnQpOwogCQlpZiAoIW15cmkxMGdlX2RlYXNzZXJ0X3dhaXQpCiAJCQlzdGF0cy0+dmFsaWQgPSAwOwogCQltYigpOwpAQCAtMTE5NSw3ICsxMjA0LDcgQEAKIAogCW15cmkxMGdlX2NoZWNrX3N0YXRibG9jayhtZ3ApOwogCi0JX19yYXdfd3JpdGVsKGh0b25sKDMpLCBtZ3AtPmlycV9jbGFpbSArIDEpOworCXB1dF9iZTMyKGh0b25sKDMpLCBtZ3AtPmlycV9jbGFpbSArIDEpOwogCXJldHVybiAoSVJRX0hBTkRMRUQpOwogfQogCkBAIC0xMjMzLDcgKzEyNDIsNyBAQAogCXN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3AgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJbWdwLT5pbnRyX2NvYWxfZGVsYXkgPSBjb2FsLT5yeF9jb2FsZXNjZV91c2VjczsKLQlfX3Jhd193cml0ZWwoaHRvbmwobWdwLT5pbnRyX2NvYWxfZGVsYXkpLCBtZ3AtPmludHJfY29hbF9kZWxheV9wdHIpOworCXB1dF9iZTMyKGh0b25sKG1ncC0+aW50cl9jb2FsX2RlbGF5KSwgbWdwLT5pbnRyX2NvYWxfZGVsYXlfcHRyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ3Nyw1NiArMTQ4Niw0OCBAQAogCQlnb3RvIGFib3J0X3dpdGhfcnhfc21hbGxfaW5mbzsKIAogCS8qIEZpbGwgdGhlIHJlY2VpdmUgcmluZ3MgKi8KKwltZ3AtPnJ4X2JpZy5jbnQgPSAwOworCW1ncC0+cnhfc21hbGwuY250ID0gMDsKKwltZ3AtPnJ4X2JpZy5maWxsX2NudCA9IDA7CisJbWdwLT5yeF9zbWFsbC5maWxsX2NudCA9IDA7CisJbWdwLT5yeF9zbWFsbC5wYWdlX29mZnNldCA9IE1ZUkkxMEdFX0FMTE9DX1NJWkU7CisJbWdwLT5yeF9iaWcucGFnZV9vZmZzZXQgPSBNWVJJMTBHRV9BTExPQ19TSVpFOworCW1ncC0+cnhfc21hbGwud2F0Y2hkb2dfbmVlZGVkID0gMDsKKwltZ3AtPnJ4X2JpZy53YXRjaGRvZ19uZWVkZWQgPSAwOworCW15cmkxMGdlX2FsbG9jX3J4X3BhZ2VzKG1ncCwgJm1ncC0+cnhfc21hbGwsCisJCQkJbWdwLT5zbWFsbF9ieXRlcyArIE1YR0VGV19QQUQsIDApOwogCi0JZm9yIChpID0gMDsgaSA8PSBtZ3AtPnJ4X3NtYWxsLm1hc2s7IGkrKykgewotCQlzdGF0dXMgPSBteXJpMTBnZV9nZXRidWYoJm1ncC0+cnhfc21hbGwsIG1ncCwKLQkJCQkJIG1ncC0+c21hbGxfYnl0ZXMsIGkpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAibXlyaTEwZ2U6ICVzOiBhbGxvY2VkIG9ubHkgJWQgc21hbGwgYnVmc1xuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIGkpOwotCQkJZ290byBhYm9ydF93aXRoX3J4X3NtYWxsX3Jpbmc7Ci0JCX0KKwlpZiAobWdwLT5yeF9zbWFsbC5maWxsX2NudCA8IG1ncC0+cnhfc21hbGwubWFzayArIDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJteXJpMTBnZTogJXM6IGFsbG9jZWQgb25seSAlZCBzbWFsbCBidWZzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtZ3AtPnJ4X3NtYWxsLmZpbGxfY250KTsKKwkJZ290byBhYm9ydF93aXRoX3J4X3NtYWxsX3Jpbmc7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8PSBtZ3AtPnJ4X2JpZy5tYXNrOyBpKyspIHsKLQkJc3RhdHVzID0KLQkJICAgIG15cmkxMGdlX2dldGJ1ZigmbWdwLT5yeF9iaWcsIG1ncCwgZGV2LT5tdHUgKyBFVEhfSExFTiwgaSk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJteXJpMTBnZTogJXM6IGFsbG9jZWQgb25seSAlZCBiaWcgYnVmc1xuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIGkpOwotCQkJZ290byBhYm9ydF93aXRoX3J4X2JpZ19yaW5nOwotCQl9CisJbXlyaTEwZ2VfYWxsb2NfcnhfcGFnZXMobWdwLCAmbWdwLT5yeF9iaWcsIG1ncC0+YmlnX2J5dGVzLCAwKTsKKwlpZiAobWdwLT5yeF9iaWcuZmlsbF9jbnQgPCBtZ3AtPnJ4X2JpZy5tYXNrICsgMSkgeworCQlwcmludGsoS0VSTl9FUlIgIm15cmkxMGdlOiAlczogYWxsb2NlZCBvbmx5ICVkIGJpZyBidWZzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtZ3AtPnJ4X2JpZy5maWxsX2NudCk7CisJCWdvdG8gYWJvcnRfd2l0aF9yeF9iaWdfcmluZzsKIAl9CiAKIAlyZXR1cm4gMDsKIAogYWJvcnRfd2l0aF9yeF9iaWdfcmluZzoKLQlmb3IgKGkgPSAwOyBpIDw9IG1ncC0+cnhfYmlnLm1hc2s7IGkrKykgewotCQlpZiAobWdwLT5yeF9iaWcuaW5mb1tpXS5za2IgIT0gTlVMTCkKLQkJCWRldl9rZnJlZV9za2JfYW55KG1ncC0+cnhfYmlnLmluZm9baV0uc2tiKTsKLQkJaWYgKHBjaV91bm1hcF9sZW4oJm1ncC0+cnhfYmlnLmluZm9baV0sIGxlbikpCi0JCQlwY2lfdW5tYXBfc2luZ2xlKG1ncC0+cGRldiwKLQkJCQkJIHBjaV91bm1hcF9hZGRyKCZtZ3AtPnJ4X2JpZy5pbmZvW2ldLAotCQkJCQkJCWJ1cyksCi0JCQkJCSBwY2lfdW5tYXBfbGVuKCZtZ3AtPnJ4X2JpZy5pbmZvW2ldLAotCQkJCQkJICAgICAgIGxlbiksCi0JCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWZvciAoaSA9IG1ncC0+cnhfYmlnLmNudDsgaSA8IG1ncC0+cnhfYmlnLmZpbGxfY250OyBpKyspIHsKKwkJaW50IGlkeCA9IGkgJiBtZ3AtPnJ4X2JpZy5tYXNrOworCQlteXJpMTBnZV91bm1hcF9yeF9wYWdlKG1ncC0+cGRldiwgJm1ncC0+cnhfYmlnLmluZm9baWR4XSwKKwkJCQkgICAgICAgbWdwLT5iaWdfYnl0ZXMpOworCQlwdXRfcGFnZShtZ3AtPnJ4X2JpZy5pbmZvW2lkeF0ucGFnZSk7CiAJfQogCiBhYm9ydF93aXRoX3J4X3NtYWxsX3Jpbmc6Ci0JZm9yIChpID0gMDsgaSA8PSBtZ3AtPnJ4X3NtYWxsLm1hc2s7IGkrKykgewotCQlpZiAobWdwLT5yeF9zbWFsbC5pbmZvW2ldLnNrYiAhPSBOVUxMKQotCQkJZGV2X2tmcmVlX3NrYl9hbnkobWdwLT5yeF9zbWFsbC5pbmZvW2ldLnNrYik7Ci0JCWlmIChwY2lfdW5tYXBfbGVuKCZtZ3AtPnJ4X3NtYWxsLmluZm9baV0sIGxlbikpCi0JCQlwY2lfdW5tYXBfc2luZ2xlKG1ncC0+cGRldiwKLQkJCQkJIHBjaV91bm1hcF9hZGRyKCZtZ3AtPnJ4X3NtYWxsLmluZm9baV0sCi0JCQkJCQkJYnVzKSwKLQkJCQkJIHBjaV91bm1hcF9sZW4oJm1ncC0+cnhfc21hbGwuaW5mb1tpXSwKLQkJCQkJCSAgICAgICBsZW4pLAotCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlmb3IgKGkgPSBtZ3AtPnJ4X3NtYWxsLmNudDsgaSA8IG1ncC0+cnhfc21hbGwuZmlsbF9jbnQ7IGkrKykgeworCQlpbnQgaWR4ID0gaSAmIG1ncC0+cnhfc21hbGwubWFzazsKKwkJbXlyaTEwZ2VfdW5tYXBfcnhfcGFnZShtZ3AtPnBkZXYsICZtZ3AtPnJ4X3NtYWxsLmluZm9baWR4XSwKKwkJCQkgICAgICAgbWdwLT5zbWFsbF9ieXRlcyArIE1YR0VGV19QQUQpOworCQlwdXRfcGFnZShtZ3AtPnJ4X3NtYWxsLmluZm9baWR4XS5wYWdlKTsKIAl9CisKIAlrZnJlZShtZ3AtPnJ4X2JpZy5pbmZvKTsKIAogYWJvcnRfd2l0aF9yeF9zbWFsbF9pbmZvOgpAQCAtMTU1OSwzMCArMTU2MCwyNCBAQAogCiAJbWdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWZvciAoaSA9IDA7IGkgPD0gbWdwLT5yeF9iaWcubWFzazsgaSsrKSB7Ci0JCWlmIChtZ3AtPnJ4X2JpZy5pbmZvW2ldLnNrYiAhPSBOVUxMKQotCQkJZGV2X2tmcmVlX3NrYl9hbnkobWdwLT5yeF9iaWcuaW5mb1tpXS5za2IpOwotCQlpZiAocGNpX3VubWFwX2xlbigmbWdwLT5yeF9iaWcuaW5mb1tpXSwgbGVuKSkKLQkJCXBjaV91bm1hcF9zaW5nbGUobWdwLT5wZGV2LAotCQkJCQkgcGNpX3VubWFwX2FkZHIoJm1ncC0+cnhfYmlnLmluZm9baV0sCi0JCQkJCQkJYnVzKSwKLQkJCQkJIHBjaV91bm1hcF9sZW4oJm1ncC0+cnhfYmlnLmluZm9baV0sCi0JCQkJCQkgICAgICAgbGVuKSwKLQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJZm9yIChpID0gbWdwLT5yeF9iaWcuY250OyBpIDwgbWdwLT5yeF9iaWcuZmlsbF9jbnQ7IGkrKykgeworCQlpZHggPSBpICYgbWdwLT5yeF9iaWcubWFzazsKKwkJaWYgKGkgPT0gbWdwLT5yeF9iaWcuZmlsbF9jbnQgLSAxKQorCQkJbWdwLT5yeF9iaWcuaW5mb1tpZHhdLnBhZ2Vfb2Zmc2V0ID0gTVlSSTEwR0VfQUxMT0NfU0laRTsKKwkJbXlyaTEwZ2VfdW5tYXBfcnhfcGFnZShtZ3AtPnBkZXYsICZtZ3AtPnJ4X2JpZy5pbmZvW2lkeF0sCisJCQkJICAgICAgIG1ncC0+YmlnX2J5dGVzKTsKKwkJcHV0X3BhZ2UobWdwLT5yeF9iaWcuaW5mb1tpZHhdLnBhZ2UpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPD0gbWdwLT5yeF9zbWFsbC5tYXNrOyBpKyspIHsKLQkJaWYgKG1ncC0+cnhfc21hbGwuaW5mb1tpXS5za2IgIT0gTlVMTCkKLQkJCWRldl9rZnJlZV9za2JfYW55KG1ncC0+cnhfc21hbGwuaW5mb1tpXS5za2IpOwotCQlpZiAocGNpX3VubWFwX2xlbigmbWdwLT5yeF9zbWFsbC5pbmZvW2ldLCBsZW4pKQotCQkJcGNpX3VubWFwX3NpbmdsZShtZ3AtPnBkZXYsCi0JCQkJCSBwY2lfdW5tYXBfYWRkcigmbWdwLT5yeF9zbWFsbC5pbmZvW2ldLAotCQkJCQkJCWJ1cyksCi0JCQkJCSBwY2lfdW5tYXBfbGVuKCZtZ3AtPnJ4X3NtYWxsLmluZm9baV0sCi0JCQkJCQkgICAgICAgbGVuKSwKLQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJZm9yIChpID0gbWdwLT5yeF9zbWFsbC5jbnQ7IGkgPCBtZ3AtPnJ4X3NtYWxsLmZpbGxfY250OyBpKyspIHsKKwkJaWR4ID0gaSAmIG1ncC0+cnhfc21hbGwubWFzazsKKwkJaWYgKGkgPT0gbWdwLT5yeF9zbWFsbC5maWxsX2NudCAtIDEpCisJCQltZ3AtPnJ4X3NtYWxsLmluZm9baWR4XS5wYWdlX29mZnNldCA9CisJCQkgICAgTVlSSTEwR0VfQUxMT0NfU0laRTsKKwkJbXlyaTEwZ2VfdW5tYXBfcnhfcGFnZShtZ3AtPnBkZXYsICZtZ3AtPnJ4X3NtYWxsLmluZm9baWR4XSwKKwkJCQkgICAgICAgbWdwLT5zbWFsbF9ieXRlcyArIE1YR0VGV19QQUQpOworCQlwdXRfcGFnZShtZ3AtPnJ4X3NtYWxsLmluZm9baWR4XS5wYWdlKTsKIAl9Ci0KIAl0eCA9ICZtZ3AtPnR4OwogCXdoaWxlICh0eC0+ZG9uZSAhPSB0eC0+cmVxKSB7CiAJCWlkeCA9IHR4LT5kb25lICYgdHgtPm1hc2s7CkBAIC0xNjUwLDE5ICsxNjQ1LDE4IEBACiAJICovCiAKIAlpZiAoZGV2LT5tdHUgPD0gRVRIX0RBVEFfTEVOKQotCQltZ3AtPnNtYWxsX2J5dGVzID0gMTI4OwkvKiBlbm91Z2ggZm9yIGEgVENQIGhlYWRlciAqLworCQkvKiBlbm91Z2ggZm9yIGEgVENQIGhlYWRlciAqLworCQltZ3AtPnNtYWxsX2J5dGVzID0gKDEyOCA+IFNNUF9DQUNIRV9CWVRFUykKKwkJICAgID8gKDEyOCAtIE1YR0VGV19QQUQpCisJCSAgICA6IChTTVBfQ0FDSEVfQllURVMgLSBNWEdFRldfUEFEKTsKIAllbHNlCi0JCW1ncC0+c21hbGxfYnl0ZXMgPSBFVEhfRlJBTUVfTEVOOwkvKiBlbm91Z2ggZm9yIGFuIEVUSF9EQVRBX0xFTiBmcmFtZSAqLworCQkvKiBlbm91Z2ggZm9yIGEgdmxhbiBlbmNhcHN1bGF0ZWQgRVRIX0RBVEFfTEVOIGZyYW1lICovCisJCW1ncC0+c21hbGxfYnl0ZXMgPSBWTEFOX0VUSF9GUkFNRV9MRU47CiAKIAkvKiBPdmVycmlkZSB0aGUgc21hbGwgYnVmZmVyIHNpemU/ICovCiAJaWYgKG15cmkxMGdlX3NtYWxsX2J5dGVzID4gMCkKIAkJbWdwLT5zbWFsbF9ieXRlcyA9IG15cmkxMGdlX3NtYWxsX2J5dGVzOwogCi0JLyogSWYgdGhlIHVzZXIgc2V0cyBhbiBvYnNjZW5lbHkgc21hbGwgTVRVLCBhZGp1c3QgdGhlIHNtYWxsCi0JICogYnl0ZXMgZG93biB0byBuZWFybHkgbm90aGluZyAqLwotCWlmIChtZ3AtPnNtYWxsX2J5dGVzID49IChkZXYtPm10dSArIEVUSF9ITEVOKSkKLQkJbWdwLT5zbWFsbF9ieXRlcyA9IDY0OwotCiAJLyogZ2V0IHRoZSBsYW5haSBwb2ludGVycyB0byB0aGUgc2VuZCBhbmQgcmVjZWl2ZSByaW5ncyAqLwogCiAJc3RhdHVzIHw9IG15cmkxMGdlX3NlbmRfY21kKG1ncCwgTVhHRUZXX0NNRF9HRVRfU0VORF9PRkZTRVQsICZjbWQsIDApOwpAQCAtMTY5OCwxNyArMTY5MiwyMyBAQAogCQltZ3AtPnJ4X2JpZy53Y19maWZvID0gTlVMTDsKIAl9CiAKLQlzdGF0dXMgPSBteXJpMTBnZV9hbGxvY2F0ZV9yaW5ncyhkZXYpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBhYm9ydF93aXRoX25vdGhpbmc7Ci0KIAkvKiBGaXJtd2FyZSBuZWVkcyB0aGUgYmlnIGJ1ZmYgc2l6ZSBhcyBhIHBvd2VyIG9mIDIuICBMaWUgYW5kCiAJICogdGVsbCBoaW0gdGhlIGJ1ZmZlciBpcyBsYXJnZXIsIGJlY2F1c2Ugd2Ugb25seSB1c2UgMQogCSAqIGJ1ZmZlci9wa3QsIGFuZCB0aGUgbXR1IHdpbGwgcHJldmVudCBvdmVycnVucy4KIAkgKi8KLQliaWdfcG93MiA9IGRldi0+bXR1ICsgRVRIX0hMRU4gKyBNWEdFRldfUEFEOwotCXdoaWxlICgoYmlnX3BvdzIgJiAoYmlnX3BvdzIgLSAxKSkgIT0gMCkKLQkJYmlnX3BvdzIrKzsKKwliaWdfcG93MiA9IGRldi0+bXR1ICsgRVRIX0hMRU4gKyBWTEFOX0hMRU4gKyBNWEdFRldfUEFEOworCWlmIChiaWdfcG93MiA8IE1ZUkkxMEdFX0FMTE9DX1NJWkUgLyAyKSB7CisJCXdoaWxlICgoYmlnX3BvdzIgJiAoYmlnX3BvdzIgLSAxKSkgIT0gMCkKKwkJCWJpZ19wb3cyKys7CisJCW1ncC0+YmlnX2J5dGVzID0gZGV2LT5tdHUgKyBFVEhfSExFTiArIFZMQU5fSExFTiArIE1YR0VGV19QQUQ7CisJfSBlbHNlIHsKKwkJYmlnX3BvdzIgPSBNWVJJMTBHRV9BTExPQ19TSVpFOworCQltZ3AtPmJpZ19ieXRlcyA9IGJpZ19wb3cyOworCX0KKworCXN0YXR1cyA9IG15cmkxMGdlX2FsbG9jYXRlX3JpbmdzKGRldik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGFib3J0X3dpdGhfbm90aGluZzsKIAogCS8qIG5vdyBnaXZlIGZpcm13YXJlIGJ1ZmZlcnMgc2l6ZXMsIGFuZCBNVFUgKi8KIAljbWQuZGF0YTAgPSBkZXYtPm10dSArIEVUSF9ITEVOICsgVkxBTl9ITEVOOwpAQCAtMTc0OCw3ICsxNzQ4LDcgQEAKIAkJZ290byBhYm9ydF93aXRoX3JpbmdzOwogCX0KIAotCW1ncC0+bGlua19zdGF0ZSA9IC0xOworCW1ncC0+bGlua19zdGF0ZSA9IGh0b25sKH4wVSk7CiAJbWdwLT5yZG1hX3RhZ3NfYXZhaWxhYmxlID0gMTU7CiAKIAluZXRpZl9wb2xsX2VuYWJsZShtZ3AtPmRldik7CS8qIG11c3QgaGFwcGVuIHByaW9yIHRvIGFueSBpcnEgKi8KQEAgLTE4NzYsNyArMTg3Niw3IEBACiAKIAkvKiByZS13cml0ZSB0aGUgbGFzdCAzMi1iaXRzIHdpdGggdGhlIHZhbGlkIGZsYWdzICovCiAJc3JjLT5mbGFncyA9IGxhc3RfZmxhZ3M7Ci0JX19yYXdfd3JpdGVsKCooKHUzMiAqKSBzcmMgKyAzKSwgKHUzMiBfX2lvbWVtICopIGRzdCArIDMpOworCXB1dF9iZTMyKCooKF9fYmUzMiAqKSBzcmMgKyAzKSwgKF9fYmUzMiBfX2lvbWVtICopIGRzdCArIDMpOwogCXR4LT5yZXEgKz0gY250OwogCW1iKCk7CiB9CkBAIC0xOTE5LDcgKzE5MTksOCBAQAogCXN0cnVjdCBteXJpMTBnZV90eF9idWYgKnR4ID0gJm1ncC0+dHg7CiAJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKIAlkbWFfYWRkcl90IGJ1czsKLQl1MzIgbG93LCBoaWdoX3N3YXBwZWQ7CisJdTMyIGxvdzsKKwlfX2JlMzIgaGlnaF9zd2FwcGVkOwogCXVuc2lnbmVkIGludCBsZW47CiAJaW50IGlkeCwgbGFzdF9pZHgsIGF2YWlsLCBmcmFnX2NudCwgZnJhZ19pZHgsIGNvdW50LCBtc3MsIG1heF9zZWdtZW50czsKIAl1MTYgcHNldWRvX2hkcl9vZmZzZXQsIGNrc3VtX29mZnNldDsKQEAgLTE5NTUsNyArMTk1Niw3IEBACiAJZmxhZ3MgPSAoTVhHRUZXX0ZMQUdTX05PX1RTTyB8IE1YR0VGV19GTEFHU19GSVJTVCk7CiAJaWYgKGxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSkgewogCQlja3N1bV9vZmZzZXQgPSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JCXBzZXVkb19oZHJfb2Zmc2V0ID0gKHNrYi0+aC5yYXcgKyBza2ItPmNzdW0pIC0gc2tiLT5kYXRhOworCQlwc2V1ZG9faGRyX29mZnNldCA9IGNrc3VtX29mZnNldCArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJCS8qIElmIHRoZSBoZWFkZXJzIGFyZSBleGNlc3NpdmVseSBsYXJnZSwgdGhlbiB3ZSBtdXN0CiAJCSAqIGZhbGwgYmFjayB0byBhIHNvZnR3YXJlIGNoZWNrc3VtICovCiAJCWlmICh1bmxpa2VseShja3N1bV9vZmZzZXQgPiAyNTUgfHwgcHNldWRvX2hkcl9vZmZzZXQgPiAxMjcpKSB7CkBAIC0xOTY0LDcgKzE5NjUsNiBAQAogCQkJY2tzdW1fb2Zmc2V0ID0gMDsKIAkJCXBzZXVkb19oZHJfb2Zmc2V0ID0gMDsKIAkJfSBlbHNlIHsKLQkJCXBzZXVkb19oZHJfb2Zmc2V0ID0gaHRvbnMocHNldWRvX2hkcl9vZmZzZXQpOwogCQkJb2RkX2ZsYWcgPSBNWEdFRldfRkxBR1NfQUxJR05fT0REOwogCQkJZmxhZ3MgfD0gTVhHRUZXX0ZMQUdTX0NLU1VNOwogCQl9CkBAIC0xOTg2LDcgKzE5ODYsNyBAQAogCQkvKiBmb3IgVFNPLCBwc2V1ZG9faGRyX29mZnNldCBob2xkcyBtc3MuCiAJCSAqIFRoZSBmaXJtd2FyZSBmaWd1cmVzIG91dCB3aGVyZSB0byBwdXQKIAkJICogdGhlIGNoZWNrc3VtIGJ5IHBhcnNpbmcgdGhlIGhlYWRlci4gKi8KLQkJcHNldWRvX2hkcl9vZmZzZXQgPSBodG9ucyhtc3MpOworCQlwc2V1ZG9faGRyX29mZnNldCA9IG1zczsKIAl9IGVsc2UKICNlbmRpZgkJCQkvKk5FVElGX0ZfVFNPICovCiAJCS8qIE1hcmsgc21hbGwgcGFja2V0cywgYW5kIHBhZCBvdXQgdGlueSBwYWNrZXRzICovCkBAIC0yMDg2LDcgKzIwODYsNyBAQAogI2VuZGlmCQkJCS8qIE5FVElGX0ZfVFNPICovCiAJCQlyZXEtPmFkZHJfaGlnaCA9IGhpZ2hfc3dhcHBlZDsKIAkJCXJlcS0+YWRkcl9sb3cgPSBodG9ubChsb3cpOwotCQkJcmVxLT5wc2V1ZG9faGRyX29mZnNldCA9IHBzZXVkb19oZHJfb2Zmc2V0OworCQkJcmVxLT5wc2V1ZG9faGRyX29mZnNldCA9IGh0b25zKHBzZXVkb19oZHJfb2Zmc2V0KTsKIAkJCXJlcS0+cGFkID0gMDsJLyogY29tcGxldGUgc29saWQgMTYtYnl0ZSBibG9jazsgZG9lcyB0aGlzIG1hdHRlcj8gKi8KIAkJCXJlcS0+cmRtYV9jb3VudCA9IDE7CiAJCQlyZXEtPmxlbmd0aCA9IGh0b25zKHNlZ2xlbik7CkBAIC0yMTk5LDYgKzIxOTksNyBAQAogCXN0cnVjdCBteXJpMTBnZV9jbWQgY21kOwogCXN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3A7CiAJc3RydWN0IGRldl9tY19saXN0ICptY19saXN0OworCV9fYmUzMiBkYXRhWzJdID0geyAwLCAwIH07CiAJaW50IGVycjsKIAogCW1ncCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yMjM3LDEwICsyMjM4LDkgQEAKIAogCS8qIFdhbGsgdGhlIG11bHRpY2FzdCBsaXN0LCBhbmQgYWRkIGVhY2ggYWRkcmVzcyAqLwogCWZvciAobWNfbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNfbGlzdCAhPSBOVUxMOyBtY19saXN0ID0gbWNfbGlzdC0+bmV4dCkgewotCQltZW1jcHkoJmNtZC5kYXRhMCwgJm1jX2xpc3QtPmRtaV9hZGRyLCA0KTsKLQkJbWVtY3B5KCZjbWQuZGF0YTEsICgoY2hhciAqKSZtY19saXN0LT5kbWlfYWRkcikgKyA0LCAyKTsKLQkJY21kLmRhdGEwID0gaHRvbmwoY21kLmRhdGEwKTsKLQkJY21kLmRhdGExID0gaHRvbmwoY21kLmRhdGExKTsKKwkJbWVtY3B5KGRhdGEsICZtY19saXN0LT5kbWlfYWRkciwgNik7CisJCWNtZC5kYXRhMCA9IG50b2hsKGRhdGFbMF0pOworCQljbWQuZGF0YTEgPSBudG9obChkYXRhWzFdKTsKIAkJZXJyID0gbXlyaTEwZ2Vfc2VuZF9jbWQobWdwLCBNWEdFRldfSk9JTl9NVUxUSUNBU1RfR1JPVVAsCiAJCQkJCSZjbWQsIDEpOwogCkBAIC0yNDE2LDcgKzI0MTYsNiBAQAogICogZmlybXdhcmUgaW1hZ2UsIGFuZCBzZXQgdHguYm91bmRhcnkgdG8gNEtCLgogICovCiAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19IVDIwMDBfUENJRQkweDAxMzIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9FNTAwMF9QQ0lFMjMgMHgyNWY3CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfRTUwMDBfUENJRTQ3IDB4MjVmYQogCkBAIC0yNjE2LDkgKzI2MTUsMTAgQEAKICAqIFRoaXMgd2F0Y2hkb2cgaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBib2FyZCBoYXMgc3VmZmVyZWQKICAqIGZyb20gYSBwYXJpdHkgZXJyb3IgYW5kIG5lZWRzIHRvIGJlIHJlY292ZXJlZC4KICAqLwotc3RhdGljIHZvaWQgbXlyaTEwZ2Vfd2F0Y2hkb2codm9pZCAqYXJnKQorc3RhdGljIHZvaWQgbXlyaTEwZ2Vfd2F0Y2hkb2coc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3AgPSBhcmc7CisJc3RydWN0IG15cmkxMGdlX3ByaXYgKm1ncCA9CisJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXlyaTEwZ2VfcHJpdiwgd2F0Y2hkb2dfd29yayk7CiAJdTMyIHJlYm9vdDsKIAlpbnQgc3RhdHVzOwogCXUxNiBjbWQsIHZlbmRvcjsKQEAgLTI2OTEsNiArMjY5MSwyMSBAQAogCXN0cnVjdCBteXJpMTBnZV9wcml2ICptZ3A7CiAKIAltZ3AgPSAoc3RydWN0IG15cmkxMGdlX3ByaXYgKilhcmc7CisKKwlpZiAobWdwLT5yeF9zbWFsbC53YXRjaGRvZ19uZWVkZWQpIHsKKwkJbXlyaTEwZ2VfYWxsb2NfcnhfcGFnZXMobWdwLCAmbWdwLT5yeF9zbWFsbCwKKwkJCQkJbWdwLT5zbWFsbF9ieXRlcyArIE1YR0VGV19QQUQsIDEpOworCQlpZiAobWdwLT5yeF9zbWFsbC5maWxsX2NudCAtIG1ncC0+cnhfc21hbGwuY250ID49CisJCSAgICBteXJpMTBnZV9maWxsX3RocmVzaCkKKwkJCW1ncC0+cnhfc21hbGwud2F0Y2hkb2dfbmVlZGVkID0gMDsKKwl9CisJaWYgKG1ncC0+cnhfYmlnLndhdGNoZG9nX25lZWRlZCkgeworCQlteXJpMTBnZV9hbGxvY19yeF9wYWdlcyhtZ3AsICZtZ3AtPnJ4X2JpZywgbWdwLT5iaWdfYnl0ZXMsIDEpOworCQlpZiAobWdwLT5yeF9iaWcuZmlsbF9jbnQgLSBtZ3AtPnJ4X2JpZy5jbnQgPj0KKwkJICAgIG15cmkxMGdlX2ZpbGxfdGhyZXNoKQorCQkJbWdwLT5yeF9iaWcud2F0Y2hkb2dfbmVlZGVkID0gMDsKKwl9CisKIAlpZiAobWdwLT50eC5yZXEgIT0gbWdwLT50eC5kb25lICYmCiAJICAgIG1ncC0+dHguZG9uZSA9PSBtZ3AtPndhdGNoZG9nX3R4X2RvbmUgJiYKIAkgICAgbWdwLT53YXRjaGRvZ190eF9yZXEgIT0gbWdwLT53YXRjaGRvZ190eF9kb25lKQpAQCAtMjg4OCw3ICsyOTAzLDcgQEAKIAkJICAgICh1bnNpZ25lZCBsb25nKW1ncCk7CiAKIAlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmbXlyaTEwZ2VfZXRodG9vbF9vcHMpOwotCUlOSVRfV09SSygmbWdwLT53YXRjaGRvZ193b3JrLCBteXJpMTBnZV93YXRjaGRvZywgbWdwKTsKKwlJTklUX1dPUksoJm1ncC0+d2F0Y2hkb2dfd29yaywgbXlyaTEwZ2Vfd2F0Y2hkb2cpOwogCXN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCWlmIChzdGF0dXMgIT0gMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWdpc3Rlcl9uZXRkZXYgZmFpbGVkOiAlZFxuIiwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlX21jcC5oIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwLmgKaW5kZXggOTUxOWFlNy4uMjk0NjNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwLmgKKysrIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwLmgKQEAgLTYsMjMgKzYsMjMgQEAKIAogLyogOCBCeXRlcyAqLwogc3RydWN0IG1jcF9kbWFfYWRkciB7Ci0JdTMyIGhpZ2g7Ci0JdTMyIGxvdzsKKwlfX2JlMzIgaGlnaDsKKwlfX2JlMzIgbG93OwogfTsKIAogLyogNCBCeXRlcyAqLwogc3RydWN0IG1jcF9zbG90IHsKLQl1MTYgY2hlY2tzdW07Ci0JdTE2IGxlbmd0aDsKKwlfX3N1bTE2IGNoZWNrc3VtOworCV9fYmUxNiBsZW5ndGg7CiB9OwogCiAvKiA2NCBCeXRlcyAqLwogc3RydWN0IG1jcF9jbWQgewotCXUzMiBjbWQ7Ci0JdTMyIGRhdGEwOwkJLyogd2lsbCBiZSBsb3cgcG9ydGlvbiBpZiBkYXRhID4gMzIgYml0cyAqLworCV9fYmUzMiBjbWQ7CisJX19iZTMyIGRhdGEwOwkJLyogd2lsbCBiZSBsb3cgcG9ydGlvbiBpZiBkYXRhID4gMzIgYml0cyAqLwogCS8qIDggKi8KLQl1MzIgZGF0YTE7CQkvKiB3aWxsIGJlIGhpZ2ggcG9ydGlvbiBpZiBkYXRhID4gMzIgYml0cyAqLwotCXUzMiBkYXRhMjsJCS8qIGN1cnJlbnRseSB1bnVzZWQuLiAqLworCV9fYmUzMiBkYXRhMTsJCS8qIHdpbGwgYmUgaGlnaCBwb3J0aW9uIGlmIGRhdGEgPiAzMiBiaXRzICovCisJX19iZTMyIGRhdGEyOwkJLyogY3VycmVudGx5IHVudXNlZC4uICovCiAJLyogMTYgKi8KIAlzdHJ1Y3QgbWNwX2RtYV9hZGRyIHJlc3BvbnNlX2FkZHI7CiAJLyogMjQgKi8KQEAgLTMxLDggKzMxLDggQEAKIAogLyogOCBCeXRlcyAqLwogc3RydWN0IG1jcF9jbWRfcmVzcG9uc2UgewotCXUzMiBkYXRhOwotCXUzMiByZXN1bHQ7CisJX19iZTMyIGRhdGE7CisJX19iZTMyIHJlc3VsdDsKIH07CiAKIC8qCkBAIC03MywxMCArNzMsMTAgQEAKIAogLyogMTYgQnl0ZXMgKi8KIHN0cnVjdCBtY3Bfa3JlcV9ldGhlcl9zZW5kIHsKLQl1MzIgYWRkcl9oaWdoOwotCXUzMiBhZGRyX2xvdzsKLQl1MTYgcHNldWRvX2hkcl9vZmZzZXQ7Ci0JdTE2IGxlbmd0aDsKKwlfX2JlMzIgYWRkcl9oaWdoOworCV9fYmUzMiBhZGRyX2xvdzsKKwlfX2JlMTYgcHNldWRvX2hkcl9vZmZzZXQ7CisJX19iZTE2IGxlbmd0aDsKIAl1OCBwYWQ7CiAJdTggcmRtYV9jb3VudDsKIAl1OCBja3N1bV9vZmZzZXQ7CS8qIHdoZXJlIHRvIHN0YXJ0IGNvbXB1dGluZyBja3N1bSAqLwpAQCAtODUsOCArODUsOCBAQAogCiAvKiA4IEJ5dGVzICovCiBzdHJ1Y3QgbWNwX2tyZXFfZXRoZXJfcmVjdiB7Ci0JdTMyIGFkZHJfaGlnaDsKLQl1MzIgYWRkcl9sb3c7CisJX19iZTMyIGFkZHJfaGlnaDsKKwlfX2JlMzIgYWRkcl9sb3c7CiB9OwogCiAvKiBDb21tYW5kcyAqLwpAQCAtMjE5LDE5ICsyMTksMTkgQEAKIAogc3RydWN0IG1jcF9pcnFfZGF0YSB7CiAJLyogYWRkIG5ldyBjb3VudGVycyBhdCB0aGUgYmVnaW5uaW5nICovCi0JdTMyIGZ1dHVyZV91c2VbNV07Ci0JdTMyIGRyb3BwZWRfbXVsdGljYXN0X2ZpbHRlcmVkOworCV9fYmUzMiBmdXR1cmVfdXNlWzVdOworCV9fYmUzMiBkcm9wcGVkX211bHRpY2FzdF9maWx0ZXJlZDsKIAkvKiA0MCBCeXRlcyAqLwotCXUzMiBzZW5kX2RvbmVfY291bnQ7CisJX19iZTMyIHNlbmRfZG9uZV9jb3VudDsKIAotCXUzMiBsaW5rX3VwOwotCXUzMiBkcm9wcGVkX2xpbmtfb3ZlcmZsb3c7Ci0JdTMyIGRyb3BwZWRfbGlua19lcnJvcl9vcl9maWx0ZXJlZDsKLQl1MzIgZHJvcHBlZF9ydW50OwotCXUzMiBkcm9wcGVkX292ZXJydW47Ci0JdTMyIGRyb3BwZWRfbm9fc21hbGxfYnVmZmVyOwotCXUzMiBkcm9wcGVkX25vX2JpZ19idWZmZXI7Ci0JdTMyIHJkbWFfdGFnc19hdmFpbGFibGU7CisJX19iZTMyIGxpbmtfdXA7CisJX19iZTMyIGRyb3BwZWRfbGlua19vdmVyZmxvdzsKKwlfX2JlMzIgZHJvcHBlZF9saW5rX2Vycm9yX29yX2ZpbHRlcmVkOworCV9fYmUzMiBkcm9wcGVkX3J1bnQ7CisJX19iZTMyIGRyb3BwZWRfb3ZlcnJ1bjsKKwlfX2JlMzIgZHJvcHBlZF9ub19zbWFsbF9idWZmZXI7CisJX19iZTMyIGRyb3BwZWRfbm9fYmlnX2J1ZmZlcjsKKwlfX2JlMzIgcmRtYV90YWdzX2F2YWlsYWJsZTsKIAogCXU4IHR4X3N0b3BwZWQ7CiAJdTggbGlua19kb3duOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwX2dlbl9oZWFkZXIuaCBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlX21jcF9nZW5faGVhZGVyLmgKaW5kZXggNDg3Zjc3OS4uMTZhODEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwX2dlbl9oZWFkZXIuaAorKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZV9tY3BfZ2VuX2hlYWRlci5oCkBAIC0zNiw3ICszNiw3IEBACiBzdHJ1Y3QgbWNwX2dlbl9oZWFkZXIgewogCS8qIHRoZSBmaXJzdCA0IGZpZWxkcyBhcmUgZmlsbGVkIGF0IGNvbXBpbGUgdGltZSAqLwogCXVuc2lnbmVkIGhlYWRlcl9sZW5ndGg7Ci0JdW5zaWduZWQgbWNwX3R5cGU7CisJX19iZTMyIG1jcF90eXBlOwogCWNoYXIgdmVyc2lvblsxMjhdOwogCXVuc2lnbmVkIG1jcF9nbG9iYWxzOwkvKiBwb2ludGVyIHRvIG1jcC10eXBlIHNwZWNpZmljIHN0cnVjdHVyZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpX2NvZGUuaCBiL2RyaXZlcnMvbmV0L215cmlfY29kZS5oCmluZGV4IGUyMWVjOWIuLmJhN2I4NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmlfY29kZS5oCisrKyBiL2RyaXZlcnMvbmV0L215cmlfY29kZS5oCkBAIC0xLDggKzEsOCBAQAogLyogVGhpcyBpcyB0aGUgTXlyaW5ldCBNQ1AgY29kZSBmb3IgTEFOYWk0LnggKi8KIC8qIEdlbmVyYXRlZCBieSAgY2F0ICRNWVJJX0hPTUUvbGliL2xhbmFpL21jcDQuZGF0ID4gbXlyaV9jb2RlNC5oICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbGFuYWk0X2NvZGVfb2ZmID0gMHgwMDAwOyAvKiBoYWxmLXdvcmQgb2Zmc2V0ICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBsYW5haTRfY29kZVs3NjI1Nl0gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0ZGF0YSBsYW5haTRfY29kZV9vZmYgPSAweDAwMDA7IC8qIGhhbGYtd29yZCBvZmZzZXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9fZGV2aW5pdGRhdGEgbGFuYWk0X2NvZGVbNzYyNTZdID0gewogMHhGMiwweDBFLAogMHhGRSwweDAwLCAweEMyLDB4OTAsIDB4MDAsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwMSwweDRDLCAweDk3LDB4OTMsCiAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgwMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4OTIsMHg5MywKQEAgLTQ3NzQsOCArNDc3NCw4IEBACiAKIC8qIFRoaXMgaXMgdGhlIExBTmFpIGRhdGEgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBsYW5haTRfZGF0YV9vZmYgPSAweDk0RjA7IC8qIGhhbGYtd29yZCBvZmZzZXQgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxhbmFpNF9kYXRhWzIwNDcyXSBfX2luaXRkYXRhOworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXRkYXRhIGxhbmFpNF9kYXRhX29mZiA9IDB4OTRGMDsgLyogaGFsZi13b3JkIG9mZnNldCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19kZXZpbml0ZGF0YSBsYW5haTRfZGF0YVsyMDQ3Ml07CiAKIAogI2lmZGVmIFNZTUJPTF9ERUZJTkVTX0NPTVBJTEVECmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCmluZGV4IDQ2NmI0ODQuLmVlMjZlZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCisrKyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAKICNpbmNsdWRlICJteXJpX3NidXMuaCIKICNpbmNsdWRlICJteXJpX2NvZGUuaCIKQEAgLTE2OCw3ICsxNjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG15cmlfbG9hZF9sYW5haShzdHJ1Y3QgbXlyaV9ldGggKm1wKQorc3RhdGljIGludCBfX2RldmluaXQgbXlyaV9sb2FkX2xhbmFpKHN0cnVjdCBteXJpX2V0aCAqbXApCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IG1wLT5kZXY7CiAJc3RydWN0IG15cmlfc2htZW0gX19pb21lbSAqc2htZW0gPSBtcC0+c2htZW07CkBAIC04OTEsNyArODkwLDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9faW5pdCBteXJpX2V0aGVyX2luaXQoc3RydWN0IHNidXNfZGV2ICpzZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgbXlyaV9ldGhlcl9pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldikKIHsKIAlzdGF0aWMgaW50IG51bTsKIAlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUtaDgzMDAuYyBiL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKaW5kZXggZWI4OTNkNy4uMzhmZDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUtaDgzMDAuYworKysgYi9kcml2ZXJzL25ldC9uZS1oODMwMC5jCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCisjZGVmaW5lIEVJX1NISUZUKHgpCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKKwogI2luY2x1ZGUgIjgzOTAuaCIKIAogI2RlZmluZSBEUlZfTkFNRSAibmUtaDgzMDAiCkBAIC01Miw2ICs1NCwxMSBAQAogCiAvKiAtLS0tIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMgYmVsb3cgLS0tLSAqLwogCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorICAgICI4MzkwLmM6djEuMTBjdnMgOS8yMy85NCBEb25hbGQgQmVja2VyIChiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3YpXG4iOworCisjaW5jbHVkZSAibGliODM5MC5jIgorCiAjZGVmaW5lIE5FX0JBU0UJIChkZXYtPmJhc2VfYWRkcikKICNkZWZpbmUgTkVfQ01ECSAJMHgwMAogI2RlZmluZSBORV9EQVRBUE9SVAkoZWlfc3RhdHVzLndvcmQxNj8weDIwOjB4MTApCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCkBAIC0xNjIsNyArMTY5LDcgQEAKICNpZm5kZWYgTU9EVUxFCiBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBuZV9wcm9iZShpbnQgdW5pdCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IF9fX19hbGxvY19laV9uZXRkZXYoMCk7CiAJaW50IGVycjsKIAogCWlmICghZGV2KQpAQCAtMjgzLDcgKzI5MCw3IEBACiAKIAkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IG5vdy4gIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gd2FpdGluZyBzaW5jZSB3ZSBjYW5ub3QKIAkgICBzaGFyZSBhbmQgdGhlIGJvYXJkIHdpbGwgdXN1YWxseSBiZSBlbmFibGVkLiAqLwotCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIG5hbWUsIGRldik7CisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIF9fZWlfaW50ZXJydXB0LCAwLCBuYW1lLCBkZXYpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrICgiIHVuYWJsZSB0byBnZXQgSVJRICVkIChlcnJubz0lZCkuXG4iLCBkZXYtPmlycSwgcmV0KTsKIAkJZ290byBlcnJfb3V0OwpAQCAtMzE4LDkgKzMyNSw5IEBACiAJZGV2LT5vcGVuID0gJm5lX29wZW47CiAJZGV2LT5zdG9wID0gJm5lX2Nsb3NlOwogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworCWRldi0+cG9sbF9jb250cm9sbGVyID0gX19laV9wb2xsOwogI2VuZGlmCi0JTlM4MzkwX2luaXQoZGV2LCAwKTsKKwlfX05TODM5MF9pbml0KGRldiwgMCk7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAocmV0KQpAQCAtMzM1LDcgKzM0Miw3IEBACiAKIHN0YXRpYyBpbnQgbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWVpX29wZW4oZGV2KTsKKwlfX2VpX29wZW4oZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQzLDcgKzM1MCw3IEBACiB7CiAJaWYgKGVpX2RlYnVnID4gMSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7Ci0JZWlfY2xvc2UoZGV2KTsKKwlfX2VpX2Nsb3NlKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4NCw3ICs1OTEsNyBAQAogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkbWFfc3RhcnQgKyAyKkhaLzEwMCkpIHsJCS8qIDIwbXMgKi8KIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFR4IFJEQy5cbiIsIGRldi0+bmFtZSk7CiAJCQluZV9yZXNldF84MzkwKGRldik7Ci0JCQlOUzgzOTBfaW5pdChkZXYsMSk7CisJCQlfX05TODM5MF9pbml0KGRldiwxKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTYyMCw3ICs2MjcsNyBAQAogCWludCBlcnI7CiAKIAlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfTkVfQ0FSRFM7IHRoaXNfZGV2KyspIHsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gX19fX2FsbG9jX2VpX25ldGRldigwKTsKIAkJaWYgKCFkZXYpCiAJCQlicmVhazsKIAkJaWYgKGlvW3RoaXNfZGV2XSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUuYyBiL2RyaXZlcnMvbmV0L25lLmMKaW5kZXggNzg3YWE0Mi4uYTVjNDE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUuYworKysgYi9kcml2ZXJzL25ldC9uZS5jCkBAIC04NjcsNyArODY3LDcgQEAKIAlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgdGhpc19kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25lMi5jIGIvZHJpdmVycy9uZXQvbmUyLmMKaW5kZXggNWZjY2ZlYS4uMDg5YjViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUyLmMKKysrIGIvZHJpdmVycy9uZXQvbmUyLmMKQEAgLTgxMyw3ICs4MTMsNyBAQAogCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBORV9JT19FWFRFTlQpOwogfQogCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit2b2lkIF9fZXhpdCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCB0aGlzX2RldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUzMjEwLmMgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwppbmRleCBkNjYzMjg5Li4xYTZmZWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZTMyMTAuYworKysgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldGNvbnNvbGUuYyBiL2RyaXZlcnMvbmV0L25ldGNvbnNvbGUuYwppbmRleCBiZjU4ZGIyLi42OTIzM2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXRjb25zb2xlLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jCkBAIC02MCw3ICs2MCw2IEBACiAJLmxvY2FsX3BvcnQgPSA2NjY1LAogCS5yZW1vdGVfcG9ydCA9IDY2NjYsCiAJLnJlbW90ZV9tYWMgPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn0sCi0JLmRyb3AgPSBuZXRwb2xsX3F1ZXVlLAogfTsKIHN0YXRpYyBpbnQgY29uZmlndXJlZCA9IDA7CiAKQEAgLTEwMiw2ICsxMDEsOCBAQAogCiBzdGF0aWMgaW50IGluaXRfbmV0Y29uc29sZSh2b2lkKQogeworCWludCBlcnI7CisKIAlpZihzdHJsZW4oY29uZmlnKSkKIAkJb3B0aW9uX3NldHVwKGNvbmZpZyk7CiAKQEAgLTExMCw4ICsxMTEsOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihuZXRwb2xsX3NldHVwKCZucCkpCi0JCXJldHVybiAtRUlOVkFMOworCWVyciA9IG5ldHBvbGxfc2V0dXAoJm5wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcmVnaXN0ZXJfY29uc29sZSgmbmV0Y29uc29sZSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAibmV0Y29uc29sZTogbmV0d29yayBsb2dnaW5nIHN0YXJ0ZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvbmV0eGVuL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2NkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2IE5ldFhlbiwgSW5jLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorIyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BICAwMjExMS0xMzA3LCBVU0EuCisjIAorIyBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorIyBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyMgCisjIENvbnRhY3QgSW5mb3JtYXRpb246CisjICAgIGluZm9AbmV0eGVuLmNvbQorIyBOZXRYZW4sCisjIDM5NjUgRnJlZWRvbSBDaXJjbGUsIEZvdXJ0aCBmbG9vciwKKyMgU2FudGEgQ2xhcmEsIENBIDk1MDU0CisjCisjIE1ha2VmaWxlIGZvciB0aGUgTmV0WGVuIE5JQyBEcml2ZXIKKyMKKworCitvYmotJChDT05GSUdfTkVUWEVOX05JQykgOj0gbmV0eGVuX25pYy5vCisKK25ldHhlbl9uaWMteSA6PSBuZXR4ZW5fbmljX2h3Lm8gbmV0eGVuX25pY19tYWluLm8gbmV0eGVuX25pY19pbml0Lm8gXAorCW5ldHhlbl9uaWNfaXNyLm8gbmV0eGVuX25pY19ldGh0b29sLm8gbmV0eGVuX25pY19uaXUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaCBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0MTBiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmgKQEAgLTAsMCArMSwxMTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiBOZXRYZW4sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogICAgaW5mb0BuZXR4ZW4uY29tCisgKiBOZXRYZW4sCisgKiAzOTY1IEZyZWVkb20gQ2lyY2xlLCBGb3VydGggZmxvb3IsCisgKiBTYW50YSBDbGFyYSwgQ0EgOTUwNTQKKyAqLworCisjaWZuZGVmIF9ORVRYRU5fTklDX0hfCisjZGVmaW5lIF9ORVRYRU5fTklDX0hfCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2luY2x1ZGUgIm5ldHhlbl9uaWNfaHcuaCIKKworI2RlZmluZSBORVRYRU5fTklDX0JVSUxEX05PICAgICAiMSIKKyNkZWZpbmUgX05FVFhFTl9OSUNfTElOVVhfTUFKT1IgMworI2RlZmluZSBfTkVUWEVOX05JQ19MSU5VWF9NSU5PUiAzCisjZGVmaW5lIF9ORVRYRU5fTklDX0xJTlVYX1NVQlZFUlNJT04gMgorI2RlZmluZSBORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCAgIjMuMy4yIiAiLSIgTkVUWEVOX05JQ19CVUlMRF9OTworI2RlZmluZSBORVRYRU5fTklDX0ZXX1ZFUlNJT05JRCAiMy4zLjIiCisKKyNkZWZpbmUgUkNWX0RFU0NfUklOR1NJWkUJXAorCShzaXplb2Yoc3RydWN0IHJjdl9kZXNjKSAqIGFkYXB0ZXItPm1heF9yeF9kZXNjX2NvdW50KQorI2RlZmluZSBTVEFUVVNfREVTQ19SSU5HU0laRQlcCisJKHNpemVvZihzdHJ1Y3Qgc3RhdHVzX2Rlc2MpKiBhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCkKKyNkZWZpbmUgTFJPX0RFU0NfUklOR1NJWkUJXAorCShzaXplb2YocmN2RGVzY190KSAqIGFkYXB0ZXItPm1heF9scm9fcnhfZGVzY19jb3VudCkKKyNkZWZpbmUgVFhfUklOR1NJWkUJXAorCShzaXplb2Yoc3RydWN0IG5ldHhlbl9jbWRfYnVmZmVyKSAqIGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50KQorI2RlZmluZSBSQ1ZfQlVGRlNJWkUJXAorCShzaXplb2Yoc3RydWN0IG5ldHhlbl9yeF9idWZmZXIpICogcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50KQorI2RlZmluZSBmaW5kX2RpZmZfYW1vbmcoYSxiLHJhbmdlKSAoKGEpPChiKT8oKGIpLShhKSk6KChiKSsocmFuZ2UpLShhKSkpCisKKyNkZWZpbmUgTkVUWEVOX05FVERFVl9TVEFUVVMJCTB4MQorI2RlZmluZSBORVRYRU5fUkNWX1BST0RVQ0VSX09GRlNFVAkwCisjZGVmaW5lIE5FVFhFTl9SQ1ZfUEVHX0RCX0lECQkyCisjZGVmaW5lIE5FVFhFTl9IT1NUX0RVTU1ZX0RNQV9TSVpFIDEwMjQKKworI2RlZmluZSBBRERSX0lOX1dJTkRPVzEob2ZmKQlcCisJKChvZmYgPiBORVRYRU5fQ1JCX1BDSVhfSE9TVDIpICYmIChvZmYgPCBORVRYRU5fQ1JCX01BWCkpID8gMSA6IDAKKy8qCisgKiBJbiBuZXR4ZW5fbmljX2Rvd24oKSwgd2UgbXVzdCB3YWl0IGZvciBhbnkgcGVuZGluZyBjYWxsYmFjayByZXF1ZXN0cyBpbnRvCisgKiBuZXR4ZW5fd2F0Y2hkb2dfdGFzaygpIHRvIGNvbXBsZXRlOyBlZyBvdGhlcndpc2UgdGhlIHdhdGNoZG9nX3RpbWVyIGNvdWxkIGJlCisgKiByZWVuYWJsZWQgcmlnaHQgYWZ0ZXIgaXQgaXMgZGVsZXRlZCBpbiBuZXR4ZW5fbmljX2Rvd24oKS4gRkxVU0hfU0NIRURVTEVEX1dPUksoKQorICogZG9lcyB0aGlzIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBOb3JtYWxseSwgc2NoZWR1bGVfd29yaygpL2ZsdXNoX3NjaGVkdWxlZF93b3JrKCkgY291bGQgaGF2ZSB3b3JrZWQsIGJ1dAorICogbmV0eGVuX25pY19jbG9zZSgpIGlzIGludm9rZWQgd2l0aCBrZXJuZWwgcnRubCBsb2NrIGhlbGQuIG5ldGlmX2NhcnJpZXJfb2ZmKCkKKyAqIGNhbGwgaW4gbmV0eGVuX25pY19jbG9zZSgpIHRyaWdnZXJzIGEgc2NoZWR1bGVfd29yaygmbGlua3dhdGNoX3dvcmspLCBhbmQgYQorICogc3Vic2VxdWVudCBjYWxsIHRvIGZsdXNoX3NjaGVkdWxlZF93b3JrKCkgaW4gbmV0eGVuX25pY19kb3duKCkgd291bGQgY2F1c2UKKyAqIGxpbmt3YXRjaF9ldmVudCgpIHRvIGJlIGV4ZWN1dGVkIHdoaWNoIGFsc28gYXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgcnRubAorICogbG9jayB0aHVzIGNhdXNpbmcgYSBkZWFkbG9jay4KKyAqLworCisjZGVmaW5lIFNDSEVEVUxFX1dPUksodHApCXF1ZXVlX3dvcmsobmV0eGVuX3dvcmtxLCB0cCkKKyNkZWZpbmUgRkxVU0hfU0NIRURVTEVEX1dPUksoKQlmbHVzaF93b3JrcXVldWUobmV0eGVuX3dvcmtxKQorZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpuZXR4ZW5fd29ya3E7CisKKy8qIAorICogbm9ybWFsaXplIGEgNjRNQiBjcmIgYWRkcmVzcyB0byAzMk1CIFBDSSB3aW5kb3cgCisgKiBUbyB1c2UgTkVUWEVOX0NSQl9OT1JNQUxJWkUsIHdpbmRvdyBfbXVzdF8gYmUgc2V0IHRvIDEKKyAqLworI2RlZmluZSBORVRYRU5fQ1JCX05PUk1BTChyZWcpCVwKKwkoKHJlZykgLSBORVRYRU5fQ1JCX1BDSVhfSE9TVDIgKyBORVRYRU5fQ1JCX1BDSVhfSE9TVCkKKworI2RlZmluZSBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCByZWcpIFwKKwlwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgTkVUWEVOX0NSQl9OT1JNQUwocmVnKSkKKworI2RlZmluZSBEQl9OT1JNQUxJWkUoYWRhcHRlciwgb2ZmKSBcCisJKGFkYXB0ZXItPmFody5kYl9iYXNlICsgKG9mZikpCisKKyNkZWZpbmUgTlhfUDJfQzAJCTB4MjQKKyNkZWZpbmUgTlhfUDJfQzEJCTB4MjUKKworI2RlZmluZSBGSVJTVF9QQUdFX0dST1VQX1NUQVJUCTAKKyNkZWZpbmUgRklSU1RfUEFHRV9HUk9VUF9FTkQJMHgxMDAwMDAKKworI2RlZmluZSBTRUNPTkRfUEFHRV9HUk9VUF9TVEFSVAkweDQwMDAwMDAKKyNkZWZpbmUgU0VDT05EX1BBR0VfR1JPVVBfRU5ECTB4NjZCQzAwMAorCisjZGVmaW5lIFRISVJEX1BBR0VfR1JPVVBfU1RBUlQJMHg3MEU0MDAwCisjZGVmaW5lIFRISVJEX1BBR0VfR1JPVVBfRU5ECTB4ODAwMDAwMAorCisjZGVmaW5lIEZJUlNUX1BBR0VfR1JPVVBfU0laRSAgRklSU1RfUEFHRV9HUk9VUF9FTkQgLSBGSVJTVF9QQUdFX0dST1VQX1NUQVJUCisjZGVmaW5lIFNFQ09ORF9QQUdFX0dST1VQX1NJWkUgU0VDT05EX1BBR0VfR1JPVVBfRU5EIC0gU0VDT05EX1BBR0VfR1JPVVBfU1RBUlQKKyNkZWZpbmUgVEhJUkRfUEFHRV9HUk9VUF9TSVpFICBUSElSRF9QQUdFX0dST1VQX0VORCAtIFRISVJEX1BBR0VfR1JPVVBfU1RBUlQKKworI2RlZmluZSBNQVhfUlhfQlVGRkVSX0xFTkdUSAkJMTc2MAorI2RlZmluZSBNQVhfUlhfSlVNQk9fQlVGRkVSX0xFTkdUSCAJOTA0NgorI2RlZmluZSBNQVhfUlhfTFJPX0JVRkZFUl9MRU5HVEgJKCg0OCoxMDI0KS01MTIpCisjZGVmaW5lIFJYX0RNQV9NQVBfTEVOCQkJKE1BWF9SWF9CVUZGRVJfTEVOR1RIIC0gMikKKyNkZWZpbmUgUlhfSlVNQk9fRE1BX01BUF9MRU4JXAorCShNQVhfUlhfSlVNQk9fQlVGRkVSX0xFTkdUSCAtIDIpCisjZGVmaW5lIFJYX0xST19ETUFfTUFQX0xFTgkJKE1BWF9SWF9MUk9fQlVGRkVSX0xFTkdUSCAtIDIpCisjZGVmaW5lIE5FVFhFTl9ST01fUk9VTkRVUAkJMHg4MDAwMDAwMFVMTAorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgcmluZyBjb250ZXh0cworICovCisjZGVmaW5lIE1BWF9SSU5HX0NUWCAxCisKKy8qIE9wY29kZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBjb21tYW5kcyAqLworZW51bSB7CisJVFhfRVRIRVJfUEtUID0gMHgwMSwKKy8qIFRoZSBmb2xsb3dpbmcgb3Bjb2RlcyBhcmUgZm9yIElQIGNoZWNrc3VtCSovCisJVFhfVENQX1BLVCwKKwlUWF9VRFBfUEtULAorCVRYX0lQX1BLVCwKKwlUWF9UQ1BfTFNPLAorCVRYX0lQU0VDLAorCVRYX0lQU0VDX0NNRAorfTsKKworLyogVGhlIGZvbGxvd2luZyBvcGNvZGVzIGFyZSBmb3IgaW50ZXJuYWwgY29uc3VtcHRpb24uICovCisjZGVmaW5lIE5FVFhFTl9DT05UUk9MX09QCTB4MTAKKyNkZWZpbmUgUEVHTkVUX1JFUVVFU1QJCTB4MTEKKworI2RlZmluZQlNQVhfTlVNX0NBUkRTCQk0CisKKyNkZWZpbmUgTUFYX0JVRkZFUlNfUEVSX0NNRAkzMgorCisvKgorICogRm9sbG93aW5nIGFyZSB0aGUgc3RhdGVzIG9mIHRoZSBQaGFudG9tLiBQaGFudG9tIHdpbGwgc2V0IHRoZW0gYW5kCisgKiBIb3N0IHdpbGwgcmVhZCB0byBjaGVjayBpZiB0aGUgZmllbGRzIGFyZSBjb3JyZWN0LgorICovCisjZGVmaW5lIFBIQU5fSU5JVElBTElaRV9TVEFSVAkJMHhmZjAwCisjZGVmaW5lIFBIQU5fSU5JVElBTElaRV9GQUlMRUQJCTB4ZmZmZgorI2RlZmluZSBQSEFOX0lOSVRJQUxJWkVfQ09NUExFVEUJMHhmZjAxCisKKy8qIEhvc3Qgd3JpdGVzIHRoZSBmb2xsb3dpbmcgdG8gbm90aWZ5IHRoYXQgaXQgaGFzIGRvbmUgdGhlIGluaXQtaGFuZHNoYWtlICovCisjZGVmaW5lIFBIQU5fSU5JVElBTElaRV9BQ0sJMHhmMDBmCisKKyNkZWZpbmUgTlVNX1JDVl9ERVNDX1JJTkdTCTMJLyogTm8gb2YgUmN2IERlc2NyaXB0b3IgY29udGV4dHMgKi8KKworLyogZGVzY3JpcHRvciB0eXBlcyAqLworI2RlZmluZSBSQ1ZfREVTQ19OT1JNQUwJCTB4MDEKKyNkZWZpbmUgUkNWX0RFU0NfSlVNQk8JCTB4MDIKKyNkZWZpbmUgUkNWX0RFU0NfTFJPCQkweDA0CisjZGVmaW5lIFJDVl9ERVNDX05PUk1BTF9DVFhJRAkwCisjZGVmaW5lIFJDVl9ERVNDX0pVTUJPX0NUWElECTEKKyNkZWZpbmUgUkNWX0RFU0NfTFJPX0NUWElECTIKKworI2RlZmluZSBSQ1ZfREVTQ19UWVBFKElEKSBcCisJKChJRCA9PSBSQ1ZfREVTQ19KVU1CT19DVFhJRCkJXAorCQk/IFJDVl9ERVNDX0pVTUJPCVwKKwkJOiAoKElEID09IFJDVl9ERVNDX0xST19DVFhJRCkJXAorCQkJPyBSQ1ZfREVTQ19MUk8gOglcCisJCQkoUkNWX0RFU0NfTk9STUFMKSkpCisKKyNkZWZpbmUgTUFYX0NNRF9ERVNDUklQVE9SUwkJMTAyNAorI2RlZmluZSBNQVhfUkNWX0RFU0NSSVBUT1JTCQkzMjc2OAorI2RlZmluZSBNQVhfSlVNQk9fUkNWX0RFU0NSSVBUT1JTCTQwOTYKKyNkZWZpbmUgTUFYX0xST19SQ1ZfREVTQ1JJUFRPUlMJCTIwNDgKKyNkZWZpbmUgTUFYX1JDVlNUQVRVU19ERVNDUklQVE9SUwlNQVhfUkNWX0RFU0NSSVBUT1JTCisjZGVmaW5lIE1BWF9KVU1CT19SQ1ZfREVTQwlNQVhfSlVNQk9fUkNWX0RFU0NSSVBUT1JTCisjZGVmaW5lIE1BWF9SQ1ZfREVTQwkJTUFYX1JDVl9ERVNDUklQVE9SUworI2RlZmluZSBNQVhfUkNWU1RBVFVTX0RFU0MJTUFYX1JDVl9ERVNDUklQVE9SUworI2RlZmluZSBNQVhfRVBHX0RFU0NSSVBUT1JTCShNQVhfQ01EX0RFU0NSSVBUT1JTICogOCkKKyNkZWZpbmUgTlVNX1JDVl9ERVNDCQkoTUFYX1JDVl9ERVNDICsgTUFYX0pVTUJPX1JDVl9ERVNDUklQVE9SUyArIFwKKwkJCQkgTUFYX0xST19SQ1ZfREVTQ1JJUFRPUlMpCisjZGVmaW5lIE1JTl9UWF9DT1VOVAk0MDk2CisjZGVmaW5lIE1JTl9SWF9DT1VOVAk0MDk2CisjZGVmaW5lIE5FVFhFTl9DVFhfU0lHTkFUVVJFCTB4ZGVlMAorI2RlZmluZSBORVRYRU5fUkNWX1BST0RVQ0VSKHJpbmdpZCkJKHJpbmdpZCkKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUJMHgxMDAwMAkvKiA2NEsgTUFYIHNpemUgZm9yIExTTyAqLworCisjZGVmaW5lIFBIQU5fUEVHX1JDVl9JTklUSUFMSVpFRAkweGZmMDEKKyNkZWZpbmUgUEhBTl9QRUdfUkNWX1NUQVJUX0lOSVRJQUxJWkUJMHhmZjAwCisKKyNkZWZpbmUgZ2V0X25leHRfaW5kZXgoaW5kZXgsIGxlbmd0aCkJXAorCSgoKGluZGV4KSArIDEpICYgKChsZW5ndGgpIC0gMSkpCisKKyNkZWZpbmUgZ2V0X2luZGV4X3JhbmdlKGluZGV4LGxlbmd0aCxjb3VudCkJXAorCSgoKGluZGV4KSArIChjb3VudCkpICYgKChsZW5ndGgpIC0gMSkpCisKKyNkZWZpbmUgTVBPUlRfU0lOR0xFX0ZVTkNUSU9OX01PREUgMHgxMTExCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbmV0eGVuX2RtYV9tYXNrOworCisvKgorICogTmV0WGVuIGhvc3QtcGVnIHNpZ25hbCBtZXNzYWdlIHN0cnVjdHVyZQorICoKKyAqCUJpdCAwLTEJCTogcGVnX2lkID0+IDB4MiBmb3IgdHggYW5kIDAxIGZvciByeAorICoJQml0IDIJCTogcHJpdl9pZCA9PiBtdXN0IGJlIDEKKyAqCUJpdCAzLTE3CTogY291bnQgPT4gZm9yIGRvb3JiZWxsCisgKglCaXQgMTgtMjcJOiBjdHhfaWQgPT4gQ29udGV4dCBpZAorICoJQml0IDI4LTMxCTogb3Bjb2RlCisgKi8KKwordHlwZWRlZiB1MzIgbmV0eGVuX2N0eF9tc2c7CisKKyNkZWZpbmUgX25ldHhlbl9zZXRfYml0cyhjb25maWdfd29yZCwgc3RhcnQsIGJpdHMsIHZhbCkJe1wKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWFzayA9ICgoKDFVTEwgPDwgKGJpdHMpKSAtIDEpIDw8IChzdGFydCkpOwlcCisJdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlID0gKHZhbCk7CVwKKwkoY29uZmlnX3dvcmQpICY9IH5tYXNrOwlcCisJKGNvbmZpZ193b3JkKSB8PSAoKCh2YWx1ZSkgPDwgKHN0YXJ0KSkgJiBtYXNrKTsgXAorfQorCisjZGVmaW5lIG5ldHhlbl9zZXRfbXNnX3BlZ19pZChjb25maWdfd29yZCwgdmFsKQlcCisJX25ldHhlbl9zZXRfYml0cyhjb25maWdfd29yZCwgMCwgMiwgdmFsKQorI2RlZmluZSBuZXR4ZW5fc2V0X21zZ19wcml2aWQoY29uZmlnX3dvcmQpCVwKKwlzZXRfYml0KDIsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisjZGVmaW5lIG5ldHhlbl9zZXRfbXNnX2NvdW50KGNvbmZpZ193b3JkLCB2YWwpCVwKKwlfbmV0eGVuX3NldF9iaXRzKGNvbmZpZ193b3JkLCAzLCAxNSwgdmFsKQorI2RlZmluZSBuZXR4ZW5fc2V0X21zZ19jdHhpZChjb25maWdfd29yZCwgdmFsKQlcCisJX25ldHhlbl9zZXRfYml0cyhjb25maWdfd29yZCwgMTgsIDEwLCB2YWwpCisjZGVmaW5lIG5ldHhlbl9zZXRfbXNnX29wY29kZShjb25maWdfd29yZCwgdmFsKQlcCisJX25ldHhlbl9zZXRfYml0cyhjb25maWdfd29yZCwgMjgsIDQsIHZhbCkKKworc3RydWN0IG5ldHhlbl9yY3ZfY29udGV4dCB7CisJdTMyIHJjdl9yaW5nX2FkZHJfbG87CisJdTMyIHJjdl9yaW5nX2FkZHJfaGk7CisJdTMyIHJjdl9yaW5nX3NpemU7CisJdTMyIHJzcnZkOworfTsKKworc3RydWN0IG5ldHhlbl9yaW5nX2N0eCB7CisKKwkvKiBvbmUgY29tbWFuZCByaW5nICovCisJdTY0IGNtZF9jb25zdW1lcl9vZmZzZXQ7CisJdTMyIGNtZF9yaW5nX2FkZHJfbG87CisJdTMyIGNtZF9yaW5nX2FkZHJfaGk7CisJdTMyIGNtZF9yaW5nX3NpemU7CisJdTMyIHJzcnZkOworCisJLyogdGhyZWUgcmVjZWl2ZSByaW5ncyAqLworCXN0cnVjdCBuZXR4ZW5fcmN2X2NvbnRleHQgcmN2X2N0eFszXTsKKworCS8qIG9uZSBzdGF0dXMgcmluZyAqLworCXUzMiBzdHNfcmluZ19hZGRyX2xvOworCXUzMiBzdHNfcmluZ19hZGRyX2hpOworCXUzMiBzdHNfcmluZ19zaXplOworCisJdTMyIGN0eF9pZDsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNjQpKSk7CisKKy8qCisgKiBGb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmVzIGRlc2NyaWJlIHRoZSBkZXNjcmlwdG9ycyB0aGF0IHdpbGwgYmUgdXNlZC4KKyAqIEFkZGVkIGZpbGVkcyBvZiB0Y3BIZHJTaXplIGFuZCBpcEhkclNpemUsIFRoZSBkcml2ZXIgbmVlZHMgdG8gZG8gaXQgb25seSB3aGVuCisgKiB3ZSBhcmUgZG9pbmcgTFNPIChhYm92ZSB0aGUgMTUwMCBzaXplIHBhY2tldCkgb25seS4KKyAqLworCisvKgorICogVGhlIHNpemUgb2YgcmVmZXJlbmNlIGhhbmRsZSBiZWVuIGNoYW5nZWQgdG8gMTYgYml0cyB0byBwYXNzIHRoZSBNU1MgZmllbGRzCisgKiBmb3IgdGhlIExTTyBwYWNrZXQKKyAqLworCisjZGVmaW5lIEZMQUdTX0NIRUNLU1VNX0VOQUJMRUQJMHgwMQorI2RlZmluZSBGTEFHU19MU09fRU5BQkxFRAkweDAyCisjZGVmaW5lIEZMQUdTX0lQU0VDX1NBX0FERAkweDA0CisjZGVmaW5lIEZMQUdTX0lQU0VDX1NBX0RFTEVURQkweDA4CisjZGVmaW5lIEZMQUdTX1ZMQU5fVEFHR0VECTB4MTAKKworI2RlZmluZSBuZXR4ZW5fc2V0X2NtZF9kZXNjX3BvcnQoY21kX2Rlc2MsIHZhcikJXAorCSgoY21kX2Rlc2MpLT5wb3J0X2N0eGlkIHw9ICgodmFyKSAmIDB4MEYpKQorCisjZGVmaW5lIG5ldHhlbl9zZXRfY21kX2Rlc2NfZmxhZ3MoY21kX2Rlc2MsIHZhbCkJXAorCV9uZXR4ZW5fc2V0X2JpdHMoKGNtZF9kZXNjKS0+ZmxhZ3Nfb3Bjb2RlLCAwLCA3LCB2YWwpCisjZGVmaW5lIG5ldHhlbl9zZXRfY21kX2Rlc2Nfb3Bjb2RlKGNtZF9kZXNjLCB2YWwpCVwKKwlfbmV0eGVuX3NldF9iaXRzKChjbWRfZGVzYyktPmZsYWdzX29wY29kZSwgNywgNiwgdmFsKQorCisjZGVmaW5lIG5ldHhlbl9zZXRfY21kX2Rlc2NfbnVtX29mX2J1ZmYoY21kX2Rlc2MsIHZhbCkJXAorCV9uZXR4ZW5fc2V0X2JpdHMoKGNtZF9kZXNjKS0+bnVtX29mX2J1ZmZlcnNfdG90YWxfbGVuZ3RoLCAwLCA4LCB2YWwpOworI2RlZmluZSBuZXR4ZW5fc2V0X2NtZF9kZXNjX3RvdGFsbGVuZ3RoKGNtZF9kZXNjLCB2YWwpCVwKKwlfbmV0eGVuX3NldF9iaXRzKChjbWRfZGVzYyktPm51bV9vZl9idWZmZXJzX3RvdGFsX2xlbmd0aCwgOCwgMjQsIHZhbCk7CisKKyNkZWZpbmUgbmV0eGVuX2dldF9jbWRfZGVzY19vcGNvZGUoY21kX2Rlc2MpCVwKKwkoKChjbWRfZGVzYyktPmZsYWdzX29wY29kZSA+PiA3KSAmIDB4MDAzRikKKyNkZWZpbmUgbmV0eGVuX2dldF9jbWRfZGVzY190b3RhbGxlbmd0aChjbWRfZGVzYykJXAorCSgoKGNtZF9kZXNjKS0+bnVtX29mX2J1ZmZlcnNfdG90YWxfbGVuZ3RoID4+IDgpICYgMHgwRkZGRkZGKQorCitzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgeworCXU4IHRjcF9oZHJfb2Zmc2V0OwkvKiBGb3IgTFNPIG9ubHkgKi8KKwl1OCBpcF9oZHJfb2Zmc2V0OwkvKiBGb3IgTFNPIG9ubHkgKi8KKwkvKiBCaXQgcGF0dGVybjogMC02IGZsYWdzLCA3LTEyIG9wY29kZSwgMTMtMTUgdW51c2VkICovCisJdTE2IGZsYWdzX29wY29kZTsKKwkvKiBCaXQgcGF0dGVybjogMC03IHRvdGFsIG51bWJlciBvZiBzZWdtZW50cywKKwkgICA4LTMxIFRvdGFsIHNpemUgb2YgdGhlIHBhY2tldCAqLworCXUzMiBudW1fb2ZfYnVmZmVyc190b3RhbF9sZW5ndGg7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGFkZHJfbG93X3BhcnQyOworCQkJdTMyIGFkZHJfaGlnaF9wYXJ0MjsKKwkJfTsKKwkJdTY0IGFkZHJfYnVmZmVyMjsKKwl9OworCisJdTE2IHJlZmVyZW5jZV9oYW5kbGU7CS8qIGNoYW5nZWQgdG8gdTE2IHRvIGFkZCBtc3MgKi8KKwl1MTYgbXNzOwkJLyogcGFzc2VkIGJ5IE5ESVNfUEFDS0VUIGZvciBMU08gKi8KKwkvKiBCaXQgcGF0dGVybiAwLTMgcG9ydCwgMC0zIGN0eCBpZCAqLworCXU4IHBvcnRfY3R4aWQ7CisJdTggdG90YWxfaGRyX2xlbmd0aDsJLyogTFNPIG9ubHkgOiBNQUMrSVArVENQIEhkciBzaXplICovCisJdTE2IGNvbm5faWQ7CQkvKiBJUFNlYyBvZmZvYWQgb25seSAqLworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGFkZHJfbG93X3BhcnQzOworCQkJdTMyIGFkZHJfaGlnaF9wYXJ0MzsKKwkJfTsKKwkJdTY0IGFkZHJfYnVmZmVyMzsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBhZGRyX2xvd19wYXJ0MTsKKwkJCXUzMiBhZGRyX2hpZ2hfcGFydDE7CisJCX07CisJCXU2NCBhZGRyX2J1ZmZlcjE7CisJfTsKKworCXUxNiBidWZmZXIxX2xlbmd0aDsKKwl1MTYgYnVmZmVyMl9sZW5ndGg7CisJdTE2IGJ1ZmZlcjNfbGVuZ3RoOworCXUxNiBidWZmZXI0X2xlbmd0aDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBhZGRyX2xvd19wYXJ0NDsKKwkJCXUzMiBhZGRyX2hpZ2hfcGFydDQ7CisJCX07CisJCXU2NCBhZGRyX2J1ZmZlcjQ7CisJfTsKKworCXU2NCB1bnVzZWQ7CisKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNjQpKSk7CisKKy8qIE5vdGU6IHNpemVvZihyY3ZfZGVzYykgc2hvdWxkIGFsd2F5cyBiZSBhIG11dGxpcGxlIG9mIDIgKi8KK3N0cnVjdCByY3ZfZGVzYyB7CisJdTE2IHJlZmVyZW5jZV9oYW5kbGU7CisJdTE2IHJlc2VydmVkOworCXUzMiBidWZmZXJfbGVuZ3RoOwkvKiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aCAodXN1YWxseSAySykgKi8KKwl1NjQgYWRkcl9idWZmZXI7Cit9OworCisvKiBvcGNvZGUgZmllbGQgaW4gc3RhdHVzX2Rlc2MgKi8KKyNkZWZpbmUgUkNWX05JQ19QS1QJKDB4QSkKKyNkZWZpbmUgU1RBVFVTX05JQ19QS1QJKChSQ1ZfTklDX1BLVCkgPDwgMTIpCisKKy8qIGZvciBzdGF0dXMgZmllbGQgaW4gc3RhdHVzX2Rlc2MgKi8KKyNkZWZpbmUgU1RBVFVTX05FRURfQ0tTVU0JKDEpCisjZGVmaW5lIFNUQVRVU19DS1NVTV9PSwkJKDIpCisKKy8qIG93bmVyIGJpdHMgb2Ygc3RhdHVzX2Rlc2MgKi8KKyNkZWZpbmUgU1RBVFVTX09XTkVSX0hPU1QJKDB4MSkKKyNkZWZpbmUgU1RBVFVTX09XTkVSX1BIQU5UT00JKDB4MikKKworI2RlZmluZSBORVRYRU5fUFJPVF9JUAkJKDEpCisjZGVmaW5lIE5FVFhFTl9QUk9UX1VOS05PV04JKDApCisKKy8qIE5vdGU6IHNpemVvZihzdGF0dXNfZGVzYykgc2hvdWxkIGFsd2F5cyBiZSBhIG11dGxpcGxlIG9mIDIgKi8KKworI2RlZmluZSBuZXR4ZW5fZ2V0X3N0c19kZXNjX2xyb19jbnQoc3RhdHVzX2Rlc2MpCVwKKwkoKHN0YXR1c19kZXNjKS0+bHJvICYgMHg3RikKKyNkZWZpbmUgbmV0eGVuX2dldF9zdHNfZGVzY19scm9fbGFzdF9mcmFnKHN0YXR1c19kZXNjKQlcCisJKCgoc3RhdHVzX2Rlc2MpLT5scm8gJiAweDgwKSA+PiA3KQorCisjZGVmaW5lIG5ldHhlbl9nZXRfc3RzX3BvcnQoc3RhdHVzX2Rlc2MpCVwKKwkoKHN0YXR1c19kZXNjKS0+c3RhdHVzX2Rlc2NfZGF0YSAmIDB4MEYpCisjZGVmaW5lIG5ldHhlbl9nZXRfc3RzX3N0YXR1cyhzdGF0dXNfZGVzYykJXAorCSgoKHN0YXR1c19kZXNjKS0+c3RhdHVzX2Rlc2NfZGF0YSA+PiA0KSAmIDB4MEYpCisjZGVmaW5lIG5ldHhlbl9nZXRfc3RzX3R5cGUoc3RhdHVzX2Rlc2MpCVwKKwkoKChzdGF0dXNfZGVzYyktPnN0YXR1c19kZXNjX2RhdGEgPj4gOCkgJiAweDBGKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3N0c190b3RhbGxlbmd0aChzdGF0dXNfZGVzYykJXAorCSgoKHN0YXR1c19kZXNjKS0+c3RhdHVzX2Rlc2NfZGF0YSA+PiAxMikgJiAweEZGRkYpCisjZGVmaW5lIG5ldHhlbl9nZXRfc3RzX3JlZmhhbmRsZShzdGF0dXNfZGVzYykJXAorCSgoKHN0YXR1c19kZXNjKS0+c3RhdHVzX2Rlc2NfZGF0YSA+PiAyOCkgJiAweEZGRkYpCisjZGVmaW5lIG5ldHhlbl9nZXRfc3RzX3Byb3Qoc3RhdHVzX2Rlc2MpCVwKKwkoKChzdGF0dXNfZGVzYyktPnN0YXR1c19kZXNjX2RhdGEgPj4gNDQpICYgMHgwRikKKyNkZWZpbmUgbmV0eGVuX2dldF9zdHNfb3duZXIoc3RhdHVzX2Rlc2MpCVwKKwkoKChzdGF0dXNfZGVzYyktPnN0YXR1c19kZXNjX2RhdGEgPj4gNTYpICYgMHgwMykKKyNkZWZpbmUgbmV0eGVuX2dldF9zdHNfb3Bjb2RlKHN0YXR1c19kZXNjKQlcCisJKCgoc3RhdHVzX2Rlc2MpLT5zdGF0dXNfZGVzY19kYXRhID4+IDU4KSAmIDB4MDNGKQorCisjZGVmaW5lIG5ldHhlbl9jbGVhcl9zdHNfb3duZXIoc3RhdHVzX2Rlc2MpCVwKKwkoKHN0YXR1c19kZXNjKS0+c3RhdHVzX2Rlc2NfZGF0YSAmPQlcCisJfigoKHVuc2lnbmVkIGxvbmcgbG9uZykzKSA8PCA1NiApKQorI2RlZmluZSBuZXR4ZW5fc2V0X3N0c19vd25lcihzdGF0dXNfZGVzYywgdmFsKQlcCisJKChzdGF0dXNfZGVzYyktPnN0YXR1c19kZXNjX2RhdGEgfD0JXAorCSgoKHVuc2lnbmVkIGxvbmcgbG9uZykoKHZhbCkgJiAweDMpKSA8PCA1NiApKQorCitzdHJ1Y3Qgc3RhdHVzX2Rlc2MgeworCS8qIEJpdCBwYXR0ZXJuOiAwLTMgcG9ydCwgNC03IHN0YXR1cywgOC0xMSB0eXBlLCAxMi0yNyB0b3RhbF9sZW5ndGgKKwkgICAyOC00MyByZWZlcmVuY2VfaGFuZGxlLCA0NC00NyBwcm90b2NvbCwgNDgtNTIgdW51c2VkCisJICAgNTMtNTUgZGVzY19jbnQsIDU2LTU3IG93bmVyLCA1OC02MyBvcGNvZGUKKwkgKi8KKwl1NjQgc3RhdHVzX2Rlc2NfZGF0YTsKKwl1MzIgaGFzaF92YWx1ZTsKKwl1OCBoYXNoX3R5cGU7CisJdTggbXNnX3R5cGU7CisJdTggdW51c2VkOworCS8qIEJpdCBwYXR0ZXJuOiAwLTYgbHJvX2NvdW50IGluZGljYXRlcyBmcmFnIHNlcXVlbmNlLAorCSAgIDcgbGFzdF9mcmFnIGluZGljYXRlcyBsYXN0IGZyYWcgKi8KKwl1OCBscm87Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisKK2VudW0geworCU5FVFhFTl9SQ1ZfUEVHXzAgPSAwLAorCU5FVFhFTl9SQ1ZfUEVHXzEKK307CisvKiBUaGUgdmVyc2lvbiBvZiB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZSAqLworI2RlZmluZQlORVRYRU5fQkRJTkZPX1ZFUlNJT04gMQorCisvKiBNYWdpYyBudW1iZXIgdG8gbGV0IHVzZXIga25vdyBmbGFzaCBpcyBwcm9ncmFtbWVkICovCisjZGVmaW5lCU5FVFhFTl9CRElORk9fTUFHSUMgMHgxMjM0NTY3OAorCisvKiBNYXggbnVtYmVyIG9mIEdpZyBwb3J0cyBvbiBhIFBoYW50b20gYm9hcmQgKi8KKyNkZWZpbmUgTkVUWEVOX01BWF9QT1JUUyA0CisKK3R5cGVkZWYgZW51bSB7CisJTkVUWEVOX0JSRFRZUEVfUDFfQkQgPSAweDAwMDAsCisJTkVUWEVOX0JSRFRZUEVfUDFfU0IgPSAweDAwMDEsCisJTkVUWEVOX0JSRFRZUEVfUDFfU01BWCA9IDB4MDAwMiwKKwlORVRYRU5fQlJEVFlQRV9QMV9TT0NLID0gMHgwMDAzLAorCisJTkVUWEVOX0JSRFRZUEVfUDJfU09DS18zMSA9IDB4MDAwOCwKKwlORVRYRU5fQlJEVFlQRV9QMl9TT0NLXzM1ID0gMHgwMDA5LAorCU5FVFhFTl9CUkRUWVBFX1AyX1NCMzVfNEcgPSAweDAwMGEsCisJTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEcgPSAweDAwMGIsCisJTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8yRyA9IDB4MDAwYywKKworCU5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0lNRVogPSAweDAwMGQsCisJTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSE1FWiA9IDB4MDAwZSwKKwlORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19DWDQgPSAweDAwMGYKK30gbmV0eGVuX2JyZHR5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlORVRYRU5fQlJETUZHX0lOVkVOVEVDID0gMQorfSBuZXR4ZW5fYnJkbWZnOworCit0eXBlZGVmIGVudW0geworCU1FTV9PUkdfMTI4TWJ4NCA9IDB4MCwJLyogRERSMSBvbmx5ICovCisJTUVNX09SR18xMjhNYng4ID0gMHgxLAkvKiBERFIxIG9ubHkgKi8KKwlNRU1fT1JHXzEyOE1ieDE2ID0gMHgyLAkvKiBERFIxIG9ubHkgKi8KKwlNRU1fT1JHXzI1Nk1ieDQgPSAweDMsCisJTUVNX09SR18yNTZNYng4ID0gMHg0LAorCU1FTV9PUkdfMjU2TWJ4MTYgPSAweDUsCisJTUVNX09SR181MTJNYng0ID0gMHg2LAorCU1FTV9PUkdfNTEyTWJ4OCA9IDB4NywKKwlNRU1fT1JHXzUxMk1ieDE2ID0gMHg4LAorCU1FTV9PUkdfMUdieDQgPSAweDksCisJTUVNX09SR18xR2J4OCA9IDB4YSwKKwlNRU1fT1JHXzFHYngxNiA9IDB4YiwKKwlNRU1fT1JHXzJHYng0ID0gMHhjLAorCU1FTV9PUkdfMkdieDggPSAweGQsCisJTUVNX09SR18yR2J4MTYgPSAweGUsCisJTUVNX09SR18xMjhNYngzMiA9IDB4MTAwMDIsCS8qIEdERFIgb25seSAqLworCU1FTV9PUkdfMjU2TWJ4MzIgPSAweDEwMDA1CS8qIEdERFIgb25seSAqLworfSBuZXR4ZW5fbW5fbWVtX29yZ190OworCit0eXBlZGVmIGVudW0geworCU1FTV9PUkdfNTEyS3gzNiA9IDB4MCwKKwlNRU1fT1JHXzFNeDM2ID0gMHgxLAorCU1FTV9PUkdfMk14MzYgPSAweDIKK30gbmV0eGVuX3NuX21lbV9vcmdfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlNRU1fREVQVEhfNE1CID0gMHgxLAorCU1FTV9ERVBUSF84TUIgPSAweDIsCisJTUVNX0RFUFRIXzE2TUIgPSAweDMsCisJTUVNX0RFUFRIXzMyTUIgPSAweDQsCisJTUVNX0RFUFRIXzY0TUIgPSAweDUsCisJTUVNX0RFUFRIXzEyOE1CID0gMHg2LAorCU1FTV9ERVBUSF8yNTZNQiA9IDB4NywKKwlNRU1fREVQVEhfNTEyTUIgPSAweDgsCisJTUVNX0RFUFRIXzFHQiA9IDB4OSwKKwlNRU1fREVQVEhfMkdCID0gMHhhLAorCU1FTV9ERVBUSF80R0IgPSAweGIsCisJTUVNX0RFUFRIXzhHQiA9IDB4YywKKwlNRU1fREVQVEhfMTZHQiA9IDB4ZCwKKwlNRU1fREVQVEhfMzJHQiA9IDB4ZQorfSBuZXR4ZW5fbWVtX2RlcHRoX3Q7CisKK3N0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbyB7CisJdTMyIGhlYWRlcl92ZXJzaW9uOworCisJdTMyIGJvYXJkX21mZzsKKwl1MzIgYm9hcmRfdHlwZTsKKwl1MzIgYm9hcmRfbnVtOworCXUzMiBjaGlwX2lkOworCXUzMiBjaGlwX21pbm9yOworCXUzMiBjaGlwX21ham9yOworCXUzMiBjaGlwX3BrZzsKKwl1MzIgY2hpcF9sb3Q7CisKKwl1MzIgcG9ydF9tYXNrOwkJLyogYXZhaWxhYmxlIG5pdSBwb3J0cyAqLworCXUzMiBwZWdfbWFzazsJCS8qIGF2YWlsYWJsZSBwZWdzICovCisJdTMyIGljYWNoZV9vazsJCS8qIGNhbiB3ZSBydW4gd2l0aCBpY2FjaGU/ICovCisJdTMyIGRjYWNoZV9vazsJCS8qIGNhbiB3ZSBydW4gd2l0aCBkY2FjaGU/ICovCisJdTMyIGNhc3Blcl9vazsKKworCXUzMiBtYWNfYWRkcl9sb18wOworCXUzMiBtYWNfYWRkcl9sb18xOworCXUzMiBtYWNfYWRkcl9sb18yOworCXUzMiBtYWNfYWRkcl9sb18zOworCisJLyogTU4tcmVsYXRlZCBjb25maWcgKi8KKwl1MzIgbW5fc3luY19tb2RlOwkvKiBlbmFibGUvIHN5bmMgc2hpZnQgY2Nsay8gc3luYyBzaGlmdCBtY2xrICovCisJdTMyIG1uX3N5bmNfc2hpZnRfY2NsazsKKwl1MzIgbW5fc3luY19zaGlmdF9tY2xrOworCXUzMiBtbl93Yl9lbjsKKwl1MzIgbW5fY3J5c3RhbF9mcmVxOwkvKiBpbiBNSHogKi8KKwl1MzIgbW5fc3BlZWQ7CQkvKiBpbiBNSHogKi8KKwl1MzIgbW5fb3JnOworCXUzMiBtbl9kZXB0aDsKKwl1MzIgbW5fcmFua3NfMDsJCS8qIHJhbmtzIHBlciBzbG90ICovCisJdTMyIG1uX3JhbmtzXzE7CQkvKiByYW5rcyBwZXIgc2xvdCAqLworCXUzMiBtbl9yZF9sYXRlbmN5XzA7CisJdTMyIG1uX3JkX2xhdGVuY3lfMTsKKwl1MzIgbW5fcmRfbGF0ZW5jeV8yOworCXUzMiBtbl9yZF9sYXRlbmN5XzM7CisJdTMyIG1uX3JkX2xhdGVuY3lfNDsKKwl1MzIgbW5fcmRfbGF0ZW5jeV81OworCXUzMiBtbl9yZF9sYXRlbmN5XzY7CisJdTMyIG1uX3JkX2xhdGVuY3lfNzsKKwl1MzIgbW5fcmRfbGF0ZW5jeV84OworCXUzMiBtbl9kbGxfdmFsWzE4XTsKKwl1MzIgbW5fbW9kZV9yZWc7CS8qIE1JVSBERFIgTW9kZSBSZWdpc3RlciAqLworCXUzMiBtbl9leHRfbW9kZV9yZWc7CS8qIE1JVSBERFIgRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciAqLworCXUzMiBtbl90aW1pbmdfMDsJLyogTUlVIE1lbW9yeSBDb250cm9sIFRpbWluZyBSZ2lzdGVyICovCisJdTMyIG1uX3RpbWluZ18xOwkvKiBNSVUgRXh0ZW5kZWQgTWVtb3J5IEN0cmwgVGltaW5nIFJlZ2lzdGVyICovCisJdTMyIG1uX3RpbWluZ18yOwkvKiBNSVUgRXh0ZW5kZWQgTWVtb3J5IEN0cmwgVGltaW5nMiBSZWdpc3RlciAqLworCisJLyogU04tcmVsYXRlZCBjb25maWcgKi8KKwl1MzIgc25fc3luY19tb2RlOwkvKiBlbmFibGUvIHN5bmMgc2hpZnQgY2NsayAvIHN5bmMgc2hpZnQgbWNsayAqLworCXUzMiBzbl9wdF9tb2RlOwkJLyogcGFzcyB0aHJvdWdoIG1vZGUgKi8KKwl1MzIgc25fZWNjX2VuOworCXUzMiBzbl93Yl9lbjsKKwl1MzIgc25fY3J5c3RhbF9mcmVxOworCXUzMiBzbl9zcGVlZDsKKwl1MzIgc25fb3JnOworCXUzMiBzbl9kZXB0aDsKKwl1MzIgc25fZGxsX3RhcDsKKwl1MzIgc25fcmRfbGF0ZW5jeTsKKworCXUzMiBtYWNfYWRkcl9oaV8wOworCXUzMiBtYWNfYWRkcl9oaV8xOworCXUzMiBtYWNfYWRkcl9oaV8yOworCXUzMiBtYWNfYWRkcl9oaV8zOworCisJdTMyIG1hZ2ljOwkJLyogaW5kaWNhdGVzIGZsYXNoIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisKKwl1MzIgbW5fcmRpbW07CisJdTMyIG1uX2RsbF9vdmVycmlkZTsKKworfTsKKworI2RlZmluZSBGTEFTSF9OVU1fUE9SVFMJCSg0KQorCitzdHJ1Y3QgbmV0eGVuX2ZsYXNoX21hY19hZGRyIHsKKwl1MzIgZmxhc2hfYWRkclszMl07Cit9OworCitzdHJ1Y3QgbmV0eGVuX3VzZXJfb2xkX2luZm8geworCXU4IGZsYXNoX21kNVsxNl07CisJdTggY3JiaW5pdF9tZDVbMTZdOworCXU4IGJyZGNmZ19tZDVbMTZdOworCS8qIGJvb3Rsb2FkZXIgKi8KKwl1MzIgYm9vdGxkX3ZlcnNpb247CisJdTMyIGJvb3RsZF9zaXplOworCXU4IGJvb3RsZF9tZDVbMTZdOworCS8qIGltYWdlICovCisJdTMyIGltYWdlX3ZlcnNpb247CisJdTMyIGltYWdlX3NpemU7CisJdTggaW1hZ2VfbWQ1WzE2XTsKKwkvKiBwcmltYXJ5IGltYWdlIHN0YXR1cyAqLworCXUzMiBwcmltYXJ5X3N0YXR1czsKKwl1MzIgc2Vjb25kYXJ5X3ByZXNlbnQ7CisKKwkvKiBNQUMgYWRkcmVzcyAsIDQgcG9ydHMgKi8KKwlzdHJ1Y3QgbmV0eGVuX2ZsYXNoX21hY19hZGRyIG1hY19hZGRyW0ZMQVNIX05VTV9QT1JUU107Cit9OworI2RlZmluZSBGTEFTSF9OVU1fTUFDX1BFUl9QT1JUCTMyCitzdHJ1Y3QgbmV0eGVuX3VzZXJfaW5mbyB7CisJdTggZmxhc2hfbWQ1WzE2ICogNjRdOworCS8qIGJvb3Rsb2FkZXIgKi8KKwl1MzIgYm9vdGxkX3ZlcnNpb247CisJdTMyIGJvb3RsZF9zaXplOworCS8qIGltYWdlICovCisJdTMyIGltYWdlX3ZlcnNpb247CisJdTMyIGltYWdlX3NpemU7CisJLyogcHJpbWFyeSBpbWFnZSBzdGF0dXMgKi8KKwl1MzIgcHJpbWFyeV9zdGF0dXM7CisJdTMyIHNlY29uZGFyeV9wcmVzZW50OworCisJLyogTUFDIGFkZHJlc3MgLCA0IHBvcnRzLCAzMiBhZGRyZXNzIHBlciBwb3J0ICovCisJdTY0IG1hY19hZGRyW0ZMQVNIX05VTV9QT1JUUyAqIEZMQVNIX05VTV9NQUNfUEVSX1BPUlRdOworCXUzMiBzdWJfc3lzX2lkOworCXU4IHNlcmlhbF9udW1bMzJdOworCisJLyogQW55IHVzZXIgZGVmaW5lZCBkYXRhICovCit9OworCisvKgorICogRmxhc2ggTGF5b3V0IC0gbmV3IGZvcm1hdC4KKyAqLworc3RydWN0IG5ldHhlbl9uZXdfdXNlcl9pbmZvIHsKKwl1OCBmbGFzaF9tZDVbMTYgKiA2NF07CisJLyogYm9vdGxvYWRlciAqLworCXUzMiBib290bGRfdmVyc2lvbjsKKwl1MzIgYm9vdGxkX3NpemU7CisJLyogaW1hZ2UgKi8KKwl1MzIgaW1hZ2VfdmVyc2lvbjsKKwl1MzIgaW1hZ2Vfc2l6ZTsKKwkvKiBwcmltYXJ5IGltYWdlIHN0YXR1cyAqLworCXUzMiBwcmltYXJ5X3N0YXR1czsKKwl1MzIgc2Vjb25kYXJ5X3ByZXNlbnQ7CisKKwkvKiBNQUMgYWRkcmVzcyAsIDQgcG9ydHMsIDMyIGFkZHJlc3MgcGVyIHBvcnQgKi8KKwl1NjQgbWFjX2FkZHJbRkxBU0hfTlVNX1BPUlRTICogRkxBU0hfTlVNX01BQ19QRVJfUE9SVF07CisJdTMyIHN1Yl9zeXNfaWQ7CisJdTggc2VyaWFsX251bVszMl07CisKKwkvKiBBbnkgdXNlciBkZWZpbmVkIGRhdGEgKi8KK307CisKKyNkZWZpbmUgU0VDT05EQVJZX0lNQUdFX1BSRVNFTlQgMHhiM2I0YjViNgorI2RlZmluZSBTRUNPTkRBUllfSU1BR0VfQUJTRU5UCTB4ZmZmZmZmZmYKKyNkZWZpbmUgUFJJTUFSWV9JTUFHRV9HT09ECTB4NWE1YTVhNWEKKyNkZWZpbmUgUFJJTUFSWV9JTUFHRV9CQUQJMHhmZmZmZmZmZgorCisvKiBGbGFzaCBtZW1vcnkgbWFwICovCit0eXBlZGVmIGVudW0geworCUNSQklOSVRfU1RBUlQgPSAwLAkvKiBDcmJpbml0IHNlY3Rpb24gKi8KKwlCUkRDRkdfU1RBUlQgPSAweDQwMDAsCS8qIGJvYXJkIGNvbmZpZyAqLworCUlOSVRDT0RFX1NUQVJUID0gMHg2MDAwLAkvKiBwZWd0dW5lIGNvZGUgKi8KKwlCT09UTERfU1RBUlQgPSAweDEwMDAwLAkvKiBib290bGQgKi8KKwlJTUFHRV9TVEFSVCA9IDB4NDMwMDAsCS8qIGNvbXByZXNzZWQgaW1hZ2UgKi8KKwlTRUNPTkRBUllfU1RBUlQgPSAweDIwMDAwMCwJLyogYmFja3VwIGltYWdlcyAqLworCVBYRV9TVEFSVCA9IDB4M0UwMDAwLAkvKiB1c2VyIGRlZmluZWQgcmVnaW9uICovCisJVVNFUl9TVEFSVCA9IDB4M0U4MDAwLAkvKiBVc2VyIGRlZmluZWQgcmVnaW9uIGZvciBuZXcgYm9hcmRzICovCisJRklYRURfU1RBUlQgPSAweDNGMDAwMAkvKiBiYWNrdXAgb2YgY3JiaW5pdCAqLworfSBuZXR4ZW5fZmxhc2hfbWFwX3Q7CisKKyNkZWZpbmUgVVNFUl9TVEFSVF9PTEQgUFhFX1NUQVJUCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisKKyNkZWZpbmUgRkxBU0hfU1RBUlQJCShDUkJJTklUX1NUQVJUKQorI2RlZmluZSBJTklUX1NFQ1RPUgkJKDApCisjZGVmaW5lIFBSSU1BUllfU1RBUlQgCQkoQk9PVExEX1NUQVJUKQorI2RlZmluZSBGTEFTSF9DUkJJTklUX1NJWkUgCSgweDQwMDApCisjZGVmaW5lIEZMQVNIX0JSRENGR19TSVpFIAkoc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbykpCisjZGVmaW5lIEZMQVNIX1VTRVJfU0laRQkJKHNpemVvZihzdHJ1Y3QgbmV0eGVuX3VzZXJfaW5mbykvc2l6ZW9mKHUzMikpCisjZGVmaW5lIEZMQVNIX1NFQ09OREFSWV9TSVpFIAkoVVNFUl9TVEFSVC1TRUNPTkRBUllfU1RBUlQpCisjZGVmaW5lIE5VTV9QUklNQVJZX1NFQ1RPUlMJKDB4MjApCisjZGVmaW5lIE5VTV9DT05GSUdfU0VDVE9SUyAJKDEpCisjZGVmaW5lIFBGWCAiTmV0WGVuOiAiCitleHRlcm4gY2hhciBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lW107CisKKy8qIE5vdGU6IE1ha2Ugc3VyZSB0byBub3QgY2FsbCB0aGlzIGJlZm9yZSBhZGFwdGVyLT5wb3J0IGlzIHZhbGlkICovCisjaWYgIWRlZmluZWQoTkVUWEVOX0RFQlVHKQorI2RlZmluZSBEUFJJTlRLKGtsZXZlbCwgZm10LCBhcmdzLi4uKQlkbyB7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhrbGV2ZWwsIGZtdCwgYXJncy4uLikJZG8geyBcCisJcHJpbnRrKEtFUk5fIyNrbGV2ZWwgUEZYICIlczogJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sXAorCQkoYWRhcHRlciAhPSBOVUxMICYmIFwKKwkJYWRhcHRlci0+cG9ydFswXSAhPSBOVUxMICYmIFwKKwkJYWRhcHRlci0+cG9ydFswXS0+bmV0ZGV2ICE9IE5VTEwpID8gXAorCQlhZGFwdGVyLT5wb3J0WzBdLT5uZXRkZXYtPm5hbWUgOiBOVUxMLCBcCisJCSMjIGFyZ3MpOyB9IHdoaWxlKDApCisjZW5kaWYKKworLyogTnVtYmVyIG9mIHN0YXR1cyBkZXNjcmlwdG9ycyB0byBoYW5kbGUgcGVyIGludGVycnVwdCAqLworI2RlZmluZSBNQVhfU1RBVFVTX0hBTkRMRQkoMTI4KQorCisvKgorICogbmV0eGVuX3NrYl9mcmFne30gaXMgdG8gY29udGFpbiBtYXBwaW5nIGluZm8gZm9yIGVhY2ggU0cgbGlzdC4gVGhpcworICogaGFzIHRvIGJlIGZyZWVkIHdoZW4gRE1BIGlzIGNvbXBsZXRlLiBUaGlzIGlzIHBhcnQgb2YgbmV0eGVuX3R4X2J1ZmZlcnt9LgorICovCitzdHJ1Y3QgbmV0eGVuX3NrYl9mcmFnIHsKKwl1NjQgZG1hOworCXUzMiBsZW5ndGg7Cit9OworCisvKiAgICBGb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBzdGF0ZSBvZiB0aGUgYnVmZmVycyAgICAqLworI2RlZmluZQlORVRYRU5fQlVGRkVSX0ZSRUUJMAorI2RlZmluZQlORVRYRU5fQlVGRkVSX0JVU1kJMQorCisvKgorICogVGhlcmUgd2lsbCBiZSBvbmUgbmV0eGVuX2J1ZmZlciBwZXIgc2tiIHBhY2tldC4gICAgVGhlc2Ugd2lsbCBiZQorICogdXNlZCB0byBzYXZlIHRoZSBkbWEgaW5mbyBmb3IgcGNpX3VubWFwX3BhZ2UoKQorICovCitzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIgeworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldHhlbl9za2JfZnJhZyBmcmFnX2FycmF5W01BWF9CVUZGRVJTX1BFUl9DTUQgKyAxXTsKKwl1MzIgdG90YWxfbGVuZ3RoOworCXUzMiBtc3M7CisJdTE2IHBvcnQ7CisJdTggY21kOworCXU4IGZyYWdfY291bnQ7CisJdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOworCXUzMiBzdGF0ZTsKK307CisKKy8qIEluIHJ4X2J1ZmZlciwgd2UgZG8gbm90IG5lZWQgbXVsdGlwbGUgZnJhZ21lbnRzIGFzIGlzIGEgc2luZ2xlIGJ1ZmZlciAqLworc3RydWN0IG5ldHhlbl9yeF9idWZmZXIgeworCXN0cnVjdCBza19idWZmICpza2I7CisJdTY0IGRtYTsKKwl1MTYgcmVmX2hhbmRsZTsKKwl1MTYgc3RhdGU7CisJdTMyIGxyb19leHBlY3RlZF9mcmFnczsKKwl1MzIgbHJvX2N1cnJlbnRfZnJhZ3M7CisJdTMyIGxyb19sZW5ndGg7Cit9OworCisvKiBCb2FyZCB0eXBlcyAqLworI2RlZmluZQlORVRYRU5fTklDX0dCRQkweDAxCisjZGVmaW5lCU5FVFhFTl9OSUNfWEdCRQkweDAyCisKKy8qCisgKiBPbmUgaGFyZHdhcmVfY29udGV4dHt9IHBlciBhZGFwdGVyCisgKiBjb250YWlucyBpbnRlcnJ1cHQgaW5mbyBhcyB3ZWxsIHNoYXJlZCBoYXJkd2FyZSBpbmZvLgorICovCitzdHJ1Y3QgbmV0eGVuX2hhcmR3YXJlX2NvbnRleHQgeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXZvaWQgX19pb21lbSAqcGNpX2Jhc2UwOworCXZvaWQgX19pb21lbSAqcGNpX2Jhc2UxOworCXZvaWQgX19pb21lbSAqcGNpX2Jhc2UyOworCXZvaWQgX19pb21lbSAqZGJfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGRiX2xlbjsKKworCXU4IHJldmlzaW9uX2lkOworCXUxNiBib2FyZF90eXBlOworCXUxNiBtYXhfcG9ydHM7CisJc3RydWN0IG5ldHhlbl9ib2FyZF9pbmZvIGJvYXJkY2ZnOworCXUzMiB4Z19saW5rdXA7CisJdTMyIHFnX2xpbmtzdXA7CisJLyogQWRkcmVzcyBvZiBjbWQgcmluZyBpbiBQaGFudG9tICovCisJc3RydWN0IGNtZF9kZXNjX3R5cGUwICpjbWRfZGVzY19oZWFkOworCXN0cnVjdCBwY2lfZGV2ICpjbWRfZGVzY19wZGV2OworCWRtYV9hZGRyX3QgY21kX2Rlc2NfcGh5c19hZGRyOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcjsKK307CisKKyNkZWZpbmUgUkNWX1JJTkdfTFJPCVJDVl9ERVNDX0xSTworCisjZGVmaW5lIE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRQk2NAkvKiBXaXRoIEZDUyAqLworI2RlZmluZSBFVEhFUk5FVF9GQ1NfU0laRQkJNAorCitzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXJfc3RhdHMgeworCXU2NCBpbnRzOworCXU2NCBob3N0aW50czsKKwl1NjQgb3RoZXJpbnRzOworCXU2NCBwcm9jZXNzX3JjdjsKKwl1NjQgcHJvY2Vzc194bWl0OworCXU2NCBub3htaXRkb25lOworCXU2NCB4bWl0Y3N1bW1lZDsKKwl1NjQgcG9zdF9jYWxsZWQ7CisJdTY0IHBvc3RlZDsKKwl1NjQgbGFzdHBvc3RlZDsKKwl1NjQgZ29vZHNrYnBvc3RzOworfTsKKworLyoKKyAqIFJjdiBEZXNjcmlwdG9yIENvbnRleHQuIE9uZSBzdWNoIHBlciBSY3YgRGVzY3JpcHRvci4gVGhlcmUgbWF5CisgKiBiZSBvbmUgUmN2IERlc2NyaXB0b3IgZm9yIG5vcm1hbCBwYWNrZXRzLCBvbmUgZm9yIGp1bWJvIGFuZCBtYXkgYmUgb3RoZXJzLgorICovCitzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCB7CisJdTMyIGZsYWdzOworCXUzMiBwcm9kdWNlcjsKKwl1MzIgcmN2X3BlbmRpbmc7CS8qIE51bSBvZiBidWZzIHBvc3RlZCBpbiBwaGFudG9tICovCisJdTMyIHJjdl9mcmVlOwkJLyogTnVtIG9mIGJ1ZnMgaW4gZnJlZSBsaXN0ICovCisJZG1hX2FkZHJfdCBwaHlzX2FkZHI7CisJc3RydWN0IHBjaV9kZXYgKnBoeXNfcGRldjsKKwlzdHJ1Y3QgcmN2X2Rlc2MgKmRlc2NfaGVhZDsJLyogYWRkcmVzcyBvZiByeCByaW5nIGluIFBoYW50b20gKi8KKwl1MzIgbWF4X3J4X2Rlc2NfY291bnQ7CisJdTMyIGRtYV9zaXplOworCXUzMiBza2Jfc2l6ZTsKKwlzdHJ1Y3QgbmV0eGVuX3J4X2J1ZmZlciAqcnhfYnVmX2FycjsJLyogcnggYnVmZmVycyBmb3IgcmVjZWl2ZSAgICovCisJaW50IGJlZ2luX2FsbG9jOworfTsKKworLyoKKyAqIFJlY2VpdmUgY29udGV4dC4gVGhlcmUgaXMgb25lIHN1Y2ggc3RydWN0dXJlIHBlciBpbnN0YW5jZSBvZiB0aGUKKyAqIHJlY2VpdmUgcHJvY2Vzc2luZy4gQW55IHN0YXRlIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsZXZhbnQgdG8KKyAqIHRoZSByZWNlaXZlLCBhbmQgaXMgbXVzdCBiZSBpbiB0aGlzIHN0cnVjdHVyZS4gVGhlIGdsb2JhbCBkYXRhIG1heSBiZQorICogcHJlc2VudCBlbHNld2hlcmUuCisgKi8KK3N0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0IHsKKwlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCByY3ZfZGVzY1tOVU1fUkNWX0RFU0NfUklOR1NdOworCXUzMiBzdGF0dXNfcnhfcHJvZHVjZXI7CisJdTMyIHN0YXR1c19yeF9jb25zdW1lcjsKKwlkbWFfYWRkcl90IHJjdl9zdGF0dXNfZGVzY19waHlzX2FkZHI7CisJc3RydWN0IHBjaV9kZXYgKnJjdl9zdGF0dXNfZGVzY19wZGV2OworCXN0cnVjdCBzdGF0dXNfZGVzYyAqcmN2X3N0YXR1c19kZXNjX2hlYWQ7Cit9OworCisjZGVmaW5lIE5FVFhFTl9OSUNfTVNJX0VOQUJMRUQgMHgwMgorI2RlZmluZSBORVRYRU5fRE1BX01BU0sJMHhmZmZmZmZmZQorI2RlZmluZSBORVRYRU5fREJfTUFQU0laRV9CWVRFUyAgICAweDEwMDAKKworc3RydWN0IG5ldHhlbl9kdW1teV9kbWEgeworCXZvaWQgKmFkZHI7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHI7Cit9OworCitzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgeworCXN0cnVjdCBuZXR4ZW5faGFyZHdhcmVfY29udGV4dCBhaHc7CisJaW50IHBvcnRfY291bnQ7CQkvKiBOdW1iZXIgb2YgY29uZmlndXJlZCBwb3J0cyAgKi8KKwlpbnQgYWN0aXZlX3BvcnRzOwkvKiBOdW1iZXIgb2Ygb3BlbiBwb3J0cyAqLworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydFtORVRYRU5fTUFYX1BPUlRTXTsJLyogcHRyIHRvIGVhY2ggcG9ydCAgKi8KKwlzcGlubG9ja190IHR4X2xvY2s7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaGRvZ190YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZ190aW1lcjsKKworCXUzMiBjdXJyX3dpbmRvdzsKKworCXUzMiBjbWRfcHJvZHVjZXI7CisJdTMyICpjbWRfY29uc3VtZXI7CisKKwl1MzIgbGFzdF9jbWRfY29uc3VtZXI7CisJdTMyIG1heF90eF9kZXNjX2NvdW50OworCXUzMiBtYXhfcnhfZGVzY19jb3VudDsKKwl1MzIgbWF4X2p1bWJvX3J4X2Rlc2NfY291bnQ7CisJdTMyIG1heF9scm9fcnhfZGVzY19jb3VudDsKKwkvKiBOdW0gb2YgaW5zdGFuY2VzIGFjdGl2ZSBvbiBjbWQgYnVmZmVyIHJpbmcgKi8KKwl1MzIgcHJvY19jbWRfYnVmX2NvdW50ZXI7CisKKwl1MzIgbnVtX3RocmVhZHMsIHRvdGFsX3RocmVhZHM7CS8qVXNlIHRvIGtlZXAgdHJhY2sgb2YgeG1pdCB0aHJlYWRzICovCisKKwl1MzIgZmxhZ3M7CisJdTMyIGlycTsKKwlpbnQgZHJpdmVyX21pc21hdGNoOworCXUzMiB0ZW1wOworCisJc3RydWN0IG5ldHhlbl9hZGFwdGVyX3N0YXRzIHN0YXRzOworCisJc3RydWN0IG5ldHhlbl9jbWRfYnVmZmVyICpjbWRfYnVmX2FycjsJLyogQ29tbWFuZCBidWZmZXJzIGZvciB4bWl0ICovCisKKwkvKgorCSAqIFJlY2VpdmUgaW5zdGFuY2VzLiBUaGVzZSBjYW4gYmUgZWl0aGVyIG9uZSBwZXIgcG9ydCwKKwkgKiBvciBvbmUgcGVyIHBlZywgZXRjLgorCSAqLworCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0IHJlY3ZfY3R4W01BWF9SQ1ZfQ1RYXTsKKworCWludCBpc191cDsKKwlpbnQgbnVtYmVyOworCXN0cnVjdCBuZXR4ZW5fZHVtbXlfZG1hIGR1bW15X2RtYTsKKworCS8qIENvbnRleHQgaW50ZXJmYWNlIHNoYXJlZCBiZXR3ZWVuIGNhcmQgYW5kIGhvc3QgKi8KKwlzdHJ1Y3QgbmV0eGVuX3JpbmdfY3R4ICpjdHhfZGVzYzsKKwlzdHJ1Y3QgcGNpX2RldiAqY3R4X2Rlc2NfcGRldjsKKwlkbWFfYWRkcl90IGN0eF9kZXNjX3BoeXNfYWRkcjsKKwlpbnQgKCplbmFibGVfcGh5X2ludGVycnVwdHMpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgaW50KTsKKwlpbnQgKCpkaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGludCk7CisJdm9pZCAoKmhhbmRsZV9waHlfaW50cikgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqKTsKKwlpbnQgKCptYWNhZGRyX3NldCkgKHN0cnVjdCBuZXR4ZW5fcG9ydCAqLCBuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90KTsKKwlpbnQgKCpzZXRfbXR1KSAoc3RydWN0IG5ldHhlbl9wb3J0ICosIGludCk7CisJaW50ICgqc2V0X3Byb21pc2MpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgaW50LAorCQkJICAgIG5ldHhlbl9uaXVfcHJvbV9tb2RlX3QpOworCWludCAoKnVuc2V0X3Byb21pc2MpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgaW50LAorCQkJICAgICAgbmV0eGVuX25pdV9wcm9tX21vZGVfdCk7CisJaW50ICgqcGh5X3JlYWQpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgbG9uZyBwaHksIGxvbmcgcmVnLCB1MzIgKik7CisJaW50ICgqcGh5X3dyaXRlKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGxvbmcgcGh5LCBsb25nIHJlZywgdTMyIHZhbCk7CisJaW50ICgqaW5pdF9wb3J0KSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGludCk7CisJdm9pZCAoKmluaXRfbml1KSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICopOworCWludCAoKnN0b3BfcG9ydCkgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqLCBpbnQpOworfTsJCQkJLyogbmV0eGVuX2FkYXB0ZXIgc3RydWN0dXJlICovCisKKy8qIE1heCBudW1iZXIgb2YgeG1pdCBwcm9kdWNlciB0aHJlYWRzIHRoYXQgY2FuIHJ1biBzaW11bHRhbmVvdXNseSAqLworI2RlZmluZQlNQVhfWE1JVF9QUk9EVUNFUlMJCTE2CisKK3N0cnVjdCBuZXR4ZW5fcG9ydF9zdGF0cyB7CisJdTY0IHJjdmRiYWRza2I7CisJdTY0IHhtaXRjYWxsZWQ7CisJdTY0IHhtaXRlZGZyYW1lczsKKwl1NjQgeG1pdGZpbmlzaGVkOworCXU2NCBiYWRza2JsZW47CisJdTY0IG5vY21kZGVzY3JpcHRvcjsKKwl1NjQgcG9sbGVkOworCXU2NCB1cGhhcHB5OworCXU2NCB1cGRyb3BwZWQ7CisJdTY0IHVwbGNvbmc7CisJdTY0IHVwaGNvbmc7CisJdTY0IHVwbWNvbmc7CisJdTY0IHVwZHVubm87CisJdTY0IHNrYmZyZWVkOworCXU2NCB0eGRyb3BwZWQ7CisJdTY0IHR4bnVsbHNrYjsKKwl1NjQgY3N1bW1lZDsKKwl1NjQgbm9fcmN2OworCXU2NCByeGJ5dGVzOworCXU2NCB0eGJ5dGVzOworfTsKKworc3RydWN0IG5ldHhlbl9wb3J0IHsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXI7CisKKwl1MTYgcG9ydG51bTsJCS8qIEdCRSBwb3J0IG51bWJlciAqLworCXUxNiBsaW5rX3NwZWVkOworCXUxNiBsaW5rX2R1cGxleDsKKwl1MTYgbGlua19hdXRvbmVnOworCisJaW50IGZsYWdzOworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisJc3RydWN0IG5ldHhlbl9wb3J0X3N0YXRzIHN0YXRzOworfTsKKworI2RlZmluZSBQQ0lfT0ZGU0VUX0ZJUlNUX1JBTkdFKGFkYXB0ZXIsIG9mZikgICAgXAorCSgoYWRhcHRlciktPmFody5wY2lfYmFzZTAgKyAob2ZmKSkKKyNkZWZpbmUgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwgb2ZmKSAgIFwKKwkoKGFkYXB0ZXIpLT5haHcucGNpX2Jhc2UxICsgKG9mZikgLSBTRUNPTkRfUEFHRV9HUk9VUF9TVEFSVCkKKyNkZWZpbmUgUENJX09GRlNFVF9USElSRF9SQU5HRShhZGFwdGVyLCBvZmYpICAgIFwKKwkoKGFkYXB0ZXIpLT5haHcucGNpX2Jhc2UyICsgKG9mZikgLSBUSElSRF9QQUdFX0dST1VQX1NUQVJUKQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqcGNpX2Jhc2Vfb2Zmc2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCWlmICgob2ZmIDwgRklSU1RfUEFHRV9HUk9VUF9FTkQpICYmIChvZmYgPj0gRklSU1RfUEFHRV9HUk9VUF9TVEFSVCkpIHsKKwkJcmV0dXJuIChhZGFwdGVyLT5haHcucGNpX2Jhc2UwICsgb2ZmKTsKKwl9IGVsc2UgaWYgKChvZmYgPCBTRUNPTkRfUEFHRV9HUk9VUF9FTkQpICYmCisJCSAgIChvZmYgPj0gU0VDT05EX1BBR0VfR1JPVVBfU1RBUlQpKSB7CisJCXJldHVybiAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMSArIG9mZiAtIFNFQ09ORF9QQUdFX0dST1VQX1NUQVJUKTsKKwl9IGVsc2UgaWYgKChvZmYgPCBUSElSRF9QQUdFX0dST1VQX0VORCkgJiYKKwkJICAgKG9mZiA+PSBUSElSRF9QQUdFX0dST1VQX1NUQVJUKSkgeworCQlyZXR1cm4gKGFkYXB0ZXItPmFody5wY2lfYmFzZTIgKyBvZmYgLSBUSElSRF9QQUdFX0dST1VQX1NUQVJUKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpwY2lfYmFzZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoKG9mZiA8IEZJUlNUX1BBR0VfR1JPVVBfRU5EKSAmJiAob2ZmID49IEZJUlNUX1BBR0VfR1JPVVBfU1RBUlQpKSB7CisJCXJldHVybiBhZGFwdGVyLT5haHcucGNpX2Jhc2UwOworCX0gZWxzZSBpZiAoKG9mZiA8IFNFQ09ORF9QQUdFX0dST1VQX0VORCkgJiYKKwkJICAgKG9mZiA+PSBTRUNPTkRfUEFHRV9HUk9VUF9TVEFSVCkpIHsKKwkJcmV0dXJuIGFkYXB0ZXItPmFody5wY2lfYmFzZTE7CisJfSBlbHNlIGlmICgob2ZmIDwgVEhJUkRfUEFHRV9HUk9VUF9FTkQpICYmCisJCSAgIChvZmYgPj0gVEhJUkRfUEFHRV9HUk9VUF9TVEFSVCkpIHsKKwkJcmV0dXJuIGFkYXB0ZXItPmFody5wY2lfYmFzZTI7CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgbmV0eGVuX25pdV94Z2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgaW50IHBvcnQpOworaW50IG5ldHhlbl9uaXVfZ2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSBpbnQgcG9ydCk7CitpbnQgbmV0eGVuX25pdV94Z2JlX2Rpc2FibGVfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgICBpbnQgcG9ydCk7CitpbnQgbmV0eGVuX25pdV9nYmVfZGlzYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgaW50IHBvcnQpOworaW50IG5ldHhlbl9uaXVfeGdiZV9jbGVhcl9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSBpbnQgcG9ydCk7CitpbnQgbmV0eGVuX25pdV9nYmVfY2xlYXJfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQlpbnQgcG9ydCk7Cit2b2lkIG5ldHhlbl9uaWNfeGdiZV9oYW5kbGVfcGh5X2ludHIoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgbmV0eGVuX25pY19nYmVfaGFuZGxlX3BoeV9pbnRyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIG5ldHhlbl9uaXVfZ2JlX3NldF9taWlfbW9kZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0LAorCQkJCSBsb25nIGVuYWJsZSk7Cit2b2lkIG5ldHhlbl9uaXVfZ2JlX3NldF9nbWlpX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCwKKwkJCQkgIGxvbmcgZW5hYmxlKTsKK2ludCBuZXR4ZW5fbml1X2diZV9waHlfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGxvbmcgcGh5LCBsb25nIHJlZywKKwkJCSAgICBfX2xlMzIgKiByZWFkdmFsKTsKK2ludCBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBsb25nIHBoeSwKKwkJCSAgICAgbG9uZyByZWcsIF9fbGUzMiB2YWwpOworCisvKiBGdW5jdGlvbnMgYXZhaWxhYmxlIGZyb20gbmV0eGVuX25pY19ody5jICovCitpbnQgbmV0eGVuX25pY19zZXRfbXR1X3hnYihzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQsIGludCBuZXdfbXR1KTsKK2ludCBuZXR4ZW5fbmljX3NldF9tdHVfZ2Ioc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LCBpbnQgbmV3X210dSk7Cit2b2lkIG5ldHhlbl9uaWNfaW5pdF9uaXVfZ2Ioc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiB3bmR3KTsKK3ZvaWQgbmV0eGVuX25pY19yZWdfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLCB1MzIgdmFsKTsKK2ludCBuZXR4ZW5fbmljX3JlZ19yZWFkKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG9mZik7Cit2b2lkIG5ldHhlbl9uaWNfd3JpdGVfdzAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgaW5kZXgsIHUzMiB2YWx1ZSk7Cit2b2lkIG5ldHhlbl9uaWNfcmVhZF93MChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBpbmRleCwgdTMyICogdmFsdWUpOworCitpbnQgbmV0eGVuX25pY19nZXRfYm9hcmRfaW5mbyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaWNfaHdfcmVhZF93eChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBvZmYsIHZvaWQgKmRhdGEsCisJCQkgIGludCBsZW4pOworaW50IG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLCB2b2lkICpkYXRhLAorCQkJICAgaW50IGxlbik7CitpbnQgbmV0eGVuX25pY19od19yZWFkX2lvY3RsKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG9mZiwKKwkJCSAgICAgdm9pZCAqZGF0YSwgaW50IGxlbik7CitpbnQgbmV0eGVuX25pY19od193cml0ZV9pb2N0bChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBvZmYsCisJCQkgICAgICB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK2ludCBuZXR4ZW5fbmljX3BjaV9tZW1fd3JpdGVfaW9jdGwoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIHU2NCBvZmYsIHZvaWQgKmRhdGEsIGludCBzaXplKTsKK2ludCBuZXR4ZW5fbmljX3BjaV9tZW1fcmVhZF9pb2N0bChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICB1NjQgb2ZmLCB2b2lkICpkYXRhLCBpbnQgc2l6ZSk7Cit2b2lkIG5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2ZmLCBpbnQgZGF0YSk7CisKKy8qIEZ1bmN0aW9ucyBmcm9tIG5ldHhlbl9uaWNfaW5pdC5jICovCit2b2lkIG5ldHhlbl9mcmVlX2FkYXB0ZXJfb2ZmbG9hZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfb2ZmbG9hZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBuZXR4ZW5fcGhhbnRvbV9pbml0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBlZ3R1bmVfdmFsKTsKK3ZvaWQgbmV0eGVuX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBuZXR4ZW5fcGluaXRfZnJvbV9yb20oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgdmVyYm9zZSk7CitpbnQgbmV0eGVuX3JvbV9mYXN0X3JlYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50ICp2YWxwKTsKK2ludCBuZXR4ZW5fcm9tX2Zhc3Rfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50IGRhdGEpOworaW50IG5ldHhlbl9yb21fc2Uoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcik7CitpbnQgbmV0eGVuX2RvX3JvbV9zZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyKTsKKworLyogRnVuY3Rpb25zIGZyb20gbmV0eGVuX25pY19pc3IuYyAqLwordm9pZCBuZXR4ZW5fbmljX2lzcl9vdGhlcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBuZXR4ZW5faW5kaWNhdGVfbGlua19zdGF0dXMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgcG9ydCwKKwkJCQkgdTMyIGxpbmspOwordm9pZCBuZXR4ZW5faGFuZGxlX3BvcnRfaW50KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIHBvcnQsCisJCQkgICAgdTMyIGVuYWJsZSk7Cit2b2lkIG5ldHhlbl9uaWNfc3RvcF9hbGxfcG9ydHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgbmV0eGVuX2luaXRpYWxpemVfYWRhcHRlcl9zdyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX2h3KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkICpuZXR4ZW5fYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzeiwgZG1hX2FkZHJfdCAqIHB0ciwKKwkJICAgc3RydWN0IHBjaV9kZXYgKip1c2VkX2Rldik7Cit2b2lkIG5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfb3BzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CitpbnQgbmV0eGVuX2luaXRfZmlybXdhcmUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIG5ldHhlbl90c29fY2hlY2soc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICBzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmRlc2MsIHN0cnVjdCBza19idWZmICpza2IpOworaW50IG5ldHhlbl9uaWNfaHdfcmVzb3VyY2VzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIG5ldHhlbl9uaWNfY2xlYXJfc3RhdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK2ludAorbmV0eGVuX25pY19kb19pb2N0bChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKnVfZGF0YSwKKwkJICAgIHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCk7CitpbnQgbmV0eGVuX25pY19yeF9oYXNfd29yayhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaWNfdHhfaGFzX3dvcmsoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgbmV0eGVuX3dhdGNoZG9nX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgbmV0eGVuX3Bvc3RfcnhfYnVmZmVycyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjdHgsCisJCQkgICAgdTMyIHJpbmdpZCk7Cit2b2lkIG5ldHhlbl9wb3N0X3J4X2J1ZmZlcnNfbm9kYihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjdHgsCisJCQkJIHUzMiByaW5naWQpOworaW50IG5ldHhlbl9wcm9jZXNzX2NtZF9yaW5nKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit1MzIgbmV0eGVuX3Byb2Nlc3NfcmN2X3Jpbmcoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgY3R4LCBpbnQgbWF4KTsKK3ZvaWQgbmV0eGVuX25pY19zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitpbnQgbmV0eGVuX25pY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KTsKK2ludCBuZXR4ZW5fbmljX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCk7CitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0eGVuX25pY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXR4ZW5fbmljX2Rpc2FibGVfaW50KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKgorCSAqIElTUl9JTlRfTUFTSzogQ2FuIGJlIHJlYWQgZnJvbSB3aW5kb3cgMCBvciAxLgorCSAqLworCXdyaXRlbCgweDdmZiwgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwgSVNSX0lOVF9NQVNLKSk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHhlbl9uaWNfZW5hYmxlX2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIG1hc2s7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmFody5ib2FyZF90eXBlKSB7CisJY2FzZSBORVRYRU5fTklDX0dCRToKKwkJbWFzayA9IDB4NzdiOworCQlicmVhazsKKwljYXNlIE5FVFhFTl9OSUNfWEdCRToKKwkJbWFzayA9IDB4NzdmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltYXNrID0gMHg3ZmY7CisJCWJyZWFrOworCX0KKworCXdyaXRlbChtYXNrLCBQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLCBJU1JfSU5UX01BU0spKTsKKworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgTkVUWEVOX05JQ19NU0lfRU5BQkxFRCkpIHsKKwkJbWFzayA9IDB4YmZmOworCQl3cml0ZWwobWFzaywgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJCSAgICAgSVNSX0lOVF9UQVJHRVRfTUFTSykpOworCX0KK30KKworLyoKKyAqIE5ldFhlbiBCb2FyZCBpbmZvcm1hdGlvbgorICovCisKKyNkZWZpbmUgTkVUWEVOX01BWF9TSE9SVF9OQU1FIDE2CitzdHJ1Y3QgbmV0eGVuX2JyZGluZm8geworCW5ldHhlbl9icmR0eXBlX3QgYnJkdHlwZTsJLyogdHlwZSBvZiBib2FyZCAqLworCWxvbmcgcG9ydHM7CQkvKiBtYXggbm8gb2YgcGh5c2ljYWwgcG9ydHMgKi8KKwljaGFyIHNob3J0X25hbWVbTkVUWEVOX01BWF9TSE9SVF9OQU1FXTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0eGVuX2JyZGluZm8gbmV0eGVuX2JvYXJkc1tdID0geworCXtORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19DWDQsIDEsICJYR2IgQ1g0In0sCisJe05FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0hNRVosIDEsICJYR2IgSE1FWiJ9LAorCXtORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19JTUVaLCAyLCAiWEdiIElNRVoifSwKKwl7TkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEcsIDEsICJYR2IgWEZQIn0sCisJe05FVFhFTl9CUkRUWVBFX1AyX1NCMzVfNEcsIDQsICJRdWFkIEdiIn0sCisJe05FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMkcsIDIsICJEdWFsIEdiIn0sCit9OworCisjZGVmaW5lIE5VTV9TVVBQT1JURURfQk9BUkRTIChzaXplb2YobmV0eGVuX2JvYXJkcykvc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fYnJkaW5mbykpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYnJkX3BvcnRfYnlfdHlwZSh1MzIgdHlwZSwgaW50ICpwb3J0cykKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fU1VQUE9SVEVEX0JPQVJEUzsgKytpKSB7CisJCWlmIChuZXR4ZW5fYm9hcmRzW2ldLmJyZHR5cGUgPT0gdHlwZSkgeworCQkJKnBvcnRzID0gbmV0eGVuX2JvYXJkc1tpXS5wb3J0czsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpCisJCSpwb3J0cyA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYnJkX25hbWVfYnlfdHlwZSh1MzIgdHlwZSwgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fU1VQUE9SVEVEX0JPQVJEUzsgKytpKSB7CisJCWlmIChuZXR4ZW5fYm9hcmRzW2ldLmJyZHR5cGUgPT0gdHlwZSkgeworCQkJc3RyY3B5KG5hbWUsIG5ldHhlbl9ib2FyZHNbaV0uc2hvcnRfbmFtZSk7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJfQorCWlmICghZm91bmQpCisJCW5hbWUgPSAiVW5rbm93biI7Cit9CisKK2ludCBuZXR4ZW5faXNfZmxhc2hfc3VwcG9ydGVkKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CitpbnQgbmV0eGVuX2dldF9mbGFzaF9tYWNfYWRkcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBtYWNbXSk7CitleHRlcm4gdm9pZCBuZXR4ZW5fY2hhbmdlX3JpbmdwYXJhbShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIGludCBuZXR4ZW5fcm9tX2Zhc3RfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLAorCQkJCWludCAqdmFscCk7CisKK2V4dGVybiBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0eGVuX25pY19ldGh0b29sX29wczsKKworI2VuZGlmCQkJCS8qIF9fTkVUWEVOX05JQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjQ4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2IE5ldFhlbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgICBpbmZvQG5ldHhlbi5jb20KKyAqIE5ldFhlbiwKKyAqIDM5NjUgRnJlZWRvbSBDaXJjbGUsIEZvdXJ0aCBmbG9vciwKKyAqIFNhbnRhIENsYXJhLCBDQSA5NTA1NAorICoKKyAqCisgKiBldGh0b29sIHN1cHBvcnQgZm9yIG5ldHhlbiBuaWMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgorI2luY2x1ZGUgIm5ldHhlbl9uaWMuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX3BoYW5fcmVnLmgiCisjaW5jbHVkZSAibmV0eGVuX25pY19pb2N0bC5oIgorCitzdHJ1Y3QgbmV0eGVuX25pY19zdGF0cyB7CisJY2hhciBzdGF0X3N0cmluZ1tFVEhfR1NUUklOR19MRU5dOworCWludCBzaXplb2Zfc3RhdDsKKwlpbnQgc3RhdF9vZmZzZXQ7Cit9OworCisjZGVmaW5lIE5FVFhFTl9OSUNfU1RBVChtKSBzaXplb2YoKChzdHJ1Y3QgbmV0eGVuX3BvcnQgKikwKS0+bSksIFwKKwkJCW9mZnNldG9mKHN0cnVjdCBuZXR4ZW5fcG9ydCwgbSkKKworI2RlZmluZSBORVRYRU5fTklDX1BPUlRfV0lORE9XIDB4MTAwMDAKKyNkZWZpbmUgTkVUWEVOX05JQ19JTlZBTElEX0RBVEEgMHhERUFEQkVFRgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldHhlbl9uaWNfc3RhdHMgbmV0eGVuX25pY19nc3RyaW5nc19zdGF0c1tdID0geworCXsicmN2ZF9iYWRfc2tiIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnJjdmRiYWRza2IpfSwKKwl7InhtaXRfY2FsbGVkIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnhtaXRjYWxsZWQpfSwKKwl7InhtaXRlZF9mcmFtZXMiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMueG1pdGVkZnJhbWVzKX0sCisJeyJ4bWl0X2ZpbmlzaGVkIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnhtaXRmaW5pc2hlZCl9LAorCXsiYmFkX3NrYl9sZW4iLCBORVRYRU5fTklDX1NUQVQoc3RhdHMuYmFkc2tibGVuKX0sCisJeyJub19jbWRfZGVzYyIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy5ub2NtZGRlc2NyaXB0b3IpfSwKKwl7InBvbGxlZCIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy5wb2xsZWQpfSwKKwl7InVwaGFwcHkiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMudXBoYXBweSl9LAorCXsidXBkcm9wcGVkIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnVwZHJvcHBlZCl9LAorCXsidXBsY29uZyIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy51cGxjb25nKX0sCisJeyJ1cGhjb25nIiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLnVwaGNvbmcpfSwKKwl7InVwbWNvbmciLCBORVRYRU5fTklDX1NUQVQoc3RhdHMudXBtY29uZyl9LAorCXsidXBkdW5ubyIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy51cGR1bm5vKX0sCisJeyJza2JfZnJlZWQiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMuc2tiZnJlZWQpfSwKKwl7InR4X2Ryb3BwZWQiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMudHhkcm9wcGVkKX0sCisJeyJ0eF9udWxsX3NrYiIsIE5FVFhFTl9OSUNfU1RBVChzdGF0cy50eG51bGxza2IpfSwKKwl7ImNzdW1tZWQiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMuY3N1bW1lZCl9LAorCXsibm9fcmN2IiwgTkVUWEVOX05JQ19TVEFUKHN0YXRzLm5vX3Jjdil9LAorCXsicnhfYnl0ZXMiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMucnhieXRlcyl9LAorCXsidHhfYnl0ZXMiLCBORVRYRU5fTklDX1NUQVQoc3RhdHMudHhieXRlcyl9LAorfTsKKworI2RlZmluZSBORVRYRU5fTklDX1NUQVRTX0xFTglcCisJc2l6ZW9mKG5ldHhlbl9uaWNfZ3N0cmluZ3Nfc3RhdHMpIC8gc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fbmljX3N0YXRzKQorCitzdGF0aWMgY29uc3QgY2hhciBuZXR4ZW5fbmljX2dzdHJpbmdzX3Rlc3RbXVtFVEhfR1NUUklOR19MRU5dID0geworCSJSZWdpc3Rlcl9UZXN0X29mZmxpbmUiLCAiRUVQUk9NX1Rlc3Rfb2ZmbGluZSIsCisJIkludGVycnVwdF9UZXN0X29mZmxpbmUiLCAiTG9vcGJhY2tfVGVzdF9vZmZsaW5lIiwKKwkiTGlua19UZXN0X29uX29mZmxpbmUiCit9OworCisjZGVmaW5lIE5FVFhFTl9OSUNfVEVTVF9MRU4gc2l6ZW9mKG5ldHhlbl9uaWNfZ3N0cmluZ3NfdGVzdCkgLyBFVEhfR1NUUklOR19MRU4KKworI2RlZmluZSBORVRYRU5fTklDX1JFR1NfQ09VTlQgNDIKKyNkZWZpbmUgTkVUWEVOX05JQ19SRUdTX0xFTiAoTkVUWEVOX05JQ19SRUdTX0NPVU5UICogc2l6ZW9mKF9fbGUzMikpCisjZGVmaW5lIE5FVFhFTl9NQVhfRUVQUk9NX0xFTiAgIDEwMjQKKworc3RhdGljIGludCBuZXR4ZW5fbmljX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCWludCBuOworCisJaWYgKChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCAwLCAmbikgPT0gMCkKKwkgICAgJiYgKG4gJiBORVRYRU5fUk9NX1JPVU5EVVApKSB7CisJCW4gJj0gfk5FVFhFTl9ST01fUk9VTkRVUDsKKwkJaWYgKG4gPCBORVRYRU5fTUFYX0VFUFJPTV9MRU4pCisJCQlyZXR1cm4gbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXUzMiBmd19tYWpvciA9IDA7CisJdTMyIGZ3X21pbm9yID0gMDsKKwl1MzIgZndfYnVpbGQgPSAwOworCisJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIE5FVFhFTl9OSUNfTElOVVhfVkVSU0lPTklELCAzMik7CisJZndfbWFqb3IgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCQkgICAgICBORVRYRU5fRldfVkVSU0lPTl9NQUpPUikpOworCWZ3X21pbm9yID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJICAgICAgTkVUWEVOX0ZXX1ZFUlNJT05fTUlOT1IpKTsKKwlmd19idWlsZCA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIE5FVFhFTl9GV19WRVJTSU9OX1NVQikpOworCXNwcmludGYoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIiVkLiVkLiVkIiwgZndfbWFqb3IsIGZ3X21pbm9yLCBmd19idWlsZCk7CisKKwlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwb3J0LT5wZGV2KSwgMzIpOworCWRydmluZm8tPm5fc3RhdHMgPSBORVRYRU5fTklDX1NUQVRTX0xFTjsKKwlkcnZpbmZvLT50ZXN0aW5mb19sZW4gPSBORVRYRU5fTklDX1RFU1RfTEVOOworCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gTkVUWEVOX05JQ19SRUdTX0xFTjsKKwlkcnZpbmZvLT5lZWR1bXBfbGVuID0gbmV0eGVuX25pY19nZXRfZWVwcm9tX2xlbihkZXYpOworfQorCitzdGF0aWMgaW50CituZXR4ZW5fbmljX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXN0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbyAqYm9hcmRpbmZvID0gJmFkYXB0ZXItPmFody5ib2FyZGNmZzsKKworCS8qIHJlYWQgd2hpY2ggbW9kZSAqLworCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX0dCRSkgeworCQllY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQkJICAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJCSAgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfAorCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCk7CisKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkgICAgIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQkJICAgICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCQkgICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCisJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOworCisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJCWVjbWQtPnNwZWVkID0gcG9ydC0+bGlua19zcGVlZDsKKwkJCWVjbWQtPmR1cGxleCA9IHBvcnQtPmxpbmtfZHVwbGV4OworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlPOwkvKiBsaW5rIGFic2VudCAqLworCX0gZWxzZSBpZiAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPT0gTkVUWEVOX05JQ19YR0JFKSB7CisJCWVjbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfVFAgfAorCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJICAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCk7CisJCWVjbWQtPmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfVFAgfAorCQkJCSAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJICAgICBBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbCk7CisJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOworCisJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDA7CisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTzsKKworCWVjbWQtPnBoeV9hZGRyZXNzID0gcG9ydC0+cG9ydG51bTsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisKKwlzd2l0Y2ggKChuZXR4ZW5fYnJkdHlwZV90KSBib2FyZGluZm8tPmJvYXJkX3R5cGUpIHsKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzVfNEc6CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzJHOgorCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0F1dG9uZWc7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0NYNDoKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9UUDsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9UUDsKKwkJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJCWVjbWQtPmF1dG9uZWcgPSAoYm9hcmRpbmZvLT5ib2FyZF90eXBlID09CisJCQkJIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0NYNCkgPworCQkgICAgKEFVVE9ORUdfRElTQUJMRSkgOiAocG9ydC0+bGlua19hdXRvbmVnKTsKKwkJYnJlYWs7CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19ITUVaOgorCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSU1FWjoKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9NSUk7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfTUlJOworCQllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwRzoKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9GSUJSRTsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9GSUJSRTsKKwkJZWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAibmV0eGVuLW5pYzogVW5zdXBwb3J0ZWQgYm9hcmQgbW9kZWwgJWRcbiIsCisJCSAgICAgICAobmV0eGVuX2JyZHR5cGVfdCkgYm9hcmRpbmZvLT5ib2FyZF90eXBlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25ldHhlbl9uaWNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJX19sZTMyIHN0YXR1czsKKworCS8qIHJlYWQgd2hpY2ggbW9kZSAqLworCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX0dCRSkgeworCQkvKiBhdXRvbmVnb3RpYXRpb24gKi8KKwkJaWYgKGFkYXB0ZXItPnBoeV93cml0ZQorCQkgICAgJiYgYWRhcHRlci0+cGh5X3dyaXRlKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCisJCQkJCSAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0FVVE9ORUcsCisJCQkJCSAgKF9fbGUzMikgZWNtZC0+YXV0b25lZykgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQllbHNlCisJCQlwb3J0LT5saW5rX2F1dG9uZWcgPSBlY21kLT5hdXRvbmVnOworCisJCWlmIChhZGFwdGVyLT5waHlfcmVhZAorCQkgICAgJiYgYWRhcHRlci0+cGh5X3JlYWQoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJCQkJIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTLAorCQkJCQkgJnN0YXR1cykgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCisJCS8qIHNwZWVkICovCisJCXN3aXRjaCAoZWNtZC0+c3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCW5ldHhlbl9zZXRfcGh5X3NwZWVkKHN0YXR1cywgMCk7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQluZXR4ZW5fc2V0X3BoeV9zcGVlZChzdGF0dXMsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCW5ldHhlbl9zZXRfcGh5X3NwZWVkKHN0YXR1cywgMik7CisJCQlicmVhazsKKwkJfQorCQkvKiBzZXQgZHVwbGV4IG1vZGUgKi8KKwkJaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCW5ldHhlbl9jbGVhcl9waHlfZHVwbGV4KHN0YXR1cyk7CisJCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQluZXR4ZW5fc2V0X3BoeV9kdXBsZXgoc3RhdHVzKTsKKwkJaWYgKGFkYXB0ZXItPnBoeV93cml0ZQorCQkgICAgJiYgYWRhcHRlci0+cGh5X3dyaXRlKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCisJCQkJCSAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX1BIWV9TVEFUVVMsCisJCQkJCSAgKigoaW50ICopJnN0YXR1cykpICE9IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJZWxzZSB7CisJCQlwb3J0LT5saW5rX3NwZWVkID0gZWNtZC0+c3BlZWQ7CisJCQlwb3J0LT5saW5rX2R1cGxleCA9IGVjbWQtPmR1cGxleDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWRldi0+c3RvcChkZXYpOworCQlkZXYtPm9wZW4oZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0eGVuX25pY19nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gTkVUWEVOX05JQ19SRUdTX0xFTjsKK30KKworc3RydWN0IG5ldHhlbl9uaXVfcmVncyB7CisJX19sZTMyIHJlZ1tORVRYRU5fTklDX1JFR1NfQ09VTlRdOworfTsKKworc3RhdGljIHN0cnVjdCBuZXR4ZW5fbml1X3JlZ3Mgbml1X3JlZ2lzdGVyc1tdID0geworCXsKKwkgLyogR0IgTW9kZSAqLworCSB7CisJICBORVRYRU5fTklVX0dCX1NFUkRFU19SRVNFVCwKKwkgIE5FVFhFTl9OSVVfR0IwX01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjFfTUlJX01PREUsCisJICBORVRYRU5fTklVX0dCMl9NSUlfTU9ERSwKKwkgIE5FVFhFTl9OSVVfR0IzX01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjBfR01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjFfR01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjJfR01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9HQjNfR01JSV9NT0RFLAorCSAgTkVUWEVOX05JVV9SRU1PVEVfTE9PUEJBQ0ssCisJICBORVRYRU5fTklVX0dCMF9IQUxGX0RVUExFWCwKKwkgIE5FVFhFTl9OSVVfR0IxX0hBTEZfRFVQTEVYLAorCSAgTkVUWEVOX05JVV9SRVNFVF9TWVNfRklGT1MsCisJICBORVRYRU5fTklVX0dCX0NSQ19EUk9QLAorCSAgTkVUWEVOX05JVV9HQl9EUk9QX1dST05HQUREUiwKKwkgIE5FVFhFTl9OSVVfVEVTVF9NVVhfQ1RMLAorCisJICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMCgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18xKDApLAorCSAgTkVUWEVOX05JVV9HQl9IQUxGX0RVUExFWF9DVFJMKDApLAorCSAgTkVUWEVOX05JVV9HQl9NQVhfRlJBTUVfU0laRSgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfVEVTVF9SRUcoMCksCisJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0NPTkZJRygwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09NTUFORCgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUigwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ1RSTCgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfU1RBVFVTKDApLAorCSAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9JTkRJQ0FURSgwKSwKKwkgIE5FVFhFTl9OSVVfR0JfSU5URVJGQUNFX0NUUkwoMCksCisJICBORVRYRU5fTklVX0dCX0lOVEVSRkFDRV9TVEFUVVMoMCksCisJICBORVRYRU5fTklVX0dCX1NUQVRJT05fQUREUl8wKDApLAorCSAgTkVUWEVOX05JVV9HQl9TVEFUSU9OX0FERFJfMSgwKSwKKwkgIC0xLAorCSAgfQorCSB9LAorCXsKKwkgLyogWEcgTW9kZSAqLworCSB7CisJICBORVRYRU5fTklVX1hHX1NJTkdMRV9URVJNLAorCSAgTkVUWEVOX05JVV9YR19EUklWRV9ISSwKKwkgIE5FVFhFTl9OSVVfWEdfRFJJVkVfTE8sCisJICBORVRYRU5fTklVX1hHX0RUWCwKKwkgIE5FVFhFTl9OSVVfWEdfREVRLAorCSAgTkVUWEVOX05JVV9YR19XT1JEX0FMSUdOLAorCSAgTkVUWEVOX05JVV9YR19SRVNFVCwKKwkgIE5FVFhFTl9OSVVfWEdfUE9XRVJfRE9XTiwKKwkgIE5FVFhFTl9OSVVfWEdfUkVTRVRfUExMLAorCSAgTkVUWEVOX05JVV9YR19TRVJERVNfTE9PUEJBQ0ssCisJICBORVRYRU5fTklVX1hHX0RPX0JZVEVfQUxJR04sCisJICBORVRYRU5fTklVX1hHX1RYX0VOQUJMRSwKKwkgIE5FVFhFTl9OSVVfWEdfUlhfRU5BQkxFLAorCSAgTkVUWEVOX05JVV9YR19TVEFUVVMsCisJICBORVRYRU5fTklVX1hHX1BBVVNFX1RIUkVTSE9MRCwKKwkgIE5FVFhFTl9OSVVfWEdFX0NPTkZJR18wLAorCSAgTkVUWEVOX05JVV9YR0VfQ09ORklHXzEsCisJICBORVRYRU5fTklVX1hHRV9JUEcsCisJICBORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMF9ISSwKKwkgIE5FVFhFTl9OSVVfWEdFX1NUQVRJT05fQUREUl8wXzEsCisJICBORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMV9MTywKKwkgIE5FVFhFTl9OSVVfWEdFX1NUQVRVUywKKwkgIE5FVFhFTl9OSVVfWEdFX01BWF9GUkFNRV9TSVpFLAorCSAgTkVUWEVOX05JVV9YR0VfUEFVU0VfRlJBTUVfVkFMVUUsCisJICBORVRYRU5fTklVX1hHRV9UWF9CWVRFX0NOVCwKKwkgIE5FVFhFTl9OSVVfWEdFX1RYX0ZSQU1FX0NOVCwKKwkgIE5FVFhFTl9OSVVfWEdFX1JYX0JZVEVfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfUlhfRlJBTUVfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfQUdHUl9FUlJPUl9DTlQsCisJICBORVRYRU5fTklVX1hHRV9NVUxUSUNBU1RfRlJBTUVfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfVU5JQ0FTVF9GUkFNRV9DTlQsCisJICBORVRYRU5fTklVX1hHRV9DUkNfRVJST1JfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfT1ZFUlNJWkVfRlJBTUVfRVJSLAorCSAgTkVUWEVOX05JVV9YR0VfVU5ERVJTSVpFX0ZSQU1FX0VSUiwKKwkgIE5FVFhFTl9OSVVfWEdFX0xPQ0FMX0VSUk9SX0NOVCwKKwkgIE5FVFhFTl9OSVVfWEdFX1JFTU9URV9FUlJPUl9DTlQsCisJICBORVRYRU5fTklVX1hHRV9DT05UUk9MX0NIQVJfQ05ULAorCSAgTkVUWEVOX05JVV9YR0VfUEFVU0VfRlJBTUVfQ05ULAorCSAgLTEsCisJICB9CisJIH0KK307CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnApCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCV9fbGUzMiBtb2RlLCAqcmVnc19idWZmID0gcDsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJaW50IGksIHdpbmRvdzsKKworCW1lbXNldChwLCAwLCBORVRYRU5fTklDX1JFR1NfTEVOKTsKKwlyZWdzLT52ZXJzaW9uID0gKDEgPDwgMjQpIHwgKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCA8PCAxNikgfAorCSAgICAocG9ydC0+cGRldiktPmRldmljZTsKKwkvKiB3aGljaCBtb2RlICovCisJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9NT0RFLCAmcmVnc19idWZmWzBdKTsKKwltb2RlID0gcmVnc19idWZmWzBdOworCisJLyogQ29tbW9uIHJlZ2lzdGVycyB0byBhbGwgdGhlIG1vZGVzICovCisJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9TVFJBUF9WQUxVRV9TQVZFX0hJR0hFUiwKKwkJCQkgICAmcmVnc19idWZmWzJdKTsKKwkvKiBHQi9YR0IgTW9kZSAqLworCW1vZGUgPSAobW9kZSAvIDIpIC0gMTsKKwl3aW5kb3cgPSAwOworCWlmIChtb2RlIDw9IDEpIHsKKwkJZm9yIChpID0gMzsgbml1X3JlZ2lzdGVyc1ttb2RlXS5yZWdbaSAtIDNdICE9IC0xOyBpKyspIHsKKwkJCS8qIEdCOiBwb3J0IHNwZWNpZmljIHJlZ2lzdGVycyAqLworCQkJaWYgKG1vZGUgPT0gMCAmJiBpID49IDE5KQorCQkJCXdpbmRvdyA9IHBvcnQtPnBvcnRudW0gKiBORVRYRU5fTklDX1BPUlRfV0lORE9XOworCisJCQlORVRYRU5fTklDX0xPQ0tFRF9SRUFEX1JFRyhuaXVfcmVnaXN0ZXJzW21vZGVdLgorCQkJCQkJICAgcmVnW2kgLSAzXSArIHdpbmRvdywKKwkJCQkJCSAgICZyZWdzX2J1ZmZbaV0pOworCQl9CisKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfCBXQUtFX0JDQVNUIHwgV0FLRV9NQUdJQzsKKwkvKiBvcHRpb25zIGNhbiBiZSBhZGRlZCBkZXBlbmRpbmcgdXBvbiB0aGUgbW9kZSAqLworCXdvbC0+d29sb3B0cyA9IDA7Cit9CisKK3N0YXRpYyB1MzIgbmV0eGVuX25pY19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlfX2xlMzIgc3RhdHVzOworCisJLyogcmVhZCB3aGljaCBtb2RlICovCisJaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfR0JFKSB7CisJCWlmIChhZGFwdGVyLT5waHlfcmVhZAorCQkgICAgJiYgYWRhcHRlci0+cGh5X3JlYWQoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJCQkJIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTLAorCQkJCQkgJnN0YXR1cykgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQllbHNlCisJCQlyZXR1cm4gKG5ldHhlbl9nZXRfcGh5X2xpbmsoc3RhdHVzKSk7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX1hHQkUpIHsKKwkJaW50IHZhbCA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9YR19TVEFURSkpOworCQlyZXR1cm4gdmFsID09IFhHX0xJTktfVVA7CisJfQorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50CituZXR4ZW5fbmljX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sCisJCSAgICAgIHU4ICogYnl0ZXMpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCWludCBvZmZzZXQ7CisKKwlpZiAoZWVwcm9tLT5sZW4gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllZXByb20tPm1hZ2ljID0gKHBvcnQtPnBkZXYpLT52ZW5kb3IgfCAoKHBvcnQtPnBkZXYpLT5kZXZpY2UgPDwgMTYpOworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZWVwcm9tLT5sZW47IG9mZnNldCsrKQorCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQKKwkJICAgIChhZGFwdGVyLCAoOCAqIG9mZnNldCkgKyA4LCAoaW50ICopZWVwcm9tLT5kYXRhKSA9PSAtMSkKKwkJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbmV0eGVuX25pY19nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJaW50IGk7CisKKwlyaW5nLT5yeF9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9qdW1ib19wZW5kaW5nID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JDVl9DVFg7ICsraSkgeworCQlyaW5nLT5yeF9wZW5kaW5nICs9IGFkYXB0ZXItPnJlY3ZfY3R4W2ldLgorCQkgICAgcmN2X2Rlc2NbUkNWX0RFU0NfTk9STUFMX0NUWElEXS5yY3ZfcGVuZGluZzsKKwkJcmluZy0+cnhfanVtYm9fcGVuZGluZyArPSBhZGFwdGVyLT5yZWN2X2N0eFtpXS4KKwkJICAgIHJjdl9kZXNjW1JDVl9ERVNDX0pVTUJPX0NUWElEXS5yY3ZfcGVuZGluZzsKKwl9CisKKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IGFkYXB0ZXItPm1heF9yeF9kZXNjX2NvdW50OworCXJpbmctPnR4X21heF9wZW5kaW5nID0gYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQ7CisJcmluZy0+cnhfanVtYm9fbWF4X3BlbmRpbmcgPSBhZGFwdGVyLT5tYXhfanVtYm9fcnhfZGVzY19jb3VudDsKKwlyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOworfQorCitzdGF0aWMgdm9pZAorbmV0eGVuX25pY19nZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJX19sZTMyIHZhbDsKKworCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX0dCRSkgeworCQkvKiBnZXQgZmxvdyBjb250cm9sIHNldHRpbmdzICovCisJCW5ldHhlbl9uaWNfcmVhZF93MChhZGFwdGVyLAorCQkJCSAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQtPnBvcnRudW0pLAorCQkJCSAgICh1MzIgKikgJiB2YWwpOworCQlwYXVzZS0+cnhfcGF1c2UgPSBuZXR4ZW5fZ2JfZ2V0X3J4X2Zsb3djdGwodmFsKTsKKwkJcGF1c2UtPnR4X3BhdXNlID0gbmV0eGVuX2diX2dldF90eF9mbG93Y3RsKHZhbCk7CisJCS8qIGdldCBhdXRvbmVnIHNldHRpbmdzICovCisJCXBhdXNlLT5hdXRvbmVnID0gcG9ydC0+bGlua19hdXRvbmVnOworCX0KK30KKworc3RhdGljIGludAorbmV0eGVuX25pY19zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJX19sZTMyIHZhbDsKKwl1bnNpZ25lZCBpbnQgYXV0b25lZzsKKworCS8qIHJlYWQgbW9kZSAqLworCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX0dCRSkgeworCQkvKiBzZXQgZmxvdyBjb250cm9sICovCisJCW5ldHhlbl9uaWNfcmVhZF93MChhZGFwdGVyLAorCQkJCSAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQtPnBvcnRudW0pLAorCQkJCSAgICh1MzIgKikgJiB2YWwpOworCQlpZiAocGF1c2UtPnR4X3BhdXNlKQorCQkJbmV0eGVuX2diX3R4X2Zsb3djdGwodmFsKTsKKwkJZWxzZQorCQkJbmV0eGVuX2diX3Vuc2V0X3R4X2Zsb3djdGwodmFsKTsKKwkJaWYgKHBhdXNlLT5yeF9wYXVzZSkKKwkJCW5ldHhlbl9nYl9yeF9mbG93Y3RsKHZhbCk7CisJCWVsc2UKKwkJCW5ldHhlbl9nYl91bnNldF9yeF9mbG93Y3RsKHZhbCk7CisKKwkJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0LT5wb3J0bnVtKSwKKwkJCQkgICAgKih1MzIgKikgKCZ2YWwpKTsKKwkJLyogc2V0IGF1dG9uZWcgKi8KKwkJYXV0b25lZyA9IHBhdXNlLT5hdXRvbmVnOworCQlpZiAoYWRhcHRlci0+cGh5X3dyaXRlCisJCSAgICAmJiBhZGFwdGVyLT5waHlfd3JpdGUoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfQVVUT05FRywKKwkJCQkJICAoX19sZTMyKSBhdXRvbmVnKSAhPSAwKQorCQkJcmV0dXJuIC1FSU87CisJCWVsc2UgeworCQkJcG9ydC0+bGlua19hdXRvbmVnID0gcGF1c2UtPmF1dG9uZWc7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgbmV0eGVuX25pY19yZWdfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwl1MzIgZGF0YV9yZWFkLCBkYXRhX3dyaXR0ZW4sIHNhdmU7CisJX19sZTMyIG1vZGU7CisKKwkvKiAKKwkgKiBmaXJzdCB0ZXN0IHRoZSAiUmVhZCBPbmx5IiByZWdpc3RlcnMgYnkgd3JpdGluZyB3aGljaCBtb2RlCisJICovCisJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfTU9ERSwgJm1vZGUpOworCWlmIChuZXR4ZW5fZ2V0X25pdV9lbmFibGVfZ2UobW9kZSkpIHsJLyogR0IgTW9kZSAqLworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwKKwkJCQkgICBORVRYRU5fTklVX0dCX01JSV9NR01UX1NUQVRVUyhwb3J0LT5wb3J0bnVtKSwKKwkJCQkgICAmZGF0YV9yZWFkKTsKKworCQlzYXZlID0gZGF0YV9yZWFkOworCQlpZiAoZGF0YV9yZWFkKQorCQkJZGF0YV93cml0dGVuID0gZGF0YV9yZWFkICYgTkVUWEVOX05JQ19JTlZBTElEX0RBVEE7CisJCWVsc2UKKwkJCWRhdGFfd3JpdHRlbiA9IE5FVFhFTl9OSUNfSU5WQUxJRF9EQVRBOworCQluZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsCisJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfU1RBVFVTKHBvcnQtPgorCQkJCQkJCQkgIHBvcnRudW0pLAorCQkJCSAgICBkYXRhX3dyaXR0ZW4pOworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwKKwkJCQkgICBORVRYRU5fTklVX0dCX01JSV9NR01UX1NUQVRVUyhwb3J0LT5wb3J0bnVtKSwKKwkJCQkgICAmZGF0YV9yZWFkKTsKKworCQlpZiAoZGF0YV93cml0dGVuID09IGRhdGFfcmVhZCkgeworCQkJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9TVEFUVVMocG9ydC0+CisJCQkJCQkJCQkgIHBvcnRudW0pLAorCQkJCQkgICAgc2F2ZSk7CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogbmV0eGVuX25pdV9nYl9taWlfbWdtdF9pbmRpY2F0b3JzIGlzIHJlYWQgb25seSAqLworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwKKwkJCQkgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0lORElDQVRFKHBvcnQtPgorCQkJCQkJCQkgICBwb3J0bnVtKSwKKwkJCQkgICAmZGF0YV9yZWFkKTsKKworCQlzYXZlID0gZGF0YV9yZWFkOworCQlpZiAoZGF0YV9yZWFkKQorCQkJZGF0YV93cml0dGVuID0gZGF0YV9yZWFkICYgTkVUWEVOX05JQ19JTlZBTElEX0RBVEE7CisJCWVsc2UKKwkJCWRhdGFfd3JpdHRlbiA9IE5FVFhFTl9OSUNfSU5WQUxJRF9EQVRBOworCQluZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsCisJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfSU5ESUNBVEUocG9ydC0+CisJCQkJCQkJCSAgICBwb3J0bnVtKSwKKwkJCQkgICAgZGF0YV93cml0dGVuKTsKKworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwKKwkJCQkgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0lORElDQVRFKHBvcnQtPgorCQkJCQkJCQkgICBwb3J0bnVtKSwKKwkJCQkgICAmZGF0YV9yZWFkKTsKKworCQlpZiAoZGF0YV93cml0dGVuID09IGRhdGFfcmVhZCkgeworCQkJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9JTkRJQ0FURQorCQkJCQkgICAgKHBvcnQtPnBvcnRudW0pLCBzYXZlKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogbmV0eGVuX25pdV9nYl9pbnRlcmZhY2Vfc3RhdHVzIGlzIHJlYWQgb25seSAqLworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwKKwkJCQkgICBORVRYRU5fTklVX0dCX0lOVEVSRkFDRV9TVEFUVVMocG9ydC0+CisJCQkJCQkJCSAgcG9ydG51bSksCisJCQkJICAgJmRhdGFfcmVhZCk7CisKKwkJc2F2ZSA9IGRhdGFfcmVhZDsKKwkJaWYgKGRhdGFfcmVhZCkKKwkJCWRhdGFfd3JpdHRlbiA9IGRhdGFfcmVhZCAmIE5FVFhFTl9OSUNfSU5WQUxJRF9EQVRBOworCQllbHNlCisJCQlkYXRhX3dyaXR0ZW4gPSBORVRYRU5fTklDX0lOVkFMSURfREFUQTsKKwkJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCX0lOVEVSRkFDRV9TVEFUVVMocG9ydC0+CisJCQkJCQkJCSAgIHBvcnRudW0pLAorCQkJCSAgICBkYXRhX3dyaXR0ZW4pOworCisJCW5ldHhlbl9uaWNfcmVhZF93MChhZGFwdGVyLAorCQkJCSAgIE5FVFhFTl9OSVVfR0JfSU5URVJGQUNFX1NUQVRVUyhwb3J0LT4KKwkJCQkJCQkJICBwb3J0bnVtKSwKKwkJCQkgICAmZGF0YV9yZWFkKTsKKworCQlpZiAoZGF0YV93cml0dGVuID09IGRhdGFfcmVhZCkgeworCQkJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX05JVV9HQl9JTlRFUkZBQ0VfU1RBVFVTCisJCQkJCSAgICAocG9ydC0+cG9ydG51bSksIHNhdmUpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0JCQkvKiBHQiBNb2RlICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbmV0eGVuX25pY19kaWFnX3Rlc3RfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gTkVUWEVOX05JQ19URVNUX0xFTjsKK30KKworc3RhdGljIHZvaWQKK25ldHhlbl9uaWNfZGlhZ190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3Rlc3QgKmV0aF90ZXN0LAorCQkgICAgIHU2NCAqIGRhdGEpCit7CisJaWYgKGV0aF90ZXN0LT5mbGFncyA9PSBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CS8qIG9mZmxpbmUgdGVzdHMgKi8KKwkJLyogbGluayB0ZXN0ICovCisJCWlmICghKGRhdGFbNF0gPSAodTY0KSBuZXR4ZW5fbmljX2dldF9saW5rKGRldikpKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkJZGV2LT5zdG9wKGRldik7CisKKwkJLyogcmVnaXN0ZXIgdGVzdHMgKi8KKwkJaWYgKCEoZGF0YVswXSA9IG5ldHhlbl9uaWNfcmVnX3Rlc3QoZGV2KSkpCisJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCQkvKiBvdGhlciB0ZXN0cyBwYXNzIGFzIG9mIG5vdyAqLworCQlkYXRhWzFdID0gZGF0YVsyXSA9IGRhdGFbM10gPSAxOworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkJZGV2LT5vcGVuKGRldik7CisJfSBlbHNlIHsJCS8qIG9ubGluZSB0ZXN0cyAqLworCQkvKiBsaW5rIHRlc3QgKi8KKwkJaWYgKCEoZGF0YVs0XSA9ICh1NjQpIG5ldHhlbl9uaWNfZ2V0X2xpbmsoZGV2KSkpCisJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCisJCS8qIG90aGVyIHRlc3RzIHBhc3MgYnkgZGVmYXVsdCAqLworCQlkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituZXR4ZW5fbmljX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICogZGF0YSkKK3sKKwlpbnQgaW5kZXg7CisKKwlzd2l0Y2ggKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1RFU1Q6CisJCW1lbWNweShkYXRhLCAqbmV0eGVuX25pY19nc3RyaW5nc190ZXN0LAorCQkgICAgICAgTkVUWEVOX05JQ19URVNUX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7CisJCWJyZWFrOworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBORVRYRU5fTklDX1NUQVRTX0xFTjsgaW5kZXgrKykgeworCQkJbWVtY3B5KGRhdGEgKyBpbmRleCAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJCSAgICAgICBuZXR4ZW5fbmljX2dzdHJpbmdzX3N0YXRzW2luZGV4XS5zdGF0X3N0cmluZywKKwkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBuZXR4ZW5fbmljX2dldF9zdGF0c19jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBORVRYRU5fTklDX1NUQVRTX0xFTjsKK30KKworc3RhdGljIHZvaWQKK25ldHhlbl9uaWNfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKiBkYXRhKQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTkVUWEVOX05JQ19TVEFUU19MRU47IGluZGV4KyspIHsKKwkJY2hhciAqcCA9CisJCSAgICAoY2hhciAqKXBvcnQgKyBuZXR4ZW5fbmljX2dzdHJpbmdzX3N0YXRzW2luZGV4XS5zdGF0X29mZnNldDsKKwkJZGF0YVtpbmRleF0gPQorCQkgICAgKG5ldHhlbl9uaWNfZ3N0cmluZ3Nfc3RhdHNbaW5kZXhdLnNpemVvZl9zdGF0ID09CisJCSAgICAgc2l6ZW9mKHU2NCkpID8gKih1NjQgKikgcCA6ICoodTMyICopIHA7CisJfQorCit9CisKK3N0cnVjdCBldGh0b29sX29wcyBuZXR4ZW5fbmljX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBuZXR4ZW5fbmljX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gbmV0eGVuX25pY19zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gbmV0eGVuX25pY19nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gbmV0eGVuX25pY19nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzID0gbmV0eGVuX25pY19nZXRfcmVncywKKwkuZ2V0X3dvbCA9IG5ldHhlbl9uaWNfZ2V0X3dvbCwKKwkuZ2V0X2xpbmsgPSBuZXR4ZW5fbmljX2dldF9saW5rLAorCS5nZXRfZWVwcm9tX2xlbiA9IG5ldHhlbl9uaWNfZ2V0X2VlcHJvbV9sZW4sCisJLmdldF9lZXByb20gPSBuZXR4ZW5fbmljX2dldF9lZXByb20sCisJLmdldF9yaW5ncGFyYW0gPSBuZXR4ZW5fbmljX2dldF9yaW5ncGFyYW0sCisJLmdldF9wYXVzZXBhcmFtID0gbmV0eGVuX25pY19nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0gPSBuZXR4ZW5fbmljX3NldF9wYXVzZXBhcmFtLAorCS5nZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtID0gZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnID0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZyA9IGV0aHRvb2xfb3Bfc2V0X3NnLAorCS5nZXRfdHNvID0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5zZXRfdHNvID0gZXRodG9vbF9vcF9zZXRfdHNvLAorCS5zZWxmX3Rlc3RfY291bnQgPSBuZXR4ZW5fbmljX2RpYWdfdGVzdF9jb3VudCwKKwkuc2VsZl90ZXN0ID0gbmV0eGVuX25pY19kaWFnX3Rlc3QsCisJLmdldF9zdHJpbmdzID0gbmV0eGVuX25pY19nZXRfc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50ID0gbmV0eGVuX25pY19nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzID0gbmV0eGVuX25pY19nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3Blcm1fYWRkciA9IGV0aHRvb2xfb3BfZ2V0X3Blcm1fYWRkciwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19oZHIuaCBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2hkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOGI2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19oZHIuaApAQCAtMCwwICsxLDY3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKi8KKworI2lmbmRlZiBfX05FVFhFTl9OSUNfSERSX0hfCisjZGVmaW5lIF9fTkVUWEVOX05JQ19IRFJfSF8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgkJLyogZm9yIG1lbXNldCAqLworCisvKgorICogVGhlIGJhc2ljIHVuaXQgb2YgYWNjZXNzIHdoZW4gcmVhZGluZy93cml0aW5nIGNvbnRyb2wgcmVnaXN0ZXJzLgorICovCisKK3R5cGVkZWYgX19sZTMyIG5ldHhlbl9jcmJ3b3JkX3Q7CS8qIHNpbmdsZSB3b3JkIGluIENSQiBzcGFjZSAqLworCitlbnVtIHsKKwlORVRYRU5fSFdfSDBfQ0hfSFVCX0FEUiA9IDB4MDUsCisJTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPSAweDBFLAorCU5FVFhFTl9IV19IMl9DSF9IVUJfQURSID0gMHgwMywKKwlORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA9IDB4MDEsCisJTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPSAweDA2LAorCU5FVFhFTl9IV19INV9DSF9IVUJfQURSID0gMHgwNywKKwlORVRYRU5fSFdfSDZfQ0hfSFVCX0FEUiA9IDB4MDgKK307CisKKy8qICBIdWIgMCAqLworZW51bSB7CisJTkVUWEVOX0hXX01OX0NSQl9BR1RfQURSID0gMHgxNSwKKwlORVRYRU5fSFdfTVNfQ1JCX0FHVF9BRFIgPSAweDI1Cit9OworCisvKiAgSHViIDEgKi8KK2VudW0geworCU5FVFhFTl9IV19QU19DUkJfQUdUX0FEUiA9IDB4NzMsCisJTkVUWEVOX0hXX1NTX0NSQl9BR1RfQURSID0gMHgyMCwKKwlORVRYRU5fSFdfUlBNWDNfQ1JCX0FHVF9BRFIgPSAweDBiLAorCU5FVFhFTl9IV19RTVNfQ1JCX0FHVF9BRFIgPSAweDAwLAorCU5FVFhFTl9IV19TUUdTMF9DUkJfQUdUX0FEUiA9IDB4MDEsCisJTkVUWEVOX0hXX1NRR1MxX0NSQl9BR1RfQURSID0gMHgwMiwKKwlORVRYRU5fSFdfU1FHUzJfQ1JCX0FHVF9BRFIgPSAweDAzLAorCU5FVFhFTl9IV19TUUdTM19DUkJfQUdUX0FEUiA9IDB4MDQsCisJTkVUWEVOX0hXX0MyQzBfQ1JCX0FHVF9BRFIgPSAweDU4LAorCU5FVFhFTl9IV19DMkMxX0NSQl9BR1RfQURSID0gMHg1OSwKKwlORVRYRU5fSFdfQzJDMl9DUkJfQUdUX0FEUiA9IDB4NWEsCisJTkVUWEVOX0hXX1JQTVgyX0NSQl9BR1RfQURSID0gMHgwYSwKKwlORVRYRU5fSFdfUlBNWDRfQ1JCX0FHVF9BRFIgPSAweDBjLAorCU5FVFhFTl9IV19SUE1YN19DUkJfQUdUX0FEUiA9IDB4MGYsCisJTkVUWEVOX0hXX1JQTVg5X0NSQl9BR1RfQURSID0gMHgxMiwKKwlORVRYRU5fSFdfU01CX0NSQl9BR1RfQURSID0gMHgxOAorfTsKKworLyogIEh1YiAyICovCitlbnVtIHsKKwlORVRYRU5fSFdfTklVX0NSQl9BR1RfQURSID0gMHgzMSwKKwlORVRYRU5fSFdfSTJDMF9DUkJfQUdUX0FEUiA9IDB4MTksCisJTkVUWEVOX0hXX0kyQzFfQ1JCX0FHVF9BRFIgPSAweDI5LAorCisJTkVUWEVOX0hXX1NOX0NSQl9BR1RfQURSID0gMHgxMCwKKwlORVRYRU5fSFdfSTJRX0NSQl9BR1RfQURSID0gMHgyMCwKKwlORVRYRU5fSFdfTFBDX0NSQl9BR1RfQURSID0gMHgyMiwKKwlORVRYRU5fSFdfUk9NVVNCX0NSQl9BR1RfQURSID0gMHgyMSwKKwlORVRYRU5fSFdfUU1fQ1JCX0FHVF9BRFIgPSAweDY2LAorCU5FVFhFTl9IV19TUUcwX0NSQl9BR1RfQURSID0gMHg2MCwKKwlORVRYRU5fSFdfU1FHMV9DUkJfQUdUX0FEUiA9IDB4NjEsCisJTkVUWEVOX0hXX1NRRzJfQ1JCX0FHVF9BRFIgPSAweDYyLAorCU5FVFhFTl9IV19TUUczX0NSQl9BR1RfQURSID0gMHg2MywKKwlORVRYRU5fSFdfUlBNWDFfQ1JCX0FHVF9BRFIgPSAweDA5LAorCU5FVFhFTl9IV19SUE1YNV9DUkJfQUdUX0FEUiA9IDB4MGQsCisJTkVUWEVOX0hXX1JQTVg2X0NSQl9BR1RfQURSID0gMHgwZSwKKwlORVRYRU5fSFdfUlBNWDhfQ1JCX0FHVF9BRFIgPSAweDExCit9OworCisvKiAgSHViIDMgKi8KK2VudW0geworCU5FVFhFTl9IV19QSF9DUkJfQUdUX0FEUiA9IDB4MUEsCisJTkVUWEVOX0hXX1NSRV9DUkJfQUdUX0FEUiA9IDB4NTAsCisJTkVUWEVOX0hXX0VHX0NSQl9BR1RfQURSID0gMHg1MSwKKwlORVRYRU5fSFdfUlBNWDBfQ1JCX0FHVF9BRFIgPSAweDA4Cit9OworCisvKiAgSHViIDQgKi8KK2VudW0geworCU5FVFhFTl9IV19QRUdOMF9DUkJfQUdUX0FEUiA9IDB4NDAsCisJTkVUWEVOX0hXX1BFR04xX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdOMl9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHTjNfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR05JX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdORF9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHTkNfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR1IwX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdSMV9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHUjJfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR1IzX0NSQl9BR1RfQURSCit9OworCisvKiAgSHViIDUgKi8KK2VudW0geworCU5FVFhFTl9IV19QRUdTMF9DUkJfQUdUX0FEUiA9IDB4NDAsCisJTkVUWEVOX0hXX1BFR1MxX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdTMl9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHUzNfQ1JCX0FHVF9BRFIsCisJTkVUWEVOX0hXX1BFR1NJX0NSQl9BR1RfQURSLAorCU5FVFhFTl9IV19QRUdTRF9DUkJfQUdUX0FEUiwKKwlORVRYRU5fSFdfUEVHU0NfQ1JCX0FHVF9BRFIKK307CisKKy8qICBIdWIgNiAqLworZW51bSB7CisJTkVUWEVOX0hXX0NBUzBfQ1JCX0FHVF9BRFIgPSAweDQ2LAorCU5FVFhFTl9IV19DQVMxX0NSQl9BR1RfQURSID0gMHg0NywKKwlORVRYRU5fSFdfQ0FTMl9DUkJfQUdUX0FEUiA9IDB4NDgsCisJTkVUWEVOX0hXX0NBUzNfQ1JCX0FHVF9BRFIgPSAweDQ5LAorCU5FVFhFTl9IV19OQ01fQ1JCX0FHVF9BRFIgPSAweDE2LAorCU5FVFhFTl9IV19UTVJfQ1JCX0FHVF9BRFIgPSAweDE3LAorCU5FVFhFTl9IV19YRE1BX0NSQl9BR1RfQURSID0gMHgwNSwKKwlORVRYRU5fSFdfT0NNMF9DUkJfQUdUX0FEUiA9IDB4MDYsCisJTkVUWEVOX0hXX09DTTFfQ1JCX0FHVF9BRFIgPSAweDA3Cit9OworCisvKiAgRmxvYXRlcnMgLSBub24gZXhpc3RlbnQgbW9kdWxlcyAqLworI2RlZmluZSBORVRYRU5fSFdfRUZDX1JQTVgwX0NSQl9BR1RfQURSCTB4NjcKKworLyogIFRoaXMgZmllbGQgZGVmaW5lcyBQQ0kvWCBhZHIgWzI1OjIwXSBvZiBhZ2VudHMgb24gdGhlIENSQiAqLworZW51bSB7CisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEggPSAwLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BTLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX01OLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX01TLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHUjEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfU1JFLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX05JVSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9RTU4sCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfU1FOMCwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9TUU4xLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1NRTjIsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfU1FOMywKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9RTVMsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfU1FTMCwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9TUVMxLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1NRUzIsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfU1FTMywKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR04wLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTjEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdOMiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR04zLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTkQsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdOSSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR1MwLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHUzEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdTMiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR1MzLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHU0QsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdTSSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9TTiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QR1IyLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0VHLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BIMiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9QUzIsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfQ0FNLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0NBUzAsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfQ0FTMSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9DQVMyLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0MyQzAsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfQzJDMSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9USU1SLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHUjMsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDIsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDMsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDQsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDUsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDYsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDcsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfWERNQSwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9JMlEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUk9NVVNCLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0NBUzMsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDAsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDgsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUlBNWDksCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfT0NNMCwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9PQ00xLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1NNQiwKKwlORVRYRU5fSFdfUFhfTUFQX0NSQl9JMkMwLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX0kyQzEsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfTFBDLAorCU5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTkMsCisJTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdSMAorfTsKKworLyogIFRoaXMgZmllbGQgZGVmaW5lcyBDUkIgYWRyIFszMToyMF0gb2YgdGhlIGFnZW50cyAqLworCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfTU4JXAorCSgoTkVUWEVOX0hXX0gwX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfTU5fQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEgJXAorCSgoTkVUWEVOX0hXX0gwX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEhfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfTVMJXAorCSgoTkVUWEVOX0hXX0gwX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfTVNfQ1JCX0FHVF9BRFIpCisKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QUwlcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QU19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9TUwlcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19TU19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMwlcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YM19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9RTVMJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUU1TX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1NRUzAJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU1FHUzBfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU1FTMQlcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19TUUdTMV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9TUVMyCVwKKwkoKE5FVFhFTl9IV19IMV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1NRR1MyX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1NRUzMJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU1FHUzNfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfQzJDMAlcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19DMkMwX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX0MyQzEJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfQzJDMV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMglcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YMl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNAlcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YNF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YNwlcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YN19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YOQlcCisJKChORVRYRU5fSFdfSDFfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YOV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9TTUIJXAorCSgoTkVUWEVOX0hXX0gxX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU01CX0NSQl9BR1RfQURSKQorCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfTklVCVwKKwkoKE5FVFhFTl9IV19IMl9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX05JVV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9JMkMwCVwKKwkoKE5FVFhFTl9IV19IMl9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX0kyQzBfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfSTJDMQlcCisJKChORVRYRU5fSFdfSDJfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19JMkMxX0NSQl9BR1RfQURSKQorCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU1JFCVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1NSRV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9FRwlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19FR19DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9SUE1YMAlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19SUE1YMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9RTU4JXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUU1fQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU1FOMAlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19TUUcwX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1NRTjEJXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfU1FHMV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9TUU4yCVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1NRRzJfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfU1FOMwlcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19TUUczX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1JQTVgxCVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1JQTVgxX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1JQTVg1CVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1JQTVg1X0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1JQTVg2CVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1JQTVg2X0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1JQTVg4CVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1JQTVg4X0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX0NBUzAJXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfQ0FTMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9DQVMxCVwKKwkoKE5FVFhFTl9IV19IM19DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX0NBUzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfQ0FTMglcCisJKChORVRYRU5fSFdfSDNfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19DQVMyX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX0NBUzMJXAorCSgoTkVUWEVOX0hXX0gzX0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfQ0FTM19DUkJfQUdUX0FEUikKKworI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHTkkJXAorCSgoTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHTklfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdORAlcCisJKChORVRYRU5fSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdORF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR04wCVwKKwkoKE5FVFhFTl9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR04wX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHTjEJXAorCSgoTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHTjFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdOMglcCisJKChORVRYRU5fSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdOMl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR04zCVwKKwkoKE5FVFhFTl9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR04zX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHTkMJXAorCSgoTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHTkNfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdSMAlcCisJKChORVRYRU5fSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdSMF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1IxCVwKKwkoKE5FVFhFTl9IV19INF9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR1IxX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHUjIJXAorCSgoTkVUWEVOX0hXX0g0X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHUjJfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdSMwlcCisJKChORVRYRU5fSFdfSDRfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdSM19DUkJfQUdUX0FEUikKKworI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHU0kJXAorCSgoTkVUWEVOX0hXX0g1X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHU0lfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdTRAlcCisJKChORVRYRU5fSFdfSDVfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdTRF9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1MwCVwKKwkoKE5FVFhFTl9IV19INV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR1MwX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHUzEJXAorCSgoTkVUWEVOX0hXX0g1X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHUzFfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfUEdTMglcCisJKChORVRYRU5fSFdfSDVfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19QRUdTMl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9QR1MzCVwKKwkoKE5FVFhFTl9IV19INV9DSF9IVUJfQURSIDw8IDcpIHwgTkVUWEVOX0hXX1BFR1MzX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1BHU0MJXAorCSgoTkVUWEVOX0hXX0g1X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfUEVHU0NfQ1JCX0FHVF9BRFIpCisKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9DQU0JXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfTkNNX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1RJTVIJXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfVE1SX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1hETUEJXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfWERNQV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9TTglcCisJKChORVRYRU5fSFdfSDZfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19TTl9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9JMlEJXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfSTJRX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX1JPTVVTQglcCisJKChORVRYRU5fSFdfSDZfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19ST01VU0JfQ1JCX0FHVF9BRFIpCisjZGVmaW5lIE5FVFhFTl9IV19DUkJfSFVCX0FHVF9BRFJfT0NNMAlcCisJKChORVRYRU5fSFdfSDZfQ0hfSFVCX0FEUiA8PCA3KSB8IE5FVFhFTl9IV19PQ00wX0NSQl9BR1RfQURSKQorI2RlZmluZSBORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSX09DTTEJXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfT0NNMV9DUkJfQUdUX0FEUikKKyNkZWZpbmUgTkVUWEVOX0hXX0NSQl9IVUJfQUdUX0FEUl9MUEMJXAorCSgoTkVUWEVOX0hXX0g2X0NIX0hVQl9BRFIgPDwgNykgfCBORVRYRU5fSFdfTFBDX0NSQl9BR1RfQURSKQorCisvKgorICogTUFYX1JDVl9DVFggOiBUaGUgbnVtYmVyIG9mIHJlY2VpdmUgY29udGV4dHMgdGhhdCBhcmUgYXZhaWxhYmxlIG9uCisgKiB0aGUgcGhhbnRvbS4KKyAqLworI2RlZmluZSBNQVhfUkNWX0NUWAkJCTEKKworI2RlZmluZSBORVRYRU5fU1JFX0lOVF9TVEFUVVMJCShORVRYRU5fQ1JCX1NSRSArIDB4MDAwMzQpCisjZGVmaW5lIE5FVFhFTl9TUkVfUEJJX0FDVElWRV9TVEFUVVMJKE5FVFhFTl9DUkJfU1JFICsgMHgwMTAxNCkKKyNkZWZpbmUgTkVUWEVOX1NSRV9MMVJFX0NUTAkJKE5FVFhFTl9DUkJfU1JFICsgMHgwMzAwMCkKKyNkZWZpbmUgTkVUWEVOX1NSRV9MMlJFX0NUTAkJKE5FVFhFTl9DUkJfU1JFICsgMHgwNTAwMCkKKyNkZWZpbmUgTkVUWEVOX1NSRV9CVUZfQ1RMCQkoTkVUWEVOX0NSQl9TUkUgKyAweDAxMDAwKQorCisjZGVmaW5lCU5FVFhFTl9ETUFfQkFTRShVKQkoTkVUWEVOX0NSQl9QQ0lYX01EICsgMHgyMDAwMCArICgoVSk8PDE2KSkKKyNkZWZpbmUJTkVUWEVOX0RNQV9DT01NQU5EKFUpCShORVRYRU5fRE1BX0JBU0UoVSkgKyAweDAwMDA4KQorCisjZGVmaW5lIE5FVFhFTl9JMlFfQ0xSX1BDSV9ISQkoTkVUWEVOX0NSQl9JMlEgKyAweDAwMDM0KQorCisjZGVmaW5lIFBFR19ORVRXT1JLX0JBU0UoTikJKE5FVFhFTl9DUkJfUEVHX05FVF8wICsgKCgoTikmMykgPDwgMjApKQorI2RlZmluZSBDUkJfUkVHX0VYX1BDCQkweDNjCisKKyNkZWZpbmUgUk9NVVNCX0dMQgkoTkVUWEVOX0NSQl9ST01VU0IgKyAweDAwMDAwKQorI2RlZmluZSBST01VU0JfUk9NCShORVRYRU5fQ1JCX1JPTVVTQiArIDB4MTAwMDApCisKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9HTEJfU1RBVFVTCShST01VU0JfR0xCICsgMHgwMDA0KQorI2RlZmluZSBORVRYRU5fUk9NVVNCX0dMQl9TV19SRVNFVAkoUk9NVVNCX0dMQiArIDB4MDAwOCkKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9HTEJfUEFEX0dQSU9fSQkoUk9NVVNCX0dMQiArIDB4MDAwYykKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9HTEJfQ0FTX1JTVAkoUk9NVVNCX0dMQiArIDB4MDAzOCkKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9HTEJfVEVTVF9NVVhfU0VMCShST01VU0JfR0xCICsgMHgwMDQ0KQorI2RlZmluZSBORVRYRU5fUk9NVVNCX0dMQl9QRUdUVU5FX0RPTkUJKFJPTVVTQl9HTEIgKyAweDAwNWMpCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfR0xCX0NISVBfQ0xLX0NUUkwJKFJPTVVTQl9HTEIgKyAweDAwQTgpCisKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9HUElPKG4pCQkoUk9NVVNCX0dMQiArIDB4NjAgKyAoNCAqIChuKSkpCisKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFCShST01VU0JfUk9NICsgMHgwMDA0KQorI2RlZmluZSBORVRYRU5fUk9NVVNCX1JPTV9BRERSRVNTCShST01VU0JfUk9NICsgMHgwMDA4KQorI2RlZmluZSBORVRYRU5fUk9NVVNCX1JPTV9XREFUQQkJKFJPTVVTQl9ST00gKyAweDAwMGMpCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVAkoUk9NVVNCX1JPTSArIDB4MDAxMCkKKyNkZWZpbmUgTkVUWEVOX1JPTVVTQl9ST01fRFVNTVlfQllURV9DTlQgKFJPTVVTQl9ST00gKyAweDAwMTQpCisjZGVmaW5lIE5FVFhFTl9ST01VU0JfUk9NX1JEQVRBCQkoUk9NVVNCX1JPTSArIDB4MDAxOCkKKworLyogTG9jayBJRHMgZm9yIFJPTSBsb2NrICovCisjZGVmaW5lIFJPTV9MT0NLX0RSSVZFUgkweDBkNDE3MzQwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgRGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gTTI1UCBmbGFzaAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIEluc3RydWN0aW9ucworKi8KKyNkZWZpbmUgTTI1UF9JTlNUUl9XUkVOCQkweDA2CisjZGVmaW5lIE0yNVBfSU5TVFJfV1JESQkJMHgwNAorI2RlZmluZSBNMjVQX0lOU1RSX1JESUQJCTB4OWYKKyNkZWZpbmUgTTI1UF9JTlNUUl9SRFNSCQkweDA1CisjZGVmaW5lIE0yNVBfSU5TVFJfV1JTUgkJMHgwMQorI2RlZmluZSBNMjVQX0lOU1RSX1JFQUQJCTB4MDMKKyNkZWZpbmUgTTI1UF9JTlNUUl9GQVNUX1JFQUQJMHgwYgorI2RlZmluZSBNMjVQX0lOU1RSX1BQCQkweDAyCisjZGVmaW5lIE0yNVBfSU5TVFJfU0UJCTB4ZDgKKyNkZWZpbmUgTTI1UF9JTlNUUl9CRQkJMHhjNworI2RlZmluZSBNMjVQX0lOU1RSX0RQCQkweGI5CisjZGVmaW5lIE0yNVBfSU5TVFJfUkVTCQkweGFiCisKKy8qIGFsbCBhcmUgMU1CIHdpbmRvd3MgKi8KKworI2RlZmluZSBORVRYRU5fUENJX0NSQl9XSU5ET1dTSVpFCTB4MDAxMDAwMDAKKyNkZWZpbmUgTkVUWEVOX1BDSV9DUkJfV0lORE9XKEEpCVwKKwkoTkVUWEVOX1BDSV9DUkJTUEFDRSArIChBKSpORVRYRU5fUENJX0NSQl9XSU5ET1dTSVpFKQorCisjZGVmaW5lIE5FVFhFTl9DUkJfTklVCQlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfTklVKQorI2RlZmluZSBORVRYRU5fQ1JCX1NSRQkJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX1NSRSkKKyNkZWZpbmUgTkVUWEVOX0NSQl9ST01VU0IJXAorCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9ST01VU0IpCisjZGVmaW5lIE5FVFhFTl9DUkJfSTJRCQlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfSTJRKQorI2RlZmluZSBORVRYRU5fQ1JCX01BWAkJTkVUWEVOX1BDSV9DUkJfV0lORE9XKDY0KQorCisjZGVmaW5lIE5FVFhFTl9DUkJfUENJWF9IT1NUCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9QSCkKKyNkZWZpbmUgTkVUWEVOX0NSQl9QQ0lYX0hPU1QyCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9QSDIpCisjZGVmaW5lIE5FVFhFTl9DUkJfUEVHX05FVF8wCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9QR04wKQorI2RlZmluZSBORVRYRU5fQ1JCX1BFR19ORVRfMQlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdOMSkKKyNkZWZpbmUgTkVUWEVOX0NSQl9QRUdfTkVUXzIJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTjIpCisjZGVmaW5lIE5FVFhFTl9DUkJfUEVHX05FVF8zCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9QR04zKQorI2RlZmluZSBORVRYRU5fQ1JCX1BFR19ORVRfRAlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfUEdORCkKKyNkZWZpbmUgTkVUWEVOX0NSQl9QRUdfTkVUX0kJTkVUWEVOX1BDSV9DUkJfV0lORE9XKE5FVFhFTl9IV19QWF9NQVBfQ1JCX1BHTkkpCisjZGVmaW5lIE5FVFhFTl9DUkJfRERSX05FVAlORVRYRU5fUENJX0NSQl9XSU5ET1coTkVUWEVOX0hXX1BYX01BUF9DUkJfTU4pCisKKyNkZWZpbmUgTkVUWEVOX0NSQl9QQ0lYX01ECU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9QUykKKyNkZWZpbmUgTkVUWEVOX0NSQl9QQ0lFCQlORVRYRU5fQ1JCX1BDSVhfTUQKKworI2RlZmluZSBJU1JfSU5UX1ZFQ1RPUgkJKE5FVFhFTl9QQ0lYX1BTX1JFRyhQQ0lYX0lOVF9WRUNUT1IpKQorI2RlZmluZSBJU1JfSU5UX01BU0sJCShORVRYRU5fUENJWF9QU19SRUcoUENJWF9JTlRfTUFTSykpCisjZGVmaW5lIElTUl9JTlRfTUFTS19TTE9XCShORVRYRU5fUENJWF9QU19SRUcoUENJWF9JTlRfTUFTSykpCisjZGVmaW5lIElTUl9JTlRfVEFSR0VUX1NUQVRVUwkoTkVUWEVOX1BDSVhfUFNfUkVHKFBDSVhfVEFSR0VUX1NUQVRVUykpCisjZGVmaW5lIElTUl9JTlRfVEFSR0VUX01BU0sJKE5FVFhFTl9QQ0lYX1BTX1JFRyhQQ0lYX1RBUkdFVF9NQVNLKSkKKworI2RlZmluZSBORVRYRU5fUENJX01BUFNJWkUJMTI4CisjZGVmaW5lIE5FVFhFTl9QQ0lfRERSX05FVAkoMHgwMDAwMDAwMFVMKQorI2RlZmluZSBORVRYRU5fUENJX1FEUl9ORVQJKDB4MDQwMDAwMDBVTCkKKyNkZWZpbmUgTkVUWEVOX1BDSV9ESVJFQ1RfQ1JCCSgweDA0NDAwMDAwVUwpCisjZGVmaW5lIE5FVFhFTl9QQ0lfQ0FNUU1fTUFYCSgweDA0ZmZmZmZmVUwpCisjZGVmaW5lIE5FVFhFTl9QQ0lfT0NNMAkJKDB4MDUwMDAwMDBVTCkKKyNkZWZpbmUgTkVUWEVOX1BDSV9PQ00wX01BWAkoMHgwNTBmZmZmZlVMKQorI2RlZmluZSBORVRYRU5fUENJX09DTTEJCSgweDA1MTAwMDAwVUwpCisjZGVmaW5lIE5FVFhFTl9QQ0lfT0NNMV9NQVgJKDB4MDUxZmZmZmZVTCkKKyNkZWZpbmUgTkVUWEVOX1BDSV9DUkJTUEFDRQkoMHgwNjAwMDAwMFVMKQorCisjZGVmaW5lIE5FVFhFTl9DUkJfQ0FNCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9DQU0pCisKKyNkZWZpbmUgTkVUWEVOX0FERFJfRERSX05FVAkoMHgwMDAwMDAwMDAwMDAwMDAwVUxMKQorI2RlZmluZSBORVRYRU5fQUREUl9ERFJfTkVUX01BWCAoMHgwMDAwMDAwMDBmZmZmZmZmVUxMKQorI2RlZmluZSBORVRYRU5fQUREUl9PQ00wCSgweDAwMDAwMDAyMDAwMDAwMDBVTEwpCisjZGVmaW5lIE5FVFhFTl9BRERSX09DTTBfTUFYCSgweDAwMDAwMDAyMDAwZmZmZmZVTEwpCisjZGVmaW5lIE5FVFhFTl9BRERSX09DTTEJKDB4MDAwMDAwMDIwMDQwMDAwMFVMTCkKKyNkZWZpbmUgTkVUWEVOX0FERFJfT0NNMV9NQVgJKDB4MDAwMDAwMDIwMDRmZmZmZlVMTCkKKyNkZWZpbmUgTkVUWEVOX0FERFJfUURSX05FVAkoMHgwMDAwMDAwMzAwMDAwMDAwVUxMKQorI2RlZmluZSBORVRYRU5fQUREUl9RRFJfTkVUX01BWCAoMHgwMDAwMDAwMzAwM2ZmZmZmVUxMKQorCisJLyogMjAwbXMgZGVsYXkgaW4gZWFjaCBsb29wICovCisjZGVmaW5lCU5FVFhFTl9OSVVfUEhZX1dBSVRMRU4JCTIwMDAwMAorCS8qIDEwIHNlY29uZHMgYmVmb3JlIHdlIGdpdmUgdXAgKi8KKyNkZWZpbmUJTkVUWEVOX05JVV9QSFlfV0FJVE1BWAkJNTAKKyNkZWZpbmUJTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTCTQKKworI2RlZmluZQlORVRYRU5fTklVX01PREUJCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDAwKQorCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfU0lOR0xFX1RFUk0JKE5FVFhFTl9DUkJfTklVICsgMHgwMDAwNCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19EUklWRV9ISQkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAwOCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19EUklWRV9MTwkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAwYykKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19EVFgJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMTApCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfREVRCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDE0KQorI2RlZmluZQlORVRYRU5fTklVX1hHX1dPUkRfQUxJR04JKE5FVFhFTl9DUkJfTklVICsgMHgwMDAxOCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19SRVNFVAkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAxYykKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19QT1dFUl9ET1dOCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMjApCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfUkVTRVRfUExMCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDI0KQorI2RlZmluZQlORVRYRU5fTklVX1hHX1NFUkRFU19MT09QQkFDSwkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDI4KQorI2RlZmluZQlORVRYRU5fTklVX1hHX0RPX0JZVEVfQUxJR04JKE5FVFhFTl9DUkJfTklVICsgMHgwMDAyYykKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19UWF9FTkFCTEUJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwMzApCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdfUlhfRU5BQkxFCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDM0KQorI2RlZmluZQlORVRYRU5fTklVX1hHX1NUQVRVUwkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAzOCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19QQVVTRV9USFJFU0hPTEQJKE5FVFhFTl9DUkJfTklVICsgMHgwMDAzYykKKyNkZWZpbmUJTkVUWEVOX05JVV9JTlRfTUFTSwkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA0MCkKKyNkZWZpbmUJTkVUWEVOX05JVV9BQ1RJVkVfSU5UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDQ0KQorI2RlZmluZQlORVRYRU5fTklVX01BU0tBQkxFX0lOVAkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA0OCkKKworI2RlZmluZSBORVRYRU5fTklVX1NUUkFQX1ZBTFVFX1NBVkVfSElHSEVSCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNGMpCisKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9TRVJERVNfUkVTRVQJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA1MCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQjBfR01JSV9NT0RFCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNTQpCisjZGVmaW5lCU5FVFhFTl9OSVVfR0IwX01JSV9NT0RFCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDU4KQorI2RlZmluZQlORVRYRU5fTklVX0dCMV9HTUlJX01PREUJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA1YykKKyNkZWZpbmUJTkVUWEVOX05JVV9HQjFfTUlJX01PREUJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNjApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0IyX0dNSUlfTU9ERQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDY0KQorI2RlZmluZQlORVRYRU5fTklVX0dCMl9NSUlfTU9ERQkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA2OCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQjNfR01JSV9NT0RFCShORVRYRU5fQ1JCX05JVSArIDB4MDAwNmMpCisjZGVmaW5lCU5FVFhFTl9OSVVfR0IzX01JSV9NT0RFCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDcwKQorI2RlZmluZQlORVRYRU5fTklVX1JFTU9URV9MT09QQkFDSwkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDc0KQorI2RlZmluZQlORVRYRU5fTklVX0dCMF9IQUxGX0RVUExFWAkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDc4KQorI2RlZmluZQlORVRYRU5fTklVX0dCMV9IQUxGX0RVUExFWAkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDdjKQorI2RlZmluZQlORVRYRU5fTklVX1JFU0VUX1NZU19GSUZPUwkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDg4KQorI2RlZmluZQlORVRYRU5fTklVX0dCX0NSQ19EUk9QCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDhjKQorI2RlZmluZQlORVRYRU5fTklVX0dCX0RST1BfV1JPTkdBRERSCShORVRYRU5fQ1JCX05JVSArIDB4MDAwOTApCisjZGVmaW5lCU5FVFhFTl9OSVVfVEVTVF9NVVhfQ1RMCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDk0KQorI2RlZmluZQlORVRYRU5fTklVX1hHX1BBVVNFX0NUTAkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDA5OCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR19QQVVTRV9MRVZFTAkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMGRjKQorI2RlZmluZQlORVRYRU5fTklVX1hHX1NFTAkJKE5FVFhFTl9DUkJfTklVICsgMHgwMDEyOCkKKworI2RlZmluZSBORVRYRU5fTklVX0ZVTExfTEVWRUxfWEcJKE5FVFhFTl9DUkJfTklVICsgMHgwMDQ1MCkKKworI2RlZmluZSBORVRYRU5fTklVX1hHMV9SRVNFVAkgICAgCShORVRYRU5fQ1JCX05JVSArIDB4MDAxMWMpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1BPV0VSX0RPV04JKE5FVFhFTl9DUkJfTklVICsgMHgwMDEyMCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfUkVTRVRfUExMCShORVRYRU5fQ1JCX05JVSArIDB4MDAxMjQpCisKKyNkZWZpbmUgTkVUWEVOX01BQ19BRERSX0NOVExfUkVHCShORVRYRU5fQ1JCX05JVSArIDB4MTAwMCkKKworI2RlZmluZQlORVRYRU5fTVVMVElDQVNUX0FERFJfSElfMAkoTkVUWEVOX0NSQl9OSVUgKyAweDEwMTApCisjZGVmaW5lIE5FVFhFTl9NVUxUSUNBU1RfQUREUl9ISV8xCShORVRYRU5fQ1JCX05JVSArIDB4MTAxNCkKKyNkZWZpbmUgTkVUWEVOX01VTFRJQ0FTVF9BRERSX0hJXzIJKE5FVFhFTl9DUkJfTklVICsgMHgxMDE4KQorI2RlZmluZSBORVRYRU5fTVVMVElDQVNUX0FERFJfSElfMwkoTkVUWEVOX0NSQl9OSVUgKyAweDEwMWMpCisKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAoSSkJCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDAwICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18xKEkpCQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAwNCArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX01BQ19JUEdfSUZHKEkpCQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAwOCArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX0hBTEZfRFVQTEVYX0NUUkwoSSkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMGMgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9NQVhfRlJBTUVfU0laRShJKQkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMTAgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9URVNUX1JFRyhJKQkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMWMgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9DT05GSUcoSSkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMjAgKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9DT01NQU5EKEkpCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDI0ICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUihJKQkJXAorCShORVRYRU5fQ1JCX05JVSArIDB4MzAwMjggKyAoSSkqMHgxMDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9DVFJMKEkpCQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAyYyArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX01JSV9NR01UX1NUQVRVUyhJKQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAzMCArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX01JSV9NR01UX0lORElDQVRFKEkpCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDM0ICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfSU5URVJGQUNFX0NUUkwoSSkJCVwKKwkoTkVUWEVOX0NSQl9OSVUgKyAweDMwMDM4ICsgKEkpKjB4MTAwMDApCisjZGVmaW5lCU5FVFhFTl9OSVVfR0JfSU5URVJGQUNFX1NUQVRVUyhJKQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDAzYyArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX1NUQVRJT05fQUREUl8wKEkpCQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDA0MCArIChJKSoweDEwMDAwKQorI2RlZmluZQlORVRYRU5fTklVX0dCX1NUQVRJT05fQUREUl8xKEkpCQlcCisJKE5FVFhFTl9DUkJfTklVICsgMHgzMDA0NCArIChJKSoweDEwMDAwKQorCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX0NPTkZJR18wCQkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAwMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfQ09ORklHXzEJCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDA0KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9JUEcJCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDA4KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMF9ISQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDBjKQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMF8xCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDEwKQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMV9MTwkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDE0KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9TVEFUVVMJCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDE4KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9NQVhfRlJBTUVfU0laRQkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAxYykKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfUEFVU0VfRlJBTUVfVkFMVUUJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAyMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfVFhfQllURV9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMjQpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX1RYX0ZSQU1FX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAyOCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfUlhfQllURV9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMmMpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX1JYX0ZSQU1FX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDAzMCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfQUdHUl9FUlJPUl9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMzQpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX01VTFRJQ0FTVF9GUkFNRV9DTlQgCShORVRYRU5fQ1JCX05JVSArIDB4NzAwMzgpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX1VOSUNBU1RfRlJBTUVfQ05UCShORVRYRU5fQ1JCX05JVSArIDB4NzAwM2MpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX0NSQ19FUlJPUl9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4NzAwNDApCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX09WRVJTSVpFX0ZSQU1FX0VSUgkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDQ0KQorI2RlZmluZQlORVRYRU5fTklVX1hHRV9VTkRFUlNJWkVfRlJBTUVfRVJSCShORVRYRU5fQ1JCX05JVSArIDB4NzAwNDgpCisjZGVmaW5lCU5FVFhFTl9OSVVfWEdFX0xPQ0FMX0VSUk9SX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDA0YykKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfUkVNT1RFX0VSUk9SX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDA1MCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfQ09OVFJPTF9DSEFSX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg3MDA1NCkKKyNkZWZpbmUJTkVUWEVOX05JVV9YR0VfUEFVU0VfRlJBTUVfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDcwMDU4KQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9DT05GSUdfMAkJCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMDApCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX0NPTkZJR18xCQkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAwNCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfSVBHCQkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAwOCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfU1RBVElPTl9BRERSXzBfSEkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAwYykKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfU1RBVElPTl9BRERSXzBfMQkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAxMCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfU1RBVElPTl9BRERSXzFfTE8JKE5FVFhFTl9DUkJfTklVICsgMHg4MDAxNCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfU1RBVFVTCQkgICAgCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMTgpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX01BWF9GUkFNRV9TSVpFCSAgIAkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDFjKQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9QQVVTRV9GUkFNRV9WQUxVRQkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDIwKQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9UWF9CWVRFX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAyNCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfVFhfRlJBTUVfQ05UCSAJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAyOCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfUlhfQllURV9DTlQJICAJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAyYykKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfUlhfRlJBTUVfQ05UCSAJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAzMCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfQUdHUl9FUlJPUl9DTlQJICAgCShORVRYRU5fQ1JCX05JVSArIDB4ODAwMzQpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX01VTFRJQ0FTVF9GUkFNRV9DTlQJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAzOCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfVU5JQ0FTVF9GUkFNRV9DTlQJKE5FVFhFTl9DUkJfTklVICsgMHg4MDAzYykKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfQ1JDX0VSUk9SX0NOVAkJKE5FVFhFTl9DUkJfTklVICsgMHg4MDA0MCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfT1ZFUlNJWkVfRlJBTUVfRVJSCShORVRYRU5fQ1JCX05JVSArIDB4ODAwNDQpCisjZGVmaW5lIE5FVFhFTl9OSVVfWEcxX1VOREVSU0laRV9GUkFNRV9FUlIJKE5FVFhFTl9DUkJfTklVICsgMHg4MDA0OCkKKyNkZWZpbmUgTkVUWEVOX05JVV9YRzFfTE9DQUxfRVJST1JfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDRjKQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9SRU1PVEVfRVJST1JfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDUwKQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9DT05UUk9MX0NIQVJfQ05UCQkoTkVUWEVOX0NSQl9OSVUgKyAweDgwMDU0KQorI2RlZmluZSBORVRYRU5fTklVX1hHMV9QQVVTRV9GUkFNRV9DTlQJCShORVRYRU5fQ1JCX05JVSArIDB4ODAwNTgpCisKKy8qIFhHIExpbmsgc3RhdHVzICovCisjZGVmaW5lIFhHX0xJTktfVVAJMHgxMAorI2RlZmluZSBYR19MSU5LX0RPV04JMHgyMAorCisjZGVmaW5lIE5FVFhFTl9DQU1fUkFNX0JBU0UJKE5FVFhFTl9DUkJfQ0FNICsgMHgwMjAwMCkKKyNkZWZpbmUgTkVUWEVOX0NBTV9SQU0ocmVnKQkoTkVUWEVOX0NBTV9SQU1fQkFTRSArIChyZWcpKQorI2RlZmluZSBORVRYRU5fRldfVkVSU0lPTl9NQUpPUiAoTkVUWEVOX0NBTV9SQU0oMHgxNTApKQorI2RlZmluZSBORVRYRU5fRldfVkVSU0lPTl9NSU5PUiAoTkVUWEVOX0NBTV9SQU0oMHgxNTQpKQorI2RlZmluZSBORVRYRU5fRldfVkVSU0lPTl9TVUIJKE5FVFhFTl9DQU1fUkFNKDB4MTU4KSkKKyNkZWZpbmUgTkVUWEVOX1JPTV9MT0NLX0lECShORVRYRU5fQ0FNX1JBTSgweDEwMCkpCisKKyNkZWZpbmUgTkVUWEVOX1BIWV9MT0NLX0lECShORVRYRU5fQ0FNX1JBTSgweDEyMCkpCisKKy8qIExvY2sgSURzIGZvciBQSFkgbG9jayAqLworI2RlZmluZSBQSFlfTE9DS19EUklWRVIJCTB4NDQ1MjQ5NTYKKworLyogVXNlZCBmb3IgUFMgUENJIE1lbW9yeSBhY2Nlc3MgKi8KKyNkZWZpbmUgUENJWF9QU19PUF9BRERSX0xPCSgweDEwMDAwKQorLyogICB2aWEgQ1JCICAoUFMgc2lkZSBvbmx5KSAgICAgKi8KKyNkZWZpbmUgUENJWF9QU19PUF9BRERSX0hJCSgweDEwMDA0KQorCisjZGVmaW5lIFBDSVhfSU5UX1ZFQ1RPUgkJKDB4MTAxMDApCisjZGVmaW5lIFBDSVhfSU5UX01BU0sJCSgweDEwMTA0KQorCisjZGVmaW5lIFBDSVhfTU5fV0lORE9XCQkoMHgxMDIwMCkKKyNkZWZpbmUgUENJWF9NU19XSU5ET1cJCSgweDEwMjA0KQorI2RlZmluZSBQQ0lYX1NOX1dJTkRPVwkJKDB4MTAyMDgpCisjZGVmaW5lIFBDSVhfQ1JCX1dJTkRPVwkJKDB4MTAyMTApCisKKyNkZWZpbmUgUENJWF9UQVJHRVRfU1RBVFVTCSgweDEwMTE4KQorI2RlZmluZSBQQ0lYX1RBUkdFVF9NQVNLCSgweDEwMTI4KQorCisjZGVmaW5lIFBDSVhfTVNJX0YwCQkoMHgxMzAwMCkKKworI2RlZmluZSBQQ0lYX1BTX01FTV9TUEFDRQkoMHg5MDAwMCkKKworI2RlZmluZSBORVRYRU5fUENJWF9QSF9SRUcocmVnKQkoTkVUWEVOX0NSQl9QQ0lFICsgKHJlZykpCisjZGVmaW5lIE5FVFhFTl9QQ0lYX1BTX1JFRyhyZWcpCShORVRYRU5fQ1JCX1BDSVhfTUQgKyAocmVnKSkKKworI2RlZmluZSBORVRYRU5fUENJRV9SRUcocmVnKQkoTkVUWEVOX0NSQl9QQ0lFICsgKHJlZykpCisKKyNkZWZpbmUgUENJRV9NQVhfRE1BX1hGRVJfU0laRQkoMHgxNDA0YykKKworI2RlZmluZSBQQ0lFX0RDUgkJMHgwMGQ4CisKKyNkZWZpbmUgUENJRV9TRU0yX0xPQ0sJCSgweDFjMDEwKQkvKiBGbGFzaCBsb2NrICAgKi8KKyNkZWZpbmUgUENJRV9TRU0yX1VOTE9DSwkoMHgxYzAxNCkJLyogRmxhc2ggdW5sb2NrICovCisjZGVmaW5lIFBDSUVfU0VNM19MT0NLCSAgCSgweDFjMDE4KQkvKiBQaHkgbG9jayAgICAgKi8KKyNkZWZpbmUgUENJRV9TRU0zX1VOTE9DSwkoMHgxYzAxYykJLyogUGh5IHVubG9jayAgICovCisKKyNkZWZpbmUgUENJRV9UR1RfU1BMSVRfQ0hJQ0tFTgkoMHgxMjA4MCkKKworI2RlZmluZSBQQ0lFX01BWF9NQVNURVJfU1BMSVQJKDB4MTQwNDgpCisKKyNlbmRpZgkJCQkvKiBfX05FVFhFTl9OSUNfSERSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ3YjYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYwpAQCAtMCwwICsxLDEyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2IE5ldFhlbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgICBpbmZvQG5ldHhlbi5jb20KKyAqIE5ldFhlbiwKKyAqIDM5NjUgRnJlZWRvbSBDaXJjbGUsIEZvdXJ0aCBmbG9vciwKKyAqIFNhbnRhIENsYXJhLCBDQSA5NTA1NAorICoKKyAqCisgKiBTb3VyY2UgZmlsZSBmb3IgTklDIHJvdXRpbmVzIHRvIGFjY2VzcyB0aGUgUGhhbnRvbSBoYXJkd2FyZQorICoKKyAqLworCisjaW5jbHVkZSAibmV0eGVuX25pYy5oIgorI2luY2x1ZGUgIm5ldHhlbl9uaWNfaHcuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX3BoYW5fcmVnLmgiCisKKy8qICBQQ0kgV2luZG93aW5nIGZvciBERFIgcmVnaW9ucy4gICovCisKKyNkZWZpbmUgQUREUl9JTl9SQU5HRShhZGRyLCBsb3csIGhpZ2gpCVwKKwkoKChhZGRyKSA8PSAoaGlnaCkpICYmICgoYWRkcikgPj0gKGxvdykpKQorCisjZGVmaW5lIE5FVFhFTl9GTEFTSF9CQVNFCShCT09UTERfU1RBUlQpCisjZGVmaW5lIE5FVFhFTl9QSEFOVE9NX01FTV9CQVNFCShORVRYRU5fRkxBU0hfQkFTRSkKKyNkZWZpbmUgTkVUWEVOX01BWF9NVFUJCTgwMDAgKyBORVRYRU5fRU5FVF9IRUFERVJfU0laRSArIE5FVFhFTl9FVEhfRkNTX1NJWkUKKyNkZWZpbmUgTkVUWEVOX01JTl9NVFUJCTY0CisjZGVmaW5lIE5FVFhFTl9FVEhfRkNTX1NJWkUgICAgIDQKKyNkZWZpbmUgTkVUWEVOX0VORVRfSEVBREVSX1NJWkUgMTQKKyNkZWZpbmUgTkVUWEVOX1dJTkRPV19PTkUgCTB4MjAwMDAwMAkvKkNSQiBXaW5kb3c6IGJpdCAyNSBvZiBDUkIgYWRkcmVzcyAqLworI2RlZmluZSBORVRYRU5fRklSTVdBUkVfTEVOIAkoKDE2ICogMTAyNCkgLyA0KQorI2RlZmluZSBORVRYRU5fTklVX0hEUlNJWkUJKDB4MSA8PCA2KQorI2RlZmluZSBORVRYRU5fTklVX1RMUlNJWkUJKDB4MSA8PCA1KQorCisjZGVmaW5lIGxvd2VyMzIoeCkJCSgodTMyKSgoeCkgJiAweGZmZmZmZmZmKSkKKyNkZWZpbmUgdXBwZXIzMih4KQkJCVwKKwkoKHUzMikoKCh1bnNpZ25lZCBsb25nIGxvbmcpKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKQorCisjZGVmaW5lIE5FVFhFTl9OSUNfWkVST19QQVVTRV9BRERSICAgICAwVUxMCisjZGVmaW5lIE5FVFhFTl9OSUNfVU5JVF9QQVVTRV9BRERSICAgICAweDIwMFVMTAorI2RlZmluZSBORVRYRU5fTklDX0VQR19QQVVTRV9BRERSMSAgICAgMHgyMjAwMDEwMDAwYzI4MDAxVUxMCisjZGVmaW5lIE5FVFhFTl9OSUNfRVBHX1BBVVNFX0FERFIyICAgICAweDAxMDAwODg4NjY1NTQ0MzNVTEwKKworI2RlZmluZSBORVRYRU5fTklDX1dJTkRPV19NQVJHSU4gMHgxMDAwMDAKKwordW5zaWduZWQgbG9uZyBuZXR4ZW5fbmljX3BjaV9zZXRfd2luZG93KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJdW5zaWduZWQgbG9uZyBsb25nIGFkZHIpOwordm9pZCBuZXR4ZW5fZnJlZV9od19yZXNvdXJjZXMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKKworaW50IG5ldHhlbl9uaWNfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJRFBSSU5USyhJTkZPLCAidmFsaWQgZXRoZXIgYWRkclxuIik7CisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCisJaWYgKGFkYXB0ZXItPm1hY2FkZHJfc2V0KQorCQlhZGFwdGVyLT5tYWNhZGRyX3NldChwb3J0LCBhZGRyLT5zYV9kYXRhKTsKKworCXJldHVybiAwOworfQorCisvKgorICogbmV0eGVuX25pY19zZXRfbXVsdGkgLSBNdWx0aWNhc3QKKyAqLwordm9pZCBuZXR4ZW5fbmljX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKKwlfX2xlMzIgbmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSA9IDA7CisKKwltY19wdHIgPSBuZXRkZXYtPm1jX2xpc3Q7CisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlpZiAoYWRhcHRlci0+c2V0X3Byb21pc2MpCisJCQlhZGFwdGVyLT5zZXRfcHJvbWlzYyhhZGFwdGVyLAorCQkJCQkgICAgIHBvcnQtPnBvcnRudW0sCisJCQkJCSAgICAgTkVUWEVOX05JVV9QUk9NSVNDX01PREUpOworCX0gZWxzZSB7CisJCWlmIChhZGFwdGVyLT51bnNldF9wcm9taXNjICYmCisJCSAgICBhZGFwdGVyLT5haHcuYm9hcmRjZmcuYm9hcmRfdHlwZQorCQkgICAgIT0gTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSU1FWikKKwkJCWFkYXB0ZXItPnVuc2V0X3Byb21pc2MoYWRhcHRlciwKKwkJCQkJICAgICAgIHBvcnQtPnBvcnRudW0sCisJCQkJCSAgICAgICBORVRYRU5fTklVX05PTl9QUk9NSVNDX01PREUpOworCX0KKwlpZiAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPT0gTkVUWEVOX05JQ19YR0JFKSB7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9tb2RlX3NlbGVjdChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAzKTsKKwkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wwKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDApOworCQluZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDEobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwgMHgwMCk7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9pZF9wb29sMihuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAwKTsKKwkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wzKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDApOworCQluZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQwKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEpOworCQluZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQxKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEpOworCQluZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQyKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEpOworCQluZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQzKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEpOworCX0gZWxzZSB7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9tb2RlX3NlbGVjdChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAwKTsKKwkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wwKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDApOworCQluZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDEobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwgMHgwMSk7CisJCW5ldHhlbl9uaWNfbWNyX3NldF9pZF9wb29sMihuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAyKTsKKwkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wzKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDMpOworCX0KKwl3cml0ZWwobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwKKwkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgTkVUWEVOX01BQ19BRERSX0NOVExfUkVHKSk7CisJaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfWEdCRSkgeworCQl3cml0ZWwobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwKKwkJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsCisJCQkJCSAgICBORVRYRU5fTVVMVElDQVNUX0FERFJfSElfMCkpOworCX0gZWxzZSB7CisJCXdyaXRlbChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLAorCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9NVUxUSUNBU1RfQUREUl9ISV8xKSk7CisJfQorCW5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEgPSAwOworCXdyaXRlbChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLAorCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fTklVX0dCX0RST1BfV1JPTkdBRERSKSk7Cit9CisKKy8qCisgKiBuZXR4ZW5fbmljX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdAorICogQHJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK2ludCBuZXR4ZW5fbmljX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG10dSkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJaW50IGVmZl9tdHUgPSBtdHUgKyBORVRYRU5fRU5FVF9IRUFERVJfU0laRSArIE5FVFhFTl9FVEhfRkNTX1NJWkU7CisKKwlpZiAoKGVmZl9tdHUgPiBORVRYRU5fTUFYX01UVSkgfHwgKGVmZl9tdHUgPCBORVRYRU5fTUlOX01UVSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgJWQgaXMgbm90IHN1cHBvcnRlZC5cbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBuZXRkZXYtPm5hbWUsIG10dSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhZGFwdGVyLT5zZXRfbXR1KQorCQlhZGFwdGVyLT5zZXRfbXR1KHBvcnQsIG10dSk7CisJbmV0ZGV2LT5tdHUgPSBtdHU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNoZWNrIGlmIHRoZSBmaXJtd2FyZSBoYXMgYmVlbiBkb3dubG9hZGVkIGFuZCByZWFkeSB0byBydW4gIGFuZAorICogc2V0dXAgdGhlIGFkZHJlc3MgZm9yIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgYWRhcHRlcgorICovCitpbnQgbmV0eGVuX25pY19od19yZXNvdXJjZXMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXR4ZW5faGFyZHdhcmVfY29udGV4dCAqaHcgPSAmYWRhcHRlci0+YWh3OworCXUzMiBzdGF0ZSA9IDA7CisJdm9pZCAqYWRkcjsKKwlpbnQgbG9vcHMgPSAwLCBlcnIgPSAwOworCWludCBjdHgsIHJpbmc7CisJdTMyIGNhcmRfY21kcmluZyA9IDA7CisJc3RydWN0IG5ldHhlbl9yZWN2X2NvbnRleHQgKnJlY3ZfY3R4OworCXN0cnVjdCBuZXR4ZW5fcmN2X2Rlc2NfY3R4ICpyY3ZfZGVzYzsKKworCURQUklOVEsoSU5GTywgImNyYl9iYXNlOiAlbHggJXgiLCBORVRYRU5fUENJX0NSQlNQQUNFLAorCQlQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLCBORVRYRU5fUENJX0NSQlNQQUNFKSk7CisJRFBSSU5USyhJTkZPLCAiY2FtIGJhc2U6ICVseCAleCIsIE5FVFhFTl9DUkJfQ0FNLAorCQlwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgTkVUWEVOX0NSQl9DQU0pKTsKKwlEUFJJTlRLKElORk8sICJjYW0gUkFNOiAlbHggJXgiLCBORVRYRU5fQ0FNX1JBTV9CQVNFLAorCQlwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgTkVUWEVOX0NBTV9SQU1fQkFTRSkpOworCisJLyogV2luZG93IDEgY2FsbCAqLworCWNhcmRfY21kcmluZyA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DTURQRUdfQ01EUklORykpOworCisJRFBSSU5USyhJTkZPLCAiQ29tbWFuZCBQZWcgc2VuZHMgMHgleCBmb3IgY21kcmluZyBiYXNlXG4iLAorCQljYXJkX2NtZHJpbmcpOworCisJZm9yIChjdHggPSAwOyBjdHggPCBNQVhfUkNWX0NUWDsgKytjdHgpIHsKKwkJRFBSSU5USyhJTkZPLCAiQ29tbWFuZCBQZWcgcmVhZHkuLndhaXRpbmcgZm9yIHJjdiBwZWdcbiIpOworCQlsb29wcyA9IDA7CisJCXN0YXRlID0gMDsKKwkJLyogV2luZG93IDEgY2FsbCAqLworCQlzdGF0ZSA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsCisJCQkJCQkgICByZWN2X2NyYl9yZWdpc3RlcnNbY3R4XS4KKwkJCQkJCSAgIGNyYl9yY3ZwZWdfc3RhdGUpKTsKKwkJd2hpbGUgKHN0YXRlICE9IFBIQU5fUEVHX1JDVl9JTklUSUFMSVpFRCAmJiBsb29wcyA8IDIwKSB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCS8qIFdpbmRvdyAxIGNhbGwgKi8KKwkJCXN0YXRlID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJCQkgICByZWN2X2NyYl9yZWdpc3RlcnMKKwkJCQkJCQkgICBbY3R4XS4KKwkJCQkJCQkgICBjcmJfcmN2cGVnX3N0YXRlKSk7CisJCQlsb29wcysrOworCQl9CisJCWlmIChsb29wcyA+PSAyMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJSY3YgUGVnIGluaXRpYWxpemF0aW9uIG5vdCBjb21wbGV0ZToiCisJCQkgICAgICAgIiV4LlxuIiwgc3RhdGUpOworCQkJZXJyID0gLUVJTzsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJRFBSSU5USyhJTkZPLCAiUmVjaWV2ZSBQZWcgcmVhZHkgdG9vLiBzdGFydGluZyBzdHVmZlxuIik7CisKKwlhZGRyID0gbmV0eGVuX2FsbG9jKGFkYXB0ZXItPmFody5wZGV2LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgbmV0eGVuX3JpbmdfY3R4KSArCisJCQkgICAgc2l6ZW9mKHVpbnQzMl90KSwKKwkJCSAgICAoZG1hX2FkZHJfdCAqKSAmIGFkYXB0ZXItPmN0eF9kZXNjX3BoeXNfYWRkciwKKwkJCSAgICAmYWRhcHRlci0+Y3R4X2Rlc2NfcGRldik7CisKKwlwcmludGsoImN0eF9kZXNjX3BoeXNfYWRkcjogMHglbGx4XG4iLAorCSAgICAgICAodTY0KSBhZGFwdGVyLT5jdHhfZGVzY19waHlzX2FkZHIpOworCWlmIChhZGRyID09IE5VTEwpIHsKKwkJRFBSSU5USyhFUlIsICJiYWQgcmV0dXJuIGZyb20gcGNpX2FsbG9jX2NvbnNpc3RlbnRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlyZXR1cm4gZXJyOworCX0KKwltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fcmluZ19jdHgpKTsKKwlhZGFwdGVyLT5jdHhfZGVzYyA9IChzdHJ1Y3QgbmV0eGVuX3JpbmdfY3R4ICopYWRkcjsKKwlhZGFwdGVyLT5jdHhfZGVzYy0+Y21kX2NvbnN1bWVyX29mZnNldCA9IGFkYXB0ZXItPmN0eF9kZXNjX3BoeXNfYWRkcgorCSAgICArIHNpemVvZihzdHJ1Y3QgbmV0eGVuX3JpbmdfY3R4KTsKKwlhZGFwdGVyLT5jbWRfY29uc3VtZXIgPSAodWludDMyX3QgKikgKCgoY2hhciAqKWFkZHIpICsKKwkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fcmluZ19jdHgpKTsKKworCWFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5haHcucGRldiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBjbWRfZGVzY190eXBlMCkgKgorCQkJCSAgICBhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudCwKKwkJCQkgICAgKGRtYV9hZGRyX3QgKikgJiBody0+Y21kX2Rlc2NfcGh5c19hZGRyKTsKKwlwcmludGsoImNtZF9kZXNjX3BoeXNfYWRkcjogMHglbGx4XG4iLCAodTY0KSBody0+Y21kX2Rlc2NfcGh5c19hZGRyKTsKKworCWlmIChhZGRyID09IE5VTEwpIHsKKwkJRFBSSU5USyhFUlIsICJiYWQgcmV0dXJuIGZyb20gcGNpX2FsbG9jX2NvbnNpc3RlbnRcbiIpOworCQluZXR4ZW5fZnJlZV9od19yZXNvdXJjZXMoYWRhcHRlcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFkYXB0ZXItPmN0eF9kZXNjLT5jbWRfcmluZ19hZGRyX2xvID0KKwkgICAgaHctPmNtZF9kZXNjX3BoeXNfYWRkciAmIDB4ZmZmZmZmZmZVTDsKKwlhZGFwdGVyLT5jdHhfZGVzYy0+Y21kX3JpbmdfYWRkcl9oaSA9CisJICAgICgodTY0KSBody0+Y21kX2Rlc2NfcGh5c19hZGRyID4+IDMyKTsKKwlhZGFwdGVyLT5jdHhfZGVzYy0+Y21kX3Jpbmdfc2l6ZSA9IGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50OworCisJaHctPmNtZF9kZXNjX2hlYWQgPSAoc3RydWN0IGNtZF9kZXNjX3R5cGUwICopYWRkcjsKKworCWZvciAoY3R4ID0gMDsgY3R4IDwgTUFYX1JDVl9DVFg7ICsrY3R4KSB7CisJCXJlY3ZfY3R4ID0gJmFkYXB0ZXItPnJlY3ZfY3R4W2N0eF07CisKKwkJZm9yIChyaW5nID0gMDsgcmluZyA8IE5VTV9SQ1ZfREVTQ19SSU5HUzsgcmluZysrKSB7CisJCQlyY3ZfZGVzYyA9ICZyZWN2X2N0eC0+cmN2X2Rlc2NbcmluZ107CisJCQlhZGRyID0gbmV0eGVuX2FsbG9jKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkgICAgUkNWX0RFU0NfUklOR1NJWkUsCisJCQkJCSAgICAmcmN2X2Rlc2MtPnBoeXNfYWRkciwKKwkJCQkJICAgICZyY3ZfZGVzYy0+cGh5c19wZGV2KTsKKwkJCWlmIChhZGRyID09IE5VTEwpIHsKKwkJCQlEUFJJTlRLKEVSUiwgImJhZCByZXR1cm4gZnJvbSAiCisJCQkJCSJwY2lfYWxsb2NfY29uc2lzdGVudFxuIik7CisJCQkJbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCXJjdl9kZXNjLT5kZXNjX2hlYWQgPSAoc3RydWN0IHJjdl9kZXNjICopYWRkcjsKKwkJCWFkYXB0ZXItPmN0eF9kZXNjLT5yY3ZfY3R4W3JpbmddLnJjdl9yaW5nX2FkZHJfbG8gPQorCQkJICAgIHJjdl9kZXNjLT5waHlzX2FkZHIgJiAweGZmZmZmZmZmVUw7CisJCQlhZGFwdGVyLT5jdHhfZGVzYy0+cmN2X2N0eFtyaW5nXS5yY3ZfcmluZ19hZGRyX2hpID0KKwkJCSAgICAoKHU2NCkgcmN2X2Rlc2MtPnBoeXNfYWRkciA+PiAzMik7CisJCQlhZGFwdGVyLT5jdHhfZGVzYy0+cmN2X2N0eFtyaW5nXS5yY3ZfcmluZ19zaXplID0KKwkJCSAgICByY3ZfZGVzYy0+bWF4X3J4X2Rlc2NfY291bnQ7CisJCX0KKworCQlhZGRyID0gbmV0eGVuX2FsbG9jKGFkYXB0ZXItPmFody5wZGV2LCBTVEFUVVNfREVTQ19SSU5HU0laRSwKKwkJCQkgICAgJnJlY3ZfY3R4LT5yY3Zfc3RhdHVzX2Rlc2NfcGh5c19hZGRyLAorCQkJCSAgICAmcmVjdl9jdHgtPnJjdl9zdGF0dXNfZGVzY19wZGV2KTsKKwkJaWYgKGFkZHIgPT0gTlVMTCkgeworCQkJRFBSSU5USyhFUlIsICJiYWQgcmV0dXJuIGZyb20iCisJCQkJIiBwY2lfYWxsb2NfY29uc2lzdGVudFxuIik7CisJCQluZXR4ZW5fZnJlZV9od19yZXNvdXJjZXMoYWRhcHRlcik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlyZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX2hlYWQgPSAoc3RydWN0IHN0YXR1c19kZXNjICopYWRkcjsKKwkJYWRhcHRlci0+Y3R4X2Rlc2MtPnN0c19yaW5nX2FkZHJfbG8gPQorCQkgICAgcmVjdl9jdHgtPnJjdl9zdGF0dXNfZGVzY19waHlzX2FkZHIgJiAweGZmZmZmZmZmVUw7CisJCWFkYXB0ZXItPmN0eF9kZXNjLT5zdHNfcmluZ19hZGRyX2hpID0KKwkJICAgICgodTY0KSByZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX3BoeXNfYWRkciA+PiAzMik7CisJCWFkYXB0ZXItPmN0eF9kZXNjLT5zdHNfcmluZ19zaXplID0gYWRhcHRlci0+bWF4X3J4X2Rlc2NfY291bnQ7CisKKwl9CisJLyogV2luZG93ID0gMSAqLworCisJd3JpdGVsKGxvd2VyMzIoYWRhcHRlci0+Y3R4X2Rlc2NfcGh5c19hZGRyKSwKKwkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NUWF9BRERSX1JFR19MTykpOworCXdyaXRlbCh1cHBlcjMyKGFkYXB0ZXItPmN0eF9kZXNjX3BoeXNfYWRkciksCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DVFhfQUREUl9SRUdfSEkpKTsKKwl3cml0ZWwoTkVUWEVOX0NUWF9TSUdOQVRVUkUsCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DVFhfU0lHTkFUVVJFX1JFRykpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0eGVuX3JlY3ZfY29udGV4dCAqcmVjdl9jdHg7CisJc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jdHggKnJjdl9kZXNjOworCWludCBjdHgsIHJpbmc7CisKKwlpZiAoYWRhcHRlci0+Y3R4X2Rlc2MgIT0gTlVMTCkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPmN0eF9kZXNjX3BkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgbmV0eGVuX3JpbmdfY3R4KSArCisJCQkJICAgIHNpemVvZih1aW50MzJfdCksCisJCQkJICAgIGFkYXB0ZXItPmN0eF9kZXNjLAorCQkJCSAgICBhZGFwdGVyLT5jdHhfZGVzY19waHlzX2FkZHIpOworCQlhZGFwdGVyLT5jdHhfZGVzYyA9IE5VTEw7CisJfQorCisJaWYgKGFkYXB0ZXItPmFody5jbWRfZGVzY19oZWFkICE9IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5haHcuY21kX2Rlc2NfcGRldiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBjbWRfZGVzY190eXBlMCkgKgorCQkJCSAgICBhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudCwKKwkJCQkgICAgYWRhcHRlci0+YWh3LmNtZF9kZXNjX2hlYWQsCisJCQkJICAgIGFkYXB0ZXItPmFody5jbWRfZGVzY19waHlzX2FkZHIpOworCQlhZGFwdGVyLT5haHcuY21kX2Rlc2NfaGVhZCA9IE5VTEw7CisJfQorCS8qIFNwZWNpYWwgaGFuZGxpbmc6IHRoZXJlIGFyZSAyIHBvcnRzIG9uIHRoaXMgYm9hcmQgKi8KKwlpZiAoYWRhcHRlci0+YWh3LmJvYXJkY2ZnLmJvYXJkX3R5cGUgPT0gTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSU1FWikgeworCQlhZGFwdGVyLT5haHcubWF4X3BvcnRzID0gMjsKKwl9CisKKwlmb3IgKGN0eCA9IDA7IGN0eCA8IE1BWF9SQ1ZfQ1RYOyArK2N0eCkgeworCQlyZWN2X2N0eCA9ICZhZGFwdGVyLT5yZWN2X2N0eFtjdHhdOworCQlmb3IgKHJpbmcgPSAwOyByaW5nIDwgTlVNX1JDVl9ERVNDX1JJTkdTOyByaW5nKyspIHsKKwkJCXJjdl9kZXNjID0gJnJlY3ZfY3R4LT5yY3ZfZGVzY1tyaW5nXTsKKworCQkJaWYgKHJjdl9kZXNjLT5kZXNjX2hlYWQgIT0gTlVMTCkgeworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocmN2X2Rlc2MtPnBoeXNfcGRldiwKKwkJCQkJCSAgICBSQ1ZfREVTQ19SSU5HU0laRSwKKwkJCQkJCSAgICByY3ZfZGVzYy0+ZGVzY19oZWFkLAorCQkJCQkJICAgIHJjdl9kZXNjLT5waHlzX2FkZHIpOworCQkJCXJjdl9kZXNjLT5kZXNjX2hlYWQgPSBOVUxMOworCQkJfQorCQl9CisKKwkJaWYgKHJlY3ZfY3R4LT5yY3Zfc3RhdHVzX2Rlc2NfaGVhZCAhPSBOVUxMKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHJlY3ZfY3R4LT5yY3Zfc3RhdHVzX2Rlc2NfcGRldiwKKwkJCQkJICAgIFNUQVRVU19ERVNDX1JJTkdTSVpFLAorCQkJCQkgICAgcmVjdl9jdHgtPnJjdl9zdGF0dXNfZGVzY19oZWFkLAorCQkJCQkgICAgcmVjdl9jdHgtPgorCQkJCQkgICAgcmN2X3N0YXR1c19kZXNjX3BoeXNfYWRkcik7CisJCQlyZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX2hlYWQgPSBOVUxMOworCQl9CisJfQorfQorCit2b2lkIG5ldHhlbl90c29fY2hlY2soc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICBzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmRlc2MsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKGRlc2MtPm1zcykgeworCQlkZXNjLT50b3RhbF9oZHJfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKKwkJICAgICgoc2tiLT5uaC5pcGgpLT5paGwgKiBzaXplb2YodTMyKSkgKworCQkgICAgKChza2ItPmgudGgpLT5kb2ZmICogc2l6ZW9mKHUzMikpOworCQluZXR4ZW5fc2V0X2NtZF9kZXNjX29wY29kZShkZXNjLCBUWF9UQ1BfTFNPKTsKKwl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSB7CisJCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJCW5ldHhlbl9zZXRfY21kX2Rlc2Nfb3Bjb2RlKGRlc2MsIFRYX1RDUF9QS1QpOworCQl9IGVsc2UgaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkJbmV0eGVuX3NldF9jbWRfZGVzY19vcGNvZGUoZGVzYywgVFhfVURQX1BLVCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisJYWRhcHRlci0+c3RhdHMueG1pdGNzdW1tZWQrKzsKKwlkZXNjLT50Y3BfaGRyX29mZnNldCA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJbmV0eGVuX3NldF9jbWRfZGVzY190b3RhbGxlbmd0aChkZXNjLAorCQkJCQljcHVfdG9fbGUzMgorCQkJCQkobmV0eGVuX2dldF9jbWRfZGVzY190b3RhbGxlbmd0aAorCQkJCQkgKGRlc2MpKSk7CisJZGVzYy0+aXBfaGRyX29mZnNldCA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOworfQorCitpbnQgbmV0eGVuX2lzX2ZsYXNoX3N1cHBvcnRlZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJY29uc3QgaW50IGxvY3NbXSA9IHsgMCwgMHg0LCAweDEwMCwgMHg0MDAwLCAweDQxMjggfTsKKwlpbnQgYWRkciwgdmFsMDEsIHZhbDAyLCBpLCBqOworCisJLyogaWYgdGhlIGZsYXNoIHNpemUgbGVzcyB0aGFuIDRNYiwgbWFrZSBodWdlIHdhciBjcnkgYW5kIGRpZSAqLworCWZvciAoaiA9IDE7IGogPCA0OyBqKyspIHsKKwkJYWRkciA9IGogKiBORVRYRU5fTklDX1dJTkRPV19NQVJHSU47CisJCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKGxvY3MpIC8gc2l6ZW9mKGxvY3NbMF0pKTsgaSsrKSB7CisJCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgbG9jc1tpXSwgJnZhbDAxKSA9PSAwCisJCQkgICAgJiYgbmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgKGFkZHIgKyBsb2NzW2ldKSwKKwkJCQkJCSAgICAmdmFsMDIpID09IDApIHsKKwkJCQlpZiAodmFsMDEgPT0gdmFsMDIpCisJCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldHhlbl9nZXRfZmxhc2hfYmxvY2soc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYmFzZSwKKwkJCQkgIGludCBzaXplLCB1MzIgKiBidWYpCit7CisJaW50IGksIGFkZHI7CisJdTMyICpwdHIzMjsKKworCWFkZHIgPSBiYXNlOworCXB0cjMyID0gYnVmOworCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gc2l6ZW9mKHUzMik7IGkrKykgeworCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgYWRkciwgcHRyMzIpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlwdHIzMisrOworCQlhZGRyICs9IHNpemVvZih1MzIpOworCX0KKwlpZiAoKGNoYXIgKilidWYgKyBzaXplID4gKGNoYXIgKilwdHIzMikgeworCQl1MzIgbG9jYWw7CisKKwkJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIGFkZHIsICZsb2NhbCkgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJCW1lbWNweShwdHIzMiwgJmxvY2FsLCAoY2hhciAqKWJ1ZiArIHNpemUgLSAoY2hhciAqKXB0cjMyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldHhlbl9nZXRfZmxhc2hfbWFjX2FkZHIoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgbWFjW10pCit7CisJdTMyICpwbWFjID0gKHUzMiAqKSAmIG1hY1swXTsKKworCWlmIChuZXR4ZW5fZ2V0X2ZsYXNoX2Jsb2NrKGFkYXB0ZXIsCisJCQkJICAgVVNFUl9TVEFSVCArCisJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IG5ldHhlbl9uZXdfdXNlcl9pbmZvLAorCQkJCQkgICAgbWFjX2FkZHIpLAorCQkJCSAgIEZMQVNIX05VTV9QT1JUUyAqIHNpemVvZih1NjQpLCBwbWFjKSA9PSAtMSkgeworCQlyZXR1cm4gLTE7CisJfQorCWlmICgqbWFjID09IH4wVUxMKSB7CisJCWlmIChuZXR4ZW5fZ2V0X2ZsYXNoX2Jsb2NrKGFkYXB0ZXIsCisJCQkJCSAgIFVTRVJfU1RBUlRfT0xEICsKKwkJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IG5ldHhlbl91c2VyX29sZF9pbmZvLAorCQkJCQkJICAgIG1hY19hZGRyKSwKKwkJCQkJICAgRkxBU0hfTlVNX1BPUlRTICogc2l6ZW9mKHU2NCksCisJCQkJCSAgIHBtYWMpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlpZiAoKm1hYyA9PSB+MFVMTCkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGFuZ2VzIHRoZSBDUkIgd2luZG93IHRvIHRoZSBzcGVjaWZpZWQgd2luZG93LgorICovCit2b2lkIG5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgd25kdykKK3sKKwl2b2lkIF9faW9tZW0gKm9mZnNldDsKKwl1MzIgdG1wOworCWludCBjb3VudCA9IDA7CisKKwlpZiAoYWRhcHRlci0+Y3Vycl93aW5kb3cgPT0gd25kdykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBNb3ZlIHRoZSBDUkIgd2luZG93LgorCSAqIFdlIG5lZWQgdG8gd3JpdGUgdG8gdGhlICJkaXJlY3QgYWNjZXNzIiByZWdpb24gb2YgUENJCisJICogdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgd2luZG93IHJlZ2lzdGVyIGhhcworCSAqIG5vdCBiZWVuIHN1Y2Nlc3NmdWxseSB3cml0dGVuIGFjcm9zcyBDUkIgYmVmb3JlIHRoZSB0YXJnZXQKKwkgKiByZWdpc3RlciBhZGRyZXNzIGlzIHJlY2VpdmVkIGJ5IFBDSS4gVGhlIGRpcmVjdCByZWdpb24gYnlwYXNzZXMKKwkgKiB0aGUgQ1JCIGJ1cy4KKwkgKi8KKwlvZmZzZXQgPQorCSAgICBQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fUENJWF9QSF9SRUcoUENJWF9DUkJfV0lORE9XKSk7CisKKwlpZiAod25kdyAmIDB4MSkKKwkJd25kdyA9IE5FVFhFTl9XSU5ET1dfT05FOworCisJd3JpdGVsKHduZHcsIG9mZnNldCk7CisKKwkvKiBNVVNUIG1ha2Ugc3VyZSB3aW5kb3cgaXMgc2V0IGJlZm9yZSB3ZSBmb3JnZSBvbi4uLiAqLworCXdoaWxlICgodG1wID0gcmVhZGwob2Zmc2V0KSkgIT0gd25kdykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgV0FSTklORzogQ1JCIHdpbmRvdyB2YWx1ZSBub3QgIgorCQkgICAgICAgInJlZ2lzdGVyZWQgcHJvcGVybHk6IDB4JTA4eC5cbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBfX0ZVTkNUSU9OX18sIHRtcCk7CisJCW1kZWxheSgxKTsKKwkJaWYgKGNvdW50ID49IDEwKQorCQkJYnJlYWs7CisJCWNvdW50Kys7CisJfQorCisJYWRhcHRlci0+Y3Vycl93aW5kb3cgPSB3bmR3OworfQorCit2b2lkIG5ldHhlbl9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKwlsb25nIGRhdGEsIHNpemUgPSAwOworCWxvbmcgZmxhc2hhZGRyID0gTkVUWEVOX0ZMQVNIX0JBU0UsIG1lbWFkZHIgPSBORVRYRU5fUEhBTlRPTV9NRU1fQkFTRTsKKwl1NjQgb2ZmOworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCXNpemUgPSBORVRYRU5fRklSTVdBUkVfTEVOOworCXdyaXRlbCgxLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX0dMQl9DQVNfUlNUKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCBmbGFzaGFkZHIsIChpbnQgKikmZGF0YSkgIT0gMCkgeworCQkJRFBSSU5USyhFUlIsCisJCQkJIkVycm9yIGluIG5ldHhlbl9yb21fZmFzdF9yZWFkKCkuIFdpbGwgc2tpcCIKKwkJCQkibG9hZGluZyBmbGFzaCBpbWFnZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJb2ZmID0gbmV0eGVuX25pY19wY2lfc2V0X3dpbmRvdyhhZGFwdGVyLCBtZW1hZGRyKTsKKwkJYWRkciA9IHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBvZmYpOworCQl3cml0ZWwoZGF0YSwgYWRkcik7CisJCWZsYXNoYWRkciArPSA0OworCQltZW1hZGRyICs9IDQ7CisJfQorCXVkZWxheSgxMDApOworCS8qIG1ha2Ugc3VyZSBDYXNwZXIgaXMgcG93ZXJlZCBvbiAqLworCXdyaXRlbCgweDNmZmYsCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfR0xCX0NISVBfQ0xLX0NUUkwpKTsKKwl3cml0ZWwoMCwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9HTEJfQ0FTX1JTVCkpOworCisJdWRlbGF5KDEwMCk7Cit9CisKK2ludAorbmV0eGVuX25pY19od193cml0ZV93eChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBvZmYsIHZvaWQgKmRhdGEsCisJCSAgICAgICBpbnQgbGVuKQoreworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCWlmIChBRERSX0lOX1dJTkRPVzEob2ZmKSkgeworCQlhZGRyID0gTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgb2ZmKTsKKwl9IGVsc2UgewkJLyogV2luZG93IDAgKi8KKwkJYWRkciA9IHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBvZmYpOworCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDApOworCX0KKworCURQUklOVEsoSU5GTywgIndyaXRpbmcgdG8gYmFzZSAlbHggb2Zmc2V0ICVsbHggYWRkciAlcCIKKwkJIiBkYXRhICVsbHggbGVuICVkXG4iLAorCQlwY2lfYmFzZShhZGFwdGVyLCBvZmYpLCBvZmYsIGFkZHIsCisJCSoodW5zaWduZWQgbG9uZyBsb25nICopZGF0YSwgbGVuKTsKKwlpZiAoIWFkZHIpIHsKKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAxKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCXdyaXRlYigqKHU4ICopIGRhdGEsIGFkZHIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXdyaXRldygqKHUxNiAqKSBkYXRhLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl3cml0ZWwoKih1MzIgKikgZGF0YSwgYWRkcik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJd3JpdGVxKCoodTY0ICopIGRhdGEsIGFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUFJJTlRLKElORk8sCisJCQkid3JpdGluZyBkYXRhICVseCB0byBvZmZzZXQgJWxseCwgbnVtIHdvcmRzPSVkXG4iLAorCQkJKih1bnNpZ25lZCBsb25nICopZGF0YSwgb2ZmLCAobGVuID4+IDMpKTsKKworCQluZXR4ZW5fbmljX2h3X2Jsb2NrX3dyaXRlNjQoKHU2NCBfX2lvbWVtICopIGRhdGEsIGFkZHIsCisJCQkJCSAgICAobGVuID4+IDMpKTsKKwkJYnJlYWs7CisJfQorCWlmICghQUREUl9JTl9XSU5ET1cxKG9mZikpCisJCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CituZXR4ZW5fbmljX2h3X3JlYWRfd3goc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLCB2b2lkICpkYXRhLAorCQkgICAgICBpbnQgbGVuKQoreworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCWlmIChBRERSX0lOX1dJTkRPVzEob2ZmKSkgewkvKiBXaW5kb3cgMSAqLworCQlhZGRyID0gTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgb2ZmKTsKKwl9IGVsc2UgewkJLyogV2luZG93IDAgKi8KKwkJYWRkciA9IHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBvZmYpOworCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDApOworCX0KKworCURQUklOVEsoSU5GTywgInJlYWRpbmcgZnJvbSBiYXNlICVseCBvZmZzZXQgJWxseCBhZGRyICVwXG4iLAorCQlwY2lfYmFzZShhZGFwdGVyLCBvZmYpLCBvZmYsIGFkZHIpOworCWlmICghYWRkcikgeworCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDEpOworCQlyZXR1cm4gMTsKKwl9CisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCSoodTggKikgZGF0YSA9IHJlYWRiKGFkZHIpOworCQlicmVhazsKKwljYXNlIDI6CisJCSoodTE2ICopIGRhdGEgPSByZWFkdyhhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQkqKHUzMiAqKSBkYXRhID0gcmVhZGwoYWRkcik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJKih1NjQgKikgZGF0YSA9IHJlYWRxKGFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXR4ZW5fbmljX2h3X2Jsb2NrX3JlYWQ2NCgodTY0IF9faW9tZW0gKikgZGF0YSwgYWRkciwKKwkJCQkJICAgKGxlbiA+PiAzKSk7CisJCWJyZWFrOworCX0KKwlEUFJJTlRLKElORk8sICJyZWFkICVseFxuIiwgKih1bnNpZ25lZCBsb25nICopZGF0YSk7CisKKwlpZiAoIUFERFJfSU5fV0lORE9XMShvZmYpKQorCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmV0eGVuX25pY19yZWdfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLCB1MzIgdmFsKQorewkJCQkvKiBPbmx5IGZvciB3aW5kb3cgMSAqLworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCWFkZHIgPSBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBvZmYpOworCURQUklOVEsoSU5GTywgIndyaXRpbmcgdG8gYmFzZSAlbHggb2Zmc2V0ICVsbHggYWRkciAlcCBkYXRhICV4XG4iLAorCQlwY2lfYmFzZShhZGFwdGVyLCBvZmYpLCBvZmYsIGFkZHIsIHZhbCk7CisJd3JpdGVsKHZhbCwgYWRkcik7CisKK30KKworaW50IG5ldHhlbl9uaWNfcmVnX3JlYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmKQorewkJCQkvKiBPbmx5IGZvciB3aW5kb3cgMSAqLworCXZvaWQgX19pb21lbSAqYWRkcjsKKwlpbnQgdmFsOworCisJYWRkciA9IE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIG9mZik7CisJRFBSSU5USyhJTkZPLCAicmVhZGluZyBmcm9tIGJhc2UgJWx4IG9mZnNldCAlbGx4IGFkZHIgJXBcbiIsCisJCXBjaV9iYXNlKGFkYXB0ZXIsIG9mZiksIG9mZiwgYWRkcik7CisJdmFsID0gcmVhZGwoYWRkcik7CisJd3JpdGVsKHZhbCwgYWRkcik7CisKKwlyZXR1cm4gdmFsOworfQorCisvKiBDaGFuZ2UgdGhlIHdpbmRvdyB0byAwLCB3cml0ZSBhbmQgY2hhbmdlIGJhY2sgdG8gd2luZG93IDEuICovCit2b2lkIG5ldHhlbl9uaWNfd3JpdGVfdzAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgaW5kZXgsIHUzMiB2YWx1ZSkKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDApOworCWFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgaW5kZXgpOworCXdyaXRlbCh2YWx1ZSwgYWRkcik7CisJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAxKTsKK30KKworLyogQ2hhbmdlIHRoZSB3aW5kb3cgdG8gMCwgcmVhZCBhbmQgY2hhbmdlIGJhY2sgdG8gd2luZG93IDEuICovCit2b2lkIG5ldHhlbl9uaWNfcmVhZF93MChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBpbmRleCwgdTMyICogdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICphZGRyOworCisJYWRkciA9IHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBpbmRleCk7CisKKwluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDApOworCSp2YWx1ZSA9IHJlYWRsKGFkZHIpOworCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7Cit9CisKK2ludCBuZXR4ZW5fcGNpX3NldF93aW5kb3dfd2FybmluZ19jb3VudCA9IDA7CisKK3Vuc2lnbmVkIGxvbmcKK25ldHhlbl9uaWNfcGNpX3NldF93aW5kb3coc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJICB1bnNpZ25lZCBsb25nIGxvbmcgYWRkcikKK3sKKwlzdGF0aWMgaW50IGRkcl9tbl93aW5kb3cgPSAtMTsKKwlzdGF0aWMgaW50IHFkcl9zbl93aW5kb3cgPSAtMTsKKwlpbnQgd2luZG93OworCisJaWYgKEFERFJfSU5fUkFOR0UoYWRkciwgTkVUWEVOX0FERFJfRERSX05FVCwgTkVUWEVOX0FERFJfRERSX05FVF9NQVgpKSB7CisJCS8qIEREUiBuZXR3b3JrIHNpZGUgKi8KKwkJYWRkciAtPSBORVRYRU5fQUREUl9ERFJfTkVUOworCQl3aW5kb3cgPSAoYWRkciA+PiAyNSkgJiAweDNmZjsKKwkJaWYgKGRkcl9tbl93aW5kb3cgIT0gd2luZG93KSB7CisJCQlkZHJfbW5fd2luZG93ID0gd2luZG93OworCQkJd3JpdGVsKHdpbmRvdywgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJCQkgICAgICAgTkVUWEVOX1BDSVhfUEhfUkVHCisJCQkJCQkJICAgICAgIChQQ0lYX01OX1dJTkRPVykpKTsKKwkJCS8qIE1VU1QgbWFrZSBzdXJlIHdpbmRvdyBpcyBzZXQgYmVmb3JlIHdlIGZvcmdlIG9uLi4uICovCisJCQlyZWFkbChQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLAorCQkJCQkJICAgICAgTkVUWEVOX1BDSVhfUEhfUkVHCisJCQkJCQkgICAgICAoUENJWF9NTl9XSU5ET1cpKSk7CisJCX0KKwkJYWRkciAtPSAod2luZG93ICogTkVUWEVOX1dJTkRPV19PTkUpOworCQlhZGRyICs9IE5FVFhFTl9QQ0lfRERSX05FVDsKKwl9IGVsc2UgaWYgKEFERFJfSU5fUkFOR0UoYWRkciwgTkVUWEVOX0FERFJfT0NNMCwgTkVUWEVOX0FERFJfT0NNMF9NQVgpKSB7CisJCWFkZHIgLT0gTkVUWEVOX0FERFJfT0NNMDsKKwkJYWRkciArPSBORVRYRU5fUENJX09DTTA7CisJfSBlbHNlIGlmIChBRERSX0lOX1JBTkdFKGFkZHIsIE5FVFhFTl9BRERSX09DTTEsIE5FVFhFTl9BRERSX09DTTFfTUFYKSkgeworCQlhZGRyIC09IE5FVFhFTl9BRERSX09DTTE7CisJCWFkZHIgKz0gTkVUWEVOX1BDSV9PQ00xOworCX0gZWxzZQorCSAgICBpZiAoQUREUl9JTl9SQU5HRQorCQkoYWRkciwgTkVUWEVOX0FERFJfUURSX05FVCwgTkVUWEVOX0FERFJfUURSX05FVF9NQVgpKSB7CisJCS8qIFFEUiBuZXR3b3JrIHNpZGUgKi8KKwkJYWRkciAtPSBORVRYRU5fQUREUl9RRFJfTkVUOworCQl3aW5kb3cgPSAoYWRkciA+PiAyMikgJiAweDNmOworCQlpZiAocWRyX3NuX3dpbmRvdyAhPSB3aW5kb3cpIHsKKwkJCXFkcl9zbl93aW5kb3cgPSB3aW5kb3c7CisJCQl3cml0ZWwoKHdpbmRvdyA8PCAyMiksCisJCQkgICAgICAgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJCSAgICAgICBORVRYRU5fUENJWF9QSF9SRUcKKwkJCQkJCSAgICAgICAoUENJWF9TTl9XSU5ET1cpKSk7CisJCQkvKiBNVVNUIG1ha2Ugc3VyZSB3aW5kb3cgaXMgc2V0IGJlZm9yZSB3ZSBmb3JnZSBvbi4uLiAqLworCQkJcmVhZGwoUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJCSAgICAgIE5FVFhFTl9QQ0lYX1BIX1JFRworCQkJCQkJICAgICAgKFBDSVhfU05fV0lORE9XKSkpOworCQl9CisJCWFkZHIgLT0gKHdpbmRvdyAqIDB4NDAwMDAwKTsKKwkJYWRkciArPSBORVRYRU5fUENJX1FEUl9ORVQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogcGVnIGdkYiBmcmVxdWVudGx5IGFjY2Vzc2VzIG1lbW9yeSB0aGF0IGRvZXNuJ3QgZXhpc3QsCisJCSAqIHRoaXMgbGltaXRzIHRoZSBjaGl0IGNoYXQgc28gZGVidWdnaW5nIGlzbid0IHNsb3dlZCBkb3duLgorCQkgKi8KKwkJaWYgKChuZXR4ZW5fcGNpX3NldF93aW5kb3dfd2FybmluZ19jb3VudCsrIDwgOCkKKwkJICAgIHx8IChuZXR4ZW5fcGNpX3NldF93aW5kb3dfd2FybmluZ19jb3VudCAlIDY0ID09IDApKQorCQkJcHJpbnRrKCIlczogV2FybmluZzpuZXR4ZW5fbmljX3BjaV9zZXRfd2luZG93KCkiCisJCQkgICAgICAgIiBVbmtub3duIGFkZHJlc3MgcmFuZ2UhXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCisJfQorCXJldHVybiBhZGRyOworfQorCitpbnQgbmV0eGVuX25pY19nZXRfYm9hcmRfaW5mbyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJ2ID0gMDsKKwlpbnQgYWRkciA9IEJSRENGR19TVEFSVDsKKwlzdHJ1Y3QgbmV0eGVuX2JvYXJkX2luZm8gKmJvYXJkaW5mbzsKKwlpbnQgaW5kZXg7CisJdTMyICpwdHIzMjsKKworCWJvYXJkaW5mbyA9ICZhZGFwdGVyLT5haHcuYm9hcmRjZmc7CisJcHRyMzIgPSAodTMyICopIGJvYXJkaW5mbzsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNpemVvZihzdHJ1Y3QgbmV0eGVuX2JvYXJkX2luZm8pIC8gc2l6ZW9mKHUzMik7CisJICAgICBpbmRleCsrKSB7CisJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCBhZGRyLCBwdHIzMikgPT0gLTEpIHsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXB0cjMyKys7CisJCWFkZHIgKz0gc2l6ZW9mKHUzMik7CisJfQorCWlmIChib2FyZGluZm8tPm1hZ2ljICE9IE5FVFhFTl9CRElORk9fTUFHSUMpIHsKKwkJcHJpbnRrKCIlczogRVJST1IgcmVhZGluZyAlcyBib2FyZCBjb25maWcuIgorCQkgICAgICAgIiBSZWFkICV4LCBleHBlY3RlZCAleFxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCSAgICAgICBib2FyZGluZm8tPm1hZ2ljLCBORVRYRU5fQkRJTkZPX01BR0lDKTsKKwkJcnYgPSAtMTsKKwl9CisJaWYgKGJvYXJkaW5mby0+aGVhZGVyX3ZlcnNpb24gIT0gTkVUWEVOX0JESU5GT19WRVJTSU9OKSB7CisJCXByaW50aygiJXM6IFVua25vd24gYm9hcmQgY29uZmlnIHZlcnNpb24uIgorCQkgICAgICAgIiBSZWFkICV4LCBleHBlY3RlZCAleFxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkJICAgICAgIGJvYXJkaW5mby0+aGVhZGVyX3ZlcnNpb24sIE5FVFhFTl9CRElORk9fVkVSU0lPTik7CisJCXJ2ID0gLTE7CisJfQorCisJRFBSSU5USyhJTkZPLCAiRGlzY292ZXJlZCBib2FyZCB0eXBlOjB4JXggICIsIGJvYXJkaW5mby0+Ym9hcmRfdHlwZSk7CisJc3dpdGNoICgobmV0eGVuX2JyZHR5cGVfdCkgYm9hcmRpbmZvLT5ib2FyZF90eXBlKSB7CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjM1XzRHOgorCQlhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9IE5FVFhFTl9OSUNfR0JFOworCQlicmVhazsKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHOgorCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSU1FWjoKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0hNRVo6CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19DWDQ6CisJCWFkYXB0ZXItPmFody5ib2FyZF90eXBlID0gTkVUWEVOX05JQ19YR0JFOworCQlicmVhazsKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AxX0JEOgorCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDFfU0I6CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMV9TTUFYOgorCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDFfU09DSzoKKwkJYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPSBORVRYRU5fTklDX0dCRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCIlczogVW5rbm93bigleClcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCSAgICAgICBib2FyZGluZm8tPmJvYXJkX3R5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qIE5JVSBhY2Nlc3Mgc2VjdGlvbnMgKi8KKworaW50IG5ldHhlbl9uaWNfc2V0X210dV9nYihzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAorCQkJICAgIE5FVFhFTl9OSVVfR0JfTUFYX0ZSQU1FX1NJWkUocG9ydC0+cG9ydG51bSksCisJCQkgICAgbmV3X210dSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXR4ZW5fbmljX3NldF9tdHVfeGdiKHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwluZXdfbXR1ICs9IE5FVFhFTl9OSVVfSERSU0laRSArIE5FVFhFTl9OSVVfVExSU0laRTsKKwluZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX01BWF9GUkFNRV9TSVpFLCBuZXdfbXR1KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZXR4ZW5fbmljX2luaXRfbml1X2diKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcG9ydG5vOworCWZvciAocG9ydG5vID0gMDsgcG9ydG5vIDwgTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTOyBwb3J0bm8rKykKKwkJbmV0eGVuX25pdV9nYmVfaW5pdF9wb3J0KGFkYXB0ZXIsIHBvcnRubyk7Cit9CisKK3ZvaWQgbmV0eGVuX25pY19zdG9wX2FsbF9wb3J0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHBvcnRfbnI7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0OworCisJZm9yIChwb3J0X25yID0gMDsgcG9ydF9uciA8IGFkYXB0ZXItPmFody5tYXhfcG9ydHM7IHBvcnRfbnIrKykgeworCQlwb3J0ID0gYWRhcHRlci0+cG9ydFtwb3J0X25yXTsKKwkJaWYgKGFkYXB0ZXItPnN0b3BfcG9ydCkKKwkJCWFkYXB0ZXItPnN0b3BfcG9ydChhZGFwdGVyLCBwb3J0LT5wb3J0bnVtKTsKKwl9Cit9CisKK3ZvaWQKK25ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGxvbmcgb2ZmLAorCQkJICAgIGludCBkYXRhKQoreworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCWlmIChBRERSX0lOX1dJTkRPVzEob2ZmKSkgeworCQl3cml0ZWwoZGF0YSwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgb2ZmKSk7CisJfSBlbHNlIHsKKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAwKTsKKwkJYWRkciA9IHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBvZmYpOworCQl3cml0ZWwoZGF0YSwgYWRkcik7CisJCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7CisJfQorfQorCit2b2lkIG5ldHhlbl9uaWNfc2V0X2xpbmtfcGFyYW1ldGVycyhzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlfX2xlMzIgc3RhdHVzOworCV9fbGUzMiBhdXRvbmVnOworCV9fbGUzMiBtb2RlOworCisJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfTU9ERSwgJm1vZGUpOworCWlmIChuZXR4ZW5fZ2V0X25pdV9lbmFibGVfZ2UobW9kZSkpIHsJLyogR2IgMTAvMTAwLzEwMDAgTWJwcyBtb2RlICovCisJCWlmIChhZGFwdGVyLT5waHlfcmVhZAorCQkgICAgJiYgYWRhcHRlci0+CisJCSAgICBwaHlfcmVhZChhZGFwdGVyLCBwb3J0LT5wb3J0bnVtLAorCQkJICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUywKKwkJCSAgICAgJnN0YXR1cykgPT0gMCkgeworCQkJaWYgKG5ldHhlbl9nZXRfcGh5X2xpbmsoc3RhdHVzKSkgeworCQkJCXN3aXRjaCAobmV0eGVuX2dldF9waHlfc3BlZWQoc3RhdHVzKSkgeworCQkJCWNhc2UgMDoKKwkJCQkJcG9ydC0+bGlua19zcGVlZCA9IFNQRUVEXzEwOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXBvcnQtPmxpbmtfc3BlZWQgPSBTUEVFRF8xMDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJcG9ydC0+bGlua19zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXBvcnQtPmxpbmtfc3BlZWQgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXN3aXRjaCAobmV0eGVuX2dldF9waHlfZHVwbGV4KHN0YXR1cykpIHsKKwkJCQljYXNlIDA6CisJCQkJCXBvcnQtPmxpbmtfZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJcG9ydC0+bGlua19kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcG9ydC0+bGlua19kdXBsZXggPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChhZGFwdGVyLT5waHlfcmVhZAorCQkJCSAgICAmJiBhZGFwdGVyLT4KKwkJCQkgICAgcGh5X3JlYWQoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJCQkJICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfQVVUT05FRywKKwkJCQkJICAgICAmYXV0b25lZykgIT0gMCkKKwkJCQkJcG9ydC0+bGlua19hdXRvbmVnID0gYXV0b25lZzsKKwkJCX0gZWxzZQorCQkJCWdvdG8gbGlua19kb3duOworCQl9IGVsc2UgeworCQkgICAgICBsaW5rX2Rvd246CisJCQlwb3J0LT5saW5rX3NwZWVkID0gLTE7CisJCQlwb3J0LT5saW5rX2R1cGxleCA9IC0xOworCQl9CisJfQorfQorCit2b2lkIG5ldHhlbl9uaWNfZmxhc2hfcHJpbnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWludCB2YWxpZCA9IDE7CisJdTMyIGZ3X21ham9yID0gMDsKKwl1MzIgZndfbWlub3IgPSAwOworCXUzMiBmd19idWlsZCA9IDA7CisJY2hhciBicmRfbmFtZVtORVRYRU5fTUFYX1NIT1JUX05BTUVdOworCXN0cnVjdCBuZXR4ZW5fbmV3X3VzZXJfaW5mbyB1c2VyX2luZm87CisJaW50IGksIGFkZHIgPSBVU0VSX1NUQVJUOworCXUzMiAqcHRyMzI7CisKKwlzdHJ1Y3QgbmV0eGVuX2JvYXJkX2luZm8gKmJvYXJkX2luZm8gPSAmKGFkYXB0ZXItPmFody5ib2FyZGNmZyk7CisJaWYgKGJvYXJkX2luZm8tPm1hZ2ljICE9IE5FVFhFTl9CRElORk9fTUFHSUMpIHsKKwkJcHJpbnRrCisJCSAgICAoIk5ldFhlbiBVbmtub3duIGJvYXJkIGNvbmZpZywgUmVhZCAweCV4IGV4cGVjdGVkIGFzIDB4JXhcbiIsCisJCSAgICAgYm9hcmRfaW5mby0+bWFnaWMsIE5FVFhFTl9CRElORk9fTUFHSUMpOworCQl2YWxpZCA9IDA7CisJfQorCWlmIChib2FyZF9pbmZvLT5oZWFkZXJfdmVyc2lvbiAhPSBORVRYRU5fQkRJTkZPX1ZFUlNJT04pIHsKKwkJcHJpbnRrKCJOZXRYZW4gVW5rbm93biBib2FyZCBjb25maWcgdmVyc2lvbi4iCisJCSAgICAgICAiIFJlYWQgJXgsIGV4cGVjdGVkICV4XG4iLAorCQkgICAgICAgYm9hcmRfaW5mby0+aGVhZGVyX3ZlcnNpb24sIE5FVFhFTl9CRElORk9fVkVSU0lPTik7CisJCXZhbGlkID0gMDsKKwl9CisJaWYgKHZhbGlkKSB7CisJCXB0cjMyID0gKHUzMiAqKSAmIHVzZXJfaW5mbzsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fbmV3X3VzZXJfaW5mbykgLyBzaXplb2YodTMyKTsKKwkJICAgICBpKyspIHsKKwkJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCBhZGRyLCBwdHIzMikgPT0gLTEpIHsKKwkJCQlwcmludGsoIiVzOiBFUlJPUiByZWFkaW5nICVzIGJvYXJkIHVzZXJhcmVhLlxuIiwKKwkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcHRyMzIrKzsKKwkJCWFkZHIgKz0gc2l6ZW9mKHUzMik7CisJCX0KKwkJZ2V0X2JyZF9uYW1lX2J5X3R5cGUoYm9hcmRfaW5mby0+Ym9hcmRfdHlwZSwgYnJkX25hbWUpOworCisJCXByaW50aygiTmV0WGVuICVzIEJvYXJkIFMvTiAlcyAgQ2hpcCBpZCAweCV4XG4iLAorCQkgICAgICAgYnJkX25hbWUsIHVzZXJfaW5mby5zZXJpYWxfbnVtLCBib2FyZF9pbmZvLT5jaGlwX2lkKTsKKworCQlwcmludGsoIk5ldFhlbiAlcyBCb2FyZCAjJWQsIENoaXAgaWQgMHgleFxuIiwKKwkJICAgICAgIGJvYXJkX2luZm8tPmJvYXJkX3R5cGUgPT0gMHgwYiA/ICJYR0IiIDogIkdCRSIsCisJCSAgICAgICBib2FyZF9pbmZvLT5ib2FyZF9udW0sIGJvYXJkX2luZm8tPmNoaXBfaWQpOworCQlmd19tYWpvciA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsCisJCQkJCQkgICAgICBORVRYRU5fRldfVkVSU0lPTl9NQUpPUikpOworCQlmd19taW5vciA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsCisJCQkJCQkgICAgICBORVRYRU5fRldfVkVSU0lPTl9NSU5PUikpOworCQlmd19idWlsZCA9CisJCSAgICByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fRldfVkVSU0lPTl9TVUIpKTsKKworCQlwcmludGsoIk5ldFhlbiBGaXJtd2FyZSB2ZXJzaW9uICVkLiVkLiVkXG4iLCBmd19tYWpvciwgZndfbWlub3IsCisJCSAgICAgICBmd19idWlsZCk7CisJfQorCWlmIChmd19tYWpvciAhPSBfTkVUWEVOX05JQ19MSU5VWF9NQUpPUikgeworCQlwcmludGsoS0VSTl9FUlIgIlRoZSBtaXNtYXRjaCBpbiBkcml2ZXIgdmVyc2lvbiBhbmQgZmlybXdhcmUgIgorCQkgICAgICAgInZlcnNpb24gbWFqb3IgbnVtYmVyXG4iCisJCSAgICAgICAiRHJpdmVyIHZlcnNpb24gbWFqb3IgbnVtYmVyID0gJWQgXHQiCisJCSAgICAgICAiRmlybXdhcmUgdmVyc2lvbiBtYWpvciBudW1iZXIgPSAlZCBcbiIsCisJCSAgICAgICBfTkVUWEVOX05JQ19MSU5VWF9NQUpPUiwgZndfbWFqb3IpOworCQlhZGFwdGVyLT5kcml2ZXJfbWlzbWF0Y2ggPSAxOworCX0KKwlpZiAoZndfbWlub3IgIT0gX05FVFhFTl9OSUNfTElOVVhfTUlOT1IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUaGUgbWlzbWF0Y2ggaW4gZHJpdmVyIHZlcnNpb24gYW5kIGZpcm13YXJlICIKKwkJICAgICAgICJ2ZXJzaW9uIG1pbm9yIG51bWJlclxuIgorCQkgICAgICAgIkRyaXZlciB2ZXJzaW9uIG1pbm9yIG51bWJlciA9ICVkIFx0IgorCQkgICAgICAgIkZpcm13YXJlIHZlcnNpb24gbWlub3IgbnVtYmVyID0gJWQgXG4iLAorCQkgICAgICAgX05FVFhFTl9OSUNfTElOVVhfTUlOT1IsIGZ3X21pbm9yKTsKKwkJYWRhcHRlci0+ZHJpdmVyX21pc21hdGNoID0gMTsKKwl9CisJaWYgKGFkYXB0ZXItPmRyaXZlcl9taXNtYXRjaCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNlIHRoZSBkcml2ZXIgd2l0aCB2ZXJzaW9uIG5vICVkLiVkLnh4eFxuIiwKKwkJICAgICAgIGZ3X21ham9yLCBmd19taW5vcik7Cit9CisKK2ludCBuZXR4ZW5fY3JiX3JlYWRfdmFsKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgbG9uZyBvZmYpCit7CisJaW50IGRhdGE7CisJbmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsIG9mZiwgJmRhdGEsIDQpOworCXJldHVybiBkYXRhOworfQorCitpbnQgbmV0eGVuX25pY19od193cml0ZV9pb2N0bChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBvZmYsCisJCQkgICAgICB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXZvaWQgKmFkZHI7CisJdTY0IG9mZnNldCA9IG9mZjsKKwl1OCAqbWVtX3B0ciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBtZW1fYmFzZTsKKwl1bnNpZ25lZCBsb25nIG1lbV9wYWdlOworCisJaWYgKEFERFJfSU5fV0lORE9XMShvZmYpKSB7CisJCWFkZHIgPSBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBvZmYpOworCQlpZiAoIWFkZHIpIHsKKwkJCW1lbV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGFkYXB0ZXItPmFody5wZGV2LCAwKTsKKwkJCW9mZnNldCA9IE5FVFhFTl9DUkJfTk9STUFMKG9mZik7CisJCQltZW1fcGFnZSA9IG9mZnNldCAmIFBBR0VfTUFTSzsKKwkJCWlmIChtZW1fcGFnZSAhPSAoKG9mZnNldCArIGxlbiAtIDEpICYgUEFHRV9NQVNLKSkKKwkJCQltZW1fcHRyID0KKwkJCQkgICAgaW9yZW1hcChtZW1fYmFzZSArIG1lbV9wYWdlLCBQQUdFX1NJWkUgKiAyKTsKKwkJCWVsc2UKKwkJCQltZW1fcHRyID0KKwkJCQkgICAgaW9yZW1hcChtZW1fYmFzZSArIG1lbV9wYWdlLCBQQUdFX1NJWkUpOworCQkJaWYgKG1lbV9wdHIgPT0gMFVMKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlhZGRyID0gbWVtX3B0cjsKKwkJCWFkZHIgKz0gb2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOworCQl9CisJfSBlbHNlIHsKKwkJYWRkciA9IHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBvZmYpOworCQlpZiAoIWFkZHIpIHsKKwkJCW1lbV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGFkYXB0ZXItPmFody5wZGV2LCAwKTsKKwkJCW1lbV9wYWdlID0gb2ZmICYgUEFHRV9NQVNLOworCQkJaWYgKG1lbV9wYWdlICE9ICgob2ZmICsgbGVuIC0gMSkgJiBQQUdFX01BU0spKQorCQkJCW1lbV9wdHIgPQorCQkJCSAgICBpb3JlbWFwKG1lbV9iYXNlICsgbWVtX3BhZ2UsIFBBR0VfU0laRSAqIDIpOworCQkJZWxzZQorCQkJCW1lbV9wdHIgPQorCQkJCSAgICBpb3JlbWFwKG1lbV9iYXNlICsgbWVtX3BhZ2UsIFBBR0VfU0laRSk7CisJCQlpZiAobWVtX3B0ciA9PSAwVUwpIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWFkZHIgPSBtZW1fcHRyOworCQkJYWRkciArPSBvZmYgJiAoUEFHRV9TSVpFIC0gMSk7CisJCX0KKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAwKTsKKwl9CisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCXdyaXRlYigqKHU4ICopIGRhdGEsIGFkZHIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXdyaXRldygqKHUxNiAqKSBkYXRhLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl3cml0ZWwoKih1MzIgKikgZGF0YSwgYWRkcik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJd3JpdGVxKCoodTY0ICopIGRhdGEsIGFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUFJJTlRLKElORk8sCisJCQkid3JpdGluZyBkYXRhICVseCB0byBvZmZzZXQgJWxseCwgbnVtIHdvcmRzPSVkXG4iLAorCQkJKih1bnNpZ25lZCBsb25nICopZGF0YSwgb2ZmLCAobGVuID4+IDMpKTsKKworCQluZXR4ZW5fbmljX2h3X2Jsb2NrX3dyaXRlNjQoKHU2NCBfX2lvbWVtICopIGRhdGEsIGFkZHIsCisJCQkJCSAgICAobGVuID4+IDMpKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFBRERSX0lOX1dJTkRPVzEob2ZmKSkKKwkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAxKTsKKwlpZiAobWVtX3B0cikKKwkJaW91bm1hcChtZW1fcHRyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldHhlbl9uaWNfaHdfcmVhZF9pb2N0bChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBvZmYsCisJCQkgICAgIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJdm9pZCAqYWRkcjsKKwl1NjQgb2Zmc2V0OworCXU4ICptZW1fcHRyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG1lbV9iYXNlOworCXVuc2lnbmVkIGxvbmcgbWVtX3BhZ2U7CisKKwlpZiAoQUREUl9JTl9XSU5ET1cxKG9mZikpIHsKKwkJYWRkciA9IE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIG9mZik7CisJCWlmICghYWRkcikgeworCQkJbWVtX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYWRhcHRlci0+YWh3LnBkZXYsIDApOworCQkJb2Zmc2V0ID0gTkVUWEVOX0NSQl9OT1JNQUwob2ZmKTsKKwkJCW1lbV9wYWdlID0gb2Zmc2V0ICYgUEFHRV9NQVNLOworCQkJaWYgKG1lbV9wYWdlICE9ICgob2Zmc2V0ICsgbGVuIC0gMSkgJiBQQUdFX01BU0spKQorCQkJCW1lbV9wdHIgPQorCQkJCSAgICBpb3JlbWFwKG1lbV9iYXNlICsgbWVtX3BhZ2UsIFBBR0VfU0laRSAqIDIpOworCQkJZWxzZQorCQkJCW1lbV9wdHIgPQorCQkJCSAgICBpb3JlbWFwKG1lbV9iYXNlICsgbWVtX3BhZ2UsIFBBR0VfU0laRSk7CisJCQlpZiAobWVtX3B0ciA9PSAwVUwpIHsKKwkJCQkqKHU4ICopIGRhdGEgPSAwOworCQkJCXJldHVybiAxOworCQkJfQorCQkJYWRkciA9IG1lbV9wdHI7CisJCQlhZGRyICs9IG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKTsKKwkJfQorCX0gZWxzZSB7CisJCWFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKTsKKwkJaWYgKCFhZGRyKSB7CisJCQltZW1fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChhZGFwdGVyLT5haHcucGRldiwgMCk7CisJCQltZW1fcGFnZSA9IG9mZiAmIFBBR0VfTUFTSzsKKwkJCWlmIChtZW1fcGFnZSAhPSAoKG9mZiArIGxlbiAtIDEpICYgUEFHRV9NQVNLKSkKKwkJCQltZW1fcHRyID0KKwkJCQkgICAgaW9yZW1hcChtZW1fYmFzZSArIG1lbV9wYWdlLCBQQUdFX1NJWkUgKiAyKTsKKwkJCWVsc2UKKwkJCQltZW1fcHRyID0KKwkJCQkgICAgaW9yZW1hcChtZW1fYmFzZSArIG1lbV9wYWdlLCBQQUdFX1NJWkUpOworCQkJaWYgKG1lbV9wdHIgPT0gMFVMKQorCQkJCXJldHVybiAxOworCQkJYWRkciA9IG1lbV9wdHI7CisJCQlhZGRyICs9IG9mZiAmIChQQUdFX1NJWkUgLSAxKTsKKwkJfQorCQluZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KGFkYXB0ZXIsIDApOworCX0KKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKih1OCAqKSBkYXRhID0gcmVhZGIoYWRkcik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKih1MTYgKikgZGF0YSA9IHJlYWR3KGFkZHIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCSoodTMyICopIGRhdGEgPSByZWFkbChhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQkqKHU2NCAqKSBkYXRhID0gcmVhZHEoYWRkcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5ldHhlbl9uaWNfaHdfYmxvY2tfcmVhZDY0KCh1NjQgX19pb21lbSAqKSBkYXRhLCBhZGRyLAorCQkJCQkgICAobGVuID4+IDMpKTsKKwkJYnJlYWs7CisJfQorCWlmICghQUREUl9JTl9XSU5ET1cxKG9mZikpCisJCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7CisJaWYgKG1lbV9wdHIpCisJCWlvdW5tYXAobWVtX3B0cik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXR4ZW5fbmljX3BjaV9tZW1fd3JpdGVfaW9jdGwoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLAorCQkJCSAgIHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCXZvaWQgKmFkZHI7CisJaW50IHJldCA9IDA7CisJdTggKm1lbV9wdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbWVtX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBtZW1fcGFnZTsKKworCWlmIChkYXRhID09IE5VTEwgfHwgb2ZmID4gKDEyOCAqIDEwMjQgKiAxMDI0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkYXRhOiAlcCBvZmY6JWxseFxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGRhdGEsIG9mZik7CisJCXJldHVybiAxOworCX0KKwlvZmYgPSBuZXR4ZW5fbmljX3BjaV9zZXRfd2luZG93KGFkYXB0ZXIsIG9mZik7CisJLyogQ29ybmVyIGNhc2UgOiBNYWxpY2lvdXMgdXNlciB0cmllZCB0byBicmVhayB0aGUgZHJpdmVyIGJ5IHJlYWRpbmcKKwkgICBsYXN0IGZldyBieXRlcyBpbiByYW5nZXMgYW5kIHRyaWVzIHRvIHJlYWQgZnVydGhlciBhZGRyZXNzZXMuCisJICovCisJaWYgKCFwY2lfYmFzZShhZGFwdGVyLCBvZmYgKyBzaXplIC0gMSkgJiYgcGNpX2Jhc2UoYWRhcHRlciwgb2ZmKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGFjY2VzcyB0byBtZW1vcnkgYWRkcmVzcyByYW5nZSIKKwkJICAgICAgICIgMHglbGx4IC0gMHglbGx4XG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBvZmYsCisJCSAgICAgICBvZmYgKyBzaXplKTsKKwkJcmV0dXJuIDE7CisJfQorCWFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKTsKKwlEUFJJTlRLKElORk8sICJ3cml0aW5nIGRhdGEgJWxseCB0byBvZmZzZXQgJWxseFxuIiwKKwkJKih1bnNpZ25lZCBsb25nIGxvbmcgKilkYXRhLCBvZmYpOworCWlmICghYWRkcikgeworCQltZW1fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChhZGFwdGVyLT5haHcucGRldiwgMCk7CisJCW1lbV9wYWdlID0gb2ZmICYgUEFHRV9NQVNLOworCQkvKiBNYXAgdHdvIHBhZ2VzIHdoZW5ldmVyIHVzZXIgdHJpZXMgdG8gYWNjZXNzIGFkZHJlc3NlcyBpbiB0d28KKwkJICAgY29uc2VjdXRpdmUgcGFnZXMuCisJCSAqLworCQlpZiAobWVtX3BhZ2UgIT0gKChvZmYgKyBzaXplIC0gMSkgJiBQQUdFX01BU0spKQorCQkJbWVtX3B0ciA9IGlvcmVtYXAobWVtX2Jhc2UgKyBtZW1fcGFnZSwgUEFHRV9TSVpFICogMik7CisJCWVsc2UKKwkJCW1lbV9wdHIgPSBpb3JlbWFwKG1lbV9iYXNlICsgbWVtX3BhZ2UsIFBBR0VfU0laRSk7CisJCWlmIChtZW1fcHRyID09IDBVTCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJYWRkciA9IG1lbV9wdHI7CisJCWFkZHIgKz0gb2ZmICYgKFBBR0VfU0laRSAtIDEpOworCX0KKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCXdyaXRlYigqKHU4ICopIGRhdGEsIGFkZHIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXdyaXRldygqKHUxNiAqKSBkYXRhLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl3cml0ZWwoKih1MzIgKikgZGF0YSwgYWRkcik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJd3JpdGVxKCoodTY0ICopIGRhdGEsIGFkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUFJJTlRLKElORk8sCisJCQkid3JpdGluZyBkYXRhICVseCB0byBvZmZzZXQgJWxseCwgbnVtIHdvcmRzPSVkXG4iLAorCQkJKih1bnNpZ25lZCBsb25nICopZGF0YSwgb2ZmLCAoc2l6ZSA+PiAzKSk7CisKKwkJbmV0eGVuX25pY19od19ibG9ja193cml0ZTY0KCh1NjQgX19pb21lbSAqKSBkYXRhLCBhZGRyLAorCQkJCQkgICAgKHNpemUgPj4gMykpOworCQlicmVhazsKKwl9CisKKwlpZiAobWVtX3B0cikKKwkJaW91bm1hcChtZW1fcHRyKTsKKwlEUFJJTlRLKElORk8sICJ3cm90ZSAlbGx4XG4iLCAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG5ldHhlbl9uaWNfcGNpX21lbV9yZWFkX2lvY3RsKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgIHU2NCBvZmYsIHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCXZvaWQgKmFkZHI7CisJaW50IHJldCA9IDA7CisJdTggKm1lbV9wdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbWVtX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBtZW1fcGFnZTsKKworCWlmIChkYXRhID09IE5VTEwgfHwgb2ZmID4gKDEyOCAqIDEwMjQgKiAxMDI0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkYXRhOiAlcCBvZmY6JWxseFxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGRhdGEsIG9mZik7CisJCXJldHVybiAxOworCX0KKwlvZmYgPSBuZXR4ZW5fbmljX3BjaV9zZXRfd2luZG93KGFkYXB0ZXIsIG9mZik7CisJLyogQ29ybmVyIGNhc2UgOiBNYWxpY2lvdXMgdXNlciB0cmllZCB0byBicmVhayB0aGUgZHJpdmVyIGJ5IHJlYWRpbmcKKwkgICBsYXN0IGZldyBieXRlcyBpbiByYW5nZXMgYW5kIHRyaWVzIHRvIHJlYWQgZnVydGhlciBhZGRyZXNzZXMuCisJICovCisJaWYgKCFwY2lfYmFzZShhZGFwdGVyLCBvZmYgKyBzaXplIC0gMSkgJiYgcGNpX2Jhc2UoYWRhcHRlciwgb2ZmKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIGFjY2VzcyB0byBtZW1vcnkgYWRkcmVzcyByYW5nZSIKKwkJICAgICAgICIgMHglbGx4IC0gMHglbGx4XG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBvZmYsCisJCSAgICAgICBvZmYgKyBzaXplKTsKKwkJcmV0dXJuIDE7CisJfQorCWFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKTsKKwlpZiAoIWFkZHIpIHsKKwkJbWVtX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYWRhcHRlci0+YWh3LnBkZXYsIDApOworCQltZW1fcGFnZSA9IG9mZiAmIFBBR0VfTUFTSzsKKwkJLyogTWFwIHR3byBwYWdlcyB3aGVuZXZlciB1c2VyIHRyaWVzIHRvIGFjY2VzcyBhZGRyZXNzZXMgaW4gdHdvCisJCSAgIGNvbnNlY3V0aXZlIHBhZ2VzLgorCQkgKi8KKwkJaWYgKG1lbV9wYWdlICE9ICgob2ZmICsgc2l6ZSAtIDEpICYgUEFHRV9NQVNLKSkKKwkJCW1lbV9wdHIgPSBpb3JlbWFwKG1lbV9iYXNlICsgbWVtX3BhZ2UsIFBBR0VfU0laRSAqIDIpOworCQllbHNlCisJCQltZW1fcHRyID0gaW9yZW1hcChtZW1fYmFzZSArIG1lbV9wYWdlLCBQQUdFX1NJWkUpOworCQlpZiAobWVtX3B0ciA9PSAwVUwpIHsKKwkJCSoodTggKikgZGF0YSA9IDA7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlhZGRyID0gbWVtX3B0cjsKKwkJYWRkciArPSBvZmYgJiAoUEFHRV9TSVpFIC0gMSk7CisJfQorCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJKih1OCAqKSBkYXRhID0gcmVhZGIoYWRkcik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKih1MTYgKikgZGF0YSA9IHJlYWR3KGFkZHIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCSoodTMyICopIGRhdGEgPSByZWFkbChhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQkqKHU2NCAqKSBkYXRhID0gcmVhZHEoYWRkcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5ldHhlbl9uaWNfaHdfYmxvY2tfcmVhZDY0KCh1NjQgX19pb21lbSAqKSBkYXRhLCBhZGRyLAorCQkJCQkgICAoc2l6ZSA+PiAzKSk7CisJCWJyZWFrOworCX0KKworCWlmIChtZW1fcHRyKQorCQlpb3VubWFwKG1lbV9wdHIpOworCURQUklOVEsoSU5GTywgInJlYWQgJWxseFxuIiwgKih1bnNpZ25lZCBsb25nIGxvbmcgKilkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5oIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjg1NjMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuaApAQCAtMCwwICsxLDQ4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKgorICoKKyAqIFN0cnVjdHVyZXMsIGVudW1zLCBhbmQgbWFjcm9zIGZvciB0aGUgTUFDCisgKgorICovCisKKyNpZm5kZWYgX19ORVRYRU5fTklDX0hXX0hfCisjZGVmaW5lIF9fTkVUWEVOX05JQ19IV19IXworCisjaW5jbHVkZSAibmV0eGVuX25pY19oZHIuaCIKKworLyogSGFyZHdhcmUgbWVtb3J5IHNpemUgb2YgMTI4IG1lZyAqLworI2RlZmluZSBORVRYRU5fTUVNQUREUl9NQVggKDEyOCAqIDEwMjQgKiAxMDI0KQorCisjaWZuZGVmIHJlYWRxCitzdGF0aWMgaW5saW5lIHU2NCByZWFkcSh2b2lkIF9faW9tZW0gKiBhZGRyKQoreworCXJldHVybiByZWFkbChhZGRyKSB8ICgoKHU2NCkgcmVhZGwoYWRkciArIDQpKSA8PCAzMkxMKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIHdyaXRlcQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcSh1NjQgdmFsLCB2b2lkIF9faW9tZW0gKiBhZGRyKQoreworCXdyaXRlbCgoKHUzMikgKHZhbCkpLCAoYWRkcikpOworCXdyaXRlbCgoKHUzMikgKHZhbCA+PiAzMikpLCAoYWRkciArIDQpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0eGVuX25pY19od19ibG9ja193cml0ZTY0KHU2NCBfX2lvbWVtICogZGF0YV9wdHIsCisJCQkJCSAgICAgICB1NjQgX19pb21lbSAqIGFkZHIsCisJCQkJCSAgICAgICBpbnQgbnVtX3dvcmRzKQoreworCWludCBudW07CisJZm9yIChudW0gPSAwOyBudW0gPCBudW1fd29yZHM7IG51bSsrKSB7CisJCXdyaXRlcShyZWFkcSgodm9pZCBfX2lvbWVtICopZGF0YV9wdHIpLCBhZGRyKTsKKwkJYWRkcisrOworCQlkYXRhX3B0cisrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHhlbl9uaWNfaHdfYmxvY2tfcmVhZDY0KHU2NCBfX2lvbWVtICogZGF0YV9wdHIsCisJCQkJCSAgICAgIHU2NCBfX2lvbWVtICogYWRkciwgaW50IG51bV93b3JkcykKK3sKKwlpbnQgbnVtOworCWZvciAobnVtID0gMDsgbnVtIDwgbnVtX3dvcmRzOyBudW0rKykgeworCQl3cml0ZXEocmVhZHEoKHZvaWQgX19pb21lbSAqKWFkZHIpLCBkYXRhX3B0cik7CisJCWFkZHIrKzsKKwkJZGF0YV9wdHIrKzsKKwl9CisKK30KKworc3RydWN0IG5ldHhlbl9hZGFwdGVyOworCisjZGVmaW5lIE5FVFhFTl9QQ0lfTUFQU0laRV9CWVRFUyAgKE5FVFhFTl9QQ0lfTUFQU0laRSA8PCAyMCkKKworI2RlZmluZSBORVRYRU5fTklDX0xPQ0tFRF9SRUFEX1JFRyhYLCBZKQlcCisJYWRkciA9IHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBYKTsJXAorCSoodTMyICopWSA9IHJlYWRsKCh2b2lkIF9faW9tZW0qKSBhZGRyKTsKKworc3RydWN0IG5ldHhlbl9wb3J0Owordm9pZCBuZXR4ZW5fbmljX3NldF9saW5rX3BhcmFtZXRlcnMoc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0KTsKK3ZvaWQgbmV0eGVuX25pY19mbGFzaF9wcmludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLAorCQkJICAgdm9pZCAqZGF0YSwgaW50IGxlbik7Cit2b2lkIG5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2ZmLCBpbnQgZGF0YSk7CitpbnQgbmV0eGVuX25pY19od19yZWFkX3d4KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTY0IG9mZiwKKwkJCSAgdm9pZCAqZGF0YSwgaW50IGxlbik7CisKK3R5cGVkZWYgdTggbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdFs2XTsKKworLyogTmliYmxlIG9yIEJ5dGUgbW9kZSBmb3IgcGh5IGludGVyZmFjZSAoR2JFIG1vZGUgb25seSkgKi8KK3R5cGVkZWYgZW51bSB7CisJTkVUWEVOX05JVV8xMF8xMDBfTUIgPSAwLAorCU5FVFhFTl9OSVVfMTAwMF9NQgorfSBuZXR4ZW5fbml1X2diZV9pZm1vZGVfdDsKKworI2RlZmluZSBfbmV0eGVuX2NyYl9nZXRfYml0KHZhciwgYml0KSAgKCh2YXIgPj4gYml0KSAmIDB4MSkKKworLyoKKyAqIE5JVSBHQiBNQUMgQ29uZmlnIFJlZ2lzdGVyIDAgKGFwcGxpZXMgdG8gR0IwLCBHQjEsIEdCMiwgR0IzKQorICoKKyAqCUJpdCAwIDogZW5hYmxlX3R4ID0+IDE6ZW5hYmxlIGZyYW1lIHhtaXQsIDA6ZGlzYWJsZQorICoJQml0IDEgOiB0eF9zeW5jZWQgPT4gUi9POiB4bWl0IGVuYWJsZSBzeW5jaGVkIHRvIHhtaXQgc3RyZWFtCisgKglCaXQgMiA6IGVuYWJsZV9yeCA9PiAxOmVuYWJsZSBmcmFtZSByZWN2LCAwOmRpc2FibGUKKyAqCUJpdCAzIDogcnhfc3luY2VkID0+IFIvTzogcmVjdiBlbmFibGUgc3luY2hlZCB0byByZWN2IHN0cmVhbQorICoJQml0IDQgOiB0eF9mbG93Y3RsID0+IDE6ZW5hYmxlIHBhdXNlIGZyYW1lIGdlbmVyYXRpb24sIDA6ZGlzYWJsZQorICoJQml0IDUgOiByeF9mbG93Y3RsID0+IDE6YWN0IG9uIHJlY3YnZCBwYXVzZSBmcmFtZXMsIDA6aWdub3JlCisgKglCaXQgOCA6IGxvb3BiYWNrID0+IDE6bG9vcCBNQUMgeG1pdHMgdG8gTUFDIHJlY3ZzLCAwOm5vcm1hbAorICoJQml0IDE2OiB0eF9yZXNldF9wYiA9PiAxOnJlc2V0IGZyYW1lIHhtaXQgcHJvdG9jb2wgYmxrLCAwOm5vLW9wCisgKglCaXQgMTc6IHJ4X3Jlc2V0X3BiID0+IDE6cmVzZXQgZnJhbWUgcmVjdiBwcm90b2NvbCBibGssIDA6bm8tb3AKKyAqCUJpdCAxODogdHhfcmVzZXRfbWFjID0+IDE6cmVzZXQgZGF0YS9jdGwgbXVsdGlwbGV4ZXIgYmxrLCAwOm5vLW9wCisgKglCaXQgMTk6IHJ4X3Jlc2V0X21hYyA9PiAxOnJlc2V0IGN0bCBmcmFtZXMgJiB0aW1lcnMgYmxrLCAwOm5vLW9wCisgKglCaXQgMzE6IHNvZnRfcmVzZXQgPT4gMTpyZXNldCB0aGUgTUFDIGFuZCB0aGUgU0VSREVTLCAwOm5vLW9wCisgKi8KKworI2RlZmluZSBuZXR4ZW5fZ2JfZW5hYmxlX3R4KGNvbmZpZ193b3JkKQlcCisJc2V0X2JpdCgwLCAodW5zaWduZWQgbG9uZyopKCZjb25maWdfd29yZCkpCisjZGVmaW5lIG5ldHhlbl9nYl9lbmFibGVfcngoY29uZmlnX3dvcmQpCVwKKwlzZXRfYml0KDIsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3R4X2Zsb3djdGwoY29uZmlnX3dvcmQpCVwKKwlzZXRfYml0KDQsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3J4X2Zsb3djdGwoY29uZmlnX3dvcmQpCVwKKwlzZXRfYml0KDUsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3R4X3Jlc2V0X3BiKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMTYsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3J4X3Jlc2V0X3BiKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMTcsICh1bnNpZ25lZCBsb25nKikoJmNvbmZpZ193b3JkKSkKKyNkZWZpbmUgbmV0eGVuX2diX3R4X3Jlc2V0X21hYyhjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDE4LCAodW5zaWduZWQgbG9uZyopKCZjb25maWdfd29yZCkpCisjZGVmaW5lIG5ldHhlbl9nYl9yeF9yZXNldF9tYWMoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgxOSwgKHVuc2lnbmVkIGxvbmcqKSgmY29uZmlnX3dvcmQpKQorI2RlZmluZSBuZXR4ZW5fZ2Jfc29mdF9yZXNldChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDMxLCAodW5zaWduZWQgbG9uZyopKCZjb25maWdfd29yZCkpCisKKyNkZWZpbmUgbmV0eGVuX2diX3Vuc2V0X3R4X2Zsb3djdGwoY29uZmlnX3dvcmQpCVwKKwkJY2xlYXJfYml0KDQsICh1bnNpZ25lZCBsb25nICopKCZjb25maWdfd29yZCkpCisjZGVmaW5lIG5ldHhlbl9nYl91bnNldF9yeF9mbG93Y3RsKGNvbmZpZ193b3JkKQlcCisJCWNsZWFyX2JpdCg1LCAodW5zaWduZWQgbG9uZyopKCZjb25maWdfd29yZCkpCisKKyNkZWZpbmUgbmV0eGVuX2diX2dldF90eF9zeW5jZWQoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdCgoY29uZmlnX3dvcmQpLCAxKQorI2RlZmluZSBuZXR4ZW5fZ2JfZ2V0X3J4X3N5bmNlZChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDMpCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfdHhfZmxvd2N0bChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDQpCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfcnhfZmxvd2N0bChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDUpCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfc29mdF9yZXNldChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDMxKQorCisvKgorICogTklVIEdCIE1BQyBDb25maWcgUmVnaXN0ZXIgMSAoYXBwbGllcyB0byBHQjAsIEdCMSwgR0IyLCBHQjMpCisgKgorICoJQml0IDAJICAgIDogZHVwbGV4ID0+IDE6ZnVsbCBkdXBsZXggbW9kZSwgMDpoYWxmIGR1cGxleAorICoJQml0IDEJICAgIDogY3JjX2VuYWJsZSA9PiAxOmFwcGVuZCBDUkMgdG8geG1pdCBmcmFtZXMsIDA6ZG9udCBhcHBlbmQKKyAqCUJpdCAyCSAgICA6IHBhZHNob3J0ID0+IDE6cGFkIHNob3J0IGZyYW1lcyBhbmQgYWRkIENSQywgMDpkb250IHBhZAorICoJQml0IDQJICAgIDogY2hlY2tsZW5ndGggPT4gMTpjaGVjayBmcmFtZWxlbiB3aXRoIGFjdHVhbCwwOmRvbnQgY2hlY2sKKyAqCUJpdCA1CSAgICA6IGh1Z2VmcmFtZXMgPT4gMTphbGxvdyBvdmVyc2l6ZSB4bWl0IGZyYW1lcywgMDpkb250IGFsbG93CisgKglCaXRzIDgtOSAgICA6IGludGZtb2RlID0+IDAxOm5pYmJsZSAoMTAvMTAwKSwgMTA6Ynl0ZSAoMTAwMCkKKyAqCUJpdHMgMTItMTUgIDogcHJlYW1ibGVsZW4gPT4gcHJlYW1ibGUgZmllbGQgbGVuZ3RoIGluIGJ5dGVzLCBkZWZhdWx0IDcKKyAqLworCisjZGVmaW5lIG5ldHhlbl9nYl9zZXRfZHVwbGV4KGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMCwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2diX3NldF9jcmNfZW5hYmxlKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMSwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2diX3NldF9wYWRzaG9ydChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDIsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisjZGVmaW5lIG5ldHhlbl9nYl9zZXRfY2hlY2tsZW5ndGgoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCg0LCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fZ2Jfc2V0X2h1Z2VmcmFtZXMoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCg1LCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fZ2Jfc2V0X3ByZWFtYmxlbGVuKGNvbmZpZ193b3JkLCB2YWwpCVwKKwkJKChjb25maWdfd29yZCkgfD0gKCh2YWwpIDw8IDEyKSAmIDB4RjAwMCkKKyNkZWZpbmUgbmV0eGVuX2diX3NldF9pbnRmbW9kZShjb25maWdfd29yZCwgdmFsKQkJXAorCQkoKGNvbmZpZ193b3JkKSB8PSAoKHZhbCkgPDwgOCkgJiAweDMwMCkKKworI2RlZmluZSBuZXR4ZW5fZ2JfZ2V0X3N0YXRpb25hZGRyZXNzX2xvdyhjb25maWdfd29yZCkgKChjb25maWdfd29yZCkgPj4gMTYpCisKKyNkZWZpbmUgbmV0eGVuX2diX3NldF9taWlfbWdtdF9jbG9ja3NlbGVjdChjb25maWdfd29yZCwgdmFsKQlcCisJCSgoY29uZmlnX3dvcmQpIHw9ICgodmFsKSAmIDB4MDcpKQorI2RlZmluZSBuZXR4ZW5fZ2JfbWlpX21nbXRfcmVzZXQoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgzMSwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2diX21paV9tZ210X3Vuc2V0KGNvbmZpZ193b3JkKQlcCisJCWNsZWFyX2JpdCgzMSwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKworLyoKKyAqIE5JVSBHQiBNSUkgTWdtdCBDb21tYW5kIFJlZ2lzdGVyIChhcHBsaWVzIHRvIEdCMCwgR0IxLCBHQjIsIEdCMykKKyAqIEJpdCAwIDogcmVhZF9jeWNsZSA9PiAxOnBlcmZvcm0gc2luZ2xlIHJlYWQgY3ljbGUsIDA6bm8tb3AKKyAqIEJpdCAxIDogc2Nhbl9jeWNsZSA9PiAxOnBlcmZvcm0gY29udGludW91cyByZWFkIGN5Y2xlcywgMDpuby1vcAorICovCisKKyNkZWZpbmUgbmV0eGVuX2diX21paV9tZ210X3NldF9yZWFkX2N5Y2xlKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMCwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2diX21paV9tZ210X3JlZ19hZGRyKGNvbmZpZ193b3JkLCB2YWwpCVwKKwkJKChjb25maWdfd29yZCkgfD0gKCh2YWwpICYgMHgxRikpCisjZGVmaW5lIG5ldHhlbl9nYl9taWlfbWdtdF9waHlfYWRkcihjb25maWdfd29yZCwgdmFsKQlcCisJCSgoY29uZmlnX3dvcmQpIHw9ICgoKHZhbCkgJiAweDFGKSA8PCA4KSkKKworLyoKKyAqIE5JVSBHQiBNSUkgTWdtdCBJbmRpY2F0b3JzIFJlZ2lzdGVyIChhcHBsaWVzIHRvIEdCMCwgR0IxLCBHQjIsIEdCMykKKyAqIFJlYWQtb25seSByZWdpc3Rlci4KKyAqIEJpdCAwIDogYnVzeSA9PiAxOnBlcmZvcm1pbmcgYW4gTUlJIG1nbXQgY3ljbGUsIDA6aWRsZQorICogQml0IDEgOiBzY2FubmluZyA9PiAxOnNjYW4gb3BlcmF0aW9uIGluIHByb2dyZXNzLCAwOmlkbGUKKyAqIEJpdCAyIDogbm90dmFsaWQgPT4gOm1nbXQgcmVzdWx0IGRhdGEgbm90IHlldCB2YWxpZCwgMDppZGxlCisgKi8KKyNkZWZpbmUgbmV0eGVuX2dldF9nYl9taWlfbWdtdF9idXN5KGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDApCisjZGVmaW5lIG5ldHhlbl9nZXRfZ2JfbWlpX21nbXRfc2Nhbm5pbmcoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMSkKKyNkZWZpbmUgbmV0eGVuX2dldF9nYl9taWlfbWdtdF9ub3R2YWxpZChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAyKQorCisvKgorICogUEhZLVNwZWNpZmljIE1JSSBjb250cm9sL3N0YXR1cyByZWdpc3RlcnMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0NPTlRST0wgPSAwLAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9TVEFUVVMgPSAxLAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfSURfMCA9IDIsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX1BIWV9JRF8xID0gMywKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfQVVUT05FRyA9IDQsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0xOS1BBUlQgPSA1LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9BVVRPTkVHX01PUkUgPSA2LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9ORVhUUEFHRV9YTUlUID0gNywKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfTE5LUEFSVF9ORVhUUEFHRSA9IDgsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSXzEwMDBCVF9DT05UUk9MID0gOSwKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfMTAwMEJUX1NUQVRVUyA9IDEwLAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9FWFRFTkRFRF9TVEFUVVMgPSAxNSwKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX0NPTlRST0wgPSAxNiwKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUyA9IDE3LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9JTlRfRU5BQkxFID0gMTgsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0lOVF9TVEFUVVMgPSAxOSwKKwlORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX0NPTlRST0xfTU9SRSA9IDIwLAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9SRUNWX0VSUk9SX0NPVU5UID0gMjEsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0xFRF9DT05UUk9MID0gMjQsCisJTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0xFRF9PVkVSUklERSA9IDI1LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfQ09OVFJPTF9NT1JFX1lFVCA9IDI2LAorCU5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTX01PUkUgPSAyNworfSBuZXR4ZW5fbml1X3BoeV9yZWdpc3Rlcl90OworCisvKgorICogUEhZLVNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAocmVnIDE3KS4KKyAqCisgKiBCaXQgMCAgICAgIDogamFiYmVyID0+IDE6amFiYmVyIGRldGVjdGVkLCAwOm5vdAorICogQml0IDEgICAgICA6IHBvbGFyaXR5ID0+IDE6cG9sYXJpdHkgcmV2ZXJzZWQsIDA6bm9ybWFsCisgKiBCaXQgMiAgICAgIDogcmVjdnBhdXNlID0+IDE6cmVjZWl2ZSBwYXVzZSBlbmFibGVkLCAwOmRpc2FibGVkCisgKiBCaXQgMyAgICAgIDogeG1pdHBhdXNlID0+IDE6dHJhbnNtaXQgcGF1c2UgZW5hYmxlZCwgMDpkaXNhYmxlZAorICogQml0IDQgICAgICA6IGVuZXJneWRldGVjdCA9PiAxOnNsZWVwLCAwOmFjdGl2ZQorICogQml0IDUgICAgICA6IGRvd25zaGlmdCA9PiAxOmRvd25zaGlmdCwgMDpubyBkb3duc2hpZnQKKyAqIEJpdCA2ICAgICAgOiBjcm9zc292ZXIgPT4gMTpNRElYIChjcm9zc292ZXIpLCAwOk1ESSAobm8gY3Jvc3NvdmVyKQorICogQml0cyA3LTkgICA6IGNhYmxlbGVuID0+IG5vdCB2YWxpZCBpbiAxME1iL3MgbW9kZQorICoJCQkwOjw1MG0sIDE6NTAtODBtLCAyOjgwLTExMG0sIDM6MTEwLTE0MG0sIDQ6PjE0MG0KKyAqIEJpdCAxMCAgICAgOiBsaW5rID0+IDE6bGluayB1cCwgMDpsaW5rIGRvd24KKyAqIEJpdCAxMSAgICAgOiByZXNvbHZlZCA9PiAxOnNwZWVkIGFuZCBkdXBsZXggcmVzb2x2ZWQsIDA6bm90IHlldAorICogQml0IDEyICAgICA6IHBhZ2VyY3ZkID0+IDE6cGFnZSByZWNlaXZlZCwgMDpwYWdlIG5vdCByZWNlaXZlZAorICogQml0IDEzICAgICA6IGR1cGxleCA9PiAxOmZ1bGwgZHVwbGV4LCAwOmhhbGYgZHVwbGV4CisgKiBCaXRzIDE0LTE1IDogc3BlZWQgPT4gMDoxME1iL3MsIDE6MTAwTWIvcywgMjoxMDAwTWIvcywgMzpyc3ZkCisgKi8KKworI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9jYWJsZWxlbihjb25maWdfd29yZCkgKCgoY29uZmlnX3dvcmQpID4+IDcpICYgMHgwNykKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfc3BlZWQoY29uZmlnX3dvcmQpICgoKGNvbmZpZ193b3JkKSA+PiAxNCkgJiAweDAzKQorCisjZGVmaW5lIG5ldHhlbl9zZXRfcGh5X3NwZWVkKGNvbmZpZ193b3JkLCB2YWwpCVwKKwkJKChjb25maWdfd29yZCkgfD0gKCh2YWwgJiAweDAzKSA8PCAxNCkpCisjZGVmaW5lIG5ldHhlbl9zZXRfcGh5X2R1cGxleChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDEzLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fY2xlYXJfcGh5X2R1cGxleChjb25maWdfd29yZCkJXAorCQljbGVhcl9iaXQoMTMsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfamFiYmVyKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDApCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X3BvbGFyaXR5KGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X3JlY3ZwYXVzZShjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAyKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV94bWl0cGF1c2UoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMykKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfZW5lcmd5ZGV0ZWN0KGNvbmZpZ193b3JkKSBcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDQpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2Rvd25zaGlmdChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA1KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9jcm9zc292ZXIoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgNikKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfbGluayhjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAxMCkKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfcmVzb2x2ZWQoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMTEpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X3BhZ2VyY3ZkKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEyKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9kdXBsZXgoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMTMpCisKKy8qCisgKiBJbnRlcnJ1cHQgUmVnaXN0ZXIgZGVmaW5pdGlvbgorICogVGhpcyBkZWZpbml0aW9uIGFwcGxpZXMgdG8gcmVnaXN0ZXJzIDE4IGFuZCAxOSAoaW50IGVuYWJsZSBhbmQgaW50IHN0YXR1cykuCisgKiBCaXQgMCA6IGphYmJlcgorICogQml0IDEgOiBwb2xhcml0eV9jaGFuZ2VkCisgKiBCaXQgNCA6IGVuZXJneV9kZXRlY3QKKyAqIEJpdCA1IDogZG93bnNoaWZ0CisgKiBCaXQgNiA6IG1kaV94b3Zlcl9jaGFuZ2VkCisgKiBCaXQgNyA6IGZpZm9fb3Zlcl91bmRlcmZsb3cKKyAqIEJpdCA4IDogZmFsc2VfY2FycmllcgorICogQml0IDkgOiBzeW1ib2xfZXJyb3IKKyAqIEJpdCAxMDogbGlua19zdGF0dXNfY2hhbmdlZAorICogQml0IDExOiBhdXRvbmVnX2NvbXBsZXRlZAorICogQml0IDEyOiBwYWdlX3JlY2VpdmVkCisgKiBCaXQgMTM6IGR1cGxleF9jaGFuZ2VkCisgKiBCaXQgMTQ6IHNwZWVkX2NoYW5nZWQKKyAqIEJpdCAxNTogYXV0b25lZ19lcnJvcgorICovCisKKyNkZWZpbmUgbmV0eGVuX2dldF9waHlfaW50X2phYmJlcihjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAwKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfcG9sYXJpdHlfY2hhbmdlZChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAxKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZW5lcmd5X2RldGVjdChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA0KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZG93bnNoaWZ0KGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDUpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2ludF9tZGlfeG92ZXJfY2hhbmdlZChjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA2KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZmlmb19vdmVyX3VuZGVyZmxvdyhjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA3KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZmFsc2VfY2Fycmllcihjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCA4KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfc3ltYm9sX2Vycm9yKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDkpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2ludF9saW5rX3N0YXR1c19jaGFuZ2VkKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEwKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfYXV0b25lZ19jb21wbGV0ZWQoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMTEpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2ludF9wYWdlX3JlY2VpdmVkKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEyKQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfZHVwbGV4X2NoYW5nZWQoY29uZmlnX3dvcmQpCVwKKwkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMTMpCisjZGVmaW5lIG5ldHhlbl9nZXRfcGh5X2ludF9zcGVlZF9jaGFuZ2VkKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDE0KQorI2RlZmluZSBuZXR4ZW5fZ2V0X3BoeV9pbnRfYXV0b25lZ19lcnJvcihjb25maWdfd29yZCkJXAorCQlfbmV0eGVuX2NyYl9nZXRfYml0KGNvbmZpZ193b3JkLCAxNSkKKworI2RlZmluZSBuZXR4ZW5fc2V0X3BoeV9pbnRfbGlua19zdGF0dXNfY2hhbmdlZChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDEwLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fc2V0X3BoeV9pbnRfYXV0b25lZ19jb21wbGV0ZWQoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgxMSwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX3NldF9waHlfaW50X3NwZWVkX2NoYW5nZWQoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgxNCwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKworLyoKKyAqIE5JVSBNb2RlIFJlZ2lzdGVyLgorICogQml0IDAgOiBlbmFibGUgRmlicmVDaGFubmVsCisgKiBCaXQgMSA6IGVuYWJsZSAxMC8xMDAvMTAwMCBFdGhlcm5ldAorICogQml0IDIgOiBlbmFibGUgMTBHYiBFdGhlcm5ldAorICovCisKKyNkZWZpbmUgbmV0eGVuX2dldF9uaXVfZW5hYmxlX2dlKGNvbmZpZ193b3JkKQlcCisJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEpCisKKy8qIFByb21pc2NvdXMgbW9kZSBvcHRpb25zIChHYkUgbW9kZSBvbmx5KSAqLwordHlwZWRlZiBlbnVtIHsKKwlORVRYRU5fTklVX1BST01JU0NfTU9ERSA9IDAsCisJTkVUWEVOX05JVV9OT05fUFJPTUlTQ19NT0RFCit9IG5ldHhlbl9uaXVfcHJvbV9tb2RlX3Q7CisKKy8qCisgKiBOSVUgR0IgRHJvcCBDUkMgUmVnaXN0ZXIKKyAqIAorICogQml0IDAgOiBkcm9wX2diMCA9PiAxOmRyb3AgcGt0cyB3aXRoIGJhZCBDUkNzLCAwOnBhc3MgdGhlbSBvbgorICogQml0IDEgOiBkcm9wX2diMSA9PiAxOmRyb3AgcGt0cyB3aXRoIGJhZCBDUkNzLCAwOnBhc3MgdGhlbSBvbgorICogQml0IDIgOiBkcm9wX2diMiA9PiAxOmRyb3AgcGt0cyB3aXRoIGJhZCBDUkNzLCAwOnBhc3MgdGhlbSBvbgorICogQml0IDMgOiBkcm9wX2diMyA9PiAxOmRyb3AgcGt0cyB3aXRoIGJhZCBDUkNzLCAwOnBhc3MgdGhlbSBvbgorICovCisKKyNkZWZpbmUgbmV0eGVuX3NldF9nYl9kcm9wX2diMChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDAsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisjZGVmaW5lIG5ldHhlbl9zZXRfZ2JfZHJvcF9nYjEoY29uZmlnX3dvcmQpCVwKKwkJc2V0X2JpdCgxLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fc2V0X2diX2Ryb3BfZ2IyKGNvbmZpZ193b3JkKQlcCisJCXNldF9iaXQoMiwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX3NldF9nYl9kcm9wX2diMyhjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDMsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisKKyNkZWZpbmUgbmV0eGVuX2NsZWFyX2diX2Ryb3BfZ2IwKGNvbmZpZ193b3JkKQlcCisJCWNsZWFyX2JpdCgwLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorI2RlZmluZSBuZXR4ZW5fY2xlYXJfZ2JfZHJvcF9nYjEoY29uZmlnX3dvcmQpCVwKKwkJY2xlYXJfYml0KDEsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisjZGVmaW5lIG5ldHhlbl9jbGVhcl9nYl9kcm9wX2diMihjb25maWdfd29yZCkJXAorCQljbGVhcl9iaXQoMiwgKHVuc2lnbmVkIGxvbmcqKSZjb25maWdfd29yZCkKKyNkZWZpbmUgbmV0eGVuX2NsZWFyX2diX2Ryb3BfZ2IzKGNvbmZpZ193b3JkKQlcCisJCWNsZWFyX2JpdCgzLCAodW5zaWduZWQgbG9uZyopJmNvbmZpZ193b3JkKQorCisvKgorICogTklVIFhHIE1BQyBDb25maWcgUmVnaXN0ZXIKKyAqCisgKiBCaXQgMCA6IHR4X2VuYWJsZSA9PiAxOmVuYWJsZSBmcmFtZSB4bWl0LCAwOmRpc2FibGUKKyAqIEJpdCAyIDogcnhfZW5hYmxlID0+IDE6ZW5hYmxlIGZyYW1lIHJlY3YsIDA6ZGlzYWJsZQorICogQml0IDQgOiBzb2Z0X3Jlc2V0ID0+IDE6cmVzZXQgdGhlIE1BQyAsIDA6bm8tb3AKKyAqIEJpdCAyNzogeGF1aV9mcmFtZXJfcmVzZXQKKyAqIEJpdCAyODogeGF1aV9yeF9yZXNldAorICogQml0IDI5OiB4YXVpX3R4X3Jlc2V0CisgKiBCaXQgMzA6IHhnX2luZ3Jlc3NfYWZpZm9fcmVzZXQKKyAqIEJpdCAzMTogeGdfZWdyZXNzX2FmaWZvX3Jlc2V0CisgKi8KKworI2RlZmluZSBuZXR4ZW5feGdfc29mdF9yZXNldChjb25maWdfd29yZCkJXAorCQlzZXRfYml0KDQsICh1bnNpZ25lZCBsb25nKikmY29uZmlnX3dvcmQpCisKKy8qCisgKiBNQUMgQ29udHJvbCBSZWdpc3RlcgorICogCisgKiBCaXQgMC0xICAgOiBpZF9wb29sMAorICogQml0IDIgICAgIDogZW5hYmxlX3h0bmQwCisgKiBCaXQgNC01ICAgOiBpZF9wb29sMQorICogQml0IDYgICAgIDogZW5hYmxlX3h0bmQxCisgKiBCaXQgOC05ICAgOiBpZF9wb29sMgorICogQml0IDEwICAgIDogZW5hYmxlX3h0bmQyCisgKiBCaXQgMTItMTMgOiBpZF9wb29sMworICogQml0IDE0ICAgIDogZW5hYmxlX3h0bmQzCisgKiBCaXQgMjQtMjUgOiBtb2RlX3NlbGVjdAorICogQml0IDI4LTMxIDogZW5hYmxlX3Bvb2wKKyAqLworCisjZGVmaW5lIG5ldHhlbl9uaWNfbWNyX3NldF9pZF9wb29sMChjb25maWcsIHZhbCkJXAorCQkoKGNvbmZpZykgfD0gKCh2YWwpICYweDAzKSkKKyNkZWZpbmUgbmV0eGVuX25pY19tY3Jfc2V0X2VuYWJsZV94dG5kMChjb25maWcpCVwKKwkJKHNldF9iaXQoMywgKHVuc2lnbmVkIGxvbmcgKikmKGNvbmZpZykpKQorI2RlZmluZSBuZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDEoY29uZmlnLCB2YWwpCVwKKwkJKChjb25maWcpIHw9ICgoKHZhbCkgJiAweDAzKSA8PCA0KSkKKyNkZWZpbmUgbmV0eGVuX25pY19tY3Jfc2V0X2VuYWJsZV94dG5kMShjb25maWcpCVwKKwkJKHNldF9iaXQoNiwgKHVuc2lnbmVkIGxvbmcgKikmKGNvbmZpZykpKQorI2RlZmluZSBuZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDIoY29uZmlnLCB2YWwpCVwKKwkJKChjb25maWcpIHw9ICgoKHZhbCkgJiAweDAzKSA8PCA4KSkKKyNkZWZpbmUgbmV0eGVuX25pY19tY3Jfc2V0X2VuYWJsZV94dG5kMihjb25maWcpCVwKKwkJKHNldF9iaXQoMTAsICh1bnNpZ25lZCBsb25nICopJihjb25maWcpKSkKKyNkZWZpbmUgbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wzKGNvbmZpZywgdmFsKQlcCisJCSgoY29uZmlnKSB8PSAoKCh2YWwpICYgMHgwMykgPDwgMTIpKQorI2RlZmluZSBuZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQzKGNvbmZpZykJXAorCQkoc2V0X2JpdCgxNCwgKHVuc2lnbmVkIGxvbmcgKikmKGNvbmZpZykpKQorI2RlZmluZSBuZXR4ZW5fbmljX21jcl9zZXRfbW9kZV9zZWxlY3QoY29uZmlnLCB2YWwpCVwKKwkJKChjb25maWcpIHw9ICgoKHZhbCkgJiAweDAzKSA8PCAyNCkpCisjZGVmaW5lIG5ldHhlbl9uaWNfbWNyX3NldF9lbmFibGVfcG9vbChjb25maWcsIHZhbCkJXAorCQkoKGNvbmZpZykgfD0gKCgodmFsKSAmIDB4MGYpIDw8IDI4KSkKKworLyogU2V0IHByb21pc2N1b3VzIG1vZGUgZm9yIGEgR2JFIGludGVyZmFjZSAqLworaW50IG5ldHhlbl9uaXVfc2V0X3Byb21pc2N1b3VzX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCwKKwkJCQkgICAgbmV0eGVuX25pdV9wcm9tX21vZGVfdCBtb2RlKTsKK2ludCBuZXR4ZW5fbml1X3hnX3NldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgICAgaW50IHBvcnQsIG5ldHhlbl9uaXVfcHJvbV9tb2RlX3QgbW9kZSk7CisKKy8qIGdldC9zZXQgdGhlIE1BQyBhZGRyZXNzIGZvciBhIGdpdmVuIE1BQyAqLworaW50IG5ldHhlbl9uaXVfbWFjYWRkcl9nZXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCwKKwkJCSAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKiBhZGRyKTsKK2ludCBuZXR4ZW5fbml1X21hY2FkZHJfc2V0KHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCwKKwkJCSAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgYWRkcik7CisKKy8qIFhHIHZlcnNvbnMgKi8KK2ludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfZ2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQsCisJCQkgICAgICBuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90ICogYWRkcik7CitpbnQgbmV0eGVuX25pdV94Z19tYWNhZGRyX3NldChzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQsCisJCQkgICAgICBuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90IGFkZHIpOworCisvKiBHZW5lcmljIGVuYWJsZSBmb3IgR2JFIHBvcnRzLiBXaWxsIGRldGVjdCB0aGUgc3BlZWQgb2YgdGhlIGxpbmsuICovCitpbnQgbmV0eGVuX25pdV9nYmVfaW5pdF9wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpOworCitpbnQgbmV0eGVuX25pdV94Z19pbml0X3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCk7CisKKy8qIERpc2FibGUgYSBHYkUgaW50ZXJmYWNlICovCitpbnQgbmV0eGVuX25pdV9kaXNhYmxlX2diZV9wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpOworCitpbnQgbmV0eGVuX25pdV9kaXNhYmxlX3hnX3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCk7CisKKyNlbmRpZgkJCQkvKiBfX05FVFhFTl9OSUNfSFdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njk3MjVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCkBAIC0wLDAgKzEsMTUyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKgorICoKKyAqIFNvdXJjZSBmaWxlIGZvciBOSUMgcm91dGluZXMgdG8gaW5pdGlhbGl6ZSB0aGUgUGhhbnRvbSBIYXJkd2FyZQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJuZXR4ZW5fbmljLmgiCisjaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgorI2luY2x1ZGUgIm5ldHhlbl9uaWNfaW9jdGwuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX3BoYW5fcmVnLmgiCisKK3N0cnVjdCBjcmJfYWRkcl9wYWlyIHsKKwlsb25nIGFkZHI7CisJbG9uZyBkYXRhOworfTsKKworI2RlZmluZSBORVRYRU5fTUFYX0NSQl9YRk9STSA2MAorc3RhdGljIHVuc2lnbmVkIGludCBjcmJfYWRkcl94Zm9ybVtORVRYRU5fTUFYX0NSQl9YRk9STV07CisjZGVmaW5lIE5FVFhFTl9BRERSX0VSUk9SICgodW5zaWduZWQgbG9uZyApIDB4ZmZmZmZmZmYgKQorCisjZGVmaW5lIGNyYl9hZGRyX3RyYW5zZm9ybShuYW1lKSBcCisJY3JiX2FkZHJfeGZvcm1bTkVUWEVOX0hXX1BYX01BUF9DUkJfIyNuYW1lXSA9IFwKKwlORVRYRU5fSFdfQ1JCX0hVQl9BR1RfQURSXyMjbmFtZSA8PCAyMAorCisjZGVmaW5lIE5FVFhFTl9OSUNfWERNQV9SRVNFVCAweDgwMDBmZgorCitzdGF0aWMgaW5saW5lIHZvaWQKK25ldHhlbl9uaWNfbG9ja2VkX3dyaXRlX3JlZyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgdW5zaWduZWQgbG9uZyBvZmYsIGludCAqZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgb2ZmKTsKKwl3cml0ZWwoKmRhdGEsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBjcmJfYWRkcl90cmFuc2Zvcm1fc2V0dXAodm9pZCkKK3sKKwljcmJfYWRkcl90cmFuc2Zvcm0oWERNQSk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFRJTVIpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTUkUpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTUU4zKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oU1FOMik7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFNRTjEpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTUU4wKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oU1FTMyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFNRUzIpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTUVMxKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oU1FTMCk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVg3KTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUlBNWDYpOworCWNyYl9hZGRyX3RyYW5zZm9ybShSUE1YNSk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVg0KTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUlBNWDMpOworCWNyYl9hZGRyX3RyYW5zZm9ybShSUE1YMik7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFJQTVgxKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUlBNWDApOworCWNyYl9hZGRyX3RyYW5zZm9ybShST01VU0IpOworCWNyYl9hZGRyX3RyYW5zZm9ybShTTik7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFFNTik7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFFNUyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBHTkkpOworCWNyYl9hZGRyX3RyYW5zZm9ybShQR05EKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEdOMyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBHTjIpOworCWNyYl9hZGRyX3RyYW5zZm9ybShQR04xKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEdOMCk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBHU0kpOworCWNyYl9hZGRyX3RyYW5zZm9ybShQR1NEKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEdTMyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBHUzIpOworCWNyYl9hZGRyX3RyYW5zZm9ybShQR1MxKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEdTMCk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKFBTKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oUEgpOworCWNyYl9hZGRyX3RyYW5zZm9ybShOSVUpOworCWNyYl9hZGRyX3RyYW5zZm9ybShJMlEpOworCWNyYl9hZGRyX3RyYW5zZm9ybShFRyk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKE1OKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oTVMpOworCWNyYl9hZGRyX3RyYW5zZm9ybShDQVMyKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oQ0FTMSk7CisJY3JiX2FkZHJfdHJhbnNmb3JtKENBUzApOworCWNyYl9hZGRyX3RyYW5zZm9ybShDQU0pOworCWNyYl9hZGRyX3RyYW5zZm9ybShDMkMxKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oQzJDMCk7Cit9CisKK2ludCBuZXR4ZW5faW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHN0YXRlID0gMCwgbG9vcHMgPSAwLCBlcnIgPSAwOworCisJLyogV2luZG93IDEgY2FsbCAqLworCXN0YXRlID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRFBFR19TVEFURSkpOworCisJaWYgKHN0YXRlID09IFBIQU5fSU5JVElBTElaRV9BQ0spCisJCXJldHVybiAwOworCisJd2hpbGUgKHN0YXRlICE9IFBIQU5fSU5JVElBTElaRV9DT01QTEVURSAmJiBsb29wcyA8IDIwMDApIHsKKwkJdWRlbGF5KDEwMCk7CisJCS8qIFdpbmRvdyAxIGNhbGwgKi8KKwkJc3RhdGUgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFKSk7CisKKwkJbG9vcHMrKzsKKwl9CisJaWYgKGxvb3BzID49IDIwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDbWQgUGVnIGluaXRpYWxpemF0aW9uIG5vdCBjb21wbGV0ZToleC5cbiIsCisJCSAgICAgICBzdGF0ZSk7CisJCWVyciA9IC1FSU87CisJCXJldHVybiBlcnI7CisJfQorCS8qIFdpbmRvdyAxIGNhbGwgKi8KKwl3cml0ZWwoTVBPUlRfU0lOR0xFX0ZVTkNUSU9OX01PREUsCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9NUE9SVF9NT0RFKSk7CisJd3JpdGVsKFBIQU5fSU5JVElBTElaRV9BQ0ssCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DTURQRUdfU1RBVEUpKTsKKworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgTkVUWEVOX0FERFJfTElNSVQgMHhmZmZmZmZmZlVMTAorCit2b2lkICpuZXR4ZW5fYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzeiwgZG1hX2FkZHJfdCAqIHB0ciwKKwkJICAgc3RydWN0IHBjaV9kZXYgKip1c2VkX2RldikKK3sKKwl2b2lkICphZGRyOworCisJYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHN6LCBwdHIpOworCWlmICgodW5zaWduZWQgbG9uZyBsb25nKSgqcHRyKSA8IE5FVFhFTl9BRERSX0xJTUlUKSB7CisJCSp1c2VkX2RldiA9IHBkZXY7CisJCXJldHVybiBhZGRyOworCX0KKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHN6LCBhZGRyLCAqcHRyKTsKKwlhZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoTlVMTCwgc3osIHB0cik7CisJKnVzZWRfZGV2ID0gTlVMTDsKKwlyZXR1cm4gYWRkcjsKK30KKwordm9pZCBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX3N3KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgY3R4aWQsIHJpbmc7CisJdTMyIGk7CisJdTMyIG51bV9yeF9idWZzID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCAqcmN2X2Rlc2M7CisKKwlEUFJJTlRLKElORk8sICJpbml0aWFsaXppbmcgc29tZSBxdWV1ZXM6ICVwXG4iLCBhZGFwdGVyKTsKKwlmb3IgKGN0eGlkID0gMDsgY3R4aWQgPCBNQVhfUkNWX0NUWDsgKytjdHhpZCkgeworCQlmb3IgKHJpbmcgPSAwOyByaW5nIDwgTlVNX1JDVl9ERVNDX1JJTkdTOyByaW5nKyspIHsKKwkJCXN0cnVjdCBuZXR4ZW5fcnhfYnVmZmVyICpyeF9idWY7CisJCQlyY3ZfZGVzYyA9ICZhZGFwdGVyLT5yZWN2X2N0eFtjdHhpZF0ucmN2X2Rlc2NbcmluZ107CisJCQlyY3ZfZGVzYy0+cmN2X2ZyZWUgPSByY3ZfZGVzYy0+bWF4X3J4X2Rlc2NfY291bnQ7CisJCQlyY3ZfZGVzYy0+YmVnaW5fYWxsb2MgPSAwOworCQkJcnhfYnVmID0gcmN2X2Rlc2MtPnJ4X2J1Zl9hcnI7CisJCQludW1fcnhfYnVmcyA9IHJjdl9kZXNjLT5tYXhfcnhfZGVzY19jb3VudDsKKwkJCS8qCisJCQkgKiBOb3cgZ28gdGhyb3VnaCBhbGwgb2YgdGhlbSwgc2V0IHJlZmVyZW5jZSBoYW5kbGVzCisJCQkgKiBhbmQgcHV0IHRoZW0gaW4gdGhlIHF1ZXVlcy4KKwkJCSAqLworCQkJZm9yIChpID0gMDsgaSA8IG51bV9yeF9idWZzOyBpKyspIHsKKwkJCQlyeF9idWYtPnJlZl9oYW5kbGUgPSBpOworCQkJCXJ4X2J1Zi0+c3RhdGUgPSBORVRYRU5fQlVGRkVSX0ZSRUU7CisJCQkJRFBSSU5USyhJTkZPLCAiUnggYnVmOmN0eCVkIGkoJWQpIHJ4X2J1ZjoiCisJCQkJCSIlcFxuIiwgY3R4aWQsIGksIHJ4X2J1Zik7CisJCQkJcnhfYnVmKys7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgbmV0eGVuX2luaXRpYWxpemVfYWRhcHRlcl9odyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHBvcnRzID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX2JvYXJkX2luZm8gKmJvYXJkX2luZm8gPSAmKGFkYXB0ZXItPmFody5ib2FyZGNmZyk7CisKKwlpZiAobmV0eGVuX25pY19nZXRfYm9hcmRfaW5mbyhhZGFwdGVyKSAhPSAwKQorCQlwcmludGsoIiVzOiBFcnJvciBnZXR0aW5nIGJvYXJkIGNvbmZpZyBpbmZvLlxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCWdldF9icmRfcG9ydF9ieV90eXBlKGJvYXJkX2luZm8tPmJvYXJkX3R5cGUsICZwb3J0cyk7CisJaWYgKHBvcnRzID09IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVua25vd24gYm9hcmQgdHlwZVxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCWFkYXB0ZXItPmFody5tYXhfcG9ydHMgPSBwb3J0czsKK30KKwordm9pZCBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX29wcyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3dpdGNoIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSkgeworCWNhc2UgTkVUWEVOX05JQ19HQkU6CisJCWFkYXB0ZXItPmVuYWJsZV9waHlfaW50ZXJydXB0cyA9CisJCSAgICBuZXR4ZW5fbml1X2diZV9lbmFibGVfcGh5X2ludGVycnVwdHM7CisJCWFkYXB0ZXItPmRpc2FibGVfcGh5X2ludGVycnVwdHMgPQorCQkgICAgbmV0eGVuX25pdV9nYmVfZGlzYWJsZV9waHlfaW50ZXJydXB0czsKKwkJYWRhcHRlci0+aGFuZGxlX3BoeV9pbnRyID0gbmV0eGVuX25pY19nYmVfaGFuZGxlX3BoeV9pbnRyOworCQlhZGFwdGVyLT5tYWNhZGRyX3NldCA9IG5ldHhlbl9uaXVfbWFjYWRkcl9zZXQ7CisJCWFkYXB0ZXItPnNldF9tdHUgPSBuZXR4ZW5fbmljX3NldF9tdHVfZ2I7CisJCWFkYXB0ZXItPnNldF9wcm9taXNjID0gbmV0eGVuX25pdV9zZXRfcHJvbWlzY3VvdXNfbW9kZTsKKwkJYWRhcHRlci0+dW5zZXRfcHJvbWlzYyA9IG5ldHhlbl9uaXVfc2V0X3Byb21pc2N1b3VzX21vZGU7CisJCWFkYXB0ZXItPnBoeV9yZWFkID0gbmV0eGVuX25pdV9nYmVfcGh5X3JlYWQ7CisJCWFkYXB0ZXItPnBoeV93cml0ZSA9IG5ldHhlbl9uaXVfZ2JlX3BoeV93cml0ZTsKKwkJYWRhcHRlci0+aW5pdF9wb3J0ID0gbmV0eGVuX25pdV9nYmVfaW5pdF9wb3J0OworCQlhZGFwdGVyLT5pbml0X25pdSA9IG5ldHhlbl9uaWNfaW5pdF9uaXVfZ2I7CisJCWFkYXB0ZXItPnN0b3BfcG9ydCA9IG5ldHhlbl9uaXVfZGlzYWJsZV9nYmVfcG9ydDsKKwkJYnJlYWs7CisKKwljYXNlIE5FVFhFTl9OSUNfWEdCRToKKwkJYWRhcHRlci0+ZW5hYmxlX3BoeV9pbnRlcnJ1cHRzID0KKwkJICAgIG5ldHhlbl9uaXVfeGdiZV9lbmFibGVfcGh5X2ludGVycnVwdHM7CisJCWFkYXB0ZXItPmRpc2FibGVfcGh5X2ludGVycnVwdHMgPQorCQkgICAgbmV0eGVuX25pdV94Z2JlX2Rpc2FibGVfcGh5X2ludGVycnVwdHM7CisJCWFkYXB0ZXItPmhhbmRsZV9waHlfaW50ciA9IG5ldHhlbl9uaWNfeGdiZV9oYW5kbGVfcGh5X2ludHI7CisJCWFkYXB0ZXItPm1hY2FkZHJfc2V0ID0gbmV0eGVuX25pdV94Z19tYWNhZGRyX3NldDsKKwkJYWRhcHRlci0+c2V0X210dSA9IG5ldHhlbl9uaWNfc2V0X210dV94Z2I7CisJCWFkYXB0ZXItPmluaXRfcG9ydCA9IG5ldHhlbl9uaXVfeGdfaW5pdF9wb3J0OworCQlhZGFwdGVyLT5zZXRfcHJvbWlzYyA9IG5ldHhlbl9uaXVfeGdfc2V0X3Byb21pc2N1b3VzX21vZGU7CisJCWFkYXB0ZXItPnVuc2V0X3Byb21pc2MgPSBuZXR4ZW5fbml1X3hnX3NldF9wcm9taXNjdW91c19tb2RlOworCQlhZGFwdGVyLT5zdG9wX3BvcnQgPSBuZXR4ZW5fbml1X2Rpc2FibGVfeGdfcG9ydDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBuZXR4ZW5fZGVjb2RlX2NyYl9hZGRyKDAgLSB1dGlsaXR5IHRvIHRyYW5zbGF0ZSBmcm9tIGludGVybmFsIFBoYW50b20gQ1JCCisgKiBhZGRyZXNzIHRvIGV4dGVybmFsIFBDSSBDUkIgYWRkcmVzcy4KKyAqLwordW5zaWduZWQgbG9uZyBuZXR4ZW5fZGVjb2RlX2NyYl9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgb2Zmc2V0LCBwY2lfYmFzZTsKKworCWNyYl9hZGRyX3RyYW5zZm9ybV9zZXR1cCgpOworCisJcGNpX2Jhc2UgPSBORVRYRU5fQUREUl9FUlJPUjsKKwliYXNlX2FkZHIgPSBhZGRyICYgMHhmZmYwMDAwMDsKKwlvZmZzZXQgPSBhZGRyICYgMHgwMDBmZmZmZjsKKworCWZvciAoaSA9IDA7IGkgPCBORVRYRU5fTUFYX0NSQl9YRk9STTsgaSsrKSB7CisJCWlmIChjcmJfYWRkcl94Zm9ybVtpXSA9PSBiYXNlX2FkZHIpIHsKKwkJCXBjaV9iYXNlID0gaSA8PCAyMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChwY2lfYmFzZSA9PSBORVRYRU5fQUREUl9FUlJPUikKKwkJcmV0dXJuIHBjaV9iYXNlOworCWVsc2UKKwkJcmV0dXJuIChwY2lfYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBsb25nIHJvbV9tYXhfdGltZW91dCA9IDEwMDAwOworc3RhdGljIGxvbmcgcm9tX2xvY2tfdGltZW91dCA9IDEwMDAwMDA7CisKK3N0YXRpYyBpbmxpbmUgaW50IHJvbV9sb2NrKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaXRlcjsKKwl1MzIgZG9uZSA9IDA7CisJaW50IHRpbWVvdXQgPSAwOworCisJd2hpbGUgKCFkb25lKSB7CisJCS8qIGFjcXVpcmUgc2VtYXBob3JlMiBmcm9tIFBDSSBIVyBibG9jayAqLworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX1BDSUVfUkVHKFBDSUVfU0VNMl9MT0NLKSwKKwkJCQkgICAmZG9uZSk7CisJCWlmIChkb25lID09IDEpCisJCQlicmVhazsKKwkJaWYgKHRpbWVvdXQgPj0gcm9tX2xvY2tfdGltZW91dCkKKwkJCXJldHVybiAtRUlPOworCisJCXRpbWVvdXQrKzsKKwkJLyoKKwkJICogWWllbGQgQ1BVCisJCSAqLworCQlpZiAoIWluX2F0b21pYygpKQorCQkJc2NoZWR1bGUoKTsKKwkJZWxzZSB7CisJCQlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgMjA7IGl0ZXIrKykKKwkJCQljcHVfcmVsYXgoKTsJLypUaGlzIGEgbm9wIGluc3RyIG9uIGkzODYgKi8KKwkJfQorCX0KKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NX0xPQ0tfSUQsIFJPTV9MT0NLX0RSSVZFUik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXR4ZW5fd2FpdF9yb21fZG9uZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJbG9uZyB0aW1lb3V0ID0gMDsKKwlsb25nIGRvbmUgPSAwOworCisJd2hpbGUgKGRvbmUgPT0gMCkgeworCQlkb25lID0gbmV0eGVuX25pY19yZWdfcmVhZChhZGFwdGVyLCBORVRYRU5fUk9NVVNCX0dMQl9TVEFUVVMpOworCQlkb25lICY9IDI7CisJCXRpbWVvdXQrKzsKKwkJaWYgKHRpbWVvdXQgPj0gcm9tX21heF90aW1lb3V0KSB7CisJCQlwcmludGsoIlRpbWVvdXQgcmVhY2hlZCAgd2FpdGluZyBmb3Igcm9tIGRvbmUiKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXR4ZW5fcm9tX3dyZW4oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIFNldCB3cml0ZSBlbmFibGUgbGF0Y2ggaW4gUk9NIHN0YXR1cyByZWdpc3RlciAqLworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMCk7CisJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLAorCQkJICAgICBNMjVQX0lOU1RSX1dSRU4pOworCWlmIChuZXR4ZW5fd2FpdF9yb21fZG9uZShhZGFwdGVyKSkgeworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBuZXR4ZW5fcmRjcmJyZWcoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YSA9IDB4ZGVhZGRlYWQ7CisJZGF0YSA9IG5ldHhlbl9uaWNfcmVnX3JlYWQoYWRhcHRlciwgYWRkcik7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5ldHhlbl9kb19yb21fcmRzcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLAorCQkJICAgICBNMjVQX0lOU1RSX1JEU1IpOworCWlmIChuZXR4ZW5fd2FpdF9yb21fZG9uZShhZGFwdGVyKSkgeworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBuZXR4ZW5fcmRjcmJyZWcoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fUkRBVEEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0eGVuX3JvbV91bmxvY2soc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB2YWw7CisKKwkvKiByZWxlYXNlIHNlbWFwaG9yZTIgKi8KKwluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX1BDSUVfUkVHKFBDSUVfU0VNMl9VTkxPQ0spLCAmdmFsKTsKKworfQorCitpbnQgbmV0eGVuX3JvbV93aXBfcG9sbChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJbG9uZyB0aW1lb3V0ID0gMDsKKwlsb25nIHdpcCA9IDE7CisJaW50IHZhbDsKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BQllURV9DTlQsIDApOworCXdoaWxlICh3aXAgIT0gMCkgeworCQl2YWwgPSBuZXR4ZW5fZG9fcm9tX3Jkc3IoYWRhcHRlcik7CisJCXdpcCA9IHZhbCAmIDE7CisJCXRpbWVvdXQrKzsKKwkJaWYgKHRpbWVvdXQgPiByb21fbWF4X3RpbWVvdXQpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG9fcm9tX2Zhc3Rfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwKKwkJCQkgICAgaW50IGRhdGEpCit7CisJaWYgKG5ldHhlbl9yb21fd3JlbihhZGFwdGVyKSkgeworCQlyZXR1cm4gLTE7CisJfQorCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX1dEQVRBLCBkYXRhKTsKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BRERSRVNTLCBhZGRyKTsKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9BQllURV9DTlQsIDMpOworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0lOU1RSX09QQ09ERSwKKwkJCSAgICAgTTI1UF9JTlNUUl9QUCk7CisJaWYgKG5ldHhlbl93YWl0X3JvbV9kb25lKGFkYXB0ZXIpKSB7CisJCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gbmV0eGVuX3JvbV93aXBfcG9sbChhZGFwdGVyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2RvX3JvbV9mYXN0X3JlYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50ICp2YWxwKQoreworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FERFJFU1MsIGFkZHIpOworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMyk7CisJdWRlbGF5KDEwMCk7CQkvKiBwcmV2ZW50IGJ1cnN0aW5nIG9uIENSQiAqLworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0RVTU1ZX0JZVEVfQ05ULCAwKTsKKwluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9JTlNUUl9PUENPREUsIDB4Yik7CisJaWYgKG5ldHhlbl93YWl0X3JvbV9kb25lKGFkYXB0ZXIpKSB7CisJCXByaW50aygiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLyogcmVzZXQgYWJ5dGVfY250IGFuZCBkdW1teV9ieXRlX2NudCAqLworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMCk7CisJdWRlbGF5KDEwMCk7CQkvKiBwcmV2ZW50IGJ1cnN0aW5nIG9uIENSQiAqLworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0RVTU1ZX0JZVEVfQ05ULCAwKTsKKworCSp2YWxwID0gbmV0eGVuX25pY19yZWdfcmVhZChhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9SREFUQSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXR4ZW5fcm9tX2Zhc3RfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQgKnZhbHApCit7CisJaW50IHJldDsKKworCWlmIChyb21fbG9jayhhZGFwdGVyKSAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGRvX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgYWRkciwgdmFscCk7CisJbmV0eGVuX3JvbV91bmxvY2soYWRhcHRlcik7CisJcmV0dXJuIHJldDsKK30KKworaW50IG5ldHhlbl9yb21fZmFzdF93cml0ZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQgZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChyb21fbG9jayhhZGFwdGVyKSAhPSAwKSB7CisJCXJldHVybiAtMTsKKwl9CisJcmV0ID0gZG9fcm9tX2Zhc3Rfd3JpdGUoYWRhcHRlciwgYWRkciwgZGF0YSk7CisJbmV0eGVuX3JvbV91bmxvY2soYWRhcHRlcik7CisJcmV0dXJuIHJldDsKK30KK2ludCBuZXR4ZW5fZG9fcm9tX3NlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIpCit7CisJbmV0eGVuX3JvbV93cmVuKGFkYXB0ZXIpOworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FERFJFU1MsIGFkZHIpOworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMyk7CisJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLAorCQkJICAgICBNMjVQX0lOU1RSX1NFKTsKKwlpZiAobmV0eGVuX3dhaXRfcm9tX2RvbmUoYWRhcHRlcikpIHsKKwkJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fQUJZVEVfQ05ULCAwKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gbmV0eGVuX3JvbV93aXBfcG9sbChhZGFwdGVyKTsKK30KKworaW50IG5ldHhlbl9yb21fc2Uoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAocm9tX2xvY2soYWRhcHRlcikgIT0gMCkgeworCQlyZXR1cm4gLTE7CisJfQorCXJldCA9IG5ldHhlbl9kb19yb21fc2UoYWRhcHRlciwgYWRkcik7CisJbmV0eGVuX3JvbV91bmxvY2soYWRhcHRlcik7CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBORVRYRU5fQk9BUkRUWVBFCQkweDQwMDgKKyNkZWZpbmUgTkVUWEVOX0JPQVJETlVNIAkJMHg0MDBjCisjZGVmaW5lIE5FVFhFTl9DSElQTlVNCQkJMHg0MDEwCisjZGVmaW5lIE5FVFhFTl9ST01CVVNfUkVTRVQJCTB4RkZGRkZGRkYKKyNkZWZpbmUgTkVUWEVOX1JPTV9GSVJTVF9CQVJSSUVSCTB4ODAwMDAwMDAwVUxMCisjZGVmaW5lIE5FVFhFTl9ST01fRk9VTkRfSU5JVAkJMHg0MDAKKworaW50IG5ldHhlbl9waW5pdF9mcm9tX3JvbShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCB2ZXJib3NlKQoreworCWludCBhZGRyLCB2YWwsIHN0YXR1czsKKwlpbnQgbiwgaTsKKwlpbnQgaW5pdF9kZWxheSA9IDA7CisJc3RydWN0IGNyYl9hZGRyX3BhaXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIG9mZjsKKworCS8qIHJlc2V0YWxsICovCisJc3RhdHVzID0gbmV0eGVuX25pY19nZXRfYm9hcmRfaW5mbyhhZGFwdGVyKTsKKwlpZiAoc3RhdHVzKQorCQlwcmludGsoIiVzOiBuZXR4ZW5fcGluaXRfZnJvbV9yb206IEVycm9yIGdldHRpbmcgYm9hcmQgaW5mb1xuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfR0xCX1NXX1JFU0VULAorCQkJCSAgICBORVRYRU5fUk9NQlVTX1JFU0VUKTsKKworCWlmICh2ZXJib3NlKSB7CisJCWludCB2YWw7CisJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCBORVRYRU5fQk9BUkRUWVBFLCAmdmFsKSA9PSAwKQorCQkJcHJpbnRrKCJQMiBST00gYm9hcmQgdHlwZTogMHglMDh4XG4iLCB2YWwpOworCQllbHNlCisJCQlwcmludGsoIkNvdWxkIG5vdCByZWFkIGJvYXJkIHR5cGVcbiIpOworCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgTkVUWEVOX0JPQVJETlVNLCAmdmFsKSA9PSAwKQorCQkJcHJpbnRrKCJQMiBST00gYm9hcmQgIG51bTogMHglMDh4XG4iLCB2YWwpOworCQllbHNlCisJCQlwcmludGsoIkNvdWxkIG5vdCByZWFkIGJvYXJkIG51bWJlclxuIik7CisJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCBORVRYRU5fQ0hJUE5VTSwgJnZhbCkgPT0gMCkKKwkJCXByaW50aygiUDIgUk9NIGNoaXAgICBudW06IDB4JTA4eFxuIiwgdmFsKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJDb3VsZCBub3QgcmVhZCBjaGlwIG51bWJlclxuIik7CisJfQorCisJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIDAsICZuKSA9PSAwCisJICAgICYmIChuICYgTkVUWEVOX1JPTV9GSVJTVF9CQVJSSUVSKSkgeworCQluICY9IH5ORVRYRU5fUk9NX1JPVU5EVVA7CisJCWlmIChuIDwgTkVUWEVOX1JPTV9GT1VORF9JTklUKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludGsoIiVzOiAlZCBDUkIgaW5pdCB2YWx1ZXMgZm91bmQiCisJCQkJICAgICAgICIgaW4gUk9NLlxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIiVzOm49MHgleCBFcnJvciEgTmV0WGVuIGNhcmQgZmxhc2ggbm90IgorCQkJICAgICAgICIgaW5pdGlhbGl6ZWQuXG4iLCBfX0ZVTkNUSU9OX18sIG4pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnVmID0ga2NhbGxvYyhuLCBzaXplb2Yoc3RydWN0IGNyYl9hZGRyX3BhaXIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCQlwcmludGsoIiVzOiBuZXR4ZW5fcGluaXRfZnJvbV9yb206IFVuYWJsZSB0byBjYWxsb2MgIgorCQkJICAgICAgICJtZW1vcnkuXG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCA4ICogaSArIDQsICZ2YWwpICE9IDAKKwkJCSAgICB8fCBuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCA4ICogaSArIDgsCisJCQkJCQkgICAgJmFkZHIpICE9IDApCisJCQkJcmV0dXJuIC1FSU87CisKKwkJCWJ1ZltpXS5hZGRyID0gYWRkcjsKKwkJCWJ1ZltpXS5kYXRhID0gdmFsOworCisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludGsoIiVzOiBQQ0k6ICAgICAweCUwOHggPT0gMHglMDh4XG4iLAorCQkJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCAodW5zaWduZWQgaW50KQorCQkJCSAgICAgICBuZXR4ZW5fZGVjb2RlX2NyYl9hZGRyKCh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICAgIGFkZHIpLCB2YWwpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKworCQkJb2ZmID0KKwkJCSAgICBuZXR4ZW5fZGVjb2RlX2NyYl9hZGRyKCh1bnNpZ25lZCBsb25nKWJ1ZltpXS5hZGRyKSArCisJCQkgICAgTkVUWEVOX1BDSV9DUkJTUEFDRTsKKwkJCS8qIHNraXBwaW5nIGNvbGQgcmVib290IE1BR0lDICovCisJCQlpZiAob2ZmID09IE5FVFhFTl9DQU1fUkFNKDB4MWZjKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogQWZ0ZXIgd3JpdGluZyB0aGlzIHJlZ2lzdGVyLCBIVyBuZWVkcyB0aW1lIGZvciBDUkIgKi8KKwkJCS8qIHRvIHF1aWV0IGRvd24gKGVsc2UgY3JiX3dpbmRvdyByZXR1cm5zIDB4ZmZmZmZmZmYpICovCisJCQlpZiAob2ZmID09IE5FVFhFTl9ST01VU0JfR0xCX1NXX1JFU0VUKSB7CisJCQkJaW5pdF9kZWxheSA9IDE7CisJCQkJLyogaG9sZCB4ZG1hIGluIHJlc2V0IGFsc28gKi8KKwkJCQlidWZbaV0uZGF0YSA9IE5FVFhFTl9OSUNfWERNQV9SRVNFVDsKKwkJCX0KKworCQkJaWYgKEFERFJfSU5fV0lORE9XMShvZmYpKSB7CisJCQkJd3JpdGVsKGJ1ZltpXS5kYXRhLAorCQkJCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBvZmYpKTsKKwkJCX0gZWxzZSB7CisJCQkJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAwKTsKKwkJCQl3cml0ZWwoYnVmW2ldLmRhdGEsCisJCQkJICAgICAgIHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBvZmYpKTsKKworCQkJCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7CisJCQl9CisJCQlpZiAoaW5pdF9kZWxheSA9PSAxKSB7CisJCQkJc3NsZWVwKDEpOworCQkJCWluaXRfZGVsYXkgPSAwOworCQkJfQorCQkJbXNsZWVwKDEpOworCQl9CisJCWtmcmVlKGJ1Zik7CisKKwkJLyogZGlzYWJsZV9wZWdfY2FjaGVfYWxsICovCisKKwkJLyogdW5yZXNldF9uZXRfY2FjaGUgKi8KKwkJbmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfR0xCX1NXX1JFU0VULCAmdmFsLAorCQkJCSAgICAgIDQpOworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9HTEJfU1dfUkVTRVQsCisJCQkJCSAgICAodmFsICYgMHhmZmZmZmYwZikpOworCQkvKiBwMmRuIHJlcGx5Q291bnQgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJCSAgICBORVRYRU5fQ1JCX1BFR19ORVRfRCArIDB4ZWMsIDB4MWUpOworCQkvKiBkaXNhYmxlX3BlZ19jYWNoZSAwICovCisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX0NSQl9QRUdfTkVUX0QgKyAweDRjLCA4KTsKKwkJLyogZGlzYWJsZV9wZWdfY2FjaGUgMSAqLworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9DUkJfUEVHX05FVF9JICsgMHg0YywgOCk7CisKKwkJLyogcGVnX2Nscl9hbGwgKi8KKworCQkvKiBwZWdfY2xyIDAgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9DUkJfUEVHX05FVF8wICsgMHg4LAorCQkJCQkgICAgMCk7CisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fQ1JCX1BFR19ORVRfMCArIDB4YywKKwkJCQkJICAgIDApOworCQkvKiBwZWdfY2xyIDEgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9DUkJfUEVHX05FVF8xICsgMHg4LAorCQkJCQkgICAgMCk7CisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fQ1JCX1BFR19ORVRfMSArIDB4YywKKwkJCQkJICAgIDApOworCQkvKiBwZWdfY2xyIDIgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9DUkJfUEVHX05FVF8yICsgMHg4LAorCQkJCQkgICAgMCk7CisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fQ1JCX1BFR19ORVRfMiArIDB4YywKKwkJCQkJICAgIDApOworCQkvKiBwZWdfY2xyIDMgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9DUkJfUEVHX05FVF8zICsgMHg4LAorCQkJCQkgICAgMCk7CisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fQ1JCX1BFR19ORVRfMyArIDB4YywKKwkJCQkJICAgIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfb2ZmbG9hZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDY0X3QgYWRkcjsKKwl1aW50MzJfdCBoaTsKKwl1aW50MzJfdCBsbzsKKworCWFkYXB0ZXItPmR1bW15X2RtYS5hZGRyID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+YWh3LnBkZXYsCisJCQkJIE5FVFhFTl9IT1NUX0RVTU1ZX0RNQV9TSVpFLAorCQkJCSAmYWRhcHRlci0+ZHVtbXlfZG1hLnBoeXNfYWRkcik7CisJaWYgKGFkYXB0ZXItPmR1bW15X2RtYS5hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBkdW1teSBETUEgbWVtb3J5XG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWRkciA9ICh1aW50NjRfdCkgYWRhcHRlci0+ZHVtbXlfZG1hLnBoeXNfYWRkcjsKKwloaSA9IChhZGRyID4+IDMyKSAmIDB4ZmZmZmZmZmY7CisJbG8gPSBhZGRyICYgMHhmZmZmZmZmZjsKKworCXdyaXRlbChoaSwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0hPU1RfRFVNTVlfQlVGX0FERFJfSEkpKTsKKwl3cml0ZWwobG8sIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9IT1NUX0RVTU1ZX0JVRl9BRERSX0xPKSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZXR4ZW5fZnJlZV9hZGFwdGVyX29mZmxvYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWlmIChhZGFwdGVyLT5kdW1teV9kbWEuYWRkcikgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPmFody5wZGV2LAorCQkJCSAgICBORVRYRU5fSE9TVF9EVU1NWV9ETUFfU0laRSwKKwkJCQkgICAgYWRhcHRlci0+ZHVtbXlfZG1hLmFkZHIsCisJCQkJICAgIGFkYXB0ZXItPmR1bW15X2RtYS5waHlzX2FkZHIpOworCQlhZGFwdGVyLT5kdW1teV9kbWEuYWRkciA9IE5VTEw7CisJfQorfQorCit2b2lkIG5ldHhlbl9waGFudG9tX2luaXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcGVndHVuZV92YWwpCit7CisJdTMyIHZhbCA9IDA7CisJaW50IGxvb3BzID0gMDsKKworCWlmICghcGVndHVuZV92YWwpIHsKKwkJd2hpbGUgKHZhbCAhPSBQSEFOX0lOSVRJQUxJWkVfQ09NUExFVEUgJiYgbG9vcHMgPCAyMDAwMDApIHsKKwkJCXVkZWxheSgxMDApOworCQkJc2NoZWR1bGUoKTsKKwkJCXZhbCA9CisJCQkgICAgcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUKKwkJCQkgIChhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFKSk7CisJCQlsb29wcysrOworCQl9CisJCWlmICh2YWwgIT0gUEhBTl9JTklUSUFMSVpFX0NPTVBMRVRFKQorCQkJcHJpbnRrKCJXQVJOSU5HOiBJbml0aWFsIGJvb3Qgd2FpdCBsb29wIGZhaWxlZC4uLlxuIik7CisJfQorfQorCitpbnQgbmV0eGVuX25pY19yeF9oYXNfd29yayhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGN0eDsKKworCWZvciAoY3R4ID0gMDsgY3R4IDwgTUFYX1JDVl9DVFg7ICsrY3R4KSB7CisJCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eCA9CisJCSAgICAmKGFkYXB0ZXItPnJlY3ZfY3R4W2N0eF0pOworCQl1MzIgY29uc3VtZXI7CisJCXN0cnVjdCBzdGF0dXNfZGVzYyAqZGVzY19oZWFkOworCQlzdHJ1Y3Qgc3RhdHVzX2Rlc2MgKmRlc2M7CisKKwkJY29uc3VtZXIgPSByZWN2X2N0eC0+c3RhdHVzX3J4X2NvbnN1bWVyOworCQlkZXNjX2hlYWQgPSByZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX2hlYWQ7CisJCWRlc2MgPSAmZGVzY19oZWFkW2NvbnN1bWVyXTsKKworCQlpZiAoKChsZTE2X3RvX2NwdShuZXR4ZW5fZ2V0X3N0c19vd25lcihkZXNjKSkpCisJCSAgICAgJiBTVEFUVVNfT1dORVJfSE9TVCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0eGVuX25pY19jaGVja190ZW1wKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcG9ydF9udW07CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJdWludDMyX3QgdGVtcCwgdGVtcF9zdGF0ZSwgdGVtcF92YWw7CisJaW50IHJ2ID0gMDsKKworCXRlbXAgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfVEVNUF9TVEFURSkpOworCisJdGVtcF9zdGF0ZSA9IG54X2dldF90ZW1wX3N0YXRlKHRlbXApOworCXRlbXBfdmFsID0gbnhfZ2V0X3RlbXBfdmFsKHRlbXApOworCisJaWYgKHRlbXBfc3RhdGUgPT0gTlhfVEVNUF9QQU5JQykgeworCQlwcmludGsoS0VSTl9BTEVSVAorCQkgICAgICAgIiVzOiBEZXZpY2UgdGVtcGVyYXR1cmUgJWQgZGVncmVlcyBDIGV4Y2VlZHMiCisJCSAgICAgICAiIG1heGltdW0gYWxsb3dlZC4gSGFyZHdhcmUgaGFzIGJlZW4gc2h1dCBkb3duLlxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHRlbXBfdmFsKTsKKwkJZm9yIChwb3J0X251bSA9IDA7IHBvcnRfbnVtIDwgYWRhcHRlci0+YWh3Lm1heF9wb3J0czsKKwkJICAgICBwb3J0X251bSsrKSB7CisJCQlwb3J0ID0gYWRhcHRlci0+cG9ydFtwb3J0X251bV07CisJCQluZXRkZXYgPSBwb3J0LT5uZXRkZXY7CisKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCX0KKwkJcnYgPSAxOworCX0gZWxzZSBpZiAodGVtcF9zdGF0ZSA9PSBOWF9URU1QX1dBUk4pIHsKKwkJaWYgKGFkYXB0ZXItPnRlbXAgPT0gTlhfVEVNUF9OT1JNQUwpIHsKKwkJCXByaW50ayhLRVJOX0FMRVJUCisJCQkgICAgICAgIiVzOiBEZXZpY2UgdGVtcGVyYXR1cmUgJWQgZGVncmVlcyBDICIKKwkJCSAgICAgICAiZXhjZWVkcyBvcGVyYXRpbmcgcmFuZ2UuIgorCQkJICAgICAgICIgSW1tZWRpYXRlIGFjdGlvbiBuZWVkZWQuXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHRlbXBfdmFsKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhZGFwdGVyLT50ZW1wID09IE5YX1RFTVBfV0FSTikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIlczogRGV2aWNlIHRlbXBlcmF0dXJlIGlzIG5vdyAlZCBkZWdyZWVzIEMiCisJCQkgICAgICAgIiBpbiBub3JtYWwgcmFuZ2UuXG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAorCQkJICAgICAgIHRlbXBfdmFsKTsKKwkJfQorCX0KKwlhZGFwdGVyLT50ZW1wID0gdGVtcF9zdGF0ZTsKKwlyZXR1cm4gcnY7Cit9CisKK3ZvaWQgbmV0eGVuX3dhdGNoZG9nX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCBwb3J0X251bTsKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ldHhlbl9hZGFwdGVyLCB3YXRjaGRvZ190YXNrKTsKKworCWlmIChuZXR4ZW5fbmljX2NoZWNrX3RlbXAoYWRhcHRlcikpCisJCXJldHVybjsKKworCWZvciAocG9ydF9udW0gPSAwOyBwb3J0X251bSA8IGFkYXB0ZXItPmFody5tYXhfcG9ydHM7IHBvcnRfbnVtKyspIHsKKwkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbcG9ydF9udW1dOworCQluZXRkZXYgPSBwb3J0LT5uZXRkZXY7CisKKwkJaWYgKChuZXRpZl9ydW5uaW5nKG5ldGRldikpICYmICFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIHBvcnQgJWQsICVzIGNhcnJpZXIgaXMgbm93IG9rXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHBvcnRfbnVtLCBuZXRkZXYtPm5hbWUpOworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCQl9CisKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkKKwkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwl9CisKKwlpZiAoYWRhcHRlci0+aGFuZGxlX3BoeV9pbnRyKQorCQlhZGFwdGVyLT5oYW5kbGVfcGh5X2ludHIoYWRhcHRlcik7CisJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7Cit9CisKKy8qCisgKiBuZXR4ZW5fcHJvY2Vzc19yY3YoKSBzZW5kIHRoZSByZWNlaXZlZCBwYWNrZXQgdG8gdGhlIHByb3RvY29sIHN0YWNrLgorICogYW5kIGlmIHRoZSBudW1iZXIgb2YgcmVjZWl2ZXMgZXhjZWVkcyBSWF9CVUZGRVJTX1JFRklMTCwgdGhlbiB3ZQorICogaW52b2tlIHRoZSByb3V0aW5lIHRvIHNlbmQgbW9yZSByeCBidWZmZXJzIHRvIHRoZSBQaGFudG9tLi4uCisgKi8KK3ZvaWQKK25ldHhlbl9wcm9jZXNzX3JjdihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBjdHhpZCwKKwkJICAgc3RydWN0IHN0YXR1c19kZXNjICpkZXNjKQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IGFkYXB0ZXItPnBvcnRbbmV0eGVuX2dldF9zdHNfcG9ydChkZXNjKV07CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwb3J0LT5wZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwb3J0LT5uZXRkZXY7CisJaW50IGluZGV4ID0gbGUxNl90b19jcHUobmV0eGVuX2dldF9zdHNfcmVmaGFuZGxlKGRlc2MpKTsKKwlzdHJ1Y3QgbmV0eGVuX3JlY3ZfY29udGV4dCAqcmVjdl9jdHggPSAmKGFkYXB0ZXItPnJlY3ZfY3R4W2N0eGlkXSk7CisJc3RydWN0IG5ldHhlbl9yeF9idWZmZXIgKmJ1ZmZlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBsZW5ndGggPSBsZTE2X3RvX2NwdShuZXR4ZW5fZ2V0X3N0c190b3RhbGxlbmd0aChkZXNjKSk7CisJdTMyIGRlc2NfY3R4OworCXN0cnVjdCBuZXR4ZW5fcmN2X2Rlc2NfY3R4ICpyY3ZfZGVzYzsKKwlpbnQgcmV0OworCisJZGVzY19jdHggPSBuZXR4ZW5fZ2V0X3N0c190eXBlKGRlc2MpOworCWlmICh1bmxpa2VseShkZXNjX2N0eCA+PSBOVU1fUkNWX0RFU0NfUklOR1MpKSB7CisJCXByaW50aygiJXM6ICVzIEJhZCBSY3YgZGVzY3JpcHRvciByaW5nXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXJjdl9kZXNjID0gJnJlY3ZfY3R4LT5yY3ZfZGVzY1tkZXNjX2N0eF07CisJaWYgKHVubGlrZWx5KGluZGV4ID4gcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50KSkgeworCQlEUFJJTlRLKEVSUiwgIkdvdCBhIGJ1ZmZlciBpbmRleDoleCBNYXggaXMgJXhcbiIsCisJCQlpbmRleCwgcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50KTsKKwkJcmV0dXJuOworCX0KKwlidWZmZXIgPSAmcmN2X2Rlc2MtPnJ4X2J1Zl9hcnJbaW5kZXhdOworCWlmIChkZXNjX2N0eCA9PSBSQ1ZfREVTQ19MUk9fQ1RYSUQpIHsKKwkJYnVmZmVyLT5scm9fY3VycmVudF9mcmFncysrOworCQlpZiAobmV0eGVuX2dldF9zdHNfZGVzY19scm9fbGFzdF9mcmFnKGRlc2MpKSB7CisJCQlidWZmZXItPmxyb19leHBlY3RlZF9mcmFncyA9CisJCQkgICAgbmV0eGVuX2dldF9zdHNfZGVzY19scm9fY250KGRlc2MpOworCQkJYnVmZmVyLT5scm9fbGVuZ3RoID0gbGVuZ3RoOworCQl9CisJCWlmIChidWZmZXItPmxyb19jdXJyZW50X2ZyYWdzICE9IGJ1ZmZlci0+bHJvX2V4cGVjdGVkX2ZyYWdzKSB7CisJCQlpZiAoYnVmZmVyLT5scm9fZXhwZWN0ZWRfZnJhZ3MgIT0gMCkgeworCQkJCXByaW50aygiTFJPOiAocmVmaGFuZGxlOiV4KSByZWN2IGZyYWcuIgorCQkJCSAgICAgICAid2FpdCBmb3IgbGFzdC4gZmxhZ3M6ICV4IGV4cGVjdGVkOiVkIgorCQkJCSAgICAgICAiaGF2ZTolZFxuIiwgaW5kZXgsCisJCQkJICAgICAgIG5ldHhlbl9nZXRfc3RzX2Rlc2NfbHJvX2xhc3RfZnJhZyhkZXNjKSwKKwkJCQkgICAgICAgYnVmZmVyLT5scm9fZXhwZWN0ZWRfZnJhZ3MsCisJCQkJICAgICAgIGJ1ZmZlci0+bHJvX2N1cnJlbnRfZnJhZ3MpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfQorCisJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBidWZmZXItPmRtYSwgcmN2X2Rlc2MtPmRtYV9zaXplLAorCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilidWZmZXItPnNrYjsKKworCWlmIChsaWtlbHkobmV0eGVuX2dldF9zdHNfc3RhdHVzKGRlc2MpID09IFNUQVRVU19DS1NVTV9PSykpIHsKKwkJcG9ydC0+c3RhdHMuY3N1bW1lZCsrOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0KKwlza2ItPmRldiA9IG5ldGRldjsKKwlpZiAoZGVzY19jdHggPT0gUkNWX0RFU0NfTFJPX0NUWElEKSB7CisJCS8qIFRydWUgbGVuZ3RoIHdhcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgbGFzdCBwa3QgKi8KKwkJc2tiX3B1dChza2IsIGJ1ZmZlci0+bHJvX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkJc2tiX3B1dChza2IsIGxlbmd0aCk7CisJfQorCisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKKworCXJldCA9IG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwkvKgorCSAqIFJIOiBEbyB3ZSBuZWVkIHRoZXNlIHN0YXRzIG9uIGEgcmVndWxhciBiYXNpcy4gQ2FuIHdlIGdldCBpdCBmcm9tCisJICogTGludXggc3RhdHMuCisJICovCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIE5FVF9SWF9TVUNDRVNTOgorCQlwb3J0LT5zdGF0cy51cGhhcHB5Kys7CisJCWJyZWFrOworCisJY2FzZSBORVRfUlhfQ05fTE9XOgorCQlwb3J0LT5zdGF0cy51cGxjb25nKys7CisJCWJyZWFrOworCisJY2FzZSBORVRfUlhfQ05fTU9EOgorCQlwb3J0LT5zdGF0cy51cG1jb25nKys7CisJCWJyZWFrOworCisJY2FzZSBORVRfUlhfQ05fSElHSDoKKwkJcG9ydC0+c3RhdHMudXBoY29uZysrOworCQlicmVhazsKKworCWNhc2UgTkVUX1JYX0RST1A6CisJCXBvcnQtPnN0YXRzLnVwZHJvcHBlZCsrOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXBvcnQtPnN0YXRzLnVwZHVubm8rKzsKKwkJYnJlYWs7CisJfQorCisJbmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCXJjdl9kZXNjLT5yY3ZfZnJlZSsrOworCXJjdl9kZXNjLT5yY3ZfcGVuZGluZy0tOworCisJLyoKKwkgKiBXZSBqdXN0IGNvbnN1bWVkIG9uZSBidWZmZXIgc28gcG9zdCBhIGJ1ZmZlci4KKwkgKi8KKwlhZGFwdGVyLT5zdGF0cy5wb3N0X2NhbGxlZCsrOworCWJ1ZmZlci0+c2tiID0gTlVMTDsKKwlidWZmZXItPnN0YXRlID0gTkVUWEVOX0JVRkZFUl9GUkVFOworCWJ1ZmZlci0+bHJvX2N1cnJlbnRfZnJhZ3MgPSAwOworCWJ1ZmZlci0+bHJvX2V4cGVjdGVkX2ZyYWdzID0gMDsKKworCXBvcnQtPnN0YXRzLm5vX3JjdisrOworCXBvcnQtPnN0YXRzLnJ4Ynl0ZXMgKz0gbGVuZ3RoOworfQorCisvKiBQcm9jZXNzIFJlY2VpdmUgc3RhdHVzIHJpbmcgKi8KK3UzMiBuZXR4ZW5fcHJvY2Vzc19yY3ZfcmluZyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBjdHhpZCwgaW50IG1heCkKK3sKKwlzdHJ1Y3QgbmV0eGVuX3JlY3ZfY29udGV4dCAqcmVjdl9jdHggPSAmKGFkYXB0ZXItPnJlY3ZfY3R4W2N0eGlkXSk7CisJc3RydWN0IHN0YXR1c19kZXNjICpkZXNjX2hlYWQgPSByZWN2X2N0eC0+cmN2X3N0YXR1c19kZXNjX2hlYWQ7CisJc3RydWN0IHN0YXR1c19kZXNjICpkZXNjOwkvKiB1c2VkIHRvIHJlYWQgc3RhdHVzIGRlc2MgaGVyZSAqLworCXUzMiBjb25zdW1lciA9IHJlY3ZfY3R4LT5zdGF0dXNfcnhfY29uc3VtZXI7CisJdTMyIHByb2R1Y2VyID0gMDsKKwlpbnQgY291bnQgPSAwLCByaW5nOworCisJRFBSSU5USyhJTkZPLCAicHJvY2VzaW5nIHJlY2VpdmVcbiIpOworCS8qCisJICogd2UgYXNzdW1lIGluIHRoaXMgY2FzZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHBvcnQgYW5kIHRoYXQgaXMKKwkgKiBwb3J0ICMxLi4uY2hhbmdlcyBuZWVkIHRvIGJlIGRvbmUgaW4gZmlybXdhcmUgdG8gaW5kaWNhdGUgcG9ydAorCSAqIG51bWJlciBhcyBwYXJ0IG9mIHRoZSBkZXNjcmlwdG9yLiBUaGlzIHdheSB3ZSB3aWxsIGJlIGFibGUgdG8gZ2V0CisJICogdGhlIG5ldGRldiB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBkZXZpY2UuCisJICovCisJd2hpbGUgKGNvdW50IDwgbWF4KSB7CisJCWRlc2MgPSAmZGVzY19oZWFkW2NvbnN1bWVyXTsKKwkJaWYgKCEKKwkJICAgIChsZTE2X3RvX2NwdShuZXR4ZW5fZ2V0X3N0c19vd25lcihkZXNjKSkgJgorCQkgICAgIFNUQVRVU19PV05FUl9IT1NUKSkgeworCQkJRFBSSU5USyhFUlIsICJkZXNjICVwIG93bmVkYnkgJXhcbiIsIGRlc2MsCisJCQkJbmV0eGVuX2dldF9zdHNfb3duZXIoZGVzYykpOworCQkJYnJlYWs7CisJCX0KKwkJbmV0eGVuX3Byb2Nlc3NfcmN2KGFkYXB0ZXIsIGN0eGlkLCBkZXNjKTsKKwkJbmV0eGVuX2NsZWFyX3N0c19vd25lcihkZXNjKTsKKwkJbmV0eGVuX3NldF9zdHNfb3duZXIoZGVzYywgU1RBVFVTX09XTkVSX1BIQU5UT00pOworCQljb25zdW1lciA9IChjb25zdW1lciArIDEpICYgKGFkYXB0ZXItPm1heF9yeF9kZXNjX2NvdW50IC0gMSk7CisJCWNvdW50Kys7CisJfQorCWlmIChjb3VudCkgeworCQlmb3IgKHJpbmcgPSAwOyByaW5nIDwgTlVNX1JDVl9ERVNDX1JJTkdTOyByaW5nKyspIHsKKwkJCW5ldHhlbl9wb3N0X3J4X2J1ZmZlcnNfbm9kYihhZGFwdGVyLCBjdHhpZCwgcmluZyk7CisJCX0KKwl9CisKKwkvKiB1cGRhdGUgdGhlIGNvbnN1bWVyIGluZGV4IGluIHBoYW50b20gKi8KKwlpZiAoY291bnQpIHsKKwkJYWRhcHRlci0+c3RhdHMucHJvY2Vzc19yY3YrKzsKKwkJcmVjdl9jdHgtPnN0YXR1c19yeF9jb25zdW1lciA9IGNvbnN1bWVyOworCQlyZWN2X2N0eC0+c3RhdHVzX3J4X3Byb2R1Y2VyID0gcHJvZHVjZXI7CisKKwkJLyogV2luZG93ID0gMSAqLworCQl3cml0ZWwoY29uc3VtZXIsCisJCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCQkgICAgcmVjdl9jcmJfcmVnaXN0ZXJzW2N0eGlkXS4KKwkJCQkJICAgIGNyYl9yY3Zfc3RhdHVzX2NvbnN1bWVyKSk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKiBQcm9jZXNzIENvbW1hbmQgc3RhdHVzIHJpbmcgKi8KK2ludCBuZXR4ZW5fcHJvY2Vzc19jbWRfcmluZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdTMyIGxhc3RfY29uc3VtZXI7CisJdTMyIGNvbnN1bWVyOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKilkYXRhOworCWludCBjb3VudDEgPSAwOworCWludCBjb3VudDIgPSAwOworCXN0cnVjdCBuZXR4ZW5fY21kX2J1ZmZlciAqYnVmZmVyOworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsJLyogcG9ydCAjMSAqLworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqbnBvcnQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IG5ldHhlbl9za2JfZnJhZyAqZnJhZzsKKwl1MzIgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgcDsKKwlpbnQgZG9uZTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+dHhfbG9jayk7CisJbGFzdF9jb25zdW1lciA9IGFkYXB0ZXItPmxhc3RfY21kX2NvbnN1bWVyOworCURQUklOVEsoSU5GTywgInByb2Nlc2luZyB4bWl0IGNvbXBsZXRlXG4iKTsKKwkvKiB3ZSBhc3N1bWUgaW4gdGhpcyBjYXNlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgcG9ydCBhbmQgdGhhdCBpcworCSAqIHBvcnQgIzEuLi5jaGFuZ2VzIG5lZWQgdG8gYmUgZG9uZSBpbiBmaXJtd2FyZSB0byBpbmRpY2F0ZSBwb3J0CisJICogbnVtYmVyIGFzIHBhcnQgb2YgdGhlIGRlc2NyaXB0b3IuIFRoaXMgd2F5IHdlIHdpbGwgYmUgYWJsZSB0byBnZXQKKwkgKiB0aGUgbmV0ZGV2IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGRldmljZS4KKwkgKi8KKworCWNvbnN1bWVyID0gKihhZGFwdGVyLT5jbWRfY29uc3VtZXIpOworCWlmIChsYXN0X2NvbnN1bWVyID09IGNvbnN1bWVyKSB7CS8qIFJpbmcgaXMgZW1wdHkgICAgKi8KKwkJRFBSSU5USyhJTkZPLCAibGFzdF9jb25zdW1lciAlZCA9PSBjb25zdW1lciAlZFxuIiwKKwkJCWxhc3RfY29uc3VtZXIsIGNvbnN1bWVyKTsKKwkJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnR4X2xvY2spOworCQlyZXR1cm4gMTsKKwl9CisKKwlhZGFwdGVyLT5wcm9jX2NtZF9idWZfY291bnRlcisrOworCWFkYXB0ZXItPnN0YXRzLnByb2Nlc3NfeG1pdCsrOworCS8qCisJICogTm90IG5lZWRlZCAtIGRvZXMgbm90IHNlZW0gdG8gYmUgdXNlZCBhbnl3aGVyZS4KKwkgKiBhZGFwdGVyLT5jbWRfY29uc3VtZXIgPSBjb25zdW1lcjsKKwkgKi8KKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHhfbG9jayk7CisKKwl3aGlsZSAoKGxhc3RfY29uc3VtZXIgIT0gY29uc3VtZXIpICYmIChjb3VudDEgPCBNQVhfU1RBVFVTX0hBTkRMRSkpIHsKKwkJYnVmZmVyID0gJmFkYXB0ZXItPmNtZF9idWZfYXJyW2xhc3RfY29uc3VtZXJdOworCQlwb3J0ID0gYWRhcHRlci0+cG9ydFtidWZmZXItPnBvcnRdOworCQlwZGV2ID0gcG9ydC0+cGRldjsKKwkJZnJhZyA9ICZidWZmZXItPmZyYWdfYXJyYXlbMF07CisJCXNrYiA9IGJ1ZmZlci0+c2tiOworCQlpZiAoc2tiICYmIChjbXB4Y2hnKCZidWZmZXItPnNrYiwgc2tiLCAwKSA9PSBza2IpKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIGZyYWctPmRtYSwgZnJhZy0+bGVuZ3RoLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQlmb3IgKGkgPSAxOyBpIDwgYnVmZmVyLT5mcmFnX2NvdW50OyBpKyspIHsKKwkJCQlEUFJJTlRLKElORk8sICJnZXR0aW5nIGZyYWdtZW50IG5vICVkXG4iLCBpKTsKKwkJCQlmcmFnKys7CS8qIEdldCB0aGUgbmV4dCBmcmFnICovCisJCQkJcGNpX3VubWFwX3BhZ2UocGRldiwgZnJhZy0+ZG1hLCBmcmFnLT5sZW5ndGgsCisJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCX0KKworCQkJcG9ydC0+c3RhdHMuc2tiZnJlZWQrKzsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlza2IgPSBOVUxMOworCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnByb2NfY21kX2J1Zl9jb3VudGVyID09IDEpIHsKKwkJCXBvcnQtPnN0YXRzLnR4bnVsbHNrYisrOworCQl9CisJCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKHBvcnQtPm5ldGRldikKKwkJCSAgICAgJiYgbmV0aWZfY2Fycmllcl9vayhwb3J0LT5uZXRkZXYpKQorCQkgICAgJiYgKChqaWZmaWVzIC0gcG9ydC0+bmV0ZGV2LT50cmFuc19zdGFydCkgPgorCQkJcG9ydC0+bmV0ZGV2LT53YXRjaGRvZ190aW1lbykpIHsKKwkJCVNDSEVEVUxFX1dPUksoJnBvcnQtPmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7CisJCX0KKworCQlsYXN0X2NvbnN1bWVyID0gZ2V0X25leHRfaW5kZXgobGFzdF9jb25zdW1lciwKKwkJCQkJICAgICAgIGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50KTsKKwkJY291bnQxKys7CisJfQorCWFkYXB0ZXItPnN0YXRzLm5veG1pdGRvbmUgKz0gY291bnQxOworCisJY291bnQyID0gMDsKKwlzcGluX2xvY2soJmFkYXB0ZXItPnR4X2xvY2spOworCWlmICgoLS1hZGFwdGVyLT5wcm9jX2NtZF9idWZfY291bnRlcikgPT0gMCkgeworCQlhZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lciA9IGxhc3RfY29uc3VtZXI7CisJCXdoaWxlICgoYWRhcHRlci0+bGFzdF9jbWRfY29uc3VtZXIgIT0gY29uc3VtZXIpCisJCSAgICAgICAmJiAoY291bnQyIDwgTUFYX1NUQVRVU19IQU5ETEUpKSB7CisJCQlidWZmZXIgPQorCQkJICAgICZhZGFwdGVyLT5jbWRfYnVmX2FyclthZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lcl07CisJCQljb3VudDIrKzsKKwkJCWlmIChidWZmZXItPnNrYikKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQlhZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lciA9CisJCQkJICAgIGdldF9uZXh0X2luZGV4KGFkYXB0ZXItPmxhc3RfY21kX2NvbnN1bWVyLAorCQkJCQkJICAgYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQpOworCQl9CisJfQorCWlmIChjb3VudDEgfHwgY291bnQyKSB7CisJCWZvciAocCA9IDA7IHAgPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOyBwKyspIHsKKwkJCW5wb3J0ID0gYWRhcHRlci0+cG9ydFtwXTsKKwkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5wb3J0LT5uZXRkZXYpCisJCQkgICAgJiYgKG5wb3J0LT5mbGFncyAmIE5FVFhFTl9ORVRERVZfU1RBVFVTKSkgeworCQkJCW5ldGlmX3dha2VfcXVldWUobnBvcnQtPm5ldGRldik7CisJCQkJbnBvcnQtPmZsYWdzICY9IH5ORVRYRU5fTkVUREVWX1NUQVRVUzsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIElmIGV2ZXJ5dGhpbmcgaXMgZnJlZWQgdXAgdG8gY29uc3VtZXIgdGhlbiBjaGVjayBpZiB0aGUgcmluZyBpcyBmdWxsCisJICogSWYgdGhlIHJpbmcgaXMgZnVsbCB0aGVuIGNoZWNrIGlmIG1vcmUgbmVlZHMgdG8gYmUgZnJlZWQgYW5kCisJICogc2NoZWR1bGUgdGhlIGNhbGwgYmFjayBhZ2Fpbi4KKwkgKgorCSAqIFRoaXMgaGFwcGVucyB3aGVuIHRoZXJlIGFyZSAyIENQVXMuIE9uZSBjb3VsZCBiZSBmcmVlaW5nIGFuZCB0aGUKKwkgKiBvdGhlciBmaWxsaW5nIGl0LiBJZiB0aGUgcmluZyBpcyBmdWxsIHdoZW4gd2UgZ2V0IG91dCBvZiBoZXJlIGFuZAorCSAqIHRoZSBjYXJkIGhhcyBhbHJlYWR5IGludGVycnVwdGVkIHRoZSBob3N0IHRoZW4gdGhlIGhvc3QgY2FuIG1pc3MgdGhlCisJICogaW50ZXJydXB0LgorCSAqCisJICogVGhlcmUgaXMgc3RpbGwgYSBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbiBhbmQgdGhlIGhvc3QgY291bGQgbWlzcyBhbgorCSAqIGludGVycnVwdC4gVGhlIGNhcmQgaGFzIHRvIHRha2UgY2FyZSBvZiB0aGlzLgorCSAqLworCWlmIChhZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lciA9PSBjb25zdW1lciAmJgorCSAgICAoKChhZGFwdGVyLT5jbWRfcHJvZHVjZXIgKyAxKSAlCisJICAgICAgYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQpID09IGFkYXB0ZXItPmxhc3RfY21kX2NvbnN1bWVyKSkgeworCQljb25zdW1lciA9ICooYWRhcHRlci0+Y21kX2NvbnN1bWVyKTsKKwl9CisJZG9uZSA9IChhZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lciA9PSBjb25zdW1lcik7CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHhfbG9jayk7CisJRFBSSU5USyhJTkZPLCAibGFzdCBjb25zdW1lciBpcyAlZCBpbiAlc1xuIiwgbGFzdF9jb25zdW1lciwKKwkJX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gKGRvbmUpOworfQorCisvKgorICogbmV0eGVuX3Bvc3RfcnhfYnVmZmVycyBwdXRzIGJ1ZmZlciBpbiB0aGUgUGhhbnRvbSBtZW1vcnkKKyAqLwordm9pZCBuZXR4ZW5fcG9zdF9yeF9idWZmZXJzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIGN0eCwgdTMyIHJpbmdpZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPmFody5wZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldHhlbl9yZWN2X2NvbnRleHQgKnJlY3ZfY3R4ID0gJihhZGFwdGVyLT5yZWN2X2N0eFtjdHhdKTsKKwlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCAqcmN2X2Rlc2MgPSBOVUxMOworCXVpbnQgcHJvZHVjZXI7CisJc3RydWN0IHJjdl9kZXNjICpwZGVzYzsKKwlzdHJ1Y3QgbmV0eGVuX3J4X2J1ZmZlciAqYnVmZmVyOworCWludCBjb3VudCA9IDA7CisJaW50IGluZGV4ID0gMDsKKwluZXR4ZW5fY3R4X21zZyBtc2cgPSAwOworCWRtYV9hZGRyX3QgZG1hOworCisJYWRhcHRlci0+c3RhdHMucG9zdF9jYWxsZWQrKzsKKwlyY3ZfZGVzYyA9ICZyZWN2X2N0eC0+cmN2X2Rlc2NbcmluZ2lkXTsKKworCXByb2R1Y2VyID0gcmN2X2Rlc2MtPnByb2R1Y2VyOworCWluZGV4ID0gcmN2X2Rlc2MtPmJlZ2luX2FsbG9jOworCWJ1ZmZlciA9ICZyY3ZfZGVzYy0+cnhfYnVmX2FycltpbmRleF07CisJLyogV2UgY2FuIHN0YXJ0IHdyaXRpbmcgcnggZGVzY3JpcHRvcnMgaW50byB0aGUgcGhhbnRvbSBtZW1vcnkuICovCisJd2hpbGUgKGJ1ZmZlci0+c3RhdGUgPT0gTkVUWEVOX0JVRkZFUl9GUkVFKSB7CisJCXNrYiA9IGRldl9hbGxvY19za2IocmN2X2Rlc2MtPnNrYl9zaXplKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQkvKgorCQkJICogVE9ETworCQkJICogV2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgcG9zdGluZyBvZiBidWZmZXJzIHRvIHRoZSBwZWdzLgorCQkJICovCisJCQlyY3ZfZGVzYy0+YmVnaW5fYWxsb2MgPSBpbmRleDsKKwkJCURQUklOVEsoRVJSLCAibmV0eGVuX3Bvc3RfcnhfYnVmZmVyczogIgorCQkJCSIgYWxsb2NhdGVkIG9ubHkgJWQgYnVmZmVyc1xuIiwgY291bnQpOworCQkJYnJlYWs7CisJCX0KKworCQljb3VudCsrOwkvKiBub3cgdGhlcmUgc2hvdWxkIGJlIG5vIGZhaWx1cmUgKi8KKwkJcGRlc2MgPSAmcmN2X2Rlc2MtPmRlc2NfaGVhZFtwcm9kdWNlcl07CisKKyNpZiBkZWZpbmVkKFhHQl9ERUJVRykKKwkJKih1bnNpZ25lZCBsb25nICopKHNrYi0+aGVhZCkgPSAweGMwZGViYWJlOworCQlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpKSB7CisJCQlwcmludGsoIkFsbG9jYXRlZCBTS0IgQCVwIGlzIG5vbmxpbmVhclxuIik7CisJCX0KKyNlbmRpZgorCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkvKiBUaGlzIHdpbGwgYmUgc2V0dXAgd2hlbiB3ZSByZWNlaXZlIHRoZQorCQkgKiBidWZmZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gZmlsbGVkICBGU0wgIFRCRCBUQkQKKwkJICogc2tiLT5kZXYgPSBuZXRkZXY7CisJCSAqLworCQlkbWEgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIHJjdl9kZXNjLT5kbWFfc2l6ZSwKKwkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXBkZXNjLT5hZGRyX2J1ZmZlciA9IGRtYTsKKwkJYnVmZmVyLT5za2IgPSBza2I7CisJCWJ1ZmZlci0+c3RhdGUgPSBORVRYRU5fQlVGRkVSX0JVU1k7CisJCWJ1ZmZlci0+ZG1hID0gZG1hOworCQkvKiBtYWtlIGEgcmN2IGRlc2NyaXB0b3IgICovCisJCXBkZXNjLT5yZWZlcmVuY2VfaGFuZGxlID0gYnVmZmVyLT5yZWZfaGFuZGxlOworCQlwZGVzYy0+YnVmZmVyX2xlbmd0aCA9IHJjdl9kZXNjLT5kbWFfc2l6ZTsKKwkJRFBSSU5USyhJTkZPLCAiZG9uZSB3cml0aW5nIGRlc2NyaXB0ZXJcbiIpOworCQlwcm9kdWNlciA9CisJCSAgICBnZXRfbmV4dF9pbmRleChwcm9kdWNlciwgcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50KTsKKwkJaW5kZXggPSBnZXRfbmV4dF9pbmRleChpbmRleCwgcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50KTsKKwkJYnVmZmVyID0gJnJjdl9kZXNjLT5yeF9idWZfYXJyW2luZGV4XTsKKwl9CisJLyogaWYgd2UgZGlkIGFsbG9jYXRlIGJ1ZmZlcnMsIHRoZW4gd3JpdGUgdGhlIGNvdW50IHRvIFBoYW50b20gKi8KKwlpZiAoY291bnQpIHsKKwkJcmN2X2Rlc2MtPmJlZ2luX2FsbG9jID0gaW5kZXg7CisJCXJjdl9kZXNjLT5yY3ZfcGVuZGluZyArPSBjb3VudDsKKwkJYWRhcHRlci0+c3RhdHMubGFzdHBvc3RlZCA9IGNvdW50OworCQlhZGFwdGVyLT5zdGF0cy5wb3N0ZWQgKz0gY291bnQ7CisJCXJjdl9kZXNjLT5wcm9kdWNlciA9IHByb2R1Y2VyOworCQlpZiAocmN2X2Rlc2MtPnJjdl9mcmVlID49IDMyKSB7CisJCQlyY3ZfZGVzYy0+cmN2X2ZyZWUgPSAwOworCQkJLyogV2luZG93ID0gMSAqLworCQkJd3JpdGVsKChwcm9kdWNlciAtIDEpICYKKwkJCSAgICAgICAocmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50IC0gMSksCisJCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJCSAgICByZWN2X2NyYl9yZWdpc3RlcnNbMF0uCisJCQkJCQkgICAgcmN2X2Rlc2NfY3JiW3JpbmdpZF0uCisJCQkJCQkgICAgY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQpKTsKKwkJCS8qCisJCQkgKiBXcml0ZSBhIGRvb3JiZWxsIG1zZyB0byB0ZWxsIHBoYW5tb24gb2YgY2hhbmdlIGluCisJCQkgKiByZWNlaXZlIHJpbmcgcHJvZHVjZXIKKwkJCSAqLworCQkJbmV0eGVuX3NldF9tc2dfcGVnX2lkKG1zZywgTkVUWEVOX1JDVl9QRUdfREJfSUQpOworCQkJbmV0eGVuX3NldF9tc2dfcHJpdmlkKG1zZyk7CisJCQluZXR4ZW5fc2V0X21zZ19jb3VudChtc2csCisJCQkJCSAgICAgKChwcm9kdWNlciAtCisJCQkJCSAgICAgICAxKSAmIChyY3ZfZGVzYy0+CisJCQkJCQkgICAgIG1heF9yeF9kZXNjX2NvdW50IC0gMSkpKTsKKwkJCW5ldHhlbl9zZXRfbXNnX2N0eGlkKG1zZywgMCk7CisJCQluZXR4ZW5fc2V0X21zZ19vcGNvZGUobXNnLCBORVRYRU5fUkNWX1BST0RVQ0VSKHJpbmdpZCkpOworCQkJd3JpdGVsKG1zZywKKwkJCSAgICAgICBEQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9SQ1ZfUFJPRFVDRVJfT0ZGU0VUKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgbmV0eGVuX3Bvc3RfcnhfYnVmZmVyc19ub2RiKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdWludDMyX3QgY3R4LAorCQkJCSB1aW50MzJfdCByaW5naWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5haHcucGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eCA9ICYoYWRhcHRlci0+cmVjdl9jdHhbY3R4XSk7CisJc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jdHggKnJjdl9kZXNjID0gTlVMTDsKKwl1MzIgcHJvZHVjZXI7CisJc3RydWN0IHJjdl9kZXNjICpwZGVzYzsKKwlzdHJ1Y3QgbmV0eGVuX3J4X2J1ZmZlciAqYnVmZmVyOworCWludCBjb3VudCA9IDA7CisJaW50IGluZGV4ID0gMDsKKworCWFkYXB0ZXItPnN0YXRzLnBvc3RfY2FsbGVkKys7CisJcmN2X2Rlc2MgPSAmcmVjdl9jdHgtPnJjdl9kZXNjW3JpbmdpZF07CisKKwlwcm9kdWNlciA9IHJjdl9kZXNjLT5wcm9kdWNlcjsKKwlpbmRleCA9IHJjdl9kZXNjLT5iZWdpbl9hbGxvYzsKKwlidWZmZXIgPSAmcmN2X2Rlc2MtPnJ4X2J1Zl9hcnJbaW5kZXhdOworCS8qIFdlIGNhbiBzdGFydCB3cml0aW5nIHJ4IGRlc2NyaXB0b3JzIGludG8gdGhlIHBoYW50b20gbWVtb3J5LiAqLworCXdoaWxlIChidWZmZXItPnN0YXRlID09IE5FVFhFTl9CVUZGRVJfRlJFRSkgeworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJjdl9kZXNjLT5za2Jfc2l6ZSk7CisJCWlmICh1bmxpa2VseSghc2tiKSkgeworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHBvc3Rpbmcgb2YgYnVmZmVycyB0byB0aGUgcGVncy4KKwkJCSAqLworCQkJcmN2X2Rlc2MtPmJlZ2luX2FsbG9jID0gaW5kZXg7CisJCQlEUFJJTlRLKEVSUiwgIm5ldHhlbl9wb3N0X3J4X2J1ZmZlcnNfbm9kYjogIgorCQkJCSIgYWxsb2NhdGVkIG9ubHkgJWQgYnVmZmVyc1xuIiwgY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJY291bnQrKzsJLyogbm93IHRoZXJlIHNob3VsZCBiZSBubyBmYWlsdXJlICovCisJCXBkZXNjID0gJnJjdl9kZXNjLT5kZXNjX2hlYWRbcHJvZHVjZXJdOworCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkvKiAKKwkJICogVGhpcyB3aWxsIGJlIHNldHVwIHdoZW4gd2UgcmVjZWl2ZSB0aGUKKwkJICogYnVmZmVyIGFmdGVyIGl0IGhhcyBiZWVuIGZpbGxlZAorCQkgKiBza2ItPmRldiA9IG5ldGRldjsKKwkJICovCisJCWJ1ZmZlci0+c2tiID0gc2tiOworCQlidWZmZXItPnN0YXRlID0gTkVUWEVOX0JVRkZFUl9CVVNZOworCQlidWZmZXItPmRtYSA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICByY3ZfZGVzYy0+ZG1hX3NpemUsCisJCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkvKiBtYWtlIGEgcmN2IGRlc2NyaXB0b3IgICovCisJCXBkZXNjLT5yZWZlcmVuY2VfaGFuZGxlID0gbGUxNl90b19jcHUoYnVmZmVyLT5yZWZfaGFuZGxlKTsKKwkJcGRlc2MtPmJ1ZmZlcl9sZW5ndGggPSBsZTE2X3RvX2NwdShyY3ZfZGVzYy0+ZG1hX3NpemUpOworCQlwZGVzYy0+YWRkcl9idWZmZXIgPSBjcHVfdG9fbGU2NChidWZmZXItPmRtYSk7CisJCURQUklOVEsoSU5GTywgImRvbmUgd3JpdGluZyBkZXNjcmlwdGVyXG4iKTsKKwkJcHJvZHVjZXIgPQorCQkgICAgZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsIHJjdl9kZXNjLT5tYXhfcnhfZGVzY19jb3VudCk7CisJCWluZGV4ID0gZ2V0X25leHRfaW5kZXgoaW5kZXgsIHJjdl9kZXNjLT5tYXhfcnhfZGVzY19jb3VudCk7CisJCWJ1ZmZlciA9ICZyY3ZfZGVzYy0+cnhfYnVmX2FycltpbmRleF07CisJfQorCisJLyogaWYgd2UgZGlkIGFsbG9jYXRlIGJ1ZmZlcnMsIHRoZW4gd3JpdGUgdGhlIGNvdW50IHRvIFBoYW50b20gKi8KKwlpZiAoY291bnQpIHsKKwkJcmN2X2Rlc2MtPmJlZ2luX2FsbG9jID0gaW5kZXg7CisJCXJjdl9kZXNjLT5yY3ZfcGVuZGluZyArPSBjb3VudDsKKwkJYWRhcHRlci0+c3RhdHMubGFzdHBvc3RlZCA9IGNvdW50OworCQlhZGFwdGVyLT5zdGF0cy5wb3N0ZWQgKz0gY291bnQ7CisJCXJjdl9kZXNjLT5wcm9kdWNlciA9IHByb2R1Y2VyOworCQlpZiAocmN2X2Rlc2MtPnJjdl9mcmVlID49IDMyKSB7CisJCQlyY3ZfZGVzYy0+cmN2X2ZyZWUgPSAwOworCQkJLyogV2luZG93ID0gMSAqLworCQkJd3JpdGVsKChwcm9kdWNlciAtIDEpICYKKwkJCSAgICAgICAocmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50IC0gMSksCisJCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKKwkJCQkJCSAgICByZWN2X2NyYl9yZWdpc3RlcnNbMF0uCisJCQkJCQkgICAgcmN2X2Rlc2NfY3JiW3JpbmdpZF0uCisJCQkJCQkgICAgY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQpKTsKKwkJCXdtYigpOworCQl9CisJfQorfQorCitpbnQgbmV0eGVuX25pY190eF9oYXNfd29yayhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKGZpbmRfZGlmZl9hbW9uZyhhZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lciwKKwkJCSAgICBhZGFwdGVyLT5jbWRfcHJvZHVjZXIsCisJCQkgICAgYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQpID4gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworaW50CituZXR4ZW5fbmljX2ZpbGxfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICBzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQsCisJCQkgICBzdHJ1Y3QgbmV0eGVuX3N0YXRpc3RpY3MgKm5ldHhlbl9zdGF0cykKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwlpZiAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPT0gTkVUWEVOX05JQ19YR0JFKSB7CisJCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMCk7CisJCU5FVFhFTl9OSUNfTE9DS0VEX1JFQURfUkVHKE5FVFhFTl9OSVVfWEdFX1RYX0JZVEVfQ05ULAorCQkJCQkgICAmKG5ldHhlbl9zdGF0cy0+dHhfYnl0ZXMpKTsKKwkJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9YR0VfVFhfRlJBTUVfQ05ULAorCQkJCQkgICAmKG5ldHhlbl9zdGF0cy0+dHhfcGFja2V0cykpOworCQlORVRYRU5fTklDX0xPQ0tFRF9SRUFEX1JFRyhORVRYRU5fTklVX1hHRV9SWF9CWVRFX0NOVCwKKwkJCQkJICAgJihuZXR4ZW5fc3RhdHMtPnJ4X2J5dGVzKSk7CisJCU5FVFhFTl9OSUNfTE9DS0VEX1JFQURfUkVHKE5FVFhFTl9OSVVfWEdFX1JYX0ZSQU1FX0NOVCwKKwkJCQkJICAgJihuZXR4ZW5fc3RhdHMtPnJ4X3BhY2tldHMpKTsKKwkJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9YR0VfQUdHUl9FUlJPUl9DTlQsCisJCQkJCSAgICYobmV0eGVuX3N0YXRzLT5yeF9lcnJvcnMpKTsKKwkJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9YR0VfQ1JDX0VSUk9SX0NOVCwKKwkJCQkJICAgJihuZXR4ZW5fc3RhdHMtPnJ4X2NyY19lcnJvcnMpKTsKKwkJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9YR0VfT1ZFUlNJWkVfRlJBTUVfRVJSLAorCQkJCQkgICAmKG5ldHhlbl9zdGF0cy0+CisJCQkJCSAgICAgcnhfbG9uZ19sZW5ndGhfZXJyb3IpKTsKKwkJTkVUWEVOX05JQ19MT0NLRURfUkVBRF9SRUcoTkVUWEVOX05JVV9YR0VfVU5ERVJTSVpFX0ZSQU1FX0VSUiwKKwkJCQkJICAgJihuZXR4ZW5fc3RhdHMtPgorCQkJCQkgICAgIHJ4X3Nob3J0X2xlbmd0aF9lcnJvcikpOworCisJCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT50eF9sb2NrKTsKKwkJbmV0eGVuX3N0YXRzLT50eF9ieXRlcyA9IHBvcnQtPnN0YXRzLnR4Ynl0ZXM7CisJCW5ldHhlbl9zdGF0cy0+dHhfcGFja2V0cyA9IHBvcnQtPnN0YXRzLnhtaXRlZGZyYW1lcyArCisJCSAgICBwb3J0LT5zdGF0cy54bWl0ZmluaXNoZWQ7CisJCW5ldHhlbl9zdGF0cy0+cnhfYnl0ZXMgPSBwb3J0LT5zdGF0cy5yeGJ5dGVzOworCQluZXR4ZW5fc3RhdHMtPnJ4X3BhY2tldHMgPSBwb3J0LT5zdGF0cy5ub19yY3Y7CisJCW5ldHhlbl9zdGF0cy0+cnhfZXJyb3JzID0gcG9ydC0+c3RhdHMucmN2ZGJhZHNrYjsKKwkJbmV0eGVuX3N0YXRzLT50eF9lcnJvcnMgPSBwb3J0LT5zdGF0cy5ub2NtZGRlc2NyaXB0b3I7CisJCW5ldHhlbl9zdGF0cy0+cnhfc2hvcnRfbGVuZ3RoX2Vycm9yID0gcG9ydC0+c3RhdHMudXBsY29uZzsKKwkJbmV0eGVuX3N0YXRzLT5yeF9sb25nX2xlbmd0aF9lcnJvciA9IHBvcnQtPnN0YXRzLnVwaGNvbmc7CisJCW5ldHhlbl9zdGF0cy0+cnhfY3JjX2Vycm9ycyA9IDA7CisJCW5ldHhlbl9zdGF0cy0+cnhfbWFjX2Vycm9ycyA9IDA7CisJCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT50eF9sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmV0eGVuX25pY19jbGVhcl9zdGF0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0OworCWludCBwb3J0X251bTsKKworCW1lbXNldCgmYWRhcHRlci0+c3RhdHMsIDAsIHNpemVvZihhZGFwdGVyLT5zdGF0cykpOworCWZvciAocG9ydF9udW0gPSAwOyBwb3J0X251bSA8IGFkYXB0ZXItPmFody5tYXhfcG9ydHM7IHBvcnRfbnVtKyspIHsKKwkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbcG9ydF9udW1dOworCQltZW1zZXQoJnBvcnQtPnN0YXRzLCAwLCBzaXplb2YocG9ydC0+c3RhdHMpKTsKKwl9Cit9CisKK2ludAorbmV0eGVuX25pY19jbGVhcl9zdGF0aXN0aWNzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICBzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQpCit7CisJaW50IGRhdGEgPSAwOworCisJbmV0eGVuX25pY19wY2lfY2hhbmdlX2NyYndpbmRvdyhhZGFwdGVyLCAwKTsKKworCW5ldHhlbl9uaWNfbG9ja2VkX3dyaXRlX3JlZyhhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9UWF9CWVRFX0NOVCwgJmRhdGEpOworCW5ldHhlbl9uaWNfbG9ja2VkX3dyaXRlX3JlZyhhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9UWF9GUkFNRV9DTlQsCisJCQkJICAgICZkYXRhKTsKKwluZXR4ZW5fbmljX2xvY2tlZF93cml0ZV9yZWcoYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfUlhfQllURV9DTlQsICZkYXRhKTsKKwluZXR4ZW5fbmljX2xvY2tlZF93cml0ZV9yZWcoYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfUlhfRlJBTUVfQ05ULAorCQkJCSAgICAmZGF0YSk7CisJbmV0eGVuX25pY19sb2NrZWRfd3JpdGVfcmVnKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX0FHR1JfRVJST1JfQ05ULAorCQkJCSAgICAmZGF0YSk7CisJbmV0eGVuX25pY19sb2NrZWRfd3JpdGVfcmVnKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX0NSQ19FUlJPUl9DTlQsCisJCQkJICAgICZkYXRhKTsKKwluZXR4ZW5fbmljX2xvY2tlZF93cml0ZV9yZWcoYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfT1ZFUlNJWkVfRlJBTUVfRVJSLAorCQkJCSAgICAmZGF0YSk7CisJbmV0eGVuX25pY19sb2NrZWRfd3JpdGVfcmVnKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX1VOREVSU0laRV9GUkFNRV9FUlIsCisJCQkJICAgICZkYXRhKTsKKworCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7CisJbmV0eGVuX25pY19jbGVhcl9zdGF0cyhhZGFwdGVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50CituZXR4ZW5fbmljX2RvX2lvY3RsKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdm9pZCAqdV9kYXRhLAorCQkgICAgc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBuZXR4ZW5fbmljX2lvY3RsX2RhdGEgZGF0YTsKKwlzdHJ1Y3QgbmV0eGVuX25pY19pb2N0bF9kYXRhICp1cF9kYXRhOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBuZXR4ZW5fc3RhdGlzdGljcyBuZXR4ZW5fc3RhdHM7CisKKwl1cF9kYXRhID0gKHZvaWQgKil1X2RhdGE7CisKKwlEUFJJTlRLKElORk8sICJkb2luZyBpb2N0bCBmb3IgJXBcbiIsIGFkYXB0ZXIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKHZvaWQgX191c2VyICopdXBfZGF0YSwgc2l6ZW9mKGRhdGEpKSkgeworCQkvKiBldmlsIHVzZXIgdHJpZWQgdG8gY3Jhc2ggdGhlIGtlcm5lbCAqLworCQlEUFJJTlRLKEVSUiwgImJhZCBjb3B5IGZyb20gdXNlcmxhbmQ6ICVkXG4iLCAoaW50KXNpemVvZihkYXRhKSk7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCS8qIFNob3VsZG4ndCBhY2Nlc3MgYmV5b25kIGxlZ2FsIGxpbWl0cyBvZiAgImNoYXIgdVs2NF07IiBtZW1iZXIgKi8KKwlpZiAoIWRhdGEucHRyICYmIChkYXRhLnNpemUgPiBzaXplb2YoZGF0YS51KSkpIHsKKwkJLyogZXZpbCB1c2VyIHRyaWVkIHRvIGNyYXNoIHRoZSBrZXJuZWwgKi8KKwkJRFBSSU5USyhFUlIsICJiYWQgc2l6ZTogJWRcbiIsIGRhdGEuc2l6ZSk7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCXN3aXRjaCAoZGF0YS5jbWQpIHsKKwljYXNlIG5ldHhlbl9uaWNfY21kX3BjaV9yZWFkOgorCQlpZiAoKHJldHZhbCA9IG5ldHhlbl9uaWNfaHdfcmVhZF9pb2N0bChhZGFwdGVyLCBkYXRhLm9mZiwKKwkJCQkJCSAgICAgICAmKGRhdGEudSksIGRhdGEuc2l6ZSkpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJCWlmIChjb3B5X3RvX3VzZXIKKwkJICAgICgodm9pZCBfX3VzZXIgKikmKHVwX2RhdGEtPnUpLCAmKGRhdGEudSksIGRhdGEuc2l6ZSkpIHsKKwkJCURQUklOVEsoRVJSLCAiYmFkIGNvcHkgdG8gdXNlcmxhbmQ6ICVkXG4iLAorCQkJCShpbnQpc2l6ZW9mKGRhdGEpKTsKKwkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQorCQlkYXRhLnJ2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIG5ldHhlbl9uaWNfY21kX3BjaV93cml0ZToKKwkJaWYgKChyZXR2YWwgPSBuZXR4ZW5fbmljX2h3X3dyaXRlX2lvY3RsKGFkYXB0ZXIsIGRhdGEub2ZmLAorCQkJCQkJCSYoZGF0YS51KSwgZGF0YS5zaXplKSkpCisJCQlnb3RvIGVycm9yX291dDsKKwkJZGF0YS5ydiA9IDA7CisJCWJyZWFrOworCisJY2FzZSBuZXR4ZW5fbmljX2NtZF9wY2lfbWVtX3JlYWQ6CisJCWlmIChuZXR4ZW5fbmljX3BjaV9tZW1fcmVhZF9pb2N0bChhZGFwdGVyLCBkYXRhLm9mZiwgJihkYXRhLnUpLAorCQkJCQkJICBkYXRhLnNpemUpKSB7CisJCQlEUFJJTlRLKEVSUiwgIkZhaWxlZCB0byByZWFkIHRoZSBkYXRhLlxuIik7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcgorCQkgICAgKCh2b2lkIF9fdXNlciAqKSYodXBfZGF0YS0+dSksICYoZGF0YS51KSwgZGF0YS5zaXplKSkgeworCQkJRFBSSU5USyhFUlIsICJiYWQgY29weSB0byB1c2VybGFuZDogJWRcbiIsCisJCQkJKGludClzaXplb2YoZGF0YSkpOworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCWRhdGEucnYgPSAwOworCQlicmVhazsKKworCWNhc2UgbmV0eGVuX25pY19jbWRfcGNpX21lbV93cml0ZToKKwkJaWYgKChyZXR2YWwgPSBuZXR4ZW5fbmljX3BjaV9tZW1fd3JpdGVfaW9jdGwoYWRhcHRlciwgZGF0YS5vZmYsCisJCQkJCQkJICAgICAmKGRhdGEudSksCisJCQkJCQkJICAgICBkYXRhLnNpemUpKSkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlkYXRhLnJ2ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIG5ldHhlbl9uaWNfY21kX3BjaV9jb25maWdfcmVhZDoKKwkJc3dpdGNoIChkYXRhLnNpemUpIHsKKwkJY2FzZSAxOgorCQkJZGF0YS5ydiA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkJICAgICAgIGRhdGEub2ZmLAorCQkJCQkJICAgICAgIChjaGFyICopJihkYXRhLnUpKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYXRhLnJ2ID0gcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcHRlci0+YWh3LnBkZXYsCisJCQkJCQkgICAgICAgZGF0YS5vZmYsCisJCQkJCQkgICAgICAgKHNob3J0ICopJihkYXRhLnUpKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlkYXRhLnJ2ID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkJCWRhdGEub2ZmLAorCQkJCQkJCSh1MzIgKikgJiAoZGF0YS51KSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyCisJCSAgICAoKHZvaWQgX191c2VyICopJih1cF9kYXRhLT51KSwgJihkYXRhLnUpLCBkYXRhLnNpemUpKSB7CisJCQlEUFJJTlRLKEVSUiwgImJhZCBjb3B5IHRvIHVzZXJsYW5kOiAlZFxuIiwKKwkJCQkoaW50KXNpemVvZihkYXRhKSk7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIG5ldHhlbl9uaWNfY21kX3BjaV9jb25maWdfd3JpdGU6CisJCXN3aXRjaCAoZGF0YS5zaXplKSB7CisJCWNhc2UgMToKKwkJCWRhdGEucnYgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWRhcHRlci0+YWh3LnBkZXYsCisJCQkJCQkJZGF0YS5vZmYsCisJCQkJCQkJKihjaGFyICopJihkYXRhLnUpKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYXRhLnJ2ID0gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkJCWRhdGEub2ZmLAorCQkJCQkJCSooc2hvcnQgKikmKGRhdGEudSkpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWRhdGEucnYgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFkYXB0ZXItPmFody5wZGV2LAorCQkJCQkJCSBkYXRhLm9mZiwKKwkJCQkJCQkgKih1MzIgKikgJiAoZGF0YS51KSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgbmV0eGVuX25pY19jbWRfZ2V0X3N0YXRzOgorCQlkYXRhLnJ2ID0KKwkJICAgIG5ldHhlbl9uaWNfZmlsbF9zdGF0aXN0aWNzKGFkYXB0ZXIsIHBvcnQsICZuZXR4ZW5fc3RhdHMpOworCQlpZiAoY29weV90b191c2VyCisJCSAgICAoKHZvaWQgX191c2VyICopKHVwX2RhdGEtPnB0ciksICh2b2lkICopJm5ldHhlbl9zdGF0cywKKwkJICAgICBzaXplb2Yoc3RydWN0IG5ldHhlbl9zdGF0aXN0aWNzKSkpIHsKKwkJCURQUklOVEsoRVJSLCAiYmFkIGNvcHkgdG8gdXNlcmxhbmQ6ICVkXG4iLAorCQkJCShpbnQpc2l6ZW9mKG5ldHhlbl9zdGF0cykpOworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCXVwX2RhdGEtPnJ2ID0gZGF0YS5ydjsKKwkJYnJlYWs7CisKKwljYXNlIG5ldHhlbl9uaWNfY21kX2NsZWFyX3N0YXRzOgorCQlkYXRhLnJ2ID0gbmV0eGVuX25pY19jbGVhcl9zdGF0aXN0aWNzKGFkYXB0ZXIsIHBvcnQpOworCQl1cF9kYXRhLT5ydiA9IGRhdGEucnY7CisJCWJyZWFrOworCisJY2FzZSBuZXR4ZW5fbmljX2NtZF9nZXRfdmVyc2lvbjoKKwkJaWYgKGNvcHlfdG9fdXNlcgorCQkgICAgKCh2b2lkIF9fdXNlciAqKSYodXBfZGF0YS0+dSksIE5FVFhFTl9OSUNfTElOVVhfVkVSU0lPTklELAorCQkgICAgIHNpemVvZihORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCkpKSB7CisJCQlEUFJJTlRLKEVSUiwgImJhZCBjb3B5IHRvIHVzZXJsYW5kOiAlZFxuIiwKKwkJCQkoaW50KXNpemVvZihkYXRhKSk7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUFJJTlRLKElORk8sICJiYWQgY29tbWFuZCAlZCBmb3IgJXBcbiIsIGRhdGEuY21kLCBhZGFwdGVyKTsKKwkJcmV0dmFsID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlwdXRfdXNlcihkYXRhLnJ2LCAoJih1cF9kYXRhLT5ydikpKTsKKwlEUFJJTlRLKElORk8sICJkb25lIGlvY3RsIGZvciAlcCB3ZWxsLlxuIiwgYWRhcHRlcik7CisKKyAgICAgIGVycm9yX291dDoKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW9jdGwuaCBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyMWZhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2lvY3RsLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKi8KKworI2lmbmRlZiBfX05FVFhFTl9OSUNfSU9DVExfSF9fCisjZGVmaW5lIF9fTkVUWEVOX05JQ19JT0NUTF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2RlZmluZSBORVRYRU5fQ01EX1NUQVJUCVNJT0NERVZQUklWQVRFCisjZGVmaW5lIE5FVFhFTl9OSUNfQ01ECQkoTkVUWEVOX0NNRF9TVEFSVCArIDEpCisjZGVmaW5lIE5FVFhFTl9OSUNfTkFNRQkJKE5FVFhFTl9DTURfU1RBUlQgKyAyKQorI2RlZmluZSBORVRYRU5fTklDX05BTUVfTEVOCTE2CisjZGVmaW5lIE5FVFhFTl9OSUNfTkFNRV9SU1AJIk5FVFhFTi1VTk0iCisKK3R5cGVkZWYgZW51bSB7CisJbmV0eGVuX25pY19jbWRfbm9uZSA9IDAsCisJbmV0eGVuX25pY19jbWRfcGNpX3JlYWQsCisJbmV0eGVuX25pY19jbWRfcGNpX3dyaXRlLAorCW5ldHhlbl9uaWNfY21kX3BjaV9tZW1fcmVhZCwKKwluZXR4ZW5fbmljX2NtZF9wY2lfbWVtX3dyaXRlLAorCW5ldHhlbl9uaWNfY21kX3BjaV9jb25maWdfcmVhZCwKKwluZXR4ZW5fbmljX2NtZF9wY2lfY29uZmlnX3dyaXRlLAorCW5ldHhlbl9uaWNfY21kX2dldF9zdGF0cywKKwluZXR4ZW5fbmljX2NtZF9jbGVhcl9zdGF0cywKKwluZXR4ZW5fbmljX2NtZF9nZXRfdmVyc2lvbgorfSBuZXR4ZW5fbmljX2lvY3RsX2NtZF90OworCitzdHJ1Y3QgbmV0eGVuX25pY19pb2N0bF9kYXRhIHsKKwl1MzIgY21kOworCXUzMiB1bnVzZWQxOworCXU2NCBvZmY7CisJdTMyIHNpemU7CisJdTMyIHJ2OworCWNoYXIgdVs2NF07CisJdm9pZCAqcHRyOworfTsKKworc3RydWN0IG5ldHhlbl9zdGF0aXN0aWNzIHsKKwl1NjQgcnhfcGFja2V0czsKKwl1NjQgdHhfcGFja2V0czsKKwl1NjQgcnhfYnl0ZXM7CisJdTY0IHJ4X2Vycm9yczsKKwl1NjQgdHhfYnl0ZXM7CisJdTY0IHR4X2Vycm9yczsKKwl1NjQgcnhfY3JjX2Vycm9yczsKKwl1NjQgcnhfc2hvcnRfbGVuZ3RoX2Vycm9yOworCXU2NCByeF9sb25nX2xlbmd0aF9lcnJvcjsKKwl1NjQgcnhfbWFjX2Vycm9yczsKK307CisKKyNlbmRpZgkJCQkvKiBfX05FVFhFTl9OSUNfSU9DVExfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2lzci5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0NWY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2lzci5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiBOZXRYZW4sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogICAgaW5mb0BuZXR4ZW4uY29tCisgKiBOZXRYZW4sCisgKiAzOTY1IEZyZWVkb20gQ2lyY2xlLCBGb3VydGggZmxvb3IsCisgKiBTYW50YSBDbGFyYSwgQ0EgOTUwNTQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgIm5ldHhlbl9uaWMuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX2h3LmgiCisjaW5jbHVkZSAibmV0eGVuX25pY19waGFuX3JlZy5oIgorCisvKgorICogbmV0eGVuX25pY19nZXRfc3RhdHMgLSBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0eGVuX25pY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwb3J0LT5uZXRfc3RhdHM7CisKKwltZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKworCS8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQgICAqLworCXN0YXRzLT5yeF9wYWNrZXRzID0gcG9ydC0+c3RhdHMubm9fcmN2OworCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQgICAgKi8KKwlzdGF0cy0+dHhfcGFja2V0cyA9IHBvcnQtPnN0YXRzLnhtaXRlZGZyYW1lcyArIHBvcnQtPnN0YXRzLnhtaXRmaW5pc2hlZDsKKwkvKiB0b3RhbCBieXRlcyByZWNlaXZlZCAgICAgKi8KKwlzdGF0cy0+cnhfYnl0ZXMgPSBwb3J0LT5zdGF0cy5yeGJ5dGVzOworCS8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkICAqLworCXN0YXRzLT50eF9ieXRlcyA9IHBvcnQtPnN0YXRzLnR4Ynl0ZXM7CisJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQgICAgICovCisJc3RhdHMtPnJ4X2Vycm9ycyA9IHBvcnQtPnN0YXRzLnJjdmRiYWRza2I7CisJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zICovCisJc3RhdHMtPnR4X2Vycm9ycyA9IHBvcnQtPnN0YXRzLm5vY21kZGVzY3JpcHRvcjsKKwkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzICAgICovCisJc3RhdHMtPnJ4X2Ryb3BwZWQgPSBwb3J0LT5zdGF0cy51cGRyb3BwZWQ7CisJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4ICAqLworCXN0YXRzLT50eF9kcm9wcGVkID0gcG9ydC0+c3RhdHMudHhkcm9wcGVkOworCisJcmV0dXJuIHN0YXRzOworfQorCit2b2lkIG5ldHhlbl9pbmRpY2F0ZV9saW5rX3N0YXR1cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBwb3J0bm8sCisJCQkJIHUzMiBsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAoYWRhcHRlci0+cG9ydFtwb3J0bm9dKS0+bmV0ZGV2OworCisJaWYgKGxpbmspCisJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwllbHNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7Cit9CisKK3ZvaWQgbmV0eGVuX2hhbmRsZV9wb3J0X2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBwb3J0bm8sCisJCQkgICAgdTMyIGVuYWJsZSkKK3sKKwlfX2xlMzIgaW50X3NyYzsKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQ7CisKKwkvKiAgVGhpcyBzaG91bGQgY2xlYXIgdGhlIGludGVycnVwdCBzb3VyY2UgKi8KKwlpZiAoYWRhcHRlci0+cGh5X3JlYWQpCisJCWFkYXB0ZXItPnBoeV9yZWFkKGFkYXB0ZXIsIHBvcnRubywKKwkJCQkgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9JTlRfU1RBVFVTLAorCQkJCSAgJmludF9zcmMpOworCWlmIChpbnRfc3JjID09IDApIHsKKwkJRFBSSU5USyhJTkZPLCAiTm8gcGh5IGludGVycnVwdHMgZm9yIHBvcnQgIyVkXG4iLCBwb3J0bm8pOworCQlyZXR1cm47CisJfQorCWlmIChhZGFwdGVyLT5kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKQorCQlhZGFwdGVyLT5kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnRubyk7CisKKwlwb3J0ID0gYWRhcHRlci0+cG9ydFtwb3J0bm9dOworCisJaWYgKG5ldHhlbl9nZXRfcGh5X2ludF9qYWJiZXIoaW50X3NyYykpCisJCURQUklOVEsoSU5GTywgIkphYmJlciBpbnRlcnJ1cHQgXG4iKTsKKworCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfcG9sYXJpdHlfY2hhbmdlZChpbnRfc3JjKSkKKwkJRFBSSU5USyhJTkZPLCAiUE9MQVJJVFkgQ0hBTkdFRCBpbnQgXG4iKTsKKworCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfZW5lcmd5X2RldGVjdChpbnRfc3JjKSkKKwkJRFBSSU5USyhJTkZPLCAiRU5FUkdZIERFVEVDVCBJTlQgXG4iKTsKKworCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfZG93bnNoaWZ0KGludF9zcmMpKQorCQlEUFJJTlRLKElORk8sICJET1dOU0hJRlQgSU5UIFxuIik7CisJLyogd3JpdGUgaXQgZG93biBsYXRlci4uICovCisJaWYgKChuZXR4ZW5fZ2V0X3BoeV9pbnRfc3BlZWRfY2hhbmdlZChpbnRfc3JjKSkKKwkgICAgfHwgKG5ldHhlbl9nZXRfcGh5X2ludF9saW5rX3N0YXR1c19jaGFuZ2VkKGludF9zcmMpKSkgeworCQlfX2xlMzIgc3RhdHVzOworCisJCURQUklOVEsoSU5GTywgIlNQRUVEIENIQU5HRUQgT1IgTElOSyBTVEFUVVMgQ0hBTkdFRCBcbiIpOworCisJCWlmIChhZGFwdGVyLT5waHlfcmVhZAorCQkgICAgJiYgYWRhcHRlci0+cGh5X3JlYWQoYWRhcHRlciwgcG9ydG5vLAorCQkJCQkgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX1BIWV9TVEFUVVMsCisJCQkJCSAmc3RhdHVzKSA9PSAwKSB7CisJCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2xpbmtfc3RhdHVzX2NoYW5nZWQoaW50X3NyYykpIHsKKwkJCQlpZiAobmV0eGVuX2dldF9waHlfbGluayhzdGF0dXMpKSB7CisJCQkJCW5ldHhlbl9uaXVfZ2JlX2luaXRfcG9ydChhZGFwdGVyLAorCQkJCQkJCQkgcG9ydG5vKTsKKwkJCQkJcHJpbnRrKCIlczogJXMgTGluayBVUFxuIiwKKwkJCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCQkJCSAgICAgICBwb3J0LT5uZXRkZXYtPm5hbWUpOworCisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCIlczogJXMgTGluayBET1dOXG4iLAorCQkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkJCQkJICAgICAgIHBvcnQtPm5ldGRldi0+bmFtZSk7CisJCQkJfQorCQkJCW5ldHhlbl9pbmRpY2F0ZV9saW5rX3N0YXR1cyhhZGFwdGVyLCBwb3J0bm8sCisJCQkJCQkJICAgIG5ldHhlbl9nZXRfcGh5X2xpbmsKKwkJCQkJCQkgICAgKHN0YXR1cykpOworCQkJfQorCQl9CisJfQorCWlmIChhZGFwdGVyLT5lbmFibGVfcGh5X2ludGVycnVwdHMpCisJCWFkYXB0ZXItPmVuYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0bm8pOworfQorCit2b2lkIG5ldHhlbl9uaWNfaXNyX290aGVyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgcG9ydG5vOworCXUzMiB2YWwsIGxpbmt1cCwgcWdfbGlua3N1cDsKKworCS8qIHZlcmlmeSB0aGUgb2Zmc2V0ICovCisJdmFsID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX1hHX1NUQVRFKSk7CisJaWYgKHZhbCA9PSBhZGFwdGVyLT5haHcucWdfbGlua3N1cCkKKwkJcmV0dXJuOworCisJcWdfbGlua3N1cCA9IGFkYXB0ZXItPmFody5xZ19saW5rc3VwOworCWFkYXB0ZXItPmFody5xZ19saW5rc3VwID0gdmFsOworCURQUklOVEsoSU5GTywgImxpbmsgdXBkYXRlIDB4JTA4eFxuIiwgdmFsKTsKKwlmb3IgKHBvcnRubyA9IDA7IHBvcnRubyA8IE5FVFhFTl9OSVVfTUFYX0dCRV9QT1JUUzsgcG9ydG5vKyspIHsKKwkJbGlua3VwID0gdmFsICYgMTsKKwkJaWYgKGxpbmt1cCAhPSAocWdfbGlua3N1cCAmIDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUE9SVCAlZCBsaW5rICVzXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHBvcnRubywKKwkJCSAgICAgICAoKGxpbmt1cCA9PSAwKSA/ICJkb3duIiA6ICJ1cCIpKTsKKwkJCW5ldHhlbl9pbmRpY2F0ZV9saW5rX3N0YXR1cyhhZGFwdGVyLCBwb3J0bm8sIGxpbmt1cCk7CisJCQlpZiAobGlua3VwKQorCQkJCW5ldHhlbl9uaWNfc2V0X2xpbmtfcGFyYW1ldGVycyhhZGFwdGVyLT4KKwkJCQkJCQkgICAgICAgcG9ydFtwb3J0bm9dKTsKKworCQl9CisJCXZhbCA9IHZhbCA+PiAxOworCQlxZ19saW5rc3VwID0gcWdfbGlua3N1cCA+PiAxOworCX0KKworCWFkYXB0ZXItPnN0YXRzLm90aGVyaW50cysrOworCit9CisKK3ZvaWQgbmV0eGVuX25pY19nYmVfaGFuZGxlX3BoeV9pbnRyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwluZXR4ZW5fbmljX2lzcl9vdGhlcihhZGFwdGVyKTsKK30KKwordm9pZCBuZXR4ZW5fbmljX3hnYmVfaGFuZGxlX3BoeV9pbnRyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+cG9ydFswXS0+bmV0ZGV2OworCXUzMiB2YWw7CisKKwkvKiBXSU5ET1cgPSAxICovCisJdmFsID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX1hHX1NUQVRFKSk7CisKKwlpZiAoYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9PSAxICYmIHZhbCAhPSBYR19MSU5LX1VQKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBOSUMgTGluayBpcyBkb3duXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKKwkJYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9IDA7CisJCS8qIHJlYWQgdHdpY2UgdG8gY2xlYXIgc3RpY2t5IGJpdHMgKi8KKwkJLyogV0lORE9XID0gMCAqLworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9YR19TVEFUVVMsICZ2YWwpOworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9YR19TVEFUVVMsICZ2YWwpOworCisJCWlmICgodmFsICYgMHhmZmIpICE9IDB4ZmZiKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlcyBJU1I6IFN5bmMvQWxpZ24gQkFEOiAweCUwOHhcbiIsCisJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgdmFsKTsKKwkJfQorCX0gZWxzZSBpZiAoYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9PSAwICYmIHZhbCA9PSBYR19MSU5LX1VQKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBOSUMgTGluayBpcyB1cFxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSk7CisJCWFkYXB0ZXItPmFody54Z19saW5rdXAgPSAxOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzViNzFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCkBAIC0wLDAgKzEsMTIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgTmV0WGVuLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICAgIGluZm9AbmV0eGVuLmNvbQorICogTmV0WGVuLAorICogMzk2NSBGcmVlZG9tIENpcmNsZSwgRm91cnRoIGZsb29yLAorICogU2FudGEgQ2xhcmEsIENBIDk1MDU0CisgKgorICoKKyAqICBNYWluIHNvdXJjZSBmaWxlIGZvciBOZXRYZW4gTklDIERyaXZlciBvbiBMaW51eAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlICJuZXR4ZW5fbmljX2h3LmgiCisKKyNpbmNsdWRlICJuZXR4ZW5fbmljLmgiCisjZGVmaW5lIERFRklORV9HTE9CQUxfUkVDVl9DUkIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX3BoYW5fcmVnLmgiCisjaW5jbHVkZSAibmV0eGVuX25pY19pb2N0bC5oIgorCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNkZWZpbmUgUEhBTl9WRU5ET1JfSUQgMHg0MDQwCisKK01PRFVMRV9ERVNDUklQVElPTigiTmV0WGVuIE11bHRpIHBvcnQgKDEvMTApIEdpZ2FiaXQgTmV0d29yayBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKE5FVFhFTl9OSUNfTElOVVhfVkVSU0lPTklEKTsKKworY2hhciBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lW10gPSAibmV0eGVuLW5pYyI7CitzdGF0aWMgY2hhciBuZXR4ZW5fbmljX2RyaXZlcl9zdHJpbmdbXSA9ICJOZXRYZW4gTmV0d29yayBEcml2ZXIgdmVyc2lvbiAiCisgICAgTkVUWEVOX05JQ19MSU5VWF9WRVJTSU9OSUQ7CisKK3N0cnVjdCBuZXR4ZW5fYWRhcHRlciAqZ19hZGFwdGVyID0gTlVMTDsKKworI2RlZmluZSBORVRYRU5fTkVUREVWX1dFSUdIVCAxMjAKKyNkZWZpbmUgTkVUWEVOX0FEQVBURVJfVVBfTUFHSUMgNzc3CisjZGVmaW5lIE5FVFhFTl9OSUNfUEVHX1RVTkUgMAorCit1OCBueF9wMl9pZCA9IE5YX1AyX0MwOworCisjZGVmaW5lIERNQV8zMkJJVF9NQVNLCTB4MDAwMDAwMDBmZmZmZmZmZlVMTAorI2RlZmluZSBETUFfMzVCSVRfTUFTSwkweDAwMDAwMDA3ZmZmZmZmZmZVTEwKKworLyogTG9jYWwgZnVuY3Rpb25zIHRvIE5ldFhlbiBOSUMgZHJpdmVyICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBuZXR4ZW5fbmljX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IG5ldHhlbl9uaWNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgbmV0eGVuX25pY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIGludCBuZXR4ZW5fbmljX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIGludCBuZXR4ZW5fbmljX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBuZXR4ZW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIG5ldHhlbl90eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIG5ldHhlbl93YXRjaGRvZyh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbnQgbmV0eGVuX2hhbmRsZV9pbnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBuZXR4ZW5fbmljX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworc3RhdGljIGludCBuZXR4ZW5fbmljX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuZXR4ZW5fbmljX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKKyNlbmRpZgorc3RhdGljIGlycXJldHVybl90IG5ldHhlbl9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpOworCisvKiAgUENJIERldmljZSBJRCBUYWJsZSAgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuZXR4ZW5fcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9ERVZJQ0UoMHg0MDQwLCAweDAwMDEpfSwKKwl7UENJX0RFVklDRSgweDQwNDAsIDB4MDAwMil9LAorCXtQQ0lfREVWSUNFKDB4NDA0MCwgMHgwMDAzKX0sCisJe1BDSV9ERVZJQ0UoMHg0MDQwLCAweDAwMDQpfSwKKwl7UENJX0RFVklDRSgweDQwNDAsIDB4MDAwNSl9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBuZXR4ZW5fcGNpX3RibCk7CisKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpuZXR4ZW5fd29ya3E7CitzdGF0aWMgdm9pZCBuZXR4ZW5fd2F0Y2hkb2codW5zaWduZWQgbG9uZyk7CisKKy8qCisgKiBuZXR4ZW5fbmljX3Byb2JlKCkKKyAqCisgKiBUaGUgTGludXggc3lzdGVtIHdpbGwgaW52b2tlIHRoaXMgYWZ0ZXIgaWRlbnRpZnlpbmcgdGhlIHZlbmRvciBJRCBhbmQKKyAqIGRldmljZSBJZCBpbiB0aGUgcGNpX3RibCBzdXBwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuCisgKgorICogQSBxdWFkIHBvcnQgY2FyZCBoYXMgb25lIG9wZXJhdGlvbmFsIFBDSSBjb25maWcgc3BhY2UsIChmdW5jdGlvbiAwKSwKKyAqIHdoaWNoIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBmb3VyIHBvcnRzLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGluaXRpYWxpemUgdGhlIGFkYXB0ZXIsIGFuZCBzZXR1cCB0aGUgZ2xvYmFsIHBhcmFtZXRlcnMKKyAqIGFsb25nIHdpdGggdGhlIHBvcnQncyBzcGVjaWZpYyBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CituZXR4ZW5fbmljX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBOVUxMOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IE5VTEw7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKm1lbV9wdHIwID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKm1lbV9wdHIxID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKm1lbV9wdHIyID0gTlVMTDsKKworCXU4ICpkYl9wdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbWVtX2Jhc2UsIG1lbV9sZW4sIGRiX2Jhc2UsIGRiX2xlbjsKKwlpbnQgcGNpX3VzaW5nX2RhYywgaSwgZXJyOworCWludCByaW5nOworCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eCA9IE5VTEw7CisJc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jdHggKnJjdl9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIgKmNtZF9idWZfYXJyID0gTlVMTDsKKwl1NjQgbWFjX2FkZHJbRkxBU0hfTlVNX1BPUlRTICsgMV07CisJaW50IHZhbGlkX21hYyA9IDA7CisJc3RhdGljIGludCBuZXR4ZW5fY2FyZHNfZm91bmQgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgXG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9zdHJpbmcpOworCS8qIEluIGN1cnJlbnQgc2NoZW1lLCB3ZSB1c2Ugb25seSBQQ0kgZnVuY3Rpb24gMCAqLworCWlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgIT0gMCkgeworCQlEUFJJTlRLKEVSUiwgIk5ldFhlbiBmdW5jdGlvbiAlZCB3aWxsIG5vdCBiZSBlbmFibGVkLlxuIiwKKwkJCVBDSV9GVU5DKHBkZXYtPmRldmZuKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSkpKQorCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmbnhfcDJfaWQpOworCWlmIChueF9wMl9pZCA9PSBOWF9QMl9DMSAmJgorCSAgICAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzVCSVRfTUFTSykgPT0gMCkgJiYKKwkgICAgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzVCSVRfTUFTSykgPT0gMCkpIHsKKwkJcGNpX3VzaW5nX2RhYyA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKChlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgfHwKKwkJICAgIChlcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSkKKwkJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKworCQlwY2lfdXNpbmdfZGFjID0gMDsKKwl9CisKKwkvKiByZW1hcCBwaHlzIGFkZHJlc3MgKi8KKwltZW1fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsJLyogMCBpcyBmb3IgQkFSIDAgKi8KKwltZW1fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCS8qIDEyOCBNZWcgb2YgbWVtb3J5ICovCisJbWVtX3B0cjAgPSBpb3JlbWFwKG1lbV9iYXNlLCBGSVJTVF9QQUdFX0dST1VQX1NJWkUpOworCW1lbV9wdHIxID0KKwkgICAgaW9yZW1hcChtZW1fYmFzZSArIFNFQ09ORF9QQUdFX0dST1VQX1NUQVJULCBTRUNPTkRfUEFHRV9HUk9VUF9TSVpFKTsKKwltZW1fcHRyMiA9CisJICAgIGlvcmVtYXAobWVtX2Jhc2UgKyBUSElSRF9QQUdFX0dST1VQX1NUQVJULCBUSElSRF9QQUdFX0dST1VQX1NJWkUpOworCisJaWYgKChtZW1fcHRyMCA9PSAwVUwpIHx8IChtZW1fcHRyMSA9PSAwVUwpIHx8IChtZW1fcHRyMiA9PSAwVUwpKSB7CisJCURQUklOVEsoRVJSLAorCQkJIkNhbm5vdCByZW1hcCBhZGFwdGVyIG1lbW9yeSBhYm9ydGluZy46IgorCQkJIjAgLT4gJXAsIDEgLT4gJXAsIDIgLT4gJXBcbiIsCisJCQltZW1fcHRyMCwgbWVtX3B0cjEsIG1lbV9wdHIyKTsKKworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisJZGJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsJLyogZG9vcmJlbGwgaXMgb24gYmFyIDQgKi8KKwlkYl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDQpOworCisJaWYgKGRiX2xlbiA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRvb3JiZWxsIGlzIGRpc2FibGVkXG4iLAorCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKwlEUFJJTlRLKElORk8sICJkb29yYmVsbCBpb3JlbWFwIGZyb20gJWx4IGEgc2l6ZSBvZiAlbHhcbiIsIGRiX2Jhc2UsCisJCWRiX2xlbik7CisKKwlkYl9wdHIgPSBpb3JlbWFwKGRiX2Jhc2UsIE5FVFhFTl9EQl9NQVBTSVpFX0JZVEVTKTsKKwlpZiAoZGJfcHRyID09IDBVTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgZG9vcmJlbGwgbWFwLiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCURQUklOVEsoSU5GTywgImRvb3JiZWxsIGlvcmVtYXBlZCBhdCAlcFxuIiwgZGJfcHRyKTsKKworLyoKKyAqICAgICAgQWxsb2NhdGUgYSBhZGFwdGVyIHN0cnVjdHVyZSB3aGljaCB3aWxsIG1hbmFnZSBhbGwgdGhlIGluaXRpYWxpemF0aW9uCisgKiAgICAgIGFzIHdlbGwgYXMgdGhlIGNvbW1vbiByZXNvdXJjZXMgZm9yIGFsbCBwb3J0cy4uLgorICogICAgICBhbGwgdGhlIHBvcnRzIHdpbGwgaGF2ZSBwb2ludGVyIHRvIHRoaXMgYWRhcHRlciBhcyB3ZWxsIGFzIEFkYXB0ZXIKKyAqICAgICAgd2lsbCBoYXZlIHBvaW50ZXJzIG9mIGFsbCB0aGUgcG9ydHMgc3RydWN0dXJlcy4KKyAqLworCisJLyogT25lIGFkYXB0ZXIgc3RydWN0dXJlIGZvciBhbGwgNCBwb3J0cy4uLi4gICAqLworCWFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBhZGFwdGVyIG1lbW9yeTolZFxuIiwKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCSAgICAgICAoaW50KXNpemVvZihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIpKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2RidW5tYXA7CisJfQorCisJaWYgKG5ldHhlbl9jYXJkc19mb3VuZCA9PSAwKSB7CisJCWdfYWRhcHRlciA9IGFkYXB0ZXI7CisJfQorCWFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50ID0gTUFYX0NNRF9ERVNDUklQVE9SUzsKKwlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlM7CisJYWRhcHRlci0+bWF4X2p1bWJvX3J4X2Rlc2NfY291bnQgPSBNQVhfSlVNQk9fUkNWX0RFU0NSSVBUT1JTOworCWFkYXB0ZXItPm1heF9scm9fcnhfZGVzY19jb3VudCA9IE1BWF9MUk9fUkNWX0RFU0NSSVBUT1JTOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOworCisJY21kX2J1Zl9hcnIgPSAoc3RydWN0IG5ldHhlbl9jbWRfYnVmZmVyICopdm1hbGxvYyhUWF9SSU5HU0laRSk7CisJaWYgKGNtZF9idWZfYXJyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBjbWRfYnVmX2FyciBtZW1vcnk6JWRcbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCAoaW50KVRYX1JJTkdTSVpFKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfYWRhcHRlcjsKKwl9CisJbWVtc2V0KGNtZF9idWZfYXJyLCAwLCBUWF9SSU5HU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1JDVl9DVFg7ICsraSkgeworCQlyZWN2X2N0eCA9ICZhZGFwdGVyLT5yZWN2X2N0eFtpXTsKKwkJZm9yIChyaW5nID0gMDsgcmluZyA8IE5VTV9SQ1ZfREVTQ19SSU5HUzsgcmluZysrKSB7CisJCQlyY3ZfZGVzYyA9ICZyZWN2X2N0eC0+cmN2X2Rlc2NbcmluZ107CisJCQlzd2l0Y2ggKFJDVl9ERVNDX1RZUEUocmluZykpIHsKKwkJCWNhc2UgUkNWX0RFU0NfTk9STUFMOgorCQkJCXJjdl9kZXNjLT5tYXhfcnhfZGVzY19jb3VudCA9CisJCQkJICAgIGFkYXB0ZXItPm1heF9yeF9kZXNjX2NvdW50OworCQkJCXJjdl9kZXNjLT5mbGFncyA9IFJDVl9ERVNDX05PUk1BTDsKKwkJCQlyY3ZfZGVzYy0+ZG1hX3NpemUgPSBSWF9ETUFfTUFQX0xFTjsKKwkJCQlyY3ZfZGVzYy0+c2tiX3NpemUgPSBNQVhfUlhfQlVGRkVSX0xFTkdUSDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSQ1ZfREVTQ19KVU1CTzoKKwkJCQlyY3ZfZGVzYy0+bWF4X3J4X2Rlc2NfY291bnQgPQorCQkJCSAgICBhZGFwdGVyLT5tYXhfanVtYm9fcnhfZGVzY19jb3VudDsKKwkJCQlyY3ZfZGVzYy0+ZmxhZ3MgPSBSQ1ZfREVTQ19KVU1CTzsKKwkJCQlyY3ZfZGVzYy0+ZG1hX3NpemUgPSBSWF9KVU1CT19ETUFfTUFQX0xFTjsKKwkJCQlyY3ZfZGVzYy0+c2tiX3NpemUgPSBNQVhfUlhfSlVNQk9fQlVGRkVSX0xFTkdUSDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSQ1ZfUklOR19MUk86CisJCQkJcmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50ID0KKwkJCQkgICAgYWRhcHRlci0+bWF4X2xyb19yeF9kZXNjX2NvdW50OworCQkJCXJjdl9kZXNjLT5mbGFncyA9IFJDVl9ERVNDX0xSTzsKKwkJCQlyY3ZfZGVzYy0+ZG1hX3NpemUgPSBSWF9MUk9fRE1BX01BUF9MRU47CisJCQkJcmN2X2Rlc2MtPnNrYl9zaXplID0gTUFYX1JYX0xST19CVUZGRVJfTEVOR1RIOworCQkJCWJyZWFrOworCisJCQl9CisJCQlyY3ZfZGVzYy0+cnhfYnVmX2FyciA9IChzdHJ1Y3QgbmV0eGVuX3J4X2J1ZmZlciAqKQorCQkJICAgIHZtYWxsb2MoUkNWX0JVRkZTSVpFKTsKKworCQkJaWYgKHJjdl9kZXNjLT5yeF9idWZfYXJyID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUiCisJCQkJICAgICAgICJyY3ZfZGVzYy0+cnhfYnVmX2FyciBtZW1vcnk6JWRcbiIsCisJCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCQkJICAgICAgIChpbnQpUkNWX0JVRkZTSVpFKTsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyX291dF9mcmVlX3J4X2J1ZmZlcjsKKwkJCX0KKwkJCW1lbXNldChyY3ZfZGVzYy0+cnhfYnVmX2FyciwgMCwgUkNWX0JVRkZTSVpFKTsKKwkJfQorCisJfQorCisJYWRhcHRlci0+Y21kX2J1Zl9hcnIgPSBjbWRfYnVmX2FycjsKKwlhZGFwdGVyLT5haHcucGNpX2Jhc2UwID0gbWVtX3B0cjA7CisJYWRhcHRlci0+YWh3LnBjaV9iYXNlMSA9IG1lbV9wdHIxOworCWFkYXB0ZXItPmFody5wY2lfYmFzZTIgPSBtZW1fcHRyMjsKKwlhZGFwdGVyLT5haHcuZGJfYmFzZSA9IGRiX3B0cjsKKwlhZGFwdGVyLT5haHcuZGJfbGVuID0gZGJfbGVuOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bG9jayk7CisJbmV0eGVuX2luaXRpYWxpemVfYWRhcHRlcl9zdyhhZGFwdGVyKTsJLyogaW5pdGlhbGl6ZSB0aGUgYnVmZmVycyBpbiBhZGFwdGVyICovCisjaWZkZWYgQ09ORklHX0lBNjQKKwluZXR4ZW5fcGluaXRfZnJvbV9yb20oYWRhcHRlciwgMCk7CisJdWRlbGF5KDUwMCk7CisJbmV0eGVuX2xvYWRfZmlybXdhcmUoYWRhcHRlcik7CisjZW5kaWYKKworCS8qCisJICogU2V0IHRoZSBDUkIgd2luZG93IHRvIGludmFsaWQuIElmIGFueSByZWdpc3RlciBpbiB3aW5kb3cgMCBpcworCSAqIGFjY2Vzc2VkIGl0IHNob3VsZCBzZXQgdGhlIHdpbmRvdyB0byAwIGFuZCB0aGVuIHJlc2V0IGl0IHRvIDEuCisJICovCisJYWRhcHRlci0+Y3Vycl93aW5kb3cgPSAyNTU7CisJLyoKKwkgKiAgQWRhcHRlciBpbiBvdXIgY2FzZSBpcyBxdWFkIHBvcnQgc28gaW5pdGlhbGl6ZSBpdCBiZWZvcmUKKwkgKiAgaW5pdGlhbGl6aW5nIHRoZSBwb3J0cworCSAqLworCW5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfaHcoYWRhcHRlcik7CS8qIGluaXRpYWxpemUgdGhlIGFkYXB0ZXIgKi8KKworCW5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfb3BzKGFkYXB0ZXIpOworCisJaW5pdF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIpOworCWFkYXB0ZXItPmFody54Z19saW5rdXAgPSAwOworCWFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLmZ1bmN0aW9uID0gJm5ldHhlbl93YXRjaGRvZzsKKwlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYWRhcHRlcjsKKwlJTklUX1dPUksoJmFkYXB0ZXItPndhdGNoZG9nX3Rhc2ssIG5ldHhlbl93YXRjaGRvZ190YXNrKTsKKwlhZGFwdGVyLT5haHcucGRldiA9IHBkZXY7CisJYWRhcHRlci0+cHJvY19jbWRfYnVmX2NvdW50ZXIgPSAwOworCWFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCA9IG54X3AyX2lkOworCisJaWYgKHBjaV9lbmFibGVfbXNpKHBkZXYpKSB7CisJCWFkYXB0ZXItPmZsYWdzICY9IH5ORVRYRU5fTklDX01TSV9FTkFCTEVEOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIE1TSSBpbnRlcnJ1cHQiCisJCSAgICAgICAiIGVycm9yXG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKwl9IGVsc2UKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gTkVUWEVOX05JQ19NU0lfRU5BQkxFRDsKKworCWlmIChuZXR4ZW5faXNfZmxhc2hfc3VwcG9ydGVkKGFkYXB0ZXIpID09IDAgJiYKKwkgICAgbmV0eGVuX2dldF9mbGFzaF9tYWNfYWRkcihhZGFwdGVyLCBtYWNfYWRkcikgPT0gMCkKKwkJdmFsaWRfbWFjID0gMTsKKwllbHNlCisJCXZhbGlkX21hYyA9IDA7CisKKwkvKgorCSAqIEluaXRpYWxpemUgYWxsIHRoZSBDUkIgcmVnaXN0ZXJzIGhlcmUuCisJICovCisJd3JpdGVsKDAsIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DTURfUFJPRFVDRVJfT0ZGU0VUKSk7CisJd3JpdGVsKDAsIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DTURfQ09OU1VNRVJfT0ZGU0VUKSk7CisJd3JpdGVsKDAsIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9IT1NUX0NNRF9BRERSX0xPKSk7CisKKwkvKiBkbyB0aGlzIGJlZm9yZSB3YWtpbmcgdXAgcGVncyBzbyB0aGF0IHdlIGhhdmUgdmFsaWQgZHVtbXkgZG1hIGFkZHIgKi8KKwllcnIgPSBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX29mZmxvYWQoYWRhcHRlcik7CisJaWYgKGVycikgeworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCisJLyogVW5sb2NrIHRoZSBIVywgcHJvbXB0aW5nIHRoZSBib290IHNlcXVlbmNlICovCisJd3JpdGVsKDEsCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORSkpOworCisJLyogSGFuZHNoYWtlIHdpdGggdGhlIGNhcmQgYmVmb3JlIHdlIHJlZ2lzdGVyIHRoZSBkZXZpY2VzLiAqLworCW5ldHhlbl9waGFudG9tX2luaXQoYWRhcHRlciwgTkVUWEVOX05JQ19QRUdfVFVORSk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBhbGwgdGhlIHBvcnRzICovCisJYWRhcHRlci0+YWN0aXZlX3BvcnRzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOyBpKyspIHsKKwkJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fcG9ydCkpOworCQlpZiAoIW5ldGRldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFsbG9jYXRlIG5ldGRldiBmb3IgcG9ydCIKKwkJCSAgICAgICAiICVkXG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBpICsgMSk7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJCX0KKworCQlTRVRfTU9EVUxFX09XTkVSKG5ldGRldik7CisJCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisKKwkJcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJCXBvcnQtPm5ldGRldiA9IG5ldGRldjsKKwkJcG9ydC0+cGRldiA9IHBkZXY7CisJCXBvcnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCQlwb3J0LT5wb3J0bnVtID0gaTsJLyogR2lnYWJpdCBwb3J0IG51bWJlciBmcm9tIDAtMyAqLworCisJCW5ldGRldi0+b3BlbiA9IG5ldHhlbl9uaWNfb3BlbjsKKwkJbmV0ZGV2LT5zdG9wID0gbmV0eGVuX25pY19jbG9zZTsKKwkJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBuZXR4ZW5fbmljX3htaXRfZnJhbWU7CisJCW5ldGRldi0+Z2V0X3N0YXRzID0gbmV0eGVuX25pY19nZXRfc3RhdHM7CisJCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gbmV0eGVuX25pY19zZXRfbXVsdGk7CisJCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gbmV0eGVuX25pY19zZXRfbWFjOworCQluZXRkZXYtPmNoYW5nZV9tdHUgPSBuZXR4ZW5fbmljX2NoYW5nZV9tdHU7CisJCW5ldGRldi0+ZG9faW9jdGwgPSBuZXR4ZW5fbmljX2lvY3RsOworCQluZXRkZXYtPnR4X3RpbWVvdXQgPSBuZXR4ZW5fdHhfdGltZW91dDsKKwkJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaOworCisJCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZuZXR4ZW5fbmljX2V0aHRvb2xfb3BzKTsKKwkJbmV0ZGV2LT5wb2xsID0gbmV0eGVuX25pY19wb2xsOworCQluZXRkZXYtPndlaWdodCA9IE5FVFhFTl9ORVRERVZfV0VJR0hUOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJCW5ldGRldi0+cG9sbF9jb250cm9sbGVyID0gbmV0eGVuX25pY19wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKwkJLyogU2NhdHRlckdhdGhlciBzdXBwb3J0ICovCisJCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHOworCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTTsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKworCQlpZiAocGNpX3VzaW5nX2RhYykKKwkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCisJCWlmICh2YWxpZF9tYWMpIHsKKwkJCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSZtYWNfYWRkcltpXTsKKwkJCW5ldGRldi0+ZGV2X2FkZHJbMF0gPSAqKHAgKyA1KTsKKwkJCW5ldGRldi0+ZGV2X2FkZHJbMV0gPSAqKHAgKyA0KTsKKwkJCW5ldGRldi0+ZGV2X2FkZHJbMl0gPSAqKHAgKyAzKTsKKwkJCW5ldGRldi0+ZGV2X2FkZHJbM10gPSAqKHAgKyAyKTsKKwkJCW5ldGRldi0+ZGV2X2FkZHJbNF0gPSAqKHAgKyAxKTsKKwkJCW5ldGRldi0+ZGV2X2FkZHJbNV0gPSAqKHAgKyAwKTsKKworCQkJbWVtY3B5KG5ldGRldi0+cGVybV9hZGRyLCBuZXRkZXYtPmRldl9hZGRyLAorCQkJICAgICAgIG5ldGRldi0+YWRkcl9sZW4pOworCQkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG5ldGRldi0+cGVybV9hZGRyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJhZCBNQUMgYWRkcmVzcyAiCisJCQkJICAgICAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC5cbiIsCisJCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCQkJICAgICAgIG5ldGRldi0+ZGV2X2FkZHJbMF0sCisJCQkJICAgICAgIG5ldGRldi0+ZGV2X2FkZHJbMV0sCisJCQkJICAgICAgIG5ldGRldi0+ZGV2X2FkZHJbMl0sCisJCQkJICAgICAgIG5ldGRldi0+ZGV2X2FkZHJbM10sCisJCQkJICAgICAgIG5ldGRldi0+ZGV2X2FkZHJbNF0sCisJCQkJICAgICAgIG5ldGRldi0+ZGV2X2FkZHJbNV0pOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYWRhcHRlci0+bWFjYWRkcl9zZXQpCisJCQkJCWFkYXB0ZXItPm1hY2FkZHJfc2V0KHBvcnQsCisJCQkJCQkJICAgICBuZXRkZXYtPmRldl9hZGRyKTsKKwkJCX0KKwkJfQorCQlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CisJCUlOSVRfV09SSygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrLCBuZXR4ZW5fdHhfdGltZW91dF90YXNrKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJCWlmICgoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkIHBvcnQgIyVkIgorCQkJICAgICAgICIgYWJvcnRpbmdcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGkgKyAxKTsKKwkJCWVyciA9IC1FSU87CisJCQlmcmVlX25ldGRldihuZXRkZXYpOworCQkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCQl9CisJCWFkYXB0ZXItPnBvcnRfY291bnQrKzsKKwkJYWRhcHRlci0+cG9ydFtpXSA9IHBvcnQ7CisJfQorCisJLyoKKwkgKiBkZWxheSBhIHdoaWxlIHRvIGVuc3VyZSB0aGF0IHRoZSBQZWdzIGFyZSB1cCAmIHJ1bm5pbmcuCisJICogT3RoZXJ3aXNlLCB3ZSBtaWdodCBzZWUgc29tZSBmbGFreSBiZWhhdmlvdXIuCisJICovCisJdWRlbGF5KDEwMCk7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmFody5ib2FyZF90eXBlKSB7CisJY2FzZSBORVRYRU5fTklDX0dCRToKKwkJcHJpbnRrKCIlczogUVVBRCBHYkUgYm9hcmQgaW5pdGlhbGl6ZWRcbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVFhFTl9OSUNfWEdCRToKKwkJcHJpbnRrKCIlczogWEdiRSBib2FyZCBpbml0aWFsaXplZFxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCWJyZWFrOworCX0KKworCWFkYXB0ZXItPm51bWJlciA9IG5ldHhlbl9jYXJkc19mb3VuZDsKKwlhZGFwdGVyLT5kcml2ZXJfbWlzbWF0Y2ggPSAwOworCisJcmV0dXJuIDA7CisKKyAgICAgIGVycl9vdXRfZnJlZV9kZXY6CisJaWYgKGFkYXB0ZXItPmZsYWdzICYgTkVUWEVOX05JQ19NU0lfRU5BQkxFRCkKKwkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wb3J0X2NvdW50OyBpKyspIHsKKwkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07CisJCWlmICgocG9ydCkgJiYgKHBvcnQtPm5ldGRldikpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KHBvcnQtPm5ldGRldik7CisJCQlmcmVlX25ldGRldihwb3J0LT5uZXRkZXYpOworCQl9CisJfQorCisJbmV0eGVuX2ZyZWVfYWRhcHRlcl9vZmZsb2FkKGFkYXB0ZXIpOworCisgICAgICBlcnJfb3V0X2ZyZWVfcnhfYnVmZmVyOgorCWZvciAoaSA9IDA7IGkgPCBNQVhfUkNWX0NUWDsgKytpKSB7CisJCXJlY3ZfY3R4ID0gJmFkYXB0ZXItPnJlY3ZfY3R4W2ldOworCQlmb3IgKHJpbmcgPSAwOyByaW5nIDwgTlVNX1JDVl9ERVNDX1JJTkdTOyByaW5nKyspIHsKKwkJCXJjdl9kZXNjID0gJnJlY3ZfY3R4LT5yY3ZfZGVzY1tyaW5nXTsKKwkJCWlmIChyY3ZfZGVzYy0+cnhfYnVmX2FyciAhPSBOVUxMKSB7CisJCQkJdmZyZWUocmN2X2Rlc2MtPnJ4X2J1Zl9hcnIpOworCQkJCXJjdl9kZXNjLT5yeF9idWZfYXJyID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwl2ZnJlZShjbWRfYnVmX2Fycik7CisKKyAgICAgIGVycl9vdXRfZnJlZV9hZGFwdGVyOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShhZGFwdGVyKTsKKworICAgICAgZXJyX291dF9kYnVubWFwOgorCWlmIChkYl9wdHIpCisJCWlvdW5tYXAoZGJfcHRyKTsKKworICAgICAgZXJyX291dF9pb3VubWFwOgorCWlmIChtZW1fcHRyMCkKKwkJaW91bm1hcChtZW1fcHRyMCk7CisJaWYgKG1lbV9wdHIxKQorCQlpb3VubWFwKG1lbV9wdHIxKTsKKwlpZiAobWVtX3B0cjIpCisJCWlvdW5tYXAobWVtX3B0cjIpOworCisgICAgICBlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgICBlcnJfb3V0X2Rpc2FibGVfcGRldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG5ldHhlbl9uaWNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQ7CisJc3RydWN0IG5ldHhlbl9yeF9idWZmZXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgbmV0eGVuX3JlY3ZfY29udGV4dCAqcmVjdl9jdHg7CisJc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jdHggKnJjdl9kZXNjOworCWludCBpOworCWludCBjdHhpZCwgcmluZzsKKworCWFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaWYgKGFkYXB0ZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbmV0eGVuX25pY19zdG9wX2FsbF9wb3J0cyhhZGFwdGVyKTsKKwkvKiBsZWF2ZSB0aGUgaHcgaW4gdGhlIHNhbWUgc3RhdGUgYXMgcmVib290ICovCisJbmV0eGVuX2xvYWRfZmlybXdhcmUoYWRhcHRlcik7CisJbmV0eGVuX2ZyZWVfYWRhcHRlcl9vZmZsb2FkKGFkYXB0ZXIpOworCisJdWRlbGF5KDUwMCk7CQkvKiBEZWxheSBmb3IgYSB3aGlsZSB0byBkcmFpbiB0aGUgRE1BIGVuZ2luZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cG9ydF9jb3VudDsgaSsrKSB7CisJCXBvcnQgPSBhZGFwdGVyLT5wb3J0W2ldOworCQlpZiAoKHBvcnQpICYmIChwb3J0LT5uZXRkZXYpKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihwb3J0LT5uZXRkZXYpOworCQkJZnJlZV9uZXRkZXYocG9ydC0+bmV0ZGV2KTsKKwkJfQorCX0KKworCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBORVRYRU5fTklDX01TSV9FTkFCTEVEKSkKKwkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpZiAoYWRhcHRlci0+aXNfdXAgPT0gTkVUWEVOX0FEQVBURVJfVVBfTUFHSUMpCisJCW5ldHhlbl9mcmVlX2h3X3Jlc291cmNlcyhhZGFwdGVyKTsKKworCWlvdW5tYXAoYWRhcHRlci0+YWh3LmRiX2Jhc2UpOworCWlvdW5tYXAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMCk7CisJaW91bm1hcChhZGFwdGVyLT5haHcucGNpX2Jhc2UxKTsKKwlpb3VubWFwKGFkYXB0ZXItPmFody5wY2lfYmFzZTIpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlmb3IgKGN0eGlkID0gMDsgY3R4aWQgPCBNQVhfUkNWX0NUWDsgKytjdHhpZCkgeworCQlyZWN2X2N0eCA9ICZhZGFwdGVyLT5yZWN2X2N0eFtjdHhpZF07CisJCWZvciAocmluZyA9IDA7IHJpbmcgPCBOVU1fUkNWX0RFU0NfUklOR1M7IHJpbmcrKykgeworCQkJcmN2X2Rlc2MgPSAmcmVjdl9jdHgtPnJjdl9kZXNjW3JpbmddOworCQkJZm9yIChpID0gMDsgaSA8IHJjdl9kZXNjLT5tYXhfcnhfZGVzY19jb3VudDsgKytpKSB7CisJCQkJYnVmZmVyID0gJihyY3ZfZGVzYy0+cnhfYnVmX2FycltpXSk7CisJCQkJaWYgKGJ1ZmZlci0+c3RhdGUgPT0gTkVUWEVOX0JVRkZFUl9GUkVFKQorCQkJCQljb250aW51ZTsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIGJ1ZmZlci0+ZG1hLAorCQkJCQkJIHJjdl9kZXNjLT5kbWFfc2l6ZSwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWlmIChidWZmZXItPnNrYiAhPSBOVUxMKQorCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShidWZmZXItPnNrYik7CisJCQl9CisJCQl2ZnJlZShyY3ZfZGVzYy0+cnhfYnVmX2Fycik7CisJCX0KKwl9CisKKwl2ZnJlZShhZGFwdGVyLT5jbWRfYnVmX2Fycik7CisJa2ZyZWUoYWRhcHRlcik7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIG5ldHdvcmsgaW50ZXJmYWNlIGlzIG1hZGUgYWN0aXZlCisgKiBAcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBuZXR4ZW5fbmljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJaW50IGVyciA9IDA7CisJaW50IGN0eCwgcmluZzsKKworCWlmIChhZGFwdGVyLT5pc191cCAhPSBORVRYRU5fQURBUFRFUl9VUF9NQUdJQykgeworCQllcnIgPSBuZXR4ZW5faW5pdF9maXJtd2FyZShhZGFwdGVyKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBpbml0IGZpcm13YXJlXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCW5ldHhlbl9uaWNfZmxhc2hfcHJpbnQoYWRhcHRlcik7CisJCWlmIChhZGFwdGVyLT5pbml0X25pdSkKKwkJCWFkYXB0ZXItPmluaXRfbml1KGFkYXB0ZXIpOworCisJCS8qIHNldHVwIGFsbCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgUGhhbnRvbS4uLiAqLworCQkvKiB0aGlzIGluY2x1ZGUgdGhlIGRlc2NyaXB0b3JzIGZvciByY3YsIHR4LCBhbmQgc3RhdHVzICovCisJCW5ldHhlbl9uaWNfY2xlYXJfc3RhdHMoYWRhcHRlcik7CisJCWVyciA9IG5ldHhlbl9uaWNfaHdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluIHNldHRpbmcgaHcgcmVzb3VyY2VzOiVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChhZGFwdGVyLT5pbml0X3BvcnQKKwkJICAgICYmIGFkYXB0ZXItPmluaXRfcG9ydChhZGFwdGVyLCBwb3J0LT5wb3J0bnVtKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3J0ICVkXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHBvcnQtPnBvcnRudW0pOworCQkJbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJZm9yIChjdHggPSAwOyBjdHggPCBNQVhfUkNWX0NUWDsgKytjdHgpIHsKKwkJCWZvciAocmluZyA9IDA7IHJpbmcgPCBOVU1fUkNWX0RFU0NfUklOR1M7IHJpbmcrKykKKwkJCQluZXR4ZW5fcG9zdF9yeF9idWZmZXJzKGFkYXB0ZXIsIGN0eCwgcmluZyk7CisJCX0KKwkJYWRhcHRlci0+aXJxID0gYWRhcHRlci0+YWh3LnBkZXYtPmlycTsKKwkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+YWh3LnBkZXYtPmlycSwgJm5ldHhlbl9pbnRyLAorCQkJCSAgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCBuZXRkZXYtPm5hbWUsCisJCQkJICBhZGFwdGVyKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJyZXF1ZXN0X2lycSBmYWlsZWQgd2l0aDogJWRcbiIsIGVycik7CisJCQluZXR4ZW5fZnJlZV9od19yZXNvdXJjZXMoYWRhcHRlcik7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJYWRhcHRlci0+aXNfdXAgPSBORVRYRU5fQURBUFRFUl9VUF9NQUdJQzsKKwl9CisJYWRhcHRlci0+YWN0aXZlX3BvcnRzKys7CisJaWYgKGFkYXB0ZXItPmFjdGl2ZV9wb3J0cyA9PSAxKSB7CisJCWlmICghYWRhcHRlci0+ZHJpdmVyX21pc21hdGNoKQorCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyk7CisKKwkJbmV0eGVuX25pY19lbmFibGVfaW50KGFkYXB0ZXIpOworCX0KKworCS8qIERvbmUgaGVyZSBhZ2FpbiBzbyB0aGF0IGV2ZW4gaWYgcGhhbnRvbSBzdyBvdmVyd3JvdGUgaXQsCisJICogd2Ugc2V0IGl0ICovCisJaWYgKGFkYXB0ZXItPm1hY2FkZHJfc2V0KQorCQlhZGFwdGVyLT5tYWNhZGRyX3NldChwb3J0LCBuZXRkZXYtPmRldl9hZGRyKTsKKwluZXR4ZW5fbmljX3NldF9saW5rX3BhcmFtZXRlcnMocG9ydCk7CisKKwluZXR4ZW5fbmljX3NldF9tdWx0aShuZXRkZXYpOworCWlmIChhZGFwdGVyLT5zZXRfbXR1KQorCQlhZGFwdGVyLT5zZXRfbXR1KHBvcnQsIG5ldGRldi0+bXR1KTsKKworCWlmICghYWRhcHRlci0+ZHJpdmVyX21pc21hdGNoKQorCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBuZXR4ZW5fbmljX2Nsb3NlIC0gRGlzYWJsZXMgYSBuZXR3b3JrIGludGVyZmFjZSBlbnRyeSBwb2ludAorICovCitzdGF0aWMgaW50IG5ldHhlbl9uaWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJaW50IGksIGo7CisJc3RydWN0IG5ldHhlbl9jbWRfYnVmZmVyICpjbWRfYnVmZjsKKwlzdHJ1Y3QgbmV0eGVuX3NrYl9mcmFnICpidWZmcmFnOworCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwlhZGFwdGVyLT5hY3RpdmVfcG9ydHMtLTsKKworCWlmICghYWRhcHRlci0+YWN0aXZlX3BvcnRzKSB7CisJCW5ldHhlbl9uaWNfZGlzYWJsZV9pbnQoYWRhcHRlcik7CisJCWlmIChhZGFwdGVyLT5pcnEpCisJCQlmcmVlX2lycShhZGFwdGVyLT5pcnEsIGFkYXB0ZXIpOworCQljbWRfYnVmZiA9IGFkYXB0ZXItPmNtZF9idWZfYXJyOworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQ7IGkrKykgeworCQkJYnVmZnJhZyA9IGNtZF9idWZmLT5mcmFnX2FycmF5OworCQkJaWYgKGJ1ZmZyYWctPmRtYSkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUocG9ydC0+cGRldiwgYnVmZnJhZy0+ZG1hLAorCQkJCQkJIGJ1ZmZyYWctPmxlbmd0aCwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlidWZmcmFnLT5kbWEgPSAodTY0KSBOVUxMOworCQkJfQorCQkJZm9yIChqID0gMDsgaiA8IGNtZF9idWZmLT5mcmFnX2NvdW50OyBqKyspIHsKKwkJCQlidWZmcmFnKys7CisJCQkJaWYgKGJ1ZmZyYWctPmRtYSkgeworCQkJCQlwY2lfdW5tYXBfcGFnZShwb3J0LT5wZGV2LAorCQkJCQkJICAgICAgIGJ1ZmZyYWctPmRtYSwKKwkJCQkJCSAgICAgICBidWZmcmFnLT5sZW5ndGgsCisJCQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCWJ1ZmZyYWctPmRtYSA9ICh1NjQpIE5VTEw7CisJCQkJfQorCQkJfQorCQkJLyogRnJlZSB0aGUgc2tiIHdlIHJlY2VpdmVkIGluIG5ldHhlbl9uaWNfeG1pdF9mcmFtZSAqLworCQkJaWYgKGNtZF9idWZmLT5za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShjbWRfYnVmZi0+c2tiKTsKKwkJCQljbWRfYnVmZi0+c2tiID0gTlVMTDsKKwkJCX0KKwkJCWNtZF9idWZmKys7CisJCX0KKwkJRkxVU0hfU0NIRURVTEVEX1dPUksoKTsKKwkJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXR4ZW5fbmljX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJc3RydWN0IG5ldHhlbl9oYXJkd2FyZV9jb250ZXh0ICpodyA9ICZhZGFwdGVyLT5haHc7CisJdW5zaWduZWQgaW50IGZpcnN0X3NlZ19sZW4gPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47CisJc3RydWN0IG5ldHhlbl9za2JfZnJhZyAqYnVmZnJhZzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXUzMiBwcm9kdWNlciA9IDA7CisJdTMyIHNhdmVkX3Byb2R1Y2VyID0gMDsKKwlzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmh3ZGVzYzsKKwlpbnQgazsKKwlzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIgKnBidWYgPSBOVUxMOworCXN0YXRpYyBpbnQgZHJvcHBlZF9wYWNrZXQgPSAwOworCWludCBmcmFnX2NvdW50OworCXUzMiBsb2NhbF9wcm9kdWNlciA9IDA7CisJdTMyIG1heF90eF9kZXNjX2NvdW50ID0gMDsKKwl1MzIgbGFzdF9jbWRfY29uc3VtZXIgPSAwOworCWludCBub19vZl9kZXNjOworCisJcG9ydC0+c3RhdHMueG1pdGNhbGxlZCsrOworCWZyYWdfY291bnQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKKworCWlmICh1bmxpa2VseShza2ItPmxlbiA8PSAwKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlwb3J0LT5zdGF0cy5iYWRza2JsZW4rKzsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwlpZiAoZnJhZ19jb3VudCA+IE1BWF9CVUZGRVJTX1BFUl9DTUQpIHsKKwkJcHJpbnRrKCIlczogJXMgbmV0eGVuX25pY194bWl0X2ZyYW1lOiBmcmFnX2NvdW50ICglZCkiCisJCSAgICAgICAidG9vIGxhcmdlLCBjYW4gaGFuZGxlIG9ubHkgJWQgZnJhZ3NcbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBuZXRkZXYtPm5hbWUsCisJCSAgICAgICBmcmFnX2NvdW50LCBNQVhfQlVGRkVSU19QRVJfQ01EKTsKKwkJcG9ydC0+c3RhdHMudHhkcm9wcGVkKys7CisJCWlmICgoKytkcm9wcGVkX3BhY2tldCAmIDB4ZmYpID09IDB4ZmYpCisJCQlwcmludGsoIiVzOiAlcyBkcm9wcHBlZCBwYWNrZXRzID0gJWRcbiIsCisJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lLAorCQkJICAgICAgIGRyb3BwZWRfcGFja2V0KTsKKworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCS8qCisJICogRXZlcnl0aGluZyBpcyBzZXQgdXAuIE5vdywgd2UganVzdCBuZWVkIHRvIHRyYW5zbWl0IGl0IG91dC4KKwkgKiBOb3RlIHRoYXQgd2UgaGF2ZSB0byBjb3B5IHRoZSBjb250ZW50cyBvZiBidWZmZXIgb3ZlciB0bworCSAqIHJpZ2h0IHBsYWNlLiBMYXRlciBvbiwgdGhpcyBjYW4gYmUgb3B0aW1pemVkIG91dCBieSBkZS1jb3VwbGluZyB0aGUKKwkgKiBwcm9kdWNlciBpbmRleCBmcm9tIHRoZSBidWZmZXIgaW5kZXguCisJICovCisgICAgICByZXRyeV9nZXR0aW5nX3dpbmRvdzoKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnR4X2xvY2spOworCWlmIChhZGFwdGVyLT50b3RhbF90aHJlYWRzID09IE1BWF9YTUlUX1BST0RVQ0VSUykgeworCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhfbG9jayk7CisJCS8qCisJCSAqIFlpZWxkIENQVQorCQkgKi8KKwkJaWYgKCFpbl9hdG9taWMoKSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCQkJY3B1X3JlbGF4KCk7CS8qVGhpcyBhIG5vcCBpbnN0ciBvbiBpMzg2ICovCisJCX0KKwkJZ290byByZXRyeV9nZXR0aW5nX3dpbmRvdzsKKwl9CisJbG9jYWxfcHJvZHVjZXIgPSBhZGFwdGVyLT5jbWRfcHJvZHVjZXI7CisJLyogVGhlcmUgNCBmcmFnbWVudHMgcGVyIGRlc2NyaXB0b3IgKi8KKwlub19vZl9kZXNjID0gKGZyYWdfY291bnQgKyAzKSA+PiAyOworCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9UU08pIHsKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPiAwKSB7CisKKwkJCW5vX29mX2Rlc2MrKzsKKwkJCWlmICgoKHNrYi0+bmguaXBoKS0+aWhsICogc2l6ZW9mKHUzMikpICsKKwkJCSAgICAoKHNrYi0+aC50aCktPmRvZmYgKiBzaXplb2YodTMyKSkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSA+CisJCQkgICAgKHNpemVvZihzdHJ1Y3QgY21kX2Rlc2NfdHlwZTApIC0gMikpIHsKKwkJCQlub19vZl9kZXNjKys7CisJCQl9CisJCX0KKwl9CisJayA9IGFkYXB0ZXItPmNtZF9wcm9kdWNlcjsKKwltYXhfdHhfZGVzY19jb3VudCA9IGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50OworCWxhc3RfY21kX2NvbnN1bWVyID0gYWRhcHRlci0+bGFzdF9jbWRfY29uc3VtZXI7CisJaWYgKChrICsgbm9fb2ZfZGVzYykgPj0KKwkgICAgKChsYXN0X2NtZF9jb25zdW1lciA8PSBrKSA/IGxhc3RfY21kX2NvbnN1bWVyICsgbWF4X3R4X2Rlc2NfY291bnQgOgorCSAgICAgbGFzdF9jbWRfY29uc3VtZXIpKSB7CisJCXBvcnQtPnN0YXRzLm5vY21kZGVzY3JpcHRvcisrOworCQlEUFJJTlRLKEVSUiwgIk5vIGNvbW1hbmQgZGVzY3JpcHRvcnMgYXZhaWxhYmxlLCIKKwkJCSIgcHJvZHVjZXIgPSAlZCwgY29uc3VtZXIgPSAlZCBjb3VudD0lbGx1LCIKKwkJCSIgZHJvcHBpbmcgcGFja2V0XG4iLCBwcm9kdWNlciwKKwkJCWFkYXB0ZXItPmxhc3RfY21kX2NvbnN1bWVyLAorCQkJcG9ydC0+c3RhdHMubm9jbWRkZXNjcmlwdG9yKTsKKworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXBvcnQtPmZsYWdzIHw9IE5FVFhFTl9ORVRERVZfU1RBVFVTOworCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhfbG9jayk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisJayA9IGdldF9pbmRleF9yYW5nZShrLCBtYXhfdHhfZGVzY19jb3VudCwgbm9fb2ZfZGVzYyk7CisJYWRhcHRlci0+Y21kX3Byb2R1Y2VyID0gazsKKwlhZGFwdGVyLT50b3RhbF90aHJlYWRzKys7CisJYWRhcHRlci0+bnVtX3RocmVhZHMrKzsKKworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT50eF9sb2NrKTsKKwkvKiBDb3B5IHRoZSBkZXNjcmlwdG9ycyBpbnRvIHRoZSBoYXJkd2FyZSAgICAqLworCXByb2R1Y2VyID0gbG9jYWxfcHJvZHVjZXI7CisJc2F2ZWRfcHJvZHVjZXIgPSBwcm9kdWNlcjsKKwlod2Rlc2MgPSAmaHctPmNtZF9kZXNjX2hlYWRbcHJvZHVjZXJdOworCW1lbXNldChod2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2NfdHlwZTApKTsKKwkvKiBUYWtlIHNrYi0+ZGF0YSBpdHNlbGYgKi8KKwlwYnVmID0gJmFkYXB0ZXItPmNtZF9idWZfYXJyW3Byb2R1Y2VyXTsKKwlpZiAoKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1RTTykgJiYgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA+IDApIHsKKwkJcGJ1Zi0+bXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwkJaHdkZXNjLT5tc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCX0gZWxzZSB7CisJCXBidWYtPm1zcyA9IDA7CisJCWh3ZGVzYy0+bXNzID0gMDsKKwl9CisJcGJ1Zi0+dG90YWxfbGVuZ3RoID0gc2tiLT5sZW47CisJcGJ1Zi0+c2tiID0gc2tiOworCXBidWYtPmNtZCA9IFRYX0VUSEVSX1BLVDsKKwlwYnVmLT5mcmFnX2NvdW50ID0gZnJhZ19jb3VudDsKKwlwYnVmLT5wb3J0ID0gcG9ydC0+cG9ydG51bTsKKwlidWZmcmFnID0gJnBidWYtPmZyYWdfYXJyYXlbMF07CisJYnVmZnJhZy0+ZG1hID0gcGNpX21hcF9zaW5nbGUocG9ydC0+cGRldiwgc2tiLT5kYXRhLCBmaXJzdF9zZWdfbGVuLAorCQkJCSAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCWJ1ZmZyYWctPmxlbmd0aCA9IGZpcnN0X3NlZ19sZW47CisJbmV0eGVuX3NldF9jbWRfZGVzY190b3RhbGxlbmd0aChod2Rlc2MsIHNrYi0+bGVuKTsKKwluZXR4ZW5fc2V0X2NtZF9kZXNjX251bV9vZl9idWZmKGh3ZGVzYywgZnJhZ19jb3VudCk7CisJbmV0eGVuX3NldF9jbWRfZGVzY19vcGNvZGUoaHdkZXNjLCBUWF9FVEhFUl9QS1QpOworCisJbmV0eGVuX3NldF9jbWRfZGVzY19wb3J0KGh3ZGVzYywgcG9ydC0+cG9ydG51bSk7CisJaHdkZXNjLT5idWZmZXIxX2xlbmd0aCA9IGNwdV90b19sZTE2KGZpcnN0X3NlZ19sZW4pOworCWh3ZGVzYy0+YWRkcl9idWZmZXIxID0gY3B1X3RvX2xlNjQoYnVmZnJhZy0+ZG1hKTsKKworCWZvciAoaSA9IDEsIGsgPSAxOyBpIDwgZnJhZ19jb3VudDsgaSsrLCBrKyspIHsKKwkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKwkJaW50IGxlbiwgdGVtcF9sZW47CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCQlkbWFfYWRkcl90IHRlbXBfZG1hOworCisJCS8qIG1vdmUgdG8gbmV4dCBkZXNjLiBpZiB0aGVyZSBpcyBhIG5lZWQgKi8KKwkJaWYgKChpICYgMHgzKSA9PSAwKSB7CisJCQlrID0gMDsKKwkJCXByb2R1Y2VyID0gZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsCisJCQkJCQkgIGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50KTsKKwkJCWh3ZGVzYyA9ICZody0+Y21kX2Rlc2NfaGVhZFtwcm9kdWNlcl07CisJCQltZW1zZXQoaHdkZXNjLCAwLCBzaXplb2Yoc3RydWN0IGNtZF9kZXNjX3R5cGUwKSk7CisJCX0KKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXTsKKwkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJb2Zmc2V0ID0gZnJhZy0+cGFnZV9vZmZzZXQ7CisKKwkJdGVtcF9sZW4gPSBsZW47CisJCXRlbXBfZG1hID0gcGNpX21hcF9wYWdlKHBvcnQtPnBkZXYsIGZyYWctPnBhZ2UsIG9mZnNldCwKKwkJCQkJbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlidWZmcmFnKys7CisJCWJ1ZmZyYWctPmRtYSA9IHRlbXBfZG1hOworCQlidWZmcmFnLT5sZW5ndGggPSB0ZW1wX2xlbjsKKworCQlEUFJJTlRLKElORk8sICJmb3IgbG9vcC4gaT0lZCBrPSVkXG4iLCBpLCBrKTsKKwkJc3dpdGNoIChrKSB7CisJCWNhc2UgMDoKKwkJCWh3ZGVzYy0+YnVmZmVyMV9sZW5ndGggPSBjcHVfdG9fbGUxNih0ZW1wX2xlbik7CisJCQlod2Rlc2MtPmFkZHJfYnVmZmVyMSA9IGNwdV90b19sZTY0KHRlbXBfZG1hKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlod2Rlc2MtPmJ1ZmZlcjJfbGVuZ3RoID0gY3B1X3RvX2xlMTYodGVtcF9sZW4pOworCQkJaHdkZXNjLT5hZGRyX2J1ZmZlcjIgPSBjcHVfdG9fbGU2NCh0ZW1wX2RtYSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaHdkZXNjLT5idWZmZXIzX2xlbmd0aCA9IGNwdV90b19sZTE2KHRlbXBfbGVuKTsKKwkJCWh3ZGVzYy0+YWRkcl9idWZmZXIzID0gY3B1X3RvX2xlNjQodGVtcF9kbWEpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWh3ZGVzYy0+YnVmZmVyNF9sZW5ndGggPSB0ZW1wX2xlbjsKKwkJCWh3ZGVzYy0+YWRkcl9idWZmZXI0ID0gY3B1X3RvX2xlNjQodGVtcF9kbWEpOworCQkJYnJlYWs7CisJCX0KKwkJZnJhZysrOworCX0KKwlwcm9kdWNlciA9IGdldF9uZXh0X2luZGV4KHByb2R1Y2VyLCBhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudCk7CisKKwkvKiBtaWdodCBjaGFuZ2Ugb3Bjb2RlIHRvIFRYX1RDUF9MU08gKi8KKwluZXR4ZW5fdHNvX2NoZWNrKGFkYXB0ZXIsICZody0+Y21kX2Rlc2NfaGVhZFtzYXZlZF9wcm9kdWNlcl0sIHNrYik7CisKKwkvKiBGb3IgTFNPLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIE1BQy9JUC9UQ1AgaGVhZGVycyBpbnRvCisJICogdGhlIGRlc2NyaXB0b3IgcmluZworCSAqLworCWlmIChuZXR4ZW5fZ2V0X2NtZF9kZXNjX29wY29kZSgmaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdKQorCSAgICA9PSBUWF9UQ1BfTFNPKSB7CisJCWludCBoZHJfbGVuLCBmaXJzdF9oZHJfbGVuLCBtb3JlX2hkcjsKKwkJaGRyX2xlbiA9IGh3LT5jbWRfZGVzY19oZWFkW3NhdmVkX3Byb2R1Y2VyXS50b3RhbF9oZHJfbGVuZ3RoOworCQlpZiAoaGRyX2xlbiA+IChzaXplb2Yoc3RydWN0IGNtZF9kZXNjX3R5cGUwKSAtIDIpKSB7CisJCQlmaXJzdF9oZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBjbWRfZGVzY190eXBlMCkgLSAyOworCQkJbW9yZV9oZHIgPSAxOworCQl9IGVsc2UgeworCQkJZmlyc3RfaGRyX2xlbiA9IGhkcl9sZW47CisJCQltb3JlX2hkciA9IDA7CisJCX0KKwkJLyogY29weSB0aGUgTUFDL0lQL1RDUCBoZWFkZXJzIHRvIHRoZSBjbWQgZGVzY3JpcHRvciBsaXN0ICovCisJCWh3ZGVzYyA9ICZody0+Y21kX2Rlc2NfaGVhZFtwcm9kdWNlcl07CisKKwkJLyogY29weSB0aGUgZmlyc3QgNjQgYnl0ZXMgKi8KKwkJbWVtY3B5KCgodm9pZCAqKWh3ZGVzYykgKyAyLAorCQkgICAgICAgKHZvaWQgKikoc2tiLT5kYXRhKSwgZmlyc3RfaGRyX2xlbik7CisJCXByb2R1Y2VyID0gZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsIG1heF90eF9kZXNjX2NvdW50KTsKKworCQlpZiAobW9yZV9oZHIpIHsKKwkJCWh3ZGVzYyA9ICZody0+Y21kX2Rlc2NfaGVhZFtwcm9kdWNlcl07CisJCQkvKiBjb3B5IHRoZSBuZXh0IDY0IGJ5dGVzIC0gc2hvdWxkIGJlIGVub3VnaCBleGNlcHQKKwkJCSAqIGZvciBwYXRob2xvZ2ljYWwgY2FzZQorCQkJICovCisJCQltZW1jcHkoKHZvaWQgKilod2Rlc2MsICh2b2lkICopKHNrYi0+ZGF0YSkgKworCQkJICAgICAgIGZpcnN0X2hkcl9sZW4sIGhkcl9sZW4gLSBmaXJzdF9oZHJfbGVuKTsKKwkJCXByb2R1Y2VyID0gZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsIG1heF90eF9kZXNjX2NvdW50KTsKKwkJfQorCX0KKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnR4X2xvY2spOworCXBvcnQtPnN0YXRzLnR4Ynl0ZXMgKz0KKwkgICAgbmV0eGVuX2dldF9jbWRfZGVzY190b3RhbGxlbmd0aCgmaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdKTsKKwkvKiBDb2RlIHRvIHVwZGF0ZSB0aGUgYWRhcHRlciBjb25zaWRlcmluZyBob3cgbWFueSBwcm9kdWNlciB0aHJlYWRzCisJICAgYXJlIGN1cnJlbnRseSB3b3JraW5nICovCisJaWYgKCgtLWFkYXB0ZXItPm51bV90aHJlYWRzKSA9PSAwKSB7CisJCS8qIFRoaXMgaXMgdGhlIGxhc3QgdGhyZWFkICovCisJCXUzMiBjcmJfcHJvZHVjZXIgPSBhZGFwdGVyLT5jbWRfcHJvZHVjZXI7CisJCXdyaXRlbChjcmJfcHJvZHVjZXIsCisJCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EX1BST0RVQ0VSX09GRlNFVCkpOworCQl3bWIoKTsKKwkJYWRhcHRlci0+dG90YWxfdGhyZWFkcyA9IDA7CisJfQorCisJcG9ydC0+c3RhdHMueG1pdGZpbmlzaGVkKys7CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPnR4X2xvY2spOworCisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlEUFJJTlRLKElORk8sICJ3cm90ZSBDTUQgcHJvZHVjZXIgJXggdG8gcGhhbnRvbVxuIiwgcHJvZHVjZXIpOworCisJRFBSSU5USyhJTkZPLCAiRG9uZS4gU2VuZFxuIik7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIHZvaWQgbmV0eGVuX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgdikKK3sKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICopdjsKKwlpZiAoYWRhcHRlciAhPSBnX2FkYXB0ZXIpIHsKKwkJcHJpbnRrKCIlczogKioqQlVHKioqIGFkYXB0ZXJbJXBdICE9IGdfYWRhcHRlclslcF1cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGFkYXB0ZXIsIGdfYWRhcHRlcik7CisJCXJldHVybjsKKwl9CisKKwlTQ0hFRFVMRV9XT1JLKCZhZGFwdGVyLT53YXRjaGRvZ190YXNrKTsKK30KKworc3RhdGljIHZvaWQgbmV0eGVuX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSAoc3RydWN0IG5ldHhlbl9wb3J0ICopbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCVNDSEVEVUxFX1dPUksoJnBvcnQtPmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7Cit9CisKK3N0YXRpYyB2b2lkIG5ldHhlbl90eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIsIHR4X3RpbWVvdXRfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJpbnRrKEtFUk5fRVJSICIlcyAlczogdHJhbnNtaXQgdGltZW91dCwgcmVzZXR0aW5nLlxuIiwKKwkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJbmV0eGVuX25pY19jbG9zZShuZXRkZXYpOworCW5ldHhlbl9uaWNfb3BlbihuZXRkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7Cit9CisKK3N0YXRpYyBpbnQKK25ldHhlbl9oYW5kbGVfaW50KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwl1MzIgcmV0ID0gMDsKKworCURQUklOVEsoSU5GTywgIkVudGVyZWQgaGFuZGxlIElTUlxuIik7CisKKwlhZGFwdGVyLT5zdGF0cy5pbnRzKys7CisKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIE5FVFhFTl9OSUNfTVNJX0VOQUJMRUQpKSB7CisJCWludCBjb3VudCA9IDA7CisJCXUzMiBtYXNrOworCQltYXNrID0gcmVhZGwocGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIElTUl9JTlRfVkVDVE9SKSk7CisJCWlmICgobWFzayAmIDB4ODApID09IDApIHsKKwkJCS8qIG5vdCBvdXIgaW50ZXJydXB0ICovCisJCQlyZXR1cm4gcmV0OworCQl9CisJCW5ldHhlbl9uaWNfZGlzYWJsZV9pbnQoYWRhcHRlcik7CisJCS8qIFdpbmRvdyA9IDAgb3IgMSAqLworCQlkbyB7CisJCQl3cml0ZWwoMHhmZmZmZmZmZiwgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJCUlTUl9JTlRfVEFSR0VUX1NUQVRVUykpOworCQkJbWFzayA9IHJlYWRsKHBjaV9iYXNlX29mZnNldChhZGFwdGVyLCBJU1JfSU5UX1ZFQ1RPUikpOworCQl9IHdoaWxlICgoKG1hc2sgJiAweDgwKSAhPSAwKSAmJiAoKytjb3VudCA8IDMyKSk7CisJCWlmICgobWFzayAmIDB4ODApICE9IDApCisJCQlwcmludGsoIkNvdWxkIG5vdCBkaXNhYmxlIGludGVycnVwdCBjb21wbGV0ZWx5XG4iKTsKKworCX0KKwlhZGFwdGVyLT5zdGF0cy5ob3N0aW50cysrOworCisJaWYgKG5ldHhlbl9uaWNfcnhfaGFzX3dvcmsoYWRhcHRlcikgfHwgbmV0eGVuX25pY190eF9oYXNfd29yayhhZGFwdGVyKSkgeworCQlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChuZXRkZXYpKSB7CisJCQkvKgorCQkJICogSW50ZXJydXB0cyBhcmUgYWxyZWFkeSBkaXNhYmxlZC4KKwkJCSAqLworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOworCQl9IGVsc2UgeworCQkJc3RhdGljIHVuc2lnbmVkIGludCBpbnRjb3VudCA9IDA7CisJCQlpZiAoKCsraW50Y291bnQgJiAweGZmZikgPT0gMHhmZmYpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogJXMgaW50ZXJydXB0ICVkIHdoaWxlIGluIHBvbGxcbiIsCisJCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSwKKwkJCQkgICAgICAgaW50Y291bnQpOworCQl9CisJCXJldCA9IDE7CisJfQorCisJaWYgKHJldCA9PSAwKSB7CisJCW5ldHhlbl9uaWNfZW5hYmxlX2ludChhZGFwdGVyKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbmV0eGVuX2ludHIgLSBJbnRlcnJ1cHQgSGFuZGxlcgorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogZGF0YSBwb2ludHMgdG8gYWRhcHRlciBzdHVjdHVyZSAod2hpY2ggbWF5IGJlIGhhbmRsaW5nIG1vcmUgdGhhbiAxIHBvcnQKKyAqLworaXJxcmV0dXJuX3QgbmV0eGVuX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJaW50IGk7CisKKwlpZiAodW5saWtlbHkoIWlycSkpIHsKKwkJcmV0dXJuIElSUV9OT05FOwkvKiBOb3Qgb3VyIGludGVycnVwdCAqLworCX0KKworCWFkYXB0ZXIgPSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICopZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+YWh3Lm1heF9wb3J0czsgaSsrKSB7CisJCXBvcnQgPSBhZGFwdGVyLT5wb3J0W2ldOworCQluZXRkZXYgPSBwb3J0LT5uZXRkZXY7CisKKwkJLyogcHJvY2VzcyBvdXIgc3RhdHVzIHF1ZXVlIChmb3IgYWxsIDQgcG9ydHMpICovCisJCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJCW5ldHhlbl9oYW5kbGVfaW50KGFkYXB0ZXIsIG5ldGRldik7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBuZXR4ZW5fbmljX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gKHN0cnVjdCBuZXR4ZW5fcG9ydCAqKW5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlpbnQgd29ya190b19kbyA9IG1pbigqYnVkZ2V0LCBuZXRkZXYtPnF1b3RhKTsKKwlpbnQgZG9uZSA9IDE7CisJaW50IGN0eDsKKwlpbnQgdGhpc193b3JrX2RvbmU7CisJaW50IHdvcmtfZG9uZSA9IDA7CisKKwlEUFJJTlRLKElORk8sICJwb2xsaW5nIGZvciAlZCBkZXNjcmlwdG9yc1xuIiwgKmJ1ZGdldCk7CisJcG9ydC0+c3RhdHMucG9sbGVkKys7CisKKwl3b3JrX2RvbmUgPSAwOworCWZvciAoY3R4ID0gMDsgY3R4IDwgTUFYX1JDVl9DVFg7ICsrY3R4KSB7CisJCS8qCisJCSAqIEZhaXJuZXNzIGlzc3VlLiBUaGlzIHdpbGwgZ2l2ZSB1bmR1ZSB3ZWlnaHQgdG8gdGhlCisJCSAqIHJlY2VpdmUgY29udGV4dCAwLgorCQkgKi8KKworCQkvKgorCQkgKiBUbyBhdm9pZCBzdGFydmF0aW9uLCB3ZSBnaXZlIGVhY2ggb2Ygb3VyIHJlY2VpdmVycywKKwkJICogYSBmcmFjdGlvbiBvZiB0aGUgcXVvdGEuIFNvbWV0aW1lcywgaXQgbWlnaHQgaGFwcGVuIHRoYXQgd2UKKwkJICogaGF2ZSBlbm91Z2ggcXVvdGEgdG8gcHJvY2VzcyBldmVyeSBwYWNrZXQsIGJ1dCBzaW5jZSBhbGwgdGhlCisJCSAqIHBhY2tldHMgYXJlIG9uIG9uZSBjb250ZXh0LCBpdCBnZXRzIG9ubHkgaGFsZiBvZiB0aGUgcXVvdGEsCisJCSAqIGFuZCBlbmRzIHVwIG5vdCBwcm9jZXNzaW5nIGl0LgorCQkgKi8KKwkJdGhpc193b3JrX2RvbmUgPSBuZXR4ZW5fcHJvY2Vzc19yY3ZfcmluZyhhZGFwdGVyLCBjdHgsCisJCQkJCQkJIHdvcmtfdG9fZG8gLworCQkJCQkJCSBNQVhfUkNWX0NUWCk7CisJCXdvcmtfZG9uZSArPSB0aGlzX3dvcmtfZG9uZTsKKwl9CisKKwluZXRkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKKwkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKworCWlmICh3b3JrX2RvbmUgPj0gd29ya190b19kbyAmJiBuZXR4ZW5fbmljX3J4X2hhc193b3JrKGFkYXB0ZXIpICE9IDApCisJCWRvbmUgPSAwOworCisJaWYgKG5ldHhlbl9wcm9jZXNzX2NtZF9yaW5nKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXIpID09IDApCisJCWRvbmUgPSAwOworCisJRFBSSU5USyhJTkZPLCAibmV3IHdvcmtfZG9uZTogJWQgd29ya190b19kbzogJWRcbiIsCisJCXdvcmtfZG9uZSwgd29ya190b19kbyk7CisJaWYgKGRvbmUpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKwkJbmV0eGVuX25pY19lbmFibGVfaW50KGFkYXB0ZXIpOworCX0KKworCXJldHVybiAhZG9uZTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuZXR4ZW5fbmljX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlkaXNhYmxlX2lycShhZGFwdGVyLT5pcnEpOworCW5ldHhlbl9pbnRyKGFkYXB0ZXItPmlycSwgYWRhcHRlcik7CisJZW5hYmxlX2lycShhZGFwdGVyLT5pcnEpOworfQorI2VuZGlmCisvKgorICogbmV0eGVuX25pY19pb2N0bCAoKSAgICBXZSBwcm92aWRlIHRoZSB0Y2wvcGhhbm1vbiBzdXBwb3J0IHRocm91Z2ggdGhlc2UKKyAqIGlvY3Rscy4KKyAqLworc3RhdGljIGludAorbmV0eGVuX25pY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIG5yX2J5dGVzID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJY2hhciBkZXZfbmFtZVtORVRYRU5fTklDX05BTUVfTEVOXTsKKworCURQUklOVEsoSU5GTywgImRvaW5nIGlvY3RsIGZvciAlc1xuIiwgbmV0ZGV2LT5uYW1lKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTkVUWEVOX05JQ19DTUQ6CisJCWVyciA9IG5ldHhlbl9uaWNfZG9faW9jdGwoYWRhcHRlciwgKHZvaWQgKilpZnItPmlmcl9kYXRhLCBwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIE5FVFhFTl9OSUNfTkFNRToKKwkJRFBSSU5USyhJTkZPLCAiaW9jdGwgY21kIGZvciBOZXRYZW5cbiIpOworCQlpZiAoaWZyLT5pZnJfZGF0YSkgeworCQkJc3ByaW50ZihkZXZfbmFtZSwgIiVzLSVkIiwgTkVUWEVOX05JQ19OQU1FX1JTUCwKKwkJCQlwb3J0LT5wb3J0bnVtKTsKKwkJCW5yX2J5dGVzID0KKwkJCSAgICBjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopaWZyLT5pZnJfZGF0YSwgZGV2X25hbWUsCisJCQkJCSBORVRYRU5fTklDX05BTUVfTEVOKTsKKwkJCWlmIChucl9ieXRlcykKKwkJCQllcnIgPSAtRUlPOworCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUFJJTlRLKElORk8sICJpb2N0bCBjbWQgJXggbm90IHN1cHBvcnRlZFxuIiwgY21kKTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBuZXR4ZW5fZHJpdmVyID0geworCS5uYW1lID0gbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUgPSBuZXR4ZW5fcGNpX3RibCwKKwkucHJvYmUgPSBuZXR4ZW5fbmljX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChuZXR4ZW5fbmljX3JlbW92ZSkKK307CisKKy8qIERyaXZlciBSZWdpc3RyYXRpb24gb24gTmV0WGVuIGNhcmQgICAgKi8KKworc3RhdGljIGludCBfX2luaXQgbmV0eGVuX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaWYgKChuZXR4ZW5fd29ya3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibmV0eGVuIikpID09IDApCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmbmV0eGVuX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG5ldHhlbl9pbml0X21vZHVsZSk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZXR4ZW5fZXhpdF9tb2R1bGUodm9pZCkKK3sKKwkvKgorCSAqIFdhaXQgZm9yIHNvbWUgdGltZSB0byBhbGxvdyB0aGUgZG1hIHRvIGRyYWluLCBpZiBhbnkuCisJICovCisJZGVzdHJveV93b3JrcXVldWUobmV0eGVuX3dvcmtxKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm5ldHhlbl9kcml2ZXIpOworfQorCittb2R1bGVfZXhpdChuZXR4ZW5fZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbml1LmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19uaXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg3ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbml1LmMKQEAgLTAsMCArMSw4OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2IE5ldFhlbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgICBpbmZvQG5ldHhlbi5jb20KKyAqIE5ldFhlbiwKKyAqIDM5NjUgRnJlZWRvbSBDaXJjbGUsIEZvdXJ0aCBmbG9vciwKKyAqIFNhbnRhIENsYXJhLCBDQSA5NTA1NAorICoKKyAqCisgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIE5ldHdvcmsgSW50ZXJmYWNlIFVuaXQgaC93IGJsb2NrLgorICoKKyAqLworCisjaW5jbHVkZSAibmV0eGVuX25pYy5oIgorCisjZGVmaW5lIE5FVFhFTl9HQl9NQUNfU09GVF9SRVNFVAkweDgwMDAwMDAwCisjZGVmaW5lIE5FVFhFTl9HQl9NQUNfUkVTRVRfUFJPVF9CTEsgICAweDAwMEYwMDAwCisjZGVmaW5lIE5FVFhFTl9HQl9NQUNfRU5BQkxFX1RYX1JYICAgICAweDAwMDAwMDA1CisjZGVmaW5lIE5FVFhFTl9HQl9NQUNfUEFVU0VEX0ZSTVMgICAgICAweDAwMDAwMDIwCisKK3N0YXRpYyBsb25nIHBoeV9sb2NrX3RpbWVvdXQgPSAxMDAwMDAwMDA7CisKK3N0YXRpYyBpbmxpbmUgaW50IHBoeV9sb2NrKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKwlpbnQgZG9uZSA9IDAsIHRpbWVvdXQgPSAwOworCisJd2hpbGUgKCFkb25lKSB7CisJCWRvbmUgPQorCQkgICAgcmVhZGwocGNpX2Jhc2Vfb2Zmc2V0CisJCQkgIChhZGFwdGVyLCBORVRYRU5fUENJRV9SRUcoUENJRV9TRU0zX0xPQ0spKSk7CisJCWlmIChkb25lID09IDEpCisJCQlicmVhazsKKwkJaWYgKHRpbWVvdXQgPj0gcGh5X2xvY2tfdGltZW91dCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXRpbWVvdXQrKzsKKwkJaWYgKCFpbl9hdG9taWMoKSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCQkJY3B1X3JlbGF4KCk7CisJCX0KKwl9CisKKwl3cml0ZWwoUEhZX0xPQ0tfRFJJVkVSLAorCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fUEhZX0xPQ0tfSUQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGh5X3VubG9jayhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmVhZGwocGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIE5FVFhFTl9QQ0lFX1JFRyhQQ0lFX1NFTTNfVU5MT0NLKSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogbmV0eGVuX25pdV9nYmVfcGh5X3JlYWQgLSByZWFkIGEgcmVnaXN0ZXIgZnJvbSB0aGUgR2JFIFBIWSB2aWEKKyAqIG1paSBtYW5hZ2VtZW50IGludGVyZmFjZS4KKyAqCisgKiBOb3RlOiBUaGUgTUlJIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGdvZXMgdGhyb3VnaCBwb3J0IDAuCisgKglJbmRpdmlkdWFsIHBoeXMgYXJlIGFkZHJlc3NlZCBhcyBmb2xsb3dzOgorICogQHBhcmFtIHBoeSAgWzE1OjhdICBwaHkgaWQKKyAqIEBwYXJhbSByZWcgIFs3OjBdICAgcmVnaXN0ZXIgbnVtYmVyCisgKgorICogQHJldHVybnMgIDAgb24gc3VjY2VzcworICoJICAtMSBvbiBlcnJvcgorICoKKyAqLworaW50IG5ldHhlbl9uaXVfZ2JlX3BoeV9yZWFkKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgbG9uZyBwaHksCisJCQkgICAgbG9uZyByZWcsIF9fbGUzMiAqIHJlYWR2YWwpCit7CisJbG9uZyB0aW1lb3V0ID0gMDsKKwlsb25nIHJlc3VsdCA9IDA7CisJbG9uZyByZXN0b3JlID0gMDsKKwlfX2xlMzIgYWRkcmVzczsKKwlfX2xlMzIgY29tbWFuZDsKKwlfX2xlMzIgc3RhdHVzOworCV9fbGUzMiBtYWNfY2ZnMDsKKworCWlmIChwaHlfbG9jayhhZGFwdGVyKSAhPSAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIE1JSSBtZ210IGFsbCBnb2VzIHRocm91Z2ggcG9ydCAwIE1BQyBpbnRlcmZhY2UsCisJICogc28gaXQgY2Fubm90IGJlIGluIHJlc2V0CisJICovCisKKwlpZiAobmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKDApLAorCQkJCSAgJm1hY19jZmcwLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG5ldHhlbl9nYl9nZXRfc29mdF9yZXNldChtYWNfY2ZnMCkpIHsKKwkJX19sZTMyIHRlbXA7CisJCXRlbXAgPSAwOworCQluZXR4ZW5fZ2JfdHhfcmVzZXRfcGIodGVtcCk7CisJCW5ldHhlbl9nYl9yeF9yZXNldF9wYih0ZW1wKTsKKwkJbmV0eGVuX2diX3R4X3Jlc2V0X21hYyh0ZW1wKTsKKwkJbmV0eGVuX2diX3J4X3Jlc2V0X21hYyh0ZW1wKTsKKwkJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwKKwkJCQkJICAgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAoMCksCisJCQkJCSAgICZ0ZW1wLCA0KSkKKwkJCXJldHVybiAtRUlPOworCQlyZXN0b3JlID0gMTsKKwl9CisKKwlhZGRyZXNzID0gMDsKKwluZXR4ZW5fZ2JfbWlpX21nbXRfcmVnX2FkZHIoYWRkcmVzcywgcmVnKTsKKwluZXR4ZW5fZ2JfbWlpX21nbXRfcGh5X2FkZHIoYWRkcmVzcywgcGh5KTsKKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFIoMCksCisJCQkJICAgJmFkZHJlc3MsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwljb21tYW5kID0gMDsJCS8qIHR1cm4gb2ZmIGFueSBwcmlvciBhY3Rpdml0eSAqLworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09NTUFORCgwKSwKKwkJCQkgICAmY29tbWFuZCwgNCkpCisJCXJldHVybiAtRUlPOworCS8qIHNlbmQgcmVhZCBjb21tYW5kICovCisJbmV0eGVuX2diX21paV9tZ210X3NldF9yZWFkX2N5Y2xlKGNvbW1hbmQpOworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQ09NTUFORCgwKSwKKwkJCQkgICAmY29tbWFuZCwgNCkpCisJCXJldHVybiAtRUlPOworCisJc3RhdHVzID0gMDsKKwlkbyB7CisJCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwKKwkJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0lORElDQVRFKDApLAorCQkJCQkgICZzdGF0dXMsIDQpKQorCQkJcmV0dXJuIC1FSU87CisJCXRpbWVvdXQrKzsKKwl9IHdoaWxlICgobmV0eGVuX2dldF9nYl9taWlfbWdtdF9idXN5KHN0YXR1cykKKwkJICB8fCBuZXR4ZW5fZ2V0X2diX21paV9tZ210X25vdHZhbGlkKHN0YXR1cykpCisJCSAmJiAodGltZW91dCsrIDwgTkVUWEVOX05JVV9QSFlfV0FJVE1BWCkpOworCisJaWYgKHRpbWVvdXQgPCBORVRYRU5fTklVX1BIWV9XQUlUTUFYKSB7CisJCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwKKwkJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX1NUQVRVUygwKSwKKwkJCQkJICByZWFkdmFsLCA0KSkKKwkJCXJldHVybiAtRUlPOworCQlyZXN1bHQgPSAwOworCX0gZWxzZQorCQlyZXN1bHQgPSAtMTsKKworCWlmIChyZXN0b3JlKQorCQlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLAorCQkJCQkgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMCgwKSwKKwkJCQkJICAgJm1hY19jZmcwLCA0KSkKKwkJCXJldHVybiAtRUlPOworCXBoeV91bmxvY2soYWRhcHRlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogCisgKiBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGUgLSB3cml0ZSBhIHJlZ2lzdGVyIHRvIHRoZSBHYkUgUEhZIHZpYQorICogbWlpIG1hbmFnZW1lbnQgaW50ZXJmYWNlLgorICoKKyAqIE5vdGU6IFRoZSBNSUkgbWFuYWdlbWVudCBpbnRlcmZhY2UgZ29lcyB0aHJvdWdoIHBvcnQgMC4KKyAqCUluZGl2aWR1YWwgcGh5cyBhcmUgYWRkcmVzc2VkIGFzIGZvbGxvd3M6CisgKiBAcGFyYW0gcGh5ICAgICAgWzE1OjhdICBwaHkgaWQKKyAqIEBwYXJhbSByZWcgICAgICBbNzowXSAgIHJlZ2lzdGVyIG51bWJlcgorICoKKyAqIEByZXR1cm5zICAwIG9uIHN1Y2Nlc3MKKyAqCSAgLTEgb24gZXJyb3IKKyAqCisgKi8KK2ludCBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJICAgICBsb25nIHBoeSwgbG9uZyByZWcsIF9fbGUzMiB2YWwpCit7CisJbG9uZyB0aW1lb3V0ID0gMDsKKwlsb25nIHJlc3VsdCA9IDA7CisJbG9uZyByZXN0b3JlID0gMDsKKwlfX2xlMzIgYWRkcmVzczsKKwlfX2xlMzIgY29tbWFuZDsKKwlfX2xlMzIgc3RhdHVzOworCV9fbGUzMiBtYWNfY2ZnMDsKKworCS8qCisJICogTUlJIG1nbXQgYWxsIGdvZXMgdGhyb3VnaCBwb3J0IDAgTUFDIGludGVyZmFjZSwgc28gaXQKKwkgKiBjYW5ub3QgYmUgaW4gcmVzZXQKKwkgKi8KKworCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAoMCksCisJCQkJICAmbWFjX2NmZzAsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobmV0eGVuX2diX2dldF9zb2Z0X3Jlc2V0KG1hY19jZmcwKSkgeworCQlfX2xlMzIgdGVtcDsKKwkJdGVtcCA9IDA7CisJCW5ldHhlbl9nYl90eF9yZXNldF9wYih0ZW1wKTsKKwkJbmV0eGVuX2diX3J4X3Jlc2V0X3BiKHRlbXApOworCQluZXR4ZW5fZ2JfdHhfcmVzZXRfbWFjKHRlbXApOworCQluZXR4ZW5fZ2JfcnhfcmVzZXRfbWFjKHRlbXApOworCisJCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsCisJCQkJCSAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKDApLAorCQkJCQkgICAmdGVtcCwgNCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJcmVzdG9yZSA9IDE7CisJfQorCisJY29tbWFuZCA9IDA7CQkvKiB0dXJuIG9mZiBhbnkgcHJpb3IgYWN0aXZpdHkgKi8KKwlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX01JSV9NR01UX0NPTU1BTkQoMCksCisJCQkJICAgJmNvbW1hbmQsIDQpKQorCQlyZXR1cm4gLUVJTzsKKworCWFkZHJlc3MgPSAwOworCW5ldHhlbl9nYl9taWlfbWdtdF9yZWdfYWRkcihhZGRyZXNzLCByZWcpOworCW5ldHhlbl9nYl9taWlfbWdtdF9waHlfYWRkcihhZGRyZXNzLCBwaHkpOworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUigwKSwKKwkJCQkgICAmYWRkcmVzcywgNCkpCisJCXJldHVybiAtRUlPOworCisJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9DVFJMKDApLAorCQkJCSAgICZ2YWwsIDQpKQorCQlyZXR1cm4gLUVJTzsKKworCXN0YXR1cyA9IDA7CisJZG8geworCQlpZiAobmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsCisJCQkJCSAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9JTkRJQ0FURSgwKSwKKwkJCQkJICAmc3RhdHVzLCA0KSkKKwkJCXJldHVybiAtRUlPOworCQl0aW1lb3V0Kys7CisJfSB3aGlsZSAoKG5ldHhlbl9nZXRfZ2JfbWlpX21nbXRfYnVzeShzdGF0dXMpKQorCQkgJiYgKHRpbWVvdXQrKyA8IE5FVFhFTl9OSVVfUEhZX1dBSVRNQVgpKTsKKworCWlmICh0aW1lb3V0IDwgTkVUWEVOX05JVV9QSFlfV0FJVE1BWCkKKwkJcmVzdWx0ID0gMDsKKwllbHNlCisJCXJlc3VsdCA9IC1FSU87CisKKwkvKiByZXN0b3JlIHRoZSBzdGF0ZSBvZiBwb3J0IDAgTUFDIGluIGNhc2Ugd2UgdGFtcGVyZWQgd2l0aCBpdCAqLworCWlmIChyZXN0b3JlKQorCQlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLAorCQkJCQkgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMCgwKSwKKwkJCQkJICAgJm1hY19jZmcwLCA0KSkKKwkJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5ldHhlbl9uaXVfeGdiZV9lbmFibGVfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgIGludCBwb3J0KQoreworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0lOVF9NQVNLLCAweDNmKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldHhlbl9uaXVfZ2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSBpbnQgcG9ydCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlfX2xlMzIgZW5hYmxlID0gMDsKKwluZXR4ZW5fc2V0X3BoeV9pbnRfbGlua19zdGF0dXNfY2hhbmdlZChlbmFibGUpOworCW5ldHhlbl9zZXRfcGh5X2ludF9hdXRvbmVnX2NvbXBsZXRlZChlbmFibGUpOworCW5ldHhlbl9zZXRfcGh5X2ludF9zcGVlZF9jaGFuZ2VkKGVuYWJsZSk7CisKKwlpZiAoMCAhPQorCSAgICBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGUoYWRhcHRlciwgcG9ydCwKKwkJCQkgICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9JTlRfRU5BQkxFLAorCQkJCSAgICAgZW5hYmxlKSkKKwkJcmVzdWx0ID0gLUVJTzsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBuZXR4ZW5fbml1X3hnYmVfZGlzYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgIGludCBwb3J0KQoreworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0lOVF9NQVNLLCAweDdmKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldHhlbl9uaXVfZ2JlX2Rpc2FibGVfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgIGludCBwb3J0KQoreworCWludCByZXN1bHQgPSAwOworCWlmICgwICE9CisJICAgIG5ldHhlbl9uaXVfZ2JlX3BoeV93cml0ZShhZGFwdGVyLCBwb3J0LAorCQkJCSAgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0lOVF9FTkFCTEUsIDApKQorCQlyZXN1bHQgPSAtRUlPOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5ldHhlbl9uaXVfeGdiZV9jbGVhcl9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSBpbnQgcG9ydCkKK3sKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9BQ1RJVkVfSU5ULCAtMSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCWludCBwb3J0KQoreworCWludCByZXN1bHQgPSAwOworCWlmICgwICE9CisJICAgIG5ldHhlbl9uaXVfZ2JlX3BoeV93cml0ZShhZGFwdGVyLCBwb3J0LAorCQkJCSAgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0lOVF9TVEFUVVMsCisJCQkJICAgICAtRUlPKSkKKwkJcmVzdWx0ID0gLUVJTzsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIAorICogbmV0eGVuX25pdV9nYmVfc2V0X21paV9tb2RlLSBTZXQgMTAvMTAwIE1iaXQgTW9kZSBmb3IgR2JFIE1BQworICoKKyAqLwordm9pZCBuZXR4ZW5fbml1X2diZV9zZXRfbWlpX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSBpbnQgcG9ydCwgbG9uZyBlbmFibGUpCit7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfTU9ERSwgMHgyKTsKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAocG9ydCksCisJCQkJICAgIDB4ODAwMDAwMDApOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkgICAgMHgwMDAwZjAwMjUpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMShwb3J0KSwKKwkJCQkgICAgMHhmMWZmKTsKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkgICAgTkVUWEVOX05JVV9HQjBfR01JSV9NT0RFICsgKHBvcnQgPDwgMyksIDApOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCMF9NSUlfTU9ERSArIChwb3J0IDw8IDMpLCAxKTsKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkgICAgKE5FVFhFTl9OSVVfR0IwX0hBTEZfRFVQTEVYICsgcG9ydCAqIDQpLCAwKTsKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9DT05GSUcocG9ydCksIDB4Nyk7CisKKwlpZiAoZW5hYmxlKSB7CisJCS8qIAorCQkgKiBEbyBOT1QgZW5hYmxlIGZsb3cgY29udHJvbCB1bnRpbCBhIHN1aXRhYmxlIHNvbHV0aW9uIGZvciAKKwkJICogIHNodXR0aW5nIGRvd24gcGF1c2UgZnJhbWVzIGlzIGZvdW5kLiAKKwkJICovCisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAocG9ydCksCisJCQkJCSAgICAweDUpOworCX0KKworCWlmIChuZXR4ZW5fbml1X2diZV9lbmFibGVfcGh5X2ludGVycnVwdHMoYWRhcHRlciwgcG9ydCkpCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVSUk9SIGVuYWJsaW5nIFBIWSBpbnRlcnJ1cHRzXG4iKTsKKwlpZiAobmV0eGVuX25pdV9nYmVfY2xlYXJfcGh5X2ludGVycnVwdHMoYWRhcHRlciwgcG9ydCkpCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVSUk9SIGNsZWFyaW5nIFBIWSBpbnRlcnJ1cHRzXG4iKTsKK30KKworLyogCisgKiBuZXR4ZW5fbml1X2diZV9zZXRfZ21paV9tb2RlLSBTZXQgR2JFIE1vZGUgZm9yIEdiRSBNQUMKKyAqLwordm9pZCBuZXR4ZW5fbml1X2diZV9zZXRfZ21paV9tb2RlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgIGludCBwb3J0LCBsb25nIGVuYWJsZSkKK3sKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9NT0RFLCAweDIpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkgICAgMHg4MDAwMDAwMCk7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCSAgICAweDAwMDBmMDAyNSk7CisJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18xKHBvcnQpLAorCQkJCSAgICAweGYyZmYpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCMF9NSUlfTU9ERSArIChwb3J0IDw8IDMpLCAwKTsKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkgICAgTkVUWEVOX05JVV9HQjBfR01JSV9NT0RFICsgKHBvcnQgPDwgMyksIDEpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCSAgICAoTkVUWEVOX05JVV9HQjBfSEFMRl9EVVBMRVggKyBwb3J0ICogNCksIDApOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCSAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0NPTkZJRyhwb3J0KSwgMHg3KTsKKworCWlmIChlbmFibGUpIHsKKwkJLyogCisJCSAqIERvIE5PVCBlbmFibGUgZmxvdyBjb250cm9sIHVudGlsIGEgc3VpdGFibGUgc29sdXRpb24gZm9yIAorCQkgKiAgc2h1dHRpbmcgZG93biBwYXVzZSBmcmFtZXMgaXMgZm91bmQuIAorCQkgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJCSAgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkJICAgIDB4NSk7CisJfQorCisJaWYgKG5ldHhlbl9uaXVfZ2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1IgZW5hYmxpbmcgUEhZIGludGVycnVwdHNcbiIpOworCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1IgY2xlYXJpbmcgUEhZIGludGVycnVwdHNcbiIpOworfQorCitpbnQgbmV0eGVuX25pdV9nYmVfaW5pdF9wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpCit7CisJaW50IHJlc3VsdCA9IDA7CisJX19sZTMyIHN0YXR1czsKKwlpZiAoYWRhcHRlci0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cykKKwkJYWRhcHRlci0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KTsKKwltZGVsYXkoMik7CisKKwlpZiAoMCA9PQorCSAgICBuZXR4ZW5fbml1X2diZV9waHlfcmVhZChhZGFwdGVyLCBwb3J0LAorCQkJCSAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUywKKwkJCQkgICAgKF9fbGUzMiAqKSAmIHN0YXR1cykpIHsKKwkJaWYgKG5ldHhlbl9nZXRfcGh5X2xpbmsoc3RhdHVzKSkgeworCQkJaWYgKG5ldHhlbl9nZXRfcGh5X3NwZWVkKHN0YXR1cykgPT0gMikgeworCQkJCW5ldHhlbl9uaXVfZ2JlX3NldF9nbWlpX21vZGUoYWRhcHRlciwgcG9ydCwgMSk7CisJCQl9IGVsc2UgaWYgKChuZXR4ZW5fZ2V0X3BoeV9zcGVlZChzdGF0dXMpID09IDEpCisJCQkJICAgfHwgKG5ldHhlbl9nZXRfcGh5X3NwZWVkKHN0YXR1cykgPT0gMCkpIHsKKwkJCQluZXR4ZW5fbml1X2diZV9zZXRfbWlpX21vZGUoYWRhcHRlciwgcG9ydCwgMSk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IC0xOworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgZG9uJ3QgaGF2ZSBsaW5rLiBDYWJsZSAgbXVzdCBiZSB1bmNvbm5lY3RlZC4KKwkJCSAqIEVuYWJsZSBwaHkgaW50ZXJydXB0cyBzbyB3ZSB0YWtlIGFjdGlvbiB3aGVuCisJCQkgKiBwbHVnZ2VkIGluLgorCQkJICovCisKKwkJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wCisJCQkJCQkgICAgKHBvcnQpLAorCQkJCQkJICAgIE5FVFhFTl9HQl9NQUNfU09GVF9SRVNFVCk7CisJCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkJCSAgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMAorCQkJCQkJICAgIChwb3J0KSwKKwkJCQkJCSAgICBORVRYRU5fR0JfTUFDX1JFU0VUX1BST1RfQkxLCisJCQkJCQkgICAgfCBORVRYRU5fR0JfTUFDX0VOQUJMRV9UWF9SWAorCQkJCQkJICAgIHwKKwkJCQkJCSAgICBORVRYRU5fR0JfTUFDX1BBVVNFRF9GUk1TKTsKKwkJCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICJFUlJPUiBjbGVhcmluZyBQSFkgaW50ZXJydXB0c1xuIik7CisJCQlpZiAobmV0eGVuX25pdV9nYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnQpKQorCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkgICAgICAgIkVSUk9SIGVuYWJsaW5nIFBIWSBpbnRlcnJ1cHRzXG4iKTsKKwkJCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICJFUlJPUiBjbGVhcmluZyBQSFkgaW50ZXJydXB0c1xuIik7CisJCQlyZXN1bHQgPSAtMTsKKwkJfQorCX0gZWxzZSB7CisJCXJlc3VsdCA9IC1FSU87CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBuZXR4ZW5fbml1X3hnX2luaXRfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0KQoreworCWxvbmcgcmVnID0gMCwgcmV0ID0gMDsKKworCWlmIChhZGFwdGVyLT5haHcuYm9hcmRjZmcuYm9hcmRfdHlwZSA9PSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19JTUVaKSB7CisJCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQkJCQkgICAgTkVUWEVOX05JVV9YRzFfQ09ORklHXzAsIDB4NSk7CisJCS8qIFhYWCBoYWNrIGZvciBNZXogY2FyZHM6IGJvdGggcG9ydHMgaW4gcHJvbWlzYyBtb2RlICovCisJCW5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLAorCQkJCSAgICAgIE5FVFhFTl9OSVVfWEdFX0NPTkZJR18xLCAmcmVnLCA0KTsKKwkJcmVnID0gKHJlZyB8IDB4MjAwMFVMKTsKKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCisJCQkJCSAgICBORVRYRU5fTklVX1hHRV9DT05GSUdfMSwgcmVnKTsKKwkJcmVnID0gMDsKKwkJbmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsCisJCQkJICAgICAgTkVUWEVOX05JVV9YRzFfQ09ORklHXzEsICZyZWcsIDQpOworCQlyZWcgPSAocmVnIHwgMHgyMDAwVUwpOworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKKwkJCQkJICAgIE5FVFhFTl9OSVVfWEcxX0NPTkZJR18xLCByZWcpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIAorICogbmV0eGVuX25pdV9nYmVfaGFuZGxlX3BoeV9pbnRlcnJ1cHQgLSBIYW5kbGVzIEdiRSBQSFkgaW50ZXJydXB0cworICogQHBhcmFtIGVuYWJsZSAwIG1lYW5zIGRvbid0IGVuYWJsZSB0aGUgcG9ydAorICoJCSAxIG1lYW5zIGVuYWJsZSAob3IgcmUtZW5hYmxlKSB0aGUgcG9ydAorICovCitpbnQgbmV0eGVuX25pdV9nYmVfaGFuZGxlX3BoeV9pbnRlcnJ1cHQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQlpbnQgcG9ydCwgbG9uZyBlbmFibGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJX19sZTMyIGludF9zcmM7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiTkVUWEVOOiBIYW5kbGluZyBQSFkgaW50ZXJydXB0IG9uIHBvcnQgJWQiCisJICAgICAgICIgKGRldmljZSBlbmFibGUgPSAlZClcbiIsIChpbnQpcG9ydCwgKGludCllbmFibGUpOworCisJLyoKKwkgKiBUaGUgcmVhZCBvZiB0aGUgUEhZIElOVCBzdGF0dXMgd2lsbCBjbGVhciB0aGUgcGVuZGluZworCSAqIGludGVycnVwdCBzdGF0dXMKKwkgKi8KKwlpZiAobmV0eGVuX25pdV9nYmVfcGh5X3JlYWQoYWRhcHRlciwgcG9ydCwKKwkJCQkgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0lOVF9TVEFUVVMsCisJCQkJICAgICZpbnRfc3JjKSAhPSAwKQorCQlyZXN1bHQgPSAtRUlOVkFMOworCWVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUEhZIEludGVycnVwdCBzb3VyY2UgPSAweCV4IFxuIiwgaW50X3NyYyk7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfamFiYmVyKGludF9zcmMpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImphYmJlciBJbnRlcnJ1cHQgIik7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfcG9sYXJpdHlfY2hhbmdlZChpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJwb2xhcml0eSBjaGFuZ2VkICIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2VuZXJneV9kZXRlY3QoaW50X3NyYykpCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiZW5lcmd5IGRldGVjdCBcbiIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2Rvd25zaGlmdChpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJkb3duc2hpZnQgXG4iKTsKKwkJaWYgKG5ldHhlbl9nZXRfcGh5X2ludF9tZGlfeG92ZXJfY2hhbmdlZChpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJtZGlfeG92ZXJfY2hhbmdlZCAiKTsKKwkJaWYgKG5ldHhlbl9nZXRfcGh5X2ludF9maWZvX292ZXJfdW5kZXJmbG93KGludF9zcmMpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZpZm9fb3Zlcl91bmRlcmZsb3cgIik7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfZmFsc2VfY2FycmllcihpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJmYWxzZV9jYXJyaWVyICIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X3N5bWJvbF9lcnJvcihpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJzeW1ib2xfZXJyb3IgIik7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfYXV0b25lZ19jb21wbGV0ZWQoaW50X3NyYykpCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiYXV0b25lZ19jb21wbGV0ZWQgIik7CisJCWlmIChuZXR4ZW5fZ2V0X3BoeV9pbnRfcGFnZV9yZWNlaXZlZChpbnRfc3JjKSkKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJwYWdlX3JlY2VpdmVkICIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2R1cGxleF9jaGFuZ2VkKGludF9zcmMpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImR1cGxleF9jaGFuZ2VkICIpOworCQlpZiAobmV0eGVuX2dldF9waHlfaW50X2F1dG9uZWdfZXJyb3IoaW50X3NyYykpCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiYXV0b25lZ19lcnJvciAiKTsKKwkJaWYgKChuZXR4ZW5fZ2V0X3BoeV9pbnRfc3BlZWRfY2hhbmdlZChpbnRfc3JjKSkKKwkJICAgIHx8IChuZXR4ZW5fZ2V0X3BoeV9pbnRfbGlua19zdGF0dXNfY2hhbmdlZChpbnRfc3JjKSkpIHsKKwkJCV9fbGUzMiBzdGF0dXM7CisKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkgICAgICAgInNwZWVkX2NoYW5nZWQgb3IgbGluayBzdGF0dXMgY2hhbmdlZCIpOworCQkJaWYgKG5ldHhlbl9uaXVfZ2JlX3BoeV9yZWFkCisJCQkgICAgKGFkYXB0ZXIsIHBvcnQsCisJCQkgICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTLAorCQkJICAgICAmc3RhdHVzKSA9PSAwKSB7CisJCQkJaWYgKG5ldHhlbl9nZXRfcGh5X3NwZWVkKHN0YXR1cykgPT0gMikgeworCQkJCQlwcmludGsKKwkJCQkJICAgIChLRVJOX0lORk8gUEZYICJMaW5rIHNwZWVkIGNoYW5nZWQiCisJCQkJCSAgICAgIiB0byAxMDAwIE1icHNcbiIpOworCQkJCQluZXR4ZW5fbml1X2diZV9zZXRfZ21paV9tb2RlKGFkYXB0ZXIsCisJCQkJCQkJCSAgICAgcG9ydCwKKwkJCQkJCQkJICAgICBlbmFibGUpOworCQkJCX0gZWxzZSBpZiAobmV0eGVuX2dldF9waHlfc3BlZWQoc3RhdHVzKSA9PSAxKSB7CisJCQkJCXByaW50aworCQkJCQkgICAgKEtFUk5fSU5GTyBQRlggIkxpbmsgc3BlZWQgY2hhbmdlZCIKKwkJCQkJICAgICAiIHRvIDEwMCBNYnBzXG4iKTsKKwkJCQkJbmV0eGVuX25pdV9nYmVfc2V0X21paV9tb2RlKGFkYXB0ZXIsCisJCQkJCQkJCSAgICBwb3J0LAorCQkJCQkJCQkgICAgZW5hYmxlKTsKKwkJCQl9IGVsc2UgaWYgKG5ldHhlbl9nZXRfcGh5X3NwZWVkKHN0YXR1cykgPT0gMCkgeworCQkJCQlwcmludGsKKwkJCQkJICAgIChLRVJOX0lORk8gUEZYICJMaW5rIHNwZWVkIGNoYW5nZWQiCisJCQkJCSAgICAgIiB0byAxMCBNYnBzXG4iKTsKKwkJCQkJbmV0eGVuX25pdV9nYmVfc2V0X21paV9tb2RlKGFkYXB0ZXIsCisJCQkJCQkJCSAgICBwb3J0LAorCQkJCQkJCQkgICAgZW5hYmxlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUiByZWFkaW5nIgorCQkJCQkgICAgICAgIlBIWSBzdGF0dXMuIElsbGVnYWwgc3BlZWQuXG4iKTsKKwkJCQkJcmVzdWx0ID0gLTE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkJICAgICAgICJFUlJPUiByZWFkaW5nIFBIWSBzdGF0dXMuXG4iKTsKKwkJCQlyZXN1bHQgPSAtMTsKKwkJCX0KKworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGlvbiBNQUMgYWRkcmVzcy4KKyAqIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHZhbHVlIG11c3QgYWxyZWFkeSBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KK2ludCBuZXR4ZW5fbml1X21hY2FkZHJfZ2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgIGludCBwaHksIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKiBhZGRyKQoreworCXU2NCByZXN1bHQgPSAwOworCV9fbGUzMiBzdGF0aW9uaGlnaDsKKwlfX2xlMzIgc3RhdGlvbmxvdzsKKworCWlmIChhZGRyID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgocGh5IDwgMCkgfHwgKHBoeSA+IDMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwgTkVUWEVOX05JVV9HQl9TVEFUSU9OX0FERFJfMChwaHkpLAorCQkJCSAgJnN0YXRpb25oaWdoLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLCBORVRYRU5fTklVX0dCX1NUQVRJT05fQUREUl8xKHBoeSksCisJCQkJICAmc3RhdGlvbmxvdywgNCkpCisJCXJldHVybiAtRUlPOworCisJcmVzdWx0ID0gKHU2NCkgbmV0eGVuX2diX2dldF9zdGF0aW9uYWRkcmVzc19sb3coc3RhdGlvbmxvdyk7CisJcmVzdWx0IHw9ICh1NjQpIHN0YXRpb25oaWdoIDw8IDE2OworCW1lbWNweSgqYWRkciwgJnJlc3VsdCwgc2l6ZW9mKG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBzdGF0aW9uIE1BQyBhZGRyZXNzLgorICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gdmFsdWUgbXVzdCBhbHJlYWR5IGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworaW50IG5ldHhlbl9uaXVfbWFjYWRkcl9zZXQoc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LAorCQkJICAgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCBhZGRyKQoreworCV9fbGUzMiB0ZW1wID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCWludCBwaHkgPSBwb3J0LT5wb3J0bnVtOworCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbNl07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQltZW1jcHkoJnRlbXAsIGFkZHIsIDIpOworCQl0ZW1wIDw8PSAxNjsKKwkJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3gKKwkJICAgIChhZGFwdGVyLCBORVRYRU5fTklVX0dCX1NUQVRJT05fQUREUl8xKHBoeSksICZ0ZW1wLCA0KSkKKwkJCXJldHVybiAtRUlPOworCisJCXRlbXAgPSAwOworCisJCW1lbWNweSgmdGVtcCwgKCh1OCAqKSBhZGRyKSArIDIsIHNpemVvZihfX2xlMzIpKTsKKwkJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3gKKwkJICAgIChhZGFwdGVyLCBORVRYRU5fTklVX0dCX1NUQVRJT05fQUREUl8wKHBoeSksICZ0ZW1wLCA0KSkKKwkJCXJldHVybiAtMjsKKworCQluZXR4ZW5fbml1X21hY2FkZHJfZ2V0KGFkYXB0ZXIsIHBoeSwKKwkJCQkgICAgICAgKG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKikgbWFjX2FkZHIpOworCQlpZiAobWVtY21wKG1hY19hZGRyLCBhZGRyLCA2KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gMTApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHNldCBNYWMgYWRkciBmb3IgJXNcbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBwb3J0LT5uZXRkZXYtPm5hbWUpOworCQlwcmludGsoS0VSTl9FUlIgIk1BQyBhZGRyZXNzIHNldDogIgorCQkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LlxuIiwKKwkJICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCisJCXByaW50ayhLRVJOX0VSUiAiTUFDIGFkZHJlc3MgZ2V0OiAiCisJCSAgICAgICAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguXG4iLAorCQkgICAgICAgbWFjX2FkZHJbMF0sCisJCSAgICAgICBtYWNfYWRkclsxXSwKKwkJICAgICAgIG1hY19hZGRyWzJdLCBtYWNfYWRkclszXSwgbWFjX2FkZHJbNF0sIG1hY19hZGRyWzVdKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEVuYWJsZSBhIEdiRSBpbnRlcmZhY2UgKi8KK2ludCBuZXR4ZW5fbml1X2VuYWJsZV9nYmVfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgICAgaW50IHBvcnQsIG5ldHhlbl9uaXVfZ2JlX2lmbW9kZV90IG1vZGUpCit7CisJX19sZTMyIG1hY19jZmcwOworCV9fbGUzMiBtYWNfY2ZnMTsKKwlfX2xlMzIgbWlpX2NmZzsKKworCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYWNfY2ZnMCA9IDA7CisJbmV0eGVuX2diX3NvZnRfcmVzZXQobWFjX2NmZzApOworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCSAgICZtYWNfY2ZnMCwgNCkpCisJCXJldHVybiAtRUlPOworCW1hY19jZmcwID0gMDsKKwluZXR4ZW5fZ2JfZW5hYmxlX3R4KG1hY19jZmcwKTsKKwluZXR4ZW5fZ2JfZW5hYmxlX3J4KG1hY19jZmcwKTsKKwluZXR4ZW5fZ2JfdW5zZXRfcnhfZmxvd2N0bChtYWNfY2ZnMCk7CisJbmV0eGVuX2diX3R4X3Jlc2V0X3BiKG1hY19jZmcwKTsKKwluZXR4ZW5fZ2JfcnhfcmVzZXRfcGIobWFjX2NmZzApOworCW5ldHhlbl9nYl90eF9yZXNldF9tYWMobWFjX2NmZzApOworCW5ldHhlbl9nYl9yeF9yZXNldF9tYWMobWFjX2NmZzApOworCisJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAocG9ydCksCisJCQkJICAgJm1hY19jZmcwLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJbWFjX2NmZzEgPSAwOworCW5ldHhlbl9nYl9zZXRfcHJlYW1ibGVsZW4obWFjX2NmZzEsIDB4Zik7CisJbmV0eGVuX2diX3NldF9kdXBsZXgobWFjX2NmZzEpOworCW5ldHhlbl9nYl9zZXRfY3JjX2VuYWJsZShtYWNfY2ZnMSk7CisJbmV0eGVuX2diX3NldF9wYWRzaG9ydChtYWNfY2ZnMSk7CisJbmV0eGVuX2diX3NldF9jaGVja2xlbmd0aChtYWNfY2ZnMSk7CisJbmV0eGVuX2diX3NldF9odWdlZnJhbWVzKG1hY19jZmcxKTsKKworCWlmIChtb2RlID09IE5FVFhFTl9OSVVfMTBfMTAwX01CKSB7CisJCW5ldHhlbl9nYl9zZXRfaW50Zm1vZGUobWFjX2NmZzEsIDEpOworCQlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLAorCQkJCQkgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMShwb3J0KSwKKwkJCQkJICAgJm1hY19jZmcxLCA0KSkKKwkJCXJldHVybiAtRUlPOworCisJCS8qIHNldCBtaWkgbW9kZSAqLworCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9HQjBfR01JSV9NT0RFICsKKwkJCQkJICAgIChwb3J0IDw8IDMpLCAwKTsKKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0IwX01JSV9NT0RFICsKKwkJCQkJICAgIChwb3J0IDw8IDMpLCAxKTsKKworCX0gZWxzZSBpZiAobW9kZSA9PSBORVRYRU5fTklVXzEwMDBfTUIpIHsKKwkJbmV0eGVuX2diX3NldF9pbnRmbW9kZShtYWNfY2ZnMSwgMik7CisJCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsCisJCQkJCSAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18xKHBvcnQpLAorCQkJCQkgICAmbWFjX2NmZzEsIDQpKQorCQkJcmV0dXJuIC1FSU87CisJCS8qIHNldCBnbWlpIG1vZGUgKi8KKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0IwX01JSV9NT0RFICsKKwkJCQkJICAgIChwb3J0IDw8IDMpLCAwKTsKKwkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0IwX0dNSUlfTU9ERSArCisJCQkJCSAgICAocG9ydCA8PCAzKSwgMSk7CisJfQorCW1paV9jZmcgPSAwOworCW5ldHhlbl9nYl9zZXRfbWlpX21nbXRfY2xvY2tzZWxlY3QobWlpX2NmZywgNyk7CisJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9DT05GSUcocG9ydCksCisJCQkJICAgJm1paV9jZmcsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwltYWNfY2ZnMCA9IDA7CisJbmV0eGVuX2diX2VuYWJsZV90eChtYWNfY2ZnMCk7CisJbmV0eGVuX2diX2VuYWJsZV9yeChtYWNfY2ZnMCk7CisJbmV0eGVuX2diX3Vuc2V0X3J4X2Zsb3djdGwobWFjX2NmZzApOworCW5ldHhlbl9nYl91bnNldF90eF9mbG93Y3RsKG1hY19jZmcwKTsKKworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCSAgICZtYWNfY2ZnMCwgNCkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCisvKiBEaXNhYmxlIGEgR2JFIGludGVyZmFjZSAqLworaW50IG5ldHhlbl9uaXVfZGlzYWJsZV9nYmVfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0KQoreworCV9fbGUzMiBtYWNfY2ZnMDsKKworCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYWNfY2ZnMCA9IDA7CisJbmV0eGVuX2diX3NvZnRfcmVzZXQobWFjX2NmZzApOworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCSAgICZtYWNfY2ZnMCwgNCkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCisvKiBEaXNhYmxlIGFuIFhHIGludGVyZmFjZSAqLworaW50IG5ldHhlbl9uaXVfZGlzYWJsZV94Z19wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpCit7CisJX19sZTMyIG1hY19jZmc7CisKKwlpZiAocG9ydCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hY19jZmcgPSAwOworCW5ldHhlbl94Z19zb2Z0X3Jlc2V0KG1hY19jZmcpOworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX0NPTkZJR18wLAorCQkJCSAgICZtYWNfY2ZnLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBwcm9taXNjdW91cyBtb2RlIGZvciBhIEdiRSBpbnRlcmZhY2UgKi8KK2ludCBuZXR4ZW5fbml1X3NldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQsCisJCQkJICAgIG5ldHhlbl9uaXVfcHJvbV9tb2RlX3QgbW9kZSkKK3sKKwlfX2xlMzIgcmVnOworCisJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPiBORVRYRU5fTklVX01BWF9HQkVfUE9SVFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNhdmUgcHJldmlvdXMgY29udGVudHMgKi8KKwlpZiAobmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfRFJPUF9XUk9OR0FERFIsCisJCQkJICAmcmVnLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG1vZGUgPT0gTkVUWEVOX05JVV9QUk9NSVNDX01PREUpIHsKKwkJc3dpdGNoIChwb3J0KSB7CisJCWNhc2UgMDoKKwkJCW5ldHhlbl9jbGVhcl9nYl9kcm9wX2diMChyZWcpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW5ldHhlbl9jbGVhcl9nYl9kcm9wX2diMShyZWcpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW5ldHhlbl9jbGVhcl9nYl9kcm9wX2diMihyZWcpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW5ldHhlbl9jbGVhcl9nYl9kcm9wX2diMyhyZWcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAocG9ydCkgeworCQljYXNlIDA6CisJCQluZXR4ZW5fc2V0X2diX2Ryb3BfZ2IwKHJlZyk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJbmV0eGVuX3NldF9nYl9kcm9wX2diMShyZWcpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW5ldHhlbl9zZXRfZ2JfZHJvcF9nYjIocmVnKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQluZXR4ZW5fc2V0X2diX2Ryb3BfZ2IzKHJlZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfRFJPUF9XUk9OR0FERFIsCisJCQkJICAgJnJlZywgNCkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IHRoZSBNQUMgYWRkcmVzcyBmb3IgYW4gWEcgcG9ydAorICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gdmFsdWUgbXVzdCBhbHJlYWR5IGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworaW50IG5ldHhlbl9uaXVfeGdfbWFjYWRkcl9zZXQoc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LAorCQkJICAgICAgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCBhZGRyKQoreworCV9fbGUzMiB0ZW1wID0gMDsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCisJbWVtY3B5KCZ0ZW1wLCBhZGRyLCAyKTsKKwl0ZW1wID0gY3B1X3RvX2xlMzIodGVtcCk7CisJdGVtcCA8PD0gMTY7CisJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfU1RBVElPTl9BRERSXzBfMSwKKwkJCQkgICAmdGVtcCwgNCkpCisJCXJldHVybiAtRUlPOworCisJdGVtcCA9IDA7CisKKwltZW1jcHkoJnRlbXAsICgodTggKikgYWRkcikgKyAyLCBzaXplb2YoX19sZTMyKSk7CisJdGVtcCA9IGNwdV90b19sZTMyKHRlbXApOworCWlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX1NUQVRJT05fQUREUl8wX0hJLAorCQkJCSAgICZ0ZW1wLCA0KSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0aW9uIE1BQyBhZGRyZXNzLgorICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gdmFsdWUgbXVzdCBhbHJlYWR5IGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworaW50IG5ldHhlbl9uaXVfeGdfbWFjYWRkcl9nZXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcGh5LAorCQkJICAgICAgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCAqIGFkZHIpCit7CisJX19sZTMyIHN0YXRpb25oaWdoOworCV9fbGUzMiBzdGF0aW9ubG93OworCXU2NCByZXN1bHQ7CisKKwlpZiAoYWRkciA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGh5ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5ldHhlbl9uaWNfaHdfcmVhZF93eChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMF9ISSwKKwkJCQkgICZzdGF0aW9uaGlnaCwgNCkpCisJCXJldHVybiAtRUlPOworCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfU1RBVElPTl9BRERSXzBfMSwKKwkJCQkgICZzdGF0aW9ubG93LCA0KSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXN1bHQgPSAoKHU2NCkgc3RhdGlvbmxvdykgPj4gMTY7CisJcmVzdWx0IHw9ICh1NjQpIHN0YXRpb25oaWdoIDw8IDE2OworCW1lbWNweSgqYWRkciwgJnJlc3VsdCwgc2l6ZW9mKG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QpKTsKKworCXJldHVybiAwOworfQorCitpbnQgbmV0eGVuX25pdV94Z19zZXRfcHJvbWlzY3VvdXNfbW9kZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICAgIGludCBwb3J0LCBuZXR4ZW5fbml1X3Byb21fbW9kZV90IG1vZGUpCit7CisJX19sZTMyIHJlZzsKKworCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX0NPTkZJR18xLCAmcmVnLCA0KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG1vZGUgPT0gTkVUWEVOX05JVV9QUk9NSVNDX01PREUpCisJCXJlZyA9IChyZWcgfCAweDIwMDBVTCk7CisJZWxzZQorCQlyZWcgPSAocmVnICYgfjB4MjAwMFVMKTsKKworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9DT05GSUdfMSwgcmVnKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfcGhhbl9yZWcuaCBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX3BoYW5fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3OWY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX3BoYW5fcmVnLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2IE5ldFhlbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAgMDIxMTEtMTMwNywgVVNBLgorICogCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKiAKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgICBpbmZvQG5ldHhlbi5jb20KKyAqIE5ldFhlbiwKKyAqIDM5NjUgRnJlZWRvbSBDaXJjbGUsIEZvdXJ0aCBmbG9vciwKKyAqIFNhbnRhIENsYXJhLCBDQSA5NTA1NAorICovCisKKyNpZm5kZWYgX19OSUNfUEhBTl9SRUdfSF8KKyNkZWZpbmUgX19OSUNfUEhBTl9SRUdfSF8KKworLyogCisgKiBDUkIgUmVnaXN0ZXJzIG9yIHF1ZXVlIG1lc3NhZ2UgZG9uZSBvbmx5IGF0IGluaXRpYWxpemF0aW9uIHRpbWUuCisgKi8KKyNkZWZpbmUgTklDX0NSQl9CQVNFICAgICAgICAgICAgICAgTkVUWEVOX0NBTV9SQU0oMHgyMDApCisjZGVmaW5lIE5FVFhFTl9OSUNfUkVHKFgpICAgICAgICAgICAgIChOSUNfQ1JCX0JBU0UrKFgpKQorCisjZGVmaW5lIENSQl9QSEFOX0NOVFJMX0xPX09GRlNFVCAgICBORVRYRU5fTklDX1JFRygweDAwKQorI2RlZmluZSBDUkJfUEhBTl9DTlRSTF9ISV9PRkZTRVQgICAgTkVUWEVOX05JQ19SRUcoMHgwNCkKKyNkZWZpbmUgQ1JCX0NNRF9QUk9EVUNFUl9PRkZTRVQgICAgIE5FVFhFTl9OSUNfUkVHKDB4MDgpCisjZGVmaW5lIENSQl9DTURfQ09OU1VNRVJfT0ZGU0VUICAgICBORVRYRU5fTklDX1JFRygweDBjKQorI2RlZmluZSBDUkJfUEFVU0VfQUREUl9MTyAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHgxMCkJLyogQzAgRVBHIEJVRyAgKi8KKyNkZWZpbmUgQ1JCX1BBVVNFX0FERFJfSEkgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4MTQpCisjZGVmaW5lIENSQl9IT1NUX0NNRF9BRERSX0hJICAgICAgICBORVRYRU5fTklDX1JFRygweDE4KQkvKiBob3N0IGFkZDpjbWQgcmluZyAqLworI2RlZmluZSBDUkJfSE9TVF9DTURfQUREUl9MTyAgICAgICAgTkVUWEVOX05JQ19SRUcoMHgxYykKKyNkZWZpbmUgQ1JCX0NNRF9JTlRSX0xPT1AgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4MjApCS8qIDQgcmVncyBmb3IgcGVyZiAqLworI2RlZmluZSBDUkJfQ01EX0RNQV9MT09QICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHgyNCkKKyNkZWZpbmUgQ1JCX1JDVl9JTlRSX0xPT1AgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4MjgpCisjZGVmaW5lIENSQl9SQ1ZfRE1BX0xPT1AgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweDJjKQorI2RlZmluZSBDUkJfRU5BQkxFX1RYX0lOVFIgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHgzMCkJLyogcGhhbnRvbSBpbml0IHN0YXR1cyAqLworI2RlZmluZSBDUkJfTU1BUF9BRERSXzMgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHgzNCkKKyNkZWZpbmUgQ1JCX0NNRFBFR19DTURSSU5HICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4MzgpCisjZGVmaW5lIENSQl9IT1NUX0RVTU1ZX0JVRl9BRERSX0hJICBORVRYRU5fTklDX1JFRygweDNjKQorI2RlZmluZSBDUkJfSE9TVF9EVU1NWV9CVUZfQUREUl9MTyAgTkVUWEVOX05JQ19SRUcoMHg0MCkKKyNkZWZpbmUgQ1JCX01NQVBfQUREUl8wICAgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4NDQpCisjZGVmaW5lIENSQl9NTUFQX0FERFJfMSAgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweDQ4KQorI2RlZmluZSBDUkJfTU1BUF9BRERSXzIgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHg0YykKKyNkZWZpbmUgQ1JCX0NNRFBFR19TVEFURSAgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4NTApCisjZGVmaW5lIENSQl9NTUFQX1NJWkVfMCAgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweDU0KQorI2RlZmluZSBDUkJfTU1BUF9TSVpFXzEgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHg1OCkKKyNkZWZpbmUgQ1JCX01NQVBfU0laRV8yICAgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4NWMpCisjZGVmaW5lIENSQl9NTUFQX1NJWkVfMyAgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweDYwKQorI2RlZmluZSBDUkJfR0xPQkFMX0lOVF9DT0FMICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHg2NCkJLyogaW50ZXJydXB0IGNvYWxlc2NpbmcgKi8KKyNkZWZpbmUgQ1JCX0lOVF9DT0FMX01PREUgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4NjgpCisjZGVmaW5lIENSQl9NQVhfUkNWX0JVRlMgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweDZjKQorI2RlZmluZSBDUkJfVFhfSU5UX1RIUkVTSE9MRCAgICAgICAgTkVUWEVOX05JQ19SRUcoMHg3MCkKKyNkZWZpbmUgQ1JCX1JYX1BLVF9USU1FUiAgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4NzQpCisjZGVmaW5lIENSQl9UWF9QS1RfVElNRVIgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweDc4KQorI2RlZmluZSBDUkJfUlhfUEtUX0NOVCAgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHg3YykKKyNkZWZpbmUgQ1JCX1JYX1RNUl9DTlQgICAgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4ODApCisjZGVmaW5lIENSQl9SWF9MUk9fVElNRVIgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweDg0KQorI2RlZmluZSBDUkJfUlhfTFJPX01JRF9USU1FUiAgICAgICAgTkVUWEVOX05JQ19SRUcoMHg4OCkKKyNkZWZpbmUgQ1JCX0RNQV9NQVhfUkNWX0JVRlMgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4OGMpCisjZGVmaW5lIENSQl9NQVhfRE1BX0VOVFJJRVMgICAgICAgICBORVRYRU5fTklDX1JFRygweDkwKQorI2RlZmluZSBDUkJfWEdfU1RBVEUgICAgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHg5NCkJLyogWEcgTGluayBzdGF0dXMgKi8KKyNkZWZpbmUgQ1JCX0FHRU5UX0dPICAgICAgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4OTgpCS8qIE5JQyBwa3QgZ2VuIGFnZW50ICovCisjZGVmaW5lIENSQl9BR0VOVF9UWF9TSVpFICAgICAgICAgICBORVRYRU5fTklDX1JFRygweDljKQorI2RlZmluZSBDUkJfQUdFTlRfVFhfVFlQRSAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHhhMCkKKyNkZWZpbmUgQ1JCX0FHRU5UX1RYX0FERFIgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4YTQpCisjZGVmaW5lIENSQl9BR0VOVF9UWF9NU1MgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweGE4KQorI2RlZmluZSBDUkJfVFhfU1RBVEUgICAgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHhhYykJLyogRGVidWcgLXBlcmZvcm1hbmNlICovCisjZGVmaW5lIENSQl9UWF9DT1VOVCAgICAgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweGIwKQorI2RlZmluZSBDUkJfUlhfU1RBVEUgICAgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHhiNCkKKyNkZWZpbmUgQ1JCX1JYX1BFUkZfREVCVUdfMSAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4YjgpCisjZGVmaW5lIENSQl9SWF9MUk9fQ09OVFJPTCAgICAgICAgICBORVRYRU5fTklDX1JFRygweGJjKQkvKiBMUk8gT24vT0ZGICovCisjZGVmaW5lIENSQl9SWF9MUk9fU1RBUlRfTlVNICAgICAgICBORVRYRU5fTklDX1JFRygweGMwKQorI2RlZmluZSBDUkJfTVBPUlRfTU9ERSAgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHhjNCkJLyogTXVsdGlwb3J0IE1vZGUgKi8KKyNkZWZpbmUgQ1JCX0NNRF9SSU5HX1NJWkUgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4YzgpCisjZGVmaW5lIENSQl9JTlRfVkVDVE9SICAgICAgICAgICAgICBORVRYRU5fTklDX1JFRygweGQ0KQorI2RlZmluZSBDUkJfQ1RYX1JFU0VUICAgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHhkOCkKKyNkZWZpbmUgQ1JCX0hPU1RfU1RTX1BST0QgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4ZGMpCisjZGVmaW5lIENSQl9IT1NUX1NUU19DT05TICAgICAgICAgICBORVRYRU5fTklDX1JFRygweGUwKQorI2RlZmluZSBDUkJfUEVHX0NNRF9QUk9EICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHhlNCkKKyNkZWZpbmUgQ1JCX1BFR19DTURfQ09OUyAgICAgICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4ZTgpCisjZGVmaW5lIENSQl9IT1NUX0JVRkZFUl9QUk9EICAgICAgICBORVRYRU5fTklDX1JFRygweGVjKQorI2RlZmluZSBDUkJfSE9TVF9CVUZGRVJfQ09OUyAgICAgICAgTkVUWEVOX05JQ19SRUcoMHhmMCkKKyNkZWZpbmUgQ1JCX0pVTUJPX0JVRkZFUl9QUk9EICAgICAgIE5FVFhFTl9OSUNfUkVHKDB4ZjQpCisjZGVmaW5lIENSQl9KVU1CT19CVUZGRVJfQ09OUyAgICAgICBORVRYRU5fTklDX1JFRygweGY4KQorCisjZGVmaW5lIENSQl9DTURfUFJPRFVDRVJfT0ZGU0VUXzEgICBORVRYRU5fTklDX1JFRygweDFhYykKKyNkZWZpbmUgQ1JCX0NNRF9DT05TVU1FUl9PRkZTRVRfMSAgIE5FVFhFTl9OSUNfUkVHKDB4MWIwKQorI2RlZmluZSBDUkJfVEVNUF9TVEFURSAgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHgxYjQpCisKKy8qCisgKiBDcmJQb3J0UGhhbkNudHJIaS9MbyBpcyB1c2VkIHRvIHBhc3MgdGhlIGFkZHJlc3Mgb2YgSG9zdFBoYW50b21JbmRleCBhZGRyZXNzCisgKiB3aGljaCBjYW4gYmUgcmVhZCBieSB0aGUgUGhhbnRvbSBob3N0IHRvIGdldCBwcm9kdWNlci9jb25zdW1lciBpbmRleGVzIGZyb20KKyAqIFBoYW50b20vQ2FzcGVyLiBJZiBpdCBpcyBub3QgSE9TVF9TSEFSRURfTUVNT1JZLCB0aGVuIHRoZSBmb2xsb3dpbmcKKyAqIHJlZ2lzdGVycyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHJpbmcncyBzaGFyZWQgbWVtb3J5CisgKiBvbiB0aGUgUGhhbnRvbS4KKyAqLworCisjZGVmaW5lIG54X2dldF90ZW1wX3ZhbCh4KQkJKCh4KSA+PiAxNikKKyNkZWZpbmUgbnhfZ2V0X3RlbXBfc3RhdGUoeCkJCSgoeCkgJiAweGZmZmYpCisjZGVmaW5lIG54X2VuY29kZV90ZW1wKHZhbCwgc3RhdGUpCSgoKHZhbCkgPDwgMTYpIHwgKHN0YXRlKSkKKworLyogQ1JCIHJlZ2lzdGVycyBwZXIgUmN2IERlc2NyaXB0b3IgcmluZyAqLworc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jcmIgeworCXUzMiBjcmJfcmN2X3Byb2R1Y2VyX29mZnNldCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg1MTIpKSk7CisJdTMyIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OworCXUzMiBjcmJfZ2xvYmFscmN2X3Jpbmc7CisJdTMyIGNyYl9yY3ZfcmluZ19zaXplOworfTsKKworLyoKKyAqIENSQiByZWdpc3RlcnMgdXNlZCBieSB0aGUgcmVjZWl2ZSBwZWcgbG9naWMuCisgKi8KKworc3RydWN0IG5ldHhlbl9yZWN2X2NyYiB7CisJc3RydWN0IG5ldHhlbl9yY3ZfZGVzY19jcmIgcmN2X2Rlc2NfY3JiW05VTV9SQ1ZfREVTQ19SSU5HU107CisJdTMyIGNyYl9yY3ZzdGF0dXNfcmluZzsKKwl1MzIgY3JiX3Jjdl9zdGF0dXNfcHJvZHVjZXI7CisJdTMyIGNyYl9yY3Zfc3RhdHVzX2NvbnN1bWVyOworCXUzMiBjcmJfcmN2cGVnX3N0YXRlOworCXUzMiBjcmJfc3RhdHVzX3Jpbmdfc2l6ZTsKK307CisKKyNpZiBkZWZpbmVkKERFRklORV9HTE9CQUxfUkVDVl9DUkIpCitzdHJ1Y3QgbmV0eGVuX3JlY3ZfY3JiIHJlY3ZfY3JiX3JlZ2lzdGVyc1tdID0geworCS8qCisJICogSW5zdGFuY2UgMC4KKwkgKi8KKwl7CisJIC8qIHJjdl9kZXNjX2NyYjogKi8KKwkgeworCSAgeworCSAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTAwKSwKKwkgICAvKiBjcmJfcmN2X2NvbnN1bWVyX29mZnNldDogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDEwNCksCisJICAgLyogY3JiX2dsb2FibHJjdl9yaW5nOiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTA4KSwKKwkgICAvKiBjcmJfcmN2X3Jpbmdfc2l6ZSAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTBjKSwKKworCSAgIH0sCisJICAvKiBKdW1ibyBmcmFtZXMgKi8KKwkgIHsKKwkgICAvKiBjcmJfcmN2X3Byb2R1Y2VyX29mZnNldDogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDExMCksCisJICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMTQpLAorCSAgIC8qIGNyYl9nbG9hYmxyY3ZfcmluZzogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDExOCksCisJICAgLyogY3JiX3Jjdl9yaW5nX3NpemUgKi8KKwkgICBORVRYRU5fTklDX1JFRygweDExYyksCisJICAgfSwKKwkgIC8qIExSTyAqLworCSAgeworCSAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTIwKSwKKwkgICAvKiBjcmJfcmN2X2NvbnN1bWVyX29mZnNldDogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDEyNCksCisJICAgLyogY3JiX2dsb2FibHJjdl9yaW5nOiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTI4KSwKKwkgICAvKiBjcmJfcmN2X3Jpbmdfc2l6ZSAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTJjKSwKKwkgICB9CisJICB9LAorCSAvKiBjcmJfcmN2c3RhdHVzX3Jpbmc6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MTMwKSwKKwkgLyogY3JiX3Jjdl9zdGF0dXNfcHJvZHVjZXI6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MTM0KSwKKwkgLyogY3JiX3Jjdl9zdGF0dXNfY29uc3VtZXI6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MTM4KSwKKwkgLyogY3JiX3JjdnBlZ19zdGF0ZTogKi8KKwkgTkVUWEVOX05JQ19SRUcoMHgxM2MpLAorCSAvKiBjcmJfc3RhdHVzX3Jpbmdfc2l6ZSAqLworCSBORVRYRU5fTklDX1JFRygweDE0MCksCisKKwkgfSwKKwkvKgorCSAqIEluc3RhbmNlIDEsCisJICovCisJeworCSAvKiByY3ZfZGVzY19jcmI6ICovCisJIHsKKwkgIHsKKwkgICAvKiBjcmJfcmN2X3Byb2R1Y2VyX29mZnNldDogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDE0NCksCisJICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNDgpLAorCSAgIC8qIGNyYl9nbG9iYWxyY3ZfcmluZzogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDE0YyksCisJICAgLyogY3JiX3Jjdl9yaW5nX3NpemUgKi8KKwkgICBORVRYRU5fTklDX1JFRygweDE1MCksCisKKwkgICB9LAorCSAgLyogSnVtYm8gZnJhbWVzICovCisJICB7CisJICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNTQpLAorCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTU4KSwKKwkgICAvKiBjcmJfZ2xvYmFscmN2X3Jpbmc6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNWMpLAorCSAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNjApLAorCSAgIH0sCisJICAvKiBMUk8gKi8KKwkgIHsKKwkgICAvKiBjcmJfcmN2X3Byb2R1Y2VyX29mZnNldDogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDE2NCksCisJICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNjgpLAorCSAgIC8qIGNyYl9nbG9iYWxyY3ZfcmluZzogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDE2YyksCisJICAgLyogY3JiX3Jjdl9yaW5nX3NpemUgKi8KKwkgICBORVRYRU5fTklDX1JFRygweDE3MCksCisJICAgfQorCisJICB9LAorCSAvKiBjcmJfcmN2c3RhdHVzX3Jpbmc6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MTc0KSwKKwkgLyogY3JiX3Jjdl9zdGF0dXNfcHJvZHVjZXI6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MTc4KSwKKwkgLyogY3JiX3Jjdl9zdGF0dXNfY29uc3VtZXI6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MTdjKSwKKwkgLyogY3JiX3JjdnBlZ19zdGF0ZTogKi8KKwkgTkVUWEVOX05JQ19SRUcoMHgxODApLAorCSAvKiBjcmJfc3RhdHVzX3Jpbmdfc2l6ZSAqLworCSBORVRYRU5fTklDX1JFRygweDE4NCksCisKKwkgfSwKK307CisKK3U2NCBjdHhfYWRkcl9zaWdfcmVnc1tdWzNdID0geworCXtORVRYRU5fTklDX1JFRygweDE4OCksIE5FVFhFTl9OSUNfUkVHKDB4MThjKSwgTkVUWEVOX05JQ19SRUcoMHgxYzApfSwKKwl7TkVUWEVOX05JQ19SRUcoMHgxOTApLCBORVRYRU5fTklDX1JFRygweDE5NCksIE5FVFhFTl9OSUNfUkVHKDB4MWM0KX0sCisJe05FVFhFTl9OSUNfUkVHKDB4MTk4KSwgTkVUWEVOX05JQ19SRUcoMHgxOWMpLCBORVRYRU5fTklDX1JFRygweDFjOCl9LAorCXtORVRYRU5fTklDX1JFRygweDFhMCksIE5FVFhFTl9OSUNfUkVHKDB4MWE0KSwgTkVUWEVOX05JQ19SRUcoMHgxY2MpfQorfTsKKworI2Vsc2UKK2V4dGVybiBzdHJ1Y3QgbmV0eGVuX3JlY3ZfY3JiIHJlY3ZfY3JiX3JlZ2lzdGVyc1tdOworZXh0ZXJuIHU2NCBjdHhfYWRkcl9zaWdfcmVnc1tdWzNdOworI2RlZmluZSBDUkJfQ1RYX0FERFJfUkVHX0xPICAgICAgICAgICAgKGN0eF9hZGRyX3NpZ19yZWdzWzBdWzBdKQorI2RlZmluZSBDUkJfQ1RYX0FERFJfUkVHX0hJICAgICAgICAgICAgKGN0eF9hZGRyX3NpZ19yZWdzWzBdWzJdKQorI2RlZmluZSBDUkJfQ1RYX1NJR05BVFVSRV9SRUcgICAgICAgKGN0eF9hZGRyX3NpZ19yZWdzWzBdWzFdKQorI2VuZGlmCQkJCS8qIERFRklORV9HTE9CQUxfUkVDRUlWRV9DUkIgKi8KKworLyoKKyAqIFRlbXBlcmF0dXJlIGNvbnRyb2wuCisgKi8KK2VudW0geworCU5YX1RFTVBfTk9STUFMID0gMHgxLAkvKiBOb3JtYWwgb3BlcmF0aW5nIHJhbmdlICovCisJTlhfVEVNUF9XQVJOLAkJLyogU291bmQgYWxlcnQsIHRlbXBlcmF0dXJlIGdldHRpbmcgaGlnaCAqLworCU5YX1RFTVBfUEFOSUMJCS8qIEZhdGFsIGVycm9yLCBoYXJkd2FyZSBoYXMgc2h1dCBkb3duLiAqLworfTsKKworI2VuZGlmCQkJCS8qIF9fTklDX1BIQU5fUkVHX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTUyLmMgYi9kcml2ZXJzL25ldC9uaTUyLmMKaW5kZXggMjZlNDJmNi4uMTk2OTkzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmk1Mi5jCisrKyBiL2RyaXZlcnMvbmV0L25pNTIuYwpAQCAtMTMzNSw3ICsxMzM1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX25ldGRldihkZXZfbmk1Mik7CiAJcmVsZWFzZV9yZWdpb24oZGV2X25pNTItPmJhc2VfYWRkciwgTkk1Ml9UT1RBTF9TSVpFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pNjUuYyBiL2RyaXZlcnMvbmV0L25pNjUuYwppbmRleCAzNDBhZDBkLi4xNTc4ZjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uaTY1LmMKKysrIGIvZHJpdmVycy9uZXQvbmk2NS5jCkBAIC0xMjU5LDcgKzEyNTksNyBAQAogCXJldHVybiBJU19FUlIoZGV2X25pNjUpID8gUFRSX0VSUihkZXZfbmk2NSkgOiAwOwogfQogCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit2b2lkIF9fZXhpdCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogIAl1bnJlZ2lzdGVyX25ldGRldihkZXZfbmk2NSk7CiAgCWNsZWFudXBfY2FyZChkZXZfbmk2NSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uczgzODIwLmMgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKaW5kZXggYjAxMjdjNy4uNTY4ZGFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jCisrKyBiL2RyaXZlcnMvbmV0L25zODM4MjAuYwpAQCAtNDE0LDEwICs0MTQsMTAgQEAKIAogCXN0cnVjdCBza19idWZmCSpza2JzW05SX1JYX0RFU0NdOwogCi0JdTMyCQkqbmV4dF9yeF9kZXNjOworCV9fbGUzMgkJKm5leHRfcnhfZGVzYzsKIAl1MTYJCW5leHRfcngsIG5leHRfZW1wdHk7CiAKLQl1MzIJCSpkZXNjczsKKwlfX2xlMzIJCSpkZXNjczsKIAlkbWFfYWRkcl90CXBoeV9kZXNjczsKIH07CiAKQEAgLTQyNyw2ICs0MjcsNyBAQAogCXU4CQkJX19pb21lbSAqYmFzZTsKIAogCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldjsKIAogI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCiAJc3RydWN0IHZsYW5fZ3JvdXAJKnZsZ3JwOwpAQCAtNDU5LDcgKzQ2MCw3IEBACiAJc3RydWN0IHNrX2J1ZmYJKnR4X3NrYnNbTlJfVFhfREVTQ107CiAKIAljaGFyCQlwYWRbMTZdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7Ci0JdTMyCQkqdHhfZGVzY3M7CisJX19sZTMyCQkqdHhfZGVzY3M7CiAJZG1hX2FkZHJfdAl0eF9waHlfZGVzY3M7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0eF93YXRjaGRvZzsKQEAgLTUzMyw3ICs1MzQsNyBAQAogICogY29uZGl0aW9ucywgc3RpbGwgcm91dGUgcmVhbHRpbWUgdHJhZmZpYyB3aXRoIGFzIGxvdyBqaXR0ZXIgYXMKICAqIHBvc3NpYmxlLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVpbGRfcnhfZGVzYyhzdHJ1Y3QgbnM4MzgyMCAqZGV2LCB1MzIgKmRlc2MsIGRtYV9hZGRyX3QgbGluaywgZG1hX2FkZHJfdCBidWYsIHUzMiBjbWRzdHMsIHUzMiBleHRzdHMpCitzdGF0aWMgaW5saW5lIHZvaWQgYnVpbGRfcnhfZGVzYyhzdHJ1Y3QgbnM4MzgyMCAqZGV2LCBfX2xlMzIgKmRlc2MsIGRtYV9hZGRyX3QgbGluaywgZG1hX2FkZHJfdCBidWYsIHUzMiBjbWRzdHMsIHUzMiBleHRzdHMpCiB7CiAJZGVzY19hZGRyX3NldChkZXNjICsgREVTQ19MSU5LLCBsaW5rKTsKIAlkZXNjX2FkZHJfc2V0KGRlc2MgKyBERVNDX0JVRlBUUiwgYnVmKTsKQEAgLTU0Nyw3ICs1NDgsNyBAQAogewogCXVuc2lnbmVkIG5leHRfZW1wdHk7CiAJdTMyIGNtZHN0czsKLQl1MzIgKnNnOworCV9fbGUzMiAqc2c7CiAJZG1hX2FkZHJfdCBidWY7CiAKIAluZXh0X2VtcHR5ID0gZGV2LT5yeF9pbmZvLm5leHRfZW1wdHk7CkBAIC02MzEsMTAgKzYzMiwxMCBAQAogfQogCiAvKiBSRUZJTEwgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV9yZWZpbGwodm9pZCAqX2RldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV9yZWZpbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gX2RldjsKLQlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuczgzODIwLCB0cV9yZWZpbGwpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2LT5uZGV2OwogCiAJcnhfcmVmaWxsKG5kZXYsIEdGUF9LRVJORUwpOwogCWlmIChkZXYtPnJ4X2luZm8udXApCkBAIC04NzQsNyArODc1LDggQEAKIAlzdHJ1Y3QgcnhfaW5mbyAqaW5mbyA9ICZkZXYtPnJ4X2luZm87CiAJdW5zaWduZWQgbmV4dF9yeDsKIAlpbnQgcnhfcmMsIGxlbjsKLQl1MzIgY21kc3RzLCAqZGVzYzsKKwl1MzIgY21kc3RzOworCV9fbGUzMiAqZGVzYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBuciA9IDA7CiAKQEAgLTEwMTAsNyArMTAxMiw4IEBACiBzdGF0aWMgdm9pZCBkb190eF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOwotCXUzMiBjbWRzdHMsIHR4X2RvbmVfaWR4LCAqZGVzYzsKKwl1MzIgY21kc3RzLCB0eF9kb25lX2lkeDsKKwlfX2xlMzIgKmRlc2M7CiAKIAlkcHJpbnRrKCJkb190eF9kb25lKCVwKVxuIiwgbmRldik7CiAJdHhfZG9uZV9pZHggPSBkZXYtPnR4X2RvbmVfaWR4OwpAQCAtMTA3Nyw3ICsxMDgwLDcgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldi0+dHhfc2tic1tpXTsKIAkJZGV2LT50eF9za2JzW2ldID0gTlVMTDsKIAkJaWYgKHNrYikgewotCQkJdTMyICpkZXNjID0gZGV2LT50eF9kZXNjcyArIChpICogREVTQ19TSVpFKTsKKwkJCV9fbGUzMiAqZGVzYyA9IGRldi0+dHhfZGVzY3MgKyAoaSAqIERFU0NfU0laRSk7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGNpX2RldiwKIAkJCQkJZGVzY19hZGRyX2dldChkZXNjICsgREVTQ19CVUZQVFIpLAogCQkJCQlsZTMyX3RvX2NwdShkZXNjW0RFU0NfQ01EU1RTXSkgJiBDTURTVFNfTEVOX01BU0ssCkBAIC0xMTA3LDcgKzExMTAsNyBAQAogCXNrYl9mcmFnX3QgKmZyYWc7CiAJaW50IHN0b3BwZWQgPSAwOwogCWludCBkb19pbnRyID0gMDsKLQl2b2xhdGlsZSB1MzIgKmZpcnN0X2Rlc2M7CisJdm9sYXRpbGUgX19sZTMyICpmaXJzdF9kZXNjOwogCiAJZHByaW50aygibnM4MzgyMF9oYXJkX3N0YXJ0X3htaXRcbiIpOwogCkBAIC0xMTgwLDcgKzExODMsNyBAQAogCWZpcnN0X2Rlc2MgPSBkZXYtPnR4X2Rlc2NzICsgKGZyZWVfaWR4ICogREVTQ19TSVpFKTsKIAogCWZvciAoOzspIHsKLQkJdm9sYXRpbGUgdTMyICpkZXNjID0gZGV2LT50eF9kZXNjcyArIChmcmVlX2lkeCAqIERFU0NfU0laRSk7CisJCXZvbGF0aWxlIF9fbGUzMiAqZGVzYyA9IGRldi0+dHhfZGVzY3MgKyAoZnJlZV9pZHggKiBERVNDX1NJWkUpOwogCiAJCWRwcmludGsoImZyYWdbJTN1XTogJTR1IEAgMHglMDhMeFxuIiwgZnJlZV9pZHgsIGxlbiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmKTsKQEAgLTE0NTUsNyArMTQ1OCw4IEBACiBzdGF0aWMgdm9pZCBuczgzODIwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7Ci0gICAgICAgIHUzMiB0eF9kb25lX2lkeCwgKmRlc2M7CisgICAgICAgIHUzMiB0eF9kb25lX2lkeDsKKwlfX2xlMzIgKmRlc2M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKQEAgLTE4NDEsNiArMTg0NSw3IEBACiAKIAluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuczgzODIwKSk7CiAJZGV2ID0gUFJJVihuZGV2KTsKKwlkZXYtPm5kZXYgPSBuZGV2OwogCWVyciA9IC1FTk9NRU07CiAJaWYgKCFkZXYpCiAJCWdvdG8gb3V0OwpAQCAtMTg1Myw3ICsxODU4LDcgQEAKIAlTRVRfTU9EVUxFX09XTkVSKG5kZXYpOwogCVNFVF9ORVRERVZfREVWKG5kZXYsICZwY2lfZGV2LT5kZXYpOwogCi0JSU5JVF9XT1JLKCZkZXYtPnRxX3JlZmlsbCwgcXVldWVfcmVmaWxsLCBuZGV2KTsKKwlJTklUX1dPUksoJmRldi0+dHFfcmVmaWxsLCBxdWV1ZV9yZWZpbGwpOwogCXRhc2tsZXRfaW5pdCgmZGV2LT5yeF90YXNrbGV0LCByeF9hY3Rpb24sICh1bnNpZ25lZCBsb25nKW5kZXYpOwogCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCmluZGV4IDA0NjAwOTkuLjc5NGNjNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCkBAIC0zMzgsNyArMzM4LDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKIAlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgcGFyc2U7CiAJdW5zaWduZWQgc2hvcnQgYnVmWzMyXTsKIAlpbnQgbGFzdF9mbiwgbGFzdF9yZXQsIGksIGo7CiAJa2lvX2FkZHJfdCBpb2FkZHI7CkBAIC0zNTAsMTcgKzM0OSw2IEBACiAKIAlERUJVRygwLCAiM2M1NzRfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KIAlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OwogCWZvciAoaSA9IGogPSAwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgewogCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBqIF4gMHgzMDA7CkBAIC0zODIsNiArMzcwLDEwIEBACiAJLyogVGhlIDNjNTc0IG5vcm1hbGx5IHVzZXMgYW4gRUVQUk9NIGZvciBjb25maWd1cmF0aW9uIGluZm8sIGluY2x1ZGluZwogCSAgIHRoZSBoYXJkd2FyZSBhZGRyZXNzLiAgVGhlIGZ1dHVyZSBwcm9kdWN0cyBtYXkgaW5jbHVkZSBhIG1vZGVtIGNoaXAKIAkgICBhbmQgcHV0IHRoZSBhZGRyZXNzIGluIHRoZSBDSVMuICovCisJdHVwbGUuQXR0cmlidXRlcyA9IDA7CisJdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKwl0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAJdHVwbGUuRGVzaXJlZFR1cGxlID0gMHg4ODsKIAlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpIHsKIAkJcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSk7CkBAIC0zOTcsMTIgKzM4OSw5IEBACiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCX0KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUyAmJgotCQlwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTICYmCi0JCXBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkgPT0gQ1NfU1VDQ0VTUykgewotCQljYXJkbmFtZSA9IHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzFdOwotCX0gZWxzZQorCWlmIChsaW5rLT5wcm9kX2lkWzFdKQorCQljYXJkbmFtZSA9IGxpbmstPnByb2RfaWRbMV07CisJZWxzZQogCQljYXJkbmFtZSA9ICIzQ29tIDNjNTc0IjsKIAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKaW5kZXggMjMxZmEyYy4uMWU3M2ZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKQEAgLTI1Myw3ICsyNTMsNiBAQAogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKICAgICB1MTYgYnVmWzMyXSwgKnBoeXNfYWRkcjsKICAgICBpbnQgbGFzdF9mbiwgbGFzdF9yZXQsIGksIGosIG11bHRpID0gMCwgZmlmbzsKICAgICBraW9fYWRkcl90IGlvYWRkcjsKQEAgLTI2MywyNiArMjYyLDE2IEBACiAKICAgICBwaHlzX2FkZHIgPSAodTE2ICopZGV2LT5kZXZfYWRkcjsKICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0gICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotICAgIAotICAgIC8qIElzIHRoaXMgYSAzYzU2Mj8gKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOwogICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOwotICAgIGlmICgocGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpICYmCi0JKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpKSB7Ci0JaWYgKGxlMTZfdG9fY3B1KGJ1ZlswXSkgIT0gTUFORklEXzNDT00pCisKKyAgICAvKiBJcyB0aGlzIGEgM2M1NjI/ICovCisgICAgaWYgKGxpbmstPm1hbmZfaWQgIT0gTUFORklEXzNDT00pCiAJICAgIHByaW50ayhLRVJOX0lORk8gIjNjNTg5X2NzOiBobW1tLCBpcyB0aGlzIHJlYWxseSBhICIKIAkJICAgIjNDb20gY2FyZD8/XG4iKTsKLQltdWx0aSA9IChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF8zQ09NXzNDNTYyKTsKLSAgICB9CisgICAgbXVsdGkgPSAobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfM0NPTV8zQzU2Mik7CiAKICAgICAvKiBGb3IgdGhlIDNjNTYyLCB0aGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgeHgwMC14eDdmICovCiAgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKaW5kZXggNWRkZDU3NC4uNjEzOTA0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKQEAgLTI5OSwxMSArMjk5LDcgQEAKICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwogICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisKICAgICAvKiBkb24ndCB0cnVzdCB0aGUgQ0lTIG9uIHRoaXM7IExpbmtzeXMgZ290IGl0IHdyb25nICovCiAgICAgbGluay0+Y29uZi5QcmVzZW50ID0gMHg2MzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwppbmRleCA0ODQzNGQ3OS4uOTFmNjVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMKQEAgLTI0OSwxMiArMjQ5LDkgQEAKIHN0YXRpYyBpbnQgY29tMjAwMjBfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQogewogICAgIHN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwOwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKICAgICBjb20yMDAyMF9kZXZfdCAqaW5mbzsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogICAgIGludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKLSAgICB1X2NoYXIgYnVmWzY0XTsKICAgICBpbnQgaW9hZGRyOwogCiAgICAgaW5mbyA9IGxpbmstPnByaXY7CkBAIC0yNjQsMTYgKzI2MSw2IEBACiAKICAgICBERUJVRygwLCAiY29tMjAwMjBfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKLSAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCiAgICAgREVCVUcoMSwiYXJjbmV0OiBiYXNlcG9ydDEgaXMgJVhoXG4iLCBsaW5rLT5pby5CYXNlUG9ydDEpOwogICAgIGkgPSAhQ1NfU1VDQ0VTUzsKICAgICBpZiAoIWxpbmstPmlvLkJhc2VQb3J0MSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCmluZGV4IDY1ZjZmZGYuLjBkN2RlNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYwpAQCAtMzQyLDcgKzM0Miw3IEBACiAgICAgdHVwbGVfdCB0dXBsZTsKICAgICBjaXNwYXJzZV90IHBhcnNlOwogICAgIHVfc2hvcnQgYnVmWzMyXTsKLSAgICBpbnQgaSwgbGFzdF9mbiwgbGFzdF9yZXQsIHJldDsKKyAgICBpbnQgaSwgbGFzdF9mbiA9IDAsIGxhc3RfcmV0ID0gMCwgcmV0OwogICAgIGtpb19hZGRyX3QgaW9hZGRyOwogICAgIGNhcmR0eXBlX3QgY2FyZHR5cGU7CiAgICAgY2hhciAqY2FyZF9uYW1lID0gInVua25vd24iOwpAQCAtMzUwLDIxICszNTAsOSBAQAogCiAgICAgREVCVUcoMCwgImZtdmoxOHhfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIC8qCi0gICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCi0gICAgICAgcmVnaXN0ZXJzLgotICAgICovCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwogICAgIHR1cGxlLlR1cGxlRGF0YSA9ICh1X2NoYXIgKilidWY7CiAgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CiAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotCi0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7IAotICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQogICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAgICAgaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSB7CkBAIC0zNzQsMTcgKzM2MiwxMiBAQAogCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwogCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmluZGV4OwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0JaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTKQotCSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQllbHNlCi0JICAgIGJ1ZlswXSA9IDB4ZmZmZjsKLQlzd2l0Y2ggKGxlMTZfdG9fY3B1KGJ1ZlswXSkpIHsKKwlzd2l0Y2ggKGxpbmstPm1hbmZfaWQpIHsKIAljYXNlIE1BTkZJRF9UREs6CiAJICAgIGNhcmR0eXBlID0gVERLOwotCSAgICBpZiAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfVERLX0dOMzQxMAotCQkJfHwgbGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfVERLX05QOTYxMAotCQkJfHwgbGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfVERLX01OMzIwMCkgeworCSAgICBpZiAobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfVERLX0dOMzQxMAorCQkJfHwgbGluay0+Y2FyZF9pZCA9PSBQUk9ESURfVERLX05QOTYxMAorCQkJfHwgbGluay0+Y2FyZF9pZCA9PSBQUk9ESURfVERLX01OMzIwMCkgewogCQkvKiBNdWx0aUZ1bmN0aW9uIENhcmQgKi8KIAkJbGluay0+Y29uZi5Db25maWdCYXNlID0gMHg4MDA7CiAJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDQ3OwpAQCAtMzk1LDExICszNzgsMTEgQEAKIAkgICAgY2FyZHR5cGUgPSBDT05URUM7CiAJICAgIGJyZWFrOwogCWNhc2UgTUFORklEX0ZVSklUU1U6Ci0JICAgIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzAyKQorCSAgICBpZiAobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfRlVKSVRTVV9NQkgxMDMwMikKICAgICAgICAgICAgICAgICAvKiBSQVRPQyBSRVgtNTU4OC85ODIyLzQ4ODYncyBQUk9ESUQgYXJlIDAwMDQoPU1CSDEwMzAyKSwKICAgICAgICAgICAgICAgICAgICBidXQgdGhlc2UgYXJlIE1CSDEwMzA0IGJhc2VkIGNhcmQuICovIAogCQljYXJkdHlwZSA9IE1CSDEwMzA0OwotCSAgICBlbHNlIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzA0KQorCSAgICBlbHNlIGlmIChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzA0KQogCQljYXJkdHlwZSA9IE1CSDEwMzA0OwogCSAgICBlbHNlCiAJCWNhcmR0eXBlID0gTEE1MDE7CkBAIC00MDksMTQgKzM5Miw5IEBACiAJfQogICAgIH0gZWxzZSB7CiAJLyogb2xkIHR5cGUgY2FyZCAqLwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0JaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTKQotCSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQllbHNlCi0JICAgIGJ1ZlswXSA9IDB4ZmZmZjsKLQlzd2l0Y2ggKGxlMTZfdG9fY3B1KGJ1ZlswXSkpIHsKKwlzd2l0Y2ggKGxpbmstPm1hbmZfaWQpIHsKIAljYXNlIE1BTkZJRF9GVUpJVFNVOgotCSAgICBpZiAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfRlVKSVRTVV9NQkgxMDMwNCkgeworCSAgICBpZiAobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfRlVKSVRTVV9NQkgxMDMwNCkgewogCQljYXJkdHlwZSA9IFhYWDEwMzA0OyAgICAvKiBNQkgxMDMwNCB3aXRoIGJ1Z2d5IENJUyAqLwogCSAgICAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4MjA7CiAJICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCmluZGV4IGJjMGNhNDEuLmE5NTZhNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jCkBAIC0yMjIsMjQgKzIyMiwxMiBAQAogICAgIGlibXRyX2Rldl90ICppbmZvID0gbGluay0+cHJpdjsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OwogICAgIHN0cnVjdCB0b2tfaW5mbyAqdGkgPSBuZXRkZXZfcHJpdihkZXYpOwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKICAgICB3aW5fcmVxX3QgcmVxOwogICAgIG1lbXJlcV90IG1lbTsKICAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47Ci0gICAgdV9jaGFyIGJ1Zls2NF07CiAKICAgICBERUJVRygwLCAiaWJtdHJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKLSAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwogICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDYxOwogCiAgICAgLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgUFJJTUFSWSBvciBBTFRFUk5BVEUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKaW5kZXggZTc3MTEwZS4uM2I3MDc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwpAQCAtNjU2LDIzICs2NTYsMTIgQEAKICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogICB0dXBsZV90IHR1cGxlOwotICBjaXNwYXJzZV90IHBhcnNlOwogICB1X2NoYXIgYnVmWzY0XTsKICAgaW50IGksIGxhc3RfcmV0LCBsYXN0X2ZuOwogICBraW9fYWRkcl90IGlvYWRkcjsKIAogICBERUJVRygwLCAibm1jbGFuX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLSAgdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0gIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLSAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7Ci0gIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQogICBDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykpOwogICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSkpOwogICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZikpOwpAQCAtNjg2LDYgKzY3NSw3IEBACiAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CiAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwogICBtZW1jcHkoZGV2LT5kZXZfYWRkciwgdHVwbGUuVHVwbGVEYXRhLCBFVEhFUl9BRERSX0xFTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jCmluZGV4IDBjMDBkMTguLjJiMTIzOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jCkBAIC01MTksMzEgKzUxOSwxNSBAQAogICAgIHR1cGxlX3QgdHVwbGU7CiAgICAgY2lzcGFyc2VfdCBwYXJzZTsKICAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm4sIHN0YXJ0X3BnLCBzdG9wX3BnLCBjbV9vZmZzZXQ7Ci0gICAgaW50IG1hbmZpZCA9IDAsIHByb2RpZCA9IDAsIGhhc19zaG1lbSA9IDA7CisgICAgaW50IGhhc19zaG1lbSA9IDA7CiAgICAgdV9zaG9ydCBidWZbNjRdOwogICAgIGh3X2luZm9fdCAqaHdfaW5mbzsKIAogICAgIERFQlVHKDAsICJwY25ldF9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0gICAgdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047Ci0gICAgaWYgKChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgJiYKLSAJKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpKSB7Ci0JbWFuZmlkID0gbGUxNl90b19jcHUoYnVmWzBdKTsKLQlwcm9kaWQgPSBsZTE2X3RvX2NwdShidWZbMV0pOwotICAgIH0KLQogICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwogICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CkBAIC01ODksOCArNTczLDggQEAKIAlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKIAlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwogICAgIH0KLSAgICBpZiAoKG1hbmZpZCA9PSBNQU5GSURfSUJNKSAmJgotCShwcm9kaWQgPT0gUFJPRElEX0lCTV9IT01FX0FORF9BV0FZKSkKKyAgICBpZiAoKGxpbmstPm1hbmZfaWQgPT0gTUFORklEX0lCTSkgJiYKKwkobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfSUJNX0hPTUVfQU5EX0FXQVkpKQogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggfD0gMHgxMDsKIAogICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKSk7CkBAIC02MjQsMTAgKzYwOCwxMCBAQAogICAgIGluZm8tPmZsYWdzID0gaHdfaW5mby0+ZmxhZ3M7CiAgICAgLyogQ2hlY2sgZm9yIHVzZXIgb3ZlcnJpZGVzICovCiAgICAgaW5mby0+ZmxhZ3MgfD0gKGRlbGF5X291dHB1dCkgPyBERUxBWV9PVVRQVVQgOiAwOwotICAgIGlmICgobWFuZmlkID09IE1BTkZJRF9TT0NLRVQpICYmCi0JKChwcm9kaWQgPT0gUFJPRElEX1NPQ0tFVF9MUEUpIHx8Ci0JIChwcm9kaWQgPT0gUFJPRElEX1NPQ0tFVF9MUEVfQ0YpIHx8Ci0JIChwcm9kaWQgPT0gUFJPRElEX1NPQ0tFVF9FSU8pKSkKKyAgICBpZiAoKGxpbmstPm1hbmZfaWQgPT0gTUFORklEX1NPQ0tFVCkgJiYKKwkoKGxpbmstPmNhcmRfaWQgPT0gUFJPRElEX1NPQ0tFVF9MUEUpIHx8CisJIChsaW5rLT5jYXJkX2lkID09IFBST0RJRF9TT0NLRVRfTFBFX0NGKSB8fAorCSAobGluay0+Y2FyZF9pZCA9PSBQUk9ESURfU09DS0VUX0VJTykpKQogCWluZm8tPmZsYWdzICY9IH5VU0VfQklHX0JVRjsKICAgICBpZiAoIXVzZV9iaWdfYnVmKQogCWluZm8tPmZsYWdzICY9IH5VU0VfQklHX0JVRjsKQEAgLTEwOTYsNyArMTA4MCw2IEBACiAKICAgICAvKiBDaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHQgd2l0aCBleHBpcmVkIGxhdGVuY3kgdGltZXI6IHdpdGgKICAgICAgICB0aGlzLCB3ZSBjYW4gbGltcCBhbG9uZyBldmVuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgYmxvY2tlZCAqLwotICAgIG91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgbmljX2Jhc2UgKyBFODM5MF9DTUQpOwogICAgIGlmIChpbmZvLT5zdGFsZSsrICYmIChpbmJfcChuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfQUxMKSkgewogCWlmICghaW5mby0+ZmFzdF9wb2xsKQogCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJydXB0KHMpIGRyb3BwZWQhXG4iLCBkZXYtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwppbmRleCAyMGZjYzM1Li41MzBkZjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwpAQCAtNTYwLDE2ICs1NjAsOCBAQAogCiAgICAgLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIGZyb20gdGhlIENJUy4gIEl0IGlzIHN0b3JlZCBhcyB0aGUgbGFzdAogICAgICAgIChmb3VydGgpIHN0cmluZyBpbiB0aGUgVmVyc2lvbiAxIFZlcnNpb24vSUQgdHVwbGUuICovCi0gICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7Ci0gICAgaWYgKGZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSkgIT0gQ1NfU1VDQ0VTUykgewotCXJjID0gLTE7Ci0JZ290byBmcmVlX2NmZ19tZW07Ci0gICAgfQotICAgIC8qIFVnaCAtLSB0aGUgRU0xMTQ0IGNhcmQgaGFzIHR3byBWRVJTXzEgdHVwbGVzIT8hICovCi0gICAgaWYgKG5leHRfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKSAhPSBDU19TVUNDRVNTKQotCWZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSk7Ci0gICAgaWYgKHBhcnNlLT52ZXJzaW9uXzEubnMgPiAzKSB7Ci0Jc3RhdGlvbl9hZGRyID0gcGFyc2UtPnZlcnNpb25fMS5zdHIgKyBwYXJzZS0+dmVyc2lvbl8xLm9mc1szXTsKKyAgICBpZiAobGluay0+cHJvZF9pZFszXSkgeworCXN0YXRpb25fYWRkciA9IGxpbmstPnByb2RfaWRbM107CiAJaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKSB7CiAJCXJjID0gMDsKIAkJZ290byBmcmVlX2NmZ19tZW07CkBAIC03NDQsMTUgKzczNiwxMiBAQAogCX0KICAgICB9CiAgICAgLyogVHJ5IHRoZSB0aGlyZCBzdHJpbmcgaW4gdGhlIFZlcnNpb24gMSBWZXJzaW9uL0lEIHR1cGxlLiAqLwotICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotICAgIGlmIChmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpICE9IENTX1NVQ0NFU1MpIHsKLQlyYyA9IC0xOwotCWdvdG8gZnJlZV9jZmdfbWVtOwotICAgIH0KLSAgICBzdGF0aW9uX2FkZHIgPSBwYXJzZS0+dmVyc2lvbl8xLnN0ciArIHBhcnNlLT52ZXJzaW9uXzEub2ZzWzJdOwotICAgIGlmIChjdnRfYXNjaWlfYWRkcmVzcyhkZXYsIHN0YXRpb25fYWRkcikgPT0gMCkgewotCXJjID0gMDsKLQlnb3RvIGZyZWVfY2ZnX21lbTsKKyAgICBpZiAobGluay0+cHJvZF9pZFsyXSkgeworCXN0YXRpb25fYWRkciA9IGxpbmstPnByb2RfaWRbMl07CisJaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKSB7CisJCXJjID0gMDsKKwkJZ290byBmcmVlX2NmZ19tZW07CisJfQogICAgIH0KIAogICAgIHJjID0gLTE7CkBAIC05NzAsMTAgKzk1OSw2IEBACiB7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOwotICAgIHN0cnVjdCBzbWNfY2ZnX21lbSAqY2ZnX21lbTsKLSAgICB0dXBsZV90ICp0dXBsZTsKLSAgICBjaXNwYXJzZV90ICpwYXJzZTsKLSAgICB1X2NoYXIgKmJ1ZjsKICAgICBjaGFyICpuYW1lOwogICAgIGludCBpLCBqLCByZXY7CiAgICAga2lvX2FkZHJfdCBpb2FkZHI7CkBAIC05ODEsMzAgKzk2Niw4IEBACiAKICAgICBERUJVRygwLCAic21jOTFjOTJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIGNmZ19tZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21jX2NmZ19tZW0pLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoIWNmZ19tZW0pCi0JZ290byBjb25maWdfZmFpbGVkOwotCi0gICAgdHVwbGUgPSAmY2ZnX21lbS0+dHVwbGU7Ci0gICAgcGFyc2UgPSAmY2ZnX21lbS0+cGFyc2U7Ci0gICAgYnVmID0gY2ZnX21lbS0+YnVmOwotCi0gICAgdHVwbGUtPkF0dHJpYnV0ZXMgPSB0dXBsZS0+VHVwbGVPZmZzZXQgPSAwOwotICAgIHR1cGxlLT5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotICAgIHR1cGxlLT5UdXBsZURhdGFNYXggPSA2NDsKLQotICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIGkgPSBmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpOwotICAgIENTX0VYSVRfVEVTVChpLCBQYXJzZVR1cGxlLCBjb25maWdfZmFpbGVkKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS0+Y29uZmlnLmJhc2U7Ci0gICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UtPmNvbmZpZy5ybWFza1swXTsKLQotICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOwotICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKLSAgICBpZiAoZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKSA9PSBDU19TVUNDRVNTKSB7Ci0Jc21jLT5tYW5maWQgPSBwYXJzZS0+bWFuZmlkLm1hbmY7Ci0Jc21jLT5jYXJkaWQgPSBwYXJzZS0+bWFuZmlkLmNhcmQ7Ci0gICAgfQorICAgIHNtYy0+bWFuZmlkID0gbGluay0+bWFuZl9pZDsKKyAgICBzbWMtPmNhcmRpZCA9IGxpbmstPmNhcmRfaWQ7CiAKICAgICBpZiAoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgogCShzbWMtPmNhcmRpZCAhPSBQUk9ESURfT1NJVEVDSF9TRVZFTikpIHsKQEAgLTExMzQsMTQgKzEwOTcsMTIgQEAKICAgICAJICAgIHByaW50ayhLRVJOX05PVElDRSAiICBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIik7CiAJfQogICAgIH0KLSAgICBrZnJlZShjZmdfbWVtKTsKICAgICByZXR1cm4gMDsKIAogY29uZmlnX3VuZG86CiAgICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIGNvbmZpZ19mYWlsZWQ6CQkJLyogQ1NfRVhJVF9URVNUKCkgY2FsbHMganVtcCB0byBoZXJlLi4uICovCiAgICAgc21jOTFjOTJfcmVsZWFzZShsaW5rKTsKLSAgICBrZnJlZShjZmdfbWVtKTsKICAgICByZXR1cm4gLUVOT0RFVjsKIH0gLyogc21jOTFjOTJfY29uZmlnICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCmluZGV4IGYzOTE0ZjUuLjg0NzhkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwpAQCAtMzMyLDYgKzMzMiw3IEBACiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgbG9jYWxfaW5mb190IHsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwogCXN0cnVjdCBwY21jaWFfZGV2aWNlCSpwX2RldjsKICAgICBkZXZfbm9kZV90IG5vZGU7CiAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CkBAIC0zNTMsNyArMzU0LDcgQEAKICAqLwogc3RhdGljIGludCBkb19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgZG9fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHhpcmMycHNfdHhfdGltZW91dF90YXNrKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgeGlyYzJwc190eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZG9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgc2V0X2FkZHJlc3NlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTU2Nyw2ICs1NjgsNyBAQAogICAgIGlmICghZGV2KQogCSAgICByZXR1cm4gLUVOT01FTTsKICAgICBsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICAgbG9jYWwtPmRldiA9IGRldjsKICAgICBsb2NhbC0+cF9kZXYgPSBsaW5rOwogICAgIGxpbmstPnByaXYgPSBkZXY7CiAKQEAgLTU5MSw3ICs1OTMsNyBAQAogI2lmZGVmIEhBVkVfVFhfVElNRU9VVAogICAgIGRldi0+dHhfdGltZW91dCA9IGRvX3R4X3RpbWVvdXQ7CiAgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0gICAgSU5JVF9XT1JLKCZsb2NhbC0+dHhfdGltZW91dF90YXNrLCB4aXJjMnBzX3R4X3RpbWVvdXRfdGFzaywgZGV2KTsKKyAgICBJTklUX1dPUksoJmxvY2FsLT50eF90aW1lb3V0X3Rhc2ssIHhpcmMycHNfdHhfdGltZW91dF90YXNrKTsKICNlbmRpZgogCiAgICAgcmV0dXJuIHhpcmMycHNfY29uZmlnKGxpbmspOwpAQCAtNzA3LDIyICs3MDksMTEgQEAKICAqIFJldHVybnM6IHRydWUgaWYgdGhpcyBpcyBhIENFMgogICovCiBzdGF0aWMgaW50Ci1oYXNfY2UyX3N0cmluZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIGxpbmspCitoYXNfY2UyX3N0cmluZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBfZGV2KQogewotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICB1X2NoYXIgYnVmWzI1Nl07Ci0KLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU0OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotICAgIGlmICghZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICYmIHBhcnNlLnZlcnNpb25fMS5ucyA+IDIpIHsKLQlpZiAoc3Ryc3RyKHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzJdLCAiQ0UyIikpCi0JICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlpZiAocF9kZXYtPnByb2RfaWRbMl0gJiYgc3Ryc3RyKHBfZGV2LT5wcm9kX2lkWzJdLCAiQ0UyIikpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKgpAQCAtNzkyLDEzICs3ODMsNiBAQAogCWdvdG8gZmFpbHVyZTsKICAgICB9CiAKLSAgICAvKiBnZXQgY29uZmlndXJhdGlvbiBzdHVmZiAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgaWYgKChlcnI9Zmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKSkKLQlnb3RvIGNpc19lcnJvcjsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSAgICBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KICAgICAvKiBnZXQgdGhlIGV0aGVybmV0IGFkZHJlc3MgZnJvbSB0aGUgQ0lTICovCiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0ZVTkNFOwogICAgIGZvciAoZXJyID0gZmlyc3RfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOyAhZXJyOwpAQCAtMTA2Miw4ICsxMDQ2LDYgQEAKICAgICB4aXJjMnBzX3JlbGVhc2UobGluayk7CiAgICAgcmV0dXJuIC1FTk9ERVY7CiAKLSAgY2lzX2Vycm9yOgotICAgIHByaW50ayhLTk9UX1hJUkMgInVuYWJsZSB0byBwYXJzZSBDSVNcbiIpOwogICBmYWlsdXJlOgogICAgIHJldHVybiAtRU5PREVWOwogfSAvKiB4aXJjMnBzX2NvbmZpZyAqLwpAQCAtMTM0NCw5ICsxMzI2LDExIEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogc3RhdGljIHZvaWQKLXhpcmMycHNfdHhfdGltZW91dF90YXNrKHZvaWQgKmRhdGEpCit4aXJjMnBzX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBsb2NhbF9pbmZvX3QsIHR4X3RpbWVvdXRfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CiAgICAgLyogcmVzZXQgdGhlIGNhcmQgKi8KICAgICBkb19yZXNldChkZXYsMSk7CiAgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCmluZGV4IGI3OWVjMGQuLmY5OTRmMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCkBAIC01NiwxMyArNTYsMTkgQEAKIAktLS1oZWxwLS0tCiAJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIExBTjgzQzE4NSBQSFkKIAorY29uZmlnIEJST0FEQ09NX1BIWQorCXRyaXN0YXRlICJEcml2ZXJzIGZvciBCcm9hZGNvbSBQSFlzIgorCWRlcGVuZHMgb24gUEhZTElCCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ001NDExLCBCQ001NDIxIGFuZCBCQ001NDYxIFBIWXMuCisKIGNvbmZpZyBGSVhFRF9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgUEhZIGVtdWxhdGlvbiBvbiBmaXhlZCBzcGVlZC9saW5rIgogCWRlcGVuZHMgb24gUEhZTElCCiAJLS0taGVscC0tLQogCSAgQWRkcyB0aGUgZHJpdmVyIHRvIFBIWSBsYXllciB0byBjb3ZlciB0aGUgYm9hcmRzIHRoYXQgZG8gbm90IGhhdmUgYW55IFBIWSBib3VuZCwKLQkgIGJ1dCB3aXRoIHRoZSBhYmlsaXR5IHRvIG1hbmlwdWxhdGUgd2l0aCBzcGVlZC9saW5rIGluIHNvZnR3YXJlLiBUaGUgcmVsYXZhbnQgTUlJCi0JICBzcGVlZC9kdXBsZXggcGFyYW1ldGVycyBjb3VsZCBiZSBlZmZlY3RpdmVseSBoYW5kbGVkIGluIHVzZXItc3BlY2lmaWVkICBmdWN0aW9uLgorCSAgYnV0IHdpdGggdGhlIGFiaWxpdHkgdG8gbWFuaXB1bGF0ZSB0aGUgc3BlZWQvbGluayBpbiBzb2Z0d2FyZS4gVGhlIHJlbGV2YW50IE1JSQorCSAgc3BlZWQvZHVwbGV4IHBhcmFtZXRlcnMgY291bGQgYmUgZWZmZWN0aXZlbHkgaGFuZGxlZCBpbiBhIHVzZXItc3BlY2lmaWVkIGZ1bmN0aW9uLgogCSAgQ3VycmVudGx5IHRlc3RlZCB3aXRoIG1wYzg2NmFkcy4KIAogY29uZmlnIEZJWEVEX01JSV8xMF9GRFgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQppbmRleCAzMjBmODMyLi5iY2QxZWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCkBAIC0xMCw0ICsxMCw1IEBACiBvYmotJChDT05GSUdfUVNFTUlfUEhZKQkJKz0gcXNlbWkubwogb2JqLSQoQ09ORklHX1NNU0NfUEhZKQkJKz0gc21zYy5vCiBvYmotJChDT05GSUdfVklURVNTRV9QSFkpCSs9IHZpdGVzc2Uubworb2JqLSQoQ09ORklHX0JST0FEQ09NX1BIWSkJKz0gYnJvYWRjb20ubwogb2JqLSQoQ09ORklHX0ZJWEVEX1BIWSkJCSs9IGZpeGVkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9icm9hZGNvbS5jIGIvZHJpdmVycy9uZXQvcGh5L2Jyb2FkY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2NjZjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9icm9hZGNvbS5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICoJZHJpdmVycy9uZXQvcGh5L2Jyb2FkY29tLmMKKyAqCisgKglCcm9hZGNvbSBCQ001NDExLCBCQ001NDIxIGFuZCBCQ001NDYxIEdpZ2FiaXQgRXRoZXJuZXQKKyAqCXRyYW5zY2VpdmVycy4KKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDYgIE1hY2llaiBXLiBSb3p5Y2tpCisgKgorICoJSW5zcGlyZWQgYnkgY29kZSB3cml0dGVuIGJ5IEFteSBGb25nLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCisjZGVmaW5lIE1JSV9CQ001NFhYX0VDUgkJMHgxMAkvKiBCQ001NHh4IGV4dGVuZGVkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfRUNSX0lNCTB4MTAwMAkvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9FQ1JfSUYJMHgwODAwCS8qIEludGVycnVwdCBmb3JjZSAqLworCisjZGVmaW5lIE1JSV9CQ001NFhYX0VTUgkJMHgxMQkvKiBCQ001NHh4IGV4dGVuZGVkIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9FU1JfSVMJMHgxMDAwCS8qIEludGVycnVwdCBzdGF0dXMgKi8KKworI2RlZmluZSBNSUlfQkNNNTRYWF9JU1IJCTB4MWEJLyogQkNNNTR4eCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lNUgkJMHgxYgkvKiBCQ001NHh4IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9DUkNFUlIJMHgwMDAxCS8qIENSQyBlcnJvciAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfTElOSwkweDAwMDIJLyogTGluayBzdGF0dXMgY2hhbmdlZCAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfU1BFRUQJMHgwMDA0CS8qIExpbmsgc3BlZWQgY2hhbmdlICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9EVVBMRVgJMHgwMDA4CS8qIER1cGxleCBtb2RlIGNoYW5nZWQgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX0xSUwkweDAwMTAJLyogTG9jYWwgcmVjZWl2ZXIgc3RhdHVzIGNoYW5nZWQgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX1JSUwkweDAwMjAJLyogUmVtb3RlIHJlY2VpdmVyIHN0YXR1cyBjaGFuZ2VkICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9TU0VSUgkweDAwNDAJLyogU2NyYW1ibGVyIHN5bmNocm9uaXphdGlvbiBlcnJvciAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfVUhDRAkweDAwODAJLyogVW5zdXBwb3J0ZWQgSENEIG5lZ290aWF0ZWQgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX05IQ0QJMHgwMTAwCS8qIE5vIEhDRCAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfTkhDREwJMHgwMjAwCS8qIE5vIEhDRCBsaW5rICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9BTlBSCTB4MDQwMAkvKiBBdXRvLW5lZ290aWF0aW9uIHBhZ2UgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgTUlJX0JDTTU0WFhfSU5UX0xDCTB4MDgwMAkvKiBBbGwgY291bnRlcnMgYmVsb3cgMTI4ICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9IQwkweDEwMDAJLyogQ291bnRlciBhYm92ZSAzMjc2OCAqLworI2RlZmluZSBNSUlfQkNNNTRYWF9JTlRfTURJWAkweDIwMDAJLyogTURJWCBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lIE1JSV9CQ001NFhYX0lOVF9QU0VSUgkweDQwMDAJLyogUGFpciBzd2FwIGVycm9yICovCisKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gUEhZIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFjaWVqIFcuIFJvenlja2kiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBiY201NHh4X2NvbmZpZ19pbml0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHJlZywgZXJyOworCisJcmVnID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfQkNNNTRYWF9FQ1IpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCisJLyogTWFzayBpbnRlcnJ1cHRzIGdsb2JhbGx5LiAgKi8KKwlyZWcgfD0gTUlJX0JDTTU0WFhfRUNSX0lNOworCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9CQ001NFhYX0VDUiwgcmVnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIFVubWFzayBldmVudHMgd2UgYXJlIGludGVyZXN0ZWQgaW4uICAqLworCXJlZyA9IH4oTUlJX0JDTTU0WFhfSU5UX0RVUExFWCB8CisJCU1JSV9CQ001NFhYX0lOVF9TUEVFRCB8CisJCU1JSV9CQ001NFhYX0lOVF9MSU5LKTsKKwllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQkNNNTRYWF9JTVIsIHJlZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTR4eF9hY2tfaW50ZXJydXB0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHJlZzsKKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4gICovCisJcmVnID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfQkNNNTRYWF9JU1IpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTR4eF9jb25maWdfaW50cihzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZWcsIGVycjsKKworCXJlZyA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX0JDTTU0WFhfRUNSKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCWlmIChwaHlkZXYtPmludGVycnVwdHMgPT0gUEhZX0lOVEVSUlVQVF9FTkFCTEVEKQorCQlyZWcgJj0gfk1JSV9CQ001NFhYX0VDUl9JTTsKKwllbHNlCisJCXJlZyB8PSBNSUlfQkNNNTRYWF9FQ1JfSU07CisKKwllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQkNNNTRYWF9FQ1IsIHJlZyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIGJjbTU0MTFfZHJpdmVyID0geworCS5waHlfaWQJCT0gMHgwMDIwNjA3MCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCcm9hZGNvbSBCQ001NDExIiwKKwkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUywKKwkuZmxhZ3MJCT0gUEhZX0hBU19NQUdJQ0FORUcgfCBQSFlfSEFTX0lOVEVSUlVQVCwKKwkuY29uZmlnX2luaXQJPSBiY201NHh4X2NvbmZpZ19pbml0LAorCS5jb25maWdfYW5lZwk9IGdlbnBoeV9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSBnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQJPSBiY201NHh4X2Fja19pbnRlcnJ1cHQsCisJLmNvbmZpZ19pbnRyCT0gYmNtNTR4eF9jb25maWdfaW50ciwKKwkuZHJpdmVyIAk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciBiY201NDIxX2RyaXZlciA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYwZTAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQnJvYWRjb20gQkNNNTQyMSIsCisJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMsCisJLmZsYWdzCQk9IFBIWV9IQVNfTUFHSUNBTkVHIHwgUEhZX0hBU19JTlRFUlJVUFQsCisJLmNvbmZpZ19pbml0CT0gYmNtNTR4eF9jb25maWdfaW5pdCwKKwkuY29uZmlnX2FuZWcJPSBnZW5waHlfY29uZmlnX2FuZWcsCisJLnJlYWRfc3RhdHVzCT0gZ2VucGh5X3JlYWRfc3RhdHVzLAorCS5hY2tfaW50ZXJydXB0CT0gYmNtNTR4eF9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50cgk9IGJjbTU0eHhfY29uZmlnX2ludHIsCisJLmRyaXZlciAJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYmNtNTQ2MV9kcml2ZXIgPSB7CisJLnBoeV9pZAkJPSAweDAwMjA2MGMwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJyb2FkY29tIEJDTTU0NjEiLAorCS5mZWF0dXJlcwk9IFBIWV9HQklUX0ZFQVRVUkVTLAorCS5mbGFncwkJPSBQSFlfSEFTX01BR0lDQU5FRyB8IFBIWV9IQVNfSU5URVJSVVBULAorCS5jb25maWdfaW5pdAk9IGJjbTU0eHhfY29uZmlnX2luaXQsCisJLmNvbmZpZ19hbmVnCT0gZ2VucGh5X2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9IGdlbnBoeV9yZWFkX3N0YXR1cywKKwkuYWNrX2ludGVycnVwdAk9IGJjbTU0eHhfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIJPSBiY201NHh4X2NvbmZpZ19pbnRyLAorCS5kcml2ZXIgCT0geyAub3duZXIgPSBUSElTX01PRFVMRSB9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYnJvYWRjb21faW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZiY201NDExX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfNTQxMTsKKwlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZiY201NDIxX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfNTQyMTsKKwlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZiY201NDYxX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfNTQ2MTsKKwlyZXR1cm4gcmV0OworCitvdXRfNTQ2MToKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmJjbTU0MjFfZHJpdmVyKTsKK291dF81NDIxOgorCXBoeV9kcml2ZXJfdW5yZWdpc3RlcigmYmNtNTQxMV9kcml2ZXIpOworb3V0XzU0MTE6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJyb2FkY29tX2V4aXQodm9pZCkKK3sKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmJjbTU0NjFfZHJpdmVyKTsKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmJjbTU0MjFfZHJpdmVyKTsKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmJjbTU0MTFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYnJvYWRjb21faW5pdCk7Cittb2R1bGVfZXhpdChicm9hZGNvbV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jIGIvZHJpdmVycy9uZXQvcGh5L2ZpeGVkLmMKaW5kZXggZjE0ZTk5Mi4uMDk2ZDRhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L2ZpeGVkLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L2ZpeGVkLmMKQEAgLTI1NCw3ICsyNTQsNyBAQAogCQlnb3RvIGRldmljZV9jcmVhdGVfZmFpbDsKIAl9CiAKLQlwaHlkZXYtPmlycSA9IC0xOworCXBoeWRldi0+aXJxID0gUEhZX0lHTk9SRV9JTlRFUlJVUFQ7CiAJcGh5ZGV2LT5kZXYuYnVzID0gJm1kaW9fYnVzX3R5cGU7CiAKIAlpZihudW1iZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvcGh5LmMgYi9kcml2ZXJzL25ldC9waHkvcGh5LmMKaW5kZXggM2FmOWZjZi4uZTE3NWYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHkuYwpAQCAtNyw2ICs3LDcgQEAKICAqIEF1dGhvcjogQW5keSBGbGVtaW5nCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIE1hY2llaiBXLiBSb3p5Y2tpCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTMyLDYgKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTM5NCw3ICszOTcsNyBAQAogRVhQT1JUX1NZTUJPTChwaHlfc3RhcnRfYW5lZyk7CiAKIAotc3RhdGljIHZvaWQgcGh5X2NoYW5nZSh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHBoeV9jaGFuZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIHBoeV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCiAvKiBwaHlfc3RhcnRfbWFjaGluZToKQEAgLTQ4NCw2ICs0ODcsOSBAQAogewogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwaHlfZGF0OwogCisJaWYgKFBIWV9IQUxURUQgPT0gcGh5ZGV2LT5zdGF0ZSkKKwkJcmV0dXJuIElSUV9OT05FOwkJLyogSXQgY2FuJ3QgYmUgb3Vycy4gICovCisKIAkvKiBUaGUgTURJTyBidXMgaXMgbm90IGFsbG93ZWQgdG8gYmUgd3JpdHRlbiBpbiBpbnRlcnJ1cHQKIAkgKiBjb250ZXh0LCBzbyB3ZSBuZWVkIHRvIGRpc2FibGUgdGhlIGlycSBoZXJlLiAgQSB3b3JrCiAJICogcXVldWUgd2lsbCB3cml0ZSB0aGUgUEhZIHRvIGRpc2FibGUgYW5kIGNsZWFyIHRoZQpAQCAtNTQ5LDcgKzU1NSw3IEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQlJTklUX1dPUksoJnBoeWRldi0+cGh5X3F1ZXVlLCBwaHlfY2hhbmdlLCBwaHlkZXYpOworCUlOSVRfV09SSygmcGh5ZGV2LT5waHlfcXVldWUsIHBoeV9jaGFuZ2UpOwogCiAJaWYgKHJlcXVlc3RfaXJxKHBoeWRldi0+aXJxLCBwaHlfaW50ZXJydXB0LAogCQkJCUlSUUZfU0hBUkVELApAQCAtNTc3LDYgKzU4MywxMiBAQAogCWlmIChlcnIpCiAJCXBoeV9lcnJvcihwaHlkZXYpOwogCisJLyoKKwkgKiBGaW5pc2ggYW55IHBlbmRpbmcgd29yazsgd2UgbWlnaHQgaGF2ZSBiZWVuIHNjaGVkdWxlZAorCSAqIHRvIGJlIGNhbGxlZCBmcm9tIGtldmVudGQgb3Vyc2VsdmVzLCB0aG91Z2guCisJICovCisJcnVuX3NjaGVkdWxlZF93b3JrKCZwaHlkZXYtPnBoeV9xdWV1ZSk7CisKIAlmcmVlX2lycShwaHlkZXYtPmlycSwgcGh5ZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC01ODUsMTAgKzU5NywxMSBAQAogCiAKIC8qIFNjaGVkdWxlZCBieSB0aGUgcGh5X2ludGVycnVwdC90aW1lciB0byBoYW5kbGUgUEhZIGNoYW5nZXMgKi8KLXN0YXRpYyB2b2lkIHBoeV9jaGFuZ2Uodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHBoeV9jaGFuZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCBlcnI7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGRhdGE7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGh5X2RldmljZSwgcGh5X3F1ZXVlKTsKIAogCWVyciA9IHBoeV9kaXNhYmxlX2ludGVycnVwdHMocGh5ZGV2KTsKIApAQCAtNjAzLDcgKzYxNiw4IEBACiAJZW5hYmxlX2lycShwaHlkZXYtPmlycSk7CiAKIAkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzICovCi0JZXJyID0gcGh5X2NvbmZpZ19pbnRlcnJ1cHQocGh5ZGV2LCBQSFlfSU5URVJSVVBUX0VOQUJMRUQpOworCWlmIChQSFlfSEFMVEVEICE9IHBoeWRldi0+c3RhdGUpCisJCWVyciA9IHBoeV9jb25maWdfaW50ZXJydXB0KHBoeWRldiwgUEhZX0lOVEVSUlVQVF9FTkFCTEVEKTsKIAogCWlmIChlcnIpCiAJCWdvdG8gaXJxX2VuYWJsZV9lcnI7CkBAIC02MjQsMTggKzYzOCwyNCBAQAogCWlmIChQSFlfSEFMVEVEID09IHBoeWRldi0+c3RhdGUpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCWlmIChwaHlkZXYtPmlycSAhPSBQSFlfUE9MTCkgewotCQkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCi0JCXBoeV9jbGVhcl9pbnRlcnJ1cHQocGh5ZGV2KTsKKwlwaHlkZXYtPnN0YXRlID0gUEhZX0hBTFRFRDsKIAorCWlmIChwaHlkZXYtPmlycSAhPSBQSFlfUE9MTCkgewogCQkvKiBEaXNhYmxlIFBIWSBJbnRlcnJ1cHRzICovCiAJCXBoeV9jb25maWdfaW50ZXJydXB0KHBoeWRldiwgUEhZX0lOVEVSUlVQVF9ESVNBQkxFRCk7Ci0JfQogCi0JcGh5ZGV2LT5zdGF0ZSA9IFBIWV9IQUxURUQ7CisJCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwkJcGh5X2NsZWFyX2ludGVycnVwdChwaHlkZXYpOworCX0KIAogb3V0X3VubG9jazoKIAlzcGluX3VubG9jaygmcGh5ZGV2LT5sb2NrKTsKKworCS8qCisJICogQ2Fubm90IGNhbGwgZmx1c2hfc2NoZWR1bGVkX3dvcmsoKSBoZXJlIGFzIGRlc2lyZWQgYmVjYXVzZQorCSAqIG9mIHJ0bmxfbG9jaygpLCBidXQgUEhZX0hBTFRFRCBzaGFsbCBndWFyYW50ZWUgcGh5X2NoYW5nZSgpCisJICogd2lsbCBub3QgcmVlbmFibGUgaW50ZXJydXB0cy4KKwkgKi8KIH0KIAogCkBAIC02OTMsNjAgKzcxMyw1NyBAQAogCiAJCQlicmVhazsKIAkJY2FzZSBQSFlfQU46CisJCQllcnIgPSBwaHlfcmVhZF9zdGF0dXMocGh5ZGV2KTsKKworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisKKwkJCS8qIElmIHRoZSBsaW5rIGlzIGRvd24sIGdpdmUgdXAgb24KKwkJCSAqIG5lZ290aWF0aW9uIGZvciBub3cgKi8KKwkJCWlmICghcGh5ZGV2LT5saW5rKSB7CisJCQkJcGh5ZGV2LT5zdGF0ZSA9IFBIWV9OT0xJTks7CisJCQkJbmV0aWZfY2Fycmllcl9vZmYocGh5ZGV2LT5hdHRhY2hlZF9kZXYpOworCQkJCXBoeWRldi0+YWRqdXN0X2xpbmsocGh5ZGV2LT5hdHRhY2hlZF9kZXYpOworCQkJCWJyZWFrOworCQkJfQorCiAJCQkvKiBDaGVjayBpZiBuZWdvdGlhdGlvbiBpcyBkb25lLiAgQnJlYWsKIAkJCSAqIGlmIHRoZXJlJ3MgYW4gZXJyb3IgKi8KIAkJCWVyciA9IHBoeV9hbmVnX2RvbmUocGh5ZGV2KTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCWJyZWFrOwogCi0JCQkvKiBJZiBhdXRvLW5lZ290aWF0aW9uIGlzIGRvbmUsIHdlIGNoYW5nZSB0bwotCQkJICogZWl0aGVyIFJVTk5JTkcsIG9yIE5PTElOSyAqLworCQkJLyogSWYgQU4gaXMgZG9uZSwgd2UncmUgcnVubmluZyAqLwogCQkJaWYgKGVyciA+IDApIHsKLQkJCQllcnIgPSBwaHlfcmVhZF9zdGF0dXMocGh5ZGV2KTsKLQotCQkJCWlmIChlcnIpCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKHBoeWRldi0+bGluaykgewotCQkJCQlwaHlkZXYtPnN0YXRlID0gUEhZX1JVTk5JTkc7Ci0JCQkJCW5ldGlmX2NhcnJpZXJfb24ocGh5ZGV2LT5hdHRhY2hlZF9kZXYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBoeWRldi0+c3RhdGUgPSBQSFlfTk9MSU5LOwotCQkJCQluZXRpZl9jYXJyaWVyX29mZihwaHlkZXYtPmF0dGFjaGVkX2Rldik7Ci0JCQkJfQotCisJCQkJcGh5ZGV2LT5zdGF0ZSA9IFBIWV9SVU5OSU5HOworCQkJCW5ldGlmX2NhcnJpZXJfb24ocGh5ZGV2LT5hdHRhY2hlZF9kZXYpOwogCQkJCXBoeWRldi0+YWRqdXN0X2xpbmsocGh5ZGV2LT5hdHRhY2hlZF9kZXYpOwogCiAJCQl9IGVsc2UgaWYgKDAgPT0gcGh5ZGV2LT5saW5rX3RpbWVvdXQtLSkgewotCQkJCS8qIFRoZSBjb3VudGVyIGV4cGlyZWQsIHNvIGVpdGhlciB3ZQotCQkJCSAqIHN3aXRjaCB0byBmb3JjZWQgbW9kZSwgb3IgdGhlCi0JCQkJICogbWFnaWNfYW5lZyBiaXQgZXhpc3RzLCBhbmQgd2UgdHJ5IGFuZWcKLQkJCQkgKiBhZ2FpbiAqLwotCQkJCWlmICghKHBoeWRldi0+ZHJ2LT5mbGFncyAmIFBIWV9IQVNfTUFHSUNBTkVHKSkgewotCQkJCQlpbnQgaWR4OwotCi0JCQkJCS8qIFdlJ2xsIHN0YXJ0IGZyb20gdGhlCi0JCQkJCSAqIGZhc3Rlc3Qgc3BlZWQsIGFuZCB3b3JrCi0JCQkJCSAqIG91ciB3YXkgZG93biAqLwotCQkJCQlpZHggPSBwaHlfZmluZF92YWxpZCgwLAotCQkJCQkJCXBoeWRldi0+c3VwcG9ydGVkKTsKLQotCQkJCQlwaHlkZXYtPnNwZWVkID0gc2V0dGluZ3NbaWR4XS5zcGVlZDsKLQkJCQkJcGh5ZGV2LT5kdXBsZXggPSBzZXR0aW5nc1tpZHhdLmR1cGxleDsKLQkJCQkJCi0JCQkJCXBoeWRldi0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKLQkJCQkJcGh5ZGV2LT5zdGF0ZSA9IFBIWV9GT1JDSU5HOwotCQkJCQlwaHlkZXYtPmxpbmtfdGltZW91dCA9Ci0JCQkJCQlQSFlfRk9SQ0VfVElNRU9VVDsKLQotCQkJCQlwcl9pbmZvKCJUcnlpbmcgJWQvJXNcbiIsCi0JCQkJCQkJcGh5ZGV2LT5zcGVlZCwKLQkJCQkJCQlEVVBMRVhfRlVMTCA9PQotCQkJCQkJCXBoeWRldi0+ZHVwbGV4ID8KLQkJCQkJCQkiRlVMTCIgOiAiSEFMRiIpOwotCQkJCX0KKwkJCQlpbnQgaWR4OwogCiAJCQkJbmVlZHNfYW5lZyA9IDE7CisJCQkJLyogSWYgd2UgaGF2ZSB0aGUgbWFnaWNfYW5lZyBiaXQsCisJCQkJICogd2UgdHJ5IGFnYWluICovCisJCQkJaWYgKHBoeWRldi0+ZHJ2LT5mbGFncyAmIFBIWV9IQVNfTUFHSUNBTkVHKQorCQkJCQlicmVhazsKKworCQkJCS8qIFRoZSB0aW1lciBleHBpcmVkLCBhbmQgd2Ugc3RpbGwKKwkJCQkgKiBkb24ndCBoYXZlIGEgc2V0dGluZywgc28gd2UgdHJ5CisJCQkJICogZm9yY2luZyBpdCB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0CisJCQkJICogd29ya3MsIHN0YXJ0aW5nIGZyb20gdGhlIGZhc3Rlc3Qgc3BlZWQsCisJCQkJICogYW5kIHdvcmtpbmcgb3VyIHdheSBkb3duICovCisJCQkJaWR4ID0gcGh5X2ZpbmRfdmFsaWQoMCwgcGh5ZGV2LT5zdXBwb3J0ZWQpOworCisJCQkJcGh5ZGV2LT5zcGVlZCA9IHNldHRpbmdzW2lkeF0uc3BlZWQ7CisJCQkJcGh5ZGV2LT5kdXBsZXggPSBzZXR0aW5nc1tpZHhdLmR1cGxleDsKKworCQkJCXBoeWRldi0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKworCQkJCXByX2luZm8oIlRyeWluZyAlZC8lc1xuIiwgcGh5ZGV2LT5zcGVlZCwKKwkJCQkJCURVUExFWF9GVUxMID09CisJCQkJCQlwaHlkZXYtPmR1cGxleCA/CisJCQkJCQkiRlVMTCIgOiAiSEFMRiIpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUEhZX05PTElOSzoKQEAgLTc2Miw3ICs3NzksNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUEhZX0ZPUkNJTkc6Ci0JCQllcnIgPSBwaHlfcmVhZF9zdGF0dXMocGh5ZGV2KTsKKwkJCWVyciA9IGdlbnBoeV91cGRhdGVfbGluayhwaHlkZXYpOwogCiAJCQlpZiAoZXJyKQogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKaW5kZXggM2JiZDVlNy4uYTRkNzUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCkBAIC01MCw3ICs1MCw3IEBACiAJc3RydWN0IHBoeV9kZXZpY2UgKmRldjsKIAkvKiBXZSBhbGxvY2F0ZSB0aGUgZGV2aWNlLCBhbmQgaW5pdGlhbGl6ZSB0aGUKIAkgKiBkZWZhdWx0IHZhbHVlcyAqLwotCWRldiA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoTlVMTCA9PSBkZXYpCiAJCXJldHVybiAoc3RydWN0IHBoeV9kZXZpY2UqKSBQVFJfRVJSKCh2b2lkKiktRU5PTUVNKTsKQEAgLTU5LDYgKzU5LDcgQEAKIAlkZXYtPmR1cGxleCA9IC0xOwogCWRldi0+cGF1c2UgPSBkZXYtPmFzeW1fcGF1c2UgPSAwOwogCWRldi0+bGluayA9IDE7CisJZGV2LT5pbnRlcmZhY2UgPSBQSFlfSU5URVJGQUNFX01PREVfR01JSTsKIAogCWRldi0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOwogCkBAIC0xMzcsMTEgKzEzOCwxMiBAQAogICogICB0aGUgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LgogICovCiBzdHJ1Y3QgcGh5X2RldmljZSAqIHBoeV9jb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnBoeV9pZCwKLQkJdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICopLCB1MzIgZmxhZ3MpCisJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqKSwgdTMyIGZsYWdzLAorCQl1MzIgaW50ZXJmYWNlKQogewogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAKLQlwaHlkZXYgPSBwaHlfYXR0YWNoKGRldiwgcGh5X2lkLCBmbGFncyk7CisJcGh5ZGV2ID0gcGh5X2F0dGFjaChkZXYsIHBoeV9pZCwgZmxhZ3MsIGludGVyZmFjZSk7CiAKIAlpZiAoSVNfRVJSKHBoeWRldikpCiAJCXJldHVybiBwaHlkZXY7CkBAIC0xODYsNyArMTg4LDcgQEAKIH0KIAogc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJY29uc3QgY2hhciAqcGh5X2lkLCB1MzIgZmxhZ3MpCisJCWNvbnN0IGNoYXIgKnBoeV9pZCwgdTMyIGZsYWdzLCB1MzIgaW50ZXJmYWNlKQogewogCXN0cnVjdCBidXNfdHlwZSAqYnVzID0gJm1kaW9fYnVzX3R5cGU7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKQEAgLTIzMSw2ICsyMzMsMjAgQEAKIAogCXBoeWRldi0+ZGV2X2ZsYWdzID0gZmxhZ3M7CiAKKwlwaHlkZXYtPmludGVyZmFjZSA9IGludGVyZmFjZTsKKworCS8qIERvIGluaXRpYWwgY29uZmlndXJhdGlvbiBoZXJlLCBub3cgdGhhdAorCSAqIHdlIGhhdmUgY2VydGFpbiBrZXkgcGFyYW1ldGVycworCSAqIChkZXZfZmxhZ3MgYW5kIGludGVyZmFjZSkgKi8KKwlpZiAocGh5ZGV2LT5kcnYtPmNvbmZpZ19pbml0KSB7CisJCWludCBlcnI7CisKKwkJZXJyID0gcGh5ZGV2LT5kcnYtPmNvbmZpZ19pbml0KHBoeWRldik7CisKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKwogCXJldHVybiBwaHlkZXY7CiB9CiBFWFBPUlRfU1lNQk9MKHBoeV9hdHRhY2gpOwpAQCAtNDI3LDYgKzQ0Myw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZ2VucGh5X3VwZGF0ZV9saW5rKTsKIAogLyogZ2VucGh5X3JlYWRfc3RhdHVzCiAgKgpAQCAtNjExLDEzICs2MjgsOCBAQAogCiAJc3Bpbl91bmxvY2soJnBoeWRldi0+bG9jayk7CiAKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmIChwaHlkZXYtPmRydi0+Y29uZmlnX2luaXQpCi0JCWVyciA9IHBoeWRldi0+ZHJ2LT5jb25maWdfaW5pdChwaHlkZXYpOwotCiAJcmV0dXJuIGVycjsKKwogfQogCiBzdGF0aWMgaW50IHBoeV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGxpcC5jIGIvZHJpdmVycy9uZXQvcGxpcC5jCmluZGV4IDcxYWZiMjcuLjZiYjA4NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BsaXAuYworKysgYi9kcml2ZXJzL25ldC9wbGlwLmMKQEAgLTEzOCw5ICsxMzgsOSBAQAogI2RlZmluZSBQTElQX05JQkJMRV9XQUlUICAgICAgICAzMDAwCiAKIC8qIEJvdHRvbSBoYWx2ZXMgKi8KLXN0YXRpYyB2b2lkIHBsaXBfa2lja19iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHBsaXBfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBwbGlwX3RpbWVyX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcGxpcF9raWNrX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBwbGlwX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBwbGlwX3RpbWVyX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qIEludGVycnVwdCBoYW5kbGVyICovCiBzdGF0aWMgdm9pZCBwbGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpAQCAtMjA3LDkgKzIwNywxMCBAQAogCiBzdHJ1Y3QgbmV0X2xvY2FsIHsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBlbmV0X3N0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHdvcmtfc3RydWN0IGltbWVkaWF0ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVmZXJyZWQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHRpbWVyOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVmZXJyZWQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0aW1lcjsKIAlzdHJ1Y3QgcGxpcF9sb2NhbCBzbmRfZGF0YTsKIAlzdHJ1Y3QgcGxpcF9sb2NhbCByY3ZfZGF0YTsKIAlzdHJ1Y3QgcGFyZGV2aWNlICpwYXJkZXY7CkBAIC0zMDYsMTEgKzMwNywxMSBAQAogCW5sLT5uaWJibGUJPSBQTElQX05JQkJMRV9XQUlUOwogCiAJLyogSW5pdGlhbGl6ZSB0YXNrIHF1ZXVlIHN0cnVjdHVyZXMgKi8KLQlJTklUX1dPUksoJm5sLT5pbW1lZGlhdGUsICh2b2lkICgqKSh2b2lkICopKXBsaXBfYmgsIGRldik7Ci0JSU5JVF9XT1JLKCZubC0+ZGVmZXJyZWQsICh2b2lkICgqKSh2b2lkICopKXBsaXBfa2lja19iaCwgZGV2KTsKKwlJTklUX1dPUksoJm5sLT5pbW1lZGlhdGUsIHBsaXBfYmgpOworCUlOSVRfREVMQVlFRF9XT1JLKCZubC0+ZGVmZXJyZWQsIHBsaXBfa2lja19iaCk7CiAKIAlpZiAoZGV2LT5pcnEgPT0gLTEpCi0JCUlOSVRfV09SSygmbmwtPnRpbWVyLCAodm9pZCAoKikodm9pZCAqKSlwbGlwX3RpbWVyX2JoLCBkZXYpOworCQlJTklUX0RFTEFZRURfV09SSygmbmwtPnRpbWVyLCBwbGlwX3RpbWVyX2JoKTsKIAogCXNwaW5fbG9ja19pbml0KCZubC0+bG9jayk7CiB9CkBAIC0zMTksOSArMzIwLDEwIEBACiAgICBUaGlzIHJvdXRpbmUgaXMga2lja2VkIGJ5IGRvX3RpbWVyKCkuCiAgICBSZXF1ZXN0IGBwbGlwX2JoJyB0byBiZSBpbnZva2VkLiAqLwogc3RhdGljIHZvaWQKLXBsaXBfa2lja19iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorcGxpcF9raWNrX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ldF9sb2NhbCwgZGVmZXJyZWQud29yayk7CiAKIAlpZiAobmwtPmlzX2RlZmVycmVkKQogCQlzY2hlZHVsZV93b3JrKCZubC0+aW1tZWRpYXRlKTsKQEAgLTM2Miw5ICszNjQsOSBAQAogCiAvKiBCb3R0b20gaGFsZiBoYW5kbGVyIG9mIFBMSVAuICovCiBzdGF0aWMgdm9pZAotcGxpcF9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorcGxpcF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZXRfbG9jYWwsIGltbWVkaWF0ZSk7CiAJc3RydWN0IHBsaXBfbG9jYWwgKnNuZCA9ICZubC0+c25kX2RhdGE7CiAJc3RydWN0IHBsaXBfbG9jYWwgKnJjdiA9ICZubC0+cmN2X2RhdGE7CiAJcGxpcF9mdW5jIGY7CkBAIC0zNzIsMjAgKzM3NCwyMSBAQAogCiAJbmwtPmlzX2RlZmVycmVkID0gMDsKIAlmID0gY29ubmVjdGlvbl9zdGF0ZV90YWJsZVtubC0+Y29ubmVjdGlvbl07Ci0JaWYgKChyID0gKCpmKShkZXYsIG5sLCBzbmQsIHJjdikpICE9IE9LCi0JICAgICYmIChyID0gcGxpcF9iaF90aW1lb3V0X2Vycm9yKGRldiwgbmwsIHNuZCwgcmN2LCByKSkgIT0gT0spIHsKKwlpZiAoKHIgPSAoKmYpKG5sLT5kZXYsIG5sLCBzbmQsIHJjdikpICE9IE9LCisJICAgICYmIChyID0gcGxpcF9iaF90aW1lb3V0X2Vycm9yKG5sLT5kZXYsIG5sLCBzbmQsIHJjdiwgcikpICE9IE9LKSB7CiAJCW5sLT5pc19kZWZlcnJlZCA9IDE7CiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmwtPmRlZmVycmVkLCAxKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi1wbGlwX3RpbWVyX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitwbGlwX3RpbWVyX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ldF9sb2NhbCwgdGltZXIud29yayk7CiAKIAlpZiAoIShhdG9taWNfcmVhZCAoJm5sLT5raWxsX3RpbWVyKSkpIHsKLQkJcGxpcF9pbnRlcnJ1cHQgKC0xLCBkZXYpOworCQlwbGlwX2ludGVycnVwdCAoLTEsIG5sLT5kZXYpOwogCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmwtPnRpbWVyLCAxKTsKIAl9CkBAIC0xMjg0LDYgKzEyODcsNyBAQAogCQl9CiAKIAkJbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCQlubC0+ZGV2ID0gZGV2OwogCQlubC0+cGFyZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgbmFtZSwgcGxpcF9wcmVlbXB0LAogCQkJCQkJIHBsaXBfd2FrZXVwLCBwbGlwX2ludGVycnVwdCwKIAkJCQkJCSAwLCBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2RlZmxhdGUuYyBiL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMKaW5kZXggZjU0YzU1Mi4uNzJjOGQ2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX2RlZmxhdGUuYworKysgYi9kcml2ZXJzL25ldC9wcHBfZGVmbGF0ZS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAlpZiAod19zaXplIDwgREVGTEFURV9NSU5fU0laRSB8fCB3X3NpemUgPiBERUZMQVRFX01BWF9TSVpFKQogCQlyZXR1cm4gTlVMTDsKIAotCXN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBrbWFsbG9jKHNpemVvZigqc3RhdGUpLAorCXN0YXRlID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwKIAkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwpAQCAtMzQxLDcgKzM0MSw3IEBACiAJaWYgKHdfc2l6ZSA8IERFRkxBVEVfTUlOX1NJWkUgfHwgd19zaXplID4gREVGTEFURV9NQVhfU0laRSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCmluZGV4IGY1ODAyZTcuLmM2ZGU1NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYwpAQCAtODYwLDcgKzg2MCw3IEBACiAJCQllcnIgPSBQVFJfRVJSKHBwcF9jbGFzcyk7CiAJCQlnb3RvIG91dF9jaHJkZXY7CiAJCX0KLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZShwcHBfY2xhc3MsIE5VTEwsIE1LREVWKFBQUF9NQUpPUiwgMCksIE5VTEwsICJwcHAiKTsKKwkJZGV2aWNlX2NyZWF0ZShwcHBfY2xhc3MsIE5VTEwsIE1LREVWKFBQUF9NQUpPUiwgMCksICJwcHAiKTsKIAl9CiAKIG91dDoKQEAgLTI2NzUsNyArMjY3NSw3IEBACiAJY2FyZG1hcF9kZXN0cm95KCZhbGxfcHBwX3VuaXRzKTsKIAlpZiAodW5yZWdpc3Rlcl9jaHJkZXYoUFBQX01BSk9SLCAicHBwIikgIT0gMCkKIAkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIFBQUCBkZXZpY2VcbiIpOwotCWNsYXNzX2RldmljZV9kZXN0cm95KHBwcF9jbGFzcywgTUtERVYoUFBQX01BSk9SLCAwKSk7CisJZGV2aWNlX2Rlc3Ryb3kocHBwX2NsYXNzLCBNS0RFVihQUFBfTUFKT1IsIDApKTsKIAljbGFzc19kZXN0cm95KHBwcF9jbGFzcyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9tcHBlLmMgYi9kcml2ZXJzL25ldC9wcHBfbXBwZS5jCmluZGV4IGYzNjU1ZmQuLmQ1YmRkMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9tcHBlLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwX21wcGUuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJICAgIHx8IG9wdGlvbnNbMF0gIT0gQ0lfTVBQRSB8fCBvcHRpb25zWzFdICE9IENJTEVOX01QUEUpCiAJCWdvdG8gb3V0OwogCi0Jc3RhdGUgPSAoc3RydWN0IHBwcF9tcHBlX3N0YXRlICopIGttYWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOworCXN0YXRlID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBvZS5jIGIvZHJpdmVycy9uZXQvcHBwb2UuYwppbmRleCAwYWRlZTczLi4zMTVkNWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBvZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcG9lLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogCiAJcG8gPSBnZXRfaXRlbSgodW5zaWduZWQgbG9uZykgcGgtPnNpZCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CiAJaWYgKHBvICE9IE5VTEwpCi0JCXJldHVybiBza19yZWNlaXZlX3NrYihza19wcHBveChwbyksIHNrYik7CisJCXJldHVybiBza19yZWNlaXZlX3NrYihza19wcHBveChwbyksIHNrYiwgMCk7CiBkcm9wOgogCWtmcmVlX3NrYihza2IpOwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxhM3h4eC5jIGIvZHJpdmVycy9uZXQvcWxhM3h4eC5jCmluZGV4IGVjNjQwZjYuLmQ3OWQxNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsYTN4eHguYworKysgYi9kcml2ZXJzL25ldC9xbGEzeHh4LmMKQEAgLTIwMDgsNyArMjAwOCw3IEBACiAJCQkgICAgICAgIiVzOiBBbm90aGVyIGZ1bmN0aW9uIGlzc3VlZCBhIHJlc2V0IHRvIHRoZSAiCiAJCQkgICAgICAgImNoaXAuIElTUiB2YWx1ZSA9ICV4LlxuIiwgbmRldi0+bmFtZSwgdmFsdWUpOwogCQl9Ci0JCXF1ZXVlX3dvcmsocWRldi0+d29ya3F1ZXVlLCAmcWRldi0+cmVzZXRfd29yayk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhxZGV2LT53b3JrcXVldWUsICZxZGV2LT5yZXNldF93b3JrLCAwKTsKIAkJc3Bpbl91bmxvY2soJnFkZXYtPmFkYXB0ZXJfbG9jayk7CiAJfSBlbHNlIGlmICh2YWx1ZSAmIElTUF9JTVJfRElTQUJMRV9DTVBMX0lOVCkgewogCQlxbF9kaXNhYmxlX2ludGVycnVwdHMocWRldik7CkBAIC0zMTgyLDExICszMTgyLDEzIEBACiAJLyoKIAkgKiBXYWtlIHVwIHRoZSB3b3JrZXIgdG8gcHJvY2VzcyB0aGlzIGV2ZW50LgogCSAqLwotCXF1ZXVlX3dvcmsocWRldi0+d29ya3F1ZXVlLCAmcWRldi0+dHhfdGltZW91dF93b3JrKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocWRldi0+d29ya3F1ZXVlLCAmcWRldi0+dHhfdGltZW91dF93b3JrLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgcWxfcmVzZXRfd29yayhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCitzdGF0aWMgdm9pZCBxbF9yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHFsM19hZGFwdGVyLCByZXNldF93b3JrLndvcmspOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcWRldi0+bmRldjsKIAl1MzIgdmFsdWU7CiAJc3RydWN0IHFsX3R4X2J1Zl9jYiAqdHhfY2I7CkBAIC0zMjc4LDkgKzMyODAsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHFsX3R4X3RpbWVvdXRfd29yayhzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCitzdGF0aWMgdm9pZCBxbF90eF90aW1lb3V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXFsX2N5Y2xlX2FkYXB0ZXIocWRldixRTF9ET19SRVNFVCk7CisJc3RydWN0IHFsM19hZGFwdGVyICpxZGV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxbDNfYWRhcHRlciwgdHhfdGltZW91dF93b3JrLndvcmspOworCisJcWxfY3ljbGVfYWRhcHRlcihxZGV2LCBRTF9ET19SRVNFVCk7CiB9CiAKIHN0YXRpYyB2b2lkIHFsX2dldF9ib2FyZF9pbmZvKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKQEAgLTM0NTksOSArMzQ2NCw4IEBACiAJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKIAogCXFkZXYtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKG5kZXYtPm5hbWUpOwotCUlOSVRfV09SSygmcWRldi0+cmVzZXRfd29yaywgKHZvaWQgKCopKHZvaWQgKikpcWxfcmVzZXRfd29yaywgcWRldik7Ci0JSU5JVF9XT1JLKCZxZGV2LT50eF90aW1lb3V0X3dvcmssCi0JCSAgKHZvaWQgKCopKHZvaWQgKikpcWxfdHhfdGltZW91dF93b3JrLCBxZGV2KTsKKwlJTklUX0RFTEFZRURfV09SSygmcWRldi0+cmVzZXRfd29yaywgcWxfcmVzZXRfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnFkZXYtPnR4X3RpbWVvdXRfd29yaywgcWxfdHhfdGltZW91dF93b3JrKTsKIAogCWluaXRfdGltZXIoJnFkZXYtPmFkYXB0ZXJfdGltZXIpOwogCXFkZXYtPmFkYXB0ZXJfdGltZXIuZnVuY3Rpb24gPSBxbDN4eHhfdGltZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGEzeHh4LmggYi9kcml2ZXJzL25ldC9xbGEzeHh4LmgKaW5kZXggNjVkYTJjMC4uZWE5NGRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxhM3h4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3FsYTN4eHguaApAQCAtMTE4Niw4ICsxMTg2LDggQEAKIAl1MzIgbnVtUG9ydHM7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfdGltZW91dF93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcmVzZXRfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHR4X3RpbWVvdXRfd29yazsKIAl1MzIgbWF4X2ZyYW1lX3NpemU7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yODE2OS5jIGIvZHJpdmVycy9uZXQvcjgxNjkuYwppbmRleCBmMWM3NTc1Li5mODNiNDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yODE2OS5jCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTIxNCw2ICsyMTQsNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssCTB4ODE2OCksIDAsIDAsIFJUTF9DRkdfMiB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssCTB4ODE2OSksIDAsIDAsIFJUTF9DRkdfMCB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RMSU5LLAkweDQzMDApLCAwLCAwLCBSVExfQ0ZHXzAgfSwKKwl7IFBDSV9ERVZJQ0UoMHgxMjU5LAkJCTB4YzEwNyksIDAsIDAsIFJUTF9DRkdfMCB9LAogCXsgUENJX0RFVklDRSgweDE2ZWMsCQkJMHgwMTE2KSwgMCwgMCwgUlRMX0NGR18wIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0xJTktTWVMsCQkweDEwMzIsCiAJCVBDSV9BTllfSUQsIDB4MDAyNCwgMCwgMCwgUlRMX0NGR18wIH0sCkBAIC0yMjQsNiArMjI1LDcgQEAKIAogc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7CiBzdGF0aWMgaW50IHVzZV9kYWM7CitzdGF0aWMgaW50IGlnbm9yZV9wYXJpdHlfZXJyOwogc3RhdGljIHN0cnVjdCB7CiAJdTMyIG1zZ19lbmFibGU7CiB9IGRlYnVnID0geyAtMSB9OwpAQCAtNDIzLDYgKzQyNSw3IEBACiBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlIHsKIAl2b2lkIF9faW9tZW0gKm1taW9fYWRkcjsJLyogbWVtb3J5IG1hcCBwaHlzaWNhbCBhZGRyZXNzICovCiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CS8qIEluZGV4IG9mIFBDSSBkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBzdGF0aXN0aWNzIG9mIG5ldCBkZXZpY2UgKi8KIAlzcGlubG9ja190IGxvY2s7CQkvKiBzcGluIGxvY2sgZmxhZyAqLwogCXUzMiBtc2dfZW5hYmxlOwpAQCAtNDU0LDcgKzQ1Nyw3IEBACiAJdm9pZCAoKnBoeV9yZXNldF9lbmFibGUpKHZvaWQgX19pb21lbSAqKTsKIAl1bnNpZ25lZCBpbnQgKCpwaHlfcmVzZXRfcGVuZGluZykodm9pZCBfX2lvbWVtICopOwogCXVuc2lnbmVkIGludCAoKmxpbmtfb2spKHZvaWQgX19pb21lbSAqKTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGFzazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRhc2s7CiAJdW5zaWduZWQgd29sX2VuYWJsZWQgOiAxOwogfTsKIApAQCAtNDY4LDYgKzQ3MSw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHVzZV9kYWMsICJFbmFibGUgUENJIERBQy4gVW5zYWZlIG9uIDMyIGJpdCBQQ0kgc2xvdC4iKTsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZGVidWcubXNnX2VuYWJsZSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyB2ZXJib3NpdHkgbGV2ZWwgKDA9bm9uZSwgLi4uLCAxNj1hbGwpIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoaWdub3JlX3Bhcml0eV9lcnIsIGlnbm9yZV9wYXJpdHlfZXJyLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX3Bhcml0eV9lcnIsICJJZ25vcmUgUENJIHBhcml0eSBlcnJvciBhcyB0YXJnZXQuIERlZmF1bHQ6IGZhbHNlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihSVEw4MTY5X1ZFUlNJT04pOwogCkBAIC01NzAsOCArNTc1LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCi0JdmFsID0gKG1kaW9fcmVhZChpb2FkZHIsIE1JSV9CTUNSKSB8IEJNQ1JfUkVTRVQpICYgMHhmZmZmOwotCW1kaW9fd3JpdGUoaW9hZGRyLCBNSUlfQk1DUiwgdmFsKTsKKwltZGlvX3dyaXRlKGlvYWRkciwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCXZhbCA9IG1kaW9fcmVhZChpb2FkZHIsIE1JSV9CTUNSKTsKIH0KIAogc3RhdGljIHZvaWQgcnRsODE2OV9jaGVja19saW5rX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTI4MiwxMSArMTI4Nyw2IEBACiAJLyogU2hhemFtICEgKi8KIAogCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wNCkgewotCQltZGlvX3dyaXRlKGlvYWRkciwgMzEsIDB4MDAwMSk7Ci0JCW1kaW9fd3JpdGUoaW9hZGRyLCAgOSwgMHgyNzNhKTsKLQkJbWRpb193cml0ZShpb2FkZHIsIDE0LCAweDdiZmIpOwotCQltZGlvX3dyaXRlKGlvYWRkciwgMjcsIDB4ODQxZSk7Ci0KIAkJbWRpb193cml0ZShpb2FkZHIsIDMxLCAweDAwMDIpOwogCQltZGlvX3dyaXRlKGlvYWRkciwgIDEsIDB4OTBkMCk7CiAJCW1kaW9fd3JpdGUoaW9hZGRyLCAzMSwgMHgwMDAwKTsKQEAgLTEzOTYsNDEgKzEzOTYsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9fcnRsODE2OV9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCBfX2lvbWVtICppb2FkZHIpCi17Ci0JdW5zaWduZWQgaW50IGksIGo7Ci0KLQlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOwotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJX19sZTMyIGwgPSAwOwotCi0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJCWwgPDw9IDg7Ci0JCQlsIHw9IGRldi0+ZGV2X2FkZHJbNCppICsgal07Ci0JCX0KLQkJUlRMX1czMihNQUMwICsgNCppLCBjcHVfdG9fYmUzMihsKSk7Ci0JfQotCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOwotfQotCi1zdGF0aWMgaW50IHJ0bDgxNjlfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCi17Ci0Jc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7Ci0KLQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7Ci0JCV9fcnRsODE2OV9zZXRfbWFjX2FkZHIoZGV2LCB0cC0+bW1pb19hZGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBydGw4MTY5X3JlbGVhc2VfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICB2b2lkIF9faW9tZW0gKmlvYWRkcikKIHsKQEAgLTE0NDAsNiArMTQwNSwyMiBAQAogCWZyZWVfbmV0ZGV2KGRldik7CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcGh5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IGk7CisKKwl0cC0+cGh5X3Jlc2V0X2VuYWJsZShpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIXRwLT5waHlfcmVzZXRfcGVuZGluZyhpb2FkZHIpKQorCQkJcmV0dXJuOworCQltc2xlZXAoMSk7CisJfQorCWlmIChuZXRpZl9tc2dfbGluayh0cCkpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBIWSByZXNldCBmYWlsZWQuXG4iLCBkZXYtPm5hbWUpOworfQorCiBzdGF0aWMgdm9pZCBydGw4MTY5X2luaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQogewogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKQEAgLTE0NjgsNiArMTQ0OSw4IEBACiAKIAlydGw4MTY5X2xpbmtfb3B0aW9uKGJvYXJkX2lkeCwgJmF1dG9uZWcsICZzcGVlZCwgJmR1cGxleCk7CiAKKwlydGw4MTY5X3BoeV9yZXNldChkZXYsIHRwKTsKKwogCXJ0bDgxNjlfc2V0X3NwZWVkKGRldiwgYXV0b25lZywgc3BlZWQsIGR1cGxleCk7CiAKIAlpZiAoKFJUTF9SOChQSFlzdGF0dXMpICYgVEJJX0VuYWJsZSkgJiYgbmV0aWZfbXNnX2xpbmsodHApKQpAQCAtMTUwNyw4ICsxNDkwLDggQEAKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXZvaWQgX19pb21lbSAqaW9hZGRyOwotCXVuc2lnbmVkIGludCBpLCBwbV9jYXA7Ci0JaW50IHJjOworCXVuc2lnbmVkIGludCBwbV9jYXA7CisJaW50IGksIHJjOwogCiAJaWYgKG5ldGlmX21zZ19kcnYoJmRlYnVnKSkgewogCQlwcmludGsoS0VSTl9JTkZPICIlcyBHaWdhYml0IEV0aGVybmV0IGRyaXZlciAlcyBsb2FkZWRcbiIsCkBAIC0xNTI2LDYgKzE1MDksNyBAQAogCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKIAlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwogCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0cC0+ZGV2ID0gZGV2OwogCXRwLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcubXNnX2VuYWJsZSwgUjgxNjlfTVNHX0RFRkFVTFQpOwogCiAJLyogZW5hYmxlIGRldmljZSAoaW5jbC4gUENJIFBNIHdha2V1cCBhbmQgaG90cGx1ZyBzZXR1cCkgKi8KQEAgLTE2ODAsNyArMTY2NCw2IEBACiAJZGV2LT5zdG9wID0gcnRsODE2OV9jbG9zZTsKIAlkZXYtPnR4X3RpbWVvdXQgPSBydGw4MTY5X3R4X3RpbWVvdXQ7CiAJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBydGw4MTY5X3NldF9yeF9tb2RlOwotCWRldi0+c2V0X21hY19hZGRyZXNzID0gcnRsODE2OV9zZXRfbWFjX2FkZHI7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFJUTDgxNjlfVFhfVElNRU9VVDsKIAlkZXYtPmlycSA9IHBkZXYtPmlycTsKIAlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7CkBAIC0xNzk5LDcgKzE3ODIsNyBAQAogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIGVycl9mcmVlX3J4OwogCi0JSU5JVF9XT1JLKCZ0cC0+dGFzaywgTlVMTCwgZGV2KTsKKwlJTklUX0RFTEFZRURfV09SSygmdHAtPnRhc2ssIE5VTEwpOwogCiAJcnRsODE2OV9od19zdGFydChkZXYpOwogCkBAIC0xODMyLDEyICsxODE1LDI1IEBACiAJUlRMX1I4KENoaXBDbWQpOwogfQogCi1zdGF0aWMgdm9pZAotcnRsODE2OV9od19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE2OV9zZXRfcnhfdHhfY29uZmlnX3JlZ2lzdGVycyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTMyIGNmZyA9IHJ0bDgxNjlfcnhfY29uZmlnOworCisJY2ZnIHw9IChSVExfUjMyKFJ4Q29uZmlnKSAmIHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLlJ4Q29uZmlnTWFzayk7CisJUlRMX1czMihSeENvbmZpZywgY2ZnKTsKKworCS8qIFNldCBETUEgYnVyc3Qgc2l6ZSBhbmQgSW50ZXJmcmFtZSBHYXAgVGltZSAqLworCVJUTF9XMzIoVHhDb25maWcsIChUWF9ETUFfQlVSU1QgPDwgVHhETUFTaGlmdCkgfAorCQkoSW50ZXJGcmFtZUdhcCA8PCBUeEludGVyRnJhbWVHYXBTaGlmdCkpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2h3X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wY2lfZGV2OworCXUxNiBjbWQ7CiAJdTMyIGk7CiAKIAkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLwpAQCAtMTg1MCw2ICsxODQ2LDExIEBACiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEpOwogCX0KIAorCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wNSkgeworCQlSVExfVzE2KENQbHVzQ21kLCBSVExfUjE2KENQbHVzQ21kKSB8IFBDSU11bFJXKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDB4MDgpOworCX0KKwogCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8xMykgewogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgMHg2OCwgMHgwMCk7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCAweDY5LCAweDA4KTsKQEAgLTE4NTcsOCArMTg1OCw2IEBACiAKIAkvKiBVbmRvY3VtZW50ZWQgc3R1ZmYuICovCiAJaWYgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzA1KSB7Ci0JCXUxNiBjbWQ7Ci0KIAkJLyogUmVhbHRlaydzIHIxMDAwX24uYyBkcml2ZXIgdXNlcyAnJiYgMHgwMScgaGVyZS4gV2VsbC4uLiAqLwogCQlpZiAoKFJUTF9SOChDb25maWcyKSAmIDB4MDcpICYgMHgwMSkKIAkJCVJUTF9XMzIoMHg3YywgMHgwMDA3ZmZmZik7CkBAIC0xODcwLDIzICsxODY5LDI5IEBACiAJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKIAl9CiAKLQogCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJaWYgKCh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wMSkgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzAyKSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDMpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wNCkpCisJCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKKwogCVJUTF9XOChFYXJseVR4VGhyZXMsIEVhcmx5VHhUaGxkKTsKIAogCS8qIExvdyBodXJ0cy4gTGV0J3MgZGlzYWJsZSB0aGUgZmlsdGVyaW5nLiAqLwogCVJUTF9XMTYoUnhNYXhTaXplLCAxNjM4Myk7CiAKLQkvKiBTZXQgUnggQ29uZmlnIHJlZ2lzdGVyICovCi0JaSA9IHJ0bDgxNjlfcnhfY29uZmlnIHwKLQkJKFJUTF9SMzIoUnhDb25maWcpICYgcnRsX2NoaXBfaW5mb1t0cC0+Y2hpcHNldF0uUnhDb25maWdNYXNrKTsKLQlSVExfVzMyKFJ4Q29uZmlnLCBpKTsKKwlpZiAoKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzAxKSB8fAorCSAgICAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDIpIHx8CisJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wMykgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzA0KSkKKwkJUlRMX1c4KENoaXBDbWQsIENtZFR4RW5iIHwgQ21kUnhFbmIpOworCQlydGw4MTY5X3NldF9yeF90eF9jb25maWdfcmVnaXN0ZXJzKHRwKTsKIAotCS8qIFNldCBETUEgYnVyc3Qgc2l6ZSBhbmQgSW50ZXJmcmFtZSBHYXAgVGltZSAqLwotCVJUTF9XMzIoVHhDb25maWcsIChUWF9ETUFfQlVSU1QgPDwgVHhETUFTaGlmdCkgfAotCQkoSW50ZXJGcmFtZUdhcCA8PCBUeEludGVyRnJhbWVHYXBTaGlmdCkpOworCWNtZCA9IFJUTF9SMTYoQ1BsdXNDbWQpOworCVJUTF9XMTYoQ1BsdXNDbWQsIGNtZCk7CiAKLQl0cC0+Y3BfY21kIHw9IFJUTF9SMTYoQ1BsdXNDbWQpIHwgUENJTXVsUlc7CisJdHAtPmNwX2NtZCB8PSBjbWQgfCBQQ0lNdWxSVzsKIAogCWlmICgodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfMDIpIHx8CiAJICAgICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8wMykpIHsKQEAgLTE5MTIsNyArMTkxNywxNSBAQAogCVJUTF9XMzIoVHhEZXNjU3RhcnRBZGRyTG93LCAoKHU2NCkgdHAtPlR4UGh5QWRkciAmIERNQV8zMkJJVF9NQVNLKSk7CiAJUlRMX1czMihSeERlc2NBZGRySGlnaCwgKCh1NjQpIHRwLT5SeFBoeUFkZHIgPj4gMzIpKTsKIAlSVExfVzMyKFJ4RGVzY0FkZHJMb3csICgodTY0KSB0cC0+UnhQaHlBZGRyICYgRE1BXzMyQklUX01BU0spKTsKLQlSVExfVzgoQ2hpcENtZCwgQ21kVHhFbmIgfCBDbWRSeEVuYik7CisKKwlpZiAoKHRwLT5tYWNfdmVyc2lvbiAhPSBSVExfR0lHQV9NQUNfVkVSXzAxKSAmJgorCSAgICAodHAtPm1hY192ZXJzaW9uICE9IFJUTF9HSUdBX01BQ19WRVJfMDIpICYmCisJICAgICh0cC0+bWFjX3ZlcnNpb24gIT0gUlRMX0dJR0FfTUFDX1ZFUl8wMykgJiYKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiAhPSBSVExfR0lHQV9NQUNfVkVSXzA0KSkgeworCQlSVExfVzgoQ2hpcENtZCwgQ21kVHhFbmIgfCBDbWRSeEVuYik7CisJCXJ0bDgxNjlfc2V0X3J4X3R4X2NvbmZpZ19yZWdpc3RlcnModHApOworCX0KKwogCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOwogCiAJLyogSW5pdGlhbGx5IGEgMTAgdXMgZGVsYXkuIFR1cm5lZCBpdCBpbnRvIGEgUENJIGNvbW1pdC4gLSBGUiAqLwpAQCAtMTkyOCw4ICsxOTQxLDYgQEAKIAkvKiBFbmFibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCiAJUlRMX1cxNihJbnRyTWFzaywgcnRsODE2OV9pbnRyX21hc2spOwogCi0JX19ydGw4MTY5X3NldF9tYWNfYWRkcihkZXYsIGlvYWRkcik7Ci0KIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogfQogCkBAIC0yMDA5LDcgKzIwMjAsNyBAQAogCWlmICghc2tiKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlza2JfcmVzZXJ2ZShza2IsIGFsaWduKTsKKwlza2JfcmVzZXJ2ZShza2IsIChhbGlnbiAtIDEpICYgKHUzMilza2ItPmRhdGEpOwogCSpza19idWZmID0gc2tiOwogCiAJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwgcnhfYnVmX3N6LApAQCAtMjEyNCwxMSArMjEzNSwxMSBAQAogCXRwLT5jdXJfdHggPSB0cC0+ZGlydHlfdHggPSAwOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTY5X3NjaGVkdWxlX3dvcmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAoKnRhc2spKHZvaWQgKikpCitzdGF0aWMgdm9pZCBydGw4MTY5X3NjaGVkdWxlX3dvcmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgd29ya19mdW5jX3QgdGFzaykKIHsKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlQUkVQQVJFX1dPUksoJnRwLT50YXNrLCB0YXNrLCBkZXYpOworCVBSRVBBUkVfREVMQVlFRF9XT1JLKCZ0cC0+dGFzaywgdGFzayk7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0cC0+dGFzaywgNCk7CiB9CiAKQEAgLTIxNDcsOSArMjE1OCwxMSBAQAogCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgxNjlfcmVpbml0X3Rhc2sodm9pZCAqX2RhdGEpCitzdGF0aWMgdm9pZCBydGw4MTY5X3JlaW5pdF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gX2RhdGE7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSwgdGFzay53b3JrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPmRldjsKIAlpbnQgcmV0OwogCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewpAQCAtMjE3MiwxMCArMjE4NSwxMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcnRsODE2OV9yZXNldF90YXNrKHZvaWQgKl9kYXRhKQorc3RhdGljIHZvaWQgcnRsODE2OV9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gX2RhdGE7Ci0Jc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUsIHRhc2sud29yayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5kZXY7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuOwpAQCAtMjM2OSwxMiArMjM4MywxNyBAQAogCS8qCiAJICogVGhlIHJlY292ZXJ5IHNlcXVlbmNlIGJlbG93IGFkbWl0cyBhIHZlcnkgZWxhYm9yYXRlZCBleHBsYW5hdGlvbjoKIAkgKiAtIGl0IHNlZW1zIHRvIHdvcms7Ci0JICogLSBJIGRpZCBub3Qgc2VlIHdoYXQgZWxzZSBjb3VsZCBiZSBkb25lLgorCSAqIC0gSSBkaWQgbm90IHNlZSB3aGF0IGVsc2UgY291bGQgYmUgZG9uZTsKKwkgKiAtIGl0IG1ha2VzIGlvcDN4eCBoYXBweS4KIAkgKgogCSAqIEZlZWwgZnJlZSB0byBhZGp1c3QgdG8geW91ciBuZWVkcy4KIAkgKi8KLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsCi0JCQkgICAgICBwY2lfY21kIHwgUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX1BBUklUWSk7CisJaWYgKGlnbm9yZV9wYXJpdHlfZXJyKQorCQlwY2lfY21kICY9IH5QQ0lfQ09NTUFORF9QQVJJVFk7CisJZWxzZQorCQlwY2lfY21kIHw9IFBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9QQVJJVFk7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jbWQpOwogCiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVEFUVVMsCiAJCXBjaV9zdGF0dXMgJiAoUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgfApAQCAtMjM4OCwxMCArMjQwNywxMSBAQAogCQl0cC0+Y3BfY21kICY9IH5QQ0lEQUM7CiAJCVJUTF9XMTYoQ1BsdXNDbWQsIHRwLT5jcF9jbWQpOwogCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hJR0hETUE7Ci0JCXJ0bDgxNjlfc2NoZWR1bGVfd29yayhkZXYsIHJ0bDgxNjlfcmVpbml0X3Rhc2spOwogCX0KIAogCXJ0bDgxNjlfaHdfcmVzZXQoaW9hZGRyKTsKKworCXJ0bDgxNjlfc2NoZWR1bGVfd29yayhkZXYsIHJ0bDgxNjlfcmVpbml0X3Rhc2spOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjQ3MSw3ICsyNDkxLDcgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9zaXplICsgYWxpZ24pOwogCQlpZiAoc2tiKSB7Ci0JCQlza2JfcmVzZXJ2ZShza2IsIGFsaWduKTsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgKGFsaWduIC0gMSkgJiAodTMyKXNrYi0+ZGF0YSk7CiAJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc2tfYnVmZlswXS0+ZGF0YSwgcGt0X3NpemUsIDApOwogCQkJKnNrX2J1ZmYgPSBza2I7CiAJCQlydGw4MTY5X21hcmtfdG9fYXNpYyhkZXNjLCByeF9idWZfc3opOwpAQCAtMjcwMCw2ICsyNzIwLDcgQEAKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOwogCXVuc2lnbmVkIGludCBwb2xsX2xvY2tlZCA9IDA7CisJdW5zaWduZWQgaW50IGludHJtYXNrOwogCiAJcnRsODE2OV9kZWxldGVfdGltZXIoZGV2KTsKIApAQCAtMjczOCw4ICsyNzU5LDExIEBACiAJICogMikgZGV2LT5jaGFuZ2VfbXR1CiAJICogICAgLT4gcnRsODE2OV9wb2xsIGNhbiBub3QgYmUgaXNzdWVkIGFnYWluIGFuZCByZS1lbmFibGUgdGhlCiAJICogICAgICAgaW50ZXJydXB0aW9ucy4gTGV0J3Mgc2ltcGx5IGlzc3VlIHRoZSBJUlEgZG93biBzZXF1ZW5jZSBhZ2Fpbi4KKwkgKgorCSAqIE5vIGxvb3AgaWYgaG90cGx1Z2VkIG9yIG1ham9yIGVycm9yICgweGZmZmYpLgogCSAqLwotCWlmIChSVExfUjE2KEludHJNYXNrKSkKKwlpbnRybWFzayA9IFJUTF9SMTYoSW50ck1hc2spOworCWlmIChpbnRybWFzayAmJiAoaW50cm1hc2sgIT0gMHhmZmZmKSkKIAkJZ290byBjb3JlX2Rvd247CiAKIAlydGw4MTY5X3R4X2NsZWFyKHRwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwppbmRleCBhMjMxYWI3Li4yNTBjZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmMKKysrIGIvZHJpdmVycy9uZXQvczJpby5jCkBAIC01ODcyLDkgKzU4NzIsOSBAQAogICogRGVzY3JpcHRpb246IFNldHMgdGhlIGxpbmsgc3RhdHVzIGZvciB0aGUgYWRhcHRlcgogICovCiAKLXN0YXRpYyB2b2lkIHMyaW9fc2V0X2xpbmsodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgczJpb19zZXRfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JbmljX3QgKm5pYyA9IChuaWNfdCAqKSBkYXRhOworCW5pY190ICpuaWMgPSBjb250YWluZXJfb2Yod29yaywgbmljX3QsIHNldF9saW5rX3Rhc2spOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKIAlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOwogCXJlZ2lzdGVyIHU2NCB2YWw2NDsKQEAgLTU5ODUsNiArNTk4NSwxMSBAQAogCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIxX3B0ciA9ICp0ZW1wMTsKIAkJfSBlbHNlIHsKIAkJCSpza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOworCQkJaWYgKCEoKnNrYikpIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBkZXZfYWxsb2Nfc2tiIGZhaWxlZFxuIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQogCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIyX3B0ciA9ICp0ZW1wMiA9CiAJCQkJcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsICgqc2tiKS0+ZGF0YSwKIAkJCQkJICAgICAgIGRldi0+bXR1ICsgNCwKQEAgLTYwMDcsNyArNjAxMiwxMSBAQAogCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIyX3B0ciA9ICp0ZW1wMjsKIAkJfSBlbHNlIHsKIAkJCSpza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOwotCisJCQlpZiAoISgqc2tiKSkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkXG4iLAorCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CiAJCQkoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjBfcHRyID0gKnRlbXAwID0KIAkJCQlwY2lfbWFwX3NpbmdsZShzcC0+cGRldiwgYmEtPmJhXzAsIEJVRjBfTEVOLAogCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTYzNzAsMTAgKzYzNzksMTAgQEAKICAqIHNwaW4gbG9jay4KICAqLwogCi1zdGF0aWMgdm9pZCBzMmlvX3Jlc3RhcnRfbmljKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIHMyaW9fcmVzdGFydF9uaWMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJbmljX3QgKnNwID0gY29udGFpbmVyX29mKHdvcmssIG5pY190LCByc3RfdGltZXJfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7CiAKIAlzMmlvX2NhcmRfZG93bihzcCk7CiAJaWYgKHMyaW9fY2FyZF91cChzcCkpIHsKQEAgLTY5ODMsMTAgKzY5OTIsOCBAQAogCiAJZGV2LT50eF90aW1lb3V0ID0gJnMyaW9fdHhfd2F0Y2hkb2c7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFdBVENIX0RPR19USU1FT1VUOwotCUlOSVRfV09SSygmc3AtPnJzdF90aW1lcl90YXNrLAotCQkgICh2b2lkICgqKSh2b2lkICopKSBzMmlvX3Jlc3RhcnRfbmljLCBkZXYpOwotCUlOSVRfV09SSygmc3AtPnNldF9saW5rX3Rhc2ssCi0JCSAgKHZvaWQgKCopKHZvaWQgKikpIHMyaW9fc2V0X2xpbmssIHNwKTsKKwlJTklUX1dPUksoJnNwLT5yc3RfdGltZXJfdGFzaywgczJpb19yZXN0YXJ0X25pYyk7CisJSU5JVF9XT1JLKCZzcC0+c2V0X2xpbmtfdGFzaywgczJpb19zZXRfbGluayk7CiAKIAlwY2lfc2F2ZV9zdGF0ZShzcC0+cGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uaCBiL2RyaXZlcnMvbmV0L3MyaW8uaAppbmRleCAxMmI3MTlmLi4zYjBiYWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmgKKysrIGIvZHJpdmVycy9uZXQvczJpby5oCkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogc3RhdGljIGlycXJldHVybl90IHMyaW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgaW50IHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UobmljX3QgKnNwLCB1NjQgdmFsNjQsIGludCBmbGFnKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOwotc3RhdGljIHZvaWQgczJpb19zZXRfbGluayh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgczJpb19zZXRfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIGludCBzMmlvX3NldF9zd2FwcGVyKG5pY190ICogc3ApOwogc3RhdGljIHZvaWQgczJpb19jYXJkX2Rvd24obmljX3QgKm5pYyk7CiBzdGF0aWMgaW50IHMyaW9fY2FyZF91cChuaWNfdCAqbmljKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwppbmRleCBkYjIzMjQ5Li4xZWFlMTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCkBAIC0yOTAzLDcgKzI5MDMsNyBAQAogCiAJCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc2JtYWNfc29mdGMpKTsKIAkJaWYgKCFkZXYpCi0JCQlyZXR1cm4gLUVOT01FTTsJLyogcmV0dXJuIEVOT01FTSAqLworCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJcHJpbnRrKEtFUk5fREVCVUcgInNibWFjOiBjb25maWd1cmluZyBNQUMgYXQgJWx4XG4iLCBwb3J0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuYyBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmMKaW5kZXggZDlkMGEzYS4uMGQ2Yzk1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuYworKysgYi9kcml2ZXJzL25ldC9zZWVxODAwNS5jCkBAIC03NTAsNyArNzUwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX25ldGRldihkZXZfc2VlcSk7CiAJcmVsZWFzZV9yZWdpb24oZGV2X3NlZXEtPmJhc2VfYWRkciwgU0VFUTgwMDVfSU9fRVhURU5UKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczE5MC5jIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKaW5kZXggYWFiYTQ1OC4uYjcwZWQ3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2lzMTkwLmMKKysrIGIvZHJpdmVycy9uZXQvc2lzMTkwLmMKQEAgLTI4MCw2ICsyODAsNyBAQAogc3RydWN0IHNpczE5MF9wcml2YXRlIHsKIAl2b2lkIF9faW9tZW0gKm1taW9fYWRkcjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXNwaW5sb2NrX3QgbG9jazsKIAl1MzIgcnhfYnVmX3N6OwpAQCAtODk3LDEwICs4OTgsMTEgQEAKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBzaXMxOTBfcGh5X3Rhc2sodm9pZCAqIGRhdGEpCitzdGF0aWMgdm9pZCBzaXMxOTBfcGh5X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzaXMxOTBfcHJpdmF0ZSAqdHAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNpczE5MF9wcml2YXRlLCBwaHlfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5kZXY7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOwogCWludCBwaHlfaWQgPSB0cC0+bWlpX2lmLnBoeV9pZDsKIAl1MTYgdmFsOwpAQCAtMTA0Nyw3ICsxMDQ5LDcgQEAKIAlpZiAocmMgPCAwKQogCQlnb3RvIGVycl9mcmVlX3J4XzE7CiAKLQlJTklUX1dPUksoJnRwLT5waHlfdGFzaywgc2lzMTkwX3BoeV90YXNrLCBkZXYpOworCUlOSVRfV09SSygmdHAtPnBoeV90YXNrLCBzaXMxOTBfcGh5X3Rhc2spOwogCiAJc2lzMTkwX3JlcXVlc3RfdGltZXIoZGV2KTsKIApAQCAtMTQzNiw2ICsxNDM4LDcgQEAKIAlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwogCiAJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5kZXYgPSBkZXY7CiAJdHAtPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChkZWJ1Zy5tc2dfZW5hYmxlLCBTSVMxOTBfTVNHX0RFRkFVTFQpOwogCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKQEAgLTE3OTgsNyArMTgwMSw3IEBACiAKIAlzaXMxOTBfaW5pdF9yeGZpbHRlcihkZXYpOwogCi0JSU5JVF9XT1JLKCZ0cC0+cGh5X3Rhc2ssIHNpczE5MF9waHlfdGFzaywgZGV2KTsKKwlJTklUX1dPUksoJnRwLT5waHlfdGFzaywgc2lzMTkwX3BoeV90YXNrKTsKIAogCWRldi0+b3BlbiA9IHNpczE5MF9vcGVuOwogCWRldi0+c3RvcCA9IHNpczE5MF9jbG9zZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2Mm5kLmgKaW5kZXggNzc4ZDllNi4uM2ZhNjcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2Mm5kLmgKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2Mm5kLmgKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAvKgogKiogSW50ZXJpbSBkZWZpbml0aW9uIG9mIFNLX0RSVl9USU1FUiBwbGFjZWQgaW4gdGhpcyBmaWxlIHVudGlsIAotKiogY29tbW9uIG1vZHVsZXMgaGF2ZSBib29uIGZpbmFsbGl6ZWQKKyoqIGNvbW1vbiBtb2R1bGVzIGhhdmUgYmVlbiBmaW5hbGl6ZWQKICovCiAjZGVmaW5lIFNLX0RSVl9USU1FUgkJCTExIAogI2RlZmluZQlTS19EUlZfTU9ERVJBVElPTl9USU1FUgkJMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2RpbS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2RpbS5jCmluZGV4IDA3YzFiNGMuLjM3Y2UwM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tkaW0uYworKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZGltLmMKQEAgLTI1Miw3ICsyNTIsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiogRnVuY3Rpb24gICAgIDogU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzCi0qKiBEZXNjcmlwdGlvbiAgOiBEaXNwbGF5cyB0aGUgY3VycmVudCBzZXR0aW5ncyByZWdhcmluZyBpbnRlcnJ1cHQgbW9kZXJhdGlvbgorKiogRGVzY3JpcHRpb24gIDogRGlzcGxheXMgdGhlIGN1cnJlbnQgc2V0dGluZ3MgcmVnYXJkaW5nIGludGVycnVwdCBtb2RlcmF0aW9uCiAqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCiAqKiBMYXN0IE1vZGlmaWVkOiAyMi1tYXItMDMKICoqIFJldHVybnMgICAgICA6IHZvaWQgKCEpCkBAIC01MTAsNyArNTEwLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqIEZ1bmN0aW9uICAgICA6IERpc2FibGVJbnRNb2QoKQotKiogRGVzY3JpcHRpb24gIDogRGlzYmxlcyB0aGUgaW50ZXJydXB0IG1vZGVyYXRpb24gaW5kZXBlbmRlbnQgb2Ygd2hhdCBpbnRlci0KKyoqIERlc2NyaXB0aW9uICA6IERpc2FibGVzIHRoZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpbmRlcGVuZGVudCBvZiB3aGF0IGludGVyLQogKiogICAgICAgICAgICAgICAgcnVwdHMgYXJlIHJ1bm5pbmcgb3Igbm90CiAqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCiAqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tldGh0b29sLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZXRodG9vbC5jCmluZGV4IGU1Y2I1YjUuLjM2NDYwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2V0aHRvb2wuYwpAQCAtNTgxLDYgKzU4MSwzMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGdldFJlZ3NMZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMHg0MDAwOworfQorCisvKgorICogUmV0dXJucyBjb3B5IG9mIHdob2xlIGNvbnRyb2wgcmVnaXN0ZXIgcmVnaW9uCisgKiBOb3RlOiBza2lwIFJBTSBhZGRyZXNzIHJlZ2lzdGVyIGJlY2F1c2UgYWNjZXNzaW5nIGl0IHdpbGwKKyAqIAkgY2F1c2UgYnVzIGhhbmdzIQorICovCitzdGF0aWMgdm9pZCBnZXRSZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCQkgIHZvaWQgKnApCit7CisJREVWX05FVCAqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgdm9pZCBfX2lvbWVtICppbyA9IHBOZXQtPnBBQy0+SW9CYXNlOworCisJcmVncy0+dmVyc2lvbiA9IDE7CisJbWVtc2V0KHAsIDAsIHJlZ3MtPmxlbik7CisJbWVtY3B5X2Zyb21pbyhwLCBpbywgQjNfUkFNX0FERFIpOworCisJbWVtY3B5X2Zyb21pbyhwICsgQjNfUklfV1RPX1IxLCBpbyArIEIzX1JJX1dUT19SMSwKKwkJICAgICAgcmVncy0+bGVuIC0gQjNfUklfV1RPX1IxKTsKK30KKwogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIFNrR2VFdGh0b29sT3BzID0gewogCS5nZXRfc2V0dGluZ3MJCT0gZ2V0U2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSBzZXRTZXR0aW5ncywKQEAgLTU5OSw0ICs2MjMsNiBAQAogCS5zZXRfdHhfY3N1bQkJPSBzZXRUeENzdW0sCiAJLmdldF9yeF9jc3VtCQk9IGdldFJ4Q3N1bSwKIAkuc2V0X3J4X2NzdW0JCT0gc2V0UnhDc3VtLAorCS5nZXRfcmVncwkJPSBnZXRSZWdzLAorCS5nZXRfcmVnc19sZW4JCT0gZ2V0UmVnc0xlbiwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jCmluZGV4IGQ0OTEzYzMuLjkyZDExYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jCkBAIC0xMTMsNiArMTEzLDggQEAKICNpbmNsdWRlCTxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZQk8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlCTxsaW51eC9pcC5oPgorI2luY2x1ZGUJPGxpbnV4L21paS5oPgorI2luY2x1ZGUJPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlCSJoL3NrZHJ2MXN0LmgiCiAjaW5jbHVkZQkiaC9za2RydjJuZC5oIgpAQCAtMTU2MSw3ICsxNTYzLDcgQEAKIAogCWlmIChwTWVzc2FnZS0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJdTE2IGhkcmxlbiA9IHBNZXNzYWdlLT5oLnJhdyAtIHBNZXNzYWdlLT5kYXRhOwotCQl1MTYgb2Zmc2V0ID0gaGRybGVuICsgcE1lc3NhZ2UtPmNzdW07CisJCXUxNiBvZmZzZXQgPSBoZHJsZW4gKyBwTWVzc2FnZS0+Y3N1bV9vZmZzZXQ7CiAKIAkJaWYgKChwTWVzc2FnZS0+aC5pcGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFAgKSAmJgogCQkJKHBBQy0+R0luaS5HSUNoaXBSZXYgPT0gMCkgJiYKQEAgLTE2ODAsNyArMTY4Miw3IEBACiAJKi8KIAlpZiAocE1lc3NhZ2UtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CiAJCXUxNiBoZHJsZW4gPSBwTWVzc2FnZS0+aC5yYXcgLSBwTWVzc2FnZS0+ZGF0YTsKLQkJdTE2IG9mZnNldCA9IGhkcmxlbiArIHBNZXNzYWdlLT5jc3VtOworCQl1MTYgb2Zmc2V0ID0gaGRybGVuICsgcE1lc3NhZ2UtPmNzdW1fb2Zmc2V0OwogCiAJCUNvbnRyb2wgPSBCTVVfU1RGV0Q7CiAKQEAgLTI4NDMsNiArMjg0NSw1NiBAQAogCXJldHVybigmcEFDLT5zdGF0cyk7CiB9IC8qIFNrR2VTdGF0cyAqLwogCisvKgorICogQmFzaWMgTUlJIHJlZ2lzdGVyIGFjY2VzcworICovCitzdGF0aWMgaW50IFNrR2VNaWlJb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhLCBpbnQgY21kKQoreworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCVNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisJU0tfSU9DIElvQyA9IHBBQy0+SW9CYXNlOworCWludCBQb3J0ID0gcE5ldC0+UG9ydE5yOworCVNLX0dFUE9SVCAqcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisJdW5zaWduZWQgbG9uZyBGbGFnczsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmVnID0gZGF0YS0+cmVnX251bSAmIDB4MWY7CisJU0tfVTE2IHZhbCA9IGRhdGEtPnZhbF9pbjsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsJLyogUGh5IHN0aWxsIGluIHJlc2V0ICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToKKwkJZGF0YS0+cGh5X2lkID0gcFBydC0+UGh5QWRkcjsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgU0lPQ0dNSUlSRUc6CisJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKQorCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIHJlZywgJnZhbCk7CisJCWVsc2UKKwkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCByZWcsICZ2YWwpOworCisJCWRhdGEtPnZhbF9vdXQgPSB2YWw7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU01JSVJFRzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJZXJyID0gLUVQRVJNOworCisJCWVsc2UgaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpCisJCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIHJlZywgdmFsKTsKKwkJZWxzZQorCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCByZWcsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCX0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI4NzYsNiArMjkyOCw5IEBACiAJcE5ldCA9IG5ldGRldl9wcml2KGRldik7CiAJcEFDID0gcE5ldC0+cEFDOwogCQorCWlmIChjbWQgPT0gU0lPQ0dNSUlQSFkgfHwgY21kID09IFNJT0NTTUlJUkVHIHx8IGNtZCA9PSBTSU9DR01JSVJFRykKKwkgICAgcmV0dXJuIFNrR2VNaWlJb2N0bChkZXYsIGlmX21paShycSksIGNtZCk7CisKIAlpZihjb3B5X2Zyb21fdXNlcigmSW9jdGwsIHJxLT5pZnJfZGF0YSwgc2l6ZW9mKFNLX0dFX0lPQ1RMKSkpIHsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlc2lycS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlc2lycS5jCmluZGV4IGFiNjZkODAuLjNlN2FhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXNpcnEuYworKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2VzaXJxLmMKQEAgLTEzMTksNyArMTMxOSw3IEBACiAJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0lOVF9TVEFULCAmSXNyYyk7CiAKICNpZmRlZiB4REVCVUcKLQlpZiAoKElzcmMgJiB+KFBIWV9CX0lTX0hDVCB8IFBIWV9CX0lTX0xDVCkgPT0KKwlpZiAoKElzcmMgJiB+KFBIWV9CX0lTX0hDVCB8IFBIWV9CX0lTX0xDVCkpID09CiAJCShQSFlfQl9JU19TQ1JfU19FUiB8IFBIWV9CX0lTX1JSU19DSEFOR0UgfCBQSFlfQl9JU19MUlNfQ0hBTkdFKSkgewogCiAJCVNLX1UzMglTdGF0MSwgU3RhdDIsIFN0YXQzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tnZS5jIGIvZHJpdmVycy9uZXQvc2tnZS5jCmluZGV4IGU3ZTQxNDkuLjhhMzkzNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9za2dlLmMKQEAgLTExLDggKzExLDcgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCkBAIC03NTAsNyArNzQ5LDcgQEAKIAlzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplOwogCWludCBpOwogCi0JcmluZy0+c3RhcnQgPSBrY2FsbG9jKHNpemVvZigqZSksIHJpbmctPmNvdW50LCBHRlBfS0VSTkVMKTsKKwlyaW5nLT5zdGFydCA9IGtjYWxsb2MocmluZy0+Y291bnQsIHNpemVvZigqZSksIEdGUF9LRVJORUwpOwogCWlmICghcmluZy0+c3RhcnQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMzI4LDEwICsxMzI3LDExIEBACiAgKiBTaW5jZSBpbnRlcm5hbCBQSFkgaXMgd2lyZWQgdG8gYSBsZXZlbCB0cmlnZ2VyZWQgcGluLCBjYW4ndAogICogZ2V0IGFuIGludGVycnVwdCB3aGVuIGNhcnJpZXIgaXMgZGV0ZWN0ZWQuCiAgKi8KLXN0YXRpYyB2b2lkIHhtX2xpbmtfdGltZXIodm9pZCAqYXJnKQorc3RhdGljIHZvaWQgeG1fbGlua190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFyZzsKLQlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoYXJnKTsKKwlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBza2dlX3BvcnQsIGxpbmtfdGhyZWFkLndvcmspOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2dlLT5uZXRkZXY7CiAgCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OwogCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKIApAQCAtMjE1NSw4ICsyMTU1LDYgQEAKIAlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CiAJdTE2IGN0cmw7CiAKLQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCAwKTsKLQogCWN0cmwgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKTsKIAljdHJsICY9IH4oR01fR1BDUl9SWF9FTkEgfCBHTV9HUENSX1RYX0VOQSk7CiAJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIGN0cmwpOwpAQCAtMjE2OCw3ICsyMTY2LDYgQEAKIAkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwgY3RybCk7CiAJfQogCi0JeXVrb25fcmVzZXQoaHcsIHBvcnQpOwogCXNrZ2VfbGlua19kb3duKHNrZ2UpOwogCiAJeXVrb25faW5pdChodywgcG9ydCk7CkBAIC0yMjU2LDYgKzIyNTMsNyBAQAogewogCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OwogCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltwb3J0XTsKIAogCW5ldGlmX3N0b3BfcXVldWUoc2tnZS0+bmV0ZGV2KTsKIAluZXRpZl9jYXJyaWVyX29mZihza2dlLT5uZXRkZXYpOwpAQCAtMjI2OSw2ICsyMjY3LDggQEAKIAkJeXVrb25faW5pdChodywgcG9ydCk7CiAJfQogCW11dGV4X3VubG9jaygmaHctPnBoeV9tdXRleCk7CisKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdChkZXYpOwogfQogCiAvKiBCYXNpYyBNSUkgc3VwcG9ydCAqLwpAQCAtMjU2Niw3ICsyNTY2LDcgQEAKIAogCQl0ZC0+Y3N1bV9vZmZzID0gMDsKIAkJdGQtPmNzdW1fc3RhcnQgPSBvZmZzZXQ7Ci0JCXRkLT5jc3VtX3dyaXRlID0gb2Zmc2V0ICsgc2tiLT5jc3VtOworCQl0ZC0+Y3N1bV93cml0ZSA9IG9mZnNldCArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJfSBlbHNlCiAJCWNvbnRyb2wgPSBCTVVfQ0hFQ0s7CiAKQEAgLTMwNzMsOSArMzA3Myw5IEBACiAgKiBiZWNhdXNlIGFjY2Vzc2luZyBwaHkgcmVnaXN0ZXJzIHJlcXVpcmVzIHNwaW4gd2FpdCB3aGljaCBtaWdodAogICogY2F1c2UgZXhjZXNzIGludGVycnVwdCBsYXRlbmN5LgogICovCi1zdGF0aWMgdm9pZCBza2dlX2V4dGlycSh2b2lkICphcmcpCitzdGF0aWMgdm9pZCBza2dlX2V4dGlycShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNrZ2VfaHcgKmh3ID0gYXJnOworCXN0cnVjdCBza2dlX2h3ICpodyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2tnZV9odywgcGh5X3dvcmspOwogCWludCBwb3J0OwogCiAJbXV0ZXhfbG9jaygmaHctPnBoeV9tdXRleCk7CkBAIC0zNDU3LDcgKzM0NTcsNyBAQAogCXNrZ2UtPnBvcnQgPSBwb3J0OwogCiAJLyogT25seSB1c2VkIGZvciBHZW5lc2lzIFhNQUMgKi8KLQlJTklUX1dPUksoJnNrZ2UtPmxpbmtfdGhyZWFkLCB4bV9saW5rX3RpbWVyLCBkZXYpOworCUlOSVRfREVMQVlFRF9XT1JLKCZza2dlLT5saW5rX3RocmVhZCwgeG1fbGlua190aW1lcik7CiAKIAlpZiAoaHctPmNoaXBfaWQgIT0gQ0hJUF9JRF9HRU5FU0lTKSB7CiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRzsKQEAgLTM1NDQsNyArMzU0NCw3IEBACiAKIAlody0+cGRldiA9IHBkZXY7CiAJbXV0ZXhfaW5pdCgmaHctPnBoeV9tdXRleCk7Ci0JSU5JVF9XT1JLKCZody0+cGh5X3dvcmssIHNrZ2VfZXh0aXJxLCBodyk7CisJSU5JVF9XT1JLKCZody0+cGh5X3dvcmssIHNrZ2VfZXh0aXJxKTsKIAlzcGluX2xvY2tfaW5pdCgmaHctPmh3X2xvY2spOwogCiAJaHctPnJlZ3MgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCAweDQwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tnZS5oIGIvZHJpdmVycy9uZXQvc2tnZS5oCmluZGV4IDUzN2MwYWEuLmY2MjIzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZ2UuaAorKysgYi9kcml2ZXJzL25ldC9za2dlLmgKQEAgLTM4OSwxMCArMzg5LDEwIEBACiAvKiBQYWNrZXQgQXJiaXRlciBSZWdpc3RlcnMgKi8KIC8qCUIzX1BBX0NUUkwJCTE2IGJpdAlQYWNrZXQgQXJiaXRlciBDdHJsIFJlZ2lzdGVyICovCiBlbnVtIHsKLQlQQV9DTFJfVE9fVFgyCT0gMTw8MTMsCS8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBUWDIgKi8KLQlQQV9DTFJfVE9fVFgxCT0gMTw8MTIsCS8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBUWDEgKi8KLQlQQV9DTFJfVE9fUlgyCT0gMTw8MTEsCS8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBSWDIgKi8KLQlQQV9DTFJfVE9fUlgxCT0gMTw8MTAsCS8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBSWDEgKi8KKwlQQV9DTFJfVE9fVFgyCT0gMTw8MTMsLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFRYMiAqLworCVBBX0NMUl9UT19UWDEJPSAxPDwxMiwvKiBDbGVhciBJUlEgUGFja2V0IFRpbWVvdXQgVFgxICovCisJUEFfQ0xSX1RPX1JYMgk9IDE8PDExLC8qIENsZWFyIElSUSBQYWNrZXQgVGltZW91dCBSWDIgKi8KKwlQQV9DTFJfVE9fUlgxCT0gMTw8MTAsLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFJYMSAqLwogCVBBX0VOQV9UT19UWDIJPSAxPDw5LAkvKiBFbmFibGUgIFRpbWVvdXQgVGltZXIgVFgyICovCiAJUEFfRElTX1RPX1RYMgk9IDE8PDgsCS8qIERpc2FibGUgVGltZW91dCBUaW1lciBUWDIgKi8KIAlQQV9FTkFfVE9fVFgxCT0gMTw8NywJLyogRW5hYmxlICBUaW1lb3V0IFRpbWVyIFRYMSAqLwpAQCAtNDgxLDE0ICs0ODEsMTQgQEAKIC8qIFJBTSBCdWZmZXIgUmVnaXN0ZXIgT2Zmc2V0cyAqLwogZW51bSB7CiAKLQlSQl9TVEFSVAk9IDB4MDAsLyogMzIgYml0CVJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworCVJCX1NUQVJUPSAweDAwLC8qIDMyIGJpdAlSQU0gQnVmZmVyIFN0YXJ0IEFkZHJlc3MgKi8KIAlSQl9FTkQJPSAweDA0LC8qIDMyIGJpdAlSQU0gQnVmZmVyIEVuZCBBZGRyZXNzICovCiAJUkJfV1AJPSAweDA4LC8qIDMyIGJpdAlSQU0gQnVmZmVyIFdyaXRlIFBvaW50ZXIgKi8KIAlSQl9SUAk9IDB4MGMsLyogMzIgYml0CVJBTSBCdWZmZXIgUmVhZCBQb2ludGVyICovCi0JUkJfUlhfVVRQUAk9IDB4MTAsLyogMzIgYml0CVJ4IFVwcGVyIFRocmVzaG9sZCwgUGF1c2UgUGFja2V0ICovCi0JUkJfUlhfTFRQUAk9IDB4MTQsLyogMzIgYml0CVJ4IExvd2VyIFRocmVzaG9sZCwgUGF1c2UgUGFja2V0ICovCi0JUkJfUlhfVVRIUAk9IDB4MTgsLyogMzIgYml0CVJ4IFVwcGVyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCi0JUkJfUlhfTFRIUAk9IDB4MWMsLyogMzIgYml0CVJ4IExvd2VyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisJUkJfUlhfVVRQUD0gMHgxMCwvKiAzMiBiaXQJUnggVXBwZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrZXQgKi8KKwlSQl9SWF9MVFBQPSAweDE0LC8qIDMyIGJpdAlSeCBMb3dlciBUaHJlc2hvbGQsIFBhdXNlIFBhY2tldCAqLworCVJCX1JYX1VUSFA9IDB4MTgsLyogMzIgYml0CVJ4IFVwcGVyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisJUkJfUlhfTFRIUD0gMHgxYywvKiAzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBIaWdoIFByaW8gKi8KIAkvKiAweDEwIC0gMHgxZjoJcmVzZXJ2ZWQgYXQgVHggUkFNIEJ1ZmZlciBSZWdpc3RlcnMgKi8KIAlSQl9QQwk9IDB4MjAsLyogMzIgYml0CVJBTSBCdWZmZXIgUGFja2V0IENvdW50ZXIgKi8KIAlSQl9MRVYJPSAweDI0LC8qIDMyIGJpdAlSQU0gQnVmZmVyIExldmVsIFJlZ2lzdGVyICovCkBAIC01MzIsNyArNTMyLDcgQEAKIAlQSFlfQUREUl9NQVJWCT0gMCwKIH07CiAKLSNkZWZpbmUgUkJfQUREUihvZmZzLCBxdWV1ZSkgKEIxNl9SQU1fUkVHUyArIChxdWV1ZSkgKyAob2ZmcykpCisjZGVmaW5lIFJCX0FERFIob2ZmcywgcXVldWUpICgodTE2KUIxNl9SQU1fUkVHUyArICh1MTYpKHF1ZXVlKSArIChvZmZzKSkKIAogLyogUmVjZWl2ZSBNQUMgRklGTywgUmVjZWl2ZSBMRUQsIGFuZCBMaW5rX1N5bmMgcmVncyAoR0VORVNJUyBvbmx5KSAqLwogZW51bSB7CkBAIC01NzgsMTUgKzU3OCwxNSBAQAogCU1GRl9ESVNfVElTVAk9IDE8PDIsCS8qIERpc2FibGUgVGltZSBTdGFtcCBHZW5lciAqLwogCU1GRl9DTFJfSU5USVNUCT0gMTw8MSwJLyogQ2xlYXIgSVJRIE5vIFRpbWUgU3RhbXAgKi8KIAlNRkZfQ0xSX0lOU1RBVAk9IDE8PDAsCS8qIENsZWFyIElSUSBObyBTdGF0dXMgKi8KLSNkZWZpbmUgTUZGX1JYX0NUUkxfREVGIE1GRl9FTkFfVElNX1BBVAorCU1GRl9SWF9DVFJMX0RFRiA9IE1GRl9FTkFfVElNX1BBVCwKIH07CiAKIC8qCVRYX01GRl9DVFJMMQkxNiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gQ29udHJvbCBSZWcgMSAqLwogZW51bSB7Ci0JTUZGX0NMUl9QRVJSCT0gMTw8MTUsCS8qIENsZWFyIFBhcml0eSBFcnJvciBJUlEgKi8KLQkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLwotCU1GRl9FTkFfUEtUX1JFQwk9IDE8PDEzLAkvKiBFbmFibGUgIFBhY2tldCBSZWNvdmVyeSAqLwotCU1GRl9ESVNfUEtUX1JFQwk9IDE8PDEyLAkvKiBEaXNhYmxlIFBhY2tldCBSZWNvdmVyeSAqLworCU1GRl9DTFJfUEVSUgk9IDE8PDE1LCAvKiBDbGVhciBQYXJpdHkgRXJyb3IgSVJRICovCisKKwlNRkZfRU5BX1BLVF9SRUMJPSAxPDwxMywgLyogRW5hYmxlICBQYWNrZXQgUmVjb3ZlcnkgKi8KKwlNRkZfRElTX1BLVF9SRUMJPSAxPDwxMiwgLyogRGlzYWJsZSBQYWNrZXQgUmVjb3ZlcnkgKi8KIAogCU1GRl9FTkFfVzRFCT0gMTw8NywJLyogRW5hYmxlICBXYWl0IGZvciBFbXB0eSAqLwogCU1GRl9ESVNfVzRFCT0gMTw8NiwJLyogRGlzYWJsZSBXYWl0IGZvciBFbXB0eSAqLwpAQCAtNTk1LDkgKzU5NSwxMCBAQAogCU1GRl9ESVNfTE9PUEIJPSAxPDwyLAkvKiBEaXNhYmxlIExvb3BiYWNrICovCiAJTUZGX0NMUl9NQUNfUlNUCT0gMTw8MSwJLyogQ2xlYXIgWE1BQyBSZXNldCAqLwogCU1GRl9TRVRfTUFDX1JTVAk9IDE8PDAsCS8qIFNldCAgIFhNQUMgUmVzZXQgKi8KKworCU1GRl9UWF9DVFJMX0RFRgkgPSBNRkZfRU5BX1BLVF9SRUMgfCAodTE2KSBNRkZfRU5BX1RJTV9QQVQgfCBNRkZfRU5BX0ZMVVNILAogfTsKIAotI2RlZmluZSBNRkZfVFhfQ1RSTF9ERUYJKE1GRl9FTkFfUEtUX1JFQyB8IE1GRl9FTkFfVElNX1BBVCB8IE1GRl9FTkFfRkxVU0gpCiAKIC8qCVJYX01GRl9UU1QyCSAJIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gVGVzdCBSZWdpc3RlciAyICovCiAvKglUWF9NRkZfVFNUMgkgCSA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBUZXN0IFJlZ2lzdGVyIDIgKi8KQEAgLTEzMDQsOCArMTMwNSw4IEBACiAKIC8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwMTFTIG9ubHkpICovCiBlbnVtIHsKLQlQSFlfTV9BTl9BU1BfWAk9IDE8PDgsIC8qIEFzeW1tZXRyaWMgUGF1c2UgKi8KLQlQSFlfTV9BTl9QQ19YCT0gMTw8NywgLyogTUFDIFBhdXNlIGltcGxlbWVudGVkICovCisJUEhZX01fQU5fQVNQX1gJCT0gMTw8OCwgLyogQXN5bW1ldHJpYyBQYXVzZSAqLworCVBIWV9NX0FOX1BDX1gJCT0gMTw8NywgLyogTUFDIFBhdXNlIGltcGxlbWVudGVkICovCiAJUEhZX01fQU5fMTAwMFhfQUhECT0gMTw8NiwgLyogQWR2ZXJ0aXNlIDEwMDAwQmFzZS1YIEhhbGYgRHVwbGV4ICovCiAJUEhZX01fQU5fMTAwMFhfQUZECT0gMTw8NSwgLyogQWR2ZXJ0aXNlIDEwMDAwQmFzZS1YIEZ1bGwgRHVwbGV4ICovCiB9OwpAQCAtMTMyMCw3ICsxMzIxLDcgQEAKIAogLyoqKioqICBQSFlfTUFSVl8xMDAwVF9DVFJMCTE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqKioqKi8KIGVudW0gewotCVBIWV9NXzEwMDBDX1RFU1QJPSA3PDwxMywvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisJUEhZX01fMTAwMENfVEVTVD0gNzw8MTMsLyogQml0IDE1Li4xMzoJVGVzdCBNb2RlcyAqLwogCVBIWV9NXzEwMDBDX01TRQk9IDE8PDEyLCAvKiBNYW51YWwgTWFzdGVyL1NsYXZlIEVuYWJsZSAqLwogCVBIWV9NXzEwMDBDX01TQwk9IDE8PDExLCAvKiBNL1MgQ29uZmlndXJhdGlvbiAoMT1NYXN0ZXIpICovCiAJUEhZX01fMTAwMENfTVBECT0gMTw8MTAsIC8qIE11bHRpLVBvcnQgRGV2aWNlICovCkBAIC0xMzQ5LDcgKzEzNTAsNyBAQAogCVBIWV9NX1BDX0VOX0RFVF9QTFVTCT0gMzw8OCwgLyogRW5lcmd5IERldGVjdCBQbHVzIChNb2RlIDIpICovCiB9OwogCi0jZGVmaW5lIFBIWV9NX1BDX01ESV9YTU9ERSh4KQkoKCh4KTw8NSkgJiBQSFlfTV9QQ19NRElYX01TSykKKyNkZWZpbmUgUEhZX01fUENfTURJX1hNT0RFKHgpCSgoKCh1MTYpKHgpPDw1KSAmIFBIWV9NX1BDX01ESVhfTVNLKQogCiBlbnVtIHsKIAlQSFlfTV9QQ19NQU5fTURJCT0gMCwgLyogMDAgPSBNYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTE0MzIsMjQgKzE0MzMsMjQgQEAKIAlQSFlfTV9FQ19ESVNfTElOS19QID0gMTw8MTIsIC8qIERpc2FibGUgTGluayBQdWxzZXMgKDg4RTExMTEgb25seSkgKi8KIAlQSFlfTV9FQ19NX0RTQ19NU0sgID0gMzw8MTAsIC8qIEJpdCAxMS4uMTA6CU1hc3RlciBEb3duc2hpZnQgQ291bnRlciAqLwogCQkJCQkvKiAoODhFMTAxMSBvbmx5KSAqLwotCVBIWV9NX0VDX1NfRFNDX01TSwk9IDM8PDgsLyogQml0ICA5Li4gODoJU2xhdmUgIERvd25zaGlmdCBDb3VudGVyICovCisJUEhZX01fRUNfU19EU0NfTVNLICA9IDM8PDgsICAvKiBCaXQgIDkuLiA4OglTbGF2ZSAgRG93bnNoaWZ0IENvdW50ZXIgKi8KIAkJCQkgICAgICAgLyogKDg4RTEwMTEgb25seSkgKi8KLQlQSFlfTV9FQ19NX0RTQ19NU0syCT0gNzw8OSwvKiBCaXQgMTEuLiA5OglNYXN0ZXIgRG93bnNoaWZ0IENvdW50ZXIgKi8KKwlQSFlfTV9FQ19NX0RTQ19NU0syICA9IDc8PDksIC8qIEJpdCAxMS4uIDk6CU1hc3RlciBEb3duc2hpZnQgQ291bnRlciAqLwogCQkJCQkvKiAoODhFMTExMSBvbmx5KSAqLwotCVBIWV9NX0VDX0RPV05fU19FTkEJPSAxPDw4LCAvKiBEb3duc2hpZnQgRW5hYmxlICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fRUNfRE9XTl9TX0VOQSAgPSAxPDw4LCAvKiBEb3duc2hpZnQgRW5hYmxlICg4OEUxMTExIG9ubHkpICovCiAJCQkJCS8qICEhISBFcnJhdGEgaW4gc3BlYy4gKDEgPSBkaXNhYmxlKSAqLwotCVBIWV9NX0VDX1JYX1RJTV9DVAk9IDE8PDcsIC8qIFJHTUlJIFJ4IFRpbWluZyBDb250cm9sKi8KLQlQSFlfTV9FQ19NQUNfU19NU0sJPSA3PDw0LC8qIEJpdCAgNi4uIDQ6CURlZi4gTUFDIGludGVyZmFjZSBzcGVlZCAqLwotCVBIWV9NX0VDX0ZJQl9BTl9FTkEJPSAxPDwzLCAvKiBGaWJlciBBdXRvLU5lZy4gRW5hYmxlICg4OEUxMDExUyBvbmx5KSAqLwotCVBIWV9NX0VDX0RURV9EX0VOQQk9IDE8PDIsIC8qIERURSBEZXRlY3QgRW5hYmxlICg4OEUxMTExIG9ubHkpICovCi0JUEhZX01fRUNfVFhfVElNX0NUCT0gMTw8MSwgLyogUkdNSUkgVHggVGltaW5nIENvbnRyb2wgKi8KLQlQSFlfTV9FQ19UUkFOU19ESVMJPSAxPDwwLCAvKiBUcmFuc21pdHRlciBEaXNhYmxlICg4OEUxMTExIG9ubHkpICovfTsKKwlQSFlfTV9FQ19SWF9USU1fQ1QgICA9IDE8PDcsIC8qIFJHTUlJIFJ4IFRpbWluZyBDb250cm9sKi8KKwlQSFlfTV9FQ19NQUNfU19NU0sgICA9IDc8PDQsIC8qIEJpdCAgNi4uIDQ6CURlZi4gTUFDIGludGVyZmFjZSBzcGVlZCAqLworCVBIWV9NX0VDX0ZJQl9BTl9FTkEgID0gMTw8MywgLyogRmliZXIgQXV0by1OZWcuIEVuYWJsZSAoODhFMTAxMVMgb25seSkgKi8KKwlQSFlfTV9FQ19EVEVfRF9FTkEgICA9IDE8PDIsIC8qIERURSBEZXRlY3QgRW5hYmxlICg4OEUxMTExIG9ubHkpICovCisJUEhZX01fRUNfVFhfVElNX0NUICAgPSAxPDwxLCAvKiBSR01JSSBUeCBUaW1pbmcgQ29udHJvbCAqLworCVBIWV9NX0VDX1RSQU5TX0RJUyAgID0gMTw8MCwgLyogVHJhbnNtaXR0ZXIgRGlzYWJsZSAoODhFMTExMSBvbmx5KSAqL307CiAKLSNkZWZpbmUgUEhZX01fRUNfTV9EU0MoeCkJKCh4KTw8MTApIC8qIDAwPTF4OyAwMT0yeDsgMTA9M3g7IDExPTR4ICovCi0jZGVmaW5lIFBIWV9NX0VDX1NfRFNDKHgpCSgoeCk8PDgpIC8qIDAwPWRpczsgMDE9MXg7IDEwPTJ4OyAxMT0zeCAqLwotI2RlZmluZSBQSFlfTV9FQ19NQUNfUyh4KQkoKHgpPDw0KSAvKiAwMVg9MDsgMTEwPTIuNTsgMTExPTI1IChNSHopICovCisjZGVmaW5lIFBIWV9NX0VDX01fRFNDKHgpCSgodTE2KSh4KTw8MTApIC8qIDAwPTF4OyAwMT0yeDsgMTA9M3g7IDExPTR4ICovCisjZGVmaW5lIFBIWV9NX0VDX1NfRFNDKHgpCSgodTE2KSh4KTw8OCkgLyogMDA9ZGlzOyAwMT0xeDsgMTA9Mng7IDExPTN4ICovCisjZGVmaW5lIFBIWV9NX0VDX01BQ19TKHgpCSgodTE2KSh4KTw8NCkgLyogMDFYPTA7IDExMD0yLjU7IDExMT0yNSAoTUh6KSAqLwogCi0jZGVmaW5lIFBIWV9NX0VDX01fRFNDXzIoeCkJKCh4KTw8OSkgLyogMDAwPTF4OyAwMDE9Mng7IDAxMD0zeDsgMDExPTR4ICovCisjZGVmaW5lIFBIWV9NX0VDX01fRFNDXzIoeCkJKCh1MTYpKHgpPDw5KSAvKiAwMDA9MXg7IDAwMT0yeDsgMDEwPTN4OyAwMTE9NHggKi8KIAkJCQkJCQkJCQkJLyogMTAwPTV4OyAxMDE9Nng7IDExMD03eDsgMTExPTh4ICovCiBlbnVtIHsKIAlNQUNfVFhfQ0xLXzBfTUhaCT0gMiwKQEAgLTE0NjgsMTAgKzE0NjksMTIgQEAKIAlQSFlfTV9MRURDX0xLX0NfTVNLCT0gNzw8MywvKiBCaXQgIDUuLiAzOiBMaW5rIENvbnRyb2wgTWFzayAqLwogCQkJCQkvKiAoODhFMTExMSBvbmx5KSAqLwogfTsKKyNkZWZpbmUgUEhZX01fTEVEX1BVTFNfRFVSKHgpCSgoKHUxNikoeCk8PDEyKSAmIFBIWV9NX0xFRENfUFVMU19NU0spCisjZGVmaW5lIFBIWV9NX0xFRF9CTElOS19SVCh4KQkoKCh1MTYpKHgpPDw4KSAmIFBIWV9NX0xFRENfQkxfUl9NU0spCiAKIGVudW0gewotCVBIWV9NX0xFRENfTElOS19NU0sJPSAzPDwzLC8qIEJpdCAgNC4uIDM6IExpbmsgQ29udHJvbCBNYXNrICovCi0JCQkJCQkJCQkvKiAoODhFMTAxMSBvbmx5KSAqLworCVBIWV9NX0xFRENfTElOS19NU0sJPSAzPDwzLCAvKiBCaXQgIDQuLiAzOiBMaW5rIENvbnRyb2wgTWFzayAqLworCQkJCQkvKiAoODhFMTAxMSBvbmx5KSAqLwogCVBIWV9NX0xFRENfRFBfQ1RSTAk9IDE8PDIsIC8qIER1cGxleCBDb250cm9sICovCiAJUEhZX01fTEVEQ19EUF9DX01TQgk9IDE8PDIsIC8qIER1cGxleCBDb250cm9sIChNU0IsIDg4RTExMTEgb25seSkgKi8KIAlQSFlfTV9MRURDX1JYX0NUUkwJPSAxPDwxLCAvKiBSeCBBY3Rpdml0eSAvIExpbmsgKi8KQEAgLTE0NzksMjcgKzE0ODIsMjQgQEAKIAlQSFlfTV9MRURDX1RYX0NfTVNCCT0gMTw8MCwgLyogVHggQ29udHJvbCAoTVNCLCA4OEUxMTExIG9ubHkpICovCiB9OwogCi0jZGVmaW5lIFBIWV9NX0xFRF9QVUxTX0RVUih4KQkoKCh4KTw8MTIpICYgUEhZX01fTEVEQ19QVUxTX01TSykKLQogZW51bSB7Ci0JUFVMU19OT19TVFIJPSAwLC8qIG5vIHB1bHNlIHN0cmV0Y2hpbmcgKi8KLQlQVUxTXzIxTVMJPSAxLC8qIDIxIG1zIHRvIDQyIG1zICovCi0JUFVMU180Mk1TCT0gMiwvKiA0MiBtcyB0byA4NCBtcyAqLwotCVBVTFNfODRNUwk9IDMsLyogODQgbXMgdG8gMTcwIG1zICovCi0JUFVMU18xNzBNUwk9IDQsLyogMTcwIG1zIHRvIDM0MCBtcyAqLwotCVBVTFNfMzQwTVMJPSA1LC8qIDM0MCBtcyB0byA2NzAgbXMgKi8KLQlQVUxTXzY3ME1TCT0gNiwvKiA2NzAgbXMgdG8gMS4zIHMgKi8KLQlQVUxTXzEzMDBNUwk9IDcsLyogMS4zIHMgdG8gMi43IHMgKi8KKwlQVUxTX05PX1NUUgk9IDAsIC8qIG5vIHB1bHNlIHN0cmV0Y2hpbmcgKi8KKwlQVUxTXzIxTVMJPSAxLCAvKiAyMSBtcyB0byA0MiBtcyAqLworCVBVTFNfNDJNUwk9IDIsIC8qIDQyIG1zIHRvIDg0IG1zICovCisJUFVMU184NE1TCT0gMywgLyogODQgbXMgdG8gMTcwIG1zICovCisJUFVMU18xNzBNUwk9IDQsIC8qIDE3MCBtcyB0byAzNDAgbXMgKi8KKwlQVUxTXzM0ME1TCT0gNSwgLyogMzQwIG1zIHRvIDY3MCBtcyAqLworCVBVTFNfNjcwTVMJPSA2LCAvKiA2NzAgbXMgdG8gMS4zIHMgKi8KKwlQVUxTXzEzMDBNUwk9IDcsIC8qIDEuMyBzIHRvIDIuNyBzICovCiB9OwogCi0jZGVmaW5lIFBIWV9NX0xFRF9CTElOS19SVCh4KQkoKCh4KTw8OCkgJiBQSFlfTV9MRURDX0JMX1JfTVNLKQogCiBlbnVtIHsKLQlCTElOS180Mk1TCT0gMCwvKiA0MiBtcyAqLwotCUJMSU5LXzg0TVMJPSAxLC8qIDg0IG1zICovCi0JQkxJTktfMTcwTVMJPSAyLC8qIDE3MCBtcyAqLwotCUJMSU5LXzM0ME1TCT0gMywvKiAzNDAgbXMgKi8KLQlCTElOS182NzBNUwk9IDQsLyogNjcwIG1zICovCisJQkxJTktfNDJNUwk9IDAsIC8qIDQyIG1zICovCisJQkxJTktfODRNUwk9IDEsIC8qIDg0IG1zICovCisJQkxJTktfMTcwTVMJPSAyLCAvKiAxNzAgbXMgKi8KKwlCTElOS18zNDBNUwk9IDMsIC8qIDM0MCBtcyAqLworCUJMSU5LXzY3ME1TCT0gNCwgLyogNjcwIG1zICovCiB9OwogCiAvKioqKiogIFBIWV9NQVJWX0xFRF9PVkVSCTE2IGJpdCByL3cJTWFudWFsIExFRCBPdmVycmlkZSBSZWcgKioqKiovCkBAIC0xNTI1LDcgKzE1MjUsNyBAQAogCVBIWV9NX0VDMl9GT19JTVBFRAk9IDE8PDUsIC8qIEZpYmVyIE91dHB1dCBJbXBlZGFuY2UgKi8KIAlQSFlfTV9FQzJfRk9fTV9DTEsJPSAxPDw0LCAvKiBGaWJlciBNb2RlIENsb2NrIEVuYWJsZSAqLwogCVBIWV9NX0VDMl9GT19CT09TVAk9IDE8PDMsIC8qIEZpYmVyIE91dHB1dCBCb29zdCAqLwotCVBIWV9NX0VDMl9GT19BTV9NU0sJPSA3LC8qIEJpdCAgMi4uIDA6CUZpYmVyIE91dHB1dCBBbXBsaXR1ZGUgKi8KKwlQSFlfTV9FQzJfRk9fQU1fTVNLCT0gNywgLyogQml0ICAyLi4gMDoJRmliZXIgT3V0cHV0IEFtcGxpdHVkZSAqLwogfTsKIAogLyoqKioqICBQSFlfTUFSVl9FWFRfUF9TVEFUIDE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgU3RhdHVzICoqKioqLwpAQCAtMTU1MCw3ICsxNTUwLDcgQEAKIAlQSFlfTV9DQUJEX0RJU19XQUlUCT0gMTw8MTUsIC8qIERpc2FibGUgV2FpdGluZyBQZXJpb2QgKFBhZ2UgMSkgKi8KIAkJCQkJLyogKDg4RTExMTEgb25seSkgKi8KIAlQSFlfTV9DQUJEX1NUQVRfTVNLCT0gMzw8MTMsIC8qIEJpdCAxNC4uMTM6IFN0YXR1cyBNYXNrICovCi0JUEhZX01fQ0FCRF9BTVBMX01TSwk9IDB4MWY8PDgsLyogQml0IDEyLi4gODogQW1wbGl0dWRlIE1hc2sgKi8KKwlQSFlfTV9DQUJEX0FNUExfTVNLCT0gMHgxZjw8OCwgLyogQml0IDEyLi4gODogQW1wbGl0dWRlIE1hc2sgKi8KIAkJCQkJLyogKDg4RTExMTEgb25seSkgKi8KIAlQSFlfTV9DQUJEX0RJU1RfTVNLCT0gMHhmZiwgLyogQml0ICA3Li4gMDogRGlzdGFuY2UgTWFzayAqLwogfTsKQEAgLTE2MDUsOSArMTYwNSw5IEBACiAKIC8qKioqKiAgUEhZX01BUlZfUEhZX0NUUkwgKHBhZ2UgMykJCTE2IGJpdCByL3cJTEVEIENvbnRyb2wgUmVnLiAqKioqKi8KIGVudW0gewotCVBIWV9NX0xFRENfTE9TX01TSwk9IDB4Zjw8MTIsLyogQml0IDE1Li4xMjogTE9TIExFRCBDdHJsLiBNYXNrICovCisJUEhZX01fTEVEQ19MT1NfTVNLCT0gMHhmPDwxMiwgLyogQml0IDE1Li4xMjogTE9TIExFRCBDdHJsLiBNYXNrICovCiAJUEhZX01fTEVEQ19JTklUX01TSwk9IDB4Zjw8OCwgLyogQml0IDExLi4gODogSU5JVCBMRUQgQ3RybC4gTWFzayAqLwotCVBIWV9NX0xFRENfU1RBMV9NU0sJPSAweGY8PDQsLyogQml0ICA3Li4gNDogU1RBVDEgTEVEIEN0cmwuIE1hc2sgKi8KKwlQSFlfTV9MRURDX1NUQTFfTVNLCT0gMHhmPDw0LCAvKiBCaXQgIDcuLiA0OiBTVEFUMSBMRUQgQ3RybC4gTWFzayAqLwogCVBIWV9NX0xFRENfU1RBMF9NU0sJPSAweGYsIC8qIEJpdCAgMy4uIDA6IFNUQVQwIExFRCBDdHJsLiBNYXNrICovCiB9OwogCkBAIC0xODA0LDggKzE4MDQsOCBAQAogCiAvKglHTV9TTUlfQ1RSTAkJCTE2IGJpdCByL3cJU01JIENvbnRyb2wgUmVnaXN0ZXIgKi8KIGVudW0gewotCUdNX1NNSV9DVF9QSFlfQV9NU0sJPSAweDFmPDwxMSwvKiBCaXQgMTUuLjExOglQSFkgRGV2aWNlIEFkZHJlc3MgKi8KLQlHTV9TTUlfQ1RfUkVHX0FfTVNLCT0gMHgxZjw8NiwvKiBCaXQgMTAuLiA2OglQSFkgUmVnaXN0ZXIgQWRkcmVzcyAqLworCUdNX1NNSV9DVF9QSFlfQV9NU0sJPSAweDFmPDwxMSwgLyogQml0IDE1Li4xMToJUEhZIERldmljZSBBZGRyZXNzICovCisJR01fU01JX0NUX1JFR19BX01TSwk9IDB4MWY8PDYsIC8qIEJpdCAxMC4uIDY6CVBIWSBSZWdpc3RlciBBZGRyZXNzICovCiAJR01fU01JX0NUX09QX1JECQk9IDE8PDUsCS8qIEJpdCAgNToJT3BDb2RlIFJlYWQgKDA9V3JpdGUpKi8KIAlHTV9TTUlfQ1RfUkRfVkFMCT0gMTw8NCwJLyogQml0ICA0OglSZWFkIFZhbGlkIChSZWFkIGNvbXBsZXRlZCkgKi8KIAlHTV9TTUlfQ1RfQlVTWQkJPSAxPDwzLAkvKiBCaXQgIDM6CUJ1c3kgKE9wZXJhdGlvbiBpbiBwcm9ncmVzcykgKi8KQEAgLTE4NzUsOSArMTg3NSw5IEBACiAKIC8qCVRYX0dNRl9DVFJMX1QJMzIgYml0CVR4IEdNQUMgRklGTyBDb250cm9sL1Rlc3QgKi8KIGVudW0gewotCUdNRl9XU1BfVFNUX09OCT0gMTw8MTgsLyogV3JpdGUgU2hhZG93IFBvaW50ZXIgVGVzdCBPbiAqLwotCUdNRl9XU1BfVFNUX09GRgk9IDE8PDE3LC8qIFdyaXRlIFNoYWRvdyBQb2ludGVyIFRlc3QgT2ZmICovCi0JR01GX1dTUF9TVEVQCT0gMTw8MTYsLyogV3JpdGUgU2hhZG93IFBvaW50ZXIgU3RlcC9JbmNyZW1lbnQgKi8KKwlHTUZfV1NQX1RTVF9PTgk9IDE8PDE4LCAvKiBXcml0ZSBTaGFkb3cgUG9pbnRlciBUZXN0IE9uICovCisJR01GX1dTUF9UU1RfT0ZGCT0gMTw8MTcsIC8qIFdyaXRlIFNoYWRvdyBQb2ludGVyIFRlc3QgT2ZmICovCisJR01GX1dTUF9TVEVQCT0gMTw8MTYsIC8qIFdyaXRlIFNoYWRvdyBQb2ludGVyIFN0ZXAvSW5jcmVtZW50ICovCiAKIAlHTUZfQ0xJX1RYX0ZVCT0gMTw8NiwJLyogQ2xlYXIgSVJRIFR4IEZJRk8gVW5kZXJydW4gKi8KIAlHTUZfQ0xJX1RYX0ZDCT0gMTw8NSwJLyogQ2xlYXIgSVJRIFR4IEZyYW1lIENvbXBsZXRlICovCkBAIC0yMTExLDE4ICsyMTExLDE4IEBACiAKIC8qCVhNX01NVV9DTUQJMTYgYml0IHIvdwlNTVUgQ29tbWFuZCBSZWdpc3RlciAqLwogZW51bSB7Ci0JWE1fTU1VX1BIWV9SRFkJPSAxPDwxMiwvKiBCaXQgMTI6CVBIWSBSZWFkIFJlYWR5ICovCi0JWE1fTU1VX1BIWV9CVVNZCT0gMTw8MTEsLyogQml0IDExOglQSFkgQnVzeSAqLwotCVhNX01NVV9JR05fUEYJPSAxPDwxMCwvKiBCaXQgMTA6CUlnbm9yZSBQYXVzZSBGcmFtZSAqLwotCVhNX01NVV9NQUNfTEIJPSAxPDw5LAkvKiBCaXQgIDk6CUVuYWJsZSBNQUMgTG9vcGJhY2sgKi8KLQlYTV9NTVVfRlJDX0NPTAk9IDE8PDcsCS8qIEJpdCAgNzoJRm9yY2UgQ29sbGlzaW9uICovCi0JWE1fTU1VX1NJTV9DT0wJPSAxPDw2LAkvKiBCaXQgIDY6CVNpbXVsYXRlIENvbGxpc2lvbiAqLwotCVhNX01NVV9OT19QUkUJPSAxPDw1LAkvKiBCaXQgIDU6CU5vIE1ESU8gUHJlYW1ibGUgKi8KLQlYTV9NTVVfR01JSV9GRAk9IDE8PDQsCS8qIEJpdCAgNDoJR01JSSB1c2VzIEZ1bGwgRHVwbGV4ICovCi0JWE1fTU1VX1JBVF9DVFJMCT0gMTw8MywJLyogQml0ICAzOglFbmFibGUgUmF0ZSBDb250cm9sICovCi0JWE1fTU1VX0dNSUlfTE9PUD0gMTw8MiwJLyogQml0ICAyOglQSFkgaXMgaW4gTG9vcGJhY2sgTW9kZSAqLwotCVhNX01NVV9FTkFfUlgJPSAxPDwxLAkvKiBCaXQgIDE6CUVuYWJsZSBSZWNlaXZlciAqLwotCVhNX01NVV9FTkFfVFgJPSAxPDwwLAkvKiBCaXQgIDA6CUVuYWJsZSBUcmFuc21pdHRlciAqLworCVhNX01NVV9QSFlfUkRZCT0gMTw8MTIsIC8qIEJpdCAxMjoJUEhZIFJlYWQgUmVhZHkgKi8KKwlYTV9NTVVfUEhZX0JVU1kJPSAxPDwxMSwgLyogQml0IDExOglQSFkgQnVzeSAqLworCVhNX01NVV9JR05fUEYJPSAxPDwxMCwgLyogQml0IDEwOglJZ25vcmUgUGF1c2UgRnJhbWUgKi8KKwlYTV9NTVVfTUFDX0xCCT0gMTw8OSwJIC8qIEJpdCAgOToJRW5hYmxlIE1BQyBMb29wYmFjayAqLworCVhNX01NVV9GUkNfQ09MCT0gMTw8NywJIC8qIEJpdCAgNzoJRm9yY2UgQ29sbGlzaW9uICovCisJWE1fTU1VX1NJTV9DT0wJPSAxPDw2LAkgLyogQml0ICA2OglTaW11bGF0ZSBDb2xsaXNpb24gKi8KKwlYTV9NTVVfTk9fUFJFCT0gMTw8NSwJIC8qIEJpdCAgNToJTm8gTURJTyBQcmVhbWJsZSAqLworCVhNX01NVV9HTUlJX0ZECT0gMTw8NCwJIC8qIEJpdCAgNDoJR01JSSB1c2VzIEZ1bGwgRHVwbGV4ICovCisJWE1fTU1VX1JBVF9DVFJMCT0gMTw8MywJIC8qIEJpdCAgMzoJRW5hYmxlIFJhdGUgQ29udHJvbCAqLworCVhNX01NVV9HTUlJX0xPT1A9IDE8PDIsCSAvKiBCaXQgIDI6CVBIWSBpcyBpbiBMb29wYmFjayBNb2RlICovCisJWE1fTU1VX0VOQV9SWAk9IDE8PDEsCSAvKiBCaXQgIDE6CUVuYWJsZSBSZWNlaXZlciAqLworCVhNX01NVV9FTkFfVFgJPSAxPDwwLAkgLyogQml0ICAwOglFbmFibGUgVHJhbnNtaXR0ZXIgKi8KIH07CiAKIApAQCAtMjQ1Niw3ICsyNDU2LDcgQEAKIAogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKIAotCXN0cnVjdCB3b3JrX3N0cnVjdCAgIGxpbmtfdGhyZWFkOworCXN0cnVjdCBkZWxheWVkX3dvcmsgIGxpbmtfdGhyZWFkOwogCWVudW0gcGF1c2VfY29udHJvbCAgIGZsb3dfY29udHJvbDsKIAllbnVtIHBhdXNlX3N0YXR1cyAgICBmbG93X3N0YXR1czsKIAl1OAkJICAgICByeF9jc3VtOwpAQCAtMjUwNiw3ICsyNTA2LDcgQEAKIH0KIAogLyogTUFDIFJlbGF0ZWQgUmVnaXN0ZXJzIGluc2lkZSB0aGUgZGV2aWNlLiAqLwotI2RlZmluZSBTS19SRUcocG9ydCxyZWcpCSgoKHBvcnQpPDw3KSsocmVnKSkKKyNkZWZpbmUgU0tfUkVHKHBvcnQscmVnKQkoKChwb3J0KTw8NykrKHUxNikocmVnKSkKICNkZWZpbmUgU0tfWE1BQ19SRUcocG9ydCwgcmVnKSBcCiAJKChCQVNFX1hNQUNfMSArIChwb3J0KSAqIChCQVNFX1hNQUNfMiAtIEJBU0VfWE1BQ18xKSkgfCAocmVnKSA8PCAxKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za3kyLmMgYi9kcml2ZXJzL25ldC9za3kyLmMKaW5kZXggYzEwZTdmNS4uZmIxZDJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2t5Mi5jCisrKyBiL2RyaXZlcnMvbmV0L3NreTIuYwpAQCAtMTAsOCArMTAsNyBAQAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKQEAgLTUwLDcgKzQ5LDcgQEAKICNpbmNsdWRlICJza3kyLmgiCiAKICNkZWZpbmUgRFJWX05BTUUJCSJza3kyIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuOSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjEwIgogI2RlZmluZSBQRlgJCQlEUlZfTkFNRSAiICIKIAogLyoKQEAgLTk2LDM3ICs5NSwzNyBAQAogbW9kdWxlX3BhcmFtKGRpc2FibGVfbXNpLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX21zaSwgIkRpc2FibGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHQgKE1TSSkiKTsKIAotc3RhdGljIGludCBpZGxlX3RpbWVvdXQgPSAxMDA7CitzdGF0aWMgaW50IGlkbGVfdGltZW91dCA9IDA7CiBtb2R1bGVfcGFyYW0oaWRsZV90aW1lb3V0LCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpZGxlX3RpbWVvdXQsICJJZGxlIHRpbWVvdXQgd29ya2Fyb3VuZCBmb3IgbG9zdCBpbnRlcnJ1cHRzIChtcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaWRsZV90aW1lb3V0LCAiV2F0Y2hkb2cgdGltZXIgZm9yIGxvc3QgaW50ZXJydXB0cyAobXMpIik7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBza3kyX2lkX3RhYmxlW10gPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgMHg5MDAwKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIDB4OUUwMCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCAweDkwMDApIH0sIC8qIFNLLTlTeHggKi8KKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCAweDlFMDApIH0sIC8qIFNLLTlFeHggKi8KIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgMHg0YjAwKSB9LAkvKiBER0UtNTYwVCAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RMSU5LLCAweDQwMDEpIH0sIAkvKiBER0UtNTUwU1ggKi8KLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNDApIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQxKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM0MikgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNDMpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQ0KSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM0NSkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNDYpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQ3KSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM1MCkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNTEpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzUyKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM1MykgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjApIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYxKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM2MikgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjMpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY0KSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM2NSkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjYpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY3KSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM2OCkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjkpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfRExJTkssIDB4NEIwMikgfSwJLyogREdFLTU2MFNYICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQwKSB9LCAvKiA4OEU4MDIxICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQxKSB9LCAvKiA4OEU4MDIyICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQyKSB9LCAvKiA4OEU4MDYxICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQzKSB9LCAvKiA4OEU4MDYyICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQ0KSB9LCAvKiA4OEU4MDIxICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQ1KSB9LCAvKiA4OEU4MDIyICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQ2KSB9LCAvKiA4OEU4MDYxICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzQ3KSB9LCAvKiA4OEU4MDYyICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzUwKSB9LCAvKiA4OEU4MDM1ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzUxKSB9LCAvKiA4OEU4MDM2ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzUyKSB9LCAvKiA4OEU4MDM4ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzUzKSB9LCAvKiA4OEU4MDM5ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzU2KSB9LCAvKiA4OEVDMDMzICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYwKSB9LCAvKiA4OEU4MDUyICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYxKSB9LCAvKiA4OEU4MDUwICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYyKSB9LCAvKiA4OEU4MDUzICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYzKSB9LCAvKiA4OEU4MDU1ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY0KSB9LCAvKiA4OEU4MDU2ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY2KSB9LCAvKiA4OEVDMDM2ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY3KSB9LCAvKiA4OEVDMDMyICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY4KSB9LCAvKiA4OEVDMDM0ICovCiAJeyAwIH0KIH07CiAKQEAgLTI4NCw2ICsyODMsMzEgQEAKIAlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfQ1RSTCwgcmVnKTsKIH0KIAorLyogZmxvdyBjb250cm9sIHRvIGFkdmVydGlzZSBiaXRzICovCitzdGF0aWMgY29uc3QgdTE2IGNvcHBlcl9mY19hZHZbXSA9IHsKKwlbRkNfTk9ORV0JPSAwLAorCVtGQ19UWF0JCT0gUEhZX01fQU5fQVNQLAorCVtGQ19SWF0JCT0gUEhZX01fQU5fUEMsCisJW0ZDX0JPVEhdCT0gUEhZX01fQU5fUEMgfCBQSFlfTV9BTl9BU1AsCit9OworCisvKiBmbG93IGNvbnRyb2wgdG8gYWR2ZXJ0aXNlIGJpdHMgd2hlbiB1c2luZyAxMDAwQmFzZVggKi8KK3N0YXRpYyBjb25zdCB1MTYgZmliZXJfZmNfYWR2W10gPSB7CisJW0ZDX0JPVEhdID0gUEhZX01fUF9CT1RIX01EX1gsCisJW0ZDX1RYXSAgID0gUEhZX01fUF9BU1lNX01EX1gsCisJW0ZDX1JYXQkgID0gUEhZX01fUF9TWU1fTURfWCwKKwlbRkNfTk9ORV0gPSBQSFlfTV9QX05PX1BBVVNFX1gsCit9OworCisvKiBmbG93IGNvbnRyb2wgdG8gR01BIGRpc2FibGUgYml0cyAqLworc3RhdGljIGNvbnN0IHUxNiBnbV9mY19kaXNhYmxlW10gPSB7CisJW0ZDX05PTkVdID0gR01fR1BDUl9GQ19SWF9ESVMgfCBHTV9HUENSX0ZDX1RYX0RJUywKKwlbRkNfVFhdCSAgPSBHTV9HUENSX0ZDX1JYX0RJUywKKwlbRkNfUlhdCSAgPSBHTV9HUENSX0ZDX1RYX0RJUywKKwlbRkNfQk9USF0gPSAwLAorfTsKKworCiBzdGF0aWMgdm9pZCBza3kyX3BoeV9pbml0KHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCkKIHsKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoaHctPmRldltwb3J0XSk7CkBAIC0zNTYsMTYgKzM4MCw3IEBACiAJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgcGcpOwogCX0KIAotCWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfQ1RSTCk7Ci0JaWYgKHNreTItPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKQotCQljdHJsICY9IH5QSFlfQ1RfQU5FOwotCWVsc2UKLQkJY3RybCB8PSBQSFlfQ1RfQU5FOwotCi0JY3RybCB8PSBQSFlfQ1RfUkVTRVQ7Ci0JZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMLCBjdHJsKTsKLQotCWN0cmwgPSAwOworCWN0cmwgPSBQSFlfQ1RfUkVTRVQ7CiAJY3QxMDAwID0gMDsKIAlhZHYgPSBQSFlfQU5fQ1NNQTsKIAlyZWcgPSAwOwpAQCAtMzg0LDIwICszOTksMTYgQEAKIAkJCQlhZHYgfD0gUEhZX01fQU5fMTBfRkQ7CiAJCQlpZiAoc2t5Mi0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKIAkJCQlhZHYgfD0gUEhZX01fQU5fMTBfSEQ7CisKKwkJCWFkdiB8PSBjb3BwZXJfZmNfYWR2W3NreTItPmZsb3dfbW9kZV07CiAJCX0gZWxzZSB7CS8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwNDBTIG9ubHkpICovCiAJCQlpZiAoc2t5Mi0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQogCQkJCWFkdiB8PSBQSFlfTV9BTl8xMDAwWF9BRkQ7CiAJCQlpZiAoc2t5Mi0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQogCQkJCWFkdiB8PSBQSFlfTV9BTl8xMDAwWF9BSEQ7Ci0JCX0KIAotCQkvKiBTZXQgRmxvdy1jb250cm9sIGNhcGFiaWxpdGllcyAqLwotCQlpZiAoc2t5Mi0+dHhfcGF1c2UgJiYgc2t5Mi0+cnhfcGF1c2UpCi0JCQlhZHYgfD0gUEhZX0FOX1BBVVNFX0NBUDsJLyogc3ltbWV0cmljICovCi0JCWVsc2UgaWYgKHNreTItPnJ4X3BhdXNlICYmICFza3kyLT50eF9wYXVzZSkKLQkJCWFkdiB8PSBQSFlfQU5fUEFVU0VfQVNZTSB8IFBIWV9BTl9QQVVTRV9DQVA7Ci0JCWVsc2UgaWYgKCFza3kyLT5yeF9wYXVzZSAmJiBza3kyLT50eF9wYXVzZSkKLQkJCWFkdiB8PSBQSFlfQU5fUEFVU0VfQVNZTTsJLyogbG9jYWwgKi8KKwkJCWFkdiB8PSBmaWJlcl9mY19hZHZbc2t5Mi0+Zmxvd19tb2RlXTsKKwkJfQogCiAJCS8qIFJlc3RhcnQgQXV0by1uZWdvdGlhdGlvbiAqLwogCQljdHJsIHw9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOwpAQCAtNDIyLDI1ICs0MzMsMTcgQEAKIAkJaWYgKHNreTItPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgewogCQkJcmVnIHw9IEdNX0dQQ1JfRFVQX0ZVTEw7CiAJCQljdHJsIHw9IFBIWV9DVF9EVVBfTUQ7Ci0JCX0gZWxzZSBpZiAoc2t5Mi0+c3BlZWQgIT0gU1BFRURfMTAwMCAmJiBody0+Y2hpcF9pZCAhPSBDSElQX0lEX1lVS09OX0VDX1UpIHsKLQkJCS8qIFR1cm4gb2ZmIGZsb3cgY29udHJvbCBmb3IgMTAvMTAwbWJwcyAqLwotCQkJc2t5Mi0+cnhfcGF1c2UgPSAwOwotCQkJc2t5Mi0+dHhfcGF1c2UgPSAwOwotCQl9CisJCX0gZWxzZSBpZiAoc2t5Mi0+c3BlZWQgPCBTUEVFRF8xMDAwKQorCQkJc2t5Mi0+Zmxvd19tb2RlID0gRkNfTk9ORTsKIAotCQlpZiAoIXNreTItPnJ4X3BhdXNlKQotCQkJcmVnIHw9IEdNX0dQQ1JfRkNfUlhfRElTOwogCi0JCWlmICghc2t5Mi0+dHhfcGF1c2UpCi0JCQlyZWcgfD0gR01fR1BDUl9GQ19UWF9ESVM7CisgCQlyZWcgfD0gZ21fZmNfZGlzYWJsZVtza3kyLT5mbG93X21vZGVdOwogCiAJCS8qIEZvcndhcmQgcGF1c2UgcGFja2V0cyB0byBHTUFDPyAqLwotCQlpZiAoc2t5Mi0+dHhfcGF1c2UgfHwgc2t5Mi0+cnhfcGF1c2UpCisJCWlmIChza3kyLT5mbG93X21vZGUgJiBGQ19SWCkKIAkJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1BBVVNFX09OKTsKIAkJZWxzZQogCQkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT0ZGKTsKLQotCQljdHJsIHw9IFBIWV9DVF9SRVNFVDsKIAl9CiAKIAlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwgcmVnKTsKQEAgLTUxOCw3ICs1MjEsNyBAQAogCQkvKiBzZXQgVHggTEVEIChMRURfVFgpIHRvIGJsaW5rIG1vZGUgb24gUnggT1IgVHggYWN0aXZpdHkgKi8KIAkJbGVkY3RybCB8PSBQSFlfTV9MRURfQkxJTktfUlQoQkxJTktfODRNUykgfCBQSFlfTV9MRURDX1RYX0NUUkw7CiAJCS8qIHR1cm4gb2ZmIHRoZSBSeCBMRUQgKExFRF9SWCkgKi8KLQkJbGVkb3ZlciB8PSBQSFlfTV9MRURfTU9fUlgoTU9fTEVEX09GRik7CisJCWxlZG92ZXIgJj0gflBIWV9NX0xFRF9NT19SWDsKIAl9CiAKIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VICYmIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19BMSkgewpAQCAtNTQxLDcgKzU0NCw3IEBACiAKIAkJaWYgKHNreTItPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFIHx8IHNreTItPnNwZWVkID09IFNQRUVEXzEwMCkgewogCQkJLyogdHVybiBvbiAxMDAgTWJwcyBMRUQgKExFRF9MSU5LMTAwKSAqLwotCQkJbGVkb3ZlciB8PSBQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PTik7CisJCQlsZWRvdmVyIHw9IFBIWV9NX0xFRF9NT18xMDA7CiAJCX0KIAogCQlpZiAobGVkb3ZlcikKQEAgLTY3MywxNyArNjc2LDE1IEBACiAJLyogRmx1c2ggUnggTUFDIEZJRk8gb24gYW55IGZsb3cgY29udHJvbCBvciBlcnJvciAqLwogCXNreTJfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9GTF9NU0spLCBHTVJfRlNfQU5ZX0VSUik7CiAKLQkvKiBTZXQgdGhyZXNob2xkIHRvIDB4YSAoNjQgYnl0ZXMpCi0JICogIEFTRiBkaXNhYmxlZCBzbyBubyBuZWVkIHRvIGRvIFdBIGRldiAjNC4zMAotCSAqLwotCXNreTJfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9GTF9USFIpLCBSWF9HTUZfRkxfVEhSX0RFRik7CisJLyogU2V0IHRocmVzaG9sZCB0byAweGEgKDY0IGJ5dGVzKSArIDEgdG8gd29ya2Fyb3VuZCBwYXVzZSBidWcgICovCisJc2t5Ml93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0ZMX1RIUiksIFJYX0dNRl9GTF9USFJfREVGKzEpOwogCiAJLyogQ29uZmlndXJlIFR4IE1BQyBGSUZPICovCiAJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9DTFIpOwogCXNreTJfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfT1BFUl9PTik7CiAKIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKSB7Ci0JCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0xQX1RIUiksIDUxMi84KTsKKwkJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfTFBfVEhSKSwgNzY4LzgpOwogCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9VUF9USFIpLCAxMDI0LzgpOwogCQlpZiAoaHctPmRldltwb3J0XS0+bXR1ID4gRVRIX0RBVEFfTEVOKSB7CiAJCQkvKiBzZXQgVHggR01BQyBGSUZPIEFsbW9zdCBFbXB0eSBUaHJlc2hvbGQgKi8KQEAgLTY5NSwxNiArNjk2LDE1IEBACiAKIH0KIAotLyogQXNzaWduIFJhbSBCdWZmZXIgYWxsb2NhdGlvbi4KLSAqIHN0YXJ0IGFuZCBlbmQgYXJlIGluIHVuaXRzIG9mIDRrIGJ5dGVzCi0gKiByYW0gcmVnaXN0ZXJzIGFyZSBpbiB1bml0cyBvZiA2NGJpdCB3b3JkcwotICovCi1zdGF0aWMgdm9pZCBza3kyX3JhbXNldChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHUxNiBxLCB1OCBzdGFydGssIHU4IGVuZGspCisvKiBBc3NpZ24gUmFtIEJ1ZmZlciBhbGxvY2F0aW9uIHRvIHF1ZXVlICovCitzdGF0aWMgdm9pZCBza3kyX3JhbXNldChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHUxNiBxLCB1MzIgc3RhcnQsIHUzMiBzcGFjZSkKIHsKLQl1MzIgc3RhcnQsIGVuZDsKKwl1MzIgZW5kOwogCi0Jc3RhcnQgPSBzdGFydGsgKiA0MDk2Lzg7Ci0JZW5kID0gKGVuZGsgKiA0MDk2LzgpIC0gMTsKKwkvKiBjb252ZXJ0IGZyb20gSyBieXRlcyB0byBxd29yZHMgdXNlZCBmb3IgaHcgcmVnaXN0ZXIgKi8KKwlzdGFydCAqPSAxMDI0Lzg7CisJc3BhY2UgKj0gMTAyNC84OworCWVuZCA9IHN0YXJ0ICsgc3BhY2UgLSAxOwogCiAJc2t5Ml93cml0ZTgoaHcsIFJCX0FERFIocSwgUkJfQ1RSTCksIFJCX1JTVF9DTFIpOwogCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9TVEFSVCksIHN0YXJ0KTsKQEAgLTcxMyw3ICs3MTMsNiBAQAogCXNreTJfd3JpdGUzMihodywgUkJfQUREUihxLCBSQl9SUCksIHN0YXJ0KTsKIAogCWlmIChxID09IFFfUjEgfHwgcSA9PSBRX1IyKSB7Ci0JCXUzMiBzcGFjZSA9IChlbmRrIC0gc3RhcnRrKSAqIDQwOTYvODsKIAkJdTMyIHRwID0gc3BhY2UgLSBzcGFjZS80OwogCiAJCS8qIE9uIHJlY2VpdmUgcXVldWUncyBzZXQgdGhlIHRocmVzaG9sZHMKQEAgLTEwNjMsMTAgKzEwNjIsMTYgQEAKIAlza3kyLT5yeF9wdXQgPSBza3kyLT5yeF9uZXh0ID0gMDsKIAlza3kyX3FzZXQoaHcsIHJ4cSk7CiAKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VICYmIGh3LT5jaGlwX3JldiA+PSAyKSB7Ci0JCS8qIE1BQyBSeCBSQU0gUmVhZCBpcyBjb250cm9sbGVkIGJ5IGhhcmR3YXJlICovCisJLyogT24gUENJIGV4cHJlc3MgbG93ZXJpbmcgdGhlIHdhdGVybWFyayBnaXZlcyBiZXR0ZXIgcGVyZm9ybWFuY2UgKi8KKwlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShody0+cGRldiwgUENJX0NBUF9JRF9FWFApKQorCQlza3kyX3dyaXRlMzIoaHcsIFFfQUREUihyeHEsIFFfV00pLCBCTVVfV01fUEVYKTsKKworCS8qIFRoZXNlIGNoaXBzIGhhdmUgbm8gcmFtIGJ1ZmZlcj8KKwkgKiBNQUMgUnggUkFNIFJlYWQgaXMgY29udHJvbGxlZCBieSBoYXJkd2FyZSAqLworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UgJiYKKwkgICAgKGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19VX0ExCisJICAgICB8fCBody0+Y2hpcF9yZXYgPT0gQ0hJUF9SRVZfWVVfRUNfVV9CMCkpCiAJCXNreTJfd3JpdGUzMihodywgUV9BRERSKHJ4cSwgUV9GKSwgRl9NX1JYX1JBTV9ESVMpOwotCX0KIAogCXNreTJfcHJlZmV0Y2hfaW5pdChodywgcnhxLCBza3kyLT5yeF9sZV9tYXAsIFJYX0xFX1NJWkUgLSAxKTsKIApAQCAtMTE0Miw3ICsxMTQ3LDcgQEAKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKIAl1bnNpZ25lZCBwb3J0ID0gc2t5Mi0+cG9ydDsKLQl1MzIgcmFtc2l6ZSwgcnhzcGFjZSwgaW1hc2s7CisJdTMyIHJhbXNpemUsIGltYXNrOwogCWludCBjYXAsIGVyciA9IC1FTk9NRU07CiAJc3RydWN0IG5ldF9kZXZpY2UgKm90aGVyZGV2ID0gaHctPmRldltza3kyLT5wb3J0XjFdOwogCkBAIC0xMTk1LDIzICsxMjAwLDI1IEBACiAKIAlza3kyX21hY19pbml0KGh3LCBwb3J0KTsKIAotCS8qIERldGVybWluZSBhdmFpbGFibGUgcmFtIGJ1ZmZlciBzcGFjZSAoaW4gNEsgYmxvY2tzKS4KLQkgKiBOb3RlOiBub3Qgc3VyZSBhYm91dCB0aGUgRkUgc2V0dGluZyBiZWxvdyB5ZXQKLQkgKi8KLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9GRSkKLQkJcmFtc2l6ZSA9IDQ7Ci0JZWxzZQotCQlyYW1zaXplID0gc2t5Ml9yZWFkOChodywgQjJfRV8wKTsKKwkvKiBSZWdpc3RlciBpcyBudW1iZXIgb2YgNEsgYmxvY2tzIG9uIGludGVybmFsIFJBTSBidWZmZXIuICovCisJcmFtc2l6ZSA9IHNreTJfcmVhZDgoaHcsIEIyX0VfMCkgKiA0OworCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogcmFtIGJ1ZmZlciAlZEtcbiIsIGRldi0+bmFtZSwgcmFtc2l6ZSk7CiAKLQkvKiBHaXZlIHRyYW5zbWl0dGVyIG9uZSB0aGlyZCAocm91bmRlZCB1cCkgKi8KLQlyeHNwYWNlID0gcmFtc2l6ZSAtIChyYW1zaXplICsgMikgLyAzOworCWlmIChyYW1zaXplID4gMCkgeworCQl1MzIgcnhzcGFjZTsKIAotCXNreTJfcmFtc2V0KGh3LCByeHFhZGRyW3BvcnRdLCAwLCByeHNwYWNlKTsKLQlza3kyX3JhbXNldChodywgdHhxYWRkcltwb3J0XSwgcnhzcGFjZSwgcmFtc2l6ZSk7CisJCWlmIChyYW1zaXplIDwgMTYpCisJCQlyeHNwYWNlID0gcmFtc2l6ZSAvIDI7CisJCWVsc2UKKwkJCXJ4c3BhY2UgPSA4ICsgKDIqKHJhbXNpemUgLSAxNikpLzM7CiAKLQkvKiBNYWtlIHN1cmUgU3luY1EgaXMgZGlzYWJsZWQgKi8KLQlza3kyX3dyaXRlOChodywgUkJfQUREUihwb3J0ID09IDAgPyBRX1hTMSA6IFFfWFMyLCBSQl9DVFJMKSwKLQkJICAgIFJCX1JTVF9TRVQpOworCQlza3kyX3JhbXNldChodywgcnhxYWRkcltwb3J0XSwgMCwgcnhzcGFjZSk7CisJCXNreTJfcmFtc2V0KGh3LCB0eHFhZGRyW3BvcnRdLCByeHNwYWNlLCByYW1zaXplIC0gcnhzcGFjZSk7CisKKwkJLyogTWFrZSBzdXJlIFN5bmNRIGlzIGRpc2FibGVkICovCisJCXNreTJfd3JpdGU4KGh3LCBSQl9BRERSKHBvcnQgPT0gMCA/IFFfWFMxIDogUV9YUzIsIFJCX0NUUkwpLAorCQkJICAgIFJCX1JTVF9TRVQpOworCX0KIAogCXNreTJfcXNldChodywgdHhxYWRkcltwb3J0XSk7CiAKQEAgLTEzNTYsNyArMTM2Myw3IEBACiAJCXUzMiB0Y3BzdW07CiAKIAkJdGNwc3VtID0gb2Zmc2V0IDw8IDE2OwkJLyogc3VtIHN0YXJ0ICovCi0JCXRjcHN1bSB8PSBvZmZzZXQgKyBza2ItPmNzdW07CS8qIHN1bSB3cml0ZSAqLworCQl0Y3BzdW0gfD0gb2Zmc2V0ICsgc2tiLT5jc3VtX29mZnNldDsJLyogc3VtIHdyaXRlICovCiAKIAkJY3RybCA9IENBTFNVTSB8IFdSX1NVTSB8IElOSVRfU1VNIHwgTE9DS19TVU07CiAJCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCkBAIC0xNDU5LDcgKzE0NjYsNyBAQAogCQkJaWYgKHVubGlrZWx5KG5ldGlmX21zZ190eF9kb25lKHNreTIpKSkKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IGRvbmUgJXVcbiIsCiAJCQkJICAgICAgIGRldi0+bmFtZSwgaWR4KTsKLQkJCWRldl9rZnJlZV9za2IocmUtPnNrYik7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShyZS0+c2tiKTsKIAkJfQogCiAJCWxlLT5vcGNvZGUgPSAwOwkvKiBwYXJhbm9pYSAqLwpAQCAtMTQ5OSw2ICsxNTA2LDExIEBACiAJLyogU3RvcCBtb3JlIHBhY2tldHMgZnJvbSBiZWluZyBxdWV1ZWQgKi8KIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKKwkvKiBEaXNhYmxlIHBvcnQgSVJRICovCisJaW1hc2sgPSBza3kyX3JlYWQzMihodywgQjBfSU1TSyk7CisJaW1hc2sgJj0gfnBvcnRpcnFfbXNrW3BvcnRdOworCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgaW1hc2spOworCiAJc2t5Ml9nbWFjX3Jlc2V0KGh3LCBwb3J0KTsKIAogCS8qIFN0b3AgdHJhbnNtaXR0ZXIgKi8KQEAgLTE1MTAsNyArMTUyMiw3IEBACiAKIAkvKiBXQSBmb3IgZGV2LiAjNC4yMDkgKi8KIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VCi0JICAgICYmIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19VX0ExKQorCSAgICAmJiAoaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0VDX1VfQTEgfHwgaHctPmNoaXBfcmV2ID09IENISVBfUkVWX1lVX0VDX1VfQjApKQogCQlza3kyX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwKIAkJCSAgICAgc2t5Mi0+c3BlZWQgIT0gU1BFRURfMTAwMCA/CiAJCQkgICAgIFRYX1NURldfRU5BIDogVFhfU1RGV19ESVMpOwpAQCAtMTU0OSwxMSArMTU2MSw2IEBACiAJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9TRVQpOwogCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9SU1RfU0VUKTsKIAotCS8qIERpc2FibGUgcG9ydCBJUlEgKi8KLQlpbWFzayA9IHNreTJfcmVhZDMyKGh3LCBCMF9JTVNLKTsKLQlpbWFzayAmPSB+cG9ydGlycV9tc2tbcG9ydF07Ci0Jc2t5Ml93cml0ZTMyKGh3LCBCMF9JTVNLLCBpbWFzayk7Ci0KIAlza3kyX3BoeV9wb3dlcihodywgcG9ydCwgMCk7CiAKIAkvKiB0dXJuIG9mZiBMRUQncyAqLwpAQCAtMTYwNSw2ICsxNjEyLDEyIEBACiAJc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CiAJdW5zaWduZWQgcG9ydCA9IHNreTItPnBvcnQ7CiAJdTE2IHJlZzsKKwlzdGF0aWMgY29uc3QgY2hhciAqZmNfbmFtZVtdID0geworCQlbRkNfTk9ORV0JPSAibm9uZSIsCisJCVtGQ19UWF0JCT0gInR4IiwKKwkJW0ZDX1JYXQkJPSAicngiLAorCQlbRkNfQk9USF0JPSAiYm90aCIsCisJfTsKIAogCS8qIGVuYWJsZSBSeC9UeCAqLwogCXJlZyA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwpOwpAQCAtMTY0OCw4ICsxNjYxLDcgQEAKIAkJICAgICAgICIlczogTGluayBpcyB1cCBhdCAlZCBNYnBzLCAlcyBkdXBsZXgsIGZsb3cgY29udHJvbCAlc1xuIiwKIAkJICAgICAgIHNreTItPm5ldGRldi0+bmFtZSwgc2t5Mi0+c3BlZWQsCiAJCSAgICAgICBza3kyLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPyAiZnVsbCIgOiAiaGFsZiIsCi0JCSAgICAgICAoc2t5Mi0+dHhfcGF1c2UgJiYgc2t5Mi0+cnhfcGF1c2UpID8gImJvdGgiIDoKLQkJICAgICAgIHNreTItPnR4X3BhdXNlID8gInR4IiA6IHNreTItPnJ4X3BhdXNlID8gInJ4IiA6ICJub25lIik7CisJCSAgICAgICBmY19uYW1lW3NreTItPmZsb3dfc3RhdHVzXSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNreTJfbGlua19kb3duKHN0cnVjdCBza3kyX3BvcnQgKnNreTIpCkBAIC0xNjY0LDcgKzE2NzYsNyBAQAogCXJlZyAmPSB+KEdNX0dQQ1JfUlhfRU5BIHwgR01fR1BDUl9UWF9FTkEpOwogCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLCByZWcpOwogCi0JaWYgKHNreTItPnJ4X3BhdXNlICYmICFza3kyLT50eF9wYXVzZSkgeworCWlmIChza3kyLT5mbG93X3N0YXR1cyA9PSBGQ19SWCkgewogCQkvKiByZXN0b3JlIEFzeW1tZXRyaWMgUGF1c2UgYml0ICovCiAJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQVVORV9BRFYsCiAJCQkgICAgIGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEVikKQEAgLTE2ODMsNiArMTY5NSwxNCBAQAogCXNreTJfcGh5X2luaXQoaHcsIHBvcnQpOwogfQogCitzdGF0aWMgZW51bSBmbG93X2NvbnRyb2wgc2t5Ml9mbG93KGludCByeCwgaW50IHR4KQoreworCWlmIChyeCkKKwkJcmV0dXJuIHR4ID8gRkNfQk9USCA6IEZDX1JYOworCWVsc2UKKwkJcmV0dXJuIHR4ID8gRkNfVFggOiBGQ19OT05FOworfQorCiBzdGF0aWMgaW50IHNreTJfYXV0b25lZ19kb25lKHN0cnVjdCBza3kyX3BvcnQgKnNreTIsIHUxNiBhdXgpCiB7CiAJc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CkBAIC0xNzAzLDM5ICsxNzIzLDIwIEBACiAJfQogCiAJc2t5Mi0+c3BlZWQgPSBza3kyX3BoeV9zcGVlZChodywgYXV4KTsKLQlpZiAoc2t5Mi0+c3BlZWQgPT0gU1BFRURfMTAwMCkgewotCQl1MTYgY3RsMiA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl8xMDAwVF9DVFJMKTsKLQkJdTE2IGxwYTIgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfMTAwMFRfU1RBVCk7Ci0JCWlmIChscGEyICAmIFBIWV9CXzEwMDBTX01TRikgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IG1hc3Rlci9zbGF2ZSBmYXVsdCIsCi0JCQkgICAgICAgc2t5Mi0+bmV0ZGV2LT5uYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmICgoY3RsMiAmIFBIWV9NXzEwMDBDX0FGRCkgJiYgKGxwYTIgJiBQSFlfQl8xMDAwU19MUF9GRCkpCi0JCQlza3kyLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJZWxzZQotCQkJc2t5Mi0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7Ci0JfSBlbHNlIHsKLQkJdTE2IGFkdiA9IGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEVik7Ci0JCWlmICgoYXV4ICYgYWR2KSAmIFBIWV9BTl9GVUxMKQotCQkJc2t5Mi0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWVsc2UKLQkJCXNreTItPmR1cGxleCA9IERVUExFWF9IQUxGOwotCX0KKwlza3kyLT5kdXBsZXggPSAoYXV4ICYgUEhZX01fUFNfRlVMTF9EVVApID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKIAogCS8qIFBhdXNlIGJpdHMgYXJlIG9mZnNldCAoOS4uOCkgKi8KIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UpCiAJCWF1eCA+Pj0gNjsKIAotCXNreTItPnJ4X3BhdXNlID0gKGF1eCAmIFBIWV9NX1BTX1JYX1BfRU4pICE9IDA7Ci0Jc2t5Mi0+dHhfcGF1c2UgPSAoYXV4ICYgUEhZX01fUFNfVFhfUF9FTikgIT0gMDsKKwlza3kyLT5mbG93X3N0YXR1cyA9IHNreTJfZmxvdyhhdXggJiBQSFlfTV9QU19SWF9QX0VOLAorCQkJCSAgICAgIGF1eCAmIFBIWV9NX1BTX1RYX1BfRU4pOwogCi0JaWYgKHNreTItPmR1cGxleCA9PSBEVVBMRVhfSEFMRiAmJiBza3kyLT5zcGVlZCAhPSBTUEVFRF8xMDAwCisJaWYgKHNreTItPmR1cGxleCA9PSBEVVBMRVhfSEFMRiAmJiBza3kyLT5zcGVlZCA8IFNQRUVEXzEwMDAKIAkgICAgJiYgaHctPmNoaXBfaWQgIT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKQotCQlza3kyLT5yeF9wYXVzZSA9IHNreTItPnR4X3BhdXNlID0gMDsKKwkJc2t5Mi0+Zmxvd19zdGF0dXMgPSBGQ19OT05FOwogCi0JaWYgKHNreTItPnJ4X3BhdXNlIHx8IHNreTItPnR4X3BhdXNlKQorCWlmIChhdXggJiBQSFlfTV9QU19SWF9QX0VOKQogCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PTik7CiAJZWxzZQogCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOwpAQCAtMTc1MCwxMyArMTc1MSwxMyBAQAogCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBpc3RhdHVzLCBwaHlzdGF0OwogCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybjsKKwogCXNwaW5fbG9jaygmc2t5Mi0+cGh5X2xvY2spOwogCWlzdGF0dXMgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfSU5UX1NUQVQpOwogCXBoeXN0YXQgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX1NUQVQpOwogCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCi0JCWdvdG8gb3V0OwotCiAJaWYgKG5ldGlmX21zZ19pbnRyKHNreTIpKQogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IHBoeSBpbnRlcnJ1cHQgc3RhdHVzIDB4JXggMHgleFxuIiwKIAkJICAgICAgIHNreTItPm5ldGRldi0+bmFtZSwgaXN0YXR1cywgcGh5c3RhdCk7CkBAIC0yMDE2LDYgKzIwMTcsMTAgQEAKIAogZXJyb3I6CiAJKytza3kyLT5uZXRfc3RhdHMucnhfZXJyb3JzOworCWlmIChzdGF0dXMgJiBHTVJfRlNfUlhfRkZfT1YpIHsKKwkJc2t5Mi0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCWdvdG8gcmVzdWJtaXQ7CisJfQogCiAJaWYgKG5ldGlmX21zZ19yeF9lcnIoc2t5MikgJiYgbmV0X3JhdGVsaW1pdCgpKQogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IHJ4IGVycm9yLCBzdGF0dXMgMHgleCBsZW5ndGggJWRcbiIsCkBAIC0yMDI3LDggKzIwMzIsNiBAQAogCQlza3kyLT5uZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJaWYgKHN0YXR1cyAmIEdNUl9GU19DUkNfRVJSKQogCQlza3kyLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycysrOwotCWlmIChzdGF0dXMgJiBHTVJfRlNfUlhfRkZfT1YpCi0JCXNreTItPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCiAJZ290byByZXN1Ym1pdDsKIH0KQEAgLTIwNzUsNyArMjA3OCw3IEBACiAJCWNhc2UgT1BfUlhTVEFUOgogCQkJc2tiID0gc2t5Ml9yZWNlaXZlKGRldiwgbGVuZ3RoLCBzdGF0dXMpOwogCQkJaWYgKCFza2IpCi0JCQkJYnJlYWs7CisJCQkJZ290byBmb3JjZV91cGRhdGU7CiAKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpAQCAtMjA5MSw4ICsyMDk0LDggQEAKIAogCQkJLyogVXBkYXRlIHJlY2VpdmVyIGFmdGVyIDE2IGZyYW1lcyAqLwogCQkJaWYgKCsrYnVmX3dyaXRlW2xlLT5saW5rXSA9PSBSWF9CVUZfV1JJVEUpIHsKLQkJCQlza3kyX3B1dF9pZHgoaHcsIHJ4cWFkZHJbbGUtPmxpbmtdLAotCQkJCQkgICAgIHNreTItPnJ4X3B1dCk7Citmb3JjZV91cGRhdGU6CisJCQkJc2t5Ml9wdXRfaWR4KGh3LCByeHFhZGRyW2xlLT5saW5rXSwgc2t5Mi0+cnhfcHV0KTsKIAkJCQlidWZfd3JpdGVbbGUtPmxpbmtdID0gMDsKIAkJCX0KIApAQCAtMjc0OCw3ICsyNzUxLDcgQEAKIHsKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmIChza3kyLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFKQorCWlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8IHNreTItPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc2t5Ml9waHlfcmVpbml0KHNreTIpOwpAQCAtMjg1MCw2ICsyODUzLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGlubGluZSBza3kyX2FkZF9maWx0ZXIodTggZmlsdGVyWzhdLCBjb25zdCB1OCAqYWRkcikKK3sKKwl1MzIgYml0OworCisJYml0ID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBhZGRyKSAmIDYzOworCWZpbHRlcltiaXQgPj4gM10gfD0gMSA8PCAoYml0ICYgNyk7Cit9CisKIHN0YXRpYyB2b2lkIHNreTJfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMjg1OCw3ICsyODY5LDEwIEBACiAJc3RydWN0IGRldl9tY19saXN0ICpsaXN0ID0gZGV2LT5tY19saXN0OwogCXUxNiByZWc7CiAJdTggZmlsdGVyWzhdOworCWludCByeF9wYXVzZTsKKwlzdGF0aWMgY29uc3QgdTggcGF1c2VfbWNfYWRkcltFVEhfQUxFTl0gPSB7IDB4MSwgMHg4MCwgMHhjMiwgMHgwLCAweDAsIDB4MSB9OwogCisJcnhfcGF1c2UgPSAoc2t5Mi0+Zmxvd19zdGF0dXMgPT0gRkNfUlggfHwgc2t5Mi0+Zmxvd19zdGF0dXMgPT0gRkNfQk9USCk7CiAJbWVtc2V0KGZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOwogCiAJcmVnID0gZ21hX3JlYWQxNihodywgcG9ydCwgR01fUlhfQ1RSTCk7CkBAIC0yODY2LDE4ICsyODgwLDE5IEBACiAKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQkvKiBwcm9taXNjdW91cyAqLwogCQlyZWcgJj0gfihHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX01DRl9FTkEpOwotCWVsc2UgaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCBkZXYtPm1jX2NvdW50ID4gMTYpCS8qIGFsbCBtdWx0aWNhc3QgKi8KKwllbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQogCQltZW1zZXQoZmlsdGVyLCAweGZmLCBzaXplb2YoZmlsdGVyKSk7Ci0JZWxzZSBpZiAoZGV2LT5tY19jb3VudCA9PSAwKQkvKiBubyBtdWx0aWNhc3QgKi8KKwllbHNlIGlmIChkZXYtPm1jX2NvdW50ID09IDAgJiYgIXJ4X3BhdXNlKQogCQlyZWcgJj0gfkdNX1JYQ1JfTUNGX0VOQTsKIAllbHNlIHsKIAkJaW50IGk7CiAJCXJlZyB8PSBHTV9SWENSX01DRl9FTkE7CiAKLQkJZm9yIChpID0gMDsgbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBsaXN0ID0gbGlzdC0+bmV4dCkgewotCQkJdTMyIGJpdCA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbGlzdC0+ZG1pX2FkZHIpICYgMHgzZjsKLQkJCWZpbHRlcltiaXQgLyA4XSB8PSAxIDw8IChiaXQgJSA4KTsKLQkJfQorCQlpZiAocnhfcGF1c2UpCisJCQlza3kyX2FkZF9maWx0ZXIoZmlsdGVyLCBwYXVzZV9tY19hZGRyKTsKKworCQlmb3IgKGkgPSAwOyBsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OyBpKyssIGxpc3QgPSBsaXN0LT5uZXh0KQorCQkJc2t5Ml9hZGRfZmlsdGVyKGZpbHRlciwgbGlzdC0+ZG1pX2FkZHIpOwogCX0KIAogCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gxLApAQCAtMjkxNSwxOCArMjkzMCw4IEBACiAKIAlkZWZhdWx0OgogCQlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0xFRF9DVFJMLCAwKTsKLQkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwKLQkJCSAgICAgb24gPyBQSFlfTV9MRURfTU9fRFVQKE1PX0xFRF9PTikgfAotCQkJICAgICBQSFlfTV9MRURfTU9fMTAoTU9fTEVEX09OKSB8Ci0JCQkgICAgIFBIWV9NX0xFRF9NT18xMDAoTU9fTEVEX09OKSB8Ci0JCQkgICAgIFBIWV9NX0xFRF9NT18xMDAwKE1PX0xFRF9PTikgfAotCQkJICAgICBQSFlfTV9MRURfTU9fUlgoTU9fTEVEX09OKQotCQkJICAgICA6IFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09GRikgfAotCQkJICAgICBQSFlfTV9MRURfTU9fMTAoTU9fTEVEX09GRikgfAotCQkJICAgICBQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PRkYpIHwKLQkJCSAgICAgUEhZX01fTEVEX01PXzEwMDAoTU9fTEVEX09GRikgfAotCQkJICAgICBQSFlfTV9MRURfTU9fUlgoTU9fTEVEX09GRikpOwotCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX09WRVIsIAorCQkJICAgICBvbiA/IFBIWV9NX0xFRF9BTEwgOiAwKTsKIAl9CiB9CiAKQEAgLTI5OTAsOCArMjk5NSwyMCBAQAogewogCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JZWNtZC0+dHhfcGF1c2UgPSBza3kyLT50eF9wYXVzZTsKLQllY21kLT5yeF9wYXVzZSA9IHNreTItPnJ4X3BhdXNlOworCXN3aXRjaCAoc2t5Mi0+Zmxvd19tb2RlKSB7CisJY2FzZSBGQ19OT05FOgorCQllY21kLT50eF9wYXVzZSA9IGVjbWQtPnJ4X3BhdXNlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBGQ19UWDoKKwkJZWNtZC0+dHhfcGF1c2UgPSAxLCBlY21kLT5yeF9wYXVzZSA9IDA7CisJCWJyZWFrOworCWNhc2UgRkNfUlg6CisJCWVjbWQtPnR4X3BhdXNlID0gMCwgZWNtZC0+cnhfcGF1c2UgPSAxOworCQlicmVhazsKKwljYXNlIEZDX0JPVEg6CisJCWVjbWQtPnR4X3BhdXNlID0gZWNtZC0+cnhfcGF1c2UgPSAxOworCX0KKwogCWVjbWQtPmF1dG9uZWcgPSBza3kyLT5hdXRvbmVnOwogfQogCkBAIC0zMDAxLDEwICszMDE4LDEwIEBACiAJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CiAKIAlza3kyLT5hdXRvbmVnID0gZWNtZC0+YXV0b25lZzsKLQlza3kyLT50eF9wYXVzZSA9IGVjbWQtPnR4X3BhdXNlICE9IDA7Ci0Jc2t5Mi0+cnhfcGF1c2UgPSBlY21kLT5yeF9wYXVzZSAhPSAwOworCXNreTItPmZsb3dfbW9kZSA9IHNreTJfZmxvdyhlY21kLT5yeF9wYXVzZSwgZWNtZC0+dHhfcGF1c2UpOwogCi0Jc2t5Ml9waHlfcmVpbml0KHNreTIpOworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXNreTJfcGh5X3JlaW5pdChza3kyKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzIyNCw3ICszMjQxLDExIEBACiAJCWRldi0+cG9sbCA9IHNreTJfcG9sbDsKIAlkZXYtPndlaWdodCA9IE5BUElfV0VJR0hUOwogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBza3kyX25ldHBvbGw7CisJLyogTmV0d29yayBjb25zb2xlIChvbmx5IHdvcmtzIG9uIHBvcnQgMCkKKwkgKiBiZWNhdXNlIG5ldHBvbGwgbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgTkFQSQorCSAqLworCWlmIChwb3J0ID09IDApCisJCWRldi0+cG9sbF9jb250cm9sbGVyID0gc2t5Ml9uZXRwb2xsOwogI2VuZGlmCiAKIAlza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTMyMzQsOCArMzI1NSw4IEBACiAKIAkvKiBBdXRvIHNwZWVkIGFuZCBmbG93IGNvbnRyb2wgKi8KIAlza3kyLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7Ci0Jc2t5Mi0+dHhfcGF1c2UgPSAxOwotCXNreTItPnJ4X3BhdXNlID0gMTsKKwlza3kyLT5mbG93X21vZGUgPSBGQ19CT1RIOworCiAJc2t5Mi0+ZHVwbGV4ID0gLTE7CiAJc2t5Mi0+c3BlZWQgPSAtMTsKIAlza3kyLT5hZHZlcnRpc2luZyA9IHNreTJfc3VwcG9ydGVkX21vZGVzKGh3KTsKQEAgLTMyOTMsNyArMzMxNCw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogCWlmIChzdGF0dXMgJiBZMl9JU19JUlFfU1cpIHsKLQkJaHctPm1zaV9kZXRlY3RlZCA9IDE7CisJCWh3LT5tc2kgPSAxOwogCQl3YWtlX3VwKCZody0+bXNpX3dhaXQpOwogCQlza3kyX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfQ0xfU1dfSVJRKTsKIAl9CkBAIC0zMzEyLDcgKzMzMzMsNyBAQAogCiAJc2t5Ml93cml0ZTMyKGh3LCBCMF9JTVNLLCBZMl9JU19JUlFfU1cpOwogCi0JZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBza3kyX3Rlc3RfaW50ciwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBodyk7CisJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBza3kyX3Rlc3RfaW50ciwgMCwgRFJWX05BTUUsIGh3KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjYW5ub3QgYXNzaWduIGlycSAlZFxuIiwKIAkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT5pcnEpOwpAQCAtMzMyMiwxMyArMzM0MywxMiBAQAogCXNreTJfd3JpdGU4KGh3LCBCMF9DVFNULCBDU19TVF9TV19JUlEpOwogCXNreTJfcmVhZDgoaHcsIEIwX0NUU1QpOwogCi0Jd2FpdF9ldmVudF90aW1lb3V0KGh3LT5tc2lfd2FpdCwgaHctPm1zaV9kZXRlY3RlZCwgSFovMTApOworCXdhaXRfZXZlbnRfdGltZW91dChody0+bXNpX3dhaXQsIGh3LT5tc2ksIEhaLzEwKTsKIAotCWlmICghaHctPm1zaV9kZXRlY3RlZCkgeworCWlmICghaHctPm1zaSkgewogCQkvKiBNU0kgdGVzdCBmYWlsZWQsIGdvIGJhY2sgdG8gSU5UeCBtb2RlICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogTm8gaW50ZXJydXB0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgTVNJLCAiCi0JCSAgICAgICAic3dpdGNoaW5nIHRvIElOVHggbW9kZS4gUGxlYXNlIHJlcG9ydCB0aGlzIGZhaWx1cmUgdG8gIgotCQkgICAgICAgInRoZSBQQ0kgbWFpbnRhaW5lciBhbmQgaW5jbHVkZSBzeXN0ZW0gY2hpcHNldCBpbmZvcm1hdGlvbi5cbiIsCisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTm8gaW50ZXJydXB0IGdlbmVyYXRlZCB1c2luZyBNU0ksICIKKwkJICAgICAgICJzd2l0Y2hpbmcgdG8gSU5UeCBtb2RlLlxuIiwKIAkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKIAogCQllcnIgPSAtRU9QTk9UU1VQUDsKQEAgLTMzMzYsNiArMzM1Niw3IEBACiAJfQogCiAJc2t5Ml93cml0ZTMyKGh3LCBCMF9JTVNLLCAwKTsKKwlza3kyX3JlYWQzMihodywgQjBfSU1TSyk7CiAKIAlmcmVlX2lycShwZGV2LT5pcnEsIGh3KTsKIApAQCAtMzQ1Nyw3ICszNDc4LDggQEAKIAkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwogCX0KIAotCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgIHNreTJfaW50ciwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgaHcpOworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgIHNreTJfaW50ciwgaHctPm1zaSA/IDAgOiBJUlFGX1NIQVJFRCwKKwkJCSAgZGV2LT5uYW1lLCBodyk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsCiAJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxKTsKQEAgLTM0ODcsNyArMzUwOSw4IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfdW5yZWdpc3RlcjoKLQlwY2lfZGlzYWJsZV9tc2kocGRldik7CisJaWYgKGh3LT5tc2kpCisJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogZXJyX291dF9mcmVlX25ldGRldjoKIAlmcmVlX25ldGRldihkZXYpOwpAQCAtMzUzMCw3ICszNTUzLDggQEAKIAlza3kyX3JlYWQ4KGh3LCBCMF9DVFNUKTsKIAogCWZyZWVfaXJxKHBkZXYtPmlycSwgaHcpOwotCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKKwlpZiAoaHctPm1zaSkKKwkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgU1RBVFVTX0xFX0JZVEVTLCBody0+c3RfbGUsIGh3LT5zdF9kbWEpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5oIGIvZHJpdmVycy9uZXQvc2t5Mi5oCmluZGV4IDQzZDJhY2MuLjZlZDFkNDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmgKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5oCkBAIC0zODMsOCArMzgzLDEzIEBACiAJQ0hJUF9SRVZfWVVfRUNfQTIgICAgPSAxLCAgLyogQ2hpcCBSZXYuIGZvciBZdWtvbi1FQyBBMiAqLwogCUNISVBfUkVWX1lVX0VDX0EzICAgID0gMiwgIC8qIENoaXAgUmV2LiBmb3IgWXVrb24tRUMgQTMgKi8KIAotCUNISVBfUkVWX1lVX0VDX1VfQTAgID0gMCwKLQlDSElQX1JFVl9ZVV9FQ19VX0ExICA9IDEsCisJQ0hJUF9SRVZfWVVfRUNfVV9BMCAgPSAxLAorCUNISVBfUkVWX1lVX0VDX1VfQTEgID0gMiwKKwlDSElQX1JFVl9ZVV9FQ19VX0IwICA9IDMsCisKKwlDSElQX1JFVl9ZVV9GRV9BMSAgICA9IDEsCisJQ0hJUF9SRVZfWVVfRkVfQTIgICAgPSAyLAorCiB9OwogCiAvKglCMl9ZMl9DTEtfR0FURQkgOCBiaXQJQ2xvY2sgR2F0aW5nIChZdWtvbi0yIG9ubHkpICovCkBAIC02MDMsNyArNjA4LDcgQEAKIAlQSFlfQUREUl9NQVJWCT0gMCwKIH07CiAKLSNkZWZpbmUgUkJfQUREUihvZmZzLCBxdWV1ZSkgKEIxNl9SQU1fUkVHUyArIChxdWV1ZSkgKyAob2ZmcykpCisjZGVmaW5lIFJCX0FERFIob2ZmcywgcXVldWUpICgodTE2KSBCMTZfUkFNX1JFR1MgKyAocXVldWUpICsgKG9mZnMpKQogCiAKIGVudW0gewpAQCAtNjc1LDYgKzY4MCw3IEBACiAJCQkgIEJNVV9GSUZPX0VOQSB8IEJNVV9PUF9PTiwKIAogCUJNVV9XTV9ERUZBVUxUID0gMHg2MDAsCisJQk1VX1dNX1BFWCAgICAgPSAweDgwLAogfTsKIAogLyogVHggQk1VIENvbnRyb2wgLyBTdGF0dXMgUmVnaXN0ZXJzIChZdWtvbi0yKSAqLwpAQCAtMTA1NSw3ICsxMDYxLDcgQEAKIAlQSFlfTV9QQ19FTl9ERVRfUExVUwk9IDM8PDgsIC8qIEVuZXJneSBEZXRlY3QgUGx1cyAoTW9kZSAyKSAqLwogfTsKIAotI2RlZmluZSBQSFlfTV9QQ19NRElfWE1PREUoeCkJKCgoeCk8PDUpICYgUEhZX01fUENfTURJWF9NU0spCisjZGVmaW5lIFBIWV9NX1BDX01ESV9YTU9ERSh4KQkoKCh1MTYpKHgpPDw1KSAmIFBIWV9NX1BDX01ESVhfTVNLKQogCiBlbnVtIHsKIAlQSFlfTV9QQ19NQU5fTURJCT0gMCwgLyogMDAgPSBNYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTExNTEsMTMgKzExNTcsMTMgQEAKIAlQSFlfTV9FQ19UWF9USU1fQ1QgID0gMTw8MSwgLyogUkdNSUkgVHggVGltaW5nIENvbnRyb2wgKi8KIAlQSFlfTV9FQ19UUkFOU19ESVMgID0gMTw8MCwgLyogVHJhbnNtaXR0ZXIgRGlzYWJsZSAoODhFMTExMSBvbmx5KSAqL307CiAKLSNkZWZpbmUgUEhZX01fRUNfTV9EU0MoeCkJKCh4KTw8MTAgJiBQSFlfTV9FQ19NX0RTQ19NU0spCisjZGVmaW5lIFBIWV9NX0VDX01fRFNDKHgpCSgodTE2KSh4KTw8MTAgJiBQSFlfTV9FQ19NX0RTQ19NU0spCiAJCQkJCS8qIDAwPTF4OyAwMT0yeDsgMTA9M3g7IDExPTR4ICovCi0jZGVmaW5lIFBIWV9NX0VDX1NfRFNDKHgpCSgoeCk8PDggJiBQSFlfTV9FQ19TX0RTQ19NU0spCisjZGVmaW5lIFBIWV9NX0VDX1NfRFNDKHgpCSgodTE2KSh4KTw8OCAmIFBIWV9NX0VDX1NfRFNDX01TSykKIAkJCQkJLyogMDA9ZGlzOyAwMT0xeDsgMTA9Mng7IDExPTN4ICovCi0jZGVmaW5lIFBIWV9NX0VDX0RTQ18yKHgpCSgoeCk8PDkgJiBQSFlfTV9FQ19NX0RTQ19NU0syKQorI2RlZmluZSBQSFlfTV9FQ19EU0NfMih4KQkoKHUxNikoeCk8PDkgJiBQSFlfTV9FQ19NX0RTQ19NU0syKQogCQkJCQkvKiAwMDA9MXg7IDAwMT0yeDsgMDEwPTN4OyAwMTE9NHggKi8KLSNkZWZpbmUgUEhZX01fRUNfTUFDX1MoeCkJKCh4KTw8NCAmIFBIWV9NX0VDX01BQ19TX01TSykKKyNkZWZpbmUgUEhZX01fRUNfTUFDX1MoeCkJKCh1MTYpKHgpPDw0ICYgUEhZX01fRUNfTUFDX1NfTVNLKQogCQkJCQkvKiAwMVg9MDsgMTEwPTIuNTsgMTExPTI1IChNSHopICovCiAKIC8qIGZvciBZdWtvbi0yIEdpZ2FiaXQgRXRoZXJuZXQgUEhZICg4OEUxMTEyIG9ubHkpICovCkBAIC0xMTY4LDcgKzExNzQsNyBAQAogfTsKIC8qICEhISBFcnJhdGEgaW4gc3BlYy4gKDEgPSBkaXNhYmxlKSAqLwogCi0jZGVmaW5lIFBIWV9NX1BDX0RTQyh4KQkJCSgoKHgpPDwxMikgJiBQSFlfTV9QQ19EU0NfTVNLKQorI2RlZmluZSBQSFlfTV9QQ19EU0MoeCkJCQkoKCh1MTYpKHgpPDwxMikgJiBQSFlfTV9QQ19EU0NfTVNLKQogCQkJCQkJCQkJCQkvKiAxMDA9NXg7IDEwMT02eDsgMTEwPTd4OyAxMTE9OHggKi8KIGVudW0gewogCU1BQ19UWF9DTEtfMF9NSFoJPSAyLApAQCAtMTE5OCw3ICsxMjA0LDcgQEAKIAlQSFlfTV9MRURDX1RYX0NfTVNCCT0gMTw8MCwgLyogVHggQ29udHJvbCAoTVNCLCA4OEUxMTExIG9ubHkpICovCiB9OwogCi0jZGVmaW5lIFBIWV9NX0xFRF9QVUxTX0RVUih4KQkoKCh4KTw8MTIpICYgUEhZX01fTEVEQ19QVUxTX01TSykKKyNkZWZpbmUgUEhZX01fTEVEX1BVTFNfRFVSKHgpCSgoKHUxNikoeCk8PDEyKSAmIFBIWV9NX0xFRENfUFVMU19NU0spCiAKIC8qKioqKiAgUEhZX01BUlZfUEhZX1NUQVQgKHBhZ2UgMykxNiBiaXQgci93CVBvbGFyaXR5IENvbnRyb2wgUmVnLiAqKioqKi8KIGVudW0gewpAQCAtMTIyOCw3ICsxMjM0LDcgQEAKIAlQVUxTXzEzMDBNUwk9IDcsLyogMS4zIHMgdG8gMi43IHMgKi8KIH07CiAKLSNkZWZpbmUgUEhZX01fTEVEX0JMSU5LX1JUKHgpCSgoKHgpPDw4KSAmIFBIWV9NX0xFRENfQkxfUl9NU0spCisjZGVmaW5lIFBIWV9NX0xFRF9CTElOS19SVCh4KQkoKCh1MTYpKHgpPDw4KSAmIFBIWV9NX0xFRENfQkxfUl9NU0spCiAKIGVudW0gewogCUJMSU5LXzQyTVMJPSAwLC8qIDQyIG1zICovCkBAIC0xMjM4LDIxICsxMjQ0LDE4IEBACiAJQkxJTktfNjcwTVMJPSA0LC8qIDY3MCBtcyAqLwogfTsKIAotLyoqKioqICBQSFlfTUFSVl9MRURfT1ZFUgkxNiBiaXQgci93CU1hbnVhbCBMRUQgT3ZlcnJpZGUgUmVnICoqKioqLwotI2RlZmluZSBQSFlfTV9MRURfTU9fU0dNSUkoeCkJKCh4KTw8MTQpIC8qIEJpdCAxNS4uMTQ6ICBTR01JSSBBTiBUaW1lciAqLwotCQkJCQkJCQkJCS8qIEJpdCAxMy4uMTI6CXJlc2VydmVkICovCi0jZGVmaW5lIFBIWV9NX0xFRF9NT19EVVAoeCkJKCh4KTw8MTApIC8qIEJpdCAxMS4uMTA6ICBEdXBsZXggKi8KLSNkZWZpbmUgUEhZX01fTEVEX01PXzEwKHgpCSgoeCk8PDgpIC8qIEJpdCAgOS4uIDg6ICBMaW5rIDEwICovCi0jZGVmaW5lIFBIWV9NX0xFRF9NT18xMDAoeCkJKCh4KTw8NikgLyogQml0ICA3Li4gNjogIExpbmsgMTAwICovCi0jZGVmaW5lIFBIWV9NX0xFRF9NT18xMDAwKHgpCSgoeCk8PDQpIC8qIEJpdCAgNS4uIDQ6ICBMaW5rIDEwMDAgKi8KLSNkZWZpbmUgUEhZX01fTEVEX01PX1JYKHgpCSgoeCk8PDIpIC8qIEJpdCAgMy4uIDI6ICBSeCAqLwotI2RlZmluZSBQSFlfTV9MRURfTU9fVFgoeCkJKCh4KTw8MCkgLyogQml0ICAxLi4gMDogIFR4ICovCi0KKy8qKioqIFBIWV9NQVJWX0xFRF9PVkVSICAgIDE2IGJpdCByL3cgTEVEIGNvbnRyb2wgKi8KIGVudW0gewotCU1PX0xFRF9OT1JNCT0gMCwKLQlNT19MRURfQkxJTksJPSAxLAotCU1PX0xFRF9PRkYJPSAyLAotCU1PX0xFRF9PTgk9IDMsCisJUEhZX01fTEVEX01PX0RVUCAgPSAzPDwxMCwvKiBCaXQgMTEuLjEwOiAgRHVwbGV4ICovCisJUEhZX01fTEVEX01PXzEwCSAgPSAzPDw4LCAvKiBCaXQgIDkuLiA4OiAgTGluayAxMCAqLworCVBIWV9NX0xFRF9NT18xMDAgID0gMzw8NiwgLyogQml0ICA3Li4gNjogIExpbmsgMTAwICovCisJUEhZX01fTEVEX01PXzEwMDAgPSAzPDw0LCAvKiBCaXQgIDUuLiA0OiAgTGluayAxMDAwICovCisJUEhZX01fTEVEX01PX1JYCSAgPSAzPDwyLCAvKiBCaXQgIDMuLiAyOiAgUnggKi8KKwlQSFlfTV9MRURfTU9fVFgJICA9IDM8PDAsIC8qIEJpdCAgMS4uIDA6ICBUeCAqLworCisJUEhZX01fTEVEX0FMTAkgID0gUEhZX01fTEVEX01PX0RVUCB8IFBIWV9NX0xFRF9NT18xMCAKKwkJCSAgICB8IFBIWV9NX0xFRF9NT18xMDAgfCBQSFlfTV9MRURfTU9fMTAwMAorCQkJICAgIHwgUEhZX01fTEVEX01PX1JYLAogfTsKIAogLyoqKioqICBQSFlfTUFSVl9FWFRfQ1RSTF8yCTE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgQ3RybCAyICoqKioqLwpAQCAtMTI4OSw5ICsxMjkyLDkgQEAKIAlQSFlfTV9GRUxQX0xFRDBfTVNLID0gMHhmLCAvKiBCaXQgIDMuLiAwOiBMRUQwIE1hc2sgKFNQRUVEKSAqLwogfTsKIAotI2RlZmluZSBQSFlfTV9GRUxQX0xFRDJfQ1RSTCh4KQkoKCh4KTw8OCkgJiBQSFlfTV9GRUxQX0xFRDJfTVNLKQotI2RlZmluZSBQSFlfTV9GRUxQX0xFRDFfQ1RSTCh4KQkoKCh4KTw8NCkgJiBQSFlfTV9GRUxQX0xFRDFfTVNLKQotI2RlZmluZSBQSFlfTV9GRUxQX0xFRDBfQ1RSTCh4KQkoKCh4KTw8MCkgJiBQSFlfTV9GRUxQX0xFRDBfTVNLKQorI2RlZmluZSBQSFlfTV9GRUxQX0xFRDJfQ1RSTCh4KQkoKCh1MTYpKHgpPDw4KSAmIFBIWV9NX0ZFTFBfTEVEMl9NU0spCisjZGVmaW5lIFBIWV9NX0ZFTFBfTEVEMV9DVFJMKHgpCSgoKHUxNikoeCk8PDQpICYgUEhZX01fRkVMUF9MRUQxX01TSykKKyNkZWZpbmUgUEhZX01fRkVMUF9MRUQwX0NUUkwoeCkJKCgodTE2KSh4KTw8MCkgJiBQSFlfTV9GRUxQX0xFRDBfTVNLKQogCiBlbnVtIHsKIAlMRURfUEFSX0NUUkxfQ09MWAk9IDB4MDAsCkBAIC0xNTQ3LDggKzE1NTAsOCBAQAogCUdNX1NNSV9DVF9CVVNZCQk9IDE8PDMsCS8qIEJpdCAgMzoJQnVzeSAoT3BlcmF0aW9uIGluIHByb2dyZXNzKSAqLwogfTsKIAotI2RlZmluZSBHTV9TTUlfQ1RfUEhZX0FEKHgpCSgoKHgpPDwxMSkgJiBHTV9TTUlfQ1RfUEhZX0FfTVNLKQotI2RlZmluZSBHTV9TTUlfQ1RfUkVHX0FEKHgpCSgoKHgpPDw2KSAmIEdNX1NNSV9DVF9SRUdfQV9NU0spCisjZGVmaW5lIEdNX1NNSV9DVF9QSFlfQUQoeCkJKCgodTE2KSh4KTw8MTEpICYgR01fU01JX0NUX1BIWV9BX01TSykKKyNkZWZpbmUgR01fU01JX0NUX1JFR19BRCh4KQkoKCh1MTYpKHgpPDw2KSAmIEdNX1NNSV9DVF9SRUdfQV9NU0spCiAKIC8qCUdNX1BIWV9BRERSCQkJCTE2IGJpdCByL3cJR1BIWSBBZGRyZXNzIFJlZ2lzdGVyICovCiBlbnVtIHsKQEAgLTE1NzYsNyArMTU3OSw3IEBACiAKIAlHTVJfRlNfQU5ZX0VSUgk9IEdNUl9GU19SWF9GRl9PViB8IEdNUl9GU19DUkNfRVJSIHwKIAkJCSAgR01SX0ZTX0ZSQUdNRU5UIHwgR01SX0ZTX0xPTkdfRVJSIHwKLQkJICAJICBHTVJfRlNfTUlJX0VSUiB8IEdNUl9GU19CQURfRkMgfAorCQkgIAkgIEdNUl9GU19NSUlfRVJSIHwgR01SX0ZTX0dPT0RfRkMgfCBHTVJfRlNfQkFEX0ZDIHwKIAkJCSAgR01SX0ZTX1VOX1NJWkUgfCBHTVJfRlNfSkFCQkVSLAogfTsKIApAQCAtMTgyOCw2ICsxODMxLDEzIEBACiAJZG1hX2FkZHJfdAlmcmFnX2FkZHJbRVRIX0pVTUJPX01UVSA+PiBQQUdFX1NISUZUXTsKIH07CiAKK2VudW0gZmxvd19jb250cm9sIHsKKwlGQ19OT05FCT0gMCwKKwlGQ19UWAk9IDEsCisJRkNfUlgJPSAyLAorCUZDX0JPVEgJPSAzLAorfTsKKwogc3RydWN0IHNreTJfcG9ydCB7CiAJc3RydWN0IHNreTJfaHcJICAgICAqaHc7CiAJc3RydWN0IG5ldF9kZXZpY2UgICAgKm5ldGRldjsKQEAgLTE4NjAsMTMgKzE4NzAsMTMgQEAKIAogCWRtYV9hZGRyX3QJICAgICByeF9sZV9tYXA7CiAJZG1hX2FkZHJfdAkgICAgIHR4X2xlX21hcDsKLQl1MzIJCSAgICAgYWR2ZXJ0aXNpbmc7CS8qIEFEVkVSVElTRURfIGJpdHMgKi8KKwl1MTYJCSAgICAgYWR2ZXJ0aXNpbmc7CS8qIEFEVkVSVElTRURfIGJpdHMgKi8KIAl1MTYJCSAgICAgc3BlZWQ7CS8qIFNQRUVEXzEwMDAsIFNQRUVEXzEwMCwgLi4uICovCiAJdTgJCSAgICAgYXV0b25lZzsJLyogQVVUT05FR19FTkFCTEUsIEFVVE9ORUdfRElTQUJMRSAqLwogCXU4CQkgICAgIGR1cGxleDsJLyogRFVQTEVYX0hBTEYsIERVUExFWF9GVUxMICovCi0JdTgJCSAgICAgcnhfcGF1c2U7Ci0JdTgJCSAgICAgdHhfcGF1c2U7CiAJdTgJCSAgICAgcnhfY3N1bTsKKyAJZW51bSBmbG93X2NvbnRyb2wgICAgZmxvd19tb2RlOworIAllbnVtIGZsb3dfY29udHJvbCAgICBmbG93X3N0YXR1czsKIAogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKIApAQCAtMTg4OCw3ICsxODk4LDcgQEAKIAlkbWFfYWRkcl90ICAgCSAgICAgc3RfZG1hOwogCiAJc3RydWN0IHRpbWVyX2xpc3QgICAgaWRsZV90aW1lcjsKLQlpbnQJCSAgICAgbXNpX2RldGVjdGVkOworCWludAkJICAgICBtc2k7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgICAgbXNpX3dhaXQ7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbGlwLmMgYi9kcml2ZXJzL25ldC9zbGlwLmMKaW5kZXggMzljMjE1Mi4uYTA4MDZkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2xpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3NsaXAuYwpAQCAtMjI5LDEwICsyMjksMTAgQEAKIAlpZiAobGVuIDwgNTc2ICogMikKIAkJbGVuID0gNTc2ICogMjsKIAotCXhidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyAobGVuICsgNCwgR0ZQX0FUT01JQyk7Ci0JcmJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jIChsZW4gKyA0LCBHRlBfQVRPTUlDKTsKKwl4YnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0FUT01JQyk7CisJcmJ1ZmYgPSBrbWFsbG9jKGxlbiArIDQsIEdGUF9BVE9NSUMpOwogI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKLQljYnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MgKGxlbiArIDQsIEdGUF9BVE9NSUMpOworCWNidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfQVRPTUlDKTsKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKaW5kZXggODg5ZWYwZC4uZDcwYmM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKQEAgLTU5Myw3ICs1OTMsNyBAQAogCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CiB9CiAKLXZvaWQKK3ZvaWQgX19leGl0CiBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWludCB0aGlzX2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYTMyLmMgYi9kcml2ZXJzL25ldC9zbWMtdWx0cmEzMi5jCmluZGV4IGUxMDc1NWUuLjJjNTMxOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYTMyLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhMzIuYwpAQCAtNDM3LDcgKzQzNyw3IEBACiAJcmV0dXJuIC1FTlhJTzsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgdGhpc19kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxOTQuYyBiL2RyaXZlcnMvbmV0L3NtYzkxOTQuYwppbmRleCBjMGQxM2Q2Li5iZDZlODQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MTk0LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTE5NC5jCkBAIC0xNjE2LDcgKzE2MTYsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit2b2lkIF9fZXhpdCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldlNNQzkxOTQpOwogCWZyZWVfaXJxKGRldlNNQzkxOTQtPmlycSwgZGV2U01DOTE5NCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguYyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCmluZGV4IDk1YjY0NzguLmU2MmE5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCkBAIC0yMTAsNiArMjEwLDcgQEAKIAogCS8qIHdvcmsgcXVldWUgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcGh5X2NvbmZpZ3VyZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludAl3b3JrX3BlbmRpbmc7CiAKIAlzcGlubG9ja190IGxvY2s7CkBAIC0xMTE0LDEwICsxMTE1LDExIEBACiAgKiBvZiBhdXRvbmVnb3RpYXRpb24uKSAgSWYgdGhlIFJQQyBBTkVHIGJpdCBpcyBjbGVhcmVkLCB0aGUgc2VsZWN0aW9uCiAgKiBpcyBjb250cm9sbGVkIGJ5IHRoZSBSUEMgU1BFRUQgYW5kIFJQQyBEUExYIGJpdHMuCiAgKi8KLXN0YXRpYyB2b2lkIHNtY19waHlfY29uZmlndXJlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzbWNfcGh5X2NvbmZpZ3VyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbWNfbG9jYWwsIHBoeV9jb25maWd1cmUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBscC0+ZGV2OwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CiAJaW50IHBoeWFkZHIgPSBscC0+bWlpLnBoeV9pZDsKIAlpbnQgbXlfcGh5X2NhcHM7IC8qIE15IFBIWSBjYXBhYmlsaXRpZXMgKi8KQEAgLTE1OTIsNyArMTU5NCw3IEBACiAKIAkvKiBDb25maWd1cmUgdGhlIFBIWSwgaW5pdGlhbGl6ZSB0aGUgbGluayBzdGF0ZSAqLwogCWlmIChscC0+cGh5X3R5cGUgIT0gMCkKLQkJc21jX3BoeV9jb25maWd1cmUoZGV2KTsKKwkJc21jX3BoeV9jb25maWd1cmUoJmxwLT5waHlfY29uZmlndXJlKTsKIAllbHNlIHsKIAkJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwogCQlzbWNfMTBidF9jaGVja19tZWRpYShkZXYsIDEpOwpAQCAtMTk3Miw3ICsxOTc0LDggQEAKICNlbmRpZgogCiAJdGFza2xldF9pbml0KCZscC0+dHhfdGFzaywgc21jX2hhcmR3YXJlX3NlbmRfcGt0LCAodW5zaWduZWQgbG9uZylkZXYpOwotCUlOSVRfV09SSygmbHAtPnBoeV9jb25maWd1cmUsIHNtY19waHlfY29uZmlndXJlLCBkZXYpOworCUlOSVRfV09SSygmbHAtPnBoeV9jb25maWd1cmUsIHNtY19waHlfY29uZmlndXJlKTsKKwlscC0+ZGV2ID0gZGV2OwogCWxwLT5taWkucGh5X2lkX21hc2sgPSAweDFmOwogCWxwLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKIAlscC0+bWlpLmZvcmNlX21lZGlhID0gMDsKQEAgLTIzMjIsNyArMjMyNSw3IEBACiAJCQlzbWNfcmVzZXQobmRldik7CiAJCQlzbWNfZW5hYmxlKG5kZXYpOwogCQkJaWYgKGxwLT5waHlfdHlwZSAhPSAwKQotCQkJCXNtY19waHlfY29uZmlndXJlKG5kZXYpOworCQkJCXNtY19waHlfY29uZmlndXJlKCZscC0+cGh5X2NvbmZpZ3VyZSk7CiAJCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5kZXYpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTF4LmggYi9kcml2ZXJzL25ldC9zbWM5MXguaAppbmRleCAwYzlmMWU3Li5kMjc2N2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MXguaAorKysgYi9kcml2ZXJzL25ldC9zbWM5MXguaApAQCAtMjM4LDcgKzIzOCw3IEBACiAjZGVmaW5lIFNNQ19DQU5fVVNFXzE2QklUCTEKICNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMAogCi0jZGVmaW5lIFNNQ19pbmIoYSwgcikJCWluYigodTMyKWEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlpbmIoKCh1MzIpYSkgKyAocikpCiAjZGVmaW5lIFNNQ19pbncoYSwgcikJCWludygoKHUzMilhKSArIChyKSkKICNkZWZpbmUgU01DX291dGIodiwgYSwgcikJb3V0Yih2LCAoKHUzMilhKSArIChyKSkKICNkZWZpbmUgU01DX291dHcodiwgYSwgcikJb3V0dyh2LCAoKHUzMilhKSArIChyKSkKQEAgLTM2Miw2MCArMzYyLDYgQEAKIAogI2RlZmluZSBTTUNfSVJRX0ZMQUdTCQkoMCkKIAotI2VsaWYJZGVmaW5lZChDT05GSUdfQVJDSF9WRVJTQVRJTEUpCi0KLSNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkxCi0jZGVmaW5lIFNNQ19DQU5fVVNFXzE2QklUCTEKLSNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMQotI2RlZmluZSBTTUNfTk9XQUlUCQkxCi0KLSNkZWZpbmUgU01DX2luYihhLCByKQkJcmVhZGIoKGEpICsgKHIpKQotI2RlZmluZSBTTUNfaW53KGEsIHIpCQlyZWFkdygoYSkgKyAocikpCi0jZGVmaW5lIFNNQ19pbmwoYSwgcikJCXJlYWRsKChhKSArIChyKSkKLSNkZWZpbmUgU01DX291dGIodiwgYSwgcikJd3JpdGViKHYsIChhKSArIChyKSkKLSNkZWZpbmUgU01DX291dHcodiwgYSwgcikJd3JpdGV3KHYsIChhKSArIChyKSkKLSNkZWZpbmUgU01DX291dGwodiwgYSwgcikJd3JpdGVsKHYsIChhKSArIChyKSkKLSNkZWZpbmUgU01DX2luc2woYSwgciwgcCwgbCkJcmVhZHNsKChhKSArIChyKSwgcCwgbCkKLSNkZWZpbmUgU01DX291dHNsKGEsIHIsIHAsIGwpCXdyaXRlc2woKGEpICsgKHIpLCBwLCBsKQotCi0jZGVmaW5lIFNNQ19JUlFfRkxBR1MJCSgwKQotCi0jZWxpZglkZWZpbmVkKENPTkZJR19BUkNIX1ZFUlNBVElMRSkKLQotI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKLSNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQotI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkxCi0jZGVmaW5lIFNNQ19OT1dBSVQJCTEKLQotI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlyZWFkYigoYSkgKyAocikpCi0jZGVmaW5lIFNNQ19pbncoYSwgcikJCXJlYWR3KChhKSArIChyKSkKLSNkZWZpbmUgU01DX2lubChhLCByKQkJcmVhZGwoKGEpICsgKHIpKQotI2RlZmluZSBTTUNfb3V0Yih2LCBhLCByKQl3cml0ZWIodiwgKGEpICsgKHIpKQotI2RlZmluZSBTTUNfb3V0dyh2LCBhLCByKQl3cml0ZXcodiwgKGEpICsgKHIpKQotI2RlZmluZSBTTUNfb3V0bCh2LCBhLCByKQl3cml0ZWwodiwgKGEpICsgKHIpKQotI2RlZmluZSBTTUNfaW5zbChhLCByLCBwLCBsKQlyZWFkc2woKGEpICsgKHIpLCBwLCBsKQotI2RlZmluZSBTTUNfb3V0c2woYSwgciwgcCwgbCkJd3JpdGVzbCgoYSkgKyAociksIHAsIGwpCi0KLSNkZWZpbmUgU01DX0lSUV9GTEFHUwkJKDApCi0KLSNlbGlmCWRlZmluZWQoQ09ORklHX0FSQ0hfVkVSU0FUSUxFKQotCi0jZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMQotI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCi0jZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTEKLSNkZWZpbmUgU01DX05PV0FJVAkJMQotCi0jZGVmaW5lIFNNQ19pbmIoYSwgcikJCXJlYWRiKChhKSArIChyKSkKLSNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQotI2RlZmluZSBTTUNfaW5sKGEsIHIpCQlyZWFkbCgoYSkgKyAocikpCi0jZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCXdyaXRlYih2LCAoYSkgKyAocikpCi0jZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCXdyaXRldyh2LCAoYSkgKyAocikpCi0jZGVmaW5lIFNNQ19vdXRsKHYsIGEsIHIpCXdyaXRlbCh2LCAoYSkgKyAocikpCi0jZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpCXJlYWRzbCgoYSkgKyAociksIHAsIGwpCi0jZGVmaW5lIFNNQ19vdXRzbChhLCByLCBwLCBsKQl3cml0ZXNsKChhKSArIChyKSwgcCwgbCkKLQotI2RlZmluZSBTTUNfSVJRX0ZMQUdTCQkoMCkKLQogI2Vsc2UKIAogI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKQEAgLTExOTgsNyArMTE0NCw3IEBACiAJCWlmIChTTUNfQ0FOX1VTRV8zMkJJVCkgewkJCQlcCiAJCQl2b2lkICpfX3B0ciA9IChwKTsJCQkJXAogCQkJaW50IF9fbGVuID0gKGwpOwkJCQlcCi0JCQl2b2lkICpfX2lvYWRkciA9IGlvYWRkcjsJCQlcCisJCQl2b2lkIF9faW9tZW0gKl9faW9hZGRyID0gaW9hZGRyOwkJXAogCQkJaWYgKF9fbGVuID49IDIgJiYgKHVuc2lnbmVkIGxvbmcpX19wdHIgJiAyKSB7CVwKIAkJCQlfX2xlbiAtPSAyOwkJCQlcCiAJCQkJU01DX291dHcoKih1MTYgKilfX3B0ciwgaW9hZGRyLCBEQVRBX1JFRyk7IFwKQEAgLTEyMjIsNyArMTE2OCw3IEBACiAJCWlmIChTTUNfQ0FOX1VTRV8zMkJJVCkgewkJCQlcCiAJCQl2b2lkICpfX3B0ciA9IChwKTsJCQkJXAogCQkJaW50IF9fbGVuID0gKGwpOwkJCQlcCi0JCQl2b2lkICpfX2lvYWRkciA9IGlvYWRkcjsJCQlcCisJCQl2b2lkIF9faW9tZW0gKl9faW9hZGRyID0gaW9hZGRyOwkJXAogCQkJaWYgKCh1bnNpZ25lZCBsb25nKV9fcHRyICYgMikgewkJCVwKIAkJCQkvKgkJCQkJXAogCQkJCSAqIFdlIHdhbnQgMzJiaXQgYWxpZ25tZW50IGhlcmUuCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwppbmRleCA0MTgxMzhkLi5lYmI2YWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCkBAIC04OCwxMiArODgsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdTMyCiBzcGlkZXJfbmV0X3JlYWRfcmVnKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsIHUzMiByZWcpCiB7Ci0JdTMyIHZhbHVlOwotCi0JdmFsdWUgPSByZWFkbChjYXJkLT5yZWdzICsgcmVnKTsKLQl2YWx1ZSA9IGxlMzJfdG9fY3B1KHZhbHVlKTsKLQotCXJldHVybiB2YWx1ZTsKKwkvKiBXZSB1c2UgdGhlIHBvd2VycGMgc3BlY2lmaWMgdmFyaWFudHMgaW5zdGVhZCBvZiByZWFkbF9iZSgpIGJlY2F1c2UKKwkgKiB3ZSBrbm93IHNwaWRlcm5ldCBpcyBub3QgYSByZWFsIFBDSSBkZXZpY2UgYW5kIHdlIGNhbiB0aHVzIGF2b2lkIHRoZQorCSAqIHBlcmZvcm1hbmNlIGhpdCBjYXVzZWQgYnkgdGhlIFBDSSB3b3JrYXJvdW5kcy4KKwkgKi8KKwlyZXR1cm4gaW5fYmUzMihjYXJkLT5yZWdzICsgcmVnKTsKIH0KIAogLyoqCkBAIC0xMDUsOCArMTA0LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHNwaWRlcl9uZXRfd3JpdGVfcmVnKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiB2YWx1ZSkKIHsKLQl2YWx1ZSA9IGNwdV90b19sZTMyKHZhbHVlKTsKLQl3cml0ZWwodmFsdWUsIGNhcmQtPnJlZ3MgKyByZWcpOworCS8qIFdlIHVzZSB0aGUgcG93ZXJwYyBzcGVjaWZpYyB2YXJpYW50cyBpbnN0ZWFkIG9mIHdyaXRlbF9iZSgpIGJlY2F1c2UKKwkgKiB3ZSBrbm93IHNwaWRlcm5ldCBpcyBub3QgYSByZWFsIFBDSSBkZXZpY2UgYW5kIHdlIGNhbiB0aHVzIGF2b2lkIHRoZQorCSAqIHBlcmZvcm1hbmNlIGhpdCBjYXVzZWQgYnkgdGhlIFBDSSB3b3JrYXJvdW5kcy4KKwkgKi8KKwlvdXRfYmUzMihjYXJkLT5yZWdzICsgcmVnLCB2YWx1ZSk7CiB9CiAKIC8qKiBzcGlkZXJfbmV0X3dyaXRlX3BoeSAtIHdyaXRlIHRvIHBoeSByZWdpc3RlcgpAQCAtNjQ0LDIwICs2NDYsMTIgQEAKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3I7CiAJZG1hX2FkZHJfdCBidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbGVuZ3RoOwogCi0JbGVuZ3RoID0gc2tiLT5sZW47Ci0JaWYgKGxlbmd0aCA8IEVUSF9aTEVOKSB7Ci0JCWlmIChza2JfcGFkKHNrYiwgRVRIX1pMRU4tbGVuZ3RoKSkKLQkJCXJldHVybiAwOwotCQlsZW5ndGggPSBFVEhfWkxFTjsKLQl9Ci0KLQlidWYgPSBwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBza2ItPmRhdGEsIGxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJYnVmID0gcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihidWYpKSB7CiAJCWlmIChuZXRpZl9tc2dfdHhfZXJyKGNhcmQpICYmIG5ldF9yYXRlbGltaXQoKSkKIAkJCXByX2VycigiY291bGQgbm90IGlvbW11LW1hcCBwYWNrZXQgKCVwLCAlaSkuICIKLQkJCQkgICJEcm9wcGluZyBwYWNrZXRcbiIsIHNrYi0+ZGF0YSwgbGVuZ3RoKTsKKwkJCQkgICJEcm9wcGluZyBwYWNrZXRcbiIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCQljYXJkLT5zcGlkZXJfc3RhdHMudHhfaW9tbXVfbWFwX2Vycm9yKys7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTY2Nyw3ICs2NjEsNyBAQAogCWNhcmQtPnR4X2NoYWluLmhlYWQgPSBkZXNjci0+bmV4dDsKIAogCWRlc2NyLT5idWZfYWRkciA9IGJ1ZjsKLQlkZXNjci0+YnVmX3NpemUgPSBsZW5ndGg7CisJZGVzY3ItPmJ1Zl9zaXplID0gc2tiLT5sZW47CiAJZGVzY3ItPm5leHRfZGVzY3JfYWRkciA9IDA7CiAJZGVzY3ItPnNrYiA9IHNrYjsKIAlkZXNjci0+ZGF0YV9zdGF0dXMgPSAwOwpAQCAtODAyLDggKzc5Niw4IEBACiAKIAkJLyogdW5tYXAgdGhlIHNrYiAqLwogCQlpZiAoc2tiKSB7Ci0JCQlpbnQgbGVuID0gc2tiLT5sZW4gPCBFVEhfWkxFTiA/IEVUSF9aTEVOIDogc2tiLT5sZW47Ci0JCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGJ1Zl9hZGRyLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBidWZfYWRkciwgc2tiLT5sZW4sCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQl9CiAJfQpAQCAtMTY0MSw3ICsxNjM1LDcgQEAKIAkJCSAgICAgU1BJREVSX05FVF9JTlQyX01BU0tfVkFMVUUpOwogCiAJc3BpZGVyX25ldF93cml0ZV9yZWcoY2FyZCwgU1BJREVSX05FVF9HRFRETUFDQ05UUiwKLQkJCSAgICAgU1BJREVSX05FVF9HRFRCU1RBIHwgU1BJREVSX05FVF9HRFREQ0VJRElTKTsKKwkJCSAgICAgU1BJREVSX05FVF9HRFRCU1RBKTsKIH0KIAogLyoqCkBAIC0xOTQ1LDEwICsxOTM5LDExIEBACiAgKiBjYWxsZWQgYXMgdGFzayB3aGVuIHR4IGhhbmdzLCByZXNldHMgaW50ZXJmYWNlIChpZiBpbnRlcmZhY2UgaXMgdXApCiAgKi8KIHN0YXRpYyB2b2lkCi1zcGlkZXJfbmV0X3R4X3RpbWVvdXRfdGFzayh2b2lkICpkYXRhKQorc3BpZGVyX25ldF90eF90aW1lb3V0X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkYXRhOwotCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwaWRlcl9uZXRfY2FyZCwgdHhfdGltZW91dF90YXNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gY2FyZC0+bmV0ZGV2OwogCiAJaWYgKCEobmV0ZGV2LT5mbGFncyAmIElGRl9VUCkpCiAJCWdvdG8gb3V0OwpAQCAtMjEyMiw3ICsyMTE3LDcgQEAKIAljYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAljYXJkLT5uZXRkZXYgPSBuZXRkZXY7CiAJY2FyZC0+bXNnX2VuYWJsZSA9IFNQSURFUl9ORVRfREVGQVVMVF9NU0c7Ci0JSU5JVF9XT1JLKCZjYXJkLT50eF90aW1lb3V0X3Rhc2ssIHNwaWRlcl9uZXRfdHhfdGltZW91dF90YXNrLCBuZXRkZXYpOworCUlOSVRfV09SSygmY2FyZC0+dHhfdGltZW91dF90YXNrLCBzcGlkZXJfbmV0X3R4X3RpbWVvdXRfdGFzayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+d2FpdHEpOwogCWF0b21pY19zZXQoJmNhcmQtPnR4X3RpbWVvdXRfdGFza19jb3VudGVyLCAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oCmluZGV4IGIzYjQ2MTEuLjNlMTk2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaAorKysgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmgKQEAgLTI0LDcgKzI0LDcgQEAKICNpZm5kZWYgX1NQSURFUl9ORVRfSAogI2RlZmluZSBfU1BJREVSX05FVF9ICiAKLSNkZWZpbmUgVkVSU0lPTiAiMS4xIEEiCisjZGVmaW5lIFZFUlNJT04gIjEuNiBBIgogCiAjaW5jbHVkZSAic3VuZ2VtX3BoeS5oIgogCkBAIC0yMTcsOCArMjE3LDcgQEAKICNkZWZpbmUgU1BJREVSX05FVF9HRFRCU1RBICAgICAgICAgICAgIDB4MDAwMDAzMDAKICNkZWZpbmUgU1BJREVSX05FVF9HRFREQ0VJRElTICAgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgU1BJREVSX05FVF9ETUFfVFhfVkFMVUUgICAgICAgIFNQSURFUl9ORVRfVFhfRE1BX0VOIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJREVSX05FVF9HRFRCU1RBIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJREVSX05FVF9HRFREQ0VJRElTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElERVJfTkVUX0dEVEJTVEEKIAogI2RlZmluZSBTUElERVJfTkVUX0RNQV9UWF9GRU5EX1ZBTFVFCTB4MDAwMzAwMDMKIApAQCAtMzI4LDcgKzMyNyw4IEBACiAJU1BJREVSX05FVF9HUklTUEROR0lOVAogfTsKIAotI2RlZmluZSBTUElERVJfTkVUX1RYSU5UCSggKDEgPDwgU1BJREVSX05FVF9HRFRGRENJTlQpICkKKyNkZWZpbmUgU1BJREVSX05FVF9UWElOVAkoICgxIDw8IFNQSURFUl9ORVRfR0RURkRDSU5UKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgU1BJREVSX05FVF9HRFREQ0VJTlQpICkKIAogLyogV2UgcmVseSBvbiBmbGFnZ2VkIGRlc2NyaXB0b3IgaW50ZXJydXB0cyAqLwogI2RlZmluZSBTUElERVJfTkVUX1JYSU5UCSggKDEgPDwgU1BJREVSX05FVF9HREFGRENJTlQpICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCmluZGV4IDdhMGFlZTYuLmJmODczZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKKysrIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CQkvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCmluZGV4IGI4NjVkYjMuLmM2MmU4NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTk0NCw3ICs5NDUsNyBAQAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnN1bjNsYW5jZV9kZXY7CiAKLWludCBpbml0X21vZHVsZSh2b2lkKQoraW50IF9faW5pdCBpbml0X21vZHVsZSh2b2lkKQogewogCXN1bjNsYW5jZV9kZXYgPSBzdW4zbGFuY2VfcHJvYmUoLTEpOwogCWlmIChJU19FUlIoc3VuM2xhbmNlX2RldikpCkBAIC05NTIsNyArOTUzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQordm9pZCBfX2V4aXQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX25ldGRldihzdW4zbGFuY2VfZGV2KTsKICNpZmRlZiBDT05GSUdfU1VOMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuYm1hYy5jIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5jCmluZGV4IDY0MzliMGMuLjE4Zjg4ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuYworKysgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKQEAgLTQyLDcgKzQyLDcgQEAKICNkZWZpbmUgRFJWX1JFTERBVEUJIjExLzI0LzAzIgogI2RlZmluZSBEUlZfQVVUSE9SCSJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pIgogCi1zdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQogCURSVl9OQU1FICIuYzp2IiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiAiIERSVl9BVVRIT1IgIlxuIjsKIAogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKaW5kZXggNDFjNTAzZC4uYzA2ZWNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCkBAIC0yNjQsOCArMjY0LDYgQEAKIAlBU0lDQ3RybCA9IDB4MzAsCiAJRUVEYXRhID0gMHgzNCwKIAlFRUN0cmwgPSAweDM2LAotCVR4U3RhcnRUaHJlc2ggPSAweDNjLAotCVJ4RWFybHlUaHJlc2ggPSAweDNlLAogCUZsYXNoQWRkciA9IDB4NDAsCiAJRmxhc2hEYXRhID0gMHg0NCwKIAlUeFN0YXR1cyA9IDB4NDYsCkBAIC03OTAsNiArNzg4LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKIAkvKiBEbyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjaGlwPz8/ICovCkBAIC04MzQsNiArODMzLDEwIEBACiAJCWlvd3JpdGU4KDB4MDEsIGlvYWRkciArIERlYnVnQ3RybDEpOwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKKwlyZXNldF90eChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CisKIAlpb3dyaXRlMTYgKFN0YXRzRW5hYmxlIHwgUnhFbmFibGUgfCBUeEVuYWJsZSwgaW9hZGRyICsgTUFDQ3RybDEpOwogCiAJaWYgKG5ldGlmX21zZ19pZnVwKG5wKSkKQEAgLTEwODEsNiArMTA4NCw4IEBACiAKIAkvKiBmcmVlIGFsbCB0eCBza2J1ZmYgKi8KIAlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjID0gMDsKKwogCQlza2IgPSBucC0+dHhfc2tidWZmW2ldOwogCQlpZiAoc2tiKSB7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LApAQCAtMTA5Niw2ICsxMTAxLDEwIEBACiAJfQogCW5wLT5jdXJfdHggPSBucC0+ZGlydHlfdHggPSAwOwogCW5wLT5jdXJfdGFzayA9IDA7CisKKwlucC0+bGFzdF90eCA9IE5VTEw7CisJaW93cml0ZTgoMTI3LCBpb2FkZHIgKyBUeERNQVBvbGxQZXJpb2QpOworCiAJaW93cml0ZTE2IChTdGF0c0VuYWJsZSB8IFJ4RW5hYmxlIHwgVHhFbmFibGUsIGlvYWRkciArIE1BQ0N0cmwxKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExMTEsNiArMTEyMCw3IEBACiAJaW50IHR4X2NudDsKIAlpbnQgdHhfc3RhdHVzOwogCWludCBoYW5kbGVkID0gMDsKKwlpbnQgaTsKIAogCiAJZG8gewpAQCAtMTE1MywyMSArMTE2MywyNCBAQAogCQkJCQkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CiAJCQkJCWlmICh0eF9zdGF0dXMgJiAweDAyKQogCQkJCQkJbnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwogCQkJCQkvKgogCQkJCQkqKiBUaGlzIHJlc2V0IGhhcyBiZWVuIHZlcmlmaWVkIG9uCiAJCQkJCSoqIERGRS01ODBUWCBib2FyZHMgISBwaGRtQG1hY3FlbC5iZS4KIAkJCQkJKi8KIAkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MTApIHsJLyogVHhVbmRlcnJ1biAqLwotCQkJCQkJdW5zaWduZWQgc2hvcnQgdHh0aHJlc2hvbGQ7Ci0KLQkJCQkJCXR4dGhyZXNob2xkID0gaW9yZWFkMTYgKGlvYWRkciArIFR4U3RhcnRUaHJlc2gpOwogCQkJCQkJLyogUmVzdGFydCBUeCBGSUZPIGFuZCB0cmFuc21pdHRlciAqLwogCQkJCQkJc3VuZGFuY2VfcmVzZXQoZGV2LCAoTmV0d29ya1Jlc2V0fEZJRk9SZXNldHxUeFJlc2V0KSA8PCAxNik7Ci0JCQkJCQlpb3dyaXRlMTYgKHR4dGhyZXNob2xkLCBpb2FkZHIgKyBUeFN0YXJ0VGhyZXNoKTsKIAkJCQkJCS8qIE5vIG5lZWQgdG8gcmVzZXQgdGhlIFR4IHBvaW50ZXIgaGVyZSAqLwogCQkJCQl9Ci0JCQkJCS8qIFJlc3RhcnQgdGhlIFR4LiAqLwotCQkJCQlpb3dyaXRlMTYgKFR4RW5hYmxlLCBpb2FkZHIgKyBNQUNDdHJsMSk7CisJCQkJCS8qIFJlc3RhcnQgdGhlIFR4LiBOZWVkIHRvIG1ha2Ugc3VyZSB0eCBlbmFibGVkICovCisJCQkJCWkgPSAxMDsKKwkJCQkJZG8geworCQkJCQkJaW93cml0ZTE2KGlvcmVhZDE2KGlvYWRkciArIE1BQ0N0cmwxKSB8IFR4RW5hYmxlLCBpb2FkZHIgKyBNQUNDdHJsMSk7CisJCQkJCQlpZiAoaW9yZWFkMTYoaW9hZGRyICsgTUFDQ3RybDEpICYgVHhFbmFibGVkKQorCQkJCQkJCWJyZWFrOworCQkJCQkJbWRlbGF5KDEpOworCQkJCQl9IHdoaWxlICgtLWkpOwogCQkJCX0KIAkJCQkvKiBZdXAsIHRoaXMgaXMgYSBkb2N1bWVudGF0aW9uIGJ1Zy4gIEl0IGNvc3QgbWUgKmhvdXJzKi4gKi8KIAkJCQlpb3dyaXRlMTYgKDAsIGlvYWRkciArIFR4U3RhdHVzKTsKQEAgLTE2MjksNiArMTY0MiwxNCBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGk7CiAKKwkvKiBXYWl0IGFuZCBraWxsIHRhc2tsZXQgKi8KKwl0YXNrbGV0X2tpbGwoJm5wLT5yeF90YXNrbGV0KTsKKwl0YXNrbGV0X2tpbGwoJm5wLT50eF90YXNrbGV0KTsKKwlucC0+Y3VyX3R4ID0gMDsKKwlucC0+ZGlydHlfdHggPSAwOworCW5wLT5jdXJfdGFzayA9IDA7CisJbnAtPmxhc3RfdHggPSBOVUxMOworCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCiAJaWYgKG5ldGlmX21zZ19pZmRvd24obnApKSB7CkBAIC0xNjQzLDEyICsxNjY0LDI2IEBACiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KIAlpb3dyaXRlMTYoMHgwMDAwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKIAorCS8qIERpc2FibGUgUnggYW5kIFR4IERNQSBmb3Igc2FmZWx5IHJlbGVhc2UgcmVzb3VyY2UgKi8KKwlpb3dyaXRlMzIoMHg1MDAsIGlvYWRkciArIERNQUN0cmwpOworCiAJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCiAJaW93cml0ZTE2KFR4RGlzYWJsZSB8IFJ4RGlzYWJsZSB8IFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgTUFDQ3RybDEpOwogCi0JLyogV2FpdCBhbmQga2lsbCB0YXNrbGV0ICovCi0JdGFza2xldF9raWxsKCZucC0+cnhfdGFza2xldCk7Ci0JdGFza2xldF9raWxsKCZucC0+dHhfdGFza2xldCk7CisgICAgCWZvciAoaSA9IDIwMDA7IGkgPiAwOyBpLS0pIHsKKyAJCWlmICgoaW9yZWFkMzIoaW9hZGRyICsgRE1BQ3RybCkgJiAweGMwMDApID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworICAgIAl9CisKKyAgICAJaW93cml0ZTE2KEdsb2JhbFJlc2V0IHwgRE1BUmVzZXQgfCBGSUZPUmVzZXQgfCBOZXR3b3JrUmVzZXQsCisJCQlpb2FkZHIgK0FTSUNDdHJsICsgMik7CisKKyAgICAJZm9yIChpID0gMjAwMDsgaSA+IDA7IGktLSkgeworIAkJaWYgKChpb3JlYWQxNihpb2FkZHIgKyBBU0lDQ3RybCArMikgJiBSZXNldEJ1c3kpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworICAgIAl9CiAKICNpZmRlZiBfX2kzODZfXwogCWlmIChuZXRpZl9tc2dfaHcobnApKSB7CkBAIC0xNjg2LDYgKzE3MjEsNyBAQAogCQl9CiAJfQogCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MgPSAwOwogCQlza2IgPSBucC0+dHhfc2tidWZmW2ldOwogCQlpZiAoc2tiKSB7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwppbmRleCAyNTNlOTZlLi43ODVlNGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uYworKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xMDMwLDcgKzEwMzEsNyBAQAogCQl1NjQgY3N1bV9zdGFydF9vZmYsIGNzdW1fc3R1ZmZfb2ZmOwogCiAJCWNzdW1fc3RhcnRfb2ZmID0gKHU2NCkgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOwotCQljc3VtX3N0dWZmX29mZiA9ICh1NjQpICgoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgLSBza2ItPmRhdGEpOworCQljc3VtX3N0dWZmX29mZiA9IGNzdW1fc3RhcnRfb2ZmICsgc2tiLT5jc3VtX29mZnNldDsKIAogCQljdHJsID0gKFRYRENUUkxfQ0VOQUIgfAogCQkJKGNzdW1fc3RhcnRfb2ZmIDw8IDE1KSB8CkBAIC0yMjgxLDkgKzIyODIsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZ2VtX3Jlc2V0X3Rhc2sodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGdlbV9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZ2VtICpncCA9IChzdHJ1Y3QgZ2VtICopIGRhdGE7CisJc3RydWN0IGdlbSAqZ3AgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGdlbSwgcmVzZXRfdGFzayk7CiAKIAltdXRleF9sb2NrKCZncC0+cG1fbXV0ZXgpOwogCkBAIC0zMDQzLDcgKzMwNDQsNyBAQAogCWdwLT5saW5rX3RpbWVyLmZ1bmN0aW9uID0gZ2VtX2xpbmtfdGltZXI7CiAJZ3AtPmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBncDsKIAotCUlOSVRfV09SSygmZ3AtPnJlc2V0X3Rhc2ssIGdlbV9yZXNldF90YXNrLCBncCk7CisJSU5JVF9XT1JLKCZncC0+cmVzZXRfdGFzaywgZ2VtX3Jlc2V0X3Rhc2spOwogCiAJZ3AtPmxzdGF0ZSA9IGxpbmtfZG93bjsKIAlncC0+dGltZXJfdGlja3MgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9zdW5obWUuYwppbmRleCA5ZDdjZDEzLi5lZjY3MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5obWUuYworKysgYi9kcml2ZXJzL25ldC9zdW5obWUuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTIyNzIsNyArMjI3Myw3IEBACiAJCXUzMiBjc3VtX3N0YXJ0X29mZiwgY3N1bV9zdHVmZl9vZmY7CiAKIAkJY3N1bV9zdGFydF9vZmYgPSAodTMyKSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JCWNzdW1fc3R1ZmZfb2ZmID0gKHUzMikgKChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YSk7CisJCWNzdW1fc3R1ZmZfb2ZmID0gY3N1bV9zdGFydF9vZmYgKyBza2ItPmNzdW1fb2Zmc2V0OwogCiAJCXR4X2ZsYWdzID0gKFRYRkxBR19PV04gfCBUWEZMQUdfQ1NFTkFCTEUgfAogCQkJICAgICgoY3N1bV9zdGFydF9vZmYgPDwgMTQpICYgVFhGTEFHX0NTQlVGQkVHSU4pIHwKQEAgLTMwMTIsNiArMzAxMywxMSBAQAogI2VuZGlmCiAKIAllcnIgPSAtRU5PREVWOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIGVycl9vdXQ7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKIAlpZiAoIXN0cmNtcChwcm9tX25hbWUsICJTVU5XLHFmZSIpIHx8ICFzdHJjbXAocHJvbV9uYW1lLCAicWZlIikpIHsKIAkJcXAgPSBxdWF0dHJvX3BjaV9maW5kKHBkZXYpOwogCQlpZiAocXAgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5jIGIvZHJpdmVycy9uZXQvdGczLmMKaW5kZXggMzI3ODM2Yi4uNTcxMzIwYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC02OCw4ICs2OCw4IEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidGczIgogI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIzLjY2IgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIlNlcHRlbWJlciAyMywgMjAwNiIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIzLjcwIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkRlY2VtYmVyIDEsIDIwMDYiCiAKICNkZWZpbmUgVEczX0RFRl9NQUNfTU9ERQkwCiAjZGVmaW5lIFRHM19ERUZfUlhfTU9ERQkJMApAQCAtMTI5LDcgKzEyOSw3IEBACiAjZGVmaW5lIFJYX0pVTUJPX1BLVF9CVUZfU1oJKDkwNDYgKyB0cC0+cnhfb2Zmc2V0ICsgNjQpCiAKIC8qIG1pbmltdW0gbnVtYmVyIG9mIGZyZWUgVFggZGVzY3JpcHRvcnMgcmVxdWlyZWQgdG8gd2FrZSB1cCBUWCBwcm9jZXNzICovCi0jZGVmaW5lIFRHM19UWF9XQUtFVVBfVEhSRVNICQkoVEczX1RYX1JJTkdfU0laRSAvIDQpCisjZGVmaW5lIFRHM19UWF9XQUtFVVBfVEhSRVNIKHRwKQkJKCh0cCktPnR4X3BlbmRpbmcgLyA0KQogCiAvKiBudW1iZXIgb2YgRVRIVE9PTF9HU1RBVFMgdTY0J3MgKi8KICNkZWZpbmUgVEczX05VTV9TVEFUUwkJKHNpemVvZihzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMpL3NpemVvZih1NjQpKQpAQCAtMTkyLDYgKzE5Miw3IEBACiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4Nil9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3ODcpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181Nzg3TSl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3ODdGKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcxNCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MTRTKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcxNSl9LApAQCAtMTA2MSw3ICsxMDYyLDcgQEAKIHsKIAlzdHJ1Y3QgdGczICp0cF9wZWVyID0gdHA7CiAKLQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FRVBST01fV1JJVEVfUFJPVCkgIT0gMCkKKwlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSVNfTklDKSA9PSAwKQogCQlyZXR1cm47CiAKIAlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB8fApAQCAtMTIxMiw4ICsxMjEzLDggQEAKIAkJCQkgICAgICBwb3dlcl9jb250cm9sKTsKIAkJdWRlbGF5KDEwMCk7CS8qIERlbGF5IGFmdGVyIHBvd2VyIHN0YXRlIGNoYW5nZSAqLwogCi0JCS8qIFN3aXRjaCBvdXQgb2YgVmF1eCBpZiBpdCBpcyBub3QgYSBMT00gKi8KLQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UKSkKKwkJLyogU3dpdGNoIG91dCBvZiBWYXV4IGlmIGl0IGlzIGEgTklDICovCisJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0lTX05JQykKIAkJCXR3MzJfd2FpdF9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwsIDEwMCk7CiAKIAkJcmV0dXJuIDA7CkBAIC0xNDAxLDggKzE0MDIsMTAgQEAKIHN0YXRpYyB2b2lkIHRnM19saW5rX3JlcG9ydChzdHJ1Y3QgdGczICp0cCkKIHsKIAlpZiAoIW5ldGlmX2NhcnJpZXJfb2sodHAtPmRldikpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIGlzIGRvd24uXG4iLCB0cC0+ZGV2LT5uYW1lKTsKLQl9IGVsc2UgeworCQlpZiAobmV0aWZfbXNnX2xpbmsodHApKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBMaW5rIGlzIGRvd24uXG4iLAorCQkJICAgICAgIHRwLT5kZXYtPm5hbWUpOworCX0gZWxzZSBpZiAobmV0aWZfbXNnX2xpbmsodHApKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyB1cCBhdCAlZCBNYnBzLCAlcyBkdXBsZXguXG4iLAogCQkgICAgICAgdHAtPmRldi0+bmFtZSwKIAkJICAgICAgICh0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDAgPwpAQCAtMTU1NywxMiArMTU2MCw2IEBACiAKIAkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKIAl9IGVsc2UgaWYgKHRwLT5saW5rX2NvbmZpZy5zcGVlZCA9PSBTUEVFRF9JTlZBTElEKSB7Ci0JCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9Ci0JCQkoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8Ci0JCQkgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKLQkJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9NSUkpOwotCiAJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpCiAJCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJj0KIAkJCQl+KEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfApAQCAtMTcwNiwyNSArMTcwMywzNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgdGczX2NvcHBlcl9pc19hZHZlcnRpc2luZ19hbGwoc3RydWN0IHRnMyAqdHApCitzdGF0aWMgaW50IHRnM19jb3BwZXJfaXNfYWR2ZXJ0aXNpbmdfYWxsKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbWFzaykKIHsKLQl1MzIgYWR2X3JlZywgYWxsX21hc2s7CisJdTMyIGFkdl9yZWcsIGFsbF9tYXNrID0gMDsKKworCWlmIChtYXNrICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCWFsbF9tYXNrIHw9IEFEVkVSVElTRV8xMEhBTEY7CisJaWYgKG1hc2sgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJYWxsX21hc2sgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAobWFzayAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJYWxsX21hc2sgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKG1hc2sgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCWFsbF9tYXNrIHw9IEFEVkVSVElTRV8xMDBGVUxMOwogCiAJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQURWRVJUSVNFLCAmYWR2X3JlZykpCiAJCXJldHVybiAwOwogCi0JYWxsX21hc2sgPSAoQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfAotCQkgICAgQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCk7CiAJaWYgKChhZHZfcmVnICYgYWxsX21hc2spICE9IGFsbF9tYXNrKQogCQlyZXR1cm4gMDsKIAlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKSB7CiAJCXUzMiB0ZzNfY3RybDsKIAorCQlhbGxfbWFzayA9IDA7CisJCWlmIChtYXNrICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKKwkJCWFsbF9tYXNrIHw9IEFEVkVSVElTRV8xMDAwSEFMRjsKKwkJaWYgKG1hc2sgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQkJYWxsX21hc2sgfD0gQURWRVJUSVNFXzEwMDBGVUxMOworCiAJCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19DVFJMLCAmdGczX2N0cmwpKQogCQkJcmV0dXJuIDA7CiAKLQkJYWxsX21hc2sgPSAoTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEYgfAotCQkJICAgIE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMKTsKIAkJaWYgKCh0ZzNfY3RybCAmIGFsbF9tYXNrKSAhPSBhbGxfbWFzaykKIAkJCXJldHVybiAwOwogCX0KQEAgLTE4ODQsNyArMTg5Miw4IEBACiAJCQkJLyogRm9yY2UgYXV0b25lZyByZXN0YXJ0IGlmIHdlIGFyZSBleGl0aW5nCiAJCQkJICogbG93IHBvd2VyIG1vZGUuCiAJCQkJICovCi0JCQkJaWYgKCF0ZzNfY29wcGVyX2lzX2FkdmVydGlzaW5nX2FsbCh0cCkpCisJCQkJaWYgKCF0ZzNfY29wcGVyX2lzX2FkdmVydGlzaW5nX2FsbCh0cCwKKwkJCQkJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZykpCiAJCQkJCWN1cnJlbnRfbGlua191cCA9IDA7CiAJCQl9IGVsc2UgewogCQkJCWN1cnJlbnRfbGlua191cCA9IDA7CkBAIC0zMDc1LDEwICszMDg0LDEwIEBACiAJc21wX21iKCk7CiAKIAlpZiAodW5saWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZCh0cC0+ZGV2KSAmJgotCQkgICAgICh0ZzNfdHhfYXZhaWwodHApID4gVEczX1RYX1dBS0VVUF9USFJFU0gpKSkgeworCQkgICAgICh0ZzNfdHhfYXZhaWwodHApID4gVEczX1RYX1dBS0VVUF9USFJFU0godHApKSkpIHsKIAkJbmV0aWZfdHhfbG9jayh0cC0+ZGV2KTsKIAkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQodHAtPmRldikgJiYKLQkJICAgICh0ZzNfdHhfYXZhaWwodHApID4gVEczX1RYX1dBS0VVUF9USFJFU0gpKQorCQkgICAgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCh0cCkpKQogCQkJbmV0aWZfd2FrZV9xdWV1ZSh0cC0+ZGV2KTsKIAkJbmV0aWZfdHhfdW5sb2NrKHRwLT5kZXYpOwogCX0KQEAgLTM2NTQsOSArMzY2Myw5IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgdGczX3Jlc2V0X3Rhc2sodm9pZCAqX2RhdGEpCitzdGF0aWMgdm9pZCB0ZzNfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHRnMyAqdHAgPSBfZGF0YTsKKwlzdHJ1Y3QgdGczICp0cCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdGczLCByZXNldF90YXNrKTsKIAl1bnNpZ25lZCBpbnQgcmVzdGFydF90aW1lcjsKIAogCXRnM19mdWxsX2xvY2sodHAsIDApOwpAQCAtMzcwMyw4ICszNzEyLDkgQEAKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsCi0JICAgICAgIGRldi0+bmFtZSk7CisJaWYgKG5ldGlmX21zZ190eF9lcnIodHApKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOwogCiAJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOwogfQpAQCAtMzkyOCw3ICszOTM4LDcgQEAKIAl0cC0+dHhfcHJvZCA9IGVudHJ5OwogCWlmICh1bmxpa2VseSh0ZzNfdHhfYXZhaWwodHApIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJaWYgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCkKKwkJaWYgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCh0cCkpCiAJCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOwogCX0KIApAQCAtNDE0Myw3ICs0MTUzLDcgQEAKIAl0cC0+dHhfcHJvZCA9IGVudHJ5OwogCWlmICh1bmxpa2VseSh0ZzNfdHhfYXZhaWwodHApIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJaWYgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCkKKwkJaWYgKHRnM190eF9hdmFpbCh0cCkgPiBURzNfVFhfV0FLRVVQX1RIUkVTSCh0cCkpCiAJCQluZXRpZl93YWtlX3F1ZXVlKHRwLT5kZXYpOwogCX0KIApAQCAtNDcyOCwxMCArNDczOCwxMSBAQAogCXUzMiB2YWw7CiAKIAlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpIHsKLQkJZm9yIChpID0gMDsgaSA8IDQwMDsgaSsrKSB7CisJCS8qIFdhaXQgdXAgdG8gMjBtcyBmb3IgaW5pdCBkb25lLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKIAkJCWlmICh0cjMyKFZDUFVfU1RBVFVTKSAmIFZDUFVfU1RBVFVTX0lOSVRfRE9ORSkKIAkJCQlyZXR1cm4gMDsKLQkJCXVkZWxheSgxMCk7CisJCQl1ZGVsYXkoMTAwKTsKIAkJfQogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC02MDE0LDcgKzYwMjUsNyBAQAogCQl0ZzNfYWJvcnRfaHcodHAsIDEpOwogCX0KIAotCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9NSUlfU0VSREVTKSAmJiByZXNldF9waHkpCisJaWYgKHJlc2V0X3BoeSkKIAkJdGczX3BoeV9yZXNldCh0cCk7CiAKIAllcnIgPSB0ZzNfY2hpcF9yZXNldCh0cCk7CkBAIC02Mzk1LDE2ICs2NDA2LDE3IEBACiAJdWRlbGF5KDQwKTsKIAogCS8qIHRwLT5ncmNfbG9jYWxfY3RybCBpcyBwYXJ0aWFsbHkgc2V0IHVwIGR1cmluZyB0ZzNfZ2V0X2ludmFyaWFudHMoKS4KLQkgKiBJZiBURzNfRkxBR19FRVBST01fV1JJVEVfUFJPVCBpcyBzZXQsIHdlIHNob3VsZCByZWFkIHRoZQorCSAqIElmIFRHM19GTEcyX0lTX05JQyBpcyB6ZXJvLCB3ZSBzaG91bGQgcmVhZCB0aGUKIAkgKiByZWdpc3RlciB0byBwcmVzZXJ2ZSB0aGUgR1BJTyBzZXR0aW5ncyBmb3IgTE9Ncy4gVGhlIEdQSU9zLAogCSAqIHdoZXRoZXIgdXNlZCBhcyBpbnB1dHMgb3Igb3V0cHV0cywgYXJlIHNldCBieSBib290IGNvZGUgYWZ0ZXIKIAkgKiByZXNldC4KIAkgKi8KLQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UKSB7CisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9JU19OSUMpKSB7CiAJCXUzMiBncGlvX21hc2s7CiAKLQkJZ3Bpb19tYXNrID0gR1JDX0xDTENUUkxfR1BJT19PRTAgfCBHUkNfTENMQ1RSTF9HUElPX09FMiB8Ci0JCQkgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQwIHwgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQyOworCQlncGlvX21hc2sgPSBHUkNfTENMQ1RSTF9HUElPX09FMCB8IEdSQ19MQ0xDVFJMX0dQSU9fT0UxIHwKKwkJCSAgICBHUkNfTENMQ1RSTF9HUElPX09FMiB8IEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMCB8CisJCQkgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxIHwgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQyOwogCiAJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MikKIAkJCWdwaW9fbWFzayB8PSBHUkNfTENMQ1RSTF9HUElPX09FMyB8CkBAIC02NDE2LDggKzY0MjgsOSBAQAogCQl0cC0+Z3JjX2xvY2FsX2N0cmwgfD0gdHIzMihHUkNfTE9DQUxfQ1RSTCkgJiBncGlvX21hc2s7CiAKIAkJLyogR1BJTzEgbXVzdCBiZSBkcml2ZW4gaGlnaCBmb3IgZWVwcm9tIHdyaXRlIHByb3RlY3QgKi8KLQkJdHAtPmdyY19sb2NhbF9jdHJsIHw9IChHUkNfTENMQ1RSTF9HUElPX09FMSB8Ci0JCQkJICAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSk7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1QpCisJCQl0cC0+Z3JjX2xvY2FsX2N0cmwgfD0gKEdSQ19MQ0xDVFJMX0dQSU9fT0UxIHwKKwkJCQkJICAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMSk7CiAJfQogCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsKTsKIAl1ZGVsYXkoMTAwKTsKQEAgLTY1NzQsNyArNjU4Nyw3IEBACiAJCXR3MzIoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCk7CiAJfQogCi0JZXJyID0gdGczX3NldHVwX3BoeSh0cCwgcmVzZXRfcGh5KTsKKwllcnIgPSB0ZzNfc2V0dXBfcGh5KHRwLCAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC02OTc4LDggKzY5OTEsMTAgQEAKIAl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKIAogCWVyciA9IHRnM19zZXRfcG93ZXJfc3RhdGUodHAsIFBDSV9EMCk7Ci0JaWYgKGVycikKKwlpZiAoZXJyKSB7CisJCXRnM19mdWxsX3VubG9jayh0cCk7CiAJCXJldHVybiBlcnI7CisJfQogCiAJdGczX2Rpc2FibGVfaW50cyh0cCk7CiAJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfSU5JVF9DT01QTEVURTsKQEAgLTgxMDYsNyArODEyMSwxMCBAQAogCiAJaWYgKChlcmluZy0+cnhfcGVuZGluZyA+IFRHM19SWF9SSU5HX1NJWkUgLSAxKSB8fAogCSAgICAoZXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPiBURzNfUlhfSlVNQk9fUklOR19TSVpFIC0gMSkgfHwKLQkgICAgKGVyaW5nLT50eF9wZW5kaW5nID4gVEczX1RYX1JJTkdfU0laRSAtIDEpKQorCSAgICAoZXJpbmctPnR4X3BlbmRpbmcgPiBURzNfVFhfUklOR19TSVpFIC0gMSkgfHwKKwkgICAgKGVyaW5nLT50eF9wZW5kaW5nIDw9IE1BWF9TS0JfRlJBR1MpIHx8CisJICAgICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU09fMV9CVUcpICYmCisJICAgICAoZXJpbmctPnR4X3BlbmRpbmcgPD0gKE1BWF9TS0JfRlJBR1MgKiAzKSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKQEAgLTg2NTAsNyArODY2OCw5IEBACiAJcmV0dXJuIDA7CiAKIG91dDoKLQlwcmludGsoS0VSTl9FUlIgUEZYICJSZWdpc3RlciB0ZXN0IGZhaWxlZCBhdCBvZmZzZXQgJXhcbiIsIG9mZnNldCk7CisJaWYgKG5ldGlmX21zZ19odyh0cCkpCisJCXByaW50ayhLRVJOX0VSUiBQRlggIlJlZ2lzdGVyIHRlc3QgZmFpbGVkIGF0IG9mZnNldCAleFxuIiwKKwkJICAgICAgIG9mZnNldCk7CiAJdHczMihvZmZzZXQsIHNhdmVfdmFsKTsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTg3NzUsMTcgKzg3OTUsMjAgQEAKIAkJCQkJdGczX3dyaXRlcGh5KHRwLCAweDEwLCBwaHkgJiB+MHg0MDAwKTsKIAkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRVBIWV9URVNULCBwaHl0ZXN0KTsKIAkJCX0KLQkJfQotCQl2YWwgPSBCTUNSX0xPT1BCQUNLIHwgQk1DUl9GVUxMRFBMWDsKLQkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkKLQkJCXZhbCB8PSBCTUNSX1NQRUVEMTAwOwotCQllbHNlCi0JCQl2YWwgfD0gQk1DUl9TUEVFRDEwMDA7CisJCQl2YWwgPSBCTUNSX0xPT1BCQUNLIHwgQk1DUl9GVUxMRFBMWCB8IEJNQ1JfU1BFRUQxMDA7CisJCX0gZWxzZQorCQkJdmFsID0gQk1DUl9MT09QQkFDSyB8IEJNQ1JfRlVMTERQTFggfCBCTUNSX1NQRUVEMTAwMDsKIAogCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCB2YWwpOwogCQl1ZGVsYXkoNDApOwotCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpCisKKwkJbWFjX21vZGUgPSAodHAtPm1hY19tb2RlICYgfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLKSB8CisJCQkgICBNQUNfTU9ERV9MSU5LX1BPTEFSSVRZOworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpIHsKIAkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FUEhZX1BURVNULCAweDE4MDApOworCQkJbWFjX21vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX01JSTsKKwkJfSBlbHNlCisJCQltYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKIAogCQkvKiByZXNldCB0byBwcmV2ZW50IGxvc2luZyAxc3QgcnggcGFja2V0IGludGVybWl0dGVudGx5ICovCiAJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX01JSV9TRVJERVMpIHsKQEAgLTg3OTMsMTIgKzg4MTYsNiBAQAogCQkJdWRlbGF5KDEwKTsKIAkJCXR3MzJfZihNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOwogCQl9Ci0JCW1hY19tb2RlID0gKHRwLT5tYWNfbW9kZSAmIH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSykgfAotCQkJICAgTUFDX01PREVfTElOS19QT0xBUklUWTsKLQkJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkKLQkJCW1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7Ci0JCWVsc2UKLQkJCW1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOwogCQlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfTUFTSykgPT0gUEhZX0lEX0JDTTU0MDEpIHsKIAkJCW1hY19tb2RlICY9IH5NQUNfTU9ERV9MSU5LX1BPTEFSSVRZOwogCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLApAQCAtOTQ1MCwxNiArOTQ2NywxMiBAQAogLyogQ2hpcHMgb3RoZXIgdGhhbiA1NzAwLzU3MDEgdXNlIHRoZSBOVlJBTSBmb3IgZmV0Y2hpbmcgaW5mby4gKi8KIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfbnZyYW1faW5pdChzdHJ1Y3QgdGczICp0cCkKIHsKLQlpbnQgajsKLQogCXR3MzJfZihHUkNfRUVQUk9NX0FERFIsCiAJICAgICAoRUVQUk9NX0FERFJfRlNNX1JFU0VUIHwKIAkgICAgICAoRUVQUk9NX0RFRkFVTFRfQ0xPQ0tfUEVSSU9EIDw8CiAJICAgICAgIEVFUFJPTV9BRERSX0NMS1BFUkRfU0hJRlQpKSk7CiAKLQkvKiBYWFggc2NoZWR1bGVfdGltZW91dCgpIC4uLiAqLwotCWZvciAoaiA9IDA7IGogPCAxMDA7IGorKykKLQkJdWRlbGF5KDEwKTsKKwltc2xlZXAoMSk7CiAKIAkvKiBFbmFibGUgc2VlcHJvbSBhY2Nlc3Nlcy4gKi8KIAl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsCkBAIC05NTIwLDEyICs5NTMzLDEyIEBACiAJICAgICAgRUVQUk9NX0FERFJfQUREUl9NQVNLKSB8CiAJICAgICBFRVBST01fQUREUl9SRUFEIHwgRUVQUk9NX0FERFJfU1RBUlQpOwogCi0JZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CiAJCXRtcCA9IHRyMzIoR1JDX0VFUFJPTV9BRERSKTsKIAogCQlpZiAodG1wICYgRUVQUk9NX0FERFJfQ09NUExFVEUpCiAJCQlicmVhazsKLQkJdWRlbGF5KDEwMCk7CisJCW1zbGVlcCgxKTsKIAl9CiAJaWYgKCEodG1wICYgRUVQUk9NX0FERFJfQ09NUExFVEUpKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtOTY1MCwxMiArOTY2MywxMiBAQAogCQkJRUVQUk9NX0FERFJfU1RBUlQgfAogCQkJRUVQUk9NX0FERFJfV1JJVEUpOwogCi0JCWZvciAoaiA9IDA7IGogPCAxMDAwMDsgaisrKSB7CisJCWZvciAoaiA9IDA7IGogPCAxMDAwOyBqKyspIHsKIAkJCXZhbCA9IHRyMzIoR1JDX0VFUFJPTV9BRERSKTsKIAogCQkJaWYgKHZhbCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKQogCQkJCWJyZWFrOwotCQkJdWRlbGF5KDEwMCk7CisJCQltc2xlZXAoMSk7CiAJCX0KIAkJaWYgKCEodmFsICYgRUVQUk9NX0FERFJfQ09NUExFVEUpKSB7CiAJCQlyYyA9IC1FQlVTWTsKQEAgLTk5NTksOCArOTk3MiwxMCBAQAogCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1Q7CiAKIAlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpIHsKLQkJaWYgKCEodHIzMihQQ0lFX1RSQU5TQUNUSU9OX0NGRykgJiBQQ0lFX1RSQU5TX0NGR19MT00pKQorCQlpZiAoISh0cjMyKFBDSUVfVFJBTlNBQ1RJT05fQ0ZHKSAmIFBDSUVfVFJBTlNfQ0ZHX0xPTSkpIHsKIAkJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UOworCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfSVNfTklDOworCQl9CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwMDYwLDEwICsxMDA3NSwxNyBAQAogCQkgICAgdHAtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUxMKQogCQkJdHAtPmxlZF9jdHJsID0gTEVEX0NUUkxfTU9ERV9QSFlfMjsKIAotCQlpZiAobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0VFUFJPTV9XUCkKKwkJaWYgKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19FRVBST01fV1ApIHsKIAkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1Q7Ci0JCWVsc2UKKwkJCWlmICgodHAtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0KKwkJCSAgICAgUENJX1ZFTkRPUl9JRF9BUklNQSkgJiYKKwkJCSAgICAodHAtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgyMDVhIHx8CisJCQkgICAgIHRwLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MjA2MykpCisJCQkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1Q7CisJCX0gZWxzZSB7CiAJCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19FRVBST01fV1JJVEVfUFJPVDsKKwkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0lTX05JQzsKKwkJfQogCiAJCWlmIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfQVNGX0VOQUJMRSkgewogCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19FTkFCTEVfQVNGOwpAQCAtMTAxNDEsNyArMTAxNjMsNyBAQAogCiAJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9BTllfU0VSREVTKSAmJgogCSAgICAhKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSkgewotCQl1MzIgYm1zciwgYWR2X3JlZywgdGczX2N0cmw7CisJCXUzMiBibXNyLCBhZHZfcmVnLCB0ZzNfY3RybCwgbWFzazsKIAogCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKIAkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKSAmJgpAQCAtMTAxNjUsNyArMTAxODcsMTAgQEAKIAkJCQkJICAgICBNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUik7CiAJCX0KIAotCQlpZiAoIXRnM19jb3BwZXJfaXNfYWR2ZXJ0aXNpbmdfYWxsKHRwKSkgeworCQltYXNrID0gKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCUFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKTsKKwkJaWYgKCF0ZzNfY29wcGVyX2lzX2FkdmVydGlzaW5nX2FsbCh0cCwgbWFzaykpIHsKIAkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwgYWR2X3JlZyk7CiAKIAkJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkpCkBAIC0xMDIwOSw3ICsxMDIzNCw3IEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX3JlYWRfcGFydG5vKHN0cnVjdCB0ZzMgKnRwKQogewogCXVuc2lnbmVkIGNoYXIgdnBkX2RhdGFbMjU2XTsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgbWFnaWM7CiAKIAlpZiAodGczX252cmFtX3JlYWRfc3dhYih0cCwgMHgwLCAmbWFnaWMpKQpAQCAtMTAyNTUsOSArMTAyODAsOSBAQAogCX0KIAogCS8qIE5vdyBwYXJzZSBhbmQgZmluZCB0aGUgcGFydCBudW1iZXIuICovCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgKSB7CisJZm9yIChpID0gMDsgaSA8IDI1NDsgKSB7CiAJCXVuc2lnbmVkIGNoYXIgdmFsID0gdnBkX2RhdGFbaV07Ci0JCWludCBibG9ja19lbmQ7CisJCXVuc2lnbmVkIGludCBibG9ja19lbmQ7CiAKIAkJaWYgKHZhbCA9PSAweDgyIHx8IHZhbCA9PSAweDkxKSB7CiAJCQlpID0gKGkgKyAzICsKQEAgLTEwMjczLDIxICsxMDI5OCwyNiBAQAogCQkJICAgICAodnBkX2RhdGFbaSArIDFdICsKIAkJCSAgICAgICh2cGRfZGF0YVtpICsgMl0gPDwgOCkpKTsKIAkJaSArPSAzOwotCQl3aGlsZSAoaSA8IGJsb2NrX2VuZCkgeworCisJCWlmIChibG9ja19lbmQgPiAyNTYpCisJCQlnb3RvIG91dF9ub3RfZm91bmQ7CisKKwkJd2hpbGUgKGkgPCAoYmxvY2tfZW5kIC0gMikpIHsKIAkJCWlmICh2cGRfZGF0YVtpICsgMF0gPT0gJ1AnICYmCiAJCQkgICAgdnBkX2RhdGFbaSArIDFdID09ICdOJykgewogCQkJCWludCBwYXJ0bm9fbGVuID0gdnBkX2RhdGFbaSArIDJdOwogCi0JCQkJaWYgKHBhcnRub19sZW4gPiAyNCkKKwkJCQlpICs9IDM7CisJCQkJaWYgKHBhcnRub19sZW4gPiAyNCB8fCAocGFydG5vX2xlbiArIGkpID4gMjU2KQogCQkJCQlnb3RvIG91dF9ub3RfZm91bmQ7CiAKIAkJCQltZW1jcHkodHAtPmJvYXJkX3BhcnRfbnVtYmVyLAotCQkJCSAgICAgICAmdnBkX2RhdGFbaSArIDNdLAotCQkJCSAgICAgICBwYXJ0bm9fbGVuKTsKKwkJCQkgICAgICAgJnZwZF9kYXRhW2ldLCBwYXJ0bm9fbGVuKTsKIAogCQkJCS8qIFN1Y2Nlc3MuICovCiAJCQkJcmV0dXJuOwogCQkJfQorCQkJaSArPSAzICsgdnBkX2RhdGFbaSArIDJdOwogCQl9CiAKIAkJLyogUGFydCBudW1iZXIgbm90IGZvdW5kLiAqLwpAQCAtMTAzNTcsNyArMTAzODcsNyBAQAogCXUzMiBwY2lfc3RhdGVfcmVnLCBncmNfbWlzY19jZmc7CiAJdTMyIHZhbDsKIAl1MTYgcGNpX2NtZDsKLQlpbnQgZXJyOworCWludCBlcnIsIHBjaWVfY2FwOwogCiAJLyogRm9yY2UgbWVtb3J5IHdyaXRlIGludmFsaWRhdGUgb2ZmLiAgSWYgd2UgbGVhdmUgaXQgb24sCiAJICogdGhlbiBvbiA1NzAwX0JYIGNoaXBzIHdlIGhhdmUgdG8gZW5hYmxlIGEgd29ya2Fyb3VuZC4KQEAgLTEwNTMyLDggKzEwNTYyLDE5IEBACiAJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81OTA2KQogCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9KVU1CT19DQVBBQkxFOwogCi0JaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkodHAtPnBkZXYsIFBDSV9DQVBfSURfRVhQKSAhPSAwKQorCXBjaWVfY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eSh0cC0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCWlmIChwY2llX2NhcCAhPSAwKSB7CiAJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BDSV9FWFBSRVNTOworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpIHsKKwkJCXUxNiBsbmtjdGw7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LAorCQkJCQkgICAgIHBjaWVfY2FwICsgUENJX0VYUF9MTktDVEwsCisJCQkJCSAgICAgJmxua2N0bCk7CisJCQlpZiAobG5rY3RsICYgUENJX0VYUF9MTktDVExfQ0xLUkVRX0VOKQorCQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9IV19UU09fMjsKKwkJfQorCX0KIAogCS8qIElmIHdlIGhhdmUgYW4gQU1EIDc2MiBvciBWSUEgSzhUODAwIGNoaXBzZXQsIHdyaXRlCiAJICogcmVvcmRlcmluZyB0byB0aGUgbWFpbGJveCByZWdpc3RlcnMgZG9uZSBieSB0aGUgaG9zdApAQCAtMTA2NzMsNyArMTA3MTQsNyBAQAogCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1NSQU1fVVNFX0NPTkZJRzsKIAogCS8qIEdldCBlZXByb20gaHcgY29uZmlnIGJlZm9yZSBjYWxsaW5nIHRnM19zZXRfcG93ZXJfc3RhdGUoKS4KLQkgKiBJbiBwYXJ0aWN1bGFyLCB0aGUgVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1QgZmxhZyBtdXN0IGJlCisJICogSW4gcGFydGljdWxhciwgdGhlIFRHM19GTEcyX0lTX05JQyBmbGFnIG11c3QgYmUKIAkgKiBkZXRlcm1pbmVkIGJlZm9yZSBjYWxsaW5nIHRnM19zZXRfcG93ZXJfc3RhdGUoKSBzbyB0aGF0CiAJICogd2Uga25vdyB3aGV0aGVyIG9yIG5vdCB0byBzd2l0Y2ggb3V0IG9mIFZhdXggcG93ZXIuCiAJICogV2hlbiB0aGUgZmxhZyBpcyBzZXQsIGl0IG1lYW5zIHRoYXQgR1BJTzEgaXMgdXNlZCBmb3IgZWVwcm9tCkBAIC0xMDg0MCw3ICsxMDg4MSw4IEBACiAJICAgICAgdHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1RikpIHx8CiAJICAgICh0cC0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQlJPQURDT00gJiYKIAkgICAgICh0cC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTFGIHx8Ci0JICAgICAgdHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUzRikpIHx8CisJICAgICAgdHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUzRiB8fAorCSAgICAgIHRwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTc4N0YpKSB8fAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTkwNikKIAkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR18xMF8xMDBfT05MWTsKIApAQCAtMTE3MTIsNyArMTE3NTQsNyBAQAogI2VuZGlmCiAJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmdHAtPmluZGlyZWN0X2xvY2spOwotCUlOSVRfV09SSygmdHAtPnJlc2V0X3Rhc2ssIHRnM19yZXNldF90YXNrLCB0cCk7CisJSU5JVF9XT1JLKCZ0cC0+cmVzZXRfdGFzaywgdGczX3Jlc2V0X3Rhc2spOwogCiAJdHAtPnJlZ3MgPSBpb3JlbWFwX25vY2FjaGUodGczcmVnX2Jhc2UsIHRnM3JlZ19sZW4pOwogCWlmICh0cC0+cmVncyA9PSAwVUwpIHsKQEAgLTExODAwLDYgKzExODQyLDcgQEAKIAllbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAogCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSB8fAogCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMCB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTkwNiB8fAogCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpICE9IDApIHsKIAkJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1RTT19DQVBBQkxFOwogCX0gZWxzZSB7CkBAIC0xMTg4OSwxMyArMTE5MzIsMTUgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRpZ29uMyBbcGFydG5vKCVzKSByZXYgJTA0eCBQSFkoJXMpXSAoJXMpICVzQmFzZVQgRXRoZXJuZXQgIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogVGlnb24zIFtwYXJ0bm8oJXMpIHJldiAlMDR4IFBIWSglcyldICglcykgJXMgRXRoZXJuZXQgIiwKIAkgICAgICAgZGV2LT5uYW1lLAogCSAgICAgICB0cC0+Ym9hcmRfcGFydF9udW1iZXIsCiAJICAgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQsCiAJICAgICAgIHRnM19waHlfc3RyaW5nKHRwKSwKIAkgICAgICAgdGczX2J1c19zdHJpbmcodHAsIHN0ciksCi0JICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpID8gIjEwLzEwMCIgOiAiMTAvMTAwLzEwMDAiKTsKKwkgICAgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpID8gIjEwLzEwMEJhc2UtVFgiIDoKKwkJKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0FOWV9TRVJERVMpID8gIjEwMDBCYXNlLVNYIiA6CisJCSAiMTAvMTAwLzEwMDBCYXNlLVQiKSkpOwogCiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5oIGIvZHJpdmVycy9uZXQvdGczLmgKaW5kZXggOTJmNTMwMC4uZGZhZjRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmgKKysrIGIvZHJpdmVycy9uZXQvdGczLmgKQEAgLTIyMzMsNiArMjIzMyw3IEBACiAjZGVmaW5lIFRHM19GTEcyX1BDSV9FWFBSRVNTCQkweDAwMDAwMjAwCiAjZGVmaW5lIFRHM19GTEcyX0FTRl9ORVdfSEFORFNIQUtFCTB4MDAwMDA0MDAKICNkZWZpbmUgVEczX0ZMRzJfSFdfQVVUT05FRwkJMHgwMDAwMDgwMAorI2RlZmluZSBURzNfRkxHMl9JU19OSUMJCQkweDAwMDAxMDAwCiAjZGVmaW5lIFRHM19GTEcyX1BIWV9TRVJERVMJCTB4MDAwMDIwMDAKICNkZWZpbmUgVEczX0ZMRzJfQ0FQQUNJVElWRV9DT1VQTElORwkweDAwMDA0MDAwCiAjZGVmaW5lIFRHM19GTEcyX0ZMQVNICQkJMHgwMDAwODAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGxhbi5jIGIvZHJpdmVycy9uZXQvdGxhbi5jCmluZGV4IGUxNGY1YTAuLmY4NWYwMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RsYW4uYworKysgYi9kcml2ZXJzL25ldC90bGFuLmMKQEAgLTI5Niw2ICsyOTYsNyBAQAogc3RhdGljIGludAlUTGFuX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyBpbnQgICAgICBUTGFuX3Byb2JlMSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIGxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyB2b2lkCVRMYW5fdHhfdGltZW91dCggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlUTGFuX3R4X3RpbWVvdXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIGludCAJdGxhbl9pbml0X29uZSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwogCiBzdGF0aWMgdTMyCVRMYW5fSGFuZGxlSW52YWxpZCggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CkBAIC01NjIsNiArNTYzLDcgQEAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXByaXYtPnBjaURldiA9IHBkZXY7CisJcHJpdi0+ZGV2ID0gZGV2OwogCiAJLyogSXMgdGhpcyBhIFBDSSBkZXZpY2U/ICovCiAJaWYgKHBkZXYpIHsKQEAgLTYzNCw3ICs2MzYsNyBAQAogCiAJLyogVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiB3ZSBnZXQgYW4gYWRhcHRlciBlcnJvciBmcm9tCiAJICogd2l0aGluIG91ciBpcnEgaGFuZGxlciAqLwotCUlOSVRfV09SSygmcHJpdi0+dGxhbl90cXVldWUsICh2b2lkICopKHZvaWQqKVRMYW5fdHhfdGltZW91dCwgZGV2KTsKKwlJTklUX1dPUksoJnByaXYtPnRsYW5fdHF1ZXVlLCBUTGFuX3R4X3RpbWVvdXRfd29yayk7CiAKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CiAKQEAgLTEwNDAsNiArMTA0MiwyNSBAQAogfQogCiAKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogCVRMYW5fdHhfdGltZW91dF93b3JrCisJICoKKwkgKiAJUmV0dXJuczogbm90aGluZworCSAqCisJICogCVBhcmFtczoKKwkgKiAJCXdvcmsJd29yayBpdGVtIG9mIGRldmljZSB3aGljaCB0aW1lZCBvdXQKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgVExhbl90eF90aW1lb3V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBUTGFuUHJpdmF0ZUluZm8sIHRsYW5fdHF1ZXVlKTsKKworCVRMYW5fdHhfdGltZW91dChwcml2LT5kZXYpOworfQorCisKIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkgKglUTGFuX1N0YXJ0VHgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RsYW4uaCBiL2RyaXZlcnMvbmV0L3RsYW4uaAppbmRleCBhNDRlMmYyLi40MWNlMGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90bGFuLmgKKysrIGIvZHJpdmVycy9uZXQvdGxhbi5oCkBAIC0xNzAsNiArMTcwLDcgQEAKIHR5cGVkZWYgc3RydWN0IHRsYW5fcHJpdmF0ZV90YWcgewogCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpuZXh0RGV2aWNlOwogCXN0cnVjdCBwY2lfZGV2CQkqcGNpRGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7CiAJdm9pZAkJCSpkbWFTdG9yYWdlOwogCWRtYV9hZGRyX3QJCWRtYVN0b3JhZ2VETUE7CiAJdW5zaWduZWQgaW50CQlkbWFTaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwppbmRleCBiZmU1OTg2Li4wZDk3ZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwpAQCAtMTgyNiw3ICsxODI2LDcgQEAKIAlza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsIGRldik7CiAJaWYgKElQdjRfcCkgewogCQlza2ItPmNzdW0gPSBjaGtzdW07Ci0JCXNrYi0+aXBfc3VtbWVkID0gMTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKIAl9CiAJbmV0aWZfcngoc2tiKTsKIAlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmMKaW5kZXggY2QxNDJkMC4uOGY0ZWNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jCkBAIC0xNzcxLDcgKzE3NzEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBvbHltcGljX3BjaV9pbml0KHZvaWQpIAogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZvbHltcGljX2RyaXZlcikgOyAKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmb2x5bXBpY19kcml2ZXIpIDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG9seW1waWNfcGNpX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jCmluZGV4IDRmNzU2OTYuLmNiN2RiYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Byb3Rlb24uYwpAQCAtMzcwLDYgKzM3MCwxMCBAQAogCQlkZXYtPmRtYSA9IGRtYVtpXTsKIAkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInByb3Rlb24iLAogCQkJaSwgTlVMTCwgMCk7CisJCWlmIChJU19FUlIocGRldikpIHsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQljb250aW51ZTsKKwkJfQogCQllcnIgPSBzZXR1cF9jYXJkKGRldiwgJnBkZXYtPmRldik7CiAJCWlmICghZXJyKSB7CiAJCQlwcm90ZW9uX2RldltpXSA9IHBkZXY7CkBAIC0zODUsOSArMzg5LDEwIEBACiAJLyogUHJvYmUgZm9yIGNhcmRzLiAqLwogCWlmIChudW0gPT0gMCkgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgInByb3Rlb24uYzogTm8gY2FyZHMgZm91bmQuXG4iKTsKLQkJcmV0dXJuICgtRU5PREVWKTsKKwkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnByb3Rlb25fZHJpdmVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwcm90ZW9uX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKaW5kZXggZDZiYTQxYy4uMzNhZmVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKQEAgLTM4MCw2ICszODAsMTAgQEAKIAkJZGV2LT5kbWEgPSBkbWFbaV07CiAJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJza2lzYSIsCiAJCQlpLCBOVUxMLCAwKTsKKwkJaWYgKElTX0VSUihwZGV2KSkgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCWVyciA9IHNldHVwX2NhcmQoZGV2LCAmcGRldi0+ZGV2KTsKIAkJaWYgKCFlcnIpIHsKIAkJCXNrX2lzYV9kZXZbaV0gPSBwZGV2OwpAQCAtMzk1LDkgKzM5OSwxMCBAQAogCS8qIFByb2JlIGZvciBjYXJkcy4gKi8KIAlpZiAobnVtID09IDApIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJza2lzYS5jOiBObyBjYXJkcyBmb3VuZC5cbiIpOwotCQlyZXR1cm4gKC1FTk9ERVYpOworCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2tfaXNhX2RyaXZlcik7CisJCXJldHVybiAtRU5PREVWOwogCX0KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2tfaXNhX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKaW5kZXggNDZkYWJkYi4uY2VjMjgyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKQEAgLTU3MDYsNyArNTcwNiw3IEBACiAgICAgICAgIHJldHVybiBmb3VuZCA/IDAgOiAtRU5PREVWOwogfQogCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit2b2lkIF9fZXhpdCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogICAgICAgICBpbnQgaTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jIGIvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzgwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMKQEAgLTAsMCArMSwxNzA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDA2IFR1bmRyYSBTZW1pY29uZHVjdG9yIENvcnBvcmF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIGRyaXZlciBjb2RlIG9yaWdpbmFsbHkgZGV2ZWxvcGVkCisgKiBmb3IgdGhlIEludGVsIElPQzgwMzE0IChGb3Jlc3RMYWtlKSBHaWdhYml0IEV0aGVybmV0IGJ5CisgKiBzY290dC53b29kQHRpbWVzeXMuY29tICAqIENvcHlyaWdodCAoQykgMjAwMyBUaW1lU3lzIENvcnBvcmF0aW9uCisgKgorICogQ3VycmVudGx5IGNoYW5nZXMgZnJvbSBvcmlnaW5hbCB2ZXJzaW9uIGFyZToKKyAqIC0gcG9ydGluZyB0byBUc2kxMDgtYmFzZWQgcGxhdGZvcm0gYW5kIGtlcm5lbCAyLjYgKGtvbmcubGFpQHR1bmRyYS5jb20pCisgKiAtIG1vZGlmaWNhdGlvbnMgdG8gaGFuZGxlIHR3byBwb3J0cyBpbmRlcGVuZGVudGx5IGFuZCBzdXBwb3J0IGZvcgorICogICBhZGRpdGlvbmFsIFBIWSBkZXZpY2VzIChhbGV4YW5kcmUuYm91bmluZUB0dW5kcmEuY29tKQorICogLSBHZXQgaGFyZHdhcmUgaW5mb3JtYXRpb24gZnJvbSBwbGF0Zm9ybSBkZXZpY2UuICh0aWUtZmVpLnphbmdAZnJlZXNjYWxlLmNvbSkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+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+cGh5cmVncyArIChvZmZzZXQpKSkKKworLyoKKyAqIFBIWSBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqCisgKiBOT1RFOiBFbmFibGUgc2V0IG9mIGRlZmluaXRpb25zIGNvcnJlc3BvbmRpbmcgdG8geW91ciBib2FyZCB0eXBlCisgKi8KKyNkZWZpbmUgUEhZX01WODhFCTEJLyogTWFydmVsIDg4RXh4eHggUEhZICovCisjZGVmaW5lIFBIWV9CQ001NFhYCTIJLyogQnJvYXJkY29tIEJDTTU0eHggUEhZICovCisjZGVmaW5lIFRTSTEwOF9QSFlfVFlQRQlQSFlfTVY4OEUKKworLyoKKyAqIFRTSTEwOCBHSUdFIHBvcnQgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBUU0kxMDhfRVRIX1BPUlRfTlVNCQkyCisjZGVmaW5lIFRTSTEwOF9QQk1fUE9SVAkJCTIKKyNkZWZpbmUgVFNJMTA4X1NEUkFNX1BPUlQJCTQKKworI2RlZmluZSBUU0kxMDhfTUFDX0NGRzEJCQkoMHgwMDApCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMV9TT0ZUUlNUCQkoMSA8PCAzMSkKKyNkZWZpbmUgVFNJMTA4X01BQ19DRkcxX0xPT1BCQUNLCSgxIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMV9SWEVOCQkoMSA8PCAyKQorI2RlZmluZSBUU0kxMDhfTUFDX0NGRzFfVFhFTgkJKDEgPDwgMCkKKworI2RlZmluZSBUU0kxMDhfTUFDX0NGRzIJCQkoMHgwMDQpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMl9ERkxUX1BSRUFNQkxFCSg3IDw8IDEyKQorI2RlZmluZSBUU0kxMDhfTUFDX0NGRzJfSUZBQ0VfTUFTSwkoMyA8PCA4KQorI2RlZmluZSBUU0kxMDhfTUFDX0NGRzJfTk9HSUcJCSgxIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMl9HSUcJCSgyIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMl9QQURDUkMJCSgxIDw8IDIpCisjZGVmaW5lIFRTSTEwOF9NQUNfQ0ZHMl9GVUxMRFVQTEVYCSgxIDw8IDApCisKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfTUdNVF9DRkcJCSgweDAyMCkKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfTUdNVF9DTEsJCSg3IDw8IDApCisjZGVmaW5lIFRTSTEwOF9NQUNfTUlJX01HTVRfUlNUCQkoMSA8PCAzMSkKKworI2RlZmluZSBUU0kxMDhfTUFDX01JSV9DTUQJCSgweDAyNCkKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfQ01EX1JFQUQJCSgxIDw8IDApCisKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfQUREUgkJKDB4MDI4KQorI2RlZmluZSBUU0kxMDhfTUFDX01JSV9BRERSX1JFRwkJMAorI2RlZmluZSBUU0kxMDhfTUFDX01JSV9BRERSX1BIWQkJOAorCisjZGVmaW5lIFRTSTEwOF9NQUNfTUlJX0RBVEFPVVQJCSgweDAyYykKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfREFUQUlOCQkoMHgwMzApCisKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfSU5ECQkoMHgwMzQpCisjZGVmaW5lIFRTSTEwOF9NQUNfTUlJX0lORF9OT1RWQUxJRAkoMSA8PCAyKQorI2RlZmluZSBUU0kxMDhfTUFDX01JSV9JTkRfU0NBTk5JTkcJKDEgPDwgMSkKKyNkZWZpbmUgVFNJMTA4X01BQ19NSUlfSU5EX0JVU1kJCSgxIDw8IDApCisKKyNkZWZpbmUgVFNJMTA4X01BQ19JRkNUUkwJCSgweDAzOCkKKyNkZWZpbmUgVFNJMTA4X01BQ19JRkNUUkxfUEhZTU9ERQkoMSA8PCAyNCkKKworI2RlZmluZSBUU0kxMDhfTUFDX0FERFIxCQkoMHgwNDApCisjZGVmaW5lIFRTSTEwOF9NQUNfQUREUjIJCSgweDA0NCkKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWEJZVEVTCQkoMHgwNmMpCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYQllURVNfQ0FSUlkJKDEgPDwgMjQpCisKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhQS1RTCQkoMHgwNzApCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYUEtUU19DQVJSWQkoMSA8PCAxOCkKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWEZDUwkJKDB4MDc0KQorI2RlZmluZSBUU0kxMDhfU1RBVF9SWEZDU19DQVJSWQkJKDEgPDwgMTIpCisKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhNQ0FTVAkJKDB4MDc4KQorI2RlZmluZSBUU0kxMDhfU1RBVF9SWE1DQVNUX0NBUlJZCSgxIDw8IDE4KQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYQUxJR04JCSgweDA4YykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhBTElHTl9DQVJSWQkoMSA8PCAxMikKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWExFTkdUSAkJKDB4MDkwKQorI2RlZmluZSBUU0kxMDhfU1RBVF9SWExFTkdUSF9DQVJSWQkoMSA8PCAxMikKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWFJVTlQJCSgweDA5YykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhSVU5UX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYSlVNQk8JCSgweDBhMCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhKVU1CT19DQVJSWQkoMSA8PCAxMikKKworI2RlZmluZSBUU0kxMDhfU1RBVF9SWEZSQUcJCSgweDBhNCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfUlhGUkFHX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYSkFCQkVSCQkoMHgwYTgpCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYSkFCQkVSX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1JYRFJPUAkJKDB4MGFjKQorI2RlZmluZSBUU0kxMDhfU1RBVF9SWERST1BfQ0FSUlkJKDEgPDwgMTIpCisKKyNkZWZpbmUgVFNJMTA4X1NUQVRfVFhCWVRFUwkJKDB4MGIwKQorI2RlZmluZSBUU0kxMDhfU1RBVF9UWEJZVEVTX0NBUlJZCSgxIDw8IDI0KQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1RYUEtUUwkJKDB4MGI0KQorI2RlZmluZSBUU0kxMDhfU1RBVF9UWFBLVFNfQ0FSUlkJKDEgPDwgMTgpCisKKyNkZWZpbmUgVFNJMTA4X1NUQVRfVFhFWERFRgkJKDB4MGM4KQorI2RlZmluZSBUU0kxMDhfU1RBVF9UWEVYREVGX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1RYRVhDT0wJCSgweDBkOCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfVFhFWENPTF9DQVJSWQkoMSA8PCAxMikKKworI2RlZmluZSBUU0kxMDhfU1RBVF9UWFRDT0wJCSgweDBkYykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfVFhUQ09MX0NBUlJZCSgxIDw8IDEzKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX1RYUEFVU0VEUk9QCQkoMHgwZTQpCisjZGVmaW5lIFRTSTEwOF9TVEFUX1RYUEFVU0VEUk9QX0NBUlJZCSgxIDw8IDEyKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX0NBUlJZMQkJKDB4MTAwKQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTFfUlhCWVRFUwkoMSA8PCAxNikKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYUEtUUwkoMSA8PCAxNSkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYRkNTCSgxIDw8IDE0KQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTFfUlhNQ0FTVAkoMSA8PCAxMykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYQUxJR04JKDEgPDwgOCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYTEVOR1RICSgxIDw8IDcpCisjZGVmaW5lIFRTSTEwOF9TVEFUX0NBUlJZMV9SWFJVTlQJKDEgPDwgNCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYSlVNQk8JKDEgPDwgMykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYRlJBRwkoMSA8PCAyKQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTFfUlhKQUJCRVIJKDEgPDwgMSkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkxX1JYRFJPUAkoMSA8PCAwKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX0NBUlJZMgkJKDB4MTA0KQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTJfVFhCWVRFUwkoMSA8PCAxMykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYUEtUUwkoMSA8PCAxMikKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYRVhERUYJKDEgPDwgNykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYRVhDT0wJKDEgPDwgMykKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUlkyX1RYVENPTAkoMSA8PCAyKQorI2RlZmluZSBUU0kxMDhfU1RBVF9DQVJSWTJfVFhQQVVTRQkoMSA8PCAwKQorCisjZGVmaW5lIFRTSTEwOF9TVEFUX0NBUlJZTUFTSzEJCSgweDEwOCkKKyNkZWZpbmUgVFNJMTA4X1NUQVRfQ0FSUllNQVNLMgkJKDB4MTBjKQorCisjZGVmaW5lIFRTSTEwOF9FQ19QT1JUQ1RSTAkJKDB4MjAwKQorI2RlZmluZSBUU0kxMDhfRUNfUE9SVENUUkxfU1RBVFJTVAkoMSA8PCAzMSkKKyNkZWZpbmUgVFNJMTA4X0VDX1BPUlRDVFJMX1NUQVRFTgkoMSA8PCAyOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1BPUlRDVFJMX05PR0lHCSgxIDw8IDE4KQorI2RlZmluZSBUU0kxMDhfRUNfUE9SVENUUkxfSEFMRkRVUExFWAkoMSA8PCAxNikKKworI2RlZmluZSBUU0kxMDhfRUNfSU5UU1RBVAkJKDB4MjA0KQorI2RlZmluZSBUU0kxMDhfRUNfSU5UTUFTSwkJKDB4MjA4KQorCisjZGVmaW5lIFRTSTEwOF9JTlRfQU5ZCQkJKDEgPDwgMzEpCisjZGVmaW5lIFRTSTEwOF9JTlRfU0ZOCQkJKDEgPDwgMzApCisjZGVmaW5lIFRTSTEwOF9JTlRfUlhJRExFCQkoMSA8PCAyOSkKKyNkZWZpbmUgVFNJMTA4X0lOVF9SWEFCT1JUCQkoMSA8PCAyOCkKKyNkZWZpbmUgVFNJMTA4X0lOVF9SWEVSUk9SCQkoMSA8PCAyNykKKyNkZWZpbmUgVFNJMTA4X0lOVF9SWE9WRVJSVU4JCSgxIDw8IDI2KQorI2RlZmluZSBUU0kxMDhfSU5UX1JYVEhSRVNICQkoMSA8PCAyNSkKKyNkZWZpbmUgVFNJMTA4X0lOVF9SWFdBSVQJCSgxIDw8IDI0KQorI2RlZmluZSBUU0kxMDhfSU5UX1JYUVVFVUUwCQkoMSA8PCAxNikKKyNkZWZpbmUgVFNJMTA4X0lOVF9TVEFUQ0FSUlkJCSgxIDw8IDE1KQorI2RlZmluZSBUU0kxMDhfSU5UX1RYSURMRQkJKDEgPDwgMTMpCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhBQk9SVAkJKDEgPDwgMTIpCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhFUlJPUgkJKDEgPDwgMTEpCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhVTkRFUlJVTgkJKDEgPDwgMTApCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhUSFJFU0gJCSgxIDw8ICA5KQorI2RlZmluZSBUU0kxMDhfSU5UX1RYV0FJVAkJKDEgPDwgIDgpCisjZGVmaW5lIFRTSTEwOF9JTlRfVFhRVUVVRTAJCSgxIDw8ICAwKQorCisjZGVmaW5lIFRTSTEwOF9FQ19UWENGRwkJCSgweDIyMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYQ0ZHX1JTVAkJKDEgPDwgMzEpCisKKyNkZWZpbmUgVFNJMTA4X0VDX1RYQ1RSTAkJKDB4MjI0KQorI2RlZmluZSBUU0kxMDhfRUNfVFhDVFJMX0lETEVJTlQJKDEgPDwgMzEpCisjZGVmaW5lIFRTSTEwOF9FQ19UWENUUkxfQUJPUlQJCSgxIDw8IDMwKQorI2RlZmluZSBUU0kxMDhfRUNfVFhDVFJMX0dPCQkoMSA8PCAxNSkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYQ1RSTF9RVUVVRTAJCSgxIDw8ICAwKQorCisjZGVmaW5lIFRTSTEwOF9FQ19UWFNUQVQJCSgweDIyOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYU1RBVF9BQ1RJVkUJCSgxIDw8IDE1KQorI2RlZmluZSBUU0kxMDhfRUNfVFhTVEFUX1FVRVVFMAkJKDEgPDwgMCkKKworI2RlZmluZSBUU0kxMDhfRUNfVFhFU1RBVAkJKDB4MjJjKQorI2RlZmluZSBUU0kxMDhfRUNfVFhFU1RBVF9RMF9FUlIJKDEgPDwgMjQpCisjZGVmaW5lIFRTSTEwOF9FQ19UWEVTVEFUX1EwX0RFU0NJTlQJKDEgPDwgMTYpCisjZGVmaW5lIFRTSTEwOF9FQ19UWEVTVEFUX1EwX0VPRgkoMSA8PCAgOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYRVNUQVRfUTBfRU9RCSgxIDw8ICAwKQorCisjZGVmaW5lIFRTSTEwOF9FQ19UWEVSUgkJCSgweDI3OCkKKworI2RlZmluZSBUU0kxMDhfRUNfVFhRX0NGRwkJKDB4MjgwKQorI2RlZmluZSBUU0kxMDhfRUNfVFhRX0NGR19ERVNDX0lOVAkoMSA8PCAyMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9DRkdfRU9RX09XTl9JTlQJKDEgPDwgMTkpCisjZGVmaW5lIFRTSTEwOF9FQ19UWFFfQ0ZHX1dTV1AJCSgxIDw8IDExKQorI2RlZmluZSBUU0kxMDhfRUNfVFhRX0NGR19CU1dQCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9DRkdfU0ZOUE9SVAkwCisKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkcJCSgweDI4NCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlVSU1Q4CSgwIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9FQ19UWFFfQlVGQ0ZHX0JVUlNUMzIJKDEgPDwgOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlVSU1QxMjgJKDIgPDwgOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlVSU1QyNTYJKDMgPDwgOCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfV1NXUAkoMSA8PCAxMSkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfQlNXUAkoMSA8PCAxMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9CVUZDRkdfU0ZOUE9SVAkwCisKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9QVFJMT1cJCSgweDI4OCkKKworI2RlZmluZSBUU0kxMDhfRUNfVFhRX1BUUkhJR0gJCSgweDI4YykKKyNkZWZpbmUgVFNJMTA4X0VDX1RYUV9QVFJISUdIX1ZBTElECSgxIDw8IDMxKQorCisjZGVmaW5lIFRTSTEwOF9FQ19UWFRIUkVTSAkJKDB4MjMwKQorI2RlZmluZSBUU0kxMDhfRUNfVFhUSFJFU0hfU1RBUlRGSUxMCTAKKyNkZWZpbmUgVFNJMTA4X0VDX1RYVEhSRVNIX1NUT1BGSUxMCTE2CisKKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ0ZHCQkJKDB4MzIwKQorI2RlZmluZSBUU0kxMDhfRUNfUlhDRkdfUlNUCQkoMSA8PCAzMSkKKworI2RlZmluZSBUU0kxMDhfRUNfUlhTVEFUCQkoMHgzMjgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFNUQVRfQUNUSVZFCQkoMSA8PCAxNSkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYU1RBVF9RVUVVRTAJCSgxIDw8IDApCisKKyNkZWZpbmUgVFNJMTA4X0VDX1JYRVNUQVQJCSgweDMyYykKKyNkZWZpbmUgVFNJMTA4X0VDX1JYRVNUQVRfUTBfRVJSCSgxIDw8IDI0KQorI2RlZmluZSBUU0kxMDhfRUNfUlhFU1RBVF9RMF9ERVNDSU5UCSgxIDw8IDE2KQorI2RlZmluZSBUU0kxMDhfRUNfUlhFU1RBVF9RMF9FT0YJKDEgPDwgIDgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWEVTVEFUX1EwX0VPUQkoMSA8PCAgMCkKKworI2RlZmluZSBUU0kxMDhfRUNfSEFTSEFERFIJCSgweDM2MCkKKyNkZWZpbmUgVFNJMTA4X0VDX0hBU0hBRERSX0FVVE9JTkMJKDEgPDwgMzEpCisjZGVmaW5lIFRTSTEwOF9FQ19IQVNIQUREUl9ETzFTVFJFQUQJKDEgPDwgMzApCisjZGVmaW5lIFRTSTEwOF9FQ19IQVNIQUREUl9VTklDQVNUCSgwIDw8ICA0KQorI2RlZmluZSBUU0kxMDhfRUNfSEFTSEFERFJfTUNBU1QJKDEgPDwgIDQpCisKKyNkZWZpbmUgVFNJMTA4X0VDX0hBU0hEQVRBCQkoMHgzNjQpCisKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9QVFJMT1cJCSgweDM4OCkKKworI2RlZmluZSBUU0kxMDhfRUNfUlhRX1BUUkhJR0gJCSgweDM4YykKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9QVFJISUdIX1ZBTElECSgxIDw8IDMxKQorCisvKiBTdGF0aW9uIEVuYWJsZSAtLSBhY2NlcHQgcGFja2V0cyBkZXN0aW5lZCBmb3IgdXMgKi8KKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ0ZHX1NFCQkoMSA8PCAxMykKKy8qIFVuaWNhc3QgRnJhbWUgRW5hYmxlIC0tIGZvciBwYWNrZXRzIG5vdCBkZXN0aW5lZCBmb3IgdXMgKi8KKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ0ZHX1VGRQkJKDEgPDwgMTIpCisvKiBNdWx0aWNhc3QgRnJhbWUgRW5hYmxlICovCisjZGVmaW5lIFRTSTEwOF9FQ19SWENGR19NRkUJCSgxIDw8IDExKQorLyogQnJvYWRjYXN0IEZyYW1lIEVuYWJsZSAqLworI2RlZmluZSBUU0kxMDhfRUNfUlhDRkdfQkZFCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ0ZHX1VDX0hBU0gJCSgxIDw8ICA5KQorI2RlZmluZSBUU0kxMDhfRUNfUlhDRkdfTUNfSEFTSAkJKDEgPDwgIDgpCisKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9DRkcJCSgweDM4MCkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9DRkdfREVTQ19JTlQJKDEgPDwgMjApCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQ0ZHX0VPUV9PV05fSU5UCSgxIDw8IDE5KQorI2RlZmluZSBUU0kxMDhfRUNfUlhRX0NGR19XU1dQCQkoMSA8PCAxMSkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYUV9DRkdfQlNXUAkJKDEgPDwgMTApCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQ0ZHX1NGTlBPUlQJMAorCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHCQkoMHgzODQpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX0JVUlNUOAkoMCA8PCA4KQorI2RlZmluZSBUU0kxMDhfRUNfUlhRX0JVRkNGR19CVVJTVDMyCSgxIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX0JVUlNUMTI4CSgyIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX0JVUlNUMjU2CSgzIDw8IDgpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX1dTV1AJKDEgPDwgMTEpCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX0JTV1AJKDEgPDwgMTApCisjZGVmaW5lIFRTSTEwOF9FQ19SWFFfQlVGQ0ZHX1NGTlBPUlQJMAorCisjZGVmaW5lIFRTSTEwOF9FQ19SWENUUkwJCSgweDMyNCkKKyNkZWZpbmUgVFNJMTA4X0VDX1JYQ1RSTF9BQk9SVAkJKDEgPDwgMzApCisjZGVmaW5lIFRTSTEwOF9FQ19SWENUUkxfR08JCSgxIDw8IDE1KQorI2RlZmluZSBUU0kxMDhfRUNfUlhDVFJMX1FVRVVFMAkJKDEgPDwgMCkKKworI2RlZmluZSBUU0kxMDhfRUNfUlhFUlIJCQkoMHgzNzgpCisKKyNkZWZpbmUgVFNJMTA4X1RYX0VPRgkoMSA8PCAwKQkvKiBFbmQgb2YgZnJhbWU7IGxhc3QgZnJhZ21lbnQgb2YgcGFja2V0ICovCisjZGVmaW5lIFRTSTEwOF9UWF9TT0YJKDEgPDwgMSkJLyogU3RhcnQgb2YgZnJhbWU7IGZpcnN0IGZyYWcuIG9mIHBhY2tldCAqLworI2RlZmluZSBUU0kxMDhfVFhfVkxBTgkoMSA8PCAyKQkvKiBQZXItZnJhbWUgVkxBTjogZW5hYmxlcyBWTEFOIG92ZXJyaWRlICovCisjZGVmaW5lIFRTSTEwOF9UWF9IVUdFCSgxIDw8IDMpCS8qIEh1Z2UgZnJhbWUgZW5hYmxlICovCisjZGVmaW5lIFRTSTEwOF9UWF9QQUQJKDEgPDwgNCkJLyogUGFkIHRoZSBwYWNrZXQgaWYgdG9vIHNob3J0ICovCisjZGVmaW5lIFRTSTEwOF9UWF9DUkMJKDEgPDwgNSkJLyogR2VuZXJhdGUgQ1JDIGZvciB0aGlzIHBhY2tldCAqLworI2RlZmluZSBUU0kxMDhfVFhfSU5UCSgxIDw8IDE0KQkvKiBHZW5lcmF0ZSBhbiBJUlEgYWZ0ZXIgZnJhZy4gcHJvY2Vzc2VkICovCisjZGVmaW5lIFRTSTEwOF9UWF9SRVRSWQkoMHhmIDw8IDE2KQkvKiA0IGJpdCBmaWVsZCBpbmRpY2F0aW5nIG51bS4gb2YgcmV0cmllcyAqLworI2RlZmluZSBUU0kxMDhfVFhfQ09MCSgxIDw8IDIwKQkvKiBTZXQgaWYgYSBjb2xsaXNpb24gb2NjdXJlZCAqLworI2RlZmluZSBUU0kxMDhfVFhfTENPTAkoMSA8PCAyNCkJLyogU2V0IGlmIGEgbGF0ZSBjb2xsaXNpb24gb2NjdXJlZCAqLworI2RlZmluZSBUU0kxMDhfVFhfVU5ERVIJKDEgPDwgMjUpCS8qIFNldCBpZiBhIEZJRk8gdW5kZXJydW4gb2NjdXJlZCAqLworI2RlZmluZSBUU0kxMDhfVFhfUkxJTQkoMSA8PCAyNikJLyogU2V0IGlmIHRoZSByZXRyeSBsaW1pdCB3YXMgcmVhY2hlZCAqLworI2RlZmluZSBUU0kxMDhfVFhfT0sJKDEgPDwgMzApCS8qIFNldCBpZiB0aGUgZnJhbWUgVFggd2FzIHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgVFNJMTA4X1RYX09XTgkoMSA8PCAzMSkJLyogU2V0IGlmIHRoZSBkZXZpY2Ugb3ducyB0aGUgZGVzY3JpcHRvciAqLworCisvKiBOb3RlOiB0aGUgZGVzY3JpcHRvciBsYXlvdXRzIGFzc3VtZSBiaWctZW5kaWFuIGJ5dGUgb3JkZXIuICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGJ1ZjA7CisJdTMyIGJ1ZjE7CQkvKiBCYXNlIGFkZHJlc3Mgb2YgYnVmZmVyICovCisJdTMyIG5leHQwOwkJLyogQWRkcmVzcyBvZiBuZXh0IGRlc2NyaXB0b3IsIGlmIGFueSAqLworCXUzMiBuZXh0MTsKKwl1MTYgdmxhbjsJCS8qIFZMQU4sIGlmIG92ZXJyaWRlIGVuYWJsZWQgZm9yIHRoaXMgcGFja2V0ICovCisJdTE2IGxlbjsJCS8qIExlbmd0aCBvZiBidWZmZXIgaW4gYnl0ZXMgKi8KKwl1MzIgbWlzYzsJCS8qIFNlZSBUU0kxMDhfVFhfKiBhYm92ZSAqLworCXUzMiByZXNlcnZlZDA7CQkvKnJlc2VydmVkMCBhbmQgcmVzZXJ2ZWQxIGFyZSBhZGRlZCB0byBtYWtlIHRoZSBkZXNjICovCisJdTMyIHJlc2VydmVkMTsJCS8qIDMyLWJ5dGUgYWxpZ25lZCAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKSB0eF9kZXNjOworCisjZGVmaW5lIFRTSTEwOF9SWF9FT0YJKDEgPDwgMCkJLyogRW5kIG9mIGZyYW1lOyBsYXN0IGZyYWdtZW50IG9mIHBhY2tldCAqLworI2RlZmluZSBUU0kxMDhfUlhfU09GCSgxIDw8IDEpCS8qIFN0YXJ0IG9mIGZyYW1lOyBmaXJzdCBmcmFnLiBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgVFNJMTA4X1JYX1ZMQU4JKDEgPDwgMikJLyogU2V0IG9uIFNPRiBpZiBwYWNrZXQgaGFzIGEgVkxBTiAqLworI2RlZmluZSBUU0kxMDhfUlhfRlRZUEUJKDEgPDwgMykJLyogTGVuZ3RoL1R5cGUgZmllbGQgaXMgdHlwZSwgbm90IGxlbmd0aCAqLworI2RlZmluZSBUU0kxMDhfUlhfUlVOVAkoMSA8PCA0KS8qIFBhY2tldCBpcyBsZXNzIHRoYW4gbWluaW11bSBzaXplICovCisjZGVmaW5lIFRTSTEwOF9SWF9IQVNICSgxIDw8IDcpLyogSGFzaCB0YWJsZSBtYXRjaCAqLworI2RlZmluZSBUU0kxMDhfUlhfQkFECSgxIDw8IDgpCS8qIEJhZCBmcmFtZSAqLworI2RlZmluZSBUU0kxMDhfUlhfT1ZFUgkoMSA8PCA5KQkvKiBGSUZPIG92ZXJydW4gb2NjdXJlZCAqLworI2RlZmluZSBUU0kxMDhfUlhfVFJVTkMJKDEgPDwgMTEpCS8qIFBhY2tldCB0cnVuY2F0ZWQgZHVlIHRvIGV4Y2VzcyBsZW5ndGggKi8KKyNkZWZpbmUgVFNJMTA4X1JYX0NSQwkoMSA8PCAxMikJLyogUGFja2V0IGhhZCBhIENSQyBlcnJvciAqLworI2RlZmluZSBUU0kxMDhfUlhfSU5UCSgxIDw8IDEzKQkvKiBHZW5lcmF0ZSBhbiBJUlEgYWZ0ZXIgZnJhZy4gcHJvY2Vzc2VkICovCisjZGVmaW5lIFRTSTEwOF9SWF9PV04JKDEgPDwgMTUpCS8qIFNldCBpZiB0aGUgZGV2aWNlIG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKworI2RlZmluZSBUU0kxMDhfUlhfU0tCX1NJWkUgMTUzNgkJLyogVGhlIFJYIHNrYiBsZW5ndGggKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBidWYwOwkJLyogQmFzZSBhZGRyZXNzIG9mIGJ1ZmZlciAqLworCXUzMiBidWYxOwkJLyogQmFzZSBhZGRyZXNzIG9mIGJ1ZmZlciAqLworCXUzMiBuZXh0MDsJCS8qIEFkZHJlc3Mgb2YgbmV4dCBkZXNjcmlwdG9yLCBpZiBhbnkgKi8KKwl1MzIgbmV4dDE7CQkvKiBBZGRyZXNzIG9mIG5leHQgZGVzY3JpcHRvciwgaWYgYW55ICovCisJdTE2IHZsYW47CQkvKiBWTEFOIG9mIHJlY2VpdmVkIHBhY2tldCwgZmlyc3QgZnJhZyBvbmx5ICovCisJdTE2IGxlbjsJCS8qIExlbmd0aCBvZiByZWNlaXZlZCBmcmFnbWVudCBpbiBieXRlcyAqLworCXUxNiBibGVuOwkJLyogTGVuZ3RoIG9mIGJ1ZmZlciBpbiBieXRlcyAqLworCXUxNiBtaXNjOwkJLyogU2VlIFRTSTEwOF9SWF8qIGFib3ZlICovCisJdTMyIHJlc2VydmVkMDsJCS8qIHJlc2VydmVkMCBhbmQgcmVzZXJ2ZWQxIGFyZSBhZGRlZCB0byBtYWtlIHRoZSBkZXNjICovCisJdTMyIHJlc2VydmVkMTsJCS8qIDMyLWJ5dGUgYWxpZ25lZCAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKSByeF9kZXNjOworCisjZW5kaWYJCQkJLyogX19UU0kxMDhfRVRIX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwLzIxMTQyLmMgYi9kcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jCmluZGV4IGZhM2EyYmIuLjk0MmI4MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwLzIxMTQyLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvMjExNDIuYwpAQCAtMjYsMTAgKzI2LDExIEBACiAKIC8qIEhhbmRsZSB0aGUgMjExNDMgdW5pcXVlbHk6IGRvIGF1dG9zZWxlY3Qgd2l0aCBOV2F5LCBub3QgdGhlIEVFUFJPTSBsaXN0CiAgICBvZiBhdmFpbGFibGUgdHJhbnNjZWl2ZXJzLiAgKi8KLXZvaWQgdDIxMTQyX21lZGlhX3Rhc2sodm9pZCAqZGF0YSkKK3ZvaWQgdDIxMTQyX21lZGlhX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0dWxpcF9wcml2YXRlLCBtZWRpYV93b3JrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPmRldjsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CiAJaW50IGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOwogCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwppbmRleCBmNmIzYTk0Li45ZDY3ZjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCkBAIC0xOTA2LDkgKzE5MDYsNyBAQAogCQkJZGUtPm1lZGlhW2ldLmNzcjE1ID0gdDIxMDQxX2NzcjE1W2ldOwogCX0KIAotCWRlLT5lZV9kYXRhID0ga21hbGxvYyhERV9FRVBST01fU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRlLT5lZV9kYXRhKQotCQltZW1jcHkoZGUtPmVlX2RhdGEsICZlZV9kYXRhWzBdLCBERV9FRVBST01fU0laRSk7CisJZGUtPmVlX2RhdGEgPSBrbWVtZHVwKCZlZV9kYXRhWzBdLCBERV9FRVBST01fU0laRSwgR0ZQX0tFUk5FTCk7CiAKIAlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCmluZGV4IDNmNGI2NDAuLjRiM2NkM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtNDczLDkgKzQ3Myw5IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQorI2lmZGVmIENPTkZJR19QUENfUE1BQwogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiAKICNpbmNsdWRlICJkZTR4NS5oIgogCkBAIC00MTUxLDcgKzQxNTEsNyBAQAogICAgIC8qIElmIHBvc3NpYmxlLCB0cnkgdG8gZml4IGEgYnJva2VuIGNhcmQgLSBTTUMgb25seSBzbyBmYXIgKi8KICAgICBzcm9tX3JlcGFpcihkZXYsIGJyb2tlbik7CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKICAgICAvKgogICAgICoqIElmIHRoZSBhZGRyZXNzIHN0YXJ0cyB3aXRoIDAwIGEwLCB3ZSBoYXZlIHRvIGJpdC1yZXZlcnNlCiAgICAgKiogZWFjaCBieXRlIG9mIHRoZSBhZGRyZXNzLgpAQCAtNDE2OCw3ICs0MTY4LDcgQEAKIAkJICAgIGRldi0+ZGV2X2FkZHJbaV0gPSAoKHggJiAweDU1KSA8PCAxKSArICgoeCAmIDB4YWEpID4+IDEpOwogCSAgICB9CiAgICAgfQotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLworI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCiAgICAgLyogVGVzdCBmb3IgYSBiYWQgZW5ldCBhZGRyZXNzICovCiAgICAgc3RhdHVzID0gdGVzdF9iYWRfZW5ldChkZXYsIHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKaW5kZXggNGRkOGEwYi4uN2Y1OWEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiBzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvIHsKIAl1MzIgY2hpcF9pZDsJCQkvKiBDaGlwIHZlbmRvci9EZXZpY2UgSUQgKi8KIAl1MzIgY2hpcF9yZXZpc2lvbjsJCS8qIENoaXAgcmV2aXNpb24gKi8KLQlzdHJ1Y3QgREVWSUNFICpuZXh0X2RldjsJLyogbmV4dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgREVWSUNFICpkZXY7CQkvKiBuZXQgZGV2aWNlICovCiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CQkvKiBQQ0kgZGV2aWNlICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCkBAIC0zOTksNiArMzk5LDggQEAKIAkvKiBJbml0IHN5c3RlbSAmIGRldmljZSAqLwogCWRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWRiLT5kZXYgPSBkZXY7CisKIAkvKiBBbGxvY2F0ZSBUeC9SeCBkZXNjcmlwdG9yIG1lbW9yeSAqLwogCWRiLT5kZXNjX3Bvb2xfcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIERFU0NfQUxMX0NOVCArIDB4MjAsICZkYi0+ZGVzY19wb29sX2RtYV9wdHIpOwogCWRiLT5idWZfcG9vbF9wdHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9CVUZfQUxMT0MgKiBUWF9ERVNDX0NOVCArIDQsICZkYi0+YnVmX3Bvb2xfZG1hX3B0cik7CkBAIC00MjYsNiArNDI4LDcgQEAKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZwb2xsX2RtZmU7CiAjZW5kaWYKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKwluZXRpZl9jYXJyaWVyX29mZihkYi0+ZGV2KTsKIAlzcGluX2xvY2tfaW5pdCgmZGItPmxvY2spOwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NTAsICZwY2lfcG1yKTsKQEAgLTEwNTAsNiArMTA1Myw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9saW5rICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF9saW5rLAogfTsKIAogLyoKQEAgLTExNDQsNiArMTE0OCw3IEBACiAJCS8qIExpbmsgRmFpbGVkICovCiAJCURNRkVfREJVRygwLCAiTGluayBGYWlsZWQiLCB0bXBfY3IxMik7CiAJCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRiLT5kZXYpOwogCiAJCS8qIEZvciBGb3JjZSAxMC8xMDBNIEhhbGYvRnVsbCBtb2RlOiBFbmFibGUgQXV0by1OZWdvIG1vZGUgKi8KIAkJLyogQVVUTyBvciBmb3JjZSAxTSBIb21lcnVuL0xvbmdydW4gZG9uJ3QgbmVlZCAqLwpAQCAtMTE2Niw2ICsxMTcxLDggQEAKIAkJCWlmICggKGRiLT5tZWRpYV9tb2RlICYgRE1GRV9BVVRPKSAmJgogCQkJCWRtZmVfc2Vuc2Vfc3BlZWQoZGIpICkKIAkJCQlkYi0+bGlua19mYWlsZWQgPSAxOworCQkJZWxzZQorCQkJCW5ldGlmX2NhcnJpZXJfb24oZGItPmRldik7CiAJCQlkbWZlX3Byb2Nlc3NfbW9kZShkYik7CiAJCQkvKiBTSE9XX01FRElBX1RZUEUoZGItPm9wX21vZGUpOyAqLwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC90aW1lci5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdGltZXIuYwppbmRleCAwNjZlNWQ2Li5kZjMyNmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC90aW1lci5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMKQEAgLTE4LDEwICsxOCwxMSBAQAogI2luY2x1ZGUgInR1bGlwLmgiCiAKIAotdm9pZCB0dWxpcF9tZWRpYV90YXNrKHZvaWQgKmRhdGEpCit2b2lkIHR1bGlwX21lZGlhX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0dWxpcF9wcml2YXRlLCBtZWRpYV93b3JrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPmRldjsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CiAJdTMyIGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOwogCWludCBuZXh0X3RpY2sgPSAyKkhaOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaCBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKaW5kZXggYWQxMDdmNC4uMjVmMjVkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaAorKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCkBAIC00NCw3ICs0NCw3IEBACiAJaW50IHZhbGlkX2ludHJzOwkvKiBDU1I3IGludGVycnVwdCBlbmFibGUgc2V0dGluZ3MgKi8KIAlpbnQgZmxhZ3M7CiAJdm9pZCAoKm1lZGlhX3RpbWVyKSAodW5zaWduZWQgbG9uZyk7Ci0Jdm9pZCAoKm1lZGlhX3Rhc2spICh2b2lkICopOworCXdvcmtfZnVuY190IG1lZGlhX3Rhc2s7CiB9OwogCiAKQEAgLTM5Miw2ICszOTIsNyBAQAogCWludCBjc3IxMl9zaGFkb3c7CiAJaW50IHBhZDA7CQkvKiBVc2VkIGZvciA4LWJ5dGUgYWxpZ25tZW50ICovCiAJc3RydWN0IHdvcmtfc3RydWN0IG1lZGlhX3dvcms7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIH07CiAKIApAQCAtNDA2LDcgKzQwNyw3IEBACiAKIC8qIDIxMTQyLmMgKi8KIGV4dGVybiB1MTYgdDIxMTQyX2NzcjE0W107Ci12b2lkIHQyMTE0Ml9tZWRpYV90YXNrKHZvaWQgKmRhdGEpOwordm9pZCB0MjExNDJfbWVkaWFfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCB0MjExNDJfc3RhcnRfbndheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgdDIxMTQyX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpOwogCkBAIC00NDQsNyArNDQ1LDcgQEAKIHZvaWQgcG5pY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCiAvKiB0aW1lci5jICovCi12b2lkIHR1bGlwX21lZGlhX3Rhc2sodm9pZCAqZGF0YSk7Cit2b2lkIHR1bGlwX21lZGlhX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgbXhpY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogdm9pZCBjb21ldF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKaW5kZXggMGFlZTYxOC4uNWEzNTM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwpAQCAtMTM2Nyw2ICsxMzY3LDcgQEAKIAkgKiBpdCBpcyB6ZXJvZWQgYW5kIGFsaWduZWQgaW4gYWxsb2NfZXRoZXJkZXYKIAkgKi8KIAl0cCA9IG5ldGRldl9wcml2KGRldik7CisJdHAtPmRldiA9IGRldjsKIAogCXRwLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKIAkJCQkJICAgc2l6ZW9mKHN0cnVjdCB0dWxpcF9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRSArCkBAIC0xMzg5LDcgKzEzOTAsNyBAQAogCXRwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OwogCXRwLT50aW1lci5mdW5jdGlvbiA9IHR1bGlwX3RibFt0cC0+Y2hpcF9pZF0ubWVkaWFfdGltZXI7CiAKLQlJTklUX1dPUksoJnRwLT5tZWRpYV93b3JrLCB0dWxpcF90YmxbdHAtPmNoaXBfaWRdLm1lZGlhX3Rhc2ssIGRldik7CisJSU5JVF9XT1JLKCZ0cC0+bWVkaWFfd29yaywgdHVsaXBfdGJsW3RwLT5jaGlwX2lkXS5tZWRpYV90YXNrKTsKIAogCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKaW5kZXggM2JmOWU2My4uOTc4MWIxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMTE3LDYgKzExNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KQEAgLTEyNyw3ICsxMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IDEyY2Q3YjUuLjgyNDMxNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtMiwxNCArMiwxMSBAQAogICogQ29weXJpZ2h0IChDKSBGcmVlc2NhbGUgU2VtaWNvbmR1dG9yLCBJbmMuIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogQXV0aG9yOiBTaGxvbWkgR3JpZGlzaCA8Z3JpZGlzaEBmcmVlc2NhbGUuY29tPgorICoJICAgTGkgWWFuZyA8bGVvbGlAZnJlZXNjYWxlLmNvbT4KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqIFFFIFVDQyBHaWdhYml0IEV0aGVybmV0IERyaXZlcgogICoKLSAqIENoYW5nZWxvZzoKLSAqIEp1bCA2LCAyMDA2IExpIFlhbmcgPExlb0xpQGZyZWVzY2FsZS5jb20+Ci0gKiAtIFJlYXJyYW5nZSBjb2RlIGFuZCBzdHlsZSBmaXhlcwotICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKQEAgLTMxLDkgKzI4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogCisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC03MCw3ICs2Nyw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodWdldGhfbG9jayk7CiAKLXN0YXRpYyB1Y2NfZ2V0aF9pbmZvX3QgdWdldGhfcHJpbWFyeV9pbmZvID0geworc3RhdGljIHN0cnVjdCB1Y2NfZ2V0aF9pbmZvIHVnZXRoX3ByaW1hcnlfaW5mbyA9IHsKIAkudWZfaW5mbyA9IHsKIAkJICAgIC5iZF9tZW1fcGFydCA9IE1FTV9QQVJUX1NZU1RFTSwKIAkJICAgIC5ydHNtID0gVUNDX0ZBU1RfU0VORF9JRExFU19CRVRXRUVOX0ZSQU1FUywKQEAgLTE2Myw3ICsxNjAsNyBAQAogCS5yaXNjUnggPSBRRV9SSVNDX0FMTE9DQVRJT05fUklTQzFfQU5EX1JJU0MyLAogfTsKIAotc3RhdGljIHVjY19nZXRoX2luZm9fdCB1Z2V0aF9pbmZvWzhdOworc3RhdGljIHN0cnVjdCB1Y2NfZ2V0aF9pbmZvIHVnZXRoX2luZm9bOF07CiAKICNpZmRlZiBERUJVRwogc3RhdGljIHZvaWQgbWVtX2Rpc3AodTggKmFkZHIsIGludCBzaXplKQpAQCAtMTk3LDkgKzE5NCw5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKHVnZXRoX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWdldGhfbG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkX3RhaWwobm9kZSwgbGgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWdldGhfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVnZXRoX2xvY2ssIGZsYWdzKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfVUdFVEhfRklMVEVSSU5HICovCiAKQEAgLTIwNywyMCArMjA0LDIwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKHVnZXRoX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWdldGhfbG9jaywgZmxhZ3MpOwogCWlmICghbGlzdF9lbXB0eShsaCkpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSA9IGxoLT5uZXh0OwogCQlsaXN0X2RlbChub2RlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1Z2V0aF9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVnZXRoX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIG5vZGU7CiAJfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1Z2V0aF9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVnZXRoX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogfQogCi1zdGF0aWMgaW50IGdldF9pbnRlcmZhY2VfZGV0YWlscyhlbmV0X2ludGVyZmFjZV9lIGVuZXRfaW50ZXJmYWNlLAotCQkJCSBlbmV0X3NwZWVkX2UgKnNwZWVkLAorc3RhdGljIGludCBnZXRfaW50ZXJmYWNlX2RldGFpbHMoZW51bSBlbmV0X2ludGVyZmFjZSBlbmV0X2ludGVyZmFjZSwKKwkJCQkgZW51bSBlbmV0X3NwZWVkICpzcGVlZCwKIAkJCQkgaW50ICpyMTBtLAogCQkJCSBpbnQgKnJtbSwKIAkJCQkgaW50ICpycG0sCkBAIC0yODMsNyArMjgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICpnZXRfbmV3X3NrYih1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLCB1OCAqYmQpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmdldF9uZXdfc2tiKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwgdTggKmJkKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCkBAIC0zMDMsMjEgKzMwMCwxOSBAQAogCiAJc2tiLT5kZXYgPSB1Z2V0aC0+ZGV2OwogCi0JQkRfQlVGRkVSX1NFVChiZCwKKwlvdXRfYmUzMigmKChzdHJ1Y3QgcWVfYmQgKiliZCktPmJ1ZiwKIAkJICAgICAgZG1hX21hcF9zaW5nbGUoTlVMTCwKIAkJCQkgICAgIHNrYi0+ZGF0YSwKIAkJCQkgICAgIHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLm1heF9yeF9idWZfbGVuZ3RoICsKIAkJCQkgICAgIFVDQ19HRVRIX1JYX0RBVEFfQlVGX0FMSUdOTUVOVCwKIAkJCQkgICAgIERNQV9GUk9NX0RFVklDRSkpOwogCi0JQkRfU1RBVFVTX0FORF9MRU5HVEhfU0VUKGJkLAotCQkJCSAoUl9FIHwgUl9JIHwKLQkJCQkgIChCRF9TVEFUVVNfQU5EX0xFTkdUSChiZCkgJiBSX1cpKSk7CisJb3V0X2JlMzIoKHUzMiAqKWJkLCAoUl9FIHwgUl9JIHwgKGluX2JlMzIoKHUzMiAqKWJkKSAmIFJfVykpKTsKIAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBpbnQgcnhfYmRfYnVmZmVyX3NldCh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLCB1OCByeFEpCitzdGF0aWMgaW50IHJ4X2JkX2J1ZmZlcl9zZXQoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLCB1OCByeFEpCiB7CiAJdTggKmJkOwogCXUzMiBiZF9zdGF0dXM7CkBAIC0zMjgsNyArMzIzLDcgQEAKIAlpID0gMDsKIAogCWRvIHsKLQkJYmRfc3RhdHVzID0gQkRfU1RBVFVTX0FORF9MRU5HVEgoYmQpOworCQliZF9zdGF0dXMgPSBpbl9iZTMyKCh1MzIqKWJkKTsKIAkJc2tiID0gZ2V0X25ld19za2IodWdldGgsIGJkKTsKIAogCQlpZiAoIXNrYikJLyogSWYgY2FuIG5vdCBhbGxvY2F0ZSBkYXRhIGJ1ZmZlciwKQEAgLTMzOCwxOSArMzMzLDE5IEBACiAJCXVnZXRoLT5yeF9za2J1ZmZbcnhRXVtpXSA9IHNrYjsKIAogCQkvKiBhZHZhbmNlIHRoZSBCRCBwb2ludGVyICovCi0JCWJkICs9IFVDQ19HRVRIX1NJWkVfT0ZfQkQ7CisJCWJkICs9IHNpemVvZihzdHJ1Y3QgcWVfYmQpOwogCQlpKys7CiAJfSB3aGlsZSAoIShiZF9zdGF0dXMgJiBSX1cpKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZpbGxfaW5pdF9lbmV0X2VudHJpZXModWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwKK3N0YXRpYyBpbnQgZmlsbF9pbml0X2VuZXRfZW50cmllcyhzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsCiAJCQkJICB2b2xhdGlsZSB1MzIgKnBfc3RhcnQsCiAJCQkJICB1OCBudW1fZW50cmllcywKIAkJCQkgIHUzMiB0aHJlYWRfc2l6ZSwKIAkJCQkgIHUzMiB0aHJlYWRfYWxpZ25tZW50LAotCQkJCSAgcWVfcmlzY19hbGxvY2F0aW9uX2UgcmlzYywKKwkJCQkgIGVudW0gcWVfcmlzY19hbGxvY2F0aW9uIHJpc2MsCiAJCQkJICBpbnQgc2tpcF9wYWdlX2Zvcl9maXJzdF9lbnRyeSkKIHsKIAl1MzIgaW5pdF9lbmV0X29mZnNldDsKQEAgLTM4MywxMCArMzc4LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmV0dXJuX2luaXRfZW5ldF9lbnRyaWVzKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCitzdGF0aWMgaW50IHJldHVybl9pbml0X2VuZXRfZW50cmllcyhzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsCiAJCQkJICAgIHZvbGF0aWxlIHUzMiAqcF9zdGFydCwKIAkJCQkgICAgdTggbnVtX2VudHJpZXMsCi0JCQkJICAgIHFlX3Jpc2NfYWxsb2NhdGlvbl9lIHJpc2MsCisJCQkJICAgIGVudW0gcWVfcmlzY19hbGxvY2F0aW9uIHJpc2MsCiAJCQkJICAgIGludCBza2lwX3BhZ2VfZm9yX2ZpcnN0X2VudHJ5KQogewogCXUzMiBpbml0X2VuZXRfb2Zmc2V0OwpAQCAtNDE2LDExICs0MTEsMTEgQEAKIH0KIAogI2lmZGVmIERFQlVHCi1zdGF0aWMgaW50IGR1bXBfaW5pdF9lbmV0X2VudHJpZXModWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwKK3N0YXRpYyBpbnQgZHVtcF9pbml0X2VuZXRfZW50cmllcyhzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsCiAJCQkJICB2b2xhdGlsZSB1MzIgKnBfc3RhcnQsCiAJCQkJICB1OCBudW1fZW50cmllcywKIAkJCQkgIHUzMiB0aHJlYWRfc2l6ZSwKLQkJCQkgIHFlX3Jpc2NfYWxsb2NhdGlvbl9lIHJpc2MsCisJCQkJICBlbnVtIHFlX3Jpc2NfYWxsb2NhdGlvbiByaXNjLAogCQkJCSAgaW50IHNraXBfcGFnZV9mb3JfZmlyc3RfZW50cnkpCiB7CiAJdTMyIGluaXRfZW5ldF9vZmZzZXQ7CkBAIC00NTYsMTQgKzQ1MSwxNCBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVUdFVEhfRklMVEVSSU5HCi1zdGF0aWMgZW5ldF9hZGRyX2NvbnRhaW5lcl90ICpnZXRfZW5ldF9hZGRyX2NvbnRhaW5lcih2b2lkKQorc3RhdGljIHN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyICpnZXRfZW5ldF9hZGRyX2NvbnRhaW5lcih2b2lkKQogewotCWVuZXRfYWRkcl9jb250YWluZXJfdCAqZW5ldF9hZGRyX2NvbnQ7CisJc3RydWN0IGVuZXRfYWRkcl9jb250YWluZXIgKmVuZXRfYWRkcl9jb250OwogCiAJLyogYWxsb2NhdGUgbWVtb3J5ICovCi0JZW5ldF9hZGRyX2NvbnQgPSBrbWFsbG9jKHNpemVvZihlbmV0X2FkZHJfY29udGFpbmVyX3QpLCBHRlBfS0VSTkVMKTsKKwllbmV0X2FkZHJfY29udCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbmV0X2FkZHJfY29udCkgewotCQl1Z2V0aF9lcnIoIiVzOiBObyBtZW1vcnkgZm9yIGVuZXRfYWRkcl9jb250YWluZXJfdCBvYmplY3QuIiwKKwkJdWdldGhfZXJyKCIlczogTm8gbWVtb3J5IGZvciBlbmV0X2FkZHJfY29udGFpbmVyIG9iamVjdC4iLAogCQkJICBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC00NzIsNDUgKzQ2Nyw0MyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19VR0VUSF9GSUxURVJJTkcgKi8KIAotc3RhdGljIHZvaWQgcHV0X2VuZXRfYWRkcl9jb250YWluZXIoZW5ldF9hZGRyX2NvbnRhaW5lcl90ICplbmV0X2FkZHJfY29udCkKK3N0YXRpYyB2b2lkIHB1dF9lbmV0X2FkZHJfY29udGFpbmVyKHN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyICplbmV0X2FkZHJfY29udCkKIHsKIAlrZnJlZShlbmV0X2FkZHJfY29udCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfVUdFVEhfRklMVEVSSU5HCi1zdGF0aWMgaW50IGh3X2FkZF9hZGRyX2luX3BhZGRyKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCi0JCQkJZW5ldF9hZGRyX3QgKnBfZW5ldF9hZGRyLCB1OCBwYWRkcl9udW0pCitzdGF0aWMgaW50IHNldF9tYWNfYWRkcihfX2JlMTYgX19pb21lbSAqcmVnLCB1OCAqbWFjKQogewotCXVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICpwXzgyeHhfYWRkcl9maWx0OworCW91dF9iZTE2KCZyZWdbMF0sICgodTE2KW1hY1s1XSA8PCA4KSB8IG1hY1s0XSk7CisJb3V0X2JlMTYoJnJlZ1sxXSwgKCh1MTYpbWFjWzNdIDw8IDgpIHwgbWFjWzJdKTsKKwlvdXRfYmUxNigmcmVnWzJdLCAoKHUxNiltYWNbMV0gPDwgOCkgfCBtYWNbMF0pOworfQorCisjaWZkZWYgQ09ORklHX1VHRVRIX0ZJTFRFUklORworc3RhdGljIGludCBod19hZGRfYWRkcl9pbl9wYWRkcihzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpwX2VuZXRfYWRkciwgdTggcGFkZHJfbnVtKQoreworCXN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKnBfODJ4eF9hZGRyX2ZpbHQ7CiAKIAlpZiAoIShwYWRkcl9udW0gPCBOVU1fT0ZfUEFERFJTKSkgewotCQl1Z2V0aF93YXJuKCIlczogSWxsYWdlbCBwYWRkcl9udW0uIiwgX19GVU5DVElPTl9fKTsKKwkJdWdldGhfd2FybigiJXM6IElsbGVnYWwgcGFkZHJfbnVtLiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXBfODJ4eF9hZGRyX2ZpbHQgPQotCSAgICAodWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKikgdWdldGgtPnBfcnhfZ2xibF9wcmFtLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKikgdWdldGgtPnBfcnhfZ2xibF9wcmFtLT4KIAkgICAgYWRkcmVzc2ZpbHRlcmluZzsKIAogCS8qIEV0aGVybmV0IGZyYW1lcyBhcmUgZGVmaW5lZCBpbiBMaXR0bGUgRW5kaWFuIG1vZGUsICAgICovCiAJLyogdGhlcmVmb3JlIHRvIGluc2VydCB0aGUgYWRkcmVzcyB3ZSByZXZlcnNlIHRoZSBieXRlcy4gKi8KLQlvdXRfYmUxNigmcF84Mnh4X2FkZHJfZmlsdC0+cGFkZHJbcGFkZHJfbnVtXS5oLAotCQkgKHUxNikgKCgodTE2KSAoKCh1MTYpICgoKnBfZW5ldF9hZGRyKVs1XSkpIDw8IDgpKSB8Ci0JCQkodTE2KSAoKnBfZW5ldF9hZGRyKVs0XSkpOwotCW91dF9iZTE2KCZwXzgyeHhfYWRkcl9maWx0LT5wYWRkcltwYWRkcl9udW1dLm0sCi0JCSAodTE2KSAoKCh1MTYpICgoKHUxNikgKCgqcF9lbmV0X2FkZHIpWzNdKSkgPDwgOCkpIHwKLQkJCSh1MTYpICgqcF9lbmV0X2FkZHIpWzJdKSk7Ci0Jb3V0X2JlMTYoJnBfODJ4eF9hZGRyX2ZpbHQtPnBhZGRyW3BhZGRyX251bV0ubCwKLQkJICh1MTYpICgoKHUxNikgKCgodTE2KSAoKCpwX2VuZXRfYWRkcilbMV0pKSA8PCA4KSkgfAotCQkJKHUxNikgKCpwX2VuZXRfYWRkcilbMF0pKTsKLQorCXNldF9tYWNfYWRkcigmcF84Mnh4X2FkZHJfZmlsdC0+cGFkZHJbcGFkZHJfbnVtXS5oLCBwX2VuZXRfYWRkcik7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX1VHRVRIX0ZJTFRFUklORyAqLwogCi1zdGF0aWMgaW50IGh3X2NsZWFyX2FkZHJfaW5fcGFkZHIodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwgdTggcGFkZHJfbnVtKQorc3RhdGljIGludCBod19jbGVhcl9hZGRyX2luX3BhZGRyKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwgdTggcGFkZHJfbnVtKQogewotCXVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICpwXzgyeHhfYWRkcl9maWx0OworCXN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKnBfODJ4eF9hZGRyX2ZpbHQ7CiAKIAlpZiAoIShwYWRkcl9udW0gPCBOVU1fT0ZfUEFERFJTKSkgewogCQl1Z2V0aF93YXJuKCIlczogSWxsYWdlbCBwYWRkcl9udW0uIiwgX19GVU5DVElPTl9fKTsKQEAgLTUxOCw3ICs1MTEsNyBAQAogCX0KIAogCXBfODJ4eF9hZGRyX2ZpbHQgPQotCSAgICAodWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKikgdWdldGgtPnBfcnhfZ2xibF9wcmFtLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKikgdWdldGgtPnBfcnhfZ2xibF9wcmFtLT4KIAkgICAgYWRkcmVzc2ZpbHRlcmluZzsKIAogCS8qIFdyaXRpbmcgYWRkcmVzcyBmZi5mZi5mZi5mZi5mZi5mZiBkaXNhYmxlcyBhZGRyZXNzCkBAIC01MzAsMTQgKzUyMywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBod19hZGRfYWRkcl9pbl9oYXNoKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCi0JCQkJZW5ldF9hZGRyX3QgKnBfZW5ldF9hZGRyKQorc3RhdGljIHZvaWQgaHdfYWRkX2FkZHJfaW5faGFzaChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpwX2VuZXRfYWRkcikKIHsKLQl1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW1fdCAqcF84Mnh4X2FkZHJfZmlsdDsKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OwogCXUzMiBjZWNyX3N1YmJsb2NrOwogCiAJcF84Mnh4X2FkZHJfZmlsdCA9Ci0JICAgICh1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW1fdCAqKSB1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPgorCSAgICAoc3RydWN0IHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbSAqKSB1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPgogCSAgICBhZGRyZXNzZmlsdGVyaW5nOwogCiAJY2Vjcl9zdWJibG9jayA9CkBAIC01NDYsMjUgKzUzOSwxOCBAQAogCS8qIEV0aGVybmV0IGZyYW1lcyBhcmUgZGVmaW5lZCBpbiBMaXR0bGUgRW5kaWFuIG1vZGUsCiAJdGhlcmVmb3IgdG8gaW5zZXJ0ICovCiAJLyogdGhlIGFkZHJlc3MgdG8gdGhlIGhhc2ggKEJpZyBFbmRpYW4gbW9kZSksIHdlIHJldmVyc2UgdGhlIGJ5dGVzLiovCi0Jb3V0X2JlMTYoJnBfODJ4eF9hZGRyX2ZpbHQtPnRhZGRyLmgsCi0JCSAodTE2KSAoKCh1MTYpICgoKHUxNikgKCgqcF9lbmV0X2FkZHIpWzVdKSkgPDwgOCkpIHwKLQkJCSh1MTYpICgqcF9lbmV0X2FkZHIpWzRdKSk7Ci0Jb3V0X2JlMTYoJnBfODJ4eF9hZGRyX2ZpbHQtPnRhZGRyLm0sCi0JCSAodTE2KSAoKCh1MTYpICgoKHUxNikgKCgqcF9lbmV0X2FkZHIpWzNdKSkgPDwgOCkpIHwKLQkJCSh1MTYpICgqcF9lbmV0X2FkZHIpWzJdKSk7Ci0Jb3V0X2JlMTYoJnBfODJ4eF9hZGRyX2ZpbHQtPnRhZGRyLmwsCi0JCSAodTE2KSAoKCh1MTYpICgoKHUxNikgKCgqcF9lbmV0X2FkZHIpWzFdKSkgPDwgOCkpIHwKLQkJCSh1MTYpICgqcF9lbmV0X2FkZHIpWzBdKSk7CisKKwlzZXRfbWFjX2FkZHIoJnBfODJ4eF9hZGRyX2ZpbHQtPnRhZGRyLmgsIHBfZW5ldF9hZGRyKTsKIAogCXFlX2lzc3VlX2NtZChRRV9TRVRfR1JPVVBfQUREUkVTUywgY2Vjcl9zdWJibG9jaywKLQkJICAgICAodTgpIFFFX0NSX1BST1RPQ09MX0VUSEVSTkVULCAwKTsKKwkJICAgICBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwgMCk7CiB9CiAKICNpZmRlZiBDT05GSUdfVUdFVEhfTUFHSUNfUEFDS0VUCi1zdGF0aWMgdm9pZCBtYWdpY19wYWNrZXRfZGV0ZWN0aW9uX2VuYWJsZSh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoKQorc3RhdGljIHZvaWQgbWFnaWNfcGFja2V0X2RldGVjdGlvbl9lbmFibGUoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKLQl1Y2NfZ2V0aF90ICp1Z19yZWdzOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOworCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKIAl1MzIgbWFjY2ZnMiwgdWNjbTsKIAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKQEAgLTU4MSwxMCArNTY3LDEwIEBACiAJb3V0X2JlMzIoJnVnX3JlZ3MtPm1hY2NmZzIsIG1hY2NmZzIpOwogfQogCi1zdGF0aWMgdm9pZCBtYWdpY19wYWNrZXRfZGV0ZWN0aW9uX2Rpc2FibGUodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyB2b2lkIG1hZ2ljX3BhY2tldF9kZXRlY3Rpb25fZGlzYWJsZShzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOwotCXVjY19nZXRoX3QgKnVnX3JlZ3M7CisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CisJc3RydWN0IHVjY19nZXRoICp1Z19yZWdzOwogCXUzMiBtYWNjZmcyLCB1Y2NtOwogCiAJdWNjZiA9IHVnZXRoLT51Y2NmOwpAQCAtNjAyLDI2ICs1ODgsMjYgQEAKIH0KICNlbmRpZiAvKiBNQUdJQ19QQUNLRVQgKi8KIAotc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9hZGRyKGVuZXRfYWRkcl90ICphZGRyMSwgZW5ldF9hZGRyX3QgKmFkZHIyKQorc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9hZGRyKHU4ICoqYWRkcjEsIHU4ICoqYWRkcjIpCiB7CiAJcmV0dXJuIG1lbWNtcChhZGRyMSwgYWRkcjIsIEVORVRfTlVNX09DVEVUU19QRVJfQUREUkVTUyk7CiB9CiAKICNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgZ2V0X3N0YXRpc3RpY3ModWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwKLQkJCSAgIHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfdCAqCitzdGF0aWMgdm9pZCBnZXRfc3RhdGlzdGljcyhzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgsCisJCQkgICBzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljcyAqCiAJCQkgICB0eF9maXJtd2FyZV9zdGF0aXN0aWNzLAotCQkJICAgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc190ICoKKwkJCSAgIHN0cnVjdCB1Y2NfZ2V0aF9yeF9maXJtd2FyZV9zdGF0aXN0aWNzICoKIAkJCSAgIHJ4X2Zpcm13YXJlX3N0YXRpc3RpY3MsCi0JCQkgICB1Y2NfZ2V0aF9oYXJkd2FyZV9zdGF0aXN0aWNzX3QgKmhhcmR3YXJlX3N0YXRpc3RpY3MpCisJCQkgICBzdHJ1Y3QgdWNjX2dldGhfaGFyZHdhcmVfc3RhdGlzdGljcyAqaGFyZHdhcmVfc3RhdGlzdGljcykKIHsKLQl1Y2NfZmFzdF90ICp1Zl9yZWdzOwotCXVjY19nZXRoX3QgKnVnX3JlZ3M7Ci0JdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3QgKnBfdHhfZndfc3RhdGlzdGljc19wcmFtOwotCXVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90ICpwX3J4X2Z3X3N0YXRpc3RpY3NfcHJhbTsKKwlzdHJ1Y3QgdWNjX2Zhc3QgKnVmX3JlZ3M7CisJc3RydWN0IHVjY19nZXRoICp1Z19yZWdzOworCXN0cnVjdCB1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW0gKnBfdHhfZndfc3RhdGlzdGljc19wcmFtOworCXN0cnVjdCB1Y2NfZ2V0aF9yeF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW0gKnBfcnhfZndfc3RhdGlzdGljc19wcmFtOwogCiAJdWdfcmVncyA9IHVnZXRoLT51Z19yZWdzOwotCXVmX3JlZ3MgPSAodWNjX2Zhc3RfdCAqKSB1Z19yZWdzOworCXVmX3JlZ3MgPSAoc3RydWN0IHVjY19mYXN0ICopIHVnX3JlZ3M7CiAJcF90eF9md19zdGF0aXN0aWNzX3ByYW0gPSB1Z2V0aC0+cF90eF9md19zdGF0aXN0aWNzX3ByYW07CiAJcF9yeF9md19zdGF0aXN0aWNzX3ByYW0gPSB1Z2V0aC0+cF9yeF9md19zdGF0aXN0aWNzX3ByYW07CiAKQEAgLTcyNyw3ICs3MTMsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZHVtcF9iZHModWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyB2b2lkIGR1bXBfYmRzKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKIAlpbnQgaTsKIAlpbnQgbGVuZ3RoOwpAQCAtNzM2LDcgKzcyMiw3IEBACiAJCWlmICh1Z2V0aC0+cF90eF9iZF9yaW5nW2ldKSB7CiAJCQlsZW5ndGggPQogCQkJICAgICh1Z2V0aC0+dWdfaW5mby0+YmRSaW5nTGVuVHhbaV0gKgotCQkJICAgICBVQ0NfR0VUSF9TSVpFX09GX0JEKTsKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBxZV9iZCkpOwogCQkJdWdldGhfaW5mbygiVFggQkRzWyVkXSIsIGkpOwogCQkJbWVtX2Rpc3AodWdldGgtPnBfdHhfYmRfcmluZ1tpXSwgbGVuZ3RoKTsKIAkJfQpAQCAtNzQ1LDE0ICs3MzEsMTQgQEAKIAkJaWYgKHVnZXRoLT5wX3J4X2JkX3JpbmdbaV0pIHsKIAkJCWxlbmd0aCA9CiAJCQkgICAgKHVnZXRoLT51Z19pbmZvLT5iZFJpbmdMZW5SeFtpXSAqCi0JCQkgICAgIFVDQ19HRVRIX1NJWkVfT0ZfQkQpOworCQkJICAgICBzaXplb2Yoc3RydWN0IHFlX2JkKSk7CiAJCQl1Z2V0aF9pbmZvKCJSWCBCRHNbJWRdIiwgaSk7CiAJCQltZW1fZGlzcCh1Z2V0aC0+cF9yeF9iZF9yaW5nW2ldLCBsZW5ndGgpOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBkdW1wX3JlZ3ModWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyB2b2lkIGR1bXBfcmVncyhzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7CiAJaW50IGk7CiAKQEAgLTg5Myw3ICs4NzksNyBAQAogCQkJdWdldGhfaW5mbygiQmFzZSBhZGRyZXNzOiAweCUwOHgiLAogCQkJCSAgICh1MzIpICYgdWdldGgtPnBfdGhyZWFkX2RhdGFfdHhbaV0pOwogCQkJbWVtX2Rpc3AoKHU4ICopICYgdWdldGgtPnBfdGhyZWFkX2RhdGFfdHhbaV0sCi0JCQkJIHNpemVvZih1Y2NfZ2V0aF90aHJlYWRfZGF0YV90eF90KSk7CisJCQkJIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfdHgpKTsKIAkJfQogCX0KIAlpZiAodWdldGgtPnBfdGhyZWFkX2RhdGFfcngpIHsKQEAgLTkyNyw3ICs5MTMsNyBAQAogCQkJdWdldGhfaW5mbygiQmFzZSBhZGRyZXNzOiAweCUwOHgiLAogCQkJCSAgICh1MzIpICYgdWdldGgtPnBfdGhyZWFkX2RhdGFfcnhbaV0pOwogCQkJbWVtX2Rpc3AoKHU4ICopICYgdWdldGgtPnBfdGhyZWFkX2RhdGFfcnhbaV0sCi0JCQkJIHNpemVvZih1Y2NfZ2V0aF90aHJlYWRfZGF0YV9yeF90KSk7CisJCQkJIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfcngpKTsKIAkJfQogCX0KIAlpZiAodWdldGgtPnBfZXhmX2dsYmxfcGFyYW0pIHsKQEAgLTExMDUsNyArMTA5MSw3IEBACiAJCQl1Z2V0aF9pbmZvKCJCYXNlIGFkZHJlc3M6IDB4JTA4eCIsCiAJCQkJICAgKHUzMikgJiB1Z2V0aC0+cF9zZW5kX3FfbWVtX3JlZy0+c3FxZFtpXSk7CiAJCQltZW1fZGlzcCgodTggKikgJiB1Z2V0aC0+cF9zZW5kX3FfbWVtX3JlZy0+c3FxZFtpXSwKLQkJCQkgc2l6ZW9mKHVjY19nZXRoX3NlbmRfcXVldWVfcWRfdCkpOworCQkJCSBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3NlbmRfcXVldWVfcWQpKTsKIAkJfQogCX0KIAlpZiAodWdldGgtPnBfc2NoZWR1bGVyKSB7CkBAIC0xMTg3LDcgKzExNzMsNyBAQAogCQkJCSBxZV9tdXJhbV9hZGRyKGluX2JlMzIKIAkJCQkJICAgICAgICgmdWdldGgtPnBfcnhfYmRfcXNfdGJsW2ldLgogCQkJCQkJYmRiYXNlcHRyKSksCi0JCQkJIHNpemVvZih1Y2NfZ2V0aF9yeF9wcmVmZXRjaGVkX2Jkc190KSk7CisJCQkJIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfcnhfcHJlZmV0Y2hlZF9iZHMpKTsKIAkJfQogCX0KIAlpZiAodWdldGgtPnBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdykgewpAQCAtMTE5OCw3ICsxMTg0LDcgQEAKIAkJbWVtX2Rpc3AoKHU4ICopIHVnZXRoLT5wX2luaXRfZW5ldF9wYXJhbV9zaGFkb3csCiAJCQkgc2l6ZW9mKCp1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93KSk7CiAKLQkJc2l6ZSA9IHNpemVvZih1Y2NfZ2V0aF90aHJlYWRfcnhfcHJhbV90KTsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX3J4X3ByYW0pOwogCQlpZiAodWdldGgtPnVnX2luZm8tPnJ4RXh0ZW5kZWRGaWx0ZXJpbmcpIHsKIAkJCXNpemUgKz0KIAkJCSAgICBUSFJFQURfUlhfUFJBTV9BRERJVElPTkFMX0ZPUl9FWFRFTkRFRF9GSUxURVJJTkc7CkBAIC0xMjE2LDcgKzEyMDIsNyBAQAogCQkJCSAgICAgICAmKHVnZXRoLT5wX2luaXRfZW5ldF9wYXJhbV9zaGFkb3ctPgogCQkJCQkgdHh0aHJlYWRbMF0pLAogCQkJCSAgICAgICBFTkVUX0lOSVRfUEFSQU1fTUFYX0VOVFJJRVNfVFgsCi0JCQkJICAgICAgIHNpemVvZih1Y2NfZ2V0aF90aHJlYWRfdHhfcHJhbV90KSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfdHhfcHJhbSksCiAJCQkJICAgICAgIHVnZXRoLT51Z19pbmZvLT5yaXNjVHgsIDApOwogCQlkdW1wX2luaXRfZW5ldF9lbnRyaWVzKHVnZXRoLAogCQkJCSAgICAgICAmKHVnZXRoLT5wX2luaXRfZW5ldF9wYXJhbV9zaGFkb3ctPgpAQCAtMTU3OCwxMiArMTU2NCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFkanVzdF9lbmV0X2ludGVyZmFjZSh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoKQorc3RhdGljIGludCBhZGp1c3RfZW5ldF9pbnRlcmZhY2Uoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewotCXVjY19nZXRoX2luZm9fdCAqdWdfaW5mbzsKLQl1Y2NfZ2V0aF90ICp1Z19yZWdzOwotCXVjY19mYXN0X3QgKnVmX3JlZ3M7Ci0JZW5ldF9zcGVlZF9lIHNwZWVkOworCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvOworCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKKwlzdHJ1Y3QgdWNjX2Zhc3QgKnVmX3JlZ3M7CisJZW51bSBlbmV0X3NwZWVkIHNwZWVkOwogCWludCByZXRfdmFsLCBycG0gPSAwLCB0YmkgPSAwLCByMTBtID0gMCwgcm1tID0KIAkgICAgMCwgbGltaXRlZF90b19mdWxsX2R1cGxleCA9IDA7CiAJdTMyIHVwc21yLCBtYWNjZmcyLCB1dGJpcGFyLCB0YmlCYXNlQWRkcmVzczsKQEAgLTE2OTEsOCArMTY3Nyw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGFkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JdWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7Ci0JdWNjX2dldGhfdCAqdWdfcmVnczsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKIAl1MzIgdGVtcHZhbDsKIAlzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvID0gdWdldGgtPm1paV9pbmZvOwogCkBAIC0xNzIyLDcgKzE3MDgsNyBAQAogCQlpZiAobWlpX2luZm8tPnNwZWVkICE9IHVnZXRoLT5vbGRzcGVlZCkgewogCQkJc3dpdGNoIChtaWlfaW5mby0+c3BlZWQpIHsKIAkJCWNhc2UgMTAwMDoKLSNpZmRlZiBDT05GSUdfTVBDODM2eAorI2lmZGVmIENPTkZJR19QUENfTVBDODM2eAogLyogRklYTUU6IFRoaXMgY29kZSBpcyBmb3IgMTAwTWJzIEJVRyBmaXhpbmcsCiByZW1vdmUgdGhpcyB3aGVuIGl0IGlzIGZpeGVkISEhICovCiAJCQkJaWYgKHVnZXRoLT51Z19pbmZvLT5lbmV0X2ludGVyZmFjZSA9PQpAQCAtMTc2OCw3ICsxNzU0LDcgQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgMTAwOgogCQkJY2FzZSAxMDoKLSNpZmRlZiBDT05GSUdfTVBDODM2eAorI2lmZGVmIENPTkZJR19QUENfTVBDODM2eAogLyogRklYTUU6IFRoaXMgY29kZSBpcyBmb3IgMTAwTWJzIEJVRyBmaXhpbmcsCiByZW1vdmUgdGhpcyBsaW5lcyB3aGVuIGl0IHdpbGwgYmUgZml4ZWQhISEgKi8KIAkJCQl1Z2V0aC0+dWdfaW5mby0+ZW5ldF9pbnRlcmZhY2UgPSBFTkVUXzEwMF9SR01JSTsKQEAgLTE4MjcsOSArMTgxMyw5IEBACiAgKi8KIHN0YXRpYyBpbnQgaW5pdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBwaHlfaW5mbyAqY3VycGh5OwotCXVjY19taWlfbW5nX3QgKm1paV9yZWdzOworCXN0cnVjdCB1Y2NfbWlpX21uZyAqbWlpX3JlZ3M7CiAJc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbzsKIAlpbnQgZXJyOwogCkBAIC0xODY2LDYgKzE4NTIsOCBAQAogCW1paV9pbmZvLT5tZGlvX3JlYWQgPSAmcmVhZF9waHlfcmVnOwogCW1paV9pbmZvLT5tZGlvX3dyaXRlID0gJndyaXRlX3BoeV9yZWc7CiAKKwlzcGluX2xvY2tfaW5pdCgmbWlpX2luZm8tPm1kaW9fbG9jayk7CisKIAl1Z2V0aC0+bWlpX2luZm8gPSBtaWlfaW5mbzsKIAogCXNwaW5fbG9ja19pcnEoJnVnZXRoLT5sb2NrKTsKQEAgLTE5MTQsMTcgKzE5MDIsMTcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19VR0VUSF9UWF9PTl9ERU1PTkQKLXN0YXRpYyBpbnQgdWdldGhfdHJhbnNtaXRfb25fZGVtYW5kKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgaW50IHVnZXRoX3RyYW5zbWl0X29uX2RlbWFuZChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7Ci0JdWNjX2Zhc3RfdHJhbnNtaXRfb25fZGVtYW5kKHVnZXRoLT51Y2NmKTsKKwlzdHJ1Y3QgdWNjX2Zhc3RyYW5zbWl0X29uX2RlbWFuZCh1Z2V0aC0+dWNjZik7CiAKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IHVnZXRoX2dyYWNlZnVsX3N0b3BfdHgodWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCkKK3N0YXRpYyBpbnQgdWdldGhfZ3JhY2VmdWxfc3RvcF90eChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCiB7Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwogCXUzMiBjZWNyX3N1YmJsb2NrOwogCXUzMiB0ZW1wOwogCkBAIC0xOTQwLDcgKzE5MjgsNyBAQAogCWNlY3Jfc3ViYmxvY2sgPQogCSAgICB1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2sodWdldGgtPnVnX2luZm8tPnVmX2luZm8udWNjX251bSk7CiAJcWVfaXNzdWVfY21kKFFFX0dSQUNFRlVMX1NUT1BfVFgsIGNlY3Jfc3ViYmxvY2ssCi0JCSAgICAgKHU4KSBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwgMCk7CisJCSAgICAgUUVfQ1JfUFJPVE9DT0xfRVRIRVJORVQsIDApOwogCiAJLyogV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLwogCWRvIHsKQEAgLTE5NTIsOSArMTk0MCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWdldGhfZ3JhY2VmdWxfc3RvcF9yeCh1Y2NfZ2V0aF9wcml2YXRlX3QgKiB1Z2V0aCkKK3N0YXRpYyBpbnQgdWdldGhfZ3JhY2VmdWxfc3RvcF9yeChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqIHVnZXRoKQogewotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKIAl1MzIgY2Vjcl9zdWJibG9jazsKIAl1OCB0ZW1wOwogCkBAIC0xOTczLDcgKzE5NjEsNyBAQAogCQkgICAgdWNjX2Zhc3RfZ2V0X3FlX2NyX3N1YmJsb2NrKHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLgogCQkJCQkJdWNjX251bSk7CiAJCXFlX2lzc3VlX2NtZChRRV9HUkFDRUZVTF9TVE9QX1JYLCBjZWNyX3N1YmJsb2NrLAotCQkJICAgICAodTgpIFFFX0NSX1BST1RPQ09MX0VUSEVSTkVULCAwKTsKKwkJCSAgICAgUUVfQ1JfUFJPVE9DT0xfRVRIRVJORVQsIDApOwogCiAJCXRlbXAgPSB1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPnJ4Z3N0cGFjazsKIAl9IHdoaWxlICghKHRlbXAgJiBHUkFDRUZVTF9TVE9QX0FDS05PV0xFREdFX1JYKSk7CkBAIC0xOTgzLDQxICsxOTcxLDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWdldGhfcmVzdGFydF90eCh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoKQorc3RhdGljIGludCB1Z2V0aF9yZXN0YXJ0X3R4KHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKLQl1Y2NfZmFzdF9wcml2YXRlX3QgKnVjY2Y7CisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CiAJdTMyIGNlY3Jfc3ViYmxvY2s7CiAKIAl1Y2NmID0gdWdldGgtPnVjY2Y7CiAKIAljZWNyX3N1YmJsb2NrID0KIAkgICAgdWNjX2Zhc3RfZ2V0X3FlX2NyX3N1YmJsb2NrKHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLnVjY19udW0pOwotCXFlX2lzc3VlX2NtZChRRV9SRVNUQVJUX1RYLCBjZWNyX3N1YmJsb2NrLCAodTgpIFFFX0NSX1BST1RPQ09MX0VUSEVSTkVULAotCQkgICAgIDApOworCXFlX2lzc3VlX2NtZChRRV9SRVNUQVJUX1RYLCBjZWNyX3N1YmJsb2NrLCBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwgMCk7CiAJdWNjZi0+c3RvcHBlZF90eCA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1Z2V0aF9yZXN0YXJ0X3J4KHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgaW50IHVnZXRoX3Jlc3RhcnRfcngoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKIAl1MzIgY2Vjcl9zdWJibG9jazsKIAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKIAogCWNlY3Jfc3ViYmxvY2sgPQogCSAgICB1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2sodWdldGgtPnVnX2luZm8tPnVmX2luZm8udWNjX251bSk7Ci0JcWVfaXNzdWVfY21kKFFFX1JFU1RBUlRfUlgsIGNlY3Jfc3ViYmxvY2ssICh1OCkgUUVfQ1JfUFJPVE9DT0xfRVRIRVJORVQsCisJcWVfaXNzdWVfY21kKFFFX1JFU1RBUlRfUlgsIGNlY3Jfc3ViYmxvY2ssIFFFX0NSX1BST1RPQ09MX0VUSEVSTkVULAogCQkgICAgIDApOwogCXVjY2YtPnN0b3BwZWRfcnggPSAwOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWdldGhfZW5hYmxlKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsIGNvbW1fZGlyX2UgbW9kZSkKK3N0YXRpYyBpbnQgdWdldGhfZW5hYmxlKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwgZW51bSBjb21tX2RpciBtb2RlKQogewotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKIAlpbnQgZW5hYmxlZF90eCwgZW5hYmxlZF9yeDsKIAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKQEAgLTIwNDQsOSArMjAzMSw5IEBACiAKIH0KIAotc3RhdGljIGludCB1Z2V0aF9kaXNhYmxlKHVjY19nZXRoX3ByaXZhdGVfdCAqIHVnZXRoLCBjb21tX2Rpcl9lIG1vZGUpCitzdGF0aWMgaW50IHVnZXRoX2Rpc2FibGUoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKiB1Z2V0aCwgZW51bSBjb21tX2RpciBtb2RlKQogewotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKIAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKIApAQCAtMjA2OSw3ICsyMDU2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdWdldGhfZHVtcF9yZWdzKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgdm9pZCB1Z2V0aF9kdW1wX3JlZ3Moc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewogI2lmZGVmIERFQlVHCiAJdWNjX2Zhc3RfZHVtcF9yZWdzKHVnZXRoLT51Y2NmKTsKQEAgLTIwNzksOSArMjA2Niw5IEBACiB9CiAKICNpZmRlZiBDT05GSUdfVUdFVEhfRklMVEVSSU5HCi1zdGF0aWMgaW50IHVnZXRoX2V4dF9maWx0ZXJpbmdfc2VyaWFsaXplX3RhZCh1Y2NfZ2V0aF90YWRfcGFyYW1zX3QgKgorc3RhdGljIGludCB1Z2V0aF9leHRfZmlsdGVyaW5nX3NlcmlhbGl6ZV90YWQoc3RydWN0IHVjY19nZXRoX3RhZF9wYXJhbXMgKgogCQkJCQkgICAgIHBfVWNjR2V0aFRhZFBhcmFtcywKLQkJCQkJICAgICBxZV9mbHRyX3RhZF90ICpxZV9mbHRyX3RhZCkKKwkJCQkJICAgICBzdHJ1Y3QgcWVfZmx0cl90YWQgKnFlX2ZsdHJfdGFkKQogewogCXUxNiB0ZW1wOwogCkBAIC0yMTE5LDExICsyMTA2LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBlbmV0X2FkZHJfY29udGFpbmVyX3QKLSAgICAqdWdldGhfODJ4eF9maWx0ZXJpbmdfZ2V0X21hdGNoX2FkZHJfaW5faGFzaCh1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLAotCQkJCQkJIGVuZXRfYWRkcl90ICpwX2VuZXRfYWRkcikKK3N0YXRpYyBzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lcl90CisgICAgKnVnZXRoXzgyeHhfZmlsdGVyaW5nX2dldF9tYXRjaF9hZGRyX2luX2hhc2goc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLAorCQkJCQkJIHN0cnVjdCBlbmV0X2FkZHIgKnBfZW5ldF9hZGRyKQogewotCWVuZXRfYWRkcl9jb250YWluZXJfdCAqZW5ldF9hZGRyX2NvbnQ7CisJc3RydWN0IGVuZXRfYWRkcl9jb250YWluZXIgKmVuZXRfYWRkcl9jb250OwogCXN0cnVjdCBsaXN0X2hlYWQgKnBfbGg7CiAJdTE2IGksIG51bTsKIAlpbnQzMl90IGo7CkBAIC0yMTQ0LDcgKzIxMzEsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAJCWVuZXRfYWRkcl9jb250ID0KLQkJICAgIChlbmV0X2FkZHJfY29udGFpbmVyX3QgKikKKwkJICAgIChzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciAqKQogCQkgICAgRU5FVF9BRERSX0NPTlRfRU5UUlkoZGVxdWV1ZShwX2xoKSk7CiAJCWZvciAoaiA9IEVORVRfTlVNX09DVEVUU19QRVJfQUREUkVTUyAtIDE7IGogPj0gMDsgai0tKSB7CiAJCQlpZiAoKCpwX2VuZXRfYWRkcilbal0gIT0gKGVuZXRfYWRkcl9jb250LT5hZGRyZXNzKVtqXSkKQEAgLTIxNTcsMTEgKzIxNDQsMTEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCB1Z2V0aF84Mnh4X2ZpbHRlcmluZ19hZGRfYWRkcl9pbl9oYXNoKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsCi0JCQkJCQkgZW5ldF9hZGRyX3QgKnBfZW5ldF9hZGRyKQorc3RhdGljIGludCB1Z2V0aF84Mnh4X2ZpbHRlcmluZ19hZGRfYWRkcl9pbl9oYXNoKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwKKwkJCQkJCSBzdHJ1Y3QgZW5ldF9hZGRyICpwX2VuZXRfYWRkcikKIHsKLQl1Y2NfZ2V0aF9lbmV0X2FkZHJlc3NfcmVjb2duaXRpb25fbG9jYXRpb25fZSBsb2NhdGlvbjsKLQllbmV0X2FkZHJfY29udGFpbmVyX3QgKmVuZXRfYWRkcl9jb250OworCWVudW0gdWNjX2dldGhfZW5ldF9hZGRyZXNzX3JlY29nbml0aW9uX2xvY2F0aW9uIGxvY2F0aW9uOworCXN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyICplbmV0X2FkZHJfY29udDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwX2xoOwogCXU4IGk7CiAJdTMyIGxpbWl0OwpAQCAtMjE5NiwxOCArMjE4MywxNyBAQAogCWVucXVldWUocF9saCwgJmVuZXRfYWRkcl9jb250LT5ub2RlKTsJLyogUHV0IGl0IGJhY2sgKi8KIAkrKygqcF9jb3VudGVyKTsKIAotCWh3X2FkZF9hZGRyX2luX2hhc2godWdldGgsICYoZW5ldF9hZGRyX2NvbnQtPmFkZHJlc3MpKTsKLQorCWh3X2FkZF9hZGRyX2luX2hhc2godWdldGgsIGVuZXRfYWRkcl9jb250LT5hZGRyZXNzKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1Z2V0aF84Mnh4X2ZpbHRlcmluZ19jbGVhcl9hZGRyX2luX2hhc2godWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCwKLQkJCQkJCSAgIGVuZXRfYWRkcl90ICpwX2VuZXRfYWRkcikKK3N0YXRpYyBpbnQgdWdldGhfODJ4eF9maWx0ZXJpbmdfY2xlYXJfYWRkcl9pbl9oYXNoKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwKKwkJCQkJCSAgIHN0cnVjdCBlbmV0X2FkZHIgKnBfZW5ldF9hZGRyKQogewotCXVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICpwXzgyeHhfYWRkcl9maWx0OwotCWVuZXRfYWRkcl9jb250YWluZXJfdCAqZW5ldF9hZGRyX2NvbnQ7Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOwotCWNvbW1fZGlyX2UgY29tbV9kaXI7CisJc3RydWN0IHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbSAqcF84Mnh4X2FkZHJfZmlsdDsKKwlzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciAqZW5ldF9hZGRyX2NvbnQ7CisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CisJZW51bSBjb21tX2RpciBjb21tX2RpcjsKIAl1MTYgaSwgbnVtOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBfbGg7CiAJdTMyICphZGRyX2gsICphZGRyX2w7CkBAIC0yMjE2LDcgKzIyMDIsNyBAQAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKIAogCXBfODJ4eF9hZGRyX2ZpbHQgPQotCSAgICAodWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKikgdWdldGgtPnBfcnhfZ2xibF9wcmFtLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKikgdWdldGgtPnBfcnhfZ2xibF9wcmFtLT4KIAkgICAgYWRkcmVzc2ZpbHRlcmluZzsKIAogCWlmICghCkBAIC0yMjU2LDkgKzIyNDIsOSBAQAogCW51bSA9IC0tKCpwX2NvdW50ZXIpOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQllbmV0X2FkZHJfY29udCA9Ci0JCSAgICAoZW5ldF9hZGRyX2NvbnRhaW5lcl90ICopCisJCSAgICAoc3RydWN0IGVuZXRfYWRkcl9jb250YWluZXIgKikKIAkJICAgIEVORVRfQUREUl9DT05UX0VOVFJZKGRlcXVldWUocF9saCkpOwotCQlod19hZGRfYWRkcl9pbl9oYXNoKHVnZXRoLCAmKGVuZXRfYWRkcl9jb250LT5hZGRyZXNzKSk7CisJCWh3X2FkZF9hZGRyX2luX2hhc2godWdldGgsIGVuZXRfYWRkcl9jb250LT5hZGRyZXNzKTsKIAkJZW5xdWV1ZShwX2xoLCAmZW5ldF9hZGRyX2NvbnQtPm5vZGUpOwkvKiBQdXQgaXQgYmFjayAqLwogCX0KIApAQCAtMjI2OSwxNCArMjI1NSwxNCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19VR0VUSF9GSUxURVJJTkcgKi8KIAotc3RhdGljIGludCB1Z2V0aF84Mnh4X2ZpbHRlcmluZ19jbGVhcl9hbGxfYWRkcl9pbl9oYXNoKHVjY19nZXRoX3ByaXZhdGVfdCAqCitzdGF0aWMgaW50IHVnZXRoXzgyeHhfZmlsdGVyaW5nX2NsZWFyX2FsbF9hZGRyX2luX2hhc2goc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKgogCQkJCQkJICAgICAgIHVnZXRoLAotCQkJCQkJICAgICAgIGVuZXRfYWRkcl90eXBlX2UKKwkJCQkJCSAgICAgICBlbnVtIGVuZXRfYWRkcl90eXBlCiAJCQkJCQkgICAgICAgZW5ldF9hZGRyX3R5cGUpCiB7Ci0JdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3QgKnBfODJ4eF9hZGRyX2ZpbHQ7Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOwotCWNvbW1fZGlyX2UgY29tbV9kaXI7CisJc3RydWN0IHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbSAqcF84Mnh4X2FkZHJfZmlsdDsKKwlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKKwllbnVtIGNvbW1fZGlyIGNvbW1fZGlyOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBfbGg7CiAJdTE2IGksIG51bTsKIAl1MzIgKmFkZHJfaCwgKmFkZHJfbDsKQEAgLTIyODUsNyArMjI3MSw3IEBACiAJdWNjZiA9IHVnZXRoLT51Y2NmOwogCiAJcF84Mnh4X2FkZHJfZmlsdCA9Ci0JICAgICh1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW1fdCAqKSB1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPgorCSAgICAoc3RydWN0IHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbSAqKSB1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPgogCSAgICBhZGRyZXNzZmlsdGVyaW5nOwogCiAJaWYgKGVuZXRfYWRkcl90eXBlID09IEVORVRfQUREUl9UWVBFX0dST1VQKSB7CkBAIC0yMzMxLDggKzIzMTcsOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1VHRVRIX0ZJTFRFUklORwotc3RhdGljIGludCB1Z2V0aF84Mnh4X2ZpbHRlcmluZ19hZGRfYWRkcl9pbl9wYWRkcih1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLAotCQkJCQkJICBlbmV0X2FkZHJfdCAqcF9lbmV0X2FkZHIsCitzdGF0aWMgaW50IHVnZXRoXzgyeHhfZmlsdGVyaW5nX2FkZF9hZGRyX2luX3BhZGRyKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwKKwkJCQkJCSAgc3RydWN0IGVuZXRfYWRkciAqcF9lbmV0X2FkZHIsCiAJCQkJCQkgIHU4IHBhZGRyX251bSkKIHsKIAlpbnQgaTsKQEAgLTIzNTIsMTQgKzIzMzgsMTQgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfVUdFVEhfRklMVEVSSU5HICovCiAKLXN0YXRpYyBpbnQgdWdldGhfODJ4eF9maWx0ZXJpbmdfY2xlYXJfYWRkcl9pbl9wYWRkcih1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoLAorc3RhdGljIGludCB1Z2V0aF84Mnh4X2ZpbHRlcmluZ19jbGVhcl9hZGRyX2luX3BhZGRyKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwKIAkJCQkJCSAgICB1OCBwYWRkcl9udW0pCiB7CiAJdWdldGgtPmluZEFkZHJSZWdVc2VkW3BhZGRyX251bV0gPSAwOyAvKiBtYXJrIHRoaXMgcGFkZHIgYXMgbm90IHVzZWQgKi8KIAlyZXR1cm4gaHdfY2xlYXJfYWRkcl9pbl9wYWRkcih1Z2V0aCwgcGFkZHJfbnVtKTsvKiBjbGVhciBpbiBoYXJkd2FyZSAqLwogfQogCi1zdGF0aWMgdm9pZCB1Y2NfZ2V0aF9tZW1jbGVhbih1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoKQorc3RhdGljIHZvaWQgdWNjX2dldGhfbWVtY2xlYW4oc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewogCXUxNiBpLCBqOwogCXU4ICpiZDsKQEAgLTI0MzMsOCArMjQxOSw4IEBACiAJCWZvciAoaiA9IDA7IGogPCB1Z2V0aC0+dWdfaW5mby0+YmRSaW5nTGVuVHhbaV07IGorKykgewogCQkJaWYgKHVnZXRoLT50eF9za2J1ZmZbaV1bal0pIHsKIAkJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsCi0JCQkJCQkgQkRfQlVGRkVSX0FSRyhiZCksCi0JCQkJCQkgKEJEX1NUQVRVU19BTkRfTEVOR1RIKGJkKSAmCisJCQkJCQkgKChxZV9iZF90ICopYmQpLT5idWYsCisJCQkJCQkgKGluX2JlMzIoKHUzMiAqKWJkKSAmCiAJCQkJCQkgIEJEX0xFTkdUSF9NQVNLKSwKIAkJCQkJCSBETUFfVE9fREVWSUNFKTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueSh1Z2V0aC0+dHhfc2tidWZmW2ldW2pdKTsKQEAgLTI0NjAsMTggKzI0NDYsMTcgQEAKIAkJCWJkID0gdWdldGgtPnBfcnhfYmRfcmluZ1tpXTsKIAkJCWZvciAoaiA9IDA7IGogPCB1Z2V0aC0+dWdfaW5mby0+YmRSaW5nTGVuUnhbaV07IGorKykgewogCQkJCWlmICh1Z2V0aC0+cnhfc2tidWZmW2ldW2pdKSB7Ci0JCQkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgQkRfQlVGRkVSKGJkKSwKLQkJCQkJCSB1Z2V0aC0+dWdfaW5mby0+Ci0JCQkJCQkgdWZfaW5mby4KLQkJCQkJCSBtYXhfcnhfYnVmX2xlbmd0aCArCi0JCQkJCQkgVUNDX0dFVEhfUlhfREFUQV9CVUZfQUxJR05NRU5ULAotCQkJCQkJIERNQV9GUk9NX0RFVklDRSk7Ci0KLQkJCQkJZGV2X2tmcmVlX3NrYl9hbnkodWdldGgtPgotCQkJCQkJCSAgcnhfc2tidWZmW2ldW2pdKTsKKwkJCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLAorCQkJCQkJKChzdHJ1Y3QgcWVfYmQgKiliZCktPmJ1ZiwKKwkJCQkJCXVnZXRoLT51Z19pbmZvLT4KKwkJCQkJCXVmX2luZm8ubWF4X3J4X2J1Zl9sZW5ndGggKworCQkJCQkJVUNDX0dFVEhfUlhfREFUQV9CVUZfQUxJR05NRU5ULAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoCisJCQkJCQl1Z2V0aC0+cnhfc2tidWZmW2ldW2pdKTsKIAkJCQkJdWdldGgtPnJ4X3NrYnVmZltpXVtqXSA9IE5VTEw7CiAJCQkJfQotCQkJCWJkICs9IFVDQ19HRVRIX1NJWkVfT0ZfQkQ7CisJCQkJYmQgKz0gc2l6ZW9mKHN0cnVjdCBxZV9iZCk7CiAJCQl9CiAKIAkJCWtmcmVlKHVnZXRoLT5yeF9za2J1ZmZbaV0pOwpAQCAtMjQ5NiwxMSArMjQ4MSwxMSBAQAogCiBzdGF0aWMgdm9pZCB1Y2NfZ2V0aF9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aDsKIAlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKLQl1Y2NfZmFzdF90ICp1Zl9yZWdzOwotCXVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICpwXzgyeHhfYWRkcl9maWx0OwotCWVuZXRfYWRkcl90IHRlbXBhZGRyOworCXN0cnVjdCB1Y2NfZmFzdCAqdWZfcmVnczsKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OworCXU4IHRlbXBhZGRyWzZdOwogCXU4ICptY3B0ciwgKnRkcHRyOwogCWludCBpLCBqOwogCkBAIC0yNTE3LDcgKzI1MDIsNyBAQAogCQl1Zl9yZWdzLT51cHNtciAmPSB+VVBTTVJfUFJPOwogCiAJCXBfODJ4eF9hZGRyX2ZpbHQgPQotCQkgICAgKHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICopIHVnZXRoLT4KKwkJICAgIChzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICopIHVnZXRoLT4KIAkJICAgIHBfcnhfZ2xibF9wcmFtLT5hZGRyZXNzZmlsdGVyaW5nOwogCiAJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CkBAIC0yNTQ2LDIzICsyNTMxLDIyIEBACiAJCQkJICogY29weSBieXRlcyBNU0IgZmlyc3QgZnJvbSBkbWlfYWRkci4KIAkJCQkgKi8KIAkJCQltY3B0ciA9ICh1OCAqKSBkbWktPmRtaV9hZGRyICsgNTsKLQkJCQl0ZHB0ciA9ICh1OCAqKSAmIHRlbXBhZGRyOworCQkJCXRkcHRyID0gKHU4ICopIHRlbXBhZGRyOwogCQkJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCiAJCQkJCSp0ZHB0cisrID0gKm1jcHRyLS07CiAKIAkJCQkvKiBBc2sgQ1BNIHRvIHJ1biBDUkMgYW5kIHNldCBiaXQgaW4KIAkJCQkgKiBmaWx0ZXIgbWFzay4KIAkJCQkgKi8KLQkJCQlod19hZGRfYWRkcl9pbl9oYXNoKHVnZXRoLCAmdGVtcGFkZHIpOwotCisJCQkJaHdfYWRkX2FkZHJfaW5faGFzaCh1Z2V0aCwgdGVtcGFkZHIpOwogCQkJfQogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCB1Y2NfZ2V0aF9zdG9wKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgdm9pZCB1Y2NfZ2V0aF9zdG9wKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKLQl1Y2NfZ2V0aF90ICp1Z19yZWdzID0gdWdldGgtPnVnX3JlZ3M7CisJc3RydWN0IHVjY19nZXRoICp1Z19yZWdzID0gdWdldGgtPnVnX3JlZ3M7CiAJdTMyIHRlbXB2YWw7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMjYwNSwxNSArMjU4OSwxNSBAQAogCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIH0KIAotc3RhdGljIGludCB1Y2NfZ2V0aF9zdGFydHVwKHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgpCitzdGF0aWMgaW50IHVjY19nZXRoX3N0YXJ0dXAoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewotCXVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICpwXzgyeHhfYWRkcl9maWx0OwotCXVjY19nZXRoX2luaXRfcHJhbV90ICpwX2luaXRfZW5ldF9wcmFtOwotCXVjY19mYXN0X3ByaXZhdGVfdCAqdWNjZjsKLQl1Y2NfZ2V0aF9pbmZvX3QgKnVnX2luZm87Ci0JdWNjX2Zhc3RfaW5mb190ICp1Zl9pbmZvOwotCXVjY19mYXN0X3QgKnVmX3JlZ3M7Ci0JdWNjX2dldGhfdCAqdWdfcmVnczsKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OworCXN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0gKnBfaW5pdF9lbmV0X3ByYW07CisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CisJc3RydWN0IHVjY19nZXRoX2luZm8gKnVnX2luZm87CisJc3RydWN0IHVjY19mYXN0X2luZm8gKnVmX2luZm87CisJc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOworCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKIAlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7CiAJdTMyIHJlbW9kZXIgPSBVQ0NfR0VUSF9SRU1PREVSX0lOSVQ7CiAJdTMyIGluaXRfZW5ldF9wcmFtX29mZnNldCwgY2Vjcl9zdWJibG9jaywgY29tbWFuZCwgbWFjY2ZnMTsKQEAgLTI3ODgsNyArMjc3Miw3IEBACiAJCVVDQ19HRVRIX1ZMQU5fT1BFUkFUSU9OX05PTl9UQUdHRURfTk9QKTsKIAogCXVmX3JlZ3MgPSB1Y2NmLT51Zl9yZWdzOwotCXVnX3JlZ3MgPSAodWNjX2dldGhfdCAqKSAodWNjZi0+dWZfcmVncyk7CisJdWdfcmVncyA9IChzdHJ1Y3QgdWNjX2dldGggKikgKHVjY2YtPnVmX3JlZ3MpOwogCXVnZXRoLT51Z19yZWdzID0gdWdfcmVnczsKIAogCWluaXRfZGVmYXVsdF9yZWdfdmFscygmdWZfcmVncy0+dXBzbXIsCkBAIC0yODY5LDEwICsyODUzLDEwIEBACiAJCS8qIEFsbG9jYXRlIGluIG11bHRpcGxlIG9mCiAJCSAgIFVDQ19HRVRIX1RYX0JEX1JJTkdfU0laRV9NRU1PUllfQUxJR05NRU5ULAogCQkgICBhY2NvcmRpbmcgdG8gc3BlYyAqLwotCQlsZW5ndGggPSAoKHVnX2luZm8tPmJkUmluZ0xlblR4W2pdICogVUNDX0dFVEhfU0laRV9PRl9CRCkKKwkJbGVuZ3RoID0gKCh1Z19pbmZvLT5iZFJpbmdMZW5UeFtqXSAqIHNpemVvZihzdHJ1Y3QgcWVfYmQpKQogCQkJICAvIFVDQ19HRVRIX1RYX0JEX1JJTkdfU0laRV9NRU1PUllfQUxJR05NRU5UKQogCQkgICAgKiBVQ0NfR0VUSF9UWF9CRF9SSU5HX1NJWkVfTUVNT1JZX0FMSUdOTUVOVDsKLQkJaWYgKCh1Z19pbmZvLT5iZFJpbmdMZW5UeFtqXSAqIFVDQ19HRVRIX1NJWkVfT0ZfQkQpICUKKwkJaWYgKCh1Z19pbmZvLT5iZFJpbmdMZW5UeFtqXSAqIHNpemVvZihzdHJ1Y3QgcWVfYmQpKSAlCiAJCSAgICBVQ0NfR0VUSF9UWF9CRF9SSU5HX1NJWkVfTUVNT1JZX0FMSUdOTUVOVCkKIAkJCWxlbmd0aCArPSBVQ0NfR0VUSF9UWF9CRF9SSU5HX1NJWkVfTUVNT1JZX0FMSUdOTUVOVDsKIAkJaWYgKHVmX2luZm8tPmJkX21lbV9wYXJ0ID09IE1FTV9QQVJUX1NZU1RFTSkgewpAQCAtMjkwNCwxMyArMjg4OCwxMyBAQAogCQl9CiAJCS8qIFplcm8gdW51c2VkIGVuZCBvZiBiZCByaW5nLCBhY2NvcmRpbmcgdG8gc3BlYyAqLwogCQltZW1zZXQodWdldGgtPnBfdHhfYmRfcmluZ1tqXSArCi0JCSAgICAgICB1Z19pbmZvLT5iZFJpbmdMZW5UeFtqXSAqIFVDQ19HRVRIX1NJWkVfT0ZfQkQsIDAsCi0JCSAgICAgICBsZW5ndGggLSB1Z19pbmZvLT5iZFJpbmdMZW5UeFtqXSAqIFVDQ19HRVRIX1NJWkVfT0ZfQkQpOworCQkgICAgICAgdWdfaW5mby0+YmRSaW5nTGVuVHhbal0gKiBzaXplb2Yoc3RydWN0IHFlX2JkKSwgMCwKKwkJICAgICAgIGxlbmd0aCAtIHVnX2luZm8tPmJkUmluZ0xlblR4W2pdICogc2l6ZW9mKHN0cnVjdCBxZV9iZCkpOwogCX0KIAogCS8qIEFsbG9jYXRlIFJ4IGJkcyAqLwogCWZvciAoaiA9IDA7IGogPCB1Z19pbmZvLT5udW1RdWV1ZXNSeDsgaisrKSB7Ci0JCWxlbmd0aCA9IHVnX2luZm8tPmJkUmluZ0xlblJ4W2pdICogVUNDX0dFVEhfU0laRV9PRl9CRDsKKwkJbGVuZ3RoID0gdWdfaW5mby0+YmRSaW5nTGVuUnhbal0gKiBzaXplb2Yoc3RydWN0IHFlX2JkKTsKIAkJaWYgKHVmX2luZm8tPmJkX21lbV9wYXJ0ID09IE1FTV9QQVJUX1NZU1RFTSkgewogCQkJdTMyIGFsaWduID0gNDsKIAkJCWlmIChVQ0NfR0VUSF9SWF9CRF9SSU5HX0FMSUdOTUVOVCA+IDQpCkBAIC0yOTYwLDEyICsyOTQ0LDE1IEBACiAJCXVnZXRoLT5za2JfY3VydHhbal0gPSB1Z2V0aC0+c2tiX2RpcnR5dHhbal0gPSAwOwogCQliZCA9IHVnZXRoLT5jb25mQmRbal0gPSB1Z2V0aC0+dHhCZFtqXSA9IHVnZXRoLT5wX3R4X2JkX3Jpbmdbal07CiAJCWZvciAoaSA9IDA7IGkgPCB1Z19pbmZvLT5iZFJpbmdMZW5UeFtqXTsgaSsrKSB7Ci0JCQlCRF9CVUZGRVJfQ0xFQVIoYmQpOwotCQkJQkRfU1RBVFVTX0FORF9MRU5HVEhfU0VUKGJkLCAwKTsKLQkJCWJkICs9IFVDQ19HRVRIX1NJWkVfT0ZfQkQ7CisJCQkvKiBjbGVhciBiZCBidWZmZXIgKi8KKwkJCW91dF9iZTMyKCYoKHN0cnVjdCBxZV9iZCAqKWJkKS0+YnVmLCAwKTsKKwkJCS8qIHNldCBiZCBzdGF0dXMgYW5kIGxlbmd0aCAqLworCQkJb3V0X2JlMzIoKHUzMiAqKWJkLCAwKTsKKwkJCWJkICs9IHNpemVvZihzdHJ1Y3QgcWVfYmQpOwogCQl9Ci0JCWJkIC09IFVDQ19HRVRIX1NJWkVfT0ZfQkQ7Ci0JCUJEX1NUQVRVU19BTkRfTEVOR1RIX1NFVChiZCwgVF9XKTsvKiBmb3IgbGFzdCBCRCBzZXQgV3JhcCBiaXQgKi8KKwkJYmQgLT0gc2l6ZW9mKHN0cnVjdCBxZV9iZCk7CisJCS8qIHNldCBiZCBzdGF0dXMgYW5kIGxlbmd0aCAqLworCQlvdXRfYmUzMigodTMyICopYmQsIFRfVyk7CS8qIGZvciBsYXN0IEJEIHNldCBXcmFwIGJpdCAqLwogCX0KIAogCS8qIEluaXQgUnggYmRzICovCkBAIC0yOTg5LDEyICsyOTc2LDE1IEBACiAJCXVnZXRoLT5za2JfY3Vycnhbal0gPSAwOwogCQliZCA9IHVnZXRoLT5yeEJkW2pdID0gdWdldGgtPnBfcnhfYmRfcmluZ1tqXTsKIAkJZm9yIChpID0gMDsgaSA8IHVnX2luZm8tPmJkUmluZ0xlblJ4W2pdOyBpKyspIHsKLQkJCUJEX1NUQVRVU19BTkRfTEVOR1RIX1NFVChiZCwgUl9JKTsKLQkJCUJEX0JVRkZFUl9DTEVBUihiZCk7Ci0JCQliZCArPSBVQ0NfR0VUSF9TSVpFX09GX0JEOworCQkJLyogc2V0IGJkIHN0YXR1cyBhbmQgbGVuZ3RoICovCisJCQlvdXRfYmUzMigodTMyICopYmQsIFJfSSk7CisJCQkvKiBjbGVhciBiZCBidWZmZXIgKi8KKwkJCW91dF9iZTMyKCYoKHN0cnVjdCBxZV9iZCAqKWJkKS0+YnVmLCAwKTsKKwkJCWJkICs9IHNpemVvZihzdHJ1Y3QgcWVfYmQpOwogCQl9Ci0JCWJkIC09IFVDQ19HRVRIX1NJWkVfT0ZfQkQ7Ci0JCUJEX1NUQVRVU19BTkRfTEVOR1RIX1NFVChiZCwgUl9XKTsvKiBmb3IgbGFzdCBCRCBzZXQgV3JhcCBiaXQgKi8KKwkJYmQgLT0gc2l6ZW9mKHN0cnVjdCBxZV9iZCk7CisJCS8qIHNldCBiZCBzdGF0dXMgYW5kIGxlbmd0aCAqLworCQlvdXRfYmUzMigodTMyICopYmQsIFJfVyk7IC8qIGZvciBsYXN0IEJEIHNldCBXcmFwIGJpdCAqLwogCX0KIAogCS8qCkBAIC0zMDAzLDcgKzI5OTMsNyBAQAogCS8qIFR4IGdsb2JhbCBQUkFNICovCiAJLyogQWxsb2NhdGUgZ2xvYmFsIHR4IHBhcmFtZXRlciBSQU0gcGFnZSAqLwogCXVnZXRoLT50eF9nbGJsX3ByYW1fb2Zmc2V0ID0KLQkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mKHVjY19nZXRoX3R4X2dsb2JhbF9wcmFtX3QpLAorCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19nZXRoX3R4X2dsb2JhbF9wcmFtKSwKIAkJCSAgIFVDQ19HRVRIX1RYX0dMT0JBTF9QUkFNX0FMSUdOTUVOVCk7CiAJaWYgKElTX01VUkFNX0VSUih1Z2V0aC0+dHhfZ2xibF9wcmFtX29mZnNldCkpIHsKIAkJdWdldGhfZXJyCkBAIC0zMDEzLDEwICszMDAzLDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl1Z2V0aC0+cF90eF9nbGJsX3ByYW0gPQotCSAgICAodWNjX2dldGhfdHhfZ2xvYmFsX3ByYW1fdCAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF90eF9nbG9iYWxfcHJhbSAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KIAkJCQkJCQl0eF9nbGJsX3ByYW1fb2Zmc2V0KTsKIAkvKiBaZXJvIG91dCBwX3R4X2dsYmxfcHJhbSAqLwotCW1lbXNldCh1Z2V0aC0+cF90eF9nbGJsX3ByYW0sIDAsIHNpemVvZih1Y2NfZ2V0aF90eF9nbG9iYWxfcHJhbV90KSk7CisJbWVtc2V0KHVnZXRoLT5wX3R4X2dsYmxfcHJhbSwgMCwgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF90eF9nbG9iYWxfcHJhbSkpOwogCiAJLyogRmlsbCBnbG9iYWwgUFJBTSAqLwogCkBAIC0zMDI0LDcgKzMwMTQsNyBAQAogCS8qIFNpemUgdmFyaWVzIHdpdGggbnVtYmVyIG9mIFR4IHRocmVhZHMgKi8KIAl1Z2V0aC0+dGhyZWFkX2RhdF90eF9vZmZzZXQgPQogCSAgICBxZV9tdXJhbV9hbGxvYyhudW1UaHJlYWRzVHhOdW1lcmljYWwgKgotCQkJICAgc2l6ZW9mKHVjY19nZXRoX3RocmVhZF9kYXRhX3R4X3QpICsKKwkJCSAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfdHgpICsKIAkJCSAgIDMyICogKG51bVRocmVhZHNUeE51bWVyaWNhbCA9PSAxKSwKIAkJCSAgIFVDQ19HRVRIX1RIUkVBRF9EQVRBX0FMSUdOTUVOVCk7CiAJaWYgKElTX01VUkFNX0VSUih1Z2V0aC0+dGhyZWFkX2RhdF90eF9vZmZzZXQpKSB7CkBAIC0zMDM2LDcgKzMwMjYsNyBAQAogCX0KIAogCXVnZXRoLT5wX3RocmVhZF9kYXRhX3R4ID0KLQkgICAgKHVjY19nZXRoX3RocmVhZF9kYXRhX3R4X3QgKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CisJICAgIChzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfdHggKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CiAJCQkJCQkJdGhyZWFkX2RhdF90eF9vZmZzZXQpOwogCW91dF9iZTMyKCZ1Z2V0aC0+cF90eF9nbGJsX3ByYW0tPnRxcHRyLCB1Z2V0aC0+dGhyZWFkX2RhdF90eF9vZmZzZXQpOwogCkBAIC0zMDUzLDcgKzMwNDMsNyBAQAogCS8qIFNpemUgdmFyaWVzIHdpdGggbnVtYmVyIG9mIFR4IHF1ZXVlcyAqLwogCXVnZXRoLT5zZW5kX3FfbWVtX3JlZ19vZmZzZXQgPQogCSAgICBxZV9tdXJhbV9hbGxvYyh1Z19pbmZvLT5udW1RdWV1ZXNUeCAqCi0JCQkgICBzaXplb2YodWNjX2dldGhfc2VuZF9xdWV1ZV9xZF90KSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfc2VuZF9xdWV1ZV9xZCksCiAJCQkgICBVQ0NfR0VUSF9TRU5EX1FVRVVFX1FVRVVFX0RFU0NSSVBUT1JfQUxJR05NRU5UKTsKIAlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT5zZW5kX3FfbWVtX3JlZ19vZmZzZXQpKSB7CiAJCXVnZXRoX2VycgpAQCAtMzA2NCw3ICszMDU0LDcgQEAKIAl9CiAKIAl1Z2V0aC0+cF9zZW5kX3FfbWVtX3JlZyA9Ci0JICAgICh1Y2NfZ2V0aF9zZW5kX3F1ZXVlX21lbV9yZWdpb25fdCAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF9zZW5kX3F1ZXVlX21lbV9yZWdpb24gKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CiAJCQlzZW5kX3FfbWVtX3JlZ19vZmZzZXQpOwogCW91dF9iZTMyKCZ1Z2V0aC0+cF90eF9nbGJsX3ByYW0tPnNxcHRyLCB1Z2V0aC0+c2VuZF9xX21lbV9yZWdfb2Zmc2V0KTsKIApAQCAtMzA3Myw3ICszMDYzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgdWdfaW5mby0+bnVtUXVldWVzVHg7IGkrKykgewogCQllbmRPZlJpbmcgPQogCQkgICAgdWdldGgtPnBfdHhfYmRfcmluZ1tpXSArICh1Z19pbmZvLT5iZFJpbmdMZW5UeFtpXSAtCi0JCQkJCSAgICAgIDEpICogVUNDX0dFVEhfU0laRV9PRl9CRDsKKwkJCQkJICAgICAgMSkgKiBzaXplb2Yoc3RydWN0IHFlX2JkKTsKIAkJaWYgKHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLmJkX21lbV9wYXJ0ID09IE1FTV9QQVJUX1NZU1RFTSkgewogCQkJb3V0X2JlMzIoJnVnZXRoLT5wX3NlbmRfcV9tZW1fcmVnLT5zcXFkW2ldLmJkX3JpbmdfYmFzZSwKIAkJCQkgKHUzMikgdmlydF90b19waHlzKHVnZXRoLT5wX3R4X2JkX3JpbmdbaV0pKTsKQEAgLTMwOTYsNyArMzA4Niw3IEBACiAJaWYgKHVnX2luZm8tPm51bVF1ZXVlc1R4ID4gMSkgewogCS8qIHNjaGVkdWxlciBleGlzdHMgb25seSBpZiBtb3JlIHRoYW4gMSB0eCBxdWV1ZSAqLwogCQl1Z2V0aC0+c2NoZWR1bGVyX29mZnNldCA9Ci0JCSAgICBxZV9tdXJhbV9hbGxvYyhzaXplb2YodWNjX2dldGhfc2NoZWR1bGVyX3QpLAorCQkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9zY2hlZHVsZXIpLAogCQkJCSAgIFVDQ19HRVRIX1NDSEVEVUxFUl9BTElHTk1FTlQpOwogCQlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT5zY2hlZHVsZXJfb2Zmc2V0KSkgewogCQkJdWdldGhfZXJyCkBAIC0zMTA3LDEyICszMDk3LDEyIEBACiAJCX0KIAogCQl1Z2V0aC0+cF9zY2hlZHVsZXIgPQotCQkgICAgKHVjY19nZXRoX3NjaGVkdWxlcl90ICopIHFlX211cmFtX2FkZHIodWdldGgtPgorCQkgICAgKHN0cnVjdCB1Y2NfZ2V0aF9zY2hlZHVsZXIgKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CiAJCQkJCQkJICAgc2NoZWR1bGVyX29mZnNldCk7CiAJCW91dF9iZTMyKCZ1Z2V0aC0+cF90eF9nbGJsX3ByYW0tPnNjaGVkdWxlcmJhc2Vwb2ludGVyLAogCQkJIHVnZXRoLT5zY2hlZHVsZXJfb2Zmc2V0KTsKIAkJLyogWmVybyBvdXQgcF9zY2hlZHVsZXIgKi8KLQkJbWVtc2V0KHVnZXRoLT5wX3NjaGVkdWxlciwgMCwgc2l6ZW9mKHVjY19nZXRoX3NjaGVkdWxlcl90KSk7CisJCW1lbXNldCh1Z2V0aC0+cF9zY2hlZHVsZXIsIDAsIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfc2NoZWR1bGVyKSk7CiAKIAkJLyogU2V0IHZhbHVlcyBpbiBzY2hlZHVsZXIgKi8KIAkJb3V0X2JlMzIoJnVnZXRoLT5wX3NjaGVkdWxlci0+bWJsaW50ZXJ2YWwsCkBAIC0zMTQ0LDcgKzMxMzQsNyBAQAogCSAgICBzdGF0aXN0aWNzTW9kZSAmIFVDQ19HRVRIX1NUQVRJU1RJQ1NfR0FUSEVSSU5HX01PREVfRklSTVdBUkVfVFgpIHsKIAkJdWdldGgtPnR4X2Z3X3N0YXRpc3RpY3NfcHJhbV9vZmZzZXQgPQogCQkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mCi0JCQkJICAgKHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90KSwKKwkJCQkgICAoc3RydWN0IHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSksCiAJCQkJICAgVUNDX0dFVEhfVFhfU1RBVElTVElDU19BTElHTk1FTlQpOwogCQlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT50eF9md19zdGF0aXN0aWNzX3ByYW1fb2Zmc2V0KSkgewogCQkJdWdldGhfZXJyCkBAIC0zMTU0LDExICszMTQ0LDExIEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQl1Z2V0aC0+cF90eF9md19zdGF0aXN0aWNzX3ByYW0gPQotCQkgICAgKHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90ICopCisJCSAgICAoc3RydWN0IHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSAqKQogCQkgICAgcWVfbXVyYW1fYWRkcih1Z2V0aC0+dHhfZndfc3RhdGlzdGljc19wcmFtX29mZnNldCk7CiAJCS8qIFplcm8gb3V0IHBfdHhfZndfc3RhdGlzdGljc19wcmFtICovCiAJCW1lbXNldCh1Z2V0aC0+cF90eF9md19zdGF0aXN0aWNzX3ByYW0sCi0JCSAgICAgICAwLCBzaXplb2YodWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3QpKTsKKwkJICAgICAgIDAsIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtKSk7CiAJfQogCiAJLyogdGVtb2RlciAqLwpAQCAtMzE4Myw3ICszMTczLDcgQEAKIAkvKiBSeCBnbG9iYWwgUFJBTSAqLwogCS8qIEFsbG9jYXRlIGdsb2JhbCByeCBwYXJhbWV0ZXIgUkFNIHBhZ2UgKi8KIAl1Z2V0aC0+cnhfZ2xibF9wcmFtX29mZnNldCA9Ci0JICAgIHFlX211cmFtX2FsbG9jKHNpemVvZih1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbV90KSwKKwkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbSksCiAJCQkgICBVQ0NfR0VUSF9SWF9HTE9CQUxfUFJBTV9BTElHTk1FTlQpOwogCWlmIChJU19NVVJBTV9FUlIodWdldGgtPnJ4X2dsYmxfcHJhbV9vZmZzZXQpKSB7CiAJCXVnZXRoX2VycgpAQCAtMzE5MywxMCArMzE4MywxMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJdWdldGgtPnBfcnhfZ2xibF9wcmFtID0KLQkgICAgKHVjY19nZXRoX3J4X2dsb2JhbF9wcmFtX3QgKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CisJICAgIChzdHJ1Y3QgdWNjX2dldGhfcnhfZ2xvYmFsX3ByYW0gKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CiAJCQkJCQkJcnhfZ2xibF9wcmFtX29mZnNldCk7CiAJLyogWmVybyBvdXQgcF9yeF9nbGJsX3ByYW0gKi8KLQltZW1zZXQodWdldGgtPnBfcnhfZ2xibF9wcmFtLCAwLCBzaXplb2YodWNjX2dldGhfcnhfZ2xvYmFsX3ByYW1fdCkpOworCW1lbXNldCh1Z2V0aC0+cF9yeF9nbGJsX3ByYW0sIDAsIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfcnhfZ2xvYmFsX3ByYW0pKTsKIAogCS8qIEZpbGwgZ2xvYmFsIFBSQU0gKi8KIApAQCAtMzIwNCw3ICszMTk0LDcgQEAKIAkvKiBTaXplIHZhcmllcyB3aXRoIG51bWJlciBvZiBSeCB0aHJlYWRzICovCiAJdWdldGgtPnRocmVhZF9kYXRfcnhfb2Zmc2V0ID0KIAkgICAgcWVfbXVyYW1fYWxsb2MobnVtVGhyZWFkc1J4TnVtZXJpY2FsICoKLQkJCSAgIHNpemVvZih1Y2NfZ2V0aF90aHJlYWRfZGF0YV9yeF90KSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfcngpLAogCQkJICAgVUNDX0dFVEhfVEhSRUFEX0RBVEFfQUxJR05NRU5UKTsKIAlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT50aHJlYWRfZGF0X3J4X29mZnNldCkpIHsKIAkJdWdldGhfZXJyCkBAIC0zMjE1LDcgKzMyMDUsNyBAQAogCX0KIAogCXVnZXRoLT5wX3RocmVhZF9kYXRhX3J4ID0KLQkgICAgKHVjY19nZXRoX3RocmVhZF9kYXRhX3J4X3QgKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CisJICAgIChzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfcnggKikgcWVfbXVyYW1fYWRkcih1Z2V0aC0+CiAJCQkJCQkJdGhyZWFkX2RhdF9yeF9vZmZzZXQpOwogCW91dF9iZTMyKCZ1Z2V0aC0+cF9yeF9nbGJsX3ByYW0tPnJxcHRyLCB1Z2V0aC0+dGhyZWFkX2RhdF9yeF9vZmZzZXQpOwogCkBAIC0zMjI3LDcgKzMyMTcsNyBAQAogCSAgICBzdGF0aXN0aWNzTW9kZSAmIFVDQ19HRVRIX1NUQVRJU1RJQ1NfR0FUSEVSSU5HX01PREVfRklSTVdBUkVfUlgpIHsKIAkJdWdldGgtPnJ4X2Z3X3N0YXRpc3RpY3NfcHJhbV9vZmZzZXQgPQogCQkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mCi0JCQkJICAgKHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90KSwKKwkJCQkgICAoc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSksCiAJCQkJICAgVUNDX0dFVEhfUlhfU1RBVElTVElDU19BTElHTk1FTlQpOwogCQlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT5yeF9md19zdGF0aXN0aWNzX3ByYW1fb2Zmc2V0KSkgewogCQkJdWdldGhfZXJyCkBAIC0zMjM3LDExICszMjI3LDExIEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQl1Z2V0aC0+cF9yeF9md19zdGF0aXN0aWNzX3ByYW0gPQotCQkgICAgKHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90ICopCisJCSAgICAoc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSAqKQogCQkgICAgcWVfbXVyYW1fYWRkcih1Z2V0aC0+cnhfZndfc3RhdGlzdGljc19wcmFtX29mZnNldCk7CiAJCS8qIFplcm8gb3V0IHBfcnhfZndfc3RhdGlzdGljc19wcmFtICovCiAJCW1lbXNldCh1Z2V0aC0+cF9yeF9md19zdGF0aXN0aWNzX3ByYW0sIDAsCi0JCSAgICAgICBzaXplb2YodWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtX3QpKTsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfcnhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtKSk7CiAJfQogCiAJLyogaW50Q29hbGVzY2luZ1B0ciAqLwpAQCAtMzI0OSw3ICszMjM5LDcgQEAKIAkvKiBTaXplIHZhcmllcyB3aXRoIG51bWJlciBvZiBSeCBxdWV1ZXMgKi8KIAl1Z2V0aC0+cnhfaXJxX2NvYWxlc2NpbmdfdGJsX29mZnNldCA9CiAJICAgIHFlX211cmFtX2FsbG9jKHVnX2luZm8tPm51bVF1ZXVlc1J4ICoKLQkJCSAgIHNpemVvZih1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ19lbnRyeV90KSwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfZW50cnkpLAogCQkJICAgVUNDX0dFVEhfUlhfSU5URVJSVVBUX0NPQUxFU0NJTkdfQUxJR05NRU5UKTsKIAlpZiAoSVNfTVVSQU1fRVJSKHVnZXRoLT5yeF9pcnFfY29hbGVzY2luZ190Ymxfb2Zmc2V0KSkgewogCQl1Z2V0aF9lcnIKQEAgLTMyNjAsNyArMzI1MCw3IEBACiAJfQogCiAJdWdldGgtPnBfcnhfaXJxX2NvYWxlc2NpbmdfdGJsID0KLQkgICAgKHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX3RhYmxlX3QgKikKKwkgICAgKHN0cnVjdCB1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ190YWJsZSAqKQogCSAgICBxZV9tdXJhbV9hZGRyKHVnZXRoLT5yeF9pcnFfY29hbGVzY2luZ190Ymxfb2Zmc2V0KTsKIAlvdXRfYmUzMigmdWdldGgtPnBfcnhfZ2xibF9wcmFtLT5pbnRjb2FsZXNjaW5ncHRyLAogCQkgdWdldGgtPnJ4X2lycV9jb2FsZXNjaW5nX3RibF9vZmZzZXQpOwpAQCAtMzMwMCw3ICszMjkwLDcgQEAKIAkJbDNxdCA9IDA7CiAJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCQlsM3F0IHw9ICh1Z19pbmZvLT5sM3F0W2ogKyBpXSA8PCAoMjggLSA0ICogaSkpOwotCQlvdXRfYmUzMigmdWdldGgtPnBfcnhfZ2xibF9wcmFtLT5sM3F0W2pdLCBsM3F0KTsKKwkJb3V0X2JlMzIoJnVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+bDNxdFtqLzhdLCBsM3F0KTsKIAl9CiAKIAkvKiB2bGFudHlwZSAqLwpAQCAtMzMxNiw4ICszMzA2LDggQEAKIAkvKiBTaXplIHZhcmllcyB3aXRoIG51bWJlciBvZiBSeCBxdWV1ZXMgKi8KIAl1Z2V0aC0+cnhfYmRfcXNfdGJsX29mZnNldCA9CiAJICAgIHFlX211cmFtX2FsbG9jKHVnX2luZm8tPm51bVF1ZXVlc1J4ICoKLQkJCSAgIChzaXplb2YodWNjX2dldGhfcnhfYmRfcXVldWVzX2VudHJ5X3QpICsKLQkJCSAgICBzaXplb2YodWNjX2dldGhfcnhfcHJlZmV0Y2hlZF9iZHNfdCkpLAorCQkJICAgKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfcnhfYmRfcXVldWVzX2VudHJ5KSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9yeF9wcmVmZXRjaGVkX2JkcykpLAogCQkJICAgVUNDX0dFVEhfUlhfQkRfUVVFVUVTX0FMSUdOTUVOVCk7CiAJaWYgKElTX01VUkFNX0VSUih1Z2V0aC0+cnhfYmRfcXNfdGJsX29mZnNldCkpIHsKIAkJdWdldGhfZXJyCkBAIC0zMzI4LDE0ICszMzE4LDE0IEBACiAJfQogCiAJdWdldGgtPnBfcnhfYmRfcXNfdGJsID0KLQkgICAgKHVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeV90ICopIHFlX211cmFtX2FkZHIodWdldGgtPgorCSAgICAoc3RydWN0IHVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeSAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KIAkJCQkgICAgcnhfYmRfcXNfdGJsX29mZnNldCk7CiAJb3V0X2JlMzIoJnVnZXRoLT5wX3J4X2dsYmxfcHJhbS0+cmJkcXB0ciwgdWdldGgtPnJ4X2JkX3FzX3RibF9vZmZzZXQpOwogCS8qIFplcm8gb3V0IHBfcnhfYmRfcXNfdGJsICovCiAJbWVtc2V0KHVnZXRoLT5wX3J4X2JkX3FzX3RibCwKIAkgICAgICAgMCwKLQkgICAgICAgdWdfaW5mby0+bnVtUXVldWVzUnggKiAoc2l6ZW9mKHVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeV90KSArCi0JCQkJICAgICAgIHNpemVvZih1Y2NfZ2V0aF9yeF9wcmVmZXRjaGVkX2Jkc190KSkpOworCSAgICAgICB1Z19pbmZvLT5udW1RdWV1ZXNSeCAqIChzaXplb2Yoc3RydWN0IHVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeSkgKworCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3J4X3ByZWZldGNoZWRfYmRzKSkpOwogCiAJLyogU2V0dXAgdGhlIHRhYmxlICovCiAJLyogQXNzdW1lIEJEIHJpbmdzIGFyZSBhbHJlYWR5IGVzdGFibGlzaGVkICovCkBAIC0zNDA2LDcgKzMzOTYsNyBAQAogCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4dGVuZGVkIGZpbHRlcmluZyBNb2RlIEdsb2JhbAogCQlQYXJhbWV0ZXJzICovCiAJCXVnZXRoLT5leGZfZ2xibF9wYXJhbV9vZmZzZXQgPQotCQkgICAgcWVfbXVyYW1fYWxsb2Moc2l6ZW9mKHVjY19nZXRoX2V4Zl9nbG9iYWxfcHJhbV90KSwKKwkJICAgIHFlX211cmFtX2FsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfZXhmX2dsb2JhbF9wcmFtKSwKIAkJVUNDX0dFVEhfUlhfRVhURU5ERURfRklMVEVSSU5HX0dMT0JBTF9QQVJBTUVURVJTX0FMSUdOTUVOVCk7CiAJCWlmIChJU19NVVJBTV9FUlIodWdldGgtPmV4Zl9nbGJsX3BhcmFtX29mZnNldCkpIHsKIAkJCXVnZXRoX2VycgpAQCAtMzQxNyw3ICszNDA3LDcgQEAKIAkJfQogCiAJCXVnZXRoLT5wX2V4Zl9nbGJsX3BhcmFtID0KLQkJICAgICh1Y2NfZ2V0aF9leGZfZ2xvYmFsX3ByYW1fdCAqKSBxZV9tdXJhbV9hZGRyKHVnZXRoLT4KKwkJICAgIChzdHJ1Y3QgdWNjX2dldGhfZXhmX2dsb2JhbF9wcmFtICopIHFlX211cmFtX2FkZHIodWdldGgtPgogCQkJCSBleGZfZ2xibF9wYXJhbV9vZmZzZXQpOwogCQlvdXRfYmUzMigmdWdldGgtPnBfcnhfZ2xibF9wcmFtLT5leGZHbG9iYWxQYXJhbSwKIAkJCSB1Z2V0aC0+ZXhmX2dsYmxfcGFyYW1fb2Zmc2V0KTsKQEAgLTM0MzksNyArMzQyOSw3IEBACiAJCQlJTklUX0xJU1RfSEVBRCgmdWdldGgtPmluZF9oYXNoX3EpOwogCQl9CiAJCXBfODJ4eF9hZGRyX2ZpbHQgPQotCQkgICAgKHVjY19nZXRoXzgyeHhfYWRkcmVzc19maWx0ZXJpbmdfcHJhbV90ICopIHVnZXRoLT4KKwkJICAgIChzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICopIHVnZXRoLT4KIAkJICAgIHBfcnhfZ2xibF9wcmFtLT5hZGRyZXNzZmlsdGVyaW5nOwogCiAJCXVnZXRoXzgyeHhfZmlsdGVyaW5nX2NsZWFyX2FsbF9hZGRyX2luX2hhc2godWdldGgsCkBAIC0zNDYyLDcgKzM0NTIsNyBAQAogCSAqIGFsbG9jYXRlZCByZXNvdXJjZXMgY2FuIGJlIHJlbGVhc2VkIHdoZW4gdGhlIGNoYW5uZWwgaXMgZnJlZWQuCiAJICovCiAJaWYgKCEodWdldGgtPnBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdyA9Ci0JICAgICAodWNjX2dldGhfaW5pdF9wcmFtX3QgKikga21hbGxvYyhzaXplb2YodWNjX2dldGhfaW5pdF9wcmFtX3QpLAorCSAgICAgKHN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0gKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19nZXRoX2luaXRfcHJhbSksCiAJCQkJCSAgICAgIEdGUF9LRVJORUwpKSkgewogCQl1Z2V0aF9lcnIKIAkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciIKQEAgLTM0NzIsNyArMzQ2Miw3IEBACiAJfQogCS8qIFplcm8gb3V0ICpwX2luaXRfZW5ldF9wYXJhbV9zaGFkb3cgKi8KIAltZW1zZXQoKGNoYXIgKil1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93LAotCSAgICAgICAwLCBzaXplb2YodWNjX2dldGhfaW5pdF9wcmFtX3QpKTsKKwkgICAgICAgMCwgc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0pKTsKIAogCS8qIEZpbGwgc2hhZG93IEluaXRFbmV0IGNvbW1hbmQgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwogCkBAIC0zNTA2LDcgKzM0OTYsNyBAQAogCX0KIAl1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93LT5sYXJnZXN0ZXh0ZXJuYWxsb29rdXBrZXlzaXplID0KIAkgICAgdWdfaW5mby0+bGFyZ2VzdGV4dGVybmFsbG9va3Vwa2V5c2l6ZTsKLQlzaXplID0gc2l6ZW9mKHVjY19nZXRoX3RocmVhZF9yeF9wcmFtX3QpOworCXNpemUgPSBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3RocmVhZF9yeF9wcmFtKTsKIAlpZiAodWdfaW5mby0+cnhFeHRlbmRlZEZpbHRlcmluZykgewogCQlzaXplICs9IFRIUkVBRF9SWF9QUkFNX0FERElUSU9OQUxfRk9SX0VYVEVOREVEX0ZJTFRFUklORzsKIAkJaWYgKHVnX2luZm8tPmxhcmdlc3RleHRlcm5hbGxvb2t1cGtleXNpemUgPT0KQEAgLTM1MzcsNyArMzUyNyw3IEBACiAJICAgICBmaWxsX2luaXRfZW5ldF9lbnRyaWVzKHVnZXRoLAogCQkJCSAgICAmKHVnZXRoLT5wX2luaXRfZW5ldF9wYXJhbV9zaGFkb3ctPgogCQkJCSAgICAgIHR4dGhyZWFkWzBdKSwgbnVtVGhyZWFkc1R4TnVtZXJpY2FsLAotCQkJCSAgICBzaXplb2YodWNjX2dldGhfdGhyZWFkX3R4X3ByYW1fdCksCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX3R4X3ByYW0pLAogCQkJCSAgICBVQ0NfR0VUSF9USFJFQURfVFhfUFJBTV9BTElHTk1FTlQsCiAJCQkJICAgIHVnX2luZm8tPnJpc2NUeCwgMCkpICE9IDApIHsKIAkJdWdldGhfZXJyKCIlczogQ2FuIG5vdCBmaWxsIHBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdy4iLApAQCAtMzU1Nyw3ICszNTQ3LDcgQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBJbml0RW5ldCBjb21tYW5kIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KLQlpbml0X2VuZXRfcHJhbV9vZmZzZXQgPSBxZV9tdXJhbV9hbGxvYyhzaXplb2YodWNjX2dldGhfaW5pdF9wcmFtX3QpLCA0KTsKKwlpbml0X2VuZXRfcHJhbV9vZmZzZXQgPSBxZV9tdXJhbV9hbGxvYyhzaXplb2Yoc3RydWN0IHVjY19nZXRoX2luaXRfcHJhbSksIDQpOwogCWlmIChJU19NVVJBTV9FUlIoaW5pdF9lbmV0X3ByYW1fb2Zmc2V0KSkgewogCQl1Z2V0aF9lcnIKIAkJICAgICgiJXM6IENhbiBub3QgYWxsb2NhdGUgRFBSQU0gbWVtb3J5IGZvciBwX2luaXRfZW5ldF9wcmFtLiIsCkBAIC0zNTY2LDcgKzM1NTYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcF9pbml0X2VuZXRfcHJhbSA9Ci0JICAgICh1Y2NfZ2V0aF9pbml0X3ByYW1fdCAqKSBxZV9tdXJhbV9hZGRyKGluaXRfZW5ldF9wcmFtX29mZnNldCk7CisJICAgIChzdHJ1Y3QgdWNjX2dldGhfaW5pdF9wcmFtICopIHFlX211cmFtX2FkZHIoaW5pdF9lbmV0X3ByYW1fb2Zmc2V0KTsKIAogCS8qIENvcHkgc2hhZG93IEluaXRFbmV0IGNvbW1hbmQgcGFyYW1ldGVyIHN0cnVjdHVyZSBpbnRvIFBSQU0gKi8KIAlwX2luaXRfZW5ldF9wcmFtLT5yZXNpbml0MSA9IHVnZXRoLT5wX2luaXRfZW5ldF9wYXJhbV9zaGFkb3ctPnJlc2luaXQxOwpAQCAtMzU5MSw3ICszNTgxLDcgQEAKIAkvKiBJc3N1ZSBRRSBjb21tYW5kICovCiAJY2Vjcl9zdWJibG9jayA9CiAJICAgIHVjY19mYXN0X2dldF9xZV9jcl9zdWJibG9jayh1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby51Y2NfbnVtKTsKLQlxZV9pc3N1ZV9jbWQoY29tbWFuZCwgY2Vjcl9zdWJibG9jaywgKHU4KSBRRV9DUl9QUk9UT0NPTF9FVEhFUk5FVCwKKwlxZV9pc3N1ZV9jbWQoY29tbWFuZCwgY2Vjcl9zdWJibG9jaywgUUVfQ1JfUFJPVE9DT0xfRVRIRVJORVQsCiAJCSAgICAgaW5pdF9lbmV0X3ByYW1fb2Zmc2V0KTsKIAogCS8qIEZyZWUgSW5pdEVuZXQgY29tbWFuZCBwYXJhbWV0ZXIgKi8KQEAgLTM2MDMsNyArMzU5Myw3IEBACiAvKiByZXR1cm5zIGEgbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUgcG9pbnRlciAqLwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp1Y2NfZ2V0aF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJcmV0dXJuICYodWdldGgtPnN0YXRzKTsKIH0KQEAgLTM2MTQsNyArMzYwNCw3IEBACiAgKiBzdGFydGluZyBvdmVyIHdpbGwgZml4IHRoZSBwcm9ibGVtLiAqLwogc3RhdGljIHZvaWQgdWNjX2dldGhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0zNjM0LDcgKzM2MjQsNyBAQAogLyogSXQgaXMgcG9pbnRlZCB0byBieSB0aGUgZGV2LT5oYXJkX3N0YXJ0X3htaXQgZnVuY3Rpb24gcG9pbnRlciAqLwogc3RhdGljIGludCB1Y2NfZ2V0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JdWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCAqYmQ7CQkJLyogQkQgcG9pbnRlciAqLwogCXUzMiBiZF9zdGF0dXM7CiAJdTggdHhRID0gMDsKQEAgLTM2NDcsNyArMzYzNyw3IEBACiAKIAkvKiBTdGFydCBmcm9tIHRoZSBuZXh0IEJEIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCAqLwogCWJkID0gdWdldGgtPnR4QmRbdHhRXTsKLQliZF9zdGF0dXMgPSBCRF9TVEFUVVNfQU5EX0xFTkdUSChiZCk7CisJYmRfc3RhdHVzID0gaW5fYmUzMigodTMyICopYmQpOwogCS8qIFNhdmUgdGhlIHNrYiBwb2ludGVyIHNvIHdlIGNhbiBmcmVlIGl0IGxhdGVyICovCiAJdWdldGgtPnR4X3NrYnVmZlt0eFFdW3VnZXRoLT5za2JfY3VydHhbdHhRXV0gPSBza2I7CiAKQEAgLTM2NTcsMjAgKzM2NDcsMjEgQEAKIAkgICAgIDEpICYgVFhfUklOR19NT0RfTUFTSyh1Z2V0aC0+dWdfaW5mby0+YmRSaW5nTGVuVHhbdHhRXSk7CiAKIAkvKiBzZXQgdXAgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yICovCi0JQkRfQlVGRkVSX1NFVChiZCwKKwlvdXRfYmUzMigmKChzdHJ1Y3QgcWVfYmQgKiliZCktPmJ1ZiwKIAkJICAgICAgZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSkpOwogCi0JLy9wcmludGsoS0VSTl9ERUJVRyJza2ItPmRhdGEgaXMgMHgleFxuIixza2ItPmRhdGEpOworCS8qIHByaW50ayhLRVJOX0RFQlVHInNrYi0+ZGF0YSBpcyAweCV4XG4iLHNrYi0+ZGF0YSk7ICovCiAKIAliZF9zdGF0dXMgPSAoYmRfc3RhdHVzICYgVF9XKSB8IFRfUiB8IFRfSSB8IFRfTCB8IHNrYi0+bGVuOwogCi0JQkRfU1RBVFVTX0FORF9MRU5HVEhfU0VUKGJkLCBiZF9zdGF0dXMpOworCS8qIHNldCBiZCBzdGF0dXMgYW5kIGxlbmd0aCAqLworCW91dF9iZTMyKCh1MzIgKiliZCwgYmRfc3RhdHVzKTsKIAogCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCiAJLyogTW92ZSB0byBuZXh0IEJEIGluIHRoZSByaW5nICovCiAJaWYgKCEoYmRfc3RhdHVzICYgVF9XKSkKLQkJdWdldGgtPnR4QmRbdHhRXSA9IGJkICsgVUNDX0dFVEhfU0laRV9PRl9CRDsKKwkJdWdldGgtPnR4QmRbdHhRXSA9IGJkICsgc2l6ZW9mKHN0cnVjdCBxZV9iZCk7CiAJZWxzZQogCQl1Z2V0aC0+dHhCZFt0eFFdID0gdWdldGgtPnBfdHhfYmRfcmluZ1t0eFFdOwogCkBAIC0zNjk1LDcgKzM2ODYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVjY19nZXRoX3J4KHVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGgsIHU4IHJ4USwgaW50IHJ4X3dvcmtfbGltaXQpCitzdGF0aWMgaW50IHVjY19nZXRoX3J4KHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCwgdTggcnhRLCBpbnQgcnhfd29ya19saW1pdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXU4ICpiZDsKQEAgLTM3MDksMTEgKzM3MDAsMTEgQEAKIAkvKiBjb2xsZWN0IHJlY2VpdmVkIGJ1ZmZlcnMgKi8KIAliZCA9IHVnZXRoLT5yeEJkW3J4UV07CiAKLQliZF9zdGF0dXMgPSBCRF9TVEFUVVNfQU5EX0xFTkdUSChiZCk7CisJYmRfc3RhdHVzID0gaW5fYmUzMigodTMyICopYmQpOwogCiAJLyogd2hpbGUgdGhlcmUgYXJlIHJlY2VpdmVkIGJ1ZmZlcnMgYW5kIEJEIGlzIGZ1bGwgKH5SX0UpICovCiAJd2hpbGUgKCEoKGJkX3N0YXR1cyAmIChSX0UpKSB8fCAoLS1yeF93b3JrX2xpbWl0IDwgMCkpKSB7Ci0JCWJkQnVmZmVyID0gKHU4ICopIEJEX0JVRkZFUihiZCk7CisJCWJkQnVmZmVyID0gKHU4ICopIGluX2JlMzIoJigoc3RydWN0IHFlX2JkICopYmQpLT5idWYpOwogCQlsZW5ndGggPSAodTE2KSAoKGJkX3N0YXR1cyAmIEJEX0xFTkdUSF9NQVNLKSAtIDQpOwogCQlza2IgPSB1Z2V0aC0+cnhfc2tidWZmW3J4UV1bdWdldGgtPnNrYl9jdXJyeFtyeFFdXTsKIApAQCAtMzc2OCw5ICszNzU5LDkgQEAKIAkJaWYgKGJkX3N0YXR1cyAmIFJfVykKIAkJCWJkID0gdWdldGgtPnBfcnhfYmRfcmluZ1tyeFFdOwogCQllbHNlCi0JCQliZCArPSBVQ0NfR0VUSF9TSVpFX09GX0JEOworCQkJYmQgKz0gc2l6ZW9mKHN0cnVjdCBxZV9iZCk7CiAKLQkJYmRfc3RhdHVzID0gQkRfU1RBVFVTX0FORF9MRU5HVEgoYmQpOworCQliZF9zdGF0dXMgPSBpbl9iZTMyKCh1MzIgKiliZCk7CiAJfQogCiAJdWdldGgtPnJ4QmRbcnhRXSA9IGJkOwpAQCAtMzc4MSwxMiArMzc3MiwxMiBAQAogc3RhdGljIGludCB1Y2NfZ2V0aF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB0eFEpCiB7CiAJLyogU3RhcnQgZnJvbSB0aGUgbmV4dCBCRCB0aGF0IHNob3VsZCBiZSBmaWxsZWQgKi8KLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCXU4ICpiZDsJCQkvKiBCRCBwb2ludGVyICovCiAJdTMyIGJkX3N0YXR1czsKIAogCWJkID0gdWdldGgtPmNvbmZCZFt0eFFdOwotCWJkX3N0YXR1cyA9IEJEX1NUQVRVU19BTkRfTEVOR1RIKGJkKTsKKwliZF9zdGF0dXMgPSBpbl9iZTMyKCh1MzIgKiliZCk7CiAKIAkvKiBOb3JtYWwgcHJvY2Vzc2luZy4gKi8KIAl3aGlsZSAoKGJkX3N0YXR1cyAmIFRfUikgPT0gMCkgewpAQCAtMzgxMyw3ICszODA0LDcgQEAKIAogCQkvKiBBZHZhbmNlIHRoZSBjb25maXJtYXRpb24gQkQgcG9pbnRlciAqLwogCQlpZiAoIShiZF9zdGF0dXMgJiBUX1cpKQotCQkJdWdldGgtPmNvbmZCZFt0eFFdICs9IFVDQ19HRVRIX1NJWkVfT0ZfQkQ7CisJCQl1Z2V0aC0+Y29uZkJkW3R4UV0gKz0gc2l6ZW9mKHN0cnVjdCBxZV9iZCk7CiAJCWVsc2UKIAkJCXVnZXRoLT5jb25mQmRbdHhRXSA9IHVnZXRoLT5wX3R4X2JkX3JpbmdbdHhRXTsKIAl9CkBAIC0zODIzLDcgKzM4MTQsNyBAQAogI2lmZGVmIENPTkZJR19VR0VUSF9OQVBJCiBzdGF0aWMgaW50IHVjY19nZXRoX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCiB7Ci0JdWNjX2dldGhfcHJpdmF0ZV90ICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaG93bWFueTsKIAlpbnQgcnhfd29ya19saW1pdCA9ICpidWRnZXQ7CiAJdTggcnhRID0gMDsKQEAgLTM4NDcsOSArMzgzOCw5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgdWNjX2dldGhfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqaW5mbykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaW5mbzsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1Y2NfZmFzdF9wcml2YXRlX3QgKnVjY2Y7Ci0JdWNjX2dldGhfaW5mb190ICp1Z19pbmZvOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CisJc3RydWN0IHVjY19nZXRoX2luZm8gKnVnX2luZm87CiAJcmVnaXN0ZXIgdTMyIHVjY2UgPSAwOwogCXJlZ2lzdGVyIHUzMiBiaXRfbWFzayA9IFVDQ0VfUlhCRl9TSU5HTEVfTUFTSzsKIAlyZWdpc3RlciB1MzIgdHhfbWFzayA9IFVDQ0VfVFhCRl9TSU5HTEVfTUFTSzsKQEAgLTM5MTIsNyArMzkwMyw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgcGh5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMzkzMiw4ICszOTIzLDggQEAKIHN0YXRpYyB2b2lkIHVnZXRoX3BoeV9jaGFuZ2Uodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1Y2NfZ2V0aF90ICp1Z19yZWdzOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19nZXRoICp1Z19yZWdzOwogCWludCByZXN1bHQgPSAwOwogCiAJdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKQEAgLTM5NjMsNyArMzk1NCw3IEBACiBzdGF0aWMgdm9pZCB1Z2V0aF9waHlfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlzY2hlZHVsZV93b3JrKCZ1Z2V0aC0+dHEpOwogCkBAIC0zOTc5LDcgKzM5NzAsNyBAQAogc3RhdGljIHZvaWQgdWdldGhfcGh5X3N0YXJ0dXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8gPSAoc3RydWN0IHVnZXRoX21paV9pbmZvICopZGF0YTsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYobWlpX2luZm8tPmRldik7CisJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYobWlpX2luZm8tPmRldik7CiAJc3RhdGljIGludCBzZWNvbmRhcnkgPSBVR0VUSF9BTl9USU1FT1VUOwogCWludCByZXN1bHQ7CiAKQEAgLTQwMzQsNyArNDAyNSw3IEBACiAvKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuICovCiBzdGF0aWMgaW50IHVjY19nZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBlcnI7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNDExMSw3ICs0MTAyLDcgQEAKIC8qIFN0b3BzIHRoZSBrZXJuZWwgcXVldWUsIGFuZCBoYWx0cyB0aGUgY29udHJvbGxlciAqLwogc3RhdGljIGludCB1Y2NfZ2V0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC00MTMwLDMwICs0MTIxLDUzIEBACiAKIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyB1Y2NfZ2V0aF9ldGh0b29sX29wcyA9IHsgfTsKIAotc3RhdGljIGludCB1Y2NfZ2V0aF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IHVjY19nZXRoX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIG9mZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldmljZSk7Ci0Jc3RydWN0IHVjY19nZXRoX3BsYXRmb3JtX2RhdGEgKnVnZXRoX3BkYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9ICZvZmRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+bm9kZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBOVUxMOwogCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvOwotCWludCBlcnI7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeTsKKwlpbnQgZXJyLCB1Y2NfbnVtLCBwaHlfaW50ZXJmYWNlOwogCXN0YXRpYyBpbnQgbWlpX21uZ19jb25maWd1cmVkID0gMDsKKwljb25zdCBwaGFuZGxlICpwaDsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnByb3A7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwogCi0JdWdldGhfcGRhdGEgPSAoc3RydWN0IHVjY19nZXRoX3BsYXRmb3JtX2RhdGEgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAiZGV2aWNlLWlkIiwgTlVMTCk7CisJdWNjX251bSA9ICpwcm9wIC0gMTsKKwlpZiAoKHVjY19udW0gPCAwKSB8fCAodWNjX251bSA+IDcpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCXVnX2luZm8gPSAmdWdldGhfaW5mb1twZGV2LT5pZF07Ci0JdWdfaW5mby0+dWZfaW5mby51Y2NfbnVtID0gcGRldi0+aWQ7Ci0JdWdfaW5mby0+dWZfaW5mby5yeF9jbG9jayA9IHVnZXRoX3BkYXRhLT5yeF9jbG9jazsKLQl1Z19pbmZvLT51Zl9pbmZvLnR4X2Nsb2NrID0gdWdldGhfcGRhdGEtPnR4X2Nsb2NrOwotCXVnX2luZm8tPnVmX2luZm8ucmVncyA9IHVnZXRoX3BkYXRhLT5waHlfcmVnX2FkZHI7Ci0JdWdfaW5mby0+dWZfaW5mby5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCXVnX2luZm8tPnBoeV9hZGRyZXNzID0gdWdldGhfcGRhdGEtPnBoeV9pZDsKLQl1Z19pbmZvLT5lbmV0X2ludGVyZmFjZSA9IHVnZXRoX3BkYXRhLT5waHlfaW50ZXJmYWNlOwotCXVnX2luZm8tPmJvYXJkX2ZsYWdzID0gdWdldGhfcGRhdGEtPmJvYXJkX2ZsYWdzOwotCXVnX2luZm8tPnBoeV9pbnRlcnJ1cHQgPSB1Z2V0aF9wZGF0YS0+cGh5X2ludGVycnVwdDsKKwl1Z19pbmZvID0gJnVnZXRoX2luZm9bdWNjX251bV07CisJdWdfaW5mby0+dWZfaW5mby51Y2NfbnVtID0gdWNjX251bTsKKwlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAicngtY2xvY2siLCBOVUxMKTsKKwl1Z19pbmZvLT51Zl9pbmZvLnJ4X2Nsb2NrID0gKnByb3A7CisJcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgInR4LWNsb2NrIiwgTlVMTCk7CisJdWdfaW5mby0+dWZfaW5mby50eF9jbG9jayA9ICpwcm9wOworCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCisJdWdfaW5mby0+dWZfaW5mby5yZWdzID0gcmVzLnN0YXJ0OworCXVnX2luZm8tPnVmX2luZm8uaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCisJcGggPSBnZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CisJcGh5ID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnBoKTsKKworCWlmIChwaHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcm9wID0gZ2V0X3Byb3BlcnR5KHBoeSwgInJlZyIsIE5VTEwpOworCXVnX2luZm8tPnBoeV9hZGRyZXNzID0gKnByb3A7CisJcHJvcCA9IGdldF9wcm9wZXJ0eShwaHksICJpbnRlcmZhY2UiLCBOVUxMKTsKKwl1Z19pbmZvLT5lbmV0X2ludGVyZmFjZSA9ICpwcm9wOworCXVnX2luZm8tPnBoeV9pbnRlcnJ1cHQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChwaHksIDApOworCXVnX2luZm8tPmJvYXJkX2ZsYWdzID0gKHVnX2luZm8tPnBoeV9pbnRlcnJ1cHQgPT0gTk9fSVJRKT8KKwkJCTA6RlNMX1VHRVRIX0JSRF9IQVNfUEhZX0lOVFI7CiAKIAlwcmludGsoS0VSTl9JTkZPICJ1Y2NfZ2V0aDogVUNDJTFkIGF0IDB4JTh4IChpcnEgPSAlZCkgXG4iLAogCQl1Z19pbmZvLT51Zl9pbmZvLnVjY19udW0gKyAxLCB1Z19pbmZvLT51Zl9pbmZvLnJlZ3MsCkBAIC00MTYxLDEyICs0MTc1LDQ0IEBACiAKIAlpZiAodWdfaW5mbyA9PSBOVUxMKSB7CiAJCXVnZXRoX2VycigiJXM6IFslZF0gTWlzc2luZyBhZGRpdGlvbmFsIGRhdGEhIiwgX19GVU5DVElPTl9fLAotCQkJICBwZGV2LT5pZCk7CisJCQkgIHVjY19udW0pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwkvKiBGSVhNRTogV29yayBhcm91bmQgZm9yIGVhcmx5IGNoaXAgcmV2LiAgICAgICAgICAgICAgICovCisJLyogVGhlcmUncyBhIGJ1ZyBpbiBpbml0aWFsIGNoaXAgcmV2KHMpIGluIHRoZSBSR01JSSBhYyAqLworCS8qIHRpbWluZy4JCQkJCQkqLworCS8qIFRoZSBmb2xsb3dpbmcgY29tcGVuc2F0ZXMgYnkgd3JpdGluZyB0byB0aGUgcmVzZXJ2ZWQgKi8KKwkvKiBRRSBQb3J0IE91dHB1dCBIb2xkIFJlZ2lzdGVycyAoQ1BPSDE/KS4gICAgICAgICAgICAgICovCisJcHJvcCA9IGdldF9wcm9wZXJ0eShwaHksICJpbnRlcmZhY2UiLCBOVUxMKTsKKwlwaHlfaW50ZXJmYWNlID0gKnByb3A7CisJaWYgKChwaHlfaW50ZXJmYWNlID09IEVORVRfMTAwMF9SR01JSSkgfHwKKwkJCShwaHlfaW50ZXJmYWNlID09IEVORVRfMTAwX1JHTUlJKSB8fAorCQkJKHBoeV9pbnRlcmZhY2UgPT0gRU5FVF8xMF9SR01JSSkpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpzb2M7CisJCXBoeXNfYWRkcl90IGltbXJiYXNlID0gLTE7CisJCXUzMiAqdG1wX3JlZzsKKwkJdTMyIHRtcF92YWw7CisKKwkJc29jID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNvYyIpOworCQlpZiAoc29jKSB7CisJCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkJCWNvbnN0IHZvaWQgKnByb3AgPSBnZXRfcHJvcGVydHkoc29jLCAicmVnIiwgJnNpemUpOworCQkJaW1tcmJhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhzb2MsIHByb3ApOworCQkJb2Zfbm9kZV9wdXQoc29jKTsKKwkJfTsKKworCQl0bXBfcmVnID0gKHUzMiAqKSBpb3JlbWFwKGltbXJiYXNlICsgMHgxNEE4LCAweDQpOworCQl0bXBfdmFsID0gaW5fYmUzMih0bXBfcmVnKTsKKwkJaWYgKHVjY19udW0gPT0gMSkKKwkJCW91dF9iZTMyKHRtcF9yZWcsIHRtcF92YWwgfCAweDAwMDAzMDAwKTsKKwkJZWxzZSBpZiAodWNjX251bSA9PSAyKQorCQkJb3V0X2JlMzIodG1wX3JlZywgdG1wX3ZhbCB8IDB4MGMwMDAwMDApOworCQlpb3VubWFwKHRtcF9yZWcpOworCX0KKwogCWlmICghbWlpX21uZ19jb25maWd1cmVkKSB7Ci0JCXVjY19zZXRfcWVfbXV4X21paV9tbmcodWdfaW5mby0+dWZfaW5mby51Y2NfbnVtKTsKKwkJdWNjX3NldF9xZV9tdXhfbWlpX21uZyh1Y2NfbnVtKTsKIAkJbWlpX21uZ19jb25maWd1cmVkID0gMTsKIAl9CiAKQEAgLTQyMTMsMTMgKzQyNTksMTQgQEAKIAogCXVnZXRoLT51Z19pbmZvID0gdWdfaW5mbzsKIAl1Z2V0aC0+ZGV2ID0gZGV2OwotCW1lbWNweShkZXYtPmRldl9hZGRyLCB1Z2V0aF9wZGF0YS0+bWFjX2FkZHIsIDYpOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBnZXRfcHJvcGVydHkobnAsICJtYWMtYWRkcmVzcyIsIE5VTEwpLCA2KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVjY19nZXRoX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IHVjY19nZXRoX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlKiBvZmRldikKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSAmb2ZkZXYtPmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNDIzMCwyOCArNDI3NywzOCBAQAogCXJldHVybiAwOwogfQogCi0vKiBTdHJ1Y3R1cmUgZm9yIGEgZGV2aWNlIGRyaXZlciAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHVjY19nZXRoX2RyaXZlciA9IHsKLQkubmFtZSA9IERSVl9OQU1FLAotCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCi0JLnByb2JlID0gdWNjX2dldGhfcHJvYmUsCi0JLnJlbW92ZSA9IHVjY19nZXRoX3JlbW92ZSwKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVjY19nZXRoX21hdGNoW10gPSB7CisJeworCQkudHlwZSA9ICJuZXR3b3JrIiwKKwkJLmNvbXBhdGlibGUgPSAidWNjX2dldGgiLAorCX0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1Y2NfZ2V0aF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIHVjY19nZXRoX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkubWF0Y2hfdGFibGUJPSB1Y2NfZ2V0aF9tYXRjaCwKKwkucHJvYmUJCT0gdWNjX2dldGhfcHJvYmUsCisJLnJlbW92ZQkJPSB1Y2NfZ2V0aF9yZW1vdmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB1Y2NfZ2V0aF9pbml0KHZvaWQpCiB7CiAJaW50IGk7CisKIAlwcmludGsoS0VSTl9JTkZPICJ1Y2NfZ2V0aDogIiBEUlZfREVTQyAiXG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQltZW1jcHkoJih1Z2V0aF9pbmZvW2ldKSwgJnVnZXRoX3ByaW1hcnlfaW5mbywKIAkJICAgICAgIHNpemVvZih1Z2V0aF9wcmltYXJ5X2luZm8pKTsKIAotCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnVjY19nZXRoX2RyaXZlcik7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmdWNjX2dldGhfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHVjY19nZXRoX2V4aXQodm9pZCkKIHsKLQlkcml2ZXJfdW5yZWdpc3RlcigmdWNjX2dldGhfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmdWNjX2dldGhfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQodWNjX2dldGhfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oIGIvZHJpdmVycy9uZXQvdWNjX2dldGguaAppbmRleCAwMDU5NjVmLi5hNjY1NjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmgKQEAgLTM2LDI0ICszNiwyNCBAQAogI2RlZmluZSBFTkVUX0lOSVRfUEFSQU1fTUFYX0VOVFJJRVNfUlggIDkKICNkZWZpbmUgRU5FVF9JTklUX1BBUkFNX01BWF9FTlRSSUVTX1RYICA4CiAKLXR5cGVkZWYgc3RydWN0IHVjY19taWlfbW5nIHsKK3N0cnVjdCB1Y2NfbWlpX21uZyB7CiAJdTMyIG1paW1jZmc7CQkvKiBNSUkgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uIHJlZyAqLwogCXUzMiBtaWltY29tOwkJLyogTUlJIG1hbmFnZW1lbnQgY29tbWFuZCByZWcgKi8KIAl1MzIgbWlpbWFkZDsJCS8qIE1JSSBtYW5hZ2VtZW50IGFkZHJlc3MgcmVnICovCiAJdTMyIG1paW1jb247CQkvKiBNSUkgbWFuYWdlbWVudCBjb250cm9sIHJlZyAqLwogCXUzMiBtaWltc3RhdDsJCS8qIE1JSSBtYW5hZ2VtZW50IHN0YXR1cyByZWcgKi8KIAl1MzIgbWlpbWluZDsJCS8qIE1JSSBtYW5hZ2VtZW50IGluZGljYXRpb24gcmVnICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfbWlpX21uZ190OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoIHsKLQl1Y2NfZmFzdF90IHVjY2Y7CitzdHJ1Y3QgdWNjX2dldGggeworCXN0cnVjdCB1Y2NfZmFzdCB1Y2NmOwogCiAJdTMyIG1hY2NmZzE7CQkvKiBtYWMgY29uZmlndXJhdGlvbiByZWcuIDEgKi8KIAl1MzIgbWFjY2ZnMjsJCS8qIG1hYyBjb25maWd1cmF0aW9uIHJlZy4gMiAqLwogCXUzMiBpcGdpZmc7CQkvKiBpbnRlcmZyYW1lIGdhcCByZWcuICAqLwogCXUzMiBoYWZkdXA7CQkvKiBoYWxmLWR1cGxleCByZWcuICAqLwogCXU4IHJlczFbMHgxMF07Ci0JdWNjX21paV9tbmdfdCBtaWltbmc7CS8qIE1JSSBtYW5hZ2VtZW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCB1Y2NfbWlpX21uZyBtaWltbmc7CS8qIE1JSSBtYW5hZ2VtZW50IHN0cnVjdHVyZSAqLwogCXUzMiBpZmN0bDsJCS8qIGludGVyZmFjZSBjb250cm9sIHJlZyAqLwogCXUzMiBpZnN0YXQ7CQkvKiBpbnRlcmZhY2Ugc3RhdHV4IHJlZyAqLwogCXUzMiBtYWNzdG5hZGRyMTsJLyogbWFjIHN0YXRpb24gYWRkcmVzcyBwYXJ0IDEgcmVnICovCkBAIC0xMTEsNyArMTExLDcgQEAKIAl1MzIgc2NhcjsJCS8qIFN0YXRpc3RpY3MgY2FycnkgcmVnaXN0ZXIgKi8KIAl1MzIgc2NhbTsJCS8qIFN0YXRpc3RpY3MgY2FyeXkgbWFzayByZWdpc3RlciAqLwogCXU4IHJlczVbMHgyMDAgLSAweDFjNF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIFVDQyBHRVRIIFRFTU9EUiBSZWdpc3RlciAqLwogI2RlZmluZSBURU1PREVSX1RYX1JNT05fU1RBVElTVElDU19FTkFCTEUgICAgICAgMHgwMTAwCS8qIGVuYWJsZSBUeCBzdGF0aXN0aWNzCkBAIC01MDgsMzkgKzUwOCwzOSBAQAogLyogVUNDIEdFVEggVURTUiAoRGF0YSBTeW5jaHJvbml6YXRpb24gUmVnaXN0ZXIpICovCiAjZGVmaW5lIFVEU1JfTUFHSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2N0UKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX2RhdGFfdHggeworc3RydWN0IHVjY19nZXRoX3RocmVhZF9kYXRhX3R4IHsKIAl1OCByZXMwWzEwNF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF90aHJlYWRfZGF0YV90eF90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3RocmVhZF9kYXRhX3J4IHsKK3N0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfZGF0YV9yeCB7CiAJdTggcmVzMFs0MF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF90aHJlYWRfZGF0YV9yeF90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qIFNlbmQgUXVldWUgUXVldWUtRGVzY3JpcHRvciAqLwotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfc2VuZF9xdWV1ZV9xZCB7CitzdHJ1Y3QgdWNjX2dldGhfc2VuZF9xdWV1ZV9xZCB7CiAJdTMyIGJkX3JpbmdfYmFzZTsJLyogcG9pbnRlciB0byBCRCByaW5nIGJhc2UgYWRkcmVzcyAqLwogCXU4IHJlczBbMHg4XTsKIAl1MzIgbGFzdF9iZF9jb21wbGV0ZWRfYWRkcmVzczsvKiBpbml0aWFsaXplIHRvIGxhc3QgZW50cnkgaW4gQkQgcmluZyAqLwogCXU4IHJlczFbMHgzMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfc2VuZF9xdWV1ZV9tZW1fcmVnaW9uIHsKLQl1Y2NfZ2V0aF9zZW5kX3F1ZXVlX3FkX3Qgc3FxZFtOVU1fVFhfUVVFVUVTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3NlbmRfcXVldWVfbWVtX3JlZ2lvbl90Oworc3RydWN0IHVjY19nZXRoX3NlbmRfcXVldWVfbWVtX3JlZ2lvbiB7CisJc3RydWN0IHVjY19nZXRoX3NlbmRfcXVldWVfcWQgc3FxZFtOVU1fVFhfUVVFVUVTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfdHhfcHJhbSB7CitzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX3R4X3ByYW0gewogCXU4IHJlczBbNjRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfdGhyZWFkX3R4X3ByYW1fdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfcnhfcHJhbSB7CitzdHJ1Y3QgdWNjX2dldGhfdGhyZWFkX3J4X3ByYW0gewogCXU4IHJlczBbMTI4XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3RocmVhZF9yeF9wcmFtX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogI2RlZmluZSBUSFJFQURfUlhfUFJBTV9BRERJVElPTkFMX0ZPUl9FWFRFTkRFRF9GSUxURVJJTkcgICAgICAgIDY0CiAjZGVmaW5lIFRIUkVBRF9SWF9QUkFNX0FERElUSU9OQUxfRk9SX0VYVEVOREVEX0ZJTFRFUklOR184ICAgICAgNjQKICNkZWZpbmUgVEhSRUFEX1JYX1BSQU1fQURESVRJT05BTF9GT1JfRVhURU5ERURfRklMVEVSSU5HXzE2ICAgICA5NgogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9zY2hlZHVsZXIgeworc3RydWN0IHVjY19nZXRoX3NjaGVkdWxlciB7CiAJdTE2IGNwdWNvdW50MDsJCS8qIENQVSBwYWNrZXQgY291bnRlciAqLwogCXUxNiBjcHVjb3VudDE7CQkvKiBDUFUgcGFja2V0IGNvdW50ZXIgKi8KIAl1MTYgY2Vjb3VudDA7CQkvKiBRRSBwYWNrZXQgY291bnRlciAqLwpAQCAtNTc0LDkgKzU3NCw5IEBACiAJCQkJICAgICAgLyoqPCB3ZWlnaHQgZmFjdG9yIGZvciBxdWV1ZXMgICAqLwogCXUzMiBtaW53OwkJLyogdGVtcG9yYXJ5IHZhcmlhYmxlIGhhbmRsZWQgYnkgUUUgKi8KIAl1OCByZXMxWzB4NzAgLSAweDY0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3NjaGVkdWxlcl90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSB7CitzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtIHsKIAl1MzIgc2ljb2x0eDsJCS8qIHNpbmdsZSBjb2xsaXNpb24gKi8KIAl1MzIgbXVsY29sdHg7CQkvKiBtdWx0aXBsZSBjb2xsaXNpb24gKi8KIAl1MzIgbGF0ZWNvbHR4ZnI7CS8qIGxhdGUgY29sbGlzaW9uICovCkBAIC01OTYsOSArNTk2LDkgQEAKIAkJCQkgICBhbmQgMTUxOCBvY3RldHMgKi8KIAl1MzIgdHhwa3RzanVtYm87CS8qIHRvdGFsIHBhY2tldHMgKGluY2x1ZGluZyBiYWQpIGJldHdlZW4gMTAyNAogCQkJCSAgIGFuZCBNQVhMZW5ndGggb2N0ZXRzICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW1fdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9yeF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW0geworc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSB7CiAJdTMyIGZycnhmY3NlcjsJCS8qIGZyYW1lcyB3aXRoIGNyYyBlcnJvciAqLwogCXUzMiBmcmFsaWduZXI7CQkvKiBmcmFtZXMgd2l0aCBhbGlnbm1lbnQgZXJyb3IgKi8KIAl1MzIgaW5yYW5nZWxlbnJ4ZXI7CS8qIGluIHJhbmdlIGxlbmd0aCBlcnJvciAqLwpAQCAtNjMwLDMzICs2MzAsMzMgQEAKIAkJCQkgICByZXBsYWNlZCAqLwogCXUzMiBpbnNlcnR2bGFuOwkJLyogdG90YWwgZnJhbWVzIHRoYXQgaGFkIHRoZWlyIFZMQU4gdGFnCiAJCQkJICAgaW5zZXJ0ZWQgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX2VudHJ5IHsKK3N0cnVjdCB1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ19lbnRyeSB7CiAJdTMyIGludGVycnVwdGNvYWxlc2NpbmdtYXh2YWx1ZTsJLyogaW50ZXJydXB0IGNvYWxlc2NpbmcgbWF4CiAJCQkJCQkgICB2YWx1ZSAqLwogCXUzMiBpbnRlcnJ1cHRjb2FsZXNjaW5nY291bnRlcjsJLyogaW50ZXJydXB0IGNvYWxlc2NpbmcgY291bnRlciwKIAkJCQkJICAgaW5pdGlhbGl6ZSB0bwogCQkJCQkgICBpbnRlcnJ1cHRjb2FsZXNjaW5nbWF4dmFsdWUgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX2VudHJ5X3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfdGFibGUgewotCXVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX2VudHJ5X3QgY29hbGVzY2luZ2VudHJ5W05VTV9SWF9RVUVVRVNdOworc3RydWN0IHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX3RhYmxlIHsKKwlzdHJ1Y3QgdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfZW50cnkgY29hbGVzY2luZ2VudHJ5W05VTV9SWF9RVUVVRVNdOwogCQkJCSAgICAgICAvKio8IGludGVycnVwdCBjb2FsZXNjaW5nIGVudHJ5ICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF9yeF9pbnRlcnJ1cHRfY29hbGVzY2luZ190YWJsZV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3J4X3ByZWZldGNoZWRfYmRzIHsKLQlxZV9iZF90IGJkW05VTV9CRFNfSU5fUFJFRkVUQ0hFRF9CRFNdOwkvKiBwcmVmZXRjaGVkIGJkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF9yeF9wcmVmZXRjaGVkX2Jkc190Oworc3RydWN0IHVjY19nZXRoX3J4X3ByZWZldGNoZWRfYmRzIHsKKwlzdHJ1Y3QgcWVfYmQgYmRbTlVNX0JEU19JTl9QUkVGRVRDSEVEX0JEU107CS8qIHByZWZldGNoZWQgYmQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9yeF9iZF9xdWV1ZXNfZW50cnkgeworc3RydWN0IHVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeSB7CiAJdTMyIGJkYmFzZXB0cjsJCS8qIEJEIGJhc2UgcG9pbnRlciAqLwogCXUzMiBiZHB0cjsJCS8qIEJEIHBvaW50ZXIgKi8KIAl1MzIgZXh0ZXJuYWxiZGJhc2VwdHI7CS8qIGV4dGVybmFsIEJEIGJhc2UgcG9pbnRlciAqLwogCXUzMiBleHRlcm5hbGJkcHRyOwkvKiBleHRlcm5hbCBCRCBwb2ludGVyICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF9yeF9iZF9xdWV1ZXNfZW50cnlfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF90eF9nbG9iYWxfcHJhbSB7CitzdHJ1Y3QgdWNjX2dldGhfdHhfZ2xvYmFsX3ByYW0gewogCXUxNiB0ZW1vZGVyOwogCXU4IHJlczBbMHgzOCAtIDB4MDJdOwogCXUzMiBzcXB0cjsJCS8qIGEgYmFzZSBwb2ludGVyIHRvIHNlbmQgcXVldWUgbWVtb3J5IHJlZ2lvbiAqLwpAQCAtNjcwLDE1ICs2NzAsMTUgQEAKIAl1MzIgdHFwdHI7CQkvKiBhIGJhc2UgcG9pbnRlciB0byB0aGUgVHggUXVldWVzIE1lbW9yeQogCQkJCSAgIFJlZ2lvbiAqLwogCXU4IHJlczJbMHg4MCAtIDB4NzRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfdHhfZ2xvYmFsX3ByYW1fdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEV4dGVuZGVkIEZpbHRlcmluZyBHbG9iYWwgUGFyYW1ldGVycyBpbiBQUkFNICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9leGZfZ2xvYmFsX3ByYW0geworc3RydWN0IHVjY19nZXRoX2V4Zl9nbG9iYWxfcHJhbSB7CiAJdTMyIGwycGNkcHRyOwkJLyogaW5kaXZpZHVhbCBhZGRyZXNzIGZpbHRlciwgaGlnaCAqLwogCXU4IHJlczBbMHgxMCAtIDB4MDRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfZXhmX2dsb2JhbF9wcmFtX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfcnhfZ2xvYmFsX3ByYW0geworc3RydWN0IHVjY19nZXRoX3J4X2dsb2JhbF9wcmFtIHsKIAl1MzIgcmVtb2RlcjsJCS8qIGV0aGVybmV0IG1vZGUgcmVnLiAqLwogCXUzMiBycXB0cjsJCS8qIGJhc2UgcG9pbnRlciB0byB0aGUgUnggUXVldWVzIE1lbW9yeSBSZWdpb24qLwogCXUzMiByZXMwWzB4MV07CkBAIC03MTAsMTIgKzcxMCwxMiBAQAogCXUzMiBleGZHbG9iYWxQYXJhbTsJLyogYmFzZSBhZGRyZXNzIGZvciBleHRlbmRlZCBmaWx0ZXJpbmcgZ2xvYmFsCiAJCQkJICAgcGFyYW1ldGVycyAqLwogCXU4IHJlczZbMHgxMDAgLSAweEM0XTsJLyogSW5pdGlhbGl6ZSB0byB6ZXJvICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKICNkZWZpbmUgR1JBQ0VGVUxfU1RPUF9BQ0tOT1dMRURHRV9SWCAgICAgICAgICAgIDB4MDEKIAogLyogc3RydWN0dXJlIHJlcHJlc2VudGluZyBJbml0RW5ldCBjb21tYW5kICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0geworc3RydWN0IHVjY19nZXRoX2luaXRfcHJhbSB7CiAJdTggcmVzaW5pdDE7CiAJdTggcmVzaW5pdDI7CiAJdTggcmVzaW5pdDM7CkBAIC03MjksNyArNzI5LDcgQEAKIAl1MzIgdHhnbG9iYWw7CQkvKiB0eCBnbG9iYWwgKi8KIAl1MzIgdHh0aHJlYWRbRU5FVF9JTklUX1BBUkFNX01BWF9FTlRSSUVTX1RYXTsJLyogdHggdGhyZWFkcyAqLwogCXU4IHJlczNbMHgxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX2luaXRfcHJhbV90OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKICNkZWZpbmUgRU5FVF9JTklUX1BBUkFNX1JHRl9TSElGVCAgICAgICAgICAgICAgICgzMiAtIDQpCiAjZGVmaW5lIEVORVRfSU5JVF9QQVJBTV9UR0ZfU0hJRlQgICAgICAgICAgICAgICAoMzIgLSA4KQpAQCAtNzQ2LDI3ICs3NDYsMjcgQEAKICNkZWZpbmUgRU5FVF9JTklUX1BBUkFNX01BR0lDX1JFU19JTklUNSAgICAgICAgIDB4MDQwMAogCiAvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIDgyeHggQWRkcmVzcyBGaWx0ZXJpbmcgRW5ldCBBZGRyZXNzIGluIFBSQU0gKi8KLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoXzgyeHhfZW5ldF9hZGRyZXNzIHsKK3N0cnVjdCB1Y2NfZ2V0aF84Mnh4X2VuZXRfYWRkcmVzcyB7CiAJdTggcmVzMVsweDJdOwogCXUxNiBoOwkJCS8qIGFkZHJlc3MgKE1TQikgKi8KIAl1MTYgbTsJCQkvKiBhZGRyZXNzICovCiAJdTE2IGw7CQkJLyogYWRkcmVzcyAoTFNCKSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfODJ4eF9lbmV0X2FkZHJlc3NfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIDgyeHggQWRkcmVzcyBGaWx0ZXJpbmcgUFJBTSAqLwotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtIHsKK3N0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gewogCXUzMiBpYWRkcl9oOwkJLyogaW5kaXZpZHVhbCBhZGRyZXNzIGZpbHRlciwgaGlnaCAqLwogCXUzMiBpYWRkcl9sOwkJLyogaW5kaXZpZHVhbCBhZGRyZXNzIGZpbHRlciwgbG93ICovCiAJdTMyIGdhZGRyX2g7CQkvKiBncm91cCBhZGRyZXNzIGZpbHRlciwgaGlnaCAqLwogCXUzMiBnYWRkcl9sOwkJLyogZ3JvdXAgYWRkcmVzcyBmaWx0ZXIsIGxvdyAqLwotCXVjY19nZXRoXzgyeHhfZW5ldF9hZGRyZXNzX3QgdGFkZHI7Ci0JdWNjX2dldGhfODJ4eF9lbmV0X2FkZHJlc3NfdCBwYWRkcltOVU1fT0ZfUEFERFJTXTsKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9lbmV0X2FkZHJlc3MgdGFkZHI7CisJc3RydWN0IHVjY19nZXRoXzgyeHhfZW5ldF9hZGRyZXNzIHBhZGRyW05VTV9PRl9QQUREUlNdOwogCXU4IHJlczBbMHg0MCAtIDB4MzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogR0VUSCBUeCBmaXJtd2FyZSBzdGF0aXN0aWNzIHN0cnVjdHVyZSwgdXNlZCB3aGVuIGNhbGxpbmcKICAgIFVDQ19HRVRIX0dldFN0YXRpc3RpY3MuICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzIHsKK3N0cnVjdCB1Y2NfZ2V0aF90eF9maXJtd2FyZV9zdGF0aXN0aWNzIHsKIAl1MzIgc2ljb2x0eDsJCS8qIHNpbmdsZSBjb2xsaXNpb24gKi8KIAl1MzIgbXVsY29sdHg7CQkvKiBtdWx0aXBsZSBjb2xsaXNpb24gKi8KIAl1MzIgbGF0ZWNvbHR4ZnI7CS8qIGxhdGUgY29sbGlzaW9uICovCkBAIC03ODYsMTEgKzc4NiwxMSBAQAogCQkJCSAgIGFuZCAxNTE4IG9jdGV0cyAqLwogCXUzMiB0eHBrdHNqdW1ibzsJLyogdG90YWwgcGFja2V0cyAoaW5jbHVkaW5nIGJhZCkgYmV0d2VlbiAxMDI0CiAJCQkJICAgYW5kIE1BWExlbmd0aCBvY3RldHMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBHRVRIIFJ4IGZpcm13YXJlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLCB1c2VkIHdoZW4gY2FsbGluZwogICAgVUNDX0dFVEhfR2V0U3RhdGlzdGljcy4gKi8KLXR5cGVkZWYgc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3Mgeworc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3MgewogCXUzMiBmcnJ4ZmNzZXI7CQkvKiBmcmFtZXMgd2l0aCBjcmMgZXJyb3IgKi8KIAl1MzIgZnJhbGlnbmVyOwkJLyogZnJhbWVzIHdpdGggYWxpZ25tZW50IGVycm9yICovCiAJdTMyIGlucmFuZ2VsZW5yeGVyOwkvKiBpbiByYW5nZSBsZW5ndGggZXJyb3IgKi8KQEAgLTgyMiwxMSArODIyLDExIEBACiAJCQkJICAgcmVwbGFjZWQgKi8KIAl1MzIgaW5zZXJ0dmxhbjsJCS8qIHRvdGFsIGZyYW1lcyB0aGF0IGhhZCB0aGVpciBWTEFOIHRhZwogCQkJCSAgIGluc2VydGVkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB1Y2NfZ2V0aF9yeF9maXJtd2FyZV9zdGF0aXN0aWNzX3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyogR0VUSCBoYXJkd2FyZSBzdGF0aXN0aWNzIHN0cnVjdHVyZSwgdXNlZCB3aGVuIGNhbGxpbmcKICAgIFVDQ19HRVRIX0dldFN0YXRpc3RpY3MuICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9oYXJkd2FyZV9zdGF0aXN0aWNzIHsKK3N0cnVjdCB1Y2NfZ2V0aF9oYXJkd2FyZV9zdGF0aXN0aWNzIHsKIAl1MzIgdHg2NDsJCS8qIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgKGluY2x1ZGluZyBiYWQKIAkJCQkgICBmcmFtZXMpIHRyYW5zbWl0dGVkIHRoYXQgd2VyZSBleGFjdGx5IG9mIHRoZQogCQkJCSAgIG1pbmltYWwgbGVuZ3RoICg2NCBmb3IgdW4gdGFnZ2VkLCA2OCBmb3IKQEAgLTg3MSw3ICs4NzEsNyBAQAogCXUzMiByYmNhOwkJLyogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyByZWNlaXZlZCBzdWNjZXNmdWxseQogCQkJCSAgIHRoYXQgaGFkIGRlc3RpbmF0aW9uIGFkZHJlc3MgZXF1YWwgdG8gdGhlCiAJCQkJICAgYnJvYWRjYXN0IGFkZHJlc3MgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVjY19nZXRoX2hhcmR3YXJlX3N0YXRpc3RpY3NfdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBVQ0MgR0VUSCBUeCBlcnJvcnMgcmV0dXJuZWQgdmlhIFR4Q29uZiBjYWxsYmFjayAqLwogI2RlZmluZSBUWF9FUlJPUlNfREVGICAgICAgMHgwMjAwCkBAIC0xMDEzLDIxICsxMDEzLDIxIEBACiAJCQkJKE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTEyKQogCiAvKiBFdGhlcm5ldCBzcGVlZCAqLwotdHlwZWRlZiBlbnVtIGVuZXRfc3BlZWQgeworZW51bSBlbmV0X3NwZWVkIHsKIAlFTkVUX1NQRUVEXzEwQlQsCS8qIDEwIEJhc2UgVCAqLwogCUVORVRfU1BFRURfMTAwQlQsCS8qIDEwMCBCYXNlIFQgKi8KIAlFTkVUX1NQRUVEXzEwMDBCVAkvKiAxMDAwIEJhc2UgVCAqLwotfSBlbmV0X3NwZWVkX2U7Cit9OwogCiAvKiBFdGhlcm5ldCBBZGRyZXNzIFR5cGUuICovCi10eXBlZGVmIGVudW0gZW5ldF9hZGRyX3R5cGUgeworZW51bSBlbmV0X2FkZHJfdHlwZSB7CiAJRU5FVF9BRERSX1RZUEVfSU5ESVZJRFVBTCwKIAlFTkVUX0FERFJfVFlQRV9HUk9VUCwKIAlFTkVUX0FERFJfVFlQRV9CUk9BRENBU1QKLX0gZW5ldF9hZGRyX3R5cGVfZTsKK307CiAKIC8qIFRCSSAvIE1JSSBTZXQgUmVnaXN0ZXIgKi8KLXR5cGVkZWYgZW51bSBlbmV0X3RiaV9taWlfcmVnIHsKK2VudW0gZW5ldF90YmlfbWlpX3JlZyB7CiAJRU5FVF9UQklfTUlJX0NSID0gMHgwMCwJLyogQ29udHJvbCAoQ1IgKSAqLwogCUVORVRfVEJJX01JSV9TUiA9IDB4MDEsCS8qIFN0YXR1cyAoU1IgKSAqLwogCUVORVRfVEJJX01JSV9BTkEgPSAweDA0LAkvKiBBTiBhZHZlcnRpc2VtZW50IChBTkEgKSAqLwpAQCAtMTA0MCwxMCArMTA0MCwxMCBAQAogCUVORVRfVEJJX01JSV9FWFNUID0gMHgwRiwJLyogRXh0ZW5kZWQgc3RhdHVzIChFWFNUICkgKi8KIAlFTkVUX1RCSV9NSUlfSkQgPSAweDEwLAkvKiBKaXR0ZXIgZGlhZ25vc3RpY3MgKEpEICkgKi8KIAlFTkVUX1RCSV9NSUlfVEJJQ09OID0gMHgxMQkvKiBUQkkgY29udHJvbCAoVEJJQ09OICkgKi8KLX0gZW5ldF90YmlfbWlpX3JlZ19lOworfTsKIAogLyogVUNDIEdFVEggODJ4eCBFdGhlcm5ldCBBZGRyZXNzIFJlY29nbml0aW9uIExvY2F0aW9uICovCi10eXBlZGVmIGVudW0gdWNjX2dldGhfZW5ldF9hZGRyZXNzX3JlY29nbml0aW9uX2xvY2F0aW9uIHsKK2VudW0gdWNjX2dldGhfZW5ldF9hZGRyZXNzX3JlY29nbml0aW9uX2xvY2F0aW9uIHsKIAlVQ0NfR0VUSF9FTkVUX0FERFJFU1NfUkVDT0dOSVRJT05fTE9DQVRJT05fU1RBVElPTl9BRERSRVNTLC8qIHN0YXRpb24KIAkJCQkJCQkJICAgICAgYWRkcmVzcyAqLwogCVVDQ19HRVRIX0VORVRfQUREUkVTU19SRUNPR05JVElPTl9MT0NBVElPTl9QQUREUl9GSVJTVCwJLyogYWRkaXRpb25hbApAQCAtMTA2NSwxMCArMTA2NSwxMCBAQAogCVVDQ19HRVRIX0VORVRfQUREUkVTU19SRUNPR05JVElPTl9MT0NBVElPTl9HUk9VUF9IQVNILAkvKiBncm91cCBoYXNoICovCiAJVUNDX0dFVEhfRU5FVF9BRERSRVNTX1JFQ09HTklUSU9OX0xPQ0FUSU9OX0lORElWSURVQUxfSEFTSCAvKiBpbmRpdmlkdWFsCiAJCQkJCQkJCSAgICAgIGhhc2ggKi8KLX0gdWNjX2dldGhfZW5ldF9hZGRyZXNzX3JlY29nbml0aW9uX2xvY2F0aW9uX2U7Cit9OwogCiAvKiBVQ0MgR0VUSCB2bGFuIG9wZXJhdGlvbiB0YWdnZWQgKi8KLXR5cGVkZWYgZW51bSB1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl90YWdnZWQgeworZW51bSB1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl90YWdnZWQgewogCVVDQ19HRVRIX1ZMQU5fT1BFUkFUSU9OX1RBR0dFRF9OT1AgPSAweDAsCS8qIFRhZ2dlZCAtIG5vcCAqLwogCVVDQ19HRVRIX1ZMQU5fT1BFUkFUSU9OX1RBR0dFRF9SRVBMQUNFX1ZJRF9QT1JUSU9OX09GX1FfVEFHCiAJCT0gMHgxLAkvKiBUYWdnZWQgLSByZXBsYWNlIHZpZCBwb3J0aW9uIG9mIHEgdGFnICovCkBAIC0xMDc2LDE4ICsxMDc2LDE4IEBACiAJCT0gMHgyLAkvKiBUYWdnZWQgLSBpZiB2aWQwIHJlcGxhY2UgdmlkIHdpdGggZGVmYXVsdCB2YWx1ZSAgKi8KIAlVQ0NfR0VUSF9WTEFOX09QRVJBVElPTl9UQUdHRURfRVhUUkFDVF9RX1RBR19GUk9NX0ZSQU1FCiAJCT0gMHgzCS8qIFRhZ2dlZCAtIGV4dHJhY3QgcSB0YWcgZnJvbSBmcmFtZSAqLwotfSB1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl90YWdnZWRfZTsKK307CiAKIC8qIFVDQyBHRVRIIHZsYW4gb3BlcmF0aW9uIG5vbi10YWdnZWQgKi8KLXR5cGVkZWYgZW51bSB1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl9ub25fdGFnZ2VkIHsKK2VudW0gdWNjX2dldGhfdmxhbl9vcGVyYXRpb25fbm9uX3RhZ2dlZCB7CiAJVUNDX0dFVEhfVkxBTl9PUEVSQVRJT05fTk9OX1RBR0dFRF9OT1AgPSAweDAsCS8qIE5vbiB0YWdnZWQgLSBub3AgKi8KIAlVQ0NfR0VUSF9WTEFOX09QRVJBVElPTl9OT05fVEFHR0VEX1FfVEFHX0lOU0VSVCA9IDB4MQkvKiBOb24gdGFnZ2VkIC0KIAkJCQkJCQkJICAgcSB0YWcgaW5zZXJ0CiAJCQkJCQkJCSAqLwotfSB1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl9ub25fdGFnZ2VkX2U7Cit9OwogCiAvKiBVQ0MgR0VUSCBSeCBRdWFsaXR5IG9mIFNlcnZpY2UgTW9kZSAqLwotdHlwZWRlZiBlbnVtIHVjY19nZXRoX3Fvc19tb2RlIHsKK2VudW0gdWNjX2dldGhfcW9zX21vZGUgewogCVVDQ19HRVRIX1FPU19NT0RFX0RFRkFVTFQgPSAweDAsCS8qIGRlZmF1bHQgcXVldWUgKi8KIAlVQ0NfR0VUSF9RT1NfTU9ERV9RVUVVRV9OVU1fRlJPTV9MMl9DUklURVJJQSA9IDB4MSwJLyogcXVldWUKIAkJCQkJCQkJICAgZGV0ZXJtaW5lZApAQCAtMTA5NywxMSArMTA5NywxMSBAQAogCQkJCQkJCQkgICBkZXRlcm1pbmVkCiAJCQkJCQkJCSAgIGJ5IEwzCiAJCQkJCQkJCSAgIGNyaXRlcmlhICovCi19IHVjY19nZXRoX3Fvc19tb2RlX2U7Cit9OwogCiAvKiBVQ0MgR0VUSCBTdGF0aXN0aWNzIEdhdGhlcmluZyBNb2RlIC0gVGhlc2UgYXJlIGJpdCBmbGFncywgJ29yJyB0aGVtIHRvZ2V0aGVyCiAgICBmb3IgY29tYmluZWQgZnVuY3Rpb25hbGl0eSAqLwotdHlwZWRlZiBlbnVtIHVjY19nZXRoX3N0YXRpc3RpY3NfZ2F0aGVyaW5nX21vZGUgeworZW51bSB1Y2NfZ2V0aF9zdGF0aXN0aWNzX2dhdGhlcmluZ19tb2RlIHsKIAlVQ0NfR0VUSF9TVEFUSVNUSUNTX0dBVEhFUklOR19NT0RFX05PTkUgPSAweDAwMDAwMDAwLAkvKiBObwogCQkJCQkJCQkgICBzdGF0aXN0aWNzCiAJCQkJCQkJCSAgIGdhdGhlcmluZyAqLwpAQCAtMTEyMiwxMCArMTEyMiwxMCBAQAogCQkJCQkJCQkgICAgICBzdGF0aXN0aWNzCiAJCQkJCQkJCSAgICAgIGdhdGhlcmluZwogCQkJCQkJCQkgICAgKi8KLX0gdWNjX2dldGhfc3RhdGlzdGljc19nYXRoZXJpbmdfbW9kZV9lOworfTsKIAogLyogVUNDIEdFVEggUGFkIGFuZCBDUkMgTW9kZSAtIE5vdGUsIFBhZGRpbmcgd2l0aG91dCBDUkMgaXMgbm90IHBvc3NpYmxlICovCi10eXBlZGVmIGVudW0gdWNjX2dldGhfbWFjY2ZnMl9wYWRfYW5kX2NyY19tb2RlIHsKK2VudW0gdWNjX2dldGhfbWFjY2ZnMl9wYWRfYW5kX2NyY19tb2RlIHsKIAlVQ0NfR0VUSF9QQURfQU5EX0NSQ19NT0RFX05PTkUKIAkJPSBNQUNDRkcyX1BBRF9BTkRfQ1JDX01PREVfTk9ORSwJLyogTmVpdGhlciBQYWRkaW5nCiAJCQkJCQkJICAgc2hvcnQgZnJhbWVzCkBAIC0xMTM1LDYxICsxMTM1LDU5IEBACiAJCQkJCQkJICAgQ1JDIG9ubHkgKi8KIAlVQ0NfR0VUSF9QQURfQU5EX0NSQ19NT0RFX1BBRF9BTkRfQ1JDID0KIAkgICAgTUFDQ0ZHMl9QQURfQU5EX0NSQ19NT0RFX1BBRF9BTkRfQ1JDCi19IHVjY19nZXRoX21hY2NmZzJfcGFkX2FuZF9jcmNfbW9kZV9lOworfTsKIAogLyogVUNDIEdFVEggdXBzbXIgRmxvdyBDb250cm9sIE1vZGUgKi8KLXR5cGVkZWYgZW51bSB1Y2NfZ2V0aF9mbG93X2NvbnRyb2xfbW9kZSB7CitlbnVtIHVjY19nZXRoX2Zsb3dfY29udHJvbF9tb2RlIHsKIAlVUFNNUl9BVVRPTUFUSUNfRkxPV19DT05UUk9MX01PREVfTk9ORSA9IDB4MDAwMDAwMDAsCS8qIE5vIGF1dG9tYXRpYwogCQkJCQkJCQkgICBmbG93IGNvbnRyb2wKIAkJCQkJCQkJICovCiAJVVBTTVJfQVVUT01BVElDX0ZMT1dfQ09OVFJPTF9NT0RFX1BBVVNFX1dIRU5fRU1FUkdFTkNZCiAJCT0gMHgwMDAwNDAwMAkvKiBTZW5kIHBhdXNlIGZyYW1lIHdoZW4gUnhGSUZPIHJlYWNoZXMgaXRzCiAJCQkJICAgZW1lcmdlbmN5IHRocmVzaG9sZCAqLwotfSB1Y2NfZ2V0aF9mbG93X2NvbnRyb2xfbW9kZV9lOworfTsKIAogLyogVUNDIEdFVEggbnVtYmVyIG9mIHRocmVhZHMgKi8KLXR5cGVkZWYgZW51bSB1Y2NfZ2V0aF9udW1fb2ZfdGhyZWFkcyB7CitlbnVtIHVjY19nZXRoX251bV9vZl90aHJlYWRzIHsKIAlVQ0NfR0VUSF9OVU1fT0ZfVEhSRUFEU18xID0gMHgxLAkvKiAxICovCiAJVUNDX0dFVEhfTlVNX09GX1RIUkVBRFNfMiA9IDB4MiwJLyogMiAqLwogCVVDQ19HRVRIX05VTV9PRl9USFJFQURTXzQgPSAweDAsCS8qIDQgKi8KIAlVQ0NfR0VUSF9OVU1fT0ZfVEhSRUFEU182ID0gMHgzLAkvKiA2ICovCiAJVUNDX0dFVEhfTlVNX09GX1RIUkVBRFNfOCA9IDB4NAkvKiA4ICovCi19IHVjY19nZXRoX251bV9vZl90aHJlYWRzX2U7Cit9OwogCiAvKiBVQ0MgR0VUSCBudW1iZXIgb2Ygc3RhdGlvbiBhZGRyZXNzZXMgKi8KLXR5cGVkZWYgZW51bSB1Y2NfZ2V0aF9udW1fb2Zfc3RhdGlvbl9hZGRyZXNzZXMgeworZW51bSB1Y2NfZ2V0aF9udW1fb2Zfc3RhdGlvbl9hZGRyZXNzZXMgewogCVVDQ19HRVRIX05VTV9PRl9TVEFUSU9OX0FERFJFU1NFU18xLAkvKiAxICovCiAJVUNDX0dFVEhfTlVNX09GX1NUQVRJT05fQUREUkVTU0VTXzUJLyogNSAqLwotfSB1Y2NfZ2V0aF9udW1fb2Zfc3RhdGlvbl9hZGRyZXNzZXNfZTsKLQotdHlwZWRlZiB1OCBlbmV0X2FkZHJfdFtFTkVUX05VTV9PQ1RFVFNfUEVSX0FERFJFU1NdOworfTsKIAogLyogVUNDIEdFVEggODJ4eCBFdGhlcm5ldCBBZGRyZXNzIENvbnRhaW5lciAqLwotdHlwZWRlZiBzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciB7Ci0JZW5ldF9hZGRyX3QgYWRkcmVzczsJLyogZXRoZXJuZXQgYWRkcmVzcyAqLwotCXVjY19nZXRoX2VuZXRfYWRkcmVzc19yZWNvZ25pdGlvbl9sb2NhdGlvbl9lIGxvY2F0aW9uOwkvKiBsb2NhdGlvbiBpbgorc3RydWN0IGVuZXRfYWRkcl9jb250YWluZXIgeworCXU4IGFkZHJlc3NbRU5FVF9OVU1fT0NURVRTX1BFUl9BRERSRVNTXTsJLyogZXRoZXJuZXQgYWRkcmVzcyAqLworCWVudW0gdWNjX2dldGhfZW5ldF9hZGRyZXNzX3JlY29nbml0aW9uX2xvY2F0aW9uIGxvY2F0aW9uOwkvKiBsb2NhdGlvbiBpbgogCQkJCQkJCQkgICA4Mnh4IGFkZHJlc3MKIAkJCQkJCQkJICAgcmVjb2duaXRpb24KIAkJCQkJCQkJICAgaGFyZHdhcmUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci19IGVuZXRfYWRkcl9jb250YWluZXJfdDsKK307CiAKLSNkZWZpbmUgRU5FVF9BRERSX0NPTlRfRU5UUlkocHRyKSBsaXN0X2VudHJ5KHB0ciwgZW5ldF9hZGRyX2NvbnRhaW5lcl90LCBub2RlKQorI2RlZmluZSBFTkVUX0FERFJfQ09OVF9FTlRSWShwdHIpIGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgZW5ldF9hZGRyX2NvbnRhaW5lciwgbm9kZSkKIAogLyogVUNDIEdFVEggVGVybWluYXRpb24gQWN0aW9uIERlc2NyaXB0b3IgKFRBRCkgc3RydWN0dXJlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgdWNjX2dldGhfdGFkX3BhcmFtcyB7CitzdHJ1Y3QgdWNjX2dldGhfdGFkX3BhcmFtcyB7CiAJaW50IHJ4X25vbl9keW5hbWljX2V4dGVuZGVkX2ZlYXR1cmVzX21vZGU7CiAJaW50IHJlamVjdF9mcmFtZTsKLQl1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl90YWdnZWRfZSB2dGFnX29wOwotCXVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX25vbl90YWdnZWRfZSB2bm9udGFnX29wOwotCXVjY19nZXRoX3Fvc19tb2RlX2UgcnFvczsKKwllbnVtIHVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX3RhZ2dlZCB2dGFnX29wOworCWVudW0gdWNjX2dldGhfdmxhbl9vcGVyYXRpb25fbm9uX3RhZ2dlZCB2bm9udGFnX29wOworCWVudW0gdWNjX2dldGhfcW9zX21vZGUgcnFvczsKIAl1OCB2cHJpOwogCXUxNiB2aWQ7Ci19IHVjY19nZXRoX3RhZF9wYXJhbXNfdDsKK307CiAKIC8qIEdFVEggcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9pbmZvIHsKLQl1Y2NfZmFzdF9pbmZvX3QgdWZfaW5mbzsKK3N0cnVjdCB1Y2NfZ2V0aF9pbmZvIHsKKwlzdHJ1Y3QgdWNjX2Zhc3RfaW5mbyB1Zl9pbmZvOwogCXU4IG51bVF1ZXVlc1R4OwogCXU4IG51bVF1ZXVlc1J4OwogCWludCBpcENoZWNrU3VtQ2hlY2s7CkBAIC0xMjUxLDUxICsxMjQ5LDUxIEBACiAJdTggaXBob2Zmc2V0W1RYX0lQX09GRlNFVF9FTlRSWV9NQVhdOwogCXUxNiBiZFJpbmdMZW5UeFtOVU1fVFhfUVVFVUVTXTsKIAl1MTYgYmRSaW5nTGVuUnhbTlVNX1JYX1FVRVVFU107Ci0JZW5ldF9pbnRlcmZhY2VfZSBlbmV0X2ludGVyZmFjZTsKLQl1Y2NfZ2V0aF9udW1fb2Zfc3RhdGlvbl9hZGRyZXNzZXNfZSBudW1TdGF0aW9uQWRkcmVzc2VzOwotCSBxZV9mbHRyX2xhcmdlc3RfZXh0ZXJuYWxfdGJsX2xvb2t1cF9rZXlfc2l6ZV9lCisJZW51bSBlbmV0X2ludGVyZmFjZSBlbmV0X2ludGVyZmFjZTsKKwllbnVtIHVjY19nZXRoX251bV9vZl9zdGF0aW9uX2FkZHJlc3NlcyBudW1TdGF0aW9uQWRkcmVzc2VzOworCWVudW0gcWVfZmx0cl9sYXJnZXN0X2V4dGVybmFsX3RibF9sb29rdXBfa2V5X3NpemUKIAkgICAgbGFyZ2VzdGV4dGVybmFsbG9va3Vwa2V5c2l6ZTsKLQl1Y2NfZ2V0aF9zdGF0aXN0aWNzX2dhdGhlcmluZ19tb2RlX2Ugc3RhdGlzdGljc01vZGU7Ci0JdWNjX2dldGhfdmxhbl9vcGVyYXRpb25fdGFnZ2VkX2Ugdmxhbk9wZXJhdGlvblRhZ2dlZDsKLQl1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl9ub25fdGFnZ2VkX2Ugdmxhbk9wZXJhdGlvbk5vblRhZ2dlZDsKLQl1Y2NfZ2V0aF9xb3NfbW9kZV9lIHJ4UW9TTW9kZTsKLQl1Y2NfZ2V0aF9mbG93X2NvbnRyb2xfbW9kZV9lIGF1ZmM7Ci0JdWNjX2dldGhfbWFjY2ZnMl9wYWRfYW5kX2NyY19tb2RlX2UgcGFkQW5kQ3JjOwotCXVjY19nZXRoX251bV9vZl90aHJlYWRzX2UgbnVtVGhyZWFkc1R4OwotCXVjY19nZXRoX251bV9vZl90aHJlYWRzX2UgbnVtVGhyZWFkc1J4OwotCXFlX3Jpc2NfYWxsb2NhdGlvbl9lIHJpc2NUeDsKLQlxZV9yaXNjX2FsbG9jYXRpb25fZSByaXNjUng7Ci19IHVjY19nZXRoX2luZm9fdDsKKwllbnVtIHVjY19nZXRoX3N0YXRpc3RpY3NfZ2F0aGVyaW5nX21vZGUgc3RhdGlzdGljc01vZGU7CisJZW51bSB1Y2NfZ2V0aF92bGFuX29wZXJhdGlvbl90YWdnZWQgdmxhbk9wZXJhdGlvblRhZ2dlZDsKKwllbnVtIHVjY19nZXRoX3ZsYW5fb3BlcmF0aW9uX25vbl90YWdnZWQgdmxhbk9wZXJhdGlvbk5vblRhZ2dlZDsKKwllbnVtIHVjY19nZXRoX3Fvc19tb2RlIHJ4UW9TTW9kZTsKKwllbnVtIHVjY19nZXRoX2Zsb3dfY29udHJvbF9tb2RlIGF1ZmM7CisJZW51bSB1Y2NfZ2V0aF9tYWNjZmcyX3BhZF9hbmRfY3JjX21vZGUgcGFkQW5kQ3JjOworCWVudW0gdWNjX2dldGhfbnVtX29mX3RocmVhZHMgbnVtVGhyZWFkc1R4OworCWVudW0gdWNjX2dldGhfbnVtX29mX3RocmVhZHMgbnVtVGhyZWFkc1J4OworCWVudW0gcWVfcmlzY19hbGxvY2F0aW9uIHJpc2NUeDsKKwllbnVtIHFlX3Jpc2NfYWxsb2NhdGlvbiByaXNjUng7Cit9OwogCiAvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIFVDQyBHRVRIICovCi10eXBlZGVmIHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlIHsKLQl1Y2NfZ2V0aF9pbmZvX3QgKnVnX2luZm87Ci0JdWNjX2Zhc3RfcHJpdmF0ZV90ICp1Y2NmOworc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgeworCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIGxpbnV4IG5ldHdvcmsgc3RhdGlzdGljcyAqLwotCXVjY19nZXRoX3QgKnVnX3JlZ3M7Ci0JdWNjX2dldGhfaW5pdF9wcmFtX3QgKnBfaW5pdF9lbmV0X3BhcmFtX3NoYWRvdzsKLQl1Y2NfZ2V0aF9leGZfZ2xvYmFsX3ByYW1fdCAqcF9leGZfZ2xibF9wYXJhbTsKKwlzdHJ1Y3QgdWNjX2dldGggKnVnX3JlZ3M7CisJc3RydWN0IHVjY19nZXRoX2luaXRfcHJhbSAqcF9pbml0X2VuZXRfcGFyYW1fc2hhZG93OworCXN0cnVjdCB1Y2NfZ2V0aF9leGZfZ2xvYmFsX3ByYW0gKnBfZXhmX2dsYmxfcGFyYW07CiAJdTMyIGV4Zl9nbGJsX3BhcmFtX29mZnNldDsKLQl1Y2NfZ2V0aF9yeF9nbG9iYWxfcHJhbV90ICpwX3J4X2dsYmxfcHJhbTsKKwlzdHJ1Y3QgdWNjX2dldGhfcnhfZ2xvYmFsX3ByYW0gKnBfcnhfZ2xibF9wcmFtOwogCXUzMiByeF9nbGJsX3ByYW1fb2Zmc2V0OwotCXVjY19nZXRoX3R4X2dsb2JhbF9wcmFtX3QgKnBfdHhfZ2xibF9wcmFtOworCXN0cnVjdCB1Y2NfZ2V0aF90eF9nbG9iYWxfcHJhbSAqcF90eF9nbGJsX3ByYW07CiAJdTMyIHR4X2dsYmxfcHJhbV9vZmZzZXQ7Ci0JdWNjX2dldGhfc2VuZF9xdWV1ZV9tZW1fcmVnaW9uX3QgKnBfc2VuZF9xX21lbV9yZWc7CisJc3RydWN0IHVjY19nZXRoX3NlbmRfcXVldWVfbWVtX3JlZ2lvbiAqcF9zZW5kX3FfbWVtX3JlZzsKIAl1MzIgc2VuZF9xX21lbV9yZWdfb2Zmc2V0OwotCXVjY19nZXRoX3RocmVhZF9kYXRhX3R4X3QgKnBfdGhyZWFkX2RhdGFfdHg7CisJc3RydWN0IHVjY19nZXRoX3RocmVhZF9kYXRhX3R4ICpwX3RocmVhZF9kYXRhX3R4OwogCXUzMiB0aHJlYWRfZGF0X3R4X29mZnNldDsKLQl1Y2NfZ2V0aF90aHJlYWRfZGF0YV9yeF90ICpwX3RocmVhZF9kYXRhX3J4OworCXN0cnVjdCB1Y2NfZ2V0aF90aHJlYWRfZGF0YV9yeCAqcF90aHJlYWRfZGF0YV9yeDsKIAl1MzIgdGhyZWFkX2RhdF9yeF9vZmZzZXQ7Ci0JdWNjX2dldGhfc2NoZWR1bGVyX3QgKnBfc2NoZWR1bGVyOworCXN0cnVjdCB1Y2NfZ2V0aF9zY2hlZHVsZXIgKnBfc2NoZWR1bGVyOwogCXUzMiBzY2hlZHVsZXJfb2Zmc2V0OwotCXVjY19nZXRoX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbV90ICpwX3R4X2Z3X3N0YXRpc3RpY3NfcHJhbTsKKwlzdHJ1Y3QgdWNjX2dldGhfdHhfZmlybXdhcmVfc3RhdGlzdGljc19wcmFtICpwX3R4X2Z3X3N0YXRpc3RpY3NfcHJhbTsKIAl1MzIgdHhfZndfc3RhdGlzdGljc19wcmFtX29mZnNldDsKLQl1Y2NfZ2V0aF9yeF9maXJtd2FyZV9zdGF0aXN0aWNzX3ByYW1fdCAqcF9yeF9md19zdGF0aXN0aWNzX3ByYW07CisJc3RydWN0IHVjY19nZXRoX3J4X2Zpcm13YXJlX3N0YXRpc3RpY3NfcHJhbSAqcF9yeF9md19zdGF0aXN0aWNzX3ByYW07CiAJdTMyIHJ4X2Z3X3N0YXRpc3RpY3NfcHJhbV9vZmZzZXQ7Ci0JdWNjX2dldGhfcnhfaW50ZXJydXB0X2NvYWxlc2NpbmdfdGFibGVfdCAqcF9yeF9pcnFfY29hbGVzY2luZ190Ymw7CisJc3RydWN0IHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX3RhYmxlICpwX3J4X2lycV9jb2FsZXNjaW5nX3RibDsKIAl1MzIgcnhfaXJxX2NvYWxlc2NpbmdfdGJsX29mZnNldDsKLQl1Y2NfZ2V0aF9yeF9iZF9xdWV1ZXNfZW50cnlfdCAqcF9yeF9iZF9xc190Ymw7CisJc3RydWN0IHVjY19nZXRoX3J4X2JkX3F1ZXVlc19lbnRyeSAqcF9yeF9iZF9xc190Ymw7CiAJdTMyIHJ4X2JkX3FzX3RibF9vZmZzZXQ7CiAJdTggKnBfdHhfYmRfcmluZ1tOVU1fVFhfUVVFVUVTXTsKIAl1MzIgdHhfYmRfcmluZ19vZmZzZXRbTlVNX1RYX1FVRVVFU107CkBAIC0xMzA4LDcgKzEzMDYsNyBAQAogCXUxNiBjcHVjb3VudFtOVU1fVFhfUVVFVUVTXTsKIAl2b2xhdGlsZSB1MTYgKnBfY3B1Y291bnRbTlVNX1RYX1FVRVVFU107CiAJaW50IGluZEFkZHJSZWdVc2VkW05VTV9PRl9QQUREUlNdOwotCWVuZXRfYWRkcl90IHBhZGRyW05VTV9PRl9QQUREUlNdOworCXU4IHBhZGRyW05VTV9PRl9QQUREUlNdW0VORVRfTlVNX09DVEVUU19QRVJfQUREUkVTU107CS8qIGV0aGVybmV0IGFkZHJlc3MgKi8KIAl1OCBudW1Hcm91cEFkZHJJbkhhc2g7CiAJdTggbnVtSW5kQWRkckluSGFzaDsKIAl1OCBudW1JbmRBZGRySW5SZWc7CkBAIC0xMzM0LDYgKzEzMzIsNiBAQAogCWludCBvbGRzcGVlZDsKIAlpbnQgb2xkZHVwbGV4OwogCWludCBvbGRsaW5rOwotfSB1Y2NfZ2V0aF9wcml2YXRlX3Q7Cit9OwogCiAjZW5kaWYJCQkJLyogX19VQ0NfR0VUSF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5jIGIvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmMKaW5kZXggNjcyNjBlYi4uNTM2MGVjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmMKQEAgLTQyLDcgKzQyLDYgQEAKIAogI2luY2x1ZGUgInVjY19nZXRoLmgiCiAjaW5jbHVkZSAidWNjX2dldGhfcGh5LmgiCi0jaW5jbHVkZSA8cGxhdGZvcm1zLzgzeHgvbXBjODM2MGVfcGIuaD4KIAogI2RlZmluZSB1Z3BoeV9wcmludGsobGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSAgXAogICAgICAgICBwcmludGsobGV2ZWwgZm9ybWF0ICJcbiIsICMjIGFyZykKQEAgLTcyLDE2ICs3MSwxNCBAQAogdTE2IHBoeV9yZWFkKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8sIHUxNiByZWdudW0pOwogdm9pZCBwaHlfd3JpdGUoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbywgdTE2IHJlZ251bSwgdTE2IHZhbCk7CiAKLXN0YXRpYyB1OCAqYmNzcl9yZWdzID0gTlVMTDsKLQogLyogV3JpdGUgdmFsdWUgdG8gdGhlIFBIWSBmb3IgdGhpcyBkZXZpY2UgdG8gdGhlIHJlZ2lzdGVyIGF0IHJlZ251bSwgKi8KIC8qIHdhaXRpbmcgdW50aWwgdGhlIHdyaXRlIGlzIGRvbmUgYmVmb3JlIGl0IHJldHVybnMuICBBbGwgUEhZICovCiAvKiBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIHRocm91Z2ggdGhlIFRTRUMxIE1JSU0gcmVncyAqLwogdm9pZCB3cml0ZV9waHlfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0sIGludCB2YWx1ZSkKIHsKLQl1Y2NfZ2V0aF9wcml2YXRlX3QgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1Y2NfbWlpX21uZ190ICptaWlfcmVnczsKLQllbmV0X3RiaV9taWlfcmVnX2UgbWlpX3JlZyA9IChlbmV0X3RiaV9taWlfcmVnX2UpIHJlZ251bTsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfbWlpX21uZyAqbWlpX3JlZ3M7CisJZW51bSBlbmV0X3RiaV9taWlfcmVnIG1paV9yZWcgPSAoZW51bSBlbmV0X3RiaV9taWlfcmVnKSByZWdudW07CiAJdTMyIHRtcF9yZWc7CiAKIAl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTE2LDkgKzExMyw5IEBACiAvKiBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIHRocm91Z2ggdGhlIFRTRUMxIE1JSU0gcmVncyAqLwogaW50IHJlYWRfcGh5X3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKQogewotCXVjY19nZXRoX3ByaXZhdGVfdCAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCXVjY19taWlfbW5nX3QgKm1paV9yZWdzOwotCWVuZXRfdGJpX21paV9yZWdfZSBtaWlfcmVnID0gKGVuZXRfdGJpX21paV9yZWdfZSkgcmVnbnVtOworCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHVjY19taWlfbW5nICptaWlfcmVnczsKKwllbnVtIGVuZXRfdGJpX21paV9yZWcgbWlpX3JlZyA9IChlbnVtIGVuZXRfdGJpX21paV9yZWcpIHJlZ251bTsKIAl1MzIgdG1wX3JlZzsKIAl1MTYgdmFsdWU7CiAKQEAgLTYzNCwxMSArNjMxLDYgQEAKIAogc3RhdGljIGludCBkbTkxNjFfYWNrX2ludGVycnVwdChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKQogewotLyogRklYTUU6IFRoaXMgbGluZXMgYXJlIGZvciBCVUcgZml4aW5nIGluIHRoZSBtcGM4MzI1LgotUmVtb3ZlIHRoaXMgZnJvbSBoZXJlIHdoZW4gaXQncyBmaXhlZCAqLwotCWlmIChiY3NyX3JlZ3MgPT0gTlVMTCkKLQkJYmNzcl9yZWdzID0gKHU4ICopIGlvcmVtYXAoQkNTUl9QSFlTX0FERFIsIEJDU1JfU0laRSk7Ci0JYmNzcl9yZWdzWzE0XSB8PSAweDQwOwogCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CiAKIAkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBieSByZWFkaW5nIHRoZSByZWcgKi8KQEAgLTY1MCwxMiArNjQyLDYgQEAKIAogc3RhdGljIGludCBkbTkxNjFfY29uZmlnX2ludHIoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKIHsKLS8qIEZJWE1FOiBUaGlzIGxpbmVzIGFyZSBmb3IgQlVHIGZpeGluZyBpbiB0aGUgbXBjODMyNS4KLVJlbW92ZSB0aGlzIGZyb20gaGVyZSB3aGVuIGl0J3MgZml4ZWQgKi8KLQlpZiAoYmNzcl9yZWdzID09IE5VTEwpIHsKLQkJYmNzcl9yZWdzID0gKHU4ICopIGlvcmVtYXAoQkNTUl9QSFlTX0FERFIsIEJDU1JfU0laRSk7Ci0JCWJjc3JfcmVnc1sxNF0gJj0gfjB4NDA7Ci0JfQogCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7CiAKIAlpZiAobWlpX2luZm8tPmludGVycnVwdHMgPT0gTUlJX0lOVEVSUlVQVF9FTkFCTEVEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmggYi9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuaAppbmRleCAyZjk4YjhmLi5mNTc0MDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuaAorKysgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuaApAQCAtMTI2LDcgKzEyNiw3IEBACiAJLyogQW5kIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCiAJc3RydWN0IHBoeV9pbmZvICpwaHlpbmZvOwogCi0JdWNjX21paV9tbmdfdCAqbWlpX3JlZ3M7CisJc3RydWN0IHVjY19taWlfbW5nICptaWlfcmVnczsKIAogCS8qIGZvcmNlZCBzcGVlZCAmIGR1cGxleCAobm8gYXV0b25lZykKIAkgKiBwYXJ0bmVyIHNwZWVkICYgZHVwbGV4ICYgcGF1c2UgKGF1dG9uZWcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCmluZGV4IDc0Zjg5NDcuLjQ1ODdmMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCkBAIC0zMTMyLDcgKzMxMzIsNyBAQAogCX0KIAkvKglGaW5hbGx5LCBpbnZlcnQgdGhlIHJlc3VsdCBvbmNlIHRvIGdldCB0aGUgY29ycmVjdCBkYXRhICovCiAJY3JjID0gfmNyYzsKLQlyZXR1cm4gYml0cmV2ZXJzZShjcmMpID4+IDE2OworCXJldHVybiBiaXRyZXYzMihjcmMpID4+IDE2OwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKaW5kZXggNThiN2VmYi4uMjFmNzZmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKQEAgLTU3LDQ0ICs1Nyw2IEBACiAJICBUaGUgZHJpdmVyIHdpbGwgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNvc2EuCiAKLWNvbmZpZyBEU0NDNAotCXRyaXN0YXRlICJFdGluYyBQQ0lTWU5DIHNlcmlhbCBib2FyZCBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0FOICYmIFBDSSAmJiBtCi0JaGVscAotCSAgRHJpdmVyIGZvciBFdGluYyBQQ0lTWU5DIGJvYXJkcyBiYXNlZCBvbiB0aGUgSW5maW5lb24gKGV4LiBTaWVtZW5zKQotCSAgRFNDQzQgY2hpcHNldC4KLQotCSAgVGhpcyBpcyBzdXBwb3NlZCB0byB3b3JrIHdpdGggdGhlIGZvdXIgcG9ydCBjYXJkLiBUYWtlIGEgbG9vayBhdAotCSAgPGh0dHA6Ly93d3cuY29nZW5pdC5mci9kc2NjNC8+IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCSAgZHJpdmVyLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkc2NjNC4KLQotY29uZmlnIERTQ0M0X1BDSVNZTkMKLQlib29sICJFdGluYyBQQ0lTWU5DIGZlYXR1cmVzIgotCWRlcGVuZHMgb24gRFNDQzQKLQloZWxwCi0JICBEdWUgdG8gRXRpbmMncyBkZXNpZ24gY2hvaWNlIGZvciBpdHMgUENJU1lOQyBjYXJkcywgc29tZSBvcGVyYXRpb25zCi0JICBhcmUgb25seSBhbGxvd2VkIG9uIHNwZWNpZmljIHBvcnRzIG9mIHRoZSBEU0NDNC4gVGhpcyBvcHRpb24gaXMgdGhlCi0JICBvbmx5IHdheSBmb3IgdGhlIGRyaXZlciB0byBrbm93IHRoYXQgaXQgc2hvdWxkbid0IHJldHVybiBhIHN1Y2Nlc3MKLQkgIGNvZGUgZm9yIHRoZXNlIG9wZXJhdGlvbnMuCi0KLQkgIFBsZWFzZSBzYXkgWSBpZiB5b3VyIGNhcmQgaXMgYW4gRXRpbmMncyBQQ0lTWU5DLgotCi1jb25maWcgRFNDQzRfUENJX1JTVAotCWJvb2wgIkhhcmQgcmVzZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIERTQ0M0Ci0JaGVscAotCSAgVmFyaW91cyBEU0NDNCBidWdzIGZvcmJpZCBhbnkgcmVsaWFibGUgc29mdHdhcmUgcmVzZXQgb2YgdGhlIEFTSUMuCi0JICBBcyBhIHJlcGxhY2VtZW50LCBzb21lIHZlbmRvcnMgcHJvdmlkZSBhIHdheSB0byBhc3NlcnQgdGhlIFBDSSAjUlNUCi0JICBwaW4gb2YgRFNDQzQgdGhyb3VnaCB0aGUgR1BJTyBwb3J0IG9mIHRoZSBjYXJkLiBJZiB5b3UgY2hvb3NlIFksCi0JICB0aGUgZHJpdmVyIHdpbGwgbWFrZSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGJlZm9yZSBtb2R1bGUgcmVtb3ZhbAotCSAgKGkuZS4gcm1tb2QpLiBUaGUgZmVhdHVyZSBpcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gQ29tbXRlY2gncwotCSAgY2FyZHMuIENvbnRhY3QgeW91ciBtYW51ZmFjdHVyZXIgZm9yIGRldGFpbHMuCi0KLQkgIFNheSBZIGlmIHlvdXIgY2FyZCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuCi0KICMKICMgTGFuIE1lZGlhJ3MgYm9hcmQuIEN1cnJlbnRseSAxMDAwLCAxMjAwLCA1MjAwLCA1MjQ1CiAjCkBAIC0xMjcsNyArODksNyBAQAogIyBUaGVyZSBpcyBubyB3YXkgdG8gZGV0ZWN0IGEgU2VhbGV2ZWwgYm9hcmQuIEZvcmNlIGl0IG1vZHVsYXIKIGNvbmZpZyBTRUFMRVZFTF80MDIxCiAJdHJpc3RhdGUgIlNlYWxldmVsIFN5c3RlbXMgNDAyMSBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtICYmIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiBXQU4gJiYgSVNBICYmIG0gJiYgSVNBX0RNQV9BUEkgJiYgSU5FVAogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBTZWFsZXZlbCBTeXN0ZW1zIEFDQiA1NiBzZXJpYWwgSS9PIGFkYXB0ZXIuCiAKQEAgLTMyMyw2ICsyODUsNDQgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGZhcnN5bmMuCiAKK2NvbmZpZyBEU0NDNAorCXRyaXN0YXRlICJFdGluYyBQQ0lTWU5DIHNlcmlhbCBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBQQ0kgJiYgbQorCWhlbHAKKwkgIERyaXZlciBmb3IgRXRpbmMgUENJU1lOQyBib2FyZHMgYmFzZWQgb24gdGhlIEluZmluZW9uIChleC4gU2llbWVucykKKwkgIERTQ0M0IGNoaXBzZXQuCisKKwkgIFRoaXMgaXMgc3VwcG9zZWQgdG8gd29yayB3aXRoIHRoZSBmb3VyIHBvcnQgY2FyZC4gVGFrZSBhIGxvb2sgYXQKKwkgIDxodHRwOi8vd3d3LmNvZ2VuaXQuZnIvZHNjYzQvPiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKwkgIGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHNjYzQuCisKK2NvbmZpZyBEU0NDNF9QQ0lTWU5DCisJYm9vbCAiRXRpbmMgUENJU1lOQyBmZWF0dXJlcyIKKwlkZXBlbmRzIG9uIERTQ0M0CisJaGVscAorCSAgRHVlIHRvIEV0aW5jJ3MgZGVzaWduIGNob2ljZSBmb3IgaXRzIFBDSVNZTkMgY2FyZHMsIHNvbWUgb3BlcmF0aW9ucworCSAgYXJlIG9ubHkgYWxsb3dlZCBvbiBzcGVjaWZpYyBwb3J0cyBvZiB0aGUgRFNDQzQuIFRoaXMgb3B0aW9uIGlzIHRoZQorCSAgb25seSB3YXkgZm9yIHRoZSBkcml2ZXIgdG8ga25vdyB0aGF0IGl0IHNob3VsZG4ndCByZXR1cm4gYSBzdWNjZXNzCisJICBjb2RlIGZvciB0aGVzZSBvcGVyYXRpb25zLgorCisJICBQbGVhc2Ugc2F5IFkgaWYgeW91ciBjYXJkIGlzIGFuIEV0aW5jJ3MgUENJU1lOQy4KKworY29uZmlnIERTQ0M0X1BDSV9SU1QKKwlib29sICJIYXJkIHJlc2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBEU0NDNAorCWhlbHAKKwkgIFZhcmlvdXMgRFNDQzQgYnVncyBmb3JiaWQgYW55IHJlbGlhYmxlIHNvZnR3YXJlIHJlc2V0IG9mIHRoZSBBU0lDLgorCSAgQXMgYSByZXBsYWNlbWVudCwgc29tZSB2ZW5kb3JzIHByb3ZpZGUgYSB3YXkgdG8gYXNzZXJ0IHRoZSBQQ0kgI1JTVAorCSAgcGluIG9mIERTQ0M0IHRocm91Z2ggdGhlIEdQSU8gcG9ydCBvZiB0aGUgY2FyZC4gSWYgeW91IGNob29zZSBZLAorCSAgdGhlIGRyaXZlciB3aWxsIG1ha2UgdXNlIG9mIHRoaXMgZmVhdHVyZSBiZWZvcmUgbW9kdWxlIHJlbW92YWwKKwkgIChpLmUuIHJtbW9kKS4gVGhlIGZlYXR1cmUgaXMga25vd24gdG8gYmUgYXZhaWxhYmxlIG9uIENvbW10ZWNoJ3MKKwkgIGNhcmRzLiBDb250YWN0IHlvdXIgbWFudWZhY3R1cmVyIGZvciBkZXRhaWxzLgorCisJICBTYXkgWSBpZiB5b3VyIGNhcmQgc3VwcG9ydHMgdGhpcyBmZWF0dXJlLgorCiBjb25maWcgRExDSQogCXRyaXN0YXRlICJGcmFtZSBSZWxheSBETENJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBXQU4KQEAgLTM4Miw3ICszODIsNyBAQAogCiAjIFdhbiByb3V0ZXIgY29yZS4KIGNvbmZpZyBXQU5fUk9VVEVSX0RSSVZFUlMKLQlib29sICJXQU4gcm91dGVyIGRyaXZlcnMiCisJdHJpc3RhdGUgIldBTiByb3V0ZXIgZHJpdmVycyIKIAlkZXBlbmRzIG9uIFdBTiAmJiBXQU5fUk9VVEVSCiAJLS0taGVscC0tLQogCSAgQ29ubmVjdCBMQU4gdG8gV0FOIHZpYSBMaW51eCBib3guCkBAIC0zOTMsNyArMzkzLDggQEAKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dD4uCiAKIAkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQotCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAga2VybmVsIGV4Y2VwdCBmb3IgaG93IHN1Ym9yZGluYXRlIGRyaXZlcnMgbWF5IGJlIGJ1aWx0OgorCSAgc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKIAkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgV0FOIHJvdXRlciBkcml2ZXJzLgogCiAJICBJZiB1bnN1cmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYyBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMKaW5kZXggZTFiZjhiOS4uNmM3ZGZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYworKysgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCkBAIC05NzQsMTIgKzk3NCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IG47CiAKLQlpZiAoKG49aW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKT4+Q0FSRF9NSU5PUl9CSVRTKQorCWlmICgobj1pbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk+PkNBUkRfTUlOT1JfQklUUykKIAkJPj0gbnJfY2FyZHMpCiAJCXJldHVybiAtRU5PREVWOwogCWNvc2EgPSBjb3NhX2NhcmRzK247CiAKLQlpZiAoKG49aW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKQorCWlmICgobj1pbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkKIAkJJiAoKDE8PENBUkRfTUlOT1JfQklUUyktMSkpID49IGNvc2EtPm5jaGFubmVscykKIAkJcmV0dXJuIC1FTk9ERVY7CiAJY2hhbiA9IGNvc2EtPmNoYW4gKyBuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jIGIvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jCmluZGV4IGE0ZjczNTcuLmEwMmM1ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9ob3N0ZXNzX3N2MTEuYworKysgYi9kcml2ZXJzL25ldC93YW4vaG9zdGVzc19zdjExLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAJCi0Jc3Y9KHN0cnVjdCBzdjExX2RldmljZSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdjExX2RldmljZSksIEdGUF9LRVJORUwpOworCXN2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN2MTFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYoIXN2KQogCQlnb3RvIGZhaWwzOwogCQkJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbjIuYyBiL2RyaXZlcnMvbmV0L3dhbi9uMi5jCmluZGV4IGRjZjQ2YWQuLjVjMzIyZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9uMi5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9uMi5jCkBAIC01MDAsNyArNTAwLDcgQEAKICNpZmRlZiBNT0RVTEUKIAkJcHJpbnRrKEtFUk5fSU5GTyAibjI6IG5vIGNhcmQgaW5pdGlhbGl6ZWRcbiIpOwogI2VuZGlmCi0JCXJldHVybiAtRU5PU1lTOwkvKiBubyBwYXJhbWV0ZXJzIHNwZWNpZmllZCwgYWJvcnQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CS8qIG5vIHBhcmFtZXRlcnMgc3BlY2lmaWVkLCBhYm9ydCAqLwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKQEAgLTUzOCwxMSArNTM4LDExIEBACiAJCQluMl9ydW4oaW8sIGlycSwgcmFtLCB2YWxpZFswXSwgdmFsaWRbMV0pOwogCiAJCWlmICgqaHcgPT0gJ1x4MCcpCi0JCQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworCQkJcmV0dXJuIGZpcnN0X2NhcmQgPyAwIDogLUVJTlZBTDsKIAl9d2hpbGUoKmh3KysgPT0gJzonKTsKIAogCXByaW50ayhLRVJOX0VSUiAibjI6IGludmFsaWQgaGFyZHdhcmUgcGFyYW1ldGVyc1xuIik7Ci0JcmV0dXJuIGZpcnN0X2NhcmQgPyAwIDogLUVOT1NZUzsKKwlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRUlOVkFMOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYwppbmRleCA1ODIzZTNiLi42MjE4NGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jCkBAIC0yODY3LDcgKzI4NjcsNiBAQAogCXVjbG9uZyBjbGt0eXBlID0gY2hhbi0+Y29uZi5waHlzX3NldHRpbmdzLmNsb2NrX3R5cGU7CiAJdWNzaG9ydCBlbmNvZGluZyA9IGNoYW4tPmNvbmYucHJvdG9fc2V0dGluZ3MuZW5jb2Rpbmc7CiAJdWNzaG9ydCBwYXJpdHkgPSBjaGFuLT5jb25mLnByb3RvX3NldHRpbmdzLnBhcml0eTsgICAKLQlpbnQgdG1jLCBicjsKIAl1Y2NoYXIgbWQwLCBtZDI7CiAgICAgCiAJLyogUmVzZXQgdGhlIGNoYW5uZWwgKi8KQEAgLTI5NDAsOCArMjkzOSwxMiBAQAogCQljYXNlIFBDMzAwX1JTVjoKIAkJY2FzZSBQQzMwMF9YMjE6CiAJCQlpZiAoY2xrdHlwZSA9PSBDTE9DS19JTlQgfHwgY2xrdHlwZSA9PSBDTE9DS19UWElOVCkgeworCQkJCWludCB0bWMsIGJyOworCiAJCQkJLyogQ2FsY3VsYXRlIHRoZSBjbGtyYXRlIHBhcmFtZXRlcnMgKi8KIAkJCQl0bWMgPSBjbG9ja19yYXRlX2NhbGMoY2xrcmF0ZSwgY2FyZC0+aHcuY2xvY2ssICZicik7CisJCQkJaWYgKHRtYyA8IDApCisJCQkJCXJldHVybiAtRUlPOwogCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRNQ1QsIGNoKSwgdG1jKTsKIAkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUWFMsIGNoKSwKIAkJCQkJICAgKFRYU19EVFJYQyB8IFRYU19JQlJHIHwgYnIpKTsKQEAgLTMwOTcsMTQgKzMxMDAsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY3BjX29wZW5jaChwYzMwMGRldl90ICogZCkKK3N0YXRpYyBpbnQgY3BjX29wZW5jaChwYzMwMGRldl90ICogZCkKIHsKIAlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CiAJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7Ci0JaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsLCByYzsKIAl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOwogCi0JY2hfY29uZmlnKGQpOworCXJjID0gY2hfY29uZmlnKGQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJcnhfY29uZmlnKGQpOwogCkBAIC0zMTEzLDYgKzMxMTgsOCBAQAogCS8qIEFzc2VydCBSVFMgYW5kIERUUiAqLwogCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKENUTCwgY2gpLAogCQkgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKENUTCwgY2gpKSAmIH4oQ1RMX1JUUyB8IENUTF9EVFIpKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBjcGNfY2xvc2VjaChwYzMwMGRldl90ICogZCkKQEAgLTMxNjgsOSArMzE3NSwxNiBAQAogCX0KIAogCXNwcmludGYoaWZyLmlmcl9uYW1lLCAiJXMiLCBkZXYtPm5hbWUpOwotCWNwY19vcGVuY2goZCk7CisJcmVzdWx0ID0gY3BjX29wZW5jaChkKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGVycl9vdXQ7CisKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCXJldHVybiAwOworCitlcnJfb3V0OgorCWhkbGNfY2xvc2UoZGV2KTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IGNwY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMzQ0MSw3ICszNDU1LDcgQEAKIAlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSA8IDApCiAJCXJldHVybiBlcnI7CiAKLQljYXJkID0gKHBjMzAwX3QgKikga21hbGxvYyhzaXplb2YocGMzMDBfdCksIEdGUF9LRVJORUwpOworCWNhcmQgPSBrbWFsbG9jKHNpemVvZihwYzMwMF90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNhcmQgPT0gTlVMTCkgewogCQlwcmludGsoIlBDMzAwIGZvdW5kIGF0IFJBTSAweCUwMTZsbHgsICIKIAkJICAgICAgICJidXQgY291bGQgbm90IGFsbG9jYXRlIGNhcmQgc3RydWN0dXJlLlxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYwppbmRleCA5MzFjYmRmLi41ODczYzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jCkBAIC0xMjUsOCArMTI1LDggQEAKIHN0YXRpYyBpbnQgY3BjX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBjcGNfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIHN0YXRpYyB2b2lkIGNwY190dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgY3BjX3R0eV9yeF93b3JrKHZvaWQgKmRhdGEpOwotc3RhdGljIHZvaWQgY3BjX3R0eV90eF93b3JrKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgY3BjX3R0eV9yeF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBjcGNfdHR5X3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyBpbnQgY3BjX3R0eV9zZW5kX3RvX2NhcmQocGMzMDBkZXZfdCAqZGV2LHZvaWQgKmJ1ZiwgaW50IGxlbik7CiBzdGF0aWMgdm9pZCBjcGNfdHR5X3RyYWNlKHBjMzAwZGV2X3QgKmRldiwgY2hhciogYnVmLCBpbnQgbGVuLCBjaGFyIHJ4dHgpOwogc3RhdGljIHZvaWQgY3BjX3R0eV9zaWduYWxfb2ZmKHBjMzAwZGV2X3QgKnBjMzAwZGV2LCB1bnNpZ25lZCBjaGFyKTsKQEAgLTI2MSw4ICsyNjEsOCBAQAogCWNwY190dHktPnR0eV9taW5vciA9IHBvcnQgKyBDUENfVFRZX01JTk9SX1NUQVJUOwogCWNwY190dHktPnBjMzAwZGV2ID0gcGMzMDBkZXY7IAogCi0JSU5JVF9XT1JLKCZjcGNfdHR5LT50dHlfdHhfd29yaywgY3BjX3R0eV90eF93b3JrLCAodm9pZCAqKWNwY190dHkpOwotCUlOSVRfV09SSygmY3BjX3R0eS0+dHR5X3J4X3dvcmssIGNwY190dHlfcnhfd29yaywgKHZvaWQgKilwb3J0KTsKKwlJTklUX1dPUksoJmNwY190dHktPnR0eV90eF93b3JrLCBjcGNfdHR5X3R4X3dvcmspOworCUlOSVRfV09SSygmY3BjX3R0eS0+dHR5X3J4X3dvcmssIGNwY190dHlfcnhfd29yayk7CiAJCiAJY3BjX3R0eS0+YnVmX3J4LmZpcnN0ID0gY3BjX3R0eS0+YnVmX3J4Lmxhc3QgPSBOVUxMOwogCkBAIC02NTksMjEgKzY1OSwyMyBAQAogICogbyBjYWxsIHRoZSBsaW5lIGRpc2MuIHJlYWQKICAqIG8gZnJlZSBtZW1vcnkKICAqLwotc3RhdGljIHZvaWQgY3BjX3R0eV9yeF93b3JrKHZvaWQgKiBkYXRhKQorc3RhdGljIHZvaWQgY3BjX3R0eV9yeF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdF9jcGNfdHR5X2FyZWEgKmNwY190dHk7CiAJdW5zaWduZWQgbG9uZyBwb3J0OwogCWludCBpLCBqOwotCXN0X2NwY190dHlfYXJlYSAqY3BjX3R0eTsgCiAJdm9sYXRpbGUgc3RfY3BjX3J4X2J1ZiAqYnVmOwogCWNoYXIgZmxhZ3M9MCxmbGdfcng9MTsgCiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAKIAlpZiAoY3BjX3R0eV9jbnQgPT0gMCkgcmV0dXJuOwotCiAJCiAJZm9yIChpPTA7IChpIDwgNCkgJiYgZmxnX3J4IDsgaSsrKSB7CiAJCWZsZ19yeCA9IDA7Ci0JCXBvcnQgPSAodW5zaWduZWQgbG9uZylkYXRhOworCisJCWNwY190dHkgPSBjb250YWluZXJfb2Yod29yaywgc3RfY3BjX3R0eV9hcmVhLCB0dHlfcnhfd29yayk7CisJCXBvcnQgPSBjcGNfdHR5IC0gY3BjX3R0eV9hcmVhOworCiAJCWZvciAoaj0wOyBqIDwgQ1BDX1RUWV9OUE9SVFM7IGorKykgewogCQkJY3BjX3R0eSA9ICZjcGNfdHR5X2FyZWFbcG9ydF07CiAJCQpAQCAtNzgyLDcgKzc4NCw3IEBACiAJCQljb250aW51ZTsKIAkJfSAKIAkJCi0JCW5ldyA9IChzdF9jcGNfcnhfYnVmICopa21hbGxvYyhyeF9sZW4gKyBzaXplb2Yoc3RfY3BjX3J4X2J1ZiksIEdGUF9BVE9NSUMpOworCQluZXcgPSBrbWFsbG9jKHJ4X2xlbiArIHNpemVvZihzdF9jcGNfcnhfYnVmKSwgR0ZQX0FUT01JQyk7CiAJCWlmIChuZXcgPT0gMCkgewogCQkJY3BjX3R0eV9yeF9kaXNjX2ZyYW1lKHBjMzAwY2hhbik7CiAJCQljb250aW51ZTsKQEAgLTg4Miw5ICs4ODQsMTAgQEAKICAqIG8gaWYgbmVlZCBjYWxsIGxpbmUgZGlzY2lwbGluZSB3YWtldXAKICAqIG8gY2FsbCB3YWtlX3VwX2ludGVycnVwdGlibGUKICAqLwotc3RhdGljIHZvaWQgY3BjX3R0eV90eF93b3JrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBjcGNfdHR5X3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0X2NwY190dHlfYXJlYSAqY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgZGF0YTsgCisJc3RfY3BjX3R0eV9hcmVhICpjcGNfdHR5ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0X2NwY190dHlfYXJlYSwgdHR5X3R4X3dvcmspOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7IAogCiAJQ1BDX1RUWV9EQkcoIiVzOiBjcGNfdHR5X3R4X3dvcmsgaW5pdFxuIixjcGNfdHR5LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMgYi9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jCmluZGV4IDljM2NjYzYuLjFjOWVkZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpAQCAtMTIzLDggKzEyMyw4IEBACiAJdW5zaWduZWQgY2hhciAqeGJ1ZmYsICpyYnVmZjsKIAlpbnQgbGVuID0gMiogbmV3bXR1OwogCi0JeGJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jIChsZW4gKyA0LCBHRlBfQVRPTUlDKTsKLQlyYnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MgKGxlbiArIDQsIEdGUF9BVE9NSUMpOworCXhidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfQVRPTUlDKTsKKwlyYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0FUT01JQyk7CiAKIAlpZiAoeGJ1ZmYgPT0gTlVMTCB8fCByYnVmZiA9PSBOVUxMKSAgCiAJewpAQCAtNDY1LDExICs0NjUsMTEgQEAKIAogCWxlbiA9IGRldi0+bXR1ICogMjsKIAotCXNsLT5yYnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisJc2wtPnJidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfS0VSTkVMKTsKIAlpZiAoc2wtPnJidWZmID09IE5VTEwpICAgewogCQlnb3RvIG5vcmJ1ZmY7CiAJfQotCXNsLT54YnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisJc2wtPnhidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfS0VSTkVMKTsKIAlpZiAoc2wtPnhidWZmID09IE5VTEwpICAgewogCQlnb3RvIG5veGJ1ZmY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2QuYyBiL2RyaXZlcnMvbmV0L3dkLmMKaW5kZXggNDFmMWQ2Ny4uN2YzODAxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2QuYworKysgYi9kcml2ZXJzL25ldC93ZC5jCkBAIC01MzgsNyArNTM4LDcgQEAKIAlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOwogfQogCi12b2lkCit2b2lkIF9fZXhpdAogY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgdGhpc19kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKaW5kZXggMGEzM2M4YS4uNDRhMjI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlICJhaXJvLmgiCiAKQEAgLTI4OTcsNiArMjg5OCw4IEBACiAJCWdvdG8gZXJyX291dF9tYXA7CiAJfQogCWFpLT53aWZpZGV2ID0gaW5pdF93aWZpZGV2KGFpLCBkZXYpOworCWlmICghYWktPndpZmlkZXYpCisJCWdvdG8gZXJyX291dF9yZWc7CiAKIAlzZXRfYml0KEZMQUdfUkVHSVNURVJFRCwmYWktPmZsYWdzKTsKIAlhaXJvX3ByaW50X2luZm8oZGV2LT5uYW1lLCAiTUFDIGVuYWJsZWQgJXg6JXg6JXg6JXg6JXg6JXgiLApAQCAtMjkwOCwxMSArMjkxMSwxOCBAQAogCQlmb3IoIGkgPSAwOyBpIDwgTUFYX0ZJRFM7IGkrKyApCiAJCQlhaS0+Zmlkc1tpXSA9IHRyYW5zbWl0X2FsbG9jYXRlKGFpLEFJUk9fREVGX01UVSxpPj1NQVhfRklEUy8yKTsKIAotCXNldHVwX3Byb2NfZW50cnkoIGRldiwgZGV2LT5wcml2ICk7IC8qIFhYWCBjaGVjayBmb3IgZmFpbHVyZSAqLworCWlmIChzZXR1cF9wcm9jX2VudHJ5KGRldiwgZGV2LT5wcml2KSA8IDApCisJCWdvdG8gZXJyX291dF93aWZpOworCiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIAlTRVRfTU9EVUxFX09XTkVSKGRldik7CiAJcmV0dXJuIGRldjsKIAorZXJyX291dF93aWZpOgorCXVucmVnaXN0ZXJfbmV0ZGV2KGFpLT53aWZpZGV2KTsKKwlmcmVlX25ldGRldihhaS0+d2lmaWRldik7CitlcnJfb3V0X3JlZzoKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogZXJyX291dF9tYXA6CiAJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpICYmIHBjaSkgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaSwgUENJX1NIQVJFRF9MRU4sIGFpLT5zaGFyZWQsIGFpLT5zaGFyZWRfZG1hKTsKQEAgLTMwODksNyArMzA5OSw4IEBACiAJCQkJCQlzZXRfYml0KEpPQl9BVVRPV0VQLCAmYWktPmpvYnMpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KLQkJCQkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJCQkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYKKwkJCQkJICAgICFmcmVlemluZyhjdXJyZW50KSkgewogCQkJCQkJdW5zaWduZWQgbG9uZyB3YWtlX2F0OwogCQkJCQkJaWYgKCFhaS0+ZXhwaXJlcyB8fCAhYWktPnNjYW5fdGltZW91dCkgewogCQkJCQkJCXdha2VfYXQgPSBtYXgoYWktPmV4cGlyZXMsCkBAIC0zMTAxLDcgKzMxMTIsOCBAQAogCQkJCQkJc2NoZWR1bGVfdGltZW91dCh3YWtlX2F0IC0gamlmZmllcyk7CiAJCQkJCQljb250aW51ZTsKIAkJCQkJfQotCQkJCX0gZWxzZSBpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkJCX0gZWxzZSBpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJgorCQkJCQkgICAhZnJlZXppbmcoY3VycmVudCkpIHsKIAkJCQkJc2NoZWR1bGUoKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQpAQCAtNDQ5NSw5MSArNDUwNywxMjggQEAKIAlhcHJpdi0+cHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGFwcml2LT5wcm9jX25hbWUsCiAJCQkJCSAgICAgIFNfSUZESVJ8YWlyb19wZXJtLAogCQkJCQkgICAgICBhaXJvX2VudHJ5KTsKLSAgICAgICAgYXByaXYtPnByb2NfZW50cnktPnVpZCA9IHByb2NfdWlkOwotICAgICAgICBhcHJpdi0+cHJvY19lbnRyeS0+Z2lkID0gcHJvY19naWQ7Ci0gICAgICAgIGFwcml2LT5wcm9jX2VudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCWlmICghYXByaXYtPnByb2NfZW50cnkpCisJCWdvdG8gZmFpbDsKKwlhcHJpdi0+cHJvY19lbnRyeS0+dWlkID0gcHJvY191aWQ7CisJYXByaXYtPnByb2NfZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWFwcml2LT5wcm9jX2VudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwogCiAJLyogU2V0dXAgdGhlIFN0YXRzRGVsdGEgKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJTdGF0c0RlbHRhIiwKIAkJCQkgIFNfSUZSRUcgfCAoU19JUlVHTyZwcm9jX3Blcm0pLAogCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOwotICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7Ci0gICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIGZhaWxfc3RhdHNfZGVsdGE7CisJZW50cnktPnVpZCA9IHByb2NfdWlkOworCWVudHJ5LT5naWQgPSBwcm9jX2dpZDsKIAllbnRyeS0+ZGF0YSA9IGRldjsKLSAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CiAJU0VUUFJPQ19PUFMoZW50cnksIHByb2Nfc3RhdHNkZWx0YV9vcHMpOwogCiAJLyogU2V0dXAgdGhlIFN0YXRzICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiU3RhdHMiLAogCQkJCSAgU19JRlJFRyB8IChTX0lSVUdPJnByb2NfcGVybSksCiAJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7Ci0gICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKLSAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWlmICghZW50cnkpCisJCWdvdG8gZmFpbF9zdGF0czsKKwllbnRyeS0+dWlkID0gcHJvY191aWQ7CisJZW50cnktPmdpZCA9IHByb2NfZ2lkOwogCWVudHJ5LT5kYXRhID0gZGV2OwotICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19zdGF0c19vcHMpOwogCiAJLyogU2V0dXAgdGhlIFN0YXR1cyAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlN0YXR1cyIsCiAJCQkJICBTX0lGUkVHIHwgKFNfSVJVR08mcHJvY19wZXJtKSwKIAkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKLSAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOwotICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJaWYgKCFlbnRyeSkKKwkJZ290byBmYWlsX3N0YXR1czsKKwllbnRyeS0+dWlkID0gcHJvY191aWQ7CisJZW50cnktPmdpZCA9IHByb2NfZ2lkOwogCWVudHJ5LT5kYXRhID0gZGV2OwotICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19zdGF0dXNfb3BzKTsKIAogCS8qIFNldHVwIHRoZSBDb25maWcgKi8KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJDb25maWciLAogCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKIAkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKLSAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOwotICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJaWYgKCFlbnRyeSkKKwkJZ290byBmYWlsX2NvbmZpZzsKKwllbnRyeS0+dWlkID0gcHJvY191aWQ7CisJZW50cnktPmdpZCA9IHByb2NfZ2lkOwogCWVudHJ5LT5kYXRhID0gZGV2OwotICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19jb25maWdfb3BzKTsKIAogCS8qIFNldHVwIHRoZSBTU0lEICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiU1NJRCIsCiAJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAogCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOwotICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7Ci0gICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIGZhaWxfc3NpZDsKKwllbnRyeS0+dWlkID0gcHJvY191aWQ7CisJZW50cnktPmdpZCA9IHByb2NfZ2lkOwogCWVudHJ5LT5kYXRhID0gZGV2OwotICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19TU0lEX29wcyk7CiAKIAkvKiBTZXR1cCB0aGUgQVBMaXN0ICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiQVBMaXN0IiwKIAkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCiAJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7Ci0gICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKLSAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWlmICghZW50cnkpCisJCWdvdG8gZmFpbF9hcGxpc3Q7CisJZW50cnktPnVpZCA9IHByb2NfdWlkOworCWVudHJ5LT5naWQgPSBwcm9jX2dpZDsKIAllbnRyeS0+ZGF0YSA9IGRldjsKLSAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CiAJU0VUUFJPQ19PUFMoZW50cnksIHByb2NfQVBMaXN0X29wcyk7CiAKIAkvKiBTZXR1cCB0aGUgQlNTTGlzdCAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIkJTU0xpc3QiLAogCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKIAkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIGZhaWxfYnNzbGlzdDsKIAllbnRyeS0+dWlkID0gcHJvY191aWQ7CiAJZW50cnktPmdpZCA9IHByb2NfZ2lkOwogCWVudHJ5LT5kYXRhID0gZGV2OwotICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19CU1NMaXN0X29wcyk7CiAKIAkvKiBTZXR1cCB0aGUgV2VwS2V5ICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiV2VwS2V5IiwKIAkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCiAJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7Ci0gICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKLSAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWlmICghZW50cnkpCisJCWdvdG8gZmFpbF93ZXBrZXk7CisJZW50cnktPnVpZCA9IHByb2NfdWlkOworCWVudHJ5LT5naWQgPSBwcm9jX2dpZDsKIAllbnRyeS0+ZGF0YSA9IGRldjsKLSAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CiAJU0VUUFJPQ19PUFMoZW50cnksIHByb2Nfd2Vwa2V5X29wcyk7CiAKIAlyZXR1cm4gMDsKKworZmFpbF93ZXBrZXk6CisJcmVtb3ZlX3Byb2NfZW50cnkoIkJTU0xpc3QiLCBhcHJpdi0+cHJvY19lbnRyeSk7CitmYWlsX2Jzc2xpc3Q6CisJcmVtb3ZlX3Byb2NfZW50cnkoIkFQTGlzdCIsIGFwcml2LT5wcm9jX2VudHJ5KTsKK2ZhaWxfYXBsaXN0OgorCXJlbW92ZV9wcm9jX2VudHJ5KCJTU0lEIiwgYXByaXYtPnByb2NfZW50cnkpOworZmFpbF9zc2lkOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJDb25maWciLCBhcHJpdi0+cHJvY19lbnRyeSk7CitmYWlsX2NvbmZpZzoKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHVzIiwgYXByaXYtPnByb2NfZW50cnkpOworZmFpbF9zdGF0dXM6CisJcmVtb3ZlX3Byb2NfZW50cnkoIlN0YXRzIiwgYXByaXYtPnByb2NfZW50cnkpOworZmFpbF9zdGF0czoKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHNEZWx0YSIsIGFwcml2LT5wcm9jX2VudHJ5KTsKK2ZhaWxfc3RhdHNfZGVsdGE6CisJcmVtb3ZlX3Byb2NfZW50cnkoYXByaXYtPnByb2NfbmFtZSwgYWlyb19lbnRyeSk7CitmYWlsOgorCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgaW50IHRha2Vkb3duX3Byb2NfZW50cnkoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC01OTI0LDcgKzU5NzMsNiBAQAogCiAJLyogR2V0IHRoZSBjdXJyZW50IFNTSUQgKi8KIAltZW1jcHkoZXh0cmEsIHN0YXR1c19yaWQuU1NJRCwgc3RhdHVzX3JpZC5TU0lEbGVuKTsKLQlleHRyYVtzdGF0dXNfcmlkLlNTSURsZW5dID0gJ1wwJzsKIAkvKiBJZiBub25lLCB3ZSBtYXkgd2FudCB0byBnZXQgdGhlIG9uZSB0aGF0IHdhcyBzZXQgKi8KIAogCS8qIFB1c2ggaXQgb3V0ICEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwppbmRleCBhYzk0MzdkLi5mMTIzNTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCkBAIC0yMTksMjEgKzIxOSw2IEBACiAJZGV2ID0gbGluay0+cHJpdjsKIAogCURFQlVHKDAsICJhaXJvX2NvbmZpZygweCVwKVxuIiwgbGluayk7Ci0JCi0JLyoKLQkgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgotCSAgcmVnaXN0ZXJzLgotCSovCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLQl0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0JdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwogCiAJLyoKIAkgIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJpZXMsCkBAIC0yNDcsNiArMjMyLDEwIEBACiAJICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCiAJICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCiAJKi8KKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAJd2hpbGUgKDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCmluZGV4IDMxZWVkODUuLjEwYmNiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpAQCAtNTk1LDcgKzU5NSw3IEBACiBzdGF0aWMgdm9pZCBhdG1lbF9zbW9vdGhfcXVhbChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdik7CiBzdGF0aWMgdm9pZCBhdG1lbF93cml0ZUFSKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBkYXRhKTsKIHN0YXRpYyBpbnQgcHJvYmVfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgcmVzZXRfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50IHJlc2V0X2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBhdG1lbF9lbnRlcl9zdGF0ZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IG5ld19zdGF0ZSk7CiBpbnQgYXRtZWxfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKQEAgLTc4NCwxMSArNzg0LDExIEBACiAKIHN0YXRpYyBpbnQgc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlzdGF0aWMgY29uc3QgdTggU05BUF9SRkMxMDI0WzZdID0geyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CiAJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyIGhlYWRlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBidWZmLCBmcmFtZV9jdGwsIGxlbiA9IChFVEhfWkxFTiA8IHNrYi0+bGVuKSA/IHNrYi0+bGVuIDogRVRIX1pMRU47Ci0JdTggU05BUF9SRkMxMDI0WzZdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwogCiAJaWYgKHByaXYtPmNhcmQgJiYgcHJpdi0+cHJlc2VudF9jYWxsYmFjayAmJgogCSAgICAhKCpwcml2LT5wcmVzZW50X2NhbGxiYWNrKShwcml2LT5jYXJkKSkgewpAQCAtMTE5Myw3ICsxMTkzLDcgQEAKIAogCQlhdG1lbF9zZXRfZ2NyKGRldiwgR0NSX0FDS0lOVCk7IC8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLwogCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaXJxX29yZGVyKS9zaXplb2YodTgpOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlycV9vcmRlcik7IGkrKykKIAkJCWlmIChpc3IgJiBpcnFfb3JkZXJbaV0pCiAJCQkJYnJlYWs7CiAKQEAgLTEzNDUsMTAgKzEzNDUsMTAgQEAKIAkJYXRtZWxfc2V0X21pYjgocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX1JFR19ET01BSU5fUE9TLCBwcml2LT5yZWdfZG9tYWluKTsKIAl9IGVsc2UgewogCQlwcml2LT5yZWdfZG9tYWluID0gYXRtZWxfZ2V0X21pYjgocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX1JFR19ET01BSU5fUE9TKTsKLQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF90YWJsZSk7IGkrKykKIAkJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbikKIAkJCQlicmVhazsKLQkJaWYgKGkgPT0gc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKSkgeworCQlpZiAoaSA9PSBBUlJBWV9TSVpFKGNoYW5uZWxfdGFibGUpKSB7CiAJCQlwcml2LT5yZWdfZG9tYWluID0gUkVHX0RPTUFJTl9NS0sxOwogCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvcnkgZG9tYWluOiBhc3N1bWluZyBNS0sxLlxuIiwgZGV2LT5uYW1lKTsKIAkJfQpAQCAtMTM5Myw3ICsxMzkzLDcgQEAKIAkgICBlbHNlIHJldHVybiBzdWl0YWJsZSBkZWZhdWx0IGNoYW5uZWwgKi8KIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF90YWJsZSk7IGkrKykKIAkJaWYgKHByaXYtPnJlZ19kb21haW4gPT0gY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKSB7CiAJCQlpZiAoY2hhbm5lbCA+PSBjaGFubmVsX3RhYmxlW2ldLm1pbiAmJgogCQkJICAgIGNoYW5uZWwgPD0gY2hhbm5lbF90YWJsZVtpXS5tYXgpCkBAIC0xNDM3LDcgKzE0MzcsNyBAQAogCQl9CiAKIAkJciA9ICI8dW5rbm93bj4iOwotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKTsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGFubmVsX3RhYmxlKTsgaSsrKQogCQkJaWYgKHByaXYtPnJlZ19kb21haW4gPT0gY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKQogCQkJCXIgPSBjaGFubmVsX3RhYmxlW2ldLm5hbWU7CiAKQEAgLTE2NzgsMTEgKzE2NzgsOSBAQAogCS8qIEdldCB0aGUgY3VycmVudCBTU0lEICovCiAJaWYgKHByaXYtPm5ld19TU0lEX3NpemUgIT0gMCkgewogCQltZW1jcHkoZXh0cmEsIHByaXYtPm5ld19TU0lELCBwcml2LT5uZXdfU1NJRF9zaXplKTsKLQkJZXh0cmFbcHJpdi0+bmV3X1NTSURfc2l6ZV0gPSAnXDAnOwogCQlkd3JxLT5sZW5ndGggPSBwcml2LT5uZXdfU1NJRF9zaXplOwogCX0gZWxzZSB7CiAJCW1lbWNweShleHRyYSwgcHJpdi0+U1NJRCwgcHJpdi0+U1NJRF9zaXplKTsKLQkJZXh0cmFbcHJpdi0+U1NJRF9zaXplXSA9ICdcMCc7CiAJCWR3cnEtPmxlbmd0aCA9IHByaXYtPlNTSURfc2l6ZTsKIAl9CiAKQEAgLTE3MzgsNyArMTczNiw3IEBACiAJCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCiAJCQkJcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID0gMDsKIAkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KLQkJaWYoIShkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJaWYgKCEoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CiAJCQkvKiBDbGVhbnVwICovCiAJCQltZW1zZXQocHJpdi0+d2VwX2tleXNbaW5kZXhdLCAwLCAxMyk7CiAJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLwpAQCAtMTkwOSw3ICsxOTA3LDcgQEAKIAogCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CiAJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKLQkKKwogCWlmICghcHJpdi0+d2VwX2lzX29uKSB7CiAJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOwogCQlleHQtPmtleV9sZW4gPSAwOwpAQCAtMjM0NSw2ICsyMzQzLDE0IEBACiAJCWl3ZS51LmZyZXEuZSA9IDA7CiAJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKIAorCQkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwkJaXdlLnUucXVhbC5sZXZlbCA9IHByaXYtPkJTU2luZm9baV0uUlNTSTsKKwkJaXdlLnUucXVhbC5xdWFsICA9IGl3ZS51LnF1YWwubGV2ZWw7CisJCS8qIGl3ZS51LnF1YWwubm9pc2UgID0gU09NRVRISU5HICovCisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEgLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisKKwogCQlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKIAkJaWYgKHByaXYtPkJTU2luZm9baV0uVXNpbmdXRVApCiAJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CkBAIC0yMzc1LDcgKzIzODEsNyBAQAogCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKIAlyYW5nZS0+bWF4X253aWQgPSAweDAwMDA7CiAJcmFuZ2UtPm51bV9jaGFubmVscyA9IDA7Ci0JZm9yIChqID0gMDsgaiA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGorKykKKwlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShjaGFubmVsX3RhYmxlKTsgaisrKQogCQlpZiAocHJpdi0+cmVnX2RvbWFpbiA9PSBjaGFubmVsX3RhYmxlW2pdLnJlZ19kb21haW4pIHsKIAkJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBjaGFubmVsX3RhYmxlW2pdLm1heCAtIGNoYW5uZWxfdGFibGVbal0ubWluICsgMTsKIAkJCWJyZWFrOwpAQCAtMjU4MSw5ICsyNTg3LDkgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBhdG1lbF9oYW5kbGVyX2RlZiA9CiB7Ci0JLm51bV9zdGFuZGFyZAk9IHNpemVvZihhdG1lbF9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCi0JLm51bV9wcml2YXRlCT0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAotCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5udW1fc3RhbmRhcmQJPSBBUlJBWV9TSVpFKGF0bWVsX2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZQk9IEFSUkFZX1NJWkUoYXRtZWxfcHJpdmF0ZV9oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IEFSUkFZX1NJWkUoYXRtZWxfcHJpdmF0ZV9hcmdzKSwKIAkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBhdG1lbF9oYW5kbGVyLAogCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgYXRtZWxfcHJpdmF0ZV9oYW5kbGVyLAogCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBhdG1lbF9wcml2YXRlX2FyZ3MsCkBAIC0yNjQ3LDcgKzI2NTMsNyBAQAogCiAJCWRvbWFpbltSRUdET01BSU5TWl0gPSAwOwogCQlyYyA9IC1FSU5WQUw7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF90YWJsZSk7IGkrKykgewogCQkJLyogc3RyY2FzZWNtcCBkb2Vzbid0IGV4aXN0IGluIHRoZSBsaWJyYXJ5ICovCiAJCQljaGFyICphID0gY2hhbm5lbF90YWJsZVtpXS5uYW1lOwogCQkJY2hhciAqYiA9IGRvbWFpbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCmluZGV4IDc4NTY2NDAuLjEyNjE3Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpAQCAtNSwxMiArNSwxMiBAQAogICAgICAgICBDb3B5cmlnaHQgMjAwMC0yMDAxIEFUTUVMIENvcnBvcmF0aW9uLgogICAgICAgICBDb3B5cmlnaHQgMjAwMyBTaW1vbiBLZWxsZXkuCiAKLSAgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBmcm9tIHZlcnNpb24gMi4xLjEgb2YgdGhlIEF0bWVsIGRyaXZlcnMsIAotICAgIHJlbGVhc2VkIGJ5IEF0bWVsIGNvcnAuIHVuZGVyIHRoZSBHUEwgaW4gRGVjZW1iZXIgMjAwMi4gSXQgYWxzbyAKLSAgICBpbmNsdWRlcyBjb2RlIGZyb20gdGhlIExpbnV4IGFpcm9uZXQgZHJpdmVycyAoQykgQmVuamFtaW4gUmVlZCwgCi0gICAgYW5kIHRoZSBMaW51eCBQQ01DSUEgcGFja2FnZSwgKEMpIERhdmlkIEhpbmRzLiAKKyAgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBmcm9tIHZlcnNpb24gMi4xLjEgb2YgdGhlIEF0bWVsIGRyaXZlcnMsCisgICAgcmVsZWFzZWQgYnkgQXRtZWwgY29ycC4gdW5kZXIgdGhlIEdQTCBpbiBEZWNlbWJlciAyMDAyLiBJdCBhbHNvCisgICAgaW5jbHVkZXMgY29kZSBmcm9tIHRoZSBMaW51eCBhaXJvbmV0IGRyaXZlcnMgKEMpIEJlbmphbWluIFJlZWQsCisgICAgYW5kIHRoZSBMaW51eCBQQ01DSUEgcGFja2FnZSwgKEMpIERhdmlkIEhpbmRzLgogCi0gICAgRm9yIGFsbCBxdWVyaWVzIGFib3V0IHRoaXMgY29kZSwgcGxlYXNlIGNvbnRhY3QgdGhlIGN1cnJlbnQgYXV0aG9yLCAKKyAgICBGb3IgYWxsIHF1ZXJpZXMgYWJvdXQgdGhpcyBjb2RlLCBwbGVhc2UgY29udGFjdCB0aGUgY3VycmVudCBhdXRob3IsCiAgICAgU2ltb24gS2VsbGV5IDxzaW1vbkB0aGVrZWxsZXlzLm9yZy51az4gYW5kIG5vdCBBdG1lbCBDb3Jwb3JhdGlvbi4KIAogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC04Nyw3ICs4Nyw3IEBACiAgICBldmVudCBpcyByZWNlaXZlZC4gIFRoZSBjb25maWcoKSBhbmQgcmVsZWFzZSgpIGVudHJ5IHBvaW50cyBhcmUKICAgIHVzZWQgdG8gY29uZmlndXJlIG9yIHJlbGVhc2UgYSBzb2NrZXQsIGluIHJlc3BvbnNlIHRvIGNhcmQKICAgIGluc2VydGlvbiBhbmQgZWplY3Rpb24gZXZlbnRzLiAgVGhleSBhcmUgaW52b2tlZCBmcm9tIHRoZSBhdG1lbF9jcwotICAgZXZlbnQgaGFuZGxlci4gCisgICBldmVudCBoYW5kbGVyLgogKi8KIAogc3RhdGljIGludCBhdG1lbF9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspOwpAQCAtMTMzLDIyICsxMzMsMjIgQEAKICAgIGRldmljZSBJTyByb3V0aW5lcyBjYW4gdXNlIGEgZmxhZyBsaWtlIHRoaXMgdG8gdGhyb3R0bGUgSU8gdG8gYQogICAgY2FyZCB0aGF0IGlzIG5vdCByZWFkeSB0byBhY2NlcHQgaXQuCiAqLwotICAgCisKIHR5cGVkZWYgc3RydWN0IGxvY2FsX2luZm9fdCB7CiAJZGV2X25vZGVfdAlub2RlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpldGhfZGV2OwogfSBsb2NhbF9pbmZvX3Q7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKKwogICBhdG1lbF9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZwogICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKICAgd2l0aCBDYXJkIFNlcnZpY2VzLgotICAKKwogICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKICAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKICAgY2FyZCBpbnNlcnRpb24gZXZlbnQuCi0gIAorCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBzdGF0aWMgaW50IGF0bWVsX3Byb2JlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKQEAgLTE4NCwxMiArMTg0LDEyIEBACiB9IC8qIGF0bWVsX2F0dGFjaCAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgCisKICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCiAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCiAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KLSAgCisKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHN0YXRpYyB2b2lkIGF0bWVsX2RldGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKQEAgLTIwMiwxMSArMjAyLDExIEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKKwogICBhdG1lbF9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKICAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCiAgIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KLSAgCisKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKICNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXApAQCAtMjM3LDI4ICsyMzcsMTcgQEAKIAlkaWQgPSBoYW5kbGVfdG9fZGV2KGxpbmspLmRyaXZlcl9kYXRhOwogCiAJREVCVUcoMCwgImF0bWVsX2NvbmZpZygweCVwKVxuIiwgbGluayk7Ci0JCisKIAl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKIAl0dXBsZS5UdXBsZURhdGEgPSBidWY7CiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CiAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCQotCS8qCi0JICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLQkgIHJlZ2lzdGVycy4KLQkqLwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CiAKIAkvKgogCSAgSW4gdGhpcyBsb29wLCB3ZSBzY2FuIHRoZSBDSVMgZm9yIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cmllcywKIAkgIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcKIAkgIHZvbHRhZ2UsIElPIHdpbmRvdywgbWVtb3J5IHdpbmRvdywgYW5kIGludGVycnVwdCBzZXR0aW5ncy4KLQkgIAorCiAJICBXZSBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXJkIHRvIGJlIGNvbmZpZ3VyZWQ6IHdlIHVzZQogCSAganVzdCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBDSVMuICBJbiBhbiBpZGVhbCB3b3JsZCwKIAkgIHRoaXMgd291bGQgd29yayBmb3IgYW55IFBDTUNJQSBjYXJkLCBidXQgaXQgcmVxdWlyZXMgYSBjb21wbGV0ZQpAQCAtMjc0LDE3ICsyNjMsMTcgQEAKIAkJaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpICE9IDAgfHwKIAkJCQlwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpICE9IDApCiAJCQlnb3RvIG5leHRfZW50cnk7Ci0JCQorCiAJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgZGZsdCA9ICpjZmc7CiAJCWlmIChjZmctPmluZGV4ID09IDApIGdvdG8gbmV4dF9lbnRyeTsKIAkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0JCQorCiAJCS8qIERvZXMgdGhpcyBjYXJkIG5lZWQgYXVkaW8gb3V0cHV0PyAqLwogCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7CiAJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKIAkJCWxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CiAJCX0KLQkJCisKIAkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCiAJCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwogCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQpAQCAtMjkzLDExICsyODIsMTEgQEAKIAkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQogCQkJbGluay0+Y29uZi5WcHAgPQogCQkJCWRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7Ci0JCQorCiAJCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLwogCQlpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpCiAJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotCQkKKwogCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KIAkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKIAkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKQEAgLTMxNSwxOCArMzA0LDE4IEBACiAJCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CiAJCQl9CiAJCX0KLQkJCisKIAkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KIAkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykgIT0gMCkKIAkJCWdvdG8gbmV4dF9lbnRyeTsKIAogCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCiAJCWJyZWFrOwotCQkKKwogCW5leHRfZW50cnk6CiAJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwogCX0KLQkKKwogCS8qCiAJICBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhCiAJICBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQsIHVubGVzcyB0aGUgJ0hhbmRsZXInIG1lbWJlciBvZiB0aGUKQEAgLTMzNCwzMSArMzIzLDMxIEBACiAJKi8KIAlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQogCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluaywgJmxpbmstPmlycSkpOwotCQorCiAJLyoKIAkgIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCiAJICB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZywgYW5kIHB1dHRpbmcgdGhlCiAJICBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLgogCSovCiAJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKLQkKKwogCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEgPT0gMCkgewotCQlwcmludGsoS0VSTl9BTEVSVCAKKwkJcHJpbnRrKEtFUk5fQUxFUlQKIAkJICAgICAgICJhdG1lbDogY2Fubm90IGFzc2lnbiBJUlE6IGNoZWNrIHRoYXQgQ09ORklHX0lTQSBpcyBzZXQgaW4ga2VybmVsIGNvbmZpZy4iKTsKIAkJZ290byBjc19mYWlsZWQ7CiAJfQotICAgICAgIAotCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiA9IAorCisJKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2ID0KIAkJaW5pdF9hdG1lbF9jYXJkKGxpbmstPmlycS5Bc3NpZ25lZElSUSwKIAkJCQlsaW5rLT5pby5CYXNlUG9ydDEsCiAJCQkJZGlkID8gZGlkLT5kcml2ZXJfaW5mbyA6IEFUTUVMX0ZXX1RZUEVfTk9ORSwKIAkJCQkmaGFuZGxlX3RvX2RldihsaW5rKSwKLQkJCQljYXJkX3ByZXNlbnQsIAorCQkJCWNhcmRfcHJlc2VudCwKIAkJCQlsaW5rKTsKLQlpZiAoISgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldikgCisJaWYgKCEoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYpCiAJCQlnb3RvIGNzX2ZhaWxlZDsKLQkKLQkKKworCiAJLyoKIAkgIEF0IHRoaXMgcG9pbnQsIHRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZShzKSBuZWVkIHRvIGJlCiAJICBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXZfbm9kZS4KQEAgLTM3NiwxMSArMzY1LDExIEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKKwogICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgYXRtZWxfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUKICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCiAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgotICAKKwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogc3RhdGljIHZvaWQgYXRtZWxfcmVsZWFzZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKQEAgLTUxNyw3ICs1MDYsNyBAQAogICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKICAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKICAgICBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwogCiBtb2R1bGVfaW5pdChhdG1lbF9jc19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKaW5kZXggM2JmYTc5MS4uOTJmODdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKQEAgLTUzLDE4ICs1MywxOCBAQAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBlbnQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQkJCisKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCiAJCXJldHVybiAtRU5PREVWOwotCQorCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JCi0JZGV2ID0gaW5pdF9hdG1lbF9jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQsIAorCisJZGV2ID0gaW5pdF9hdG1lbF9jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQsCiAJCQkgICAgICBBVE1FTF9GV19UWVBFXzUwNiwKIAkJCSAgICAgICZwZGV2LT5kZXYsIE5VTEwsIE5VTEwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKLQkKKwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaAppbmRleCBkNmE4YmYwLi44Mjg2Njc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaApAQCAtMTU5LDYgKzE1OSw3IEBACiAKIC8qIENoaXBjb21tb24gcmVnaXN0ZXJzLiAqLwogI2RlZmluZSBCQ000M3h4X0NISVBDT01NT05fQ0FQQUJJTElUSUVTIAkweDA0CisjZGVmaW5lIEJDTTQzeHhfQ0hJUENPTU1PTl9DVEwJCQkweDI4CiAjZGVmaW5lIEJDTTQzeHhfQ0hJUENPTU1PTl9QTExPTkRFTEFZCQkweEIwCiAjZGVmaW5lIEJDTTQzeHhfQ0hJUENPTU1PTl9GUkVGU0VMREVMQVkJCTB4QjQKICNkZWZpbmUgQkNNNDN4eF9DSElQQ09NTU9OX1NMT1dDTEtDVEwJCTB4QjgKQEAgLTE3Miw2ICsxNzMsMzMgQEAKIC8qIFNCVE9QQ0kyIHZhbHVlcy4gKi8KICNkZWZpbmUgQkNNNDN4eF9TQlRPUENJMl9QUkVGRVRDSAkweDQKICNkZWZpbmUgQkNNNDN4eF9TQlRPUENJMl9CVVJTVAkJMHg4CisjZGVmaW5lIEJDTTQzeHhfU0JUT1BDSTJfTUVNUkVBRF9NVUxUSQkweDIwCisKKy8qIFBDSS1FIGNvcmUgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBCQ000M3h4X1BDSUVDT1JFX1JFR19BRERSICAgICAgMHgwMTMwCisjZGVmaW5lIEJDTTQzeHhfUENJRUNPUkVfUkVHX0RBVEEgICAgICAweDAxMzQKKyNkZWZpbmUgQkNNNDN4eF9QQ0lFQ09SRV9NRElPX0NUTCAgICAgIDB4MDEyOAorI2RlZmluZSBCQ000M3h4X1BDSUVDT1JFX01ESU9fREFUQSAgICAgMHgwMTJDCisKKy8qIFBDSS1FIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgQkNNNDN4eF9QQ0lFX1RMUF9XT1JLQVJPVU5EICAgIDB4MDAwNAorI2RlZmluZSBCQ000M3h4X1BDSUVfRExMUF9MSU5LQ1RMICAgICAgMHgwMTAwCisKKy8qIFBDSS1FIE1ESU8gYml0cy4gKi8KKyNkZWZpbmUgQkNNNDN4eF9QQ0lFX01ESU9fU1QgICAweDQwMDAwMDAwCisjZGVmaW5lIEJDTTQzeHhfUENJRV9NRElPX1dUICAgMHgxMDAwMDAwMAorI2RlZmluZSBCQ000M3h4X1BDSUVfTURJT19ERVYgIDIyCisjZGVmaW5lIEJDTTQzeHhfUENJRV9NRElPX1JFRyAgMTgKKyNkZWZpbmUgQkNNNDN4eF9QQ0lFX01ESU9fVEEgICAweDAwMDIwMDAwCisjZGVmaW5lIEJDTTQzeHhfUENJRV9NRElPX1RDICAgMHgwMTAwCisKKy8qIE1ESU8gZGV2aWNlcy4gKi8KKyNkZWZpbmUgQkNNNDN4eF9NRElPX1NFUkRFU19SWAkweDFGCisKKy8qIFNFUkRFUyBSWCByZWdpc3RlcnMuICovCisjZGVmaW5lIEJDTTQzeHhfU0VSREVTX1JYVElNRVIJMHgyCisjZGVmaW5lIEJDTTQzeHhfU0VSREVTX0NEUgkweDYKKyNkZWZpbmUgQkNNNDN4eF9TRVJERVNfQ0RSX0JXCTB4NwogCiAvKiBDaGlwY29tbW9uIGNhcGFiaWxpdGllcy4gKi8KICNkZWZpbmUgQkNNNDN4eF9DQVBBQklMSVRJRVNfUENUTAkJMHgwMDA0MDAwMApAQCAtMjIxLDYgKzI0OSw3IEBACiAjZGVmaW5lIEJDTTQzeHhfQ09SRUlEX1VTQjIwX0hPU1QgICAgICAgMHg4MTkKICNkZWZpbmUgQkNNNDN4eF9DT1JFSURfVVNCMjBfREVWICAgICAgICAweDgxYQogI2RlZmluZSBCQ000M3h4X0NPUkVJRF9TRElPX0hPU1QgICAgICAgIDB4ODFiCisjZGVmaW5lIEJDTTQzeHhfQ09SRUlEX1BDSUUJCTB4ODIwCiAKIC8qIENvcmUgSW5mb3JtYXRpb24gUmVnaXN0ZXJzICovCiAjZGVmaW5lIEJDTTQzeHhfQ0lSX0JBU0UJCTB4ZjAwCkBAIC0zNjUsNiArMzk0LDkgQEAKICNkZWZpbmUgQkNNNDN4eF9ERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUCTcKICNkZWZpbmUgQkNNNDN4eF9ERUZBVUxUX0xPTkdfUkVUUllfTElNSVQJNAogCisvKiBGSVhNRTogdGhlIG5leHQgbGluZSBpcyBhIGd1ZXNzIGFzIHRvIHdoYXQgdGhlIG1heGltdW0gUlNTSSB2YWx1ZSBtaWdodCBiZSAqLworI2RlZmluZSBSWF9SU1NJX01BWAkJCQk2MAorCiAvKiBNYXggc2l6ZSBvZiBhIHNlY3VyaXR5IGtleSAqLwogI2RlZmluZSBCQ000M3h4X1NFQ19LRVlTSVpFCQkJMTYKIC8qIFNlY3VyaXR5IGFsZ29yaXRobXMuICovCkBAIC03ODcsNyArODE5LDcgQEAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXNyX3Rhc2tsZXQ7CiAKIAkvKiBQZXJpb2RpYyB0YXNrcyAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBwZXJpb2RpY193b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcGVyaW9kaWNfd29yazsKIAl1bnNpZ25lZCBpbnQgcGVyaW9kaWNfc3RhdGU7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzdGFydF93b3JrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5jCmluZGV4IDc2ZTNhZWQuLjk3OGVkMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmMKQEAgLTcwNSwxMSArNzA1LDMwIEBACiAJc3RydWN0IGJjbTQzeHhfZG1hcmluZyAqcmluZzsKIAlpbnQgZXJyID0gLUVOT01FTTsKIAlpbnQgZG1hNjQgPSAwOwotCXUzMiBzYnRtc3RhdGVoaTsKKwl1NjQgbWFzayA9IGJjbTQzeHhfZ2V0X3N1cHBvcnRlZF9kbWFfbWFzayhiY20pOworCWludCBub2JpdHM7CiAKLQlzYnRtc3RhdGVoaSA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9DSVJfU0JUTVNUQVRFSElHSCk7Ci0JaWYgKHNidG1zdGF0ZWhpICYgQkNNNDN4eF9TQlRNU1RBVEVISUdIX0RNQTY0QklUKQorCWlmIChtYXNrID09IERNQV82NEJJVF9NQVNLKSB7CiAJCWRtYTY0ID0gMTsKKwkJbm9iaXRzID0gNjQ7CisJfSBlbHNlIGlmIChtYXNrID09IERNQV8zMkJJVF9NQVNLKQorCQlub2JpdHMgPSAzMjsKKwllbHNlCisJCW5vYml0cyA9IDMwOworCWVyciA9IHBjaV9zZXRfZG1hX21hc2soYmNtLT5wY2lfZGV2LCBtYXNrKTsKKwllcnIgfD0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGJjbS0+cGNpX2RldiwgbWFzayk7CisJaWYgKGVycikgeworI2lmZGVmIENPTkZJR19CQ000M1hYX1BJTworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiRE1BIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuIgorCQkJCQkiIEZhbGxpbmcgYmFjayB0byBQSU8uXG4iKTsKKwkJYmNtLT5fX3VzaW5nX3BpbyA9IDE7CisJCXJldHVybiAtRU5PU1lTOworI2Vsc2UKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRkFUQUw6IERNQSBub3Qgc3VwcG9ydGVkIGFuZCBQSU8gbm90IGNvbmZpZ3VyZWQuICIKKwkJCQkgICAgIlBsZWFzZSByZWNvbXBpbGUgdGhlIGRyaXZlciB3aXRoIFBJTyBzdXBwb3J0LlxuIik7CisJCXJldHVybiAtRU5PREVWOworI2VuZGlmIC8qIENPTkZJR19CQ000M1hYX1BJTyAqLworCX0KIAogCS8qIHNldHVwIFRYIERNQSBjaGFubmVscy4gKi8KIAlyaW5nID0gYmNtNDN4eF9zZXR1cF9kbWFyaW5nKGJjbSwgMCwgMSwgZG1hNjQpOwpAQCAtNzU1LDggKzc3NCw3IEBACiAJCWRtYS0+cnhfcmluZzMgPSByaW5nOwogCX0KIAotCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiJXMgRE1BIGluaXRpYWxpemVkXG4iLAotCQkJZG1hNjQgPyAiNjQtYml0IiA6ICIzMi1iaXQiKTsKKwlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVkLWJpdCBETUEgaW5pdGlhbGl6ZWRcbiIsIG5vYml0cyk7CiAJZXJyID0gMDsKIG91dDoKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5oCmluZGV4IGUwNGJjYWQuLmQxMTA1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kbWEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCkBAIC0zMTQsNiArMzE1LDIzIEBACiAJCSAgIHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIpOwogdm9pZCBiY200M3h4X2RtYV9yeChzdHJ1Y3QgYmNtNDN4eF9kbWFyaW5nICpyaW5nKTsKIAorLyogSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZG1hIG1hc2sgZm9yIHRoaXMgZGV2aWNlLiAqLworc3RhdGljIGlubGluZQordTY0IGJjbTQzeHhfZ2V0X3N1cHBvcnRlZF9kbWFfbWFzayhzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCit7CisJaW50IGRtYTY0ID0gYmNtNDN4eF9yZWFkMzIoYmNtLCBCQ000M3h4X0NJUl9TQlRNU1RBVEVISUdIKSAmCisJCQkJICAgQkNNNDN4eF9TQlRNU1RBVEVISUdIX0RNQTY0QklUOworCXUxNiBtbWlvX2Jhc2UgPSBiY200M3h4X2RtYWNvbnRyb2xsZXJfYmFzZShkbWE2NCwgMCk7CisJdTMyIG1hc2sgPSBCQ000M3h4X0RNQTMyX1RYQUREUkVYVF9NQVNLOworCisJaWYgKGRtYTY0KQorCQlyZXR1cm4gRE1BXzY0QklUX01BU0s7CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgbW1pb19iYXNlICsgQkNNNDN4eF9ETUEzMl9UWENUTCwgbWFzayk7CisJaWYgKGJjbTQzeHhfcmVhZDMyKGJjbSwgbW1pb19iYXNlICsgQkNNNDN4eF9ETUEzMl9UWENUTCkgJiBtYXNrKQorCQlyZXR1cm4gRE1BXzMyQklUX01BU0s7CisJcmV0dXJuIERNQV8zMEJJVF9NQVNLOworfQorCiAjZWxzZSAvKiBDT05GSUdfQkNNNDNYWF9ETUEgKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2xlZHMuYwppbmRleCBjM2Y5MGM4Li43ZDM4M2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9sZWRzLmMKQEAgLTE4OSwyMCArMTg5LDI0IEBACiAJCWNhc2UgQkNNNDN4eF9MRURfSU5BQ1RJVkU6CiAJCQljb250aW51ZTsKIAkJY2FzZSBCQ000M3h4X0xFRF9PRkY6CisJCWNhc2UgQkNNNDN4eF9MRURfQkNNNDMwM18zOgogCQkJYnJlYWs7CiAJCWNhc2UgQkNNNDN4eF9MRURfT046CiAJCQl0dXJuX29uID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIEJDTTQzeHhfTEVEX0FDVElWSVRZOgorCQljYXNlIEJDTTQzeHhfTEVEX0JDTTQzMDNfMDoKIAkJCXR1cm5fb24gPSBhY3Rpdml0eTsKIAkJCWJyZWFrOwogCQljYXNlIEJDTTQzeHhfTEVEX1JBRElPX0FMTDoKIAkJCXR1cm5fb24gPSByYWRpby0+ZW5hYmxlZDsKIAkJCWJyZWFrOwogCQljYXNlIEJDTTQzeHhfTEVEX1JBRElPX0E6CisJCWNhc2UgQkNNNDN4eF9MRURfQkNNNDMwM18yOgogCQkJdHVybl9vbiA9IChyYWRpby0+ZW5hYmxlZCAmJiBwaHktPnR5cGUgPT0gQkNNNDN4eF9QSFlUWVBFX0EpOwogCQkJYnJlYWs7CiAJCWNhc2UgQkNNNDN4eF9MRURfUkFESU9fQjoKKwkJY2FzZSBCQ000M3h4X0xFRF9CQ000MzAzXzE6CiAJCQl0dXJuX29uID0gKHJhZGlvLT5lbmFibGVkICYmCiAJCQkJICAgKHBoeS0+dHlwZSA9PSBCQ000M3h4X1BIWVRZUEVfQiB8fAogCQkJCSAgICBwaHktPnR5cGUgPT0gQkNNNDN4eF9QSFlUWVBFX0cpKTsKQEAgLTI0Miw3ICsyNDYsNyBAQAogCQkJLy9UT0RPCiAJCQlicmVhazsKIAkJY2FzZSBCQ000M3h4X0xFRF9BU1NPQzoKLQkJCWlmIChiY20tPnNvZnRtYWMtPmFzc29jaWF0ZWQpCisJCQlpZiAoYmNtLT5zb2Z0bWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCkKIAkJCQl0dXJuX29uID0gMTsKIAkJCWJyZWFrOwogI2lmZGVmIENPTkZJR19CQ000M1hYX0RFQlVHCkBAIC0yNTcsNyArMjYxLDggQEAKIAkJCWNvbnRpbnVlOwogI2VuZGlmIC8qIENPTkZJR19CQ000M1hYX0RFQlVHICovCiAJCWRlZmF1bHQ6Ci0JCQlhc3NlcnQoMCk7CisJCQlkcHJpbnRrbChLRVJOX0lORk8gUEZYICJCYWQgdmFsdWUgaW4gbGVkc191cGRhdGUsIgorCQkJCSIgbGVkLT5iZWhhdmlvdXI6IDB4JXhcbiIsIGxlZC0+YmVoYXZpb3VyKTsKIAkJfTsKIAogCQlpZiAobGVkLT5hY3RpdmVsb3cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2xlZHMuaAppbmRleCBkMzcxNmNmLi44MTFlMTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9sZWRzLmgKQEAgLTQ2LDYgKzQ2LDEyIEBACiAJQkNNNDN4eF9MRURfVEVTVF9CTElOS1NMT1csCiAJQkNNNDN4eF9MRURfVEVTVF9CTElOS01FRElVTSwKIAlCQ000M3h4X0xFRF9URVNUX0JMSU5LRkFTVCwKKworCS8qIE1pc2MgdmFsdWVzIGZvciBCQ000MzAzICovCisJQkNNNDN4eF9MRURfQkNNNDMwM18wID0gMHgyQiwKKwlCQ000M3h4X0xFRF9CQ000MzAzXzEgPSAweDc4LAorCUJDTTQzeHhfTEVEX0JDTTQzMDNfMiA9IDB4MkUsCisJQkNNNDN4eF9MRURfQkNNNDMwM18zID0gMHgxOSwKIH07CiAKIGludCBiY200M3h4X2xlZHNfaW5pdChzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9tYWluLmMKaW5kZXggYmFkMzQ1Mi4uMmVjMmU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jCkBAIC0xMzAsNiArMTMwLDEwIEBACiAJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKIAkvKiBCcm9hZGNvbSA0MzA3IDgwMi4xMWIgKi8KIAl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDMwNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCS8qIEJyb2FkY29tIDQzMTEgODAyLjExKGEpL2IvZyAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJLyogQnJvYWRjb20gNDMxMiA4MDIuMTFhL2IvZyAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCiAJLyogQnJvYWRjb20gNDMxOCA4MDIuMTFiL2cgKi8KIAl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDMxOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAogCS8qIEJyb2FkY29tIDQzMTkgODAyLjExYS9iL2cgKi8KQEAgLTc0Niw3ICs3NTAsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2N0bHJlZzsKIAlzcHJvbWN0bCB8PSAweDEwOyAvKiBTUFJPTSBXUklURSBlbmFibGUuICovCi0JYmNtNDN4eF9wY2lfd3JpdGVfY29uZmlnMzIoYmNtLCBCQ000M3h4X1BDSUNGR19TUFJPTUNUTCwgc3Byb21jdGwpOworCWVyciA9IGJjbTQzeHhfcGNpX3dyaXRlX2NvbmZpZzMyKGJjbSwgQkNNNDN4eF9QQ0lDRkdfU1BST01DVEwsIHNwcm9tY3RsKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jdGxyZWc7CiAJLyogV2UgbXVzdCBidXJuIGxvdHMgb2YgQ1BVIGN5Y2xlcyBoZXJlLCBidXQgdGhhdCBkb2VzIG5vdApAQCAtNzY4LDcgKzc3Miw3IEBACiAJCW1kZWxheSgyMCk7CiAJfQogCXNwcm9tY3RsICY9IH4weDEwOyAvKiBTUFJPTSBXUklURSBlbmFibGUuICovCi0JYmNtNDN4eF9wY2lfd3JpdGVfY29uZmlnMzIoYmNtLCBCQ000M3h4X1BDSUNGR19TUFJPTUNUTCwgc3Byb21jdGwpOworCWVyciA9IGJjbTQzeHhfcGNpX3dyaXRlX2NvbmZpZzMyKGJjbSwgQkNNNDN4eF9QQ0lDRkdfU1BST01DVEwsIHNwcm9tY3RsKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jdGxyZWc7CiAJbWRlbGF5KDUwMCk7CkBAIC0xNDYzLDYgKzE0NjcsMjMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGRyYWluX3R4c3RhdHVzX3F1ZXVlKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKK3sKKwl1MzIgZHVtbXk7CisKKwlpZiAoYmNtLT5jdXJyZW50X2NvcmUtPnJldiA8IDUpCisJCXJldHVybjsKKwkvKiBSZWFkIGFsbCBlbnRyaWVzIGZyb20gdGhlIG1pY3JvY29kZSBUWHN0YXR1cyBGSUZPCisJICogYW5kIHRocm93IHRoZW0gYXdheS4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlkdW1teSA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9NTUlPX1hNSVRTVEFUXzApOworCQlpZiAoIWR1bW15KQorCQkJYnJlYWs7CisJCWR1bW15ID0gYmNtNDN4eF9yZWFkMzIoYmNtLCBCQ000M3h4X01NSU9fWE1JVFNUQVRfMSk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBiY200M3h4X2dlbmVyYXRlX25vaXNlX3NhbXBsZShzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCiB7CiAJYmNtNDN4eF9zaG1fd3JpdGUxNihiY20sIEJDTTQzeHhfU0hNX1NIQVJFRCwgMHg0MDgsIDB4N0Y3Rik7CkBAIC0yNTgzLDggKzI2MDQsOSBAQAogCS8qIGZldGNoIHNiX2lkX2hpIGZyb20gY29yZSBpbmZvcm1hdGlvbiByZWdpc3RlcnMgKi8KIAlzYl9pZF9oaSA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9DSVJfU0JfSURfSEkpOwogCi0JY29yZV9pZCA9IChzYl9pZF9oaSAmIDB4RkZGMCkgPj4gNDsKLQljb3JlX3JldiA9IChzYl9pZF9oaSAmIDB4Rik7CisJY29yZV9pZCA9IChzYl9pZF9oaSAmIDB4OEZGMCkgPj4gNDsKKwljb3JlX3JldiA9IChzYl9pZF9oaSAmIDB4NzAwMCkgPj4gODsKKwljb3JlX3JldiB8PSAoc2JfaWRfaGkgJiAweEYpOwogCWNvcmVfdmVuZG9yID0gKHNiX2lkX2hpICYgMHhGRkZGMDAwMCkgPj4gMTY7CiAKIAkvKiBpZiBwcmVzZW50LCBjaGlwY29tbW9uIGlzIGFsd2F5cyBjb3JlIDA7IHJlYWQgdGhlIGNoaXBpZCBmcm9tIGl0ICovCkBAIC0yNjYyLDE0ICsyNjg0LDEwIEBACiAJCWJjbS0+Y2hpcF9pZCwgYmNtLT5jaGlwX3Jldik7CiAJZHByaW50ayhLRVJOX0lORk8gUEZYICJOdW1iZXIgb2YgY29yZXM6ICVkXG4iLCBjb3JlX2NvdW50KTsKIAlpZiAoYmNtLT5jb3JlX2NoaXBjb21tb24uYXZhaWxhYmxlKSB7Ci0JCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQ29yZSAwOiBJRCAweCV4LCByZXYgMHgleCwgdmVuZG9yIDB4JXgsICVzXG4iLAotCQkJY29yZV9pZCwgY29yZV9yZXYsIGNvcmVfdmVuZG9yLAotCQkJYmNtNDN4eF9jb3JlX2VuYWJsZWQoYmNtKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCX0KLQotCWlmIChiY20tPmNvcmVfY2hpcGNvbW1vbi5hdmFpbGFibGUpCisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQ29yZSAwOiBJRCAweCV4LCByZXYgMHgleCwgdmVuZG9yIDB4JXhcbiIsCisJCQljb3JlX2lkLCBjb3JlX3JldiwgY29yZV92ZW5kb3IpOwogCQljdXJyZW50X2NvcmUgPSAxOwotCWVsc2UKKwl9IGVsc2UKIAkJY3VycmVudF9jb3JlID0gMDsKIAlmb3IgKCA7IGN1cnJlbnRfY29yZSA8IGNvcmVfY291bnQ7IGN1cnJlbnRfY29yZSsrKSB7CiAJCXN0cnVjdCBiY200M3h4X2NvcmVpbmZvICpjb3JlOwpAQCAtMjY4NywxMyArMjcwNSwxMyBAQAogCQljb3JlX3JldiA9IChzYl9pZF9oaSAmIDB4Rik7CiAJCWNvcmVfdmVuZG9yID0gKHNiX2lkX2hpICYgMHhGRkZGMDAwMCkgPj4gMTY7CiAKLQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJDb3JlICVkOiBJRCAweCV4LCByZXYgMHgleCwgdmVuZG9yIDB4JXgsICVzXG4iLAotCQkJY3VycmVudF9jb3JlLCBjb3JlX2lkLCBjb3JlX3JldiwgY29yZV92ZW5kb3IsCi0JCQliY200M3h4X2NvcmVfZW5hYmxlZChiY20pID8gImVuYWJsZWQiIDogImRpc2FibGVkIiApOworCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNvcmUgJWQ6IElEIDB4JXgsIHJldiAweCV4LCB2ZW5kb3IgMHgleFxuIiwKKwkJCWN1cnJlbnRfY29yZSwgY29yZV9pZCwgY29yZV9yZXYsIGNvcmVfdmVuZG9yKTsKIAogCQljb3JlID0gTlVMTDsKIAkJc3dpdGNoIChjb3JlX2lkKSB7CiAJCWNhc2UgQkNNNDN4eF9DT1JFSURfUENJOgorCQljYXNlIEJDTTQzeHhfQ09SRUlEX1BDSUU6CiAJCQljb3JlID0gJmJjbS0+Y29yZV9wY2k7CiAJCQlpZiAoY29yZS0+YXZhaWxhYmxlKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIk11bHRpcGxlIFBDSSBjb3JlcyBmb3VuZC5cbiIpOwpAQCAtMjczMiwxMiArMjc1MCwxMiBAQAogCQkJY2FzZSA2OgogCQkJY2FzZSA3OgogCQkJY2FzZSA5OgorCQkJY2FzZSAxMDoKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXJyb3I6IFVuc3VwcG9ydGVkIDgwMjExIGNvcmUgcmV2aXNpb24gJXVcbiIsCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCQkgICAgICAgIlVuc3VwcG9ydGVkIDgwMjExIGNvcmUgcmV2aXNpb24gJXVcbiIsCiAJCQkJICAgICAgIGNvcmVfcmV2KTsKLQkJCQllcnIgPSAtRU5PREVWOwotCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJYmNtLT5ucl84MDIxMV9hdmFpbGFibGUrKzsKIAkJCWNvcmUtPnByaXYgPSBleHRfODAyMTE7CkBAIC0yODUxLDE2ICsyODY5LDExIEBACiAJdTMyIHNiaW1jb25maWdsb3c7CiAJdTggbGltaXQ7CiAKLQlpZiAoYmNtLT5jaGlwX3JldiA8IDUpIHsKKwlpZiAoYmNtLT5jb3JlX3BjaS5yZXYgPD0gNSAmJiBiY20tPmNvcmVfcGNpLmlkICE9IEJDTTQzeHhfQ09SRUlEX1BDSUUpIHsKIAkJc2JpbWNvbmZpZ2xvdyA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9DSVJfU0JJTUNPTkZJR0xPVyk7CiAJCXNiaW1jb25maWdsb3cgJj0gfiBCQ000M3h4X1NCSU1DT05GSUdMT1dfUkVRVUVTVF9UT1VUX01BU0s7CiAJCXNiaW1jb25maWdsb3cgJj0gfiBCQ000M3h4X1NCSU1DT05GSUdMT1dfU0VSVklDRV9UT1VUX01BU0s7Ci0JCWlmIChiY20tPmJ1c3R5cGUgPT0gQkNNNDN4eF9CVVNUWVBFX1BDSSkKLQkJCXNiaW1jb25maWdsb3cgfD0gMHgzMjsKLQkJZWxzZSBpZiAoYmNtLT5idXN0eXBlID09IEJDTTQzeHhfQlVTVFlQRV9TQikKLQkJCXNiaW1jb25maWdsb3cgfD0gMHg1MzsKLQkJZWxzZQotCQkJYXNzZXJ0KDApOworCQlzYmltY29uZmlnbG93IHw9IDB4MzI7CiAJCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfQ0lSX1NCSU1DT05GSUdMT1csIHNiaW1jb25maWdsb3cpOwogCX0KIApAQCAtMjkyNSwxMCArMjkzOCwxMyBAQAogCQliY200M3h4X3dyaXRlMTYoYmNtLCAweDA0M0MsIDB4MDAwQyk7CiAKIAlpZiAoYWN0aXZlX3dsY29yZSkgewotCQlpZiAoYmNtNDN4eF91c2luZ19waW8oYmNtKSkKKwkJaWYgKGJjbTQzeHhfdXNpbmdfcGlvKGJjbSkpIHsKIAkJCWVyciA9IGJjbTQzeHhfcGlvX2luaXQoYmNtKTsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJZXJyID0gYmNtNDN4eF9kbWFfaW5pdChiY20pOworCQkJaWYgKGVyciA9PSAtRU5PU1lTKQorCQkJCWVyciA9IGJjbTQzeHhfcGlvX2luaXQoYmNtKTsKKwkJfQogCQlpZiAoZXJyKQogCQkJZ290byBlcnJfY2hpcF9jbGVhbnVwOwogCX0KQEAgLTI5ODQsMjIgKzMwMDAsNjQgQEAKIAogc3RhdGljIGludCBiY200M3h4X3BjaWNvcmVfY29tbWl0X3NldHRpbmdzKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKLQlpbnQgZXJyOwotCXN0cnVjdCBiY200M3h4X2NvcmVpbmZvICpvbGRfY29yZTsKKwlpbnQgZXJyID0gMDsKIAotCW9sZF9jb3JlID0gYmNtLT5jdXJyZW50X2NvcmU7Ci0JZXJyID0gYmNtNDN4eF9zd2l0Y2hfY29yZShiY20sICZiY20tPmNvcmVfcGNpKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKKwliY20tPmlycV9zYXZlZHN0YXRlID0gYmNtNDN4eF9pbnRlcnJ1cHRfZGlzYWJsZShiY20sIEJDTTQzeHhfSVJRX0FMTCk7CiAKLQliY200M3h4X3BjaWNvcmVfYnJvYWRjYXN0X3ZhbHVlKGJjbSwgMHhmZDgsIDB4MDAwMDAwMDApOworCWlmIChiY20tPmNvcmVfY2hpcGNvbW1vbi5hdmFpbGFibGUpIHsKKwkJZXJyID0gYmNtNDN4eF9zd2l0Y2hfY29yZShiY20sICZiY20tPmNvcmVfY2hpcGNvbW1vbik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKIAotCWJjbTQzeHhfc3dpdGNoX2NvcmUoYmNtLCBvbGRfY29yZSk7Ci0JYXNzZXJ0KGVyciA9PSAwKTsKKwkJYmNtNDN4eF9wY2ljb3JlX2Jyb2FkY2FzdF92YWx1ZShiY20sIDB4ZmQ4LCAweDAwMDAwMDAwKTsKKworCQkvKiB0aGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgd2hlbiBhIFBDSSBjb3JlIGlzIG1hcHBlZCAqLworCQllcnIgPSBiY200M3h4X3N3aXRjaF9jb3JlKGJjbSwgJmJjbS0+Y29yZV9wY2kpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfSBlbHNlCisJCWJjbTQzeHhfcGNpY29yZV9icm9hZGNhc3RfdmFsdWUoYmNtLCAweGZkOCwgMHgwMDAwMDAwMCk7CisKKwliY200M3h4X2ludGVycnVwdF9lbmFibGUoYmNtLCBiY20tPmlycV9zYXZlZHN0YXRlKTsKKwogb3V0OgogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB1MzIgYmNtNDN4eF9wY2llX3JlZ19yZWFkKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgdTMyIGFkZHJlc3MpCit7CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9SRUdfQUREUiwgYWRkcmVzcyk7CisJcmV0dXJuIGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9SRUdfREFUQSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTQzeHhfcGNpZV9yZWdfd3JpdGUoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtLCB1MzIgYWRkcmVzcywKKwkJCQkgICAgdTMyIGRhdGEpCit7CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9SRUdfQUREUiwgYWRkcmVzcyk7CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9SRUdfREFUQSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTQzeHhfcGNpZV9tZGlvX3dyaXRlKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgdTggZGV2LCB1OCByZWcsCisJCQkJICAgIHUxNiBkYXRhKQoreworCWludCBpOworCisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9NRElPX0NUTCwgMHgwMDgyKTsKKwliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X1BDSUVDT1JFX01ESU9fREFUQSwgQkNNNDN4eF9QQ0lFX01ESU9fU1QgfAorCQkJQkNNNDN4eF9QQ0lFX01ESU9fV1QgfCAoZGV2IDw8IEJDTTQzeHhfUENJRV9NRElPX0RFVikgfAorCQkJKHJlZyA8PCBCQ000M3h4X1BDSUVfTURJT19SRUcpIHwgQkNNNDN4eF9QQ0lFX01ESU9fVEEgfAorCQkJZGF0YSk7CisJdWRlbGF5KDEwKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWlmIChiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfUENJRUNPUkVfTURJT19DVEwpICYKKwkJICAgIEJDTTQzeHhfUENJRV9NRElPX1RDKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lFQ09SRV9NRElPX0NUTCwgMCk7Cit9CisKIC8qIE1ha2UgYW4gSS9PIENvcmUgdXNhYmxlLiAiY29yZV9tYXNrIiBpcyB0aGUgYml0bWFzayBvZiB0aGUgY29yZXMgdG8gZW5hYmxlLgogICogVG8gZW5hYmxlIGNvcmUgMCwgcGFzcyBhIGNvcmVfbWFzayBvZiAxPDwwCiAgKi8KQEAgLTMwMTksNyArMzA3Nyw4IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlpZiAoYmNtLT5jb3JlX3BjaS5yZXYgPCA2KSB7CisJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPCA2IHx8CisJCWJjbS0+Y3VycmVudF9jb3JlLT5pZCA9PSBCQ000M3h4X0NPUkVJRF9QQ0kpIHsKIAkJdmFsdWUgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0lSX1NCSU5UVkVDKTsKIAkJdmFsdWUgfD0gKDEgPDwgYmFja3BsYW5lX2ZsYWdfbnIpOwogCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NJUl9TQklOVFZFQywgdmFsdWUpOwpAQCAtMzAzNywyMSArMzA5Niw0NiBAQAogCQl9CiAJfQogCi0JdmFsdWUgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfUENJQ09SRV9TQlRPUENJMik7Ci0JdmFsdWUgfD0gQkNNNDN4eF9TQlRPUENJMl9QUkVGRVRDSCB8IEJDTTQzeHhfU0JUT1BDSTJfQlVSU1Q7Ci0JYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9QQ0lDT1JFX1NCVE9QQ0kyLCB2YWx1ZSk7CisJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5pZCA9PSBCQ000M3h4X0NPUkVJRF9QQ0kpIHsKKwkJdmFsdWUgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfUENJQ09SRV9TQlRPUENJMik7CisJCXZhbHVlIHw9IEJDTTQzeHhfU0JUT1BDSTJfUFJFRkVUQ0ggfCBCQ000M3h4X1NCVE9QQ0kyX0JVUlNUOworCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X1BDSUNPUkVfU0JUT1BDSTIsIHZhbHVlKTsKIAotCWlmIChiY20tPmNvcmVfcGNpLnJldiA8IDUpIHsKLQkJdmFsdWUgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0lSX1NCSU1DT05GSUdMT1cpOwotCQl2YWx1ZSB8PSAoMiA8PCBCQ000M3h4X1NCSU1DT05GSUdMT1dfU0VSVklDRV9UT1VUX1NISUZUKQotCQkJICYgQkNNNDN4eF9TQklNQ09ORklHTE9XX1NFUlZJQ0VfVE9VVF9NQVNLOwotCQl2YWx1ZSB8PSAoMyA8PCBCQ000M3h4X1NCSU1DT05GSUdMT1dfUkVRVUVTVF9UT1VUX1NISUZUKQotCQkJICYgQkNNNDN4eF9TQklNQ09ORklHTE9XX1JFUVVFU1RfVE9VVF9NQVNLOwotCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NJUl9TQklNQ09ORklHTE9XLCB2YWx1ZSk7Ci0JCWVyciA9IGJjbTQzeHhfcGNpY29yZV9jb21taXRfc2V0dGluZ3MoYmNtKTsKLQkJYXNzZXJ0KGVyciA9PSAwKTsKKwkJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPCA1KSB7CisJCQl2YWx1ZSA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9DSVJfU0JJTUNPTkZJR0xPVyk7CisJCQl2YWx1ZSB8PSAoMiA8PCBCQ000M3h4X1NCSU1DT05GSUdMT1dfU0VSVklDRV9UT1VUX1NISUZUKQorCQkJCSAmIEJDTTQzeHhfU0JJTUNPTkZJR0xPV19TRVJWSUNFX1RPVVRfTUFTSzsKKwkJCXZhbHVlIHw9ICgzIDw8IEJDTTQzeHhfU0JJTUNPTkZJR0xPV19SRVFVRVNUX1RPVVRfU0hJRlQpCisJCQkJICYgQkNNNDN4eF9TQklNQ09ORklHTE9XX1JFUVVFU1RfVE9VVF9NQVNLOworCQkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSVJfU0JJTUNPTkZJR0xPVywgdmFsdWUpOworCQkJZXJyID0gYmNtNDN4eF9wY2ljb3JlX2NvbW1pdF9zZXR0aW5ncyhiY20pOworCQkJYXNzZXJ0KGVyciA9PSAwKTsKKwkJfSBlbHNlIGlmIChiY20tPmN1cnJlbnRfY29yZS0+cmV2ID49IDExKSB7CisJCQl2YWx1ZSA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9QQ0lDT1JFX1NCVE9QQ0kyKTsKKwkJCXZhbHVlIHw9IEJDTTQzeHhfU0JUT1BDSTJfTUVNUkVBRF9NVUxUSTsKKwkJCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfUENJQ09SRV9TQlRPUENJMiwgdmFsdWUpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPT0gMCB8fCBiY20tPmN1cnJlbnRfY29yZS0+cmV2ID09IDEpIHsKKwkJCXZhbHVlID0gYmNtNDN4eF9wY2llX3JlZ19yZWFkKGJjbSwgQkNNNDN4eF9QQ0lFX1RMUF9XT1JLQVJPVU5EKTsKKwkJCXZhbHVlIHw9IDB4ODsKKwkJCWJjbTQzeHhfcGNpZV9yZWdfd3JpdGUoYmNtLCBCQ000M3h4X1BDSUVfVExQX1dPUktBUk9VTkQsCisJCQkJCSAgICAgICB2YWx1ZSk7CisJCX0KKwkJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPT0gMCkgeworCQkJYmNtNDN4eF9wY2llX21kaW9fd3JpdGUoYmNtLCBCQ000M3h4X01ESU9fU0VSREVTX1JYLAorCQkJCQkJQkNNNDN4eF9TRVJERVNfUlhUSU1FUiwgMHg4MTI4KTsKKwkJCWJjbTQzeHhfcGNpZV9tZGlvX3dyaXRlKGJjbSwgQkNNNDN4eF9NRElPX1NFUkRFU19SWCwKKwkJCQkJCUJDTTQzeHhfU0VSREVTX0NEUiwgMHgwMTAwKTsKKwkJCWJjbTQzeHhfcGNpZV9tZGlvX3dyaXRlKGJjbSwgQkNNNDN4eF9NRElPX1NFUkRFU19SWCwKKwkJCQkJCUJDTTQzeHhfU0VSREVTX0NEUl9CVywgMHgxNDY2KTsKKwkJfSBlbHNlIGlmIChiY20tPmN1cnJlbnRfY29yZS0+cmV2ID09IDEpIHsKKwkJCXZhbHVlID0gYmNtNDN4eF9wY2llX3JlZ19yZWFkKGJjbSwgQkNNNDN4eF9QQ0lFX0RMTFBfTElOS0NUTCk7CisJCQl2YWx1ZSB8PSAweDQwOworCQkJYmNtNDN4eF9wY2llX3JlZ193cml0ZShiY20sIEJDTTQzeHhfUENJRV9ETExQX0xJTktDVEwsCisJCQkJCSAgICAgICB2YWx1ZSk7CisJCX0KIAl9Ci0KIG91dF9zd2l0Y2hfYmFjazoKIAllcnIgPSBiY200M3h4X3N3aXRjaF9jb3JlKGJjbSwgb2xkX2NvcmUpOwogb3V0OgpAQCAtMzEyMCw1NyArMzIwNCw0MyBAQAogCiBzdGF0aWMgdm9pZCBkb19wZXJpb2RpY193b3JrKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKLQl1bnNpZ25lZCBpbnQgc3RhdGU7Ci0KLQlzdGF0ZSA9IGJjbS0+cGVyaW9kaWNfc3RhdGU7Ci0JaWYgKHN0YXRlICUgOCA9PSAwKQorCWlmIChiY20tPnBlcmlvZGljX3N0YXRlICUgOCA9PSAwKQogCQliY200M3h4X3BlcmlvZGljX2V2ZXJ5MTIwc2VjKGJjbSk7Ci0JaWYgKHN0YXRlICUgNCA9PSAwKQorCWlmIChiY20tPnBlcmlvZGljX3N0YXRlICUgNCA9PSAwKQogCQliY200M3h4X3BlcmlvZGljX2V2ZXJ5NjBzZWMoYmNtKTsKLQlpZiAoc3RhdGUgJSAyID09IDApCisJaWYgKGJjbS0+cGVyaW9kaWNfc3RhdGUgJSAyID09IDApCiAJCWJjbTQzeHhfcGVyaW9kaWNfZXZlcnkzMHNlYyhiY20pOwotCWlmIChzdGF0ZSAlIDEgPT0gMCkKLQkJYmNtNDN4eF9wZXJpb2RpY19ldmVyeTE1c2VjKGJjbSk7Ci0JYmNtLT5wZXJpb2RpY19zdGF0ZSA9IHN0YXRlICsgMTsKKwliY200M3h4X3BlcmlvZGljX2V2ZXJ5MTVzZWMoYmNtKTsKIAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYmNtLT5wZXJpb2RpY193b3JrLCBIWiAqIDE1KTsKIH0KIAotLyogRXN0aW1hdGUgYSAiQmFkbmVzcyIgdmFsdWUgYmFzZWQgb24gdGhlIHBlcmlvZGljIHdvcmsKLSAqIHN0YXRlLW1hY2hpbmUgc3RhdGUuICJCYWRuZXNzIiBpcyB3b3JzZSAoYmlnZ2VyKSwgaWYgdGhlCi0gKiBwZXJpb2RpYyB3b3JrIHdpbGwgdGFrZSBsb25nZXIuCi0gKi8KLXN0YXRpYyBpbnQgZXN0aW1hdGVfcGVyaW9kaWNfd29ya19iYWRuZXNzKHVuc2lnbmVkIGludCBzdGF0ZSkKK3N0YXRpYyB2b2lkIGJjbTQzeHhfcGVyaW9kaWNfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlpbnQgYmFkbmVzcyA9IDA7Ci0KLQlpZiAoc3RhdGUgJSA4ID09IDApIC8qIGV2ZXJ5IDEyMCBzZWMgKi8KLQkJYmFkbmVzcyArPSAxMDsKLQlpZiAoc3RhdGUgJSA0ID09IDApIC8qIGV2ZXJ5IDYwIHNlYyAqLwotCQliYWRuZXNzICs9IDU7Ci0JaWYgKHN0YXRlICUgMiA9PSAwKSAvKiBldmVyeSAzMCBzZWMgKi8KLQkJYmFkbmVzcyArPSAxOwotCWlmIChzdGF0ZSAlIDEgPT0gMCkgLyogZXZlcnkgMTUgc2VjICovCi0JCWJhZG5lc3MgKz0gMTsKLQotI2RlZmluZSBCQURORVNTX0xJTUlUCTQKLQlyZXR1cm4gYmFkbmVzczsKLX0KLQotc3RhdGljIHZvaWQgYmNtNDN4eF9wZXJpb2RpY193b3JrX2hhbmRsZXIodm9pZCAqZCkKLXsKLQlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBkOworCXN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlLCBwZXJpb2RpY193b3JrLndvcmspOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gYmNtLT5uZXRfZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHNhdmVkaXJxcyA9IDA7Ci0JaW50IGJhZG5lc3M7CisJdW5zaWduZWQgbG9uZyBvcmlnX3RyYW5zX3N0YXJ0ID0gMDsKIAotCWJhZG5lc3MgPSBlc3RpbWF0ZV9wZXJpb2RpY193b3JrX2JhZG5lc3MoYmNtLT5wZXJpb2RpY19zdGF0ZSk7Ci0JaWYgKGJhZG5lc3MgPiBCQURORVNTX0xJTUlUKSB7CisJbXV0ZXhfbG9jaygmYmNtLT5tdXRleCk7CisJaWYgKHVubGlrZWx5KGJjbS0+cGVyaW9kaWNfc3RhdGUgJSA0ID09IDApKSB7CiAJCS8qIFBlcmlvZGljIHdvcmsgd2lsbCB0YWtlIGEgbG9uZyB0aW1lLCBzbyB3ZSB3YW50IGl0IHRvCiAJCSAqIGJlIHByZWVtdGlibGUuCiAJCSAqLwotCQltdXRleF9sb2NrKCZiY20tPm11dGV4KTsKLQkJbmV0aWZfdHhfZGlzYWJsZShiY20tPm5ldF9kZXYpOworCisJCW5ldGlmX3R4X2xvY2tfYmgobmV0X2Rldik7CisJCS8qIFdlIG11c3QgZmFrZSBhIHN0YXJ0ZWQgdHJhbnNtaXNzaW9uIGhlcmUsIGFzIHdlIGFyZSBnb2luZyB0bworCQkgKiBkaXNhYmxlIFRYLiBJZiB3ZSB3b3VsZG4ndCBmYWtlIGEgVFgsIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvCisJCSAqIHRyaWdnZXIgdGhlIG5ldGRldiB3YXRjaGRvZywgaWYgdGhlIGxhc3QgcmVhbCBUWCBpcyBhbHJlYWR5CisJCSAqIHNvbWUgdGltZSBvbiB0aGUgcGFzdCAoc2xpZ2h0bHkgbGVzcyB0aGFuIDVzZWNzKQorCQkgKi8KKwkJb3JpZ190cmFuc19zdGFydCA9IG5ldF9kZXYtPnRyYW5zX3N0YXJ0OworCQluZXRfZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisJCW5ldGlmX3R4X3VubG9ja19iaChuZXRfZGV2KTsKKwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmNtLT5pcnFfbG9jaywgZmxhZ3MpOwogCQliY200M3h4X21hY19zdXNwZW5kKGJjbSk7CiAJCWlmIChiY200M3h4X3VzaW5nX3BpbyhiY20pKQpAQCAtMzE4MiwxMyArMzI1MiwxMiBAQAogCQkvKiBQZXJpb2RpYyB3b3JrIHNob3VsZCB0YWtlIHNob3J0IHRpbWUsIHNvIHdlIHdhbnQgbG93CiAJCSAqIGxvY2tpbmcgb3ZlcmhlYWQuCiAJCSAqLwotCQltdXRleF9sb2NrKCZiY20tPm11dGV4KTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmJjbS0+aXJxX2xvY2ssIGZsYWdzKTsKIAl9CiAKIAlkb19wZXJpb2RpY193b3JrKGJjbSk7CiAKLQlpZiAoYmFkbmVzcyA+IEJBRE5FU1NfTElNSVQpIHsKKwlpZiAodW5saWtlbHkoYmNtLT5wZXJpb2RpY19zdGF0ZSAlIDQgPT0gMCkpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmJjbS0+aXJxX2xvY2ssIGZsYWdzKTsKIAkJdGFza2xldF9lbmFibGUoJmJjbS0+aXNyX3Rhc2tsZXQpOwogCQliY200M3h4X2ludGVycnVwdF9lbmFibGUoYmNtLCBzYXZlZGlycXMpOwpAQCAtMzE5Niw4ICszMjY1LDEwIEBACiAJCQliY200M3h4X3Bpb190aGF3X3R4cXVldWVzKGJjbSk7CiAJCWJjbTQzeHhfbWFjX2VuYWJsZShiY20pOwogCQluZXRpZl93YWtlX3F1ZXVlKGJjbS0+bmV0X2Rldik7CisJCW5ldF9kZXYtPnRyYW5zX3N0YXJ0ID0gb3JpZ190cmFuc19zdGFydDsKIAl9CiAJbW1pb3diKCk7CisJYmNtLT5wZXJpb2RpY19zdGF0ZSsrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjbS0+aXJxX2xvY2ssIGZsYWdzKTsKIAltdXRleF91bmxvY2soJmJjbS0+bXV0ZXgpOwogfQpAQCAtMzIwOSwxMSArMzI4MCwxMSBAQAogCiB2b2lkIGJjbTQzeHhfcGVyaW9kaWNfdGFza3Nfc2V0dXAoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtKQogewotCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9ICYoYmNtLT5wZXJpb2RpY193b3JrKTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrID0gJmJjbS0+cGVyaW9kaWNfd29yazsKIAogCWFzc2VydChiY200M3h4X3N0YXR1cyhiY20pID09IEJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCk7Ci0JSU5JVF9XT1JLKHdvcmssIGJjbTQzeHhfcGVyaW9kaWNfd29ya19oYW5kbGVyLCBiY20pOwotCXNjaGVkdWxlX3dvcmsod29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksod29yaywgYmNtNDN4eF9wZXJpb2RpY193b3JrX2hhbmRsZXIpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yayh3b3JrLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgYmNtNDN4eF9zZWN1cml0eV9pbml0KHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKQEAgLTM1MTYsNiArMzU4Nyw3IEBACiAJYmNtNDN4eF9tYWNmaWx0ZXJfY2xlYXIoYmNtLCBCQ000M3h4X01BQ0ZJTFRFUl9BU1NPQyk7CiAJYmNtNDN4eF9tYWNmaWx0ZXJfc2V0KGJjbSwgQkNNNDN4eF9NQUNGSUxURVJfU0VMRiwgKHU4ICopKGJjbS0+bmV0X2Rldi0+ZGV2X2FkZHIpKTsKIAliY200M3h4X3NlY3VyaXR5X2luaXQoYmNtKTsKKwlkcmFpbl90eHN0YXR1c19xdWV1ZShiY20pOwogCWllZWU4MDIxMXNvZnRtYWNfc3RhcnQoYmNtLT5uZXRfZGV2KTsKIAogCS8qIExldCdzIGdvISBCZSBjYXJlZnVsIGFmdGVyIGVuYWJsaW5nIHRoZSBJUlFzLgpAQCAtMzU2NCw3ICszNjM2LDcgQEAKIAliY200M3h4X3BlcmlvZGljX3Rhc2tzX3NldHVwKGJjbSk7CiAKIAkvKkZJWE1FOiBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHNvZnRtYWMgaW5zdGVhZC4gKi8KLQlzY2hlZHVsZV93b3JrKCZiY20tPnNvZnRtYWMtPmFzc29jaW5mby53b3JrKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJjbS0+c29mdG1hYy0+YXNzb2NpbmZvLndvcmssIDApOwogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCYoYmNtKS0+bXV0ZXgpOwpAQCAtMzY0Miw3ICszNzE0LDcgQEAKIAkJYmNtLT5pZWVlLT5mcmVxX2JhbmQgPSBJRUVFODAyMTFfMjRHSFpfQkFORDsKIAkJYnJlYWs7CiAJY2FzZSBCQ000M3h4X1BIWVRZUEVfRzoKLQkJaWYgKHBoeV9yZXYgPiA3KQorCQlpZiAocGh5X3JldiA+IDgpCiAJCQlwaHlfcmV2X29rID0gMDsKIAkJYmNtLT5pZWVlLT5tb2R1bGF0aW9uID0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiB8CiAJCQkJCUlFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTjsKQEAgLTM2NTQsNiArMzcyNiw4IEBACiAJCSAgICAgICBwaHlfdHlwZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX07CisJYmNtLT5pZWVlLT5wZXJmZWN0X3Jzc2kgPSBSWF9SU1NJX01BWDsKKwliY20tPmllZWUtPndvcnN0X3Jzc2kgPSAwOwogCWlmICghcGh5X3Jldl9vaykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSW52YWxpZCBQSFkgUmV2aXNpb24gJXhcbiIsCiAJCSAgICAgICBwaHlfcmV2KTsKQEAgLTM5NDAsMTEgKzQwMTQsNiBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIGJjbTQzeHhfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlyZXR1cm4gJihiY200M3h4X3ByaXYobmV0X2RldiktPmllZWUtPnN0YXRzKTsKLX0KLQogc3RhdGljIHZvaWQgYmNtNDN4eF9uZXRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBiY200M3h4X3ByaXYobmV0X2Rldik7CkBAIC0zOTkzLDggKzQwNjIsNiBAQAogCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAogCQkJCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewotCWludCBlcnI7Ci0KIAliY200M3h4X3NldF9zdGF0dXMoYmNtLCBCQ000M3h4X1NUQVRfVU5JTklUKTsKIAliY20tPmllZWUgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAliY20tPnNvZnRtYWMgPSBpZWVlODAyMTFfcHJpdihuZXRfZGV2KTsKQEAgLTQwMTIsMjIgKzQwNzksOCBAQAogCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSliY200M3h4X2ludGVycnVwdF90YXNrbGV0LAogCQkgICAgICh1bnNpZ25lZCBsb25nKWJjbSk7CiAJdGFza2xldF9kaXNhYmxlX25vc3luYygmYmNtLT5pc3JfdGFza2xldCk7Ci0JaWYgKG1vZHBhcmFtX3BpbykgeworCWlmIChtb2RwYXJhbV9waW8pCiAJCWJjbS0+X191c2luZ19waW8gPSAxOwotCX0gZWxzZSB7Ci0JCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgRE1BXzMwQklUX01BU0spOwotCQllcnIgfD0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBjaV9kZXYsIERNQV8zMEJJVF9NQVNLKTsKLQkJaWYgKGVycikgewotI2lmZGVmIENPTkZJR19CQ000M1hYX1BJTwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkRNQSBub3Qgc3VwcG9ydGVkLiBGYWxsaW5nIGJhY2sgdG8gUElPLlxuIik7Ci0JCQliY20tPl9fdXNpbmdfcGlvID0gMTsKLSNlbHNlCi0JCQlwcmludGsoS0VSTl9FUlIgUEZYICJGQVRBTDogRE1BIG5vdCBzdXBwb3J0ZWQgYW5kIFBJTyBub3QgY29uZmlndXJlZC4gIgotCQkJCQkgICAgIlJlY29tcGlsZSB0aGUgZHJpdmVyIHdpdGggUElPIHN1cHBvcnQsIHBsZWFzZS5cbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYgLyogQ09ORklHX0JDTTQzWFhfUElPICovCi0JCX0KLQl9CiAJYmNtLT5ydHNfdGhyZXNob2xkID0gQkNNNDN4eF9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CiAKIAkvKiBkZWZhdWx0IHRvIHN3IGVuY3J5cHRpb24gZm9yIG5vdyAqLwpAQCAtNDA3NCw3ICs0MTI3LDYgQEAKIAogCW5ldF9kZXYtPm9wZW4gPSBiY200M3h4X25ldF9vcGVuOwogCW5ldF9kZXYtPnN0b3AgPSBiY200M3h4X25ldF9zdG9wOwotCW5ldF9kZXYtPmdldF9zdGF0cyA9IGJjbTQzeHhfbmV0X2dldF9zdGF0czsKIAluZXRfZGV2LT50eF90aW1lb3V0ID0gYmNtNDN4eF9uZXRfdHhfdGltZW91dDsKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCW5ldF9kZXYtPnBvbGxfY29udHJvbGxlciA9IGJjbTQzeHhfbmV0X3BvbGxfY29udHJvbGxlcjsKQEAgLTQxMzEsOSArNDE4MywxMCBAQAogLyogSGFyZC1yZXNldCB0aGUgY2hpcC4gRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseS4KICAqIFVzZSBiY200M3h4X2NvbnRyb2xsZXJfcmVzdGFydCgpCiAgKi8KLXN0YXRpYyB2b2lkIGJjbTQzeHhfY2hpcF9yZXNldCh2b2lkICpfYmNtKQorc3RhdGljIHZvaWQgYmNtNDN4eF9jaGlwX3Jlc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBfYmNtOworCXN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlLCByZXN0YXJ0X3dvcmspOwogCXN0cnVjdCBiY200M3h4X3BoeWluZm8gKnBoeTsKIAlpbnQgZXJyID0gLUVOT0RFVjsKIApAQCAtNDE2MCw3ICs0MjEzLDcgQEAKIAlpZiAoYmNtNDN4eF9zdGF0dXMoYmNtKSAhPSBCQ000M3h4X1NUQVRfSU5JVElBTElaRUQpCiAJCXJldHVybjsKIAlwcmludGsoS0VSTl9FUlIgUEZYICJDb250cm9sbGVyIFJFU0VUICglcykgLi4uXG4iLCByZWFzb24pOwotCUlOSVRfV09SSygmYmNtLT5yZXN0YXJ0X3dvcmssIGJjbTQzeHhfY2hpcF9yZXNldCwgYmNtKTsKKwlJTklUX1dPUksoJmJjbS0+cmVzdGFydF93b3JrLCBiY200M3h4X2NoaXBfcmVzZXQpOwogCXNjaGVkdWxlX3dvcmsoJmJjbS0+cmVzdGFydF93b3JrKTsKIH0KIApAQCAtNDIwOCw3ICs0MjYxLDExIEBACiAJZHByaW50ayhLRVJOX0lORk8gUEZYICJSZXN1bWluZy4uLlxuIik7CiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOwotCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRmFpbHVyZSB3aXRoIHBjaV9lbmFibGVfZGV2aWNlIVxuIik7CisJCXJldHVybiBlcnI7CisJfQogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCiAJYmNtNDN4eF9jaGlwc2V0X2F0dGFjaChiY20pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3Bvd2VyLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcG93ZXIuYwppbmRleCA2NTY5ZGEzLi43ZTc3NGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcG93ZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcG93ZXIuYwpAQCAtMTUzLDggKzE1Myw2IEBACiAJaW50IGVyciwgbWF4ZnJlcTsKIAlzdHJ1Y3QgYmNtNDN4eF9jb3JlaW5mbyAqb2xkX2NvcmU7CiAKLQlpZiAoIShiY20tPmNoaXBjb21tb25fY2FwYWJpbGl0aWVzICYgQkNNNDN4eF9DQVBBQklMSVRJRVNfUENUTCkpCi0JCXJldHVybiAwOwogCW9sZF9jb3JlID0gYmNtLT5jdXJyZW50X2NvcmU7CiAJZXJyID0gYmNtNDN4eF9zd2l0Y2hfY29yZShiY20sICZiY20tPmNvcmVfY2hpcGNvbW1vbik7CiAJaWYgKGVyciA9PSAtRU5PREVWKQpAQCAtMTYyLDExICsxNjAsMjcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCW1heGZyZXEgPSBiY200M3h4X3BjdGxfY2xvY2tmcmVxbGltaXQoYmNtLCAxKTsKLQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NISVBDT01NT05fUExMT05ERUxBWSwKLQkJCShtYXhmcmVxICogMTUwICsgOTk5OTk5KSAvIDEwMDAwMDApOwotCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfQ0hJUENPTU1PTl9GUkVGU0VMREVMQVksCi0JCQkobWF4ZnJlcSAqIDE1ICsgOTk5OTk5KSAvIDEwMDAwMDApOworCWlmIChiY20tPmNoaXBfaWQgPT0gMHg0MzIxKSB7CisJCWlmIChiY20tPmNoaXBfcmV2ID09IDApCisJCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NISVBDT01NT05fQ1RMLCAweDAzQTQpOworCQlpZiAoYmNtLT5jaGlwX3JldiA9PSAxKQorCQkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSElQQ09NTU9OX0NUTCwgMHgwMEE0KTsKKwl9CisKKwlpZiAoYmNtLT5jaGlwY29tbW9uX2NhcGFiaWxpdGllcyAmIEJDTTQzeHhfQ0FQQUJJTElUSUVTX1BDVEwpIHsKKwkJaWYgKGJjbS0+Y3VycmVudF9jb3JlLT5yZXYgPj0gMTApIHsKKwkJCS8qIFNldCBJZGxlIFBvd2VyIGNsb2NrIHJhdGUgdG8gMU1oeiAqLworCQkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSElQQ09NTU9OX1NZU0NMS0NUTCwKKwkJCQkgICAgICAgKGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9DSElQQ09NTU9OX1NZU0NMS0NUTCkKKwkJCQkgICAgICAgJiAweDAwMDBGRkZGKSB8IDB4NDAwMDApOworCQl9IGVsc2UgeworCQkJbWF4ZnJlcSA9IGJjbTQzeHhfcGN0bF9jbG9ja2ZyZXFsaW1pdChiY20sIDEpOworCQkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSElQQ09NTU9OX1BMTE9OREVMQVksCisJCQkJICAgICAgIChtYXhmcmVxICogMTUwICsgOTk5OTk5KSAvIDEwMDAwMDApOworCQkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSElQQ09NTU9OX0ZSRUZTRUxERUxBWSwKKwkJCQkgICAgICAgKG1heGZyZXEgKiAxNSArIDk5OTk5OSkgLyAxMDAwMDAwKTsKKwkJfQorCX0KIAogCWVyciA9IGJjbTQzeHhfc3dpdGNoX2NvcmUoYmNtLCBvbGRfY29yZSk7CiAJYXNzZXJ0KGVyciA9PSAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF93eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3d4LmMKaW5kZXggOWI3YjE1Yy4uYTY1OTQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3d4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3d4LmMKQEAgLTQ3LDkgKzQ3LDYgQEAKICNkZWZpbmUgQkNNNDN4eF9XWF9WRVJTSU9OCTE4CiAKICNkZWZpbmUgTUFYX1dYX1NUUklORwkJODAKLS8qIEZJWE1FOiB0aGUgbmV4dCBsaW5lIGlzIGEgZ3Vlc3MgYXMgdG8gd2hhdCB0aGUgbWF4aW11bSBSU1NJIHZhbHVlIG1pZ2h0IGJlICovCi0jZGVmaW5lIFJYX1JTU0lfTUFYCQk2MAotCiAKIHN0YXRpYyBpbnQgYmNtNDN4eF93eF9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLApAQCAtNjkzLDYgKzY5MCw3IEBACiAJYmNtLT5pZWVlLT5ob3N0X2VuY3J5cHQgPSAhIW9uOwogCWJjbS0+aWVlZS0+aG9zdF9kZWNyeXB0ID0gISFvbjsKIAliY20tPmllZWUtPmhvc3RfYnVpbGRfaXYgPSAhb247CisJYmNtLT5pZWVlLT5ob3N0X3N0cmlwX2l2X2ljdiA9ICFvbjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY20tPmlycV9sb2NrLCBmbGFncyk7CiAJbXV0ZXhfdW5sb2NrKCZiY20tPm11dGV4KTsKIApAQCAtODQ3LDcgKzg0NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXdzdGF0cyA9ICZiY20tPnN0YXRzLndzdGF0czsKLQlpZiAoIW1hYy0+YXNzb2NpYXRlZCkgeworCWlmICghbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCkgewogCQl3c3RhdHMtPm1pc3MuYmVhY29uID0gMDsKIC8vCQliY20tPmllZWUtPmllZWVfc3RhdHMudHhfcmV0cnlfbGltaXRfZXhjZWVkZWQgPSAwOyAvLyBGSVhNRTogc2hvdWxkIHRoaXMgYmUgY2xlYXJlZCBoZXJlPwogCQl3c3RhdHMtPmRpc2NhcmQucmV0cmllcyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfeG1pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3htaXQuYwppbmRleCAwMTU5ZTRlLi4zZTI0NjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfeG1pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF94bWl0LmMKQEAgLTU0NCwyNCArNTQ0LDYgQEAKIAl9CiAKIAlmcmFtZV9jdGwgPSBsZTE2X3RvX2NwdSh3bGhkci0+ZnJhbWVfY3RsKTsKLQlpZiAoKGZyYW1lX2N0bCAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCkgJiYgIWJjbS0+aWVlZS0+aG9zdF9kZWNyeXB0KSB7Ci0JCWZyYW1lX2N0bCAmPSB+SUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEOwotCQl3bGhkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoZnJhbWVfY3RsKTsJCQotCQkvKiB0cmltIElWIGFuZCBJQ1YgKi8KLQkJLyogRklYTUU6IHRoaXMgbXVzdCBiZSBkb25lIG9ubHkgZm9yIFdFUCBlbmNyeXB0ZWQgcGFja2V0cyAqLwotCQlpZiAoc2tiLT5sZW4gPCAzMikgewotCQkJZHByaW50a2woS0VSTl9FUlIgUEZYICJSWCBwYWNrZXQgZHJvcHBlZCAoUFJPVEVDVEVEIGZsYWcgIgotCQkJCQkgICAgICAic2V0IGFuZCBsZW5ndGggPCAzMilcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZSB7CQkKLQkJCW1lbW1vdmUoc2tiLT5kYXRhICsgNCwgc2tiLT5kYXRhLCAyNCk7Ci0JCQlza2JfcHVsbChza2IsIDQpOwotCQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOwotCQkJc3RhdHMubGVuIC09IDg7Ci0JCX0KLQkJd2xoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikoc2tiLT5kYXRhKTsKLQl9Ci0JCiAJc3dpdGNoIChXTEFOX0ZDX0dFVF9UWVBFKGZyYW1lX2N0bCkpIHsKIAljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgogCQlpZWVlODAyMTFfcnhfbWd0KGJjbS0+aWVlZSwgd2xoZHIsICZzdGF0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwLmgKaW5kZXggZTY2MzUxOC4uZTg5Yzg5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXAuaApAQCAtMzUsNyArMzUsNyBAQAogc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmhvc3RhcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIGhvc3RhcF9zZXR1cF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbG9jYWxfaW5mb190ICpsb2NhbCwKIAkJICAgICAgaW50IG1haW5fZGV2KTsKLXZvaWQgaG9zdGFwX3NldF9tdWx0aWNhc3RfbGlzdF9xdWV1ZSh2b2lkICpkYXRhKTsKK3ZvaWQgaG9zdGFwX3NldF9tdWx0aWNhc3RfbGlzdF9xdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogaW50IGhvc3RhcF9zZXRfaG9zdGFwZChsb2NhbF9pbmZvX3QgKmxvY2FsLCBpbnQgdmFsLCBpbnQgcnRubF9sb2NrZWQpOwogaW50IGhvc3RhcF9zZXRfaG9zdGFwZF9zdGEobG9jYWxfaW5mb190ICpsb2NhbCwgaW50IHZhbCwgaW50IHJ0bmxfbG9ja2VkKTsKIHZvaWQgaG9zdGFwX2NsZWFudXAobG9jYWxfaW5mb190ICpsb2NhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKaW5kZXggYmExMzEyNS4uZWZiOGNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYwpAQCAtNDksMTAgKzQ5LDEwIEBACiBzdGF0aWMgc3RydWN0IHN0YV9pbmZvKiBhcF9nZXRfc3RhKHN0cnVjdCBhcF9kYXRhICphcCwgdTggKnN0YSk7CiBzdGF0aWMgdm9pZCBob3N0YXBfZXZlbnRfZXhwaXJlZF9zdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9hZGRfcHJvY19xdWV1ZSh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9hZGRfcHJvY19xdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKLXN0YXRpYyB2b2lkIGhhbmRsZV93ZHNfb3Blcl9xdWV1ZSh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV93ZHNfb3Blcl9xdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgcHJpc20yX3NlbmRfbWdtdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICB1MTYgdHlwZV9zdWJ0eXBlLCBjaGFyICpib2R5LAogCQkJICAgICBpbnQgYm9keV9sZW4sIHU4ICphZGRyLCB1MTYgdHhfY2JfaWR4KTsKQEAgLTgwNyw3ICs4MDcsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZhcC0+c3RhX2xpc3QpOwogCiAJLyogSW5pdGlhbGl6ZSB0YXNrIHF1ZXVlIHN0cnVjdHVyZSBmb3IgQVAgbWFuYWdlbWVudCAqLwotCUlOSVRfV09SSygmbG9jYWwtPmFwLT5hZGRfc3RhX3Byb2NfcXVldWUsIGhhbmRsZV9hZGRfcHJvY19xdWV1ZSwgYXApOworCUlOSVRfV09SSygmbG9jYWwtPmFwLT5hZGRfc3RhX3Byb2NfcXVldWUsIGhhbmRsZV9hZGRfcHJvY19xdWV1ZSk7CiAKIAlhcC0+dHhfY2FsbGJhY2tfaWR4ID0KIAkJaG9zdGFwX3R4X2NhbGxiYWNrX3JlZ2lzdGVyKGxvY2FsLCBob3N0YXBfYXBfdHhfY2IsIGFwKTsKQEAgLTgxNSw3ICs4MTUsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIFRYIGNhbGxiYWNrIGZvciAiCiAJCSAgICAgICAiQVBcbiIsIGxvY2FsLT5kZXYtPm5hbWUpOwogI2lmbmRlZiBQUklTTTJfTk9fS0VSTkVMX0lFRUU4MDIxMV9NR01UCi0JSU5JVF9XT1JLKCZsb2NhbC0+YXAtPndkc19vcGVyX3F1ZXVlLCBoYW5kbGVfd2RzX29wZXJfcXVldWUsIGxvY2FsKTsKKwlJTklUX1dPUksoJmxvY2FsLT5hcC0+d2RzX29wZXJfcXVldWUsIGhhbmRsZV93ZHNfb3Blcl9xdWV1ZSk7CiAKIAlhcC0+dHhfY2FsbGJhY2tfYXV0aCA9CiAJCWhvc3RhcF90eF9jYWxsYmFja19yZWdpc3Rlcihsb2NhbCwgaG9zdGFwX2FwX3R4X2NiX2F1dGgsIGFwKTsKQEAgLTEwNjIsOSArMTA2MiwxMCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGhhbmRsZV9hZGRfcHJvY19xdWV1ZSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaGFuZGxlX2FkZF9wcm9jX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYXBfZGF0YSAqYXAgPSAoc3RydWN0IGFwX2RhdGEgKikgZGF0YTsKKwlzdHJ1Y3QgYXBfZGF0YSAqYXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFwX2RhdGEsCisJCQkJCSAgYWRkX3N0YV9wcm9jX3F1ZXVlKTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAljaGFyIG5hbWVbMjBdOwogCXN0cnVjdCBhZGRfc3RhX3Byb2NfZGF0YSAqZW50cnksICpwcmV2OwpAQCAtMTA5OSwxNSArMTEwMCwxMyBAQAogewogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCi0Jc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKQotCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pLCBHRlBfQVRPTUlDKTsKKwlzdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhID09IE5VTEwpIHsKIAkJUERFQlVHKERFQlVHX0FQLCAiQVA6IGttYWxsb2MgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJLyogaW5pdGlhbGl6ZSBTVEEgaW5mbyBkYXRhICovCi0JbWVtc2V0KHN0YSwgMCwgc2l6ZW9mKHN0cnVjdCBzdGFfaW5mbykpOwogCXN0YS0+bG9jYWwgPSBhcC0+bG9jYWw7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc3RhLT50eF9idWYpOwogCW1lbWNweShzdGEtPmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKQEAgLTEyNTQsNyArMTI1Myw3IEBACiAJCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQl0bXBidWYgPSAoY2hhciAqKSBrbWFsbG9jKFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOLCBHRlBfQVRPTUlDKTsKKwl0bXBidWYgPSBrbWFsbG9jKFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOLCBHRlBfQVRPTUlDKTsKIAlpZiAodG1wYnVmID09IE5VTEwpIHsKIAkJUERFQlVHKERFQlVHX0FQLCAiQVA6IGttYWxsb2MgZmFpbGVkIGZvciBjaGFsbGVuZ2VcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE5NTIsOSArMTk1MSwxMSBAQAogCiAjaWZuZGVmIFBSSVNNMl9OT19LRVJORUxfSUVFRTgwMjExX01HTVQKIAotc3RhdGljIHZvaWQgaGFuZGxlX3dkc19vcGVyX3F1ZXVlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBoYW5kbGVfd2RzX29wZXJfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBkYXRhOworCXN0cnVjdCBhcF9kYXRhICphcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXBfZGF0YSwKKwkJCQkJICB3ZHNfb3Blcl9xdWV1ZSk7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IGFwLT5sb2NhbDsKIAlzdHJ1Y3Qgd2RzX29wZXJfZGF0YSAqZW50cnksICpwcmV2OwogCiAJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKaW5kZXggNjg2ZDg5NS4uOGQ4ZjRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYwpAQCAtMjkzLDE1ICsyOTMsMTIgQEAKIAkJZ290byBkb25lOwogCX0KIAotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CiAJdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047CiAJdHVwbGUuVHVwbGVEYXRhID0gYnVmOwogCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwogCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShod19wcml2LT5saW5rLCAmdHVwbGUpIHx8Ci0JICAgIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShod19wcml2LT5saW5rLCAmdHVwbGUpIHx8Ci0JICAgIHBjbWNpYV9wYXJzZV90dXBsZShod19wcml2LT5saW5rLCAmdHVwbGUsIHBhcnNlKSB8fAotCSAgICBwYXJzZS0+bWFuZmlkLm1hbmYgIT0gMHhkNjAxIHx8IHBhcnNlLT5tYW5maWQuY2FyZCAhPSAweDAxMDEpIHsKKworCWlmIChod19wcml2LT5saW5rLT5tYW5mX2lkICE9IDB4ZDYwMSB8fCBod19wcml2LT5saW5rLT5jYXJkX2lkICE9IDB4MDEwMSkgewogCQkvKiBObyBTYW5EaXNrIG1hbmZpZCBmb3VuZCAqLwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGRvbmU7CkBAIC01NjYsMjMgKzU2MywxNiBAQAogCVBERUJVRyhERUJVR19GTE9XLCAicHJpc20yX2NvbmZpZygpXG4iKTsKIAogCXBhcnNlID0ga21hbGxvYyhzaXplb2YoY2lzcGFyc2VfdCksIEdGUF9LRVJORUwpOwotCWh3X3ByaXYgPSBrbWFsbG9jKHNpemVvZigqaHdfcHJpdiksIEdGUF9LRVJORUwpOworCWh3X3ByaXYgPSBremFsbG9jKHNpemVvZigqaHdfcHJpdiksIEdGUF9LRVJORUwpOwogCWlmIChwYXJzZSA9PSBOVUxMIHx8IGh3X3ByaXYgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZDsKIAl9Ci0JbWVtc2V0KGh3X3ByaXYsIDAsIHNpemVvZigqaHdfcHJpdikpOwogCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKIAl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKIAl0dXBsZS5UdXBsZURhdGEgPSBidWY7CiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CiAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS0+Y29uZmlnLmJhc2U7Ci0JbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UtPmNvbmZpZy5ybWFza1swXTsKIAogCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLAogCQkgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJmNvbmYpKTsKQEAgLTg4Nyw2ICs4NzcsMTMgQEAKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCiAJCSJVLlMuIFJvYm90aWNzIiwgIklFRUUgODAyLjExYiBQQy1DQVJEIiwgIlZlcnNpb24gMDEuMDIiLAogCQkweGM3YjhkZjlkLCAweDE3MDBkMDg3LCAweDRiNzRiYWEwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCisJCSJBbGxpZWQgVGVsZXN5biIsICJBVC1XQ0w0NTIgV2lyZWxlc3MgUENNQ0lBIFJhZGlvIiwKKwkJIlZlci4gMS4wMCIsCisJCTB4NWNkMDE3MDUsIDB4NDI3MTY2MGYsIDB4OWQwOGVlMTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKKwkJImNvcmVnYSIsICJXTCBQQ0NMLTExIiwgIklTTDM3MzAwUCIsCisJCTB4YTIxNTAxYSwgMHg1OTg2ODkyNiwgMHhjOTA0OWEzOSksCiAJUENNQ0lBX0RFVklDRV9OVUxMCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGhvc3RhcF9jc19pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9kb3dubG9hZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9kb3dubG9hZC5jCmluZGV4IGFiMjZiNTIuLmM3Njc4ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfZG93bmxvYWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2Rvd25sb2FkLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQkweDdmMDAwMiAvKiBJbnRlbCBQUk8vV2lyZWxlc3MgMjAxMUIgKFBDSSkgKi8sCiAJfTsKIAotCWJ1ZiA9ICh1OCAqKSBrbWFsbG9jKFBSSVNNMl9QREFfU0laRSwgR0ZQX0tFUk5FTCk7CisJYnVmID0ga21hbGxvYyhQUklTTTJfUERBX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTY4NSwxNCArNjg1LDEyIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRsID0ga21hbGxvYyhzaXplb2YoKmRsKSArIHBhcmFtLT5udW1fYXJlYXMgKgorCWRsID0ga3phbGxvYyhzaXplb2YoKmRsKSArIHBhcmFtLT5udW1fYXJlYXMgKgogCQkgICAgIHNpemVvZihzdHJ1Y3QgcHJpc20yX2Rvd25sb2FkX2RhdGFfYXJlYSksIEdGUF9LRVJORUwpOwogCWlmIChkbCA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KLQltZW1zZXQoZGwsIDAsIHNpemVvZigqZGwpICsgcGFyYW0tPm51bV9hcmVhcyAqCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgcHJpc20yX2Rvd25sb2FkX2RhdGFfYXJlYSkpOwogCWRsLT5kbF9jbWQgPSBwYXJhbS0+ZGxfY21kOwogCWRsLT5zdGFydF9hZGRyID0gcGFyYW0tPnN0YXJ0X2FkZHI7CiAJZGwtPm51bV9hcmVhcyA9IHBhcmFtLT5udW1fYXJlYXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMKaW5kZXggZWQwMGViYi4uMzA3OTM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYwpAQCAtMzQ3LDE0ICszNDcsMTIgQEAKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCXJldHVybiAtRUlOVFI7CiAKLQllbnRyeSA9IChzdHJ1Y3QgaG9zdGFwX2NtZF9xdWV1ZSAqKQotCQlrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfQVRPTUlDKTsKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmIChlbnRyeSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogaGZhMzg0eF9jbWQgLSBrbWFsbG9jIGZhaWxlZFxuIiwKIAkJICAgICAgIGRldi0+bmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKIAlhdG9taWNfc2V0KCZlbnRyeS0+dXNlY250LCAxKTsKIAllbnRyeS0+dHlwZSA9IENNRF9TTEVFUDsKIAllbnRyeS0+Y21kID0gY21kOwpAQCAtNTE3LDE0ICs1MTUsMTIgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWVudHJ5ID0gKHN0cnVjdCBob3N0YXBfY21kX3F1ZXVlICopCi0JCWttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOworCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoZmEzODR4X2NtZF9jYWxsYmFjayAtIGttYWxsb2MgIgogCQkgICAgICAgImZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOwogCWF0b21pY19zZXQoJmVudHJ5LT51c2VjbnQsIDEpOwogCWVudHJ5LT50eXBlID0gQ01EX0NBTExCQUNLOwogCWVudHJ5LT5jbWQgPSBjbWQ7CkBAIC0xNjQ1LDkgKzE2NDEsOSBAQAogCiAvKiBDYWxsZWQgb25seSBhcyBzY2hlZHVsZWQgdGFzayBhZnRlciBub3RpY2luZyBjYXJkIHRpbWVvdXQgaW4gaW50ZXJydXB0CiAgKiBjb250ZXh0ICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfcmVzZXRfcXVldWUodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGhhbmRsZV9yZXNldF9xdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JbG9jYWxfaW5mb190ICpsb2NhbCA9IChsb2NhbF9pbmZvX3QgKikgZGF0YTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gY29udGFpbmVyX29mKHdvcmssIGxvY2FsX2luZm9fdCwgcmVzZXRfcXVldWUpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzY2hlZHVsZWQgY2FyZCByZXNldFxuIiwgbG9jYWwtPmRldi0+bmFtZSk7CiAJcHJpc20yX2h3X3Jlc2V0KGxvY2FsLT5kZXYpOwpAQCAtMjI1Niw3ICsyMjUyLDcgQEAKIAlpZiAodHhkZXNjLT5zd19zdXBwb3J0KSB7CiAJCWxlbiA9IGxlMTZfdG9fY3B1KHR4ZGVzYy0+ZGF0YV9sZW4pOwogCQlpZiAobGVuIDwgUFJJU00yX0RBVEFfTUFYTEVOKSB7Ci0JCQkqcGF5bG9hZCA9IChjaGFyICopIGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwkJCSpwYXlsb2FkID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwogCQkJaWYgKCpwYXlsb2FkID09IE5VTEwgfHwKIAkJCSAgICBoZmEzODR4X2Zyb21fYmFwKGRldiwgQkFQMCwgKnBheWxvYWQsIGxlbikpIHsKIAkJCQlQREVCVUcoREVCVUdfRVhUUkEsICIlczogY291bGQgbm90IHJlYWQgVFggIgpAQCAtMjg5Niw5ICsyODkyLDEwIEBACiAKIC8qIENhbGxlZCBvbmx5IGFzIGEgc2NoZWR1bGVkIHRhc2sgd2hlbiBjb21tdW5pY2F0aW9ucyBxdWFsaXR5IHZhbHVlcyBzaG91bGQKICAqIGJlIHVwZGF0ZWQuICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfY29tbXNfcXVhbF91cGRhdGUodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGhhbmRsZV9jb21tc19xdWFsX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JbG9jYWxfaW5mb190ICpsb2NhbCA9IGRhdGE7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBsb2NhbF9pbmZvX3QsIGNvbW1zX3F1YWxfdXBkYXRlKTsKIAlwcmlzbTJfdXBkYXRlX2NvbW1zX3F1YWwobG9jYWwtPmRldik7CiB9CiAKQEAgLTMwMTUsMTQgKzMwMTIsMTIgQEAKIAlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7CiAJbG9jYWwgPSBpZmFjZS0+bG9jYWw7CiAKLQluZXdfZW50cnkgPSAoc3RydWN0IHNldF90aW1fZGF0YSAqKQotCQlrbWFsbG9jKHNpemVvZigqbmV3X2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJbmV3X2VudHJ5ID0ga3phbGxvYyhzaXplb2YoKm5ld19lbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmIChuZXdfZW50cnkgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHByaXNtMl9zZXRfdGltOiBrbWFsbG9jIGZhaWxlZFxuIiwKIAkJICAgICAgIGxvY2FsLT5kZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KG5ld19lbnRyeSwgMCwgc2l6ZW9mKCpuZXdfZW50cnkpKTsKIAluZXdfZW50cnktPmFpZCA9IGFpZDsKIAluZXdfZW50cnktPnNldCA9IHNldDsKIApAQCAtMzA1MCw5ICszMDQ1LDkgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBoYW5kbGVfc2V0X3RpbV9xdWV1ZSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaGFuZGxlX3NldF90aW1fcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCWxvY2FsX2luZm9fdCAqbG9jYWwgPSAobG9jYWxfaW5mb190ICopIGRhdGE7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBsb2NhbF9pbmZvX3QsIHNldF90aW1fcXVldWUpOwogCXN0cnVjdCBzZXRfdGltX2RhdGEgKmVudHJ5OwogCXUxNiB2YWw7CiAKQEAgLTMyMDksMTUgKzMyMDQsMTUgQEAKIAlsb2NhbC0+c2Nhbl9jaGFubmVsX21hc2sgPSAweGZmZmY7CiAKIAkvKiBJbml0aWFsaXplIHRhc2sgcXVldWUgc3RydWN0dXJlcyAqLwotCUlOSVRfV09SSygmbG9jYWwtPnJlc2V0X3F1ZXVlLCBoYW5kbGVfcmVzZXRfcXVldWUsIGxvY2FsKTsKKwlJTklUX1dPUksoJmxvY2FsLT5yZXNldF9xdWV1ZSwgaGFuZGxlX3Jlc2V0X3F1ZXVlKTsKIAlJTklUX1dPUksoJmxvY2FsLT5zZXRfbXVsdGljYXN0X2xpc3RfcXVldWUsCi0JCSAgaG9zdGFwX3NldF9tdWx0aWNhc3RfbGlzdF9xdWV1ZSwgbG9jYWwtPmRldik7CisJCSAgaG9zdGFwX3NldF9tdWx0aWNhc3RfbGlzdF9xdWV1ZSk7CiAKLQlJTklUX1dPUksoJmxvY2FsLT5zZXRfdGltX3F1ZXVlLCBoYW5kbGVfc2V0X3RpbV9xdWV1ZSwgbG9jYWwpOworCUlOSVRfV09SSygmbG9jYWwtPnNldF90aW1fcXVldWUsIGhhbmRsZV9zZXRfdGltX3F1ZXVlKTsKIAlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPnNldF90aW1fbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmxvY2FsLT5zZXRfdGltX2xvY2spOwogCi0JSU5JVF9XT1JLKCZsb2NhbC0+Y29tbXNfcXVhbF91cGRhdGUsIGhhbmRsZV9jb21tc19xdWFsX3VwZGF0ZSwgbG9jYWwpOworCUlOSVRfV09SSygmbG9jYWwtPmNvbW1zX3F1YWxfdXBkYXRlLCBoYW5kbGVfY29tbXNfcXVhbF91cGRhdGUpOwogCiAJLyogSW5pdGlhbGl6ZSB0YXNrbGV0cyBmb3IgaGFuZGxpbmcgaGFyZHdhcmUgSVJRIHJlbGF0ZWQgb3BlcmF0aW9ucwogCSAqIG91dHNpZGUgaHcgSVJRIGhhbmRsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW5mby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKaW5kZXggNTBmNzJkOC4uYjZhMDJhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMKQEAgLTMyNywxMSArMzI3LDEwIEBACiAJcHRyID0gKHU4ICopIHBvczsKIAogCW5ld19jb3VudCA9IGxlZnQgLyByZXN1bHRfc2l6ZTsKLQlyZXN1bHRzID0ga21hbGxvYyhuZXdfY291bnQgKiBzaXplb2Yoc3RydWN0IGhmYTM4NHhfaG9zdHNjYW5fcmVzdWx0KSwKKwlyZXN1bHRzID0ga2NhbGxvYyhuZXdfY291bnQsIHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQpLAogCQkJICBHRlBfQVRPTUlDKTsKIAlpZiAocmVzdWx0cyA9PSBOVUxMKQogCQlyZXR1cm47Ci0JbWVtc2V0KHJlc3VsdHMsIDAsIG5ld19jb3VudCAqIHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9ob3N0c2Nhbl9yZXN1bHQpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuZXdfY291bnQ7IGkrKykgewogCQltZW1jcHkoJnJlc3VsdHNbaV0sIHB0ciwgY29weV9sZW4pOwpAQCAtNDc0LDkgKzQ3Myw5IEBACiAKIC8qIENhbGxlZCBvbmx5IGFzIHNjaGVkdWxlZCB0YXNrIGFmdGVyIHJlY2VpdmluZyBpbmZvIGZyYW1lcyAodXNlZCB0byBhdm9pZAogICogcGVuZGluZyB0b28gbXVjaCB0aW1lIGluIEhXIElSUSBoYW5kbGVyKS4gKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9pbmZvX3F1ZXVlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBoYW5kbGVfaW5mb19xdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JbG9jYWxfaW5mb190ICpsb2NhbCA9IChsb2NhbF9pbmZvX3QgKikgZGF0YTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gY29udGFpbmVyX29mKHdvcmssIGxvY2FsX2luZm9fdCwgaW5mb19xdWV1ZSk7CiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFBSSVNNMl9JTkZPX1BFTkRJTkdfTElOS1NUQVRVUywKIAkJCSAgICAgICAmbG9jYWwtPnBlbmRpbmdfaW5mbykpCkBAIC00OTMsNyArNDkyLDcgQEAKIHsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+aW5mb19saXN0KTsKICNpZm5kZWYgUFJJU00yX05PX1NUQVRJT05fTU9ERVMKLQlJTklUX1dPUksoJmxvY2FsLT5pbmZvX3F1ZXVlLCBoYW5kbGVfaW5mb19xdWV1ZSwgbG9jYWwpOworCUlOSVRfV09SSygmbG9jYWwtPmluZm9fcXVldWUsIGhhbmRsZV9pbmZvX3F1ZXVlKTsKICNlbmRpZiAvKiBQUklTTTJfTk9fU1RBVElPTl9NT0RFUyAqLwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKaW5kZXggZDA2MWZiMy4uY2IwOGJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYwpAQCAtMTgxLDEyICsxODEsMTAgQEAKIAkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpuZXdfY3J5cHQ7CiAKIAkJLyogdGFrZSBXRVAgaW50byB1c2UgKi8KLQkJbmV3X2NyeXB0ID0gKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwKKwkJbmV3X2NyeXB0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwKIAkJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKIAkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOwogCQlpZiAoIW5ld19jcnlwdC0+b3BzKSB7CiAJCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOwpAQCAtMzMyMCwxNCArMzMxOCwxMiBAQAogCiAJCXByaXNtMl9jcnlwdF9kZWxheWVkX2RlaW5pdChsb2NhbCwgY3J5cHQpOwogCi0JCW5ld19jcnlwdCA9IChzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKikKLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSksCisJCW5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkgewogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CiAJCW5ld19jcnlwdC0+b3BzID0gb3BzOwogCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChpKTsKIAkJaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CkBAIC0zNTM4LDE0ICszNTM0LDEyIEBACiAKIAkJcHJpc20yX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGxvY2FsLCBjcnlwdCk7CiAKLQkJbmV3X2NyeXB0ID0gKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwKKwkJbmV3X2NyeXB0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwKIAkJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBkb25lOwogCQl9Ci0JCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKIAkJbmV3X2NyeXB0LT5vcHMgPSBvcHM7CiAJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KHBhcmFtLT51LmNyeXB0LmlkeCk7CiAJCWlmIChuZXdfY3J5cHQtPnByaXYgPT0gTlVMTCkgewpAQCAtMzgzNSw3ICszODI5LDcgQEAKIAkgICAgcC0+bGVuZ3RoID4gUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIHx8ICFwLT5wb2ludGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBhcmFtID0gKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqKSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJcGFyYW0gPSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBhcmFtID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCmluZGV4IDUzMzc0ZmMuLjA0YzE5Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCkBAIC0yNTAsNyArMjUwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBob3N0YXBfdHhfY2FsbGJhY2tfaW5mbyAqZW50cnk7CiAKLQllbnRyeSA9IChzdHJ1Y3QgaG9zdGFwX3R4X2NhbGxiYWNrX2luZm8gKikga21hbGxvYyhzaXplb2YoKmVudHJ5KSwKKwllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksCiAJCQkJCQkJICAgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCiAJCXJldHVybiAwOwpAQCAtNzY3LDE0ICs3NjcsMTQgQEAKIAogLyogVE9ETzogdG8gYmUgZnVydGhlciBpbXBsZW1lbnRlZCBhcyBzb29uIGFzIFByaXNtMiBmdWxseSBzdXBwb3J0cwogICogICAgICAgR3JvdXBBZGRyZXNzZXMgYW5kIGNvcnJlY3QgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgKi8KLXZvaWQgaG9zdGFwX3NldF9tdWx0aWNhc3RfbGlzdF9xdWV1ZSh2b2lkICpkYXRhKQordm9pZCBob3N0YXBfc2V0X211bHRpY2FzdF9saXN0X3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBsb2NhbF9pbmZvX3QsIHNldF9tdWx0aWNhc3RfbGlzdF9xdWV1ZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxvY2FsLT5kZXY7CiAJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOwotCWxvY2FsX2luZm9fdCAqbG9jYWw7CiAKIAlpZmFjZSA9IG5ldGRldl9wcml2KGRldik7Ci0JbG9jYWwgPSBpZmFjZS0+bG9jYWw7CiAJaWYgKGhvc3RhcF9zZXRfd29yZChkZXYsIEhGQTM4NFhfUklEX1BST01JU0NVT1VTTU9ERSwKIAkJCSAgICBsb2NhbC0+aXNfcHJvbWlzYykpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzYWJsaW5nIHByb21pc2N1b3VzIG1vZGUgZmFpbGVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcGNpLmMKaW5kZXggYzJmYTAxMS4uYzRmNjAyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BjaS5jCkBAIC0zMDAsMTAgKzMwMCw5IEBACiAJc3RydWN0IGhvc3RhcF9pbnRlcmZhY2UgKmlmYWNlOwogCXN0cnVjdCBob3N0YXBfcGNpX3ByaXYgKmh3X3ByaXY7CiAKLQlod19wcml2ID0ga21hbGxvYyhzaXplb2YoKmh3X3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlod19wcml2ID0ga3phbGxvYyhzaXplb2YoKmh3X3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoaHdfcHJpdiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoaHdfcHJpdiwgMCwgc2l6ZW9mKCpod19wcml2KSk7CiAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCiAJCWdvdG8gZXJyX291dF9mcmVlOwpAQCAtNDI1LDggKzQyNCwxNCBAQAogc3RhdGljIGludCBwcmlzbTJfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBlcnI7CiAKLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAlwcmlzbTJfaHdfY29uZmlnKGRldiwgMCk7CiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wbHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcGx4LmMKaW5kZXggNmRmYTA0MS4uZTIzNWUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wbHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BseC5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAogCXBvcyA9IDA7CiAJd2hpbGUgKHBvcyA8IENJU19NQVhfTEVOIC0gMSAmJiBjaXNbcG9zXSAhPSBDSVNUUExfRU5EKSB7Ci0JCWlmIChwb3MgKyBjaXNbcG9zICsgMV0gPj0gQ0lTX01BWF9MRU4pCisJCWlmIChwb3MgKyAyICsgY2lzW3BvcyArIDFdID4gQ0lTX01BWF9MRU4pCiAJCQlnb3RvIGNpc19lcnJvcjsKIAogCQlzd2l0Y2ggKGNpc1twb3NdKSB7CkBAIC0zOTEsNyArMzkxLDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgQ0lTVFBMX01BTkZJRDoKLQkJCWlmIChjaXNbcG9zICsgMV0gPCA1KQorCQkJaWYgKGNpc1twb3MgKyAxXSA8IDQpCiAJCQkJZ290byBjaXNfZXJyb3I7CiAJCQltYW5maWQxID0gY2lzW3BvcyArIDJdICsgKGNpc1twb3MgKyAzXSA8PCA4KTsKIAkJCW1hbmZpZDIgPSBjaXNbcG9zICsgNF0gKyAoY2lzW3BvcyArIDVdIDw8IDgpOwpAQCAtNDQ3LDEwICs0NDcsOSBAQAogCWludCB0bWQ3MTYwOwogCXN0cnVjdCBob3N0YXBfcGx4X3ByaXYgKmh3X3ByaXY7CiAKLQlod19wcml2ID0ga21hbGxvYyhzaXplb2YoKmh3X3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlod19wcml2ID0ga3phbGxvYyhzaXplb2YoKmh3X3ByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoaHdfcHJpdiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoaHdfcHJpdiwgMCwgc2l6ZW9mKCpod19wcml2KSk7CiAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCiAJCWdvdG8gZXJyX291dF9mcmVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCmluZGV4IDRlNGVhYTIuLjBlOTRmYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKQEAgLTMxNiw3ICszMTYsNyBAQAogCQkJCSAgICAgc3RydWN0IGlwdzIxMDBfZncgKmZ3KTsKIHN0YXRpYyBpbnQgaXB3MjEwMF91Y29kZV9kb3dubG9hZChzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2LAogCQkJCSAgc3RydWN0IGlwdzIxMDBfZncgKmZ3KTsKLXN0YXRpYyB2b2lkIGlwdzIxMDBfd3hfZXZlbnRfd29yayhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KTsKK3N0YXRpYyB2b2lkIGlwdzIxMDBfd3hfZXZlbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICppcHcyMTAwX3d4X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHN0cnVjdCBpd19oYW5kbGVyX2RlZiBpcHcyMTAwX3d4X2hhbmRsZXJfZGVmOwogCkBAIC02NzksNyArNjc5LDggQEAKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXNldF93b3JrLAogCQkJCQkgICBwcml2LT5yZXNldF9iYWNrb2ZmICogSFopOwogCQllbHNlCi0JCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc2V0X3dvcmspOworCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc2V0X3dvcmssCisJCQkJCSAgIDApOwogCiAJCWlmIChwcml2LT5yZXNldF9iYWNrb2ZmIDwgTUFYX1JFU0VUX0JBQ0tPRkYpCiAJCQlwcml2LT5yZXNldF9iYWNrb2ZmKys7CkBAIC0xODczLDggKzE4NzQsMTAgQEAKIAluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldF9kZXYpOwogfQogCi1zdGF0aWMgdm9pZCBpcHcyMTAwX3Jlc2V0X2FkYXB0ZXIoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGlwdzIxMDBfcmVzZXRfYWRhcHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3MjEwMF9wcml2LCByZXNldF93b3JrLndvcmspOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1ID0gewogCQkuYXBfYWRkciA9IHsKQEAgLTIwNzEsOSArMjA3NCw5IEBACiAJCXJldHVybjsKIAogCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfU0VDVVJJVFlfVVBEQVRFRCkKLQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5zZWN1cml0eV93b3JrKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnNlY3VyaXR5X3dvcmssIDApOwogCi0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT53eF9ldmVudF93b3JrKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+d3hfZXZlbnRfd29yaywgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzcl9pbmRpY2F0ZV9yZl9raWxsKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIHUzMiBzdGF0dXMpCkBAIC0yMjQzLDcgKzIyNDYsNyBAQAogCWlmIChwcml2LT5zbmFwc2hvdFswXSkKIAkJcmV0dXJuIDE7CiAJZm9yIChpID0gMDsgaSA8IDB4MzA7IGkrKykgewotCQlwcml2LT5zbmFwc2hvdFtpXSA9ICh1OCAqKSBrbWFsbG9jKDB4MTAwMCwgR0ZQX0FUT01JQyk7CisJCXByaXYtPnNuYXBzaG90W2ldID0ga21hbGxvYygweDEwMDAsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXByaXYtPnNuYXBzaG90W2ldKSB7CiAJCQlJUFdfREVCVUdfSU5GTygiJXM6IEVycm9yIGFsbG9jYXRpbmcgc25hcHNob3QgIgogCQkJCSAgICAgICAiYnVmZmVyICVkXG4iLCBwcml2LT5uZXRfZGV2LT5uYW1lLCBpKTsKQEAgLTU1MjQsOCArNTUyNywxMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGlwdzIxMDBfc2VjdXJpdHlfd29yayhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQorc3RhdGljIHZvaWQgaXB3MjEwMF9zZWN1cml0eV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHcyMTAwX3ByaXYsIHNlY3VyaXR5X3dvcmsud29yayk7CisKIAkvKiBJZiB3ZSBoYXBwZW4gdG8gaGF2ZSByZWNvbm5lY3RlZCBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvCiAJICogcHJvY2VzcyB0aGlzLCB0aGVuIHVwZGF0ZSB0aGUgc2VjdXJpdHkgc2V0dGluZ3MtLXdoaWNoIGNhdXNlcwogCSAqIGEgZGlzYXNzb2NpYXRpb24gdG8gb2NjdXIgKi8KQEAgLTU3NDgsNyArNTc1NCw3IEBACiAKIAlwcml2LT5yZXNldF9iYWNrb2ZmID0gMDsKIAltdXRleF91bmxvY2soJnByaXYtPmFjdGlvbl9tdXRleCk7Ci0JaXB3MjEwMF9yZXNldF9hZGFwdGVyKHByaXYpOworCWlwdzIxMDBfcmVzZXRfYWRhcHRlcigmcHJpdi0+cmVzZXRfd29yay53b3JrKTsKIAlyZXR1cm4gMDsKIAogICAgICAgZG9uZToKQEAgLTU4MjcsMTkgKzU4MzMsNiBAQAogCXNjaGVkdWxlX3Jlc2V0KHByaXYpOwogfQogCi0vKgotICogVE9ETzogcmVpbXBsZW1lbnQgaXQgc28gdGhhdCBpdCByZWFkcyBzdGF0aXN0aWNzCi0gKiAgICAgICBmcm9tIHRoZSBhZGFwdGVyIHVzaW5nIG9yZGluYWwgdGFibGVzCi0gKiAgICAgICBpbnN0ZWFkIG9mL2luIGFkZGl0aW9uIHRvIGNvbGxlY3RpbmcgdGhlbQotICogICAgICAgaW4gdGhlIGRyaXZlcgotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwdzIxMDBfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCXJldHVybiAmcHJpdi0+aWVlZS0+c3RhdHM7Ci19Ci0KIHN0YXRpYyBpbnQgaXB3MjEwMF93cGFfZW5hYmxlKHN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYsIGludCB2YWx1ZSkKIHsKIAkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdwYV9zdXBwbGljYW50IGxvYWRzIGFuZCBjbG9zZXMgdGhlIGRyaXZlcgpAQCAtNTkyMyw5ICs1OTE2LDEwIEBACiAJLmdldF9kcnZpbmZvID0gaXB3X2V0aHRvb2xfZ2V0X2RydmluZm8sCiB9OwogCi1zdGF0aWMgdm9pZCBpcHcyMTAwX2hhbmdfY2hlY2sodm9pZCAqYWRhcHRlcikKK3N0YXRpYyB2b2lkIGlwdzIxMDBfaGFuZ19jaGVjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IGFkYXB0ZXI7CisJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3MjEwMF9wcml2LCBoYW5nX2NoZWNrLndvcmspOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHJ0YyA9IDB4YTVhNWE1YTU7CiAJdTMyIGxlbiA9IHNpemVvZihydGMpOwpAQCAtNTk2NSw5ICs1OTU5LDEwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG93X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgaXB3MjEwMF9yZl9raWxsKHZvaWQgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBpcHcyMTAwX3JmX2tpbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBhZGFwdGVyOworCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwdzIxMDBfcHJpdiwgcmZfa2lsbC53b3JrKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvd19sb2NrLCBmbGFncyk7CkBAIC02MDIyLDcgKzYwMTcsNiBAQAogCWRldi0+b3BlbiA9IGlwdzIxMDBfb3BlbjsKIAlkZXYtPnN0b3AgPSBpcHcyMTAwX2Nsb3NlOwogCWRldi0+aW5pdCA9IGlwdzIxMDBfbmV0X2luaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSBpcHcyMTAwX3N0YXRzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmaXB3MjEwMF9ldGh0b29sX29wczsKIAlkZXYtPnR4X3RpbWVvdXQgPSBpcHcyMTAwX3R4X3RpbWVvdXQ7CiAJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZpcHcyMTAwX3d4X2hhbmRsZXJfZGVmOwpAQCAtNjExNywxNCArNjExMSwxMSBAQAogCiAJcHJpdi0+d29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7CiAKLQlJTklUX1dPUksoJnByaXYtPnJlc2V0X3dvcmssCi0JCSAgKHZvaWQgKCopKHZvaWQgKikpaXB3MjEwMF9yZXNldF9hZGFwdGVyLCBwcml2KTsKLQlJTklUX1dPUksoJnByaXYtPnNlY3VyaXR5X3dvcmssCi0JCSAgKHZvaWQgKCopKHZvaWQgKikpaXB3MjEwMF9zZWN1cml0eV93b3JrLCBwcml2KTsKLQlJTklUX1dPUksoJnByaXYtPnd4X2V2ZW50X3dvcmssCi0JCSAgKHZvaWQgKCopKHZvaWQgKikpaXB3MjEwMF93eF9ldmVudF93b3JrLCBwcml2KTsKLQlJTklUX1dPUksoJnByaXYtPmhhbmdfY2hlY2ssIGlwdzIxMDBfaGFuZ19jaGVjaywgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5yZl9raWxsLCBpcHcyMTAwX3JmX2tpbGwsIHByaXYpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5yZXNldF93b3JrLCBpcHcyMTAwX3Jlc2V0X2FkYXB0ZXIpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5zZWN1cml0eV93b3JrLCBpcHcyMTAwX3NlY3VyaXR5X3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT53eF9ldmVudF93b3JrLCBpcHcyMTAwX3d4X2V2ZW50X3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5oYW5nX2NoZWNrLCBpcHcyMTAwX2hhbmdfY2hlY2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5yZl9raWxsLCBpcHcyMTAwX3JmX2tpbGwpOwogCiAJdGFza2xldF9pbml0KCZwcml2LT5pcnFfdGFza2xldCwgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKQogCQkgICAgIGlwdzIxMDBfaXJxX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXByaXYpOwpAQCAtNjIyOSw3ICs2MjIwLDcgQEAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgVHgvUnggcXVldWVzIGFuZCBsaXN0cyAqLwogCWlmIChpcHcyMTAwX3F1ZXVlc19hbGxvY2F0ZShwcml2KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCi0JCSAgICAgICAiRXJyb3IgY2FsaWxuZyBpcHcyMTAwX3F1ZXVlc19hbGxvY2F0ZS5cbiIpOworCQkgICAgICAgIkVycm9yIGNhbGxpbmcgaXB3MjEwMF9xdWV1ZXNfYWxsb2NhdGUuXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTY0MjMsNiArNjQxNCw3IEBACiB7CiAJc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmV0X2RldjsKKwlpbnQgZXJyOwogCXUzMiB2YWw7CiAKIAlpZiAoSVBXMjEwMF9QTV9ESVNBQkxFRCkKQEAgLTY0MzMsNyArNjQyNSwxMiBAQAogCUlQV19ERUJVR19JTkZPKCIlczogQ29taW5nIG91dCBvZiBzdXNwZW5kLi4uXG4iLCBkZXYtPm5hbWUpOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIG9uIHJlc3VtZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBlcnI7CisJfQogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwogCiAJLyoKQEAgLTc1NjgsMTEgKzc1NjUsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpIHsKLQkJYnVmID0ga21hbGxvYyh3cnF1LT5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCWJ1ZiA9IGttZW1kdXAoZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGJ1ZiA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJbWVtY3B5KGJ1ZiwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKIAkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKIAkJaWVlZS0+d3BhX2llID0gYnVmOwogCQlpZWVlLT53cGFfaWVfbGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7CkBAIC04MjkwLDggKzgyODYsMTAgQEAKIAkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gaXB3MjEwMF93eF93aXJlbGVzc19zdGF0cywKIH07CiAKLXN0YXRpYyB2b2lkIGlwdzIxMDBfd3hfZXZlbnRfd29yayhzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2KQorc3RhdGljIHZvaWQgaXB3MjEwMF93eF9ldmVudF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgaXB3MjEwMF9wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHcyMTAwX3ByaXYsIHd4X2V2ZW50X3dvcmsud29yayk7CiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwogCWludCBsZW4gPSBFVEhfQUxFTjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5oCmluZGV4IDU1YjcyMjcuLmRlN2QzODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmgKQEAgLTU4MywxMSArNTgzLDExIEBACiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90YXNrbGV0OwogCiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2VjdXJpdHlfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3hfZXZlbnRfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaGFuZ19jaGVjazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmZfa2lsbDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHJlc2V0X3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzZWN1cml0eV93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd3hfZXZlbnRfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGhhbmdfY2hlY2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayByZl9raWxsOwogCiAJdTMyIGludGVycnVwdHM7CiAJaW50IHR4X2ludGVycnVwdHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKaW5kZXggMWY3NDI4MS4uMjJjYjNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwpAQCAtNzAsNyArNzAsNyBAQAogI2RlZmluZSBWUQogI2VuZGlmCiAKLSNkZWZpbmUgSVBXMjIwMF9WRVJTSU9OICIxLjEuNCIgVksgVkQgVk0gVlAgVlIgVlEKKyNkZWZpbmUgSVBXMjIwMF9WRVJTSU9OICIxLjIuMCIgVksgVkQgVk0gVlAgVlIgVlEKICNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCSJJbnRlbChSKSBQUk8vV2lyZWxlc3MgMjIwMC8yOTE1IE5ldHdvcmsgRHJpdmVyIgogI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDA2IEludGVsIENvcnBvcmF0aW9uIgogI2RlZmluZSBEUlZfVkVSU0lPTiAgICAgSVBXMjIwMF9WRVJTSU9OCkBAIC0xODcsOSArMTg3LDkgQEAKIHN0YXRpYyB2b2lkIGlwd19yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpcHdfcHJpdiAqLCBzdHJ1Y3QgaXB3X3J4X3F1ZXVlICopOwogc3RhdGljIHZvaWQgaXB3X3J4X3F1ZXVlX3JlcGxlbmlzaCh2b2lkICopOwogc3RhdGljIGludCBpcHdfdXAoc3RydWN0IGlwd19wcml2ICopOwotc3RhdGljIHZvaWQgaXB3X2JnX3VwKHZvaWQgKik7CitzdGF0aWMgdm9pZCBpcHdfYmdfdXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIGlwd19kb3duKHN0cnVjdCBpcHdfcHJpdiAqKTsKLXN0YXRpYyB2b2lkIGlwd19iZ19kb3duKHZvaWQgKik7CitzdGF0aWMgdm9pZCBpcHdfYmdfZG93bihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIGludCBpcHdfY29uZmlnKHN0cnVjdCBpcHdfcHJpdiAqKTsKIHN0YXRpYyBpbnQgaW5pdF9zdXBwb3J0ZWRfcmF0ZXMoc3RydWN0IGlwd19wcml2ICpwcml2LAogCQkJCXN0cnVjdCBpcHdfc3VwcG9ydGVkX3JhdGVzICpwcmF0ZXMpOwpAQCAtODYyLDExICs4NjIsMTIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19iZ19sZWRfbGlua19vbih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXB3X2JnX2xlZF9saW5rX29uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3X3ByaXYsIGxlZF9saW5rX29uLndvcmspOwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpcHdfbGVkX2xpbmtfb24oZGF0YSk7CisJaXB3X2xlZF9saW5rX29uKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC05MDYsMTEgKzkwNywxMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgaXB3X2JnX2xlZF9saW5rX29mZih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXB3X2JnX2xlZF9saW5rX29mZihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGlwd19wcml2ICpwcml2ID0gZGF0YTsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwd19wcml2LCBsZWRfbGlua19vZmYud29yayk7CiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlwd19sZWRfbGlua19vZmYoZGF0YSk7CisJaXB3X2xlZF9saW5rX29mZihwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIApAQCAtOTg1LDExICs5ODcsMTIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19iZ19sZWRfYWN0aXZpdHlfb2ZmKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpcHdfYmdfbGVkX2FjdGl2aXR5X29mZihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGlwd19wcml2ICpwcml2ID0gZGF0YTsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwd19wcml2LCBsZWRfYWN0X29mZi53b3JrKTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXB3X2xlZF9hY3Rpdml0eV9vZmYoZGF0YSk7CisJaXB3X2xlZF9hY3Rpdml0eV9vZmYocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKQEAgLTIyMjgsMTEgKzIyMzEsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19iZ19hZGFwdGVyX3Jlc3RhcnQodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGlwd19iZ19hZGFwdGVyX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgYWRhcHRlcl9yZXN0YXJ0KTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXB3X2FkYXB0ZXJfcmVzdGFydChkYXRhKTsKKwlpcHdfYWRhcHRlcl9yZXN0YXJ0KHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC0yMjQ5LDExICsyMjUzLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpcHdfYmdfc2Nhbl9jaGVjayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXB3X2JnX3NjYW5fY2hlY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgc2Nhbl9jaGVjay53b3JrKTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXB3X3NjYW5fY2hlY2soZGF0YSk7CisJaXB3X3NjYW5fY2hlY2socHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKQEAgLTM4MzEsMTcgKzM4MzYsMTkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgaXB3X2JnX2Rpc2Fzc29jaWF0ZSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXB3X2JnX2Rpc2Fzc29jaWF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGlwd19wcml2ICpwcml2ID0gZGF0YTsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwd19wcml2LCBkaXNhc3NvY2lhdGUpOwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpcHdfZGlzYXNzb2NpYXRlKGRhdGEpOworCWlwd19kaXNhc3NvY2lhdGUocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19zeXN0ZW1fY29uZmlnKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpcHdfc3lzdGVtX2NvbmZpZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGlwd19wcml2ICpwcml2ID0gZGF0YTsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwd19wcml2LCBzeXN0ZW1fY29uZmlnKTsKIAogI2lmZGVmIENPTkZJR19JUFcyMjAwX1BST01JU0NVT1VTCiAJaWYgKHByaXYtPnByb21fbmV0X2RldiAmJiBuZXRpZl9ydW5uaW5nKHByaXYtPnByb21fbmV0X2RldikpIHsKQEAgLTQyMDgsMTEgKzQyMTUsMTIgQEAKIAkJCSAgIElQV19TVEFUU19JTlRFUlZBTCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19iZ19nYXRoZXJfc3RhdHModm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGlwd19iZ19nYXRoZXJfc3RhdHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgZ2F0aGVyX3N0YXRzLndvcmspOwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpcHdfZ2F0aGVyX3N0YXRzKGRhdGEpOworCWlwd19nYXRoZXJfc3RhdHMocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKQEAgLTQyNjgsOCArNDI3Niw4IEBACiAJCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19ST0FNSU5HKSkgewogCQkJcHJpdi0+c3RhdHVzIHw9IFNUQVRVU19ST0FNSU5HOwogCQkJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX1NDQU5OSU5HKSkKLQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKLQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2Nhbik7CisJCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4sIDApOwogCQl9CiAJCXJldHVybjsKIAl9CkBAIC00NjA3LDggKzQ2MTUsOCBAQAogI2lmZGVmIENPTkZJR19JUFcyMjAwX01PTklUT1IKIAkJCWlmIChwcml2LT5pZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgewogCQkJCXByaXYtPnN0YXR1cyB8PSBTVEFUVVNfU0NBTl9GT1JDRUQ7Ci0JCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsCi0JCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4pOworCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsCisJCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuLCAwKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCXByaXYtPnN0YXR1cyAmPSB+U1RBVFVTX1NDQU5fRk9SQ0VEOwpAQCAtNDYzMSw4ICs0NjM5LDggQEAKIAkJCQkJLyogRG9uJ3Qgc2NoZWR1bGUgaWYgd2UgYWJvcnRlZCB0aGUgc2NhbiAqLwogCQkJCQlwcml2LT5zdGF0dXMgJj0gflNUQVRVU19ST0FNSU5HOwogCQkJfSBlbHNlIGlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfU0NBTl9QRU5ESU5HKQotCQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLAotCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuKTsKKwkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLAorCQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2NhbiwgMCk7CiAJCQllbHNlIGlmIChwcml2LT5jb25maWcgJiBDRkdfQkFDS0dST1VORF9TQ0FOCiAJCQkJICYmIHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKQogCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsCkBAIC01MDU1LDExICs1MDYzLDEyIEBACiAJaXB3X3J4X3F1ZXVlX3Jlc3RvY2socHJpdik7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19iZ19yeF9xdWV1ZV9yZXBsZW5pc2godm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGlwd19iZ19yeF9xdWV1ZV9yZXBsZW5pc2goc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgcnhfcmVwbGVuaXNoKTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXB3X3J4X3F1ZXVlX3JlcGxlbmlzaChkYXRhKTsKKwlpcHdfcnhfcXVldWVfcmVwbGVuaXNoKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC01NDg5LDkgKzU0OTgsMTAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgaXB3X21lcmdlX2FkaG9jX25ldHdvcmsodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGlwd19tZXJnZV9hZGhvY19uZXR3b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3X3ByaXYsIG1lcmdlX25ldHdvcmtzKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmsgPSBOVUxMOwogCXN0cnVjdCBpcHdfbmV0d29ya19tYXRjaCBtYXRjaCA9IHsKIAkJLm5ldHdvcmsgPSBwcml2LT5hc3NvY19uZXR3b3JrCkBAIC01OTQ4LDExICs1OTU4LDEyIEBACiAJCQkgICBwcml2LT5hc3NvY19yZXF1ZXN0LmJlYWNvbl9pbnRlcnZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19iZ19hZGhvY19jaGVjayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXB3X2JnX2FkaG9jX2NoZWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3X3ByaXYsIGFkaG9jX2NoZWNrLndvcmspOwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpcHdfYWRob2NfY2hlY2soZGF0YSk7CisJaXB3X2FkaG9jX2NoZWNrKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC02Mjk5LDE5ICs2MzEwLDI2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBpcHdfcmVxdWVzdF9wYXNzaXZlX3NjYW4oc3RydWN0IGlwd19wcml2ICpwcml2KSB7Ci0gIAlyZXR1cm4gaXB3X3JlcXVlc3Rfc2Nhbl9oZWxwZXIocHJpdiwgSVdfU0NBTl9UWVBFX1BBU1NJVkUpOwotfQotCi1zdGF0aWMgaW50IGlwd19yZXF1ZXN0X3NjYW4oc3RydWN0IGlwd19wcml2ICpwcml2KSB7Ci0JcmV0dXJuIGlwd19yZXF1ZXN0X3NjYW5faGVscGVyKHByaXYsIElXX1NDQU5fVFlQRV9BQ1RJVkUpOwotfQotCi1zdGF0aWMgdm9pZCBpcHdfYmdfYWJvcnRfc2Nhbih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXB3X3JlcXVlc3RfcGFzc2l2ZV9zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3X3ByaXYsIHJlcXVlc3RfcGFzc2l2ZV9zY2FuKTsKKyAgCWlwd19yZXF1ZXN0X3NjYW5faGVscGVyKHByaXYsIElXX1NDQU5fVFlQRV9QQVNTSVZFKTsKK30KKworc3RhdGljIHZvaWQgaXB3X3JlcXVlc3Rfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgcmVxdWVzdF9zY2FuLndvcmspOworCWlwd19yZXF1ZXN0X3NjYW5faGVscGVyKHByaXYsIElXX1NDQU5fVFlQRV9BQ1RJVkUpOworfQorCitzdGF0aWMgdm9pZCBpcHdfYmdfYWJvcnRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgYWJvcnRfc2Nhbik7CiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlwd19hYm9ydF9zY2FuKGRhdGEpOworCWlwd19hYm9ydF9zY2FuKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC02OTIwLDggKzY5MzgsOCBAQAogfQogCiAvKgotKiBoYW5kbGluZyB0aGUgYmVhY29uaW5nIHJlc3BvbmNlcy4gaWYgd2UgZ2V0IGRpZmZlcmVudCBRb1Mgc2V0dGluZwotKiBvZiB0aGUgbmV0d29yayBmcm9tIHRoZSB0aGUgYXNzb2NpYXRlZCBzZXR0aW5nIGFkanVzdCB0aGUgUW9TCisqIGhhbmRsaW5nIHRoZSBiZWFjb25pbmcgcmVzcG9uc2VzLiBpZiB3ZSBnZXQgZGlmZmVyZW50IFFvUyBzZXR0aW5nCisqIG9mZiB0aGUgbmV0d29yayBmcm9tIHRoZSBhc3NvY2lhdGVkIHNldHRpbmcsIGFkanVzdCB0aGUgUW9TCiAqIHNldHRpbmcKICovCiBzdGF0aWMgaW50IGlwd19xb3NfYXNzb2NpYXRpb25fcmVzcChzdHJ1Y3QgaXB3X3ByaXYgKnByaXYsCkBAIC03MDg0LDkgKzcxMDIsMTAgQEAKIC8qCiAqIGJhY2tncm91bmQgc3VwcG9ydCB0byBydW4gUW9TIGFjdGl2YXRlIGZ1bmN0aW9uYWxpdHkKICovCi1zdGF0aWMgdm9pZCBpcHdfYmdfcW9zX2FjdGl2YXRlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpcHdfYmdfcW9zX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3X3ByaXYsIHFvc19hY3RpdmF0ZSk7CiAKIAlpZiAocHJpdiA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC03Mzk0LDExICs3NDEzLDEyIEBACiAJcHJpdi0+c3RhdHVzICY9IH5TVEFUVVNfUk9BTUlORzsKIH0KIAotc3RhdGljIHZvaWQgaXB3X2JnX3JvYW0odm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGlwd19iZ19yb2FtKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3X3ByaXYsIHJvYW0pOwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpcHdfcm9hbShkYXRhKTsKKwlpcHdfcm9hbShwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIApAQCAtNzQ3OSw4ICs3NDk5LDggQEAKIAkJCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4sCiAJCQkJCQkgICBTQ0FOX0lOVEVSVkFMKTsKIAkJCWVsc2UKLQkJCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwKLQkJCQkJICAgJnByaXYtPnJlcXVlc3Rfc2Nhbik7CisJCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwKKwkJCQkJCSAgICZwcml2LT5yZXF1ZXN0X3NjYW4sIDApOwogCQl9CiAKIAkJcmV0dXJuIDA7CkBAIC03NDkxLDExICs3NTExLDEyIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19iZ19hc3NvY2lhdGUodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGlwd19iZ19hc3NvY2lhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgYXNzb2NpYXRlKTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXB3X2Fzc29jaWF0ZShkYXRhKTsKKwlpcHdfYXNzb2NpYXRlKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC03NjU2LDcgKzc2NzcsOCBAQAogCiAJLyogQmlnIGJpdGZpZWxkIG9mIGFsbCB0aGUgZmllbGRzIHdlIHByb3ZpZGUgaW4gcmFkaW90YXAgKi8KIAlpcHdfcnQtPnJ0X2hkci5pdF9wcmVzZW50ID0KLQkgICAgKCgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUykgfAorCSAgICAoKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpIHwKKwkgICAgICgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUykgfAogCSAgICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpIHwKIAkgICAgICgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMKSB8CiAJICAgICAoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCkgfApAQCAtNzY2NSwxMCArNzY4NywxNCBAQAogCiAJLyogWmVybyB0aGUgZmxhZ3MsIHdlJ2xsIGFkZCB0byB0aGVtIGFzIHdlIGdvICovCiAJaXB3X3J0LT5ydF9mbGFncyA9IDA7Ci0JaXB3X3J0LT5ydF90c2YgPSAwVUxMOworCWlwd19ydC0+cnRfdHNmID0gKHU2NCkoZnJhbWUtPnBhcmVudF90c2ZbM10gPDwgMjQgfAorCQkJICAgICAgIGZyYW1lLT5wYXJlbnRfdHNmWzJdIDw8IDE2IHwKKwkJCSAgICAgICBmcmFtZS0+cGFyZW50X3RzZlsxXSA8PCA4ICB8CisJCQkgICAgICAgZnJhbWUtPnBhcmVudF90c2ZbMF0pOwogCiAJLyogQ29udmVydCBzaWduYWwgdG8gREJNICovCiAJaXB3X3J0LT5ydF9kYm1zaWduYWwgPSBhbnRzaWduYWw7CisJaXB3X3J0LT5ydF9kYm1ub2lzZSA9IGZyYW1lLT5ub2lzZTsKIAogCS8qIENvbnZlcnQgdGhlIGNoYW5uZWwgZGF0YSBhbmQgc2V0IHRoZSBmbGFncyAqLwogCWlwd19ydC0+cnRfY2hhbm5lbCA9IGNwdV90b19sZTE2KGllZWU4MDIxMWNoYW4ybWh6KHJlY2VpdmVkX2NoYW5uZWwpKTsKQEAgLTc4NjgsNyArNzg5NCw4IEBACiAKIAkvKiBCaWcgYml0ZmllbGQgb2YgYWxsIHRoZSBmaWVsZHMgd2UgcHJvdmlkZSBpbiByYWRpb3RhcCAqLwogCWlwd19ydC0+cnRfaGRyLml0X3ByZXNlbnQgPQotCSAgICAoKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTKSB8CisJICAgICgoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCkgfAorCSAgICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTKSB8CiAJICAgICAoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkgfAogCSAgICAgKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUwpIHwKIAkgICAgICgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMKSB8CkBAIC03ODc3LDcgKzc5MDQsMTAgQEAKIAogCS8qIFplcm8gdGhlIGZsYWdzLCB3ZSdsbCBhZGQgdG8gdGhlbSBhcyB3ZSBnbyAqLwogCWlwd19ydC0+cnRfZmxhZ3MgPSAwOwotCWlwd19ydC0+cnRfdHNmID0gMFVMTDsKKwlpcHdfcnQtPnJ0X3RzZiA9ICh1NjQpKGZyYW1lLT5wYXJlbnRfdHNmWzNdIDw8IDI0IHwKKwkJCSAgICAgICBmcmFtZS0+cGFyZW50X3RzZlsyXSA8PCAxNiB8CisJCQkgICAgICAgZnJhbWUtPnBhcmVudF90c2ZbMV0gPDwgOCAgfAorCQkJICAgICAgIGZyYW1lLT5wYXJlbnRfdHNmWzBdKTsKIAogCS8qIENvbnZlcnQgdG8gREJNICovCiAJaXB3X3J0LT5ydF9kYm1zaWduYWwgPSBzaWduYWw7CkBAIC04Mjc2LDcgKzgzMDYsNyBAQAogCQkJCSAgICAoIk5vdGlmaWNhdGlvbjogc3VidHlwZT0lMDJYIGZsYWdzPSUwMlggc2l6ZT0lZFxuIiwKIAkJCQkgICAgIHBrdC0+dS5ub3RpZmljYXRpb24uc3VidHlwZSwKIAkJCQkgICAgIHBrdC0+dS5ub3RpZmljYXRpb24uZmxhZ3MsCi0JCQkJICAgICBwa3QtPnUubm90aWZpY2F0aW9uLnNpemUpOworCQkJCSAgICAgbGUxNl90b19jcHUocGt0LT51Lm5vdGlmaWNhdGlvbi5zaXplKSk7CiAJCQkJaXB3X3J4X25vdGlmaWNhdGlvbihwcml2LCAmcGt0LT51Lm5vdGlmaWNhdGlvbik7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC05NDEwLDcgKzk0NDAsNyBAQAogCiAJSVBXX0RFQlVHX1dYKCJTdGFydCBzY2FuXG4iKTsKIAotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVxdWVzdF9zY2FuKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVxdWVzdF9zY2FuLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA1NDcsMTEgKzEwNTc3LDEyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBpcHdfYmdfcmZfa2lsbCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXB3X2JnX3JmX2tpbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgcmZfa2lsbC53b3JrKTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXB3X3JmX2tpbGwoZGF0YSk7CisJaXB3X3JmX2tpbGwocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKQEAgLTEwNTgyLDExICsxMDYxMywxMiBAQAogCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVxdWVzdF9zY2FuLCBIWik7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19iZ19saW5rX3VwKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpcHdfYmdfbGlua191cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGlwd19wcml2ICpwcml2ID0gZGF0YTsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwd19wcml2LCBsaW5rX3VwKTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXB3X2xpbmtfdXAoZGF0YSk7CisJaXB3X2xpbmtfdXAocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKQEAgLTEwNjA2LDE1ICsxMDYzOCwxNiBAQAogCiAJaWYgKCEocHJpdi0+c3RhdHVzICYgU1RBVFVTX0VYSVRfUEVORElORykpIHsKIAkJLyogUXVldWUgdXAgYW5vdGhlciBzY2FuLi4uICovCi0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVxdWVzdF9zY2FuKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlcXVlc3Rfc2NhbiwgMCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBpcHdfYmdfbGlua19kb3duKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpcHdfYmdfbGlua19kb3duKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBkYXRhOworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXB3X3ByaXYsIGxpbmtfZG93bik7CiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlwd19saW5rX2Rvd24oZGF0YSk7CisJaXB3X2xpbmtfZG93bihwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIApAQCAtMTA2MjYsMzggKzEwNjU5LDMwIEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT53YWl0X3N0YXRlKTsKIAotCUlOSVRfV09SSygmcHJpdi0+YWRob2NfY2hlY2ssIGlwd19iZ19hZGhvY19jaGVjaywgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5hc3NvY2lhdGUsIGlwd19iZ19hc3NvY2lhdGUsIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+ZGlzYXNzb2NpYXRlLCBpcHdfYmdfZGlzYXNzb2NpYXRlLCBwcml2KTsKLQlJTklUX1dPUksoJnByaXYtPnN5c3RlbV9jb25maWcsIGlwd19zeXN0ZW1fY29uZmlnLCBwcml2KTsKLQlJTklUX1dPUksoJnByaXYtPnJ4X3JlcGxlbmlzaCwgaXB3X2JnX3J4X3F1ZXVlX3JlcGxlbmlzaCwgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5hZGFwdGVyX3Jlc3RhcnQsIGlwd19iZ19hZGFwdGVyX3Jlc3RhcnQsIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+cmZfa2lsbCwgaXB3X2JnX3JmX2tpbGwsIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+dXAsICh2b2lkICgqKSh2b2lkICopKWlwd19iZ191cCwgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5kb3duLCAodm9pZCAoKikodm9pZCAqKSlpcHdfYmdfZG93biwgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5yZXF1ZXN0X3NjYW4sCi0JCSAgKHZvaWQgKCopKHZvaWQgKikpaXB3X3JlcXVlc3Rfc2NhbiwgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5yZXF1ZXN0X3Bhc3NpdmVfc2NhbiwKLQkJICAodm9pZCAoKikodm9pZCAqKSlpcHdfcmVxdWVzdF9wYXNzaXZlX3NjYW4sIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+Z2F0aGVyX3N0YXRzLAotCQkgICh2b2lkICgqKSh2b2lkICopKWlwd19iZ19nYXRoZXJfc3RhdHMsIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+YWJvcnRfc2NhbiwgKHZvaWQgKCopKHZvaWQgKikpaXB3X2JnX2Fib3J0X3NjYW4sIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+cm9hbSwgaXB3X2JnX3JvYW0sIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+c2Nhbl9jaGVjaywgaXB3X2JnX3NjYW5fY2hlY2ssIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+bGlua191cCwgKHZvaWQgKCopKHZvaWQgKikpaXB3X2JnX2xpbmtfdXAsIHByaXYpOwotCUlOSVRfV09SSygmcHJpdi0+bGlua19kb3duLCAodm9pZCAoKikodm9pZCAqKSlpcHdfYmdfbGlua19kb3duLCBwcml2KTsKLQlJTklUX1dPUksoJnByaXYtPmxlZF9saW5rX29uLCAodm9pZCAoKikodm9pZCAqKSlpcHdfYmdfbGVkX2xpbmtfb24sCi0JCSAgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5sZWRfbGlua19vZmYsICh2b2lkICgqKSh2b2lkICopKWlwd19iZ19sZWRfbGlua19vZmYsCi0JCSAgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5sZWRfYWN0X29mZiwgKHZvaWQgKCopKHZvaWQgKikpaXB3X2JnX2xlZF9hY3Rpdml0eV9vZmYsCi0JCSAgcHJpdik7Ci0JSU5JVF9XT1JLKCZwcml2LT5tZXJnZV9uZXR3b3JrcywKLQkJICAodm9pZCAoKikodm9pZCAqKSlpcHdfbWVyZ2VfYWRob2NfbmV0d29yaywgcHJpdik7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmFkaG9jX2NoZWNrLCBpcHdfYmdfYWRob2NfY2hlY2spOworCUlOSVRfV09SSygmcHJpdi0+YXNzb2NpYXRlLCBpcHdfYmdfYXNzb2NpYXRlKTsKKwlJTklUX1dPUksoJnByaXYtPmRpc2Fzc29jaWF0ZSwgaXB3X2JnX2Rpc2Fzc29jaWF0ZSk7CisJSU5JVF9XT1JLKCZwcml2LT5zeXN0ZW1fY29uZmlnLCBpcHdfc3lzdGVtX2NvbmZpZyk7CisJSU5JVF9XT1JLKCZwcml2LT5yeF9yZXBsZW5pc2gsIGlwd19iZ19yeF9xdWV1ZV9yZXBsZW5pc2gpOworCUlOSVRfV09SSygmcHJpdi0+YWRhcHRlcl9yZXN0YXJ0LCBpcHdfYmdfYWRhcHRlcl9yZXN0YXJ0KTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+cmZfa2lsbCwgaXB3X2JnX3JmX2tpbGwpOworCUlOSVRfV09SSygmcHJpdi0+dXAsIGlwd19iZ191cCk7CisJSU5JVF9XT1JLKCZwcml2LT5kb3duLCBpcHdfYmdfZG93bik7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnJlcXVlc3Rfc2NhbiwgaXB3X3JlcXVlc3Rfc2Nhbik7CisJSU5JVF9XT1JLKCZwcml2LT5yZXF1ZXN0X3Bhc3NpdmVfc2NhbiwgaXB3X3JlcXVlc3RfcGFzc2l2ZV9zY2FuKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+Z2F0aGVyX3N0YXRzLCBpcHdfYmdfZ2F0aGVyX3N0YXRzKTsKKwlJTklUX1dPUksoJnByaXYtPmFib3J0X3NjYW4sIGlwd19iZ19hYm9ydF9zY2FuKTsKKwlJTklUX1dPUksoJnByaXYtPnJvYW0sIGlwd19iZ19yb2FtKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+c2Nhbl9jaGVjaywgaXB3X2JnX3NjYW5fY2hlY2spOworCUlOSVRfV09SSygmcHJpdi0+bGlua191cCwgaXB3X2JnX2xpbmtfdXApOworCUlOSVRfV09SSygmcHJpdi0+bGlua19kb3duLCBpcHdfYmdfbGlua19kb3duKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+bGVkX2xpbmtfb24sIGlwd19iZ19sZWRfbGlua19vbik7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmxlZF9saW5rX29mZiwgaXB3X2JnX2xlZF9saW5rX29mZik7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmxlZF9hY3Rfb2ZmLCBpcHdfYmdfbGVkX2FjdGl2aXR5X29mZik7CisJSU5JVF9XT1JLKCZwcml2LT5tZXJnZV9uZXR3b3JrcywgaXB3X21lcmdlX2FkaG9jX25ldHdvcmspOwogCiAjaWZkZWYgQ09ORklHX0lQVzIyMDBfUU9TCi0JSU5JVF9XT1JLKCZwcml2LT5xb3NfYWN0aXZhdGUsICh2b2lkICgqKSh2b2lkICopKWlwd19iZ19xb3NfYWN0aXZhdGUsCi0JCSAgcHJpdik7CisJSU5JVF9XT1JLKCZwcml2LT5xb3NfYWN0aXZhdGUsIGlwd19iZ19xb3NfYWN0aXZhdGUpOwogI2VuZGlmCQkJCS8qIENPTkZJR19JUFcyMjAwX1FPUyAqLwogCiAJdGFza2xldF9pbml0KCZwcml2LT5pcnFfdGFza2xldCwgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKQpAQCAtMTExMjksMTQgKzExMTU0LDEzIEBACiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGNtZGxvZyAmJiAhcHJpdi0+Y21kbG9nKSB7Ci0JCXByaXYtPmNtZGxvZyA9IGttYWxsb2Moc2l6ZW9mKCpwcml2LT5jbWRsb2cpICogY21kbG9nLAorCQlwcml2LT5jbWRsb2cgPSBrY2FsbG9jKGNtZGxvZywgc2l6ZW9mKCpwcml2LT5jbWRsb2cpLAogCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKIAkJaWYgKHByaXYtPmNtZGxvZyA9PSBOVUxMKSB7CiAJCQlJUFdfRVJST1IoIkVycm9yIGFsbG9jYXRpbmcgJWQgY29tbWFuZCBsb2cgZW50cmllcy5cbiIsCiAJCQkJICBjbWRsb2cpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZSB7Ci0JCQltZW1zZXQocHJpdi0+Y21kbG9nLCAwLCBzaXplb2YoKnByaXYtPmNtZGxvZykgKiBjbWRsb2cpOwogCQkJcHJpdi0+Y21kbG9nX2xlbiA9IGNtZGxvZzsKIAkJfQogCX0KQEAgLTExMTkwLDcgKzExMjE0LDggQEAKIAogCQkJLyogSWYgY29uZmlndXJlIHRvIHRyeSBhbmQgYXV0by1hc3NvY2lhdGUsIGtpY2sKIAkJCSAqIG9mZiBhIHNjYW4uICovCi0JCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlcXVlc3Rfc2Nhbik7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLAorCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuLCAwKTsKIAogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTExMjExLDExICsxMTIzNiwxMiBAQAogCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgdm9pZCBpcHdfYmdfdXAodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGlwd19iZ191cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGlwd19wcml2ICpwcml2ID0gZGF0YTsKKwlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwd19wcml2LCB1cCk7CiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlwd191cChkYXRhKTsKKwlpcHdfdXAocHJpdik7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CiB9CiAKQEAgLTExMjgyLDExICsxMTMwOCwxMiBAQAogCWlwd19sZWRfcmFkaW9fb2ZmKHByaXYpOwogfQogCi1zdGF0aWMgdm9pZCBpcHdfYmdfZG93bih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXB3X2JnX2Rvd24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGlwd19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcHdfcHJpdiwgZG93bik7CiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlwd19kb3duKGRhdGEpOworCWlwd19kb3duKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC0xMTcyNywxMiArMTE3NTQsMTggQEAKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPm5ldF9kZXY7CisJaW50IGVycjsKIAl1MzIgdmFsOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbWluZyBvdXQgb2Ygc3VzcGVuZC4uLlxuIiwgZGV2LT5uYW1lKTsKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmgKaW5kZXggZGFkNWVlZC4uNjI2YTI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuaApAQCAtMTI5MCwyMSArMTI5MCwyMSBAQAogCiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKIAotCXN0cnVjdCB3b3JrX3N0cnVjdCBhZGhvY19jaGVjazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFkaG9jX2NoZWNrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGU7CiAJc3RydWN0IHdvcmtfc3RydWN0IGRpc2Fzc29jaWF0ZTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3lzdGVtX2NvbmZpZzsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnhfcmVwbGVuaXNoOwotCXN0cnVjdCB3b3JrX3N0cnVjdCByZXF1ZXN0X3NjYW47CisJc3RydWN0IGRlbGF5ZWRfd29yayByZXF1ZXN0X3NjYW47CiAgIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVxdWVzdF9wYXNzaXZlX3NjYW47CiAJc3RydWN0IHdvcmtfc3RydWN0IGFkYXB0ZXJfcmVzdGFydDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmZfa2lsbDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHJmX2tpbGw7CiAJc3RydWN0IHdvcmtfc3RydWN0IHVwOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBkb3duOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBnYXRoZXJfc3RhdHM7CisJc3RydWN0IGRlbGF5ZWRfd29yayBnYXRoZXJfc3RhdHM7CiAJc3RydWN0IHdvcmtfc3RydWN0IGFib3J0X3NjYW47CiAJc3RydWN0IHdvcmtfc3RydWN0IHJvYW07Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHNjYW5fY2hlY2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzY2FuX2NoZWNrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX3VwOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX2Rvd247CiAKQEAgLTEzMTksOSArMTMxOSw5IEBACiAJdTMyIGxlZF9vZmRtX29uOwogCXUzMiBsZWRfb2ZkbV9vZmY7CiAKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGVkX2xpbmtfb247Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGxlZF9saW5rX29mZjsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGVkX2FjdF9vZmY7CisJc3RydWN0IGRlbGF5ZWRfd29yayBsZWRfbGlua19vbjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGxlZF9saW5rX29mZjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGxlZF9hY3Rfb2ZmOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBtZXJnZV9uZXR3b3JrczsKIAogCXN0cnVjdCBpcHdfY21kX2xvZyAqY21kbG9nOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCmluZGV4IDY3MTRlMGQuLjY0NGI0NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKQEAgLTczNSwxMCArNzM1LDcgQEAKIHN0YXRpYyBpbnQgbmV0d2F2ZV9wY21jaWFfY29uZmlnKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKSB7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICB0dXBsZV90IHR1cGxlOwotICAgIGNpc3BhcnNlX3QgcGFyc2U7CiAgICAgaW50IGksIGosIGxhc3RfcmV0LCBsYXN0X2ZuOwotICAgIHVfY2hhciBidWZbNjRdOwogICAgIHdpbl9yZXFfdCByZXE7CiAgICAgbWVtcmVxX3QgbWVtOwogICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gTlVMTDsKQEAgLTc0NiwyMSArNzQzLDYgQEAKICAgICBERUJVRygwLCAibmV0d2F2ZV9wY21jaWFfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAogICAgIC8qCi0gICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLSAgICAgIHJlZ2lzdGVycy4KLSAgICAqLwotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKikgYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0gICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKSk7Ci0gICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7Ci0gICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOwotCi0gICAgLyoKICAgICAgKiAgVHJ5IGFsbG9jYXRpbmcgSU8gcG9ydHMuICBUaGlzIHRyaWVzIGEgZmV3IGZpeGVkIGFkZHJlc3Nlcy4KICAgICAgKiAgSWYgeW91IHdhbnQsIHlvdSBjYW4gYWxzbyByZWFkIHRoZSBjYXJkJ3MgY29uZmlnIHRhYmxlIHRvCiAgICAgICogIHBpY2sgYWRkcmVzc2VzIC0tIHNlZSB0aGUgc2VyaWFsIGRyaXZlciBmb3IgYW4gZXhhbXBsZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwppbmRleCBiNzc5YzdkLi45MzZjODg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCkBAIC05ODAsOSArOTgwLDExIEBACiB9CiAKIC8qIFNlYXJjaCBzY2FuIHJlc3VsdHMgZm9yIHJlcXVlc3RlZCBCU1NJRCwgam9pbiBpdCBpZiBmb3VuZCAqLwotc3RhdGljIHZvaWQgb3Jpbm9jb19qb2luX2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBvcmlub2NvX2pvaW5fYXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG9yaW5vY29fcHJpdmF0ZSwgam9pbl93b3JrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmRldjsKIAlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMDU1LDkgKzEwNTcsMTEgQEAKIH0KIAogLyogU2VuZCBuZXcgQlNTSUQgdG8gdXNlcnNwYWNlICovCi1zdGF0aWMgdm9pZCBvcmlub2NvX3NlbmRfd2V2ZW50cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgb3Jpbm9jb19zZW5kX3dldmVudHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG9yaW5vY29fcHJpdmF0ZSwgd2V2ZW50X3dvcmspOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5uZGV2OwogCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAlpbnQgZXJyOwpAQCAtMTg2NCw5ICsxODY4LDExIEBACiAKIC8qIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQsIHdpdGhvdXQgbG9ja3MgaGVsZCAtIHVzZQogICogc2NoZWR1bGVfd29yaygpICovCi1zdGF0aWMgdm9pZCBvcmlub2NvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBvcmlub2NvX3Jlc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvcmlub2NvX3ByaXZhdGUsIHJlc2V0X3dvcmspOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5uZGV2OwogCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OwogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI0MzQsOSArMjQ0MCw5IEBACiAJcHJpdi0+aHdfdW5hdmFpbGFibGUgPSAxOyAvKiBvcmlub2NvX2luaXQoKSBtdXN0IGNsZWFyIHRoaXMKIAkJCQkgICAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvdWNoZXMgdGhlCiAJCQkJICAgKiBoYXJkd2FyZSAqLwotCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd29yaywgKHZvaWQgKCopKHZvaWQgKikpb3Jpbm9jb19yZXNldCwgZGV2KTsKLQlJTklUX1dPUksoJnByaXYtPmpvaW5fd29yaywgKHZvaWQgKCopKHZvaWQgKikpb3Jpbm9jb19qb2luX2FwLCBkZXYpOwotCUlOSVRfV09SSygmcHJpdi0+d2V2ZW50X3dvcmssICh2b2lkICgqKSh2b2lkICopKW9yaW5vY29fc2VuZF93ZXZlbnRzLCBkZXYpOworCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd29yaywgb3Jpbm9jb19yZXNldCk7CisJSU5JVF9XT1JLKCZwcml2LT5qb2luX3dvcmssIG9yaW5vY29fam9pbl9hcCk7CisJSU5JVF9XT1JLKCZwcml2LT53ZXZlbnRfd29yaywgb3Jpbm9jb19zZW5kX3dldmVudHMpOwogCiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAlwcml2LT5sYXN0X2xpbmtzdGF0dXMgPSAweGZmZmY7CkBAIC0yNDU3LDYgKzI0NjMsNyBAQAogLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKiBSZXR1cm4gOiA8IDAgLT4gZXJyb3IgY29kZSA7ID49IDAgLT4gbGVuZ3RoICovCiBzdGF0aWMgaW50IG9yaW5vY29faHdfZ2V0X2Vzc2lkKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsIGludCAqYWN0aXZlLAogCQkJCWNoYXIgYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdKQogewpAQCAtMjUwMSw5ICsyNTA4LDkgQEAKIAlsZW4gPSBsZTE2X3RvX2NwdShlc3NpZGJ1Zi5sZW4pOwogCUJVR19PTihsZW4gPiBJV19FU1NJRF9NQVhfU0laRSk7CiAKLQltZW1zZXQoYnVmLCAwLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwltZW1zZXQoYnVmLCAwLCBJV19FU1NJRF9NQVhfU0laRSk7CiAJbWVtY3B5KGJ1ZiwgcCwgbGVuKTsKLQlidWZbbGVuXSA9ICdcMCc7CisJZXJyID0gbGVuOwogCiAgZmFpbF91bmxvY2s6CiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKQEAgLTMwMjcsMTcgKzMwMzQsMTggQEAKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJZXJyID0gb3Jpbm9jb19od19nZXRfZXNzaWQocHJpdiwgJmFjdGl2ZSwgZXNzaWRidWYpOwotCQlpZiAoZXJyKQorCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CisJCWVycS0+bGVuZ3RoID0gZXJyOwogCX0gZWxzZSB7CiAJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQogCQkJcmV0dXJuIC1FQlVTWTsKLQkJbWVtY3B5KGVzc2lkYnVmLCBwcml2LT5kZXNpcmVkX2Vzc2lkLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOworCQltZW1jcHkoZXNzaWRidWYsIHByaXYtPmRlc2lyZWRfZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJZXJxLT5sZW5ndGggPSBzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCk7CiAJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAJfQogCiAJZXJxLT5mbGFncyA9IDE7Ci0JZXJxLT5sZW5ndGggPSBzdHJsZW4oZXNzaWRidWYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMDc1LDEwICszMDgzLDEwIEBACiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCXJldHVybiAtRUJVU1k7CiAKLQltZW1jcHkobmlja2J1ZiwgcHJpdi0+bmljaywgSVdfRVNTSURfTUFYX1NJWkUrMSk7CisJbWVtY3B5KG5pY2tidWYsIHByaXYtPm5pY2ssIElXX0VTU0lEX01BWF9TSVpFKTsKIAlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwogCi0JbnJxLT5sZW5ndGggPSBzdHJsZW4obmlja2J1Zik7CisJbnJxLT5sZW5ndGggPSBzdHJsZW4ocHJpdi0+bmljayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2MDYsNyArMzYxNCw3IEBACiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogRm9yY2luZyByZXNldCFcbiIsIGRldi0+bmFtZSk7CiAKIAkJLyogRmlybXdhcmUgcmVzZXQgKi8KLQkJb3Jpbm9jb19yZXNldChkZXYpOworCQlvcmlub2NvX3Jlc2V0KCZwcml2LT5yZXNldF93b3JrKTsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZvcmNlIHNjaGVkdWxpbmcgcmVzZXQhXG4iLCBkZXYtPm5hbWUpOwogCkBAIC00MTUyLDcgKzQxNjAsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQpIHsKLQkJb3Jpbm9jb19yZXNldChkZXYpOworCQlvcmlub2NvX3Jlc2V0KCZwcml2LT5yZXNldF93b3JrKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKaW5kZXggYmMxNDY4OS4uZDA4YWU4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwpAQCAtMTc4LDIxICsxNzgsNiBAQAogCWNpc3BhcnNlX3QgcGFyc2U7CiAJdm9pZCBfX2lvbWVtICptZW07CiAKLQkvKgotCSAqIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMKLQkgKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KLQkgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KIAkvKiBMb29rIHVwIHRoZSBjdXJyZW50IFZjYyAqLwogCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLAogCQkgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJmNvbmYpKTsKQEAgLTIxMSw2ICsxOTYsMTAgQEAKIAkgKiBhbmQgbW9zdCBjbGllbnQgZHJpdmVycyB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbgogCSAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KIAkgKi8KKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAJd2hpbGUgKDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5oCmluZGV4IGJlMWFiZWEuLmY0ZTVlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuaApAQCAtNjAsNyArNjAsMTIgQEAKIAlpbnQgZXJyOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAogCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jCmluZGV4IDIzZGVlZTYuLjAyZmM2N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+XwogICoKQEAgLTM4LDcgKzM3LDcgQEAKICAqIGlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzIC0gZGlzYWJsZSBhbGwgaW50ZXJydXB0cwogICogQGRldmljZTogcGNpIG1lbW9yeSBiYXNlIGFkZHJlc3MKICAqCi0gKiAgSW5zdHJ1Y3RzIHRoZSBkZXZpY2UgdG8gZGlzYWJsZSBhbGwgaW50ZXJydXB0IHJlcG9ydGluZyBieSBhc3NlcnRpbmcgCisgKiAgSW5zdHJ1Y3RzIHRoZSBkZXZpY2UgdG8gZGlzYWJsZSBhbGwgaW50ZXJydXB0IHJlcG9ydGluZyBieSBhc3NlcnRpbmcKICAqICB0aGUgSVJRIGxpbmUuIE5ldyBldmVudHMgbWF5IHN0aWxsIHNob3cgdXAgaW4gdGhlIGludGVycnVwdCBpZGVudGlmaWNhdGlvbgogICogIHJlZ2lzdGVyIGxvY2F0ZWQgYXQgb2Zmc2V0ICVJU0wzOFhYX0lOVF9JREVOVF9SRUcuCiAgKi8KQEAgLTIwNCwxNyArMjAzLDE5IEBACiAJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIGRldGVjdGluZyBpbml0aWFsaXphdGlvbiAqLwogCiAJLyogTm90ZTogRG8gbm90IGVuYWJsZSBvdGhlciBpbnRlcnJ1cHRzIGhlcmUuIFdlIHdhbnQgdGhlCi0JICogZGV2aWNlIHRvIGhhdmUgY29tZSB1cCBmaXJzdCAxMDAlIGJlZm9yZSBhbGxvd2luZyBhbnkgb3RoZXIgCisJICogZGV2aWNlIHRvIGhhdmUgY29tZSB1cCBmaXJzdCAxMDAlIGJlZm9yZSBhbGxvd2luZyBhbnkgb3RoZXIKIAkgKiBpbnRlcnJ1cHRzLiAqLwogCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0lOVF9JREVOVF9JTklULCBJU0wzOFhYX0lOVF9FTl9SRUcpOwogCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOyAgLyogYWxsb3cgY29tcGxldGUgZnVsbCByZXNldCAqLwogfQogCiB2b2lkCi1pc2wzOHh4X2VuYWJsZV9jb21tb25faW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlKSB7Citpc2wzOHh4X2VuYWJsZV9jb21tb25faW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlKQorewogCXUzMiByZWc7Ci0JcmVnID0gKCBJU0wzOFhYX0lOVF9JREVOVF9VUERBVEUgfCAKLQkJCUlTTDM4WFhfSU5UX0lERU5UX1NMRUVQIHwgSVNMMzhYWF9JTlRfSURFTlRfV0FLRVVQKTsKKworCXJlZyA9IElTTDM4WFhfSU5UX0lERU5UX1VQREFURSB8IElTTDM4WFhfSU5UX0lERU5UX1NMRUVQIHwKKwkgICAgICBJU0wzOFhYX0lOVF9JREVOVF9XQUtFVVA7CiAJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIHJlZywgSVNMMzhYWF9JTlRfRU5fUkVHKTsKIAl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKIH0KQEAgLTIzNCwyMyArMjM1LDIxIEBACiAJCS8qIHNlbmQgcXVldWVzICovCiAJY2FzZSBJU0wzOFhYX0NCX1RYX01HTVRROgogCQlCVUdfT04oZGVsdGEgPiBJU0wzOFhYX0NCX01HTVRfUVNJWkUpOworCiAJY2FzZSBJU0wzOFhYX0NCX1RYX0RBVEFfTFE6CiAJY2FzZSBJU0wzOFhYX0NCX1RYX0RBVEFfSFE6CiAJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfVFhfUVNJWkUpOwogCQlyZXR1cm4gZGVsdGE7Ci0JCWJyZWFrOwogCiAJCS8qIHJlY2VpdmUgcXVldWVzICovCiAJY2FzZSBJU0wzOFhYX0NCX1JYX01HTVRROgogCQlCVUdfT04oZGVsdGEgPiBJU0wzOFhYX0NCX01HTVRfUVNJWkUpOwogCQlyZXR1cm4gSVNMMzhYWF9DQl9NR01UX1FTSVpFIC0gZGVsdGE7Ci0JCWJyZWFrOwogCiAJY2FzZSBJU0wzOFhYX0NCX1JYX0RBVEFfTFE6CiAJY2FzZSBJU0wzOFhYX0NCX1JYX0RBVEFfSFE6CiAJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfUlhfUVNJWkUpOwogCQlyZXR1cm4gSVNMMzhYWF9DQl9SWF9RU0laRSAtIGRlbHRhOwotCQlicmVhazsKIAl9CiAJQlVHKCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmgKaW5kZXggOGFmMjA5OC4uM2ZhZGNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTY3LDEwICs2NiwxMCBAQAogICogQGJhc2U6IChob3N0KSBtZW1vcnkgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UKICAqIEB2YWw6IDMyYml0IHZhbHVlIChob3N0IG9yZGVyKSB0byB3cml0ZQogICogQG9mZnNldDogYnl0ZSBvZmZzZXQgaW50byBAYmFzZSB0byB3cml0ZSB2YWx1ZSB0bwotICogCisgKgogICogIFRoaXMgaGVscGVyIHRha2VzIGNhcmUgb2Ygd3JpdGluZyBhIDMyYml0IGRhdHVtIHRvIHRoZQotICogIHNwZWNpZmllZCBvZmZzZXQgaW50byB0aGUgZGV2aWNlJ3MgcGNpIG1lbW9yeSBzcGFjZSwgYW5kIG1ha2luZyBzdXJlIAotICogIHRoZSBwY2kgbWVtb3J5IGJ1ZmZlcnMgZ2V0IGZsdXNoZWQgYnkgcGVyZm9ybWluZyBvbmUgaGFybWxlc3MgcmVhZCAKKyAqICBzcGVjaWZpZWQgb2Zmc2V0IGludG8gdGhlIGRldmljZSdzIHBjaSBtZW1vcnkgc3BhY2UsIGFuZCBtYWtpbmcgc3VyZQorICogIHRoZSBwY2kgbWVtb3J5IGJ1ZmZlcnMgZ2V0IGZsdXNoZWQgYnkgcGVyZm9ybWluZyBvbmUgaGFybWxlc3MgcmVhZAogICogIGZyb20gdGhlICVJU0wzOFhYX1BDSV9QT1NUSU5HX0ZMVVNIIG9mZnNldC4KICAqLwogc3RhdGljIGlubGluZSB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwppbmRleCAyODYzMjVjLi44MzhkNTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgICAgICAgICAgIChDKSAyMDAzLDIwMDQgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KICAqICAgICAgICAgICAgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CkBAIC01NSwxMiArNTQsMTIgQEAKICAqIHByaXNtNTRfbWliX21vZGVfaGVscGVyIC0gTUlCIGNoYW5nZSBtb2RlIGhlbHBlciBmdW5jdGlvbgogICogQG1pYjogdGhlICZzdHJ1Y3QgaXNscGNpX21pYiBvYmplY3QgdG8gbW9kaWZ5CiAgKiBAaXdfbW9kZTogbmV3IG1vZGUgKCVJV19NT0RFXyopCi0gKiAKKyAqCiAgKiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiwgaGVuY2UgaXQgZG9lcyBub3QgbG9jay4gTWFrZSBzdXJlCi0gKiAgY2FsbGVyIGRlYWxzIHdpdGggbG9ja2luZyAqaWYqIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSAKLSAqICBtb2RlLWRlcGVuZGVudCBtaWIgdmFsdWVzIGFuZCBkb2VzIHRoZSBtYXBwaW5nIG9mIHRoZSBMaW51eCAKLSAqICBXaXJlbGVzcyBBUEkgbW9kZXMgdG8gRGV2aWNlIGZpcm13YXJlIG1vZGVzLiBJdCBhbHNvIGNoZWNrcyBmb3IgCi0gKiAgY29ycmVjdCB2YWxpZCBMaW51eCB3aXJlbGVzcyBtb2Rlcy4gCisgKiAgY2FsbGVyIGRlYWxzIHdpdGggbG9ja2luZyAqaWYqIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZQorICogIG1vZGUtZGVwZW5kZW50IG1pYiB2YWx1ZXMgYW5kIGRvZXMgdGhlIG1hcHBpbmcgb2YgdGhlIExpbnV4CisgKiAgV2lyZWxlc3MgQVBJIG1vZGVzIHRvIERldmljZSBmaXJtd2FyZSBtb2Rlcy4gSXQgYWxzbyBjaGVja3MgZm9yCisgKiAgY29ycmVjdCB2YWxpZCBMaW51eCB3aXJlbGVzcyBtb2Rlcy4KICAqLwogc3RhdGljIGludAogcHJpc201NF9taWJfbW9kZV9oZWxwZXIoaXNscGNpX3ByaXZhdGUgKnByaXYsIHUzMiBpd19tb2RlKQpAQCAtMTE4LDcgKzExNyw3IEBACiAgKgogICogIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHN0cnVjdCBnaXZlbiBhcyBAbWliIHdpdGggZGVmYXVsdHMsCiAgKiAgb2Ygd2hpY2ggbWFueSBhcmUgcmV0cmlldmVkIGZyb20gdGhlIGdsb2JhbCBtb2R1bGUgcGFyYW1ldGVyCi0gKiAgdmFyaWFibGVzLiAgCisgKiAgdmFyaWFibGVzLgogICovCiAKIHZvaWQKQEAgLTEzNCw3ICsxMzMsNyBAQAogCWF1dGhlbiA9IENBUkRfREVGQVVMVF9BVVRIRU47CiAJd2VwID0gQ0FSRF9ERUZBVUxUX1dFUDsKIAlmaWx0ZXIgPSBDQVJEX0RFRkFVTFRfRklMVEVSOyAvKiAoMCkgRG8gbm90IGZpbHRlciB1bi1lbmNyeXB0ZWQgZGF0YSAqLwotCWRvdDF4ID0gQ0FSRF9ERUZBVUxUX0RPVDFYOyAKKwlkb3QxeCA9IENBUkRfREVGQVVMVF9ET1QxWDsKIAltbG1lID0gQ0FSRF9ERUZBVUxUX01MTUVfTU9ERTsKIAljb25mb3JtYW5jZSA9IENBUkRfREVGQVVMVF9DT05GT1JNQU5DRTsKIAlwb3dlciA9IDEyNzsKQEAgLTE1OCw4ICsxNTcsOSBAQAogICogc2NoZWR1bGVfd29yaygpLCB0aHVzIHdlIGNhbiBhcyB3ZWxsIHVzZSBzbGVlcGluZyBzZW1hcGhvcmUKICAqIGxvY2tpbmcgKi8KIHZvaWQKLXByaXNtNTRfdXBkYXRlX3N0YXRzKGlzbHBjaV9wcml2YXRlICpwcml2KQorcHJpc201NF91cGRhdGVfc3RhdHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIGlzbHBjaV9wcml2YXRlLCBzdGF0c193b3JrKTsKIAljaGFyICpkYXRhOwogCWludCBqOwogCXN0cnVjdCBvYmpfYnNzIGJzcywgKmJzczI7CkBAIC0yMjgsNyArMjI4LDcgQEAKIAl9IGVsc2UKIAkJcHJpdi0+aXdzdGF0aXN0aWNzLnF1YWwudXBkYXRlZCA9IDA7CiAKLQkvKiBVcGRhdGUgb3VyIHdpcmVsZXNzIHN0YXRzLCBidXQgZG8gbm90IHNjaGVkdWxlIHRvIG9mdGVuIAorCS8qIFVwZGF0ZSBvdXIgd2lyZWxlc3Mgc3RhdHMsIGJ1dCBkbyBub3Qgc2NoZWR1bGUgdG8gb2Z0ZW4KIAkgKiAobWF4IDEgSFopICovCiAJaWYgKChwcml2LT5zdGF0c190aW1lc3RhbXAgPT0gMCkgfHwKIAkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5zdGF0c190aW1lc3RhbXAgKyAxICogSFopKSB7CkBAIC03MDUsNyArNzA1LDcgQEAKIAkqIFN0YXJ0aW5nIHdpdGggV0UtMTcsIHRoZSBidWZmZXIgY2FuIGJlIGFzIGJpZyBhcyBuZWVkZWQuCiAJKiBCdXQgdGhlIGRldmljZSB3b24ndCByZXBwb3J0IGFueXRoaW5nIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlCiAJKiBvZiBJV01BWF9CU1M9MjQuICovCi0JCisKIAlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NMSVNULCAwLCBOVUxMLCAmcik7CiAJYnNzbGlzdCA9IHIucHRyOwogCkBAIC03ODUsNyArNzg1LDcgQEAKIAlyZXR1cm4gcnZhbHVlOwogfQogCi0vKiBQcm92aWRlcyBubyBmdW5jdGlvbmFsaXR5LCBqdXN0IGNvbXBsZXRlcyB0aGUgaW9jdGwuIEluIGVzc2VuY2UgdGhpcyBpcyBhIAorLyogUHJvdmlkZXMgbm8gZnVuY3Rpb25hbGl0eSwganVzdCBjb21wbGV0ZXMgdGhlIGlvY3RsLiBJbiBlc3NlbmNlIHRoaXMgaXMgYQogICoganVzdCBhIGNvc21ldGljIGlvY3RsLgogICovCiBzdGF0aWMgaW50CkBAIC0xMTA0LDcgKzExMDQsNyBAQAogCQkJCQkgICAgJmtleSk7CiAJCX0KIAkJLyoKLQkJICogSWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIAorCQkgKiBJZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gc2hvdWxkIGJlIGVuYWJsZWQKIAkJICogKHVzZXIgbWF5IHR1cm4gaXQgb2ZmIGxhdGVyKS4KIAkJICogVGhpcyBpcyBhbHNvIGhvdyAiaXdjb25maWcgZXRoWCBrZXkgb24iIHdvcmtzCiAJCSAqLwpAQCAtMTEyNiw3ICsxMTI2LDcgQEAKIAl9CiAJLyogbm93IHJlYWQgdGhlIGZsYWdzICovCiAJaWYgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7Ci0JCS8qIEVuY29kaW5nIGRpc2FibGVkLCAKKwkJLyogRW5jb2RpbmcgZGlzYWJsZWQsCiAJCSAqIGF1dGhlbiA9IERPVDExX0FVVEhfT1M7CiAJCSAqIGludm9rZSA9IDA7CiAJCSAqIGV4dW5lbmNyeXB0ID0gMDsgKi8KQEAgLTEyMTQsNyArMTIxNCw3IEBACiAJdndycS0+dmFsdWUgPSAoczMyKSByLnUgLyA0OwogCXZ3cnEtPmZpeGVkID0gMTsKIAkvKiByYWRpbyBpcyBub3QgdHVybmVkIG9mCi0JICogYnR3OiBob3cgaXMgcG9zc2libGUgdG8gdHVybiBvZmYgb25seSB0aGUgcmFkaW8gCisJICogYnR3OiBob3cgaXMgcG9zc2libGUgdG8gdHVybiBvZmYgb25seSB0aGUgcmFkaW8KIAkgKi8KIAl2d3JxLT5kaXNhYmxlZCA9IDA7CiAKQEAgLTIxNDEsMTEgKzIxNDEsOSBAQAogCQkJCQkgc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llLCBsaXN0KTsKIAkJCWxpc3RfZGVsKCZic3MtPmxpc3QpOwogCQl9IGVsc2UgewotCQkJYnNzID0ga21hbGxvYyhzaXplb2YgKCpic3MpLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChic3MgIT0gTlVMTCkgeworCQkJYnNzID0ga3phbGxvYyhzaXplb2YgKCpic3MpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChic3MgIT0gTlVMTCkKIAkJCQlwcml2LT5udW1fYnNzX3dwYSsrOwotCQkJCW1lbXNldChic3MsIDAsIHNpemVvZiAoKmJzcykpOwotCQkJfQogCQl9CiAJCWlmIChic3MgIT0gTlVMTCkgewogCQkJbWVtY3B5KGJzcy0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7CkBAIC0yMzU0LDE3ICsyMzUyLDE3IEBACiAJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CiAJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBdXRoZW50aWNhdGUgcmVxdWVzdCAoZXgpIiwgbWxtZSwgMSk7CiAKLQkJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIgCisJCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSCiAJCQkJJiYgbWxtZWV4LT5zdGF0ZSAhPSBET1QxMV9TVEFURV9BVVRISU5HKQogCQkJYnJlYWs7CiAKIAkJY29uZmlybSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpfbWxtZWV4KSArIDYsIEdGUF9BVE9NSUMpOwogCi0JCWlmICghY29uZmlybSkgCisJCWlmICghY29uZmlybSkKIAkJCWJyZWFrOwogCiAJCW1lbWNweSgmY29uZmlybS0+YWRkcmVzcywgbWxtZWV4LT5hZGRyZXNzLCBFVEhfQUxFTik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJBdXRoZW50aWNhdGUgZnJvbTogYWRkcmVzczpcdCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCAKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkF1dGhlbnRpY2F0ZSBmcm9tOiBhZGRyZXNzOlx0JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCiAJCQkJbWxtZWV4LT5hZGRyZXNzWzBdLAogCQkJCW1sbWVleC0+YWRkcmVzc1sxXSwKIAkJCQltbG1lZXgtPmFkZHJlc3NbMl0sCkBAIC0yMzk4LDEwICsyMzk2LDEwIEBACiAJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CiAJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBc3NvY2lhdGUgcmVxdWVzdCAoZXgpIiwgbWxtZSwgMSk7CiAKLQkJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIgCisJCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSCiAJCQkJJiYgbWxtZWV4LT5zdGF0ZSAhPSBET1QxMV9TVEFURV9BU1NPQ0lORykKIAkJCWJyZWFrOwotCQkKKwogCQljb25maXJtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9tbG1lZXgpLCBHRlBfQVRPTUlDKTsKIAogCQlpZiAoIWNvbmZpcm0pCkBAIC0yNDE3LDcgKzI0MTUsNyBAQAogCiAJCWlmICghd3BhX2llX2xlbikgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIk5vIFdQQSBJRSBmb3VuZCBmcm9tICIKLQkJCQkJImFkZHJlc3M6XHQlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgCisJCQkJCSJhZGRyZXNzOlx0JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCiAJCQkJbWxtZWV4LT5hZGRyZXNzWzBdLAogCQkJCW1sbWVleC0+YWRkcmVzc1sxXSwKIAkJCQltbG1lZXgtPmFkZHJlc3NbMl0sCkBAIC0yNDM1LDE0ICsyNDMzLDE0IEBACiAJCW1ndF9zZXRfdmFybGVuKHByaXYsIG9pZCwgY29uZmlybSwgd3BhX2llX2xlbik7CiAKIAkJa2ZyZWUoY29uZmlybSk7Ci0JCQorCiAJCWJyZWFrOwogCiAJY2FzZSBET1QxMV9PSURfUkVBU1NPQ0lBVEVFWDoKIAkJaGFuZGxlX3JlcXVlc3QocHJpdiwgbWxtZSwgb2lkKTsKIAkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIlJlYXNzb2NpYXRlIHJlcXVlc3QgKGV4KSIsIG1sbWUsIDEpOwogCi0JCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSIAorCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUgogCQkJCSYmIG1sbWVleC0+c3RhdGUgIT0gRE9UMTFfU1RBVEVfQVNTT0NJTkcpCiAJCQlicmVhazsKIApAQCAtMjQ2MSw3ICsyNDU5LDcgQEAKIAogCQlpZiAoIXdwYV9pZV9sZW4pIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJObyBXUEEgSUUgZm91bmQgZnJvbSAiCi0JCQkJCSJhZGRyZXNzOlx0JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIAorCQkJCQkiYWRkcmVzczpcdCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAogCQkJCW1sbWVleC0+YWRkcmVzc1swXSwKIAkJCQltbG1lZXgtPmFkZHJlc3NbMV0sCiAJCQkJbWxtZWV4LT5hZGRyZXNzWzJdLApAQCAtMjQ3MywxMyArMjQ3MSwxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQljb25maXJtLT5zaXplID0gd3BhX2llX2xlbjsgCisJCWNvbmZpcm0tPnNpemUgPSB3cGFfaWVfbGVuOwogCQltZW1jcHkoJmNvbmZpcm0tPmRhdGEsIHdwYV9pZSwgd3BhX2llX2xlbik7CiAKIAkJbWd0X3NldF92YXJsZW4ocHJpdiwgb2lkLCBjb25maXJtLCB3cGFfaWVfbGVuKTsKIAogCQlrZnJlZShjb25maXJtKTsKLQkJCisKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjQ5NCw5ICsyNDkyLDEwIEBACiAgKiBpbnRlcnJ1cHQgY29udGV4dCwgbm8gbG9ja3MgaGVsZC4KICAqLwogdm9pZAotcHJpc201NF9wcm9jZXNzX3RyYXAodm9pZCAqZGF0YSkKK3ByaXNtNTRfcHJvY2Vzc190cmFwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWUgPSBkYXRhOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpmcmFtZSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSwgd3MpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZnJhbWUtPm5kZXY7CiAJZW51bSBvaWRfbnVtX3QgbiA9IG1ndF9vaWR0b251bShmcmFtZS0+aGVhZGVyLT5vaWQpOwogCkBAIC0yNTQ1LDEwICsyNTQ0LDEwIEBACiAjZGVmaW5lIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOIFwKICgoaW50KSAoJigoc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICopIDApLT51LmdlbmVyaWNfZWxlbS5kYXRhKSkKIAotLyogTWF4aW11bSBsZW5ndGggZm9yIGFsZ29yaXRobSBuYW1lcyAoLTEgZm9yIG51bCB0ZXJtaW5hdGlvbikgCisvKiBNYXhpbXVtIGxlbmd0aCBmb3IgYWxnb3JpdGhtIG5hbWVzICgtMSBmb3IgbnVsIHRlcm1pbmF0aW9uKQogICogdXNlZCBpbiBpb2N0bCgpICovCiAjZGVmaW5lIEhPU1RBUF9DUllQVF9BTEdfTkFNRV9MRU4gMTYKLQkKKwogc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtIHsKIAl1MzIgY21kOwogCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKQEAgLTI2MjEsNyArMjYyMCw3IEBACiAJCQkJCSAgICAma2V5KTsKIAkJfQogCQkvKgotCQkgKiBJZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gc2hvdWxkIGJlIGVuYWJsZWQgCisJCSAqIElmIGEgdmFsaWQga2V5IGlzIHNldCwgZW5jcnlwdGlvbiBzaG91bGQgYmUgZW5hYmxlZAogCQkgKiAodXNlciBtYXkgdHVybiBpdCBvZmYgbGF0ZXIpLgogCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MKIAkJICovCkBAIC0yNjQzLDcgKzI2NDIsNyBAQAogCX0KIAkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KIAlpZiAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKLQkJLyogRW5jb2RpbmcgZGlzYWJsZWQsIAorCQkvKiBFbmNvZGluZyBkaXNhYmxlZCwKIAkJICogYXV0aGVuID0gRE9UMTFfQVVUSF9PUzsKIAkJICogaW52b2tlID0gMDsKIAkJICogZXh1bmVuY3J5cHQgPSAwOyAqLwpAQCAtMjY4NSwxMSArMjY4NCwxMCBAQAogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAKICAgICAgICBhbGVuID0gc2l6ZW9mKCphdHRhY2gpICsgbGVuOwotICAgICAgIGF0dGFjaCA9IGttYWxsb2MoYWxlbiwgR0ZQX0tFUk5FTCk7CisgICAgICAgYXR0YWNoID0ga3phbGxvYyhhbGVuLCBHRlBfS0VSTkVMKTsKICAgICAgICBpZiAoYXR0YWNoID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKIAotICAgICAgIG1lbXNldChhdHRhY2gsIDAsIGFsZW4pOwogI2RlZmluZSBXTEFOX0ZDX1RZUEVfTUdNVCAwCiAjZGVmaW5lIFdMQU5fRkNfU1RZUEVfQVNTT0NfUkVRIDAKICNkZWZpbmUgV0xBTl9GQ19TVFlQRV9SRUFTU09DX1JFUSAyCkBAIC0yNzEwLDcgKzI3MDgsNyBAQAogCiAJICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7CiAKLQkgICAgICAgaWYgKHJldCA9PSAwKSAKKwkgICAgICAgaWYgKHJldCA9PSAwKQogCQkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXUEEgSUUgQXR0YWNobWVudCB3YXMgc2V0XG4iLAogCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKICAgICAgICB9CkBAIC0yNzc3LDcgKzI3NzUsNyBAQAogICAgICAgICAgICBwLT5sZW5ndGggPiBQUklTTTJfSE9TVEFQRF9NQVhfQlVGX1NJWkUgfHwgIXAtPnBvaW50ZXIpCiAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKIAotICAgICAgIHBhcmFtID0gKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqKSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisgICAgICAgcGFyYW0gPSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAgICAgICAgaWYgKHBhcmFtID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKIApAQCAtMjg3MCw3ICsyODY4LDcgQEAKIAkJCW1sbWUgPSBET1QxMV9NTE1FX0FVVE87CiAJCQlwcmludGsoIiVzOiBEaXNhYmxpbmcgV1BBXG4iLCBuZGV2LT5uYW1lKTsKIAkJCWJyZWFrOwotCQljYXNlIDI6IAorCQljYXNlIDI6CiAJCWNhc2UgMTogLyogV1BBICovCiAJCQlwcmludGsoIiVzOiBFbmFibGluZyBXUEFcbiIsIG5kZXYtPm5hbWUpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaAppbmRleCA2NWYzM2FjLi5iY2ZiZmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgICAgICAgICAgIChDKSAyMDAzIEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CiAgKiAgICAgICAgICAgIChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgpAQCAtMzIsMTIgKzMxLDEyIEBACiB2b2lkIHByaXNtNTRfbWliX2luaXQoaXNscGNpX3ByaXZhdGUgKik7CiAKIHN0cnVjdCBpd19zdGF0aXN0aWNzICpwcmlzbTU0X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXZvaWQgcHJpc201NF91cGRhdGVfc3RhdHMoaXNscGNpX3ByaXZhdGUgKik7Cit2b2lkIHByaXNtNTRfdXBkYXRlX3N0YXRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIAogdm9pZCBwcmlzbTU0X2FjbF9pbml0KHN0cnVjdCBpc2xwY2lfYWNsICopOwogdm9pZCBwcmlzbTU0X2FjbF9jbGVhbihzdHJ1Y3QgaXNscGNpX2FjbCAqKTsKIAotdm9pZCBwcmlzbTU0X3Byb2Nlc3NfdHJhcCh2b2lkICopOwordm9pZCBwcmlzbTU0X3Byb2Nlc3NfdHJhcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKIHZvaWQgcHJpc201NF93cGFfYnNzX2llX2luaXQoaXNscGNpX3ByaXZhdGUgKnByaXYpOwogdm9pZCBwcmlzbTU0X3dwYV9ic3NfaWVfY2xlYW4oaXNscGNpX3ByaXZhdGUgKnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaAppbmRleCA0MTllZGY3Li5iNzUzNGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaApAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMyBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CkBAIC0yMyw3ICsyMSw3IEBACiAjaWYgIWRlZmluZWQoX0lTTF9PSURfSCkKICNkZWZpbmUgX0lTTF9PSURfSAogCi0vKiAKKy8qCiAgKiBNSUIgcmVsYXRlZCBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZmluaXRpb25zIGZvciBjb21tdW5pY2F0aW5nCiAgKiB3aXRoIHRoZSBkZXZpY2UgZmlybXdhcmUKICAqLwpAQCAtOTksMjEgKzk3LDIxIEBACiAJY2hhciBkYXRhWzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotLyogCisvKgogICogaW4gY2FzZSBldmVyeXRoaW5nJ3Mgb2ssIHRoZSBpbmxpbmVkIGZ1bmN0aW9uIGJlbG93IHdpbGwgYmUKICAqIG9wdGltaXplZCBhd2F5IGJ5IHRoZSBjb21waWxlci4uLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKIF9fYnVnX29uX3dyb25nX3N0cnVjdF9zaXplcyh2b2lkKQogewotCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfc3NpZCkgIT0gMzQpOwotCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfa2V5KSAhPSAzNCk7Ci0JQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9tbG1lKSAhPSAxMik7Ci0JQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9tbG1lZXgpICE9IDE0KTsKLQlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2J1ZmZlcikgIT0gOCk7Ci0JQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9ic3MpICE9IDYwKTsKLQlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2Jzc2xpc3QpICE9IDQpOwotCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfZnJlcXVlbmNpZXMpICE9IDIpOworCUJVSUxEX0JVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfc3NpZCkgIT0gMzQpOworCUJVSUxEX0JVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfa2V5KSAhPSAzNCk7CisJQlVJTERfQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9tbG1lKSAhPSAxMik7CisJQlVJTERfQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9tbG1lZXgpICE9IDE0KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2J1ZmZlcikgIT0gOCk7CisJQlVJTERfQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9ic3MpICE9IDYwKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2Jzc2xpc3QpICE9IDQpOworCUJVSUxEX0JVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfZnJlcXVlbmNpZXMpICE9IDIpOwogfQogCiBlbnVtIGRvdDExX3N0YXRlX3QgewpAQCAtMTU0LDEzICsxNTIsMTMgQEAKIAogLyogUHJpc20gIk5pdHJvIiAvIEZyYW1lYnVyc3QgLyAiUGFja2V0IEZyYW1lIEdyb3VwaW5nIgogICogVmFsdWUgaXMgaW4gbWljcm9zZWNvbmRzLiBSZXByZXNlbnRzIHRoZSAjIG1pY3Jvc2Vjb25kcwotICogdGhlIGZpcm13YXJlIHdpbGwgdGFrZSB0byBncm91cCBmcmFtZXMgYmVmb3JlIHNlbmRpbmcgb3V0IHRoZW4gb3V0IAorICogdGhlIGZpcm13YXJlIHdpbGwgdGFrZSB0byBncm91cCBmcmFtZXMgYmVmb3JlIHNlbmRpbmcgb3V0IHRoZW4gb3V0CiAgKiB0b2dldGhlciB3aXRoIGEgQ1NNQSBjb250ZW50aW9uLiBXaXRob3V0IHRoaXMgYWxsIGZyYW1lcyBhcmUKLSAqIHNlbnQgd2l0aCBhIENTTUEgY29udGVudGlvbi4gCi0gKiBCaWJsaW9ncmFwaHk6IAorICogc2VudCB3aXRoIGEgQ1NNQSBjb250ZW50aW9uLgorICogQmlibGlvZ3JhcGh5OgogICogaHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9QYXBlcnMvUGFja2V0LkZyYW1lLkdyb3VwaW5nLmh0bWwKICAqLwotZW51bSBkb3QxMV9tYXhmcmFtZWJ1cnN0X3QgeyAKK2VudW0gZG90MTFfbWF4ZnJhbWVidXJzdF90IHsKIAkvKiBWYWx1ZXMgZm9yIERPVDExX09JRF9NQVhGUkFNRUJVUlNUICovCiAJRE9UMTFfTUFYRlJBTUVCVVJTVF9PRkYgPSAwLCAvKiBDYXJkIGZpcm13YXJlIGRlZmF1bHQgKi8KIAlET1QxMV9NQVhGUkFNRUJVUlNUX01JWEVEX1NBRkUgPSA2NTAsIC8qIDgwMi4xMSBhLGIsZyBzYWZlICovCkBAIC0xNzYsOSArMTc0LDkgQEAKIC8qIFN1cHBvcnQgZm9yIDgwMi4xMSBsb25nIGFuZCBzaG9ydCBmcmFtZSBwcmVhbWJsZXMuCiAgKiBMb25nCSBwcmVhbWJsZSB1c2VzIDEyOC1iaXQgc3luYyBmaWVsZCwgOC1iaXQgIENSQwogICogU2hvcnQgcHJlYW1ibGUgdXNlcyA1Ni1iaXQgIHN5bmMgZmllbGQsIDE2LWJpdCBDUkMKLSAqIAorICoKICAqIDgwMi4xMWEgLS0gbm90IHN1cmUsIGJvdGggb3B0aW9uYWxseSA/Ci0gKiA4MDIuMTFiIHN1cHBvcnRzIGxvbmcgYW5kIG9wdGlvbmFsbHkgc2hvcnQgCisgKiA4MDIuMTFiIHN1cHBvcnRzIGxvbmcgYW5kIG9wdGlvbmFsbHkgc2hvcnQKICAqIDgwMi4xMWcgc3VwcG9ydHMgYm90aCAqLwogZW51bSBkb3QxMV9wcmVhbWJsZXNldHRpbmdzX3QgewogCURPVDExX1BSRUFNQkxFU0VUVElOR19MT05HID0gMCwKQEAgLTE5NCw3ICsxOTIsNyBAQAogICogTG9uZyB1c2VzIDgwMi4xMWEgc2xvdCB0aW1pbmcgICg5IHVzZWMgPykKICAqIFNob3J0IHVzZXMgODAyLjExYiBzbG90IHRpbWluZyAoMjAgdXNlID8pICovCiBlbnVtIGRvdDExX3Nsb3RzZXR0aW5nc190IHsKLQlET1QxMV9TTE9UU0VUVElOR1NfTE9ORyA9IDAsIAorCURPVDExX1NMT1RTRVRUSU5HU19MT05HID0gMCwKIAkJLyogQWxsb3dzICpvbmx5KiBsb25nIDgwMi4xMWIgc2xvdCB0aW1pbmcgKi8KIAlET1QxMV9TTE9UU0VUVElOR1NfU0hPUlQgPSAxLAogCQkvKiBBbGxvd3MgKm9ubHkqIGxvbmcgODAyLjExYSBzbG90IHRpbWluZyAqLwpAQCAtMjAzLDcgKzIwMSw3IEBACiB9OwogCiAvKiBBbGwgeW91IG5lZWQgdG8ga25vdywgRVJQIGlzICJFeHRlbmRlZCBSYXRlIFBIWSIuCi0gKiBBbiBFeHRlbmRlZCBSYXRlIFBIWSAoRVJQKSBTVEEgb3IgQVAgc2hhbGwgc3VwcG9ydCB0aHJlZSBkaWZmZXJlbnQgCisgKiBBbiBFeHRlbmRlZCBSYXRlIFBIWSAoRVJQKSBTVEEgb3IgQVAgc2hhbGwgc3VwcG9ydCB0aHJlZSBkaWZmZXJlbnQKICAqIHByZWFtYmxlIGFuZCBoZWFkZXIgZm9ybWF0czoKICAqIExvbmcgIHByZWFtYmxlIChyZWZlciB0byBhYm92ZSkKICAqIFNob3J0IHByZWFtYmxlIChyZWZlciB0byBhYm92ZSkKQEAgLTIyMSw3ICsyMTksNyBAQAogLyogKEVSUCBpcyAiRXh0ZW5kZWQgUmF0ZSBQSFkiKSBXYXkgdG8gcmVhZCBOT05FUlAgaXMgTk9OLUVSUC0qCiAgKiBUaGUga2V5IGhlcmUgaXMgRE9UMTEgTk9OIEVSUCBORVZFUiBwcm90ZWN0cyBhZ2FpbnN0CiAgKiBOT04gRVJQIFNUQSdzLiBZb3UgKmRvbid0KiB3YW50IHRoaXMgdW5sZXNzCi0gKiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuIEl0IG1lYW5zIHlvdSB3aWxsIG9ubHkgCisgKiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuIEl0IG1lYW5zIHlvdSB3aWxsIG9ubHkKICAqIGdldCBFeHRlbmRlZCBSYXRlIGNhcGFiaWxpdGllcyAqLwogZW51bSBkb3QxMV9ub25lcnBwcm90ZWN0aW9uX3QgewogCURPVDExX05PTkVSUF9ORVZFUiA9IDAsCkBAIC0yMjksMTMgKzIyNywxMyBAQAogCURPVDExX05PTkVSUF9EWU5BTUlDID0gMgogfTsKIAotLyogUHJlc2V0IE9JRCBjb25maWd1cmF0aW9uIGZvciA4MDIuMTEgbW9kZXMgCi0gKiBOb3RlOiBET1QxMV9PSURfQ1dbTUlOfE1BWF0gaG9sZCB0aGUgdmFsdWVzIG9mIHRoZSAKKy8qIFByZXNldCBPSUQgY29uZmlndXJhdGlvbiBmb3IgODAyLjExIG1vZGVzCisgKiBOb3RlOiBET1QxMV9PSURfQ1dbTUlOfE1BWF0gaG9sZCB0aGUgdmFsdWVzIG9mIHRoZQogICogRENTIE1JTnxNQVggYmFja29mZiB1c2VkICovCiBlbnVtIGRvdDExX3Byb2ZpbGVfdCB7IC8qIEFuZCBzZXQvYWxsb3dlZCB2YWx1ZXMgKi8KIAkvKiBBbGxvd2VkIHZhbHVlcyBmb3IgRE9UMTFfT0lEX1BST0ZJTEVTICovCiAJRE9UMTFfUFJPRklMRV9CX09OTFkgPSAwLAotCQkvKiBET1QxMV9PSURfUkFURVM6IDEsIDIsIDUuNSwgMTFNYnBzIAorCQkvKiBET1QxMV9PSURfUkFURVM6IDEsIDIsIDUuNSwgMTFNYnBzCiAJCSAqIERPVDExX09JRF9QUkVBTUJMRVNFVFRJTkdTOiBET1QxMV9QUkVBTUJMRVNFVFRJTkdfRFlOQU1JQwogCQkgKiBET1QxMV9PSURfQ1dNSU46IDMxCiAJCSAqIERPVDExX09JRF9OT05FUFJPVEVDVElPTjogRE9UMTFfTk9FUlBfRFlOQU1JQwpAQCAtMjc1LDcgKzI3Myw3IEBACiAJT0lEX0lOTF9DT05GT1JNQU5DRV9OT05FID0gMCwJLyogUGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcgKi8KIAlPSURfSU5MX0NPTkZPUk1BTkNFX1NUUklDVCA9IDEsCS8qIFN0cmljdGx5IGFkaGVyZSB0byA4MDIuMTFkICovCiAJT0lEX0lOTF9DT05GT1JNQU5DRV9GTEVYSUJMRSA9IDIsCS8qIFVzZSBwYXNzZWQgODAyLjExZCBpbmZvIHRvCi0JCSogZGV0ZXJtaW5lIGNoYW5uZWwgQU5EL09SIGp1c3QgbWFrZSBhc3N1bXB0aW9uIHRoYXQgYWN0aXZlIAorCQkqIGRldGVybWluZSBjaGFubmVsIEFORC9PUiBqdXN0IG1ha2UgYXNzdW1wdGlvbiB0aGF0IGFjdGl2ZQogCQkqIGNoYW5uZWxzIGFyZSB2YWxpZCAgY2hhbm5lbHMgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKaW5kZXggZWMxYzAwZi4uZjA1N2ZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKQEAgLTEsNSArMSw0IEBACiAvKgotICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgogICogIENvcHlyaWdodCAoQykgMjAwMyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KQEAgLTQxMyw3ICs0MTIsNyBAQAogCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1BSRUJPT1QpOwogCiAJLyogZGlzYWJsZSBhbGwgZGV2aWNlIGludGVycnVwdHMgaW4gY2FzZSB0aGV5IHdlcmVuJ3QgKi8KLQlpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7ICAKKwlpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7CiAKIAkvKiBGb3Igc2FmZXR5IHJlYXNvbnMsIHdlIG1heSB3YW50IHRvIGVuc3VyZSB0aGF0IG5vIERNQSB0cmFuc2ZlciBpcwogCSAqIGN1cnJlbnRseSBpbiBwcm9ncmVzcyBieSBlbXB0eWluZyB0aGUgVFggYW5kIFJYIHF1ZXVlcy4gKi8KQEAgLTQ4MCw3ICs0NzksNyBAQAogCiAJREVGSU5FX1dBSVQod2FpdCk7CiAJcHJlcGFyZV90b193YWl0KCZwcml2LT5yZXNldF9kb25lLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQorCiAJLyogbm93IHRoZSBsYXN0IHN0ZXAgaXMgdG8gcmVzZXQgdGhlIGludGVyZmFjZSAqLwogCWlzbDM4eHhfaW50ZXJmYWNlX3Jlc2V0KHByaXYtPmRldmljZV9iYXNlLCBwcml2LT5kZXZpY2VfaG9zdF9hZGRyZXNzKTsKIAlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9QUkVJTklUKTsKQEAgLTQ4OCw3ICs0ODcsNyBAQAogICAgICAgICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDIgJiYgcmVzdWx0OyBjb3VudCsrKSB7CiAJCS8qIFRoZSBzb2Z0d2FyZSByZXNldCBhY2tub3dsZWRnZSBuZWVkcyBhYm91dCAyMjAgbXNlYyBoZXJlLgogCQkgKiBCZSBjb25zZXJ2YXRpdmUgYW5kIHdhaXQgZm9yIHVwIHRvIG9uZSBzZWNvbmQuICovCi0JCisKIAkJcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFopOwogCiAJCWlmKHJlbWFpbmluZyA+IDApIHsKQEAgLTQ5Niw3ICs0OTUsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQkvKiBJZiB3ZSdyZSBoZXJlIGl0J3MgYmVjYXVzZSBvdXIgSVJRIGhhc24ndCB5ZXQgZ29uZSB0aHJvdWdoLiAKKwkJLyogSWYgd2UncmUgaGVyZSBpdCdzIGJlY2F1c2Ugb3VyIElSUSBoYXNuJ3QgeWV0IGdvbmUgdGhyb3VnaC4KIAkJICogUmV0cnkgYSBiaXQgbW9yZS4uLgogCQkgKi8KIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gJ3Jlc2V0IGNvbXBsZXRlJyBJUlEgc2VlbiAtIHJldHJ5aW5nXG4iLApAQCAtNTE0LDcgKzUxMyw3IEBACiAKIAkvKiBOb3cgdGhhdCB0aGUgZGV2aWNlIGlzIDEwMCUgdXAsIGxldCdzIGFsbG93CiAJICogZm9yIHRoZSBvdGhlciBpbnRlcnJ1cHRzIC0tCi0JICogTk9URTogdGhpcyBpcyBub3QgKnlldCogdHJ1ZSBzaW5jZSB3ZSd2ZSBvbmx5IGFsbG93ZWQgdGhlIAorCSAqIE5PVEU6IHRoaXMgaXMgbm90ICp5ZXQqIHRydWUgc2luY2Ugd2UndmUgb25seSBhbGxvd2VkIHRoZQogCSAqIElOSVQgaW50ZXJydXB0IG9uIHRoZSBJUlEgbGluZS4gV2UgY2FuIHBlcmhhcHMgcG9sbAogCSAqIHRoZSBJUlEgbGluZSB1bnRpbCB3ZSBrbm93IGZvciBzdXJlIHRoZSByZXNldCB3ZW50IHRocm91Z2ggKi8KIAlpc2wzOHh4X2VuYWJsZV9jb21tb25faW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7CkBAIC03MTYsNyArNzE1LDcgQEAKIAogCXByaXNtNTRfYWNsX2luaXQoJnByaXYtPmFjbCk7CiAJcHJpc201NF93cGFfYnNzX2llX2luaXQocHJpdik7Ci0JaWYgKG1ndF9pbml0KHByaXYpKSAKKwlpZiAobWd0X2luaXQocHJpdikpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXR1cm4gMDsKQEAgLTg2MSwxMSArODYwLDEwIEBACiAJcHJpdi0+c3RhdGVfb2ZmID0gMTsKIAogCS8qIGluaXRpYWxpemUgd29ya3F1ZXVlJ3MgKi8KLQlJTklUX1dPUksoJnByaXYtPnN0YXRzX3dvcmssCi0JCSAgKHZvaWQgKCopKHZvaWQgKikpIHByaXNtNTRfdXBkYXRlX3N0YXRzLCBwcml2KTsKKwlJTklUX1dPUksoJnByaXYtPnN0YXRzX3dvcmssIHByaXNtNTRfdXBkYXRlX3N0YXRzKTsKIAlwcml2LT5zdGF0c190aW1lc3RhbXAgPSAwOwogCi0JSU5JVF9XT1JLKCZwcml2LT5yZXNldF90YXNrLCBpc2xwY2lfZG9fcmVzZXRfYW5kX3dha2UsIHByaXYpOworCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfdGFzaywgaXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlKTsKIAlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAwOwogCiAJLyogYWxsb2NhdGUgdmFyaW91cyBtZW1vcnkgYXJlYXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgKaW5kZXggMmY3ZTUyNWQuLmE5YWExNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCkBAIC0xLDYgKzEsNSBAQAogLyoKLSAqICAKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLiAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgogICogIENvcHlyaWdodCAoQykgMjAwMyBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CkBAIC03MiwxMiArNzEsMTIgQEAKIAl1OCBic3NpZFtFVEhfQUxFTl07CiAJdTggd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKIAlzaXplX3Qgd3BhX2llX2xlbjsKLQkKKwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogCXNwaW5sb2NrX3Qgc2xvY2s7CS8qIGdlbmVyaWMgc3BpbmxvY2s7ICovCi0JCisKIAl1MzIgcHJpdl9vaWQ7CiAKIAkvKiBvdXIgbWliIGNhY2hlICovCkBAIC04NSw3ICs4NCw3IEBACiAgICAgICAgIHN0cnVjdCByd19zZW1hcGhvcmUgbWliX3NlbTsKIAl2b2lkICoqbWliOwogCWNoYXIgbmlja25hbWVbSVdfRVNTSURfTUFYX1NJWkUrMV07Ci0JCisKIAkvKiBUYWtlIGNhcmUgb2YgdGhlIHdpcmVsZXNzIHN0YXRzICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHN0YXRzX3dvcms7CiAJc3RydWN0IHNlbWFwaG9yZSBzdGF0c19zZW07CkBAIC0xMjAsNyArMTE5LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAogCS8qIGRldmljZSBxdWV1ZSBpbnRlcmZhY2UgbWVtYmVycyAqLwotCXN0cnVjdCBpc2wzOHh4X2NiICpjb250cm9sX2Jsb2NrOwkvKiBkZXZpY2UgY29udHJvbCBibG9jayAKKwlzdHJ1Y3QgaXNsMzh4eF9jYiAqY29udHJvbF9ibG9jazsJLyogZGV2aWNlIGNvbnRyb2wgYmxvY2sKIAkJCQkJCQkgICAoPT0gZHJpdmVyX21lbV9hZGRyZXNzISkgKi8KIAogCS8qIEVhY2ggcXVldWUgaGFzIHRocmVlIGluZGV4ZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCmluZGV4IGE4MjYxZDguLmIxMTIyOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgogICogIENvcHlyaWdodCAoQykgMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC00OCw3ICs0Nyw3IEBACiAJCS8qIHJlYWQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBmcmFnbWVudCB0byBiZSBmcmVlZCAqLwogCQlpbmRleCA9IHByaXYtPmZyZWVfZGF0YV90eCAlIElTTDM4WFhfQ0JfVFhfUVNJWkU7CiAKLQkJLyogY2hlY2sgZm9yIGhvbGVzIGluIHRoZSBhcnJheXMgY2F1c2VkIGJ5IG11bHRpIGZyYWdtZW50IGZyYW1lcyAKKwkJLyogY2hlY2sgZm9yIGhvbGVzIGluIHRoZSBhcnJheXMgY2F1c2VkIGJ5IG11bHRpIGZyYWdtZW50IGZyYW1lcwogCQkgKiBzZWFyY2hpbmcgZm9yIHRoZSBsYXN0IGZyYWdtZW50IG9mIGEgZnJhbWUgKi8KIAkJaWYgKHByaXYtPnBjaV9tYXBfdHhfYWRkcmVzc1tpbmRleF0gIT0gKGRtYV9hZGRyX3QpIE5VTEwpIHsKIAkJCS8qIGVudHJ5IGlzIHRoZSBsYXN0IGZyYWdtZW50IG9mIGEgZnJhbWUKQEAgLTI1Myw2ICsyNTIsNyBAQAogCSAqIGhlYWRlciBhbmQgd2l0aG91dCB0aGUgRkNTLiBCdXQgdGhlcmUgYSBpcyBhIGJpdCB0aGF0CiAJICogaW5kaWNhdGVzIGlmIHRoZSBwYWNrZXQgaXMgY29ycnVwdGVkIDotKSAqLwogCXN0cnVjdCByZm1vbl9oZWFkZXIgKmhkciA9IChzdHJ1Y3QgcmZtb25faGVhZGVyICopICgqc2tiKS0+ZGF0YTsKKwogCWlmIChoZHItPmZsYWdzICYgMHgwMSkKIAkJLyogVGhpcyBvbmUgaXMgYmFkLiBEcm9wIGl0ICEgKi8KIAkJcmV0dXJuIC0xOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJCSAgICAoc3RydWN0IGF2c184MDIxMV8xX2hlYWRlciAqKSBza2JfcHVzaCgqc2tiLAogCQkJCQkJCSAgIHNpemVvZiAoc3RydWN0CiAJCQkJCQkJCSAgIGF2c184MDIxMV8xX2hlYWRlcikpOwotCQkKKwogCQlhdnMtPnZlcnNpb24gPSBjcHVfdG9fYmUzMihQODAyMTFDQVBUVVJFX1ZFUlNJT04pOwogCQlhdnMtPmxlbmd0aCA9IGNwdV90b19iZTMyKHNpemVvZiAoc3RydWN0IGF2c184MDIxMV8xX2hlYWRlcikpOwogCQlhdnMtPm1hY3RpbWUgPSBjcHVfdG9fYmU2NChsZTY0X3RvX2NwdShjbG9jaykpOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAJCQlzdHJ1Y3QgcnhfYW5uZXhfaGVhZGVyICphbm5leCA9CiAJCQkgICAgKHN0cnVjdCByeF9hbm5leF9oZWFkZXIgKikgc2tiLT5kYXRhOwogCQkJd3N0YXRzLmxldmVsID0gYW5uZXgtPnJmbW9uLnJzc2k7Ci0JCQkvKiBUaGUgbm9pc2UgdmFsdWUgY2FuIGJlIGEgYml0IG91dGRhdGVkIGlmIG5vYm9keSdzIAorCQkJLyogVGhlIG5vaXNlIHZhbHVlIGNhbiBiZSBhIGJpdCBvdXRkYXRlZCBpZiBub2JvZHkncwogCQkJICogcmVhZGluZyB3aXJlbGVzcyBzdGF0cy4uLiAqLwogCQkJd3N0YXRzLm5vaXNlID0gcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubm9pc2U7CiAJCQl3c3RhdHMucXVhbCA9IHdzdGF0cy5sZXZlbCAtIHdzdGF0cy5ub2lzZTsKQEAgLTQ2NCwxMCArNDY0LDggQEAKIAkJCWJyZWFrOwogCQl9CiAJCS8qIHVwZGF0ZSB0aGUgZnJhZ21lbnQgYWRkcmVzcyAqLwotCQljb250cm9sX2Jsb2NrLT5yeF9kYXRhX2xvd1tpbmRleF0uYWRkcmVzcyA9IGNwdV90b19sZTMyKCh1MzIpCi0JCQkJCQkJCQlwcml2LT4KLQkJCQkJCQkJCXBjaV9tYXBfcnhfYWRkcmVzcwotCQkJCQkJCQkJW2luZGV4XSk7CisJCWNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5hZGRyZXNzID0KKwkJCWNwdV90b19sZTMyKCh1MzIpcHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2luZGV4XSk7CiAJCXdtYigpOwogCiAJCS8qIGluY3JlbWVudCB0aGUgZHJpdmVyIHJlYWQgcG9pbnRlciAqLwpAQCAtNDgyLDEyICs0ODAsMTQgQEAKIH0KIAogdm9pZAotaXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlKHZvaWQgKmRhdGEpCitpc2xwY2lfZG9fcmVzZXRfYW5kX3dha2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCWlzbHBjaV9wcml2YXRlICpwcml2ID0gKGlzbHBjaV9wcml2YXRlICopIGRhdGE7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgaXNscGNpX3ByaXZhdGUsIHJlc2V0X3Rhc2spOworCiAJaXNscGNpX3Jlc2V0KHByaXYsIDEpOwotCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmRldik7CiAJcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nID0gMDsKKwlzbXBfd21iKCk7CisJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZGV2KTsKIH0KIAogdm9pZApAQCAtNDk5LDEyICs0OTksMTQgQEAKIAkvKiBpbmNyZW1lbnQgdGhlIHRyYW5zbWl0IGVycm9yIGNvdW50ZXIgKi8KIAlzdGF0aXN0aWNzLT50eF9lcnJvcnMrKzsKIAotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0eF90aW1lb3V0IiwgbmRldi0+bmFtZSk7CiAJaWYgKCFwcml2LT5yZXNldF90YXNrX3BlbmRpbmcpIHsKLQkJcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nID0gMTsKLQkJcHJpbnRrKCIsIHNjaGVkdWxpbmcgYSByZXNldCIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXM6IHR4X3RpbWVvdXQsIHNjaGVkdWxpbmcgcmVzZXQiLCBuZGV2LT5uYW1lKTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nID0gMTsKIAkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfdGFzayk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzOiB0eF90aW1lb3V0LCB3YWl0aW5nIGZvciByZXNldCIsIG5kZXYtPm5hbWUpOwogCX0KLQlwcmludGsoIlxuIik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCmluZGV4IGJjOWQ3YTYuLjViZjgyMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtNjgsNiArNjcsNiBAQAogaW50IGlzbHBjaV9ldGhfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CiBpbnQgaXNscGNpX2V0aF9yZWNlaXZlKGlzbHBjaV9wcml2YXRlICopOwogdm9pZCBpc2xwY2lfZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci12b2lkIGlzbHBjaV9kb19yZXNldF9hbmRfd2FrZSh2b2lkICpkYXRhKTsKK3ZvaWQgaXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIAogI2VuZGlmCQkJCS8qIF9JU0xfR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwppbmRleCBmNjkyZGNjLi41ODI1N2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgogICogIENvcHlyaWdodCAoQykgMjAwMyBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4KICAqCkBAIC00MCw4ICszOSw4IEBACiBtb2R1bGVfcGFyYW0oaW5pdF9wY2l0bSwgaW50LCAwKTsKIAogLyogSW4gdGhpcyBvcmRlcjogdmVuZG9yLCBkZXZpY2UsIHN1YnZlbmRvciwgc3ViZGV2aWNlLCBjbGFzcywgY2xhc3NfbWFzaywKLSAqIGRyaXZlcl9kYXRhIAotICogSWYgeW91IGhhdmUgYW4gdXBkYXRlIGZvciB0aGlzIHBsZWFzZSBjb250YWN0IHByaXNtNTQtZGV2ZWxAcHJpc201NC5vcmcgCisgKiBkcml2ZXJfZGF0YQorICogSWYgeW91IGhhdmUgYW4gdXBkYXRlIGZvciB0aGlzIHBsZWFzZSBjb250YWN0IHByaXNtNTQtZGV2ZWxAcHJpc201NC5vcmcKICAqIFRoZSBsYXRlc3QgbGlzdCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3ByaXNtNTQub3JnL3N1cHBvcnRlZF9jYXJkcy5waHAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwcmlzbTU0X2lkX3RibFtdID0gewogCS8qIEludGVyc2lsIFBSSVNNIER1ZXR0ZS9QcmlzbSBHVCBXaXJlbGVzcyBMQU4gYWRhcHRlciAqLwpAQCAtMTMyLDE1ICsxMzEsMTUgQEAKIAogCS8qIDB4NDAgaXMgdGhlIHByb2dyYW1tYWJsZSB0aW1lciB0byBjb25maWd1cmUgdGhlIHJlc3BvbnNlIHRpbWVvdXQgKFRSRFlfVElNRU9VVCkKIAkgKiAweDQxIGlzIHRoZSBwcm9ncmFtbWFibGUgdGltZXIgdG8gY29uZmlndXJlIHRoZSByZXRyeSB0aW1lb3V0IChSRVRSWV9USU1FT1VUKQotCSAqIAlUaGUgUkVUUllfVElNRU9VVCBpcyB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHJldHJpZXMgdGhhdCB0aGUgY29yZSwgYXMgYQotCSAqIAlNYXN0ZXIsIHdpbGwgcGVyZm9ybSBiZWZvcmUgYWJhbmRvbmluZyBhIGN5Y2xlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IKLQkgKiAJUkVUUllfVElNRU9VVCBpcyAweDgwLCB3aGljaCBmYXIgZXhjZWVkcyB0aGUgUENJIDIuMSByZXF1aXJlbWVudCBmb3IgbmV3Ci0JICogCWRldmljZXMuIEEgd3JpdGUgb2YgemVybyB0byB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciBkaXNhYmxlcyB0aGlzCi0JICogCWZ1bmN0aW9uIHRvIGFsbG93IHVzZSB3aXRoIGFueSBub24tY29tcGxpYW50IGxlZ2FjeSBkZXZpY2VzIHRoYXQgbWF5Ci0JICogCWV4ZWN1dGUgbW9yZSByZXRyaWVzLgorCSAqCVRoZSBSRVRSWV9USU1FT1VUIGlzIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgcmV0cmllcyB0aGF0IHRoZSBjb3JlLCBhcyBhCisJICoJTWFzdGVyLCB3aWxsIHBlcmZvcm0gYmVmb3JlIGFiYW5kb25pbmcgYSBjeWNsZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yCisJICoJUkVUUllfVElNRU9VVCBpcyAweDgwLCB3aGljaCBmYXIgZXhjZWVkcyB0aGUgUENJIDIuMSByZXF1aXJlbWVudCBmb3IgbmV3CisJICoJZGV2aWNlcy4gQSB3cml0ZSBvZiB6ZXJvIHRvIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyIGRpc2FibGVzIHRoaXMKKwkgKglmdW5jdGlvbiB0byBhbGxvdyB1c2Ugd2l0aCBhbnkgbm9uLWNvbXBsaWFudCBsZWdhY3kgZGV2aWNlcyB0aGF0IG1heQorCSAqCWV4ZWN1dGUgbW9yZSByZXRyaWVzLgogCSAqCi0JICogCVdyaXRpbmcgemVybyB0byBib3RoIHRoZXNlIHR3byByZWdpc3RlcnMgd2lsbCBkaXNhYmxlIGJvdGggdGltZW91dHMgYW5kCi0JICogCSpjYW4qIHNvbHZlIHByb2JsZW1zIGNhdXNlZCBieSBkZXZpY2VzIHRoYXQgYXJlIHNsb3cgdG8gcmVzcG9uZC4KKwkgKglXcml0aW5nIHplcm8gdG8gYm90aCB0aGVzZSB0d28gcmVnaXN0ZXJzIHdpbGwgZGlzYWJsZSBib3RoIHRpbWVvdXRzIGFuZAorCSAqCSpjYW4qIHNvbHZlIHByb2JsZW1zIGNhdXNlZCBieSBkZXZpY2VzIHRoYXQgYXJlIHNsb3cgdG8gcmVzcG9uZC4KIAkgKglNYWtlIHRoaXMgY29uZmlndXJhYmxlIC0gTVNXCiAJICovCiAJaWYgKCBpbml0X3BjaXRtID49IDAgKSB7CkBAIC0xNzEsMTQgKzE3MCwxNSBAQAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCiAJLyogZW5hYmxlIE1XSSAqLwotCXBjaV9zZXRfbXdpKHBkZXYpOworCWlmICghcGNpX3NldF9td2kocGRldikpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwY2lfc2V0X213aShwZGV2KSBzdWNjZWVkZWRcbiIsIERSVl9OQU1FKTsKIAogCS8qIHNldHVwIHRoZSBuZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgYW5kIGl0cyBzdHJ1Y3R1cmUgKi8KIAlpZiAoIShuZGV2ID0gaXNscGNpX3NldHVwKHBkZXYpKSkgewogCQkvKiBlcnJvciBjb25maWd1cmluZyB0aGUgZHJpdmVyIGFzIGEgbmV0d29yayBkZXZpY2UgKi8KIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGNvbmZpZ3VyZSBuZXR3b3JrIGRldmljZVxuIiwKIAkJICAgICAgIERSVl9OQU1FKTsKLQkJZ290byBkb19wY2lfcmVsZWFzZV9yZWdpb25zOworCQlnb3RvIGRvX3BjaV9jbGVhcl9td2k7CiAJfQogCiAJcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwpAQCAtMjA4LDYgKzIwOCw4IEBACiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWZyZWVfbmV0ZGV2KG5kZXYpOwogCXByaXYgPSBOVUxMOworICAgICAgZG9fcGNpX2NsZWFyX213aToKKwlwY2lfY2xlYXJfbXdpKHBkZXYpOwogICAgICAgZG9fcGNpX3JlbGVhc2VfcmVnaW9uczoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogICAgICAgZG9fcGNpX2Rpc2FibGVfZGV2aWNlOgpAQCAtMjQxLDcgKzI0Myw3IEBACiAJCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKIAkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfT0ZGKTsKIAkJLyogVGhpcyBiZWxsb3cgY2F1c2VzIGEgbG9ja3VwIGF0IHJtbW9kIHRpbWUuIEl0IG1pZ2h0IGJlCi0JCSAqIGJlY2F1c2Ugc29tZSBpbnRlcnJ1cHRzIHN0aWxsIGxpbmdlciBhZnRlciBybW1vZCB0aW1lLCAKKwkJICogYmVjYXVzZSBzb21lIGludGVycnVwdHMgc3RpbGwgbGluZ2VyIGFmdGVyIHJtbW9kIHRpbWUsCiAJCSAqIHNlZSBidWcgIzE3ICovCiAJCS8qIHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMyk7Ki8JLyogdHJ5IHRvIHBvd2VyLW9mZiAqLwogCX0KQEAgLTI1NSw2ICsyNTcsOCBAQAogCWZyZWVfbmV0ZGV2KG5kZXYpOwogCXByaXYgPSBOVUxMOwogCisJcGNpX2NsZWFyX213aShwZGV2KTsKKwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CkBAIC0yODgsMTIgKzI5MiwxOSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmRldiA/IG5ldGRldl9wcml2KG5kZXYpIDogTlVMTDsKKwlpbnQgZXJyOworCiAJQlVHX09OKCFwcml2KTsKIAotCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCiAJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZ290IHJlc3VtZSByZXF1ZXN0XG4iLCBuZGV2LT5uYW1lKTsKIAorCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIG9uIHJlc3VtZVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KKwogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCiAJLyogYWxyaWdodCBsZXQncyBnbyBpbnRvIHRoZSBQUkVCT09UIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCmluZGV4IDJlMDYxYTguLjIyNDZmNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgogICogIENvcHlyaWdodCAyMDA0IEplbnMgTWF1cmVyIDxKZW5zLk1hdXJlckBnbXgubmV0PgogICoKQEAgLTM4Nyw3ICszODYsNyBAQAogCiAJCQkvKiBDcmVhdGUgd29yayB0byBoYW5kbGUgdHJhcCBvdXQgb2YgaW50ZXJydXB0CiAJCQkgKiBjb250ZXh0LiAqLwotCQkJSU5JVF9XT1JLKCZmcmFtZS0+d3MsIHByaXNtNTRfcHJvY2Vzc190cmFwLCBmcmFtZSk7CisJCQlJTklUX1dPUksoJmZyYW1lLT53cywgcHJpc201NF9wcm9jZXNzX3RyYXApOwogCQkJc2NoZWR1bGVfd29yaygmZnJhbWUtPndzKTsKIAogCQl9IGVsc2UgewpAQCAtNTAyLDcgKzUwMSw3IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgbWdtdCByZXNwb25zZVxuIiwKIAkgICAgICAgbmRldi0+bmFtZSk7CiAKLQkvKiBUT0RPOiB3ZSBzaG91bGQgcmVzZXQgdGhlIGRldmljZSBoZXJlICovICAgICAKKwkvKiBUT0RPOiB3ZSBzaG91bGQgcmVzZXQgdGhlIGRldmljZSBoZXJlICovCiAgb3V0OgogCWZpbmlzaF93YWl0KCZwcml2LT5tZ210X3dxdWV1ZSwgJndhaXQpOwogCXVwKCZwcml2LT5tZ210X3NlbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCmluZGV4IDI5ODJiZTMuLmZjNTNiNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgogICogIENvcHlyaWdodCAoQykgMjAwMyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KICAqCkBAIC0zNiw4ICszNSw4IEBACiAKIAogLyogR2VuZXJhbCBkcml2ZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgUENJREVWSUNFX0xBVEVOQ1lfVElNRVJfTUlOIAkJMHg0MAotI2RlZmluZSBQQ0lERVZJQ0VfTEFURU5DWV9USU1FUl9WQUwgCQkweDUwCisjZGVmaW5lIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX01JTgkJMHg0MAorI2RlZmluZSBQQ0lERVZJQ0VfTEFURU5DWV9USU1FUl9WQUwJCTB4NTAKIAogLyogRGVidWdnaW5nIHZlcmJvc2UgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgU0hPV19OT1RISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAJLyogb3ZlcnJ1bGVzIGV2ZXJ5dGhpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMKaW5kZXggZWJiMjM4Ny4uZTZjZjlkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMKQEAgLTEsNCArMSw0IEBACi0vKiAgIAorLyoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDMsMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjM1LDEyICsyMzUsMTAgQEAKIHsKIAlpbnQgaTsKIAotCXByaXYtPm1pYiA9IGttYWxsb2MoT0lEX05VTV9MQVNUICogc2l6ZW9mICh2b2lkICopLCBHRlBfS0VSTkVMKTsKKwlwcml2LT5taWIgPSBrY2FsbG9jKE9JRF9OVU1fTEFTVCwgc2l6ZW9mICh2b2lkICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYtPm1pYikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQocHJpdi0+bWliLCAwLCBPSURfTlVNX0xBU1QgKiBzaXplb2YgKHZvaWQgKikpOwotCiAJLyogQWxsb2MgdGhlIGNhY2hlICovCiAJZm9yIChpID0gMDsgaSA8IE9JRF9OVU1fTEFTVDsgaSsrKSB7CiAJCWlmIChpc2xfb2lkW2ldLmZsYWdzICYgT0lEX0ZMQUdfQ0FDSEVEKSB7CkBAIC01MDMsNyArNTAxLDcgQEAKIAkJfQogCQlpZiAocmV0IHx8IHJlc3BvbnNlX29wID09IFBJTUZPUl9PUF9FUlJPUikKIAkJCXJldCA9IC1FSU87Ci0JfSBlbHNlIAorCX0gZWxzZQogCQlyZXQgPSAtRUlPOwogCiAJLyogcmUtc2V0IGdpdmVuIGRhdGEgdG8gd2hhdCBpdCB3YXMgKi8KQEAgLTcyNyw3ICs3MjUsNyBAQAogICogTUVESVVNTElNSVQsQkVBQ09OUEVSSU9ELERUSU1QRVJJT0QsQVRJTVdJTkRPVyxMSVNURU5JTlRFUlZBTAogICogRlJFUVVFTkNZLEVYVEVOREVEUkFURVMuCiAgKgotICogVGhlIHdheSB0byBkbyB0aGlzIGlzIHRvIHNldCBFU1NJRC4gTm90ZSB0aG91Z2ggdGhhdCB0aGV5IG1heSBnZXQgCisgKiBUaGUgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2V0IEVTU0lELiBOb3RlIHRob3VnaCB0aGF0IHRoZXkgbWF5IGdldAogICogdW5sYXRjaCBiZWZvcmUgdGhvdWdoIGJ5IHNldHRpbmcgYW5vdGhlciBPSUQuICovCiAjaWYgMAogdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9wcmlzbWNvbXBhdC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9wcmlzbWNvbXBhdC5oCmluZGV4IGQ3MWVjYTUuLmFhMWQxNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmgKQEAgLTEsNCArMSw0IEBACi0vKiAgCisvKgogICogIChDKSAyMDA0IE1hcmdpdCBTY2h1YmVydC1XaGlsZSA8bWFyZ2l0c3dAdC1vbmxpbmUuZGU+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xNiw3ICsxNiw3IEBACiAgKgogICovCiAKLS8qICAKKy8qCiAgKglDb21wYXRpYmlsaXR5IGhlYWRlciBmaWxlIHRvIGFpZCBzdXBwb3J0IG9mIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbnMKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCmluZGV4IDBiMzgxZDcuLjg4ZTEwYzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtNDA4LDExICs0MDgsOCBAQAogI2RlZmluZSBNQVhfVFVQTEVfU0laRSAxMjgKIHN0YXRpYyBpbnQgcmF5X2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLSAgICB0dXBsZV90IHR1cGxlOwotICAgIGNpc3BhcnNlX3QgcGFyc2U7CiAgICAgaW50IGxhc3RfZm4gPSAwLCBsYXN0X3JldCA9IDA7CiAgICAgaW50IGk7Ci0gICAgdV9jaGFyIGJ1ZltNQVhfVFVQTEVfU0laRV07CiAgICAgd2luX3JlcV90IHJlcTsKICAgICBtZW1yZXFfdCBtZW07CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWxpbmstPnByaXY7CkBAIC00MjAsMjkgKzQxNywxMiBAQAogCiAgICAgREVCVUcoMSwgInJheV9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgLyogVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uIHJlZ3MgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0gICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IE1BWF9UVVBMRV9TSVpFOwotICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KICAgICAvKiBEZXRlcm1pbmUgY2FyZCB0eXBlIGFuZCBmaXJtd2FyZSB2ZXJzaW9uICovCi0gICAgYnVmWzBdID0gYnVmW01BWF9UVVBMRV9TSVpFIC0gMV0gPSAwOwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gTUFYX1RVUExFX1NJWkU7Ci0gICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAyOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCi0gICAgZm9yIChpPTA7IGk8dHVwbGUuVHVwbGVEYXRhTGVuIC0gNDsgaSsrKSAKLSAgICAgICAgaWYgKGJ1ZltpXSA9PSAwKSBidWZbaV0gPSAnICc7Ci0gICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2NzIERldGVjdGVkOiAlc1xuIixidWYpOworICAgIHByaW50ayhLRVJOX0lORk8gInJheV9jcyBEZXRlY3RlZDogJXMlcyVzJXNcbiIsCisJICAgbGluay0+cHJvZF9pZFswXSA/IGxpbmstPnByb2RfaWRbMF0gOiAiICIsCisJICAgbGluay0+cHJvZF9pZFsxXSA/IGxpbmstPnByb2RfaWRbMV0gOiAiICIsCisJICAgbGluay0+cHJvZF9pZFsyXSA/IGxpbmstPnByb2RfaWRbMl0gOiAiICIsCisJICAgbGluay0+cHJvZF9pZFszXSA/IGxpbmstPnByb2RfaWRbM10gOiAiICIpOwogCiAgICAgLyogTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKICAgICAgICBhY3R1YWxseSBhc3NpZ24gYSBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQuCkBAIC0xMTk4LDcgKzExNzgsNiBAQAogCiAJLyogR2V0IHRoZSBlc3NpZCB0aGF0IHdhcyBzZXQgKi8KIAltZW1jcHkoZXh0cmEsIGxvY2FsLT5zcGFybS5iNS5hX2N1cnJlbnRfZXNzX2lkLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JZXh0cmFbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKIAogCS8qIFB1c2ggaXQgb3V0ICEgKi8KIAlkd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3BlY3RydW1fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3NwZWN0cnVtX2NzLmMKaW5kZXggYmNjNzAzOC4uY2YyZDE0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3BlY3RydW1fY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zcGVjdHJ1bV9jcy5jCkBAIC02NDcsMjEgKzY0Nyw2IEBACiAJY2lzcGFyc2VfdCBwYXJzZTsKIAl2b2lkIF9faW9tZW0gKm1lbTsKIAotCS8qCi0JICogVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cwotCSAqIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgotCSAqLwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwotCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQogCS8qIExvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCiAJQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sCiAJCSBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhsaW5rLCAmY29uZikpOwpAQCAtNjgxLDYgKzY2NiwxMCBAQAogCSAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KIAkgKi8KIAl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwogCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAJd2hpbGUgKDEpIHsKIAkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCmluZGV4IDMzN2M2OTIuLmNlM2E4YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYwpAQCAtNzk4LDcgKzc5OCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNldF9iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBiYXVkY29kZSkKIHsKLQlzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvcyA9ICoodHR5LT50ZXJtaW9zKTsKKwlzdHJ1Y3Qga3Rlcm1pb3Mgb2xkX3Rlcm1pb3MgPSAqKHR0eS0+dGVybWlvcyk7CiAJdHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsJLyogQ2xlYXIgdGhlIG9sZCBiYXVkIHNldHRpbmcgKi8KIAl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gYmF1ZGNvZGU7CS8qIFNldCB0aGUgbmV3IGJhdWQgc2V0dGluZyAqLwogCXR0eS0+ZHJpdmVyLT5zZXRfdGVybWlvcyh0dHksICZvbGRfdGVybWlvcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKaW5kZXggYWFmYjMwMS4uNWViODE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwpAQCAtNjAzLDcgKzYwMyw3IEBACiAgIGlmKGxwLT53YXZlcG9pbnRfdGFibGUubnVtX3dhdmVwb2ludHM9PU1BWF9XQVZFUE9JTlRTKQogICAgIHJldHVybiBOVUxMOwogICAKLSAgbmV3X3dhdmVwb2ludD0od2F2ZXBvaW50X2hpc3RvcnkgKikga21hbGxvYyhzaXplb2Yod2F2ZXBvaW50X2hpc3RvcnkpLEdGUF9BVE9NSUMpOworICBuZXdfd2F2ZXBvaW50ID0ga21hbGxvYyhzaXplb2Yod2F2ZXBvaW50X2hpc3RvcnkpLEdGUF9BVE9NSUMpOwogICBpZihuZXdfd2F2ZXBvaW50PT1OVUxMKQogICAgIHJldHVybiBOVUxMOwogICAKQEAgLTM5MzksMTEgKzM5MzksOCBAQAogc3RhdGljIGlubGluZSBpbnQKIHd2X3BjbWNpYV9jb25maWcoc3RydWN0IHBjbWNpYV9kZXZpY2UgKglsaW5rKQogewotICB0dXBsZV90CQl0dXBsZTsKLSAgY2lzcGFyc2VfdAkJcGFyc2U7CiAgIHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGxpbmstPnByaXY7CiAgIGludAkJCWk7Ci0gIHVfY2hhcgkJYnVmWzY0XTsKICAgd2luX3JlcV90CQlyZXE7CiAgIG1lbXJlcV90CQltZW07CiAgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0zOTUzLDM2ICszOTUwLDYgQEAKICAgcHJpbnRrKEtFUk5fREVCVUcgIi0+d3ZfcGNtY2lhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAjZW5kaWYKIAotICAvKgotICAgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KLSAgICogcmVnaXN0ZXJzLgotICAgKi8KLSAgZG8KLSAgICB7Ci0gICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpOwotICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQotCWJyZWFrOwotICAgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLSAgICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwotICAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgICAgaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOwotICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQotCWJyZWFrOwotICAgICAgaSA9IHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7Ci0gICAgICBpZihpICE9IENTX1NVQ0NFU1MpCi0JYnJlYWs7Ci0gICAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLSAgICB9Ci0gIHdoaWxlKDApOwotICBpZihpICE9IENTX1NVQ0NFU1MpCi0gICAgewotICAgICAgY3NfZXJyb3IobGluaywgUGFyc2VUdXBsZSwgaSk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCiAgIGRvCiAgICAgewogICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCmluZGV4IDViOThhNzguLjU4M2UwZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCkBAIC0xOTY2LDI1ICsxOTY2LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgd2wzNTAxX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKLQl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgcGFyc2U7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAJaW50IGkgPSAwLCBqLCBsYXN0X2ZuLCBsYXN0X3JldDsKLQl1bnNpZ25lZCBjaGFyIGJmWzY0XTsKIAlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXM7CiAKLQkvKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZyByZWdpc3RlcnMuICovCi0JdHVwbGUuQXR0cmlidXRlcwk9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlCT0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCXR1cGxlLlR1cGxlRGF0YQkJPSBiZjsKLQl0dXBsZS5UdXBsZURhdGFNYXgJPSBzaXplb2YoYmYpOwotCXR1cGxlLlR1cGxlT2Zmc2V0CT0gMDsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UJPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQJPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KIAkvKiBUcnkgYWxsb2NhdGluZyBJTyBwb3J0cy4gIFRoaXMgdHJpZXMgYSBmZXcgZml4ZWQgYWRkcmVzc2VzLiAgSWYgeW91CiAJICogd2FudCwgeW91IGNhbiBhbHNvIHJlYWQgdGhlIGNhcmQncyBjb25maWcgdGFibGUgdG8gcGljayBhZGRyZXNzZXMgLS0KIAkgKiBzZWUgdGhlIHNlcmlhbCBkcml2ZXIgZm9yIGFuIGV4YW1wbGUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMDEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCmluZGV4IDMwMDU3YTMuLjZjYjY2YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCkBAIC0xOTMsMTAgKzE5Myw4IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBjaGFyIHR5cGU7CiAKLQlpZiAoIXpkKSB7Ci0JCWZyZWUgPSAxOwotCQlnb3RvIGV4aXQ7Ci0JfQorCWlmICghemQpCisJCXJldHVybjsKIAogCXN3aXRjaCh1cmItPnN0YXR1cykgewogCQljYXNlIC1FSUxTRVE6CkBAIC0xODMwLDEwICsxODI4LDggQEAKIAkvKiBMZWF2ZSB0aGUgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCiAJemQxMjAxX2RvY21kKHpkLCBaRDEyMDFfQ01EQ09ERV9JTklULCAwLCAwLCAwKTsKIGVycl96ZDoKLQlpZiAoemQtPnR4X3VyYikKLQkJdXNiX2ZyZWVfdXJiKHpkLT50eF91cmIpOwotCWlmICh6ZC0+cnhfdXJiKQotCQl1c2JfZnJlZV91cmIoemQtPnJ4X3VyYik7CisJdXNiX2ZyZWVfdXJiKHpkLT50eF91cmIpOworCXVzYl9mcmVlX3VyYih6ZC0+cnhfdXJiKTsKIAlrZnJlZSh6ZCk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYwppbmRleCBhYTY2MWIyLi43OGVhNzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAogCS8qIEFsbG9jYXRlIGEgc2luZ2xlIG1lbW9yeSBibG9jayBmb3IgdmFsdWVzIGFuZCBhZGRyZXNzZXMuICovCiAJY291bnQxNiA9IDIqY291bnQ7Ci0JYTE2ID0gKHpkX2FkZHJfdCAqKWttYWxsb2MoY291bnQxNiAqIChzaXplb2YoemRfYWRkcl90KSArIHNpemVvZih1MTYpKSwKKwlhMTYgPSBrbWFsbG9jKGNvdW50MTYgKiAoc2l6ZW9mKHpkX2FkZHJfdCkgKyBzaXplb2YodTE2KSksCiAJCSAgICAgICAgICAgICAgICAgICBHRlBfTk9GUyk7CiAJaWYgKCFhMTYpIHsKIAkJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLApAQCAtMTA3Niw2ICsxMDc2LDMxIEBACiAJcmV0dXJuIHpkX2lvd3JpdGUzMl9sb2NrZWQoY2hpcCwgcmF0ZXMsIENSX01BTkRBVE9SWV9SQVRFX1RCTCk7CiB9CiAKK2ludCB6ZF9jaGlwX3NldF9ydHNfY3RzX3JhdGVfbG9ja2VkKHN0cnVjdCB6ZF9jaGlwICpjaGlwLAorCXU4IHJ0c19yYXRlLCBpbnQgcHJlYW1ibGUpCit7CisJaW50IHJ0c19tb2QgPSBaRF9SWF9DQ0s7CisJdTMyIHZhbHVlID0gMDsKKworCS8qIE1vZHVsYXRpb24gYml0ICovCisJaWYgKFpEX0NTX1RZUEUocnRzX3JhdGUpID09IFpEX0NTX09GRE0pCisJCXJ0c19tb2QgPSBaRF9SWF9PRkRNOworCisJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAicnRzX3JhdGU9JXggcHJlYW1ibGU9JXhcbiIsCisJCXJ0c19yYXRlLCBwcmVhbWJsZSk7CisKKwl2YWx1ZSB8PSBydHNfcmF0ZSA8PCBSVFNDVFNfU0hfUlRTX1JBVEU7CisJdmFsdWUgfD0gcnRzX21vZCA8PCBSVFNDVFNfU0hfUlRTX01PRF9UWVBFOworCXZhbHVlIHw9IHByZWFtYmxlIDw8IFJUU0NUU19TSF9SVFNfUE1CX1RZUEU7CisJdmFsdWUgfD0gcHJlYW1ibGUgPDwgUlRTQ1RTX1NIX0NUU19QTUJfVFlQRTsKKworCS8qIFdlIGFsd2F5cyBzZW5kIDExTSBzZWxmLUNUUyBtZXNzYWdlcywgbGlrZSB0aGUgdmVuZG9yIGRyaXZlci4gKi8KKwl2YWx1ZSB8PSBaRF9DQ0tfUkFURV8xMU0gPDwgUlRTQ1RTX1NIX0NUU19SQVRFOworCXZhbHVlIHw9IFpEX1JYX0NDSyA8PCBSVFNDVFNfU0hfQ1RTX01PRF9UWVBFOworCisJcmV0dXJuIHpkX2lvd3JpdGUzMl9sb2NrZWQoY2hpcCwgdmFsdWUsIENSX1JUU19DVFNfUkFURSk7Cit9CisKIGludCB6ZF9jaGlwX2VuYWJsZV9od2ludChzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKIHsKIAlpbnQgcjsKQEAgLTEzNTUsMTcgKzEzODAsMTIgQEAKIAlyZXR1cm4gcjsKIH0KIAotaW50IHpkX2NoaXBfc2V0X2Jhc2ljX3JhdGVzKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1MTYgY3JfcmF0ZXMpCitpbnQgemRfY2hpcF9zZXRfYmFzaWNfcmF0ZXNfbG9ja2VkKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1MTYgY3JfcmF0ZXMpCiB7Ci0JaW50IHI7CisJWkRfQVNTRVJUKChjcl9yYXRlcyAmIH4oQ1JfUkFURVNfODAyMTFCIHwgQ1JfUkFURVNfODAyMTFHKSkgPT0gMCk7CisJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiJXhcbiIsIGNyX3JhdGVzKTsKIAotCWlmIChjcl9yYXRlcyAmIH4oQ1JfUkFURVNfODAyMTFCfENSX1JBVEVTXzgwMjExRykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCXIgPSB6ZF9pb3dyaXRlMzJfbG9ja2VkKGNoaXAsIGNyX3JhdGVzLCBDUl9CQVNJQ19SQVRFX1RCTCk7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7Ci0JcmV0dXJuIHI7CisJcmV0dXJuIHpkX2lvd3JpdGUzMl9sb2NrZWQoY2hpcCwgY3JfcmF0ZXMsIENSX0JBU0lDX1JBVEVfVEJMKTsKIH0KIAogc3RhdGljIGludCBvZmRtX3F1YWxfZGIodTggc3RhdHVzX3F1YWxpdHksIHU4IHJhdGUsIHVuc2lnbmVkIGludCBzaXplKQpAQCAtMTY1MywzICsxNjczLDE2IEBACiAKIAlyZXR1cm4gMDsKIH0KKworaW50IHpkX2NoaXBfc2V0X211bHRpY2FzdF9oYXNoKHN0cnVjdCB6ZF9jaGlwICpjaGlwLAorCSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHpkX21jX2hhc2ggKmhhc2gpCit7CisJc3RydWN0IHpkX2lvcmVxMzIgaW9yZXFzW10gPSB7CisJCXsgQ1JfR1JPVVBfSEFTSF9QMSwgaGFzaC0+bG93IH0sCisJCXsgQ1JfR1JPVVBfSEFTSF9QMiwgaGFzaC0+aGlnaCB9LAorCX07CisKKwlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICJoYXNoIGwgMHglMDh4IGggMHglMDh4XG4iLAorCQlpb3JlcXNbMF0udmFsdWUsIGlvcmVxc1sxXS52YWx1ZSk7CisJcmV0dXJuIHpkX2lvd3JpdGUzMmEoY2hpcCwgaW9yZXFzLCBBUlJBWV9TSVpFKGlvcmVxcykpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCmluZGV4IGFlNTk1OTcuLmE0ZTNjZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKQEAgLTMzNywyNCArMzM3LDI0IEBACiAjZGVmaW5lIENSX01BQ19QU19TVEFURQkJCUNUTF9SRUcoMHgwNTBDKQogCiAjZGVmaW5lIENSX0lOVEVSUlVQVAkJCUNUTF9SRUcoMHgwNTEwKQotI2RlZmluZSBJTlRfVFhfQ09NUExFVEUJCQkweDAwMDAwMDAxCi0jZGVmaW5lIElOVF9SWF9DT01QTEVURQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgSU5UX1JFVFJZX0ZBSUwJCQkweDAwMDAwMDA0Ci0jZGVmaW5lIElOVF9XQUtFVVAJCQkweDAwMDAwMDA4Ci0jZGVmaW5lIElOVF9EVElNX05PVElGWQkJCTB4MDAwMDAwMjAKLSNkZWZpbmUgSU5UX0NGR19ORVhUX0JDTgkJMHgwMDAwMDA0MAotI2RlZmluZSBJTlRfQlVTX0FCT1JUCQkJMHgwMDAwMDA4MAotI2RlZmluZSBJTlRfVFhfRklGT19SRUFEWQkJMHgwMDAwMDEwMAotI2RlZmluZSBJTlRfVUFSVAkJCTB4MDAwMDAyMDAKLSNkZWZpbmUgSU5UX1RYX0NPTVBMRVRFX0VOCQkweDAwMDEwMDAwCi0jZGVmaW5lIElOVF9SWF9DT01QTEVURV9FTgkJMHgwMDAyMDAwMAotI2RlZmluZSBJTlRfUkVUUllfRkFJTF9FTgkJMHgwMDA0MDAwMAotI2RlZmluZSBJTlRfV0FLRVVQX0VOCQkJMHgwMDA4MDAwMAotI2RlZmluZSBJTlRfRFRJTV9OT1RJRllfRU4JCTB4MDAyMDAwMDAKLSNkZWZpbmUgSU5UX0NGR19ORVhUX0JDTl9FTgkJMHgwMDQwMDAwMAotI2RlZmluZSBJTlRfQlVTX0FCT1JUX0VOCQkweDAwODAwMDAwCi0jZGVmaW5lIElOVF9UWF9GSUZPX1JFQURZX0VOCQkweDAxMDAwMDAwCi0jZGVmaW5lIElOVF9VQVJUX0VOCQkJMHgwMjAwMDAwMAorI2RlZmluZSBJTlRfVFhfQ09NUExFVEUJCQkoMSA8PCAgMCkKKyNkZWZpbmUgSU5UX1JYX0NPTVBMRVRFCQkJKDEgPDwgIDEpCisjZGVmaW5lIElOVF9SRVRSWV9GQUlMCQkJKDEgPDwgIDIpCisjZGVmaW5lIElOVF9XQUtFVVAJCQkoMSA8PCAgMykKKyNkZWZpbmUgSU5UX0RUSU1fTk9USUZZCQkJKDEgPDwgIDUpCisjZGVmaW5lIElOVF9DRkdfTkVYVF9CQ04JCSgxIDw8ICA2KQorI2RlZmluZSBJTlRfQlVTX0FCT1JUCQkJKDEgPDwgIDcpCisjZGVmaW5lIElOVF9UWF9GSUZPX1JFQURZCQkoMSA8PCAgOCkKKyNkZWZpbmUgSU5UX1VBUlQJCQkoMSA8PCAgOSkKKyNkZWZpbmUgSU5UX1RYX0NPTVBMRVRFX0VOCQkoMSA8PCAxNikKKyNkZWZpbmUgSU5UX1JYX0NPTVBMRVRFX0VOCQkoMSA8PCAxNykKKyNkZWZpbmUgSU5UX1JFVFJZX0ZBSUxfRU4JCSgxIDw8IDE4KQorI2RlZmluZSBJTlRfV0FLRVVQX0VOCQkJKDEgPDwgMTkpCisjZGVmaW5lIElOVF9EVElNX05PVElGWV9FTgkJKDEgPDwgMjEpCisjZGVmaW5lIElOVF9DRkdfTkVYVF9CQ05fRU4JCSgxIDw8IDIyKQorI2RlZmluZSBJTlRfQlVTX0FCT1JUX0VOCQkoMSA8PCAyMykKKyNkZWZpbmUgSU5UX1RYX0ZJRk9fUkVBRFlfRU4JCSgxIDw8IDI0KQorI2RlZmluZSBJTlRfVUFSVF9FTgkJCSgxIDw8IDI1KQogCiAjZGVmaW5lIENSX1RTRl9MT1dfUEFSVAkJCUNUTF9SRUcoMHgwNTE0KQogI2RlZmluZSBDUl9UU0ZfSElHSF9QQVJUCQlDVExfUkVHKDB4MDUxOCkKQEAgLTM5MCwyNiArMzkwLDM1IEBACiAjZGVmaW5lIENSX0JTU0lEX1AxCQkJQ1RMX1JFRygweDA2MTgpCiAjZGVmaW5lIENSX0JTU0lEX1AyCQkJQ1RMX1JFRygweDA2MUMpCiAjZGVmaW5lIENSX0JDTl9QTENQX0NGRwkJCUNUTF9SRUcoMHgwNjIwKQorCisvKiBHcm91cCBoYXNoIHRhYmxlIGZvciBmaWx0ZXJpbmcgaW5jb21pbmcgcGFja2V0cy4KKyAqCisgKiBUaGUgZ3JvdXAgaGFzaCB0YWJsZSBpcyA2NCBiaXQgbGFyZ2UgYW5kIHNwbGl0IG92ZXIgdHdvIHBhcnRzLiBUaGUgZmlyc3QKKyAqIHBhcnQgaXMgdGhlIGxvd2VyIHBhcnQuIFRoZSB1cHBlciA2IGJpdHMgb2YgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgdGFyZ2V0CisgKiBhZGRyZXNzIGFyZSB1c2VkIGFzIGluZGV4LiBQYWNrZXRzIGFyZSByZWNlaXZlZCBpZiB0aGUgaGFzaCB0YWJsZSBiaXQgaXMKKyAqIHNldC4gVGhpcyBpcyB1c2VkIGZvciBtdWx0aWNhc3QgaGFuZGxpbmcsIGJ1dCBmb3IgYnJvYWRjYXN0cyAoYWRkcmVzcworICogZmY6ZmY6ZmY6ZmY6ZmY6ZmYpIHRoZSBoaWdoZXN0IGJpdCBpbiB0aGUgc2Vjb25kIHRhYmxlIG11c3QgYWxzbyBiZSBzZXQuCisgKi8KICNkZWZpbmUgQ1JfR1JPVVBfSEFTSF9QMQkJQ1RMX1JFRygweDA2MjQpCiAjZGVmaW5lIENSX0dST1VQX0hBU0hfUDIJCUNUTF9SRUcoMHgwNjI4KQotI2RlZmluZSBDUl9SWF9USU1FT1VUCQkJQ1RMX1JFRygweDA2MkMpCiAKKyNkZWZpbmUgQ1JfUlhfVElNRU9VVAkJCUNUTF9SRUcoMHgwNjJDKQogLyogQmFzaWMgcmF0ZXMgc3VwcG9ydGVkIGJ5IHRoZSBCU1MuIFdoZW4gcHJvZHVjaW5nIEFDSyBvciBDVFMgbWVzc2FnZXMsIHRoZQogICogZGV2aWNlIHdpbGwgdXNlIGEgcmF0ZSBpbiB0aGlzIHRhYmxlIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSByYXRlCiAgKiBvZiB0aGUgaW5jb21pbmcgZnJhbWUgd2hpY2ggcHJvbXB0ZWQgdGhlIHJlc3BvbnNlICovCiAjZGVmaW5lIENSX0JBU0lDX1JBVEVfVEJMCQlDVExfUkVHKDB4MDYzMCkKLSNkZWZpbmUgQ1JfUkFURV8xTQkweDAwMDEJLyogODAyLjExYiAqLwotI2RlZmluZSBDUl9SQVRFXzJNCTB4MDAwMgkvKiA4MDIuMTFiICovCi0jZGVmaW5lIENSX1JBVEVfNV81TQkweDAwMDQJLyogODAyLjExYiAqLwotI2RlZmluZSBDUl9SQVRFXzExTQkweDAwMDgJLyogODAyLjExYiAqLwotI2RlZmluZSBDUl9SQVRFXzZNICAgICAgMHgwMTAwCS8qIDgwMi4xMWcgKi8KLSNkZWZpbmUgQ1JfUkFURV85TSAgICAgIDB4MDIwMAkvKiA4MDIuMTFnICovCi0jZGVmaW5lIENSX1JBVEVfMTJNCTB4MDQwMAkvKiA4MDIuMTFnICovCi0jZGVmaW5lIENSX1JBVEVfMThNCTB4MDgwMAkvKiA4MDIuMTFnICovCi0jZGVmaW5lIENSX1JBVEVfMjRNICAgICAweDEwMDAJLyogODAyLjExZyAqLwotI2RlZmluZSBDUl9SQVRFXzM2TSAgICAgMHgyMDAwCS8qIDgwMi4xMWcgKi8KLSNkZWZpbmUgQ1JfUkFURV80OE0gICAgIDB4NDAwMAkvKiA4MDIuMTFnICovCi0jZGVmaW5lIENSX1JBVEVfNTRNICAgICAweDgwMDAJLyogODAyLjExZyAqLworI2RlZmluZSBDUl9SQVRFXzFNCSgxIDw8ICAwKQkvKiA4MDIuMTFiICovCisjZGVmaW5lIENSX1JBVEVfMk0JKDEgPDwgIDEpCS8qIDgwMi4xMWIgKi8KKyNkZWZpbmUgQ1JfUkFURV81XzVNCSgxIDw8ICAyKQkvKiA4MDIuMTFiICovCisjZGVmaW5lIENSX1JBVEVfMTFNCSgxIDw8ICAzKQkvKiA4MDIuMTFiICovCisjZGVmaW5lIENSX1JBVEVfNk0gICAgICAoMSA8PCAgOCkJLyogODAyLjExZyAqLworI2RlZmluZSBDUl9SQVRFXzlNICAgICAgKDEgPDwgIDkpCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgQ1JfUkFURV8xMk0JKDEgPDwgMTApCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgQ1JfUkFURV8xOE0JKDEgPDwgMTEpCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgQ1JfUkFURV8yNE0gICAgICgxIDw8IDEyKQkvKiA4MDIuMTFnICovCisjZGVmaW5lIENSX1JBVEVfMzZNICAgICAoMSA8PCAxMykJLyogODAyLjExZyAqLworI2RlZmluZSBDUl9SQVRFXzQ4TSAgICAgKDEgPDwgMTQpCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgQ1JfUkFURV81NE0gICAgICgxIDw8IDE1KQkvKiA4MDIuMTFnICovCiAjZGVmaW5lIENSX1JBVEVTXzgwMjExRwkweGZmMDAKICNkZWZpbmUgQ1JfUkFURVNfODAyMTFCCTB4MDAwZgogCkBAIC00MjAsMTUgKzQyOSwyNCBAQAogI2RlZmluZSBDUl9NQU5EQVRPUllfUkFURV9UQkwJCUNUTF9SRUcoMHgwNjM0KQogI2RlZmluZSBDUl9SVFNfQ1RTX1JBVEUJCQlDVExfUkVHKDB4MDYzOCkKIAorLyogVGhlc2UgYXJlIGFsbCBiaXQgaW5kZXhlcyBpbiBDUl9SVFNfQ1RTX1JBVEUsIHNvIHJlbWVtYmVyIHRvIHNoaWZ0LiAqLworI2RlZmluZSBSVFNDVFNfU0hfUlRTX1JBVEUJCTAKKyNkZWZpbmUgUlRTQ1RTX1NIX0VYUF9DVFNfUkFURQkJNAorI2RlZmluZSBSVFNDVFNfU0hfUlRTX01PRF9UWVBFCQk4CisjZGVmaW5lIFJUU0NUU19TSF9SVFNfUE1CX1RZUEUJCTkKKyNkZWZpbmUgUlRTQ1RTX1NIX0NUU19SQVRFCQkxNgorI2RlZmluZSBSVFNDVFNfU0hfQ1RTX01PRF9UWVBFCQkyNAorI2RlZmluZSBSVFNDVFNfU0hfQ1RTX1BNQl9UWVBFCQkyNQorCiAjZGVmaW5lIENSX1dFUF9QUk9URUNUCQkJQ1RMX1JFRygweDA2M0MpCiAjZGVmaW5lIENSX1JYX1RIUkVTSE9MRAkJCUNUTF9SRUcoMHgwNjQwKQogCiAvKiByZWdpc3RlciBmb3IgY29udHJvbGxpbmcgdGhlIExFRFMgKi8KICNkZWZpbmUgQ1JfTEVECQkJCUNUTF9SRUcoMHgwNjQ0KQogLyogbWFza3MgZm9yIGNvbnRyb2xsaW5nIExFRHMgKi8KLSNkZWZpbmUgTEVEMQkJCQkweDAxMDAKLSNkZWZpbmUgTEVEMgkJCQkweDAyMDAKLSNkZWZpbmUgTEVEX1NXCQkJCTB4MDQwMAorI2RlZmluZSBMRUQxCQkJCSgxIDw8ICA4KQorI2RlZmluZSBMRUQyCQkJCSgxIDw8ICA5KQorI2RlZmluZSBMRURfU1cJCQkJKDEgPDwgMTApCiAKIC8qIFNlZW1zIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgb3Zlci4KICAqLwpAQCAtNDU1LDE4ICs0NzMsMTggQEAKICAqIHJlZ2lzdGVycywgc28gb25lIGNvdWxkIGFyZ3VlIGl0IGlzIGEgTE9DSyBiaXQuIEJ1dCBjYWxsaW5nIGl0CiAgKiBMT0NLX1BIWV9SRUdTIG1ha2VzIGl0IGNvbmZ1c2luZy4KICAqLwotI2RlZmluZSBVTkxPQ0tfUEhZX1JFR1MJCQkweDAwODAKKyNkZWZpbmUgVU5MT0NLX1BIWV9SRUdTCQkJKDEgPDwgNykKIAogI2RlZmluZSBDUl9ERVZJQ0VfU1RBVEUJCQlDVExfUkVHKDB4MDY4NCkKICNkZWZpbmUgQ1JfVU5ERVJSVU5fQ05UCQkJQ1RMX1JFRygweDA2ODgpCiAKICNkZWZpbmUgQ1JfUlhfRklMVEVSCQkJQ1RMX1JFRygweDA2OGMpCi0jZGVmaW5lIFJYX0ZJTFRFUl9BU1NPQ19SRVNQT05TRQkweDAwMDIKLSNkZWZpbmUgUlhfRklMVEVSX1JFQVNTT0NfUkVTUE9OU0UJMHgwMDA4Ci0jZGVmaW5lIFJYX0ZJTFRFUl9QUk9CRV9SRVNQT05TRQkweDAwMjAKLSNkZWZpbmUgUlhfRklMVEVSX0JFQUNPTgkJMHgwMTAwCi0jZGVmaW5lIFJYX0ZJTFRFUl9ESVNBU1NPQwkJMHgwNDAwCi0jZGVmaW5lIFJYX0ZJTFRFUl9BVVRICQkJMHgwODAwCisjZGVmaW5lIFJYX0ZJTFRFUl9BU1NPQ19SRVNQT05TRQkoMSA8PCAgMSkKKyNkZWZpbmUgUlhfRklMVEVSX1JFQVNTT0NfUkVTUE9OU0UJKDEgPDwgIDMpCisjZGVmaW5lIFJYX0ZJTFRFUl9QUk9CRV9SRVNQT05TRQkoMSA8PCAgNSkKKyNkZWZpbmUgUlhfRklMVEVSX0JFQUNPTgkJKDEgPDwgIDgpCisjZGVmaW5lIFJYX0ZJTFRFUl9ESVNBU1NPQwkJKDEgPDwgMTApCisjZGVmaW5lIFJYX0ZJTFRFUl9BVVRICQkJKDEgPDwgMTEpCiAjZGVmaW5lIEFQX1JYX0ZJTFRFUgkJCTB4MDQwMGZlZmYKICNkZWZpbmUgU1RBX1JYX0ZJTFRFUgkJCTB4MDAwMGZmZmYKIApAQCAtNzk0LDYgKzgxMiw5IEBACiBpbnQgemRfY2hpcF9lbmFibGVfaHdpbnQoc3RydWN0IHpkX2NoaXAgKmNoaXApOwogaW50IHpkX2NoaXBfZGlzYWJsZV9od2ludChzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiAKK2ludCB6ZF9jaGlwX3NldF9ydHNfY3RzX3JhdGVfbG9ja2VkKHN0cnVjdCB6ZF9jaGlwICpjaGlwLAorCXU4IHJ0c19yYXRlLCBpbnQgcHJlYW1ibGUpOworCiBzdGF0aWMgaW5saW5lIGludCB6ZF9nZXRfZW5jcnlwdGlvbl90eXBlKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1MzIgKnR5cGUpCiB7CiAJcmV0dXJuIHpkX2lvcmVhZDMyKGNoaXAsIENSX0VOQ1JZUFRJT05fVFlQRSwgdHlwZSk7CkBAIC04MDksNyArODMwLDE3IEBACiAJcmV0dXJuIHpkX2lvcmVhZDE2KGNoaXAsIENSX0JBU0lDX1JBVEVfVEJMLCBjcl9yYXRlcyk7CiB9CiAKLWludCB6ZF9jaGlwX3NldF9iYXNpY19yYXRlcyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTE2IGNyX3JhdGVzKTsKK2ludCB6ZF9jaGlwX3NldF9iYXNpY19yYXRlc19sb2NrZWQoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHUxNiBjcl9yYXRlcyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHpkX2NoaXBfc2V0X2Jhc2ljX3JhdGVzKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1MTYgY3JfcmF0ZXMpCit7CisJaW50IHI7CisKKwltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CisJciA9IHpkX2NoaXBfc2V0X2Jhc2ljX3JhdGVzX2xvY2tlZChjaGlwLCBjcl9yYXRlcyk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIHI7Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHpkX2NoaXBfc2V0X3J4X2ZpbHRlcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTMyIGZpbHRlcikKIHsKQEAgLTg0Miw0ICs4NzMsMzYgQEAKIAogdTE2IHpkX3J4X3JhdGUoY29uc3Qgdm9pZCAqcnhfZnJhbWUsIGNvbnN0IHN0cnVjdCByeF9zdGF0dXMgKnN0YXR1cyk7CiAKK3N0cnVjdCB6ZF9tY19oYXNoIHsKKwl1MzIgbG93OworCXUzMiBoaWdoOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHpkX21jX2NsZWFyKHN0cnVjdCB6ZF9tY19oYXNoICpoYXNoKQoreworCWhhc2gtPmxvdyA9IDA7CisJLyogVGhlIGludGVyZmFjZXMgbXVzdCBhbHdheXMgcmVjZWl2ZWQgYnJvYWRjYXN0cy4KKwkgKiBUaGUgaGFzaCBvZiB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgZmY6ZmY6ZmY6ZmY6ZmY6ZmYgaXMgNjMuCisJICovCisJaGFzaC0+aGlnaCA9IDB4ODAwMDAwMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB6ZF9tY19hZGRfYWxsKHN0cnVjdCB6ZF9tY19oYXNoICpoYXNoKQoreworCWhhc2gtPmxvdyA9IGhhc2gtPmhpZ2ggPSAweGZmZmZmZmZmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgemRfbWNfYWRkX2FkZHIoc3RydWN0IHpkX21jX2hhc2ggKmhhc2gsIHU4ICphZGRyKQoreworCXVuc2lnbmVkIGludCBpID0gYWRkcls1XSA+PiAyOworCWlmIChpIDwgMzIpIHsKKwkJaGFzaC0+bG93IHw9IDEgPDwgaTsKKwl9IGVsc2UgeworCQloYXNoLT5oaWdoIHw9IDEgPDwgKGktMzIpOworCX0KK30KKworaW50IHpkX2NoaXBfc2V0X211bHRpY2FzdF9oYXNoKHN0cnVjdCB6ZF9jaGlwICpjaGlwLAorCSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHpkX21jX2hhc2ggKmhhc2gpOworCiAjZW5kaWYgLyogX1pEX0NISVBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfZGVmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaAppbmRleCBhMTNlYzcyLi5mYjIyZjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaApAQCAtMzksNiArMzksNyBAQAogCWlmICghKHgpKSB7IFwKIAkJcHJfZGVidWcoIiVzOiVkIEFTU0VSVCAlcyBWSU9MQVRFRCFcbiIsIFwKIAkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19zdHJpbmdpZnkoeCkpOyBcCisJCWR1bXBfc3RhY2soKTsgXAogCX0gXAogfSB3aGlsZSAoMCkKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9pZWVlODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5jCmluZGV4IDY2OTA1ZjcuLjE4OTE2MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5jCkBAIC0zNyw3ICszNywxMiBAQAogCVtaRF9SRUdET01BSU5fSkFQQU5dCSA9IHsgMSwgMTR9LAogCVtaRF9SRUdET01BSU5fU1BBSU5dCSA9IHsgMSwgMTR9LAogCVtaRF9SRUdET01BSU5fRlJBTkNFXQkgPSB7IDEsIDE0fSwKLQlbWkRfUkVHRE9NQUlOX0pBUEFOX0FERF0gPSB7MTQsIDE1fSwKKworCS8qIEphcGFuIG9yaWdpbmFsbHkgb25seSBoYWQgY2hhbm5lbCAxNCBhdmFpbGFibGUgKHNlZSBDSE5MX0lEIDB4NDAgaW4KKwkgKiA4MDIuMTEpLiBIb3dldmVyLCBpbiAyMDAxIHRoZSByYW5nZSB3YXMgZXh0ZW5kZWQgdG8gaW5jbHVkZSBjaGFubmVscworCSAqIDEtMTMuIFRoZSBaeURBUyBkZXZpY2VzIHN0aWxsIHVzZSB0aGUgb2xkIHJlZ2lvbiBjb2RlIGJ1dCBhcmUKKwkgKiBkZXNpZ25lZCB0byBhbGxvdyB0aGUgZXh0cmEgY2hhbm5lbCBhY2Nlc3MgaW4gSmFwYW4uICovCisJW1pEX1JFR0RPTUFJTl9KQVBBTl9BRERdID0geyAxLCAxNX0sCiB9OwogCiBjb25zdCBzdHJ1Y3QgY2hhbm5lbF9yYW5nZSAqemRfY2hhbm5lbF9yYW5nZSh1OCByZWdkb21haW4pCkBAIC0xMzMsOSArMTM4LDYgQEAKIAlpbnQgaSwgcjsKIAl1MzIgbWh6OwogCi0JaWYgKCEoZnJlcS0+ZmxhZ3MgJiBJV19GUkVRX0ZJWEVEKSkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoZnJlcS0+bSA8IDEwMDApIHsKIAkJaWYgKGZyZXEtPm0gID4gTlVNX0NIQU5ORUxTIHx8IGZyZXEtPm0gPT0gMCkKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9pZWVlODAyMTEuaAppbmRleCBmNjMyNDViLi4yNmI4Mjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9pZWVlODAyMTEuaApAQCAtNTAsNiArNTAsNyBAQAogCXJldHVybiBoZWFkZXItPnByZWZpeFswXSAmIDB4ZjsKIH0KIAorLyogVGhlc2UgYXJlIHJlZmVycmVkIHRvIGFzIHpkX3JhdGVzICovCiAjZGVmaW5lIFpEX09GRE1fUkFURV82TQkJMHhiCiAjZGVmaW5lIFpEX09GRE1fUkFURV85TQkJMHhmCiAjZGVmaW5lIFpEX09GRE1fUkFURV8xMk0JMHhhCkBAIC02NCw3ICs2NSw3IEBACiAJdTggc2VydmljZTsKIAlfX2xlMTYgbGVuZ3RoOwogCV9fbGUxNiBjcmMxNjsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdGF0aWMgaW5saW5lIHU4IHpkX2Nja19wbGNwX2hlYWRlcl9yYXRlKGNvbnN0IHN0cnVjdCBjY2tfcGxjcF9oZWFkZXIgKmhlYWRlcikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKaW5kZXggMmQxMjgzNy4uMDBjYTcwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKQEAgLTMyLDExICszMiwxNSBAQAogCiBzdGF0aWMgdm9pZCBpZWVlX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwogc3RhdGljIHZvaWQgc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqc20pOworc3RhdGljIHZvaWQgc2V0X3J0c19jdHNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgc2V0X2Jhc2ljX3JhdGVzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RhdGljIHZvaWQgaG91c2VrZWVwaW5nX2luaXQoc3RydWN0IHpkX21hYyAqbWFjKTsKIHN0YXRpYyB2b2lkIGhvdXNla2VlcGluZ19lbmFibGUoc3RydWN0IHpkX21hYyAqbWFjKTsKIHN0YXRpYyB2b2lkIGhvdXNla2VlcGluZ19kaXNhYmxlKHN0cnVjdCB6ZF9tYWMgKm1hYyk7CiAKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfaGFzaF9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIGludCB6ZF9tYWNfaW5pdChzdHJ1Y3QgemRfbWFjICptYWMsCiAJICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCSAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCkBAIC00NiwxMSArNTAsMTQgQEAKIAltZW1zZXQobWFjLCAwLCBzaXplb2YoKm1hYykpOwogCXNwaW5fbG9ja19pbml0KCZtYWMtPmxvY2spOwogCW1hYy0+bmV0ZGV2ID0gbmV0ZGV2OworCUlOSVRfREVMQVlFRF9XT1JLKCZtYWMtPnNldF9ydHNfY3RzX3dvcmssIHNldF9ydHNfY3RzX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZtYWMtPnNldF9iYXNpY19yYXRlc193b3JrLCBzZXRfYmFzaWNfcmF0ZXNfd29yayk7CiAKIAlpZWVlX2luaXQoaWVlZSk7CiAJc29mdG1hY19pbml0KGllZWU4MDIxMV9wcml2KG5ldGRldikpOwogCXpkX2NoaXBfaW5pdCgmbWFjLT5jaGlwLCBuZXRkZXYsIGludGYpOwogCWhvdXNla2VlcGluZ19pbml0KG1hYyk7CisJSU5JVF9XT1JLKCZtYWMtPnNldF9tdWx0aWNhc3RfaGFzaF93b3JrLCBzZXRfbXVsdGljYXN0X2hhc2hfaGFuZGxlcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMiw2ICsxMzksNyBAQAogCiB2b2lkIHpkX21hY19jbGVhcihzdHJ1Y3QgemRfbWFjICptYWMpCiB7CisJZmx1c2hfd29ya3F1ZXVlKHpkX3dvcmtxdWV1ZSk7CiAJemRfY2hpcF9jbGVhcigmbWFjLT5jaGlwKTsKIAlaRF9BU1NFUlQoIXNwaW5faXNfbG9ja2VkKCZtYWMtPmxvY2spKTsKIAlaRF9NRU1DTEVBUihtYWMsIHNpemVvZihzdHJ1Y3QgemRfbWFjKSk7CkBAIC0yMTMsNiArMjIxLDEzIEBACiAJaG91c2VrZWVwaW5nX2Rpc2FibGUobWFjKTsKIAlpZWVlODAyMTFzb2Z0bWFjX3N0b3AobmV0ZGV2KTsKIAorCS8qIEVuc3VyZSBubyB3b3JrIGl0ZW1zIGFyZSBydW5uaW5nIG9yIHF1ZXVlZCBmcm9tIHRoaXMgcG9pbnQgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrKCZtYWMtPnNldF9ydHNfY3RzX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJm1hYy0+c2V0X2Jhc2ljX3JhdGVzX3dvcmspOworCWZsdXNoX3dvcmtxdWV1ZSh6ZF93b3JrcXVldWUpOworCW1hYy0+dXBkYXRpbmdfcnRzX3JhdGUgPSAwOworCW1hYy0+dXBkYXRpbmdfYmFzaWNfcmF0ZXMgPSAwOworCiAJemRfY2hpcF9kaXNhYmxlX2h3aW50KGNoaXApOwogCXpkX2NoaXBfc3dpdGNoX3JhZGlvX29mZihjaGlwKTsKIAl6ZF9jaGlwX2Rpc2FibGVfaW50KGNoaXApOwpAQCAtMjQ1LDYgKzI2MCw0MyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2hhc2hfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHpkX21hYyAqbWFjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB6ZF9tYWMsCisJCQkJCSAgc2V0X211bHRpY2FzdF9oYXNoX3dvcmspOworCXN0cnVjdCB6ZF9tY19oYXNoIGhhc2g7CisKKwlzcGluX2xvY2tfaXJxKCZtYWMtPmxvY2spOworCWhhc2ggPSBtYWMtPm11bHRpY2FzdF9oYXNoOworCXNwaW5fdW5sb2NrX2lycSgmbWFjLT5sb2NrKTsKKworCXpkX2NoaXBfc2V0X211bHRpY2FzdF9oYXNoKCZtYWMtPmNoaXAsICZoYXNoKTsKK30KKwordm9pZCB6ZF9tYWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHpkX21jX2hhc2ggaGFzaDsKKwlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF9uZXRkZXZfbWFjKGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICptYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkgeworCQl6ZF9tY19hZGRfYWxsKCZoYXNoKTsKKwl9IGVsc2UgeworCQl6ZF9tY19jbGVhcigmaGFzaCk7CisJCWZvciAobWMgPSBkZXYtPm1jX2xpc3Q7IG1jOyBtYyA9IG1jLT5uZXh0KSB7CisJCQlkZXZfZGJnX2YoemRfbWFjX2RldihtYWMpLCAibWMgYWRkciAiIE1BQ19GTVQgIlxuIiwKKwkJCQkgIE1BQ19BUkcobWMtPmRtaV9hZGRyKSk7CisJCQl6ZF9tY19hZGRfYWRkcigmaGFzaCwgbWMtPmRtaV9hZGRyKTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwltYWMtPm11bHRpY2FzdF9oYXNoID0gaGFzaDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwlxdWV1ZV93b3JrKHpkX3dvcmtxdWV1ZSwgJm1hYy0+c2V0X211bHRpY2FzdF9oYXNoX3dvcmspOworfQorCiBpbnQgemRfbWFjX3NldF9yZWdkb21haW4oc3RydWN0IHpkX21hYyAqbWFjLCB1OCByZWdkb21haW4pCiB7CiAJaW50IHI7CkBAIC0yODYsNiArMzM4LDE4OSBAQAogCXJldHVybiByZWdkb21haW47CiB9CiAKKy8qIEZhbGxiYWNrIHRvIGxvd2VzdCByYXRlLCBpZiByYXRlIGlzIHVua25vd24uICovCitzdGF0aWMgdTggcmF0ZV90b196ZF9yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COgorCQlyZXR1cm4gWkRfQ0NLX1JBVEVfMk07CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COgorCQlyZXR1cm4gWkRfQ0NLX1JBVEVfNV81TTsKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgorCQlyZXR1cm4gWkRfQ0NLX1JBVEVfMTFNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV82TUI6CisJCXJldHVybiBaRF9PRkRNX1JBVEVfNk07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjoKKwkJcmV0dXJuIFpEX09GRE1fUkFURV85TTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKKwkJcmV0dXJuIFpEX09GRE1fUkFURV8xMk07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJCXJldHVybiBaRF9PRkRNX1JBVEVfMThNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgorCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzI0TTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKKwkJcmV0dXJuIFpEX09GRE1fUkFURV8zNk07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJCXJldHVybiBaRF9PRkRNX1JBVEVfNDhNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgorCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzU0TTsKKwl9CisJcmV0dXJuIFpEX0NDS19SQVRFXzFNOworfQorCitzdGF0aWMgdTE2IHJhdGVfdG9fY3JfcmF0ZSh1OCByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKKwkJcmV0dXJuIENSX1JBVEVfMU07CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COgorCQlyZXR1cm4gQ1JfUkFURV81XzVNOworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6CisJCXJldHVybiBDUl9SQVRFXzExTTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgorCQlyZXR1cm4gQ1JfUkFURV82TTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COgorCQlyZXR1cm4gQ1JfUkFURV85TTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKKwkJcmV0dXJuIENSX1JBVEVfMTJNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COgorCQlyZXR1cm4gQ1JfUkFURV8xOE07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6CisJCXJldHVybiBDUl9SQVRFXzI0TTsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKKwkJcmV0dXJuIENSX1JBVEVfMzZNOworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV80OE1COgorCQlyZXR1cm4gQ1JfUkFURV80OE07CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6CisJCXJldHVybiBDUl9SQVRFXzU0TTsKKwl9CisJcmV0dXJuIENSX1JBVEVfMU07Cit9CisKK3N0YXRpYyB2b2lkIHRyeV9lbmFibGVfdHgoc3RydWN0IHpkX21hYyAqbWFjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7CisJaWYgKG1hYy0+dXBkYXRpbmdfcnRzX3JhdGUgPT0gMCAmJiBtYWMtPnVwZGF0aW5nX2Jhc2ljX3JhdGVzID09IDApCisJCW5ldGlmX3dha2VfcXVldWUobWFjLT5uZXRkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcnRzX2N0c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgemRfbWFjICptYWMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHpkX21hYywgc2V0X3J0c19jdHNfd29yay53b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHJ0c19yYXRlOworCXVuc2lnbmVkIGludCBzaG9ydF9wcmVhbWJsZTsKKworCW11dGV4X2xvY2soJm1hYy0+Y2hpcC5tdXRleCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7CisJbWFjLT51cGRhdGluZ19ydHNfcmF0ZSA9IDA7CisJcnRzX3JhdGUgPSBtYWMtPnJ0c19yYXRlOworCXNob3J0X3ByZWFtYmxlID0gbWFjLT5zaG9ydF9wcmVhbWJsZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKworCXpkX2NoaXBfc2V0X3J0c19jdHNfcmF0ZV9sb2NrZWQoJm1hYy0+Y2hpcCwgcnRzX3JhdGUsIHNob3J0X3ByZWFtYmxlKTsKKwltdXRleF91bmxvY2soJm1hYy0+Y2hpcC5tdXRleCk7CisKKwl0cnlfZW5hYmxlX3R4KG1hYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9iYXNpY19yYXRlc193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgemRfbWFjICptYWMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHpkX21hYywgc2V0X2Jhc2ljX3JhdGVzX3dvcmsud29yayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgYmFzaWNfcmF0ZXM7CisKKwltdXRleF9sb2NrKCZtYWMtPmNoaXAubXV0ZXgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW1hYy0+dXBkYXRpbmdfYmFzaWNfcmF0ZXMgPSAwOworCWJhc2ljX3JhdGVzID0gbWFjLT5iYXNpY19yYXRlczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKworCXpkX2NoaXBfc2V0X2Jhc2ljX3JhdGVzX2xvY2tlZCgmbWFjLT5jaGlwLCBiYXNpY19yYXRlcyk7CisJbXV0ZXhfdW5sb2NrKCZtYWMtPmNoaXAubXV0ZXgpOworCisJdHJ5X2VuYWJsZV90eChtYWMpOworfQorCitzdGF0aWMgdm9pZCBic3NpbmZvX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgY2hhbmdlcykKK3sKKwlzdHJ1Y3QgemRfbWFjICptYWMgPSB6ZF9uZXRkZXZfbWFjKG5ldGRldik7CisJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICpzb2Z0bWFjID0gaWVlZTgwMjExX3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19ic3NfaW5mbyAqYnNzaW5mbyA9ICZzb2Z0bWFjLT5ic3NpbmZvOworCWludCBuZWVkX3NldF9ydHNfY3RzID0gMDsKKwlpbnQgbmVlZF9zZXRfcmF0ZXMgPSAwOworCXUxNiBiYXNpY19yYXRlczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZ19mKHpkX21hY19kZXYobWFjKSwgImNoYW5nZXM6ICV4XG4iLCBjaGFuZ2VzKTsKKworCWlmIChjaGFuZ2VzICYgSUVFRTgwMjExU09GVE1BQ19CU1NJTkZPQ0hHX1NIT1JUX1BSRUFNQkxFKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwkJbWFjLT5zaG9ydF9wcmVhbWJsZSA9IGJzc2luZm8tPnNob3J0X3ByZWFtYmxlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwkJbmVlZF9zZXRfcnRzX2N0cyA9IDE7CisJfQorCisJaWYgKGNoYW5nZXMgJiBJRUVFODAyMTFTT0ZUTUFDX0JTU0lORk9DSEdfUkFURVMpIHsKKwkJLyogU2V0IFJUUyByYXRlIHRvIGhpZ2hlc3QgYXZhaWxhYmxlIGJhc2ljIHJhdGUgKi8KKwkJdTggcmF0ZSA9IGllZWU4MDIxMXNvZnRtYWNfaGlnaGVzdF9zdXBwb3J0ZWRfcmF0ZShzb2Z0bWFjLAorCQkJJmJzc2luZm8tPnN1cHBvcnRlZF9yYXRlcywgMSk7CisJCXJhdGUgPSByYXRlX3RvX3pkX3JhdGUocmF0ZSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCQlpZiAocmF0ZSAhPSBtYWMtPnJ0c19yYXRlKSB7CisJCQltYWMtPnJ0c19yYXRlID0gcmF0ZTsKKwkJCW5lZWRfc2V0X3J0c19jdHMgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCisJCS8qIFNldCBiYXNpYyByYXRlcyAqLworCQluZWVkX3NldF9yYXRlcyA9IDE7CisJCWlmIChic3NpbmZvLT5zdXBwb3J0ZWRfcmF0ZXMuY291bnQgPT0gMCkgeworCQkJLyogQWxsb3cgdGhlIGRldmljZSB0byBiZSBmbGV4aWJsZSAqLworCQkJYmFzaWNfcmF0ZXMgPSBDUl9SQVRFU184MDIxMUIgfCBDUl9SQVRFU184MDIxMUc7CisJCX0gZWxzZSB7CisJCQlpbnQgaSA9IDA7CisJCQliYXNpY19yYXRlcyA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBic3NpbmZvLT5zdXBwb3J0ZWRfcmF0ZXMuY291bnQ7IGkrKykgeworCQkJCXUxNiByYXRlID0gYnNzaW5mby0+c3VwcG9ydGVkX3JhdGVzLnJhdGVzW2ldOworCQkJCWlmICgocmF0ZSAmIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spID09IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmF0ZSAmPSB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSzsKKwkJCQliYXNpY19yYXRlcyB8PSByYXRlX3RvX2NyX3JhdGUocmF0ZSk7CisJCQl9CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCQltYWMtPmJhc2ljX3JhdGVzID0gYmFzaWNfcmF0ZXM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCX0KKworCS8qIFNjaGVkdWxlIGFueSBjaGFuZ2VzIHdlIG1hZGUgYWJvdmUgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwlpZiAobmVlZF9zZXRfcnRzX2N0cyAmJiAhbWFjLT51cGRhdGluZ19ydHNfcmF0ZSkgeworCQltYWMtPnVwZGF0aW5nX3J0c19yYXRlID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShtYWMtPm5ldGRldik7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayh6ZF93b3JrcXVldWUsICZtYWMtPnNldF9ydHNfY3RzX3dvcmssIDApOworCX0KKwlpZiAobmVlZF9zZXRfcmF0ZXMgJiYgIW1hYy0+dXBkYXRpbmdfYmFzaWNfcmF0ZXMpIHsKKwkJbWFjLT51cGRhdGluZ19iYXNpY19yYXRlcyA9IDE7CisJCW5ldGlmX3N0b3BfcXVldWUobWFjLT5uZXRkZXYpOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoemRfd29ya3F1ZXVlLCAmbWFjLT5zZXRfYmFzaWNfcmF0ZXNfd29yaywKKwkJCQkgICAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIHNldF9jaGFubmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHU4IGNoYW5uZWwpCiB7CiAJc3RydWN0IHpkX21hYyAqbWFjID0gemRfbmV0ZGV2X21hYyhuZXRkZXYpOwpAQCAtMjk1LDcgKzUzMCw2IEBACiAJemRfY2hpcF9zZXRfY2hhbm5lbCgmbWFjLT5jaGlwLCBjaGFubmVsKTsKIH0KIAotLyogVE9ETzogU2hvdWxkIG5vdCB3b3JrIGluIE1hbmFnZWQgbW9kZS4gKi8KIGludCB6ZF9tYWNfcmVxdWVzdF9jaGFubmVsKHN0cnVjdCB6ZF9tYWMgKm1hYywgdTggY2hhbm5lbCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CkBAIC0zMTcsMzEgKzU1MSwyMiBAQAogCQlyZXR1cm4gMDsKIH0KIAotaW50IHpkX21hY19nZXRfY2hhbm5lbChzdHJ1Y3QgemRfbWFjICptYWMsIHU4ICpjaGFubmVsLCB1OCAqZmxhZ3MpCit1OCB6ZF9tYWNfZ2V0X2NoYW5uZWwoc3RydWN0IHpkX21hYyAqbWFjKQogewotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gemRfbWFjX3RvX2llZWU4MDIxMShtYWMpOworCXU4IGNoYW5uZWwgPSB6ZF9jaGlwX2dldF9jaGFubmVsKCZtYWMtPmNoaXApOwogCi0JKmNoYW5uZWwgPSB6ZF9jaGlwX2dldF9jaGFubmVsKCZtYWMtPmNoaXApOwotCWlmIChpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpIHsKLQkJc3Bpbl9sb2NrX2lycSgmbWFjLT5sb2NrKTsKLQkJKmZsYWdzID0gKmNoYW5uZWwgPT0gbWFjLT5yZXF1ZXN0ZWRfY2hhbm5lbCA/Ci0JCQlNQUNfRklYRURfQ0hBTk5FTCA6IDA7Ci0JCXNwaW5fdW5sb2NrKCZtYWMtPmxvY2spOwotCX0gZWxzZSB7Ci0JCSpmbGFncyA9IDA7Ci0JfQotCWRldl9kYmdfZih6ZF9tYWNfZGV2KG1hYyksICJjaGFubmVsICV1IGZsYWdzICV1XG4iLCAqY2hhbm5lbCwgKmZsYWdzKTsKLQlyZXR1cm4gMDsKKwlkZXZfZGJnX2YoemRfbWFjX2RldihtYWMpLCAiY2hhbm5lbCAldVxuIiwgY2hhbm5lbCk7CisJcmV0dXJuIGNoYW5uZWw7CiB9CiAKIC8qIElmIHdyb25nIHJhdGUgaXMgZ2l2ZW4sIHdlIGFyZSBmYWxsaW5nIGJhY2sgdG8gdGhlIHNsb3dlc3QgcmF0ZTogMU1CaXQvcyAqLwotc3RhdGljIHU4IGNzX3R5cGVkX3JhdGUodTggY3NfcmF0ZSkKK3N0YXRpYyB1OCB6ZF9yYXRlX3R5cGVkKHU4IHpkX3JhdGUpCiB7CiAJc3RhdGljIGNvbnN0IHU4IHR5cGVkX3JhdGVzWzE2XSA9IHsKLQkJW1pEX0NTX0NDS19SQVRFXzFNXQk9IFpEX0NTX0NDS3xaRF9DU19DQ0tfUkFURV8xTSwKLQkJW1pEX0NTX0NDS19SQVRFXzJNXQk9IFpEX0NTX0NDS3xaRF9DU19DQ0tfUkFURV8yTSwKLQkJW1pEX0NTX0NDS19SQVRFXzVfNU1dCT0gWkRfQ1NfQ0NLfFpEX0NTX0NDS19SQVRFXzVfNU0sCi0JCVtaRF9DU19DQ0tfUkFURV8xMU1dCT0gWkRfQ1NfQ0NLfFpEX0NTX0NDS19SQVRFXzExTSwKKwkJW1pEX0NDS19SQVRFXzFNXQk9IFpEX0NTX0NDS3xaRF9DQ0tfUkFURV8xTSwKKwkJW1pEX0NDS19SQVRFXzJNXQk9IFpEX0NTX0NDS3xaRF9DQ0tfUkFURV8yTSwKKwkJW1pEX0NDS19SQVRFXzVfNU1dCT0gWkRfQ1NfQ0NLfFpEX0NDS19SQVRFXzVfNU0sCisJCVtaRF9DQ0tfUkFURV8xMU1dCT0gWkRfQ1NfQ0NLfFpEX0NDS19SQVRFXzExTSwKIAkJW1pEX09GRE1fUkFURV82TV0JPSBaRF9DU19PRkRNfFpEX09GRE1fUkFURV82TSwKIAkJW1pEX09GRE1fUkFURV85TV0JPSBaRF9DU19PRkRNfFpEX09GRE1fUkFURV85TSwKIAkJW1pEX09GRE1fUkFURV8xMk1dCT0gWkRfQ1NfT0ZETXxaRF9PRkRNX1JBVEVfMTJNLApAQCAtMzUzLDM3ICs1NzgsNyBAQAogCX07CiAKIAlaRF9BU1NFUlQoWkRfQ1NfUkFURV9NQVNLID09IDB4MGYpOwotCXJldHVybiB0eXBlZF9yYXRlc1tjc19yYXRlICYgWkRfQ1NfUkFURV9NQVNLXTsKLX0KLQotLyogRmFsbGJhY2sgdG8gbG93ZXN0IHJhdGUsIGlmIHJhdGUgaXMgdW5rbm93bi4gKi8KLXN0YXRpYyB1OCByYXRlX3RvX2NzX3JhdGUodTggcmF0ZSkKLXsKLQlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6Ci0JCXJldHVybiBaRF9DU19DQ0tfUkFURV8yTTsKLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6Ci0JCXJldHVybiBaRF9DU19DQ0tfUkFURV81XzVNOwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6Ci0JCXJldHVybiBaRF9DU19DQ0tfUkFURV8xMU07Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKLQkJcmV0dXJuIFpEX09GRE1fUkFURV82TTsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COgotCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzlNOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COgotCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzEyTTsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKLQkJcmV0dXJuIFpEX09GRE1fUkFURV8xOE07Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6Ci0JCXJldHVybiBaRF9PRkRNX1JBVEVfMjRNOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COgotCQlyZXR1cm4gWkRfT0ZETV9SQVRFXzM2TTsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKLQkJcmV0dXJuIFpEX09GRE1fUkFURV80OE07Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6Ci0JCXJldHVybiBaRF9PRkRNX1JBVEVfNTRNOwotCX0KLQlyZXR1cm4gWkRfQ1NfQ0NLX1JBVEVfMU07CisJcmV0dXJuIHR5cGVkX3JhdGVzW3pkX3JhdGUgJiBaRF9DU19SQVRFX01BU0tdOwogfQogCiBpbnQgemRfbWFjX3NldF9tb2RlKHN0cnVjdCB6ZF9tYWMgKm1hYywgdTMyIG1vZGUpCkBAIC00NjQsNiArNjU5LDkgQEAKIAlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKIAlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAyMDsKIAorCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8ICBJV19FTkNfQ0FQQV9XUEEyIHwKKwkJCSAgSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKwogCVpEX0FTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKIAlzcGluX2xvY2tfaXJxKCZtYWMtPmxvY2spOwogCXJlZ2RvbWFpbiA9IG1hYy0+cmVnZG9tYWluOwpAQCAtNDg0LDEzICs2ODIsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB6ZF9jYWxjX3R4X2xlbmd0aF91cyh1OCAqc2VydmljZSwgdTggY3NfcmF0ZSwgdTE2IHR4X2xlbmd0aCkKK3N0YXRpYyBpbnQgemRfY2FsY190eF9sZW5ndGhfdXModTggKnNlcnZpY2UsIHU4IHpkX3JhdGUsIHUxNiB0eF9sZW5ndGgpCiB7CiAJc3RhdGljIGNvbnN0IHU4IHJhdGVfZGl2aXNvcltdID0gewotCQlbWkRfQ1NfQ0NLX1JBVEVfMU1dCT0gIDEsCi0JCVtaRF9DU19DQ0tfUkFURV8yTV0JPSAgMiwKLQkJW1pEX0NTX0NDS19SQVRFXzVfNU1dCT0gMTEsIC8qIGJpdHMgbXVzdCBiZSBkb3VibGVkICovCi0JCVtaRF9DU19DQ0tfUkFURV8xMU1dCT0gMTEsCisJCVtaRF9DQ0tfUkFURV8xTV0JPSAgMSwKKwkJW1pEX0NDS19SQVRFXzJNXQk9ICAyLAorCQlbWkRfQ0NLX1JBVEVfNV81TV0JPSAxMSwgLyogYml0cyBtdXN0IGJlIGRvdWJsZWQgKi8KKwkJW1pEX0NDS19SQVRFXzExTV0JPSAxMSwKIAkJW1pEX09GRE1fUkFURV82TV0JPSAgNiwKIAkJW1pEX09GRE1fUkFURV85TV0JPSAgOSwKIAkJW1pEX09GRE1fUkFURV8xMk1dCT0gMTIsCkBAIC01MDQsMTUgKzcwMiwxNSBAQAogCXUzMiBiaXRzID0gKHUzMil0eF9sZW5ndGggKiA4OwogCXUzMiBkaXZpc29yOwogCi0JZGl2aXNvciA9IHJhdGVfZGl2aXNvcltjc19yYXRlXTsKKwlkaXZpc29yID0gcmF0ZV9kaXZpc29yW3pkX3JhdGVdOwogCWlmIChkaXZpc29yID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3dpdGNoIChjc19yYXRlKSB7Ci0JY2FzZSBaRF9DU19DQ0tfUkFURV81XzVNOgorCXN3aXRjaCAoemRfcmF0ZSkgeworCWNhc2UgWkRfQ0NLX1JBVEVfNV81TToKIAkJYml0cyA9ICgyKmJpdHMpICsgMTA7IC8qIHJvdW5kIHVwIHRvIHRoZSBuZXh0IGludGVnZXIgKi8KIAkJYnJlYWs7Ci0JY2FzZSBaRF9DU19DQ0tfUkFURV8xMU06CisJY2FzZSBaRF9DQ0tfUkFURV8xMU06CiAJCWlmIChzZXJ2aWNlKSB7CiAJCQl1MzIgdCA9IGJpdHMgJSAxMTsKIAkJCSpzZXJ2aWNlICY9IH5aRF9QTENQX1NFUlZJQ0VfTEVOR1RIX0VYVEVOU0lPTjsKQEAgLTUzMiwxNiArNzMwLDE2IEBACiAJUjJNXzExQQkJICAgPSAweDAyLAogfTsKIAotc3RhdGljIHU4IGNzX3JhdGVfdG9fbW9kdWxhdGlvbih1OCBjc19yYXRlLCBpbnQgZmxhZ3MpCitzdGF0aWMgdTggemRfcmF0ZV90b19tb2R1bGF0aW9uKHU4IHpkX3JhdGUsIGludCBmbGFncykKIHsKIAl1OCBtb2R1bGF0aW9uOwogCi0JbW9kdWxhdGlvbiA9IGNzX3R5cGVkX3JhdGUoY3NfcmF0ZSk7CisJbW9kdWxhdGlvbiA9IHpkX3JhdGVfdHlwZWQoemRfcmF0ZSk7CiAJaWYgKGZsYWdzICYgUjJNX1NIT1JUX1BSRUFNQkxFKSB7CiAJCXN3aXRjaCAoWkRfQ1NfUkFURShtb2R1bGF0aW9uKSkgewotCQljYXNlIFpEX0NTX0NDS19SQVRFXzJNOgotCQljYXNlIFpEX0NTX0NDS19SQVRFXzVfNU06Ci0JCWNhc2UgWkRfQ1NfQ0NLX1JBVEVfMTFNOgorCQljYXNlIFpEX0NDS19SQVRFXzJNOgorCQljYXNlIFpEX0NDS19SQVRFXzVfNU06CisJCWNhc2UgWkRfQ0NLX1JBVEVfMTFNOgogCQkJbW9kdWxhdGlvbiB8PSBaRF9DU19DQ0tfUFJFQV9TSE9SVDsKIAkJCXJldHVybiBtb2R1bGF0aW9uOwogCQl9CkBAIC01NTgsMzkgKzc1NiwzNiBAQAogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqc29mdG1hYyA9IGllZWU4MDIxMV9wcml2KG1hYy0+bmV0ZGV2KTsKIAl1MTYgZnR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSk7Ci0JdTggcmF0ZSwgY3NfcmF0ZTsKKwl1OCByYXRlLCB6ZF9yYXRlOwogCWludCBpc19tZ3QgPSAoZnR5cGUgPT0gSUVFRTgwMjExX0ZUWVBFX01HTVQpICE9IDA7CisJaW50IGlzX211bHRpY2FzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpOworCWludCBzaG9ydF9wcmVhbWJsZSA9IGllZWU4MDIxMXNvZnRtYWNfc2hvcnRfcHJlYW1ibGVfb2soc29mdG1hYywKKwkJaXNfbXVsdGljYXN0LCBpc19tZ3QpOworCWludCBmbGFncyA9IDA7CiAKLQkvKiBGSVhNRTogODAyLjExYT8gc2hvcnQgcHJlYW1ibGU/ICovCi0JcmF0ZSA9IGllZWU4MDIxMXNvZnRtYWNfc3VnZ2VzdF90eHJhdGUoc29mdG1hYywKLQkJaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSksIGlzX21ndCk7CisJLyogRklYTUU6IDgwMi4xMWE/ICovCisJcmF0ZSA9IGllZWU4MDIxMXNvZnRtYWNfc3VnZ2VzdF90eHJhdGUoc29mdG1hYywgaXNfbXVsdGljYXN0LCBpc19tZ3QpOwogCi0JY3NfcmF0ZSA9IHJhdGVfdG9fY3NfcmF0ZShyYXRlKTsKLQljcy0+bW9kdWxhdGlvbiA9IGNzX3JhdGVfdG9fbW9kdWxhdGlvbihjc19yYXRlLCAwKTsKKwlpZiAoc2hvcnRfcHJlYW1ibGUpCisJCWZsYWdzIHw9IFIyTV9TSE9SVF9QUkVBTUJMRTsKKworCXpkX3JhdGUgPSByYXRlX3RvX3pkX3JhdGUocmF0ZSk7CisJY3MtPm1vZHVsYXRpb24gPSB6ZF9yYXRlX3RvX21vZHVsYXRpb24oemRfcmF0ZSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBjc19zZXRfY29udHJvbChzdHJ1Y3QgemRfbWFjICptYWMsIHN0cnVjdCB6ZF9jdHJsc2V0ICpjcywKIAkgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlcikKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKnNvZnRtYWMgPSBpZWVlODAyMTFfcHJpdihtYWMtPm5ldGRldik7CiAJdW5zaWduZWQgaW50IHR4X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGNzLT50eF9sZW5ndGgpOwogCXUxNiBmY3RsID0gbGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jdGwpOwogCXUxNiBmdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmN0bCk7CiAJdTE2IHN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmN0bCk7CiAKIAkvKgotCSAqIENPTlRST0w6Ci0JICogLSBzdGFydCBhdCAweDAwCi0JICogLSBpZiBmcmFnbWVudCAwLCBlbmFibGUgYml0IDAKKwkgKiBDT05UUk9MIFRPRE86CiAJICogLSBpZiBiYWNrb2ZmIG5lZWRlZCwgZW5hYmxlIGJpdCAwCiAJICogLSBpZiBidXJzdCAoYmFja29mZiBub3QgbmVlZGVkKSBkaXNhYmxlIGJpdCAwCi0JICogLSBpZiBtdWx0aWNhc3QsIGVuYWJsZSBiaXQgMQotCSAqIC0gaWYgUFMtUE9MTCBmcmFtZSwgZW5hYmxlIGJpdCAyCi0JICogLSBpZiBpbiBJTkRFUEVOREVOVF9CU1MgbW9kZSBhbmQgemQxMjA1X0Rlc3RQb3dlclNhdmUsIHRoZW4gZW5hYmxlCi0JICogICBiaXQgNCAoRklYTUU6IHd0ZikKLQkgKiAtIGlmIGZyYWdfbGVuID4gUlRTIHRocmVzaG9sZCwgc2V0IGJpdCA1IGFzIGxvbmcgaWYgaXQgaXNudAotCSAqICAgbXVsdGljYXN0IG9yIG1ndAotCSAqIC0gaWYgYml0IDUgaXMgc2V0LCBhbmQgd2UgYXJlIGluIE9GRE0gbW9kZSwgdW5zZXQgYml0IDUgYW5kIHNldCBiaXQKLQkgKiAgIDcKIAkgKi8KIAogCWNzLT5jb250cm9sID0gMDsKQEAgLTYwNywxNyArODAyLDE4IEBACiAJaWYgKHN0eXBlID09IElFRUU4MDIxMV9TVFlQRV9QU1BPTEwpCiAJCWNzLT5jb250cm9sIHw9IFpEX0NTX1BTX1BPTExfRlJBTUU7CiAKKwkvKiBVbmljYXN0IGRhdGEgZnJhbWVzIG92ZXIgdGhlIHRocmVzaG9sZCBzaG91bGQgaGF2ZSBSVFMgKi8KIAlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpICYmCi0JICAgIGZ0eXBlICE9IElFRUU4MDIxMV9GVFlQRV9NR01UICYmCi0JICAgIHR4X2xlbmd0aCA+IHpkX25ldGRldl9pZWVlODAyMTEobWFjLT5uZXRkZXYpLT5ydHMpCi0JewotCQkvKiBGSVhNRTogY2hlY2sgdGhlIGxvZ2ljICovCi0JCWlmIChaRF9DU19UWVBFKGNzLT5tb2R1bGF0aW9uKSA9PSBaRF9DU19PRkRNKSB7Ci0JCQkvKiA4MDIuMTFnICovCi0JCQljcy0+Y29udHJvbCB8PSBaRF9DU19TRUxGX0NUUzsKLQkJfSBlbHNlIHsgLyogODAyLjExYiAqLwotCQkJY3MtPmNvbnRyb2wgfD0gWkRfQ1NfUlRTOwotCQl9CisJICAgIAlmdHlwZSAhPSBJRUVFODAyMTFfRlRZUEVfTUdNVCAmJgorCQkgICAgdHhfbGVuZ3RoID4gemRfbmV0ZGV2X2llZWU4MDIxMShtYWMtPm5ldGRldiktPnJ0cykKKwkJY3MtPmNvbnRyb2wgfD0gWkRfQ1NfUlRTOworCisJLyogVXNlIENUUy10by1zZWxmIHByb3RlY3Rpb24gaWYgcmVxdWlyZWQgKi8KKwlpZiAoWkRfQ1NfVFlQRShjcy0+bW9kdWxhdGlvbikgPT0gWkRfQ1NfT0ZETSAmJgorCQkJaWVlZTgwMjExc29mdG1hY19wcm90ZWN0aW9uX25lZWRlZChzb2Z0bWFjKSkgeworCQkvKiBGSVhNRTogYXZvaWQgc2VuZGluZyBSVFMgKmFuZCogc2VsZi1DVFMsIGlzIHRoYXQgY29ycmVjdD8gKi8KKwkJY3MtPmNvbnRyb2wgJj0gflpEX0NTX1JUUzsKKwkJY3MtPmNvbnRyb2wgfD0gWkRfQ1NfU0VMRl9DVFM7CiAJfQogCiAJLyogRklYTUU6IE1hbmFnZW1lbnQgZnJhbWU/ICovCkBAIC03MjEsNyArOTE3LDcgQEAKIAl1OCAgcnRfcmF0ZTsKIAl1MTYgcnRfY2hhbm5lbDsKIAl1MTYgcnRfY2hiaXRtYXNrOwotfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0YXRpYyB2b2lkIGZpbGxfcnRfaGVhZGVyKHZvaWQgKmJ1ZmZlciwgc3RydWN0IHpkX21hYyAqbWFjLAogCSAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cywKQEAgLTc3OCwxMyArOTc0LDE2IEBACiAJfQogCiAJcmV0dXJuIG1lbWNtcChoZHItPmFkZHIxLCBuZXRkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCB8fAotCSAgICAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fAorCSAgICAgICAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgJiYKKwkJbWVtY21wKGhkci0+YWRkcjMsIG5ldGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSAhPSAwKSB8fAogCSAgICAgICAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKTsKIH0KIAotLyogRmlsdGVycyByZWNlaXZpbmcgcGFja2V0cy4gSWYgaXQgcmV0dXJucyAxIHNlbmQgaXQgdG8gaWVlZTgwMjExX3J4LCBpZiAwCi0gKiByZXR1cm4uIElmIGFuIGVycm9yIGlzIGRldGVjdGVkIC1FSU5WQUwgaXMgcmV0dXJuZWQuIGllZWU4MDIxMV9yeF9tZ3QoKSBpcwotICogY2FsbGVkIGhlcmUuCisvKiBGaWx0ZXJzIHJlY2VpdmVkIHBhY2tldHMuIFRoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlIHBhY2tldCBzaG91bGQgYmUKKyAqIGZvcndhcmRlZCB0byBpZWVlODAyMTFfcngoKS4gSWYgdGhlIHBhY2tldCBzaG91bGQgYmUgaWdub3JlZCB0aGUgZnVuY3Rpb24KKyAqIHJldHVybnMgMC4gSWYgYW4gaW52YWxpZCBwYWNrZXQgaXMgZm91bmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgLUVJTlZBTC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gY2FsbHMgaWVlZTgwMjExX3J4X21ndCgpIGRpcmVjdGx5LgogICoKICAqIEl0IGhhcyBiZWVuIGJhc2VkIG9uIGllZWU4MDIxMV9yeF9hbnkuCiAgKi8KQEAgLTgxMCw5ICsxMDA5LDkgQEAKIAkJaWVlZTgwMjExX3J4X21ndChpZWVlLCBoZHIsIHN0YXRzKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgotCQkvKiBJZ25vcmUgaW52YWxpZCBzaG9ydCBidWZmZXJzICovCiAJCXJldHVybiAwOwogCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCS8qIElnbm9yZSBpbnZhbGlkIHNob3J0IGJ1ZmZlcnMgKi8KIAkJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGlzX2RhdGFfcGFja2V0X2Zvcl91cyhpZWVlLCBoZHIpOwpAQCAtOTA4LDEwICsxMTA3LDggQEAKIAltZW1jcHkoc2tiX3B1dChza2IsIGxlbmd0aCksIGJ1ZmZlciwgbGVuZ3RoKTsKIAogCXIgPSBpZWVlODAyMTFfcngoaWVlZSwgc2tiLCAmc3RhdHMpOwotCWlmICghcikgewotCQlaRF9BU1NFUlQoaW5faXJxKCkpOwotCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwotCX0KKwlpZiAoIXIpCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5Myw2ICsxMTkwLDcgQEAKIHN0YXRpYyB2b2lkIHNvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKnNtKQogewogCXNtLT5zZXRfY2hhbm5lbCA9IHNldF9jaGFubmVsOworCXNtLT5ic3NpbmZvX2NoYW5nZSA9IGJzc2luZm9fY2hhbmdlOwogfQogCiBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqemRfbWFjX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKQEAgLTEwMjgsNzggKzEyMjYsMTkgQEAKIAlyZXR1cm4gaXdfc3RhdHM7CiB9CiAKLSNpZmRlZiBERUJVRwotc3RhdGljIGNvbnN0IGNoYXIqIGRlY3J5cHRpb25fdHlwZXNbXSA9IHsKLQlbWkRfUlhfTk9fV0VQXSA9ICJub25lIiwKLQlbWkRfUlhfV0VQNjRdID0gIldFUDY0IiwKLQlbWkRfUlhfVEtJUF0gPSAiVEtJUCIsCi0JW1pEX1JYX0FFU10gPSAiQUVTIiwKLQlbWkRfUlhfV0VQMTI4XSA9ICJXRVAxMjgiLAotCVtaRF9SWF9XRVAyNTZdID0gIldFUDI1NiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZGVjcnlwdGlvbl90eXBlX3N0cmluZyh1OCB0eXBlKQotewotCWNvbnN0IGNoYXIgKnM7Ci0KLQlpZiAodHlwZSA8IEFSUkFZX1NJWkUoZGVjcnlwdGlvbl90eXBlcykpIHsKLQkJcyA9IGRlY3J5cHRpb25fdHlwZXNbdHlwZV07Ci0JfSBlbHNlIHsKLQkJcyA9IE5VTEw7Ci0JfQotCXJldHVybiBzID8gcyA6ICJ1bmtub3duIjsKLX0KLQotc3RhdGljIGludCBpc19vZmRtKHU4IGZyYW1lX3N0YXR1cykKLXsKLQlyZXR1cm4gKGZyYW1lX3N0YXR1cyAmIFpEX1JYX09GRE0pOwotfQotCi12b2lkIHpkX2R1bXBfcnhfc3RhdHVzKGNvbnN0IHN0cnVjdCByeF9zdGF0dXMgKnN0YXR1cykKLXsKLQljb25zdCBjaGFyKiBtb2R1bGF0aW9uOwotCXU4IHF1YWxpdHk7Ci0KLQlpZiAoaXNfb2ZkbShzdGF0dXMtPmZyYW1lX3N0YXR1cykpIHsKLQkJbW9kdWxhdGlvbiA9ICJvZmRtIjsKLQkJcXVhbGl0eSA9IHN0YXR1cy0+c2lnbmFsX3F1YWxpdHlfb2ZkbTsKLQl9IGVsc2UgewotCQltb2R1bGF0aW9uID0gImNjayI7Ci0JCXF1YWxpdHkgPSBzdGF0dXMtPnNpZ25hbF9xdWFsaXR5X2NjazsKLQl9Ci0JcHJfZGVidWcoInJ4IHN0YXR1cyAlcyBzdHJlbmd0aCAlIzA0eCBxdWFsICUjMDR4IGRlY3J5cHRpb24gJXNcbiIsCi0JCW1vZHVsYXRpb24sIHN0YXR1cy0+c2lnbmFsX3N0cmVuZ3RoLCBxdWFsaXR5LAotCQlkZWNyeXB0aW9uX3R5cGVfc3RyaW5nKHN0YXR1cy0+ZGVjcnlwdGlvbl90eXBlKSk7Ci0JaWYgKHN0YXR1cy0+ZnJhbWVfc3RhdHVzICYgWkRfUlhfRVJST1IpIHsKLQkJcHJfZGVidWcoInJ4IGVycm9yICVzJXMlcyVzJXMlc1xuIiwKLQkJCShzdGF0dXMtPmZyYW1lX3N0YXR1cyAmIFpEX1JYX1RJTUVPVVRfRVJST1IpID8KLQkJCQkidGltZW91dCAiIDogIiIsCi0JCQkoc3RhdHVzLT5mcmFtZV9zdGF0dXMgJiBaRF9SWF9GSUZPX09WRVJSVU5fRVJST1IpID8KLQkJCQkiZmlmbyAiIDogIiIsCi0JCQkoc3RhdHVzLT5mcmFtZV9zdGF0dXMgJiBaRF9SWF9ERUNSWVBUSU9OX0VSUk9SKSA/Ci0JCQkJImRlY3J5cHRpb24gIiA6ICIiLAotCQkJKHN0YXR1cy0+ZnJhbWVfc3RhdHVzICYgWkRfUlhfQ1JDMzJfRVJST1IpID8KLQkJCQkiY3JjMzIgIiA6ICIiLAotCQkJKHN0YXR1cy0+ZnJhbWVfc3RhdHVzICYgWkRfUlhfTk9fQUREUjFfTUFUQ0hfRVJST1IpID8KLQkJCQkiYWRkcjEgIiA6ICIiLAotCQkJKHN0YXR1cy0+ZnJhbWVfc3RhdHVzICYgWkRfUlhfQ1JDMTZfRVJST1IpID8KLQkJCQkiY3JjMTYiIDogIiIpOwotCX0KLX0KLSNlbmRpZiAvKiBERUJVRyAqLwotCiAjZGVmaW5lIExJTktfTEVEX1dPUktfREVMQVkgSFoKIAotc3RhdGljIHZvaWQgbGlua19sZWRfaGFuZGxlcih2b2lkICpwKQorc3RhdGljIHZvaWQgbGlua19sZWRfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHpkX21hYyAqbWFjID0gcDsKKwlzdHJ1Y3QgemRfbWFjICptYWMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHpkX21hYywgaG91c2VrZWVwaW5nLmxpbmtfbGVkX3dvcmsud29yayk7CiAJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSAmbWFjLT5jaGlwOwogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqc20gPSBpZWVlODAyMTFfcHJpdihtYWMtPm5ldGRldik7CiAJaW50IGlzX2Fzc29jaWF0ZWQ7CiAJaW50IHI7CiAKIAlzcGluX2xvY2tfaXJxKCZtYWMtPmxvY2spOwotCWlzX2Fzc29jaWF0ZWQgPSBzbS0+YXNzb2NpYXRlZCAhPSAwOworCWlzX2Fzc29jaWF0ZWQgPSBzbS0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgIT0gMDsKIAlzcGluX3VubG9ja19pcnEoJm1hYy0+bG9jayk7CiAKIAlyID0gemRfY2hpcF9jb250cm9sX2xlZHMoY2hpcCwKQEAgLTExMTMsNyArMTI1Miw3IEBACiAKIHN0YXRpYyB2b2lkIGhvdXNla2VlcGluZ19pbml0KHN0cnVjdCB6ZF9tYWMgKm1hYykKIHsKLQlJTklUX1dPUksoJm1hYy0+aG91c2VrZWVwaW5nLmxpbmtfbGVkX3dvcmssIGxpbmtfbGVkX2hhbmRsZXIsIG1hYyk7CisJSU5JVF9ERUxBWUVEX1dPUksoJm1hYy0+aG91c2VrZWVwaW5nLmxpbmtfbGVkX3dvcmssIGxpbmtfbGVkX2hhbmRsZXIpOwogfQogCiBzdGF0aWMgdm9pZCBob3VzZWtlZXBpbmdfZW5hYmxlKHN0cnVjdCB6ZF9tYWMgKm1hYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKaW5kZXggYjhlYTNkZS4uZjBjZjA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFzb2Z0bWFjLmg+CiAKQEAgLTQ4LDEwICs0OSwxMSBAQAogI2RlZmluZSBaRF9DU19DQ0sJCTB4MDAKICNkZWZpbmUgWkRfQ1NfT0ZETQkJMHgxMAogCi0jZGVmaW5lIFpEX0NTX0NDS19SQVRFXzFNCTB4MDAKLSNkZWZpbmUgWkRfQ1NfQ0NLX1JBVEVfMk0JMHgwMQotI2RlZmluZSBaRF9DU19DQ0tfUkFURV81XzVNCTB4MDIKLSNkZWZpbmUgWkRfQ1NfQ0NLX1JBVEVfMTFNCTB4MDMKKy8qIFRoZXNlIGFyZSByZWZlcnJlZCB0byBhcyB6ZF9yYXRlcyAqLworI2RlZmluZSBaRF9DQ0tfUkFURV8xTQkweDAwCisjZGVmaW5lIFpEX0NDS19SQVRFXzJNCTB4MDEKKyNkZWZpbmUgWkRfQ0NLX1JBVEVfNV81TQkweDAyCisjZGVmaW5lIFpEX0NDS19SQVRFXzExTQkweDAzCiAvKiBUaGUgcmF0ZXMgZm9yIE9GRE0gYXJlIGVuY29kZWQgYXMgaW4gdGhlIFBMQ1AgaGVhZGVyLiBVc2UgWkRfT0ZETV9SQVRFXyouCiAgKi8KIApAQCAtODIsNyArODQsNyBAQAogc3RydWN0IHJ4X2xlbmd0aF9pbmZvIHsKIAlfX2xlMTYgbGVuZ3RoWzNdOwogCV9fbGUxNiB0YWc7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2RlZmluZSBSWF9MRU5HVEhfSU5GT19UQUcJCTB4Njk3ZQogCkBAIC05Myw3ICs5NSw3IEBACiAJdTggc2lnbmFsX3F1YWxpdHlfb2ZkbTsKIAl1OCBkZWNyeXB0aW9uX3R5cGU7CiAJdTggZnJhbWVfc3RhdHVzOwotfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIHJ4X3N0YXR1cyBmaWVsZCBkZWNyeXB0aW9uX3R5cGUgKi8KICNkZWZpbmUgWkRfUlhfTk9fV0VQCTAKQEAgLTExNiwxMiArMTE4LDggQEAKICNkZWZpbmUgWkRfUlhfQ1JDMTZfRVJST1IJCTB4NDAKICNkZWZpbmUgWkRfUlhfRVJST1IJCQkweDgwCiAKLWVudW0gbWFjX2ZsYWdzIHsKLQlNQUNfRklYRURfQ0hBTk5FTCA9IDB4MDEsCi19OwotCiBzdHJ1Y3QgaG91c2VrZWVwaW5nIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19sZWRfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfbGVkX3dvcms7CiB9OwogCiAjZGVmaW5lIFpEX01BQ19TVEFUU19CVUZGRVJfU0laRSAxNgpAQCAtMTMwLDE1ICsxMjgsMzUgQEAKIAlzdHJ1Y3QgemRfY2hpcCBjaGlwOwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCiAJLyogVW5sb2NrZWQgcmVhZGluZyBwb3NzaWJsZSAqLwogCXN0cnVjdCBpd19zdGF0aXN0aWNzIGl3X3N0YXRzOworCiAJc3RydWN0IGhvdXNla2VlcGluZyBob3VzZWtlZXBpbmc7CisJc3RydWN0IHdvcmtfc3RydWN0IHNldF9tdWx0aWNhc3RfaGFzaF93b3JrOworCXN0cnVjdCB6ZF9tY19oYXNoIG11bHRpY2FzdF9oYXNoOworCXN0cnVjdCBkZWxheWVkX3dvcmsgc2V0X3J0c19jdHNfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHNldF9iYXNpY19yYXRlc193b3JrOworCiAJdW5zaWduZWQgaW50IHN0YXRzX2NvdW50OwogCXU4IHF1YWxfYnVmZmVyW1pEX01BQ19TVEFUU19CVUZGRVJfU0laRV07CiAJdTggcnNzaV9idWZmZXJbWkRfTUFDX1NUQVRTX0JVRkZFUl9TSVpFXTsKIAl1OCByZWdkb21haW47CiAJdTggZGVmYXVsdF9yZWdkb21haW47CiAJdTggcmVxdWVzdGVkX2NoYW5uZWw7CisKKwkvKiBBIGJpdHBhdHRlcm4gb2YgY3JfcmF0ZXMgKi8KKwl1MTYgYmFzaWNfcmF0ZXM7CisKKwkvKiBBIHpkX3JhdGUgKi8KKwl1OCBydHNfcmF0ZTsKKworCS8qIFNob3J0IHByZWFtYmxlICh1c2VkIGZvciBSVFMvQ1RTKSAqLworCXVuc2lnbmVkIGludCBzaG9ydF9wcmVhbWJsZToxOworCisJLyogZmxhZ3MgdG8gaW5kaWNhdGUgdXBkYXRlIGluIHByb2dyZXNzICovCisJdW5zaWduZWQgaW50IHVwZGF0aW5nX3J0c19yYXRlOjE7CisJdW5zaWduZWQgaW50IHVwZGF0aW5nX2Jhc2ljX3JhdGVzOjE7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICp6ZF9tYWNfdG9faWVlZTgwMjExKHN0cnVjdCB6ZF9tYWMgKm1hYykKQEAgLTE3Myw2ICsxOTEsNyBAQAogaW50IHpkX21hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogaW50IHpkX21hY19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogaW50IHpkX21hY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCk7Cit2b2lkIHpkX21hY19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiAKIGludCB6ZF9tYWNfcngoc3RydWN0IHpkX21hYyAqbWFjLCBjb25zdCB1OCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKIApAQCAtMTgwLDcgKzE5OSw3IEBACiB1OCB6ZF9tYWNfZ2V0X3JlZ2RvbWFpbihzdHJ1Y3QgemRfbWFjICp6ZF9tYWMpOwogCiBpbnQgemRfbWFjX3JlcXVlc3RfY2hhbm5lbChzdHJ1Y3QgemRfbWFjICptYWMsIHU4IGNoYW5uZWwpOwotaW50IHpkX21hY19nZXRfY2hhbm5lbChzdHJ1Y3QgemRfbWFjICptYWMsIHU4ICpjaGFubmVsLCB1OCAqZmxhZ3MpOwordTggemRfbWFjX2dldF9jaGFubmVsKHN0cnVjdCB6ZF9tYWMgKm1hYyk7CiAKIGludCB6ZF9tYWNfc2V0X21vZGUoc3RydWN0IHpkX21hYyAqbWFjLCB1MzIgbW9kZSk7CiBpbnQgemRfbWFjX2dldF9tb2RlKHN0cnVjdCB6ZF9tYWMgKm1hYywgdTMyICptb2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX25ldGRldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbmV0ZGV2LmMKaW5kZXggYWYzYTdiMy4uOGJkYTQ4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbmV0ZGV2LmMKQEAgLTEwNywyMSArMTA3LDEwIEBACiAJICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkgICB1bmlvbiBpd3JlcV9kYXRhICpyZXEsIGNoYXIgKmV4dHJhKQogewotCWludCByOwogCXN0cnVjdCB6ZF9tYWMgKm1hYyA9IHpkX25ldGRldl9tYWMobmV0ZGV2KTsKIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSA9ICZyZXEtPmZyZXE7Ci0JdTggY2hhbm5lbDsKLQl1OCBmbGFnczsKIAotCXIgPSB6ZF9tYWNfZ2V0X2NoYW5uZWwobWFjLCAmY2hhbm5lbCwgJmZsYWdzKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlmcmVxLT5mbGFncyA9IChmbGFncyAmIE1BQ19GSVhFRF9DSEFOTkVMKSA/Ci0JCSAgICAgIElXX0ZSRVFfRklYRUQgOiBJV19GUkVRX0FVVE87Ci0JZGV2X2RiZ19mKHpkX21hY19kZXYobWFjKSwgImNoYW5uZWwgJXNcbiIsCi0JCSAgKGZsYWdzICYgTUFDX0ZJWEVEX0NIQU5ORUwpID8gImZpeGVkIiA6ICJhdXRvIik7Ci0JcmV0dXJuIHpkX2NoYW5uZWxfdG9fZnJlcShmcmVxLCBjaGFubmVsKTsKKwlyZXR1cm4gemRfY2hhbm5lbF90b19mcmVxKGZyZXEsIHpkX21hY19nZXRfY2hhbm5lbChtYWMpKTsKIH0KIAogc3RhdGljIGludCBpd19zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LApAQCAtMjUzLDcgKzI0Miw3IEBACiAJbmV0ZGV2LT5vcGVuID0gemRfbWFjX29wZW47CiAJbmV0ZGV2LT5zdG9wID0gemRfbWFjX3N0b3A7CiAJLyogbmV0ZGV2LT5nZXRfc3RhdHMgPSAqLwotCS8qIG5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gKi8KKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHpkX21hY19zZXRfbXVsdGljYXN0X2xpc3Q7CiAJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSB6ZF9tYWNfc2V0X21hY19hZGRyZXNzOwogCW5ldGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmaXdfaGFuZGxlcl9kZWY7CiAJLyogbmV0ZGV2LT5ldGh0b29sX29wcyA9ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCmluZGV4IDNmYWFlYjIuLmFhNzgyZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCkBAIC00NywxMSArNDcsMTcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MDIpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCiAJeyBVU0JfREVWSUNFKDB4MGIzYiwgMHg1NjMwKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMSB9LAogCXsgVVNCX0RFVklDRSgweDBiMDUsIDB4MTcwYyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxNDM1LCAweDA3MTEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCisJeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDA5KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMSB9LAorCXsgVVNCX0RFVklDRSgweDBiM2IsIDB4MTYzMCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MDEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCisJeyBVU0JfREVWSUNFKDB4MTRlYSwgMHhhYjEzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMSB9LAogCS8qIFpEMTIxMUIgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYWNlLCAweDEyMTUpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCXsgVVNCX0RFVklDRSgweDE1N2UsIDB4MzAwZCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MDc5YiwgMHgwMDYyKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxNTgyLCAweDYwMDMpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAorCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4NzA1YyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJLyogIkRyaXZlcmxlc3MiIGRldmljZXMgdGhhdCBuZWVkIGVqZWN0aW5nICovCiAJeyBVU0JfREVWSUNFKDB4MGFjZSwgMHgyMDExKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX0lOU1RBTExFUiB9LAogCXt9CkBAIC0zNjYsMTUgKzM3Miw2IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc2FibGVfcmVhZF9yZWdzX2ludChzdHJ1Y3QgemRfdXNiICp1c2IpCi17Ci0Jc3RydWN0IHpkX3VzYl9pbnRlcnJ1cHQgKmludHIgPSAmdXNiLT5pbnRyOwotCi0Jc3Bpbl9sb2NrKCZpbnRyLT5sb2NrKTsKLQlpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCA9IDA7Ci0Jc3Bpbl91bmxvY2soJmludHItPmxvY2spOwotfQotCiAjZGVmaW5lIHVyYl9kZXYodXJiKSAoJih1cmIpLT5kZXYtPmRldikKIAogc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9yZWdzX2ludChzdHJ1Y3QgdXJiICp1cmIpCkBAIC01OTYsNiArNTkzLDggQEAKIAkJdW5zaWduZWQgaW50IGwsIGssIG47CiAJCWZvciAoaSA9IDAsIGwgPSAwOzsgaSsrKSB7CiAJCQlrID0gbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgmbGVuZ3RoX2luZm8tPmxlbmd0aFtpXSkpOworCQkJaWYgKGsgPT0gMCkKKwkJCQlyZXR1cm47CiAJCQluID0gbCtrOwogCQkJaWYgKG4gPiBsZW5ndGgpCiAJCQkJcmV0dXJuOwpAQCAtMTExOSwyNyArMTExOCwyOCBAQAogewogCWludCByOwogCi0JcHJfZGVidWcoInVzYl9pbml0KClcbiIpOworCXByX2RlYnVnKCIlcyB1c2JfaW5pdCgpXG4iLCBkcml2ZXIubmFtZSk7CiAKIAl6ZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShkcml2ZXIubmFtZSk7CiAJaWYgKHpkX3dvcmtxdWV1ZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkbid0IGNyZWF0ZSB3b3JrcXVldWVcbiIsIGRyaXZlci5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBjb3VsZG4ndCBjcmVhdGUgd29ya3F1ZXVlXG4iLCBkcml2ZXIubmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXIgPSB1c2JfcmVnaXN0ZXIoJmRyaXZlcik7CiAJaWYgKHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1c2JfcmVnaXN0ZXIoKSBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgdXNiX3JlZ2lzdGVyKCkgZmFpbGVkLiBFcnJvciBudW1iZXIgJWRcbiIsCisJCSAgICAgICBkcml2ZXIubmFtZSwgcik7CiAJCXJldHVybiByOwogCX0KIAotCXByX2RlYnVnKCJ6ZDEyMTFydyBpbml0aWFsaXplZFxuIik7CisJcHJfZGVidWcoIiVzIGluaXRpYWxpemVkXG4iLCBkcml2ZXIubmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB1c2JfZXhpdCh2b2lkKQogewotCXByX2RlYnVnKCJ1c2JfZXhpdCgpXG4iKTsKKwlwcl9kZWJ1ZygiJXMgdXNiX2V4aXQoKVxuIiwgZHJpdmVyLm5hbWUpOwogCXVzYl9kZXJlZ2lzdGVyKCZkcml2ZXIpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHpkX3dvcmtxdWV1ZSk7CiB9CkBAIC0xMTU2LDEwICsxMTU2LDE5IEBACiB7CiAJc3RydWN0IHpkX3VzYl9pbnRlcnJ1cHQgKmludHIgPSAmdXNiLT5pbnRyOwogCi0Jc3Bpbl9sb2NrKCZpbnRyLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZpbnRyLT5sb2NrKTsKIAlpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCA9IDE7CiAJSU5JVF9DT01QTEVUSU9OKGludHItPnJlYWRfcmVncy5jb21wbGV0aW9uKTsKLQlzcGluX3VubG9jaygmaW50ci0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnRyLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9yZWFkX3JlZ3NfaW50KHN0cnVjdCB6ZF91c2IgKnVzYikKK3sKKwlzdHJ1Y3QgemRfdXNiX2ludGVycnVwdCAqaW50ciA9ICZ1c2ItPmludHI7CisKKwlzcGluX2xvY2tfaXJxKCZpbnRyLT5sb2NrKTsKKwlpbnRyLT5yZWFkX3JlZ3NfZW5hYmxlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnRyLT5sb2NrKTsKIH0KIAogc3RhdGljIGludCBnZXRfcmVzdWx0cyhzdHJ1Y3QgemRfdXNiICp1c2IsIHUxNiAqdmFsdWVzLApAQCAtMTE3MSw3ICsxMTgwLDcgQEAKIAlzdHJ1Y3QgcmVhZF9yZWdzX2ludCAqcnIgPSAmaW50ci0+cmVhZF9yZWdzOwogCXN0cnVjdCB1c2JfaW50X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHVzYl9pbnRfcmVncyAqKXJyLT5idWZmZXI7CiAKLQlzcGluX2xvY2soJmludHItPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmludHItPmxvY2spOwogCiAJciA9IC1FSU87CiAJLyogVGhlIGNyZWF0ZWQgYmxvY2sgc2l6ZSBzZWVtcyB0byBiZSBsYXJnZXIgdGhhbiBleHBlY3RlZC4KQEAgLTEyMDQsNyArMTIxMyw3IEBACiAKIAlyID0gMDsKIGVycm9yX3VubG9jazoKLQlzcGluX3VubG9jaygmaW50ci0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnRyLT5sb2NrKTsKIAlyZXR1cm4gcjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaAppbmRleCBlODFhMmQzLi4zMTdkMzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaApAQCAtNzQsMTcgKzc0LDE3IEBACiBzdHJ1Y3QgdXNiX3JlcV9yZWFkX3JlZ3MgewogCV9fbGUxNiBpZDsKIAlfX2xlMTYgYWRkclswXTsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcmVnX2RhdGEgewogCV9fbGUxNiBhZGRyOwogCV9fbGUxNiB2YWx1ZTsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgdXNiX3JlcV93cml0ZV9yZWdzIHsKIAlfX2xlMTYgaWQ7CiAJc3RydWN0IHJlZ19kYXRhIHJlZ193cml0ZXNbMF07Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogZW51bSB7CiAJUkZfSUZfTEUgPSAweDAyLApAQCAtMTAxLDcgKzEwMSw3IEBACiAJLyogUkYyNTk1OiAyNCAqLwogCV9fbGUxNiBiaXRfdmFsdWVzWzBdOwogCS8qIChDUjIwMyAmIH4oUkZfSUZfTEUgfCBSRl9DTEsgfCBSRl9EQVRBKSkgfCAoYml0ID8gUkZfREFUQSA6IDApICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogVVNCIGludGVycnVwdCAqLwogCkBAIC0xMTgsMTIgKzExOCwxMiBAQAogc3RydWN0IHVzYl9pbnRfaGVhZGVyIHsKIAl1OCB0eXBlOwkvKiBtdXN0IGFsd2F5cyBiZSAxICovCiAJdTggaWQ7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHVzYl9pbnRfcmVncyB7CiAJc3RydWN0IHVzYl9pbnRfaGVhZGVyIGhkcjsKIAlzdHJ1Y3QgcmVnX2RhdGEgcmVnc1swXTsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgdXNiX2ludF9yZXRyeV9mYWlsIHsKIAlzdHJ1Y3QgdXNiX2ludF9oZWFkZXIgaGRyOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAJdTggX2R1bW15OwogCXU4IGFkZHJbRVRIX0FMRU5dOwogCXU4IGlic3Nfd2FrZXVwX2Rlc3Q7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHJlYWRfcmVnc19pbnQgewogCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC96b3JybzgzOTAuYyBiL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCmluZGV4IGRmMDRlMDUuLmQ4NWUyZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCisrKyBiL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCkBAIC0zNCw4ICszNCwxNiBAQAogI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KICNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgogCi0jaW5jbHVkZSAiODM5MC5oIgorI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCisjZGVmaW5lIGVpX2luYihwb3J0KSAgIGluXzgocG9ydCkKKyNkZWZpbmUgZWlfb3V0Yih2YWwscG9ydCkgIG91dF84KHBvcnQsdmFsKQorI2RlZmluZSBlaV9pbmJfcChwb3J0KSAgIGluXzgocG9ydCkKKyNkZWZpbmUgZWlfb3V0Yl9wKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCiAKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisgICAgIjgzOTAuYzp2MS4xMGN2cyA5LzIzLzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlICJsaWI4MzkwLmMiCiAKICNkZWZpbmUgRFJWX05BTUUJInpvcnJvODM5MCIKIApAQCAtMTE0LDcgKzEyMiw3IEBACiAJICAgIGJyZWFrOwogICAgIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CiAgICAgaW9hZGRyID0gYm9hcmQrY2FyZHNbaV0ub2Zmc2V0OwotICAgIGRldiA9IGFsbG9jX2VpX25ldGRldigpOworICAgIGRldiA9IF9fX19hbGxvY19laV9uZXRkZXYoMCk7CiAgICAgaWYgKCFkZXYpCiAJcmV0dXJuIC1FTk9NRU07CiAgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOwpAQCAtMjAxLDcgKzIwOSw3IEBACiAgICAgZGV2LT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CiAKICAgICAvKiBJbnN0YWxsIHRoZSBJbnRlcnJ1cHQgaGFuZGxlciAqLwotICAgIGkgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBkZXYpOworICAgIGkgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIF9fZWlfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIGRldik7CiAgICAgaWYgKGkpIHJldHVybiBpOwogCiAgICAgZm9yKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykgewpAQCAtMjI2LDEwICsyMzQsMTAgQEAKICAgICBkZXYtPm9wZW4gPSAmem9ycm84MzkwX29wZW47CiAgICAgZGV2LT5zdG9wID0gJnpvcnJvODM5MF9jbG9zZTsKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IF9fZWlfcG9sbDsKICNlbmRpZgogCi0gICAgTlM4MzkwX2luaXQoZGV2LCAwKTsKKyAgICBfX05TODM5MF9pbml0KGRldiwgMCk7CiAgICAgZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAgICAgaWYgKGVycikgewogCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZGV2KTsKQEAgLTI0Niw3ICsyNTQsNyBAQAogCiBzdGF0aWMgaW50IHpvcnJvODM5MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgZWlfb3BlbihkZXYpOworICAgIF9fZWlfb3BlbihkZXYpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNTQsNyArMjYyLDcgQEAKIHsKICAgICBpZiAoZWlfZGVidWcgPiAxKQogCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOwotICAgIGVpX2Nsb3NlKGRldik7CisgICAgX19laV9jbG9zZShkZXYpOwogICAgIHJldHVybiAwOwogfQogCkBAIC00MDUsNyArNDEzLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLAogCQkgICAgICAgZGV2LT5uYW1lKTsKIAkJem9ycm84MzkwX3Jlc2V0XzgzOTAoZGV2KTsKLQkJTlM4MzkwX2luaXQoZGV2LDEpOworCQlfX05TODM5MF9pbml0KGRldiwxKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMgYi9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKaW5kZXggNDNlNTIxZS4uNzhjMmU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwpAQCAtMjIwLDggKzIyMCw4IEBACiAJCQljb250aW51ZTsKIAkJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0VYRUNVVEFCTEUpKQogCQkJY29udGludWU7Ci0JCWNvb2tpZSA9IGZhc3RfZ2V0X2Rjb29raWUodm1hLT52bV9maWxlLT5mX2RlbnRyeSwKLQkJCXZtYS0+dm1fZmlsZS0+Zl92ZnNtbnQpOworCQljb29raWUgPSBmYXN0X2dldF9kY29va2llKHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeSwKKwkJCXZtYS0+dm1fZmlsZS0+Zl9wYXRoLm1udCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMjQ2LDggKzI0Niw4IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAodm1hLT52bV9maWxlKSB7Ci0JCQljb29raWUgPSBmYXN0X2dldF9kY29va2llKHZtYS0+dm1fZmlsZS0+Zl9kZW50cnksCi0JCQkJdm1hLT52bV9maWxlLT5mX3Zmc21udCk7CisJCQljb29raWUgPSBmYXN0X2dldF9kY29va2llKHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeSwKKwkJCQl2bWEtPnZtX2ZpbGUtPmZfcGF0aC5tbnQpOwogCQkJKm9mZnNldCA9ICh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpICsgYWRkciAtCiAJCQkJdm1hLT52bV9zdGFydDsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jIGIvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmMKaW5kZXggZmM0YmM5Yi4uYTgzYzNkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgY3B1X2J1ZmZlcltOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwogCi1zdGF0aWMgdm9pZCB3cV9zeW5jX2J1ZmZlcih2b2lkICopOworc3RhdGljIHZvaWQgd3Ffc3luY19idWZmZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogI2RlZmluZSBERUZBVUxUX1RJTUVSX0VYUElSRSAoSFogLyAxMCkKIHN0YXRpYyBpbnQgd29ya19lbmFibGVkOwpAQCAtNjUsNyArNjUsNyBAQAogCQliLT5zYW1wbGVfcmVjZWl2ZWQgPSAwOwogCQliLT5zYW1wbGVfbG9zdF9vdmVyZmxvdyA9IDA7CiAJCWItPmNwdSA9IGk7Ci0JCUlOSVRfV09SSygmYi0+d29yaywgd3Ffc3luY19idWZmZXIsIGIpOworCQlJTklUX0RFTEFZRURfV09SSygmYi0+d29yaywgd3Ffc3luY19idWZmZXIpOwogCX0KIAlyZXR1cm4gMDsKIApAQCAtMjgyLDkgKzI4MiwxMCBAQAogICogQnkgdXNpbmcgc2NoZWR1bGVfZGVsYXllZF93b3JrX29uIGFuZCB0aGVuIHNjaGVkdWxlX2RlbGF5ZWRfd29yawogICogd2UgZ3VhcmFudGVlIHRoaXMgd2lsbCBzdGF5IG9uIHRoZSBjb3JyZWN0IGNwdQogICovCi1zdGF0aWMgdm9pZCB3cV9zeW5jX2J1ZmZlcih2b2lkICogZGF0YSkKK3N0YXRpYyB2b2lkIHdxX3N5bmNfYnVmZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqIGIgPSBkYXRhOworCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICogYiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciwgd29yay53b3JrKTsKIAlpZiAoYi0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkgewogCQlwcmludGsoIldRIG9uIENQVSVkLCBwcmVmZXIgQ1BVJWRcbiIsCiAJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksIGItPmNwdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuaCBiL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5oCmluZGV4IDA5YWJiODAuLjQ5OTAwZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5oCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5oCkBAIC00Myw3ICs0Myw3IEBACiAJdW5zaWduZWQgbG9uZyBzYW1wbGVfbG9zdF9vdmVyZmxvdzsKIAl1bnNpZ25lZCBsb25nIGJhY2t0cmFjZV9hYm9ydGVkOwogCWludCBjcHU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIGV4dGVybiBzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciBjcHVfYnVmZmVyW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jIGIvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYwppbmRleCA2OGNiM2EwLi5mZTNmNWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMKQEAgLTQ4Niw3ICs0ODYsNyBAQAogKiogICBUaGlzIGJpdCB0ZWxscyBVMiB0byBkbyBSL00vVyBmb3IgcGFydGlhbCBjYWNoZWxpbmVzLiAiU3RyZWFtaW5nIgogKiogICBkYXRhIGNhbiBhdm9pZCB0aGlzIGlmIHRoZSBtYXBwaW5nIGNvdmVycyBmdWxsIGNhY2hlIGxpbmVzLgogKiogbyBTVE9QX01PU1QgaXMgbmVlZGVkIGZvciBhdG9taWNpdHkgYWNyb3NzIGNhY2hlbGluZXMuCi0qKiAgIEFwcGVyZW50bHkgb25seSAic29tZSBFSVNBIGRldmljZXMiIG5lZWQgdGhpcy4KKyoqICAgQXBwYXJlbnRseSBvbmx5ICJzb21lIEVJU0EgZGV2aWNlcyIgbmVlZCB0aGlzLgogKiogICBVc2luZyBDT05GSUdfSVNBIGlzIGhhY2suIE9ubHkgdGhlIElPQSB3aXRoIEVJU0EgdW5kZXIgaXQgbmVlZHMKICoqICAgdG8gdXNlIHRoaXMgaGludCBpZmYgdGhlIEVJU0EgZGV2aWNlcyBuZWVkcyB0aGlzIGZlYXR1cmUuCiAqKiAgIEFjY29yZGluZyB0byB0aGUgVTIgRVJTLCBTVE9QX01PU1QgZW5hYmxlZCBwYWdlcyBodXJ0IHBlcmZvcm1hbmNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jIGIvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCmluZGV4IGMyOTQ5YjQuLjZmYjNmNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYworKysgYi9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKQEAgLTUwLDEyICs1MCwxMiBAQAogKioKICoqIFBBIEZpcm13YXJlCiAqKiAtLS0tLS0tLS0tLQotKiogUEEtUklTQyBwbGF0Zm9ybXMgaGF2ZSB0d28gZnVuZGVtZW50YWxseSBkaWZmZXJlbnQgdHlwZXMgb2YgZmlybXdhcmUuCisqKiBQQS1SSVNDIHBsYXRmb3JtcyBoYXZlIHR3byBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0eXBlcyBvZiBmaXJtd2FyZS4KICoqIEZvciBQQ0kgZGV2aWNlcywgIkxlZ2FjeSIgUERDIGluaXRpYWxpemVzIHRoZSAiSU5URVJSVVBUX0xJTkUiIHJlZ2lzdGVyCiAqKiBhbmQgQkFScyBzaW1pbGFyIHRvIGEgdHJhZGl0aW9uYWwgUEMgQklPUy4KICoqIFRoZSBuZXdlciAiUEFUIiBmaXJtd2FyZSBzdXBwb3J0cyBQREMgY2FsbHMgd2hpY2ggcmV0dXJuIHRhYmxlcy4KLSoqIFBBVCBmaXJtd2FyZSBvbmx5IGluaXRpYWxpemVzIFBDSSBDb25zb2xlIGFuZCBCb290IGludGVyZmFjZS4KLSoqIFdpdGggdGhlc2UgdGFibGVzLCB0aGUgT1MgY2FuIHByb2dhbSBhbGwgb3RoZXIgUENJIGRldmljZXMuCisqKiBQQVQgZmlybXdhcmUgb25seSBpbml0aWFsaXplcyB0aGUgUENJIENvbnNvbGUgYW5kIEJvb3QgaW50ZXJmYWNlLgorKiogV2l0aCB0aGVzZSB0YWJsZXMsIHRoZSBPUyBjYW4gcHJvZ3JhbSBhbGwgb3RoZXIgUENJIGRldmljZXMuCiAqKgogKiogT25lIHN1Y2ggUEFUIFBEQyBjYWxsIHJldHVybnMgdGhlICJJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSIgKElSVCkuCiAqKiBUaGUgSVJUIG1hcHMgZWFjaCBQQ0kgc2xvdCdzIElOVEEtRCAib3V0cHV0IiBsaW5lIHRvIGFuIEkvTyBTQVBJQwpAQCAtODc0LDcgKzg3NCw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlzaSA9IChzdHJ1Y3QgaW9zYXBpY19pbmZvICopa3phbGxvYyhzaXplb2Yoc3RydWN0IGlvc2FwaWNfaW5mbyksIEdGUF9LRVJORUwpOworCWlzaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3NhcGljX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlzaSkgewogCQlCVUcoKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCmluZGV4IGM3ZmEyOGEuLjM2YzZhMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCkBAIC04Miw5ICs4Miw2IEBACiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIFBDTUNJQSBzdXBwb3J0IGZvciB5b3VyIFBDLXN0eWxlIHBhcmFsbGVsCiAJICBwb3J0cy4gSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIFBBUlBPUlRfTk9UX1BDCi0JYm9vbAotCiBjb25maWcgUEFSUE9SVF9JUDMyCiAJdHJpc3RhdGUgIlNHSSBJUDMyIGJ1aWx0aW4gcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIFNHSV9JUDMyICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCkBAIC0xNTgsNSArMTU1LDggQEAKIAkgIHRyYW5zZmVyIG1vZGVzLiBBbHNvIHNheSBZIGlmIHlvdSB3YW50IGRldmljZSBJRCBpbmZvcm1hdGlvbiB0bwogCSAgYXBwZWFyIGluIC9wcm9jL3N5cy9kZXYvcGFycG9ydC8qL2F1dG9wcm9iZSouIEl0IGlzIHNhZmUgdG8gc2F5IE4uCiAKK2NvbmZpZyBQQVJQT1JUX05PVF9QQworCWJvb2wKKwogZW5kbWVudQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYwppbmRleCBiOTUzZDU5Li5lNjBiNGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2NzLmMKQEAgLTE2NiwxNCArMTY2LDYgQEAKICAgICAKICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsgdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KICAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKICAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwpAQCAtMjYzLDYgKzI1NSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBwYXJwb3J0X2lkc1tdID0gewogCVBDTUNJQV9ERVZJQ0VfRlVOQ19JRCgzKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIoMSwiRWxhbiIsIlNlcmlhbCtQYXJhbGxlbCBQb3J0OiBTUDIzMCIsMHgzYmViOGNmMiwweGRiOWU1OGJjKSwKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMzcsIDB4MDAwMyksCiAJUENNQ0lBX0RFVklDRV9OVUxMCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfaXAzMi5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfaXAzMi5jCmluZGV4IGUzZTE5MjcuLmVjNDRlZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2lwMzIuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9pcDMyLmMKQEAgLTc4MCw3ICs3ODAsNyBAQAogCWVudW0gcGFycG9ydF9pcDMyX2lycV9tb2RlIGlycV9tb2RlID0gcHJpdi0+aXJxX21vZGU7CiAJc3dpdGNoIChpcnFfbW9kZSkgewogCWNhc2UgUEFSUE9SVF9JUDMyX0lSUV9GV0Q6Ci0JCXBhcnBvcnRfZ2VuZXJpY19pcnEoaXJxLCBwLCByZWdzKTsKKwkJcGFycG9ydF9nZW5lcmljX2lycShpcnEsIHApOwogCQlicmVhazsKIAljYXNlIFBBUlBPUlRfSVAzMl9JUlFfSEVSRToKIAkJcGFycG9ydF9pcDMyX3dha2V1cChwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCmluZGV4IDM5Yzk2NjQuLmI2MWMxN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYwpAQCAtMTk3NSw3ICsxOTc1LDcgQEAKIC8qIC0tLSBJUlEgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIE9ubHkgaWYgc3VwcG9ydHMgRUNQIG1vZGUgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHByb2dyYW1tYWJsZV9pcnFfc3VwcG9ydChzdHJ1Y3QgcGFycG9ydCAqcGIpCitzdGF0aWMgaW50IHByb2dyYW1tYWJsZV9pcnFfc3VwcG9ydChzdHJ1Y3QgcGFycG9ydCAqcGIpCiB7CiAJaW50IGlycSwgaW50ckxpbmU7CiAJdW5zaWduZWQgY2hhciBvZWNyID0gaW5iIChFQ09OVFJPTCAocGIpKTsKQEAgLTE5OTIsNyArMTk5Miw3IEBACiAJcmV0dXJuIGlycTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgaXJxX3Byb2JlX0VDUChzdHJ1Y3QgcGFycG9ydCAqcGIpCitzdGF0aWMgaW50IGlycV9wcm9iZV9FQ1Aoc3RydWN0IHBhcnBvcnQgKnBiKQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgaXJxczsKQEAgLTIwMjAsNyArMjAyMCw3IEBACiAgKiBUaGlzIGRldGVjdGlvbiBzZWVtcyB0aGF0IG9ubHkgd29ya3MgaW4gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMKICAqIFRoaXMgZG9lc24ndCB3b3JrIGluIFNNQywgTEdTLCBhbmQgV2luYm9uZCAKICAqLwotc3RhdGljIGludCBfX2RldmluaXQgaXJxX3Byb2JlX0VQUChzdHJ1Y3QgcGFycG9ydCAqcGIpCitzdGF0aWMgaW50IGlycV9wcm9iZV9FUFAoc3RydWN0IHBhcnBvcnQgKnBiKQogewogI2lmbmRlZiBBRFZBTkNFRF9ERVRFQ1QKIAlyZXR1cm4gUEFSUE9SVF9JUlFfTk9ORTsKQEAgLTIwNTksNyArMjA1OSw3IEBACiAjZW5kaWYgLyogQWR2YW5jZWQgZGV0ZWN0aW9uICovCiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGlycV9wcm9iZV9TUFAoc3RydWN0IHBhcnBvcnQgKnBiKQorc3RhdGljIGludCBpcnFfcHJvYmVfU1BQKHN0cnVjdCBwYXJwb3J0ICpwYikKIHsKIAkvKiBEb24ndCBldmVuIHRyeSB0byBkbyB0aGlzLiAqLwogCXJldHVybiBQQVJQT1JUX0lSUV9OT05FOwpAQCAtMjc0Nyw2ICsyNzQ3LDcgQEAKIAl0aXRhbl8xMjg0cDIsCiAJYXZsYWJfMXAsCiAJYXZsYWJfMnAsCisJb3hzZW1pXzk1MiwKIAlveHNlbWlfOTU0LAogCW94c2VtaV84NDAsCiAJYWtzXzAxMDAsCkBAIC0yODIyLDYgKzI4MjMsNyBAQAogCS8qIGF2bGFiXzJwCQkqLwl7IDIsIHsgeyAwLCAxfSwgeyAyLCAzIH0sfSB9LAogCS8qIFRoZSBPeGZvcmQgU2VtaSBjYXJkcyBhcmUgdW51c3VhbDogOTU0IGRvZXNuJ3Qgc3VwcG9ydCBFQ1AsCiAJICogYW5kIDg0MCBsb2NrcyB1cCBpZiB5b3Ugd3JpdGUgMSB0byBiaXQgMiEgKi8KKwkvKiBveHNlbWlfOTUyICovCQl7IDEsIHsgeyAwLCAxIH0sIH0gfSwKIAkvKiBveHNlbWlfOTU0ICovCQl7IDEsIHsgeyAwLCAtMSB9LCB9IH0sCiAJLyogb3hzZW1pXzg0MCAqLwkJeyAxLCB7IHsgMCwgLTEgfSwgfSB9LAogCS8qIGFrc18wMTAwICovICAgICAgICAgICAgICAgICAgeyAxLCB7IHsgMCwgLTEgfSwgfSB9LApAQCAtMjg5NSw2ICsyODk3LDggQEAKIAkvKiBQQ0lfVkVORE9SX0lEX0FWTEFCL0ludGVrMjEgaGFzIGFub3RoZXIgYnVuY2ggb2YgY2FyZHMgLi4uKi8KIAl7IDB4MTRkYiwgMHgyMTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBhdmxhYl8xcH0sIC8qIEFGQVZMQUJfVEs5OTAyICovCiAJeyAweDE0ZGIsIDB4MjEyMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgYXZsYWJfMnB9LAorCXsgUENJX1ZFTkRPUl9JRF9PWFNFTUksIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzE2UENJOTUyUFAsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBveHNlbWlfOTUyIH0sCiAJeyBQQ0lfVkVORE9SX0lEX09YU0VNSSwgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTRQUCwKIAkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIG94c2VtaV85NTQgfSwKIAl7IFBDSV9WRU5ET1JfSURfT1hTRU1JLCBQQ0lfREVWSUNFX0lEX09YU0VNSV8xMlBDSTg0MCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL0tjb25maWcgYi9kcml2ZXJzL3BjaS9LY29uZmlnCmluZGV4IGVjYzUwZGIuLmYxZGQ4MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtMjcsMTQgKzI3LDE0IEBACiAJICBzbWFsbGVyIHNwZWVkdXAgb24gc2luZ2xlIHByb2Nlc3NvciBtYWNoaW5lcy4KIAogCSAgQnV0IGl0IGNhbiBhbHNvIGNhdXNlIGxvdHMgb2YgYmFkIHRoaW5ncyB0byBoYXBwZW4uICBBIG51bWJlcgotCSAgb2YgUENJIGRyaXZlcnMgY2FuIG5vdCBwcm9wZXJseSBoYW5kbGUgcnVubmluZyBpbiB0aGlzIHdheSwKKwkgIG9mIFBDSSBkcml2ZXJzIGNhbm5vdCBwcm9wZXJseSBoYW5kbGUgcnVubmluZyBpbiB0aGlzIHdheSwKIAkgIHNvbWUgd2lsbCBqdXN0IG5vdCB3b3JrIHByb3Blcmx5IGF0IGFsbCwgd2hpbGUgb3RoZXJzIG1pZ2h0CiAJICBkZWNpZGUgdG8gYmxvdyB1cCBwb3dlciBzdXBwbGllcyB3aXRoIGEgaHVnZSBsb2FkIGFsbCBhdCBvbmNlLAogCSAgc28gdXNlIHRoaXMgb3B0aW9uIGF0IHlvdXIgb3duIHJpc2suCiAKIAkgIEl0IGlzIHZlcnkgdW53aXNlIHRvIHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIG5vdCB1c2luZyBhCiAJICBib290IHByb2Nlc3MgdGhhdCBjYW4gaGFuZGxlIGRldmljZXMgYmVpbmcgY3JlYXRlZCBpbiBhbnkKLQkgIG9yZGVyLiAgQSBwcm9ncmFtIHRoYXQgY2FuIGNyZWF0ZSBwZXJzaXN0YW50IGJsb2NrIGFuZCBuZXR3b3JrCisJICBvcmRlci4gIEEgcHJvZ3JhbSB0aGF0IGNhbiBjcmVhdGUgcGVyc2lzdGVudCBibG9jayBhbmQgbmV0d29yawogCSAgZGV2aWNlIG5hbWVzIChsaWtlIHVkZXYpIGlzIGEgZ29vZCBpZGVhIGlmIHlvdSB3aXNoIHRvIHVzZQogCSAgdGhpcyBvcHRpb24uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2FjY2Vzcy5jIGIvZHJpdmVycy9wY2kvYWNjZXNzLmMKaW5kZXggZWExNjgwNS4uZmM0MDVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvYWNjZXNzLmMKKysrIGIvZHJpdmVycy9wY2kvYWNjZXNzLmMKQEAgLTEsNiArMSw4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKICNpbmNsdWRlICJwY2kuaCIKIApAQCAtNjMsMzAgKzY1LDQyIEBACiBFWFBPUlRfU1lNQk9MKHBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQpOwogRVhQT1JUX1NZTUJPTChwY2lfYnVzX3dyaXRlX2NvbmZpZ19kd29yZCk7CiAKLXN0YXRpYyB1MzIgcGNpX3VzZXJfY2FjaGVkX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zKQotewotCXUzMiBkYXRhOworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRvIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBhY2Nlc3NpbmcgUENJIGNvbmZpZworICogc3BhY2Ugd2hlbiBpdCdzIHVuc2FmZSB0byBkbyBzby4gIFNvbWUgZGV2aWNlcyByZXF1aXJlIHRoaXMgZHVyaW5nIEJJU1QgYW5kCisgKiB3ZSdyZSByZXF1aXJlZCB0byBwcmV2ZW50IGl0IGR1cmluZyBELXN0YXRlIHRyYW5zaXRpb25zLgorICoKKyAqIFdlIGhhdmUgYSBiaXQgcGVyIGRldmljZSB0byBpbmRpY2F0ZSBpdCdzIGJsb2NrZWQgYW5kIGEgZ2xvYmFsIHdhaXQgcXVldWUKKyAqIGZvciBjYWxsZXJzIHRvIHNsZWVwIG9uIHVudGlsIGRldmljZXMgYXJlIHVuYmxvY2tlZC4KKyAqLworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHBjaV91Y2ZnX3dhaXQpOwogCi0JZGF0YSA9IGRldi0+c2F2ZWRfY29uZmlnX3NwYWNlW3Bvcy9zaXplb2YoZGV2LT5zYXZlZF9jb25maWdfc3BhY2VbMF0pXTsKLQlkYXRhID4+PSAocG9zICUgc2l6ZW9mKGRldi0+c2F2ZWRfY29uZmlnX3NwYWNlWzBdKSkgKiA4OwotCXJldHVybiBkYXRhOworc3RhdGljIG5vaW5saW5lIHZvaWQgcGNpX3dhaXRfdWNmZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJX19hZGRfd2FpdF9xdWV1ZSgmcGNpX3VjZmdfd2FpdCwgJndhaXQpOworCWRvIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnEoJnBjaV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycSgmcGNpX2xvY2spOworCX0gd2hpbGUgKGRldi0+YmxvY2tfdWNmZ19hY2Nlc3MpOworCV9fcmVtb3ZlX3dhaXRfcXVldWUoJnBjaV91Y2ZnX3dhaXQsICZ3YWl0KTsKIH0KIAogI2RlZmluZSBQQ0lfVVNFUl9SRUFEX0NPTkZJRyhzaXplLHR5cGUpCQkJCQlcCiBpbnQgcGNpX3VzZXJfcmVhZF9jb25maWdfIyNzaXplCQkJCQkJXAogCShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zLCB0eXBlICp2YWwpCQkJXAogewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkJCVwKIAlpbnQgcmV0ID0gMDsJCQkJCQkJXAogCXUzMiBkYXRhID0gLTE7CQkJCQkJCVwKIAlpZiAoUENJXyMjc2l6ZSMjX0JBRCkgcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsJXAotCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lfbG9jaywgZmxhZ3MpOwkJCQlcCi0JaWYgKGxpa2VseSghZGV2LT5ibG9ja191Y2ZnX2FjY2VzcykpCQkJCVwKLQkJcmV0ID0gZGV2LT5idXMtPm9wcy0+cmVhZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwJCVwKKwlzcGluX2xvY2tfaXJxKCZwY2lfbG9jayk7CQkJCQlcCisJaWYgKHVubGlrZWx5KGRldi0+YmxvY2tfdWNmZ19hY2Nlc3MpKSBwY2lfd2FpdF91Y2ZnKGRldik7CVwKKwlyZXQgPSBkZXYtPmJ1cy0+b3BzLT5yZWFkKGRldi0+YnVzLCBkZXYtPmRldmZuLAkJCVwKIAkJCQkJcG9zLCBzaXplb2YodHlwZSksICZkYXRhKTsJXAotCWVsc2UgaWYgKHBvcyA8IHNpemVvZihkZXYtPnNhdmVkX2NvbmZpZ19zcGFjZSkpCQkJXAotCQlkYXRhID0gcGNpX3VzZXJfY2FjaGVkX2NvbmZpZyhkZXYsIHBvcyk7IAkJXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9sb2NrLCBmbGFncyk7CQkJXAorCXNwaW5fdW5sb2NrX2lycSgmcGNpX2xvY2spOwkJCQkJXAogCSp2YWwgPSAodHlwZSlkYXRhOwkJCQkJCVwKIAlyZXR1cm4gcmV0OwkJCQkJCQlcCiB9CkBAIC05NSwxNCArMTA5LDEzIEBACiBpbnQgcGNpX3VzZXJfd3JpdGVfY29uZmlnXyMjc2l6ZQkJCQkJXAogCShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zLCB0eXBlIHZhbCkJCQlcCiB7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQkJXAogCWludCByZXQgPSAtRUlPOwkJCQkJCQlcCiAJaWYgKFBDSV8jI3NpemUjI19CQUQpIHJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CVwKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2xvY2ssIGZsYWdzKTsJCQkJXAotCWlmIChsaWtlbHkoIWRldi0+YmxvY2tfdWNmZ19hY2Nlc3MpKQkJCQlcCi0JCXJldCA9IGRldi0+YnVzLT5vcHMtPndyaXRlKGRldi0+YnVzLCBkZXYtPmRldmZuLAlcCisJc3Bpbl9sb2NrX2lycSgmcGNpX2xvY2spOwkJCQkJXAorCWlmICh1bmxpa2VseShkZXYtPmJsb2NrX3VjZmdfYWNjZXNzKSkgcGNpX3dhaXRfdWNmZyhkZXYpOwlcCisJcmV0ID0gZGV2LT5idXMtPm9wcy0+d3JpdGUoZGV2LT5idXMsIGRldi0+ZGV2Zm4sCQlcCiAJCQkJCXBvcywgc2l6ZW9mKHR5cGUpLCB2YWwpOwlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2xvY2ssIGZsYWdzKTsJCQlcCisJc3Bpbl91bmxvY2tfaXJxKCZwY2lfbG9jayk7CQkJCQlcCiAJcmV0dXJuIHJldDsJCQkJCQkJXAogfQogCkBAIC0xMTcsMjEgKzEzMCwyMyBAQAogICogcGNpX2Jsb2NrX3VzZXJfY2ZnX2FjY2VzcyAtIEJsb2NrIHVzZXJzcGFjZSBQQ0kgY29uZmlnIHJlYWRzL3dyaXRlcwogICogQGRldjoJcGNpIGRldmljZSBzdHJ1Y3QKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGJsb2NrcyBhbnkgdXNlcnNwYWNlIFBDSSBjb25maWcgYWNjZXNzZXMgZnJvbSBvY2N1cnJpbmcuCi0gKiBXaGVuIGJsb2NrZWQsIGFueSB3cml0ZXMgd2lsbCBiZSBiaXQgYnVja2V0ZWQgYW5kIHJlYWRzIHdpbGwgcmV0dXJuIHRoZQotICogZGF0YSBzYXZlZCB1c2luZyBwY2lfc2F2ZV9zdGF0ZSBmb3IgdGhlIGZpcnN0IDY0IGJ5dGVzIG9mIGNvbmZpZwotICogc3BhY2UgYW5kIHJldHVybiAweGZmIGZvciBhbGwgb3RoZXIgY29uZmlnIHJlYWRzLgotICoqLworICogV2hlbiB1c2VyIGFjY2VzcyBpcyBibG9ja2VkLCBhbnkgcmVhZHMgb3Igd3JpdGVzIHRvIGNvbmZpZyBzcGFjZSB3aWxsCisgKiBzbGVlcCB1bnRpbCBhY2Nlc3MgaXMgdW5ibG9ja2VkIGFnYWluLiAgV2UgZG9uJ3QgYWxsb3cgbmVzdGluZyBvZgorICogYmxvY2svdW5ibG9jayBjYWxscy4KKyAqLwogdm9pZCBwY2lfYmxvY2tfdXNlcl9jZmdfYWNjZXNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd2FzX2Jsb2NrZWQ7CiAKLQlwY2lfc2F2ZV9zdGF0ZShkZXYpOwotCi0JLyogc3BpbmxvY2sgdG8gc3luY2hyb25pemUgd2l0aCBhbnlvbmUgcmVhZGluZyBjb25maWcgc3BhY2Ugbm93ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9sb2NrLCBmbGFncyk7CisJd2FzX2Jsb2NrZWQgPSBkZXYtPmJsb2NrX3VjZmdfYWNjZXNzOwogCWRldi0+YmxvY2tfdWNmZ19hY2Nlc3MgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB3ZSBCVUcoKSBpbnNpZGUgdGhlIHBjaV9sb2NrLCB3ZSdyZSBndWFyYW50ZWVkIHRvIGhvc2UKKwkgKiB0aGUgbWFjaGluZSAqLworCUJVR19PTih3YXNfYmxvY2tlZCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfYmxvY2tfdXNlcl9jZmdfYWNjZXNzKTsKIApAQCAtMTQwLDE0ICsxNTUsMTkgQEAKICAqIEBkZXY6CXBjaSBkZXZpY2Ugc3RydWN0CiAgKgogICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXNlcnNwYWNlIFBDSSBjb25maWcgYWNjZXNzZXMgdG8gcmVzdW1lLgotICoqLworICovCiB2b2lkIHBjaV91bmJsb2NrX3VzZXJfY2ZnX2FjY2VzcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiBzcGlubG9jayB0byBzeW5jaHJvbml6ZSB3aXRoIGFueW9uZSByZWFkaW5nIHNhdmVkIGNvbmZpZyBzcGFjZSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lfbG9jaywgZmxhZ3MpOworCisJLyogVGhpcyBpbmRpY2F0ZXMgYSBwcm9ibGVtIGluIHRoZSBjYWxsZXIsIGJ1dCB3ZSBkb24ndCBuZWVkCisJICogdG8ga2lsbCB0aGVtLCB1bmxpa2UgYSBkb3VibGUtYmxvY2sgYWJvdmUuICovCisJV0FSTl9PTighZGV2LT5ibG9ja191Y2ZnX2FjY2Vzcyk7CisKIAlkZXYtPmJsb2NrX3VjZmdfYWNjZXNzID0gMDsKKwl3YWtlX3VwX2FsbCgmcGNpX3VjZmdfd2FpdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2xvY2ssIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV91bmJsb2NrX3VzZXJfY2ZnX2FjY2Vzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL0tjb25maWcgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL0tjb25maWcKaW5kZXggNmU3ODBkYi4uYWRjZTQyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZwpAQCAtNzYsNyArNzYsOCBAQAogCiBjb25maWcgSE9UUExVR19QQ0lfQUNQSQogCXRyaXN0YXRlICJBQ1BJIFBDSSBIb3RwbHVnIGRyaXZlciIKLQlkZXBlbmRzIG9uICghQUNQSV9ET0NLICYmIEFDUEkgJiYgSE9UUExVR19QQ0kpIHx8IChBQ1BJX0RPQ0sgJiYgSE9UUExVR19QQ0kpCisJZGVwZW5kcyBvbiBIT1RQTFVHX1BDSQorCWRlcGVuZHMgb24gKCFBQ1BJX0RPQ0sgJiYgQUNQSSkgfHwgKEFDUElfRE9DSykKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgc3lzdGVtIHRoYXQgc3VwcG9ydHMgUENJIEhvdHBsdWcgdXNpbmcKIAkgIEFDUEkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCmluZGV4IDUxY2I5ZjguLjI3MGEzM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCkBAIC0yOSwxMCArMjksMTAgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCiAKICNkZWZpbmUgTVlfTkFNRQkiYWNwaV9wY2locCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAppbmRleCA3ZmZmMDdlLi5kZGJhZGQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgkvKiBmb3IgS09CSl9OQU1FX0xFTiAqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogCiAjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikJCQkJCVwKIAlkbyB7CQkJCQkJCVwKQEAgLTYyLDEwICs2MiwxMCBAQAogc3RydWN0IHNsb3QgewogCXN0cnVjdCBob3RwbHVnX3Nsb3QJKmhvdHBsdWdfc2xvdDsKIAlzdHJ1Y3QgYWNwaXBocF9zbG90CSphY3BpX3Nsb3Q7CisJc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvIGluZm87CisJY2hhciBuYW1lW1NMT1RfTkFNRV9TSVpFXTsKIH07CiAKLQotCiAvKioKICAqIHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAtIFBDSSBicmlkZ2UgaW5mb3JtYXRpb24KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2NvcmUuYwppbmRleCBlMmZlZjYwLi40MGM3OWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9jb3JlLmMKQEAgLTM3LDEwICszNywxMCBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogI2luY2x1ZGUgImFjcGlwaHAuaCIKIAogI2RlZmluZSBNWV9OQU1FCSJhY3BpcGhwIgpAQCAtMzAzLDI1ICszMDMsMTUgQEAKIAkvKiByZWFkIGluaXRpYWwgbnVtYmVyIG9mIHNsb3RzICovCiAJaWYgKCFyZXR2YWwpIHsKIAkJbnVtX3Nsb3RzID0gYWNwaXBocF9nZXRfbnVtX3Nsb3RzKCk7Ci0JCWlmIChudW1fc2xvdHMgPT0gMCkKKwkJaWYgKG51bV9zbG90cyA9PSAwKSB7CisJCQlhY3BpcGhwX2dsdWVfZXhpdCgpOwogCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJfQogCX0KIAogCXJldHVybiByZXR2YWw7CiB9CiAKLQotLyoqCi0gKiBtYWtlX3Nsb3RfbmFtZSAtIG1ha2UgYSBzbG90IG5hbWUgdGhhdCBhcHBlYXJzIGluIHBjaWhwZnMKLSAqIEBzbG90OiBzbG90IHRvIG5hbWUKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIG1ha2Vfc2xvdF9uYW1lKHN0cnVjdCBzbG90ICpzbG90KQotewotCXNucHJpbnRmKHNsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZSwgU0xPVF9OQU1FX1NJWkUsICIldSIsCi0JCSBzbG90LT5hY3BpX3Nsb3QtPnN1bik7Ci19Ci0KIC8qKgogICogcmVsZWFzZV9zbG90IC0gZnJlZSB1cCB0aGUgbWVtb3J5IHVzZWQgYnkgYSBzbG90CiAgKiBAaG90cGx1Z19zbG90OiBzbG90IHRvIGZyZWUKQEAgLTMzMiw4ICszMjIsNiBAQAogCiAJZGJnKCIlcyAtIHBoeXNpY2FsX3Nsb3QgPSAlc1xuIiwgX19GVU5DVElPTl9fLCBob3RwbHVnX3Nsb3QtPm5hbWUpOwogCi0Ja2ZyZWUoc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKTsKLQlrZnJlZShzbG90LT5ob3RwbHVnX3Nsb3QtPm5hbWUpOwogCWtmcmVlKHNsb3QtPmhvdHBsdWdfc2xvdCk7CiAJa2ZyZWUoc2xvdCk7CiB9CkBAIC0zNDIsMjYgKzMzMCwxOSBAQAogaW50IGFjcGlwaHBfcmVnaXN0ZXJfaG90cGx1Z19zbG90KHN0cnVjdCBhY3BpcGhwX3Nsb3QgKmFjcGlwaHBfc2xvdCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdDsKLQlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7Ci0Jc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvICpob3RwbHVnX3Nsb3RfaW5mbzsKIAlpbnQgcmV0dmFsID0gLUVOT01FTTsKIAogCXNsb3QgPSBremFsbG9jKHNpemVvZigqc2xvdCksIEdGUF9LRVJORUwpOwogCWlmICghc2xvdCkKIAkJZ290byBlcnJvcjsKIAotCXNsb3QtPmhvdHBsdWdfc2xvdCA9IGt6YWxsb2Moc2l6ZW9mKCpob3RwbHVnX3Nsb3QpLCBHRlBfS0VSTkVMKTsKKwlzbG90LT5ob3RwbHVnX3Nsb3QgPSBremFsbG9jKHNpemVvZigqc2xvdC0+aG90cGx1Z19zbG90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzbG90LT5ob3RwbHVnX3Nsb3QpCiAJCWdvdG8gZXJyb3Jfc2xvdDsKIAotCXNsb3QtPmhvdHBsdWdfc2xvdC0+aW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpob3RwbHVnX3Nsb3RfaW5mbyksCi0JCQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKQotCQlnb3RvIGVycm9yX2hwc2xvdDsKKwlzbG90LT5ob3RwbHVnX3Nsb3QtPmluZm8gPSAmc2xvdC0+aW5mbzsKIAotCXNsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZSA9IGt6YWxsb2MoU0xPVF9OQU1FX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKQotCQlnb3RvIGVycm9yX2luZm87CisJc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lID0gc2xvdC0+bmFtZTsKIAogCXNsb3QtPmhvdHBsdWdfc2xvdC0+cHJpdmF0ZSA9IHNsb3Q7CiAJc2xvdC0+aG90cGx1Z19zbG90LT5yZWxlYXNlID0gJnJlbGVhc2Vfc2xvdDsKQEAgLTM3NiwyMSArMzU3LDE3IEBACiAJc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvLT5jdXJfYnVzX3NwZWVkID0gUENJX1NQRUVEX1VOS05PV047CiAKIAlhY3BpcGhwX3Nsb3QtPnNsb3QgPSBzbG90OwotCW1ha2Vfc2xvdF9uYW1lKHNsb3QpOworCXNucHJpbnRmKHNsb3QtPm5hbWUsIHNpemVvZihzbG90LT5uYW1lKSwgIiV1Iiwgc2xvdC0+YWNwaV9zbG90LT5zdW4pOwogCiAJcmV0dmFsID0gcGNpX2hwX3JlZ2lzdGVyKHNsb3QtPmhvdHBsdWdfc2xvdCk7CiAJaWYgKHJldHZhbCkgewogCQllcnIoInBjaV9ocF9yZWdpc3RlciBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmV0dmFsKTsKLQkJZ290byBlcnJvcl9uYW1lOworCQlnb3RvIGVycm9yX2hwc2xvdDsKICAJfQogCiAJaW5mbygiU2xvdCBbJXNdIHJlZ2lzdGVyZWRcbiIsIHNsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKLWVycm9yX25hbWU6Ci0Ja2ZyZWUoc2xvdC0+aG90cGx1Z19zbG90LT5uYW1lKTsKLWVycm9yX2luZm86Ci0Ja2ZyZWUoc2xvdC0+aG90cGx1Z19zbG90LT5pbmZvKTsKIGVycm9yX2hwc2xvdDoKIAlrZnJlZShzbG90LT5ob3RwbHVnX3Nsb3QpOwogZXJyb3Jfc2xvdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IDgzZThlNDQuLjBiOWQwZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtNDUsMTEgKzQ1LDExIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgIi4uL3BjaS5oIgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCiAjaW5jbHVkZSAiYWNwaXBocC5oIgogCiBzdGF0aWMgTElTVF9IRUFEKGJyaWRnZV9saXN0KTsKQEAgLTE2OTMsMTQgKzE2OTMsMTAgQEAKICAqLwogaW50IF9faW5pdCBhY3BpcGhwX2dldF9udW1fc2xvdHModm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOwogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwotCWludCBudW1fc2xvdHM7CisJaW50IG51bV9zbG90cyA9IDA7CiAKLQludW1fc2xvdHMgPSAwOwotCi0JbGlzdF9mb3JfZWFjaCAobm9kZSwgJmJyaWRnZV9saXN0KSB7Ci0JCWJyaWRnZSA9IChzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKilub2RlOworCWxpc3RfZm9yX2VhY2hfZW50cnkgKGJyaWRnZSwgJmJyaWRnZV9saXN0LCBsaXN0KSB7CiAJCWRiZygiQnVzICUwNHg6JTAyeCBoYXMgJWQgc2xvdCVzXG4iLAogCQkJCXBjaV9kb21haW5fbnIoYnJpZGdlLT5wY2lfYnVzKSwKIAkJCQlicmlkZ2UtPnBjaV9idXMtPm51bWJlciwgYnJpZGdlLT5ucl9zbG90cywKQEAgLTE4MDcsOCArMTgwMyw4IEBACiAKIAogLyoKLSAqIGxhdGNoIGNsb3NlZDogIDEKLSAqIGxhdGNoICAgb3BlbjogIDAKKyAqIGxhdGNoICAgb3BlbjogIDEKKyAqIGxhdGNoIGNsb3NlZDogIDAKICAqLwogdTggYWNwaXBocF9nZXRfbGF0Y2hfc3RhdHVzKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCiB7CkBAIC0xODE2LDcgKzE4MTIsNyBAQAogCiAJc3RhID0gZ2V0X3Nsb3Rfc3RhdHVzKHNsb3QpOwogCi0JcmV0dXJuIChzdGEgJiBBQ1BJX1NUQV9TSE9XX0lOX1VJKSA/IDEgOiAwOworCXJldHVybiAoc3RhICYgQUNQSV9TVEFfU0hPV19JTl9VSSkgPyAwIDogMTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMKaW5kZXggZDBhMDdkOS4uYmQ0MGFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlICJhY3BpcGhwLmgiCi0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKIAogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMS4wLjEiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJIklyZW5lIFp1YmFyZXYgPHp1YmFyZXZAdXMuaWJtLmNvbT4sIFZlcm5vbiBNYXVlcnkgPHZlcm51eEB1cy5pYm0uY29tPiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX2NvcmUuYwppbmRleCBkMDZhYjQwLi42ODQ1NTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfY29yZS5jCkBAIC0yOSwxMiArMjksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogI2luY2x1ZGUgImNwY2lfaG90cGx1Zy5oIgogCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJIlNjb3R0IE11cnJheSA8c2NvdHRtQHNvbWFuZXR3b3Jrcy5jb20+IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYwppbmRleCA0YWZjYWZmLi43YjFiZWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYwpAQCAtMjYsOSArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgIi4uL3BjaS5oIgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCiAjaW5jbHVkZSAiY3BjaV9ob3RwbHVnLmgiCiAKICNkZWZpbmUgTVlfTkFNRQkiY3BjaV9ob3RwbHVnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpaHBfZ2VuZXJpYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpaHBfZ2VuZXJpYy5jCmluZGV4IGU4NDdmMGQuLmYzODUyYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaWhwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2locF9nZW5lcmljLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAogCWlmKCFicmlkZ2UpIHsKIAkJaW5mbygibm90IGNvbmZpZ3VyZWQsIGRpc2FibGluZy4iKTsKLQkJcmV0dXJuIDE7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzdHIgPSBicmlkZ2U7CiAJaWYoISpzdHIpCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OKTsKIAlzdGF0dXMgPSB2YWxpZGF0ZV9wYXJhbWV0ZXJzKCk7Ci0JaWYoc3RhdHVzICE9IDApCisJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAogCXIgPSByZXF1ZXN0X3JlZ2lvbihwb3J0LCAxLCAiI0VOVU0gaG90c3dhcCBzaWduYWwgcmVnaXN0ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocC5oCmluZGV4IGVhMDQwYzMuLjI5OGFkN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHAuaApAQCAtMjgsNyArMjgsNiBAQAogI2lmbmRlZiBfQ1BRUEhQX0gKICNkZWZpbmUgX0NQUVBIUF9ICiAKLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogZm9yIHJlYWQ/IGFuZCB3cml0ZT8gZnVuY3Rpb25zICovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogZm9yIGRlbGF5cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCmluZGV4IDFmYzI1OTkuLjU2MTdjZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYwppbmRleCAzZWMyYWQ3Li43OWZmNmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlICJjcHFwaHAuaCIKIAogc3RhdGljIHUzMiBjb25maWd1cmVfbmV3X2RldmljZShzdHJ1Y3QgY29udHJvbGxlciogY3RybCwgc3RydWN0IHBjaV9mdW5jICpmdW5jLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfbnZyYW0uYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX252cmFtLmMKaW5kZXggY2YwODc4OS4uYWU1ZTk3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfbnZyYW0uYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9udnJhbS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiY3BxcGhwLmgiCkBAIC01MTksNyArNTIwLDcgQEAKIAkJCXJldHVybiAyOwogCiAJCXdoaWxlIChudW1tZW0tLSkgewotCQkJbWVtX25vZGUgPSAoc3RydWN0IHBjaV9yZXNvdXJjZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwkJCW1lbV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9yZXNvdXJjZSksIEdGUF9LRVJORUwpOwogCiAJCQlpZiAoIW1lbV9ub2RlKQogCQkJCWJyZWFrOwpAQCAtNTQ3LDcgKzU0OCw3IEBACiAJCX0KIAogCQl3aGlsZSAobnVtcG1lbS0tKSB7Ci0JCQlwX21lbV9ub2RlID0gKHN0cnVjdCBwY2lfcmVzb3VyY2UqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX3Jlc291cmNlKSwgR0ZQX0tFUk5FTCk7CisJCQlwX21lbV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9yZXNvdXJjZSksIEdGUF9LRVJORUwpOwogCiAJCQlpZiAoIXBfbWVtX25vZGUpCiAJCQkJYnJlYWs7CkBAIC01NzUsNyArNTc2LDcgQEAKIAkJfQogCiAJCXdoaWxlIChudW1pby0tKSB7Ci0JCQlpb19ub2RlID0gKHN0cnVjdCBwY2lfcmVzb3VyY2UqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX3Jlc291cmNlKSwgR0ZQX0tFUk5FTCk7CisJCQlpb19ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9yZXNvdXJjZSksIEdGUF9LRVJORUwpOwogCiAJCQlpZiAoIWlvX25vZGUpCiAJCQkJYnJlYWs7CkBAIC02MDMsNyArNjA0LDcgQEAKIAkJfQogCiAJCXdoaWxlIChudW1idXMtLSkgewotCQkJYnVzX25vZGUgPSAoc3RydWN0IHBjaV9yZXNvdXJjZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwkJCWJ1c19ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9yZXNvdXJjZSksIEdGUF9LRVJORUwpOwogCiAJCQlpZiAoIWJ1c19ub2RlKQogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9wY2kuYwppbmRleCAwZDk2ODg5Li5mYzdjNzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9wY2kuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgIi4uL3BjaS5oIgogI2luY2x1ZGUgImNwcXBocC5oIgogI2luY2x1ZGUgImNwcXBocF9udnJhbS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfc3lzZnMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3N5c2ZzLmMKaW5kZXggNWJhYjY2Ni4uNjM0Zjc0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9zeXNmcy5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgImNwcXBocC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCmluZGV4IDA1YTRmMGYuLmUyNzkwN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCkBAIC0zNSwxMCArMzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKICNpbmNsdWRlICIuLi9wY2kuaCIKIAogI2lmICFkZWZpbmVkKE1PRFVMRSkKQEAgLTE4MSw3ICsxODEsOSBAQAogCiAJaWYgKCFwY2lfcmVhZF9jb25maWdfYnl0ZSh0ZW1wLCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSkpIHsKIAkJdGVtcC0+aGRyX3R5cGUgPSBoZHJfdHlwZSAmIDB4N2Y7Ci0JCWlmICghcGNpX2ZpbmRfc2xvdChidXMtPm51bWJlciwgdGVtcC0+ZGV2Zm4pKSB7CisJCWlmICgoZGV2ID0gcGNpX2dldF9zbG90KGJ1cywgdGVtcC0+ZGV2Zm4pKSAhPSBOVUxMKQorCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJZWxzZSB7CiAJCQlkZXYgPSBwY2lfc2Nhbl9zaW5nbGVfZGV2aWNlKGJ1cywgdGVtcC0+ZGV2Zm4pOwogCQkJaWYgKGRldikgewogCQkJCWRiZygiTmV3IGRldmljZSBvbiAlcyBmdW5jdGlvbiAleDoleFxuIiwKQEAgLTIwNSw3ICsyMDcsOSBAQAogCQkJCWNvbnRpbnVlOwogCQkJdGVtcC0+aGRyX3R5cGUgPSBoZHJfdHlwZSAmIDB4N2Y7CiAKLQkJCWlmICghcGNpX2ZpbmRfc2xvdChidXMtPm51bWJlciwgdGVtcC0+ZGV2Zm4pKSB7CisJCQlpZiAoKGRldiA9IHBjaV9nZXRfc2xvdChidXMsIHRlbXAtPmRldmZuKSkgIT0gTlVMTCkKKwkJCQlwY2lfZGV2X3B1dChkZXYpOworCQkJZWxzZSB7CiAJCQkJZGV2ID0gcGNpX3NjYW5fc2luZ2xlX2RldmljZShidXMsIHRlbXAtPmRldmZuKTsKIAkJCQlpZiAoZGV2KSB7CiAJCQkJCWRiZygiTmV3IGRldmljZSBvbiAlcyBmdW5jdGlvbiAleDoleFxuIiwKQEAgLTMwNSw3ICszMDksNyBAQAogCS8qIHNlYXJjaCBmb3Igc3ViZnVuY3Rpb25zIGFuZCBkaXNhYmxlIHRoZW0gZmlyc3QgKi8KIAlpZiAoIShkc2xvdC0+ZGV2LT5kZXZmbiAmIDcpKSB7CiAJCWZvciAoZnVuYyA9IDE7IGZ1bmMgPCA4OyBmdW5jKyspIHsKLQkJCWRldiA9IHBjaV9maW5kX3Nsb3QoZHNsb3QtPmRldi0+YnVzLT5udW1iZXIsCisJCQlkZXYgPSBwY2lfZ2V0X3Nsb3QoZHNsb3QtPmRldi0+YnVzLAogCQkJCQlkc2xvdC0+ZGV2LT5kZXZmbiArIGZ1bmMpOwogCQkJaWYgKGRldikgewogCQkJCWhzbG90ID0gZ2V0X3Nsb3RfZnJvbV9kZXYoZGV2KTsKQEAgLTMxNSw2ICszMTksNyBAQAogCQkJCQllcnIoIkhvdHBsdWcgc2xvdCBub3QgZm91bmQgZm9yIHN1YmZ1bmN0aW9uIG9mIFBDSSBkZXZpY2VcbiIpOwogCQkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCQl9CisJCQkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJCX0gZWxzZQogCQkJCWRiZygiTm8gZGV2aWNlIGluIHNsb3QgZm91bmRcbiIpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHAuaAppbmRleCBkYmE2ZDhjLi42MTJkOTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwLmgKQEAgLTMwLDcgKzMwLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KIAogZXh0ZXJuIGludCBpYm1waHBfZGVidWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfaHBjLmMKaW5kZXggYzNhYzk4YS4uZjU1YWMzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfaHBjLmMKQEAgLTUzMSw3ICs1MzEsNyBAQAogKgogKiBBY3Rpb246ICBpc3N1ZSBhIFJFQUQgY29tbWFuZCB0byBIUEMKICoKLSogSW5wdXQ6ICAgcHNsb3QgICAtIGNhbiBub3QgYmUgTlVMTCBmb3IgUkVBRF9BTExTVEFUCisqIElucHV0OiAgIHBzbG90ICAgLSBjYW5ub3QgYmUgTlVMTCBmb3IgUkVBRF9BTExTVEFUCiAqICAgICAgICAgIHBzdGF0dXMgLSBjYW4gYmUgTlVMTCBmb3IgUkVBRF9BTExTVEFUCiAqCiAqIFJldHVybiAgIDAgb3IgZXJyb3IgY29kZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfcGNpLmMKaW5kZXggZDg3YTllMy4uZDhmMDVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfcGNpLmMKQEAgLTEzNzEsMTIgKzEzNzEsMTIgQEAKIAl9CiAKIAlidXMgPSBpYm1waHBfZmluZF9yZXNfYnVzIChzZWNfbnVtYmVyKTsKLQlkZWJ1ZyAoImJ1cy0+YnVzbm8gaXMgJXhcbiIsIGJ1cy0+YnVzbm8pOwotCWRlYnVnICgic2VjX251bWJlciBpcyAleFxuIiwgc2VjX251bWJlcik7CiAJaWYgKCFidXMpIHsKIAkJZXJyICgiY2Fubm90IGZpbmQgQnVzIHN0cnVjdHVyZSBmb3IgdGhlIGJyaWRnZWQgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCWRlYnVnKCJidXMtPmJ1c25vIGlzICV4XG4iLCBidXMtPmJ1c25vKTsKKwlkZWJ1Zygic2VjX251bWJlciBpcyAleFxuIiwgc2VjX251bWJlcik7CiAKIAlpYm1waHBfcmVtb3ZlX2J1cyAoYnVzLCBidXNubyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWcuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyNTIzZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoKLSAqIFBDSSBIb3RQbHVnIENvcmUgRnVuY3Rpb25zCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKLSAqIENvcHlyaWdodCAoQykgMjAwMSBJQk0gQ29ycC4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqIFNlbmQgZmVlZGJhY2sgdG8gPGdyZWdAa3JvYWguY29tPgotICoKLSAqLwotI2lmbmRlZiBfUENJX0hPVFBMVUdfSAotI2RlZmluZSBfUENJX0hPVFBMVUdfSAotCi0KLS8qIFRoZXNlIHZhbHVlcyBjb21lIGZyb20gdGhlIFBDSSBIb3RwbHVnIFNwZWMgKi8KLWVudW0gcGNpX2J1c19zcGVlZCB7Ci0JUENJX1NQRUVEXzMzTUh6CQkJPSAweDAwLAotCVBDSV9TUEVFRF82Nk1IegkJCT0gMHgwMSwKLQlQQ0lfU1BFRURfNjZNSHpfUENJWAkJPSAweDAyLAotCVBDSV9TUEVFRF8xMDBNSHpfUENJWAkJPSAweDAzLAotCVBDSV9TUEVFRF8xMzNNSHpfUENJWAkJPSAweDA0LAotCVBDSV9TUEVFRF82Nk1Iel9QQ0lYX0VDQwk9IDB4MDUsCi0JUENJX1NQRUVEXzEwME1Iel9QQ0lYX0VDQwk9IDB4MDYsCi0JUENJX1NQRUVEXzEzM01Iel9QQ0lYX0VDQwk9IDB4MDcsCi0JUENJX1NQRUVEXzY2TUh6X1BDSVhfMjY2CT0gMHgwOSwKLQlQQ0lfU1BFRURfMTAwTUh6X1BDSVhfMjY2CT0gMHgwYSwKLQlQQ0lfU1BFRURfMTMzTUh6X1BDSVhfMjY2CT0gMHgwYiwKLQlQQ0lfU1BFRURfNjZNSHpfUENJWF81MzMJPSAweDExLAotCVBDSV9TUEVFRF8xMDBNSHpfUENJWF81MzMJPSAweDEyLAotCVBDSV9TUEVFRF8xMzNNSHpfUENJWF81MzMJPSAweDEzLAotCVBDSV9TUEVFRF9VTktOT1dOCQk9IDB4ZmYsCi19OwotCi0vKiBUaGVzZSB2YWx1ZXMgY29tZSBmcm9tIHRoZSBQQ0kgRXhwcmVzcyBTcGVjICovCi1lbnVtIHBjaWVfbGlua193aWR0aCB7Ci0JUENJRV9MTktfV0lEVEhfUkVTUlYJPSAweDAwLAotCVBDSUVfTE5LX1gxCQk9IDB4MDEsCi0JUENJRV9MTktfWDIJCT0gMHgwMiwKLQlQQ0lFX0xOS19YNAkJPSAweDA0LAotCVBDSUVfTE5LX1g4CQk9IDB4MDgsCi0JUENJRV9MTktfWDEyCQk9IDB4MEMsCi0JUENJRV9MTktfWDE2CQk9IDB4MTAsCi0JUENJRV9MTktfWDMyCQk9IDB4MjAsCi0JUENJRV9MTktfV0lEVEhfVU5LTk9XTiAgPSAweEZGLAotfTsKLQotZW51bSBwY2llX2xpbmtfc3BlZWQgewotCVBDSUVfMlBUNUdCCQk9IDB4MTQsCi0JUENJRV9MTktfU1BFRURfVU5LTk9XTgk9IDB4RkYsCi19OwotCi1zdHJ1Y3QgaG90cGx1Z19zbG90Owotc3RydWN0IGhvdHBsdWdfc2xvdF9hdHRyaWJ1dGUgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGhvdHBsdWdfc2xvdCAqLCBjaGFyICopOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGhvdHBsdWdfc2xvdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci19OwotI2RlZmluZSB0b19ob3RwbHVnX2F0dHIobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCBob3RwbHVnX3Nsb3RfYXR0cmlidXRlLCBhdHRyKTsKLQotLyoqCi0gKiBzdHJ1Y3QgaG90cGx1Z19zbG90X29wcyAtdGhlIGNhbGxiYWNrcyB0aGF0IHRoZSBob3RwbHVnIHBjaSBjb3JlIGNhbiB1c2UKLSAqIEBvd25lcjogVGhlIG1vZHVsZSBvd25lciBvZiB0aGlzIHN0cnVjdHVyZQotICogQGVuYWJsZV9zbG90OiBDYWxsZWQgd2hlbiB0aGUgdXNlciB3YW50cyB0byBlbmFibGUgYSBzcGVjaWZpYyBwY2kgc2xvdAotICogQGRpc2FibGVfc2xvdDogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gZGlzYWJsZSBhIHNwZWNpZmljIHBjaSBzbG90Ci0gKiBAc2V0X2F0dGVudGlvbl9zdGF0dXM6IENhbGxlZCB0byBzZXQgdGhlIHNwZWNpZmljIHNsb3QncyBhdHRlbnRpb24gTEVEIHRvCi0gKiB0aGUgc3BlY2lmaWVkIHZhbHVlCi0gKiBAaGFyZHdhcmVfdGVzdDogQ2FsbGVkIHRvIHJ1biBhIHNwZWNpZmllZCBoYXJkd2FyZSB0ZXN0IG9uIHRoZSBzcGVjaWZpZWQKLSAqIHNsb3QuCi0gKiBAZ2V0X3Bvd2VyX3N0YXR1czogQ2FsbGVkIHRvIGdldCB0aGUgY3VycmVudCBwb3dlciBzdGF0dXMgb2YgYSBzbG90LgotICogCUlmIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlIHZhbHVlIHBhc3NlZCBpbiB0aGUgc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvCi0gKiAJd2lsbCBiZSB1c2VkIHdoZW4gdGhpcyB2YWx1ZSBpcyByZXF1ZXN0ZWQgYnkgYSB1c2VyLgotICogQGdldF9hdHRlbnRpb25fc3RhdHVzOiBDYWxsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IGF0dGVudGlvbiBzdGF0dXMgb2YgYSBzbG90LgotICoJSWYgdGhpcyBmaWVsZCBpcyBOVUxMLCB0aGUgdmFsdWUgcGFzc2VkIGluIHRoZSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8KLSAqCXdpbGwgYmUgdXNlZCB3aGVuIHRoaXMgdmFsdWUgaXMgcmVxdWVzdGVkIGJ5IGEgdXNlci4KLSAqIEBnZXRfbGF0Y2hfc3RhdHVzOiBDYWxsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IGxhdGNoIHN0YXR1cyBvZiBhIHNsb3QuCi0gKglJZiB0aGlzIGZpZWxkIGlzIE5VTEwsIHRoZSB2YWx1ZSBwYXNzZWQgaW4gdGhlIHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbwotICoJd2lsbCBiZSB1c2VkIHdoZW4gdGhpcyB2YWx1ZSBpcyByZXF1ZXN0ZWQgYnkgYSB1c2VyLgotICogQGdldF9hZGFwdGVyX3N0YXR1czogQ2FsbGVkIHRvIGdldCBzZWUgaWYgYW4gYWRhcHRlciBpcyBwcmVzZW50IGluIHRoZSBzbG90IG9yIG5vdC4KLSAqCUlmIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlIHZhbHVlIHBhc3NlZCBpbiB0aGUgc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvCi0gKgl3aWxsIGJlIHVzZWQgd2hlbiB0aGlzIHZhbHVlIGlzIHJlcXVlc3RlZCBieSBhIHVzZXIuCi0gKiBAZ2V0X2FkZHJlc3M6IENhbGxlZCB0byBnZXQgcGNpIGFkZHJlc3Mgb2YgYSBzbG90LgotICoJSWYgdGhpcyBmaWVsZCBpcyBOVUxMLCB0aGUgdmFsdWUgcGFzc2VkIGluIHRoZSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8KLSAqCXdpbGwgYmUgdXNlZCB3aGVuIHRoaXMgdmFsdWUgaXMgcmVxdWVzdGVkIGJ5IGEgdXNlci4KLSAqIEBnZXRfbWF4X2J1c19zcGVlZDogQ2FsbGVkIHRvIGdldCB0aGUgbWF4IGJ1cyBzcGVlZCBmb3IgYSBzbG90LgotICoJSWYgdGhpcyBmaWVsZCBpcyBOVUxMLCB0aGUgdmFsdWUgcGFzc2VkIGluIHRoZSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8KLSAqCXdpbGwgYmUgdXNlZCB3aGVuIHRoaXMgdmFsdWUgaXMgcmVxdWVzdGVkIGJ5IGEgdXNlci4KLSAqIEBnZXRfY3VyX2J1c19zcGVlZDogQ2FsbGVkIHRvIGdldCB0aGUgY3VycmVudCBidXMgc3BlZWQgZm9yIGEgc2xvdC4KLSAqCUlmIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlIHZhbHVlIHBhc3NlZCBpbiB0aGUgc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvCi0gKgl3aWxsIGJlIHVzZWQgd2hlbiB0aGlzIHZhbHVlIGlzIHJlcXVlc3RlZCBieSBhIHVzZXIuCi0gKgotICogVGhlIHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBob3RwbHVnIHBjaSBjb3JlIGJ5IGEKLSAqIGhvdHBsdWcgcGNpIGRyaXZlci4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IHRoZSBob3RwbHVnIHBjaSBjb3JlIHdoZW4KLSAqIHRoZSB1c2VyIHdhbnRzIHRvIGRvIHNvbWV0aGluZyB0byBhIHNwZWNpZmljIHNsb3QgKHF1ZXJ5IGl0IGZvciBpbmZvcm1hdGlvbiwKLSAqIHNldCBhbiBMRUQsIGVuYWJsZSAvIGRpc2FibGUgcG93ZXIsIGV0Yy4pCi0gKi8KLXN0cnVjdCBob3RwbHVnX3Nsb3Rfb3BzIHsKLQlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQlpbnQgKCplbmFibGVfc2xvdCkJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKLQlpbnQgKCpkaXNhYmxlX3Nsb3QpCQkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCk7Ci0JaW50ICgqc2V0X2F0dGVudGlvbl9zdGF0dXMpCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCB2YWx1ZSk7Ci0JaW50ICgqaGFyZHdhcmVfdGVzdCkJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1MzIgdmFsdWUpOwotCWludCAoKmdldF9wb3dlcl9zdGF0dXMpCQkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKnZhbHVlKTsKLQlpbnQgKCpnZXRfYXR0ZW50aW9uX3N0YXR1cykJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHU4ICp2YWx1ZSk7Ci0JaW50ICgqZ2V0X2xhdGNoX3N0YXR1cykJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOwotCWludCAoKmdldF9hZGFwdGVyX3N0YXR1cykJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHU4ICp2YWx1ZSk7Ci0JaW50ICgqZ2V0X2FkZHJlc3MpCQkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTMyICp2YWx1ZSk7Ci0JaW50ICgqZ2V0X21heF9idXNfc3BlZWQpCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCBlbnVtIHBjaV9idXNfc3BlZWQgKnZhbHVlKTsKLQlpbnQgKCpnZXRfY3VyX2J1c19zcGVlZCkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIGVudW0gcGNpX2J1c19zcGVlZCAqdmFsdWUpOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gLSB1c2VkIHRvIG5vdGlmeSB0aGUgaG90cGx1ZyBwY2kgY29yZSBvZiB0aGUgc3RhdGUgb2YgdGhlIHNsb3QKLSAqIEBwb3dlcjogaWYgcG93ZXIgaXMgZW5hYmxlZCBvciBub3QgKDEvMCkKLSAqIEBhdHRlbnRpb25fc3RhdHVzOiBpZiB0aGUgYXR0ZW50aW9uIGxpZ2h0IGlzIGVuYWJsZWQgb3Igbm90ICgxLzApCi0gKiBAbGF0Y2hfc3RhdHVzOiBpZiB0aGUgbGF0Y2ggKGlmIGFueSkgaXMgb3BlbiBvciBjbG9zZWQgKDEvMCkKLSAqIEBhZGFwdGVyX3ByZXNlbnQ6IGlmIHRoZXJlIGlzIGEgcGNpIGJvYXJkIHByZXNlbnQgaW4gdGhlIHNsb3Qgb3Igbm90ICgxLzApCi0gKiBAYWRkcmVzczogKGRvbWFpbiA8PCAxNiB8IGJ1cyA8PCA4IHwgZGV2KQotICoKLSAqIFVzZWQgdG8gbm90aWZ5IHRoZSBob3RwbHVnIHBjaSBjb3JlIG9mIHRoZSBzdGF0dXMgb2YgYSBzcGVjaWZpYyBzbG90LgotICovCi1zdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gewotCXU4CXBvd2VyX3N0YXR1czsKLQl1OAlhdHRlbnRpb25fc3RhdHVzOwotCXU4CWxhdGNoX3N0YXR1czsKLQl1OAlhZGFwdGVyX3N0YXR1czsKLQl1MzIJYWRkcmVzczsKLQllbnVtIHBjaV9idXNfc3BlZWQJbWF4X2J1c19zcGVlZDsKLQllbnVtIHBjaV9idXNfc3BlZWQJY3VyX2J1c19zcGVlZDsKLX07Ci0KLS8qKgotICogc3RydWN0IGhvdHBsdWdfc2xvdCAtIHVzZWQgdG8gcmVnaXN0ZXIgYSBwaHlzaWNhbCBzbG90IHdpdGggdGhlIGhvdHBsdWcgcGNpIGNvcmUKLSAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgc2xvdCBiZWluZyByZWdpc3RlcmVkLiAgVGhpcyBzdHJpbmcgbXVzdAotICogYmUgdW5pcXVlIGFtb3VuZyBzbG90cyByZWdpc3RlcmVkIG9uIHRoaXMgc3lzdGVtLgotICogQG9wczogcG9pbnRlciB0byB0aGUgJnN0cnVjdCBob3RwbHVnX3Nsb3Rfb3BzIHRvIGJlIHVzZWQgZm9yIHRoaXMgc2xvdAotICogQGluZm86IHBvaW50ZXIgdG8gdGhlICZzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gZm9yIHRoZSBpbml0aWFsIHZhbHVlcyBmb3IKLSAqIHRoaXMgc2xvdC4KLSAqIEByZWxlYXNlOiBjYWxsZWQgZHVyaW5nIHBjaV9ocF9kZXJlZ2lzdGVyIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBpbiBhCi0gKiBob3RwbHVnX3Nsb3Qgc3RydWN0dXJlLgotICogQHByaXZhdGU6IHVzZWQgYnkgdGhlIGhvdHBsdWcgcGNpIGNvbnRyb2xsZXIgZHJpdmVyIHRvIHN0b3JlIHdoYXRldmVyIGl0Ci0gKiBuZWVkcy4KLSAqLwotc3RydWN0IGhvdHBsdWdfc2xvdCB7Ci0JY2hhcgkJCQkqbmFtZTsKLQlzdHJ1Y3QgaG90cGx1Z19zbG90X29wcwkJKm9wczsKLQlzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8JKmluZm87Ci0Jdm9pZCAoKnJlbGVhc2UpIChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKLQl2b2lkCQkJCSpwcml2YXRlOwotCi0JLyogVmFyaWFibGVzIGJlbG93IHRoaXMgYXJlIGZvciB1c2Ugb25seSBieSB0aGUgaG90cGx1ZyBwY2kgY29yZS4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCQlzbG90X2xpc3Q7Ci0Jc3RydWN0IGtvYmplY3QJCQlrb2JqOwotfTsKLSNkZWZpbmUgdG9faG90cGx1Z19zbG90KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgaG90cGx1Z19zbG90LCBrb2JqKQotCi1leHRlcm4gaW50IHBjaV9ocF9yZWdpc3RlcgkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QpOwotZXh0ZXJuIGludCBwY2lfaHBfZGVyZWdpc3RlcgkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QpOwotZXh0ZXJuIGludCBfX211c3RfY2hlY2sgcGNpX2hwX2NoYW5nZV9zbG90X2luZm8JKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsCi0JCQkJCQkgc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvICppbmZvKTsKLWV4dGVybiBzdHJ1Y3Qgc3Vic3lzdGVtIHBjaV9ob3RwbHVnX3Nsb3RzX3N1YnN5czsKLQotLyogUENJIFNldHRpbmcgUmVjb3JkIChUeXBlIDApICovCi1zdHJ1Y3QgaHBwX3R5cGUwIHsKLQl1MzIgcmV2aXNpb247Ci0JdTggIGNhY2hlX2xpbmVfc2l6ZTsKLQl1OCAgbGF0ZW5jeV90aW1lcjsKLQl1OCAgZW5hYmxlX3NlcnI7Ci0JdTggIGVuYWJsZV9wZXJyOwotfTsKLQotLyogUENJLVggU2V0dGluZyBSZWNvcmQgKFR5cGUgMSkgKi8KLXN0cnVjdCBocHBfdHlwZTEgewotCXUzMiByZXZpc2lvbjsKLQl1OCAgbWF4X21lbV9yZWFkOwotCXU4ICBhdmdfbWF4X3NwbGl0OwotCXUxNiB0b3RfbWF4X3NwbGl0OwotfTsKLQotLyogUENJIEV4cHJlc3MgU2V0dGluZyBSZWNvcmQgKFR5cGUgMikgKi8KLXN0cnVjdCBocHBfdHlwZTIgewotCXUzMiByZXZpc2lvbjsKLQl1MzIgdW5jX2Vycl9tYXNrX2FuZDsKLQl1MzIgdW5jX2Vycl9tYXNrX29yOwotCXUzMiB1bmNfZXJyX3NldmVyX2FuZDsKLQl1MzIgdW5jX2Vycl9zZXZlcl9vcjsKLQl1MzIgY29yX2Vycl9tYXNrX2FuZDsKLQl1MzIgY29yX2Vycl9tYXNrX29yOwotCXUzMiBhZHZfZXJyX2NhcF9hbmQ7Ci0JdTMyIGFkdl9lcnJfY2FwX29yOwotCXUxNiBwY2lfZXhwX2RldmN0bF9hbmQ7Ci0JdTE2IHBjaV9leHBfZGV2Y3RsX29yOwotCXUxNiBwY2lfZXhwX2xua2N0bF9hbmQ7Ci0JdTE2IHBjaV9leHBfbG5rY3RsX29yOwotCXUzMiBzZWNfdW5jX2Vycl9zZXZlcl9hbmQ7Ci0JdTMyIHNlY191bmNfZXJyX3NldmVyX29yOwotCXUzMiBzZWNfdW5jX2Vycl9tYXNrX2FuZDsKLQl1MzIgc2VjX3VuY19lcnJfbWFza19vcjsKLX07Ci0KLXN0cnVjdCBob3RwbHVnX3BhcmFtcyB7Ci0Jc3RydWN0IGhwcF90eXBlMCAqdDA7CQkvKiBUeXBlMDogTlVMTCBpZiBub3QgYXZhaWxhYmxlICovCi0Jc3RydWN0IGhwcF90eXBlMSAqdDE7CQkvKiBUeXBlMTogTlVMTCBpZiBub3QgYXZhaWxhYmxlICovCi0Jc3RydWN0IGhwcF90eXBlMiAqdDI7CQkvKiBUeXBlMjogTlVMTCBpZiBub3QgYXZhaWxhYmxlICovCi0Jc3RydWN0IGhwcF90eXBlMCB0eXBlMF9kYXRhOwotCXN0cnVjdCBocHBfdHlwZTEgdHlwZTFfZGF0YTsKLQlzdHJ1Y3QgaHBwX3R5cGUyIHR5cGUyX2RhdGE7Ci19OwotCi0jaWZkZWYgQ09ORklHX0FDUEkKLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+Ci1leHRlcm4gYWNwaV9zdGF0dXMgYWNwaV9ydW5fb3NocChhY3BpX2hhbmRsZSBoYW5kbGUpOwotZXh0ZXJuIGFjcGlfc3RhdHVzIGFjcGlfZ2V0X2hwX3BhcmFtc19mcm9tX2Zpcm13YXJlKHN0cnVjdCBwY2lfYnVzICpidXMsCi0JCQkJc3RydWN0IGhvdHBsdWdfcGFyYW1zICpocHApOwotaW50IGFjcGlfcm9vdF9icmlkZ2UoYWNwaV9oYW5kbGUgaGFuZGxlKTsKLSNlbmRpZgotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWdfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Z19jb3JlLmMKaW5kZXggZTI4MjNlYS4uZjVkNjMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Z19jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Z19jb3JlLmMKQEAgLTIxLDkgKzIxLDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqCi0gKiBTZW5kIGZlZWRiYWNrIHRvIDxncmVnQGtyb2FoLmNvbT4KLSAqCi0gKiBGaWxlc3lzdGVtIHBvcnRpb24gYmFzZWQgb24gd29yayBkb25lIGJ5IFBhdCBNb2NoZWwgb24gZGRmcy9kcml2ZXJmcworICogU2VuZCBmZWVkYmFjayB0byA8a3Jpc3Rlbi5jLmFjY2FyZGlAaW50ZWwuY29tPgogICoKICAqLwogCkBAIC0zMiw2ICszMCw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgpAQCAtMzksMTEgKzM5LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCi0KIAogI2RlZmluZSBNWV9OQU1FCSJwY2lfaG90cGx1ZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKaW5kZXggZWFlYTlkMy4uNGZiMTJmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCkBAIC0zMSwxMSArMzEsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiBzaWduYWxfcGVuZGluZygpICovCiAjaW5jbHVkZSA8bGludXgvcGNpZXBvcnRfaWYuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCiAKICNkZWZpbmUgTVlfTkFNRQkicGNpZWhwIgogCkBAIC05Miw2ICs5Miw3IEBACiBzdHJ1Y3QgY29udHJvbGxlciB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKm5leHQ7CiAJc3RydWN0IG11dGV4IGNyaXRfc2VjdDsJCS8qIGNyaXRpY2FsIHNlY3Rpb24gbXV0ZXggKi8KKwlzdHJ1Y3QgbXV0ZXggY3RybF9sb2NrOwkJLyogY29udHJvbGxlciBsb2NrICovCiAJc3RydWN0IHBocF9jdGxyX3N0YXRlX3MgKmhwY19jdGxyX2hhbmRsZTsgLyogSFBDIGNvbnRyb2xsZXIgaGFuZGxlICovCiAJaW50IG51bV9zbG90czsJCQkvKiBOdW1iZXIgb2Ygc2xvdHMgb24gY3RsciAqLwogCWludCBzbG90X251bV9pbmM7CQkvKiAxIG9yIC0xICovCkBAIC0xNjYsMTAgKzE2NywxMCBAQAogICogZXJyb3IgTWVzc2FnZXMKICAqLwogI2RlZmluZSBtc2dfaW5pdGlhbGl6YXRpb25fZXJyCSJJbml0aWFsaXphdGlvbiBmYWlsdXJlLCBlcnJvcj0lZFxuIgotI2RlZmluZSBtc2dfYnV0dG9uX29uCQkiUENJIHNsb3QgIyVkIC0gcG93ZXJpbmcgb24gZHVlIHRvIGJ1dHRvbiBwcmVzcy5cbiIKLSNkZWZpbmUgbXNnX2J1dHRvbl9vZmYJCSJQQ0kgc2xvdCAjJWQgLSBwb3dlcmluZyBvZmYgZHVlIHRvIGJ1dHRvbiBwcmVzcy5cbiIKLSNkZWZpbmUgbXNnX2J1dHRvbl9jYW5jZWwJIlBDSSBzbG90ICMlZCAtIGFjdGlvbiBjYW5jZWxlZCBkdWUgdG8gYnV0dG9uIHByZXNzLlxuIgotI2RlZmluZSBtc2dfYnV0dG9uX2lnbm9yZQkiUENJIHNsb3QgIyVkIC0gYnV0dG9uIHByZXNzIGlnbm9yZWQuICAoYWN0aW9uIGluIHByb2dyZXNzLi4uKVxuIgorI2RlZmluZSBtc2dfYnV0dG9uX29uCQkiUENJIHNsb3QgIyVzIC0gcG93ZXJpbmcgb24gZHVlIHRvIGJ1dHRvbiBwcmVzcy5cbiIKKyNkZWZpbmUgbXNnX2J1dHRvbl9vZmYJCSJQQ0kgc2xvdCAjJXMgLSBwb3dlcmluZyBvZmYgZHVlIHRvIGJ1dHRvbiBwcmVzcy5cbiIKKyNkZWZpbmUgbXNnX2J1dHRvbl9jYW5jZWwJIlBDSSBzbG90ICMlcyAtIGFjdGlvbiBjYW5jZWxlZCBkdWUgdG8gYnV0dG9uIHByZXNzLlxuIgorI2RlZmluZSBtc2dfYnV0dG9uX2lnbm9yZQkiUENJIHNsb3QgIyVzIC0gYnV0dG9uIHByZXNzIGlnbm9yZWQuICAoYWN0aW9uIGluIHByb2dyZXNzLi4uKVxuIgogCiAvKiBjb250cm9sbGVyIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGludAlwY2llaHBfZXZlbnRfc3RhcnRfdGhyZWFkCSh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYwppbmRleCBjNjdiN2MzLi5mMTNmMzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCkBAIC00NDgsNyArNDQ4LDcgQEAKIAl9CiAKIAkvKiBXYWl0IGZvciBleGNsdXNpdmUgYWNjZXNzIHRvIGhhcmR3YXJlICovCi0JbXV0ZXhfbG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwltdXRleF9sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCiAJdF9zbG90LT5ocGNfb3BzLT5nZXRfYWRhcHRlcl9zdGF0dXModF9zbG90LCAmdmFsdWUpOyAvKiBDaGVjayBpZiBzbG90IGlzIG9jY3VwaWVkICovCiAJCkBAIC00NTYsNyArNDU2LDcgQEAKIAkJcmMgPSB0X3Nsb3QtPmhwY19vcHMtPnBvd2VyX29mZl9zbG90KHRfc2xvdCk7IC8qIFBvd2VyIG9mZiBzbG90IGlmIG5vdCBvY2N1cGllZCovCiAJCWlmIChyYykgewogCQkJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAkJCWdvdG8gZXJyX291dF9mcmVlX2N0cmxfc2xvdDsKIAkJfSBlbHNlCiAJCQkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJfQogCiAJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCiAJcmV0dXJuIDA7CiAKQEAgLTUyMSwxNCArNTIxLDkgQEAKIAogfQogCi1zdGF0aWMgaW50IGhwZHJpdmVyX2NvbnRleHQgPSAwOwotCiBzdGF0aWMgdm9pZCBwY2llaHBfcmVtb3ZlIChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldmljZSkKIHsKLQlwcmludGsoIiVzIEVOVFJZXG4iLCBfX0ZVTkNUSU9OX18pOwkKLQlwcmludGsoIiVzIC0+IENhbGwgZnJlZV9pcnEgZm9yIGlycSA9ICVkXG4iLCAgCi0JCV9fRlVOQ1RJT05fXywgZGV2aWNlLT5pcnEpOwotCWZyZWVfaXJxKGRldmljZS0+aXJxLCAmaHBkcml2ZXJfY29udGV4dCk7CisJLyogWFhYIC0gTmVlZHMgdG8gYmUgYWRhcHRlZCB0byBkZXZpY2UgZHJpdmVyIG1vZGVsICovCiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwppbmRleCA0MTI5MGExLi4zNzJjNjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCkBAIC00Myw2ICs0MywxMSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgcHVzaGJ1dHRvbl9wZW5kaW5nOwkvKiA9IDAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHN1cnByaXNlX3JtX3BlbmRpbmc7CS8qID0gMCAqLwogCitzdGF0aWMgaW5saW5lIGNoYXIgKnNsb3RfbmFtZShzdHJ1Y3Qgc2xvdCAqcF9zbG90KQoreworCXJldHVybiBwX3Nsb3QtPmhvdHBsdWdfc2xvdC0+bmFtZTsKK30KKwogdTggcGNpZWhwX2hhbmRsZV9hdHRlbnRpb25fYnV0dG9uKHU4IGhwX3Nsb3QsIHZvaWQgKmluc3RfaWQpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSAoc3RydWN0IGNvbnRyb2xsZXIgKikgaW5zdF9pZDsKQEAgLTY4LDcgKzczLDcgQEAKIAkvKgogCSAqICBCdXR0b24gcHJlc3NlZCAtIFNlZSBpZiBuZWVkIHRvIFRBS0UgQUNUSU9OISEhCiAJICovCi0JaW5mbygiQnV0dG9uIHByZXNzZWQgb24gU2xvdCglZClcbiIsIGN0cmwtPmZpcnN0X3Nsb3QgKyBocF9zbG90KTsKKwlpbmZvKCJCdXR0b24gcHJlc3NlZCBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCXRhc2tJbmZvLT5ldmVudF90eXBlID0gSU5UX0JVVFRPTl9QUkVTUzsKIAogCWlmICgocF9zbG90LT5zdGF0ZSA9PSBCTElOS0lOR09OX1NUQVRFKQpAQCAtNzgsNyArODMsNyBAQAogCQkgKiBvciBob3QtcmVtb3ZlCiAJCSAqLwogCQl0YXNrSW5mby0+ZXZlbnRfdHlwZSA9IElOVF9CVVRUT05fQ0FOQ0VMOwotCQlpbmZvKCJCdXR0b24gY2FuY2VsIG9uIFNsb3QoJWQpXG4iLCBjdHJsLT5maXJzdF9zbG90ICsgaHBfc2xvdCk7CisJCWluZm8oIkJ1dHRvbiBjYW5jZWwgb24gU2xvdCglcylcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAl9IGVsc2UgaWYgKChwX3Nsb3QtPnN0YXRlID09IFBPV0VST05fU1RBVEUpCiAJCSAgIHx8IChwX3Nsb3QtPnN0YXRlID09IFBPV0VST0ZGX1NUQVRFKSkgewogCQkvKiBJZ25vcmUgaWYgdGhlIHNsb3QgaXMgb24gcG93ZXItb24gb3IgcG93ZXItb2ZmIHN0YXRlOyB0aGlzIApAQCAtODYsNyArOTEsNyBAQAogCQkgKiBob3QtcmVtb3ZlIGlzIHVuZGVyZ29pbmcKIAkJICovCiAJCXRhc2tJbmZvLT5ldmVudF90eXBlID0gSU5UX0JVVFRPTl9JR05PUkU7Ci0JCWluZm8oIkJ1dHRvbiBpZ25vcmUgb24gU2xvdCglZClcbiIsIGN0cmwtPmZpcnN0X3Nsb3QgKyBocF9zbG90KTsKKwkJaW5mbygiQnV0dG9uIGlnbm9yZSBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCX0KIAogCWlmIChyYykKQEAgLTEyMiwxMyArMTI3LDEzIEBACiAJCS8qCiAJCSAqIFN3aXRjaCBvcGVuZWQKIAkJICovCi0JCWluZm8oIkxhdGNoIG9wZW4gb24gU2xvdCglZClcbiIsIGN0cmwtPmZpcnN0X3Nsb3QgKyBocF9zbG90KTsKKwkJaW5mbygiTGF0Y2ggb3BlbiBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQl0YXNrSW5mby0+ZXZlbnRfdHlwZSA9IElOVF9TV0lUQ0hfT1BFTjsKIAl9IGVsc2UgewogCQkvKgogCQkgKiAgU3dpdGNoIGNsb3NlZAogCQkgKi8KLQkJaW5mbygiTGF0Y2ggY2xvc2Ugb24gU2xvdCglZClcbiIsIGN0cmwtPmZpcnN0X3Nsb3QgKyBocF9zbG90KTsKKwkJaW5mbygiTGF0Y2ggY2xvc2Ugb24gU2xvdCglcylcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJdGFza0luZm8tPmV2ZW50X3R5cGUgPSBJTlRfU1dJVENIX0NMT1NFOwogCX0KIApAQCAtMTY2LDEzICsxNzEsMTMgQEAKIAkJLyoKIAkJICogQ2FyZCBQcmVzZW50CiAJCSAqLwotCQlpbmZvKCJDYXJkIHByZXNlbnQgb24gU2xvdCglZClcbiIsIGN0cmwtPmZpcnN0X3Nsb3QgKyBocF9zbG90KTsKKwkJaW5mbygiQ2FyZCBwcmVzZW50IG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJCXRhc2tJbmZvLT5ldmVudF90eXBlID0gSU5UX1BSRVNFTkNFX09OOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIE5vdCBQcmVzZW50CiAJCSAqLwotCQlpbmZvKCJDYXJkIG5vdCBwcmVzZW50IG9uIFNsb3QoJWQpXG4iLCBjdHJsLT5maXJzdF9zbG90ICsgaHBfc2xvdCk7CisJCWluZm8oIkNhcmQgbm90IHByZXNlbnQgb24gU2xvdCglcylcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJdGFza0luZm8tPmV2ZW50X3R5cGUgPSBJTlRfUFJFU0VOQ0VfT0ZGOwogCX0KIApAQCAtMjA2LDEzICsyMTEsMTMgQEAKIAkJLyoKIAkJICogcG93ZXIgZmF1bHQgQ2xlYXJlZAogCQkgKi8KLQkJaW5mbygiUG93ZXIgZmF1bHQgY2xlYXJlZCBvbiBTbG90KCVkKVxuIiwgY3RybC0+Zmlyc3Rfc2xvdCArIGhwX3Nsb3QpOworCQlpbmZvKCJQb3dlciBmYXVsdCBjbGVhcmVkIG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJCXRhc2tJbmZvLT5ldmVudF90eXBlID0gSU5UX1BPV0VSX0ZBVUxUX0NMRUFSOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqICAgcG93ZXIgZmF1bHQKIAkJICovCi0JCWluZm8oIlBvd2VyIGZhdWx0IG9uIFNsb3QoJWQpXG4iLCBjdHJsLT5maXJzdF9zbG90ICsgaHBfc2xvdCk7CisJCWluZm8oIlBvd2VyIGZhdWx0IG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJCXRhc2tJbmZvLT5ldmVudF90eXBlID0gSU5UX1BPV0VSX0ZBVUxUOwogCQlpbmZvKCJwb3dlciBmYXVsdCBiaXQgJXggc2V0XG4iLCBocF9zbG90KTsKIAl9CkBAIC0yMjksMTMgKzIzNCwxMyBAQAogc3RhdGljIHZvaWQgc2V0X3Nsb3Rfb2ZmKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBzdHJ1Y3Qgc2xvdCAqIHBzbG90KQogewogCS8qIFdhaXQgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gaGFyZHdhcmUgKi8KLQltdXRleF9sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAkvKiB0dXJuIG9mZiBzbG90LCB0dXJuIG9uIEFtYmVyIExFRCwgdHVybiBvZmYgR3JlZW4gTEVEIGlmIHN1cHBvcnRlZCovCiAJaWYgKFBPV0VSX0NUUkwoY3RybC0+Y3RybGNhcCkpIHsKIAkJaWYgKHBzbG90LT5ocGNfb3BzLT5wb3dlcl9vZmZfc2xvdChwc2xvdCkpIHsgICAKIAkJCWVycigiJXM6IElzc3VlIG9mIFNsb3QgUG93ZXIgT2ZmIGNvbW1hbmQgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCQkJcmV0dXJuOwogCQl9CiAJCXdhaXRfZm9yX2N0cmxfaXJxIChjdHJsKTsKQEAgLTI0OSwxNCArMjU0LDE0IEBACiAJaWYgKEFUVE5fTEVEKGN0cmwtPmN0cmxjYXApKSB7IAogCQlpZiAocHNsb3QtPmhwY19vcHMtPnNldF9hdHRlbnRpb25fc3RhdHVzKHBzbG90LCAxKSkgeyAgIAogCQkJZXJyKCIlczogSXNzdWUgb2YgU2V0IEF0dGVudGlvbiBMZWQgY29tbWFuZCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJCQltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAJCQlyZXR1cm47CiAJCX0KIAkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogCX0KIAogCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCi0JbXV0ZXhfdW5sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIH0KIAogLyoqCkBAIC0yNzksMTMgKzI4NCwxMyBAQAogCQkJY3RybC0+c2xvdF9kZXZpY2Vfb2Zmc2V0LCBocF9zbG90KTsKIAogCS8qIFdhaXQgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gaGFyZHdhcmUgKi8KLQltdXRleF9sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAlpZiAoUE9XRVJfQ1RSTChjdHJsLT5jdHJsY2FwKSkgewogCQkvKiBQb3dlciBvbiBzbG90ICovCiAJCXJjID0gcF9zbG90LT5ocGNfb3BzLT5wb3dlcl9vbl9zbG90KHBfc2xvdCk7CiAJCWlmIChyYykgewotCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKQEAgLTMwMSw3ICszMDYsNyBAQAogCX0KIAogCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCi0JbXV0ZXhfdW5sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCS8qIFdhaXQgZm9yIH4xIHNlY29uZCAqLwogCXdhaXRfZm9yX2N0cmxfaXJxIChjdHJsKTsKQEAgLTMzNSw3ICszNDAsNyBAQAogCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9maW5hbCwgY3RybC0+cGNpX2Rldik7CiAJaWYgKFBXUl9MRUQoY3RybC0+Y3RybGNhcCkpIHsKIAkJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotICAJCW11dGV4X2xvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisgIAkJbXV0ZXhfbG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogICAJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29uKHBfc2xvdCk7CiAgIApAQCAtMzQzLDcgKzM0OCw3IEBACiAgIAkJd2FpdF9mb3JfY3RybF9pcnEgKGN0cmwpOwogICAJCiAgIAkJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLSAgCQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisgIAkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogICAJfQogCXJldHVybiAwOwogCkBAIC0zNzUsMTQgKzM4MCwxNCBAQAogCWRiZygiSW4gJXMsIGhwX3Nsb3QgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBocF9zbG90KTsKIAogCS8qIFdhaXQgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gaGFyZHdhcmUgKi8KLQltdXRleF9sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAlpZiAoUE9XRVJfQ1RSTChjdHJsLT5jdHJsY2FwKSkgewogCQkvKiBwb3dlciBvZmYgc2xvdCAqLwogCQlyYyA9IHBfc2xvdC0+aHBjX29wcy0+cG93ZXJfb2ZmX3Nsb3QocF9zbG90KTsKIAkJaWYgKHJjKSB7CiAJCQllcnIoIiVzOiBJc3N1ZSBvZiBTbG90IERpc2FibGUgY29tbWFuZCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJCQltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAkJLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KQEAgLTM5OCw3ICs0MDMsNyBAQAogCX0KIAogCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCi0JbXV0ZXhfdW5sb2NrKCZjdHJsLT5jcml0X3NlY3QpOworCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDQ1LDcgKzQ1MCw3IEBACiAKIAkJaWYgKHBjaWVocF9lbmFibGVfc2xvdChwX3Nsb3QpICYmIFBXUl9MRUQocF9zbG90LT5jdHJsLT5jdHJsY2FwKSkgewogCQkJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotCQkJbXV0ZXhfbG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOworCQkJbXV0ZXhfbG9jaygmcF9zbG90LT5jdHJsLT5jdHJsX2xvY2spOwogCiAJCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9vZmYocF9zbG90KTsKIApAQCAtNDUzLDcgKzQ1OCw3IEBACiAJCQl3YWl0X2Zvcl9jdHJsX2lycSAocF9zbG90LT5jdHJsKTsKIAogCQkJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOworCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmN0cmxfbG9jayk7CiAJCX0KIAkJcF9zbG90LT5zdGF0ZSA9IFNUQVRJQ19TVEFURTsKIAl9CkBAIC00OTUsNyArNTAwLDcgQEAKIAogCQlpZiAocGNpZWhwX2VuYWJsZV9zbG90KHBfc2xvdCkgJiYgUFdSX0xFRChwX3Nsb3QtPmN0cmwtPmN0cmxjYXApKSB7CiAJCQkvKiBXYWl0IGZvciBleGNsdXNpdmUgYWNjZXNzIHRvIGhhcmR3YXJlICovCi0JCQltdXRleF9sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CisJCQltdXRleF9sb2NrKCZwX3Nsb3QtPmN0cmwtPmN0cmxfbG9jayk7CiAKIAkJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29mZihwX3Nsb3QpOwogCkBAIC01MDMsNyArNTA4LDcgQEAKIAkJCXdhaXRfZm9yX2N0cmxfaXJxIChwX3Nsb3QtPmN0cmwpOwogCiAJCQkvKiBEb25lIHdpdGggZXhjbHVzaXZlIGhhcmR3YXJlIGFjY2VzcyAqLwotCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CisJCQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3RybF9sb2NrKTsKIAkJfQogCQlwX3Nsb3QtPnN0YXRlID0gU1RBVElDX1NUQVRFOwogCX0KQEAgLTYxNiw3ICs2MjEsNyBAQAogCQkJCQlzd2l0Y2ggKHBfc2xvdC0+c3RhdGUpIHsKIAkJCQkJY2FzZSBCTElOS0lOR09GRl9TVEFURToKIAkJCQkJCS8qIFdhaXQgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gaGFyZHdhcmUgKi8KLQkJCQkJCW11dGV4X2xvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJCQkJCQltdXRleF9sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCQkJCQkJCiAJCQkJCQlpZiAoUFdSX0xFRChjdHJsLT5jdHJsY2FwKSkgewogCQkJCQkJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29uKHBfc2xvdCk7CkBAIC02MzAsMTEgKzYzNSwxMSBAQAogCQkJCQkJCXdhaXRfZm9yX2N0cmxfaXJxIChjdHJsKTsKIAkJCQkJCX0KIAkJCQkJCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCi0JCQkJCQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJCQkJCQltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAJCQkJCQlicmVhazsKIAkJCQkJY2FzZSBCTElOS0lOR09OX1NUQVRFOgogCQkJCQkJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotCQkJCQkJbXV0ZXhfbG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCQkJCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAkJCQkJCWlmIChQV1JfTEVEKGN0cmwtPmN0cmxjYXApKSB7CiAJCQkJCQkJcF9zbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CkBAIC02NDcsMTQgKzY1MiwxNCBAQAogCQkJCQkJCXdhaXRfZm9yX2N0cmxfaXJxIChjdHJsKTsKIAkJCQkJCX0KIAkJCQkJCS8qIERvbmUgd2l0aCBleGNsdXNpdmUgaGFyZHdhcmUgYWNjZXNzICovCi0JCQkJCQltdXRleF91bmxvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJCQkJCQltdXRleF91bmxvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAkJCQkJCWJyZWFrOwogCQkJCQlkZWZhdWx0OgogCQkJCQkJd2FybigiTm90IGEgdmFsaWQgc3RhdGVcbiIpOwogCQkJCQkJcmV0dXJuOwogCQkJCQl9Ci0JCQkJCWluZm8obXNnX2J1dHRvbl9jYW5jZWwsIHBfc2xvdC0+bnVtYmVyKTsKKwkJCQkJaW5mbyhtc2dfYnV0dG9uX2NhbmNlbCwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJCQlwX3Nsb3QtPnN0YXRlID0gU1RBVElDX1NUQVRFOwogCQkJCX0KIAkJCQkvKiAqKioqKioqKioqKkJ1dHRvbiBQcmVzc2VkIChObyBhY3Rpb24gb24gMXN0IHByZXNzLi4uKSAqLwpAQCAtNjY3LDE2ICs2NzIsMTYgQEAKIAkJCQkJCQkvKiBzbG90IGlzIG9uICovCiAJCQkJCQkJZGJnKCJzbG90IGlzIG9uXG4iKTsKIAkJCQkJCQlwX3Nsb3QtPnN0YXRlID0gQkxJTktJTkdPRkZfU1RBVEU7Ci0JCQkJCQkJaW5mbyhtc2dfYnV0dG9uX29mZiwgcF9zbG90LT5udW1iZXIpOworCQkJCQkJCWluZm8obXNnX2J1dHRvbl9vZmYsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJLyogc2xvdCBpcyBvZmYgKi8KIAkJCQkJCQlkYmcoInNsb3QgaXMgb2ZmXG4iKTsKIAkJCQkJCQlwX3Nsb3QtPnN0YXRlID0gQkxJTktJTkdPTl9TVEFURTsKLQkJCQkJCQlpbmZvKG1zZ19idXR0b25fb24sIHBfc2xvdC0+bnVtYmVyKTsKKwkJCQkJCQlpbmZvKG1zZ19idXR0b25fb24sIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJCQkJCX0KIAogCQkJCQkJLyogV2FpdCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBoYXJkd2FyZSAqLwotCQkJCQkJbXV0ZXhfbG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCQkJCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKIAkJCQkJCS8qIGJsaW5rIGdyZWVuIExFRCBhbmQgdHVybiBvZmYgYW1iZXIgKi8KIAkJCQkJCWlmIChQV1JfTEVEKGN0cmwtPmN0cmxjYXApKSB7CkBAIC02OTMsNyArNjk4LDcgQEAKIAkJCQkJCX0KIAogCQkJCQkJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQkJCQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAogCQkJCQkJaW5pdF90aW1lcigmcF9zbG90LT50YXNrX2V2ZW50KTsKIAkJCQkJCXBfc2xvdC0+dGFza19ldmVudC5leHBpcmVzID0gamlmZmllcyArIDUgKiBIWjsgICAvKiA1IHNlY29uZCBkZWxheSAqLwpAQCAtNzA4LDcgKzcxMyw3IEBACiAJCQkJCWlmIChQT1dFUl9DVFJMKGN0cmwtPmN0cmxjYXApKSB7CiAJCQkJCQlkYmcoInBvd2VyIGZhdWx0XG4iKTsKIAkJCQkJCS8qIFdhaXQgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gaGFyZHdhcmUgKi8KLQkJCQkJCW11dGV4X2xvY2soJmN0cmwtPmNyaXRfc2VjdCk7CisJCQkJCQltdXRleF9sb2NrKCZjdHJsLT5jdHJsX2xvY2spOwogCiAJCQkJCQlpZiAoQVRUTl9MRUQoY3RybC0+Y3RybGNhcCkpIHsKIAkJCQkJCQlwX3Nsb3QtPmhwY19vcHMtPnNldF9hdHRlbnRpb25fc3RhdHVzKHBfc2xvdCwgMSk7CkBAIC03MjEsNyArNzI2LDcgQEAKIAkJCQkJCX0KIAogCQkJCQkJLyogRG9uZSB3aXRoIGV4Y2x1c2l2ZSBoYXJkd2FyZSBhY2Nlc3MgKi8KLQkJCQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3JpdF9zZWN0KTsKKwkJCQkJCW11dGV4X3VubG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAkJCQkJfQogCQkJCX0KIAkJCQkvKioqKioqKioqKipTVVJQUklTRSBSRU1PVkFMKioqKioqKioqKioqKioqKioqKiovCkBAIC03NjAsMTQgKzc2NSwxNiBAQAogCiAJcmMgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCWlmIChyYyB8fCAhZ2V0c3RhdHVzKSB7Ci0JCWluZm8oIiVzOiBubyBhZGFwdGVyIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKKwkJaW5mbygiJXM6IG5vIGFkYXB0ZXIgb24gc2xvdCglcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgICBzbG90X25hbWUocF9zbG90KSk7CiAJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKE1STF9TRU5TKHBfc2xvdC0+Y3RybC0+Y3RybGNhcCkpIHsJCiAJCXJjID0gcF9zbG90LT5ocGNfb3BzLT5nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJCWlmIChyYyB8fCBnZXRzdGF0dXMpIHsKLQkJCWluZm8oIiVzOiBsYXRjaCBvcGVuIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKKwkJCWluZm8oIiVzOiBsYXRjaCBvcGVuIG9uIHNsb3QoJXMpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTc3NiwxMiArNzgzLDEyIEBACiAJaWYgKFBPV0VSX0NUUkwocF9zbG90LT5jdHJsLT5jdHJsY2FwKSkgewkKIAkJcmMgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9wb3dlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKHJjIHx8IGdldHN0YXR1cykgewotCQkJaW5mbygiJXM6IGFscmVhZHkgZW5hYmxlZCBvbiBzbG90KCV4KVxuIiwgX19GVU5DVElPTl9fLCBwX3Nsb3QtPm51bWJlcik7CisJCQlpbmZvKCIlczogYWxyZWFkeSBlbmFibGVkIG9uIHNsb3QoJXMpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAKIAlwX3Nsb3QtPmhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIApAQCAtNzkwLDkgKzc5Nyw5IEBACiAJCXBfc2xvdC0+aHBjX29wcy0+Z2V0X2xhdGNoX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCX0KIAotCWlmIChwX3Nsb3QpCi0JCXVwZGF0ZV9zbG90X2luZm8ocF9zbG90KTsKKwl1cGRhdGVfc2xvdF9pbmZvKHBfc2xvdCk7CiAKKwltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTgxMSw3ICs4MTgsOCBAQAogCWlmICghSFBfU1VQUl9STShwX3Nsb3QtPmN0cmwtPmN0cmxjYXApKSB7CQogCQlyZXQgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAocmV0IHx8ICFnZXRzdGF0dXMpIHsKLQkJCWluZm8oIiVzOiBubyBhZGFwdGVyIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKKwkJCWluZm8oIiVzOiBubyBhZGFwdGVyIG9uIHNsb3QoJXMpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTgyMCw3ICs4MjgsOCBAQAogCWlmIChNUkxfU0VOUyhwX3Nsb3QtPmN0cmwtPmN0cmxjYXApKSB7CQogCQlyZXQgPSBwX3Nsb3QtPmhwY19vcHMtPmdldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKIAkJaWYgKHJldCB8fCBnZXRzdGF0dXMpIHsKLQkJCWluZm8oIiVzOiBsYXRjaCBvcGVuIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKKwkJCWluZm8oIiVzOiBsYXRjaCBvcGVuIG9uIHNsb3QoJXMpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTgyOSwxNiArODM4LDE3IEBACiAJaWYgKFBPV0VSX0NUUkwocF9zbG90LT5jdHJsLT5jdHJsY2FwKSkgewkKIAkJcmV0ID0gcF9zbG90LT5ocGNfb3BzLT5nZXRfcG93ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJCWlmIChyZXQgfHwgIWdldHN0YXR1cykgewotCQkJaW5mbygiJXM6IGFscmVhZHkgZGlzYWJsZWQgc2xvdCgleClcbiIsIF9fRlVOQ1RJT05fXywgcF9zbG90LT5udW1iZXIpOworCQkJaW5mbygiJXM6IGFscmVhZHkgZGlzYWJsZWQgc2xvdCglcylcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAotCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCiAJcmV0ID0gcmVtb3ZlX2JvYXJkKHBfc2xvdCk7CiAJdXBkYXRlX3Nsb3RfaW5mbyhwX3Nsb3QpOworCisJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCA3MDNhNjRhLi4yNWQzYWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtNzE4LDggKzcxOCw2IEBACiAJCWlmIChwaHBfY3Rsci0+aXJxKSB7CiAJCQlmcmVlX2lycShwaHBfY3Rsci0+aXJxLCBjdHJsKTsKIAkJCXBocF9jdGxyLT5pcnEgPSAwOwotCQkJaWYgKCFwY2llX21jaF9xdWlyaykgCi0JCQkJcGNpX2Rpc2FibGVfbXNpKHBocF9jdGxyLT5wY2lfZGV2KTsKIAkJfQogCX0KIAlpZiAocGhwX2N0bHItPnBjaV9kZXYpIApAQCAtMTMyMiw3ICsxMzIwLDcgQEAKIAlEQkdfRU5URVJfUk9VVElORQogCQogCXNwaW5fbG9ja19pbml0KCZsaXN0X2xvY2spOwkKLQlwaHBfY3RsciA9IChzdHJ1Y3QgcGhwX2N0bHJfc3RhdGVfcyAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGhwX2N0bHJfc3RhdGVfcyksIEdGUF9LRVJORUwpOworCXBocF9jdGxyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBocF9jdGxyX3N0YXRlX3MpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghcGhwX2N0bHIpIHsJLyogYWxsb2NhdGUgY29udHJvbGxlciBzdGF0ZSBkYXRhICovCiAJCWVycigiJXM6IEhQQyBjb250cm9sbGVyIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIVxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTE0MDIsNiArMTQwMCw4IEBACiAJCXBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwogCiAJbXV0ZXhfaW5pdCgmY3RybC0+Y3JpdF9zZWN0KTsKKwltdXRleF9pbml0KCZjdHJsLT5jdHJsX2xvY2spOworCiAJLyogc2V0dXAgd2FpdCBxdWV1ZSAqLwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0cmwtPnF1ZXVlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2locF9za2VsZXRvbi5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2locF9za2VsZXRvbi5jCmluZGV4IDJiOWUxMGUuLjUwYmNkM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2tlbGV0b24uYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3NrZWxldG9uLmMKQEAgLTMzLDggKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKIAogI2RlZmluZSBTTE9UX05BTUVfU0laRQkxMAogc3RydWN0IHNsb3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYwppbmRleCA0NjgyNWZlLi43MjM4MzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX2NvcmUuYwpAQCAtNjMsNyArNjMsNyBAQAogCWNoYXIgKnR5cGU7CiAJaW50IHJjOwogCi0Jd2hpbGUgKChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpKSB7CisJd2hpbGUgKChucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wLCAicGNpIikpKSB7CiAJCXJjID0gcnBhcGhwX2dldF9kcmNfcHJvcHMobnAsIE5VTEwsICZuYW1lLCAmdHlwZSwgTlVMTCk7CiAJCWlmIChyYyA9PSAwKQogCQkJaWYgKCFzdHJjbXAoZHJjX25hbWUsIG5hbWUpICYmICFzdHJjbXAoZHJjX3R5cGUsIHR5cGUpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9zeXNmcy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9zeXNmcy5jCmluZGV4IGRiNjliZTguLjZjNWJlM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYWRscGFyX3N5c2ZzLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSAicnBhZGxwYXIuaCIKIAogI2RlZmluZSBETFBBUl9LT0JKX05BTUUgICAgICAgImNvbnRyb2wiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHAuaAppbmRleCAzMTBiNjE4Li4yZTdhY2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwLmgKQEAgLTI4LDcgKzI4LDcgQEAKICNkZWZpbmUgX1BQQzY0UEhQX0gKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KIAogI2RlZmluZSBEUl9JTkRJQ0FUT1IgOTAwMgogI2RlZmluZSBEUl9FTlRJVFlfU0VOU0UgOTAwMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfY29yZS5jCmluZGV4IDcyODhhM2UuLjcxYTJjYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9jb3JlLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CkBAIC0zNiw3ICszNyw2IEBACiAjaW5jbHVkZSAiLi4vcGNpLmgiCQkvKiBmb3IgcGNpX2FkZF9uZXdfYnVzICovCiAJCQkJLyogYW5kIHBjaV9kb19zY2FuX2J1cyAqLwogI2luY2x1ZGUgInJwYXBocC5oIgotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCiAKIGludCBkZWJ1ZzsKIHN0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIHJwYXBocF9zZW07CkBAIC0zNTYsNyArMzU2LDcgQEAKIAlpbmZvKERSSVZFUl9ERVNDICIgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iKTsKIAlpbml0X01VVEVYKCZycGFwaHBfc2VtKTsKIAotCXdoaWxlICgoZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShkbiwgInBjaSIpKSkKKwl3aGlsZSAoKGRuID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoZG4sICJwY2kiKSkpCiAJCXJwYXBocF9hZGRfc2xvdChkbik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwppbmRleCBmMzFkODNjLi41ZDE4OGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpAQCAtMjksNyArMzAsNiBAQAogI2luY2x1ZGUgPGFzbS9zbi90eXBlcy5oPgogCiAjaW5jbHVkZSAiLi4vcGNpLmgiCi0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiU0dJIChwcmFyaXRAc2dpLmNvbSwgZGlja2llQHNnaS5jb20sIGhhYmVja0BzZ2kuY29tKSIpOwpAQCAtMjA1LDIxICsyMDUsNiBAQAogCXJldHVybiBic3NfaG90cGx1Z19zbG90OwogfQogCi1zdGF0aWMgdm9pZCBzbl9idXNfYWxsb2NfZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBwY2lfYnVzICpzdWJvcmRpbmF0ZV9idXM7Ci0Jc3RydWN0IHBjaV9kZXYgKmNoaWxkOwotCi0Jc25fcGNpX2ZpeHVwX3Nsb3QoZGV2KTsKLQotCS8qIFJlY3Vyc2l2ZWx5IHNldHMgdXAgdGhlIHNuX2lycV9pbmZvIHN0cnVjdHMgKi8KLQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgewotCQlzdWJvcmRpbmF0ZV9idXMgPSBkZXYtPnN1Ym9yZGluYXRlOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmc3Vib3JkaW5hdGVfYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKLQkJCXNuX2J1c19hbGxvY19kYXRhKGNoaWxkKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHNuX2J1c19mcmVlX2RhdGEoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqc3Vib3JkaW5hdGVfYnVzOwpAQCAtMzM3LDYgKzMyMiwxMSBAQAogCXJldHVybiByYzsKIH0KIAorLyoKKyAqIFBvd2VyIHVwIGFuZCBjb25maWd1cmUgdGhlIHNsb3QgdmlhIGEgU0FMIGNhbGwgdG8gUFJPTS4KKyAqIFNjYW4gc2xvdCAoYW5kIGFueSBjaGlsZHJlbiksIGRvIGFueSBwbGF0Zm9ybSBzcGVjaWZpYyBmaXh1cCwKKyAqIGFuZCBmaW5kIGRldmljZSBkcml2ZXIuCisgKi8KIHN0YXRpYyBpbnQgZW5hYmxlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CkBAIC0zNDUsNiArMzM1LDcgQEAKIAlpbnQgZnVuYywgbnVtX2Z1bmNzOwogCWludCBuZXdfcHBiID0gMDsKIAlpbnQgcmM7CisJdm9pZCBwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKik7CiAKIAkvKiBTZXJpYWxpemUgdGhlIExpbnV4IFBDSSBpbmZyYXN0cnVjdHVyZSAqLwogCW11dGV4X2xvY2soJnNuX2hvdHBsdWdfbXV0ZXgpOwpAQCAtMzY3LDkgKzM1OCw2IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKHBjaV9kb21haW5fbnIoc2xvdC0+cGNpX2J1cyksCi0JCQkJc2xvdC0+cGNpX2J1cy0+bnVtYmVyLAotCQkJCXNsb3QtPnBjaV9idXMpOwogCS8qCiAJICogTWFwIFNOIHJlc291cmNlcyBmb3IgYWxsIGZ1bmN0aW9ucyBvbiB0aGUgY2FyZAogCSAqIHRvIHRoZSBMaW51eCBQQ0kgaW50ZXJmYWNlIGFuZCB0ZWxsIHRoZSBkcml2ZXJzCkBAIC0zODAsNiArMzY4LDEzIEBACiAJCQkJICAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0gKyAxLAogCQkJCQkgICAgIFBDSV9GVU5DKGZ1bmMpKSk7CiAJCWlmIChkZXYpIHsKKwkJCS8qIE5lZWQgdG8gZG8gc2xvdCBmaXh1cCBvbiBQUEIgYmVmb3JlIGZpeHVwIG9mIGNoaWxkcmVuCisJCQkgKiAoUFBCJ3MgcGNpZGV2X2luZm8gbmVlZHMgdG8gYmUgaW4gcGNpZGV2X2luZm8gbGlzdAorCQkJICogYmVmb3JlIGNoaWxkJ3MgU05fUENJREVWX0lORk8oKSBjYWxsIHRvIHNldHVwCisJCQkgKiBwZGlfaG9zdF9wY2lkZXZfaW5mbykuCisJCQkgKi8KKwkJCXBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhkZXYpOworCQkJc25fcGNpX2ZpeHVwX3Nsb3QoZGV2KTsKIAkJCWlmIChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKIAkJCQl1bnNpZ25lZCBjaGFyIHNlY19idXM7CiAJCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfU0VDT05EQVJZX0JVUywKQEAgLTM4NywxMiArMzgyLDggQEAKIAkJCQluZXdfYnVzID0gcGNpX2FkZF9uZXdfYnVzKGRldi0+YnVzLCBkZXYsCiAJCQkJCQkJICBzZWNfYnVzKTsKIAkJCQlwY2lfc2Nhbl9jaGlsZF9idXMobmV3X2J1cyk7Ci0JCQkJc25fcGNpX2NvbnRyb2xsZXJfZml4dXAocGNpX2RvbWFpbl9ucihuZXdfYnVzKSwKLQkJCQkJCQluZXdfYnVzLT5udW1iZXIsCi0JCQkJCQkJbmV3X2J1cyk7CiAJCQkJbmV3X3BwYiA9IDE7CiAJCQl9Ci0JCQlzbl9idXNfYWxsb2NfZGF0YShkZXYpOwogCQkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oCmluZGV4IGM3MTAzYWMuLjUwNzU3NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAuaApAQCAtMzEsMTIgKzMxLDExIEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBzaWduYWxfcGVuZGluZygpLCBzdHJ1Y3QgdGltZXJfbGlzdCAqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKLSNpbmNsdWRlICJwY2lfaG90cGx1Zy5oIgotCiAjaWYgIWRlZmluZWQoTU9EVUxFKQogCSNkZWZpbmUgTVlfTkFNRQkic2hwY2hwIgogI2Vsc2UKQEAgLTcxLDcgKzcwLDcgQEAKIAlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlzbG90X2xpc3Q7CiAJY2hhciBuYW1lW1NMT1RfTkFNRV9TSVpFXTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsJLyogd29yayBmb3IgYnV0dG9uIGV2ZW50ICovCisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwkvKiB3b3JrIGZvciBidXR0b24gZXZlbnQgKi8KIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIH07CiAKQEAgLTEwMyw3ICsxMDIsNiBAQAogCXUzMiBjYXBfb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOwogCXVuc2lnbmVkIGxvbmcgbW1pb19zaXplOwotCXZvbGF0aWxlIGludCBjbWRfYnVzeTsKIH07CiAKIApAQCAtMTg5LDcgKzE4Nyw3IEBACiBleHRlcm4gaW50CXNocGNocF91bmNvbmZpZ3VyZV9kZXZpY2Uoc3RydWN0IHNsb3QgKnBfc2xvdCk7CiBleHRlcm4gdm9pZAlzaHBjaHBfcmVtb3ZlX2N0cmxfZmlsZXMoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOwogZXh0ZXJuIHZvaWQJY2xlYW51cF9zbG90cyhzdHJ1Y3QgY29udHJvbGxlciAqY3RybCk7Ci1leHRlcm4gdm9pZAlxdWV1ZV9wdXNoYnV0dG9uX3dvcmsodm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZAlxdWV1ZV9wdXNoYnV0dG9uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogCiAjaWZkZWYgQ09ORklHX0FDUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYwppbmRleCAyMzVjMThhLi40ZWFjODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY29yZS5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAkJCWdvdG8gZXJyb3JfaW5mbzsKIAogCQlzbG90LT5udW1iZXIgPSBzdW47Ci0JCUlOSVRfV09SSygmc2xvdC0+d29yaywgcXVldWVfcHVzaGJ1dHRvbl93b3JrLCBzbG90KTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJnNsb3QtPndvcmssIHF1ZXVlX3B1c2hidXR0b25fd29yayk7CiAKIAkJLyogcmVnaXN0ZXIgdGhpcyBzbG90IHdpdGggdGhlIGhvdHBsdWcgcGNpIGNvcmUgKi8KIAkJaG90cGx1Z19zbG90LT5wcml2YXRlID0gc2xvdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2N0cmwuYwppbmRleCBjMzk5MDFkLi4xNThhYzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY3RybC5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSAiLi4vcGNpLmgiCiAjaW5jbHVkZSAic2hwY2hwLmgiCiAKLXN0YXRpYyB2b2lkIGludGVycnVwdF9ldmVudF9oYW5kbGVyKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgaW50ZXJydXB0X2V2ZW50X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyBpbnQgc2hwY2hwX2VuYWJsZV9zbG90KHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogc3RhdGljIGludCBzaHBjaHBfZGlzYWJsZV9zbG90KHN0cnVjdCBzbG90ICpwX3Nsb3QpOwogCkBAIC01MCw3ICs1MCw3IEBACiAKIAlpbmZvLT5ldmVudF90eXBlID0gZXZlbnRfdHlwZTsKIAlpbmZvLT5wX3Nsb3QgPSBwX3Nsb3Q7Ci0JSU5JVF9XT1JLKCZpbmZvLT53b3JrLCBpbnRlcnJ1cHRfZXZlbnRfaGFuZGxlciwgaW5mbyk7CisJSU5JVF9XT1JLKCZpbmZvLT53b3JrLCBpbnRlcnJ1cHRfZXZlbnRfaGFuZGxlcik7CiAKIAlzY2hlZHVsZV93b3JrKCZpbmZvLT53b3JrKTsKIApAQCAtNDA4LDkgKzQwOCwxMCBAQAogICogSGFuZGxlcyBhbGwgcGVuZGluZyBldmVudHMgYW5kIGV4aXRzLgogICoKICAqLwotc3RhdGljIHZvaWQgc2hwY2hwX3B1c2hidXR0b25fdGhyZWFkKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzaHBjaHBfcHVzaGJ1dHRvbl90aHJlYWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBwdXNoYnV0dG9uX3dvcmtfaW5mbyAqaW5mbyA9IGRhdGE7CisJc3RydWN0IHB1c2hidXR0b25fd29ya19pbmZvICppbmZvID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwdXNoYnV0dG9uX3dvcmtfaW5mbywgd29yayk7CiAJc3RydWN0IHNsb3QgKnBfc2xvdCA9IGluZm8tPnBfc2xvdDsKIAogCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CkBAIC00MzYsOSArNDM3LDkgQEAKIAlrZnJlZShpbmZvKTsKIH0KIAotdm9pZCBxdWV1ZV9wdXNoYnV0dG9uX3dvcmsodm9pZCAqZGF0YSkKK3ZvaWQgcXVldWVfcHVzaGJ1dHRvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgc2xvdCAqcF9zbG90ID0gZGF0YTsKKwlzdHJ1Y3Qgc2xvdCAqcF9zbG90ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbG90LCB3b3JrLndvcmspOwogCXN0cnVjdCBwdXNoYnV0dG9uX3dvcmtfaW5mbyAqaW5mbzsKIAogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtNDQ3LDcgKzQ0OCw3IEBACiAJCXJldHVybjsKIAl9CiAJaW5mby0+cF9zbG90ID0gcF9zbG90OwotCUlOSVRfV09SSygmaW5mby0+d29yaywgc2hwY2hwX3B1c2hidXR0b25fdGhyZWFkLCBpbmZvKTsKKwlJTklUX1dPUksoJmluZm8tPndvcmssIHNocGNocF9wdXNoYnV0dG9uX3RocmVhZCk7CiAKIAltdXRleF9sb2NrKCZwX3Nsb3QtPmxvY2spOwogCXN3aXRjaCAocF9zbG90LT5zdGF0ZSkgewpAQCAtNTQxLDkgKzU0Miw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpbnRlcnJ1cHRfZXZlbnRfaGFuZGxlcih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaW50ZXJydXB0X2V2ZW50X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBldmVudF9pbmZvICppbmZvID0gZGF0YTsKKwlzdHJ1Y3QgZXZlbnRfaW5mbyAqaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXZlbnRfaW5mbywgd29yayk7CiAJc3RydWN0IHNsb3QgKnBfc2xvdCA9IGluZm8tPnBfc2xvdDsKIAogCW11dGV4X2xvY2soJnBfc2xvdC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9ocGMuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2hwYy5jCmluZGV4IDRkOGFlZTEuLjgzYTUyMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2hwYy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2hwYy5jCkBAIC0zMDIsMjEgKzMwMiw1MSBAQAogCWFkZF90aW1lcigmcGhwX2N0bHItPmludF9wb2xsX3RpbWVyKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNfY3RybF9idXN5KHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQoreworCXUxNiBjbWRfc3RhdHVzID0gc2hwY19yZWFkdyhjdHJsLCBDTURfU1RBVFVTKTsKKwlyZXR1cm4gY21kX3N0YXR1cyAmIDB4MTsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiBTSFBDIGZpbmlzaGVzIGV4ZWN1dGluZyBhIGNvbW1hbmQgd2l0aGluIDEgc2VjLAorICogb3RoZXJ3aXNlIHJldHVybnMgMC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2hwY19wb2xsX2N0cmxfYnVzeShzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKK3sKKwlpbnQgaTsKKworCWlmICghaXNfY3RybF9idXN5KGN0cmwpKQorCQlyZXR1cm4gMTsKKworCS8qIENoZWNrIGV2ZXJ5IDAuMSBzZWMgZm9yIGEgdG90YWwgb2YgMSBzZWMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQltc2xlZXAoMTAwKTsKKwkJaWYgKCFpc19jdHJsX2J1c3koY3RybCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc2hwY193YWl0X2NtZChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKIAlpbnQgcmV0dmFsID0gMDsKLQl1bnNpZ25lZCBpbnQgdGltZW91dF9tc2VjID0gc2hwY2hwX3BvbGxfbW9kZSA/IDIwMDAgOiAxMDAwOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tc2VjKTsKLQlpbnQgcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjdHJsLT5xdWV1ZSwKLQkJCQkJCSAgIWN0cmwtPmNtZF9idXN5LCB0aW1lb3V0KTsKLQlpZiAoIXJjKSB7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwlpbnQgcmM7CisKKwlpZiAoc2hwY2hwX3BvbGxfbW9kZSkKKwkJcmMgPSBzaHBjX3BvbGxfY3RybF9idXN5KGN0cmwpOworCWVsc2UKKwkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjdHJsLT5xdWV1ZSwKKwkJCQkJCSFpc19jdHJsX2J1c3koY3RybCksIHRpbWVvdXQpOworCWlmICghcmMgJiYgaXNfY3RybF9idXN5KGN0cmwpKSB7CiAJCXJldHZhbCA9IC1FSU87Ci0JCWVycigiQ29tbWFuZCBub3QgY29tcGxldGVkIGluICVkIG1zZWNcbiIsIHRpbWVvdXRfbXNlYyk7CisJCWVycigiQ29tbWFuZCBub3QgY29tcGxldGVkIGluIDEwMDAgbXNlY1xuIik7CiAJfSBlbHNlIGlmIChyYyA8IDApIHsKIAkJcmV0dmFsID0gLUVJTlRSOwogCQlpbmZvKCJDb21tYW5kIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbFxuIik7CiAJfQotCWN0cmwtPmNtZF9idXN5ID0gMDsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC0zMjcsMjYgKzM1NywxNSBAQAogCXUxNiBjbWRfc3RhdHVzOwogCWludCByZXR2YWwgPSAwOwogCXUxNiB0ZW1wX3dvcmQ7Ci0JaW50IGk7CiAKIAlEQkdfRU5URVJfUk9VVElORSAKIAogCW11dGV4X2xvY2soJnNsb3QtPmN0cmwtPmNtZF9sb2NrKTsKIAotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWNtZF9zdGF0dXMgPSBzaHBjX3JlYWR3KGN0cmwsIENNRF9TVEFUVVMpOwotCQkKLQkJaWYgKCEoY21kX3N0YXR1cyAmIDB4MSkpCi0JCQlicmVhazsKLQkJLyogIENoZWNrIGV2ZXJ5IDAuMSBzZWMgZm9yIGEgdG90YWwgb2YgMSBzZWMqLwotCQltc2xlZXAoMTAwKTsKLQl9Ci0KLQljbWRfc3RhdHVzID0gc2hwY19yZWFkdyhjdHJsLCBDTURfU1RBVFVTKTsKLQkKLQlpZiAoY21kX3N0YXR1cyAmIDB4MSkgeyAKKwlpZiAoIXNocGNfcG9sbF9jdHJsX2J1c3koY3RybCkpIHsKIAkJLyogQWZ0ZXIgMSBzZWMgYW5kIGFuZCB0aGUgY29udHJvbGxlciBpcyBzdGlsbCBidXN5ICovCi0JCWVycigiJXMgOiBDb250cm9sbGVyIGlzIHN0aWxsIGJ1c3kgYWZ0ZXIgMSBzZWMuXG4iLCBfX0ZVTkNUSU9OX18pOworCQllcnIoIiVzIDogQ29udHJvbGxlciBpcyBzdGlsbCBidXN5IGFmdGVyIDEgc2VjLlxuIiwKKwkJICAgIF9fRlVOQ1RJT05fXyk7CiAJCXJldHZhbCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzU4LDcgKzM3Nyw2IEBACiAJLyogVG8gbWFrZSBzdXJlIHRoZSBDb250cm9sbGVyIEJ1c3kgYml0IGlzIDAgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZQogCSAqIGNvbW1hbmQuIAogCSAqLwotCXNsb3QtPmN0cmwtPmNtZF9idXN5ID0gMTsKIAlzaHBjX3dyaXRldyhjdHJsLCBDTUQsIHRlbXBfd29yZCk7CiAKIAkvKgpAQCAtOTA4LDcgKzkyNiw2IEBACiAJCXNlcnJfaW50ICY9IH5TRVJSX0lOVFJfUlNWRFpfTUFTSzsKIAkJc2hwY193cml0ZWwoY3RybCwgU0VSUl9JTlRSX0VOQUJMRSwgc2Vycl9pbnQpOwogCi0JCWN0cmwtPmNtZF9idXN5ID0gMDsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHJsLT5xdWV1ZSk7CiAJfQogCkBAIC0xMTAxLDcgKzExMTgsNyBAQAogewogCXN0cnVjdCBwaHBfY3Rscl9zdGF0ZV9zICpwaHBfY3RsciwgKnA7CiAJdm9pZCAqaW5zdGFuY2VfaWQgPSBjdHJsOwotCWludCByYywgbnVtX3Nsb3RzID0gMDsKKwlpbnQgcmMgPSAtMSwgbnVtX3Nsb3RzID0gMDsKIAl1OCBocF9zbG90OwogCXUzMiBzaHBjX2Jhc2Vfb2Zmc2V0OwogCXUzMiB0ZW1wZHdvcmQsIHNsb3RfcmVnLCBzbG90X2NvbmZpZzsKQEAgLTExNjcsMTEgKzExODQsMTUgQEAKIAlpbmZvKCJIUEMgdmVuZG9yX2lkICV4IGRldmljZV9pZCAleCBzc192aWQgJXggc3NfZGlkICV4XG4iLCBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGRldi0+c3Vic3lzdGVtX3ZlbmRvciwgCiAJCXBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwogCQotCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykgeworCQllcnIoIiVzOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOworCX0KIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGN0cmwtPm1taW9fYmFzZSwgY3RybC0+bW1pb19zaXplLCBNWV9OQU1FKSkgewogCQllcnIoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmMgPSAtMTsKIAkJZ290byBhYm9ydF9mcmVlX2N0bHI7CiAJfQogCkBAIC0xMTgwLDYgKzEyMDEsNyBAQAogCQllcnIoIiVzOiBjYW5ub3QgcmVtYXAgTU1JTyByZWdpb24gJWx4IEAgJWx4XG4iLCBfX0ZVTkNUSU9OX18sCiAJCSAgICBjdHJsLT5tbWlvX3NpemUsIGN0cmwtPm1taW9fYmFzZSk7CiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihjdHJsLT5tbWlvX2Jhc2UsIGN0cmwtPm1taW9fc2l6ZSk7CisJCXJjID0gLTE7CiAJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOwogCX0KIAlkYmcoIiVzOiBwaHBfY3Rsci0+Y3JlZyAlcFxuIiwgX19GVU5DVElPTl9fLCBwaHBfY3Rsci0+Y3JlZyk7CkBAIC0xMjgyLDggKzEzMDQsMTAgQEAKIAkgKi8KIAlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJnNocGNocF9udW1fY29udHJvbGxlcnMpID09IDEpIHsKIAkJc2hwY2hwX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInNocGNocGQiKTsKLQkJaWYgKCFzaHBjaHBfd3EpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKCFzaHBjaHBfd3EpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gYWJvcnRfZnJlZV9jdGxyOworCQl9CiAJfQogCiAJLyoKQEAgLTEzMTMsOCArMTMzNywxMCBAQAogCiAJLyogV2UgZW5kIHVwIGhlcmUgZm9yIHRoZSBtYW55IHBvc3NpYmxlIHdheXMgdG8gZmFpbCB0aGlzIEFQSS4gICovCiBhYm9ydF9mcmVlX2N0bHI6CisJaWYgKHBocF9jdGxyLT5jcmVnKQorCQlpb3VubWFwKHBocF9jdGxyLT5jcmVnKTsKIAlrZnJlZShwaHBfY3Rscik7CiBhYm9ydDoKIAlEQkdfTEVBVkVfUk9VVElORQotCXJldHVybiAtMTsKKwlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9odGlycS5jIGIvZHJpdmVycy9wY2kvaHRpcnEuYwppbmRleCAwZTI3ZjI0Li4wYThkMWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9odGlycS5jCisrKyBiL2RyaXZlcnMvcGNpL2h0aXJxLmMKQEAgLTI1LDk3ICsyNSw3MiBAQAogCiBzdHJ1Y3QgaHRfaXJxX2NmZyB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKKwkgLyogVXBkYXRlIGNhbGxiYWNrIHVzZWQgdG8gY29wZSB3aXRoIGJ1Z2d5IGhhcmR3YXJlICovCisJaHRfaXJxX3VwZGF0ZV90ICp1cGRhdGU7CiAJdW5zaWduZWQgcG9zOwogCXVuc2lnbmVkIGlkeDsKKwlzdHJ1Y3QgaHRfaXJxX21zZyBtc2c7CiB9OwogCi12b2lkIHdyaXRlX2h0X2lycV9sb3codW5zaWduZWQgaW50IGlycSwgdTMyIGRhdGEpCisKK3ZvaWQgd3JpdGVfaHRfaXJxX21zZyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaHRfaXJxX21zZyAqbXNnKQogewogCXN0cnVjdCBodF9pcnFfY2ZnICpjZmcgPSBnZXRfaXJxX2RhdGEoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZodF9pcnFfbG9jaywgZmxhZ3MpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShjZmctPmRldiwgY2ZnLT5wb3MgKyAyLCBjZmctPmlkeCk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjZmctPmRldiwgY2ZnLT5wb3MgKyA0LCBkYXRhKTsKKwlpZiAoY2ZnLT5tc2cuYWRkcmVzc19sbyAhPSBtc2ctPmFkZHJlc3NfbG8pIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNmZy0+ZGV2LCBjZmctPnBvcyArIDIsIGNmZy0+aWR4KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjZmctPmRldiwgY2ZnLT5wb3MgKyA0LCBtc2ctPmFkZHJlc3NfbG8pOworCX0KKwlpZiAoY2ZnLT5tc2cuYWRkcmVzc19oaSAhPSBtc2ctPmFkZHJlc3NfaGkpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNmZy0+ZGV2LCBjZmctPnBvcyArIDIsIGNmZy0+aWR4ICsgMSk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoY2ZnLT5kZXYsIGNmZy0+cG9zICsgNCwgbXNnLT5hZGRyZXNzX2hpKTsKKwl9CisJaWYgKGNmZy0+dXBkYXRlKQorCQljZmctPnVwZGF0ZShjZmctPmRldiwgaXJxLCBtc2cpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh0X2lycV9sb2NrLCBmbGFncyk7CisJY2ZnLT5tc2cgPSAqbXNnOwogfQogCi12b2lkIHdyaXRlX2h0X2lycV9oaWdoKHVuc2lnbmVkIGludCBpcnEsIHUzMiBkYXRhKQordm9pZCBmZXRjaF9odF9pcnFfbXNnKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBodF9pcnFfbXNnICptc2cpCiB7CiAJc3RydWN0IGh0X2lycV9jZmcgKmNmZyA9IGdldF9pcnFfZGF0YShpcnEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh0X2lycV9sb2NrLCBmbGFncyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNmZy0+ZGV2LCBjZmctPnBvcyArIDIsIGNmZy0+aWR4ICsgMSk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjZmctPmRldiwgY2ZnLT5wb3MgKyA0LCBkYXRhKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodF9pcnFfbG9jaywgZmxhZ3MpOwotfQotCi11MzIgcmVhZF9odF9pcnFfbG93KHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGh0X2lycV9jZmcgKmNmZyA9IGdldF9pcnFfZGF0YShpcnEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGRhdGE7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh0X2lycV9sb2NrLCBmbGFncyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNmZy0+ZGV2LCBjZmctPnBvcyArIDIsIGNmZy0+aWR4KTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY2ZnLT5kZXYsIGNmZy0+cG9zICsgNCwgJmRhdGEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh0X2lycV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXUzMiByZWFkX2h0X2lycV9oaWdoKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGh0X2lycV9jZmcgKmNmZyA9IGdldF9pcnFfZGF0YShpcnEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGRhdGE7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh0X2lycV9sb2NrLCBmbGFncyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNmZy0+ZGV2LCBjZmctPnBvcyArIDIsIGNmZy0+aWR4ICsgMSk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGNmZy0+ZGV2LCBjZmctPnBvcyArIDQsICZkYXRhKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodF9pcnFfbG9jaywgZmxhZ3MpOwotCXJldHVybiBkYXRhOworCSptc2cgPSBjZmctPm1zZzsKIH0KIAogdm9pZCBtYXNrX2h0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBodF9pcnFfY2ZnICpjZmc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgZGF0YTsKKwlzdHJ1Y3QgaHRfaXJxX21zZyBtc2c7CiAKIAljZmcgPSBnZXRfaXJxX2RhdGEoaXJxKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZodF9pcnFfbG9jaywgZmxhZ3MpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShjZmctPmRldiwgY2ZnLT5wb3MgKyAyLCBjZmctPmlkeCk7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGNmZy0+ZGV2LCBjZmctPnBvcyArIDQsICZkYXRhKTsKLQlkYXRhIHw9IDE7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjZmctPmRldiwgY2ZnLT5wb3MgKyA0LCBkYXRhKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodF9pcnFfbG9jaywgZmxhZ3MpOworCW1zZyA9IGNmZy0+bXNnOworCW1zZy5hZGRyZXNzX2xvIHw9IDE7CisJd3JpdGVfaHRfaXJxX21zZyhpcnEsICZtc2cpOwogfQogCiB2b2lkIHVubWFza19odF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaHRfaXJxX2NmZyAqY2ZnOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGRhdGE7CisJc3RydWN0IGh0X2lycV9tc2cgbXNnOwogCiAJY2ZnID0gZ2V0X2lycV9kYXRhKGlycSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHRfaXJxX2xvY2ssIGZsYWdzKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2ZnLT5kZXYsIGNmZy0+cG9zICsgMiwgY2ZnLT5pZHgpOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChjZmctPmRldiwgY2ZnLT5wb3MgKyA0LCAmZGF0YSk7Ci0JZGF0YSAmPSB+MTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGNmZy0+ZGV2LCBjZmctPnBvcyArIDQsIGRhdGEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh0X2lycV9sb2NrLCBmbGFncyk7CisJbXNnID0gY2ZnLT5tc2c7CisJbXNnLmFkZHJlc3NfbG8gJj0gfjE7CisJd3JpdGVfaHRfaXJxX21zZyhpcnEsICZtc2cpOwogfQogCiAvKioKLSAqIGh0X2NyZWF0ZV9pcnEgLSBjcmVhdGUgYW4gaXJxIGFuZCBhdHRhY2ggaXQgdG8gYSBkZXZpY2UuCisgKiBfX2h0X2NyZWF0ZV9pcnEgLSBjcmVhdGUgYW4gaXJxIGFuZCBhdHRhY2ggaXQgdG8gYSBkZXZpY2UuCiAgKiBAZGV2OiBUaGUgaHlwZXJ0cmFuc3BvcnQgZGV2aWNlIHRvIGZpbmQgdGhlIGlycSBjYXBhYmlsaXR5IG9uLgogICogQGlkeDogV2hpY2ggb2YgdGhlIHBvc3NpYmxlIGlycXMgdG8gYXR0YWNoIHRvLgotICoKLSAqIGh0X2NyZWF0ZV9pcnEgaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGZvciBhbGwgaHlwZXJ0cmFuc3BvcnQgZGV2aWNlcwotICogdGhhdCBnZW5lcmF0ZSBpcnFzLgorICogQHVwZGF0ZTogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gY2hhbmdpbmcgdGhlIGh0aXJxIG1lc3NhZ2UKICAqCiAgKiBUaGUgaXJxIG51bWJlciBvZiB0aGUgbmV3IGlycSBvciBhIG5lZ2F0aXZlIGVycm9yIHZhbHVlIGlzIHJldHVybmVkLgogICovCi1pbnQgaHRfY3JlYXRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaWR4KQoraW50IF9faHRfY3JlYXRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaWR4LCBodF9pcnFfdXBkYXRlX3QgKnVwZGF0ZSkKIHsKIAlzdHJ1Y3QgaHRfaXJxX2NmZyAqY2ZnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNTAsOCArMTI1LDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY2ZnLT5kZXYgPSBkZXY7CisJY2ZnLT51cGRhdGUgPSB1cGRhdGU7CiAJY2ZnLT5wb3MgPSBwb3M7CiAJY2ZnLT5pZHggPSAweDEwICsgKGlkeCAqIDIpOworCS8qIEluaXRpYWxpemUgbXNnIHRvIGEgdmFsdWUgdGhhdCB3aWxsIG5ldmVyIG1hdGNoIHRoZSBmaXJzdCB3cml0ZS4gKi8KKwljZmctPm1zZy5hZGRyZXNzX2xvID0gMHhmZmZmZmZmZjsKKwljZmctPm1zZy5hZGRyZXNzX2hpID0gMHhmZmZmZmZmZjsKIAogCWlycSA9IGNyZWF0ZV9pcnEoKTsKIAlpZiAoaXJxIDwgMCkgewpAQCAtMTY5LDYgKzE0OCwyMSBAQAogfQogCiAvKioKKyAqIGh0X2NyZWF0ZV9pcnEgLSBjcmVhdGUgYW4gaXJxIGFuZCBhdHRhY2ggaXQgdG8gYSBkZXZpY2UuCisgKiBAZGV2OiBUaGUgaHlwZXJ0cmFuc3BvcnQgZGV2aWNlIHRvIGZpbmQgdGhlIGlycSBjYXBhYmlsaXR5IG9uLgorICogQGlkeDogV2hpY2ggb2YgdGhlIHBvc3NpYmxlIGlycXMgdG8gYXR0YWNoIHRvLgorICoKKyAqIGh0X2NyZWF0ZV9pcnEgbmVlZHMgdG8gYmUgY2FsbGVkIGZvciBhbGwgaHlwZXJ0cmFuc3BvcnQgZGV2aWNlcworICogdGhhdCBnZW5lcmF0ZSBpcnFzLgorICoKKyAqIFRoZSBpcnEgbnVtYmVyIG9mIHRoZSBuZXcgaXJxIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUgaXMgcmV0dXJuZWQuCisgKi8KK2ludCBodF9jcmVhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpZHgpCit7CisJcmV0dXJuIF9faHRfY3JlYXRlX2lycShkZXYsIGlkeCwgTlVMTCk7Cit9CisKKy8qKgogICogaHRfZGVzdHJveV9pcnEgLSBkZXN0cm95IGFuIGlycSBjcmVhdGVkIHdpdGggaHRfY3JlYXRlX2lycQogICoKICAqIFRoaXMgcmV2ZXJzZXMgaHRfY3JlYXRlX2lycSByZW1vdmluZyB0aGUgc3BlY2lmaWVkIGlycSBmcm9tCkBAIC0xODYsNSArMTgwLDYgQEAKIAlrZnJlZShjZmcpOwogfQogCitFWFBPUlRfU1lNQk9MKF9faHRfY3JlYXRlX2lycSk7CiBFWFBPUlRfU1lNQk9MKGh0X2NyZWF0ZV9pcnEpOwogRVhQT1JUX1NZTUJPTChodF9kZXN0cm95X2lycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuYyBiL2RyaXZlcnMvcGNpL21zaS5jCmluZGV4IGY5ZmRjNTQuLmVkM2Y3ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC0yNiw3ICsyNiw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobXNpX2xvY2spOwogc3RhdGljIHN0cnVjdCBtc2lfZGVzYyogbXNpX2Rlc2NbTlJfSVJRU10gPSB7IFswIC4uLiBOUl9JUlFTLTFdID0gTlVMTCB9Owotc3RhdGljIGttZW1fY2FjaGVfdCogbXNpX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSogbXNpX2NhY2hlcDsKIAogc3RhdGljIGludCBwY2lfbXNpX2VuYWJsZSA9IDE7CiAKQEAgLTI1NSwxMCArMjU1LDggQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbXNpX2NvbnRyb2xfcmVnKHBvcyksIGNvbnRyb2wpOwogCQlkZXYtPm1zaXhfZW5hYmxlZCA9IDE7CiAJfQotICAgIAlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKSkgewotCQkvKiBQQ0kgRXhwcmVzcyBFbmRwb2ludCBkZXZpY2UgZGV0ZWN0ZWQgKi8KLQkJcGNpX2ludHgoZGV2LCAwKTsgIC8qIGRpc2FibGUgaW50eCAqLwotCX0KKworCXBjaV9pbnR4KGRldiwgMCk7ICAvKiBkaXNhYmxlIGludHggKi8KIH0KIAogdm9pZCBkaXNhYmxlX21zaV9tb2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwb3MsIGludCB0eXBlKQpAQCAtMjc2LDEwICsyNzQsOCBAQAogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBtc2lfY29udHJvbF9yZWcocG9zKSwgY29udHJvbCk7CiAJCWRldi0+bXNpeF9lbmFibGVkID0gMDsKIAl9Ci0gICAgCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApKSB7Ci0JCS8qIFBDSSBFeHByZXNzIEVuZHBvaW50IGRldmljZSBkZXRlY3RlZCAqLwotCQlwY2lfaW50eChkZXYsIDEpOyAgLyogZW5hYmxlIGludHggKi8KLQl9CisKKwlwY2lfaW50eChkZXYsIDEpOyAgLyogZW5hYmxlIGludHggKi8KIH0KIAogc3RhdGljIGludCBtc2lfbG9va3VwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgdHlwZSkKQEAgLTYyNywyMiArNjIzLDI0IEBACiAgKiBwY2lfbXNpX3N1cHBvcnRlZCAtIGNoZWNrIHdoZXRoZXIgTVNJIG1heSBiZSBlbmFibGVkIG9uIGRldmljZQogICogQGRldjogcG9pbnRlciB0byB0aGUgcGNpX2RldiBkYXRhIHN0cnVjdHVyZSBvZiBNU0kgZGV2aWNlIGZ1bmN0aW9uCiAgKgotICogTVNJIG11c3QgYmUgZ2xvYmFsbHkgZW5hYmxlZCBhbmQgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYW5kIGl0cyByb290Ci0gKiBidXMuIEJ1dCwgdGhlIHJvb3QgYnVzIGlzIG5vdCBlYXN5IHRvIGZpbmQgc2luY2Ugc29tZSBhcmNoaXRlY3R1cmVzCi0gKiBoYXZlIHZpcnR1YWwgYnVzc2VzIG9uIHRvcCBvZiB0aGUgUENJIGhpZXJhcmNoeSAoZm9yIGluc3RhbmNlIHRoZQotICogaHlwZXJ0cmFuc3BvcnQgYnVzKSwgd2hpbGUgdGhlIGFjdHVhbCBidXMgd2hlcmUgTVNJIG11c3QgYmUgc3VwcG9ydGVkCi0gKiBpcyBiZWxvdy4gU28gd2UgdGVzdCB0aGUgTVNJIGZsYWcgb24gYWxsIHBhcmVudCBidXNzZXMgYW5kIGFzc3VtZQotICogdGhhdCBubyBxdWlyayB3aWxsIGV2ZXIgc2V0IHRoZSBOT19NU0kgZmxhZyBvbiBhIG5vbi1yb290IGJ1cy4KKyAqIExvb2sgYXQgZ2xvYmFsIGZsYWdzLCB0aGUgZGV2aWNlIGl0c2VsZiwgYW5kIGl0cyBwYXJlbnQgYnVzc2VzCisgKiB0byByZXR1cm4gMCBpZiBNU0kgYXJlIHN1cHBvcnRlZCBmb3IgdGhlIGRldmljZS4KICAqKi8KIHN0YXRpYwogaW50IHBjaV9tc2lfc3VwcG9ydGVkKHN0cnVjdCBwY2lfZGV2ICogZGV2KQogewogCXN0cnVjdCBwY2lfYnVzICpidXM7CiAKKwkvKiBNU0kgbXVzdCBiZSBnbG9iYWxseSBlbmFibGVkIGFuZCBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSAqLwogCWlmICghcGNpX21zaV9lbmFibGUgfHwgIWRldiB8fCBkZXYtPm5vX21zaSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBjaGVjayBNU0kgZmxhZ3Mgb2YgYWxsIHBhcmVudCBidXNzZXMgKi8KKwkvKiBBbnkgYnJpZGdlIHdoaWNoIGRvZXMgTk9UIHJvdXRlIE1TSSB0cmFuc2FjdGlvbnMgZnJvbSBpdCdzCisJICogc2Vjb25kYXJ5IGJ1cyB0byBpdCdzIHByaW1hcnkgYnVzIG11c3Qgc2V0IE5PX01TSSBmbGFnIG9uCisJICogdGhlIHNlY29uZGFyeSBwY2lfYnVzLgorCSAqIFdlIGV4cGVjdCBvbmx5IGFyY2gtc3BlY2lmaWMgUENJIGhvc3QgYnVzIGNvbnRyb2xsZXIgZHJpdmVyCisJICogb3IgcXVpcmtzIGZvciBzcGVjaWZpYyBQQ0kgYnJpZGdlcyB0byBiZSBzZXR0aW5nIE5PX01TSS4KKwkgKi8KIAlmb3IgKGJ1cyA9IGRldi0+YnVzOyBidXM7IGJ1cyA9IGJ1cy0+cGFyZW50KQogCQlpZiAoYnVzLT5idXNfZmxhZ3MgJiBQQ0lfQlVTX0ZMQUdTX05PX01TSSkKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLmggYi9kcml2ZXJzL3BjaS9tc2kuaAppbmRleCBmMGNjYTE3Li4zODk4ZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9tc2kuaAorKysgYi9kcml2ZXJzL3BjaS9tc2kuaApAQCAtNiwxNCArNiw2IEBACiAjaWZuZGVmIE1TSV9ICiAjZGVmaW5lIE1TSV9ICiAKLS8qCi0gKiBNU0ktWCBBZGRyZXNzIFJlZ2lzdGVyCi0gKi8KLSNkZWZpbmUgUENJX01TSVhfRkxBR1NfUVNJWkUJCTB4N0ZGCi0jZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX0VOQUJMRQkJKDEgPDwgMTUpCi0jZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX0JJUk1BU0sJCSg3IDw8IDApCi0jZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX0JJVE1BU0sJCSgxIDw8IDApCi0KICNkZWZpbmUgUENJX01TSVhfRU5UUllfU0laRQkJCTE2CiAjZGVmaW5lICBQQ0lfTVNJWF9FTlRSWV9MT1dFUl9BRERSX09GRlNFVAkwCiAjZGVmaW5lICBQQ0lfTVNJWF9FTlRSWV9VUFBFUl9BRERSX09GRlNFVAk0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCBiYjc0NTZjLi5hMDY0ZjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTM2LDYgKzM2LDcgQEAKIAlzdHJ1Y3QgYWNwaV9idWZmZXIJb3V0cHV0ID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKIAl1bmlvbiBhY3BpX29iamVjdCAJKm91dF9vYmo7CiAJdTMyCQkJb3NjX2R3MDsKKwlhY3BpX3N0YXR1cyAqcmV0X3N0YXR1cyA9IChhY3BpX3N0YXR1cyAqKXJldHZhbDsKIAogCQogCS8qIFNldHRpbmcgdXAgaW5wdXQgcGFyYW1ldGVycyAqLwpAQCAtNTYsNiArNTcsNyBAQAogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIAogCQkJIkV2YWx1YXRlIF9PU0MgU2V0IGZhaWxzLiBTdGF0dXMgPSAweCUwNHhcbiIsIHN0YXR1cyk7CisJCSpyZXRfc3RhdHVzID0gc3RhdHVzOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAlvdXRfb2JqID0gb3V0cHV0LnBvaW50ZXI7CkBAIC05MCw2ICs5Miw3IEBACiAKIHF1ZXJ5X29zY19vdXQ6CiAJa2ZyZWUob3V0cHV0LnBvaW50ZXIpOworCSpyZXRfc3RhdHVzID0gc3RhdHVzOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2Niw2ICsxNjksNyBAQAogYWNwaV9zdGF0dXMgcGNpX29zY19zdXBwb3J0X3NldCh1MzIgZmxhZ3MpCiB7CiAJdTMyIHRlbXA7CisJYWNwaV9zdGF0dXMgcmV0dmFsOwogCiAJaWYgKCEoZmxhZ3MgJiBPU0NfU1VQUE9SVF9NQVNLUykpIHsKIAkJcmV0dXJuIEFFX1RZUEU7CkBAIC0xNzksOSArMTgzLDEzIEBACiAJYWNwaV9nZXRfZGV2aWNlcyAoIFBDSV9ST09UX0hJRF9TVFJJTkcsCiAJCQlhY3BpX3F1ZXJ5X29zYywKIAkJCWN0cmxzZXRfYnVmLAotCQkJTlVMTCApOworCQkJKHZvaWQgKiopICZyZXR2YWwgKTsKIAljdHJsc2V0X2J1ZltPU0NfUVVFUllfVFlQRV0gPSAhT1NDX1FVRVJZX0VOQUJMRTsKIAljdHJsc2V0X2J1ZltPU0NfQ09OVFJPTF9UWVBFXSA9IHRlbXA7CisJaWYgKEFDUElfRkFJTFVSRShyZXR2YWwpKSB7CisJCS8qIG5vIG9zYyBzdXBwb3J0IGF0IGFsbCAqLworCQljdHJsc2V0X2J1ZltPU0NfU1VQUE9SVF9UWVBFXSA9IDA7CisJfQogCXJldHVybiBBRV9PSzsKIH0KIEVYUE9SVF9TWU1CT0wocGNpX29zY19zdXBwb3J0X3NldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggYjFjMGM3MC4uZTVhZTNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtMjY1LDYgKzI2NSwxMyBAQAogCX0KIAogCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBzdGlsbCBvbiwgc2V0IHRoZSBwb3dlciBzdGF0ZSBhcyAidW5rbm93biIsCisJICogc2luY2UgaXQgbWlnaHQgY2hhbmdlIGJ5IHRoZSBuZXh0IHRpbWUgd2UgbG9hZCB0aGUgZHJpdmVyLgorCSAqLworCWlmIChwY2lfZGV2LT5jdXJyZW50X3N0YXRlID09IFBDSV9EMCkKKwkJcGNpX2Rldi0+Y3VycmVudF9zdGF0ZSA9IFBDSV9VTktOT1dOOworCisJLyoKIAkgKiBXZSB3b3VsZCBsb3ZlIHRvIGNvbXBsYWluIGhlcmUgaWYgcGNpX2Rldi0+aXNfZW5hYmxlZCBpcyBzZXQsIHRoYXQKIAkgKiB0aGUgZHJpdmVyIHNob3VsZCBoYXZlIGNhbGxlZCBwY2lfZGlzYWJsZV9kZXZpY2UoKSwgYnV0IHRoZQogCSAqIHVuZm9ydHVuYXRlIGZhY3QgaXMgdGhlcmUgYXJlIHRvbyBtYW55IG9kZCBCSU9TIGFuZCBicmlkZ2Ugc2V0dXBzCkBAIC0yODgsNiArMjk1LDEyIEBACiAJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnN1c3BlbmQsIGkpOwogCX0gZWxzZSB7CiAJCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCQkvKgorCQkgKiBtYXJrIGl0cyBwb3dlciBzdGF0ZSBhcyAidW5rbm93biIsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYKKwkJICogZS5nLiB0aGUgQklPUyB3aWxsIGNoYW5nZSBpdHMgZGV2aWNlIHN0YXRlIHdoZW4gd2Ugc3VzcGVuZC4KKwkJICovCisJCWlmIChwY2lfZGV2LT5jdXJyZW50X3N0YXRlID09IFBDSV9EMCkKKwkJCXBjaV9kZXYtPmN1cnJlbnRfc3RhdGUgPSBQQ0lfVU5LTk9XTjsKIAl9CiAJcmV0dXJuIGk7CiB9CkBAIC0zMTYsOCArMzI5LDggQEAKIAkvKiByZXN0b3JlIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAJLyogaWYgdGhlIGRldmljZSB3YXMgZW5hYmxlZCBiZWZvcmUgc3VzcGVuZCwgcmVlbmFibGUgKi8KLQlpZiAocGNpX2Rldi0+aXNfZW5hYmxlZCkKLQkJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJaWYgKGF0b21pY19yZWFkKCZwY2lfZGV2LT5lbmFibGVfY250KSkKKwkJcmV0dmFsID0gX19wY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKIAkvKiBpZiB0aGUgZGV2aWNlIHdhcyBidXNtYXN0ZXIgYmVmb3JlIHRoZSBzdXNwZW5kLCBtYWtlIGl0IGJ1c21hc3RlciBhZ2FpbiAqLwogCWlmIChwY2lfZGV2LT5pc19idXNtYXN0ZXIpCiAJCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOwpAQCAtNDMyLDkgKzQ0NSwxMiBAQAogCiAJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCiAJZXJyb3IgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotCWlmICghZXJyb3IpCi0JCWVycm9yID0gcGNpX2NyZWF0ZV9uZXdpZF9maWxlKGRydik7CisJZXJyb3IgPSBwY2lfY3JlYXRlX25ld2lkX2ZpbGUoZHJ2KTsKKwlpZiAoZXJyb3IpCisJCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IGExZDJlOTcuLjdhOTQwNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC00Miw3ICs0Miw2IEBACiBwY2lfY29uZmlnX2F0dHIoc3Vic3lzdGVtX2RldmljZSwgIjB4JTA0eFxuIik7CiBwY2lfY29uZmlnX2F0dHIoY2xhc3MsICIweCUwNnhcbiIpOwogcGNpX2NvbmZpZ19hdHRyKGlycSwgIiV1XG4iKTsKLXBjaV9jb25maWdfYXR0cihpc19lbmFibGVkLCAiJXVcbiIpOwogCiBzdGF0aWMgc3NpemVfdCBicm9rZW5fcGFyaXR5X3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMTEyLDI2ICsxMTEsMzYgQEAKIAkJICAgICAgICh1OCkocGNpX2Rldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBjaV9kZXYtPmNsYXNzID4+IDgpLAogCQkgICAgICAgKHU4KShwY2lfZGV2LT5jbGFzcykpOwogfQotc3RhdGljIHNzaXplX3QKLWlzX2VuYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisKK3N0YXRpYyBzc2l6ZV90IGlzX2VuYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KQogeworCXNzaXplX3QgcmVzdWx0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlpbnQgcmV0dmFsID0gMDsKIAogCS8qIHRoaXMgY2FuIGNyYXNoIHRoZSBtYWNoaW5lIHdoZW4gZG9uZSBvbiB0aGUgIndyb25nIiBkZXZpY2UgKi8KIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiBjb3VudDsKIAotCWlmICgqYnVmID09ICcwJykKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCWlmICgqYnVmID09ICcwJykgeworCQlpZiAoYXRvbWljX3JlYWQoJnBkZXYtPmVuYWJsZV9jbnQpICE9IDApCisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCWVsc2UKKwkJCXJlc3VsdCA9IC1FSU87CisJfSBlbHNlIGlmICgqYnVmID09ICcxJykKKwkJcmVzdWx0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAKLQlpZiAoKmJ1ZiA9PSAnMScpCi0JCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByZXN1bHQgPCAwID8gcmVzdWx0IDogY291bnQ7Cit9CiAKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCXJldHVybiBjb3VudDsKK3N0YXRpYyBzc2l6ZV90IGlzX2VuYWJsZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXBkZXYgPSB0b19wY2lfZGV2IChkZXYpOworCXJldHVybiBzcHJpbnRmIChidWYsICIldVxuIiwgYXRvbWljX3JlYWQoJnBkZXYtPmVuYWJsZV9jbnQpKTsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTY0Miw2ICs2NTEsOSBAQAogICovCiB2b2lkIHBjaV9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeworCWlmICghc3lzZnNfaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKwogCWlmIChwZGV2LT5jZmdfc2l6ZSA8IDQwOTYpCiAJCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZwY2lfY29uZmlnX2F0dHIpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggYTU0NDk5Ny4uNWExNGI3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTQ5MCw2ICs0OTAsNDcgQEAKIAlrZnJlZShzYXZlX3N0YXRlKTsKIH0KIAorCitzdGF0aWMgaW50IHBjaV9zYXZlX3BjaXhfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgcG9zLCBpID0gMDsKKwlzdHJ1Y3QgcGNpX2NhcF9zYXZlZF9zdGF0ZSAqc2F2ZV9zdGF0ZTsKKwl1MTYgKmNhcDsKKworCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX1BDSVgpOworCWlmIChwb3MgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlzYXZlX3N0YXRlID0ga3phbGxvYyhzaXplb2YoKnNhdmVfc3RhdGUpICsgc2l6ZW9mKHUxNiksIEdGUF9LRVJORUwpOworCWlmICghc2F2ZV9zdGF0ZSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIk91dCBvZiBtZW1vcnkgaW4gcGNpX3NhdmVfcGNpZV9zdGF0ZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljYXAgPSAodTE2ICopJnNhdmVfc3RhdGUtPmRhdGFbMF07CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9YX0NNRCwgJmNhcFtpKytdKTsKKwlwY2lfYWRkX3NhdmVkX2NhcChkZXYsIHNhdmVfc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwY2lfcmVzdG9yZV9wY2l4X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGkgPSAwLCBwb3M7CisJc3RydWN0IHBjaV9jYXBfc2F2ZWRfc3RhdGUgKnNhdmVfc3RhdGU7CisJdTE2ICpjYXA7CisKKwlzYXZlX3N0YXRlID0gcGNpX2ZpbmRfc2F2ZWRfY2FwKGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QQ0lYKTsKKwlpZiAoIXNhdmVfc3RhdGUgfHwgcG9zIDw9IDApCisJCXJldHVybjsKKwljYXAgPSAodTE2ICopJnNhdmVfc3RhdGUtPmRhdGFbMF07CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfWF9DTUQsIGNhcFtpKytdKTsKKwlwY2lfcmVtb3ZlX3NhdmVkX2NhcChzYXZlX3N0YXRlKTsKKwlrZnJlZShzYXZlX3N0YXRlKTsKK30KKworCiAvKioKICAqIHBjaV9zYXZlX3N0YXRlIC0gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKICAqIEBkZXY6IC0gUENJIGRldmljZSB0aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aApAQCAtNTA3LDYgKzU0OCw4IEBACiAJCXJldHVybiBpOwogCWlmICgoaSA9IHBjaV9zYXZlX3BjaWVfc3RhdGUoZGV2KSkgIT0gMCkKIAkJcmV0dXJuIGk7CisJaWYgKChpID0gcGNpX3NhdmVfcGNpeF9zdGF0ZShkZXYpKSAhPSAwKQorCQlyZXR1cm4gaTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTM4LDYgKzU4MSw3IEBACiAJCQkJZGV2LT5zYXZlZF9jb25maWdfc3BhY2VbaV0pOwogCQl9CiAJfQorCXBjaV9yZXN0b3JlX3BjaXhfc3RhdGUoZGV2KTsKIAlwY2lfcmVzdG9yZV9tc2lfc3RhdGUoZGV2KTsKIAlwY2lfcmVzdG9yZV9tc2l4X3N0YXRlKGRldik7CiAJcmV0dXJuIDA7CkBAIC01NjgsMjcgKzYxMiw0OCBAQAogfQogCiAvKioKKyAqIF9fcGNpX2VuYWJsZV9kZXZpY2UgLSBJbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyLgorICogQGRldjogUENJIGRldmljZSB0byBiZSBpbml0aWFsaXplZAorICoKKyAqICBJbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyLiBBc2sgbG93LWxldmVsIGNvZGUKKyAqICB0byBlbmFibGUgSS9PIGFuZCBtZW1vcnkuIFdha2UgdXAgdGhlIGRldmljZSBpZiBpdCB3YXMgc3VzcGVuZGVkLgorICogIEJld2FyZSwgdGhpcyBmdW5jdGlvbiBjYW4gZmFpbC4KKyAqCisgKiBOb3RlIHRoaXMgZnVuY3Rpb24gaXMgYSBiYWNrZW5kIGFuZCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGJ5CisgKiBub3JtYWwgY29kZSwgdXNlIHBjaV9lbmFibGVfZGV2aWNlKCkgaW5zdGVhZC4KKyAqLworaW50CitfX3BjaV9lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGVycjsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlX2JhcnMoZGV2LCAoMSA8PCBQQ0lfTlVNX1JFU09VUkNFUykgLSAxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX2VuYWJsZSwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBwY2lfZW5hYmxlX2RldmljZSAtIEluaXRpYWxpemUgZGV2aWNlIGJlZm9yZSBpdCdzIHVzZWQgYnkgYSBkcml2ZXIuCiAgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGJlIGluaXRpYWxpemVkCiAgKgogICogIEluaXRpYWxpemUgZGV2aWNlIGJlZm9yZSBpdCdzIHVzZWQgYnkgYSBkcml2ZXIuIEFzayBsb3ctbGV2ZWwgY29kZQogICogIHRvIGVuYWJsZSBJL08gYW5kIG1lbW9yeS4gV2FrZSB1cCB0aGUgZGV2aWNlIGlmIGl0IHdhcyBzdXNwZW5kZWQuCiAgKiAgQmV3YXJlLCB0aGlzIGZ1bmN0aW9uIGNhbiBmYWlsLgorICoKKyAqICBOb3RlIHdlIGRvbid0IGFjdHVhbGx5IGVuYWJsZSB0aGUgZGV2aWNlIG1hbnkgdGltZXMgaWYgd2UgY2FsbAorICogIHRoaXMgZnVuY3Rpb24gcmVwZWF0ZWRseSAod2UganVzdCBpbmNyZW1lbnQgdGhlIGNvdW50KS4KICAqLwotaW50Ci1wY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoraW50IHBjaV9lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IGVycjsKLQotCWlmIChkZXYtPmlzX2VuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2VfYmFycyhkZXYsICgxIDw8IFBDSV9OVU1fUkVTT1VSQ0VTKSAtIDEpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfZW5hYmxlLCBkZXYpOwotCWRldi0+aXNfZW5hYmxlZCA9IDE7Ci0JcmV0dXJuIDA7CisJaW50IHJlc3VsdDsKKwlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldi0+ZW5hYmxlX2NudCkgPiAxKQorCQlyZXR1cm4gMDsJCS8qIGFscmVhZHkgZW5hYmxlZCAqLworCXJlc3VsdCA9IF9fcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJYXRvbWljX2RlYygmZGV2LT5lbmFibGVfY250KTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAvKioKQEAgLTYwNywxMiArNjcyLDE4IEBACiAgKgogICogU2lnbmFsIHRvIHRoZSBzeXN0ZW0gdGhhdCB0aGUgUENJIGRldmljZSBpcyBub3QgaW4gdXNlIGJ5IHRoZSBzeXN0ZW0KICAqIGFueW1vcmUuICBUaGlzIG9ubHkgaW52b2x2ZXMgZGlzYWJsaW5nIFBDSSBidXMtbWFzdGVyaW5nLCBpZiBhY3RpdmUuCisgKgorICogTm90ZSB3ZSBkb24ndCBhY3R1YWxseSBkaXNhYmxlIHRoZSBkZXZpY2UgdW50aWwgYWxsIGNhbGxlcnMgb2YKKyAqIHBjaV9kZXZpY2VfZW5hYmxlKCkgaGF2ZSBjYWxsZWQgcGNpX2RldmljZV9kaXNhYmxlKCkuCiAgKi8KIHZvaWQKIHBjaV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXUxNiBwY2lfY29tbWFuZDsKIAorCWlmIChhdG9taWNfc3ViX3JldHVybigxLCAmZGV2LT5lbmFibGVfY250KSAhPSAwKQorCQlyZXR1cm47CisKIAlpZiAoZGV2LT5tc2lfZW5hYmxlZCkKIAkJZGlzYWJsZV9tc2lfbW9kZShkZXYsIHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX01TSSksCiAJCQlQQ0lfQ0FQX0lEX01TSSk7CkBAIC02MjgsNyArNjk5LDYgQEAKIAlkZXYtPmlzX2J1c21hc3RlciA9IDA7CiAKIAlwY2liaW9zX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JZGV2LT5pc19lbmFibGVkID0gMDsKIH0KIAogLyoqCkBAIC04MzEsMjIgKzkwMSwzOCBAQAogCXBjaWJpb3Nfc2V0X21hc3RlcihkZXYpOwogfQogCi0jaWZuZGVmIEhBVkVfQVJDSF9QQ0lfTVdJCisjaWZkZWYgUENJX0RJU0FCTEVfTVdJCitpbnQgcGNpX3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwY2lfY2xlYXJfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7Cit9CisKKyNlbHNlCisKKyNpZm5kZWYgUENJX0NBQ0hFX0xJTkVfQllURVMKKyNkZWZpbmUgUENJX0NBQ0hFX0xJTkVfQllURVMgTDFfQ0FDSEVfQllURVMKKyNlbmRpZgorCiAvKiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGFyY2ggY29kZS4gKi8KLXU4IHBjaV9jYWNoZV9saW5lX3NpemUgPSBMMV9DQUNIRV9CWVRFUyA+PiAyOworLyogRG9uJ3QgZm9yZ2V0IHRoaXMgaXMgbWVhc3VyZWQgaW4gMzItYml0IHdvcmRzLCBub3QgYnl0ZXMgKi8KK3U4IHBjaV9jYWNoZV9saW5lX3NpemUgPSBQQ0lfQ0FDSEVfTElORV9CWVRFUyAvIDQ7CiAKIC8qKgotICogcGNpX2dlbmVyaWNfcHJlcF9td2kgLSBoZWxwZXIgZnVuY3Rpb24gZm9yIHBjaV9zZXRfbXdpCi0gKiBAZGV2OiB0aGUgUENJIGRldmljZSBmb3Igd2hpY2ggTVdJIGlzIGVuYWJsZWQKKyAqIHBjaV9zZXRfY2FjaGVsaW5lX3NpemUgLSBlbnN1cmUgdGhlIENBQ0hFX0xJTkVfU0laRSByZWdpc3RlciBpcyBwcm9ncmFtbWVkCisgKiBAZGV2OiB0aGUgUENJIGRldmljZSBmb3Igd2hpY2ggTVdJIGlzIHRvIGJlIGVuYWJsZWQKICAqCi0gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgcGNpYmlvc19wcmVwX213aQotICogZnVuY3Rpb24uICBPcmlnaW5hbGx5IGNvcGllZCBmcm9tIGRyaXZlcnMvbmV0L2FjZW5pYy5jLgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBwY2lfc2V0X213aS4KKyAqIE9yaWdpbmFsbHkgY29waWVkIGZyb20gZHJpdmVycy9uZXQvYWNlbmljLmMuCiAgKiBDb3B5cmlnaHQgMTk5OC0yMDAxIGJ5IEplcyBTb3JlbnNlbiwgPGplc0B0cmFpbmVkLW1vbmtleS5vcmc+LgogICoKICAqIFJFVFVSTlM6IEFuIGFwcHJvcHJpYXRlIC1FUlJOTyBlcnJvciB2YWx1ZSBvbiBlcnJvciwgb3IgemVybyBmb3Igc3VjY2Vzcy4KICAqLwogc3RhdGljIGludAotcGNpX2dlbmVyaWNfcHJlcF9td2koc3RydWN0IHBjaV9kZXYgKmRldikKK3BjaV9zZXRfY2FjaGVsaW5lX3NpemUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1OCBjYWNoZWxpbmVfc2l6ZTsKIApAQCAtODcyLDcgKzk1OCw2IEBACiAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KLSNlbmRpZiAvKiAhSEFWRV9BUkNIX1BDSV9NV0kgKi8KIAogLyoqCiAgKiBwY2lfc2V0X213aSAtIGVuYWJsZXMgbWVtb3J5LXdyaXRlLWludmFsaWRhdGUgUENJIHRyYW5zYWN0aW9uCkBAIC04OTAsMTIgKzk3NSw3IEBACiAJaW50IHJjOwogCXUxNiBjbWQ7CiAKLSNpZmRlZiBIQVZFX0FSQ0hfUENJX01XSQotCXJjID0gcGNpYmlvc19wcmVwX213aShkZXYpOwotI2Vsc2UKLQlyYyA9IHBjaV9nZW5lcmljX3ByZXBfbXdpKGRldik7Ci0jZW5kaWYKLQorCXJjID0gcGNpX3NldF9jYWNoZWxpbmVfc2l6ZShkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC05MjYsNiArMTAwNiw3IEBACiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwogCX0KIH0KKyNlbmRpZiAvKiAhIFBDSV9ESVNBQkxFX01XSSAqLwogCiAvKioKICAqIHBjaV9pbnR4IC0gZW5hYmxlcy9kaXNhYmxlcyBQQ0kgSU5UeCBmb3IgZGV2aWNlIGRldgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCA2YmYzMjdkLi4zOTg4NTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMSw1ICsxLDYgQEAKIC8qIEZ1bmN0aW9ucyBpbnRlcm5hbCB0byB0aGUgUENJIGNvcmUgY29kZSAqLwogCitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBfX3BjaV9lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICopOwogZXh0ZXJuIGludCBwY2lfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKIAkJICAgICAgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOwogZXh0ZXJuIGludCBwY2lfY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydi5jCmluZGV4IDA0YzQzZWYuLjZmNWZhYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydi5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydi5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIHsKIAlzdHJ1Y3QgYWVyX3JwYyAqcnBjOwogCi0JaWYgKCEocnBjID0gKHN0cnVjdCBhZXJfcnBjICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGFlcl9ycGMpLAorCWlmICghKHJwYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZXJfcnBjKSwKIAkJR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTYwLDcgKzE2MCw3IEBACiAJcnBjLT5lX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CiAKIAlycGMtPnJwZCA9IGRldjsKLQlJTklUX1dPUksoJnJwYy0+ZHBjX2hhbmRsZXIsIGFlcl9pc3IsICh2b2lkICopZGV2KTsKKwlJTklUX1dPUksoJnJwYy0+ZHBjX2hhbmRsZXIsIGFlcl9pc3IpOwogCXJwYy0+cHJvZF9pZHggPSBycGMtPmNvbnNfaWR4ID0gMDsKIAltdXRleF9pbml0KCZycGMtPnJwY19tdXRleCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcnBjLT53YWl0X3JlbGVhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmggYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaAppbmRleCBkYWYwY2FkLi4zYzBhNThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaAorKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaApAQCAtMTE4LDcgKzExOCw3IEBACiBleHRlcm4gdm9pZCBhZXJfZW5hYmxlX3Jvb3Rwb3J0KHN0cnVjdCBhZXJfcnBjICpycGMpOwogZXh0ZXJuIHZvaWQgYWVyX2RlbGV0ZV9yb290cG9ydChzdHJ1Y3QgYWVyX3JwYyAqcnBjKTsKIGV4dGVybiBpbnQgYWVyX2luaXQoc3RydWN0IHBjaWVfZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgYWVyX2lzcih2b2lkICpjb250ZXh0KTsKK2V4dGVybiB2b2lkIGFlcl9pc3Ioc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIGV4dGVybiB2b2lkIGFlcl9wcmludF9lcnJvcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgYWVyX2Vycl9pbmZvICppbmZvKTsKIGV4dGVybiBpbnQgYWVyX29zY19zZXR1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKaW5kZXggMWM3ZTY2MC4uMDhlMTMwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCkBAIC02OTAsMTQgKzY5MCwxNCBAQAogCiAvKioKICAqIGFlcl9pc3IgLSBjb25zdW1lIGVycm9ycyBkZXRlY3RlZCBieSByb290IHBvcnQKLSAqIEBjb250ZXh0OiBwb2ludGVyIHRvIGEgcHJpdmF0ZSBkYXRhIG9mIHBjaWUgZGV2aWNlCisgKiBAd29yazogZGVmaW5pdGlvbiBvZiB0aGlzIHdvcmsgaXRlbQogICoKICAqIEludm9rZWQsIGFzIERQQywgd2hlbiByb290IHBvcnQgcmVjb3JkcyBuZXcgZGV0ZWN0ZWQgZXJyb3IKICAqKi8KLXZvaWQgYWVyX2lzcih2b2lkICpjb250ZXh0KQordm9pZCBhZXJfaXNyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBfZGV2aWNlID0gKHN0cnVjdCBwY2llX2RldmljZSAqKSBjb250ZXh0OwotCXN0cnVjdCBhZXJfcnBjICpycGMgPSBnZXRfc2VydmljZV9kYXRhKHBfZGV2aWNlKTsKKwlzdHJ1Y3QgYWVyX3JwYyAqcnBjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZXJfcnBjLCBkcGNfaGFuZGxlcik7CisJc3RydWN0IHBjaWVfZGV2aWNlICpwX2RldmljZSA9IHJwYy0+cnBkOwogCXN0cnVjdCBhZXJfZXJyX3NvdXJjZSAqZV9zcmM7CiAKIAltdXRleF9sb2NrKCZycGMtPnJwY19tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnYuaCBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCmluZGV4IDY3ZmNkMTcuLjM2NTZlMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCkBAIC05LDYgKzksOCBAQAogI2lmbmRlZiBfUE9SVERSVl9IXwogI2RlZmluZSBfUE9SVERSVl9IXwogCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKwogI2lmICFkZWZpbmVkKFBDSV9DQVBfSURfUE1FKQogI2RlZmluZSBQQ0lfQ0FQX0lEX1BNRQkJCTEKICNlbmRpZgpAQCAtMzksNyArNDEsNyBAQAogZXh0ZXJuIGludCBwY2llX3BvcnRfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKICNlbmRpZgogZXh0ZXJuIHZvaWQgcGNpZV9wb3J0X2RldmljZV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldik7Ci1leHRlcm4gaW50IHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCk7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBwY2llX3BvcnRfYnVzX3JlZ2lzdGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgcGNpZV9wb3J0X2J1c191bnJlZ2lzdGVyKHZvaWQpOwogCiAjZW5kaWYgLyogX1BPUlREUlZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCmluZGV4IGJkNjYxNWIuLmIyMGE5YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwpAQCAtNiw3ICs2LDYgQEAKICAqIENvcHlyaWdodCAoQykgVG9tIExvbmcgTmd1eWVuICh0b20ubC5uZ3V5ZW5AaW50ZWwuY29tKQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNDAxLDcgKzQwMCw3IEBACiAJCXBjaV9kaXNhYmxlX21zaShkZXYpOwogfQogCi1pbnQgX19tdXN0X2NoZWNrIHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCkKK2ludCBwY2llX3BvcnRfYnVzX3JlZ2lzdGVyKHZvaWQpCiB7CiAJcmV0dXJuIGJ1c19yZWdpc3RlcigmcGNpZV9wb3J0X2J1c190eXBlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCAwMzc2OTBlLi5iNGRhNzk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC0zNyw3ICszNyw2IEBACiAJcmV0dXJuIHBjaV9zYXZlX3N0YXRlKGRldik7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3Jlc3RvcmVfY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IHJldHZhbDsKQEAgLTUwLDYgKzQ5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBwY2llX3BvcnRkcnZfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaW50IHJldCA9IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChkZXYsIHN0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IGEzYjBhNWUuLjZhM2MxZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtNjc5LDYgKzY3OSwzMyBAQAogCQlwY2lfcmVhZF9iYXNlcyhkZXYsIDYsIFBDSV9ST01fQUREUkVTUyk7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZkZXYtPnN1YnN5c3RlbV92ZW5kb3IpOwogCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOworCisJCS8qCisJCSAqCURvIHRoZSB1Z2x5IGxlZ2FjeSBtb2RlIHN0dWZmIGhlcmUgcmF0aGVyIHRoYW4gYnJva2VuIGNoaXAKKwkJICoJcXVpcmsgY29kZS4gTGVnYWN5IG1vZGUgQVRBIGNvbnRyb2xsZXJzIGhhdmUgZml4ZWQKKwkJICoJYWRkcmVzc2VzLiBUaGVzZSBhcmUgbm90IGFsd2F5cyBlY2hvZWQgaW4gQkFSMC0zLCBhbmQKKwkJICoJQkFSMC0zIGluIGEgZmV3IGNhc2VzIGNvbnRhaW4ganVuayEKKwkJICovCisJCWlmIChjbGFzcyA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpIHsKKwkJCXU4IHByb2dpZjsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1BST0csICZwcm9naWYpOworCQkJaWYgKChwcm9naWYgJiAxKSA9PSAwKSB7CisJCQkJZGV2LT5yZXNvdXJjZVswXS5zdGFydCA9IDB4MUYwOworCQkJCWRldi0+cmVzb3VyY2VbMF0uZW5kID0gMHgxRjc7CisJCQkJZGV2LT5yZXNvdXJjZVswXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCQkJZGV2LT5yZXNvdXJjZVsxXS5zdGFydCA9IDB4M0Y2OworCQkJCWRldi0+cmVzb3VyY2VbMV0uZW5kID0gMHgzRjY7CisJCQkJZGV2LT5yZXNvdXJjZVsxXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCQl9CisJCQlpZiAoKHByb2dpZiAmIDQpID09IDApIHsKKwkJCQlkZXYtPnJlc291cmNlWzJdLnN0YXJ0ID0gMHgxNzA7CisJCQkJZGV2LT5yZXNvdXJjZVsyXS5lbmQgPSAweDE3NzsKKwkJCQlkZXYtPnJlc291cmNlWzJdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJCQlkZXYtPnJlc291cmNlWzNdLnN0YXJ0ID0gMHgzNzY7CisJCQkJZGV2LT5yZXNvdXJjZVszXS5lbmQgPSAweDM3NjsKKwkJCQlkZXYtPnJlc291cmNlWzNdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJCX0KKwkJfQogCQlicmVhazsKIAogCWNhc2UgUENJX0hFQURFUl9UWVBFX0JSSURHRToJCSAgICAvKiBicmlkZ2UgaGVhZGVyICovCkBAIC04NDYsNiArODczLDcgQEAKIAlkZXYtPmRldi5yZWxlYXNlID0gcGNpX3JlbGVhc2VfZGV2OwogCXBjaV9kZXZfZ2V0KGRldik7CiAKKwlzZXRfZGV2X25vZGUoJmRldi0+ZGV2LCBwY2lidXNfdG9fbm9kZShidXMpKTsKIAlkZXYtPmRldi5kbWFfbWFzayA9ICZkZXYtPmRtYV9tYXNrOwogCWRldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZnVsbDsKIApAQCAtMTA2NywzICsxMDk1LDk1IEBACiBFWFBPUlRfU1lNQk9MKHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTF9HUEwocGNpX3NjYW5fY2hpbGRfYnVzKTsKICNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBwY2lfc29ydF9iZl9jbXAoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmEsIGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpiKQoreworCWlmICAgICAgKHBjaV9kb21haW5fbnIoYS0+YnVzKSA8IHBjaV9kb21haW5fbnIoYi0+YnVzKSkgcmV0dXJuIC0xOworCWVsc2UgaWYgKHBjaV9kb21haW5fbnIoYS0+YnVzKSA+IHBjaV9kb21haW5fbnIoYi0+YnVzKSkgcmV0dXJuICAxOworCisJaWYgICAgICAoYS0+YnVzLT5udW1iZXIgPCBiLT5idXMtPm51bWJlcikgcmV0dXJuIC0xOworCWVsc2UgaWYgKGEtPmJ1cy0+bnVtYmVyID4gYi0+YnVzLT5udW1iZXIpIHJldHVybiAgMTsKKworCWlmICAgICAgKGEtPmRldmZuIDwgYi0+ZGV2Zm4pIHJldHVybiAtMTsKKwllbHNlIGlmIChhLT5kZXZmbiA+IGItPmRldmZuKSByZXR1cm4gIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFllcywgdGhpcyBmb3JjYWJseSBicmVha3MgdGhlIGtsaXN0IGFic3RyYWN0aW9uIHRlbXBvcmFyaWx5LiAgSXQKKyAqIGp1c3Qgd2FudHMgdG8gc29ydCB0aGUga2xpc3QsIG5vdCBjaGFuZ2UgcmVmZXJlbmNlIGNvdW50cyBhbmQKKyAqIHRha2UvZHJvcCBsb2NrcyByYXBpZGx5IGluIHRoZSBwcm9jZXNzLiAgSXQgZG9lcyBhbGwgdGhpcyB3aGlsZQorICogaG9sZGluZyB0aGUgbG9jayBmb3IgdGhlIGxpc3QsIHNvIG9iamVjdHMgY2FuJ3Qgb3RoZXJ3aXNlIGJlCisgKiBhZGRlZC9yZW1vdmVkIHdoaWxlIHdlJ3JlIHN3aXp6bGluZy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHBjaV9pbnNlcnRpb25fc29ydF9rbGlzdChzdHJ1Y3QgcGNpX2RldiAqYSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IGtsaXN0X25vZGUgKm47CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpiOworCisJbGlzdF9mb3JfZWFjaChwb3MsIGxpc3QpIHsKKwkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOworCQlkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwkJYiA9IHRvX3BjaV9kZXYoZGV2KTsKKwkJaWYgKHBjaV9zb3J0X2JmX2NtcChhLCBiKSA8PSAwKSB7CisJCQlsaXN0X21vdmVfdGFpbCgmYS0+ZGV2Lmtub2RlX2J1cy5uX25vZGUsICZiLT5kZXYua25vZGVfYnVzLm5fbm9kZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGlzdF9tb3ZlX3RhaWwoJmEtPmRldi5rbm9kZV9idXMubl9ub2RlLCBsaXN0KTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaV9zb3J0X2JyZWFkdGhmaXJzdF9rbGlzdCh2b2lkKQoreworCUxJU1RfSEVBRChzb3J0ZWRfZGV2aWNlcyk7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdG1wOworCXN0cnVjdCBrbGlzdF9ub2RlICpuOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXNwaW5fbG9jaygmcGNpX2J1c190eXBlLmtsaXN0X2RldmljZXMua19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZwY2lfYnVzX3R5cGUua2xpc3RfZGV2aWNlcy5rX2xpc3QpIHsKKwkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOworCQlkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwkJcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwkJcGNpX2luc2VydGlvbl9zb3J0X2tsaXN0KHBkZXYsICZzb3J0ZWRfZGV2aWNlcyk7CisJfQorCWxpc3Rfc3BsaWNlKCZzb3J0ZWRfZGV2aWNlcywgJnBjaV9idXNfdHlwZS5rbGlzdF9kZXZpY2VzLmtfbGlzdCk7CisJc3Bpbl91bmxvY2soJnBjaV9idXNfdHlwZS5rbGlzdF9kZXZpY2VzLmtfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2lfaW5zZXJ0aW9uX3NvcnRfZGV2aWNlcyhzdHJ1Y3QgcGNpX2RldiAqYSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqYjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgbGlzdCwgZ2xvYmFsX2xpc3QpIHsKKwkJaWYgKHBjaV9zb3J0X2JmX2NtcChhLCBiKSA8PSAwKSB7CisJCQlsaXN0X21vdmVfdGFpbCgmYS0+Z2xvYmFsX2xpc3QsICZiLT5nbG9iYWxfbGlzdCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGlzdF9tb3ZlX3RhaWwoJmEtPmdsb2JhbF9saXN0LCBsaXN0KTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaV9zb3J0X2JyZWFkdGhmaXJzdF9kZXZpY2VzKHZvaWQpCit7CisJTElTVF9IRUFEKHNvcnRlZF9kZXZpY2VzKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2LCAqdG1wOworCisJZG93bl93cml0ZSgmcGNpX2J1c19zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJnBjaV9kZXZpY2VzLCBnbG9iYWxfbGlzdCkgeworCQlwY2lfaW5zZXJ0aW9uX3NvcnRfZGV2aWNlcyhkZXYsICZzb3J0ZWRfZGV2aWNlcyk7CisJfQorCWxpc3Rfc3BsaWNlKCZzb3J0ZWRfZGV2aWNlcywgJnBjaV9kZXZpY2VzKTsKKwl1cF93cml0ZSgmcGNpX2J1c19zZW0pOworfQorCit2b2lkIF9faW5pdCBwY2lfc29ydF9icmVhZHRoZmlyc3Qodm9pZCkKK3sKKwlwY2lfc29ydF9icmVhZHRoZmlyc3RfZGV2aWNlcygpOworCXBjaV9zb3J0X2JyZWFkdGhmaXJzdF9rbGlzdCgpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9jLmMgYi9kcml2ZXJzL3BjaS9wcm9jLmMKaW5kZXggOTljZjMzMy4uNGE2NzYwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYy5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2MuYwpAQCAtMjMsNyArMjMsNyBAQAogcHJvY19idXNfcGNpX2xzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKQogewogCWxvZmZfdCBuZXcgPSAtMTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoICh3aGVuY2UpIHsKQEAgLTQ4LDcgKzQ4LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBwcm9jX2J1c19wY2lfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQogewotCWNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJY29uc3Qgc3RydWN0IGlub2RlICppbm8gPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWNvbnN0IHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vKTsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gZHAtPmRhdGE7CiAJdW5zaWduZWQgaW50IHBvcyA9ICpwcG9zOwpAQCAtMTMwLDcgKzEzMCw3IEBACiBzdGF0aWMgc3NpemVfdAogcHJvY19idXNfcGNpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JY29uc3Qgc3RydWN0IGlub2RlICppbm8gPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwljb25zdCBzdHJ1Y3QgaW5vZGUgKmlubyA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJY29uc3Qgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm8pOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBkcC0+ZGF0YTsKIAlpbnQgcG9zID0gKnBwb3M7CkBAIC0yNDUsNyArMjQ1LDcgQEAKICNpZmRlZiBIQVZFX1BDSV9NTUFQCiBzdGF0aWMgaW50IHByb2NfYnVzX3BjaV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJY29uc3Qgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGRwLT5kYXRhOwogCXN0cnVjdCBwY2lfZmlscF9wcml2YXRlICpmcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggMjNiNTk5ZC4uOWNhOWI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTQ1Myw2ICs0NTMsMTIgQEAKIH0KIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMCwgcXVpcmtfaWNoNl9scGNfYWNwaSApOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBxdWlya19pY2g2X2xwY19hY3BpICk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzAsIHF1aXJrX2ljaDZfbHBjX2FjcGkgKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwgcXVpcmtfaWNoNl9scGNfYWNwaSApOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18zMSwgcXVpcmtfaWNoNl9scGNfYWNwaSApOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8wLCBxdWlya19pY2g2X2xwY19hY3BpICk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzIsIHF1aXJrX2ljaDZfbHBjX2FjcGkgKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMywgcXVpcmtfaWNoNl9scGNfYWNwaSApOwogCiAvKgogICogVklBIEFDUEk6IE9uZSBJTyByZWdpb24gcG9pbnRlZCB0byBieSBsb25nd29yZCBhdApAQCAtNjQ4LDExICs2NTQsNDMgQEAKICAqIFNvbWUgb2YgdGhlIG9uLWNoaXAgZGV2aWNlcyBhcmUgYWN0dWFsbHkgJzU4NiBkZXZpY2VzJyBzbyB0aGV5IGFyZQogICogbGlzdGVkIGhlcmUuCiAgKi8KKworc3RhdGljIGludCB2aWFfaXJxX2ZpeHVwX25lZWRlZCA9IC0xOworCisvKgorICogQXMgc29tZSBWSUEgaGFyZHdhcmUgaXMgYXZhaWxhYmxlIGluIFBDSS1jYXJkIGZvcm0sIHdlIG5lZWQgdG8gcmVzdHJpY3QKKyAqIHRoaXMgcXVpcmsgdG8gVklBIFBDSSBoYXJkd2FyZSBidWlsdCBvbnRvIFZJQS1iYXNlZCBtb3RoZXJib2FyZHMgb25seS4KKyAqIFdlIHRyeSB0byBsb2NhdGUgYSBWSUEgc291dGhicmlkZ2UgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdGhlIHF1aXJrCisgKiBzaG91bGQgYmUgYXBwbGllZC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYV9pcnFfZml4dXBfdGJsW10gPSB7CisJeworCQkudmVuZG9yIAk9IFBDSV9WRU5ET1JfSURfVklBLAorCQkuZGV2aWNlCQk9IFBDSV9BTllfSUQsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmNsYXNzCQk9IFBDSV9DTEFTU19CUklER0VfSVNBIDw8IDgsCisJCS5jbGFzc19tYXNrCT0gMHhmZmZmMDAsCisJfSwKKwl7IDAsIH0sCit9OworCiBzdGF0aWMgdm9pZCBxdWlya192aWFfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdTggaXJxLCBuZXdfaXJxOwogCi0JbmV3X2lycSA9IGRldi0+aXJxICYgMHhmOworCWlmICh2aWFfaXJxX2ZpeHVwX25lZWRlZCA9PSAtMSkKKwkJdmlhX2lycV9maXh1cF9uZWVkZWQgPSBwY2lfZGV2X3ByZXNlbnQodmlhX2lycV9maXh1cF90YmwpOworCisJaWYgKCF2aWFfaXJxX2ZpeHVwX25lZWRlZCkKKwkJcmV0dXJuOworCisJbmV3X2lycSA9IGRldi0+aXJxOworCisJLyogRG9uJ3QgcXVpcmsgaW50ZXJydXB0cyBvdXRzaWRlIHRoZSBsZWdhY3kgSVJRIHJhbmdlICovCisJaWYgKCFuZXdfaXJxIHx8IG5ld19pcnEgPiAxNSkKKwkJcmV0dXJuOworCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZpcnEpOwogCWlmIChuZXdfaXJxICE9IGlycSkgewogCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFZJQSBJUlEgZml4dXAgZm9yICVzLCBmcm9tICVkIHRvICVkXG4iLApAQCAtNjYxLDE0ICs2OTksNyBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIG5ld19pcnEpOwogCX0KIH0KLURFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzAsIHF1aXJrX3ZpYV9pcnEpOwotREVDTEFSRV9QQ0lfRklYVVBfRU5BQkxFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSwgcXVpcmtfdmlhX2lycSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9FTkFCTEUoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yLCBxdWlya192aWFfaXJxKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzMsIHF1aXJrX3ZpYV9pcnEpOwotREVDTEFSRV9QQ0lfRklYVVBfRU5BQkxFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjM1X1VTQl8yLCBxdWlya192aWFfaXJxKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2LCBxdWlya192aWFfaXJxKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VOQUJMRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQsIHF1aXJrX3ZpYV9pcnEpOwotREVDTEFSRV9QQ0lfRklYVVBfRU5BQkxFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNSwgcXVpcmtfdmlhX2lycSk7CitERUNMQVJFX1BDSV9GSVhVUF9FTkFCTEUoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9BTllfSUQsIHF1aXJrX3ZpYV9pcnEpOwogCiAvKgogICogVklBIFZUODJDNTk4IGhhcyBpdHMgZGV2aWNlIElEIHNldHRhYmxlIGFuZCBtYW55IEJJT1NlcwpAQCAtNjgzLDMzICs3MTQsNiBAQAogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVklBLAlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTdfMCwJcXVpcmtfdnQ4MmM1OThfaWQgKTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCi0KLS8qCi0gKiBTb21lIFZJQSBzeXN0ZW1zIGJvb3Qgd2l0aCB0aGUgYWJub3JtYWwgc3RhdHVzIGZsYWcgc2V0LiBUaGlzIGNhbiBjYXVzZQotICogdGhlIEJJT1MgdG8gcmUtUE9TVCB0aGUgc3lzdGVtIG9uIHJlc3VtZSByYXRoZXIgdGhhbiBwYXNzaW5nIGNvbnRyb2wKLSAqIGJhY2sgdG8gdGhlIE9TLiAgQ2xlYXIgdGhlIGZsYWcgb24gYm9vdAotICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfdmlhX2Fibm9ybWFsX3Bvd2Vyb2ZmKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JdTMyIHJlZzsKLQotCWFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJCSZyZWcpOwotCi0JaWYgKHJlZyAmIDB4ODAwKSB7Ci0JCXByaW50aygiQ2xlYXJpbmcgYWJub3JtYWwgcG93ZXJvZmYgZmxhZ1xuIik7Ci0JCWFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCi0JCQkJCUFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKLQkJCQkJKHUxNikweDgwMCk7Ci0JfQotfQotCi1ERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzNSwgcXVpcmtfdmlhX2Fibm9ybWFsX3Bvd2Vyb2ZmKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjM3LCBxdWlya192aWFfYWJub3JtYWxfcG93ZXJvZmYpOwotCi0jZW5kaWYKLQogLyoKICAqIENhcmRCdXMgY29udHJvbGxlcnMgaGF2ZSBhIGxlZ2FjeSBiYXNlIGFkZHJlc3MgdGhhdCBlbmFibGVzIHRoZW0KICAqIHRvIHJlc3BvbmQgYXMgaTgyMzY1IHBjbWNpYSBjb250cm9sbGVycy4gIFdlIGRvbid0IHdhbnQgdGhlbSB0bwpAQCAtNzkzLDU2ICs3OTcsNiBAQAogREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9DWVJJWCwJUENJX0RFVklDRV9JRF9DWVJJWF9QQ0lfTUFTVEVSLCBxdWlya19tZWRpYWd4X21hc3RlciApOwogCiAvKgotICogQXMgcGVyIFBDSSBzcGVjLCBpZ25vcmUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVycyAwLTMgb2YgdGhlIElERSBjb250cm9sbGVycwotICogcnVubmluZyBpbiBDb21wYXRpYmxlIG1vZGUgKGJpdHMgMCBhbmQgMiBpbiB0aGUgUHJvZ0lmIGZvciBwcmltYXJ5IGFuZAotICogc2Vjb25kYXJ5IGNoYW5uZWxzIHJlc3BlY3RpdmVseSkuIElmIHRoZSBkZXZpY2UgcmVwb3J0cyBDb21wYXRpYmxlIG1vZGUKLSAqIGJ1dCBkb2VzIHVzZSBCQVIwLTMgZm9yIGFkZHJlc3MgZGVjb2RpbmcsIHdlIGFzc3VtZSB0aGF0IGZpcm13YXJlIGhhcwotICogcHJvZ3JhbW1lZCB0aGVzZSBCQVJzIHdpdGggc3RhbmRhcmQgdmFsdWVzICgweDFmMCwweDNmNCBhbmQgMHgxNzAsMHgzNzQpLgotICogRXhjZXB0aW9ucyAoaWYgdGhleSBleGlzdCkgbXVzdCBiZSBoYW5kbGVkIGluIGNoaXAvYXJjaGl0ZWN0dXJlIHNwZWNpZmljCi0gKiBmaXh1cHMuCi0gKgotICogTm90ZTogZm9yIG5vbiB4ODYgcGVvcGxlLiBZb3UgbWF5IG5lZWQgYW4gYXJjaCBzcGVjaWZpYyBxdWlyayB0byBoYW5kbGUKLSAqIG1vdmluZyBJREUgZGV2aWNlcyB0byBuYXRpdmUgbW9kZSBhcyB3ZWxsLiBTb21lIHBsdWcgaW4gY2FyZCBkZXZpY2VzIHBvd2VyCi0gKiB1cCBpbiBjb21wYXRpYmxlIG1vZGUgYW5kIGFzc3VtZSB0aGUgQklPUyB3aWxsIGFkanVzdCB0aGVtLgotICoKLSAqIFE6IHNob3VsZCB3ZSBsb2FkIHRoZSAweDFmMCwweDNmNCBpbnRvIHRoZSByZWdpc3RlcnMgb3IgemFwIHRoZW0gYXMKLSAqIHdlIGRvIG5vdyA/IFdlIGRvbid0IHdhbnQgaXMgcGNpX2VuYWJsZV9kZXZpY2UgdG8gY29tZSBhbG9uZwotICogYW5kIGFzc2lnbiBuZXcgcmVzb3VyY2VzLiBCb3RoIGFwcHJvYWNoZXMgd29yayBmb3IgdGhhdC4KLSAqLyAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19pZGVfYmFzZXMoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLSAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLSAgICAgICBpbnQgZmlyc3RfYmFyID0gMiwgbGFzdF9iYXIgPSAwOwotCi0gICAgICAgaWYgKChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKLSAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgIHJlcyA9ICZkZXYtPnJlc291cmNlWzBdOwotCi0gICAgICAgLyogcHJpbWFyeSBjaGFubmVsOiBQcm9nSWYgYml0IDAsIEJBUjAsIEJBUjEgKi8KLSAgICAgICBpZiAoIShkZXYtPmNsYXNzICYgMSkgJiYgKHJlc1swXS5mbGFncyB8fCByZXNbMV0uZmxhZ3MpKSB7IAotICAgICAgICAgICAgICAgcmVzWzBdLnN0YXJ0ID0gcmVzWzBdLmVuZCA9IHJlc1swXS5mbGFncyA9IDA7Ci0gICAgICAgICAgICAgICByZXNbMV0uc3RhcnQgPSByZXNbMV0uZW5kID0gcmVzWzFdLmZsYWdzID0gMDsKLSAgICAgICAgICAgICAgIGZpcnN0X2JhciA9IDA7Ci0gICAgICAgICAgICAgICBsYXN0X2JhciA9IDE7Ci0gICAgICAgfQotCi0gICAgICAgLyogc2Vjb25kYXJ5IGNoYW5uZWw6IFByb2dJZiBiaXQgMiwgQkFSMiwgQkFSMyAqLwotICAgICAgIGlmICghKGRldi0+Y2xhc3MgJiA0KSAmJiAocmVzWzJdLmZsYWdzIHx8IHJlc1szXS5mbGFncykpIHsgCi0gICAgICAgICAgICAgICByZXNbMl0uc3RhcnQgPSByZXNbMl0uZW5kID0gcmVzWzJdLmZsYWdzID0gMDsKLSAgICAgICAgICAgICAgIHJlc1szXS5zdGFydCA9IHJlc1szXS5lbmQgPSByZXNbM10uZmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgbGFzdF9iYXIgPSAzOwotICAgICAgIH0KLQotICAgICAgIGlmICghbGFzdF9iYXIpCi0gICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICBwcmludGsoS0VSTl9JTkZPICJQQ0k6IElnbm9yaW5nIEJBUiVkLSVkIG9mIElERSBjb250cm9sbGVyICVzXG4iLAotICAgICAgICAgICAgICBmaXJzdF9iYXIsIGxhc3RfYmFyLCBwY2lfbmFtZShkZXYpKTsKLX0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBxdWlya19pZGVfYmFzZXMpOwotCi0vKgogICoJRW5zdXJlIEMwIHJldiByZXN0cmVhbWluZyBpcyBvZmYuIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieQogICoJdGhlIEJJT1MgYnV0IGluIHRoZSBvZGQgY2FzZSBpdCBpcyBub3QgdGhlIHJlc3VsdHMgYXJlIGNvcnJ1cHRpb24KICAqCWhlbmNlIHRoZSBwcmVzZW5jZSBvZiBhIExpbnV4IGNoZWNrCkBAIC04NzYsMTEgKzgzMCwxMCBAQAogCQlwcm9nICY9IH41OwogCQlwZGV2LT5jbGFzcyAmPSB+NTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19QUk9HLCBwcm9nKTsKLQkJLyogbmVlZCB0byByZS1hc3NpZ24gQkFScyBmb3IgY29tcGF0IG1vZGUgKi8KLQkJcXVpcmtfaWRlX2Jhc2VzKHBkZXYpOworCQkvKiBQQ0kgbGF5ZXIgd2lsbCBzb3J0IG91dCByZXNvdXJjZXMgKi8KIAl9CiB9Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SURFLCBxdWlya19zdndrc19jc2I1aWRlICk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUsIHF1aXJrX3N2d2tzX2NzYjVpZGUgKTsKIAogLyoKICAqCUludGVsIDgyODAxQ0FNIElDSDMtTSBkYXRhc2hlZXQgc2F5cyBJREUgbW9kZXMgbXVzdCBiZSB0aGUgc2FtZQpAQCAtODk2LDExICs4NDksOSBAQAogCQlwcm9nICY9IH41OwogCQlwZGV2LT5jbGFzcyAmPSB+NTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19QUk9HLCBwcm9nKTsKLQkJLyogbmVlZCB0byByZS1hc3NpZ24gQkFScyBmb3IgY29tcGF0IG1vZGUgKi8KLQkJcXVpcmtfaWRlX2Jhc2VzKHBkZXYpOwogCX0KIH0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTAsIHF1aXJrX2lkZV9zYW1lbW9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTAsIHF1aXJrX2lkZV9zYW1lbW9kZSk7CiAKIC8qIFRoaXMgd2FzIG9yaWdpbmFsbHkgYW4gQWxwaGEgc3BlY2lmaWMgdGhpbmcsIGJ1dCBpdCByZWFsbHkgZml0cyBoZXJlLgogICogVGhlIGk4MjM3NSBQQ0kvRUlTQSBicmlkZ2UgYXBwZWFycyBhcyBub24tY2xhc3NpZmllZC4gRml4IHRoYXQuCkBAIC0xNDU2LDMzICsxNDA3LDYgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsCTB4MjYwYSwgcXVpcmtfaW50ZWxfcGNpZV9wbSk7CiBERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAkweDI2MGIsIHF1aXJrX2ludGVsX3BjaWVfcG0pOwogCi0vKgotICogRml4dXAgdGhlIGNhcmRidXMgYnJpZGdlcyBvbiB0aGUgSUJNIERvY2sgSUkgZG9ja2luZyBzdGF0aW9uCi0gKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19pYm1fZG9jazJfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXUzMiB2YWw7Ci0KLQkvKgotCSAqIHRpZSB0aGUgMiBpbnRlcnJ1cHQgcGlucyB0byBJTlRBLCBhbmQgY29uZmlndXJlIHRoZQotCSAqIG11bHRpZnVuY3Rpb24gcm91dGluZyByZWdpc3RlciB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlpZiAoKGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lCTSkgJiYKLQkJKGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAxNDgpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBDSTogRm91bmQgSUJNIERvY2sgSUkgQ2FyZGJ1cyBCcmlkZ2UgIgotCQkJImFwcGx5aW5nIHF1aXJrXG4iKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg4YywgJnZhbCk7Ci0JCXZhbCA9ICgodmFsICYgMHhmZmZmZmYwMCkgfCAweDEwMDIpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg4YywgdmFsKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg4MCwgJnZhbCk7Ci0JCXZhbCA9ICgodmFsICYgMHgwMGZmZmYwMCkgfCAweDI4NjRjMDc3KTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4ODAsIHZhbCk7Ci0JfQotfQotCi1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9USSwgUENJX0RFVklDRV9JRF9USV8xNDIwLAotCQkJCXF1aXJrX2libV9kb2NrMl9jYXJkYnVzKTsKLQogc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX25ldG1vcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXVuc2lnbmVkIGludCBudW1fcGFyYWxsZWwgPSAoZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICYgMHhmMCkgPj4gNDsKQEAgLTE1ODgsNyArMTUxMiw2IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9OQ1IsIFBDSV9ERVZJQ0VfSURfTkNSXzUzQzgxMCwgZml4dXBfcmV2MV81M2M4MTApOwogCi0KIHN0YXRpYyB2b2lkIHBjaV9kb19maXh1cHMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9maXh1cCAqZiwgc3RydWN0IHBjaV9maXh1cCAqZW5kKQogewogCXdoaWxlIChmIDwgZW5kKSB7CkBAIC0xNzY0LDcgKzE2ODcsNyBAQAogCS8qIGNoZWNrIEhUIE1TSSBjYXAgb24gdGhpcyBjaGlwc2V0IGFuZCB0aGUgcm9vdCBvbmUuCiAJICogYSBzaW5nbGUgb25lIGhhdmluZyBNU0kgaXMgZW5vdWdoIHRvIGJlIHN1cmUgdGhhdCBNU0kgYXJlIHN1cHBvcnRlZC4KIAkgKi8KLQlwZGV2ID0gcGNpX2ZpbmRfc2xvdChkZXYtPmJ1cy0+bnVtYmVyLCAwKTsKKwlwZGV2ID0gcGNpX2dldF9zbG90KGRldi0+YnVzLCAwKTsKIAlpZiAoZGV2LT5zdWJvcmRpbmF0ZSAmJiAhbXNpX2h0X2NhcF9lbmFibGVkKGRldikKIAkgICAgJiYgIW1zaV9odF9jYXBfZW5hYmxlZChwZGV2KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IE1TSSBxdWlyayBkZXRlY3RlZC4gIgpAQCAtMTc3Miw2ICsxNjk1LDcgQEAKIAkJICAgICAgIHBjaV9uYW1lKGRldikpOwogCQlkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgfD0gUENJX0JVU19GTEFHU19OT19NU0k7CiAJfQorCXBjaV9kZXZfcHV0KHBkZXYpOwogfQogREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX0NLODA0X1BDSUUsCiAJCQlxdWlya19udmlkaWFfY2s4MDRfbXNpX2h0X2NhcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9yb20uYyBiL2RyaXZlcnMvcGNpL3JvbS5jCmluZGV4IGY1ZWU3Y2UuLmQwODdlMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JvbS5jCisrKyBiL2RyaXZlcnMvcGNpL3JvbS5jCkBAIC03MSwxMyArNzEsMTggQEAKIAl2b2lkIF9faW9tZW0gKmltYWdlOwogCWludCBsYXN0X2ltYWdlOwogCi0JLyogSU9SRVNPVVJDRV9ST01fU0hBRE9XIG9ubHkgc2V0IG9uIHg4NiAqLworCS8qCisJICogSU9SRVNPVVJDRV9ST01fU0hBRE9XIHNldCBvbiB4ODYsIHg4Nl82NCBhbmQgSUE2NCBzdXBwb3J0cyBsZWdhY3kKKwkgKiBtZW1vcnkgbWFwIGlmIHRoZSBWR0EgZW5hYmxlIGJpdCBvZiB0aGUgQnJpZGdlIENvbnRyb2wgcmVnaXN0ZXIgaXMKKwkgKiBzZXQgZm9yIGVtYmVkZGVkIFZHQS4KKwkgKi8KIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX1NIQURPVykgewogCQkvKiBwcmltYXJ5IHZpZGVvIHJvbSBhbHdheXMgc3RhcnRzIGhlcmUgKi8KIAkJc3RhcnQgPSAobG9mZl90KTB4QzAwMDA7CiAJCSpzaXplID0gMHgyMDAwMDsgLyogY292ZXIgQzAwMDowIHRocm91Z2ggRTAwMDowICovCiAJfSBlbHNlIHsKLQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9DT1BZKSB7CisJCWlmIChyZXMtPmZsYWdzICYKKwkJCShJT1JFU09VUkNFX1JPTV9DT1BZIHwgSU9SRVNPVVJDRV9ST01fQklPU19DT1BZKSkgewogCQkJKnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpOwogCQkJcmV0dXJuICh2b2lkIF9faW9tZW0gKikodW5zaWduZWQgbG9uZykKIAkJCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgUENJX1JPTV9SRVNPVVJDRSk7CkBAIC0xNjEsNyArMTY2LDggQEAKIAlpZiAoIXJvbSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzLT5mbGFncyAmIChJT1JFU09VUkNFX1JPTV9DT1BZIHwgSU9SRVNPVVJDRV9ST01fU0hBRE9XKSkKKwlpZiAocmVzLT5mbGFncyAmIChJT1JFU09VUkNFX1JPTV9DT1BZIHwgSU9SRVNPVVJDRV9ST01fU0hBRE9XIHwKKwkJCSAgSU9SRVNPVVJDRV9ST01fQklPU19DT1BZKSkKIAkJcmV0dXJuIHJvbTsKIAogCXJlcy0+c3RhcnQgPSAodW5zaWduZWQgbG9uZylrbWFsbG9jKCpzaXplLCBHRlBfS0VSTkVMKTsKQEAgLTE4Nyw3ICsxOTMsNyBAQAogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJnBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOwogCi0JaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9DT1BZKQorCWlmIChyZXMtPmZsYWdzICYgKElPUkVTT1VSQ0VfUk9NX0NPUFkgfCBJT1JFU09VUkNFX1JPTV9CSU9TX0NPUFkpKQogCQlyZXR1cm47CiAKIAlpb3VubWFwKHJvbSk7CkBAIC0yMTEsNiArMjE3LDcgQEAKIAkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgcGRldi0+cm9tX2F0dHIpOwogCWlmICghKHJlcy0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9ST01fRU5BQkxFIHwKIAkJCSAgICBJT1JFU09VUkNFX1JPTV9TSEFET1cgfAorCQkJICAgIElPUkVTT1VSQ0VfUk9NX0JJT1NfQ09QWSB8CiAJCQkgICAgSU9SRVNPVVJDRV9ST01fQ09QWSkpKQogCQlwY2lfZGlzYWJsZV9yb20ocGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZWFyY2guYyBiL2RyaXZlcnMvcGNpL3NlYXJjaC5jCmluZGV4IGQ1Mjk0NjIuLjJmMTNlYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jCisrKyBiL2RyaXZlcnMvcGNpL3NlYXJjaC5jCkBAIC0xNDAsNiArMTQwLDMxIEBACiB9CiAKIC8qKgorICogcGNpX2dldF9idXNfYW5kX3Nsb3QgLSBsb2NhdGUgUENJIGRldmljZSBmcm9tIGEgZ2l2ZW4gUENJIHNsb3QKKyAqIEBidXM6IG51bWJlciBvZiBQQ0kgYnVzIG9uIHdoaWNoIGRlc2lyZWQgUENJIGRldmljZSByZXNpZGVzCisgKiBAZGV2Zm46IGVuY29kZXMgbnVtYmVyIG9mIFBDSSBzbG90IGluIHdoaWNoIHRoZSBkZXNpcmVkIFBDSQorICogZGV2aWNlIHJlc2lkZXMgYW5kIHRoZSBsb2dpY2FsIGRldmljZSBudW1iZXIgd2l0aGluIHRoYXQgc2xvdAorICogaW4gY2FzZSBvZiBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzLgorICoKKyAqIEdpdmVuIGEgUENJIGJ1cyBhbmQgc2xvdC9mdW5jdGlvbiBudW1iZXIsIHRoZSBkZXNpcmVkIFBDSSBkZXZpY2UKKyAqIGlzIGxvY2F0ZWQgaW4gc3lzdGVtIGdsb2JhbCBsaXN0IG9mIFBDSSBkZXZpY2VzLiAgSWYgdGhlIGRldmljZQorICogaXMgZm91bmQsIGEgcG9pbnRlciB0byBpdHMgZGF0YSBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuICBJZiBubworICogZGV2aWNlIGlzIGZvdW5kLCAlTlVMTCBpcyByZXR1cm5lZC4gVGhlIHJldHVybmVkIGRldmljZSBoYXMgaXRzCisgKiByZWZlcmVuY2UgY291bnQgYnVtcGVkIGJ5IG9uZS4KKyAqLworCitzdHJ1Y3QgcGNpX2RldiAqIHBjaV9nZXRfYnVzX2FuZF9zbG90KHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKworCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCQlpZiAoZGV2LT5idXMtPm51bWJlciA9PSBidXMgJiYgZGV2LT5kZXZmbiA9PSBkZXZmbikKKwkJCXJldHVybiBkZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKICAqIHBjaV9maW5kX3N1YnN5cyAtIGJlZ2luIG9yIGNvbnRpbnVlIHNlYXJjaGluZyBmb3IgYSBQQ0kgZGV2aWNlIGJ5IHZlbmRvci9zdWJ2ZW5kb3IvZGV2aWNlL3N1YmRldmljZSBpZAogICogQHZlbmRvcjogUENJIHZlbmRvciBpZCB0byBtYXRjaCwgb3IgJVBDSV9BTllfSUQgdG8gbWF0Y2ggYWxsIHZlbmRvciBpZHMKICAqIEBkZXZpY2U6IFBDSSBkZXZpY2UgaWQgdG8gbWF0Y2gsIG9yICVQQ0lfQU5ZX0lEIHRvIG1hdGNoIGFsbCBkZXZpY2UgaWRzCkBAIC0yNzQsNiArMjk5LDQ1IEBACiAJcmV0dXJuIHBjaV9nZXRfc3Vic3lzKHZlbmRvciwgZGV2aWNlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBmcm9tKTsKIH0KIAorLyoqCisgKiBwY2lfZ2V0X2RldmljZV9yZXZlcnNlIC0gYmVnaW4gb3IgY29udGludWUgc2VhcmNoaW5nIGZvciBhIFBDSSBkZXZpY2UgYnkgdmVuZG9yL2RldmljZSBpZAorICogQHZlbmRvcjogUENJIHZlbmRvciBpZCB0byBtYXRjaCwgb3IgJVBDSV9BTllfSUQgdG8gbWF0Y2ggYWxsIHZlbmRvciBpZHMKKyAqIEBkZXZpY2U6IFBDSSBkZXZpY2UgaWQgdG8gbWF0Y2gsIG9yICVQQ0lfQU5ZX0lEIHRvIG1hdGNoIGFsbCBkZXZpY2UgaWRzCisgKiBAZnJvbTogUHJldmlvdXMgUENJIGRldmljZSBmb3VuZCBpbiBzZWFyY2gsIG9yICVOVUxMIGZvciBuZXcgc2VhcmNoLgorICoKKyAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGxpc3Qgb2Yga25vd24gUENJIGRldmljZXMgaW4gdGhlIHJldmVyc2Ugb3JkZXIgb2YKKyAqIHBjaV9nZXRfZGV2aWNlLgorICogSWYgYSBQQ0kgZGV2aWNlIGlzIGZvdW5kIHdpdGggYSBtYXRjaGluZyBAdmVuZG9yIGFuZCBAZGV2aWNlLCB0aGUgcmVmZXJlbmNlCisgKiBjb3VudCB0byB0aGUgIGRldmljZSBpcyBpbmNyZW1lbnRlZCBhbmQgYSBwb2ludGVyIHRvIGl0cyBkZXZpY2Ugc3RydWN0dXJlCisgKiBpcyByZXR1cm5lZCBPdGhlcndpc2UsICVOVUxMIGlzIHJldHVybmVkLiAgQSBuZXcgc2VhcmNoIGlzIGluaXRpYXRlZCBieQorICogcGFzc2luZyAlTlVMTCBhcyB0aGUgQGZyb20gYXJndW1lbnQuICBPdGhlcndpc2UgaWYgQGZyb20gaXMgbm90ICVOVUxMLAorICogc2VhcmNoZXMgY29udGludWUgZnJvbSBuZXh0IGRldmljZSBvbiB0aGUgZ2xvYmFsIGxpc3QuICBUaGUgcmVmZXJlbmNlCisgKiBjb3VudCBmb3IgQGZyb20gaXMgYWx3YXlzIGRlY3JlbWVudGVkIGlmIGl0IGlzIG5vdCAlTlVMTC4KKyAqLworc3RydWN0IHBjaV9kZXYgKgorcGNpX2dldF9kZXZpY2VfcmV2ZXJzZSh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKKwlkb3duX3JlYWQoJnBjaV9idXNfc2VtKTsKKwluID0gZnJvbSA/IGZyb20tPmdsb2JhbF9saXN0LnByZXYgOiBwY2lfZGV2aWNlcy5wcmV2OworCisJd2hpbGUgKG4gJiYgKG4gIT0gJnBjaV9kZXZpY2VzKSkgeworCQlkZXYgPSBwY2lfZGV2X2cobik7CisJCWlmICgodmVuZG9yID09IFBDSV9BTllfSUQgfHwgZGV2LT52ZW5kb3IgPT0gdmVuZG9yKSAmJgorCQkgICAgKGRldmljZSA9PSBQQ0lfQU5ZX0lEIHx8IGRldi0+ZGV2aWNlID09IGRldmljZSkpCisJCQlnb3RvIGV4aXQ7CisJCW4gPSBuLT5wcmV2OworCX0KKwlkZXYgPSBOVUxMOworZXhpdDoKKwlkZXYgPSBwY2lfZGV2X2dldChkZXYpOworCXVwX3JlYWQoJnBjaV9idXNfc2VtKTsKKwlwY2lfZGV2X3B1dChmcm9tKTsKKwlyZXR1cm4gZGV2OworfQogCiAvKioKICAqIHBjaV9maW5kX2RldmljZV9yZXZlcnNlIC0gYmVnaW4gb3IgY29udGludWUgc2VhcmNoaW5nIGZvciBhIFBDSSBkZXZpY2UgYnkgdmVuZG9yL2RldmljZSBpZApAQCAtMzgyLDEyICs0NDYsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpX2Rldl9wcmVzZW50KTsKIAotRVhQT1JUX1NZTUJPTChwY2lfZmluZF9idXMpOwotRVhQT1JUX1NZTUJPTChwY2lfZmluZF9uZXh0X2J1cyk7CiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX2RldmljZV9yZXZlcnNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX2ZpbmRfc2xvdCk7CisvKiBGb3IgYm9vdCB0aW1lIHdvcmsgKi8KK0VYUE9SVF9TWU1CT0wocGNpX2ZpbmRfYnVzKTsKK0VYUE9SVF9TWU1CT0wocGNpX2ZpbmRfbmV4dF9idXMpOworLyogRm9yIGV2ZXJ5b25lICovCiBFWFBPUlRfU1lNQk9MKHBjaV9nZXRfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0wocGNpX2dldF9kZXZpY2VfcmV2ZXJzZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9nZXRfc3Vic3lzKTsKIEVYUE9SVF9TWU1CT0wocGNpX2dldF9zbG90KTsKK0VYUE9SVF9TWU1CT0wocGNpX2dldF9idXNfYW5kX3Nsb3QpOwogRVhQT1JUX1NZTUJPTChwY2lfZ2V0X2NsYXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F0OTFfY2YuYyBiL2RyaXZlcnMvcGNtY2lhL2F0OTFfY2YuYwppbmRleCA3ZjVkZjlhLi4zMzM0ZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdDkxX2NmLmMKKysrIGIvZHJpdmVycy9wY21jaWEvYXQ5MV9jZi5jCkBAIC0yMywxOSArMjMsMjAgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KIAotI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFybTkyMDAuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxcm05MjAwX21jLmg+CiAKIAogLyoKICAqIEEwLi5BMTAgd29yayBpbiBlYWNoIHJhbmdlOyBBMjMgaW5kaWNhdGVzIEkvTyBzcGFjZTsgIEEyNSBpcyBDRlJOVzsKICAqIHNvbWUgb3RoZXIgYml0IGluIHtBMjQsQTIyLi5BMTF9IGlzIG5SRUcgdG8gZmxhZyBtZW1vcnkgYWNjZXNzCiAgKiAodnMgYXR0cmlidXRlcykuICBTbyBtb3JlIHRoYW4gMktCL3JlZ2lvbiB3b3VsZCBqdXN0IGJlIHdhc3RlLgorICogTm90ZTogVGhlc2UgYXJlIG9mZnNldHMgZnJvbSB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzLgogICovCi0jZGVmaW5lCUNGX0FUVFJfUEhZUwkoQVQ5MV9DRl9CQVNFKQotI2RlZmluZQlDRl9JT19QSFlTCShBVDkxX0NGX0JBU0UgICsgKDEgPDwgMjMpKQotI2RlZmluZQlDRl9NRU1fUEhZUwkoQVQ5MV9DRl9CQVNFICArIDB4MDE3ZmY4MDApCisjZGVmaW5lCUNGX0FUVFJfUEhZUwkoMCkKKyNkZWZpbmUJQ0ZfSU9fUEhZUwkoMSA8PCAyMykKKyNkZWZpbmUJQ0ZfTUVNX1BIWVMJKDB4MDE3ZmY4MDApCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC00OCw2ICs0OSw4IEBACiAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OwogCXN0cnVjdCBhdDkxX2NmX2RhdGEJKmJvYXJkOworCisJdW5zaWduZWQgbG9uZwkJcGh5c19iYXNlYWRkcjsKIH07CiAKICNkZWZpbmUJU1pfMksJCQkoMiAqIFNaXzFLKQpAQCAtMTU0LDkgKzE1Nyw4IEBACiAKIAkvKgogCSAqIFVzZSAxNiBiaXQgYWNjZXNzZXMgdW5sZXNzL3VudGlsIHdlIG5lZWQgOC1iaXQgaS9vIHNwYWNlLgotCSAqIEFsd2F5cyBzZXQgQ1NSNCAuLi4gUENNQ0lBIHdvbid0IGFsd2F5cyB1bm1hcCB0aGluZ3MuCiAJICovCi0JY3NyID0gYXQ5MV9zeXNfcmVhZChBVDkxX1NNQ19DU1IoNCkpICYgfkFUOTFfU01DX0RCVzsKKwljc3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfU01DX0NTUihjZi0+Ym9hcmQtPmNoaXBzZWxlY3QpKSAmIH5BVDkxX1NNQ19EQlc7CiAKIAkvKgogCSAqIE5PVEU6IHRoaXMgQ0YgY29udHJvbGxlciBpZ25vcmVzIElPSVMxNiwgc28gd2UgY2FuJ3QgcmVhbGx5IGRvCkBAIC0xNjgsMTQgKzE3MCwxNCBAQAogCSAqIHNvbWUgY2FyZHMgb25seSBsaWtlIHRoYXQgd2F5IHRvIGdldCBhdCB0aGUgb2RkIGJ5dGUsIGRlc3BpdGUKIAkgKiBDRiAzLjAgc3BlYyB0YWJsZSAzNSBhbHNvIGdpdmluZyB0aGUgRDgtRDE1IG9wdGlvbi4KIAkgKi8KLQlpZiAoIShpby0+ZmxhZ3MgJiAoTUFQXzE2QklUfE1BUF9BVVRPU1opKSkgeworCWlmICghKGlvLT5mbGFncyAmIChNQVBfMTZCSVQgfCBNQVBfQVVUT1NaKSkpIHsKIAkJY3NyIHw9IEFUOTFfU01DX0RCV184OwogCQlwcl9kZWJ1ZygiJXM6IDhiaXQgaS9vIGJ1c1xuIiwgZHJpdmVyX25hbWUpOwogCX0gZWxzZSB7CiAJCWNzciB8PSBBVDkxX1NNQ19EQldfMTY7CiAJCXByX2RlYnVnKCIlczogMTZiaXQgaS9vIGJ1c1xuIiwgZHJpdmVyX25hbWUpOwogCX0KLQlhdDkxX3N5c193cml0ZShBVDkxX1NNQ19DU1IoNCksIGNzcik7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TTUNfQ1NSKGNmLT5ib2FyZC0+Y2hpcHNlbGVjdCksIGNzcik7CiAKIAlpby0+c3RhcnQgPSBjZi0+c29ja2V0LmlvX29mZnNldDsKIAlpby0+c3RvcCA9IGlvLT5zdGFydCArIFNaXzJLIC0gMTsKQEAgLTE5NCwxMSArMTk2LDExIEBACiAKIAljZiA9IGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3QgYXQ5MV9jZl9zb2NrZXQsIHNvY2tldCk7CiAKLQltYXAtPmZsYWdzICY9IE1BUF9BQ1RJVkV8TUFQX0FUVFJJQnxNQVBfMTZCSVQ7CisJbWFwLT5mbGFncyAmPSAoTUFQX0FDVElWRSB8IE1BUF9BVFRSSUIgfCBNQVBfMTZCSVQpOwogCWlmIChtYXAtPmZsYWdzICYgTUFQX0FUVFJJQikKLQkJbWFwLT5zdGF0aWNfc3RhcnQgPSBDRl9BVFRSX1BIWVM7CisJCW1hcC0+c3RhdGljX3N0YXJ0ID0gY2YtPnBoeXNfYmFzZWFkZHIgKyBDRl9BVFRSX1BIWVM7CiAJZWxzZQotCQltYXAtPnN0YXRpY19zdGFydCA9IENGX01FTV9QSFlTOworCQltYXAtPnN0YXRpY19zdGFydCA9IGNmLT5waHlzX2Jhc2VhZGRyICsgQ0ZfTUVNX1BIWVM7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxOSw3ICsyMjEsNiBAQAogCXN0cnVjdCBhdDkxX2NmX3NvY2tldAkqY2Y7CiAJc3RydWN0IGF0OTFfY2ZfZGF0YQkqYm9hcmQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSppbzsKLQl1bnNpZ25lZCBpbnQJCWNzYTsKIAlpbnQJCQlzdGF0dXM7CiAKIAlpZiAoIWJvYXJkIHx8ICFib2FyZC0+ZGV0X3BpbiB8fCAhYm9hcmQtPnJzdF9waW4pCkBAIC0yMjksNDUgKzIzMCwxNyBAQAogCWlmICghaW8pCiAJCXJldHVybiAtRU5PREVWOwogCi0JY2YgPSBrY2FsbG9jKDEsIHNpemVvZiAqY2YsIEdGUF9LRVJORUwpOworCWNmID0ga3phbGxvYyhzaXplb2YgKmNmLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNmKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNmLT5ib2FyZCA9IGJvYXJkOwogCWNmLT5wZGV2ID0gcGRldjsKKwljZi0+cGh5c19iYXNlYWRkciA9IGlvLT5zdGFydDsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjZik7CiAKLQkvKiBDRiB0YWtlcyBvdmVyIENTNCwgQ1M1LCBDUzYgKi8KLQljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfRUJJX0NTQSk7Ci0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9FQklfQ1NBLCBjc2EgfCBBVDkxX0VCSV9DUzRBX1NNQ19DT01QQUNURkxBU0gpOwotCi0JLyogZm9yY2UgcG93ZXJvbiBkZWZhdWx0cyBmb3IgdGhlc2UgcGlucyAuLi4gKi8KLQkodm9pZCkgYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEM5LCAwKTsJLyogQTI1L0NGUk5XICovCi0JKHZvaWQpIGF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDMTAsIDApOwkvKiBOQ1M0L0NGQ1MgKi8KLQkodm9pZCkgYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxMSwgMCk7CS8qIE5DUzUvQ0ZDRTEgKi8KLQkodm9pZCkgYXQ5MV9zZXRfQV9wZXJpcGgoQVQ5MV9QSU5fUEMxMiwgMCk7CS8qIE5DUzYvQ0ZDRTIgKi8KLQotCS8qIG5XQUlUIGlzIF9ub3RfIGEgZGVmYXVsdCBzZXR0aW5nICovCi0JKHZvaWQpIGF0OTFfc2V0X0FfcGVyaXBoKEFUOTFfUElOX1BDNiwgMSk7CS8qICBuV0FJVCAqLwotCi0JLyoKLQkgKiBTdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIgdGltaW5nIGFkanVzdG1lbnRzLgotCSAqIFJFVklTSVQ6ICB0aGVzZSB0aW1pbmdzIGFyZSBpbiB0ZXJtcyBvZiBNQ0sgY3ljbGVzLCBzbwotCSAqIHdoZW4gTUNLIGNoYW5nZXMgKGNwdWZyZXEgZXRjKSBzbyBtdXN0IHRoZXNlIHZhbHVlcy4uLgotCSAqLwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU01DX0NTUig0KSwKLQkJCQkgIEFUOTFfU01DX0FDU1NfU1RECi0JCQkJfCBBVDkxX1NNQ19EQldfMTYKLQkJCQl8IEFUOTFfU01DX0JBVAotCQkJCXwgQVQ5MV9TTUNfV1NFTgotCQkJCXwgQVQ5MV9TTUNfTldTXygzMikJLyogd2FpdCBzdGF0ZXMgKi8KLQkJCQl8IEFUOTFfU01DX1JXU0VUVVBfKDYpCS8qIHNldHVwIHRpbWUgKi8KLQkJCQl8IEFUOTFfU01DX1JXSE9MRF8oNCkJLyogaG9sZCB0aW1lICovCi0JKTsKLQogCS8qIG11c3QgYmUgYSBHUElPOyBlcmdvIG11c3QgdHJpZ2dlciBvbiBib3RoIGVkZ2VzICovCi0Jc3RhdHVzID0gcmVxdWVzdF9pcnEoYm9hcmQtPmRldF9waW4sIGF0OTFfY2ZfaXJxLAotCQkJSVJRRl9TQU1QTEVfUkFORE9NLCBkcml2ZXJfbmFtZSwgY2YpOworCXN0YXR1cyA9IHJlcXVlc3RfaXJxKGJvYXJkLT5kZXRfcGluLCBhdDkxX2NmX2lycSwgMCwgZHJpdmVyX25hbWUsIGNmKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBmYWlsMDsKIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CkBAIC0yODgsMTQgKzI2MSwxOCBAQAogCQljZi0+c29ja2V0LnBjaV9pcnEgPSBOUl9JUlFTICsgMTsKIAogCS8qIHBjbWNpYSBsYXllciBvbmx5IHJlbWFwcyAicmVhbCIgbWVtb3J5IG5vdCBpb3NwYWNlICovCi0JY2YtPnNvY2tldC5pb19vZmZzZXQgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChDRl9JT19QSFlTLCBTWl8ySyk7Ci0JaWYgKCFjZi0+c29ja2V0LmlvX29mZnNldCkKKwljZi0+c29ja2V0LmlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKGNmLT5waHlzX2Jhc2VhZGRyICsgQ0ZfSU9fUEhZUywgU1pfMkspOworCWlmICghY2YtPnNvY2tldC5pb19vZmZzZXQpIHsKKwkJc3RhdHVzID0gLUVOWElPOwogCQlnb3RvIGZhaWwxOworCX0KIAotCS8qIHJlc2VydmUgQ1M0LCBDUzUsIGFuZCBDUzYgcmVnaW9uczsgYnV0IHVzZSBqdXN0IENTNCAqLworCS8qIHJlc2VydmUgY2hpcC1zZWxlY3QgcmVnaW9ucyAqLwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvLT5zdGFydCwgaW8tPmVuZCArIDEgLSBpby0+c3RhcnQsCi0JCQkJZHJpdmVyX25hbWUpKQorCQkJCWRyaXZlcl9uYW1lKSkgeworCQlzdGF0dXMgPSAtRU5YSU87CiAJCWdvdG8gZmFpbDE7CisJfQogCiAJcHJfaW5mbygiJXM6IGlycXMgZGV0ICMlZCwgaW8gIyVkXG4iLCBkcml2ZXJfbmFtZSwKIAkJYm9hcmQtPmRldF9waW4sIGJvYXJkLT5pcnFfcGluKTsKQEAgLTMxNiwxNiArMjkzLDE2IEBACiAJcmV0dXJuIDA7CiAKIGZhaWwyOgotCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBjZi0+c29ja2V0LmlvX29mZnNldCk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGlvLT5zdGFydCwgaW8tPmVuZCArIDEgLSBpby0+c3RhcnQpOwogZmFpbDE6CisJaWYgKGNmLT5zb2NrZXQuaW9fb2Zmc2V0KQorCQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKikgY2YtPnNvY2tldC5pb19vZmZzZXQpOwogCWlmIChib2FyZC0+aXJxX3BpbikKIAkJZnJlZV9pcnEoYm9hcmQtPmlycV9waW4sIGNmKTsKIGZhaWwwYToKLQlmcmVlX2lycShib2FyZC0+ZGV0X3BpbiwgY2YpOwogCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKKwlmcmVlX2lycShib2FyZC0+ZGV0X3BpbiwgY2YpOwogZmFpbDA6Ci0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9FQklfQ1NBLCBjc2EpOwogCWtmcmVlKGNmKTsKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMzM1LDE5ICszMTIsMTUgQEAKIAlzdHJ1Y3QgYXQ5MV9jZl9zb2NrZXQJKmNmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGF0OTFfY2ZfZGF0YQkqYm9hcmQgPSBjZi0+Ym9hcmQ7CiAJc3RydWN0IHJlc291cmNlCQkqaW8gPSBjZi0+c29ja2V0LmlvWzBdLnJlczsKLQl1bnNpZ25lZCBpbnQJCWNzYTsKIAogCXBjbWNpYV91bnJlZ2lzdGVyX3NvY2tldCgmY2YtPnNvY2tldCk7CiAJaWYgKGJvYXJkLT5pcnFfcGluKQogCQlmcmVlX2lycShib2FyZC0+aXJxX3BpbiwgY2YpOwotCWZyZWVfaXJxKGJvYXJkLT5kZXRfcGluLCBjZik7CiAJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDApOworCWZyZWVfaXJxKGJvYXJkLT5kZXRfcGluLCBjZik7CiAJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGNmLT5zb2NrZXQuaW9fb2Zmc2V0KTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaW8tPnN0YXJ0LCBpby0+ZW5kICsgMSAtIGlvLT5zdGFydCk7CiAKLQljc2EgPSBhdDkxX3N5c19yZWFkKEFUOTFfRUJJX0NTQSk7Ci0JYXQ5MV9zeXNfd3JpdGUoQVQ5MV9FQklfQ1NBLCBjc2EgJiB+QVQ5MV9FQklfQ1M0QSk7Ci0KIAlrZnJlZShjZik7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNjAsMjYgKzMzMywyMCBAQAogCXN0cnVjdCBhdDkxX2NmX2RhdGEJKmJvYXJkID0gY2YtPmJvYXJkOwogCiAJcGNtY2lhX3NvY2tldF9kZXZfc3VzcGVuZCgmcGRldi0+ZGV2LCBtZXNnKTsKLQlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKSB7CiAJCWVuYWJsZV9pcnFfd2FrZShib2FyZC0+ZGV0X3Bpbik7Ci0JZWxzZSB7CisJCWlmIChib2FyZC0+aXJxX3BpbikKKwkJCWVuYWJsZV9pcnFfd2FrZShib2FyZC0+aXJxX3Bpbik7CisJfSBlbHNlIHsKIAkJZGlzYWJsZV9pcnFfd2FrZShib2FyZC0+ZGV0X3Bpbik7Ci0JCWRpc2FibGVfaXJxKGJvYXJkLT5kZXRfcGluKTsKKwkJaWYgKGJvYXJkLT5pcnFfcGluKQorCQkJZGlzYWJsZV9pcnFfd2FrZShib2FyZC0+aXJxX3Bpbik7CiAJfQotCWlmIChib2FyZC0+aXJxX3BpbikKLQkJZGlzYWJsZV9pcnEoYm9hcmQtPmlycV9waW4pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGF0OTFfY2ZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGF0OTFfY2Zfc29ja2V0CSpjZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBhdDkxX2NmX2RhdGEJKmJvYXJkID0gY2YtPmJvYXJkOwotCi0JaWYgKGJvYXJkLT5pcnFfcGluKQotCQllbmFibGVfaXJxKGJvYXJkLT5pcnFfcGluKTsKLQlpZiAoIWRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQotCQllbmFibGVfaXJxKGJvYXJkLT5kZXRfcGluKTsKIAlwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUoJnBkZXYtPmRldik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5jIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX2dlbmVyaWMuYwppbmRleCBkNWRkMGNlLi41NTFiZGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmMKQEAgLTM1MSw2ICszNTEsNyBAQAogaW50IGF1MXgwMF9wY21jaWFfc29ja2V0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcywgaW50IGZpcnN0LCBpbnQgbnIpCiB7CiAJc3RydWN0IHNrdF9kZXZfaW5mbyAqc2luZm87CisJc3RydWN0IGF1MTAwMF9wY21jaWFfc29ja2V0ICpza3Q7CiAJaW50IHJldCwgaTsKIAogCXNpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNrdF9kZXZfaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtMzY1LDcgKzM2Niw3IEBACiAJICogSW5pdGlhbGlzZSB0aGUgcGVyLXNvY2tldCBzdHJ1Y3R1cmUuCiAJICovCiAJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKLQkJc3RydWN0IGF1MTAwMF9wY21jaWFfc29ja2V0ICpza3QgPSBQQ01DSUFfU09DS0VUKGkpOworCQlza3QgPSBQQ01DSUFfU09DS0VUKGkpOwogCQltZW1zZXQoc2t0LCAwLCBzaXplb2YoKnNrdCkpOwogCiAJCXNrdC0+c29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfc3RhdGljX29wczsKQEAgLTQzOCwxNyArNDM5LDI5IEBACiAJZGV2X3NldF9kcnZkYXRhKGRldiwgc2luZm8pOwogCXJldHVybiAwOwogCi0JZG8gewotCQlzdHJ1Y3QgYXUxMDAwX3BjbWNpYV9zb2NrZXQgKnNrdCA9IFBDTUNJQV9TT0NLRVQoaSk7CisKK291dF9lcnI6CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlvcHMtPmh3X3NodXRkb3duKHNrdCk7CisJd2hpbGUgKGktLSA+IDApIHsKKwkJc2t0ID0gUENNQ0lBX1NPQ0tFVChpKTsKIAogCQlkZWxfdGltZXJfc3luYygmc2t0LT5wb2xsX3RpbWVyKTsKIAkJcGNtY2lhX3VucmVnaXN0ZXJfc29ja2V0KCZza3QtPnNvY2tldCk7Ci1vdXRfZXJyOgogCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCQlpZiAoaSA9PSAwKSB7CisJCQlpb3VubWFwKHNrdC0+dmlydF9pbyArICh1MzIpbWlwc19pb19wb3J0X2Jhc2UpOworCQkJc2t0LT52aXJ0X2lvID0gTlVMTDsKKwkJfQorI2lmbmRlZiBDT05GSUdfTUlQU19YWFMxNTAwCisJCWVsc2UgeworCQkJaW91bm1hcChza3QtPnZpcnRfaW8gKyAodTMyKW1pcHNfaW9fcG9ydF9iYXNlKTsKKwkJCXNrdC0+dmlydF9pbyA9IE5VTEw7CisJCX0KKyNlbmRpZgogCQlvcHMtPmh3X3NodXRkb3duKHNrdCk7CiAKLQkJaS0tOwotCX0gd2hpbGUgKGkgPiAwKTsKKwl9CiAJa2ZyZWUoc2luZm8pOwogb3V0OgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jcy5jIGIvZHJpdmVycy9wY21jaWEvY3MuYwppbmRleCBmOWNkODMxLi42MDZhNDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmggYi9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCmluZGV4IGQ2MTY0Y2QuLmY1NzNlYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaApAQCAtMTM1LDcgKzEzNSw3IEBACiBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrewogCXN0cnVjdCBtb2R1bGUJKm93bmVyOwogCWludAkJKCpldmVudCkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHkpOwotCXZvaWQJCSgqcmVxdWVyeSkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKKwl2b2lkCQkoKnJlcXVlcnkpIChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IG5ld19jaXMpOwogCWludAkJKCpzdXNwZW5kKSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwogCWludAkJKCpyZXN1bWUpIChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvZHMuYyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKaW5kZXggNzRiMzEyNC4uNzM1NWViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZHMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCkBAIC0yMzEsNjUgKzIzMSw2IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19QQ01DSUFfTE9BRF9DSVMKLQotLyoqCi0gKiBwY21jaWFfbG9hZF9maXJtd2FyZSAtIGxvYWQgQ0lTIGZyb20gdXNlcnNwYWNlIGlmIGRldmljZS1wcm92aWRlZCBpcyBicm9rZW4KLSAqIEBkZXYgLSB0aGUgcGNtY2lhIGRldmljZSB3aGljaCBuZWVkcyBhIENJUyBvdmVycmlkZQotICogQGZpbGVuYW1lIC0gcmVxdWVzdGVkIGZpbGVuYW1lIGluIC9saWIvZmlybXdhcmUvCi0gKgotICogVGhpcyB1c2VzIHRoZSBpbi1rZXJuZWwgZmlybXdhcmUgbG9hZGluZyBtZWNoYW5pc20gdG8gdXNlIGEgImZha2UgQ0lTIiBpZgotICogdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgY2FyZCBpcyBicm9rZW4uIFRoZSBmaXJtd2FyZSBmaWxlcyByZXNpZGUgaW4KLSAqIC9saWIvZmlybXdhcmUvIGluIHVzZXJzcGFjZS4KLSAqLwotc3RhdGljIGludCBwY21jaWFfbG9hZF9maXJtd2FyZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqZGV2LCBjaGFyICogZmlsZW5hbWUpCi17Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBkZXYtPnNvY2tldDsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCWNoYXIgcGF0aFsyMF07Ci0JaW50IHJldD0tRU5PTUVNOwotCWNpc2R1bXBfdCAqY2lzOwotCi0JaWYgKCFmaWxlbmFtZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkc19kYmcoMSwgInRyeWluZyB0byBsb2FkIGZpcm13YXJlICVzXG4iLCBmaWxlbmFtZSk7Ci0KLQlpZiAoc3RybGVuKGZpbGVuYW1lKSA+IDE0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNucHJpbnRmKHBhdGgsIDIwLCAiJXMiLCBmaWxlbmFtZSk7Ci0KLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIHBhdGgsICZkZXYtPmRldikgPT0gMCkgewotCQlpZiAoZnctPnNpemUgPj0gQ0lTVFBMX01BWF9DSVNfU0laRSkKLQkJCWdvdG8gcmVsZWFzZTsKLQotCQljaXMgPSBremFsbG9jKHNpemVvZihjaXNkdW1wX3QpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjaXMpCi0JCQlnb3RvIHJlbGVhc2U7Ci0KLQkJY2lzLT5MZW5ndGggPSBmdy0+c2l6ZSArIDE7Ci0JCW1lbWNweShjaXMtPkRhdGEsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7Ci0KLQkJaWYgKCFwY21jaWFfcmVwbGFjZV9jaXMocywgY2lzKSkKLQkJCXJldCA9IDA7Ci0JfQotIHJlbGVhc2U6Ci0JcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0KLQlyZXR1cm4gKHJldCk7Ci19Ci0KLSNlbHNlIC8qICFDT05GSUdfUENNQ0lBX0xPQURfQ0lTICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHBjbWNpYV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBwY21jaWFfZGV2aWNlICpkZXYsIGNoYXIgKiBmaWxlbmFtZSkKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotI2VuZGlmCi0KLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogCkBAIC0zMDksNiArMjUwLDggQEAKIAlkcml2ZXItPmRydi5idXMgPSAmcGNtY2lhX2J1c190eXBlOwogCWRyaXZlci0+ZHJ2Lm93bmVyID0gZHJpdmVyLT5vd25lcjsKIAorCWRzX2RiZygzLCAicmVnaXN0ZXJpbmcgZHJpdmVyICVzXG4iLCBkcml2ZXItPmRydi5uYW1lKTsKKwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3JlZ2lzdGVyX2RyaXZlcik7CkBAIC0zMTgsNiArMjYxLDcgQEAKICAqLwogdm9pZCBwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjbWNpYV9kcml2ZXIgKmRyaXZlcikKIHsKKwlkc19kYmcoMywgInVucmVnaXN0ZXJpbmcgZHJpdmVyICVzXG4iLCBkcml2ZXItPmRydi5uYW1lKTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcnYpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIpOwpAQCAtMzQzLDIzICsyODcsMjcgQEAKIHN0YXRpYyB2b2lkIHBjbWNpYV9yZWxlYXNlX2Z1bmN0aW9uKHN0cnVjdCBrcmVmICpyZWYpCiB7CiAJc3RydWN0IGNvbmZpZ190ICpjID0gY29udGFpbmVyX29mKHJlZiwgc3RydWN0IGNvbmZpZ190LCByZWYpOworCWRzX2RiZygxLCAicmVsZWFzaW5nIGNvbmZpZ190XG4iKTsKIAlrZnJlZShjKTsKIH0KIAogc3RhdGljIHZvaWQgcGNtY2lhX3JlbGVhc2VfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7Ci0JZHNfZGJnKDEsICJyZWxlYXNpbmcgZGV2ICVwXG4iLCBwX2Rldik7CisJZHNfZGJnKDEsICJyZWxlYXNpbmcgZGV2aWNlICVzXG4iLCBwX2Rldi0+ZGV2LmJ1c19pZCk7CiAJcGNtY2lhX3B1dF9zb2NrZXQocF9kZXYtPnNvY2tldCk7CiAJa2ZyZWUocF9kZXYtPmRldm5hbWUpOwogCWtyZWZfcHV0KCZwX2Rldi0+ZnVuY3Rpb25fY29uZmlnLT5yZWYsIHBjbWNpYV9yZWxlYXNlX2Z1bmN0aW9uKTsKIAlrZnJlZShwX2Rldik7CiB9CiAKLXN0YXRpYyB2b2lkIHBjbWNpYV9hZGRfcHNldWRvX2RldmljZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3N0YXRpYyB2b2lkIHBjbWNpYV9hZGRfZGV2aWNlX2xhdGVyKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgbWZjKQogewogCWlmICghcy0+cGNtY2lhX3N0YXRlLmRldmljZV9hZGRfcGVuZGluZykgeworCQlkc19kYmcoMSwgInNjaGVkdWxpbmcgdG8gYWRkICVzIHNlY29uZGFyeSIKKwkJICAgICAgICIgZGV2aWNlIHRvICVkXG4iLCBtZmMgPyAibWZjIiA6ICJwZmMiLCBzLT5zb2NrKTsKIAkJcy0+cGNtY2lhX3N0YXRlLmRldmljZV9hZGRfcGVuZGluZyA9IDE7CisJCXMtPnBjbWNpYV9zdGF0ZS5tZmNfcGZjID0gbWZjOwogCQlzY2hlZHVsZV93b3JrKCZzLT5kZXZpY2VfYWRkKTsKIAl9CiAJcmV0dXJuOwpAQCAtMzcxLDYgKzMxOSw3IEBACiAJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2OwogCXN0cnVjdCBwY21jaWFfZGV2aWNlX2lkICpkaWQ7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisJY2lzdHBsX2NvbmZpZ190IGNpc19jb25maWc7CiAJaW50IHJldCA9IDA7CiAKIAlkZXYgPSBnZXRfZGV2aWNlKGRldik7CkBAIC0zODEsMTUgKzMzMCwzMyBAQAogCXBfZHJ2ID0gdG9fcGNtY2lhX2RydihkZXYtPmRyaXZlcik7CiAJcyA9IHBfZGV2LT5zb2NrZXQ7CiAKKwlkc19kYmcoMSwgInRyeWluZyB0byBiaW5kICVzIHRvICVzXG4iLCBwX2Rldi0+ZGV2LmJ1c19pZCwKKwkgICAgICAgcF9kcnYtPmRydi5uYW1lKTsKKwogCWlmICgoIXBfZHJ2LT5wcm9iZSkgfHwgKCFwX2Rldi0+ZnVuY3Rpb25fY29uZmlnKSB8fAogCSAgICAoIXRyeV9tb2R1bGVfZ2V0KHBfZHJ2LT5vd25lcikpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gcHV0X2RldjsKIAl9CiAKKwkvKiBzZXQgdXAgc29tZSBtb3JlIGRldmljZSBpbmZvcm1hdGlvbiAqLworCXJldCA9IHBjY2FyZF9yZWFkX3R1cGxlKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLCBDSVNUUExfQ09ORklHLAorCQkJCSZjaXNfY29uZmlnKTsKKwlpZiAoIXJldCkgeworCQlwX2Rldi0+Y29uZi5Db25maWdCYXNlID0gY2lzX2NvbmZpZy5iYXNlOworCQlwX2Rldi0+Y29uZi5QcmVzZW50ID0gY2lzX2NvbmZpZy5ybWFza1swXTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IGNvdWxkIG5vdCBwYXJzZSBiYXNlIGFuZCBybWFzazAgb2YgQ0lTXG4iKTsKKwkJcF9kZXYtPmNvbmYuQ29uZmlnQmFzZSA9IDA7CisJCXBfZGV2LT5jb25mLlByZXNlbnQgPSAwOworCX0KKwogCXJldCA9IHBfZHJ2LT5wcm9iZShwX2Rldik7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCWRzX2RiZygxLCAiYmluZGluZyAlcyB0byAlcyBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJICAgICAgIHBfZGV2LT5kZXYuYnVzX2lkLCBwX2Rydi0+ZHJ2Lm5hbWUsIHJldCk7CiAJCWdvdG8gcHV0X21vZHVsZTsKKwl9CiAKIAkvKiBoYW5kbGUgcHNldWRvIG11bHRpZnVuY3Rpb24gZGV2aWNlczoKIAkgKiB0aGVyZSBhcmUgYXQgbW9zdCB0d28gcHNldWRvIG11bHRpZnVuY3Rpb24gZGV2aWNlcy4KQEAgLTQwMCw3ICszNjcsNyBAQAogCWRpZCA9IHBfZGV2LT5kZXYuZHJpdmVyX2RhdGE7CiAJaWYgKGRpZCAmJiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PKSAmJgogCSAgICAocF9kZXYtPnNvY2tldC0+ZGV2aWNlX2NvdW50ID09IDEpICYmIChwX2Rldi0+ZGV2aWNlX25vID09IDApKQotCQlwY21jaWFfYWRkX3BzZXVkb19kZXZpY2UocF9kZXYtPnNvY2tldCk7CisJCXBjbWNpYV9hZGRfZGV2aWNlX2xhdGVyKHBfZGV2LT5zb2NrZXQsIDApOwogCiAgcHV0X21vZHVsZToKIAlpZiAocmV0KQpAQCAtNDIxLDggKzM4OCw4IEBACiAJc3RydWN0IHBjbWNpYV9kZXZpY2UJKnRtcDsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAotCWRzX2RiZygyLCAidW5iaW5kX3JlcXVlc3QoJWQpXG4iLCBzLT5zb2NrKTsKLQorCWRzX2RiZygyLCAicGNtY2lhX2NhcmRfcmVtb3ZlKCVkKSAlc1xuIiwgcy0+c29jaywKKwkgICAgICAgbGVmdG92ZXIgPyBsZWZ0b3Zlci0+ZGV2bmFtZSA6ICIiKTsKIAogCWlmICghbGVmdG92ZXIpCiAJCXMtPmRldmljZV9jb3VudCA9IDA7CkBAIC00MzksNiArNDA2LDcgQEAKIAkJcF9kZXYtPl9yZW1vdmVkPTE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAKKwkJZHNfZGJnKDIsICJ1bnJlZ2lzdGVyaW5nIGRldmljZSAlc1xuIiwgcF9kZXYtPmRldi5idXNfaWQpOwogCQlkZXZpY2VfdW5yZWdpc3RlcigmcF9kZXYtPmRldik7CiAJfQogCkBAIC00NTUsNiArNDIzLDggQEAKIAlwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKIAlwX2RydiA9IHRvX3BjbWNpYV9kcnYoZGV2LT5kcml2ZXIpOwogCisJZHNfZGJnKDEsICJyZW1vdmluZyBkZXZpY2UgJXNcbiIsIHBfZGV2LT5kZXYuYnVzX2lkKTsKKwogCS8qIElmIHdlJ3JlIHJlbW92aW5nIHRoZSBwcmltYXJ5IG1vZHVsZSBkcml2aW5nIGEKIAkgKiBwc2V1ZG8gbXVsdGktZnVuY3Rpb24gY2FyZCwgd2UgbmVlZCB0byB1bmJpbmQKIAkgKiBhbGwgZGV2aWNlcwpAQCAtNTg3LDggKzU1NywxMCBAQAogCiAJbXV0ZXhfbG9jaygmZGV2aWNlX2FkZF9sb2NrKTsKIAotCS8qIG1heCBvZiAyIGRldmljZXMgcGVyIGNhcmQgKi8KLQlpZiAocy0+ZGV2aWNlX2NvdW50ID09IDIpCisJZHNfZGJnKDMsICJhZGRpbmcgZGV2aWNlIHRvICVkLCBmdW5jdGlvbiAlZFxuIiwgcy0+c29jaywgZnVuY3Rpb24pOworCisJLyogbWF4IG9mIDQgZGV2aWNlcyBwZXIgY2FyZCAqLworCWlmIChzLT5kZXZpY2VfY291bnQgPT0gNCkKIAkJZ290byBlcnJfcHV0OwogCiAJcF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNtY2lhX2RldmljZSksIEdGUF9LRVJORUwpOwpAQCAtNTk4LDggKzU3MCw2IEBACiAJcF9kZXYtPnNvY2tldCA9IHM7CiAJcF9kZXYtPmRldmljZV9ubyA9IChzLT5kZXZpY2VfY291bnQrKyk7CiAJcF9kZXYtPmZ1bmMgICA9IGZ1bmN0aW9uOwotCWlmIChzLT5mdW5jdGlvbnMgPD0gZnVuY3Rpb24pCi0JCXMtPmZ1bmN0aW9ucyA9IGZ1bmN0aW9uICsgMTsKIAogCXBfZGV2LT5kZXYuYnVzID0gJnBjbWNpYV9idXNfdHlwZTsKIAlwX2Rldi0+ZGV2LnBhcmVudCA9IHMtPmRldi5kZXY7CkBAIC02MTAsOCArNTgwLDggQEAKIAlpZiAoIXBfZGV2LT5kZXZuYW1lKQogCQlnb3RvIGVycl9mcmVlOwogCXNwcmludGYgKHBfZGV2LT5kZXZuYW1lLCAicGNtY2lhJXMiLCBwX2Rldi0+ZGV2LmJ1c19pZCk7CisJZHNfZGJnKDMsICJkZXZuYW1lIGlzICVzXG4iLCBwX2Rldi0+ZGV2bmFtZSk7CiAKLQkvKiBjb21wYXQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKIAogCS8qCkBAIC02MzEsNiArNjAxLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFwX2Rldi0+ZnVuY3Rpb25fY29uZmlnKSB7CisJCWRzX2RiZygzLCAiY3JlYXRpbmcgY29uZmlnX3QgZm9yICVzXG4iLCBwX2Rldi0+ZGV2LmJ1c19pZCk7CiAJCXBfZGV2LT5mdW5jdGlvbl9jb25maWcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnX3QpLAogCQkJCQkJIEdGUF9LRVJORUwpOwogCQlpZiAoIXBfZGV2LT5mdW5jdGlvbl9jb25maWcpCkBAIC02NzQsMTEgKzY0NSwxNiBAQAogCXVuc2lnbmVkIGludCBub19mdW5jcywgaTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghKHMtPnJlc291cmNlX3NldHVwX2RvbmUpKQorCWlmICghKHMtPnJlc291cmNlX3NldHVwX2RvbmUpKSB7CisJCWRzX2RiZygzLCAibm8gcmVzb3VyY2VzIGF2YWlsYWJsZSwgZGVsYXlpbmcgY2FyZF9hZGRcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsgLyogdHJ5IGFnYWluLCBidXQgbGF0ZXIuLi4gKi8KKwl9CiAKLQlpZiAocGNtY2lhX3ZhbGlkYXRlX21lbShzKSkKKwlpZiAocGNtY2lhX3ZhbGlkYXRlX21lbShzKSkgeworCQlkc19kYmcoMywgInZhbGlkYXRpbmcgbWVtIHJlc291cmNlcyBmYWlsZWQsICIKKwkJICAgICAgICJkZWxheWluZyBjYXJkX2FkZFxuIik7CiAJCXJldHVybiAtRUFHQUlOOyAvKiB0cnkgYWdhaW4sIGJ1dCBsYXRlci4uLiAqLworCX0KIAogCXJldCA9IHBjY2FyZF92YWxpZGF0ZV9jaXMocywgQklORF9GTl9BTEwsICZjaXNpbmZvKTsKIAlpZiAocmV0IHx8ICFjaXNpbmZvLkNoYWlucykgewpAQCAtNjkwLDYgKzY2Niw3IEBACiAJCW5vX2Z1bmNzID0gbWZjLm5mbjsKIAllbHNlCiAJCW5vX2Z1bmNzID0gMTsKKwlzLT5mdW5jdGlvbnMgPSBub19mdW5jczsKIAogCWZvciAoaT0wOyBpIDwgbm9fZnVuY3M7IGkrKykKIAkJcGNtY2lhX2RldmljZV9hZGQocywgaSk7CkBAIC02OTgsMzggKzY3NSw1MSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHBjbWNpYV9kZWxheWVkX2FkZF9wc2V1ZG9fZGV2aWNlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwY21jaWFfZGVsYXllZF9hZGRfZGV2aWNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGRhdGE7Ci0JcGNtY2lhX2RldmljZV9hZGQocywgMCk7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHBjbWNpYV9zb2NrZXQsIGRldmljZV9hZGQpOworCWRzX2RiZygxLCAiYWRkaW5nIGFkZGl0aW9uYWwgZGV2aWNlIHRvICVkXG4iLCBzLT5zb2NrKTsKKwlwY21jaWFfZGV2aWNlX2FkZChzLCBzLT5wY21jaWFfc3RhdGUubWZjX3BmYyk7CiAJcy0+cGNtY2lhX3N0YXRlLmRldmljZV9hZGRfcGVuZGluZyA9IDA7CisJcy0+cGNtY2lhX3N0YXRlLm1mY19wZmMgPSAwOwogfQogCiBzdGF0aWMgaW50IHBjbWNpYV9yZXF1ZXJ5KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqIF9kYXRhKQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKLQlpZiAoIXBfZGV2LT5kZXYuZHJpdmVyKQorCWlmICghcF9kZXYtPmRldi5kcml2ZXIpIHsKKwkJZHNfZGJnKDEsICJ1cGRhdGUgZGV2aWNlIGluZm9ybWF0aW9uIGZvciAlc1xuIiwKKwkJICAgICAgIHBfZGV2LT5kZXYuYnVzX2lkKTsKIAkJcGNtY2lhX2RldmljZV9xdWVyeShwX2Rldik7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBjbWNpYV9idXNfcmVzY2FuKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCitzdGF0aWMgdm9pZCBwY21jaWFfYnVzX3Jlc2NhbihzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0LCBpbnQgbmV3X2NpcykKIHsKLQlpbnQgbm9fZGV2aWNlcz0wOworCWludCBub19kZXZpY2VzID0gMDsKKwlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBza3RfbXV0ZXggaGVsZCAqLworCWRzX2RiZygwLCAicmUtc2Nhbm5pbmcgc29ja2V0ICVkXG4iLCBza3QtPnNvY2spOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJaWYgKGxpc3RfZW1wdHkoJnNrdC0+ZGV2aWNlc19saXN0KSkKLQkJbm9fZGV2aWNlcz0xOworCQlub19kZXZpY2VzID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCisJLyogSWYgdGhpcyBpcyBiZWNhdXNlIG9mIGEgQ0lTIG92ZXJyaWRlLCBzdGFydCBvdmVyICovCisJaWYgKG5ld19jaXMgJiYgIW5vX2RldmljZXMpCisJCXBjbWNpYV9jYXJkX3JlbW92ZShza3QsIE5VTEwpOworCiAJLyogaWYgbm8gZGV2aWNlcyB3ZXJlIGFkZGVkIGZvciB0aGlzIHNvY2tldCB5ZXQgYmVjYXVzZSBvZgogCSAqIG1pc3NpbmcgcmVzb3VyY2UgaW5mb3JtYXRpb24gb3Igb3RoZXIgdHJvdWJsZSwgd2UgbmVlZCB0bwogCSAqIGRvIHRoaXMgbm93LiAqLwotCWlmIChub19kZXZpY2VzKSB7Ci0JCWludCByZXQgPSBwY21jaWFfY2FyZF9hZGQoc2t0KTsKKwlpZiAobm9fZGV2aWNlcyB8fCBuZXdfY2lzKSB7CisJCXJldCA9IHBjbWNpYV9jYXJkX2FkZChza3QpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuOwogCX0KQEAgLTc0MSw5ICs3MzEsMTAyIEBACiAKIAkvKiB3ZSByZS1zY2FuIGFsbCBkZXZpY2VzLCBub3QganVzdCB0aGUgb25lcyBjb25uZWN0ZWQgdG8gdGhpcwogCSAqIHNvY2tldC4gVGhpcyBkb2VzIG5vdCBtYXR0ZXIsIHRob3VnaC4gKi8KLQlidXNfcmVzY2FuX2RldmljZXMoJnBjbWNpYV9idXNfdHlwZSk7CisJcmV0ID0gYnVzX3Jlc2Nhbl9kZXZpY2VzKCZwY21jaWFfYnVzX3R5cGUpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0lORk8gInBjbWNpYTogYnVzX3Jlc2Nhbl9kZXZpY2VzIGZhaWxlZFxuIik7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENNQ0lBX0xPQURfQ0lTCisKKy8qKgorICogcGNtY2lhX2xvYWRfZmlybXdhcmUgLSBsb2FkIENJUyBmcm9tIHVzZXJzcGFjZSBpZiBkZXZpY2UtcHJvdmlkZWQgaXMgYnJva2VuCisgKiBAZGV2IC0gdGhlIHBjbWNpYSBkZXZpY2Ugd2hpY2ggbmVlZHMgYSBDSVMgb3ZlcnJpZGUKKyAqIEBmaWxlbmFtZSAtIHJlcXVlc3RlZCBmaWxlbmFtZSBpbiAvbGliL2Zpcm13YXJlLworICoKKyAqIFRoaXMgdXNlcyB0aGUgaW4ta2VybmVsIGZpcm13YXJlIGxvYWRpbmcgbWVjaGFuaXNtIHRvIHVzZSBhICJmYWtlIENJUyIgaWYKKyAqIHRoZSBvbmUgcHJvdmlkZWQgYnkgdGhlIGNhcmQgaXMgYnJva2VuLiBUaGUgZmlybXdhcmUgZmlsZXMgcmVzaWRlIGluCisgKiAvbGliL2Zpcm13YXJlLyBpbiB1c2Vyc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgcGNtY2lhX2xvYWRfZmlybXdhcmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmRldiwgY2hhciAqIGZpbGVuYW1lKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gZGV2LT5zb2NrZXQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljaGFyIHBhdGhbMjBdOworCWludCByZXQgPSAtRU5PTUVNOworCWludCBub19mdW5jczsKKwlpbnQgb2xkX2Z1bmNzOworCWNpc2R1bXBfdCAqY2lzOworCWNpc3RwbF9sb25nbGlua19tZmNfdCBtZmM7CisKKwlpZiAoIWZpbGVuYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRzX2RiZygxLCAidHJ5aW5nIHRvIGxvYWQgQ0lTIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKworCWlmIChzdHJsZW4oZmlsZW5hbWUpID4gMTQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNtY2lhOiBDSVMgZmlsZW5hbWUgaXMgdG9vIGxvbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbnByaW50ZihwYXRoLCAyMCwgIiVzIiwgZmlsZW5hbWUpOworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBwYXRoLCAmZGV2LT5kZXYpID09IDApIHsKKwkJaWYgKGZ3LT5zaXplID49IENJU1RQTF9NQVhfQ0lTX1NJWkUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlwcmludGsoS0VSTl9FUlIgInBjbWNpYTogQ0lTIG92ZXJyaWRlIGlzIHRvbyBiaWdcbiIpOworCQkJZ290byByZWxlYXNlOworCQl9CisKKwkJY2lzID0ga3phbGxvYyhzaXplb2YoY2lzZHVtcF90KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2lzKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byByZWxlYXNlOworCQl9CisKKwkJY2lzLT5MZW5ndGggPSBmdy0+c2l6ZSArIDE7CisJCW1lbWNweShjaXMtPkRhdGEsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisKKwkJaWYgKCFwY21jaWFfcmVwbGFjZV9jaXMocywgY2lzKSkKKwkJCXJldCA9IDA7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJwY21jaWE6IENJUyBvdmVycmlkZSBmYWlsZWRcbiIpOworCQkJZ290byByZWxlYXNlOworCQl9CisKKworCQkvKiB1cGRhdGUgaW5mb3JtYXRpb24gKi8KKwkJcGNtY2lhX2RldmljZV9xdWVyeShkZXYpOworCisJCS8qIGRvZXMgdGhpcyBjaXMgb3ZlcnJpZGUgYWRkIG9yIHJlbW92ZSBmdW5jdGlvbnM/ICovCisJCW9sZF9mdW5jcyA9IHMtPmZ1bmN0aW9uczsKKworCQlpZiAoIXBjY2FyZF9yZWFkX3R1cGxlKHMsIEJJTkRfRk5fQUxMLCBDSVNUUExfTE9OR0xJTktfTUZDLCAmbWZjKSkKKwkJCW5vX2Z1bmNzID0gbWZjLm5mbjsKKwkJZWxzZQorCQkJbm9fZnVuY3MgPSAxOworCQlzLT5mdW5jdGlvbnMgPSBub19mdW5jczsKKworCQlpZiAob2xkX2Z1bmNzID4gbm9fZnVuY3MpCisJCQlwY21jaWFfY2FyZF9yZW1vdmUocywgZGV2KTsKKwkJZWxzZSBpZiAobm9fZnVuY3MgPiBvbGRfZnVuY3MpCisJCQlwY21jaWFfYWRkX2RldmljZV9sYXRlcihzLCAxKTsKKwl9CisgcmVsZWFzZToKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCXJldHVybiAocmV0KTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19QQ01DSUFfTE9BRF9DSVMgKi8KKworc3RhdGljIGlubGluZSBpbnQgcGNtY2lhX2xvYWRfZmlybXdhcmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmRldiwgY2hhciAqIGZpbGVuYW1lKQoreworCXJldHVybiAtRU5PREVWOworfQorCisjZW5kaWYKKworCiBzdGF0aWMgaW5saW5lIGludCBwY21jaWFfZGV2bWF0Y2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkICpkaWQpCiB7CkBAIC04MTAsMTEgKzg5MywxNCBAQAogCQkgKiBhZnRlciBpdCBoYXMgcmUtY2hlY2tlZCB0aGF0IHRoZXJlIGlzIG5vIHBvc3NpYmxlIG1vZHVsZQogCQkgKiB3aXRoIGEgcHJvZF9pZC9tYW5mX2lkL2NhcmRfaWQgbWF0Y2guCiAJCSAqLworCQlkc19kYmcoMCwgInNraXBwaW5nIEZVTkNfSUQgbWF0Y2ggZm9yICVzIHVudGlsIHVzZXJzcGFjZSAiCisJCSAgICAgICAiaW50ZXJhY3Rpb25cbiIsIGRldi0+ZGV2LmJ1c19pZCk7CiAJCWlmICghZGV2LT5hbGxvd19mdW5jX2lkX21hdGNoKQogCQkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTKSB7CisJCWRzX2RiZygwLCAiZGV2aWNlICVzIG5lZWRzIGEgZmFrZSBDSVNcbiIsIGRldi0+ZGV2LmJ1c19pZCk7CiAJCWlmICghZGV2LT5zb2NrZXQtPmZha2VfY2lzKQogCQkJcGNtY2lhX2xvYWRfZmlybXdhcmUoZGV2LCBkaWQtPmNpc2ZpbGUpOwogCkBAIC04NDQsMTMgKzkzMCwyMSBAQAogCiAjaWZkZWYgQ09ORklHX1BDTUNJQV9JT0NUTAogCS8qIG1hdGNoaW5nIGJ5IGNhcmRtZ3IgKi8KLQlpZiAocF9kZXYtPmNhcmRtZ3IgPT0gcF9kcnYpCisJaWYgKHBfZGV2LT5jYXJkbWdyID09IHBfZHJ2KSB7CisJCWRzX2RiZygwLCAiY2FyZG1nciBtYXRjaGVkICVzIHRvICVzXG4iLCBkZXYtPmJ1c19pZCwKKwkJICAgICAgIGRydi0+bmFtZSk7CiAJCXJldHVybiAxOworCX0KICNlbmRpZgogCiAJd2hpbGUgKGRpZCAmJiBkaWQtPm1hdGNoX2ZsYWdzKSB7Ci0JCWlmIChwY21jaWFfZGV2bWF0Y2gocF9kZXYsIGRpZCkpCisJCWRzX2RiZygzLCAidHJ5aW5nIHRvIG1hdGNoICVzIHRvICVzXG4iLCBkZXYtPmJ1c19pZCwKKwkJICAgICAgIGRydi0+bmFtZSk7CisJCWlmIChwY21jaWFfZGV2bWF0Y2gocF9kZXYsIGRpZCkpIHsKKwkJCWRzX2RiZygwLCAibWF0Y2hlZCAlcyB0byAlc1xuIiwgZGV2LT5idXNfaWQsCisJCQkgICAgICAgZHJ2LT5uYW1lKTsKIAkJCXJldHVybiAxOworCQl9CiAJCWRpZCsrOwogCX0KIApAQCAtMTAwMSw2ICsxMDk1LDcgQEAKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKwlpbnQgcmV0OwogCiAJaWYgKCFjb3VudCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDA5LDcgKzExMDQsMTAgQEAKIAlwX2Rldi0+YWxsb3dfZnVuY19pZF9tYXRjaCA9IDE7CiAJbXV0ZXhfdW5sb2NrKCZwX2Rldi0+c29ja2V0LT5za3RfbXV0ZXgpOwogCi0JYnVzX3Jlc2Nhbl9kZXZpY2VzKCZwY21jaWFfYnVzX3R5cGUpOworCXJldCA9IGJ1c19yZXNjYW5fZGV2aWNlcygmcGNtY2lhX2J1c190eXBlKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IGJ1c19yZXNjYW5fZGV2aWNlcyBmYWlsZWQgYWZ0ZXIgIgorCQkgICAgICAgImFsbG93aW5nIGZ1bmNfaWQgbWF0Y2hlc1xuIik7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xMDM3LDYgKzExMzUsOCBAQAogCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKKwlkc19kYmcoMiwgInN1c3BlbmRpbmcgJXNcbiIsIGRldi0+YnVzX2lkKTsKKwogCWlmIChkZXYtPmRyaXZlcikKIAkJcF9kcnYgPSB0b19wY21jaWFfZHJ2KGRldi0+ZHJpdmVyKTsKIApAQCAtMTA0NSwxMiArMTE0NSwxOCBAQAogCiAJaWYgKHBfZHJ2LT5zdXNwZW5kKSB7CiAJCXJldCA9IHBfZHJ2LT5zdXNwZW5kKHBfZGV2KTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJwY21jaWE6IGRldmljZSAlcyAoZHJpdmVyICVzKSBkaWQgIgorCQkJICAgICAgICJub3Qgd2FudCB0byBnbyB0byBzbGVlcCAoJWQpXG4iLAorCQkJICAgICAgIHBfZGV2LT5kZXZuYW1lLCBwX2Rydi0+ZHJ2Lm5hbWUsIHJldCk7CiAJCQlnb3RvIG91dDsKKwkJfQogCX0KIAotCWlmIChwX2Rldi0+ZGV2aWNlX25vID09IHBfZGV2LT5mdW5jKQorCWlmIChwX2Rldi0+ZGV2aWNlX25vID09IHBfZGV2LT5mdW5jKSB7CisJCWRzX2RiZygyLCAicmVsZWFzaW5nIGNvbmZpZ3VyYXRpb24gZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CiAJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24ocF9kZXYpOworCX0KIAogIG91dDoKIAlpZiAoIXJldCkKQEAgLTEwNjUsNiArMTE3MSw4IEBACiAgICAgICAgIHN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKKwlkc19kYmcoMiwgInJlc3VtaW5nICVzXG4iLCBkZXYtPmJ1c19pZCk7CisKIAlpZiAoZGV2LT5kcml2ZXIpCiAJCXBfZHJ2ID0gdG9fcGNtY2lhX2RydihkZXYtPmRyaXZlcik7CiAKQEAgLTEwNzIsNiArMTE4MCw3IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKHBfZGV2LT5kZXZpY2Vfbm8gPT0gcF9kZXYtPmZ1bmMpIHsKKwkJZHNfZGJnKDIsICJyZXF1ZXN0aW5nIGNvbmZpZ3VyYXRpb24gZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CiAJCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24ocF9kZXYsICZwX2Rldi0+Y29uZik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKQEAgLTExMTMsMTIgKzEyMjIsMTQgQEAKIAogc3RhdGljIGludCBwY21jaWFfYnVzX3Jlc3VtZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQogeworCWRzX2RiZygyLCAicmVzdW1pbmcgc29ja2V0ICVkXG4iLCBza3QtPnNvY2spOwogCWJ1c19mb3JfZWFjaF9kZXYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwgc2t0LCBwY21jaWFfYnVzX3Jlc3VtZV9jYWxsYmFjayk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGNtY2lhX2J1c19zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7CisJZHNfZGJnKDIsICJzdXNwZW5kaW5nIHNvY2tldCAlZFxuIiwgc2t0LT5zb2NrKTsKIAlpZiAoYnVzX2Zvcl9lYWNoX2RldigmcGNtY2lhX2J1c190eXBlLCBOVUxMLCBza3QsCiAJCQkgICAgIHBjbWNpYV9idXNfc3VzcGVuZF9jYWxsYmFjaykpIHsKIAkJcGNtY2lhX2J1c19yZXN1bWUoc2t0KTsKQEAgLTEyMzksNyArMTM1MCw3IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc29ja2V0LT5xdWV1ZSk7CiAjZW5kaWYKIAlJTklUX0xJU1RfSEVBRCgmc29ja2V0LT5kZXZpY2VzX2xpc3QpOwotCUlOSVRfV09SSygmc29ja2V0LT5kZXZpY2VfYWRkLCBwY21jaWFfZGVsYXllZF9hZGRfcHNldWRvX2RldmljZSwgc29ja2V0KTsKKwlJTklUX1dPUksoJnNvY2tldC0+ZGV2aWNlX2FkZCwgcGNtY2lhX2RlbGF5ZWRfYWRkX2RldmljZSk7CiAJbWVtc2V0KCZzb2NrZXQtPnBjbWNpYV9zdGF0ZSwgMCwgc2l6ZW9mKHU4KSk7CiAJc29ja2V0LT5kZXZpY2VfY291bnQgPSAwOwogCkBAIC0xMjY0LDYgKzEzNzUsMTEgQEAKIAlzb2NrZXQtPnBjbWNpYV9zdGF0ZS5kZWFkID0gMTsKIAlwY2NhcmRfcmVnaXN0ZXJfcGNtY2lhKHNvY2tldCwgTlVMTCk7CiAKKwkvKiB1bnJlZ2lzdGVyIGFueSB1bmJvdW5kIGRldmljZXMgKi8KKwltdXRleF9sb2NrKCZzb2NrZXQtPnNrdF9tdXRleCk7CisJcGNtY2lhX2NhcmRfcmVtb3ZlKHNvY2tldCwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZzb2NrZXQtPnNrdF9tdXRleCk7CisKIAlwY21jaWFfcHV0X3NvY2tldChzb2NrZXQpOwogCiAJcmV0dXJuOwpAQCAtMTI5MiwxMCArMTQwOCwyMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3BjbWNpYV9idXModm9pZCkKIHsKKwlpbnQgcmV0OworCiAJc3Bpbl9sb2NrX2luaXQoJnBjbWNpYV9kZXZfbGlzdF9sb2NrKTsKIAotCWJ1c19yZWdpc3RlcigmcGNtY2lhX2J1c190eXBlKTsKLQljbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIoJnBjbWNpYV9idXNfaW50ZXJmYWNlKTsKKwlyZXQgPSBidXNfcmVnaXN0ZXIoJnBjbWNpYV9idXNfdHlwZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNtY2lhOiBidXNfcmVnaXN0ZXIgZXJyb3I6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBjbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIoJnBjbWNpYV9idXNfaW50ZXJmYWNlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkicGNtY2lhOiBjbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIgZXJyb3I6ICVkXG4iLCByZXQpOworCQlidXNfdW5yZWdpc3RlcigmcGNtY2lhX2J1c190eXBlKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlwY21jaWFfc2V0dXBfaW9jdGwoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvaTgyMDkyLmMgYi9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYwppbmRleCA4MjcxNWY0Li5jMmVhMDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYworKysgYi9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYwpAQCAtNDEsNiArNDEsNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpODIwOTJhYV9wY2lfaWRzKTsKIAorI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBpODIwOTJhYV9zb2NrZXRfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKCZkZXYtPmRldiwgc3RhdGUpOwpAQCAtNTAsMTQgKzUxLDE3IEBACiB7CiAJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZSgmZGV2LT5kZXYpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpODIwOTJhYV9wY2lfZHJ2ID0gewogCS5uYW1lICAgICAgICAgICA9ICJpODIwOTJhYSIsCiAJLmlkX3RhYmxlICAgICAgID0gaTgyMDkyYWFfcGNpX2lkcywKIAkucHJvYmUgICAgICAgICAgPSBpODIwOTJhYV9wY2lfcHJvYmUsCiAJLnJlbW92ZSAgICAgICAgID0gX19kZXZleGl0X3AoaTgyMDkyYWFfcGNpX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQgICAgICAgID0gaTgyMDkyYWFfc29ja2V0X3N1c3BlbmQsCiAJLnJlc3VtZSAgICAgICAgID0gaTgyMDkyYWFfc29ja2V0X3Jlc3VtZSwKKyNlbmRpZgogfTsKIAogCkBAIC03MDUsMTAgKzcwOSw3IEBACiAKIHN0YXRpYyBpbnQgaTgyMDkyYWFfbW9kdWxlX2luaXQodm9pZCkKIHsKLQllbnRlcigiaTgyMDkyYWFfbW9kdWxlX2luaXQiKTsKLQlwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpODIwOTJhYV9wY2lfZHJ2KTsKLQlsZWF2ZSgiaTgyMDkyYWFfbW9kdWxlX2luaXQiKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaTgyMDkyYWFfcGNpX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIGk4MjA5MmFhX21vZHVsZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jIGIvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYwppbmRleCAzNmZkYWE1Li4zYzIyYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMKQEAgLTM5OCw3ICszOTgsNyBAQAogc3RhdGljIHZvaWQgcGNjX2ludGVycnVwdF93cmFwcGVyKHVfbG9uZyBkYXRhKQogewogCWRlYnVnKDMsICJtMzJyX2NmYzogcGNjX2ludGVycnVwdF93cmFwcGVyOlxuIik7Ci0JcGNjX2ludGVycnVwdCgwLCBOVUxMLCBOVUxMKTsKKwlwY2NfaW50ZXJydXB0KDAsIE5VTEwpOwogCWluaXRfdGltZXIoJnBvbGxfdGltZXIpOwogCXBvbGxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBwb2xsX2ludGVydmFsOwogCWFkZF90aW1lcigmcG9sbF90aW1lcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jIGIvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYwppbmRleCBlMDcwYTI4Li4zYjcyYmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogCQkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXJldHVybiAxOworCQkJZ290byBvdXRfdW5tYXA7CiAJfQogCiAJc3dpdGNoKHZwcCkgewpAQCAtNDM4LDE1ICs0MzgsMTUgQEAKIAkJCWlmKHZjYyA9PSB2cHApCiAJCQkJcmVnIHw9IEJDU1IxX1BDQ1ZQUDE7CiAJCQllbHNlCi0JCQkJcmV0dXJuIDE7CisJCQkJZ290byBvdXRfdW5tYXA7CiAJCQlicmVhazsKIAkJY2FzZSAxMjA6CiAJCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCiAJCQkJcmVnIHw9IEJDU1IxX1BDQ1ZQUDA7CiAJCQllbHNlCi0JCQkJcmV0dXJuIDE7CisJCQkJZ290byBvdXRfdW5tYXA7CiAJCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKKwkJCWdvdG8gb3V0X3VubWFwOwogCX0KIAogCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KQEAgLTQ1Nyw2ICs0NTcsMTAgQEAKIAogCWlvdW5tYXAoYmNzcl9pbyk7CiAJcmV0dXJuIDA7CisKK291dF91bm1hcDoKKwlpb3VubWFwKGJjc3JfaW8pOworCXJldHVybiAxOwogfQogCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81VgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvb21hcF9jZi5jIGIvZHJpdmVycy9wY21jaWEvb21hcF9jZi5jCmluZGV4IGM4ZTgzOGMuLmU2NWE2YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL29tYXBfY2YuYworKysgYi9kcml2ZXJzL3BjbWNpYS9vbWFwX2NmLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCWlmIChpcnEgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWNmID0ga2NhbGxvYygxLCBzaXplb2YgKmNmLCBHRlBfS0VSTkVMKTsKKwljZiA9IGt6YWxsb2Moc2l6ZW9mICpjZiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjZikKIAkJcmV0dXJuIC1FTk9NRU07CiAJaW5pdF90aW1lcigmY2YtPnRpbWVyKTsKQEAgLTMwOSw5ICszMDksMTAgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDI6Ci0JaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGNmLT5zb2NrZXQuaW9fb2Zmc2V0KTsKIAlyZWxlYXNlX21lbV9yZWdpb24oY2YtPnBoeXNfY2YsIFNaXzhLKTsKIGZhaWwxOgorCWlmIChjZi0+c29ja2V0LmlvX29mZnNldCkKKwkJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGNmLT5zb2NrZXQuaW9fb2Zmc2V0KTsKIAlmcmVlX2lycShpcnEsIGNmKTsKIGZhaWwwOgogCWtmcmVlKGNmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKaW5kZXggOWFkMThlNi4uMzI3MzcyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKQEAgLTEyOCw5ICsxMjgsMTIgQEAKIAkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAljaGFyICpwID0gYnVmOworCWludCByYzsKIAotCWJ1c19mb3JfZWFjaF9kcnYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwKLQkJCSAodm9pZCAqKSAmcCwgcHJvY19yZWFkX2RyaXZlcnNfY2FsbGJhY2spOworCXJjID0gYnVzX2Zvcl9lYWNoX2RydigmcGNtY2lhX2J1c190eXBlLCBOVUxMLAorCQkJICAgICAgKHZvaWQgKikgJnAsIHByb2NfcmVhZF9kcml2ZXJzX2NhbGxiYWNrKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CiAKIAlyZXR1cm4gKHAgLSBidWYpOwogfQpAQCAtMjY5LDggKzI3MiwxMCBAQAogCSAqIFByZXZlbnQgdGhpcyByYWNpbmcgd2l0aCBhIGNhcmQgaW5zZXJ0aW9uLgogCSAqLwogCW11dGV4X2xvY2soJnMtPnNrdF9tdXRleCk7Ci0JYnVzX3Jlc2Nhbl9kZXZpY2VzKCZwY21jaWFfYnVzX3R5cGUpOworCXJldCA9IGJ1c19yZXNjYW5fZGV2aWNlcygmcGNtY2lhX2J1c190eXBlKTsKIAltdXRleF91bmxvY2soJnMtPnNrdF9tdXRleCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHV0X21vZHVsZTsKIAogCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGRyaXZlciBpbmRlZWQgbWF0Y2hlZC4gSSBkb24ndCBjYXJlIGlmIHRoaXMKIAkgKiBpcyByYWN5IG9yIG5vdCwgYmVjYXVzZSBpdCBjYW4gb25seSBoYXBwZW4gb24gY2FyZG1nciBhY2Nlc3MKQEAgLTQ4MSw3ICs0ODYsNyBAQAogICAgIHVzZXJfaW5mb190ICp1c2VyOwogICAgIGludCByZXQ7CiAKLSAgICBkc19kYmcoMiwgImRzX3JlYWQoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisgICAgZHNfZGJnKDIsICJkc19yZWFkKHNvY2tldCAlZClcbiIsIGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSk7CiAKICAgICBpZiAoY291bnQgPCA0KQogCXJldHVybiAtRUlOVkFMOwpAQCAtNTA2LDcgKzUxMSw3IEBACiBzdGF0aWMgc3NpemVfdCBkc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotICAgIGRzX2RiZygyLCAiZHNfd3JpdGUoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisgICAgZHNfZGJnKDIsICJkc193cml0ZShzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpOwogCiAgICAgaWYgKGNvdW50ICE9IDQpCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC01MjQsNyArNTI5LDcgQEAKICAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKICAgICB1c2VyX2luZm9fdCAqdXNlcjsKIAotICAgIGRzX2RiZygyLCAiZHNfcG9sbChzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKTsKKyAgICBkc19kYmcoMiwgImRzX3BvbGwoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKTsKIAogICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAgICAgaWYgKENIRUNLX1VTRVIodXNlcikpCkBAIC01ODksNyArNTk0LDEyIEBACiAKICAgICBlcnIgPSByZXQgPSAwOwogCi0gICAgaWYgKGNtZCAmIElPQ19JTikgX19jb3B5X2Zyb21fdXNlcigoY2hhciAqKWJ1ZiwgdWFyZywgc2l6ZSk7CisgICAgaWYgKGNtZCAmIElPQ19JTikgeworCWlmIChfX2NvcHlfZnJvbV91c2VyKChjaGFyICopYnVmLCB1YXJnLCBzaXplKSkgeworCSAgICBlcnIgPSAtRUZBVUxUOworCSAgICBnb3RvIGZyZWVfb3V0OworCX0KKyAgICB9CiAKICAgICBzd2l0Y2ggKGNtZCkgewogICAgIGNhc2UgRFNfQURKVVNUX1JFU09VUkNFX0lORk86CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jCmluZGV4IDc0Y2ViZDQuLmI5MjAxYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jCkBAIC05NSw3ICs5NSw3IEBACiAJICogcG90ZW50aWFsIGNvbmZsaWN0cywganVzdCB0aGUgbW9zdCBvYnZpb3VzIG9uZXMuCiAJICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykKLQkJaWYgKChzLT5pb1tpXS5yZXMpICYmCisJCWlmICgocy0+aW9baV0ucmVzKSAmJiAqYmFzZSAmJgogCQkgICAgKChzLT5pb1tpXS5yZXMtPnN0YXJ0ICYgKGFsaWduLTEpKSA9PSAqYmFzZSkpCiAJCQlyZXR1cm4gMTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wZDY3MjkuYyBiL2RyaXZlcnMvcGNtY2lhL3BkNjcyOS5jCmluZGV4IGM4M2EwYTYuLjM2MGMyNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3BkNjcyOS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BkNjcyOS5jCkBAIC01ODEsMTAgKzU4MSwxMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBwZDY3MjlfY2hlY2tfaXJxKGludCBpcnEsIGludCBmbGFncykKK3N0YXRpYyBpbnQgcGQ2NzI5X2NoZWNrX2lycShpbnQgaXJxKQogewotCWlmIChyZXF1ZXN0X2lycShpcnEsIHBkNjcyOV90ZXN0LCBmbGFncywgIngiLCBwZDY3MjlfdGVzdCkgIT0gMCkKLQkJcmV0dXJuIC0xOworCWlmIChyZXF1ZXN0X2lycShpcnEsIHBkNjcyOV90ZXN0LCBJUlFGX1BST0JFX1NIQVJFRCwgIngiLCBwZDY3MjlfdGVzdCkKKwkJIT0gMCkgcmV0dXJuIC0xOwogCWZyZWVfaXJxKGlycSwgcGQ2NzI5X3Rlc3QpOwogCXJldHVybiAwOwogfQpAQCAtNjEwLDcgKzYxMCw3IEBACiAKIAkvKiBqdXN0IGZpbmQgaW50ZXJydXB0cyB0aGF0IGFyZW4ndCBpbiB1c2UgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJaWYgKChtYXNrMCAmICgxIDw8IGkpKSAmJiAocGQ2NzI5X2NoZWNrX2lycShpLCAwKSA9PSAwKSkKKwkJaWYgKChtYXNrMCAmICgxIDw8IGkpKSAmJiAocGQ2NzI5X2NoZWNrX2lycShpKSA9PSAwKSkKIAkJCW1hc2sgfD0gKDEgPDwgaSk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJwZDY3Mjk6IElTQSBpcnFzID0gIik7CkBAIC03NTUsNiArNzU1LDcgQEAKIAlrZnJlZShzb2NrZXQpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHBkNjcyOV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJmRldi0+ZGV2LCBzdGF0ZSk7CkBAIC03NjQsNiArNzY1LDcgQEAKIHsKIAlyZXR1cm4gcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lKCZkZXYtPmRldik7CiB9CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBkNjcyOV9wY2lfaWRzW10gPSB7CiAJewpAQCAtNzgxLDggKzc4MywxMCBAQAogCS5pZF90YWJsZQk9IHBkNjcyOV9wY2lfaWRzLAogCS5wcm9iZQkJPSBwZDY3MjlfcGNpX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocGQ2NzI5X3BjaV9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kCT0gcGQ2NzI5X3NvY2tldF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcGQ2NzI5X3NvY2tldF9yZXN1bWUsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgcGQ2NzI5X21vZHVsZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYwppbmRleCBiMzUxODEzLi5kY2E5Zjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogfQogI2VuZGlmCiAKLWludCBweGEyeHhfZHJ2X3BjbWNpYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgX19weGEyeHhfZHJ2X3BjbWNpYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzOwpAQCAtMjAzLDM1ICsyMDMsNTIgQEAKIAogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHB4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKTsKK0VYUE9SVF9TWU1CT0woX19weGEyeHhfZHJ2X3BjbWNpYV9wcm9iZSk7CiAKLXN0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKKworc3RhdGljIGludCBweGEyeHhfZHJ2X3BjbWNpYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlyZXR1cm4gX19weGEyeHhfZHJ2X3BjbWNpYV9wcm9iZSgmZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHNvY19jb21tb25fZHJ2X3BjbWNpYV9yZW1vdmUoJmRldi0+ZGV2KTsKK30KKworc3RhdGljIGludCBweGEyeHhfZHJ2X3BjbWNpYV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kKCZkZXYtPmRldiwgc3RhdGUpOworfQorCitzdGF0aWMgaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IG5yID0gb3BzID8gb3BzLT5uciA6IDA7CiAKIAlNRUNSID0gbnIgPiAxID8gTUVDUl9DSVQgfCBNRUNSX05PUyA6IChuciA+IDAgPyBNRUNSX0NJVCA6IDApOwogCi0JcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZShkZXYpOworCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUoJmRldi0+ZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHB4YTJ4eF9wY21jaWFfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHhhMnh4X3BjbWNpYV9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHB4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlLAotCS5yZW1vdmUJCT0gc29jX2NvbW1vbl9kcnZfcGNtY2lhX3JlbW92ZSwKLQkuc3VzcGVuZCAJPSBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kLAorCS5yZW1vdmUJCT0gcHhhMnh4X2Rydl9wY21jaWFfcmVtb3ZlLAorCS5zdXNwZW5kIAk9IHB4YTJ4eF9kcnZfcGNtY2lhX3N1c3BlbmQsCiAJLnJlc3VtZSAJPSBweGEyeHhfZHJ2X3BjbWNpYV9yZXN1bWUsCi0JLm5hbWUJCT0gInB4YTJ4eC1wY21jaWEiLAotCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJweGEyeHgtcGNtY2lhIiwKKwl9LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcHhhMnh4X3BjbWNpYV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmcHhhMnh4X3BjbWNpYV9kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnB4YTJ4eF9wY21jaWFfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHB4YTJ4eF9wY21jaWFfZXhpdCh2b2lkKQogewotCWRyaXZlcl91bnJlZ2lzdGVyKCZweGEyeHhfcGNtY2lhX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB4YTJ4eF9wY21jaWFfZHJpdmVyKTsKIH0KIAogZnNfaW5pdGNhbGwocHhhMnh4X3BjbWNpYV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmggYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5oCmluZGV4IGU0NmNmZjMuLjIzNWQ2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmgKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaApAQCAtMSwzICsxLDMgQEAKIC8qIHRlbXBvcmFyeSBtZWFzdXJlICovCi1leHRlcm4gaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKik7CitleHRlcm4gaW50IF9fcHhhMnh4X2Rydl9wY21jaWFfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2x1YmJvY2suYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9sdWJib2NrLmMKaW5kZXggZmQxZjY5MS4uYTkyZjExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2x1YmJvY2suYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbHViYm9jay5jCkBAIC0yNjAsNyArMjYwLDcgQEAKIAkJbHViYm9ja19zZXRfbWlzY193cigoMSA8PCAxNSkgfCAoMSA8PCAxNCksIDApOwogCiAJCXNhZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICZsdWJib2NrX3BjbWNpYV9vcHM7Ci0JCXJldCA9IHB4YTJ4eF9kcnZfcGNtY2lhX3Byb2JlKCZzYWRldi0+ZGV2KTsKKwkJcmV0ID0gX19weGEyeHhfZHJ2X3BjbWNpYV9wcm9iZSgmc2FkZXYtPmRldik7CiAJfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYwppbmRleCAzNjI3ZTUyLi5lNDMzNzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCkBAIC04MjQsMyArODI0LDQgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChzb2NfY29tbW9uX2Rydl9wY21jaWFfcmVtb3ZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jIGIvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKaW5kZXggOTMzY2Q4Ni4uYjAwNTYwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCSAgICAocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkgJiYKIAkgICAgIShzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSkgewogCQlpZiAodHJ5X21vZHVsZV9nZXQocy0+Y2FsbGJhY2stPm93bmVyKSkgewotCQkJcy0+Y2FsbGJhY2stPnJlcXVlcnkocyk7CisJCQlzLT5jYWxsYmFjay0+cmVxdWVyeShzLCAwKTsKIAkJCW1vZHVsZV9wdXQocy0+Y2FsbGJhY2stPm93bmVyKTsKIAkJfQogCX0KQEAgLTMyNSw3ICszMjUsNyBAQAogCWlmICgocy0+Y2FsbGJhY2spICYmIChzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSAmJgogCSAgICAhKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKSB7CiAJCWlmICh0cnlfbW9kdWxlX2dldChzLT5jYWxsYmFjay0+b3duZXIpKSB7Ci0JCQlzLT5jYWxsYmFjay0+cmVxdWVyeShzKTsKKwkJCXMtPmNhbGxiYWNrLT5yZXF1ZXJ5KHMsIDEpOwogCQkJbW9kdWxlX3B1dChzLT5jYWxsYmFjay0+b3duZXIpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwppbmRleCAyNjIyOWQ5Li5kYTQ3MWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYwpAQCAtMTE5Nyw4ICsxMTk3LDEyIEBACiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX3NvY2tldCgmc29ja2V0LT5zb2NrZXQpOwogCWlmIChyZXQgPT0gMCkgewogCQkvKiBBZGQgdGhlIHllbnRhIHJlZ2lzdGVyIGF0dHJpYnV0ZXMgKi8KLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3llbnRhX3JlZ2lzdGVycyk7Ci0JCWdvdG8gb3V0OworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfeWVudGFfcmVnaXN0ZXJzKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byBvdXQ7CisKKwkJLyogZXJyb3IgcGF0aC4uLiAqLworCQlwY21jaWFfdW5yZWdpc3Rlcl9zb2NrZXQoJnNvY2tldC0+c29ja2V0KTsKIAl9CiAKICB1bm1hcDoKQEAgLTEyMTMsNyArMTIxNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHllbnRhX2Rldl9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CkBAIC0xMjQ4LDEyICsxMjUyLDE4IEBACiAJc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoc29ja2V0KSB7CisJCWludCByYzsKKwogCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgMCk7CiAJCS8qIEZJWE1FOiBwY2lfcmVzdG9yZV9zdGF0ZSBuZWVkcyB0byBoYXZlIGEgYmV0dGVyIGludGVyZmFjZSAqLwogCQlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMTYqNCwgc29ja2V0LT5zYXZlZF9zdGF0ZVswXSk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAxNyo0LCBzb2NrZXQtPnNhdmVkX3N0YXRlWzFdKTsKLQkJcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKworCQlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwogCQlwY2lfc2V0X21hc3RlcihkZXYpOwogCiAJCWlmIChzb2NrZXQtPnR5cGUgJiYgc29ja2V0LT50eXBlLT5yZXN0b3JlX3N0YXRlKQpAQCAtMTI2Miw3ICsxMjcyLDcgQEAKIAogCXJldHVybiBwY21jaWFfc29ja2V0X2Rldl9yZXN1bWUoJmRldi0+ZGV2KTsKIH0KLQorI2VuZGlmCiAKICNkZWZpbmUgQ0JfSUQodmVuZCxkZXYsdHlwZSkJCQkJXAogCXsJCQkJCQlcCkBAIC0xMzU5LDggKzEzNjksMTAgQEAKIAkuaWRfdGFibGUJPSB5ZW50YV90YWJsZSwKIAkucHJvYmUJCT0geWVudGFfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh5ZW50YV9jbG9zZSksCisjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSB5ZW50YV9kZXZfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHllbnRhX2Rldl9yZXN1bWUsCisjZW5kaWYKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvY2FyZC5jIGIvZHJpdmVycy9wbnAvY2FyZC5jCmluZGV4IDIyNzYwMGMuLjkxYzA0N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2NhcmQuYworKysgYi9kcml2ZXJzL3BucC9jYXJkLmMKQEAgLTE2NCw5ICsxNjQsMTcgQEAKIAogc3RhdGljIGludCBwbnBfaW50ZXJmYWNlX2F0dGFjaF9jYXJkKHN0cnVjdCBwbnBfY2FyZCAqY2FyZCkKIHsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNhcmQtPmRldiwmZGV2X2F0dHJfbmFtZSk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZjYXJkLT5kZXYsJmRldl9hdHRyX2NhcmRfaWQpOworCWludCByYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmY2FyZC0+ZGV2LCZkZXZfYXR0cl9uYW1lKTsKKwlpZiAocmMpIHJldHVybiByYzsKKworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjYXJkLT5kZXYsJmRldl9hdHRyX2NhcmRfaWQpOworCWlmIChyYykgZ290byBlcnJfbmFtZTsKKwogCXJldHVybiAwOworCitlcnJfbmFtZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNhcmQtPmRldiwmZGV2X2F0dHJfbmFtZSk7CisJcmV0dXJuIHJjOwogfQogCiAvKioKQEAgLTMwNiwxNiArMzE0LDIwIEBACiAJZG93bl93cml0ZSgmZGV2LT5kZXYuYnVzLT5zdWJzeXMucndzZW0pOwogCWRldi0+Y2FyZF9saW5rID0gY2xpbms7CiAJZGV2LT5kZXYuZHJpdmVyID0gJmRydi0+bGluay5kcml2ZXI7Ci0JaWYgKHBucF9idXNfdHlwZS5wcm9iZSgmZGV2LT5kZXYpKSB7Ci0JCWRldi0+ZGV2LmRyaXZlciA9IE5VTEw7Ci0JCWRldi0+Y2FyZF9saW5rID0gTlVMTDsKLQkJdXBfd3JpdGUoJmRldi0+ZGV2LmJ1cy0+c3Vic3lzLnJ3c2VtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRldmljZV9iaW5kX2RyaXZlcigmZGV2LT5kZXYpOworCWlmIChwbnBfYnVzX3R5cGUucHJvYmUoJmRldi0+ZGV2KSkKKwkJZ290byBlcnJfb3V0OworCWlmIChkZXZpY2VfYmluZF9kcml2ZXIoJmRldi0+ZGV2KSkKKwkJZ290byBlcnJfb3V0OworCiAJdXBfd3JpdGUoJmRldi0+ZGV2LmJ1cy0+c3Vic3lzLnJ3c2VtKTsKIAogCXJldHVybiBkZXY7CisKK2Vycl9vdXQ6CisJZGV2LT5kZXYuZHJpdmVyID0gTlVMTDsKKwlkZXYtPmNhcmRfbGluayA9IE5VTEw7CisJdXBfd3JpdGUoJmRldi0+ZGV2LmJ1cy0+c3Vic3lzLnJ3c2VtKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcG5wL2ludGVyZmFjZS5jCmluZGV4IDlkOGI0MTUuLmFjOWZjZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcG5wL2ludGVyZmFjZS5jCkBAIC00NjEsOCArNDYxLDE5IEBACiAKIGludCBwbnBfaW50ZXJmYWNlX2F0dGFjaF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikKIHsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCZkZXZfYXR0cl9vcHRpb25zKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCZkZXZfYXR0cl9yZXNvdXJjZXMpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsJmRldl9hdHRyX2lkKTsKKwlpbnQgcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCZkZXZfYXR0cl9vcHRpb25zKTsKKwlpZiAocmMpIGdvdG8gZXJyOworCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwmZGV2X2F0dHJfcmVzb3VyY2VzKTsKKwlpZiAocmMpIGdvdG8gZXJyX29wdDsKKwlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsJmRldl9hdHRyX2lkKTsKKwlpZiAocmMpIGdvdG8gZXJyX3JlczsKKwogCXJldHVybiAwOworCitlcnJfcmVzOgorCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsJmRldl9hdHRyX3Jlc291cmNlcyk7CitlcnJfb3B0OgorCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsJmRldl9hdHRyX29wdGlvbnMpOworZXJyOgorCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMgYi9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCmluZGV4IDNhYzViMTIuLmEwYjE1ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYwpAQCAtMzk1LDcgKzM5NSw3IEBACiAJc3RydWN0IHBucF9pZCAqIGlkOwogCWlmICghZGV2KQogCQlyZXR1cm47Ci0JaWQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CisJaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpZCkKIAkJcmV0dXJuOwogCXNwcmludGYoaWQtPmlkLCAiJWMlYyVjJXgleCV4JXgiLApAQCAtNDE5LDcgKzQxOSw3IEBACiAJc3RydWN0IHBucF9kZXYgKmRldjsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JZGV2ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKIAlkZXYtPm51bWJlciA9IG51bWJlcjsKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCXVuc2lnbmVkIGxvbmcgYml0czsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JaXJxID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKKwlpcnEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lycSksIEdGUF9LRVJORUwpOwogCWlmICghaXJxKQogCQlyZXR1cm47CiAJYml0cyA9ICh0bXBbMV0gPDwgOCkgfCB0bXBbMF07CkBAIC00NzQsNyArNDc0LDcgQEAKIAlzdHJ1Y3QgcG5wX2RtYSAqZG1hOwogCiAJaXNhcG5wX3BlZWsodG1wLCBzaXplKTsKLQlkbWEgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2RtYSksIEdGUF9LRVJORUwpOworCWRtYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkbWEpCiAJCXJldHVybjsKIAlkbWEtPm1hcCA9IHRtcFswXTsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCXN0cnVjdCBwbnBfcG9ydCAqcG9ydDsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOworCXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvcnQpCiAJCXJldHVybjsKIAlwb3J0LT5taW4gPSAodG1wWzJdIDw8IDgpIHwgdG1wWzFdOwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJc3RydWN0IHBucF9wb3J0ICpwb3J0OwogCiAJaXNhcG5wX3BlZWsodG1wLCBzaXplKTsKLQlwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9IHBvcnQtPm1heCA9ICh0bXBbMV0gPDwgOCkgfCB0bXBbMF07CkBAIC01MzksNyArNTM5LDcgQEAKIAlzdHJ1Y3QgcG5wX21lbSAqbWVtOwogCiAJaXNhcG5wX3BlZWsodG1wLCBzaXplKTsKLQltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOworCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKIAltZW0tPm1pbiA9ICgodG1wWzJdIDw8IDgpIHwgdG1wWzFdKSA8PCA4OwpAQCAtNTYyLDcgKzU2Miw3IEBACiAJc3RydWN0IHBucF9tZW0gKm1lbTsKIAogCWlzYXBucF9wZWVrKHRtcCwgc2l6ZSk7Ci0JbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwltZW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSAodG1wWzRdIDw8IDI0KSB8ICh0bXBbM10gPDwgMTYpIHwgKHRtcFsyXSA8PCA4KSB8IHRtcFsxXTsKQEAgLTU4NCw3ICs1ODQsNyBAQAogCXN0cnVjdCBwbnBfbWVtICptZW07CiAKIAlpc2FwbnBfcGVlayh0bXAsIHNpemUpOwotCW1lbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwogCW1lbS0+bWluID0gbWVtLT5tYXggPSAodG1wWzRdIDw8IDI0KSB8ICh0bXBbM10gPDwgMTYpIHwgKHRtcFsyXSA8PCA4KSB8IHRtcFsxXTsKQEAgLTgyOSw3ICs4MjksNyBAQAogCiBzdGF0aWMgdm9pZCBpc2FwbnBfcGFyc2VfY2FyZF9pZChzdHJ1Y3QgcG5wX2NhcmQgKiBjYXJkLCB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsIHVuc2lnbmVkIHNob3J0IGRldmljZSkKIHsKLQlzdHJ1Y3QgcG5wX2lkICogaWQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHBucF9pZCAqIGlkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCWlmICghaWQpCiAJCXJldHVybjsKIAlzcHJpbnRmKGlkLT5pZCwgIiVjJWMlYyV4JXgleCV4IiwKQEAgLTg2NSw3ICs4NjUsNyBAQAogCQkJaGVhZGVyWzRdLCBoZWFkZXJbNV0sIGhlYWRlcls2XSwgaGVhZGVyWzddLCBoZWFkZXJbOF0pOwogCQlwcmludGsoS0VSTl9ERUJVRyAiY2hlY2tzdW0gPSAweCV4XG4iLCBjaGVja3N1bSk7CiAjZW5kaWYKLQkJaWYgKChjYXJkID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWlmICgoY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfY2FyZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKIAkJY2FyZC0+bnVtYmVyID0gY3NuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvaXNhcG5wL3Byb2MuYyBiL2RyaXZlcnMvcG5wL2lzYXBucC9wcm9jLmMKaW5kZXggOTU4YzExYi4uZDIxZjNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvaXNhcG5wL3Byb2MuYworKysgYi9kcml2ZXJzL3BucC9pc2FwbnAvcHJvYy5jCkBAIC01Niw3ICs1Niw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IGlzYXBucF9wcm9jX2J1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGlub2RlICppbm8gPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm8pOwogCXN0cnVjdCBwbnBfZGV2ICpkZXYgPSBkcC0+ZGF0YTsKIAlpbnQgcG9zID0gKnBwb3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCmluZGV4IDZjZjM0YTYuLjYyZWRhNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlwbnBfZGJnKCJBQ1BJIGRldmljZSA6IGhpZCAlcyIsIGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpKTsKLQlkZXYgPSAga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYgPSAga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewogCQlwbnBfZXJyKCJPdXQgb2YgbWVtb3J5Iik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJZGV2LT5udW1iZXIgPSBudW07CiAJCiAJLyogc2V0IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIFBuUCBkZXZpY2UgKi8KLQlkZXZfaWQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CisJZGV2X2lkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCWlmICghZGV2X2lkKQogCQlnb3RvIGVycjsKIAlwbnBpZGFjcGlfdG9fcG5waWQoYWNwaV9kZXZpY2VfaGlkKGRldmljZSksIGRldl9pZC0+aWQpOwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBjaWRfbGlzdC0+Y291bnQ7IGkrKykgewogCQkJaWYgKCFpc3BucGlkYWNwaShjaWRfbGlzdC0+aWRbaV0udmFsdWUpKQogCQkJCWNvbnRpbnVlOwotCQkJZGV2X2lkID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOworCQkJZGV2X2lkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pZCksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFkZXZfaWQpCiAJCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwppbmRleCBkYzc5YjBhLi43YTUzNTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCkBAIC0yOTgsNyArMjk4LDcgQEAKIAogCWlmIChwLT5jaGFubmVsX2NvdW50ID09IDApCiAJCXJldHVybjsKLQlkbWEgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2RtYSksIEdGUF9LRVJORUwpOworCWRtYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkbWEpCiAJCXJldHVybjsKIApAQCAtMzU0LDcgKzM1NCw3IEBACiAKIAlpZiAocC0+aW50ZXJydXB0X2NvdW50ID09IDApCiAJCXJldHVybjsKLQlpcnEgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lycSksIEdGUF9LRVJORUwpOworCWlycSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpcnEpCiAJCXJldHVybjsKIApAQCAtMzc1LDcgKzM3NSw3IEBACiAKIAlpZiAocC0+aW50ZXJydXB0X2NvdW50ID09IDApCiAJCXJldHVybjsKLQlpcnEgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lycSksIEdGUF9LRVJORUwpOworCWlycSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpcnEpCiAJCXJldHVybjsKIApAQCAtMzk2LDcgKzM5Niw3IEBACiAKIAlpZiAoaW8tPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKLQlwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9IGlvLT5taW5pbXVtOwpAQCAtNDE3LDcgKzQxNyw3IEBACiAKIAlpZiAoaW8tPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKLQlwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9IHBvcnQtPm1heCA9IGlvLT5hZGRyZXNzOwpAQCAtNDM2LDcgKzQzNiw3IEBACiAKIAlpZiAocC0+YWRkcmVzc19sZW5ndGggPT0gMCkKIAkJcmV0dXJuOwotCW1lbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CisJbWVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuOwogCW1lbS0+bWluID0gcC0+bWluaW11bTsKQEAgLTQ1OSw3ICs0NTksNyBAQAogCiAJaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKLQltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOworCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKIAltZW0tPm1pbiA9IHAtPm1pbmltdW07CkBAIC00ODIsNyArNDgyLDcgQEAKIAogCWlmIChwLT5hZGRyZXNzX2xlbmd0aCA9PSAwKQogCQlyZXR1cm47Ci0JbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwltZW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSBtZW0tPm1heCA9IHAtPmFkZHJlc3M7CkBAIC01MTQsNyArNTE0LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHAtPnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKLQkJbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwkJbWVtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtZW0pCiAJCQlyZXR1cm47CiAJCW1lbS0+bWluID0gbWVtLT5tYXggPSBwLT5taW5pbXVtOwpAQCAtNTI0LDcgKzUyNCw3IEBACiAJCSAgICBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZKSA/IElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSA6IDA7CiAJCXBucF9yZWdpc3Rlcl9tZW1fcmVzb3VyY2Uob3B0aW9uLCBtZW0pOwogCX0gZWxzZSBpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKSB7Ci0JCXBvcnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwkJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvcnQpCiAJCQlyZXR1cm47CiAJCXBvcnQtPm1pbiA9IHBvcnQtPm1heCA9IHAtPm1pbmltdW07CkBAIC03MjEsNyArNzIxLDcgQEAKIAlpZiAoIXJlc19jbnQpCiAJCXJldHVybiAtRUlOVkFMOwogCWJ1ZmZlci0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKSAqIChyZXNfY250ICsgMSkgKyAxOwotCWJ1ZmZlci0+cG9pbnRlciA9IGtjYWxsb2MoMSwgYnVmZmVyLT5sZW5ndGggLSAxLCBHRlBfS0VSTkVMKTsKKwlidWZmZXItPnBvaW50ZXIgPSBremFsbG9jKGJ1ZmZlci0+bGVuZ3RoIC0gMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZmZXItPnBvaW50ZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCXBucF9kYmcoIlJlcyBjbnQgJWQiLCByZXNfY250KTsKQEAgLTc3NiwyMSArNzc2LDMyIEBACiAJc3RydWN0IHJlc291cmNlICpwKQogewogCS8qIE5vdGU6IHBucF9hc3NpZ25fZG1hIHdpbGwgY29weSBwbnBfZG1hLT5mbGFncyBpbnRvIHAtPmZsYWdzICovCi0JaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfQ09NUEFUSUJMRSkKLQkJcmVzb3VyY2UtPmRhdGEuZG1hLnR5cGUgPSBBQ1BJX0NPTVBBVElCSUxJVFk7Ci0JZWxzZSBpZiAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV9UWVBFQSkKLQkJcmVzb3VyY2UtPmRhdGEuZG1hLnR5cGUgPSBBQ1BJX1RZUEVfQTsKLQllbHNlIGlmIChwLT5mbGFncyAmIElPUkVTT1VSQ0VfRE1BX1RZUEVCKQotCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9COwotCWVsc2UgaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfVFlQRUYpCi0JCXJlc291cmNlLT5kYXRhLmRtYS50eXBlID0gQUNQSV9UWVBFX0Y7Ci0JaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfOEJJVCkKLQkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl84OwotCWVsc2UgaWYgKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfOEFORDE2QklUKQotCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHJhbnNmZXIgPSBBQ1BJX1RSQU5TRkVSXzhfMTY7Ci0JZWxzZSBpZiAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV8xNkJJVCkKLQkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl8xNjsKLQlyZXNvdXJjZS0+ZGF0YS5kbWEuYnVzX21hc3RlciA9IHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfTUFTVEVSOworCXN3aXRjaCAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV9TUEVFRF9NQVNLKSB7CisJCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUE6CisJCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9BOworCQkJYnJlYWs7CisJCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUI6CisJCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9COworCQkJYnJlYWs7CisJCWNhc2UgSU9SRVNPVVJDRV9ETUFfVFlQRUY6CisJCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfVFlQRV9GOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfQ09NUEFUSUJJTElUWTsKKwl9CisKKwlzd2l0Y2ggKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfVFlQRV9NQVNLKSB7CisJCWNhc2UgSU9SRVNPVVJDRV9ETUFfOEJJVDoKKwkJCXJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9IEFDUElfVFJBTlNGRVJfODsKKwkJCWJyZWFrOworCQljYXNlIElPUkVTT1VSQ0VfRE1BXzhBTkQxNkJJVDoKKwkJCXJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9IEFDUElfVFJBTlNGRVJfOF8xNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID0gQUNQSV9UUkFOU0ZFUl8xNjsKKwl9CisKKwlyZXNvdXJjZS0+ZGF0YS5kbWEuYnVzX21hc3RlciA9ICEhKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9ETUFfTUFTVEVSKTsKIAlyZXNvdXJjZS0+ZGF0YS5kbWEuY2hhbm5lbF9jb3VudCA9IDE7CiAJcmVzb3VyY2UtPmRhdGEuZG1hLmNoYW5uZWxzWzBdID0gcC0+c3RhcnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCmluZGV4IDgxYTZjODMuLjk1NzM4ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jCkBAIC02MSw2ICs2MSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgpAQCAtMTA4LDEwICsxMDksMTAgQEAKIAlpZiAoIWN1cnJlbnQtPmZzLT5yb290KSB7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KLQlpZiAoIShlbnZwID0gKGNoYXIgKiopIGtjYWxsb2MgKDIwLCBzaXplb2YgKGNoYXIgKiksIEdGUF9LRVJORUwpKSkgeworCWlmICghKGVudnAgPSBrY2FsbG9jKDIwLCBzaXplb2YgKGNoYXIgKiksIEdGUF9LRVJORUwpKSkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JaWYgKCEoYnVmID0ga2NhbGxvYyAoMSwgMjU2LCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShidWYgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCkpKSB7CiAJCWtmcmVlIChlbnZwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjE5LDcgKzIyMCw3IEBACiAJaWYoIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOworCW5vZGUgPSBremFsbG9jKG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5vZGUpCiAJCXJldHVybiAtMTsKIAlpZiAocG5wX2Jpb3NfZ2V0X2Rldl9ub2RlKCZub2RlbnVtLCAoY2hhciApUE5QTU9ERV9EWU5BTUlDLCBub2RlKSkgewpAQCAtMjQyLDcgKzI0Myw3IEBACiAJaWYgKCFwbnBiaW9zX2lzX2R5bmFtaWMoZGV2KSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCW5vZGUgPSBrY2FsbG9jKDEsIG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlub2RlID0ga3phbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKQogCQlyZXR1cm4gLTE7CiAJaWYgKHBucF9iaW9zX2dldF9kZXZfbm9kZSgmbm9kZW51bSwgKGNoYXIgKVBOUE1PREVfRFlOQU1JQywgbm9kZSkpIHsKQEAgLTI5Myw3ICsyOTQsNyBAQAogCWlmKGRldi0+ZmxhZ3MgJiBQTlBCSU9TX05PX0RJU0FCTEUgfHwgIXBucGJpb3NfaXNfZHluYW1pYyhkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOworCW5vZGUgPSBremFsbG9jKG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5vZGUpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zMzUsNyArMzM2LDcgQEAKIAl9CiAKIAkvKiBzZXQgdGhlIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgUG5QIGRldmljZSAqLwotCWRldl9pZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKKwlkZXZfaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZfaWQpCiAJCXJldHVybiAtMTsKIAlwbnBpZDMyX3RvX3BucGlkKG5vZGUtPmVpc2FfaWQsaWQpOwpAQCAtMzczLDcgKzM3NCw3IEBACiAJc3RydWN0IHBucF9iaW9zX25vZGUgKm5vZGU7CiAJc3RydWN0IHBucF9kZXYgKmRldjsKIAotCW5vZGUgPSBrY2FsbG9jKDEsIG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlub2RlID0ga3phbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKQogCQlyZXR1cm47CiAKQEAgLTM5MCw3ICszOTEsNyBAQAogCQkJCWJyZWFrOwogCQl9CiAJCW5vZGVzX2dvdCsrOwotCQlkZXYgPSAga2NhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBwbnBfZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWRldiA9ICBremFsbG9jKHNpemVvZiAoc3RydWN0IHBucF9kZXYpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkZXYpCiAJCQlicmVhazsKIAkJaWYoaW5zZXJ0X2RldmljZShkZXYsbm9kZSk8MCkKQEAgLTUzMCw3ICs1MzEsOCBAQAogCWlmIChjaGVja19sZWdhY3lfaW9wb3J0KFBOUEJJT1NfQkFTRSkpCiAJCXJldHVybiAtRU5PREVWOwogI2VuZGlmCi0JaWYgKHBucGJpb3NfZGlzYWJsZWQgfHwgZG1pX2NoZWNrX3N5c3RlbShwbnBiaW9zX2RtaV90YWJsZSkpIHsKKwlpZiAocG5wYmlvc19kaXNhYmxlZCB8fCBkbWlfY2hlY2tfc3lzdGVtKHBucGJpb3NfZG1pX3RhYmxlKSB8fAorCSAgICBwYXJhdmlydF9lbmFibGVkKCkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUG5QQklPUzogRGlzYWJsZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL3Byb2MuYyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvcHJvYy5jCmluZGV4IDVhM2RmYzkuLjgwMjcwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcHJvYy5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvcHJvYy5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJCXJldHVybiAtRUZCSUc7CiAJfQogCi0JdG1wYnVmID0ga2NhbGxvYygxLCBlc2NkLmVzY2Rfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJdG1wYnVmID0ga3phbGxvYyhlc2NkLmVzY2Rfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0bXBidWYpIHJldHVybiAtRU5PTUVNOwogCiAJaWYgKHBucF9iaW9zX3JlYWRfZXNjZCh0bXBidWYsIGVzY2QubnZfc3RvcmFnZV9iYXNlKSkgewpAQCAtMTMzLDcgKzEzMyw3IEBACiAJaWYgKHBvcyA+PSAweGZmKQogCQlyZXR1cm4gMDsKIAotCW5vZGUgPSBrY2FsbG9jKDEsIG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlub2RlID0ga3phbGxvYyhub2RlX2luZm8ubWF4X25vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKSByZXR1cm4gLUVOT01FTTsKIAogCWZvciAobm9kZW51bT1wb3M7IG5vZGVudW08MHhmZjsgKSB7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAl1OCBub2RlbnVtID0gKGxvbmcpZGF0YTsKIAlpbnQgbGVuOwogCi0Jbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOworCW5vZGUgPSBremFsbG9jKG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5vZGUpIHJldHVybiAtRU5PTUVNOwogCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIGJvb3QsIG5vZGUpKSB7CiAJCWtmcmVlKG5vZGUpOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJdTggbm9kZW51bSA9IChsb25nKWRhdGE7CiAJaW50IHJldCA9IGNvdW50OwogCi0Jbm9kZSA9IGtjYWxsb2MoMSwgbm9kZV9pbmZvLm1heF9ub2RlX3NpemUsIEdGUF9LRVJORUwpOworCW5vZGUgPSBremFsbG9jKG5vZGVfaW5mby5tYXhfbm9kZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5vZGUpCiAJCXJldHVybiAtRU5PTUVNOwogCWlmIChwbnBfYmlvc19nZXRfZGV2X25vZGUoJm5vZGVudW0sIGJvb3QsIG5vZGUpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMKaW5kZXggZWY1MDhhNC4uOTViNzk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiBwbnBiaW9zX3BhcnNlX21lbV9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCiB7CiAJc3RydWN0IHBucF9tZW0gKiBtZW07Ci0JbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwltZW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSAoKHBbNV0gPDwgOCkgfCBwWzRdKSA8PCA4OwpAQCAtMjY0LDcgKzI2NCw3IEBACiBwbnBiaW9zX3BhcnNlX21lbTMyX29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKLQltZW0gPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOworCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfbWVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZW0pCiAJCXJldHVybjsKIAltZW0tPm1pbiA9IChwWzddIDw8IDI0KSB8IChwWzZdIDw8IDE2KSB8IChwWzVdIDw8IDgpIHwgcFs0XTsKQEAgLTI4MCw3ICsyODAsNyBAQAogcG5wYmlvc19wYXJzZV9maXhlZF9tZW0zMl9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCiB7CiAJc3RydWN0IHBucF9tZW0gKiBtZW07Ci0JbWVtID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9tZW0pLCBHRlBfS0VSTkVMKTsKKwltZW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX21lbSksIEdGUF9LRVJORUwpOwogCWlmICghbWVtKQogCQlyZXR1cm47CiAJbWVtLT5taW4gPSBtZW0tPm1heCA9IChwWzddIDw8IDI0KSB8IChwWzZdIDw8IDE2KSB8IChwWzVdIDw8IDgpIHwgcFs0XTsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCXN0cnVjdCBwbnBfaXJxICogaXJxOwogCXVuc2lnbmVkIGxvbmcgYml0czsKIAotCWlycSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfaXJxKSwgR0ZQX0tFUk5FTCk7CisJaXJxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9pcnEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycSkKIAkJcmV0dXJuOwogCWJpdHMgPSAocFsyXSA8PCA4KSB8IHBbMV07CkBAIC0zMTQsNyArMzE0LDcgQEAKIHBucGJpb3NfcGFyc2VfZG1hX29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX2RtYSAqIGRtYTsKLQlkbWEgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2RtYSksIEdGUF9LRVJORUwpOworCWRtYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfZG1hKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkbWEpCiAJCXJldHVybjsKIAlkbWEtPm1hcCA9IHBbMV07CkBAIC0zMjcsNyArMzI3LDcgQEAKIHBucGJpb3NfcGFyc2VfcG9ydF9vcHRpb24odW5zaWduZWQgY2hhciAqcCwgaW50IHNpemUsIHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24pCiB7CiAJc3RydWN0IHBucF9wb3J0ICogcG9ydDsKLQlwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydCkKIAkJcmV0dXJuOwogCXBvcnQtPm1pbiA9IChwWzNdIDw8IDgpIHwgcFsyXTsKQEAgLTM0Myw3ICszNDMsNyBAQAogcG5wYmlvc19wYXJzZV9maXhlZF9wb3J0X29wdGlvbih1bnNpZ25lZCBjaGFyICpwLCBpbnQgc2l6ZSwgc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbikKIHsKIAlzdHJ1Y3QgcG5wX3BvcnQgKiBwb3J0OwotCXBvcnQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBucF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CiAJcG9ydC0+bWluID0gcG9ydC0+bWF4ID0gKHBbMl0gPDwgOCkgfCBwWzFdOwpAQCAtNTI3LDcgKzUyNyw3IEBACiAJCWNhc2UgU01BTExfVEFHX0NPTVBBVERFVklEOiAvKiBjb21wYXRpYmxlIElEICovCiAJCQlpZiAobGVuICE9IDQpCiAJCQkJZ290byBsZW5fZXJyOwotCQkJZGV2X2lkID0gIGtjYWxsb2MoMSwgc2l6ZW9mIChzdHJ1Y3QgcG5wX2lkKSwgR0ZQX0tFUk5FTCk7CisJCQlkZXZfaWQgPSAga3phbGxvYyhzaXplb2YgKHN0cnVjdCBwbnBfaWQpLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghZGV2X2lkKQogCQkJCXJldHVybiBOVUxMOwogCQkJbWVtc2V0KGRldl9pZCwgMCwgc2l6ZW9mKHN0cnVjdCBwbnBfaWQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL01ha2VmaWxlIGIvZHJpdmVycy9wczMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzM2ViNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcHMzL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLXkgKz0gc3lzdGVtLWJ1cy5vCitvYmotJChDT05GSUdfUFMzX1ZVQVJUKSArPSB2dWFydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9zeXN0ZW0tYnVzLmMgYi9kcml2ZXJzL3BzMy9zeXN0ZW0tYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5Zjk0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcHMzL3N5c3RlbS1idXMuYwpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqICBQUzMgc3lzdGVtIGJ1cyBkcml2ZXIuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9wczMuaD4KKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorCisjZGVmaW5lIGR1bXBfbW1pb19yZWdpb24oX2EpIF9kdW1wX21taW9fcmVnaW9uKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfZHVtcF9tbWlvX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uKiByLAorCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogZGV2ICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLCByLT5kaWQuYnVzX2lkLAorCQlyLT5kaWQuZGV2X2lkKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19hZGRyICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5idXNfYWRkcik7CisJcHJfZGVidWcoIiVzOiVkOiBsZW4gICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bGVuKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGxwYXJfYWRkciAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5scGFyX2FkZHIpOworfQorCitpbnQgcHMzX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9tbWlvX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAorCQlyLT5idXNfYWRkciwgci0+bGVuLCByLT5wYWdlX3NpemUsICZyLT5scGFyX2FkZHIpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9tYXBfZGV2aWNlX21taW9fcmVnaW9uIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXItPmxwYXJfYWRkciA9IHItPmxlbiA9IHItPmJ1c19hZGRyID0gMDsKKwl9CisKKwlkdW1wX21taW9fcmVnaW9uKHIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBsdjFfdW5tYXBfZGV2aWNlX21taW9fcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJCXItPmJ1c19hZGRyKTsKKworCWlmIChyZXN1bHQpCisJCXByX2RlYnVnKCIlczolZDogbHYxX3VubWFwX2RldmljZV9tbWlvX3JlZ2lvbiBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCisJci0+bHBhcl9hZGRyID0gci0+bGVuID0gci0+YnVzX2FkZHIgPSAwOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3N5c3RlbV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqX2RldiwKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RyaXZlcihfZHJ2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisKKwlyZXN1bHQgPSBkZXYtPm1hdGNoX2lkID09IGRydi0+bWF0Y2hfaWQ7CisKKwlwcl9pbmZvKCIlczolZDogZGV2PSV1KCVzKSwgZHJ2PSV1KCVzKTogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCwgZGV2LT5jb3JlLmJ1c19pZCwgZHJ2LT5tYXRjaF9pZCwgZHJ2LT5jb3JlLm5hbWUsCisJCShyZXN1bHQgPyAibWF0Y2giIDogIm1pc3MiKSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfc3lzdGVtX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydiA9CisJCXRvX3BzM19zeXN0ZW1fYnVzX2RyaXZlcihfZGV2LT5kcml2ZXIpOworCisJcmVzdWx0ID0gbHYxX29wZW5fZGV2aWNlKGRldi0+ZGlkLmJ1c19pZCwgZGV2LT5kaWQuZGV2X2lkLCAwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfb3Blbl9kZXZpY2UgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCXJlc3VsdCA9IC1FQUNDRVM7CisJCWdvdG8gY2xlYW5fbm9uZTsKKwl9CisKKwlpZiAoZGV2LT5kX3JlZ2lvbi0+ZGlkLmJ1c19pZCkgeworCQlyZXN1bHQgPSBwczNfZG1hX3JlZ2lvbl9jcmVhdGUoZGV2LT5kX3JlZ2lvbik7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX3JlZ2lvbl9jcmVhdGUgZmFpbGVkICglZClcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQkJQlVHX09OKCJjaGVjayByZWdpb24gdHlwZSIpOworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW5fZGV2aWNlOworCQl9CisJfQorCisJQlVHX09OKCFkcnYpOworCisJaWYgKGRydi0+cHJvYmUpCisJCXJlc3VsdCA9IGRydi0+cHJvYmUoZGV2KTsKKwllbHNlCisJCXByX2luZm8oIiVzOiVkOiAlcyBubyBwcm9iZSBtZXRob2RcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCWRldi0+Y29yZS5idXNfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGRydi0+cHJvYmUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGNsZWFuX2RtYTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworCitjbGVhbl9kbWE6CisJcHMzX2RtYV9yZWdpb25fZnJlZShkZXYtPmRfcmVnaW9uKTsKK2NsZWFuX2RldmljZToKKwlsdjFfY2xvc2VfZGV2aWNlKGRldi0+ZGlkLmJ1c19pZCwgZGV2LT5kaWQuZGV2X2lkKTsKK2NsZWFuX25vbmU6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfc3lzdGVtX2J1c19yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0KKwkJdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKF9kZXYtPmRyaXZlcik7CisKKwlpZiAoZHJ2LT5yZW1vdmUpCisJCWRydi0+cmVtb3ZlKGRldik7CisJZWxzZQorCQlwcl9pbmZvKCIlczolZDogJXMgbm8gcmVtb3ZlIG1ldGhvZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJZGV2LT5jb3JlLmJ1c19pZCk7CisKKwlwczNfZG1hX3JlZ2lvbl9mcmVlKGRldi0+ZF9yZWdpb24pOworCXBzM19mcmVlX21taW9fcmVnaW9uKGRldi0+bV9yZWdpb24pOworCWx2MV9jbG9zZV9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBidXNfdHlwZSBwczNfc3lzdGVtX2J1c190eXBlID0geworICAgICAgICAubmFtZSA9ICJwczNfc3lzdGVtX2J1cyIsCisJLm1hdGNoID0gcHMzX3N5c3RlbV9idXNfbWF0Y2gsCisJLnByb2JlID0gcHMzX3N5c3RlbV9idXNfcHJvYmUsCisJLnJlbW92ZSA9IHBzM19zeXN0ZW1fYnVzX3JlbW92ZSwKK307CisKK2ludCBfX2luaXQgcHMzX3N5c3RlbV9idXNfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpCisJCXJldHVybiAwOworCisJcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZwczNfc3lzdGVtX2J1c190eXBlKTsKKwlCVUdfT04ocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitjb3JlX2luaXRjYWxsKHBzM19zeXN0ZW1fYnVzX2luaXQpOworCisvKiBBbGxvY2F0ZXMgYSBjb250aWd1b3VzIHJlYWwgYnVmZmVyIGFuZCBjcmVhdGVzIG1hcHBpbmdzIG92ZXIgaXQuCisgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQgc2V0cyBkbWFfaGFuZGxlCisgKiB0byB0aGUgZG1hIGFkZHJlc3MgKG1hcHBpbmcpIG9mIHRoZSBmaXJzdCBwYWdlLgorICovCisKK3N0YXRpYyB2b2lkICogcHMzX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKl9kZXYsIHNpemVfdCBzaXplLAorCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHI7CisKKwlCVUdfT04oIWRldi0+ZF9yZWdpb24tPmJ1c19hZGRyKTsKKworCWZsYWcgJj0gfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKTsKKwlmbGFnIHw9IF9fR0ZQX1pFUk87CisKKwl2aXJ0X2FkZHIgPSBfX2dldF9mcmVlX3BhZ2VzKGZsYWcsIGdldF9vcmRlcihzaXplKSk7CisKKwlpZiAoIXZpcnRfYWRkcikgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IGdldF9mcmVlX3BhZ2VzIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBjbGVhbl9ub25lOworCX0KKworCXJlc3VsdCA9IHBzM19kbWFfbWFwKGRldi0+ZF9yZWdpb24sIHZpcnRfYWRkciwgc2l6ZSwgZG1hX2hhbmRsZSk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9tYXAgZmFpbGVkICglZClcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CisJCUJVR19PTigiY2hlY2sgcmVnaW9uIHR5cGUiKTsKKwkJZ290byBjbGVhbl9hbGxvYzsKKwl9CisKKwlyZXR1cm4gKHZvaWQqKXZpcnRfYWRkcjsKKworY2xlYW5fYWxsb2M6CisJZnJlZV9wYWdlcyh2aXJ0X2FkZHIsIGdldF9vcmRlcihzaXplKSk7CitjbGVhbl9ub25lOgorCWRtYV9oYW5kbGUgPSBOVUxMOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwczNfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsCisJZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKworCXBzM19kbWFfdW5tYXAoZGV2LT5kX3JlZ2lvbiwgZG1hX2hhbmRsZSwgc2l6ZSk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKK30KKworLyogQ3JlYXRlcyBUQ0VzIGZvciBhIHVzZXIgcHJvdmlkZWQgYnVmZmVyLiAgVGhlIHVzZXIgYnVmZmVyIG11c3QgYmUKKyAqIGNvbnRpZ3VvdXMgcmVhbCBrZXJuZWwgc3RvcmFnZSAobm90IHZtYWxsb2MpLiAgVGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogcGFzc2VkIGhlcmUgaXMgdGhlIGtlcm5lbCAodmlydHVhbCkgYWRkcmVzcyBvZiB0aGUgYnVmZmVyLiAgVGhlIGJ1ZmZlcgorICogbmVlZCBub3QgYmUgcGFnZSBhbGlnbmVkLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCB3aWxsIHBvaW50IHRvIHRoZSBzYW1lCisgKiBieXRlIHdpdGhpbiB0aGUgcGFnZSBhcyB2YWRkci4KKyAqLworCitzdGF0aWMgZG1hX2FkZHJfdCBwczNfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOworCisJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgKHVuc2lnbmVkIGxvbmcpcHRyLCBzaXplLAorCQkmYnVzX2FkZHIpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfbWFwIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCX0KKworCXJldHVybiBidXNfYWRkcjsKK30KKworc3RhdGljIHZvaWQgcHMzX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBwczNfZG1hX3VubWFwKGRldi0+ZF9yZWdpb24sIGRtYV9hZGRyLCBzaXplKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX3VubWFwIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCX0KK30KKworc3RhdGljIGludCBwczNfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisjaWYgZGVmaW5lZChDT05GSUdfUFMzX0RZTkFNSUNfRE1BKQorCUJVR19PTigiZG8iKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwczNfdW5tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19QUzNfRFlOQU1JQ19ETUEpCisJQlVHX09OKCJkbyIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgcHMzX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqX2RldiwgdTY0IG1hc2spCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBzM19kbWFfb3BzID0geworCS5hbGxvY19jb2hlcmVudCA9IHBzM19hbGxvY19jb2hlcmVudCwKKwkuZnJlZV9jb2hlcmVudCA9IHBzM19mcmVlX2NvaGVyZW50LAorCS5tYXBfc2luZ2xlID0gcHMzX21hcF9zaW5nbGUsCisJLnVubWFwX3NpbmdsZSA9IHBzM191bm1hcF9zaW5nbGUsCisJLm1hcF9zZyA9IHBzM19tYXBfc2csCisJLnVubWFwX3NnID0gcHMzX3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkID0gcHMzX2RtYV9zdXBwb3J0ZWQKK307CisKKy8qKgorICogcHMzX3N5c3RlbV9idXNfcmVsZWFzZV9kZXZpY2UgLSByZW1vdmUgYSBkZXZpY2UgZnJvbSB0aGUgc3lzdGVtIGJ1cworICovCisKK3N0YXRpYyB2b2lkIHBzM19zeXN0ZW1fYnVzX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCWtmcmVlKGRldik7Cit9CisKKy8qKgorICogcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIC0gYWRkIGEgZGV2aWNlIHRvIHRoZSBzeXN0ZW0gYnVzCisgKgorICogcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCkgZXhwZWN0cyB0aGUgZGV2IG9iamVjdCB0byBiZSBhbGxvY2F0ZWQKKyAqIGR5bmFtaWNhbGx5IGJ5IHRoZSBjYWxsZXIuICBUaGUgc3lzdGVtIGJ1cyB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIGRldgorICogb2JqZWN0IGFuZCBmcmVlcyB0aGUgb2JqZWN0IGluIHBzM19zeXN0ZW1fYnVzX3JlbGVhc2VfZGV2aWNlKCkuCisgKi8KKworaW50IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9jb3VudCA9IDE7CisKKwlkZXYtPmNvcmUucGFyZW50ID0gTlVMTDsKKwlkZXYtPmNvcmUuYnVzID0gJnBzM19zeXN0ZW1fYnVzX3R5cGU7CisJZGV2LT5jb3JlLnJlbGVhc2UgPSBwczNfc3lzdGVtX2J1c19yZWxlYXNlX2RldmljZTsKKworCWRldi0+Y29yZS5hcmNoZGF0YS5vZl9ub2RlID0gTlVMTDsKKwlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfZG1hX29wczsKKwlkZXYtPmNvcmUuYXJjaGRhdGEubnVtYV9ub2RlID0gMDsKKworCXNucHJpbnRmKGRldi0+Y29yZS5idXNfaWQsIHNpemVvZihkZXYtPmNvcmUuYnVzX2lkKSwgInNiXyUwMngiLAorCQlkZXZfY291bnQrKyk7CisKKwlwcl9kZWJ1ZygiJXM6JWQgYWRkICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Y29yZS5idXNfaWQpOworCisJcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPmNvcmUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3Rlcik7CisKK2ludCBwczNfc3lzdGVtX2J1c19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2KQoreworCWludCByZXN1bHQ7CisKKwlkcnYtPmNvcmUuYnVzID0gJnBzM19zeXN0ZW1fYnVzX3R5cGU7CisKKwlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocHMzX3N5c3RlbV9idXNfZHJpdmVyX3JlZ2lzdGVyKTsKKwordm9pZCBwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmMgYi9kcml2ZXJzL3BzMy92dWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzRmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BzMy92dWFydC5jCkBAIC0wLDAgKzEsOTY1IEBACisvKgorICogIFBTMyB2aXJ0dWFsIHVhcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDYgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vcHMzLmg+CisKKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworI2luY2x1ZGUgInZ1YXJ0LmgiCisKK01PRFVMRV9BVVRIT1IoIlNvbnkgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigicHMzIHZ1YXJ0Iik7CisKKy8qKgorICogdnVhcnQgLSBBbiBpbnRlci1wYXJ0aXRpb24gZGF0YSBsaW5rIHNlcnZpY2UuCisgKiAgcG9ydCAwOiBQUzMgQVYgU2V0dGluZ3MuCisgKiAgcG9ydCAyOiBQUzMgU3lzdGVtIE1hbmFnZXIuCisgKgorICogVGhlIHZ1YXJ0IHByb3ZpZGVzIGEgYmktZGlyZWN0aW9uYWwgYnl0ZSBzdHJlYW0gZGF0YSBsaW5rIGJldHdlZW4gbG9naWNhbAorICogcGFydGl0aW9ucy4gIEl0cyBwcmltYXJ5IHJvbGUgaXMgYXMgYSBjb21tdW5pY2F0aW9ucyBsaW5rIGJldHdlZW4gdGhlIGd1ZXN0CisgKiBPUyBhbmQgdGhlIHN5c3RlbSBwb2xpY3kgbW9kdWxlLiAgVGhlIGN1cnJlbnQgSFYgZG9lcyBub3Qgc3VwcG9ydCBhbnkKKyAqIGNvbm5lY3Rpb25zIG90aGVyIHRoYW4gdGhvc2UgbGlzdGVkLgorICovCisKK2VudW0ge1BPUlRfQ09VTlQgPSAzLH07CisKK2VudW0gdnVhcnRfcGFyYW0geworCVBBUkFNX1RYX1RSSUdHRVIgPSAwLAorCVBBUkFNX1JYX1RSSUdHRVIgPSAxLAorCVBBUkFNX0lOVEVSUlVQVF9NQVNLID0gMiwKKwlQQVJBTV9SWF9CVUZfU0laRSA9IDMsIC8qIHJlYWQgb25seSAqLworCVBBUkFNX1JYX0JZVEVTID0gNCwgLyogcmVhZCBvbmx5ICovCisJUEFSQU1fVFhfQlVGX1NJWkUgPSA1LCAvKiByZWFkIG9ubHkgKi8KKwlQQVJBTV9UWF9CWVRFUyA9IDYsIC8qIHJlYWQgb25seSAqLworCVBBUkFNX0lOVEVSUlVQVF9TVEFUVVMgPSA3LCAvKiByZWFkIG9ubHkgKi8KK307CisKK2VudW0gdnVhcnRfaW50ZXJydXB0X2JpdCB7CisJSU5URVJSVVBUX0JJVF9UWCA9IDAsCisJSU5URVJSVVBUX0JJVF9SWCA9IDEsCisJSU5URVJSVVBUX0JJVF9ESVNDT05ORUNUID0gMiwKK307CisKK2VudW0gdnVhcnRfaW50ZXJydXB0X21hc2sgeworCUlOVEVSUlVQVF9NQVNLX1RYID0gMSwKKwlJTlRFUlJVUFRfTUFTS19SWCA9IDIsCisJSU5URVJSVVBUX01BU0tfRElTQ09OTkVDVCA9IDQsCit9OworCisvKioKKyAqIHN0cnVjdCBwb3J0c19ibXAgLSBiaXRtYXAgaW5kaWNhdGluZyBwb3J0cyBuZWVkaW5nIHNlcnZpY2UuCisgKgorICogQSAyNTYgYml0IHJlYWQgb25seSBiaXRtYXAgaW5kaWNhdGluZyBwb3J0cyBuZWVkaW5nIHNlcnZpY2UuICBEbyBub3Qgd3JpdGUKKyAqIHRvIHRoZXNlIGJpdHMuICBNdXN0IG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuCisgKi8KKworc3RydWN0IHBvcnRzX2JtcCB7CisJdTY0IHN0YXR1czsKKwl1NjQgdW51c2VkWzNdOworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMzIpKSk7CisKKy8qIHJlZGVmaW5lIGRldl9kYmcgdG8gZG8gYSBzeW50YXggY2hlY2sgKi8KKworI2lmICFkZWZpbmVkKERFQlVHKQorI3VuZGVmIGRldl9kYmcKK3N0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKSBkZXZfZGJnKAorCWNvbnN0IHN0cnVjdCBkZXZpY2UgKl9kZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7cmV0dXJuIDA7fQorI2VuZGlmCisKKyNkZWZpbmUgZHVtcF9wb3J0c19ibXAoX2IpIF9kdW1wX3BvcnRzX2JtcChfYiwgX19mdW5jX18sIF9fTElORV9fKQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX3BvcnRzX2JtcCgKKwljb25zdCBzdHJ1Y3QgcG9ydHNfYm1wKiBibXAsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworCXByX2RlYnVnKCIlczolZDogcG9ydHNfYm1wOiAlMDE2bHhoXG4iLCBmdW5jLCBsaW5lLCBibXAtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X21hdGNoX2lkX3RvX3BvcnQoZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQsCisJdW5zaWduZWQgaW50ICpwb3J0X251bWJlcikKK3sKKwlzd2l0Y2gobWF0Y2hfaWQpIHsKKwljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKKwkJKnBvcnRfbnVtYmVyID0gMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVI6CisJCSpwb3J0X251bWJlciA9IDI7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCSpwb3J0X251bWJlciA9IFVJTlRfTUFYOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworfQorCisjZGVmaW5lIGR1bXBfcG9ydF9wYXJhbXMoX2IpIF9kdW1wX3BvcnRfcGFyYW1zKF9iLCBfX2Z1bmNfXywgX19MSU5FX18pCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfcG9ydF9wYXJhbXModW5zaWduZWQgaW50IHBvcnRfbnVtYmVyLAorCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQoreworI2lmIGRlZmluZWQoREVCVUcpCisJc3RhdGljIGNvbnN0IGNoYXIgKnN0cmluZ3NbXSA9IHsKKwkJInR4X3RyaWdnZXIgICAgICAiLAorCQkicnhfdHJpZ2dlciAgICAgICIsCisJCSJpbnRlcnJ1cHRfbWFzayAgIiwKKwkJInJ4X2J1Zl9zaXplICAgICAiLAorCQkicnhfYnl0ZXMgICAgICAgICIsCisJCSJ0eF9idWZfc2l6ZSAgICAgIiwKKwkJInR4X2J5dGVzICAgICAgICAiLAorCQkiaW50ZXJydXB0X3N0YXR1cyIsCisJfTsKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGludCBpOworCXU2NCB2YWx1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0cmluZ3MpOyBpKyspIHsKKwkJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0ocG9ydF9udW1iZXIsIGksICZ2YWx1ZSk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkOiBwb3J0XyV1OiAlcyBmYWlsZWQ6ICVzXG4iLCBmdW5jLCBsaW5lLAorCQkJCXBvcnRfbnVtYmVyLCBzdHJpbmdzW2ldLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQkJY29udGludWU7CisJCX0KKwkJcHJfZGVidWcoIiVzOiVkOiBwb3J0XyV1OiAlcyA9ICVseGhcbiIsCisJCQlmdW5jLCBsaW5lLCBwb3J0X251bWJlciwgc3RyaW5nc1tpXSwgdmFsdWUpOworCX0KKyNlbmRpZgorfQorCitzdHJ1Y3QgdnVhcnRfdHJpZ2dlcnMgeworCXVuc2lnbmVkIGxvbmcgcng7CisJdW5zaWduZWQgbG9uZyB0eDsKK307CisKK2ludCBwczNfdnVhcnRfZ2V0X3RyaWdnZXJzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgdnVhcnRfdHJpZ2dlcnMgKnRyaWcpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAorCQlQQVJBTV9UWF9UUklHR0VSLCAmdHJpZy0+dHgpOworCisJaWYgKHJlc3VsdCkgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogdHhfdHJpZ2dlciBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCisJCVBBUkFNX1JYX0JVRl9TSVpFLCAmc2l6ZSk7CisKKwlpZiAocmVzdWx0KSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB0eF9idWZfc2l6ZSBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCisJCVBBUkFNX1JYX1RSSUdHRVIsICZ2YWwpOworCisJaWYgKHJlc3VsdCkgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcnhfdHJpZ2dlciBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXRyaWctPnJ4ID0gc2l6ZSAtIHZhbDsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB0eCAlbHhoLCByeCAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXRyaWctPnR4LCB0cmlnLT5yeCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3Z1YXJ0X3NldF90cmlnZ2VycyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB0eCwKKwl1bnNpZ25lZCBpbnQgcngpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAorCQlQQVJBTV9UWF9UUklHR0VSLCB0eCk7CisKKwlpZiAocmVzdWx0KSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB0eF90cmlnZ2VyIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKKwkJUEFSQU1fUlhfQlVGX1NJWkUsICZzaXplKTsKKworCWlmIChyZXN1bHQpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHR4X2J1Zl9zaXplIGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmVzdWx0ID0gbHYxX3NldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKKwkJUEFSQU1fUlhfVFJJR0dFUiwgc2l6ZSAtIHJ4KTsKKworCWlmIChyZXN1bHQpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHJ4X3RyaWdnZXIgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogdHggJXhoLCByeCAleGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJdHgsIHJ4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2dldF9yeF9ieXRlc193YWl0aW5nKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBsb25nICpieXRlc193YWl0aW5nKQoreworCWludCByZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAorCQlQQVJBTV9SWF9CWVRFUywgYnl0ZXNfd2FpdGluZyk7CisKKwlpZiAocmVzdWx0KQorCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcnhfYnl0ZXMgZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCSpieXRlc193YWl0aW5nKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAorCXVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlpbnQgcmVzdWx0OworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbWFzayk7CisKKwlkZXYtPmludGVycnVwdF9tYXNrID0gbWFzazsKKworCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCisJCVBBUkFNX0lOVEVSUlVQVF9NQVNLLCBkZXYtPmludGVycnVwdF9tYXNrKTsKKworCWlmIChyZXN1bHQpCisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBpbnRlcnJ1cHRfbWFzayBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X2ludGVycnVwdF9tYXNrKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBsb25nICpzdGF0dXMpCit7CisJaW50IHJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCisJCVBBUkFNX0lOVEVSUlVQVF9TVEFUVVMsIHN0YXR1cyk7CisKKwlpZiAocmVzdWx0KQorCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogaW50ZXJydXB0X3N0YXR1cyBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG0gJWx4aCwgcyAlbHhoLCBtJnMgJWx4aFxuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmludGVycnVwdF9tYXNrLCAqc3RhdHVzLAorCQlkZXYtPmludGVycnVwdF9tYXNrICYgKnN0YXR1cyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoZGV2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1RYKSA/IDAKKwkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5pbnRlcnJ1cHRfbWFzaworCQl8IElOVEVSUlVQVF9NQVNLX1RYKTsKK30KKworaW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19SWCkgPyAwCisJCTogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+aW50ZXJydXB0X21hc2sKKwkJfCBJTlRFUlJVUFRfTUFTS19SWCk7Cit9CisKK2ludCBwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF9kaXNjb25uZWN0KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19ESVNDT05ORUNUKSA/IDAKKwkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5pbnRlcnJ1cHRfbWFzaworCQl8IElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpOworfQorCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19UWCkKKwkJPyBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5pbnRlcnJ1cHRfbWFzaworCQkmIH5JTlRFUlJVUFRfTUFTS19UWCkgOiAwOworfQorCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKGRldi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19SWCkKKwkJPyBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5pbnRlcnJ1cHRfbWFzaworCQkmIH5JTlRFUlJVUFRfTUFTS19SWCkgOiAwOworfQorCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoZGV2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpCisJCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+aW50ZXJydXB0X21hc2sKKwkJJiB+SU5URVJSVVBUX01BU0tfRElTQ09OTkVDVCkgOiAwOworfQorCisvKioKKyAqIHBzM192dWFydF9yYXdfd3JpdGUgLSBMb3cgbGV2ZWwgd3JpdGUgaGVscGVyLgorICoKKyAqIERvIG5vdCBjYWxsIHBzM192dWFydF9yYXdfd3JpdGUgZGlyZWN0bHksIHVzZSBwczNfdnVhcnRfd3JpdGUuCisgKi8KKworc3RhdGljIGludCBwczNfdnVhcnRfcmF3X3dyaXRlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKKwljb25zdCB2b2lkKiBidWYsIHVuc2lnbmVkIGludCBieXRlcywgdW5zaWduZWQgbG9uZyAqYnl0ZXNfd3JpdHRlbikKK3sKKwlpbnQgcmVzdWx0OworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICV4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBieXRlcyk7CisKKwlyZXN1bHQgPSBsdjFfd3JpdGVfdmlydHVhbF91YXJ0KGRldi0+cG9ydF9udW1iZXIsCisJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYShidWYpKSwgYnl0ZXMsIGJ5dGVzX3dyaXR0ZW4pOworCisJaWYgKHJlc3VsdCkgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbHYxX3dyaXRlX3ZpcnR1YWxfdWFydCBmYWlsZWQ6ICIKKwkJCSIlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWRldi0+c3RhdHMuYnl0ZXNfd3JpdHRlbiArPSAqYnl0ZXNfd3JpdHRlbjsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiB3cm90ZSAlbHhoLyV4aD0+JWx4aFxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCAqYnl0ZXNfd3JpdHRlbiwgYnl0ZXMsIGRldi0+c3RhdHMuYnl0ZXNfd3JpdHRlbik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHBzM192dWFydF9yYXdfcmVhZCAtIExvdyBsZXZlbCByZWFkIGhlbHBlci4KKyAqCisgKiBEbyBub3QgY2FsbCBwczNfdnVhcnRfcmF3X3JlYWQgZGlyZWN0bHksIHVzZSBwczNfdnVhcnRfcmVhZC4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9yYXdfcmVhZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHZvaWQqIGJ1ZiwKKwl1bnNpZ25lZCBpbnQgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgKmJ5dGVzX3JlYWQpCit7CisJaW50IHJlc3VsdDsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAleGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnl0ZXMpOworCisJcmVzdWx0ID0gbHYxX3JlYWRfdmlydHVhbF91YXJ0KGRldi0+cG9ydF9udW1iZXIsCisJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYShidWYpKSwgYnl0ZXMsIGJ5dGVzX3JlYWQpOworCisJaWYgKHJlc3VsdCkgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbHYxX3JlYWRfdmlydHVhbF91YXJ0IGZhaWxlZDogJXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJZGV2LT5zdGF0cy5ieXRlc19yZWFkICs9ICpieXRlc19yZWFkOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHJlYWQgJWx4aC8leGg9PiVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKmJ5dGVzX3JlYWQsIGJ5dGVzLCBkZXYtPnN0YXRzLmJ5dGVzX3JlYWQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBzdHJ1Y3QgbGlzdF9idWZmZXIgLSBBbiBlbGVtZW50IGZvciBhIHBvcnQgZGV2aWNlIGZpZm8gYnVmZmVyIGxpc3QuCisgKi8KKworc3RydWN0IGxpc3RfYnVmZmVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp0YWlsOworCXVuc2lnbmVkIGxvbmcgZGJnX251bWJlcjsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbXTsKK307CisKKy8qKgorICogcHMzX3Z1YXJ0X3dyaXRlIC0gdGhlIGVudHJ5IHBvaW50IGZvciB3cml0aW5nIGRhdGEgdG8gYSBwb3J0CisgKgorICogSWYgdGhlIHBvcnQgaXMgaWRsZSBvbiBlbnRyeSBhcyBtdWNoIG9mIHRoZSBpbmNvbWluZyBkYXRhIGlzIHdyaXR0ZW4gdG8KKyAqIHRoZSBwb3J0IGFzIHRoZSBwb3J0IHdpbGwgYWNjZXB0LiAgT3RoZXJ3aXNlIGEgbGlzdCBidWZmZXIgaXMgY3JlYXRlZAorICogYW5kIGFueSByZW1hbmluZyBpbmNvbWluZyBkYXRhIGlzIGNvcGllZCB0byB0aGF0IGJ1ZmZlci4gIFRoZSBidWZmZXIgaXMKKyAqIHRoZW4gZW5xdWV1ZWQgZm9yIHRyYW5zbWlzaW9uIHZpYSB0aGUgdHJhbnNtaXQgaW50ZXJydXB0LgorICovCisKK2ludCBwczNfdnVhcnRfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCBjb25zdCB2b2lkKiBidWYsCisJdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGRiZ19udW1iZXI7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGI7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXUoJXhoKSBieXRlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlieXRlcywgYnl0ZXMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisKKwlpZiAobGlzdF9lbXB0eSgmZGV2LT50eF9saXN0LmhlYWQpKSB7CisJCXVuc2lnbmVkIGxvbmcgYnl0ZXNfd3JpdHRlbjsKKworCQlyZXN1bHQgPSBwczNfdnVhcnRfcmF3X3dyaXRlKGRldiwgYnVmLCBieXRlcywgJmJ5dGVzX3dyaXR0ZW4pOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJZGV2X2RiZygmZGV2LT5jb3JlLAorCQkJCSIlczolZDogcHMzX3Z1YXJ0X3Jhd193cml0ZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlpZiAoYnl0ZXNfd3JpdHRlbiA9PSBieXRlcykgeworCQkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdyb3RlICV4aCBieXRlc1xuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ5dGVzKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJYnl0ZXMgLT0gYnl0ZXNfd3JpdHRlbjsKKwkJYnVmICs9IGJ5dGVzX3dyaXR0ZW47CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisKKwlsYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2J1ZmZlcikgKyBieXRlcywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWxiKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbWNweShsYi0+ZGF0YSwgYnVmLCBieXRlcyk7CisJbGItPmhlYWQgPSBsYi0+ZGF0YTsKKwlsYi0+dGFpbCA9IGxiLT5kYXRhICsgYnl0ZXM7CisJbGItPmRiZ19udW1iZXIgPSArK2RiZ19udW1iZXI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZsYi0+bGluaywgJmRldi0+dHhfbGlzdC5oZWFkKTsKKwlwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF90eChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcXVldWVkIGJ1Zl8lbHUsICV4aCBieXRlc1xuIiwKKwkJX19mdW5jX18sIF9fTElORV9fLCBsYi0+ZGJnX251bWJlciwgYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X3JlYWQgLSB0aGUgZW50cnkgcG9pbnQgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIGEgcG9ydAorICoKKyAqIElmIGVub3VnaCBieXRlcyB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0IGFyZSBoZWxkIGluIHRoZSBidWZmZXIgbGlzdCB0aG9zZQorICogYnl0ZXMgYXJlIGRlcXVldWVkIGFuZCBjb3BpZWQgdG8gdGhlIGNhbGxlcidzIGJ1ZmZlci4gIEVtcHRpZWQgbGlzdCBidWZmZXJzCisgKiBhcmUgcmV0aWVyZWQuICBJZiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgc3RhdGlmaWVkIGJ5IGJ5dGVzIGhlbGQgaW4gdGhlIGxpc3QKKyAqIGJ1ZmZlcnMgLUVBR0FJTiBpcyByZXR1cm5lZC4KKyAqLworCitpbnQgcHMzX3Z1YXJ0X3JlYWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB2b2lkKiBidWYsCisJdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfYnVmZmVyICpsYiwgKm47CisJdW5zaWduZWQgbG9uZyBieXRlc19yZWFkOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICV1KCV4aCkgYnl0ZXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJYnl0ZXMsIGJ5dGVzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCisJaWYgKGRldi0+cnhfbGlzdC5ieXRlc19oZWxkIDwgYnl0ZXMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHN0YXJ2ZWQgZm9yICVseGggYnl0ZXNcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ5dGVzIC0gZGV2LT5yeF9saXN0LmJ5dGVzX2hlbGQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGIsIG4sICZkZXYtPnJ4X2xpc3QuaGVhZCwgbGluaykgeworCQlieXRlc19yZWFkID0gbWluKCh1bnNpZ25lZCBpbnQpKGxiLT50YWlsIC0gbGItPmhlYWQpLCBieXRlcyk7CisKKwkJbWVtY3B5KGJ1ZiwgbGItPmhlYWQsIGJ5dGVzX3JlYWQpOworCQlidWYgKz0gYnl0ZXNfcmVhZDsKKwkJYnl0ZXMgLT0gYnl0ZXNfcmVhZDsKKwkJZGV2LT5yeF9saXN0LmJ5dGVzX2hlbGQgLT0gYnl0ZXNfcmVhZDsKKworCQlpZiAoYnl0ZXNfcmVhZCA8IGxiLT50YWlsIC0gbGItPmhlYWQpIHsKKwkJCWxiLT5oZWFkICs9IGJ5dGVzX3JlYWQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCisJCQlkZXZfZGJnKCZkZXYtPmNvcmUsCisJCQkJIiVzOiVkOiBkZXF1ZXVlZCBidWZfJWx1LCAlbHhoIGJ5dGVzXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgbGItPmRiZ19udW1iZXIsIGJ5dGVzX3JlYWQpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCBmcmVlIGJ1Zl8lbHVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCWxiLT5kYmdfbnVtYmVyKTsKKworCQlsaXN0X2RlbCgmbGItPmxpbmspOworCQlrZnJlZShsYik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogZGVxdWV1ZWQgYnVmXyVsdSwgJXhoIGJ5dGVzXG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLCBieXRlcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF90eCAtIHRoaXJkIHN0YWdlIHRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyCisgKgorICogU2VydmljZXMgdGhlIHRyYW5zbWl0IGludGVycnVwdCBmb3IgdGhlIHBvcnQuICBXcml0ZXMgYXMgbXVjaCBkYXRhIGZyb20gdGhlCisgKiBidWZmZXIgbGlzdCBhcyB0aGUgcG9ydCB3aWxsIGFjY2VwdC4gIFJldGlyZXMgYW55IGVtcHRpZWQgbGlzdCBidWZmZXJzIGFuZAorICogYWRqdXN0cyB0aGUgZmluYWwgbGlzdCBidWZmZXIgc3RhdGUgZm9yIGEgcGFydGlhbCB3cml0ZS4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGIsICpuOworCXVuc2lnbmVkIGxvbmcgYnl0ZXNfdG90YWwgPSAwOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYiwgbiwgJmRldi0+dHhfbGlzdC5oZWFkLCBsaW5rKSB7CisKKwkJdW5zaWduZWQgbG9uZyBieXRlc193cml0dGVuOworCisJCXJlc3VsdCA9IHBzM192dWFydF9yYXdfd3JpdGUoZGV2LCBsYi0+aGVhZCwgbGItPnRhaWwgLSBsYi0+aGVhZCwKKwkJCSZieXRlc193cml0dGVuKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlkZXZfZGJnKCZkZXYtPmNvcmUsCisJCQkJIiVzOiVkOiBwczNfdnVhcnRfcmF3X3dyaXRlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQkJYnJlYWs7CisJCX0KKworCQlieXRlc190b3RhbCArPSBieXRlc193cml0dGVuOworCisJCWlmIChieXRlc193cml0dGVuIDwgbGItPnRhaWwgLSBsYi0+aGVhZCkgeworCQkJbGItPmhlYWQgKz0gYnl0ZXNfd3JpdHRlbjsKKwkJCWRldl9kYmcoJmRldi0+Y29yZSwKKwkJCQkiJXM6JWQgY2xlYXJlZCBidWZfJWx1LCAlbHhoIGJ5dGVzXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgbGItPmRiZ19udW1iZXIsCisJCQkJYnl0ZXNfd3JpdHRlbik7CisJCQlnb3RvIHBvcnRfZnVsbDsKKwkJfQorCisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkIGZyZWUgYnVmXyVsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJbGItPmRiZ19udW1iZXIpOworCisJCWxpc3RfZGVsKCZsYi0+bGluayk7CisJCWtmcmVlKGxiKTsKKwl9CisKKwlwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfdHgoZGV2KTsKK3BvcnRfZnVsbDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkIHdyb3RlICVseGggYnl0ZXMgdG90YWxcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgYnl0ZXNfdG90YWwpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfcnggLSB0aGlyZCBzdGFnZSByZWNlaXZlIGludGVycnVwdCBoYW5kbGVyCisgKgorICogU2VydmljZXMgdGhlIHJlY2VpdmUgaW50ZXJydXB0IGZvciB0aGUgcG9ydC4gIENyZWF0ZXMgYSBsaXN0IGJ1ZmZlciBhbmQKKyAqIGNvcGllcyBhbGwgd2FpdGluZyBwb3J0IGRhdGEgdG8gdGhhdCBidWZmZXIgYW5kIGVucXVldWVzIHRoZSBidWZmZXIgaW4gdGhlCisgKiBidWZmZXIgbGlzdC4gIEJ1ZmZlciBsaXN0IGRhdGEgaXMgZGVxdWV1ZWQgdmlhIHBzM192dWFydF9yZWFkLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfcngoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGRiZ19udW1iZXI7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9idWZmZXIgKmxiOworCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXJlc3VsdCA9IHBzM192dWFydF9nZXRfcnhfYnl0ZXNfd2FpdGluZyhkZXYsICZieXRlcyk7CisKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCUJVR19PTighYnl0ZXMpOworCisJLyogYWRkIHNvbWUgZXh0cmEgc3BhY2UgZm9yIHJlY2VudGx5IGFycml2ZWQgZGF0YSAqLworCisJYnl0ZXMgKz0gMTI4OworCisJbGIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdF9idWZmZXIpICsgYnl0ZXMsIEdGUF9BVE9NSUMpOworCisJaWYgKCFsYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwczNfdnVhcnRfcmF3X3JlYWQoZGV2LCBsYi0+ZGF0YSwgYnl0ZXMsICZieXRlcyk7CisKKwlsYi0+aGVhZCA9IGxiLT5kYXRhOworCWxiLT50YWlsID0gbGItPmRhdGEgKyBieXRlczsKKwlsYi0+ZGJnX251bWJlciA9ICsrZGJnX251bWJlcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmxiLT5saW5rLCAmZGV2LT5yeF9saXN0LmhlYWQpOworCWRldi0+cnhfbGlzdC5ieXRlc19oZWxkICs9IGJ5dGVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcXVldWVkIGJ1Zl8lbHUsICVseGggYnl0ZXNcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgbGItPmRiZ19udW1iZXIsIGJ5dGVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3QoCisJc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoreworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCUJVR19PTigibm8gc3VwcG9ydCIpOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBwczNfdnVhcnRfaGFuZGxlX3BvcnRfaW50ZXJydXB0IC0gc2Vjb25kIHN0YWdlIGludGVycnVwdCBoYW5kbGVyCisgKgorICogU2VydmljZXMgYW55IHBlbmRpbmcgaW50ZXJydXB0IHR5cGVzIGZvciB0aGUgcG9ydC4gIFBhc3NlcyBjb250cm9sIHRvIHRoZQorICogdGhpcmQgc3RhZ2UgdHlwZSBzcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxlci4gIFJldHVybnMgY29udHJvbCB0byB0aGUgZmlyc3QKKyAqIHN0YWdlIGhhbmRsZXIgYWZ0ZXIgb25lIGl0ZXJhdGlvbi4KKyAqLworCitzdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfcG9ydF9pbnRlcnJ1cHQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlyZXN1bHQgPSBwczNfdnVhcnRfZ2V0X2ludGVycnVwdF9tYXNrKGRldiwgJnN0YXR1cyk7CisKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHN0YXR1czogJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpIHsKKwkJZGV2LT5zdGF0cy5kaXNjb25uZWN0X2ludGVycnVwdHMrKzsKKwkJcmVzdWx0ID0gcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChkZXYpOworCQlpZiAocmVzdWx0KQorCQkJcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3QoZGV2KTsKKwl9CisKKwlpZiAoc3RhdHVzICYgSU5URVJSVVBUX01BU0tfVFgpIHsKKwkJZGV2LT5zdGF0cy50eF9pbnRlcnJ1cHRzKys7CisJCXJlc3VsdCA9IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3R4KGRldik7CisJCWlmIChyZXN1bHQpCisJCQlwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfdHgoZGV2KTsKKwl9CisKKwlpZiAoc3RhdHVzICYgSU5URVJSVVBUX01BU0tfUlgpIHsKKwkJZGV2LT5zdGF0cy5yeF9pbnRlcnJ1cHRzKys7CisJCXJlc3VsdCA9IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3J4KGRldik7CisJCWlmIChyZXN1bHQpCisJCQlwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfcngoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHZ1YXJ0X3ByaXZhdGUgeworCXVuc2lnbmVkIGludCBpbl91c2U7CisJdW5zaWduZWQgaW50IHZpcnE7CisJc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2aWNlc1tQT1JUX0NPVU5UXTsKKwljb25zdCBzdHJ1Y3QgcG9ydHNfYm1wIGJtcDsKK307CisKKy8qKgorICogcHMzX3Z1YXJ0X2lycV9oYW5kbGVyIC0gZmlyc3Qgc3RhZ2UgaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKiBMb29wcyBmaW5kaW5nIGFueSBpbnRlcnJ1cHRpbmcgcG9ydCBhbmQgaXRzIGFzc29jaWF0ZWQgaW5zdGFuY2UgZGF0YS4KKyAqIFBhc3NlcyBjb250cm9sIHRvIHRoZSBzZWNvbmQgc3RhZ2UgcG9ydCBzcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxlci4gIExvb3BzCisgKiB1bnRpbCBhbGwgb3V0c3RhbmRpbmcgaW50ZXJydXB0cyBhcmUgc2VydmljZWQuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IHBzM192dWFydF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgdnVhcnRfcHJpdmF0ZSAqcHJpdmF0ZTsKKworCUJVR19PTighX3ByaXZhdGUpOworCXByaXZhdGUgPSAoc3RydWN0IHZ1YXJ0X3ByaXZhdGUgKilfcHJpdmF0ZTsKKworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIGludCBwb3J0OworCisJCWR1bXBfcG9ydHNfYm1wKCZwcml2YXRlLT5ibXApOworCisJCXBvcnQgPSAoQklUU19QRVJfTE9ORyAtIDEpIC0gX19pbG9nMihwcml2YXRlLT5ibXAuc3RhdHVzKTsKKworCQlpZiAocG9ydCA9PSBCSVRTX1BFUl9MT05HKQorCQkJYnJlYWs7CisKKwkJQlVHX09OKHBvcnQgPj0gUE9SVF9DT1VOVCk7CisJCUJVR19PTighcHJpdmF0ZS0+ZGV2aWNlc1twb3J0XSk7CisKKwkJcHMzX3Z1YXJ0X2hhbmRsZV9wb3J0X2ludGVycnVwdChwcml2YXRlLT5kZXZpY2VzW3BvcnRdKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X21hdGNoKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpfZHJ2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0gdG9fcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyKF9kcnYpOworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKKworCXJlc3VsdCA9IGRldi0+bWF0Y2hfaWQgPT0gZHJ2LT5tYXRjaF9pZDsKKworCWRldl9pbmZvKCZkZXYtPmNvcmUsICIlczolZDogZGV2PSV1KCVzKSwgZHJ2PSV1KCVzKTogJXNcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCwgZGV2LT5jb3JlLmJ1c19pZCwgZHJ2LT5tYXRjaF9pZCwKKwkJZHJ2LT5jb3JlLm5hbWUsIChyZXN1bHQgPyAibWF0Y2giIDogIm1pc3MiKSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IHZ1YXJ0X3ByaXZhdGUgdnVhcnRfcHJpdmF0ZTsKKworc3RhdGljIGludCBwczNfdnVhcnRfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgdG1wOworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPQorCQl0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJQlVHX09OKCFkcnYpOworCisJcmVzdWx0ID0gcHMzX3Z1YXJ0X21hdGNoX2lkX3RvX3BvcnQoZGV2LT5tYXRjaF9pZCwgJmRldi0+cG9ydF9udW1iZXIpOworCisJaWYgKHJlc3VsdCkgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogdW5rbm93biBtYXRjaF9pZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX21hdGNoOworCX0KKworCWlmICh2dWFydF9wcml2YXRlLmRldmljZXNbZGV2LT5wb3J0X251bWJlcl0pIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHBvcnQgYnVzeSAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBkZXYtPnBvcnRfbnVtYmVyKTsKKwkJcmVzdWx0ID0gLUVCVVNZOworCQlnb3RvIGZhaWxfbWF0Y2g7CisJfQorCisJdnVhcnRfcHJpdmF0ZS5kZXZpY2VzW2Rldi0+cG9ydF9udW1iZXJdID0gZGV2OworCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+dHhfbGlzdC5oZWFkKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT50eF9saXN0LmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnJ4X2xpc3QuaGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+cnhfbGlzdC5sb2NrKTsKKworCXZ1YXJ0X3ByaXZhdGUuaW5fdXNlKys7CisJaWYgKHZ1YXJ0X3ByaXZhdGUuaW5fdXNlID09IDEpIHsKKwkJcmVzdWx0ID0gcHMzX2FsbG9jX3Z1YXJ0X2lycSgodm9pZCopJnZ1YXJ0X3ByaXZhdGUuYm1wLnN0YXR1cywKKwkJCSZ2dWFydF9wcml2YXRlLnZpcnEpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCWRldl9kYmcoJmRldi0+Y29yZSwKKwkJCQkiJXM6JWQ6IHBzM19hbGxvY192dWFydF9pcnEgZmFpbGVkICglZClcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQkJcmVzdWx0ID0gLUVQRVJNOworCQkJZ290byBmYWlsX2FsbG9jX2lycTsKKwkJfQorCisJCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHZ1YXJ0X3ByaXZhdGUudmlycSwgcHMzX3Z1YXJ0X2lycV9oYW5kbGVyLAorCQkJSVJRRl9ESVNBQkxFRCwgInZ1YXJ0IiwgJnZ1YXJ0X3ByaXZhdGUpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCWRldl9pbmZvKCZkZXYtPmNvcmUsICIlczolZDogcmVxdWVzdF9pcnEgZmFpbGVkICglZClcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQkJZ290byBmYWlsX3JlcXVlc3RfaXJxOworCQl9CisJfQorCisJcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIElOVEVSUlVQVF9NQVNLX1JYKTsKKworCS8qIGNsZWFyIHN0YWxlIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXBzM192dWFydF9nZXRfaW50ZXJydXB0X21hc2soZGV2LCAmdG1wKTsKKworCXBzM192dWFydF9zZXRfdHJpZ2dlcnMoZGV2LCAxLCAxKTsKKworCWlmIChkcnYtPnByb2JlKQorCQlyZXN1bHQgPSBkcnYtPnByb2JlKGRldik7CisJZWxzZSB7CisJCXJlc3VsdCA9IDA7CisJCWRldl9pbmZvKCZkZXYtPmNvcmUsICIlczolZDogbm8gcHJvYmUgbWV0aG9kXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwl9CisKKwlpZiAocmVzdWx0KSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBkcnYtPnByb2JlIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9wcm9iZTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworCitmYWlsX3Byb2JlOgorZmFpbF9yZXF1ZXN0X2lycToKKwl2dWFydF9wcml2YXRlLmluX3VzZS0tOworCWlmICghdnVhcnRfcHJpdmF0ZS5pbl91c2UpIHsKKwkJcHMzX2ZyZWVfdnVhcnRfaXJxKHZ1YXJ0X3ByaXZhdGUudmlycSk7CisJCXZ1YXJ0X3ByaXZhdGUudmlycSA9IE5PX0lSUTsKKwl9CitmYWlsX2FsbG9jX2lycToKK2ZhaWxfbWF0Y2g6CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPQorCQl0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPmNvcmUuYnVzX2lkKTsKKworCUJVR19PTih2dWFydF9wcml2YXRlLmluX3VzZSA8IDEpOworCisJaWYgKGRydi0+cmVtb3ZlKQorCQlkcnYtPnJlbW92ZShkZXYpOworCWVsc2UKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICVzIG5vIHJlbW92ZSBtZXRob2RcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+Y29yZS5idXNfaWQpOworCisJdnVhcnRfcHJpdmF0ZS5pbl91c2UtLTsKKworCWlmICghdnVhcnRfcHJpdmF0ZS5pbl91c2UpIHsKKwkJZnJlZV9pcnEodnVhcnRfcHJpdmF0ZS52aXJxLCAmdnVhcnRfcHJpdmF0ZSk7CisJCXBzM19mcmVlX3Z1YXJ0X2lycSh2dWFydF9wcml2YXRlLnZpcnEpOworCQl2dWFydF9wcml2YXRlLnZpcnEgPSBOT19JUlE7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM192dWFydCAtIFRoZSB2dWFydCBpbnN0YW5jZS4KKyAqCisgKiBUaGUgdnVhcnQgaXMgbWFuYWdlZCBhcyBhIGJ1cyB0aGF0IHBvcnQgZGV2aWNlcyBjb25uZWN0IHRvLgorICovCisKK3N0cnVjdCBidXNfdHlwZSBwczNfdnVhcnQgPSB7CisgICAgICAgIC5uYW1lID0gInBzM192dWFydCIsCisJLm1hdGNoID0gcHMzX3Z1YXJ0X21hdGNoLAorCS5wcm9iZSA9IHBzM192dWFydF9wcm9iZSwKKwkucmVtb3ZlID0gcHMzX3Z1YXJ0X3JlbW92ZSwKK307CisKK2ludCBfX2luaXQgcHMzX3Z1YXJ0X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJcHJfZGVidWcoIiVzOiVkOlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXN1bHQgPSBidXNfcmVnaXN0ZXIoJnBzM192dWFydCk7CisJQlVHX09OKHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBfX2V4aXQgcHMzX3Z1YXJ0X2V4aXQodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXM6JWQ6XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWJ1c191bnJlZ2lzdGVyKCZwczNfdnVhcnQpOworfQorCitjb3JlX2luaXRjYWxsKHBzM192dWFydF9pbml0KTsKK21vZHVsZV9leGl0KHBzM192dWFydF9leGl0KTsKKworLyoqCisgKiBwczNfdnVhcnRfcG9ydF9yZWxlYXNlX2RldmljZSAtIFJlbW92ZSBhIHZ1YXJ0IHBvcnQgZGV2aWNlLgorICovCisKK3N0YXRpYyB2b2lkIHBzM192dWFydF9wb3J0X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gdG9fcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlKF9kZXYpOworI2lmIGRlZmluZWQoREVCVUcpCisJbWVtc2V0KGRldiwgMHhhZCwgc2l6ZW9mKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UpKTsKKyNlbmRpZgorCWtmcmVlKGRldik7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyIC0gQWRkIGEgdnVhcnQgcG9ydCBkZXZpY2UuCisgKi8KKworaW50IHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9jb3VudCA9IDE7CisKKwlkZXYtPmNvcmUucGFyZW50ID0gTlVMTDsKKwlkZXYtPmNvcmUuYnVzID0gJnBzM192dWFydDsKKwlkZXYtPmNvcmUucmVsZWFzZSA9IHBzM192dWFydF9wb3J0X3JlbGVhc2VfZGV2aWNlOworCisJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLCAidnVhcnRfJTAyeCIsCisJCWRldl9jb3VudCsrKTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPmNvcmUpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyKTsKKworLyoqCisgKiBwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIgLSBBZGQgYSB2dWFydCBwb3J0IGRldmljZSBkcml2ZXIuCisgKi8KKworaW50IHBzM192dWFydF9wb3J0X2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYpCit7CisJaW50IHJlc3VsdDsKKworCXByX2RlYnVnKCIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CisJZHJ2LT5jb3JlLmJ1cyA9ICZwczNfdnVhcnQ7CisJcmVzdWx0ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmNvcmUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9wb3J0X2RyaXZlcl9yZWdpc3Rlcik7CisKKy8qKgorICogcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3VucmVnaXN0ZXIgLSBSZW1vdmUgYSB2dWFydCBwb3J0IGRldmljZSBkcml2ZXIuCisgKi8KKwordm9pZCBwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9wb3J0X2RyaXZlcl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmggYi9kcml2ZXJzL3BzMy92dWFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmQ4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BzMy92dWFydC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiAgUFMzIHZpcnR1YWwgdWFydAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmICFkZWZpbmVkKF9QUzNfVlVBUlRfSCkKKyNkZWZpbmUgX1BTM19WVUFSVF9ICisKK3N0cnVjdCBwczNfdnVhcnRfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgYnl0ZXNfd3JpdHRlbjsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlYWQ7CisJdW5zaWduZWQgbG9uZyB0eF9pbnRlcnJ1cHRzOworCXVuc2lnbmVkIGxvbmcgcnhfaW50ZXJydXB0czsKKwl1bnNpZ25lZCBsb25nIGRpc2Nvbm5lY3RfaW50ZXJydXB0czsKK307CisKKy8qKgorICogc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAtIGEgZGV2aWNlIG9uIGEgdnVhcnQgcG9ydAorICovCisKK3N0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgeworCWVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkOworCXN0cnVjdCBkZXZpY2UgY29yZTsKKworCS8qIHByaXZhdGUgZHJpdmVyIHZhcmlhYmxlcyAqLworCXVuc2lnbmVkIGludCBwb3J0X251bWJlcjsKKwl1bnNpZ25lZCBsb25nIGludGVycnVwdF9tYXNrOworCXN0cnVjdCB7CisJCXNwaW5sb2NrX3QgbG9jazsKKwkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCX0gdHhfbGlzdDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIGJ5dGVzX2hlbGQ7CisJCXNwaW5sb2NrX3QgbG9jazsKKwkJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCX0gcnhfbGlzdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3N0YXRzIHN0YXRzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyIC0gYSBkcml2ZXIgZm9yIGEgZGV2aWNlIG9uIGEgdnVhcnQgcG9ydAorICovCisKK3N0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgeworCWVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGNvcmU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICopOworCWludCAoKnR4X2V2ZW50KShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpOworCWludCAoKnJ4X2V2ZW50KShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpOworCWludCAoKmRpc2Nvbm5lY3RfZXZlbnQpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldik7CisJLyogaW50ICgqc3VzcGVuZCkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqLCBwbV9tZXNzYWdlX3QpOyAqLworCS8qIGludCAoKnJlc3VtZSkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqKTsgKi8KK307CisKK2ludCBwczNfdnVhcnRfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKK2ludCBwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2KTsKK3ZvaWQgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2KTsKK2ludCBwczNfdnVhcnRfd3JpdGUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAorCWNvbnN0IHZvaWQqIGJ1ZiwgdW5zaWduZWQgaW50IGJ5dGVzKTsKK2ludCBwczNfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHZvaWQqIGJ1ZiwKKwl1bnNpZ25lZCBpbnQgYnl0ZXMpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICp0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoCisJc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihfZHJ2LCBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyLCBjb3JlKTsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqdG9fcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlKAorCXN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlLCBjb3JlKTsKK30KKworaW50IHBzM192dWFydF93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQqIGJ1ZiwKKwl1bnNpZ25lZCBpbnQgYnl0ZXMpOworaW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCogYnVmLAorCXVuc2lnbmVkIGludCBieXRlcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25maWcKaW5kZXggZmM3NjZhNy4uMDk2NjBlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC0xNTQsMTUgKzE1NCwyMyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWRzMTY3Mi4KIAogY29uZmlnIFJUQ19EUlZfRFMxNzQyCi0JdHJpc3RhdGUgIkRhbGxhcyBEUzE3NDIiCisJdHJpc3RhdGUgIkRhbGxhcyBEUzE3NDIvMTc0MyIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKLQkgIERhbGxhcyBEUzE3NDIgdGltZWtlZXBpbmcgY2hpcC4KKwkgIERhbGxhcyBEUzE3NDIvMTc0MyB0aW1la2VlcGluZyBjaGlwLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczE3NDIuCiAKK2NvbmZpZyBSVENfRFJWX09NQVAKKwl0cmlzdGF0ZSAiVEkgT01BUDEiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgKCBcCisJCUFSQ0hfT01BUDE1WFggfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzAgKQorCWhlbHAKKwkgIFNheSAieWVzIiBoZXJlIHRvIHN1cHBvcnQgdGhlIHJlYWwgdGltZSBjbG9jayBvbiBUSSBPTUFQMSBjaGlwcy4KKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlIGNhbGxlZCBydGMtb21hcC4KKwogY29uZmlnIFJUQ19EUlZfUENGODU2MwogCXRyaXN0YXRlICJQaGlsaXBzIFBDRjg1NjMvRXBzb24gUlRDODU2NCIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBJMkMKQEAgLTI4MCw3ICsyODgsNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcnRjLXBsMDMxLgogCi1jb25maWcgUlRDX0RSVl9BVDkxCitjb25maWcgUlRDX0RSVl9BVDkxUk05MjAwCiAJdHJpc3RhdGUgIkFUOTFSTTkyMDAiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgQVJDSF9BVDkxUk05MjAwCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvTWFrZWZpbGUgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQppbmRleCAzYmE1ZmY2Li5lNmJlZWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3J0Yy9NYWtlZmlsZQpAQCAtMjEsNiArMjEsNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxMzA3KQkrPSBydGMtZHMxMzA3Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTY3MikJKz0gcnRjLWRzMTY3Mi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzE3NDIpCSs9IHJ0Yy1kczE3NDIubworb2JqLSQoQ09ORklHX1JUQ19EUlZfT01BUCkJKz0gcnRjLW9tYXAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUENGODU2MykJKz0gcnRjLXBjZjg1NjMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUENGODU4MykJKz0gcnRjLXBjZjg1ODMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUlM1QzM3MikJKz0gcnRjLXJzNWMzNzIubwpAQCAtMzQsNSArMzUsNSBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfUEwwMzEpCSs9IHJ0Yy1wbDAzMS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NQVg2OTAyKQkrPSBydGMtbWF4NjkwMi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9WMzAyMCkJKz0gcnRjLXYzMDIwLm8KLW9iai0kKENPTkZJR19SVENfRFJWX0FUOTEpCSs9IHJ0Yy1hdDkxLm8KK29iai0kKENPTkZJR19SVENfRFJWX0FUOTFSTTkyMDApKz0gcnRjLWF0OTFybTkyMDAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfU0gpCSs9IHJ0Yy1zaC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCmluZGV4IDU3OWNkNjYuLjZmMTFmNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCkBAIC0xNDUsNiArMTQ1LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfc2V0X2FsYXJtKTsKIAorLyoqCisgKiBydGNfdXBkYXRlX2lycSAtIHJlcG9ydCBSVEMgcGVyaW9kaWMsIGFsYXJtLCBhbmQvb3IgdXBkYXRlIGlycXMKKyAqIEBjbGFzc19kZXY6IHRoZSBydGMncyBjbGFzcyBkZXZpY2UKKyAqIEBudW06IGhvdyBtYW55IGlycXMgYXJlIGJlaW5nIHJlcG9ydGVkICh1c3VhbGx5IG9uZSkKKyAqIEBldmVudHM6IG1hc2sgb2YgUlRDX0lSUUYgd2l0aCBvbmUgb3IgbW9yZSBvZiBSVENfUEYsIFJUQ19BRiwgUlRDX1VGCisgKiBDb250ZXh0OiBpbl9pbnRlcnJ1cHQoKSwgaXJxcyBibG9ja2VkCisgKi8KIHZvaWQgcnRjX3VwZGF0ZV9pcnEoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LAogCQl1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgbG9uZyBldmVudHMpCiB7CkBAIC0yMDEsMTIgKzIwOCwxMiBAQAogCWlmICh0YXNrID09IE5VTEwgfHwgdGFzay0+ZnVuYyA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9jaygmcnRjLT5pcnFfdGFza19sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZydGMtPmlycV90YXNrX2xvY2spOwogCWlmIChydGMtPmlycV90YXNrID09IE5VTEwpIHsKIAkJcnRjLT5pcnFfdGFzayA9IHRhc2s7CiAJCXJldHZhbCA9IDA7CiAJfQotCXNwaW5fdW5sb2NrKCZydGMtPmlycV90YXNrX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfdGFza19sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC0yMTYsMTAgKzIyMywxMCBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSB0b19ydGNfZGV2aWNlKGNsYXNzX2Rldik7CiAKLQlzcGluX2xvY2soJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfdGFza19sb2NrKTsKIAlpZiAocnRjLT5pcnFfdGFzayA9PSB0YXNrKQogCQlydGMtPmlycV90YXNrID0gTlVMTDsKLQlzcGluX3VubG9jaygmcnRjLT5pcnFfdGFza19sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfaXJxX3VucmVnaXN0ZXIpOwogCkBAIC0yNjUsMyArMjcyLDQgQEAKIAl9CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y19pcnFfc2V0X2ZyZXEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF0OTEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDkxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNjFlOTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWF0OTEuYworKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKgotICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgTGludXggb24gQXRtZWwgQVQ5MVJNOTIwMAotICoKLSAqCUNvcHlyaWdodCAoQykgMjAwMiBSaWNrIEJyb25zb24KLSAqCi0gKglDb252ZXJ0ZWQgdG8gUlRDIGNsYXNzIG1vZGVsIGJ5IEFuZHJldyBWaWN0b3IKLSAqCi0gKglQb3J0ZWQgdG8gTGludXggMi42IGJ5IFN0ZXZlbiBTY2hvbHoKLSAqCUJhc2VkIG9uIHMzYzI0MTAtcnRjLmMgU2ltdGVjIEVsZWN0cm9uaWNzCi0gKgotICoJQmFzZWQgb24gc2ExMTAwLXJ0Yy5jIGJ5IE5pbHMgRmFlcmJlcgotICoJQmFzZWQgb24gcnRjLmMgYnkgUGF1bCBHb3J0bWFrZXIKLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgotI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLQotI2RlZmluZSBBVDkxX1JUQ19GUkVRCQkxCi0jZGVmaW5lIEFUOTFfUlRDX0VQT0NICQkxOTAwVUwJLyoganVzdCBsaWtlIGFyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMgKi8KLQotc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihhdDkxX3J0Y191cGRhdGVkKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXQ5MV9hbGFybV95ZWFyID0gQVQ5MV9SVENfRVBPQ0g7Ci0KLS8qCi0gKiBEZWNvZGUgdGltZS9kYXRlIGludG8gcnRjX3RpbWUgc3RydWN0dXJlCi0gKi8KLXN0YXRpYyB2b2lkIGF0OTFfcnRjX2RlY29kZXRpbWUodW5zaWduZWQgaW50IHRpbWVyZWcsIHVuc2lnbmVkIGludCBjYWxyZWcsCi0JCQkJc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQl1bnNpZ25lZCBpbnQgdGltZSwgZGF0ZTsKLQotCS8qIG11c3QgcmVhZCB0d2ljZSBpbiBjYXNlIGl0IGNoYW5nZXMgKi8KLQlkbyB7Ci0JCXRpbWUgPSBhdDkxX3N5c19yZWFkKHRpbWVyZWcpOwotCQlkYXRlID0gYXQ5MV9zeXNfcmVhZChjYWxyZWcpOwotCX0gd2hpbGUgKCh0aW1lICE9IGF0OTFfc3lzX3JlYWQodGltZXJlZykpIHx8Ci0JCQkoZGF0ZSAhPSBhdDkxX3N5c19yZWFkKGNhbHJlZykpKTsKLQotCXRtLT50bV9zZWMgID0gQkNEMkJJTigodGltZSAmIEFUOTFfUlRDX1NFQykgPj4gMCk7Ci0JdG0tPnRtX21pbiAgPSBCQ0QyQklOKCh0aW1lICYgQVQ5MV9SVENfTUlOKSA+PiA4KTsKLQl0bS0+dG1faG91ciA9IEJDRDJCSU4oKHRpbWUgJiBBVDkxX1JUQ19IT1VSKSA+PiAxNik7Ci0KLQkvKgotCSAqIFRoZSBDYWxlbmRhciBBbGFybSByZWdpc3RlciBkb2VzIG5vdCBoYXZlIGEgZmllbGQgZm9yCi0JICogdGhlIHllYXIgLSBzbyB0aGVzZSB3aWxsIHJldHVybiBhbiBpbnZhbGlkIHZhbHVlLiAgV2hlbiBhbgotCSAqIGFsYXJtIGlzIHNldCwgYXQ5MV9hbGFybV95ZWFyIHdpbGxlIHN0b3JlIHRoZSBjdXJyZW50IHllYXIuCi0JICovCi0JdG0tPnRtX3llYXIgID0gQkNEMkJJTihkYXRlICYgQVQ5MV9SVENfQ0VOVCkgKiAxMDA7CS8qIGNlbnR1cnkgKi8KLQl0bS0+dG1feWVhciArPSBCQ0QyQklOKChkYXRlICYgQVQ5MV9SVENfWUVBUikgPj4gOCk7CS8qIHllYXIgKi8KLQotCXRtLT50bV93ZGF5ID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX0RBWSkgPj4gMjEpIC0gMTsJLyogZGF5IG9mIHRoZSB3ZWVrIFswLTZdLCBTdW5kYXk9MCAqLwotCXRtLT50bV9tb24gID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX01PTlRIKSA+PiAxNikgLSAxOwotCXRtLT50bV9tZGF5ID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX0RBVEUpID4+IDI0KTsKLX0KLQotLyoKLSAqIFJlYWQgY3VycmVudCB0aW1lIGFuZCBkYXRlIGluIFJUQwotICovCi1zdGF0aWMgaW50IGF0OTFfcnRjX3JlYWR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlhdDkxX3J0Y19kZWNvZGV0aW1lKEFUOTFfUlRDX1RJTVIsIEFUOTFfUlRDX0NBTFIsIHRtKTsKLQl0bS0+dG1feWRheSA9IHJ0Y195ZWFyX2RheXModG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyKTsKLQl0bS0+dG1feWVhciA9IHRtLT50bV95ZWFyIC0gMTkwMDsKLQotCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCi0JCTE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCi0JCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2V0IGN1cnJlbnQgdGltZSBhbmQgZGF0ZSBpbiBSVEMKLSAqLwotc3RhdGljIGludCBhdDkxX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQl1bnNpZ25lZCBsb25nIGNyOwotCi0JcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKLQkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKLQkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOwotCi0JLyogU3RvcCBUaW1lL0NhbGVuZGFyIGZyb20gY291bnRpbmcgKi8KLQljciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9SVENfQ1IpOwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NSLCBjciB8IEFUOTFfUlRDX1VQRENBTCB8IEFUOTFfUlRDX1VQRFRJTSk7Ci0KLQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRVIsIEFUOTFfUlRDX0FDS1VQRCk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmYXQ5MV9ydGNfdXBkYXRlZCk7CS8qIHdhaXQgZm9yIEFDS1VQRCBpbnRlcnJ1cHQgKi8KLQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCk7Ci0KLQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19USU1SLAotCQkJICBCSU4yQkNEKHRtLT50bV9zZWMpIDw8IDAKLQkJCXwgQklOMkJDRCh0bS0+dG1fbWluKSA8PCA4Ci0JCQl8IEJJTjJCQ0QodG0tPnRtX2hvdXIpIDw8IDE2KTsKLQotCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NBTFIsCi0JCQkgIEJJTjJCQ0QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApCS8qIGNlbnR1cnkgKi8KLQkJCXwgQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCkgPDwgOAkvKiB5ZWFyICovCi0JCQl8IEJJTjJCQ0QodG0tPnRtX21vbiArIDEpIDw8IDE2CQkvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KLQkJCXwgQklOMkJDRCh0bS0+dG1fd2RheSArIDEpIDw8IDIxCS8qIGRheSBvZiB0aGUgd2VlayBbMC02XSwgU3VuZGF5PTAgKi8KLQkJCXwgQklOMkJDRCh0bS0+dG1fbWRheSkgPDwgMjQpOwotCi0JLyogUmVzdGFydCBUaW1lL0NhbGVuZGFyICovCi0JY3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0NSKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19DUiwgY3IgJiB+KEFUOTFfUlRDX1VQRENBTCB8IEFUOTFfUlRDX1VQRFRJTSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZWFkIGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCi0gKi8KLXN0YXRpYyBpbnQgYXQ5MV9ydGNfcmVhZGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCi17Ci0Jc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOwotCi0JYXQ5MV9ydGNfZGVjb2RldGltZShBVDkxX1JUQ19USU1BTFIsIEFUOTFfUlRDX0NBTEFMUiwgdG0pOwotCXRtLT50bV95ZGF5ID0gcnRjX3llYXJfZGF5cyh0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIpOwotCXRtLT50bV95ZWFyID0gYXQ5MV9hbGFybV95ZWFyIC0gMTkwMDsKLQotCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCi0JCTE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCi0JCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2V0IGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCi0gKi8KLXN0YXRpYyBpbnQgYXQ5MV9ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgdG07Ci0KLQlhdDkxX3J0Y19kZWNvZGV0aW1lKEFUOTFfUlRDX1RJTVIsIEFUOTFfUlRDX0NBTFIsICZ0bSk7Ci0KLQlhdDkxX2FsYXJtX3llYXIgPSB0bS50bV95ZWFyOwotCi0JdG0udG1faG91ciA9IGFscm0tPnRpbWUudG1faG91cjsKLQl0bS50bV9taW4gPSBhbHJtLT50aW1lLnRtX21pbjsKLQl0bS50bV9zZWMgPSBhbHJtLT50aW1lLnRtX3NlYzsKLQotCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX1RJTUFMUiwKLQkJICBCSU4yQkNEKHRtLnRtX3NlYykgPDwgMAotCQl8IEJJTjJCQ0QodG0udG1fbWluKSA8PCA4Ci0JCXwgQklOMkJDRCh0bS50bV9ob3VyKSA8PCAxNgotCQl8IEFUOTFfUlRDX0hPVVJFTiB8IEFUOTFfUlRDX01JTkVOIHwgQVQ5MV9SVENfU0VDRU4pOwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NBTEFMUiwKLQkJICBCSU4yQkNEKHRtLnRtX21vbiArIDEpIDw8IDE2CQkvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KLQkJfCBCSU4yQkNEKHRtLnRtX21kYXkpIDw8IDI0Ci0JCXwgQVQ5MV9SVENfREFURUVOIHwgQVQ5MV9SVENfTVRIRU4pOwotCi0JcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKLQkJYXQ5MV9hbGFybV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksIHRtLnRtX2hvdXIsCi0JCXRtLnRtX21pbiwgdG0udG1fc2VjKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogSGFuZGxlIGNvbW1hbmRzIGZyb20gdXNlci1zcGFjZQotICovCi1zdGF0aWMgaW50IGF0OTFfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzKCk6IGNtZD0lMDh4LCBhcmc9JTA4bHguXG4iLCBfX0ZVTkNUSU9OX18sIGNtZCwgYXJnKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBSVENfQUlFX09GRjoJLyogYWxhcm0gb2ZmICovCi0JCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lEUiwgQVQ5MV9SVENfQUxBUk0pOwotCQlicmVhazsKLQljYXNlIFJUQ19BSUVfT046CS8qIGFsYXJtIG9uICovCi0JCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lFUiwgQVQ5MV9SVENfQUxBUk0pOwotCQlicmVhazsKLQljYXNlIFJUQ19VSUVfT0ZGOgkvKiB1cGRhdGUgb2ZmICovCi0JY2FzZSBSVENfUElFX09GRjoJLyogcGVyaW9kaWMgb2ZmICovCi0JCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lEUiwgQVQ5MV9SVENfU0VDRVYpOwotCQlicmVhazsKLQljYXNlIFJUQ19VSUVfT046CS8qIHVwZGF0ZSBvbiAqLwotCWNhc2UgUlRDX1BJRV9PTjoJLyogcGVyaW9kaWMgb24gKi8KLQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSUVSLCBBVDkxX1JUQ19TRUNFVik7Ci0JCWJyZWFrOwotCWNhc2UgUlRDX0lSUVBfUkVBRDoJLyogcmVhZCBwZXJpb2RpYyBhbGFybSBmcmVxdWVuY3kgKi8KLQkJcmV0ID0gcHV0X3VzZXIoQVQ5MV9SVENfRlJFUSwgKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBSVENfSVJRUF9TRVQ6CS8qIHNldCBwZXJpb2RpYyBhbGFybSBmcmVxdWVuY3kgKi8KLQkJaWYgKGFyZyAhPSBBVDkxX1JUQ19GUkVRKQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT0lPQ1RMQ01EOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogUHJvdmlkZSBhZGRpdGlvbmFsIFJUQyBpbmZvcm1hdGlvbiBpbiAvcHJvYy9kcml2ZXIvcnRjCi0gKi8KLXN0YXRpYyBpbnQgYXQ5MV9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQotewotCXVuc2lnbmVkIGxvbmcgaW1yID0gYXQ5MV9zeXNfcmVhZChBVDkxX1JUQ19JTVIpOwotCi0Jc2VxX3ByaW50ZihzZXEsICJhbGFybV9JUlFcdDogJXNcbiIsCi0JCQkoaW1yICYgQVQ5MV9SVENfQUxBUk0pID8gInllcyIgOiAibm8iKTsKLQlzZXFfcHJpbnRmKHNlcSwgInVwZGF0ZV9JUlFcdDogJXNcbiIsCi0JCQkoaW1yICYgQVQ5MV9SVENfQUNLVVBEKSA/ICJ5ZXMiIDogIm5vIik7Ci0Jc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsCi0JCQkoaW1yICYgQVQ5MV9SVENfU0VDRVYpID8gInllcyIgOiAibm8iKTsKLQlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX2ZyZXFcdDogJWxkXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpIEFUOTFfUlRDX0ZSRVEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBJUlEgaGFuZGxlciBmb3IgdGhlIFJUQwotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2lkOwotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1bnNpZ25lZCBpbnQgcnRzcjsKLQl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7Ci0KLQlydHNyID0gYXQ5MV9zeXNfcmVhZChBVDkxX1JUQ19TUikgJiBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0lNUik7Ci0JaWYgKHJ0c3IpIHsJCS8qIHRoaXMgaW50ZXJydXB0IGlzIHNoYXJlZCEgIElzIGl0IG91cnM/ICovCi0JCWlmIChydHNyICYgQVQ5MV9SVENfQUxBUk0pCi0JCQlldmVudHMgfD0gKFJUQ19BRiB8IFJUQ19JUlFGKTsKLQkJaWYgKHJ0c3IgJiBBVDkxX1JUQ19TRUNFVikKLQkJCWV2ZW50cyB8PSAoUlRDX1VGIHwgUlRDX0lSUUYpOwotCQlpZiAocnRzciAmIEFUOTFfUlRDX0FDS1VQRCkKLQkJCWNvbXBsZXRlKCZhdDkxX3J0Y191cGRhdGVkKTsKLQotCQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19TQ0NSLCBydHNyKTsJLyogY2xlYXIgc3RhdHVzIHJlZyAqLwotCi0JCXJ0Y191cGRhdGVfaXJxKCZydGMtPmNsYXNzX2RldiwgMSwgZXZlbnRzKTsKLQotCQlwcl9kZWJ1ZygiJXMoKTogbnVtPSVsZCwgZXZlbnRzPTB4JTAybHhcbiIsIF9fRlVOQ1RJT05fXywKLQkJCWV2ZW50cyA+PiA4LCBldmVudHMgJiAweDAwMDAwMEZGKTsKLQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCXJldHVybiBJUlFfTk9ORTsJCS8qIG5vdCBoYW5kbGVkICovCi19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhdDkxX3J0Y19vcHMgPSB7Ci0JLmlvY3RsCQk9IGF0OTFfcnRjX2lvY3RsLAotCS5yZWFkX3RpbWUJPSBhdDkxX3J0Y19yZWFkdGltZSwKLQkuc2V0X3RpbWUJPSBhdDkxX3J0Y19zZXR0aW1lLAotCS5yZWFkX2FsYXJtCT0gYXQ5MV9ydGNfcmVhZGFsYXJtLAotCS5zZXRfYWxhcm0JPSBhdDkxX3J0Y19zZXRhbGFybSwKLQkucHJvYwkJPSBhdDkxX3J0Y19wcm9jLAotfTsKLQotLyoKLSAqIEluaXRpYWxpemUgYW5kIGluc3RhbGwgUlRDIGRyaXZlcgotICovCi1zdGF0aWMgaW50IF9faW5pdCBhdDkxX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Ci0JaW50IHJldDsKLQotCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NSLCAwKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19NUiwgMCk7CQkvKiAyNCBob3VyIG1vZGUgKi8KLQotCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KLQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCB8IEFUOTFfUlRDX0FMQVJNIHwKLQkJCQkJQVQ5MV9SVENfU0VDRVYgfCBBVDkxX1JUQ19USU1FViB8Ci0JCQkJCUFUOTFfUlRDX0NBTEVWKTsKLQotCXJldCA9IHJlcXVlc3RfaXJxKEFUOTFfSURfU1lTLCBhdDkxX3J0Y19pbnRlcnJ1cHQsCi0JCQkJSVJRRl9TSEFSRUQsICJhdDkxX3J0YyIsIHBkZXYpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdDkxX3J0YzogSVJRICVkIGFscmVhZHkgaW4gdXNlLlxuIiwKLQkJCQlBVDkxX0lEX1NZUyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAotCQkJCSZhdDkxX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKLQlpZiAoSVNfRVJSKHJ0YykpIHsKLQkJZnJlZV9pcnEoQVQ5MV9JRF9TWVMsIHBkZXYpOwotCQlyZXR1cm4gUFRSX0VSUihydGMpOwotCX0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOwotCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKLQotCXByaW50ayhLRVJOX0lORk8gIkFUOTEgUmVhbCBUaW1lIENsb2NrIGRyaXZlci5cbiIpOwotCXJldHVybiAwOwotfQotCi0vKgotICogRGlzYWJsZSBhbmQgcmVtb3ZlIHRoZSBSVEMgZHJpdmVyCi0gKi8KLXN0YXRpYyBpbnQgX19kZXZleGl0IGF0OTFfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KLQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCB8IEFUOTFfUlRDX0FMQVJNIHwKLQkJCQkJQVQ5MV9SVENfU0VDRVYgfCBBVDkxX1JUQ19USU1FViB8Ci0JCQkJCUFUOTFfUlRDX0NBTEVWKTsKLQlmcmVlX2lycShBVDkxX0lEX1NZUywgcGRldik7Ci0KLQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotCi0vKiBBVDkxUk05MjAwIFJUQyBQb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KLQotc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBhdDkxX3J0Y19kZWx0YTsKLXN0YXRpYyB1MzIgYXQ5MV9ydGNfaW1yOwotCi1zdGF0aWMgaW50IGF0OTFfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBydGNfdGltZSB0bTsKLQlzdHJ1Y3QgdGltZXNwZWMgdGltZTsKLQotCXRpbWUudHZfbnNlYyA9IDA7Ci0KLQkvKiBjYWxjdWxhdGUgdGltZSBkZWx0YSBmb3Igc3VzcGVuZCAqLwotCWF0OTFfcnRjX3JlYWR0aW1lKCZwZGV2LT5kZXYsICZ0bSk7Ci0JcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGltZS50dl9zZWMpOwotCXNhdmVfdGltZV9kZWx0YSgmYXQ5MV9ydGNfZGVsdGEsICZ0aW1lKTsKLQotCS8qIHRoaXMgSVJRIGlzIHNoYXJlZCB3aXRoIERCR1UgYW5kIG90aGVyIGhhcmR3YXJlIHdoaWNoIGlzbid0Ci0JICogbmVjZXNzYXJpbHkgZG9pbmcgUE0gbGlrZSB3ZSBhcmUuLi4KLQkgKi8KLQlhdDkxX3J0Y19pbXIgPSBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0lNUikKLQkJCSYgKEFUOTFfUlRDX0FMQVJNfEFUOTFfUlRDX1NFQ0VWKTsKLQlpZiAoYXQ5MV9ydGNfaW1yKSB7Ci0JCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKLQkJCWVuYWJsZV9pcnFfd2FrZShBVDkxX0lEX1NZUyk7Ci0JCWVsc2UKLQkJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lEUiwgYXQ5MV9ydGNfaW1yKTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXMoKTogJTRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwgX19GVU5DVElPTl9fLAotCQkxOTAwICsgdG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LAotCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDkxX3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgdG07Ci0Jc3RydWN0IHRpbWVzcGVjIHRpbWU7Ci0KLQl0aW1lLnR2X25zZWMgPSAwOwotCi0JYXQ5MV9ydGNfcmVhZHRpbWUoJnBkZXYtPmRldiwgJnRtKTsKLQlydGNfdG1fdG9fdGltZSgmdG0sICZ0aW1lLnR2X3NlYyk7Ci0JcmVzdG9yZV90aW1lX2RlbHRhKCZhdDkxX3J0Y19kZWx0YSwgJnRpbWUpOwotCi0JaWYgKGF0OTFfcnRjX2ltcikgewotCQlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCi0JCQlkaXNhYmxlX2lycV93YWtlKEFUOTFfSURfU1lTKTsKLQkJZWxzZQotCQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSUVSLCBhdDkxX3J0Y19pbXIpOwotCX0KLQotCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCi0JCTE5MDAgKyB0bS50bV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksCi0JCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYXQ5MV9ydGNfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGF0OTFfcnRjX3Jlc3VtZSAgTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0OTFfcnRjX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gYXQ5MV9ydGNfcHJvYmUsCi0JLnJlbW92ZQkJPSBhdDkxX3J0Y19yZW1vdmUsCi0JLnN1c3BlbmQJPSBhdDkxX3J0Y19zdXNwZW5kLAotCS5yZXN1bWUJCT0gYXQ5MV9ydGNfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJhdDkxX3J0YyIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdDkxX3J0Y19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXQ5MV9ydGNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGF0OTFfcnRjX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXQ5MV9ydGNfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoYXQ5MV9ydGNfaW5pdCk7Ci1tb2R1bGVfZXhpdChhdDkxX3J0Y19leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiUmljayBCcm9uc29uIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBkcml2ZXIgZm9yIEF0bWVsIEFUOTFSTTkyMDAiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1hdDkxcm05MjAwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtYXQ5MXJtOTIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNjU0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtYXQ5MXJtOTIwMC5jCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgTGludXggb24gQXRtZWwgQVQ5MVJNOTIwMAorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMiBSaWNrIEJyb25zb24KKyAqCisgKglDb252ZXJ0ZWQgdG8gUlRDIGNsYXNzIG1vZGVsIGJ5IEFuZHJldyBWaWN0b3IKKyAqCisgKglQb3J0ZWQgdG8gTGludXggMi42IGJ5IFN0ZXZlbiBTY2hvbHoKKyAqCUJhc2VkIG9uIHMzYzI0MTAtcnRjLmMgU2ltdGVjIEVsZWN0cm9uaWNzCisgKgorICoJQmFzZWQgb24gc2ExMTAwLXJ0Yy5jIGJ5IE5pbHMgRmFlcmJlcgorICoJQmFzZWQgb24gcnRjLmMgYnkgUGF1bCBHb3J0bWFrZXIKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKworI2RlZmluZSBBVDkxX1JUQ19GUkVRCQkxCisjZGVmaW5lIEFUOTFfUlRDX0VQT0NICQkxOTAwVUwJLyoganVzdCBsaWtlIGFyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMgKi8KKworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihhdDkxX3J0Y191cGRhdGVkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXQ5MV9hbGFybV95ZWFyID0gQVQ5MV9SVENfRVBPQ0g7CisKKy8qCisgKiBEZWNvZGUgdGltZS9kYXRlIGludG8gcnRjX3RpbWUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfcnRjX2RlY29kZXRpbWUodW5zaWduZWQgaW50IHRpbWVyZWcsIHVuc2lnbmVkIGludCBjYWxyZWcsCisJCQkJc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBpbnQgdGltZSwgZGF0ZTsKKworCS8qIG11c3QgcmVhZCB0d2ljZSBpbiBjYXNlIGl0IGNoYW5nZXMgKi8KKwlkbyB7CisJCXRpbWUgPSBhdDkxX3N5c19yZWFkKHRpbWVyZWcpOworCQlkYXRlID0gYXQ5MV9zeXNfcmVhZChjYWxyZWcpOworCX0gd2hpbGUgKCh0aW1lICE9IGF0OTFfc3lzX3JlYWQodGltZXJlZykpIHx8CisJCQkoZGF0ZSAhPSBhdDkxX3N5c19yZWFkKGNhbHJlZykpKTsKKworCXRtLT50bV9zZWMgID0gQkNEMkJJTigodGltZSAmIEFUOTFfUlRDX1NFQykgPj4gMCk7CisJdG0tPnRtX21pbiAgPSBCQ0QyQklOKCh0aW1lICYgQVQ5MV9SVENfTUlOKSA+PiA4KTsKKwl0bS0+dG1faG91ciA9IEJDRDJCSU4oKHRpbWUgJiBBVDkxX1JUQ19IT1VSKSA+PiAxNik7CisKKwkvKgorCSAqIFRoZSBDYWxlbmRhciBBbGFybSByZWdpc3RlciBkb2VzIG5vdCBoYXZlIGEgZmllbGQgZm9yCisJICogdGhlIHllYXIgLSBzbyB0aGVzZSB3aWxsIHJldHVybiBhbiBpbnZhbGlkIHZhbHVlLiAgV2hlbiBhbgorCSAqIGFsYXJtIGlzIHNldCwgYXQ5MV9hbGFybV95ZWFyIHdpbGxlIHN0b3JlIHRoZSBjdXJyZW50IHllYXIuCisJICovCisJdG0tPnRtX3llYXIgID0gQkNEMkJJTihkYXRlICYgQVQ5MV9SVENfQ0VOVCkgKiAxMDA7CS8qIGNlbnR1cnkgKi8KKwl0bS0+dG1feWVhciArPSBCQ0QyQklOKChkYXRlICYgQVQ5MV9SVENfWUVBUikgPj4gOCk7CS8qIHllYXIgKi8KKworCXRtLT50bV93ZGF5ID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX0RBWSkgPj4gMjEpIC0gMTsJLyogZGF5IG9mIHRoZSB3ZWVrIFswLTZdLCBTdW5kYXk9MCAqLworCXRtLT50bV9tb24gID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX01PTlRIKSA+PiAxNikgLSAxOworCXRtLT50bV9tZGF5ID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX0RBVEUpID4+IDI0KTsKK30KKworLyoKKyAqIFJlYWQgY3VycmVudCB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IGF0OTFfcnRjX3JlYWR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlhdDkxX3J0Y19kZWNvZGV0aW1lKEFUOTFfUlRDX1RJTVIsIEFUOTFfUlRDX0NBTFIsIHRtKTsKKwl0bS0+dG1feWRheSA9IHJ0Y195ZWFyX2RheXModG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyKTsKKwl0bS0+dG1feWVhciA9IHRtLT50bV95ZWFyIC0gMTkwMDsKKworCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCisJCTE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGN1cnJlbnQgdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBhdDkxX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIGNyOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKKwkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJLyogU3RvcCBUaW1lL0NhbGVuZGFyIGZyb20gY291bnRpbmcgKi8KKwljciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9SVENfQ1IpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NSLCBjciB8IEFUOTFfUlRDX1VQRENBTCB8IEFUOTFfUlRDX1VQRFRJTSk7CisKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRVIsIEFUOTFfUlRDX0FDS1VQRCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYXQ5MV9ydGNfdXBkYXRlZCk7CS8qIHdhaXQgZm9yIEFDS1VQRCBpbnRlcnJ1cHQgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCk7CisKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19USU1SLAorCQkJICBCSU4yQkNEKHRtLT50bV9zZWMpIDw8IDAKKwkJCXwgQklOMkJDRCh0bS0+dG1fbWluKSA8PCA4CisJCQl8IEJJTjJCQ0QodG0tPnRtX2hvdXIpIDw8IDE2KTsKKworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NBTFIsCisJCQkgIEJJTjJCQ0QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApCS8qIGNlbnR1cnkgKi8KKwkJCXwgQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCkgPDwgOAkvKiB5ZWFyICovCisJCQl8IEJJTjJCQ0QodG0tPnRtX21vbiArIDEpIDw8IDE2CQkvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwkJCXwgQklOMkJDRCh0bS0+dG1fd2RheSArIDEpIDw8IDIxCS8qIGRheSBvZiB0aGUgd2VlayBbMC02XSwgU3VuZGF5PTAgKi8KKwkJCXwgQklOMkJDRCh0bS0+dG1fbWRheSkgPDwgMjQpOworCisJLyogUmVzdGFydCBUaW1lL0NhbGVuZGFyICovCisJY3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0NSKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19DUiwgY3IgJiB+KEFUOTFfUlRDX1VQRENBTCB8IEFUOTFfUlRDX1VQRFRJTSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcmVhZGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCisJYXQ5MV9ydGNfZGVjb2RldGltZShBVDkxX1JUQ19USU1BTFIsIEFUOTFfUlRDX0NBTEFMUiwgdG0pOworCXRtLT50bV95ZGF5ID0gcnRjX3llYXJfZGF5cyh0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIpOworCXRtLT50bV95ZWFyID0gYXQ5MV9hbGFybV95ZWFyIC0gMTkwMDsKKworCWFscm0tPmVuYWJsZWQgPSAoYXQ5MV9zeXNfcmVhZChBVDkxX1JUQ19JTVIpICYgQVQ5MV9SVENfQUxBUk0pCisJCQk/IDEgOiAwOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKKwkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgYWxhcm0gdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBhdDkxX3J0Y19zZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKworCWF0OTFfcnRjX2RlY29kZXRpbWUoQVQ5MV9SVENfVElNUiwgQVQ5MV9SVENfQ0FMUiwgJnRtKTsKKworCWF0OTFfYWxhcm1feWVhciA9IHRtLnRtX3llYXI7CisKKwl0bS50bV9ob3VyID0gYWxybS0+dGltZS50bV9ob3VyOworCXRtLnRtX21pbiA9IGFscm0tPnRpbWUudG1fbWluOworCXRtLnRtX3NlYyA9IGFscm0tPnRpbWUudG1fc2VjOworCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfVElNQUxSLAorCQkgIEJJTjJCQ0QodG0udG1fc2VjKSA8PCAwCisJCXwgQklOMkJDRCh0bS50bV9taW4pIDw8IDgKKwkJfCBCSU4yQkNEKHRtLnRtX2hvdXIpIDw8IDE2CisJCXwgQVQ5MV9SVENfSE9VUkVOIHwgQVQ5MV9SVENfTUlORU4gfCBBVDkxX1JUQ19TRUNFTik7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfQ0FMQUxSLAorCQkgIEJJTjJCQ0QodG0udG1fbW9uICsgMSkgPDwgMTYJCS8qIHRtX21vbiBzdGFydHMgYXQgemVybyAqLworCQl8IEJJTjJCQ0QodG0udG1fbWRheSkgPDwgMjQKKwkJfCBBVDkxX1JUQ19EQVRFRU4gfCBBVDkxX1JUQ19NVEhFTik7CisKKwlwcl9kZWJ1ZygiJXMoKTogJTRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwgX19GVU5DVElPTl9fLAorCQlhdDkxX2FsYXJtX3llYXIsIHRtLnRtX21vbiwgdG0udG1fbWRheSwgdG0udG1faG91ciwKKwkJdG0udG1fbWluLCB0bS50bV9zZWMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYW5kbGUgY29tbWFuZHMgZnJvbSB1c2VyLXNwYWNlCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXMoKTogY21kPSUwOHgsIGFyZz0lMDhseC5cbiIsIF9fRlVOQ1RJT05fXywgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgkvKiBhbGFybSBvZmYgKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSURSLCBBVDkxX1JUQ19BTEFSTSk7CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoJLyogYWxhcm0gb24gKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSUVSLCBBVDkxX1JUQ19BTEFSTSk7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PRkY6CS8qIHVwZGF0ZSBvZmYgKi8KKwljYXNlIFJUQ19QSUVfT0ZGOgkvKiBwZXJpb2RpYyBvZmYgKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSURSLCBBVDkxX1JUQ19TRUNFVik7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PTjoJLyogdXBkYXRlIG9uICovCisJY2FzZSBSVENfUElFX09OOgkvKiBwZXJpb2RpYyBvbiAqLworCQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRVIsIEFUOTFfUlRDX1NFQ0VWKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfSVJRUF9SRUFEOgkvKiByZWFkIHBlcmlvZGljIGFsYXJtIGZyZXF1ZW5jeSAqLworCQlyZXQgPSBwdXRfdXNlcihBVDkxX1JUQ19GUkVRLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIFJUQ19JUlFQX1NFVDoJLyogc2V0IHBlcmlvZGljIGFsYXJtIGZyZXF1ZW5jeSAqLworCQlpZiAoYXJnICE9IEFUOTFfUlRDX0ZSRVEpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQcm92aWRlIGFkZGl0aW9uYWwgUlRDIGluZm9ybWF0aW9uIGluIC9wcm9jL2RyaXZlci9ydGMKKyAqLworc3RhdGljIGludCBhdDkxX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJdW5zaWduZWQgbG9uZyBpbXIgPSBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0lNUik7CisKKwlzZXFfcHJpbnRmKHNlcSwgInVwZGF0ZV9JUlFcdDogJXNcbiIsCisJCQkoaW1yICYgQVQ5MV9SVENfQUNLVVBEKSA/ICJ5ZXMiIDogIm5vIik7CisJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsCisJCQkoaW1yICYgQVQ5MV9SVENfU0VDRVYpID8gInllcyIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX2ZyZXFcdDogJWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpIEFUOTFfUlRDX0ZSRVEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIFJUQworICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2lkOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgcnRzcjsKKwl1bnNpZ25lZCBsb25nIGV2ZW50cyA9IDA7CisKKwlydHNyID0gYXQ5MV9zeXNfcmVhZChBVDkxX1JUQ19TUikgJiBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0lNUik7CisJaWYgKHJ0c3IpIHsJCS8qIHRoaXMgaW50ZXJydXB0IGlzIHNoYXJlZCEgIElzIGl0IG91cnM/ICovCisJCWlmIChydHNyICYgQVQ5MV9SVENfQUxBUk0pCisJCQlldmVudHMgfD0gKFJUQ19BRiB8IFJUQ19JUlFGKTsKKwkJaWYgKHJ0c3IgJiBBVDkxX1JUQ19TRUNFVikKKwkJCWV2ZW50cyB8PSAoUlRDX1VGIHwgUlRDX0lSUUYpOworCQlpZiAocnRzciAmIEFUOTFfUlRDX0FDS1VQRCkKKwkJCWNvbXBsZXRlKCZhdDkxX3J0Y191cGRhdGVkKTsKKworCQlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19TQ0NSLCBydHNyKTsJLyogY2xlYXIgc3RhdHVzIHJlZyAqLworCisJCXJ0Y191cGRhdGVfaXJxKCZydGMtPmNsYXNzX2RldiwgMSwgZXZlbnRzKTsKKworCQlwcl9kZWJ1ZygiJXMoKTogbnVtPSVsZCwgZXZlbnRzPTB4JTAybHhcbiIsIF9fRlVOQ1RJT05fXywKKwkJCWV2ZW50cyA+PiA4LCBldmVudHMgJiAweDAwMDAwMEZGKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiBJUlFfTk9ORTsJCS8qIG5vdCBoYW5kbGVkICovCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhdDkxX3J0Y19vcHMgPSB7CisJLmlvY3RsCQk9IGF0OTFfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUJPSBhdDkxX3J0Y19yZWFkdGltZSwKKwkuc2V0X3RpbWUJPSBhdDkxX3J0Y19zZXR0aW1lLAorCS5yZWFkX2FsYXJtCT0gYXQ5MV9ydGNfcmVhZGFsYXJtLAorCS5zZXRfYWxhcm0JPSBhdDkxX3J0Y19zZXRhbGFybSwKKwkucHJvYwkJPSBhdDkxX3J0Y19wcm9jLAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgYW5kIGluc3RhbGwgUlRDIGRyaXZlcgorICovCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJaW50IHJldDsKKworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NSLCAwKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19NUiwgMCk7CQkvKiAyNCBob3VyIG1vZGUgKi8KKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCB8IEFUOTFfUlRDX0FMQVJNIHwKKwkJCQkJQVQ5MV9SVENfU0VDRVYgfCBBVDkxX1JUQ19USU1FViB8CisJCQkJCUFUOTFfUlRDX0NBTEVWKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKEFUOTFfSURfU1lTLCBhdDkxX3J0Y19pbnRlcnJ1cHQsCisJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCQkJCSJhdDkxX3J0YyIsIHBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdDkxX3J0YzogSVJRICVkIGFscmVhZHkgaW4gdXNlLlxuIiwKKwkJCQlBVDkxX0lEX1NZUyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJCSZhdDkxX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJZnJlZV9pcnEoQVQ5MV9JRF9TWVMsIHBkZXYpOworCQlyZXR1cm4gUFRSX0VSUihydGMpOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKworCXByaW50ayhLRVJOX0lORk8gIkFUOTEgUmVhbCBUaW1lIENsb2NrIGRyaXZlci5cbiIpOworCXJldHVybiAwOworfQorCisvKgorICogRGlzYWJsZSBhbmQgcmVtb3ZlIHRoZSBSVEMgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IGF0OTFfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCB8IEFUOTFfUlRDX0FMQVJNIHwKKwkJCQkJQVQ5MV9SVENfU0VDRVYgfCBBVDkxX1JUQ19USU1FViB8CisJCQkJCUFUOTFfUlRDX0NBTEVWKTsKKwlmcmVlX2lycShBVDkxX0lEX1NZUywgcGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKiBBVDkxUk05MjAwIFJUQyBQb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBhdDkxX3J0Y19kZWx0YTsKK3N0YXRpYyB1MzIgYXQ5MV9ydGNfaW1yOworCitzdGF0aWMgaW50IGF0OTFfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKworCXRpbWUudHZfbnNlYyA9IDA7CisKKwkvKiBjYWxjdWxhdGUgdGltZSBkZWx0YSBmb3Igc3VzcGVuZCAqLworCWF0OTFfcnRjX3JlYWR0aW1lKCZwZGV2LT5kZXYsICZ0bSk7CisJcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGltZS50dl9zZWMpOworCXNhdmVfdGltZV9kZWx0YSgmYXQ5MV9ydGNfZGVsdGEsICZ0aW1lKTsKKworCS8qIHRoaXMgSVJRIGlzIHNoYXJlZCB3aXRoIERCR1UgYW5kIG90aGVyIGhhcmR3YXJlIHdoaWNoIGlzbid0CisJICogbmVjZXNzYXJpbHkgZG9pbmcgUE0gbGlrZSB3ZSBhcmUuLi4KKwkgKi8KKwlhdDkxX3J0Y19pbXIgPSBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0lNUikKKwkJCSYgKEFUOTFfUlRDX0FMQVJNfEFUOTFfUlRDX1NFQ0VWKTsKKwlpZiAoYXQ5MV9ydGNfaW1yKSB7CisJCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJCWVuYWJsZV9pcnFfd2FrZShBVDkxX0lEX1NZUyk7CisJCWVsc2UKKwkJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lEUiwgYXQ5MV9ydGNfaW1yKTsKKwl9CisKKwlwcl9kZWJ1ZygiJXMoKTogJTRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwgX19GVU5DVElPTl9fLAorCQkxOTAwICsgdG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LAorCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDkxX3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisKKwl0aW1lLnR2X25zZWMgPSAwOworCisJYXQ5MV9ydGNfcmVhZHRpbWUoJnBkZXYtPmRldiwgJnRtKTsKKwlydGNfdG1fdG9fdGltZSgmdG0sICZ0aW1lLnR2X3NlYyk7CisJcmVzdG9yZV90aW1lX2RlbHRhKCZhdDkxX3J0Y19kZWx0YSwgJnRpbWUpOworCisJaWYgKGF0OTFfcnRjX2ltcikgeworCQlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCQlkaXNhYmxlX2lycV93YWtlKEFUOTFfSURfU1lTKTsKKwkJZWxzZQorCQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSUVSLCBhdDkxX3J0Y19pbXIpOworCX0KKworCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCisJCTE5MDAgKyB0bS50bV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksCisJCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYXQ5MV9ydGNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGF0OTFfcnRjX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0OTFfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYXQ5MV9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBhdDkxX3J0Y19yZW1vdmUsCisJLnN1c3BlbmQJPSBhdDkxX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXQ5MV9ydGNfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhdDkxX3J0YyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX3J0Y19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXQ5MV9ydGNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0OTFfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXQ5MV9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXQ5MV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChhdDkxX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmljayBCcm9uc29uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUQyBkcml2ZXIgZm9yIEF0bWVsIEFUOTFSTTkyMDAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwppbmRleCA1ODM3ODljLi45NGQzZGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCkBAIC01MywxNSArNTMsMTggQEAKICAqIFJvdXRpbmUgdG8gcG9sbCBSVEMgc2Vjb25kcyBmaWVsZCBmb3IgY2hhbmdlIGFzIG9mdGVuIGFzIHBvc3NpYmxlLAogICogYWZ0ZXIgZmlyc3QgUlRDX1VJRSB1c2UgdGltZXIgdG8gcmVkdWNlIHBvbGxpbmcKICAqLwotc3RhdGljIHZvaWQgcnRjX3VpZV90YXNrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBydGNfdWllX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBkYXRhOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ0Y19kZXZpY2UsIHVpZV90YXNrKTsKIAlzdHJ1Y3QgcnRjX3RpbWUgdG07CiAJaW50IG51bSA9IDA7CiAJaW50IGVycjsKIAogCWVyciA9IHJ0Y19yZWFkX3RpbWUoJnJ0Yy0+Y2xhc3NfZGV2LCAmdG0pOwotCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlzcGluX2xvY2soJnJ0Yy0+aXJxX2xvY2spOwogCWlmIChydGMtPnN0b3BfdWllX3BvbGxpbmcgfHwgZXJyKSB7CiAJCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKIAl9IGVsc2UgaWYgKHJ0Yy0+b2xkc2VjcyAhPSB0bS50bV9zZWMpIHsKQEAgLTc0LDExICs3NywxMSBAQAogCX0gZWxzZSBpZiAoc2NoZWR1bGVfd29yaygmcnRjLT51aWVfdGFzaykgPT0gMCkgewogCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7CiAJfQotCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJc3Bpbl91bmxvY2soJnJ0Yy0+aXJxX2xvY2spOwogCWlmIChudW0pCiAJCXJ0Y191cGRhdGVfaXJxKCZydGMtPmNsYXNzX2RldiwgbnVtLCBSVENfVUYgfCBSVENfSVJRRik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQotCiBzdGF0aWMgdm9pZCBydGNfdWllX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gKHN0cnVjdCBydGNfZGV2aWNlICopZGF0YTsKQEAgLTIxNCw3ICsyMTcsNyBAQAogCXN0cnVjdCBydGNfd2thbHJtIGFsYXJtOwogCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKIAotCS8qIGNoZWNrIHRoYXQgdGhlIGNhbGxlcyBoYXMgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMKKwkvKiBjaGVjayB0aGF0IHRoZSBjYWxsaW5nIHRhc2sgaGFzIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zCiAJICogZm9yIGNlcnRhaW4gaW9jdGxzLiBkb2luZyB0aGlzIGNoZWNrIGhlcmUgaXMgdXNlZnVsCiAJICogdG8gYXZvaWQgZHVwbGljYXRlIGNvZGUgaW4gZWFjaCBkcml2ZXIuCiAJICovCkBAIC0yMzgsMTAgKzI0MSwxMCBAQAogCiAJLyogYXZvaWQgY29uZmxpY3RpbmcgSVJRIHVzZXJzICovCiAJaWYgKGNtZCA9PSBSVENfUElFX09OIHx8IGNtZCA9PSBSVENfUElFX09GRiB8fCBjbWQgPT0gUlRDX0lSUVBfU0VUKSB7Ci0JCXNwaW5fbG9jaygmcnRjLT5pcnFfdGFza19sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfdGFza19sb2NrKTsKIAkJaWYgKHJ0Yy0+aXJxX3Rhc2spCiAJCQllcnIgPSAtRUJVU1k7Ci0JCXNwaW5fdW5sb2NrKCZydGMtPmlycV90YXNrX2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CiAKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwpAQCAtMjk5LDYgKzMwMiwxNyBAQAogCiAJCWVyciA9IHJ0Y19zZXRfdGltZShjbGFzc19kZXYsICZ0bSk7CiAJCWJyZWFrOworCisJY2FzZSBSVENfSVJRUF9SRUFEOgorCQlpZiAob3BzLT5pcnFfc2V0X2ZyZXEpCisJCQllcnIgPSBwdXRfdXNlcihydGMtPmlycV9mcmVxLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgUlRDX0lSUVBfU0VUOgorCQlpZiAob3BzLT5pcnFfc2V0X2ZyZXEpCisJCQllcnIgPSBydGNfaXJxX3NldF9mcmVxKGNsYXNzX2RldiwgcnRjLT5pcnFfdGFzaywgYXJnKTsKKwkJYnJlYWs7CisKICNpZiAwCiAJY2FzZSBSVENfRVBPQ0hfU0VUOgogI2lmbmRlZiBydGNfZXBvY2gKQEAgLTM5OCw3ICs0MTIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZydGMtPmlycV9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGMtPmlycV9xdWV1ZSk7CiAjaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTAotCUlOSVRfV09SSygmcnRjLT51aWVfdGFzaywgcnRjX3VpZV90YXNrLCBydGMpOworCUlOSVRfV09SSygmcnRjLT51aWVfdGFzaywgcnRjX3VpZV90YXNrKTsKIAlzZXR1cF90aW1lcigmcnRjLT51aWVfdGltZXIsIHJ0Y191aWVfdGltZXIsICh1bnNpZ25lZCBsb25nKXJ0Yyk7CiAjZW5kaWYKIApAQCAtNDIxLDcgKzQzNSw3IEBACiAJCWdvdG8gZXJyX2NkZXZfZGVsOwogCX0KIAotCWRldl9pbmZvKGNsYXNzX2Rldi0+ZGV2LCAicnRjIGludGY6IGRldiAoJWQ6JWQpXG4iLAorCWRldl9kYmcoY2xhc3NfZGV2LT5kZXYsICJydGMgaW50ZjogZGV2ICglZDolZClcbiIsCiAJCU1BSk9SKHJ0Yy0+cnRjX2Rldi0+ZGV2dCksCiAJCU1JTk9SKHJ0Yy0+cnRjX2Rldi0+ZGV2dCkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKaW5kZXggNzg1NTJlNi4uMDAxZWIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYwpAQCAtMzQwLDcgKzM0MCw4IEBACiAKIAlpZiAocGRhdGEtPmlycSA+PSAwKSB7CiAJCXdyaXRlYigwLCBpb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7Ci0JCWlmIChyZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBkczE1NTNfcnRjX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCWlmIChyZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBkczE1NTNfcnRjX2ludGVycnVwdCwKKwkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCiAJCQkJcGRldi0+bmFtZSwgcGRldikgPCAwKSB7CiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG5vdCBhdmFpbGFibGUuXG4iKTsKIAkJCXBkYXRhLT5pcnEgPSAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYwppbmRleCA2N2U4MTZhLi4yMDVmYTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAKLQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZXZfZGJnKGFkYXB0ZXItPmNsYXNzX2Rldi5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewogCQllcnIgPSAtRU5PREVWOwpAQCAtMjM3LDE3ICsyMzcsMjIgQEAKIAkvKiByZWFkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAllcnIgPSBkczE2NzJfZ2V0X2NvbnRyb2woY2xpZW50LCAmY29udHJvbCk7CiAJaWYgKGVycikKLQkJZ290byBleGl0X2RldGFjaDsKKwkJZ290byBleGl0X2RldnJlZzsKIAogCWlmIChjb250cm9sICYgRFMxNjcyX1JFR19DT05UUk9MX0VPU0MpCiAJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIk9zY2lsbGF0b3Igbm90IGVuYWJsZWQuICIKIAkJCQkJIlNldCB0aW1lIHRvIGVuYWJsZS5cbiIpOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY29udHJvbCk7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NvbnRyb2wpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9kZXZyZWc7CiAKIAlyZXR1cm4gMDsKIAorZXhpdF9kZXZyZWc6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKIGV4aXRfZGV0YWNoOgogCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE3NDIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE3NDIuYwppbmRleCA2MjczYTNkLi4xNzYzM2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTc0Mi5jCkBAIC02LDYgKzYsMTAgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRvcnN0ZW4gRXJ0YmplcmcgUmFzbXVzc2VuIDx0ckBuZXd0ZWMuZGs+CisgKiAgLSBudnJhbSBzaXplIGRldGVybWluZWQgZnJvbSByZXNvdXJjZQorICogIC0gdGhpcyBkczE3NDIgZHJpdmVyIG5vdyBzdXBwb3J0cyBkczE3NDMuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgpAQCAtMTcsMjAgKzIxLDE5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zIgogCi0jZGVmaW5lIFJUQ19SRUdfU0laRQkJMHg4MDAKLSNkZWZpbmUgUlRDX09GRlNFVAkJMHg3ZjgKKyNkZWZpbmUgUlRDX1NJWkUJCTgKIAotI2RlZmluZSBSVENfQ09OVFJPTAkJKFJUQ19PRkZTRVQgKyAwKQotI2RlZmluZSBSVENfQ0VOVFVSWQkJKFJUQ19PRkZTRVQgKyAwKQotI2RlZmluZSBSVENfU0VDT05EUwkJKFJUQ19PRkZTRVQgKyAxKQotI2RlZmluZSBSVENfTUlOVVRFUwkJKFJUQ19PRkZTRVQgKyAyKQotI2RlZmluZSBSVENfSE9VUlMJCShSVENfT0ZGU0VUICsgMykKLSNkZWZpbmUgUlRDX0RBWQkJCShSVENfT0ZGU0VUICsgNCkKLSNkZWZpbmUgUlRDX0RBVEUJCShSVENfT0ZGU0VUICsgNSkKLSNkZWZpbmUgUlRDX01PTlRICQkoUlRDX09GRlNFVCArIDYpCi0jZGVmaW5lIFJUQ19ZRUFSCQkoUlRDX09GRlNFVCArIDcpCisjZGVmaW5lIFJUQ19DT05UUk9MCQkwCisjZGVmaW5lIFJUQ19DRU5UVVJZCQkwCisjZGVmaW5lIFJUQ19TRUNPTkRTCQkxCisjZGVmaW5lIFJUQ19NSU5VVEVTCQkyCisjZGVmaW5lIFJUQ19IT1VSUwkJMworI2RlZmluZSBSVENfREFZCQkJNAorI2RlZmluZSBSVENfREFURQkJNQorI2RlZmluZSBSVENfTU9OVEgJCTYKKyNkZWZpbmUgUlRDX1lFQVIJCTcKIAogI2RlZmluZSBSVENfQ0VOVFVSWV9NQVNLCTB4M2YKICNkZWZpbmUgUlRDX1NFQ09ORFNfTUFTSwkweDdmCkBAIC00OCw3ICs1MSwxMCBAQAogCiBzdHJ1Y3QgcnRjX3BsYXRfZGF0YSB7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKLQl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcl9udnJhbTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcl9ydGM7CisJc2l6ZV90IHNpemVfbnZyYW07CisJc2l6ZV90IHNpemU7CiAJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKIAl1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKIH07CkBAIC01Nyw3ICs2Myw3IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHJfcnRjOwogCXU4IGNlbnR1cnk7CiAKIAljZW50dXJ5ID0gQklOMkJDRCgodG0tPnRtX3llYXIgKyAxOTAwKSAvIDEwMCk7CkBAIC04Miw3ICs4OCw3IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHJfcnRjOwogCXVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgd2VlazsKIAl1bnNpZ25lZCBpbnQgY2VudHVyeTsKIApAQCAtMTI3LDEwICsxMzMsMTAgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0KIAkJdG9fcGxhdGZvcm1fZGV2aWNlKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcl9udnJhbTsKIAlzc2l6ZV90IGNvdW50OwogCi0JZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IFJUQ19PRkZTRVQ7IGNvdW50KyssIHNpemUtLSkKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgcGRhdGEtPnNpemVfbnZyYW07IGNvdW50KyssIHNpemUtLSkKIAkJKmJ1ZisrID0gcmVhZGIoaW9hZGRyICsgcG9zKyspOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTE0MSwxMCArMTQ3LDEwIEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9CiAJCXRvX3BsYXRmb3JtX2RldmljZShjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHJfbnZyYW07CiAJc3NpemVfdCBjb3VudDsKIAotCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBSVENfT0ZGU0VUOyBjb3VudCsrLCBzaXplLS0pCisJZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IHBkYXRhLT5zaXplX252cmFtOyBjb3VudCsrLCBzaXplLS0pCiAJCXdyaXRlYigqYnVmKyssIGlvYWRkciArIHBvcysrKTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xNTUsNyArMTYxLDYgQEAKIAkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VHTywKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKLQkuc2l6ZSA9IFJUQ19PRkZTRVQsCiAJLnJlYWQgPSBkczE3NDJfbnZyYW1fcmVhZCwKIAkud3JpdGUgPSBkczE3NDJfbnZyYW1fd3JpdGUsCiB9OwpAQCAtMTc1LDE5ICsxODAsMjMgQEAKIAlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFJUQ19SRUdfU0laRSwgcGRldi0+bmFtZSkpIHsKKwlwZGF0YS0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcGRhdGEtPnNpemUsIHBkZXYtPm5hbWUpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQogCXBkYXRhLT5iYXNlYWRkciA9IHJlcy0+c3RhcnQ7Ci0JaW9hZGRyID0gaW9yZW1hcChwZGF0YS0+YmFzZWFkZHIsIFJUQ19SRUdfU0laRSk7CisJaW9hZGRyID0gaW9yZW1hcChwZGF0YS0+YmFzZWFkZHIsIHBkYXRhLT5zaXplKTsKIAlpZiAoIWlvYWRkcikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JcGRhdGEtPmlvYWRkciA9IGlvYWRkcjsKKwlwZGF0YS0+aW9hZGRyX252cmFtID0gaW9hZGRyOworCXBkYXRhLT5zaXplX252cmFtID0gcGRhdGEtPnNpemUgLSBSVENfU0laRTsKKwlwZGF0YS0+aW9hZGRyX3J0YyA9IGlvYWRkciArIHBkYXRhLT5zaXplX252cmFtOwogCiAJLyogdHVybiBSVEMgb24gaWYgaXQgd2FzIG5vdCBvbiAqLworCWlvYWRkciA9IHBkYXRhLT5pb2FkZHJfcnRjOwogCXNlYyA9IHJlYWRiKGlvYWRkciArIFJUQ19TRUNPTkRTKTsKIAlpZiAoc2VjICYgUlRDX1NUT1ApIHsKIAkJc2VjICY9IFJUQ19TRUNPTkRTX01BU0s7CkBAIC0yMDgsNiArMjE3LDggQEAKIAlwZGF0YS0+cnRjID0gcnRjOwogCXBkYXRhLT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKwlkczE3NDJfbnZyYW1fYXR0ci5zaXplID0gbWF4KGRzMTc0Ml9udnJhbV9hdHRyLnNpemUsCisJCQkJICAgICBwZGF0YS0+c2l6ZV9udnJhbSk7CiAJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJmRzMTc0Ml9udnJhbV9hdHRyKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKQEAgLTIxNSwxMCArMjI2LDEwIEBACiAgb3V0OgogCWlmIChwZGF0YS0+cnRjKQogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7Ci0JaWYgKGlvYWRkcikKLQkJaW91bm1hcChpb2FkZHIpOworCWlmIChwZGF0YS0+aW9hZGRyX252cmFtKQorCQlpb3VubWFwKHBkYXRhLT5pb2FkZHJfbnZyYW0pOwogCWlmIChwZGF0YS0+YmFzZWFkZHIpCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwZGF0YS0+YmFzZWFkZHIsIFJUQ19SRUdfU0laRSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwZGF0YS0+YmFzZWFkZHIsIHBkYXRhLT5zaXplKTsKIAlrZnJlZShwZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIyOSw4ICsyNDAsOCBAQAogCiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJmRzMTc0Ml9udnJhbV9hdHRyKTsKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7Ci0JaW91bm1hcChwZGF0YS0+aW9hZGRyKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocGRhdGEtPmJhc2VhZGRyLCBSVENfUkVHX1NJWkUpOworCWlvdW5tYXAocGRhdGEtPmlvYWRkcl9udnJhbSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBkYXRhLT5iYXNlYWRkciwgcGRhdGEtPnNpemUpOwogCWtmcmVlKHBkYXRhKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1saWIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1saWIuYwppbmRleCBiYTc5NWE0Li43YmJjMjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbGliLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWxpYi5jCkBAIC0xMTcsNCArMTE3LDg1IEBACiB9CiBFWFBPUlRfU1lNQk9MKHJ0Y190bV90b190aW1lKTsKIAorCisvKiBNZXJnZSB0aGUgdmFsaWQgKGkuZS4gbm9uLW5lZ2F0aXZlKSBmaWVsZHMgb2YgYWxhcm0gaW50byB0aGUgY3VycmVudAorICogdGltZS4gIElmIHRoZSB2YWxpZCBhbGFybSBmaWVsZHMgYXJlIGVhcmxpZXIgdGhhbiB0aGUgZXF1aXZhbGVudAorICogZmllbGRzIGluIHRoZSB0aW1lLCBjYXJyeSBvbmUgaW50byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgaW52YWxpZAorICogZmllbGQsIHNvIHRoYXQgdGhlIGFsYXJtIGV4cGlyeSBpcyBpbiB0aGUgZnV0dXJlLiAgSXQgYXNzdW1lcyB0aGF0IHRoZQorICogbGVhc3Qgc2lnbmlmaWNhbnQgaW52YWxpZCBmaWVsZCBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIG1vc3QKKyAqIHNpZ25pZmljYW50IHZhbGlkIGZpZWxkLCBhbmQgdGhhdCB0aGUgc2Vjb25kcyBmaWVsZCBpcyB2YWxpZC4KKyAqCisgKiBUaGlzIGlzIHVzZWQgYnkgYWxhcm1zIHRoYXQgdGFrZSByZWxhdGl2ZSAocmF0aGVyIHRoYW4gYWJzb2x1dGUpCisgKiB0aW1lcywgYW5kL29yIGhhdmUgYSBzaW1wbGUgYmluYXJ5IHNlY29uZCBjb3VudGVyIGluc3RlYWQgb2YKKyAqIGRheS9ob3VyL21pbnV0ZS9zZWMgcmVnaXN0ZXJzLgorICovCit2b2lkIHJ0Y19tZXJnZV9hbGFybShzdHJ1Y3QgcnRjX3RpbWUgKm5vdywgc3RydWN0IHJ0Y190aW1lICphbGFybSkKK3sKKwlpbnQgKmFsYXJtcCA9ICZhbGFybS0+dG1fc2VjOworCWludCAqdGltZXAgPSAmbm93LT50bV9zZWM7CisJaW50IGNhcnJ5X2ludG8sIGk7CisKKwkvKiBJZ25vcmUgZXZlcnl0aGluZyBwYXN0IHRoZSA2dGggZWxlbWVudCAodG1feWVhcikuICovCisJZm9yIChpID0gNTsgaSA+IDA7IGktLSkgeworCQlpZiAoYWxhcm1wW2ldIDwgMCkKKwkJCWFsYXJtcFtpXSA9IHRpbWVwW2ldOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwkvKiBObyBjYXJyeSBuZWVkZWQgaWYgYWxsIGZpZWxkcyBhcmUgdmFsaWQuICovCisJaWYgKGkgPT0gNSkKKwkJcmV0dXJuOworCisJZm9yIChjYXJyeV9pbnRvID0gaSArIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChhbGFybXBbaV0gPCB0aW1lcFtpXSkKKwkJCWJyZWFrOworCisJCWlmIChhbGFybXBbaV0gPiB0aW1lcFtpXSkKKwkJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGNhcnJ5X2ludG8pIHsKKwkJY2FzZSAxOgorCQkJYWxhcm0tPnRtX21pbisrOworCisJCQlpZiAoYWxhcm0tPnRtX21pbiA8IDYwKQorCQkJCXJldHVybjsKKworCQkJYWxhcm0tPnRtX21pbiA9IDA7CisJCQkvKiBmYWxsLXRocm91Z2ggKi8KKworCQljYXNlIDI6CisJCQlhbGFybS0+dG1faG91cisrOworCisJCQlpZiAoYWxhcm0tPnRtX2hvdXIgPCA2MCkKKwkJCQlyZXR1cm47CisKKwkJCWFsYXJtLT50bV9ob3VyID0gMDsKKwkJCS8qIGZhbGwtdGhyb3VnaCAqLworCisJCWNhc2UgMzoKKwkJCWFsYXJtLT50bV9tZGF5Kys7CisKKwkJCWlmIChhbGFybS0+dG1fbWRheSA8PSBydGNfZGF5c19pbl9tb250aFthbGFybS0+dG1fbW9uXSkKKwkJCQlyZXR1cm47CisKKwkJCWFsYXJtLT50bV9tZGF5ID0gMTsKKwkJCS8qIGZhbGwtdGhyb3VnaCAqLworCisJCWNhc2UgNDoKKwkJCWFsYXJtLT50bV9tb24rKzsKKworCQkJaWYgKGFsYXJtLT50bV9tb24gPD0gMTIpCisJCQkJcmV0dXJuOworCisJCQlhbGFybS0+dG1fbW9uID0gMTsKKwkJCS8qIGZhbGwtdGhyb3VnaCAqLworCisJCWNhc2UgNToKKwkJCWFsYXJtLT50bV95ZWFyKys7CisJfQorfQorRVhQT1JUX1NZTUJPTChydGNfbWVyZ2VfYWxhcm0pOworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jIGIvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwppbmRleCAwYjIwZGZhLi5kOTQxNzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAyLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCWR0LT50bV9taW4JPSBCQ0QyQklOKGNoaXAtPmJ1ZlsyXSk7CiAJZHQtPnRtX2hvdXIJPSBCQ0QyQklOKGNoaXAtPmJ1ZlszXSk7CiAJZHQtPnRtX21kYXkJPSBCQ0QyQklOKGNoaXAtPmJ1Zls0XSk7Ci0JZHQtPnRtX21vbgk9IEJDRDJCSU4oY2hpcC0+YnVmWzVdIC0gMSk7CisJZHQtPnRtX21vbgk9IEJDRDJCSU4oY2hpcC0+YnVmWzVdKSAtIDE7CiAJZHQtPnRtX3dkYXkJPSBCQ0QyQklOKGNoaXAtPmJ1Zls2XSk7CiAJZHQtPnRtX3llYXIgPSBCQ0QyQklOKGNoaXAtPmJ1Zls3XSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1vbWFwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtb21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OTg4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtb21hcC5jCkBAIC0wLDAgKzEsNTcxIEBACisvKgorICogVEkgT01BUDEgUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQXV0aG9yOiBHZW9yZ2UgRy4gRGF2aXMgPGdkYXZpc0BtdmlzdGEuY29tPiBvciA8c291cmNlQG12aXN0YS5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IERhdmlkIEJyb3duZWxsIChuZXcgUlRDIGZyYW1ld29yaykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworCisvKiBUaGUgT01BUDEgUlRDIGlzIGEgeWVhci9tb250aC9kYXkvaG91cnMvbWludXRlcy9zZWNvbmRzIEJDRCBjbG9jaworICogd2l0aCBjZW50dXJ5LXJhbmdlIGFsYXJtIG1hdGNoaW5nLCBkcml2ZW4gYnkgdGhlIDMya0h6IGNsb2NrLgorICoKKyAqIFRoZSBtYWluIHVzZXItdmlzaWJsZSB3YXlzIGl0IGRpZmZlcnMgZnJvbSBQQyBSVENzIGFyZSBieSBvbWl0dGluZworICogImRvbid0IGNhcmUiIGFsYXJtIGZpZWxkcyBhbmQgc3ViLXNlY29uZCBwZXJpb2RpYyBJUlFzLCBhbmQgaGF2aW5nCisgKiBhbiBhdXRvYWRqdXN0IG1lY2hhbmlzbSB0byBjYWxpYnJhdGUgdG8gdGhlIHRydWUgb3NjaWxsYXRvciByYXRlLgorICoKKyAqIEJvYXJkLXNwZWNpZmljIHdpcmluZyBvcHRpb25zIGluY2x1ZGUgdXNpbmcgc3BsaXQgcG93ZXIgbW9kZSB3aXRoCisgKiBSVENfT0ZGX05PRkYgdXNlZCBhcyB0aGUgcmVzZXQgc2lnbmFsIChzbyB0aGUgUlRDIHdvbid0IGJlIHJlc2V0KSwKKyAqIGFuZCB3aXJpbmcgUlRDX1dBS0VfSU5UIChzbyB0aGUgUlRDIGFsYXJtIGNhbiB3YWtlIHRoZSBzeXN0ZW0gZnJvbQorICogbG93IHBvd2VyIG1vZGVzKS4gIFNlZSB0aGUgQk9BUkQtU1BFQ0lGSUMgQ1VTVE9NSVpBVElPTiBjb21tZW50LgorICovCisKKyNkZWZpbmUgT01BUF9SVENfQkFTRQkJCTB4ZmZmYjQ4MDAKKworLyogUlRDIHJlZ2lzdGVycyAqLworI2RlZmluZSBPTUFQX1JUQ19TRUNPTkRTX1JFRwkJMHgwMAorI2RlZmluZSBPTUFQX1JUQ19NSU5VVEVTX1JFRwkJMHgwNAorI2RlZmluZSBPTUFQX1JUQ19IT1VSU19SRUcJCTB4MDgKKyNkZWZpbmUgT01BUF9SVENfREFZU19SRUcJCTB4MEMKKyNkZWZpbmUgT01BUF9SVENfTU9OVEhTX1JFRwkJMHgxMAorI2RlZmluZSBPTUFQX1JUQ19ZRUFSU19SRUcJCTB4MTQKKyNkZWZpbmUgT01BUF9SVENfV0VFS1NfUkVHCQkweDE4CisKKyNkZWZpbmUgT01BUF9SVENfQUxBUk1fU0VDT05EU19SRUcJMHgyMAorI2RlZmluZSBPTUFQX1JUQ19BTEFSTV9NSU5VVEVTX1JFRwkweDI0CisjZGVmaW5lIE9NQVBfUlRDX0FMQVJNX0hPVVJTX1JFRwkweDI4CisjZGVmaW5lIE9NQVBfUlRDX0FMQVJNX0RBWVNfUkVHCQkweDJjCisjZGVmaW5lIE9NQVBfUlRDX0FMQVJNX01PTlRIU19SRUcJMHgzMAorI2RlZmluZSBPTUFQX1JUQ19BTEFSTV9ZRUFSU19SRUcJMHgzNAorCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfUkVHCQkweDQwCisjZGVmaW5lIE9NQVBfUlRDX1NUQVRVU19SRUcJCTB4NDQKKyNkZWZpbmUgT01BUF9SVENfSU5URVJSVVBUU19SRUcJCTB4NDgKKworI2RlZmluZSBPTUFQX1JUQ19DT01QX0xTQl9SRUcJCTB4NGMKKyNkZWZpbmUgT01BUF9SVENfQ09NUF9NU0JfUkVHCQkweDUwCisjZGVmaW5lIE9NQVBfUlRDX09TQ19SRUcJCTB4NTQKKworLyogT01BUF9SVENfQ1RSTF9SRUcgYml0IGZpZWxkczogKi8KKyNkZWZpbmUgT01BUF9SVENfQ1RSTF9TUExJVAkJKDE8PDcpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfRElTQUJMRQkJKDE8PDYpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfU0VUXzMyX0NPVU5URVIJKDE8PDUpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfVEVTVAkJKDE8PDQpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfTU9ERV8xMl8yNAkoMTw8MykKKyNkZWZpbmUgT01BUF9SVENfQ1RSTF9BVVRPX0NPTVAJCSgxPDwyKQorI2RlZmluZSBPTUFQX1JUQ19DVFJMX1JPVU5EXzMwUwkJKDE8PDEpCisjZGVmaW5lIE9NQVBfUlRDX0NUUkxfU1RPUAkJKDE8PDApCisKKy8qIE9NQVBfUlRDX1NUQVRVU19SRUcgYml0IGZpZWxkczogKi8KKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTX1BPV0VSX1VQICAgICAgICAoMTw8NykKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTX0FMQVJNICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTXzFEX0VWRU5UICAgICAgICAoMTw8NSkKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTXzFIX0VWRU5UICAgICAgICAoMTw8NCkKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTXzFNX0VWRU5UICAgICAgICAoMTw8MykKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTXzFTX0VWRU5UICAgICAgICAoMTw8MikKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTX1JVTiAgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgT01BUF9SVENfU1RBVFVTX0JVU1kgICAgICAgICAgICAoMTw8MCkKKworLyogT01BUF9SVENfSU5URVJSVVBUU19SRUcgYml0IGZpZWxkczogKi8KKyNkZWZpbmUgT01BUF9SVENfSU5URVJSVVBUU19JVF9BTEFSTSAgICAoMTw8MykKKyNkZWZpbmUgT01BUF9SVENfSU5URVJSVVBUU19JVF9USU1FUiAgICAoMTw8MikKKworCisjZGVmaW5lIHJ0Y19yZWFkKGFkZHIpCQlvbWFwX3JlYWRiKE9NQVBfUlRDX0JBU0UgKyAoYWRkcikpCisjZGVmaW5lIHJ0Y193cml0ZSh2YWwsIGFkZHIpCW9tYXBfd3JpdGViKHZhbCwgT01BUF9SVENfQkFTRSArIChhZGRyKSkKKworCisvKiBwbGF0Zm9ybV9idXMgaXNuJ3QgaG90cGx1Z2dhYmxlLCBzbyBmb3Igc3RhdGljIGxpbmthZ2UgaXQnZCBiZSBzYWZlCisgKiB0byBnZXQgcmlkIG9mIHByb2JlKCkgYW5kIHJlbW92ZSgpIGNvZGUgLi4uIHRvbyBiYWQgdGhlIGRyaXZlciBzdHJ1Y3QKKyAqIHJlbWVtYmVycyBwcm9iZSgpLCB0aGF0J3MgYWJvdXQgMjUlIG9mIHRoZSBydW50aW1lIGZvb3RwcmludCEhCisgKi8KKyNpZm5kZWYJTU9EVUxFCisjdW5kZWYJX19kZXZleGl0CisjdW5kZWYJX19kZXZleGl0X3AKKyNkZWZpbmUJX19kZXZleGl0CV9fZXhpdAorI2RlZmluZQlfX2RldmV4aXRfcAlfX2V4aXRfcAorI2VuZGlmCisKKworLyogd2UgcmVseSBvbiB0aGUgcnRjIGZyYW1ld29yayB0byBoYW5kbGUgbG9ja2luZyAocnRjLT5vcHNfbG9jayksCisgKiBzbyB0aGUgb25seSBvdGhlciByZXF1aXJlbWVudCBpcyB0aGF0IHJlZ2lzdGVyIGFjY2Vzc2VzIHdoaWNoCisgKiByZXF1aXJlIEJVU1kgdG8gYmUgY2xlYXIgYXJlIG1hZGUgd2l0aCBJUlFzIGxvY2FsbHkgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgcnRjX3dhaXRfbm90X2J1c3kodm9pZCkKK3sKKwlpbnQJY291bnQgPSAwOworCXU4CXN0YXR1czsKKworCS8qIEJVU1kgbWF5IHN0YXkgYWN0aXZlIGZvciAxLzMyNzY4IHNlY29uZCAofjMwIHVzZWMpICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgNTA7IGNvdW50KyspIHsKKwkJc3RhdHVzID0gcnRjX3JlYWQoT01BUF9SVENfU1RBVFVTX1JFRyk7CisJCWlmICgoc3RhdHVzICYgKHU4KU9NQVBfUlRDX1NUQVRVU19CVVNZKSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisJLyogbm93IHdlIGhhdmUgfjE1IHVzZWMgdG8gcmVhZC93cml0ZSB2YXJpb3VzIHJlZ2lzdGVycyAqLworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcnRjX2lycShpbnQgaXJxLCB2b2lkICpjbGFzc19kZXYpCit7CisJdW5zaWduZWQgbG9uZwkJZXZlbnRzID0gMDsKKwl1OAkJCWlycV9kYXRhOworCisJaXJxX2RhdGEgPSBydGNfcmVhZChPTUFQX1JUQ19TVEFUVVNfUkVHKTsKKworCS8qIGFsYXJtIGlycT8gKi8KKwlpZiAoaXJxX2RhdGEgJiBPTUFQX1JUQ19TVEFUVVNfQUxBUk0pIHsKKwkJcnRjX3dyaXRlKE9NQVBfUlRDX1NUQVRVU19BTEFSTSwgT01BUF9SVENfU1RBVFVTX1JFRyk7CisJCWV2ZW50cyB8PSBSVENfSVJRRiB8IFJUQ19BRjsKKwl9CisKKwkvKiAxL3NlYyBwZXJpb2RpYy91cGRhdGUgaXJxPyAqLworCWlmIChpcnFfZGF0YSAmIE9NQVBfUlRDX1NUQVRVU18xU19FVkVOVCkKKwkJZXZlbnRzIHw9IFJUQ19JUlFGIHwgUlRDX1VGOworCisJcnRjX3VwZGF0ZV9pcnEoY2xhc3NfZGV2LCAxLCBldmVudHMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYJQ09ORklHX1JUQ19JTlRGX0RFVgorCitzdGF0aWMgaW50CitvbWFwX3J0Y19pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXU4IHJlZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwljYXNlIFJUQ19BSUVfT046CisJY2FzZSBSVENfVUlFX09GRjoKKwljYXNlIFJUQ19VSUVfT046CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlydGNfd2FpdF9ub3RfYnVzeSgpOworCXJlZyA9IHJ0Y19yZWFkKE9NQVBfUlRDX0lOVEVSUlVQVFNfUkVHKTsKKwlzd2l0Y2ggKGNtZCkgeworCS8qIEFJRSA9IEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KKwljYXNlIFJUQ19BSUVfT0ZGOgorCQlyZWcgJj0gfk9NQVBfUlRDX0lOVEVSUlVQVFNfSVRfQUxBUk07CisJCWJyZWFrOworCWNhc2UgUlRDX0FJRV9PTjoKKwkJcmVnIHw9IE9NQVBfUlRDX0lOVEVSUlVQVFNfSVRfQUxBUk07CisJCWJyZWFrOworCS8qIFVJRSA9IFVwZGF0ZSBJbnRlcnJ1cHQgRW5hYmxlICgxL3NlY29uZCkgKi8KKwljYXNlIFJUQ19VSUVfT0ZGOgorCQlyZWcgJj0gfk9NQVBfUlRDX0lOVEVSUlVQVFNfSVRfVElNRVI7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PTjoKKwkJcmVnIHw9IE9NQVBfUlRDX0lOVEVSUlVQVFNfSVRfVElNRVI7CisJCWJyZWFrOworCX0KKwlydGNfd2FpdF9ub3RfYnVzeSgpOworCXJ0Y193cml0ZShyZWcsIE9NQVBfUlRDX0lOVEVSUlVQVFNfUkVHKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUJb21hcF9ydGNfaW9jdGwJTlVMTAorI2VuZGlmCisKKy8qIHRoaXMgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0ICJkb24ndCBjYXJlIiBhbGFybSBmaWVsZHMgKi8KK3N0YXRpYyBpbnQgdG0yYmNkKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaWYgKHJ0Y192YWxpZF90bSh0bSkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bS0+dG1fc2VjID0gQklOMkJDRCh0bS0+dG1fc2VjKTsKKwl0bS0+dG1fbWluID0gQklOMkJDRCh0bS0+dG1fbWluKTsKKwl0bS0+dG1faG91ciA9IEJJTjJCQ0QodG0tPnRtX2hvdXIpOworCXRtLT50bV9tZGF5ID0gQklOMkJDRCh0bS0+dG1fbWRheSk7CisKKwl0bS0+dG1fbW9uID0gQklOMkJDRCh0bS0+dG1fbW9uICsgMSk7CisKKwkvKiBlcG9jaCA9PSAxOTAwICovCisJaWYgKHRtLT50bV95ZWFyIDwgMTAwIHx8IHRtLT50bV95ZWFyID4gMTk5KQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0bS0+dG1feWVhciA9IEJJTjJCQ0QodG0tPnRtX3llYXIgLSAxMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjZDJ0bShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXRtLT50bV9zZWMgPSBCQ0QyQklOKHRtLT50bV9zZWMpOworCXRtLT50bV9taW4gPSBCQ0QyQklOKHRtLT50bV9taW4pOworCXRtLT50bV9ob3VyID0gQkNEMkJJTih0bS0+dG1faG91cik7CisJdG0tPnRtX21kYXkgPSBCQ0QyQklOKHRtLT50bV9tZGF5KTsKKwl0bS0+dG1fbW9uID0gQkNEMkJJTih0bS0+dG1fbW9uKSAtIDE7CisJLyogZXBvY2ggPT0gMTkwMCAqLworCXRtLT50bV95ZWFyID0gQkNEMkJJTih0bS0+dG1feWVhcikgKyAxMDA7Cit9CisKKworc3RhdGljIGludCBvbWFwX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCS8qIHdlIGRvbid0IHJlcG9ydCB3ZGF5L3lkYXkvaXNkc3QgLi4uICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlydGNfd2FpdF9ub3RfYnVzeSgpOworCisJdG0tPnRtX3NlYyA9IHJ0Y19yZWFkKE9NQVBfUlRDX1NFQ09ORFNfUkVHKTsKKwl0bS0+dG1fbWluID0gcnRjX3JlYWQoT01BUF9SVENfTUlOVVRFU19SRUcpOworCXRtLT50bV9ob3VyID0gcnRjX3JlYWQoT01BUF9SVENfSE9VUlNfUkVHKTsKKwl0bS0+dG1fbWRheSA9IHJ0Y19yZWFkKE9NQVBfUlRDX0RBWVNfUkVHKTsKKwl0bS0+dG1fbW9uID0gcnRjX3JlYWQoT01BUF9SVENfTU9OVEhTX1JFRyk7CisJdG0tPnRtX3llYXIgPSBydGNfcmVhZChPTUFQX1JUQ19ZRUFSU19SRUcpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJYmNkMnRtKHRtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaWYgKHRtMmJjZCh0bSkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJ0Y193YWl0X25vdF9idXN5KCk7CisKKwlydGNfd3JpdGUodG0tPnRtX3llYXIsIE9NQVBfUlRDX1lFQVJTX1JFRyk7CisJcnRjX3dyaXRlKHRtLT50bV9tb24sIE9NQVBfUlRDX01PTlRIU19SRUcpOworCXJ0Y193cml0ZSh0bS0+dG1fbWRheSwgT01BUF9SVENfREFZU19SRUcpOworCXJ0Y193cml0ZSh0bS0+dG1faG91ciwgT01BUF9SVENfSE9VUlNfUkVHKTsKKwlydGNfd3JpdGUodG0tPnRtX21pbiwgT01BUF9SVENfTUlOVVRFU19SRUcpOworCXJ0Y193cml0ZSh0bS0+dG1fc2VjLCBPTUFQX1JUQ19TRUNPTkRTX1JFRyk7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsbSkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJ0Y193YWl0X25vdF9idXN5KCk7CisKKwlhbG0tPnRpbWUudG1fc2VjID0gcnRjX3JlYWQoT01BUF9SVENfQUxBUk1fU0VDT05EU19SRUcpOworCWFsbS0+dGltZS50bV9taW4gPSBydGNfcmVhZChPTUFQX1JUQ19BTEFSTV9NSU5VVEVTX1JFRyk7CisJYWxtLT50aW1lLnRtX2hvdXIgPSBydGNfcmVhZChPTUFQX1JUQ19BTEFSTV9IT1VSU19SRUcpOworCWFsbS0+dGltZS50bV9tZGF5ID0gcnRjX3JlYWQoT01BUF9SVENfQUxBUk1fREFZU19SRUcpOworCWFsbS0+dGltZS50bV9tb24gPSBydGNfcmVhZChPTUFQX1JUQ19BTEFSTV9NT05USFNfUkVHKTsKKwlhbG0tPnRpbWUudG1feWVhciA9IHJ0Y19yZWFkKE9NQVBfUlRDX0FMQVJNX1lFQVJTX1JFRyk7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwliY2QydG0oJmFsbS0+dGltZSk7CisJYWxtLT5lbmFibGVkID0gISEocnRjX3JlYWQoT01BUF9SVENfSU5URVJSVVBUU19SRUcpCisJCQkmIE9NQVBfUlRDX0lOVEVSUlVQVFNfSVRfQUxBUk0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsbSkKK3sKKwl1OCByZWc7CisKKwkvKiBNdWNoIHVzZXJzcGFjZSBjb2RlIHVzZXMgUlRDX0FMTV9TRVQsIHRodXMgImRvbid0IGNhcmUiIGZvcgorCSAqIGRheS9tb250aC95ZWFyIHNwZWNpZmllcyBhbGFybXMgdXAgdG8gMjQgaG91cnMgaW4gdGhlIGZ1dHVyZS4KKwkgKiBTbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aGF0IC4uLiBidXQgbGV0J3MgaWdub3JlIHRoZSAiZG9uJ3QgY2FyZSIKKwkgKiB2YWx1ZXMgZm9yIGhvdXJzL21pbnV0ZXMvc2Vjb25kcy4KKwkgKi8KKwlpZiAoYWxtLT50aW1lLnRtX21kYXkgPD0gMAorCQkJJiYgYWxtLT50aW1lLnRtX21vbiA8IDAKKwkJCSYmIGFsbS0+dGltZS50bV95ZWFyIDwgMCkgeworCQlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJCXVuc2lnbmVkIGxvbmcgbm93LCB0aGVuOworCisJCW9tYXBfcnRjX3JlYWRfdGltZShkZXYsICZ0bSk7CisJCXJ0Y190bV90b190aW1lKCZ0bSwgJm5vdyk7CisKKwkJYWxtLT50aW1lLnRtX21kYXkgPSB0bS50bV9tZGF5OworCQlhbG0tPnRpbWUudG1fbW9uID0gdG0udG1fbW9uOworCQlhbG0tPnRpbWUudG1feWVhciA9IHRtLnRtX3llYXI7CisJCXJ0Y190bV90b190aW1lKCZhbG0tPnRpbWUsICZ0aGVuKTsKKworCQkvKiBzb21ldGltZXMgdGhlIGFsYXJtIHdyYXBzIGludG8gdG9tb3Jyb3cgKi8KKwkJaWYgKHRoZW4gPCBub3cpIHsKKwkJCXJ0Y190aW1lX3RvX3RtKG5vdyArIDI0ICogNjAgKiA2MCwgJnRtKTsKKwkJCWFsbS0+dGltZS50bV9tZGF5ID0gdG0udG1fbWRheTsKKwkJCWFsbS0+dGltZS50bV9tb24gPSB0bS50bV9tb247CisJCQlhbG0tPnRpbWUudG1feWVhciA9IHRtLnRtX3llYXI7CisJCX0KKwl9CisKKwlpZiAodG0yYmNkKCZhbG0tPnRpbWUpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJ0Y193YWl0X25vdF9idXN5KCk7CisKKwlydGNfd3JpdGUoYWxtLT50aW1lLnRtX3llYXIsIE9NQVBfUlRDX0FMQVJNX1lFQVJTX1JFRyk7CisJcnRjX3dyaXRlKGFsbS0+dGltZS50bV9tb24sIE9NQVBfUlRDX0FMQVJNX01PTlRIU19SRUcpOworCXJ0Y193cml0ZShhbG0tPnRpbWUudG1fbWRheSwgT01BUF9SVENfQUxBUk1fREFZU19SRUcpOworCXJ0Y193cml0ZShhbG0tPnRpbWUudG1faG91ciwgT01BUF9SVENfQUxBUk1fSE9VUlNfUkVHKTsKKwlydGNfd3JpdGUoYWxtLT50aW1lLnRtX21pbiwgT01BUF9SVENfQUxBUk1fTUlOVVRFU19SRUcpOworCXJ0Y193cml0ZShhbG0tPnRpbWUudG1fc2VjLCBPTUFQX1JUQ19BTEFSTV9TRUNPTkRTX1JFRyk7CisKKwlyZWcgPSBydGNfcmVhZChPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisJaWYgKGFsbS0+ZW5hYmxlZCkKKwkJcmVnIHw9IE9NQVBfUlRDX0lOVEVSUlVQVFNfSVRfQUxBUk07CisJZWxzZQorCQlyZWcgJj0gfk9NQVBfUlRDX0lOVEVSUlVQVFNfSVRfQUxBUk07CisJcnRjX3dyaXRlKHJlZywgT01BUF9SVENfSU5URVJSVVBUU19SRUcpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBvbWFwX3J0Y19vcHMgPSB7CisJLmlvY3RsCQk9IG9tYXBfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUJPSBvbWFwX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gb21hcF9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0JPSBvbWFwX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBvbWFwX3J0Y19zZXRfYWxhcm0sCit9OworCitzdGF0aWMgaW50IG9tYXBfcnRjX2FsYXJtOworc3RhdGljIGludCBvbWFwX3J0Y190aW1lcjsKKworc3RhdGljIGludCBfX2RldmluaXQgb21hcF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyZXMsICptZW07CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwl1OAkJCXJlZywgbmV3X2N0cmw7CisKKwlvbWFwX3J0Y190aW1lciA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKG9tYXBfcnRjX3RpbWVyIDw9IDApIHsKKwkJcHJfZGVidWcoIiVzOiBubyB1cGRhdGUgaXJxP1xuIiwgcGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCW9tYXBfcnRjX2FsYXJtID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAob21hcF9ydGNfYWxhcm0gPD0gMCkgeworCQlwcl9kZWJ1ZygiJXM6IG5vIGFsYXJtIGlycT9cbiIsIHBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBOT1RFOiAgdXNpbmcgc3RhdGljIG1hcHBpbmcgZm9yIFJUQyByZWdpc3RlcnMgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgJiYgcmVzLT5zdGFydCAhPSBPTUFQX1JUQ19CQVNFKSB7CisJCXByX2RlYnVnKCIlczogUlRDIHJlZ2lzdGVycyBhdCAlMDh4LCBleHBlY3RlZCAlMDh4XG4iLAorCQkJcGRldi0+bmFtZSwgKHVuc2lnbmVkKSByZXMtPnN0YXJ0LCBPTUFQX1JUQ19CQVNFKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKHJlcykKKwkJbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsCisJCQkJcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSwKKwkJCQlwZGV2LT5uYW1lKTsKKwllbHNlCisJCW1lbSA9IE5VTEw7CisJaWYgKCFtZW0pIHsKKwkJcHJfZGVidWcoIiVzOiBSVEMgcmVnaXN0ZXJzIGF0ICUwOHggYXJlIG5vdCBmcmVlXG4iLAorCQkJcGRldi0+bmFtZSwgT01BUF9SVENfQkFTRSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJJm9tYXBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlwcl9kZWJ1ZygiJXM6IGNhbid0IHJlZ2lzdGVyIFJUQyBkZXZpY2UsIGVyciAlbGRcbiIsCisJCQlwZGV2LT5uYW1lLCBQVFJfRVJSKHJ0YykpOworCQlnb3RvIGZhaWw7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisJY2xhc3Nfc2V0X2RldmRhdGEoJnJ0Yy0+Y2xhc3NfZGV2LCBtZW0pOworCisJLyogY2xlYXIgcGVuZGluZyBpcnFzLCBhbmQgc2V0IDEvc2Vjb25kIHBlcmlvZGljLAorCSAqIHdoaWNoIHdlJ2xsIHVzZSBpbnN0ZWFkIG9mIHVwZGF0ZSBpcnFzCisJICovCisJcnRjX3dyaXRlKDAsIE9NQVBfUlRDX0lOVEVSUlVQVFNfUkVHKTsKKworCS8qIGNsZWFyIG9sZCBzdGF0dXMgKi8KKwlyZWcgPSBydGNfcmVhZChPTUFQX1JUQ19TVEFUVVNfUkVHKTsKKwlpZiAocmVnICYgKHU4KSBPTUFQX1JUQ19TVEFUVVNfUE9XRVJfVVApIHsKKwkJcHJfaW5mbygiJXM6IFJUQyBwb3dlciB1cCByZXNldCBkZXRlY3RlZFxuIiwKKwkJCXBkZXYtPm5hbWUpOworCQlydGNfd3JpdGUoT01BUF9SVENfU1RBVFVTX1BPV0VSX1VQLCBPTUFQX1JUQ19TVEFUVVNfUkVHKTsKKwl9CisJaWYgKHJlZyAmICh1OCkgT01BUF9SVENfU1RBVFVTX0FMQVJNKQorCQlydGNfd3JpdGUoT01BUF9SVENfU1RBVFVTX0FMQVJNLCBPTUFQX1JUQ19TVEFUVVNfUkVHKTsKKworCS8qIGhhbmRsZSBwZXJpb2RpYyBhbmQgYWxhcm0gaXJxcyAqLworCWlmIChyZXF1ZXN0X2lycShvbWFwX3J0Y190aW1lciwgcnRjX2lycSwgU0FfSU5URVJSVVBULAorCQkJcnRjLT5jbGFzc19kZXYuY2xhc3NfaWQsICZydGMtPmNsYXNzX2RldikpIHsKKwkJcHJfZGVidWcoIiVzOiBSVEMgdGltZXIgaW50ZXJydXB0IElSUSVkIGFscmVhZHkgY2xhaW1lZFxuIiwKKwkJCXBkZXYtPm5hbWUsIG9tYXBfcnRjX3RpbWVyKTsKKwkJZ290byBmYWlsMDsKKwl9CisJaWYgKHJlcXVlc3RfaXJxKG9tYXBfcnRjX2FsYXJtLCBydGNfaXJxLCBTQV9JTlRFUlJVUFQsCisJCQlydGMtPmNsYXNzX2Rldi5jbGFzc19pZCwgJnJ0Yy0+Y2xhc3NfZGV2KSkgeworCQlwcl9kZWJ1ZygiJXM6IFJUQyBhbGFybSBpbnRlcnJ1cHQgSVJRJWQgYWxyZWFkeSBjbGFpbWVkXG4iLAorCQkJcGRldi0+bmFtZSwgb21hcF9ydGNfYWxhcm0pOworCQlnb3RvIGZhaWwxOworCX0KKworCS8qIE9uIGJvYXJkcyB3aXRoIHNwbGl0IHBvd2VyLCBSVENfT05fTk9GRiB3b24ndCByZXNldCB0aGUgUlRDICovCisJcmVnID0gcnRjX3JlYWQoT01BUF9SVENfQ1RSTF9SRUcpOworCWlmIChyZWcgJiAodTgpIE9NQVBfUlRDX0NUUkxfU1RPUCkKKwkJcHJfaW5mbygiJXM6IGFscmVhZHkgcnVubmluZ1xuIiwgcGRldi0+bmFtZSk7CisKKwkvKiBmb3JjZSB0byAyNCBob3VyIG1vZGUgKi8KKwluZXdfY3RybCA9IHJlZyAmIH4oT01BUF9SVENfQ1RSTF9TUExJVHxPTUFQX1JUQ19DVFJMX0FVVE9fQ09NUCk7CisJbmV3X2N0cmwgfD0gT01BUF9SVENfQ1RSTF9TVE9QOworCisJLyogQk9BUkQtU1BFQ0lGSUMgQ1VTVE9NSVpBVElPTiBDQU4gR08gSEVSRToKKwkgKgorCSAqICAtIEJvYXJkcyB3aXJlZCBzbyB0aGF0IFJUQ19XQUtFX0lOVCBkb2VzIHNvbWV0aGluZywgYW5kIG11eGVkCisJICogICAgcmlnaHQgKFcxM18xNjEwX1JUQ19XQUtFX0lOVCBpcyB0aGUgZGVmYXVsdCBhZnRlciBjaGlwIHJlc2V0KSwKKwkgKiAgICBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHdha2V1cCBmbGFnIGFwcHJvcHJpYXRlbHkuCisJICoKKwkgKiAgLSBCb2FyZHMgd2lyZWQgc28gUlRDX09OX25PRkYgaXMgdXNlZCBhcyB0aGUgcmVzZXQgc2lnbmFsLAorCSAqICAgIHJhdGhlciB0aGFuIG5QV1JPTl9SRVNFVCwgc2hvdWxkIGZvcmNpYmx5IGVuYWJsZSBzcGxpdAorCSAqICAgIHBvd2VyIG1vZGUuICAoU29tZSBjaGlwIGVycmF0YSByZXBvcnQgdGhhdCBSVENfQ1RSTF9TUExJVAorCSAqICAgIGlzIHdyaXRlLW9ubHksIGFuZCBhbHdheXMgcmVhZHMgYXMgemVyby4uLikKKwkgKi8KKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CisKKwlpZiAobmV3X2N0cmwgJiAodTgpIE9NQVBfUlRDX0NUUkxfU1BMSVQpCisJCXByX2luZm8oIiVzOiBzcGxpdCBwb3dlciBtb2RlXG4iLCBwZGV2LT5uYW1lKTsKKworCWlmIChyZWcgIT0gbmV3X2N0cmwpCisJCXJ0Y193cml0ZShuZXdfY3RybCwgT01BUF9SVENfQ1RSTF9SRUcpOworCisJcmV0dXJuIDA7CisKK2ZhaWwxOgorCWZyZWVfaXJxKG9tYXBfcnRjX3RpbWVyLCBOVUxMKTsKK2ZhaWwwOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworZmFpbDoKKwlyZWxlYXNlX3Jlc291cmNlKG1lbSk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG9tYXBfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlCSpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTs7CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CisKKwkvKiBsZWF2ZSBydGMgcnVubmluZywgYnV0IGRpc2FibGUgaXJxcyAqLworCXJ0Y193cml0ZSgwLCBPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisKKwlmcmVlX2lycShvbWFwX3J0Y190aW1lciwgcnRjKTsKKwlmcmVlX2lycShvbWFwX3J0Y19hbGFybSwgcnRjKTsKKworCXJlbGVhc2VfcmVzb3VyY2UoY2xhc3NfZ2V0X2RldmRhdGEoJnJ0Yy0+Y2xhc3NfZGV2KSk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBydGNfZGVsdGE7CitzdGF0aWMgdTggaXJxc3RhdDsKKworc3RhdGljIGludCBvbWFwX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdGltZS50dl9uc2VjID0gMDsKKwlvbWFwX3J0Y19yZWFkX3RpbWUoTlVMTCwgJnJ0Y190bSk7CisJcnRjX3RtX3RvX3RpbWUoJnJ0Y190bSwgJnRpbWUudHZfc2VjKTsKKworCXNhdmVfdGltZV9kZWx0YSgmcnRjX2RlbHRhLCAmdGltZSk7CisJaXJxc3RhdCA9IHJ0Y19yZWFkKE9NQVBfUlRDX0lOVEVSUlVQVFNfUkVHKTsKKworCS8qIEZJWE1FIHRoZSBSVEMgYWxhcm0gaXMgbm90IGN1cnJlbnRseSBhY3RpbmcgYXMgYSB3YWtldXAgZXZlbnQKKwkgKiBzb3VyY2UsIGFuZCBpbiBmYWN0IHRoaXMgZW5hYmxlKCkgY2FsbCBpcyBqdXN0IHNhdmluZyBhIGZsYWcKKwkgKiB0aGF0J3MgbmV2ZXIgdXNlZC4uLgorCSAqLworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKG9tYXBfcnRjX2FsYXJtKTsKKwllbHNlCisJCXJ0Y193cml0ZSgwLCBPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX3J0Y19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lOworCisJdGltZS50dl9uc2VjID0gMDsKKwlvbWFwX3J0Y19yZWFkX3RpbWUoTlVMTCwgJnJ0Y190bSk7CisJcnRjX3RtX3RvX3RpbWUoJnJ0Y190bSwgJnRpbWUudHZfc2VjKTsKKworCXJlc3RvcmVfdGltZV9kZWx0YSgmcnRjX2RlbHRhLCAmdGltZSk7CisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKG9tYXBfcnRjX2FsYXJtKTsKKwllbHNlCisJCXJ0Y193cml0ZShpcnFzdGF0LCBPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIG9tYXBfcnRjX3N1c3BlbmQgTlVMTAorI2RlZmluZSBvbWFwX3J0Y19yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvbWFwX3J0Y19zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJ0Y193cml0ZSgwLCBPTUFQX1JUQ19JTlRFUlJVUFRTX1JFRyk7Cit9CisKK01PRFVMRV9BTElBUygib21hcF9ydGMiKTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb21hcF9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvbWFwX3J0Y19yZW1vdmUpLAorCS5zdXNwZW5kCT0gb21hcF9ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG9tYXBfcnRjX3Jlc3VtZSwKKwkuc2h1dGRvd24JPSBvbWFwX3J0Y19zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAib21hcF9ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwX3J0Y19kcml2ZXIpOworfQorbW9kdWxlX2luaXQocnRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9ydGNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHJ0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiR2VvcmdlIEcuIERhdmlzIChhbmQgb3RoZXJzKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1wY2Y4NTYzLmMKaW5kZXggYTc2MGNmNi4uNGI3MmI4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXBjZjg1NjMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcGNmODU2My5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAkJeGZlciA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIEFSUkFZX1NJWkUobXNncykpOwogCiAJCWlmICh4ZmVyICE9IEFSUkFZX1NJWkUobXNncykpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+YWRhcHRlci0+ZGV2LAorCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCiAJCQkJIiVzOiBjb3VsZCBub3QgcmVhZCByZWdpc3RlciAweCUwMlhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBwYXR0ZXJuW2ldLnJlZyk7CiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogCiAJCWlmICh2YWx1ZSA+IHBhdHRlcm5baV0ubWF4IHx8CiAJCQl2YWx1ZSA8IHBhdHRlcm5baV0ubWluKSB7Ci0JCQlkZXZfZGJnKCZjbGllbnQtPmFkYXB0ZXItPmRldiwKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAogCQkJCSIlczogcGF0dGVybj0lZCwgcmVnPSV4LCBtYXNrPTB4JTAyeCwgbWluPSVkLCAiCiAJCQkJIm1heD0lZCwgdmFsdWU9JWQsIHJhdz0weCUwMlhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBpLCBwYXR0ZXJuW2ldLnJlZywgcGF0dGVybltpXS5tYXNrLApAQCAtMjUzLDcgKzI1Myw3IEBACiAKIAlpbnQgZXJyID0gMDsKIAotCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcoYWRhcHRlci0+Y2xhc3NfZGV2LmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CiAJCWVyciA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcHJvYy5jIGIvZHJpdmVycy9ydGMvcnRjLXByb2MuYwppbmRleCBkNTFkOGYyLi5jMjcyYWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcHJvYy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1wcm9jLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAkJCXNlcV9wcmludGYoc2VxLCAiJTAyZFxuIiwgYWxybS50aW1lLnRtX21kYXkpOwogCQllbHNlCiAJCQlzZXFfcHJpbnRmKHNlcSwgIioqXG4iKTsKLQkJc2VxX3ByaW50ZihzZXEsICJhbHJtX3dha2V1cFx0OiAlc1xuIiwKKwkJc2VxX3ByaW50ZihzZXEsICJhbGFybV9JUlFcdDogJXNcbiIsCiAJCQkJYWxybS5lbmFibGVkID8gInllcyIgOiAibm8iKTsKIAkJc2VxX3ByaW50ZihzZXEsICJhbHJtX3BlbmRpbmdcdDogJXNcbiIsCiAJCQkJYWxybS5wZW5kaW5nID8gInllcyIgOiAibm8iKTsKQEAgLTEyMCw3ICsxMjAsNyBAQAogCQkJZW50LT5vd25lciA9IHJ0Yy0+b3duZXI7CiAJCQllbnQtPmRhdGEgPSBjbGFzc19kZXY7CiAKLQkJCWRldl9pbmZvKGNsYXNzX2Rldi0+ZGV2LCAicnRjIGludGY6IHByb2NcbiIpOworCQkJZGV2X2RiZyhjbGFzc19kZXYtPmRldiwgInJ0YyBpbnRmOiBwcm9jXG4iKTsKIAkJfQogCQllbHNlCiAJCQlydGNfZGV2ID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCmluZGV4IDJhODY2MzIuLjE0NjBmNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjIiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjMiCiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAvKiAweDMyLCovIEkyQ19DTElFTlRfRU5EIH07CkBAIC0zOSw2ICszOSwxNCBAQAogc3RhdGljIGludCByczVjMzcyX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKIHN0YXRpYyBpbnQgcnM1YzM3Ml9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CiAKK3N0cnVjdCByczVjMzcyIHsKKwl1OCByZWdfYWRkcjsKKwl1OCByZWdzWzE3XTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMV07CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Cit9OworCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcnM1YzM3Ml9kcml2ZXIgPSB7CiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInJzNWMzNzIiLApAQCAtNDksMTggKzU3LDE2IEBACiAKIHN0YXRpYyBpbnQgcnM1YzM3Ml9nZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls3XSA9IHsgUlM1QzM3Ml9SRUdfQkFTRSB9OwogCi0JLyogdGhpcyBpbXBsZW1lbnRzIHRoZSAxc3QgcmVhZGluZyBtZXRob2QsIGFjY29yZGluZwotCSAqIHRvIHRoZSBkYXRhc2hlZXQuIGJ1ZlswXSBpcyBpbml0aWFsaXplZCB3aXRoCi0JICogYWRkcmVzcyBwdHIgYW5kIHRyYW5zbWlzc2lvbiBmb3JtYXQgcmVnaXN0ZXIuCisJc3RydWN0IHJzNWMzNzIgKnJzNWMzNzIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCAqYnVmID0gJihyczVjMzcyLT5yZWdzWzFdKTsKKworCS8qIHRoaXMgaW1wbGVtZW50cyB0aGUgM3JkIHJlYWRpbmcgbWV0aG9kLCBhY2NvcmRpbmcKKwkgKiB0byB0aGUgZGF0YXNoZWV0LiByczVjMzcyIGRlZmF1bHRzIHRvIGludGVybmFsCisJICogYWRkcmVzcyAweEYsIHNvIDB4MCBpcyBpbiByZWdzWzFdCiAJICovCi0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7IGNsaWVudC0+YWRkciwgMCwgMSwgYnVmIH0sCi0JCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9SRCwgNywgYnVmIH0sCi0JfTsKIAotCWlmICgoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikpICE9IDIpIHsKKwlpZiAoKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIHJzNWMzNzItPm1zZywgMSkpICE9IDEpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZCBlcnJvclxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE0LDI1ICsxMjAsMTYgQEAKIAogc3RhdGljIGludCByczVjMzcyX2dldF90cmltKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCAqb3NjLCBpbnQgKnRyaW0pCiB7Ci0JdW5zaWduZWQgY2hhciBidWYgPSBSUzVDMzcyX1JFR19UUklNOwotCi0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7IGNsaWVudC0+YWRkciwgMCwgMSwgJmJ1ZiB9LAotCQl7IGNsaWVudC0+YWRkciwgSTJDX01fUkQsIDEsICZidWYgfSwKLQl9OwotCi0JaWYgKChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSkgIT0gMikgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkIGVycm9yXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiByYXcgdHJpbT0leFxuIiwgX19GVU5DVElPTl9fLCAqdHJpbSk7CisJc3RydWN0IHJzNWMzNzIgKnJzNWMzNzIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCB0bXAgPSByczVjMzcyLT5yZWdzW1JTNUMzNzJfUkVHX1RSSU0gKyAxXTsKIAogCWlmIChvc2MpCi0JCSpvc2MgPSAoYnVmICYgUlM1QzM3Ml9UUklNX1hTTCkgPyAzMjAwMCA6IDMyNzY4OworCQkqb3NjID0gKHRtcCAmIFJTNUMzNzJfVFJJTV9YU0wpID8gMzIwMDAgOiAzMjc2ODsKIAotCWlmICh0cmltKQotCQkqdHJpbSA9IGJ1ZiAmIFJTNUMzNzJfVFJJTV9NQVNLOworCWlmICh0cmltKSB7CisJCSp0cmltID0gdG1wICYgUlM1QzM3Ml9UUklNX01BU0s7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IHJhdyB0cmltPSV4XG4iLCBfX0ZVTkNUSU9OX18sICp0cmltKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMSwxOSArMTk4LDIwIEBACiB7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXN0cnVjdCByczVjMzcyICpyczVjMzcyOwogCi0JZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyhhZGFwdGVyLT5jbGFzc19kZXYuZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KIAotCWlmICghKGNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEocnM1YzM3MiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByczVjMzcyKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdDsKIAl9CisJY2xpZW50ID0gJnJzNWMzNzItPmNsaWVudDsKIAogCS8qIEkyQyBjbGllbnQgKi8KIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwpAQCAtMjIyLDMyICsyMjAsNDcgQEAKIAogCXN0cmxjcHkoY2xpZW50LT5uYW1lLCByczVjMzcyX2RyaXZlci5kcml2ZXIubmFtZSwgSTJDX05BTUVfU0laRSk7CiAKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCByczVjMzcyKTsKKworCXJzNWMzNzItPm1zZ1swXS5hZGRyID0gYWRkcmVzczsKKwlyczVjMzcyLT5tc2dbMF0uZmxhZ3MgPSBJMkNfTV9SRDsKKwlyczVjMzcyLT5tc2dbMF0ubGVuID0gc2l6ZW9mKHJzNWMzNzItPnJlZ3MpOworCXJzNWMzNzItPm1zZ1swXS5idWYgPSByczVjMzcyLT5yZWdzOworCiAJLyogSW5mb3JtIHRoZSBpMmMgbGF5ZXIgKi8KIAlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlnb3RvIGV4aXRfa2ZyZWU7CiAKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJjaGlwIGZvdW5kLCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCi0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihyczVjMzcyX2RyaXZlci5kcml2ZXIubmFtZSwgJmNsaWVudC0+ZGV2LAotCQkJCSZyczVjMzcyX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlyczVjMzcyLT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHJzNWMzNzJfZHJpdmVyLmRyaXZlci5uYW1lLAorCQkJCSZjbGllbnQtPmRldiwgJnJzNWMzNzJfcnRjX29wcywgVEhJU19NT0RVTEUpOwogCi0JaWYgKElTX0VSUihydGMpKSB7Ci0JCWVyciA9IFBUUl9FUlIocnRjKTsKKwlpZiAoSVNfRVJSKHJzNWMzNzItPnJ0YykpIHsKKwkJZXJyID0gUFRSX0VSUihyczVjMzcyLT5ydGMpOwogCQlnb3RvIGV4aXRfZGV0YWNoOwogCX0KIAotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHJ0Yyk7Ci0KLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdHJpbSk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX29zYyk7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RyaW0pOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9kZXZyZWc7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX29zYyk7CisJaWYgKGVycikKKwkJZ290byBleGl0X3RyaW07CiAKIAlyZXR1cm4gMDsKIAorZXhpdF90cmltOgorCWRldmljZV9yZW1vdmVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90cmltKTsKKworZXhpdF9kZXZyZWc6CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJzNWMzNzItPnJ0Yyk7CisKIGV4aXRfZGV0YWNoOgogCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CiAKIGV4aXRfa2ZyZWU6Ci0Ja2ZyZWUoY2xpZW50KTsKKwlrZnJlZShyczVjMzcyKTsKIAogZXhpdDoKIAlyZXR1cm4gZXJyOwpAQCAtMjU2LDE2ICsyNjksMTUgQEAKIHN0YXRpYyBpbnQgcnM1YzM3Ml9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgcnM1YzM3MiAqcnM1YzM3MiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCi0JaWYgKHJ0YykKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJaWYgKHJzNWMzNzItPnJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJzNWMzNzItPnJ0Yyk7CiAKIAlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwogCi0Ja2ZyZWUoY2xpZW50KTsKLQorCWtmcmVlKHJzNWMzNzIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtczNjLmMgYi9kcml2ZXJzL3J0Yy9ydGMtczNjLmMKaW5kZXggZTMwMWRlYS4uZjQwNmEyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXMzYy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYwpAQCAtMTkxLDYgKzE5MSw4IEBACiAKIAlhbG1fZW4gPSByZWFkYihiYXNlICsgUzNDMjQxMF9SVENBTE0pOwogCisJYWxybS0+ZW5hYmxlZCA9IChhbG1fZW4gJiBTM0MyNDEwX1JUQ0FMTV9BTE1FTikgPyAxIDogMDsKKwogCXByX2RlYnVnKCJyZWFkIGFsYXJtICUwMnggJTAyeC4lMDJ4LiUwMnggJTAyeC8lMDJ4LyUwMnhcbiIsCiAJCSBhbG1fZW4sCiAJCSBhbG1fdG0tPnRtX3llYXIsIGFsbV90bS0+dG1fbW9uLCBhbG1fdG0tPnRtX21kYXksCkBAIC0zMzEsMTIgKzMzMyw4IEBACiAKIHN0YXRpYyBpbnQgczNjX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCiB7Ci0JdW5zaWduZWQgaW50IHJ0Y2FsbSA9IHJlYWRiKHMzY19ydGNfYmFzZSArIFMzQzI0MTBfUlRDQUxNKTsKIAl1bnNpZ25lZCBpbnQgdGljbnQgPSByZWFkYihzM2NfcnRjX2Jhc2UgKyBTM0MyNDEwX1RJQ05UKTsKIAotCXNlcV9wcmludGYoc2VxLCAiYWxhcm1fSVJRXHQ6ICVzXG4iLAotCQkgICAocnRjYWxtICYgUzNDMjQxMF9SVENBTE1fQUxNRU4pID8gInllcyIgOiAibm8iICk7Ci0KIAlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKIAkJICAgICAodGljbnQgJiBTM0MyNDEwX1RJQ05UX0VOQUJMRSkgPyAieWVzIiA6ICJubyIgKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jIGIvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jCmluZGV4IGJkNGQ3ZDEuLjljOGVhZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zYTExMDAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMKQEAgLTI4OSw5ICsyODksNyBAQAogCiBzdGF0aWMgaW50IHNhMTEwMF9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQogewotCXNlcV9wcmludGYoc2VxLCAidHJpbS9kaXZpZGVyXHQ6IDB4JTA4bHhcbiIsIFJUVFIpOwotCXNlcV9wcmludGYoc2VxLCAiYWxhcm1fSVJRXHQ6ICVzXG4iLAotCQkJKFJUU1IgJiBSVFNSX0FMRSkgPyAieWVzIiA6ICJubyIgKTsKKwlzZXFfcHJpbnRmKHNlcSwgInRyaW0vZGl2aWRlclx0OiAweCUwOHhcbiIsICh1MzIpIFJUVFIpOwogCXNlcV9wcmludGYoc2VxLCAidXBkYXRlX0lSUVx0OiAlc1xuIiwKIAkJCShSVFNSICYgUlRTUl9IWkUpID8gInllcyIgOiAibm8iKTsKIAlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zaC5jIGIvZHJpdmVycy9ydGMvcnRjLXNoLmMKaW5kZXggMTQzMzAyYS4uNzJiYTFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXNoLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXNoLmMKQEAgLTIsNiArMiw3IEBACiAgKiBTdXBlckggT24tQ2hpcCBSVEMgU3VwcG9ydAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDA2ICBKYW1pZSBMZW5laGFuCiAgKgogICogQmFzZWQgb24gdGhlIG9sZCBhcmNoL3NoL2tlcm5lbC9jcHUvcnRjLmMgYnk6CiAgKgpAQCAtMjEsNyArMjIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBEUlZfTkFNRQkic2gtcnRjIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xLjIiCiAKICNpZmRlZiBDT05GSUdfQ1BVX1NIMwogI2RlZmluZSBydGNfcmVnX3NpemUJCXNpemVvZih1MTYpCkBAIC0zMywyMiArMzcsMjYgQEAKIAogI2RlZmluZSBSVENfUkVHKHIpCSgocikgKiBydGNfcmVnX3NpemUpCiAKLSNkZWZpbmUgUjY0Q05UICAJUlRDX1JFRygwKQotI2RlZmluZSBSU0VDQ05UIAlSVENfUkVHKDEpCi0jZGVmaW5lIFJNSU5DTlQgCVJUQ19SRUcoMikKLSNkZWZpbmUgUkhSQ05UICAJUlRDX1JFRygzKQotI2RlZmluZSBSV0tDTlQgIAlSVENfUkVHKDQpCi0jZGVmaW5lIFJEQVlDTlQgCVJUQ19SRUcoNSkKLSNkZWZpbmUgUk1PTkNOVCAJUlRDX1JFRyg2KQotI2RlZmluZSBSWVJDTlQgIAlSVENfUkVHKDcpCi0jZGVmaW5lIFJTRUNBUiAgCVJUQ19SRUcoOCkKLSNkZWZpbmUgUk1JTkFSICAJUlRDX1JFRyg5KQotI2RlZmluZSBSSFJBUiAgIAlSVENfUkVHKDEwKQotI2RlZmluZSBSV0tBUiAgIAlSVENfUkVHKDExKQotI2RlZmluZSBSREFZQVIgIAlSVENfUkVHKDEyKQotI2RlZmluZSBSTU9OQVIgIAlSVENfUkVHKDEzKQotI2RlZmluZSBSQ1IxICAgIAlSVENfUkVHKDE0KQotI2RlZmluZSBSQ1IyICAgIAlSVENfUkVHKDE1KQorI2RlZmluZSBSNjRDTlQJCVJUQ19SRUcoMCkKKworI2RlZmluZSBSU0VDQ05UCQlSVENfUkVHKDEpCS8qIFJUQyBzZWMgKi8KKyNkZWZpbmUgUk1JTkNOVAkJUlRDX1JFRygyKQkvKiBSVEMgbWluICovCisjZGVmaW5lIFJIUkNOVAkJUlRDX1JFRygzKQkvKiBSVEMgaG91ciAqLworI2RlZmluZSBSV0tDTlQJCVJUQ19SRUcoNCkJLyogUlRDIHdlZWsgKi8KKyNkZWZpbmUgUkRBWUNOVAkJUlRDX1JFRyg1KQkvKiBSVEMgZGF5ICovCisjZGVmaW5lIFJNT05DTlQJCVJUQ19SRUcoNikJLyogUlRDIG1vbnRoICovCisjZGVmaW5lIFJZUkNOVAkJUlRDX1JFRyg3KQkvKiBSVEMgeWVhciAqLworI2RlZmluZSBSU0VDQVIJCVJUQ19SRUcoOCkJLyogQUxBUk0gc2VjICovCisjZGVmaW5lIFJNSU5BUgkJUlRDX1JFRyg5KQkvKiBBTEFSTSBtaW4gKi8KKyNkZWZpbmUgUkhSQVIJCVJUQ19SRUcoMTApCS8qIEFMQVJNIGhvdXIgKi8KKyNkZWZpbmUgUldLQVIJCVJUQ19SRUcoMTEpCS8qIEFMQVJNIHdlZWsgKi8KKyNkZWZpbmUgUkRBWUFSCQlSVENfUkVHKDEyKQkvKiBBTEFSTSBkYXkgKi8KKyNkZWZpbmUgUk1PTkFSCQlSVENfUkVHKDEzKQkvKiBBTEFSTSBtb250aCAqLworI2RlZmluZSBSQ1IxCQlSVENfUkVHKDE0KQkvKiBDb250cm9sICovCisjZGVmaW5lIFJDUjIJCVJUQ19SRUcoMTUpCS8qIENvbnRyb2wgKi8KKworLyogQUxBUk0gQml0cyAtIG9yIHdpdGggQkNEIGVuY29kZWQgdmFsdWUgKi8KKyNkZWZpbmUgQVJfRU5CCQkweDgwCS8qIEVuYWJsZSBmb3IgYWxhcm0gY21wICAgKi8KIAogLyogUkNSMSBCaXRzICovCiAjZGVmaW5lIFJDUjFfQ0YJCTB4ODAJLyogQ2FycnkgRmxhZyAgICAgICAgICAgICAqLwpAQCAtNzEsMjIgKzc5LDI4IEBACiAJdW5zaWduZWQgaW50IGFsYXJtX2lycSwgcGVyaW9kaWNfaXJxLCBjYXJyeV9pcnE7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXY7CiAJc3BpbmxvY2tfdCBsb2NrOworCWludCByZWFybV9haWU7CiB9OwogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2hfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICppZCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gaWQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZfaWQpOwogCXN0cnVjdCBzaF9ydGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXVuc2lnbmVkIGludCB0bXAsIGV2ZW50cyA9IDA7CiAKIAlzcGluX2xvY2soJnJ0Yy0+bG9jayk7CiAKIAl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKwl0bXAgJj0gflJDUjFfQ0Y7CiAKLQlpZiAodG1wICYgUkNSMV9BRikKLQkJZXZlbnRzIHw9IFJUQ19BRiB8IFJUQ19JUlFGOwotCi0JdG1wICY9IH4oUkNSMV9DRiB8IFJDUjFfQUYpOworCWlmIChydGMtPnJlYXJtX2FpZSkgeworCQlpZiAodG1wICYgUkNSMV9BRikKKwkJCXRtcCAmPSB+UkNSMV9BRjsJLyogdHJ5IHRvIGNsZWFyIEFGIGFnYWluICovCisJCWVsc2UgeworCQkJdG1wIHw9IFJDUjFfQUlFOwkvKiBBRiBoYXMgY2xlYXJlZCwgcmVhcm0gSVJRICovCisJCQlydGMtPnJlYXJtX2FpZSA9IDA7CisJCX0KKwl9CiAKIAl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKIApAQCAtOTcsOSArMTExLDQ1IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2hfcnRjX3BlcmlvZGljKGludCBpcnEsIHZvaWQgKmlkKQorc3RhdGljIGlycXJldHVybl90IHNoX3J0Y19hbGFybShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGlkKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldl9pZCk7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW50IHRtcCwgZXZlbnRzID0gMDsKKworCXNwaW5fbG9jaygmcnRjLT5sb2NrKTsKKworCXRtcCA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjEpOworCisJLyoKKwkgKiBJZiBBRiBpcyBzZXQgdGhlbiB0aGUgYWxhcm0gaGFzIHRyaWdnZXJlZC4gSWYgd2UgY2xlYXIgQUYgd2hpbGUKKwkgKiB0aGUgYWxhcm0gdGltZSBzdGlsbCBtYXRjaGVzIHRoZSBSVEMgdGltZSB0aGVuIEFGIHdpbGwKKwkgKiBpbW1lZGlhdGVseSBiZSBzZXQgYWdhaW4sIGFuZCBpZiBBSUUgaXMgZW5hYmxlZCB0aGVuIHRoZSBhbGFybQorCSAqIGludGVycnVwdCB3aWxsIGltbWVkaWF0ZWx5IGJlIHJldHJpZ2dlci4gU28gd2UgY2xlYXIgQUlFIGhlcmUKKwkgKiBhbmQgdXNlIHJ0Yy0+cmVhcm1fYWllIHNvIHRoYXQgdGhlIGNhcnJ5IGludGVycnVwdCB3aWxsIGtlZXAKKwkgKiB0cnlpbmcgdG8gY2xlYXIgQUYgYW5kIG9uY2UgaXQgc3RheXMgY2xlYXJlZCBpdCdsbCByZS1lbmFibGUKKwkgKiBBSUUuCisJICovCisJaWYgKHRtcCAmIFJDUjFfQUYpIHsKKwkJZXZlbnRzIHw9IFJUQ19BRiB8IFJUQ19JUlFGOworCisJCXRtcCAmPSB+KFJDUjFfQUZ8UkNSMV9BSUUpOworCisJCXdyaXRlYih0bXAsIHJ0Yy0+cmVnYmFzZSArIFJDUjEpOworCisJCXJ0Yy0+cmVhcm1fYWllID0gMTsKKworCQlydGNfdXBkYXRlX2lycSgmcnRjLT5ydGNfZGV2LT5jbGFzc19kZXYsIDEsIGV2ZW50cyk7CisJfQorCisJc3Bpbl91bmxvY2soJnJ0Yy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2hfcnRjX3BlcmlvZGljKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldl9pZCk7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlzcGluX2xvY2soJnJ0Yy0+bG9jayk7CiAKQEAgLTEzOSwxMCArMTg5LDExIEBACiAKIAl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKIAotCWlmIChlbmFibGUpCi0JCXRtcCB8PSBSQ1IxX0FJRTsKLQllbHNlCisJaWYgKCFlbmFibGUpIHsKIAkJdG1wICY9IH5SQ1IxX0FJRTsKKwkJcnRjLT5yZWFybV9haWUgPSAwOworCX0gZWxzZSBpZiAocnRjLT5yZWFybV9haWUgPT0gMCkKKwkJdG1wIHw9IFJDUjFfQUlFOwogCiAJd3JpdGViKHRtcCwgcnRjLT5yZWdiYXNlICsgUkNSMSk7CiAKQEAgLTE3Nyw3ICsyMjgsNyBAQAogCQlnb3RvIGVycl9iYWRfY2Fycnk7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEocnRjLT5hbGFybV9pcnEsIHNoX3J0Y19pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJcmV0ID0gcmVxdWVzdF9pcnEocnRjLT5hbGFybV9pcnEsIHNoX3J0Y19hbGFybSwgSVJRRl9ESVNBQkxFRCwKIAkJCSAgInNoLXJ0YyBhbGFybSIsIGRldik7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJZGV2X2VycihkZXYsICJyZXF1ZXN0IGFsYXJtIElSUSBmYWlsZWQgd2l0aCAlZCwgSVJRICVkXG4iLApAQCAtMjAwLDYgKzI1MSw3IEBACiAJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlzaF9ydGNfc2V0cGllKGRldiwgMCk7CisJc2hfcnRjX3NldGFpZShkZXYsIDApOwogCiAJZnJlZV9pcnEocnRjLT5wZXJpb2RpY19pcnEsIGRldik7CiAJZnJlZV9pcnEocnRjLT5jYXJyeV9pcnEsIGRldik7CkBAIC0yNjcsNyArMzE5LDcgQEAKIAkJdG0tPnRtX2hvdXIJPSBCQ0QyQklOKHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJIUkNOVCkpOwogCQl0bS0+dG1fd2RheQk9IEJDRDJCSU4ocmVhZGIocnRjLT5yZWdiYXNlICsgUldLQ05UKSk7CiAJCXRtLT50bV9tZGF5CT0gQkNEMkJJTihyZWFkYihydGMtPnJlZ2Jhc2UgKyBSREFZQ05UKSk7Ci0JCXRtLT50bV9tb24JPSBCQ0QyQklOKHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJNT05DTlQpKTsKKwkJdG0tPnRtX21vbgk9IEJDRDJCSU4ocmVhZGIocnRjLT5yZWdiYXNlICsgUk1PTkNOVCkpIC0gMTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCiAJCXlyICA9IHJlYWR3KHJ0Yy0+cmVnYmFzZSArIFJZUkNOVCk7CkBAIC0yOTUsNyArMzQ3LDcgQEAKIAkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKIAkJX19GVU5DVElPTl9fLAogCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKLQkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisJCXRtLT50bV9tZGF5LCB0bS0+dG1fbW9uICsgMSwgdG0tPnRtX3llYXIsIHRtLT50bV93ZGF5KTsKIAogCWlmIChydGNfdmFsaWRfdG0odG0pIDwgMCkKIAkJZGV2X2VycihkZXYsICJpbnZhbGlkIGRhdGVcbiIpOwpAQCAtMzIyLDcgKzM3NCw3IEBACiAJd3JpdGViKEJJTjJCQ0QodG0tPnRtX2hvdXIpLCBydGMtPnJlZ2Jhc2UgKyBSSFJDTlQpOwogCXdyaXRlYihCSU4yQkNEKHRtLT50bV93ZGF5KSwgcnRjLT5yZWdiYXNlICsgUldLQ05UKTsKIAl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbWRheSksIHJ0Yy0+cmVnYmFzZSArIFJEQVlDTlQpOwotCXdyaXRlYihCSU4yQkNEKHRtLT50bV9tb24pLCAgcnRjLT5yZWdiYXNlICsgUk1PTkNOVCk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21vbiArIDEpLCBydGMtPnJlZ2Jhc2UgKyBSTU9OQ05UKTsKIAogI2lmZGVmIENPTkZJR19DUFVfU0gzCiAJeWVhciA9IHRtLT50bV95ZWFyICUgMTAwOwpAQCAtMzQ0LDEyICszOTYsMTM2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNoX3J0Y19yZWFkX2FsYXJtX3ZhbHVlKHN0cnVjdCBzaF9ydGMgKnJ0YywgaW50IHJlZ19vZmYpCit7CisJdW5zaWduZWQgaW50IGJ5dGU7CisJaW50IHZhbHVlID0gMHhmZjsJLyogcmV0dXJuIDB4ZmYgZm9yIGlnbm9yZWQgdmFsdWVzICovCisKKwlieXRlID0gcmVhZGIocnRjLT5yZWdiYXNlICsgcmVnX29mZik7CisJaWYgKGJ5dGUgJiBBUl9FTkIpIHsKKwkJYnl0ZSAmPSB+QVJfRU5COwkvKiBzdHJpcCB0aGUgZW5hYmxlIGJpdCAqLworCQl2YWx1ZSA9IEJDRDJCSU4oYnl0ZSk7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IHNoX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKndrYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0Y190aW1lKiB0bSA9ICZ3a2Fscm0tPnRpbWU7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCisJdG0tPnRtX3NlYwk9IHNoX3J0Y19yZWFkX2FsYXJtX3ZhbHVlKHJ0YywgUlNFQ0FSKTsKKwl0bS0+dG1fbWluCT0gc2hfcnRjX3JlYWRfYWxhcm1fdmFsdWUocnRjLCBSTUlOQVIpOworCXRtLT50bV9ob3VyCT0gc2hfcnRjX3JlYWRfYWxhcm1fdmFsdWUocnRjLCBSSFJBUik7CisJdG0tPnRtX3dkYXkJPSBzaF9ydGNfcmVhZF9hbGFybV92YWx1ZShydGMsIFJXS0FSKTsKKwl0bS0+dG1fbWRheQk9IHNoX3J0Y19yZWFkX2FsYXJtX3ZhbHVlKHJ0YywgUkRBWUFSKTsKKwl0bS0+dG1fbW9uCT0gc2hfcnRjX3JlYWRfYWxhcm1fdmFsdWUocnRjLCBSTU9OQVIpOworCWlmICh0bS0+dG1fbW9uID4gMCkKKwkJdG0tPnRtX21vbiAtPSAxOyAvKiBSVEMgaXMgMS0xMiwgdG1fbW9uIGlzIDAtMTEgKi8KKwl0bS0+dG1feWVhciAgICAgPSAweGZmZmY7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNoX3J0Y193cml0ZV9hbGFybV92YWx1ZShzdHJ1Y3Qgc2hfcnRjICpydGMsCisJCQkJCSAgICBpbnQgdmFsdWUsIGludCByZWdfb2ZmKQoreworCS8qIDwgMCBmb3IgYSB2YWx1ZSB0aGF0IGlzIGlnbm9yZWQgKi8KKwlpZiAodmFsdWUgPCAwKQorCQl3cml0ZWIoMCwgcnRjLT5yZWdiYXNlICsgcmVnX29mZik7CisJZWxzZQorCQl3cml0ZWIoQklOMkJDRCh2YWx1ZSkgfCBBUl9FTkIsICBydGMtPnJlZ2Jhc2UgKyByZWdfb2ZmKTsKK30KKworc3RhdGljIGludCBzaF9ydGNfY2hlY2tfYWxhcm0oc3RydWN0IHJ0Y190aW1lKiB0bSkKK3sKKwkvKgorCSAqIFRoZSBvcmlnaW5hbCBydGMgc2F5cyBhbnl0aGluZyA+IDB4YzAgaXMgImRvbid0IGNhcmUiIG9yICJtYXRjaAorCSAqIGFsbCIgLSBtb3N0IHVzZXJzIHVzZSAweGZmIGJ1dCBydGMtZGV2IHVzZXMgLTEgZm9yIHRoZSBzYW1lIHRoaW5nLgorCSAqIFRoZSBvcmlnaW5hbCBydGMgZG9lc24ndCBzdXBwb3J0IHllYXJzIC0gc29tZSB0aGluZ3MgdXNlIC0xIGFuZAorCSAqIHNvbWUgMHhmZmZmLiBXZSB1c2UgLTEgdG8gbWFrZSBvdXQgdGVzdHMgZWFzaWVyLgorCSAqLworCWlmICh0bS0+dG1feWVhciA9PSAweGZmZmYpCisJCXRtLT50bV95ZWFyID0gLTE7CisJaWYgKHRtLT50bV9tb24gPj0gMHhmZikKKwkJdG0tPnRtX21vbiA9IC0xOworCWlmICh0bS0+dG1fbWRheSA+PSAweGZmKQorCQl0bS0+dG1fbWRheSA9IC0xOworCWlmICh0bS0+dG1fd2RheSA+PSAweGZmKQorCQl0bS0+dG1fd2RheSA9IC0xOworCWlmICh0bS0+dG1faG91ciA+PSAweGZmKQorCQl0bS0+dG1faG91ciA9IC0xOworCWlmICh0bS0+dG1fbWluID49IDB4ZmYpCisJCXRtLT50bV9taW4gPSAtMTsKKwlpZiAodG0tPnRtX3NlYyA+PSAweGZmKQorCQl0bS0+dG1fc2VjID0gLTE7CisKKwlpZiAodG0tPnRtX3llYXIgPiA5OTk5IHx8CisJCXRtLT50bV9tb24gPj0gMTIgfHwKKwkJdG0tPnRtX21kYXkgPT0gMCB8fCB0bS0+dG1fbWRheSA+PSAzMiB8fAorCQl0bS0+dG1fd2RheSA+PSA3IHx8CisJCXRtLT50bV9ob3VyID49IDI0IHx8CisJCXRtLT50bV9taW4gPj0gNjAgfHwKKwkJdG0tPnRtX3NlYyA+PSA2MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKndrYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW50IHJjcjE7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZ3a2Fscm0tPnRpbWU7CisJaW50IG1vbiwgZXJyOworCisJZXJyID0gc2hfcnRjX2NoZWNrX2FsYXJtKHRtKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCXJldHVybiBlcnI7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCisJLyogZGlzYWJsZSBhbGFybSBpbnRlcnJ1cHQgYW5kIGNsZWFyIGZsYWcgKi8KKwlyY3IxID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUkNSMSk7CisJcmNyMSAmPSB+UkNSMV9BRjsKKwl3cml0ZWIocmNyMSAmIH5SQ1IxX0FJRSwgcnRjLT5yZWdiYXNlICsgUkNSMSk7CisKKwlydGMtPnJlYXJtX2FpZSA9IDA7CisKKwkvKiBzZXQgYWxhcm0gdGltZSAqLworCXNoX3J0Y193cml0ZV9hbGFybV92YWx1ZShydGMsIHRtLT50bV9zZWMsICBSU0VDQVIpOworCXNoX3J0Y193cml0ZV9hbGFybV92YWx1ZShydGMsIHRtLT50bV9taW4sICBSTUlOQVIpOworCXNoX3J0Y193cml0ZV9hbGFybV92YWx1ZShydGMsIHRtLT50bV9ob3VyLCBSSFJBUik7CisJc2hfcnRjX3dyaXRlX2FsYXJtX3ZhbHVlKHJ0YywgdG0tPnRtX3dkYXksIFJXS0FSKTsKKwlzaF9ydGNfd3JpdGVfYWxhcm1fdmFsdWUocnRjLCB0bS0+dG1fbWRheSwgUkRBWUFSKTsKKwltb24gPSB0bS0+dG1fbW9uOworCWlmIChtb24gPj0gMCkKKwkJbW9uICs9IDE7CisJc2hfcnRjX3dyaXRlX2FsYXJtX3ZhbHVlKHJ0YywgbW9uLCBSTU9OQVIpOworCisJLyogUmVzdG9yZSBpbnRlcnJ1cHQgYWN0aXZhdGlvbiBzdGF0dXMgKi8KKwl3cml0ZWIocmNyMSwgcnRjLT5yZWdiYXNlICsgUkNSMSk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHNoX3J0Y19vcHMgPSB7CiAJLm9wZW4JCT0gc2hfcnRjX29wZW4sCiAJLnJlbGVhc2UJPSBzaF9ydGNfcmVsZWFzZSwKIAkuaW9jdGwJCT0gc2hfcnRjX2lvY3RsLAogCS5yZWFkX3RpbWUJPSBzaF9ydGNfcmVhZF90aW1lLAogCS5zZXRfdGltZQk9IHNoX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQk9IHNoX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBzaF9ydGNfc2V0X2FsYXJtLAogCS5wcm9jCQk9IHNoX3J0Y19wcm9jLAogfTsKIApAQCAtNDQyLDcgKzYxOCw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaF9ydGNfcGxhdGZvcm1fZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJzaC1ydGMiLAorCQkubmFtZQk9IERSVl9OQU1FLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZQkJPSBzaF9ydGNfcHJvYmUsCkBAIC00NjMsNSArNjM5LDYgQEAKIG1vZHVsZV9leGl0KHNoX3J0Y19leGl0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggb24tY2hpcCBSVEMgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUigiUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4sIEphbWllIExlbmVoYW4gPGxlbmVoYW5AdHdpYmJsZS5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc3lzZnMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1zeXNmcy5jCmluZGV4IDYyNTYzN2IuLjk0MThhNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zeXNmcy5jCkBAIC04Myw3ICs4Myw3IEBACiB7CiAJaW50IGVycjsKIAotCWRldl9pbmZvKGNsYXNzX2Rldi0+ZGV2LCAicnRjIGludGY6IHN5c2ZzXG4iKTsKKwlkZXZfZGJnKGNsYXNzX2Rldi0+ZGV2LCAicnRjIGludGY6IHN5c2ZzXG4iKTsKIAogCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xhc3NfZGV2LT5rb2JqLCAmcnRjX2F0dHJfZ3JvdXApOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jIGIvZHJpdmVycy9ydGMvcnRjLXRlc3QuYwppbmRleCBiYzRiZDI0Li5mNTBhMWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMKQEAgLTk5LDYgKzk5LDcgQEAKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdF9kZXYpOwogCiAJcmV0dmFsID0gY291bnQ7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlpZiAoc3RybmNtcChidWYsICJ0aWNrIiwgNCkgPT0gMCkKIAkJcnRjX3VwZGF0ZV9pcnEoJnJ0Yy0+Y2xhc3NfZGV2LCAxLCBSVENfUEYgfCBSVENfSVJRRik7CiAJZWxzZSBpZiAoc3RybmNtcChidWYsICJhbGFybSIsIDUpID09IDApCkBAIC0xMDcsNiArMTA4LDcgQEAKIAkJcnRjX3VwZGF0ZV9pcnEoJnJ0Yy0+Y2xhc3NfZGV2LCAxLCBSVENfVUYgfCBSVENfSVJRRik7CiAJZWxzZQogCQlyZXR2YWwgPSAtRUlOVkFMOworCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xMjEsMTEgKzEyMywxOCBAQAogCQllcnIgPSBQVFJfRVJSKHJ0Yyk7CiAJCXJldHVybiBlcnI7CiAJfQotCWRldmljZV9jcmVhdGVfZmlsZSgmcGxhdF9kZXYtPmRldiwgJmRldl9hdHRyX2lycSk7CisKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBsYXRfZGV2LT5kZXYsICZkZXZfYXR0cl9pcnEpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdF9kZXYsIHJ0Yyk7CiAKIAlyZXR1cm4gMDsKKworZXJyOgorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IHRlc3RfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXYzMDIwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYwppbmRleCAwOWI3MTRmLi4zYjU4ZDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYwpAQCAtMTk1LDkgKzE5NSw5IEBACiAJICogYXJlIGFsbCBkaXNhYmxlZCAqLwogCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfU1RBVFVTXzAsIDB4MCk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ2hpcCBhdmFpbGFibGUgYXQgcGh5c2ljYWwgYWRkcmVzcyAweCVwLCIKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ2hpcCBhdmFpbGFibGUgYXQgcGh5c2ljYWwgYWRkcmVzcyAweCVsbHgsIgogCQkiZGF0YSBjb25uZWN0ZWQgdG8gRCVkXG4iLAotCQkodm9pZCopcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCiAJCWNoaXAtPmxlZnRzaGlmdCk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGlwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy14MTIwNS5jIGIvZHJpdmVycy9ydGMvcnRjLXgxMjA1LmMKaW5kZXggNTIyYzY5Ny4uMDE5YWUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXgxMjA1LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXgxMjA1LmMKQEAgLTM3Miw3ICszNzIsNyBAQAogCQl9OwogCiAJCWlmICgoeGZlciA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpKSAhPSAyKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmFkYXB0ZXItPmRldiwKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAogCQkJCSIlczogY291bGQgbm90IHJlYWQgcmVnaXN0ZXIgJXhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBwcm9iZV96ZXJvX3BhdHRlcm5baV0pOwogCkBAIC0zODAsNyArMzgwLDcgQEAKIAkJfQogCiAJCWlmICgoYnVmICYgcHJvYmVfemVyb19wYXR0ZXJuW2krMV0pICE9IDApIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+YWRhcHRlci0+ZGV2LAorCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCiAJCQkJIiVzOiByZWdpc3Rlcj0lMDJ4LCB6ZXJvIHBhdHRlcm49JWQsIHZhbHVlPSV4XG4iLAogCQkJCV9fRlVOQ1RJT05fXywgcHJvYmVfemVyb19wYXR0ZXJuW2ldLCBpLCBidWYpOwogCkBAIC00MDAsNyArNDAwLDcgQEAKIAkJfTsKIAogCQlpZiAoKHhmZXIgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSkgIT0gMikgewotCQkJZGV2X2VycigmY2xpZW50LT5hZGFwdGVyLT5kZXYsCisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCQkiJXM6IGNvdWxkIG5vdCByZWFkIHJlZ2lzdGVyICV4XG4iLAogCQkJCV9fRlVOQ1RJT05fXywgcHJvYmVfbGltaXRzX3BhdHRlcm5baV0ucmVnKTsKIApAQCAtNDExLDcgKzQxMSw3IEBACiAKIAkJaWYgKHZhbHVlID4gcHJvYmVfbGltaXRzX3BhdHRlcm5baV0ubWF4IHx8CiAJCQl2YWx1ZSA8IHByb2JlX2xpbWl0c19wYXR0ZXJuW2ldLm1pbikgewotCQkJZGV2X2RiZygmY2xpZW50LT5hZGFwdGVyLT5kZXYsCisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwKIAkJCQkiJXM6IHJlZ2lzdGVyPSV4LCBsaW0gcGF0dGVybj0lZCwgdmFsdWU9JWRcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBwcm9iZV9saW1pdHNfcGF0dGVybltpXS5yZWcsCiAJCQkJaSwgdmFsdWUpOwpAQCAtNTA2LDcgKzUwNiw3IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwogCi0JZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJZGV2X2RiZyhhZGFwdGVyLT5jbGFzc19kZXYuZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKIAkJZXJyID0gLUVOT0RFVjsKQEAgLTU2MiwxMSArNTYyLDE5IEBACiAJZWxzZQogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNvdWxkbid0IHJlYWQgc3RhdHVzXG4iKTsKIAotCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hdHJpbSk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2R0cmltKTsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXRyaW0pOworCWlmIChlcnIpIGdvdG8gZXhpdF9kZXZyZWc7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2R0cmltKTsKKwlpZiAoZXJyKSBnb3RvIGV4aXRfYXRyaW07CiAKIAlyZXR1cm4gMDsKIAorZXhpdF9hdHJpbToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYXRyaW0pOworCitleGl0X2RldnJlZzoKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwogZXhpdF9kZXRhY2g6CiAJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggZDA2NDdkMS4uNDkyYjY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC01NCw3ICs1NCw3IEBACiBzdGF0aWMgdm9pZCBkYXNkX2ludF9oYW5kbGVyKHN0cnVjdCBjY3dfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpcmIgKik7CiBzdGF0aWMgaW50IGRhc2RfZmx1c2hfY2N3X3F1ZXVlKHN0cnVjdCBkYXNkX2RldmljZSAqLCBpbnQpOwogc3RhdGljIHZvaWQgZGFzZF90YXNrbGV0KHN0cnVjdCBkYXNkX2RldmljZSAqKTsKLXN0YXRpYyB2b2lkIGRvX2tpY2tfZGV2aWNlKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgZG9fa2lja19kZXZpY2Uoc3RydWN0IHdvcmtfc3RydWN0ICopOwogCiAvKgogICogU0VDVElPTjogT3BlcmF0aW9ucyBvbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KQEAgLTEwMCw3ICsxMDAsNyBAQAogCQkgICAgICh1bnNpZ25lZCBsb25nKSBkZXZpY2UpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmNjd19xdWV1ZSk7CiAJaW5pdF90aW1lcigmZGV2aWNlLT50aW1lcik7Ci0JSU5JVF9XT1JLKCZkZXZpY2UtPmtpY2tfd29yaywgZG9fa2lja19kZXZpY2UsIGRldmljZSk7CisJSU5JVF9XT1JLKCZkZXZpY2UtPmtpY2tfd29yaywgZG9fa2lja19kZXZpY2UpOwogCWRldmljZS0+c3RhdGUgPSBEQVNEX1NUQVRFX05FVzsKIAlkZXZpY2UtPnRhcmdldCA9IERBU0RfU1RBVEVfTkVXOwogCkBAIC0yMDMsNiArMjAzLDcgQEAKIAlyYyA9IGRhc2RfZmx1c2hfY2N3X3F1ZXVlKGRldmljZSwgMSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CisJZGFzZF9jbGVhcl90aW1lcihkZXZpY2UpOwogCiAJREJGX0RFVl9FVkVOVChEQkZfRU1FUkcsIGRldmljZSwgIiVwIGRlYnVnIGFyZWEgZGVsZXRlZCIsIGRldmljZSk7CiAJaWYgKGRldmljZS0+ZGVidWdfYXJlYSAhPSBOVUxMKSB7CkBAIC00MDYsMTEgKzQwNyw5IEBACiAgKiBldmVudCBkYWVtb24uCiAgKi8KIHN0YXRpYyB2b2lkCi1kb19raWNrX2RldmljZSh2b2lkICpkYXRhKQorZG9fa2lja19kZXZpY2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOwotCi0JZGV2aWNlID0gKHN0cnVjdCBkYXNkX2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkYXNkX2RldmljZSwga2lja193b3JrKTsKIAlkYXNkX2NoYW5nZV9zdGF0ZShkZXZpY2UpOwogCWRhc2Rfc2NoZWR1bGVfYmgoZGV2aWNlKTsKIAlkYXNkX3B1dF9kZXZpY2UoZGV2aWNlKTsKQEAgLTEwNTEsMTAgKzEwNTAsMTAgQEAKIAkJfQogCX0gZWxzZSB7CQkvKiBlcnJvciAqLwogCQltZW1jcHkoJmNxci0+aXJiLCBpcmIsIHNpemVvZiAoc3RydWN0IGlyYikpOwotI2lmZGVmIEVSUF9ERUJVRwotCQkvKiBkdW1wIHNlbnNlIGRhdGEgKi8KLQkJZGFzZF9sb2dfc2Vuc2UoY3FyLCBpcmIpOwotI2VuZGlmCisJCWlmIChkZXZpY2UtPmZlYXR1cmVzICYgREFTRF9GRUFUVVJFX0VSUExPRykgeworCQkJLyogZHVtcCBzZW5zZSBkYXRhICovCisJCQlkYXNkX2xvZ19zZW5zZShjcXIsIGlyYik7CisJCX0KIAkJc3dpdGNoIChlcmEpIHsKIAkJY2FzZSBkYXNkX2VyYV9mYXRhbDoKIAkJCWNxci0+c3RhdHVzID0gREFTRF9DUVJfRkFJTEVEOwpAQCAtMTI2MywxNSArMTI2MiwyMSBAQAogCWlmIChsaXN0X2VtcHR5KCZkZXZpY2UtPmNjd19xdWV1ZSkpCiAJCXJldHVybjsKIAljcXIgPSBsaXN0X2VudHJ5KGRldmljZS0+Y2N3X3F1ZXVlLm5leHQsIHN0cnVjdCBkYXNkX2Njd19yZXEsIGxpc3QpOwotCWlmIChjcXItPnN0YXR1cyA9PSBEQVNEX0NRUl9JTl9JTyAmJiBjcXItPmV4cGlyZXMgIT0gMCkgewotCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBjcXItPmV4cGlyZXMgKyBjcXItPnN0YXJ0dGltZSkpIHsKKwlpZiAoKGNxci0+c3RhdHVzID09IERBU0RfQ1FSX0lOX0lPICYmIGNxci0+ZXhwaXJlcyAhPSAwKSAmJgorCSAgICAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBjcXItPmV4cGlyZXMgKyBjcXItPnN0YXJ0dGltZSkpKSB7CisJCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPnRlcm1fSU8oY3FyKSAhPSAwKSB7CisJCQkvKiBIbXBmLCB0cnkgYWdhaW4gaW4gNSBzZWMgKi8KKwkJCWRhc2Rfc2V0X3RpbWVyKGRldmljZSwgNSpIWik7CisJCQlERVZfTUVTU0FHRShLRVJOX0VSUiwgZGV2aWNlLAorCQkJCSAgICAiaW50ZXJuYWwgZXJyb3IgLSB0aW1lb3V0ICglaXMpIGV4cGlyZWQgIgorCQkJCSAgICAiZm9yIGNxciAlcCwgdGVybWluYXRpb24gZmFpbGVkLCAiCisJCQkJICAgICJyZXRyeWluZyBpbiA1cyIsCisJCQkJICAgIChjcXItPmV4cGlyZXMvSFopLCBjcXIpOworCQl9IGVsc2UgewogCQkJREVWX01FU1NBR0UoS0VSTl9FUlIsIGRldmljZSwKIAkJCQkgICAgImludGVybmFsIGVycm9yIC0gdGltZW91dCAoJWlzKSBleHBpcmVkICIKIAkJCQkgICAgImZvciBjcXIgJXAgKCVpIHJldHJpZXMgbGVmdCkiLAogCQkJCSAgICAoY3FyLT5leHBpcmVzL0haKSwgY3FyLCBjcXItPnJldHJpZXMpOwotCQkJaWYgKGRldmljZS0+ZGlzY2lwbGluZS0+dGVybV9JTyhjcXIpICE9IDApCi0JCQkJLyogSG1wZiwgdHJ5IGFnYWluIGluIDEvMTAgc2VjICovCi0JCQkJZGFzZF9zZXRfdGltZXIoZGV2aWNlLCAxMCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfMzk5MF9lcnAuYwppbmRleCA2Njk4MDVkLi40ZDAxMDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkXzM5OTBfZXJwLmMKQEAgLTI2NDEsMTQgKzI2NDEsMTIgQEAKIAlzdHJ1Y3QgZGFzZF9jY3dfcmVxICplcnAgPSBOVUxMOwogCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlID0gY3FyLT5kZXZpY2U7CiAJX191MzIgY3BhID0gY3FyLT5pcmIuc2Nzdy5jcGE7CisJc3RydWN0IGRhc2RfY2N3X3JlcSAqdGVtcF9lcnAgPSBOVUxMOwogCi0jaWZkZWYgRVJQX0RFQlVHCi0JLyogcHJpbnQgY3VycmVudCBlcnBfY2hhaW4gKi8KLQlERVZfTUVTU0FHRShLRVJOX0VSUiwgZGV2aWNlLCAiJXMiLAotCQkgICAgIkVSUCBjaGFpbiBhdCBCRUdJTk5JTkcgb2YgRVJQLUFDVElPTiIpOwotCXsKLQkJc3RydWN0IGRhc2RfY2N3X3JlcSAqdGVtcF9lcnAgPSBOVUxMOwotCisJaWYgKGRldmljZS0+ZmVhdHVyZXMgJiBEQVNEX0ZFQVRVUkVfRVJQTE9HKSB7CisJCS8qIHByaW50IGN1cnJlbnQgZXJwX2NoYWluICovCisJCURFVl9NRVNTQUdFKEtFUk5fRVJSLCBkZXZpY2UsICIlcyIsCisJCQkgICAgIkVSUCBjaGFpbiBhdCBCRUdJTk5JTkcgb2YgRVJQLUFDVElPTiIpOwogCQlmb3IgKHRlbXBfZXJwID0gY3FyOwogCQkgICAgIHRlbXBfZXJwICE9IE5VTEw7IHRlbXBfZXJwID0gdGVtcF9lcnAtPnJlZmVycykgewogCkBAIC0yNjU4LDcgKzI2NTYsNiBAQAogCQkJCSAgICB0ZW1wX2VycC0+cmVmZXJzKTsKIAkJfQogCX0KLSNlbmRpZgkJCQkvKiBFUlBfREVCVUcgKi8KIAogCS8qIGRvdWJsZS1jaGVjayBpZiBjdXJyZW50IGVycC9jcXIgd2FzIHN1Y2Nlc3NmdWxsICovCiAJaWYgKChjcXItPmlyYi5zY3N3LmNzdGF0ID09IDB4MDApICYmCkBAIC0yNjk1LDExICsyNjkyLDEwIEBACiAJCWVycCA9IGRhc2RfMzk5MF9lcnBfaGFuZGxlX21hdGNoX2VycChjcXIsIGVycCk7CiAJfQogCi0jaWZkZWYgRVJQX0RFQlVHCi0JLyogcHJpbnQgY3VycmVudCBlcnBfY2hhaW4gKi8KLQlERVZfTUVTU0FHRShLRVJOX0VSUiwgZGV2aWNlLCAiJXMiLCAiRVJQIGNoYWluIGF0IEVORCBvZiBFUlAtQUNUSU9OIik7Ci0JewotCQlzdHJ1Y3QgZGFzZF9jY3dfcmVxICp0ZW1wX2VycCA9IE5VTEw7CisJaWYgKGRldmljZS0+ZmVhdHVyZXMgJiBEQVNEX0ZFQVRVUkVfRVJQTE9HKSB7CisJCS8qIHByaW50IGN1cnJlbnQgZXJwX2NoYWluICovCisJCURFVl9NRVNTQUdFKEtFUk5fRVJSLCBkZXZpY2UsICIlcyIsCisJCQkgICAgIkVSUCBjaGFpbiBhdCBFTkQgb2YgRVJQLUFDVElPTiIpOwogCQlmb3IgKHRlbXBfZXJwID0gZXJwOwogCQkgICAgIHRlbXBfZXJwICE9IE5VTEw7IHRlbXBfZXJwID0gdGVtcF9lcnAtPnJlZmVycykgewogCkBAIC0yNzA5LDcgKzI3MDUsNiBAQAogCQkJCSAgICB0ZW1wX2VycC0+cmVmZXJzKTsKIAkJfQogCX0KLSNlbmRpZgkJCQkvKiBFUlBfREVCVUcgKi8KIAogCWlmIChlcnAtPnN0YXR1cyA9PSBEQVNEX0NRUl9GQUlMRUQpCiAJCWRhc2RfbG9nX2NjdyhlcnAsIDEsIGNwYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCmluZGV4IDkxY2Y5NzEuLjU5NDMyNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlICJkYXNkX2ludC5oIgogCi1rbWVtX2NhY2hlX3QgKmRhc2RfcGFnZV9jYWNoZTsKK3N0cnVjdCBrbWVtX2NhY2hlICpkYXNkX3BhZ2VfY2FjaGU7CiBFWFBPUlRfU1lNQk9MX0dQTChkYXNkX3BhZ2VfY2FjaGUpOwogCiAvKgpAQCAtMjAyLDYgKzIwMiw4IEBACiAJCQlmZWF0dXJlcyB8PSBEQVNEX0ZFQVRVUkVfUkVBRE9OTFk7CiAJCWVsc2UgaWYgKGxlbiA9PSA0ICYmICFzdHJuY21wKHN0ciwgImRpYWciLCA0KSkKIAkJCWZlYXR1cmVzIHw9IERBU0RfRkVBVFVSRV9VU0VESUFHOworCQllbHNlIGlmIChsZW4gPT0gNiAmJiAhc3RybmNtcChzdHIsICJlcnBsb2ciLCA2KSkKKwkJCWZlYXR1cmVzIHw9IERBU0RfRkVBVFVSRV9FUlBMT0c7CiAJCWVsc2UgewogCQkJTUVTU0FHRShLRVJOX1dBUk5JTkcsCiAJCQkJInVuc3VwcG9ydGVkIGZlYXR1cmU6ICUqcywgIgpAQCAtNjg0LDI2ICs2ODYsNzcgQEAKIAkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKLQlpbnQgcm9fZmxhZzsKKwlpbnQgdmFsOworCWNoYXIgKmVuZHA7CiAKIAlkZXZtYXAgPSBkYXNkX2Rldm1hcF9mcm9tX2NkZXYodG9fY2N3ZGV2KGRldikpOwogCWlmIChJU19FUlIoZGV2bWFwKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGV2bWFwKTsKLQlyb19mbGFnID0gYnVmWzBdID09ICcxJzsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOworCWlmICgoKGVuZHAgKyAxKSA8IChidWYgKyBjb3VudCkpIHx8ICh2YWwgPiAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzcGluX2xvY2soJmRhc2RfZGV2bWFwX2xvY2spOwotCWlmIChyb19mbGFnKQorCWlmICh2YWwpCiAJCWRldm1hcC0+ZmVhdHVyZXMgfD0gREFTRF9GRUFUVVJFX1JFQURPTkxZOwogCWVsc2UKIAkJZGV2bWFwLT5mZWF0dXJlcyAmPSB+REFTRF9GRUFUVVJFX1JFQURPTkxZOwogCWlmIChkZXZtYXAtPmRldmljZSkKIAkJZGV2bWFwLT5kZXZpY2UtPmZlYXR1cmVzID0gZGV2bWFwLT5mZWF0dXJlczsKIAlpZiAoZGV2bWFwLT5kZXZpY2UgJiYgZGV2bWFwLT5kZXZpY2UtPmdkcCkKLQkJc2V0X2Rpc2tfcm8oZGV2bWFwLT5kZXZpY2UtPmdkcCwgcm9fZmxhZyk7CisJCXNldF9kaXNrX3JvKGRldm1hcC0+ZGV2aWNlLT5nZHAsIHZhbCk7CiAJc3Bpbl91bmxvY2soJmRhc2RfZGV2bWFwX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKHJlYWRvbmx5LCAwNjQ0LCBkYXNkX3JvX3Nob3csIGRhc2Rfcm9fc3RvcmUpOworLyoKKyAqIGVycGxvZyBjb250cm9scyB0aGUgbG9nZ2luZyBvZiBFUlAgcmVsYXRlZCBkYXRhCisgKiAoZS5nLiBmYWlsaW5nIGNoYW5uZWwgcHJvZ3JhbXMpLgorICovCitzdGF0aWMgc3NpemVfdAorZGFzZF9lcnBsb2dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGRhc2RfZGV2bWFwICpkZXZtYXA7CisJaW50IGVycGxvZzsKKworCWRldm1hcCA9IGRhc2RfZmluZF9idXNpZChkZXYtPmJ1c19pZCk7CisJaWYgKCFJU19FUlIoZGV2bWFwKSkKKwkJZXJwbG9nID0gKGRldm1hcC0+ZmVhdHVyZXMgJiBEQVNEX0ZFQVRVUkVfRVJQTE9HKSAhPSAwOworCWVsc2UKKwkJZXJwbG9nID0gKERBU0RfRkVBVFVSRV9ERUZBVUxUICYgREFTRF9GRUFUVVJFX0VSUExPRykgIT0gMDsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIGVycGxvZyA/ICIxXG4iIDogIjBcbiIpOworfQorCitzdGF0aWMgc3NpemVfdAorZGFzZF9lcnBsb2dfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKKwlpbnQgdmFsOworCWNoYXIgKmVuZHA7CisKKwlkZXZtYXAgPSBkYXNkX2Rldm1hcF9mcm9tX2NkZXYodG9fY2N3ZGV2KGRldikpOworCWlmIChJU19FUlIoZGV2bWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2bWFwKTsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOworCWlmICgoKGVuZHAgKyAxKSA8IChidWYgKyBjb3VudCkpIHx8ICh2YWwgPiAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJmRhc2RfZGV2bWFwX2xvY2spOworCWlmICh2YWwpCisJCWRldm1hcC0+ZmVhdHVyZXMgfD0gREFTRF9GRUFUVVJFX0VSUExPRzsKKwllbHNlCisJCWRldm1hcC0+ZmVhdHVyZXMgJj0gfkRBU0RfRkVBVFVSRV9FUlBMT0c7CisJaWYgKGRldm1hcC0+ZGV2aWNlKQorCQlkZXZtYXAtPmRldmljZS0+ZmVhdHVyZXMgPSBkZXZtYXAtPmZlYXR1cmVzOworCXNwaW5fdW5sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihlcnBsb2csIDA2NDQsIGRhc2RfZXJwbG9nX3Nob3csIGRhc2RfZXJwbG9nX3N0b3JlKTsKIAogLyoKICAqIHVzZV9kaWFnIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRyaXZlciBzaG91bGQgdXNlIGRpYWcgcmF0aGVyIHRoYW4gc3NjaApAQCAtNzI5LDE3ICs3ODIsMjIgQEAKIHsKIAlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKIAlzc2l6ZV90IHJjOwotCWludCB1c2VfZGlhZzsKKwlpbnQgdmFsOworCWNoYXIgKmVuZHA7CiAKIAlkZXZtYXAgPSBkYXNkX2Rldm1hcF9mcm9tX2NkZXYodG9fY2N3ZGV2KGRldikpOwogCWlmIChJU19FUlIoZGV2bWFwKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGV2bWFwKTsKLQl1c2VfZGlhZyA9IGJ1ZlswXSA9PSAnMSc7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKKwlpZiAoKChlbmRwICsgMSkgPCAoYnVmICsgY291bnQpKSB8fCAodmFsID4gMSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Bpbl9sb2NrKCZkYXNkX2Rldm1hcF9sb2NrKTsKIAkvKiBDaGFuZ2luZyBkaWFnIGRpc2NpcGxpbmUgZmxhZyBpcyBvbmx5IGFsbG93ZWQgaW4gb2ZmbGluZSBzdGF0ZS4gKi8KIAlyYyA9IGNvdW50OwogCWlmICghZGV2bWFwLT5kZXZpY2UpIHsKLQkJaWYgKHVzZV9kaWFnKQorCQlpZiAodmFsKQogCQkJZGV2bWFwLT5mZWF0dXJlcyB8PSBEQVNEX0ZFQVRVUkVfVVNFRElBRzsKIAkJZWxzZQogCQkJZGV2bWFwLT5mZWF0dXJlcyAmPSB+REFTRF9GRUFUVVJFX1VTRURJQUc7CkBAIC04NTQsMTQgKzkxMiwyMCBAQAogCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKLQlpbnQgcmM7CisJaW50IHZhbCwgcmM7CisJY2hhciAqZW5kcDsKIAogCWRldm1hcCA9IGRhc2RfZGV2bWFwX2Zyb21fY2Rldih0b19jY3dkZXYoZGV2KSk7CiAJaWYgKElTX0VSUihkZXZtYXApKQogCQlyZXR1cm4gUFRSX0VSUihkZXZtYXApOwogCWlmICghZGV2bWFwLT5kZXZpY2UpCi0JCXJldHVybiBjb3VudDsKLQlpZiAoYnVmWzBdID09ICcxJykgeworCQlyZXR1cm4gLUVOT0RFVjsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOworCWlmICgoKGVuZHAgKyAxKSA8IChidWYgKyBjb3VudCkpIHx8ICh2YWwgPiAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmFsKSB7CiAJCXJjID0gZGFzZF9lZXJfZW5hYmxlKGRldm1hcC0+ZGV2aWNlKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwpAQCAtODgwLDYgKzk0NCw3IEBACiAJJmRldl9hdHRyX3VpZC5hdHRyLAogCSZkZXZfYXR0cl91c2VfZGlhZy5hdHRyLAogCSZkZXZfYXR0cl9lZXJfZW5hYmxlZC5hdHRyLAorCSZkZXZfYXR0cl9lcnBsb2cuYXR0ciwKIAlOVUxMLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCmluZGV4IDVlY2VhM2UuLmZkYWE0NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKQEAgLTEyMTUsNyArMTIxNSw3IEBACiAJCWRzdCA9IHBhZ2VfYWRkcmVzcyhidi0+YnZfcGFnZSkgKyBidi0+YnZfb2Zmc2V0OwogCQlpZiAoZGFzZF9wYWdlX2NhY2hlKSB7CiAJCQljaGFyICpjb3B5ID0ga21lbV9jYWNoZV9hbGxvYyhkYXNkX3BhZ2VfY2FjaGUsCi0JCQkJCQkgICAgICBTTEFCX0RNQSB8IF9fR0ZQX05PV0FSTik7CisJCQkJCQkgICAgICBHRlBfRE1BIHwgX19HRlBfTk9XQVJOKTsKIAkJCWlmIChjb3B5ICYmIHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpCiAJCQkJbWVtY3B5KGNvcHkgKyBidi0+YnZfb2Zmc2V0LCBkc3QsIGJ2LT5idl9sZW4pOwogCQkJaWYgKGNvcHkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCmluZGV4IDgwOTI2YzUuLmI4NTdmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIAkJZHN0ID0gcGFnZV9hZGRyZXNzKGJ2LT5idl9wYWdlKSArIGJ2LT5idl9vZmZzZXQ7CiAJCWlmIChkYXNkX3BhZ2VfY2FjaGUpIHsKIAkJCWNoYXIgKmNvcHkgPSBrbWVtX2NhY2hlX2FsbG9jKGRhc2RfcGFnZV9jYWNoZSwKLQkJCQkJCSAgICAgIFNMQUJfRE1BIHwgX19HRlBfTk9XQVJOKTsKKwkJCQkJCSAgICAgIEdGUF9ETUEgfCBfX0dGUF9OT1dBUk4pOwogCQkJaWYgKGNvcHkgJiYgcnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkKIAkJCQltZW1jcHkoY29weSArIGJ2LT5idl9vZmZzZXQsIGRzdCwgYnYtPmJ2X2xlbik7CiAJCQlpZiAoY29weSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggOWY1MjAwNC4uZmI3MjVlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTEzLDEwICsxMyw2IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLS8qIGVycCBkZWJ1Z2dpbmcgaW4gZGFzZC5jIGFuZCBkYXNkXzM5OTBfZXJwLmMgKi8KLSNkZWZpbmUgRVJQX0RFQlVHCi0KLQogLyogd2Uga2VlcCBvbGQgZGV2aWNlIGFsbG9jYXRpb24gc2NoZW1lOyBJT1csIG1pbm9ycyBhcmUgc3RpbGwgaW4gMC4uMjU1ICovCiAjZGVmaW5lIERBU0RfUEVSX01BSk9SICgxVSA8PCAoTUlOT1JCSVRTIC0gREFTRF9QQVJUTl9CSVRTKSkKICNkZWZpbmUgREFTRF9QQVJUTl9NQVNLICgoMSA8PCBEQVNEX1BBUlROX0JJVFMpIC0gMSkKQEAgLTQ3NCw3ICs0NzAsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBkYXNkX3Byb2ZpbGVfbGV2ZWw7CiBleHRlcm4gc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGRhc2RfZGV2aWNlX29wZXJhdGlvbnM7CiAKLWV4dGVybiBrbWVtX2NhY2hlX3QgKmRhc2RfcGFnZV9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZGFzZF9wYWdlX2NhY2hlOwogCiBzdHJ1Y3QgZGFzZF9jY3dfcmVxICoKIGRhc2Rfa21hbGxvY19yZXF1ZXN0KGNoYXIgKiwgaW50LCBpbnQsIHN0cnVjdCBkYXNkX2RldmljZSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2lvY3RsLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pb2N0bC5jCmluZGV4IDhmZWQzNjAuLjc1OGNmYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW9jdGwuYwpAQCAtNDMwLDcgKzQzMCw3IEBACiAJaW50IHJ2YWw7CiAKIAlsb2NrX2tlcm5lbCgpOwotCXJ2YWwgPSBkYXNkX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJcnZhbCA9IGRhc2RfaW9jdGwoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlscCwgY21kLCBhcmcpOwogCXVubG9ja19rZXJuZWwoKTsKIAogCXJldHVybiAocnZhbCA9PSAtRUlOVkFMKSA/IC1FTk9JT0NUTENNRCA6IHJ2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKaW5kZXggZDdkZTE3NWQuLjI1YjVkN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKQEAgLTI5OSwxNCArMjk5LDE0IEBACiAJc3RydWN0IHJhdzMyMTVfaW5mbyAqcmF3ID0gKHN0cnVjdCByYXczMjE1X2luZm8gKikgX19kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZShyYXctPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCWlmIChyYXctPmZsYWdzICYgUkFXMzIxNV9USU1FUl9SVU5TKSB7CiAJCWRlbF90aW1lcigmcmF3LT50aW1lcik7CiAJCXJhdy0+ZmxhZ3MgJj0gflJBVzMyMTVfVElNRVJfUlVOUzsKIAkJcmF3MzIxNV9ta193cml0ZV9yZXEocmF3KTsKIAkJcmF3MzIxNV9zdGFydF9pbyhyYXcpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIH0KIAogLyoKQEAgLTM1NSwxMCArMzU1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJhdyA9IChzdHJ1Y3QgcmF3MzIxNV9pbmZvICopIGRhdGE7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAlyYXczMjE1X21rX3dyaXRlX3JlcShyYXcpOwogCXJhdzMyMTVfdHJ5X2lvKHJhdyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyYXctPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJLyogQ2hlY2sgZm9yIHBlbmRpbmcgbWVzc2FnZSBmcm9tIHJhdzMyMTVfaXJxICovCiAJaWYgKHJhdy0+bWVzc2FnZSAhPSBOVUxMKSB7CiAJCXByaW50ayhyYXctPm1lc3NhZ2UsIHJhdy0+bXNnX2RzdGF0LCByYXctPm1zZ19jc3RhdCk7CkBAIC01MTIsOSArNTEyLDkgQEAKIAkJaWYgKFJBVzMyMTVfQlVGRkVSX1NJWkUgLSByYXctPmNvdW50ID49IGxlbmd0aCkKIAkJCWJyZWFrOwogCQkvKiB0aGVyZSBtaWdodCBiZSBhbm90aGVyIGNwdSB3YWl0aW5nIGZvciB0aGUgbG9jayAqLwotCQlzcGluX3VubG9jayhyYXctPmxvY2spOworCQlzcGluX3VubG9jayhnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSk7CiAJCXVkZWxheSgxMDApOwotCQlzcGluX2xvY2socmF3LT5sb2NrKTsKKwkJc3Bpbl9sb2NrKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpKTsKIAl9CiB9CiAKQEAgLTUyOCw3ICs1MjgsNyBAQAogCWludCBjLCBjb3VudDsKIAogCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCQljb3VudCA9IChsZW5ndGggPiBSQVczMjE1X0JVRkZFUl9TSVpFKSA/CiAJCQkJCSAgICAgUkFXMzIxNV9CVUZGRVJfU0laRSA6IGxlbmd0aDsKIAkJbGVuZ3RoIC09IGNvdW50OwpAQCAtNTU1LDcgKzU1NSw3IEBACiAJCQkvKiBzdGFydCBvciBxdWV1ZSByZXF1ZXN0ICovCiAJCQlyYXczMjE1X3RyeV9pbyhyYXcpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmF3LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAl9CiB9CiAKQEAgLTU2OCw3ICs1NjgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGxlbmd0aCwgaTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJaWYgKGNoID09ICdcdCcpIHsKIAkJbGVuZ3RoID0gVEFCX1NUT1BfU0laRSAtIChyYXctPmxpbmVfcG9zJVRBQl9TVE9QX1NJWkUpOwogCQlyYXctPmxpbmVfcG9zICs9IGxlbmd0aDsKQEAgLTU5Miw3ICs1OTIsNyBAQAogCQkvKiBzdGFydCBvciBxdWV1ZSByZXF1ZXN0ICovCiAJCXJhdzMyMTVfdHJ5X2lvKHJhdyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogfQogCiAvKgpAQCAtNjA0LDEzICs2MDQsMTMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAlpZiAocmF3LT5jb3VudCA+IDApIHsKIAkJcmF3LT5mbGFncyB8PSBSQVczMjE1X0ZMVVNISU5HOwogCQlyYXczMjE1X3RyeV9pbyhyYXcpOwogCQlyYXctPmZsYWdzICY9IH5SQVczMjE1X0ZMVVNISU5HOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIH0KIAogLyoKQEAgLTYyNSw5ICs2MjUsOSBAQAogCQlyZXR1cm4gMDsKIAlyYXctPmxpbmVfcG9zID0gMDsKIAlyYXctPmZsYWdzIHw9IFJBVzMyMTVfQUNUSVZFOwotCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJcmF3MzIxNV90cnlfaW8ocmF3KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjQ0LDIxICs2NDQsMjEgQEAKIAlpZiAoIShyYXctPmZsYWdzICYgUkFXMzIxNV9BQ1RJVkUpIHx8IChyYXctPmZsYWdzICYgUkFXMzIxNV9GSVhFRCkpCiAJCXJldHVybjsKIAkvKiBXYWl0IGZvciBvdXRzdGFuZGluZyByZXF1ZXN0cywgdGhlbiBmcmVlIGlycSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJaWYgKChyYXctPmZsYWdzICYgUkFXMzIxNV9XT1JLSU5HKSB8fAogCSAgICByYXctPnF1ZXVlZF93cml0ZSAhPSBOVUxMIHx8CiAJICAgIHJhdy0+cXVldWVkX3JlYWQgIT0gTlVMTCkgewogCQlyYXctPmZsYWdzIHw9IFJBVzMyMTVfQ0xPU0lORzsKIAkJYWRkX3dhaXRfcXVldWUoJnJhdy0+ZW1wdHlfd2FpdCwgJndhaXQpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJCXNjaGVkdWxlKCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcmF3LT5lbXB0eV93YWl0LCAmd2FpdCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCXJhdy0+ZmxhZ3MgJj0gfihSQVczMjE1X0FDVElWRSB8IFJBVzMyMTVfQ0xPU0lORyk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CkBAIC02ODYsMTAgKzY4Niw5IEBACiAJfQogCiAJcmF3LT5jZGV2ID0gY2RldjsKLQlyYXctPmxvY2sgPSBnZXRfY2N3ZGV2X2xvY2soY2Rldik7CiAJcmF3LT5pbmJ1ZiA9IChjaGFyICopIHJhdyArIHNpemVvZihzdHJ1Y3QgcmF3MzIxNV9pbmZvKTsKIAltZW1zZXQocmF3LCAwLCBzaXplb2Yoc3RydWN0IHJhdzMyMTVfaW5mbykpOwotCXJhdy0+YnVmZmVyID0gKGNoYXIgKikga21hbGxvYyhSQVczMjE1X0JVRkZFUl9TSVpFLAorCXJhdy0+YnVmZmVyID0ga21hbGxvYyhSQVczMjE1X0JVRkZFUl9TSVpFLAogCQkJCSAgICAgICBHRlBfS0VSTkVMfEdGUF9ETUEpOwogCWlmIChyYXctPmJ1ZmZlciA9PSBOVUxMKSB7CiAJCXNwaW5fbG9jaygmcmF3MzIxNV9kZXZpY2VfbG9jayk7CkBAIC04MDksOSArODA4LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmF3ID0gcmF3MzIxNVswXTsgIC8qIGNvbnNvbGUgMzIxNSBpcyB0aGUgZmlyc3Qgb25lICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAlyYXczMjE1X21ha2Vfcm9vbShyYXcsIFJBVzMyMTVfQlVGRkVSX1NJWkUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmF3LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCAKQEAgLTg3Myw3ICs4NzIsNiBAQAogCXJhdy0+YnVmZmVyID0gKGNoYXIgKikgYWxsb2NfYm9vdG1lbV9sb3coUkFXMzIxNV9CVUZGRVJfU0laRSk7CiAJcmF3LT5pbmJ1ZiA9IChjaGFyICopIGFsbG9jX2Jvb3RtZW1fbG93KFJBVzMyMTVfSU5CVUZfU0laRSk7CiAJcmF3LT5jZGV2ID0gY2RldjsKLQlyYXctPmxvY2sgPSBnZXRfY2N3ZGV2X2xvY2soY2Rldik7CiAJY2Rldi0+ZGV2LmRyaXZlcl9kYXRhID0gcmF3OwogCWNkZXYtPmhhbmRsZXIgPSByYXczMjE1X2lycTsKIApAQCAtMTA2NiwxMCArMTA2NCwxMCBAQAogCiAJcmF3ID0gKHN0cnVjdCByYXczMjE1X2luZm8gKikgdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocmF3LT5mbGFncyAmIFJBVzMyMTVfVEhST1RUTEVEKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCQlyYXctPmZsYWdzICY9IH5SQVczMjE1X1RIUk9UVExFRDsKIAkJcmF3MzIxNV90cnlfaW8ocmF3KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyYXctPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socmF3LT5jZGV2KSwgZmxhZ3MpOwogCX0KIH0KIApAQCAtMTA5NiwxMCArMTA5NCwxMCBAQAogCiAJcmF3ID0gKHN0cnVjdCByYXczMjE1X2luZm8gKikgdHR5LT5kcml2ZXJfZGF0YTsKIAlpZiAocmF3LT5mbGFncyAmIFJBVzMyMTVfU1RPUFBFRCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZShyYXctPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHJhdy0+Y2RldiksIGZsYWdzKTsKIAkJcmF3LT5mbGFncyAmPSB+UkFXMzIxNV9TVE9QUEVEOwogCQlyYXczMjE1X3RyeV9pbyhyYXcpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJhdy0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9jdHJsY2hhci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY3RybGNoYXIuYwppbmRleCA0OWU5NjI4Li5jNmNiY2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9jdHJsY2hhci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2N0cmxjaGFyLmMKQEAgLTE2LDE0ICsxNiwxNSBAQAogCiAjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCiBzdGF0aWMgaW50IGN0cmxjaGFyX3N5c3JxX2tleTsKK3N0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqc3lzcnFfdHR5OwogCiBzdGF0aWMgdm9pZAotY3RybGNoYXJfaGFuZGxlX3N5c3JxKHZvaWQgKnR0eSkKK2N0cmxjaGFyX2hhbmRsZV9zeXNycShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JaGFuZGxlX3N5c3JxKGN0cmxjaGFyX3N5c3JxX2tleSwgKHN0cnVjdCB0dHlfc3RydWN0ICopIHR0eSk7CisJaGFuZGxlX3N5c3JxKGN0cmxjaGFyX3N5c3JxX2tleSwgc3lzcnFfdHR5KTsKIH0KIAotc3RhdGljIERFQ0xBUkVfV09SSyhjdHJsY2hhcl93b3JrLCBjdHJsY2hhcl9oYW5kbGVfc3lzcnEsIE5VTEwpOworc3RhdGljIERFQ0xBUkVfV09SSyhjdHJsY2hhcl93b3JrLCBjdHJsY2hhcl9oYW5kbGVfc3lzcnEpOwogI2VuZGlmCiAKIApAQCAtNTMsNyArNTQsNyBAQAogCS8qIHJhY3kgKi8KIAlpZiAobGVuID09IDMgJiYgYnVmWzFdID09ICctJykgewogCQljdHJsY2hhcl9zeXNycV9rZXkgPSBidWZbMl07Ci0JCWN0cmxjaGFyX3dvcmsuZGF0YSA9IHR0eTsKKwkJc3lzcnFfdHR5ID0gdHR5OwogCQlzY2hlZHVsZV93b3JrKCZjdHJsY2hhcl93b3JrKTsKIAkJcmV0dXJuIENUUkxDSEFSX1NZU1JROwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2ZzMzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKaW5kZXggNzhmOGJkYS4uMDg5M2QzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvZnMzMjcwLmMKQEAgLTQxOSwxNiArNDE5LDIwIEBACiAJc3RydWN0IGlkYWxfYnVmZmVyICppYjsKIAlpbnQgbWlub3IsIHJjOwogCi0JaWYgKGltYWpvcihmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSkgIT0gSUJNX0ZTMzI3MF9NQUpPUikKKwlpZiAoaW1ham9yKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpICE9IElCTV9GUzMyNzBfTUFKT1IpCiAJCXJldHVybiAtRU5PREVWOwotCW1pbm9yID0gaW1pbm9yKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwltaW5vciA9IGltaW5vcihmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAkvKiBDaGVjayBmb3IgbWlub3IgMCBtdWx0aXBsZXhlci4gKi8KIAlpZiAobWlub3IgPT0gMCkgewotCQlpZiAoIWN1cnJlbnQtPnNpZ25hbC0+dHR5KQorCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCQltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOworCQl0dHkgPSBnZXRfY3VycmVudF90dHkoKTsKKwkJaWYgKCF0dHkgfHwgdHR5LT5kcml2ZXItPm1ham9yICE9IElCTV9UVFkzMjcwX01BSk9SKSB7CisJCQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJaWYgKGN1cnJlbnQtPnNpZ25hbC0+dHR5LT5kcml2ZXItPm1ham9yICE9IElCTV9UVFkzMjcwX01BSk9SKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCW1pbm9yID0gY3VycmVudC0+c2lnbmFsLT50dHktPmluZGV4ICsgUkFXMzI3MF9GSVJTVE1JTk9SOworCQl9CisJCW1pbm9yID0gdHR5LT5pbmRleCArIFJBVzMyNzBfRklSU1RNSU5PUjsKKwkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCX0KIAkvKiBDaGVjayBpZiBzb21lIG90aGVyIHByb2dyYW0gaXMgYWxyZWFkeSB1c2luZyBmdWxsc2NyZWVuIG1vZGUuICovCiAJZnAgPSAoc3RydWN0IGZzMzI3MCAqKSByYXczMjcwX2ZpbmRfdmlldygmZnMzMjcwX2ZuLCBtaW5vcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9zMzkwL2NoYXIva2V5Ym9hcmQuYwppbmRleCBlMzQ5MWE1Li4zZTg2ZmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9rZXlib2FyZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL2tleWJvYXJkLmMKQEAgLTM3Nyw3ICszNzcsNyBAQAogCQlpZiAoIShrZXlfbWFwID0ga2JkLT5rZXlfbWFwc1t0bXAua2JfdGFibGVdKSkgewogCQkJaW50IGo7CiAKLQkJCWtleV9tYXAgPSAodXNob3J0ICopIGttYWxsb2Moc2l6ZW9mKHBsYWluX21hcCksCisJCQlrZXlfbWFwID0ga21hbGxvYyhzaXplb2YocGxhaW5fbWFwKSwKIAkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWtleV9tYXApCiAJCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9tb253cml0ZXIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL21vbndyaXRlci5jCmluZGV4IGFiZDAyZWQuLmI5YjBmYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL21vbndyaXRlci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL21vbndyaXRlci5jCkBAIC03MywxMiArNzMsMTUgQEAKIAlzdHJ1Y3QgbW9uX2J1ZiAqZW50cnksICpuZXh0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCAmbW9ucHJpdi0+bGlzdCwgbGlzdCkKLQkJaWYgKGVudHJ5LT5oZHIuYXBwbGlkID09IG1vbmhkci0+YXBwbGlkICYmCisJCWlmICgoZW50cnktPmhkci5tb25fZnVuY3Rpb24gPT0gbW9uaGRyLT5tb25fZnVuY3Rpb24gfHwKKwkJICAgICBtb25oZHItPm1vbl9mdW5jdGlvbiA9PSBNT05XUklURV9TVE9QX0lOVEVSVkFMKSAmJgorCQkgICAgZW50cnktPmhkci5hcHBsaWQgPT0gbW9uaGRyLT5hcHBsaWQgJiYKIAkJICAgIGVudHJ5LT5oZHIucmVjb3JkX251bSA9PSBtb25oZHItPnJlY29yZF9udW0gJiYKIAkJICAgIGVudHJ5LT5oZHIudmVyc2lvbiA9PSBtb25oZHItPnZlcnNpb24gJiYKIAkJICAgIGVudHJ5LT5oZHIucmVsZWFzZSA9PSBtb25oZHItPnJlbGVhc2UgJiYKIAkJICAgIGVudHJ5LT5oZHIubW9kX2xldmVsID09IG1vbmhkci0+bW9kX2xldmVsKQogCQkJcmV0dXJuIGVudHJ5OworCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTkyLDcgKzk1LDkgQEAKIAkgICAgbW9uaGRyLT5tb25fZnVuY3Rpb24gPiBNT05XUklURV9TVEFSVF9DT05GSUcgfHwKIAkgICAgbW9uaGRyLT5oZHJsZW4gIT0gc2l6ZW9mKHN0cnVjdCBtb253cml0ZV9oZHIpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQltb25idWYgPSBtb253cml0ZV9maW5kX2hkcihtb25wcml2LCBtb25oZHIpOworCW1vbmJ1ZiA9IE5VTEw7CisJaWYgKG1vbmhkci0+bW9uX2Z1bmN0aW9uICE9IE1PTldSSVRFX0dFTl9FVkVOVCkKKwkJbW9uYnVmID0gbW9ud3JpdGVfZmluZF9oZHIobW9ucHJpdiwgbW9uaGRyKTsKIAlpZiAobW9uYnVmKSB7CiAJCWlmIChtb25oZHItPm1vbl9mdW5jdGlvbiA9PSBNT05XUklURV9TVE9QX0lOVEVSVkFMKSB7CiAJCQltb25oZHItPmRhdGFsZW4gPSBtb25idWYtPmhkci5kYXRhbGVuOwpAQCAtMTA0LDcgKzEwOSw3IEBACiAJCQlrZnJlZShtb25idWYpOwogCQkJbW9uYnVmID0gTlVMTDsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChtb25oZHItPm1vbl9mdW5jdGlvbiAhPSBNT05XUklURV9TVE9QX0lOVEVSVkFMKSB7CiAJCWlmIChtb25fYnVmX2NvdW50ID49IG1vbl9tYXhfYnVmcykKIAkJCXJldHVybiAtRU5PU1BDOwogCQltb25idWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9uX2J1ZiksIEdGUF9LRVJORUwpOwpAQCAtMTE4LDcgKzEyMyw4IEBACiAJCX0KIAkJbW9uYnVmLT5oZHIgPSAqbW9uaGRyOwogCQlsaXN0X2FkZF90YWlsKCZtb25idWYtPmxpc3QsICZtb25wcml2LT5saXN0KTsKLQkJbW9uX2J1Zl9jb3VudCsrOworCQlpZiAobW9uaGRyLT5tb25fZnVuY3Rpb24gIT0gTU9OV1JJVEVfR0VOX0VWRU5UKQorCQkJbW9uX2J1Zl9jb3VudCsrOwogCX0KIAltb25wcml2LT5jdXJyZW50X2J1ZiA9IG1vbmJ1ZjsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3BpLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NwaS5jCmluZGV4IDczMmRmYmQuLmY3YzEwZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3BpLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jcGkuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJc3RydWN0IGNwaV9zY2NiICpzY2NiOwogCXN0cnVjdCBjcGlfZXZidWYgKmV2YjsKIAotCXJlcSA9IChzdHJ1Y3Qgc2NscF9yZXEgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjbHBfcmVxKSwgR0ZQX0tFUk5FTCk7CisJcmVxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjbHBfcmVxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlcSA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlzY2NiID0gKHN0cnVjdCBjcGlfc2NjYiAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYwppbmRleCAzMjAwNGFhLi5mZmE5MjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYwpAQCAtMTksNTIgKzE5LDE3IEBACiAKICNpbmNsdWRlICJzY2xwLmgiCiAKLQotI2lmZGVmIENPTkZJR19TTVAKLS8qIFNpZ25hbCBjb21wbGV0aW9uIG9mIHNodXRkb3duIHByb2Nlc3MuIEFsbCBDUFVzIGV4Y2VwdCB0aGUgZmlyc3QgdG8gZW50ZXIKLSAqIHRoaXMgZnVuY3Rpb246IGdvIHRvIHN0b3BwZWQgc3RhdGUuIEZpcnN0IENQVTogd2FpdCB1bnRpbCBhbGwgb3RoZXIKLSAqIENQVXMgYXJlIGluIHN0b3BwZWQgb3IgY2hlY2sgc3RvcCBzdGF0ZS4gQWZ0ZXJ3YXJkcywgbG9hZCBzcGVjaWFsIFBTVwotICogdG8gaW5kaWNhdGUgY29tcGxldGlvbi4gKi8KLXN0YXRpYyB2b2lkCi1kb19sb2FkX3F1aWVzY2VfcHN3KHZvaWQgKiBfX3VudXNlZCkKLXsKLQlzdGF0aWMgYXRvbWljX3QgY3B1aWQgPSBBVE9NSUNfSU5JVCgtMSk7Ci0JcHN3X3QgcXVpZXNjZV9wc3c7Ci0JaW50IGNwdTsKLQotCWlmIChhdG9taWNfY21weGNoZygmY3B1aWQsIC0xLCBzbXBfcHJvY2Vzc29yX2lkKCkpICE9IC0xKQotCQlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lncF9zdG9wKTsKLQkvKiBXYWl0IGZvciBhbGwgb3RoZXIgY3B1cyB0byBlbnRlciBzdG9wcGVkIHN0YXRlICovCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCi0JCQljb250aW51ZTsKLQkJd2hpbGUoIXNtcF9jcHVfbm90X3J1bm5pbmcoY3B1KSkKLQkJCWNwdV9yZWxheCgpOwotCX0KLQkvKiBRdWllc2NlIHRoZSBsYXN0IGNwdSB3aXRoIHRoZSBzcGVjaWFsIHBzdyAqLwotCXF1aWVzY2VfcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX01BU0tfV0FJVDsKLQlxdWllc2NlX3Bzdy5hZGRyID0gMHhmZmY7Ci0JX19sb2FkX3BzdyhxdWllc2NlX3Bzdyk7Ci19Ci0KLS8qIFNodXRkb3duIGhhbmRsZXIuIFBlcmZvcm0gc2h1dGRvd24gZnVuY3Rpb24gb24gYWxsIENQVXMuICovCi1zdGF0aWMgdm9pZAotZG9fbWFjaGluZV9xdWllc2NlKHZvaWQpCi17Ci0Jb25fZWFjaF9jcHUoZG9fbG9hZF9xdWllc2NlX3BzdywgTlVMTCwgMCwgMCk7Ci19Ci0jZWxzZQogLyogU2h1dGRvd24gaGFuZGxlci4gU2lnbmFsIGNvbXBsZXRpb24gb2Ygc2h1dGRvd24gYnkgbG9hZGluZyBzcGVjaWFsIFBTVy4gKi8KIHN0YXRpYyB2b2lkCiBkb19tYWNoaW5lX3F1aWVzY2Uodm9pZCkKIHsKIAlwc3dfdCBxdWllc2NlX3BzdzsKIAorCXNtcF9zZW5kX3N0b3AoKTsKIAlxdWllc2NlX3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19NQVNLX1dBSVQ7CiAJcXVpZXNjZV9wc3cuYWRkciA9IDB4ZmZmOwogCV9fbG9hZF9wc3cocXVpZXNjZV9wc3cpOwogfQotI2VuZGlmCiAKIC8qIEhhbmRsZXIgZm9yIHF1aWVzY2UgZXZlbnQuIFN0YXJ0IHNodXRkb3duIHByb2NlZHVyZS4gKi8KIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3R0eS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF90dHkuYwppbmRleCA2ZjQzZTA0ZC4uMmQxNzNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF90dHkuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3R0eS5jCkBAIC02MCw4ICs2MCw2IEBACiAKIHN0cnVjdCB0dHlfZHJpdmVyICpzY2xwX3R0eV9kcml2ZXI7CiAKLWV4dGVybiBzdHJ1Y3QgdGVybWlvcyAgdHR5X3N0ZF90ZXJtaW9zOwotCiBzdGF0aWMgc3RydWN0IHNjbHBfaW9jdGxzIHNjbHBfaW9jdGxzOwogc3RhdGljIHN0cnVjdCBzY2xwX2lvY3RscyBzY2xwX2lvY3Rsc19pbml0ID0KIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGUuaCBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGUuaAppbmRleCAxZjRjODk5Li5jOWYxYzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlLmgKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZS5oCkBAIC0xNzksNiArMTc5LDcgQEAKIC8qIEJsb2NrIEZyb250ZW5kIERhdGEgKi8KIHN0cnVjdCB0YXBlX2Jsa19kYXRhCiB7CisJc3RydWN0IHRhcGVfZGV2aWNlICoJZGV2aWNlOwogCS8qIEJsb2NrIGRldmljZSByZXF1ZXN0IHF1ZXVlLiAqLwogCXJlcXVlc3RfcXVldWVfdCAqCXJlcXVlc3RfcXVldWU7CiAJc3BpbmxvY2tfdAkJcmVxdWVzdF9xdWV1ZV9sb2NrOwpAQCAtMjQwLDcgKzI0MSw3IEBACiAjZW5kaWYKIAogCS8qIEZ1bmN0aW9uIHRvIHN0YXJ0IG9yIHN0b3AgdGhlIG5leHQgcmVxdWVzdCBsYXRlci4gKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXRhcGVfZG5yOworCXN0cnVjdCBkZWxheWVkX3dvcmsJCXRhcGVfZG5yOwogfTsKIAogLyogRXh0ZXJuYWxzIGZyb20gdGFwZV9jb3JlLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzR4eC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKaW5kZXggN2I5NWRhYi4uZTc2NTg3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKQEAgLTk1LDYgKzk1LDEyIEBACiAJcmV0dXJuIHJjOwogfQogCitzdHJ1Y3QgdGFwZV8zNHh4X3dvcmsgeworCXN0cnVjdCB0YXBlX2RldmljZQkqZGV2aWNlOworCWVudW0gdGFwZV9vcAkJIG9wOworCXN0cnVjdCB3b3JrX3N0cnVjdAkgd29yazsKK307CisKIC8qCiAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGN1cnJlbnRseSB1c2VkIG9ubHkgdG8gc2NoZWR1bGUgYSBtZWRpdW1fc2Vuc2UgZm9yCiAgKiBsYXRlciBleGVjdXRpb24uIFRoaXMgaXMgYmVjYXVzZSB3ZSBnZXQgYW4gaW50ZXJydXB0IHdoZW5ldmVyIGEgbWVkaXVtCkBAIC0xMDMsMTMgKzEwOSwxMCBAQAogICogaW50ZXJydXB0IGhhbmRsZXIuCiAgKi8KIHN0YXRpYyB2b2lkCi10YXBlXzM0eHhfd29ya19oYW5kbGVyKHZvaWQgKmRhdGEpCit0YXBlXzM0eHhfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgdGFwZV9kZXZpY2UJKmRldmljZTsKLQkJZW51bSB0YXBlX29wCQkgb3A7Ci0JCXN0cnVjdCB3b3JrX3N0cnVjdAkgd29yazsKLQl9ICpwID0gZGF0YTsKKwlzdHJ1Y3QgdGFwZV8zNHh4X3dvcmsgKnAgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhcGVfMzR4eF93b3JrLCB3b3JrKTsKIAogCXN3aXRjaChwLT5vcCkgewogCQljYXNlIFRPX01TRU46CkBAIC0xMjYsMTcgKzEyOSwxMyBAQAogc3RhdGljIGludAogdGFwZV8zNHh4X3NjaGVkdWxlX3dvcmsoc3RydWN0IHRhcGVfZGV2aWNlICpkZXZpY2UsIGVudW0gdGFwZV9vcCBvcCkKIHsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgdGFwZV9kZXZpY2UJKmRldmljZTsKLQkJZW51bSB0YXBlX29wCQkgb3A7Ci0JCXN0cnVjdCB3b3JrX3N0cnVjdAkgd29yazsKLQl9ICpwOworCXN0cnVjdCB0YXBlXzM0eHhfd29yayAqcDsKIAogCWlmICgocCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOwotCUlOSVRfV09SSygmcC0+d29yaywgdGFwZV8zNHh4X3dvcmtfaGFuZGxlciwgcCk7CisJSU5JVF9XT1JLKCZwLT53b3JrLCB0YXBlXzM0eHhfd29ya19oYW5kbGVyKTsKIAogCXAtPmRldmljZSA9IHRhcGVfZ2V0X2RldmljZV9yZWZlcmVuY2UoZGV2aWNlKTsKIAlwLT5vcCAgICAgPSBvcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKaW5kZXggOTI4Y2JlZi4uOWRmOTEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKQEAgLTIzNiw5ICsyMzYsMTAgQEAKIH07CiAKIHN0YXRpYyB2b2lkCi10YXBlXzM1OTBfd29ya19oYW5kbGVyKHZvaWQgKmRhdGEpCit0YXBlXzM1OTBfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgd29ya19oYW5kbGVyX2RhdGEgKnAgPSBkYXRhOworCXN0cnVjdCB3b3JrX2hhbmRsZXJfZGF0YSAqcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd29ya19oYW5kbGVyX2RhdGEsIHdvcmspOwogCiAJc3dpdGNoIChwLT5vcCkgewogCWNhc2UgVE9fTVNFTjoKQEAgLTI2Myw3ICsyNjQsNyBAQAogCWlmICgocCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JSU5JVF9XT1JLKCZwLT53b3JrLCB0YXBlXzM1OTBfd29ya19oYW5kbGVyLCBwKTsKKwlJTklUX1dPUksoJnAtPndvcmssIHRhcGVfMzU5MF93b3JrX2hhbmRsZXIpOwogCiAJcC0+ZGV2aWNlID0gdGFwZV9nZXRfZGV2aWNlX3JlZmVyZW5jZShkZXZpY2UpOwogCXAtPm9wID0gb3A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMKaW5kZXggMzIyNWZjZC4uYzhhODliMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9ibG9jay5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfYmxvY2suYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKICNpbmNsdWRlIDxhc20vZGVidWcuaD4KIApAQCAtMTQzLDcgKzE0NCw4IEBACiAgKiBxdWV1ZS4KICAqLwogc3RhdGljIHZvaWQKLXRhcGVibG9ja19yZXF1ZXVlKHZvaWQgKmRhdGEpIHsKK3RhcGVibG9ja19yZXF1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykgeworCXN0cnVjdCB0YXBlX2Jsa19kYXRhICoJYmxrZGF0OwogCXN0cnVjdCB0YXBlX2RldmljZSAqCWRldmljZTsKIAlyZXF1ZXN0X3F1ZXVlX3QgKglxdWV1ZTsKIAlpbnQJCQlucl9xdWV1ZWQ7CkBAIC0xNTEsNyArMTUzLDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICoJbDsKIAlpbnQJCQlyYzsKIAotCWRldmljZSA9IChzdHJ1Y3QgdGFwZV9kZXZpY2UgKikgZGF0YTsKKwlibGtkYXQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhcGVfYmxrX2RhdGEsIHJlcXVldWVfdGFzayk7CisJZGV2aWNlID0gYmxrZGF0LT5kZXZpY2U7CiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybjsKIApAQCAtMjEyLDYgKzIxNSw3IEBACiAJaW50CQkJcmM7CiAKIAlibGtkYXQgPSAmZGV2aWNlLT5ibGtfZGF0YTsKKwlibGtkYXQtPmRldmljZSA9IGRldmljZTsKIAlzcGluX2xvY2tfaW5pdCgmYmxrZGF0LT5yZXF1ZXN0X3F1ZXVlX2xvY2spOwogCWF0b21pY19zZXQoJmJsa2RhdC0+cmVxdWV1ZV9zY2hlZHVsZWQsIDApOwogCkBAIC0yNTUsOCArMjU5LDggQEAKIAogCWFkZF9kaXNrKGRpc2spOwogCi0JSU5JVF9XT1JLKCZibGtkYXQtPnJlcXVldWVfdGFzaywgdGFwZWJsb2NrX3JlcXVldWUsCi0JCXRhcGVfZ2V0X2RldmljZV9yZWZlcmVuY2UoZGV2aWNlKSk7CisJdGFwZV9nZXRfZGV2aWNlX3JlZmVyZW5jZShkZXZpY2UpOworCUlOSVRfV09SSygmYmxrZGF0LT5yZXF1ZXVlX3Rhc2ssIHRhcGVibG9ja19yZXF1ZXVlKTsKIAogCXJldHVybiAwOwogCkBAIC0yNzEsNyArMjc1LDcgQEAKIHRhcGVibG9ja19jbGVhbnVwX2RldmljZShzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZSkKIHsKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCWRldmljZS0+YmxrX2RhdGEucmVxdWV1ZV90YXNrLmRhdGEgPSB0YXBlX3B1dF9kZXZpY2UoZGV2aWNlKTsKKwl0YXBlX3B1dF9kZXZpY2UoZGV2aWNlKTsKIAogCWlmICghZGV2aWNlLT5ibGtfZGF0YS5kaXNrKSB7CiAJCVBSSU5UX0VSUigiKCVzKTogTm8gZ2VuZGlzayB0byBjbGVhbiB1cCFcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NoYXIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2hhci5jCmluZGV4IDk3Zjc1MjMuLjMxMTk4YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2hhci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2hhci5jCkBAIC0yOTgsMTMgKzI5OCwxMyBAQAogCWludCBtaW5vciwgcmM7CiAKIAlEQkZfRVZFTlQoNiwgIlRDSEFSOm9wZW46ICVpOiVpXG4iLAotCQlpbWFqb3IoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLAotCQlpbWlub3IoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpKTsKKwkJaW1ham9yKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLAorCQlpbWlub3IoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpOwogCi0JaWYgKGltYWpvcihmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSkgIT0gdGFwZWNoYXJfbWFqb3IpCisJaWYgKGltYWpvcihmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSAhPSB0YXBlY2hhcl9tYWpvcikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQltaW5vciA9IGltaW5vcihmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJbWlub3IgPSBpbWlub3IoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJZGV2aWNlID0gdGFwZV9nZXRfZGV2aWNlKG1pbm9yIC8gVEFQRV9NSU5PUlNfUEVSX0RFVik7CiAJaWYgKElTX0VSUihkZXZpY2UpKSB7CiAJCURCRl9FVkVOVCgzLCAiVENIQVI6b3BlbjogdGFwZV9nZXRfZGV2aWNlKCkgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jb3JlLmMKaW5kZXggMjgyNmFlZC4uYzZjMmU5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jb3JlLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jb3JlLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNkZWZpbmUgUFJJTlRLX0hFQURFUiAiVEFQRV9DT1JFOiAiCiAKIHN0YXRpYyB2b2lkIF9fdGFwZV9kb19pcnEgKHN0cnVjdCBjY3dfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpcmIgKik7Ci1zdGF0aWMgdm9pZCB0YXBlX2RlbGF5ZWRfbmV4dF9yZXF1ZXN0KHZvaWQgKiBkYXRhKTsKK3N0YXRpYyB2b2lkIHRhcGVfZGVsYXllZF9uZXh0X3JlcXVlc3Qoc3RydWN0IHdvcmtfc3RydWN0ICopOwogCiAvKgogICogT25lIGxpc3QgdG8gY29udGFpbiBhbGwgdGFwZSBkZXZpY2VzIG9mIGFsbCBkaXNjaXBsaW5lcywgc28KQEAgLTI3Miw3ICsyNzIsNyBAQAogCQkJCXJldHVybiAwOwogCQkJY2FzZSAtRUJVU1k6CiAJCQkJcmVxdWVzdC0+c3RhdHVzCT0gVEFQRV9SRVFVRVNUX0NBTkNFTDsKLQkJCQlzY2hlZHVsZV93b3JrKCZkZXZpY2UtPnRhcGVfZG5yKTsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldmljZS0+dGFwZV9kbnIsIDApOwogCQkJCXJldHVybiAwOwogCQkJY2FzZSAtRU5PREVWOgogCQkJCURCRl9FWENFUFRJT04oMiwgImRldmljZSBnb25lLCByZXRyeVxuIik7CkBAIC00NzAsNyArNDcwLDcgQEAKIAkqZGV2aWNlLT5tb2Rlc2V0X2J5dGUgPSAwOwogCWRldmljZS0+Zmlyc3RfbWlub3IgPSAtMTsKIAlhdG9taWNfc2V0KCZkZXZpY2UtPnJlZl9jb3VudCwgMSk7Ci0JSU5JVF9XT1JLKCZkZXZpY2UtPnRhcGVfZG5yLCB0YXBlX2RlbGF5ZWRfbmV4dF9yZXF1ZXN0LCBkZXZpY2UpOworCUlOSVRfREVMQVlFRF9XT1JLKCZkZXZpY2UtPnRhcGVfZG5yLCB0YXBlX2RlbGF5ZWRfbmV4dF9yZXF1ZXN0KTsKIAogCXJldHVybiBkZXZpY2U7CiB9CkBAIC03MjQsNyArNzI0LDcgQEAKIAl9IGVsc2UgaWYgKHJjID09IC1FQlVTWSkgewogCQkvKiBUaGUgY29tbW9uIEkvTyBzdWJzeXN0ZW0gaXMgY3VycmVudGx5IGJ1c3kuIFJldHJ5IGxhdGVyLiAqLwogCQlyZXF1ZXN0LT5zdGF0dXMgPSBUQVBFX1JFUVVFU1RfUVVFVUVEOwotCQlzY2hlZHVsZV93b3JrKCZkZXZpY2UtPnRhcGVfZG5yKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXZpY2UtPnRhcGVfZG5yLCAwKTsKIAkJcmMgPSAwOwogCX0gZWxzZSB7CiAJCS8qIFN0YXJ0IGZhaWxlZC4gUmVtb3ZlIHJlcXVlc3QgYW5kIGluZGljYXRlIGZhaWx1cmUuICovCkBAIC03OTAsMTEgKzc5MCwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotdGFwZV9kZWxheWVkX25leHRfcmVxdWVzdCh2b2lkICpkYXRhKQordGFwZV9kZWxheWVkX25leHRfcmVxdWVzdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHRhcGVfZGV2aWNlICoJZGV2aWNlOworCXN0cnVjdCB0YXBlX2RldmljZSAqZGV2aWNlID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0YXBlX2RldmljZSwgdGFwZV9kbnIud29yayk7CiAKLQlkZXZpY2UgPSAoc3RydWN0IHRhcGVfZGV2aWNlICopIGRhdGE7CiAJREJGX0xIKDYsICJ0YXBlX2RlbGF5ZWRfbmV4dF9yZXF1ZXN0KCVwKVxuIiwgZGV2aWNlKTsKIAlzcGluX2xvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhkZXZpY2UtPmNkZXYpKTsKIAlfX3RhcGVfc3RhcnRfbmV4dF9yZXF1ZXN0KGRldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90dHkzMjcwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90dHkzMjcwLmMKaW5kZXggNDcxN2MzNi4uMDk4NDQ2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdHR5MzI3MC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3R0eTMyNzAuYwpAQCAtMTY1OSw3ICsxNjU5LDcgQEAKICAqIENoZWNrIGZvciB2aXNpYmxlL2ludmlzaWJsZSBpbnB1dCBzd2l0Y2hlcwogICovCiBzdGF0aWMgdm9pZAotdHR5MzI3MF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQordHR5MzI3MF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAlzdHJ1Y3QgdHR5MzI3MCAqdHA7CiAJaW50IG5ldzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKaW5kZXggMmQ3OGYwZi4uY2JhYjhkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCXBhZ2UgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlzcGluX2xvY2tfaXJxKCZzY2gtPmxvY2spOworCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKIAlyZXQgPSBjaHNjX2dldF9zY2hfZGVzY19pcnEoc2NoLCBwYWdlKTsKIAlpZiAocmV0KSB7CiAJCXN0YXRpYyBpbnQgY2lvX2Noc2NfZXJyX21zZzsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQkJY2lvX2Noc2NfZXJyX21zZyA9IDE7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzY2gtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKIAlpZiAoIXJldCkgewogCQlpbnQgaiwgY2hwaWQsIG1hc2s7CkBAIC0yMzMsNyArMjMzLDcgQEAKIAlpZiAoaiA+PSA4KQogCQlyZXR1cm4gMDsKIAotCXNwaW5fbG9ja19pcnEoJnNjaC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwogCiAJc3RzY2goc2NoLT5zY2hpZCwgJnNjaGliKTsKIAlpZiAoIXNjaGliLnBtY3cuZG52KQpAQCAtMjUxLDYgKzI1MSw4IEBACiAJCWNjID0gY2lvX2NsZWFyKHNjaCk7CiAJCWlmIChjYyA9PSAtRU5PREVWKQogCQkJZ290byBvdXRfdW5yZWc7CisJCS8qIFJlcXVlc3QgcmV0cnkgb2YgaW50ZXJuYWwgb3BlcmF0aW9uLiAqLworCQlkZXZpY2Vfc2V0X2ludHJldHJ5KHNjaCk7CiAJCS8qIENhbGwgaGFuZGxlci4gKi8KIAkJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbikKIAkJCXNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbigmc2NoLT5kZXYpOwpAQCAtMjYzLDEwICsyNjUsMTAgQEAKIAllbHNlIGlmIChzY2gtPmxwbSA9PSBtYXNrKQogCQlnb3RvIG91dF91bnJlZzsKIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzY2gtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCXJldHVybiAwOwogb3V0X3VucmVnOgotCXNwaW5fdW5sb2NrX2lycSgmc2NoLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKIAlzY2gtPmxwbSA9IDA7CiAJaWYgKGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzY2gtPnNjaGlkKSkgewogCQljc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3QoKTsKQEAgLTM3NiwxMiArMzc4LDEyIEBACiAJCS8qIENoZWNrIGlmIGEgc3ViY2hhbm5lbCBpcyBuZXdseSBhdmFpbGFibGUuICovCiAJCXJldHVybiBzMzkwX3Byb2Nlc3NfcmVzX2FjY19uZXdfc2NoKHNjaGlkKTsKIAotCXNwaW5fbG9ja19pcnEoJnNjaC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwogCiAJY2hwX21hc2sgPSBzMzkwX3Byb2Nlc3NfcmVzX2FjY19zY2gocmVzX2RhdGEsIHNjaCk7CiAKIAlpZiAoY2hwX21hc2sgPT0gMCkgewotCQlzcGluX3VubG9ja19pcnEoJnNjaC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCQlwdXRfZGV2aWNlKCZzY2gtPmRldik7CiAJCXJldHVybiAwOwogCX0KQEAgLTM5NSw3ICszOTcsNyBAQAogCWVsc2UgaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT52ZXJpZnkpCiAJCXNjaC0+ZHJpdmVyLT52ZXJpZnkoJnNjaC0+ZGV2KTsKIAotCXNwaW5fdW5sb2NrX2lycSgmc2NoLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKIAlwdXRfZGV2aWNlKCZzY2gtPmRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC02MzMsMjEgKzYzNSwyMSBAQAogCWlmICghc2NoKQogCQkvKiBDaGVjayBpZiB0aGUgc3ViY2hhbm5lbCBpcyBub3cgYXZhaWxhYmxlLiAqLwogCQlyZXR1cm4gX19jaHBfYWRkX25ld19zY2goc2NoaWQpOwotCXNwaW5fbG9ja19pcnEoJnNjaC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwogCWZvciAoaT0wOyBpPDg7IGkrKykgewogCQltYXNrID0gMHg4MCA+PiBpOwogCQlpZiAoKHNjaC0+c2NoaWIucG1jdy5waW0gJiBtYXNrKSAmJgogCQkgICAgKHNjaC0+c2NoaWIucG1jdy5jaHBpZFtpXSA9PSBjaHAtPmlkKSkgewogCQkJaWYgKHN0c2NoKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKSAhPSAwKSB7CiAJCQkJLyogRW5kZ2FtZS4gKi8KLQkJCQlzcGluX3VubG9ja19pcnEoJnNjaC0+bG9jayk7CisJCQkJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CiAJCQkJcmV0dXJuIC1FTlhJTzsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CiAJfQogCWlmIChpPT04KSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmc2NoLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CiAJCXJldHVybiAwOwogCX0KIAlzY2gtPmxwbSA9ICgoc2NoLT5zY2hpYi5wbWN3LnBpbSAmCkBAIC02NTgsNyArNjYwLDcgQEAKIAlpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnZlcmlmeSkKIAkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOwogCi0Jc3Bpbl91bmxvY2tfaXJxKCZzY2gtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTcxMSw5ICs3MTMsNiBAQAogewogCWludCBjYzsKIAotCWlmICghZGV2aWNlX2lzX29ubGluZShzY2gpKQotCQkvKiBjaW8gY291bGQgYmUgZG9pbmcgSS9PLiAqLwotCQlyZXR1cm4gMDsKIAljYyA9IHN0c2NoKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKTsKIAlpZiAoY2MpCiAJCXJldHVybiAwOwpAQCAtNzIyLDYgKzcyMSwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB0ZXJtaW5hdGVfaW50ZXJuYWxfaW8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3sKKwlpZiAoY2lvX2NsZWFyKHNjaCkpIHsKKwkJLyogUmVjaGVjayBkZXZpY2UgaW4gY2FzZSBjbGVhciBmYWlsZWQuICovCisJCXNjaC0+bHBtID0gMDsKKwkJaWYgKGRldmljZV90cmlnZ2VyX3ZlcmlmeShzY2gpICE9IDApIHsKKwkJCWlmKGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzY2gtPnNjaGlkKSkgeworCQkJCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOworCQkJCW5lZWRfcmVzY2FuID0gMTsKKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfQorCS8qIFJlcXVlc3QgcmV0cnkgb2YgaW50ZXJuYWwgb3BlcmF0aW9uLiAqLworCWRldmljZV9zZXRfaW50cmV0cnkoc2NoKTsKKwkvKiBDYWxsIGhhbmRsZXIuICovCisJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbikKKwkJc2NoLT5kcml2ZXItPnRlcm1pbmF0aW9uKCZzY2gtPmRldik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19zMzkwX3N1YmNoYW5uZWxfdmFyeV9jaHBpZChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLCBfX3U4IGNocGlkLCBpbnQgb24pCiB7CkBAIC03MzEsNyArNzUwLDcgQEAKIAlpZiAoIXNjaC0+c3NkX2luZm8udmFsaWQpCiAJCXJldHVybjsKIAkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NoLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoc2NoLT5sb2NrLCBmbGFncyk7CiAJb2xkX2xwbSA9IHNjaC0+bHBtOwogCWZvciAoY2hwID0gMDsgY2hwIDwgODsgY2hwKyspIHsKIAkJaWYgKHNjaC0+c3NkX2luZm8uY2hwaWRbY2hwXSAhPSBjaHBpZCkKQEAgLTc0NCwyMyArNzYzLDI5IEBACiAJCQkJZGV2aWNlX3RyaWdnZXJfcmVwcm9iZShzY2gpOwogCQkJZWxzZSBpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnZlcmlmeSkKIAkJCQlzY2gtPmRyaXZlci0+dmVyaWZ5KCZzY2gtPmRldik7Ci0JCX0gZWxzZSB7Ci0JCQlzY2gtPm9wbSAmPSB+KDB4ODAgPj4gY2hwKTsKLQkJCXNjaC0+bHBtICY9IH4oMHg4MCA+PiBjaHApOwotCQkJaWYgKGNoZWNrX2Zvcl9pb19vbl9wYXRoKHNjaCwgY2hwKSkKKwkJCWJyZWFrOworCQl9CisJCXNjaC0+b3BtICY9IH4oMHg4MCA+PiBjaHApOworCQlzY2gtPmxwbSAmPSB+KDB4ODAgPj4gY2hwKTsKKwkJaWYgKGNoZWNrX2Zvcl9pb19vbl9wYXRoKHNjaCwgY2hwKSkgeworCQkJaWYgKGRldmljZV9pc19vbmxpbmUoc2NoKSkKIAkJCQkvKiBQYXRoIHZlcmlmaWNhdGlvbiBpcyBkb25lIGFmdGVyIGtpbGxpbmcuICovCiAJCQkJZGV2aWNlX2tpbGxfaW8oc2NoKTsKLQkJCWVsc2UgaWYgKCFzY2gtPmxwbSkgeworCQkJZWxzZQorCQkJCS8qIEtpbGwgYW5kIHJldHJ5IGludGVybmFsIEkvTy4gKi8KKwkJCQl0ZXJtaW5hdGVfaW50ZXJuYWxfaW8oc2NoKTsKKwkJfSBlbHNlIGlmICghc2NoLT5scG0pIHsKKwkJCWlmIChkZXZpY2VfdHJpZ2dlcl92ZXJpZnkoc2NoKSAhPSAwKSB7CiAJCQkJaWYgKGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzY2gtPnNjaGlkKSkgewogCQkJCQljc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3QoKTsKIAkJCQkJbmVlZF9yZXNjYW4gPSAxOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnZlcmlmeSkKLQkJCQlzY2gtPmRyaXZlci0+dmVyaWZ5KCZzY2gtPmRldik7Ci0JCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dmVyaWZ5KQorCQkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOwogCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NoLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY2gtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludApAQCAtMTQ2NSw0MSArMTQ5MCw2IEBACiAJcmV0dXJuIGRlc2M7CiB9CiAKLXN0YXRpYyBpbnQgcmVzZXRfY2hhbm5lbF9wYXRoKHN0cnVjdCBjaGFubmVsX3BhdGggKmNocCkKLXsKLQlpbnQgY2M7Ci0KLQljYyA9IHJjaHAoY2hwLT5pZCk7Ci0Jc3dpdGNoIChjYykgewotCWNhc2UgMDoKLQkJcmV0dXJuIDA7Ci0JY2FzZSAyOgotCQlyZXR1cm4gLUVCVVNZOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcmVzZXRfY2hhbm5lbF9wYXRoc19jc3Moc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICpjc3MpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IF9fTUFYX0NIUElEOyBpKyspIHsKLQkJaWYgKGNzcy0+Y2hwc1tpXSkKLQkJCXJlc2V0X2NoYW5uZWxfcGF0aChjc3MtPmNocHNbaV0pOwotCX0KLX0KLQotdm9pZCBjaW9fcmVzZXRfY2hhbm5lbF9wYXRocyh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8PSBfX01BWF9DU1NJRDsgaSsrKSB7Ci0JCWlmIChjc3NbaV0gJiYgY3NzW2ldLT52YWxpZCkKLQkJCXJlc2V0X2NoYW5uZWxfcGF0aHNfY3NzKGNzc1tpXSk7Ci0JfQotfQotCiBzdGF0aWMgaW50IF9faW5pdAogY2hzY19hbGxvY19zZWlfYXJlYSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKaW5kZXggODkzNmU0Ni4uNzgzNWE3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9yZXNldC5oPgogI2luY2x1ZGUgImFpcnEuaCIKICNpbmNsdWRlICJjaW8uaCIKICNpbmNsdWRlICJjc3MuaCIKQEAgLTI4LDYgKzI5LDcgQEAKICNpbmNsdWRlICJpb2FzbS5oIgogI2luY2x1ZGUgImJsYWNrbGlzdC5oIgogI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgorI2luY2x1ZGUgIi4uL3MzOTBtYWNoLmgiCiAKIGRlYnVnX2luZm9fdCAqY2lvX2RlYnVnX21zZ19pZDsKIGRlYnVnX2luZm9fdCAqY2lvX2RlYnVnX3RyYWNlX2lkOwpAQCAtMTQxLDExICsxNDMsMTEgQEAKIAkJcmV0dXJuIDE7CiAJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWlycV9lbnRlciAoKTsKLQlzcGluX2xvY2soJnNjaC0+bG9jayk7CisJc3Bpbl9sb2NrKHNjaC0+bG9jayk7CiAJbWVtY3B5ICgmc2NoLT5zY2hpYi5zY3N3LCAmaXJiLT5zY3N3LCBzaXplb2YgKHN0cnVjdCBzY3N3KSk7CiAJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT5pcnEpCiAJCXNjaC0+ZHJpdmVyLT5pcnEoJnNjaC0+ZGV2KTsKLQlzcGluX3VubG9jaygmc2NoLT5sb2NrKTsKKwlzcGluX3VubG9jayhzY2gtPmxvY2spOwogCWlycV9leGl0ICgpOwogCV9sb2NhbF9iaF9lbmFibGUoKTsKIAlyZXR1cm4gMTsKQEAgLTQxMyw2ICs0MTUsOCBAQAogCUNJT19UUkFDRV9FVkVOVCAoMiwgImVuc2NoIik7CiAJQ0lPX1RSQUNFX0VWRU5UICgyLCBzY2gtPmRldi5idXNfaWQpOwogCisJaWYgKHNjaF9pc19wc2V1ZG9fc2NoKHNjaCkpCisJCXJldHVybiAtRUlOVkFMOwogCWNjb2RlID0gc3RzY2ggKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKTsKIAlpZiAoY2NvZGUpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNDYwLDYgKzQ2NCw4IEBACiAJQ0lPX1RSQUNFX0VWRU5UICgyLCAiZGlzc2NoIik7CiAJQ0lPX1RSQUNFX0VWRU5UICgyLCBzY2gtPmRldi5idXNfaWQpOwogCisJaWYgKHNjaF9pc19wc2V1ZG9fc2NoKHNjaCkpCisJCXJldHVybiAwOwogCWNjb2RlID0gc3RzY2ggKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKTsKIAlpZiAoY2NvZGUgPT0gMykJCS8qIE5vdCBvcGVyYXRpb25hbC4gKi8KIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC00OTQsNiArNTAwLDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IGNpb19jcmVhdGVfc2NoX2xvY2soc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3sKKwlzY2gtPmxvY2sgPSBrbWFsbG9jKHNpemVvZihzcGlubG9ja190KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzY2gtPmxvY2spCisJCXJldHVybiAtRU5PTUVNOworCXNwaW5fbG9ja19pbml0KHNjaC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBjaW9fdmFsaWRhdGVfc3ViY2hhbm5lbCgpCiAgKgpAQCAtNTExLDYgKzUyNiw3IEBACiB7CiAJY2hhciBkYmZfdHh0WzE1XTsKIAlpbnQgY2NvZGU7CisJaW50IGVycjsKIAogCXNwcmludGYgKGRiZl90eHQsICJ2YWxzY2gleCIsIHNjaGlkLnNjaF9ubyk7CiAJQ0lPX1RSQUNFX0VWRU5UICg0LCBkYmZfdHh0KTsKQEAgLTUxOCw5ICs1MzQsMTUgQEAKIAkvKiBOdWtlIGFsbCBmaWVsZHMuICovCiAJbWVtc2V0KHNjaCwgMCwgc2l6ZW9mKHN0cnVjdCBzdWJjaGFubmVsKSk7CiAKLQlzcGluX2xvY2tfaW5pdCgmc2NoLT5sb2NrKTsKKwlzY2gtPnNjaGlkID0gc2NoaWQ7CisJaWYgKGNpb19pc19jb25zb2xlKHNjaGlkKSkgeworCQlzY2gtPmxvY2sgPSBjaW9fZ2V0X2NvbnNvbGVfbG9jaygpOworCX0gZWxzZSB7CisJCWVyciA9IGNpb19jcmVhdGVfc2NoX2xvY2soc2NoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KIAltdXRleF9pbml0KCZzY2gtPnJlZ19tdXRleCk7Ci0KIAkvKiBTZXQgYSBuYW1lIGZvciB0aGUgc3ViY2hhbm5lbCAqLwogCXNucHJpbnRmIChzY2gtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiMC4leC4lMDR4Iiwgc2NoaWQuc3NpZCwKIAkJICBzY2hpZC5zY2hfbm8pOwpAQCAtNTMyLDEwICs1NTQsMTAgQEAKIAkgKiAgaXMgbm90IHZhbGlkLgogCSAqLwogCWNjb2RlID0gc3RzY2hfZXJyIChzY2hpZCwgJnNjaC0+c2NoaWIpOwotCWlmIChjY29kZSkKLQkJcmV0dXJuIChjY29kZSA9PSAzKSA/IC1FTlhJTyA6IGNjb2RlOwotCi0Jc2NoLT5zY2hpZCA9IHNjaGlkOworCWlmIChjY29kZSkgeworCQllcnIgPSAoY2NvZGUgPT0gMykgPyAtRU5YSU8gOiBjY29kZTsKKwkJZ290byBvdXQ7CisJfQogCS8qIENvcHkgc3ViY2hhbm5lbCB0eXBlIGZyb20gcGF0aCBtYW5hZ2VtZW50IGNvbnRyb2wgd29yZC4gKi8KIAlzY2gtPnN0ID0gc2NoLT5zY2hpYi5wbWN3LnN0OwogCkBAIC01NDgsMTQgKzU3MCwxNiBAQAogCQkJICAibm9uLUkvTyBzdWJjaGFubmVsIHR5cGUgJTA0WFxuIiwKIAkJCSAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubywgc2NoLT5zdCk7CiAJCS8qIFdlIHN0b3AgaGVyZSBmb3Igbm9uLWlvIHN1YmNoYW5uZWxzLiAqLwotCQlyZXR1cm4gc2NoLT5zdDsKKwkJZXJyID0gc2NoLT5zdDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogSW5pdGlhbGl6YXRpb24gZm9yIGlvIHN1YmNoYW5uZWxzLiAqLwotCWlmICghc2NoLT5zY2hpYi5wbWN3LmRudikKKwlpZiAoIXNjaC0+c2NoaWIucG1jdy5kbnYpIHsKIAkJLyogaW8gc3ViY2hhbm5lbCBidXQgZGV2aWNlIG51bWJlciBpcyBpbnZhbGlkLiAqLwotCQlyZXR1cm4gLUVOT0RFVjsKLQorCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CiAJLyogRGV2bm8gaXMgdmFsaWQuICovCiAJaWYgKGlzX2JsYWNrbGlzdGVkIChzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWIucG1jdy5kZXYpKSB7CiAJCS8qCkBAIC01NjUsNyArNTg5LDggQEAKIAkJQ0lPX01TR19FVkVOVCgwLCAiQmxhY2tsaXN0ZWQgZGV2aWNlIGRldGVjdGVkICIKIAkJCSAgICAgICJhdCBkZXZubyAlMDRYLCBzdWJjaGFubmVsIHNldCAleFxuIiwKIAkJCSAgICAgIHNjaC0+c2NoaWIucG1jdy5kZXYsIHNjaC0+c2NoaWQuc3NpZCk7Ci0JCXJldHVybiAtRU5PREVWOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKIAl9CiAJc2NoLT5vcG0gPSAweGZmOwogCWlmICghY2lvX2lzX2NvbnNvbGUoc2NoLT5zY2hpZCkpCkBAIC01OTMsNiArNjE4LDExIEBACiAJaWYgKChzY2gtPmxwbSAmIChzY2gtPmxwbSAtIDEpKSAhPSAwKQogCQlzY2gtPnNjaGliLnBtY3cubXAgPSAxOwkvKiBtdWx0aXBhdGggbW9kZSAqLwogCXJldHVybiAwOworb3V0OgorCWlmICghY2lvX2lzX2NvbnNvbGUoc2NoaWQpKQorCQlrZnJlZShzY2gtPmxvY2spOworCXNjaC0+bG9jayA9IE5VTEw7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTYzNSw3ICs2NjUsNyBAQAogCQl9CiAJCXNjaCA9IChzdHJ1Y3Qgc3ViY2hhbm5lbCAqKSh1bnNpZ25lZCBsb25nKXRwaV9pbmZvLT5pbnRwYXJtOwogCQlpZiAoc2NoKQotCQkJc3Bpbl9sb2NrKCZzY2gtPmxvY2spOworCQkJc3Bpbl9sb2NrKHNjaC0+bG9jayk7CiAJCS8qIFN0b3JlIGludGVycnVwdCByZXNwb25zZSBibG9jayB0byBsb3djb3JlLiAqLwogCQlpZiAodHNjaCAodHBpX2luZm8tPnNjaGlkLCBpcmIpID09IDAgJiYgc2NoKSB7CiAJCQkvKiBLZWVwIHN1YmNoYW5uZWwgaW5mb3JtYXRpb24gd29yZCB1cCB0byBkYXRlLiAqLwpAQCAtNjQ2LDcgKzY3Niw3IEBACiAJCQkJc2NoLT5kcml2ZXItPmlycSgmc2NoLT5kZXYpOwogCQl9CiAJCWlmIChzY2gpCi0JCQlzcGluX3VubG9jaygmc2NoLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKHNjaC0+bG9jayk7CiAJCS8qCiAJCSAqIEFyZSBtb3JlIGludGVycnVwdHMgcGVuZGluZz8KIAkJICogSWYgc28sIHRoZSB0cGkgaW5zdHJ1Y3Rpb24gd2lsbCB1cGRhdGUgdGhlIGxvd2NvcmUKQEAgLTY4NSwxMCArNzE1LDEwIEBACiAJX19jdGxfbG9hZCAoY3I2LCA2LCA2KTsKIAogCWRvIHsKLQkJc3Bpbl91bmxvY2soJmNvbnNvbGVfc3ViY2hhbm5lbC5sb2NrKTsKKwkJc3Bpbl91bmxvY2soY29uc29sZV9zdWJjaGFubmVsLmxvY2spOwogCQlpZiAoIWNpb190cGkoKSkKIAkJCWNwdV9yZWxheCgpOwotCQlzcGluX2xvY2soJmNvbnNvbGVfc3ViY2hhbm5lbC5sb2NrKTsKKwkJc3Bpbl9sb2NrKGNvbnNvbGVfc3ViY2hhbm5lbC5sb2NrKTsKIAl9IHdoaWxlIChjb25zb2xlX3N1YmNoYW5uZWwuc2NoaWIuc2Nzdy5hY3RsICE9IDApOwogCS8qCiAJICogcmVzdG9yZSBwcmV2aW91cyBpc2MgdmFsdWUKQEAgLTg0MSwyNiArODcxLDEyIEBACiAJcmV0dXJuIC1FQlVTWTsKIH0KIAotc3RydWN0IHNjaF9tYXRjaF9pZCB7Ci0Jc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7Ci0Jc3RydWN0IGNjd19kZXZfaWQgZGV2aWQ7Ci0JaW50IHJjOwotfTsKLQotc3RhdGljIGludCBfX3NodXRkb3duX3N1YmNoYW5uZWxfZWFzeV9hbmRfbWF0Y2goc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsCi0Jdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgX19zaHV0ZG93bl9zdWJjaGFubmVsX2Vhc3koc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNjaGliIHNjaGliOwotCXN0cnVjdCBzY2hfbWF0Y2hfaWQgKm1hdGNoX2lkID0gZGF0YTsKIAogCWlmIChzdHNjaF9lcnIoc2NoaWQsICZzY2hpYikpCiAJCXJldHVybiAtRU5YSU87Ci0JaWYgKG1hdGNoX2lkICYmIHNjaGliLnBtY3cuZG52ICYmCi0JCShzY2hpYi5wbWN3LmRldiA9PSBtYXRjaF9pZC0+ZGV2aWQuZGV2bm8pICYmCi0JCShzY2hpZC5zc2lkID09IG1hdGNoX2lkLT5kZXZpZC5zc2lkKSkgewotCQltYXRjaF9pZC0+c2NoaWQgPSBzY2hpZDsKLQkJbWF0Y2hfaWQtPnJjID0gMDsKLQl9CiAJaWYgKCFzY2hpYi5wbWN3LmVuYSkKIAkJcmV0dXJuIDA7CiAJc3dpdGNoKF9fZGlzYWJsZV9zdWJjaGFubmVsX2Vhc3koc2NoaWQsICZzY2hpYikpIHsKQEAgLTg3NiwyNyArODkyLDExMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNsZWFyX2FsbF9zdWJjaGFubmVsc19hbmRfbWF0Y2goc3RydWN0IGNjd19kZXZfaWQgKmRldmlkLAotCXN0cnVjdCBzdWJjaGFubmVsX2lkICpzY2hpZCkKK3N0YXRpYyBhdG9taWNfdCBjaHBpZF9yZXNldF9jb3VudDsKKworc3RhdGljIHZvaWQgczM5MF9yZXNldF9jaHBpZHNfbWNja19oYW5kbGVyKHZvaWQpCit7CisJc3RydWN0IGNydyBjcnc7CisJc3RydWN0IG1jaSAqbWNpOworCisJLyogQ2hlY2sgZm9yIHBlbmRpbmcgY2hhbm5lbCByZXBvcnQgd29yZC4gKi8KKwltY2kgPSAoc3RydWN0IG1jaSAqKSZTMzkwX2xvd2NvcmUubWNja19pbnRlcnJ1cHRpb25fY29kZTsKKwlpZiAoIW1jaS0+Y3ApCisJCXJldHVybjsKKwkvKiBQcm9jZXNzIGNoYW5uZWwgcmVwb3J0IHdvcmRzLiAqLworCXdoaWxlIChzdGNydygmY3J3KSA9PSAwKSB7CisJCS8qIENoZWNrIGZvciByZXNwb25zZXMgdG8gUkNIUC4gKi8KKwkJaWYgKGNydy5zbGN0ICYmIGNydy5yc2MgPT0gQ1JXX1JTQ19DUEFUSCkKKwkJCWF0b21pY19kZWMoJmNocGlkX3Jlc2V0X2NvdW50KTsKKwl9Cit9CisKKyNkZWZpbmUgUkNIUF9USU1FT1VUICgzMCAqIFVTRUNfUEVSX1NFQykKK3N0YXRpYyB2b2lkIGNzc19yZXNldCh2b2lkKQoreworCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWVvdXQ7CisKKwkvKiBSZXNldCBzdWJjaGFubmVscy4gKi8KKwlmb3JfZWFjaF9zdWJjaGFubmVsKF9fc2h1dGRvd25fc3ViY2hhbm5lbF9lYXN5LCAgTlVMTCk7CisJLyogUmVzZXQgY2hhbm5lbCBwYXRocy4gKi8KKwlzMzkwX3Jlc2V0X21jY2tfaGFuZGxlciA9IHMzOTBfcmVzZXRfY2hwaWRzX21jY2tfaGFuZGxlcjsKKwkvKiBFbmFibGUgY2hhbm5lbCByZXBvcnQgbWFjaGluZSBjaGVja3MuICovCisJX19jdGxfc2V0X2JpdCgxNCwgMjgpOworCS8qIFRlbXBvcmFyaWx5IHJlZW5hYmxlIG1hY2hpbmUgY2hlY2tzLiAqLworCWxvY2FsX21jY2tfZW5hYmxlKCk7CisJZm9yIChpID0gMDsgaSA8PSBfX01BWF9DSFBJRDsgaSsrKSB7CisJCXJldCA9IHJjaHAoaSk7CisJCWlmICgocmV0ID09IDApIHx8IChyZXQgPT0gMikpCisJCQkvKgorCQkJICogcmNocCBlaXRoZXIgc3VjY2VlZGVkLCBvciBhbm90aGVyIHJjaHAgaXMgYWxyZWFkeQorCQkJICogaW4gcHJvZ3Jlc3MuIEluIGVpdGhlciBjYXNlLCB3ZSdsbCBnZXQgYSBjcncuCisJCQkgKi8KKwkJCWF0b21pY19pbmMoJmNocGlkX3Jlc2V0X2NvdW50KTsKKwl9CisJLyogV2FpdCBmb3IgbWFjaGluZSBjaGVjayBmb3IgYWxsIGNoYW5uZWwgcGF0aHMuICovCisJdGltZW91dCA9IGdldF9jbG9jaygpICsgKFJDSFBfVElNRU9VVCA8PCAxMik7CisJd2hpbGUgKGF0b21pY19yZWFkKCZjaHBpZF9yZXNldF9jb3VudCkgIT0gMCkgeworCQlpZiAoZ2V0X2Nsb2NrKCkgPiB0aW1lb3V0KQorCQkJYnJlYWs7CisJCWNwdV9yZWxheCgpOworCX0KKwkvKiBEaXNhYmxlIG1hY2hpbmUgY2hlY2tzIGFnYWluLiAqLworCWxvY2FsX21jY2tfZGlzYWJsZSgpOworCS8qIERpc2FibGUgY2hhbm5lbCByZXBvcnQgbWFjaGluZSBjaGVja3MuICovCisJX19jdGxfY2xlYXJfYml0KDE0LCAyOCk7CisJczM5MF9yZXNldF9tY2NrX2hhbmRsZXIgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHJlc2V0X2NhbGwgY3NzX3Jlc2V0X2NhbGwgPSB7CisJLmZuID0gY3NzX3Jlc2V0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9jc3NfcmVzZXRfY2FsbCh2b2lkKQoreworCWF0b21pY19zZXQoJmNocGlkX3Jlc2V0X2NvdW50LCAwKTsKKwlyZWdpc3Rlcl9yZXNldF9jYWxsKCZjc3NfcmVzZXRfY2FsbCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoaW5pdF9jc3NfcmVzZXRfY2FsbCk7CisKK3N0cnVjdCBzY2hfbWF0Y2hfaWQgeworCXN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkOworCXN0cnVjdCBjY3dfZGV2X2lkIGRldmlkOworCWludCByYzsKK307CisKK3N0YXRpYyBpbnQgX19yZWlwbF9zdWJjaGFubmVsX21hdGNoKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzY2hpYiBzY2hpYjsKKwlzdHJ1Y3Qgc2NoX21hdGNoX2lkICptYXRjaF9pZCA9IGRhdGE7CisKKwlpZiAoc3RzY2hfZXJyKHNjaGlkLCAmc2NoaWIpKQorCQlyZXR1cm4gLUVOWElPOworCWlmIChzY2hpYi5wbWN3LmRudiAmJgorCSAgICAoc2NoaWIucG1jdy5kZXYgPT0gbWF0Y2hfaWQtPmRldmlkLmRldm5vKSAmJgorCSAgICAoc2NoaWQuc3NpZCA9PSBtYXRjaF9pZC0+ZGV2aWQuc3NpZCkpIHsKKwkJbWF0Y2hfaWQtPnNjaGlkID0gc2NoaWQ7CisJCW1hdGNoX2lkLT5yYyA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWlwbF9maW5kX3NjaGlkKHN0cnVjdCBjY3dfZGV2X2lkICpkZXZpZCwKKwkJCSAgICBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCAqc2NoaWQpCiB7CiAJc3RydWN0IHNjaF9tYXRjaF9pZCBtYXRjaF9pZDsKIAogCW1hdGNoX2lkLmRldmlkID0gKmRldmlkOwogCW1hdGNoX2lkLnJjID0gLUVOT0RFVjsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWZvcl9lYWNoX3N1YmNoYW5uZWwoX19zaHV0ZG93bl9zdWJjaGFubmVsX2Vhc3lfYW5kX21hdGNoLCAmbWF0Y2hfaWQpOworCWZvcl9lYWNoX3N1YmNoYW5uZWwoX19yZWlwbF9zdWJjaGFubmVsX21hdGNoLCAmbWF0Y2hfaWQpOwogCWlmIChtYXRjaF9pZC5yYyA9PSAwKQogCQkqc2NoaWQgPSBtYXRjaF9pZC5zY2hpZDsKIAlyZXR1cm4gbWF0Y2hfaWQucmM7CiB9CiAKLQotdm9pZCBjbGVhcl9hbGxfc3ViY2hhbm5lbHModm9pZCkKLXsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWZvcl9lYWNoX3N1YmNoYW5uZWwoX19zaHV0ZG93bl9zdWJjaGFubmVsX2Vhc3lfYW5kX21hdGNoLCBOVUxMKTsKLX0KLQogZXh0ZXJuIHZvaWQgZG9fcmVpcGxfYXNtKF9fdTMyIHNjaGlkKTsKIAogLyogTWFrZSBzdXJlIGFsbCBzdWJjaGFubmVscyBhcmUgcXVpZXQgYmVmb3JlIHdlIHJlLWlwbCBhbiBscGFyLiAqLwpAQCAtOTA0LDkgKzEwMDQsOSBAQAogewogCXN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkOwogCi0JaWYgKGNsZWFyX2FsbF9zdWJjaGFubmVsc19hbmRfbWF0Y2goZGV2aWQsICZzY2hpZCkpCisJczM5MF9yZXNldF9zeXN0ZW0oKTsKKwlpZiAocmVpcGxfZmluZF9zY2hpZChkZXZpZCwgJnNjaGlkKSAhPSAwKQogCQlwYW5pYygiSVBMIERldmljZSBub3QgZm91bmRcbiIpOwotCWNpb19yZXNldF9jaGFubmVsX3BhdGhzKCk7CiAJZG9fcmVpcGxfYXNtKCooKF9fdTMyKikmc2NoaWQpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKaW5kZXggNDU0MWMxYS4uMzUxNTRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCkBAIC04Nyw3ICs4Nyw3IEBACiAvKiBzdWJjaGFubmVsIGRhdGEgc3RydWN0dXJlIHVzZWQgYnkgSS9PIHN1YnJvdXRpbmVzICovCiBzdHJ1Y3Qgc3ViY2hhbm5lbCB7CiAJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7Ci0Jc3BpbmxvY2tfdCBsb2NrOwkvKiBzdWJjaGFubmVsIGxvY2sgKi8KKwlzcGlubG9ja190ICpsb2NrOwkvKiBzdWJjaGFubmVsIGxvY2sgKi8KIAlzdHJ1Y3QgbXV0ZXggcmVnX211dGV4OwogCWVudW0gewogCQlTVUJDSEFOTkVMX1RZUEVfSU8gPSAwLApAQCAtMTMxLDE1ICsxMzEsMTkgQEAKIGV4dGVybiBpbnQgY2lvX2dldF9vcHRpb25zIChzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgY2lvX21vZGlmeSAoc3RydWN0IHN1YmNoYW5uZWwgKik7CiAKK2ludCBjaW9fY3JlYXRlX3NjaF9sb2NrKHN0cnVjdCBzdWJjaGFubmVsICopOworCiAvKiBVc2Ugd2l0aCBjYXJlLiAqLwogI2lmZGVmIENPTkZJR19DQ1dfQ09OU09MRQogZXh0ZXJuIHN0cnVjdCBzdWJjaGFubmVsICpjaW9fcHJvYmVfY29uc29sZSh2b2lkKTsKIGV4dGVybiB2b2lkIGNpb19yZWxlYXNlX2NvbnNvbGUodm9pZCk7CiBleHRlcm4gaW50IGNpb19pc19jb25zb2xlKHN0cnVjdCBzdWJjaGFubmVsX2lkKTsKIGV4dGVybiBzdHJ1Y3Qgc3ViY2hhbm5lbCAqY2lvX2dldF9jb25zb2xlX3N1YmNoYW5uZWwodm9pZCk7CitleHRlcm4gc3BpbmxvY2tfdCAqIGNpb19nZXRfY29uc29sZV9sb2NrKHZvaWQpOwogI2Vsc2UKICNkZWZpbmUgY2lvX2lzX2NvbnNvbGUoc2NoaWQpIDAKICNkZWZpbmUgY2lvX2dldF9jb25zb2xlX3N1YmNoYW5uZWwoKSBOVUxMCisjZGVmaW5lIGNpb19nZXRfY29uc29sZV9sb2NrKCkgTlVMTDsKICNlbmRpZgogCiBleHRlcm4gaW50IGNpb19zaG93X21zZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCmluZGV4IGEyZGVlNWIuLjRjODFkODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuYwpAQCAtOTEsOSArOTEsOSBAQAogCQkvKiBSZXNldCBpbnRwYXJtIHRvIHplcm9lcy4gKi8KIAkJc2NoLT5zY2hpYi5wbWN3LmludHBhcm0gPSAwOwogCQljaW9fbW9kaWZ5KHNjaCk7CisJCWtmcmVlKHNjaC0+bG9jayk7CiAJCWtmcmVlKHNjaCk7CiAJfQotCQogfQogCiBzdGF0aWMgdm9pZApAQCAtMTAyLDggKzEwMiwxMCBAQAogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAKIAlzY2ggPSB0b19zdWJjaGFubmVsKGRldik7Ci0JaWYgKCFjaW9faXNfY29uc29sZShzY2gtPnNjaGlkKSkKKwlpZiAoIWNpb19pc19jb25zb2xlKHNjaC0+c2NoaWQpKSB7CisJCWtmcmVlKHNjaC0+bG9jayk7CiAJCWtmcmVlKHNjaCk7CisJfQogfQogCiBleHRlcm4gaW50IGNzc19nZXRfc3NkX2luZm8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCk7CkBAIC0xMzUsMTQgKzEzNywxNiBAQAogCXNjaC0+ZGV2LnBhcmVudCA9ICZjc3NbMF0tPmRldmljZTsKIAlzY2gtPmRldi5idXMgPSAmY3NzX2J1c190eXBlOwogCXNjaC0+ZGV2LnJlbGVhc2UgPSAmY3NzX3N1YmNoYW5uZWxfcmVsZWFzZTsKLQkKKwlzY2gtPmRldi5ncm91cHMgPSBzdWJjaF9hdHRyX2dyb3VwczsKKwogCS8qIG1ha2UgaXQga25vd24gdG8gdGhlIHN5c3RlbSAqLwogCXJldCA9IGNzc19zY2hfZGV2aWNlX3JlZ2lzdGVyKHNjaCk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CiAJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IHJlZ2lzdGVyICVzXG4iLAogCQkJX19mdW5jX18sIHNjaC0+ZGV2LmJ1c19pZCk7Ci0JZWxzZQotCQljc3NfZ2V0X3NzZF9pbmZvKHNjaCk7CisJCXJldHVybiByZXQ7CisJfQorCWNzc19nZXRfc3NkX2luZm8oc2NoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMDEsMTggKzIwNSwxOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZW51bSB7IE5PTkUsIFVOUkVHSVNURVIsIFVOUkVHSVNURVJfUFJPQkUsIFJFUFJPQkUgfSBhY3Rpb247CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NoLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoc2NoLT5sb2NrLCBmbGFncyk7CiAJZGlzYyA9IGRldmljZV9pc19kaXNjb25uZWN0ZWQoc2NoKTsKIAlpZiAoZGlzYyAmJiBzbG93KSB7CiAJCS8qIERpc2Nvbm5lY3RlZCBkZXZpY2VzIGFyZSBldmFsdWF0ZWQgZGlyZWN0bHkgb25seS4qLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2gtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY2gtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCS8qIE5vIGludGVycnVwdCBhZnRlciBtYWNoaW5lIGNoZWNrIC0ga2lsbCBwZW5kaW5nIHRpbWVycy4gKi8KIAlkZXZpY2Vfa2lsbF9wZW5kaW5nX3RpbWVyKHNjaCk7CiAJaWYgKCFkaXNjICYmICFzbG93KSB7CiAJCS8qIE5vbi1kaXNjb25uZWN0ZWQgZGV2aWNlcyBhcmUgZXZhbHVhdGVkIG9uIHRoZSBzbG93IHBhdGguICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaC0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJZXZlbnQgPSBjc3NfZ2V0X3N1YmNoYW5uZWxfc3RhdHVzKHNjaCk7CkBAIC0yMzcsOSArMjQxLDkgQEAKIAkJLyogQXNrIGRyaXZlciB3aGF0IHRvIGRvIHdpdGggZGV2aWNlLiAqLwogCQlhY3Rpb24gPSBVTlJFR0lTVEVSOwogCQlpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPm5vdGlmeSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NoLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOwogCQkJcmV0ID0gc2NoLT5kcml2ZXItPm5vdGlmeSgmc2NoLT5kZXYsIGV2ZW50KTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2gtPmxvY2ssIGZsYWdzKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKHNjaC0+bG9jaywgZmxhZ3MpOwogCQkJaWYgKHJldCkKIAkJCQlhY3Rpb24gPSBOT05FOwogCQl9CkBAIC0yNjQsMTcgKzI2OCwxMyBAQAogCWNhc2UgVU5SRUdJU1RFUjoKIAljYXNlIFVOUkVHSVNURVJfUFJPQkU6CiAJCS8qIFVucmVnaXN0ZXIgZGV2aWNlICh3aWxsIHVzZSBzdWJjaGFubmVsIGxvY2spLiAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2gtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY2gtPmxvY2ssIGZsYWdzKTsKIAkJY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihzY2gpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NoLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNjaC0+bG9jaywgZmxhZ3MpOwogCiAJCS8qIFJlc2V0IGludHBhcm0gdG8gemVyb2VzLiAqLwogCQlzY2gtPnNjaGliLnBtY3cuaW50cGFybSA9IDA7CiAJCWNpb19tb2RpZnkoc2NoKTsKLQotCQkvKiBQcm9iZSBpZiBuZWNlc3NhcnkuICovCi0JCWlmIChhY3Rpb24gPT0gVU5SRUdJU1RFUl9QUk9CRSkKLQkJCXJldCA9IGNzc19wcm9iZV9kZXZpY2Uoc2NoLT5zY2hpZCk7CiAJCWJyZWFrOwogCWNhc2UgUkVQUk9CRToKIAkJZGV2aWNlX3RyaWdnZXJfcmVwcm9iZShzY2gpOwpAQCAtMjgyLDcgKzI4MiwxMCBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2gtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOworCS8qIFByb2JlIGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiAoYWN0aW9uID09IFVOUkVHSVNURVJfUFJPQkUpCisJCXJldCA9IGNzc19wcm9iZV9kZXZpY2Uoc2NoLT5zY2hpZCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzM1LDcgKzMzOCw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNsb3dfc3ViY2hhbm5lbF9sb2NrKTsKIAogc3RhdGljIHZvaWQKLWNzc190cmlnZ2VyX3Nsb3dfcGF0aCh2b2lkKQorY3NzX3RyaWdnZXJfc2xvd19wYXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKQogewogCUNJT19UUkFDRV9FVkVOVCg0LCAic2xvd3BhdGgiKTsKIApAQCAtMzYwLDggKzM2Myw3IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZzbG93X3N1YmNoYW5uZWxfbG9jayk7CiB9CiAKLXR5cGVkZWYgdm9pZCAoKndvcmtmdW5jKSh2b2lkICopOwotREVDTEFSRV9XT1JLKHNsb3dfcGF0aF93b3JrLCAod29ya2Z1bmMpY3NzX3RyaWdnZXJfc2xvd19wYXRoLCBOVUxMKTsKK0RFQ0xBUkVfV09SSyhzbG93X3BhdGhfd29yaywgY3NzX3RyaWdnZXJfc2xvd19wYXRoKTsKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpzbG93X3BhdGhfd3E7CiAKIC8qIFJlcHJvYmUgc3ViY2hhbm5lbCBpZiB1bnJlZ2lzdGVyZWQuICovCkBAIC0zOTgsNyArNDAwLDcgQEAKIH0KIAogLyogV29yayBmdW5jdGlvbiB1c2VkIHRvIHJlcHJvYmUgYWxsIHVucmVnaXN0ZXJlZCBzdWJjaGFubmVscy4gKi8KLXN0YXRpYyB2b2lkIHJlcHJvYmVfYWxsKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCByZXByb2JlX2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKIHsKIAlpbnQgcmV0OwogCkBAIC00MTQsNyArNDE2LDcgQEAKIAkJICAgICAgbmVlZF9yZXByb2JlKTsKIH0KIAotREVDTEFSRV9XT1JLKGNzc19yZXByb2JlX3dvcmssIHJlcHJvYmVfYWxsLCBOVUxMKTsKK0RFQ0xBUkVfV09SSyhjc3NfcmVwcm9iZV93b3JrLCByZXByb2JlX2FsbCk7CiAKIC8qIFNjaGVkdWxlIHJlcHJvYmluZyBvZiBhbGwgdW5yZWdpc3RlcmVkIHN1YmNoYW5uZWxzLiAqLwogdm9pZCBjc3Nfc2NoZWR1bGVfcmVwcm9iZSh2b2lkKQpAQCAtNTc1LDEyICs1NzcsMjQgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGNtX2VuYWJsZSwgMDY0NCwgY3NzX2NtX2VuYWJsZV9zaG93LCBjc3NfY21fZW5hYmxlX3N0b3JlKTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9faW5pdAotc2V0dXBfY3NzKGludCBucikKK3N0YXRpYyBpbmxpbmUgaW50IF9faW5pdCBzZXR1cF9jc3MoaW50IG5yKQogewogCXUzMiB0b2RfaGlnaDsKKwlpbnQgcmV0OwogCiAJbWVtc2V0KGNzc1tucl0sIDAsIHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0pKTsKKwljc3NbbnJdLT5wc2V1ZG9fc3ViY2hhbm5lbCA9CisJCWt6YWxsb2Moc2l6ZW9mKCpjc3NbbnJdLT5wc2V1ZG9fc3ViY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghY3NzW25yXS0+cHNldWRvX3N1YmNoYW5uZWwpCisJCXJldHVybiAtRU5PTUVNOworCWNzc1tucl0tPnBzZXVkb19zdWJjaGFubmVsLT5kZXYucGFyZW50ID0gJmNzc1tucl0tPmRldmljZTsKKwljc3NbbnJdLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2LnJlbGVhc2UgPSBjc3Nfc3ViY2hhbm5lbF9yZWxlYXNlOworCXNwcmludGYoY3NzW25yXS0+cHNldWRvX3N1YmNoYW5uZWwtPmRldi5idXNfaWQsICJkZWZ1bmN0Iik7CisJcmV0ID0gY2lvX2NyZWF0ZV9zY2hfbG9jayhjc3NbbnJdLT5wc2V1ZG9fc3ViY2hhbm5lbCk7CisJaWYgKHJldCkgeworCQlrZnJlZShjc3NbbnJdLT5wc2V1ZG9fc3ViY2hhbm5lbCk7CisJCXJldHVybiByZXQ7CisJfQogCW11dGV4X2luaXQoJmNzc1tucl0tPm11dGV4KTsKIAljc3NbbnJdLT52YWxpZCA9IDE7CiAJY3NzW25yXS0+Y3NzaWQgPSBucjsKQEAgLTU4OCw2ICs2MDIsNyBAQAogCWNzc1tucl0tPmRldmljZS5yZWxlYXNlID0gY2hhbm5lbF9zdWJzeXN0ZW1fcmVsZWFzZTsKIAl0b2RfaGlnaCA9ICh1MzIpIChnZXRfY2xvY2soKSA+PiAzMik7CiAJY3NzX2dlbmVyYXRlX3BnaWQoY3NzW25yXSwgdG9kX2hpZ2gpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNjI0LDEwICs2MzksMTIgQEAKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF91bnJlZ2lzdGVyOwogCQl9Ci0JCXNldHVwX2NzcyhpKTsKLQkJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZjc3NbaV0tPmRldmljZSk7CisJCXJldCA9IHNldHVwX2NzcyhpKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0X2ZyZWU7CisJCXJldCA9IGRldmljZV9yZWdpc3RlcigmY3NzW2ldLT5kZXZpY2UpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZnJlZV9hbGw7CiAJCWlmIChjc3NfY2hhcmFjdGVyaXN0aWNzX2F2YWlsICYmCiAJCSAgICBjc3NfY2hzY19jaGFyYWN0ZXJpc3RpY3Muc2VjbSkgewogCQkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjc3NbaV0tPmRldmljZSwKQEAgLTYzNSw2ICs2NTIsOSBAQAogCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dF9kZXZpY2U7CiAJCX0KKwkJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZjc3NbaV0tPnBzZXVkb19zdWJjaGFubmVsLT5kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZmlsZTsKIAl9CiAJY3NzX2luaXRfZG9uZSA9IDE7CiAKQEAgLTY0MiwxMyArNjYyLDE5IEBACiAKIAlmb3JfZWFjaF9zdWJjaGFubmVsKF9faW5pdF9jaGFubmVsX3N1YnN5c3RlbSwgTlVMTCk7CiAJcmV0dXJuIDA7CitvdXRfZmlsZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNzc1tpXS0+ZGV2aWNlLCAmZGV2X2F0dHJfY21fZW5hYmxlKTsKIG91dF9kZXZpY2U6CiAJZGV2aWNlX3VucmVnaXN0ZXIoJmNzc1tpXS0+ZGV2aWNlKTsKK291dF9mcmVlX2FsbDoKKwlrZnJlZShjc3NbaV0tPnBzZXVkb19zdWJjaGFubmVsLT5sb2NrKTsKKwlrZnJlZShjc3NbaV0tPnBzZXVkb19zdWJjaGFubmVsKTsKIG91dF9mcmVlOgogCWtmcmVlKGNzc1tpXSk7CiBvdXRfdW5yZWdpc3RlcjoKIAl3aGlsZSAoaSA+IDApIHsKIAkJaS0tOworCQlkZXZpY2VfdW5yZWdpc3RlcigmY3NzW2ldLT5wc2V1ZG9fc3ViY2hhbm5lbC0+ZGV2KTsKIAkJaWYgKGNzc19jaGFyYWN0ZXJpc3RpY3NfYXZhaWwgJiYgY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNlY20pCiAJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNzc1tpXS0+ZGV2aWNlLAogCQkJCQkgICAmZGV2X2F0dHJfY21fZW5hYmxlKTsKQEAgLTY2MCw2ICs2ODYsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgc2NoX2lzX3BzZXVkb19zY2goc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3sKKwlyZXR1cm4gc2NoID09IHRvX2NzcyhzY2gtPmRldi5wYXJlbnQpLT5wc2V1ZG9fc3ViY2hhbm5lbDsKK30KKwogLyoKICAqIGZpbmQgYSBkcml2ZXIgZm9yIGEgc3ViY2hhbm5lbC4gVGhleSBpZGVudGlmeSBieSB0aGUgc3ViY2hhbm5lbAogICogdHlwZSB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUgY29uc29sZSBzdWJjaGFubmVsIGRyaXZlciBoYXMgaXRzIG93bgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuaCBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKaW5kZXggNGMyZmY4My4uMzQ2NGM1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCkBAIC03Myw2ICs3Myw4IEBACiB9ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkLGFsaWduZWQoNCkpKTsKIAogc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSB7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CisJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKIAlpbnQgc3RhdGU7CQkvKiBkZXZpY2Ugc3RhdGUgKi8KIAlhdG9taWNfdCBvbm9mZjsKIAl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyZWQ7CkBAIC05NCw2ICs5Niw3IEBACiAJCXVuc2lnbmVkIGludCBkb25vdGlmeToxOyAgICAvKiBjYWxsIG5vdGlmeSBmdW5jdGlvbiAqLwogCQl1bnNpZ25lZCBpbnQgcmVjb2dfZG9uZToxOyAgLyogZGV2LiByZWNvZy4gY29tcGxldGUgKi8KIAkJdW5zaWduZWQgaW50IGZha2VfaXJiOjE7ICAgIC8qIGRlbGl2ZXIgZmFrZWQgaXJiICovCisJCXVuc2lnbmVkIGludCBpbnRyZXRyeToxOyAgICAvKiByZXRyeSBpbnRlcm5hbCBvcGVyYXRpb24gKi8KIAl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgaW50cGFybTsJLyogdXNlciBpbnRlcnJ1cHRpb24gcGFyYW1ldGVyICovCiAJc3RydWN0IHFkaW9faXJxICpxZGlvX2RhdGE7CkBAIC0xNTcsNiArMTYwLDggQEAKIAlpbnQgY21fZW5hYmxlZDsKIAl2b2lkICpjdWJfYWRkcjE7CiAJdm9pZCAqY3ViX2FkZHIyOworCS8qIGZvciBvcnBoYW5lZCBjY3cgZGV2aWNlcyAqLworCXN0cnVjdCBzdWJjaGFubmVsICpwc2V1ZG9fc3ViY2hhbm5lbDsKIH07CiAjZGVmaW5lIHRvX2NzcyhkZXYpIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaGFubmVsX3N1YnN5c3RlbSwgZGV2aWNlKQogCkBAIC0xNzEsNiArMTc2LDggQEAKIC8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIHZhcnkgb24vb2ZmLiAqLwogaW50IGRldmljZV9pc19vbmxpbmUoc3RydWN0IHN1YmNoYW5uZWwgKik7CiB2b2lkIGRldmljZV9raWxsX2lvKHN0cnVjdCBzdWJjaGFubmVsICopOwordm9pZCBkZXZpY2Vfc2V0X2ludHJldHJ5KHN0cnVjdCBzdWJjaGFubmVsICpzY2gpOworaW50IGRldmljZV90cmlnZ2VyX3ZlcmlmeShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKTsKIAogLyogTWFjaGluZSBjaGVjayBoZWxwZXIgZnVuY3Rpb24uICovCiB2b2lkIGRldmljZV9raWxsX3BlbmRpbmdfdGltZXIoc3RydWN0IHN1YmNoYW5uZWwgKik7CkBAIC0xODIsNiArMTg5LDExIEBACiBpbnQgY3NzX3Nsb3dfc3ViY2hhbm5lbHNfZXhpc3Qodm9pZCk7CiBleHRlcm4gaW50IG5lZWRfcmVzY2FuOwogCitpbnQgc2NoX2lzX3BzZXVkb19zY2goc3RydWN0IHN1YmNoYW5uZWwgKik7CisKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc2xvd19wYXRoX3dxOwogZXh0ZXJuIHN0cnVjdCB3b3JrX3N0cnVjdCBzbG93X3BhdGhfd29yazsKKworaW50IHN1YmNoYW5uZWxfYWRkX2ZpbGVzIChzdHJ1Y3QgZGV2aWNlICopOworZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnN1YmNoX2F0dHJfZ3JvdXBzW107CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCmluZGV4IDk0YmRkNGQuLjgwMzU3OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgkJLyogSFogKi8KIAogI2luY2x1ZGUgImNpby5oIgorI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgogI2luY2x1ZGUgImNzcy5oIgogI2luY2x1ZGUgImRldmljZS5oIgogI2luY2x1ZGUgImlvYXNtLmgiCkBAIC0yMzQsOSArMjM1LDExIEBACiAJc3NpemVfdCByZXQgPSAwOwogCWludCBjaHA7CiAKLQlmb3IgKGNocCA9IDA7IGNocCA8IDg7IGNocCsrKQotCQlyZXQgKz0gc3ByaW50ZiAoYnVmK3JldCwgIiUwMnggIiwgc3NkLT5jaHBpZFtjaHBdKTsKLQorCWlmIChzc2QpCisJCWZvciAoY2hwID0gMDsgY2hwIDwgODsgY2hwKyspCisJCQlyZXQgKz0gc3ByaW50ZiAoYnVmK3JldCwgIiUwMnggIiwgc3NkLT5jaHBpZFtjaHBdKTsKKwllbHNlCisJCXJldCArPSBzcHJpbnRmIChidWYsICJuL2EiKTsKIAlyZXQgKz0gc3ByaW50ZiAoYnVmK3JldCwgIlxuIik7CiAJcmV0dXJuIG1pbigoc3NpemVfdClQQUdFX1NJWkUsIHJldCk7CiB9CkBAIC0yOTQsMTQgKzI5Nyw0NCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgY2Rldi0+b25saW5lID8gIjFcbiIgOiAiMFxuIik7CiB9CiAKK2ludCBjY3dfZGV2aWNlX2lzX29ycGhhbihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlyZXR1cm4gc2NoX2lzX3BzZXVkb19zY2godG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KSk7Cit9CisKK3N0YXRpYyB2b2lkIGNjd19kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKKworCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKKwljZGV2ID0gcHJpdi0+Y2RldjsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDEsICZjZGV2LT5wcml2YXRlLT5yZWdpc3RlcmVkKSkKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmNkZXYtPmRldik7CisJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKK30KKwogc3RhdGljIHZvaWQKIGNjd19kZXZpY2VfcmVtb3ZlX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJLyoKIAkgKiBGb3JjZWQgb2ZmbGluZSBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgbWVhbnMKIAkgKiAndGhyb3cgYXdheSBkZXZpY2UnLgogCSAqLworCWlmIChjY3dfZGV2aWNlX2lzX29ycGhhbihjZGV2KSkgeworCQkvKiBEZXJlZ2lzdGVyIGNjdyBkZXZpY2UuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKKwkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOworCQlpZiAoZ2V0X2RldmljZSgmY2Rldi0+ZGV2KSkgeworCQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCisJCQkJICAgICBjY3dfZGV2aWNlX3VucmVnaXN0ZXIpOworCQkJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOworCQl9CisJCXJldHVybiA7CisJfQogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAJY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihzY2gpOwogCS8qIFJlc2V0IGludHBhcm0gdG8gemVyb2VzLiAqLwpAQCAtNDYyLDYgKzQ5NSw4IEBACiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXYgPSB0b19jY3dkZXYoZGV2KTsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCisJaWYgKGNjd19kZXZpY2VfaXNfb3JwaGFuKGNkZXYpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJubyBkZXZpY2VcbiIpOwogCXN3aXRjaCAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUpIHsKIAljYXNlIERFVl9TVEFURV9CT1hFRDoKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiYm94ZWRcbiIpOwpAQCAtNDk4LDExICs1MzMsMTAgQEAKIAkuYXR0cnMgPSBzdWJjaF9hdHRycywKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1zdWJjaGFubmVsX2FkZF9maWxlcyAoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJnN1YmNoX2F0dHJfZ3JvdXApOwotfQorc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqc3ViY2hfYXR0cl9ncm91cHNbXSA9IHsKKwkmc3ViY2hfYXR0cl9ncm91cCwKKwlOVUxMLAorfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBjY3dkZXZfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfZGV2dHlwZS5hdHRyLApAQCAtNTMyLDggKzU2Niw3IEBACiAKIC8qIHRoaXMgaXMgYSBzaW1wbGUgYWJzdHJhY3Rpb24gZm9yIGRldmljZV9yZWdpc3RlciB0aGF0IHNldHMgdGhlCiAgKiBjb3JyZWN0IGJ1cyB0eXBlIGFuZCBhZGRzIHRoZSBidXMgc3BlY2lmaWMgZmlsZXMgKi8KLWludAotY2N3X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3N0YXRpYyBpbnQgY2N3X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2Rldi0+ZGV2OwogCWludCByZXQ7CkBAIC01NjQsMTEgKzU5NywxMCBAQAogCiAJY2RldiA9IHRvX2Njd2RldihkZXYpOwogCWlmICgoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX0RJU0NPTk5FQ1RFRCkgJiYKKwkgICAgIWNjd19kZXZpY2VfaXNfb3JwaGFuKGNkZXYpICYmCiAJICAgIGNjd19kZXZfaWRfaXNfZXF1YWwoJmNkZXYtPnByaXZhdGUtPmRldl9pZCwgJmQtPmRldl9pZCkgJiYKLQkgICAgKGNkZXYgIT0gZC0+c2libGluZykpIHsKLQkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7CisJICAgIChjZGV2ICE9IGQtPnNpYmxpbmcpKQogCQlyZXR1cm4gMTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4NSwxMyArNjE3LDM2IEBACiAJcmV0dXJuIGRldiA/IHRvX2Njd2RldihkZXYpIDogTlVMTDsKIH0KIAotc3RhdGljIHZvaWQKLWNjd19kZXZpY2VfYWRkX2NoYW5nZWQodm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgbWF0Y2hfb3JwaGFuKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQorCXN0cnVjdCBjY3dfZGV2X2lkICpkZXZfaWQ7CiAJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAKLQljZGV2ID0gZGF0YTsKKwlkZXZfaWQgPSBkYXRhOworCWNkZXYgPSB0b19jY3dkZXYoZGV2KTsKKwlyZXR1cm4gY2N3X2Rldl9pZF9pc19lcXVhbCgmY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLCBkZXZfaWQpOworfQorCitzdGF0aWMgc3RydWN0IGNjd19kZXZpY2UgKgorZ2V0X29ycGhhbmVkX2Njd2Rldl9ieV9kZXZfaWQoc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICpjc3MsCisJCQkgICAgICBzdHJ1Y3QgY2N3X2Rldl9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRldiA9IGRldmljZV9maW5kX2NoaWxkKCZjc3MtPnBzZXVkb19zdWJjaGFubmVsLT5kZXYsIGRldl9pZCwKKwkJCQltYXRjaF9vcnBoYW4pOworCisJcmV0dXJuIGRldiA/IHRvX2Njd2RldihkZXYpIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2Njd19kZXZpY2VfYWRkX2NoYW5nZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CisKKwlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7CisJY2RldiA9IHByaXYtPmNkZXY7CiAJaWYgKGRldmljZV9hZGQoJmNkZXYtPmRldikpIHsKIAkJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKIAkJcmV0dXJuOwpAQCAtNjAzLDY0ICs2NTgsMjEgQEAKIAl9CiB9CiAKLWV4dGVybiBpbnQgY3NzX2dldF9zc2RfaW5mbyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKTsKLQotdm9pZAotY2N3X2RldmljZV9kb191bnJlZ19yZXJlZyh2b2lkICpkYXRhKQordm9pZCBjY3dfZGV2aWNlX2RvX3VucmVnX3JlcmVnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlICpwcml2OwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JaW50IG5lZWRfcmVuYW1lOwogCi0JY2RldiA9IGRhdGE7CisJcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlLCBraWNrX3dvcmspOworCWNkZXYgPSBwcml2LT5jZGV2OwogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7Ci0JaWYgKGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyAhPSBzY2gtPnNjaGliLnBtY3cuZGV2KSB7Ci0JCS8qCi0JCSAqIFRoZSBkZXZpY2UgbnVtYmVyIGhhcyBjaGFuZ2VkLiBUaGlzIGlzIHVzdWFsbHkgb25seSB3aGVuCi0JCSAqIGEgZGV2aWNlIGhhcyBiZWVuIGRldGFjaGVkIHVuZGVyIFZNIGFuZCB0aGVuIHJlLWFwcGVhcmVkCi0JCSAqIG9uIGFub3RoZXIgc3ViY2hhbm5lbCBiZWNhdXNlIG9mIGEgZGlmZmVyZW50IGF0dGFjaG1lbnQKLQkJICogb3JkZXIgdGhhbiBiZWZvcmUuIElkZWFsbHksIHdlIHNob3VsZCBzaG91bGQganVzdCBzd2l0Y2gKLQkJICogc3ViY2hhbm5lbHMsIGJ1dCB1bmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5vdCBwb3NzaWJsZSB3aXRoCi0JCSAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgotCQkgKiBJbnN0ZWFkLCB3ZSBzZWFyY2ggZm9yIHRoZSBvbGQgc3ViY2hhbm5lbCBmb3IgdGhpcyBkZXZpY2UKLQkJICogbnVtYmVyIGFuZCBkZXJlZ2lzdGVyIHNvIHRoZXJlIGFyZSBubyBjb2xsaXNpb25zIHdpdGggdGhlCi0JCSAqIG5ld2x5IHJlZ2lzdGVyZWQgY2N3X2RldmljZS4KLQkJICogRklYTUU6IEZpbmQgYW5vdGhlciBzb2x1dGlvbiBzbyB0aGUgYmxvY2sgbGF5ZXIgZG9lc24ndAotCQkgKiAgICAgICAgZ2V0IHBvc3NpYmx5IHNpY2suLi4KLQkJICovCi0JCXN0cnVjdCBjY3dfZGV2aWNlICpvdGhlcl9jZGV2OwotCQlzdHJ1Y3QgY2N3X2Rldl9pZCBkZXZfaWQ7CiAKLQkJbmVlZF9yZW5hbWUgPSAxOwotCQlkZXZfaWQuZGV2bm8gPSBzY2gtPnNjaGliLnBtY3cuZGV2OwotCQlkZXZfaWQuc3NpZCA9IHNjaC0+c2NoaWQuc3NpZDsKLQkJb3RoZXJfY2RldiA9IGdldF9kaXNjX2Njd2Rldl9ieV9kZXZfaWQoJmRldl9pZCwgY2Rldik7Ci0JCWlmIChvdGhlcl9jZGV2KSB7Ci0JCQlzdHJ1Y3Qgc3ViY2hhbm5lbCAqb3RoZXJfc2NoOwotCi0JCQlvdGhlcl9zY2ggPSB0b19zdWJjaGFubmVsKG90aGVyX2NkZXYtPmRldi5wYXJlbnQpOwotCQkJaWYgKGdldF9kZXZpY2UoJm90aGVyX3NjaC0+ZGV2KSkgewotCQkJCXN0c2NoKG90aGVyX3NjaC0+c2NoaWQsICZvdGhlcl9zY2gtPnNjaGliKTsKLQkJCQlpZiAob3RoZXJfc2NoLT5zY2hpYi5wbWN3LmRudikgewotCQkJCQlvdGhlcl9zY2gtPnNjaGliLnBtY3cuaW50cGFybSA9IDA7Ci0JCQkJCWNpb19tb2RpZnkob3RoZXJfc2NoKTsKLQkJCQl9Ci0JCQkJY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihvdGhlcl9zY2gpOwotCQkJfQotCQl9Ci0JCS8qIFVwZGF0ZSBzc2QgaW5mbyBoZXJlLiAqLwotCQljc3NfZ2V0X3NzZF9pbmZvKHNjaCk7Ci0JCWNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubyA9IHNjaC0+c2NoaWIucG1jdy5kZXY7Ci0JfSBlbHNlCi0JCW5lZWRfcmVuYW1lID0gMDsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGVzKCZjZGV2LT5kZXYpOwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMSwgJmNkZXYtPnByaXZhdGUtPnJlZ2lzdGVyZWQpKQogCQlkZXZpY2VfZGVsKCZjZGV2LT5kZXYpOwotCWlmIChuZWVkX3JlbmFtZSkKLQkJc25wcmludGYgKGNkZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiMC4leC4lMDR4IiwKLQkJCSAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGliLnBtY3cuZGV2KTsKIAlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJICAgICBjY3dfZGV2aWNlX2FkZF9jaGFuZ2VkLCBjZGV2KTsKKwkJICAgICBjY3dfZGV2aWNlX2FkZF9jaGFuZ2VkKTsKIAlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiB9CiAKQEAgLTY3NCwyMiArNjg2LDIxMCBAQAogCWtmcmVlKGNkZXYpOwogfQogCitzdGF0aWMgc3RydWN0IGNjd19kZXZpY2UgKiBpb19zdWJjaGFubmVsX2FsbG9jYXRlX2RldihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQoreworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OworCisJY2RldiAgPSBremFsbG9jKHNpemVvZigqY2RldiksIEdGUF9LRVJORUwpOworCWlmIChjZGV2KSB7CisJCWNkZXYtPnByaXZhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlKSwKKwkJCQkJR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQlpZiAoY2Rldi0+cHJpdmF0ZSkKKwkJCXJldHVybiBjZGV2OworCX0KKwlrZnJlZShjZGV2KTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KKworc3RhdGljIGludCBpb19zdWJjaGFubmVsX2luaXRpYWxpemVfZGV2KHN0cnVjdCBzdWJjaGFubmVsICpzY2gsCisJCQkJCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCWNkZXYtPnByaXZhdGUtPmNkZXYgPSBjZGV2OworCWF0b21pY19zZXQoJmNkZXYtPnByaXZhdGUtPm9ub2ZmLCAwKTsKKwljZGV2LT5kZXYucGFyZW50ID0gJnNjaC0+ZGV2OworCWNkZXYtPmRldi5yZWxlYXNlID0gY2N3X2RldmljZV9yZWxlYXNlOworCUlOSVRfTElTVF9IRUFEKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmsuZW50cnkpOworCS8qIERvIGZpcnN0IGhhbGYgb2YgZGV2aWNlX3JlZ2lzdGVyLiAqLworCWRldmljZV9pbml0aWFsaXplKCZjZGV2LT5kZXYpOworCWlmICghZ2V0X2RldmljZSgmc2NoLT5kZXYpKSB7CisJCWlmIChjZGV2LT5kZXYucmVsZWFzZSkKKwkJCWNkZXYtPmRldi5yZWxlYXNlKCZjZGV2LT5kZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2N3X2RldmljZSAqIGlvX3N1YmNoYW5uZWxfY3JlYXRlX2Njd2RldihzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQoreworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OworCWludCByZXQ7CisKKwljZGV2ID0gaW9fc3ViY2hhbm5lbF9hbGxvY2F0ZV9kZXYoc2NoKTsKKwlpZiAoIUlTX0VSUihjZGV2KSkgeworCQlyZXQgPSBpb19zdWJjaGFubmVsX2luaXRpYWxpemVfZGV2KHNjaCwgY2Rldik7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKGNkZXYpOworCQkJY2RldiA9IEVSUl9QVFIocmV0KTsKKwkJfQorCX0KKwlyZXR1cm4gY2RldjsKK30KKworc3RhdGljIGludCBpb19zdWJjaGFubmVsX3JlY29nKHN0cnVjdCBjY3dfZGV2aWNlICosIHN0cnVjdCBzdWJjaGFubmVsICopOworCitzdGF0aWMgdm9pZCBzY2hfYXR0YWNoX2RldmljZShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLAorCQkJICAgICAgc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCit7CisJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOworCXNjaC0+ZGV2LmRyaXZlcl9kYXRhID0gY2RldjsKKwljZGV2LT5wcml2YXRlLT5zY2hpZCA9IHNjaC0+c2NoaWQ7CisJY2Rldi0+Y2N3bG9jayA9IHNjaC0+bG9jazsKKwlkZXZpY2VfdHJpZ2dlcl9yZXByb2JlKHNjaCk7CisJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaF9hdHRhY2hfZGlzY29ubmVjdGVkX2RldmljZShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLAorCQkJCQkgICBzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqb3RoZXJfc2NoOworCWludCByZXQ7CisKKwlvdGhlcl9zY2ggPSB0b19zdWJjaGFubmVsKGdldF9kZXZpY2UoY2Rldi0+ZGV2LnBhcmVudCkpOworCXJldCA9IGRldmljZV9tb3ZlKCZjZGV2LT5kZXYsICZzY2gtPmRldik7CisJaWYgKHJldCkgeworCQlDSU9fTVNHX0VWRU5UKDIsICJNb3ZpbmcgZGlzY29ubmVjdGVkIGRldmljZSAwLiV4LiUwNHggZmFpbGVkICIKKwkJCSAgICAgICIocmV0PSVkKSFcbiIsIGNkZXYtPnByaXZhdGUtPmRldl9pZC5zc2lkLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLmRldm5vLCByZXQpOworCQlwdXRfZGV2aWNlKCZvdGhlcl9zY2gtPmRldik7CisJCXJldHVybjsKKwl9CisJb3RoZXJfc2NoLT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOworCS8qIE5vIG5lZWQgdG8ga2VlcCBhIHN1YmNoYW5uZWwgd2l0aG91dCBjY3cgZGV2aWNlIGFyb3VuZC4gKi8KKwljc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKG90aGVyX3NjaCk7CisJcHV0X2RldmljZSgmb3RoZXJfc2NoLT5kZXYpOworCXNjaF9hdHRhY2hfZGV2aWNlKHNjaCwgY2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHNjaF9hdHRhY2hfb3JwaGFuZWRfZGV2aWNlKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsCisJCQkJICAgICAgIHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCWludCByZXQ7CisKKwkvKiBUcnkgdG8gbW92ZSB0aGUgY2N3IGRldmljZSB0byBpdHMgbmV3IHN1YmNoYW5uZWwuICovCisJcmV0ID0gZGV2aWNlX21vdmUoJmNkZXYtPmRldiwgJnNjaC0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCUNJT19NU0dfRVZFTlQoMCwgIk1vdmluZyBkZXZpY2UgMC4leC4lMDR4IGZyb20gb3JwaGFuYWdlICIKKwkJCSAgICAgICJmYWlsZWQgKHJldD0lZCkhXG4iLAorCQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+ZGV2X2lkLnNzaWQsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHJldCk7CisJCXJldHVybjsKKwl9CisJc2NoX2F0dGFjaF9kZXZpY2Uoc2NoLCBjZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2NoX2NyZWF0ZV9hbmRfcmVjb2dfbmV3X2RldmljZShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQoreworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OworCisJLyogTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBjY3cgZGV2aWNlLiAqLworCWNkZXYgPSBpb19zdWJjaGFubmVsX2NyZWF0ZV9jY3dkZXYoc2NoKTsKKwlpZiAoSVNfRVJSKGNkZXYpKSB7CisJCS8qIE9LLCB3ZSBkaWQgZXZlcnl0aGluZyB3ZSBjb3VsZC4uLiAqLworCQljc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKHNjaCk7CisJCXJldHVybjsKKwl9CisJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOworCXNjaC0+ZGV2LmRyaXZlcl9kYXRhID0gY2RldjsKKwlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKKwkvKiBTdGFydCByZWNvZ25pdGlvbiBmb3IgdGhlIG5ldyBjY3cgZGV2aWNlLiAqLworCWlmIChpb19zdWJjaGFubmVsX3JlY29nKGNkZXYsIHNjaCkpIHsKKwkJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOworCQlzY2gtPmRldi5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOworCQlpZiAoY2Rldi0+ZGV2LnJlbGVhc2UpCisJCQljZGV2LT5kZXYucmVsZWFzZSgmY2Rldi0+ZGV2KTsKKwkJY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihzY2gpOworCX0KK30KKworCit2b2lkIGNjd19kZXZpY2VfbW92ZV90b19vcnBoYW5hZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CisJc3RydWN0IGNjd19kZXZpY2UgKnJlcGxhY2luZ19jZGV2OworCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gKmNzczsKKwlzdHJ1Y3QgY2N3X2Rldl9pZCBkZXZfaWQ7CisKKwlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7CisJY2RldiA9IHByaXYtPmNkZXY7CisJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKKwljc3MgPSB0b19jc3Moc2NoLT5kZXYucGFyZW50KTsKKwlkZXZfaWQuZGV2bm8gPSBzY2gtPnNjaGliLnBtY3cuZGV2OworCWRldl9pZC5zc2lkID0gc2NoLT5zY2hpZC5zc2lkOworCisJLyoKKwkgKiBNb3ZlIHRoZSBvcnBoYW5lZCBjY3cgZGV2aWNlIHRvIHRoZSBvcnBoYW5hZ2Ugc28gdGhlIHJlcGxhY2luZworCSAqIGNjdyBkZXZpY2UgY2FuIHRha2UgaXRzIHBsYWNlIG9uIHRoZSBzdWJjaGFubmVsLgorCSAqLworCXJldCA9IGRldmljZV9tb3ZlKCZjZGV2LT5kZXYsICZjc3MtPnBzZXVkb19zdWJjaGFubmVsLT5kZXYpOworCWlmIChyZXQpIHsKKwkJQ0lPX01TR19FVkVOVCgwLCAiTW92aW5nIGRldmljZSAwLiV4LiUwNHggdG8gb3JwaGFuYWdlIGZhaWxlZCAiCisJCQkgICAgICAiKHJldD0lZCkhXG4iLCBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgcmV0KTsKKwkJcmV0dXJuOworCX0KKwljZGV2LT5jY3dsb2NrID0gY3NzLT5wc2V1ZG9fc3ViY2hhbm5lbC0+bG9jazsKKwkvKgorCSAqIFNlYXJjaCBmb3IgdGhlIHJlcGxhY2luZyBjY3cgZGV2aWNlCisJICogLSBhbW9uZyB0aGUgZGlzY29ubmVjdGVkIGRldmljZXMKKwkgKiAtIGluIHRoZSBvcnBoYW5hZ2UKKwkgKi8KKwlyZXBsYWNpbmdfY2RldiA9IGdldF9kaXNjX2Njd2Rldl9ieV9kZXZfaWQoJmRldl9pZCwgY2Rldik7CisJaWYgKHJlcGxhY2luZ19jZGV2KSB7CisJCXNjaF9hdHRhY2hfZGlzY29ubmVjdGVkX2RldmljZShzY2gsIHJlcGxhY2luZ19jZGV2KTsKKwkJcmV0dXJuOworCX0KKwlyZXBsYWNpbmdfY2RldiA9IGdldF9vcnBoYW5lZF9jY3dkZXZfYnlfZGV2X2lkKGNzcywgJmRldl9pZCk7CisJaWYgKHJlcGxhY2luZ19jZGV2KSB7CisJCXNjaF9hdHRhY2hfb3JwaGFuZWRfZGV2aWNlKHNjaCwgcmVwbGFjaW5nX2NkZXYpOworCQlyZXR1cm47CisJfQorCXNjaF9jcmVhdGVfYW5kX3JlY29nX25ld19kZXZpY2Uoc2NoKTsKK30KKwogLyoKICAqIFJlZ2lzdGVyIHJlY29nbml6ZWQgZGV2aWNlLgogICovCiBzdGF0aWMgdm9pZAotaW9fc3ViY2hhbm5lbF9yZWdpc3Rlcih2b2lkICpkYXRhKQoraW9fc3ViY2hhbm5lbF9yZWdpc3RlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWNkZXYgPSBkYXRhOworCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKKwljZGV2ID0gcHJpdi0+Y2RldjsKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCisJLyoKKwkgKiBpb19zdWJjaGFubmVsX3JlZ2lzdGVyKCkgd2lsbCBhbHNvIGJlIGNhbGxlZCBhZnRlciBkZXZpY2UKKwkgKiByZWNvZ25pdGlvbiBoYXMgYmVlbiBkb25lIGZvciBhIGJveGVkIGRldmljZSAod2hpY2ggd2lsbCBhbHJlYWR5CisJICogYmUgcmVnaXN0ZXJlZCkuIFdlIG5lZWQgdG8gcmVwcm9iZSBzaW5jZSB3ZSBtYXkgbm93IGhhdmUgc2Vuc2UgaWQKKwkgKiBpbmZvcm1hdGlvbi4KKwkgKi8KIAlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmY2Rldi0+ZGV2Lmtub2RlX3BhcmVudCkpIHsKLQkJYnVzX3Jlc2Nhbl9kZXZpY2VzKCZjY3dfYnVzX3R5cGUpOworCQlpZiAoIWNkZXYtPmRydikgeworCQkJcmV0ID0gZGV2aWNlX3JlcHJvYmUoJmNkZXYtPmRldik7CisJCQlpZiAocmV0KQorCQkJCS8qIFdlIGNhbid0IGRvIG11Y2ggaGVyZS4gKi8KKwkJCQlkZXZfaW5mbygmY2Rldi0+ZGV2LCAiZGV2aWNlX3JlcHJvYmUoKSByZXR1cm5lZCIKKwkJCQkJICIgJWRcbiIsIHJldCk7CisJCX0KIAkJZ290byBvdXQ7CiAJfQogCS8qIG1ha2UgaXQga25vd24gdG8gdGhlIHN5c3RlbSAqLwpAQCAtNjk4LDkgKzg5OCw5IEBACiAJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IHJlZ2lzdGVyICVzXG4iLAogCQkJX19mdW5jX18sIGNkZXYtPmRldi5idXNfaWQpOwogCQlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NoLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHNjaC0+bG9jaywgZmxhZ3MpOwogCQlzY2gtPmRldi5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaC0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOwogCQlrZnJlZSAoY2Rldi0+cHJpdmF0ZSk7CiAJCWtmcmVlIChjZGV2KTsKIAkJcHV0X2RldmljZSgmc2NoLT5kZXYpOwpAQCAtNzA4LDExICs5MDgsNiBAQAogCQkJd2FrZV91cCgmY2N3X2RldmljZV9pbml0X3dxKTsKIAkJcmV0dXJuOwogCX0KLQotCXJldCA9IHN1YmNoYW5uZWxfYWRkX2ZpbGVzKGNkZXYtPmRldi5wYXJlbnQpOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgYWRkIGF0dHJpYnV0ZXMgdG8gJXNcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgc2NoLT5kZXYuYnVzX2lkKTsKIAlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOwogb3V0OgogCWNkZXYtPnByaXZhdGUtPmZsYWdzLnJlY29nX2RvbmUgPSAxOwpAQCAtNzIzLDExICs5MTgsMTQgQEAKIH0KIAogdm9pZAotY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyKHZvaWQgKmRhdGEpCitjY3dfZGV2aWNlX2NhbGxfc2NoX3VucmVnaXN0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlICpwcml2OworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAKKwlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7CisJY2RldiA9IHByaXYtPmNkZXY7CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAljc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKHNjaCk7CiAJLyogUmVzZXQgaW50cGFybSB0byB6ZXJvZXMuICovCkBAIC03NTcsNyArOTU1LDcgQEAKIAkJCWJyZWFrOwogCQlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCSAgICAgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyLCBjZGV2KTsKKwkJCSAgICAgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyKTsKIAkJcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwogCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2N3X2RldmljZV9pbml0X2NvdW50KSkKIAkJCXdha2VfdXAoJmNjd19kZXZpY2VfaW5pdF93cSk7CkBAIC03NzIsNyArOTcwLDcgQEAKIAkJaWYgKCFnZXRfZGV2aWNlKCZjZGV2LT5kZXYpKQogCQkJYnJlYWs7CiAJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJICAgICBpb19zdWJjaGFubmVsX3JlZ2lzdGVyLCBjZGV2KTsKKwkJCSAgICAgaW9fc3ViY2hhbm5lbF9yZWdpc3Rlcik7CiAJCXF1ZXVlX3dvcmsoc2xvd19wYXRoX3dxLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzg2LDcgKzk4NCw3IEBACiAKIAlzY2gtPmRldi5kcml2ZXJfZGF0YSA9IGNkZXY7CiAJc2NoLT5kcml2ZXIgPSAmaW9fc3ViY2hhbm5lbF9kcml2ZXI7Ci0JY2Rldi0+Y2N3bG9jayA9ICZzY2gtPmxvY2s7CisJY2Rldi0+Y2N3bG9jayA9IHNjaC0+bG9jazsKIAogCS8qIEluaXQgcHJpdmF0ZSBkYXRhLiAqLwogCXByaXYgPSBjZGV2LT5wcml2YXRlOwpAQCAtODA2LDkgKzEwMDQsOSBAQAogCWF0b21pY19pbmMoJmNjd19kZXZpY2VfaW5pdF9jb3VudCk7CiAKIAkvKiBTdGFydCBhc3luYy4gZGV2aWNlIHNlbnNpbmcuICovCi0Jc3Bpbl9sb2NrX2lycSgmc2NoLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7CiAJcmMgPSBjY3dfZGV2aWNlX3JlY29nbml0aW9uKGNkZXYpOwotCXNwaW5fdW5sb2NrX2lycSgmc2NoLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKIAlpZiAocmMpIHsKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNjd19kZXZpY2VfaW5pdF9jb3VudCkpCiAJCQl3YWtlX3VwKCZjY3dfZGV2aWNlX2luaXRfd3EpOwpAQCAtODE2LDEyICsxMDE0LDU1IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgdm9pZCBjY3dfZGV2aWNlX21vdmVfdG9fc2NoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlICpwcml2OworCWludCByYzsKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOworCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OworCXN0cnVjdCBzdWJjaGFubmVsICpmb3JtZXJfcGFyZW50OworCisJcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlLCBraWNrX3dvcmspOworCXNjaCA9IHByaXYtPnNjaDsKKwljZGV2ID0gcHJpdi0+Y2RldjsKKwlmb3JtZXJfcGFyZW50ID0gY2N3X2RldmljZV9pc19vcnBoYW4oY2RldikgPworCQlOVUxMIDogdG9fc3ViY2hhbm5lbChnZXRfZGV2aWNlKGNkZXYtPmRldi5wYXJlbnQpKTsKKwltdXRleF9sb2NrKCZzY2gtPnJlZ19tdXRleCk7CisJLyogVHJ5IHRvIG1vdmUgdGhlIGNjdyBkZXZpY2UgdG8gaXRzIG5ldyBzdWJjaGFubmVsLiAqLworCXJjID0gZGV2aWNlX21vdmUoJmNkZXYtPmRldiwgJnNjaC0+ZGV2KTsKKwltdXRleF91bmxvY2soJnNjaC0+cmVnX211dGV4KTsKKwlpZiAocmMpIHsKKwkJQ0lPX01TR19FVkVOVCgyLCAiTW92aW5nIGRldmljZSAwLiV4LiUwNHggdG8gc3ViY2hhbm5lbCAiCisJCQkgICAgICAiMC4leC4lMDR4IGZhaWxlZCAocmV0PSVkKSFcbiIsCisJCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuc3NpZCwKKwkJCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgc2NoLT5zY2hpZC5zc2lkLAorCQkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sIHJjKTsKKwkJY3NzX3NjaF9kZXZpY2VfdW5yZWdpc3RlcihzY2gpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGZvcm1lcl9wYXJlbnQpIHsKKwkJc3Bpbl9sb2NrX2lycShmb3JtZXJfcGFyZW50LT5sb2NrKTsKKwkJZm9ybWVyX3BhcmVudC0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxKGZvcm1lcl9wYXJlbnQtPmxvY2spOworCQljc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKGZvcm1lcl9wYXJlbnQpOworCQkvKiBSZXNldCBpbnRwYXJtIHRvIHplcm9lcy4gKi8KKwkJZm9ybWVyX3BhcmVudC0+c2NoaWIucG1jdy5pbnRwYXJtID0gMDsKKwkJY2lvX21vZGlmeShmb3JtZXJfcGFyZW50KTsKKwl9CisJc2NoX2F0dGFjaF9kZXZpY2Uoc2NoLCBjZGV2KTsKK291dDoKKwlpZiAoZm9ybWVyX3BhcmVudCkKKwkJcHV0X2RldmljZSgmZm9ybWVyX3BhcmVudC0+ZGV2KTsKKwlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOworfQorCiBzdGF0aWMgaW50CiBpb19zdWJjaGFubmVsX3Byb2JlIChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsKIAogCWlmIChzY2gtPmRldi5kcml2ZXJfZGF0YSkgewogCQkvKgpAQCAtODMyLDcgKzEwNzMsNiBAQAogCQljZGV2ID0gc2NoLT5kZXYuZHJpdmVyX2RhdGE7CiAJCWRldmljZV9pbml0aWFsaXplKCZjZGV2LT5kZXYpOwogCQljY3dfZGV2aWNlX3JlZ2lzdGVyKGNkZXYpOwotCQlzdWJjaGFubmVsX2FkZF9maWxlcygmc2NoLT5kZXYpOwogCQkvKgogCQkgKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIGFscmVhZHkgb25saW5lLiBJZiBpdCBpcwogCQkgKiB0aGUgcmVmZXJlbmNlIGNvdW50IG5lZWRzIHRvIGJlIGNvcnJlY3RlZApAQCAtODQ1LDMzICsxMDg1LDM3IEBACiAJCQlnZXRfZGV2aWNlKCZjZGV2LT5kZXYpOwogCQlyZXR1cm4gMDsKIAl9Ci0JY2RldiA9IGt6YWxsb2MgKHNpemVvZigqY2RldiksIEdGUF9LRVJORUwpOworCS8qCisJICogRmlyc3QgY2hlY2sgaWYgYSBmaXR0aW5nIGRldmljZSBtYXkgYmUgZm91bmQgYW1vbmdzdCB0aGUKKwkgKiBkaXNjb25uZWN0ZWQgZGV2aWNlcyBvciBpbiB0aGUgb3JwaGFuYWdlLgorCSAqLworCWRldl9pZC5kZXZubyA9IHNjaC0+c2NoaWIucG1jdy5kZXY7CisJZGV2X2lkLnNzaWQgPSBzY2gtPnNjaGlkLnNzaWQ7CisJY2RldiA9IGdldF9kaXNjX2Njd2Rldl9ieV9kZXZfaWQoJmRldl9pZCwgTlVMTCk7CiAJaWYgKCFjZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQljZGV2LT5wcml2YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSksCi0JCQkJR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwotCWlmICghY2Rldi0+cHJpdmF0ZSkgewotCQlrZnJlZShjZGV2KTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWNkZXYgPSBnZXRfb3JwaGFuZWRfY2N3ZGV2X2J5X2Rldl9pZCh0b19jc3Moc2NoLT5kZXYucGFyZW50KSwKKwkJCQkJCSAgICAgJmRldl9pZCk7CisJaWYgKGNkZXYpIHsKKwkJLyoKKwkJICogU2NoZWR1bGUgbW92aW5nIHRoZSBkZXZpY2UgdW50aWwgd2hlbiB3ZSBoYXZlIGEgcmVnaXN0ZXJlZAorCQkgKiBzdWJjaGFubmVsIHRvIG1vdmUgdG8gYW5kIHN1Y2NlZWQgdGhlIHByb2JlLiBXZSBjYW4KKwkJICogdW5yZWdpc3RlciBsYXRlciBhZ2Fpbiwgd2hlbiB0aGUgcHJvYmUgaXMgdGhyb3VnaC4KKwkJICovCisJCWNkZXYtPnByaXZhdGUtPnNjaCA9IHNjaDsKKwkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCisJCQkgICAgIGNjd19kZXZpY2VfbW92ZV90b19zY2gpOworCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CisJCXJldHVybiAwOwogCX0KLQlhdG9taWNfc2V0KCZjZGV2LT5wcml2YXRlLT5vbm9mZiwgMCk7Ci0JY2Rldi0+ZGV2LnBhcmVudCA9ICZzY2gtPmRldjsKLQljZGV2LT5kZXYucmVsZWFzZSA9IGNjd19kZXZpY2VfcmVsZWFzZTsKLQlJTklUX0xJU1RfSEVBRCgmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLmVudHJ5KTsKLQkvKiBEbyBmaXJzdCBoYWxmIG9mIGRldmljZV9yZWdpc3Rlci4gKi8KLQlkZXZpY2VfaW5pdGlhbGl6ZSgmY2Rldi0+ZGV2KTsKLQotCWlmICghZ2V0X2RldmljZSgmc2NoLT5kZXYpKSB7Ci0JCWlmIChjZGV2LT5kZXYucmVsZWFzZSkKLQkJCWNkZXYtPmRldi5yZWxlYXNlKCZjZGV2LT5kZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJY2RldiA9IGlvX3N1YmNoYW5uZWxfY3JlYXRlX2Njd2RldihzY2gpOworCWlmIChJU19FUlIoY2RldikpCisJCXJldHVybiBQVFJfRVJSKGNkZXYpOwogCiAJcmMgPSBpb19zdWJjaGFubmVsX3JlY29nKGNkZXYsIHNjaCk7CiAJaWYgKHJjKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzY2gtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoc2NoLT5sb2NrLCBmbGFncyk7CiAJCXNjaC0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NoLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NoLT5sb2NrLCBmbGFncyk7CiAJCWlmIChjZGV2LT5kZXYucmVsZWFzZSkKIAkJCWNkZXYtPmRldi5yZWxlYXNlKCZjZGV2LT5kZXYpOwogCX0KQEAgLTg3OSwxNyArMTEyMyw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZAotY2N3X2RldmljZV91bnJlZ2lzdGVyKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7Ci0KLQljZGV2ID0gKHN0cnVjdCBjY3dfZGV2aWNlICopZGF0YTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDEsICZjZGV2LT5wcml2YXRlLT5yZWdpc3RlcmVkKSkKLQkJZGV2aWNlX3VucmVnaXN0ZXIoJmNkZXYtPmRldik7Ci0JcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKLX0KLQogc3RhdGljIGludAogaW9fc3ViY2hhbm5lbF9yZW1vdmUgKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCiB7CkBAIC05MTAsNyArMTE0Myw3IEBACiAJICovCiAJaWYgKGdldF9kZXZpY2UoJmNkZXYtPmRldikpIHsKIAkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2VfdW5yZWdpc3RlciwgY2Rldik7CisJCQkgICAgIGNjd19kZXZpY2VfdW5yZWdpc3Rlcik7CiAJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC05NDksNiArMTE4Miw5IEBACiAJY2RldiA9IGRldi0+ZHJpdmVyX2RhdGE7CiAJaWYgKCFjZGV2KQogCQlyZXR1cm47CisJLyogSW50ZXJuYWwgSS9PIHdpbGwgYmUgcmV0cmllZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuICovCisJaWYgKGNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5KQorCQlyZXR1cm47CiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfQ0xFQVJfVkVSSUZZOwogCWlmIChjZGV2LT5oYW5kbGVyKQogCQljZGV2LT5oYW5kbGVyKGNkZXYsIGNkZXYtPnByaXZhdGUtPmludHBhcm0sCkBAIC05ODksNiArMTIyNSwxMyBAQAogc3RhdGljIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgY29uc29sZV9wcml2YXRlOwogc3RhdGljIGludCBjb25zb2xlX2NkZXZfaW5fdXNlOwogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNjd19jb25zb2xlX2xvY2spOworCitzcGlubG9ja190ICogY2lvX2dldF9jb25zb2xlX2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gJmNjd19jb25zb2xlX2xvY2s7Cit9CisKIHN0YXRpYyBpbnQKIGNjd19kZXZpY2VfY29uc29sZV9lbmFibGUgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewpAQCAtMTAzNCw2ICsxMjc3LDcgQEAKIAltZW1zZXQoJmNvbnNvbGVfY2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBjY3dfZGV2aWNlKSk7CiAJbWVtc2V0KCZjb25zb2xlX3ByaXZhdGUsIDAsIHNpemVvZihzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlKSk7CiAJY29uc29sZV9jZGV2LnByaXZhdGUgPSAmY29uc29sZV9wcml2YXRlOworCWNvbnNvbGVfcHJpdmF0ZS5jZGV2ID0gJmNvbnNvbGVfY2RldjsKIAlyZXQgPSBjY3dfZGV2aWNlX2NvbnNvbGVfZW5hYmxlKCZjb25zb2xlX2NkZXYsIHNjaCk7CiAJaWYgKHJldCkgewogCQljaW9fcmVsZWFzZV9jb25zb2xlKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuaAppbmRleCBjNjE0MGNjLi4yOWRiNjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmgKQEAgLTc4LDkgKzc4LDEwIEBACiAKIGludCBjY3dfZGV2aWNlX2NhbmNlbF9oYWx0X2NsZWFyKHN0cnVjdCBjY3dfZGV2aWNlICopOwogCi1pbnQgY2N3X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgY2N3X2RldmljZSAqKTsKLXZvaWQgY2N3X2RldmljZV9kb191bnJlZ19yZXJlZyh2b2lkICopOwotdm9pZCBjY3dfZGV2aWNlX2NhbGxfc2NoX3VucmVnaXN0ZXIodm9pZCAqKTsKK3ZvaWQgY2N3X2RldmljZV9kb191bnJlZ19yZXJlZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7Cit2b2lkIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3RlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7Cit2b2lkIGNjd19kZXZpY2VfbW92ZV90b19vcnBoYW5hZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICopOworaW50IGNjd19kZXZpY2VfaXNfb3JwaGFuKHN0cnVjdCBjY3dfZGV2aWNlICopOwogCiBpbnQgY2N3X2RldmljZV9yZWNvZ25pdGlvbihzdHJ1Y3QgY2N3X2RldmljZSAqKTsKIGludCBjY3dfZGV2aWNlX29ubGluZShzdHJ1Y3QgY2N3X2RldmljZSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKaW5kZXggZmNhZjI4ZC4uZWVkMTQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKQEAgLTU5LDYgKzU5LDI3IEBACiAJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfRElTQ09OTkVDVEVEOwogfQogCit2b2lkIGRldmljZV9zZXRfaW50cmV0cnkoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3sKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKKworCWNkZXYgPSBzY2gtPmRldi5kcml2ZXJfZGF0YTsKKwlpZiAoIWNkZXYpCisJCXJldHVybjsKKwljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDE7Cit9CisKK2ludCBkZXZpY2VfdHJpZ2dlcl92ZXJpZnkoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3sKKwlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKKworCWNkZXYgPSBzY2gtPmRldi5kcml2ZXJfZGF0YTsKKwlpZiAoIWNkZXYgfHwgIWNkZXYtPm9ubGluZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2X2ZzbV9ldmVudChjZGV2LCBERVZfRVZFTlRfVkVSSUZZKTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFRpbWVvdXQgZnVuY3Rpb24uIEl0IGp1c3QgdHJpZ2dlcnMgYSBERVZfRVZFTlRfVElNRU9VVC4KICAqLwpAQCAtMTY1LDE1ICsxODYsMTQgQEAKIAkvKgogCSAqIENoZWNrIGlmIGN1IHR5cGUgYW5kIGRldmljZSB0eXBlIHN0aWxsIG1hdGNoLiBJZgogCSAqIG5vdCwgaXQgaXMgY2VydGFpbmx5IGFub3RoZXIgZGV2aWNlIGFuZCB3ZSBoYXZlIHRvCi0JICogZGUtIGFuZCByZS1yZWdpc3Rlci4gQWxzbyBjaGVjayBoZXJlIGZvciBub24tbWF0Y2hpbmcgZGV2bm8uCisJICogZGUtIGFuZCByZS1yZWdpc3Rlci4KIAkgKi8KIAlpZiAoY2Rldi0+aWQuY3VfdHlwZSAhPSBjZGV2LT5wcml2YXRlLT5zZW5zZWlkLmN1X3R5cGUgfHwKIAkgICAgY2Rldi0+aWQuY3VfbW9kZWwgIT0gY2Rldi0+cHJpdmF0ZS0+c2Vuc2VpZC5jdV9tb2RlbCB8fAogCSAgICBjZGV2LT5pZC5kZXZfdHlwZSAhPSBjZGV2LT5wcml2YXRlLT5zZW5zZWlkLmRldl90eXBlIHx8Ci0JICAgIGNkZXYtPmlkLmRldl9tb2RlbCAhPSBjZGV2LT5wcml2YXRlLT5zZW5zZWlkLmRldl9tb2RlbCB8fAotCSAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8gIT0gc2NoLT5zY2hpYi5wbWN3LmRldikgeworCSAgICBjZGV2LT5pZC5kZXZfbW9kZWwgIT0gY2Rldi0+cHJpdmF0ZS0+c2Vuc2VpZC5kZXZfbW9kZWwpIHsKIAkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2VfZG9fdW5yZWdfcmVyZWcsIGNkZXYpOworCQkJICAgICBjY3dfZGV2aWNlX2RvX3VucmVnX3JlcmVnKTsKIAkJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zMDgsMTkgKzMyOCwyMSBAQAogfQogCiBzdGF0aWMgdm9pZAotY2N3X2RldmljZV9vcGVyX25vdGlmeSh2b2lkICpkYXRhKQorY2N3X2RldmljZV9vcGVyX25vdGlmeShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCWludCByZXQ7CiAKLQljZGV2ID0gZGF0YTsKKwlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7CisJY2RldiA9IHByaXYtPmNkZXY7CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAlyZXQgPSAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPm5vdGlmeSkgPwogCQlzY2gtPmRyaXZlci0+bm90aWZ5KCZzY2gtPmRldiwgQ0lPX09QRVIpIDogMDsKIAlpZiAoIXJldCkKIAkJLyogRHJpdmVyIGRvZXNuJ3Qgd2FudCBkZXZpY2UgYmFjay4gKi8KLQkJY2N3X2RldmljZV9kb191bnJlZ19yZXJlZyhjZGV2KTsKKwkJY2N3X2RldmljZV9kb191bnJlZ19yZXJlZyh3b3JrKTsKIAllbHNlIHsKIAkJLyogUmVlbmFibGUgY2hhbm5lbCBtZWFzdXJlbWVudHMsIGlmIG5lZWRlZC4gKi8KIAkJY21mX3JlZW5hYmxlKGNkZXYpOwpAQCAtMzU2LDggKzM3OCw3IEBACiAKIAlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG9ub3RpZnkpIHsKIAkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG9ub3RpZnkgPSAwOwotCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywgY2N3X2RldmljZV9vcGVyX25vdGlmeSwKLQkJCSAgICAgY2Rldik7CisJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLCBjY3dfZGV2aWNlX29wZXJfbm90aWZ5KTsKIAkJcXVldWVfd29yayhjY3dfZGV2aWNlX25vdGlmeV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAl9CiAJd2FrZV91cCgmY2Rldi0+cHJpdmF0ZS0+d2FpdF9xKTsKQEAgLTUwNywxMyArNTI4LDE1IEBACiAKIAogc3RhdGljIHZvaWQKLWNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSh2b2lkICpkYXRhKQorY2N3X2RldmljZV9ub3BhdGhfbm90aWZ5KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgY2N3X2RldmljZV9wcml2YXRlICpwcml2OwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CiAJaW50IHJldDsKIAotCWNkZXYgPSBkYXRhOworCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKKwljZGV2ID0gcHJpdi0+Y2RldjsKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCS8qIEV4dHJhIHNhbml0eS4gKi8KIAlpZiAoc2NoLT5scG0pCkBAIC01MjYsOCArNTQ5LDcgQEAKIAkJCWNpb19kaXNhYmxlX3N1YmNoYW5uZWwoc2NoKTsKIAkJCWlmIChnZXRfZGV2aWNlKCZjZGV2LT5kZXYpKSB7CiAJCQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkJCSAgICAgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyLAotCQkJCQkgICAgIGNkZXYpOworCQkJCQkgICAgIGNjd19kZXZpY2VfY2FsbF9zY2hfdW5yZWdpc3Rlcik7CiAJCQkJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssCiAJCQkJCSAgICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwogCQkJfSBlbHNlCkBAIC01NzgsMTEgKzYwMCwxNSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgLUVUSU1FOgorCQkvKiBSZXNldCBvcGVyIG5vdGlmeSBpbmRpY2F0aW9uIGFmdGVyIHZlcmlmeSBlcnJvci4gKi8KKwkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG9ub3RpZnkgPSAwOwogCQljY3dfZGV2aWNlX2RvbmUoY2RldiwgREVWX1NUQVRFX0JPWEVEKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJLyogUmVzZXQgb3BlciBub3RpZnkgaW5kaWNhdGlvbiBhZnRlciB2ZXJpZnkgZXJyb3IuICovCisJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvbm90aWZ5ID0gMDsKIAkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSwgY2Rldik7CisJCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSk7CiAJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV9ub3RpZnlfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiAJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfTk9UX09QRVIpOwogCQlicmVhazsKQEAgLTY0OSw2ICs2NzUsMTAgQEAKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCisJaWYgKGNjd19kZXZpY2VfaXNfb3JwaGFuKGNkZXYpKSB7CisJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfT0ZGTElORSk7CisJCXJldHVybiAwOworCX0KIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCWlmIChzdHNjaChzY2gtPnNjaGlkLCAmc2NoLT5zY2hpYikgfHwgIXNjaC0+c2NoaWIucG1jdy5kbnYpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNzEzLDcgKzc0Myw3IEBACiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAlpZiAoZ2V0X2RldmljZSgmY2Rldi0+ZGV2KSkgewogCQlQUkVQQVJFX1dPUksoJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yaywKLQkJCSAgICAgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyLCBjZGV2KTsKKwkJCSAgICAgY2N3X2RldmljZV9jYWxsX3NjaF91bnJlZ2lzdGVyKTsKIAkJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwogCX0KIAl3YWtlX3VwKCZjZGV2LT5wcml2YXRlLT53YWl0X3EpOwpAQCAtNzQ0LDcgKzc3NCw3IEBACiAJfQogCWlmIChnZXRfZGV2aWNlKCZjZGV2LT5kZXYpKSB7CiAJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJICAgICBjY3dfZGV2aWNlX2NhbGxfc2NoX3VucmVnaXN0ZXIsIGNkZXYpOworCQkJICAgICBjY3dfZGV2aWNlX2NhbGxfc2NoX3VucmVnaXN0ZXIpOwogCQlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiAJfQogCXdha2VfdXAoJmNkZXYtPnByaXZhdGUtPndhaXRfcSk7CkBAIC04NDksNyArODc5LDcgQEAKIAkJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAkJaWYgKCFzY2gtPmxwbSkgewogCQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnksIGNkZXYpOworCQkJCSAgICAgY2N3X2RldmljZV9ub3BhdGhfbm90aWZ5KTsKIAkJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV9ub3RpZnlfd29yaywKIAkJCQkgICAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAkJfSBlbHNlCkBAIC04ODksNiArOTE5LDEyIEBACiAJICogaGFkIGtpbGxlZCB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KIAkgKi8KIAlpZiAoaXJiLT5zY3N3LmZjdGwgJiAoU0NTV19GQ1RMX0NMRUFSX0ZVTkMgfCBTQ1NXX0ZDVExfSEFMVF9GVU5DKSkgeworCQkvKiBSZXRyeSBCYXNpYyBTZW5zZSBpZiByZXF1ZXN0ZWQuICovCisJCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSkgeworCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOworCQkJY2N3X2RldmljZV9kb19zZW5zZShjZGV2LCBpcmIpOworCQkJcmV0dXJuOworCQl9CiAJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmRvc2Vuc2UgPSAwOwogCQltZW1zZXQoJmNkZXYtPnByaXZhdGUtPmlyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKIAkJY2N3X2RldmljZV9hY2N1bXVsYXRlX2lyYihjZGV2LCBpcmIpOwpAQCAtOTM4LDcgKzk3NCw3IEBACiAJCQkgICAgICBFUlJfUFRSKC1FSU8pKTsKIAlpZiAoIXNjaC0+bHBtKSB7CiAJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnksIGNkZXYpOworCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnkpOwogCQlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfbm90aWZ5X3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwogCX0gZWxzZSBpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZG92ZXJpZnkpCiAJCS8qIFN0YXJ0IGRlbGF5ZWQgcGF0aCB2ZXJpZmljYXRpb24uICovCkBAIC05NjEsNyArOTk3LDcgQEAKIAkJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAkJaWYgKCFzY2gtPmxwbSkgewogCQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkJICAgICBjY3dfZGV2aWNlX25vcGF0aF9ub3RpZnksIGNkZXYpOworCQkJCSAgICAgY2N3X2RldmljZV9ub3BhdGhfbm90aWZ5KTsKIAkJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV9ub3RpZnlfd29yaywKIAkJCQkgICAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAkJfSBlbHNlCkBAIC05OTAsNyArMTAyNiw3IEBACiAJaWYgKHJldCA9PSAtRU5PREVWKSB7CiAJCWlmICghc2NoLT5scG0pIHsKIAkJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJCSAgICAgY2N3X2RldmljZV9ub3BhdGhfbm90aWZ5LCBjZGV2KTsKKwkJCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSk7CiAJCQlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfbm90aWZ5X3dvcmssCiAJCQkJICAgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiAJCX0gZWxzZQpAQCAtMTAwMiw3ICsxMDM4LDcgQEAKIAkJCSAgICAgIEVSUl9QVFIoLUVJTykpOwogCWlmICghc2NoLT5scG0pIHsKIAkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSwgY2Rldik7CisJCQkgICAgIGNjd19kZXZpY2Vfbm9wYXRoX25vdGlmeSk7CiAJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV9ub3RpZnlfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CiAJfSBlbHNlCiAJCS8qIFN0YXJ0IGRlbGF5ZWQgcGF0aCB2ZXJpZmljYXRpb24uICovCkBAIC0xMDczLDcgKzExMDksOCBAQAogCS8qIFVwZGF0ZSBzb21lIHZhbHVlcy4gKi8KIAlpZiAoc3RzY2goc2NoLT5zY2hpZCwgJnNjaC0+c2NoaWIpKQogCQlyZXR1cm47Ci0KKwlpZiAoIXNjaC0+c2NoaWIucG1jdy5kbnYpCisJCXJldHVybjsKIAkvKgogCSAqIFRoZSBwaW0sIHBhbSwgcG9tIHZhbHVlcyBtYXkgbm90IGJlIGFjY3VyYXRlLCBidXQgdGhleSBhcmUgdGhlIGJlc3QKIAkgKiB3ZSBoYXZlIGJlZm9yZSBwZXJmb3JtaW5nIGRldmljZSBzZWxlY3Rpb24gOi8KQEAgLTEwODcsNyArMTEyNCwxMyBAQAogCQlzY2gtPnNjaGliLnBtY3cubXAgPSAxOwogCXNjaC0+c2NoaWIucG1jdy5pbnRwYXJtID0gKF9fdTMyKSh1bnNpZ25lZCBsb25nKXNjaDsKIAkvKiBXZSBzaG91bGQgYWxzbyB1ZGF0ZSBzc2QgaW5mbywgYnV0IHRoaXMgaGFzIHRvIHdhaXQuICovCi0JY2N3X2RldmljZV9zdGFydF9pZChjZGV2LCAwKTsKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGFub3RoZXIgZGV2aWNlIHdoaWNoIGFwcGVhcmVkIG9uIHRoZSBzYW1lIHNjaC4gKi8KKwlpZiAoc2NoLT5zY2hpYi5wbWN3LmRldiAhPSBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8pIHsKKwkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCisJCQkgICAgIGNjd19kZXZpY2VfbW92ZV90b19vcnBoYW5hZ2UpOworCQlxdWV1ZV93b3JrKGNjd19kZXZpY2Vfd29yaywgJmNkZXYtPnByaXZhdGUtPmtpY2tfd29yayk7CisJfSBlbHNlCisJCWNjd19kZXZpY2Vfc3RhcnRfaWQoY2RldiwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfaWQuYwppbmRleCBhNzQ3ODViLi5mMTcyNzU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9pZC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2lkLmMKQEAgLTE5MSw2ICsxOTEsOCBAQAogCQlpZiAoKHNjaC0+b3BtICYgY2Rldi0+cHJpdmF0ZS0+aW1hc2spICE9IDAgJiYKIAkJICAgIGNkZXYtPnByaXZhdGUtPmlyZXRyeSA+IDApIHsKIAkJCWNkZXYtPnByaXZhdGUtPmlyZXRyeS0tOworCQkJLyogUmVzZXQgaW50ZXJuYWwgcmV0cnkgaW5kaWNhdGlvbi4gKi8KKwkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKIAkJCXJldCA9IGNpb19zdGFydCAoc2NoLCBjZGV2LT5wcml2YXRlLT5pY2N3cywKIAkJCQkJIGNkZXYtPnByaXZhdGUtPmltYXNrKTsKIAkJCS8qIHJldCBpcyAwLCAtRUJVU1ksIC1FQUNDRVMgb3IgLUVOT0RFViAqLwpAQCAtMjM3LDggKzIzOSwxNCBAQAogCQlyZXR1cm4gMDsgLyogU3VjY2VzcyAqLwogCX0KIAkvKiBDaGVjayB0aGUgZXJyb3IgY2FzZXMuICovCi0JaWYgKGlyYi0+c2Nzdy5mY3RsICYgKFNDU1dfRkNUTF9IQUxUX0ZVTkMgfCBTQ1NXX0ZDVExfQ0xFQVJfRlVOQykpCisJaWYgKGlyYi0+c2Nzdy5mY3RsICYgKFNDU1dfRkNUTF9IQUxUX0ZVTkMgfCBTQ1NXX0ZDVExfQ0xFQVJfRlVOQykpIHsKKwkJLyogUmV0cnkgU2Vuc2UgSUQgaWYgcmVxdWVzdGVkLiAqLworCQlpZiAoY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkpIHsKKwkJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CiAJCXJldHVybiAtRVRJTUU7CisJfQogCWlmIChpcmItPmVzdy5lc3cwLmVydy5jb25zICYmIChpcmItPmVjd1swXSAmIFNOUzBfQ01EX1JFSkVDVCkpIHsKIAkJLyoKIAkJICogaWYgdGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgdGhlIFNlbnNlSUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKaW5kZXggYjM5YzFmYS4uZDI2OTYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKQEAgLTMxNiw5ICszMTYsOSBAQAogCQkJY2N3X2RldmljZV9zZXRfdGltZW91dChjZGV2LCAwKTsKIAkJaWYgKHJldCA9PSAtRUJVU1kpIHsKIAkJCS8qIFRyeSBhZ2FpbiBsYXRlci4gKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmc2NoLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCQkJbXNsZWVwKDEwKTsKLQkJCXNwaW5fbG9ja19pcnEoJnNjaC0+bG9jayk7CisJCQlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAocmV0ICE9IDApCkBAIC0zMjYsMTIgKzMyNiwxMiBAQAogCQkJYnJlYWs7CiAJCS8qIFdhaXQgZm9yIGVuZCBvZiByZXF1ZXN0LiAqLwogCQljZGV2LT5wcml2YXRlLT5pbnRwYXJtID0gbWFnaWM7Ci0JCXNwaW5fdW5sb2NrX2lycSgmc2NoLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CiAJCXdhaXRfZXZlbnQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLAogCQkJICAgKGNkZXYtPnByaXZhdGUtPmludHBhcm0gPT0gLUVJTykgfHwKIAkJCSAgIChjZGV2LT5wcml2YXRlLT5pbnRwYXJtID09IC1FQUdBSU4pIHx8CiAJCQkgICAoY2Rldi0+cHJpdmF0ZS0+aW50cGFybSA9PSAwKSk7Ci0JCXNwaW5fbG9ja19pcnEoJnNjaC0+bG9jayk7CisJCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKIAkJLyogQ2hlY2sgYXQgbGVhc3QgZm9yIGNoYW5uZWwgZW5kIC8gZGV2aWNlIGVuZCAqLwogCQlpZiAoY2Rldi0+cHJpdmF0ZS0+aW50cGFybSA9PSAtRUlPKSB7CiAJCQkvKiBOb24tcmV0cnlhYmxlIGVycm9yLiAqLwpAQCAtMzQyLDkgKzM0Miw5IEBACiAJCQkvKiBTdWNjZXNzLiAqLwogCQkJYnJlYWs7CiAJCS8qIFRyeSBhZ2FpbiBsYXRlci4gKi8KLQkJc3Bpbl91bmxvY2tfaXJxKCZzY2gtPmxvY2spOworCQlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKIAkJbXNsZWVwKDEwKTsKLQkJc3Bpbl9sb2NrX2lycSgmc2NoLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwogCX0gd2hpbGUgKDEpOwogCiAJcmV0dXJuIHJldDsKQEAgLTM4OSw3ICszODksNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXNwaW5fbG9ja19pcnEoJnNjaC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwogCS8qIFNhdmUgaW50ZXJydXB0IGhhbmRsZXIuICovCiAJaGFuZGxlciA9IGNkZXYtPmhhbmRsZXI7CiAJLyogVGVtcG9yYXJpbHkgaW5zdGFsbCBvd24gaGFuZGxlci4gKi8KQEAgLTQwNiw3ICs0MDYsNyBAQAogCiAJLyogUmVzdG9yZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KIAljZGV2LT5oYW5kbGVyID0gaGFuZGxlcjsKLQlzcGluX3VubG9ja19pcnEoJnNjaC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CiAKIAljbGVhcl9ub3JtYWxpemVkX2NkYSAocmRjX2Njdyk7CiAJa2ZyZWUocmRjX2Njdyk7CkBAIC00NjMsNyArNDYzLDcgQEAKIAlyY2RfY2N3LT5jb3VudCA9IGNpdy0+Y291bnQ7CiAJcmNkX2Njdy0+ZmxhZ3MgPSBDQ1dfRkxBR19TTEk7CiAKLQlzcGluX2xvY2tfaXJxKCZzY2gtPmxvY2spOworCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKIAkvKiBTYXZlIGludGVycnVwdCBoYW5kbGVyLiAqLwogCWhhbmRsZXIgPSBjZGV2LT5oYW5kbGVyOwogCS8qIFRlbXBvcmFyaWx5IGluc3RhbGwgb3duIGhhbmRsZXIuICovCkBAIC00ODAsNyArNDgwLDcgQEAKIAogCS8qIFJlc3RvcmUgaW50ZXJydXB0IGhhbmRsZXIuICovCiAJY2Rldi0+aGFuZGxlciA9IGhhbmRsZXI7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZzY2gtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCiAgCS8qCiAgCSAqIG9uIHN1Y2Nlc3Mgd2UgdXBkYXRlIHRoZSB1c2VyIGlucHV0IHBhcm1zCkBAIC01MzcsNyArNTM3LDcgQEAKIAkJa2ZyZWUoYnVmKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXNwaW5fbG9ja19pcnFzYXZlKCZzY2gtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShzY2gtPmxvY2ssIGZsYWdzKTsKIAlyZXQgPSBjaW9fZW5hYmxlX3N1YmNoYW5uZWwoc2NoLCAzKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC01NTksOSArNTU5LDkgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAljZGV2LT5wcml2YXRlLT5pcmIuc2Nzdy5hY3RsIHw9IFNDU1dfQUNUTF9TVEFSVF9QRU5EOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NoLT5sb2NrLCBmbGFncyk7CiAJd2FpdF9ldmVudChjZGV2LT5wcml2YXRlLT53YWl0X3EsIGNkZXYtPnByaXZhdGUtPmlyYi5zY3N3LmFjdGwgPT0gMCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNjaC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKHNjaC0+bG9jaywgZmxhZ3MpOwogCWNpb19kaXNhYmxlX3N1YmNoYW5uZWwoc2NoKTsgLy9GSVhNRTogcmV0dXJuIGNvZGU/CiAJaWYgKChjZGV2LT5wcml2YXRlLT5pcmIuc2Nzdy5kc3RhdCAhPQogCSAgICAgKERFVl9TVEFUX0NITl9FTkR8REVWX1NUQVRfREVWX0VORCkpIHx8CkBAIC01NzIsNyArNTcyLDcgQEAKIG91dF91bmxvY2s6CiAJa2ZyZWUoYnVmKTsKIAlrZnJlZShidWYyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2gtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNjaC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3BnaWQuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3BnaWQuYwppbmRleCAyOTc1Y2U4Li5jYjE4NzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9wZ2lkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfcGdpZC5jCkBAIC03MSw2ICs3MSw4IEBACiAJCWNjdy0+Y2RhID0gKF9fdTMyKSBfX3BhICgmY2Rldi0+cHJpdmF0ZS0+cGdpZFtpXSk7CiAJCWlmIChjZGV2LT5wcml2YXRlLT5pcmV0cnkgPiAwKSB7CiAJCQljZGV2LT5wcml2YXRlLT5pcmV0cnktLTsKKwkJCS8qIFJlc2V0IGludGVybmFsIHJldHJ5IGluZGljYXRpb24uICovCisJCQljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7CiAJCQlyZXQgPSBjaW9fc3RhcnQgKHNjaCwgY2Rldi0+cHJpdmF0ZS0+aWNjd3MsIAogCQkJCQkgY2Rldi0+cHJpdmF0ZS0+aW1hc2spOwogCQkJLyogcmV0IGlzIDAsIC1FQlVTWSwgLUVBQ0NFUyBvciAtRU5PREVWICovCkBAIC0xMjIsOCArMTI0LDE0IEBACiAKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCWlyYiA9ICZjZGV2LT5wcml2YXRlLT5pcmI7Ci0JaWYgKGlyYi0+c2Nzdy5mY3RsICYgKFNDU1dfRkNUTF9IQUxUX0ZVTkMgfCBTQ1NXX0ZDVExfQ0xFQVJfRlVOQykpCisJaWYgKGlyYi0+c2Nzdy5mY3RsICYgKFNDU1dfRkNUTF9IQUxUX0ZVTkMgfCBTQ1NXX0ZDVExfQ0xFQVJfRlVOQykpIHsKKwkJLyogUmV0cnkgU2Vuc2UgUEdJRCBpZiByZXF1ZXN0ZWQuICovCisJCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSkgeworCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KIAkJcmV0dXJuIC1FVElNRTsKKwl9CiAJaWYgKGlyYi0+ZXN3LmVzdzAuZXJ3LmNvbnMgJiYKIAkgICAgKGlyYi0+ZWN3WzBdJihTTlMwX0NNRF9SRUpFQ1R8U05TMF9JTlRFUlZFTlRJT05fUkVRKSkpIHsKIAkJLyoKQEAgLTI1Myw2ICsyNjEsOCBAQAogCXJldCA9IC1FQUNDRVM7CiAJaWYgKGNkZXYtPnByaXZhdGUtPmlyZXRyeSA+IDApIHsKIAkJY2Rldi0+cHJpdmF0ZS0+aXJldHJ5LS07CisJCS8qIFJlc2V0IGludGVybmFsIHJldHJ5IGluZGljYXRpb24uICovCisJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKIAkJcmV0ID0gY2lvX3N0YXJ0IChzY2gsIGNkZXYtPnByaXZhdGUtPmljY3dzLAogCQkJCSBjZGV2LT5wcml2YXRlLT5pbWFzayk7CiAJCS8qIFdlIGV4cGVjdCBhbiBpbnRlcnJ1cHQgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGJ1c3kKQEAgLTI5Myw2ICszMDMsOCBAQAogCXJldCA9IC1FQUNDRVM7CiAJaWYgKGNkZXYtPnByaXZhdGUtPmlyZXRyeSA+IDApIHsKIAkJY2Rldi0+cHJpdmF0ZS0+aXJldHJ5LS07CisJCS8qIFJlc2V0IGludGVybmFsIHJldHJ5IGluZGljYXRpb24uICovCisJCWNkZXYtPnByaXZhdGUtPmZsYWdzLmludHJldHJ5ID0gMDsKIAkJcmV0ID0gY2lvX3N0YXJ0IChzY2gsIGNkZXYtPnByaXZhdGUtPmljY3dzLAogCQkJCSBjZGV2LT5wcml2YXRlLT5pbWFzayk7CiAJCS8qIFdlIGV4cGVjdCBhbiBpbnRlcnJ1cHQgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGJ1c3kKQEAgLTMyMSw4ICszMzMsMTQgQEAKIAogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAJaXJiID0gJmNkZXYtPnByaXZhdGUtPmlyYjsKLQlpZiAoaXJiLT5zY3N3LmZjdGwgJiAoU0NTV19GQ1RMX0hBTFRfRlVOQyB8IFNDU1dfRkNUTF9DTEVBUl9GVU5DKSkKKwlpZiAoaXJiLT5zY3N3LmZjdGwgJiAoU0NTV19GQ1RMX0hBTFRfRlVOQyB8IFNDU1dfRkNUTF9DTEVBUl9GVU5DKSkgeworCQkvKiBSZXRyeSBTZXQgUEdJRCBpZiByZXF1ZXN0ZWQuICovCisJCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSkgeworCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KIAkJcmV0dXJuIC1FVElNRTsKKwl9CiAJaWYgKGlyYi0+ZXN3LmVzdzAuZXJ3LmNvbnMpIHsKIAkJaWYgKGlyYi0+ZWN3WzBdICYgU05TMF9DTURfUkVKRUNUKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMzYwLDggKzM3OCwxNCBAQAogCiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAlpcmIgPSAmY2Rldi0+cHJpdmF0ZS0+aXJiOwotCWlmIChpcmItPnNjc3cuZmN0bCAmIChTQ1NXX0ZDVExfSEFMVF9GVU5DIHwgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpKQorCWlmIChpcmItPnNjc3cuZmN0bCAmIChTQ1NXX0ZDVExfSEFMVF9GVU5DIHwgU0NTV19GQ1RMX0NMRUFSX0ZVTkMpKSB7CisJCS8qIFJldHJ5IE5PUCBpZiByZXF1ZXN0ZWQuICovCisJCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSkgeworCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuaW50cmV0cnkgPSAwOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KIAkJcmV0dXJuIC1FVElNRTsKKwl9CiAJaWYgKGlyYi0+c2Nzdy5jYyA9PSAzKSB7CiAJCUNJT19NU0dfRVZFTlQoMiwgIk5PUCAtIERldmljZSAlMDR4IG9uIFN1YmNoYW5uZWwgMC4leC4lMDR4LCIKIAkJCSAgICAgICIgbHBtICUwMlgsIGJlY2FtZSAnbm90IG9wZXJhdGlvbmFsJ1xuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX3N0YXR1cy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMKaW5kZXggM2Y3Y2JjZS4uYmRjZjkzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMKQEAgLTMxOSw2ICszMTksOSBAQAogCXNjaC0+c2Vuc2VfY2N3LmNvdW50ID0gU0VOU0VfTUFYX0NPVU5UOwogCXNjaC0+c2Vuc2VfY2N3LmZsYWdzID0gQ0NXX0ZMQUdfU0xJOwogCisJLyogUmVzZXQgaW50ZXJuYWwgcmV0cnkgaW5kaWNhdGlvbi4gKi8KKwljZGV2LT5wcml2YXRlLT5mbGFncy5pbnRyZXRyeSA9IDA7CisKIAlyZXR1cm4gY2lvX3N0YXJ0IChzY2gsICZzY2gtPnNlbnNlX2NjdywgMHhmZik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMKaW5kZXggMDY0OGNlNS4uOWQ0ZWE0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxhc20vdGltZXguaD4KIAogI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KICNpbmNsdWRlIDxhc20vcWRpby5oPgogCiAjaW5jbHVkZSAiY2lvLmgiCkBAIC02NSwxMiArNjYsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKiBIRVJFIFdFIEdPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiUURJTyBiYXNlIHN1cHBvcnQgdmVyc2lvbiAyIjsKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgY2N3X2J1c190eXBlOwogCi0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUworc3RhdGljIGludCBxZGlvX3BlcmZvcm1hbmNlX3N0YXRzID0gMDsKIHN0YXRpYyBpbnQgcHJvY19wZXJmX2ZpbGVfcmVnaXN0cmF0aW9uOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaV9wX2MsIGlfcF9uYywgb19wX2MsIG9fcF9uYywgaWlfcF9jLCBpaV9wX25jOwogc3RhdGljIHN0cnVjdCBxZGlvX3BlcmZfc3RhdHMgcGVyZl9zdGF0czsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCiAKIHN0YXRpYyBpbnQgaHlkcmFfdGhpbmludHM7CiBzdGF0aWMgaW50IGlzX3Bhc3N0aHJvdWdoID0gMDsKQEAgLTI3NSw5ICsyNzYsOCBAQAogCVFESU9fREJGX1RFWFQ0KDAsdHJhY2UsInNpZ2FzeW5jIik7CiAJUURJT19EQkZfSEVYNCgwLHRyYWNlLCZxLHNpemVvZih2b2lkKikpOwogCi0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwotCXBlcmZfc3RhdHMuc2lnYV9zeW5jcysrOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KKwlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJcGVyZl9zdGF0cy5zaWdhX3N5bmNzKys7CiAKIAljYyA9IGRvX3NpZ2Ffc3luYyhxLT5zY2hpZCwgZ3ByMiwgZ3ByMyk7CiAJaWYgKGNjKQpAQCAtMzIyLDkgKzMyMiw4IEBACiAJX191MzIgYnVzeV9iaXQ7CiAJX191NjQgc3RhcnRfdGltZT0wOwogCi0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwotCXBlcmZfc3RhdHMuc2lnYV9vdXRzKys7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLworCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKQorCQlwZXJmX3N0YXRzLnNpZ2Ffb3V0cysrOwogCiAJUURJT19EQkZfVEVYVDQoMCx0cmFjZSwic2lnYW91dCIpOwogCVFESU9fREJGX0hFWDQoMCx0cmFjZSwmcSxzaXplb2Yodm9pZCopKTsKQEAgLTM1OCw5ICszNTcsOCBAQAogCVFESU9fREJGX1RFWFQ0KDAsdHJhY2UsInNpZ2FpbiIpOwogCVFESU9fREJGX0hFWDQoMCx0cmFjZSwmcSxzaXplb2Yodm9pZCopKTsKIAotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQlwZXJmX3N0YXRzLnNpZ2FfaW5zKys7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLworCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKQorCQlwZXJmX3N0YXRzLnNpZ2FfaW5zKys7CiAKIAljYyA9IGRvX3NpZ2FfaW5wdXQocS0+c2NoaWQsIHEtPm1hc2spOwogCQpAQCAtNDgxLDcgKzQ3OSw3IEBACiAgICAgICAgdW5zaWduZWQgY2hhciBzdGF0ZSA9IDA7CiAgICAgICAgc3RydWN0IHFkaW9faXJxICppcnEgPSAoc3RydWN0IHFkaW9faXJxICopIHEtPmlycV9wdHI7CiAKLQlpZiAoIWF0b21pY19zd2FwKCZxLT5wb2xsaW5nLDApKSAKKwlpZiAoIWF0b21pY194Y2hnKCZxLT5wb2xsaW5nLDApKQogCQlyZXR1cm4gMTsKIAogCVFESU9fREJGX1RFWFQ0KDAsdHJhY2UsInN0b3Bwb2xsIik7CkBAIC05NTQsOSArOTUyLDggQEAKIAogCWlmICh1bmxpa2VseShxZGlvX3Jlc2VydmVfcShxKSkpIHsKIAkJcWRpb19yZWxlYXNlX3EocSk7Ci0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwotCQlvX3BfYysrOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KKwkJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpCisJCQlvX3BfYysrOwogCQkvKiBhcyB3ZSdyZSBzaXNzaWVzLCB3ZSdsbCBjaGVjayBuZXh0IHRpbWUgKi8KIAkJaWYgKGxpa2VseSghYXRvbWljX3JlYWQoJnEtPmlzX2luX3NodXRkb3duKSkpIHsKIAkJCXFkaW9fbWFya19xKHEpOwpAQCAtOTY0LDEwICs5NjEsMTAgQEAKIAkJfQogCQlyZXR1cm47CiAJfQotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQlvX3BfbmMrKzsKLQlwZXJmX3N0YXRzLnRsX3J1bnMrKzsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCisJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpIHsKKwkJb19wX25jKys7CisJCXBlcmZfc3RhdHMudGxfcnVucysrOworCX0KIAogCS8qIHNlZSBjb21tZW50IGluIHFkaW9fa2lja19vdXRib3VuZF9xICovCiAJc2lnYV9hdHRlbXB0cz1hdG9taWNfcmVhZCgmcS0+YnVzeV9zaWdhX2NvdW50ZXIpOwpAQCAtMTE0MiwxNSArMTEzOSwxNiBAQAogewogCWludCBpOwogCi0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwogCXN0YXRpYyBpbnQgb2xkX3BjaXM9MDsKIAlzdGF0aWMgaW50IG9sZF90aGluaW50cz0wOwogCi0JaWYgKChvbGRfcGNpcz09cGVyZl9zdGF0cy5wY2lzKSYmKG9sZF90aGluaW50cz09cGVyZl9zdGF0cy50aGluaW50cykpCi0JCXBlcmZfc3RhdHMuc3RhcnRfdGltZV9pbmJvdW5kPU5PVzsKLQllbHNlCi0JCW9sZF9wY2lzPXBlcmZfc3RhdHMucGNpczsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCisJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpIHsKKwkJaWYgKChvbGRfcGNpcz09cGVyZl9zdGF0cy5wY2lzKSYmCisJCSAgICAob2xkX3RoaW5pbnRzPT1wZXJmX3N0YXRzLnRoaW5pbnRzKSkKKwkJCXBlcmZfc3RhdHMuc3RhcnRfdGltZV9pbmJvdW5kPU5PVzsKKwkJZWxzZQorCQkJb2xkX3BjaXM9cGVyZl9zdGF0cy5wY2lzOworCX0KIAogCWk9cWRpb19nZXRfaW5ib3VuZF9idWZmZXJfZnJvbnRpZXIocSk7CiAJaWYgKCAoaSE9R0VUX1NBVkVEX0ZST05USUVSKHEpKSB8fApAQCAtMTM0MCwxMCArMTMzOCwxMCBAQAogCXEtPnNpZ2FfZXJyb3I9MDsKIAlxLT5lcnJvcl9zdGF0dXNfZmxhZ3M9MDsKIAotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQlwZXJmX3N0YXRzLmluYm91bmRfdGltZSs9Tk9XLXBlcmZfc3RhdHMuc3RhcnRfdGltZV9pbmJvdW5kOwotCXBlcmZfc3RhdHMuaW5ib3VuZF9jbnQrKzsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCisJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpIHsKKwkJcGVyZl9zdGF0cy5pbmJvdW5kX3RpbWUrPU5PVy1wZXJmX3N0YXRzLnN0YXJ0X3RpbWVfaW5ib3VuZDsKKwkJcGVyZl9zdGF0cy5pbmJvdW5kX2NudCsrOworCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0xMzYzLDkgKzEzNjEsOCBAQAogCSAqLwogCWlmICh1bmxpa2VseShxZGlvX3Jlc2VydmVfcShxKSkpIHsKIAkJcWRpb19yZWxlYXNlX3EocSk7Ci0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwotCQlpaV9wX2MrKzsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCisJCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKQorCQkJaWlfcF9jKys7CiAJCS8qIAogCQkgKiBhcyB3ZSBtaWdodCBqdXN0IGJlIGFib3V0IHRvIHN0b3AgcG9sbGluZywgd2UgbWFrZQogCQkgKiBzdXJlIHRoYXQgd2UgY2hlY2sgYWdhaW4gYXQgbGVhc3Qgb25jZSBtb3JlIApAQCAtMTM3Myw5ICsxMzcwLDggQEAKIAkJdGlxZGlvX3NjaGVkX3RsKCk7CiAJCXJldHVybjsKIAl9Ci0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwotCWlpX3BfbmMrKzsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCisJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpCisJCWlpX3BfbmMrKzsKIAlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnEtPmlzX2luX3NodXRkb3duKSkpIHsKIAkJcWRpb191bm1hcmtfcShxKTsKIAkJZ290byBvdXQ7CkBAIC0xNDE2LDExICsxNDEyLDExIEBACiAJCWlycV9wdHIgPSAoc3RydWN0IHFkaW9faXJxKilxLT5pcnFfcHRyOwogCQlmb3IgKGk9MDtpPGlycV9wdHItPm5vX291dHB1dF9xcztpKyspIHsKIAkJCW9xID0gaXJxX3B0ci0+b3V0cHV0X3FzW2ldOwotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQkJCXBlcmZfc3RhdHMudGxfcnVucy0tOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KLQkJCWlmICghcWRpb19pc19vdXRib3VuZF9xX2RvbmUob3EpKQorCQkJaWYgKCFxZGlvX2lzX291dGJvdW5kX3FfZG9uZShvcSkpIHsKKwkJCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJCQkJcGVyZl9zdGF0cy50bF9ydW5zLS07CiAJCQkJX19xZGlvX291dGJvdW5kX3Byb2Nlc3Npbmcob3EpOworCQkJfQogCQl9CiAJfQogCkBAIC0xNDU3LDkgKzE0NTMsOCBAQAogCiAJaWYgKHVubGlrZWx5KHFkaW9fcmVzZXJ2ZV9xKHEpKSkgewogCQlxZGlvX3JlbGVhc2VfcShxKTsKLSNpZmRlZiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTCi0JCWlfcF9jKys7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLworCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJCWlfcF9jKys7CiAJCS8qIGFzIHdlJ3JlIHNpc3NpZXMsIHdlJ2xsIGNoZWNrIG5leHQgdGltZSAqLwogCQlpZiAobGlrZWx5KCFhdG9taWNfcmVhZCgmcS0+aXNfaW5fc2h1dGRvd24pKSkgewogCQkJcWRpb19tYXJrX3EocSk7CkBAIC0xNDY3LDEwICsxNDYyLDEwIEBACiAJCX0KIAkJcmV0dXJuOwogCX0KLSNpZmRlZiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTCi0JaV9wX25jKys7Ci0JcGVyZl9zdGF0cy50bF9ydW5zKys7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLworCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKSB7CisJCWlfcF9uYysrOworCQlwZXJmX3N0YXRzLnRsX3J1bnMrKzsKKwl9CiAKIGFnYWluOgogCWlmIChxZGlvX2hhc19pbmJvdW5kX3FfbW92ZWQocSkpIHsKQEAgLTE1MTYsOSArMTUxMSw4IEBACiAKIAlpZiAodW5saWtlbHkocWRpb19yZXNlcnZlX3EocSkpKSB7CiAJCXFkaW9fcmVsZWFzZV9xKHEpOwotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQkJaWlfcF9jKys7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLworCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJCWlpX3BfYysrOwogCQkvKiAKIAkJICogYXMgd2UgbWlnaHQganVzdCBiZSBhYm91dCB0byBzdG9wIHBvbGxpbmcsIHdlIG1ha2UKIAkJICogc3VyZSB0aGF0IHdlIGNoZWNrIGFnYWluIGF0IGxlYXN0IG9uY2UgbW9yZSAKQEAgLTE2MDksOSArMTYwMyw4IEBACiB7CiAJUURJT19EQkZfVEVYVDQoMCx0cmFjZSwiaXFkaW9fdGwiKTsKIAotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQlwZXJmX3N0YXRzLnRsX3J1bnMrKzsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCisJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpCisJCXBlcmZfc3RhdHMudGxfcnVucysrOwogCiAJdGlxZGlvX2luYm91bmRfY2hlY2tzKCk7CiB9CkBAIC0xOTE4LDEwICsxOTExLDEwIEBACiB7CiAJUURJT19EQkZfVEVYVDQoMCx0cmFjZSwidGhpbl9pbnQiKTsKIAotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQlwZXJmX3N0YXRzLnRoaW5pbnRzKys7Ci0JcGVyZl9zdGF0cy5zdGFydF90aW1lX2luYm91bmQ9Tk9XOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KKwlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykgeworCQlwZXJmX3N0YXRzLnRoaW5pbnRzKys7CisJCXBlcmZfc3RhdHMuc3RhcnRfdGltZV9pbmJvdW5kPU5PVzsKKwl9CiAKIAkvKiBTVlMgb25seSB3aGVuIG5lZWRlZDoKIAkgKiBpc3N1ZSBTVlMgdG8gYmVuZWZpdCBmcm9tIGlxZGlvIGludGVycnVwdCBhdm9pZGFuY2UKQEAgLTE5NjQsOCArMTk1Nyw4IEBACiAJCVFESU9fREJGX0hFWDAoMCxzZW5zZSxpcmIsUURJT19EQkZfU0VOU0VfTEVOKTsKIAogCQlRRElPX1BSSU5UX1dBUk4oInNlbnNlIGRhdGEgYXZhaWxhYmxlIG9uIHFkaW8gY2hhbm5lbC5cbiIpOwotCQlIRVhEVU1QMTYoV0FSTiwiaXJiOiAiLGlyYik7Ci0JCUhFWERVTVAxNihXQVJOLCJzZW5zZSBkYXRhOiAiLGlyYi0+ZWN3KTsKKwkJUURJT19IRVhEVU1QMTYoV0FSTiwiaXJiOiAiLGlyYik7CisJCVFESU9fSEVYRFVNUDE2KFdBUk4sInNlbnNlIGRhdGE6ICIsaXJiLT5lY3cpOwogCX0KIAkJCiB9CkBAIC0xOTc2LDE4ICsxOTY5LDE3IEBACiAJaW50IGk7CiAJc3RydWN0IHFkaW9fcSAqcTsKIAotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQlwZXJmX3N0YXRzLnBjaXMrKzsKLQlwZXJmX3N0YXRzLnN0YXJ0X3RpbWVfaW5ib3VuZD1OT1c7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLworCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKSB7CisJCXBlcmZfc3RhdHMucGNpcysrOworCQlwZXJmX3N0YXRzLnN0YXJ0X3RpbWVfaW5ib3VuZD1OT1c7CisJfQogCWZvciAoaT0wO2k8aXJxX3B0ci0+bm9faW5wdXRfcXM7aSsrKSB7CiAJCXE9aXJxX3B0ci0+aW5wdXRfcXNbaV07CiAJCWlmIChxLT5pc19pbnB1dF9xJlFESU9fRkxBR19OT19JTlBVVF9JTlRFUlJVUFRfQ09OVEVYVCkKIAkJCXFkaW9fbWFya19xKHEpOwogCQllbHNlIHsKLSNpZmRlZiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTCi0JCQlwZXJmX3N0YXRzLnRsX3J1bnMtLTsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCisJCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJCQlwZXJmX3N0YXRzLnRsX3J1bnMtLTsKIAkJCV9fcWRpb19pbmJvdW5kX3Byb2Nlc3NpbmcocSk7CiAJCX0KIAl9CkBAIC0xOTk1LDExICsxOTg3LDEwIEBACiAJCXJldHVybjsKIAlmb3IgKGk9MDtpPGlycV9wdHItPm5vX291dHB1dF9xcztpKyspIHsKIAkJcT1pcnFfcHRyLT5vdXRwdXRfcXNbaV07Ci0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwotCQlwZXJmX3N0YXRzLnRsX3J1bnMtLTsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCiAJCWlmIChxZGlvX2lzX291dGJvdW5kX3FfZG9uZShxKSkKIAkJCWNvbnRpbnVlOworCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJCXBlcmZfc3RhdHMudGxfcnVucy0tOwogCQlpZiAoIWlycV9wdHItPnN5bmNfZG9uZV9vbl9vdXRiX3BjaXMpCiAJCQlTWU5DX01FTU9SWTsKIAkJX19xZGlvX291dGJvdW5kX3Byb2Nlc3NpbmcocSk7CkBAIC0yMDQ1LDExICsyMDM2LDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1xZGlvX2NhbGxfc2h1dGRvd24odm9pZCAqZGF0YSkKK3FkaW9fY2FsbF9zaHV0ZG93bihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSAqcHJpdjsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldjsKIAotCWNkZXYgPSAoc3RydWN0IGNjd19kZXZpY2UgKilkYXRhOworCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNjd19kZXZpY2VfcHJpdmF0ZSwga2lja193b3JrKTsKKwljZGV2ID0gcHJpdi0+Y2RldjsKIAlxZGlvX3NodXRkb3duKGNkZXYsIFFESU9fRkxBR19DTEVBTlVQX1VTSU5HX0NMRUFSKTsKIAlwdXRfZGV2aWNlKCZjZGV2LT5kZXYpOwogfQpAQCAtMjA5MSw3ICsyMDg0LDcgQEAKIAkJaWYgKGdldF9kZXZpY2UoJmNkZXYtPmRldikpIHsKIAkJCS8qIENhbid0IGNhbGwgc2h1dGRvd24gZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gKi8KIAkJCVBSRVBBUkVfV09SSygmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLAotCQkJCSAgICAgcWRpb19jYWxsX3NodXRkb3duLCAodm9pZCAqKWNkZXYpOworCQkJCSAgICAgcWRpb19jYWxsX3NodXRkb3duKTsKIAkJCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKIAkJfQogCQlicmVhazsKQEAgLTM0MjUsNyArMzQxOCw3IEBACiAJCiAJaWYgKCh1c2VkX2VsZW1lbnRzK2NvdW50PT1RRElPX01BWF9CVUZGRVJTX1BFUl9RKSYmCiAJICAgIChjYWxsZmxhZ3MmUURJT19GTEFHX1VOREVSX0lOVEVSUlVQVCkpCi0JCWF0b21pY19zd2FwKCZxLT5wb2xsaW5nLDApOworCQlhdG9taWNfeGNoZygmcS0+cG9sbGluZywwKTsKIAkKIAlpZiAodXNlZF9lbGVtZW50cykgCiAJCXJldHVybjsKQEAgLTM0NTgsMTkgKzM0NTEsMTggQEAKIAlzdHJ1Y3QgcWRpb19pcnEgKmlycSA9IChzdHJ1Y3QgcWRpb19pcnEgKikgcS0+aXJxX3B0cjsKIAogCS8qIFRoaXMgaXMgdGhlIG91dGJvdW5kIGhhbmRsaW5nIG9mIHF1ZXVlcyAqLwotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQlwZXJmX3N0YXRzLnN0YXJ0X3RpbWVfb3V0Ym91bmQ9Tk9XOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KKwlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJcGVyZl9zdGF0cy5zdGFydF90aW1lX291dGJvdW5kPU5PVzsKIAogCXFkaW9fZG9fcWRpb19maWxsX291dHB1dChxLHFpZHgsY291bnQsYnVmZmVycyk7CiAKIAl1c2VkX2VsZW1lbnRzPWF0b21pY19hZGRfcmV0dXJuKGNvdW50LCAmcS0+bnVtYmVyX29mX2J1ZmZlcnNfdXNlZCkgLSBjb3VudDsKIAogCWlmIChjYWxsZmxhZ3MmUURJT19GTEFHX0RPTlRfU0lHQSkgewotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLQkJcGVyZl9zdGF0cy5vdXRib3VuZF90aW1lKz1OT1ctcGVyZl9zdGF0cy5zdGFydF90aW1lX291dGJvdW5kOwotCQlwZXJmX3N0YXRzLm91dGJvdW5kX2NudCsrOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KKwkJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpIHsKKwkJCXBlcmZfc3RhdHMub3V0Ym91bmRfdGltZSs9Tk9XLXBlcmZfc3RhdHMuc3RhcnRfdGltZV9vdXRib3VuZDsKKwkJCXBlcmZfc3RhdHMub3V0Ym91bmRfY250Kys7CisJCX0KIAkJcmV0dXJuOwogCX0KIAlpZiAocS0+aXNfaXFkaW9fcSkgewpAQCAtMzUwMCw5ICszNDkyLDggQEAKIAkJCQlxZGlvX2tpY2tfb3V0Ym91bmRfcShxKTsKIAkJCX0gZWxzZSB7CiAJCQkJUURJT19EQkZfVEVYVDMoMCx0cmFjZSwgImZhc3QtcmVxIik7Ci0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwotCQkJCXBlcmZfc3RhdHMuZmFzdF9yZXFzKys7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLworCQkJCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKQorCQkJCQlwZXJmX3N0YXRzLmZhc3RfcmVxcysrOwogCQkJfQogCQl9CiAJCS8qIApAQCAtMzUxMywxMCArMzUwNCwxMCBAQAogCQlfX3FkaW9fb3V0Ym91bmRfcHJvY2Vzc2luZyhxKTsKIAl9CiAKLSNpZmRlZiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTCi0JcGVyZl9zdGF0cy5vdXRib3VuZF90aW1lKz1OT1ctcGVyZl9zdGF0cy5zdGFydF90aW1lX291dGJvdW5kOwotCXBlcmZfc3RhdHMub3V0Ym91bmRfY250Kys7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLworCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKSB7CisJCXBlcmZfc3RhdHMub3V0Ym91bmRfdGltZSs9Tk9XLXBlcmZfc3RhdHMuc3RhcnRfdGltZV9vdXRib3VuZDsKKwkJcGVyZl9zdGF0cy5vdXRib3VuZF9jbnQrKzsKKwl9CiB9CiAKIC8qIGNvdW50IG11c3QgYmUgMSBpbiBpcWRpbyAqLwpAQCAtMzUyOSw3ICszNTIwLDcgQEAKICNpZmRlZiBDT05GSUdfUURJT19ERUJVRwogCWNoYXIgZGJmX3RleHRbMjBdOwogCi0Jc3ByaW50ZihkYmZfdGV4dCwiZG9RRCUwNHgiLGNkZXYtPnByaXZhdGUtPnNjaF9ubyk7CisJc3ByaW50ZihkYmZfdGV4dCwiZG9RRCUwNHgiLGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubyk7CiAgCVFESU9fREJGX1RFWFQzKDAsdHJhY2UsZGJmX3RleHQpOwogI2VuZGlmIC8qIENPTkZJR19RRElPX0RFQlVHICovCiAKQEAgLTM1NzQsNyArMzU2NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTCiBzdGF0aWMgaW50CiBxZGlvX3BlcmZfcHJvY2ZpbGVfcmVhZChjaGFyICpidWZmZXIsIGNoYXIgKipidWZmZXJfbG9jYXRpb24sIG9mZl90IG9mZnNldCwKIAkJCWludCBidWZmZXJfbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKQEAgLTM1OTAsMjkgKzM1ODAsMjkgQEAKIAlfT1VUUF9JVCgiaV9wX25jL2M9JWx1LyVsdVxuIixpX3BfbmMsaV9wX2MpOwogCV9PVVRQX0lUKCJpaV9wX25jL2M9JWx1LyVsdVxuIixpaV9wX25jLGlpX3BfYyk7CiAJX09VVFBfSVQoIm9fcF9uYy9jPSVsdS8lbHVcbiIsb19wX25jLG9fcF9jKTsKLQlfT1VUUF9JVCgiTnVtYmVyIG9mIHRhc2tsZXQgcnVucyAodG90YWwpICAgICAgICAgICAgICAgICAgOiAldVxuIiwKKwlfT1VUUF9JVCgiTnVtYmVyIG9mIHRhc2tsZXQgcnVucyAodG90YWwpICAgICAgICAgICAgICAgICAgOiAlbHVcbiIsCiAJCSBwZXJmX3N0YXRzLnRsX3J1bnMpOwogCV9PVVRQX0lUKCJcbiIpOwotCV9PVVRQX0lUKCJOdW1iZXIgb2YgU0lHQSBzeW5jJ3MgaXNzdWVkICAgICAgICAgICAgICAgICAgICA6ICV1XG4iLAorCV9PVVRQX0lUKCJOdW1iZXIgb2YgU0lHQSBzeW5jJ3MgaXNzdWVkICAgICAgICAgICAgICAgICAgICA6ICVsdVxuIiwKIAkJIHBlcmZfc3RhdHMuc2lnYV9zeW5jcyk7Ci0JX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIGluJ3MgaXNzdWVkICAgICAgICAgICAgICAgICAgICAgIDogJXVcbiIsCisJX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIGluJ3MgaXNzdWVkICAgICAgICAgICAgICAgICAgICAgIDogJWx1XG4iLAogCQkgcGVyZl9zdGF0cy5zaWdhX2lucyk7Ci0JX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIG91dCdzIGlzc3VlZCAgICAgICAgICAgICAgICAgICAgIDogJXVcbiIsCisJX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIG91dCdzIGlzc3VlZCAgICAgICAgICAgICAgICAgICAgIDogJWx1XG4iLAogCQkgcGVyZl9zdGF0cy5zaWdhX291dHMpOwotCV9PVVRQX0lUKCJOdW1iZXIgb2YgUENJcyBjYXVnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICV1XG4iLAorCV9PVVRQX0lUKCJOdW1iZXIgb2YgUENJcyBjYXVnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICVsdVxuIiwKIAkJIHBlcmZfc3RhdHMucGNpcyk7Ci0JX09VVFBfSVQoIk51bWJlciBvZiBhZGFwdGVyIGludGVycnVwdHMgY2F1Z2h0ICAgICAgICAgICAgIDogJXVcbiIsCisJX09VVFBfSVQoIk51bWJlciBvZiBhZGFwdGVyIGludGVycnVwdHMgY2F1Z2h0ICAgICAgICAgICAgIDogJWx1XG4iLAogCQkgcGVyZl9zdGF0cy50aGluaW50cyk7Ci0JX09VVFBfSVQoIk51bWJlciBvZiBmYXN0IHJlcXVldWVzIChvdXRnLiBTQkFMcyB3L28gU0lHQSkgIDogJXVcbiIsCisJX09VVFBfSVQoIk51bWJlciBvZiBmYXN0IHJlcXVldWVzIChvdXRnLiBTQkFMcyB3L28gU0lHQSkgIDogJWx1XG4iLAogCQkgcGVyZl9zdGF0cy5mYXN0X3JlcXMpOwogCV9PVVRQX0lUKCJcbiIpOwotCV9PVVRQX0lUKCJUb3RhbCB0aW1lIG9mIGFsbCBpbmJvdW5kIGFjdGlvbnMgKHVzKSBpbmNsLiBVTCA6ICV1XG4iLAorCV9PVVRQX0lUKCJUb3RhbCB0aW1lIG9mIGFsbCBpbmJvdW5kIGFjdGlvbnMgKHVzKSBpbmNsLiBVTCA6ICVsdVxuIiwKIAkJIHBlcmZfc3RhdHMuaW5ib3VuZF90aW1lKTsKLQlfT1VUUF9JVCgiTnVtYmVyIG9mIGluYm91bmQgdHJhbnNmZXJzICAgICAgICAgICAgICAgICAgICAgOiAldVxuIiwKKwlfT1VUUF9JVCgiTnVtYmVyIG9mIGluYm91bmQgdHJhbnNmZXJzICAgICAgICAgICAgICAgICAgICAgOiAlbHVcbiIsCiAJCSBwZXJmX3N0YXRzLmluYm91bmRfY250KTsKLQlfT1VUUF9JVCgiVG90YWwgdGltZSBvZiBhbGwgb3V0Ym91bmQgZG9fUURJT3MgKHVzKSAgICAgICAgOiAldVxuIiwKKwlfT1VUUF9JVCgiVG90YWwgdGltZSBvZiBhbGwgb3V0Ym91bmQgZG9fUURJT3MgKHVzKSAgICAgICAgOiAlbHVcbiIsCiAJCSBwZXJmX3N0YXRzLm91dGJvdW5kX3RpbWUpOwotCV9PVVRQX0lUKCJOdW1iZXIgb2YgZG9fUURJT3Mgb3V0Ym91bmQgICAgICAgICAgICAgICAgICAgICA6ICV1XG4iLAorCV9PVVRQX0lUKCJOdW1iZXIgb2YgZG9fUURJT3Mgb3V0Ym91bmQgICAgICAgICAgICAgICAgICAgICA6ICVsdVxuIiwKIAkJIHBlcmZfc3RhdHMub3V0Ym91bmRfY250KTsKIAlfT1VUUF9JVCgiXG4iKTsKIApAQCAtMzYyMCwxMiArMzYxMCwxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpxZGlvX3BlcmZfcHJvY19maWxlOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KIAogc3RhdGljIHZvaWQKIHFkaW9fYWRkX3Byb2Nmc19lbnRyeSh2b2lkKQogewotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKICAgICAgICAgcHJvY19wZXJmX2ZpbGVfcmVnaXN0cmF0aW9uPTA7CiAJcWRpb19wZXJmX3Byb2NfZmlsZT1jcmVhdGVfcHJvY19lbnRyeShRRElPX1BFUkYsCiAJCQkJCSAgICAgIFNfSUZSRUd8MDQ0NCwmcHJvY19yb290KTsKQEAgLTM2MzcsMjAgKzM2MjUsNTggQEAKICAgICAgICAgICAgICAgICBRRElPX1BSSU5UX1dBUk4oIndhcyBub3QgYWJsZSB0byByZWdpc3RlciBwZXJmLiAiIFwKIAkJCQkicHJvYy1maWxlICglaSkuXG4iLAogCQkJCXByb2NfcGVyZl9maWxlX3JlZ2lzdHJhdGlvbik7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLwogfQogCiBzdGF0aWMgdm9pZAogcWRpb19yZW1vdmVfcHJvY2ZzX2VudHJ5KHZvaWQpCiB7Ci0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwogCXBlcmZfc3RhdHMudGxfcnVucz0wOwogCiAgICAgICAgIGlmICghcHJvY19wZXJmX2ZpbGVfcmVnaXN0cmF0aW9uKSAvKiBtZWFucyBpZiBpdCB3ZW50IG9rIGVhcmxpZXIgKi8KIAkJcmVtb3ZlX3Byb2NfZW50cnkoUURJT19QRVJGLCZwcm9jX3Jvb3QpOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KIH0KIAorLyoqCisgKiBhdHRyaWJ1dGVzIGluIHN5c2ZzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzc2l6ZV90CitxZGlvX3BlcmZvcm1hbmNlX3N0YXRzX3Nob3coc3RydWN0IGJ1c190eXBlICpidXMsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgcWRpb19wZXJmb3JtYW5jZV9zdGF0cyA/IDEgOiAwKTsKK30KKworc3RhdGljIHNzaXplX3QKK3FkaW9fcGVyZm9ybWFuY2Vfc3RhdHNfc3RvcmUoc3RydWN0IGJ1c190eXBlICpidXMsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnRtcDsKKwlpbnQgaTsKKworCWkgPSBzaW1wbGVfc3RydG91bChidWYsICZ0bXAsIDE2KTsKKwlpZiAoKGkgPT0gMCkgfHwgKGkgPT0gMSkpIHsKKwkJaWYgKGkgPT0gcWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJCXJldHVybiBjb3VudDsKKwkJcWRpb19wZXJmb3JtYW5jZV9zdGF0cyA9IGk7CisJCWlmIChpPT0wKSB7CisJCQkvKiByZXNldCBwZXJmLiBzdGF0LiBpbmZvICovCisJCQlpX3BfbmMgPSAwOworCQkJaV9wX2MgPSAwOworCQkJaWlfcF9uYyA9IDA7CisJCQlpaV9wX2MgPSAwOworCQkJb19wX25jID0gMDsKKwkJCW9fcF9jID0gMDsKKwkJCW1lbXNldCgmcGVyZl9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBxZGlvX3BlcmZfc3RhdHMpKTsKKwkJfQorCX0gZWxzZSB7CisJCVFESU9fUFJJTlRfV0FSTigiUURJTyBwZXJmb3JtYW5jZV9zdGF0czogd3JpdGUgMCBvciAxIHRvIHRoaXMgZmlsZSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgQlVTX0FUVFIocWRpb19wZXJmb3JtYW5jZV9zdGF0cywgMDY0NCwgcWRpb19wZXJmb3JtYW5jZV9zdGF0c19zaG93LAorCQkJcWRpb19wZXJmb3JtYW5jZV9zdGF0c19zdG9yZSk7CisKIHN0YXRpYyB2b2lkCiB0aXFkaW9fcmVnaXN0ZXJfdGhpbmludHModm9pZCkKIHsKQEAgLTM2OTUsNiArMzcyMSw3IEBACiAJa2ZyZWUoaW5kaWNhdG9ycyk7CiB9CiAKKwogc3RhdGljIHZvaWQKIHFkaW9fdW5yZWdpc3Rlcl9kYmZfdmlld3Modm9pZCkKIHsKQEAgLTM3OTYsOSArMzgyMyw3IEBACiBpbml0X1FESU8odm9pZCkKIHsKIAlpbnQgcmVzOwotI2lmZGVmIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKIAl2b2lkICpwdHI7Ci0jZW5kaWYgLyogUURJT19QRVJGT1JNQU5DRV9TVEFUUyAqLwogCiAJcHJpbnRrKCJxZGlvOiBsb2FkaW5nICVzXG4iLHZlcnNpb24pOwogCkBAIC0zODExLDEzICszODM2LDEyIEBACiAJCXJldHVybiByZXM7CiAKIAlRRElPX0RCRl9URVhUMCgwLHNldHVwLCJpbml0UURJTyIpOworCXJlcyA9IGJ1c19jcmVhdGVfZmlsZSgmY2N3X2J1c190eXBlLCAmYnVzX2F0dHJfcWRpb19wZXJmb3JtYW5jZV9zdGF0cyk7CiAKLSNpZmRlZiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTCi0gICAgICAgCW1lbXNldCgodm9pZCopJnBlcmZfc3RhdHMsMCxzaXplb2YocGVyZl9zdGF0cykpOworCW1lbXNldCgodm9pZCopJnBlcmZfc3RhdHMsMCxzaXplb2YocGVyZl9zdGF0cykpOwogCVFESU9fREJGX1RFWFQwKDAsc2V0dXAsInBlcmZzdGF0Iik7CiAJcHRyPSZwZXJmX3N0YXRzOwogCVFESU9fREJGX0hFWDAoMCxzZXR1cCwmcHRyLHNpemVvZih2b2lkKikpOwotI2VuZGlmIC8qIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMgKi8KIAogCXFkaW9fYWRkX3Byb2Nmc19lbnRyeSgpOwogCkBAIC0zODQxLDcgKzM4NjUsNyBAQAogCXFkaW9fcmVsZWFzZV9xZGlvX21lbW9yeSgpOwogCXFkaW9fdW5yZWdpc3Rlcl9kYmZfdmlld3MoKTsKIAltZW1wb29sX2Rlc3Ryb3kocWRpb19tZW1wb29sX3Njc3NjKTsKLQorCWJ1c19yZW1vdmVfZmlsZSgmY2N3X2J1c190eXBlLCAmYnVzX2F0dHJfcWRpb19wZXJmb3JtYW5jZV9zdGF0cyk7CiAgIAlwcmludGsoInFkaW86ICVzOiBtb2R1bGUgcmVtb3ZlZFxuIix2ZXJzaW9uKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmggYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaAppbmRleCA0OWJiOWUzLi5lYzlhZjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaApAQCAtMTIsMTAgKzEyLDYgQEAKICNlbmRpZiAvKiBDT05GSUdfUURJT19ERUJVRyAqLwogI2RlZmluZSBRRElPX1VTRV9QUk9DRVNTSU5HX1NUQVRFCiAKLSNpZmRlZiBDT05GSUdfUURJT19QRVJGX1NUQVRTCi0jZGVmaW5lIFFESU9fUEVSRk9STUFOQ0VfU1RBVFMKLSNlbmRpZiAvKiBDT05GSUdfUURJT19QRVJGX1NUQVRTICovCi0KICNkZWZpbmUgUURJT19NSU5JTUFMX0JIX1JFTElFRl9USU1FIDE2CiAjZGVmaW5lIFFESU9fVElNRVJfUE9MTF9WQUxVRSAxCiAjZGVmaW5lIElRRElPX1RJTUVSX1BPTExfVkFMVUUgMQpAQCAtMjM2LDcgKzIzMiw3IEBACiAjZGVmaW5lIFFESU9fUFJJTlRfRU1FUkcoeC4uLikgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNkZWZpbmUgSEVYRFVNUDE2KGltcG9ydGFuY2UsaGVhZGVyLHB0cikgXAorI2RlZmluZSBRRElPX0hFWERVTVAxNihpbXBvcnRhbmNlLGhlYWRlcixwdHIpIFwKIFFESU9fUFJJTlRfIyNpbXBvcnRhbmNlKGhlYWRlciAiJTAyeCAlMDJ4ICUwMnggJTAyeCAgIiBcCiAJCQkiJTAyeCAlMDJ4ICUwMnggJTAyeCAgJTAyeCAlMDJ4ICUwMnggJTAyeCAgIiBcCiAJCQkiJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwqKCgoY2hhciopcHRyKSksIFwKQEAgLTQwOSwyNyArNDA1LDIzIEBACiAjZGVmaW5lIENIU0NfRkxBR19TSUdBX1NZTkNfRE9ORV9PTl9USElOSU5UUyAweDA4CiAjZGVmaW5lIENIU0NfRkxBR19TSUdBX1NZTkNfRE9ORV9PTl9PVVRCX1BDSVMgMHgwNAogCi0jaWZkZWYgUURJT19QRVJGT1JNQU5DRV9TVEFUUwogc3RydWN0IHFkaW9fcGVyZl9zdGF0cyB7Ci0JdW5zaWduZWQgaW50IHRsX3J1bnM7CisJdW5zaWduZWQgbG9uZyB0bF9ydW5zOwogCi0JdW5zaWduZWQgaW50IHNpZ2Ffb3V0czsKLQl1bnNpZ25lZCBpbnQgc2lnYV9pbnM7Ci0JdW5zaWduZWQgaW50IHNpZ2Ffc3luY3M7Ci0JdW5zaWduZWQgaW50IHBjaXM7Ci0JdW5zaWduZWQgaW50IHRoaW5pbnRzOwotCXVuc2lnbmVkIGludCBmYXN0X3JlcXM7CisJdW5zaWduZWQgbG9uZyBzaWdhX291dHM7CisJdW5zaWduZWQgbG9uZyBzaWdhX2luczsKKwl1bnNpZ25lZCBsb25nIHNpZ2Ffc3luY3M7CisJdW5zaWduZWQgbG9uZyBwY2lzOworCXVuc2lnbmVkIGxvbmcgdGhpbmludHM7CisJdW5zaWduZWQgbG9uZyBmYXN0X3JlcXM7CiAKIAlfX3U2NCBzdGFydF90aW1lX291dGJvdW5kOwotCXVuc2lnbmVkIGludCBvdXRib3VuZF9jbnQ7Ci0JdW5zaWduZWQgaW50IG91dGJvdW5kX3RpbWU7CisJdW5zaWduZWQgbG9uZyBvdXRib3VuZF9jbnQ7CisJdW5zaWduZWQgbG9uZyBvdXRib3VuZF90aW1lOwogCV9fdTY0IHN0YXJ0X3RpbWVfaW5ib3VuZDsKLQl1bnNpZ25lZCBpbnQgaW5ib3VuZF9jbnQ7Ci0JdW5zaWduZWQgaW50IGluYm91bmRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGluYm91bmRfY250OworCXVuc2lnbmVkIGxvbmcgaW5ib3VuZF90aW1lOwogfTsKLSNlbmRpZiAvKiBRRElPX1BFUkZPUk1BTkNFX1NUQVRTICovCi0KLSNkZWZpbmUgYXRvbWljX3N3YXAoYSxiKSB4Y2hnKChpbnQqKWEuY291bnRlcixiKQogCiAvKiB1bmxpa2VseSBhcyB0aGUgbGF0ZXIgdGhlIGJldHRlciAqLwogI2RlZmluZSBTWU5DX01FTU9SWSBpZiAodW5saWtlbHkocS0+c2lnYV9zeW5jKSkgcWRpb19zaWdhX3N5bmNfcShxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKaW5kZXggYzVjY2QyMC4uYWQ2MGFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCkBAIC0zMywxMSArMzMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3Jlc2V0Lmg+CiAKICNpbmNsdWRlICJhcF9idXMuaCIKIAogLyogU29tZSBwcm90b3R5cGVzLiAqLwotc3RhdGljIHZvaWQgYXBfc2Nhbl9idXModm9pZCAqKTsKK3N0YXRpYyB2b2lkIGFwX3NjYW5fYnVzKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIHN0YXRpYyB2b2lkIGFwX3BvbGxfYWxsKHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIHZvaWQgYXBfcG9sbF90aW1lb3V0KHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIGludCBhcF9wb2xsX3RocmVhZF9zdGFydCh2b2lkKTsKQEAgLTcxLDcgKzcyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYXBfd29ya19xdWV1ZTsKIHN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBhcF9jb25maWdfdGltZXI7CiBzdGF0aWMgaW50IGFwX2NvbmZpZ190aW1lID0gQVBfQ09ORklHX1RJTUU7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKGFwX2NvbmZpZ193b3JrLCBhcF9zY2FuX2J1cywgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9XT1JLKGFwX2NvbmZpZ193b3JrLCBhcF9zY2FuX2J1cyk7CiAKIC8qKgogICogVGFza2xldCAmIHRpbWVyIGZvciBBUCByZXF1ZXN0IHBvbGxpbmcuCkBAIC00MzEsNyArNDMyLDE1IEBACiAJCQkgICBhcF9kZXYtPmRldmljZV90eXBlKTsKIAlpZiAoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZW52cFsxXSA9IDA7CisJYnVmZmVyICs9IGxlbmd0aDsKKwlidWZmZXJfc2l6ZSAtPSBsZW5ndGg7CisJLyogQWRkIE1PREFMSUFTPSAqLworCWVudnBbMV0gPSBidWZmZXI7CisJbGVuZ3RoID0gc2NucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJNT0RBTElBUz1hcDp0JTAyWCIsCisJCQkgICBhcF9kZXYtPmRldmljZV90eXBlKTsKKwlpZiAoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZW52cFsyXSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcyNCw3ICs3MzMsNyBAQAogCWtmcmVlKGFwX2Rldik7CiB9CiAKLXN0YXRpYyB2b2lkIGFwX3NjYW5fYnVzKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBhcF9zY2FuX2J1cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgYXBfZGV2aWNlICphcF9kZXY7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtNzM5LDExICs3NDgsMTYgQEAKIAkJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZhcF9idXNfdHlwZSwgTlVMTCwKIAkJCQkgICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXFpZCwKIAkJCQkgICAgICBfX2FwX3NjYW5fYnVzKTsKKwkJcmMgPSBhcF9xdWVyeV9xdWV1ZShxaWQsICZxdWV1ZV9kZXB0aCwgJmRldmljZV90eXBlKTsKKwkJaWYgKGRldiAmJiByYykgeworCQkJcHV0X2RldmljZShkZXYpOworCQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCWlmIChkZXYpIHsKIAkJCXB1dF9kZXZpY2UoZGV2KTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXJjID0gYXBfcXVlcnlfcXVldWUocWlkLCAmcXVldWVfZGVwdGgsICZkZXZpY2VfdHlwZSk7CiAJCWlmIChyYykKIAkJCWNvbnRpbnVlOwogCQlyYyA9IGFwX2luaXRfcXVldWUocWlkKTsKQEAgLTExMTUsNiArMTEyOSwxOSBAQAogCW11dGV4X3VubG9jaygmYXBfcG9sbF90aHJlYWRfbXV0ZXgpOwogfQogCitzdGF0aWMgdm9pZCBhcF9yZXNldCh2b2lkKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IEFQX0RPTUFJTlM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IEFQX0RFVklDRVM7IGorKykKKwkJCWFwX3Jlc2V0X3F1ZXVlKEFQX01LUUlEKGosIGkpKTsKK30KKworc3RhdGljIHN0cnVjdCByZXNldF9jYWxsIGFwX3Jlc2V0X2NhbGwgPSB7CisJLmZuID0gYXBfcmVzZXQsCit9OworCiAvKioKICAqIFRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gY29kZS4KICAqLwpAQCAtMTEzMSw2ICsxMTU4LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVAgaW5zdHJ1Y3Rpb25zIG5vdCBpbnN0YWxsZWQuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCXJlZ2lzdGVyX3Jlc2V0X2NhbGwoJmFwX3Jlc2V0X2NhbGwpOwogCiAJLyogQ3JlYXRlIC9zeXMvYnVzL2FwLiAqLwogCXJjID0gYnVzX3JlZ2lzdGVyKCZhcF9idXNfdHlwZSk7CkBAIC0xMTg0LDYgKzEyMTIsNyBAQAogCQlidXNfcmVtb3ZlX2ZpbGUoJmFwX2J1c190eXBlLCBhcF9idXNfYXR0cnNbaV0pOwogCWJ1c191bnJlZ2lzdGVyKCZhcF9idXNfdHlwZSk7CiBvdXQ6CisJdW5yZWdpc3Rlcl9yZXNldF9jYWxsKCZhcF9yZXNldF9jYWxsKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEyMTQsNiArMTI0Myw3IEBACiAJZm9yIChpID0gMDsgYXBfYnVzX2F0dHJzW2ldOyBpKyspCiAJCWJ1c19yZW1vdmVfZmlsZSgmYXBfYnVzX3R5cGUsIGFwX2J1c19hdHRyc1tpXSk7CiAJYnVzX3VucmVnaXN0ZXIoJmFwX2J1c190eXBlKTsKKwl1bnJlZ2lzdGVyX3Jlc2V0X2NhbGwoJmFwX3Jlc2V0X2NhbGwpOwogfQogCiAjaWZuZGVmIENPTkZJR19aQ1JZUFRfTU9OT0xJVEhJQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfY2V4MmEuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X2NleDJhLmMKaW5kZXggYTYyYjAwMC4uNWJiMTNhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfY2V4MmEuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9jZXgyYS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiB3b3JrOwogCWludCByYzsKIAotCWFwX21zZy5tZXNzYWdlID0gKHZvaWQgKikga21hbGxvYyhDRVgyQV9NQVhfTUVTU0FHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlhcF9tc2cubWVzc2FnZSA9IGttYWxsb2MoQ0VYMkFfTUFYX01FU1NBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcF9tc2cubWVzc2FnZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJYXBfbXNnLnBzbWlkID0gKCgodW5zaWduZWQgbG9uZyBsb25nKSBjdXJyZW50LT5waWQpIDw8IDMyKSArCkBAIC0zMzcsNyArMzM3LDcgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiB3b3JrOwogCWludCByYzsKIAotCWFwX21zZy5tZXNzYWdlID0gKHZvaWQgKikga21hbGxvYyhDRVgyQV9NQVhfTUVTU0FHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlhcF9tc2cubWVzc2FnZSA9IGttYWxsb2MoQ0VYMkFfTUFYX01FU1NBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcF9tc2cubWVzc2FnZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJYXBfbXNnLnBzbWlkID0gKCgodW5zaWduZWQgbG9uZyBsb25nKSBjdXJyZW50LT5waWQpIDw8IDMyKSArCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9wY2ljYS5jIGIvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfcGNpY2EuYwppbmRleCBiNmE0ZWNkLi4zMmUzNzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3pjcnlwdF9wY2ljYS5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaWNhLmMKQEAgLTI3OSw3ICsyNzksNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHdvcms7CiAJaW50IHJjOwogCi0JYXBfbXNnLm1lc3NhZ2UgPSAodm9pZCAqKSBrbWFsbG9jKFBDSUNBX01BWF9NRVNTQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWFwX21zZy5tZXNzYWdlID0ga21hbGxvYyhQQ0lDQV9NQVhfTUVTU0FHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFwX21zZy5tZXNzYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKIAlhcF9tc2cucHNtaWQgPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpIGN1cnJlbnQtPnBpZCkgPDwgMzIpICsKQEAgLTMyMSw3ICszMjEsNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHdvcms7CiAJaW50IHJjOwogCi0JYXBfbXNnLm1lc3NhZ2UgPSAodm9pZCAqKSBrbWFsbG9jKFBDSUNBX01BWF9NRVNTQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWFwX21zZy5tZXNzYWdlID0ga21hbGxvYyhQQ0lDQV9NQVhfTUVTU0FHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFwX21zZy5tZXNzYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKIAlhcF9tc2cucHNtaWQgPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpIGN1cnJlbnQtPnBpZCkgPDwgMzIpICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jcnlwdG8vemNyeXB0X3BjaXhjYy5jIGIvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfcGNpeGNjLmMKaW5kZXggMmRhOGI5My4uYjcxNTNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfcGNpeGNjLmMKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by96Y3J5cHRfcGNpeGNjLmMKQEAgLTcxNyw3ICs3MTcsNyBAQAogCX07CiAJaW50IHJjOwogCi0JYXBfbXNnLm1lc3NhZ2UgPSAodm9pZCAqKSBrbWFsbG9jKFBDSVhDQ19NQVhfWENSQl9NRVNTQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWFwX21zZy5tZXNzYWdlID0ga21hbGxvYyhQQ0lYQ0NfTUFYX1hDUkJfTUVTU0FHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFwX21zZy5tZXNzYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKIAlhcF9tc2cucHNtaWQgPSAoKCh1bnNpZ25lZCBsb25nIGxvbmcpIGN1cnJlbnQtPnBpZCkgPDwgMzIpICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5oIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmgKaW5kZXggOTY5YmU0Ni4uMWVlOWE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgQ0xBV19DT01QTEVURSAgICAgICAgICAgMHhmZiAgIC8qIGZsYWcgdG8gaW5kaWNhdGUgaS9vIGNvbXBsZXRlZCAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgQ0xBVyBjb250cm9sIGNvbWFuZCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgIENMQVcgY29udHJvbCBjb21tYW5kIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2RlZmluZSBTWVNURU1fVkFMSURBVEVfUkVRVUVTVCAgIDB4MDEgIC8qIFN5c3RlbSBWYWxpZGF0ZSByZXF1ZXN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jCmluZGV4IDMyNTdjMjIuLjAzY2MyNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jCkBAIC0xNjQ2LDcgKzE2NDYsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCW1lbXNldChjaCwgMCwgc2l6ZW9mIChzdHJ1Y3QgY2hhbm5lbCkpOwotCWlmICgoY2gtPmNjdyA9IChzdHJ1Y3QgY2N3MSAqKSBrbWFsbG9jKDgqc2l6ZW9mKHN0cnVjdCBjY3cxKSwKKwlpZiAoKGNoLT5jY3cgPSBrbWFsbG9jKDgqc2l6ZW9mKHN0cnVjdCBjY3cxKSwKIAkJCQkJICAgICAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKSkgPT0gTlVMTCkgewogCQlrZnJlZShjaCk7CiAJCWN0Y19wcl93YXJuKCJjdGM6IE91dCBvZiBtZW1vcnkgaW4gYWRkX2NoYW5uZWxcbiIpOwpAQCAtMTY5Myw3ICsxNjkzLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAlmc21fbmV3c3RhdGUoY2gtPmZzbSwgQ0hfU1RBVEVfSURMRSk7Ci0JaWYgKChjaC0+aXJiID0gKHN0cnVjdCBpcmIgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBpcmIpLAorCWlmICgoY2gtPmlyYiA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgaXJiKSwKIAkJCQkJICAgICAgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKIAkJY3RjX3ByX3dhcm4oImN0YzogT3V0IG9mIG1lbW9yeSBpbiBhZGRfY2hhbm5lbFxuIik7CiAJCWtmcmVlX2ZzbShjaC0+ZnNtKTsKQEAgLTI1MzUsNyArMjUzNSw3IEBACiAJREJGX1RFWFQodHJhY2UsIDQsIF9fRlVOQ1RJT05fXyk7CiAJaWYgKCFwcml2KQogCQlyZXR1cm47Ci0Jc2J1ZiA9IChjaGFyICopa21hbGxvYygyMDQ4LCBHRlBfS0VSTkVMKTsKKwlzYnVmID0ga21hbGxvYygyMDQ4LCBHRlBfS0VSTkVMKTsKIAlpZiAoc2J1ZiA9PSBOVUxMKQogCQlyZXR1cm47CiAJcCA9IHNidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2l1Y3YuYyBiL2RyaXZlcnMvczM5MC9uZXQvaXVjdi5jCmluZGV4IDE0NzZjZTIuLjIyOWFlYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvaXVjdi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvaXVjdi5jCkBAIC03NzIsNyArNzcyLDcgQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBoYW5kbGVyIGVudHJ5ICovCi0JbmV3X2hhbmRsZXIgPSAoaGFuZGxlciAqKWttYWxsb2Moc2l6ZW9mKGhhbmRsZXIpLCBHRlBfQVRPTUlDKTsKKwluZXdfaGFuZGxlciA9IGttYWxsb2Moc2l6ZW9mKGhhbmRsZXIpLCBHRlBfQVRPTUlDKTsKIAlpZiAobmV3X2hhbmRsZXIgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc3RvcmFnZSBhbGxvY2F0aW9uIGZvciBuZXcgaGFuZGxlciAiCiAJCSAgICAgICAiZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMgYi9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCmluZGV4IDE2YWM2OGMuLmU1NjY1YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuYwpAQCAtNTQsNiArNTQsOCBAQAogI2Vycm9yIENhbm5vdCBjb21waWxlIGxjcy5jIHdpdGhvdXQgc29tZSBuZXQgZGV2aWNlcyBzd2l0Y2hlZCBvbi4KICNlbmRpZgogCisjZGVmaW5lIFBSSU5US19IRUFERVIJCSIgbGNzOiAiCisKIC8qKgogICogaW5pdGlhbGl6YXRpb24gc3RyaW5nIGZvciBvdXRwdXQKICAqLwpAQCAtNjUsNyArNjcsNyBAQAogICogU29tZSBwcm90b3R5cGVzLgogICovCiBzdGF0aWMgdm9pZCBsY3NfdGFza2xldCh1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyB2b2lkIGxjc19zdGFydF9rZXJuZWxfdGhyZWFkKHN0cnVjdCBsY3NfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBsY3Nfc3RhcnRfa2VybmVsX3RocmVhZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiBzdGF0aWMgdm9pZCBsY3NfZ2V0X2ZyYW1lc19jYihzdHJ1Y3QgbGNzX2NoYW5uZWwgKiwgc3RydWN0IGxjc19idWZmZXIgKik7CiBzdGF0aWMgaW50IGxjc19zZW5kX2RlbGlwbShzdHJ1Y3QgbGNzX2NhcmQgKiwgc3RydWN0IGxjc19pcG1fbGlzdCAqKTsKIHN0YXRpYyBpbnQgbGNzX3JlY292ZXJ5KHZvaWQgKnB0cik7CkBAIC0xMjAsNyArMTIyLDcgQEAKIAkJCWt6YWxsb2MoTENTX0lPQlVGRkVSU0laRSwgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOwogCQlpZiAoY2hhbm5lbC0+aW9iW2NudF0uZGF0YSA9PSBOVUxMKQogCQkJYnJlYWs7Ci0JCWNoYW5uZWwtPmlvYltjbnRdLnN0YXRlID0gQlVGX1NUQVRFX0VNUFRZOworCQljaGFubmVsLT5pb2JbY250XS5zdGF0ZSA9IExDU19CVUZfU1RBVEVfRU1QVFk7CiAJfQogCWlmIChjbnQgPCBMQ1NfTlVNX0JVRkZTKSB7CiAJCS8qIE5vdCBhbGwgaW8gYnVmZmVycyBjb3VsZCBiZSBhbGxvY2F0ZWQuICovCkBAIC0yMzYsNyArMjM4LDcgQEAKIAkJKChzdHJ1Y3QgbGNzX2hlYWRlciAqKQogCQkgY2FyZC0+cmVhZC5pb2JbY250XS5kYXRhKS0+b2Zmc2V0ID0gTENTX0lMTEVHQUxfT0ZGU0VUOwogCQljYXJkLT5yZWFkLmlvYltjbnRdLmNhbGxiYWNrID0gbGNzX2dldF9mcmFtZXNfY2I7Ci0JCWNhcmQtPnJlYWQuaW9iW2NudF0uc3RhdGUgPSBCVUZfU1RBVEVfUkVBRFk7CisJCWNhcmQtPnJlYWQuaW9iW2NudF0uc3RhdGUgPSBMQ1NfQlVGX1NUQVRFX1JFQURZOwogCQljYXJkLT5yZWFkLmlvYltjbnRdLmNvdW50ID0gTENTX0lPQlVGRkVSU0laRTsKIAl9CiAJY2FyZC0+cmVhZC5jY3dzWzBdLmZsYWdzICY9IH5DQ1dfRkxBR19QQ0k7CkBAIC0yNDcsNyArMjQ5LDcgQEAKIAljYXJkLT5yZWFkLmNjd3NbTENTX05VTV9CVUZGU10uY2RhID0KIAkJKF9fdTMyKSBfX3BhKGNhcmQtPnJlYWQuY2N3cyk7CiAJLyogU2V0ZyBpbml0aWFsIHN0YXRlIG9mIHRoZSByZWFkIGNoYW5uZWwuICovCi0JY2FyZC0+cmVhZC5zdGF0ZSA9IENIX1NUQVRFX0lOSVQ7CisJY2FyZC0+cmVhZC5zdGF0ZSA9IExDU19DSF9TVEFURV9JTklUOwogCiAJY2FyZC0+cmVhZC5pb19pZHggPSAwOwogCWNhcmQtPnJlYWQuYnVmX2lkeCA9IDA7CkBAIC0yOTQsNyArMjk2LDcgQEAKIAljYXJkLT53cml0ZS5jY3dzW0xDU19OVU1fQlVGRlNdLmNkYSA9CiAJCShfX3UzMikgX19wYShjYXJkLT53cml0ZS5jY3dzKTsKIAkvKiBTZXQgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgd3JpdGUgY2hhbm5lbC4gKi8KLQljYXJkLT5yZWFkLnN0YXRlID0gQ0hfU1RBVEVfSU5JVDsKKwljYXJkLT5yZWFkLnN0YXRlID0gTENTX0NIX1NUQVRFX0lOSVQ7CiAKIAljYXJkLT53cml0ZS5pb19pZHggPSAwOwogCWNhcmQtPndyaXRlLmJ1Zl9pZHggPSAwOwpAQCAtNDk2LDcgKzQ5OCw3IEBACiAJCQkgICAgICBjaGFubmVsLT5jY3dzICsgY2hhbm5lbC0+aW9faWR4LCAwLCAwLAogCQkJICAgICAgRE9JT19ERU5ZX1BSRUZFVENIIHwgRE9JT19BTExPV19TVVNQRU5EKTsKIAlpZiAocmMgPT0gMCkKLQkJY2hhbm5lbC0+c3RhdGUgPSBDSF9TVEFURV9SVU5OSU5HOworCQljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9SVU5OSU5HOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZ2V0X2Njd2Rldl9sb2NrKGNoYW5uZWwtPmNjd2RldiksIGZsYWdzKTsKIAlpZiAocmMpIHsKIAkJTENTX0RCRl9URVhUXyg0LHRyYWNlLCJlc3NoJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOwpAQCAtNTIwLDggKzUyMiw4IEBACiAJCUxDU19EQkZfVEVYVF8oNCx0cmFjZSwiZWNzYyVzIiwgY2hhbm5lbC0+Y2N3ZGV2LT5kZXYuYnVzX2lkKTsKIAkJcmV0dXJuIHJjOwogCX0KLQl3YWl0X2V2ZW50KGNoYW5uZWwtPndhaXRfcSwgKGNoYW5uZWwtPnN0YXRlID09IENIX1NUQVRFX0NMRUFSRUQpKTsKLQljaGFubmVsLT5zdGF0ZSA9IENIX1NUQVRFX1NUT1BQRUQ7CisJd2FpdF9ldmVudChjaGFubmVsLT53YWl0X3EsIChjaGFubmVsLT5zdGF0ZSA9PSBMQ1NfQ0hfU1RBVEVfQ0xFQVJFRCkpOworCWNoYW5uZWwtPnN0YXRlID0gTENTX0NIX1NUQVRFX1NUT1BQRUQ7CiAJcmV0dXJuIHJjOwogfQogCkBAIC01MzUsMTEgKzUzNywxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjOwogCi0JaWYgKGNoYW5uZWwtPnN0YXRlID09IENIX1NUQVRFX1NUT1BQRUQpCisJaWYgKGNoYW5uZWwtPnN0YXRlID09IExDU19DSF9TVEFURV9TVE9QUEVEKQogCQlyZXR1cm4gMDsKIAlMQ1NfREJGX1RFWFQoNCx0cmFjZSwiaGFsdHNjaCIpOwogCUxDU19EQkZfVEVYVF8oNCx0cmFjZSwiJXMiLCBjaGFubmVsLT5jY3dkZXYtPmRldi5idXNfaWQpOwotCWNoYW5uZWwtPnN0YXRlID0gQ0hfU1RBVEVfSU5JVDsKKwljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9JTklUOwogCXNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CiAJcmMgPSBjY3dfZGV2aWNlX2hhbHQoY2hhbm5lbC0+Y2N3ZGV2LCAoYWRkcl90KSBjaGFubmVsKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CkBAIC01NDgsNyArNTUwLDcgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAkvKiBBc3luY2hyb25vdXMgaGFsdCBpbml0aWFsdGVkLiBXYWl0IGZvciBpdHMgY29tcGxldGlvbi4gKi8KLQl3YWl0X2V2ZW50KGNoYW5uZWwtPndhaXRfcSwgKGNoYW5uZWwtPnN0YXRlID09IENIX1NUQVRFX0hBTFRFRCkpOworCXdhaXRfZXZlbnQoY2hhbm5lbC0+d2FpdF9xLCAoY2hhbm5lbC0+c3RhdGUgPT0gTENTX0NIX1NUQVRFX0hBTFRFRCkpOwogCWxjc19jbGVhcl9jaGFubmVsKGNoYW5uZWwpOwogCXJldHVybiAwOwogfQpAQCAtNTk2LDggKzU5OCw4IEBACiAJTENTX0RCRl9URVhUKDUsIHRyYWNlLCAiX2dldGJ1ZmYiKTsKIAlpbmRleCA9IGNoYW5uZWwtPmlvX2lkeDsKIAlkbyB7Ci0JCWlmIChjaGFubmVsLT5pb2JbaW5kZXhdLnN0YXRlID09IEJVRl9TVEFURV9FTVBUWSkgewotCQkJY2hhbm5lbC0+aW9iW2luZGV4XS5zdGF0ZSA9IEJVRl9TVEFURV9MT0NLRUQ7CisJCWlmIChjaGFubmVsLT5pb2JbaW5kZXhdLnN0YXRlID09IExDU19CVUZfU1RBVEVfRU1QVFkpIHsKKwkJCWNoYW5uZWwtPmlvYltpbmRleF0uc3RhdGUgPSBMQ1NfQlVGX1NUQVRFX0xPQ0tFRDsKIAkJCXJldHVybiBjaGFubmVsLT5pb2IgKyBpbmRleDsKIAkJfQogCQlpbmRleCA9IChpbmRleCArIDEpICYgKExDU19OVU1fQlVGRlMgLSAxKTsKQEAgLTYyNiw3ICs2MjgsNyBAQAogewogCWludCByYzsKIAotCWlmIChjaGFubmVsLT5zdGF0ZSAhPSBDSF9TVEFURV9TVVNQRU5ERUQpCisJaWYgKGNoYW5uZWwtPnN0YXRlICE9IExDU19DSF9TVEFURV9TVVNQRU5ERUQpCiAJCXJldHVybiAwOwogCWlmIChjaGFubmVsLT5jY3dzW2NoYW5uZWwtPmlvX2lkeF0uZmxhZ3MgJiBDQ1dfRkxBR19TVVNQRU5EKQogCQlyZXR1cm4gMDsKQEAgLTYzNiw3ICs2MzgsNyBAQAogCQlMQ1NfREJGX1RFWFRfKDQsIHRyYWNlLCAiZXJzYyVzIiwgY2hhbm5lbC0+Y2N3ZGV2LT5kZXYuYnVzX2lkKTsKIAkJUFJJTlRfRVJSKCJFcnJvciBpbiBsY3NfcmVzdW1lX2NoYW5uZWw6IHJjPSVkXG4iLHJjKTsKIAl9IGVsc2UKLQkJY2hhbm5lbC0+c3RhdGUgPSBDSF9TVEFURV9SVU5OSU5HOworCQljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9SVU5OSU5HOwogCXJldHVybiByYzsKIAogfQpAQCAtNjcwLDEwICs2NzIsMTAgQEAKIAlpbnQgaW5kZXgsIHJjOwogCiAJTENTX0RCRl9URVhUKDUsIHRyYWNlLCAicmR5YnVmZiIpOwotCUJVR19PTihidWZmZXItPnN0YXRlICE9IEJVRl9TVEFURV9MT0NLRUQgJiYKLQkgICAgICAgYnVmZmVyLT5zdGF0ZSAhPSBCVUZfU1RBVEVfUFJPQ0VTU0VEKTsKKwlCVUdfT04oYnVmZmVyLT5zdGF0ZSAhPSBMQ1NfQlVGX1NUQVRFX0xPQ0tFRCAmJgorCSAgICAgICBidWZmZXItPnN0YXRlICE9IExDU19CVUZfU1RBVEVfUFJPQ0VTU0VEKTsKIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2hhbm5lbC0+Y2N3ZGV2KSwgZmxhZ3MpOwotCWJ1ZmZlci0+c3RhdGUgPSBCVUZfU1RBVEVfUkVBRFk7CisJYnVmZmVyLT5zdGF0ZSA9IExDU19CVUZfU1RBVEVfUkVBRFk7CiAJaW5kZXggPSBidWZmZXIgLSBjaGFubmVsLT5pb2I7CiAJLyogU2V0IGxlbmd0aC4gKi8KIAljaGFubmVsLT5jY3dzW2luZGV4XS5jb3VudCA9IGJ1ZmZlci0+Y291bnQ7CkBAIC02OTUsOCArNjk3LDggQEAKIAlpbnQgaW5kZXgsIHByZXYsIG5leHQ7CiAKIAlMQ1NfREJGX1RFWFQoNSwgdHJhY2UsICJwcmNzYnVmZiIpOwotCUJVR19PTihidWZmZXItPnN0YXRlICE9IEJVRl9TVEFURV9SRUFEWSk7Ci0JYnVmZmVyLT5zdGF0ZSA9IEJVRl9TVEFURV9QUk9DRVNTRUQ7CisJQlVHX09OKGJ1ZmZlci0+c3RhdGUgIT0gTENTX0JVRl9TVEFURV9SRUFEWSk7CisJYnVmZmVyLT5zdGF0ZSA9IExDU19CVUZfU1RBVEVfUFJPQ0VTU0VEOwogCWluZGV4ID0gYnVmZmVyIC0gY2hhbm5lbC0+aW9iOwogCXByZXYgPSAoaW5kZXggLSAxKSAmIChMQ1NfTlVNX0JVRkZTIC0gMSk7CiAJbmV4dCA9IChpbmRleCArIDEpICYgKExDU19OVU1fQlVGRlMgLSAxKTsKQEAgLTcwNCw3ICs3MDYsNyBAQAogCWNoYW5uZWwtPmNjd3NbaW5kZXhdLmZsYWdzIHw9IENDV19GTEFHX1NVU1BFTkQ7CiAJY2hhbm5lbC0+Y2N3c1tpbmRleF0uZmxhZ3MgJj0gfkNDV19GTEFHX1BDSTsKIAkvKiBDaGVjayB0aGUgc3VzcGVuZCBiaXQgb2YgdGhlIHByZXZpb3VzIGJ1ZmZlci4gKi8KLQlpZiAoY2hhbm5lbC0+aW9iW3ByZXZdLnN0YXRlID09IEJVRl9TVEFURV9SRUFEWSkgeworCWlmIChjaGFubmVsLT5pb2JbcHJldl0uc3RhdGUgPT0gTENTX0JVRl9TVEFURV9SRUFEWSkgewogCQkvKgogCQkgKiBQcmV2aW91cyBidWZmZXIgaXMgaW4gc3RhdGUgcmVhZHkuIEl0IG1pZ2h0IGhhdmUKIAkJICogaGFwcGVuZWQgaW4gbGNzX3JlYWR5X2J1ZmZlciB0aGF0IHRoZSBzdXNwZW5kIGJpdApAQCAtNzI3LDEwICs3MjksMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJTENTX0RCRl9URVhUKDUsIHRyYWNlLCAicmVsYnVmZiIpOwotCUJVR19PTihidWZmZXItPnN0YXRlICE9IEJVRl9TVEFURV9MT0NLRUQgJiYKLQkgICAgICAgYnVmZmVyLT5zdGF0ZSAhPSBCVUZfU1RBVEVfUFJPQ0VTU0VEKTsKKwlCVUdfT04oYnVmZmVyLT5zdGF0ZSAhPSBMQ1NfQlVGX1NUQVRFX0xPQ0tFRCAmJgorCSAgICAgICBidWZmZXItPnN0YXRlICE9IExDU19CVUZfU1RBVEVfUFJPQ0VTU0VEKTsKIAlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2hhbm5lbC0+Y2N3ZGV2KSwgZmxhZ3MpOwotCWJ1ZmZlci0+c3RhdGUgPSBCVUZfU1RBVEVfRU1QVFk7CisJYnVmZmVyLT5zdGF0ZSA9IExDU19CVUZfU1RBVEVfRU1QVFk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soY2hhbm5lbC0+Y2N3ZGV2KSwgZmxhZ3MpOwogfQogCkBAIC0xMTQ3LDcgKzExNDksNyBAQAogICogZ2V0IG1hYyBhZGRyZXNzIGZvciB0aGUgcmVsZXZhbnQgTXVsdGljYXN0IGFkZHJlc3MKICAqLwogc3RhdGljIHZvaWQKLWxjc19nZXRfbWFjX2Zvcl9pcG0oX191MzIgaXBtLCBjaGFyICptYWMsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitsY3NfZ2V0X21hY19mb3JfaXBtKF9fYmUzMiBpcG0sIGNoYXIgKm1hYywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlMQ1NfREJGX1RFWFQoNCx0cmFjZSwgImdldG1hYyIpOwogCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDJfVFIpCkBAIC0xMjY0LDcgKzEyNjYsNyBAQAogCW5ldGlmX2NhcnJpZXJfb2ZmKGNhcmQtPmRldik7CiAJbmV0aWZfdHhfZGlzYWJsZShjYXJkLT5kZXYpOwogCXdhaXRfZXZlbnQoY2FyZC0+d3JpdGUud2FpdF9xLAotCQkJKGNhcmQtPndyaXRlLnN0YXRlICE9IENIX1NUQVRFX1JVTk5JTkcpKTsKKwkJCShjYXJkLT53cml0ZS5zdGF0ZSAhPSBMQ1NfQ0hfU1RBVEVfUlVOTklORykpOwogCWxjc19maXhfbXVsdGljYXN0X2xpc3QoY2FyZCk7CiAJaWYgKGNhcmQtPnN0YXRlID09IERFVl9TVEFURV9VUCkgewogCQluZXRpZl9jYXJyaWVyX29uKGNhcmQtPmRldik7CkBAIC0xNDA0LDcgKzE0MDYsNyBAQAogCQl9CiAJfQogCS8qIEhvdyBmYXIgaW4gdGhlIGNjdyBjaGFpbiBoYXZlIHdlIHByb2Nlc3NlZD8gKi8KLQlpZiAoKGNoYW5uZWwtPnN0YXRlICE9IENIX1NUQVRFX0lOSVQpICYmCisJaWYgKChjaGFubmVsLT5zdGF0ZSAhPSBMQ1NfQ0hfU1RBVEVfSU5JVCkgJiYKIAkgICAgKGlyYi0+c2Nzdy5mY3RsICYgU0NTV19GQ1RMX1NUQVJUX0ZVTkMpKSB7CiAJCWluZGV4ID0gKHN0cnVjdCBjY3cxICopIF9fdmEoKGFkZHJfdCkgaXJiLT5zY3N3LmNwYSkKIAkJCS0gY2hhbm5lbC0+Y2N3czsKQEAgLTE0MjQsMjAgKzE0MjYsMjAgQEAKIAkgICAgKGlyYi0+c2Nzdy5kc3RhdCAmIERFVl9TVEFUX0NITl9FTkQpIHx8CiAJICAgIChpcmItPnNjc3cuZHN0YXQgJiBERVZfU1RBVF9VTklUX0NIRUNLKSkKIAkJLyogTWFyayBjaGFubmVsIGFzIHN0b3BwZWQuICovCi0JCWNoYW5uZWwtPnN0YXRlID0gQ0hfU1RBVEVfU1RPUFBFRDsKKwkJY2hhbm5lbC0+c3RhdGUgPSBMQ1NfQ0hfU1RBVEVfU1RPUFBFRDsKIAllbHNlIGlmIChpcmItPnNjc3cuYWN0bCAmIFNDU1dfQUNUTF9TVVNQRU5ERUQpCiAJCS8qIENDVyBleGVjdXRpb24gc3RvcHBlZCBvbiBhIHN1c3BlbmQgYml0LiAqLwotCQljaGFubmVsLT5zdGF0ZSA9IENIX1NUQVRFX1NVU1BFTkRFRDsKKwkJY2hhbm5lbC0+c3RhdGUgPSBMQ1NfQ0hfU1RBVEVfU1VTUEVOREVEOwogCWlmIChpcmItPnNjc3cuZmN0bCAmIFNDU1dfRkNUTF9IQUxUX0ZVTkMpIHsKIAkJaWYgKGlyYi0+c2Nzdy5jYyAhPSAwKSB7CiAJCQljY3dfZGV2aWNlX2hhbHQoY2hhbm5lbC0+Y2N3ZGV2LCAoYWRkcl90KSBjaGFubmVsKTsKIAkJCXJldHVybjsKIAkJfQogCQkvKiBUaGUgY2hhbm5lbCBoYXMgYmVlbiBzdG9wcGVkIGJ5IGhhbHRfSU8uICovCi0JCWNoYW5uZWwtPnN0YXRlID0gQ0hfU1RBVEVfSEFMVEVEOworCQljaGFubmVsLT5zdGF0ZSA9IExDU19DSF9TVEFURV9IQUxURUQ7CiAJfQogCWlmIChpcmItPnNjc3cuZmN0bCAmIFNDU1dfRkNUTF9DTEVBUl9GVU5DKSB7Ci0JCWNoYW5uZWwtPnN0YXRlID0gQ0hfU1RBVEVfQ0xFQVJFRDsKKwkJY2hhbm5lbC0+c3RhdGUgPSBMQ1NfQ0hfU1RBVEVfQ0xFQVJFRDsKIAl9CiAJLyogRG8gdGhlIHJlc3QgaW4gdGhlIHRhc2tsZXQuICovCiAJdGFza2xldF9zY2hlZHVsZSgmY2hhbm5lbC0+aXJxX3Rhc2tsZXQpOwpAQCAtMTQ2MSw3ICsxNDYzLDcgQEAKIAkvKiBDaGVjayBmb3IgcHJvY2Vzc2VkIGJ1ZmZlcnMuICovCiAJaW9iID0gY2hhbm5lbC0+aW9iOwogCWJ1Zl9pZHggPSBjaGFubmVsLT5idWZfaWR4OwotCXdoaWxlIChpb2JbYnVmX2lkeF0uc3RhdGUgPT0gQlVGX1NUQVRFX1BST0NFU1NFRCkgeworCXdoaWxlIChpb2JbYnVmX2lkeF0uc3RhdGUgPT0gTENTX0JVRl9TVEFURV9QUk9DRVNTRUQpIHsKIAkJLyogRG8gdGhlIGNhbGxiYWNrIHRoaW5nLiAqLwogCQlpZiAoaW9iW2J1Zl9pZHhdLmNhbGxiYWNrICE9IE5VTEwpCiAJCQlpb2JbYnVmX2lkeF0uY2FsbGJhY2soY2hhbm5lbCwgaW9iICsgYnVmX2lkeCk7CkBAIC0xNDY5LDEyICsxNDcxLDEyIEBACiAJfQogCWNoYW5uZWwtPmJ1Zl9pZHggPSBidWZfaWR4OwogCi0JaWYgKGNoYW5uZWwtPnN0YXRlID09IENIX1NUQVRFX1NUT1BQRUQpCisJaWYgKGNoYW5uZWwtPnN0YXRlID09IExDU19DSF9TVEFURV9TVE9QUEVEKQogCQkvLyBGSVhNRTogd2hhdCBpZiByYyAhPSAwID8/CiAJCXJjID0gbGNzX3N0YXJ0X2NoYW5uZWwoY2hhbm5lbCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGNoYW5uZWwtPmNjd2RldiksIGZsYWdzKTsKLQlpZiAoY2hhbm5lbC0+c3RhdGUgPT0gQ0hfU1RBVEVfU1VTUEVOREVEICYmCi0JICAgIGNoYW5uZWwtPmlvYltjaGFubmVsLT5pb19pZHhdLnN0YXRlID09IEJVRl9TVEFURV9SRUFEWSkgeworCWlmIChjaGFubmVsLT5zdGF0ZSA9PSBMQ1NfQ0hfU1RBVEVfU1VTUEVOREVEICYmCisJICAgIGNoYW5uZWwtPmlvYltjaGFubmVsLT5pb19pZHhdLnN0YXRlID09IExDU19CVUZfU1RBVEVfUkVBRFkpIHsKIAkJLy8gRklYTUU6IHdoYXQgaWYgcmMgIT0gMCA/PwogCQlyYyA9IF9fbGNzX3Jlc3VtZV9jaGFubmVsKGNoYW5uZWwpOwogCX0KQEAgLTE2ODksOCArMTY5MSw4IEBACiAJCWNhcmQtPnN0YXRlID0gREVWX1NUQVRFX1VQOwogCX0gZWxzZSB7CiAJCWNhcmQtPnN0YXRlID0gREVWX1NUQVRFX0RPV047Ci0JCWNhcmQtPndyaXRlLnN0YXRlID0gQ0hfU1RBVEVfSU5JVDsKLQkJY2FyZC0+cmVhZC5zdGF0ZSA9ICBDSF9TVEFURV9JTklUOworCQljYXJkLT53cml0ZS5zdGF0ZSA9IExDU19DSF9TVEFURV9JTklUOworCQljYXJkLT5yZWFkLnN0YXRlID0gIExDU19DSF9TVEFURV9JTklUOwogCX0KIAlyZXR1cm4gcmM7CiB9CkBAIC0xNzA1LDggKzE3MDcsOCBAQAogCiAJTENTX0RCRl9URVhUKDMsIHNldHVwLCAic3RvcGNhcmQiKTsKIAotCWlmIChjYXJkLT5yZWFkLnN0YXRlICE9IENIX1NUQVRFX1NUT1BQRUQgJiYKLQkgICAgY2FyZC0+d3JpdGUuc3RhdGUgIT0gQ0hfU1RBVEVfU1RPUFBFRCAmJgorCWlmIChjYXJkLT5yZWFkLnN0YXRlICE9IExDU19DSF9TVEFURV9TVE9QUEVEICYmCisJICAgIGNhcmQtPndyaXRlLnN0YXRlICE9IExDU19DSF9TVEFURV9TVE9QUEVEICYmCiAJICAgIGNhcmQtPnN0YXRlID09IERFVl9TVEFURV9VUCkgewogCQlsY3NfY2xlYXJfbXVsdGljYXN0X2xpc3QoY2FyZCk7CiAJCXJjID0gbGNzX3NlbmRfc3RvcGxhbihjYXJkLExDU19JTklUSUFUT1JfVENQSVApOwpAQCAtMTcyMiw4ICsxNzI0LDkgQEAKICAqIEtlcm5lbCBUaHJlYWQgaGVscGVyIGZ1bmN0aW9ucyBmb3IgTEdXIGluaXRpYXRlZCBjb21tYW5kcwogICovCiBzdGF0aWMgdm9pZAotbGNzX3N0YXJ0X2tlcm5lbF90aHJlYWQoc3RydWN0IGxjc19jYXJkICpjYXJkKQorbGNzX3N0YXJ0X2tlcm5lbF90aHJlYWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBsY3NfY2FyZCAqY2FyZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbGNzX2NhcmQsIGtlcm5lbF90aHJlYWRfc3RhcnRlcik7CiAJTENTX0RCRl9URVhUKDUsIHRyYWNlLCAia3JudGhyZCIpOwogCWlmIChsY3NfZG9fc3RhcnRfdGhyZWFkKGNhcmQsIExDU19SRUNPVkVSWV9USFJFQUQpKQogCQlrZXJuZWxfdGhyZWFkKGxjc19yZWNvdmVyeSwgKHZvaWQgKikgY2FyZCwgU0lHQ0hMRCk7CkBAIC0xODcxLDcgKzE4NzQsNyBAQAogCW5ldGlmX3R4X2Rpc2FibGUoZGV2KTsKIAlkZXYtPmZsYWdzICY9IH5JRkZfVVA7CiAJd2FpdF9ldmVudChjYXJkLT53cml0ZS53YWl0X3EsCi0JCShjYXJkLT53cml0ZS5zdGF0ZSAhPSBDSF9TVEFURV9SVU5OSU5HKSk7CisJCShjYXJkLT53cml0ZS5zdGF0ZSAhPSBMQ1NfQ0hfU1RBVEVfUlVOTklORykpOwogCXJjID0gbGNzX3N0b3BjYXJkKGNhcmQpOwogCWlmIChyYykKIAkJUFJJTlRfRVJSKCJUcnkgaXQgYWdhaW4hXG4gIik7CkBAIC0yMDUxLDggKzIwNTQsNyBAQAogCWNjd2dkZXYtPmNkZXZbMF0tPmhhbmRsZXIgPSBsY3NfaXJxOwogCWNjd2dkZXYtPmNkZXZbMV0tPmhhbmRsZXIgPSBsY3NfaXJxOwogCWNhcmQtPmdkZXYgPSBjY3dnZGV2OwotCUlOSVRfV09SSygmY2FyZC0+a2VybmVsX3RocmVhZF9zdGFydGVyLAotCQkgICh2b2lkICopIGxjc19zdGFydF9rZXJuZWxfdGhyZWFkLCBjYXJkKTsKKwlJTklUX1dPUksoJmNhcmQtPmtlcm5lbF90aHJlYWRfc3RhcnRlciwgbGNzX3N0YXJ0X2tlcm5lbF90aHJlYWQpOwogCWNhcmQtPnRocmVhZF9zdGFydF9tYXNrID0gMDsKIAljYXJkLT50aHJlYWRfYWxsb3dlZF9tYXNrID0gMDsKIAljYXJkLT50aHJlYWRfcnVubmluZ19tYXNrID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmggYi9kcml2ZXJzL3MzOTAvbmV0L2xjcy5oCmluZGV4IDkzMTQzOTMuLjBlMWU0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuaApAQCAtMjMsMTEgKzIzLDYgQEAKIH0gd2hpbGUgKDApCiAKIC8qKgotICogc29tZSBtb3JlIGRlZmluaXRpb25zIGZvciBkZWJ1ZyBvciBvdXRwdXQgc3R1ZmYKLSAqLwotI2RlZmluZSBQUklOVEtfSEVBREVSCQkiIGxjczogIgotCi0vKioKICAqCXN5c2ZzIHJlbGF0ZWQgc3R1ZmYKICAqLwogI2RlZmluZSBDQVJEX0ZST01fREVWKGNkZXYpIFwKQEAgLTEyNywyMiArMTIyLDIyIEBACiAgKiBMQ1MgQnVmZmVyIHN0YXRlcwogICovCiBlbnVtIGxjc19idWZmZXJfc3RhdGVzIHsKLQlCVUZfU1RBVEVfRU1QVFksCS8qIGJ1ZmZlciBpcyBlbXB0eSAqLwotCUJVRl9TVEFURV9MT0NLRUQsCS8qIGJ1ZmZlciBpcyBsb2NrZWQsIGRvbid0IHRvdWNoICovCi0JQlVGX1NUQVRFX1JFQURZLAkvKiBidWZmZXIgaXMgcmVhZHkgZm9yIHJlYWQvd3JpdGUgKi8KLQlCVUZfU1RBVEVfUFJPQ0VTU0VELAorCUxDU19CVUZfU1RBVEVfRU1QVFksCS8qIGJ1ZmZlciBpcyBlbXB0eSAqLworCUxDU19CVUZfU1RBVEVfTE9DS0VELAkvKiBidWZmZXIgaXMgbG9ja2VkLCBkb24ndCB0b3VjaCAqLworCUxDU19CVUZfU1RBVEVfUkVBRFksCS8qIGJ1ZmZlciBpcyByZWFkeSBmb3IgcmVhZC93cml0ZSAqLworCUxDU19CVUZfU1RBVEVfUFJPQ0VTU0VELAogfTsKIAogLyoqCiAgKiBMQ1MgQ2hhbm5lbCBTdGF0ZSBNYWNoaW5lIGRlY2xhcmF0aW9ucwogICovCiBlbnVtIGxjc19jaGFubmVsX3N0YXRlcyB7Ci0JQ0hfU1RBVEVfSU5JVCwKLQlDSF9TVEFURV9IQUxURUQsCi0JQ0hfU1RBVEVfU1RPUFBFRCwKLQlDSF9TVEFURV9SVU5OSU5HLAotCUNIX1NUQVRFX1NVU1BFTkRFRCwKLQlDSF9TVEFURV9DTEVBUkVELAorCUxDU19DSF9TVEFURV9JTklULAorCUxDU19DSF9TVEFURV9IQUxURUQsCisJTENTX0NIX1NUQVRFX1NUT1BQRUQsCisJTENTX0NIX1NUQVRFX1JVTk5JTkcsCisJTENTX0NIX1NUQVRFX1NVU1BFTkRFRCwKKwlMQ1NfQ0hfU1RBVEVfQ0xFQVJFRCwKIH07CiAKIC8qKgpAQCAtMTY5LDcgKzE2NCw3IEBACiB9ICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBsY3NfaXBfbWFjX3BhaXIgewotCV9fdTMyICBpcF9hZGRyOworCV9fYmUzMiAgaXBfYWRkcjsKIAlfX3U4ICAgbWFjX2FkZHJbTENTX01BQ19MRU5HVEhdOwogCV9fdTggICByZXNlcnZlZFsyXTsKIH0gIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKQEAgLTI4Nyw3ICsyODIsNyBAQAogCWVudW0gbGNzX2Rldl9zdGF0ZXMgc3RhdGU7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQl1bnNpZ25lZCBzaG9ydCAoKmxhbl90eXBlX3RyYW5zKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCV9fYmUxNiAoKmxhbl90eXBlX3RyYW5zKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldjsKIAlzdHJ1Y3QgbGNzX2NoYW5uZWwgcmVhZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKaW5kZXggODIxMzgzZC4uNTNjMzU4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKQEAgLTE1MSw4ICsxNTEsNiBAQAogI2RlZmluZSBTRU5TRV9SRVNFVFRJTkdfRVZFTlRfQllURSAxCiAjZGVmaW5lIFNFTlNFX1JFU0VUVElOR19FVkVOVF9GTEFHIDB4ODAKIAotI2RlZmluZSBhdG9taWNfc3dhcChhLGIpIHhjaGcoKGludCAqKWEuY291bnRlciwgYikKLQogLyoKICAqIENvbW1vbiBJTyByZWxhdGVkIGRlZmluaXRpb25zCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5jCmluZGV4IGEzNjM3MjEuLjZiYjU1OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2VkZHAuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcWV0aF9lZGRwX2NvcHlfZGF0YV90Y3AoY2hhciAqZHN0LCBzdHJ1Y3QgcWV0aF9lZGRwX2RhdGEgKmVkZHAsIGludCBsZW4sCi0JCQl1MzIgKmhjc3VtKQorCQkJX193c3VtICpoY3N1bSkKIHsKIAlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOwogCWludCBsZWZ0X2luX2ZyYWc7CkBAIC0zMDUsNyArMzA1LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcWV0aF9lZGRwX2NyZWF0ZV9zZWdtZW50X2RhdGFfdGNwKHN0cnVjdCBxZXRoX2VkZHBfY29udGV4dCAqY3R4LAogCQkJCSAgc3RydWN0IHFldGhfZWRkcF9kYXRhICplZGRwLCBpbnQgZGF0YV9sZW4sCi0JCQkJICB1MzIgaGNzdW0pCisJCQkJICBfX3dzdW0gaGNzdW0pCiB7CiAJdTggKnBhZ2U7CiAJaW50IHBhZ2VfcmVtYWluZGVyOwpAQCAtMzQ5LDEwICszNDksMTAgQEAKIAkoKHN0cnVjdCB0Y3BoZHIgKillZGRwLT50aF9pbl9jdHgpLT5jaGVjayA9IGNzdW1fZm9sZChoY3N1bSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyCitzdGF0aWMgaW5saW5lIF9fd3N1bQogcWV0aF9lZGRwX2NoZWNrX3RjcDRfaGRyKHN0cnVjdCBxZXRoX2VkZHBfZGF0YSAqZWRkcCwgaW50IGRhdGFfbGVuKQogewotCXUzMiBwaGNzdW07IC8qIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0gKi8KKwlfX3dzdW0gcGhjc3VtOyAvKiBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtICovCiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLCA1LCAiZWRkcGNrdDQiKTsKIAllZGRwLT50aC50Y3AuaC5jaGVjayA9IDA7CkBAIC0zNjMsMTEgKzM2MywxMSBAQAogCXJldHVybiBjc3VtX3BhcnRpYWwoKHU4ICopJmVkZHAtPnRoLCBlZGRwLT50aGwsIHBoY3N1bSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyCitzdGF0aWMgaW5saW5lIF9fd3N1bQogcWV0aF9lZGRwX2NoZWNrX3RjcDZfaGRyKHN0cnVjdCBxZXRoX2VkZHBfZGF0YSAqZWRkcCwgaW50IGRhdGFfbGVuKQogewotCXUzMiBwcm90bzsKLQl1MzIgcGhjc3VtOyAvKiBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtICovCisJX19iZTMyIHByb3RvOworCV9fd3N1bSBwaGNzdW07IC8qIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0gKi8KIAogCVFFVEhfREJGX1RFWFQodHJhY2UsIDUsICJlZGRwY2t0NiIpOwogCWVkZHAtPnRoLnRjcC5oLmNoZWNrID0gMDsKQEAgLTQwNSw3ICs0MDUsNyBAQAogewogCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CiAJaW50IGRhdGFfbGVuOwotCXUzMiBoY3N1bTsKKwlfX3dzdW0gaGNzdW07CiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLCA1LCAiZWRkcGZ0Y3AiKTsKIAllZGRwLT5za2Jfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikgKyBlZGRwLT5uaGwgKyBlZGRwLT50aGw7CkBAIC00MzMsMjIgKzQzMywyMiBAQAogCQkJZWRkcC0+cWguaGRyLmwzLmxlbmd0aCA9IGRhdGFfbGVuICsgZWRkcC0+bmhsICsKIAkJCQkJCSBlZGRwLT50aGw7CiAJCS8qIHByZXBhcmUgaXAgaGRyICovCi0JCWlmIChlZGRwLT5za2ItPnByb3RvY29sID09IEVUSF9QX0lQKXsKLQkJCWVkZHAtPm5oLmlwNC5oLnRvdF9sZW4gPSBkYXRhX2xlbiArIGVkZHAtPm5obCArCi0JCQkJCQkgZWRkcC0+dGhsOworCQlpZiAoZWRkcC0+c2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpeworCQkJZWRkcC0+bmguaXA0LmgudG90X2xlbiA9IGh0b25zKGRhdGFfbGVuICsgZWRkcC0+bmhsICsKKwkJCQkJCSBlZGRwLT50aGwpOwogCQkJZWRkcC0+bmguaXA0LmguY2hlY2sgPSAwOwogCQkJZWRkcC0+bmguaXA0LmguY2hlY2sgPQogCQkJCWlwX2Zhc3RfY3N1bSgodTggKikmZWRkcC0+bmguaXA0LmgsCiAJCQkJCQllZGRwLT5uaC5pcDQuaC5paGwpOwogCQl9IGVsc2UKLQkJCWVkZHAtPm5oLmlwNi5oLnBheWxvYWRfbGVuID0gZGF0YV9sZW4gKyBlZGRwLT50aGw7CisJCQllZGRwLT5uaC5pcDYuaC5wYXlsb2FkX2xlbiA9IGh0b25zKGRhdGFfbGVuICsgZWRkcC0+dGhsKTsKIAkJLyogcHJlcGFyZSB0Y3AgaGRyICovCiAJCWlmIChkYXRhX2xlbiA9PSAoZWRkcC0+c2tiLT5sZW4gLSBlZGRwLT5za2Jfb2Zmc2V0KSl7CiAJCQkvKiBsYXN0IHNlZ21lbnQgLT4gc2V0IEZJTiBhbmQgUFNIIGZsYWdzICovCiAJCQllZGRwLT50aC50Y3AuaC5maW4gPSB0Y3BoLT5maW47CiAJCQllZGRwLT50aC50Y3AuaC5wc2ggPSB0Y3BoLT5wc2g7CiAJCX0KLQkJaWYgKGVkZHAtPnNrYi0+cHJvdG9jb2wgPT0gRVRIX1BfSVApCisJCWlmIChlZGRwLT5za2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKIAkJCWhjc3VtID0gcWV0aF9lZGRwX2NoZWNrX3RjcDRfaGRyKGVkZHAsIGRhdGFfbGVuKTsKIAkJZWxzZQogCQkJaGNzdW0gPSBxZXRoX2VkZHBfY2hlY2tfdGNwNl9oZHIoZWRkcCwgZGF0YV9sZW4pOwpAQCAtNDU4LDkgKzQ1OCw5IEBACiAJCWlmIChlZGRwLT5za2Jfb2Zmc2V0ID49IGVkZHAtPnNrYi0+bGVuKQogCQkJYnJlYWs7CiAJCS8qIHByZXBhcmUgaGVhZGVycyBmb3IgbmV4dCByb3VuZCAqLwotCQlpZiAoZWRkcC0+c2tiLT5wcm90b2NvbCA9PSBFVEhfUF9JUCkKLQkJCWVkZHAtPm5oLmlwNC5oLmlkKys7Ci0JCWVkZHAtPnRoLnRjcC5oLnNlcSArPSBkYXRhX2xlbjsKKwkJaWYgKGVkZHAtPnNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQkJZWRkcC0+bmguaXA0LmguaWQgPSBodG9ucyhudG9ocyhlZGRwLT5uaC5pcDQuaC5pZCkgKyAxKTsKKwkJZWRkcC0+dGgudGNwLmguc2VxID0gaHRvbmwobnRvaGwoZWRkcC0+dGgudGNwLmguc2VxKSArIGRhdGFfbGVuKTsKIAl9CiB9CiAKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSwgNSwgImVkZHBmaWN4Iik7CiAJLyogY3JlYXRlIG91ciBzZWdtZW50YXRpb24gaGVhZGVycyBhbmQgY29weSBvcmlnaW5hbCBoZWFkZXJzICovCi0JaWYgKHNrYi0+cHJvdG9jb2wgPT0gRVRIX1BfSVApCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQogCQllZGRwID0gcWV0aF9lZGRwX2NyZWF0ZV9lZGRwX2RhdGEocWhkciwgKHU4ICopc2tiLT5uaC5pcGgsCiAJCQkJc2tiLT5uaC5pcGgtPmlobCo0LAogCQkJCSh1OCAqKXNrYi0+aC50aCwgc2tiLT5oLnRoLT5kb2ZmKjQpOwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJCW1lbWNweSgmZWRkcC0+bWFjLCBldGhfaGRyKHNrYiksIEVUSF9ITEVOKTsKICNpZmRlZiBDT05GSUdfUUVUSF9WTEFOCiAJCWlmIChlZGRwLT5tYWMuaF9wcm90byA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgewotCQkJZWRkcC0+dmxhblswXSA9IF9fY29uc3RhbnRfaHRvbnMoc2tiLT5wcm90b2NvbCk7CisJCQllZGRwLT52bGFuWzBdID0gc2tiLT5wcm90b2NvbDsKIAkJCWVkZHAtPnZsYW5bMV0gPSBodG9ucyh2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CiAJCX0KICNlbmRpZiAvKiBDT05GSUdfUUVUSF9WTEFOICovCkBAIC01ODgsMTEgKzU4OCwxMSBAQAogCXN0cnVjdCBxZXRoX2VkZHBfY29udGV4dCAqY3R4ID0gTlVMTDsKIAogCVFFVEhfREJGX1RFWFQodHJhY2UsIDUsICJjcmVkZHBjdCIpOwotCWlmIChza2ItPnByb3RvY29sID09IEVUSF9QX0lQKQorCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKIAkJY3R4ID0gcWV0aF9lZGRwX2NyZWF0ZV9jb250ZXh0X2dlbmVyaWMoY2FyZCwgc2tiLAogCQkJc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikgKyBza2ItPm5oLmlwaC0+aWhsKjQgKwogCQkJc2tiLT5oLnRoLT5kb2ZmKjQpOwotCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gRVRIX1BfSVBWNikKKwllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQogCQljdHggPSBxZXRoX2VkZHBfY3JlYXRlX2NvbnRleHRfZ2VuZXJpYyhjYXJkLCBza2IsCiAJCQlzaXplb2Yoc3RydWN0IHFldGhfaGRyKSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKwogCQkJc2tiLT5oLnRoLT5kb2ZmKjQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2VkZHAuaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmgKaW5kZXggY2FlOWJhMi4uMTAzNzY4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2VkZHAuaAorKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5oCkBAIC01NCw3ICs1NCw3IEBACiBzdHJ1Y3QgcWV0aF9lZGRwX2RhdGEgewogCXN0cnVjdCBxZXRoX2hkciBxaDsKIAlzdHJ1Y3QgZXRoaGRyIG1hYzsKLQl1MTYgdmxhblsyXTsKKwlfX2JlMTYgdmxhblsyXTsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgaXBoZHIgaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCmluZGV4IDgzNjRkNTQuLjJiZGU0ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYwpAQCAtMTAzOSw4ICsxMDM5LDkgQEAKIH0KIAogc3RhdGljIHZvaWQKLXFldGhfc3RhcnRfa2VybmVsX3RocmVhZChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQorcWV0aF9zdGFydF9rZXJuZWxfdGhyZWFkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBxZXRoX2NhcmQsIGtlcm5lbF90aHJlYWRfc3RhcnRlcik7CiAJUUVUSF9EQkZfVEVYVCh0cmFjZSAsIDIsICJzdHJ0aHJkIik7CiAKIAlpZiAoY2FyZC0+cmVhZC5zdGF0ZSAhPSBDSF9TVEFURV9VUCAmJgpAQCAtMTEwMyw4ICsxMTA0LDcgQEAKIAljYXJkLT50aHJlYWRfc3RhcnRfbWFzayA9IDA7CiAJY2FyZC0+dGhyZWFkX2FsbG93ZWRfbWFzayA9IDA7CiAJY2FyZC0+dGhyZWFkX3J1bm5pbmdfbWFzayA9IDA7Ci0JSU5JVF9XT1JLKCZjYXJkLT5rZXJuZWxfdGhyZWFkX3N0YXJ0ZXIsCi0JCSAgKHZvaWQgKilxZXRoX3N0YXJ0X2tlcm5lbF90aHJlYWQsY2FyZCk7CisJSU5JVF9XT1JLKCZjYXJkLT5rZXJuZWxfdGhyZWFkX3N0YXJ0ZXIsIHFldGhfc3RhcnRfa2VybmVsX3RocmVhZCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmlwX2xpc3QpOwogCWNhcmQtPmlwX3RiZF9saXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOwogCWlmICghY2FyZC0+aXBfdGJkX2xpc3QpIHsKQEAgLTI5ODIsNyArMjk4Miw3IEBACiAJICovCiAJaWYgKChhdG9taWNfcmVhZCgmcXVldWUtPnVzZWRfYnVmZmVycykgPD0gUUVUSF9MT1dfV0FURVJNQVJLX1BBQ0spIHx8CiAJICAgICFhdG9taWNfcmVhZCgmcXVldWUtPnNldF9wY2lfZmxhZ3NfY291bnQpKXsKLQkJaWYgKGF0b21pY19zd2FwKCZxdWV1ZS0+c3RhdGUsIFFFVEhfT1VUX1FfTE9DS0VEX0ZMVVNIKSA9PQorCQlpZiAoYXRvbWljX3hjaGcoJnF1ZXVlLT5zdGF0ZSwgUUVUSF9PVVRfUV9MT0NLRURfRkxVU0gpID09CiAJCQkJUUVUSF9PVVRfUV9VTkxPQ0tFRCkgewogCQkJLyoKIAkJCSAqIElmIHdlIGdldCBpbiBoZXJlLCB0aGVyZSB3YXMgbm8gYWN0aW9uIGluCkBAIC0zMjQ1LDcgKzMyNDUsNyBAQAogCWludCBpLCBqOwogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSwgMiwgImZyZWVxZGJmIik7Ci0JaWYgKGF0b21pY19zd2FwKCZjYXJkLT5xZGlvLnN0YXRlLCBRRVRIX1FESU9fVU5JTklUSUFMSVpFRCkgPT0KKwlpZiAoYXRvbWljX3hjaGcoJmNhcmQtPnFkaW8uc3RhdGUsIFFFVEhfUURJT19VTklOSVRJQUxJWkVEKSA9PQogCQlRRVRIX1FESU9fVU5JTklUSUFMSVpFRCkKIAkJcmV0dXJuOwogCWtmcmVlKGNhcmQtPnFkaW8uaW5fcSk7CkBAIC00MzY2LDcgKzQzNjYsNyBAQAogCWlmIChmbHVzaF9jb3VudCkKIAkJcWV0aF9mbHVzaF9idWZmZXJzKHF1ZXVlLCAwLCBzdGFydF9pbmRleCwgZmx1c2hfY291bnQpOwogCWVsc2UgaWYgKCFhdG9taWNfcmVhZCgmcXVldWUtPnNldF9wY2lfZmxhZ3NfY291bnQpKQotCQlhdG9taWNfc3dhcCgmcXVldWUtPnN0YXRlLCBRRVRIX09VVF9RX0xPQ0tFRF9GTFVTSCk7CisJCWF0b21pY194Y2hnKCZxdWV1ZS0+c3RhdGUsIFFFVEhfT1VUX1FfTE9DS0VEX0ZMVVNIKTsKIAkvKgogCSAqIHF1ZXVlLT5zdGF0ZSB3aWxsIGdvIGZyb20gTE9DS0VEIC0+IFVOTE9DS0VEIG9yIGZyb20KIAkgKiBMT0NLRURfRkxVU0ggLT4gTE9DS0VEIGlmIG91dHB1dF9oYW5kbGVyIHdhbnRlZCB0byAnbm90aWZ5JyB1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKaW5kZXggNWQzOWIyZC4uODUwOTNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlsZW4gPSBzdHJsZW4oZGV2c3RyKSArIDE7Ci0Jc3RyID0gKGNoYXIgKikga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCXN0ciA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0cikKIAkJZ290byBlcnJfb3V0OwogCW1lbWNweShzdHIsIGRldnN0ciwgbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmggYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RlZi5oCmluZGV4IDhmODgyNjkuLjMyOTMzZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGVmLmgKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kZWYuaApAQCAtMTA3LDYgKzEwNywxMCBAQAogCShaRkNQX01BWF9TQkFMU19QRVJfUkVRICogWkZDUF9NQVhfU0JBTEVTX1BFUl9TQkFMIC0gMikKICAgICAgICAgLyogcmVxdWVzdCBJRCArIFFUQ0IgaW4gU0JBTEUgMCArIDEgb2YgZmlyc3QgU0JBTCBpbiBjaGFpbiAqLwogCisjZGVmaW5lIFpGQ1BfTUFYX1NFQ1RPUlMgKFpGQ1BfTUFYX1NCQUxFU19QRVJfUkVRICogOCkKKyAgICAgICAgLyogbWF4LiBudW1iZXIgb2YgKGRhdGEgYnVmZmVyKSBTQkFMRXMgaW4gbGFyZ2VzdCBTQkFMIGNoYWluCisgICAgICAgICAgIG11bHRpcGxpZWQgd2l0aCBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgNGsgYmxvY2sgKi8KKwogLyogRklYTUUodHVuZSk6IGZyZWUgc3BhY2Ugc2hvdWxkIGJlIG9uZSBtYXguIFNCQUwgY2hhaW4gcGx1cyB3aGF0PyAqLwogI2RlZmluZSBaRkNQX1FESU9fUENJX0lOVEVSVkFMCQkoUURJT19NQVhfQlVGRkVSU19QRVJfUSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKFpGQ1BfTUFYX1NCQUxTX1BFUl9SRVEgKyA0KSkKQEAgLTEwMjgsOSArMTAzMiw5IEBACiAJd3duX3QgICAgICAgICAgICAgICAgICAgaW5pdF93d3BuOwogCWZjcF9sdW5fdCAgICAgICAgICAgICAgIGluaXRfZmNwX2x1bjsKIAljaGFyIAkJCSpkcml2ZXJfdmVyc2lvbjsKLQlrbWVtX2NhY2hlX3QJCSpmc2ZfcmVxX3F0Y2JfY2FjaGU7Ci0Ja21lbV9jYWNoZV90CQkqc3JfYnVmZmVyX2NhY2hlOwotCWttZW1fY2FjaGVfdAkJKmdpZF9wbl9jYWNoZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZQkJKmZzZl9yZXFfcXRjYl9jYWNoZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZQkJKnNyX2J1ZmZlcl9jYWNoZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZQkJKmdpZF9wbl9jYWNoZTsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKaW5kZXggMjc3ODI2Yy4uMDY3ZjE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJCXB0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJCWVsc2UKIAkJCXB0ciA9IGttZW1fY2FjaGVfYWxsb2MoemZjcF9kYXRhLmZzZl9yZXFfcXRjYl9jYWNoZSwKLQkJCQkJICAgICAgIFNMQUJfQVRPTUlDKTsKKwkJCQkJICAgICAgIEdGUF9BVE9NSUMpOwogCX0KIAogCWlmICh1bmxpa2VseSghcHRyKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMKaW5kZXggNGQyYmM3OS4uNDUyZDk2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMKKysrIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMKQEAgLTU4LDYgKzU4LDcgQEAKIAkJLmNtZF9wZXJfbHVuCQk9IDEsCiAJCS51c2VfY2x1c3RlcmluZwkJPSAxLAogCQkuc2Rldl9hdHRycwkJPSB6ZmNwX3N5c2ZzX3NkZXZfYXR0cnMsCisJCS5tYXhfc2VjdG9ycwkJPSBaRkNQX01BWF9TRUNUT1JTLAogCX0sCiAJLmRyaXZlcl92ZXJzaW9uID0gWkZDUF9WRVJTSU9OLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfZW52Y3RybC5jCmluZGV4IDBkMzY2MGMuLmE1NGU0MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYwpAQCAtNSw4ICs1LDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KIApAQCAtMTk1LDcgKzE5NSw3IEBACiAJcHJpbnRrKEtFUk5fQ1JJVCAia2VudmN0cmxkOiBTaHV0dGluZyBkb3duIHRoZSBzeXN0ZW0gbm93LlxuIik7CiAKIAlzaHV0dGluZ19kb3duID0gMTsKLQlpZiAoa2VybmVsX2V4ZWN2ZSgiL3NiaW4vc2h1dGRvd24iLCBhcmd2LCBlbnZwKSA8IDApCisJaWYgKGNhbGxfdXNlcm1vZGVoZWxwZXIoIi9zYmluL3NodXRkb3duIiwgYXJndiwgZW52cCwgMCkgPCAwKQogCQlwcmludGsoS0VSTl9DUklUICJlbnZjdHJsOiBzaHV0ZG93biBleGVjdXRpb24gZmFpbGVkXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYnBwLmMgYi9kcml2ZXJzL3NidXMvY2hhci9icHAuYwppbmRleCAzODVmNGY3Li5hYzdkMTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9icHAuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9icHAuYwpAQCAtNjIxLDcgKzYyMSw3IEBACiBzdGF0aWMgc3NpemVfdCBicHBfcmVhZChzdHJ1Y3QgZmlsZSAqZiwgY2hhciBfX3VzZXIgKmMsIHNpemVfdCBjbnQsIGxvZmZfdCAqIHBwb3MpCiB7CiAgICAgICBsb25nIHJjOwotICAgICAgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZi0+Zl9kZW50cnktPmRfaW5vZGUpOworICAgICAgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZi0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAgICAgICBpZiAobWlub3IgPj0gQlBQX05PKSByZXR1cm4gLUVOT0RFVjsKICAgICAgIGlmICghaW5zdGFuY2VzW21pbm9yXS5wcmVzZW50KSByZXR1cm4gLUVOT0RFVjsKIApAQCAtNzc0LDcgKzc3NCw3IEBACiBzdGF0aWMgc3NpemVfdCBicHBfd3JpdGUoc3RydWN0IGZpbGUgKmYsIGNvbnN0IGNoYXIgX191c2VyICpjLCBzaXplX3QgY250LCBsb2ZmX3QgKiBwcG9zKQogewogICAgICAgbG9uZyBlcnJubyA9IDA7Ci0gICAgICB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisgICAgICB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKICAgICAgIGlmIChtaW5vciA+PSBCUFBfTk8pIHJldHVybiAtRU5PREVWOwogICAgICAgaWYgKCFpbnN0YW5jZXNbbWlub3JdLnByZXNlbnQpIHJldHVybiAtRU5PREVWOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMgYi9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMKaW5kZXggZjU4MDNlYy4uYWQxYzdkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Nwd2F0Y2hkb2cuYwpAQCAtNDA0LDcgKzQwNCw3IEBACiAJY2FzZSBXSU9DU1RPUDoKIAljYXNlIFdJT0NHU1RBVDoKIAkJbG9ja19rZXJuZWwoKTsKLQkJcnZhbCA9IHdkX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJCXJ2YWwgPSB3ZF9pb2N0bChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlLCBjbWQsIGFyZyk7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJYnJlYWs7CiAJLyogZXZlcnl0aGluZyBlbHNlIGlzIGhhbmRsZWQgYnkgdGhlIGdlbmVyaWMgY29tcGF0IGxheWVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYwppbmRleCBkOTJiYzg4Li5hNDkwOWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCV9fdTggaXJlZyA9IDA7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChEN1NfTUlOT1IgIT0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSkKKwlpZiAoRDdTX01JTk9SICE9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlsb2NrX2tlcm5lbCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCmluZGV4IDZiNmE4NTUuLmZmZjQ2NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KIAogI2luY2x1ZGUgPGFzbS9lYnVzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTk3Niw3ICs5NzYsNyBAQAogCiAJaW5wcm9nID0gMTsKIAlwcmludGsoS0VSTl9DUklUICJrZW52Y3RybGQ6IFdBUk5JTkc6IFNodXR0aW5nIGRvd24gdGhlIHN5c3RlbSBub3cuXG4iKTsKLQlyZXQgPSBrZXJuZWxfZXhlY3ZlKCIvc2Jpbi9zaHV0ZG93biIsIGFyZ3YsIGVudnApOworCXJldCA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoIi9zYmluL3NodXRkb3duIiwgYXJndiwgZW52cCwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAia2VudmN0cmxkOiBXQVJOSU5HOiBzeXN0ZW0gc2h1dGRvd24gZmFpbGVkIVxuIik7IAogCQlpbnByb2cgPSAwOyAgLyogdW5saWtlbHkgdG8gc3VjY2VlZCwgYnV0IHdlIGNvdWxkIHRyeSBhZ2FpbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvb3BlbnByb20uYyBiL2RyaXZlcnMvc2J1cy9jaGFyL29wZW5wcm9tLmMKaW5kZXggODFiYTJkNy4uNGUyYTBlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvb3BlbnByb20uYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9vcGVucHJvbS5jCkBAIC02NzYsNyArNjc2LDcgQEAKIAljYXNlIE9QUk9NU0VUQ1VSOgogCWNhc2UgT1BST01QQ0kyTk9ERToKIAljYXNlIE9QUk9NUEFUSDJOT0RFOgotCQlydmFsID0gb3BlbnByb21faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKKwkJcnZhbCA9IG9wZW5wcm9tX2lvY3RsKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci92ZmNfZGV2LmMgYi9kcml2ZXJzL3NidXMvY2hhci92ZmNfZGV2LmMKaW5kZXggNTViMmIzMS4uMzg2ZTdkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2Rldi5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL3ZmY19kZXYuYwpAQCAtNjEwLDcgKzYxMCw3IEBACiAJdW5zaWduZWQgaW50IG1hcF9zaXplLCByZXQsIG1hcF9vZmZzZXQ7CiAJc3RydWN0IHZmY19kZXYgKmRldjsKIAkKLQlkZXYgPSB2ZmNfZ2V0X2Rldl9wdHIoaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisJZGV2ID0gdmZjX2dldF9kZXZfcHRyKGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSk7CiAJaWYoZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC02NTksNyArNjU5LDcgQEAKIAlpZiAoIWNhcmRzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXZmY19kZXZfbHN0ID0gKHN0cnVjdCB2ZmNfZGV2ICoqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmNfZGV2ICopICoKKwl2ZmNfZGV2X2xzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmNfZGV2ICopICoKIAkJCQkJCSAoY2FyZHMrMSksCiAJCQkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKHZmY19kZXZfbHN0ID09IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvc2J1cy5jIGIvZHJpdmVycy9zYnVzL3NidXMuYwppbmRleCA5MzU5NTJlLi45OGZjYmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvc2J1cy5jCisrKyBiL2RyaXZlcnMvc2J1cy9zYnVzLmMKQEAgLTYxLDExICs2MSwxMSBAQAogCWVsc2UKIAkJc2Rldi0+b2ZkZXYuZGV2LnBhcmVudCA9ICZzZGV2LT5idXMtPm9mZGV2LmRldjsKIAlzZGV2LT5vZmRldi5kZXYuYnVzID0gJnNidXNfYnVzX3R5cGU7Ci0Jc3RyY3B5KHNkZXYtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKwlzcHJpbnRmKHNkZXYtPm9mZGV2LmRldi5idXNfaWQsICJzYnVzWyUwOHhdIiwgZHAtPm5vZGUpOwogCiAJaWYgKG9mX2RldmljZV9yZWdpc3Rlcigmc2Rldi0+b2ZkZXYpICE9IDApCiAJCXByaW50ayhLRVJOX0RFQlVHICJzYnVzOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGVycm9yIGZvciAlcyFcbiIsCi0JCSAgICAgICBzZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNidXNfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMgYi9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCmluZGV4IDVmOGMyNmMuLmIwOTFhMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMKKysrIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguYwpAQCAtNjYsNiArNjYsOSBAQAogICAgMi4yNi4wMi4wMDYgLSBGaXggOTU1MFNYIHBjaGlwIHJlc2V0IHRpbWVvdXQuCiAgICAgICAgICAgICAgICAgIEFkZCBiaWcgZW5kaWFuIHN1cHBvcnQuCiAgICAyLjI2LjAyLjAwNyAtIERpc2FibGUgbG9jYWwgaW50ZXJydXB0cyBkdXJpbmcga21hcC91bm1hcF9hdG9taWMoKS4KKyAgIDIuMjYuMDIuMDA4IC0gRnJlZSBpcnEgaGFuZGxlciBpbiBfX3R3YV9zaHV0ZG93bigpLgorICAgICAgICAgICAgICAgICBTZXJpYWxpemUgcmVzZXQgY29kZS4KKyAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIDk2NTBTRSBjb250cm9sbGVycy4KICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTg5LDcgKzkyLDcgQEAKICNpbmNsdWRlICIzdy05eHh4LmgiCiAKIC8qIEdsb2JhbHMgKi8KLSNkZWZpbmUgVFdfRFJJVkVSX1ZFUlNJT04gIjIuMjYuMDIuMDA3IgorI2RlZmluZSBUV19EUklWRVJfVkVSU0lPTiAiMi4yNi4wMi4wMDgiCiBzdGF0aWMgVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdhX2RldmljZV9leHRlbnNpb25fbGlzdFtUV19NQVhfU0xPVF07CiBzdGF0aWMgdW5zaWduZWQgaW50IHR3YV9kZXZpY2VfZXh0ZW5zaW9uX2NvdW50Owogc3RhdGljIGludCB0d2FfbWFqb3IgPSAtMTsKQEAgLTU2Niw5ICs1NjksOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl0d19kZXYtPndvcmtpbmdfc3JsID0gZndfb25fY3Rscl9zcmw7Ci0JdHdfZGV2LT53b3JraW5nX2JyYW5jaCA9IGZ3X29uX2N0bHJfYnJhbmNoOwotCXR3X2Rldi0+d29ya2luZ19idWlsZCA9IGZ3X29uX2N0bHJfYnVpbGQ7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby53b3JraW5nX3NybCA9IGZ3X29uX2N0bHJfc3JsOworCXR3X2Rldi0+dHdfY29tcGF0X2luZm8ud29ya2luZ19icmFuY2ggPSBmd19vbl9jdGxyX2JyYW5jaDsKKwl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLndvcmtpbmdfYnVpbGQgPSBmd19vbl9jdGxyX2J1aWxkOwogCiAJLyogVHJ5IGJhc2UgbW9kZSBjb21wYXRpYmlsaXR5ICovCiAJaWYgKCEoaW5pdF9jb25uZWN0X3Jlc3VsdCAmIFRXX0NUTFJfRldfQ09NUEFUSUJMRSkpIHsKQEAgLTU5MCwxMCArNTkzLDIzIEBACiAJCQl9CiAJCQlnb3RvIG91dDsKIAkJfQotCQl0d19kZXYtPndvcmtpbmdfc3JsID0gVFdfQkFTRV9GV19TUkw7Ci0JCXR3X2Rldi0+d29ya2luZ19icmFuY2ggPSBUV19CQVNFX0ZXX0JSQU5DSDsKLQkJdHdfZGV2LT53b3JraW5nX2J1aWxkID0gVFdfQkFTRV9GV19CVUlMRDsKKwkJdHdfZGV2LT50d19jb21wYXRfaW5mby53b3JraW5nX3NybCA9IFRXX0JBU0VfRldfU1JMOworCQl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLndvcmtpbmdfYnJhbmNoID0gVFdfQkFTRV9GV19CUkFOQ0g7CisJCXR3X2Rldi0+dHdfY29tcGF0X2luZm8ud29ya2luZ19idWlsZCA9IFRXX0JBU0VfRldfQlVJTEQ7CiAJfQorCisJLyogTG9hZCByZXN0IG9mIGNvbXBhdGliaWxpdHkgc3RydWN0ICovCisJc3RybmNweSh0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmRyaXZlcl92ZXJzaW9uLCBUV19EUklWRVJfVkVSU0lPTiwgc3RybGVuKFRXX0RSSVZFUl9WRVJTSU9OKSk7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfc3JsX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9TUkw7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfYnJhbmNoX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9CUkFOQ0g7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfYnVpbGRfaGlnaCA9IFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEOworCXR3X2Rldi0+dHdfY29tcGF0X2luZm8uZHJpdmVyX3NybF9sb3cgPSBUV19CQVNFX0ZXX1NSTDsKKwl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmRyaXZlcl9icmFuY2hfbG93ID0gVFdfQkFTRV9GV19CUkFOQ0g7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5kcml2ZXJfYnVpbGRfbG93ID0gVFdfQkFTRV9GV19CVUlMRDsKKwl0d19kZXYtPnR3X2NvbXBhdF9pbmZvLmZ3X29uX2N0bHJfc3JsID0gZndfb25fY3Rscl9zcmw7CisJdHdfZGV2LT50d19jb21wYXRfaW5mby5md19vbl9jdGxyX2JyYW5jaCA9IGZ3X29uX2N0bHJfYnJhbmNoOworCXR3X2Rldi0+dHdfY29tcGF0X2luZm8uZndfb25fY3Rscl9idWlsZCA9IGZ3X29uX2N0bHJfYnVpbGQ7CisKIAlyZXR2YWwgPSAwOwogb3V0OgogCXJldHVybiByZXR2YWw7CkBAIC02MzEsNyArNjQ3LDcgQEAKIAkJZ290byBvdXQyOwogCiAJLyogQ2hlY2sgZGF0YSBidWZmZXIgc2l6ZSAqLwotCWlmIChkcml2ZXJfY29tbWFuZC5idWZmZXJfbGVuZ3RoID4gVFdfTUFYX1NFQ1RPUlMgKiA1MTIpIHsKKwlpZiAoZHJpdmVyX2NvbW1hbmQuYnVmZmVyX2xlbmd0aCA+IFRXX01BWF9TRUNUT1JTICogMjA0OCkgewogCQlyZXR2YWwgPSBUV19JT0NUTF9FUlJPUl9PU19FSU5WQUw7CiAJCWdvdG8gb3V0MjsKIAl9CkBAIC02ODAsMTMgKzY5Niw2IEBACiAJCS8qIE5vdyB3YWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCiAJCXRpbWVvdXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHdfZGV2LT5pb2N0bF93cXVldWUsIHR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPT0gVFdfSU9DVExfQ0hSREVWX0ZSRUUsIHRpbWVvdXQpOwogCi0JCS8qIFNlZSBpZiB3ZSByZXNldCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgaW9jdGwgdG8gY29tcGxldGUgKi8KLQkJaWYgKHRlc3RfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncykpIHsKLQkJCWNsZWFyX2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOwotCQkJcmV0dmFsID0gVFdfSU9DVExfRVJST1JfT1NfRVJFU1RBUlRTWVM7Ci0JCQlnb3RvIG91dDM7Ci0JCX0KLQogCQkvKiBXZSB0aW1lZCBvdXQsIGFuZCBkaWRuJ3QgZ2V0IGFuIGludGVycnVwdCAqLwogCQlpZiAodHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCAhPSBUV19JT0NUTF9DSFJERVZfRlJFRSkgewogCQkJLyogTm93IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGJvYXJkICovCkBAIC02OTQsMTEgKzcwMyw2IEBACiAJCQkgICAgICAgdHdfZGV2LT5ob3N0LT5ob3N0X25vLCBUV19EUklWRVIsIDB4YywKIAkJCSAgICAgICBjbWQpOwogCQkJcmV0dmFsID0gVFdfSU9DVExfRVJST1JfT1NfRUlPOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX0NPTVBMRVRFRDsKLQkJCXR3YV9mcmVlX3JlcXVlc3RfaWQodHdfZGV2LCByZXF1ZXN0X2lkKTsKLQkJCXR3X2Rldi0+cG9zdGVkX3JlcXVlc3RfY291bnQtLTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodHdfZGV2LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJCXR3YV9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKHR3X2RldiwgMSk7CiAJCQlnb3RvIG91dDM7CiAJCX0KQEAgLTcxNywxNiArNzIxLDcgQEAKIAkJdHdfaW9jdGwtPmRyaXZlcl9jb21tYW5kLnN0YXR1cyA9IDA7CiAJCS8qIENvcHkgY29tcGF0aWJsaXR5IHN0cnVjdCBpbnRvIGlvY3RsIGRhdGEgYnVmZmVyICovCiAJCXR3X2NvbXBhdF9pbmZvID0gKFRXX0NvbXBhdGliaWxpdHlfSW5mbyAqKXR3X2lvY3RsLT5kYXRhX2J1ZmZlcjsKLQkJc3RybmNweSh0d19jb21wYXRfaW5mby0+ZHJpdmVyX3ZlcnNpb24sIFRXX0RSSVZFUl9WRVJTSU9OLCBzdHJsZW4oVFdfRFJJVkVSX1ZFUlNJT04pKTsKLQkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfc3JsID0gdHdfZGV2LT53b3JraW5nX3NybDsKLQkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfYnJhbmNoID0gdHdfZGV2LT53b3JraW5nX2JyYW5jaDsKLQkJdHdfY29tcGF0X2luZm8tPndvcmtpbmdfYnVpbGQgPSB0d19kZXYtPndvcmtpbmdfYnVpbGQ7Ci0JCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfc3JsX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9TUkw7Ci0JCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnJhbmNoX2hpZ2ggPSBUV19DVVJSRU5UX0RSSVZFUl9CUkFOQ0g7Ci0JCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnVpbGRfaGlnaCA9IFRXX0NVUlJFTlRfRFJJVkVSX0JVSUxEOwotCQl0d19jb21wYXRfaW5mby0+ZHJpdmVyX3NybF9sb3cgPSBUV19CQVNFX0ZXX1NSTDsKLQkJdHdfY29tcGF0X2luZm8tPmRyaXZlcl9icmFuY2hfbG93ID0gVFdfQkFTRV9GV19CUkFOQ0g7Ci0JCXR3X2NvbXBhdF9pbmZvLT5kcml2ZXJfYnVpbGRfbG93ID0gVFdfQkFTRV9GV19CVUlMRDsKKwkJbWVtY3B5KHR3X2NvbXBhdF9pbmZvLCAmdHdfZGV2LT50d19jb21wYXRfaW5mbywgc2l6ZW9mKFRXX0NvbXBhdGliaWxpdHlfSW5mbykpOwogCQlicmVhazsKIAljYXNlIFRXX0lPQ1RMX0dFVF9MQVNUX0VWRU5UOgogCQlpZiAodHdfZGV2LT5ldmVudF9xdWV1ZV93cmFwcGVkKSB7CkBAIC04OTUsNyArODkwLDggQEAKIAl9CiAKIAlpZiAoc3RhdHVzX3JlZ192YWx1ZSAmIFRXX1NUQVRVU19RVUVVRV9FUlJPUikgewotCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZSwgIkNvbnRyb2xsZXIgUXVldWUgRXJyb3I6IGNsZWFyaW5nIik7CisJCWlmICgodHdfZGV2LT50d19wY2lfZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF8zV0FSRV85NjUwU0UpIHx8ICghdGVzdF9iaXQoVFdfSU5fUkVTRVQsICZ0d19kZXYtPmZsYWdzKSkpCisJCQlUV19QUklOVEsodHdfZGV2LT5ob3N0LCBUV19EUklWRVIsIDB4ZSwgIkNvbnRyb2xsZXIgUXVldWUgRXJyb3I6IGNsZWFyaW5nIik7CiAJCXdyaXRlbChUV19DT05UUk9MX0NMRUFSX1FVRVVFX0VSUk9SLCBUV19DT05UUk9MX1JFR19BRERSKHR3X2RldikpOwogCX0KIApAQCAtOTM5LDEwICs5MzUsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGJlZm9yZTsKIAlpbnQgcmV0dmFsID0gMTsKIAotCWlmICh0d19kZXYtPnR3X3BjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzNXQVJFXzk1NTBTWCkgeworCWlmICgodHdfZGV2LT50d19wY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF8zV0FSRV85NTUwU1gpIHx8CisJICAgICh0d19kZXYtPnR3X3BjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzNXQVJFXzk2NTBTRSkpIHsKIAkJYmVmb3JlID0gamlmZmllczsKIAkJd2hpbGUgKChyZXNwb25zZV9xdWVfdmFsdWUgJiBUV185NTUwU1hfRFJBSU5fQ09NUExFVEVEKSAhPSBUV185NTUwU1hfRFJBSU5fQ09NUExFVEVEKSB7CiAJCQlyZXNwb25zZV9xdWVfdmFsdWUgPSByZWFkbChUV19SRVNQT05TRV9RVUVVRV9SRUdfQUREUl9MQVJHRSh0d19kZXYpKTsKKwkJCW1zbGVlcCgxKTsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGJlZm9yZSArIEhaICogMzApKQogCQkJCWdvdG8gb3V0OwogCQl9CkBAIC0xMjE0LDYgKzEyMTIsMTAgQEAKIAogCWhhbmRsZWQgPSAxOwogCisJLyogSWYgd2UgYXJlIHJlc2V0dGluZywgYmFpbCAqLworCWlmICh0ZXN0X2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpKQorCQlnb3RvIHR3YV9pbnRlcnJ1cHRfYmFpbDsKKwogCS8qIENoZWNrIGNvbnRyb2xsZXIgZm9yIGVycm9ycyAqLwogCWlmICh0d2FfY2hlY2tfYml0cyhzdGF0dXNfcmVnX3ZhbHVlKSkgewogCQlpZiAodHdhX2RlY29kZV9iaXRzKHR3X2Rldiwgc3RhdHVzX3JlZ192YWx1ZSkpIHsKQEAgLTEzNTUsOCArMTM1Nyw4IEBACiAKIAlpZiAoVFdfT1BfT1VUKGZ1bGxfY29tbWFuZF9wYWNrZXQtPmNvbW1hbmQubmV3Y29tbWFuZC5vcGNvZGVfX3Jlc2VydmVkKSA9PSBUV19PUF9FWEVDVVRFX1NDU0kpIHsKIAkJbmV3Y29tbWFuZCA9ICZmdWxsX2NvbW1hbmRfcGFja2V0LT5jb21tYW5kLm5ld2NvbW1hbmQ7Ci0JCW5ld2NvbW1hbmQtPnJlcXVlc3RfaWRfX2x1bmwgPSAKLQkJCVRXX1JFUV9MVU5fSU4oVFdfTFVOX09VVChuZXdjb21tYW5kLT5yZXF1ZXN0X2lkX19sdW5sKSwgcmVxdWVzdF9pZCk7CisJCW5ld2NvbW1hbmQtPnJlcXVlc3RfaWRfX2x1bmwgPQorCQkJY3B1X3RvX2xlMTYoVFdfUkVRX0xVTl9JTihUV19MVU5fT1VUKG5ld2NvbW1hbmQtPnJlcXVlc3RfaWRfX2x1bmwpLCByZXF1ZXN0X2lkKSk7CiAJCW5ld2NvbW1hbmQtPnNnX2xpc3RbMF0uYWRkcmVzcyA9IFRXX0NQVV9UT19TR0woZG1hX2hhbmRsZSArIHNpemVvZihUV19Jb2N0bF9CdWZfQXBhY2hlKSAtIDEpOwogCQluZXdjb21tYW5kLT5zZ19saXN0WzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKGxlbmd0aCk7CiAJCW5ld2NvbW1hbmQtPnNnbF9lbnRyaWVzX19sdW5oID0KQEAgLTE1MzEsNiArMTUzMywxMyBAQAogCWludCByZXR2YWwgPSAxOwogCiAJY29tbWFuZF9xdWVfdmFsdWUgPSB0d19kZXYtPmNvbW1hbmRfcGFja2V0X3BoeXNbcmVxdWVzdF9pZF07CisKKwkvKiBGb3IgOTY1MFNFIHdyaXRlIGxvdyA0IGJ5dGVzIGZpcnN0ICovCisJaWYgKHR3X2Rldi0+dHdfcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfM1dBUkVfOTY1MFNFKSB7CisJCWNvbW1hbmRfcXVlX3ZhbHVlICs9IFRXX0NPTU1BTkRfT0ZGU0VUOworCQl3cml0ZWwoKHUzMiljb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUl9MQVJHRSh0d19kZXYpKTsKKwl9CisKIAlzdGF0dXNfcmVnX3ZhbHVlID0gcmVhZGwoVFdfU1RBVFVTX1JFR19BRERSKHR3X2RldikpOwogCiAJaWYgKHR3YV9jaGVja19iaXRzKHN0YXR1c19yZWdfdmFsdWUpKQpAQCAtMTU1NywxMyArMTU2NiwxNyBAQAogCQlUV19VTk1BU0tfQ09NTUFORF9JTlRFUlJVUFQodHdfZGV2KTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIHsKLQkJLyogV2Ugc3VjY2Vzc2Z1bGx5IHBvc3RlZCB0aGUgY29tbWFuZCBwYWNrZXQgKi8KLQkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKLQkJCWNvbW1hbmRfcXVlX3ZhbHVlICs9IFRXX0NPTU1BTkRfT0ZGU0VUOwotCQkJd3JpdGVsKCh1MzIpY29tbWFuZF9xdWVfdmFsdWUsIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSk7Ci0JCQl3cml0ZWwoKHUzMikoKHU2NCljb21tYW5kX3F1ZV92YWx1ZSA+PiAzMiksIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSArIDB4NCk7CisJCWlmICh0d19kZXYtPnR3X3BjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzNXQVJFXzk2NTBTRSkgeworCQkJLyogTm93IHdyaXRlIHVwcGVyIDQgYnl0ZXMgKi8KKwkJCXdyaXRlbCgodTMyKSgodTY0KWNvbW1hbmRfcXVlX3ZhbHVlID4+IDMyKSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUl9MQVJHRSh0d19kZXYpICsgMHg0KTsKIAkJfSBlbHNlIHsKLQkJCXdyaXRlbChUV19DT01NQU5EX09GRlNFVCArIGNvbW1hbmRfcXVlX3ZhbHVlLCBUV19DT01NQU5EX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKKwkJCQljb21tYW5kX3F1ZV92YWx1ZSArPSBUV19DT01NQU5EX09GRlNFVDsKKwkJCQl3cml0ZWwoKHUzMiljb21tYW5kX3F1ZV92YWx1ZSwgVFdfQ09NTUFORF9RVUVVRV9SRUdfQUREUih0d19kZXYpKTsKKwkJCQl3cml0ZWwoKHUzMikoKHU2NCljb21tYW5kX3F1ZV92YWx1ZSA+PiAzMiksIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIodHdfZGV2KSArIDB4NCk7CisJCQl9IGVsc2UgeworCQkJCXdyaXRlbChUV19DT01NQU5EX09GRlNFVCArIGNvbW1hbmRfcXVlX3ZhbHVlLCBUV19DT01NQU5EX1FVRVVFX1JFR19BRERSKHR3X2RldikpOworCQkJfQogCQl9CiAJCXR3X2Rldi0+c3RhdGVbcmVxdWVzdF9pZF0gPSBUV19TX1BPU1RFRDsKIAkJdHdfZGV2LT5wb3N0ZWRfcmVxdWVzdF9jb3VudCsrOwpAQCAtMTYyMCwxNCArMTYzMyw5IEBACiAJCWdvdG8gb3V0OwogCiAJVFdfRU5BQkxFX0FORF9DTEVBUl9JTlRFUlJVUFRTKHR3X2Rldik7CisJY2xlYXJfYml0KFRXX0lOX1JFU0VULCAmdHdfZGV2LT5mbGFncyk7CisJdHdfZGV2LT5jaHJkZXZfcmVxdWVzdF9pZCA9IFRXX0lPQ1RMX0NIUkRFVl9GUkVFOwogCi0JLyogV2FrZSB1cCBhbnkgaW9jdGwgdGhhdCB3YXMgcGVuZGluZyBiZWZvcmUgdGhlIHJlc2V0ICovCi0JaWYgKCh0d19kZXYtPmNocmRldl9yZXF1ZXN0X2lkID09IFRXX0lPQ1RMX0NIUkRFVl9GUkVFKSB8fCAoaW9jdGxfcmVzZXQpKSB7Ci0JCWNsZWFyX2JpdChUV19JTl9SRVNFVCwgJnR3X2Rldi0+ZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXR3X2Rldi0+Y2hyZGV2X3JlcXVlc3RfaWQgPSBUV19JT0NUTF9DSFJERVZfRlJFRTsKLQkJd2FrZV91cCgmdHdfZGV2LT5pb2N0bF93cXVldWUpOwotCX0KIAlyZXR2YWwgPSAwOwogb3V0OgogCXJldHVybiByZXR2YWw7CkBAIC0xNzM2LDYgKzE3NDQsOSBAQAogCQkiV0FSTklORzogKDB4JTAyWDoweCUwNFgpOiBDb21tYW5kICgweCV4KSB0aW1lZCBvdXQsIHJlc2V0dGluZyBjYXJkLlxuIiwKIAkJVFdfRFJJVkVSLCAweDJjLCBTQ3BudC0+Y21uZFswXSk7CiAKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBpc3N1aW5nIGFuIGlvY3RsIG9yIHJlc2V0dGluZyBmcm9tIGlvY3RsICovCisJbXV0ZXhfbG9jaygmdHdfZGV2LT5pb2N0bF9sb2NrKTsKKwogCS8qIE5vdyByZXNldCB0aGUgY2FyZCBhbmQgc29tZSBvZiB0aGUgZGV2aWNlIGV4dGVuc2lvbiBkYXRhICovCiAJaWYgKHR3YV9yZXNldF9kZXZpY2VfZXh0ZW5zaW9uKHR3X2RldiwgMCkpIHsKIAkJVFdfUFJJTlRLKHR3X2Rldi0+aG9zdCwgVFdfRFJJVkVSLCAweDJiLCAiQ29udHJvbGxlciByZXNldCBmYWlsZWQgZHVyaW5nIHNjc2kgaG9zdCByZXNldCIpOwpAQCAtMTc0NCw2ICsxNzU1LDcgQEAKIAogCXJldHZhbCA9IFNVQ0NFU1M7CiBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0d19kZXYtPmlvY3RsX2xvY2spOwogCXJldHVybiByZXR2YWw7CiB9IC8qIEVuZCB0d2Ffc2NzaV9laF9yZXNldCgpICovCiAKQEAgLTE3NTMsOCArMTc2NSwxNCBAQAogCWludCByZXF1ZXN0X2lkLCByZXR2YWw7CiAJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIAorCS8qIElmIHdlIGFyZSByZXNldHRpbmcgZHVlIHRvIHRpbWVkIG91dCBpb2N0bCwgcmVwb3J0IGFzIGJ1c3kgKi8KKwlpZiAodGVzdF9iaXQoVFdfSU5fUkVTRVQsICZ0d19kZXYtPmZsYWdzKSkgeworCQlyZXR2YWwgPSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCQlnb3RvIG91dDsKKwl9CisKIAkvKiBDaGVjayBpZiB0aGlzIEZXIHN1cHBvcnRzIGx1bnMgKi8KLQlpZiAoKFNDcG50LT5kZXZpY2UtPmx1biAhPSAwKSAmJiAodHdfZGV2LT53b3JraW5nX3NybCA8IFRXX0ZXX1NSTF9MVU5TX1NVUFBPUlRFRCkpIHsKKwlpZiAoKFNDcG50LT5kZXZpY2UtPmx1biAhPSAwKSAmJiAodHdfZGV2LT50d19jb21wYXRfaW5mby53b3JraW5nX3NybCA8IFRXX0ZXX1NSTF9MVU5TX1NVUFBPUlRFRCkpIHsKIAkJU0NwbnQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CiAJCWRvbmUoU0NwbnQpOwogCQlyZXR2YWwgPSAwOwpAQCAtMTk2MCw2ICsxOTc4LDkgQEAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KIAlUV19ESVNBQkxFX0lOVEVSUlVQVFModHdfZGV2KTsKIAorCS8qIEZyZWUgdXAgdGhlIElSUSAqLworCWZyZWVfaXJxKHR3X2Rldi0+dHdfcGNpX2Rldi0+aXJxLCB0d19kZXYpOworCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiM3ctOXh4eDogU2h1dHRpbmcgZG93biBob3N0ICVkLlxuIiwgdHdfZGV2LT5ob3N0LT5ob3N0X25vKTsKIAogCS8qIFRlbGwgdGhlIGNhcmQgd2UgYXJlIHNodXR0aW5nIGRvd24gKi8KQEAgLTIwOTEsMjEgKzIxMTIsMjUgQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIGNhcmQgKi8KIAlpZiAodHdhX3Jlc2V0X3NlcXVlbmNlKHR3X2RldiwgMCkpCi0JCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwkJZ290byBvdXRfaW91bm1hcDsKIAogCS8qIFNldCBob3N0IHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KLQlob3N0LT5tYXhfaWQgPSBUV19NQVhfVU5JVFM7CisJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEXzNXQVJFXzk2NTBTRSkKKwkJaG9zdC0+bWF4X2lkID0gVFdfTUFYX1VOSVRTXzk2NTBTRTsKKwllbHNlCisJCWhvc3QtPm1heF9pZCA9IFRXX01BWF9VTklUUzsKKwogCWhvc3QtPm1heF9jbWRfbGVuID0gVFdfTUFYX0NEQl9MRU47CiAKIAkvKiBDaGFubmVscyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIgKi8KLQlob3N0LT5tYXhfbHVuID0gVFdfTUFYX0xVTlModHdfZGV2LT53b3JraW5nX3NybCk7CisJaG9zdC0+bWF4X2x1biA9IFRXX01BWF9MVU5TKHR3X2Rldi0+dHdfY29tcGF0X2luZm8ud29ya2luZ19zcmwpOwogCWhvc3QtPm1heF9jaGFubmVsID0gMDsKIAogCS8qIFJlZ2lzdGVyIHRoZSBjYXJkIHdpdGggdGhlIGtlcm5lbCBTQ1NJIGxheWVyICovCiAJcmV0dmFsID0gc2NzaV9hZGRfaG9zdChob3N0LCAmcGRldi0+ZGV2KTsKIAlpZiAocmV0dmFsKSB7CiAJCVRXX1BSSU5USyh0d19kZXYtPmhvc3QsIFRXX0RSSVZFUiwgMHgyNywgInNjc2kgYWRkIGhvc3QgZmFpbGVkIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwkJZ290byBvdXRfaW91bm1hcDsKIAl9CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CkBAIC0yMTQ1LDYgKzIxNzAsOCBAQAogCiBvdXRfcmVtb3ZlX2hvc3Q6CiAJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKK291dF9pb3VubWFwOgorCWlvdW5tYXAodHdfZGV2LT5iYXNlX2FkZHIpOwogb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogb3V0X2ZyZWVfZGV2aWNlX2V4dGVuc2lvbjoKQEAgLTIxNzAsMTIgKzIxOTcsMTIgQEAKIAkJdHdhX21ham9yID0gLTE7CiAJfQogCi0JLyogRnJlZSB1cCB0aGUgSVJRICovCi0JZnJlZV9pcnEodHdfZGV2LT50d19wY2lfZGV2LT5pcnEsIHR3X2Rldik7Ci0KIAkvKiBTaHV0ZG93biB0aGUgY2FyZCAqLwogCV9fdHdhX3NodXRkb3duKHR3X2Rldik7CiAKKwkvKiBGcmVlIElPIHJlbWFwcGluZyAqLworCWlvdW5tYXAodHdfZGV2LT5iYXNlX2FkZHIpOworCiAJLyogRnJlZSB1cCB0aGUgbWVtIHJlZ2lvbiAqLwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAKQEAgLTIxOTMsNiArMjIyMCw4IEBACiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKIAl7IFBDSV9WRU5ET1JfSURfM1dBUkUsIFBDSV9ERVZJQ0VfSURfM1dBUkVfOTU1MFNYLAogCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEXzNXQVJFLCBQQ0lfREVWSUNFX0lEXzNXQVJFXzk2NTBTRSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0d2FfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguaAppbmRleCBlNTY4NWJlLi43OTAxNTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5oCisrKyBiL2RyaXZlcnMvc2NzaS8zdy05eHh4LmgKQEAgLTI4OSw3ICsyODksNiBAQAogI2RlZmluZSBUV19TVEFUVVNfVkFMSURfSU5URVJSVVBUICAgICAgICAgICAgICAweDAwREYwMDAwCiAKIC8qIFBDSSByZWxhdGVkIGRlZmluZXMgKi8KLSNkZWZpbmUgVFdfTlVNREVWSUNFUyAxCiAjZGVmaW5lIFRXX1BDSV9DTEVBUl9QQVJJVFlfRVJST1JTIDB4YzEwMAogI2RlZmluZSBUV19QQ0lfQ0xFQVJfUENJX0FCT1JUICAgICAweDIwMDAKIApAQCAtMzM1LDYgKzMzNCw3IEBACiAjZGVmaW5lIFRXX0FMSUdOTUVOVF85MDAwICAgICAgICAgICAgICAgICAgICAgNCAgLyogNCBieXRlcyAqLwogI2RlZmluZSBUV19BTElHTk1FTlRfOTAwMF9TR0wgICAgICAgICAgICAgICAgIDB4MwogI2RlZmluZSBUV19NQVhfVU5JVFMJCQkgICAgICAxNgorI2RlZmluZSBUV19NQVhfVU5JVFNfOTY1MFNFCQkgICAgICAzMgogI2RlZmluZSBUV19JTklUX01FU1NBR0VfQ1JFRElUUwkJICAgICAgMHgxMDAKICNkZWZpbmUgVFdfSU5JVF9DT01NQU5EX1BBQ0tFVF9TSVpFCSAgICAgIDB4MwogI2RlZmluZSBUV19JTklUX0NPTU1BTkRfUEFDS0VUX1NJWkVfRVhURU5ERUQgIDB4NgpAQCAtMzU0LDcgKzM1NCw2IEBACiAjZGVmaW5lIFRXX01BWF9SRVNQT05TRV9EUkFJTgkJICAgICAgMjU2CiAjZGVmaW5lIFRXX01BWF9BRU5fRFJBSU4JCSAgICAgIDQwCiAjZGVmaW5lIFRXX0lOX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBUV19JTl9DSFJERVZfSU9DVEwgICAgICAgICAgICAgICAgICAgIDMKICNkZWZpbmUgVFdfSU5fQVRURU5USU9OX0xPT1AJCSAgICAgIDQKICNkZWZpbmUgVFdfTUFYX1NFQ1RPUlMgICAgICAgICAgICAgICAgICAgICAgICAyNTYKICNkZWZpbmUgVFdfQUVOX1dBSVRfVElNRSAgICAgICAgICAgICAgICAgICAgICAxMDAwCkBAIC00MTcsNiArNDE2LDkgQEAKICNpZm5kZWYgUENJX0RFVklDRV9JRF8zV0FSRV85NTUwU1gKICNkZWZpbmUgUENJX0RFVklDRV9JRF8zV0FSRV85NTUwU1ggMHgxMDAzCiAjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF8zV0FSRV85NjUwU0UKKyNkZWZpbmUgUENJX0RFVklDRV9JRF8zV0FSRV85NjUwU0UgMHgxMDA0CisjZW5kaWYKIAogLyogQml0bWFzayBtYWNyb3MgdG8gZWxpbWluYXRlIGJpdGZpZWxkcyAqLwogCkBAIC00NDIsNiArNDQ0LDcgQEAKICNkZWZpbmUgVFdfQ09OVFJPTF9SRUdfQUREUih4KSAoeC0+YmFzZV9hZGRyKQogI2RlZmluZSBUV19TVEFUVVNfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweDQpCiAjZGVmaW5lIFRXX0NPTU1BTkRfUVVFVUVfUkVHX0FERFIoeCkgKHNpemVvZihkbWFfYWRkcl90KSA+IDQgPyAoKHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKXgtPmJhc2VfYWRkciArIDB4MjApIDogKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweDgpKQorI2RlZmluZSBUV19DT01NQU5EX1FVRVVFX1JFR19BRERSX0xBUkdFKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgMHgyMCkKICNkZWZpbmUgVFdfUkVTUE9OU0VfUVVFVUVfUkVHX0FERFIoeCkgKCh1bnNpZ25lZCBjaGFyIF9faW9tZW0gKil4LT5iYXNlX2FkZHIgKyAweEMpCiAjZGVmaW5lIFRXX1JFU1BPTlNFX1FVRVVFX1JFR19BRERSX0xBUkdFKHgpICgodW5zaWduZWQgY2hhciBfX2lvbWVtICopeC0+YmFzZV9hZGRyICsgMHgzMCkKICNkZWZpbmUgVFdfQ0xFQVJfQUxMX0lOVEVSUlVQVFMoeCkgKHdyaXRlbChUV19TVEFUVVNfVkFMSURfSU5URVJSVVBULCBUV19DT05UUk9MX1JFR19BRERSKHgpKSkKQEAgLTYyNiw2ICs2MjksOSBAQAogCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9zcmxfbG93OwogCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9icmFuY2hfbG93OwogCXVuc2lnbmVkIHNob3J0IGRyaXZlcl9idWlsZF9sb3c7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9zcmw7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9icmFuY2g7CisJdW5zaWduZWQgc2hvcnQgZndfb25fY3Rscl9idWlsZDsKIH0gVFdfQ29tcGF0aWJpbGl0eV9JbmZvOwogCiAjcHJhZ21hIHBhY2soKQpAQCAtNjY4LDkgKzY3NCw3IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QJaW9jdGxfd3F1ZXVlOwogCXN0cnVjdCBtdXRleAkJaW9jdGxfbG9jazsKIAljaGFyCQkJYWVuX2Nsb2JiZXI7Ci0JdW5zaWduZWQgc2hvcnQJCXdvcmtpbmdfc3JsOwotCXVuc2lnbmVkIHNob3J0CQl3b3JraW5nX2JyYW5jaDsKLQl1bnNpZ25lZCBzaG9ydAkJd29ya2luZ19idWlsZDsKKwlUV19Db21wYXRpYmlsaXR5X0luZm8JdHdfY29tcGF0X2luZm87CiB9IFRXX0RldmljZV9FeHRlbnNpb247CiAKICNlbmRpZiAvKiBfM1dfOVhYWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvNTNjNzAwLmMgYi9kcml2ZXJzL3Njc2kvNTNjNzAwLmMKaW5kZXggNTYyNDMyZC4uNjgxMDNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpLzUzYzcwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS81M2M3MDAuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJaG9zdGRhdGEtPnN0YXR1cyA9IG1lbW9yeSArIFNUQVRVU19PRkZTRVQ7CiAJLyogYWxsIG9mIHRoZXNlIG9mZnNldHMgYXJlIEwxX0NBQ0hFX0JZVEVTIHNlcGFyYXRlZC4gIEl0IGlzIGZhdGFsCiAJICogaWYgdGhpcyBpc24ndCBzdWZmaWNpZW50IHNlcGFyYXRpb24gdG8gYXZvaWQgZG1hIGZsdXNoaW5nIGlzc3VlcyAqLwotCUJVR19PTighZG1hX2lzX2NvbnNpc3RlbnQocFNjcmlwdCkgJiYgTDFfQ0FDSEVfQllURVMgPCBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCgpKTsKKwlCVUdfT04oIWRtYV9pc19jb25zaXN0ZW50KGhvc3RkYXRhLT5kZXYsIHBTY3JpcHQpICYmIEwxX0NBQ0hFX0JZVEVTIDwgZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQoKSk7CiAJaG9zdGRhdGEtPnNsb3RzID0gKHN0cnVjdCBOQ1JfNzAwX2NvbW1hbmRfc2xvdCAqKShtZW1vcnkgKyBTTE9UU19PRkZTRVQpOwogCWhvc3RkYXRhLT5kZXYgPSBkZXY7CiAKQEAgLTM2MiwxMSArMzYyLDExIEBACiAJZm9yIChqID0gMDsgaiA8IFBBVENIRVM7IGorKykKIAkJc2NyaXB0W0xBQkVMUEFUQ0hFU1tqXV0gPSBiU190b19ob3N0KHBTY3JpcHQgKyBTQ1JJUFRbTEFCRUxQQVRDSEVTW2pdXSk7CiAJLyogbm93IHBhdGNoIHVwIGZpeGVkIGFkZHJlc3Nlcy4gKi8KLQlzY3JpcHRfcGF0Y2hfMzIoc2NyaXB0LCBNZXNzYWdlTG9jYXRpb24sCisJc2NyaXB0X3BhdGNoXzMyKGhvc3RkYXRhLT5kZXYsIHNjcmlwdCwgTWVzc2FnZUxvY2F0aW9uLAogCQkJcFNjcmlwdCArIE1TR09VVF9PRkZTRVQpOwotCXNjcmlwdF9wYXRjaF8zMihzY3JpcHQsIFN0YXR1c0FkZHJlc3MsCisJc2NyaXB0X3BhdGNoXzMyKGhvc3RkYXRhLT5kZXYsIHNjcmlwdCwgU3RhdHVzQWRkcmVzcywKIAkJCXBTY3JpcHQgKyBTVEFUVVNfT0ZGU0VUKTsKLQlzY3JpcHRfcGF0Y2hfMzIoc2NyaXB0LCBSZWNlaXZlTXNnQWRkcmVzcywKKwlzY3JpcHRfcGF0Y2hfMzIoaG9zdGRhdGEtPmRldiwgc2NyaXB0LCBSZWNlaXZlTXNnQWRkcmVzcywKIAkJCXBTY3JpcHQgKyBNU0dJTl9PRkZTRVQpOwogCiAJaG9zdGRhdGEtPnNjcmlwdCA9IHNjcmlwdDsKQEAgLTYyMiw4ICs2MjIsMTAgQEAKIAkJCWRtYV91bm1hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwgc2xvdC0+ZG1hX2hhbmRsZSwgc2l6ZW9mKFNDcC0+c2Vuc2VfYnVmZmVyKSwgRE1BX0ZST01fREVWSUNFKTsKIAkJCS8qIHJlc3RvcmUgdGhlIG9sZCByZXN1bHQgaWYgdGhlIHJlcXVlc3Qgc2Vuc2Ugd2FzCiAJCQkgKiBzdWNjZXNzZnVsICovCi0JCQlpZihyZXN1bHQgPT0gMCkKKwkJCWlmIChyZXN1bHQgPT0gMCkKIAkJCQlyZXN1bHQgPSBjbW5kWzddOworCQkJLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgbGVuZ3RoICovCisJCQlTQ3AtPmNtZF9sZW4gPSBjbW5kWzhdOwogCQl9IGVsc2UKIAkJCU5DUl83MDBfdW5tYXAoaG9zdGRhdGEsIFNDcCwgc2xvdCk7CiAKQEAgLTgxOSw4ICs4MjEsOSBAQAogCQkJc2hvc3RfcHJpbnRrKEtFUk5fV0FSTklORywgaG9zdCwKIAkJCQkiVW5leHBlY3RlZCBTRFRSIG1zZ1xuIik7CiAJCQlob3N0ZGF0YS0+bXNnb3V0WzBdID0gQV9SRUpFQ1RfTVNHOwotCQkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ291dCwgMSwgRE1BX1RPX0RFVklDRSk7Ci0JCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LCAxKTsKKwkJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5tc2dvdXQsIDEsIERNQV9UT19ERVZJQ0UpOworCQkJc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5zY3JpcHQsCisJCQkgICAgICAgICAgICAgICAgTWVzc2FnZUNvdW50LCAxKTsKIAkJCS8qIFNlbmRNc2dPdXQgcmV0dXJucywgc28gc2V0IHVwIHRoZSByZXR1cm4KIAkJCSAqIGFkZHJlc3MgKi8KIAkJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9TZW5kTWVzc2FnZVdpdGhBVE47CkBAIC04MzEsOCArODM0LDkgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSVkOiAoJWQ6JWQpLCBVbnNvbGljaXRlZCBXRFRSIGFmdGVyIENNRCwgUmVqZWN0aW5nXG4iLAogCQkgICAgICAgaG9zdC0+aG9zdF9ubywgcHVuLCBsdW4pOwogCQlob3N0ZGF0YS0+bXNnb3V0WzBdID0gQV9SRUpFQ1RfTVNHOwotCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+bXNnb3V0LCAxLCBETUFfVE9fREVWSUNFKTsKLQkJc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5zY3JpcHQsIE1lc3NhZ2VDb3VudCwgMSk7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5tc2dvdXQsIDEsIERNQV9UT19ERVZJQ0UpOworCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPmRldiwgaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LAorCQkgICAgICAgICAgICAgICAgMSk7CiAJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9TZW5kTWVzc2FnZVdpdGhBVE47CiAKIAkJYnJlYWs7CkBAIC04NDUsOCArODQ5LDkgQEAKIAkJcHJpbnRrKCJcbiIpOwogCQkvKiBqdXN0IHJlamVjdCBpdCAqLwogCQlob3N0ZGF0YS0+bXNnb3V0WzBdID0gQV9SRUpFQ1RfTVNHOwotCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+bXNnb3V0LCAxLCBETUFfVE9fREVWSUNFKTsKLQkJc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5zY3JpcHQsIE1lc3NhZ2VDb3VudCwgMSk7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5tc2dvdXQsIDEsIERNQV9UT19ERVZJQ0UpOworCQlzY3JpcHRfcGF0Y2hfMTYoaG9zdGRhdGEtPmRldiwgaG9zdGRhdGEtPnNjcmlwdCwgTWVzc2FnZUNvdW50LAorCQkgICAgICAgICAgICAgICAgMSk7CiAJCS8qIFNlbmRNc2dPdXQgcmV0dXJucywgc28gc2V0IHVwIHRoZSByZXR1cm4KIAkJICogYWRkcmVzcyAqLwogCQlyZXN1bWVfb2Zmc2V0ID0gaG9zdGRhdGEtPnBTY3JpcHQgKyBFbnRfU2VuZE1lc3NhZ2VXaXRoQVROOwpAQCAtOTI3LDggKzkzMiw5IEBACiAJCXByaW50aygiXG4iKTsKIAkJLyoganVzdCByZWplY3QgaXQgKi8KIAkJaG9zdGRhdGEtPm1zZ291dFswXSA9IEFfUkVKRUNUX01TRzsKLQkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ291dCwgMSwgRE1BX1RPX0RFVklDRSk7Ci0JCXNjcmlwdF9wYXRjaF8xNihob3N0ZGF0YS0+c2NyaXB0LCBNZXNzYWdlQ291bnQsIDEpOworCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+ZGV2LCBob3N0ZGF0YS0+bXNnb3V0LCAxLCBETUFfVE9fREVWSUNFKTsKKwkJc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5zY3JpcHQsIE1lc3NhZ2VDb3VudCwKKwkJICAgICAgICAgICAgICAgIDEpOwogCQkvKiBTZW5kTXNnT3V0IHJldHVybnMsIHNvIHNldCB1cCB0aGUgcmV0dXJuCiAJCSAqIGFkZHJlc3MgKi8KIAkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X1NlbmRNZXNzYWdlV2l0aEFUTjsKQEAgLTkzNyw3ICs5NDMsNyBAQAogCX0KIAlOQ1JfNzAwX3dyaXRlbCh0ZW1wLCBob3N0LCBURU1QX1JFRyk7CiAJLyogc2V0IHVzIHVwIHRvIHJlY2VpdmUgYW5vdGhlciBtZXNzYWdlICovCi0JZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ2luLCBNU0dfQVJSQVlfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+ZGV2LCBob3N0ZGF0YS0+bXNnaW4sIE1TR19BUlJBWV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogCXJldHVybiByZXN1bWVfb2Zmc2V0OwogfQogCkBAIC0xMDA3LDYgKzEwMTMsOSBAQAogCQkJCSAqIG9mIHRoZSBjb21tYW5kICovCiAJCQkJY21uZFs2XSA9IE5DUl83MDBfSU5URVJOQUxfU0VOU0VfTUFHSUM7CiAJCQkJY21uZFs3XSA9IGhvc3RkYXRhLT5zdGF0dXNbMF07CisJCQkJY21uZFs4XSA9IFNDcC0+Y21kX2xlbjsKKwkJCQlTQ3AtPmNtZF9sZW4gPSA2OyAvKiBjb21tYW5kIGxlbmd0aCBmb3IKKwkJCQkJCSAgICogUkVRVUVTVF9TRU5TRSAqLwogCQkJCXNsb3QtPnBDbWQgPSBkbWFfbWFwX3NpbmdsZShob3N0ZGF0YS0+ZGV2LCBjbW5kLCBNQVhfQ09NTUFORF9TSVpFLCBETUFfVE9fREVWSUNFKTsKIAkJCQlzbG90LT5kbWFfaGFuZGxlID0gZG1hX21hcF9zaW5nbGUoaG9zdGRhdGEtPmRldiwgU0NwLT5zZW5zZV9idWZmZXIsIHNpemVvZihTQ3AtPnNlbnNlX2J1ZmZlciksIERNQV9GUk9NX0RFVklDRSk7CiAJCQkJc2xvdC0+U0dbMF0uaW5zID0gYlNfdG9faG9zdChTQ1JJUFRfTU9WRV9EQVRBX0lOIHwgc2l6ZW9mKFNDcC0+c2Vuc2VfYnVmZmVyKSk7CkBAIC0xMDE0LDkgKzEwMjMsOSBAQAogCQkJCXNsb3QtPlNHWzFdLmlucyA9IGJTX3RvX2hvc3QoU0NSSVBUX1JFVFVSTik7CiAJCQkJc2xvdC0+U0dbMV0ucEFkZHIgPSAwOwogCQkJCXNsb3QtPnJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdDsKLQkJCQlkbWFfY2FjaGVfc3luYyhzbG90LT5TRywgc2l6ZW9mKHNsb3QtPlNHWzBdKSoyLCBETUFfVE9fREVWSUNFKTsKLQkJCQlkbWFfY2FjaGVfc3luYyhTQ3AtPnNlbnNlX2J1ZmZlciwgc2l6ZW9mKFNDcC0+c2Vuc2VfYnVmZmVyKSwgRE1BX0ZST01fREVWSUNFKTsKLQkJCQkKKwkJCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+ZGV2LCBzbG90LT5TRywgc2l6ZW9mKHNsb3QtPlNHWzBdKSoyLCBETUFfVE9fREVWSUNFKTsKKwkJCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+ZGV2LCBTQ3AtPnNlbnNlX2J1ZmZlciwgc2l6ZW9mKFNDcC0+c2Vuc2VfYnVmZmVyKSwgRE1BX0ZST01fREVWSUNFKTsKKwogCQkJCS8qIHF1ZXVlIHRoZSBjb21tYW5kIGZvciByZWlzc3VlICovCiAJCQkJc2xvdC0+c3RhdGUgPSBOQ1JfNzAwX1NMT1RfUVVFVUVEOwogCQkJCXNsb3QtPmZsYWdzID0gTkNSXzcwMF9GTEFHX0FVVE9TRU5TRTsKQEAgLTExMzEsMTEgKzExNDAsMTIgQEAKIAkJCWhvc3RkYXRhLT5jbWQgPSBzbG90LT5jbW5kOwogCiAJCQkvKiByZS1wYXRjaCBmb3IgdGhpcyBjb21tYW5kICovCi0JCQlzY3JpcHRfcGF0Y2hfMzJfYWJzKGhvc3RkYXRhLT5zY3JpcHQsIENvbW1hbmRBZGRyZXNzLCAKLQkJCQkJICAgIHNsb3QtPnBDbWQpOwotCQkJc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5zY3JpcHQsCisJCQlzY3JpcHRfcGF0Y2hfMzJfYWJzKGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5zY3JpcHQsCisJCQkgICAgICAgICAgICAgICAgICAgIENvbW1hbmRBZGRyZXNzLCBzbG90LT5wQ21kKTsKKwkJCXNjcmlwdF9wYXRjaF8xNihob3N0ZGF0YS0+ZGV2LCBob3N0ZGF0YS0+c2NyaXB0LAogCQkJCQlDb21tYW5kQ291bnQsIHNsb3QtPmNtbmQtPmNtZF9sZW4pOwotCQkJc2NyaXB0X3BhdGNoXzMyX2Ficyhob3N0ZGF0YS0+c2NyaXB0LCBTR1NjcmlwdFN0YXJ0QWRkcmVzcywKKwkJCXNjcmlwdF9wYXRjaF8zMl9hYnMoaG9zdGRhdGEtPmRldiwgaG9zdGRhdGEtPnNjcmlwdCwKKwkJCSAgICAgICAgICAgICAgICAgICAgU0dTY3JpcHRTdGFydEFkZHJlc3MsCiAJCQkJCSAgICB0bzMyYml0KCZzbG90LT5wU0dbMF0uaW5zKSk7CiAKIAkJCS8qIE5vdGU6IHNldHRpbmcgU1hGRVIgb25seSB3b3JrcyBpZiB3ZSdyZQpAQCAtMTE0NSwxMyArMTE1NSwxMyBAQAogCQkJICogc2hvdWxkIHRoZXJlZm9yZSBhbHdheXMgY2xlYXIgQUNLICovCiAJCQlOQ1JfNzAwX3dyaXRlYihOQ1JfNzAwX2dldF9TWEZFUihob3N0ZGF0YS0+Y21kLT5kZXZpY2UpLAogCQkJCSAgICAgICBob3N0LCBTWEZFUl9SRUcpOwotCQkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ2luLAorCQkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPmRldiwgaG9zdGRhdGEtPm1zZ2luLAogCQkJCSAgICAgICBNU0dfQVJSQVlfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQkJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dvdXQsCisJCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+ZGV2LCBob3N0ZGF0YS0+bXNnb3V0LAogCQkJCSAgICAgICBNU0dfQVJSQVlfU0laRSwgRE1BX1RPX0RFVklDRSk7CiAJCQkvKiBJJ20ganVzdCBiZWluZyBwYXJhbm9pZCBoZXJlLCB0aGUgY29tbWFuZCBzaG91bGQKIAkJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIGZsdXNoZWQgZnJvbSB0aGUgY2FjaGUgKi8KLQkJCWRtYV9jYWNoZV9zeW5jKHNsb3QtPmNtbmQtPmNtbmQsCisJCQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+ZGV2LCBzbG90LT5jbW5kLT5jbW5kLAogCQkJCSAgICAgICBzbG90LT5jbW5kLT5jbWRfbGVuLCBETUFfVE9fREVWSUNFKTsKIAogCkBAIC0xMjE1LDcgKzEyMjUsNyBAQAogCQlob3N0ZGF0YS0+cmVzZWxlY3Rpb25faWQgPSByZXNlbGVjdGlvbl9pZDsKIAkJLyoganVzdCBpbiBjYXNlIHdlIGhhdmUgYSBzdGFsZSBzaW1wbGUgdGFnIG1lc3NhZ2UsIGNsZWFyIGl0ICovCiAJCWhvc3RkYXRhLT5tc2dpblsxXSA9IDA7Ci0JCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwKKwkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPmRldiwgaG9zdGRhdGEtPm1zZ2luLAogCQkJICAgICAgIE1TR19BUlJBWV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CiAJCWlmKGhvc3RkYXRhLT50YWdfbmVnb3RpYXRlZCAmICgxPDxyZXNlbGVjdGlvbl9pZCkpIHsKIAkJCXJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdCArIEVudF9HZXRSZXNlbGVjdGlvbldpdGhUYWc7CkBAIC0xMzMxLDcgKzEzNDEsNyBAQAogCWhvc3RkYXRhLT5jbWQgPSBOVUxMOwogCS8qIGNsZWFyIGFueSBzdGFsZSBzaW1wbGUgdGFnIG1lc3NhZ2UgKi8KIAlob3N0ZGF0YS0+bXNnaW5bMV0gPSAwOwotCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwgTVNHX0FSUkFZX1NJWkUsCisJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPmRldiwgaG9zdGRhdGEtPm1zZ2luLCBNU0dfQVJSQVlfU0laRSwKIAkJICAgICAgIERNQV9CSURJUkVDVElPTkFMKTsKIAogCWlmKGlkID09IDB4ZmYpIHsKQEAgLTE0MjgsMjkgKzE0MzgsMzAgQEAKIAkJTkNSXzcwMF9zZXRfZmxhZyhTQ3AtPmRldmljZSwgTkNSXzcwMF9ERVZfQkVHSU5fU1lOQ19ORUdPVElBVElPTik7CiAJfQogCi0Jc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5zY3JpcHQsIE1lc3NhZ2VDb3VudCwgY291bnQpOworCXNjcmlwdF9wYXRjaF8xNihob3N0ZGF0YS0+ZGV2LCBob3N0ZGF0YS0+c2NyaXB0LCBNZXNzYWdlQ291bnQsIGNvdW50KTsKIAogCi0Jc2NyaXB0X3BhdGNoX0lEKGhvc3RkYXRhLT5zY3JpcHQsCisJc2NyaXB0X3BhdGNoX0lEKGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5zY3JpcHQsCiAJCQlEZXZpY2VfSUQsIDE8PHNjbWRfaWQoU0NwKSk7CiAKLQlzY3JpcHRfcGF0Y2hfMzJfYWJzKGhvc3RkYXRhLT5zY3JpcHQsIENvbW1hbmRBZGRyZXNzLCAKKwlzY3JpcHRfcGF0Y2hfMzJfYWJzKGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5zY3JpcHQsIENvbW1hbmRBZGRyZXNzLAogCQkJICAgIHNsb3QtPnBDbWQpOwotCXNjcmlwdF9wYXRjaF8xNihob3N0ZGF0YS0+c2NyaXB0LCBDb21tYW5kQ291bnQsIFNDcC0+Y21kX2xlbik7CisJc2NyaXB0X3BhdGNoXzE2KGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5zY3JpcHQsIENvbW1hbmRDb3VudCwKKwkgICAgICAgICAgICAgICAgU0NwLT5jbWRfbGVuKTsKIAkvKiBmaW5hbGx5IHBsdW1iIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNHIGxpc3QgaW50byB0aGUgc2NyaXB0CiAJICogKi8KLQlzY3JpcHRfcGF0Y2hfMzJfYWJzKGhvc3RkYXRhLT5zY3JpcHQsIFNHU2NyaXB0U3RhcnRBZGRyZXNzLAotCQkJICAgIHRvMzJiaXQoJnNsb3QtPnBTR1swXS5pbnMpKTsKKwlzY3JpcHRfcGF0Y2hfMzJfYWJzKGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5zY3JpcHQsCisJICAgICAgICAgICAgICAgICAgICBTR1NjcmlwdFN0YXJ0QWRkcmVzcywgdG8zMmJpdCgmc2xvdC0+cFNHWzBdLmlucykpOwogCU5DUl83MDBfY2xlYXJfZmlmbyhTQ3AtPmRldmljZS0+aG9zdCk7CiAKIAlpZihzbG90LT5yZXN1bWVfb2Zmc2V0ID09IDApCiAJCXNsb3QtPnJlc3VtZV9vZmZzZXQgPSBob3N0ZGF0YS0+cFNjcmlwdDsKIAkvKiBub3cgcGVyZm9ybSBhbGwgdGhlIHdyaXRlYmFja3MgYW5kIGludmFsaWRhdGVzICovCi0JZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPm1zZ291dCwgY291bnQsIERNQV9UT19ERVZJQ0UpOwotCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5tc2dpbiwgTVNHX0FSUkFZX1NJWkUsCisJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPmRldiwgaG9zdGRhdGEtPm1zZ291dCwgY291bnQsIERNQV9UT19ERVZJQ0UpOworCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5kZXYsIGhvc3RkYXRhLT5tc2dpbiwgTVNHX0FSUkFZX1NJWkUsCiAJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwotCWRtYV9jYWNoZV9zeW5jKFNDcC0+Y21uZCwgU0NwLT5jbWRfbGVuLCBETUFfVE9fREVWSUNFKTsKLQlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+c3RhdHVzLCAxLCBETUFfRlJPTV9ERVZJQ0UpOworCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5kZXYsIFNDcC0+Y21uZCwgU0NwLT5jbWRfbGVuLCBETUFfVE9fREVWSUNFKTsKKwlkbWFfY2FjaGVfc3luYyhob3N0ZGF0YS0+ZGV2LCBob3N0ZGF0YS0+c3RhdHVzLCAxLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJLyogc2V0IHRoZSBzeW5jaHJvbm91cyBwZXJpb2Qvb2Zmc2V0ICovCiAJTkNSXzcwMF93cml0ZWIoTkNSXzcwMF9nZXRfU1hGRVIoU0NwLT5kZXZpY2UpLApAQCAtMTYyNiw3ICsxNjM3LDcgQEAKIAkJCQkJc2xvdC0+U0dbaV0uaW5zID0gYlNfdG9faG9zdChTQ1JJUFRfTk9QKTsKIAkJCQkJc2xvdC0+U0dbaV0ucEFkZHIgPSAwOwogCQkJCX0KLQkJCQlkbWFfY2FjaGVfc3luYyhzbG90LT5TRywgc2l6ZW9mKHNsb3QtPlNHKSwgRE1BX1RPX0RFVklDRSk7CisJCQkJZG1hX2NhY2hlX3N5bmMoaG9zdGRhdGEtPmRldiwgc2xvdC0+U0csIHNpemVvZihzbG90LT5TRyksIERNQV9UT19ERVZJQ0UpOwogCQkJCS8qIGFuZCBwcmV0ZW5kIHdlIGRpc2Nvbm5lY3RlZCBhZnRlcgogCQkJCSAqIHRoZSBjb21tYW5kIHBoYXNlICovCiAJCQkJcmVzdW1lX29mZnNldCA9IGhvc3RkYXRhLT5wU2NyaXB0ICsgRW50X01zZ0luRHVyaW5nRGF0YTsKQEAgLTE4OTIsOSArMTkwMyw5IEBACiAJCX0KIAkJc2xvdC0+U0dbaV0uaW5zID0gYlNfdG9faG9zdChTQ1JJUFRfUkVUVVJOKTsKIAkJc2xvdC0+U0dbaV0ucEFkZHIgPSAwOwotCQlkbWFfY2FjaGVfc3luYyhzbG90LT5TRywgc2l6ZW9mKHNsb3QtPlNHKSwgRE1BX1RPX0RFVklDRSk7CisJCWRtYV9jYWNoZV9zeW5jKGhvc3RkYXRhLT5kZXYsIHNsb3QtPlNHLCBzaXplb2Yoc2xvdC0+U0cpLCBETUFfVE9fREVWSUNFKTsKIAkJREVCVUcoKCIgU0VUVElORyAlMDhseCB0byAleFxuIiwKLQkJICAgICAgICgmc2xvdC0+cFNHW2ldLmlucyksIAorCQkgICAgICAgKCZzbG90LT5wU0dbaV0uaW5zKSwKIAkJICAgICAgIHNsb3QtPlNHW2ldLmlucykpOwogCX0KIAlzbG90LT5yZXN1bWVfb2Zmc2V0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3MDAuaCBiL2RyaXZlcnMvc2NzaS81M2M3MDAuaAppbmRleCBmNWMzY2FmLi5mMzg4MjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvNTNjNzAwLmgKKysrIGIvZHJpdmVycy9zY3NpLzUzYzcwMC5oCkBAIC00MTUsMzEgKzQxNSwzMSBAQAogI2RlZmluZSBOQ1JfNzEwX01JTl9YRkVSUAkwCiAjZGVmaW5lIE5DUl83MDBfTUlOX1BFUklPRAkyNSAvKiBmb3IgU0RUUiBtZXNzYWdlLCAxMDBucyAqLwogCi0jZGVmaW5lIHNjcmlwdF9wYXRjaF8zMihzY3JpcHQsIHN5bWJvbCwgdmFsdWUpIFwKKyNkZWZpbmUgc2NyaXB0X3BhdGNoXzMyKGRldiwgc2NyaXB0LCBzeW1ib2wsIHZhbHVlKSBcCiB7IFwKIAlpbnQgaTsgXAogCWZvcihpPTA7IGk8IChzaXplb2YoQV8jI3N5bWJvbCMjX3VzZWQpIC8gc2l6ZW9mKF9fdTMyKSk7IGkrKykgeyBcCiAJCV9fdTMyIHZhbCA9IGJTX3RvX2NwdSgoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0pICsgdmFsdWU7IFwKIAkJKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dID0gYlNfdG9faG9zdCh2YWwpOyBcCi0JCWRtYV9jYWNoZV9zeW5jKCYoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0sIDQsIERNQV9UT19ERVZJQ0UpOyBcCisJCWRtYV9jYWNoZV9zeW5jKChkZXYpLCAmKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dLCA0LCBETUFfVE9fREVWSUNFKTsgXAogCQlERUJVRygoIiBzY3JpcHQsIHBhdGNoaW5nICVzIGF0ICVkIHRvIDB4JWx4XG4iLCBcCiAJCSAgICAgICAjc3ltYm9sLCBBXyMjc3ltYm9sIyNfdXNlZFtpXSwgKHZhbHVlKSkpOyBcCiAJfSBcCiB9CiAKLSNkZWZpbmUgc2NyaXB0X3BhdGNoXzMyX2FicyhzY3JpcHQsIHN5bWJvbCwgdmFsdWUpIFwKKyNkZWZpbmUgc2NyaXB0X3BhdGNoXzMyX2FicyhkZXYsIHNjcmlwdCwgc3ltYm9sLCB2YWx1ZSkgXAogeyBcCiAJaW50IGk7IFwKIAlmb3IoaT0wOyBpPCAoc2l6ZW9mKEFfIyNzeW1ib2wjI191c2VkKSAvIHNpemVvZihfX3UzMikpOyBpKyspIHsgXAogCQkoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0gPSBiU190b19ob3N0KHZhbHVlKTsgXAotCQlkbWFfY2FjaGVfc3luYygmKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dLCA0LCBETUFfVE9fREVWSUNFKTsgXAorCQlkbWFfY2FjaGVfc3luYygoZGV2KSwgJihzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldXSwgNCwgRE1BX1RPX0RFVklDRSk7IFwKIAkJREVCVUcoKCIgc2NyaXB0LCBwYXRjaGluZyAlcyBhdCAlZCB0byAweCVseFxuIiwgXAogCQkgICAgICAgI3N5bWJvbCwgQV8jI3N5bWJvbCMjX3VzZWRbaV0sICh2YWx1ZSkpKTsgXAogCX0gXAogfQogCiAvKiBVc2VkIGZvciBwYXRjaGluZyB0aGUgU0NTSSBJRCBpbiB0aGUgU0VMRUNUIGluc3RydWN0aW9uICovCi0jZGVmaW5lIHNjcmlwdF9wYXRjaF9JRChzY3JpcHQsIHN5bWJvbCwgdmFsdWUpIFwKKyNkZWZpbmUgc2NyaXB0X3BhdGNoX0lEKGRldiwgc2NyaXB0LCBzeW1ib2wsIHZhbHVlKSBcCiB7IFwKIAlpbnQgaTsgXAogCWZvcihpPTA7IGk8IChzaXplb2YoQV8jI3N5bWJvbCMjX3VzZWQpIC8gc2l6ZW9mKF9fdTMyKSk7IGkrKykgeyBcCkBAIC00NDcsMTMgKzQ0NywxMyBAQAogCQl2YWwgJj0gMHhmZjAwZmZmZjsgXAogCQl2YWwgfD0gKCh2YWx1ZSkgJiAweGZmKSA8PCAxNjsgXAogCQkoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0gPSBiU190b19ob3N0KHZhbCk7IFwKLQkJZG1hX2NhY2hlX3N5bmMoJihzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldXSwgNCwgRE1BX1RPX0RFVklDRSk7IFwKKwkJZG1hX2NhY2hlX3N5bmMoKGRldiksICYoc2NyaXB0KVtBXyMjc3ltYm9sIyNfdXNlZFtpXV0sIDQsIERNQV9UT19ERVZJQ0UpOyBcCiAJCURFQlVHKCgiIHNjcmlwdCwgcGF0Y2hpbmcgSUQgZmllbGQgJXMgYXQgJWQgdG8gMHgleFxuIiwgXAogCQkgICAgICAgI3N5bWJvbCwgQV8jI3N5bWJvbCMjX3VzZWRbaV0sIHZhbCkpOyBcCiAJfSBcCiB9CiAKLSNkZWZpbmUgc2NyaXB0X3BhdGNoXzE2KHNjcmlwdCwgc3ltYm9sLCB2YWx1ZSkgXAorI2RlZmluZSBzY3JpcHRfcGF0Y2hfMTYoZGV2LCBzY3JpcHQsIHN5bWJvbCwgdmFsdWUpIFwKIHsgXAogCWludCBpOyBcCiAJZm9yKGk9MDsgaTwgKHNpemVvZihBXyMjc3ltYm9sIyNfdXNlZCkgLyBzaXplb2YoX191MzIpKTsgaSsrKSB7IFwKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCQl2YWwgJj0gMHhmZmZmMDAwMDsgXAogCQl2YWwgfD0gKCh2YWx1ZSkgJiAweGZmZmYpOyBcCiAJCShzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldXSA9IGJTX3RvX2hvc3QodmFsKTsgXAotCQlkbWFfY2FjaGVfc3luYygmKHNjcmlwdClbQV8jI3N5bWJvbCMjX3VzZWRbaV1dLCA0LCBETUFfVE9fREVWSUNFKTsgXAorCQlkbWFfY2FjaGVfc3luYygoZGV2KSwgJihzY3JpcHQpW0FfIyNzeW1ib2wjI191c2VkW2ldXSwgNCwgRE1BX1RPX0RFVklDRSk7IFwKIAkJREVCVUcoKCIgc2NyaXB0LCBwYXRjaGluZyBzaG9ydCBmaWVsZCAlcyBhdCAlZCB0byAweCV4XG4iLCBcCiAJCSAgICAgICAjc3ltYm9sLCBBXyMjc3ltYm9sIyNfdXNlZFtpXSwgdmFsKSk7IFwKIAl9IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9CdXNMb2dpYy5jIGIvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMKaW5kZXggN2M1OWJiYS4uMzA3NTIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMKKysrIGIvZHJpdmVycy9zY3NpL0J1c0xvZ2ljLmMKQEAgLTIxODYsMjEgKzIxODYsMjEgQEAKIAogCWlmIChCdXNMb2dpY19Qcm9iZU9wdGlvbnMuTm9Qcm9iZSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JQnVzTG9naWNfUHJvYmVJbmZvTGlzdCA9IChzdHJ1Y3QgQnVzTG9naWNfUHJvYmVJbmZvICopCi0JICAgIGttYWxsb2MoQnVzTG9naWNfTWF4SG9zdEFkYXB0ZXJzICogc2l6ZW9mKHN0cnVjdCBCdXNMb2dpY19Qcm9iZUluZm8pLCBHRlBfQVRPTUlDKTsKKwlCdXNMb2dpY19Qcm9iZUluZm9MaXN0ID0KKwkgICAga3phbGxvYyhCdXNMb2dpY19NYXhIb3N0QWRhcHRlcnMgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbyksIEdGUF9LRVJORUwpOwogCWlmIChCdXNMb2dpY19Qcm9iZUluZm9MaXN0ID09IE5VTEwpIHsKIAkJQnVzTG9naWNfRXJyb3IoIkJ1c0xvZ2ljOiBVbmFibGUgdG8gYWxsb2NhdGUgUHJvYmUgSW5mbyBMaXN0XG4iLCBOVUxMKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChCdXNMb2dpY19Qcm9iZUluZm9MaXN0LCAwLCBCdXNMb2dpY19NYXhIb3N0QWRhcHRlcnMgKiBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX1Byb2JlSW5mbykpOwotCVByb3RvdHlwZUhvc3RBZGFwdGVyID0gKHN0cnVjdCBCdXNMb2dpY19Ib3N0QWRhcHRlciAqKQotCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgQnVzTG9naWNfSG9zdEFkYXB0ZXIpLCBHRlBfQVRPTUlDKTsKKworCVByb3RvdHlwZUhvc3RBZGFwdGVyID0KKwkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKFByb3RvdHlwZUhvc3RBZGFwdGVyID09IE5VTEwpIHsKIAkJa2ZyZWUoQnVzTG9naWNfUHJvYmVJbmZvTGlzdCk7CiAJCUJ1c0xvZ2ljX0Vycm9yKCJCdXNMb2dpYzogVW5hYmxlIHRvIGFsbG9jYXRlIFByb3RvdHlwZSAiICJIb3N0IEFkYXB0ZXJcbiIsIE5VTEwpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KFByb3RvdHlwZUhvc3RBZGFwdGVyLCAwLCBzaXplb2Yoc3RydWN0IEJ1c0xvZ2ljX0hvc3RBZGFwdGVyKSk7CisKICNpZmRlZiBNT0RVTEUKIAlpZiAoQnVzTG9naWMgIT0gTlVMTCkKIAkJQnVzTG9naWNfU2V0dXAoQnVzTG9naWMpOwpAQCAtMzYwMCw1ICszNjAwLDE2IEBACiAKIF9fc2V0dXAoIkJ1c0xvZ2ljPSIsIEJ1c0xvZ2ljX1NldHVwKTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIEJ1c0xvZ2ljX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9CVVNMT0dJQywgUENJX0RFVklDRV9JRF9CVVNMT0dJQ19NVUxUSU1BU1RFUiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9CVVNMT0dJQywgUENJX0RFVklDRV9JRF9CVVNMT0dJQ19NVUxUSU1BU1RFUl9OQywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9CVVNMT0dJQywgUENJX0RFVklDRV9JRF9CVVNMT0dJQ19GTEFTSFBPSU5ULAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIEJ1c0xvZ2ljX3BjaV90YmwpOworCiBtb2R1bGVfaW5pdChCdXNMb2dpY19pbml0KTsKIG1vZHVsZV9leGl0KEJ1c0xvZ2ljX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCA5NTQwZWI4Li42MGY1ODI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtMjksNiArMjksMTMgQEAKIAkgIEhvd2V2ZXIsIGRvIG5vdCBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUgaWYgeW91ciByb290IGZpbGUgc3lzdGVtCiAJICAodGhlIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgaXMgbG9jYXRlZCBvbiBhIFNDU0kgZGV2aWNlLgogCitjb25maWcgU0NTSV9UR1QKKwl0cmlzdGF0ZSAiU0NTSSB0YXJnZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNDU0kgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgSWYgeW91IHdhbnQgdG8gdXNlIFNDU0kgdGFyZ2V0IG1vZGUgZHJpdmVycyBlbmFibGUgdGhpcyBvcHRpb24uCisJICBJZiB5b3UgY2hvb3NlIE0sIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NzaV90Z3QuCisKIGNvbmZpZyBTQ1NJX05FVExJTksKIAlib29sCiAJZGVmYXVsdAluCkBAIC0yMTYsNiArMjIzLDIzIEBACiAJICB0aGVyZSBzaG91bGQgYmUgbm8gbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBpbXBhY3QgYXMgbG9uZyBhcyB5b3UgaGF2ZQogCSAgbG9nZ2luZyB0dXJuZWQgb2ZmLgogCitjb25maWcgU0NTSV9TQ0FOX0FTWU5DCisJYm9vbCAiQXN5bmNocm9ub3VzIFNDU0kgc2Nhbm5pbmciCisJZGVwZW5kcyBvbiBTQ1NJCisJaGVscAorCSAgVGhlIFNDU0kgc3Vic3lzdGVtIGNhbiBwcm9iZSBmb3IgZGV2aWNlcyB3aGlsZSB0aGUgcmVzdCBvZiB0aGUKKwkgIHN5c3RlbSBjb250aW51ZXMgYm9vdGluZywgYW5kIGV2ZW4gcHJvYmUgZGV2aWNlcyBvbiBkaWZmZXJlbnQKKwkgIGJ1c3NlcyBpbiBwYXJhbGxlbCwgbGVhZGluZyB0byBhIHNpZ25pZmljYW50IHNwZWVkLXVwLgorCSAgSWYgeW91IGhhdmUgYnVpbHQgU0NTSSBhcyBtb2R1bGVzLCBlbmFibGluZyB0aGlzIG9wdGlvbiBjYW4KKwkgIGJlIGEgcHJvYmxlbSBhcyB0aGUgZGV2aWNlcyBtYXkgbm90IGhhdmUgYmVlbiBmb3VuZCBieSB0aGUKKwkgIHRpbWUgeW91ciBzeXN0ZW0gZXhwZWN0cyB0aGVtIHRvIGhhdmUgYmVlbi4gIFlvdSBjYW4gbG9hZCB0aGUKKwkgIHNjc2lfd2FpdF9zY2FuIG1vZHVsZSB0byBlbnN1cmUgdGhhdCBhbGwgc2NhbnMgaGF2ZSBjb21wbGV0ZWQuCisJICBJZiB5b3UgYnVpbGQgeW91ciBTQ1NJIGRyaXZlcnMgaW50byB0aGUga2VybmVsLCB0aGVuIGV2ZXJ5dGhpbmcKKwkgIHdpbGwgd29yayBmaW5lIGlmIHlvdSBzYXkgWSBoZXJlLgorCisJICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgY2hvaWNlIGJ5IHNwZWNpZnlpbmcgc2NzaV9tb2Quc2Nhbj0ic3luYyIKKwkgIG9yICJhc3luYyIgb24gdGhlIGtlcm5lbCdzIGNvbW1hbmQgbGluZS4KKwogbWVudSAiU0NTSSBUcmFuc3BvcnRzIgogCWRlcGVuZHMgb24gU0NTSQogCkBAIC03OTcsNiArODIxLDIwIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpYm12c2NzaWMuCiAKK2NvbmZpZyBTQ1NJX0lCTVZTQ1NJUworCXRyaXN0YXRlICJJQk0gVmlydHVhbCBTQ1NJIFNlcnZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX1BTRVJJRVMgJiYgU0NTSV9UR1QgJiYgU0NTSV9TUlAKKwloZWxwCisJICBUaGlzIGlzIHRoZSBTUlAgdGFyZ2V0IGRyaXZlciBmb3IgSUJNIHBTZXJpZXMgdmlydHVhbCBlbnZpcm9ubWVudHMuCisKKwkgIFRoZSB1c2Vyc3BhY2UgY29tcG9uZW50IG5lZWRlZCB0byBpbml0aWFsaXplIHRoZSBkcml2ZXIgYW5kCisJICBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZDoKKworCSAgaHR0cDovL3N0Z3QuYmVybGlvcy5kZS8KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaWJtdnN0Z3QuCisKIGNvbmZpZyBTQ1NJX0lOSVRJTwogCXRyaXN0YXRlICJJbml0aW8gOTEwMFUoVykgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCkBAIC05NDQsOCArOTgyLDEzIEBACiAJdHJpc3RhdGUgIlByb21pc2UgU3VwZXJUcmFrIEVYIFNlcmllcyBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kKIAktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBQcm9taXNlIFN1cGVyVHJhayBFWDgzNTAvODMwMC8xNjM1MC8xNjMwMAotCSAgU3RvcmFnZSBjb250cm9sbGVycy4KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFByb21pc2UgU3VwZXJUcmFrIEVYIHNlcmllcyBzdG9yYWdlIGNvbnRyb2xsZXJzLgorCisJICBQcm9taXNlIHByb3ZpZGVzIExpbnV4IFJBSUQgY29uZmlndXJhdGlvbiB1dGlsaXR5IGZvciB0aGVzZQorCSAgY29udHJvbGxlcnMuIFBsZWFzZSB2aXNpdCA8aHR0cDovL3d3dy5wcm9taXNlLmNvbT4gdG8gZG93bmxvYWQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHN0ZXguCiAKIGNvbmZpZyBTQ1NJX1NZTTUzQzhYWF8yCiAJdHJpc3RhdGUgIlNZTTUzQzhYWCBWZXJzaW9uIDIgU0NTSSBzdXBwb3J0IgpAQCAtMTAyNiw2ICsxMDY5LDcgQEAKIGNvbmZpZyBTQ1NJX0lQUl9UUkFDRQogCWJvb2wgImVuYWJsZSBkcml2ZXIgaW50ZXJuYWwgdHJhY2UiCiAJZGVwZW5kcyBvbiBTQ1NJX0lQUgorCWRlZmF1bHQgeQogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgZHJpdmVyIHdpbGwgdHJhY2UgYWxsIGNvbW1hbmRzIGlzc3VlZAogCSAgdG8gdGhlIGFkYXB0ZXIuIFBlcmZvcm1hbmNlIGltcGFjdCBpcyBtaW5pbWFsLiBUcmFjZSBjYW4gYmUKQEAgLTEwMzQsNiArMTA3OCw3IEBACiBjb25maWcgU0NTSV9JUFJfRFVNUAogCWJvb2wgImVuYWJsZSBhZGFwdGVyIGR1bXAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNDU0lfSVBSCisJZGVmYXVsdCB5CiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBkcml2ZXIgd2lsbCBzdXBwb3J0IGFkYXB0ZXIgY3Jhc2ggZHVtcC4KIAkgIElmIHlvdSBlbmFibGUgdGhpcyBzdXBwb3J0LCB0aGUgaXByZHVtcCBkYWVtb24gY2FuIGJlIHVzZWQKQEAgLTE2OTIsNyArMTczNyw3IEBACiAKIGNvbmZpZyBTVU4zX1NDU0kKIAl0cmlzdGF0ZSAiU3VuMyBOQ1I1MzgwIFNDU0kiCi0JZGVwZW5kcyBvbiBTVU4zICYmIFNDU0kgJiYgQlJPS0VOCisJZGVwZW5kcyBvbiBTVU4zICYmIFNDU0kKIAlzZWxlY3QgU0NTSV9TUElfQVRUUlMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgT0JJTyAob25ib2FyZCBpbykgTkNSNTM4MApAQCAtMTczNCw2ICsxNzc5LDE2IEBACiAgICAgICAgICAgY2FsbGVkIHpmY3AuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUKICAgICAgICAgICBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4KIAorY29uZmlnIFNDU0lfU1JQCisJdHJpc3RhdGUgIlNDU0kgUkRNQSBQcm90b2NvbCBoZWxwZXIgbGlicmFyeSIKKwlkZXBlbmRzIG9uIFNDU0kgJiYgUENJCisJc2VsZWN0IFNDU0lfVEdUCisJaGVscAorCSAgSWYgeW91IHdpc2ggdG8gdXNlIFNSUCB0YXJnZXQgZHJpdmVycywgc2F5IFkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGxpYnNycC4KKwogZW5kbWVudQogCiBzb3VyY2UgImRyaXZlcnMvc2NzaS9wY21jaWEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQppbmRleCBiY2NhMzljLi5iZDdjOTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCkBAIC0yMSw2ICsyMSw3IEBACiBzdWJkaXItJChDT05GSUdfUENNQ0lBKQkJKz0gcGNtY2lhCiAKIG9iai0kKENPTkZJR19TQ1NJKQkJKz0gc2NzaV9tb2Qubworb2JqLSQoQ09ORklHX1NDU0lfVEdUKQkJKz0gc2NzaV90Z3QubwogCiBvYmotJChDT05GSUdfUkFJRF9BVFRSUykJKz0gcmFpZF9jbGFzcy5vCiAKQEAgLTEyNSw3ICsxMjYsOSBAQAogb2JqLSQoQ09ORklHX1NDU0lfTEFTSTcwMCkJKz0gNTNjNzAwLm8gbGFzaTcwMC5vCiBvYmotJChDT05GSUdfU0NTSV9OU1AzMikJKz0gbnNwMzIubwogb2JqLSQoQ09ORklHX1NDU0lfSVBSKQkJKz0gaXByLm8KK29iai0kKENPTkZJR19TQ1NJX1NSUCkJCSs9IGxpYnNycC5vCiBvYmotJChDT05GSUdfU0NTSV9JQk1WU0NTSSkJKz0gaWJtdnNjc2kvCitvYmotJChDT05GSUdfU0NTSV9JQk1WU0NTSVMpCSs9IGlibXZzY3NpLwogb2JqLSQoQ09ORklHX1NDU0lfSFBUSU9QKQkrPSBocHRpb3Aubwogb2JqLSQoQ09ORklHX1NDU0lfU1RFWCkJCSs9IHN0ZXgubwogCkBAIC0xNDEsNiArMTQ0LDggQEAKICMgVGhpcyBnb2VzIGxhc3QsIHNvIHRoYXQgInJlYWwiIHNjc2kgZGV2aWNlcyBwcm9iZSBlYXJsaWVyCiBvYmotJChDT05GSUdfU0NTSV9ERUJVRykJKz0gc2NzaV9kZWJ1Zy5vCiAKK29iai0kKENPTkZJR19TQ1NJKQkJKz0gc2NzaV93YWl0X3NjYW4ubworCiBzY3NpX21vZC15CQkJKz0gc2NzaS5vIGhvc3RzLm8gc2NzaV9pb2N0bC5vIGNvbnN0YW50cy5vIFwKIAkJCQkgICBzY3NpY2FtLm8gc2NzaV9lcnJvci5vIHNjc2lfbGliLm8gXAogCQkJCSAgIHNjc2lfc2Nhbi5vIHNjc2lfc3lzZnMubyBcCkBAIC0xNDksNiArMTU0LDggQEAKIHNjc2lfbW9kLSQoQ09ORklHX1NZU0NUTCkJKz0gc2NzaV9zeXNjdGwubwogc2NzaV9tb2QtJChDT05GSUdfU0NTSV9QUk9DX0ZTKQkrPSBzY3NpX3Byb2MubwogCitzY3NpX3RndC15CQkJKz0gc2NzaV90Z3RfbGliLm8gc2NzaV90Z3RfaWYubworCiBzZF9tb2Qtb2Jqcwk6PSBzZC5vCiBzcl9tb2Qtb2Jqcwk6PSBzci5vIHNyX2lvY3RsLm8gc3JfdmVuZG9yLm8KIG5jcjUzYzh4eC1mbGFncy0kKENPTkZJR19TQ1NJX1pBTE9OKSBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jIGIvZHJpdmVycy9zY3NpL05DUjUzODAuYwppbmRleCBhNmFhOTEwLi5iYjNjYjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKQEAgLTg0OSw3ICs4NDksNyBAQAogCWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSA9IE5VTEw7CiAJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSA9IE5VTEw7CiAJCi0JSU5JVF9XT1JLKCZob3N0ZGF0YS0+Y29yb3V0aW5lLCBOQ1I1MzgwX21haW4sIGhvc3RkYXRhKTsKKwlJTklUX0RFTEFZRURfV09SSygmaG9zdGRhdGEtPmNvcm91dGluZSwgTkNSNTM4MF9tYWluKTsKIAkKICNpZmRlZiBOQ1I1MzgwX1NUQVRTCiAJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIAogCS8qIFJ1biB0aGUgY29yb3V0aW5lIGlmIGl0IGlzbid0IGFscmVhZHkgcnVubmluZy4gKi8KIAkvKiBLaWNrIG9mZiBjb21tYW5kIHByb2Nlc3NpbmcgKi8KLQlzY2hlZHVsZV93b3JrKCZob3N0ZGF0YS0+Y29yb3V0aW5lKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhvc3RkYXRhLT5jb3JvdXRpbmUsIDApOwogCXJldHVybiAwOwogfQogCkBAIC0xMDMzLDkgKzEwMzMsMTAgQEAKICAqCWhvc3QgbG9jayBhbmQgY2FsbGVkIHJvdXRpbmVzIG1heSB0YWtlIHRoZSBpc2EgZG1hIGxvY2suCiAgKi8KIAotc3RhdGljIHZvaWQgTkNSNTM4MF9tYWluKHZvaWQgKnApCitzdGF0aWMgdm9pZCBOQ1I1MzgwX21haW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IHA7CisJc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhLCBjb3JvdXRpbmUud29yayk7CiAJc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UgPSBob3N0ZGF0YS0+aG9zdDsKIAlTY3NpX0NtbmQgKnRtcCwgKnByZXY7CiAJaW50IGRvbmU7CkBAIC0xMjIxLDcgKzEyMjIsNyBAQAogCQl9CS8qIGlmIEJBU1JfSVJRICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOwogCQlpZighZG9uZSkKLQkJCXNjaGVkdWxlX3dvcmsoJmhvc3RkYXRhLT5jb3JvdXRpbmUpOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZob3N0ZGF0YS0+Y29yb3V0aW5lLCAwKTsKIAl9IHdoaWxlICghZG9uZSk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzODAuaCBiL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmgKaW5kZXggMWJjNzNkZS4uNzEzYTEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL05DUjUzODAuaAorKysgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5oCkBAIC0yNzEsNyArMjcxLDcgQEAKIAl1bnNpZ25lZCBsb25nIHRpbWVfZXhwaXJlczsJCS8qIGluIGppZmZpZXMsIHNldCBwcmlvciB0byBzbGVlcGluZyAqLwogCWludCBzZWxlY3RfdGltZTsJCQkvKiB0aW1lciBpbiBzZWxlY3QgZm9yIHRhcmdldCByZXNwb25zZSAqLwogCXZvbGF0aWxlIFNjc2lfQ21uZCAqc2VsZWN0aW5nOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBjb3JvdXRpbmU7CQkvKiBvdXIgY28tcm91dGluZSAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgY29yb3V0aW5lOwkJLyogb3VyIGNvLXJvdXRpbmUgKi8KICNpZmRlZiBOQ1I1MzgwX1NUQVRTCiAJdW5zaWduZWQgdGltZWJhc2U7CQkJLyogQmFzZSBmb3IgdGltZSBjYWxjcyAqLwogCWxvbmcgdGltZV9yZWFkWzhdOwkJCS8qIHRpbWUgdG8gZG8gcmVhZHMgKi8KQEAgLTI5OCw3ICsyOTgsNyBAQAogI2lmbmRlZiBET05UX1VTRV9JTlRSCiBzdGF0aWMgaXJxcmV0dXJuX3QgTkNSNTM4MF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAjZW5kaWYKLXN0YXRpYyB2b2lkIE5DUjUzODBfbWFpbih2b2lkICpwdHIpOworc3RhdGljIHZvaWQgTkNSNTM4MF9tYWluKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50X29wdGlvbnMoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpOwogI2lmZGVmIE5ERUJVRwogc3RhdGljIHZvaWQgTkNSNTM4MF9wcmludF9waGFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSNTNjNDA2YS5jIGIvZHJpdmVycy9zY3NpL05DUjUzYzQwNmEuYwppbmRleCBkNDYxMzgxLi44NTc4NTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSNTNjNDA2YS5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1I1M2M0MDZhLmMKQEAgLTIyMCw5ICsyMjAsMTEgQEAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tdID0geyAweDIzMCwgMHgzMzAsIDB4MjgwLCAweDI5MCwgMHgzMzAsIDB4MzQwLCAweDMwMCwgMHgzMTAsIDB4MzQ4LCAweDM1MCB9OwogI2RlZmluZSBQT1JUX0NPVU5UIEFSUkFZX1NJWkUocG9ydHMpCiAKKyNpZm5kZWYgTU9EVUxFCiAvKiBwb3NzaWJsZSBpbnRlcnJ1cHQgY2hhbm5lbHMgKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnRyc1tdID0geyAxMCwgMTEsIDEyLCAxNSB9OwogI2RlZmluZSBJTlRSX0NPVU5UIEFSUkFZX1NJWkUoaW50cnMpCisjZW5kaWYgLyogIU1PRFVMRSAqLwogCiAvKiBzaWduYXR1cmVzIGZvciBOQ1IgNTNjNDA2YSBiYXNlZCBjb250cm9sbGVycyAqLwogI2lmIFVTRV9CSU9TCkBAIC02MDUsNiArNjA3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmbmRlZiBNT0RVTEUKIC8qIGNhbGxlZCBmcm9tIGluaXQvbWFpbi5jICovCiBzdGF0aWMgaW50IF9faW5pdCBOQ1I1M2M0MDZhX3NldHVwKGNoYXIgKnN0cikKIHsKQEAgLTY2MSw2ICs2NjQsOCBAQAogCiBfX3NldHVwKCJuY3I1M2M0MDZhPSIsIE5DUjUzYzQwNmFfc2V0dXApOwogCisjZW5kaWYgLyogIU1PRFVMRSAqLworCiBzdGF0aWMgY29uc3QgY2hhciAqTkNSNTNjNDA2YV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKlNDaG9zdCkKIHsKIAlERUIocHJpbnRrKCJOQ1I1M2M0MDZhX2luZm8gY2FsbGVkXG4iKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCmluZGV4IGFjMTA4ZjkuLjQyNmNkNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCkBAIC0yODgsNyArMjg4LDcgQEAKIAogCWlmIChtYXhpbXVtX251bV9jb250YWluZXJzIDwgTUFYSU1VTV9OVU1fQ09OVEFJTkVSUykKIAkJbWF4aW11bV9udW1fY29udGFpbmVycyA9IE1BWElNVU1fTlVNX0NPTlRBSU5FUlM7Ci0JZnNhX2Rldl9wdHIgPSAoc3RydWN0IGZzYV9kZXZfaW5mbyAqKSBrbWFsbG9jKAorCWZzYV9kZXZfcHRyID0ga21hbGxvYygKIAkgIHNpemVvZigqZnNhX2Rldl9wdHIpICogbWF4aW11bV9udW1fY29udGFpbmVycywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmc2FfZGV2X3B0cikgewogCQlhYWNfZmliX2ZyZWUoZmlicHRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaCBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY3JhaWQuaAppbmRleCBlYjNlZDkxLi40ZjhiNGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNyYWlkLmgKKysrIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjcmFpZC5oCkBAIC0xMSw4ICsxMSw4IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWZuZGVmIEFBQ19EUklWRVJfQlVJTEQKLSMgZGVmaW5lIEFBQ19EUklWRVJfQlVJTEQgMjQwOQotIyBkZWZpbmUgQUFDX0RSSVZFUl9CUkFOQ0ggIi1taDIiCisjIGRlZmluZSBBQUNfRFJJVkVSX0JVSUxEIDI0MjMKKyMgZGVmaW5lIEFBQ19EUklWRVJfQlJBTkNIICItbWgzIgogI2VuZGlmCiAjZGVmaW5lIE1BWElNVU1fTlVNX0NPTlRBSU5FUlMJMzIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1pbml0LmMKaW5kZXggZDVjZjhiOS4uNmQzMDViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWluaXQuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21taW5pdC5jCkBAIC0zODYsNyArMzg2LDcgQEAKIAkgKglPayBub3cgaW5pdCB0aGUgY29tbXVuaWNhdGlvbiBzdWJzeXN0ZW0KIAkgKi8KIAotCWRldi0+cXVldWVzID0gKHN0cnVjdCBhYWNfcXVldWVfYmxvY2sgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGFhY19xdWV1ZV9ibG9jayksIEdGUF9LRVJORUwpOworCWRldi0+cXVldWVzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFhY19xdWV1ZV9ibG9jayksIEdGUF9LRVJORUwpOwogCWlmIChkZXYtPnF1ZXVlcyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgY291bGQgbm90IGFsbG9jYXRlIGNvbW0gcmVnaW9uLlxuIik7CiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jCmluZGV4IDE5ZTQyYWMuLjQ4OTNhNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMKQEAgLTUxOCw2ICs1MTgsNyBAQAogCQkJICovCiAJCQl1bnNpZ25lZCBsb25nIGNvdW50ID0gMzYwMDAwMDBMOyAvKiAzIG1pbnV0ZXMgKi8KIAkJCXdoaWxlIChkb3duX3RyeWxvY2soJmZpYnB0ci0+ZXZlbnRfd2FpdCkpIHsKKwkJCQlpbnQgYmxpbms7CiAJCQkJaWYgKC0tY291bnQgPT0gMCkgewogCQkJCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5sb2NrLCBxZmxhZ3MpOwogCQkJCQlxLT5udW1wZW5kaW5nLS07CkBAIC01MzAsNiArNTMxLDE0IEBACiAJCQkJCX0KIAkJCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCQkJfQorCQkJCWlmICgoYmxpbmsgPSBhYWNfYWRhcHRlcl9jaGVja19oZWFsdGgoZGV2KSkgPiAwKSB7CisJCQkJCWlmICh3YWl0ID09IC0xKSB7CisJICAgICAgICAJCQkJcHJpbnRrKEtFUk5fRVJSICJhYWNyYWlkOiBhYWNfZmliX3NlbmQ6IGFkYXB0ZXIgYmxpbmtMRUQgMHgleC5cbiIKKwkJCQkJCSAgIlVzdWFsbHkgYSByZXN1bHQgb2YgYSBzZXJpb3VzIHVucmVjb3ZlcmFibGUgaGFyZHdhcmUgcHJvYmxlbVxuIiwKKwkJCQkJCSAgYmxpbmspOworCQkJCQl9CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KIAkJCQl1ZGVsYXkoNSk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZmaWJwdHItPmV2ZW50X3dhaXQpKSB7CkBAIC0xMDkzLDYgKzExMDIsMjAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyoKKwkgKglMb29wIHRocm91Z2ggdGhlIGZpYnMsIGNsb3NlIHRoZSBzeW5jaHJvbm91cyBGSUJTCisJICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgKGFhYy0+c2NzaV9ob3N0X3B0ci0+Y2FuX3F1ZXVlICsgQUFDX05VTV9NR1RfRklCKTsgaW5kZXgrKykgeworCQlzdHJ1Y3QgZmliICpmaWIgPSAmYWFjLT5maWJzW2luZGV4XTsKKwkJaWYgKCEoZmliLT5od19maWItPmhlYWRlci5YZmVyU3RhdGUgJiBjcHVfdG9fbGUzMihOb1Jlc3BvbnNlRXhwZWN0ZWQgfCBBc3luYykpICYmCisJCSAgKGZpYi0+aHdfZmliLT5oZWFkZXIuWGZlclN0YXRlICYgY3B1X3RvX2xlMzIoUmVzcG9uc2VFeHBlY3RlZCkpKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWd2OworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZpYi0+ZXZlbnRfbG9jaywgZmxhZ3YpOworCQkJdXAoJmZpYi0+ZXZlbnRfd2FpdCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWItPmV2ZW50X2xvY2ssIGZsYWd2KTsKKwkJCXNjaGVkdWxlKCk7CisJCX0KKwl9CiAJaW5kZXggPSBhYWMtPmNhcmR0eXBlOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haGExNTJ4LmMgYi9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jCmluZGV4IDMwNmY0NmIuLjBjZWM3NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haGExNTJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL2FoYTE1MnguYwpAQCAtMTQ0Myw3ICsxNDQzLDcgQEAKICAqIFJ1biBzZXJ2aWNlIGNvbXBsZXRpb25zIG9uIHRoZSBjYXJkIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgogICoKICAqLwotc3RhdGljIHZvaWQgcnVuKHZvaWQpCitzdGF0aWMgdm9pZCBydW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBhaGExNTJ4X2hvc3RkYXRhICpoZDsKIApAQCAtMTQ5OSw3ICsxNDk5LDcgQEAKIAkJSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlPTE7CiAKIAkJLyogUG9rZSB0aGUgQkggaGFuZGxlciAqLwotCQlJTklUX1dPUksoJmFoYTE1MnhfdHEsICh2b2lkICopIHJ1biwgTlVMTCk7CisJCUlOSVRfV09SSygmYWhhMTUyeF90cSwgcnVuKTsKIAkJc2NoZWR1bGVfd29yaygmYWhhMTUyeF90cSk7CiAJfQogCURPX1VOTE9DSyhmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTU0Mi5jIGIvZHJpdmVycy9zY3NpL2FoYTE1NDIuYwppbmRleCBkN2E2MWE2Li4xZDIzOWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWhhMTU0Mi5jCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNTQyLmMKQEAgLTY5OSw3ICs2OTksNyBAQAogI2VuZGlmCiAJCWludCBpOwogCQljY2JbbWJvXS5vcCA9IDI7CS8qIFNDU0kgSW5pdGlhdG9yIENvbW1hbmQgIHcvc2NhdHRlci1nYXRoZXIgKi8KLQkJU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQlTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJCXNncG50ID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CiAJCWNwdHIgPSAoc3RydWN0IGNoYWluICopIFNDcG50LT5ob3N0X3NjcmliYmxlOwogCQlpZiAoY3B0ciA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWhhMTc0MC5jIGIvZHJpdmVycy9zY3NpL2FoYTE3NDAuYwppbmRleCBjM2MzOGE3Li5kN2FmOWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWhhMTc0MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haGExNzQwLmMKQEAgLTU4Niw3ICs1ODYsNyBAQAogCiBzdGF0aWMgaW50IGFoYTE3NDBfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpbnQgc2xvdGJhc2U7CisJaW50IHNsb3RiYXNlLCByYzsKIAl1bnNpZ25lZCBpbnQgaXJxX2xldmVsLCBpcnFfdHlwZSwgdHJhbnNsYXRpb247CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQ7CiAJc3RydWN0IGFoYTE3NDBfaG9zdGRhdGEgKmhvc3Q7CkBAIC02NDEsMTAgKzY0MSwxNiBAQAogCX0KIAogCWVpc2Ffc2V0X2RydmRhdGEgKGVkZXYsIHNocG50KTsKLQlzY3NpX2FkZF9ob3N0IChzaHBudCwgZGV2KTsgLyogWFhYIGhhbmRsZSBmYWlsdXJlICovCisKKwlyYyA9IHNjc2lfYWRkX2hvc3QgKHNocG50LCBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfaXJxOworCiAJc2NzaV9zY2FuX2hvc3QgKHNocG50KTsKIAlyZXR1cm4gMDsKIAorIGVycl9pcnE6CisgCWZyZWVfaXJxKGlycV9sZXZlbCwgc2hwbnQpOwogIGVycl91bm1hcDoKIAlkbWFfdW5tYXBfc2luZ2xlICgmZWRldi0+ZGV2LCBob3N0LT5lY2JfZG1hX2FkZHIsCiAJCQkgIHNpemVvZiAoaG9zdC0+ZWNiKSwgRE1BX0JJRElSRUNUSU9OQUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eC5oCmluZGV4IGRmMzM0NmIuLjE3MGE0MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHguaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4LmgKQEAgLTUzLDE0ICs1Myw2IEBACiBzdHJ1Y3Qgc2NiX3BsYXRmb3JtX2RhdGE7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVXNlZnVsIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSxiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotI2lmbmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KICNpZm5kZWYgVFJVRQogI2RlZmluZSBUUlVFIDEKICNlbmRpZgpAQCAtOTcyLDggKzk2NCw2IEBACiAKIGludAkJYWhkX3dyaXRlX3NlZXByb20oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1aW50MTZfdCAqYnVmLAogCQkJCSAgdV9pbnQgc3RhcnRfYWRkciwgdV9pbnQgY291bnQpOwotaW50CQlhaGRfd2FpdF9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1pbnQJCWFoZF92ZXJpZnlfdnBkX2Nrc3VtKHN0cnVjdCB2cGRfY29uZmlnICp2cGQpOwogaW50CQlhaGRfdmVyaWZ5X2Nrc3VtKHN0cnVjdCBzZWVwcm9tX2NvbmZpZyAqc2MpOwogaW50CQlhaGRfYWNxdWlyZV9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiB2b2lkCQlhaGRfcmVsZWFzZV9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CkBAIC0xMzIwLDggKzEzMTAsNiBAQAogCWNoYXIJCQkqbmFtZTsKIAlhaGRfZGV2aWNlX3NldHVwX3QJKnNldHVwOwogfTsKLWV4dGVybiBzdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSBhaGRfcGNpX2lkZW50X3RhYmxlIFtdOwotZXh0ZXJuIGNvbnN0IHVfaW50IGFoZF9udW1fcGNpX2RldnM7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWTC9FSVNBIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSB7CkBAIC0xMzM5LDE1ICsxMzI3LDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRnVuY3Rpb24gRGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZAkJCWFoZF9yZXNldF9jbWRzX3BlbmRpbmcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXVfaW50CQkJYWhkX2ZpbmRfYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpOwotdm9pZAkJCWFoZF9idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJICAgICB1X2ludCB0Y2wsIHVfaW50IGJ1c3lpZCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfdW5idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX3VuYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpCi17Ci0JYWhkX2J1c3lfdGNsKGFoZCwgdGNsLCBTQ0JfTElTVF9OVUxMKTsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBGcm9udCBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0CWFoZF9wY2lfaWRlbnRpdHkgKmFoZF9maW5kX3BjaV9kZXZpY2UoYWhkX2Rldl9zb2Z0Y190KTsKQEAgLTEzNTYsNyArMTMzNSw2IEBACiBpbnQJYWhkX3BjaV90ZXN0X3JlZ2lzdGVyX2FjY2VzcyhzdHJ1Y3QgYWhkX3NvZnRjICopOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NCIGFuZCBTQ0IgcXVldWUgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqLwotaW50CQlhaGRfcHJvYmVfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICopOwogdm9pZAkJYWhkX3FpbmZpZm9fcmVxdWV1ZV90YWlsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKIAkJCQkJIHN0cnVjdCBzY2IgKnNjYik7CiBpbnQJCWFoZF9tYXRjaF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IsCkBAIC0xMzc0LDMzICsxMzUyLDIwIEBACiBpbnQJCQkgYWhkX3BhcnNlX2NmZ2RhdGEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkJCQkgICBzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjKTsKIHZvaWQJCQkgYWhkX2ludHJfZW5hYmxlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IGVuYWJsZSk7Ci12b2lkCQkJIGFoZF91cGRhdGVfY29hbGVzY2luZ192YWx1ZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkJICAgICAgdV9pbnQgdGltZXIsCi0JCQkJCQkgICAgICB1X2ludCBtYXhjbWRzLAotCQkJCQkJICAgICAgdV9pbnQgbWluY21kcyk7Ci12b2lkCQkJIGFoZF9lbmFibGVfY29hbGVzY2luZyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCSAgICAgICBpbnQgZW5hYmxlKTsKIHZvaWQJCQkgYWhkX3BhdXNlX2FuZF9mbHVzaHdvcmsoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIGludAkJCSBhaGRfc3VzcGVuZChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOyAKLWludAkJCSBhaGRfcmVzdW1lKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiB2b2lkCQkJIGFoZF9zZXRfdW5pdChzdHJ1Y3QgYWhkX3NvZnRjICosIGludCk7CiB2b2lkCQkJIGFoZF9zZXRfbmFtZShzdHJ1Y3QgYWhkX3NvZnRjICosIGNoYXIgKik7CiBzdHJ1Y3Qgc2NiCQkqYWhkX2dldF9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBjb2xfaWR4KTsKIHZvaWQJCQkgYWhkX2ZyZWVfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKTsKLXZvaWQJCQkgYWhkX2FsbG9jX3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIHZvaWQJCQkgYWhkX2ZyZWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIGludAkJCSBhaGRfcmVzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgcmVpbml0KTsKLXZvaWQJCQkgYWhkX3NodXRkb3duKHZvaWQgKmFyZyk7CiBpbnQJCQkgYWhkX3dyaXRlX2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKIAkJCQkJICAgIHVfaW50IGFkZHIsIHVfaW50IHZhbHVlKTsKIGludAkJCSBhaGRfcmVhZF9mbGV4cG9ydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGFkZHIsCiAJCQkJCSAgIHVpbnQ4X3QgKnZhbHVlKTsKLWludAkJCSBhaGRfd2FpdF9mbGV4cG9ydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEludGVycnVwdCBTZXJ2aWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAkJCWFoZF9wY2lfaW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotdm9pZAkJCWFoZF9jbGVhcl9pbnRzdGF0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci12b2lkCQkJYWhkX2ZsdXNoX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiB2b2lkCQkJYWhkX3J1bl9xb3V0ZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQogdm9pZAkJCWFoZF9ydW5fdHFpbmZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgcGF1c2VkKTsKQEAgLTE0MDksNyArMTM3NCw2IEBACiB2b2lkCQkJYWhkX2hhbmRsZV9zZXFpbnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBpbnRzdGF0KTsKIHZvaWQJCQlhaGRfaGFuZGxlX3Njc2lpbnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkJCQkgICB1X2ludCBpbnRzdGF0KTsKLXZvaWQJCQlhaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRXJyb3IgUmVjb3ZlcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBlbnVtIHsKQEAgLTE0MjYsMjMgKzEzOTAsOSBAQAogCQkJCQkgICAgIGNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLAogCQkJCQkgICAgIGludCBzdG9wX29uX2ZpcnN0LCBpbnQgcmVtb3ZlLAogCQkJCQkgICAgIGludCBzYXZlX3N0YXRlKTsKLXZvaWQJCQlhaGRfZnJlZXplX2RldnEoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpOwogaW50CQkJYWhkX3Jlc2V0X2NoYW5uZWwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBjaGFyIGNoYW5uZWwsCiAJCQkJCSAgaW50IGluaXRpYXRlX3Jlc2V0KTsKLWludAkJCWFoZF9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwKLQkJCQkgICAgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCi0JCQkJICAgICAgIHJvbGVfdCByb2xlLCB1aW50MzJfdCBzdGF0dXMpOwotdm9pZAkJCWFoZF9yZXN0YXJ0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci12b2lkCQkJYWhkX2NsZWFyX2ZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBmaWZvKTsKLXZvaWQJCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOwotdm9pZAkJCWFoZF9oYW5kbGVfc2NzaV9zdGF0dXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgICAgICAgc3RydWN0IHNjYiAqc2NiKTsKLXZvaWQJCQlhaGRfY2FsY19yZXNpZHVhbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCSAgc3RydWN0IHNjYiAqc2NiKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogVXRpbGl0eSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5KgotCQkJYWhkX2xvb2t1cF9waGFzZV9lbnRyeShpbnQgcGhhc2UpOwogdm9pZAkJCWFoZF9jb21waWxlX2RldmluZm8oc3RydWN0IGFoZF9kZXZpbmZvICpkZXZpbmZvLAogCQkJCQkgICAgdV9pbnQgb3VyX2lkLCB1X2ludCB0YXJnZXQsCiAJCQkJCSAgICB1X2ludCBsdW4sIGNoYXIgY2hhbm5lbCwKQEAgLTE0NTAsMTQgKzE0MDAsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFRyYW5zZmVyIE5lZ290aWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQJCQlhaGRfZmluZF9zeW5jcmF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50ICpwZXJpb2QsCiAJCQkJCSAgdV9pbnQgKnBwcl9vcHRpb25zLCB1X2ludCBtYXhzeW5jKTsKLXZvaWQJCQlhaGRfdmFsaWRhdGVfb2Zmc2V0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJICAgIHN0cnVjdCBhaGRfaW5pdGlhdG9yX3RpbmZvICp0aW5mbywKLQkJCQkJICAgIHVfaW50IHBlcmlvZCwgdV9pbnQgKm9mZnNldCwKLQkJCQkJICAgIGludCB3aWRlLCByb2xlX3Qgcm9sZSk7Ci12b2lkCQkJYWhkX3ZhbGlkYXRlX3dpZHRoKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJICAgc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvLAotCQkJCQkgICB1X2ludCAqYnVzX3dpZHRoLAotCQkJCQkgICByb2xlX3Qgcm9sZSk7CiAvKgogICogTmVnb3RpYXRpb24gdHlwZXMuICBUaGVzZSBhcmUgdXNlZCB0byBxdWFsaWZ5IGlmIHdlIHNob3VsZCByZW5lZ290aWF0ZQogICogZXZlbiBpZiBvdXIgZ29hbCBhbmQgY3VycmVudCB0cmFuc3BvcnQgcGFyYW1ldGVycyBhcmUgaWRlbnRpY2FsLgpAQCAtMTQ4NiwxMSArMTQyOCw2IEBACiAJQUhEX1FVRVVFX1RBR0dFRAogfSBhaGRfcXVldWVfYWxnOwogCi12b2lkCQkJYWhkX3NldF90YWdzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCQkgICAgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbywKLQkJCQkgICAgIGFoZF9xdWV1ZV9hbGcgYWxnKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVGFyZ2V0IE1vZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBBSERfVEFSR0VUX01PREUKIHZvaWQJCWFoZF9zZW5kX2xzdGF0ZV9ldmVudHMoc3RydWN0IGFoZF9zb2Z0YyAqLApAQCAtMTUyOCwxMCArMTQ2NSw4IEBACiAjZGVmaW5lIEFIRF9TSE9XX0lOVF9DT0FMRVNDSU5HCTB4MTAwMDAKICNkZWZpbmUgQUhEX0RFQlVHX1NFUVVFTkNFUgkweDIwMDAwCiAjZW5kaWYKLXZvaWQJCQlhaGRfcHJpbnRfc2NiKHN0cnVjdCBzY2IgKnNjYik7CiB2b2lkCQkJYWhkX3ByaW50X2RldmluZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkJCQkgIHN0cnVjdCBhaGRfZGV2aW5mbyAqZGV2aW5mbyk7Ci12b2lkCQkJYWhkX2R1bXBfc2dsaXN0KHN0cnVjdCBzY2IgKnNjYik7CiB2b2lkCQkJYWhkX2R1bXBfY2FyZF9zdGF0ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwogaW50CQkJYWhkX3ByaW50X3JlZ2lzdGVyKGFoZF9yZWdfcGFyc2VfZW50cnlfdCAqdGFibGUsCiAJCQkJCSAgIHVfaW50IG51bV9lbnRyaWVzLApAQCAtMTU0MCw1ICsxNDc1LDQgQEAKIAkJCQkJICAgdV9pbnQgdmFsdWUsCiAJCQkJCSAgIHVfaW50ICpjdXJfY29sdW1uLAogCQkJCQkgICB1X2ludCB3cmFwX3BvaW50KTsKLXZvaWQJCQlhaGRfZHVtcF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CiAjZW5kaWYgLyogX0FJQzc5WFhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29yZS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMKaW5kZXggNjUzODE4ZC4uMDdhODZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTG9va3VwIFRhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqYWhkX2NoaXBfbmFtZXNbXSA9CitzdGF0aWMgY2hhciAqYWhkX2NoaXBfbmFtZXNbXSA9CiB7CiAJIk5PTkUiLAogCSJhaWM3OTAxIiwKQEAgLTIzNywxMCArMjM3LDMzIEBACiAJCQkJCSAgICAgIHN0cnVjdCB0YXJnZXRfY21kICpjbWQpOwogI2VuZGlmCiAKK3N0YXRpYyBpbnQJCWFoZF9hYm9ydF9zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IHRhcmdldCwKKwkJCQkgICAgICAgY2hhciBjaGFubmVsLCBpbnQgbHVuLCB1X2ludCB0YWcsCisJCQkJICAgICAgIHJvbGVfdCByb2xlLCB1aW50MzJfdCBzdGF0dXMpOworc3RhdGljIHZvaWQJCWFoZF9hbGxvY19zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdm9pZAkJYWhkX2J1c3lfdGNsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGNsLAorCQkJCSAgICAgdV9pbnQgc2NiaWQpOworc3RhdGljIHZvaWQJCWFoZF9jYWxjX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICBzdHJ1Y3Qgc2NiICpzY2IpOworc3RhdGljIHZvaWQJCWFoZF9jbGVhcl9jcml0aWNhbF9zZWN0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CitzdGF0aWMgdm9pZAkJYWhkX2NsZWFyX2ludHN0YXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKK3N0YXRpYyB2b2lkCQlhaGRfZW5hYmxlX2NvYWxlc2Npbmcoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCQkgICAgICBpbnQgZW5hYmxlKTsKK3N0YXRpYyB1X2ludAkJYWhkX2ZpbmRfYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpOworc3RhdGljIHZvaWQJCWFoZF9mcmVlemVfZGV2cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCXN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZAkJYWhkX2hhbmRsZV9zY2Jfc3RhdHVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKKwkJCQkJICAgICAgc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyBzdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5KiBhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGludCBwaGFzZSk7CitzdGF0aWMgdm9pZAkJYWhkX3NodXRkb3duKHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZAkJYWhkX3VwZGF0ZV9jb2FsZXNjaW5nX3ZhbHVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkJCQkgICAgIHVfaW50IHRpbWVyLAorCQkJCQkJICAgICB1X2ludCBtYXhjbWRzLAorCQkJCQkJICAgICB1X2ludCBtaW5jbWRzKTsKK3N0YXRpYyBpbnQJCWFoZF92ZXJpZnlfdnBkX2Nrc3VtKHN0cnVjdCB2cGRfY29uZmlnICp2cGQpOworc3RhdGljIGludAkJYWhkX3dhaXRfc2VlcHJvbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJpdmF0ZSBJbmxpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX2Fzc2VydF9hdG4oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyBfX2lubGluZSBpbnQJYWhkX2N1cnJlbnRseV9wYWNrZXRpemVkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUgaW50CWFoZF9zZXRfYWN0aXZlX2ZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIAogc3RhdGljIF9faW5saW5lIHZvaWQKIGFoZF9hc3NlcnRfYXRuKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKQEAgLTI5NCwxMSArMzE3LDQ0IEBACiAJfQogfQogCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3VuYnVzeV90Y2woc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB0Y2wpCit7CisJYWhkX2J1c3lfdGNsKGFoZCwgdGNsLCBTQ0JfTElTVF9OVUxMKTsKK30KKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzZXF1ZW5jZXIgcmVwb3J0ZWQgYSByZXNpZHVhbAorICogZm9yIHRoaXMgU0NCL3RyYW5zYWN0aW9uLgorICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX3VwZGF0ZV9yZXNpZHVhbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwl1aW50MzJfdCBzZ3B0cjsKKworCXNncHRyID0gYWhkX2xlMzJ0b2goc2NiLT5oc2NiLT5zZ3B0cik7CisJaWYgKChzZ3B0ciAmIFNHX1NUQVRVU19WQUxJRCkgIT0gMCkKKwkJYWhkX2NhbGNfcmVzaWR1YWwoYWhkLCBzY2IpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorYWhkX2NvbXBsZXRlX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwl1aW50MzJfdCBzZ3B0cjsKKworCXNncHRyID0gYWhkX2xlMzJ0b2goc2NiLT5oc2NiLT5zZ3B0cik7CisJaWYgKChzZ3B0ciAmIFNHX1NUQVRVU19WQUxJRCkgIT0gMCkKKwkJYWhkX2hhbmRsZV9zY2Jfc3RhdHVzKGFoZCwgc2NiKTsKKwllbHNlCisJCWFoZF9kb25lKGFoZCwgc2NiKTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBTZXF1ZW5jZXIgRXhlY3V0aW9uIENvbnRyb2wgKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIFJlc3RhcnQgdGhlIHNlcXVlbmNlciBwcm9ncmFtIGZyb20gYWRkcmVzcyB6ZXJvCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfcmVzdGFydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7CiAKQEAgLTM0Miw3ICszOTgsNyBAQAogCWFoZF91bnBhdXNlKGFoZCk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfY2xlYXJfZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGZpZm8pCiB7CiAJYWhkX21vZGVfc3RhdGUJIHNhdmVkX21vZGVzOwpAQCAtMzY2LDcgKzQyMiw3IEBACiAgKiBGbHVzaCBhbmQgY29tcGxldGVkIGNvbW1hbmRzIHRoYXQgYXJlIHNpdHRpbmcgaW4gdGhlIGNvbW1hbmQKICAqIGNvbXBsZXRlIHF1ZXVlcyBkb3duIG9uIHRoZSBjaGlwIGJ1dCBoYXZlIHlldCB0byBiZSBkbWEnZWQgYmFjayB1cC4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9mbHVzaF9xb3V0ZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7CiAJc3RydWN0CQlzY2IgKnNjYjsKQEAgLTkwNSw2ICs5NjEsNTEgQEAKIAlhaGRfZnJlZShhaGQpOwogfQogCisjaWZkZWYgQUhEX0RFQlVHCitzdGF0aWMgdm9pZAorYWhkX2R1bXBfc2dsaXN0KHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpbnQgaTsKKworCWlmIChzY2ItPnNnX2NvdW50ID4gMCkgeworCQlpZiAoKHNjYi0+YWhkX3NvZnRjLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCQlzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqc2dfbGlzdDsKKworCQkJc2dfbGlzdCA9IChzdHJ1Y3QgYWhkX2RtYTY0X3NlZyopc2NiLT5zZ19saXN0OworCQkJZm9yIChpID0gMDsgaSA8IHNjYi0+c2dfY291bnQ7IGkrKykgeworCQkJCXVpbnQ2NF90IGFkZHI7CisJCQkJdWludDMyX3QgbGVuOworCisJCQkJYWRkciA9IGFoZF9sZTY0dG9oKHNnX2xpc3RbaV0uYWRkcik7CisJCQkJbGVuID0gYWhkX2xlMzJ0b2goc2dfbGlzdFtpXS5sZW4pOworCQkJCXByaW50Zigic2dbJWRdIC0gQWRkciAweCV4JXggOiBMZW5ndGggJWQlc1xuIiwKKwkJCQkgICAgICAgaSwKKwkJCQkgICAgICAgKHVpbnQzMl90KSgoYWRkciA+PiAzMikgJiAweEZGRkZGRkZGKSwKKwkJCQkgICAgICAgKHVpbnQzMl90KShhZGRyICYgMHhGRkZGRkZGRiksCisJCQkJICAgICAgIHNnX2xpc3RbaV0ubGVuICYgQUhEX1NHX0xFTl9NQVNLLAorCQkJCSAgICAgICAoc2dfbGlzdFtpXS5sZW4gJiBBSERfRE1BX0xBU1RfU0VHKQorCQkJCSAgICAgPyAiIExhc3QiIDogIiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RydWN0IGFoZF9kbWFfc2VnICpzZ19saXN0OworCisJCQlzZ19saXN0ID0gKHN0cnVjdCBhaGRfZG1hX3NlZyopc2NiLT5zZ19saXN0OworCQkJZm9yIChpID0gMDsgaSA8IHNjYi0+c2dfY291bnQ7IGkrKykgeworCQkJCXVpbnQzMl90IGxlbjsKKworCQkJCWxlbiA9IGFoZF9sZTMydG9oKHNnX2xpc3RbaV0ubGVuKTsKKwkJCQlwcmludGYoInNnWyVkXSAtIEFkZHIgMHgleCV4IDogTGVuZ3RoICVkJXNcbiIsCisJCQkJICAgICAgIGksCisJCQkJICAgICAgIChsZW4gJiBBSERfU0dfSElHSF9BRERSX01BU0spID4+IDI0LAorCQkJCSAgICAgICBhaGRfbGUzMnRvaChzZ19saXN0W2ldLmFkZHIpLAorCQkJCSAgICAgICBsZW4gJiBBSERfU0dfTEVOX01BU0ssCisJCQkJICAgICAgIGxlbiAmIEFIRF9ETUFfTEFTVF9TRUcgPyAiIExhc3QiIDogIiIpOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmICAvKiAgQUhEX0RFQlVHICAqLworCiB2b2lkCiBhaGRfaGFuZGxlX3NlcWludChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGludHN0YXQpCiB7CkBAIC0xMDUzLDEwICsxMTU0LDEyIEBACiAJCQkgKiBJZiBhIHRhcmdldCB0YWtlcyB1cyBpbnRvIHRoZSBjb21tYW5kIHBoYXNlCiAJCQkgKiBhc3N1bWUgdGhhdCBpdCBoYXMgYmVlbiBleHRlcm5hbGx5IHJlc2V0IGFuZAogCQkJICogaGFzIHRodXMgbG9zdCBvdXIgcHJldmlvdXMgcGFja2V0aXplZCBuZWdvdGlhdGlvbgotCQkJICogYWdyZWVtZW50LgotCQkJICogUmV2ZXJ0IHRvIGFzeW5jL25hcnJvdyB0cmFuc2ZlcnMgdW50aWwgd2UKLQkJCSAqIGNhbiByZW5lZ290aWF0ZSB3aXRoIHRoZSBkZXZpY2UgYW5kIG5vdGlmeQotCQkJICogdGhlIE9TTSBhYm91dCB0aGUgcmVzZXQuCisJCQkgKiBhZ3JlZW1lbnQuICBTaW5jZSB3ZSBoYXZlIG5vdCBzZW50IGFuIGlkZW50aWZ5CisJCQkgKiBtZXNzYWdlIGFuZCBtYXkgbm90IGhhdmUgZnVsbHkgcXVhbGlmaWVkIHRoZQorCQkJICogY29ubmVjdGlvbiwgd2UgY2hhbmdlIG91ciBjb21tYW5kIHRvIFRVUiwgYXNzZXJ0CisJCQkgKiBBVE4gYW5kIEFCT1JUIHRoZSB0YXNrIHdoZW4gd2UgZ28gdG8gbWVzc2FnZSBpbgorCQkJICogcGhhc2UuICBUaGUgT1NNIHdpbGwgc2VlIHRoZSBSRVFVRVVFX1JFUVVFU1QKKwkJCSAqIHN0YXR1cyBhbmQgcmV0cnkgdGhlIGNvbW1hbmQuCiAJCQkgKi8KIAkJCXNjYmlkID0gYWhkX2dldF9zY2JwdHIoYWhkKTsKIAkJCXNjYiA9IGFoZF9sb29rdXBfc2NiKGFoZCwgc2NiaWQpOwpAQCAtMTA4Myw3ICsxMTg2LDI4IEBACiAJCQlhaGRfc2V0X3N5bmNyYXRlKGFoZCwgJmRldmluZm8sIC8qcGVyaW9kKi8wLAogCQkJCQkgLypvZmZzZXQqLzAsIC8qcHByX29wdGlvbnMqLzAsCiAJCQkJCSBBSERfVFJBTlNfQUNUSVZFLCAvKnBhdXNlZCovVFJVRSk7Ci0JCQlzY2ItPmZsYWdzIHw9IFNDQl9FWFRFUk5BTF9SRVNFVDsKKwkJCS8qIEhhbmQtY3JhZnQgVFVSIGNvbW1hbmQgKi8KKwkJCWFoZF9vdXRiKGFoZCwgU0NCX0NEQl9TVE9SRSwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DREJfU1RPUkUrMSwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DREJfU1RPUkUrMiwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DREJfU1RPUkUrMywgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DREJfU1RPUkUrNCwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DREJfU1RPUkUrNSwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNDQl9DREJfTEVOLCA2KTsKKwkJCXNjYi0+aHNjYi0+Y29udHJvbCAmPSB+KFRBR19FTkJ8U0NCX1RBR19UWVBFKTsKKwkJCXNjYi0+aHNjYi0+Y29udHJvbCB8PSBNS19NRVNTQUdFOworCQkJYWhkX291dGIoYWhkLCBTQ0JfQ09OVFJPTCwgc2NiLT5oc2NiLT5jb250cm9sKTsKKwkJCWFoZF9vdXRiKGFoZCwgTVNHX09VVCwgSE9TVF9NU0cpOworCQkJYWhkX291dGIoYWhkLCBTQVZFRF9TQ1NJSUQsIHNjYi0+aHNjYi0+c2NzaWlkKTsKKwkJCS8qCisJCQkgKiBUaGUgbHVuIGlzIDAsIHJlZ2FyZGxlc3Mgb2YgdGhlIFNDQidzIGx1bgorCQkJICogYXMgd2UgaGF2ZSBub3Qgc2VudCBhbiBpZGVudGlmeSBtZXNzYWdlLgorCQkJICovCisJCQlhaGRfb3V0YihhaGQsIFNBVkVEX0xVTiwgMCk7CisJCQlhaGRfb3V0YihhaGQsIFNFUV9GTEFHUywgMCk7CisJCQlhaGRfYXNzZXJ0X2F0bihhaGQpOworCQkJc2NiLT5mbGFncyAmPSB+U0NCX1BBQ0tFVElaRUQ7CisJCQlzY2ItPmZsYWdzIHw9IFNDQl9BQk9SVHxTQ0JfRVhURVJOQUxfUkVTRVQ7CiAJCQlhaGRfZnJlZXplX2RldnEoYWhkLCBzY2IpOwogCQkJYWhkX3NldF90cmFuc2FjdGlvbl9zdGF0dXMoc2NiLCBDQU1fUkVRVUVVRV9SRVEpOwogCQkJYWhkX2ZyZWV6ZV9zY2Ioc2NiKTsKQEAgLTE1MTksOCArMTY0MywxMCBAQAogCS8qCiAJICogSWdub3JlIGV4dGVybmFsIHJlc2V0cyBhZnRlciBhIGJ1cyByZXNldC4KIAkgKi8KLQlpZiAoKChzdGF0dXMgJiBTQ1NJUlNUSSkgIT0gMCkgJiYgKGFoZC0+ZmxhZ3MgJiBBSERfQlVTX1JFU0VUX0FDVElWRSkpCisJaWYgKCgoc3RhdHVzICYgU0NTSVJTVEkpICE9IDApICYmIChhaGQtPmZsYWdzICYgQUhEX0JVU19SRVNFVF9BQ1RJVkUpKSB7CisJCWFoZF9vdXRiKGFoZCwgQ0xSU0lOVDEsIENMUlNDU0lSU1RJKTsKIAkJcmV0dXJuOworCX0KIAogCS8qCiAJICogQ2xlYXIgYnVzIHJlc2V0IGZsYWcKQEAgLTIyMDAsNiArMjMyNiwyMiBAQAogCQkJaWYgKHNlbnRfbXNnID09IE1TR19BQk9SVF9UQUcpCiAJCQkJdGFnID0gU0NCX0dFVF9UQUcoc2NiKTsKIAorCQkJaWYgKChzY2ItPmZsYWdzICYgU0NCX0VYVEVSTkFMX1JFU0VUKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGFib3J0IGlzIGluIHJlc3BvbnNlIHRvIGFuCisJCQkJICogdW5leHBlY3RlZCBzd2l0Y2ggdG8gY29tbWFuZCBwaGFzZQorCQkJCSAqIGZvciBhIHBhY2tldGl6ZWQgY29ubmVjdGlvbi4gIFNpbmNlCisJCQkJICogdGhlIGlkZW50aWZ5IG1lc3NhZ2Ugd2FzIG5ldmVyIHNlbnQsCisJCQkJICogInNhdmVkIGx1biIgaXMgMC4gIFdlIHJlYWxseSB3YW50IHRvCisJCQkJICogYWJvcnQgb25seSB0aGUgU0NCIHRoYXQgZW5jb3VudGVyZWQKKwkJCQkgKiB0aGlzIGVycm9yLCB3aGljaCBjb3VsZCBoYXZlIGEgZGlmZmVyZW50CisJCQkJICogbHVuLiAgVGhlIFNDQiB3aWxsIGJlIHJldHJpZWQgc28gdGhlIE9TCisJCQkJICogd2lsbCBzZWUgdGhlIFVBIGFmdGVyIHJlbmVnb3RpYXRpbmcgdG8KKwkJCQkgKiBwYWNrZXRpemVkLgorCQkJCSAqLworCQkJCXRhZyA9IFNDQl9HRVRfVEFHKHNjYik7CisJCQkJc2F2ZWRfbHVuID0gc2NiLT5oc2NiLT5sdW47CisJCQl9CiAJCQlmb3VuZCA9IGFoZF9hYm9ydF9zY2JzKGFoZCwgdGFyZ2V0LCAnQScsIHNhdmVkX2x1biwKIAkJCQkJICAgICAgIHRhZywgUk9MRV9JTklUSUFUT1IsCiAJCQkJCSAgICAgICBDQU1fUkVRX0FCT1JURUQpOwpAQCAtMjUyMyw3ICsyNjY1LDcgQEAKIH0KIAogI2RlZmluZSBBSERfTUFYX1NURVBTIDIwMDAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfY2xlYXJfY3JpdGljYWxfc2VjdGlvbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7CiAJYWhkX21vZGVfc3RhdGUJc2F2ZWRfbW9kZXM7CkBAIC0yNjQ2LDcgKzI3ODgsNyBAQAogLyoKICAqIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdCBzdGF0dXMuCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfY2xlYXJfaW50c3RhdChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7CiAJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCkBAIC0yNjc3LDYgKzI4MTksOCBAQAogI2lmZGVmIEFIRF9ERUJVRwogdWludDMyX3QgYWhkX2RlYnVnID0gQUhEX0RFQlVHX09QVFM7CiAjZW5kaWYKKworI2lmIDAKIHZvaWQKIGFoZF9wcmludF9zY2Ioc3RydWN0IHNjYiAqc2NiKQogewpAQCAtMjcwMSw0OSArMjg0NSw3IEBACiAJICAgICAgIFNDQl9HRVRfVEFHKHNjYikpOwogCWFoZF9kdW1wX3NnbGlzdChzY2IpOwogfQotCi12b2lkCi1haGRfZHVtcF9zZ2xpc3Qoc3RydWN0IHNjYiAqc2NiKQotewotCWludCBpOwotCi0JaWYgKHNjYi0+c2dfY291bnQgPiAwKSB7Ci0JCWlmICgoc2NiLT5haGRfc29mdGMtPmZsYWdzICYgQUhEXzY0QklUX0FERFJFU1NJTkcpICE9IDApIHsKLQkJCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZ19saXN0OwotCi0JCQlzZ19saXN0ID0gKHN0cnVjdCBhaGRfZG1hNjRfc2VnKilzY2ItPnNnX2xpc3Q7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7Ci0JCQkJdWludDY0X3QgYWRkcjsKLQkJCQl1aW50MzJfdCBsZW47Ci0KLQkJCQlhZGRyID0gYWhkX2xlNjR0b2goc2dfbGlzdFtpXS5hZGRyKTsKLQkJCQlsZW4gPSBhaGRfbGUzMnRvaChzZ19saXN0W2ldLmxlbik7Ci0JCQkJcHJpbnRmKCJzZ1slZF0gLSBBZGRyIDB4JXgleCA6IExlbmd0aCAlZCVzXG4iLAotCQkJCSAgICAgICBpLAotCQkJCSAgICAgICAodWludDMyX3QpKChhZGRyID4+IDMyKSAmIDB4RkZGRkZGRkYpLAotCQkJCSAgICAgICAodWludDMyX3QpKGFkZHIgJiAweEZGRkZGRkZGKSwKLQkJCQkgICAgICAgc2dfbGlzdFtpXS5sZW4gJiBBSERfU0dfTEVOX01BU0ssCi0JCQkJICAgICAgIChzZ19saXN0W2ldLmxlbiAmIEFIRF9ETUFfTEFTVF9TRUcpCi0JCQkJICAgICA/ICIgTGFzdCIgOiAiIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgYWhkX2RtYV9zZWcgKnNnX2xpc3Q7Ci0KLQkJCXNnX2xpc3QgPSAoc3RydWN0IGFoZF9kbWFfc2VnKilzY2ItPnNnX2xpc3Q7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2NiLT5zZ19jb3VudDsgaSsrKSB7Ci0JCQkJdWludDMyX3QgbGVuOwotCi0JCQkJbGVuID0gYWhkX2xlMzJ0b2goc2dfbGlzdFtpXS5sZW4pOwotCQkJCXByaW50Zigic2dbJWRdIC0gQWRkciAweCV4JXggOiBMZW5ndGggJWQlc1xuIiwKLQkJCQkgICAgICAgaSwKLQkJCQkgICAgICAgKGxlbiAmIEFIRF9TR19ISUdIX0FERFJfTUFTSykgPj4gMjQsCi0JCQkJICAgICAgIGFoZF9sZTMydG9oKHNnX2xpc3RbaV0uYWRkciksCi0JCQkJICAgICAgIGxlbiAmIEFIRF9TR19MRU5fTUFTSywKLQkJCQkgICAgICAgbGVuICYgQUhEX0RNQV9MQVNUX1NFRyA/ICIgTGFzdCIgOiAiIik7Ci0JCQl9Ci0JCX0KLQl9Ci19CisjZW5kaWYgIC8qICAwICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBUcmFuc2ZlciBOZWdvdGlhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTI4NTAsMTQgKzI5NTIsMTQgQEAKIAkJdHJhbnNpbmZvID0gJnRpbmZvLT5nb2FsOwogCSpwcHJfb3B0aW9ucyAmPSAodHJhbnNpbmZvLT5wcHJfb3B0aW9uc3xNU0dfRVhUX1BQUl9QQ09NUF9FTik7CiAJaWYgKHRyYW5zaW5mby0+d2lkdGggPT0gTVNHX0VYVF9XRFRSX0JVU184X0JJVCkgewotCQltYXhzeW5jID0gTUFYKG1heHN5bmMsIEFIRF9TWU5DUkFURV9VTFRSQTIpOworCQltYXhzeW5jID0gbWF4KG1heHN5bmMsICh1X2ludClBSERfU1lOQ1JBVEVfVUxUUkEyKTsKIAkJKnBwcl9vcHRpb25zICY9IH5NU0dfRVhUX1BQUl9EVF9SRVE7CiAJfQogCWlmICh0cmFuc2luZm8tPnBlcmlvZCA9PSAwKSB7CiAJCSpwZXJpb2QgPSAwOwogCQkqcHByX29wdGlvbnMgPSAwOwogCX0gZWxzZSB7Ci0JCSpwZXJpb2QgPSBNQVgoKnBlcmlvZCwgdHJhbnNpbmZvLT5wZXJpb2QpOworCQkqcGVyaW9kID0gbWF4KCpwZXJpb2QsICh1X2ludCl0cmFuc2luZm8tPnBlcmlvZCk7CiAJCWFoZF9maW5kX3N5bmNyYXRlKGFoZCwgcGVyaW9kLCBwcHJfb3B0aW9ucywgbWF4c3luYyk7CiAJfQogfQpAQCAtMjkwNiw3ICszMDA4LDcgQEAKICAqIFRydW5jYXRlIHRoZSBnaXZlbiBzeW5jaHJvbm91cyBvZmZzZXQgdG8gYSB2YWx1ZSB0aGUKICAqIGN1cnJlbnQgYWRhcHRlciB0eXBlIGFuZCBzeW5jcmF0ZSBhcmUgY2FwYWJsZSBvZi4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIGFoZF92YWxpZGF0ZV9vZmZzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkgICAgc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKnRpbmZvLAogCQkgICAgdV9pbnQgcGVyaW9kLCB1X2ludCAqb2Zmc2V0LCBpbnQgd2lkZSwKQEAgLTI5MjQsMTIgKzMwMjYsMTIgQEAKIAkJCW1heG9mZnNldCA9IE1BWF9PRkZTRVRfUEFDRUQ7CiAJfSBlbHNlCiAJCW1heG9mZnNldCA9IE1BWF9PRkZTRVRfTk9OX1BBQ0VEOwotCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgbWF4b2Zmc2V0KTsKKwkqb2Zmc2V0ID0gbWluKCpvZmZzZXQsIG1heG9mZnNldCk7CiAJaWYgKHRpbmZvICE9IE5VTEwpIHsKIAkJaWYgKHJvbGUgPT0gUk9MRV9UQVJHRVQpCi0JCQkqb2Zmc2V0ID0gTUlOKCpvZmZzZXQsIHRpbmZvLT51c2VyLm9mZnNldCk7CisJCQkqb2Zmc2V0ID0gbWluKCpvZmZzZXQsICh1X2ludCl0aW5mby0+dXNlci5vZmZzZXQpOwogCQllbHNlCi0JCQkqb2Zmc2V0ID0gTUlOKCpvZmZzZXQsIHRpbmZvLT5nb2FsLm9mZnNldCk7CisJCQkqb2Zmc2V0ID0gbWluKCpvZmZzZXQsICh1X2ludCl0aW5mby0+Z29hbC5vZmZzZXQpOwogCX0KIH0KIApAQCAtMjkzNyw3ICszMDM5LDcgQEAKICAqIFRydW5jYXRlIHRoZSBnaXZlbiB0cmFuc2ZlciB3aWR0aCBwYXJhbWV0ZXIgdG8gYSB2YWx1ZSB0aGUKICAqIGN1cnJlbnQgYWRhcHRlciB0eXBlIGlzIGNhcGFibGUgb2YuCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfdmFsaWRhdGVfd2lkdGgoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqdGluZm8sCiAJCSAgIHVfaW50ICpidXNfd2lkdGgsIHJvbGVfdCByb2xlKQogewpAQCAtMjk1NSw5ICszMDU3LDkgQEAKIAl9CiAJaWYgKHRpbmZvICE9IE5VTEwpIHsKIAkJaWYgKHJvbGUgPT0gUk9MRV9UQVJHRVQpCi0JCQkqYnVzX3dpZHRoID0gTUlOKHRpbmZvLT51c2VyLndpZHRoLCAqYnVzX3dpZHRoKTsKKwkJCSpidXNfd2lkdGggPSBtaW4oKHVfaW50KXRpbmZvLT51c2VyLndpZHRoLCAqYnVzX3dpZHRoKTsKIAkJZWxzZQotCQkJKmJ1c193aWR0aCA9IE1JTih0aW5mby0+Z29hbC53aWR0aCwgKmJ1c193aWR0aCk7CisJCQkqYnVzX3dpZHRoID0gbWluKCh1X2ludCl0aW5mby0+Z29hbC53aWR0aCwgKmJ1c193aWR0aCk7CiAJfQogfQogCkBAIC0zMjEwLDcgKzMzMTIsNyBAQAogLyoKICAqIFVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0YWdnZWQgcXVldWluZyBmb3IgYSBnaXZlbiB0YXJnZXQuCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfc2V0X3RhZ3Moc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCiAJICAgICBzdHJ1Y3QgYWhkX2RldmluZm8gKmRldmluZm8sIGFoZF9xdWV1ZV9hbGcgYWxnKQogewpAQCAtMzQ2Niw3ICszNTY4LDcgQEAKIAkgICAgICAgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwogfQogCi1zdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5Kgorc3RhdGljIHN0cnVjdCBhaGRfcGhhc2VfdGFibGVfZW50cnkqCiBhaGRfbG9va3VwX3BoYXNlX2VudHJ5KGludCBwaGFzZSkKIHsKIAlzdHJ1Y3QgYWhkX3BoYXNlX3RhYmxlX2VudHJ5ICplbnRyeTsKQEAgLTUzNTEsNyArNTQ1Myw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX3NodXRkb3duKHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QJYWhkX3NvZnRjICphaGQ7CkBAIC01NDgwLDcgKzU1ODIsNyBAQAogLyoKICAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIFNDQnMgYXZhaWxhYmxlIG9uIHRoZSBjb250cm9sbGVyCiAgKi8KLWludAorc3RhdGljIGludAogYWhkX3Byb2JlX3NjYnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKSB7CiAJaW50IGk7CiAKQEAgLTU5MjksNyArNjAzMSw3IEBACiAJYWhkX3BsYXRmb3JtX3NjYl9mcmVlKGFoZCwgc2NiKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9hbGxvY19zY2JzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKIAlzdHJ1Y3Qgc2NiX2RhdGEgKnNjYl9kYXRhOwpAQCAtNjA1Nyw5ICs2MTU5LDkgQEAKICNlbmRpZgogCX0KIAotCW5ld2NvdW50ID0gTUlOKHNjYl9kYXRhLT5zZW5zZV9sZWZ0LCBzY2JfZGF0YS0+c2Nic19sZWZ0KTsKLQluZXdjb3VudCA9IE1JTihuZXdjb3VudCwgc2NiX2RhdGEtPnNnc19sZWZ0KTsKLQluZXdjb3VudCA9IE1JTihuZXdjb3VudCwgKEFIRF9TQ0JfTUFYX0FMTE9DIC0gc2NiX2RhdGEtPm51bXNjYnMpKTsKKwluZXdjb3VudCA9IG1pbihzY2JfZGF0YS0+c2Vuc2VfbGVmdCwgc2NiX2RhdGEtPnNjYnNfbGVmdCk7CisJbmV3Y291bnQgPSBtaW4obmV3Y291bnQsIHNjYl9kYXRhLT5zZ3NfbGVmdCk7CisJbmV3Y291bnQgPSBtaW4obmV3Y291bnQsIChBSERfU0NCX01BWF9BTExPQyAtIHNjYl9kYXRhLT5udW1zY2JzKSk7CiAJZm9yIChpID0gMDsgaSA8IG5ld2NvdW50OyBpKyspIHsKIAkJc3RydWN0IHNjYl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAkJdV9pbnQgY29sX3RhZzsKQEAgLTY5ODIsNyArNzA4NCw3IEBACiAJYWhkX291dGIoYWhkLCBIQ05UUkwsIGhjbnRybCk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfdXBkYXRlX2NvYWxlc2NpbmdfdmFsdWVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGltZXIsIHVfaW50IG1heGNtZHMsCiAJCQkgICAgIHVfaW50IG1pbmNtZHMpCiB7CkBAIC03MDAwLDcgKzcxMDIsNyBAQAogCWFoZF9vdXRiKGFoZCwgSU5UX0NPQUxFU0NJTkdfTUlOQ01EUywgLW1pbmNtZHMpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX2VuYWJsZV9jb2FsZXNjaW5nKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IGVuYWJsZSkKIHsKIApAQCAtNzA3MCw2ICs3MTcyLDcgQEAKIAlhaGQtPmZsYWdzICY9IH5BSERfQUxMX0lOVEVSUlVQVFM7CiB9CiAKKyNpZiAwCiBpbnQKIGFoZF9zdXNwZW5kKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKQEAgLTcwODMsNyArNzE4Niw5IEBACiAJYWhkX3NodXRkb3duKGFoZCk7CiAJcmV0dXJuICgwKTsKIH0KKyNlbmRpZiAgLyogIDAgICovCiAKKyNpZiAwCiBpbnQKIGFoZF9yZXN1bWUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewpAQCAtNzA5Myw2ICs3MTk4LDcgQEAKIAlhaGRfcmVzdGFydChhaGQpOwogCXJldHVybiAoMCk7CiB9CisjZW5kaWYgIC8qICAwICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogQnVzeSBUYXJnZXQgVGFibGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTcxMjUsNyArNzIzMSw3IEBACiAvKgogICogUmV0dXJuIHRoZSB1bnRhZ2dlZCB0cmFuc2FjdGlvbiBpZCBmb3IgYSBnaXZlbiB0YXJnZXQvY2hhbm5lbCBsdW4uCiAgKi8KLXVfaW50CitzdGF0aWMgdV9pbnQKIGFoZF9maW5kX2J1c3lfdGNsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGNsKQogewogCXVfaW50IHNjYmlkOwpAQCAtNzEzOCw3ICs3MjQ0LDcgQEAKIAlyZXR1cm4gKHNjYmlkKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9idXN5X3RjbChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRjbCwgdV9pbnQgc2NiaWQpCiB7CiAJdV9pbnQgc2NiX29mZnNldDsKQEAgLTcxODYsNyArNzI5Miw3IEBACiAJcmV0dXJuIG1hdGNoOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX2ZyZWV6ZV9kZXZxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQogewogCWludAl0YXJnZXQ7CkBAIC03NjkwLDcgKzc3OTYsNyBAQAogICogYmVlbiBtb2RpZmllZCBmcm9tIENBTV9SRVFfSU5QUk9HLiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgc2VxdWVuY2VyCiAgKiBpcyBwYXVzZWQgYmVmb3JlIGl0IGlzIGNhbGxlZC4KICAqLwotaW50CitzdGF0aWMgaW50CiBhaGRfYWJvcnRfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCB0YXJnZXQsIGNoYXIgY2hhbm5lbCwKIAkgICAgICAgaW50IGx1biwgdV9pbnQgdGFnLCByb2xlX3Qgcm9sZSwgdWludDMyX3Qgc3RhdHVzKQogewpAQCAtNzkyMCw2ICs4MDI2LDExIEBACiAJYWhkX2NsZWFyX2ZpZm8oYWhkLCAxKTsKIAogCS8qCisJICogQ2xlYXIgU0NTSSBpbnRlcnJ1cHQgc3RhdHVzCisJICovCisJYWhkX291dGIoYWhkLCBDTFJTSU5UMSwgQ0xSU0NTSVJTVEkpOworCisJLyoKIAkgKiBSZWVuYWJsZSBzZWxlY3Rpb25zCiAJICovCiAJYWhkX291dGIoYWhkLCBTSU1PREUxLCBhaGRfaW5iKGFoZCwgU0lNT0RFMSkgfCBFTlNDU0lSU1QpOwpAQCAtNzk1MiwxMCArODA2Myw2IEBACiAJCX0KIAl9CiAjZW5kaWYKLQkvKiBOb3RpZnkgdGhlIFhQVCB0aGF0IGEgYnVzIHJlc2V0IG9jY3VycmVkICovCi0JYWhkX3NlbmRfYXN5bmMoYWhkLCBkZXZpbmZvLmNoYW5uZWwsIENBTV9UQVJHRVRfV0lMRENBUkQsCi0JCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19CVVNfUkVTRVQpOwotCiAJLyoKIAkgKiBSZXZlcnQgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyB1bnRpbCB3ZSByZW5lZ290aWF0ZS4KIAkgKi8KQEAgLTc5NzcsNiArODA4NCwxMCBAQAogCQl9CiAJfQogCisJLyogTm90aWZ5IHRoZSBYUFQgdGhhdCBhIGJ1cyByZXNldCBvY2N1cnJlZCAqLworCWFoZF9zZW5kX2FzeW5jKGFoZCwgZGV2aW5mby5jaGFubmVsLCBDQU1fVEFSR0VUX1dJTERDQVJELAorCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfQlVTX1JFU0VUKTsKKwogCWFoZF9yZXN0YXJ0KGFoZCk7CiAKIAlyZXR1cm4gKGZvdW5kKTsKQEAgLTgwMTksMTggKzgxMzAsOCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFN0YXR1cyBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotYWhkX2hhbmRsZV9zY2Jfc3RhdHVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQotewotCWlmIChzY2ItPmhzY2ItPnNoYXJlZF9kYXRhLmlzdGF0dXMuc2NzaV9zdGF0dXMgIT0gMCkgewotCQlhaGRfaGFuZGxlX3Njc2lfc3RhdHVzKGFoZCwgc2NiKTsKLQl9IGVsc2UgewotCQlhaGRfY2FsY19yZXNpZHVhbChhaGQsIHNjYik7Ci0JCWFoZF9kb25lKGFoZCwgc2NiKTsKLQl9Ci19CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfaGFuZGxlX3Njc2lfc3RhdHVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQogewogCXN0cnVjdAloYXJkd2FyZV9zY2IgKmhzY2I7CkBAIC04MjM4LDEwICs4MzM5LDIxIEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorYWhkX2hhbmRsZV9zY2Jfc3RhdHVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQoreworCWlmIChzY2ItPmhzY2ItPnNoYXJlZF9kYXRhLmlzdGF0dXMuc2NzaV9zdGF0dXMgIT0gMCkgeworCQlhaGRfaGFuZGxlX3Njc2lfc3RhdHVzKGFoZCwgc2NiKTsKKwl9IGVsc2UgeworCQlhaGRfY2FsY19yZXNpZHVhbChhaGQsIHNjYik7CisJCWFoZF9kb25lKGFoZCwgc2NiKTsKKwl9Cit9CisKIC8qCiAgKiBDYWxjdWxhdGUgdGhlIHJlc2lkdWFsIGZvciBhIGp1c3QgY29tcGxldGVkIFNDQi4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIGFoZF9jYWxjX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQogewogCXN0cnVjdCBoYXJkd2FyZV9zY2IgKmhzY2I7CkBAIC04NjY4LDcgKzg3ODAsNyBAQAogCQlpZiAoc2tpcF9hZGRyID4gaSkgewogCQkJaW50IGVuZF9hZGRyOwogCi0JCQllbmRfYWRkciA9IE1JTihhZGRyZXNzLCBza2lwX2FkZHIpOworCQkJZW5kX2FkZHIgPSBtaW4oYWRkcmVzcywgc2tpcF9hZGRyKTsKIAkJCWFkZHJlc3Nfb2Zmc2V0ICs9IGVuZF9hZGRyIC0gaTsKIAkJCWkgPSBza2lwX2FkZHI7CiAJCX0gZWxzZSB7CkBAIC05MDkyLDYgKzkyMDQsNyBAQAogCQlhaGRfdW5wYXVzZShhaGQpOwogfQogCisjaWYgMAogdm9pZAogYWhkX2R1bXBfc2NicyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCiB7CkBAIC05MTE3LDYgKzkyMzAsNyBAQAogCWFoZF9zZXRfc2NicHRyKGFoZCwgc2F2ZWRfc2NiX2luZGV4KTsKIAlhaGRfcmVzdG9yZV9tb2RlcyhhaGQsIHNhdmVkX21vZGVzKTsKIH0KKyNlbmRpZiAgLyogIDAgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZsZXhwb3J0IExvZ2ljICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtOTIxOSw3ICs5MzMzLDcgQEAKIC8qCiAgKiBXYWl0IH4xMDB1cyBmb3IgdGhlIHNlcmlhbCBlZXByb20gdG8gc2F0aXNmeSBvdXIgcmVxdWVzdC4KICAqLwotaW50CitzdGF0aWMgaW50CiBhaGRfd2FpdF9zZWVwcm9tKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKIHsKIAlpbnQgY250OwpAQCAtOTIzNyw3ICs5MzUxLDcgQEAKICAqIFZhbGlkYXRlIHRoZSB0d28gY2hlY2tzdW1zIGluIHRoZSBwZXJfY2hhbm5lbAogICogdml0YWwgcHJvZHVjdCBkYXRhIHN0cnVjdC4KICAqLwotaW50CitzdGF0aWMgaW50CiBhaGRfdmVyaWZ5X3ZwZF9ja3N1bShzdHJ1Y3QgdnBkX2NvbmZpZyAqdnBkKQogewogCWludCBpOwpAQCAtOTMxNiw2ICs5NDMwLDI0IEBACiAJLyogQ3VycmVudGx5IGEgbm8tb3AgKi8KIH0KIAorLyoKKyAqIFdhaXQgYXQgbW9zdCAyIHNlY29uZHMgZm9yIGZsZXhwb3J0IGFyYml0cmF0aW9uIHRvIHN1Y2NlZWQuCisgKi8KK3N0YXRpYyBpbnQKK2FoZF93YWl0X2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlpbnQgY250OworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX1NDU0lfTVNLLCBBSERfTU9ERV9TQ1NJX01TSyk7CisJY250ID0gMTAwMDAwMCAqIDIgLyA1OworCXdoaWxlICgoYWhkX2luYihhaGQsIEJSRENUTCkgJiBGTFhBUkJBQ0spID09IDAgJiYgLS1jbnQpCisJCWFoZF9kZWxheSg1KTsKKworCWlmIChjbnQgPT0gMCkKKwkJcmV0dXJuIChFVElNRURPVVQpOworCXJldHVybiAoMCk7Cit9CisKIGludAogYWhkX3dyaXRlX2ZsZXhwb3J0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgYWRkciwgdV9pbnQgdmFsdWUpCiB7CkBAIC05MzU3LDI0ICs5NDg5LDYgQEAKIAlyZXR1cm4gKDApOwogfQogCi0vKgotICogV2FpdCBhdCBtb3N0IDIgc2Vjb25kcyBmb3IgZmxleHBvcnQgYXJiaXRyYXRpb24gdG8gc3VjY2VlZC4KLSAqLwotaW50Ci1haGRfd2FpdF9mbGV4cG9ydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JaW50IGNudDsKLQotCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9TQ1NJX01TSywgQUhEX01PREVfU0NTSV9NU0spOwotCWNudCA9IDEwMDAwMDAgKiAyIC8gNTsKLQl3aGlsZSAoKGFoZF9pbmIoYWhkLCBCUkRDVEwpICYgRkxYQVJCQUNLKSA9PSAwICYmIC0tY250KQotCQlhaGRfZGVsYXkoNSk7Ci0KLQlpZiAoY250ID09IDApCi0JCXJldHVybiAoRVRJTUVET1VUKTsKLQlyZXR1cm4gKDApOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBUYXJnZXQgTW9kZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQogY2FtX3N0YXR1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgKaW5kZXggYTMyNjZlMC4uMmNlYjY3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9pbmxpbmUuaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X2lubGluZS5oCkBAIC00MTgsMTAgKzQxOCw2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiBNaXNjZWxhbmVvdXMgU3VwcG9ydCBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfY29tcGxldGVfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJIHN0cnVjdCBzY2IgKnNjYik7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJICAgIHN0cnVjdCBzY2IgKnNjYik7CiBzdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoZF9pbml0aWF0b3JfdGluZm8gKgogCQkJYWhkX2ZldGNoX3RyYW5zaW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCQkJCSAgICBjaGFyIGNoYW5uZWwsIHVfaW50IG91cl9pZCwKQEAgLTQ2NywzMiArNDYzLDYgQEAKIAkJCWFoZF9nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCQkJCSAgICAgIHN0cnVjdCBzY2IgKnNjYik7CiAKLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfY29tcGxldGVfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQotewotCXVpbnQzMl90IHNncHRyOwotCi0Jc2dwdHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsKLQlpZiAoKHNncHRyICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKQotCQlhaGRfaGFuZGxlX3NjYl9zdGF0dXMoYWhkLCBzY2IpOwotCWVsc2UKLQkJYWhkX2RvbmUoYWhkLCBzY2IpOwotfQotCi0vKgotICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlciByZXBvcnRlZCBhIHJlc2lkdWFsCi0gKiBmb3IgdGhpcyBTQ0IvdHJhbnNhY3Rpb24uCi0gKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiKQotewotCXVpbnQzMl90IHNncHRyOwotCi0Jc2dwdHIgPSBhaGRfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsKLQlpZiAoKHNncHRyICYgU0dfU1RBVFVTX1ZBTElEKSAhPSAwKQotCQlhaGRfY2FsY19yZXNpZHVhbChhaGQsIHNjYik7Ci19Ci0KIC8qCiAgKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIHRyYW5zZmVyIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uCiAgKiBmb3IgdGhlIHNwZWNpZmllZCBvdXJfaWQvcmVtb3RlX2lkIHBhaXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uYwppbmRleCBmOGU2MDQ4Li45YmZjY2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogICogZm9yY2UgYWxsIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9ucyB0byBiZSBzZXJ2aWNlZCBwcmlvciB0byBhIG5ldwogICogdHJhbnNhY3Rpb24uCiAgKi8KLXVpbnQzMl90IGFpYzc5eHhfcGVyaW9kaWNfb3RhZzsKK3N0YXRpYyB1aW50MzJfdCBhaWM3OXh4X3BlcmlvZGljX290YWc7CiAKIC8qIFNvbWUgc3RvcmFnZSBib3hlcyBhcmUgdXNpbmcgYW4gTFNJIGNoaXAgd2hpY2ggaGFzIGEgYnVnIG1ha2luZyBpdAogICogaW1wb3NzaWJsZSB0byB1c2UgYWljNzl4eCBSZXYgQiBjaGlwIGluIDMyMCBzcGVlZHMuICBUaGUgZm9sbG93aW5nCkBAIC03NzMsNiArNzczLDcgQEAKICNlbmRpZgogCS5jYW5fcXVldWUJCT0gQUhEX01BWF9RVUVVRSwKIAkudGhpc19pZAkJPSAtMSwKKwkubWF4X3NlY3RvcnMJCT0gODE5MiwKIAkuY21kX3Blcl9sdW4JCT0gMiwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCiAJLnNsYXZlX2FsbG9jCQk9IGFoZF9saW51eF9zbGF2ZV9hbGxvYywKQEAgLTE4MTMsOSArMTgxNCw5IEBACiAJCQl1X2ludCBzZW5zZV9vZmZzZXQ7CiAKIAkJCWlmIChzY2ItPmZsYWdzICYgU0NCX1NFTlNFKSB7Ci0JCQkJc2Vuc2Vfc2l6ZSA9IE1JTihzaXplb2Yoc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSkKKwkJCQlzZW5zZV9zaXplID0gbWluKHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKQogCQkJCQkgICAgICAgLSBhaGRfZ2V0X3NlbnNlX3Jlc2lkdWFsKHNjYiksCi0JCQkJCQkgc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKSk7CisJCQkJCQkgKHVfbG9uZylzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKIAkJCQlzZW5zZV9vZmZzZXQgPSAwOwogCQkJfSBlbHNlIHsKIAkJCQkvKgpAQCAtMTgyNCw3ICsxODI1LDggQEAKIAkJCQkgKi8KIAkJCQlzaXUgPSAoc3RydWN0IHNjc2lfc3RhdHVzX2l1X2hlYWRlciAqKQogCQkJCSAgICBzY2ItPnNlbnNlX2RhdGE7Ci0JCQkJc2Vuc2Vfc2l6ZSA9IE1JTihzY3NpXzRidG91bChzaXUtPnNlbnNlX2xlbmd0aCksCisJCQkJc2Vuc2Vfc2l6ZSA9IG1pbl90KHNpemVfdCwKKwkJCQkJCXNjc2lfNGJ0b3VsKHNpdS0+c2Vuc2VfbGVuZ3RoKSwKIAkJCQkJCXNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOwogCQkJCXNlbnNlX29mZnNldCA9IFNJVV9TRU5TRV9PRkZTRVQoc2l1KTsKIAkJCX0KQEAgLTI2MzQsOCArMjYzNiwyMiBAQAogCQkgICAgICAgcGNvbXAgPyAiRW5hYmxlIiA6ICJEaXNhYmxlIik7CiAjZW5kaWYKIAotCWlmIChwY29tcCkKKwlpZiAocGNvbXApIHsKKwkJdWludDhfdCBwcmVjb21wOworCisJCWlmIChhaGQtPnVuaXQgPCBBUlJBWV9TSVpFKGFpYzc5eHhfaW9jZWxsX2luZm8pKSB7CisJCQlzdHJ1Y3QgYWhkX2xpbnV4X2lvY2VsbF9vcHRzICppb2NlbGxfb3B0czsKKworCQkJaW9jZWxsX29wdHMgPSAmYWljNzl4eF9pb2NlbGxfaW5mb1thaGQtPnVuaXRdOworCQkJcHJlY29tcCA9IGlvY2VsbF9vcHRzLT5wcmVjb21wOworCQl9IGVsc2UgeworCQkJcHJlY29tcCA9IEFJQzc5WFhfREVGQVVMVF9QUkVDT01QOworCQl9CiAJCXBwcl9vcHRpb25zIHw9IE1TR19FWFRfUFBSX1BDT01QX0VOOworCQlBSERfU0VUX1BSRUNPTVAoYWhkLCBwcmVjb21wKTsKKwl9IGVsc2UgeworCQlBSERfU0VUX1BSRUNPTVAoYWhkLCAwKTsKKwl9CiAKIAlhaGRfY29tcGlsZV9kZXZpbmZvKCZkZXZpbmZvLCBzaG9zdC0+dGhpc19pZCwgc3RhcmdldC0+aWQsIDAsCiAJCQkgICAgc3RhcmdldC0+Y2hhbm5lbCArICdBJywgUk9MRV9JTklUSUFUT1IpOwpAQCAtMjY3OCw3ICsyNjk0LDI1IEBACiAJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFoZF9saW51eF9nZXRfc2lnbmFsbGluZyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgYWhkX3NvZnRjICphaGQgPSAqKHN0cnVjdCBhaGRfc29mdGMgKiopc2hvc3QtPmhvc3RkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggbW9kZTsKIAorCWFoZF9sb2NrKGFoZCwgJmZsYWdzKTsKKwlhaGRfcGF1c2UoYWhkKTsKKwltb2RlID0gYWhkX2luYihhaGQsIFNCTEtDVEwpOworCWFoZF91bnBhdXNlKGFoZCk7CisJYWhkX3VubG9jayhhaGQsICZmbGFncyk7CisKKwlpZiAobW9kZSAmIEVOQUI0MCkKKwkJc3BpX3NpZ25hbGxpbmcoc2hvc3QpID0gU1BJX1NJR05BTF9MVkQ7CisJZWxzZSBpZiAobW9kZSAmIEVOQUIyMCkKKwkJc3BpX3NpZ25hbGxpbmcoc2hvc3QpID0gU1BJX1NJR05BTF9TRTsKKwllbHNlCisJCXNwaV9zaWduYWxsaW5nKHNob3N0KSA9IFNQSV9TSUdOQUxfVU5LTk9XTjsKK30KIAogc3RhdGljIHN0cnVjdCBzcGlfZnVuY3Rpb25fdGVtcGxhdGUgYWhkX2xpbnV4X3RyYW5zcG9ydF9mdW5jdGlvbnMgPSB7CiAJLnNldF9vZmZzZXQJPSBhaGRfbGludXhfc2V0X29mZnNldCwKQEAgLTI3MDMsNiArMjczNyw3IEBACiAJLnNob3dfcGNvbXBfZW4JPSAxLAogCS5zZXRfaG9sZF9tY3MJPSBhaGRfbGludXhfc2V0X2hvbGRfbWNzLAogCS5zaG93X2hvbGRfbWNzCT0gMSwKKwkuZ2V0X3NpZ25hbGxpbmcgPSBhaGRfbGludXhfZ2V0X3NpZ25hbGxpbmcsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmgKaW5kZXggZmIzZDRkZC4uM2E2N2ZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9vc20uaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5oCkBAIC01MDYsOSArNTA2LDYgQEAKIAlpbnQgcG9zOwogfTsKIAotdm9pZAlhaGRfZm9ybWF0X3RyYW5zaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sCi0JCQkgICAgIHN0cnVjdCBhaGRfdHJhbnNpbmZvICp0aW5mbyk7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NraW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgX19pbmxpbmUgdm9pZAogYWhkX2xvY2tpbml0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKQEAgLTU4Miw4ICs1NzksNiBAQAogI2RlZmluZSBQQ0lYTV9TVEFUVVNfTUFYQ1JEUwkweDFDMDAJLyogTWF4aW11bSBDdW11bGF0aXZlIFJlYWQgU2l6ZSAqLwogI2RlZmluZSBQQ0lYTV9TVEFUVVNfUkNWRFNDRU0JMHgyMDAwCS8qIFJlY2VpdmVkIGEgU3BsaXQgQ29tcCB3L0Vycm9yIG1zZyAqLwogCi1leHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgYWljNzl4eF9wY2lfZHJpdmVyOwotCiB0eXBlZGVmIGVudW0KIHsKIAlBSERfUE9XRVJfU1RBVEVfRDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbV9wY2kuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jCmluZGV4IDRiNTM1NDIuLjFhM2FiNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtX3BjaS5jCkBAIC02Miw2ICs2Miw3IEBACiAJLyogYWljNzkwMSBiYXNlZCBjb250cm9sbGVycyAqLwogCUlEKElEX0FIQV8yOTMyMEEpLAogCUlEKElEX0FIQV8yOTMyMEFMUCksCisJSUQoSURfQUhBXzI5MzIwTFBFKSwKIAkvKiBhaWM3OTAyIGJhc2VkIGNvbnRyb2xsZXJzICovCiAJSUQoSURfQUhBXzI5MzIwKSwKIAlJRChJRF9BSEFfMjkzMjBCKSwKQEAgLTgyLDcgKzgzLDcgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFoZF9saW51eF9wY2lfaWRfdGFibGUpOwogCi1zdHJ1Y3QgcGNpX2RyaXZlciBhaWM3OXh4X3BjaV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWljNzl4eF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJhaWM3OXh4IiwKIAkucHJvYmUJCT0gYWhkX2xpbnV4X3BjaV9kZXZfcHJvYmUsCiAJLnJlbW92ZQkJPSBhaGRfbGludXhfcGNpX2Rldl9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuYwppbmRleCAxNDg1MGYzLi4yY2Y3YmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmMKQEAgLTk3LDcgKzk3LDcgQEAKIHN0YXRpYyBhaGRfZGV2aWNlX3NldHVwX3QgYWhkX2FpYzc5MDJfc2V0dXA7CiBzdGF0aWMgYWhkX2RldmljZV9zZXR1cF90IGFoZF9haWM3OTBYX3NldHVwOwogCi1zdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSBhaGRfcGNpX2lkZW50X3RhYmxlIFtdID0KK3N0YXRpYyBzdHJ1Y3QgYWhkX3BjaV9pZGVudGl0eSBhaGRfcGNpX2lkZW50X3RhYmxlIFtdID0KIHsKIAkvKiBhaWM3OTAxIGJhc2VkIGNvbnRyb2xsZXJzICovCiAJewpAQCAtMTA5LDcgKzEwOSwxMyBAQAogCXsKIAkJSURfQUhBXzI5MzIwQUxQLAogCQlJRF9BTExfTUFTSywKLQkJIkFkYXB0ZWMgMjkzMjBBTFAgVWx0cmEzMjAgU0NTSSBhZGFwdGVyIiwKKwkJIkFkYXB0ZWMgMjkzMjBBTFAgUENJeCBVbHRyYTMyMCBTQ1NJIGFkYXB0ZXIiLAorCQlhaGRfYWljNzkwMV9zZXR1cAorCX0sCisJeworCQlJRF9BSEFfMjkzMjBMUEUsCisJCUlEX0FMTF9NQVNLLAorCQkiQWRhcHRlYyAyOTMyMExQRSBQQ0llIFVsdHJhMzIwIFNDU0kgYWRhcHRlciIsCiAJCWFoZF9haWM3OTAxX3NldHVwCiAJfSwKIAkvKiBhaWM3OTAxQSBiYXNlZCBjb250cm9sbGVycyAqLwpAQCAtMjAxLDcgKzIwNyw3IEBACiAJfQogfTsKIAotY29uc3QgdV9pbnQgYWhkX251bV9wY2lfZGV2cyA9IEFSUkFZX1NJWkUoYWhkX3BjaV9pZGVudF90YWJsZSk7CitzdGF0aWMgY29uc3QgdV9pbnQgYWhkX251bV9wY2lfZGV2cyA9IEFSUkFZX1NJWkUoYWhkX3BjaV9pZGVudF90YWJsZSk7CiAJCQogI2RlZmluZQlERVZDT05GSUcJCTB4NDAKICNkZWZpbmUJCVBDSVhJTklUUEFUCTB4MDAwMEUwMDB1bApAQCAtMjQ1LDYgKzI1MSw3IEBACiBzdGF0aWMgdm9pZAlhaGRfY29uZmlndXJlX3Rlcm1pbmF0aW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKIAkJCQkJICB1X2ludCBhZGFwdGVyX2NvbnRyb2wpOwogc3RhdGljIHZvaWQJYWhkX3BjaV9zcGxpdF9pbnRyKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgaW50c3RhdCk7CitzdGF0aWMgdm9pZAlhaGRfcGNpX2ludHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIAogc3RydWN0IGFoZF9wY2lfaWRlbnRpdHkgKgogYWhkX2ZpbmRfcGNpX2RldmljZShhaGRfZGV2X3NvZnRjX3QgcGNpKQpAQCAtNzU3LDcgKzc2NCw3IEBACiAJIiVzOiBBZGRyZXNzIG9yIFdyaXRlIFBoYXNlIFBhcml0eSBFcnJvciBEZXRlY3RlZCBpbiAlcy5cbiIKIH07CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhaGRfcGNpX2ludHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewogCXVpbnQ4X3QJCXBjaV9zdGF0dXNbOF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wY2kuaAppbmRleCBkYTQ1MTUzLi4xNmI3YzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3BjaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfcGNpLmgKQEAgLTUxLDYgKzUxLDcgQEAKICNkZWZpbmUgSURfQUlDNzkwMQkJCTB4ODAwRjkwMDVGRkZGOTAwNXVsbAogI2RlZmluZSBJRF9BSEFfMjkzMjBBCQkJMHg4MDAwOTAwNTAwNjA5MDA1dWxsCiAjZGVmaW5lIElEX0FIQV8yOTMyMEFMUAkJCTB4ODAxNzkwMDUwMDQ0OTAwNXVsbAorI2RlZmluZSBJRF9BSEFfMjkzMjBMUEUJCQkweDgwMTc5MDA1MDA0NTkwMDV1bGwKIAogI2RlZmluZSBJRF9BSUM3OTAxQQkJCTB4ODAxRTkwMDVGRkZGOTAwNXVsbAogI2RlZmluZSBJRF9BSEFfMjkzMjBMUAkJCTB4ODAxNDkwMDUwMDQ0OTAwNXVsbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9wcm9jLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYwppbmRleCBjNWYwZWU1Li42YjI4YmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYworKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X3Byb2MuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJcmV0dXJuIChsZW4pOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWhkX2Zvcm1hdF90cmFuc2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBzdHJ1Y3QgYWhkX3RyYW5zaW5mbyAqdGluZm8pCiB7CiAJdV9pbnQgc3BlZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmggYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4LmgKaW5kZXggNjJmZjhjMy4uOTU0YzdjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eC5oCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHguaApAQCAtNTQsMTQgKzU0LDYgQEAKIHN0cnVjdCBzZWVwcm9tX2Rlc2NyaXB0b3I7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVXNlZnVsIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSxiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotI2lmbmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KICNpZm5kZWYgVFJVRQogI2RlZmluZSBUUlVFIDEKICNlbmRpZgpAQCAtMTEzNSw4ICsxMTI3LDYgQEAKIAljaGFyCQkJKm5hbWU7CiAJYWhjX2RldmljZV9zZXR1cF90CSpzZXR1cDsKIH07Ci1leHRlcm4gc3RydWN0IGFoY19wY2lfaWRlbnRpdHkgYWhjX3BjaV9pZGVudF90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IHVfaW50IGFoY19udW1fcGNpX2RldnM7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWTC9FSVNBIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3QgYWljNzc3MF9pZGVudGl0eSB7CkBAIC0xMjg5LDYgKzEyNzksNyBAQAogfSBhaGNfcXVldWVfYWxnOwogCiB2b2lkCQkJYWhjX3NldF90YWdzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKIAkJCQkgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKIAkJCQkgICAgIGFoY19xdWV1ZV9hbGcgYWxnKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwppbmRleCA5M2U0ZTQwOS4uNTBlZjc4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9jb3JlLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9jb3JlLmMKQEAgLTE2NzEsNyArMTY3MSw3IEBACiAJCXRyYW5zaW5mbyA9ICZ0aW5mby0+Z29hbDsKIAkqcHByX29wdGlvbnMgJj0gdHJhbnNpbmZvLT5wcHJfb3B0aW9uczsKIAlpZiAodHJhbnNpbmZvLT53aWR0aCA9PSBNU0dfRVhUX1dEVFJfQlVTXzhfQklUKSB7Ci0JCW1heHN5bmMgPSBNQVgobWF4c3luYywgQUhDX1NZTkNSQVRFX1VMVFJBMik7CisJCW1heHN5bmMgPSBtYXgobWF4c3luYywgKHVfaW50KUFIQ19TWU5DUkFURV9VTFRSQTIpOwogCQkqcHByX29wdGlvbnMgJj0gfk1TR19FWFRfUFBSX0RUX1JFUTsKIAl9CiAJaWYgKHRyYW5zaW5mby0+cGVyaW9kID09IDApIHsKQEAgLTE2NzksNyArMTY3OSw3IEBACiAJCSpwcHJfb3B0aW9ucyA9IDA7CiAJCXJldHVybiAoTlVMTCk7CiAJfQotCSpwZXJpb2QgPSBNQVgoKnBlcmlvZCwgdHJhbnNpbmZvLT5wZXJpb2QpOworCSpwZXJpb2QgPSBtYXgoKnBlcmlvZCwgKHVfaW50KXRyYW5zaW5mby0+cGVyaW9kKTsKIAlyZXR1cm4gKGFoY19maW5kX3N5bmNyYXRlKGFoYywgcGVyaW9kLCBwcHJfb3B0aW9ucywgbWF4c3luYykpOwogfQogCkBAIC0xODA0LDEyICsxODA0LDEyIEBACiAJCWVsc2UKIAkJCW1heG9mZnNldCA9IE1BWF9PRkZTRVRfOEJJVDsKIAl9Ci0JKm9mZnNldCA9IE1JTigqb2Zmc2V0LCBtYXhvZmZzZXQpOworCSpvZmZzZXQgPSBtaW4oKm9mZnNldCwgbWF4b2Zmc2V0KTsKIAlpZiAodGluZm8gIT0gTlVMTCkgewogCQlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKLQkJCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgdGluZm8tPnVzZXIub2Zmc2V0KTsKKwkJCSpvZmZzZXQgPSBtaW4oKm9mZnNldCwgKHVfaW50KXRpbmZvLT51c2VyLm9mZnNldCk7CiAJCWVsc2UKLQkJCSpvZmZzZXQgPSBNSU4oKm9mZnNldCwgdGluZm8tPmdvYWwub2Zmc2V0KTsKKwkJCSpvZmZzZXQgPSBtaW4oKm9mZnNldCwgKHVfaW50KXRpbmZvLT5nb2FsLm9mZnNldCk7CiAJfQogfQogCkBAIC0xODM1LDkgKzE4MzUsOSBAQAogCX0KIAlpZiAodGluZm8gIT0gTlVMTCkgewogCQlpZiAocm9sZSA9PSBST0xFX1RBUkdFVCkKLQkJCSpidXNfd2lkdGggPSBNSU4odGluZm8tPnVzZXIud2lkdGgsICpidXNfd2lkdGgpOworCQkJKmJ1c193aWR0aCA9IG1pbigodV9pbnQpdGluZm8tPnVzZXIud2lkdGgsICpidXNfd2lkdGgpOwogCQllbHNlCi0JCQkqYnVzX3dpZHRoID0gTUlOKHRpbmZvLT5nb2FsLndpZHRoLCAqYnVzX3dpZHRoKTsKKwkJCSpidXNfd2lkdGggPSBtaW4oKHVfaW50KXRpbmZvLT5nb2FsLndpZHRoLCAqYnVzX3dpZHRoKTsKIAl9CiB9CiAKQEAgLTE5ODYsNyArMTk4Niw3IEBACiAJCXRpbmZvLT5jdXJyLnBwcl9vcHRpb25zID0gcHByX29wdGlvbnM7CiAKIAkJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCi0JCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfVFJBTlNGRVJfTkVHLCBOVUxMKTsKKwkJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19UUkFOU0ZFUl9ORUcpOwogCQlpZiAoYm9vdHZlcmJvc2UpIHsKIAkJCWlmIChvZmZzZXQgIT0gMCkgewogCQkJCXByaW50ZigiJXM6IHRhcmdldCAlZCBzeW5jaHJvbm91cyBhdCAlc01IeiVzLCAiCkBAIC0yMDU2LDcgKzIwNTYsNyBAQAogCQl0aW5mby0+Y3Vyci53aWR0aCA9IHdpZHRoOwogCiAJCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LAotCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1RSQU5TRkVSX05FRywgTlVMTCk7CisJCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfVFJBTlNGRVJfTkVHKTsKIAkJaWYgKGJvb3R2ZXJib3NlKSB7CiAJCQlwcmludGYoIiVzOiB0YXJnZXQgJWQgdXNpbmcgJWRiaXQgdHJhbnNmZXJzXG4iLAogCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPnRhcmdldCwKQEAgLTIwNzQsMTIgKzIwNzQsMTQgQEAKICAqIFVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0YWdnZWQgcXVldWluZyBmb3IgYSBnaXZlbiB0YXJnZXQuCiAgKi8KIHZvaWQKLWFoY19zZXRfdGFncyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKLQkgICAgIGFoY19xdWV1ZV9hbGcgYWxnKQorYWhjX3NldF90YWdzKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCSAgICAgc3RydWN0IGFoY19kZXZpbmZvICpkZXZpbmZvLCBhaGNfcXVldWVfYWxnIGFsZykKIHsKLSAJYWhjX3BsYXRmb3JtX3NldF90YWdzKGFoYywgZGV2aW5mbywgYWxnKTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKKworIAlhaGNfcGxhdGZvcm1fc2V0X3RhZ3MoYWhjLCBzZGV2LCBkZXZpbmZvLCBhbGcpOwogIAlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKLSAJCSAgICAgICBkZXZpbmZvLT5sdW4sIEFDX1RSQU5TRkVSX05FRywgJmFsZyk7CisgCQkgICAgICAgZGV2aW5mby0+bHVuLCBBQ19UUkFOU0ZFUl9ORUcpOwogfQogCiAvKgpAQCAtMzQ4OSw3ICszNDkxLDcgQEAKIAkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyB0YWdnZWQgY29tbWFuZHMuICAiCiAJCQkgICAgICAgIlBlcmZvcm1pbmcgbm9uLXRhZ2dlZCBJL09cbiIsIGFoY19uYW1lKGFoYyksCiAJCQkgICAgICAgZGV2aW5mby0+Y2hhbm5lbCwgZGV2aW5mby0+dGFyZ2V0LCBkZXZpbmZvLT5sdW4pOwotCQkJYWhjX3NldF90YWdzKGFoYywgZGV2aW5mbywgQUhDX1FVRVVFX05PTkUpOworCQkJYWhjX3NldF90YWdzKGFoYywgc2NiLT5pb19jdHgsIGRldmluZm8sIEFIQ19RVUVVRV9OT05FKTsKIAkJCW1hc2sgPSB+MHgyMzsKIAkJfSBlbHNlIHsKIAkJCXByaW50ZigiKCVzOiVjOiVkOiVkKTogcmVmdXNlcyAlcyB0YWdnZWQgY29tbWFuZHMuICAiCkBAIC0zNDk3LDcgKzM0OTksNyBAQAogCQkJICAgICAgIGFoY19uYW1lKGFoYyksIGRldmluZm8tPmNoYW5uZWwsIGRldmluZm8tPnRhcmdldCwKIAkJCSAgICAgICBkZXZpbmZvLT5sdW4sIHRhZ190eXBlID09IE1TR19PUkRFUkVEX1RBU0sKIAkJCSAgICAgICA/ICJvcmRlcmVkIiA6ICJoZWFkIG9mIHF1ZXVlIik7Ci0JCQlhaGNfc2V0X3RhZ3MoYWhjLCBkZXZpbmZvLCBBSENfUVVFVUVfQkFTSUMpOworCQkJYWhjX3NldF90YWdzKGFoYywgc2NiLT5pb19jdHgsIGRldmluZm8sIEFIQ19RVUVVRV9CQVNJQyk7CiAJCQltYXNrID0gfjB4MDM7CiAJCX0KIApAQCAtMzc2Myw3ICszNzY1LDcgQEAKIAkKIAlpZiAoc3RhdHVzICE9IENBTV9TRUxfVElNRU9VVCkKIAkJYWhjX3NlbmRfYXN5bmMoYWhjLCBkZXZpbmZvLT5jaGFubmVsLCBkZXZpbmZvLT50YXJnZXQsCi0JCQkgICAgICAgQ0FNX0xVTl9XSUxEQ0FSRCwgQUNfU0VOVF9CRFIsIE5VTEwpOworCQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX1NFTlRfQkRSKTsKIAogCWlmIChtZXNzYWdlICE9IE5VTEwKIAkgJiYgKHZlcmJvc2VfbGV2ZWwgPD0gYm9vdHZlcmJvc2UpKQpAQCAtNDQwNiw3ICs0NDA4LDcgQEAKIAlwaHlzYWRkciA9IHNnX21hcC0+c2dfcGh5c2FkZHI7CiAKIAluZXdjb3VudCA9IChQQUdFX1NJWkUgLyAoQUhDX05TRUcgKiBzaXplb2Yoc3RydWN0IGFoY19kbWFfc2VnKSkpOwotCW5ld2NvdW50ID0gTUlOKG5ld2NvdW50LCAoQUhDX1NDQl9NQVhfQUxMT0MgLSBzY2JfZGF0YS0+bnVtc2NicykpOworCW5ld2NvdW50ID0gbWluKG5ld2NvdW50LCAoQUhDX1NDQl9NQVhfQUxMT0MgLSBzY2JfZGF0YS0+bnVtc2NicykpOwogCWZvciAoaSA9IDA7IGkgPCBuZXdjb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBzY2JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAjaWZuZGVmIF9fbGludXhfXwpAQCAtNjAxOCw3ICs2MDIwLDcgQEAKICNlbmRpZgogCS8qIE5vdGlmeSB0aGUgWFBUIHRoYXQgYSBidXMgcmVzZXQgb2NjdXJyZWQgKi8KIAlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8uY2hhbm5lbCwgQ0FNX1RBUkdFVF9XSUxEQ0FSRCwKLQkJICAgICAgIENBTV9MVU5fV0lMRENBUkQsIEFDX0JVU19SRVNFVCwgTlVMTCk7CisJCSAgICAgICBDQU1fTFVOX1dJTERDQVJELCBBQ19CVVNfUkVTRVQpOwogCiAJLyoKIAkgKiBSZXZlcnQgdG8gYXN5bmMvbmFycm93IHRyYW5zZmVycyB1bnRpbCB3ZSByZW5lZ290aWF0ZS4KQEAgLTY0NDIsNyArNjQ0NCw3IEBACiAJCQlpZiAoc2tpcF9hZGRyID4gaSkgewogCQkJCWludCBlbmRfYWRkcjsKIAotCQkJCWVuZF9hZGRyID0gTUlOKGFkZHJlc3MsIHNraXBfYWRkcik7CisJCQkJZW5kX2FkZHIgPSBtaW4oYWRkcmVzcywgc2tpcF9hZGRyKTsKIAkJCQlhZGRyZXNzX29mZnNldCArPSBlbmRfYWRkciAtIGk7CiAJCQkJaSA9IHNraXBfYWRkcjsKIAkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwppbmRleCA0M2FiNzUzLi42NjBmMjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmMKQEAgLTMyOCw3ICszMjgsNyBAQAogICogZm9yY2UgYWxsIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9ucyB0byBiZSBzZXJ2aWNlZCBwcmlvciB0byBhIG5ldwogICogdHJhbnNhY3Rpb24uCiAgKi8KLXVpbnQzMl90IGFpYzd4eHhfcGVyaW9kaWNfb3RhZzsKK3N0YXRpYyB1aW50MzJfdCBhaWM3eHh4X3BlcmlvZGljX290YWc7CiAKIC8qCiAgKiBNb2R1bGUgaW5mb3JtYXRpb24gYW5kIHNldHRhYmxlIG9wdGlvbnMuCkBAIC01MTIsNyArNTEyLDYgQEAKIAlzdHJ1Y3Qgc2VlcHJvbV9jb25maWcgKnNjID0gYWhjLT5zZWVwX2NvbmZpZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzY3NpX3RhcmdldCAqKmFoY190YXJncCA9IGFoY19saW51eF90YXJnZXRfaW5fc29mdGMoc3RhcmdldCk7Ci0Jc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKIAl1bnNpZ25lZCBzaG9ydCBzY3NpcmF0ZTsKIAlzdHJ1Y3QgYWhjX2RldmluZm8gZGV2aW5mbzsKIAlzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CkBAIC01MzMsNyArNTMyLDYgQEAKIAlCVUdfT04oKmFoY190YXJncCAhPSBOVUxMKTsKIAogCSphaGNfdGFyZ3AgPSBzdGFyZ2V0OwotCW1lbXNldCh0YXJnLCAwLCBzaXplb2YoKnRhcmcpKTsKIAogCWlmIChzYykgewogCQlpbnQgbWF4c3luYyA9IEFIQ19TWU5DUkFURV9EVDsKQEAgLTU5NCwxNCArNTkyLDExIEBACiAJc3RydWN0CWFoY19zb2Z0YyAqYWhjID0KIAkJKigoc3RydWN0IGFoY19zb2Z0YyAqKilzZGV2LT5ob3N0LT5ob3N0ZGF0YSk7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0ID0gc2Rldi0+c2Rldl90YXJnZXQ7Ci0Jc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcgPSBzY3NpX3RyYW5zcG9ydF90YXJnZXRfZGF0YShzdGFyZ2V0KTsKIAlzdHJ1Y3QgYWhjX2xpbnV4X2RldmljZSAqZGV2OwogCiAJaWYgKGJvb3R2ZXJib3NlKQogCQlwcmludGYoIiVzOiBTbGF2ZSBBbGxvYyAlZFxuIiwgYWhjX25hbWUoYWhjKSwgc2Rldi0+aWQpOwogCi0JQlVHX09OKHRhcmctPnNkZXZbc2Rldi0+bHVuXSAhPSBOVUxMKTsKLQogCWRldiA9IHNjc2lfdHJhbnNwb3J0X2RldmljZV9kYXRhKHNkZXYpOwogCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CiAKQEAgLTYxOCw4ICs2MTMsNiBAQAogCSAqLwogCWRldi0+bWF4dGFncyA9IDA7CiAJCi0JdGFyZy0+c2RldltzZGV2LT5sdW5dID0gc2RldjsKLQogCXNwaV9wZXJpb2Qoc3RhcmdldCkgPSAwOwogCiAJcmV0dXJuIDA7CkBAIC02NDQsMjIgKzYzNyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1haGNfbGludXhfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCi17Ci0Jc3RydWN0CWFoY19zb2Z0YyAqYWhjOwotCXN0cnVjdAlhaGNfbGludXhfZGV2aWNlICpkZXYgPSBzY3NpX3RyYW5zcG9ydF9kZXZpY2VfZGF0YShzZGV2KTsKLQlzdHJ1Y3QJYWhjX2xpbnV4X3RhcmdldCAqdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHNkZXYtPnNkZXZfdGFyZ2V0KTsKLQotCWFoYyA9ICooKHN0cnVjdCBhaGNfc29mdGMgKiopc2Rldi0+aG9zdC0+aG9zdGRhdGEpOwotCWlmIChib290dmVyYm9zZSkKLQkJcHJpbnRmKCIlczogU2xhdmUgRGVzdHJveSAlZFxuIiwgYWhjX25hbWUoYWhjKSwgc2Rldi0+aWQpOwotCi0JQlVHX09OKGRldi0+YWN0aXZlKTsKLQotCXRhcmctPnNkZXZbc2Rldi0+bHVuXSA9IE5VTEw7Ci19Ci0KICNpZiBkZWZpbmVkKF9faTM4Nl9fKQogLyoKICAqIFJldHVybiB0aGUgZGlzayBnZW9tZXRyeSBmb3IgdGhlIGdpdmVuIFNDU0kgZGV2aWNlLgpAQCAtNzc3LDExICs3NTQsMTEgQEAKICNlbmRpZgogCS5jYW5fcXVldWUJCT0gQUhDX01BWF9RVUVVRSwKIAkudGhpc19pZAkJPSAtMSwKKwkubWF4X3NlY3RvcnMJCT0gODE5MiwKIAkuY21kX3Blcl9sdW4JCT0gMiwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCiAJLnNsYXZlX2FsbG9jCQk9IGFoY19saW51eF9zbGF2ZV9hbGxvYywKIAkuc2xhdmVfY29uZmlndXJlCT0gYWhjX2xpbnV4X3NsYXZlX2NvbmZpZ3VyZSwKLQkuc2xhdmVfZGVzdHJveQkJPSBhaGNfbGludXhfc2xhdmVfZGVzdHJveSwKIAkudGFyZ2V0X2FsbG9jCQk9IGFoY19saW51eF90YXJnZXRfYWxsb2MsCiAJLnRhcmdldF9kZXN0cm95CQk9IGFoY19saW51eF90YXJnZXRfZGVzdHJveSwKIH07CkBAIC0xMjAzLDIxICsxMTgwLDEzIEBACiBhaGNfcGxhdGZvcm1fZnJlZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCiB7CiAJc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwotCWludCBpLCBqOworCWludCBpOwogCiAJaWYgKGFoYy0+cGxhdGZvcm1fZGF0YSAhPSBOVUxMKSB7CiAJCS8qIGRlc3Ryb3kgYWxsIG9mIHRoZSBkZXZpY2UgYW5kIHRhcmdldCBvYmplY3RzICovCiAJCWZvciAoaSA9IDA7IGkgPCBBSENfTlVNX1RBUkdFVFM7IGkrKykgewogCQkJc3RhcmdldCA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+c3RhcmdldFtpXTsKIAkJCWlmIChzdGFyZ2V0ICE9IE5VTEwpIHsKLQkJCQlmb3IgKGogPSAwOyBqIDwgQUhDX05VTV9MVU5TOyBqKyspIHsKLQkJCQkJc3RydWN0IGFoY19saW51eF90YXJnZXQgKnRhcmcgPQotCQkJCQkJc2NzaV90cmFuc3BvcnRfdGFyZ2V0X2RhdGEoc3RhcmdldCk7Ci0KLQkJCQkJaWYgKHRhcmctPnNkZXZbal0gPT0gTlVMTCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl0YXJnLT5zZGV2W2pdID0gTlVMTDsKLQkJCQl9CiAJCQkJYWhjLT5wbGF0Zm9ybV9kYXRhLT5zdGFyZ2V0W2ldID0gTlVMTDsKICAJCQl9CiAgCQl9CkBAIC0xMjUxLDI0ICsxMjIwLDEzIEBACiB9CiAKIHZvaWQKLWFoY19wbGF0Zm9ybV9zZXRfdGFncyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywKLQkJICAgICAgYWhjX3F1ZXVlX2FsZyBhbGcpCithaGNfcGxhdGZvcm1fc2V0X3RhZ3Moc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCSAgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywgYWhjX3F1ZXVlX2FsZyBhbGcpCiB7Ci0Jc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0OwotCXN0cnVjdCBhaGNfbGludXhfdGFyZ2V0ICp0YXJnOwogCXN0cnVjdCBhaGNfbGludXhfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwotCXVfaW50IHRhcmdldF9vZmZzZXQ7CiAJaW50IHdhc19xdWV1aW5nOwogCWludCBub3dfcXVldWluZzsKIAotCXRhcmdldF9vZmZzZXQgPSBkZXZpbmZvLT50YXJnZXQ7Ci0JaWYgKGRldmluZm8tPmNoYW5uZWwgIT0gJ0EnKQotCQl0YXJnZXRfb2Zmc2V0ICs9IDg7Ci0Jc3RhcmdldCA9IGFoYy0+cGxhdGZvcm1fZGF0YS0+c3RhcmdldFt0YXJnZXRfb2Zmc2V0XTsKLQl0YXJnID0gc2NzaV90cmFuc3BvcnRfdGFyZ2V0X2RhdGEoc3RhcmdldCk7Ci0JQlVHX09OKHRhcmcgPT0gTlVMTCk7Ci0Jc2RldiA9IHRhcmctPnNkZXZbZGV2aW5mby0+bHVuXTsKIAlpZiAoc2RldiA9PSBOVUxMKQogCQlyZXR1cm47CiAJZGV2ID0gc2NzaV90cmFuc3BvcnRfZGV2aWNlX2RhdGEoc2Rldik7CkBAIC0xNDAxLDExICsxMzU5LDE1IEBACiAJdGFncyA9IGFoY19saW51eF91c2VyX3RhZ2RlcHRoKGFoYywgJmRldmluZm8pOwogCWlmICh0YWdzICE9IDAgJiYgc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCAhPSAwKSB7CiAKLQkJYWhjX3NldF90YWdzKGFoYywgJmRldmluZm8sIEFIQ19RVUVVRV9UQUdHRUQpOworCQlhaGNfcGxhdGZvcm1fc2V0X3RhZ3MoYWhjLCBzZGV2LCAmZGV2aW5mbywgQUhDX1FVRVVFX1RBR0dFRCk7CisJCWFoY19zZW5kX2FzeW5jKGFoYywgZGV2aW5mby5jaGFubmVsLCBkZXZpbmZvLnRhcmdldCwKKwkJCSAgICAgICBkZXZpbmZvLmx1biwgQUNfVFJBTlNGRVJfTkVHKTsKIAkJYWhjX3ByaW50X2RldmluZm8oYWhjLCAmZGV2aW5mbyk7CiAJCXByaW50ZigiVGFnZ2VkIFF1ZXVpbmcgZW5hYmxlZC4gIERlcHRoICVkXG4iLCB0YWdzKTsKIAl9IGVsc2UgewotCQlhaGNfc2V0X3RhZ3MoYWhjLCAmZGV2aW5mbywgQUhDX1FVRVVFX05PTkUpOworCQlhaGNfcGxhdGZvcm1fc2V0X3RhZ3MoYWhjLCBzZGV2LCAmZGV2aW5mbywgQUhDX1FVRVVFX05PTkUpOworCQlhaGNfc2VuZF9hc3luYyhhaGMsIGRldmluZm8uY2hhbm5lbCwgZGV2aW5mby50YXJnZXQsCisJCQkgICAgICAgZGV2aW5mby5sdW4sIEFDX1RSQU5TRkVSX05FRyk7CiAJfQogfQogCkBAIC0xNjI5LDcgKzE1OTEsNyBAQAogCiB2b2lkCiBhaGNfc2VuZF9hc3luYyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgY2hhbm5lbCwKLQkgICAgICAgdV9pbnQgdGFyZ2V0LCB1X2ludCBsdW4sIGFjX2NvZGUgY29kZSwgdm9pZCAqYXJnKQorCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSBjb2RlKQogewogCXN3aXRjaCAoY29kZSkgewogCWNhc2UgQUNfVFJBTlNGRVJfTkVHOgpAQCAtMTg3NSw5ICsxODM3LDkgQEAKIAkJaWYgKHNjYi0+ZmxhZ3MgJiBTQ0JfU0VOU0UpIHsKIAkJCXVfaW50IHNlbnNlX3NpemU7CiAKLQkJCXNlbnNlX3NpemUgPSBNSU4oc2l6ZW9mKHN0cnVjdCBzY3NpX3NlbnNlX2RhdGEpCisJCQlzZW5zZV9zaXplID0gbWluKHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKQogCQkJCSAgICAgICAtIGFoY19nZXRfc2Vuc2VfcmVzaWR1YWwoc2NiKSwKLQkJCQkJIHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcikpOworCQkJCQkgKHVfbG9uZylzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKTsKIAkJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwKIAkJCSAgICAgICBhaGNfZ2V0X3NlbnNlX2J1ZihhaGMsIHNjYiksIHNlbnNlX3NpemUpOwogCQkJaWYgKHNlbnNlX3NpemUgPCBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpKQpAQCAtMTk0Niw3ICsxOTA4LDcgQEAKIAkJCX0KIAkJCWFoY19zZXRfdHJhbnNhY3Rpb25fc3RhdHVzKHNjYiwgQ0FNX1JFUVVFVUVfUkVRKTsKIAkJCWFoY19zZXRfc2NzaV9zdGF0dXMoc2NiLCBTQ1NJX1NUQVRVU19PSyk7Ci0JCQlhaGNfcGxhdGZvcm1fc2V0X3RhZ3MoYWhjLCAmZGV2aW5mbywKKwkJCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsIHNkZXYsICZkZXZpbmZvLAogCQkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1FfQkFTSUMpCiAJCQkJICAgPyBBSENfUVVFVUVfQkFTSUMgOiBBSENfUVVFVUVfVEFHR0VEKTsKIAkJCWJyZWFrOwpAQCAtMTk1Nyw3ICsxOTE5LDcgQEAKIAkJICovCiAJCWRldi0+b3BlbmluZ3MgPSAxOwogCQlhaGNfc2V0X3Njc2lfc3RhdHVzKHNjYiwgU0NTSV9TVEFUVVNfQlVTWSk7Ci0JCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhhaGMsICZkZXZpbmZvLAorCQlhaGNfcGxhdGZvcm1fc2V0X3RhZ3MoYWhjLCBzZGV2LCAmZGV2aW5mbywKIAkJCSAgICAgKGRldi0+ZmxhZ3MgJiBBSENfREVWX1FfQkFTSUMpCiAJCQkgICA/IEFIQ19RVUVVRV9CQVNJQyA6IEFIQ19RVUVVRV9UQUdHRUQpOwogCQlicmVhazsKQEAgLTI1OTksOCArMjU2MSw2IEBACiAJaWYgKCFhaGNfbGludXhfdHJhbnNwb3J0X3RlbXBsYXRlKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXNjc2lfdHJhbnNwb3J0X3Jlc2VydmVfdGFyZ2V0KGFoY19saW51eF90cmFuc3BvcnRfdGVtcGxhdGUsCi0JCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhaGNfbGludXhfdGFyZ2V0KSk7CiAJc2NzaV90cmFuc3BvcnRfcmVzZXJ2ZV9kZXZpY2UoYWhjX2xpbnV4X3RyYW5zcG9ydF90ZW1wbGF0ZSwKIAkJCQkgICAgICBzaXplb2Yoc3RydWN0IGFoY19saW51eF9kZXZpY2UpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaCBiL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgKaW5kZXggYTg3YTRjZS4uODVhZTVkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uaAorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5oCkBAIC0yNTYsNyArMjU2LDYgQEAKIAlBSENfREVWX1BFUklPRElDX09UQUcJID0gMHg0MCwgLyogU2VuZCBPVEFHIHRvIHByZXZlbnQgc3RhcnZhdGlvbiAqLwogfSBhaGNfbGludXhfZGV2X2ZsYWdzOwogCi1zdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldDsKIHN0cnVjdCBhaGNfbGludXhfZGV2aWNlIHsKIAkvKgogCSAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGN1cnJlbnRseQpAQCAtMzI5LDEyICszMjgsNiBAQAogI2RlZmluZSBBSENfT1RBR19USFJFU0gJNTAwCiB9OwogCi1zdHJ1Y3QgYWhjX2xpbnV4X3RhcmdldCB7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlCSAqc2RldltBSENfTlVNX0xVTlNdOwotCXN0cnVjdCBhaGNfdHJhbnNpbmZvCSAgbGFzdF90aW5mbzsKLQlzdHJ1Y3QgYWhjX3NvZnRjCSAqYWhjOwotfTsKLQogLyoqKioqKioqKioqKioqKioqKioqKiBEZWZpbml0aW9ucyBSZXF1aXJlZCBieSB0aGUgQ29yZSAqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBOdW1iZXIgb2YgU0cgc2VnbWVudHMgd2UgcmVxdWlyZS4gIFNvIGxvbmcgYXMgdGhlIFMvRyBzZWdtZW50cyBmb3IKQEAgLTUzMyw4ICs1MjYsNiBAQAogI2RlZmluZSBQQ0lSX1NVQlZFTkRfMAkweDJjCiAjZGVmaW5lIFBDSVJfU1VCREVWXzAJMHgyZQogCi1leHRlcm4gc3RydWN0IHBjaV9kcml2ZXIgYWljN3h4eF9wY2lfZHJpdmVyOwotCiB0eXBlZGVmIGVudW0KIHsKIAlBSENfUE9XRVJfU1RBVEVfRDAsCkBAIC04MjQsNyArODE1LDcgQEAKICAgICAgICAgfQogfQogCi12b2lkCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsCit2b2lkCWFoY19wbGF0Zm9ybV9zZXRfdGFncyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKIAkJCSAgICAgIHN0cnVjdCBhaGNfZGV2aW5mbyAqZGV2aW5mbywgYWhjX3F1ZXVlX2FsZyk7CiBpbnQJYWhjX3BsYXRmb3JtX2Fib3J0X3NjYnMoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBpbnQgdGFyZ2V0LAogCQkJCWNoYXIgY2hhbm5lbCwgaW50IGx1biwgdV9pbnQgdGFnLApAQCAtODM0LDcgKzgyNSw3IEBACiB2b2lkCWFoY19wbGF0Zm9ybV9mbHVzaHdvcmsoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKIHZvaWQJYWhjX2RvbmUoc3RydWN0IGFoY19zb2Z0YyosIHN0cnVjdCBzY2IqKTsKIHZvaWQJYWhjX3NlbmRfYXN5bmMoc3RydWN0IGFoY19zb2Z0YyAqLCBjaGFyIGNoYW5uZWwsCi0JCSAgICAgICB1X2ludCB0YXJnZXQsIHVfaW50IGx1biwgYWNfY29kZSwgdm9pZCAqKTsKKwkJICAgICAgIHVfaW50IHRhcmdldCwgdV9pbnQgbHVuLCBhY19jb2RlKTsKIHZvaWQJYWhjX3ByaW50X3BhdGgoc3RydWN0IGFoY19zb2Z0YyAqLCBzdHJ1Y3Qgc2NiICopOwogdm9pZAlhaGNfcGxhdGZvcm1fZHVtcF9jYXJkX3N0YXRlKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMKaW5kZXggZDIwY2E1MS4uZWE1Njg3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc21fcGNpLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWhjX2xpbnV4X3BjaV9pZF90YWJsZSk7CiAKLXN0cnVjdCBwY2lfZHJpdmVyIGFpYzd4eHhfcGNpX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhaWM3eHh4X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gImFpYzd4eHgiLAogCS5wcm9iZQkJPSBhaGNfbGludXhfcGNpX2Rldl9wcm9iZSwKIAkucmVtb3ZlCQk9IGFoY19saW51eF9wY2lfZGV2X3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X3BjaS5jCmluZGV4IDYzY2FiMmQuLjA5YzgxNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wY2kuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiBzdGF0aWMgYWhjX2RldmljZV9zZXR1cF90IGFoY19haGE0OTRYWF9zZXR1cDsKIHN0YXRpYyBhaGNfZGV2aWNlX3NldHVwX3QgYWhjX2FoYTM5OFhYX3NldHVwOwogCi1zdHJ1Y3QgYWhjX3BjaV9pZGVudGl0eSBhaGNfcGNpX2lkZW50X3RhYmxlIFtdID0KK3N0YXRpYyBzdHJ1Y3QgYWhjX3BjaV9pZGVudGl0eSBhaGNfcGNpX2lkZW50X3RhYmxlIFtdID0KIHsKIAkvKiBhaWM3ODUwIGJhc2VkIGNvbnRyb2xsZXJzICovCiAJewpAQCAtNTU5LDcgKzU1OSw3IEBACiAJfQogfTsKIAotY29uc3QgdV9pbnQgYWhjX251bV9wY2lfZGV2cyA9IEFSUkFZX1NJWkUoYWhjX3BjaV9pZGVudF90YWJsZSk7CitzdGF0aWMgY29uc3QgdV9pbnQgYWhjX251bV9wY2lfZGV2cyA9IEFSUkFZX1NJWkUoYWhjX3BjaV9pZGVudF90YWJsZSk7CiAJCQogI2RlZmluZSBBSENfMzk0WF9TTE9UX0NIQU5ORUxfQQk0CiAjZGVmaW5lIEFIQ18zOTRYX1NMT1RfQ0hBTk5FTF9CCTUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfcHJvYy5jIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMKaW5kZXggNTkxNGI0YS4uOTllNTQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9wcm9jLmMKQEAgLTE4Miw3ICsxODIsNiBAQAogCQkgICAgICB1X2ludCBvdXJfaWQsIGNoYXIgY2hhbm5lbCwgdV9pbnQgdGFyZ2V0X2lkLAogCQkgICAgICB1X2ludCB0YXJnZXRfb2Zmc2V0KQogewotCXN0cnVjdAlhaGNfbGludXhfdGFyZ2V0ICp0YXJnOwogCXN0cnVjdAlzY3NpX3RhcmdldCAqc3RhcmdldDsKIAlzdHJ1Y3QJYWhjX2luaXRpYXRvcl90aW5mbyAqdGluZm87CiAJc3RydWN0CWFoY190bW9kZV90c3RhdGUgKnRzdGF0ZTsKQEAgLTE5OCw3ICsxOTcsNiBAQAogCXN0YXJnZXQgPSBhaGMtPnBsYXRmb3JtX2RhdGEtPnN0YXJnZXRbdGFyZ2V0X29mZnNldF07CiAJaWYgKCFzdGFyZ2V0KQogCQlyZXR1cm47Ci0JdGFyZyA9IHNjc2lfdHJhbnNwb3J0X3RhcmdldF9kYXRhKHN0YXJnZXQpOwogCiAJY29weV9pbmZvKGluZm8sICJcdEdvYWw6ICIpOwogCWFoY19mb3JtYXRfdHJhbnNpbmZvKGluZm8sICZ0aW5mby0+Z29hbCk7CkBAIC0yMDgsNyArMjA2LDcgQEAKIAlmb3IgKGx1biA9IDA7IGx1biA8IEFIQ19OVU1fTFVOUzsgbHVuKyspIHsKIAkJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCi0JCXNkZXYgPSB0YXJnLT5zZGV2W2x1bl07CisJCXNkZXYgPSBzY3NpX2RldmljZV9sb29rdXBfYnlfdGFyZ2V0KHN0YXJnZXQsIGx1bik7CiAKIAkJaWYgKHNkZXYgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwpAQCAtMzgzLDExICszODEsMTEgQEAKIAl9CiAJY29weV9pbmZvKCZpbmZvLCAiXG4iKTsKIAotCW1heF90YXJnID0gMTU7CisJbWF4X3RhcmcgPSAxNjsKIAlpZiAoKGFoYy0+ZmVhdHVyZXMgJiAoQUhDX1dJREV8QUhDX1RXSU4pKSA9PSAwKQotCQltYXhfdGFyZyA9IDc7CisJCW1heF90YXJnID0gODsKIAotCWZvciAoaSA9IDA7IGkgPD0gbWF4X3Rhcmc7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBtYXhfdGFyZzsgaSsrKSB7CiAJCXVfaW50IG91cl9pZDsKIAkJdV9pbnQgdGFyZ2V0X2lkOwogCQljaGFyIGNoYW5uZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQuYyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC5jCmluZGV4IGJjZDdmZmYuLjdkMWZlYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC5jCkBAIC0yNTY1LDcgKzI1NjUsNyBAQAogICAgICAgfQogICAgIH0KICAgICBzY2JfY291bnQgPSBtaW4oIChpLTEpLCBwLT5zY2JfZGF0YS0+bWF4c2NicyAtIHAtPnNjYl9kYXRhLT5udW1zY2JzKTsKLSAgICBzY2JfYXAgPSAoc3RydWN0IGFpYzd4eHhfc2NiICopa21hbGxvYyhzaXplb2YgKHN0cnVjdCBhaWM3eHh4X3NjYikgKiBzY2JfY291bnQKKyAgICBzY2JfYXAgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGFpYzd4eHhfc2NiKSAqIHNjYl9jb3VudAogCQkJCQkgICArIHNpemVvZihzdHJ1Y3QgYWljN3h4eF9zY2JfZG1hKSwgR0ZQX0FUT01JQyk7CiAgICAgaWYgKHNjYl9hcCA9PSBOVUxMKQogICAgICAgcmV0dXJuKDApOwpAQCAtMjY0Niw3ICsyNjQ2LDcgQEAKIAogCXdoaWxlIChwLT5jb21wbGV0ZXEuaGVhZCAhPSBOVUxMKSB7CiAJCWNtZCA9IHAtPmNvbXBsZXRlcS5oZWFkOwotCQlwLT5jb21wbGV0ZXEuaGVhZCA9IChzdHJ1Y3Qgc2NzaV9DbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKKwkJcC0+Y29tcGxldGVxLmhlYWQgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7CiAJCWNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7CiAJCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eC5oIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eC5oCmluZGV4IDcxYTAzMWQuLjMyZjUxM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHguaAorKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4LmgKQEAgLTU2LDggKzU2LDggQEAKIC8qIDIqSVROTCB0aW1lb3V0ICsgMSBzZWNvbmQgKi8KICNkZWZpbmUgQUlDOTRYWF9TQ0JfVElNRU9VVCAgKDUqSFopCiAKLWV4dGVybiBrbWVtX2NhY2hlX3QgKmFzZF9kbWFfdG9rZW5fY2FjaGU7Ci1leHRlcm4ga21lbV9jYWNoZV90ICphc2RfYXNjYl9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYXNkX2RtYV90b2tlbl9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYXNkX2FzY2JfY2FjaGU7CiBleHRlcm4gY2hhciBzYXNfYWRkcl9zdHJbMipTQVNfQUREUl9TSVpFICsgMV07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhc2Rfc3RyaW5naWZ5X3Nhc19hZGRyKGNoYXIgKnAsIGNvbnN0IHU4ICpzYXNfYWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmMgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2h3aS5jCmluZGV4IDNjMmQ3YTMuLmRhOTRlMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9od2kuYwpAQCAtMTEyLDYgKzExMiwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhc2RfaW5pdF9wb3J0cyhzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhKQoreworCWludCBpOworCisJc3Bpbl9sb2NrX2luaXQoJmFzZF9oYS0+YXNkX3BvcnRzX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBBU0RfTUFYX1BIWVM7IGkrKykgeworCQlzdHJ1Y3QgYXNkX3BvcnQgKmFzZF9wb3J0ID0gJmFzZF9oYS0+YXNkX3BvcnRzW2ldOworCisJCW1lbXNldChhc2RfcG9ydC0+c2FzX2FkZHIsIDAsIFNBU19BRERSX1NJWkUpOworCQltZW1zZXQoYXNkX3BvcnQtPmF0dGFjaGVkX3Nhc19hZGRyLCAwLCBTQVNfQUREUl9TSVpFKTsKKwkJYXNkX3BvcnQtPnBoeV9tYXNrID0gMDsKKwkJYXNkX3BvcnQtPm51bV9waHlzID0gMDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYXNkX2luaXRfcGh5cyhzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhKQogewogCXU4IGk7CkBAIC0xMjEsNiArMTM2LDcgQEAKIAkJc3RydWN0IGFzZF9waHkgKnBoeSA9ICZhc2RfaGEtPnBoeXNbaV07CiAKIAkJcGh5LT5waHlfZGVzYyA9ICZhc2RfaGEtPmh3X3Byb2YucGh5X2Rlc2NbaV07CisJCXBoeS0+YXNkX3BvcnQgPSBOVUxMOwogCiAJCXBoeS0+c2FzX3BoeS5lbmFibGVkID0gMDsKIAkJcGh5LT5zYXNfcGh5LmlkID0gaTsKQEAgLTY1OCw2ICs2NzQsOCBAQAogCQlnb3RvIE91dDsKIAl9CiAKKwlhc2RfaW5pdF9wb3J0cyhhc2RfaGEpOworCiAJZXJyID0gYXNkX2luaXRfc2Nicyhhc2RfaGEpOwogCWlmIChlcnIpIHsKIAkJYXNkX3ByaW50aygiY291bGRuJ3QgaW5pdGlhbGl6ZSBzY2JzIGZvciAlc1xuIiwKQEAgLTEwMjksNyArMTA0Nyw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhc2RfYXNjYiAqYXNkX2FzY2JfYWxsb2Moc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSwKIAkJCQkJICAgICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQogewotCWV4dGVybiBrbWVtX2NhY2hlX3QgKmFzZF9hc2NiX2NhY2hlOworCWV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYXNkX2FzY2JfY2FjaGU7CiAJc3RydWN0IGFzZF9zZXFfZGF0YSAqc2VxID0gJmFzZF9oYS0+c2VxOwogCXN0cnVjdCBhc2RfYXNjYiAqYXNjYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9od2kuaCBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmgKaW5kZXggMTQzMTlkMS4uYzZjM2QxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9od2kuaAorKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2h3aS5oCkBAIC00Niw2ICs0Niw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfUkFaT1IxMCAweDQxMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SMTIgMHg0MTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl9SQVpPUjFFIDB4NDFFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfUkFaT1IxRiAweDQxRgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX1JBWk9SMzAgMHg0MzAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BREFQVEVDMl9SQVpPUjMyIDB4NDMyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfUkFaT1IzRSAweDQzRQpAQCAtMTkyLDYgKzE5MywxNiBAQAogCXN0cnVjdCBhc2RfYXNjYiAqKmVzY2JfYXJyOyAvKiBhcnJheSBvZiBwb2ludGVycyB0byBlc2NicyAqLwogfTsKIAorLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBwb3J0IHN0cnVjdHVyZS4gVGhlc2UgYXJlIHVzZWQgdG8gZ2V0IGFjY3VyYXRlCisgKiBwaHlfbWFzayBmb3IgdXBkYXRpbmcgRERCIDAuCisgKi8KK3N0cnVjdCBhc2RfcG9ydCB7CisJdTggIHNhc19hZGRyW1NBU19BRERSX1NJWkVdOworCXU4ICBhdHRhY2hlZF9zYXNfYWRkcltTQVNfQUREUl9TSVpFXTsKKwl1MzIgcGh5X21hc2s7CisJaW50IG51bV9waHlzOworfTsKKwogLyogVGhpcyBpcyB0aGUgSG9zdCBBZGFwdGVyIHN0cnVjdHVyZS4gIEl0IGRlc2NyaWJlcyB0aGUgaGFyZHdhcmUKICAqIFNBUyBhZGFwdGVyLgogICovCkBAIC0yMTAsNiArMjIxLDggQEAKIAlzdHJ1Y3QgaHdfcHJvZmlsZSBod19wcm9mOwogCiAJc3RydWN0IGFzZF9waHkgICAgcGh5c1tBU0RfTUFYX1BIWVNdOworCXNwaW5sb2NrX3QgICAgICAgIGFzZF9wb3J0c19sb2NrOworCXN0cnVjdCBhc2RfcG9ydCAgIGFzZF9wb3J0c1tBU0RfTUFYX1BIWVNdOwogCXN0cnVjdCBhc2Rfc2FzX3BvcnQgICBwb3J0c1tBU0RfTUFYX1BIWVNdOwogCiAJc3RydWN0IGRtYV9wb29sICAqc2NiX3Bvb2w7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2luaXQuYyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaW5pdC5jCmluZGV4IDk5NzQzY2EuLmZiYzgyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaW5pdC5jCkBAIC00NTAsOCArNDUwLDggQEAKIAlhc2RfaGEtPnNjYl9wb29sID0gTlVMTDsKIH0KIAota21lbV9jYWNoZV90ICphc2RfZG1hX3Rva2VuX2NhY2hlOwota21lbV9jYWNoZV90ICphc2RfYXNjYl9jYWNoZTsKK3N0cnVjdCBrbWVtX2NhY2hlICphc2RfZG1hX3Rva2VuX2NhY2hlOworc3RydWN0IGttZW1fY2FjaGUgKmFzZF9hc2NiX2NhY2hlOwogCiBzdGF0aWMgaW50IGFzZF9jcmVhdGVfZ2xvYmFsX2NhY2hlcyh2b2lkKQogewpAQCAtNzI0LDYgKzcyNCwxNSBAQAogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgJnBlbmRpbmcpIHsKIAkJc3RydWN0IGFzZF9hc2NiICphc2NiID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBhc2RfYXNjYiwgbGlzdCk7CisJCS8qCisJCSAqIERlbGV0ZSB1bmV4cGlyZWQgYXNjYiB0aW1lcnMuICBUaGlzIG1heSBoYXBwZW4gaWYgd2UgaXNzdWUKKwkJICogYSBDT05UUk9MIFBIWSBzY2IgdG8gYW4gYWRhcHRlciBhbmQgcm1tb2QgYmVmb3JlIHRoZSBzY2IKKwkJICogdGltZXMgb3V0LiAgQXBwYXJlbnRseSB3ZSBkb24ndCB3YWl0IGZvciB0aGUgQ09OVFJPTCBQSFkKKwkJICogdG8gY29tcGxldGUsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHdlIGtpbGwgdGhlIHRpbWVyLgorCQkgKi8KKwkJZGVsX3RpbWVyX3N5bmMoJmFzY2ItPnRpbWVyKTsKKwkJV0FSTl9PTihhc2NiLT5zY2ItPmhlYWRlci5vcGNvZGUgIT0gQ09OVFJPTF9QSFkpOworCiAJCWxpc3RfZGVsX2luaXQocG9zKTsKIAkJQVNEX0RQUklOVEsoImZyZWVpbmcgZnJvbSBwZW5kaW5nXG4iKTsKIAkJYXNkX2FzY2JfZnJlZShhc2NiKTsKQEAgLTc4Niw4ICs3OTUsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNhc19kb21haW5fZnVuY3Rpb25fdGVtcGxhdGUgYWljOTR4eF90cmFuc3BvcnRfZnVuY3Rpb25zID0gewotCS5sbGRkX3BvcnRfZm9ybWVkCT0gYXNkX3VwZGF0ZV9wb3J0X2xpbmtzLAotCiAJLmxsZGRfZGV2X2ZvdW5kCQk9IGFzZF9kZXZfZm91bmQsCiAJLmxsZGRfZGV2X2dvbmUJCT0gYXNkX2Rldl9nb25lLAogCkBAIC04MTQsNiArODIxLDggQEAKIAkgMCwgMCwgMX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9SQVpPUjFFKSwKIAkgMCwgMCwgMX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9SQVpPUjFGKSwKKwkgMCwgMCwgMX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9SQVpPUjMwKSwKIAkgMCwgMCwgMn0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9SQVpPUjMyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfcmVnX2RlZi5oIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9yZWdfZGVmLmgKaW5kZXggYjc5ZjQ1Zi4uYTExZjRlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9yZWdfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9yZWdfZGVmLmgKQEAgLTIwMDAsNyArMjAwMCw3IEBACiAgKiBUaGUgaG9zdCBhY2Nlc3NlcyB0aGlzIHNjcmF0Y2ggaW4gYSBkaWZmZXJlbnQgbWFubmVyIGZyb20gdGhlCiAgKiBjZW50cmFsIHNlcXVlbmNlci4gVGhlIHNlcXVlbmNlciBoYXMgdG8gdXNlIENTRVEgcmVnaXN0ZXJzIENTQ1JQQUdFCiAgKiBhbmQgQ01uU0NSUEFHRSB0byBhY2Nlc3MgdGhlIHNjcmF0Y2ggbWVtb3J5LiBBIGZsYXQgbWFwcGluZyBvZiB0aGUKLSAqIHNjcmF0Y2ggbWVtb3J5IGlzIGF2YWxpYWJsZSBmb3Igc29mdHdhcmUgY29udmVuaWVuY2UgYW5kIHRvIHByZXZlbnQKKyAqIHNjcmF0Y2ggbWVtb3J5IGlzIGF2YWlsYWJsZSBmb3Igc29mdHdhcmUgY29udmVuaWVuY2UgYW5kIHRvIHByZXZlbnQKICAqIGNvcnJ1cHRpb24gd2hpbGUgdGhlIHNlcXVlbmNlciBpcyBydW5uaW5nLiBUaGlzIG1lbW9yeSBpcyBtYXBwZWQKICAqIG9udG8gYWRkcmVzc2VzIDgwMGggLSBCRkZoLCB0b3RhbCBvZiA0MDBoIGJ5dGVzLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2FzLmggYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3Nhcy5oCmluZGV4IDY0ZDIzMTcuLjkwNTBlOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zYXMuaApAQCAtNzMzLDYgKzczMyw3IEBACiAKIAlzdHJ1Y3Qgc2FzX2lkZW50aWZ5X2ZyYW1lICppZGVudGlmeV9mcmFtZTsKIAlzdHJ1Y3QgYXNkX2RtYV90b2sgICppZF9mcm1fdG9rOworCXN0cnVjdCBhc2RfcG9ydCAgICAgKmFzZF9wb3J0OwogCiAJdTggICAgICAgICBmcmFtZV9yY3ZkW0FTRF9FREJfU0laRV07CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zY2IuYyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2NiLmMKaW5kZXggN2VlNDliNS4uNzVlZDZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zY2IuYworKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NjYi5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAKICNpbmNsdWRlICJhaWM5NHh4LmgiCiAjaW5jbHVkZSAiYWljOTR4eF9yZWcuaCIKQEAgLTE2OCw2ICsxNjksNzAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFzZF9mb3JtX3BvcnQoc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSwgc3RydWN0IGFzZF9waHkgKnBoeSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYXNkX3BvcnQgKmZyZWVfcG9ydCA9IE5VTEw7CisJc3RydWN0IGFzZF9wb3J0ICpwb3J0OworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSA9ICZwaHktPnNhc19waHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhc2RfaGEtPmFzZF9wb3J0c19sb2NrLCBmbGFncyk7CisJaWYgKCFwaHktPmFzZF9wb3J0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBBU0RfTUFYX1BIWVM7IGkrKykgeworCQkJcG9ydCA9ICZhc2RfaGEtPmFzZF9wb3J0c1tpXTsKKworCQkJLyogQ2hlY2sgZm9yIHdpZGUgcG9ydCAqLworCQkJaWYgKHBvcnQtPm51bV9waHlzID4gMCAmJgorCQkJICAgIG1lbWNtcChwb3J0LT5zYXNfYWRkciwgc2FzX3BoeS0+c2FzX2FkZHIsCisJCQkJICAgU0FTX0FERFJfU0laRSkgPT0gMCAmJgorCQkJICAgIG1lbWNtcChwb3J0LT5hdHRhY2hlZF9zYXNfYWRkciwKKwkJCQkgICBzYXNfcGh5LT5hdHRhY2hlZF9zYXNfYWRkciwKKwkJCQkgICBTQVNfQUREUl9TSVpFKSA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEZpbmQgYSBmcmVlIHBvcnQgKi8KKwkJCWlmIChwb3J0LT5udW1fcGh5cyA9PSAwICYmIGZyZWVfcG9ydCA9PSBOVUxMKSB7CisJCQkJZnJlZV9wb3J0ID0gcG9ydDsKKwkJCX0KKwkJfQorCisJCS8qIFVzZSBhIGZyZWUgcG9ydCBpZiB0aGlzIGRvZXNuJ3QgZm9ybSBhIHdpZGUgcG9ydCAqLworCQlpZiAoaSA+PSBBU0RfTUFYX1BIWVMpIHsKKwkJCXBvcnQgPSBmcmVlX3BvcnQ7CisJCQlCVUdfT04oIXBvcnQpOworCQkJbWVtY3B5KHBvcnQtPnNhc19hZGRyLCBzYXNfcGh5LT5zYXNfYWRkciwKKwkJCSAgICAgICBTQVNfQUREUl9TSVpFKTsKKwkJCW1lbWNweShwb3J0LT5hdHRhY2hlZF9zYXNfYWRkciwKKwkJCSAgICAgICBzYXNfcGh5LT5hdHRhY2hlZF9zYXNfYWRkciwKKwkJCSAgICAgICBTQVNfQUREUl9TSVpFKTsKKwkJfQorCQlwb3J0LT5udW1fcGh5cysrOworCQlwb3J0LT5waHlfbWFzayB8PSAoMVUgPDwgc2FzX3BoeS0+aWQpOworCQlwaHktPmFzZF9wb3J0ID0gcG9ydDsKKwl9CisJQVNEX0RQUklOVEsoIiVzOiB1cGRhdGluZyBwaHlfbWFzayAweCV4IGZvciBwaHklZFxuIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgcGh5LT5hc2RfcG9ydC0+cGh5X21hc2ssIHNhc19waHktPmlkKTsKKwlhc2RfdXBkYXRlX3BvcnRfbGlua3MoYXNkX2hhLCBwaHkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzZF9oYS0+YXNkX3BvcnRzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYXNkX2RlZm9ybV9wb3J0KHN0cnVjdCBhc2RfaGFfc3RydWN0ICphc2RfaGEsIHN0cnVjdCBhc2RfcGh5ICpwaHkpCit7CisJc3RydWN0IGFzZF9wb3J0ICpwb3J0ID0gcGh5LT5hc2RfcG9ydDsKKwlzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkgPSAmcGh5LT5zYXNfcGh5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXNkX2hhLT5hc2RfcG9ydHNfbG9jaywgZmxhZ3MpOworCWlmIChwb3J0KSB7CisJCXBvcnQtPm51bV9waHlzLS07CisJCXBvcnQtPnBoeV9tYXNrICY9IH4oMVUgPDwgc2FzX3BoeS0+aWQpOworCQlwaHktPmFzZF9wb3J0ID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNkX2hhLT5hc2RfcG9ydHNfbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYXNkX2J5dGVzX2RtYWVkX3Rhc2tsZXQoc3RydWN0IGFzZF9hc2NiICphc2NiLAogCQkJCQkgICBzdHJ1Y3QgZG9uZV9saXN0X3N0cnVjdCAqZGwsCiAJCQkJCSAgIGludCBlZGJfaWQsIGludCBwaHlfaWQpCkBAIC0xODcsNiArMjUyLDcgQEAKIAlhc2RfZ2V0X2F0dGFjaGVkX3Nhc19hZGRyKHBoeSwgcGh5LT5zYXNfcGh5LmF0dGFjaGVkX3Nhc19hZGRyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaHktPnNhc19waHkuZnJhbWVfcmN2ZF9sb2NrLCBmbGFncyk7CiAJYXNkX2R1bXBfZnJhbWVfcmN2ZChwaHksIGRsKTsKKwlhc2RfZm9ybV9wb3J0KGFzY2ItPmhhLCBwaHkpOwogCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoJnBoeS0+c2FzX3BoeSwgUE9SVEVfQllURVNfRE1BRUQpOwogfQogCkBAIC0xOTcsNiArMjYzLDcgQEAKIAlzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhID0gYXNjYi0+aGE7CiAJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9ICZhc2RfaGEtPnNhc19oYTsKIAlzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkgPSBzYXNfaGEtPnNhc19waHlbcGh5X2lkXTsKKwlzdHJ1Y3QgYXNkX3BoeSAqcGh5ID0gJmFzZF9oYS0+cGh5c1twaHlfaWRdOwogCXU4IGxyX2Vycm9yID0gZGwtPnN0YXR1c19ibG9ja1sxXTsKIAl1OCByZXRyaWVzX2xlZnQgPSBkbC0+c3RhdHVzX2Jsb2NrWzJdOwogCkBAIC0yMjEsNiArMjg4LDcgQEAKIAogCWFzZF90dXJuX2xlZChhc2RfaGEsIHBoeV9pZCwgMCk7CiAJc2FzX3BoeV9kaXNjb25uZWN0ZWQoc2FzX3BoeSk7CisJYXNkX2RlZm9ybV9wb3J0KGFzZF9oYSwgcGh5KTsKIAlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX0xJTktfUkVTRVRfRVJSKTsKIAogCWlmIChyZXRyaWVzX2xlZnQgPT0gMCkgewpAQCAtMjQ4LDYgKzMxNiw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gJmFzY2ItPmhhLT5zYXNfaGE7CiAJc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5ID0gc2FzX2hhLT5zYXNfcGh5W3BoeV9pZF07CisJc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSA9IGFzY2ItPmhhOworCXN0cnVjdCBhc2RfcGh5ICpwaHkgPSAmYXNkX2hhLT5waHlzW3BoeV9pZF07CiAJdTggIHJlZyAgPSBkbC0+c3RhdHVzX2Jsb2NrWzFdOwogCXUzMiBjb250ID0gZGwtPnN0YXR1c19ibG9ja1syXSA8PCAoKHJlZyAmIDMpKjgpOwogCkBAIC0yODQsNiArMzU0LDcgQEAKIAkJCQkgICAgcGh5X2lkKTsKIAkJCS8qIFRoZSBzZXF1ZW5jZXIgZGlzYWJsZXMgYWxsIHBoeXMgb24gdGhhdCBwb3J0LgogCQkJICogV2UgaGF2ZSB0byByZS1lbmFibGUgdGhlIHBoeXMgb3Vyc2VsdmVzLiAqLworCQkJYXNkX2RlZm9ybV9wb3J0KGFzZF9oYSwgcGh5KTsKIAkJCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoc2FzX3BoeSwgUE9SVEVfSEFSRF9SRVNFVCk7CiAJCQlicmVhazsKIApAQCAtMzQyLDYgKzQxMyw0MCBAQAogCX0KIH0KIAorLyogaGFyZCByZXNldCBhIHBoeSBsYXRlciAqLworc3RhdGljIHZvaWQgZG9fcGh5X3Jlc2V0X2xhdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2FzX3BoeSAqc2FzX3BoeSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2FzX3BoeSwgcmVzZXRfd29yayk7CisJaW50IGVycm9yOworCisJQVNEX0RQUklOVEsoIiVzOiBBYm91dCB0byBoYXJkIHJlc2V0IHBoeSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICAgc2FzX3BoeS0+aWRlbnRpZnkucGh5X2lkZW50aWZpZXIpOworCS8qIFJlc2V0IGRldmljZSBwb3J0ICovCisJZXJyb3IgPSBzYXNfcGh5X3Jlc2V0KHNhc19waHksIDEpOworCWlmIChlcnJvcikKKwkJQVNEX0RQUklOVEsoIiVzOiBIYXJkIHJlc2V0IG9mIHBoeSAlZCBmYWlsZWQgKCVkKS5cbiIsCisJCQkgICAgX19GVU5DVElPTl9fLCBzYXNfcGh5LT5pZGVudGlmeS5waHlfaWRlbnRpZmllciwgZXJyb3IpOworfQorCitzdGF0aWMgdm9pZCBwaHlfcmVzZXRfbGF0ZXIoc3RydWN0IHNhc19waHkgKnNhc19waHksIHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCUlOSVRfV09SSygmc2FzX3BoeS0+cmVzZXRfd29yaywgZG9fcGh5X3Jlc2V0X2xhdGVyKTsKKwlxdWV1ZV93b3JrKHNob3N0LT53b3JrX3EsICZzYXNfcGh5LT5yZXNldF93b3JrKTsKK30KKworLyogc3RhcnQgdXAgdGhlIEFCT1JUIFRBU0sgdG1mLi4uICovCitzdGF0aWMgdm9pZCB0YXNrX2tpbGxfbGF0ZXIoc3RydWN0IGFzZF9hc2NiICphc2NiKQoreworCXN0cnVjdCBhc2RfaGFfc3RydWN0ICphc2RfaGEgPSBhc2NiLT5oYTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gJmFzZF9oYS0+c2FzX2hhOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2FzX2hhLT5jb3JlLnNob3N0OworCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGFzY2ItPnVsZGRfdGFzazsKKworCUlOSVRfV09SSygmdGFzay0+YWJvcnRfd29yaywgc2FzX3Rhc2tfYWJvcnQpOworCXF1ZXVlX3dvcmsoc2hvc3QtPndvcmtfcSwgJnRhc2stPmFib3J0X3dvcmspOworfQorCiBzdGF0aWMgdm9pZCBlc2NiX3Rhc2tsZXRfY29tcGxldGUoc3RydWN0IGFzZF9hc2NiICphc2NiLAogCQkJCSAgc3RydWN0IGRvbmVfbGlzdF9zdHJ1Y3QgKmRsKQogewpAQCAtMzUxLDYgKzQ1Niw3IEBACiAJdTggIHNiX29wY29kZSA9IGRsLT5zdGF0dXNfYmxvY2tbMF07CiAJaW50IHBoeV9pZCA9IHNiX29wY29kZSAmIERMX1BIWV9NQVNLOwogCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSA9IHNhc19oYS0+c2FzX3BoeVtwaHlfaWRdOworCXN0cnVjdCBhc2RfcGh5ICpwaHkgPSAmYXNkX2hhLT5waHlzW3BoeV9pZF07CiAKIAlpZiAoZWRiID4gNiB8fCBlZGIgPCAwKSB7CiAJCUFTRF9EUFJJTlRLKCJlZGIgaXMgMHgleCEgZGwtPm9wY29kZSBpcyAweCV4XG4iLApAQCAtMzY4LDYgKzQ3NCw3NCBAQAogCQkJICAgIGFzY2ItPnNjYi0+aGVhZGVyLm9wY29kZSk7CiAJfQogCisJLyogQ2F0Y2ggdGhlc2UgYmVmb3JlIHdlIG1hc2sgb2ZmIHRoZSBzYl9vcGNvZGUgYml0cyAqLworCXN3aXRjaCAoc2Jfb3Bjb2RlKSB7CisJY2FzZSBSRVFfVEFTS19BQk9SVDogeworCQlzdHJ1Y3QgYXNkX2FzY2IgKmEsICpiOworCQl1MTYgdGNfYWJvcnQ7CisKKwkJdGNfYWJvcnQgPSAqKCh1MTYqKSgmZGwtPnN0YXR1c19ibG9ja1sxXSkpOworCQl0Y19hYm9ydCA9IGxlMTZfdG9fY3B1KHRjX2Fib3J0KTsKKworCQlBU0RfRFBSSU5USygiJXM6IFJFUV9UQVNLX0FCT1JULCByZWFzb249MHglWFxuIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sIGRsLT5zdGF0dXNfYmxvY2tbM10pOworCisJCS8qIEZpbmQgdGhlIHBlbmRpbmcgdGFzayBhbmQgYWJvcnQgaXQuICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhLCBiLCAmYXNkX2hhLT5zZXEucGVuZF9xLCBsaXN0KQorCQkJaWYgKGEtPnRjX2luZGV4ID09IHRjX2Fib3J0KSB7CisJCQkJdGFza19raWxsX2xhdGVyKGEpOworCQkJCWJyZWFrOworCQkJfQorCQlnb3RvIG91dDsKKwl9CisJY2FzZSBSRVFfREVWSUNFX1JFU0VUOiB7CisJCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2FzX2hhLT5jb3JlLnNob3N0OworCQlzdHJ1Y3Qgc2FzX3BoeSAqZGV2X3BoeTsKKwkJc3RydWN0IGFzZF9hc2NiICphOworCQl1MTYgY29ubl9oYW5kbGU7CisKKwkJY29ubl9oYW5kbGUgPSAqKCh1MTYqKSgmZGwtPnN0YXR1c19ibG9ja1sxXSkpOworCQljb25uX2hhbmRsZSA9IGxlMTZfdG9fY3B1KGNvbm5faGFuZGxlKTsKKworCQlBU0RfRFBSSU5USygiJXM6IFJFUV9ERVZJQ0VfUkVTRVQsIHJlYXNvbj0weCVYXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgZGwtPnN0YXR1c19ibG9ja1szXSk7CisKKwkJLyogS2lsbCBhbGwgcGVuZGluZyB0YXNrcyBhbmQgcmVzZXQgdGhlIGRldmljZSAqLworCQlkZXZfcGh5ID0gTlVMTDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYXNkX2hhLT5zZXEucGVuZF9xLCBsaXN0KSB7CisJCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2s7CisJCQlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2OworCQkJdTE2IHg7CisKKwkJCXRhc2sgPSBhLT51bGRkX3Rhc2s7CisJCQlpZiAoIXRhc2spCisJCQkJY29udGludWU7CisJCQlkZXYgPSB0YXNrLT5kZXY7CisKKwkJCXggPSAodW5zaWduZWQgbG9uZylkZXYtPmxsZGRfZGV2OworCQkJaWYgKHggPT0gY29ubl9oYW5kbGUpIHsKKwkJCQlkZXZfcGh5ID0gZGV2LT5wb3J0LT5waHk7CisJCQkJdGFza19raWxsX2xhdGVyKGEpOworCQkJfQorCQl9CisKKwkJLyogUmVzZXQgZGV2aWNlIHBvcnQgKi8KKwkJaWYgKCFkZXZfcGh5KSB7CisJCQlBU0RfRFBSSU5USygiJXM6IE5vIHBlbmRpbmcgY29tbWFuZHM7IGNhbid0IHJlc2V0LlxuIiwKKwkJCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXBoeV9yZXNldF9sYXRlcihkZXZfcGh5LCBzaG9zdCk7CisJCWdvdG8gb3V0OworCX0KKwljYXNlIFNJR05BTF9OQ1FfRVJST1I6CisJCUFTRF9EUFJJTlRLKCIlczogU0lHTkFMX05DUV9FUlJPUlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJY2FzZSBDTEVBUl9OQ1FfRVJST1I6CisJCUFTRF9EUFJJTlRLKCIlczogQ0xFQVJfTkNRX0VSUk9SXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKIAlzYl9vcGNvZGUgJj0gfkRMX1BIWV9NQVNLOwogCiAJc3dpdGNoIChzYl9vcGNvZGUpIHsKQEAgLTM5NSwyNCArNTY5LDkgQEAKIAkJYXNkX3R1cm5fbGVkKGFzZF9oYSwgcGh5X2lkLCAwKTsKIAkJLyogdGhlIGRldmljZSBpcyBnb25lICovCiAJCXNhc19waHlfZGlzY29ubmVjdGVkKHNhc19waHkpOworCQlhc2RfZGVmb3JtX3BvcnQoYXNkX2hhLCBwaHkpOwogCQlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksIFBPUlRFX1RJTUVSX0VWRU5UKTsKIAkJYnJlYWs7Ci0JY2FzZSBSRVFfVEFTS19BQk9SVDoKLQkJQVNEX0RQUklOVEsoIiVzOiBwaHklZDogUkVRX1RBU0tfQUJPUlRcbiIsIF9fRlVOQ1RJT05fXywKLQkJCSAgICBwaHlfaWQpOwotCQlicmVhazsKLQljYXNlIFJFUV9ERVZJQ0VfUkVTRVQ6Ci0JCUFTRF9EUFJJTlRLKCIlczogcGh5JWQ6IFJFUV9ERVZJQ0VfUkVTRVRcbiIsIF9fRlVOQ1RJT05fXywKLQkJCSAgICBwaHlfaWQpOwotCQlicmVhazsKLQljYXNlIFNJR05BTF9OQ1FfRVJST1I6Ci0JCUFTRF9EUFJJTlRLKCIlczogcGh5JWQ6IFNJR05BTF9OQ1FfRVJST1JcbiIsIF9fRlVOQ1RJT05fXywKLQkJCSAgICBwaHlfaWQpOwotCQlicmVhazsKLQljYXNlIENMRUFSX05DUV9FUlJPUjoKLQkJQVNEX0RQUklOVEsoIiVzOiBwaHklZDogQ0xFQVJfTkNRX0VSUk9SXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgcGh5X2lkKTsKLQkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQVNEX0RQUklOVEsoIiVzOiBwaHklZDogdW5rbm93biBldmVudDoweCV4XG4iLCBfX0ZVTkNUSU9OX18sCiAJCQkgICAgcGh5X2lkLCBzYl9vcGNvZGUpOwpAQCAtNDMyLDcgKzU5MSw3IEBACiAKIAkJYnJlYWs7CiAJfQotCitvdXQ6CiAJYXNkX2ludmFsaWRhdGVfZWRiKGFzY2IsIGVkYik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2RzLmMgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3Nkcy5jCmluZGV4IDgzNTc0YjUuLmU1YTBlYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2RzLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZHMuYwpAQCAtNjQsNyArNjQsNyBAQAogCiAjZGVmaW5lIE9DTV9JTklUX0RJUl9FTlRSSUVTCTUKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIE9DTSBkaXJjZXRvcnkgZGVmYXVsdAorKiAgT0NNIGRpcmVjdG9yeSBkZWZhdWx0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IGFzZF9vY21fZGlyIE9DTURpckluaXQgPQogewpAQCAtNzMsNyArNzMsNyBAQAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgT0NNIGRpcmNldG9yeSBFbnRyaWVzIGRlZmF1bHQKKyogIE9DTSBkaXJlY3RvcnkgRW50cmllcyBkZWZhdWx0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgc3RydWN0IGFzZF9vY21fZGlyX2VudCBPQ01EaXJFbnRyaWVzSW5pdFtPQ01fSU5JVF9ESVJfRU5UUklFU10gPQogewpAQCAtNjMwLDEwICs2MzAsNiBAQAogCiAJcmVnID0gYXNkX3JlYWRfcmVnX2R3b3JkKGFzZF9oYSwgRVhTSUNORkdSKTsKIAotCWlmICghKHJlZyAmIEZMQVNIRVgpKSB7Ci0JCUFTRF9EUFJJTlRLKCJmbGFzaCBkb2Vzbid0IGV4aXN0XG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQogCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQoYXNkX2hhLT5wY2lkZXYsIFBDSV9DT05GX0ZMU0hfQkFSLAogCQkJCSAgJmFzZF9oYS0+aHdfcHJvZi5mbGFzaC5iYXIpKSB7CiAJCWFzZF9wcmludGsoImNvdWxkbid0IHJlYWQgUENJX0NPTkZfRkxTSF9CQVIgb2YgJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NlcS5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZXEuYwppbmRleCA1NmU0YjNiLi44NDUxMTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NlcS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2VxLmMKQEAgLTEzNjksMTAgKzEzNjksOSBAQAogICogcG9ydF9tYXBfYnlfbGlua3MgaXMgYWxzbyB1c2VkIGFzIHRoZSBjb25uX21hc2sgYnl0ZSBpbiB0aGUKICAqIGluaXRpYXRvci90YXJnZXQgcG9ydCBEREIuCiAgKi8KLXZvaWQgYXNkX3VwZGF0ZV9wb3J0X2xpbmtzKHN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSkKK3ZvaWQgYXNkX3VwZGF0ZV9wb3J0X2xpbmtzKHN0cnVjdCBhc2RfaGFfc3RydWN0ICphc2RfaGEsIHN0cnVjdCBhc2RfcGh5ICpwaHkpCiB7Ci0Jc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSA9IHNhc19waHktPmhhLT5sbGRkX2hhOwotCWNvbnN0IHU4IHBoeV9tYXNrID0gKHU4KSBzYXNfcGh5LT5wb3J0LT5waHlfbWFzazsKKwljb25zdCB1OCBwaHlfbWFzayA9ICh1OCkgcGh5LT5hc2RfcG9ydC0+cGh5X21hc2s7CiAJdTggIHBoeV9pc191cDsKIAl1OCAgbWFzazsKIAlpbnQgaSwgZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZXEuaCBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2VxLmgKaW5kZXggNDIyODFjMy4uOWU3MTVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZXEuaAorKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NlcS5oCkBAIC02NCw3ICs2NCw3IEBACiBpbnQgYXNkX2luaXRfc2VxcyhzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhKTsKIGludCBhc2Rfc3RhcnRfc2VxcyhzdHJ1Y3QgYXNkX2hhX3N0cnVjdCAqYXNkX2hhKTsKIAotdm9pZCBhc2RfdXBkYXRlX3BvcnRfbGlua3Moc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkpOwordm9pZCBhc2RfdXBkYXRlX3BvcnRfbGlua3Moc3RydWN0IGFzZF9oYV9zdHJ1Y3QgKmFzZF9oYSwgc3RydWN0IGFzZF9waHkgKnBoeSk7CiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGMzOTV4LmMgYi9kcml2ZXJzL3Njc2kvZGMzOTV4LmMKaW5kZXggZTk1YjM2Ny4uYTk2NWVkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RjMzk1eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9kYzM5NXguYwpAQCAtNDMxOSw3ICs0MzE5LDcgQEAKIAogCWRwcmludGtkYmcoREJHXzEsICJBbGxvY2F0ZSAlaSBwYWdlcyBmb3IgU0cgdGFibGVzXG4iLCBwYWdlcyk7CiAJd2hpbGUgKHBhZ2VzLS0pIHsKLQkJcHRyID0gKHN0cnVjdCBTR2VudHJ5ICopa21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCQlwdHIgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcHRyKSB7CiAJCQlhZGFwdGVyX3NnX3RhYmxlc19mcmVlKGFjYik7CiAJCQlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHQvZHB0aV9pMm8uaCBiL2RyaXZlcnMvc2NzaS9kcHQvZHB0aV9pMm8uaAppbmRleCBiM2ZhN2VkLi41YTQ5MjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZHB0L2RwdGlfaTJvLmgKKysrIGIvZHJpdmVycy9zY3NpL2RwdC9kcHRpX2kyby5oCkBAIC00OSw3ICs0OSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiB0eXBlZGVmIHdhaXRfcXVldWVfaGVhZF90IGFkcHRfd2FpdF9xdWV1ZV9oZWFkX3Q7Ci0jZGVmaW5lIEFEUFRfREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod2FpdCkgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod2FpdCkKKyNkZWZpbmUgQURQVF9ERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0KSBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKHdhaXQpCiB0eXBlZGVmIHdhaXRfcXVldWVfdCBhZHB0X3dhaXRfcXVldWVfdDsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMgYi9kcml2ZXJzL3Njc2kvZHB0X2kyby5jCmluZGV4IDYwYjFiNDMuLjM2NWRiNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKKysrIGIvZHJpdmVycy9zY3NpL2RwdF9pMm8uYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJczMyIHJjb2RlOwogCiAJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKG1zZykpOwotCWJ1ZiA9ICh1OCopa21hbGxvYyg4MCxHRlBfS0VSTkVMfEFERFIzMik7CisJYnVmID0ga21hbGxvYyg4MCxHRlBfS0VSTkVMfEFERFIzMik7CiAJaWYoIWJ1Zil7CiAJCXByaW50ayhLRVJOX0VSUiIlczogQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlclxuIixwSGJhLT5uYW1lKTsKIAkJcmV0dXJuOwpAQCAtMTMxMSw3ICsxMzExLDcgQEAKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJfSB3aGlsZSAobSA9PSBFTVBUWV9RVUVVRSk7CiAKLQlzdGF0dXMgPSAodTgqKWttYWxsb2MoNCwgR0ZQX0tFUk5FTHxBRERSMzIpOworCXN0YXR1cyA9IGttYWxsb2MoNCwgR0ZQX0tFUk5FTHxBRERSMzIpOwogCWlmKHN0YXR1cyA9PSBOVUxMKSB7CiAJCWFkcHRfc2VuZF9ub3AocEhiYSwgbSk7CiAJCXByaW50ayhLRVJOX0VSUiJJT1AgcmVzZXQgZmFpbGVkIC0gbm8gZnJlZSBtZW1vcnkuXG4iKTsKQEAgLTE0NDQsNyArMTQ0NCw3IEBACiAJCQl9CiAJCQljb250aW51ZTsKIAkJfQotCQlkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGkyb19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMm9fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJCWlmKGQ9PU5VTEwpCiAJCXsKIAkJCXByaW50ayhLRVJOX0NSSVQiJXM6IE91dCBvZiBtZW1vcnkgZm9yIEkyTyBkZXZpY2UgZGF0YS5cbiIscEhiYS0+bmFtZSk7CkBAIC0yNDI1LDcgKzI0MjUsNyBAQAogCQkJCXBEZXYgPSBwRGV2LT5uZXh0X2x1bjsKIAkJCX0KIAkJCWlmKCFwRGV2ICkgeyAvLyBTb21ldGhpbmcgbmV3IGFkZCBpdAotCQkJCWQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJvX2RldmljZSksIEdGUF9LRVJORUwpOworCQkJCWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJvX2RldmljZSksIEdGUF9LRVJORUwpOwogCQkJCWlmKGQ9PU5VTEwpCiAJCQkJewogCQkJCQlwcmludGsoS0VSTl9DUklUICJPdXQgb2YgbWVtb3J5IGZvciBJMk8gZGV2aWNlIGRhdGEuXG4iKTsKQEAgLTI3MjgsNyArMjcyOCw3IEBACiAKIAlrZnJlZShwSGJhLT5yZXBseV9wb29sKTsKIAotCXBIYmEtPnJlcGx5X3Bvb2wgPSAodTMyKilrbWFsbG9jKHBIYmEtPnJlcGx5X2ZpZm9fc2l6ZSAqIFJFUExZX0ZSQU1FX1NJWkUgKiA0LCBHRlBfS0VSTkVMfEFERFIzMik7CisJcEhiYS0+cmVwbHlfcG9vbCA9IGttYWxsb2MocEhiYS0+cmVwbHlfZmlmb19zaXplICogUkVQTFlfRlJBTUVfU0laRSAqIDQsIEdGUF9LRVJORUx8QUREUjMyKTsKIAlpZighcEhiYS0+cmVwbHlfcG9vbCl7CiAJCXByaW50ayhLRVJOX0VSUiIlczogQ291bGQgbm90IGFsbG9jYXRlIHJlcGx5IHBvb2xcbiIscEhiYS0+bmFtZSk7CiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhX3Bpby5jIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKaW5kZXggODExZDg4NC4uMmRiYjY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKKysrIGIvZHJpdmVycy9zY3NpL2VhdGFfcGlvLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCWlycXJldHVybl90IHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JcmV0ID0gZWF0YV9waW9faW50X2hhbmRsZXIoaXJxLCBkZXZfaWQsIHJlZ3MpOworCXJldCA9IGVhdGFfcGlvX2ludF9oYW5kbGVyKGlycSwgZGV2X2lkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mZF9tY3MuYyBiL2RyaXZlcnMvc2NzaS9mZF9tY3MuYwppbmRleCBlZjgyODVjLi42Njg1NjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmRfbWNzLmMKKysrIGIvZHJpdmVycy9zY3NpL2ZkX21jcy5jCkBAIC0yOTQsNiArMjk0LDcgQEAKIHN0YXRpYyBpbnQgdXNlcl9maWZvX2NvdW50ID0gMDsKIHN0YXRpYyBpbnQgdXNlcl9maWZvX3NpemUgPSAwOwogCisjaWZuZGVmIE1PRFVMRQogc3RhdGljIGludCBfX2luaXQgZmRfbWNzX3NldHVwKGNoYXIgKnN0cikKIHsKIAlzdGF0aWMgaW50IGRvbmVfc2V0dXAgPSAwOwpAQCAtMzExLDYgKzMxMiw3IEBACiB9CiAKIF9fc2V0dXAoImZkX21jcz0iLCBmZF9tY3Nfc2V0dXApOworI2VuZGlmIC8qICFNT0RVTEUgKi8KIAogc3RhdGljIHZvaWQgcHJpbnRfYmFubmVyKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zkb21haW4uYyBiL2RyaXZlcnMvc2NzaS9mZG9tYWluLmMKaW5kZXggNzI3OTRhNy4uNWQ0ZWE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zkb21haW4uYworKysgYi9kcml2ZXJzL3Njc2kvZmRvbWFpbi5jCkBAIC0zODcsNiArMzg3LDcgQEAKIHN0YXRpYyBpbnQgICAgICAgICAgICAgICBiaW9zX21ham9yOwogc3RhdGljIGludCAgICAgICAgICAgICAgIGJpb3NfbWlub3I7CiBzdGF0aWMgaW50ICAgICAgICAgICAgICAgUENJX2J1czsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldgkqUENJX2RldjsKIHN0YXRpYyBpbnQgICAgICAgICAgICAgICBRdWFudHVtOwkvKiBRdWFudHVtIGJvYXJkIHZhcmlhbnQgKi8KIHN0YXRpYyBpbnQgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWw7CiBzdGF0aWMgdm9sYXRpbGUgaW50ICAgICAgaW5fY29tbWFuZDsKQEAgLTgxMiw5ICs4MTMsMTAgQEAKIAkgICBQQ0lfREVWSUNFX0lEX0ZEXzM2QzcwICk7CiAjZW5kaWYgCiAKLSAgIGlmICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0ZELCBQQ0lfREVWSUNFX0lEX0ZEXzM2QzcwLCBwZGV2KSkgPT0gTlVMTCkKKyAgIGlmICgocGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfRkQsIFBDSV9ERVZJQ0VfSURfRkRfMzZDNzAsIHBkZXYpKSA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLSAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgcmV0dXJuIDA7CisgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisgICAJZ290byBmYWlsOwogICAgICAgIAogI2lmIERFQlVHX0RFVEVDVAogICAgcHJpbnRrKCAic2NzaTogPGZkb21haW4+IFRNQy0zMjYwIGRldGVjdDoiCkBAIC04MzEsNyArODMzLDcgQEAKICAgIHBjaV9pcnEgPSBwZGV2LT5pcnE7CiAKICAgIGlmICghcmVxdWVzdF9yZWdpb24oIHBjaV9iYXNlLCAweDEwLCAiZmRvbWFpbiIgKSkKLQlyZXR1cm4gMDsKKyAgIAlnb3RvIGZhaWw7CiAKICAgIC8qIE5vdyB3ZSBoYXZlIHRoZSBJL08gYmFzZSBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgZnJvbSB0aGUgUENJCiAgICAgICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4gKi8KQEAgLTg0OCwxNyArODUwLDIyIEBACiAgICBpZiAoIWZkb21haW5faXNfdmFsaWRfcG9ydChwY2lfYmFzZSkpIHsKICAgICAgIHByaW50ayhLRVJOX0VSUiAic2NzaTogPGZkb21haW4+IFBDSSBjYXJkIGRldGVjdGVkLCBidXQgZHJpdmVyIG5vdCBsb2FkZWQgKGludmFsaWQgcG9ydClcbiIgKTsKICAgICAgIHJlbGVhc2VfcmVnaW9uKHBjaV9iYXNlLCAweDEwKTsKLSAgICAgIHJldHVybiAwOworICAgICAgZ290byBmYWlsOwogICAgfQogCiAJCQkJLyogRmlsbCBpbiBhIGZldyBnbG9iYWwgdmFyaWFibGVzLiAgVWdoLiAqLwogICAgYmlvc19tYWpvciA9IGJpb3NfbWlub3IgPSAtMTsKICAgIFBDSV9idXMgICAgPSAxOworICAgUENJX2RldiAgICA9IHBkZXY7CiAgICBRdWFudHVtICAgID0gMDsKICAgIGJpb3NfYmFzZSAgPSAwOwogICAgCiAgICByZXR1cm4gMTsKK2ZhaWw6CisgICBwY2lfZGV2X3B1dChwZGV2KTsKKyAgIHJldHVybiAwOwogfQorCiAjZW5kaWYKIAogc3RydWN0IFNjc2lfSG9zdCAqX19mZG9tYWluXzE2eDBfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQgKQpAQCAtOTA5LDggKzkxNiw3IEBACiAgICAgICBpZiAoc2V0dXBfY2FsbGVkKSB7CiAJIHByaW50ayhLRVJOX0VSUiAic2NzaTogPGZkb21haW4+IEJhZCBMSUxPL0lOU01PRCBwYXJhbWV0ZXJzP1xuIik7CiAgICAgICB9Ci0gICAgICByZWxlYXNlX3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTApOwotICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBnb3RvIGZhaWw7CiAgICB9CiAKICAgIGlmICh0aGlzX2lkKSB7CkBAIC05NDIsOCArOTQ4LDcgQEAKICAgIC8qIExvZyBJUlEgd2l0aCBrZXJuZWwgKi8gICAKICAgIGlmICghaW50ZXJydXB0X2xldmVsKSB7CiAgICAgICBwcmludGsoS0VSTl9FUlIgInNjc2k6IDxmZG9tYWluPiBDYXJkIERldGVjdGVkLCBidXQgZHJpdmVyIG5vdCBsb2FkZWQgKG5vIElSUSlcbiIgKTsKLSAgICAgIHJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7Ci0gICAgICByZXR1cm4gTlVMTDsKKyAgICAgIGdvdG8gZmFpbDsKICAgIH0gZWxzZSB7CiAgICAgICAvKiBSZWdpc3RlciB0aGUgSVJRIHdpdGggdGhlIGtlcm5lbCAqLwogCkBAIC05NjQsMTEgKzk2OSwxNCBAQAogCSAgICBwcmludGsoS0VSTl9FUlIgIiAgICAgICAgICAgICAgICBTZW5kIG1haWwgdG8gZmFpdGhAYWNtLm9yZ1xuIiApOwogCSB9CiAJIHByaW50ayhLRVJOX0VSUiAic2NzaTogPGZkb21haW4+IERldGVjdGVkLCBidXQgZHJpdmVyIG5vdCBsb2FkZWQgKElSUSlcbiIgKTsKLSAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgMHgxMCk7Ci0JIHJldHVybiBOVUxMOworCSBnb3RvIGZhaWw7CiAgICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hwbnQ7CitmYWlsOgorICAgcGNpX2Rldl9wdXQocGRldik7CisgICByZWxlYXNlX3JlZ2lvbihwb3J0X2Jhc2UsIDB4MTApOworICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgZmRvbWFpbl8xNngwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQpAQCAtMTcxNCw2ICsxNzIyLDggQEAKIAkJZnJlZV9pcnEoc2hwbnQtPmlycSwgc2hwbnQpOwogCWlmIChzaHBudC0+aW9fcG9ydCAmJiBzaHBudC0+bl9pb19wb3J0KQogCQlyZWxlYXNlX3JlZ2lvbihzaHBudC0+aW9fcG9ydCwgc2hwbnQtPm5faW9fcG9ydCk7CisJaWYgKFBDSV9idXMpCisJCXBjaV9kZXZfcHV0KFBDSV9kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzM2LDYgKzE3NDYsMTUgQEAKIH07CiAKICNpZm5kZWYgUENNQ0lBCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBmZG9tYWluX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9GRCwgUENJX0RFVklDRV9JRF9GRF8zNkM3MCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBmZG9tYWluX3BjaV90YmwpOworCiAjZGVmaW5lIGRyaXZlcl90ZW1wbGF0ZSBmZG9tYWluX2RyaXZlcl90ZW1wbGF0ZQogI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2dkdGguYyBiL2RyaXZlcnMvc2NzaS9nZHRoLmMKaW5kZXggNGJjMTRhZC4uNGM2OThhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2dkdGguYworKysgYi9kcml2ZXJzL3Njc2kvZ2R0aC5jCkBAIC0zNTMxLDcgKzM1MzEsNyBAQAogICAgICAgICAgICAgICAgIElTdGF0dXMgJj0gfjB4ODA7CiAjaWZkZWYgSU5UX0NPQUwKICAgICAgICAgICAgICAgICBpZiAoY29hbGVzY2VkKQotICAgICAgICAgICAgICAgICAgICBoYS0+c3RhdHVzID0gcGNzLT5leHRfc3RhdHVzICYmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgaGEtPnN0YXR1cyA9IHBjcy0+ZXh0X3N0YXR1cyAmIDB4ZmZmZjsKICAgICAgICAgICAgICAgICBlbHNlIAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIGhhLT5zdGF0dXMgPSBnZHRoX3JlYWR3KCZkcDZtX3B0ci0+aTk2MHIuc3RhdHVzKTsKQEAgLTM1NDMsNyArMzU0Myw3IEBACiAgICAgICAgICAgICBpZiAoY29hbGVzY2VkKSB7ICAgIAogICAgICAgICAgICAgICAgIGhhLT5pbmZvID0gcGNzLT5pbmZvMDsKICAgICAgICAgICAgICAgICBoYS0+aW5mbzIgPSBwY3MtPmluZm8xOwotICAgICAgICAgICAgICAgIGhhLT5zZXJ2aWNlID0gKHBjcy0+ZXh0X3N0YXR1cyA+PiAxNikgJiYgMHhmZmZmOworICAgICAgICAgICAgICAgIGhhLT5zZXJ2aWNlID0gKHBjcy0+ZXh0X3N0YXR1cyA+PiAxNikgJiAweGZmZmY7CiAgICAgICAgICAgICB9IGVsc2UKICNlbmRpZgogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCA2OGVmMTYzLi4zOGMzYTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtMjYzLDYgKzI2MywxMCBAQAogCQlrdGhyZWFkX3N0b3Aoc2hvc3QtPmVoYW5kbGVyKTsKIAlpZiAoc2hvc3QtPndvcmtfcSkKIAkJZGVzdHJveV93b3JrcXVldWUoc2hvc3QtPndvcmtfcSk7CisJaWYgKHNob3N0LT51c3BhY2VfcmVxX3EpIHsKKwkJa2ZyZWUoc2hvc3QtPnVzcGFjZV9yZXFfcS0+cXVldWVkYXRhKTsKKwkJc2NzaV9mcmVlX3F1ZXVlKHNob3N0LT51c3BhY2VfcmVxX3EpOworCX0KIAogCXNjc2lfZGVzdHJveV9jb21tYW5kX2ZyZWVsaXN0KHNob3N0KTsKIAlpZiAoc2hvc3QtPmJxdCkKQEAgLTMwMSw4ICszMDUsOCBAQAogCWlmICghc2hvc3QpCiAJCXJldHVybiBOVUxMOwogCi0Jc3Bpbl9sb2NrX2luaXQoJnNob3N0LT5kZWZhdWx0X2xvY2spOwotCXNjc2lfYXNzaWduX2xvY2soc2hvc3QsICZzaG9zdC0+ZGVmYXVsdF9sb2NrKTsKKwlzaG9zdC0+aG9zdF9sb2NrID0gJnNob3N0LT5kZWZhdWx0X2xvY2s7CisJc3Bpbl9sb2NrX2luaXQoc2hvc3QtPmhvc3RfbG9jayk7CiAJc2hvc3QtPnNob3N0X3N0YXRlID0gU0hPU1RfQ1JFQVRFRDsKIAlJTklUX0xJU1RfSEVBRCgmc2hvc3QtPl9fZGV2aWNlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNob3N0LT5fX3RhcmdldHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL01ha2VmaWxlCmluZGV4IDRlMjQ3YjYuLjZhYzA2MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvTWFrZWZpbGUKQEAgLTMsMyArMyw1IEBACiBpYm12c2NzaWMteQkJCSs9IGlibXZzY3NpLm8KIGlibXZzY3NpYy0kKENPTkZJR19QUENfSVNFUklFUykJKz0gaXNlcmllc192c2NzaS5vIAogaWJtdnNjc2ljLSQoQ09ORklHX1BQQ19QU0VSSUVTKQkrPSBycGFfdnNjc2kubyAKKworb2JqLSQoQ09ORklHX1NDU0lfSUJNVlNDU0lTKQkrPSBpYm12c3RndC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCmluZGV4IDY2OWVhNGYuLmZiYzFkNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jCkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogCQkJICAgICAgICJpYm12c2NzaTogUmUtZW5hYmxpbmcgYWRhcHRlciFcbiIpOwogCQkJcHVyZ2VfcmVxdWVzdHMoaG9zdGRhdGEsIERJRF9SRVFVRVVFKTsKIAkJCWlmICgoaWJtdnNjc2lfcmVlbmFibGVfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsCi0JCQkJCQkJaG9zdGRhdGEpID09IDApIHx8CisJCQkJCQkJaG9zdGRhdGEpKSB8fAogCQkJICAgIChpYm12c2NzaV9zZW5kX2NycShob3N0ZGF0YSwKIAkJCQkJICAgICAgIDB4QzAwMTAwMDAwMDAwMDAwMExMLCAwKSkpIHsKIAkJCQkJYXRvbWljX3NldCgmaG9zdGRhdGEtPnJlcXVlc3RfbGltaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c3RndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODI2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYwpAQCAtMCwwICsxLDk2MCBAQAorLyoKKyAqIElCTSBlU2VydmVyIGkvcFNlcmllcyBWaXJ0dWFsIFNDU0kgVGFyZ2V0IERyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgRGF2ZSBCb3V0Y2hlciAoYm91dGNoZXJAdXMuaWJtLmNvbSkgSUJNIENvcnAuCisgKgkJCSAgIFNhbnRpYWdvIExlb24gKHNhbnRpbEB1cy5pYm0uY29tKSBJQk0gQ29ycC4KKyAqCQkJICAgTGluZGEgWGllIChseGllQHVzLmlibS5jb20pIElCTSBDb3JwLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEZVSklUQSBUb21vbm9yaSA8dG9tb2ZAYWNtLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgKiBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RndC5oPgorI2luY2x1ZGUgPHNjc2kvbGlic3JwLmg+CisjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorCisjaW5jbHVkZSAiaWJtdnNjc2kuaCIKKworI2RlZmluZQlJTklUSUFMX1NSUF9MSU1JVAkxNgorI2RlZmluZQlERUZBVUxUX01BWF9TRUNUT1JTCTUxMgorCisjZGVmaW5lCVRHVF9OQU1FCSJpYm12c3RndCIKKworLyoKKyAqIEh5cGVydmlzb3IgY2FsbHMuCisgKi8KKyNkZWZpbmUgaF9jb3B5X3JkbWEobCwgc2EsIHNiLCBkYSwgZGIpIFwKKwkJCXBscGFyX2hjYWxsX25vcmV0cyhIX0NPUFlfUkRNQSwgbCwgc2EsIHNiLCBkYSwgZGIpCisjZGVmaW5lIGhfc2VuZF9jcnEodWEsIGwsIGgpIFwKKwkJCXBscGFyX2hjYWxsX25vcmV0cyhIX1NFTkRfQ1JRLCB1YSwgbCwgaCkKKyNkZWZpbmUgaF9yZWdfY3JxKHVhLCB0b2ssIHN6KVwKKwkJCXBscGFyX2hjYWxsX25vcmV0cyhIX1JFR19DUlEsIHVhLCB0b2ssIHN6KTsKKyNkZWZpbmUgaF9mcmVlX2NycSh1YSkgXAorCQkJcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9DUlEsIHVhKTsKKworLyogdG1wIC0gd2lsbCByZXBsYWNlIHdpdGggU0NTSSBsb2dnaW5nIHN0dWZmICovCisjZGVmaW5lIGVwcmludGsoZm10LCBhcmdzLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCXByaW50aygiJXMoJWQpICIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI2FyZ3MpOwlcCit9IHdoaWxlICgwKQorLyogI2RlZmluZSBkcHJpbnRrIGVwcmludGsgKi8KKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pCisKK3N0cnVjdCB2aW9fcG9ydCB7CisJc3RydWN0IHZpb19kZXYgKmRtYV9kZXY7CisKKwlzdHJ1Y3QgY3JxX3F1ZXVlIGNycV9xdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY3JxX3dvcms7CisKKwl1bnNpZ25lZCBsb25nIGxpb2JuOworCXVuc2lnbmVkIGxvbmcgcmlvYm47CisJc3RydWN0IHNycF90YXJnZXQgKnRhcmdldDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdnRndGQ7CisKKy8qCisgKiBUaGVzZSBhcmUgZml4ZWQgZm9yIHRoZSBzeXN0ZW0gYW5kIGNvbWUgZnJvbSB0aGUgT3BlbiBGaXJtd2FyZSBkZXZpY2UgdHJlZS4KKyAqIFdlIGp1c3Qgc3RvcmUgdGhlbSBoZXJlIHRvIHNhdmUgZ2V0dGluZyB0aGVtIGV2ZXJ5IHRpbWUuCisgKi8KK3N0YXRpYyBjaGFyIHN5c3RlbV9pZFs2NF0gPSAiIjsKK3N0YXRpYyBjaGFyIHBhcnRpdGlvbl9uYW1lWzk3XSA9ICJVTktOT1dOIjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFydGl0aW9uX251bWJlciA9IC0xOworCitzdGF0aWMgc3RydWN0IHZpb19wb3J0ICp0YXJnZXRfdG9fcG9ydChzdHJ1Y3Qgc3JwX3RhcmdldCAqdGFyZ2V0KQoreworCXJldHVybiAoc3RydWN0IHZpb19wb3J0ICopIHRhcmdldC0+bGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5pb24gdmlvc3JwX2l1ICp2aW9faXUoc3RydWN0IGl1X2VudHJ5ICppdWUpCit7CisJcmV0dXJuICh1bmlvbiB2aW9zcnBfaXUgKikgKGl1ZS0+c2J1Zi0+YnVmKTsKK30KKworc3RhdGljIGludCBzZW5kX2l1KHN0cnVjdCBpdV9lbnRyeSAqaXVlLCB1aW50NjRfdCBsZW5ndGgsIHVpbnQ4X3QgZm9ybWF0KQoreworCXN0cnVjdCBzcnBfdGFyZ2V0ICp0YXJnZXQgPSBpdWUtPnRhcmdldDsKKwlzdHJ1Y3QgdmlvX3BvcnQgKnZwb3J0ID0gdGFyZ2V0X3RvX3BvcnQodGFyZ2V0KTsKKwlsb25nIHJjLCByYzE7CisJdW5pb24geworCQlzdHJ1Y3Qgdmlvc3JwX2NycSBjb29rZWQ7CisJCXVpbnQ2NF90IHJhd1syXTsKKwl9IGNycTsKKworCS8qIEZpcnN0IGNvcHkgdGhlIFNSUCAqLworCXJjID0gaF9jb3B5X3JkbWEobGVuZ3RoLCB2cG9ydC0+bGlvYm4sIGl1ZS0+c2J1Zi0+ZG1hLAorCQkJIHZwb3J0LT5yaW9ibiwgaXVlLT5yZW1vdGVfdG9rZW4pOworCisJaWYgKHJjKQorCQllcHJpbnRrKCJFcnJvciAlbGQgdHJhbnNmZXJyaW5nIGRhdGFcbiIsIHJjKTsKKworCWNycS5jb29rZWQudmFsaWQgPSAweDgwOworCWNycS5jb29rZWQuZm9ybWF0ID0gZm9ybWF0OworCWNycS5jb29rZWQucmVzZXJ2ZWQgPSAweDAwOworCWNycS5jb29rZWQudGltZW91dCA9IDB4MDA7CisJY3JxLmNvb2tlZC5JVV9sZW5ndGggPSBsZW5ndGg7CisJY3JxLmNvb2tlZC5JVV9kYXRhX3B0ciA9IHZpb19pdShpdWUpLT5zcnAucnNwLnRhZzsKKworCWlmIChyYyA9PSAwKQorCQljcnEuY29va2VkLnN0YXR1cyA9IDB4OTk7CS8qIEp1c3QgbmVlZHMgdG8gYmUgbm9uLXplcm8gKi8KKwllbHNlCisJCWNycS5jb29rZWQuc3RhdHVzID0gMHgwMDsKKworCXJjMSA9IGhfc2VuZF9jcnEodnBvcnQtPmRtYV9kZXYtPnVuaXRfYWRkcmVzcywgY3JxLnJhd1swXSwgY3JxLnJhd1sxXSk7CisKKwlpZiAocmMxKSB7CisJCWVwcmludGsoIiVsZCBzZW5kaW5nIHJlc3BvbnNlXG4iLCByYzEpOworCQlyZXR1cm4gcmMxOworCX0KKworCXJldHVybiByYzsKK30KKworI2RlZmluZSBTUlBfUlNQX1NFTlNFX0RBVEFfTEVOCTE4CisKK3N0YXRpYyBpbnQgc2VuZF9yc3Aoc3RydWN0IGl1X2VudHJ5ICppdWUsIHN0cnVjdCBzY3NpX2NtbmQgKnNjLAorCQkgICAgdW5zaWduZWQgY2hhciBzdGF0dXMsIHVuc2lnbmVkIGNoYXIgYXNjKQoreworCXVuaW9uIHZpb3NycF9pdSAqaXUgPSB2aW9faXUoaXVlKTsKKwl1aW50NjRfdCB0YWcgPSBpdS0+c3JwLnJzcC50YWc7CisKKwkvKiBJZiB0aGUgbGlua2VkIGJpdCBpcyBvbiBhbmQgc3RhdHVzIGlzIGdvb2QgKi8KKwlpZiAodGVzdF9iaXQoVl9MSU5LRUQsICZpdWUtPmZsYWdzKSAmJiAoc3RhdHVzID09IE5PX1NFTlNFKSkKKwkJc3RhdHVzID0gMHgxMDsKKworCW1lbXNldChpdSwgMCwgc2l6ZW9mKHN0cnVjdCBzcnBfcnNwKSk7CisJaXUtPnNycC5yc3Aub3Bjb2RlID0gU1JQX1JTUDsKKwlpdS0+c3JwLnJzcC5yZXFfbGltX2RlbHRhID0gMTsKKwlpdS0+c3JwLnJzcC50YWcgPSB0YWc7CisKKwlpZiAodGVzdF9iaXQoVl9ESU9WRVIsICZpdWUtPmZsYWdzKSkKKwkJaXUtPnNycC5yc3AuZmxhZ3MgfD0gU1JQX1JTUF9GTEFHX0RJT1ZFUjsKKworCWl1LT5zcnAucnNwLmRhdGFfaW5fcmVzX2NudCA9IDA7CisJaXUtPnNycC5yc3AuZGF0YV9vdXRfcmVzX2NudCA9IDA7CisKKwlpdS0+c3JwLnJzcC5mbGFncyAmPSB+U1JQX1JTUF9GTEFHX1JTUFZBTElEOworCisJaXUtPnNycC5yc3AucmVzcF9kYXRhX2xlbiA9IDA7CisJaXUtPnNycC5yc3Auc3RhdHVzID0gc3RhdHVzOworCWlmIChzdGF0dXMpIHsKKwkJdWludDhfdCAqc2Vuc2UgPSBpdS0+c3JwLnJzcC5kYXRhOworCisJCWlmIChzYykgeworCQkJaXUtPnNycC5yc3AuZmxhZ3MgfD0gU1JQX1JTUF9GTEFHX1NOU1ZBTElEOworCQkJaXUtPnNycC5yc3Auc2Vuc2VfZGF0YV9sZW4gPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJCQltZW1jcHkoc2Vuc2UsIHNjLT5zZW5zZV9idWZmZXIsIFNDU0lfU0VOU0VfQlVGRkVSU0laRSk7CisJCX0gZWxzZSB7CisJCQlpdS0+c3JwLnJzcC5zdGF0dXMgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCQlpdS0+c3JwLnJzcC5mbGFncyB8PSBTUlBfUlNQX0ZMQUdfU05TVkFMSUQ7CisJCQlpdS0+c3JwLnJzcC5zZW5zZV9kYXRhX2xlbiA9IFNSUF9SU1BfU0VOU0VfREFUQV9MRU47CisKKwkJCS8qIFZhbGlkIGJpdCBhbmQgJ2N1cnJlbnQgZXJyb3JzJyAqLworCQkJc2Vuc2VbMF0gPSAoMHgxIDw8IDcgfCAweDcwKTsKKwkJCS8qIFNlbnNlIGtleSAqLworCQkJc2Vuc2VbMl0gPSBzdGF0dXM7CisJCQkvKiBBZGRpdGlvbmFsIHNlbnNlIGxlbmd0aCAqLworCQkJc2Vuc2VbN10gPSAweGE7CS8qIDEwIGJ5dGVzICovCisJCQkvKiBBZGRpdGlvbmFsIHNlbnNlIGNvZGUgKi8KKwkJCXNlbnNlWzEyXSA9IGFzYzsKKwkJfQorCX0KKworCXNlbmRfaXUoaXVlLCBzaXplb2YoaXUtPnNycC5yc3ApICsgU1JQX1JTUF9TRU5TRV9EQVRBX0xFTiwKKwkJVklPU1JQX1NSUF9GT1JNQVQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jbWRfcXVldWUoc3RydWN0IHNycF90YXJnZXQgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRhcmdldC0+c2hvc3Q7CisJc3RydWN0IGl1X2VudHJ5ICppdWU7CisJc3RydWN0IHNycF9jbWQgKmNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKK3JldHJ5OgorCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXVlLCAmdGFyZ2V0LT5jbWRfcXVldWUsIGlsaXN0KSB7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChWX0ZMWUlORywgJml1ZS0+ZmxhZ3MpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKwkJCWNtZCA9IGl1ZS0+c2J1Zi0+YnVmOworCQkJZXJyID0gc3JwX2NtZF9xdWV1ZShzaG9zdCwgY21kLCBpdWUsIDApOworCQkJaWYgKGVycikgeworCQkJCWVwcmludGsoImNhbm5vdCBxdWV1ZSBjbWQgJXAgJWRcbiIsIGNtZCwgZXJyKTsKKwkJCQlzcnBfaXVfcHV0KGl1ZSk7CisJCQl9CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgaWJtdnN0Z3RfcmRtYShzdHJ1Y3Qgc2NzaV9jbW5kICpzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5zZywKKwkJCSBzdHJ1Y3Qgc3JwX2RpcmVjdF9idWYgKm1kLCBpbnQgbm1kLAorCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdW5zaWduZWQgaW50IHJlc3QpCit7CisJc3RydWN0IGl1X2VudHJ5ICppdWUgPSAoc3RydWN0IGl1X2VudHJ5ICopIHNjLT5TQ3AucHRyOworCXN0cnVjdCBzcnBfdGFyZ2V0ICp0YXJnZXQgPSBpdWUtPnRhcmdldDsKKwlzdHJ1Y3QgdmlvX3BvcnQgKnZwb3J0ID0gdGFyZ2V0X3RvX3BvcnQodGFyZ2V0KTsKKwlkbWFfYWRkcl90IHRva2VuOworCWxvbmcgZXJyOworCXVuc2lnbmVkIGludCBkb25lID0gMDsKKwlpbnQgaSwgc2lkeCwgc29mZjsKKworCXNpZHggPSBzb2ZmID0gMDsKKwl0b2tlbiA9IHNnX2RtYV9hZGRyZXNzKHNnICsgc2lkeCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbm1kICYmIHJlc3Q7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgbWRvbmUsIG1sZW47CisKKwkJbWxlbiA9IG1pbihyZXN0LCBtZFtpXS5sZW4pOworCQlmb3IgKG1kb25lID0gMDsgbWxlbjspIHsKKwkJCWludCBzbGVuID0gbWluKHNnX2RtYV9sZW4oc2cgKyBzaWR4KSAtIHNvZmYsIG1sZW4pOworCisJCQlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UpCisJCQkJZXJyID0gaF9jb3B5X3JkbWEoc2xlbiwKKwkJCQkJCSAgdnBvcnQtPnJpb2JuLAorCQkJCQkJICBtZFtpXS52YSArIG1kb25lLAorCQkJCQkJICB2cG9ydC0+bGlvYm4sCisJCQkJCQkgIHRva2VuICsgc29mZik7CisJCQllbHNlCisJCQkJZXJyID0gaF9jb3B5X3JkbWEoc2xlbiwKKwkJCQkJCSAgdnBvcnQtPmxpb2JuLAorCQkJCQkJICB0b2tlbiArIHNvZmYsCisJCQkJCQkgIHZwb3J0LT5yaW9ibiwKKwkJCQkJCSAgbWRbaV0udmEgKyBtZG9uZSk7CisKKwkJCWlmIChlcnIgIT0gSF9TVUNDRVNTKSB7CisJCQkJZXByaW50aygicmRtYSBlcnJvciAlZCAlZFxuIiwgZGlyLCBzbGVuKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJbWxlbiAtPSBzbGVuOworCQkJbWRvbmUgKz0gc2xlbjsKKwkJCXNvZmYgKz0gc2xlbjsKKwkJCWRvbmUgKz0gc2xlbjsKKworCQkJaWYgKHNvZmYgPT0gc2dfZG1hX2xlbihzZyArIHNpZHgpKSB7CisJCQkJc2lkeCsrOworCQkJCXNvZmYgPSAwOworCQkJCXRva2VuID0gc2dfZG1hX2FkZHJlc3Moc2cgKyBzaWR4KTsKKworCQkJCWlmIChzaWR4ID4gbnNnKSB7CisJCQkJCWVwcmludGsoIm91dCBvZiBzZyAlcCAlZCAlZFxuIiwKKwkJCQkJCWl1ZSwgc2lkeCwgbnNnKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9OworCisJCXJlc3QgLT0gbWxlbjsKKwl9CitvdXQ6CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpYm12c3RndF90cmFuc2Zlcl9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKnNjLAorCQkJCSAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IGl1X2VudHJ5CSppdWUgPSAoc3RydWN0IGl1X2VudHJ5ICopIHNjLT5TQ3AucHRyOworCWludCBlcnI7CisKKwllcnIgPSBzcnBfdHJhbnNmZXJfZGF0YShzYywgJnZpb19pdShpdWUpLT5zcnAuY21kLCBpYm12c3RndF9yZG1hLCAxLCAxKTsKKworCWRvbmUoc2MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpYm12c3RndF9jbWRfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpzYywKKwkJCSAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXVfZW50cnkgKml1ZSA9IChzdHJ1Y3QgaXVfZW50cnkgKikgc2MtPlNDcC5wdHI7CisJc3RydWN0IHNycF90YXJnZXQgKnRhcmdldCA9IGl1ZS0+dGFyZ2V0OworCisJZHByaW50aygiJXAgJXAgJXhcbiIsIGl1ZSwgdGFyZ2V0LCB2aW9faXUoaXVlKS0+c3JwLmNtZC5jZGJbMF0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZpdWUtPmlsaXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChzYy0+cmVzdWx0ICE9IFNBTV9TVEFUX0dPT0QpIHsKKwkJZXByaW50aygib3BlcmF0aW9uIGZhaWxlZCAlcCAlZCAleFxuIiwKKwkJCWl1ZSwgc2MtPnJlc3VsdCwgdmlvX2l1KGl1ZSktPnNycC5jbWQuY2RiWzBdKTsKKwkJc2VuZF9yc3AoaXVlLCBzYywgSEFSRFdBUkVfRVJST1IsIDB4MDApOworCX0gZWxzZQorCQlzZW5kX3JzcChpdWUsIHNjLCBOT19TRU5TRSwgMHgwMCk7CisKKwlkb25lKHNjKTsKKwlzcnBfaXVfcHV0KGl1ZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzZW5kX2FkYXB0ZXJfaW5mbyhzdHJ1Y3QgaXVfZW50cnkgKml1ZSwKKwkJICAgICAgZG1hX2FkZHJfdCByZW1vdGVfYnVmZmVyLCB1aW50MTZfdCBsZW5ndGgpCit7CisJc3RydWN0IHNycF90YXJnZXQgKnRhcmdldCA9IGl1ZS0+dGFyZ2V0OworCXN0cnVjdCB2aW9fcG9ydCAqdnBvcnQgPSB0YXJnZXRfdG9fcG9ydCh0YXJnZXQpOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdGFyZ2V0LT5zaG9zdDsKKwlkbWFfYWRkcl90IGRhdGFfdG9rZW47CisJc3RydWN0IG1hZF9hZGFwdGVyX2luZm9fZGF0YSAqaW5mbzsKKwlpbnQgZXJyOworCisJaW5mbyA9IGRtYV9hbGxvY19jb2hlcmVudCh0YXJnZXQtPmRldiwgc2l6ZW9mKCppbmZvKSwgJmRhdGFfdG9rZW4sCisJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJZXByaW50aygiYmFkIGRtYV9hbGxvY19jb2hlcmVudCAlcFxuIiwgdGFyZ2V0KTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogR2V0IHJlbW90ZSBpbmZvICovCisJZXJyID0gaF9jb3B5X3JkbWEoc2l6ZW9mKCppbmZvKSwgdnBvcnQtPnJpb2JuLCByZW1vdGVfYnVmZmVyLAorCQkJICB2cG9ydC0+bGlvYm4sIGRhdGFfdG9rZW4pOworCWlmIChlcnIgPT0gSF9TVUNDRVNTKSB7CisJCWRwcmludGsoIkNsaWVudCBjb25uZWN0OiAlcyAoJWQpXG4iLAorCQkJaW5mby0+cGFydGl0aW9uX25hbWUsIGluZm8tPnBhcnRpdGlvbl9udW1iZXIpOworCX0KKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKworCXN0cmNweShpbmZvLT5zcnBfdmVyc2lvbiwgIjE2LmEiKTsKKwlzdHJuY3B5KGluZm8tPnBhcnRpdGlvbl9uYW1lLCBwYXJ0aXRpb25fbmFtZSwKKwkJc2l6ZW9mKGluZm8tPnBhcnRpdGlvbl9uYW1lKSk7CisJaW5mby0+cGFydGl0aW9uX251bWJlciA9IHBhcnRpdGlvbl9udW1iZXI7CisJaW5mby0+bWFkX3ZlcnNpb24gPSAxOworCWluZm8tPm9zX3R5cGUgPSAyOworCWluZm8tPnBvcnRfbWF4X3R4dVswXSA9IHNob3N0LT5ob3N0dC0+bWF4X3NlY3RvcnMgPDwgOTsKKworCS8qIFNlbmQgb3VyIGluZm8gdG8gcmVtb3RlICovCisJZXJyID0gaF9jb3B5X3JkbWEoc2l6ZW9mKCppbmZvKSwgdnBvcnQtPmxpb2JuLCBkYXRhX3Rva2VuLAorCQkJICB2cG9ydC0+cmlvYm4sIHJlbW90ZV9idWZmZXIpOworCisJZG1hX2ZyZWVfY29oZXJlbnQodGFyZ2V0LT5kZXYsIHNpemVvZigqaW5mbyksIGluZm8sIGRhdGFfdG9rZW4pOworCisJaWYgKGVyciAhPSBIX1NVQ0NFU1MpIHsKKwkJZXByaW50aygiRXJyb3Igc2VuZGluZyBhZGFwdGVyIGluZm8gJWRcbiIsIGVycik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2xvZ2luKHN0cnVjdCBpdV9lbnRyeSAqaXVlKQoreworCXVuaW9uIHZpb3NycF9pdSAqaXUgPSB2aW9faXUoaXVlKTsKKwlzdHJ1Y3Qgc3JwX2xvZ2luX3JzcCAqcnNwID0gJml1LT5zcnAubG9naW5fcnNwOworCXVpbnQ2NF90IHRhZyA9IGl1LT5zcnAucnNwLnRhZzsKKworCS8qIFRPRE8gaGFuZGxlIGNhc2UgdGhhdCByZXF1ZXN0ZWQgc2l6ZSBpcyB3cm9uZyBhbmQKKwkgKiBidWZmZXIgZm9ybWF0IGlzIHdyb25nCisJICovCisJbWVtc2V0KGl1LCAwLCBzaXplb2Yoc3RydWN0IHNycF9sb2dpbl9yc3ApKTsKKwlyc3AtPm9wY29kZSA9IFNSUF9MT0dJTl9SU1A7CisJcnNwLT5yZXFfbGltX2RlbHRhID0gSU5JVElBTF9TUlBfTElNSVQ7CisJcnNwLT50YWcgPSB0YWc7CisJcnNwLT5tYXhfaXRfaXVfbGVuID0gc2l6ZW9mKHVuaW9uIHNycF9pdSk7CisJcnNwLT5tYXhfdGlfaXVfbGVuID0gc2l6ZW9mKHVuaW9uIHNycF9pdSk7CisJLyogZGlyZWN0IGFuZCBpbmRpcmVjdCAqLworCXJzcC0+YnVmX2ZtdCA9IFNSUF9CVUZfRk9STUFUX0RJUkVDVCB8IFNSUF9CVUZfRk9STUFUX0lORElSRUNUOworCisJc2VuZF9pdShpdWUsIHNpemVvZigqcnNwKSwgVklPU1JQX1NSUF9GT1JNQVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcXVldWVfY21kKHN0cnVjdCBpdV9lbnRyeSAqaXVlKQoreworCXN0cnVjdCBzcnBfdGFyZ2V0ICp0YXJnZXQgPSBpdWUtPnRhcmdldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJml1ZS0+aWxpc3QsICZ0YXJnZXQtPmNtZF9xdWV1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc190c2tfbWdtdChzdHJ1Y3QgaXVfZW50cnkgKml1ZSkKK3sKKwl1bmlvbiB2aW9zcnBfaXUgKml1ID0gdmlvX2l1KGl1ZSk7CisJaW50IGZuOworCisJZHByaW50aygiJXAgJXVcbiIsIGl1ZSwgaXUtPnNycC50c2tfbWdtdC50c2tfbWdtdF9mdW5jKTsKKworCXN3aXRjaCAoaXUtPnNycC50c2tfbWdtdC50c2tfbWdtdF9mdW5jKSB7CisJY2FzZSBTUlBfVFNLX0FCT1JUX1RBU0s6CisJCWZuID0gQUJPUlRfVEFTSzsKKwkJYnJlYWs7CisJY2FzZSBTUlBfVFNLX0FCT1JUX1RBU0tfU0VUOgorCQlmbiA9IEFCT1JUX1RBU0tfU0VUOworCQlicmVhazsKKwljYXNlIFNSUF9UU0tfQ0xFQVJfVEFTS19TRVQ6CisJCWZuID0gQ0xFQVJfVEFTS19TRVQ7CisJCWJyZWFrOworCWNhc2UgU1JQX1RTS19MVU5fUkVTRVQ6CisJCWZuID0gTE9HSUNBTF9VTklUX1JFU0VUOworCQlicmVhazsKKwljYXNlIFNSUF9UU0tfQ0xFQVJfQUNBOgorCQlmbiA9IENMRUFSX0FDQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZm4gPSAwOworCX0KKwlpZiAoZm4pCisJCXNjc2lfdGd0X3Rza19tZ210X3JlcXVlc3QoaXVlLT50YXJnZXQtPnNob3N0LCBmbiwKKwkJCQkJICBpdS0+c3JwLnRza19tZ210LnRhc2tfdGFnLAorCQkJCQkgIChzdHJ1Y3Qgc2NzaV9sdW4gKikgJml1LT5zcnAudHNrX21nbXQubHVuLAorCQkJCQkgIGl1ZSk7CisJZWxzZQorCQlzZW5kX3JzcChpdWUsIE5VTEwsIElMTEVHQUxfUkVRVUVTVCwgMHgyMCk7CisKKwlyZXR1cm4gIWZuOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfbWFkX2l1KHN0cnVjdCBpdV9lbnRyeSAqaXVlKQoreworCXVuaW9uIHZpb3NycF9pdSAqaXUgPSB2aW9faXUoaXVlKTsKKwlzdHJ1Y3Qgdmlvc3JwX2FkYXB0ZXJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3Qgdmlvc3JwX2hvc3RfY29uZmlnICpjb25mOworCisJc3dpdGNoIChpdS0+bWFkLmVtcHR5X2l1LmNvbW1vbi50eXBlKSB7CisJY2FzZSBWSU9TUlBfRU1QVFlfSVVfVFlQRToKKwkJZXByaW50aygiJXNcbiIsICJVbnN1cHBvcnRlZCBFTVBUWSBNQUQgSVUiKTsKKwkJYnJlYWs7CisJY2FzZSBWSU9TUlBfRVJST1JfTE9HX1RZUEU6CisJCWVwcmludGsoIiVzXG4iLCAiVW5zdXBwb3J0ZWQgRVJST1IgTE9HIE1BRCBJVSIpOworCQlpdS0+bWFkLmVycm9yX2xvZy5jb21tb24uc3RhdHVzID0gMTsKKwkJc2VuZF9pdShpdWUsIHNpemVvZihpdS0+bWFkLmVycm9yX2xvZyksCVZJT1NSUF9NQURfRk9STUFUKTsKKwkJYnJlYWs7CisJY2FzZSBWSU9TUlBfQURBUFRFUl9JTkZPX1RZUEU6CisJCWluZm8gPSAmaXUtPm1hZC5hZGFwdGVyX2luZm87CisJCWluZm8tPmNvbW1vbi5zdGF0dXMgPSBzZW5kX2FkYXB0ZXJfaW5mbyhpdWUsIGluZm8tPmJ1ZmZlciwKKwkJCQkJCQlpbmZvLT5jb21tb24ubGVuZ3RoKTsKKwkJc2VuZF9pdShpdWUsIHNpemVvZigqaW5mbyksIFZJT1NSUF9NQURfRk9STUFUKTsKKwkJYnJlYWs7CisJY2FzZSBWSU9TUlBfSE9TVF9DT05GSUdfVFlQRToKKwkJY29uZiA9ICZpdS0+bWFkLmhvc3RfY29uZmlnOworCQljb25mLT5jb21tb24uc3RhdHVzID0gMTsKKwkJc2VuZF9pdShpdWUsIHNpemVvZigqY29uZiksIFZJT1NSUF9NQURfRk9STUFUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXByaW50aygiVW5rbm93biB0eXBlICV1XG4iLCBpdS0+c3JwLnJzcC5vcGNvZGUpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Nfc3JwX2l1KHN0cnVjdCBpdV9lbnRyeSAqaXVlKQoreworCXVuaW9uIHZpb3NycF9pdSAqaXUgPSB2aW9faXUoaXVlKTsKKwlpbnQgZG9uZSA9IDE7CisJdTggb3Bjb2RlID0gaXUtPnNycC5yc3Aub3Bjb2RlOworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIFNSUF9MT0dJTl9SRVE6CisJCXByb2Nlc3NfbG9naW4oaXVlKTsKKwkJYnJlYWs7CisJY2FzZSBTUlBfVFNLX01HTVQ6CisJCWRvbmUgPSBwcm9jZXNzX3Rza19tZ210KGl1ZSk7CisJCWJyZWFrOworCWNhc2UgU1JQX0NNRDoKKwkJcXVldWVfY21kKGl1ZSk7CisJCWRvbmUgPSAwOworCQlicmVhazsKKwljYXNlIFNSUF9MT0dJTl9SU1A6CisJY2FzZSBTUlBfSV9MT0dPVVQ6CisJY2FzZSBTUlBfVF9MT0dPVVQ6CisJY2FzZSBTUlBfUlNQOgorCWNhc2UgU1JQX0NSRURfUkVROgorCWNhc2UgU1JQX0NSRURfUlNQOgorCWNhc2UgU1JQX0FFUl9SRVE6CisJY2FzZSBTUlBfQUVSX1JTUDoKKwkJZXByaW50aygiVW5zdXBwb3J0ZWQgdHlwZSAldVxuIiwgb3Bjb2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXByaW50aygiVW5rbm93biB0eXBlICV1XG4iLCBvcGNvZGUpOworCX0KKworCXJldHVybiBkb25lOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2l1KHN0cnVjdCB2aW9zcnBfY3JxICpjcnEsIHN0cnVjdCBzcnBfdGFyZ2V0ICp0YXJnZXQpCit7CisJc3RydWN0IHZpb19wb3J0ICp2cG9ydCA9IHRhcmdldF90b19wb3J0KHRhcmdldCk7CisJc3RydWN0IGl1X2VudHJ5ICppdWU7CisJbG9uZyBlcnIsIGRvbmU7CisKKwlpdWUgPSBzcnBfaXVfZ2V0KHRhcmdldCk7CisJaWYgKCFpdWUpIHsKKwkJZXByaW50aygiRXJyb3IgZ2V0dGluZyBJVSBmcm9tIHBvb2wsICVwXG4iLCB0YXJnZXQpOworCQlyZXR1cm47CisJfQorCisJaXVlLT5yZW1vdGVfdG9rZW4gPSBjcnEtPklVX2RhdGFfcHRyOworCisJZXJyID0gaF9jb3B5X3JkbWEoY3JxLT5JVV9sZW5ndGgsIHZwb3J0LT5yaW9ibiwKKwkJCSAgaXVlLT5yZW1vdGVfdG9rZW4sIHZwb3J0LT5saW9ibiwgaXVlLT5zYnVmLT5kbWEpOworCisJaWYgKGVyciAhPSBIX1NVQ0NFU1MpIHsKKwkJZXByaW50aygiJWxkIHRyYW5zZmVycmluZyBkYXRhIGVycm9yICVwXG4iLCBlcnIsIGl1ZSk7CisJCWRvbmUgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY3JxLT5mb3JtYXQgPT0gVklPU1JQX01BRF9GT1JNQVQpCisJCWRvbmUgPSBwcm9jZXNzX21hZF9pdShpdWUpOworCWVsc2UKKwkJZG9uZSA9IHByb2Nlc3Nfc3JwX2l1KGl1ZSk7CitvdXQ6CisJaWYgKGRvbmUpCisJCXNycF9pdV9wdXQoaXVlKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlibXZzdGd0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzcnBfdGFyZ2V0ICp0YXJnZXQgPSAoc3RydWN0IHNycF90YXJnZXQgKikgZGF0YTsKKwlzdHJ1Y3QgdmlvX3BvcnQgKnZwb3J0ID0gdGFyZ2V0X3RvX3BvcnQodGFyZ2V0KTsKKworCXZpb19kaXNhYmxlX2ludGVycnVwdHModnBvcnQtPmRtYV9kZXYpOworCXF1ZXVlX3dvcmsodnRndGQsICZ2cG9ydC0+Y3JxX3dvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGNycV9xdWV1ZV9jcmVhdGUoc3RydWN0IGNycV9xdWV1ZSAqcXVldWUsIHN0cnVjdCBzcnBfdGFyZ2V0ICp0YXJnZXQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdmlvX3BvcnQgKnZwb3J0ID0gdGFyZ2V0X3RvX3BvcnQodGFyZ2V0KTsKKworCXF1ZXVlLT5tc2dzID0gKHN0cnVjdCB2aW9zcnBfY3JxICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXF1ZXVlLT5tc2dzKQorCQlnb3RvIG1hbGxvY19mYWlsZWQ7CisJcXVldWUtPnNpemUgPSBQQUdFX1NJWkUgLyBzaXplb2YoKnF1ZXVlLT5tc2dzKTsKKworCXF1ZXVlLT5tc2dfdG9rZW4gPSBkbWFfbWFwX3NpbmdsZSh0YXJnZXQtPmRldiwgcXVldWUtPm1zZ3MsCisJCQkJCSAgcXVldWUtPnNpemUgKiBzaXplb2YoKnF1ZXVlLT5tc2dzKSwKKwkJCQkJICBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IocXVldWUtPm1zZ190b2tlbikpCisJCWdvdG8gbWFwX2ZhaWxlZDsKKworCWVyciA9IGhfcmVnX2NycSh2cG9ydC0+ZG1hX2Rldi0+dW5pdF9hZGRyZXNzLCBxdWV1ZS0+bXNnX3Rva2VuLAorCQkJUEFHRV9TSVpFKTsKKworCS8qIElmIHRoZSBhZGFwdGVyIHdhcyBsZWZ0IGFjdGl2ZSBmb3Igc29tZSByZWFzb24gKGxpa2Uga2V4ZWMpCisJICogdHJ5IGZyZWVpbmcgYW5kIHJlLXJlZ2lzdGVyaW5nCisJICovCisJaWYgKGVyciA9PSBIX1JFU09VUkNFKSB7CisJICAgIGRvIHsKKwkJZXJyID0gaF9mcmVlX2NycSh2cG9ydC0+ZG1hX2Rldi0+dW5pdF9hZGRyZXNzKTsKKwkgICAgfSB3aGlsZSAoZXJyID09IEhfQlVTWSB8fCBIX0lTX0xPTkdfQlVTWShlcnIpKTsKKworCSAgICBlcnIgPSBoX3JlZ19jcnEodnBvcnQtPmRtYV9kZXYtPnVuaXRfYWRkcmVzcywgcXVldWUtPm1zZ190b2tlbiwKKwkJCSAgICBQQUdFX1NJWkUpOworCX0KKworCWlmIChlcnIgIT0gSF9TVUNDRVNTICYmIGVyciAhPSAyKSB7CisJCWVwcmludGsoIkVycm9yIDB4JXggb3BlbmluZyB2aXJ0dWFsIGFkYXB0ZXJcbiIsIGVycik7CisJCWdvdG8gcmVnX2NycV9mYWlsZWQ7CisJfQorCisJZXJyID0gcmVxdWVzdF9pcnEodnBvcnQtPmRtYV9kZXYtPmlycSwgJmlibXZzdGd0X2ludGVycnVwdCwKKwkJCSAgU0FfSU5URVJSVVBULCAiaWJtdnN0Z3QiLCB0YXJnZXQpOworCWlmIChlcnIpCisJCWdvdG8gcmVxX2lycV9mYWlsZWQ7CisKKwl2aW9fZW5hYmxlX2ludGVycnVwdHModnBvcnQtPmRtYV9kZXYpOworCisJaF9zZW5kX2NycSh2cG9ydC0+ZG1hX2Rldi0+dW5pdF9hZGRyZXNzLCAweEMwMDEwMDAwMDAwMDAwMDAsIDApOworCisJcXVldWUtPmN1ciA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnF1ZXVlLT5sb2NrKTsKKworCXJldHVybiAwOworCityZXFfaXJxX2ZhaWxlZDoKKwlkbyB7CisJCWVyciA9IGhfZnJlZV9jcnEodnBvcnQtPmRtYV9kZXYtPnVuaXRfYWRkcmVzcyk7CisJfSB3aGlsZSAoZXJyID09IEhfQlVTWSB8fCBIX0lTX0xPTkdfQlVTWShlcnIpKTsKKworcmVnX2NycV9mYWlsZWQ6CisJZG1hX3VubWFwX3NpbmdsZSh0YXJnZXQtPmRldiwgcXVldWUtPm1zZ190b2tlbiwKKwkJCSBxdWV1ZS0+c2l6ZSAqIHNpemVvZigqcXVldWUtPm1zZ3MpLCBETUFfQklESVJFQ1RJT05BTCk7CittYXBfZmFpbGVkOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcXVldWUtPm1zZ3MpOworCittYWxsb2NfZmFpbGVkOgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBjcnFfcXVldWVfZGVzdHJveShzdHJ1Y3Qgc3JwX3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCB2aW9fcG9ydCAqdnBvcnQgPSB0YXJnZXRfdG9fcG9ydCh0YXJnZXQpOworCXN0cnVjdCBjcnFfcXVldWUgKnF1ZXVlID0gJnZwb3J0LT5jcnFfcXVldWU7CisJaW50IGVycjsKKworCWZyZWVfaXJxKHZwb3J0LT5kbWFfZGV2LT5pcnEsIHRhcmdldCk7CisJZG8geworCQllcnIgPSBoX2ZyZWVfY3JxKHZwb3J0LT5kbWFfZGV2LT51bml0X2FkZHJlc3MpOworCX0gd2hpbGUgKGVyciA9PSBIX0JVU1kgfHwgSF9JU19MT05HX0JVU1koZXJyKSk7CisKKwlkbWFfdW5tYXBfc2luZ2xlKHRhcmdldC0+ZGV2LCBxdWV1ZS0+bXNnX3Rva2VuLAorCQkJIHF1ZXVlLT5zaXplICogc2l6ZW9mKCpxdWV1ZS0+bXNncyksIERNQV9CSURJUkVDVElPTkFMKTsKKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcXVldWUtPm1zZ3MpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2NycShzdHJ1Y3Qgdmlvc3JwX2NycSAqY3JxLAlzdHJ1Y3Qgc3JwX3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCB2aW9fcG9ydCAqdnBvcnQgPSB0YXJnZXRfdG9fcG9ydCh0YXJnZXQpOworCWRwcmludGsoIiV4ICV4XG4iLCBjcnEtPnZhbGlkLCBjcnEtPmZvcm1hdCk7CisKKwlzd2l0Y2ggKGNycS0+dmFsaWQpIHsKKwljYXNlIDB4QzA6CisJCS8qIGluaXRpYWxpemF0aW9uICovCisJCXN3aXRjaCAoY3JxLT5mb3JtYXQpIHsKKwkJY2FzZSAweDAxOgorCQkJaF9zZW5kX2NycSh2cG9ydC0+ZG1hX2Rldi0+dW5pdF9hZGRyZXNzLAorCQkJCSAgIDB4QzAwMjAwMDAwMDAwMDAwMCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAweDAyOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcHJpbnRrKCJVbmtub3duIGZvcm1hdCAldVxuIiwgY3JxLT5mb3JtYXQpOworCQl9CisJCWJyZWFrOworCWNhc2UgMHhGRjoKKwkJLyogdHJhbnNwb3J0IGV2ZW50ICovCisJCWJyZWFrOworCWNhc2UgMHg4MDoKKwkJLyogcmVhbCBwYXlsb2FkICovCisJCXN3aXRjaCAoY3JxLT5mb3JtYXQpIHsKKwkJY2FzZSBWSU9TUlBfU1JQX0ZPUk1BVDoKKwkJY2FzZSBWSU9TUlBfTUFEX0ZPUk1BVDoKKwkJCXByb2Nlc3NfaXUoY3JxLCB0YXJnZXQpOworCQkJYnJlYWs7CisJCWNhc2UgVklPU1JQX09TNDAwX0ZPUk1BVDoKKwkJY2FzZSBWSU9TUlBfQUlYX0ZPUk1BVDoKKwkJY2FzZSBWSU9TUlBfTElOVVhfRk9STUFUOgorCQljYXNlIFZJT1NSUF9JTkxJTkVfRk9STUFUOgorCQkJZXByaW50aygiVW5zdXBwb3J0ZWQgZm9ybWF0ICV1XG4iLCBjcnEtPmZvcm1hdCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVwcmludGsoIlVua25vd24gZm9ybWF0ICV1XG4iLCBjcnEtPmZvcm1hdCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXByaW50aygidW5rbm93biBtZXNzYWdlIHR5cGUgMHglMDJ4IT9cbiIsIGNycS0+dmFsaWQpOworCX0KK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdmlvc3JwX2NycSAqbmV4dF9jcnEoc3RydWN0IGNycV9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IHZpb3NycF9jcnEgKmNycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5sb2NrLCBmbGFncyk7CisJY3JxID0gJnF1ZXVlLT5tc2dzW3F1ZXVlLT5jdXJdOworCWlmIChjcnEtPnZhbGlkICYgMHg4MCkgeworCQlpZiAoKytxdWV1ZS0+Y3VyID09IHF1ZXVlLT5zaXplKQorCQkJcXVldWUtPmN1ciA9IDA7CisJfSBlbHNlCisJCWNycSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBjcnE7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jcnEoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2aW9fcG9ydCAqdnBvcnQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZpb19wb3J0LCBjcnFfd29yayk7CisJc3RydWN0IHNycF90YXJnZXQgKnRhcmdldCA9IHZwb3J0LT50YXJnZXQ7CisJc3RydWN0IHZpb3NycF9jcnEgKmNycTsKKwlpbnQgZG9uZSA9IDA7CisKKwl3aGlsZSAoIWRvbmUpIHsKKwkJd2hpbGUgKChjcnEgPSBuZXh0X2NycSgmdnBvcnQtPmNycV9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJCXByb2Nlc3NfY3JxKGNycSwgdGFyZ2V0KTsKKwkJCWNycS0+dmFsaWQgPSAweDAwOworCQl9CisKKwkJdmlvX2VuYWJsZV9pbnRlcnJ1cHRzKHZwb3J0LT5kbWFfZGV2KTsKKworCQljcnEgPSBuZXh0X2NycSgmdnBvcnQtPmNycV9xdWV1ZSk7CisJCWlmIChjcnEpIHsKKwkJCXZpb19kaXNhYmxlX2ludGVycnVwdHModnBvcnQtPmRtYV9kZXYpOworCQkJcHJvY2Vzc19jcnEoY3JxLCB0YXJnZXQpOworCQkJY3JxLT52YWxpZCA9IDB4MDA7CisJCX0gZWxzZQorCQkJZG9uZSA9IDE7CisJfQorCisJaGFuZGxlX2NtZF9xdWV1ZSh0YXJnZXQpOworfQorCisKK3N0YXRpYyBpbnQgaWJtdnN0Z3RfZWhfYWJvcnRfaGFuZGxlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpdV9lbnRyeSAqaXVlID0gKHN0cnVjdCBpdV9lbnRyeSAqKSBzYy0+U0NwLnB0cjsKKwlzdHJ1Y3Qgc3JwX3RhcmdldCAqdGFyZ2V0ID0gaXVlLT50YXJnZXQ7CisKKwlkcHJpbnRrKCIlcCAlcCAleFxuIiwgaXVlLCB0YXJnZXQsIHZpb19pdShpdWUpLT5zcnAuY21kLmNkYlswXSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJml1ZS0+aWxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOworCisJc3JwX2l1X3B1dChpdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWJtdnN0Z3RfdHNrX21nbXRfcmVzcG9uc2UodTY0IG1pZCwgaW50IHJlc3VsdCkKK3sKKwlzdHJ1Y3QgaXVfZW50cnkgKml1ZSA9IChzdHJ1Y3QgaXVfZW50cnkgKikgKCh2b2lkICopIG1pZCk7CisJdW5pb24gdmlvc3JwX2l1ICppdSA9IHZpb19pdShpdWUpOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzLCBhc2M7CisKKwllcHJpbnRrKCIlcCAlZFxuIiwgaXVlLCByZXN1bHQpOworCXN0YXR1cyA9IE5PX1NFTlNFOworCWFzYyA9IDA7CisKKwlzd2l0Y2ggKGl1LT5zcnAudHNrX21nbXQudHNrX21nbXRfZnVuYykgeworCWNhc2UgU1JQX1RTS19BQk9SVF9UQVNLOgorCQlhc2MgPSAweDE0OworCQlpZiAocmVzdWx0KQorCQkJc3RhdHVzID0gQUJPUlRFRF9DT01NQU5EOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzZW5kX3JzcChpdWUsIE5VTEwsIHN0YXR1cywgYXNjKTsKKwlzcnBfaXVfcHV0KGl1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc3lzdGVtX2lkX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBzeXN0ZW1faWQpOworfQorCitzdGF0aWMgc3NpemVfdCBwYXJ0aXRpb25fbnVtYmVyX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV4XG4iLCBwYXJ0aXRpb25fbnVtYmVyKTsKK30KKworc3RhdGljIHNzaXplX3QgdW5pdF9hZGRyZXNzX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHNycF90YXJnZXQgKnRhcmdldCA9IGhvc3RfdG9fc3JwX3RhcmdldChzaG9zdCk7CisJc3RydWN0IHZpb19wb3J0ICp2cG9ydCA9IHRhcmdldF90b19wb3J0KHRhcmdldCk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIHZwb3J0LT5kbWFfZGV2LT51bml0X2FkZHJlc3MpOworfQorCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc3lzdGVtX2lkLCBTX0lSVUdPLCBzeXN0ZW1faWRfc2hvdywgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocGFydGl0aW9uX251bWJlciwgU19JUlVHTywgcGFydGl0aW9uX251bWJlcl9zaG93LCBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUih1bml0X2FkZHJlc3MsIFNfSVJVR08sIHVuaXRfYWRkcmVzc19zaG93LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICppYm12c3RndF9hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9zeXN0ZW1faWQsCisJJmNsYXNzX2RldmljZV9hdHRyX3BhcnRpdGlvbl9udW1iZXIsCisJJmNsYXNzX2RldmljZV9hdHRyX3VuaXRfYWRkcmVzcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaWJtdnN0Z3Rfc2h0ID0geworCS5uYW1lCQkJPSBUR1RfTkFNRSwKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkuY2FuX3F1ZXVlCQk9IElOSVRJQUxfU1JQX0xJTUlULAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAorCS51c2VfY2x1c3RlcmluZwkJPSBESVNBQkxFX0NMVVNURVJJTkcsCisJLm1heF9zZWN0b3JzCQk9IERFRkFVTFRfTUFYX1NFQ1RPUlMsCisJLnRyYW5zZmVyX3Jlc3BvbnNlCT0gaWJtdnN0Z3RfY21kX2RvbmUsCisJLnRyYW5zZmVyX2RhdGEJCT0gaWJtdnN0Z3RfdHJhbnNmZXJfZGF0YSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGlibXZzdGd0X2VoX2Fib3J0X2hhbmRsZXIsCisJLnRza19tZ210X3Jlc3BvbnNlCT0gaWJtdnN0Z3RfdHNrX21nbXRfcmVzcG9uc2UsCisJLnNob3N0X2F0dHJzCQk9IGlibXZzdGd0X2F0dHJzLAorCS5wcm9jX25hbWUJCT0gVEdUX05BTUUsCit9OworCitzdGF0aWMgaW50IGlibXZzdGd0X3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3Qgc3JwX3RhcmdldCAqdGFyZ2V0OworCXN0cnVjdCB2aW9fcG9ydCAqdnBvcnQ7CisJdW5zaWduZWQgaW50ICpkbWEsIGRtYV9zaXplOworCWludCBlcnIgPSAtRU5PTUVNOworCisJdnBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmlvX3BvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZwb3J0KQorCQlyZXR1cm4gZXJyOworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZpYm12c3RndF9zaHQsIHNpemVvZihzdHJ1Y3Qgc3JwX3RhcmdldCkpOworCWlmICghc2hvc3QpCisJCWdvdG8gZnJlZV92cG9ydDsKKwllcnIgPSBzY3NpX3RndF9hbGxvY19xdWV1ZShzaG9zdCk7CisJaWYgKGVycikKKwkJZ290byBwdXRfaG9zdDsKKworCXRhcmdldCA9IGhvc3RfdG9fc3JwX3RhcmdldChzaG9zdCk7CisJdGFyZ2V0LT5zaG9zdCA9IHNob3N0OworCXZwb3J0LT5kbWFfZGV2ID0gZGV2OworCXRhcmdldC0+bGRhdGEgPSB2cG9ydDsKKwl2cG9ydC0+dGFyZ2V0ID0gdGFyZ2V0OworCWVyciA9IHNycF90YXJnZXRfYWxsb2ModGFyZ2V0LCAmZGV2LT5kZXYsIElOSVRJQUxfU1JQX0xJTUlULAorCQkJICAgICAgIFNSUF9NQVhfSVVfTEVOKTsKKwlpZiAoZXJyKQorCQlnb3RvIHB1dF9ob3N0OworCisJZG1hID0gKHVuc2lnbmVkIGludCAqKSB2aW9fZ2V0X2F0dHJpYnV0ZShkZXYsICJpYm0sbXktZG1hLXdpbmRvdyIsCisJCQkJCQkgJmRtYV9zaXplKTsKKwlpZiAoIWRtYSB8fCBkbWFfc2l6ZSAhPSA0MCkgeworCQllcHJpbnRrKCJDb3VsZG4ndCBnZXQgd2luZG93IHByb3BlcnR5ICVkXG4iLCBkbWFfc2l6ZSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZnJlZV9zcnBfdGFyZ2V0OworCX0KKwl2cG9ydC0+bGlvYm4gPSBkbWFbMF07CisJdnBvcnQtPnJpb2JuID0gZG1hWzVdOworCisJSU5JVF9XT1JLKCZ2cG9ydC0+Y3JxX3dvcmssIGhhbmRsZV9jcnEpOworCisJZXJyID0gY3JxX3F1ZXVlX2NyZWF0ZSgmdnBvcnQtPmNycV9xdWV1ZSwgdGFyZ2V0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfc3JwX3RhcmdldDsKKworCWVyciA9IHNjc2lfYWRkX2hvc3Qoc2hvc3QsIHRhcmdldC0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGRlc3Ryb3lfcXVldWU7CisJcmV0dXJuIDA7CisKK2Rlc3Ryb3lfcXVldWU6CisJY3JxX3F1ZXVlX2Rlc3Ryb3kodGFyZ2V0KTsKK2ZyZWVfc3JwX3RhcmdldDoKKwlzcnBfdGFyZ2V0X2ZyZWUodGFyZ2V0KTsKK3B1dF9ob3N0OgorCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworZnJlZV92cG9ydDoKKwlrZnJlZSh2cG9ydCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpYm12c3RndF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3JwX3RhcmdldCAqdGFyZ2V0ID0gKHN0cnVjdCBzcnBfdGFyZ2V0ICopIGRldi0+ZGV2LmRyaXZlcl9kYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdGFyZ2V0LT5zaG9zdDsKKwlzdHJ1Y3QgdmlvX3BvcnQgKnZwb3J0ID0gdGFyZ2V0LT5sZGF0YTsKKworCWNycV9xdWV1ZV9kZXN0cm95KHRhcmdldCk7CisJc2NzaV9yZW1vdmVfaG9zdChzaG9zdCk7CisJc2NzaV90Z3RfZnJlZV9xdWV1ZShzaG9zdCk7CisJc3JwX3RhcmdldF9mcmVlKHRhcmdldCk7CisJa2ZyZWUodnBvcnQpOworCXNjc2lfaG9zdF9wdXQoc2hvc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgaWJtdnN0Z3RfZGV2aWNlX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7InYtc2NzaS1ob3N0IiwgIklCTSx2LXNjc2ktaG9zdCJ9LAorCXsiIiwiIn0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCBpYm12c3RndF9kZXZpY2VfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgaWJtdnN0Z3RfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGlibXZzdGd0X2RldmljZV90YWJsZSwKKwkucHJvYmUgPSBpYm12c3RndF9wcm9iZSwKKwkucmVtb3ZlID0gaWJtdnN0Z3RfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImlibXZzY3NpcyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgZ2V0X3N5c3RlbV9pbmZvKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpyb290ZG47CisJY29uc3QgY2hhciAqaWQsICptb2RlbCwgKm5hbWU7CisJdW5zaWduZWQgaW50ICpudW07CisKKwlyb290ZG4gPSBmaW5kX3BhdGhfZGV2aWNlKCIvIik7CisJaWYgKCFyb290ZG4pCisJCXJldHVybiAtRU5PRU5UOworCisJbW9kZWwgPSBnZXRfcHJvcGVydHkocm9vdGRuLCAibW9kZWwiLCBOVUxMKTsKKwlpZCA9IGdldF9wcm9wZXJ0eShyb290ZG4sICJzeXN0ZW0taWQiLCBOVUxMKTsKKwlpZiAobW9kZWwgJiYgaWQpCisJCXNucHJpbnRmKHN5c3RlbV9pZCwgc2l6ZW9mKHN5c3RlbV9pZCksICIlcy0lcyIsIG1vZGVsLCBpZCk7CisKKwluYW1lID0gZ2V0X3Byb3BlcnR5KHJvb3RkbiwgImlibSxwYXJ0aXRpb24tbmFtZSIsIE5VTEwpOworCWlmIChuYW1lKQorCQlzdHJuY3B5KHBhcnRpdGlvbl9uYW1lLCBuYW1lLCBzaXplb2YocGFydGl0aW9uX25hbWUpKTsKKworCW51bSA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5KHJvb3RkbiwgImlibSxwYXJ0aXRpb24tbm8iLCBOVUxMKTsKKwlpZiAobnVtKQorCQlwYXJ0aXRpb25fbnVtYmVyID0gKm51bTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlibXZzdGd0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCXByaW50aygiSUJNIGVTZXJ2ZXIgaS9wU2VyaWVzIFZpcnR1YWwgU0NTSSBUYXJnZXQgRHJpdmVyXG4iKTsKKworCXZ0Z3RkID0gY3JlYXRlX3dvcmtxdWV1ZSgiaWJtdnRndGQiKTsKKwlpZiAoIXZ0Z3RkKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gZ2V0X3N5c3RlbV9pbmZvKCk7CisJaWYgKGVycikKKwkJZ290byBkZXN0cm95X3dxOworCisJZXJyID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaWJtdnN0Z3RfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGRlc3Ryb3lfd3E7CisKKwlyZXR1cm4gMDsKKworZGVzdHJveV93cToKKwlkZXN0cm95X3dvcmtxdWV1ZSh2dGd0ZCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaWJtdnN0Z3RfZXhpdCh2b2lkKQoreworCXByaW50aygiVW5yZWdpc3RlciBJQk0gdmlydHVhbCBTQ1NJIGRyaXZlclxuIik7CisKKwlkZXN0cm95X3dvcmtxdWV1ZSh2dGd0ZCk7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZpYm12c3RndF9kcml2ZXIpOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBWaXJ0dWFsIFNDU0kgVGFyZ2V0Iik7CitNT0RVTEVfQVVUSE9SKCJTYW50aWFnbyBMZW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGlibXZzdGd0X2luaXQpOworbW9kdWxlX2V4aXQoaWJtdnN0Z3RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYyBiL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCmluZGV4IDE0MjdhNDEuLjhmNmI1YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pZGUtc2NzaS5jCkBAIC0xMTAsNiArMTEwLDcgQEAKIH0gaWRlc2NzaV9zY3NpX3Q7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoaWRlc2NzaV9yZWZfbXV0ZXgpOworc3RhdGljIGludCBpZGVzY3NpX25vY2Q7CQkJLyogU2V0IGJ5IG1vZHVsZSBwYXJhbSB0byBza2lwIGNkICovCiAKICNkZWZpbmUgaWRlX3Njc2lfZyhkaXNrKSBcCiAJY29udGFpbmVyX29mKChkaXNrKS0+cHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgaWRlX3Njc2lfb2JqLCBkcml2ZXIpCkBAIC0xMTI3LDYgKzExMjgsOSBAQAogCQl3YXJuZWQgPSAxOwogCX0KIAorCWlmIChpZGVzY3NpX25vY2QgJiYgZHJpdmUtPm1lZGlhID09IGlkZV9jZHJvbSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAoIXN0cnN0cigiaWRlLXNjc2kiLCBkcml2ZS0+ZHJpdmVyX3JlcSkgfHwKIAkgICAgIWRyaXZlLT5wcmVzZW50IHx8CiAJICAgIGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzayB8fApAQCAtMTE4Nyw2ICsxMTkxLDggQEAKIAlkcml2ZXJfdW5yZWdpc3RlcigmaWRlc2NzaV9kcml2ZXIuZ2VuX2RyaXZlcik7CiB9CiAKK21vZHVsZV9wYXJhbShpZGVzY3NpX25vY2QsIGludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkZXNjc2lfbm9jZCwgIkRpc2FibGUgaGFuZGxpbmcgb2YgQ0QtUk9NcyBzbyB0aGV5IG1heSBiZSBkcml2ZW4gYnkgaWRlLWNkIik7CiBtb2R1bGVfaW5pdChpbml0X2lkZXNjc2lfbW9kdWxlKTsKIG1vZHVsZV9leGl0KGV4aXRfaWRlc2NzaV9tb2R1bGUpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2ltbS5jIGIvZHJpdmVycy9zY3NpL2ltbS5jCmluZGV4IDJkOTVhYzkuLjA0NjRjMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pbW0uYworKysgYi9kcml2ZXJzL3Njc2kvaW1tLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAlpbnQgYmFzZV9oaTsJCS8qIEhpIEJhc2UgYWRkcmVzcyBmb3IgRUNQLUlTQSBjaGlwc2V0ICovCiAJaW50IG1vZGU7CQkvKiBUcmFuc2ZlciBtb2RlICAgICAgICAgICAgICAgICovCiAJc3RydWN0IHNjc2lfY21uZCAqY3VyX2NtZDsJLyogQ3VycmVudCBxdWV1ZWQgY29tbWFuZCAgICAgICAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBpbW1fdHE7CS8qIFBvbGxpbmcgaW50ZXJydXB0IHN0dWZmICAgICAgICovCisJc3RydWN0IGRlbGF5ZWRfd29yayBpbW1fdHE7CS8qIFBvbGxpbmcgaW50ZXJydXB0IHN0dWZmICAgICAgICovCiAJdW5zaWduZWQgbG9uZyBqc3RhcnQ7CS8qIEppZmZpZXMgYXQgc3RhcnQgICAgICAgICAgICAgKi8KIAl1bnNpZ25lZCBmYWlsZWQ6MTsJLyogRmFpbHVyZSBmbGFnICAgICAgICAgICAgICAgICAqLwogCXVuc2lnbmVkIGRwOjE7CQkvKiBEYXRhIHBoYXNlIHByZXNlbnQgICAgICAgICAgICovCkBAIC03MzMsOSArNzMzLDkgQEAKICAqIHRoZSBzY2hlZHVsZXIncyB0YXNrIHF1ZXVlIHRvIGdlbmVyYXRlIGEgc3RyZWFtIG9mIGNhbGwtYmFja3MgYW5kCiAgKiBjb21wbGV0ZSB0aGUgcmVxdWVzdCB3aGVuIHRoZSBkcml2ZSBpcyByZWFkeS4KICAqLwotc3RhdGljIHZvaWQgaW1tX2ludGVycnVwdCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaW1tX2ludGVycnVwdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JaW1tX3N0cnVjdCAqZGV2ID0gKGltbV9zdHJ1Y3QgKikgZGF0YTsKKwlpbW1fc3RydWN0ICpkZXYgPSBjb250YWluZXJfb2Yod29yaywgaW1tX3N0cnVjdCwgaW1tX3RxLndvcmspOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGRldi0+Y3VyX2NtZDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY21kLT5kZXZpY2UtPmhvc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTc0NSw3ICs3NDUsNiBAQAogCQlyZXR1cm47CiAJfQogCWlmIChpbW1fZW5naW5lKGRldiwgY21kKSkgewotCQlJTklUX1dPUksoJmRldi0+aW1tX3RxLCBpbW1faW50ZXJydXB0LCAodm9pZCAqKSBkZXYpOwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+aW1tX3RxLCAxKTsKIAkJcmV0dXJuOwogCX0KQEAgLTk1Myw4ICs5NTIsNyBAQAogCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwkvKiBkZWZhdWx0IHJldHVybiBjb2RlICovCiAJY21kLT5TQ3AucGhhc2UgPSAwOwkvKiBidXMgZnJlZSAqLwogCi0JSU5JVF9XT1JLKCZkZXYtPmltbV90cSwgaW1tX2ludGVycnVwdCwgZGV2KTsKLQlzY2hlZHVsZV93b3JrKCZkZXYtPmltbV90cSk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPmltbV90cSwgMCk7CiAKIAlpbW1fcGJfY2xhaW0oZGV2KTsKIApAQCAtMTE1Myw3ICsxMTUxLDcgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCWltbV9zdHJ1Y3QgKmRldjsKLQlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0aW5nKTsKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKHdhaXRpbmcpOwogCURFRklORV9XQUlUKHdhaXQpOwogCWludCBwb3J0czsKIAlpbnQgbW9kZXMsIHBwYjsKQEAgLTEyMjUsNyArMTIyMyw3IEBACiAJZWxzZQogCQlwb3J0cyA9IDg7CiAKLQlJTklUX1dPUksoJmRldi0+aW1tX3RxLCBpbW1faW50ZXJydXB0LCBkZXYpOworCUlOSVRfREVMQVlFRF9XT1JLKCZkZXYtPmltbV90cSwgaW1tX2ludGVycnVwdCk7CiAKIAllcnIgPSAtRU5PTUVNOwogCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmltbV90ZW1wbGF0ZSwgc2l6ZW9mKGltbV9zdHJ1Y3QgKikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2luaXRpby5jIGIvZHJpdmVycy9zY3NpL2luaXRpby5jCmluZGV4IDkxMWYyZmYuLmQ1NjE2NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pbml0aW8uYworKysgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmMKQEAgLTE0Miw4ICsxNDIsNiBAQAogI2RlZmluZSBpOTF1X01BWFFVRVVFCQkyCiAjZGVmaW5lIGk5MXVfUkVWSUQgIkluaXRpbyBJTkktOVgwMFUvVVcgU0NTSSBkZXZpY2UgZHJpdmVyOyBSZXZpc2lvbjogMS4wNGEiCiAKLSNkZWZpbmUgSU5JX1ZFTkRPUl9JRCAgIDB4MTEwMQkvKiBJbml0aW8ncyBQQ0kgdmVuZG9yIElEICAgICAgICovCi0jZGVmaW5lIERNWF9WRU5ET1JfSUQJMHgxMzRhCS8qIERvbWV4J3MgUENJIHZlbmRvciBJRAkqLwogI2RlZmluZSBJOTUwX0RFVklDRV9JRAkweDk1MDAJLyogSW5pdGlvJ3MgaW5pYy05NTAgcHJvZHVjdCBJRCAgICovCiAjZGVmaW5lIEk5NDBfREVWSUNFX0lECTB4OTQwMAkvKiBJbml0aW8ncyBpbmljLTk0MCBwcm9kdWN0IElEICAgKi8KICNkZWZpbmUgSTkzNV9ERVZJQ0VfSUQJMHg5NDAxCS8qIEluaXRpbydzIGluaWMtOTM1IHByb2R1Y3QgSUQgICAqLwpAQCAtMTcxLDEzICsxNjksMTYgQEAKIAogc3RhdGljIHZvaWQgaTkxdVNDQlBvc3QoQllURSAqIHBIY2IsIEJZVEUgKiBwU2NiKTsKIAotc3RhdGljIGNvbnN0IFBDSV9JRCBpOTF1X3BjaV9kZXZpY2VzW10gPSB7Ci0JeyBJTklfVkVORE9SX0lELCBJOTUwX0RFVklDRV9JRCB9LAotCXsgSU5JX1ZFTkRPUl9JRCwgSTk0MF9ERVZJQ0VfSUQgfSwKLQl7IElOSV9WRU5ET1JfSUQsIEk5MzVfREVWSUNFX0lEIH0sCi0JeyBJTklfVkVORE9SX0lELCBJOTIwX0RFVklDRV9JRCB9LAotCXsgRE1YX1ZFTkRPUl9JRCwgSTkyMF9ERVZJQ0VfSUQgfSwKKy8qIFBDSSBEZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGk5MXVfcGNpX2RldmljZXNbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfSU5JVCwgIEk5NTBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5JVCwgIEk5NDBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5JVCwgIEk5MzVfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5JVCwgIEk5MjBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IFBDSV9WRU5ET1JfSURfRE9NRVgsIEk5MjBfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IH0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaTkxdV9wY2lfZGV2aWNlcyk7CiAKICNkZWZpbmUgREVCVUdfSU5URVJSVVBUIDAKICNkZWZpbmUgREVCVUdfUVVFVUUgICAgIDAKQEAgLTI3NzEsNyArMjc3Miw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpOTF1X3BjaV9kZXZpY2VzKTsgaSsrKQogCXsKLQkJd2hpbGUgKChwRGV2ID0gcGNpX2ZpbmRfZGV2aWNlKGk5MXVfcGNpX2RldmljZXNbaV0udmVuZG9yX2lkLCBpOTF1X3BjaV9kZXZpY2VzW2ldLmRldmljZV9pZCwgcERldikpICE9IE5VTEwpIHsKKwkJd2hpbGUgKChwRGV2ID0gcGNpX2ZpbmRfZGV2aWNlKGk5MXVfcGNpX2RldmljZXNbaV0udmVuZG9yLCBpOTF1X3BjaV9kZXZpY2VzW2ldLmRldmljZSwgcERldikpICE9IE5VTEwpIHsKIAkJCWlmIChwY2lfZW5hYmxlX2RldmljZShwRGV2KSkKIAkJCQljb250aW51ZTsKIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwRGV2LCAweDQ0LCAodTMyICopICYgZFJlZ1ZhbHVlKTsKQEAgLTI4MjcsNyArMjgyOCw3IEBACiAKIAlmb3IgKDsgdHVsX251bV9zY2IgPj0gTUFYX1RBUkdFVFMgKyAzOyB0dWxfbnVtX3NjYi0tKSB7CiAJCWkgPSB0dWxfbnVtX2NoICogdHVsX251bV9zY2IgKiBzaXplb2YoU0NCKTsKLQkJaWYgKCh0dWxfc2NiID0gKFNDQiAqKSBrbWFsbG9jKGksIEdGUF9BVE9NSUMgfCBHRlBfRE1BKSkgIT0gTlVMTCkKKwkJaWYgKCh0dWxfc2NiID0ga21hbGxvYyhpLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSkpICE9IE5VTEwpCiAJCQlicmVhazsKIAl9CiAJaWYgKHR1bF9zY2IgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5jIGIvZHJpdmVycy9zY3NpL2lwci5jCmluZGV4IDJkZGU4MjEuLmIzMTg1MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuYworKysgYi9kcml2ZXJzL3Njc2kvaXByLmMKQEAgLTc5LDcgKzc5LDYgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSAiaXByLmgiCiAKIC8qCkBAIC05OCw3ICs5Nyw3IEBACiAKIC8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIERNQSBjb250cm9sbGVyIGNoaXBzICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlwcl9jaGlwX2NmZ190IGlwcl9jaGlwX2NmZ1tdID0gewotCXsgLyogR2Vtc3RvbmUsIENpdHJpbmUsIGFuZCBPYnNpZGlhbiAqLworCXsgLyogR2Vtc3RvbmUsIENpdHJpbmUsIE9ic2lkaWFuLCBhbmQgT2JzaWRpYW4tRSAqLwogCQkubWFpbGJveCA9IDB4MDA0MkMsCiAJCS5jYWNoZV9saW5lX3NpemUgPSAweDIwLAogCQl7CkBAIC0xMzUsNiArMTM0LDcgQEAKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9DSVRSSU5FLCAmaXByX2NoaXBfY2ZnWzBdIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX09CU0lESUFOLCAmaXByX2NoaXBfY2ZnWzBdIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fT0JTSURJQU4sICZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9PQlNJRElBTl9FLCAmaXByX2NoaXBfY2ZnWzBdIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fU05JUEUsICZpcHJfY2hpcF9jZmdbMV0gfSwKIAl7IFBDSV9WRU5ET1JfSURfQURBUFRFQzIsIFBDSV9ERVZJQ0VfSURfQURBUFRFQzJfU0NBTVAsICZpcHJfY2hpcF9jZmdbMV0gfQogfTsKQEAgLTEyNDksMTkgKzEyNDksMjMgQEAKIAogLyoqCiAgKiBpcHJfbG9nX2hleF9kYXRhIC0gTG9nIGFkZGl0aW9uYWwgaGV4IElPQSBlcnJvciBkYXRhLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CiAgKiBAZGF0YToJCUlPQSBlcnJvciBkYXRhCiAgKiBAbGVuOgkJZGF0YSBsZW5ndGgKICAqCiAgKiBSZXR1cm4gdmFsdWU6CiAgKiAJbm9uZQogICoqLwotc3RhdGljIHZvaWQgaXByX2xvZ19oZXhfZGF0YSh1MzIgKmRhdGEsIGludCBsZW4pCitzdGF0aWMgdm9pZCBpcHJfbG9nX2hleF9kYXRhKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywgdTMyICpkYXRhLCBpbnQgbGVuKQogewogCWludCBpOwogCiAJaWYgKGxlbiA9PSAwKQogCQlyZXR1cm47CiAKKwlpZiAoaW9hX2NmZy0+bG9nX2xldmVsIDw9IElQUl9ERUZBVUxUX0xPR19MRVZFTCkKKwkJbGVuID0gbWluX3QoaW50LCBsZW4sIElQUl9ERUZBVUxUX01BWF9FUlJPUl9EVU1QKTsKKwogCWZvciAoaSA9IDA7IGkgPCBsZW4gLyA0OyBpICs9IDQpIHsKIAkJaXByX2VycigiJTA4WDogJTA4WCAlMDhYICUwOFggJTA4WFxuIiwgaSo0LAogCQkJYmUzMl90b19jcHUoZGF0YVtpXSksCkBAIC0xMjkwLDcgKzEyOTQsNyBAQAogCWlwcl9lcnIoIiVzXG4iLCBlcnJvci0+ZmFpbHVyZV9yZWFzb24pOwogCWlwcl9lcnIoIlJlbW90ZSBBZGFwdGVyIFZQRDpcbiIpOwogCWlwcl9sb2dfZXh0X3ZwZCgmZXJyb3ItPnZwZCk7Ci0JaXByX2xvZ19oZXhfZGF0YShlcnJvci0+ZGF0YSwKKwlpcHJfbG9nX2hleF9kYXRhKGlvYV9jZmcsIGVycm9yLT5kYXRhLAogCQkJIGJlMzJfdG9fY3B1KGhvc3RyY2ItPmhjYW0ubGVuZ3RoKSAtCiAJCQkgKG9mZnNldG9mKHN0cnVjdCBpcHJfaG9zdHJjYl9lcnJvciwgdSkgKwogCQkJICBvZmZzZXRvZihzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8xN19lcnJvciwgZGF0YSkpKTsKQEAgLTEzMTUsMTIgKzEzMTksMjI1IEBACiAJaXByX2VycigiJXNcbiIsIGVycm9yLT5mYWlsdXJlX3JlYXNvbik7CiAJaXByX2VycigiUmVtb3RlIEFkYXB0ZXIgVlBEOlxuIik7CiAJaXByX2xvZ192cGQoJmVycm9yLT52cGQpOwotCWlwcl9sb2dfaGV4X2RhdGEoZXJyb3ItPmRhdGEsCisJaXByX2xvZ19oZXhfZGF0YShpb2FfY2ZnLCBlcnJvci0+ZGF0YSwKIAkJCSBiZTMyX3RvX2NwdShob3N0cmNiLT5oY2FtLmxlbmd0aCkgLQogCQkJIChvZmZzZXRvZihzdHJ1Y3QgaXByX2hvc3RyY2JfZXJyb3IsIHUpICsKIAkJCSAgb2Zmc2V0b2Yoc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMDdfZXJyb3IsIGRhdGEpKSk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXU4IGFjdGl2ZTsKKwljaGFyICpkZXNjOworfSBwYXRoX2FjdGl2ZV9kZXNjW10gPSB7CisJeyBJUFJfUEFUSF9OT19JTkZPLCAiUGF0aCIgfSwKKwl7IElQUl9QQVRIX0FDVElWRSwgIkFjdGl2ZSBwYXRoIiB9LAorCXsgSVBSX1BBVEhfTk9UX0FDVElWRSwgIkluYWN0aXZlIHBhdGgiIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXU4IHN0YXRlOworCWNoYXIgKmRlc2M7Cit9IHBhdGhfc3RhdGVfZGVzY1tdID0geworCXsgSVBSX1BBVEhfU1RBVEVfTk9fSU5GTywgImhhcyBubyBwYXRoIHN0YXRlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSIgfSwKKwl7IElQUl9QQVRIX0hFQUxUSFksICJpcyBoZWFsdGh5IiB9LAorCXsgSVBSX1BBVEhfREVHUkFERUQsICJpcyBkZWdyYWRlZCIgfSwKKwl7IElQUl9QQVRIX0ZBSUxFRCwgImlzIGZhaWxlZCIgfQorfTsKKworLyoqCisgKiBpcHJfbG9nX2ZhYnJpY19wYXRoIC0gTG9nIGEgZmFicmljIHBhdGggZXJyb3IKKyAqIEBob3N0cmNiOglob3N0cmNiIHN0cnVjdAorICogQGZhYnJpYzoJCWZhYnJpYyBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9sb2dfZmFicmljX3BhdGgoc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiLAorCQkJCXN0cnVjdCBpcHJfaG9zdHJjYl9mYWJyaWNfZGVzYyAqZmFicmljKQoreworCWludCBpLCBqOworCXU4IHBhdGhfc3RhdGUgPSBmYWJyaWMtPnBhdGhfc3RhdGU7CisJdTggYWN0aXZlID0gcGF0aF9zdGF0ZSAmIElQUl9QQVRIX0FDVElWRV9NQVNLOworCXU4IHN0YXRlID0gcGF0aF9zdGF0ZSAmIElQUl9QQVRIX1NUQVRFX01BU0s7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYXRoX2FjdGl2ZV9kZXNjKTsgaSsrKSB7CisJCWlmIChwYXRoX2FjdGl2ZV9kZXNjW2ldLmFjdGl2ZSAhPSBhY3RpdmUpCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShwYXRoX3N0YXRlX2Rlc2MpOyBqKyspIHsKKwkJCWlmIChwYXRoX3N0YXRlX2Rlc2Nbal0uc3RhdGUgIT0gc3RhdGUpCisJCQkJY29udGludWU7CisKKwkJCWlmIChmYWJyaWMtPmNhc2NhZGVkX2V4cGFuZGVyID09IDB4ZmYgJiYgZmFicmljLT5waHkgPT0gMHhmZikgeworCQkJCWlwcl9oY2FtX2Vycihob3N0cmNiLCAiJXMgJXM6IElPQSBQb3J0PSVkXG4iLAorCQkJCQkgICAgIHBhdGhfYWN0aXZlX2Rlc2NbaV0uZGVzYywgcGF0aF9zdGF0ZV9kZXNjW2pdLmRlc2MsCisJCQkJCSAgICAgZmFicmljLT5pb2FfcG9ydCk7CisJCQl9IGVsc2UgaWYgKGZhYnJpYy0+Y2FzY2FkZWRfZXhwYW5kZXIgPT0gMHhmZikgeworCQkJCWlwcl9oY2FtX2Vycihob3N0cmNiLCAiJXMgJXM6IElPQSBQb3J0PSVkLCBQaHk9JWRcbiIsCisJCQkJCSAgICAgcGF0aF9hY3RpdmVfZGVzY1tpXS5kZXNjLCBwYXRoX3N0YXRlX2Rlc2Nbal0uZGVzYywKKwkJCQkJICAgICBmYWJyaWMtPmlvYV9wb3J0LCBmYWJyaWMtPnBoeSk7CisJCQl9IGVsc2UgaWYgKGZhYnJpYy0+cGh5ID09IDB4ZmYpIHsKKwkJCQlpcHJfaGNhbV9lcnIoaG9zdHJjYiwgIiVzICVzOiBJT0EgUG9ydD0lZCwgQ2FzY2FkZT0lZFxuIiwKKwkJCQkJICAgICBwYXRoX2FjdGl2ZV9kZXNjW2ldLmRlc2MsIHBhdGhfc3RhdGVfZGVzY1tqXS5kZXNjLAorCQkJCQkgICAgIGZhYnJpYy0+aW9hX3BvcnQsIGZhYnJpYy0+Y2FzY2FkZWRfZXhwYW5kZXIpOworCQkJfSBlbHNlIHsKKwkJCQlpcHJfaGNhbV9lcnIoaG9zdHJjYiwgIiVzICVzOiBJT0EgUG9ydD0lZCwgQ2FzY2FkZT0lZCwgUGh5PSVkXG4iLAorCQkJCQkgICAgIHBhdGhfYWN0aXZlX2Rlc2NbaV0uZGVzYywgcGF0aF9zdGF0ZV9kZXNjW2pdLmRlc2MsCisJCQkJCSAgICAgZmFicmljLT5pb2FfcG9ydCwgZmFicmljLT5jYXNjYWRlZF9leHBhbmRlciwgZmFicmljLT5waHkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfQorCisJaXByX2VycigiUGF0aCBzdGF0ZT0lMDJYIElPQSBQb3J0PSVkIENhc2NhZGU9JWQgUGh5PSVkXG4iLCBwYXRoX3N0YXRlLAorCQlmYWJyaWMtPmlvYV9wb3J0LCBmYWJyaWMtPmNhc2NhZGVkX2V4cGFuZGVyLCBmYWJyaWMtPnBoeSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXU4IHR5cGU7CisJY2hhciAqZGVzYzsKK30gcGF0aF90eXBlX2Rlc2NbXSA9IHsKKwl7IElQUl9QQVRIX0NGR19JT0FfUE9SVCwgIklPQSBwb3J0IiB9LAorCXsgSVBSX1BBVEhfQ0ZHX0VYUF9QT1JULCAiRXhwYW5kZXIgcG9ydCIgfSwKKwl7IElQUl9QQVRIX0NGR19ERVZJQ0VfUE9SVCwgIkRldmljZSBwb3J0IiB9LAorCXsgSVBSX1BBVEhfQ0ZHX0RFVklDRV9MVU4sICJEZXZpY2UgTFVOIiB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1OCBzdGF0dXM7CisJY2hhciAqZGVzYzsKK30gcGF0aF9zdGF0dXNfZGVzY1tdID0geworCXsgSVBSX1BBVEhfQ0ZHX05PX1BST0IsICJGdW5jdGlvbmFsIiB9LAorCXsgSVBSX1BBVEhfQ0ZHX0RFR1JBREVELCAiRGVncmFkZWQiIH0sCisJeyBJUFJfUEFUSF9DRkdfRkFJTEVELCAiRmFpbGVkIiB9LAorCXsgSVBSX1BBVEhfQ0ZHX1NVU1BFQ1QsICJTdXNwZWN0IiB9LAorCXsgSVBSX1BBVEhfTk9UX0RFVEVDVEVELCAiTWlzc2luZyIgfSwKKwl7IElQUl9QQVRIX0lOQ09SUkVDVF9DT05OLCAiSW5jb3JyZWN0bHkgY29ubmVjdGVkIiB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua19yYXRlW10gPSB7CisJInVua25vd24iLAorCSJkaXNhYmxlZCIsCisJInBoeSByZXNldCBwcm9ibGVtIiwKKwkic3BpbnVwIGhvbGQiLAorCSJwb3J0IHNlbGVjdG9yIiwKKwkidW5rbm93biIsCisJInVua25vd24iLAorCSJ1bmtub3duIiwKKwkiMS41R2JwcyIsCisJIjMuMEdicHMiLAorCSJ1bmtub3duIiwKKwkidW5rbm93biIsCisJInVua25vd24iLAorCSJ1bmtub3duIiwKKwkidW5rbm93biIsCisJInVua25vd24iCit9OworCisvKioKKyAqIGlwcl9sb2dfcGF0aF9lbGVtIC0gTG9nIGEgZmFicmljIHBhdGggZWxlbWVudC4KKyAqIEBob3N0cmNiOglob3N0cmNiIHN0cnVjdAorICogQGNmZzoJCWZhYnJpYyBwYXRoIGVsZW1lbnQgc3RydWN0CisgKgorICogUmV0dXJuIHZhbHVlOgorICogCW5vbmUKKyAqKi8KK3N0YXRpYyB2b2lkIGlwcl9sb2dfcGF0aF9lbGVtKHN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYiwKKwkJCSAgICAgIHN0cnVjdCBpcHJfaG9zdHJjYl9jb25maWdfZWxlbWVudCAqY2ZnKQoreworCWludCBpLCBqOworCXU4IHR5cGUgPSBjZmctPnR5cGVfc3RhdHVzICYgSVBSX1BBVEhfQ0ZHX1RZUEVfTUFTSzsKKwl1OCBzdGF0dXMgPSBjZmctPnR5cGVfc3RhdHVzICYgSVBSX1BBVEhfQ0ZHX1NUQVRVU19NQVNLOworCisJaWYgKHR5cGUgPT0gSVBSX1BBVEhfQ0ZHX05PVF9FWElTVCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGF0aF90eXBlX2Rlc2MpOyBpKyspIHsKKwkJaWYgKHBhdGhfdHlwZV9kZXNjW2ldLnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHBhdGhfc3RhdHVzX2Rlc2MpOyBqKyspIHsKKwkJCWlmIChwYXRoX3N0YXR1c19kZXNjW2pdLnN0YXR1cyAhPSBzdGF0dXMpCisJCQkJY29udGludWU7CisKKwkJCWlmICh0eXBlID09IElQUl9QQVRIX0NGR19JT0FfUE9SVCkgeworCQkJCWlwcl9oY2FtX2Vycihob3N0cmNiLCAiJXMgJXM6IFBoeT0lZCwgTGluayByYXRlPSVzLCBXV049JTA4WCUwOFhcbiIsCisJCQkJCSAgICAgcGF0aF9zdGF0dXNfZGVzY1tqXS5kZXNjLCBwYXRoX3R5cGVfZGVzY1tpXS5kZXNjLAorCQkJCQkgICAgIGNmZy0+cGh5LCBsaW5rX3JhdGVbY2ZnLT5saW5rX3JhdGUgJiBJUFJfUEhZX0xJTktfUkFURV9NQVNLXSwKKwkJCQkJICAgICBiZTMyX3RvX2NwdShjZmctPnd3aWRbMF0pLCBiZTMyX3RvX2NwdShjZmctPnd3aWRbMV0pKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNmZy0+Y2FzY2FkZWRfZXhwYW5kZXIgPT0gMHhmZiAmJiBjZmctPnBoeSA9PSAweGZmKSB7CisJCQkJCWlwcl9oY2FtX2Vycihob3N0cmNiLCAiJXMgJXM6IExpbmsgcmF0ZT0lcywgV1dOPSUwOFglMDhYXG4iLAorCQkJCQkJICAgICBwYXRoX3N0YXR1c19kZXNjW2pdLmRlc2MsIHBhdGhfdHlwZV9kZXNjW2ldLmRlc2MsCisJCQkJCQkgICAgIGxpbmtfcmF0ZVtjZmctPmxpbmtfcmF0ZSAmIElQUl9QSFlfTElOS19SQVRFX01BU0tdLAorCQkJCQkJICAgICBiZTMyX3RvX2NwdShjZmctPnd3aWRbMF0pLCBiZTMyX3RvX2NwdShjZmctPnd3aWRbMV0pKTsKKwkJCQl9IGVsc2UgaWYgKGNmZy0+Y2FzY2FkZWRfZXhwYW5kZXIgPT0gMHhmZikgeworCQkJCQlpcHJfaGNhbV9lcnIoaG9zdHJjYiwgIiVzICVzOiBQaHk9JWQsIExpbmsgcmF0ZT0lcywgIgorCQkJCQkJICAgICAiV1dOPSUwOFglMDhYXG4iLCBwYXRoX3N0YXR1c19kZXNjW2pdLmRlc2MsCisJCQkJCQkgICAgIHBhdGhfdHlwZV9kZXNjW2ldLmRlc2MsIGNmZy0+cGh5LAorCQkJCQkJICAgICBsaW5rX3JhdGVbY2ZnLT5saW5rX3JhdGUgJiBJUFJfUEhZX0xJTktfUkFURV9NQVNLXSwKKwkJCQkJCSAgICAgYmUzMl90b19jcHUoY2ZnLT53d2lkWzBdKSwgYmUzMl90b19jcHUoY2ZnLT53d2lkWzFdKSk7CisJCQkJfSBlbHNlIGlmIChjZmctPnBoeSA9PSAweGZmKSB7CisJCQkJCWlwcl9oY2FtX2Vycihob3N0cmNiLCAiJXMgJXM6IENhc2NhZGU9JWQsIExpbmsgcmF0ZT0lcywgIgorCQkJCQkJICAgICAiV1dOPSUwOFglMDhYXG4iLCBwYXRoX3N0YXR1c19kZXNjW2pdLmRlc2MsCisJCQkJCQkgICAgIHBhdGhfdHlwZV9kZXNjW2ldLmRlc2MsIGNmZy0+Y2FzY2FkZWRfZXhwYW5kZXIsCisJCQkJCQkgICAgIGxpbmtfcmF0ZVtjZmctPmxpbmtfcmF0ZSAmIElQUl9QSFlfTElOS19SQVRFX01BU0tdLAorCQkJCQkJICAgICBiZTMyX3RvX2NwdShjZmctPnd3aWRbMF0pLCBiZTMyX3RvX2NwdShjZmctPnd3aWRbMV0pKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpcHJfaGNhbV9lcnIoaG9zdHJjYiwgIiVzICVzOiBDYXNjYWRlPSVkLCBQaHk9JWQsIExpbmsgcmF0ZT0lcyAiCisJCQkJCQkgICAgICJXV049JTA4WCUwOFhcbiIsIHBhdGhfc3RhdHVzX2Rlc2Nbal0uZGVzYywKKwkJCQkJCSAgICAgcGF0aF90eXBlX2Rlc2NbaV0uZGVzYywgY2ZnLT5jYXNjYWRlZF9leHBhbmRlciwgY2ZnLT5waHksCisJCQkJCQkgICAgIGxpbmtfcmF0ZVtjZmctPmxpbmtfcmF0ZSAmIElQUl9QSFlfTElOS19SQVRFX01BU0tdLAorCQkJCQkJICAgICBiZTMyX3RvX2NwdShjZmctPnd3aWRbMF0pLCBiZTMyX3RvX2NwdShjZmctPnd3aWRbMV0pKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpcHJfaGNhbV9lcnIoaG9zdHJjYiwgIlBhdGggZWxlbWVudD0lMDJYOiBDYXNjYWRlPSVkIFBoeT0lZCBMaW5rIHJhdGU9JXMgIgorCQkgICAgICJXV049JTA4WCUwOFhcbiIsIGNmZy0+dHlwZV9zdGF0dXMsIGNmZy0+Y2FzY2FkZWRfZXhwYW5kZXIsIGNmZy0+cGh5LAorCQkgICAgIGxpbmtfcmF0ZVtjZmctPmxpbmtfcmF0ZSAmIElQUl9QSFlfTElOS19SQVRFX01BU0tdLAorCQkgICAgIGJlMzJfdG9fY3B1KGNmZy0+d3dpZFswXSksIGJlMzJfdG9fY3B1KGNmZy0+d3dpZFsxXSkpOworfQorCisvKioKKyAqIGlwcl9sb2dfZmFicmljX2Vycm9yIC0gTG9nIGEgZmFicmljIGVycm9yLgorICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CisgKiBAaG9zdHJjYjoJaG9zdHJjYiBzdHJ1Y3QKKyAqCisgKiBSZXR1cm4gdmFsdWU6CisgKiAJbm9uZQorICoqLworc3RhdGljIHZvaWQgaXByX2xvZ19mYWJyaWNfZXJyb3Ioc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnLAorCQkJCSBzdHJ1Y3QgaXByX2hvc3RyY2IgKmhvc3RyY2IpCit7CisJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMjBfZXJyb3IgKmVycm9yOworCXN0cnVjdCBpcHJfaG9zdHJjYl9mYWJyaWNfZGVzYyAqZmFicmljOworCXN0cnVjdCBpcHJfaG9zdHJjYl9jb25maWdfZWxlbWVudCAqY2ZnOworCWludCBpLCBhZGRfbGVuOworCisJZXJyb3IgPSAmaG9zdHJjYi0+aGNhbS51LmVycm9yLnUudHlwZV8yMF9lcnJvcjsKKwllcnJvci0+ZmFpbHVyZV9yZWFzb25bc2l6ZW9mKGVycm9yLT5mYWlsdXJlX3JlYXNvbikgLSAxXSA9ICdcMCc7CisJaXByX2hjYW1fZXJyKGhvc3RyY2IsICIlc1xuIiwgZXJyb3ItPmZhaWx1cmVfcmVhc29uKTsKKworCWFkZF9sZW4gPSBiZTMyX3RvX2NwdShob3N0cmNiLT5oY2FtLmxlbmd0aCkgLQorCQkob2Zmc2V0b2Yoc3RydWN0IGlwcl9ob3N0cmNiX2Vycm9yLCB1KSArCisJCSBvZmZzZXRvZihzdHJ1Y3QgaXByX2hvc3RyY2JfdHlwZV8yMF9lcnJvciwgZGVzYykpOworCisJZm9yIChpID0gMCwgZmFicmljID0gZXJyb3ItPmRlc2M7IGkgPCBlcnJvci0+bnVtX2VudHJpZXM7IGkrKykgeworCQlpcHJfbG9nX2ZhYnJpY19wYXRoKGhvc3RyY2IsIGZhYnJpYyk7CisJCWZvcl9lYWNoX2ZhYnJpY19jZmcoZmFicmljLCBjZmcpCisJCQlpcHJfbG9nX3BhdGhfZWxlbShob3N0cmNiLCBjZmcpOworCisJCWFkZF9sZW4gLT0gYmUxNl90b19jcHUoZmFicmljLT5sZW5ndGgpOworCQlmYWJyaWMgPSAoc3RydWN0IGlwcl9ob3N0cmNiX2ZhYnJpY19kZXNjICopCisJCQkoKHVuc2lnbmVkIGxvbmcpZmFicmljICsgYmUxNl90b19jcHUoZmFicmljLT5sZW5ndGgpKTsKKwl9CisKKwlpcHJfbG9nX2hleF9kYXRhKGlvYV9jZmcsICh1MzIgKilmYWJyaWMsIGFkZF9sZW4pOworfQorCiAvKioKICAqIGlwcl9sb2dfZ2VuZXJpY19lcnJvciAtIExvZyBhbiBhZGFwdGVyIGVycm9yLgogICogQGlvYV9jZmc6CWlvYSBjb25maWcgc3RydWN0CkBAIC0xMzMyLDcgKzE1NDksNyBAQAogc3RhdGljIHZvaWQgaXByX2xvZ19nZW5lcmljX2Vycm9yKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZywKIAkJCQkgIHN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYikKIHsKLQlpcHJfbG9nX2hleF9kYXRhKGhvc3RyY2ItPmhjYW0udS5yYXcuZGF0YSwKKwlpcHJfbG9nX2hleF9kYXRhKGlvYV9jZmcsIGhvc3RyY2ItPmhjYW0udS5yYXcuZGF0YSwKIAkJCSBiZTMyX3RvX2NwdShob3N0cmNiLT5oY2FtLmxlbmd0aCkpOwogfQogCkBAIC0xMzk0LDEzICsxNjExLDcgQEAKIAlpZiAoIWlwcl9lcnJvcl90YWJsZVtlcnJvcl9pbmRleF0ubG9nX2hjYW0pCiAJCXJldHVybjsKIAotCWlmIChpcHJfaXNfZGV2aWNlKCZob3N0cmNiLT5oY2FtLnUuZXJyb3IuZmFpbGluZ19kZXZfcmVzX2FkZHIpKSB7Ci0JCWlwcl9yYV9lcnIoaW9hX2NmZywgaG9zdHJjYi0+aGNhbS51LmVycm9yLmZhaWxpbmdfZGV2X3Jlc19hZGRyLAotCQkJICAgIiVzXG4iLCBpcHJfZXJyb3JfdGFibGVbZXJyb3JfaW5kZXhdLmVycm9yKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICIlc1xuIiwKLQkJCWlwcl9lcnJvcl90YWJsZVtlcnJvcl9pbmRleF0uZXJyb3IpOwotCX0KKwlpcHJfaGNhbV9lcnIoaG9zdHJjYiwgIiVzXG4iLCBpcHJfZXJyb3JfdGFibGVbZXJyb3JfaW5kZXhdLmVycm9yKTsKIAogCS8qIFNldCBpbmRpY2F0aW9uIHdlIGhhdmUgbG9nZ2VkIGFuIGVycm9yICovCiAJaW9hX2NmZy0+ZXJyb3JzX2xvZ2dlZCsrOwpAQCAtMTQzNyw2ICsxNjQ4LDkgQEAKIAljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzE3OgogCQlpcHJfbG9nX2VuaGFuY2VkX2R1YWxfaW9hX2Vycm9yKGlvYV9jZmcsIGhvc3RyY2IpOwogCQlicmVhazsKKwljYXNlIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzIwOgorCQlpcHJfbG9nX2ZhYnJpY19lcnJvcihpb2FfY2ZnLCBob3N0cmNiKTsKKwkJYnJlYWs7CiAJY2FzZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8xOgogCWNhc2UgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfREVGQVVMVDoKIAlkZWZhdWx0OgpAQCAtMjA5Myw3ICsyMzA3LDcgQEAKIAogLyoqCiAgKiBpcHJfd29ya2VyX3RocmVhZCAtIFdvcmtlciB0aHJlYWQKLSAqIEBkYXRhOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKKyAqIEB3b3JrOgkJaW9hIGNvbmZpZyBzdHJ1Y3QKICAqCiAgKiBDYWxsZWQgYXQgdGFzayBsZXZlbCBmcm9tIGEgd29yayB0aHJlYWQuIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZQogICogb2YgYWRkaW5nIGFuZCByZW1vdmluZyBkZXZpY2UgZnJvbSB0aGUgbWlkLWxheWVyIGFzIGNvbmZpZ3VyYXRpb24KQEAgLTIxMDIsMTMgKzIzMTYsMTQgQEAKICAqIFJldHVybiB2YWx1ZToKICAqIAlub3RoaW5nCiAgKiovCi1zdGF0aWMgdm9pZCBpcHJfd29ya2VyX3RocmVhZCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgaXByX3dvcmtlcl90aHJlYWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKIAlzdHJ1Y3QgaXByX3Jlc291cmNlX2VudHJ5ICpyZXM7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCXN0cnVjdCBpcHJfZHVtcCAqZHVtcDsKLQlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBkYXRhOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXByX2lvYV9jZmcsIHdvcmtfcSk7CiAJdTggYnVzLCB0YXJnZXQsIGx1bjsKIAlpbnQgZGlkX3dvcms7CiAKQEAgLTI5NjksNyArMzE4NCw2IEBACiAJc3RydWN0IGlwcl9kdW1wICpkdW1wOwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CiAKLQlFTlRFUjsKIAlkdW1wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwcl9kdW1wKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWR1bXApIHsKQEAgLTI5OTYsNyArMzIxMCw2IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKIAotCUxFQVZFOwogCXJldHVybiAwOwogfQogCkBAIC0zNTczLDYgKzM3ODYsMTIgQEAKIAogCUVOVEVSOwogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJd2hpbGUoaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwkJd2FpdF9ldmVudChpb2FfY2ZnLT5yZXNldF93YWl0X3EsICFpb2FfY2ZnLT5pbl9yZXNldF9yZWxvYWQpOworCQlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCX0KKwogCXJlcyA9IHNhdGFfcG9ydC0+cmVzOwogCWlmIChyZXMpIHsKIAkJcmMgPSBpcHJfZGV2aWNlX3Jlc2V0KGlvYV9jZmcsIHJlcyk7CkBAIC0zNjM2LDYgKzM4NTUsMTAgQEAKIAkJaWYgKGlwcl9jbWQtPmlvYXJjYi5yZXNfaGFuZGxlID09IHJlcy0+Y2ZndGUucmVzX2hhbmRsZSkgewogCQkJaWYgKGlwcl9jbWQtPnNjc2lfY21kKQogCQkJCWlwcl9jbWQtPmRvbmUgPSBpcHJfc2NzaV9laF9kb25lOworCQkJaWYgKGlwcl9jbWQtPnFjICYmICEoaXByX2NtZC0+cWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpKSB7CisJCQkJaXByX2NtZC0+cWMtPmVycl9tYXNrIHw9IEFDX0VSUl9USU1FT1VUOworCQkJCWlwcl9jbWQtPnFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0ZBSUxFRDsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzc3MCw3ICszOTkzLDcgQEAKIAkgKi8KIAlpZiAoaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkIHx8IGlvYV9jZmctPmlvYV9pc19kZWFkKQogCQlyZXR1cm4gRkFJTEVEOwotCWlmICghcmVzIHx8ICghaXByX2lzX2dzY3NpKHJlcykgJiYgIWlwcl9pc192c2V0X2RldmljZShyZXMpKSkKKwlpZiAoIXJlcyB8fCAhaXByX2lzX2dzY3NpKHJlcykpCiAJCXJldHVybiBGQUlMRUQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlwcl9jbWQsICZpb2FfY2ZnLT5wZW5kaW5nX3EsIHF1ZXVlKSB7CkBAIC00NjE1LDcgKzQ4MzgsNyBAQAogICogUmV0dXJuIHZhbHVlOgogICogCTAgb24gc3VjY2VzcyAvIG90aGVyIG9uIGZhaWx1cmUKICAqKi8KLWludCBpcHJfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBpcHJfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBpcHJfcmVzb3VyY2VfZW50cnkgKnJlczsKIApAQCAtNDY0OCw0MCArNDg3MSw2IEBACiAJcmV0dXJuIGJ1ZmZlcjsKIH0KIAotLyoqCi0gKiBpcHJfc2NzaV90aW1lZF9vdXQgLSBIYW5kbGUgc2NzaSBjb21tYW5kIHRpbWVvdXQKLSAqIEBzY3NpX2NtZDoJc2NzaSBjb21tYW5kIHN0cnVjdAotICoKLSAqIFJldHVybiB2YWx1ZToKLSAqIAlFSF9OT1RfSEFORExFRAotICoqLwotZW51bSBzY3NpX2VoX3RpbWVyX3JldHVybiBpcHJfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqc2NzaV9jbWQpCi17Ci0Jc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnOwotCXN0cnVjdCBpcHJfY21uZCAqaXByX2NtZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRU5URVI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoc2NzaV9jbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilzY3NpX2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaXByX2NtZCwgJmlvYV9jZmctPnBlbmRpbmdfcSwgcXVldWUpIHsKLQkJaWYgKGlwcl9jbWQtPnFjICYmIGlwcl9jbWQtPnFjLT5zY3NpY21kID09IHNjc2lfY21kKSB7Ci0JCQlpcHJfY21kLT5xYy0+ZXJyX21hc2sgfD0gQUNfRVJSX1RJTUVPVVQ7Ci0JCQlpcHJfY21kLT5xYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19GQUlMRUQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NzaV9jbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JTEVBVkU7Ci0JcmV0dXJuIEVIX05PVF9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlIGlwcl90cmFuc3BvcnRfdGVtcGxhdGUgPSB7Ci0JLmVoX3RpbWVkX291dCA9IGlwcl9zY3NpX3RpbWVkX291dAotfTsKLQogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gewogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKIAkubmFtZSA9ICJJUFIiLApAQCAtNDc3Niw2ICs0OTY1LDEyIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXdoaWxlKGlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQl3YWl0X2V2ZW50KGlvYV9jZmctPnJlc2V0X3dhaXRfcSwgIWlvYV9jZmctPmluX3Jlc2V0X3JlbG9hZCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCX0KKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoaXByX2NtZCwgJmlvYV9jZmctPnBlbmRpbmdfcSwgcXVldWUpIHsKIAkJaWYgKGlwcl9jbWQtPnFjID09IHFjKSB7CiAJCQlpcHJfZGV2aWNlX3Jlc2V0KGlvYV9jZmcsIHNhdGFfcG9ydC0+cmVzKTsKQEAgLTY3NDUsNyArNjk0MCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yIChpID0gMDsgaSA8IElQUl9OVU1fQ01EX0JMS1M7IGkrKykgewotCQlpcHJfY21kID0gcGNpX3Bvb2xfYWxsb2MgKGlvYV9jZmctPmlwcl9jbWRfcG9vbCwgU0xBQl9LRVJORUwsICZkbWFfYWRkcik7CisJCWlwcl9jbWQgPSBwY2lfcG9vbF9hbGxvYyAoaW9hX2NmZy0+aXByX2NtZF9wb29sLCBHRlBfS0VSTkVMLCAmZG1hX2FkZHIpOwogCiAJCWlmICghaXByX2NtZCkgewogCQkJaXByX2ZyZWVfY21kX2Jsa3MoaW9hX2NmZyk7CkBAIC02ODMyLDYgKzcwMjcsNyBAQAogCiAJCWlvYV9jZmctPmhvc3RyY2JbaV0tPmhvc3RyY2JfZG1hID0KIAkJCWlvYV9jZmctPmhvc3RyY2JfZG1hW2ldICsgb2Zmc2V0b2Yoc3RydWN0IGlwcl9ob3N0cmNiLCBoY2FtKTsKKwkJaW9hX2NmZy0+aG9zdHJjYltpXS0+aW9hX2NmZyA9IGlvYV9jZmc7CiAJCWxpc3RfYWRkX3RhaWwoJmlvYV9jZmctPmhvc3RyY2JbaV0tPnF1ZXVlLCAmaW9hX2NmZy0+aG9zdHJjYl9mcmVlX3EpOwogCX0KIApAQCAtNjkyNiw3ICs3MTIyLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aG9zdHJjYl9wZW5kaW5nX3EpOwogCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5mcmVlX3Jlc19xKTsKIAlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+dXNlZF9yZXNfcSk7Ci0JSU5JVF9XT1JLKCZpb2FfY2ZnLT53b3JrX3EsIGlwcl93b3JrZXJfdGhyZWFkLCBpb2FfY2ZnKTsKKwlJTklUX1dPUksoJmlvYV9jZmctPndvcmtfcSwgaXByX3dvcmtlcl90aHJlYWQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlvYV9jZmctPnJlc2V0X3dhaXRfcSk7CiAJaW9hX2NmZy0+c2R0X3N0YXRlID0gSU5BQ1RJVkU7CiAJaWYgKGlwcl9lbmFibGVfY2FjaGUpCkBAIC03MDE3LDcgKzcyMTMsNiBAQAogCiAJaW9hX2NmZyA9IChzdHJ1Y3QgaXByX2lvYV9jZmcgKilob3N0LT5ob3N0ZGF0YTsKIAltZW1zZXQoaW9hX2NmZywgMCwgc2l6ZW9mKHN0cnVjdCBpcHJfaW9hX2NmZykpOwotCWhvc3QtPnRyYW5zcG9ydHQgPSAmaXByX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIAlhdGFfaG9zdF9pbml0KCZpb2FfY2ZnLT5hdGFfaG9zdCwgJnBkZXYtPmRldiwKIAkJICAgICAgc2F0YV9wb3J0X2luZm8uZmxhZ3MsICZpcHJfc2F0YV9vcHMpOwogCkBAIC03MzUxLDEyICs3NTQ2LDI0IEBACiAJeyBQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCBQQ0lfREVWSUNFX0lEX0FEQVBURUMyX09CU0lESUFOLAogCSAgICAgIFBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTcyQiwKIAkgICAgICAwLCAwLCAoa2VybmVsX3Vsb25nX3QpJmlwcl9jaGlwX2NmZ1swXSB9LAorCXsgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9PQlNJRElBTiwKKwkgICAgICBQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3NUMsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9PQlNJRElBTiwKIAkgICAgICBQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3MkEsCiAJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKIAl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9PQlNJRElBTiwKIAkgICAgICBQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3MkIsCiAJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9PQlNJRElBTiwKKwkgICAgICBQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3NUMsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9PQlNJRElBTiwKKwkgICAgICBQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzU3QjgsCisJICAgICAgMCwgMCwgKGtlcm5lbF91bG9uZ190KSZpcHJfY2hpcF9jZmdbMF0gfSwKKwl7IFBDSV9WRU5ET1JfSURfSUJNLCBQQ0lfREVWSUNFX0lEX0lCTV9PQlNJRElBTl9FLAorCSAgICAgIFBDSV9WRU5ET1JfSURfSUJNLCBJUFJfU1VCU19ERVZfSURfNTdCNywKKwkgICAgICAwLCAwLCAoa2VybmVsX3Vsb25nX3QpJmlwcl9jaGlwX2NmZ1swXSB9LAogCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX1NOSVBFLAogCQlQQ0lfVkVORE9SX0lEX0lCTSwgSVBSX1NVQlNfREVWX0lEXzI3ODAsCiAJCTAsIDAsIChrZXJuZWxfdWxvbmdfdCkmaXByX2NoaXBfY2ZnWzFdIH0sCkBAIC03MzY2LDYgKzc1NzMsOSBAQAogCXsgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9TQ0FNUCwKIAkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzFGLAogCQkwLCAwLCAoa2VybmVsX3Vsb25nX3QpJmlwcl9jaGlwX2NmZ1sxXSB9LAorCXsgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgUENJX0RFVklDRV9JRF9BREFQVEVDMl9TQ0FNUCwKKwkJUENJX1ZFTkRPUl9JRF9JQk0sIElQUl9TVUJTX0RFVl9JRF81NzJGLAorCQkwLCAwLCAoa2VybmVsX3Vsb25nX3QpJmlwcl9jaGlwX2NmZ1sxXSB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpcHJfcGNpX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuaCBiL2RyaXZlcnMvc2NzaS9pcHIuaAppbmRleCA2ZDAzNTI4Li45ZjYyYTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmgKKysrIGIvZHJpdmVycy9zY3NpL2lwci5oCkBAIC0zNyw4ICszNyw4IEBACiAvKgogICogTGl0ZXJhbHMKICAqLwotI2RlZmluZSBJUFJfRFJJVkVSX1ZFUlNJT04gIjIuMi4wIgotI2RlZmluZSBJUFJfRFJJVkVSX0RBVEUgIihTZXB0ZW1iZXIgMjUsIDIwMDYpIgorI2RlZmluZSBJUFJfRFJJVkVSX1ZFUlNJT04gIjIuMy4wIgorI2RlZmluZSBJUFJfRFJJVkVSX0RBVEUgIihOb3ZlbWJlciA4LCAyMDA2KSIKIAogLyoKICAqIElQUl9NQVhfQ01EX1BFUl9MVU46IFRoaXMgZGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcKQEAgLTU0LDYgKzU0LDggQEAKICAqLwogI2RlZmluZSBJUFJfTlVNX0JBU0VfQ01EX0JMS1MJCQkJMTAwCiAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fT0JTSURJQU5fRQkweDAzMzkKKwogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfMjc4MAkweDAyNjQKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MDIJMHgwMjY2CiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzAzCTB4MDI3OApAQCAtNjYsNyArNjgsMTEgQEAKICNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MUYJMHgwMkQ1CiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzJBCTB4MDJDMQogI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTcyQgkweDAyQzIKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3MkYJMHgwMkMzCiAjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81NzVCCTB4MDMwRAorI2RlZmluZSBJUFJfU1VCU19ERVZfSURfNTc1QwkweDAzMzgKKyNkZWZpbmUgSVBSX1NVQlNfREVWX0lEXzU3QjcJMHgwMzYwCisjZGVmaW5lIElQUl9TVUJTX0RFVl9JRF81N0I4CTB4MDJDMgogCiAjZGVmaW5lIElQUl9OQU1FCQkJCSJpcHIiCiAKQEAgLTk4LDYgKzEwNCw3IEBACiAjZGVmaW5lIElQUl9JT0FTQ19JT0FfV0FTX1JFU0VUCQkJMHgxMDAwMDAwMQogI2RlZmluZSBJUFJfSU9BU0NfUENJX0FDQ0VTU19FUlJPUgkJCTB4MTAwMDAwMDIKIAorI2RlZmluZSBJUFJfREVGQVVMVF9NQVhfRVJST1JfRFVNUAkJCTk4NAogI2RlZmluZSBJUFJfTlVNX0xPR19IQ0FNUwkJCQkyCiAjZGVmaW5lIElQUl9OVU1fQ0ZHX0NIR19IQ0FNUwkJCQkyCiAjZGVmaW5lIElQUl9OVU1fSENBTVMJKElQUl9OVU1fTE9HX0hDQU1TICsgSVBSX05VTV9DRkdfQ0hHX0hDQU1TKQpAQCAtNzMxLDYgKzczOCw2NCBAQAogCXUzMiBkYXRhWzQ3Nl07CiB9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOwogCitzdHJ1Y3QgaXByX2hvc3RyY2JfY29uZmlnX2VsZW1lbnQgeworCXU4IHR5cGVfc3RhdHVzOworI2RlZmluZSBJUFJfUEFUSF9DRkdfVFlQRV9NQVNLCTB4RjAKKyNkZWZpbmUgSVBSX1BBVEhfQ0ZHX05PVF9FWElTVAkweDAwCisjZGVmaW5lIElQUl9QQVRIX0NGR19JT0FfUE9SVAkJMHgxMAorI2RlZmluZSBJUFJfUEFUSF9DRkdfRVhQX1BPUlQJCTB4MjAKKyNkZWZpbmUgSVBSX1BBVEhfQ0ZHX0RFVklDRV9QT1JUCTB4MzAKKyNkZWZpbmUgSVBSX1BBVEhfQ0ZHX0RFVklDRV9MVU4JMHg0MAorCisjZGVmaW5lIElQUl9QQVRIX0NGR19TVEFUVVNfTUFTSwkweDBGCisjZGVmaW5lIElQUl9QQVRIX0NGR19OT19QUk9CCQkweDAwCisjZGVmaW5lIElQUl9QQVRIX0NGR19ERUdSQURFRAkJMHgwMQorI2RlZmluZSBJUFJfUEFUSF9DRkdfRkFJTEVECQkweDAyCisjZGVmaW5lIElQUl9QQVRIX0NGR19TVVNQRUNUCQkweDAzCisjZGVmaW5lIElQUl9QQVRIX05PVF9ERVRFQ1RFRAkJMHgwNAorI2RlZmluZSBJUFJfUEFUSF9JTkNPUlJFQ1RfQ09OTgkweDA1CisKKwl1OCBjYXNjYWRlZF9leHBhbmRlcjsKKwl1OCBwaHk7CisJdTggbGlua19yYXRlOworI2RlZmluZSBJUFJfUEhZX0xJTktfUkFURV9NQVNLCTB4MEYKKworCV9fYmUzMiB3d2lkWzJdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworc3RydWN0IGlwcl9ob3N0cmNiX2ZhYnJpY19kZXNjIHsKKwlfX2JlMTYgbGVuZ3RoOworCXU4IGlvYV9wb3J0OworCXU4IGNhc2NhZGVkX2V4cGFuZGVyOworCXU4IHBoeTsKKwl1OCBwYXRoX3N0YXRlOworI2RlZmluZSBJUFJfUEFUSF9BQ1RJVkVfTUFTSwkJMHhDMAorI2RlZmluZSBJUFJfUEFUSF9OT19JTkZPCQkweDAwCisjZGVmaW5lIElQUl9QQVRIX0FDVElWRQkJCTB4NDAKKyNkZWZpbmUgSVBSX1BBVEhfTk9UX0FDVElWRQkJMHg4MAorCisjZGVmaW5lIElQUl9QQVRIX1NUQVRFX01BU0sJCTB4MEYKKyNkZWZpbmUgSVBSX1BBVEhfU1RBVEVfTk9fSU5GTwkweDAwCisjZGVmaW5lIElQUl9QQVRIX0hFQUxUSFkJCTB4MDEKKyNkZWZpbmUgSVBSX1BBVEhfREVHUkFERUQJCTB4MDIKKyNkZWZpbmUgSVBSX1BBVEhfRkFJTEVECQkJMHgwMworCisJX19iZTE2IG51bV9lbnRyaWVzOworCXN0cnVjdCBpcHJfaG9zdHJjYl9jb25maWdfZWxlbWVudCBlbGVtWzFdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCAoNCkpKTsKKworI2RlZmluZSBmb3JfZWFjaF9mYWJyaWNfY2ZnKGZhYnJpYywgY2ZnKSBcCisJCWZvciAoY2ZnID0gKGZhYnJpYyktPmVsZW07IFwKKwkJCWNmZyA8ICgoZmFicmljKS0+ZWxlbSArIGJlMTZfdG9fY3B1KChmYWJyaWMpLT5udW1fZW50cmllcykpOyBcCisJCQljZmcrKykKKworc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMjBfZXJyb3IgeworCXU4IGZhaWx1cmVfcmVhc29uWzY0XTsKKwl1OCByZXNlcnZlZFszXTsKKwl1OCBudW1fZW50cmllczsKKwlzdHJ1Y3QgaXByX2hvc3RyY2JfZmFicmljX2Rlc2MgZGVzY1sxXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQgKDQpKSk7CisKIHN0cnVjdCBpcHJfaG9zdHJjYl9lcnJvciB7CiAJX19iZTMyIGZhaWxpbmdfZGV2X2lvYXNjOwogCXN0cnVjdCBpcHJfcmVzX2FkZHIgZmFpbGluZ19kZXZfcmVzX2FkZHI7CkBAIC03NDcsNiArODEyLDcgQEAKIAkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMTNfZXJyb3IgdHlwZV8xM19lcnJvcjsKIAkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMTRfZXJyb3IgdHlwZV8xNF9lcnJvcjsKIAkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMTdfZXJyb3IgdHlwZV8xN19lcnJvcjsKKwkJc3RydWN0IGlwcl9ob3N0cmNiX3R5cGVfMjBfZXJyb3IgdHlwZV8yMF9lcnJvcjsKIAl9IHU7CiB9X19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkICg0KSkpOwogCkBAIC03ODYsNiArODUyLDcgQEAKICNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMTQJCQkJMHgxNAogI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF8xNgkJCQkweDE2CiAjZGVmaW5lIElQUl9IT1NUX1JDQl9PVkVSTEFZX0lEXzE3CQkJCTB4MTcKKyNkZWZpbmUgSVBSX0hPU1RfUkNCX09WRVJMQVlfSURfMjAJCQkJMHgyMAogI2RlZmluZSBJUFJfSE9TVF9SQ0JfT1ZFUkxBWV9JRF9ERUZBVUxUCQkJMHhGRgogCiAJdTggcmVzZXJ2ZWQxWzNdOwpAQCAtODA1LDYgKzg3Miw3IEBACiAJc3RydWN0IGlwcl9oY2FtIGhjYW07CiAJZG1hX2FkZHJfdCBob3N0cmNiX2RtYTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZzsKIH07CiAKIC8qIElQUiBzbWFydCBkdW1wIHRhYmxlIHN0cnVjdHVyZXMgKi8KQEAgLTEyODMsNiArMTM1MSwxNyBAQAogCX0JCQkJCQkJCVwKIH0KIAorI2RlZmluZSBpcHJfaGNhbV9lcnIoaG9zdHJjYiwgZm10LCAuLi4pCQkJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlpZiAoaXByX2lzX2RldmljZSgmKGhvc3RyY2IpLT5oY2FtLnUuZXJyb3IuZmFpbGluZ19kZXZfcmVzX2FkZHIpKSB7CQlcCisJCWlwcl9yYV9lcnIoKGhvc3RyY2IpLT5pb2FfY2ZnLAkJCQkJCQlcCisJCQkJKGhvc3RyY2IpLT5oY2FtLnUuZXJyb3IuZmFpbGluZ19kZXZfcmVzX2FkZHIsCQkJXAorCQkJCWZtdCwgIyNfX1ZBX0FSR1NfXyk7CQkJCQkJCVwKKwl9IGVsc2UgewkJCQkJCQkJCQkJXAorCQlkZXZfZXJyKCYoaG9zdHJjYiktPmlvYV9jZmctPnBkZXYtPmRldiwgZm10LCAjI19fVkFfQVJHU19fKTsJCVwKKwl9CQkJCQkJCQkJCQkJXAorfQorCiAjZGVmaW5lIGlwcl90cmFjZSBpcHJfZGJnKCIlczogJXM6IExpbmU6ICVkXG4iLFwKIAlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwcy5jIGIvZHJpdmVycy9zY3NpL2lwcy5jCmluZGV4IGYwNmEwNmEuLjhiNzA0ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHMuYworKysgYi9kcml2ZXJzL3Njc2kvaXBzLmMKQEAgLTUwMDEsNyArNTAwMSw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLwotCQkJbXNsZWVwKElQU19PTkVfU0VDKTsKKwkJCU1ERUxBWShJUFNfT05FX1NFQyk7CiAJCX0KIAogCQlpZiAoaiA+PSA0NSkKQEAgLTUwMjcsNyArNTAyNyw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLwotCQkJbXNsZWVwKElQU19PTkVfU0VDKTsKKwkJCU1ERUxBWShJUFNfT05FX1NFQyk7CiAJCX0KIAogCQlpZiAoaiA+PSAyNDApCkBAIC01MDQ1LDcgKzUwNDUsNyBAQAogCQkJYnJlYWs7CiAKIAkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCi0JCW1zbGVlcChJUFNfT05FX1NFQyk7CisJCU1ERUxBWShJUFNfT05FX1NFQyk7CiAJfQogCiAJaWYgKGkgPj0gMjQwKQpAQCAtNTA5NSw3ICs1MDk1LDcgQEAKIAkJCQlicmVhazsKIAogCQkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCi0JCQltc2xlZXAoSVBTX09ORV9TRUMpOworCQkJTURFTEFZKElQU19PTkVfU0VDKTsKIAkJfQogCiAJCWlmIChqID49IDQ1KQpAQCAtNTEyMSw3ICs1MTIxLDcgQEAKIAkJCQlicmVhazsKIAogCQkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCi0JCQltc2xlZXAoSVBTX09ORV9TRUMpOworCQkJTURFTEFZKElQU19PTkVfU0VDKTsKIAkJfQogCiAJCWlmIChqID49IDI0MCkKQEAgLTUxMzksNyArNTEzOSw3IEBACiAJCQlicmVhazsKIAogCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KLQkJbXNsZWVwKElQU19PTkVfU0VDKTsKKwkJTURFTEFZKElQU19PTkVfU0VDKTsKIAl9CiAKIAlpZiAoaSA+PSAyNDApCkBAIC01MTkxLDcgKzUxOTEsNyBAQAogCQkJYnJlYWs7CiAKIAkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCi0JCW1zbGVlcChJUFNfT05FX1NFQyk7CisJCU1ERUxBWShJUFNfT05FX1NFQyk7CiAJfQogCiAJaWYgKGkgPj0gNDUpIHsKQEAgLTUyMTcsNyArNTIxNyw3IEBACiAJCQlpZiAoUG9zdCAhPSAweDRGMDApCiAJCQkJYnJlYWs7CiAJCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KLQkJCW1zbGVlcChJUFNfT05FX1NFQyk7CisJCQlNREVMQVkoSVBTX09ORV9TRUMpOwogCQl9CiAKIAkJaWYgKGkgPj0gMTIwKSB7CkBAIC01MjQ3LDcgKzUyNDcsNyBAQAogCQkJYnJlYWs7CiAKIAkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCi0JCW1zbGVlcChJUFNfT05FX1NFQyk7CisJCU1ERUxBWShJUFNfT05FX1NFQyk7CiAJfQogCiAJaWYgKGkgPj0gMjQwKSB7CkBAIC01MzA3LDEyICs1MzA3LDEyIEBACiAJCW91dGIoSVBTX0JJVF9SU1QsIGhhLT5pb19hZGRyICsgSVBTX1JFR19TQ1BSKTsKIAogCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KLQkJbXNsZWVwKElQU19PTkVfU0VDKTsKKwkJTURFTEFZKElQU19PTkVfU0VDKTsKIAogCQlvdXRiKDAsIGhhLT5pb19hZGRyICsgSVBTX1JFR19TQ1BSKTsKIAogCQkvKiBEZWxheSBmb3IgMSBTZWNvbmQgKi8KLQkJbXNsZWVwKElQU19PTkVfU0VDKTsKKwkJTURFTEFZKElQU19PTkVfU0VDKTsKIAogCQlpZiAoKCpoYS0+ZnVuYy5pbml0KSAoaGEpKQogCQkJYnJlYWs7CkBAIC01MzUyLDEyICs1MzUyLDEyIEBACiAJCXdyaXRlYihJUFNfQklUX1JTVCwgaGEtPm1lbV9wdHIgKyBJUFNfUkVHX1NDUFIpOwogCiAJCS8qIERlbGF5IGZvciAxIFNlY29uZCAqLwotCQltc2xlZXAoSVBTX09ORV9TRUMpOworCQlNREVMQVkoSVBTX09ORV9TRUMpOwogCiAJCXdyaXRlYigwLCBoYS0+bWVtX3B0ciArIElQU19SRUdfU0NQUik7CiAKIAkJLyogRGVsYXkgZm9yIDEgU2Vjb25kICovCi0JCW1zbGVlcChJUFNfT05FX1NFQyk7CisJCU1ERUxBWShJUFNfT05FX1NFQyk7CiAKIAkJaWYgKCgqaGEtPmZ1bmMuaW5pdCkgKGhhKSkKIAkJCWJyZWFrOwpAQCAtNTM5OCw3ICs1Mzk4LDcgQEAKIAkJd3JpdGVsKDB4ODAwMDAwMDAsIGhhLT5tZW1fcHRyICsgSVBTX1JFR19JOTYwX0lEUik7CiAKIAkJLyogRGVsYXkgZm9yIDUgU2Vjb25kcyAqLwotCQltc2xlZXAoNSAqIElQU19PTkVfU0VDKTsKKwkJTURFTEFZKDUgKiBJUFNfT05FX1NFQyk7CiAKIAkJLyogRG8gYSBQQ0kgY29uZmlnIHJlYWQgdG8gd2FpdCBmb3IgYWRhcHRlciAqLwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShoYS0+cGNpZGV2LCA0LCAmanVuayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXBzLmggYi9kcml2ZXJzL3Njc2kvaXBzLmgKaW5kZXggMzQ2ODBmMy4uYjcyNmRjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9pcHMuaApAQCAtNTEsNiArNTEsNyBAQAogICAgI2RlZmluZSBfSVBTX0hfCiAKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CiAgICAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICAgICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtMTE2LDkgKzExNywxMSBAQAogICAgICAgICAgICAgZGV2X3ByaW50ayhsZXZlbCAsICYoKHBjaWRldiktPmRldikgLCBmb3JtYXQgLCAjIyBhcmcpCiAgICAjZW5kaWYKIAotICAgI2lmbmRlZiBNREVMQVkKLSAgICAgICNkZWZpbmUgTURFTEFZIG1kZWxheQotICAgI2VuZGlmCisgICAjZGVmaW5lIE1ERUxBWShuKQkJCVwKKwlkbyB7CQkJCVwKKwkJbWRlbGF5KG4pOwkJXAorCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsJXAorCX0gd2hpbGUgKDApCiAKICAgICNpZm5kZWYgbWluCiAgICAgICAjZGVmaW5lIG1pbih4LHkpICgoeCkgPCAoeSkgPyB4IDogeSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwppbmRleCAwYTlkYmM1Li5kMGIxMzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjc2lfdGNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCkBAIC00MTUsOCArNDE1LDggQEAKIAlpc2NzaV9zb2xpY2l0X2RhdGFfaW5pdChjb25uLCBjdGFzaywgcjJ0KTsKIAogCXRjcF9jdGFzay0+ZXhwX3IydHNuID0gcjJ0c24gKyAxOwotCXRjcF9jdGFzay0+eG1zdGF0ZSB8PSBYTVNUQVRFX1NPTF9IRFI7CiAJX19rZmlmb19wdXQodGNwX2N0YXNrLT5yMnRxdWV1ZSwgKHZvaWQqKSZyMnQsIHNpemVvZih2b2lkKikpOworCXRjcF9jdGFzay0+eG1zdGF0ZSB8PSBYTVNUQVRFX1NPTF9IRFI7CiAJbGlzdF9tb3ZlX3RhaWwoJmN0YXNrLT5ydW5uaW5nLCAmY29ubi0+eG1pdHF1ZXVlKTsKIAogCXNjc2lfcXVldWVfd29yayhzZXNzaW9uLT5ob3N0LCAmY29ubi0+eG1pdHdvcmspOwpAQCAtMTYyNyw5ICsxNjI3LDEyIEBACiAJaWYgKHRjcF9jdGFzay0+eG1zdGF0ZSAmIFhNU1RBVEVfU09MX0hEUikgewogCQl0Y3BfY3Rhc2stPnhtc3RhdGUgJj0gflhNU1RBVEVfU09MX0hEUjsKIAkJdGNwX2N0YXNrLT54bXN0YXRlIHw9IFhNU1RBVEVfU09MX0RBVEE7Ci0JCWlmICghdGNwX2N0YXNrLT5yMnQpCisJCWlmICghdGNwX2N0YXNrLT5yMnQpIHsKKwkJCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAJCQlfX2tmaWZvX2dldCh0Y3BfY3Rhc2stPnIydHF1ZXVlLCAodm9pZCopJnRjcF9jdGFzay0+cjJ0LAogCQkJCSAgICBzaXplb2Yodm9pZCopKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKKwkJfQogc2VuZF9oZHI6CiAJCXIydCA9IHRjcF9jdGFzay0+cjJ0OwogCQlkdGFzayA9ICZyMnQtPmR0YXNrOwpAQCAtMTgxNiwyMSArMTgxOSwxNCBAQAogewogCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CiAJc3RydWN0IGlzY3NpX3RjcF9jb25uICp0Y3BfY29ubiA9IGNvbm4tPmRkX2RhdGE7Ci0JaW50IGRpZ2VzdCA9IDA7Ci0KLQlpZiAoY29ubi0+aGRyZGdzdF9lbiB8fCBjb25uLT5kYXRhZGdzdF9lbikKLQkJZGlnZXN0ID0gMTsKIAogCWlzY3NpX3RjcF9yZWxlYXNlX2Nvbm4oY29ubik7CiAJaXNjc2lfY29ubl90ZWFyZG93bihjbHNfY29ubik7CiAKLQkvKiBub3cgZnJlZSB0Y3BfY29ubiAqLwotCWlmIChkaWdlc3QpIHsKLQkJaWYgKHRjcF9jb25uLT50eF9oYXNoLnRmbSkKLQkJCWNyeXB0b19mcmVlX2hhc2godGNwX2Nvbm4tPnR4X2hhc2gudGZtKTsKLQkJaWYgKHRjcF9jb25uLT5yeF9oYXNoLnRmbSkKLQkJCWNyeXB0b19mcmVlX2hhc2godGNwX2Nvbm4tPnJ4X2hhc2gudGZtKTsKLQl9CisJaWYgKHRjcF9jb25uLT50eF9oYXNoLnRmbSkKKwkJY3J5cHRvX2ZyZWVfaGFzaCh0Y3BfY29ubi0+dHhfaGFzaC50Zm0pOworCWlmICh0Y3BfY29ubi0+cnhfaGFzaC50Zm0pCisJCWNyeXB0b19mcmVlX2hhc2godGNwX2Nvbm4tPnJ4X2hhc2gudGZtKTsKIAogCWtmcmVlKHRjcF9jb25uKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKaW5kZXggYzU0MmQwZS4uZTExYjIzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMKQEAgLTQ4MSw4ICs0ODEsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgSVNDU0lfT1BfQVNZTkNfRVZFTlQ6CiAJCQljb25uLT5leHBfc3RhdHNuID0gYmUzMl90b19jcHUoaGRyLT5zdGF0c24pICsgMTsKLQkJCS8qIHdlIG5lZWQgc3RoIGxpa2UgaXNjc2lfYXN5bmNfZXZlbnRfcnNwKCkgKi8KLQkJCXJjID0gSVNDU0lfRVJSX0JBRF9PUENPREU7CisJCQlpZiAoaXNjc2lfcmVjdl9wZHUoY29ubi0+Y2xzX2Nvbm4sIGhkciwgZGF0YSwgZGF0YWxlbikpCisJCQkJcmMgPSBJU0NTSV9FUlJfQ09OTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJjID0gSVNDU0lfRVJSX0JBRF9PUENPREU7CkBAIC01NzgsNiArNTc4LDI3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jb25uX2ZhaWx1cmUpOwogCitzdGF0aWMgaW50IGlzY3NpX3htaXRfaW1tX3Rhc2soc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCit7CisJc3RydWN0IGlzY3NpX2hkciAqaGRyID0gY29ubi0+bXRhc2stPmhkcjsKKwlpbnQgcmMsIHdhc19sb2dvdXQgPSAwOworCisJaWYgKChoZHItPm9wY29kZSAmIElTQ1NJX09QQ09ERV9NQVNLKSA9PSBJU0NTSV9PUF9MT0dPVVQpIHsKKwkJY29ubi0+c2Vzc2lvbi0+c3RhdGUgPSBJU0NTSV9TVEFURV9JTl9SRUNPVkVSWTsKKwkJaXNjc2lfYmxvY2tfc2Vzc2lvbihzZXNzaW9uX3RvX2Nscyhjb25uLT5zZXNzaW9uKSk7CisJCXdhc19sb2dvdXQgPSAxOworCX0KKwlyYyA9IGNvbm4tPnNlc3Npb24tPnR0LT54bWl0X21nbXRfdGFzayhjb25uLCBjb25uLT5tdGFzayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2FzX2xvZ291dCkgeworCQlzZXRfYml0KElTQ1NJX1NVU1BFTkRfQklULCAmY29ubi0+c3VzcGVuZF90eCk7CisJCXJldHVybiAtRU5PREFUQTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogaXNjc2lfZGF0YV94bWl0IC0geG1pdCBhbnkgY29tbWFuZCBpbnRvIHRoZSBzY2hlZHVsZWQgY29ubmVjdGlvbgogICogQGNvbm46IGlzY3NpIGNvbm5lY3Rpb24KQEAgLTYyMyw3ICs2NDQsNyBAQAogCQljb25uLT5jdGFzayA9IE5VTEw7CiAJfQogCWlmIChjb25uLT5tdGFzaykgewotCQlyYyA9IHR0LT54bWl0X21nbXRfdGFzayhjb25uLCBjb25uLT5tdGFzayk7CisJCXJjID0gaXNjc2lfeG1pdF9pbW1fdGFzayhjb25uKTsKIAkgICAgICAgIGlmIChyYykKIAkJICAgICAgICBnb3RvIGFnYWluOwogCQkvKiBkb25lIHdpdGggdGhpcyBpbi1wcm9ncmVzcyBtdGFzayAqLwpAQCAtNjM4LDcgKzY1OSw3IEBACiAJCQlsaXN0X2FkZF90YWlsKCZjb25uLT5tdGFzay0+cnVubmluZywKIAkJCQkgICAgICAmY29ubi0+bWdtdF9ydW5fbGlzdCk7CiAJCQlzcGluX3VubG9ja19iaCgmY29ubi0+c2Vzc2lvbi0+bG9jayk7Ci0JCQlyYyA9IHR0LT54bWl0X21nbXRfdGFzayhjb25uLCBjb25uLT5tdGFzayk7CisJCQlyYyA9IGlzY3NpX3htaXRfaW1tX3Rhc2soY29ubik7CiAJCSAgICAgICAgaWYgKHJjKQogCQkJICAgICAgICBnb3RvIGFnYWluOwogCSAgICAgICAgfQpAQCAtNjYxLDggKzY4Miw2IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zZXNzaW9uLT5sb2NrKTsKIAogCQlyYyA9IHR0LT54bWl0X2NtZF90YXNrKGNvbm4sIGNvbm4tPmN0YXNrKTsKLQkJaWYgKHJjKQotCQkJZ290byBhZ2FpbjsKIAogCQlzcGluX2xvY2tfYmgoJmNvbm4tPnNlc3Npb24tPmxvY2spOwogCQlfX2lzY3NpX3B1dF9jdGFzayhjb25uLT5jdGFzayk7CkBAIC03MDAsOSArNzE5LDEwIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBpc2NzaV94bWl0d29ya2VyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBpc2NzaV94bWl0d29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiA9IGRhdGE7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGlzY3NpX2Nvbm4sIHhtaXR3b3JrKTsKIAlpbnQgcmM7CiAJLyoKIAkgKiBzZXJpYWxpemUgWG1pdCB3b3JrZXIgb24gYSBwZXItY29ubmVjdGlvbiBiYXNpcy4KQEAgLTc3OCw2ICs3OTgsMTAgQEAKIAl9CiAKIAljb25uID0gc2Vzc2lvbi0+bGVhZGNvbm47CisJaWYgKCFjb25uKSB7CisJCXJlYXNvbiA9IEZBSUxVUkVfU0VTU0lPTl9GUkVFRDsKKwkJZ290byBmYXVsdDsKKwl9CiAKIAlpZiAoIV9fa2ZpZm9fZ2V0KHNlc3Npb24tPmNtZHBvb2wucXVldWUsICh2b2lkKikmY3Rhc2ssCiAJCQkgc2l6ZW9mKHZvaWQqKSkpIHsKQEAgLTk1MiwxMyArOTc2LDEzIEBACiAJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NUQVRFX1RFUk1JTkFURSkgewogZmFpbGVkOgogCQlkZWJ1Z19zY3NpKCJmYWlsaW5nIGhvc3QgcmVzZXQ6IHNlc3Npb24gdGVybWluYXRlZCAiCi0JCQkgICAiW0NJRCAlZCBhZ2UgJWRdIiwgY29ubi0+aWQsIHNlc3Npb24tPmFnZSk7CisJCQkgICAiW0NJRCAlZCBhZ2UgJWRdXG4iLCBjb25uLT5pZCwgc2Vzc2lvbi0+YWdlKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIAogCWlmIChzYy0+U0NwLnBoYXNlID09IHNlc3Npb24tPmFnZSkgewotCQlkZWJ1Z19zY3NpKCJmYWlsaW5nIGNvbm5lY3Rpb24gQ0lEICVkIGR1ZSB0byBTQ1NJIGhvc3QgcmVzZXQiLAorCQlkZWJ1Z19zY3NpKCJmYWlsaW5nIGNvbm5lY3Rpb24gQ0lEICVkIGR1ZSB0byBTQ1NJIGhvc3QgcmVzZXRcbiIsCiAJCQkgICBjb25uLT5pZCk7CiAJCWZhaWxfc2Vzc2lvbiA9IDE7CiAJfQpAQCAtMTAzMSw3ICsxMDU1LDggQEAKIAkJCQkgICAgIE5VTEwsIDApOwogCWlmIChyYykgewogCQlpc2NzaV9jb25uX2ZhaWx1cmUoY29ubiwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKLQkJZGVidWdfc2NzaSgiYWJvcnQgc2VudCBmYWlsdXJlIFtpdHQgMHgleF0gJWQiLCBjdGFzay0+aXR0LCByYyk7CisJCWRlYnVnX3Njc2koImFib3J0IHNlbnQgZmFpbHVyZSBbaXR0IDB4JXhdICVkXG4iLCBjdGFzay0+aXR0LAorCQkgICAgICAgICAgIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtMTA0OCw3ICsxMDczLDcgQEAKIAkJY29ubi0+dG1hYm9ydF90aW1lci5mdW5jdGlvbiA9IGlzY3NpX3RtYWJvcnRfdGltZWRvdXQ7CiAJCWNvbm4tPnRtYWJvcnRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWN0YXNrOwogCQlhZGRfdGltZXIoJmNvbm4tPnRtYWJvcnRfdGltZXIpOwotCQlkZWJ1Z19zY3NpKCJhYm9ydCBzZXQgdGltZW91dCBbaXR0IDB4JXhdIiwgY3Rhc2stPml0dCk7CisJCWRlYnVnX3Njc2koImFib3J0IHNldCB0aW1lb3V0IFtpdHQgMHgleF1cbiIsIGN0YXNrLT5pdHQpOwogCX0KIAlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZjb25uLT54bWl0bXV0ZXgpOwpAQCAtMTM3Nyw3ICsxNDAyLDYgQEAKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmc2Vzc2lvbi0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPmNvbm5lY3Rpb25zKTsKIAogCS8qIGluaXRpYWxpemUgaW1tZWRpYXRlIGNvbW1hbmQgcG9vbCAqLwogCWlmIChpc2NzaV9wb29sX2luaXQoJnNlc3Npb24tPm1nbXRwb29sLCBzZXNzaW9uLT5tZ210cG9vbF9tYXgsCkBAIC0xNDg5LDcgKzE1MTMsNyBAQAogCWlmIChjb25uLT5tZ210cXVldWUgPT0gRVJSX1BUUigtRU5PTUVNKSkKIAkJZ290byBtZ210cXVldWVfYWxsb2NfZmFpbDsKIAotCUlOSVRfV09SSygmY29ubi0+eG1pdHdvcmssIGlzY3NpX3htaXR3b3JrZXIsIGNvbm4pOworCUlOSVRfV09SSygmY29ubi0+eG1pdHdvcmssIGlzY3NpX3htaXR3b3JrZXIpOwogCiAJLyogYWxsb2NhdGUgbG9naW5fbXRhc2sgdXNlZCBmb3IgdGhlIGxvZ2luL3RleHQgc2VxdWVuY2VzICovCiAJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKQEAgLTE1ODAsMTYgKzE2MDQsMTEgQEAKIAlrZnJlZShjb25uLT5wZXJzaXN0ZW50X2FkZHJlc3MpOwogCV9fa2ZpZm9fcHV0KHNlc3Npb24tPm1nbXRwb29sLnF1ZXVlLCAodm9pZCopJmNvbm4tPmxvZ2luX210YXNrLAogCQkgICAgc2l6ZW9mKHZvaWQqKSk7Ci0JbGlzdF9kZWwoJmNvbm4tPml0ZW0pOwotCWlmIChsaXN0X2VtcHR5KCZzZXNzaW9uLT5jb25uZWN0aW9ucykpCisJaWYgKHNlc3Npb24tPmxlYWRjb25uID09IGNvbm4pIHsKIAkJc2Vzc2lvbi0+bGVhZGNvbm4gPSBOVUxMOwotCWlmIChzZXNzaW9uLT5sZWFkY29ubiAmJiBzZXNzaW9uLT5sZWFkY29ubiA9PSBjb25uKQotCQlzZXNzaW9uLT5sZWFkY29ubiA9IGNvbnRhaW5lcl9vZihzZXNzaW9uLT5jb25uZWN0aW9ucy5uZXh0LAotCQkJc3RydWN0IGlzY3NpX2Nvbm4sIGl0ZW0pOwotCi0JaWYgKHNlc3Npb24tPmxlYWRjb25uID09IE5VTEwpCiAJCS8qIG5vIGNvbm5lY3Rpb25zIGV4aXRzLi4gcmVzZXQgc2VxdWVuY2luZyAqLwogCQlzZXNzaW9uLT5jbWRzbiA9IHNlc3Npb24tPm1heF9jbWRzbiA9IHNlc3Npb24tPmV4cF9jbWRzbiA9IDE7CisJfQogCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAogCWtmaWZvX2ZyZWUoY29ubi0+aW1tcXVldWUpOwpAQCAtMTc3NywzMiArMTc5NiwxMiBAQAogCQkgICAgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubiwgaW50IGlzX2xlYWRpbmcpCiB7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3Npb24gPSBjbGFzc190b190cmFuc3BvcnRfc2Vzc2lvbihjbHNfc2Vzc2lvbik7Ci0Jc3RydWN0IGlzY3NpX2Nvbm4gKnRtcCA9IEVSUl9QVFIoLUVFWElTVCksICpjb25uID0gY2xzX2Nvbm4tPmRkX2RhdGE7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKIAotCS8qIGxvb2t1cCBmb3IgZXhpc3RpbmcgY29ubmVjdGlvbiAqLwogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZzZXNzaW9uLT5jb25uZWN0aW9ucywgaXRlbSkgewotCQlpZiAodG1wID09IGNvbm4pIHsKLQkJCWlmIChjb25uLT5jX3N0YWdlICE9IElTQ1NJX0NPTk5fU1RPUFBFRCB8fAotCQkJICAgIGNvbm4tPnN0b3Bfc3RhZ2UgPT0gU1RPUF9DT05OX1RFUk0pIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBjYW4ndCBiaW5kICIKLQkJCQkgICAgICAgIm5vbi1zdG9wcGVkIGNvbm5lY3Rpb24gKCVkOiVkKVxuIiwKLQkJCQkgICAgICAgY29ubi0+Y19zdGFnZSwgY29ubi0+c3RvcF9zdGFnZSk7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHRtcCAhPSBjb25uKSB7Ci0JCS8qIGJpbmQgbmV3IGlTQ1NJIGNvbm5lY3Rpb24gdG8gc2Vzc2lvbiAqLwotCQljb25uLT5zZXNzaW9uID0gc2Vzc2lvbjsKLQkJbGlzdF9hZGQoJmNvbm4tPml0ZW0sICZzZXNzaW9uLT5jb25uZWN0aW9ucyk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKLQogCWlmIChpc19sZWFkaW5nKQogCQlzZXNzaW9uLT5sZWFkY29ubiA9IGNvbm47CisJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwogCiAJLyoKIAkgKiBVbmJsb2NrIHhtaXR3b3JrZXIoKSwgTG9naW4gUGhhc2Ugd2lsbCBwYXNzIHRocm91Z2guCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlzY292ZXIuYwppbmRleCBkOTc3YmQ0Li5mYjdkZjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMKQEAgLTY0NywxMCArNjQ3LDEyIEBACiAgKiBEaXNjb3ZlciBwcm9jZXNzIG9ubHkgaW50ZXJyb2dhdGVzIGRldmljZXMgaW4gb3JkZXIgdG8gZGlzY292ZXIgdGhlCiAgKiBkb21haW4uCiAgKi8KLXN0YXRpYyB2b2lkIHNhc19kaXNjb3Zlcl9kb21haW4odm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHNhc19kaXNjb3Zlcl9kb21haW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCBlcnJvciA9IDA7Ci0Jc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCA9IGRhdGE7CisJc3RydWN0IHNhc19kaXNjb3ZlcnlfZXZlbnQgKmV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzYXNfZGlzY292ZXJ5X2V2ZW50LCB3b3JrKTsKKwlzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0ID0gZXYtPnBvcnQ7CiAKIAlzYXNfYmVnaW5fZXZlbnQoRElTQ0VfRElTQ09WRVJfRE9NQUlOLCAmcG9ydC0+ZGlzYy5kaXNjX2V2ZW50X2xvY2ssCiAJCQkmcG9ydC0+ZGlzYy5wZW5kaW5nKTsKQEAgLTY5MiwxMCArNjk0LDEyIEBACiAJCSAgICBjdXJyZW50LT5waWQsIGVycm9yKTsKIH0KIAotc3RhdGljIHZvaWQgc2FzX3JldmFsaWRhdGVfZG9tYWluKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzYXNfcmV2YWxpZGF0ZV9kb21haW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCByZXMgPSAwOwotCXN0cnVjdCBhc2Rfc2FzX3BvcnQgKnBvcnQgPSBkYXRhOworCXN0cnVjdCBzYXNfZGlzY292ZXJ5X2V2ZW50ICpldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2FzX2Rpc2NvdmVyeV9ldmVudCwgd29yayk7CisJc3RydWN0IGFzZF9zYXNfcG9ydCAqcG9ydCA9IGV2LT5wb3J0OwogCiAJc2FzX2JlZ2luX2V2ZW50KERJU0NFX1JFVkFMSURBVEVfRE9NQUlOLCAmcG9ydC0+ZGlzYy5kaXNjX2V2ZW50X2xvY2ssCiAJCQkmcG9ydC0+ZGlzYy5wZW5kaW5nKTsKQEAgLTcyMiw3ICs3MjYsNyBAQAogCUJVR19PTihldiA+PSBESVNDX05VTV9FVkVOVFMpOwogCiAJc2FzX3F1ZXVlX2V2ZW50KGV2LCAmZGlzYy0+ZGlzY19ldmVudF9sb2NrLCAmZGlzYy0+cGVuZGluZywKLQkJCSZkaXNjLT5kaXNjX3dvcmtbZXZdLCBwb3J0LT5oYS0+Y29yZS5zaG9zdCk7CisJCQkmZGlzYy0+ZGlzY193b3JrW2V2XS53b3JrLCBwb3J0LT5oYS0+Y29yZS5zaG9zdCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTczNywxMyArNzQxLDE1IEBACiB7CiAJaW50IGk7CiAKLQlzdGF0aWMgdm9pZCAoKnNhc19ldmVudF9mbnNbRElTQ19OVU1fRVZFTlRTXSkodm9pZCAqKSA9IHsKKwlzdGF0aWMgY29uc3Qgd29ya19mdW5jX3Qgc2FzX2V2ZW50X2Zuc1tESVNDX05VTV9FVkVOVFNdID0gewogCQlbRElTQ0VfRElTQ09WRVJfRE9NQUlOXSA9IHNhc19kaXNjb3Zlcl9kb21haW4sCiAJCVtESVNDRV9SRVZBTElEQVRFX0RPTUFJTl0gPSBzYXNfcmV2YWxpZGF0ZV9kb21haW4sCiAJfTsKIAogCXNwaW5fbG9ja19pbml0KCZkaXNjLT5kaXNjX2V2ZW50X2xvY2spOwogCWRpc2MtPnBlbmRpbmcgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBESVNDX05VTV9FVkVOVFM7IGkrKykKLQkJSU5JVF9XT1JLKCZkaXNjLT5kaXNjX3dvcmtbaV0sIHNhc19ldmVudF9mbnNbaV0sIHBvcnQpOworCWZvciAoaSA9IDA7IGkgPCBESVNDX05VTV9FVkVOVFM7IGkrKykgeworCQlJTklUX1dPUksoJmRpc2MtPmRpc2Nfd29ya1tpXS53b3JrLCBzYXNfZXZlbnRfZm5zW2ldKTsKKwkJZGlzYy0+ZGlzY193b3JrW2ldLnBvcnQgPSBwb3J0OworCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V2ZW50LmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19ldmVudC5jCmluZGV4IDE5MTEwZWQuLmQ4MzM5MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V2ZW50LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXZlbnQuYwpAQCAtMzEsNyArMzEsNyBAQAogCUJVR19PTihldmVudCA+PSBIQV9OVU1fRVZFTlRTKTsKIAogCXNhc19xdWV1ZV9ldmVudChldmVudCwgJnNhc19oYS0+ZXZlbnRfbG9jaywgJnNhc19oYS0+cGVuZGluZywKLQkJCSZzYXNfaGEtPmhhX2V2ZW50c1tldmVudF0sIHNhc19oYS0+Y29yZS5zaG9zdCk7CisJCQkmc2FzX2hhLT5oYV9ldmVudHNbZXZlbnRdLndvcmssIHNhc19oYS0+Y29yZS5zaG9zdCk7CiB9CiAKIHN0YXRpYyB2b2lkIG5vdGlmeV9wb3J0X2V2ZW50KHN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5LCBlbnVtIHBvcnRfZXZlbnQgZXZlbnQpCkBAIC00MSw3ICs0MSw3IEBACiAJQlVHX09OKGV2ZW50ID49IFBPUlRfTlVNX0VWRU5UUyk7CiAKIAlzYXNfcXVldWVfZXZlbnQoZXZlbnQsICZoYS0+ZXZlbnRfbG9jaywgJnBoeS0+cG9ydF9ldmVudHNfcGVuZGluZywKLQkJCSZwaHktPnBvcnRfZXZlbnRzW2V2ZW50XSwgaGEtPmNvcmUuc2hvc3QpOworCQkJJnBoeS0+cG9ydF9ldmVudHNbZXZlbnRdLndvcmssIGhhLT5jb3JlLnNob3N0KTsKIH0KIAogc3RhdGljIHZvaWQgbm90aWZ5X3BoeV9ldmVudChzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSwgZW51bSBwaHlfZXZlbnQgZXZlbnQpCkBAIC01MSwxMiArNTEsMTIgQEAKIAlCVUdfT04oZXZlbnQgPj0gUEhZX05VTV9FVkVOVFMpOwogCiAJc2FzX3F1ZXVlX2V2ZW50KGV2ZW50LCAmaGEtPmV2ZW50X2xvY2ssICZwaHktPnBoeV9ldmVudHNfcGVuZGluZywKLQkJCSZwaHktPnBoeV9ldmVudHNbZXZlbnRdLCBoYS0+Y29yZS5zaG9zdCk7CisJCQkmcGh5LT5waHlfZXZlbnRzW2V2ZW50XS53b3JrLCBoYS0+Y29yZS5zaG9zdCk7CiB9CiAKIGludCBzYXNfaW5pdF9ldmVudHMoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSkKIHsKLQlzdGF0aWMgdm9pZCAoKnNhc19oYV9ldmVudF9mbnNbSEFfTlVNX0VWRU5UU10pKHZvaWQgKikgPSB7CisJc3RhdGljIGNvbnN0IHdvcmtfZnVuY190IHNhc19oYV9ldmVudF9mbnNbSEFfTlVNX0VWRU5UU10gPSB7CiAJCVtIQUVfUkVTRVRdID0gc2FzX2hhZV9yZXNldCwKIAl9OwogCkBAIC02NCw4ICs2NCwxMCBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnNhc19oYS0+ZXZlbnRfbG9jayk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgSEFfTlVNX0VWRU5UUzsgaSsrKQotCQlJTklUX1dPUksoJnNhc19oYS0+aGFfZXZlbnRzW2ldLCBzYXNfaGFfZXZlbnRfZm5zW2ldLCBzYXNfaGEpOworCWZvciAoaSA9IDA7IGkgPCBIQV9OVU1fRVZFTlRTOyBpKyspIHsKKwkJSU5JVF9XT1JLKCZzYXNfaGEtPmhhX2V2ZW50c1tpXS53b3JrLCBzYXNfaGFfZXZlbnRfZm5zW2ldKTsKKwkJc2FzX2hhLT5oYV9ldmVudHNbaV0uaGEgPSBzYXNfaGE7CisJfQogCiAJc2FzX2hhLT5ub3RpZnlfaGFfZXZlbnQgPSBub3RpZnlfaGFfZXZlbnQ7CiAJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudCA9IG5vdGlmeV9wb3J0X2V2ZW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKaW5kZXggMzBiODAxNC4uZDMxZTZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCkBAIC03MSw1NSArNzEsNjUgQEAKIHN0YXRpYyBpbnQgc21wX2V4ZWN1dGVfdGFzayhzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCB2b2lkICpyZXEsIGludCByZXFfc2l6ZSwKIAkJCSAgICB2b2lkICpyZXNwLCBpbnQgcmVzcF9zaXplKQogewotCWludCByZXM7Ci0Jc3RydWN0IHNhc190YXNrICp0YXNrID0gc2FzX2FsbG9jX3Rhc2soR0ZQX0tFUk5FTCk7CisJaW50IHJlcywgcmV0cnk7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gTlVMTDsKIAlzdHJ1Y3Qgc2FzX2ludGVybmFsICppID0KIAkJdG9fc2FzX2ludGVybmFsKGRldi0+cG9ydC0+aGEtPmNvcmUuc2hvc3QtPnRyYW5zcG9ydHQpOwogCi0JaWYgKCF0YXNrKQotCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAzOyByZXRyeSsrKSB7CisJCXRhc2sgPSBzYXNfYWxsb2NfdGFzayhHRlBfS0VSTkVMKTsKKwkJaWYgKCF0YXNrKQorCQkJcmV0dXJuIC1FTk9NRU07CiAKLQl0YXNrLT5kZXYgPSBkZXY7Ci0JdGFzay0+dGFza19wcm90byA9IGRldi0+dHByb3RvOwotCXNnX2luaXRfb25lKCZ0YXNrLT5zbXBfdGFzay5zbXBfcmVxLCByZXEsIHJlcV9zaXplKTsKLQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3Jlc3AsIHJlc3AsIHJlc3Bfc2l6ZSk7CisJCXRhc2stPmRldiA9IGRldjsKKwkJdGFzay0+dGFza19wcm90byA9IGRldi0+dHByb3RvOworCQlzZ19pbml0X29uZSgmdGFzay0+c21wX3Rhc2suc21wX3JlcSwgcmVxLCByZXFfc2l6ZSk7CisJCXNnX2luaXRfb25lKCZ0YXNrLT5zbXBfdGFzay5zbXBfcmVzcCwgcmVzcCwgcmVzcF9zaXplKTsKIAotCXRhc2stPnRhc2tfZG9uZSA9IHNtcF90YXNrX2RvbmU7CisJCXRhc2stPnRhc2tfZG9uZSA9IHNtcF90YXNrX2RvbmU7CiAKLQl0YXNrLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHRhc2s7Ci0JdGFzay0+dGltZXIuZnVuY3Rpb24gPSBzbXBfdGFza190aW1lZG91dDsKLQl0YXNrLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFNNUF9USU1FT1VUKkhaOwotCWFkZF90aW1lcigmdGFzay0+dGltZXIpOworCQl0YXNrLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHRhc2s7CisJCXRhc2stPnRpbWVyLmZ1bmN0aW9uID0gc21wX3Rhc2tfdGltZWRvdXQ7CisJCXRhc2stPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU01QX1RJTUVPVVQqSFo7CisJCWFkZF90aW1lcigmdGFzay0+dGltZXIpOwogCi0JcmVzID0gaS0+ZGZ0LT5sbGRkX2V4ZWN1dGVfdGFzayh0YXNrLCAxLCBHRlBfS0VSTkVMKTsKKwkJcmVzID0gaS0+ZGZ0LT5sbGRkX2V4ZWN1dGVfdGFzayh0YXNrLCAxLCBHRlBfS0VSTkVMKTsKIAotCWlmIChyZXMpIHsKLQkJZGVsX3RpbWVyKCZ0YXNrLT50aW1lcik7Ci0JCVNBU19EUFJJTlRLKCJleGVjdXRpbmcgU01QIHRhc2sgZmFpbGVkOiVkXG4iLCByZXMpOwotCQlnb3RvIGV4X2VycjsKLQl9Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0YXNrLT5jb21wbGV0aW9uKTsKLQlyZXMgPSAtRVRBU0s7Ci0JaWYgKCh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKLQkJU0FTX0RQUklOVEsoInNtcCB0YXNrIHRpbWVkIG91dCBvciBhYm9ydGVkXG4iKTsKLQkJaS0+ZGZ0LT5sbGRkX2Fib3J0X3Rhc2sodGFzayk7Ci0JCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkgewotCQkJU0FTX0RQUklOVEsoIlNNUCB0YXNrIGFib3J0ZWQgYW5kIG5vdCBkb25lXG4iKTsKKwkJaWYgKHJlcykgeworCQkJZGVsX3RpbWVyKCZ0YXNrLT50aW1lcik7CisJCQlTQVNfRFBSSU5USygiZXhlY3V0aW5nIFNNUCB0YXNrIGZhaWxlZDolZFxuIiwgcmVzKTsKIAkJCWdvdG8gZXhfZXJyOwogCQl9CisKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmdGFzay0+Y29tcGxldGlvbik7CisJCXJlcyA9IC1FVEFTSzsKKwkJaWYgKCh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfQUJPUlRFRCkpIHsKKwkJCVNBU19EUFJJTlRLKCJzbXAgdGFzayB0aW1lZCBvdXQgb3IgYWJvcnRlZFxuIik7CisJCQlpLT5kZnQtPmxsZGRfYWJvcnRfdGFzayh0YXNrKTsKKwkJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkgeworCQkJCVNBU19EUFJJTlRLKCJTTVAgdGFzayBhYm9ydGVkIGFuZCBub3QgZG9uZVxuIik7CisJCQkJZ290byBleF9lcnI7CisJCQl9CisJCX0KKwkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKKwkJICAgIHRhc2stPnRhc2tfc3RhdHVzLnN0YXQgPT0gU0FNX0dPT0QpIHsKKwkJCXJlcyA9IDA7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCVNBU19EUFJJTlRLKCIlczogdGFzayB0byBkZXYgJTAxNmxseCByZXNwb25zZTogMHgleCAiCisJCQkJICAgICJzdGF0dXMgMHgleFxuIiwgX19GVU5DVElPTl9fLAorCQkJCSAgICBTQVNfQUREUihkZXYtPnNhc19hZGRyKSwKKwkJCQkgICAgdGFzay0+dGFza19zdGF0dXMucmVzcCwKKwkJCQkgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCk7CisJCQlzYXNfZnJlZV90YXNrKHRhc2spOworCQkJdGFzayA9IE5VTEw7CisJCX0KIAl9Ci0JaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKLQkgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQU1fR09PRCkKLQkJcmVzID0gMDsKLQllbHNlCi0JCVNBU19EUFJJTlRLKCIlczogdGFzayB0byBkZXYgJTAxNmxseCByZXNwb25zZTogMHgleCAiCi0JCQkgICAgInN0YXR1cyAweCV4XG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgU0FTX0FERFIoZGV2LT5zYXNfYWRkciksCi0JCQkgICAgdGFzay0+dGFza19zdGF0dXMucmVzcCwKLQkJCSAgICB0YXNrLT50YXNrX3N0YXR1cy5zdGF0KTsKIGV4X2VycjoKLQlzYXNfZnJlZV90YXNrKHRhc2spOworCUJVR19PTihyZXRyeSA9PSAzICYmIHRhc2sgIT0gTlVMTCk7CisJaWYgKHRhc2sgIT0gTlVMTCkgeworCQlzYXNfZnJlZV90YXNrKHRhc2spOworCX0KIAlyZXR1cm4gcmVzOwogfQogCkBAIC01ODcsMTAgKzU5NywxNSBAQAogCWNoaWxkLT5pcHJvdG8gPSBwaHktPmF0dGFjaGVkX2lwcm90bzsKIAltZW1jcHkoY2hpbGQtPnNhc19hZGRyLCBwaHktPmF0dGFjaGVkX3Nhc19hZGRyLCBTQVNfQUREUl9TSVpFKTsKIAlzYXNfaGFzaF9hZGRyKGNoaWxkLT5oYXNoZWRfc2FzX2FkZHIsIGNoaWxkLT5zYXNfYWRkcik7Ci0JcGh5LT5wb3J0ID0gc2FzX3BvcnRfYWxsb2MoJnBhcmVudC0+cnBoeS0+ZGV2LCBwaHlfaWQpOwotCUJVR19PTighcGh5LT5wb3J0KTsKLQkvKiBGSVhNRTogYmV0dGVyIGVycm9yIGhhbmRsaW5nKi8KLQlCVUdfT04oc2FzX3BvcnRfYWRkKHBoeS0+cG9ydCkgIT0gMCk7CisJaWYgKCFwaHktPnBvcnQpIHsKKwkJcGh5LT5wb3J0ID0gc2FzX3BvcnRfYWxsb2MoJnBhcmVudC0+cnBoeS0+ZGV2LCBwaHlfaWQpOworCQlpZiAodW5saWtlbHkoIXBoeS0+cG9ydCkpCisJCQlnb3RvIG91dF9lcnI7CisJCWlmICh1bmxpa2VseShzYXNfcG9ydF9hZGQocGh5LT5wb3J0KSAhPSAwKSkgeworCQkJc2FzX3BvcnRfZnJlZShwaHktPnBvcnQpOworCQkJZ290byBvdXRfZXJyOworCQl9CisJfQogCXNhc19leF9nZXRfbGlua3JhdGUocGFyZW50LCBjaGlsZCwgcGh5KTsKIAogCWlmICgocGh5LT5hdHRhY2hlZF90cHJvdG8gJiBTQVNfUFJPVE9fU1RQKSB8fCBwaHktPmF0dGFjaGVkX3NhdGFfZGV2KSB7CkBAIC02MDUsOCArNjIwLDcgQEAKIAkJCVNBU19EUFJJTlRLKCJyZXBvcnQgcGh5IHNhdGEgdG8gJTAxNmxseDoweCV4IHJldHVybmVkICIKIAkJCQkgICAgIjB4JXhcbiIsIFNBU19BRERSKHBhcmVudC0+c2FzX2FkZHIpLAogCQkJCSAgICBwaHlfaWQsIHJlcyk7Ci0JCQlrZnJlZShjaGlsZCk7Ci0JCQlyZXR1cm4gTlVMTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KIAkJbWVtY3B5KGNoaWxkLT5mcmFtZV9yY3ZkLCAmY2hpbGQtPnNhdGFfZGV2LnJwc19yZXNwLnJwcy5maXMsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGRldl90b19ob3N0X2ZpcykpOwpAQCAtNjE3LDE0ICs2MzEsMTQgQEAKIAkJCQkgICAgIiUwMTZsbHg6MHgleCByZXR1cm5lZCAweCV4XG4iLAogCQkJCSAgICBTQVNfQUREUihjaGlsZC0+c2FzX2FkZHIpLAogCQkJCSAgICBTQVNfQUREUihwYXJlbnQtPnNhc19hZGRyKSwgcGh5X2lkLCByZXMpOwotCQkJa2ZyZWUoY2hpbGQpOwotCQkJcmV0dXJuIE5VTEw7CisJCQlnb3RvIG91dF9mcmVlOwogCQl9CiAJfSBlbHNlIGlmIChwaHktPmF0dGFjaGVkX3Rwcm90byAmIFNBU19QUk9UT19TU1ApIHsKIAkJY2hpbGQtPmRldl90eXBlID0gU0FTX0VORF9ERVY7CiAJCXJwaHkgPSBzYXNfZW5kX2RldmljZV9hbGxvYyhwaHktPnBvcnQpOwogCQkvKiBGSVhNRTogZXJyb3IgaGFuZGxpbmcgKi8KLQkJQlVHX09OKCFycGh5KTsKKwkJaWYgKHVubGlrZWx5KCFycGh5KSkKKwkJCWdvdG8gb3V0X2ZyZWU7CiAJCWNoaWxkLT50cHJvdG8gPSBwaHktPmF0dGFjaGVkX3Rwcm90bzsKIAkJc2FzX2luaXRfZGV2KGNoaWxkKTsKIApAQCAtNjQxLDkgKzY1NSw3IEBACiAJCQkJICAgICJhdCAlMDE2bGx4OjB4JXggcmV0dXJuZWQgMHgleFxuIiwKIAkJCQkgICAgU0FTX0FERFIoY2hpbGQtPnNhc19hZGRyKSwKIAkJCQkgICAgU0FTX0FERFIocGFyZW50LT5zYXNfYWRkciksIHBoeV9pZCwgcmVzKTsKLQkJCS8qIEZJWE1FOiB0aGlzIGtmcmVlcyBsaXN0IGVsZW1lbnRzIHdpdGhvdXQgcmVtb3ZpbmcgdGhlbSAqLwotCQkJLy9rZnJlZShjaGlsZCk7Ci0JCQlyZXR1cm4gTlVMTDsKKwkJCWdvdG8gb3V0X2xpc3RfZGVsOwogCQl9CiAJfSBlbHNlIHsKIAkJU0FTX0RQUklOVEsoInRhcmdldCBwcm90byAweCV4IGF0ICUwMTZsbHg6MHgleCBub3QgaGFuZGxlZFxuIiwKQEAgLTY1Myw2ICs2NjUsMTYgQEAKIAogCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5zaWJsaW5ncywgJnBhcmVudF9leC0+Y2hpbGRyZW4pOwogCXJldHVybiBjaGlsZDsKKworIG91dF9saXN0X2RlbDoKKwlsaXN0X2RlbCgmY2hpbGQtPmRldl9saXN0X25vZGUpOworCXNhc19ycGh5X2ZyZWUocnBoeSk7Cisgb3V0X2ZyZWU6CisJc2FzX3BvcnRfZGVsZXRlKHBoeS0+cG9ydCk7Cisgb3V0X2VycjoKKwlwaHktPnBvcnQgPSBOVUxMOworCWtmcmVlKGNoaWxkKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHN0cnVjdCBkb21haW5fZGV2aWNlICpzYXNfZXhfZGlzY292ZXJfZXhwYW5kZXIoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19pbml0LmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19pbml0LmMKaW5kZXggYzgzNmEyMy4uMmYwYzA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2luaXQuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjaW5jbHVkZSAiLi4vc2NzaV9zYXNfaW50ZXJuYWwuaCIKIAota21lbV9jYWNoZV90ICpzYXNfdGFza19jYWNoZTsKK3N0cnVjdCBrbWVtX2NhY2hlICpzYXNfdGFza19jYWNoZTsKIAogLyotLS0tLS0tLS0tLS0gU0FTIGFkZHIgaGFzaCAtLS0tLS0tLS0tLSovCiB2b2lkIHNhc19oYXNoX2FkZHIodTggKmhhc2hlZCwgY29uc3QgdTggKnNhc19hZGRyKQpAQCAtNjUsOSArNjUsMTEgQEAKIAogLyogLS0tLS0tLS0tLSBIQSBldmVudHMgLS0tLS0tLS0tLSAqLwogCi12b2lkIHNhc19oYWVfcmVzZXQodm9pZCAqZGF0YSkKK3ZvaWQgc2FzX2hhZV9yZXNldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNhc19oYV9zdHJ1Y3QgKmhhID0gZGF0YTsKKwlzdHJ1Y3Qgc2FzX2hhX2V2ZW50ICpldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2FzX2hhX2V2ZW50LCB3b3JrKTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqaGEgPSBldi0+aGE7CiAKIAlzYXNfYmVnaW5fZXZlbnQoSEFFX1JFU0VULCAmaGEtPmV2ZW50X2xvY2ssCiAJCQkmaGEtPnBlbmRpbmcpOwpAQCAtMTEyLDYgKzExNCw4IEBACiAJCX0KIAl9CiAKKwlJTklUX0xJU1RfSEVBRCgmc2FzX2hhLT5laF9kb25lX3EpOworCiAJcmV0dXJuIDA7CiAKIFVuZG9fcG9ydHM6CkBAIC0xNDIsNyArMTQ2LDcgQEAKIAlyZXR1cm4gc2FzX3NtcF9nZXRfcGh5X2V2ZW50cyhwaHkpOwogfQogCi1zdGF0aWMgaW50IHNhc19waHlfcmVzZXQoc3RydWN0IHNhc19waHkgKnBoeSwgaW50IGhhcmRfcmVzZXQpCitpbnQgc2FzX3BoeV9yZXNldChzdHJ1Y3Qgc2FzX3BoeSAqcGh5LCBpbnQgaGFyZF9yZXNldCkKIHsKIAlpbnQgcmV0OwogCWVudW0gcGh5X2Z1bmMgcmVzZXRfdHlwZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2ludGVybmFsLmggYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19pbnRlcm5hbC5oCmluZGV4IGJmZmNlZTQuLjEzN2Q3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaW50ZXJuYWwuaApAQCAtNjAsMTEgKzYwLDExIEBACiAKIHZvaWQgc2FzX2RlZm9ybV9wb3J0KHN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5KTsKIAotdm9pZCBzYXNfcG9ydGVfYnl0ZXNfZG1hZWQodm9pZCAqKTsKLXZvaWQgc2FzX3BvcnRlX2Jyb2FkY2FzdF9yY3ZkKHZvaWQgKik7Ci12b2lkIHNhc19wb3J0ZV9saW5rX3Jlc2V0X2Vycih2b2lkICopOwotdm9pZCBzYXNfcG9ydGVfdGltZXJfZXZlbnQodm9pZCAqKTsKLXZvaWQgc2FzX3BvcnRlX2hhcmRfcmVzZXQodm9pZCAqKTsKK3ZvaWQgc2FzX3BvcnRlX2J5dGVzX2RtYWVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHNhc19wb3J0ZV9icm9hZGNhc3RfcmN2ZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBzYXNfcG9ydGVfbGlua19yZXNldF9lcnIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgc2FzX3BvcnRlX3RpbWVyX2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHNhc19wb3J0ZV9oYXJkX3Jlc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIGludCBzYXNfbm90aWZ5X2xsZGRfZGV2X2ZvdW5kKHN0cnVjdCBkb21haW5fZGV2aWNlICopOwogdm9pZCBzYXNfbm90aWZ5X2xsZGRfZGV2X2dvbmUoc3RydWN0IGRvbWFpbl9kZXZpY2UgKik7CkBAIC03NSw3ICs3NSw3IEBACiAKIHN0cnVjdCBkb21haW5fZGV2aWNlICpzYXNfZmluZF9kZXZfYnlfcnBoeShzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkpOwogCi12b2lkIHNhc19oYWVfcmVzZXQodm9pZCAqKTsKK3ZvaWQgc2FzX2hhZV9yZXNldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2FzX3F1ZXVlX2V2ZW50KGludCBldmVudCwgc3BpbmxvY2tfdCAqbG9jaywKIAkJCQkgICB1bnNpZ25lZCBsb25nICpwZW5kaW5nLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfcGh5LmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19waHkuYwppbmRleCA5MzQwY2RiLi5iNDU5YzRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19waHkuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19waHkuYwpAQCAtMzAsOSArMzAsMTEgQEAKIAogLyogLS0tLS0tLS0tLSBQaHkgZXZlbnRzIC0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHZvaWQgc2FzX3BoeWVfbG9zc19vZl9zaWduYWwodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHNhc19waHllX2xvc3Nfb2Zfc2lnbmFsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSA9IGRhdGE7CisJc3RydWN0IGFzZF9zYXNfZXZlbnQgKmV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhc2Rfc2FzX2V2ZW50LCB3b3JrKTsKKwlzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSA9IGV2LT5waHk7CiAKIAlzYXNfYmVnaW5fZXZlbnQoUEhZRV9MT1NTX09GX1NJR05BTCwgJnBoeS0+aGEtPmV2ZW50X2xvY2ssCiAJCQkmcGh5LT5waHlfZXZlbnRzX3BlbmRpbmcpOwpAQCAtNDAsMTggKzQyLDIyIEBACiAJc2FzX2RlZm9ybV9wb3J0KHBoeSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNhc19waHllX29vYl9kb25lKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzYXNfcGh5ZV9vb2JfZG9uZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkgPSBkYXRhOworCXN0cnVjdCBhc2Rfc2FzX2V2ZW50ICpldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXNkX3Nhc19ldmVudCwgd29yayk7CisJc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkgPSBldi0+cGh5OwogCiAJc2FzX2JlZ2luX2V2ZW50KFBIWUVfT09CX0RPTkUsICZwaHktPmhhLT5ldmVudF9sb2NrLAogCQkJJnBoeS0+cGh5X2V2ZW50c19wZW5kaW5nKTsKIAlwaHktPmVycm9yID0gMDsKIH0KIAotc3RhdGljIHZvaWQgc2FzX3BoeWVfb29iX2Vycm9yKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzYXNfcGh5ZV9vb2JfZXJyb3Ioc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5ID0gZGF0YTsKKwlzdHJ1Y3QgYXNkX3Nhc19ldmVudCAqZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFzZF9zYXNfZXZlbnQsIHdvcmspOworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5ID0gZXYtPnBoeTsKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gcGh5LT5oYTsKIAlzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0ID0gcGh5LT5wb3J0OwogCXN0cnVjdCBzYXNfaW50ZXJuYWwgKmkgPQpAQCAtODAsOSArODYsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNhc19waHllX3NwaW51cF9ob2xkKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzYXNfcGh5ZV9zcGludXBfaG9sZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkgPSBkYXRhOworCXN0cnVjdCBhc2Rfc2FzX2V2ZW50ICpldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXNkX3Nhc19ldmVudCwgd29yayk7CisJc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkgPSBldi0+cGh5OwogCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBwaHktPmhhOwogCXN0cnVjdCBzYXNfaW50ZXJuYWwgKmkgPQogCQl0b19zYXNfaW50ZXJuYWwoc2FzX2hhLT5jb3JlLnNob3N0LT50cmFuc3BvcnR0KTsKQEAgLTEwMCwxNCArMTA4LDE0IEBACiB7CiAJaW50IGk7CiAKLQlzdGF0aWMgdm9pZCAoKnNhc19waHlfZXZlbnRfZm5zW1BIWV9OVU1fRVZFTlRTXSkodm9pZCAqKSA9IHsKKwlzdGF0aWMgY29uc3Qgd29ya19mdW5jX3Qgc2FzX3BoeV9ldmVudF9mbnNbUEhZX05VTV9FVkVOVFNdID0gewogCQlbUEhZRV9MT1NTX09GX1NJR05BTF0gPSBzYXNfcGh5ZV9sb3NzX29mX3NpZ25hbCwKIAkJW1BIWUVfT09CX0RPTkVdID0gc2FzX3BoeWVfb29iX2RvbmUsCiAJCVtQSFlFX09PQl9FUlJPUl0gPSBzYXNfcGh5ZV9vb2JfZXJyb3IsCiAJCVtQSFlFX1NQSU5VUF9IT0xEXSA9IHNhc19waHllX3NwaW51cF9ob2xkLAogCX07CiAKLQlzdGF0aWMgdm9pZCAoKnNhc19wb3J0X2V2ZW50X2Zuc1tQT1JUX05VTV9FVkVOVFNdKSh2b2lkICopID0geworCXN0YXRpYyBjb25zdCB3b3JrX2Z1bmNfdCBzYXNfcG9ydF9ldmVudF9mbnNbUE9SVF9OVU1fRVZFTlRTXSA9IHsKIAkJW1BPUlRFX0JZVEVTX0RNQUVEXSA9IHNhc19wb3J0ZV9ieXRlc19kbWFlZCwKIAkJW1BPUlRFX0JST0FEQ0FTVF9SQ1ZEXSA9IHNhc19wb3J0ZV9icm9hZGNhc3RfcmN2ZCwKIAkJW1BPUlRFX0xJTktfUkVTRVRfRVJSXSA9IHNhc19wb3J0ZV9saW5rX3Jlc2V0X2VyciwKQEAgLTEyMiwxMyArMTMwLDE4IEBACiAKIAkJcGh5LT5lcnJvciA9IDA7CiAJCUlOSVRfTElTVF9IRUFEKCZwaHktPnBvcnRfcGh5X2VsKTsKLQkJZm9yIChrID0gMDsgayA8IFBPUlRfTlVNX0VWRU5UUzsgaysrKQotCQkJSU5JVF9XT1JLKCZwaHktPnBvcnRfZXZlbnRzW2tdLCBzYXNfcG9ydF9ldmVudF9mbnNba10sCi0JCQkJICBwaHkpOworCQlmb3IgKGsgPSAwOyBrIDwgUE9SVF9OVU1fRVZFTlRTOyBrKyspIHsKKwkJCUlOSVRfV09SSygmcGh5LT5wb3J0X2V2ZW50c1trXS53b3JrLAorCQkJCSAgc2FzX3BvcnRfZXZlbnRfZm5zW2tdKTsKKwkJCXBoeS0+cG9ydF9ldmVudHNba10ucGh5ID0gcGh5OworCQl9CiAKLQkJZm9yIChrID0gMDsgayA8IFBIWV9OVU1fRVZFTlRTOyBrKyspCi0JCQlJTklUX1dPUksoJnBoeS0+cGh5X2V2ZW50c1trXSwgc2FzX3BoeV9ldmVudF9mbnNba10sCi0JCQkJICBwaHkpOworCQlmb3IgKGsgPSAwOyBrIDwgUEhZX05VTV9FVkVOVFM7IGsrKykgeworCQkJSU5JVF9XT1JLKCZwaHktPnBoeV9ldmVudHNba10ud29yaywKKwkJCQkgIHNhc19waHlfZXZlbnRfZm5zW2tdKTsKKwkJCXBoeS0+cGh5X2V2ZW50c1trXS5waHkgPSBwaHk7CisJCX0KKwogCQlwaHktPnBvcnQgPSBOVUxMOwogCQlwaHktPmhhID0gc2FzX2hhOwogCQlzcGluX2xvY2tfaW5pdCgmcGh5LT5mcmFtZV9yY3ZkX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfcG9ydC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfcG9ydC5jCmluZGV4IDI1M2NkY2YuLjk3MWMzN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3BvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19wb3J0LmMKQEAgLTE4MSw5ICsxODEsMTEgQEAKIAogLyogLS0tLS0tLS0tLSBTQVMgcG9ydCBldmVudHMgLS0tLS0tLS0tLSAqLwogCi12b2lkIHNhc19wb3J0ZV9ieXRlc19kbWFlZCh2b2lkICpkYXRhKQordm9pZCBzYXNfcG9ydGVfYnl0ZXNfZG1hZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5ID0gZGF0YTsKKwlzdHJ1Y3QgYXNkX3Nhc19ldmVudCAqZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFzZF9zYXNfZXZlbnQsIHdvcmspOworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqcGh5ID0gZXYtPnBoeTsKIAogCXNhc19iZWdpbl9ldmVudChQT1JURV9CWVRFU19ETUFFRCwgJnBoeS0+aGEtPmV2ZW50X2xvY2ssCiAJCQkmcGh5LT5wb3J0X2V2ZW50c19wZW5kaW5nKTsKQEAgLTE5MSwxMSArMTkzLDEzIEBACiAJc2FzX2Zvcm1fcG9ydChwaHkpOwogfQogCi12b2lkIHNhc19wb3J0ZV9icm9hZGNhc3RfcmN2ZCh2b2lkICpkYXRhKQordm9pZCBzYXNfcG9ydGVfYnJvYWRjYXN0X3JjdmQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBhc2Rfc2FzX2V2ZW50ICpldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXNkX3Nhc19ldmVudCwgd29yayk7CisJc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkgPSBldi0+cGh5OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHByaW07Ci0Jc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkgPSBkYXRhOwogCiAJc2FzX2JlZ2luX2V2ZW50KFBPUlRFX0JST0FEQ0FTVF9SQ1ZELCAmcGh5LT5oYS0+ZXZlbnRfbG9jaywKIAkJCSZwaHktPnBvcnRfZXZlbnRzX3BlbmRpbmcpOwpAQCAtMjA4LDkgKzIxMiwxMSBAQAogCXNhc19kaXNjb3Zlcl9ldmVudChwaHktPnBvcnQsIERJU0NFX1JFVkFMSURBVEVfRE9NQUlOKTsKIH0KIAotdm9pZCBzYXNfcG9ydGVfbGlua19yZXNldF9lcnIodm9pZCAqZGF0YSkKK3ZvaWQgc2FzX3BvcnRlX2xpbmtfcmVzZXRfZXJyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSA9IGRhdGE7CisJc3RydWN0IGFzZF9zYXNfZXZlbnQgKmV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhc2Rfc2FzX2V2ZW50LCB3b3JrKTsKKwlzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSA9IGV2LT5waHk7CiAKIAlzYXNfYmVnaW5fZXZlbnQoUE9SVEVfTElOS19SRVNFVF9FUlIsICZwaHktPmhhLT5ldmVudF9sb2NrLAogCQkJJnBoeS0+cG9ydF9ldmVudHNfcGVuZGluZyk7CkBAIC0yMTgsOSArMjI0LDExIEBACiAJc2FzX2RlZm9ybV9wb3J0KHBoeSk7CiB9CiAKLXZvaWQgc2FzX3BvcnRlX3RpbWVyX2V2ZW50KHZvaWQgKmRhdGEpCit2b2lkIHNhc19wb3J0ZV90aW1lcl9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkgPSBkYXRhOworCXN0cnVjdCBhc2Rfc2FzX2V2ZW50ICpldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXNkX3Nhc19ldmVudCwgd29yayk7CisJc3RydWN0IGFzZF9zYXNfcGh5ICpwaHkgPSBldi0+cGh5OwogCiAJc2FzX2JlZ2luX2V2ZW50KFBPUlRFX1RJTUVSX0VWRU5ULCAmcGh5LT5oYS0+ZXZlbnRfbG9jaywKIAkJCSZwaHktPnBvcnRfZXZlbnRzX3BlbmRpbmcpOwpAQCAtMjI4LDkgKzIzNiwxMSBAQAogCXNhc19kZWZvcm1fcG9ydChwaHkpOwogfQogCi12b2lkIHNhc19wb3J0ZV9oYXJkX3Jlc2V0KHZvaWQgKmRhdGEpCit2b2lkIHNhc19wb3J0ZV9oYXJkX3Jlc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSA9IGRhdGE7CisJc3RydWN0IGFzZF9zYXNfZXZlbnQgKmV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhc2Rfc2FzX2V2ZW50LCB3b3JrKTsKKwlzdHJ1Y3QgYXNkX3Nhc19waHkgKnBoeSA9IGV2LT5waHk7CiAKIAlzYXNfYmVnaW5fZXZlbnQoUE9SVEVfSEFSRF9SRVNFVCwgJnBoeS0+aGEtPmV2ZW50X2xvY2ssCiAJCQkmcGh5LT5wb3J0X2V2ZW50c19wZW5kaW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKaW5kZXggZTQ2ZTc5My4uMjI2NzJkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKQEAgLTI5LDkgKzI5LDExIEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaD4KICNpbmNsdWRlICIuLi9zY3NpX3Nhc19pbnRlcm5hbC5oIgorI2luY2x1ZGUgIi4uL3Njc2lfdHJhbnNwb3J0X2FwaS5oIgogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CkBAIC00Niw2ICs0OCw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RhdHVzX3N0cnVjdCAqdHMgPSAmdGFzay0+dGFza19zdGF0dXM7CiAJc3RydWN0IHNjc2lfY21uZCAqc2MgPSB0YXNrLT51bGRkX3Rhc2s7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9IFNIT1NUX1RPX1NBU19IQShzYy0+ZGV2aWNlLT5ob3N0KTsKIAl1bnNpZ25lZCB0c19mbGFncyA9IHRhc2stPnRhc2tfc3RhdGVfZmxhZ3M7CiAJaW50IGhzID0gMCwgc3RhdCA9IDA7CiAKQEAgLTExNiw3ICsxMTksNyBAQAogCXNhc19mcmVlX3Rhc2sodGFzayk7CiAJLyogVGhpcyBpcyB2ZXJ5IHVnbHkgYnV0IHRoaXMgaXMgaG93IFNDU0kgQ29yZSB3b3Jrcy4gKi8KIAlpZiAodHNfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKQotCQlzY3NpX2ZpbmlzaF9jb21tYW5kKHNjKTsKKwkJc2NzaV9laF9maW5pc2hfY21kKHNjLCAmc2FzX2hhLT5laF9kb25lX3EpOwogCWVsc2UKIAkJc2MtPnNjc2lfZG9uZShzYyk7CiB9CkBAIC0zMDcsNiArMzEwLDE1IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvcmUtPnRhc2tfcXVldWVfbG9jaywgZmxhZ3MpOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwlpZiAodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX0lOSVRJQVRPUl9BQk9SVEVEKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlTQVNfRFBSSU5USygiJXM6IHRhc2sgMHglcCBhbHJlYWR5IGFib3J0ZWRcbiIsCisJCQkgICAgX19GVU5DVElPTl9fLCB0YXNrKTsKKwkJcmV0dXJuIFRBU0tfSVNfQUJPUlRFRDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisKIAlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAJCVNBU19EUFJJTlRLKCIlczogYWJvcnRpbmcgdGFzayAweCVwXG4iLCBfX0ZVTkNUSU9OX18sIHRhc2spOwogCQlyZXMgPSBzaS0+ZGZ0LT5sbGRkX2Fib3J0X3Rhc2sodGFzayk7CkBAIC00MDksMTMgKzQyMSwxNiBAQAogCVNBU19EUFJJTlRLKCJnb2luZyBvdmVyIGxpc3QuLi5cbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWQsIG4sICZlcnJvcl9xLCBlaF9lbnRyeSkgewogCQlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPSBUT19TQVNfVEFTSyhjbWQpOwotCi0JCVNBU19EUFJJTlRLKCJ0cnlpbmcgdG8gZmluZCB0YXNrIDB4JXBcbiIsIHRhc2spOwogCQlsaXN0X2RlbF9pbml0KCZjbWQtPmVoX2VudHJ5KTsKKworCQlpZiAoIXRhc2spIHsKKwkJCVNBU19EUFJJTlRLKCIlczogdGFza2xlc3MgY21kPyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQljb250aW51ZTsKKwkJfQorCQlTQVNfRFBSSU5USygidHJ5aW5nIHRvIGZpbmQgdGFzayAweCVwXG4iLCB0YXNrKTsKIAkJcmVzID0gc2FzX3Njc2lfZmluZF90YXNrKHRhc2spOwogCiAJCWNtZC0+ZWhfZWZsYWdzID0gMDsKLQkJc2hvc3QtPmhvc3RfZmFpbGVkLS07CiAKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSBUQVNLX0lTX0RPTkU6CkBAIC00OTEsNiArNTA2LDcgQEAKIAkJfQogCX0KIG91dDoKKwlzY3NpX2VoX2ZsdXNoX2RvbmVfcSgmaGEtPmVoX2RvbmVfcSk7CiAJU0FTX0RQUklOVEsoIi0tLSBFeGl0ICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCXJldHVybjsKIGNsZWFyX3E6CkBAIC01MDgsMTIgKzUyNCwxOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIXRhc2spIHsKLQkJU0FTX0RQUklOVEsoImNvbW1hbmQgMHglcCwgdGFzayAweCVwLCB0aW1lZCBvdXQ6IEVIX0hBTkRMRURcbiIsCisJCVNBU19EUFJJTlRLKCJjb21tYW5kIDB4JXAsIHRhc2sgMHglcCwgZ29uZTogRUhfSEFORExFRFxuIiwKIAkJCSAgICBjbWQsIHRhc2spOwogCQlyZXR1cm4gRUhfSEFORExFRDsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19JTklUSUFUT1JfQUJPUlRFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKwkJU0FTX0RQUklOVEsoImNvbW1hbmQgMHglcCwgdGFzayAweCVwLCBhYm9ydGVkIGJ5IGluaXRpYXRvcjogIgorCQkJICAgICJFSF9OT1RfSEFORExFRFxuIiwgY21kLCB0YXNrKTsKKwkJcmV0dXJuIEVIX05PVF9IQU5ETEVEOworCX0KIAlpZiAodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0RPTkUpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CiAJCVNBU19EUFJJTlRLKCJjb21tYW5kIDB4JXAsIHRhc2sgMHglcCwgdGltZWQgb3V0OiBFSF9IQU5ETEVEXG4iLApAQCAtNzc3LDYgKzc5OSw2NiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvcmUtPnRhc2tfcXVldWVfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IGRvX3Nhc190YXNrX2Fib3J0KHN0cnVjdCBzYXNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzYyA9IHRhc2stPnVsZGRfdGFzazsKKwlzdHJ1Y3Qgc2FzX2ludGVybmFsICpzaSA9CisJCXRvX3Nhc19pbnRlcm5hbCh0YXNrLT5kZXYtPnBvcnQtPmhhLT5jb3JlLnNob3N0LT50cmFuc3BvcnR0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+dGFza19zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCQlTQVNfRFBSSU5USygiJXM6IFRhc2sgJXAgYWxyZWFkeSBhYm9ydGVkLlxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgIHRhc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX0lOSVRJQVRPUl9BQk9SVEVEOworCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19TVEFURV9BQk9SVEVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCisJaWYgKCFzaS0+ZGZ0LT5sbGRkX2Fib3J0X3Rhc2spCisJCXJldHVybiAtRU5PREVWOworCisJcmVzID0gc2ktPmRmdC0+bGxkZF9hYm9ydF90YXNrKHRhc2spOworCWlmICgodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0RPTkUpIHx8CisJICAgIChyZXMgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkpCisJeworCQkvKiBTTVAgY29tbWFuZHMgZG9uJ3QgaGF2ZSBzY3NpX2NtZHMoPykgKi8KKwkJaWYgKCFzYykgeworCQkJdGFzay0+dGFza19kb25lKHRhc2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2NzaV9yZXFfYWJvcnRfY21kKHNjKTsKKwkJc2NzaV9zY2hlZHVsZV9laChzYy0+ZGV2aWNlLT5ob3N0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnRhc2tfc3RhdGVfbG9jaywgZmxhZ3MpOworCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0gflNBU19UQVNLX0lOSVRJQVRPUl9BQk9SVEVEOworCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkKKwkJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPSB+U0FTX1RBU0tfU1RBVEVfQUJPUlRFRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAtRUFHQUlOOworfQorCit2b2lkIHNhc190YXNrX2Fib3J0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2sgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNhc190YXNrLCBhYm9ydF93b3JrKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWlmICghZG9fc2FzX3Rhc2tfYWJvcnQodGFzaykpCisJCQlyZXR1cm47CisKKwlTQVNfRFBSSU5USygiJXM6IENvdWxkIG5vdCBraWxsIHRhc2shXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCiBFWFBPUlRfU1lNQk9MX0dQTChzYXNfcXVldWVjb21tYW5kKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNhc190YXJnZXRfYWxsb2MpOwogRVhQT1JUX1NZTUJPTF9HUEwoc2FzX3NsYXZlX2NvbmZpZ3VyZSk7CkBAIC03ODQsMyArODY2LDUgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNhc19jaGFuZ2VfcXVldWVfZGVwdGgpOwogRVhQT1JUX1NZTUJPTF9HUEwoc2FzX2NoYW5nZV9xdWV1ZV90eXBlKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNhc19iaW9zX3BhcmFtKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNhc190YXNrX2Fib3J0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNhc19waHlfcmVzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNycC5jIGIvZHJpdmVycy9zY3NpL2xpYnNycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDAzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvbGlic3JwLmMKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBTQ1NJIFJEQU0gUHJvdG9jb2wgbGliIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBGVUpJVEEgVG9tb25vcmkgPHRvbW9mQGFjbS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RndC5oPgorI2luY2x1ZGUgPHNjc2kvc3JwLmg+CisjaW5jbHVkZSA8c2NzaS9saWJzcnAuaD4KKworZW51bSBzcnBfdGFza19hdHRyaWJ1dGVzIHsKKwlTUlBfU0lNUExFX1RBU0sgPSAwLAorCVNSUF9IRUFEX1RBU0sgPSAxLAorCVNSUF9PUkRFUkVEX1RBU0sgPSAyLAorCVNSUF9BQ0FfVEFTSyA9IDQKK307CisKKy8qIHRtcCAtIHdpbGwgcmVwbGFjZSB3aXRoIFNDU0kgbG9nZ2luZyBzdHVmZiAqLworI2RlZmluZSBlcHJpbnRrKGZtdCwgYXJncy4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlwcmludGsoIiVzKCVkKSAiIGZtdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyNhcmdzKTsJXAorfSB3aGlsZSAoMCkKKy8qICNkZWZpbmUgZHByaW50ayBlcHJpbnRrICovCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQorCitzdGF0aWMgaW50IHNycF9pdV9wb29sX2FsbG9jKHN0cnVjdCBzcnBfcXVldWUgKnEsIHNpemVfdCBtYXgsCisJCQkgICAgIHN0cnVjdCBzcnBfYnVmICoqcmluZykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXVfZW50cnkgKml1ZTsKKworCXEtPnBvb2wgPSBrY2FsbG9jKG1heCwgc2l6ZW9mKHN0cnVjdCBpdV9lbnRyeSAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxLT5wb29sKQorCQlyZXR1cm4gLUVOT01FTTsKKwlxLT5pdGVtcyA9IGtjYWxsb2MobWF4LCBzaXplb2Yoc3RydWN0IGl1X2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxLT5pdGVtcykKKwkJZ290byBmcmVlX3Bvb2w7CisKKwlzcGluX2xvY2tfaW5pdCgmcS0+bG9jayk7CisJcS0+cXVldWUgPSBrZmlmb19pbml0KCh2b2lkICopIHEtPnBvb2wsIG1heCAqIHNpemVvZih2b2lkICopLAorCQkJICAgICAgR0ZQX0tFUk5FTCwgJnEtPmxvY2spOworCWlmIChJU19FUlIocS0+cXVldWUpKQorCQlnb3RvIGZyZWVfaXRlbTsKKworCWZvciAoaSA9IDAsIGl1ZSA9IHEtPml0ZW1zOyBpIDwgbWF4OyBpKyspIHsKKwkJX19rZmlmb19wdXQocS0+cXVldWUsICh2b2lkICopICZpdWUsIHNpemVvZih2b2lkICopKTsKKwkJaXVlLT5zYnVmID0gcmluZ1tpXTsKKwkJaXVlKys7CisJfQorCXJldHVybiAwOworCitmcmVlX2l0ZW06CisJa2ZyZWUocS0+aXRlbXMpOworZnJlZV9wb29sOgorCWtmcmVlKHEtPnBvb2wpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBzcnBfaXVfcG9vbF9mcmVlKHN0cnVjdCBzcnBfcXVldWUgKnEpCit7CisJa2ZyZWUocS0+aXRlbXMpOworCWtmcmVlKHEtPnBvb2wpOworfQorCitzdGF0aWMgc3RydWN0IHNycF9idWYgKipzcnBfcmluZ19hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHNpemVfdCBtYXgsIHNpemVfdCBzaXplKQoreworCWludCBpOworCXN0cnVjdCBzcnBfYnVmICoqcmluZzsKKworCXJpbmcgPSBrY2FsbG9jKG1heCwgc2l6ZW9mKHN0cnVjdCBzcnBfYnVmICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJpbmcpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCXJpbmdbaV0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3JwX2J1ZiksIEdGUF9LRVJORUwpOworCQlpZiAoIXJpbmdbaV0pCisJCQlnb3RvIG91dDsKKwkJcmluZ1tpXS0+YnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgJnJpbmdbaV0tPmRtYSwKKwkJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCWlmICghcmluZ1tpXS0+YnVmKQorCQkJZ290byBvdXQ7CisJfQorCXJldHVybiByaW5nOworCitvdXQ6CisJZm9yIChpID0gMDsgaSA8IG1heCAmJiByaW5nW2ldOyBpKyspIHsKKwkJaWYgKHJpbmdbaV0tPmJ1ZikKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgcmluZ1tpXS0+YnVmLCByaW5nW2ldLT5kbWEpOworCQlrZnJlZShyaW5nW2ldKTsKKwl9CisJa2ZyZWUocmluZyk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc3JwX3JpbmdfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzcnBfYnVmICoqcmluZywgc2l6ZV90IG1heCwKKwkJCSAgc2l6ZV90IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCByaW5nW2ldLT5idWYsIHJpbmdbaV0tPmRtYSk7CisJCWtmcmVlKHJpbmdbaV0pOworCX0KK30KKworaW50IHNycF90YXJnZXRfYWxsb2Moc3RydWN0IHNycF90YXJnZXQgKnRhcmdldCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgIHNpemVfdCBuciwgc2l6ZV90IGl1X3NpemUpCit7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19pbml0KCZ0YXJnZXQtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZ0YXJnZXQtPmNtZF9xdWV1ZSk7CisKKwl0YXJnZXQtPmRldiA9IGRldjsKKwl0YXJnZXQtPmRldi0+ZHJpdmVyX2RhdGEgPSB0YXJnZXQ7CisKKwl0YXJnZXQtPnNycF9pdV9zaXplID0gaXVfc2l6ZTsKKwl0YXJnZXQtPnJ4X3Jpbmdfc2l6ZSA9IG5yOworCXRhcmdldC0+cnhfcmluZyA9IHNycF9yaW5nX2FsbG9jKHRhcmdldC0+ZGV2LCBuciwgaXVfc2l6ZSk7CisJaWYgKCF0YXJnZXQtPnJ4X3JpbmcpCisJCXJldHVybiAtRU5PTUVNOworCWVyciA9IHNycF9pdV9wb29sX2FsbG9jKCZ0YXJnZXQtPml1X3F1ZXVlLCBuciwgdGFyZ2V0LT5yeF9yaW5nKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfcmluZzsKKworCXJldHVybiAwOworCitmcmVlX3Jpbmc6CisJc3JwX3JpbmdfZnJlZSh0YXJnZXQtPmRldiwgdGFyZ2V0LT5yeF9yaW5nLCBuciwgaXVfc2l6ZSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcnBfdGFyZ2V0X2FsbG9jKTsKKwordm9pZCBzcnBfdGFyZ2V0X2ZyZWUoc3RydWN0IHNycF90YXJnZXQgKnRhcmdldCkKK3sKKwlzcnBfcmluZ19mcmVlKHRhcmdldC0+ZGV2LCB0YXJnZXQtPnJ4X3JpbmcsIHRhcmdldC0+cnhfcmluZ19zaXplLAorCQkgICAgICB0YXJnZXQtPnNycF9pdV9zaXplKTsKKwlzcnBfaXVfcG9vbF9mcmVlKCZ0YXJnZXQtPml1X3F1ZXVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNycF90YXJnZXRfZnJlZSk7CisKK3N0cnVjdCBpdV9lbnRyeSAqc3JwX2l1X2dldChzdHJ1Y3Qgc3JwX3RhcmdldCAqdGFyZ2V0KQoreworCXN0cnVjdCBpdV9lbnRyeSAqaXVlID0gTlVMTDsKKworCWtmaWZvX2dldCh0YXJnZXQtPml1X3F1ZXVlLnF1ZXVlLCAodm9pZCAqKSAmaXVlLCBzaXplb2Yodm9pZCAqKSk7CisJaWYgKCFpdWUpCisJCXJldHVybiBpdWU7CisJaXVlLT50YXJnZXQgPSB0YXJnZXQ7CisJSU5JVF9MSVNUX0hFQUQoJml1ZS0+aWxpc3QpOworCWl1ZS0+ZmxhZ3MgPSAwOworCXJldHVybiBpdWU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcnBfaXVfZ2V0KTsKKwordm9pZCBzcnBfaXVfcHV0KHN0cnVjdCBpdV9lbnRyeSAqaXVlKQoreworCWtmaWZvX3B1dChpdWUtPnRhcmdldC0+aXVfcXVldWUucXVldWUsICh2b2lkICopICZpdWUsIHNpemVvZih2b2lkICopKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNycF9pdV9wdXQpOworCitzdGF0aWMgaW50IHNycF9kaXJlY3RfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzYywgc3RydWN0IHNycF9kaXJlY3RfYnVmICptZCwKKwkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgc3JwX3JkbWFfdCByZG1hX2lvLAorCQkJICAgaW50IGRtYV9tYXAsIGludCBleHRfZGVzYykKK3sKKwlzdHJ1Y3QgaXVfZW50cnkgKml1ZSA9IE5VTEw7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisJaW50IGVyciwgbnNnID0gMCwgbGVuOworCisJaWYgKGRtYV9tYXApIHsKKwkJaXVlID0gKHN0cnVjdCBpdV9lbnRyeSAqKSBzYy0+U0NwLnB0cjsKKwkJc2cgPSBzYy0+cmVxdWVzdF9idWZmZXI7CisKKwkJZHByaW50aygiJXAgJXUgJXUgJWRcbiIsIGl1ZSwgc2MtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCW1kLT5sZW4sIHNjLT51c2Vfc2cpOworCisJCW5zZyA9IGRtYV9tYXBfc2coaXVlLT50YXJnZXQtPmRldiwgc2csIHNjLT51c2Vfc2csCisJCQkJIERNQV9CSURJUkVDVElPTkFMKTsKKwkJaWYgKCFuc2cpIHsKKwkJCXByaW50aygiZmFpbCB0byBtYXAgJXAgJWRcbiIsIGl1ZSwgc2MtPnVzZV9zZyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsZW4gPSBtaW4oc2MtPnJlcXVlc3RfYnVmZmxlbiwgbWQtPmxlbik7CisJfSBlbHNlCisJCWxlbiA9IG1kLT5sZW47CisKKwllcnIgPSByZG1hX2lvKHNjLCBzZywgbnNnLCBtZCwgMSwgZGlyLCBsZW4pOworCisJaWYgKGRtYV9tYXApCisJCWRtYV91bm1hcF9zZyhpdWUtPnRhcmdldC0+ZGV2LCBzZywgbnNnLCBETUFfQklESVJFQ1RJT05BTCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNycF9pbmRpcmVjdF9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKnNjLCBzdHJ1Y3Qgc3JwX2NtZCAqY21kLAorCQkJICAgICBzdHJ1Y3Qgc3JwX2luZGlyZWN0X2J1ZiAqaWQsCisJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgc3JwX3JkbWFfdCByZG1hX2lvLAorCQkJICAgICBpbnQgZG1hX21hcCwgaW50IGV4dF9kZXNjKQoreworCXN0cnVjdCBpdV9lbnRyeSAqaXVlID0gTlVMTDsKKwlzdHJ1Y3Qgc3JwX2RpcmVjdF9idWYgKm1kID0gTlVMTDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgZHVtbXksICpzZyA9IE5VTEw7CisJZG1hX2FkZHJfdCB0b2tlbiA9IDA7CisJbG9uZyBlcnI7CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCWludCBubWQsIG5zZyA9IDAsIGxlbjsKKworCWlmIChkbWFfbWFwIHx8IGV4dF9kZXNjKSB7CisJCWl1ZSA9IChzdHJ1Y3QgaXVfZW50cnkgKikgc2MtPlNDcC5wdHI7CisJCXNnID0gc2MtPnJlcXVlc3RfYnVmZmVyOworCisJCWRwcmludGsoIiVwICV1ICV1ICVkICVkXG4iLAorCQkJaXVlLCBzYy0+cmVxdWVzdF9idWZmbGVuLCBpZC0+bGVuLAorCQkJY21kLT5kYXRhX2luX2Rlc2NfY250LCBjbWQtPmRhdGFfb3V0X2Rlc2NfY250KTsKKwl9CisKKwlubWQgPSBpZC0+dGFibGVfZGVzYy5sZW4gLyBzaXplb2Yoc3RydWN0IHNycF9kaXJlY3RfYnVmKTsKKworCWlmICgoZGlyID09IERNQV9GUk9NX0RFVklDRSAmJiBubWQgPT0gY21kLT5kYXRhX2luX2Rlc2NfY250KSB8fAorCSAgICAoZGlyID09IERNQV9UT19ERVZJQ0UgJiYgbm1kID09IGNtZC0+ZGF0YV9vdXRfZGVzY19jbnQpKSB7CisJCW1kID0gJmlkLT5kZXNjX2xpc3RbMF07CisJCWdvdG8gcmRtYTsKKwl9CisKKwlpZiAoZXh0X2Rlc2MgJiYgZG1hX21hcCkgeworCQltZCA9IGRtYV9hbGxvY19jb2hlcmVudChpdWUtPnRhcmdldC0+ZGV2LCBpZC0+dGFibGVfZGVzYy5sZW4sCisJCQkJJnRva2VuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtZCkgeworCQkJZXByaW50aygiQ2FuJ3QgZ2V0IGRtYSBtZW1vcnkgJXVcbiIsIGlkLT50YWJsZV9kZXNjLmxlbik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXNnX2luaXRfb25lKCZkdW1teSwgbWQsIGlkLT50YWJsZV9kZXNjLmxlbik7CisJCXNnX2RtYV9hZGRyZXNzKCZkdW1teSkgPSB0b2tlbjsKKwkJZXJyID0gcmRtYV9pbyhzYywgJmR1bW15LCAxLCAmaWQtPnRhYmxlX2Rlc2MsIDEsIERNQV9UT19ERVZJQ0UsCisJCQkgICAgICBpZC0+dGFibGVfZGVzYy5sZW4pOworCQlpZiAoZXJyIDwgMCkgeworCQkJZXByaW50aygiRXJyb3IgY29weWluZyBpbmRpcmVjdCB0YWJsZSAlbGRcbiIsIGVycik7CisJCQlnb3RvIGZyZWVfbWVtOworCQl9CisJfSBlbHNlIHsKKwkJZXByaW50aygiVGhpcyBjb21tYW5kIHVzZXMgZXh0ZXJuYWwgaW5kaXJlY3QgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCityZG1hOgorCWlmIChkbWFfbWFwKSB7CisJCW5zZyA9IGRtYV9tYXBfc2coaXVlLT50YXJnZXQtPmRldiwgc2csIHNjLT51c2Vfc2csIERNQV9CSURJUkVDVElPTkFMKTsKKwkJaWYgKCFuc2cpIHsKKwkJCWVwcmludGsoImZhaWwgdG8gbWFwICVwICVkXG4iLCBpdWUsIHNjLT51c2Vfc2cpOworCQkJZ290byBmcmVlX21lbTsKKwkJfQorCQlsZW4gPSBtaW4oc2MtPnJlcXVlc3RfYnVmZmxlbiwgaWQtPmxlbik7CisJfSBlbHNlCisJCWxlbiA9IGlkLT5sZW47CisKKwllcnIgPSByZG1hX2lvKHNjLCBzZywgbnNnLCBtZCwgbm1kLCBkaXIsIGxlbik7CisKKwlpZiAoZG1hX21hcCkKKwkJZG1hX3VubWFwX3NnKGl1ZS0+dGFyZ2V0LT5kZXYsIHNnLCBuc2csIERNQV9CSURJUkVDVElPTkFMKTsKKworZnJlZV9tZW06CisJaWYgKHRva2VuICYmIGRtYV9tYXApCisJCWRtYV9mcmVlX2NvaGVyZW50KGl1ZS0+dGFyZ2V0LT5kZXYsIGlkLT50YWJsZV9kZXNjLmxlbiwgbWQsIHRva2VuKTsKKworCXJldHVybiBkb25lOworfQorCitzdGF0aWMgaW50IGRhdGFfb3V0X2Rlc2Nfc2l6ZShzdHJ1Y3Qgc3JwX2NtZCAqY21kKQoreworCWludCBzaXplID0gMDsKKwl1OCBmbXQgPSBjbWQtPmJ1Zl9mbXQgPj4gNDsKKworCXN3aXRjaCAoZm10KSB7CisJY2FzZSBTUlBfTk9fREFUQV9ERVNDOgorCQlicmVhazsKKwljYXNlIFNSUF9EQVRBX0RFU0NfRElSRUNUOgorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBzcnBfZGlyZWN0X2J1Zik7CisJCWJyZWFrOworCWNhc2UgU1JQX0RBVEFfREVTQ19JTkRJUkVDVDoKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3JwX2luZGlyZWN0X2J1ZikgKworCQkJc2l6ZW9mKHN0cnVjdCBzcnBfZGlyZWN0X2J1ZikgKiBjbWQtPmRhdGFfb3V0X2Rlc2NfY250OworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcHJpbnRrKCJjbGllbnQgZXJyb3IuIEludmFsaWQgZGF0YV9vdXRfZm9ybWF0ICV4XG4iLCBmbXQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBUT0RPOiB0aGlzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgc2luZ2xlIGNvbW1hbmQgaWYgaXQKKyAqIGhhcyB2ZXJ5IGxvbmcgZGF0YS4KKyAqLworaW50IHNycF90cmFuc2Zlcl9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKnNjLCBzdHJ1Y3Qgc3JwX2NtZCAqY21kLAorCQkgICAgICBzcnBfcmRtYV90IHJkbWFfaW8sIGludCBkbWFfbWFwLCBpbnQgZXh0X2Rlc2MpCit7CisJc3RydWN0IHNycF9kaXJlY3RfYnVmICptZDsKKwlzdHJ1Y3Qgc3JwX2luZGlyZWN0X2J1ZiAqaWQ7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCWludCBvZmZzZXQsIGVyciA9IDA7CisJdTggZm9ybWF0OworCisJb2Zmc2V0ID0gY21kLT5hZGRfY2RiX2xlbiAqIDQ7CisKKwlkaXIgPSBzcnBfY21kX2RpcmVjdGlvbihjbWQpOworCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQorCQlvZmZzZXQgKz0gZGF0YV9vdXRfZGVzY19zaXplKGNtZCk7CisKKwlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UpCisJCWZvcm1hdCA9IGNtZC0+YnVmX2ZtdCA+PiA0OworCWVsc2UKKwkJZm9ybWF0ID0gY21kLT5idWZfZm10ICYgKCgxVSA8PCA0KSAtIDEpOworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIFNSUF9OT19EQVRBX0RFU0M6CisJCWJyZWFrOworCWNhc2UgU1JQX0RBVEFfREVTQ19ESVJFQ1Q6CisJCW1kID0gKHN0cnVjdCBzcnBfZGlyZWN0X2J1ZiAqKQorCQkJKGNtZC0+YWRkX2RhdGEgKyBvZmZzZXQpOworCQllcnIgPSBzcnBfZGlyZWN0X2RhdGEoc2MsIG1kLCBkaXIsIHJkbWFfaW8sIGRtYV9tYXAsIGV4dF9kZXNjKTsKKwkJYnJlYWs7CisJY2FzZSBTUlBfREFUQV9ERVNDX0lORElSRUNUOgorCQlpZCA9IChzdHJ1Y3Qgc3JwX2luZGlyZWN0X2J1ZiAqKQorCQkJKGNtZC0+YWRkX2RhdGEgKyBvZmZzZXQpOworCQllcnIgPSBzcnBfaW5kaXJlY3RfZGF0YShzYywgY21kLCBpZCwgZGlyLCByZG1hX2lvLCBkbWFfbWFwLAorCQkJCQlleHRfZGVzYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVwcmludGsoIlVua25vd24gZm9ybWF0ICVkICV4XG4iLCBkaXIsIGZvcm1hdCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcnBfdHJhbnNmZXJfZGF0YSk7CisKK3N0YXRpYyBpbnQgdnNjc2lzX2RhdGFfbGVuZ3RoKHN0cnVjdCBzcnBfY21kICpjbWQsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3Qgc3JwX2RpcmVjdF9idWYgKm1kOworCXN0cnVjdCBzcnBfaW5kaXJlY3RfYnVmICppZDsKKwlpbnQgbGVuID0gMCwgb2Zmc2V0ID0gY21kLT5hZGRfY2RiX2xlbiAqIDQ7CisJdTggZm10OworCisJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFKQorCQlmbXQgPSBjbWQtPmJ1Zl9mbXQgPj4gNDsKKwllbHNlIHsKKwkJZm10ID0gY21kLT5idWZfZm10ICYgKCgxVSA8PCA0KSAtIDEpOworCQlvZmZzZXQgKz0gZGF0YV9vdXRfZGVzY19zaXplKGNtZCk7CisJfQorCisJc3dpdGNoIChmbXQpIHsKKwljYXNlIFNSUF9OT19EQVRBX0RFU0M6CisJCWJyZWFrOworCWNhc2UgU1JQX0RBVEFfREVTQ19ESVJFQ1Q6CisJCW1kID0gKHN0cnVjdCBzcnBfZGlyZWN0X2J1ZiAqKSAoY21kLT5hZGRfZGF0YSArIG9mZnNldCk7CisJCWxlbiA9IG1kLT5sZW47CisJCWJyZWFrOworCWNhc2UgU1JQX0RBVEFfREVTQ19JTkRJUkVDVDoKKwkJaWQgPSAoc3RydWN0IHNycF9pbmRpcmVjdF9idWYgKikgKGNtZC0+YWRkX2RhdGEgKyBvZmZzZXQpOworCQlsZW4gPSBpZC0+bGVuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcHJpbnRrKCJpbnZhbGlkIGRhdGEgZm9ybWF0ICV4XG4iLCBmbXQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworaW50IHNycF9jbWRfcXVldWUoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzcnBfY21kICpjbWQsIHZvaWQgKmluZm8sCisJCSAgdTY0IGFkZHIpCit7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjOworCWludCB0YWcsIGxlbiwgZXJyOworCisJc3dpdGNoIChjbWQtPnRhc2tfYXR0cikgeworCWNhc2UgU1JQX1NJTVBMRV9UQVNLOgorCQl0YWcgPSBNU0dfU0lNUExFX1RBRzsKKwkJYnJlYWs7CisJY2FzZSBTUlBfT1JERVJFRF9UQVNLOgorCQl0YWcgPSBNU0dfT1JERVJFRF9UQUc7CisJCWJyZWFrOworCWNhc2UgU1JQX0hFQURfVEFTSzoKKwkJdGFnID0gTVNHX0hFQURfVEFHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcHJpbnRrKCJUYXNrIGF0dHJpYnV0ZSAlZCBub3Qgc3VwcG9ydGVkXG4iLCBjbWQtPnRhc2tfYXR0cik7CisJCXRhZyA9IE1TR19PUkRFUkVEX1RBRzsKKwl9CisKKwlkaXIgPSBzcnBfY21kX2RpcmVjdGlvbihjbWQpOworCWxlbiA9IHZzY3Npc19kYXRhX2xlbmd0aChjbWQsIGRpcik7CisKKwlkcHJpbnRrKCIlcCAleCAlbHggJWQgJWQgJWQgJWxseFxuIiwgaW5mbywgY21kLT5jZGJbMF0sCisJCWNtZC0+bHVuLCBkaXIsIGxlbiwgdGFnLCAodW5zaWduZWQgbG9uZyBsb25nKSBjbWQtPnRhZyk7CisKKwlzYyA9IHNjc2lfaG9zdF9nZXRfY29tbWFuZChzaG9zdCwgZGlyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNjLT5TQ3AucHRyID0gaW5mbzsKKwltZW1jcHkoc2MtPmNtbmQsIGNtZC0+Y2RiLCBNQVhfQ09NTUFORF9TSVpFKTsKKwlzYy0+cmVxdWVzdF9idWZmbGVuID0gbGVuOworCXNjLT5yZXF1ZXN0X2J1ZmZlciA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSBhZGRyOworCXNjLT50YWcgPSB0YWc7CisJZXJyID0gc2NzaV90Z3RfcXVldWVfY29tbWFuZChzYywgKHN0cnVjdCBzY3NpX2x1biAqKSAmY21kLT5sdW4sIGNtZC0+dGFnKTsKKwlpZiAoZXJyKQorCQlzY3NpX2hvc3RfcHV0X2NvbW1hbmQoc2hvc3QsIHNjKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcnBfY21kX3F1ZXVlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQ1NJIFJEQU0gUHJvdG9jb2wgbGliIGZ1bmN0aW9ucyIpOworTU9EVUxFX0FVVEhPUigiRlVKSVRBIFRvbW9ub3JpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggM2Y3ZjVmOC4uYTdkZTBiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtMjk2LDEzICsyOTYsMTcgQEAKIAl1aW50MzJfdCBjZmdfY3JfZGVsYXk7CiAJdWludDMyX3QgY2ZnX2NyX2NvdW50OwogCXVpbnQzMl90IGNmZ19tdWx0aV9yaW5nX3N1cHBvcnQ7CisJdWludDMyX3QgY2ZnX211bHRpX3JpbmdfcmN0bDsKKwl1aW50MzJfdCBjZmdfbXVsdGlfcmluZ190eXBlOwogCXVpbnQzMl90IGNmZ19mZG1pX29uOwogCXVpbnQzMl90IGNmZ19kaXNjb3ZlcnlfdGhyZWFkczsKIAl1aW50MzJfdCBjZmdfbWF4X2x1bnM7CiAJdWludDMyX3QgY2ZnX3BvbGw7CiAJdWludDMyX3QgY2ZnX3BvbGxfdG1vOworCXVpbnQzMl90IGNmZ191c2VfbXNpOwogCXVpbnQzMl90IGNmZ19zZ19zZWdfY250OwogCXVpbnQzMl90IGNmZ19zZ19kbWFfYnVmX3NpemU7CisJdWludDY0X3QgY2ZnX3NvZnRfd3dubjsKIAl1aW50NjRfdCBjZmdfc29mdF93d3BuOwogCiAJdWludDMyX3QgZGV2X2xvc3NfdG1vX2NoYW5nZWQ7CkBAIC0zNTUsNyArMzU5LDcgQEAKICNkZWZpbmUgVlBEX1BPUlQgICAgICAgICAgICAweDggICAgICAgICAvKiB2YWxpZCB2cGQgcG9ydCBkYXRhICovCiAjZGVmaW5lIFZQRF9NQVNLICAgICAgICAgICAgMHhmICAgICAgICAgLyogbWFzayBmb3IgYW55IHZwZCBkYXRhICovCiAKLQl1aW50OF90IHNvZnRfd3dwbl9lbmFibGU7CisJdWludDhfdCBzb2Z0X3d3bl9lbmFibGU7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBmY3BfcG9sbF90aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBlbHNfdG1vZnVuYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKaW5kZXggOTQ5NmU4Ny4uZjI0N2U3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKQEAgLTU1MiwxMCArNTUyLDEwIEBACiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoaXNzdWVfcmVzZXQsIFNfSVdVU1IsIE5VTEwsIGxwZmNfaXNzdWVfcmVzZXQpOwogCiAKLXN0YXRpYyBjaGFyICpscGZjX3NvZnRfd3dwbl9rZXkgPSAiQzk5RzcxU0w4MDMyQSI7CitzdGF0aWMgY2hhciAqbHBmY19zb2Z0X3d3bl9rZXkgPSAiQzk5RzcxU0w4MDMyQSI7CiAKIHN0YXRpYyBzc2l6ZV90Ci1scGZjX3NvZnRfd3dwbl9lbmFibGVfc3RvcmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLAorbHBmY19zb2Z0X3d3bl9lbmFibGVfc3RvcmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLAogCQkJCXNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CkBAIC01NzksMjIgKzU3OSwyMyBAQAogCWlmIChidWZbY250LTFdID09ICdcbicpCiAJCWNudC0tOwogCi0JaWYgKChjbnQgIT0gc3RybGVuKGxwZmNfc29mdF93d3BuX2tleSkpIHx8Ci0JICAgIChzdHJuY21wKGJ1ZiwgbHBmY19zb2Z0X3d3cG5fa2V5LCBzdHJsZW4obHBmY19zb2Z0X3d3cG5fa2V5KSkgIT0gMCkpCisJaWYgKChjbnQgIT0gc3RybGVuKGxwZmNfc29mdF93d25fa2V5KSkgfHwKKwkgICAgKHN0cm5jbXAoYnVmLCBscGZjX3NvZnRfd3duX2tleSwgc3RybGVuKGxwZmNfc29mdF93d25fa2V5KSkgIT0gMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcGhiYS0+c29mdF93d3BuX2VuYWJsZSA9IDE7CisJcGhiYS0+c29mdF93d25fZW5hYmxlID0gMTsKIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobHBmY19zb2Z0X3d3cG5fZW5hYmxlLCBTX0lXVVNSLCBOVUxMLAotCQkJCWxwZmNfc29mdF93d3BuX2VuYWJsZV9zdG9yZSk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobHBmY19zb2Z0X3d3bl9lbmFibGUsIFNfSVdVU1IsIE5VTEwsCisJCQkJbHBmY19zb2Z0X3d3bl9lbmFibGVfc3RvcmUpOwogCiBzdGF0aWMgc3NpemVfdAogbHBmY19zb2Z0X3d3cG5fc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGNkZXYpOwogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEqKWhvc3QtPmhvc3RkYXRhOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JWxseFxuIiwgcGhiYS0+Y2ZnX3NvZnRfd3dwbik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglbGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaGJhLT5jZmdfc29mdF93d3BuKTsKIH0KIAogCkBAIC02MTIsMTIgKzYxMywxMiBAQAogCWlmIChidWZbY250LTFdID09ICdcbicpCiAJCWNudC0tOwogCi0JaWYgKCFwaGJhLT5zb2Z0X3d3cG5fZW5hYmxlIHx8IChjbnQgPCAxNikgfHwgKGNudCA+IDE4KSB8fAorCWlmICghcGhiYS0+c29mdF93d25fZW5hYmxlIHx8IChjbnQgPCAxNikgfHwgKGNudCA+IDE4KSB8fAogCSAgICAoKGNudCA9PSAxNykgJiYgKCpidWYrKyAhPSAneCcpKSB8fAogCSAgICAoKGNudCA9PSAxOCkgJiYgKCgqYnVmKysgIT0gJzAnKSB8fCAoKmJ1ZisrICE9ICd4JykpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwaGJhLT5zb2Z0X3d3cG5fZW5hYmxlID0gMDsKKwlwaGJhLT5zb2Z0X3d3bl9lbmFibGUgPSAwOwogCiAJbWVtc2V0KHd3cG4sIDAsIHNpemVvZih3d3BuKSk7CiAKQEAgLTYzOCw2ICs2MzksOCBAQAogCX0KIAlwaGJhLT5jZmdfc29mdF93d3BuID0gd3duX3RvX3U2NCh3d3BuKTsKIAlmY19ob3N0X3BvcnRfbmFtZShob3N0KSA9IHBoYmEtPmNmZ19zb2Z0X3d3cG47CisJaWYgKHBoYmEtPmNmZ19zb2Z0X3d3bm4pCisJCWZjX2hvc3Rfbm9kZV9uYW1lKGhvc3QpID0gcGhiYS0+Y2ZnX3NvZnRfd3dubjsKIAogCWRldl9wcmludGsoS0VSTl9OT1RJQ0UsICZwaGJhLT5wY2lkZXYtPmRldiwKIAkJICAgImxwZmMlZDogUmVpbml0aWFsaXppbmcgdG8gdXNlIHNvZnRfd3dwblxuIiwgcGhiYS0+YnJkX25vKTsKQEAgLTY2Myw2ICs2NjYsNjYgQEAKIHN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihscGZjX3NvZnRfd3dwbiwgU19JUlVHTyB8IFNfSVdVU1IsXAogCQkJIGxwZmNfc29mdF93d3BuX3Nob3csIGxwZmNfc29mdF93d3BuX3N0b3JlKTsKIAorc3RhdGljIHNzaXplX3QKK2xwZmNfc29mdF93d25uX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoc3RydWN0IGxwZmNfaGJhKilob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCVsbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXBoYmEtPmNmZ19zb2Z0X3d3bm4pOworfQorCisKK3N0YXRpYyBzc2l6ZV90CitscGZjX3NvZnRfd3dubl9zdG9yZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKHN0cnVjdCBscGZjX2hiYSopaG9zdC0+aG9zdGRhdGE7CisJdW5zaWduZWQgaW50IGksIGosIGNudD1jb3VudDsKKwl1OCB3d25uWzhdOworCisJLyogY291bnQgbWF5IGluY2x1ZGUgYSBMRiBhdCBlbmQgb2Ygc3RyaW5nICovCisJaWYgKGJ1ZltjbnQtMV0gPT0gJ1xuJykKKwkJY250LS07CisKKwlpZiAoIXBoYmEtPnNvZnRfd3duX2VuYWJsZSB8fCAoY250IDwgMTYpIHx8IChjbnQgPiAxOCkgfHwKKwkgICAgKChjbnQgPT0gMTcpICYmICgqYnVmKysgIT0gJ3gnKSkgfHwKKwkgICAgKChjbnQgPT0gMTgpICYmICgoKmJ1ZisrICE9ICcwJykgfHwgKCpidWYrKyAhPSAneCcpKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBBbGxvdyB3d25uIHRvIGJlIHNldCBtYW55IHRpbWVzLCBhcyBsb25nIGFzIHRoZSBlbmFibGUgaXMgc2V0LgorCSAqIEhvd2V2ZXIsIG9uY2UgdGhlIHd3cG4gaXMgc2V0LCBldmVyeXRoaW5nIGxvY2tzLgorCSAqLworCisJbWVtc2V0KHd3bm4sIDAsIHNpemVvZih3d25uKSk7CisKKwkvKiBWYWxpZGF0ZSBhbmQgc3RvcmUgdGhlIG5ldyBuYW1lICovCisJZm9yIChpPTAsIGo9MDsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKCgqYnVmID49ICdhJykgJiYgKCpidWYgPD0gJ2YnKSkKKwkJCWogPSAoKGogPDwgNCkgfCAoKCpidWYrKyAtJ2EnKSArIDEwKSk7CisJCWVsc2UgaWYgKCgqYnVmID49ICdBJykgJiYgKCpidWYgPD0gJ0YnKSkKKwkJCWogPSAoKGogPDwgNCkgfCAoKCpidWYrKyAtJ0EnKSArIDEwKSk7CisJCWVsc2UgaWYgKCgqYnVmID49ICcwJykgJiYgKCpidWYgPD0gJzknKSkKKwkJCWogPSAoKGogPDwgNCkgfCAoKmJ1ZisrIC0nMCcpKTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChpICUgMikgeworCQkJd3dubltpLzJdID0gaiAmIDB4ZmY7CisJCQlqID0gMDsKKwkJfQorCX0KKwlwaGJhLT5jZmdfc29mdF93d25uID0gd3duX3RvX3U2NCh3d25uKTsKKworCWRldl9wcmludGsoS0VSTl9OT1RJQ0UsICZwaGJhLT5wY2lkZXYtPmRldiwKKwkJICAgImxwZmMlZDogc29mdF93d25uIHNldC4gVmFsdWUgd2lsbCB0YWtlIGVmZmVjdCB1cG9uICIKKwkJICAgInNldHRpbmcgb2YgdGhlIHNvZnRfd3dwblxuIiwgcGhiYS0+YnJkX25vKTsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihscGZjX3NvZnRfd3dubiwgU19JUlVHTyB8IFNfSVdVU1IsXAorCQkJIGxwZmNfc29mdF93d25uX3Nob3csIGxwZmNfc29mdF93d25uX3N0b3JlKTsKKwogCiBzdGF0aWMgaW50IGxwZmNfcG9sbCA9IDA7CiBtb2R1bGVfcGFyYW0obHBmY19wb2xsLCBpbnQsIDApOwpAQCAtODAxLDEyICs4NjQsMTEgQEAKICMgTE9HX01CT1ggICAgICAgICAgICAgICAgICAgICAgMHg0ICAgICAgICBNYWlsYm94IGV2ZW50cwogIyBMT0dfSU5JVCAgICAgICAgICAgICAgICAgICAgICAweDggICAgICAgIEluaXRpYWxpemF0aW9uIGV2ZW50cwogIyBMT0dfTElOS19FVkVOVCAgICAgICAgICAgICAgICAweDEwICAgICAgIExpbmsgZXZlbnRzCi0jIExPR19JUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgICAgICAgSVAgdHJhZmZpYyBoaXN0b3J5CiAjIExPR19GQ1AgICAgICAgICAgICAgICAgICAgICAgIDB4NDAgICAgICAgRkNQIHRyYWZmaWMgaGlzdG9yeQogIyBMT0dfTk9ERSAgICAgICAgICAgICAgICAgICAgICAweDgwICAgICAgIE5vZGUgdGFibGUgZXZlbnRzCiAjIExPR19NSVNDICAgICAgICAgICAgICAgICAgICAgIDB4NDAwICAgICAgTWlzY2VsbGFuZW91cyBldmVudHMKICMgTE9HX1NMSSAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAgICAgICBTTEkgZXZlbnRzCi0jIExPR19DSEtfQ09ORCAgICAgICAgICAgICAgICAgIDB4MTAwMCAgICAgRkNQIENoZWNrIGNvbmRpdGlvbiBmbGFnCisjIExPR19GQ1BfRVJST1IgICAgICAgICAgICAgICAgIDB4MTAwMCAgICAgT25seSBsb2cgRkNQIGVycm9ycwogIyBMT0dfTElCREZDICAgICAgICAgICAgICAgICAgICAweDIwMDAgICAgIExJQkRGQyBldmVudHMKICMgTE9HX0FMTF9NU0cgICAgICAgICAgICAgICAgICAgMHhmZmZmICAgICBMT0cgYWxsIG1lc3NhZ2VzCiAqLwpAQCAtOTE1LDYgKzk3NywyMiBAQAogCQkiU0xJIHJpbmdzIHRvIHNwcmVhZCBJT0NCIGVudHJpZXMgYWNyb3NzIik7CiAKIC8qCisjIGxwZmNfbXVsdGlfcmluZ19yY3RsOiAgSWYgbHBmY19tdWx0aV9yaW5nX3N1cHBvcnQgaXMgZW5hYmxlZCwgdGhpcworIyBpZGVudGlmaWVzIHdoYXQgcmN0bCB2YWx1ZSB0byBjb25maWd1cmUgdGhlIGFkZGl0aW9uYWwgcmluZyBmb3IuCisjIFZhbHVlIHJhbmdlIGlzIFsxLDB4ZmZdLiBEZWZhdWx0IHZhbHVlIGlzIDQgKFVuc29saWNhdGVkIERhdGEpLgorKi8KK0xQRkNfQVRUUl9SKG11bHRpX3JpbmdfcmN0bCwgRkNfVU5TT0xfREFUQSwgMSwKKwkgICAgIDI1NSwgIklkZW50aWZpZXMgUkNUTCBmb3IgYWRkaXRpb25hbCByaW5nIGNvbmZpZ3VyYXRpb24iKTsKKworLyoKKyMgbHBmY19tdWx0aV9yaW5nX3R5cGU6ICBJZiBscGZjX211bHRpX3Jpbmdfc3VwcG9ydCBpcyBlbmFibGVkLCB0aGlzCisjIGlkZW50aWZpZXMgd2hhdCB0eXBlIHZhbHVlIHRvIGNvbmZpZ3VyZSB0aGUgYWRkaXRpb25hbCByaW5nIGZvci4KKyMgVmFsdWUgcmFuZ2UgaXMgWzEsMHhmZl0uIERlZmF1bHQgdmFsdWUgaXMgNSAoTExDL1NOQVApLgorKi8KK0xQRkNfQVRUUl9SKG11bHRpX3JpbmdfdHlwZSwgRkNfTExDX1NOQVAsIDEsCisJICAgICAyNTUsICJJZGVudGlmaWVzIFRZUEUgZm9yIGFkZGl0aW9uYWwgcmluZyBjb25maWd1cmF0aW9uIik7CisKKy8qCiAjIGxwZmNfZmRtaV9vbjogY29udHJvbHMgRkRNSSBzdXBwb3J0LgogIyAgICAgICAwID0gbm8gRkRNSSBzdXBwb3J0CiAjICAgICAgIDEgPSBzdXBwb3J0IEZETUkgd2l0aG91dCBhdHRyaWJ1dGUgb2YgaG9zdG5hbWUKQEAgLTk0NSw2ICsxMDIzLDE1IEBACiBMUEZDX0FUVFJfUlcocG9sbF90bW8sIDEwLCAxLCAyNTUsCiAJICAgICAiTWlsbGlzZWNvbmRzIGRyaXZlciB3aWxsIHdhaXQgYmV0d2VlbiBwb2xsaW5nIEZDUCByaW5nIik7CiAKKy8qCisjIGxwZmNfdXNlX21zaTogVXNlIE1TSSAoTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHRzKSBpbiBzeXN0ZW1zIHRoYXQKKyMJCXN1cHBvcnQgdGhpcyBmZWF0dXJlCisjICAgICAgIDAgID0gTVNJIGRpc2FibGVkIChkZWZhdWx0KQorIyAgICAgICAxICA9IE1TSSBlbmFibGVkCisjIFZhbHVlIHJhbmdlIGlzIFswLDFdLiBEZWZhdWx0IHZhbHVlIGlzIDAuCisqLworTFBGQ19BVFRSX1IodXNlX21zaSwgMCwgMCwgMSwgIlVzZSBNZXNzYWdlIFNpZ25hbGVkIEludGVycnVwdHMsIGlmIHBvc3NpYmxlIik7CisKIAogc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmxwZmNfaG9zdF9hdHRyc1tdID0gewogCSZjbGFzc19kZXZpY2VfYXR0cl9pbmZvLApAQCAtOTczLDYgKzEwNjAsOCBAQAogCSZjbGFzc19kZXZpY2VfYXR0cl9scGZjX2NyX2RlbGF5LAogCSZjbGFzc19kZXZpY2VfYXR0cl9scGZjX2NyX2NvdW50LAogCSZjbGFzc19kZXZpY2VfYXR0cl9scGZjX211bHRpX3Jpbmdfc3VwcG9ydCwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfbHBmY19tdWx0aV9yaW5nX3JjdGwsCisJJmNsYXNzX2RldmljZV9hdHRyX2xwZmNfbXVsdGlfcmluZ190eXBlLAogCSZjbGFzc19kZXZpY2VfYXR0cl9scGZjX2ZkbWlfb24sCiAJJmNsYXNzX2RldmljZV9hdHRyX2xwZmNfbWF4X2x1bnMsCiAJJmNsYXNzX2RldmljZV9hdHRyX25wb3J0X2V2dF9jbnQsCkBAIC05ODEsOCArMTA3MCwxMCBAQAogCSZjbGFzc19kZXZpY2VfYXR0cl9pc3N1ZV9yZXNldCwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfbHBmY19wb2xsLAogCSZjbGFzc19kZXZpY2VfYXR0cl9scGZjX3BvbGxfdG1vLAorCSZjbGFzc19kZXZpY2VfYXR0cl9scGZjX3VzZV9tc2ksCisJJmNsYXNzX2RldmljZV9hdHRyX2xwZmNfc29mdF93d25uLAogCSZjbGFzc19kZXZpY2VfYXR0cl9scGZjX3NvZnRfd3dwbiwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfbHBmY19zb2Z0X3d3cG5fZW5hYmxlLAorCSZjbGFzc19kZXZpY2VfYXR0cl9scGZjX3NvZnRfd3duX2VuYWJsZSwKIAlOVUxMLAogfTsKIApAQCAtMTc3MCw2ICsxODYxLDggQEAKIAlscGZjX2NyX2RlbGF5X2luaXQocGhiYSwgbHBmY19jcl9kZWxheSk7CiAJbHBmY19jcl9jb3VudF9pbml0KHBoYmEsIGxwZmNfY3JfY291bnQpOwogCWxwZmNfbXVsdGlfcmluZ19zdXBwb3J0X2luaXQocGhiYSwgbHBmY19tdWx0aV9yaW5nX3N1cHBvcnQpOworCWxwZmNfbXVsdGlfcmluZ19yY3RsX2luaXQocGhiYSwgbHBmY19tdWx0aV9yaW5nX3JjdGwpOworCWxwZmNfbXVsdGlfcmluZ190eXBlX2luaXQocGhiYSwgbHBmY19tdWx0aV9yaW5nX3R5cGUpOwogCWxwZmNfbHVuX3F1ZXVlX2RlcHRoX2luaXQocGhiYSwgbHBmY19sdW5fcXVldWVfZGVwdGgpOwogCWxwZmNfZmNwX2NsYXNzX2luaXQocGhiYSwgbHBmY19mY3BfY2xhc3MpOwogCWxwZmNfdXNlX2FkaXNjX2luaXQocGhiYSwgbHBmY191c2VfYWRpc2MpOwpAQCAtMTc4MSw5ICsxODc0LDExIEBACiAJbHBmY19kaXNjb3ZlcnlfdGhyZWFkc19pbml0KHBoYmEsIGxwZmNfZGlzY292ZXJ5X3RocmVhZHMpOwogCWxwZmNfbWF4X2x1bnNfaW5pdChwaGJhLCBscGZjX21heF9sdW5zKTsKIAlscGZjX3BvbGxfdG1vX2luaXQocGhiYSwgbHBmY19wb2xsX3Rtbyk7CisJbHBmY191c2VfbXNpX2luaXQocGhiYSwgbHBmY191c2VfbXNpKTsKIAlscGZjX2Rldmxvc3NfdG1vX2luaXQocGhiYSwgbHBmY19kZXZsb3NzX3Rtbyk7CiAJbHBmY19ub2Rldl90bW9faW5pdChwaGJhLCBscGZjX25vZGV2X3Rtbyk7CiAJcGhiYS0+Y2ZnX3BvbGwgPSBscGZjX3BvbGw7CisJcGhiYS0+Y2ZnX3NvZnRfd3dubiA9IDBMOwogCXBoYmEtPmNmZ19zb2Z0X3d3cG4gPSAwTDsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKaW5kZXggMWI1M2FmYi4uYTUxYTQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYwpAQCAtMTg4LDcgKzE4OCw4IEBACiAKIAkJaWYgKCFtcC0+dmlydCkgewogCQkJa2ZyZWUobXApOwotCQkJbHBmY19mcmVlX2N0X3JzcChwaGJhLCBtbGlzdCk7CisJCQlpZiAobWxpc3QpCisJCQkJbHBmY19mcmVlX2N0X3JzcChwaGJhLCBtbGlzdCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCkBAIC01NTcsNiArNTU4LDE0IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZAorbHBmY19jbXBsX2N0X2NtZF9yZmZfaWQoc3RydWN0IGxwZmNfaGJhICogcGhiYSwgc3RydWN0IGxwZmNfaW9jYnEgKiBjbWRpb2NiLAorCQkJIHN0cnVjdCBscGZjX2lvY2JxICogcnNwaW9jYikKK3sKKwlscGZjX2NtcGxfY3RfY21kX3JmdF9pZChwaGJhLCBjbWRpb2NiLCByc3Bpb2NiKTsKKwlyZXR1cm47Cit9CisKIHZvaWQKIGxwZmNfZ2V0X2hiYV9zeW1fbm9kZV9uYW1lKHN0cnVjdCBscGZjX2hiYSAqIHBoYmEsIHVpbnQ4X3QgKiBzeW1icCkKIHsKQEAgLTYyOCw2ICs2MzcsOCBAQAogCQlicGwtPnR1cy5mLmJkZVNpemUgPSBSTk5fUkVRVUVTVF9TWjsKIAllbHNlIGlmIChjbWRjb2RlID09IFNMSV9DVE5TX1JTTk5fTk4pCiAJCWJwbC0+dHVzLmYuYmRlU2l6ZSA9IFJTTk5fUkVRVUVTVF9TWjsKKwllbHNlIGlmIChjbWRjb2RlID09IFNMSV9DVE5TX1JGRl9JRCkKKwkJYnBsLT50dXMuZi5iZGVTaXplID0gUkZGX1JFUVVFU1RfU1o7CiAJZWxzZQogCQlicGwtPnR1cy5mLmJkZVNpemUgPSAwOwogCWJwbC0+dHVzLncgPSBsZTMyX3RvX2NwdShicGwtPnR1cy53KTsKQEAgLTY1OSw2ICs2NzAsMTcgQEAKIAkJY21wbCA9IGxwZmNfY21wbF9jdF9jbWRfcmZ0X2lkOwogCQlicmVhazsKIAorCWNhc2UgU0xJX0NUTlNfUkZGX0lEOgorCQlDdFJlcS0+Q29tbWFuZFJlc3BvbnNlLmJpdHMuQ21kUnNwID0KKwkJCWJlMTZfdG9fY3B1KFNMSV9DVE5TX1JGRl9JRCk7CisJCUN0UmVxLT51bi5yZmYuUG9ydElkID0gYmUzMl90b19jcHUocGhiYS0+ZmNfbXlESUQpOworCQlDdFJlcS0+dW4ucmZmLmZlYXR1cmVfcmVzID0gMDsKKwkJQ3RSZXEtPnVuLnJmZi5mZWF0dXJlX3RndCA9IDA7CisJCUN0UmVxLT51bi5yZmYudHlwZV9jb2RlID0gRkNfRkNQX0RBVEE7CisJCUN0UmVxLT51bi5yZmYuZmVhdHVyZV9pbml0ID0gMTsKKwkJY21wbCA9IGxwZmNfY21wbF9jdF9jbWRfcmZmX2lkOworCQlicmVhazsKKwogCWNhc2UgU0xJX0NUTlNfUk5OX0lEOgogCQlDdFJlcS0+Q29tbWFuZFJlc3BvbnNlLmJpdHMuQ21kUnNwID0KIAkJICAgIGJlMTZfdG9fY3B1KFNMSV9DVE5TX1JOTl9JRCk7CkBAIC05MzMsNyArOTU1LDggQEAKIAkJCWFlID0gKEFUVFJJQlVURV9FTlRSWSAqKSAoKHVpbnQ4X3QgKikgcmggKyBzaXplKTsKIAkJCWFlLT5hZC5iaXRzLkF0dHJUeXBlID0gYmUxNl90b19jcHUoT1NfTkFNRV9WRVJTSU9OKTsKIAkJCXNwcmludGYoYWUtPnVuLk9zTmFtZVZlcnNpb24sICIlcyAlcyAlcyIsCi0JCQkJaW5pdF91dHNuYW1lKCktPnN5c25hbWUsIGluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLAorCQkJCWluaXRfdXRzbmFtZSgpLT5zeXNuYW1lLAorCQkJCWluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLAogCQkJCWluaXRfdXRzbmFtZSgpLT52ZXJzaW9uKTsKIAkJCWxlbiA9IHN0cmxlbihhZS0+dW4uT3NOYW1lVmVyc2lvbik7CiAJCQlsZW4gKz0gKGxlbiAmIDMpID8gKDQgLSAobGVuICYgMykpIDogNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCmluZGV4IDcxODY0Y2RjLi5hNWYzM2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKQEAgLTI0Myw2ICsyNDMsNyBAQAogCQlzdHJ1Y3Qgc2Vydl9wYXJtICpzcCwgSU9DQl90ICppcnNwKQogewogCUxQRkNfTUJPWFFfdCAqbWJveDsKKwlzdHJ1Y3QgbHBmY19kbWFidWYgKm1wOwogCWludCByYzsKIAogCXNwaW5fbG9ja19pcnEocGhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKQEAgLTMwNywxMCArMzA4LDE0IEBACiAKIAlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX05PV0FJVCB8IE1CWF9TVE9QX0lPQ0IpOwogCWlmIChyYyA9PSBNQlhfTk9UX0ZJTklTSEVEKQotCQlnb3RvIGZhaWxfZnJlZV9tYm94OworCQlnb3RvIGZhaWxfaXNzdWVfcmVnX2xvZ2luOwogCiAJcmV0dXJuIDA7CiAKKyBmYWlsX2lzc3VlX3JlZ19sb2dpbjoKKwltcCA9IChzdHJ1Y3QgbHBmY19kbWFidWYgKikgbWJveC0+Y29udGV4dDE7CisJbHBmY19tYnVmX2ZyZWUocGhiYSwgbXAtPnZpcnQsIG1wLT5waHlzKTsKKwlrZnJlZShtcCk7CiAgZmFpbF9mcmVlX21ib3g6CiAJbWVtcG9vbF9mcmVlKG1ib3gsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogIGZhaWw6CkBAIC02NTcsNiArNjYyLDEyIEBACiAJdWludDhfdCBuYW1lW3NpemVvZiAoc3RydWN0IGxwZmNfbmFtZSldOwogCXVpbnQzMl90IHJjOwogCisJLyogRmFicmljIG5vZGVzIGNhbiBoYXZlIHRoZSBzYW1lIFdXUE4gc28gd2UgZG9uJ3QgYm90aGVyIHNlYXJjaGluZworCSAqIGJ5IFdXUE4uICBKdXN0IHJldHVybiB0aGUgbmRscCB0aGF0IHdhcyBnaXZlbiB0byB1cy4KKwkgKi8KKwlpZiAobmRscC0+bmxwX3R5cGUgJiBOTFBfRkFCUklDKQorCQlyZXR1cm4gbmRscDsKKwogCWxwID0gKHVpbnQzMl90ICopIHByc3AtPnZpcnQ7CiAJc3AgPSAoc3RydWN0IHNlcnZfcGFybSAqKSAoKHVpbnQ4X3QgKikgbHAgKyBzaXplb2YgKHVpbnQzMl90KSk7CiAJbWVtc2V0KG5hbWUsIDAsIHNpemVvZiAoc3RydWN0IGxwZmNfbmFtZSkpOwpAQCAtMTEyMiw3ICsxMTMzLDcgQEAKIAkJCQkJCW1lbXBvb2xfZnJlZShtYm94LAogCQkJCQkJICAgICBwaGJhLT5tYm94X21lbV9wb29sKTsKIAkJCQkJCWxwZmNfZGlzY19mbHVzaF9saXN0KHBoYmEpOwotCQkJCQkJcHNsaS0+cmluZ1socHNsaS0+aXBfcmluZyldLgorCQkJCQkJcHNsaS0+cmluZ1socHNsaS0+ZXh0cmFfcmluZyldLgogCQkJCQkJICAgIGZsYWcgJj0KIAkJCQkJCSAgICB+TFBGQ19TVE9QX0lPQ0JfRVZFTlQ7CiAJCQkJCQlwc2xpLT5yaW5nWyhwc2xpLT5mY3BfcmluZyldLgpAQCAtMTg1MSw2ICsxODYyLDcgQEAKIAlJT0NCX3QgKmlyc3A7CiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHA7CiAJTFBGQ19NQk9YUV90ICptYm94ID0gTlVMTDsKKwlzdHJ1Y3QgbHBmY19kbWFidWYgKm1wOwogCiAJaXJzcCA9ICZyc3Bpb2NiLT5pb2NiOwogCkBAIC0xODYyLDYgKzE4NzQsMTEgQEAKIAkvKiBDaGVjayB0byBzZWUgaWYgbGluayB3ZW50IGRvd24gZHVyaW5nIGRpc2NvdmVyeSAqLwogCWlmICgobHBmY19lbHNfY2hrX2xhdHQocGhiYSkpIHx8ICFuZGxwKSB7CiAJCWlmIChtYm94KSB7CisJCQltcCA9IChzdHJ1Y3QgbHBmY19kbWFidWYgKikgbWJveC0+Y29udGV4dDE7CisJCQlpZiAobXApIHsKKwkJCQlscGZjX21idWZfZnJlZShwaGJhLCBtcC0+dmlydCwgbXAtPnBoeXMpOworCQkJCWtmcmVlKG1wKTsKKwkJCX0KIAkJCW1lbXBvb2xfZnJlZSggbWJveCwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJCX0KIAkJZ290byBvdXQ7CkBAIC0xODkzLDkgKzE5MTAsNyBAQAogCQkJfQogCQkJLyogTk9URTogd2Ugc2hvdWxkIGhhdmUgbWVzc2FnZXMgZm9yIHVuc3VjY2Vzc2Z1bAogCQkJICAgcmVnbG9naW4gKi8KLQkJCW1lbXBvb2xfZnJlZSggbWJveCwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJCX0gZWxzZSB7Ci0JCQltZW1wb29sX2ZyZWUoIG1ib3gsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogCQkJLyogRG8gbm90IGNhbGwgTk9fTElTVCBmb3IgbHBmY19lbHNfYWJvcnQnZWQgRUxTIGNtZHMgKi8KIAkJCWlmICghKChpcnNwLT51bHBTdGF0dXMgPT0gSU9TVEFUX0xPQ0FMX1JFSkVDVCkgJiYKIAkJCSAgICAgICgoaXJzcC0+dW4udWxwV29yZFs0XSA9PSBJT0VSUl9TTElfQUJPUlRFRCkgfHwKQEAgLTE5MDcsNiArMTkyMiwxMiBAQAogCQkJCX0KIAkJCX0KIAkJfQorCQltcCA9IChzdHJ1Y3QgbHBmY19kbWFidWYgKikgbWJveC0+Y29udGV4dDE7CisJCWlmIChtcCkgeworCQkJbHBmY19tYnVmX2ZyZWUocGhiYSwgbXAtPnZpcnQsIG1wLT5waHlzKTsKKwkJCWtmcmVlKG1wKTsKKwkJfQorCQltZW1wb29sX2ZyZWUobWJveCwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJfQogb3V0OgogCWlmIChuZGxwKSB7CkBAIC0yNjQ0LDYgKzI2NjUsNyBAQAogCQkJbmRscC0+bmxwX3R5cGUgfD0gTkxQX0ZBQlJJQzsKIAkJCW5kbHAtPm5scF9wcmV2X3N0YXRlID0gbmRscC0+bmxwX3N0YXRlOwogCQkJbmRscC0+bmxwX3N0YXRlID0gTkxQX1NURV9QTE9HSV9JU1NVRTsKKwkJCWxwZmNfbmxwX2xpc3QocGhiYSwgbmRscCwgTkxQX1BMT0dJX0xJU1QpOwogCQkJbHBmY19pc3N1ZV9lbHNfcGxvZ2kocGhiYSwgTmFtZVNlcnZlcl9ESUQsIDApOwogCQkJLyogV2FpdCBmb3IgTmFtZVNlcnZlciBsb2dpbiBjbXBsIGJlZm9yZSB3ZSBjYW4KIAkJCSAgIGNvbnRpbnVlICovCkBAIC0zMDM5LDcgKzMwNjEsNyBAQAogCS8qIEZBUlAtUkVRIHJlY2VpdmVkIGZyb20gRElEIDxkaWQ+ICovCiAJbHBmY19wcmludGZfbG9nKHBoYmEsCiAJCQkgS0VSTl9JTkZPLAotCQkJIExPR19JUCwKKwkJCSBMT0dfRUxTLAogCQkJICIlZDowNjAxIEZBUlAtUkVRIHJlY2VpdmVkIGZyb20gRElEIHgleFxuIiwKIAkJCSBwaGJhLT5icmRfbm8sIGRpZCk7CiAKQEAgLTMxMDEsNyArMzEyMyw3IEBACiAJLyogRkFSUC1SU1AgcmVjZWl2ZWQgZnJvbSBESUQgPGRpZD4gKi8KIAlscGZjX3ByaW50Zl9sb2cocGhiYSwKIAkJCSBLRVJOX0lORk8sCi0JCQkgTE9HX0lQLAorCQkJIExPR19FTFMsCiAJCQkgIiVkOjA2MDAgRkFSUC1SU1AgcmVjZWl2ZWQgZnJvbSBESUQgeCV4XG4iLAogCQkJIHBoYmEtPmJyZF9ubywgZGlkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwppbmRleCBkNTg2YzNkLi5jMzk1NjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiB7CiAJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gcDsKIAlpbnQgcmM7Ci0JREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod29ya193YWl0cSk7CisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyh3b3JrX3dhaXRxKTsKIAogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTIwKTsKIAlwaGJhLT53b3JrX3dhaXQgPSAmd29ya193YWl0cTsKQEAgLTUyNSw3ICs1MjUsNyBAQAogCXBzbGkgPSAmcGhiYS0+c2xpOwogCW1iID0gJnBtYi0+bWI7CiAJLyogU2luY2Ugd2UgZG9uJ3QgZG8gZGlzY292ZXJ5IHJpZ2h0IG5vdywgdHVybiB0aGVzZSBvZmYgaGVyZSAqLwotCXBzbGktPnJpbmdbcHNsaS0+aXBfcmluZ10uZmxhZyAmPSB+TFBGQ19TVE9QX0lPQ0JfRVZFTlQ7CisJcHNsaS0+cmluZ1twc2xpLT5leHRyYV9yaW5nXS5mbGFnICY9IH5MUEZDX1NUT1BfSU9DQl9FVkVOVDsKIAlwc2xpLT5yaW5nW3BzbGktPmZjcF9yaW5nXS5mbGFnICY9IH5MUEZDX1NUT1BfSU9DQl9FVkVOVDsKIAlwc2xpLT5yaW5nW3BzbGktPm5leHRfcmluZ10uZmxhZyAmPSB+TFBGQ19TVE9QX0lPQ0JfRVZFTlQ7CiAKQEAgLTY0MSw3ICs2NDEsNyBAQAogCWlmIChyYyA9PSBNQlhfTk9UX0ZJTklTSEVEKSB7CiAJCW1lbXBvb2xfZnJlZShwbWIsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogCQlscGZjX2Rpc2NfZmx1c2hfbGlzdChwaGJhKTsKLQkJcHNsaS0+cmluZ1socHNsaS0+aXBfcmluZyldLmZsYWcgJj0gfkxQRkNfU1RPUF9JT0NCX0VWRU5UOworCQlwc2xpLT5yaW5nWyhwc2xpLT5leHRyYV9yaW5nKV0uZmxhZyAmPSB+TFBGQ19TVE9QX0lPQ0JfRVZFTlQ7CiAJCXBzbGktPnJpbmdbKHBzbGktPmZjcF9yaW5nKV0uZmxhZyAmPSB+TFBGQ19TVE9QX0lPQ0JfRVZFTlQ7CiAJCXBzbGktPnJpbmdbKHBzbGktPm5leHRfcmluZyldLmZsYWcgJj0gfkxQRkNfU1RPUF9JT0NCX0VWRU5UOwogCQlwaGJhLT5oYmFfc3RhdGUgPSBMUEZDX0hCQV9SRUFEWTsKQEAgLTY3Miw2ICs2NzIsOCBAQAogCiAJbWVtY3B5KCh1aW50OF90ICopICYgcGhiYS0+ZmNfc3BhcmFtLCAodWludDhfdCAqKSBtcC0+dmlydCwKIAkgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2Vydl9wYXJtKSk7CisJaWYgKHBoYmEtPmNmZ19zb2Z0X3d3bm4pCisJCXU2NF90b193d24ocGhiYS0+Y2ZnX3NvZnRfd3dubiwgcGhiYS0+ZmNfc3BhcmFtLm5vZGVOYW1lLnUud3duKTsKIAlpZiAocGhiYS0+Y2ZnX3NvZnRfd3dwbikKIAkJdTY0X3RvX3d3bihwaGJhLT5jZmdfc29mdF93d3BuLCBwaGJhLT5mY19zcGFyYW0ucG9ydE5hbWUudS53d24pOwogCW1lbWNweSgodWludDhfdCAqKSAmIHBoYmEtPmZjX25vZGVuYW1lLApAQCAtNjk2LDcgKzY5OCw3IEBACiAJCSAgICA9PSBNQlhfTk9UX0ZJTklTSEVEKSB7CiAJCQltZW1wb29sX2ZyZWUoIHBtYiwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJCQlscGZjX2Rpc2NfZmx1c2hfbGlzdChwaGJhKTsKLQkJCXBzbGktPnJpbmdbKHBzbGktPmlwX3JpbmcpXS5mbGFnICY9CisJCQlwc2xpLT5yaW5nWyhwc2xpLT5leHRyYV9yaW5nKV0uZmxhZyAmPQogCQkJICAgIH5MUEZDX1NUT1BfSU9DQl9FVkVOVDsKIAkJCXBzbGktPnJpbmdbKHBzbGktPmZjcF9yaW5nKV0uZmxhZyAmPQogCQkJICAgIH5MUEZDX1NUT1BfSU9DQl9FVkVOVDsKQEAgLTcxNSw2ICs3MTcsOSBAQAogewogCWludCBpOwogCUxQRkNfTUJPWFFfdCAqc3BhcmFtX21ib3gsICpjZmdsaW5rX21ib3g7CisJc3RydWN0IGxwZmNfZG1hYnVmICptcDsKKwlpbnQgcmM7CisKIAlzcGFyYW1fbWJveCA9IG1lbXBvb2xfYWxsb2MocGhiYS0+bWJveF9tZW1fcG9vbCwgR0ZQX0tFUk5FTCk7CiAJY2ZnbGlua19tYm94ID0gbWVtcG9vbF9hbGxvYyhwaGJhLT5tYm94X21lbV9wb29sLCBHRlBfS0VSTkVMKTsKIApAQCAtNzkzLDE2ICs3OTgsMjcgQEAKIAlpZiAoc3BhcmFtX21ib3gpIHsKIAkJbHBmY19yZWFkX3NwYXJhbShwaGJhLCBzcGFyYW1fbWJveCk7CiAJCXNwYXJhbV9tYm94LT5tYm94X2NtcGwgPSBscGZjX21ieF9jbXBsX3JlYWRfc3BhcmFtOwotCQlscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIHNwYXJhbV9tYm94LAorCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgc3BhcmFtX21ib3gsCiAJCQkJCQkoTUJYX05PV0FJVCB8IE1CWF9TVE9QX0lPQ0IpKTsKKwkJaWYgKHJjID09IE1CWF9OT1RfRklOSVNIRUQpIHsKKwkJCW1wID0gKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSBzcGFyYW1fbWJveC0+Y29udGV4dDE7CisJCQlscGZjX21idWZfZnJlZShwaGJhLCBtcC0+dmlydCwgbXAtPnBoeXMpOworCQkJa2ZyZWUobXApOworCQkJbWVtcG9vbF9mcmVlKHNwYXJhbV9tYm94LCBwaGJhLT5tYm94X21lbV9wb29sKTsKKwkJCWlmIChjZmdsaW5rX21ib3gpCisJCQkJbWVtcG9vbF9mcmVlKGNmZ2xpbmtfbWJveCwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CisJCQlyZXR1cm47CisJCX0KIAl9CiAKIAlpZiAoY2ZnbGlua19tYm94KSB7CiAJCXBoYmEtPmhiYV9zdGF0ZSA9IExQRkNfTE9DQUxfQ0ZHX0xJTks7CiAJCWxwZmNfY29uZmlnX2xpbmsocGhiYSwgY2ZnbGlua19tYm94KTsKIAkJY2ZnbGlua19tYm94LT5tYm94X2NtcGwgPSBscGZjX21ieF9jbXBsX2xvY2FsX2NvbmZpZ19saW5rOwotCQlscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIGNmZ2xpbmtfbWJveCwKKwkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIGNmZ2xpbmtfbWJveCwKIAkJCQkJCShNQlhfTk9XQUlUIHwgTUJYX1NUT1BfSU9DQikpOworCQlpZiAocmMgPT0gTUJYX05PVF9GSU5JU0hFRCkKKwkJCW1lbXBvb2xfZnJlZShjZmdsaW5rX21ib3gsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwogCX0KIH0KIApAQCAtMTA2Nyw2ICsxMDgzLDcgQEAKIAkJbHBmY19uc19jbWQocGhiYSwgbmRscCwgU0xJX0NUTlNfUk5OX0lEKTsKIAkJbHBmY19uc19jbWQocGhiYSwgbmRscCwgU0xJX0NUTlNfUlNOTl9OTik7CiAJCWxwZmNfbnNfY21kKHBoYmEsIG5kbHAsIFNMSV9DVE5TX1JGVF9JRCk7CisJCWxwZmNfbnNfY21kKHBoYmEsIG5kbHAsIFNMSV9DVE5TX1JGRl9JRCk7CiAJfQogCiAJcGhiYS0+ZmNfbnNfcmV0cnkgPSAwOwpAQCAtMTQyMyw3ICsxNDQwLDcgQEAKIAkJCWlmIChpb2NiLT5jb250ZXh0MSA9PSAodWludDhfdCAqKSBuZGxwKQogCQkJCXJldHVybiAxOwogCQl9Ci0JfSBlbHNlIGlmIChwcmluZy0+cmluZ25vID09IHBzbGktPmlwX3JpbmcpIHsKKwl9IGVsc2UgaWYgKHByaW5nLT5yaW5nbm8gPT0gcHNsaS0+ZXh0cmFfcmluZykgewogCiAJfSBlbHNlIGlmIChwcmluZy0+cmluZ25vID09IHBzbGktPmZjcF9yaW5nKSB7CiAJCS8qIFNraXAgbWF0Y2ggY2hlY2sgaWYgd2FpdGluZyB0byByZWxvZ2luIHRvIEZDUCB0YXJnZXQgKi8KQEAgLTE2ODAsMjEgKzE2OTcsMzggQEAKIHN0cnVjdCBscGZjX25vZGVsaXN0ICoKIGxwZmNfZmluZG5vZGVfZGlkKHN0cnVjdCBscGZjX2hiYSAqIHBoYmEsIHVpbnQzMl90IG9yZGVyLCB1aW50MzJfdCBkaWQpCiB7Ci0Jc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHAsICpuZXh0X25kbHA7CisJc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHA7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdHNbXT17JnBoYmEtPmZjX25scHVubWFwX2xpc3QsCisJCQkJICAgJnBoYmEtPmZjX25scG1hcF9saXN0LAorCQkJCSAgICZwaGJhLT5mY19wbG9naV9saXN0LAorCQkJCSAgICZwaGJhLT5mY19hZGlzY19saXN0LAorCQkJCSAgICZwaGJhLT5mY19yZWdsb2dpbl9saXN0LAorCQkJCSAgICZwaGJhLT5mY19wcmxpX2xpc3QsCisJCQkJICAgJnBoYmEtPmZjX25wcl9saXN0LAorCQkJCSAgICZwaGJhLT5mY191bnVzZWRfbGlzdH07CisJdWludDMyX3Qgc2VhcmNoW109e05MUF9TRUFSQ0hfVU5NQVBQRUQsCisJCQkgICBOTFBfU0VBUkNIX01BUFBFRCwKKwkJCSAgIE5MUF9TRUFSQ0hfUExPR0ksCisJCQkgICBOTFBfU0VBUkNIX0FESVNDLAorCQkJICAgTkxQX1NFQVJDSF9SRUdMT0dJTiwKKwkJCSAgIE5MUF9TRUFSQ0hfUFJMSSwKKwkJCSAgIE5MUF9TRUFSQ0hfTlBSLAorCQkJICAgTkxQX1NFQVJDSF9VTlVTRUR9OworCWludCBpOwogCXVpbnQzMl90IGRhdGExOwogCiAJc3Bpbl9sb2NrX2lycShwaGJhLT5ob3N0LT5ob3N0X2xvY2spOwotCWlmIChvcmRlciAmIE5MUF9TRUFSQ0hfVU5NQVBQRUQpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5kbHAsIG5leHRfbmRscCwKLQkJCQkJICZwaGJhLT5mY19ubHB1bm1hcF9saXN0LCBubHBfbGlzdHApIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsaXN0cyk7IGkrKyApIHsKKwkJaWYgKCEob3JkZXIgJiBzZWFyY2hbaV0pKQorCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobmRscCwgbGlzdHNbaV0sIG5scF9saXN0cCkgewogCQkJaWYgKGxwZmNfbWF0Y2hkaWQocGhiYSwgbmRscCwgZGlkKSkgewogCQkJCWRhdGExID0gKCgodWludDMyX3QpIG5kbHAtPm5scF9zdGF0ZSA8PCAyNCkgfAogCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3hyaSA8PCAxNikgfAogCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3R5cGUgPDwgOCkgfAogCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3JwaSAmIDB4ZmYpKTsKLQkJCQkvKiBGSU5EIG5vZGUgRElEIHVubWFwcGVkICovCiAJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX05PREUsCi0JCQkJCQkiJWQ6MDkyOSBGSU5EIG5vZGUgRElEIHVubWFwcGVkIgorCQkJCQkJIiVkOjA5MjkgRklORCBub2RlIERJRCAiCiAJCQkJCQkiIERhdGE6IHglcCB4JXggeCV4IHgleFxuIiwKIAkJCQkJCXBoYmEtPmJyZF9ubywKIAkJCQkJCW5kbHAsIG5kbHAtPm5scF9ESUQsCkBAIC0xNzA0LDE3NyArMTczOCwxMiBAQAogCQkJfQogCQl9CiAJfQotCi0JaWYgKG9yZGVyICYgTkxQX1NFQVJDSF9NQVBQRUQpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5kbHAsIG5leHRfbmRscCwgJnBoYmEtPmZjX25scG1hcF9saXN0LAotCQkJCQlubHBfbGlzdHApIHsKLQkJCWlmIChscGZjX21hdGNoZGlkKHBoYmEsIG5kbHAsIGRpZCkpIHsKLQotCQkJCWRhdGExID0gKCgodWludDMyX3QpIG5kbHAtPm5scF9zdGF0ZSA8PCAyNCkgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3hyaSA8PCAxNikgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3R5cGUgPDwgOCkgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3JwaSAmIDB4ZmYpKTsKLQkJCQkvKiBGSU5EIG5vZGUgRElEIG1hcHBlZCAqLwotCQkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19OT0RFLAotCQkJCQkJIiVkOjA5MzAgRklORCBub2RlIERJRCBtYXBwZWQgIgotCQkJCQkJIkRhdGE6IHglcCB4JXggeCV4IHgleFxuIiwKLQkJCQkJCXBoYmEtPmJyZF9ubywKLQkJCQkJCW5kbHAsIG5kbHAtPm5scF9ESUQsCi0JCQkJCQluZGxwLT5ubHBfZmxhZywgZGF0YTEpOwotCQkJCXNwaW5fdW5sb2NrX2lycShwaGJhLT5ob3N0LT5ob3N0X2xvY2spOwotCQkJCXJldHVybiBuZGxwOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKG9yZGVyICYgTkxQX1NFQVJDSF9QTE9HSSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmRscCwgbmV4dF9uZGxwLCAmcGhiYS0+ZmNfcGxvZ2lfbGlzdCwKLQkJCQkJbmxwX2xpc3RwKSB7Ci0JCQlpZiAobHBmY19tYXRjaGRpZChwaGJhLCBuZGxwLCBkaWQpKSB7Ci0KLQkJCQlkYXRhMSA9ICgoKHVpbnQzMl90KSBuZGxwLT5ubHBfc3RhdGUgPDwgMjQpIHwKLQkJCQkJICgodWludDMyX3QpIG5kbHAtPm5scF94cmkgPDwgMTYpIHwKLQkJCQkJICgodWludDMyX3QpIG5kbHAtPm5scF90eXBlIDw8IDgpIHwKLQkJCQkJICgodWludDMyX3QpIG5kbHAtPm5scF9ycGkgJiAweGZmKSk7Ci0JCQkJLyogTE9HIGNoYW5nZSB0byBQTE9HSSAqLwotCQkJCS8qIEZJTkQgbm9kZSBESUQgcGxvZ2kgKi8KLQkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTk9ERSwKLQkJCQkJCSIlZDowOTA4IEZJTkQgbm9kZSBESUQgcGxvZ2kgIgotCQkJCQkJIkRhdGE6IHglcCB4JXggeCV4IHgleFxuIiwKLQkJCQkJCXBoYmEtPmJyZF9ubywKLQkJCQkJCW5kbHAsIG5kbHAtPm5scF9ESUQsCi0JCQkJCQluZGxwLT5ubHBfZmxhZywgZGF0YTEpOwotCQkJCXNwaW5fdW5sb2NrX2lycShwaGJhLT5ob3N0LT5ob3N0X2xvY2spOwotCQkJCXJldHVybiBuZGxwOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKG9yZGVyICYgTkxQX1NFQVJDSF9BRElTQykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmRscCwgbmV4dF9uZGxwLCAmcGhiYS0+ZmNfYWRpc2NfbGlzdCwKLQkJCQkJbmxwX2xpc3RwKSB7Ci0JCQlpZiAobHBmY19tYXRjaGRpZChwaGJhLCBuZGxwLCBkaWQpKSB7Ci0KLQkJCQlkYXRhMSA9ICgoKHVpbnQzMl90KSBuZGxwLT5ubHBfc3RhdGUgPDwgMjQpIHwKLQkJCQkJICgodWludDMyX3QpIG5kbHAtPm5scF94cmkgPDwgMTYpIHwKLQkJCQkJICgodWludDMyX3QpIG5kbHAtPm5scF90eXBlIDw8IDgpIHwKLQkJCQkJICgodWludDMyX3QpIG5kbHAtPm5scF9ycGkgJiAweGZmKSk7Ci0JCQkJLyogTE9HIGNoYW5nZSB0byBBRElTQyAqLwotCQkJCS8qIEZJTkQgbm9kZSBESUQgYWRpc2MgKi8KLQkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTk9ERSwKLQkJCQkJCSIlZDowOTMxIEZJTkQgbm9kZSBESUQgYWRpc2MgIgotCQkJCQkJIkRhdGE6IHglcCB4JXggeCV4IHgleFxuIiwKLQkJCQkJCXBoYmEtPmJyZF9ubywKLQkJCQkJCW5kbHAsIG5kbHAtPm5scF9ESUQsCi0JCQkJCQluZGxwLT5ubHBfZmxhZywgZGF0YTEpOwotCQkJCXNwaW5fdW5sb2NrX2lycShwaGJhLT5ob3N0LT5ob3N0X2xvY2spOwotCQkJCXJldHVybiBuZGxwOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKG9yZGVyICYgTkxQX1NFQVJDSF9SRUdMT0dJTikgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmRscCwgbmV4dF9uZGxwLAotCQkJCQkgJnBoYmEtPmZjX3JlZ2xvZ2luX2xpc3QsIG5scF9saXN0cCkgewotCQkJaWYgKGxwZmNfbWF0Y2hkaWQocGhiYSwgbmRscCwgZGlkKSkgewotCi0JCQkJZGF0YTEgPSAoKCh1aW50MzJfdCkgbmRscC0+bmxwX3N0YXRlIDw8IDI0KSB8Ci0JCQkJCSAoKHVpbnQzMl90KSBuZGxwLT5ubHBfeHJpIDw8IDE2KSB8Ci0JCQkJCSAoKHVpbnQzMl90KSBuZGxwLT5ubHBfdHlwZSA8PCA4KSB8Ci0JCQkJCSAoKHVpbnQzMl90KSBuZGxwLT5ubHBfcnBpICYgMHhmZikpOwotCQkJCS8qIExPRyBjaGFuZ2UgdG8gUkVHTE9HSU4gKi8KLQkJCQkvKiBGSU5EIG5vZGUgRElEIHJlZ2xvZ2luICovCi0JCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX05PREUsCi0JCQkJCQkiJWQ6MDkwMSBGSU5EIG5vZGUgRElEIHJlZ2xvZ2luIgotCQkJCQkJIiBEYXRhOiB4JXAgeCV4IHgleCB4JXhcbiIsCi0JCQkJCQlwaGJhLT5icmRfbm8sCi0JCQkJCQluZGxwLCBuZGxwLT5ubHBfRElELAotCQkJCQkJbmRscC0+bmxwX2ZsYWcsIGRhdGExKTsKLQkJCQlzcGluX3VubG9ja19pcnEocGhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKLQkJCQlyZXR1cm4gbmRscDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChvcmRlciAmIE5MUF9TRUFSQ0hfUFJMSSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmRscCwgbmV4dF9uZGxwLCAmcGhiYS0+ZmNfcHJsaV9saXN0LAotCQkJCQlubHBfbGlzdHApIHsKLQkJCWlmIChscGZjX21hdGNoZGlkKHBoYmEsIG5kbHAsIGRpZCkpIHsKLQotCQkJCWRhdGExID0gKCgodWludDMyX3QpIG5kbHAtPm5scF9zdGF0ZSA8PCAyNCkgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3hyaSA8PCAxNikgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3R5cGUgPDwgOCkgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3JwaSAmIDB4ZmYpKTsKLQkJCQkvKiBMT0cgY2hhbmdlIHRvIFBSTEkgKi8KLQkJCQkvKiBGSU5EIG5vZGUgRElEIHBybGkgKi8KLQkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTk9ERSwKLQkJCQkJCSIlZDowOTAyIEZJTkQgbm9kZSBESUQgcHJsaSAiCi0JCQkJCQkiRGF0YTogeCVwIHgleCB4JXggeCV4XG4iLAotCQkJCQkJcGhiYS0+YnJkX25vLAotCQkJCQkJbmRscCwgbmRscC0+bmxwX0RJRCwKLQkJCQkJCW5kbHAtPm5scF9mbGFnLCBkYXRhMSk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKHBoYmEtPmhvc3QtPmhvc3RfbG9jayk7Ci0JCQkJcmV0dXJuIG5kbHA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAob3JkZXIgJiBOTFBfU0VBUkNIX05QUikgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmRscCwgbmV4dF9uZGxwLCAmcGhiYS0+ZmNfbnByX2xpc3QsCi0JCQkJCW5scF9saXN0cCkgewotCQkJaWYgKGxwZmNfbWF0Y2hkaWQocGhiYSwgbmRscCwgZGlkKSkgewotCi0JCQkJZGF0YTEgPSAoKCh1aW50MzJfdCkgbmRscC0+bmxwX3N0YXRlIDw8IDI0KSB8Ci0JCQkJCSAoKHVpbnQzMl90KSBuZGxwLT5ubHBfeHJpIDw8IDE2KSB8Ci0JCQkJCSAoKHVpbnQzMl90KSBuZGxwLT5ubHBfdHlwZSA8PCA4KSB8Ci0JCQkJCSAoKHVpbnQzMl90KSBuZGxwLT5ubHBfcnBpICYgMHhmZikpOwotCQkJCS8qIExPRyBjaGFuZ2UgdG8gTlBSICovCi0JCQkJLyogRklORCBub2RlIERJRCBucHIgKi8KLQkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTk9ERSwKLQkJCQkJCSIlZDowOTAzIEZJTkQgbm9kZSBESUQgbnByICIKLQkJCQkJCSJEYXRhOiB4JXAgeCV4IHgleCB4JXhcbiIsCi0JCQkJCQlwaGJhLT5icmRfbm8sCi0JCQkJCQluZGxwLCBuZGxwLT5ubHBfRElELAotCQkJCQkJbmRscC0+bmxwX2ZsYWcsIGRhdGExKTsKLQkJCQlzcGluX3VubG9ja19pcnEocGhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKLQkJCQlyZXR1cm4gbmRscDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChvcmRlciAmIE5MUF9TRUFSQ0hfVU5VU0VEKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZGxwLCBuZXh0X25kbHAsICZwaGJhLT5mY19hZGlzY19saXN0LAotCQkJCQlubHBfbGlzdHApIHsKLQkJCWlmIChscGZjX21hdGNoZGlkKHBoYmEsIG5kbHAsIGRpZCkpIHsKLQotCQkJCWRhdGExID0gKCgodWludDMyX3QpIG5kbHAtPm5scF9zdGF0ZSA8PCAyNCkgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3hyaSA8PCAxNikgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3R5cGUgPDwgOCkgfAotCQkJCQkgKCh1aW50MzJfdCkgbmRscC0+bmxwX3JwaSAmIDB4ZmYpKTsKLQkJCQkvKiBMT0cgY2hhbmdlIHRvIFVOVVNFRCAqLwotCQkJCS8qIEZJTkQgbm9kZSBESUQgdW51c2VkICovCi0JCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX05PREUsCi0JCQkJCQkiJWQ6MDkwNSBGSU5EIG5vZGUgRElEIHVudXNlZCAiCi0JCQkJCQkiRGF0YTogeCVwIHgleCB4JXggeCV4XG4iLAotCQkJCQkJcGhiYS0+YnJkX25vLAotCQkJCQkJbmRscCwgbmRscC0+bmxwX0RJRCwKLQkJCQkJCW5kbHAtPm5scF9mbGFnLCBkYXRhMSk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKHBoYmEtPmhvc3QtPmhvc3RfbG9jayk7Ci0JCQkJcmV0dXJuIG5kbHA7Ci0JCQl9Ci0JCX0KLQl9Ci0KIAlzcGluX3VubG9ja19pcnEocGhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKIAogCS8qIEZJTkQgbm9kZSBkaWQgPGRpZD4gTk9UIEZPVU5EICovCi0JbHBmY19wcmludGZfbG9nKHBoYmEsCi0JCQlLRVJOX0lORk8sCi0JCQlMT0dfTk9ERSwKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTk9ERSwKIAkJCSIlZDowOTMyIEZJTkQgbm9kZSBkaWQgeCV4IE5PVCBGT1VORCBEYXRhOiB4JXhcbiIsCiAJCQlwaGJhLT5icmRfbm8sIGRpZCwgb3JkZXIpOwotCi0JLyogbm8gbWF0Y2ggZm91bmQgKi8KIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjAzNiw3ICsxOTA1LDcgQEAKIAkJCWlmIChyYyA9PSBNQlhfTk9UX0ZJTklTSEVEKSB7CiAJCQkJbWVtcG9vbF9mcmVlKCBtYm94LCBwaGJhLT5tYm94X21lbV9wb29sKTsKIAkJCQlscGZjX2Rpc2NfZmx1c2hfbGlzdChwaGJhKTsKLQkJCQlwc2xpLT5yaW5nWyhwc2xpLT5pcF9yaW5nKV0uZmxhZyAmPQorCQkJCXBzbGktPnJpbmdbKHBzbGktPmV4dHJhX3JpbmcpXS5mbGFnICY9CiAJCQkJCX5MUEZDX1NUT1BfSU9DQl9FVkVOVDsKIAkJCQlwc2xpLT5yaW5nWyhwc2xpLT5mY3BfcmluZyldLmZsYWcgJj0KIAkJCQkJfkxQRkNfU1RPUF9JT0NCX0VWRU5UOwpAQCAtMjQxNSw3ICsyMjg0LDcgQEAKIAogCWlmIChjbHJsYWVycikgewogCQlscGZjX2Rpc2NfZmx1c2hfbGlzdChwaGJhKTsKLQkJcHNsaS0+cmluZ1socHNsaS0+aXBfcmluZyldLmZsYWcgJj0gfkxQRkNfU1RPUF9JT0NCX0VWRU5UOworCQlwc2xpLT5yaW5nWyhwc2xpLT5leHRyYV9yaW5nKV0uZmxhZyAmPSB+TFBGQ19TVE9QX0lPQ0JfRVZFTlQ7CiAJCXBzbGktPnJpbmdbKHBzbGktPmZjcF9yaW5nKV0uZmxhZyAmPSB+TFBGQ19TVE9QX0lPQ0JfRVZFTlQ7CiAJCXBzbGktPnJpbmdbKHBzbGktPm5leHRfcmluZyldLmZsYWcgJj0gfkxQRkNfU1RPUF9JT0NCX0VWRU5UOwogCQlwaGJhLT5oYmFfc3RhdGUgPSBMUEZDX0hCQV9SRUFEWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaAppbmRleCBlZWRmOTg4Li5mNzljYjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCkBAIC00MiwxNCArNDIsMTQgQEAKICNkZWZpbmUgRkNFTFNTSVpFICAgICAgICAgICAgIDEwMjQJLyogbWF4aW11bSBFTFMgdHJhbnNmZXIgc2l6ZSAqLwogCiAjZGVmaW5lIExQRkNfRkNQX1JJTkcgICAgICAgICAgICAwCS8qIHJpbmcgMCBmb3IgRkNQIGluaXRpYXRvciBjb21tYW5kcyAqLwotI2RlZmluZSBMUEZDX0lQX1JJTkcgICAgICAgICAgICAgMQkvKiByaW5nIDEgZm9yIElQIGNvbW1hbmRzICovCisjZGVmaW5lIExQRkNfRVhUUkFfUklORyAgICAgICAgICAxCS8qIHJpbmcgMSBmb3Igb3RoZXIgcHJvdG9jb2xzICovCiAjZGVmaW5lIExQRkNfRUxTX1JJTkcgICAgICAgICAgICAyCS8qIHJpbmcgMiBmb3IgRUxTIGNvbW1hbmRzICovCiAjZGVmaW5lIExQRkNfRkNQX05FWFRfUklORyAgICAgICAzCiAKICNkZWZpbmUgU0xJMl9JT0NCX0NNRF9SMF9FTlRSSUVTICAgIDE3MgkvKiBTTEktMiBGQ1AgY29tbWFuZCByaW5nIGVudHJpZXMgKi8KICNkZWZpbmUgU0xJMl9JT0NCX1JTUF9SMF9FTlRSSUVTICAgIDEzNAkvKiBTTEktMiBGQ1AgcmVzcG9uc2UgcmluZyBlbnRyaWVzICovCi0jZGVmaW5lIFNMSTJfSU9DQl9DTURfUjFfRU5UUklFUyAgICAgIDQJLyogU0xJLTIgSVAgY29tbWFuZCByaW5nIGVudHJpZXMgKi8KLSNkZWZpbmUgU0xJMl9JT0NCX1JTUF9SMV9FTlRSSUVTICAgICAgNAkvKiBTTEktMiBJUCByZXNwb25zZSByaW5nIGVudHJpZXMgKi8KKyNkZWZpbmUgU0xJMl9JT0NCX0NNRF9SMV9FTlRSSUVTICAgICAgNAkvKiBTTEktMiBleHRyYSBjb21tYW5kIHJpbmcgZW50cmllcyAqLworI2RlZmluZSBTTEkyX0lPQ0JfUlNQX1IxX0VOVFJJRVMgICAgICA0CS8qIFNMSS0yIGV4dHJhIHJlc3BvbnNlIHJpbmcgZW50cmllcyAqLwogI2RlZmluZSBTTEkyX0lPQ0JfQ01EX1IxWFRSQV9FTlRSSUVTIDM2CS8qIFNMSS0yIGV4dHJhIEZDUCBjbWQgcmluZyBlbnRyaWVzICovCiAjZGVmaW5lIFNMSTJfSU9DQl9SU1BfUjFYVFJBX0VOVFJJRVMgNTIJLyogU0xJLTIgZXh0cmEgRkNQIHJzcCByaW5nIGVudHJpZXMgKi8KICNkZWZpbmUgU0xJMl9JT0NCX0NNRF9SMl9FTlRSSUVTICAgICAyMAkvKiBTTEktMiBFTFMgY29tbWFuZCByaW5nIGVudHJpZXMgKi8KQEAgLTEyMSw2ICsxMjEsMjAgQEAKIAogCQkJdWludDMyX3QgcnN2ZFs3XTsKIAkJfSByZnQ7CisJCXN0cnVjdCByZmYgeworCQkJdWludDMyX3QgUG9ydElkOworCQkJdWludDhfdCByZXNlcnZlZFsyXTsKKyNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKwkJCXVpbnQ4X3QgZmVhdHVyZV9yZXM6NjsKKwkJCXVpbnQ4X3QgZmVhdHVyZV9pbml0OjE7CisJCQl1aW50OF90IGZlYXR1cmVfdGd0OjE7CisjZWxzZSAgLyogIF9fTElUVExFX0VORElBTl9CSVRGSUVMRCAqLworCQkJdWludDhfdCBmZWF0dXJlX3RndDoxOworCQkJdWludDhfdCBmZWF0dXJlX2luaXQ6MTsKKwkJCXVpbnQ4X3QgZmVhdHVyZV9yZXM6NjsKKyNlbmRpZgorCQkJdWludDhfdCB0eXBlX2NvZGU7ICAgICAvKiB0eXBlPTggZm9yIEZDUCAqLworCQl9IHJmZjsKIAkJc3RydWN0IHJubiB7CiAJCQl1aW50MzJfdCBQb3J0SWQ7CS8qIEZvciBSTk5fSUQgcmVxdWVzdHMgKi8KIAkJCXVpbnQ4X3Qgd3dubls4XTsKQEAgLTEzNiw2ICsxNTAsNyBAQAogI2RlZmluZSAgU0xJX0NUX1JFVklTSU9OICAgICAgICAxCiAjZGVmaW5lICBHSURfUkVRVUVTVF9TWiAgICAgICAgIChzaXplb2Yoc3RydWN0IGxwZmNfc2xpX2N0X3JlcXVlc3QpIC0gMjYwKQogI2RlZmluZSAgUkZUX1JFUVVFU1RfU1ogICAgICAgICAoc2l6ZW9mKHN0cnVjdCBscGZjX3NsaV9jdF9yZXF1ZXN0KSAtIDIyOCkKKyNkZWZpbmUgIFJGRl9SRVFVRVNUX1NaICAgICAgICAgKHNpemVvZihzdHJ1Y3QgbHBmY19zbGlfY3RfcmVxdWVzdCkgLSAyMzUpCiAjZGVmaW5lICBSTk5fUkVRVUVTVF9TWiAgICAgICAgIChzaXplb2Yoc3RydWN0IGxwZmNfc2xpX2N0X3JlcXVlc3QpIC0gMjUyKQogI2RlZmluZSAgUlNOTl9SRVFVRVNUX1NaICAgICAgICAoc2l6ZW9mKHN0cnVjdCBscGZjX3NsaV9jdF9yZXF1ZXN0KSkKIApAQCAtMjI1LDYgKzI0MCw3IEBACiAjZGVmaW5lICBTTElfQ1ROU19STk5fSUQgICAgICAweDAyMTMKICNkZWZpbmUgIFNMSV9DVE5TX1JDU19JRCAgICAgIDB4MDIxNAogI2RlZmluZSAgU0xJX0NUTlNfUkZUX0lEICAgICAgMHgwMjE3CisjZGVmaW5lICBTTElfQ1ROU19SRkZfSUQgICAgICAweDAyMUYKICNkZWZpbmUgIFNMSV9DVE5TX1JTUE5fSUQgICAgIDB4MDIxOAogI2RlZmluZSAgU0xJX0NUTlNfUlBUX0lEICAgICAgMHgwMjFBCiAjZGVmaW5lICBTTElfQ1ROU19SSVBfTk4gICAgICAweDAyMzUKQEAgLTEwODksMTIgKzExMDUsNiBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1pFUEhZUl9TQ1NQICAgMHhmZTExCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfWkVQSFlSX0RDU1AgICAweGZlMTIKIAotI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lEX0xQMTEwMDBTICAgICAgMHhmYzExCi0jZGVmaW5lIFBDSV9TVUJTWVNURU1fSURfTFAxMTAwMlMgICAgICAweGZjMTIKLSNkZWZpbmUgUENJX1NVQlNZU1RFTV9JRF9MUEUxMTAwMFMgICAgIDB4ZmMyMQotI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lEX0xQRTExMDAyUyAgICAgMHhmYzIyCi0jZGVmaW5lIFBDSV9TVUJTWVNURU1fSURfTFBFMTEwMTBTICAgICAweGZjMkEKLQogI2RlZmluZSBKRURFQ19JRF9BRERSRVNTICAgICAgICAgICAgMHgwMDgwMDAxYwogI2RlZmluZSBGSVJFRkxZX0pFREVDX0lEICAgICAgICAgICAgMHgxQUNDCiAjZGVmaW5lIFNVUEVSRkxZX0pFREVDX0lEICAgICAgICAgICAweDAwMjAKQEAgLTEyODQsNiArMTI5NCwxMCBAQAogI2RlZmluZSBDTURfRkNQX0lSRUFEX0NYICAgICAgICAweDFCCiAjZGVmaW5lIENNRF9GQ1BfSUNNTkRfQ1IgICAgICAgIDB4MUMKICNkZWZpbmUgQ01EX0ZDUF9JQ01ORF9DWCAgICAgICAgMHgxRAorI2RlZmluZSBDTURfRkNQX1RTRU5EX0NYICAgICAgICAweDFGCisjZGVmaW5lIENNRF9GQ1BfVFJFQ0VJVkVfQ1ggICAgIDB4MjEKKyNkZWZpbmUgQ01EX0ZDUF9UUlNQX0NYCSAgICAgICAgMHgyMworI2RlZmluZSBDTURfRkNQX0FVVE9fVFJTUF9DWCAgICAweDI5CiAKICNkZWZpbmUgQ01EX0FEQVBURVJfTVNHICAgICAgICAgMHgyMAogI2RlZmluZSBDTURfQURBUFRFUl9EVU1QICAgICAgICAweDIyCkBAIC0xMzEwLDYgKzEzMjQsOSBAQAogI2RlZmluZSBDTURfRkNQX0lSRUFENjRfQ1ggICAgICAweDlCCiAjZGVmaW5lIENNRF9GQ1BfSUNNTkQ2NF9DUiAgICAgIDB4OUMKICNkZWZpbmUgQ01EX0ZDUF9JQ01ORDY0X0NYICAgICAgMHg5RAorI2RlZmluZSBDTURfRkNQX1RTRU5ENjRfQ1ggICAgICAweDlGCisjZGVmaW5lIENNRF9GQ1BfVFJFQ0VJVkU2NF9DWCAgIDB4QTEKKyNkZWZpbmUgQ01EX0ZDUF9UUlNQNjRfQ1ggICAgICAgMHhBMwogCiAjZGVmaW5lIENNRF9HRU5fUkVRVUVTVDY0X0NSICAgIDB4QzIKICNkZWZpbmUgQ01EX0dFTl9SRVFVRVNUNjRfQ1ggICAgMHhDMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwppbmRleCBhNTcyM2FkLi5hZmNhNDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwpAQCAtMjY4LDYgKzI2OCw4IEBACiAJa2ZyZWUobXApOwogCXBtYi0+Y29udGV4dDEgPSBOVUxMOwogCisJaWYgKHBoYmEtPmNmZ19zb2Z0X3d3bm4pCisJCXU2NF90b193d24ocGhiYS0+Y2ZnX3NvZnRfd3dubiwgcGhiYS0+ZmNfc3BhcmFtLm5vZGVOYW1lLnUud3duKTsKIAlpZiAocGhiYS0+Y2ZnX3NvZnRfd3dwbikKIAkJdTY0X3RvX3d3bihwaGJhLT5jZmdfc29mdF93d3BuLCBwaGJhLT5mY19zcGFyYW0ucG9ydE5hbWUudS53d24pOwogCW1lbWNweSgmcGhiYS0+ZmNfbm9kZW5hbWUsICZwaGJhLT5mY19zcGFyYW0ubm9kZU5hbWUsCkBAIC0zNDksOCArMzUxLDggQEAKIAlwaGJhLT5oYmFfc3RhdGUgPSBMUEZDX0xJTktfRE9XTjsKIAogCS8qIE9ubHkgcHJvY2VzcyBJT0NCcyBvbiByaW5nIDAgdGlsbCBoYmFfc3RhdGUgaXMgUkVBRFkgKi8KLQlpZiAocHNsaS0+cmluZ1twc2xpLT5pcF9yaW5nXS5jbWRyaW5nYWRkcikKLQkJcHNsaS0+cmluZ1twc2xpLT5pcF9yaW5nXS5mbGFnIHw9IExQRkNfU1RPUF9JT0NCX0VWRU5UOworCWlmIChwc2xpLT5yaW5nW3BzbGktPmV4dHJhX3JpbmddLmNtZHJpbmdhZGRyKQorCQlwc2xpLT5yaW5nW3BzbGktPmV4dHJhX3JpbmddLmZsYWcgfD0gTFBGQ19TVE9QX0lPQ0JfRVZFTlQ7CiAJaWYgKHBzbGktPnJpbmdbcHNsaS0+ZmNwX3JpbmddLmNtZHJpbmdhZGRyKQogCQlwc2xpLT5yaW5nW3BzbGktPmZjcF9yaW5nXS5mbGFnIHw9IExQRkNfU1RPUF9JT0NCX0VWRU5UOwogCWlmIChwc2xpLT5yaW5nW3BzbGktPm5leHRfcmluZ10uY21kcmluZ2FkZHIpCkBAIC01MTcsNyArNTE5LDggQEAKIAlzdHJ1Y3QgbHBmY19zbGlfcmluZyAgKnByaW5nOwogCXVpbnQzMl90IGV2ZW50X2RhdGE7CiAKLQlpZiAocGhiYS0+d29ya19ocyAmIEhTX0ZGRVI2KSB7CisJaWYgKHBoYmEtPndvcmtfaHMgJiBIU19GRkVSNiB8fAorCSAgICBwaGJhLT53b3JrX2hzICYgSFNfRkZFUjUpIHsKIAkJLyogUmUtZXN0YWJsaXNoaW5nIExpbmsgKi8KIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0xJTktfRVZFTlQsCiAJCQkJIiVkOjEzMDEgUmUtZXN0YWJsaXNoaW5nIExpbmsgIgpAQCAtNjExLDcgKzYxNCw3IEBACiAJcG1iLT5tYm94X2NtcGwgPSBscGZjX21ieF9jbXBsX3JlYWRfbGE7CiAJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94IChwaGJhLCBwbWIsIChNQlhfTk9XQUlUIHwgTUJYX1NUT1BfSU9DQikpOwogCWlmIChyYyA9PSBNQlhfTk9UX0ZJTklTSEVEKQotCQlnb3RvIGxwZmNfaGFuZGxlX2xhdHRfZnJlZV9tcDsKKwkJZ290byBscGZjX2hhbmRsZV9sYXR0X2ZyZWVfbWJ1ZjsKIAogCS8qIENsZWFyIExpbmsgQXR0ZW50aW9uIGluIEhBIFJFRyAqLwogCXNwaW5fbG9ja19pcnEocGhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKQEAgLTYyMSw2ICs2MjQsOCBAQAogCiAJcmV0dXJuOwogCitscGZjX2hhbmRsZV9sYXR0X2ZyZWVfbWJ1ZjoKKwlscGZjX21idWZfZnJlZShwaGJhLCBtcC0+dmlydCwgbXAtPnBoeXMpOwogbHBmY19oYW5kbGVfbGF0dF9mcmVlX21wOgogCWtmcmVlKG1wKTsKIGxwZmNfaGFuZGxlX2xhdHRfZnJlZV9wbWI6CkBAIC04MDIsMTkgKzgwNywxMyBAQAogewogCWxwZmNfdnBkX3QgKnZwOwogCXVpbnQxNl90IGRldl9pZCA9IHBoYmEtPnBjaWRldi0+ZGV2aWNlOwotCXVpbnQxNl90IGRldl9zdWJpZCA9IHBoYmEtPnBjaWRldi0+c3Vic3lzdGVtX2RldmljZTsKLQl1aW50OF90IGhkcnR5cGU7CiAJaW50IG1heF9zcGVlZDsKLQljaGFyICogcG9ydHM7CiAJc3RydWN0IHsKIAkJY2hhciAqIG5hbWU7CiAJCWludCAgICBtYXhfc3BlZWQ7Ci0JCWNoYXIgKiBwb3J0czsKIAkJY2hhciAqIGJ1czsKLQl9IG0gPSB7IjxVbmtub3duPiIsIDAsICIiLCAiIn07CisJfSBtID0geyI8VW5rbm93bj4iLCAwLCAiIn07CiAKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwaGJhLT5wY2lkZXYsIFBDSV9IRUFERVJfVFlQRSwgJmhkcnR5cGUpOwotCXBvcnRzID0gKGhkcnR5cGUgPT0gMHg4MCkgPyAiMi1wb3J0ICIgOiAiIjsKIAlpZiAobWRwICYmIG1kcFswXSAhPSAnXDAnCiAJCSYmIGRlc2NwICYmIGRlc2NwWzBdICE9ICdcMCcpCiAJCXJldHVybjsKQEAgLTgzNCwxMzAgKzgzMyw5MyBAQAogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfRklSRUZMWToKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDYwMDAiLCBtYXhfc3BlZWQsICIiLCAiUENJIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFA2MDAwIiwgbWF4X3NwZWVkLCAiUENJIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9TVVBFUkZMWToKIAkJaWYgKHZwLT5yZXYuYml1UmV2ID49IDEgJiYgdnAtPnJldi5iaXVSZXYgPD0gMykKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFA3MDAwIiwgbWF4X3NwZWVkLCAiIiwgIlBDSSJ9OworCQkJbSA9ICh0eXBlb2YobSkpeyJMUDcwMDAiLCBtYXhfc3BlZWQsICAiUENJIn07CiAJCWVsc2UKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFA3MDAwRSIsIG1heF9zcGVlZCwgIiIsICJQQ0kifTsKKwkJCW0gPSAodHlwZW9mKG0pKXsiTFA3MDAwRSIsIG1heF9zcGVlZCwgIlBDSSJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfRFJBR09ORkxZOgotCQltID0gKHR5cGVvZihtKSl7IkxQODAwMCIsIG1heF9zcGVlZCwgIiIsICJQQ0kifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDgwMDAiLCBtYXhfc3BlZWQsICJQQ0kifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0NFTlRBVVI6CiAJCWlmIChGQ19KRURFQ19JRCh2cC0+cmV2LmJpdVJldikgPT0gQ0VOVEFVUl8yR19KRURFQ19JRCkKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFA5MDAyIiwgbWF4X3NwZWVkLCAiIiwgIlBDSSJ9OworCQkJbSA9ICh0eXBlb2YobSkpeyJMUDkwMDIiLCBtYXhfc3BlZWQsICJQQ0kifTsKIAkJZWxzZQotCQkJbSA9ICh0eXBlb2YobSkpeyJMUDkwMDAiLCBtYXhfc3BlZWQsICIiLCAiUENJIn07CisJCQltID0gKHR5cGVvZihtKSl7IkxQOTAwMCIsIG1heF9zcGVlZCwgIlBDSSJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfUkZMWToKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDk1MiIsIG1heF9zcGVlZCwgIiIsICJQQ0kifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDk1MiIsIG1heF9zcGVlZCwgIlBDSSJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfUEVHQVNVUzoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDk4MDIiLCBtYXhfc3BlZWQsICIiLCAiUENJLVgifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDk4MDIiLCBtYXhfc3BlZWQsICJQQ0ktWCJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfVEhPUjoKLQkJaWYgKGhkcnR5cGUgPT0gMHg4MCkKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFAxMDAwMERDIiwKLQkJCQkJbWF4X3NwZWVkLCBwb3J0cywgIlBDSS1YIn07Ci0JCWVsc2UKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFAxMDAwMCIsCi0JCQkJCW1heF9zcGVlZCwgcG9ydHMsICJQQ0ktWCJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQMTAwMDAiLCBtYXhfc3BlZWQsICJQQ0ktWCJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfVklQRVI6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFBYMTAwMCIsIG1heF9zcGVlZCwgIiIsICJQQ0ktWCJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQWDEwMDAiLCBtYXhfc3BlZWQsICAiUENJLVgifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1BGTFk6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFA5ODIiLCBtYXhfc3BlZWQsICIiLCAiUENJLVgifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDk4MiIsIG1heF9zcGVlZCwgIlBDSS1YIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9URkxZOgotCQlpZiAoaGRydHlwZSA9PSAweDgwKQotCQkJbSA9ICh0eXBlb2YobSkpeyJMUDEwNTBEQyIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0ktWCJ9OwotCQllbHNlCi0JCQltID0gKHR5cGVvZihtKSl7IkxQMTA1MCIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0ktWCJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQMTA1MCIsIG1heF9zcGVlZCwgIlBDSS1YIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9IRUxJT1M6Ci0JCWlmIChoZHJ0eXBlID09IDB4ODApCi0JCQltID0gKHR5cGVvZihtKSl7IkxQMTEwMDIiLCBtYXhfc3BlZWQsIHBvcnRzLCAiUENJLVgyIn07Ci0JCWVsc2UKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFAxMTAwMCIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0ktWDIifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDExMDAwIiwgbWF4X3NwZWVkLCAiUENJLVgyIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9IRUxJT1NfU0NTUDoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDExMDAwLVNQIiwgbWF4X3NwZWVkLCBwb3J0cywgIlBDSS1YMiJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQMTEwMDAtU1AiLCBtYXhfc3BlZWQsICJQQ0ktWDIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0hFTElPU19EQ1NQOgotCQltID0gKHR5cGVvZihtKSl7IkxQMTEwMDItU1AiLCBtYXhfc3BlZWQsIHBvcnRzLCAiUENJLVgyIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFAxMTAwMi1TUCIsIG1heF9zcGVlZCwgIlBDSS1YMiJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTkVQVFVORToKLQkJaWYgKGhkcnR5cGUgPT0gMHg4MCkKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTAwMiIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0llIn07Ci0JCWVsc2UKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTAwMCIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0llIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTAwMCIsIG1heF9zcGVlZCwgIlBDSWUifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX05FUFRVTkVfU0NTUDoKLQkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMDAwLVNQIiwgbWF4X3NwZWVkLCBwb3J0cywgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMDAwLVNQIiwgbWF4X3NwZWVkLCAiUENJZSJ9OwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfTkVQVFVORV9EQ1NQOgotCQltID0gKHR5cGVvZihtKSl7IkxQZTEwMDItU1AiLCBtYXhfc3BlZWQsIHBvcnRzLCAiUENJZSJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQZTEwMDItU1AiLCBtYXhfc3BlZWQsICJQQ0llIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9CTUlEOgotCQltID0gKHR5cGVvZihtKSl7IkxQMTE1MCIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0ktWDIifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDExNTAiLCBtYXhfc3BlZWQsICJQQ0ktWDIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0JTTUI6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFAxMTEiLCBtYXhfc3BlZWQsIHBvcnRzLCAiUENJLVgyIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFAxMTEiLCBtYXhfc3BlZWQsICJQQ0ktWDIifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1pFUEhZUjoKLQkJaWYgKGhkcnR5cGUgPT0gMHg4MCkKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTEwMDIiLCBtYXhfc3BlZWQsIHBvcnRzLCAiUENJZSJ9OwotCQllbHNlCi0JCQltID0gKHR5cGVvZihtKSl7IkxQZTExMDAwIiwgbWF4X3NwZWVkLCBwb3J0cywgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMTAwMCIsIG1heF9zcGVlZCwgIlBDSWUifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1pFUEhZUl9TQ1NQOgotCQltID0gKHR5cGVvZihtKSl7IkxQZTExMDAwIiwgbWF4X3NwZWVkLCBwb3J0cywgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMTAwMCIsIG1heF9zcGVlZCwgIlBDSWUifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1pFUEhZUl9EQ1NQOgotCQltID0gKHR5cGVvZihtKSl7IkxQZTExMDAyLVNQIiwgbWF4X3NwZWVkLCBwb3J0cywgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMTAwMi1TUCIsIG1heF9zcGVlZCwgIlBDSWUifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1pNSUQ6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFBlMTE1MCIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0llIn07CisJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTE1MCIsIG1heF9zcGVlZCwgIlBDSWUifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1pTTUI6Ci0JCW0gPSAodHlwZW9mKG0pKXsiTFBlMTExIiwgbWF4X3NwZWVkLCBwb3J0cywgIlBDSWUifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUGUxMTEiLCBtYXhfc3BlZWQsICJQQ0llIn07CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9MUDEwMToKLQkJbSA9ICh0eXBlb2YobSkpeyJMUDEwMSIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0ktWCJ9OworCQltID0gKHR5cGVvZihtKSl7IkxQMTAxIiwgbWF4X3NwZWVkLCAiUENJLVgifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xQMTAwMDBTOgotCQltID0gKHR5cGVvZihtKSl7IkxQMTAwMDAtUyIsIG1heF9zcGVlZCwgcG9ydHMsICJQQ0kifTsKKwkJbSA9ICh0eXBlb2YobSkpeyJMUDEwMDAwLVMiLCBtYXhfc3BlZWQsICJQQ0kifTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xQMTEwMDBTOgorCQltID0gKHR5cGVvZihtKSl7IkxQMTEwMDAtUyIsIG1heF9zcGVlZCwKKwkJCSJQQ0ktWDIifTsKKwkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX0xQRTExMDAwUzoKLQkJc3dpdGNoIChkZXZfc3ViaWQpIHsKLQkJY2FzZSBQQ0lfU1VCU1lTVEVNX0lEX0xQMTEwMDBTOgotCQkJbSA9ICh0eXBlb2YobSkpeyJMUDExMDAwLVMiLCBtYXhfc3BlZWQsCi0JCQkJCXBvcnRzLCAiUENJLVgyIn07Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfU1VCU1lTVEVNX0lEX0xQMTEwMDJTOgotCQkJbSA9ICh0eXBlb2YobSkpeyJMUDExMDAyLVMiLCBtYXhfc3BlZWQsCi0JCQkJCXBvcnRzLCAiUENJLVgyIn07Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfU1VCU1lTVEVNX0lEX0xQRTExMDAwUzoKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTEwMDAtUyIsIG1heF9zcGVlZCwKLQkJCQkJcG9ydHMsICJQQ0llIn07Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfU1VCU1lTVEVNX0lEX0xQRTExMDAyUzoKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTEwMDItUyIsIG1heF9zcGVlZCwKLQkJCQkJcG9ydHMsICJQQ0llIn07Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfU1VCU1lTVEVNX0lEX0xQRTExMDEwUzoKLQkJCW0gPSAodHlwZW9mKG0pKXsiTFBlMTEwMTAtUyIsIG1heF9zcGVlZCwKLQkJCQkJIjEwLXBvcnQgIiwgIlBDSWUifTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbSA9ICh0eXBlb2YobSkpeyBOVUxMIH07Ci0JCQlicmVhazsKLQkJfQorCQltID0gKHR5cGVvZihtKSl7IkxQZTExMDAwLVMiLCBtYXhfc3BlZWQsCisJCQkiUENJZSJ9OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQltID0gKHR5cGVvZihtKSl7IE5VTEwgfTsKQEAgLTk2OCw4ICs5MzAsOCBAQAogCQlzbnByaW50ZihtZHAsIDc5LCIlcyIsIG0ubmFtZSk7CiAJaWYgKGRlc2NwICYmIGRlc2NwWzBdID09ICdcMCcpCiAJCXNucHJpbnRmKGRlc2NwLCAyNTUsCi0JCQkgIkVtdWxleCAlcyAlZEdiICVzJXMgRmlicmUgQ2hhbm5lbCBBZGFwdGVyIiwKLQkJCSBtLm5hbWUsIG0ubWF4X3NwZWVkLCBtLnBvcnRzLCBtLmJ1cyk7CisJCQkgIkVtdWxleCAlcyAlZEdiICVzIEZpYnJlIENoYW5uZWwgQWRhcHRlciIsCisJCQkgbS5uYW1lLCBtLm1heF9zcGVlZCwgbS5idXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjUxLDYgKzE2MTMsMTQgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3JlbW92ZV9ob3N0OwogCisJaWYgKHBoYmEtPmNmZ191c2VfbXNpKSB7CisJCWVycm9yID0gcGNpX2VuYWJsZV9tc2kocGhiYS0+cGNpZGV2KTsKKwkJaWYgKGVycm9yKQorCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0lOSVQsICIlZDowNDUyICIKKwkJCQkJIkVuYWJsZSBNU0kgZmFpbGVkLCBjb250aW51aW5nIHdpdGggIgorCQkJCQkiSVJRXG4iLCBwaGJhLT5icmRfbm8pOworCX0KKwogCWVycm9yID0JcmVxdWVzdF9pcnEocGhiYS0+cGNpZGV2LT5pcnEsIGxwZmNfaW50cl9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJCQkJCQlMUEZDX0RSSVZFUl9OQU1FLCBwaGJhKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTE3MzAsNiArMTcwMCw3IEBACiAJbHBmY19zdG9wX3RpbWVyKHBoYmEpOwogCXBoYmEtPndvcmtfaGJhX2V2ZW50cyA9IDA7CiAJZnJlZV9pcnEocGhiYS0+cGNpZGV2LT5pcnEsIHBoYmEpOworCXBjaV9kaXNhYmxlX21zaShwaGJhLT5wY2lkZXYpOwogb3V0X2ZyZWVfc3lzZnNfYXR0cjoKIAlscGZjX2ZyZWVfc3lzZnNfYXR0cihwaGJhKTsKIG91dF9yZW1vdmVfaG9zdDoKQEAgLTE3OTYsNiArMTc2Nyw3IEBACiAKIAkvKiBSZWxlYXNlIHRoZSBpcnEgcmVzZXJ2YXRpb24gKi8KIAlmcmVlX2lycShwaGJhLT5wY2lkZXYtPmlycSwgcGhiYSk7CisJcGNpX2Rpc2FibGVfbXNpKHBoYmEtPnBjaWRldik7CiAKIAlscGZjX2NsZWFudXAocGhiYSwgMCk7CiAJbHBmY19zdG9wX3RpbWVyKHBoYmEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19sb2dtc2cuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbG9nbXNnLmgKaW5kZXggNjJjOGNhOC4uNDM4Y2JjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19sb2dtc2cuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2xvZ21zZy5oCkBAIC0yOCw3ICsyOCw3IEBACiAjZGVmaW5lIExPR19OT0RFICAgICAgICAgICAgICAgICAgICAgIDB4ODAJLyogTm9kZSB0YWJsZSBldmVudHMgKi8KICNkZWZpbmUgTE9HX01JU0MgICAgICAgICAgICAgICAgICAgICAgMHg0MDAJLyogTWlzY2VsbGFuZW91cyBldmVudHMgKi8KICNkZWZpbmUgTE9HX1NMSSAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAJLyogU0xJIGV2ZW50cyAqLwotI2RlZmluZSBMT0dfQ0hLX0NPTkQgICAgICAgICAgICAgICAgICAweDEwMDAJLyogRkNQIENoZWNrIGNvbmRpdGlvbiBmbGFnICovCisjZGVmaW5lIExPR19GQ1BfRVJST1IgICAgICAgICAgICAgICAgIDB4MTAwMAkvKiBsb2cgZXJyb3JzLCBub3QgdW5kZXJydW5zICovCiAjZGVmaW5lIExPR19MSUJERkMgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBMaWJkZmMgZXZlbnRzICovCiAjZGVmaW5lIExPR19BTExfTVNHICAgICAgICAgICAgICAgICAgIDB4ZmZmZgkvKiBMT0cgYWxsIG1lc3NhZ2VzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX25wb3J0ZGlzYy5jCmluZGV4IGQ1ZjQxNTAuLjBjN2U3MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbnBvcnRkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ucG9ydGRpc2MuYwpAQCAtNzM5LDcgKzczOSw3IEBACiAJCQkgICAgdWludDMyX3QgZXZ0KQogewogCXN0cnVjdCBscGZjX2lvY2JxICpjbWRpb2NiLCAqcnNwaW9jYjsKLQlzdHJ1Y3QgbHBmY19kbWFidWYgKnBjbWQsICpwcnNwOworCXN0cnVjdCBscGZjX2RtYWJ1ZiAqcGNtZCwgKnByc3AsICptcDsKIAl1aW50MzJfdCAqbHA7CiAJSU9DQl90ICppcnNwOwogCXN0cnVjdCBzZXJ2X3Bhcm0gKnNwOwpAQCAtODI5LDYgKzgyOSw5IEBACiAJCQkJICAgICAgTkxQX1JFR0xPR0lOX0xJU1QpOwogCQkJcmV0dXJuIG5kbHAtPm5scF9zdGF0ZTsKIAkJfQorCQltcCA9IChzdHJ1Y3QgbHBmY19kbWFidWYgKiltYm94LT5jb250ZXh0MTsKKwkJbHBmY19tYnVmX2ZyZWUocGhiYSwgbXAtPnZpcnQsIG1wLT5waHlzKTsKKwkJa2ZyZWUobXApOwogCQltZW1wb29sX2ZyZWUobWJveCwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CiAJfSBlbHNlIHsKIAkJbWVtcG9vbF9mcmVlKG1ib3gsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwpAQCAtMTYyMCw4ICsxNjIzLDggQEAKIAkgKiBvciBkaXNjb3ZlcnkgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgbm9kZS4gU3RhcnRpbmcgZGlzY292ZXJ5CiAJICogaGVyZSB3aWxsIGFmZmVjdCB0aGUgY291bnRpbmcgb2YgZGlzY292ZXJ5IHRocmVhZHMuCiAJICovCi0JaWYgKCghKG5kbHAtPm5scF9mbGFnICYgTkxQX0RFTEFZX1RNTykpICYmCi0JCShuZGxwLT5ubHBfZmxhZyAmIE5MUF9OUFJfMkJfRElTQykpeworCWlmICghKG5kbHAtPm5scF9mbGFnICYgTkxQX0RFTEFZX1RNTykgJiYKKwkJIShuZGxwLT5ubHBfZmxhZyAmIE5MUF9OUFJfMkJfRElTQykpewogCQlpZiAobmRscC0+bmxwX2ZsYWcgJiBOTFBfTlBSX0FESVNDKSB7CiAJCQluZGxwLT5ubHBfcHJldl9zdGF0ZSA9IE5MUF9TVEVfTlBSX05PREU7CiAJCQluZGxwLT5ubHBfc3RhdGUgPSBOTFBfU1RFX0FESVNDX0lTU1VFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwppbmRleCA5N2FlOThkLi5jM2U2OGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwpAQCAtMjk3LDggKzI5NywxMCBAQAogCXVpbnQzMl90IGZjcGlfcGFybSA9IGxwZmNfY21kLT5jdXJfaW9jYnEuaW9jYi51bi5mY3BpLmZjcGlfcGFybTsKIAl1aW50MzJfdCByZXNwX2luZm8gPSBmY3Byc3AtPnJzcFN0YXR1czI7CiAJdWludDMyX3Qgc2NzaV9zdGF0dXMgPSBmY3Byc3AtPnJzcFN0YXR1czM7CisJdWludDMyX3QgKmxwOwogCXVpbnQzMl90IGhvc3Rfc3RhdHVzID0gRElEX09LOwogCXVpbnQzMl90IHJzcGxlbiA9IDA7CisJdWludDMyX3QgbG9naXQgPSBMT0dfRkNQIHwgTE9HX0ZDUF9FUlJPUjsKIAogCS8qCiAJICogIElmIHRoaXMgaXMgYSB0YXNrIG1hbmFnZW1lbnQgY29tbWFuZCwgdGhlcmUgaXMgbm8KQEAgLTMxMCwxMCArMzEyLDI1IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19GQ1AsCi0JCQkiJWQ6MDczMCBGQ1AgY29tbWFuZCBmYWlsZWQ6IFJTUCAiCi0JCQkiRGF0YTogeCV4IHgleCB4JXggeCV4IHgleCB4JXhcbiIsCi0JCQlwaGJhLT5icmRfbm8sIHJlc3BfaW5mbywgc2NzaV9zdGF0dXMsCisJaWYgKChyZXNwX2luZm8gJiBTTlNfTEVOX1ZBTElEKSAmJiBmY3Byc3AtPnJzcFNuc0xlbikgeworCQl1aW50MzJfdCBzbnNsZW4gPSBiZTMyX3RvX2NwdShmY3Byc3AtPnJzcFNuc0xlbik7CisJCWlmIChzbnNsZW4gPiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCisJCQlzbnNsZW4gPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisKKwkJaWYgKHJlc3BfaW5mbyAmIFJTUF9MRU5fVkFMSUQpCisJCSAgcnNwbGVuID0gYmUzMl90b19jcHUoZmNwcnNwLT5yc3BSc3BMZW4pOworCQltZW1jcHkoY21uZC0+c2Vuc2VfYnVmZmVyLCAmZmNwcnNwLT5yc3BJbmZvMCArIHJzcGxlbiwgc25zbGVuKTsKKwl9CisJbHAgPSAodWludDMyX3QgKiljbW5kLT5zZW5zZV9idWZmZXI7CisKKwlpZiAoIXNjc2lfc3RhdHVzICYmIChyZXNwX2luZm8gJiBSRVNJRF9VTkRFUikpCisJCWxvZ2l0ID0gTE9HX0ZDUDsKKworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIGxvZ2l0LAorCQkJIiVkOjA3MzAgRkNQIGNvbW1hbmQgeCV4IGZhaWxlZDogeCV4IFNOUyB4JXggeCV4ICIKKwkJCSJEYXRhOiB4JXggeCV4IHgleCB4JXggeCV4XG4iLAorCQkJcGhiYS0+YnJkX25vLCBjbW5kLT5jbW5kWzBdLCBzY3NpX3N0YXR1cywKKwkJCWJlMzJfdG9fY3B1KCpscCksIGJlMzJfdG9fY3B1KCoobHAgKyAzKSksIHJlc3BfaW5mbywKIAkJCWJlMzJfdG9fY3B1KGZjcHJzcC0+cnNwUmVzSWQpLAogCQkJYmUzMl90b19jcHUoZmNwcnNwLT5yc3BTbnNMZW4pLAogCQkJYmUzMl90b19jcHUoZmNwcnNwLT5yc3BSc3BMZW4pLApAQCAtMzI4LDE0ICszNDUsNiBAQAogCQl9CiAJfQogCi0JaWYgKChyZXNwX2luZm8gJiBTTlNfTEVOX1ZBTElEKSAmJiBmY3Byc3AtPnJzcFNuc0xlbikgewotCQl1aW50MzJfdCBzbnNsZW4gPSBiZTMyX3RvX2NwdShmY3Byc3AtPnJzcFNuc0xlbik7Ci0JCWlmIChzbnNsZW4gPiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCi0JCQlzbnNsZW4gPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7Ci0KLQkJbWVtY3B5KGNtbmQtPnNlbnNlX2J1ZmZlciwgJmZjcHJzcC0+cnNwSW5mbzAgKyByc3BsZW4sIHNuc2xlbik7Ci0JfQotCiAJY21uZC0+cmVzaWQgPSAwOwogCWlmIChyZXNwX2luZm8gJiBSRVNJRF9VTkRFUikgewogCQljbW5kLT5yZXNpZCA9IGJlMzJfdG9fY3B1KGZjcHJzcC0+cnNwUmVzSWQpOwpAQCAtMzc4LDcgKzM4Nyw3IEBACiAJICovCiAJfSBlbHNlIGlmICgoc2NzaV9zdGF0dXMgPT0gU0FNX1NUQVRfR09PRCkgJiYgZmNwaV9wYXJtICYmCiAJCQkoY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSkgewotCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRkNQLAorCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRkNQIHwgTE9HX0ZDUF9FUlJPUiwKIAkJCSIlZDowNzM0IEZDUCBSZWFkIENoZWNrIEVycm9yIERhdGE6ICIKIAkJCSJ4JXggeCV4IHgleCB4JXhcbiIsIHBoYmEtPmJyZF9ubywKIAkJCWJlMzJfdG9fY3B1KGZjcGNtZC0+ZmNwRGwpLApAQCAtNjcwLDYgKzY3OSw5IEBACiAJc3RydWN0IGxwZmNfaW9jYnEgKmlvY2JxcnNwOwogCWludCByZXQ7CiAKKwlpZiAoIXJkYXRhLT5wbm9kZSkKKwkJcmV0dXJuIEZBSUxFRDsKKwogCWxwZmNfY21kLT5yZGF0YSA9IHJkYXRhOwogCXJldCA9IGxwZmNfc2NzaV9wcmVwX3Rhc2tfbWdtdF9jbWQocGhiYSwgbHBmY19jbWQsIGx1biwKIAkJCQkJICAgRkNQX1RBUkdFVF9SRVNFVCk7CkBAIC05NzYsMjAgKzk4OCwzNCBAQAogCiAJbHBmY19ibG9ja19lcnJvcl9oYW5kbGVyKGNtbmQpOwogCXNwaW5fbG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CisJbG9vcGNudCA9IDA7CiAJLyoKIAkgKiBJZiB0YXJnZXQgaXMgbm90IGluIGEgTUFQUEVEIHN0YXRlLCBkZWxheSB0aGUgcmVzZXQgdW50aWwKIAkgKiB0YXJnZXQgaXMgcmVkaXNjb3ZlcmVkIG9yIGRldmxvc3MgdGltZW91dCBleHBpcmVzLgogCSAqLwogCXdoaWxlICggMSApIHsKIAkJaWYgKCFwbm9kZSkKLQkJCWJyZWFrOworCQkJcmV0dXJuIEZBSUxFRDsKIAogCQlpZiAocG5vZGUtPm5scF9zdGF0ZSAhPSBOTFBfU1RFX01BUFBFRF9OT0RFKSB7CiAJCQlzcGluX3VubG9ja19pcnEocGhiYS0+aG9zdC0+aG9zdF9sb2NrKTsKIAkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CiAJCQlzcGluX2xvY2tfaXJxKHBoYmEtPmhvc3QtPmhvc3RfbG9jayk7CisJCQlsb29wY250Kys7CisJCQlyZGF0YSA9IGNtbmQtPmRldmljZS0+aG9zdGRhdGE7CisJCQlpZiAoIXJkYXRhIHx8CisJCQkJKGxvb3BjbnQgPiAoKHBoYmEtPmNmZ19kZXZsb3NzX3RtbyAqIDIpICsgMSkpKSB7CisJCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfRkNQLAorCQkgICAJCQkiJWQ6MDcyMSBMVU4gUmVzZXQgcnBvcnQgZmFpbHVyZToiCisJCQkJCSIgY250IHgleCByZGF0YSB4JXBcbiIsCisJCSAgIAkJCXBoYmEtPmJyZF9ubywgbG9vcGNudCwgcmRhdGEpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcG5vZGUgPSByZGF0YS0+cG5vZGU7CisJCQlpZiAoIXBub2RlKQorCQkJCXJldHVybiBGQUlMRUQ7CiAJCX0KLQkJaWYgKChwbm9kZSkgJiYgKHBub2RlLT5ubHBfc3RhdGUgPT0gTkxQX1NURV9NQVBQRURfTk9ERSkpCisJCWlmIChwbm9kZS0+bmxwX3N0YXRlID09IE5MUF9TVEVfTUFQUEVEX05PREUpCiAJCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDI0YTE3NzkuLmE0MTI4ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtMTE3LDYgKzExNywxMCBAQAogCWNhc2UgQ01EX0ZDUF9JUkVBRF9DWDoKIAljYXNlIENNRF9GQ1BfSUNNTkRfQ1I6CiAJY2FzZSBDTURfRkNQX0lDTU5EX0NYOgorCWNhc2UgQ01EX0ZDUF9UU0VORF9DWDoKKwljYXNlIENNRF9GQ1BfVFJTUF9DWDoKKwljYXNlIENNRF9GQ1BfVFJFQ0VJVkVfQ1g6CisJY2FzZSBDTURfRkNQX0FVVE9fVFJTUF9DWDoKIAljYXNlIENNRF9BREFQVEVSX01TRzoKIAljYXNlIENNRF9BREFQVEVSX0RVTVA6CiAJY2FzZSBDTURfWE1JVF9TRVFVRU5DRTY0X0NSOgpAQCAtMTMxLDYgKzEzNSw5IEBACiAJY2FzZSBDTURfRkNQX0lSRUFENjRfQ1g6CiAJY2FzZSBDTURfRkNQX0lDTU5ENjRfQ1I6CiAJY2FzZSBDTURfRkNQX0lDTU5ENjRfQ1g6CisJY2FzZSBDTURfRkNQX1RTRU5ENjRfQ1g6CisJY2FzZSBDTURfRkNQX1RSU1A2NF9DWDoKKwljYXNlIENNRF9GQ1BfVFJFQ0VJVkU2NF9DWDoKIAljYXNlIENNRF9HRU5fUkVRVUVTVDY0X0NSOgogCWNhc2UgQ01EX0dFTl9SRVFVRVNUNjRfQ1g6CiAJY2FzZSBDTURfWE1JVF9FTFNfUlNQNjRfQ1g6CkBAIC0xMDk4LDYgKzExMDUsNyBAQAogCQlscGZjX3NsaV9wY2ltZW1fYmNvcHkoKHVpbnQzMl90ICopIGVudHJ5LAogCQkJCSAgICAgICh1aW50MzJfdCAqKSAmcnNwaW9jYnEuaW9jYiwKIAkJCQkgICAgICBzaXplb2YgKElPQ0JfdCkpOworCQlJTklUX0xJU1RfSEVBRCgmKHJzcGlvY2JxLmxpc3QpKTsKIAkJaXJzcCA9ICZyc3Bpb2NicS5pb2NiOwogCiAJCXR5cGUgPSBscGZjX3NsaV9pb2NiX2NtZF90eXBlKGlyc3AtPnVscENvbW1hbmQgJiBDTURfSU9DQl9NQVNLKTsKQEAgLTExNDksNiArMTE1NywxMSBAQAogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIExQRkNfVU5TT0xfSU9DQjoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocGhiYS0+aG9zdC0+aG9zdF9sb2NrLCBpZmxhZyk7CisJCQlscGZjX3NsaV9wcm9jZXNzX3Vuc29sX2lvY2IocGhiYSwgcHJpbmcsICZyc3Bpb2NicSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZShwaGJhLT5ob3N0LT5ob3N0X2xvY2ssIGlmbGFnKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYgKGlyc3AtPnVscENvbW1hbmQgPT0gQ01EX0FEQVBURVJfTVNHKSB7CiAJCQkJY2hhciBhZGFwdGVybXNnW0xQRkNfTUFYX0FEUFRNU0ddOwpAQCAtMjQ3MiwxMyArMjQ4NSwxNyBAQAogCXBzbGkgPSAmcGhiYS0+c2xpOwogCiAJLyogQWRqdXN0IGNtZC9yc3AgcmluZyBpb2NiIGVudHJpZXMgbW9yZSBldmVubHkgKi8KKworCS8qIFRha2Ugc29tZSBhd2F5IGZyb20gdGhlIEZDUCByaW5nICovCiAJcHJpbmcgPSAmcHNsaS0+cmluZ1twc2xpLT5mY3BfcmluZ107CiAJcHJpbmctPm51bUNpb2NiIC09IFNMSTJfSU9DQl9DTURfUjFYVFJBX0VOVFJJRVM7CiAJcHJpbmctPm51bVJpb2NiIC09IFNMSTJfSU9DQl9SU1BfUjFYVFJBX0VOVFJJRVM7CiAJcHJpbmctPm51bUNpb2NiIC09IFNMSTJfSU9DQl9DTURfUjNYVFJBX0VOVFJJRVM7CiAJcHJpbmctPm51bVJpb2NiIC09IFNMSTJfSU9DQl9SU1BfUjNYVFJBX0VOVFJJRVM7CiAKLQlwcmluZyA9ICZwc2xpLT5yaW5nWzFdOworCS8qIGFuZCBnaXZlIHRoZW0gdG8gdGhlIGV4dHJhIHJpbmcgKi8KKwlwcmluZyA9ICZwc2xpLT5yaW5nW3BzbGktPmV4dHJhX3JpbmddOworCiAJcHJpbmctPm51bUNpb2NiICs9IFNMSTJfSU9DQl9DTURfUjFYVFJBX0VOVFJJRVM7CiAJcHJpbmctPm51bVJpb2NiICs9IFNMSTJfSU9DQl9SU1BfUjFYVFJBX0VOVFJJRVM7CiAJcHJpbmctPm51bUNpb2NiICs9IFNMSTJfSU9DQl9DTURfUjNYVFJBX0VOVFJJRVM7CkBAIC0yNDg4LDggKzI1MDUsOCBAQAogCXByaW5nLT5pb3RhZ19tYXggPSA0MDk2OwogCXByaW5nLT5udW1fbWFzayA9IDE7CiAJcHJpbmctPnBydFswXS5wcm9maWxlID0gMDsgICAgICAvKiBNYXNrIDAgKi8KLQlwcmluZy0+cHJ0WzBdLnJjdGwgPSBGQ19VTlNPTF9EQVRBOwotCXByaW5nLT5wcnRbMF0udHlwZSA9IDU7CisJcHJpbmctPnBydFswXS5yY3RsID0gcGhiYS0+Y2ZnX211bHRpX3JpbmdfcmN0bDsKKwlwcmluZy0+cHJ0WzBdLnR5cGUgPSBwaGJhLT5jZmdfbXVsdGlfcmluZ190eXBlOwogCXByaW5nLT5wcnRbMF0ubHBmY19zbGlfcmN2X3Vuc29sX2V2ZW50ID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1MDUsNyArMjUyMiw3IEBACiAJcHNsaS0+c2xpX2ZsYWcgPSAwOwogCXBzbGktPmZjcF9yaW5nID0gTFBGQ19GQ1BfUklORzsKIAlwc2xpLT5uZXh0X3JpbmcgPSBMUEZDX0ZDUF9ORVhUX1JJTkc7Ci0JcHNsaS0+aXBfcmluZyA9IExQRkNfSVBfUklORzsKKwlwc2xpLT5leHRyYV9yaW5nID0gTFBGQ19FWFRSQV9SSU5HOwogCiAJcHNsaS0+aW9jYnFfbG9va3VwID0gTlVMTDsKIAlwc2xpLT5pb2NicV9sb29rdXBfbGVuID0gMDsKQEAgLTI1MjgsNyArMjU0NSw3IEBACiAJCQlwcmluZy0+ZmFzdF9pb3RhZyA9IHByaW5nLT5pb3RhZ19tYXg7CiAJCQlwcmluZy0+bnVtX21hc2sgPSAwOwogCQkJYnJlYWs7Ci0JCWNhc2UgTFBGQ19JUF9SSU5HOgkvKiByaW5nIDEgLSBJUCAqLworCQljYXNlIExQRkNfRVhUUkFfUklORzoJLyogcmluZyAxIC0gRVhUUkEgKi8KIAkJCS8qIG51bUNpb2NiIGFuZCBudW1SaW9jYiBhcmUgdXNlZCBpbiBjb25maWdfcG9ydCAqLwogCQkJcHJpbmctPm51bUNpb2NiID0gU0xJMl9JT0NCX0NNRF9SMV9FTlRSSUVTOwogCQkJcHJpbmctPm51bVJpb2NiID0gU0xJMl9JT0NCX1JTUF9SMV9FTlRSSUVTOwpAQCAtMjk4Myw3ICszMDAwLDcgQEAKIAkJCSBzdHJ1Y3QgbHBmY19pb2NicSAqIHByc3Bpb2NicSwKIAkJCSB1aW50MzJfdCB0aW1lb3V0KQogewotCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGRvbmVfcSk7CisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyhkb25lX3EpOwogCWxvbmcgdGltZWxlZnQsIHRpbWVvdXRfcmVxID0gMDsKIAlpbnQgcmV0dmFsID0gSU9DQl9TVUNDRVNTOwogCXVpbnQzMl90IGNyZWdfdmFsOwpAQCAtMzA2MSw3ICszMDc4LDcgQEAKIGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChzdHJ1Y3QgbHBmY19oYmEgKiBwaGJhLCBMUEZDX01CT1hRX3QgKiBwbWJveHEsCiAJCQkgdWludDMyX3QgdGltZW91dCkKIHsKLQlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChkb25lX3EpOworCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0soZG9uZV9xKTsKIAlERUNMQVJFX1dBSVRRVUVVRSh3cV9lbnRyeSwgY3VycmVudCk7CiAJdWludDMyX3QgdGltZWxlZnQgPSAwOwogCWludCByZXR2YWw7CkBAIC0zMjM4LDYgKzMyNTUsMjEgQEAKIAkJbHBmY19zbGlfaGFuZGxlX2Zhc3RfcmluZ19ldmVudChwaGJhLAogCQkJCQkJJnBoYmEtPnNsaS5yaW5nW0xQRkNfRkNQX1JJTkddLAogCQkJCQkJc3RhdHVzKTsKKworCWlmIChwaGJhLT5jZmdfbXVsdGlfcmluZ19zdXBwb3J0ID09IDIpIHsKKwkJLyoKKwkJICogUHJvY2VzcyBhbGwgZXZlbnRzIG9uIGV4dHJhIHJpbmcuICBUYWtlIHRoZSBvcHRpbWl6ZWQgcGF0aAorCQkgKiBmb3IgZXh0cmEgcmluZyBJTy4gIEFueSBvdGhlciBJTyBpcyBzbG93IHBhdGggYW5kIGlzIGhhbmRsZWQKKwkJICogYnkgdGhlIHdvcmtlciB0aHJlYWQuCisJCSAqLworCQlzdGF0dXMgPSAoaGFfY29weSAmIChIQV9SWE1BU0sgIDw8ICg0KkxQRkNfRVhUUkFfUklORykpKTsKKwkJc3RhdHVzID4+PSAoNCpMUEZDX0VYVFJBX1JJTkcpOworCQlpZiAoc3RhdHVzICYgSEFfUlhBVFQpIHsKKwkJCWxwZmNfc2xpX2hhbmRsZV9mYXN0X3JpbmdfZXZlbnQocGhiYSwKKwkJCQkJJnBoYmEtPnNsaS5yaW5nW0xQRkNfRVhUUkFfUklOR10sCisJCQkJCXN0YXR1cyk7CisJCX0KKwl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogCiB9IC8qIGxwZmNfaW50cl9oYW5kbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaAppbmRleCBlMjZkZTY4MDkuLmE0MzU0OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuaApAQCAtMTk4LDcgKzE5OCw3IEBACiAJaW50IGZjcF9yaW5nOwkJLyogcmluZyB1c2VkIGZvciBGQ1AgaW5pdGlhdG9yIGNvbW1hbmRzICovCiAJaW50IG5leHRfcmluZzsKIAotCWludCBpcF9yaW5nOwkJLyogcmluZyB1c2VkIGZvciBJUCBuZXR3b3JrIGRydiBjbWRzICovCisJaW50IGV4dHJhX3Jpbmc7CQkvKiBleHRyYSByaW5nIHVzZWQgZm9yIG90aGVyIHByb3RvY29scyAqLwogCiAJc3RydWN0IGxwZmNfc2xpX3N0YXQgc2xpc3RhdDsJLyogU0xJIHN0YXRpc3RpY2FsIGluZm8gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1ib3hxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaAppbmRleCBhYzQxNzkwLi5hNjFlZjNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGluY2x1ZGVkIHdpdGggdGhpcyBwYWNrYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjEuMTAiCisjZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMS4xMSIKIAogI2RlZmluZSBMUEZDX0RSSVZFUl9OQU1FICJscGZjIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCmluZGV4IDg2MDk5ZmQuLjc3ZDlkMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCkBAIC03MywxMCArNzMsMTAgQEAKIG1vZHVsZV9wYXJhbShtYXhfbWJveF9idXN5X3dhaXQsIHVzaG9ydCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9tYm94X2J1c3lfd2FpdCwgIk1heGltdW0gd2FpdCBmb3IgbWFpbGJveCBpbiBtaWNyb3NlY29uZHMgaWYgYnVzeSAoZGVmYXVsdD1NQk9YX0JVU1lfV0FJVD0xMCkiKTsKIAotI2RlZmluZSBSRElORE9PUihhZGFwdGVyKQkJcmVhZGwoKGFkYXB0ZXIpLT5iYXNlICsgMHgyMCkKLSNkZWZpbmUgUkRPVVRET09SKGFkYXB0ZXIpCQlyZWFkbCgoYWRhcHRlciktPmJhc2UgKyAweDJDKQotI2RlZmluZSBXUklORE9PUihhZGFwdGVyLHZhbHVlKQkJd3JpdGVsKHZhbHVlLCAoYWRhcHRlciktPmJhc2UgKyAweDIwKQotI2RlZmluZSBXUk9VVERPT1IoYWRhcHRlcix2YWx1ZSkJd3JpdGVsKHZhbHVlLCAoYWRhcHRlciktPmJhc2UgKyAweDJDKQorI2RlZmluZSBSRElORE9PUihhZGFwdGVyKQlyZWFkbCgoYWRhcHRlciktPm1taW9fYmFzZSArIDB4MjApCisjZGVmaW5lIFJET1VURE9PUihhZGFwdGVyKQlyZWFkbCgoYWRhcHRlciktPm1taW9fYmFzZSArIDB4MkMpCisjZGVmaW5lIFdSSU5ET09SKGFkYXB0ZXIsdmFsdWUpCSB3cml0ZWwodmFsdWUsIChhZGFwdGVyKS0+bW1pb19iYXNlICsgMHgyMCkKKyNkZWZpbmUgV1JPVVRET09SKGFkYXB0ZXIsdmFsdWUpIHdyaXRlbCh2YWx1ZSwgKGFkYXB0ZXIpLT5tbWlvX2Jhc2UgKyAweDJDKQogCiAvKgogICogR2xvYmFsIHZhcmlhYmxlcwpAQCAtMTM4Niw3ICsxMzg2LDggQEAKIAogCQloYW5kbGVkID0gMTsKIAotCQl3aGlsZSggUkRJTkRPT1IoYWRhcHRlcikgJiAweDAyICkgY3B1X3JlbGF4KCk7CisJCXdoaWxlKCBSRElORE9PUihhZGFwdGVyKSAmIDB4MDIgKQorCQkJY3B1X3JlbGF4KCk7CiAKIAkJbWVnYV9jbWRfZG9uZShhZGFwdGVyLCBjb21wbGV0ZWQsIG5zdGF0dXMsIHN0YXR1cyk7CiAKQEAgLTQ2NjgsNiArNDY2OSw4IEBACiAJCWhvc3QtPmhvc3Rfbm8sIG1lZ2FfYmFzZXBvcnQsIGlycSk7CiAKIAlhZGFwdGVyLT5iYXNlID0gbWVnYV9iYXNlcG9ydDsKKwlpZiAoZmxhZyAmIEJPQVJEX01FTU1BUCkKKwkJYWRhcHRlci0+bW1pb19iYXNlID0gKHZvaWQgX19pb21lbSAqKSBtZWdhX2Jhc2Vwb3J0OwogCiAJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmZyZWVfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPnBlbmRpbmdfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuaCBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCmluZGV4IDY2NTI5ZjEuLmM2ZTc0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oCkBAIC04MDEsNyArODAxLDggQEAKIAkJCQkgICBjbHVzdGVyaW5nIGlzIGF2YWlsYWJsZSAqLwogCXUzMglmbGFnOwogCi0JdW5zaWduZWQgbG9uZwliYXNlOworCXVuc2lnbmVkIGxvbmcJCWJhc2U7CisJdm9pZCBfX2lvbWVtCQkqbW1pb19iYXNlOwogCiAJLyogbWJveDY0IHdpdGggbWJveCBub3QgYWxpZ25lZCBvbiAxNi1ieXRlIGJvdW5kcnkgKi8KIAltYm94NjRfdAkqdW5hX21ib3g2NDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCmluZGV4IGMwZWRiNjYuLjdiYWM4NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYwpAQCAtODg0LDcgKzg4NCw3IEBACiAKIAlpZiAoKChtYWdpYzY0ID09IEhCQV9TSUdOQVRVUkVfNjRfQklUKSAmJgogCQkoKGFkYXB0ZXItPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgIT0KLQkJUENJX1NVQlNZU19JRF9NRUdBUkFJRF9TQVRBXzE1MF82KSB8fAorCQlQQ0lfU1VCU1lTX0lEX01FR0FSQUlEX1NBVEFfMTUwXzYpICYmCiAJCShhZGFwdGVyLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICE9CiAJCVBDSV9TVUJTWVNfSURfTUVHQVJBSURfU0FUQV8xNTBfNCkpKSB8fAogCQkoYWRhcHRlci0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmMKaW5kZXggN2U0MjYyZi4uMDQ2MjIzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHJlcXVpcmVkIGZvciBudW1uYmVyIG9mIHNnZSdzIChzZ2VfY291bnQpCiAgKi8KIAotdTMyIG1lZ2FzYXNfZ2V0X2ZyYW1lX2NvdW50KHU4IHNnZV9jb3VudCkKK3N0YXRpYyB1MzIgbWVnYXNhc19nZXRfZnJhbWVfY291bnQodTggc2dlX2NvdW50KQogewogCWludCBudW1fY250OwogCWludCBzZ2VfYnl0ZXM7CkBAIC0xNzMzLDcgKzE3MzMsNyBAQAogICoKICAqIFRhc2tsZXQgdG8gY29tcGxldGUgY21kcwogICovCi12b2lkIG1lZ2FzYXNfY29tcGxldGVfY21kX2RwYyh1bnNpZ25lZCBsb25nIGluc3RhbmNlX2FkZHIpCitzdGF0aWMgdm9pZCBtZWdhc2FzX2NvbXBsZXRlX2NtZF9kcGModW5zaWduZWQgbG9uZyBpbnN0YW5jZV9hZGRyKQogewogCXUzMiBwcm9kdWNlcjsKIAl1MzIgY29uc3VtZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMgYi9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmMKaW5kZXggNmNjMmJjMi4uYmJmNTIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAqKglwb3dlciBvZiAyIGNhY2hlIGxpbmUgc2l6ZS4KICoqCUVuaGFuY2VkIGluIGxpbnV4LTIuMy40NCB0byBwcm92aWRlIGEgbWVtb3J5IHBvb2wgCiAqKglwZXIgcGNpZGV2IHRvIHN1cHBvcnQgZHluYW1pYyBkbWEgbWFwcGluZy4gKEkgd291bGQgCi0qKgloYXZlIHByZWZlcnJlZCBhIHJlYWwgYnVzIGFzdHJhY3Rpb24sIGJ0dykuCisqKgloYXZlIHByZWZlcnJlZCBhIHJlYWwgYnVzIGFic3RyYWN0aW9uLCBidHcpLgogKioKICoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTU4OSwxMCArNTg5LDEyIEBACiBzdGF0aWMgc3RydWN0IG5jcl9kcml2ZXJfc2V0dXAKIAlkcml2ZXJfc2V0dXAJCQk9IFNDU0lfTkNSX0RSSVZFUl9TRVRVUDsKIAorI2lmbmRlZiBNT0RVTEUKICNpZmRlZglTQ1NJX05DUl9CT09UX0NPTU1BTkRfTElORV9TVVBQT1JUCiBzdGF0aWMgc3RydWN0IG5jcl9kcml2ZXJfc2V0dXAKIAlkcml2ZXJfc2FmZV9zZXR1cCBfX2luaXRkYXRhCT0gU0NTSV9OQ1JfRFJJVkVSX1NBRkVfU0VUVVA7CiAjZW5kaWYKKyNlbmRpZiAvKiAhTU9EVUxFICovCiAKICNkZWZpbmUgaW5pdHZlcmJvc2UgKGRyaXZlcl9zZXR1cC52ZXJib3NlKQogI2RlZmluZSBib290dmVyYm9zZSAobnAtPnZlcmJvc2UpCkBAIC02NDEsNiArNjQzLDEzIEBACiAjZGVmaW5lIE9QVF9JQVJCCQkyNgogI2VuZGlmCiAKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUJQVJHX1NFUAknICcKKyNlbHNlCisjZGVmaW5lCUFSR19TRVAJJywnCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKIHN0YXRpYyBjaGFyIHNldHVwX3Rva2VuW10gX19pbml0ZGF0YSA9IAogCSJ0YWdzOiIgICAibXBhcjoiCiAJInNwYXI6IiAgICJkaXNjOiIKQEAgLTY2MCwxMiArNjY5LDYgQEAKICNlbmRpZgogCTsJLyogRE9OTk9UIFJFTU9WRSBUSElTICc7JyAqLwogCi0jaWZkZWYgTU9EVUxFCi0jZGVmaW5lCUFSR19TRVAJJyAnCi0jZWxzZQotI2RlZmluZQlBUkdfU0VQCScsJwotI2VuZGlmCi0KIHN0YXRpYyBpbnQgX19pbml0IGdldF9zZXR1cF90b2tlbihjaGFyICpwKQogewogCWNoYXIgKmN1ciA9IHNldHVwX3Rva2VuOwpAQCAtNjgyLDcgKzY4NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBfX2luaXQgc3ltNTNjOHh4X19zZXR1cChjaGFyICpzdHIpCiB7CiAjaWZkZWYgU0NTSV9OQ1JfQk9PVF9DT01NQU5EX0xJTkVfU1VQUE9SVApAQCAtODA0LDYgKzgwNiw3IEBACiAjZW5kaWYgLyogU0NTSV9OQ1JfQk9PVF9DT01NQU5EX0xJTkVfU1VQUE9SVCAqLwogCXJldHVybiAxOwogfQorI2VuZGlmIC8qICFNT0RVTEUgKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqKgpAQCAtMTQzOCw3ICsxNDQxLDcgQEAKICoqCVRoZSBmaXJzdCBmb3VyIGJ5dGVzIChzY3Jfc3RbNF0pIGFyZSB1c2VkIGluc2lkZSB0aGUgc2NyaXB0IGJ5IAogKioJIkNPUFkiIGNvbW1hbmRzLgogKioJQmVjYXVzZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3QgaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQKLSoqCWluIGEgRFdPUkQsIHRoZSBmaWVsZHMgSEFWRSB0byBiZSBhdCB0aGUgY2hvb3NlbiBvZmZzZXRzLgorKioJaW4gYSBEV09SRCwgdGhlIGZpZWxkcyBIQVZFIHRvIGJlIGF0IHRoZSBjaG9zZW4gb2Zmc2V0cy4KICoqCQl4ZXJyX3N0CQkwCSgweDM0KQlzY3JhdGNoYQogKioJCXN5bmNfc3QJCTEJKDB4MDUpCXN4ZmVyCiAqKgkJd2lkZV9zdAkJMwkoMHgwMykJc2NudGwzCkBAIC0xNDk4LDcgKzE1MDEsNyBAQAogKioJdGhlIERTQSAoZGF0YSBzdHJ1Y3R1cmUgYWRkcmVzcykgcmVnaXN0ZXIgcG9pbnRzCiAqKgl0byB0aGlzIHN1YnN0cnVjdHVyZSBvZiB0aGUgY2NiLgogKioJVGhpcyBzdWJzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGhlYWRlciB3aXRoCi0qKgl0aGUgc2NyaXB0LXByb2Nlc3Nvci1jaGFuZ2FibGUgZGF0YSBhbmQKKyoqCXRoZSBzY3JpcHQtcHJvY2Vzc29yLWNoYW5nZWFibGUgZGF0YSBhbmQKICoqCWRhdGEgYmxvY2tzIGZvciB0aGUgaW5kaXJlY3QgbW92ZSBjb21tYW5kcy4KICoqCiAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUxMDcsNyArNTExMCw3IEBACiAKIC8qCiAqKglUaGlzIENDQiBoYXMgYmVlbiBza2lwcGVkIGJ5IHRoZSBOQ1IuCi0qKglRdWV1ZSBpdCBpbiB0aGUgY29ycmVwb25kaW5nIHVuaXQgcXVldWUuCisqKglRdWV1ZSBpdCBpbiB0aGUgY29ycmVzcG9uZGluZyB1bml0IHF1ZXVlLgogKi8KIHN0YXRpYyB2b2lkIG5jcl9jY2Jfc2tpcHBlZChzdHJ1Y3QgbmNiICpucCwgc3RydWN0IGNjYiAqY3ApCiB7CkBAIC01ODk2LDggKzU4OTksOCBAQAogKioKICoqCUluIG5vcm1hbCBjYXNlcywgaW50ZXJydXB0IGNvbmRpdGlvbnMgb2NjdXIgb25lIGF0IGEgCiAqKgl0aW1lLiBUaGUgbmNyIGlzIGFibGUgdG8gc3RhY2sgaW4gc29tZSBleHRyYSByZWdpc3RlcnMgCi0qKglvdGhlciBpbnRlcnJ1cHRzIHRoYXQgd2lsbCBvY2N1cnMgYWZ0ZXIgdGhlIGZpcnN0IG9uZS4KLSoqCUJ1dCBzZXZlcmFsbCBpbnRlcnJ1cHRzIG1heSBvY2N1ciBhdCB0aGUgc2FtZSB0aW1lLgorKioJb3RoZXIgaW50ZXJydXB0cyB0aGF0IHdpbGwgb2NjdXIgYWZ0ZXIgdGhlIGZpcnN0IG9uZS4KKyoqCUJ1dCwgc2V2ZXJhbCBpbnRlcnJ1cHRzIG1heSBvY2N1ciBhdCB0aGUgc2FtZSB0aW1lLgogKioKICoqCVdlIHByb2JhYmx5IHNob3VsZCBvbmx5IHRyeSB0byBkZWFsIHdpdGggdGhlIG5vcm1hbCAKICoqCWNhc2UsIGJ1dCBpdCBzZWVtcyB0aGF0IG11bHRpcGxlIGludGVycnVwdHMgb2NjdXIgaW4gCkBAIC02Nzk2LDcgKzY3OTksNyBAQAogKioJVGhlIGhvc3Qgc3RhdHVzIGZpZWxkIGlzIHNldCB0byBIU19ORUdPVElBVEUgdG8gbWFyayB0aGlzCiAqKglzaXR1YXRpb24uCiAqKgotKioJSWYgdGhlIHRhcmdldCBkb2Vzbid0IGFuc3dlciB0aGlzIG1lc3NhZ2UgaW1taWRpYXRlbHkKKyoqCUlmIHRoZSB0YXJnZXQgZG9lc24ndCBhbnN3ZXIgdGhpcyBtZXNzYWdlIGltbWVkaWF0ZWx5CiAqKgkoYXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkKSwgdGhlIFNJUl9ORUdPX0ZBSUwgaW50ZXJydXB0CiAqKgl3aWxsIGJlIHJhaXNlZCBldmVudHVhbGx5LgogKioJVGhlIGhhbmRsZXIgcmVtb3ZlcyB0aGUgSFNfTkVHT1RJQVRFIHN0YXR1cywgYW5kIHNldHMgdGhlCkBAIC04MzIxLDEyICs4MzI0LDEyIEBACiBtb2R1bGVfcGFyYW0obmNyNTNjOHh4LCBjaGFycCwgMCk7CiAjZW5kaWYKIAorI2lmbmRlZiBNT0RVTEUKIHN0YXRpYyBpbnQgX19pbml0IG5jcjUzYzh4eF9zZXR1cChjaGFyICpzdHIpCiB7CiAJcmV0dXJuIHN5bTUzYzh4eF9fc2V0dXAoc3RyKTsKIH0KIAotI2lmbmRlZiBNT0RVTEUKIF9fc2V0dXAoIm5jcjUzYzh4eD0iLCBuY3I1M2M4eHhfc2V0dXApOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguaCBiL2RyaXZlcnMvc2NzaS9uY3I1M2M4eHguaAppbmRleCBjYjhiNzcwLi5iMzkzNTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbmNyNTNjOHh4LmgKKysrIGIvZHJpdmVycy9zY3NpL25jcjUzYzh4eC5oCkBAIC0yMTgsNyArMjE4LDcgQEAKICoqCVNhbWUgYXMgb3B0aW9uIDEsIGJ1dCBhbHNvIGRlYWwgd2l0aCAKICoqCW1pc2NvbmZpZ3VyZWQgaW50ZXJydXB0cy4KICoqCi0qKgktIEVkZ2UgdHJpZ2dlcnJlZCBpbnN0ZWFkIG9mIGxldmVsIHNlbnNpdGl2ZS4KKyoqCS0gRWRnZSB0cmlnZ2VyZWQgaW5zdGVhZCBvZiBsZXZlbCBzZW5zaXRpdmUuCiAqKgktIE5vIGludGVycnVwdCBsaW5lIGNvbm5lY3RlZC4KICoqCS0gSVJRIG51bWJlciBtaXNjb25maWd1cmVkLgogKioJCkBAIC01NDksNyArNTQ5LDcgQEAKIAogLyoKICoqCUluaXRpYWwgc2V0dXAuCi0qKglDYW4gYmUgb3ZlcnJpZGVuIGF0IHN0YXJ0dXAgYnkgYSBjb21tYW5kIGxpbmUuCisqKglDYW4gYmUgb3ZlcnJpZGRlbiBhdCBzdGFydHVwIGJ5IGEgY29tbWFuZCBsaW5lLgogKi8KICNkZWZpbmUgU0NTSV9OQ1JfRFJJVkVSX1NFVFVQCQkJXAogewkJCQkJCVwKQEAgLTEwOTMsNyArMTA5Myw3IEBACiAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqKglPbiA4MTBBLCA4NjAsIDgyNUEsIDg3NSwgODk1IGFuZCA4OTYgY2hpcHMgdGhlIGNvbnRlbnQgCiAqKglvZiBTRkJSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIGFzIGRhdGEgKFNDUl9TRkJSX0RBVEEpLgotKioJVGhlIDg5NiBoYXMgYWRkaXRpb25uYWwgSU8gcmVnaXN0ZXJzIHN0YXJ0aW5nIGF0IAorKioJVGhlIDg5NiBoYXMgYWRkaXRpb25hbCBJTyByZWdpc3RlcnMgc3RhcnRpbmcgYXQgCiAqKglvZmZzZXQgMHg4MC4gQml0IDcgb2YgcmVnaXN0ZXIgb2Zmc2V0IGlzIHN0b3JlZCBpbiAKICoqCWJpdCA3IG9mIHRoZSBTQ1JJUFRTIGluc3RydWN0aW9uIGZpcnN0IERXT1JELgogKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29rdGFnb25fZXNwLmMgYi9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYwppbmRleCBkZDY3YTY4Li5jMTE2YTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYworKysgYi9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYwpAQCAtNzIsMTIgKzcyLDEyIEBACiBzdGF0aWMgaW50ICBva3RhZ29uX25vdGlmeV9yZWJvb3Qoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKngpOwogCiAjaWZkZWYgVVNFX0JPVFRPTV9IQUxGCi1zdGF0aWMgdm9pZCBkbWFfY29tbWl0KHZvaWQgKm9wYXF1ZSk7CitzdGF0aWMgdm9pZCBkbWFfY29tbWl0KHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKTsKIAogbG9uZyBva3RhZ190b19pbyhsb25nICpwYWRkciwgbG9uZyAqYWRkciwgbG9uZyBsZW4pOwogbG9uZyBva3RhZ19mcm9tX2lvKGxvbmcgKmFkZHIsIGxvbmcgKnBhZGRyLCBsb25nIGxlbik7CiAKLXN0YXRpYyBERUNMQVJFX1dPUksodHFfZmFrZV9kbWEsIGRtYV9jb21taXQsIE5VTEwpOworc3RhdGljIERFQ0xBUkVfV09SSyh0cV9mYWtlX2RtYSwgZG1hX2NvbW1pdCk7CiAKICNkZWZpbmUgRE1BX01BWFRSQU5TRkVSIDB4ODAwMAogCkBAIC0yNjYsNyArMjY2LDcgQEAKICAqLwogIAogIAotc3RhdGljIHZvaWQgZG1hX2NvbW1pdCh2b2lkICpvcGFxdWUpCitzdGF0aWMgdm9pZCBkbWFfY29tbWl0KHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKQogewogICAgIGxvbmcgd2FpdCxsZW4yLHBvczsKICAgICBzdHJ1Y3QgTkNSX0VTUCAqZXNwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3QuYyBiL2RyaXZlcnMvc2NzaS9vc3N0LmMKaW5kZXggODI0ZmUwOC4uN2QyMzExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29zc3QuYworKysgYi9kcml2ZXJzL3Njc2kvb3NzdC5jCkBAIC01Nzc3LDcgKzU3NzcsNyBAQAogCWRldl9udW0gPSBpOwogCiAJLyogYWxsb2NhdGUgYSBzdHJ1Y3Qgb3NzdF90YXBlIGZvciB0aGlzIGRldmljZSAqLwotCXRwbnQgPSAoc3RydWN0IG9zc3RfdGFwZSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc3N0X3RhcGUpLCBHRlBfQVRPTUlDKTsKKwl0cG50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zc3RfdGFwZSksIEdGUF9BVE9NSUMpOwogCWlmICh0cG50ID09IE5VTEwpIHsKIAkJd3JpdGVfdW5sb2NrKCZvc19zY3NpX3RhcGVzX2xvY2spOwogCQlwcmludGsoS0VSTl9FUlIgIm9zc3QgOkU6IENhbid0IGFsbG9jYXRlIGRldmljZSBkZXNjcmlwdG9yLCBkZXZpY2Ugbm90IGF0dGFjaGVkLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYwppbmRleCBlZTQ0OWIyLi5hYWQzNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKQEAgLTE1NCwxNiArMTU0LDExIEBACiAgICAgCiAgICAgREVCVUcoMCwgImFoYTE1MnhfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CiAgICAgdHVwbGUuVHVwbGVEYXRhID0gdHVwbGVfZGF0YTsKICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLSAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQogICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOwogICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CiAgICAgd2hpbGUgKDEpIHsKIAlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgIT0gMCB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKaW5kZXggODVmN2ZmYS4uYTFjNWYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fc3R1Yi5jCkBAIC0xMzYsMTQgKzEzNiw5IEBACiAKICAgICBERUJVRygwLCAiZmRvbWFpbl9jb25maWcoMHglcClcbiIsIGxpbmspOwogCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKICAgICB0dXBsZS5UdXBsZURhdGEgPSB0dXBsZV9kYXRhOwogICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OwogICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwogCiAgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCmluZGV4IGIxZDM0NjAuLmQ3MmRmNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAgKiBDbGVuYXVwIHBhcmFtZXRlcnMgYW5kIGNhbGwgZG9uZSgpIGZ1bmN0aW9ucy4KICAqIFlvdSBtdXN0IGJlIHNldCBTQ3BudC0+cmVzdWx0IGJlZm9yZSBjYWxsIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyB2b2lkIG5zcF9zY3NpX2RvbmUoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyB2b2lkIG5zcF9zY3NpX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIApAQCAtMTkyLDcgKzE5Miw4IEBACiAJU0NwbnQtPnNjc2lfZG9uZShTQ3BudCk7CiB9CiAKLXN0YXRpYyBpbnQgbnNwX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQorc3RhdGljIGludCBuc3BfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogI2lmZGVmIE5TUF9ERUJVRwogCS8qdW5zaWduZWQgaW50IGhvc3RfaWQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT50aGlzX2lkOyovCkBAIC0zNjUsNyArMzY2LDcgQEAKIC8qCiAgKiBTdGFydCBzZWxlY3Rpb24gcGhhc2UKICAqLwotc3RhdGljIGludCBuc3Bod19zdGFydF9zZWxlY3Rpb24oU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgbnNwaHdfc3RhcnRfc2VsZWN0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXVuc2lnbmVkIGludCAgaG9zdF9pZAkgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT50aGlzX2lkOwogCXVuc2lnbmVkIGludCAgYmFzZQkgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwpAQCAtNDQ2LDcgKzQ0Nyw3IEBACiAvKgogICogc2V0dXAgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlciBtb2RlCiAgKi8KLXN0YXRpYyBpbnQgbnNwX2FuYWx5emVfc2R0cihTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIGludCBuc3BfYW5hbHl6ZV9zZHRyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXVuc2lnbmVkIGNoYXIJICAgICAgIHRhcmdldCA9IHNjbWRfaWQoU0NwbnQpOwogLy8JdW5zaWduZWQgY2hhcgkgICAgICAgbHVuICAgID0gU0NwbnQtPmRldmljZS0+bHVuOwpAQCAtNTA0LDcgKzUwNSw3IEBACiAvKgogICogc3RhcnQgbmluamEgaGFyZHdhcmUgdGltZXIKICAqLwotc3RhdGljIHZvaWQgbnNwX3N0YXJ0X3RpbWVyKFNjc2lfQ21uZCAqU0NwbnQsIGludCB0aW1lKQorc3RhdGljIHZvaWQgbnNwX3N0YXJ0X3RpbWVyKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBpbnQgdGltZSkKIHsKIAl1bnNpZ25lZCBpbnQgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CiAJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKQEAgLTUxNyw3ICs1MTgsOCBAQAogLyoKICAqIHdhaXQgZm9yIGJ1cyBwaGFzZSBjaGFuZ2UKICAqLwotc3RhdGljIGludCBuc3BfbmVnYXRlX3NpZ25hbChTY3NpX0NtbmQgKlNDcG50LCB1bnNpZ25lZCBjaGFyIG1hc2ssIGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgbnNwX25lZ2F0ZV9zaWduYWwoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIHVuc2lnbmVkIGNoYXIgbWFzaywKKwkJCSAgICAgY2hhciAqc3RyKQogewogCXVuc2lnbmVkIGludCAgYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CiAJdW5zaWduZWQgY2hhciByZWc7CkBAIC01NDQsOSArNTQ2LDkgQEAKIC8qCiAgKiBleHBlY3QgTmluamEgSXJxCiAgKi8KLXN0YXRpYyBpbnQgbnNwX2V4cGVjdF9zaWduYWwoU2NzaV9DbW5kCSAgICpTQ3BudCwKLQkJCSAgICAgdW5zaWduZWQgY2hhciAgY3VycmVudF9waGFzZSwKLQkJCSAgICAgdW5zaWduZWQgY2hhciAgbWFzaykKK3N0YXRpYyBpbnQgbnNwX2V4cGVjdF9zaWduYWwoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgY3VycmVudF9waGFzZSwKKwkJCSAgICAgdW5zaWduZWQgY2hhciBtYXNrKQogewogCXVuc2lnbmVkIGludCAgYmFzZQkgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCWludAkgICAgICB0aW1lX291dDsKQEAgLTU3OSw3ICs1ODEsNyBAQAogLyoKICAqIHRyYW5zZmVyIFNDU0kgbWVzc2FnZQogICovCi1zdGF0aWMgaW50IG5zcF94ZmVyKFNjc2lfQ21uZCAqU0NwbnQsIGludCBwaGFzZSkKK3N0YXRpYyBpbnQgbnNwX3hmZXIoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIGludCBwaGFzZSkKIHsKIAl1bnNpZ25lZCBpbnQgIGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCW5zcF9od19kYXRhICAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwpAQCAtNjE5LDcgKzYyMSw3IEBACiAvKgogICogZ2V0IGV4dHJhIFNDU0kgZGF0YSBmcm9tIGZpZm8KICAqLwotc3RhdGljIGludCBuc3BfZGF0YXBoYXNlX2J5cGFzcyhTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIGludCBuc3BfZGF0YXBoYXNlX2J5cGFzcyhzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCXVuc2lnbmVkIGludCBjb3VudDsKQEAgLTY1MSw3ICs2NTMsNyBAQAogLyoKICAqIGFjY2VwdCByZXNlbGVjdGlvbgogICovCi1zdGF0aWMgaW50IG5zcF9yZXNlbGVjdGVkKFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgaW50IG5zcF9yZXNlbGVjdGVkKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXVuc2lnbmVkIGludCAgYmFzZSAgICA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CiAJdW5zaWduZWQgaW50ICBob3N0X2lkID0gU0NwbnQtPmRldmljZS0+aG9zdC0+dGhpc19pZDsKQEAgLTY5MCw3ICs2OTIsNyBAQAogLyoKICAqIGNvdW50IGhvdyBtYW55IGRhdGEgdHJhbnNmZXJkCiAgKi8KLXN0YXRpYyBpbnQgbnNwX2ZpZm9fY291bnQoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgbnNwX2ZpZm9fY291bnQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJdW5zaWduZWQgaW50IGJhc2UgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCXVuc2lnbmVkIGludCBjb3VudDsKQEAgLTcxNyw3ICs3MTksNyBAQAogLyoKICAqIHJlYWQgZGF0YSBpbiBEQVRBIElOIHBoYXNlCiAgKi8KLXN0YXRpYyB2b2lkIG5zcF9waW9fcmVhZChTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIHZvaWQgbnNwX3Bpb19yZWFkKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXVuc2lnbmVkIGludCAgYmFzZSAgICAgID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKIAl1bnNpZ25lZCBsb25nIG1taW9fYmFzZSA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmJhc2U7CkBAIC04MTIsNyArODE0LDcgQEAKIC8qCiAgKiB3cml0ZSBkYXRhIGluIERBVEEgT1VUIHBoYXNlCiAgKi8KLXN0YXRpYyB2b2lkIG5zcF9waW9fd3JpdGUoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyB2b2lkIG5zcF9waW9fd3JpdGUoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJdW5zaWduZWQgaW50ICBiYXNlICAgICAgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5pb19wb3J0OwogCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+YmFzZTsKQEAgLTkwNSw3ICs5MDcsNyBAQAogLyoKICAqIHNldHVwIHN5bmNocm9ub3VzL2FzeW5jaHJvbm91cyBkYXRhIHRyYW5zZmVyIG1vZGUKICAqLwotc3RhdGljIGludCBuc3BfbmV4dXMoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgbnNwX25leHVzKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXVuc2lnbmVkIGludCAgIGJhc2UgICA9IFNDcG50LT5kZXZpY2UtPmhvc3QtPmlvX3BvcnQ7CiAJdW5zaWduZWQgY2hhciAgdGFyZ2V0ID0gc2NtZF9pZChTQ3BudCk7CkBAIC05NTIsNyArOTU0LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgICBiYXNlOwogCXVuc2lnbmVkIGNoYXIgIGlycV9zdGF0dXMsIGlycV9waGFzZSwgcGhhc2U7Ci0JU2NzaV9DbW5kICAgICAqdG1wU0M7CisJc3RydWN0IHNjc2lfY21uZCAqdG1wU0M7CiAJdW5zaWduZWQgY2hhciAgdGFyZ2V0LCBsdW47CiAJdW5zaWduZWQgaW50ICAqc3luY19uZWc7CiAJaW50ICAgICAgICAgICAgaSwgdG1wOwpAQCAtMTUzMCw3ICsxNTMyLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKLXN0YXRpYyBpbnQgbnNwX2VoX2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCitzdGF0aWMgaW50IG5zcF9laF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAluc3BfZGJnKE5TUF9ERUJVR19CVVNSRVNFVCwgIlNDcG50PTB4JXAiLCBTQ3BudCk7CiAKQEAgLTE1NTgsNyArMTU2MCw3IEBACiAJcmV0dXJuIFNVQ0NFU1M7CiB9CiAKLXN0YXRpYyBpbnQgbnNwX2VoX2J1c19yZXNldChTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIGludCBuc3BfZWhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCW5zcF9od19kYXRhICpkYXRhID0gKG5zcF9od19kYXRhICopU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CiAKQEAgLTE1NjcsNyArMTU2OSw3IEBACiAJcmV0dXJuIG5zcF9idXNfcmVzZXQoZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgbnNwX2VoX2hvc3RfcmVzZXQoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyBpbnQgbnNwX2VoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJbnNwX2h3X2RhdGEgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKIApAQCAtMTY4MywxNiArMTY4NSwxMCBAQAogCiAJbnNwX2RiZyhOU1BfREVCVUdfSU5JVCwgImluIik7CiAKLQl0dXBsZS5EZXNpcmVkVHVwbGUgICAgPSBDSVNUUExfQ09ORklHOwogCXR1cGxlLkF0dHJpYnV0ZXMgICAgICA9IDA7CiAJdHVwbGUuVHVwbGVEYXRhCSAgICAgID0gdHVwbGVfZGF0YTsKIAl0dXBsZS5UdXBsZURhdGFNYXggICAgPSBzaXplb2YodHVwbGVfZGF0YSk7CiAJdHVwbGUuVHVwbGVPZmZzZXQgICAgID0gMDsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwJcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsCXBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCAgICA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKIAogCS8qIExvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCiAJQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGxpbmssICZjb25mKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5oIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuaAppbmRleCBhODg3MTRmLi42MjVjYTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmgKQEAgLTI2Niw3ICsyNjYsNyBAQAogCiAJaW50ICAgICAgICAgICBUaW1lckNvdW50OwogCWludCAgICAgICAgICAgU2VsZWN0aW9uVGltZU91dDsKLQlTY3NpX0NtbmQgICAgKkN1cnJlbnRTQzsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpDdXJyZW50U0M7CiAJLy9pbnQgICAgICAgICAgIEN1cnJuZXRUYXJnZXQ7CiAKIAlpbnQgICAgICAgICAgIEZpZm9Db3VudDsKQEAgLTMxOSwzMCArMzE5LDM0IEBACiAJCQkJCSBpbnQgICAgIGhvc3RubywKICNlbmRpZgogCQkJCQkgaW50ICAgICBpbm91dCk7Ci1zdGF0aWMgICAgICAgIGludCAgICAgICAgbnNwX3F1ZXVlY29tbWFuZChTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqIGRvbmUpKFNjc2lfQ21uZCAqU0NwbnQpKTsKK3N0YXRpYyBpbnQgbnNwX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCSAgICB2b2lkICgqIGRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KSk7CiAKIC8qIEVycm9yIGhhbmRsZXIgKi8KLS8qc3RhdGljIGludCBuc3BfZWhfYWJvcnQgICAgICAgKFNjc2lfQ21uZCAqU0NwbnQpOyovCi0vKnN0YXRpYyBpbnQgbnNwX2VoX2RldmljZV9yZXNldChTY3NpX0NtbmQgKlNDcG50KTsqLwotc3RhdGljIGludCBuc3BfZWhfYnVzX3Jlc2V0ICAgIChTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyBpbnQgbnNwX2VoX2hvc3RfcmVzZXQgICAoU2NzaV9DbW5kICpTQ3BudCk7CisvKnN0YXRpYyBpbnQgbnNwX2VoX2Fib3J0ICAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7Ki8KKy8qc3RhdGljIGludCBuc3BfZWhfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsqLworc3RhdGljIGludCBuc3BfZWhfYnVzX3Jlc2V0ICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CitzdGF0aWMgaW50IG5zcF9laF9ob3N0X3Jlc2V0ICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKIHN0YXRpYyBpbnQgbnNwX2J1c19yZXNldCAgICAgICAobnNwX2h3X2RhdGEgKmRhdGEpOwogCiAvKiAqLwogc3RhdGljIGludCAgbnNwaHdfaW5pdCAgICAgICAgICAgKG5zcF9od19kYXRhICpkYXRhKTsKLXN0YXRpYyBpbnQgIG5zcGh3X3N0YXJ0X3NlbGVjdGlvbihTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyB2b2lkIG5zcF9zdGFydF90aW1lciAgICAgIChTY3NpX0NtbmQgKlNDcG50LCBpbnQgdGltZSk7Ci1zdGF0aWMgaW50ICBuc3BfZmlmb19jb3VudCAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7Ci1zdGF0aWMgdm9pZCBuc3BfcGlvX3JlYWQgICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7Ci1zdGF0aWMgdm9pZCBuc3BfcGlvX3dyaXRlICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7Ci1zdGF0aWMgaW50ICBuc3BfbmV4dXMgICAgICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7Ci1zdGF0aWMgdm9pZCBuc3Bfc2NzaV9kb25lICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCk7Ci1zdGF0aWMgaW50ICBuc3BfYW5hbHl6ZV9zZHRyICAgICAoU2NzaV9DbW5kICpTQ3BudCk7Ci1zdGF0aWMgaW50ICBuc3BfbmVnYXRlX3NpZ25hbCAgICAoU2NzaV9DbW5kICpTQ3BudCwgdW5zaWduZWQgY2hhciBtYXNrLCBjaGFyICpzdHIpOwotc3RhdGljIGludCAgbnNwX2V4cGVjdF9zaWduYWwgICAgKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGNoYXIgY3VycmVudF9waGFzZSwgdW5zaWduZWQgY2hhciAgbWFzayk7Ci1zdGF0aWMgaW50ICBuc3BfeGZlciAgICAgICAgICAgICAoU2NzaV9DbW5kICpTQ3BudCwgaW50IHBoYXNlKTsKLXN0YXRpYyBpbnQgIG5zcF9kYXRhcGhhc2VfYnlwYXNzIChTY3NpX0NtbmQgKlNDcG50KTsKLXN0YXRpYyBpbnQgIG5zcF9yZXNlbGVjdGVkICAgICAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgIG5zcGh3X3N0YXJ0X3NlbGVjdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBuc3Bfc3RhcnRfdGltZXIgICAgICAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsIGludCB0aW1lKTsKK3N0YXRpYyBpbnQgIG5zcF9maWZvX2NvdW50ICAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBuc3BfcGlvX3JlYWQgICAgICAgICAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIHZvaWQgbnNwX3Bpb193cml0ZSAgICAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgIG5zcF9uZXh1cyAgICAgICAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBuc3Bfc2NzaV9kb25lICAgICAgICAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIGludCAgbnNwX2FuYWx5emVfc2R0ciAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgIG5zcF9uZWdhdGVfc2lnbmFsICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgbWFzaywgY2hhciAqc3RyKTsKK3N0YXRpYyBpbnQgIG5zcF9leHBlY3Rfc2lnbmFsICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgY3VycmVudF9waGFzZSwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgIG1hc2spOworc3RhdGljIGludCAgbnNwX3hmZXIgICAgICAgICAgICAgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCBpbnQgcGhhc2UpOworc3RhdGljIGludCAgbnNwX2RhdGFwaGFzZV9ieXBhc3MgKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK3N0YXRpYyBpbnQgIG5zcF9yZXNlbGVjdGVkICAgICAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CiBzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqbnNwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQpOwogCiAvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLwpAQCAtMzU1LDggKzM1OSw4IEBACiAKIC8qIERlYnVnICovCiAjaWZkZWYgTlNQX0RFQlVHCi1zdGF0aWMgdm9pZCBzaG93X2NvbW1hbmQgKFNjc2lfQ21uZCAqU0NwbnQpOwotc3RhdGljIHZvaWQgc2hvd19waGFzZSAgIChTY3NpX0NtbmQgKlNDcG50KTsKK3N0YXRpYyB2b2lkIHNob3dfY29tbWFuZCAoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOworc3RhdGljIHZvaWQgc2hvd19waGFzZSAgIChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CiBzdGF0aWMgdm9pZCBzaG93X2J1c3BoYXNlKHVuc2lnbmVkIGNoYXIgc3RhdCk7CiBzdGF0aWMgdm9pZCBzaG93X21lc3NhZ2UgKG5zcF9od19kYXRhICpkYXRhKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9kZWJ1Zy5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfZGVidWcuYwppbmRleCA2MmU1YzYwLi4yZjc1ZmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2RlYnVnLmMKQEAgLTEzOCwxMiArMTM4LDEyIEBACiAJcHJpbnRrKCJcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBzaG93X2NvbW1hbmQoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyB2b2lkIHNob3dfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAlwcmludF9jb21tYW5kayhTQ3BudC0+Y21uZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNob3dfcGhhc2UoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyB2b2lkIHNob3dfcGhhc2Uoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJaW50IGkgPSBTQ3BudC0+U0NwLnBoYXNlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9tZXNzYWdlLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9tZXNzYWdlLmMKaW5kZXggZDcwNTc3My4uZWY1OTNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX21lc3NhZ2UuYwpAQCAtOCw3ICs4LDcgQEAKIAogLyogJElkOiBuc3BfbWVzc2FnZS5jLHYgMS42IDIwMDMvMDcvMjYgMTQ6MjE6MDkgZWxjYSBFeHAgJCAqLwogCi1zdGF0aWMgdm9pZCBuc3BfbWVzc2FnZV9pbihTY3NpX0NtbmQgKlNDcG50KQorc3RhdGljIHZvaWQgbnNwX21lc3NhZ2VfaW4oc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCiB7CiAJdW5zaWduZWQgaW50ICBiYXNlID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aW9fcG9ydDsKIAluc3BfaHdfZGF0YSAgKmRhdGEgPSAobnNwX2h3X2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKQEAgLTUwLDcgKzUwLDcgQEAKIAogfQogCi1zdGF0aWMgdm9pZCBuc3BfbWVzc2FnZV9vdXQoU2NzaV9DbW5kICpTQ3BudCkKK3N0YXRpYyB2b2lkIG5zcF9tZXNzYWdlX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKIHsKIAluc3BfaHdfZGF0YSAqZGF0YSA9IChuc3BfaHdfZGF0YSAqKVNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCWludCByZXQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCmluZGV4IDg2YzJhYzYuLjlkNDMxZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3Fsb2dpY19zdHViLmMKQEAgLTIwOCwxOCArMjA4LDExIEBACiAKIAlERUJVRygwLCAicWxvZ2ljX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKKwlpbmZvLT5tYW5mX2lkID0gbGluay0+bWFuZl9pZDsKKwogCXR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKikgdHVwbGVfZGF0YTsKIAl0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSkpOwotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCi0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX01BTkZJRDsKLQlpZiAoKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSAmJiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykpCi0JCWluZm8tPm1hbmZfaWQgPSBsZTE2X3RvX2NwdSh0dXBsZS5UdXBsZURhdGFbMF0pOwogCiAJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCmluZGV4IDcyZmU1ZDAuLmZiN2FjZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYwpAQCAtNzIyLDE5ICs3MjIsMTEgQEAKIAogCURFQlVHKDAsICJTWU01M0M1MDBfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAorCWluZm8tPm1hbmZfaWQgPSBsaW5rLT5tYW5mX2lkOworCiAJdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKXR1cGxlX2RhdGE7CiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CiAJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0JaWYgKChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgJiYKLQkgICAgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpKQotCQlpbmZvLT5tYW5mX2lkID0gbGUxNl90b19jcHUodHVwbGUuVHVwbGVEYXRhWzBdKTsKIAogCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGx1dG8uYyBiL2RyaXZlcnMvc2NzaS9wbHV0by5jCmluZGV4IGFhNjBhNWYuLjNiMmUxYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbHV0by5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbHV0by5jCkBAIC0xMTcsNyArMTE3LDcgQEAKICNlbmRpZgogCQkJcmV0dXJuIDA7CiAJfQotCWZjcyA9IChzdHJ1Y3QgY3RybF9pbnF1aXJ5ICopIGttYWxsb2MgKHNpemVvZiAoc3RydWN0IGN0cmxfaW5xdWlyeSkgKiBmY3Njb3VudCwgR0ZQX0RNQSk7CisJZmNzID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjdHJsX2lucXVpcnkpICogZmNzY291bnQsIEdGUF9ETUEpOwogCWlmICghZmNzKSB7CiAJCXByaW50ayAoIlBMVVRPOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBwcm9iZVxuIik7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BwYS5jIGIvZHJpdmVycy9zY3NpL3BwYS5jCmluZGV4IGIwZWJhMzkuLjU4NGJhNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wcGEuYworKysgYi9kcml2ZXJzL3Njc2kvcHBhLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAlpbnQgYmFzZTsJCS8qIEFjdHVhbCBwb3J0IGFkZHJlc3MgICAgICAgICAgKi8KIAlpbnQgbW9kZTsJCS8qIFRyYW5zZmVyIG1vZGUgICAgICAgICAgICAgICAgKi8KIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjdXJfY21kOwkvKiBDdXJyZW50IHF1ZXVlZCBjb21tYW5kICAgICAgICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IHBwYV90cTsJLyogUG9sbGluZyBpbnRlcnJ1cHQgc3R1ZmYgICAgICAgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHBwYV90cTsJLyogUG9sbGluZyBpbnRlcnJ1cHQgc3R1ZmYgICAgICAgKi8KIAl1bnNpZ25lZCBsb25nIGpzdGFydDsJLyogSmlmZmllcyBhdCBzdGFydCAgICAgICAgICAgICAqLwogCXVuc2lnbmVkIGxvbmcgcmVjb25fdG1vOwkvKiBIb3cgbWFueSB1c2VjcyB0byB3YWl0IGZvciByZWNvbm5lY3Rpb24gKDZ0aCBiaXQpICovCiAJdW5zaWduZWQgaW50IGZhaWxlZDoxOwkvKiBGYWlsdXJlIGZsYWcgICAgICAgICAgICAgICAgICovCkBAIC02MjcsOSArNjI3LDkgQEAKICAqIHRoZSBzY2hlZHVsZXIncyB0YXNrIHF1ZXVlIHRvIGdlbmVyYXRlIGEgc3RyZWFtIG9mIGNhbGwtYmFja3MgYW5kCiAgKiBjb21wbGV0ZSB0aGUgcmVxdWVzdCB3aGVuIHRoZSBkcml2ZSBpcyByZWFkeS4KICAqLwotc3RhdGljIHZvaWQgcHBhX2ludGVycnVwdCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgcHBhX2ludGVycnVwdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JcHBhX3N0cnVjdCAqZGV2ID0gKHBwYV9zdHJ1Y3QgKikgZGF0YTsKKwlwcGFfc3RydWN0ICpkZXYgPSBjb250YWluZXJfb2Yod29yaywgcHBhX3N0cnVjdCwgcHBhX3RxLndvcmspOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGRldi0+Y3VyX2NtZDsKIAogCWlmICghY21kKSB7CkBAIC02MzcsNyArNjM3LDYgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAocHBhX2VuZ2luZShkZXYsIGNtZCkpIHsKLQkJZGV2LT5wcGFfdHEuZGF0YSA9ICh2b2lkICopIGRldjsKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPnBwYV90cSwgMSk7CiAJCXJldHVybjsKIAl9CkBAIC04MjIsOCArODIxLDcgQEAKIAljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsJLyogZGVmYXVsdCByZXR1cm4gY29kZSAqLwogCWNtZC0+U0NwLnBoYXNlID0gMDsJLyogYnVzIGZyZWUgKi8KIAotCWRldi0+cHBhX3RxLmRhdGEgPSBkZXY7Ci0Jc2NoZWR1bGVfd29yaygmZGV2LT5wcGFfdHEpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT5wcGFfdHEsIDApOwogCiAJcHBhX3BiX2NsYWltKGRldik7CiAKQEAgLTEwMTIsNyArMTAxMCw3IEBACiBzdGF0aWMgaW50IF9fcHBhX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcGIpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKLQlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0aW5nKTsKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRF9PTlNUQUNLKHdhaXRpbmcpOwogCURFRklORV9XQUlUKHdhaXQpOwogCXBwYV9zdHJ1Y3QgKmRldjsKIAlpbnQgcG9ydHM7CkBAIC0xMDg2LDcgKzEwODQsNyBAQAogCWVsc2UKIAkJcG9ydHMgPSA4OwogCi0JSU5JVF9XT1JLKCZkZXYtPnBwYV90cSwgcHBhX2ludGVycnVwdCwgZGV2KTsKKwlJTklUX0RFTEFZRURfV09SSygmZGV2LT5wcGFfdHEsIHBwYV9pbnRlcnJ1cHQpOwogCiAJZXJyID0gLUVOT01FTTsKIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZwcGFfdGVtcGxhdGUsIHNpemVvZihwcGFfc3RydWN0ICopKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmMgYi9kcml2ZXJzL3Njc2kvcHNpMjQwaS5jCmluZGV4IGE3MjBjOTIuLjg5OWU4OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmMKKysrIGIvZHJpdmVycy9zY3NpL3BzaTI0MGkuYwpAQCAtODcsMTEgKzg3LDExIEBACiAJewogCVVTSE9SVAkJIHBvcnRzWzEzXTsKIAlPVVJfREVWSUNFCSBkZXZpY2VbOF07Ci0JU2NzaV9DbW5kCSpwU0NtbmQ7CisJc3RydWN0IHNjc2lfY21uZCAqcFNDbW5kOwogCUlERV9TVFJVQ1QJIGlkZTsKIAlVTE9ORwkJIHN0YXJ0U2VjdG9yOwogCVVTSE9SVAkJIHNlY3RvckNvdW50OwotCVNjc2lfQ21uZAkqU0NwbnQ7CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CiAJVk9JRAkJKmJ1ZmZlcjsKIAlVU0hPUlQJCSBleHBlY3RpbmdJUlE7CiAJfQlBREFQVEVSMjQwSSwgKlBBREFQVEVSMjQwSTsKQEAgLTI1MywxMiArMjUzLDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIElycV9IYW5kbGVyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiAJewotCXN0cnVjdCBTY3NpX0hvc3QgICAqc2hvc3Q7CQkJLy8gUG9pbnRlciB0byBob3N0IGRhdGEgYmxvY2sKLQlQQURBUFRFUjI0MEkJCXBhZGFwdGVyOwkJLy8gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlCi0JVVNIT1JUCQkgCSAgICpwcG9ydHM7CQkJLy8gSS9PIHBvcnQgYXJyYXkKLQlTY3NpX0NtbmQJCSAgICpTQ3BudDsKLQlVQ0hBUgkJCQlzdGF0dXM7Ci0JaW50CQkJCQl6OworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwkvLyBQb2ludGVyIHRvIGhvc3QgZGF0YSBibG9jaworCVBBREFQVEVSMjQwSSBwYWRhcHRlcjsJCS8vIFBvaW50ZXIgdG8gYWRhcHRlciBjb250cm9sIHN0cnVjdHVyZQorCVVTSE9SVCAqcHBvcnRzOwkJCS8vIEkvTyBwb3J0IGFycmF5CisJc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7CisJVUNIQVIgc3RhdHVzOworCWludCB6OwogCiAJREVCKHByaW50ayAoIlxucHNpMjQwaSByZWNlaXZlZCBpbnRlcnJ1cHRcbiIpKTsKIApAQCAtMzI4LDcgKzMyOCw3IEBACiAJCQkJcGlucXVpcnlEYXRhLT5BZGRpdGlvbmFsTGVuZ3RoID0gMzUgLSA0OwogCiAJCQkJLy8gRmlsbCBpbiB2ZW5kb3IgaWRlbnRpZmljYXRpb24gZmllbGRzLgotCQkJCWZvciAoIHogPSAwOyAgeiA8IDIwOyAgeiArPSAyICkKKwkJCQlmb3IgKCB6ID0gMDsgIHogPCA4OyAgeiArPSAyICkKIAkJCQkJewogCQkJCQlwaW5xdWlyeURhdGEtPlZlbmRvcklkW3pdCSAgPSAoKFVDSEFSICopaWRlbnRpZnlEYXRhLk1vZGVsTnVtYmVyKVt6ICsgMV07CiAJCQkJCXBpbnF1aXJ5RGF0YS0+VmVuZG9ySWRbeiArIDFdID0gKChVQ0hBUiAqKWlkZW50aWZ5RGF0YS5Nb2RlbE51bWJlcilbel07CkBAIC0zODksMTIgKzM4OSwxNyBAQAogICoJUmV0dXJuczoJCVN0YXR1cyBjb2RlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQc2kyNDBpX1F1ZXVlQ29tbWFuZCAoU2NzaV9DbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3N0YXRpYyBpbnQgUHNpMjQwaV9RdWV1ZUNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCQkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCiAJewotCVVDSEFSCQkgICAqY2RiID0gKFVDSEFSICopU0NwbnQtPmNtbmQ7CQkJCQkvLyBQb2ludGVyIHRvIFNDU0kgQ0RCCi0JUEFEQVBURVIyNDBJCXBhZGFwdGVyID0gSE9TVERBVEEgKFNDcG50LT5kZXZpY2UtPmhvc3QpOyAJCQkvLyBQb2ludGVyIHRvIGFkYXB0ZXIgY29udHJvbCBzdHJ1Y3R1cmUKLQlQT1VSX0RFVklDRSAJCXBkZXYJID0gJnBhZGFwdGVyLT5kZXZpY2UgW1NDcG50LT5kZXZpY2UtPmlkXTsvLyBQb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgotCVVDSEFSCQkJcmM7CQkJCQkJCQkJCQkvLyBjb21tYW5kIHJldHVybiBjb2RlCisJVUNIQVIgKmNkYiA9IChVQ0hBUiAqKVNDcG50LT5jbW5kOworCS8vIFBvaW50ZXIgdG8gU0NTSSBDREIKKwlQQURBUFRFUjI0MEkgcGFkYXB0ZXIgPSBIT1NUREFUQSAoU0NwbnQtPmRldmljZS0+aG9zdCk7CisJLy8gUG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgc3RydWN0dXJlCisJUE9VUl9ERVZJQ0UgcGRldiA9ICZwYWRhcHRlci0+ZGV2aWNlIFtTQ3BudC0+ZGV2aWNlLT5pZF07CisJLy8gUG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKwlVQ0hBUiByYzsKKwkvLyBjb21tYW5kIHJldHVybiBjb2RlCiAKIAlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKIAlwYWRhcHRlci0+aWRlLmlkZS5pZGVzLnNwaWdvdCA9IHBkZXYtPnNwaWdvdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmggYi9kcml2ZXJzL3Njc2kvcHNpMjQwaS5oCmluZGV4IDZhNTk4NzYuLjIxZWJiOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wc2kyNDBpLmgKKysrIGIvZHJpdmVycy9zY3NpL3BzaTI0MGkuaApAQCAtMzA5LDcgKzMwOSw3IEBACiAjZW5kaWYJLy8gUFNJX0VJREVfU0NTSU9QCiAKIC8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKLWludCBQc2kyNDBpX0NvbW1hbmQJCQkoU2NzaV9DbW5kICpTQ3BudCk7Ci1pbnQgUHNpMjQwaV9BYm9ydAkJCShTY3NpX0NtbmQgKlNDcG50KTsKLWludCBQc2kyNDBpX1Jlc2V0CQkJKFNjc2lfQ21uZCAqU0NwbnQsIHVuc2lnbmVkIGludCBmbGFncyk7CitpbnQgUHNpMjQwaV9Db21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK2ludCBQc2kyNDBpX0Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KTsKK2ludCBQc2kyNDBpX1Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwppbmRleCAyNTIxZDU0Li4xNmFmNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKQEAgLTkzMSwxMSArOTMxLDEwIEBACiAKIAljYXNlIEJVU19SRVNFVDoKIAkJaWYgKHFsYTEyODBfdmVyYm9zZSkKLQkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODAoJWxkOiVkKTogSXNzdWluZyBCVVMgIgotCQkJICAgICAgICJERVZJQ0UgUkVTRVRcbiIsIGhhLT5ob3N0X25vLCBidXMpOwotCQlpZiAocWxhMTI4MF9idXNfcmVzZXQoaGEsIGJ1cyA9PSAwKSkKKwkJCXByaW50ayhLRVJOX0lORk8gInFsYTEyODAoJWxkOiVkKTogSXNzdWVkIGJ1cyAiCisJCQkgICAgICAgInJlc2V0LlxuIiwgaGEtPmhvc3Rfbm8sIGJ1cyk7CisJCWlmIChxbGExMjgwX2J1c19yZXNldChoYSwgYnVzKSA9PSAwKQogCQkJcmVzdWx0ID0gU1VDQ0VTUzsKLQogCQlicmVhazsKIAogCWNhc2UgQURBUFRFUl9SRVNFVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IGVlNzVhNzEuLjdiMThhNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMzc5LDIxICszNzksMzcgQEAKIAkucmVhZCA9IHFsYTJ4MDBfc3lzZnNfcmVhZF9zZnAsCiB9OwogCitzdGF0aWMgc3RydWN0IHN5c2ZzX2VudHJ5IHsKKwljaGFyICpuYW1lOworCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyOworCWludCBpczRHQnBfb25seTsKK30gYmluX2ZpbGVfZW50cmllc1tdID0geworCXsgImZ3X2R1bXAiLCAmc3lzZnNfZndfZHVtcF9hdHRyLCB9LAorCXsgIm52cmFtIiwgJnN5c2ZzX252cmFtX2F0dHIsIH0sCisJeyAib3B0cm9tIiwgJnN5c2ZzX29wdHJvbV9hdHRyLCB9LAorCXsgIm9wdHJvbV9jdGwiLCAmc3lzZnNfb3B0cm9tX2N0bF9hdHRyLCB9LAorCXsgInZwZCIsICZzeXNmc192cGRfYXR0ciwgMSB9LAorCXsgInNmcCIsICZzeXNmc19zZnBfYXR0ciwgMSB9LAorCXsgTlVMTCB9LAorfTsKKwogdm9pZAogcWxhMngwMF9hbGxvY19zeXNmc19hdHRyKHNjc2lfcWxhX2hvc3RfdCAqaGEpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGhhLT5ob3N0OworCXN0cnVjdCBzeXNmc19lbnRyeSAqaXRlcjsKKwlpbnQgcmV0OwogCi0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX2Z3X2R1bXBfYXR0cik7Ci0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX252cmFtX2F0dHIpOwotCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosICZzeXNmc19vcHRyb21fYXR0cik7Ci0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKLQkgICAgJnN5c2ZzX29wdHJvbV9jdGxfYXR0cik7Ci0JaWYgKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTU0WFgoaGEpKSB7Ci0JCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosCi0JCSAgICAmc3lzZnNfdnBkX2F0dHIpOwotCQlzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLAotCQkgICAgJnN5c2ZzX3NmcF9hdHRyKTsKKwlmb3IgKGl0ZXIgPSBiaW5fZmlsZV9lbnRyaWVzOyBpdGVyLT5uYW1lOyBpdGVyKyspIHsKKwkJaWYgKGl0ZXItPmlzNEdCcF9vbmx5ICYmICghSVNfUUxBMjRYWChoYSkgJiYgIUlTX1FMQTU0WFgoaGEpKSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosCisJCSAgICBpdGVyLT5hdHRyKTsKKwkJaWYgKHJldCkKKwkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgICAiVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyAlcyBiaW5hcnkgYXR0cmlidXRlICIKKwkJCSAgICAiKCVkKS5cbiIsIGl0ZXItPm5hbWUsIHJldCk7CiAJfQogfQogCkBAIC00MDEsMTcgKzQxNywxNCBAQAogcWxhMngwMF9mcmVlX3N5c2ZzX2F0dHIoc2NzaV9xbGFfaG9zdF90ICpoYSkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gaGEtPmhvc3Q7CisJc3RydWN0IHN5c2ZzX2VudHJ5ICppdGVyOwogCi0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX2Z3X2R1bXBfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgJnN5c2ZzX252cmFtX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosICZzeXNmc19vcHRyb21fYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKLQkgICAgJnN5c2ZzX29wdHJvbV9jdGxfYXR0cik7Ci0JaWYgKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTU0WFgoaGEpKSB7CisJZm9yIChpdGVyID0gYmluX2ZpbGVfZW50cmllczsgaXRlci0+bmFtZTsgaXRlcisrKSB7CisJCWlmIChpdGVyLT5pczRHQnBfb25seSAmJiAoIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEE1NFhYKGhhKSkpCisJCQljb250aW51ZTsKKwogCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLAotCQkgICAgJnN5c2ZzX3ZwZF9hdHRyKTsKLQkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKLQkJICAgICZzeXNmc19zZnBfYXR0cik7CisJCSAgICBpdGVyLT5hdHRyKTsKIAl9CiAKIAlpZiAoaGEtPmJlYWNvbl9ibGlua19sZWQgPT0gMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAppbmRleCA5MGRhZDdlLi41YjEyMjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCkBAIC0zOCw3ICszOCw3IEBACiAqIE1hY3JvcyB1c2UgZm9yIGRlYnVnZ2luZyB0aGUgZHJpdmVyLgogKi8KIAotI2RlZmluZSBERUJVRyh4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBERUJVRyh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCiAKICNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEpCiAjZGVmaW5lIERFQlVHMSh4KQlkbyB7eDt9IHdoaWxlICgwKQpAQCAtNDYsMTIgKzQ2LDEyIEBACiAjZGVmaW5lIERFQlVHMSh4KQlkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCi0jZGVmaW5lIERFQlVHMih4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMyh4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfM18xMSh4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfOV8xMCh4KQlkbyB7IGlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMTEoeCkJZG8geyBpZiAocWxhMl9leHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUcyXzEzKHgpCWRvIHsgaWYgKHFsYTJfZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMih4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMl8zKHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKKyNkZWZpbmUgREVCVUcyXzNfMTEoeCkJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBERUJVRzJfOV8xMCh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMl8xMSh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHMl8xMyh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCiAKICNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCiAjZGVmaW5lIERFQlVHMyh4KQlkbyB7eDt9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IGJhYjMzZjYuLmM0ZmM0MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTE1NDUsNiArMTU0NSw5IEBACiAJc3BpbmxvY2tfdCBycG9ydF9sb2NrOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQsICpkcnBvcnQ7CiAJdTMyIHN1cHBvcnRlZF9jbGFzc2VzOworCisJdW5zaWduZWQgbG9uZyBsYXN0X3F1ZXVlX2Z1bGw7CisJdW5zaWduZWQgbG9uZyBsYXN0X3JhbXBfdXA7CiB9IGZjX3BvcnRfdDsKIAogLyoKQEAgLTIyNTUsNiArMjI1OCw3IEBACiAJdWludDE2X3QJbWdtdF9zdnJfbG9vcF9pZDsKIAogICAgICAgICB1aW50MzJfdAlsb2dpbl9yZXRyeV9jb3VudDsKKwlpbnQJCW1heF9xX2RlcHRoOwogCiAJLyogRmlicmUgQ2hhbm5lbCBEZXZpY2UgTGlzdC4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWZjcG9ydHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggN2RhNjk4My4uMzJlYmVlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtNDgsNiArNDgsNyBAQAogZXh0ZXJuIHZvaWQgcWxhMngwMF9yZWdfcmVtb3RlX3BvcnQoc2NzaV9xbGFfaG9zdF90ICosIGZjX3BvcnRfdCAqKTsKIAogZXh0ZXJuIHZvaWQgcWxhMngwMF9hbGxvY19md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTJ4MDBfdHJ5X3RvX3N0b3BfZmlybXdhcmUoc2NzaV9xbGFfaG9zdF90ICopOwogCiAvKgogICogR2xvYmFsIERhdGEgaW4gcWxhX29zLmMgc291cmNlIGZpbGUuCkBAIC02MCw3ICs2MSw4IEBACiBleHRlcm4gaW50IHFsMnhsb2dpbnJldHJ5Y291bnQ7CiBleHRlcm4gaW50IHFsMnhmZG1pZW5hYmxlOwogZXh0ZXJuIGludCBxbDJ4YWxsb2Nmd2R1bXA7Ci1leHRlcm4gaW50IHFsYTJfZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZzsKK2V4dGVybiBpbnQgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmc7CitleHRlcm4gaW50IHFsMnhxZnVsbHJhbXB1cDsKIAogZXh0ZXJuIHZvaWQgcWxhMngwMF9zcF9jb21wbChzY3NpX3FsYV9ob3N0X3QgKiwgc3JiX3QgKik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IDgzM2I5MzAuLmE4MjNmMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtNTksOSArNTksNiBAQAogcWxhMngwMF9pbml0aWFsaXplX2FkYXB0ZXIoc2NzaV9xbGFfaG9zdF90ICpoYSkKIHsKIAlpbnQJcnZhbDsKLQl1aW50OF90CXJlc3RhcnRfcmlzYyA9IDA7Ci0JdWludDhfdAlyZXRyeTsKLQl1aW50MzJfdCB3YWl0X3RpbWU7CiAKIAkvKiBDbGVhciBhZGFwdGVyIGZsYWdzLiAqLwogCWhhLT5mbGFncy5vbmxpbmUgPSAwOwpAQCAtMTA0LDg3ICsxMDEsMTUgQEAKIAogCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlZlcmlmeWluZyBsb2FkZWQgUklTQyBjb2RlLi4uXG4iKTsKIAotCXJldHJ5ID0gMTA7Ci0JLyoKLQkgKiBUcnkgdG8gY29uZmlndXJlIHRoZSBsb29wLgotCSAqLwotCWRvIHsKLQkJcmVzdGFydF9yaXNjID0gMDsKLQotCQkvKiBJZiBmaXJtd2FyZSBuZWVkcyB0byBiZSBsb2FkZWQgKi8KLQkJaWYgKHFsYTJ4MDBfaXNwX2Zpcm13YXJlKGhhKSAhPSBRTEFfU1VDQ0VTUykgewotCQkJaWYgKChydmFsID0gaGEtPmlzcF9vcHMuY2hpcF9kaWFnKGhhKSkgPT0gUUxBX1NVQ0NFU1MpIHsKLQkJCQlydmFsID0gcWxhMngwMF9zZXR1cF9jaGlwKGhhKTsKLQkJCX0KLQkJfQotCi0JCWlmIChydmFsID09IFFMQV9TVUNDRVNTICYmCi0JCSAgICAocnZhbCA9IHFsYTJ4MDBfaW5pdF9yaW5ncyhoYSkpID09IFFMQV9TVUNDRVNTKSB7Ci1jaGVja19md19yZWFkeV9hZ2FpbjoKLQkJCS8qCi0JCQkgKiBXYWl0IGZvciBhIHN1Y2Nlc3NmdWwgTElQIHVwIHRvIGEgbWF4aW11bQotCQkJICogb2YgKGluIHNlY29uZHMpOiBSSVNDIGxvZ2luIHRpbWVvdXQgdmFsdWUsCi0JCQkgKiBSSVNDIHJldHJ5IGNvdW50IHZhbHVlLCBhbmQgcG9ydCBkb3duIHJldHJ5Ci0JCQkgKiB2YWx1ZSBPUiBhIG1pbmltdW0gb2YgNCBzZWNvbmRzIE9SIElmIG5vCi0JCQkgKiBjYWJsZSwgb25seSA1IHNlY29uZHMuCi0JCQkgKi8KLQkJCXJ2YWwgPSBxbGEyeDAwX2Z3X3JlYWR5KGhhKTsKLQkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7Ci0JCQkJY2xlYXJfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZoYS0+ZHBjX2ZsYWdzKTsKLQotCQkJCS8qIElzc3VlIGEgbWFya2VyIGFmdGVyIEZXIGJlY29tZXMgcmVhZHkuICovCi0JCQkJcWxhMngwMF9tYXJrZXIoaGEsIDAsIDAsIE1LX1NZTkNfQUxMKTsKLQotCQkJCS8qCi0JCQkJICogV2FpdCBhdCBtb3N0IE1BWF9UQVJHRVQgUlNDTnMgZm9yIGEgc3RhYmxlCi0JCQkJICogbGluay4KLQkJCQkgKi8KLQkJCQl3YWl0X3RpbWUgPSAyNTY7Ci0JCQkJZG8gewotCQkJCQljbGVhcl9iaXQoTE9PUF9SRVNZTkNfTkVFREVELAotCQkJCQkgICAgJmhhLT5kcGNfZmxhZ3MpOwotCQkJCQlydmFsID0gcWxhMngwMF9jb25maWd1cmVfbG9vcChoYSk7Ci0KLQkJCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJU1BfQUJPUlRfTkVFREVELAotCQkJCQkgICAgJmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCQkJCQlyZXN0YXJ0X3Jpc2MgPSAxOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiBJZiBsb29wIHN0YXRlIGNoYW5nZSB3aGlsZSB3ZSB3ZXJlCi0JCQkJCSAqIGRpc2NvdmVyeWluZyBkZXZpY2VzIHRoZW4gd2FpdCBmb3IKLQkJCQkJICogTElQIHRvIGNvbXBsZXRlCi0JCQkJCSAqLwotCi0JCQkJCWlmIChhdG9taWNfcmVhZCgmaGEtPmxvb3Bfc3RhdGUpICE9Ci0JCQkJCSAgICBMT09QX1JFQURZICYmIHJldHJ5LS0pIHsKLQkJCQkJCWdvdG8gY2hlY2tfZndfcmVhZHlfYWdhaW47Ci0JCQkJCX0KLQkJCQkJd2FpdF90aW1lLS07Ci0JCQkJfSB3aGlsZSAoIWF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgotCQkJCSAgICByZXRyeSAmJgotCQkJCSAgICB3YWl0X3RpbWUgJiYKLQkJCQkgICAgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwKLQkJCQkJJmhhLT5kcGNfZmxhZ3MpKSk7Ci0KLQkJCQlpZiAod2FpdF90aW1lID09IDApCi0JCQkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCQkJfSBlbHNlIGlmIChoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkKLQkJCQkvKiBJZiBubyBjYWJsZSwgdGhlbiBhbGwgaXMgZ29vZC4gKi8KLQkJCQlydmFsID0gUUxBX1NVQ0NFU1M7Ci0JCX0KLQl9IHdoaWxlIChyZXN0YXJ0X3Jpc2MgJiYgcmV0cnktLSk7Ci0KLQlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgewotCQljbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwotCQlxbGEyeDAwX21hcmtlcihoYSwgMCwgMCwgTUtfU1lOQ19BTEwpOwotCQloYS0+bWFya2VyX25lZWRlZCA9IDA7Ci0KLQkJaGEtPmZsYWdzLm9ubGluZSA9IDE7Ci0JfSBlbHNlIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcygpOiAqKioqIEZBSUxFRCAqKioqXG4iLCBfX2Z1bmNfXykpOworCWlmIChxbGEyeDAwX2lzcF9maXJtd2FyZShoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcnZhbCA9IGhhLT5pc3Bfb3BzLmNoaXBfZGlhZyhoYSk7CisJCWlmIChydmFsKQorCQkJcmV0dXJuIChydmFsKTsKKwkJcnZhbCA9IHFsYTJ4MDBfc2V0dXBfY2hpcChoYSk7CisJCWlmIChydmFsKQorCQkJcmV0dXJuIChydmFsKTsKIAl9CisJcnZhbCA9IHFsYTJ4MDBfaW5pdF9yaW5ncyhoYSk7CiAKIAlyZXR1cm4gKHJ2YWwpOwogfQpAQCAtMTY0NCw3ICsxNTY5LDcgQEAKIAkgKiBTZXQgaG9zdCBhZGFwdGVyIHBhcmFtZXRlcnMuCiAJICovCiAJaWYgKG52LT5ob3N0X3BbMF0gJiBCSVRfNykKLQkJcWxhMl9leHRlbmRlZF9lcnJvcl9sb2dnaW5nID0gMTsKKwkJcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPSAxOwogCWhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkID0gKChudi0+aG9zdF9wWzBdICYgQklUXzQpID8gMSA6IDApOwogCS8qIEFsd2F5cyBsb2FkIFJJU0MgY29kZSBvbiBub24gSVNQMlsxMl0wMCBjaGlwcy4gKi8KIAlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkKQEAgLTIyMDgsOCArMjEzMyw3IEBACiAKIAlhdG9taWNfc2V0KCZmY3BvcnQtPnN0YXRlLCBGQ1NfT05MSU5FKTsKIAotCWlmIChoYS0+ZmxhZ3MuaW5pdF9kb25lKQotCQlxbGEyeDAwX3JlZ19yZW1vdGVfcG9ydChoYSwgZmNwb3J0KTsKKwlxbGEyeDAwX3JlZ19yZW1vdGVfcG9ydChoYSwgZmNwb3J0KTsKIH0KIAogdm9pZApAQCAtMzk0OCwzICszODcyLDI0IEBACiBmYWlsX2Z3X2ludGVncml0eToKIAlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIH0KKwordm9pZAorcWxhMngwMF90cnlfdG9fc3RvcF9maXJtd2FyZShzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludCByZXQsIHJldHJpZXM7CisKKwlpZiAoIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEE1NFhYKGhhKSkKKwkJcmV0dXJuOworCisJcmV0ID0gcWxhMngwMF9zdG9wX2Zpcm13YXJlKGhhKTsKKwlmb3IgKHJldHJpZXMgPSA1OyByZXQgIT0gUUxBX1NVQ0NFU1MgJiYgcmV0cmllcyA7IHJldHJpZXMtLSkgeworCQlxbGEyeDAwX3Jlc2V0X2NoaXAoaGEpOworCQlpZiAocWxhMngwMF9jaGlwX2RpYWcoaGEpICE9IFFMQV9TVUNDRVNTKQorCQkJY29udGludWU7CisJCWlmIChxbGEyeDAwX3NldHVwX2NoaXAoaGEpICE9IFFMQV9TVUNDRVNTKQorCQkJY29udGludWU7CisJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJICAgICJBdHRlbXB0aW5nIHJldHJ5IG9mIHN0b3AtZmlybXdhcmUgY29tbWFuZC4uLlxuIik7CisJCXJldCA9IHFsYTJ4MDBfc3RvcF9maXJtd2FyZShoYSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IDYyNmM3MTcuLmQzYjZkZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTYsNiArNiw4IEBACiAgKi8KICNpbmNsdWRlICJxbGFfZGVmLmgiCiAKKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisKIHN0YXRpYyB2b2lkIHFsYTJ4MDBfbWJ4X2NvbXBsZXRpb24oc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90KTsKIHN0YXRpYyB2b2lkIHFsYTJ4MDBfYXN5bmNfZXZlbnQoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICopOwogc3RhdGljIHZvaWQgcWxhMngwMF9wcm9jZXNzX2NvbXBsZXRlZF9yZXF1ZXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQzMl90KTsKQEAgLTU5Myw2ICs1OTUsNjcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCitxbGEyeDAwX2FkanVzdF9zZGV2X3FkZXB0aF91cChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgKmRhdGEpCit7CisJZmNfcG9ydF90ICpmY3BvcnQgPSBkYXRhOworCisJaWYgKGZjcG9ydC0+aGEtPm1heF9xX2RlcHRoIDw9IHNkZXYtPnF1ZXVlX2RlcHRoKQorCQlyZXR1cm47CisKKwlpZiAoc2Rldi0+b3JkZXJlZF90YWdzKQorCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfT1JERVJFRF9UQUcsCisJCSAgICBzZGV2LT5xdWV1ZV9kZXB0aCArIDEpOworCWVsc2UKKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX1NJTVBMRV9UQUcsCisJCSAgICBzZGV2LT5xdWV1ZV9kZXB0aCArIDEpOworCisJZmNwb3J0LT5sYXN0X3JhbXBfdXAgPSBqaWZmaWVzOworCisJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBmY3BvcnQtPmhhLAorCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZSBkZXB0aCBhZGp1c3RlZC11cCB0byAlZC5cbiIsCisJICAgIGZjcG9ydC0+aGEtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4sCisJICAgIHNkZXYtPnF1ZXVlX2RlcHRoKSk7Cit9CisKK3N0YXRpYyB2b2lkCitxbGEyeDAwX2FkanVzdF9zZGV2X3FkZXB0aF9kb3duKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgdm9pZCAqZGF0YSkKK3sKKwlmY19wb3J0X3QgKmZjcG9ydCA9IGRhdGE7CisKKwlpZiAoIXNjc2lfdHJhY2tfcXVldWVfZnVsbChzZGV2LCBzZGV2LT5xdWV1ZV9kZXB0aCAtIDEpKQorCQlyZXR1cm47CisKKwlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGZjcG9ydC0+aGEsCisJICAgICJzY3NpKCVsZDolZDolZDolZCk6IFF1ZXVlIGRlcHRoIGFkanVzdGVkLWRvd24gdG8gJWQuXG4iLAorCSAgICBmY3BvcnQtPmhhLT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuLAorCSAgICBzZGV2LT5xdWV1ZV9kZXB0aCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FsYTJ4MDBfcmFtcF91cF9xdWV1ZV9kZXB0aChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzcmJfdCAqc3ApCit7CisJZmNfcG9ydF90ICpmY3BvcnQ7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJc2RldiA9IHNwLT5jbWQtPmRldmljZTsKKwlpZiAoc2Rldi0+cXVldWVfZGVwdGggPj0gaGEtPm1heF9xX2RlcHRoKQorCQlyZXR1cm47CisKKwlmY3BvcnQgPSBzcC0+ZmNwb3J0OworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLAorCSAgICBmY3BvcnQtPmxhc3RfcmFtcF91cCArIHFsMnhxZnVsbHJhbXB1cCAqIEhaKSkKKwkJcmV0dXJuOworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLAorCSAgICBmY3BvcnQtPmxhc3RfcXVldWVfZnVsbCArIHFsMnhxZnVsbHJhbXB1cCAqIEhaKSkKKwkJcmV0dXJuOworCisJc3Bpbl91bmxvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJc3RhcmdldF9mb3JfZWFjaF9kZXZpY2Uoc2Rldi0+c2Rldl90YXJnZXQsIGZjcG9ydCwKKwkgICAgcWxhMngwMF9hZGp1c3Rfc2Rldl9xZGVwdGhfdXApOworCXNwaW5fbG9ja19pcnEoJmhhLT5oYXJkd2FyZV9sb2NrKTsKK30KKwogLyoqCiAgKiBxbGEyeDAwX3Byb2Nlc3NfY29tcGxldGVkX3JlcXVlc3QoKSAtIFByb2Nlc3MgYSBGYXN0IFBvc3QgcmVzcG9uc2UuCiAgKiBAaGE6IFNDU0kgZHJpdmVyIEhBIGNvbnRleHQKQEAgLTYyNCw2ICs2ODcsOCBAQAogCiAJCS8qIFNhdmUgSVNQIGNvbXBsZXRpb24gc3RhdHVzICovCiAJCXNwLT5jbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNjsKKworCQlxbGEyeDAwX3JhbXBfdXBfcXVldWVfZGVwdGgoaGEsIHNwKTsKIAkJcWxhMngwMF9zcF9jb21wbChoYSwgc3ApOwogCX0gZWxzZSB7CiAJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW52YWxpZCBJU1AgU0NTSSBjb21wbGV0aW9uIGhhbmRsZVxuIiwKQEAgLTgyMyw2ICs4ODgsNyBAQAogCSAqLwogCXN3aXRjaCAoY29tcF9zdGF0dXMpIHsKIAljYXNlIENTX0NPTVBMRVRFOgorCWNhc2UgQ1NfUVVFVUVfRlVMTDoKIAkJaWYgKHNjc2lfc3RhdHVzID09IDApIHsKIAkJCWNwLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CiAJCQlicmVhazsKQEAgLTg0OSw2ICs5MTUsMjAgQEAKIAkJfQogCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgbHNjc2lfc3RhdHVzOwogCisJCWlmIChsc2NzaV9zdGF0dXMgPT0gU0FNX1NUQVRfVEFTS19TRVRfRlVMTCkgeworCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KKwkJCSAgICAic2NzaSglbGQpOiBRVUVVRSBGVUxMIHN0YXR1cyBkZXRlY3RlZCAiCisJCQkgICAgIjB4JXgtMHgleC5cbiIsIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywKKwkJCSAgICBzY3NpX3N0YXR1cykpOworCisJCQkvKiBBZGp1c3QgcXVldWUgZGVwdGggZm9yIGFsbCBsdW5zIG9uIHRoZSBwb3J0LiAqLworCQkJZmNwb3J0LT5sYXN0X3F1ZXVlX2Z1bGwgPSBqaWZmaWVzOworCQkJc3Bpbl91bmxvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CisJCQlzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZShjcC0+ZGV2aWNlLT5zZGV2X3RhcmdldCwKKwkJCSAgICBmY3BvcnQsIHFsYTJ4MDBfYWRqdXN0X3NkZXZfcWRlcHRoX2Rvd24pOworCQkJc3Bpbl9sb2NrX2lycSgmaGEtPmhhcmR3YXJlX2xvY2spOworCQkJYnJlYWs7CisJCX0KIAkJaWYgKGxzY3NpX3N0YXR1cyAhPSBTU19DSEVDS19DT05ESVRJT04pCiAJCQlicmVhazsKIApAQCAtMTA2NiwxNyArMTE0Niw2IEBACiAJCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QoaGEsIGZjcG9ydCwgMSwgMSk7CiAJCWJyZWFrOwogCi0JY2FzZSBDU19RVUVVRV9GVUxMOgotCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgInNjc2koJWxkKTogUVVFVUUgRlVMTCBzdGF0dXMgZGV0ZWN0ZWQgMHgleC0weCV4LlxuIiwKLQkJICAgIGhhLT5ob3N0X25vLCBjb21wX3N0YXR1cywgc2NzaV9zdGF0dXMpKTsKLQotCQkvKiBTQ1NJIE1pZC1MYXllciBoYW5kbGVzIGRldmljZSBxdWV1ZSBmdWxsICovCi0KLQkJY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IGxzY3NpX3N0YXR1czsKLQotCQlicmVhazsKLQogCWRlZmF1bHQ6CiAJCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRXJyb3IgZGV0ZWN0ZWQgKHVua25vd24gc3RhdHVzKSAiCiAJCSAgICAiMHgleC0weCV4LlxuIiwgaGEtPmhvc3Rfbm8sIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCAzZjIwZDc2Li5kMDM1MjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMjQsNyArMjQsNyBAQAogLyoKICAqIFNSQiBhbGxvY2F0aW9uIGNhY2hlCiAgKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnNyYl9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNyYl9jYWNoZXA7CiAKIC8qCiAgKiBJb2N0bCByZWxhdGVkIGluZm9ybWF0aW9uLgpAQCAtNjEsOSArNjEsOSBAQAogCQkiZHVyaW5nIEhCQSBpbml0aWFsaXphdGlvbi4gIE1lbW9yeSBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyAiCiAJCSJ2YXJ5IGJ5IElTUCB0eXBlLiAgRGVmYXVsdCBpcyAxIC0gYWxsb2NhdGUgbWVtb3J5LiIpOwogCi1pbnQgcWxhMl9leHRlbmRlZF9lcnJvcl9sb2dnaW5nOwotbW9kdWxlX3BhcmFtKHFsYTJfZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZywgaW50LCBTX0lSVUdPfFNfSVJVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsCitpbnQgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmc7Cittb2R1bGVfcGFyYW0ocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsIGludCwgU19JUlVHT3xTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsCiAJCSJPcHRpb24gdG8gZW5hYmxlIGV4dGVuZGVkIGVycm9yIGxvZ2dpbmcsICIKIAkJIkRlZmF1bHQgaXMgMCAtIG5vIGxvZ2dpbmcuIDEgLSBsb2cgZXJyb3JzLiIpOwogCkBAIC03NywxMSArNzcsMjYgQEAKIAkJIkVuYWJsZXMgRkRNSSByZWdpc3RyYXRvbnMgIgogCQkiRGVmYXVsdCBpcyAwIC0gbm8gRkRNSS4gMSAtIHBlcmZvbSBGRE1JLiIpOwogCisjZGVmaW5lIE1BWF9RX0RFUFRIICAgIDMyCitzdGF0aWMgaW50IHFsMnhtYXhxZGVwdGggPSBNQVhfUV9ERVBUSDsKK21vZHVsZV9wYXJhbShxbDJ4bWF4cWRlcHRoLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhtYXhxZGVwdGgsCisJCSJNYXhpbXVtIHF1ZXVlIGRlcHRoIHRvIHJlcG9ydCBmb3IgdGFyZ2V0IGRldmljZXMuIik7CisKK2ludCBxbDJ4cWZ1bGxyYW1wdXAgPSAxMjA7Cittb2R1bGVfcGFyYW0ocWwyeHFmdWxscmFtcHVwLCBpbnQsIFNfSVJVR098U19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHFsMnhxZnVsbHJhbXB1cCwKKwkJIk51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgdG8gYmVnaW4gdG8gcmFtcC11cCB0aGUgcXVldWUgIgorCQkiZGVwdGggZm9yIGEgZGV2aWNlIGFmdGVyIGEgcXVldWUtZnVsbCBjb25kaXRpb24gaGFzIGJlZW4gIgorCQkiZGV0ZWN0ZWQuICBEZWZhdWx0IGlzIDEyMCBzZWNvbmRzLiIpOworCiAvKgogICogU0NTSSBob3N0IHRlbXBsYXRlIGVudHJ5IHBvaW50cwogICovCiBzdGF0aWMgaW50IHFsYTJ4eHhfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqIGRldmljZSk7CiBzdGF0aWMgaW50IHFsYTJ4eHhfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICopOworc3RhdGljIGludCBxbGEyeHh4X3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqLCB1bnNpZ25lZCBsb25nIHRpbWUpOworc3RhdGljIHZvaWQgcWxhMnh4eF9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKik7CiBzdGF0aWMgdm9pZCBxbGEyeHh4X3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICopOwogc3RhdGljIGludCBxbGEyeDAwX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCiAJCXZvaWQgKCpmbikoc3RydWN0IHNjc2lfY21uZCAqKSk7CkBAIC0xMTEsNiArMTI2LDggQEAKIAogCS5zbGF2ZV9hbGxvYwkJPSBxbGEyeHh4X3NsYXZlX2FsbG9jLAogCS5zbGF2ZV9kZXN0cm95CQk9IHFsYTJ4eHhfc2xhdmVfZGVzdHJveSwKKwkuc2Nhbl9maW5pc2hlZAkJPSBxbGEyeHh4X3NjYW5fZmluaXNoZWQsCisJLnNjYW5fc3RhcnQJCT0gcWxhMnh4eF9zY2FuX3N0YXJ0LAogCS5jaGFuZ2VfcXVldWVfZGVwdGgJPSBxbGEyeDAwX2NoYW5nZV9xdWV1ZV9kZXB0aCwKIAkuY2hhbmdlX3F1ZXVlX3R5cGUJPSBxbGEyeDAwX2NoYW5nZV9xdWV1ZV90eXBlLAogCS50aGlzX2lkCQk9IC0xLApAQCAtMjc0LDcgKzI5MSw3IEBACiAJcmV0dXJuIHN0cjsKIH0KIAotY2hhciAqCitzdGF0aWMgY2hhciAqCiBxbGEyeDAwX2Z3X3ZlcnNpb25fc3RyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqc3RyKQogewogCWNoYXIgdW5fc3RyWzEwXTsKQEAgLTMxMiw3ICszMjksNyBAQAogCXJldHVybiAoc3RyKTsKIH0KIAotY2hhciAqCitzdGF0aWMgY2hhciAqCiBxbGEyNHh4X2Z3X3ZlcnNpb25fc3RyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgY2hhciAqc3RyKQogewogCXNwcmludGYoc3RyLCAiJWQuJTAyZC4lMDJkICIsIGhhLT5md19tYWpvcl92ZXJzaW9uLApAQCAtNjIxLDcgKzYzOCw3IEBACiAqIE5vdGU6CiAqICAgIE9ubHkgcmV0dXJuIEZBSUxFRCBpZiBjb21tYW5kIG5vdCByZXR1cm5lZCBieSBmaXJtd2FyZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50CitzdGF0aWMgaW50CiBxbGEyeHh4X2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3QoY21kLT5kZXZpY2UtPmhvc3QpOwpAQCAtNzU4LDcgKzc3NSw3IEBACiAqICAgIFNVQ0NFU1MvRkFJTFVSRSAoZGVmaW5lZCBhcyBtYWNybyBpbiBzY3NpLmgpLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKK3N0YXRpYyBpbnQKIHFsYTJ4eHhfZWhfZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3QoY21kLT5kZXZpY2UtPmhvc3QpOwpAQCAtODg5LDcgKzkwNiw3IEBACiAqICAgIFNVQ0NFU1MvRkFJTFVSRSAoZGVmaW5lZCBhcyBtYWNybyBpbiBzY3NpLmgpLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKK3N0YXRpYyBpbnQKIHFsYTJ4eHhfZWhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3QoY21kLT5kZXZpY2UtPmhvc3QpOwpAQCAtOTUwLDcgKzk2Nyw3IEBACiAqCiAqIE5vdGU6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAorc3RhdGljIGludAogcWxhMnh4eF9laF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX2hvc3QoY21kLT5kZXZpY2UtPmhvc3QpOwpAQCAtMTEwNCw5ICsxMTIxLDkgQEAKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzZGV2LT5zZGV2X3RhcmdldCk7CiAKIAlpZiAoc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCkKLQkJc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgMzIpOworCQlzY3NpX2FjdGl2YXRlX3RjcShzZGV2LCBoYS0+bWF4X3FfZGVwdGgpOwogCWVsc2UKLQkJc2NzaV9kZWFjdGl2YXRlX3RjcShzZGV2LCAzMik7CisJCXNjc2lfZGVhY3RpdmF0ZV90Y3Eoc2RldiwgaGEtPm1heF9xX2RlcHRoKTsKIAogCXJwb3J0LT5kZXZfbG9zc190bW8gPSBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50ICsgNTsKIApAQCAtMTM1Myw2ICsxMzcwLDI5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQKK3FsYTJ4eHhfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKmhhID0gKHNjc2lfcWxhX2hvc3RfdCAqKXNob3N0LT5ob3N0ZGF0YTsKKworCXNldF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmaGEtPmRwY19mbGFncyk7CisJc2V0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmhhLT5kcGNfZmxhZ3MpOworCXNldF9iaXQoUlNDTl9VUERBVEUsICZoYS0+ZHBjX2ZsYWdzKTsKK30KKworc3RhdGljIGludAorcWxhMnh4eF9zY2FuX2ZpbmlzaGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBsb25nIHRpbWUpCit7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IChzY3NpX3FsYV9ob3N0X3QgKilzaG9zdC0+aG9zdGRhdGE7CisKKwlpZiAoIWhhLT5ob3N0KQorCQlyZXR1cm4gMTsKKwlpZiAodGltZSA+IGhhLT5sb29wX3Jlc2V0X2RlbGF5ICogSFopCisJCXJldHVybiAxOworCisJcmV0dXJuIGF0b21pY19yZWFkKCZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9SRUFEWTsKK30KKwogLyoKICAqIFBDSSBkcml2ZXIgaW50ZXJmYWNlCiAgKi8KQEAgLTEzNjQsMTAgKzE0MDQsOCBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJc2NzaV9xbGFfaG9zdF90ICpoYTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKLQl1bnNpZ25lZCBsb25nCXdhaXRfc3dpdGNoID0gMDsKIAljaGFyIHBjaV9pbmZvWzIwXTsKIAljaGFyIGZ3X3N0clszMF07Ci0JZmNfcG9ydF90ICpmY3BvcnQ7CiAJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0OwogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQpAQCAtMTQxMyw2ICsxNDUxLDEwIEBACiAJaGEtPmxpbmtfZGF0YV9yYXRlID0gUE9SVF9TUEVFRF9VTktOT1dOOwogCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzIzMDA7CiAKKwloYS0+bWF4X3FfZGVwdGggPSBNQVhfUV9ERVBUSDsKKwlpZiAocWwyeG1heHFkZXB0aCAhPSAwICYmIHFsMnhtYXhxZGVwdGggPD0gMHhmZmZmVSkKKwkJaGEtPm1heF9xX2RlcHRoID0gcWwyeG1heHFkZXB0aDsKKwogCS8qIEFzc2lnbiBJU1Agc3BlY2lmaWMgb3BlcmF0aW9ucy4gKi8KIAloYS0+aXNwX29wcy5wY2lfY29uZmlnCQk9IHFsYTIxMDBfcGNpX2NvbmZpZzsKIAloYS0+aXNwX29wcy5yZXNldF9jaGlwCQk9IHFsYTJ4MDBfcmVzZXRfY2hpcDsKQEAgLTE2MTQsMzAgKzE2NTYsMTkgQEAKIAogCWhhLT5pc3Bfb3BzLmVuYWJsZV9pbnRycyhoYSk7CiAKLQkvKiB2Mi4xOS41YjYgKi8KLQkvKgotCSAqIFdhaXQgYXJvdW5kIG1heCBsb29wX3Jlc2V0X2RlbGF5IHNlY3MgZm9yIHRoZSBkZXZpY2VzIHRvIGNvbWUKLQkgKiBvbi1saW5lLiBXZSBkb24ndCB3YW50IExpbnV4IHNjYW5uaW5nIGJlZm9yZSB3ZSBhcmUgcmVhZHkuCi0JICoKLQkgKi8KLQlmb3IgKHdhaXRfc3dpdGNoID0gamlmZmllcyArIChoYS0+bG9vcF9yZXNldF9kZWxheSAqIEhaKTsKLQkgICAgdGltZV9iZWZvcmUoamlmZmllcyx3YWl0X3N3aXRjaCkgJiYKLQkgICAgICEoaGEtPmRldmljZV9mbGFncyAmIChERkxHX05PX0NBQkxFIHwgREZMR19GQUJSSUNfREVWSUNFUykpCi0JICAgICAmJiAoaGEtPmRldmljZV9mbGFncyAmIFNXSVRDSF9GT1VORCkgOykgewotCi0JCXFsYTJ4MDBfY2hlY2tfZmFicmljX2RldmljZXMoaGEpOwotCi0JCW1zbGVlcCgxMCk7Ci0JfQotCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGhhKTsKKwogCWhhLT5mbGFncy5pbml0X2RvbmUgPSAxOworCWhhLT5mbGFncy5vbmxpbmUgPSAxOworCiAJbnVtX2hvc3RzKys7CiAKIAlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZwZGV2LT5kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gcHJvYmVfZmFpbGVkOwogCisJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CisKIAlxbGEyeDAwX2FsbG9jX3N5c2ZzX2F0dHIoaGEpOwogCiAJcWxhMngwMF9pbml0X2hvc3RfYXR0cihoYSk7CkBAIC0xNjUyLDEwICsxNjgzLDYgQEAKIAkgICAgaGEtPmZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nID8gJysnOiAnLScsIGhhLT5ob3N0X25vLAogCSAgICBoYS0+aXNwX29wcy5md192ZXJzaW9uX3N0cihoYSwgZndfc3RyKSk7CiAKLQkvKiBHbyB3aXRoIGZjX3Jwb3J0IHJlZ2lzdHJhdGlvbi4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjcG9ydCwgJmhhLT5mY3BvcnRzLCBsaXN0KQotCQlxbGEyeDAwX3JlZ19yZW1vdGVfcG9ydChoYSwgZmNwb3J0KTsKLQogCXJldHVybiAwOwogCiBwcm9iZV9mYWlsZWQ6CkBAIC0xNzEyLDggKzE3MzksMTAgQEAKIAlpZiAoaGEtPmVmdCkKIAkJcWxhMngwMF90cmFjZV9jb250cm9sKGhhLCBUQ19ESVNBQkxFLCAwLCAwKTsKIAorCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCiAJLyogU3RvcCBjdXJyZW50bHkgZXhlY3V0aW5nIGZpcm13YXJlLiAqLwotCXFsYTJ4MDBfc3RvcF9maXJtd2FyZShoYSk7CisJcWxhMngwMF90cnlfdG9fc3RvcF9maXJtd2FyZShoYSk7CiAKIAkvKiB0dXJuLW9mZiBpbnRlcnJ1cHRzIG9uIHRoZSBjYXJkICovCiAJaWYgKGhhLT5pbnRlcnJ1cHRzX29uKQpAQCAtMTcyMSw4ICsxNzUwLDYgQEAKIAogCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOwogCi0JaGEtPmZsYWdzLm9ubGluZSA9IDA7Ci0KIAkvKiBEZXRhY2ggaW50ZXJydXB0cyAqLwogCWlmIChoYS0+aG9zdC0+aXJxKQogCQlmcmVlX2lycShoYS0+aG9zdC0+aXJxLCBoYSk7CkBAIC0yNjk3LDcgKzI3MjQsNyBAQAogCiAJLyogRGVyaXZlIHZlcnNpb24gc3RyaW5nLiAqLwogCXN0cmNweShxbGEyeDAwX3ZlcnNpb25fc3RyLCBRTEEyWFhYX1ZFUlNJT04pOwotCWlmIChxbGEyX2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpCisJaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKQogCQlzdHJjYXQocWxhMngwMF92ZXJzaW9uX3N0ciwgIi1kZWJ1ZyIpOwogCiAJcWxhMnh4eF90cmFuc3BvcnRfdGVtcGxhdGUgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCmluZGV4IGM3MWRiZDUuLjE1MzkwYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKQEAgLTQ0OSw3ICs0NDksNyBAQAogCXJldHVybiBGQVJYX0FDQ0VTU19OVlJBTV9EQVRBIHwgbmFkZHI7CiB9CiAKLXVpbnQzMl90CitzdGF0aWMgdWludDMyX3QKIHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChzY3NpX3FsYV9ob3N0X3QgKmhhLCB1aW50MzJfdCBhZGRyKQogewogCWludCBydmFsOwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJcmV0dXJuIGR3cHRyOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgZGF0YSkKIHsKIAlpbnQgcnZhbDsKQEAgLTUxMiw3ICs1MTIsNyBAQAogCXJldHVybiBydmFsOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcWxhMjR4eF9nZXRfZmxhc2hfbWFudWZhY3R1cmVyKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQ4X3QgKm1hbl9pZCwKICAgICB1aW50OF90ICpmbGFzaF9pZCkKIHsKQEAgLTUzNyw3ICs1MzcsNyBAQAogCX0KIH0KIAotaW50CitzdGF0aWMgaW50CiBxbGEyNHh4X3dyaXRlX2ZsYXNoX2RhdGEoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDMyX3QgKmR3cHRyLCB1aW50MzJfdCBmYWRkciwKICAgICB1aW50MzJfdCBkd29yZHMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAppbmRleCBlNTdiZjQ1Li4xZmEwYmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKQEAgLTcsNyArNyw3IEBACiAvKgogICogRHJpdmVyIHZlcnNpb24KICAqLwotI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMS4wNy1rMiIKKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDEuMDctazMiCiAKICNkZWZpbmUgUUxBX0RSSVZFUl9NQUpPUl9WRVIJOAogI2RlZmluZSBRTEFfRFJJVkVSX01JTk9SX1ZFUgkxCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9LY29uZmlnIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvS2NvbmZpZwppbmRleCAwOGEwN2YwLi42OWNiZmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgU0NTSV9RTEFfSVNDU0kKIAl0cmlzdGF0ZSAiUUxvZ2ljIElTUDRYWFggaG9zdCBhZGFwdGVyIGZhbWlseSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJICYmIFNDU0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmIE5FVAogCXNlbGVjdCBTQ1NJX0lTQ1NJX0FUVFJTCiAJLS0taGVscC0tLQogCVRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRTG9naWMgNDB4eCAoSVNQNFhYWCkgaVNDU0kgaG9zdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RiZy5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RiZy5jCmluZGV4IDc1MjAzMWYuLjdiNGUwNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kYmcuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGJnLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJICAgICAgIHJlYWR3KCZoYS0+cmVnLT51MS5pc3A0MDEwLm52cmFtKSk7CiAJfQogCi0JZWxzZSBpZiAoaXNfcWxhNDAyMihoYSkpIHsKKwllbHNlIGlmIChpc19xbGE0MDIyKGhhKSB8IGlzX3FsYTQwMzIoaGEpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIjB4JTAyWCBpbnRyX21hc2sJID0gMHglMDhYXG4iLAogCQkgICAgICAgKHVpbnQ4X3QpIG9mZnNldG9mKHN0cnVjdCBpc3BfcmVnLAogCQkJCQkgIHUxLmlzcDQwMjIuaW50cl9tYXNrKSwKQEAgLTExOSw3ICsxMTksNyBAQAogCQkgICAgICAgcmVhZHcoJmhhLT5yZWctPnUyLmlzcDQwMTAucG9ydF9lcnJfc3RhdHVzKSk7CiAJfQogCi0JZWxzZSBpZiAoaXNfcWxhNDAyMihoYSkpIHsKKwllbHNlIGlmIChpc19xbGE0MDIyKGhhKSB8IGlzX3FsYTQwMzIoaGEpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIlBhZ2UgMCBSZWdpc3RlcnM6XG4iKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiMHglMDJYIGV4dF9od19jb25mCSA9IDB4JTA4WFxuIiwKIAkJICAgICAgICh1aW50OF90KSBvZmZzZXRvZihzdHJ1Y3QgaXNwX3JlZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kYmcuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kYmcuaAppbmRleCAzZTk5ZGNmLi5kODYxYzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGJnLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RiZy5oCkBAIC0yMiwxNCArMjIsMTQgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKQotI2RlZmluZSBERUJVRzIoeCkgICAgICBkbyB7aWYocWxhNF9leHRlbmRlZF9lcnJvcl9sb2dnaW5nID09IDIpIHg7fSB3aGlsZSAoMCk7CisjZGVmaW5lIERFQlVHMih4KSAgICAgIGRvIHtpZihxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyA9PSAyKSB4O30gd2hpbGUgKDApOwogI2RlZmluZSBERUJVRzJfMyh4KSAgIGRvIHt4O30gd2hpbGUgKDApOwogI2Vsc2UJCQkJLyogICovCiAjZGVmaW5lIERFQlVHMih4KQlkbyB7fSB3aGlsZSAoMCk7CiAjZW5kaWYJCQkJLyogICovCiAKICNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCi0jZGVmaW5lIERFQlVHMyh4KSAgICAgIGRvIHtpZihxbGE0X2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPT0gMykgeDt9IHdoaWxlICgwKTsKKyNkZWZpbmUgREVCVUczKHgpICAgICAgZG8ge2lmKHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nID09IDMpIHg7fSB3aGlsZSAoMCk7CiAjZWxzZQkJCQkvKiAgKi8KICNkZWZpbmUgREVCVUczKHgpCWRvIHt9IHdoaWxlICgwKTsKICNpZiAhZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oCmluZGV4IGE3ZjZjN2IuLjQyNDllNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmgKQEAgLTQwLDcgKzQwLDExIEBACiAKICNpZm5kZWYgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNDAyMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A0MDIyCTB4NDAyMgotI2VuZGlmCQkJCS8qICAqLworI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNDAzMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A0MDMyCTB4NDAzMgorI2VuZGlmCiAKICNkZWZpbmUgUUxBX1NVQ0NFU1MJCQkwCiAjZGVmaW5lIFFMQV9FUlJPUgkJCTEKQEAgLTI3Nyw3ICsyODEsNiBAQAogI2RlZmluZSBBRl9JTlRFUlJVUFRTX09OCSAgICAgIDYgLyogMHgwMDAwMDA0MCBOb3QgVXNlZCAqLwogI2RlZmluZSBBRl9HRVRfQ1JBU0hfUkVDT1JECSAgICAgIDcgLyogMHgwMDAwMDA4MCAqLwogI2RlZmluZSBBRl9MSU5LX1VQCQkgICAgICA4IC8qIDB4MDAwMDAxMDAgKi8KLSNkZWZpbmUgQUZfVE9QQ0FUX0NISVBfUFJFU0VOVAkgICAgICA5IC8qIDB4MDAwMDAyMDAgKi8KICNkZWZpbmUgQUZfSVJRX0FUVEFDSEVECQkgICAgIDEwIC8qIDB4MDAwMDA0MDAgKi8KICNkZWZpbmUgQUZfSVNOU19DTURfSU5fUFJPQ0VTUwkgICAgIDEyIC8qIDB4MDAwMDEwMDAgKi8KICNkZWZpbmUgQUZfSVNOU19DTURfRE9ORQkgICAgIDEzIC8qIDB4MDAwMDIwMDAgKi8KQEAgLTMxNywxNiArMzIwLDE3IEBACiAJLyogTlZSQU0gcmVnaXN0ZXJzICovCiAJc3RydWN0IGVlcHJvbV9kYXRhICpudnJhbTsKIAlzcGlubG9ja190IGhhcmR3YXJlX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkOwotCXNwaW5sb2NrX3QgbGlzdF9sb2NrOwogCXVpbnQzMl90ICAgZWVwcm9tX2NtZF9kYXRhOwogCiAJLyogQ291bnRlcnMgZm9yIGdlbmVyYWwgc3RhdGlzdGljcyAqLworCXVpbnQ2NF90IGlzcl9jb3VudDsKIAl1aW50NjRfdCBhZGFwdGVyX2Vycm9yX2NvdW50OwogCXVpbnQ2NF90IGRldmljZV9lcnJvcl9jb3VudDsKIAl1aW50NjRfdCB0b3RhbF9pb19jb3VudDsKIAl1aW50NjRfdCB0b3RhbF9tYnl0ZXNfeGZlcnJlZDsKIAl1aW50NjRfdCBsaW5rX2ZhaWx1cmVfY291bnQ7CiAJdWludDY0X3QgaW52YWxpZF9jcmNfY291bnQ7CisJdWludDMyX3QgYnl0ZXNfeGZlcmVkOwogCXVpbnQzMl90IHNwdXJpb3VzX2ludF9jb3VudDsKIAl1aW50MzJfdCBhYm9ydGVkX2lvX2NvdW50OwogCXVpbnQzMl90IGlvX3RpbWVvdXRfY291bnQ7CkBAIC00MzgsNiArNDQyLDExIEBACiAJcmV0dXJuIGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNDAyMjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNfcWxhNDAzMihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJcmV0dXJuIGhhLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQNDAzMjsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYWRhcHRlcl91cChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJcmV0dXJuICh0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpICE9IDApICYmCkBAIC00NTEsNTggKzQ2MCw1OCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSogaXNwX3NlbWFwaG9yZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JcmV0dXJuIChpc19xbGE0MDIyKGhhKSA/Ci0JCSZoYS0+cmVnLT51MS5pc3A0MDIyLnNlbWFwaG9yZSA6Ci0JCSZoYS0+cmVnLT51MS5pc3A0MDEwLm52cmFtKTsKKwlyZXR1cm4gKGlzX3FsYTQwMTAoaGEpID8KKwkJJmhhLT5yZWctPnUxLmlzcDQwMTAubnZyYW0gOgorCQkmaGEtPnJlZy0+dTEuaXNwNDAyMi5zZW1hcGhvcmUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSogaXNwX252cmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlyZXR1cm4gKGlzX3FsYTQwMjIoaGEpID8KLQkJJmhhLT5yZWctPnUxLmlzcDQwMjIubnZyYW0gOgotCQkmaGEtPnJlZy0+dTEuaXNwNDAxMC5udnJhbSk7CisJcmV0dXJuIChpc19xbGE0MDEwKGhhKSA/CisJCSZoYS0+cmVnLT51MS5pc3A0MDEwLm52cmFtIDoKKwkJJmhhLT5yZWctPnUxLmlzcDQwMjIubnZyYW0pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSogaXNwX2V4dF9od19jb25mKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlyZXR1cm4gKGlzX3FsYTQwMjIoaGEpID8KLQkJJmhhLT5yZWctPnUyLmlzcDQwMjIucDAuZXh0X2h3X2NvbmYgOgotCQkmaGEtPnJlZy0+dTIuaXNwNDAxMC5leHRfaHdfY29uZik7CisJcmV0dXJuIChpc19xbGE0MDEwKGhhKSA/CisJCSZoYS0+cmVnLT51Mi5pc3A0MDEwLmV4dF9od19jb25mIDoKKwkJJmhhLT5yZWctPnUyLmlzcDQwMjIucDAuZXh0X2h3X2NvbmYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSogaXNwX3BvcnRfc3RhdHVzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlyZXR1cm4gKGlzX3FsYTQwMjIoaGEpID8KLQkJJmhhLT5yZWctPnUyLmlzcDQwMjIucDAucG9ydF9zdGF0dXMgOgotCQkmaGEtPnJlZy0+dTIuaXNwNDAxMC5wb3J0X3N0YXR1cyk7CisJcmV0dXJuIChpc19xbGE0MDEwKGhhKSA/CisJCSZoYS0+cmVnLT51Mi5pc3A0MDEwLnBvcnRfc3RhdHVzIDoKKwkJJmhhLT5yZWctPnUyLmlzcDQwMjIucDAucG9ydF9zdGF0dXMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSogaXNwX3BvcnRfY3RybChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JcmV0dXJuIChpc19xbGE0MDIyKGhhKSA/Ci0JCSZoYS0+cmVnLT51Mi5pc3A0MDIyLnAwLnBvcnRfY3RybCA6Ci0JCSZoYS0+cmVnLT51Mi5pc3A0MDEwLnBvcnRfY3RybCk7CisJcmV0dXJuIChpc19xbGE0MDEwKGhhKSA/CisJCSZoYS0+cmVnLT51Mi5pc3A0MDEwLnBvcnRfY3RybCA6CisJCSZoYS0+cmVnLT51Mi5pc3A0MDIyLnAwLnBvcnRfY3RybCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtKiBpc3BfcG9ydF9lcnJvcl9zdGF0dXMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCXJldHVybiAoaXNfcWxhNDAyMihoYSkgPwotCQkmaGEtPnJlZy0+dTIuaXNwNDAyMi5wMC5wb3J0X2Vycl9zdGF0dXMgOgotCQkmaGEtPnJlZy0+dTIuaXNwNDAxMC5wb3J0X2Vycl9zdGF0dXMpOworCXJldHVybiAoaXNfcWxhNDAxMChoYSkgPworCQkmaGEtPnJlZy0+dTIuaXNwNDAxMC5wb3J0X2Vycl9zdGF0dXMgOgorCQkmaGEtPnJlZy0+dTIuaXNwNDAyMi5wMC5wb3J0X2Vycl9zdGF0dXMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqIGlzcF9ncF9vdXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCXJldHVybiAoaXNfcWxhNDAyMihoYSkgPwotCQkmaGEtPnJlZy0+dTIuaXNwNDAyMi5wMC5ncF9vdXQgOgotCQkmaGEtPnJlZy0+dTIuaXNwNDAxMC5ncF9vdXQpOworCXJldHVybiAoaXNfcWxhNDAxMChoYSkgPworCQkmaGEtPnJlZy0+dTIuaXNwNDAxMC5ncF9vdXQgOgorCQkmaGEtPnJlZy0+dTIuaXNwNDAyMi5wMC5ncF9vdXQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBlZXByb21fZXh0X2h3X2NvbmZfb2Zmc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlyZXR1cm4gKGlzX3FsYTQwMjIoaGEpID8KLQkJb2Zmc2V0b2Yoc3RydWN0IGVlcHJvbV9kYXRhLCBpc3A0MDIyLmV4dF9od19jb25mKSAvIDIgOgotCQlvZmZzZXRvZihzdHJ1Y3QgZWVwcm9tX2RhdGEsIGlzcDQwMTAuZXh0X2h3X2NvbmYpIC8gMik7CisJcmV0dXJuIChpc19xbGE0MDEwKGhhKSA/CisJCW9mZnNldG9mKHN0cnVjdCBlZXByb21fZGF0YSwgaXNwNDAxMC5leHRfaHdfY29uZikgLyAyIDoKKwkJb2Zmc2V0b2Yoc3RydWN0IGVlcHJvbV9kYXRhLCBpc3A0MDIyLmV4dF9od19jb25mKSAvIDIpOwogfQogCiBpbnQgcWw0eHh4X3NlbV9zcGlubG9jayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLCB1MzIgc2VtX21hc2ssIHUzMiBzZW1fYml0cyk7CkBAIC01MTEsNTkgKzUyMCw1OSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBxbDR4eHhfbG9ja19mbGFzaChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYSkKIHsKLQlpZiAoaXNfcWxhNDAyMihhKSkKKwlpZiAoaXNfcWxhNDAxMChhKSkKKwkJcmV0dXJuIHFsNHh4eF9zZW1fc3BpbmxvY2soYSwgUUw0MDEwX0ZMQVNIX1NFTV9NQVNLLAorCQkJCQkgICBRTDQwMTBfRkxBU0hfU0VNX0JJVFMpOworCWVsc2UKIAkJcmV0dXJuIHFsNHh4eF9zZW1fc3BpbmxvY2soYSwgUUw0MDIyX0ZMQVNIX1NFTV9NQVNLLAogCQkJCQkgICAoUUw0MDIyX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwKIAkJCQkJICAgIChhLT5tYWNfaW5kZXgpKSA8PCAxMyk7Ci0JZWxzZQotCQlyZXR1cm4gcWw0eHh4X3NlbV9zcGlubG9jayhhLCBRTDQwMTBfRkxBU0hfU0VNX01BU0ssCi0JCQkJCSAgIFFMNDAxMF9GTEFTSF9TRU1fQklUUyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBxbDR4eHhfdW5sb2NrX2ZsYXNoKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICphKQogewotCWlmIChpc19xbGE0MDIyKGEpKQotCQlxbDR4eHhfc2VtX3VubG9jayhhLCBRTDQwMjJfRkxBU0hfU0VNX01BU0spOwotCWVsc2UKKwlpZiAoaXNfcWxhNDAxMChhKSkKIAkJcWw0eHh4X3NlbV91bmxvY2soYSwgUUw0MDEwX0ZMQVNIX1NFTV9NQVNLKTsKKwllbHNlCisJCXFsNHh4eF9zZW1fdW5sb2NrKGEsIFFMNDAyMl9GTEFTSF9TRU1fTUFTSyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHFsNHh4eF9sb2NrX252cmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICphKQogewotCWlmIChpc19xbGE0MDIyKGEpKQorCWlmIChpc19xbGE0MDEwKGEpKQorCQlyZXR1cm4gcWw0eHh4X3NlbV9zcGlubG9jayhhLCBRTDQwMTBfTlZSQU1fU0VNX01BU0ssCisJCQkJCSAgIFFMNDAxMF9OVlJBTV9TRU1fQklUUyk7CisJZWxzZQogCQlyZXR1cm4gcWw0eHh4X3NlbV9zcGlubG9jayhhLCBRTDQwMjJfTlZSQU1fU0VNX01BU0ssCiAJCQkJCSAgIChRTDQwMjJfUkVTT1VSQ0VfQklUU19CQVNFX0NPREUgfAogCQkJCQkgICAgKGEtPm1hY19pbmRleCkpIDw8IDEwKTsKLQllbHNlCi0JCXJldHVybiBxbDR4eHhfc2VtX3NwaW5sb2NrKGEsIFFMNDAxMF9OVlJBTV9TRU1fTUFTSywKLQkJCQkJICAgUUw0MDEwX05WUkFNX1NFTV9CSVRTKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHFsNHh4eF91bmxvY2tfbnZyYW0oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmEpCiB7Ci0JaWYgKGlzX3FsYTQwMjIoYSkpCi0JCXFsNHh4eF9zZW1fdW5sb2NrKGEsIFFMNDAyMl9OVlJBTV9TRU1fTUFTSyk7Ci0JZWxzZQorCWlmIChpc19xbGE0MDEwKGEpKQogCQlxbDR4eHhfc2VtX3VubG9jayhhLCBRTDQwMTBfTlZSQU1fU0VNX01BU0spOworCWVsc2UKKwkJcWw0eHh4X3NlbV91bmxvY2soYSwgUUw0MDIyX05WUkFNX1NFTV9NQVNLKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcWw0eHh4X2xvY2tfZHJ2cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYSkKIHsKLQlpZiAoaXNfcWxhNDAyMihhKSkKKwlpZiAoaXNfcWxhNDAxMChhKSkKKwkJcmV0dXJuIHFsNHh4eF9zZW1fbG9jayhhLCBRTDQwMTBfRFJWUl9TRU1fTUFTSywKKwkJCQkgICAgICAgUUw0MDEwX0RSVlJfU0VNX0JJVFMpOworCWVsc2UKIAkJcmV0dXJuIHFsNHh4eF9zZW1fbG9jayhhLCBRTDQwMjJfRFJWUl9TRU1fTUFTSywKIAkJCQkgICAgICAgKFFMNDAyMl9SRVNPVVJDRV9CSVRTX0JBU0VfQ09ERSB8CiAJCQkJCShhLT5tYWNfaW5kZXgpKSA8PCAxKTsKLQllbHNlCi0JCXJldHVybiBxbDR4eHhfc2VtX2xvY2soYSwgUUw0MDEwX0RSVlJfU0VNX01BU0ssCi0JCQkJICAgICAgIFFMNDAxMF9EUlZSX1NFTV9CSVRTKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHFsNHh4eF91bmxvY2tfZHJ2cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYSkKIHsKLQlpZiAoaXNfcWxhNDAyMihhKSkKLQkJcWw0eHh4X3NlbV91bmxvY2soYSwgUUw0MDIyX0RSVlJfU0VNX01BU0spOwotCWVsc2UKKwlpZiAoaXNfcWxhNDAxMChhKSkKIAkJcWw0eHh4X3NlbV91bmxvY2soYSwgUUw0MDEwX0RSVlJfU0VNX01BU0spOworCWVsc2UKKwkJcWw0eHh4X3NlbV91bmxvY2soYSwgUUw0MDIyX0RSVlJfU0VNX01BU0spOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZncuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oCmluZGV4IDQyNzQ4OWQuLjRlZWE4YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oCkBAIC0yOTYsNyArMjk2LDYgQEAKIC8qICBJU1AgU2VtYXBob3JlIGRlZmluaXRpb25zICovCiAKIC8qICBJU1AgR2VuZXJhbCBQdXJwb3NlIE91dHB1dCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBHUE9SX1RPUENBVF9SRVNFVAkJCTB4MDAwMDAwMDQKIAogLyogIHNoYWRvdyByZWdpc3RlcnMgKERNQSdkIGZyb20gSEEgdG8gc3lzdGVtIG1lbW9yeS4gIHJlYWQgb25seSkgKi8KIHN0cnVjdCBzaGFkb3dfcmVncyB7CkBAIC0zMzksMTAgKzMzOCwxMyBAQAogLyogIE1haWxib3ggY29tbWFuZCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBNQk9YX0NNRF9BQk9VVF9GVwkJCTB4MDAwOQogI2RlZmluZSBNQk9YX0NNRF9MVU5fUkVTRVQJCQkweDAwMTYKKyNkZWZpbmUgTUJPWF9DTURfR0VUX01BTkFHRU1FTlRfREFUQQkJMHgwMDFFCiAjZGVmaW5lIE1CT1hfQ01EX0dFVF9GV19TVEFUVVMJCQkweDAwMUYKICNkZWZpbmUgTUJPWF9DTURfU0VUX0lTTlNfU0VSVklDRQkJMHgwMDIxCiAjZGVmaW5lIElTTlNfRElTQUJMRQkJCQkwCiAjZGVmaW5lIElTTlNfRU5BQkxFCQkJCTEKKyNkZWZpbmUgTUJPWF9DTURfQ09QWV9GTEFTSAkJCTB4MDAyNAorI2RlZmluZSBNQk9YX0NNRF9XUklURV9GTEFTSAkJCTB4MDAyNQogI2RlZmluZSBNQk9YX0NNRF9SRUFEX0ZMQVNICQkJMHgwMDI2CiAjZGVmaW5lIE1CT1hfQ01EX0NMRUFSX0RBVEFCQVNFX0VOVFJZCQkweDAwMzEKICNkZWZpbmUgTUJPWF9DTURfQ09OTl9DTE9TRV9TRVNTX0xPR09VVAkJMHgwMDU2CkBAIC0zNjAsMTAgKzM2MiwxMyBAQAogI2RlZmluZSBEREJfRFNfU0VTU0lPTl9GQUlMRUQJCQkweDA2CiAjZGVmaW5lIEREQl9EU19MT0dJTl9JTl9QUk9DRVNTCQkJMHgwNwogI2RlZmluZSBNQk9YX0NNRF9HRVRfRldfU1RBVEUJCQkweDAwNjkKKyNkZWZpbmUgTUJPWF9DTURfR0VUX0lOSVRfRldfQ1RSTF9CTE9DS19ERUZBVUxUUyAweDAwNkEKKyNkZWZpbmUgTUJPWF9DTURfUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTCTB4MDA4NwogCiAvKiBNYWlsYm94IDEgKi8KICNkZWZpbmUgRldfU1RBVEVfUkVBRFkJCQkJMHgwMDAwCiAjZGVmaW5lIEZXX1NUQVRFX0NPTkZJR19XQUlUCQkJMHgwMDAxCisjZGVmaW5lIEZXX1NUQVRFX1dBSVRfTE9HSU4JCQkweDAwMDIKICNkZWZpbmUgRldfU1RBVEVfRVJST1IJCQkJMHgwMDA0CiAjZGVmaW5lIEZXX1NUQVRFX0RIQ1BfSU5fUFJPR1JFU1MJCTB4MDAwOAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaAppbmRleCAyYzgwM2VkLi4yMTIyOTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKQEAgLTgsNiArOCw3IEBACiAjaWZuZGVmIF9fUUxBNHhfR0JMX0gKICNkZWZpbmUJX19RTEE0eF9HQkxfSAogCitpbnQgcWw0eHh4X2xvY2tfZHJ2cl93YWl0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICphKTsKIGludCBxbGE0eHh4X3NlbmRfdGd0cyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIGNoYXIgKmlwLCB1aW50MTZfdCBwb3J0KTsKIGludCBxbGE0eHh4X3NlbmRfY29tbWFuZF90b19pc3Aoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3Qgc3JiICogc3JiKTsKIGludCBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLApAQCAtNzIsNyArNzMsNyBAQAogaW50IHFsYTR4eHhfcHJvY2Vzc19kZGJfY2hhbmdlZChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqIGhhLAogCQkJCXVpbnQzMl90IGZ3X2RkYl9pbmRleCwgdWludDMyX3Qgc3RhdGUpOwogCi1leHRlcm4gaW50IHFsYTRfZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZzsKK2V4dGVybiBpbnQgcWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmc7CiBleHRlcm4gaW50IHFsNHhkaXNjb3Zlcnl3YWl0OwogZXh0ZXJuIGludCBxbDR4ZG9udHJlc2V0aGJhOwotI2VuZGlmCQkJCS8qIF9RTEE0eF9HQkxfSCAqLworI2VuZGlmIC8qIF9RTEE0eF9HQkxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKaW5kZXggYmIzYTFjMS4uY2MyMTBmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCkBAIC0yNTksMTAgKzI1OSwxNiBAQAogCQkJICAgICAgInNlY29uZHMgZXhwaXJlZD0gJWRcbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKIAkJCSAgICAgIGhhLT5maXJtd2FyZV9zdGF0ZSwgaGEtPmFkZGxfZndfc3RhdGUsCiAJCQkgICAgICB0aW1lb3V0X2NvdW50KSk7CisJCWlmIChpc19xbGE0MDMyKGhhKSAmJgorCQkJIShoYS0+YWRkbF9md19zdGF0ZSAmIEZXX0FERFNUQVRFX0xJTktfVVApICYmCisJCQkodGltZW91dF9jb3VudCA8IEFEQVBURVJfSU5JVF9UT1YgLSA1KSkgeworCQkJYnJlYWs7CisJCX0KKwogCQltc2xlZXAoMTAwMCk7CiAJfQkJCS8qIGVuZCBvZiBmb3IgKi8KIAotCWlmICh0aW1lb3V0X2NvdW50IDw9IDApCisJaWYgKHRpbWVvdXRfY291bnQgPT0gMCkKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IEZXIEluaXRpYWxpemF0aW9uIHRpbWVkIG91dCFcbiIsCiAJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKIApAQCAtODA2LDMyICs4MTIsNiBAQAogCXJldHVybiBRTEFfU1VDQ0VTUzsKIH0KIAotLyoqCi0gKiBxbGE0MDEwX2dldF90b3BjYXRfcHJlc2VuY2UgLSBjaGVjayBpZiBpdCBpcyBRTEE0MDQwIFRvcENhdCBDaGlwCi0gKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqCi0gKiovCi1zdGF0aWMgaW50IHFsYTQwMTBfZ2V0X3RvcGNhdF9wcmVzZW5jZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MTZfdCB0b3BjYXQ7Ci0KLQlpZiAocWw0eHh4X2xvY2tfbnZyYW0oaGEpICE9IFFMQV9TVUNDRVNTKQotCQlyZXR1cm4gUUxBX0VSUk9SOwotCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCXRvcGNhdCA9IHJkX252cmFtX3dvcmQoaGEsIG9mZnNldG9mKHN0cnVjdCBlZXByb21fZGF0YSwKLQkJCQkJICAgIGlzcDQwMTAudG9wY2F0KSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQotCWlmICgodG9wY2F0ICYgVE9QQ0FUX01BU0spID09IFRPUENBVF9QUkVTRU5UKQotCQlzZXRfYml0KEFGX1RPUENBVF9DSElQX1BSRVNFTlQsICZoYS0+ZmxhZ3MpOwotCWVsc2UKLQkJY2xlYXJfYml0KEFGX1RPUENBVF9DSElQX1BSRVNFTlQsICZoYS0+ZmxhZ3MpOwotCXFsNHh4eF91bmxvY2tfbnZyYW0oaGEpOwotCXJldHVybiBRTEFfU1VDQ0VTUzsKLX0KLQotCiBzdGF0aWMgaW50IHFsYTR4eHhfY29uZmlnX252cmFtKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtODY2LDcgKzg0Niw3IEBACiAJCS8qIHNldCBkZWZhdWx0cyAqLwogCQlpZiAoaXNfcWxhNDAxMChoYSkpCiAJCQlleHRId0NvbmZpZy5Bc3VpbnQzMl90ID0gMHgxOTEyOwotCQllbHNlIGlmIChpc19xbGE0MDIyKGhhKSkKKwkJZWxzZSBpZiAoaXNfcWxhNDAyMihoYSkgfCBpc19xbGE0MDMyKGhhKSkKIAkJCWV4dEh3Q29uZmlnLkFzdWludDMyX3QgPSAweDAwMjM7CiAJfQogCURFQlVHKHByaW50aygic2NzaSVsZDogJXM6IFNldHRpbmcgZXh0SHdDb25maWcgdG8gMHhGRkZGJTA0eFxuIiwKQEAgLTkyNyw3ICs5MDcsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJd3JpdGVsKGppZmZpZXMsICZoYS0+cmVnLT5tYWlsYm94WzddKTsKLQlpZiAoaXNfcWxhNDAyMihoYSkpCisJaWYgKGlzX3FsYTQwMjIoaGEpIHwgaXNfcWxhNDAzMihoYSkpCiAJCXdyaXRlbChzZXRfcm1hc2soTlZSX1dSSVRFX0VOQUJMRSksCiAJCSAgICAgICAmaGEtPnJlZy0+dTEuaXNwNDAyMi5udnJhbSk7CiAKQEAgLTk3OCw3ICs5NTgsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgcWw0eHh4X2xvY2tfZHJ2cl93YWl0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICphKQoraW50IHFsNHh4eF9sb2NrX2RydnJfd2FpdChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYSkKIHsKICNkZWZpbmUgUUw0X0xPQ0tfRFJWUl9XQUlUCTMwMAogI2RlZmluZSBRTDRfTE9DS19EUlZSX1NMRUVQCTEwMApAQCAtMTAxOCwxMiArOTk4LDcgQEAKIAlpbnQgc29mdF9yZXNldCA9IDE7CiAJaW50IGNvbmZpZ19jaGlwID0gMDsKIAotCWlmIChpc19xbGE0MDEwKGhhKSl7Ci0JCWlmIChxbGE0MDEwX2dldF90b3BjYXRfcHJlc2VuY2UoaGEpICE9IFFMQV9TVUNDRVNTKQotCQkJcmV0dXJuIFFMQV9FUlJPUjsKLQl9Ci0KLQlpZiAoaXNfcWxhNDAyMihoYSkpCisJaWYgKGlzX3FsYTQwMjIoaGEpIHwgaXNfcWxhNDAzMihoYSkpCiAJCXFsNHh4eF9zZXRfbWFjX251bWJlcihoYSk7CiAKIAlpZiAocWw0eHh4X2xvY2tfZHJ2cl93YWl0KGhhKSAhPSBRTEFfU1VDQ0VTUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbmxpbmUuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbmxpbmUuaAppbmRleCAwZDYxNzk3Li42Mzc1ZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5saW5lLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lubGluZS5oCkBAIC0zOCw3ICszOCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIF9fcWxhNHh4eF9lbmFibGVfaW50cnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCWlmIChpc19xbGE0MDIyKGhhKSkgeworCWlmIChpc19xbGE0MDIyKGhhKSB8IGlzX3FsYTQwMzIoaGEpKSB7CiAJCXdyaXRlbChzZXRfcm1hc2soSU1SX1NDU0lfSU5UUl9FTkFCTEUpLAogCQkgICAgICAgJmhhLT5yZWctPnUxLmlzcDQwMjIuaW50cl9tYXNrKTsKIAkJcmVhZGwoJmhhLT5yZWctPnUxLmlzcDQwMjIuaW50cl9tYXNrKTsKQEAgLTUyLDcgKzUyLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19xbGE0eHh4X2Rpc2FibGVfaW50cnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewotCWlmIChpc19xbGE0MDIyKGhhKSkgeworCWlmIChpc19xbGE0MDIyKGhhKSB8IGlzX3FsYTQwMzIoaGEpKSB7CiAJCXdyaXRlbChjbHJfcm1hc2soSU1SX1NDU0lfSU5UUl9FTkFCTEUpLAogCQkgICAgICAgJmhhLT5yZWctPnUxLmlzcDQwMjIuaW50cl9tYXNrKTsKIAkJcmVhZGwoJmhhLT5yZWctPnUxLmlzcDQwMjIuaW50cl9tYXNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pb2NiLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW9jYi5jCmluZGV4IGMwYTI1NGIuLmQ0MWNlMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pb2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lvY2IuYwpAQCAtMjk0LDYgKzI5NCwxMiBAQAogCQkJY21kX2VudHJ5LT5jb250cm9sX2ZsYWdzID0gQ0ZfV1JJVEU7CiAJCWVsc2UgaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQogCQkJY21kX2VudHJ5LT5jb250cm9sX2ZsYWdzID0gQ0ZfUkVBRDsKKworCQloYS0+Ynl0ZXNfeGZlcmVkICs9IGNtZC0+cmVxdWVzdF9idWZmbGVuOworCQlpZiAoaGEtPmJ5dGVzX3hmZXJlZCAmIH4weEZGRkZGKXsKKwkJCWhhLT50b3RhbF9tYnl0ZXNfeGZlcnJlZCArPSBoYS0+Ynl0ZXNfeGZlcmVkID4+IDIwOworCQkJaGEtPmJ5dGVzX3hmZXJlZCAmPSAweEZGRkZGOworCQl9CiAJfQogCiAJLyogU2V0IHRhZ2dlZCBxdWV1ZWluZyBjb250cm9sIGZsYWdzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaXNyLmMKaW5kZXggMWUyODMzMi4uZWY5NzVlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pc3IuYwpAQCAtNjI3LDYgKzYyNyw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAorCWhhLT5pc3JfY291bnQrKzsKIAkvKgogCSAqIFJlcGVhdGVkbHkgc2VydmljZSBpbnRlcnJ1cHRzIHVwIHRvIGEgbWF4aW11bSBvZgogCSAqIE1BWF9SRVFTX1NFUlZJQ0VEX1BFUl9JTlRSCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKaW5kZXggZWY4MjM5OS4uYjcyMWRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYwpAQCAtNzAxLDcgKzcwMSw3IEBACiAJREVCVUczKHByaW50aygic2NzaSVsZDogQ29ubmVjdGlvbiBFdmVudCBMb2cgRHVtcCAoJWQgZW50cmllcyk6XG4iLAogCQkgICAgICBoYS0+aG9zdF9ubywgbnVtX3ZhbGlkX2VudHJpZXMpKTsKIAotCWlmIChxbGE0X2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPT0gMykgeworCWlmIChxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyA9PSAzKSB7CiAJCWlmIChvbGRlc3RfZW50cnkgPT0gMCkgewogCQkJLyogQ2lyY3VsYXIgQnVmZmVyIGhhcyBub3Qgd3JhcHBlZCBhcm91bmQgKi8KIAkJCWZvciAoaT0wOyBpIDwgbnVtX3ZhbGlkX2VudHJpZXM7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uYwppbmRleCBlMzk1N2NhLi41OGFmZDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnZyYW0uYwpAQCAtNywxNSArNywyMiBAQAogCiAjaW5jbHVkZSAicWw0X2RlZi5oIgogCitzdGF0aWMgaW5saW5lIHZvaWQgZWVwcm9tX2NtZCh1aW50MzJfdCBjbWQsIHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl3cml0ZWwoY21kLCBpc3BfbnZyYW0oaGEpKTsKKwlyZWFkbChpc3BfbnZyYW0oaGEpKTsKKwl1ZGVsYXkoMSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGVlcHJvbV9zaXplKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKLQlyZXR1cm4gaXNfcWxhNDAyMihoYSkgPyBGTTkzQzg2QV9TSVpFXzE2IDogRk05M0M2NkFfU0laRV8xNjsKKwlyZXR1cm4gaXNfcWxhNDAxMChoYSkgPyBGTTkzQzY2QV9TSVpFXzE2IDogRk05M0M4NkFfU0laRV8xNjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWVwcm9tX25vX2FkZHJfYml0cyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7Ci0JcmV0dXJuIGlzX3FsYTQwMjIoaGEpID8gRk05M0M4NkFfTk9fQUREUl9CSVRTXzE2IDoKLQkJRk05M0M1NkFfTk9fQUREUl9CSVRTXzE2OworCXJldHVybiBpc19xbGE0MDEwKGhhKSA/IEZNOTNDNTZBX05PX0FERFJfQklUU18xNiA6CisJCUZNOTNDODZBX05PX0FERFJfQklUU18xNiA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGVlcHJvbV9ub19kYXRhX2JpdHMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQpAQCAtMjgsOCArMzUsNyBAQAogCURFQlVHNShwcmludGsoS0VSTl9FUlIgImZtOTNjNTZhX3NlbGVjdDpcbiIpKTsKIAogCWhhLT5lZXByb21fY21kX2RhdGEgPSBBVUJVUk5fRUVQUk9NX0NTXzEgfCAweDAwMGYwMDAwOwotCXdyaXRlbChoYS0+ZWVwcm9tX2NtZF9kYXRhLCBpc3BfbnZyYW0oaGEpKTsKLQlyZWFkbChpc3BfbnZyYW0oaGEpKTsKKwllZXByb21fY21kKGhhLT5lZXByb21fY21kX2RhdGEsIGhhKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNDEsMTIgKzQ3LDEzIEBACiAJaW50IHByZXZpb3VzQml0OwogCiAJLyogQ2xvY2sgaW4gYSB6ZXJvLCB0aGVuIGRvIHRoZSBzdGFydCBiaXQuICovCi0Jd3JpdGVsKGhhLT5lZXByb21fY21kX2RhdGEgfCBBVUJVUk5fRUVQUk9NX0RPXzEsIGlzcF9udnJhbShoYSkpOwotCXdyaXRlbChoYS0+ZWVwcm9tX2NtZF9kYXRhIHwgQVVCVVJOX0VFUFJPTV9ET18xIHwKLQkgICAgICAgQVVCVVJOX0VFUFJPTV9DTEtfUklTRSwgaXNwX252cmFtKGhhKSk7Ci0Jd3JpdGVsKGhhLT5lZXByb21fY21kX2RhdGEgfCBBVUJVUk5fRUVQUk9NX0RPXzEgfAotCSAgICAgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMLCBpc3BfbnZyYW0oaGEpKTsKLQlyZWFkbChpc3BfbnZyYW0oaGEpKTsKKwllZXByb21fY21kKGhhLT5lZXByb21fY21kX2RhdGEgfCBBVUJVUk5fRUVQUk9NX0RPXzEsIGhhKTsKKworCWVlcHJvbV9jbWQoaGEtPmVlcHJvbV9jbWRfZGF0YSB8IEFVQlVSTl9FRVBST01fRE9fMSB8CisJICAgICAgIEFVQlVSTl9FRVBST01fQ0xLX1JJU0UsIGhhKTsKKwllZXByb21fY21kKGhhLT5lZXByb21fY21kX2RhdGEgfCBBVUJVUk5fRUVQUk9NX0RPXzEgfAorCSAgICAgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMLCBoYSk7CisKIAltYXNrID0gMSA8PCAoRk05M0M1NkFfQ01EX0JJVFMgLSAxKTsKIAogCS8qIEZvcmNlIHRoZSBwcmV2aW91cyBkYXRhIGJpdCB0byBiZSBkaWZmZXJlbnQuICovCkBAIC02MCwxNCArNjcsMTQgQEAKIAkJCSAqIElmIHRoZSBiaXQgY2hhbmdlZCwgdGhlbiBjaGFuZ2UgdGhlIERPIHN0YXRlIHRvCiAJCQkgKiBtYXRjaC4KIAkJCSAqLwotCQkJd3JpdGVsKGhhLT5lZXByb21fY21kX2RhdGEgfCBkYXRhQml0LCBpc3BfbnZyYW0oaGEpKTsKKwkJCWVlcHJvbV9jbWQoaGEtPmVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQsIGhhKTsKIAkJCXByZXZpb3VzQml0ID0gZGF0YUJpdDsKIAkJfQotCQl3cml0ZWwoaGEtPmVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQgfAotCQkgICAgICAgQVVCVVJOX0VFUFJPTV9DTEtfUklTRSwgaXNwX252cmFtKGhhKSk7Ci0JCXdyaXRlbChoYS0+ZWVwcm9tX2NtZF9kYXRhIHwgZGF0YUJpdCB8Ci0JCSAgICAgICBBVUJVUk5fRUVQUk9NX0NMS19GQUxMLCBpc3BfbnZyYW0oaGEpKTsKLQkJcmVhZGwoaXNwX252cmFtKGhhKSk7CisJCWVlcHJvbV9jbWQoaGEtPmVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQgfAorCQkgICAgICAgQVVCVVJOX0VFUFJPTV9DTEtfUklTRSwgaGEpOworCQllZXByb21fY21kKGhhLT5lZXByb21fY21kX2RhdGEgfCBkYXRhQml0IHwKKwkJICAgICAgIEFVQlVSTl9FRVBST01fQ0xLX0ZBTEwsIGhhKTsKKwogCQljbWQgPSBjbWQgPDwgMTsKIAl9CiAJbWFzayA9IDEgPDwgKGVlcHJvbV9ub19hZGRyX2JpdHMoaGEpIC0gMSk7CkBAIC04MiwxNCArODksMTUgQEAKIAkJCSAqIElmIHRoZSBiaXQgY2hhbmdlZCwgdGhlbiBjaGFuZ2UgdGhlIERPIHN0YXRlIHRvCiAJCQkgKiBtYXRjaC4KIAkJCSAqLwotCQkJd3JpdGVsKGhhLT5lZXByb21fY21kX2RhdGEgfCBkYXRhQml0LCBpc3BfbnZyYW0oaGEpKTsKKwkJCWVlcHJvbV9jbWQoaGEtPmVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQsIGhhKTsKKwogCQkJcHJldmlvdXNCaXQgPSBkYXRhQml0OwogCQl9Ci0JCXdyaXRlbChoYS0+ZWVwcm9tX2NtZF9kYXRhIHwgZGF0YUJpdCB8Ci0JCSAgICAgICBBVUJVUk5fRUVQUk9NX0NMS19SSVNFLCBpc3BfbnZyYW0oaGEpKTsKLQkJd3JpdGVsKGhhLT5lZXByb21fY21kX2RhdGEgfCBkYXRhQml0IHwKLQkJICAgICAgIEFVQlVSTl9FRVBST01fQ0xLX0ZBTEwsIGlzcF9udnJhbShoYSkpOwotCQlyZWFkbChpc3BfbnZyYW0oaGEpKTsKKwkJZWVwcm9tX2NtZChoYS0+ZWVwcm9tX2NtZF9kYXRhIHwgZGF0YUJpdCB8CisJCSAgICAgICBBVUJVUk5fRUVQUk9NX0NMS19SSVNFLCBoYSk7CisJCWVlcHJvbV9jbWQoaGEtPmVlcHJvbV9jbWRfZGF0YSB8IGRhdGFCaXQgfAorCQkgICAgICAgQVVCVVJOX0VFUFJPTV9DTEtfRkFMTCwgaGEpOworCiAJCWFkZHIgPSBhZGRyIDw8IDE7CiAJfQogCXJldHVybiAxOwpAQCAtOTgsOCArMTA2LDcgQEAKIHN0YXRpYyBpbnQgZm05M2M1NmFfZGVzZWxlY3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiBoYSkKIHsKIAloYS0+ZWVwcm9tX2NtZF9kYXRhID0gQVVCVVJOX0VFUFJPTV9DU18wIHwgMHgwMDBmMDAwMDsKLQl3cml0ZWwoaGEtPmVlcHJvbV9jbWRfZGF0YSwgaXNwX252cmFtKGhhKSk7Ci0JcmVhZGwoaXNwX252cmFtKGhhKSk7CisJZWVwcm9tX2NtZChoYS0+ZWVwcm9tX2NtZF9kYXRhLCBoYSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTExMiwxMiArMTE5LDEzIEBACiAJLyogUmVhZCB0aGUgZGF0YSBiaXRzCiAJICogVGhlIGZpcnN0IGJpdCBpcyBhIGR1bW15LiAgQ2xvY2sgcmlnaHQgb3ZlciBpdC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgZWVwcm9tX25vX2RhdGFfYml0cyhoYSk7IGkrKykgewotCQl3cml0ZWwoaGEtPmVlcHJvbV9jbWRfZGF0YSB8Ci0JCSAgICAgICBBVUJVUk5fRUVQUk9NX0NMS19SSVNFLCBpc3BfbnZyYW0oaGEpKTsKLQkJd3JpdGVsKGhhLT5lZXByb21fY21kX2RhdGEgfAotCQkgICAgICAgQVVCVVJOX0VFUFJPTV9DTEtfRkFMTCwgaXNwX252cmFtKGhhKSk7Ci0JCWRhdGFCaXQgPQotCQkJKHJlYWR3KGlzcF9udnJhbShoYSkpICYgQVVCVVJOX0VFUFJPTV9ESV8xKSA/IDEgOiAwOworCQllZXByb21fY21kKGhhLT5lZXByb21fY21kX2RhdGEgfAorCQkgICAgICAgQVVCVVJOX0VFUFJPTV9DTEtfUklTRSwgaGEpOworCQllZXByb21fY21kKGhhLT5lZXByb21fY21kX2RhdGEgfAorCQkgICAgICAgQVVCVVJOX0VFUFJPTV9DTEtfRkFMTCwgaGEpOworCisJCWRhdGFCaXQgPSAocmVhZHcoaXNwX252cmFtKGhhKSkgJiBBVUJVUk5fRUVQUk9NX0RJXzEpID8gMSA6IDA7CisKIAkJZGF0YSA9IChkYXRhIDw8IDEpIHwgZGF0YUJpdDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9udnJhbS5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmgKaW5kZXggMDhlMmFlZC4uYjQ3YjRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X252cmFtLmgKQEAgLTEzNCw5ICsxMzQsNyBAQAogCQkJdTE2IHBoeUNvbmZpZzsJLyogeDM2ICovCiAjZGVmaW5lCSBQSFlfQ09ORklHX1BIWV9BRERSX01BU0sJICAgICAgMHgxZgogI2RlZmluZQkgUEhZX0NPTkZJR19FTkFCTEVfRldfTUFOQUdFTUVOVF9NQVNLIDB4MjAKLQkJCXUxNiB0b3BjYXQ7CS8qIHgzOCAqLwotI2RlZmluZSBUT1BDQVRfUFJFU0VOVAkJMHgwMTAwCi0jZGVmaW5lIFRPUENBVF9NQVNLCQkweEZGMDAKKwkJCXUxNiByZXNlcnZlZF81NjsJLyogeDM4ICovCiAKICNkZWZpbmUgRUVQUk9NX1VOVVNFRF8xX1NJWkUgICAyCiAJCQl1OCB1bnVzZWRfMVtFRVBST01fVU5VU0VEXzFfU0laRV07IC8qIHgzQSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYwppbmRleCAxNzhmY2RkLi45ZWY2OTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYwpAQCAtMTksNyArMTksNyBAQAogLyoKICAqIFNSQiBhbGxvY2F0aW9uIGNhY2hlCiAgKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnNyYl9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNyYl9jYWNoZXA7CiAKIC8qCiAgKiBNb2R1bGUgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGFuZCB2YXJpYWJsZXMKQEAgLTM0LDkgKzM0LDkgQEAKIAkJICIgZGVmYXVsdCBpdCB3aWxsIHJlc2V0IGhiYSA6MCIKIAkJICIgc2V0IHRvIDEgdG8gYXZvaWQgcmVzZXR0aW5nIEhCQSIpOwogCi1pbnQgcWxhNF9leHRlbmRlZF9lcnJvcl9sb2dnaW5nID0gMDsgLyogMCA9IG9mZiwgMSA9IGxvZyBlcnJvcnMgKi8KLW1vZHVsZV9wYXJhbShxbGE0X2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsIGludCwgU19JUlVHTyB8IFNfSVJVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhxbGE0X2V4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsCitpbnQgcWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPSAwOyAvKiAwID0gb2ZmLCAxID0gbG9nIGVycm9ycyAqLworbW9kdWxlX3BhcmFtKHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nLCBpbnQsIFNfSVJVR08gfCBTX0lSVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MocWw0eGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsCiAJCSAiT3B0aW9uIHRvIGVuYWJsZSBleHRlbmRlZCBlcnJvciBsb2dnaW5nLCAiCiAJCSAiRGVmYXVsdCBpcyAwIC0gbm8gbG9nZ2luZywgMSAtIGRlYnVnIGxvZ2dpbmciKTsKIApAQCAtNzA4LDEwICs3MDgsMTAgQEAKIH0KIAogLyoqCi0gKiBxbGE0MDEwX3NvZnRfcmVzZXQgLSBwZXJmb3JtcyBzb2Z0IHJlc2V0LgorICogcWxhNHh4eF9zb2Z0X3Jlc2V0IC0gcGVyZm9ybXMgc29mdCByZXNldC4KICAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgogICoqLwotc3RhdGljIGludCBxbGE0MDEwX3NvZnRfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoraW50IHFsYTR4eHhfc29mdF9yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJdWludDMyX3QgbWF4X3dhaXRfdGltZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKQEAgLTgxNywyOSArODE3LDYgQEAKIH0KIAogLyoqCi0gKiBxbGE0eHh4X3RvcGNhdF9yZXNldCAtIHBlcmZvcm1zIGhhcmQgcmVzZXQgb2YgVG9wQ2F0IENoaXAuCi0gKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqKi8KLXN0YXRpYyBpbnQgcWxhNHh4eF90b3BjYXRfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlxbDR4eHhfbG9ja19udnJhbShoYSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0Jd3JpdGVsKHNldF9ybWFzayhHUE9SX1RPUENBVF9SRVNFVCksIGlzcF9ncF9vdXQoaGEpKTsKLQlyZWFkbChpc3BfZ3Bfb3V0KGhhKSk7Ci0JbWRlbGF5KDEpOwotCi0Jd3JpdGVsKGNscl9ybWFzayhHUE9SX1RPUENBVF9SRVNFVCksIGlzcF9ncF9vdXQoaGEpKTsKLQlyZWFkbChpc3BfZ3Bfb3V0KGhhKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQltZGVsYXkoMjUyMyk7Ci0KLQlxbDR4eHhfdW5sb2NrX252cmFtKGhhKTsKLQlyZXR1cm4gUUxBX1NVQ0NFU1M7Ci19Ci0KLS8qKgogICogcWxhNHh4eF9mbHVzaF9hY3RpdmVfc3JicyAtIHJldHVybnMgYWxsIG91dHN0YW5kaW5nIGkvbyByZXF1ZXN0cyB0byBPLlMuCiAgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KICAqCkBAIC04NjcsMjYgKzg0NCw2IEBACiB9CiAKIC8qKgotICogcWxhNHh4eF9oYXJkX3Jlc2V0IC0gcGVyZm9ybXMgSEJBIEhhcmQgUmVzZXQKLSAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgotICoqLwotc3RhdGljIGludCBxbGE0eHh4X2hhcmRfcmVzZXQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQotewotCS8qIFRoZSBRTEE0MDEwIHJlYWxseSBkb2Vzbid0IGhhdmUgYW4gZXF1aXZhbGVudCB0byBhIGhhcmQgcmVzZXQgKi8KLQlxbGE0eHh4X2ZsdXNoX2FjdGl2ZV9zcmJzKGhhKTsKLQlpZiAodGVzdF9iaXQoQUZfVE9QQ0FUX0NISVBfUFJFU0VOVCwgJmhhLT5mbGFncykpIHsKLQkJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKLQotCQlpZiAoKHFsYTQwMTBfc29mdF9yZXNldChoYSkgPT0gUUxBX1NVQ0NFU1MpICYmCi0JCSAgICAocWxhNHh4eF90b3BjYXRfcmVzZXQoaGEpID09IFFMQV9TVUNDRVNTKSAmJgotCQkgICAgKHFsYTQwMTBfc29mdF9yZXNldChoYSkgPT0gUUxBX1NVQ0NFU1MpKQotCQkJc3RhdHVzID0gUUxBX1NVQ0NFU1M7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfSBlbHNlCi0JCXJldHVybiBxbGE0MDEwX3NvZnRfcmVzZXQoaGEpOwotfQotCi0vKioKICAqIHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyIC0gcmVjb3ZlcnMgYWRhcHRlciBhZnRlciBhIGZhdGFsIGVycm9yCiAgKiBAaGE6IFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KICAqIEByZW5ld19kZGJfbGlzdDogSW5kaWNhdGVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgYWRhcHRlcidzIGRkYiBsaXN0CkBAIC05MTksMTggKzg3NiwxMSBAQAogCWlmIChzdGF0dXMgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXMgLSBQZXJmb3JtaW5nIHNvZnQgcmVzZXQuLlxuIiwKIAkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCQlzdGF0dXMgPSBxbGE0eHh4X3NvZnRfcmVzZXQoaGEpOwotCX0KLQkvKiBGSVhNRWthcmVuOiBEbyB3ZSB3YW50IHRvIGtlZXAgaW50ZXJydXB0cyBlbmFibGVkIGFuZCBwcm9jZXNzCi0JICAgQUVOcyBhZnRlciBzb2Z0IHJlc2V0ICovCi0KLQkvKiBJZiBmaXJtd2FyZSAoU09GVCkgcmVzZXQgZmFpbGVkLCBvciBpZiBhbGwgb3V0c3RhbmRpbmcKLQkgKiBjb21tYW5kcyBoYXZlIG5vdCByZXR1cm5lZCwgdGhlbiBkbyBhIEhBUkQgcmVzZXQuCi0JICovCi0JaWYgKHN0YXR1cyA9PSBRTEFfRVJST1IpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXMgLSBQZXJmb3JtaW5nIGhhcmQgcmVzZXQuLlxuIiwKLQkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCQlzdGF0dXMgPSBxbGE0eHh4X2hhcmRfcmVzZXQoaGEpOworCQlxbGE0eHh4X2ZsdXNoX2FjdGl2ZV9zcmJzKGhhKTsKKwkJaWYgKHFsNHh4eF9sb2NrX2RydnJfd2FpdChoYSkgPT0gUUxBX1NVQ0NFU1MpCisJCQlzdGF0dXMgPSBxbGE0eHh4X3NvZnRfcmVzZXQoaGEpOworCQllbHNlCisJCQlzdGF0dXMgPSBRTEFfRVJST1I7CiAJfQogCiAJLyogRmx1c2ggYW55IHBlbmRpbmcgZGRiIGNoYW5nZWQgQUVOcyAqLwpAQCAtMTAxMSwxOCArOTYxLDE1IEBACiAgKiB0aGUgbWlkLWxldmVsIHRyaWVzIHRvIHNsZWVwIHdoZW4gaXQgcmVhY2hlcyB0aGUgZHJpdmVyIHRocmVzaG9sZAogICogImhvc3QtPmNhbl9xdWV1ZSIuIFRoaXMgY2FuIGNhdXNlIGEgcGFuaWMgaWYgd2Ugd2VyZSBpbiBvdXIgaW50ZXJydXB0IGNvZGUuCiAgKiovCi1zdGF0aWMgdm9pZCBxbGE0eHh4X2RvX2RwYyh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgcWxhNHh4eF9kb19kcGMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9IChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKSBkYXRhOworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCwgZHBjX3dvcmspOwogCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgKmR0ZW1wOwogCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IERQQyBoYW5kbGVyIHdha2luZyB1cC5cbiIsCi0JCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOwotCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGhhLT5mbGFncyA9IDB4JTA4bHhcbiIsCi0JCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgaGEtPmZsYWdzKSk7Ci0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGhhLT5kcGNfZmxhZ3MgPSAweCUwOGx4XG4iLAotCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5kcGNfZmxhZ3MpKTsKKwlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogRFBDIGhhbmRsZXIgd2FraW5nIHVwLiIKKwkJImZsYWdzID0gMHglMDhseCwgZHBjX2ZsYWdzID0gMHglMDhseFxuIiwKKwkJaGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBoYS0+ZmxhZ3MsIGhhLT5kcGNfZmxhZ3MpKTsKIAogCS8qIEluaXRpYWxpemF0aW9uIG5vdCB5ZXQgZmluaXNoZWQuIERvbid0IGRvIGFueXRoaW5nIHlldC4gKi8KIAlpZiAoIXRlc3RfYml0KEFGX0lOSVRfRE9ORSwgJmhhLT5mbGFncykpCkBAIC0xMDMyLDE2ICs5NzksOCBAQAogCSAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChEUENfUkVTRVRfSEFfSU5UUiwgJmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KERQQ19SRVNFVF9IQV9ERVNUUk9ZX0REQl9MSVNULCAmaGEtPmRwY19mbGFncykpIHsKLQkJaWYgKHRlc3RfYml0KERQQ19SRVNFVF9IQV9ERVNUUk9ZX0REQl9MSVNULCAmaGEtPmRwY19mbGFncykpCi0JCQkvKgotCQkJICogZGcgMDkvMjMgTmV2ZXIgaW5pdGlhbGl6ZSBkZGIgbGlzdAotCQkJICogb25jZSB3ZSB1cCBhbmQgcnVubmluZwotCQkJICogcWxhNHh4eF9yZWNvdmVyX2FkYXB0ZXIoaGEsCi0JCQkgKiAgICBSRUJVSUxEX0REQl9MSVNUKTsKLQkJCSAqLwotCQkJcWxhNHh4eF9yZWNvdmVyX2FkYXB0ZXIoaGEsIFBSRVNFUlZFX0REQl9MSVNUKTsKLQotCQlpZiAodGVzdF9iaXQoRFBDX1JFU0VUX0hBLCAmaGEtPmRwY19mbGFncykpCisJCWlmICh0ZXN0X2JpdChEUENfUkVTRVRfSEFfREVTVFJPWV9EREJfTElTVCwgJmhhLT5kcGNfZmxhZ3MpIHx8CisJCQl0ZXN0X2JpdChEUENfUkVTRVRfSEEsICZoYS0+ZHBjX2ZsYWdzKSkKIAkJCXFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKGhhLCBQUkVTRVJWRV9EREJfTElTVCk7CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEUENfUkVTRVRfSEFfSU5UUiwgJmhhLT5kcGNfZmxhZ3MpKSB7CkBAIC0xMTIyLDcgKzEwNjEsOCBAQAogCQlkZXN0cm95X3dvcmtxdWV1ZShoYS0+ZHBjX3RocmVhZCk7CiAKIAkvKiBJc3N1ZSBTb2Z0IFJlc2V0IHRvIHB1dCBmaXJtd2FyZSBpbiB1bmtub3duIHN0YXRlICovCi0JcWxhNHh4eF9zb2Z0X3Jlc2V0KGhhKTsKKwlpZiAocWw0eHh4X2xvY2tfZHJ2cl93YWl0KGhhKSA9PSBRTEFfU1VDQ0VTUykKKwkJcWxhNHh4eF9zb2Z0X3Jlc2V0KGhhKTsKIAogCS8qIFJlbW92ZSB0aW1lciB0aHJlYWQsIGlmIHByZXNlbnQgKi8KIAlpZiAoaGEtPnRpbWVyX2FjdGl2ZSkKQEAgLTEyNjEsNyArMTIwMSw2IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaGEtPm1haWxib3hfd2FpdF9xdWV1ZSk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaGEtPmhhcmR3YXJlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZoYS0+bGlzdF9sb2NrKTsKIAogCS8qIEFsbG9jYXRlIGRtYSBidWZmZXJzICovCiAJaWYgKHFsYTR4eHhfbWVtX2FsbG9jKGhhKSkgewpAQCAtMTMxNSw3ICsxMjU0LDcgQEAKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQotCUlOSVRfV09SSygmaGEtPmRwY193b3JrLCBxbGE0eHh4X2RvX2RwYywgaGEpOworCUlOSVRfV09SSygmaGEtPmRwY193b3JrLCBxbGE0eHh4X2RvX2RwYyk7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHFsYTR4eHhfaW50cl9oYW5kbGVyLAogCQkJICBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJxbGE0eHh4IiwgaGEpOwpAQCAtMTQ2OCwyNyArMTQwNyw2IEBACiB9CiAKIC8qKgotICogcWxhNHh4eF9zb2Z0X3Jlc2V0IC0gcGVyZm9ybXMgYSBTT0ZUIFJFU0VUIG9mIGhiYS4KLSAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgotICoqLwotaW50IHFsYTR4eHhfc29mdF9yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCi17Ci0KLQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVsZDogJXM6IGNoaXAgcmVzZXQhXG4iLCBoYS0+aG9zdF9ubywKLQkJICAgICAgX19mdW5jX18pKTsKLQlpZiAodGVzdF9iaXQoQUZfVE9QQ0FUX0NISVBfUFJFU0VOVCwgJmhhLT5mbGFncykpIHsKLQkJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKLQotCQlpZiAoKHFsYTQwMTBfc29mdF9yZXNldChoYSkgPT0gUUxBX1NVQ0NFU1MpICYmCi0JCSAgICAocWxhNHh4eF90b3BjYXRfcmVzZXQoaGEpID09IFFMQV9TVUNDRVNTKSAmJgotCQkgICAgKHFsYTQwMTBfc29mdF9yZXNldChoYSkgPT0gUUxBX1NVQ0NFU1MpICkKLQkJCXN0YXR1cyA9IFFMQV9TVUNDRVNTOwotCQlyZXR1cm4gc3RhdHVzOwotCX0gZWxzZQotCQlyZXR1cm4gcWxhNDAxMF9zb2Z0X3Jlc2V0KGhhKTsKLX0KLQotLyoqCiAgKiBxbGE0eHh4X2VoX3dhaXRfb25fY29tbWFuZCAtIHdhaXRzIGZvciBjb21tYW5kIHRvIGJlIHJldHVybmVkIGJ5IGZpcm13YXJlCiAgKiBAaGE6IGFjdHVhbCBoYSB3aG9zZSBkb25lIHF1ZXVlIHdpbGwgY29udGFpbiB0aGUgY29tZCByZXR1cm5lZCBieSBmaXJtd2FyZS4KICAqIEBjbWQ6IFNjc2kgQ29tbWFuZCB0byB3YWl0IG9uLgpAQCAtMTY4Niw2ICsxNjA0LDEyIEBACiAJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKIAl9LAorCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1FMT0dJQywKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A0MDMyLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKIAl7MCwgMH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsYTR4eHhfcGNpX3RibCk7CkBAIC0xNzE0LDcgKzE2MzgsNyBAQAogCiAJLyogRGVyaXZlIHZlcnNpb24gc3RyaW5nLiAqLwogCXN0cmNweShxbGE0eHh4X3ZlcnNpb25fc3RyLCBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OKTsKLQlpZiAocWxhNF9leHRlbmRlZF9lcnJvcl9sb2dnaW5nKQorCWlmIChxbDR4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykKIAkJc3RyY2F0KHFsYTR4eHhfdmVyc2lvbl9zdHIsICItZGVidWciKTsKIAogCXFsYTR4eHhfc2NzaV90cmFuc3BvcnQgPQpAQCAtMTcyNCwxMyArMTY0OCwxMyBAQAogCQlnb3RvIHJlbGVhc2Vfc3JiX2NhY2hlOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIlFMb2dpYyBpU0NTSSBIQkEgRHJpdmVyXG4iKTsKIAlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZxbGE0eHh4X3BjaV9kcml2ZXIpOwogCWlmIChyZXQpCiAJCWdvdG8gdW5yZWdpc3Rlcl90cmFuc3BvcnQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJRTG9naWMgaVNDU0kgSEJBIERyaXZlclxuIik7CiAJcmV0dXJuIDA7CisKIHVucmVnaXN0ZXJfdHJhbnNwb3J0OgogCWlzY3NpX3VucmVnaXN0ZXJfdHJhbnNwb3J0KCZxbGE0eHh4X2lzY3NpX3RyYW5zcG9ydCk7CiByZWxlYXNlX3NyYl9jYWNoZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCmluZGV4IGIzZmU3ZTYuLjQ1NGUxOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaApAQCAtNSw5ICs1LDQgQEAKICAqIFNlZSBMSUNFTlNFLnFsYTR4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KIAotI2RlZmluZSBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OCSI1LjAwLjA1YjktayIKLQotI2RlZmluZSBRTDRfRFJJVkVSX01BSk9SX1ZFUgk1Ci0jZGVmaW5lIFFMNF9EUklWRVJfTUlOT1JfVkVSCTAKLSNkZWZpbmUgUUw0X0RSSVZFUl9QQVRDSF9WRVIJNQotI2RlZmluZSBRTDRfRFJJVkVSX0JFVEFfVkVSCTkKKyNkZWZpbmUgUUxBNFhYWF9EUklWRVJfVkVSU0lPTgkiNS4wMC4wNy1rIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5jCmluZGV4IGUwNzI1MzUuLjJlN2RiMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguYworKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmMKQEAgLTIwOSw3ICsyMDksNyBAQAogICoJY2FsbGVyIG11c3QgaG9sZCBob3N0IGxvY2sKICAqLwogCi1zdGF0aWMgdm9pZCBxbF9pY21kKFNjc2lfQ21uZCAqIGNtZCkKK3N0YXRpYyB2b2lkIHFsX2ljbWQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2NtZChjbWQpOwogCWludCAJcWJhc2UgPSBwcml2LT5xYmFzZTsKQEAgLTI1Niw3ICsyNTYsNyBAQAogICoJUHJvY2VzcyBzY3NpIGNvbW1hbmQgLSB1c3VhbGx5IGFmdGVyIGludGVycnVwdCAKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHFsX3BjbWQoU2NzaV9DbW5kICogY21kKQorc3RhdGljIHVuc2lnbmVkIGludCBxbF9wY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAl1bnNpZ25lZCBsb25nIGs7CkBAIC00MDcsNyArNDA3LDcgQEAKIAogc3RhdGljIHZvaWQgcWxfaWhhbmRsKHZvaWQgKmRldl9pZCkKIHsKLQlTY3NpX0NtbmQgKmljbWQ7CisJc3RydWN0IHNjc2lfY21uZCAqaWNtZDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X2lkOwogCXN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqcHJpdiA9IGdldF9wcml2X2J5X2hvc3QoaG9zdCk7CiAJaW50IHFiYXNlID0gcHJpdi0+cWJhc2U7CkBAIC00NDcsNyArNDQ3LDggQEAKICAqCVF1ZXVlZCBjb21tYW5kCiAgKi8KIAotaW50IHFsb2dpY2ZhczQwOF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSkKK2ludCBxbG9naWNmYXM0MDhfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKIAlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYgPSBnZXRfcHJpdl9ieV9jbWQoY21kKTsKIAlpZiAoc2NtZF9pZChjbWQpID09IHByaXYtPnFpbml0aWQpIHsKQEAgLTQ3MCw5ICs0NzEsOCBAQAogICoJUmV0dXJuIGJpb3MgcGFyYW1ldGVycyAKICAqLwogCi1pbnQgcWxvZ2ljZmFzNDA4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiBkaXNrLAotCQkgICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKLQkJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgaXBbXSkKK2ludCBxbG9naWNmYXM0MDhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqZGlzaywgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAorCQkJICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKQogewogLyogVGhpcyBzaG91bGQgbWltaWMgdGhlIERPUyBRbG9naWMgZHJpdmVyJ3MgYmVoYXZpb3IgZXhhY3RseSAqLwogCWlwWzBdID0gMHg0MDsKQEAgLTQ5NCw3ICs0OTQsNyBAQAogICoJQWJvcnQgYSBjb21tYW5kIGluIHByb2dyZXNzCiAgKi8KICAKLWludCBxbG9naWNmYXM0MDhfYWJvcnQoU2NzaV9DbW5kICogY21kKQoraW50IHFsb2dpY2ZhczQwOF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2ICpwcml2ID0gZ2V0X3ByaXZfYnlfY21kKGNtZCk7CiAJcHJpdi0+cWFib3J0ID0gMTsKQEAgLTUwOCw3ICs1MDgsNyBAQAogICoJdGhlIFBDTUNJQSBxbG9naWNfc3R1YiBjb2RlLiBUaGlzIHdhbnRzIGZpeGluZwogICovCiAKLWludCBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCkKK2ludCBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKnByaXYgPSBnZXRfcHJpdl9ieV9jbWQoY21kKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5oIGIvZHJpdmVycy9zY3NpL3Fsb2dpY2ZhczQwOC5oCmluZGV4IDhmZDU1NTUuLjI2MDYyNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbG9naWNmYXM0MDguaAorKysgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljZmFzNDA4LmgKQEAgLTc1LDE1ICs3NSwxNSBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RydWN0IHFsb2dpY2ZhczQwOF9wcml2IHsKLQkgaW50CQlxYmFzZTsJCS8qIFBvcnQgKi8KLQkgaW50CQlxaW5pdGlkOwkvKiBpbml0aWF0b3IgSUQgKi8KLQkgaW50CQlxYWJvcnQ7CQkvKiBGbGFnIHRvIGNhdXNlIGFuIGFib3J0ICovCi0JIGludAkJcWxpcnE7CQkvKiBJUlEgYmVpbmcgdXNlZCAqLwotCSBpbnQJCWludF90eXBlOwkvKiB0eXBlIG9mIGlycSwgMiBmb3IgSVNBIGJvYXJkLCAwIGZvciBQQ01DSUEgKi8KLQkgY2hhcgkJcWluZm9bODBdOwkvKiBkZXNjcmlwdGlvbiAqLwotCSBTY3NpX0NtbmQgCSpxbGNtZDsJCS8qIGN1cnJlbnQgY29tbWFuZCBiZWluZyBwcm9jZXNzZWQgKi8KLQkgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CS8qIHBvaW50ZXIgYmFjayB0byBob3N0ICovCi0JIHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqbmV4dDsgLyogbmV4dCBwcml2YXRlIHN0cnVjdCAqLworCWludCBxYmFzZTsJCS8qIFBvcnQgKi8KKwlpbnQgcWluaXRpZDsJCS8qIGluaXRpYXRvciBJRCAqLworCWludCBxYWJvcnQ7CQkvKiBGbGFnIHRvIGNhdXNlIGFuIGFib3J0ICovCisJaW50IHFsaXJxOwkJLyogSVJRIGJlaW5nIHVzZWQgKi8KKwlpbnQgaW50X3R5cGU7CQkvKiB0eXBlIG9mIGlycSwgMiBmb3IgSVNBIGJvYXJkLCAwIGZvciBQQ01DSUEgKi8KKwljaGFyIHFpbmZvWzgwXTsJCS8qIGRlc2NyaXB0aW9uICovCisJc3RydWN0IHNjc2lfY21uZCAqcWxjbWQ7CS8qIGN1cnJlbnQgY29tbWFuZCBiZWluZyBwcm9jZXNzZWQgKi8KKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsJLyogcG9pbnRlciBiYWNrIHRvIGhvc3QgKi8KKwlzdHJ1Y3QgcWxvZ2ljZmFzNDA4X3ByaXYgKm5leHQ7IC8qIG5leHQgcHJpdmF0ZSBzdHJ1Y3QgKi8KIH07CiAKIC8qIFRoZSBxbG9naWMgY2FyZCB1c2VzIHR3byByZWdpc3RlciBtYXBzIC0gVGhlc2UgbWFjcm9zIHNlbGVjdCB3aGljaCBvbmUgKi8KQEAgLTEwMywxMiArMTAzLDEzIEBACiAjZGVmaW5lIGdldF9wcml2X2J5X2hvc3QoeCkgKHN0cnVjdCBxbG9naWNmYXM0MDhfcHJpdiAqKSYoKHgpLT5ob3N0ZGF0YVswXSkKIAogaXJxcmV0dXJuX3QgcWxvZ2ljZmFzNDA4X2loYW5kbChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotaW50IHFsb2dpY2ZhczQwOF9xdWV1ZWNvbW1hbmQoU2NzaV9DbW5kICogY21kLCB2b2lkICgqZG9uZSkgKFNjc2lfQ21uZCAqKSk7CitpbnQgcWxvZ2ljZmFzNDA4X3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kLAorCQkJICAgICAgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKIGludCBxbG9naWNmYXM0MDhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqIGRpc2ssCi0JCSAgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAotCQkJc2VjdG9yX3QgY2FwYWNpdHksIGludCBpcFtdKTsKLWludCBxbG9naWNmYXM0MDhfYWJvcnQoU2NzaV9DbW5kICogY21kKTsKLWludCBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqIGNtZCk7CisJCQkgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsCisJCQkgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGlwW10pOworaW50IHFsb2dpY2ZhczQwOF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICogY21kKTsKK2ludCBxbG9naWNmYXM0MDhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBjbWQpOwogY29uc3QgY2hhciAqcWxvZ2ljZmFzNDA4X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCk7CiBpbnQgcWxvZ2ljZmFzNDA4X2dldF9jaGlwX3R5cGUoaW50IHFiYXNlLCBpbnQgaW50X3R5cGUpOwogdm9pZCBxbG9naWNmYXM0MDhfc2V0dXAoaW50IHFiYXNlLCBpbnQgaWQsIGludCBpbnRfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKaW5kZXggZWQ1OGJiNC4uOWI4MjdjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKICNkZWZpbmUgUFRJX1JFU0VUX0xJTUlUIDQwMAogCi1zdGF0aWMgaW50IF9faW5pdCBxbG9naWNwdGlfbG9hZF9maXJtd2FyZShzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpKQorc3RhdGljIGludCBfX2RldmluaXQgcWxvZ2ljcHRpX2xvYWRfZmlybXdhcmUoc3RydWN0IHFsb2dpY3B0aSAqcXB0aSkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcXB0aS0+cWhvc3Q7CiAJdW5zaWduZWQgc2hvcnQgY3N1bSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpX2FzbS5jIGIvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aV9hc20uYwppbmRleCAxNTQ1YjMwLi4xOWFhODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpX2FzbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGlfYXNtLmMKQEAgLTEsNSArMSw1IEBACiAvKiBWZXJzaW9uIDEuMzEuMDAgSVNQMTAwMCBJbml0aWF0b3IgUklTQyBmaXJtd2FyZSAqLwotdW5zaWduZWQgc2hvcnQgc2J1c19yaXNjX2NvZGUwMVtdIF9faW5pdGRhdGEgPSB7Cit1bnNpZ25lZCBzaG9ydCBzYnVzX3Jpc2NfY29kZTAxW10gX19kZXZpbml0ZGF0YSA9IHsKIAkweDAwNzgsIDB4MTAzMCwgMHgwMDAwLCAweDI0MTksIDB4MDAwMCwgMHgxMmZmLCAweDIwNDMsIDB4NGY1MCwKIAkweDU5NTIsIDB4NDk0NywgMHg0ODU0LCAweDIwMzEsIDB4MzkzOSwgMHgzMTJjLCAweDMxMzksIDB4MzkzMiwKIAkweDJjMzEsIDB4MzkzOSwgMHgzMzJjLCAweDMxMzksIDB4MzkzNCwgMHgyMDUxLCAweDRjNGYsIDB4NDc0OSwKQEAgLTExNTcsNCArMTE1Nyw0IEBACiAJMHgwMDNjLCAweDAwNDAsIDB4MzQxNSwgMHgyMDE5LCAweDI2MjYsIDB4N2IyMiwgMHg3YjI2LCAweDAwN2MsCiAJMHg5MmE3CiB9OwotdW5zaWduZWQgc2hvcnQgc2J1c19yaXNjX2NvZGVfbGVuZ3RoMDEgPSAweDI0MTk7Cit1bnNpZ25lZCBzaG9ydCBfX2RldmluaXRkYXRhIHNidXNfcmlzY19jb2RlX2xlbmd0aDAxID0gMHgyNDE5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKaW5kZXggYzU5ZjMxNS4uMjRjZmZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIEVYUE9SVF9TWU1CT0woc2NzaV9kZXZpY2VfdHlwZSk7CiAKIHN0cnVjdCBzY3NpX2hvc3RfY21kX3Bvb2wgewotCWttZW1fY2FjaGVfdAkqc2xhYjsKKwlzdHJ1Y3Qga21lbV9jYWNoZQkqc2xhYjsKIAl1bnNpZ25lZCBpbnQJdXNlcnM7CiAJY2hhcgkJKm5hbWU7CiAJdW5zaWduZWQgaW50CXNsYWJfZmxhZ3M7CkBAIC0xNTYsOCArMTU2LDcgQEAKIAogc3RhdGljIERFRklORV9NVVRFWChob3N0X2NtZF9wb29sX211dGV4KTsKIAotc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKl9fc2NzaV9nZXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJCQkJICAgIGdmcF90IGdmcF9tYXNrKQorc3RydWN0IHNjc2lfY21uZCAqX19zY3NpX2dldF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAKQEAgLTE3OCw2ICsxNzcsNyBAQAogCiAJcmV0dXJuIGNtZDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKF9fc2NzaV9nZXRfY29tbWFuZCk7CiAKIC8qCiAgKiBGdW5jdGlvbjoJc2NzaV9nZXRfY29tbWFuZCgpCkBAIC0yMTQsOSArMjE0LDI5IEBACiAJCXB1dF9kZXZpY2UoJmRldi0+c2Rldl9nZW5kZXYpOwogCiAJcmV0dXJuIGNtZDsKLX0JCQkJCit9CiBFWFBPUlRfU1lNQk9MKHNjc2lfZ2V0X2NvbW1hbmQpOwogCit2b2lkIF9fc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJc3RydWN0IGRldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBjaGFuZ2luZyBsb2NrcyBoZXJlLCBkb24ndCBuZWVkIHRvIHJlc3RvcmUgdGhlIGlycSBzdGF0ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzaG9zdC0+ZnJlZV9saXN0X2xvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmc2hvc3QtPmZyZWVfbGlzdCkpKSB7CisJCWxpc3RfYWRkKCZjbWQtPmxpc3QsICZzaG9zdC0+ZnJlZV9saXN0KTsKKwkJY21kID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hvc3QtPmZyZWVfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAobGlrZWx5KGNtZCAhPSBOVUxMKSkKKwkJa21lbV9jYWNoZV9mcmVlKHNob3N0LT5jbWRfcG9vbC0+c2xhYiwgY21kKTsKKworCXB1dF9kZXZpY2UoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woX19zY3NpX3B1dF9jb21tYW5kKTsKKwogLyoKICAqIEZ1bmN0aW9uOglzY3NpX3B1dF9jb21tYW5kKCkKICAqCkBAIC0yMzEsMjYgKzI1MSwxNSBAQAogdm9pZCBzY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSBjbWQtPmRldmljZTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKKwogCS8qIHNlcmlvdXMgZXJyb3IgaWYgdGhlIGNvbW1hbmQgaGFzbid0IGNvbWUgZnJvbSBhIGRldmljZSBsaXN0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+ZGV2aWNlLT5saXN0X2xvY2ssIGZsYWdzKTsKIAlCVUdfT04obGlzdF9lbXB0eSgmY21kLT5saXN0KSk7CiAJbGlzdF9kZWxfaW5pdCgmY21kLT5saXN0KTsKLQlzcGluX3VubG9jaygmY21kLT5kZXZpY2UtPmxpc3RfbG9jayk7Ci0JLyogY2hhbmdpbmcgbG9ja3MgaGVyZSwgZG9uJ3QgbmVlZCB0byByZXN0b3JlIHRoZSBpcnEgc3RhdGUgKi8KLQlzcGluX2xvY2soJnNob3N0LT5mcmVlX2xpc3RfbG9jayk7Ci0JaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnNob3N0LT5mcmVlX2xpc3QpKSkgewotCQlsaXN0X2FkZCgmY21kLT5saXN0LCAmc2hvc3QtPmZyZWVfbGlzdCk7Ci0JCWNtZCA9IE5VTEw7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNob3N0LT5mcmVlX2xpc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+ZGV2aWNlLT5saXN0X2xvY2ssIGZsYWdzKTsKIAotCWlmIChsaWtlbHkoY21kICE9IE5VTEwpKQotCQlrbWVtX2NhY2hlX2ZyZWUoc2hvc3QtPmNtZF9wb29sLT5zbGFiLCBjbWQpOwotCi0JcHV0X2RldmljZSgmc2Rldi0+c2Rldl9nZW5kZXYpOworCV9fc2NzaV9wdXRfY29tbWFuZChjbWQtPmRldmljZS0+aG9zdCwgY21kLCAmc2Rldi0+c2Rldl9nZW5kZXYpOwogfQogRVhQT1JUX1NZTUJPTChzY3NpX3B1dF9jb21tYW5kKTsKIApAQCAtODcxLDkgKzg4MCw5IEBACiAgKi8KIHZvaWQgc2NzaV9kZXZpY2VfcHV0KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKKyNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZSA9IHNkZXYtPmhvc3QtPmhvc3R0LT5tb2R1bGU7CiAKLSNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAogCS8qIFRoZSBtb2R1bGUgcmVmY291bnQgd2lsbCBiZSB6ZXJvIGlmIHNjc2lfZGV2aWNlX2dldCgpCiAJICogd2FzIGNhbGxlZCBmcm9tIGEgbW9kdWxlIHJlbW92YWwgcm91dGluZSAqLwogCWlmIChtb2R1bGUgJiYgbW9kdWxlX3JlZmNvdW50KG1vZHVsZSkgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCmluZGV4IDljMGYzNTguLjMwZWUzZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpAQCAtNTIsNyArNTIsNyBAQAogI2luY2x1ZGUgInNjc2lfZGVidWcuaCIKIAogI2RlZmluZSBTQ1NJX0RFQlVHX1ZFUlNJT04gIjEuODAiCi1zdGF0aWMgY29uc3QgY2hhciAqIHNjc2lfZGVidWdfdmVyc2lvbl9kYXRlID0gIjIwMDYwOTE0IjsKK3N0YXRpYyBjb25zdCBjaGFyICogc2NzaV9kZWJ1Z192ZXJzaW9uX2RhdGUgPSAiMjAwNjEwMTgiOwogCiAvKiBBZGRpdGlvbmFsIFNlbnNlIENvZGUgKEFTQykgdXNlZCAqLwogI2RlZmluZSBOT19BRERJVElPTkFMX1NFTlNFIDB4MApAQCAtMjU0LDYgKzI1NCw4IEBACiAJCQkgc3RydWN0IHNkZWJ1Z19kZXZfaW5mbyAqIGRldmlwKTsKIHN0YXRpYyBpbnQgcmVzcF9zdGFydF9zdG9wKHN0cnVjdCBzY3NpX2NtbmQgKiBzY3AsCiAJCQkgICBzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOworc3RhdGljIGludCByZXNwX3JlcG9ydF90Z3RwZ3Moc3RydWN0IHNjc2lfY21uZCAqIHNjcCwKKwkJCSAgICAgIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCk7CiBzdGF0aWMgaW50IHJlc3BfcmVhZGNhcChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsCiAJCQlzdHJ1Y3Qgc2RlYnVnX2Rldl9pbmZvICogZGV2aXApOwogc3RhdGljIGludCByZXNwX3JlYWRjYXAxNihzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQsCkBAIC0yODcsOSArMjg5LDkgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2FsbF9xdWV1ZWQodm9pZCk7CiBzdGF0aWMgdm9pZCBzdG9wX2FsbF9xdWV1ZWQodm9pZCk7CiBzdGF0aWMgaW50IHN0b3BfcXVldWVkX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqIGNtbmQpOwotc3RhdGljIGludCBpbnF1aXJ5X2V2cGRfODModW5zaWduZWQgY2hhciAqIGFyciwgaW50IHRhcmdldF9kZXZfaWQsCi0JCQkgICBpbnQgZGV2X2lkX251bSwgY29uc3QgY2hhciAqIGRldl9pZF9zdHIsCi0JCQkgICBpbnQgZGV2X2lkX3N0cl9sZW4pOworc3RhdGljIGludCBpbnF1aXJ5X2V2cGRfODModW5zaWduZWQgY2hhciAqIGFyciwgaW50IHBvcnRfZ3JvdXBfaWQsCisJCQkgICBpbnQgdGFyZ2V0X2Rldl9pZCwgaW50IGRldl9pZF9udW0sCisJCQkgICBjb25zdCBjaGFyICogZGV2X2lkX3N0ciwgaW50IGRldl9pZF9zdHJfbGVuKTsKIHN0YXRpYyBpbnQgaW5xdWlyeV9ldnBkXzg4KHVuc2lnbmVkIGNoYXIgKiBhcnIsIGludCB0YXJnZXRfZGV2X2lkKTsKIHN0YXRpYyBpbnQgZG9fY3JlYXRlX2RyaXZlcmZzX2ZpbGVzKHZvaWQpOwogc3RhdGljIHZvaWQgZG9fcmVtb3ZlX2RyaXZlcmZzX2ZpbGVzKHZvaWQpOwpAQCAtNDIyLDYgKzQyNCwxNSBAQAogCQl9CiAJCWVycnN0cyA9IHJlc3BfcmVhZGNhcDE2KFNDcG50LCBkZXZpcCk7CiAJCWJyZWFrOworCWNhc2UgTUFJTlRFTkFOQ0VfSU46CisJCWlmIChNSV9SRVBPUlRfVEFSR0VUX1BHUyAhPSBjbWRbMV0pIHsKKwkJCW1rX3NlbnNlX2J1ZmZlcihkZXZpcCwgSUxMRUdBTF9SRVFVRVNULAorCQkJCQlJTlZBTElEX09QQ09ERSwgMCk7CisJCQllcnJzdHMgPSBjaGVja19jb25kaXRpb25fcmVzdWx0OworCQkJYnJlYWs7CisJCX0KKwkJZXJyc3RzID0gcmVzcF9yZXBvcnRfdGd0cGdzKFNDcG50LCBkZXZpcCk7CisJCWJyZWFrOwogCWNhc2UgUkVBRF8xNjoKIAljYXNlIFJFQURfMTI6CiAJY2FzZSBSRUFEXzEwOgpAQCAtNjY1LDggKzY3Niw5IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGlucV9wcm9kdWN0X2lkID0gInNjc2lfZGVidWcgICAgICAiOwogc3RhdGljIGNvbnN0IGNoYXIgKiBpbnFfcHJvZHVjdF9yZXYgPSAiMDAwNCI7CiAKLXN0YXRpYyBpbnQgaW5xdWlyeV9ldnBkXzgzKHVuc2lnbmVkIGNoYXIgKiBhcnIsIGludCB0YXJnZXRfZGV2X2lkLAotCQkJICAgaW50IGRldl9pZF9udW0sIGNvbnN0IGNoYXIgKiBkZXZfaWRfc3RyLAorc3RhdGljIGludCBpbnF1aXJ5X2V2cGRfODModW5zaWduZWQgY2hhciAqIGFyciwgaW50IHBvcnRfZ3JvdXBfaWQsCisJCQkgICBpbnQgdGFyZ2V0X2Rldl9pZCwgaW50IGRldl9pZF9udW0sCisJCQkgICBjb25zdCBjaGFyICogZGV2X2lkX3N0ciwKIAkJCSAgIGludCBkZXZfaWRfc3RyX2xlbikKIHsKIAlpbnQgbnVtLCBwb3J0X2E7CkBAIC03MjAsNiArNzMyLDE1IEBACiAJYXJyW251bSsrXSA9IChwb3J0X2EgPj4gMTYpICYgMHhmZjsKIAlhcnJbbnVtKytdID0gKHBvcnRfYSA+PiA4KSAmIDB4ZmY7CiAJYXJyW251bSsrXSA9IHBvcnRfYSAmIDB4ZmY7CisJLyogTkFBLTUsIFRhcmdldCBwb3J0IGdyb3VwIGlkZW50aWZpZXIgKi8KKwlhcnJbbnVtKytdID0gMHg2MTsJLyogcHJvdG89c2FzLCBiaW5hcnkgKi8KKwlhcnJbbnVtKytdID0gMHg5NTsJLyogcGl2PTEsIHRhcmdldCBwb3J0IGdyb3VwIGlkICovCisJYXJyW251bSsrXSA9IDB4MDsKKwlhcnJbbnVtKytdID0gMHg0OworCWFycltudW0rK10gPSAwOworCWFycltudW0rK10gPSAwOworCWFycltudW0rK10gPSAocG9ydF9ncm91cF9pZCA+PiA4KSAmIDB4ZmY7CisJYXJyW251bSsrXSA9IHBvcnRfZ3JvdXBfaWQgJiAweGZmOwogCS8qIE5BQS01LCBUYXJnZXQgZGV2aWNlIGlkZW50aWZpZXIgKi8KIAlhcnJbbnVtKytdID0gMHg2MTsJLyogcHJvdG89c2FzLCBiaW5hcnkgKi8KIAlhcnJbbnVtKytdID0gMHhhMzsJLyogcGl2PTEsIHRhcmdldCBkZXZpY2UsIG5hYSAqLwpAQCAtOTI4LDEyICs5NDksMTIgQEAKIAkJCXN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCkKIHsKIAl1bnNpZ25lZCBjaGFyIHBxX3BkdDsKLQl1bnNpZ25lZCBjaGFyIGFycltTREVCVUdfTUFYX0lOUV9BUlJfU1pdOworCXVuc2lnbmVkIGNoYXIgKiBhcnI7CiAJdW5zaWduZWQgY2hhciAqY21kID0gKHVuc2lnbmVkIGNoYXIgKilzY3AtPmNtbmQ7Ci0JaW50IGFsbG9jX2xlbiwgbjsKKwlpbnQgYWxsb2NfbGVuLCBuLCByZXQ7CiAKIAlhbGxvY19sZW4gPSAoY21kWzNdIDw8IDgpICsgY21kWzRdOwotCW1lbXNldChhcnIsIDAsIFNERUJVR19NQVhfSU5RX0FSUl9TWik7CisJYXJyID0ga3phbGxvYyhTREVCVUdfTUFYX0lOUV9BUlJfU1osIEdGUF9LRVJORUwpOwogCWlmIChkZXZpcC0+d2x1bikKIAkJcHFfcGR0ID0gMHgxZTsJLyogcHJlc2VudCwgd2x1biAqLwogCWVsc2UgaWYgKHNjc2lfZGVidWdfbm9fbHVuXzAgJiYgKDAgPT0gZGV2aXAtPmx1bikpCkBAIC05NDQsMTIgKzk2NSwxNSBAQAogCWlmICgweDIgJiBjbWRbMV0pIHsgIC8qIENNRERUIGJpdCBzZXQgKi8KIAkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsIElOVkFMSURfRklFTERfSU5fQ0RCLAogCQkJICAgICAgIAkwKTsKKwkJa2ZyZWUoYXJyKTsKIAkJcmV0dXJuIGNoZWNrX2NvbmRpdGlvbl9yZXN1bHQ7CiAJfSBlbHNlIGlmICgweDEgJiBjbWRbMV0pIHsgIC8qIEVWUEQgYml0IHNldCAqLwotCQlpbnQgbHVfaWRfbnVtLCB0YXJnZXRfZGV2X2lkLCBsZW47CisJCWludCBsdV9pZF9udW0sIHBvcnRfZ3JvdXBfaWQsIHRhcmdldF9kZXZfaWQsIGxlbjsKIAkJY2hhciBsdV9pZF9zdHJbNl07CiAJCWludCBob3N0X25vID0gZGV2aXAtPnNkYmdfaG9zdC0+c2hvc3QtPmhvc3Rfbm87CiAJCQorCQlwb3J0X2dyb3VwX2lkID0gKCgoaG9zdF9ubyArIDEpICYgMHg3ZikgPDwgOCkgKworCQkgICAgKGRldmlwLT5jaGFubmVsICYgMHg3Zik7CiAJCWlmICgwID09IHNjc2lfZGVidWdfdnBkX3VzZV9ob3N0bm8pCiAJCQlob3N0X25vID0gMDsKIAkJbHVfaWRfbnVtID0gZGV2aXAtPndsdW4gPyAtMSA6ICgoKGhvc3Rfbm8gKyAxKSAqIDIwMDApICsKQEAgLTk3Nyw4ICsxMDAxLDkgQEAKIAkJCW1lbWNweSgmYXJyWzRdLCBsdV9pZF9zdHIsIGxlbik7CiAJCX0gZWxzZSBpZiAoMHg4MyA9PSBjbWRbMl0pIHsgLyogZGV2aWNlIGlkZW50aWZpY2F0aW9uICovCiAJCQlhcnJbMV0gPSBjbWRbMl07CS8qc2FuaXR5ICovCi0JCQlhcnJbM10gPSBpbnF1aXJ5X2V2cGRfODMoJmFycls0XSwgdGFyZ2V0X2Rldl9pZCwKLQkJCQkJCSBsdV9pZF9udW0sIGx1X2lkX3N0ciwgbGVuKTsKKwkJCWFyclszXSA9IGlucXVpcnlfZXZwZF84MygmYXJyWzRdLCBwb3J0X2dyb3VwX2lkLAorCQkJCQkJIHRhcmdldF9kZXZfaWQsIGx1X2lkX251bSwKKwkJCQkJCSBsdV9pZF9zdHIsIGxlbik7CiAJCX0gZWxzZSBpZiAoMHg4NCA9PSBjbWRbMl0pIHsgLyogU29mdHdhcmUgaW50ZXJmYWNlIGlkZW50LiAqLwogCQkJYXJyWzFdID0gY21kWzJdOwkvKnNhbml0eSAqLwogCQkJYXJyWzNdID0gaW5xdWlyeV9ldnBkXzg0KCZhcnJbNF0pOwpAQCAtMTAxMiwxNyArMTAzNywyMiBAQAogCQkJLyogSWxsZWdhbCByZXF1ZXN0LCBpbnZhbGlkIGZpZWxkIGluIGNkYiAqLwogCQkJbWtfc2Vuc2VfYnVmZmVyKGRldmlwLCBJTExFR0FMX1JFUVVFU1QsCiAJCQkJCUlOVkFMSURfRklFTERfSU5fQ0RCLCAwKTsKKwkJCWtmcmVlKGFycik7CiAJCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKIAkJfQogCQlsZW4gPSBtaW4oKChhcnJbMl0gPDwgOCkgKyBhcnJbM10pICsgNCwgYWxsb2NfbGVuKTsKLQkJcmV0dXJuIGZpbGxfZnJvbV9kZXZfYnVmZmVyKHNjcCwgYXJyLAorCQlyZXQgPSBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzY3AsIGFyciwKIAkJCSAgICBtaW4obGVuLCBTREVCVUdfTUFYX0lOUV9BUlJfU1opKTsKKwkJa2ZyZWUoYXJyKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAJLyogZHJvcHMgdGhyb3VnaCBoZXJlIGZvciBhIHN0YW5kYXJkIGlucXVpcnkgKi8KIAlhcnJbMV0gPSBERVZfUkVNT1ZFQUJMRSh0YXJnZXQpID8gMHg4MCA6IDA7CS8qIFJlbW92YWJsZSBkaXNrICovCiAJYXJyWzJdID0gc2NzaV9kZWJ1Z19zY3NpX2xldmVsOwogCWFyclszXSA9IDI7ICAgIC8qIHJlc3BvbnNlX2RhdGFfZm9ybWF0PT0yICovCiAJYXJyWzRdID0gU0RFQlVHX0xPTkdfSU5RX1NaIC0gNTsKKwlpZiAoMCA9PSBzY3NpX2RlYnVnX3ZwZF91c2VfaG9zdG5vKQorCQlhcnJbNV0gPSAweDEwOyAvKiBjbGFpbTogaW1wbGljaXQgVEdQUyAqLwogCWFycls2XSA9IDB4MTA7IC8qIGNsYWltOiBNdWx0aVAgKi8KIAkvKiBhcnJbNl0gfD0gMHg0MDsgLi4uIGNsYWltOiBFbmNTZXJ2IChlbmNsb3N1cmUgc2VydmljZXMpICovCiAJYXJyWzddID0gMHhhOyAvKiBjbGFpbTogTElOS0VEICsgQ01EUVVFICovCkBAIC0xMDM5LDggKzEwNjksMTAgQEAKIAkJYXJyW24rK10gPSAweDM7IGFycltuKytdID0gMHg2MDsgLyogU1NDLTIgbm8gdmVyc2lvbiAqLwogCX0KIAlhcnJbbisrXSA9IDB4YzsgYXJyW24rK10gPSAweGY7ICAvKiBTQVMtMS4xIHJldiAxMCAqLwotCXJldHVybiBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzY3AsIGFyciwKKwlyZXQgPSBmaWxsX2Zyb21fZGV2X2J1ZmZlcihzY3AsIGFyciwKIAkJCSAgICBtaW4oYWxsb2NfbGVuLCBTREVCVUdfTE9OR19JTlFfU1opKTsKKwlrZnJlZShhcnIpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVzcF9yZXF1ZXN0cyhzdHJ1Y3Qgc2NzaV9jbW5kICogc2NwLApAQCAtMTE3MSw2ICsxMjAzLDg3IEBACiAJCQkJICAgIG1pbihhbGxvY19sZW4sIFNERUJVR19SRUFEQ0FQMTZfQVJSX1NaKSk7CiB9CiAKKyNkZWZpbmUgU0RFQlVHX01BWF9UR1RQR1NfQVJSX1NaIDE0MTIKKworc3RhdGljIGludCByZXNwX3JlcG9ydF90Z3RwZ3Moc3RydWN0IHNjc2lfY21uZCAqIHNjcCwKKwkJCSAgICAgIHN0cnVjdCBzZGVidWdfZGV2X2luZm8gKiBkZXZpcCkKK3sKKwl1bnNpZ25lZCBjaGFyICpjbWQgPSAodW5zaWduZWQgY2hhciAqKXNjcC0+Y21uZDsKKwl1bnNpZ25lZCBjaGFyICogYXJyOworCWludCBob3N0X25vID0gZGV2aXAtPnNkYmdfaG9zdC0+c2hvc3QtPmhvc3Rfbm87CisJaW50IG4sIHJldCwgYWxlbiwgcmxlbjsKKwlpbnQgcG9ydF9ncm91cF9hLCBwb3J0X2dyb3VwX2IsIHBvcnRfYSwgcG9ydF9iOworCisJYWxlbiA9ICgoY21kWzZdIDw8IDI0KSArIChjbWRbN10gPDwgMTYpICsgKGNtZFs4XSA8PCA4KQorCQkrIGNtZFs5XSk7CisKKwlhcnIgPSBremFsbG9jKFNERUJVR19NQVhfVEdUUEdTX0FSUl9TWiwgR0ZQX0tFUk5FTCk7CisJLyoKKwkgKiBFVlBEIHBhZ2UgMHg4OCBzdGF0ZXMgd2UgaGF2ZSB0d28gcG9ydHMsIG9uZQorCSAqIHJlYWwgYW5kIGEgZmFrZSBwb3J0IHdpdGggbm8gZGV2aWNlIGNvbm5lY3RlZC4KKwkgKiBTbyB3ZSBjcmVhdGUgdHdvIHBvcnQgZ3JvdXBzIHdpdGggb25lIHBvcnQgZWFjaAorCSAqIGFuZCBzZXQgdGhlIGdyb3VwIHdpdGggcG9ydCBCIHRvIHVuYXZhaWxhYmxlLgorCSAqLworCXBvcnRfYSA9IDB4MTsgLyogcmVsYXRpdmUgcG9ydCBBICovCisJcG9ydF9iID0gMHgyOyAvKiByZWxhdGl2ZSBwb3J0IEIgKi8KKwlwb3J0X2dyb3VwX2EgPSAoKChob3N0X25vICsgMSkgJiAweDdmKSA8PCA4KSArCisJICAgIChkZXZpcC0+Y2hhbm5lbCAmIDB4N2YpOworCXBvcnRfZ3JvdXBfYiA9ICgoKGhvc3Rfbm8gKyAxKSAmIDB4N2YpIDw8IDgpICsKKwkgICAgKGRldmlwLT5jaGFubmVsICYgMHg3ZikgKyAweDgwOworCisJLyoKKwkgKiBUaGUgYXN5bW1ldHJpYyBhY2Nlc3Mgc3RhdGUgaXMgY3ljbGVkIGFjY29yZGluZyB0byB0aGUgaG9zdF9pZC4KKwkgKi8KKwluID0gNDsKKwlpZiAoMCA9PSBzY3NpX2RlYnVnX3ZwZF91c2VfaG9zdG5vKSB7CisJICAgIGFycltuKytdID0gaG9zdF9ubyAlIDM7IC8qIEFzeW1tIGFjY2VzcyBzdGF0ZSAqLworCSAgICBhcnJbbisrXSA9IDB4MEY7IC8qIGNsYWltOiBhbGwgc3RhdGVzIGFyZSBzdXBwb3J0ZWQgKi8KKwl9IGVsc2UgeworCSAgICBhcnJbbisrXSA9IDB4MDsgLyogQWN0aXZlL09wdGltaXplZCBwYXRoICovCisJICAgIGFycltuKytdID0gMHgwMTsgLyogY2xhaW06IG9ubHkgc3VwcG9ydCBhY3RpdmUvb3B0aW1pemVkIHBhdGhzICovCisJfQorCWFycltuKytdID0gKHBvcnRfZ3JvdXBfYSA+PiA4KSAmIDB4ZmY7CisJYXJyW24rK10gPSBwb3J0X2dyb3VwX2EgJiAweGZmOworCWFycltuKytdID0gMDsgICAgLyogUmVzZXJ2ZWQgKi8KKwlhcnJbbisrXSA9IDA7ICAgIC8qIFN0YXR1cyBjb2RlICovCisJYXJyW24rK10gPSAwOyAgICAvKiBWZW5kb3IgdW5pcXVlICovCisJYXJyW24rK10gPSAweDE7ICAvKiBPbmUgcG9ydCBwZXIgZ3JvdXAgKi8KKwlhcnJbbisrXSA9IDA7ICAgIC8qIFJlc2VydmVkICovCisJYXJyW24rK10gPSAwOyAgICAvKiBSZXNlcnZlZCAqLworCWFycltuKytdID0gKHBvcnRfYSA+PiA4KSAmIDB4ZmY7CisJYXJyW24rK10gPSBwb3J0X2EgJiAweGZmOworCWFycltuKytdID0gMzsgICAgLyogUG9ydCB1bmF2YWlsYWJsZSAqLworCWFycltuKytdID0gMHgwODsgLyogY2xhaW06IG9ubHkgdW5hdmFpbGFsYmUgcGF0aHMgYXJlIHN1cHBvcnRlZCAqLworCWFycltuKytdID0gKHBvcnRfZ3JvdXBfYiA+PiA4KSAmIDB4ZmY7CisJYXJyW24rK10gPSBwb3J0X2dyb3VwX2IgJiAweGZmOworCWFycltuKytdID0gMDsgICAgLyogUmVzZXJ2ZWQgKi8KKwlhcnJbbisrXSA9IDA7ICAgIC8qIFN0YXR1cyBjb2RlICovCisJYXJyW24rK10gPSAwOyAgICAvKiBWZW5kb3IgdW5pcXVlICovCisJYXJyW24rK10gPSAweDE7ICAvKiBPbmUgcG9ydCBwZXIgZ3JvdXAgKi8KKwlhcnJbbisrXSA9IDA7ICAgIC8qIFJlc2VydmVkICovCisJYXJyW24rK10gPSAwOyAgICAvKiBSZXNlcnZlZCAqLworCWFycltuKytdID0gKHBvcnRfYiA+PiA4KSAmIDB4ZmY7CisJYXJyW24rK10gPSBwb3J0X2IgJiAweGZmOworCisJcmxlbiA9IG4gLSA0OworCWFyclswXSA9IChybGVuID4+IDI0KSAmIDB4ZmY7CisJYXJyWzFdID0gKHJsZW4gPj4gMTYpICYgMHhmZjsKKwlhcnJbMl0gPSAocmxlbiA+PiA4KSAmIDB4ZmY7CisJYXJyWzNdID0gcmxlbiAmIDB4ZmY7CisKKwkvKgorCSAqIFJldHVybiB0aGUgc21hbGxlc3QgdmFsdWUgb2YgZWl0aGVyCisJICogLSBUaGUgYWxsb2NhdGVkIGxlbmd0aAorCSAqIC0gVGhlIGNvbnN0cnVjdGVkIGNvbW1hbmQgbGVuZ3RoCisJICogLSBUaGUgbWF4aW11bSBhcnJheSBzaXplCisJICovCisJcmxlbiA9IG1pbihhbGVuLG4pOworCXJldCA9IGZpbGxfZnJvbV9kZXZfYnVmZmVyKHNjcCwgYXJyLAorCQkJCSAgIG1pbihybGVuLCBTREVCVUdfTUFYX1RHVFBHU19BUlJfU1opKTsKKwlrZnJlZShhcnIpOworCXJldHVybiByZXQ7Cit9CisKIC8qIDw8Rm9sbG93aW5nIG1vZGUgcGFnZSBpbmZvIGNvcGllZCBmcm9tIFNUMzE4NDUxTFc+PiAqLwogCiBzdGF0aWMgaW50IHJlc3BfZXJyX3JlY292X3BnKHVuc2lnbmVkIGNoYXIgKiBwLCBpbnQgcGNvbnRyb2wsIGludCB0YXJnZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwppbmRleCBhZmYxYjBjLi4yZWNiNmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKQEAgLTQ1Myw5ICs0NTMsMTggQEAKIH0KIAogLyoqCi0gKiBzY3NpX3NlbmRfZWhfY21uZCAgLSBzZW5kIGEgY21kIHRvIGEgZGV2aWNlIGFzIHBhcnQgb2YgZXJyb3IgcmVjb3ZlcnkuCi0gKiBAc2NtZDoJU0NTSSBDbWQgdG8gc2VuZC4KLSAqIEB0aW1lb3V0OglUaW1lb3V0IGZvciBjbWQuCisgKiBzY3NpX3NlbmRfZWhfY21uZCAgLSBzdWJtaXQgYSBzY3NpIGNvbW1hbmQgYXMgcGFydCBvZiBlcnJvciByZWNvcnkKKyAqIEBzY21kOiAgICAgICBTQ1NJIGNvbW1hbmQgc3RydWN0dXJlIHRvIGhpamFjaworICogQGNtbmQ6ICAgICAgIENEQiB0byBzZW5kCisgKiBAY21uZF9zaXplOiAgc2l6ZSBpbiBieXRlcyBvZiBAY21uZAorICogQHRpbWVvdXQ6ICAgIHRpbWVvdXQgZm9yIHRoaXMgcmVxdWVzdAorICogQGNvcHlfc2Vuc2U6IHJlcXVlc3Qgc2Vuc2UgZGF0YSBpZiBzZXQgdG8gMQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGEgc2NzaSBjb21tYW5kIGRvd24gdG8gYSB0YXJnZXQgZGV2aWNlCisgKiBhcyBwYXJ0IG9mIHRoZSBlcnJvciByZWNvdmVyeSBwcm9jZXNzLiAgSWYgQGNvcHlfc2Vuc2UgaXMgMCB0aGUgY29tbWFuZAorICogc2VudCBtdXN0IGJlIG9uZSB0aGF0IGRvZXMgbm90IHRyYW5zZmVyIGFueSBkYXRhLiAgSWYgQGNvcHlfc2Vuc2UgaXMgMQorICogdGhlIGNvbW1hbmQgbXVzdCBiZSBSRVFVRVNUX1NFTlNFIGFuZCB0aGlzIGZ1bmN0aW9ucyBjb3BpZXMgb3V0IHRoZQorICogc2Vuc2UgYnVmZmVyIGl0IGdvdCBpbnRvIEBzY21kLT5zZW5zZV9idWZmZXIuCiAgKgogICogUmV0dXJuIHZhbHVlOgogICogICAgU1VDQ0VTUyBvciBGQUlMRUQgb3IgTkVFRFNfUkVUUlkKQEAgLTQ2OSw2ICs0NzgsNyBAQAogCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGRvbmUpOwogCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dsOwogCXVuc2lnbmVkIGNoYXIgb2xkX2NtbmRbTUFYX0NPTU1BTkRfU0laRV07CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gb2xkX2RhdGFfZGlyZWN0aW9uOwogCXVuc2lnbmVkIHNob3J0IG9sZF91c2Vfc2c7CkBAIC01MDAsMTkgKzUxMCwyNCBAQAogCQlpZiAoc2hvc3QtPmhvc3R0LT51bmNoZWNrZWRfaXNhX2RtYSkKIAkJCWdmcF9tYXNrIHw9IF9fR0ZQX0RNQTsKIAotCQlzY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKLQkJc2NtZC0+cmVxdWVzdF9idWZmbGVuID0gMjUyOwotCQlzY21kLT5yZXF1ZXN0X2J1ZmZlciA9IGt6YWxsb2Moc2NtZC0+cmVxdWVzdF9idWZmbGVuLCBnZnBfbWFzayk7Ci0JCWlmICghc2NtZC0+cmVxdWVzdF9idWZmZXIpCisJCXNnbC5wYWdlID0gYWxsb2NfcGFnZShnZnBfbWFzayk7CisJCWlmICghc2dsLnBhZ2UpCiAJCQlyZXR1cm4gRkFJTEVEOworCQlzZ2wub2Zmc2V0ID0gMDsKKwkJc2dsLmxlbmd0aCA9IDI1MjsKKworCQlzY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKKwkJc2NtZC0+cmVxdWVzdF9idWZmbGVuID0gc2dsLmxlbmd0aDsKKwkJc2NtZC0+cmVxdWVzdF9idWZmZXIgPSAmc2dsOworCQlzY21kLT51c2Vfc2cgPSAxOwogCX0gZWxzZSB7CiAJCXNjbWQtPnJlcXVlc3RfYnVmZmVyID0gTlVMTDsKIAkJc2NtZC0+cmVxdWVzdF9idWZmbGVuID0gMDsKIAkJc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKKwkJc2NtZC0+dXNlX3NnID0gMDsKIAl9CiAKIAlzY21kLT51bmRlcmZsb3cgPSAwOwotCXNjbWQtPnVzZV9zZyA9IDA7CiAJc2NtZC0+Y21kX2xlbiA9IENPTU1BTkRfU0laRShzY21kLT5jbW5kWzBdKTsKIAogCWlmIChzZGV2LT5zY3NpX2xldmVsIDw9IFNDU0lfMikKQEAgLTU4Myw3ICs1OTgsNyBAQAogCQkJbWVtY3B5KHNjbWQtPnNlbnNlX2J1ZmZlciwgc2NtZC0+cmVxdWVzdF9idWZmZXIsCiAJCQkgICAgICAgc2l6ZW9mKHNjbWQtPnNlbnNlX2J1ZmZlcikpOwogCQl9Ci0JCWtmcmVlKHNjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwkJX19mcmVlX3BhZ2Uoc2dsLnBhZ2UpOwogCX0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IDc0M2Y2N2UuLjE3NDhlMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0zNiw3ICszNiw3IEBACiBzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgewogCXNpemVfdAkJc2l6ZTsKIAljaGFyCQkqbmFtZTsgCi0Ja21lbV9jYWNoZV90CSpzbGFiOworCXN0cnVjdCBrbWVtX2NhY2hlCSpzbGFiOwogCW1lbXBvb2xfdAkqcG9vbDsKIH07CiAKQEAgLTI0MSw3ICsyNDEsNyBAQAogCWNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKIH07CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnNjc2lfaW9fY29udGV4dF9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc2NzaV9pb19jb250ZXh0X2NhY2hlOwogCiBzdGF0aWMgdm9pZCBzY3NpX2VuZF9hc3luYyhzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgdXB0b2RhdGUpCiB7CkBAIC00MTAsNiArNDEwLDcgQEAKIAkJZ290byBmcmVlX3JlcTsKIAogCXJlcS0+Y21kX2xlbiA9IGNtZF9sZW47CisJbWVtc2V0KHJlcS0+Y21kLCAwLCBCTEtfTUFYX0NEQik7IC8qIEFUQVBJIGhhdGVzIGdhcmJhZ2UgYWZ0ZXIgQ0RCICovCiAJbWVtY3B5KHJlcS0+Y21kLCBjbWQsIHJlcS0+Y21kX2xlbik7CiAJcmVxLT5zZW5zZSA9IHNpb2MtPnNlbnNlOwogCXJlcS0+c2Vuc2VfbGVuID0gMDsKQEAgLTcwMyw3ICs3MDQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IHNjYXR0ZXJsaXN0ICpzY3NpX2FsbG9jX3NndGFibGUoc3RydWN0IHNjc2lfY21uZCAqY21kLCBnZnBfdCBnZnBfbWFzaykKK3N0cnVjdCBzY2F0dGVybGlzdCAqc2NzaV9hbGxvY19zZ3RhYmxlKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHNjc2lfaG9zdF9zZ19wb29sICpzZ3A7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2w7CkBAIC03NDQsNyArNzQ1LDkgQEAKIAlyZXR1cm4gc2dsOwogfQogCi1zdGF0aWMgdm9pZCBzY3NpX2ZyZWVfc2d0YWJsZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IGluZGV4KQorRVhQT1JUX1NZTUJPTChzY3NpX2FsbG9jX3NndGFibGUpOworCit2b2lkIHNjc2lfZnJlZV9zZ3RhYmxlKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IHNjc2lfaG9zdF9zZ19wb29sICpzZ3A7CiAKQEAgLTc1NCw2ICs3NTcsOCBAQAogCW1lbXBvb2xfZnJlZShzZ2wsIHNncC0+cG9vbCk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc2NzaV9mcmVlX3NndGFibGUpOworCiAvKgogICogRnVuY3Rpb246ICAgIHNjc2lfcmVsZWFzZV9idWZmZXJzKCkKICAqCkBAIC05OTUsMjUgKzEwMDAsMTQgQEAKIAlpbnQJCSAgIGNvdW50OwogCiAJLyoKLQkgKiBpZiB0aGlzIGlzIGEgcnEtPmRhdGEgYmFzZWQgUkVRX0JMT0NLX1BDLCBzZXR1cCBmb3IgYSBub24tc2cgeGZlcgotCSAqLwotCWlmIChibGtfcGNfcmVxdWVzdChyZXEpICYmICFyZXEtPmJpbykgewotCQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHJlcS0+ZGF0YV9sZW47Ci0JCWNtZC0+cmVxdWVzdF9idWZmZXIgPSByZXEtPmRhdGE7Ci0JCXJlcS0+YnVmZmVyID0gcmVxLT5kYXRhOwotCQljbWQtPnVzZV9zZyA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogd2UgdXNlZCB0byBub3QgdXNlIHNjYXR0ZXItZ2F0aGVyIGZvciBzaW5nbGUgc2VnbWVudCByZXF1ZXN0LAorCSAqIFdlIHVzZWQgdG8gbm90IHVzZSBzY2F0dGVyLWdhdGhlciBmb3Igc2luZ2xlIHNlZ21lbnQgcmVxdWVzdCwKIAkgKiBidXQgbm93IHdlIGRvIChpdCBtYWtlcyBoaWdobWVtIEkvTyBlYXNpZXIgdG8gc3VwcG9ydCB3aXRob3V0CiAJICoga21hcHBpbmcgcGFnZXMpCiAJICovCiAJY21kLT51c2Vfc2cgPSByZXEtPm5yX3BoeXNfc2VnbWVudHM7CiAKIAkvKgotCSAqIGlmIHNnIHRhYmxlIGFsbG9jYXRpb24gZmFpbHMsIHJlcXVldWUgcmVxdWVzdCBsYXRlci4KKwkgKiBJZiBzZyB0YWJsZSBhbGxvY2F0aW9uIGZhaWxzLCByZXF1ZXVlIHJlcXVlc3QgbGF0ZXIuCiAJICovCiAJc2dwbnQgPSBzY3NpX2FsbG9jX3NndGFibGUoY21kLCBHRlBfQVRPTUlDKTsKIAlpZiAodW5saWtlbHkoIXNncG50KSkgewpAQCAtMTAyMSwyNCArMTAxNSwyMSBAQAogCQlyZXR1cm4gQkxLUFJFUF9ERUZFUjsKIAl9CiAKKwlyZXEtPmJ1ZmZlciA9IE5VTEw7CiAJY21kLT5yZXF1ZXN0X2J1ZmZlciA9IChjaGFyICopIHNncG50OwotCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gcmVxLT5ucl9zZWN0b3JzIDw8IDk7CiAJaWYgKGJsa19wY19yZXF1ZXN0KHJlcSkpCiAJCWNtZC0+cmVxdWVzdF9idWZmbGVuID0gcmVxLT5kYXRhX2xlbjsKLQlyZXEtPmJ1ZmZlciA9IE5VTEw7CisJZWxzZQorCQljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHJlcS0+bnJfc2VjdG9ycyA8PCA5OwogCiAJLyogCiAJICogTmV4dCwgd2FsayB0aGUgbGlzdCwgYW5kIGZpbGwgaW4gdGhlIGFkZHJlc3NlcyBhbmQgc2l6ZXMgb2YKIAkgKiBlYWNoIHNlZ21lbnQuCiAJICovCiAJY291bnQgPSBibGtfcnFfbWFwX3NnKHJlcS0+cSwgcmVxLCBjbWQtPnJlcXVlc3RfYnVmZmVyKTsKLQotCS8qCi0JICogbWFwcGVkIHdlbGwsIHNlbmQgaXQgb2ZmCi0JICovCiAJaWYgKGxpa2VseShjb3VudCA8PSBjbWQtPnVzZV9zZykpIHsKIAkJY21kLT51c2Vfc2cgPSBjb3VudDsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBCTEtQUkVQX09LOwogCX0KIAogCXByaW50ayhLRVJOX0VSUiAiSW5jb3JyZWN0IG51bWJlciBvZiBzZWdtZW50cyBhZnRlciBidWlsZGluZyBsaXN0XG4iKTsKQEAgLTEwNjgsNiArMTA1OSwyNyBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAorc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfZ2V0X2NtZF9mcm9tX3JlcShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCXN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCisJaWYgKCFyZXEtPnNwZWNpYWwpIHsKKwkJY21kID0gc2NzaV9nZXRfY29tbWFuZChzZGV2LCBHRlBfQVRPTUlDKTsKKwkJaWYgKHVubGlrZWx5KCFjbWQpKQorCQkJcmV0dXJuIE5VTEw7CisJCXJlcS0+c3BlY2lhbCA9IGNtZDsKKwl9IGVsc2UgeworCQljbWQgPSByZXEtPnNwZWNpYWw7CisJfQorCisJLyogcHVsbCBhIHRhZyBvdXQgb2YgdGhlIHJlcXVlc3QgaWYgd2UgaGF2ZSBvbmUgKi8KKwljbWQtPnRhZyA9IHJlcS0+dGFnOworCWNtZC0+cmVxdWVzdCA9IHJlcTsKKworCXJldHVybiBjbWQ7Cit9CisKIHN0YXRpYyB2b2lkIHNjc2lfYmxrX3BjX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCUJVR19PTighYmxrX3BjX3JlcXVlc3QoY21kLT5yZXF1ZXN0KSk7CkBAIC0xMDgwLDExICsxMDkyLDM5IEBACiAJc2NzaV9pb19jb21wbGV0aW9uKGNtZCwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBzY3NpX3NldHVwX2Jsa19wY19jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3N0YXRpYyBpbnQgc2NzaV9zZXR1cF9ibGtfcGNfY21uZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJlcSA9IGNtZC0+cmVxdWVzdDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CiAKLQlCVUdfT04oc2l6ZW9mKHJlcS0+Y21kKSA+IHNpemVvZihjbWQtPmNtbmQpKTsKKwljbWQgPSBzY3NpX2dldF9jbWRfZnJvbV9yZXEoc2RldiwgcmVxKTsKKwlpZiAodW5saWtlbHkoIWNtZCkpCisJCXJldHVybiBCTEtQUkVQX0RFRkVSOworCisJLyoKKwkgKiBCTE9DS19QQyByZXF1ZXN0cyBtYXkgdHJhbnNmZXIgZGF0YSwgaW4gd2hpY2ggY2FzZSB0aGV5IG11c3QKKwkgKiBhIGJpbyBhdHRhY2hlZCB0byB0aGVtLiAgT3IgdGhleSBtaWdodCBjb250YWluIGEgU0NTSSBjb21tYW5kCisJICogdGhhdCBkb2VzIG5vdCB0cmFuc2ZlciBkYXRhLCBpbiB3aGljaCBjYXNlIHRoZXkgbWF5IG9wdGlvbmFsbHkKKwkgKiBzdWJtaXQgYSByZXF1ZXN0IHdpdGhvdXQgYW4gYXR0YWNoZWQgYmlvLgorCSAqLworCWlmIChyZXEtPmJpbykgeworCQlpbnQgcmV0OworCisJCUJVR19PTighcmVxLT5ucl9waHlzX3NlZ21lbnRzKTsKKworCQlyZXQgPSBzY3NpX2luaXRfaW8oY21kKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCUJVR19PTihyZXEtPmRhdGFfbGVuKTsKKwkJQlVHX09OKHJlcS0+ZGF0YSk7CisKKwkJY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPSAwOworCQljbWQtPnJlcXVlc3RfYnVmZmVyID0gTlVMTDsKKwkJY21kLT51c2Vfc2cgPSAwOworCQlyZXEtPmJ1ZmZlciA9IE5VTEw7CisJfQorCisJQlVJTERfQlVHX09OKHNpemVvZihyZXEtPmNtZCkgPiBzaXplb2YoY21kLT5jbW5kKSk7CiAJbWVtY3B5KGNtZC0+Y21uZCwgcmVxLT5jbWQsIHNpemVvZihjbWQtPmNtbmQpKTsKIAljbWQtPmNtZF9sZW4gPSByZXEtPmNtZF9sZW47CiAJaWYgKCFyZXEtPmRhdGFfbGVuKQpAQCAtMTA5OCwxNTQgKzExMzgsMTM4IEBACiAJY21kLT5hbGxvd2VkID0gcmVxLT5yZXRyaWVzOwogCWNtZC0+dGltZW91dF9wZXJfY29tbWFuZCA9IHJlcS0+dGltZW91dDsKIAljbWQtPmRvbmUgPSBzY3NpX2Jsa19wY19kb25lOworCXJldHVybiBCTEtQUkVQX09LOworfQorCisvKgorICogU2V0dXAgYSBSRVFfVFlQRV9GUyBjb21tYW5kLiAgVGhlc2UgYXJlIHNpbXBsZSByZWFkL3dyaXRlIHJlcXVlc3QKKyAqIGZyb20gZmlsZXN5c3RlbXMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQgdG8gU0NTSSBDREJzIGZyb20KKyAqIHRoZSBVTEQuCisgKi8KK3N0YXRpYyBpbnQgc2NzaV9zZXR1cF9mc19jbW5kKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0IHNjc2lfZHJpdmVyICpkcnY7CisJaW50IHJldDsKKworCS8qCisJICogRmlsZXN5c3RlbSByZXF1ZXN0cyBtdXN0IHRyYW5zZmVyIGRhdGEuCisJICovCisJQlVHX09OKCFyZXEtPm5yX3BoeXNfc2VnbWVudHMpOworCisJY21kID0gc2NzaV9nZXRfY21kX2Zyb21fcmVxKHNkZXYsIHJlcSk7CisJaWYgKHVubGlrZWx5KCFjbWQpKQorCQlyZXR1cm4gQkxLUFJFUF9ERUZFUjsKKworCXJldCA9IHNjc2lfaW5pdF9pbyhjbWQpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBhY3R1YWwgU0NTSSBjb21tYW5kIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJZHJ2ID0gKihzdHJ1Y3Qgc2NzaV9kcml2ZXIgKiopcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJaWYgKHVubGlrZWx5KCFkcnYtPmluaXRfY29tbWFuZChjbWQpKSkgeworCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOworCQlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CisJCXJldHVybiBCTEtQUkVQX0tJTEw7CisJfQorCisJcmV0dXJuIEJMS1BSRVBfT0s7CiB9CiAKIHN0YXRpYyBpbnQgc2NzaV9wcmVwX2ZuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHEtPnF1ZXVlZGF0YTsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7Ci0JaW50IHNwZWNpYWxzX29ubHkgPSAwOworCWludCByZXQgPSBCTEtQUkVQX09LOwogCiAJLyoKLQkgKiBKdXN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgZGV2aWNlIGlzIG9ubGluZS4gIElmIGl0IGlzbid0LCB3ZQotCSAqIHJlZnVzZSB0byBwcm9jZXNzIGFueSBjb21tYW5kcy4gIFRoZSBkZXZpY2UgbXVzdCBiZSBicm91Z2h0Ci0JICogb25saW5lIGJlZm9yZSB0cnlpbmcgYW55IHJlY292ZXJ5IGNvbW1hbmRzCisJICogSWYgdGhlIGRldmljZSBpcyBub3QgaW4gcnVubmluZyBzdGF0ZSB3ZSB3aWxsIHJlamVjdCBzb21lCisJICogb3IgYWxsIGNvbW1hbmRzLgogCSAqLwotCWlmICh1bmxpa2VseSghc2NzaV9kZXZpY2Vfb25saW5lKHNkZXYpKSkgewotCQlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2RldiwKLQkJCSAgICAicmVqZWN0aW5nIEkvTyB0byBvZmZsaW5lIGRldmljZVxuIik7Ci0JCWdvdG8ga2lsbDsKLQl9CiAJaWYgKHVubGlrZWx5KHNkZXYtPnNkZXZfc3RhdGUgIT0gU0RFVl9SVU5OSU5HKSkgewotCQkvKiBPSywgd2UncmUgbm90IGluIGEgcnVubmluZyBzdGF0ZSBkb24ndCBwcmVwCi0JCSAqIHVzZXIgY29tbWFuZHMgKi8KLQkJaWYgKHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9ERUwpIHsKLQkJCS8qIERldmljZSBpcyBmdWxseSBkZWxldGVkLCBubyBjb21tYW5kcwotCQkJICogYXQgYWxsIGFsbG93ZWQgZG93biAqLworCQlzd2l0Y2ggKHNkZXYtPnNkZXZfc3RhdGUpIHsKKwkJY2FzZSBTREVWX09GRkxJTkU6CisJCQkvKgorCQkJICogSWYgdGhlIGRldmljZSBpcyBvZmZsaW5lIHdlIHJlZnVzZSB0byBwcm9jZXNzIGFueQorCQkJICogY29tbWFuZHMuICBUaGUgZGV2aWNlIG11c3QgYmUgYnJvdWdodCBvbmxpbmUKKwkJCSAqIGJlZm9yZSB0cnlpbmcgYW55IHJlY292ZXJ5IGNvbW1hbmRzLgorCQkJICovCisJCQlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2RldiwKKwkJCQkgICAgInJlamVjdGluZyBJL08gdG8gb2ZmbGluZSBkZXZpY2VcbiIpOworCQkJcmV0ID0gQkxLUFJFUF9LSUxMOworCQkJYnJlYWs7CisJCWNhc2UgU0RFVl9ERUw6CisJCQkvKgorCQkJICogSWYgdGhlIGRldmljZSBpcyBmdWxseSBkZWxldGVkLCB3ZSByZWZ1c2UgdG8KKwkJCSAqIHByb2Nlc3MgYW55IGNvbW1hbmRzIGFzIHdlbGwuCisJCQkgKi8KIAkJCXNkZXZfcHJpbnRrKEtFUk5fRVJSLCBzZGV2LAogCQkJCSAgICAicmVqZWN0aW5nIEkvTyB0byBkZWFkIGRldmljZVxuIik7Ci0JCQlnb3RvIGtpbGw7CisJCQlyZXQgPSBCTEtQUkVQX0tJTEw7CisJCQlicmVhazsKKwkJY2FzZSBTREVWX1FVSUVTQ0U6CisJCWNhc2UgU0RFVl9CTE9DSzoKKwkJCS8qCisJCQkgKiBJZiB0aGUgZGV2aWNlcyBpcyBibG9ja2VkIHdlIGRlZmVyIG5vcm1hbCBjb21tYW5kcy4KKwkJCSAqLworCQkJaWYgKCEocmVxLT5jbWRfZmxhZ3MgJiBSRVFfUFJFRU1QVCkpCisJCQkJcmV0ID0gQkxLUFJFUF9ERUZFUjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIEZvciBhbnkgb3RoZXIgbm90IGZ1bGx5IG9ubGluZSBzdGF0ZSB3ZSBvbmx5IGFsbG93CisJCQkgKiBzcGVjaWFsIGNvbW1hbmRzLiAgSW4gcGFydGljdWxhciBhbnkgdXNlciBpbml0aWF0ZWQKKwkJCSAqIGNvbW1hbmQgaXMgbm90IGFsbG93ZWQuCisJCQkgKi8KKwkJCWlmICghKHJlcS0+Y21kX2ZsYWdzICYgUkVRX1BSRUVNUFQpKQorCQkJCXJldCA9IEJMS1BSRVBfS0lMTDsKKwkJCWJyZWFrOwogCQl9Ci0JCS8qIE9LLCB3ZSBvbmx5IGFsbG93IHNwZWNpYWwgY29tbWFuZHMgKGkuZS4gbm90Ci0JCSAqIHVzZXIgaW5pdGlhdGVkIG9uZXMgKi8KLQkJc3BlY2lhbHNfb25seSA9IHNkZXYtPnNkZXZfc3RhdGU7CisKKwkJaWYgKHJldCAhPSBCTEtQUkVQX09LKQorCQkJZ290byBvdXQ7CiAJfQogCi0JLyoKLQkgKiBGaW5kIHRoZSBhY3R1YWwgZGV2aWNlIGRyaXZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21tYW5kLgotCSAqIFRoZSBTUEVDSUFMIHJlcXVlc3RzIGFyZSB0aGluZ3MgbGlrZSBjaGFyYWN0ZXIgZGV2aWNlIG9yCi0JICogaW9jdGxzLCB3aGljaCBkaWQgbm90IG9yaWdpbmF0ZSBmcm9tIGxsX3J3X2Jsay4gIE5vdGUgdGhhdAotCSAqIHRoZSBzcGVjaWFsIGZpZWxkIGlzIGFsc28gdXNlZCB0byBpbmRpY2F0ZSB0aGUgY21kIGZvcgotCSAqIHRoZSByZW1haW5kZXIgb2YgYSBwYXJ0aWFsbHkgZnVsZmlsbGVkIHJlcXVlc3QgdGhhdCBjYW4gCi0JICogY29tZSB1cCB3aGVuIHRoZXJlIGlzIGEgbWVkaXVtIGVycm9yLiAgV2UgaGF2ZSB0byB0cmVhdAotCSAqIHRoZXNlIHR3byBjYXNlcyBkaWZmZXJlbnRseS4gIFdlIGRpZmZlcmVudGlhdGUgYnkgbG9va2luZwotCSAqIGF0IHJlcXVlc3QtPmNtZCwgYXMgdGhpcyB0ZWxscyB1cyB0aGUgcmVhbCBzdG9yeS4KLQkgKi8KLQlpZiAoYmxrX3NwZWNpYWxfcmVxdWVzdChyZXEpICYmIHJlcS0+c3BlY2lhbCkKLQkJY21kID0gcmVxLT5zcGVjaWFsOwotCWVsc2UgaWYgKGJsa19wY19yZXF1ZXN0KHJlcSkgfHwgYmxrX2ZzX3JlcXVlc3QocmVxKSkgewotCQlpZiAodW5saWtlbHkoc3BlY2lhbHNfb25seSkgJiYgIShyZXEtPmNtZF9mbGFncyAmIFJFUV9QUkVFTVBUKSl7Ci0JCQlpZiAoc3BlY2lhbHNfb25seSA9PSBTREVWX1FVSUVTQ0UgfHwKLQkJCSAgICBzcGVjaWFsc19vbmx5ID09IFNERVZfQkxPQ0spCi0JCQkJZ290byBkZWZlcjsKLQkJCQotCQkJc2Rldl9wcmludGsoS0VSTl9FUlIsIHNkZXYsCi0JCQkJICAgICJyZWplY3RpbmcgSS9PIHRvIGRldmljZSBiZWluZyByZW1vdmVkXG4iKTsKLQkJCWdvdG8ga2lsbDsKLQkJfQotCQkJCisJc3dpdGNoIChyZXEtPmNtZF90eXBlKSB7CisJY2FzZSBSRVFfVFlQRV9CTE9DS19QQzoKKwkJcmV0ID0gc2NzaV9zZXR1cF9ibGtfcGNfY21uZChzZGV2LCByZXEpOworCQlicmVhazsKKwljYXNlIFJFUV9UWVBFX0ZTOgorCQlyZXQgPSBzY3NpX3NldHVwX2ZzX2NtbmQoc2RldiwgcmVxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJLyoKLQkJICogTm93IHRyeSBhbmQgZmluZCBhIGNvbW1hbmQgYmxvY2sgdGhhdCB3ZSBjYW4gdXNlLgotCQkgKi8KLQkJaWYgKCFyZXEtPnNwZWNpYWwpIHsKLQkJCWNtZCA9IHNjc2lfZ2V0X2NvbW1hbmQoc2RldiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAodW5saWtlbHkoIWNtZCkpCi0JCQkJZ290byBkZWZlcjsKLQkJfSBlbHNlCi0JCQljbWQgPSByZXEtPnNwZWNpYWw7Ci0JCQotCQkvKiBwdWxsIGEgdGFnIG91dCBvZiB0aGUgcmVxdWVzdCBpZiB3ZSBoYXZlIG9uZSAqLwotCQljbWQtPnRhZyA9IHJlcS0+dGFnOwotCX0gZWxzZSB7Ci0JCWJsa19kdW1wX3JxX2ZsYWdzKHJlcSwgIlNDU0kgYmFkIHJlcSIpOwotCQlnb3RvIGtpbGw7Ci0JfQotCQotCS8qIG5vdGUgdGhlIG92ZXJsb2FkaW5nIG9mIHJlcS0+c3BlY2lhbC4gIFdoZW4gdGhlIHRhZwotCSAqIGlzIGFjdGl2ZSBpdCBhbHdheXMgbWVhbnMgY21kLiAgSWYgdGhlIHRhZyBnb2VzCi0JICogYmFjayBmb3IgcmUtcXVldWVpbmcsIGl0IG1heSBiZSByZXNldCAqLwotCXJlcS0+c3BlY2lhbCA9IGNtZDsKLQljbWQtPnJlcXVlc3QgPSByZXE7Ci0JCi0JLyoKLQkgKiBGSVhNRTogZHJvcCB0aGUgbG9jayBoZXJlIGJlY2F1c2UgdGhlIGZ1bmN0aW9ucyBiZWxvdwotCSAqIGV4cGVjdCB0byBiZSBjYWxsZWQgd2l0aG91dCB0aGUgcXVldWUgbG9jayBoZWxkLiAgQWxzbywKLQkgKiBwcmV2aW91c2x5LCB3ZSBkZXF1ZXVlZCB0aGUgcmVxdWVzdCBiZWZvcmUgZHJvcHBpbmcgdGhlCi0JICogbG9jay4gIFdlIGhvcGUgUkVRX1NUQVJURUQgcHJldmVudHMgYW55dGhpbmcgdW50b3dhcmQgZnJvbQotCSAqIGhhcHBlbmluZyBub3cuCi0JICovCi0JaWYgKGJsa19mc19yZXF1ZXN0KHJlcSkgfHwgYmxrX3BjX3JlcXVlc3QocmVxKSkgewotCQlpbnQgcmV0OwotCi0JCS8qCi0JCSAqIFRoaXMgd2lsbCBkbyBhIGNvdXBsZSBvZiB0aGluZ3M6Ci0JCSAqICAxKSBGaWxsIGluIHRoZSBhY3R1YWwgU0NTSSBjb21tYW5kLgotCQkgKiAgMikgRmlsbCBpbiBhbnkgb3RoZXIgdXBwZXItbGV2ZWwgc3BlY2lmaWMgZmllbGRzCi0JCSAqICh0aW1lb3V0KS4KKwkJICogQWxsIG90aGVyIGNvbW1hbmQgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCiAJCSAqCi0JCSAqIElmIHRoaXMgcmV0dXJucyAwLCBpdCBtZWFucyB0aGF0IHRoZSByZXF1ZXN0IGZhaWxlZAotCQkgKiAocmVhZGluZyBwYXN0IGVuZCBvZiBkaXNrLCByZWFkaW5nIG9mZmxpbmUgZGV2aWNlLAotCQkgKiBldGMpLiAgIFRoaXMgd29uJ3QgYWN0dWFsbHkgdGFsayB0byB0aGUgZGV2aWNlLCBidXQKLQkJICogc29tZSBraW5kcyBvZiBjb25zaXN0ZW5jeSBjaGVja2luZyBtYXkgY2F1c2UgdGhlCQotCQkgKiByZXF1ZXN0IHRvIGJlIHJlamVjdGVkIGltbWVkaWF0ZWx5LgorCQkgKiBOb3RlIHRoYXQgdGhlc2UgZGF5cyB0aGUgU0NTSSBzdWJzeXN0ZW0gZG9lcyBub3QgdXNlCisJCSAqIFJFUV9UWVBFX1NQRUNJQUwgcmVxdWVzdHMgYW55bW9yZS4gIFRoZXNlIGFyZSBvbmx5IHVzZWQKKwkJICogKGRpcmVjdGx5IG9yIHZpYSBibGtfaW5zZXJ0X3JlcXVlc3QpIGJ5IG5vbi1TQ1NJIGRyaXZlcnMuCiAJCSAqLwotCi0JCS8qIAotCQkgKiBUaGlzIHNldHMgdXAgdGhlIHNjYXR0ZXItZ2F0aGVyIHRhYmxlIChhbGxvY2F0aW5nIGlmCi0JCSAqIHJlcXVpcmVkKS4KLQkJICovCi0JCXJldCA9IHNjc2lfaW5pdF9pbyhjbWQpOwotCQlzd2l0Y2gocmV0KSB7Ci0JCQkvKiBGb3IgQkxLUFJFUF9LSUxML0RFRkVSIHRoZSBjbWQgd2FzIHJlbGVhc2VkICovCi0JCWNhc2UgQkxLUFJFUF9LSUxMOgotCQkJZ290byBraWxsOwotCQljYXNlIEJMS1BSRVBfREVGRVI6Ci0JCQlnb3RvIGRlZmVyOwotCQl9Ci0JCQotCQkvKgotCQkgKiBJbml0aWFsaXplIHRoZSBhY3R1YWwgU0NTSSBjb21tYW5kIGZvciB0aGlzIHJlcXVlc3QuCi0JCSAqLwotCQlpZiAoYmxrX3BjX3JlcXVlc3QocmVxKSkgewotCQkJc2NzaV9zZXR1cF9ibGtfcGNfY21uZChjbWQpOwotCQl9IGVsc2UgaWYgKHJlcS0+cnFfZGlzaykgewotCQkJc3RydWN0IHNjc2lfZHJpdmVyICpkcnY7Ci0KLQkJCWRydiA9ICooc3RydWN0IHNjc2lfZHJpdmVyICoqKXJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwotCQkJaWYgKHVubGlrZWx5KCFkcnYtPmluaXRfY29tbWFuZChjbWQpKSkgewotCQkJCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7Ci0JCQkJc2NzaV9wdXRfY29tbWFuZChjbWQpOwotCQkJCWdvdG8ga2lsbDsKLQkJCX0KLQkJfQorCQlibGtfZHVtcF9ycV9mbGFncyhyZXEsICJTQ1NJIGJhZCByZXEiKTsKKwkJcmV0ID0gQkxLUFJFUF9LSUxMOworCQlicmVhazsKIAl9CiAKLQkvKgotCSAqIFRoZSByZXF1ZXN0IGlzIG5vdyBwcmVwcGVkLCBubyBuZWVkIHRvIGNvbWUgYmFjayBoZXJlCi0JICovCi0JcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX0RPTlRQUkVQOwotCXJldHVybiBCTEtQUkVQX09LOworIG91dDoKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQkxLUFJFUF9LSUxMOgorCQlyZXEtPmVycm9ycyA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlicmVhazsKKwljYXNlIEJMS1BSRVBfREVGRVI6CisJCS8qCisJCSAqIElmIHdlIGRlZmVyLCB0aGUgZWx2X25leHRfcmVxdWVzdCgpIHJldHVybnMgTlVMTCwgYnV0IHRoZQorCQkgKiBxdWV1ZSBtdXN0IGJlIHJlc3RhcnRlZCwgc28gd2UgcGx1ZyBoZXJlIGlmIG5vIHJldHVybmluZworCQkgKiBjb21tYW5kIHdpbGwgYXV0b21hdGljYWxseSBkbyB0aGF0LgorCQkgKi8KKwkJaWYgKHNkZXYtPmRldmljZV9idXN5ID09IDApCisJCQlibGtfcGx1Z19kZXZpY2UocSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcS0+Y21kX2ZsYWdzIHw9IFJFUV9ET05UUFJFUDsKKwl9CiAKLSBkZWZlcjoKLQkvKiBJZiB3ZSBkZWZlciwgdGhlIGVsdl9uZXh0X3JlcXVlc3QoKSByZXR1cm5zIE5VTEwsIGJ1dCB0aGUKLQkgKiBxdWV1ZSBtdXN0IGJlIHJlc3RhcnRlZCwgc28gd2UgcGx1ZyBoZXJlIGlmIG5vIHJldHVybmluZwotCSAqIGNvbW1hbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGRvIHRoYXQuICovCi0JaWYgKHNkZXYtPmRldmljZV9idXN5ID09IDApCi0JCWJsa19wbHVnX2RldmljZShxKTsKLQlyZXR1cm4gQkxLUFJFUF9ERUZFUjsKLSBraWxsOgotCXJlcS0+ZXJyb3JzID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7Ci0JcmV0dXJuIEJMS1BSRVBfS0lMTDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTU0NywyOSArMTU3MSw0MCBAQAogfQogRVhQT1JUX1NZTUJPTChzY3NpX2NhbGN1bGF0ZV9ib3VuY2VfbGltaXQpOwogCi1zdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqc2NzaV9hbGxvY19xdWV1ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCitzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqX19zY3NpX2FsbG9jX3F1ZXVlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCQkgcmVxdWVzdF9mbl9wcm9jICpyZXF1ZXN0X2ZuKQogewotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAotCXEgPSBibGtfaW5pdF9xdWV1ZShzY3NpX3JlcXVlc3RfZm4sIE5VTEwpOworCXEgPSBibGtfaW5pdF9xdWV1ZShyZXF1ZXN0X2ZuLCBOVUxMKTsKIAlpZiAoIXEpCiAJCXJldHVybiBOVUxMOwogCi0JYmxrX3F1ZXVlX3ByZXBfcnEocSwgc2NzaV9wcmVwX2ZuKTsKLQogCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgc2hvc3QtPnNnX3RhYmxlc2l6ZSk7CiAJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIFNDU0lfTUFYX1BIWVNfU0VHTUVOVFMpOwogCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCBzaG9zdC0+bWF4X3NlY3RvcnMpOwogCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQocSwgc2NzaV9jYWxjdWxhdGVfYm91bmNlX2xpbWl0KHNob3N0KSk7CiAJYmxrX3F1ZXVlX3NlZ21lbnRfYm91bmRhcnkocSwgc2hvc3QtPmRtYV9ib3VuZGFyeSk7Ci0JYmxrX3F1ZXVlX2lzc3VlX2ZsdXNoX2ZuKHEsIHNjc2lfaXNzdWVfZmx1c2hfZm4pOwotCWJsa19xdWV1ZV9zb2Z0aXJxX2RvbmUocSwgc2NzaV9zb2Z0aXJxX2RvbmUpOwogCiAJaWYgKCFzaG9zdC0+dXNlX2NsdXN0ZXJpbmcpCiAJCWNsZWFyX2JpdChRVUVVRV9GTEFHX0NMVVNURVIsICZxLT5xdWV1ZV9mbGFncyk7CiAJcmV0dXJuIHE7CiB9CitFWFBPUlRfU1lNQk9MKF9fc2NzaV9hbGxvY19xdWV1ZSk7CisKK3N0cnVjdCByZXF1ZXN0X3F1ZXVlICpzY3NpX2FsbG9jX3F1ZXVlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKKworCXEgPSBfX3Njc2lfYWxsb2NfcXVldWUoc2Rldi0+aG9zdCwgc2NzaV9yZXF1ZXN0X2ZuKTsKKwlpZiAoIXEpCisJCXJldHVybiBOVUxMOworCisJYmxrX3F1ZXVlX3ByZXBfcnEocSwgc2NzaV9wcmVwX2ZuKTsKKwlibGtfcXVldWVfaXNzdWVfZmx1c2hfZm4ocSwgc2NzaV9pc3N1ZV9mbHVzaF9mbik7CisJYmxrX3F1ZXVlX3NvZnRpcnFfZG9uZShxLCBzY3NpX3NvZnRpcnFfZG9uZSk7CisJcmV0dXJuIHE7Cit9CiAKIHZvaWQgc2NzaV9mcmVlX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCmluZGV4IDVkMDIzZDQuLmY0NThjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKQEAgLTM5LDYgKzM5LDkgQEAKIAl7IH07CiAjZW5kaWYKIAorLyogc2NzaV9zY2FuLmMgKi8KK2ludCBzY3NpX2NvbXBsZXRlX2FzeW5jX3NjYW5zKHZvaWQpOworCiAvKiBzY3NpX2RldmluZm8uYyAqLwogZXh0ZXJuIGludCBzY3NpX2dldF9kZXZpY2VfZmxhZ3Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAogCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICp2ZW5kb3IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKaW5kZXggZmQ5ZTI4MS4uMTRlNjM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwpAQCAtMjksNyArMjksOSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KQEAgLTg3LDYgKzg5LDE3IEBACiBNT0RVTEVfUEFSTV9ERVNDKG1heF9sdW5zLAogCQkgImxhc3Qgc2NzaSBMVU4gKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDJeMzItMSkiKTsKIAorI2lmZGVmIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMKKyNkZWZpbmUgU0NTSV9TQ0FOX1RZUEVfREVGQVVMVCAiYXN5bmMiCisjZWxzZQorI2RlZmluZSBTQ1NJX1NDQU5fVFlQRV9ERUZBVUxUICJzeW5jIgorI2VuZGlmCisKK3N0YXRpYyBjaGFyIHNjc2lfc2Nhbl90eXBlWzZdID0gU0NTSV9TQ0FOX1RZUEVfREVGQVVMVDsKKworbW9kdWxlX3BhcmFtX3N0cmluZyhzY2FuLCBzY3NpX3NjYW5fdHlwZSwgc2l6ZW9mKHNjc2lfc2Nhbl90eXBlKSwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHNjYW4sICJzeW5jLCBhc3luYyBvciBub25lIik7CisKIC8qCiAgKiBtYXhfc2NzaV9yZXBvcnRfbHVuczogdGhlIG1heGltdW0gbnVtYmVyIG9mIExVTlMgdGhhdCB3aWxsIGJlCiAgKiByZXR1cm5lZCBmcm9tIHRoZSBSRVBPUlQgTFVOUyBjb21tYW5kLiA4IHRpbWVzIHRoaXMgdmFsdWUgbXVzdApAQCAtMTA4LDYgKzEyMSw2OCBAQAogCQkgIlRpbWVvdXQgKGluIHNlY29uZHMpIHdhaXRpbmcgZm9yIGRldmljZXMgdG8gYW5zd2VyIElOUVVJUlkuIgogCQkgIiBEZWZhdWx0IGlzIDUuIFNvbWUgbm9uLWNvbXBsaWFudCBkZXZpY2VzIG5lZWQgbW9yZS4iKTsKIAorc3RhdGljIERFRklORV9TUElOTE9DSyhhc3luY19zY2FuX2xvY2spOworc3RhdGljIExJU1RfSEVBRChzY2FubmluZ19ob3N0cyk7CisKK3N0cnVjdCBhc3luY19zY2FuX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBwcmV2X2ZpbmlzaGVkOworfTsKKworLyoqCisgKiBzY3NpX2NvbXBsZXRlX2FzeW5jX3NjYW5zIC0gV2FpdCBmb3IgYXN5bmNocm9ub3VzIHNjYW5zIHRvIGNvbXBsZXRlCisgKgorICogQXN5bmNocm9ub3VzIHNjYW5zIGFkZCB0aGVtc2VsdmVzIHRvIHRoZSBzY2FubmluZ19ob3N0cyBsaXN0LiAgT25jZQorICogdGhhdCBsaXN0IGlzIGVtcHR5LCB3ZSBrbm93IHRoYXQgdGhlIHNjYW5zIGFyZSBjb21wbGV0ZS4gIFJhdGhlciB0aGFuCisgKiB3YWtpbmcgdXAgcGVyaW9kaWNhbGx5IHRvIGNoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgbGlzdCwgd2UgcHJldGVuZCB0byBiZQorICogYSBzY2FubmluZyB0YXNrIGJ5IGFkZGluZyBvdXJzZWx2ZXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQgZ29pbmcgdG8KKyAqIHNsZWVwLiAgV2hlbiB0aGUgdGFzayBiZWZvcmUgdXMgd2FrZXMgdXMgdXAsIHdlIHRha2Ugb3Vyc2VsdmVzIG9mZiB0aGUKKyAqIGxpc3QgYW5kIHJldHVybi4KKyAqLworaW50IHNjc2lfY29tcGxldGVfYXN5bmNfc2NhbnModm9pZCkKK3sKKwlzdHJ1Y3QgYXN5bmNfc2Nhbl9kYXRhICpkYXRhOworCisJZG8geworCQlpZiAobGlzdF9lbXB0eSgmc2Nhbm5pbmdfaG9zdHMpKQorCQkJcmV0dXJuIDA7CisJCS8qIElmIHdlIGNhbid0IGdldCBtZW1vcnkgaW1tZWRpYXRlbHksIHRoYXQncyBPSy4gIEp1c3QKKwkJICogc2xlZXAgYSBsaXR0bGUuICBFdmVuIGlmIHdlIG5ldmVyIGdldCBtZW1vcnksIHRoZSBhc3luYworCQkgKiBzY2FucyB3aWxsIGZpbmlzaCBldmVudHVhbGx5LgorCQkgKi8KKwkJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGF0YSkKKwkJCW1zbGVlcCgxKTsKKwl9IHdoaWxlICghZGF0YSk7CisKKwlkYXRhLT5zaG9zdCA9IE5VTEw7CisJaW5pdF9jb21wbGV0aW9uKCZkYXRhLT5wcmV2X2ZpbmlzaGVkKTsKKworCXNwaW5fbG9jaygmYXN5bmNfc2Nhbl9sb2NrKTsKKwkvKiBDaGVjayB0aGF0IHRoZXJlJ3Mgc3RpbGwgc29tZWJvZHkgZWxzZSBvbiB0aGUgbGlzdCAqLworCWlmIChsaXN0X2VtcHR5KCZzY2FubmluZ19ob3N0cykpCisJCWdvdG8gZG9uZTsKKwlsaXN0X2FkZF90YWlsKCZkYXRhLT5saXN0LCAmc2Nhbm5pbmdfaG9zdHMpOworCXNwaW5fdW5sb2NrKCZhc3luY19zY2FuX2xvY2spOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2NzaTogd2FpdGluZyBmb3IgYnVzIHByb2JlcyB0byBjb21wbGV0ZSAuLi5cbiIpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRhdGEtPnByZXZfZmluaXNoZWQpOworCisJc3Bpbl9sb2NrKCZhc3luY19zY2FuX2xvY2spOworCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKKyBkb25lOgorCXNwaW5fdW5sb2NrKCZhc3luY19zY2FuX2xvY2spOworCisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKy8qIE9ubHkgZXhwb3J0ZWQgZm9yIHRoZSBiZW5lZml0IG9mIHNjc2lfd2FpdF9zY2FuICovCitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX2NvbXBsZXRlX2FzeW5jX3NjYW5zKTsKKyNlbmRpZgorCiAvKioKICAqIHNjc2lfdW5sb2NrX2Zsb3B0aWNhbCAtIHVubG9jayBkZXZpY2UgdmlhIGEgc3BlY2lhbCBNT0RFIFNFTlNFIGNvbW1hbmQKICAqIEBzZGV2OglzY3NpIGRldmljZSB0byBzZW5kIGNvbW1hbmQgdG8KQEAgLTM2Miw5ICs0MzcsMTAgQEAKIAlnb3RvIHJldHJ5OwogfQogCi1zdGF0aWMgdm9pZCBzY3NpX3RhcmdldF9yZWFwX3VzZXJjb250ZXh0KHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzY3NpX3RhcmdldF9yZWFwX3VzZXJjb250ZXh0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBkYXRhOworCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2NzaV90YXJnZXQsIGV3LndvcmspOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTQwMCw3ICs0NzYsNyBAQAogCQlzdGFyZ2V0LT5zdGF0ZSA9IFNUQVJHRVRfREVMOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJZXhlY3V0ZV9pbl9wcm9jZXNzX2NvbnRleHQoc2NzaV90YXJnZXRfcmVhcF91c2VyY29udGV4dCwKLQkJCQkJICAgc3RhcmdldCwgJnN0YXJnZXQtPmV3KTsKKwkJCQkJICAgJnN0YXJnZXQtPmV3KTsKIAkJcmV0dXJuOwogCiAJfQpAQCAtNjE5LDcgKzY5NSw3IEBACiAgKiAgICAgU0NTSV9TQ0FOX0xVTl9QUkVTRU5UOiBhIG5ldyBzY3NpX2RldmljZSB3YXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAogICoqLwogc3RhdGljIGludCBzY3NpX2FkZF9sdW4oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCB1bnNpZ25lZCBjaGFyICppbnFfcmVzdWx0LAotCQlpbnQgKmJmbGFncykKKwkJaW50ICpiZmxhZ3MsIGludCBhc3luYykKIHsKIAkvKgogCSAqIFhYWCBkbyBub3Qgc2F2ZSB0aGUgaW5xdWlyeSwgc2luY2UgaXQgY2FuIGNoYW5nZSB1bmRlcm5lYXRoIHVzLApAQCAtNjMxLDEyICs3MDcsMjIgQEAKIAkgKiBzY2FubmluZyBydW4gYXQgdGhlaXIgb3duIHJpc2ssIG9yIHN1cHBseSBhIHVzZXIgbGV2ZWwgcHJvZ3JhbQogCSAqIHRoYXQgY2FuIGNvcnJlY3RseSBzY2FuLgogCSAqLwotCXNkZXYtPmlucXVpcnkgPSBrbWFsbG9jKHNkZXYtPmlucXVpcnlfbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2Rldi0+aW5xdWlyeSA9PSBOVUxMKSB7Ci0JCXJldHVybiBTQ1NJX1NDQU5fTk9fUkVTUE9OU0U7Ci0JfQogCi0JbWVtY3B5KHNkZXYtPmlucXVpcnksIGlucV9yZXN1bHQsIHNkZXYtPmlucXVpcnlfbGVuKTsKKwkvKgorCSAqIENvcHkgYXQgbGVhc3QgMzYgYnl0ZXMgb2YgSU5RVUlSWSBkYXRhLCBzbyB0aGF0IHdlIGRvbid0CisJICogZGVyZWZlcmVuY2UgdW5hbGxvY2F0ZWQgbWVtb3J5IHdoZW4gYWNjZXNzaW5nIHRoZSBWZW5kb3IsCisJICogUHJvZHVjdCwgYW5kIFJldmlzaW9uIHN0cmluZ3MuICBCYWRseSBiZWhhdmVkIGRldmljZXMgbWF5IHNldAorCSAqIHRoZSBJTlFVSVJZIEFkZGl0aW9uYWwgTGVuZ3RoIGJ5dGUgdG8gYSBzbWFsbCB2YWx1ZSwgaW5kaWNhdGluZworCSAqIHRoZXNlIHN0cmluZ3MgYXJlIGludmFsaWQsIGJ1dCBvZnRlbiB0aGV5IGNvbnRhaW4gcGxhdXNpYmxlIGRhdGEKKwkgKiBub25ldGhlbGVzcy4gIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBkZXZpY2Ugc2VudCA8IDM2IGJ5dGVzCisJICogdG90YWwsIHNpbmNlIHNjc2lfcHJvYmVfbHVuKCkgaW5pdGlhbGl6ZXMgaW5xX3Jlc3VsdCB3aXRoIDBzLgorCSAqLworCXNkZXYtPmlucXVpcnkgPSBrbWVtZHVwKGlucV9yZXN1bHQsCisJCQkJbWF4X3Qoc2l6ZV90LCBzZGV2LT5pbnF1aXJ5X2xlbiwgMzYpLAorCQkJCUdGUF9BVE9NSUMpOworCWlmIChzZGV2LT5pbnF1aXJ5ID09IE5VTEwpCisJCXJldHVybiBTQ1NJX1NDQU5fTk9fUkVTUE9OU0U7CisKIAlzZGV2LT52ZW5kb3IgPSAoY2hhciAqKSAoc2Rldi0+aW5xdWlyeSArIDgpOwogCXNkZXYtPm1vZGVsID0gKGNoYXIgKikgKHNkZXYtPmlucXVpcnkgKyAxNik7CiAJc2Rldi0+cmV2ID0gKGNoYXIgKikgKHNkZXYtPmlucXVpcnkgKyAzMik7CkBAIC03OTUsNyArODgxLDcgQEAKIAkgKiByZWdpc3RlciBpdCBhbmQgdGVsbCB0aGUgcmVzdCBvZiB0aGUga2VybmVsCiAJICogYWJvdXQgaXQuCiAJICovCi0JaWYgKHNjc2lfc3lzZnNfYWRkX3NkZXYoc2RldikgIT0gMCkKKwlpZiAoIWFzeW5jICYmIHNjc2lfc3lzZnNfYWRkX3NkZXYoc2RldikgIT0gMCkKIAkJcmV0dXJuIFNDU0lfU0NBTl9OT19SRVNQT05TRTsKIAogCXJldHVybiBTQ1NJX1NDQU5fTFVOX1BSRVNFTlQ7CkBAIC05NjQsNyArMTA1MCw3IEBACiAJCWdvdG8gb3V0X2ZyZWVfcmVzdWx0OwogCX0KIAotCXJlcyA9IHNjc2lfYWRkX2x1bihzZGV2LCByZXN1bHQsICZiZmxhZ3MpOworCXJlcyA9IHNjc2lfYWRkX2x1bihzZGV2LCByZXN1bHQsICZiZmxhZ3MsIHNob3N0LT5hc3luY19zY2FuKTsKIAlpZiAocmVzID09IFNDU0lfU0NBTl9MVU5fUFJFU0VOVCkgewogCQlpZiAoYmZsYWdzICYgQkxJU1RfS0VZKSB7CiAJCQlzZGV2LT5sb2NrYWJsZSA9IDA7CkBAIC0xNDY0LDYgKzE1NTAsMTIgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdChwYXJlbnQpOwogCisJaWYgKHN0cm5jbXAoc2NzaV9zY2FuX3R5cGUsICJub25lIiwgNCkgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKCFzaG9zdC0+YXN5bmNfc2NhbikKKwkJc2NzaV9jb21wbGV0ZV9hc3luY19zY2FucygpOworCiAJbXV0ZXhfbG9jaygmc2hvc3QtPnNjYW5fbXV0ZXgpOwogCWlmIChzY3NpX2hvc3Rfc2Nhbl9hbGxvd2VkKHNob3N0KSkKIAkJX19zY3NpX3NjYW5fdGFyZ2V0KHBhcmVudCwgY2hhbm5lbCwgaWQsIGx1biwgcmVzY2FuKTsKQEAgLTE1MDksNiArMTYwMSw5IEBACiAJCSIlczogPCV1OiV1OiV1PlxuIiwKIAkJX19GVU5DVElPTl9fLCBjaGFubmVsLCBpZCwgbHVuKSk7CiAKKwlpZiAoIXNob3N0LT5hc3luY19zY2FuKQorCQlzY3NpX2NvbXBsZXRlX2FzeW5jX3NjYW5zKCk7CisKIAlpZiAoKChjaGFubmVsICE9IFNDQU5fV0lMRF9DQVJEKSAmJiAoY2hhbm5lbCA+IHNob3N0LT5tYXhfY2hhbm5lbCkpIHx8CiAJICAgICgoaWQgIT0gU0NBTl9XSUxEX0NBUkQpICYmIChpZCA+PSBzaG9zdC0+bWF4X2lkKSkgfHwKIAkgICAgKChsdW4gIT0gU0NBTl9XSUxEX0NBUkQpICYmIChsdW4gPiBzaG9zdC0+bWF4X2x1bikpKQpAQCAtMTUyOSwxNCArMTYyNCwxNDMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc2NzaV9zeXNmc19hZGRfZGV2aWNlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSB7CisJCWlmIChzY3NpX3N5c2ZzX2FkZF9zZGV2KHNkZXYpICE9IDApCisJCQlzY3NpX2Rlc3Ryb3lfc2RldihzZGV2KTsKKwl9Cit9CisKKy8qKgorICogc2NzaV9wcmVwX2FzeW5jX3NjYW4gLSBwcmVwYXJlIGZvciBhbiBhc3luYyBzY2FuCisgKiBAc2hvc3Q6IHRoZSBob3N0IHdoaWNoIHdpbGwgYmUgc2Nhbm5lZAorICogUmV0dXJuczogYSBjb29raWUgdG8gYmUgcGFzc2VkIHRvIHNjc2lfZmluaXNoX2FzeW5jX3NjYW4oKQorICoKKyAqIFRlbGxzIHRoZSBtaWRsYXllciB0aGlzIGhvc3QgaXMgZ29pbmcgdG8gZG8gYW4gYXN5bmNocm9ub3VzIHNjYW4uCisgKiBJdCByZXNlcnZlcyB0aGUgaG9zdCdzIHBvc2l0aW9uIGluIHRoZSBzY2FubmluZyBsaXN0IGFuZCBlbnN1cmVzCisgKiB0aGF0IG90aGVyIGFzeW5jaHJvbm91cyBzY2FucyBzdGFydGVkIGFmdGVyIHRoaXMgb25lIHdvbid0IGFmZmVjdCB0aGUKKyAqIG9yZGVyaW5nIG9mIHRoZSBkaXNjb3ZlcmVkIGRldmljZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXN5bmNfc2Nhbl9kYXRhICpzY3NpX3ByZXBfYXN5bmNfc2NhbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlzdHJ1Y3QgYXN5bmNfc2Nhbl9kYXRhICpkYXRhOworCisJaWYgKHN0cm5jbXAoc2NzaV9zY2FuX3R5cGUsICJzeW5jIiwgNCkgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoc2hvc3QtPmFzeW5jX3NjYW4pIHsKKwkJcHJpbnRrKCIlcyBjYWxsZWQgdHdpY2UgZm9yIGhvc3QgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQkJc2hvc3QtPmhvc3Rfbm8pOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJZ290byBlcnI7CisJZGF0YS0+c2hvc3QgPSBzY3NpX2hvc3RfZ2V0KHNob3N0KTsKKwlpZiAoIWRhdGEtPnNob3N0KQorCQlnb3RvIGVycjsKKwlpbml0X2NvbXBsZXRpb24oJmRhdGEtPnByZXZfZmluaXNoZWQpOworCisJc3Bpbl9sb2NrKCZhc3luY19zY2FuX2xvY2spOworCXNob3N0LT5hc3luY19zY2FuID0gMTsKKwlpZiAobGlzdF9lbXB0eSgmc2Nhbm5pbmdfaG9zdHMpKQorCQljb21wbGV0ZSgmZGF0YS0+cHJldl9maW5pc2hlZCk7CisJbGlzdF9hZGRfdGFpbCgmZGF0YS0+bGlzdCwgJnNjYW5uaW5nX2hvc3RzKTsKKwlzcGluX3VubG9jaygmYXN5bmNfc2Nhbl9sb2NrKTsKKworCXJldHVybiBkYXRhOworCisgZXJyOgorCWtmcmVlKGRhdGEpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHNjc2lfZmluaXNoX2FzeW5jX3NjYW4gLSBhc3luY2hyb25vdXMgc2NhbiBoYXMgZmluaXNoZWQKKyAqIEBkYXRhOiBjb29raWUgcmV0dXJuZWQgZnJvbSBlYXJsaWVyIGNhbGwgdG8gc2NzaV9wcmVwX2FzeW5jX3NjYW4oKQorICoKKyAqIEFsbCB0aGUgZGV2aWNlcyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhpcyBob3N0IGhhdmUgYmVlbiBmb3VuZC4KKyAqIFRoaXMgZnVuY3Rpb24gYW5ub3VuY2VzIGFsbCB0aGUgZGV2aWNlcyBpdCBoYXMgZm91bmQgdG8gdGhlIHJlc3QKKyAqIG9mIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfZmluaXNoX2FzeW5jX3NjYW4oc3RydWN0IGFzeW5jX3NjYW5fZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJc2hvc3QgPSBkYXRhLT5zaG9zdDsKKwlpZiAoIXNob3N0LT5hc3luY19zY2FuKSB7CisJCXByaW50aygiJXMgY2FsbGVkIHR3aWNlIGZvciBob3N0ICVkIiwgX19GVU5DVElPTl9fLAorCQkJCXNob3N0LT5ob3N0X25vKTsKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm47CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbigmZGF0YS0+cHJldl9maW5pc2hlZCk7CisKKwlzY3NpX3N5c2ZzX2FkZF9kZXZpY2VzKHNob3N0KTsKKworCXNwaW5fbG9jaygmYXN5bmNfc2Nhbl9sb2NrKTsKKwlzaG9zdC0+YXN5bmNfc2NhbiA9IDA7CisJbGlzdF9kZWwoJmRhdGEtPmxpc3QpOworCWlmICghbGlzdF9lbXB0eSgmc2Nhbm5pbmdfaG9zdHMpKSB7CisJCXN0cnVjdCBhc3luY19zY2FuX2RhdGEgKm5leHQgPSBsaXN0X2VudHJ5KHNjYW5uaW5nX2hvc3RzLm5leHQsCisJCQkJc3RydWN0IGFzeW5jX3NjYW5fZGF0YSwgbGlzdCk7CisJCWNvbXBsZXRlKCZuZXh0LT5wcmV2X2ZpbmlzaGVkKTsKKwl9CisJc3Bpbl91bmxvY2soJmFzeW5jX3NjYW5fbG9jayk7CisKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlrZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgZG9fc2NzaV9zY2FuX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJaWYgKHNob3N0LT5ob3N0dC0+c2Nhbl9maW5pc2hlZCkgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKKwkJaWYgKHNob3N0LT5ob3N0dC0+c2Nhbl9zdGFydCkKKwkJCXNob3N0LT5ob3N0dC0+c2Nhbl9zdGFydChzaG9zdCk7CisKKwkJd2hpbGUgKCFzaG9zdC0+aG9zdHQtPnNjYW5fZmluaXNoZWQoc2hvc3QsIGppZmZpZXMgLSBzdGFydCkpCisJCQltc2xlZXAoMTApOworCX0gZWxzZSB7CisJCXNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHNob3N0LCBTQ0FOX1dJTERfQ0FSRCwgU0NBTl9XSUxEX0NBUkQsCisJCQkJU0NBTl9XSUxEX0NBUkQsIDApOworCX0KK30KKworc3RhdGljIGludCBkb19zY2FuX2FzeW5jKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBhc3luY19zY2FuX2RhdGEgKmRhdGEgPSBfZGF0YTsKKwlkb19zY3NpX3NjYW5faG9zdChkYXRhLT5zaG9zdCk7CisJc2NzaV9maW5pc2hfYXN5bmNfc2NhbihkYXRhKTsKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBzY3NpX3NjYW5faG9zdCAtIHNjYW4gdGhlIGdpdmVuIGFkYXB0ZXIKICAqIEBzaG9zdDoJYWRhcHRlciB0byBzY2FuCiAgKiovCiB2b2lkIHNjc2lfc2Nhbl9ob3N0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewotCXNjc2lfc2Nhbl9ob3N0X3NlbGVjdGVkKHNob3N0LCBTQ0FOX1dJTERfQ0FSRCwgU0NBTl9XSUxEX0NBUkQsCi0JCQkJU0NBTl9XSUxEX0NBUkQsIDApOworCXN0cnVjdCBhc3luY19zY2FuX2RhdGEgKmRhdGE7CisKKwlpZiAoc3RybmNtcChzY3NpX3NjYW5fdHlwZSwgIm5vbmUiLCA0KSA9PSAwKQorCQlyZXR1cm47CisKKwlkYXRhID0gc2NzaV9wcmVwX2FzeW5jX3NjYW4oc2hvc3QpOworCWlmICghZGF0YSkgeworCQlkb19zY3NpX3NjYW5faG9zdChzaG9zdCk7CisJCXJldHVybjsKKwl9CisKKwlrdGhyZWFkX3J1bihkb19zY2FuX2FzeW5jLCBkYXRhLCAic2NzaV9zY2FuXyVkIiwgc2hvc3QtPmhvc3Rfbm8pOwogfQogRVhQT1JUX1NZTUJPTChzY3NpX3NjYW5faG9zdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IGU3ZmU1NjUuLjI1OWM5MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMTkyLDYgKzE5Miw3IEBACiBzaG9zdF9yZF9hdHRyKHVuaXF1ZV9pZCwgIiV1XG4iKTsKIHNob3N0X3JkX2F0dHIoaG9zdF9idXN5LCAiJWh1XG4iKTsKIHNob3N0X3JkX2F0dHIoY21kX3Blcl9sdW4sICIlaGRcbiIpOworc2hvc3RfcmRfYXR0cihjYW5fcXVldWUsICIlaGRcbiIpOwogc2hvc3RfcmRfYXR0cihzZ190YWJsZXNpemUsICIlaHVcbiIpOwogc2hvc3RfcmRfYXR0cih1bmNoZWNrZWRfaXNhX2RtYSwgIiVkXG4iKTsKIHNob3N0X3JkX2F0dHIyKHByb2NfbmFtZSwgaG9zdHQtPnByb2NfbmFtZSwgIiVzXG4iKTsKQEAgLTIwMCw2ICsyMDEsNyBAQAogCSZjbGFzc19kZXZpY2VfYXR0cl91bmlxdWVfaWQsCiAJJmNsYXNzX2RldmljZV9hdHRyX2hvc3RfYnVzeSwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfY21kX3Blcl9sdW4sCisJJmNsYXNzX2RldmljZV9hdHRyX2Nhbl9xdWV1ZSwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfc2dfdGFibGVzaXplLAogCSZjbGFzc19kZXZpY2VfYXR0cl91bmNoZWNrZWRfaXNhX2RtYSwKIAkmY2xhc3NfZGV2aWNlX2F0dHJfcHJvY19uYW1lLApAQCAtMjE2LDE2ICsyMTgsMTYgQEAKIAlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHNjc2lfZGV2aWNlX2Rldl9yZWxlYXNlX3VzZXJjb250ZXh0KHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzY3NpX2RldmljZV9kZXZfcmVsZWFzZV91c2VyY29udGV4dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CiAJc3RydWN0IGRldmljZSAqcGFyZW50OwogCXN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcGFyZW50ID0gZGV2LT5wYXJlbnQ7Ci0Jc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJc2RldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UsIGV3LndvcmspOworCisJcGFyZW50ID0gc2Rldi0+c2Rldl9nZW5kZXYucGFyZW50OwogCXN0YXJnZXQgPSB0b19zY3NpX3RhcmdldChwYXJlbnQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2Rldi0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CkBAIC0yNTYsNyArMjU4LDcgQEAKIHN0YXRpYyB2b2lkIHNjc2lfZGV2aWNlX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkcCA9IHRvX3Njc2lfZGV2aWNlKGRldik7Ci0JZXhlY3V0ZV9pbl9wcm9jZXNzX2NvbnRleHQoc2NzaV9kZXZpY2VfZGV2X3JlbGVhc2VfdXNlcmNvbnRleHQsIGRldiwKKwlleGVjdXRlX2luX3Byb2Nlc3NfY29udGV4dChzY3NpX2RldmljZV9kZXZfcmVsZWFzZV91c2VyY29udGV4dCwKIAkJCQkgICAmc2RwLT5ldyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9pZi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiYmZiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9pZi5jCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogU0NTSSB0YXJnZXQga2VybmVsL3VzZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBGVUpJVEEgVG9tb25vcmkgPHRvbW9mQGFjbS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWlrZSBDaHJpc3RpZSA8bWljaGFlbGNAY3Mud2lzYy5lZHU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGd0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RndF9pZi5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgInNjc2lfdGd0X3ByaXYuaCIKKworc3RydWN0IHRndF9yaW5nIHsKKwl1MzIgdHJfaWR4OworCXVuc2lnbmVkIGxvbmcgdHJfcGFnZXNbVEdUX1JJTkdfUEFHRVNdOworCXNwaW5sb2NrX3QgdHJfbG9jazsKK307CisKKy8qIHR4X3JpbmcgOiBrZXJuZWwtPnVzZXIsIHJ4X3JpbmcgOiB1c2VyLT5rZXJuZWwgKi8KK3N0YXRpYyBzdHJ1Y3QgdGd0X3JpbmcgdHhfcmluZywgcnhfcmluZzsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh0Z3RfcG9sbF93YWl0KTsKKworc3RhdGljIGlubGluZSB2b2lkIHRndF9yaW5nX2lkeF9pbmMoc3RydWN0IHRndF9yaW5nICpyaW5nKQoreworCWlmIChyaW5nLT50cl9pZHggPT0gVEdUX01BWF9FVkVOVFMgLSAxKQorCQlyaW5nLT50cl9pZHggPSAwOworCWVsc2UKKwkJcmluZy0+dHJfaWR4Kys7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGd0X2V2ZW50ICp0Z3RfaGVhZF9ldmVudChzdHJ1Y3QgdGd0X3JpbmcgKnJpbmcsIHUzMiBpZHgpCit7CisJdTMyIHBpZHgsIG9mZjsKKworCXBpZHggPSBpZHggLyBUR1RfRVZFTlRfUEVSX1BBR0U7CisJb2ZmID0gaWR4ICUgVEdUX0VWRU5UX1BFUl9QQUdFOworCisJcmV0dXJuIChzdHJ1Y3QgdGd0X2V2ZW50ICopCisJCShyaW5nLT50cl9wYWdlc1twaWR4XSArIHNpemVvZihzdHJ1Y3QgdGd0X2V2ZW50KSAqIG9mZik7Cit9CisKK3N0YXRpYyBpbnQgdGd0X3VzcGFjZV9zZW5kX2V2ZW50KHUzMiB0eXBlLCBzdHJ1Y3QgdGd0X2V2ZW50ICpwKQoreworCXN0cnVjdCB0Z3RfZXZlbnQgKmV2OworCXN0cnVjdCB0Z3RfcmluZyAqcmluZyA9ICZ0eF9yaW5nOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmluZy0+dHJfbG9jaywgZmxhZ3MpOworCisJZXYgPSB0Z3RfaGVhZF9ldmVudChyaW5nLCByaW5nLT50cl9pZHgpOworCWlmICghZXYtPmhkci5zdGF0dXMpCisJCXRndF9yaW5nX2lkeF9pbmMocmluZyk7CisJZWxzZQorCQllcnIgPSAtQlVTWTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpbmctPnRyX2xvY2ssIGZsYWdzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltZW1jcHkoZXYsIHAsIHNpemVvZigqZXYpKTsKKwlldi0+aGRyLnR5cGUgPSB0eXBlOworCW1iKCk7CisJZXYtPmhkci5zdGF0dXMgPSAxOworCisJZmx1c2hfZGNhY2hlX3BhZ2UodmlydF90b19wYWdlKGV2KSk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRndF9wb2xsX3dhaXQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzY3NpX3RndF91c3BhY2Vfc2VuZF9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3Qgc2NzaV9sdW4gKmx1biwgdTY0IHRhZykKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNjc2lfdGd0X2NtZF90b19ob3N0KGNtZCk7CisJc3RydWN0IHRndF9ldmVudCBldjsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CisJZXYucC5jbWRfcmVxLmhvc3Rfbm8gPSBzaG9zdC0+aG9zdF9ubzsKKwlldi5wLmNtZF9yZXEuZGF0YV9sZW4gPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwltZW1jcHkoZXYucC5jbWRfcmVxLnNjYiwgY21kLT5jbW5kLCBzaXplb2YoZXYucC5jbWRfcmVxLnNjYikpOworCW1lbWNweShldi5wLmNtZF9yZXEubHVuLCBsdW4sIHNpemVvZihldi5wLmNtZF9yZXEubHVuKSk7CisJZXYucC5jbWRfcmVxLmF0dHJpYnV0ZSA9IGNtZC0+dGFnOworCWV2LnAuY21kX3JlcS50YWcgPSB0YWc7CisKKwlkcHJpbnRrKCIlcCAlZCAldSAleCAlbGx4XG4iLCBjbWQsIHNob3N0LT5ob3N0X25vLAorCQlldi5wLmNtZF9yZXEuZGF0YV9sZW4sIGNtZC0+dGFnLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBldi5wLmNtZF9yZXEudGFnKTsKKworCWVyciA9IHRndF91c3BhY2Vfc2VuZF9ldmVudChUR1RfS0VWRU5UX0NNRF9SRVEsICZldik7CisJaWYgKGVycikKKwkJZXByaW50aygidHggYnVmIGlzIGZ1bGwsIGNvdWxkIG5vdCBzZW5kXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBzY3NpX3RndF91c3BhY2Vfc2VuZF9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqY21kLCB1NjQgdGFnKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2NzaV90Z3RfY21kX3RvX2hvc3QoY21kKTsKKwlzdHJ1Y3QgdGd0X2V2ZW50IGV2OworCWludCBlcnI7CisKKwltZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKKwlldi5wLmNtZF9kb25lLmhvc3Rfbm8gPSBzaG9zdC0+aG9zdF9ubzsKKwlldi5wLmNtZF9kb25lLnRhZyA9IHRhZzsKKwlldi5wLmNtZF9kb25lLnJlc3VsdCA9IGNtZC0+cmVzdWx0OworCisJZHByaW50aygiJXAgJWQgJWxsdSAldSAleFxuIiwgY21kLCBzaG9zdC0+aG9zdF9ubywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgZXYucC5jbWRfcmVxLnRhZywKKwkJZXYucC5jbWRfcmVxLmRhdGFfbGVuLCBjbWQtPnRhZyk7CisKKwllcnIgPSB0Z3RfdXNwYWNlX3NlbmRfZXZlbnQoVEdUX0tFVkVOVF9DTURfRE9ORSwgJmV2KTsKKwlpZiAoZXJyKQorCQllcHJpbnRrKCJ0eCBidWYgaXMgZnVsbCwgY291bGQgbm90IHNlbmRcbiIpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IHNjc2lfdGd0X3VzcGFjZV9zZW5kX3Rza19tZ210KGludCBob3N0X25vLCBpbnQgZnVuY3Rpb24sIHU2NCB0YWcsCisJCQkJICBzdHJ1Y3Qgc2NzaV9sdW4gKnNjc2lsdW4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRndF9ldmVudCBldjsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CisJZXYucC50c2tfbWdtdF9yZXEuaG9zdF9ubyA9IGhvc3Rfbm87CisJZXYucC50c2tfbWdtdF9yZXEuZnVuY3Rpb24gPSBmdW5jdGlvbjsKKwlldi5wLnRza19tZ210X3JlcS50YWcgPSB0YWc7CisJbWVtY3B5KGV2LnAudHNrX21nbXRfcmVxLmx1biwgc2NzaWx1biwgc2l6ZW9mKGV2LnAudHNrX21nbXRfcmVxLmx1bikpOworCWV2LnAudHNrX21nbXRfcmVxLm1pZCA9ICh1NjQpICh1bnNpZ25lZCBsb25nKSBkYXRhOworCisJZHByaW50aygiJWQgJXggJWxseCAlbGx4XG4iLCBob3N0X25vLCBmdW5jdGlvbiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgdGFnLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBldi5wLnRza19tZ210X3JlcS5taWQpOworCisJZXJyID0gdGd0X3VzcGFjZV9zZW5kX2V2ZW50KFRHVF9LRVZFTlRfVFNLX01HTVRfUkVRLCAmZXYpOworCWlmIChlcnIpCisJCWVwcmludGsoInR4IGJ1ZiBpcyBmdWxsLCBjb3VsZCBub3Qgc2VuZFxuIik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGV2ZW50X3JlY3ZfbXNnKHN0cnVjdCB0Z3RfZXZlbnQgKmV2KQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChldi0+aGRyLnR5cGUpIHsKKwljYXNlIFRHVF9VRVZFTlRfQ01EX1JTUDoKKwkJZXJyID0gc2NzaV90Z3Rfa3NwYWNlX2V4ZWMoZXYtPnAuY21kX3JzcC5ob3N0X25vLAorCQkJCQkgICBldi0+cC5jbWRfcnNwLnRhZywKKwkJCQkJICAgZXYtPnAuY21kX3JzcC5yZXN1bHQsCisJCQkJCSAgIGV2LT5wLmNtZF9yc3AubGVuLAorCQkJCQkgICBldi0+cC5jbWRfcnNwLnVhZGRyLAorCQkJCQkgICBldi0+cC5jbWRfcnNwLnJ3KTsKKwkJYnJlYWs7CisJY2FzZSBUR1RfVUVWRU5UX1RTS19NR01UX1JTUDoKKwkJZXJyID0gc2NzaV90Z3Rfa3NwYWNlX3Rza19tZ210KGV2LT5wLnRza19tZ210X3JzcC5ob3N0X25vLAorCQkJCQkgICAgICAgZXYtPnAudHNrX21nbXRfcnNwLm1pZCwKKwkJCQkJICAgICAgIGV2LT5wLnRza19tZ210X3JzcC5yZXN1bHQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcHJpbnRrKCJ1bmtub3duIHR5cGUgJWRcbiIsIGV2LT5oZHIudHlwZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QgdGd0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IHRndF9ldmVudCAqZXY7CisJc3RydWN0IHRndF9yaW5nICpyaW5nID0gJnJ4X3Jpbmc7CisKKwl3aGlsZSAoMSkgeworCQlldiA9IHRndF9oZWFkX2V2ZW50KHJpbmcsIHJpbmctPnRyX2lkeCk7CisJCS8qIGRvIHdlIG5lZWQgdGhpcz8gKi8KKwkJZmx1c2hfZGNhY2hlX3BhZ2UodmlydF90b19wYWdlKGV2KSk7CisKKwkJaWYgKCFldi0+aGRyLnN0YXR1cykKKwkJCWJyZWFrOworCisJCXRndF9yaW5nX2lkeF9pbmMocmluZyk7CisJCWV2ZW50X3JlY3ZfbXNnKGV2KTsKKwkJZXYtPmhkci5zdGF0dXMgPSAwOworCX07CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGd0X3BvbGwoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHRndF9ldmVudCAqZXY7CisJc3RydWN0IHRndF9yaW5nICpyaW5nID0gJnR4X3Jpbmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdTMyIGlkeDsKKworCXBvbGxfd2FpdChmaWxlLCAmdGd0X3BvbGxfd2FpdCwgd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmluZy0+dHJfbG9jaywgZmxhZ3MpOworCisJaWR4ID0gcmluZy0+dHJfaWR4ID8gcmluZy0+dHJfaWR4IC0gMSA6IFRHVF9NQVhfRVZFTlRTIC0gMTsKKwlldiA9IHRndF9oZWFkX2V2ZW50KHJpbmcsIGlkeCk7CisJaWYgKGV2LT5oZHIuc3RhdHVzKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaW5nLT50cl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCB1c3BhY2VfcmluZ19tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgIHN0cnVjdCB0Z3RfcmluZyAqcmluZykKK3sKKwlpbnQgaSwgZXJyOworCisJZm9yIChpID0gMDsgaSA8IFRHVF9SSU5HX1BBR0VTOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocmluZy0+dHJfcGFnZXNbaV0pOworCQllcnIgPSB2bV9pbnNlcnRfcGFnZSh2bWEsIGFkZHIsIHBhZ2UpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYWRkciArPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGd0X21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgZXJyOworCisJaWYgKHZtYS0+dm1fcGdvZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCAhPSBUR1RfUklOR19TSVpFICogMikgeworCQllcHJpbnRrKCJtbWFwIHNpemUgbXVzdCBiZSAlbHUsIG5vdCAlbHUgXG4iLAorCQkJVEdUX1JJTkdfU0laRSAqIDIsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkZHIgPSB2bWEtPnZtX3N0YXJ0OworCWVyciA9IHVzcGFjZV9yaW5nX21hcCh2bWEsIGFkZHIsICZ0eF9yaW5nKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHVzcGFjZV9yaW5nX21hcCh2bWEsIGFkZHIgKyBUR1RfUklOR19TSVpFLCAmcnhfcmluZyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRndF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXR4X3JpbmcudHJfaWR4ID0gcnhfcmluZy50cl9pZHggPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRndF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB0Z3Rfb3BlbiwKKwkucG9sbAkJPSB0Z3RfcG9sbCwKKwkud3JpdGUJCT0gdGd0X3dyaXRlLAorCS5tbWFwCQk9IHRndF9tbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHRndF9taXNjZGV2ID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJ0Z3QiLAorCS5mb3BzID0gJnRndF9mb3BzLAorfTsKKworc3RhdGljIHZvaWQgdGd0X3JpbmdfZXhpdChzdHJ1Y3QgdGd0X3JpbmcgKnJpbmcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVEdUX1JJTkdfUEFHRVM7IGkrKykKKwkJZnJlZV9wYWdlKHJpbmctPnRyX3BhZ2VzW2ldKTsKK30KKworc3RhdGljIGludCB0Z3RfcmluZ19pbml0KHN0cnVjdCB0Z3RfcmluZyAqcmluZykKK3sKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pbml0KCZyaW5nLT50cl9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBUR1RfUklOR19QQUdFUzsgaSsrKSB7CisJCXJpbmctPnRyX3BhZ2VzW2ldID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXJpbmctPnRyX3BhZ2VzW2ldKSB7CisJCQllcHJpbnRrKCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2NzaV90Z3RfaWZfZXhpdCh2b2lkKQoreworCXRndF9yaW5nX2V4aXQoJnR4X3JpbmcpOworCXRndF9yaW5nX2V4aXQoJnJ4X3JpbmcpOworCW1pc2NfZGVyZWdpc3RlcigmdGd0X21pc2NkZXYpOworfQorCitpbnQgc2NzaV90Z3RfaWZfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSB0Z3RfcmluZ19pbml0KCZ0eF9yaW5nKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gdGd0X3JpbmdfaW5pdCgmcnhfcmluZyk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX3R4X3Jpbmc7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZ0Z3RfbWlzY2Rldik7CisJaWYgKGVycikKKwkJZ290byBmcmVlX3J4X3Jpbmc7CisKKwlyZXR1cm4gMDsKK2ZyZWVfcnhfcmluZzoKKwl0Z3RfcmluZ19leGl0KCZyeF9yaW5nKTsKK2ZyZWVfdHhfcmluZzoKKwl0Z3RfcmluZ19leGl0KCZ0eF9yaW5nKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMmFmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9saWIuYwpAQCAtMCwwICsxLDc0NSBAQAorLyoKKyAqIFNDU0kgdGFyZ2V0IGxpYiBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWlrZSBDaHJpc3RpZSA8bWljaGFlbGNAY3Mud2lzYy5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRlVKSVRBIFRvbW9ub3JpIDx0b21vZkBhY20ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGd0Lmg+CisjaW5jbHVkZSA8Li4vZHJpdmVycy9tZC9kbS1iaW8tbGlzdC5oPgorCisjaW5jbHVkZSAic2NzaV90Z3RfcHJpdi5oIgorCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnNjc2lfdGd0ZDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc2NzaV90Z3RfY21kX2NhY2hlOworCisvKgorICogVE9ETzogdGhpcyBzdHJ1Y3Qgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgYmxvY2sgbGF5ZXIgc3VwcG9ydHMgbGFyZ2UgYmlvcworICogYW5kIEphbWVzJ3Mgd29yayBzdHJ1Y3QgY29kZSBpcyBpbgorICovCitzdHJ1Y3Qgc2NzaV90Z3RfY21kIHsKKwkvKiBUT0RPIHJlcGxhY2Ugd29yayB3aXRoIEphbWVzIGIncyBjb2RlICovCisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJLyogVE9ETyByZXBsYWNlIHRoZSBsaXN0cyB3aXRoIGEgbGFyZ2UgYmlvICovCisJc3RydWN0IGJpb19saXN0IHhmZXJfZG9uZV9saXN0OworCXN0cnVjdCBiaW9fbGlzdCB4ZmVyX2xpc3Q7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhhc2hfbGlzdDsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJdTY0IHRhZzsKKworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBidWZmbGVuOworfTsKKworI2RlZmluZSBUR1RfSEFTSF9PUkRFUgk0CisjZGVmaW5lIGNtZF9oYXNoZm4odGFnKQloYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpICh0YWcpLCBUR1RfSEFTSF9PUkRFUikKKworc3RydWN0IHNjc2lfdGd0X3F1ZXVlZGF0YSB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBjbWRfaGFzaFsxIDw8IFRHVF9IQVNIX09SREVSXTsKKwlzcGlubG9ja190IGNtZF9oYXNoX2xvY2s7Cit9OworCisvKgorICogRnVuY3Rpb246CXNjc2lfaG9zdF9nZXRfY29tbWFuZCgpCisgKgorICogUHVycG9zZToJQWxsb2NhdGUgYW5kIHNldHVwIGEgc2NzaSBjb21tYW5kIGJsb2NrIGFuZCBibGsgcmVxdWVzdAorICoKKyAqIEFyZ3VtZW50czoJc2hvc3QJLSBzY3NpIGhvc3QKKyAqCQlkYXRhX2RpciAtIGRtYSBkYXRhIGRpcgorICoJCWdmcF9tYXNrLSBhbGxvY2F0b3IgZmxhZ3MKKyAqCisgKiBSZXR1cm5zOglUaGUgYWxsb2NhdGVkIHNjc2kgY29tbWFuZCBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRhcmdldCBMTERzIHRvIGdldCBhIGNvbW1hbmQuCisgKi8KK3N0cnVjdCBzY3NpX2NtbmQgKnNjc2lfaG9zdF9nZXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGF0YV9kaXIsCisJCQkJCWdmcF90IGdmcF9tYXNrKQoreworCWludCB3cml0ZSA9IChkYXRhX2RpciA9PSBETUFfVE9fREVWSUNFKTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBzY3NpX3RndF9jbWQgKnRjbWQ7CisKKwkvKiBCYWlsIGlmIHdlIGNhbid0IGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlICovCisJaWYgKCFnZXRfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KSkKKwkJcmV0dXJuIE5VTEw7CisKKwl0Y21kID0ga21lbV9jYWNoZV9hbGxvYyhzY3NpX3RndF9jbWRfY2FjaGUsIEdGUF9BVE9NSUMpOworCWlmICghdGNtZCkKKwkJZ290byBwdXRfZGV2OworCisJcnEgPSBibGtfZ2V0X3JlcXVlc3Qoc2hvc3QtPnVzcGFjZV9yZXFfcSwgd3JpdGUsIGdmcF9tYXNrKTsKKwlpZiAoIXJxKQorCQlnb3RvIGZyZWVfdGNtZDsKKworCWNtZCA9IF9fc2NzaV9nZXRfY29tbWFuZChzaG9zdCwgZ2ZwX21hc2spOworCWlmICghY21kKQorCQlnb3RvIHJlbGVhc2VfcnE7CisKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBkYXRhX2RpcjsKKwljbWQtPmppZmZpZXNfYXRfYWxsb2MgPSBqaWZmaWVzOworCWNtZC0+cmVxdWVzdCA9IHJxOworCisJcnEtPnNwZWNpYWwgPSBjbWQ7CisJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfU1BFQ0lBTDsKKwlycS0+Y21kX2ZsYWdzIHw9IFJFUV9UWVBFX0JMT0NLX1BDOworCXJxLT5lbmRfaW9fZGF0YSA9IHRjbWQ7CisKKwliaW9fbGlzdF9pbml0KCZ0Y21kLT54ZmVyX2xpc3QpOworCWJpb19saXN0X2luaXQoJnRjbWQtPnhmZXJfZG9uZV9saXN0KTsKKwl0Y21kLT5ycSA9IHJxOworCisJcmV0dXJuIGNtZDsKKworcmVsZWFzZV9ycToKKwlibGtfcHV0X3JlcXVlc3QocnEpOworZnJlZV90Y21kOgorCWttZW1fY2FjaGVfZnJlZShzY3NpX3RndF9jbWRfY2FjaGUsIHRjbWQpOworcHV0X2RldjoKKwlwdXRfZGV2aWNlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKwlyZXR1cm4gTlVMTDsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV9ob3N0X2dldF9jb21tYW5kKTsKKworLyoKKyAqIEZ1bmN0aW9uOglzY3NpX2hvc3RfcHV0X2NvbW1hbmQoKQorICoKKyAqIFB1cnBvc2U6CUZyZWUgYSBzY3NpIGNvbW1hbmQgYmxvY2sKKyAqCisgKiBBcmd1bWVudHM6CXNob3N0CS0gc2NzaSBob3N0CisgKiAJCWNtZAktIGNvbW1hbmQgYmxvY2sgdG8gZnJlZQorICoKKyAqIFJldHVybnM6CU5vdGhpbmcuCisgKgorICogTm90ZXM6CVRoZSBjb21tYW5kIG11c3Qgbm90IGJlbG9uZyB0byBhbnkgbGlzdHMuCisgKi8KK3ZvaWQgc2NzaV9ob3N0X3B1dF9jb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBzaG9zdC0+dXNwYWNlX3JlcV9xOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGNtZC0+cmVxdWVzdDsKKwlzdHJ1Y3Qgc2NzaV90Z3RfY21kICp0Y21kID0gcnEtPmVuZF9pb19kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlrbWVtX2NhY2hlX2ZyZWUoc2NzaV90Z3RfY21kX2NhY2hlLCB0Y21kKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlfX2Jsa19wdXRfcmVxdWVzdChxLCBycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlfX3Njc2lfcHV0X2NvbW1hbmQoc2hvc3QsIGNtZCwgJnNob3N0LT5zaG9zdF9nZW5kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV9ob3N0X3B1dF9jb21tYW5kKTsKKworc3RhdGljIHZvaWQgc2NzaV91bm1hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY3NpX3RndF9jbWQgKnRjbWQpCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJLyogbXVzdCBjYWxsIGJpb19lbmRpbyBpbiBjYXNlIGJpbyB3YXMgYm91bmNlZCAqLworCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKCZ0Y21kLT54ZmVyX2RvbmVfbGlzdCkpKSB7CisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgMCk7CisJCWJpb191bm1hcF91c2VyKGJpbyk7CisJfQorCisJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJnRjbWQtPnhmZXJfbGlzdCkpKSB7CisJCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgMCk7CisJCWJpb191bm1hcF91c2VyKGJpbyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbWRfaGFzaGxpc3RfZGVsKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGNtZC0+cmVxdWVzdC0+cTsKKwlzdHJ1Y3Qgc2NzaV90Z3RfcXVldWVkYXRhICpxZGF0YSA9IHEtPnF1ZXVlZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzY3NpX3RndF9jbWQgKnRjbWQgPSBjbWQtPnJlcXVlc3QtPmVuZF9pb19kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnFkYXRhLT5jbWRfaGFzaF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnRjbWQtPmhhc2hfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRhdGEtPmNtZF9oYXNoX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2NzaV90Z3RfY21kX2Rlc3Ryb3koc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzY3NpX3RndF9jbWQgKnRjbWQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNjc2lfdGd0X2NtZCwgd29yayk7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gdGNtZC0+cnEtPnNwZWNpYWw7CisKKwlkcHJpbnRrKCJjbWQgJXAgJWQgJWx1XG4iLCBjbWQsIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24sCisJCXJxX2RhdGFfZGlyKGNtZC0+cmVxdWVzdCkpOworCS8qCisJICogV2UgZml4IHJxLT5jbWRfZmxhZ3MgaGVyZSBzaW5jZSB3aGVuIHdlIHRvbGQgYmlvX21hcF91c2VyCisJICogdG8gd3JpdGUgdm0gZm9yIFdSSVRFIGNvbW1hbmRzLCBibGtfcnFfYmlvX3ByZXAgc2V0CisJICogcnFfZGF0YV9kaXIgdGhlIGZsYWdzIHRvIFJFQUQuCisJICovCisJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKKwkJY21kLT5yZXF1ZXN0LT5jbWRfZmxhZ3MgfD0gUkVRX1JXOworCWVsc2UKKwkJY21kLT5yZXF1ZXN0LT5jbWRfZmxhZ3MgJj0gflJFUV9SVzsKKworCXNjc2lfdW5tYXBfdXNlcl9wYWdlcyh0Y21kKTsKKwlzY3NpX2hvc3RfcHV0X2NvbW1hbmQoc2NzaV90Z3RfY21kX3RvX2hvc3QoY21kKSwgY21kKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9zY3NpX3RndF9jbWQoc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3Qgc2NzaV90Z3RfY21kICp0Y21kLAorCQkJICAgICAgdTY0IHRhZykKK3sKKwlzdHJ1Y3Qgc2NzaV90Z3RfcXVldWVkYXRhICpxZGF0YSA9IHJxLT5xLT5xdWV1ZWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCisJdGNtZC0+dGFnID0gdGFnOworCUlOSVRfV09SSygmdGNtZC0+d29yaywgc2NzaV90Z3RfY21kX2Rlc3Ryb3kpOworCXNwaW5fbG9ja19pcnFzYXZlKCZxZGF0YS0+Y21kX2hhc2hfbG9jaywgZmxhZ3MpOworCWhlYWQgPSAmcWRhdGEtPmNtZF9oYXNoW2NtZF9oYXNoZm4odGFnKV07CisJbGlzdF9hZGQoJnRjbWQtPmhhc2hfbGlzdCwgaGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRhdGEtPmNtZF9oYXNoX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIHNjc2lfdGd0X2FsbG9jX3F1ZXVlIC0gc2V0dXAgcXVldWUgdXNlZCBmb3IgbWVzc2FnZSBwYXNzaW5nCisgKiBzaG9zdDogc2NzaSBob3N0CisgKgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBMTEQgYWZ0ZXIgaG9zdCBhbGxvY2F0aW9uLgorICogQW5kIHdpbGwgYmUgcmVsZWFzZWQgd2hlbiB0aGUgaG9zdCBpcyByZWxlYXNlZC4KKyAqLworaW50IHNjc2lfdGd0X2FsbG9jX3F1ZXVlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQoreworCXN0cnVjdCBzY3NpX3RndF9xdWV1ZWRhdGEgKnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKKwlpbnQgZXJyLCBpOworCisJLyoKKwkgKiBEbyB3ZSBuZWVkIHRvIHNlbmQgYSBuZXRsaW5rIGV2ZW50IG9yIHNob3VsZCB1c3BhY2UKKwkgKiBqdXN0IHJlc3BvbmQgdG8gdGhlIGhvdHBsdWcgZXZlbnQ/CisJICovCisJcSA9IF9fc2NzaV9hbGxvY19xdWV1ZShzaG9zdCwgTlVMTCk7CisJaWYgKCFxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXF1ZXVlZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpxdWV1ZWRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXF1ZXVlZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXBfcXVldWU7CisJfQorCXF1ZXVlZGF0YS0+c2hvc3QgPSBzaG9zdDsKKwlxLT5xdWV1ZWRhdGEgPSBxdWV1ZWRhdGE7CisKKwkvKgorCSAqIHRoaXMgaXMgYSBzaWxseSBoYWNrLiBXZSBzaG91bGQgcHJvYmFibHkganVzdCBxdWV1ZSBhcyBtYW55CisJICogY29tbWFuZCBhcyBpcyByZWN2ZCB0byB1c2Vyc3BhY2UuIHVzcGFjZSBjYW4gdGhlbiBtYWtlCisJICogc3VyZSB3ZSBkbyBub3Qgb3ZlcmxvYWQgdGhlIEhCQQorCSAqLworCXEtPm5yX3JlcXVlc3RzID0gc2hvc3QtPmhvc3R0LT5jYW5fcXVldWU7CisJLyoKKwkgKiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHNvZnR3YXJlIExMRHMgc28gdGhpcyBkb2VzCisJICogbm90IG1hdHRlciBmb3Igbm93LiBEbyB3ZSBuZWVkIHRoaXMgZm9yIHRoZSBjYXJkcyB3ZSBzdXBwb3J0PworCSAqIElmIHNvIHdlIHNob3VsZCBtYWtlIGl0IGEgaG9zdCB0ZW1wbGF0ZSB2YWx1ZS4KKwkgKi8KKwlibGtfcXVldWVfZG1hX2FsaWdubWVudChxLCAwKTsKKwlzaG9zdC0+dXNwYWNlX3JlcV9xID0gcTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHF1ZXVlZGF0YS0+Y21kX2hhc2gpOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZxdWV1ZWRhdGEtPmNtZF9oYXNoW2ldKTsKKwlzcGluX2xvY2tfaW5pdCgmcXVldWVkYXRhLT5jbWRfaGFzaF9sb2NrKTsKKworCXJldHVybiAwOworCitjbGVhbnVwX3F1ZXVlOgorCWJsa19jbGVhbnVwX3F1ZXVlKHEpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX3RndF9hbGxvY19xdWV1ZSk7CisKK3ZvaWQgc2NzaV90Z3RfZnJlZV9xdWV1ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gc2hvc3QtPnVzcGFjZV9yZXFfcTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQ7CisJc3RydWN0IHNjc2lfdGd0X3F1ZXVlZGF0YSAqcWRhdGEgPSBxLT5xdWV1ZWRhdGE7CisJc3RydWN0IHNjc2lfdGd0X2NtZCAqdGNtZCwgKm47CisJTElTVF9IRUFEKGNtZHMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnFkYXRhLT5jbWRfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShxZGF0YS0+Y21kX2hhc2gpOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRjbWQsIG4sICZxZGF0YS0+Y21kX2hhc2hbaV0sCisJCQkJCSBoYXNoX2xpc3QpIHsKKwkJCWxpc3RfZGVsKCZ0Y21kLT5oYXNoX2xpc3QpOworCQkJbGlzdF9hZGQoJnRjbWQtPmhhc2hfbGlzdCwgJmNtZHMpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRhdGEtPmNtZF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmY21kcykpIHsKKwkJdGNtZCA9IGxpc3RfZW50cnkoY21kcy5uZXh0LCBzdHJ1Y3Qgc2NzaV90Z3RfY21kLCBoYXNoX2xpc3QpOworCQlsaXN0X2RlbCgmdGNtZC0+aGFzaF9saXN0KTsKKwkJY21kID0gdGNtZC0+cnEtPnNwZWNpYWw7CisKKwkJc2hvc3QtPmhvc3R0LT5laF9hYm9ydF9oYW5kbGVyKGNtZCk7CisJCXNjc2lfdGd0X2NtZF9kZXN0cm95KCZ0Y21kLT53b3JrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX3RndF9mcmVlX3F1ZXVlKTsKKworc3RydWN0IFNjc2lfSG9zdCAqc2NzaV90Z3RfY21kX3RvX2hvc3Qoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBzY3NpX3RndF9xdWV1ZWRhdGEgKnF1ZXVlID0gY21kLT5yZXF1ZXN0LT5xLT5xdWV1ZWRhdGE7CisJcmV0dXJuIHF1ZXVlLT5zaG9zdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNjc2lfdGd0X2NtZF90b19ob3N0KTsKKworLyoKKyAqIHNjc2lfdGd0X3F1ZXVlX2NvbW1hbmQgLSBxdWV1ZSBjb21tYW5kIGZvciB1c2Vyc3BhY2UgcHJvY2Vzc2luZworICogQGNtZDoJc2NzaSBjb21tYW5kCisgKiBAc2NzaWx1bjoJc2NzaSBsdW4KKyAqIEB0YWc6CXVuaXF1ZSB2YWx1ZSB0byBpZGVudGlmeSB0aGlzIGNvbW1hbmQgZm9yIHRtZgorICovCitpbnQgc2NzaV90Z3RfcXVldWVfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBzY3NpX2x1biAqc2NzaWx1biwKKwkJCSAgIHU2NCB0YWcpCit7CisJc3RydWN0IHNjc2lfdGd0X2NtZCAqdGNtZCA9IGNtZC0+cmVxdWVzdC0+ZW5kX2lvX2RhdGE7CisJaW50IGVycjsKKworCWluaXRfc2NzaV90Z3RfY21kKGNtZC0+cmVxdWVzdCwgdGNtZCwgdGFnKTsKKwllcnIgPSBzY3NpX3RndF91c3BhY2Vfc2VuZF9jbWQoY21kLCBzY3NpbHVuLCB0YWcpOworCWlmIChlcnIpCisJCWNtZF9oYXNobGlzdF9kZWwoY21kKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzY3NpX3RndF9xdWV1ZV9jb21tYW5kKTsKKworLyoKKyAqIFRoaXMgaXMgcnVuIGZyb20gYSBpbnRlcnJwdCBoYW5kbGVyIG5vcm1hbGx5IGFuZCB0aGUgdW5tYXAKKyAqIG5lZWRzIHByb2Nlc3MgY29udGV4dCBzbyB3ZSBtdXN0IHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkIHNjc2lfdGd0X2NtZF9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV90Z3RfY21kICp0Y21kID0gY21kLT5yZXF1ZXN0LT5lbmRfaW9fZGF0YTsKKworCWRwcmludGsoImNtZCAlcCAlbHVcbiIsIGNtZCwgcnFfZGF0YV9kaXIoY21kLT5yZXF1ZXN0KSk7CisKKwlzY3NpX3RndF91c3BhY2Vfc2VuZF9zdGF0dXMoY21kLCB0Y21kLT50YWcpOworCXF1ZXVlX3dvcmsoc2NzaV90Z3RkLCAmdGNtZC0+d29yayk7Cit9CisKK3N0YXRpYyBpbnQgX19zY3NpX3RndF90cmFuc2Zlcl9yZXNwb25zZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzY3NpX3RndF9jbWRfdG9faG9zdChjbWQpOworCWludCBlcnI7CisKKwlkcHJpbnRrKCJjbWQgJXAgJWx1XG4iLCBjbWQsIHJxX2RhdGFfZGlyKGNtZC0+cmVxdWVzdCkpOworCisJZXJyID0gc2hvc3QtPmhvc3R0LT50cmFuc2Zlcl9yZXNwb25zZShjbWQsIHNjc2lfdGd0X2NtZF9kb25lKTsKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgU0NTSV9NTFFVRVVFX0hPU1RfQlVTWToKKwljYXNlIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWToKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjc2lfdGd0X3RyYW5zZmVyX3Jlc3BvbnNlKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV90Z3RfY21kICp0Y21kID0gY21kLT5yZXF1ZXN0LT5lbmRfaW9fZGF0YTsKKwlpbnQgZXJyOworCisJZXJyID0gX19zY3NpX3RndF90cmFuc2Zlcl9yZXNwb25zZShjbWQpOworCWlmICghZXJyKQorCQlyZXR1cm47CisKKwljbWQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwllcnIgPSBzY3NpX3RndF91c3BhY2Vfc2VuZF9zdGF0dXMoY21kLCB0Y21kLT50YWcpOworCWlmIChlcnIgPD0gMCkKKwkJLyogdGhlIGVoIHdpbGwgaGF2ZSB0byBwaWNrIHRoaXMgdXAgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3Qgc2VuZCBjbWQgJXAgc3RhdHVzXG4iLCBjbWQpOworfQorCitzdGF0aWMgaW50IHNjc2lfdGd0X2luaXRfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gY21kLT5yZXF1ZXN0OworCXN0cnVjdCBzY3NpX3RndF9jbWQgKnRjbWQgPSBycS0+ZW5kX2lvX2RhdGE7CisJaW50IGNvdW50OworCisJY21kLT51c2Vfc2cgPSBycS0+bnJfcGh5c19zZWdtZW50czsKKwljbWQtPnJlcXVlc3RfYnVmZmVyID0gc2NzaV9hbGxvY19zZ3RhYmxlKGNtZCwgZ2ZwX21hc2spOworCWlmICghY21kLT5yZXF1ZXN0X2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbWQtPnJlcXVlc3RfYnVmZmxlbiA9IHJxLT5kYXRhX2xlbjsKKworCWRwcmludGsoImNtZCAlcCBhZGRyICVwIGNudCAlZCAlbHVcbiIsIGNtZCwgdGNtZC0+YnVmZmVyLCBjbWQtPnVzZV9zZywKKwkJcnFfZGF0YV9kaXIocnEpKTsKKwljb3VudCA9IGJsa19ycV9tYXBfc2cocnEtPnEsIHJxLCBjbWQtPnJlcXVlc3RfYnVmZmVyKTsKKwlpZiAobGlrZWx5KGNvdW50IDw9IGNtZC0+dXNlX3NnKSkgeworCQljbWQtPnVzZV9zZyA9IGNvdW50OworCQlyZXR1cm4gMDsKKwl9CisKKwllcHJpbnRrKCJjbWQgJXAgYWRkciAlcCBjbnQgJWRcbiIsIGNtZCwgdGNtZC0+YnVmZmVyLCBjbWQtPnVzZV9zZyk7CisJc2NzaV9mcmVlX3NndGFibGUoY21kLT5yZXF1ZXN0X2J1ZmZlciwgY21kLT5zZ2xpc3RfbGVuKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogVE9ETzogdGVzdCB0aGlzIGNyYXAgYW5kIHJlcGxhY2UgYmlvX21hcF91c2VyIHdpdGggbmV3IGludGVyZmFjZSBtYXliZSAqLworc3RhdGljIGludCBzY3NpX21hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY3NpX3RndF9jbWQgKnRjbWQsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCSAgICAgICBpbnQgcncpCit7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBjbWQtPnJlcXVlc3QtPnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gY21kLT5yZXF1ZXN0OworCXZvaWQgKnVhZGRyID0gdGNtZC0+YnVmZmVyOworCXVuc2lnbmVkIGludCBsZW4gPSB0Y21kLT5idWZmbGVuOworCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgZXJyOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJZHByaW50aygiJWx4ICV1XG4iLCAodW5zaWduZWQgbG9uZykgdWFkZHIsIGxlbik7CisJCWJpbyA9IGJpb19tYXBfdXNlcihxLCBOVUxMLCAodW5zaWduZWQgbG9uZykgdWFkZHIsIGxlbiwgcncpOworCQlpZiAoSVNfRVJSKGJpbykpIHsKKwkJCWVyciA9IFBUUl9FUlIoYmlvKTsKKwkJCWRwcmludGsoImZhaWwgdG8gbWFwICVseCAldSAlZCAleFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykgdWFkZHIsIGxlbiwgZXJyLCBjbWQtPmNtbmRbMF0pOworCQkJZ290byB1bm1hcF9iaW9zOworCQl9CisKKwkJdWFkZHIgKz0gYmlvLT5iaV9zaXplOworCQlsZW4gLT0gYmlvLT5iaV9zaXplOworCisJCS8qCisJCSAqIFRoZSBmaXJzdCBiaW8gaXMgYWRkZWQgYW5kIG1lcmdlZC4gV2UgY291bGQgcHJvYmFibHkKKwkJICogdHJ5IHRvIGFkZCBvdGhlcnMgdXNpbmcgc2NzaV9tZXJnZV9iaW8oKSBidXQgZm9yIG5vdworCQkgKiB3ZSBrZWVwIGl0IHNpbXBsZS4gVGhlIGZpcnN0IGJpbyBzaG91bGQgYmUgcHJldHR5IGxhcmdlCisJCSAqIChlaXRoZXIgaGl0dGluZyB0aGUgMSBNQiBiaW8gcGFnZXMgbGltaXQgb3IgYSBxdWV1ZSBsaW1pdCkKKwkJICogYWxyZWFkeSBidXQgZm9yIHJlYWxseSBsYXJnZSBJTyB3ZSBtYXkgd2FudCB0byB0cnkgYW5kCisJCSAqIG1lcmdlIHRoZXNlLgorCQkgKi8KKwkJaWYgKCFycS0+YmlvKSB7CisJCQlibGtfcnFfYmlvX3ByZXAocSwgcnEsIGJpbyk7CisJCQlycS0+ZGF0YV9sZW4gPSBiaW8tPmJpX3NpemU7CisJCX0gZWxzZQorCQkJLyogcHV0IGxpc3Qgb2YgYmlvcyB0byB0cmFuc2ZlciBpbiBuZXh0IGdvIGFyb3VuZCAqLworCQkJYmlvX2xpc3RfYWRkKCZ0Y21kLT54ZmVyX2xpc3QsIGJpbyk7CisJfQorCisJY21kLT5vZmZzZXQgPSAwOworCWVyciA9IHNjc2lfdGd0X2luaXRfY21kKGNtZCwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycikKKwkJZ290byB1bm1hcF9iaW9zOworCisJcmV0dXJuIDA7CisKK3VubWFwX2Jpb3M6CisJaWYgKHJxLT5iaW8pIHsKKwkJYmlvX3VubWFwX3VzZXIocnEtPmJpbyk7CisJCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKCZ0Y21kLT54ZmVyX2xpc3QpKSkKKwkJCWJpb191bm1hcF91c2VyKGJpbyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzY3NpX3RndF90cmFuc2Zlcl9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKik7CisKK3N0YXRpYyB2b2lkIHNjc2lfdGd0X2RhdGFfdHJhbnNmZXJfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJc3RydWN0IHNjc2lfdGd0X2NtZCAqdGNtZCA9IGNtZC0+cmVxdWVzdC0+ZW5kX2lvX2RhdGE7CisJc3RydWN0IGJpbyAqYmlvOworCWludCBlcnI7CisKKwkvKiBzaG91bGQgd2UgZnJlZSByZXNvdXJjZXMgaGVyZSBvbiBlcnJvciA/ICovCisJaWYgKGNtZC0+cmVzdWx0KSB7CitzZW5kX3VzcGFjZV9lcnI6CisJCWVyciA9IHNjc2lfdGd0X3VzcGFjZV9zZW5kX3N0YXR1cyhjbWQsIHRjbWQtPnRhZyk7CisJCWlmIChlcnIgPD0gMCkKKwkJCS8qIHRoZSB0Z3QgdXNwYWNlIGVoIHdpbGwgaGF2ZSB0byBwaWNrIHRoaXMgdXAgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHNlbmQgY21kICVwIHN0YXR1c1xuIiwgY21kKTsKKwkJcmV0dXJuOworCX0KKworCWRwcmludGsoImNtZCAlcCByZXF1ZXN0X2J1ZmZsZW4gJXUgYnVmZmxlbiAldVxuIiwKKwkJY21kLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgdGNtZC0+YnVmZmxlbik7CisKKwlzY3NpX2ZyZWVfc2d0YWJsZShjbWQtPnJlcXVlc3RfYnVmZmVyLCBjbWQtPnNnbGlzdF9sZW4pOworCWJpb19saXN0X2FkZCgmdGNtZC0+eGZlcl9kb25lX2xpc3QsIGNtZC0+cmVxdWVzdC0+YmlvKTsKKworCXRjbWQtPmJ1ZmZlciArPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKwljbWQtPm9mZnNldCArPSBjbWQtPnJlcXVlc3RfYnVmZmxlbjsKKworCWlmICghdGNtZC0+eGZlcl9saXN0LmhlYWQpIHsKKwkJc2NzaV90Z3RfdHJhbnNmZXJfcmVzcG9uc2UoY21kKTsKKwkJcmV0dXJuOworCX0KKworCWRwcmludGsoImNtZDIgJXAgcmVxdWVzdF9idWZmbGVuICV1IGJ1ZmZsZW4gJXVcbiIsCisJCWNtZCwgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIHRjbWQtPmJ1ZmZsZW4pOworCisJYmlvID0gYmlvX2xpc3RfcG9wKCZ0Y21kLT54ZmVyX2xpc3QpOworCUJVR19PTighYmlvKTsKKworCWJsa19ycV9iaW9fcHJlcChjbWQtPnJlcXVlc3QtPnEsIGNtZC0+cmVxdWVzdCwgYmlvKTsKKwljbWQtPnJlcXVlc3QtPmRhdGFfbGVuID0gYmlvLT5iaV9zaXplOworCWVyciA9IHNjc2lfdGd0X2luaXRfY21kKGNtZCwgR0ZQX0FUT01JQyk7CisJaWYgKGVycikgeworCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJZ290byBzZW5kX3VzcGFjZV9lcnI7CisJfQorCisJaWYgKHNjc2lfdGd0X3RyYW5zZmVyX2RhdGEoY21kKSkgeworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlnb3RvIHNlbmRfdXNwYWNlX2VycjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2NzaV90Z3RfdHJhbnNmZXJfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gc2NzaV90Z3RfY21kX3RvX2hvc3QoY21kKTsKKworCWVyciA9IGhvc3QtPmhvc3R0LT50cmFuc2Zlcl9kYXRhKGNtZCwgc2NzaV90Z3RfZGF0YV90cmFuc2Zlcl9kb25lKTsKKwlzd2l0Y2ggKGVycikgeworCQljYXNlIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k6CisJCWNhc2UgU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOgorCQkJcmV0dXJuIC1FQUdBSU47CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHNjc2lfdGd0X2NvcHlfc2Vuc2Uoc3RydWN0IHNjc2lfY21uZCAqY21kLCB1bnNpZ25lZCBsb25nIHVhZGRyLAorCQkJCXVuc2lnbmVkIGxlbikKK3sKKwljaGFyIF9fdXNlciAqcCA9IChjaGFyIF9fdXNlciAqKSB1YWRkcjsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjbWQtPnNlbnNlX2J1ZmZlciwgcCwKKwkJCSAgIG1pbl90KHVuc2lnbmVkLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIGxlbikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGNvcHkgdGhlIHNlbnNlIGJ1ZmZlclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY3NpX3RndF9hYm9ydF9jbWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc2NzaV90Z3RfY21kICp0Y21kOworCWludCBlcnI7CisKKwllcnIgPSBzaG9zdC0+aG9zdHQtPmVoX2Fib3J0X2hhbmRsZXIoY21kKTsKKwlpZiAoZXJyKQorCQllcHJpbnRrKCJmYWlsIHRvIGFib3J0ICVwXG4iLCBjbWQpOworCisJdGNtZCA9IGNtZC0+cmVxdWVzdC0+ZW5kX2lvX2RhdGE7CisJc2NzaV90Z3RfY21kX2Rlc3Ryb3koJnRjbWQtPndvcmspOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqdGd0X2NtZF9oYXNoX2xvb2t1cChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdTY0IHRhZykKK3sKKwlzdHJ1Y3Qgc2NzaV90Z3RfcXVldWVkYXRhICpxZGF0YSA9IHEtPnF1ZXVlZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IHNjc2lfdGd0X2NtZCAqdGNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaGVhZCA9ICZxZGF0YS0+Y21kX2hhc2hbY21kX2hhc2hmbih0YWcpXTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcWRhdGEtPmNtZF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRjbWQsIGhlYWQsIGhhc2hfbGlzdCkgeworCQlpZiAodGNtZC0+dGFnID09IHRhZykgeworCQkJcnEgPSB0Y21kLT5ycTsKKwkJCWxpc3RfZGVsKCZ0Y21kLT5oYXNoX2xpc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWRhdGEtPmNtZF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBycTsKK30KKworaW50IHNjc2lfdGd0X2tzcGFjZV9leGVjKGludCBob3N0X25vLCB1NjQgdGFnLCBpbnQgcmVzdWx0LCB1MzIgbGVuLAorCQkJIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHU4IHJ3KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJc3RydWN0IHNjc2lfdGd0X2NtZCAqdGNtZDsKKwlpbnQgZXJyID0gMDsKKworCWRwcmludGsoIiVkICVsbHUgJWQgJXUgJWx4ICV1XG4iLCBob3N0X25vLCAodW5zaWduZWQgbG9uZyBsb25nKSB0YWcsCisJCXJlc3VsdCwgbGVuLCB1YWRkciwgcncpOworCisJLyogVE9ETzogcmVwbGFjZSB3aXRoIGEgTygxKSBhbGcgKi8KKwlzaG9zdCA9IHNjc2lfaG9zdF9sb29rdXAoaG9zdF9ubyk7CisJaWYgKElTX0VSUihzaG9zdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBob3N0IG5vICVkXG4iLCBob3N0X25vKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFzaG9zdC0+dXNwYWNlX3JlcV9xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm90IHRhcmdldCBzY3NpIGhvc3QgJWRcbiIsIGhvc3Rfbm8pOworCQlnb3RvIGRvbmU7CisJfQorCisJcnEgPSB0Z3RfY21kX2hhc2hfbG9va3VwKHNob3N0LT51c3BhY2VfcmVxX3EsIHRhZyk7CisJaWYgKCFycSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIHRhZyAlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdGFnKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwljbWQgPSBycS0+c3BlY2lhbDsKKworCWRwcmludGsoImNtZCAlcCByZXN1bHQgJWQgbGVuICVkIGJ1ZmZsZW4gJXUgJWx1ICV4XG4iLCBjbWQsCisJCXJlc3VsdCwgbGVuLCBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgcnFfZGF0YV9kaXIocnEpLCBjbWQtPmNtbmRbMF0pOworCisJaWYgKHJlc3VsdCA9PSBUQVNLX0FCT1JURUQpIHsKKwkJc2NzaV90Z3RfYWJvcnRfY21kKHNob3N0LCBjbWQpOworCQlnb3RvIGRvbmU7CisJfQorCS8qCisJICogc3RvcmUgdGhlIHVzZXJzcGFjZSB2YWx1ZXMgaGVyZSwgdGhlIHdvcmtpbmcgdmFsdWVzIGFyZQorCSAqIGluIHRoZSByZXF1ZXN0XyogdmFsdWVzCisJICovCisJdGNtZCA9IGNtZC0+cmVxdWVzdC0+ZW5kX2lvX2RhdGE7CisJdGNtZC0+YnVmZmVyID0gKHZvaWQgKil1YWRkcjsKKwl0Y21kLT5idWZmbGVuID0gbGVuOworCWNtZC0+cmVzdWx0ID0gcmVzdWx0OworCisJaWYgKCF0Y21kLT5idWZmbGVuIHx8IGNtZC0+cmVxdWVzdF9idWZmZXIpIHsKKwkJZXJyID0gX19zY3NpX3RndF90cmFuc2Zlcl9yZXNwb25zZShjbWQpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBUT0RPOiBEbyB3ZSBuZWVkIHRvIGhhbmRsZSBjYXNlIHdoZXJlIHJlcXVlc3QgZG9lcyBub3QKKwkgKiBhbGlnbiB3aXRoIExMRC4KKwkgKi8KKwllcnIgPSBzY3NpX21hcF91c2VyX3BhZ2VzKHJxLT5lbmRfaW9fZGF0YSwgY21kLCBydyk7CisJaWYgKGVycikgeworCQllcHJpbnRrKCIlcCAlZFxuIiwgY21kLCBlcnIpOworCQllcnIgPSAtRUFHQUlOOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogdXNlcnNwYWNlIGZhaWx1cmUgKi8KKwlpZiAoY21kLT5yZXN1bHQpIHsKKwkJaWYgKHN0YXR1c19ieXRlKGNtZC0+cmVzdWx0KSA9PSBDSEVDS19DT05ESVRJT04pCisJCQlzY3NpX3RndF9jb3B5X3NlbnNlKGNtZCwgdWFkZHIsIGxlbik7CisJCWVyciA9IF9fc2NzaV90Z3RfdHJhbnNmZXJfcmVzcG9uc2UoY21kKTsKKwkJZ290byBkb25lOworCX0KKwkvKiBhc2sgdGhlIHRhcmdldCBMTEQgdG8gdHJhbnNmZXIgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciAqLworCWVyciA9IHNjc2lfdGd0X3RyYW5zZmVyX2RhdGEoY21kKTsKKworZG9uZToKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgc2NzaV90Z3RfdHNrX21nbXRfcmVxdWVzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgaW50IGZ1bmN0aW9uLCB1NjQgdGFnLAorCQkJICAgICAgc3RydWN0IHNjc2lfbHVuICpzY3NpbHVuLCB2b2lkICpkYXRhKQoreworCWludCBlcnI7CisKKwkvKiBUT0RPOiBuZWVkIHRvIHJldHJ5IGlmIHRoaXMgZmFpbHMuICovCisJZXJyID0gc2NzaV90Z3RfdXNwYWNlX3NlbmRfdHNrX21nbXQoc2hvc3QtPmhvc3Rfbm8sIGZ1bmN0aW9uLAorCQkJCQkgICAgdGFnLCBzY3NpbHVuLCBkYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJZXByaW50aygiVGhlIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IGxvc3QhXG4iKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2NzaV90Z3RfdHNrX21nbXRfcmVxdWVzdCk7CisKK2ludCBzY3NpX3RndF9rc3BhY2VfdHNrX21nbXQoaW50IGhvc3Rfbm8sIHU2NCBtaWQsIGludCByZXN1bHQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlkcHJpbnRrKCIlZCAlZCAlbGx4XG4iLCBob3N0X25vLCByZXN1bHQsICh1bnNpZ25lZCBsb25nIGxvbmcpIG1pZCk7CisKKwlzaG9zdCA9IHNjc2lfaG9zdF9sb29rdXAoaG9zdF9ubyk7CisJaWYgKElTX0VSUihzaG9zdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBob3N0IG5vICVkXG4iLCBob3N0X25vKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoIXNob3N0LT51c3BhY2VfcmVxX3EpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOb3QgdGFyZ2V0IHNjc2kgaG9zdCAlZFxuIiwgaG9zdF9ubyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwllcnIgPSBzaG9zdC0+aG9zdHQtPnRza19tZ210X3Jlc3BvbnNlKG1pZCwgcmVzdWx0KTsKK2RvbmU6CisJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgc2NzaV90Z3RfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlzY3NpX3RndF9jbWRfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic2NzaV90Z3RfY21kIiwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NzaV90Z3RfY21kKSwKKwkJCQkJICAgICAgIDAsIDAsIE5VTEwsIE5VTEwpOworCWlmICghc2NzaV90Z3RfY21kX2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNjc2lfdGd0ZCA9IGNyZWF0ZV93b3JrcXVldWUoInNjc2lfdGd0ZCIpOworCWlmICghc2NzaV90Z3RkKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9rbWVtY2FjaGU7CisJfQorCisJZXJyID0gc2NzaV90Z3RfaWZfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gZGVzdHJveV93cTsKKworCXJldHVybiAwOworCitkZXN0cm95X3dxOgorCWRlc3Ryb3lfd29ya3F1ZXVlKHNjc2lfdGd0ZCk7CitmcmVlX2ttZW1jYWNoZToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koc2NzaV90Z3RfY21kX2NhY2hlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NzaV90Z3RfZXhpdCh2b2lkKQoreworCWRlc3Ryb3lfd29ya3F1ZXVlKHNjc2lfdGd0ZCk7CisJc2NzaV90Z3RfaWZfZXhpdCgpOworCWttZW1fY2FjaGVfZGVzdHJveShzY3NpX3RndF9jbWRfY2FjaGUpOworfQorCittb2R1bGVfaW5pdChzY3NpX3RndF9pbml0KTsKK21vZHVsZV9leGl0KHNjc2lfdGd0X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgdGFyZ2V0IGNvcmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9wcml2LmggYi9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDg4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfcHJpdi5oCkBAIC0wLDAgKzEsMjUgQEAKK3N0cnVjdCBzY3NpX2NtbmQ7CitzdHJ1Y3Qgc2NzaV9sdW47CitzdHJ1Y3QgU2NzaV9Ib3N0Oworc3RydWN0IHRhc2tfc3RydWN0OworCisvKiB0bXAgLSB3aWxsIHJlcGxhY2Ugd2l0aCBTQ1NJIGxvZ2dpbmcgc3R1ZmYgKi8KKyNkZWZpbmUgZXByaW50ayhmbXQsIGFyZ3MuLi4pCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJcHJpbnRrKCIlcyglZCkgIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjYXJncyk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pCisvKiAjZGVmaW5lIGRwcmludGsgZXByaW50ayAqLworCitleHRlcm4gdm9pZCBzY3NpX3RndF9pZl9leGl0KHZvaWQpOworZXh0ZXJuIGludCBzY3NpX3RndF9pZl9pbml0KHZvaWQpOworCitleHRlcm4gaW50IHNjc2lfdGd0X3VzcGFjZV9zZW5kX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBzY3NpX2x1biAqbHVuLAorCQkJCSAgICB1NjQgdGFnKTsKK2V4dGVybiBpbnQgc2NzaV90Z3RfdXNwYWNlX3NlbmRfc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdTY0IHRhZyk7CitleHRlcm4gaW50IHNjc2lfdGd0X2tzcGFjZV9leGVjKGludCBob3N0X25vLCB1NjQgdGFnLCBpbnQgcmVzdWx0LCB1MzIgbGVuLAorCQkJCXVuc2lnbmVkIGxvbmcgdWFkZHIsIHU4IHJ3KTsKK2V4dGVybiBpbnQgc2NzaV90Z3RfdXNwYWNlX3NlbmRfdHNrX21nbXQoaW50IGhvc3Rfbm8sIGludCBmdW5jdGlvbiwgdTY0IHRhZywKKwkJCQkJIHN0cnVjdCBzY3NpX2x1biAqc2NzaWx1biwgdm9pZCAqZGF0YSk7CitleHRlcm4gaW50IHNjc2lfdGd0X2tzcGFjZV90c2tfbWdtdChpbnQgaG9zdF9ubywgdTY0IG1pZCwgaW50IHJlc3VsdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCmluZGV4IDM4YzIxNWEuLjM1NzFjZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCkBAIC0yNDEsOSArMjQxLDkgQEAKICNkZWZpbmUgRkNfTUdNVFNSVlJfUE9SVElECQkweDAwMDAwYQogCiAKLXN0YXRpYyB2b2lkIGZjX3RpbWVvdXRfZGVsZXRlZF9ycG9ydCh2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIGZjX3RpbWVvdXRfZmFpbF9ycG9ydF9pbyh2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIGZjX3Njc2lfc2Nhbl9ycG9ydCh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGZjX3RpbWVvdXRfZGVsZXRlZF9ycG9ydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgZmNfdGltZW91dF9mYWlsX3Jwb3J0X2lvKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBmY19zY3NpX3NjYW5fcnBvcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyoKICAqIEF0dHJpYnV0ZSBjb3VudHMgcHJlIG9iamVjdCB0eXBlLi4uCkBAIC0xNjEzLDcgKzE2MTMsNyBAQAogICogCTEgb24gc3VjY2VzcyAvIDAgYWxyZWFkeSBxdWV1ZWQgLyA8IDAgZm9yIGVycm9yCiAgKiovCiBzdGF0aWMgaW50Ci1mY19xdWV1ZV9kZXZsb3NzX3dvcmsoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywKK2ZjX3F1ZXVlX2Rldmxvc3Nfd29yayhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaywKIAkJCQl1bnNpZ25lZCBsb25nIGRlbGF5KQogewogCWlmICh1bmxpa2VseSghZmNfaG9zdF9kZXZsb3NzX3dvcmtfcShzaG9zdCkpKSB7CkBAIC0xNjI1LDkgKzE2MjUsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoZGVsYXkgPT0gMCkKLQkJcmV0dXJuIHF1ZXVlX3dvcmsoZmNfaG9zdF9kZXZsb3NzX3dvcmtfcShzaG9zdCksIHdvcmspOwotCiAJcmV0dXJuIHF1ZXVlX2RlbGF5ZWRfd29yayhmY19ob3N0X2Rldmxvc3Nfd29ya19xKHNob3N0KSwgd29yaywgZGVsYXkpOwogfQogCkBAIC0xNzEyLDEyICsxNzA5LDEzIEBACiAgKiBmY19zdGFyZ2V0X2RlbGV0ZSAtIGNhbGxlZCB0byBkZWxldGUgdGhlIHNjc2kgZGVjZW5kZW50cyBvZiBhbiBycG9ydAogICogICAgICAgICAgICAgICAgICAodGFyZ2V0IGFuZCBhbGwgc2RldnMpCiAgKgotICogQGRhdGE6CXJlbW90ZSBwb3J0IHRvIGJlIG9wZXJhdGVkIG9uLgorICogQHdvcms6CXJlbW90ZSBwb3J0IHRvIGJlIG9wZXJhdGVkIG9uLgogICoqLwogc3RhdGljIHZvaWQKLWZjX3N0YXJnZXRfZGVsZXRlKHZvaWQgKmRhdGEpCitmY19zdGFyZ2V0X2RlbGV0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IChzdHJ1Y3QgZmNfcnBvcnQgKilkYXRhOworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZjX3Jwb3J0LCBzdGd0X2RlbGV0ZV93b3JrKTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBmY19pbnRlcm5hbCAqaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKQEAgLTE3NTEsMTIgKzE3NDksMTMgQEAKIC8qKgogICogZmNfcnBvcnRfZmluYWxfZGVsZXRlIC0gZmluaXNoIHJwb3J0IHRlcm1pbmF0aW9uIGFuZCBkZWxldGUgaXQuCiAgKgotICogQGRhdGE6CXJlbW90ZSBwb3J0IHRvIGJlIGRlbGV0ZWQuCisgKiBAd29yazoJcmVtb3RlIHBvcnQgdG8gYmUgZGVsZXRlZC4KICAqKi8KIHN0YXRpYyB2b2lkCi1mY19ycG9ydF9maW5hbF9kZWxldGUodm9pZCAqZGF0YSkKK2ZjX3Jwb3J0X2ZpbmFsX2RlbGV0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IChzdHJ1Y3QgZmNfcnBvcnQgKilkYXRhOworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZjX3Jwb3J0LCBycG9ydF9kZWxldGVfd29yayk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnJwb3J0LT5kZXY7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBycG9ydF90b19zaG9zdChycG9ydCk7CiAJc3RydWN0IGZjX2ludGVybmFsICppID0gdG9fZmNfaW50ZXJuYWwoc2hvc3QtPnRyYW5zcG9ydHQpOwpAQCAtMTc3MCw3ICsxNzY5LDcgQEAKIAogCS8qIERlbGV0ZSBTQ1NJIHRhcmdldCBhbmQgc2RldnMgKi8KIAlpZiAocnBvcnQtPnNjc2lfdGFyZ2V0X2lkICE9IC0xKQotCQlmY19zdGFyZ2V0X2RlbGV0ZShkYXRhKTsKKwkJZmNfc3RhcmdldF9kZWxldGUoJnJwb3J0LT5zdGd0X2RlbGV0ZV93b3JrKTsKIAllbHNlIGlmIChpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKQogCQlpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKHJwb3J0KTsKIAllbHNlIGlmIChpLT5mLT50ZXJtaW5hdGVfcnBvcnRfaW8pCkBAIC0xODI5LDExICsxODI4LDExIEBACiAJcnBvcnQtPmNoYW5uZWwgPSBjaGFubmVsOwogCXJwb3J0LT5mYXN0X2lvX2ZhaWxfdG1vID0gLTE7CiAKLQlJTklUX1dPUksoJnJwb3J0LT5kZXZfbG9zc193b3JrLCBmY190aW1lb3V0X2RlbGV0ZWRfcnBvcnQsIHJwb3J0KTsKLQlJTklUX1dPUksoJnJwb3J0LT5mYWlsX2lvX3dvcmssIGZjX3RpbWVvdXRfZmFpbF9ycG9ydF9pbywgcnBvcnQpOwotCUlOSVRfV09SSygmcnBvcnQtPnNjYW5fd29yaywgZmNfc2NzaV9zY2FuX3Jwb3J0LCBycG9ydCk7Ci0JSU5JVF9XT1JLKCZycG9ydC0+c3RndF9kZWxldGVfd29yaywgZmNfc3RhcmdldF9kZWxldGUsIHJwb3J0KTsKLQlJTklUX1dPUksoJnJwb3J0LT5ycG9ydF9kZWxldGVfd29yaywgZmNfcnBvcnRfZmluYWxfZGVsZXRlLCBycG9ydCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJwb3J0LT5kZXZfbG9zc193b3JrLCBmY190aW1lb3V0X2RlbGV0ZWRfcnBvcnQpOworCUlOSVRfREVMQVlFRF9XT1JLKCZycG9ydC0+ZmFpbF9pb193b3JrLCBmY190aW1lb3V0X2ZhaWxfcnBvcnRfaW8pOworCUlOSVRfV09SSygmcnBvcnQtPnNjYW5fd29yaywgZmNfc2NzaV9zY2FuX3Jwb3J0KTsKKwlJTklUX1dPUksoJnJwb3J0LT5zdGd0X2RlbGV0ZV93b3JrLCBmY19zdGFyZ2V0X2RlbGV0ZSk7CisJSU5JVF9XT1JLKCZycG9ydC0+cnBvcnRfZGVsZXRlX3dvcmssIGZjX3Jwb3J0X2ZpbmFsX2RlbGV0ZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKQEAgLTE5NjMsNyArMTk2Miw3IEBACiAJCQl9CiAKIAkJCWlmIChtYXRjaCkgewotCQkJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9IAorCQkJCXN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmsgPQogCQkJCQkJCSZycG9ydC0+ZGV2X2xvc3Nfd29yazsKIAogCQkJCW1lbWNweSgmcnBvcnQtPm5vZGVfbmFtZSwgJmlkcy0+bm9kZV9uYW1lLApAQCAtMjI2NywxMiArMjI2NiwxMyBAQAogICogICAgICAgICAgICAgICAgICAgICAgIHdhcyBhIFNDU0kgdGFyZ2V0ICh0aHVzIHdhcyBibG9ja2VkKSwgYW5kIGZhaWxlZAogICogICAgICAgICAgICAgICAgICAgICAgIHRvIHJldHVybiBpbiB0aGUgYWxsb3RlZCB0aW1lLgogICogCi0gKiBAZGF0YToJcnBvcnQgdGFyZ2V0IHRoYXQgZmFpbGVkIHRvIHJlYXBwZWFyIGluIHRoZSBhbGxvdGVkIHRpbWUuCisgKiBAd29yazoJcnBvcnQgdGFyZ2V0IHRoYXQgZmFpbGVkIHRvIHJlYXBwZWFyIGluIHRoZSBhbGxvdGVkIHRpbWUuCiAgKiovCiBzdGF0aWMgdm9pZAotZmNfdGltZW91dF9kZWxldGVkX3Jwb3J0KHZvaWQgICpkYXRhKQorZmNfdGltZW91dF9kZWxldGVkX3Jwb3J0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gKHN0cnVjdCBmY19ycG9ydCAqKWRhdGE7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZmNfcnBvcnQsIGRldl9sb3NzX3dvcmsud29yayk7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBycG9ydF90b19zaG9zdChycG9ydCk7CiAJc3RydWN0IGZjX2hvc3RfYXR0cnMgKmZjX2hvc3QgPSBzaG9zdF90b19mY19ob3N0KHNob3N0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjM2NiwxNSArMjM2NiwxNiBAQAogICogZmNfdGltZW91dF9mYWlsX3Jwb3J0X2lvIC0gVGltZW91dCBoYW5kbGVyIGZvciBhIGZhc3QgaW8gZmFpbGluZyBvbiBhCiAgKiAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkIFNDU0kgdGFyZ2V0LgogICoKLSAqIEBkYXRhOglycG9ydCB0byB0ZXJtaW5hdGUgaW8gb24uCisgKiBAd29yazoJcnBvcnQgdG8gdGVybWluYXRlIGlvIG9uLgogICoKICAqIE5vdGVzOiBPbmx5IHJlcXVlc3RzIHRoZSBmYWlsdXJlIG9mIHRoZSBpbywgbm90IHRoYXQgYWxsIGFyZSBmbHVzaGVkCiAgKiAgICBwcmlvciB0byByZXR1cm5pbmcuCiAgKiovCiBzdGF0aWMgdm9pZAotZmNfdGltZW91dF9mYWlsX3Jwb3J0X2lvKHZvaWQgICpkYXRhKQorZmNfdGltZW91dF9mYWlsX3Jwb3J0X2lvKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gKHN0cnVjdCBmY19ycG9ydCAqKWRhdGE7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZmNfcnBvcnQsIGZhaWxfaW9fd29yay53b3JrKTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKIAlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CiAKQEAgLTIzODcsMTIgKzIzODgsMTMgQEAKIC8qKgogICogZmNfc2NzaV9zY2FuX3Jwb3J0IC0gY2FsbGVkIHRvIHBlcmZvcm0gYSBzY3NpIHNjYW4gb24gYSByZW1vdGUgcG9ydC4KICAqCi0gKiBAZGF0YToJcmVtb3RlIHBvcnQgdG8gYmUgc2Nhbm5lZC4KKyAqIEB3b3JrOglyZW1vdGUgcG9ydCB0byBiZSBzY2FubmVkLgogICoqLwogc3RhdGljIHZvaWQKLWZjX3Njc2lfc2Nhbl9ycG9ydCh2b2lkICpkYXRhKQorZmNfc2NzaV9zY2FuX3Jwb3J0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gKHN0cnVjdCBmY19ycG9ydCAqKWRhdGE7CisJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZmNfcnBvcnQsIHNjYW5fd29yayk7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBycG9ydF90b19zaG9zdChycG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwppbmRleCA3YjAwMTljLi45YzIyZjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwpAQCAtMjEsNyArMjEsNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KQEAgLTM0LDcgKzMzLDcgQEAKICNkZWZpbmUgSVNDU0lfU0VTU0lPTl9BVFRSUyAxMQogI2RlZmluZSBJU0NTSV9DT05OX0FUVFJTIDExCiAjZGVmaW5lIElTQ1NJX0hPU1RfQVRUUlMgMAotI2RlZmluZSBJU0NTSV9UUkFOU1BPUlRfVkVSU0lPTiAiMi4wLTY4NSIKKyNkZWZpbmUgSVNDU0lfVFJBTlNQT1JUX1ZFUlNJT04gIjIuMC03MjQiCiAKIHN0cnVjdCBpc2NzaV9pbnRlcm5hbCB7CiAJaW50IGRhZW1vbl9waWQ7CkBAIC0xNDksMzAgKzE0OCw2IEBACiBzdGF0aWMgc3RydWN0IHNvY2sgKm5sczsKIHN0YXRpYyBERUZJTkVfTVVURVgocnhfcXVldWVfbXV0ZXgpOwogCi1zdHJ1Y3QgbWVtcG9vbF96b25lIHsKLQltZW1wb29sX3QgKnBvb2w7Ci0JYXRvbWljX3QgYWxsb2NhdGVkOwotCWludCBzaXplOwotCWludCBoaXdhdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVxdWV1ZTsKLQlzcGlubG9ja190IGZyZWVsb2NrOwotfTsKLQotc3RhdGljIHN0cnVjdCBtZW1wb29sX3pvbmUgKnpfcmVwbHk7Ci0KLS8qCi0gKiBaX01BWF8qIC0gYWN0dWFsIG1lbXBvb2wgc2l6ZSBhbGxvY2F0ZWQgYXQgdGhlIG1lbXBvb2xfem9uZV9pbml0KCkgdGltZQotICogWl9ISVdBVF8qIC0gem9uZSdzIGhpZ2ggd2F0ZXJtYXJrIHdoZW4gaWZfZXJyb3IgYml0IHdpbGwgYmUgc2V0IHRvIC1FTk9NRU0KLSAqICAgICAgICAgICAgIHNvIGRhZW1vbiB3aWxsIG5vdGljZSBPT00gb24gTkVUTElOSyB0cmFucG9zcnQgbGV2ZWwgYW5kIHdpbGwKLSAqICAgICAgICAgICAgIGJlIGFibGUgdG8gcHJlZGljdCBvciBjaGFuZ2Ugb3BlcmF0aW9uYWwgYmVoYXZpb3IKLSAqLwotI2RlZmluZSBaX01BWF9SRVBMWQk4Ci0jZGVmaW5lIFpfSElXQVRfUkVQTFkJNgotI2RlZmluZSBaX01BWF9QRFUJOAotI2RlZmluZSBaX0hJV0FUX1BEVQk2Ci0jZGVmaW5lIFpfTUFYX0VSUk9SCTE2Ci0jZGVmaW5lIFpfSElXQVRfRVJST1IJMTIKLQogc3RhdGljIExJU1RfSEVBRChzZXNzbGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNlc3Nsb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQoY29ubmxpc3QpOwpAQCAtMjU5LDkgKzIzNCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0KHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBzZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24gPSBkYXRhOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24sCisJCQkgICAgIHJlY292ZXJ5X3dvcmsud29yayk7CiAKIAlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnNlc3Npb24tPmRldiwgImlzY3NpOiBzZXNzaW9uIHJlY292ZXJ5IHRpbWVkICIKIAkJICAib3V0IGFmdGVyICVkIHNlY3NcbiIsIHNlc3Npb24tPnJlY292ZXJ5X3Rtbyk7CkBAIC0zMDEsNyArMjc4LDcgQEAKIAogCXNlc3Npb24tPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKIAlzZXNzaW9uLT5yZWNvdmVyeV90bW8gPSAxMjA7Ci0JSU5JVF9XT1JLKCZzZXNzaW9uLT5yZWNvdmVyeV93b3JrLCBzZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0LCBzZXNzaW9uKTsKKwlJTklUX0RFTEFZRURfV09SSygmc2Vzc2lvbi0+cmVjb3Zlcnlfd29yaywgc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPmhvc3RfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPnNlc3NfbGlzdCk7CiAKQEAgLTQxNCw1OSArMzkxLDExIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9kZXN0cm95X3Nlc3Npb24pOwogCi1zdGF0aWMgdm9pZCBtZW1wb29sX3pvbmVfZGVzdHJveShzdHJ1Y3QgbWVtcG9vbF96b25lICp6cCkKLXsKLQltZW1wb29sX2Rlc3Ryb3koenAtPnBvb2wpOwotCWtmcmVlKHpwKTsKLX0KLQotc3RhdGljIHZvaWQqCi1tZW1wb29sX3pvbmVfYWxsb2Nfc2tiKGdmcF90IGdmcF9tYXNrLCB2b2lkICpwb29sX2RhdGEpCi17Ci0Jc3RydWN0IG1lbXBvb2xfem9uZSAqem9uZSA9IHBvb2xfZGF0YTsKLQotCXJldHVybiBhbGxvY19za2Ioem9uZS0+c2l6ZSwgZ2ZwX21hc2spOwotfQotCi1zdGF0aWMgdm9pZAotbWVtcG9vbF96b25lX2ZyZWVfc2tiKHZvaWQgKmVsZW1lbnQsIHZvaWQgKnBvb2xfZGF0YSkKLXsKLQlrZnJlZV9za2IoZWxlbWVudCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbWVtcG9vbF96b25lICoKLW1lbXBvb2xfem9uZV9pbml0KHVuc2lnbmVkIG1heCwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgaGl3YXQpCi17Ci0Jc3RydWN0IG1lbXBvb2xfem9uZSAqenA7Ci0KLQl6cCA9IGt6YWxsb2Moc2l6ZW9mKCp6cCksIEdGUF9LRVJORUwpOwotCWlmICghenApCi0JCXJldHVybiBOVUxMOwotCi0JenAtPnNpemUgPSBzaXplOwotCXpwLT5oaXdhdCA9IGhpd2F0OwotCUlOSVRfTElTVF9IRUFEKCZ6cC0+ZnJlZXF1ZXVlKTsKLQlzcGluX2xvY2tfaW5pdCgmenAtPmZyZWVsb2NrKTsKLQlhdG9taWNfc2V0KCZ6cC0+YWxsb2NhdGVkLCAwKTsKLQotCXpwLT5wb29sID0gbWVtcG9vbF9jcmVhdGUobWF4LCBtZW1wb29sX3pvbmVfYWxsb2Nfc2tiLAotCQkJCSAgbWVtcG9vbF96b25lX2ZyZWVfc2tiLCB6cCk7Ci0JaWYgKCF6cC0+cG9vbCkgewotCQlrZnJlZSh6cCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiB6cDsKLX0KLQogc3RhdGljIHZvaWQgaXNjc2lfY29ubl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4gPSBpc2NzaV9kZXZfdG9fY29ubihkZXYpOwogCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGNvbm4tPmRldi5wYXJlbnQ7CiAKLQltZW1wb29sX3pvbmVfZGVzdHJveShjb25uLT56X3BkdSk7Ci0JbWVtcG9vbF96b25lX2Rlc3Ryb3koY29ubi0+el9lcnJvcik7Ci0KIAlrZnJlZShjb25uKTsKIAlwdXRfZGV2aWNlKHBhcmVudCk7CiB9CkBAIC00NzYsMzEgKzQwNSw2IEBACiAJcmV0dXJuIGRldi0+cmVsZWFzZSA9PSBpc2NzaV9jb25uX3JlbGVhc2U7CiB9CiAKLXN0YXRpYyBpbnQgaXNjc2lfY3JlYXRlX2V2ZW50X3Bvb2xzKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubikKLXsKLQljb25uLT56X3BkdSA9IG1lbXBvb2xfem9uZV9pbml0KFpfTUFYX1BEVSwKLQkJCU5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaXNjc2lfdWV2ZW50KSArCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSArCi0JCQkJICAgIERFRkFVTFRfTUFYX1JFQ1ZfREFUQV9TRUdNRU5UX0xFTkdUSCksCi0JCQlaX0hJV0FUX1BEVSk7Ci0JaWYgKCFjb25uLT56X3BkdSkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgYWxsb2NhdGUgIgotCQkJICAgInBkdSB6b25lIGZvciBuZXcgY29ublxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNvbm4tPnpfZXJyb3IgPSBtZW1wb29sX3pvbmVfaW5pdChaX01BWF9FUlJPUiwKLQkJCU5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaXNjc2lfdWV2ZW50KSksCi0JCQlaX0hJV0FUX0VSUk9SKTsKLQlpZiAoIWNvbm4tPnpfZXJyb3IpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgImlzY3NpOiBjYW4gbm90IGFsbG9jYXRlICIKLQkJCSAgICJlcnJvciB6b25lIGZvciBuZXcgY29ublxuIik7Ci0JCW1lbXBvb2xfem9uZV9kZXN0cm95KGNvbm4tPnpfcGR1KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJldHVybiAwOwotfQotCiAvKioKICAqIGlzY3NpX2NyZWF0ZV9jb25uIC0gY3JlYXRlIGlzY3NpIGNsYXNzIGNvbm5lY3Rpb24KICAqIEBzZXNzaW9uOiBpc2NzaSBjbHMgc2Vzc2lvbgpAQCAtNTMzLDEyICs0MzcsOSBAQAogCWNvbm4tPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKIAljb25uLT5jaWQgPSBjaWQ7CiAKLQlpZiAoaXNjc2lfY3JlYXRlX2V2ZW50X3Bvb2xzKGNvbm4pKQotCQlnb3RvIGZyZWVfY29ubjsKLQogCS8qIHRoaXMgaXMgcmVsZWFzZWQgaW4gdGhlIGRldidzIHJlbGVhc2UgZnVuY3Rpb24gKi8KIAlpZiAoIWdldF9kZXZpY2UoJnNlc3Npb24tPmRldikpCi0JCWdvdG8gZnJlZV9jb25uX3Bvb2xzOworCQlnb3RvIGZyZWVfY29ubjsKIAogCXNucHJpbnRmKGNvbm4tPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiY29ubmVjdGlvbiVkOiV1IiwKIAkJIHNlc3Npb24tPnNpZCwgY2lkKTsKQEAgLTU1NSw4ICs0NTYsNiBAQAogCiByZWxlYXNlX3BhcmVudF9yZWY6CiAJcHV0X2RldmljZSgmc2Vzc2lvbi0+ZGV2KTsKLWZyZWVfY29ubl9wb29sczoKLQogZnJlZV9jb25uOgogCWtmcmVlKGNvbm4pOwogCXJldHVybiBOVUxMOwpAQCAtNTk5LDgxICs0OTgsMzEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICpza2JfdG9fbGgoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gKHN0cnVjdCBsaXN0X2hlYWQgKikmc2tiLT5jYjsKLX0KLQotc3RhdGljIHZvaWQKLW1lbXBvb2xfem9uZV9jb21wbGV0ZShzdHJ1Y3QgbWVtcG9vbF96b25lICp6b25lKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGgsICpuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnpvbmUtPmZyZWVsb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBuLCAmem9uZS0+ZnJlZXF1ZXVlKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikoKGNoYXIgKilsaCAtCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGNiKSk7Ci0JCWlmICghc2tiX3NoYXJlZChza2IpKSB7Ci0JCQlsaXN0X2RlbChza2JfdG9fbGgoc2tiKSk7Ci0JCQltZW1wb29sX2ZyZWUoc2tiLCB6b25lLT5wb29sKTsKLQkJCWF0b21pY19kZWMoJnpvbmUtPmFsbG9jYXRlZCk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+ZnJlZWxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBza19idWZmKgotbWVtcG9vbF96b25lX2dldF9za2Ioc3RydWN0IG1lbXBvb2xfem9uZSAqem9uZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0Jc2tiID0gbWVtcG9vbF9hbGxvYyh6b25lLT5wb29sLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiKQotCQlhdG9taWNfaW5jKCZ6b25lLT5hbGxvY2F0ZWQpOwotCXJldHVybiBza2I7Ci19Ci0KIHN0YXRpYyBpbnQKLWlzY3NpX2Jyb2FkY2FzdF9za2Ioc3RydWN0IG1lbXBvb2xfem9uZSAqem9uZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgZ2ZwX3QgZ2ZwKQoraXNjc2lfYnJvYWRjYXN0X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBnZnApCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmM7CiAKLQlza2JfZ2V0KHNrYik7CiAJcmMgPSBuZXRsaW5rX2Jyb2FkY2FzdChubHMsIHNrYiwgMCwgMSwgZ2ZwKTsKIAlpZiAocmMgPCAwKSB7Ci0JCW1lbXBvb2xfZnJlZShza2IsIHpvbmUtPnBvb2wpOwogCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBjYW4gbm90IGJyb2FkY2FzdCBza2IgKCVkKVxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnpvbmUtPmZyZWVsb2NrLCBmbGFncyk7Ci0JSU5JVF9MSVNUX0hFQUQoc2tiX3RvX2xoKHNrYikpOwotCWxpc3RfYWRkKHNrYl90b19saChza2IpLCAmem9uZS0+ZnJlZXF1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5mcmVlbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1pc2NzaV91bmljYXN0X3NrYihzdHJ1Y3QgbWVtcG9vbF96b25lICp6b25lLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcGlkKQoraXNjc2lfdW5pY2FzdF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBpZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKIAotCXNrYl9nZXQoc2tiKTsKIAlyYyA9IG5ldGxpbmtfdW5pY2FzdChubHMsIHNrYiwgcGlkLCBNU0dfRE9OVFdBSVQpOwogCWlmIChyYyA8IDApIHsKLQkJbWVtcG9vbF9mcmVlKHNrYiwgem9uZS0+cG9vbCk7CiAJCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGNhbiBub3QgdW5pY2FzdCBza2IgKCVkKVxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnpvbmUtPmZyZWVsb2NrLCBmbGFncyk7Ci0JSU5JVF9MSVNUX0hFQUQoc2tiX3RvX2xoKHNrYikpOwotCWxpc3RfYWRkKHNrYl90b19saChza2IpLCAmem9uZS0+ZnJlZXF1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5mcmVlbG9jaywgZmxhZ3MpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY5Miw5ICs1NDEsNyBAQAogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9wZHUpOwotCi0Jc2tiID0gbWVtcG9vbF96b25lX2dldF9za2IoY29ubi0+el9wZHUpOworCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKSB7CiAJCWlzY3NpX2Nvbm5fZXJyb3IoY29ubiwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgImlzY3NpOiBjYW4gbm90IGRlbGl2ZXIgIgpAQCAtNzA3LDE1ICs1NTQsMTMgQEAKIAltZW1zZXQoZXYsIDAsIHNpemVvZigqZXYpKTsKIAlldi0+dHJhbnNwb3J0X2hhbmRsZSA9IGlzY3NpX2hhbmRsZShjb25uLT50cmFuc3BvcnQpOwogCWV2LT50eXBlID0gSVNDU0lfS0VWRU5UX1JFQ1ZfUERVOwotCWlmIChhdG9taWNfcmVhZCgmY29ubi0+el9wZHUtPmFsbG9jYXRlZCkgPj0gY29ubi0+el9wZHUtPmhpd2F0KQotCQlldi0+aWZlcnJvciA9IC1FTk9NRU07CiAJZXYtPnIucmVjdl9yZXEuY2lkID0gY29ubi0+Y2lkOwogCWV2LT5yLnJlY3ZfcmVxLnNpZCA9IGlzY3NpX2Nvbm5fZ2V0X3NpZChjb25uKTsKIAlwZHUgPSAoY2hhciopZXYgKyBzaXplb2YoKmV2KTsKIAltZW1jcHkocGR1LCBoZHIsIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSk7CiAJbWVtY3B5KHBkdSArIHNpemVvZihzdHJ1Y3QgaXNjc2lfaGRyKSwgZGF0YSwgZGF0YV9zaXplKTsKIAotCXJldHVybiBpc2NzaV91bmljYXN0X3NrYihjb25uLT56X3BkdSwgc2tiLCBwcml2LT5kYWVtb25fcGlkKTsKKwlyZXR1cm4gaXNjc2lfdW5pY2FzdF9za2Ioc2tiLCBwcml2LT5kYWVtb25fcGlkKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX3JlY3ZfcGR1KTsKIApAQCAtNzMxLDkgKzU3Niw3IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm47CiAKLQltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9lcnJvcik7Ci0KLQlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYihjb25uLT56X2Vycm9yKTsKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikgewogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGdyYWNlZnVsbHkgaWdub3JlZCAiCiAJCQkgICJjb25uIGVycm9yICglZClcbiIsIGVycm9yKTsKQEAgLTc0NCwxMyArNTg3LDExIEBACiAJZXYgPSBOTE1TR19EQVRBKG5saCk7CiAJZXYtPnRyYW5zcG9ydF9oYW5kbGUgPSBpc2NzaV9oYW5kbGUoY29ubi0+dHJhbnNwb3J0KTsKIAlldi0+dHlwZSA9IElTQ1NJX0tFVkVOVF9DT05OX0VSUk9SOwotCWlmIChhdG9taWNfcmVhZCgmY29ubi0+el9lcnJvci0+YWxsb2NhdGVkKSA+PSBjb25uLT56X2Vycm9yLT5oaXdhdCkKLQkJZXYtPmlmZXJyb3IgPSAtRU5PTUVNOwogCWV2LT5yLmNvbm5lcnJvci5lcnJvciA9IGVycm9yOwogCWV2LT5yLmNvbm5lcnJvci5jaWQgPSBjb25uLT5jaWQ7CiAJZXYtPnIuY29ubmVycm9yLnNpZCA9IGlzY3NpX2Nvbm5fZ2V0X3NpZChjb25uKTsKIAotCWlzY3NpX2Jyb2FkY2FzdF9za2IoY29ubi0+el9lcnJvciwgc2tiLCBHRlBfQVRPTUlDKTsKKwlpc2NzaV9icm9hZGNhc3Rfc2tiKHNrYiwgR0ZQX0FUT01JQyk7CiAKIAlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmNvbm4tPmRldiwgImlzY3NpOiBkZXRlY3RlZCBjb25uIGVycm9yICglZClcbiIsCiAJCSAgIGVycm9yKTsKQEAgLTc2Nyw5ICs2MDgsNyBAQAogCWludCBmbGFncyA9IG11bHRpID8gTkxNX0ZfTVVMVEkgOiAwOwogCWludCB0ID0gZG9uZSA/IE5MTVNHX0RPTkUgOiB0eXBlOwogCi0JbWVtcG9vbF96b25lX2NvbXBsZXRlKHpfcmVwbHkpOwotCi0Jc2tiID0gbWVtcG9vbF96b25lX2dldF9za2Ioel9yZXBseSk7CisJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJLyoKIAkgKiBGSVhNRToKIAkgKiB1c2VyIGlzIHN1cHBvc2VkIHRvIHJlYWN0IG9uIGlmZXJyb3IgPT0gLUVOT01FTTsKQEAgLTc4MCw3ICs2MTksNyBAQAogCW5saCA9IF9fbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHQsIChsZW4gLSBzaXplb2YoKm5saCkpLCAwKTsKIAlubGgtPm5sbXNnX2ZsYWdzID0gZmxhZ3M7CiAJbWVtY3B5KE5MTVNHX0RBVEEobmxoKSwgcGF5bG9hZCwgc2l6ZSk7Ci0JcmV0dXJuIGlzY3NpX3VuaWNhc3Rfc2tiKHpfcmVwbHksIHNrYiwgcGlkKTsKKwlyZXR1cm4gaXNjc2lfdW5pY2FzdF9za2Ioc2tiLCBwaWQpOwogfQogCiBzdGF0aWMgaW50CkBAIC04MTAsOSArNjQ5LDcgQEAKIAlkbyB7CiAJCWludCBhY3R1YWxfc2l6ZTsKIAotCQltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9wZHUpOwotCi0JCXNrYnN0YXQgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYihjb25uLT56X3BkdSk7CisJCXNrYnN0YXQgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFza2JzdGF0KSB7CiAJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgIgogCQkJCSAgICJkZWxpdmVyIHN0YXRzOiBPT01cbiIpOwpAQCAtODI1LDggKzY2Miw2IEBACiAJCW1lbXNldChldnN0YXQsIDAsIHNpemVvZigqZXZzdGF0KSk7CiAJCWV2c3RhdC0+dHJhbnNwb3J0X2hhbmRsZSA9IGlzY3NpX2hhbmRsZShjb25uLT50cmFuc3BvcnQpOwogCQlldnN0YXQtPnR5cGUgPSBubGgtPm5sbXNnX3R5cGU7Ci0JCWlmIChhdG9taWNfcmVhZCgmY29ubi0+el9wZHUtPmFsbG9jYXRlZCkgPj0gY29ubi0+el9wZHUtPmhpd2F0KQotCQkJZXZzdGF0LT5pZmVycm9yID0gLUVOT01FTTsKIAkJZXZzdGF0LT51LmdldF9zdGF0cy5jaWQgPQogCQkJZXYtPnUuZ2V0X3N0YXRzLmNpZDsKIAkJZXZzdGF0LT51LmdldF9zdGF0cy5zaWQgPQpAQCAtODQ1LDcgKzY4MCw3IEBACiAJCXNrYl90cmltKHNrYnN0YXQsIE5MTVNHX0FMSUdOKGFjdHVhbF9zaXplKSk7CiAJCW5saHN0YXQtPm5sbXNnX2xlbiA9IGFjdHVhbF9zaXplOwogCi0JCWVyciA9IGlzY3NpX3VuaWNhc3Rfc2tiKGNvbm4tPnpfcGR1LCBza2JzdGF0LCBwcml2LT5kYWVtb25fcGlkKTsKKwkJZXJyID0gaXNjc2lfdW5pY2FzdF9za2Ioc2tic3RhdCwgcHJpdi0+ZGFlbW9uX3BpZCk7CiAJfSB3aGlsZSAoZXJyIDwgMCAmJiBlcnIgIT0gLUVDT05OUkVGVVNFRCk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtODc2LDkgKzcxMSw3IEBACiAJc2Vzc2lvbiA9IGlzY3NpX2Rldl90b19zZXNzaW9uKGNvbm4tPmRldi5wYXJlbnQpOwogCXNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChzZXNzaW9uKTsKIAotCW1lbXBvb2xfem9uZV9jb21wbGV0ZShjb25uLT56X3BkdSk7Ci0KLQlza2IgPSBtZW1wb29sX3pvbmVfZ2V0X3NrYihjb25uLT56X3BkdSk7CisJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IpIHsKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgIkNhbm5vdCBub3RpZnkgdXNlcnNwYWNlIG9mICIKIAkJCSAgInNlc3Npb24gY3JlYXRpb24gZXZlbnRcbiIpOwpAQCAtODk2LDcgKzcyOSw3IEBACiAJICogdGhpcyB3aWxsIG9jY3VyIGlmIHRoZSBkYWVtb24gaXMgbm90IHVwLCBzbyB3ZSBqdXN0IHdhcm4KIAkgKiB0aGUgdXNlciBhbmQgd2hlbiB0aGUgZGFlbW9uIGlzIHJlc3RhcnRlZCBpdCB3aWxsIGhhbmRsZSBpdAogCSAqLwotCXJjID0gaXNjc2lfYnJvYWRjYXN0X3NrYihjb25uLT56X3BkdSwgc2tiLCBHRlBfS0VSTkVMKTsKKwlyYyA9IGlzY3NpX2Jyb2FkY2FzdF9za2Ioc2tiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmMgPCAwKQogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiQ2Fubm90IG5vdGlmeSB1c2Vyc3BhY2Ugb2YgIgogCQkJICAic2Vzc2lvbiBkZXN0cnVjdGlvbiBldmVudC4gQ2hlY2sgaXNjc2kgZGFlbW9uXG4iKTsKQEAgLTkzOSw5ICs3NzIsNyBAQAogCXNlc3Npb24gPSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihjb25uLT5kZXYucGFyZW50KTsKIAlzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbik7CiAKLQltZW1wb29sX3pvbmVfY29tcGxldGUoY29ubi0+el9wZHUpOwotCi0Jc2tiID0gbWVtcG9vbF96b25lX2dldF9za2IoY29ubi0+el9wZHUpOworCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9LRVJORUwpOwogCWlmICghc2tiKSB7CiAJCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJDYW5ub3Qgbm90aWZ5IHVzZXJzcGFjZSBvZiAiCiAJCQkgICJzZXNzaW9uIGNyZWF0aW9uIGV2ZW50XG4iKTsKQEAgLTk1OSw3ICs3OTAsNyBAQAogCSAqIHRoaXMgd2lsbCBvY2N1ciBpZiB0aGUgZGFlbW9uIGlzIG5vdCB1cCwgc28gd2UganVzdCB3YXJuCiAJICogdGhlIHVzZXIgYW5kIHdoZW4gdGhlIGRhZW1vbiBpcyByZXN0YXJ0ZWQgaXQgd2lsbCBoYW5kbGUgaXQKIAkgKi8KLQlyYyA9IGlzY3NpX2Jyb2FkY2FzdF9za2IoY29ubi0+el9wZHUsIHNrYiwgR0ZQX0tFUk5FTCk7CisJcmMgPSBpc2NzaV9icm9hZGNhc3Rfc2tiKHNrYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJjIDwgMCkKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgIkNhbm5vdCBub3RpZnkgdXNlcnNwYWNlIG9mICIKIAkJCSAgInNlc3Npb24gY3JlYXRpb24gZXZlbnQuIENoZWNrIGlzY3NpIGRhZW1vblxuIik7CkBAIC0xMjc4LDkgKzExMDksNiBAQAogCQkJCWVyciA9IGlzY3NpX2lmX3NlbmRfcmVwbHkoCiAJCQkJCU5FVExJTktfQ1JFRFMoc2tiKS0+cGlkLCBubGgtPm5sbXNnX3NlcSwKIAkJCQkJbmxoLT5ubG1zZ190eXBlLCAwLCAwLCBldiwgc2l6ZW9mKCpldikpOwotCQkJCWlmIChhdG9taWNfcmVhZCgmel9yZXBseS0+YWxsb2NhdGVkKSA+PQotCQkJCQkJel9yZXBseS0+aGl3YXQpCi0JCQkJCWV2LT5pZmVycm9yID0gLUVOT01FTTsKIAkJCX0gd2hpbGUgKGVyciA8IDAgJiYgZXJyICE9IC1FQ09OTlJFRlVTRUQpOwogCQkJc2tiX3B1bGwoc2tiLCBybGVuKTsKIAkJfQpAQCAtMTU4NCwzMiArMTQxMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV91bnJlZ2lzdGVyX3RyYW5zcG9ydCk7CiAKLXN0YXRpYyBpbnQKLWlzY3NpX3Jjdl9ubF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgbmV0bGlua19ub3RpZnkgKm4gPSBwdHI7Ci0KLQlpZiAoZXZlbnQgPT0gTkVUTElOS19VUkVMRUFTRSAmJgotCSAgICBuLT5wcm90b2NvbCA9PSBORVRMSU5LX0lTQ1NJICYmIG4tPnBpZCkgewotCQlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm47Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJbWVtcG9vbF96b25lX2NvbXBsZXRlKHpfcmVwbHkpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubmxvY2ssIGZsYWdzKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmY29ubmxpc3QsIGNvbm5fbGlzdCkgewotCQkJbWVtcG9vbF96b25lX2NvbXBsZXRlKGNvbm4tPnpfZXJyb3IpOwotCQkJbWVtcG9vbF96b25lX2NvbXBsZXRlKGNvbm4tPnpfcGR1KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25ubG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpc2NzaV9ubF9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbAk9IGlzY3NpX3Jjdl9ubF9ldmVudCwKLX07Ci0KIHN0YXRpYyBfX2luaXQgaW50IGlzY3NpX3RyYW5zcG9ydF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTE2MzMsMjUgKzE0MzUsMTUgQEAKIAlpZiAoZXJyKQogCQlnb3RvIHVucmVnaXN0ZXJfY29ubl9jbGFzczsKIAotCWVyciA9IG5ldGxpbmtfcmVnaXN0ZXJfbm90aWZpZXIoJmlzY3NpX25sX25vdGlmaWVyKTsKLQlpZiAoZXJyKQotCQlnb3RvIHVucmVnaXN0ZXJfc2Vzc2lvbl9jbGFzczsKLQogCW5scyA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0lTQ1NJLCAxLCBpc2NzaV9pZl9yeCwKIAkJCVRISVNfTU9EVUxFKTsKIAlpZiAoIW5scykgewogCQllcnIgPSAtRU5PQlVGUzsKLQkJZ290byB1bnJlZ2lzdGVyX25vdGlmaWVyOworCQlnb3RvIHVucmVnaXN0ZXJfc2Vzc2lvbl9jbGFzczsKIAl9CiAKLQl6X3JlcGx5ID0gbWVtcG9vbF96b25lX2luaXQoWl9NQVhfUkVQTFksCi0JCU5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaXNjc2lfdWV2ZW50KSksIFpfSElXQVRfUkVQTFkpOwotCWlmICh6X3JlcGx5KQotCQlyZXR1cm4gMDsKKwlyZXR1cm4gMDsKIAotCXNvY2tfcmVsZWFzZShubHMtPnNrX3NvY2tldCk7Ci11bnJlZ2lzdGVyX25vdGlmaWVyOgotCW5ldGxpbmtfdW5yZWdpc3Rlcl9ub3RpZmllcigmaXNjc2lfbmxfbm90aWZpZXIpOwogdW5yZWdpc3Rlcl9zZXNzaW9uX2NsYXNzOgogCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9zZXNzaW9uX2NsYXNzKTsKIHVucmVnaXN0ZXJfY29ubl9jbGFzczoKQEAgLTE2NjUsOSArMTQ1Nyw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpc2NzaV90cmFuc3BvcnRfZXhpdCh2b2lkKQogewotCW1lbXBvb2xfem9uZV9kZXN0cm95KHpfcmVwbHkpOwogCXNvY2tfcmVsZWFzZShubHMtPnNrX3NvY2tldCk7Ci0JbmV0bGlua191bnJlZ2lzdGVyX25vdGlmaWVyKCZpc2NzaV9ubF9ub3RpZmllcik7CiAJdHJhbnNwb3J0X2NsYXNzX3VucmVnaXN0ZXIoJmlzY3NpX2Nvbm5lY3Rpb25fY2xhc3MpOwogCXRyYW5zcG9ydF9jbGFzc191bnJlZ2lzdGVyKCZpc2NzaV9zZXNzaW9uX2NsYXNzKTsKIAl0cmFuc3BvcnRfY2xhc3NfdW5yZWdpc3RlcigmaXNjc2lfaG9zdF9jbGFzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKaW5kZXggYjViMGMyYy4uNWMwYjc1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwpAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKaW5kZXggOWYwNzBmMC4uM2ZkZWQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYwpAQCAtOTY0LDkgKzk2NCwxMCBAQAogfTsKIAogc3RhdGljIHZvaWQKLXNwaV9kdl9kZXZpY2Vfd29ya193cmFwcGVyKHZvaWQgKmRhdGEpCitzcGlfZHZfZGV2aWNlX3dvcmtfd3JhcHBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHdvcmtfcXVldWVfd3JhcHBlciAqd3F3ID0gKHN0cnVjdCB3b3JrX3F1ZXVlX3dyYXBwZXIgKilkYXRhOworCXN0cnVjdCB3b3JrX3F1ZXVlX3dyYXBwZXIgKndxdyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd29ya19xdWV1ZV93cmFwcGVyLCB3b3JrKTsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB3cXctPnNkZXY7CiAKIAlrZnJlZSh3cXcpOwpAQCAtMTAwNiw3ICsxMDA3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCUlOSVRfV09SSygmd3F3LT53b3JrLCBzcGlfZHZfZGV2aWNlX3dvcmtfd3JhcHBlciwgd3F3KTsKKwlJTklUX1dPUksoJndxdy0+d29yaywgc3BpX2R2X2RldmljZV93b3JrX3dyYXBwZXIpOwogCXdxdy0+c2RldiA9IHNkZXY7CiAKIAlzY2hlZHVsZV93b3JrKCZ3cXctPndvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfd2FpdF9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV93YWl0X3NjYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTYzNjEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfd2FpdF9zY2FuLmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIHNjc2lfd2FpdF9zY2FuLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmFtZXMgQm90dG9tbGV5IDxKYW1lcy5Cb3R0b21sZXlAU3RlZWxFeWUuY29tPgorICoKKyAqIFRoaXMgaXMgYSBzaW1wbGUgbW9kdWxlIHRvIHdhaXQgdW50aWwgYWxsIHRoZSBhc3luYyBzY2FucyBhcmUKKyAqIGNvbXBsZXRlLiAgVGhlIGlkZWEgaXMgdG8gdXNlIGl0IGluIGluaXRyZC9pbml0cmFtZnMgc2NyaXB0cy4gIFlvdQorICogbW9kcHJvYmUgaXQgYWZ0ZXIgYWxsIHRoZSBtb2Rwcm9iZXMgb2YgdGhlIHJvb3QgU0NTSSBkcml2ZXJzIGFuZCBpdAorICogd2lsbCB3YWl0IHVudGlsIHRoZXkgaGF2ZSBhbGwgZmluaXNoZWQgc2Nhbm5pbmcgdGhlaXIgYnVzc2VzIGJlZm9yZQorICogYWxsb3dpbmcgdGhlIGJvb3QgdG8gcHJvY2VlZAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICJzY3NpX3ByaXYuaCIKKworc3RhdGljIGludCBfX2luaXQgd2FpdF9zY2FuX2luaXQodm9pZCkKK3sKKwlzY3NpX2NvbXBsZXRlX2FzeW5jX3NjYW5zKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3YWl0X3NjYW5fZXhpdCh2b2lkKQoreworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgd2FpdCBmb3Igc2NhbnMiKTsKK01PRFVMRV9BVVRIT1IoIkphbWVzIEJvdHRvbWxleSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitsYXRlX2luaXRjYWxsKHdhaXRfc2Nhbl9pbml0KTsKK21vZHVsZV9leGl0KHdhaXRfc2Nhbl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKaW5kZXggODRmZjIwMy4uOTc4YmZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTg2Myw3ICs4NjMsNyBAQAogICovCiBzdGF0aWMgbG9uZyBzZF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9iZGV2OworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2JkZXY7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOwogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHNjc2lfZGlzayhkaXNrKS0+ZGV2aWNlOwogCkBAIC0xMDUxLDYgKzEwNTEsMTQgQEAKIAkJCQkJCSAgICAgICZzc2hkciwgU0RfVElNRU9VVCwKIAkJCQkJCSAgICAgIFNEX01BWF9SRVRSSUVTKTsKIAorCQkJLyoKKwkJCSAqIElmIHRoZSBkcml2ZSBoYXMgaW5kaWNhdGVkIHRvIHVzIHRoYXQgaXQKKwkJCSAqIGRvZXNuJ3QgaGF2ZSBhbnkgbWVkaWEgaW4gaXQsIGRvbid0IGJvdGhlcgorCQkJICogd2l0aCBhbnkgbW9yZSBwb2xsaW5nLgorCQkJICovCisJCQlpZiAobWVkaWFfbm90X3ByZXNlbnQoc2RrcCwgJnNzaGRyKSkKKwkJCQlyZXR1cm47CisKIAkJCWlmICh0aGVfcmVzdWx0KQogCQkJCXNlbnNlX3ZhbGlkID0gc2NzaV9zZW5zZV92YWxpZCgmc3NoZHIpOwogCQkJcmV0cmllcysrOwpAQCAtMTA1OSwxNCArMTA2Nyw2IEBACiAJCQkgICgoZHJpdmVyX2J5dGUodGhlX3Jlc3VsdCkgJiBEUklWRVJfU0VOU0UpICYmCiAJCQkgIHNlbnNlX3ZhbGlkICYmIHNzaGRyLnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikpKTsKIAotCQkvKgotCQkgKiBJZiB0aGUgZHJpdmUgaGFzIGluZGljYXRlZCB0byB1cyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQotCQkgKiBhbnkgbWVkaWEgaW4gaXQsIGRvbid0IGJvdGhlciB3aXRoIGFueSBvZiB0aGUgcmVzdCBvZgotCQkgKiB0aGlzIGNyYXAuCi0JCSAqLwotCQlpZiAobWVkaWFfbm90X3ByZXNlbnQoc2RrcCwgJnNzaGRyKSkKLQkJCXJldHVybjsKLQogCQlpZiAoKGRyaXZlcl9ieXRlKHRoZV9yZXN1bHQpICYgRFJJVkVSX1NFTlNFKSA9PSAwKSB7CiAJCQkvKiBubyBzZW5zZSwgVFVSIGVpdGhlciBzdWNjZWVkZWQgb3IgZmFpbGVkCiAJCQkgKiB3aXRoIGEgc3RhdHVzIGVycm9yICovCkBAIC0xNDY3LDcgKzE0NjcsNiBAQAogCXJlcyA9IHNkX2RvX21vZGVfc2Vuc2Uoc2RwLCBkYmQsIG1vZGVwYWdlLCBidWZmZXIsIGxlbiwgJmRhdGEsICZzc2hkcik7CiAKIAlpZiAoc2NzaV9zdGF0dXNfaXNfZ29vZChyZXMpKSB7Ci0JCWludCBjdCA9IDA7CiAJCWludCBvZmZzZXQgPSBkYXRhLmhlYWRlcl9sZW5ndGggKyBkYXRhLmJsb2NrX2Rlc2NyaXB0b3JfbGVuZ3RoOwogCiAJCWlmIChvZmZzZXQgPj0gU0RfQlVGX1NJWkUgLSAyKSB7CkBAIC0xNDk2LDExICsxNDk1LDEzIEBACiAJCQlzZGtwLT5EUE9GVUEgPSAwOwogCQl9CiAKLQkJY3QgPSAgc2RrcC0+UkNEICsgMipzZGtwLT5XQ0U7Ci0KLQkJcHJpbnRrKEtFUk5fTk9USUNFICJTQ1NJIGRldmljZSAlczogZHJpdmUgY2FjaGU6ICVzJXNcbiIsCi0JCSAgICAgICBkaXNrbmFtZSwgc2RfY2FjaGVfdHlwZXNbY3RdLAotCQkgICAgICAgc2RrcC0+RFBPRlVBID8gIiB3LyBGVUEiIDogIiIpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNDU0kgZGV2aWNlICVzOiAiCisJCSAgICAgICAid3JpdGUgY2FjaGU6ICVzLCByZWFkIGNhY2hlOiAlcywgJXNcbiIsCisJCSAgICAgICBkaXNrbmFtZSwKKwkJICAgICAgIHNka3AtPldDRSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisJCSAgICAgICBzZGtwLT5SQ0QgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiLAorCQkgICAgICAgc2RrcC0+RFBPRlVBID8gInN1cHBvcnRzIERQTyBhbmQgRlVBIgorCQkgICAgICAgOiAiZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUEiKTsKIAogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnLmMgYi9kcml2ZXJzL3Njc2kvc2cuYwppbmRleCAzZjhiOTMxLi44MWUzYmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2cuYworKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtNjAsNyArNjAsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NDU0lfUFJPQ19GUwogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLXN0YXRpYyBjaGFyICpzZ192ZXJzaW9uX2RhdGUgPSAiMjAwNjA5MjAiOworc3RhdGljIGNoYXIgKnNnX3ZlcnNpb25fZGF0ZSA9ICIyMDA2MTAyNyI7CiAKIHN0YXRpYyBpbnQgc2dfcHJvY19pbml0KHZvaWQpOwogc3RhdGljIHZvaWQgc2dfcHJvY19jbGVhbnVwKHZvaWQpOwpAQCAtNzEwLDEyICs3MTAsMTIgQEAKIAkJCSAgKGludCkgY21uZFswXSwgKGludCkgaHAtPmNtZF9sZW4pKTsKIAogCWlmICgoayA9IHNnX3N0YXJ0X3JlcShzcnApKSkgewotCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfd3JpdGU6IHN0YXJ0X3JlcSBlcnI9JWRcbiIsIGspKTsKKwkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX2NvbW1vbl93cml0ZTogc3RhcnRfcmVxIGVycj0lZFxuIiwgaykpOwogCQlzZ19maW5pc2hfcmVtX3JlcShzcnApOwogCQlyZXR1cm4gazsJLyogcHJvYmFibHkgb3V0IG9mIHNwYWNlIC0tPiBFTk9NRU0gKi8KIAl9CiAJaWYgKChrID0gc2dfd3JpdGVfeGZlcihzcnApKSkgewotCQlTQ1NJX0xPR19USU1FT1VUKDEsIHByaW50aygic2dfd3JpdGU6IHdyaXRlX3hmZXIsIGJhZCBhZGRyZXNzXG4iKSk7CisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ19jb21tb25fd3JpdGU6IHdyaXRlX3hmZXIsIGJhZCBhZGRyZXNzXG4iKSk7CiAJCXNnX2ZpbmlzaF9yZW1fcmVxKHNycCk7CiAJCXJldHVybiBrOwogCX0KQEAgLTc0Niw3ICs3NDYsNyBAQAogCQkJCWhwLT5keGZlcl9sZW4sIHNycC0+ZGF0YS5rX3VzZV9zZywgdGltZW91dCwKIAkJCQlTR19ERUZBVUxUX1JFVFJJRVMsIHNycCwgc2dfY21kX2RvbmUsCiAJCQkJR0ZQX0FUT01JQykpIHsKLQkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX3dyaXRlOiBzY3NpX2V4ZWN1dGVfYXN5bmMgZmFpbGVkXG4iKSk7CisJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZ19jb21tb25fd3JpdGU6IHNjc2lfZXhlY3V0ZV9hc3luYyBmYWlsZWRcbiIpKTsKIAkJLyoKIAkJICogbW9zdCBsaWtlbHkgb3V0IG9mIG1lbSwgYnV0IGNvdWxkIGFsc28gYmUgYSBiYWQgbWFwCiAJCSAqLwpAQCAtMTI4Myw3ICsxMjgzLDcgQEAKIAkJc2dfZmluaXNoX3JlbV9yZXEoc3JwKTsKIAkJc3JwID0gTlVMTDsKIAkJaWYgKE5VTEwgPT0gc2ZwLT5oZWFkcnApIHsKLQkJCVNDU0lfTE9HX1RJTUVPVVQoMSwgcHJpbnRrKCJzZy4uLmJoOiBhbHJlYWR5IGNsb3NlZCwgZmluYWwgY2xlYW51cFxuIikpOworCQkJU0NTSV9MT0dfVElNRU9VVCgxLCBwcmludGsoInNnX2NtZF9kb25lOiBhbHJlYWR5IGNsb3NlZCwgZmluYWwgY2xlYW51cFxuIikpOwogCQkJaWYgKDAgPT0gc2dfcmVtb3ZlX3NmcChzZHAsIHNmcCkpIHsJLyogZGV2aWNlIHN0aWxsIHByZXNlbnQgKi8KIAkJCQlzY3NpX2RldmljZV9wdXQoc2RwLT5kZXZpY2UpOwogCQkJfQpAQCAtMTUxMiwxMiArMTUxMiwxMiBAQAogCQkJCQkJICAgIFBPTExfSFVQKTsKIAkJCQl9CiAJCQl9Ci0JCQlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfZGV0YWNoOiBkZXY9JWQsIGRpcnR5XG4iLCBrKSk7CisJCQlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfcmVtb3ZlOiBkZXY9JWQsIGRpcnR5XG4iLCBrKSk7CiAJCQlpZiAoTlVMTCA9PSBzZHAtPmhlYWRmcCkgewogCQkJCXNnX2Rldl9hcnJba10gPSBOVUxMOwogCQkJfQogCQl9IGVsc2UgewkvKiBub3RoaW5nIGFjdGl2ZSwgc2ltcGxlIGNhc2UgKi8KLQkJCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ19kZXRhY2g6IGRldj0lZFxuIiwgaykpOworCQkJU0NTSV9MT0dfVElNRU9VVCgzLCBwcmludGsoInNnX3JlbW92ZTogZGV2PSVkXG4iLCBrKSk7CiAJCQlzZ19kZXZfYXJyW2tdID0gTlVMTDsKIAkJfQogCQlzZ19ucl9kZXYtLTsKQEAgLTE4NzYsMTQgKzE4NzYsMTUgQEAKIAkJCX0KIAkJfQogCQlzZy0+cGFnZSA9IHA7Ci0JCXNnLT5sZW5ndGggPSByZXRfc3o7CisJCXNnLT5sZW5ndGggPSAocmV0X3N6ID4gbnVtKSA/IG51bSA6IHJldF9zejsKIAotCQlTQ1NJX0xPR19USU1FT1VUKDUsIHByaW50aygic2dfYnVpbGRfYnVpbGQ6IGs9JWQsIGE9MHglcCwgbGVuPSVkXG4iLAotCQkJCSAgaywgcCwgcmV0X3N6KSk7CisJCVNDU0lfTE9HX1RJTUVPVVQoNSwgcHJpbnRrKCJzZ19idWlsZF9pbmRpcmVjdDogaz0lZCwgbnVtPSVkLCAiCisJCQkJICJyZXRfc3o9JWRcbiIsIGssIG51bSwgcmV0X3N6KSk7CiAJfQkJLyogZW5kIG9mIGZvciBsb29wICovCiAKIAlzY2hwLT5rX3VzZV9zZyA9IGs7Ci0JU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoInNnX2J1aWxkX2luZGlyZWN0OiBrX3VzZV9zZz0lZCwgcmVtX3N6PSVkXG4iLCBrLCByZW1fc3opKTsKKwlTQ1NJX0xPR19USU1FT1VUKDUsIHByaW50aygic2dfYnVpbGRfaW5kaXJlY3Q6IGtfdXNlX3NnPSVkLCAiCisJCQkgInJlbV9zej0lZFxuIiwgaywgcmVtX3N6KSk7CiAKIAlzY2hwLT5idWZmbGVuID0gYmxrX3NpemU7CiAJaWYgKHJlbV9zeiA+IDApCS8qIG11c3QgaGF2ZSBmYWlsZWQgKi8KQEAgLTIwMTQsNyArMjAxNSw3IEBACiAJCQlmb3IgKGsgPSAwOyAoayA8IHNjaHAtPmtfdXNlX3NnKSAmJiBzZy0+cGFnZTsKIAkJCSAgICAgKytrLCArK3NnKSB7CiAJCQkJU0NTSV9MT0dfVElNRU9VVCg1LCBwcmludGsoCi0JCQkJICAgICJzZ19yZW1vdmVfc2NhdDogaz0lZCwgYT0weCVwLCBsZW49JWRcbiIsCisJCQkJICAgICJzZ19yZW1vdmVfc2NhdDogaz0lZCwgcGc9MHglcCwgbGVuPSVkXG4iLAogCQkJCSAgICBrLCBzZy0+cGFnZSwgc2ctPmxlbmd0aCkpOwogCQkJCXNnX3BhZ2VfZnJlZShzZy0+cGFnZSwgc2ctPmxlbmd0aCk7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCmluZGV4IGQxMjY4Y2IuLjA1NzhiYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCkBAIC01NDYsNyArNTQ2LDcgQEAKIAlpZiAoIXhhX3Rlc3QpCiAJCXJldHVybiAwOwogCi0JcmF3X3NlY3RvciA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MoMjA0OCwgR0ZQX0tFUk5FTCB8IFNSX0dGUF9ETUEoY2QpKTsKKwlyYXdfc2VjdG9yID0ga21hbGxvYygyMDQ4LCBHRlBfS0VSTkVMIHwgU1JfR0ZQX0RNQShjZCkpOwogCWlmICghcmF3X3NlY3RvcikKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWYgKDAgPT0gc3JfcmVhZF9zZWN0b3IoY2QsIGNkLT5tc19vZmZzZXQgKyAxNiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zcl92ZW5kb3IuYyBiL2RyaXZlcnMvc2NzaS9zcl92ZW5kb3IuYwppbmRleCBhM2U5ZDBmLi40ZWIzZGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3JfdmVuZG9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3NyX3ZlbmRvci5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAkJZGVuc2l0eSA9IChibG9ja2xlbmd0aCA+IDIwNDgpID8gMHg4MSA6IDB4ODM7CiAjZW5kaWYKIAotCWJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJYnVmZmVyID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogCWlmIChjZC0+Y2RpLm1hc2sgJiBDRENfTVVMVElfU0VTU0lPTikKIAkJcmV0dXJuIDA7CiAKLQlidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWJ1ZmZlciA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJaWYgKCFidWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IDNiYWJkYzcuLmUwMTZlMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC05LDcgKzksNyBAQAogICAgU3RldmUgSGlyc2NoLCBBbmRyZWFzIEtvcHBlbmgib2ZlciwgTWljaGFlbCBMZW9kb2x0ZXIsIEV5YWwgTGViZWRpbnNreSwKICAgIE1pY2hhZWwgU2NoYWVmZXIsIEoib3JnIFdldWxlLCBhbmQgRXJpYyBZb3VuZ2RhbGUuCiAKLSAgIENvcHlyaWdodCAxOTkyIC0gMjAwNSBLYWkgTWFraXNhcmEKKyAgIENvcHlyaWdodCAxOTkyIC0gMjAwNiBLYWkgTWFraXNhcmEKICAgIGVtYWlsIEthaS5NYWtpc2FyYUBrb2x1bWJ1cy5maQogCiAgICBTb21lIHNtYWxsIGZvcm1hbCBjaGFuZ2VzIC0gYWViLCA5NTA4MDkKQEAgLTE3LDcgKzE3LDcgQEAKICAgIExhc3QgbW9kaWZpZWQ6IDE4LUpBTi0xOTk4IFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PiBEZXZmcyBzdXBwb3J0CiAgKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgKnZlcnN0ciA9ICIyMDA1MDgzMCI7CitzdGF0aWMgY29uc3QgY2hhciAqdmVyc3RyID0gIjIwMDYxMTA3IjsKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCkBAIC05MjIsNyArOTIyLDcgQEAKIAlzdHJ1Y3Qgc3RfbW9kZWRlZiAqU1RtOwogCXN0cnVjdCBzdF9wYXJ0c3RhdCAqU1RwczsKIAljaGFyICpuYW1lID0gdGFwZV9uYW1lKFNUcCk7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBtb2RlID0gVEFQRV9NT0RFKGlub2RlKTsKIAogCVNUcC0+cmVhZHkgPSBTVF9SRUFEWTsKQEAgLTk5OSw3ICs5OTksNyBAQAogCQkJU1RwLT5taW5fYmxvY2sgPSAoKFNUcC0+YnVmZmVyKS0+Yl9kYXRhWzRdIDw8IDgpIHwKIAkJCSAgICAoU1RwLT5idWZmZXIpLT5iX2RhdGFbNV07CiAJCQlpZiAoIERFQiggZGVidWdnaW5nIHx8ICkgIVNUcC0+aW5pdGVkKQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQlwcmludGsoS0VSTl9JTkZPCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJsb2NrIGxpbWl0cyAlZCAtICVkIGJ5dGVzLlxuIiwgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUcC0+bWluX2Jsb2NrLCBTVHAtPm1heF9ibG9jayk7CiAJCX0gZWxzZSB7CkBAIC0xMTc3LDcgKzExNzcsMTAgQEAKIAkJZ290byBlcnJfb3V0OwogCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spID09IDAgJiYKIAkgICAgcmV0dmFsICE9IENIS1JFU19SRUFEWSkgewotCQlyZXR2YWwgPSAoLUVJTyk7CisJCWlmIChTVHAtPnJlYWR5ID09IE5PX1RBUEUpCisJCQlyZXR2YWwgPSAoLUVOT01FRElVTSk7CisJCWVsc2UKKwkJCXJldHZhbCA9ICgtRUlPKTsKIAkJZ290byBlcnJfb3V0OwogCX0KIAlyZXR1cm4gMDsKQEAgLTEyMjEsNyArMTIyNCw3IEBACiAJfQogCiAJREVCQyggaWYgKFNUcC0+bmJyX3JlcXVlc3RzKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTnVtYmVyIG9mIHIvdyByZXF1ZXN0cyAlZCwgZGlvIHVzZWQgaW4gJWQsIHBhZ2VzICVkICglZCkuXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE51bWJlciBvZiByL3cgcmVxdWVzdHMgJWQsIGRpbyB1c2VkIGluICVkLCBwYWdlcyAlZCAoJWQpLlxuIiwKIAkJICAgICAgIG5hbWUsIFNUcC0+bmJyX3JlcXVlc3RzLCBTVHAtPm5icl9kaW8sIFNUcC0+bmJyX3BhZ2VzLCBTVHAtPm5icl9jb21iaW5hYmxlKSk7CiAKIAlpZiAoU1Rwcy0+cncgPT0gU1RfV1JJVElORyAmJiAhU1RwLT5wb3NfdW5rbm93bikgewpAQCAtNDA1MywxMSArNDA1NiwxMSBAQAogCQkJZ290byBvdXRfZnJlZV90YXBlOwogCX0KIAotCXNkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgU0RwLAorCXNkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCBTRHAsCiAJCSAgICAiQXR0YWNoZWQgc2NzaSB0YXBlICVzXG4iLCB0YXBlX25hbWUodHBudCkpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cnkgZGlyZWN0IGkvbzogJXMgKGFsaWdubWVudCAlZCBCKVxuIiwKLQkgICAgICAgdGFwZV9uYW1lKHRwbnQpLCB0cG50LT50cnlfZGlvID8gInllcyIgOiAibm8iLAotCSAgICAgICBxdWV1ZV9kbWFfYWxpZ25tZW50KFNEcC0+cmVxdWVzdF9xdWV1ZSkgKyAxKTsKKwlzZGV2X3ByaW50ayhLRVJOX0lORk8sIFNEcCwgIiVzOiB0cnkgZGlyZWN0IGkvbzogJXMgKGFsaWdubWVudCAlZCBCKVxuIiwKKwkJICAgIHRhcGVfbmFtZSh0cG50KSwgdHBudC0+dHJ5X2RpbyA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgIHF1ZXVlX2RtYV9hbGlnbm1lbnQoU0RwLT5yZXF1ZXN0X3F1ZXVlKSArIDEpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdGV4LmMgYi9kcml2ZXJzL3Njc2kvc3RleC5jCmluZGV4IDE4NWMyNzAuLmJhNmJjZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdGV4LmMKKysrIGIvZHJpdmVycy9zY3NpL3N0ZXguYwpAQCAtMTEsOCArMTEsNiBAQAogICoJV3JpdHRlbiBCeToKICAqCQlFZCBMaW4gPHByb21pc2VfbGludXhAcHJvbWlzZS5jb20+CiAgKgotICoJVmVyc2lvbjogMy4wLjAuMQotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzcsOSArMzUsOSBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAic3RleCIKLSNkZWZpbmUgU1RfRFJJVkVSX1ZFUlNJT04gIjMuMC4wLjEiCisjZGVmaW5lIFNUX0RSSVZFUl9WRVJTSU9OICIzLjEuMC4xIgogI2RlZmluZSBTVF9WRVJfTUFKT1IgCQkzCi0jZGVmaW5lIFNUX1ZFUl9NSU5PUiAJCTAKKyNkZWZpbmUgU1RfVkVSX01JTk9SIAkJMQogI2RlZmluZSBTVF9PRU0gCQkJMAogI2RlZmluZSBTVF9CVUlMRF9WRVIgCQkxCiAKQEAgLTc2LDggKzc0LDEwIEBACiAJTVVfU1RBVEVfU1RBUlRFRAkJCT0gNCwKIAlNVV9TVEFURV9SRVNFVFRJTkcJCQk9IDUsCiAKLQlNVV9NQVhfREVMQVlfVElNRQkJCT0gMjQwMDAwLAorCU1VX01BWF9ERUxBWQkJCQk9IDEyMCwKIAlNVV9IQU5EU0hBS0VfU0lHTkFUVVJFCQkJPSAweDU1YWFhYTU1LAorCU1VX0hBTkRTSEFLRV9TSUdOQVRVUkVfSEFMRgkJPSAweDVhNWEwMDAwLAorCU1VX0hBUkRfUkVTRVRfV0FJVAkJCT0gMzAwMDAsCiAJSE1VX1BBUlRORVJfVFlQRQkJCT0gMiwKIAogCS8qIGZpcm13YXJlIHJldHVybmVkIHZhbHVlcyAqLwpAQCAtMTIwLDcgKzEyMCw4IEBACiAKIAlzdF9zaGFzdGEJCQkJPSAwLAogCXN0X3ZzYwkJCQkJPSAxLAotCXN0X3lvc2VtaXRlCQkJCT0gMiwKKwlzdF92c2MxCQkJCQk9IDIsCisJc3RfeW9zZW1pdGUJCQkJPSAzLAogCiAJUEFTU1RIUlVfUkVRX1RZUEUJCQk9IDB4MDAwMDAwMDEsCiAJUEFTU1RIUlVfUkVRX05PX1dBS0VVUAkJCT0gMHgwMDAwMDEwMCwKQEAgLTE1MCw2ICsxNTEsOCBAQAogCU1HVF9DTURfU0lHTkFUVVJFCQkJPSAweGJhLAogCiAJSU5RVUlSWV9FVlBECQkJCT0gMHgwMSwKKworCVNUX0FERElUSU9OQUxfTUVNCQkJPSAweDIwMDAwMCwKIH07CiAKIC8qIFNDU0kgaW5xdWlyeSBkYXRhICovCkBAIC0yMTEsNyArMjE0LDkgQEAKIAlfX2xlMzIgcGFydG5lcl92ZXJfbWlub3I7CiAJX19sZTMyIHBhcnRuZXJfdmVyX29lbTsKIAlfX2xlMzIgcGFydG5lcl92ZXJfYnVpbGQ7Ci0JdTMyIHJlc2VydmVkMVs0XTsKKwlfX2xlMzIgZXh0cmFfb2Zmc2V0OwkvKiBORVcgKi8KKwlfX2xlMzIgZXh0cmFfc2l6ZTsJLyogTkVXICovCisJdTMyIHJlc2VydmVkMVsyXTsKIH07CiAKIHN0cnVjdCByZXFfbXNnIHsKQEAgLTMwMiw2ICszMDcsNyBAQAogCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOwkvKiBpb21hcHBlZCBQQ0kgbWVtb3J5IHNwYWNlICovCiAJdm9pZCAqZG1hX21lbTsKIAlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisJc2l6ZV90IGRtYV9zaXplOwogCiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKQEAgLTUwNyw2ICs1MTMsNyBAQAogCXNpemVfdCBjb3VudCA9IHNpemVvZihzdHJ1Y3Qgc3RfZnJhbWUpOwogCiAJcCA9IGhiYS0+Y29weV9idWZmZXI7CisJc3RleF9pbnRlcm5hbF9jb3B5KGNjYi0+Y21kLCBwLCAmY291bnQsIGNjYi0+c2dfY291bnQsIFNUX0ZST01fQ01EKTsKIAltZW1zZXQocC0+YmFzZSwgMCwgc2l6ZW9mKHUzMikqNik7CiAJKih1bnNpZ25lZCBsb25nICopKHAtPmJhc2UpID0gcGNpX3Jlc291cmNlX3N0YXJ0KGhiYS0+cGRldiwgMCk7CiAJcC0+cm9tX2FkZHIgPSAwOwpAQCAtOTAxLDI3ICs5MDgsMzQgQEAKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBoYmEtPm1taW9fYmFzZTsKIAlzdHJ1Y3QgaGFuZHNoYWtlX2ZyYW1lICpoOwogCWRtYV9hZGRyX3Qgc3RhdHVzX3BoeXM7Ci0JaW50IGk7CisJdTMyIGRhdGE7CisJdW5zaWduZWQgbG9uZyBiZWZvcmU7CiAKIAlpZiAocmVhZGwoYmFzZSArIE9NUjApICE9IE1VX0hBTkRTSEFLRV9TSUdOQVRVUkUpIHsKIAkJd3JpdGVsKE1VX0lOQk9VTkRfRE9PUkJFTExfSEFORFNIQUtFLCBiYXNlICsgSURCTCk7CiAJCXJlYWRsKGJhc2UgKyBJREJMKTsKLQkJZm9yIChpID0gMDsgcmVhZGwoYmFzZSArIE9NUjApICE9IE1VX0hBTkRTSEFLRV9TSUdOQVRVUkUKLQkJCSYmIGkgPCBNVV9NQVhfREVMQVlfVElNRTsgaSsrKSB7CisJCWJlZm9yZSA9IGppZmZpZXM7CisJCXdoaWxlIChyZWFkbChiYXNlICsgT01SMCkgIT0gTVVfSEFORFNIQUtFX1NJR05BVFVSRSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgYmVmb3JlICsgTVVfTUFYX0RFTEFZICogSFopKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkJCSIoJXMpOiBubyBoYW5kc2hha2Ugc2lnbmF0dXJlXG4iLAorCQkJCQlwY2lfbmFtZShoYmEtPnBkZXYpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CiAJCQlybWIoKTsKIAkJCW1zbGVlcCgxKTsKIAkJfQotCi0JCWlmIChpID09IE1VX01BWF9ERUxBWV9USU1FKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKLQkJCQkiKCVzKTogbm8gaGFuZHNoYWtlIHNpZ25hdHVyZVxuIiwKLQkJCQlwY2lfbmFtZShoYmEtPnBkZXYpKTsKLQkJCXJldHVybiAtMTsKLQkJfQogCX0KIAogCXVkZWxheSgxMCk7CiAKKwlkYXRhID0gcmVhZGwoYmFzZSArIE9NUjEpOworCWlmICgoZGF0YSAmIDB4ZmZmZjAwMDApID09IE1VX0hBTkRTSEFLRV9TSUdOQVRVUkVfSEFMRikgeworCQlkYXRhICY9IDB4MDAwMGZmZmY7CisJCWlmIChoYmEtPmhvc3QtPmNhbl9xdWV1ZSA+IGRhdGEpCisJCQloYmEtPmhvc3QtPmNhbl9xdWV1ZSA9IGRhdGE7CisJfQorCiAJaCA9IChzdHJ1Y3QgaGFuZHNoYWtlX2ZyYW1lICopKGhiYS0+ZG1hX21lbSArIE1VX1JFUV9CVUZGRVJfU0laRSk7CiAJaC0+cmJfcGh5ID0gY3B1X3RvX2xlMzIoaGJhLT5kbWFfaGFuZGxlKTsKIAloLT5yYl9waHlfaGkgPSBjcHVfdG9fbGUzMigoaGJhLT5kbWFfaGFuZGxlID4+IDE2KSA+PiAxNik7CkBAIC05MzEsNiArOTQ1LDExIEBACiAJaC0+c3RhdHVzX2NudCA9IGNwdV90b19sZTE2KE1VX1NUQVRVU19DT1VOVCk7CiAJc3RleF9nZXR0aW1lKCZoLT5ob3N0dGltZSk7CiAJaC0+cGFydG5lcl90eXBlID0gSE1VX1BBUlRORVJfVFlQRTsKKwlpZiAoaGJhLT5kbWFfc2l6ZSA+IFNURVhfQlVGRkVSX1NJWkUpIHsKKwkJaC0+ZXh0cmFfb2Zmc2V0ID0gY3B1X3RvX2xlMzIoU1RFWF9CVUZGRVJfU0laRSk7CisJCWgtPmV4dHJhX3NpemUgPSBjcHVfdG9fbGUzMihTVF9BRERJVElPTkFMX01FTSk7CisJfSBlbHNlCisJCWgtPmV4dHJhX29mZnNldCA9IGgtPmV4dHJhX3NpemUgPSAwOwogCiAJc3RhdHVzX3BoeXMgPSBoYmEtPmRtYV9oYW5kbGUgKyBNVV9SRVFfQlVGRkVSX1NJWkU7CiAJd3JpdGVsKHN0YXR1c19waHlzLCBiYXNlICsgSU1SMCk7CkBAIC05NDQsMTkgKzk2MywxOCBAQAogCXJlYWRsKGJhc2UgKyBJREJMKTsgLyogZmx1c2ggKi8KIAogCXVkZWxheSgxMCk7Ci0JZm9yIChpID0gMDsgcmVhZGwoYmFzZSArIE9NUjApICE9IE1VX0hBTkRTSEFLRV9TSUdOQVRVUkUKLQkJJiYgaSA8IE1VX01BWF9ERUxBWV9USU1FOyBpKyspIHsKKwliZWZvcmUgPSBqaWZmaWVzOworCXdoaWxlIChyZWFkbChiYXNlICsgT01SMCkgIT0gTVVfSEFORFNIQUtFX1NJR05BVFVSRSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBiZWZvcmUgKyBNVV9NQVhfREVMQVkgKiBIWikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJCSIoJXMpOiBubyBzaWduYXR1cmUgYWZ0ZXIgaGFuZHNoYWtlIGZyYW1lXG4iLAorCQkJCXBjaV9uYW1lKGhiYS0+cGRldikpOworCQkJcmV0dXJuIC0xOworCQl9CiAJCXJtYigpOwogCQltc2xlZXAoMSk7CiAJfQogCi0JaWYgKGkgPT0gTVVfTUFYX0RFTEFZX1RJTUUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCi0JCQkiKCVzKTogbm8gc2lnbmF0dXJlIGFmdGVyIGhhbmRzaGFrZSBmcmFtZVxuIiwKLQkJCXBjaV9uYW1lKGhiYS0+cGRldikpOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJd3JpdGVsKDAsIGJhc2UgKyBJTVIwKTsKIAlyZWFkbChiYXNlICsgSU1SMCk7CiAJd3JpdGVsKDAsIGJhc2UgKyBPTVIwKTsKQEAgLTEwMzgsOSArMTA1Niw5IEBACiAJcGNpX2JjdGwgJj0gflBDSV9CUklER0VfQ1RMX0JVU19SRVNFVDsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnVzLT5zZWxmLCBQQ0lfQlJJREdFX0NPTlRST0wsIHBjaV9iY3RsKTsKIAotCWZvciAoaSA9IDA7IGkgPCBNVV9NQVhfREVMQVlfVElNRTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1VX0hBUkRfUkVTRVRfV0FJVDsgaSsrKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGhiYS0+cGRldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKLQkJaWYgKHBjaV9jbWQgJiBQQ0lfQ09NTUFORF9NQVNURVIpCisJCWlmIChwY2lfY21kICE9IDB4ZmZmZiAmJiAocGNpX2NtZCAmIFBDSV9DT01NQU5EX01BU1RFUikpCiAJCQlicmVhazsKIAkJbXNsZWVwKDEpOwogCX0KQEAgLTExMDAsMTggKzExMTgsMTggQEAKIHN0YXRpYyBpbnQgc3RleF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQogewotCWludCBoZWFkcyA9IDI1NSwgc2VjdG9ycyA9IDYzLCBjeWxpbmRlcnM7CisJaW50IGhlYWRzID0gMjU1LCBzZWN0b3JzID0gNjM7CiAKIAlpZiAoY2FwYWNpdHkgPCAweDIwMDAwMCkgewogCQloZWFkcyA9IDY0OwogCQlzZWN0b3JzID0gMzI7CiAJfQogCi0JY3lsaW5kZXJzID0gc2VjdG9yX2RpdihjYXBhY2l0eSwgaGVhZHMgKiBzZWN0b3JzKTsKKwlzZWN0b3JfZGl2KGNhcGFjaXR5LCBoZWFkcyAqIHNlY3RvcnMpOwogCiAJZ2VvbVswXSA9IGhlYWRzOwogCWdlb21bMV0gPSBzZWN0b3JzOwotCWdlb21bMl0gPSBjeWxpbmRlcnM7CisJZ2VvbVsyXSA9IGNhcGFjaXR5OwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTkzLDggKzEyMTEsMTMgQEAKIAkJZ290byBvdXRfaW91bm1hcDsKIAl9CiAKKwloYmEtPmNhcmR0eXBlID0gKHVuc2lnbmVkIGludCkgaWQtPmRyaXZlcl9kYXRhOworCWlmIChoYmEtPmNhcmR0eXBlID09IHN0X3ZzYyAmJiAocGRldi0+c3Vic3lzdGVtX2RldmljZSAmIDB4ZikgPT0gMHgxKQorCQloYmEtPmNhcmR0eXBlID0gc3RfdnNjMTsKKwloYmEtPmRtYV9zaXplID0gKGhiYS0+Y2FyZHR5cGUgPT0gc3RfdnNjMSkgPworCQkoU1RFWF9CVUZGRVJfU0laRSArIFNUX0FERElUSU9OQUxfTUVNKSA6IChTVEVYX0JVRkZFUl9TSVpFKTsKIAloYmEtPmRtYV9tZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKLQkJU1RFWF9CVUZGRVJfU0laRSwgJmhiYS0+ZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJCWhiYS0+ZG1hX3NpemUsICZoYmEtPmRtYV9oYW5kbGUsIEdGUF9LRVJORUwpOwogCWlmICghaGJhLT5kbWFfbWVtKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogZG1hIG1lbSBhbGxvYyBmYWlsZWRcbiIsCkBAIC0xMjA3LDggKzEyMzAsNiBAQAogCWhiYS0+Y29weV9idWZmZXIgPSBoYmEtPmRtYV9tZW0gKyBNVV9CVUZGRVJfU0laRTsKIAloYmEtPm11X3N0YXR1cyA9IE1VX1NUQVRFX1NUQVJUSU5HOwogCi0JaGJhLT5jYXJkdHlwZSA9ICh1bnNpZ25lZCBpbnQpIGlkLT5kcml2ZXJfZGF0YTsKLQogCS8qIGZpcm13YXJlIHVzZXMgaWQvbHVuIHBhaXIgZm9yIGEgbG9naWNhbCBkcml2ZSwgYnV0IGx1biB3b3VsZCBiZQogCSAgIGFsd2F5cyAwIGlmIENPTkZJR19TQ1NJX01VTFRJX0xVTiBub3QgY29uZmlndXJlZCwgc28gd2UgdXNlCiAJICAgY2hhbm5lbCB0byBtYXAgbHVuIGhlcmUgKi8KQEAgLTEyMzMsNyArMTI1NCw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfZnJlZV9pcnE7CiAKLQllcnIgPSBzY3NpX2luaXRfc2hhcmVkX3RhZ19tYXAoaG9zdCwgU1RfQ0FOX1FVRVVFKTsKKwllcnIgPSBzY3NpX2luaXRfc2hhcmVkX3RhZ19tYXAoaG9zdCwgaG9zdC0+Y2FuX3F1ZXVlKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiKCVzKTogaW5pdCBzaGFyZWQgcXVldWUgZmFpbGVkXG4iLAogCQkJcGNpX25hbWUocGRldikpOwpAQCAtMTI1Niw3ICsxMjc3LDcgQEAKIG91dF9mcmVlX2lycToKIAlmcmVlX2lycShwZGV2LT5pcnEsIGhiYSk7CiBvdXRfcGNpX2ZyZWU6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgU1RFWF9CVUZGRVJfU0laRSwKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBoYmEtPmRtYV9zaXplLAogCQkJICBoYmEtPmRtYV9tZW0sIGhiYS0+ZG1hX2hhbmRsZSk7CiBvdXRfaW91bm1hcDoKIAlpb3VubWFwKGhiYS0+bW1pb19iYXNlKTsKQEAgLTEzMTcsNyArMTMzOCw3IEBACiAKIAlwY2lfcmVsZWFzZV9yZWdpb25zKGhiYS0+cGRldik7CiAKLQlkbWFfZnJlZV9jb2hlcmVudCgmaGJhLT5wZGV2LT5kZXYsIFNURVhfQlVGRkVSX1NJWkUsCisJZG1hX2ZyZWVfY29oZXJlbnQoJmhiYS0+cGRldi0+ZGV2LCBoYmEtPmRtYV9zaXplLAogCQkJICBoYmEtPmRtYV9tZW0sIGhiYS0+ZG1hX2hhbmRsZSk7CiB9CiAKQEAgLTEzNDYsMTUgKzEzNjcsMzIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN0ZXhfcGNpX3RibFtdID0gewotCXsgMHgxMDVhLCAweDgzNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3NoYXN0YSB9LAotCXsgMHgxMDVhLCAweGMzNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3NoYXN0YSB9LAotCXsgMHgxMDVhLCAweGYzNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3NoYXN0YSB9LAotCXsgMHgxMDVhLCAweDQzMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3NoYXN0YSB9LAotCXsgMHgxMDVhLCAweDQzMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3NoYXN0YSB9LAotCXsgMHgxMDVhLCAweDgzMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3NoYXN0YSB9LAotCXsgMHgxMDVhLCAweDgzMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3NoYXN0YSB9LAotCXsgMHgxNzI1LCAweDcyNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3ZzYyB9LAotCXsgMHgxMDVhLCAweDg2NTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHN0X3lvc2VtaXRlIH0sCisJLyogc3Rfc2hhc3RhICovCisJeyAweDEwNWEsIDB4ODM1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJc3Rfc2hhc3RhIH0sIC8qIFN1cGVyVHJhayBFWDgzNTAvODMwMC8xNjM1MC8xNjMwMCAqLworCXsgMHgxMDVhLCAweGMzNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXN0X3NoYXN0YSB9LCAvKiBTdXBlclRyYWsgRVgxMjM1MCAqLworCXsgMHgxMDVhLCAweDQzMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXN0X3NoYXN0YSB9LCAvKiBTdXBlclRyYWsgRVg0MzUwICovCisJeyAweDEwNWEsIDB4ZTM1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJc3Rfc2hhc3RhIH0sIC8qIFN1cGVyVHJhayBFWDI0MzUwICovCisKKwkvKiBzdF92c2MgKi8KKwl7IDB4MTA1YSwgMHg3MjUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBzdF92c2MgfSwKKworCS8qIHN0X3lvc2VtaXRlICovCisJeyAweDEwNWEsIDB4ODY1MCwgUENJX0FOWV9JRCwgMHg0NjAwLCAwLCAwLAorCQlzdF95b3NlbWl0ZSB9LCAvKiBTdXBlclRyYWsgRVg0NjUwICovCisJeyAweDEwNWEsIDB4ODY1MCwgUENJX0FOWV9JRCwgMHg0NjEwLCAwLCAwLAorCQlzdF95b3NlbWl0ZSB9LCAvKiBTdXBlclRyYWsgRVg0NjUwbyAqLworCXsgMHgxMDVhLCAweDg2NTAsIFBDSV9BTllfSUQsIDB4ODYwMCwgMCwgMCwKKwkJc3RfeW9zZW1pdGUgfSwgLyogU3VwZXJUcmFrIEVYODY1MEVMICovCisJeyAweDEwNWEsIDB4ODY1MCwgUENJX0FOWV9JRCwgMHg4NjAxLCAwLCAwLAorCQlzdF95b3NlbWl0ZSB9LCAvKiBTdXBlclRyYWsgRVg4NjUwICovCisJeyAweDEwNWEsIDB4ODY1MCwgUENJX0FOWV9JRCwgMHg4NjAyLCAwLCAwLAorCQlzdF95b3NlbWl0ZSB9LCAvKiBTdXBlclRyYWsgRVg4NjU0ICovCisJeyAweDEwNWEsIDB4ODY1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJc3RfeW9zZW1pdGUgfSwgLyogZ2VuZXJpYyBzdF95b3NlbWl0ZSAqLwogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzdGV4X3BjaV90YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bjNfTkNSNTM4MC5jIGIvZHJpdmVycy9zY3NpL3N1bjNfTkNSNTM4MC5jCmluZGV4IDVlYzVhZjguLjQzZjViNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdW4zX05DUjUzODAuYworKysgYi9kcml2ZXJzL3Njc2kvc3VuM19OQ1I1MzgwLmMKQEAgLTI2Niw4ICsyNjYsOCBAQAogCShzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqKShpbiktPmhvc3RkYXRhCiAjZGVmaW5lCUhPU1REQVRBKGluKSAoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopKGluKS0+aG9zdGRhdGEpCiAKLSNkZWZpbmUJTkVYVChjbWQpCSgoU2NzaV9DbW5kICopKChjbWQpLT5ob3N0X3NjcmliYmxlKSkKLSNkZWZpbmUJTkVYVEFERFIoY21kKQkoKFNjc2lfQ21uZCAqKikmKChjbWQpLT5ob3N0X3NjcmliYmxlKSkKKyNkZWZpbmUJTkVYVChjbWQpCSgoc3RydWN0IHNjc2lfY21uZCAqKSgoY21kKS0+aG9zdF9zY3JpYmJsZSkpCisjZGVmaW5lCU5FWFRBRERSKGNtZCkJKChzdHJ1Y3Qgc2NzaV9jbW5kICoqKSYoKGNtZCktPmhvc3Rfc2NyaWJibGUpKQogCiAjZGVmaW5lCUhPU1ROTwkJaW5zdGFuY2UtPmhvc3Rfbm8KICNkZWZpbmUJSF9OTyhjbWQpCShjbWQpLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm8KQEAgLTM2MCw3ICszNjAsNyBAQAogICogY29uZGl0aW9ucy4KICAqLyAKIAotc3RhdGljIGludCBpc19sdW5fYnVzeSggU2NzaV9DbW5kICpjbWQsIGludCBzaG91bGRfYmVfdGFnZ2VkICkKK3N0YXRpYyBpbnQgaXNfbHVuX2J1c3koc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgc2hvdWxkX2JlX3RhZ2dlZCkKIHsKICAgICBTRVRVUF9IT1NUREFUQShjbWQtPmRldmljZS0+aG9zdCk7CiAKQEAgLTM4NCw3ICszODQsNyBAQAogICogdW50YWdnZWQuCiAgKi8KIAotc3RhdGljIHZvaWQgY21kX2dldF90YWcoIFNjc2lfQ21uZCAqY21kLCBpbnQgc2hvdWxkX2JlX3RhZ2dlZCApCitzdGF0aWMgdm9pZCBjbWRfZ2V0X3RhZyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBzaG91bGRfYmVfdGFnZ2VkKQogewogICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKIApAQCAtNDE2LDcgKzQxNiw3IEBACiAgKiB1bmxvY2sgdGhlIExVTi4KICAqLwogCi1zdGF0aWMgdm9pZCBjbWRfZnJlZV90YWcoIFNjc2lfQ21uZCAqY21kICkKK3N0YXRpYyB2b2lkIGNtZF9mcmVlX3RhZyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAgICAgU0VUVVBfSE9TVERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOwogCkBAIC00NjAsMTggKzQ2MCwxOCBAQAogCiAKIC8qCi0gKiBGdW5jdGlvbjogdm9pZCBtZXJnZV9jb250aWd1b3VzX2J1ZmZlcnMoIFNjc2lfQ21uZCAqY21kICkKKyAqIEZ1bmN0aW9uOiB2b2lkIG1lcmdlX2NvbnRpZ3VvdXNfYnVmZmVycyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiAgKgogICogUHVycG9zZTogVHJ5IHRvIG1lcmdlIHNldmVyYWwgc2NhdHRlci1nYXRoZXIgcmVxdWVzdHMgaW50byBvbmUgRE1BCiAgKiAgICB0cmFuc2Zlci4gVGhpcyBpcyBwb3NzaWJsZSBpZiB0aGUgc2NhdHRlciBidWZmZXJzIGxpZSBvbgogICogICAgcGh5c2ljYWwgY29udGlndW91cyBhZGRyZXNzZXMuCiAgKgotICogUGFyYW1ldGVyczogU2NzaV9DbW5kICpjbWQKKyAqIFBhcmFtZXRlcnM6IHN0cnVjdCBzY3NpX2NtbmQgKmNtZAogICogICAgVGhlIGNvbW1hbmQgdG8gd29yayBvbi4gVGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyJ3MgZGF0YSBhcmUKICAqICAgIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSB0cmFuc2ZlcmVkIGludG8gcHRyL3RoaXNfcmVzaWR1YWwuCiAgKi8KIAotc3RhdGljIHZvaWQgbWVyZ2VfY29udGlndW91c19idWZmZXJzKCBTY3NpX0NtbmQgKmNtZCApCitzdGF0aWMgdm9pZCBtZXJnZV9jb250aWd1b3VzX2J1ZmZlcnMoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogICAgIHVuc2lnbmVkIGxvbmcgZW5kYWRkcjsKICNpZiAoTkRFQlVHICYgTkRFQlVHX01FUkdJTkcpCkBAIC01MDEsMTUgKzUwMSwxNSBAQAogfQogCiAvKgotICogRnVuY3Rpb24gOiB2b2lkIGluaXRpYWxpemVfU0NwKFNjc2lfQ21uZCAqY21kKQorICogRnVuY3Rpb24gOiB2b2lkIGluaXRpYWxpemVfU0NwKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKICAqCiAgKiBQdXJwb3NlIDogaW5pdGlhbGl6ZSB0aGUgc2F2ZWQgZGF0YSBwb2ludGVycyBmb3IgY21kIHRvIHBvaW50IHRvIHRoZSAKICAqCXN0YXJ0IG9mIHRoZSBidWZmZXIuCiAgKgotICogSW5wdXRzIDogY21kIC0gU2NzaV9DbW5kIHN0cnVjdHVyZSB0byBoYXZlIHBvaW50ZXJzIHJlc2V0LgorICogSW5wdXRzIDogY21kIC0gc3RydWN0IHNjc2lfY21uZCBzdHJ1Y3R1cmUgdG8gaGF2ZSBwb2ludGVycyByZXNldC4KICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGluaXRpYWxpemVfU0NwKFNjc2lfQ21uZCAqY21kKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBpbml0aWFsaXplX1NDcChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAgICAgLyogCiAgICAgICogSW5pdGlhbGl6ZSB0aGUgU2NzaSBQb2ludGVyIGZpZWxkIHNvIHRoYXQgYWxsIG9mIHRoZSBjb21tYW5kcyBpbiB0aGUgCkBAIC03NTMsMTQgKzc1MywxNSBAQAogICBkbyB7IGlmIChwb3MgKyBzdHJsZW4oZm10KSArIDIwIC8qIHNsb3AgKi8gPCBidWZmZXIgKyBsZW5ndGgpIFwKIAkgcG9zICs9IHNwcmludGYocG9zLCBmbXQgLCAjIyBhcmdzKTsgfSB3aGlsZSgwKQogc3RhdGljCi1jaGFyICpscHJpbnRfU2NzaV9DbW5kIChTY3NpX0NtbmQgKmNtZCwgY2hhciAqcG9zLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpOworY2hhciAqbHByaW50X1Njc2lfQ21uZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLAorCQkgICAgICAgaW50IGxlbmd0aCk7CiAKLXN0YXRpYyBpbnQgTkNSNTM4MF9wcm9jX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKLQkJICAgICAgIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQorc3RhdGljIGludCBOQ1I1MzgwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgY2hhciAqYnVmZmVyLAorCQkJICAgICBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KQogewogICAgIGNoYXIgKnBvcyA9IGJ1ZmZlcjsKICAgICBzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGE7Ci0gICAgU2NzaV9DbW5kICpwdHI7CisgICAgc3RydWN0IHNjc2lfY21uZCAqcHRyOwogICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAgb2ZmX3QgYmVnaW4gPSAwOwogI2RlZmluZSBjaGVja19vZmZzZXQoKQkJCQlcCkBAIC03ODQsMTggKzc4NSwxOSBAQAogICAgIGlmICghaG9zdGRhdGEtPmNvbm5lY3RlZCkKIAlTUFJJTlRGKCJzY3NpJWQ6IG5vIGN1cnJlbnRseSBjb25uZWN0ZWQgY29tbWFuZFxuIiwgSE9TVE5PKTsKICAgICBlbHNlCi0JcG9zID0gbHByaW50X1Njc2lfQ21uZCAoKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkLAorCXBvcyA9IGxwcmludF9TY3NpX0NtbmQgKChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5jb25uZWN0ZWQsCiAJCQkJcG9zLCBidWZmZXIsIGxlbmd0aCk7CiAgICAgU1BSSU5URigic2NzaSVkOiBpc3N1ZV9xdWV1ZVxuIiwgSE9TVE5PKTsKICAgICBjaGVja19vZmZzZXQoKTsKLSAgICBmb3IgKHB0ciA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOyBwdHI7IHB0ciA9IE5FWFQocHRyKSkgeworICAgIGZvciAocHRyID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlOyBwdHI7IHB0ciA9IE5FWFQocHRyKSkKKyAgICB7CiAJcG9zID0gbHByaW50X1Njc2lfQ21uZCAocHRyLCBwb3MsIGJ1ZmZlciwgbGVuZ3RoKTsKIAljaGVja19vZmZzZXQoKTsKICAgICB9CiAKICAgICBTUFJJTlRGKCJzY3NpJWQ6IGRpc2Nvbm5lY3RlZF9xdWV1ZVxuIiwgSE9TVE5PKTsKICAgICBjaGVja19vZmZzZXQoKTsKLSAgICBmb3IgKHB0ciA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgcHRyOworICAgIGZvciAocHRyID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgcHRyOwogCSBwdHIgPSBORVhUKHB0cikpIHsKIAlwb3MgPSBscHJpbnRfU2NzaV9DbW5kIChwdHIsIHBvcywgYnVmZmVyLCBsZW5ndGgpOwogCWNoZWNrX29mZnNldCgpOwpAQCAtODEwLDggKzgxMiw4IEBACiAgICAgcmV0dXJuIGxlbmd0aDsKIH0KIAotc3RhdGljIGNoYXIgKgotbHByaW50X1Njc2lfQ21uZCAoU2NzaV9DbW5kICpjbWQsIGNoYXIgKnBvcywgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQorc3RhdGljIGNoYXIgKmxwcmludF9TY3NpX0NtbmQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBjaGFyICpwb3MsIGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgIGludCBsZW5ndGgpCiB7CiAgICAgaW50IGksIHM7CiAgICAgdW5zaWduZWQgY2hhciAqY29tbWFuZDsKQEAgLTg4OCw4ICs4OTAsOCBAQAogfQogCiAvKiAKLSAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfcXVldWVfY29tbWFuZCAoU2NzaV9DbW5kICpjbWQsIAotICoJdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkgCisgKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3F1ZXVlX2NvbW1hbmQgKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKyAqCXZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogICoKICAqIFB1cnBvc2UgOiAgZW5xdWV1ZXMgYSBTQ1NJIGNvbW1hbmQKICAqCkBAIC05MDYsMTAgKzkwOCwxMSBAQAogICovCiAKIC8qIE9ubHkgbWFrZSBzdGF0aWMgaWYgYSB3cmFwcGVyIGZ1bmN0aW9uIGlzIHVzZWQgKi8KLXN0YXRpYyBpbnQgTkNSNTM4MF9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3N0YXRpYyBpbnQgTkNSNTM4MF9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7CiAgICAgU0VUVVBfSE9TVERBVEEoY21kLT5kZXZpY2UtPmhvc3QpOwotICAgIFNjc2lfQ21uZCAqdG1wOworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnRtcDsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAjaWYgKE5ERUJVRyAmIE5ERUJVR19OT19XUklURSkKQEAgLTk5MCw3ICs5OTMsNyBAQAogCU5FWFQoY21kKSA9IGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKIAlob3N0ZGF0YS0+aXNzdWVfcXVldWUgPSBjbWQ7CiAgICAgfSBlbHNlIHsKLQlmb3IgKHRtcCA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+aXNzdWVfcXVldWU7CisJZm9yICh0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKWhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKIAkgICAgIE5FWFQodG1wKTsgdG1wID0gTkVYVCh0bXApKQogCSAgICA7CiAJTElTVChjbWQsIHRtcCk7CkBAIC0xMDMwLDcgKzEwMzMsNyBAQAogICAgIAogc3RhdGljIHZvaWQgTkNSNTM4MF9tYWluICh2b2lkICpibCkKIHsKLSAgICBTY3NpX0NtbmQgKnRtcCwgKnByZXY7CisgICAgc3RydWN0IHNjc2lfY21uZCAqdG1wLCAqcHJldjsKICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGZpcnN0X2luc3RhbmNlOwogICAgIHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICpob3N0ZGF0YSA9IEhPU1REQVRBKGluc3RhbmNlKTsKICAgICBpbnQgZG9uZTsKQEAgLTEwNzMsMTIgKzEwNzYsMTIgQEAKIAkgICAgICogZm9yIGEgdGFyZ2V0IHRoYXQncyBub3QgYnVzeS4KIAkgICAgICovCiAjaWYgKE5ERUJVRyAmIE5ERUJVR19MSVNUUykKLQkgICAgZm9yICh0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSwgcHJldiA9IE5VTEw7CisJICAgIGZvciAodG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlLCBwcmV2ID0gTlVMTDsKIAkJIHRtcCAmJiAodG1wICE9IHByZXYpOyBwcmV2ID0gdG1wLCB0bXAgPSBORVhUKHRtcCkpCiAJCTsKIAkgICAgaWYgKCh0bXAgPT0gcHJldikgJiYgdG1wKSBwcmludGsoIiBMT09QXG4iKTsvKiBlbHNlIHByaW50aygiXG4iKTsqLwogI2VuZGlmCi0JICAgIGZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWUsIAorCSAgICBmb3IgKHRtcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSwKIAkJIHByZXYgPSBOVUxMOyB0bXA7IHByZXYgPSB0bXAsIHRtcCA9IE5FWFQodG1wKSApIHsKIAogI2lmIChOREVCVUcgJiBOREVCVUdfTElTVFMpCkBAIC0xMjY4LDcgKzEyNzEsNyBAQAogCU5DUl9QUklOVChOREVCVUdfSU5UUik7CiAJaWYgKChOQ1I1MzgwX3JlYWQoU1RBVFVTX1JFRykgJiAoU1JfU0VMfFNSX0lPKSkgPT0gKFNSX1NFTHxTUl9JTykpIHsKIAkgICAgZG9uZSA9IDA7Ci0JICAgIEVOQUJMRV9JUlEoKTsKKy8vCSAgICBFTkFCTEVfSVJRKCk7CiAJICAgIElOVF9QUklOVEsoInNjc2klZDogU0VMIGludGVycnVwdFxuIiwgSE9TVE5PKTsKIAkgICAgTkNSNTM4MF9yZXNlbGVjdChpbnN0YW5jZSk7CiAJICAgICh2b2lkKSBOQ1I1MzgwX3JlYWQoUkVTRVRfUEFSSVRZX0lOVEVSUlVQVF9SRUcpOwpAQCAtMTMwMSw3ICsxMzA0LDcgQEAKIAkJSU5UX1BSSU5USygic2NzaSVkOiBQSEFTRSBNSVNNIG9yIEVPUCBpbnRlcnJ1cHRcbiIsIEhPU1ROTyk7CiAJCU5DUjUzODBfZG1hX2NvbXBsZXRlKCBpbnN0YW5jZSApOwogCQlkb25lID0gMDsKLQkJRU5BQkxFX0lSUSgpOworLy8JCUVOQUJMRV9JUlEoKTsKIAkgICAgfSBlbHNlCiAjZW5kaWYgLyogUkVBTF9ETUEgKi8KIAkgICAgewpAQCAtMTMzOSw3ICsxMzQyLDggQEAKIH0KIAogI2lmZGVmIE5DUjUzODBfU1RBVFMKLXN0YXRpYyB2b2lkIGNvbGxlY3Rfc3RhdHMoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEqIGhvc3RkYXRhLCBTY3NpX0NtbmQqIGNtZCkKK3N0YXRpYyB2b2lkIGNvbGxlY3Rfc3RhdHMoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhLAorCQkJICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAjIGlmZGVmIE5DUjUzODBfU1RBVF9MSU1JVAogICAgIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbiA+IE5DUjUzODBfU1RBVF9MSU1JVCkKQEAgLTEzNjUsOCArMTM2OSw4IEBACiAjZW5kaWYKIAogLyogCi0gKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3NlbGVjdCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIFNjc2lfQ21uZCAqY21kLCAKLSAqCWludCB0YWcpOworICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9zZWxlY3Qoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCisgKiAJCQkJIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwJaW50IHRhZyk7CiAgKgogICogUHVycG9zZSA6IGVzdGFibGlzaGVzIElfVF9MIG9yIElfVF9MX1EgbmV4dXMgZm9yIG5ldyBvciBleGlzdGluZyBjb21tYW5kLAogICoJaW5jbHVkaW5nIEFSQklUUkFUSU9OLCBTRUxFQ1RJT04sIGFuZCBpbml0aWFsIG1lc3NhZ2Ugb3V0IGZvciAKQEAgLTEzOTUsNyArMTM5OSw4IEBACiAgKgkJY21kLT5yZXN1bHQgaG9zdCBieXRlIHNldCB0byBESURfQkFEX1RBUkdFVC4KICAqLwogCi1zdGF0aWMgaW50IE5DUjUzODBfc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgU2NzaV9DbW5kICpjbWQsIGludCB0YWcpCitzdGF0aWMgaW50IE5DUjUzODBfc2VsZWN0KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkgIGludCB0YWcpCiB7CiAgICAgU0VUVVBfSE9TVERBVEEoaW5zdGFuY2UpOwogICAgIHVuc2lnbmVkIGNoYXIgdG1wWzNdLCBwaGFzZTsKQEAgLTE5ODUsNyArMTk5MCw3IEBACiAjZW5kaWYKICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwogICAgIHVuc2lnbmVkIGNoYXIgcGhhc2UsIHRtcCwgZXh0ZW5kZWRfbXNnWzEwXSwgb2xkX3BoYXNlPTB4ZmY7Ci0gICAgU2NzaV9DbW5kICpjbWQgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5jb25uZWN0ZWQ7CisgICAgc3RydWN0IHNjc2lfY21uZCAqY21kID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsKIAogI2lmZGVmIFNVTjNfU0NTSV9WTUUKICAgICBkcmVncy0+Y3NyIHw9IENTUl9JTlRSOwpAQCAtMjI3Miw3ICsyMjc3LDcgQEAKIAkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJCUxJU1QoY21kLGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZSk7CiAJCQlORVhUKGNtZCkgPSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7Ci0JCSAgICAgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKFNjc2lfQ21uZCAqKSBjbWQ7CisJCSAgICAgICAgaG9zdGRhdGEtPmlzc3VlX3F1ZXVlID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgY21kOwogCQkgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJCVFVX1BSSU5USygic2NzaSVkOiBSRVFVRVNUIFNFTlNFIGFkZGVkIHRvIGhlYWQgb2YgIgogCQkJCSAgImlzc3VlIHF1ZXVlXG4iLCBIX05PKGNtZCkpOwpAQCAtMjUwMiw3ICsyNTA3LDcgQEAKICAqIEZ1bmN0aW9uIDogdm9pZCBOQ1I1MzgwX3Jlc2VsZWN0IChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKICAqCiAgKiBQdXJwb3NlIDogZG9lcyByZXNlbGVjdGlvbiwgaW5pdGlhbGl6aW5nIHRoZSBpbnN0YW5jZS0+Y29ubmVjdGVkIAotICoJZmllbGQgdG8gcG9pbnQgdG8gdGhlIFNjc2lfQ21uZCBmb3Igd2hpY2ggdGhlIElfVF9MIG9yIElfVF9MX1EgCisgKglmaWVsZCB0byBwb2ludCB0byB0aGUgc3RydWN0IHNjc2lfY21uZCBmb3Igd2hpY2ggdGhlIElfVF9MIG9yIElfVF9MX1EKICAqCW5leHVzIGhhcyBiZWVuIHJlZXN0YWJsaXNoZWQsCiAgKgkKICAqIElucHV0cyA6IGluc3RhbmNlIC0gdGhpcyBpbnN0YW5jZSBvZiB0aGUgTkNSNTM4MC4KQEAgLTI1MjEsNyArMjUyNiw3IEBACiAgICAgdW5zaWduZWQgY2hhciB0YWc7CiAjZW5kaWYKICAgICB1bnNpZ25lZCBjaGFyIG1zZ1szXTsKLSAgICBTY3NpX0NtbmQgKnRtcCA9IE5VTEwsICpwcmV2OworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnRtcCA9IE5VTEwsICpwcmV2OwogLyogICAgdW5zaWduZWQgbG9uZyBmbGFnczsgKi8KIAogICAgIC8qCkBAIC0yNTc3LDcgKzI1ODIsNyBAQAogICAgICAqIGp1c3QgcmVlc3RhYmxpc2hlZCwgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBkaXNjb25uZWN0ZWQgcXVldWUuCiAgICAgICovCiAKLSAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgcHJldiA9IE5VTEw7IAorICAgIGZvciAodG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSwgcHJldiA9IE5VTEw7CiAJIHRtcDsgcHJldiA9IHRtcCwgdG1wID0gTkVYVCh0bXApICkgewogCWlmICgodGFyZ2V0X21hc2sgPT0gKDEgPDwgdG1wLT5kZXZpY2UtPmlkKSkgJiYgKGx1biA9PSB0bXAtPmRldmljZS0+bHVuKQogI2lmZGVmIFNVUFBPUlRfVEFHUwpAQCAtMjY2OCwxMSArMjY3MywxMSBAQAogCiAKIC8qCi0gKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX2Fib3J0IChTY3NpX0NtbmQgKmNtZCkKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogICoKICAqIFB1cnBvc2UgOiBhYm9ydCBhIGNvbW1hbmQKICAqCi0gKiBJbnB1dHMgOiBjbWQgLSB0aGUgU2NzaV9DbW5kIHRvIGFib3J0LCBjb2RlIC0gY29kZSB0byBzZXQgdGhlIAorICogSW5wdXRzIDogY21kIC0gdGhlIHN0cnVjdCBzY3NpX2NtbmQgdG8gYWJvcnQsIGNvZGUgLSBjb2RlIHRvIHNldCB0aGUKICAqIAlob3N0IGJ5dGUgb2YgdGhlIHJlc3VsdCBmaWVsZCB0bywgaWYgemVybyBESURfQUJPUlRFRCBpcyAKICAqCXVzZWQuCiAgKgpAQCAtMjY4NCwxMSArMjY4OSwxMSBAQAogICogCSBjYWxsZWQgd2hlcmUgdGhlIGxvb3Agc3RhcnRlZCBpbiBOQ1I1MzgwX21haW4oKS4KICAqLwogCi1zdGF0aWMgaW50IE5DUjUzODBfYWJvcnQgKFNjc2lfQ21uZCAqY21kKQorc3RhdGljIGludCBOQ1I1MzgwX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKICAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSA9IGNtZC0+ZGV2aWNlLT5ob3N0OwogICAgIFNFVFVQX0hPU1REQVRBKGluc3RhbmNlKTsKLSAgICBTY3NpX0NtbmQgKnRtcCwgKipwcmV2OworICAgIHN0cnVjdCBzY3NpX2NtbmQgKnRtcCwgKipwcmV2OwogICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICAgICBwcmludGsoS0VSTl9OT1RJQ0UgInNjc2klZDogYWJvcnRpbmcgY29tbWFuZFxuIiwgSE9TVE5PKTsKQEAgLTI3NTMsOSArMjc1OCw5IEBACiAgKiBDYXNlIDIgOiBJZiB0aGUgY29tbWFuZCBoYXNuJ3QgYmVlbiBpc3N1ZWQgeWV0LCB3ZSBzaW1wbHkgcmVtb3ZlIGl0IAogICogCSAgICBmcm9tIHRoZSBpc3N1ZSBxdWV1ZS4KICAqLwotICAgIGZvciAocHJldiA9IChTY3NpX0NtbmQgKiopICYoaG9zdGRhdGEtPmlzc3VlX3F1ZXVlKSwgCi0JdG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aXNzdWVfcXVldWU7Ci0JdG1wOyBwcmV2ID0gTkVYVEFERFIodG1wKSwgdG1wID0gTkVYVCh0bXApICkKKyAgICBmb3IgKHByZXYgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgJihob3N0ZGF0YS0+aXNzdWVfcXVldWUpLAorCXRtcCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIGhvc3RkYXRhLT5pc3N1ZV9xdWV1ZTsKKwl0bXA7IHByZXYgPSBORVhUQUREUih0bXApLCB0bXAgPSBORVhUKHRtcCkpCiAJaWYgKGNtZCA9PSB0bXApIHsKIAkgICAgUkVNT1ZFKDUsICpwcmV2LCB0bXAsIE5FWFQodG1wKSk7CiAJICAgICgqcHJldikgPSBORVhUKHRtcCk7CkBAIC0yODEyLDcgKzI4MTcsNyBAQAogICogaXQgZnJvbSB0aGUgZGlzY29ubmVjdGVkIHF1ZXVlLgogICovCiAKLSAgICBmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgdG1wOworICAgIGZvciAodG1wID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsgdG1wOwogCSB0bXAgPSBORVhUKHRtcCkpIAogICAgICAgICBpZiAoY21kID09IHRtcCkgewogICAgICAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMjgyNiw4ICsyODMxLDggQEAKIAkgICAgZG9fYWJvcnQgKGluc3RhbmNlKTsKIAogCSAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JICAgIGZvciAocHJldiA9IChTY3NpX0NtbmQgKiopICYoaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZSksIAotCQl0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWU7CisJICAgIGZvciAocHJldiA9IChzdHJ1Y3Qgc2NzaV9jbW5kICoqKSAmKGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfcXVldWUpLAorCQl0bXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOwogCQl0bXA7IHByZXYgPSBORVhUQUREUih0bXApLCB0bXAgPSBORVhUKHRtcCkgKQogCQkgICAgaWYgKGNtZCA9PSB0bXApIHsKIAkJICAgIFJFTU9WRSg1LCAqcHJldiwgdG1wLCBORVhUKHRtcCkpOwpAQCAtMjg2OCw3ICsyODczLDcgQEAKIAogCiAvKiAKLSAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYnVzX3Jlc2V0IChTY3NpX0NtbmQgKmNtZCkKKyAqIEZ1bmN0aW9uIDogaW50IE5DUjUzODBfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKICAqIAogICogUHVycG9zZSA6IHJlc2V0IHRoZSBTQ1NJIGJ1cy4KICAqCkBAIC0yODc2LDEzICsyODgxLDEzIEBACiAgKgogICovIAogCi1zdGF0aWMgaW50IE5DUjUzODBfYnVzX3Jlc2V0KCBTY3NpX0NtbmQgKmNtZCkKK3N0YXRpYyBpbnQgTkNSNTM4MF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogICAgIFNFVFVQX0hPU1REQVRBKGNtZC0+ZGV2aWNlLT5ob3N0KTsKICAgICBpbnQgICAgICAgICAgIGk7CiAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICNpZiAxCi0gICAgU2NzaV9DbW5kICpjb25uZWN0ZWQsICpkaXNjb25uZWN0ZWRfcXVldWU7CisgICAgc3RydWN0IHNjc2lfY21uZCAqY29ubmVjdGVkLCAqZGlzY29ubmVjdGVkX3F1ZXVlOwogI2VuZGlmCiAKIApAQCAtMjkxNCw5ICsyOTE5LDkgQEAKICAgICAgKiByZW1lbWJlcmVkIGluIGxvY2FsIHZhcmlhYmxlcyBmaXJzdC4KICAgICAgKi8KICAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0gICAgY29ubmVjdGVkID0gKFNjc2lfQ21uZCAqKWhvc3RkYXRhLT5jb25uZWN0ZWQ7CisgICAgY29ubmVjdGVkID0gKHN0cnVjdCBzY3NpX2NtbmQgKilob3N0ZGF0YS0+Y29ubmVjdGVkOwogICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOwotICAgIGRpc2Nvbm5lY3RlZF9xdWV1ZSA9IChTY3NpX0NtbmQgKilob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlOworICAgIGRpc2Nvbm5lY3RlZF9xdWV1ZSA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9xdWV1ZTsKICAgICBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX3F1ZXVlID0gTlVMTDsKICNpZmRlZiBTVVBQT1JUX1RBR1MKICAgICBmcmVlX2FsbF90YWdzKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmMKaW5kZXggZTYyNWI0Yy4uNjllZTNlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuYwpAQCAtNzUsOSArNzUsOSBAQAogI2RlZmluZSBSRUFMX0RNQQogCiAjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgImluaXRpby5oIgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSAic3VuM19zY3NpLmgiCi0jaW5jbHVkZSAiTkNSNTM4MC5oIgogCiBzdGF0aWMgdm9pZCBOQ1I1MzgwX3ByaW50KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKIApAQCAtMTE5LDcgKzExOSw3IEBACiBzdGF0aWMgaW50IHNldHVwX2hvc3RpZCA9IC0xOwogbW9kdWxlX3BhcmFtKHNldHVwX2hvc3RpZCwgaW50LCAwKTsKIAotc3RhdGljIFNjc2lfQ21uZCAqc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHNjc2lfY21uZCAqc3VuM19kbWFfc2V0dXBfZG9uZSA9IE5VTEw7CiAKICNkZWZpbmUJQUZURVJfUkVTRVRfREVMQVkJKEhaLzIpCiAKQEAgLTUyMSw4ICs1MjEsOSBAQAogCXJldHVybiBsYXN0X3Jlc2lkdWFsOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3hmZXJfbGVuKHVuc2lnbmVkIGxvbmcgd2FudGVkLCBTY3NpX0NtbmQgKmNtZCwKLQkJCQkgICAgaW50IHdyaXRlX2ZsYWcpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3VuM3Njc2lfZG1hX3hmZXJfbGVuKHVuc2lnbmVkIGxvbmcgd2FudGVkLAorCQkJCQkJICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJCQkgIGludCB3cml0ZV9mbGFnKQogewogCWlmKGJsa19mc19yZXF1ZXN0KGNtZC0+cmVxdWVzdCkpCiAgCQlyZXR1cm4gd2FudGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5oIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaS5oCmluZGV4IDgzNGRhYjQuLmIyOWE5ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvc3VuM19zY3NpLmgKQEAgLTQ3LDExICs0NywxMiBAQAogCiAjZGVmaW5lIElPQkFTRV9TVU4zX1ZNRVNDU0kgMHhmZjIwMDAwMAogCi1zdGF0aWMgaW50IHN1bjNzY3NpX2Fib3J0IChTY3NpX0NtbmQgKik7CitzdGF0aWMgaW50IHN1bjNzY3NpX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7CiBzdGF0aWMgaW50IHN1bjNzY3NpX2RldGVjdCAoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKTsKIHN0YXRpYyBjb25zdCBjaGFyICpzdW4zc2NzaV9pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICopOwotc3RhdGljIGludCBzdW4zc2NzaV9idXNfcmVzZXQoU2NzaV9DbW5kICopOwotc3RhdGljIGludCBzdW4zc2NzaV9xdWV1ZV9jb21tYW5kIChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7CitzdGF0aWMgaW50IHN1bjNzY3NpX2J1c19yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOworc3RhdGljIGludCBzdW4zc2NzaV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwKKwkJCQkgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKIHN0YXRpYyBpbnQgc3VuM3Njc2lfcmVsZWFzZSAoc3RydWN0IFNjc2lfSG9zdCAqKTsKIAogI2lmbmRlZiBDTURfUEVSX0xVTgpAQCAtMjIwLDcgKzIyMSw3IEBACiAgKgogICovCiAKLQorI2luY2x1ZGUgIk5DUjUzODAuaCIKIAogI2lmIE5ERUJVRyAmIE5ERUJVR19BUkJJVFJBVElPTgogI2RlZmluZSBBUkJfUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N1bjNfc2NzaV92bWUuYyBiL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2lfdm1lLmMKaW5kZXggZThmYWFiMS4uYmIwYzlmZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdW4zX3Njc2lfdm1lLmMKKysrIGIvZHJpdmVycy9zY3NpL3N1bjNfc2NzaV92bWUuYwpAQCAtNDEsOSArNDEsOSBAQAogI2RlZmluZSBSRUFMX0RNQQogCiAjaW5jbHVkZSAic2NzaS5oIgorI2luY2x1ZGUgImluaXRpby5oIgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSAic3VuM19zY3NpLmgiCi0jaW5jbHVkZSAiTkNSNTM4MC5oIgogCiBleHRlcm4gaW50IHN1bjNfbWFwX3Rlc3QodW5zaWduZWQgbG9uZywgY2hhciAqKTsKIApAQCAtODQsNyArODQsNyBAQAogc3RhdGljIGludCBzZXR1cF9ob3N0aWQgPSAtMTsKIG1vZHVsZV9wYXJhbShzZXR1cF9ob3N0aWQsIGludCwgMCk7CiAKLXN0YXRpYyBTY3NpX0NtbmQgKnN1bjNfZG1hX3NldHVwX2RvbmUgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKnN1bjNfZG1hX3NldHVwX2RvbmUgPSBOVUxMOwogCiAjZGVmaW5lCUFGVEVSX1JFU0VUX0RFTEFZCShIWi8yKQogCkBAIC00NTUsOCArNDU1LDkgQEAKIAlyZXR1cm4gbGFzdF9yZXNpZHVhbDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN1bjNzY3NpX2RtYV94ZmVyX2xlbih1bnNpZ25lZCBsb25nIHdhbnRlZCwgU2NzaV9DbW5kICpjbWQsCi0JCQkJICAgIGludCB3cml0ZV9mbGFnKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN1bjNzY3NpX2RtYV94ZmVyX2xlbih1bnNpZ25lZCBsb25nIHdhbnRlZCwKKwkJCQkJCSAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorCQkJCQkJICBpbnQgd3JpdGVfZmxhZykKIHsKIAlpZihibGtfZnNfcmVxdWVzdChjbWQtPnJlcXVlc3QpKQogIAkJcmV0dXJuIHdhbnRlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zeW01M2M4eHhfMi9zeW1faGlwZC5jIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmMKaW5kZXggOTQwZmExZS4uMjFjZDRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmMKKysrIGIvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmMKQEAgLTU1NDUsNyArNTU0NSw3IEBACiAJLyoKIAkgKiAgQWxsb2NhdGUgdGhlIGFycmF5IG9mIGxpc3RzIG9mIENDQnMgaGFzaGVkIGJ5IERTQS4KIAkgKi8KLQlucC0+Y2NiaCA9IGtjYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW1fY2NiICoqKSwgQ0NCX0hBU0hfU0laRSwgR0ZQX0tFUk5FTCk7CisJbnAtPmNjYmggPSBrY2FsbG9jKENDQl9IQVNIX1NJWkUsIHNpemVvZihzdHJ1Y3Qgc3ltX2NjYiAqKiksIEdGUF9LRVJORUwpOwogCWlmICghbnAtPmNjYmgpCiAJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3QxMjguaCBiL2RyaXZlcnMvc2NzaS90MTI4LmgKaW5kZXggNjQ2ZTg0MC4uNzZhMDY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3QxMjguaAorKysgYi9kcml2ZXJzL3Njc2kvdDEyOC5oCkBAIC04LDIwICs4LDIwIEBACiAgKglkcmV3QGNvbG9yYWRvLmVkdQogICogICAgICArMSAoMzAzKSA0NDAtNDg5NAogICoKLSAqIERJU1RSSUJVVElPTiBSRUxFQVNFIDMuIAorICogRElTVFJJQlVUSU9OIFJFTEVBU0UgMy4KICAqCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQKICAqCiAgKiBUcmFudG9yIFN5c3RlbXMsIEx0ZC4KICAqIFQxMjgvVDEyOEYvVDIyOCBTQ1NJIEhvc3QgQWRhcHRlcgogICogSGFyZHdhcmUgU3BlY2lmaWNhdGlvbnMKLSAqIAotICogVHJhbnRvciBTeXN0ZW1zLCBMdGQuIAorICoKKyAqIFRyYW50b3IgU3lzdGVtcywgTHRkLgogICogNTQxNSBSYW5kYWxsIFBsYWNlCiAgKiBGcmVtb250LCBDQSA5NDUzOAogICogMSsgKDQxNSkgNzcwLTE0MDAsIEZBWCAxKyAoNDE1KSA3NzAtOTkxMAotICogCi0gKiBhbmQgCisgKgorICogYW5kCiAgKgogICogTkNSIDUzODAgRmFtaWx5CiAgKiBTQ1NJIFByb3RvY29sIENvbnRyb2xsZXIKQEAgLTQ4LDE1ICs0OCwxNSBAQAogI2RlZmluZSBUREVCVUdfVFJBTlNGRVIgMHgyCiAKIC8qCi0gKiBUaGUgdHJhbnRvciBib2FyZHMgYXJlIG1lbW9yeSBtYXBwZWQuIFRoZXkgdXNlIGFuIE5DUjUzODAgb3IgCisgKiBUaGUgdHJhbnRvciBib2FyZHMgYXJlIG1lbW9yeSBtYXBwZWQuIFRoZXkgdXNlIGFuIE5DUjUzODAgb3IKICAqIGVxdWl2YWxlbnQgKG15IHNhbXBsZSBib2FyZCBoYWQgcGFydCBzZWNvbmQgc291cmNlZCBmcm9tIFpJTE9HKS4KLSAqIE5DUidzIHJlY29tbWVuZGVkICJQc2V1ZG8tRE1BIiBhcmNoaXRlY3R1cmUgaXMgdXNlZCwgd2hlcmUgCisgKiBOQ1IncyByZWNvbW1lbmRlZCAiUHNldWRvLURNQSIgYXJjaGl0ZWN0dXJlIGlzIHVzZWQsIHdoZXJlCiAgKiBhIFBBTCBkcml2ZXMgdGhlIERNQSBzaWduYWxzIG9uIHRoZSA1MzgwIGFsbG93aW5nIGZhc3QsIGJsaW5kCi0gKiB0cmFuc2ZlcnMgd2l0aCBwcm9wZXIgaGFuZHNoYWtpbmcuIAorICogdHJhbnNmZXJzIHdpdGggcHJvcGVyIGhhbmRzaGFraW5nLgogICovCiAKIC8qCi0gKiBOb3RlIDogYSBib290IHN3aXRjaCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgaW5mb3JtaW5nIHRoZSAKKyAqIE5vdGUgOiBhIGJvb3Qgc3dpdGNoIGlzIHByb3ZpZGVkIGZvciB0aGUgcHVycG9zZSBvZiBpbmZvcm1pbmcgdGhlCiAgKiBmaXJtd2FyZSB0byBib290IG9yIG5vdCBib290IGZyb20gYXR0YWNoZWQgU0NTSSBkZXZpY2VzLiAgU28sIEkgaW1hZ2luZQogICogdGhlcmUgYXJlIGZld2VyIHBlb3BsZSB3aG8ndmUgeWFua2VkIHRoZSBST00gbGlrZSB0aGV5IGRvIG9uIHRoZSBTZWFnYXRlCiAgKiB0byBtYWtlIGJvb3R1cCBmYXN0ZXIsIGFuZCBJJ2xsIHByb2JhYmx5IHVzZSB0aGlzIGZvciBhdXRvZGV0ZWN0aW9uLgpAQCAtOTIsMTkgKzkyLDIwIEBACiAjZGVmaW5lIFRfREFUQV9SRUdfT0ZGU0VUCTB4MWUwMAkvKiBydyA1MTIgYnl0ZXMgbG9uZyAqLwogCiAjaWZuZGVmIEFTTQotc3RhdGljIGludCB0MTI4X2Fib3J0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgdDEyOF9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICopOwogc3RhdGljIGludCB0MTI4X2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAogCQkJICBzZWN0b3JfdCwgaW50Kik7CiBzdGF0aWMgaW50IHQxMjhfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKik7Ci1zdGF0aWMgaW50IHQxMjhfcXVldWVfY29tbWFuZChTY3NpX0NtbmQgKiwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSk7Ci1zdGF0aWMgaW50IHQxMjhfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKK3N0YXRpYyBpbnQgdDEyOF9xdWV1ZV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKiwKKwkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyBpbnQgdDEyOF9idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqKTsKIAogI2lmbmRlZiBDTURfUEVSX0xVTgogI2RlZmluZSBDTURfUEVSX0xVTiAyCiAjZW5kaWYKIAogI2lmbmRlZiBDQU5fUVVFVUUKLSNkZWZpbmUgQ0FOX1FVRVVFIDMyIAorI2RlZmluZSBDQU5fUVVFVUUgMzIKICNlbmRpZgogCiAjaWZuZGVmIEhPU1RTX0MKQEAgLTEyMCw3ICsxMjEsNyBAQAogCiAjZGVmaW5lIFQxMjhfYWRkcmVzcyhyZWcpIChiYXNlICsgVF81MzgwX09GRlNFVCArICgocmVnKSAqIDB4MjApKQogCi0jaWYgIShUREVCVUcgJiBUREVCVUdfVFJBTlNGRVIpIAorI2lmICEoVERFQlVHICYgVERFQlVHX1RSQU5TRkVSKQogI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKSByZWFkYihUMTI4X2FkZHJlc3MocmVnKSkKICNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSB3cml0ZWIoKHZhbHVlKSwoVDEyOF9hZGRyZXNzKHJlZykpKQogI2Vsc2UKQEAgLTEyOSw3ICsxMzAsNyBAQAogICAgICwgaW5zdGFuY2UtPmhvc3RubywgKHJlZyksIFQxMjhfYWRkcmVzcyhyZWcpKSksIHJlYWRiKFQxMjhfYWRkcmVzcyhyZWcpKSkKIAogI2RlZmluZSBOQ1I1MzgwX3dyaXRlKHJlZywgdmFsdWUpIHsJCQkJCVwKLSAgICBwcmludGsoInNjc2klZCA6IHdyaXRlICUwMnggdG8gcmVnaXN0ZXIgJWQgYXQgYWRkcmVzcyAlMDh4XG4iLCAJXAorICAgIHByaW50aygic2NzaSVkIDogd3JpdGUgJTAyeCB0byByZWdpc3RlciAlZCBhdCBhZGRyZXNzICUwOHhcbiIsCVwKIAkgICAgaW5zdGFuY2UtPmhvc3RubywgKHZhbHVlKSwgKHJlZyksIFQxMjhfYWRkcmVzcyhyZWcpKTsJXAogICAgIHdyaXRlYigodmFsdWUpLCAoVDEyOF9hZGRyZXNzKHJlZykpKTsJCQkJXAogfQpAQCAtMTQyLDEwICsxNDMsMTAgQEAKICNkZWZpbmUgTkNSNTM4MF9idXNfcmVzZXQgdDEyOF9idXNfcmVzZXQKICNkZWZpbmUgTkNSNTM4MF9wcm9jX2luZm8gdDEyOF9wcm9jX2luZm8KIAotLyogMTUgMTQgMTIgMTAgNyA1IDMgCisvKiAxNSAxNCAxMiAxMCA3IDUgMwogICAgMTEwMSAwMTAwIDEwMTAgMTAwMCAqLwotICAgCi0jZGVmaW5lIFQxMjhfSVJRUyAweGM0YTggCisKKyNkZWZpbmUgVDEyOF9JUlFTIDB4YzRhOAogCiAjZW5kaWYgLyogZWxzZSBkZWYgSE9TVFNfQyAqLwogI2VuZGlmIC8qIG5kZWYgQVNNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jIGIvZHJpdmVycy9zY3NpL3Rtc2NzaW0uYwppbmRleCBkMDNhYTZjLi5mYTUzODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdG1zY3NpbS5jCisrKyBiL2RyaXZlcnMvc2NzaS90bXNjc2ltLmMKQEAgLTIzMDQsNiArMjMwNCw3IEBACiAJLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCiAJLmNtZF9wZXJfbHVuCQk9IDEsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5tYXhfc2VjdG9ycwkJPSAweDQwMDAsIC8qIDhNaUIgPSAxNiAqIDEwMjQgKiA1MTIgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvMjEyODUuYyBiL2RyaXZlcnMvc2VyaWFsLzIxMjg1LmMKaW5kZXggNmExYTU2OC4uZmFjYjY3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvMjEyODUuYworKysgYi9kcml2ZXJzL3NlcmlhbC8yMTI4NS5jCkBAIC0yMTQsOCArMjE0LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLXNlcmlhbDIxMjg1X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkJc3RydWN0IHRlcm1pb3MgKm9sZCkKK3NlcmlhbDIxMjg1X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCXN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGJhdWQsIHF1b3QsIGhfbGNyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKaW5kZXggOWI4YjU4NS4uY2FkNDI2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCkBAIC0xMDYxLDcgKzEwNjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCByc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBtNjhrX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbTY4a19zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYwppbmRleCA2MzRlY2NhLi42ODgxN2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKQEAgLTE1MjMsNyArMTUyMyw3IEBACiAKIC8qIEZJWCBVUCBtb2RlbSBjb250cm9sIGhlcmUgc29tZWRheS4uLi4uLgogKi8KLXN0YXRpYyB2b2lkIHJzXzM2MF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCByc18zNjBfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzZXJfaW5mb190ICppbmZvID0gKHNlcl9pbmZvX3QgKil0dHktPmRyaXZlcl9kYXRhOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggZTM0YmQwMy4uNTFmM2M3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtMTc2Myw4ICsxNzYzLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLXNlcmlhbDgyNTBfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JCSAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorc2VyaWFsODI1MF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqKXBvcnQ7CiAJdW5zaWduZWQgY2hhciBjdmFsLCBmY3IgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9leGFyX3N0MTZjNTU0LmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2V4YXJfc3QxNmM1NTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjcxNDNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9leGFyX3N0MTZjNTU0LmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NlcmlhbC84MjUwX2V4YXIuYworICoKKyAqICBXcml0dGVuIGJ5IFBhdWwgQiBTY2hyb2VkZXIgPCBwc2Nocm9lZGVyICJhdCIgdXBsb2dpeCAiZG90IiBjb20gPgorICogIEJhc2VkIG9uIDgyNTBfYm9jYS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IFJ1c3NlbGwgS2luZy4KKyAqICBEYXRhIHRha2VuIGZyb20gaW5jbHVkZS9hc20taTM4Ni9zZXJpYWwuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworI2RlZmluZSBQT1JUKF9iYXNlLF9pcnEpCQkJCVwKKwl7CQkJCQkJXAorCQkuaW9iYXNlCQk9IF9iYXNlLAkJXAorCQkuaXJxCQk9IF9pcnEsCQkJXAorCQkudWFydGNsawk9IDE4NDMyMDAsCQlcCisJCS5pb3R5cGUJCT0gVVBJT19QT1JULAkJXAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCVwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgZXhhcl9kYXRhW10gPSB7CisJUE9SVCgweDEwMCwgNSksCisJUE9SVCgweDEwOCwgNSksCisJUE9SVCgweDExMCwgNSksCisJUE9SVCgweDExOCwgNSksCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXhhcl9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IFBMQVQ4MjUwX0RFVl9FWEFSX1NUMTZDNTU0LAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBleGFyX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGV4YXJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmV4YXJfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoZXhhcl9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiUGF1bCBCIFNjaHJvZWRlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI4MjUwIHNlcmlhbCBwcm9iZSBtb2R1bGUgZm9yIEV4YXIgY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCmluZGV4IDRkMGZmOGYuLjUyZTJlNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYwpAQCAtMjIzOSw2ICsyMjM5LDMwIEBACiAJCXBibl9iMF9idF8xXzQ2MDgwMCB9LAogCiAJLyoKKwkgKiBLb3Jlbml4IEpldGNhcmQgRjAvRjEgY2FyZHMgKEpDMTIwNCwgSkMxMjA4LCBKQzE0MDQsIEpDMTQwOCkuCisJICogQ2FyZHMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgc3Vic3lzdGVtIHZlbmRvciBJRHMsIHdoaWNoCisJICogKGluIGhleCkgbWF0Y2ggdGhlIG1vZGVsIG51bWJlci4KKwkgKgorCSAqIE5vdGUgdGhhdCBKQzE0MHggYXJlIFJTNDIyLzQ4NSBjYXJkcyB3aGljaCByZXF1aXJlIG94OTUwCisJICogQUNSID0gMHgxMCwgYW5kIGFzIHN1Y2ggYXJlIG5vdCBjdXJyZW50bHkgZnVsbHkgc3VwcG9ydGVkLgorCSAqLworCXsJUENJX1ZFTkRPUl9JRF9LT1JFTklYLCBQQ0lfREVWSUNFX0lEX0tPUkVOSVhfSkVUQ0FSREYwLAorCQkweDEyMDQsIDB4MDAwNCwgMCwgMCwKKwkJcGJuX2IwXzRfOTIxNjAwIH0sCisJewlQQ0lfVkVORE9SX0lEX0tPUkVOSVgsIFBDSV9ERVZJQ0VfSURfS09SRU5JWF9KRVRDQVJERjAsCisJCTB4MTIwOCwgMHgwMDA0LCAwLCAwLAorCQlwYm5fYjBfNF85MjE2MDAgfSwKKy8qCXsJUENJX1ZFTkRPUl9JRF9LT1JFTklYLCBQQ0lfREVWSUNFX0lEX0tPUkVOSVhfSkVUQ0FSREYwLAorCQkweDE0MDIsIDB4MDAwMiwgMCwgMCwKKwkJcGJuX2IwXzJfOTIxNjAwIH0sICovCisvKgl7CVBDSV9WRU5ET1JfSURfS09SRU5JWCwgUENJX0RFVklDRV9JRF9LT1JFTklYX0pFVENBUkRGMCwKKwkJMHgxNDA0LCAweDAwMDQsIDAsIDAsCisJCXBibl9iMF80XzkyMTYwMCB9LCAqLworCXsJUENJX1ZFTkRPUl9JRF9LT1JFTklYLCBQQ0lfREVWSUNFX0lEX0tPUkVOSVhfSkVUQ0FSREYxLAorCQkweDEyMDgsIDB4MDAwNCwgMCwgMCwKKwkJcGJuX2IwXzRfOTIxNjAwIH0sCisKKwkvKgogCSAqIERlbGwgUmVtb3RlIEFjY2VzcyBDYXJkIDQgLSBUaW1fVF9NdXJwaHlARGVsbC5jb20KIAkgKi8KIAl7CVBDSV9WRU5ET1JfSURfREVMTCwgUENJX0RFVklDRV9JRF9ERUxMX1JBQzQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX3BucC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9wbnAuYwppbmRleCA3MWQ5MDdjLi5kM2Q2YjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX3BucC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcG5wLmMKQEAgLTQ2NCwxMSArNDY0LDM4IEBACiAJCXNlcmlhbDgyNTBfdW5yZWdpc3Rlcl9wb3J0KGxpbmUgLSAxKTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBzZXJpYWxfcG5wX3N1c3BlbmQoc3RydWN0IHBucF9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWxvbmcgbGluZSA9IChsb25nKXBucF9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlzZXJpYWw4MjUwX3N1c3BlbmRfcG9ydChsaW5lIC0gMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VyaWFsX3BucF9yZXN1bWUoc3RydWN0IHBucF9kZXYgKmRldikKK3sKKwlsb25nIGxpbmUgPSAobG9uZylwbnBfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJc2VyaWFsODI1MF9yZXN1bWVfcG9ydChsaW5lIC0gMSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBzZXJpYWxfcG5wX3N1c3BlbmQgTlVMTAorI2RlZmluZSBzZXJpYWxfcG5wX3Jlc3VtZSBOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKIHN0YXRpYyBzdHJ1Y3QgcG5wX2RyaXZlciBzZXJpYWxfcG5wX2RyaXZlciA9IHsKIAkubmFtZQkJPSAic2VyaWFsIiwKLQkuaWRfdGFibGUJPSBwbnBfZGV2X3RhYmxlLAogCS5wcm9iZQkJPSBzZXJpYWxfcG5wX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2VyaWFsX3BucF9yZW1vdmUpLAorCS5zdXNwZW5kCT0gc2VyaWFsX3BucF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2VyaWFsX3BucF9yZXN1bWUsCisJLmlkX3RhYmxlCT0gcG5wX2Rldl90YWJsZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNlcmlhbDgyNTBfcG5wX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IGIwZDUwMjYuLjI5NzhjMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtMTUxLDYgKzE1MSw1OCBAQAogCSAgc2F5IE4gaGVyZSB0byBzYXZlIHNvbWUgbWVtb3J5LiBZb3UgY2FuIGFsc28gc2F5IFkgaWYgeW91IGhhdmUgYW4KIAkgICJpbnRlbGxpZ2VudCIgbXVsdGlwb3J0IGNhcmQgc3VjaCBhcyBDeWNsYWRlcywgRGlnaWJvYXJkcywgZXRjLgogCisjCisjIE11bHRpLXBvcnQgc2VyaWFsIGNhcmRzCisjCisKK2NvbmZpZyBTRVJJQUxfODI1MF9GT1VSUE9SVAorCXRyaXN0YXRlICJTdXBwb3J0IEZvdXJwb3J0IGNhcmRzIgorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBJU0EgJiYgU0VSSUFMXzgyNTBfTUFOWV9QT1JUUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gQVNUIEZvdXJQb3J0IHNlcmlhbCBib2FyZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgODI1MF9mb3VycG9ydC4KKworY29uZmlnIFNFUklBTF84MjUwX0FDQ0VOVAorCXRyaXN0YXRlICJTdXBwb3J0IEFjY2VudCBjYXJkcyIKKwlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgSVNBICYmIFNFUklBTF84MjUwX01BTllfUE9SVFMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEFjY2VudCBBc3luYyBzZXJpYWwgYm9hcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgyNTBfYWNjZW50LgorCitjb25maWcgU0VSSUFMXzgyNTBfQk9DQQorCXRyaXN0YXRlICJTdXBwb3J0IEJvY2EgY2FyZHMiCisJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAhPSBuICYmIElTQSAmJiBTRVJJQUxfODI1MF9NQU5ZX1BPUlRTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIEJvY2Egc2VyaWFsIGJvYXJkLiAgUGxlYXNlIHJlYWQgdGhlIEJvY2EKKwkgIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgODI1MF9ib2NhLgorCitjb25maWcgU0VSSUFMXzgyNTBfRVhBUl9TVDE2QzU1NAorCXRyaXN0YXRlICJTdXBwb3J0IEV4YXIgU1QxNkM1NTQvNTU0RCBRdWFkIFVBUlQiCisJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAhPSBuICYmIElTQSAmJiBTRVJJQUxfODI1MF9NQU5ZX1BPUlRTCisJaGVscAorCSAgVGhlIFVwbG9naXggRW52b3kgVFUzMDEgdXNlcyB0aGlzIEV4YXIgUXVhZCBVQVJULiAgSWYgeW91IGFyZQorCSAgdGlua2VyaW5nIHdpdGggeW91ciBFbnZveSBUVTMwMSwgb3IgaGF2ZSBhIG1hY2hpbmUgd2l0aCB0aGlzIFVBUlQsCisJICBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCA4MjUwX2V4YXJfc3QxNmM1NTQuCisKK2NvbmZpZyBTRVJJQUxfODI1MF9IVUI2CisJdHJpc3RhdGUgIlN1cHBvcnQgSHViNiBjYXJkcyIKKwlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgSVNBICYmIFNFUklBTF84MjUwX01BTllfUE9SVFMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgSFVCNiBzZXJpYWwgYm9hcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgyNTBfaHViNi4KKwogY29uZmlnIFNFUklBTF84MjUwX1NIQVJFX0lSUQogCWJvb2wgIlN1cHBvcnQgZm9yIHNoYXJpbmcgc2VyaWFsIGludGVycnVwdHMiCiAJZGVwZW5kcyBvbiBTRVJJQUxfODI1MF9FWFRFTkRFRApAQCAtMTc3LDQ4ICsyMjksNiBAQAogCWhlbHAKIAkgIDo6OiBUbyBiZSB3cml0dGVuIDo6OgogCi0jCi0jIE11bHRpLXBvcnQgc2VyaWFsIGNhcmRzCi0jCi0KLWNvbmZpZyBTRVJJQUxfODI1MF9GT1VSUE9SVAotCXRyaXN0YXRlICJTdXBwb3J0IEZvdXJwb3J0IGNhcmRzIgotCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBJU0EgJiYgU0VSSUFMXzgyNTBfTUFOWV9QT1JUUwotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gQVNUIEZvdXJQb3J0IHNlcmlhbCBib2FyZC4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgODI1MF9mb3VycG9ydC4KLQotY29uZmlnIFNFUklBTF84MjUwX0FDQ0VOVAotCXRyaXN0YXRlICJTdXBwb3J0IEFjY2VudCBjYXJkcyIKLQlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgSVNBICYmIFNFUklBTF84MjUwX01BTllfUE9SVFMKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEFjY2VudCBBc3luYyBzZXJpYWwgYm9hcmQuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIDgyNTBfYWNjZW50LgotCi0KLWNvbmZpZyBTRVJJQUxfODI1MF9CT0NBCi0JdHJpc3RhdGUgIlN1cHBvcnQgQm9jYSBjYXJkcyIKLQlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgSVNBICYmIFNFUklBTF84MjUwX01BTllfUE9SVFMKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgQm9jYSBzZXJpYWwgYm9hcmQuICBQbGVhc2UgcmVhZCB0aGUgQm9jYQotCSAgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCA4MjUwX2JvY2EuCi0KLWNvbmZpZyBTRVJJQUxfODI1MF9IVUI2Ci0JdHJpc3RhdGUgIlN1cHBvcnQgSHViNiBjYXJkcyIKLQlkZXBlbmRzIG9uIFNFUklBTF84MjUwICE9IG4gJiYgSVNBICYmIFNFUklBTF84MjUwX01BTllfUE9SVFMKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgSFVCNiBzZXJpYWwgYm9hcmQuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIDgyNTBfaHViNi4KLQogY29uZmlnIFNFUklBTF84MjUwX01DQQogCXRyaXN0YXRlICJTdXBwb3J0IDgyNTAtdHlwZSBwb3J0cyBvbiBNQ0EgYnVzZXMiCiAJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAhPSBuICYmIE1DQQpAQCAtNTExLDYgKzUyMSwyNSBAQAogCSAgeW91ciBib290IGxvYWRlciAobGlsbyBvciBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZQogCSAga2VybmVsIGF0IGJvb3QgdGltZS4pCiAKK2NvbmZpZyBTRVJJQUxfVUFSVExJVEUKKwl0cmlzdGF0ZSAiWGlsaW54IHVhcnRsaXRlIHNlcmlhbCBwb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQUEMzMgorCXNlbGVjdCBTRVJJQUxfQ09SRQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBYaWxpbnggdWFydGxpdGUgc2VyaWFsIGNvbnRyb2xsZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVhcnRsaXRlLmtvLgorCitjb25maWcgU0VSSUFMX1VBUlRMSVRFX0NPTlNPTEUKKwlib29sICJTdXBwb3J0IGZvciBjb25zb2xlIG9uIFhpbGlueCB1YXJ0bGl0ZSBzZXJpYWwgcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9VQVJUTElURT15CisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3aXNoIHRvIHVzZSBhIFhpbGlueCB1YXJ0bGl0ZSBhcyB0aGUgc3lzdGVtCisJICBjb25zb2xlICh0aGUgc3lzdGVtIGNvbnNvbGUgaXMgdGhlIGRldmljZSB3aGljaCByZWNlaXZlcyBhbGwga2VybmVsCisJICBtZXNzYWdlcyBhbmQgd2FybmluZ3MgYW5kIHdoaWNoIGFsbG93cyBsb2dpbnMgaW4gc2luZ2xlIHVzZXIgbW9kZSkuCisKIGNvbmZpZyBTRVJJQUxfU1VOQ09SRQogCWJvb2wKIAlkZXBlbmRzIG9uIFNQQVJDCkBAIC02MzQsNyArNjYzLDcgQEAKIAogY29uZmlnIFY4NTBFX1VBUlRCCiAgICAgICAgIGJvb2wKLQlkZXBlbmRzIFY4NTBFX1VBUlQgJiYgVjg1MEVfTUUyCisJZGVwZW5kcyBvbiBWODUwRV9VQVJUICYmIFY4NTBFX01FMgogCWRlZmF1bHQgeQogCiBjb25maWcgVjg1MEVfVUFSVF9DT05TT0xFCkBAIC03NjcsMzcgKzc5NiwzNyBAQAogCWJvb2wgIlN1cHBvcnQgZm9yIFNDQzEgc2VyaWFsIHBvcnQiCiAJZGVwZW5kcyBvbiBTRVJJQUxfQ1BNPXkKIAloZWxwCi0JICBTZWxlY3QgdGhlIGlzIG9wdGlvbiB0byB1c2UgU0NDMSBhcyBhIHNlcmlhbCBwb3J0CisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIFNDQzEgYXMgYSBzZXJpYWwgcG9ydAogCiBjb25maWcgU0VSSUFMX0NQTV9TQ0MyCiAJYm9vbCAiU3VwcG9ydCBmb3IgU0NDMiBzZXJpYWwgcG9ydCIKIAlkZXBlbmRzIG9uIFNFUklBTF9DUE09eQogCWhlbHAKLQkgIFNlbGVjdCB0aGUgaXMgb3B0aW9uIHRvIHVzZSBTQ0MyIGFzIGEgc2VyaWFsIHBvcnQKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2UgU0NDMiBhcyBhIHNlcmlhbCBwb3J0CiAKIGNvbmZpZyBTRVJJQUxfQ1BNX1NDQzMKIAlib29sICJTdXBwb3J0IGZvciBTQ0MzIHNlcmlhbCBwb3J0IgogCWRlcGVuZHMgb24gU0VSSUFMX0NQTT15CiAJaGVscAotCSAgU2VsZWN0IHRoZSBpcyBvcHRpb24gdG8gdXNlIFNDQzMgYXMgYSBzZXJpYWwgcG9ydAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHVzZSBTQ0MzIGFzIGEgc2VyaWFsIHBvcnQKIAogY29uZmlnIFNFUklBTF9DUE1fU0NDNAogCWJvb2wgIlN1cHBvcnQgZm9yIFNDQzQgc2VyaWFsIHBvcnQiCiAJZGVwZW5kcyBvbiBTRVJJQUxfQ1BNPXkKIAloZWxwCi0JICBTZWxlY3QgdGhlIGlzIG9wdGlvbiB0byB1c2UgU0NDNCBhcyBhIHNlcmlhbCBwb3J0CisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gdXNlIFNDQzQgYXMgYSBzZXJpYWwgcG9ydAogCiBjb25maWcgU0VSSUFMX0NQTV9TTUMxCiAJYm9vbCAiU3VwcG9ydCBmb3IgU01DMSBzZXJpYWwgcG9ydCIKIAlkZXBlbmRzIG9uIFNFUklBTF9DUE09eQogCWhlbHAKLQkgIFNlbGVjdCB0aGUgaXMgb3B0aW9uIHRvIHVzZSBTTUMxIGFzIGEgc2VyaWFsIHBvcnQKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2UgU01DMSBhcyBhIHNlcmlhbCBwb3J0CiAKIGNvbmZpZyBTRVJJQUxfQ1BNX1NNQzIKIAlib29sICJTdXBwb3J0IGZvciBTTUMyIHNlcmlhbCBwb3J0IgogCWRlcGVuZHMgb24gU0VSSUFMX0NQTT15CiAJaGVscAotCSAgU2VsZWN0IHRoZSBpcyBvcHRpb24gdG8gdXNlIFNNQzIgYXMgYSBzZXJpYWwgcG9ydAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHVzZSBTTUMyIGFzIGEgc2VyaWFsIHBvcnQKIAogY29uZmlnIFNFUklBTF9TR0lfTDFfQ09OU09MRQogCWJvb2wgIlNHSSBBbHRpeCBMMSBzZXJpYWwgY29uc29sZSBzdXBwb3J0IgpAQCAtODgwLDcgKzkwOSw3IEBACiAKIGNvbmZpZyBTRVJJQUxfVFhYOQogCWJvb2wgIlRNUFRYMzlYWC80OVhYIFNJTyBzdXBwb3J0IgotCWRlcGVuZHMgSEFTX1RYWDlfU0VSSUFMCisJZGVwZW5kcyBvbiBIQVNfVFhYOV9TRVJJQUwKIAlzZWxlY3QgU0VSSUFMX0NPUkUKIAlkZWZhdWx0IHkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQppbmRleCBiNGQ4YTdjLi5kZjM2MzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpAQCAtMTcsNiArMTcsNyBAQAogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0ZPVVJQT1JUKSArPSA4MjUwX2ZvdXJwb3J0Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9BQ0NFTlQpICs9IDgyNTBfYWNjZW50Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9CT0NBKSArPSA4MjUwX2JvY2Eubworb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0VYQVJfU1QxNkM1NTQpICs9IDgyNTBfZXhhcl9zdDE2YzU1NC5vCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfSFVCNikgKz0gODI1MF9odWI2Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9NQ0EpICs9IDgyNTBfbWNhLm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9BVTFYMDApICs9IDgyNTBfYXUxeDAwLm8KQEAgLTU1LDQgKzU2LDUgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfU0dJX0lPQzQpICs9IGlvYzRfc2VyaWFsLm8KIG9iai0kKENPTkZJR19TRVJJQUxfU0dJX0lPQzMpICs9IGlvYzNfc2VyaWFsLm8KIG9iai0kKENPTkZJR19TRVJJQUxfQVRNRUwpICs9IGF0bWVsX3NlcmlhbC5vCitvYmotJChDT05GSUdfU0VSSUFMX1VBUlRMSVRFKSArPSB1YXJ0bGl0ZS5vCiBvYmotJChDT05GSUdfU0VSSUFMX05FVFgpICs9IG5ldHgtc2VyaWFsLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTAuYyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTAuYwppbmRleCA0MjEzZmFiLi42MWRiNjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jCkBAIC0xMjksNiArMTI5LDggQEAKIAkJICovCiAJCXJzciA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUMDF4X1JTUikgfCBVQVJUX0RVTU1ZX1JTUl9SWDsKIAkJaWYgKHVubGlrZWx5KHJzciAmIFVBUlQwMXhfUlNSX0FOWSkpIHsKKwkJCXdyaXRlbCgwLCBwb3J0LT5tZW1iYXNlICsgVUFSVDAxeF9FQ1IpOworCiAJCQlpZiAocnNyICYgVUFSVDAxeF9SU1JfQkUpIHsKIAkJCQlyc3IgJj0gfihVQVJUMDF4X1JTUl9GRSB8IFVBUlQwMXhfUlNSX1BFKTsKIAkJCQlwb3J0LT5pY291bnQuYnJrKys7CkBAIC0zNDMsOCArMzQ1LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLXBsMDEwX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCitwbDAxMF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJdW5zaWduZWQgaW50IGxjcl9oLCBvbGRfY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTEuYwppbmRleCBkNTAzNjI1Li45YTNiMzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDExLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMS5jCkBAIC00MTIsOCArNDEyLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLXBsMDExX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCitwbDAxMV9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJdW5zaWduZWQgaW50IGxjcl9oLCBvbGRfY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKaW5kZXggMzkxYTFmNC4uZWQ3ZjcyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGxpbnV4L2RyaXZlcnMvY2hhci9hdDkxX3NlcmlhbC5jCisgKiAgbGludXgvZHJpdmVycy9jaGFyL2F0bWVsX3NlcmlhbC5jCiAgKgogICogIERyaXZlciBmb3IgQXRtZWwgQVQ5MSAvIEFUMzIgU2VyaWFsIHBvcnRzCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFJpY2sgQnJvbnNvbgpAQCAtMzYsMTEgKzM2LDExIEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFybTkyMDBfcGRjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvc2VyaWFsX2F0OTEuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfcGRjLmg+CiAjaWZkZWYgQ09ORklHX0FSTQotI2luY2x1ZGUgPGFzbS9hcmNoL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNlbmRpZgogCkBAIC0xMzcsOCArMTM3LDggQEAKIAl1bnNpZ25lZCBpbnQgY29udHJvbCA9IDA7CiAJdW5zaWduZWQgaW50IG1vZGU7CiAKLSNpZmRlZiBDT05GSUdfQVJNCi0JaWYgKGFyY2hfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFSTTkyMDApIHsKKyNpZmRlZiBDT05GSUdfQVJDSF9BVDkxUk05MjAwCisJaWYgKGNwdV9pc19hdDkxcm05MjAwKCkpIHsKIAkJLyoKIAkJICogQVQ5MVJNOTIwMCBFcnJhdGEgIzM5OiBSVFMwIGlzIG5vdCBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byBQQTIxLgogCQkgKiAgV2UgbmVlZCB0byBkcml2ZSB0aGUgcGluIG1hbnVhbGx5LgpAQCAtNDc4LDcgKzQ3OCw3IEBACiAvKgogICogQ2hhbmdlIHRoZSBwb3J0IHBhcmFtZXRlcnMKICAqLwotc3RhdGljIHZvaWQgYXRtZWxfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKiB0ZXJtaW9zLCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCkKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqIHRlcm1pb3MsIHN0cnVjdCBrdGVybWlvcyAqIG9sZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBtb2RlLCBpbXIsIHF1b3QsIGJhdWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuaCBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5oCmluZGV4IGVjZWQyYWQuLmZlMTc2M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5oCkBAIC0zMSw4ICszMSw4IEBACiAjZGVmaW5lCQlBVE1FTF9VU19SU1RJVAkJKDEgPDwgMTMpCQkvKiBSZXNldCBJdGVyYXRpb25zICovCiAjZGVmaW5lCQlBVE1FTF9VU19SU1ROQUNLCSgxIDw8IDE0KQkJLyogUmVzZXQgTm9uIEFja25vd2xlZGdlICovCiAjZGVmaW5lCQlBVE1FTF9VU19SRVRUTwkJKDEgPDwgMTUpCQkvKiBSZWFybSBUaW1lLW91dCAqLwotI2RlZmluZQkJQVRNRUxfVVNfRFRSRU4JCSgxIDw8IDE2KQkJLyogRGF0YSBUZXJtaW5hbCBSZWFkeSBFbmFibGUgKi8KLSNkZWZpbmUJCUFUTUVMX1VTX0RUUkRJUwkJKDEgPDwgMTcpCQkvKiBEYXRhIFRlcm1pbmFsIFJlYWR5IERpc2FibGUgKi8KKyNkZWZpbmUJCUFUTUVMX1VTX0RUUkVOCQkoMSA8PCAxNikJCS8qIERhdGEgVGVybWluYWwgUmVhZHkgRW5hYmxlIFtBVDkxUk05MjAwIG9ubHldICovCisjZGVmaW5lCQlBVE1FTF9VU19EVFJESVMJCSgxIDw8IDE3KQkJLyogRGF0YSBUZXJtaW5hbCBSZWFkeSBEaXNhYmxlIFtBVDkxUk05MjAwIG9ubHldICovCiAjZGVmaW5lCQlBVE1FTF9VU19SVFNFTgkJKDEgPDwgMTgpCQkvKiBSZXF1ZXN0IFRvIFNlbmQgRW5hYmxlICovCiAjZGVmaW5lCQlBVE1FTF9VU19SVFNESVMJCSgxIDw8IDE5KQkJLyogUmVxdWVzdCBUbyBTZW5kIERpc2FibGUgKi8KIApAQCAtOTIsOSArOTIsOSBAQAogI2RlZmluZQkJQVRNRUxfVVNfVFhCVUZFCQkoMSA8PCAxMSkJCS8qIFRyYW5zbWlzc2lvbiBCdWZmZXIgRW1wdHkgKi8KICNkZWZpbmUJCUFUTUVMX1VTX1JYQlVGRgkJKDEgPDwgMTIpCQkvKiBSZWNlcHRpb24gQnVmZmVyIEZ1bGwgKi8KICNkZWZpbmUJCUFUTUVMX1VTX05BQ0sJCSgxIDw8IDEzKQkJLyogTm9uIEFja25vd2xlZGdlICovCi0jZGVmaW5lCQlBVE1FTF9VU19SSUlDCQkoMSA8PCAxNikJCS8qIFJpbmcgSW5kaWNhdG9yIElucHV0IENoYW5nZSAqLwotI2RlZmluZQkJQVRNRUxfVVNfRFNSSUMJCSgxIDw8IDE3KQkJLyogRGF0YSBTZXQgUmVhZHkgSW5wdXQgQ2hhbmdlICovCi0jZGVmaW5lCQlBVE1FTF9VU19EQ0RJQwkJKDEgPDwgMTgpCQkvKiBEYXRhIENhcnJpZXIgRGV0ZWN0IElucHV0IENoYW5nZSAqLworI2RlZmluZQkJQVRNRUxfVVNfUklJQwkJKDEgPDwgMTYpCQkvKiBSaW5nIEluZGljYXRvciBJbnB1dCBDaGFuZ2UgW0FUOTFSTTkyMDAgb25seV0gKi8KKyNkZWZpbmUJCUFUTUVMX1VTX0RTUklDCQkoMSA8PCAxNykJCS8qIERhdGEgU2V0IFJlYWR5IElucHV0IENoYW5nZSBbQVQ5MVJNOTIwMCBvbmx5XSAqLworI2RlZmluZQkJQVRNRUxfVVNfRENESUMJCSgxIDw8IDE4KQkJLyogRGF0YSBDYXJyaWVyIERldGVjdCBJbnB1dCBDaGFuZ2UgW0FUOTFSTTkyMDAgb25seV0gKi8KICNkZWZpbmUJCUFUTUVMX1VTX0NUU0lDCQkoMSA8PCAxOSkJCS8qIENsZWFyIHRvIFNlbmQgSW5wdXQgQ2hhbmdlICovCiAjZGVmaW5lCQlBVE1FTF9VU19SSQkJKDEgPDwgMjApCQkvKiBSSSAqLwogI2RlZmluZQkJQVRNRUxfVVNfRFNSCQkoMSA8PCAyMSkJCS8qIERTUiAqLwpAQCAtMTA2LDYgKzEwNiw3IEBACiAjZGVmaW5lIEFUTUVMX1VTX0NTUgkJMHgxNAkJCS8qIENoYW5uZWwgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lIEFUTUVMX1VTX1JIUgkJMHgxOAkJCS8qIFJlY2VpdmVyIEhvbGRpbmcgUmVnaXN0ZXIgKi8KICNkZWZpbmUgQVRNRUxfVVNfVEhSCQkweDFjCQkJLyogVHJhbnNtaXR0ZXIgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZSAJQVRNRUxfVVNfU1lOSAkJKDEgPDwgMTUpCQkvKiBUcmFuc21pdC9SZWNlaXZlIFN5bmMgW1NBTTkgb25seV0gKi8KIAogI2RlZmluZSBBVE1FTF9VU19CUkdSCQkweDIwCQkJLyogQmF1ZCBSYXRlIEdlbmVyYXRvciBSZWdpc3RlciAqLwogI2RlZmluZQkJQVRNRUxfVVNfQ0QJCSgweGZmZmYgPDwgMCkJCS8qIENsb2NrIERpdmlkZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NscHM3MTF4LmMgYi9kcml2ZXJzL3NlcmlhbC9jbHBzNzExeC5jCmluZGV4IDU5ODAxMjcuLjIzODI3MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NscHM3MTF4LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY2xwczcxMXguYwpAQCAtMjg2LDggKzI4Niw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1jbHBzNzExeHVhcnRfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JCQkgc3RydWN0IHRlcm1pb3MgKm9sZCkKK2NscHM3MTF4dWFydF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCQkgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJdW5zaWduZWQgaW50IHVicmxjciwgYmF1ZCwgcXVvdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnQuaCBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0LmgKaW5kZXggYThmODk0Yy4uNjk3MTVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnQuaAorKysgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydC5oCkBAIC04OCw3ICs4OCw3IEBACiAKIC8qIHRoZXNlIGFyZSBsb2NhdGVkIGluIHRoZWlyIHJlc3BlY3RpdmUgZmlsZXMgKi8KIHZvaWQgY3BtX2xpbmVfY3JfY21kKGludCBsaW5lLCBpbnQgY21kKTsKLWludCBjcG1fdWFydF9pbml0X3BvcnRkZXNjKHZvaWQpOworaW50IF9faW5pdCBjcG1fdWFydF9pbml0X3BvcnRkZXNjKHZvaWQpOwogaW50IGNwbV91YXJ0X2FsbG9jYnVmKHN0cnVjdCB1YXJ0X2NwbV9wb3J0ICpwaW5mbywgdW5zaWduZWQgaW50IGlzX2Nvbik7CiB2b2lkIGNwbV91YXJ0X2ZyZWVidWYoc3RydWN0IHVhcnRfY3BtX3BvcnQgKnBpbmZvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCmluZGV4IDBhYmI1NDQuLjdhM2I5N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKQEAgLTE5NSwxMCArMTk1LDggQEAKIAlpZiAoY3BtX3VhcnRfdHhfcHVtcChwb3J0KSAhPSAwKSB7CiAJCWlmIChJU19TTUMocGluZm8pKSB7CiAJCQlzbWNwLT5zbWNfc21jbSB8PSBTTUNNX1RYOwotCQkJc21jcC0+c21jX3NtY21yIHw9IFNNQ01SX1RFTjsKIAkJfSBlbHNlIHsKIAkJCXNjY3AtPnNjY19zY2NtIHw9IFVBUlRfU0NDTV9UWDsKLQkJCXBpbmZvLT5zY2NwLT5zY2NfZ3NtcmwgfD0gU0NDX0dTTVJMX0VOVDsKIAkJfQogCX0KIH0KQEAgLTQyMSw5ICs0MTksMTAgQEAKIAkvKiBTdGFydHVwIHJ4LWludCAqLwogCWlmIChJU19TTUMocGluZm8pKSB7CiAJCXBpbmZvLT5zbWNwLT5zbWNfc21jbSB8PSBTTUNNX1JYOwotCQlwaW5mby0+c21jcC0+c21jX3NtY21yIHw9IFNNQ01SX1JFTjsKKwkJcGluZm8tPnNtY3AtPnNtY19zbWNtciB8PSAoU01DTVJfUkVOIHwgU01DTVJfVEVOKTsKIAl9IGVsc2UgewogCQlwaW5mby0+c2NjcC0+c2NjX3NjY20gfD0gVUFSVF9TQ0NNX1JYOworCQlwaW5mby0+c2NjcC0+c2NjX2dzbXJsIHw9IChTQ0NfR1NNUkxfRU5SIHwgU0NDX0dTTVJMX0VOVCk7CiAJfQogCiAJaWYgKCEocGluZm8tPmZsYWdzICYgRkxBR19DT05TT0xFKSkKQEAgLTEzNTAsMTEgKzEzNDksMTAgQEAKIAkJcHJfaW5mbygiY3BtX3VhcnQ6IFdBUk5JTkc6IG5vIFVBUlQgZGV2aWNlcyBmb3VuZCBvbiBwbGF0Zm9ybSBidXMhXG4iKTsKIAkJcHJfaW5mbygKIAkJImNwbV91YXJ0OiB0aGUgZHJpdmVyIHdpbGwgZ3Vlc3MgY29uZmlndXJhdGlvbiwgYnV0IHRoaXMgbW9kZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlxuIik7Ci0jaWZuZGVmIENPTkZJR19TRVJJQUxfQ1BNX0NPTlNPTEUKLQkJcmV0ID0gY3BtX3VhcnRfaW5pdF9wb3J0ZGVzYygpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLSNlbmRpZgorCisJCS8qIERvbid0IHJ1biB0aGlzIGFnYWluLCBpZiB0aGUgY29uc29sZSBkcml2ZXIgZGlkIGl0IGFscmVhZHkgKi8KKwkJaWYgKGNwbV91YXJ0X25yID09IDApCisJCQljcG1fdWFydF9pbml0X3BvcnRkZXNjKCk7CiAKIAkJY3BtX3JlZy5uciA9IGNwbV91YXJ0X25yOwogCQlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmY3BtX3JlZyk7CkBAIC0xMzY2LDYgKzEzNjQsOCBAQAogCQkJaW50IGNvbiA9IGNwbV91YXJ0X3BvcnRfbWFwW2ldOwogCQkJY3BtX3VhcnRfcG9ydHNbY29uXS5wb3J0LmxpbmUgPSBpOwogCQkJY3BtX3VhcnRfcG9ydHNbY29uXS5wb3J0LmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkY7CisJCQlpZiAoY3BtX3VhcnRfcG9ydHNbY29uXS5zZXRfbGluZWlmKQorCQkJCWNwbV91YXJ0X3BvcnRzW2Nvbl0uc2V0X2xpbmVpZigmY3BtX3VhcnRfcG9ydHNbY29uXSk7CiAJCQl1YXJ0X2FkZF9vbmVfcG9ydCgmY3BtX3JlZywgJmNwbV91YXJ0X3BvcnRzW2Nvbl0ucG9ydCk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMS5jIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMS5jCmluZGV4IDk1YWZjMzcuLjA4ZTU1ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTEuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogfQogCiAvKiBTZXR1cCBhbnkgZHluYW1pYyBwYXJhbXMgaW4gdGhlIHVhcnQgZGVzYyAqLwotaW50IGNwbV91YXJ0X2luaXRfcG9ydGRlc2Modm9pZCkKK2ludCBfX2luaXQgY3BtX3VhcnRfaW5pdF9wb3J0ZGVzYyh2b2lkKQogewogCXByX2RlYnVnKCJDUE0gdWFydFstXTppbml0IHBvcnRkZXNjXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMi5jIGIvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMi5jCmluZGV4IGI2OTFkM2UuLjc4N2E4ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTIuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0yLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogfQogCiAvKiBTZXR1cCBhbnkgZHluYW1pYyBwYXJhbXMgaW4gdGhlIHVhcnQgZGVzYyAqLwotaW50IGNwbV91YXJ0X2luaXRfcG9ydGRlc2Modm9pZCkKK2ludCBfX2luaXQgY3BtX3VhcnRfaW5pdF9wb3J0ZGVzYyh2b2lkKQogewogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9DUE1fU01DMSkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0NQTV9TTUMyKQogCXUzMiBhZGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCmluZGV4IDdhMjRlNTMuLjQyYjA1MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKQEAgLTgwNCw4ICs4MDQsOCBAQAogCiAjZGVmaW5lIE5SX1BPUlRTIChzaXplb2YocnNfdGFibGUpL3NpemVvZihzdHJ1Y3QgZTEwMF9zZXJpYWwpKQogCi1zdGF0aWMgc3RydWN0IHRlcm1pb3MgKnNlcmlhbF90ZXJtaW9zW05SX1BPUlRTXTsKLXN0YXRpYyBzdHJ1Y3QgdGVybWlvcyAqc2VyaWFsX3Rlcm1pb3NfbG9ja2VkW05SX1BPUlRTXTsKK3N0YXRpYyBzdHJ1Y3Qga3Rlcm1pb3MgKnNlcmlhbF90ZXJtaW9zW05SX1BPUlRTXTsKK3N0YXRpYyBzdHJ1Y3Qga3Rlcm1pb3MgKnNlcmlhbF90ZXJtaW9zX2xvY2tlZFtOUl9QT1JUU107CiAjaWZkZWYgQ09ORklHX0VUUkFYX1NFUklBTF9GQVNUX1RJTUVSCiBzdGF0aWMgc3RydWN0IGZhc3RfdGltZXIgZmFzdF90aW1lcnNbTlJfUE9SVFNdOwogI2VuZGlmCkBAIC00MjIzLDcgKzQyMjMsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcnNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorcnNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgZTEwMF9zZXJpYWwgKmluZm8gPSAoc3RydWN0IGUxMDBfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKIApAQCAtNDg3Nyw2ICs0ODc3LDggQEAKIAlkcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKIAlkcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KIAkJQjExNTIwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7IC8qIGlzIG5vcm1hbGx5IEI5NjAwIGRlZmF1bHQuLi4gKi8KKwlkcml2ZXItPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IDExNTIwMDsKKwlkcml2ZXItPmluaXRfdGVybWlvcy5jX29zcGVlZCA9IDExNTIwMDsKIAlkcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CiAJZHJpdmVyLT50ZXJtaW9zID0gc2VyaWFsX3Rlcm1pb3M7CiAJZHJpdmVyLT50ZXJtaW9zX2xvY2tlZCA9IHNlcmlhbF90ZXJtaW9zX2xvY2tlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuaCBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuaAppbmRleCBmMzBiOTNkLi40YTIzMzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmgKKysrIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5oCkBAIC05Myw4ICs5Myw4IEBACiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50CWljb3VudDsgICAvKiBlcnJvci1zdGF0aXN0aWNzIGV0Yy4qLwotCXN0cnVjdCB0ZXJtaW9zCQlub3JtYWxfdGVybWlvczsKLQlzdHJ1Y3QgdGVybWlvcwkJY2FsbG91dF90ZXJtaW9zOworCXN0cnVjdCBrdGVybWlvcwkJbm9ybWFsX3Rlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zCQljYWxsb3V0X3Rlcm1pb3M7CiAjaWZkZWYgREVDTEFSRV9XQUlUUVVFVUUKIAl3YWl0X3F1ZXVlX2hlYWRfdAlvcGVuX3dhaXQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJY2xvc2Vfd2FpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2R6LmMgYi9kcml2ZXJzL3NlcmlhbC9kei5jCmluZGV4IDUzNjYyYjMuLjU4N2Q4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2R6LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvZHouYwpAQCAtMSwxMSArMSwxMyBAQAogLyoKLSAqIGR6LmM6IFNlcmlhbCBwb3J0IGRyaXZlciBmb3IgREVDU3RhdGlvbnMgZXF1aXBlZAorICogZHouYzogU2VyaWFsIHBvcnQgZHJpdmVyIGZvciBERUNzdGF0aW9ucyBlcXVpcHBlZAogICogICAgICAgd2l0aCB0aGUgRFogY2hpcHNldC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTggT2xpdmllciBBLiBELiBMZWJhaWxsaWYKICAqCiAgKiBFbWFpbDogb2xpdmllci5sZWJhaWxsaWZAaWZyc3lzLmNvbQogICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNiAgTWFjaWVqIFcuIFJvenlja2kKKyAqCiAgKiBbMzEtQVVHLTk4XSB0cmllbWVyCiAgKiBDaGFuZ2VkIElSUSB0byB1c2UgSGFyYWxkJ3MgZGVjIGludGVybmFscyBpbnRlcnJ1cHRzLmgKICAqIHJlbW92ZWQgYmFzZV9hZGRyIGNvZGUgLSBtb3ZpbmcgYWRkcmVzcyBhc3NpZ25tZW50IHRvIHNldHVwLmMKQEAgLTI2LDEwICsyOCwxNiBAQAogCiAjdW5kZWYgREVCVUdfRFoKIAorI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9EWl9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19NQUdJQ19TWVNSUSkKKyNkZWZpbmUgU1VQUE9SVF9TWVNSUQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CkBAIC00NSwxNCArNTMsMTAgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2RlZmluZSBDT05TT0xFX0xJTkUgKDMpCS8qIGZvciBkZWZpbml0aW9uIG9mIHN0cnVjdCBjb25zb2xlICovCi0KICNpbmNsdWRlICJkei5oIgogCi0jZGVmaW5lIERaX0lOVFJfREVCVUcgMQotCiBzdGF0aWMgY2hhciAqZHpfbmFtZSA9ICJERUNzdGF0aW9uIERaIHNlcmlhbCBkcml2ZXIgdmVyc2lvbiAiOwotc3RhdGljIGNoYXIgKmR6X3ZlcnNpb24gPSAiMS4wMiI7CitzdGF0aWMgY2hhciAqZHpfdmVyc2lvbiA9ICIxLjAzIjsKIAogc3RydWN0IGR6X3BvcnQgewogCXN0cnVjdCB1YXJ0X3BvcnQJcG9ydDsKQEAgLTYxLDIyICs2NSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHpfcG9ydCBkel9wb3J0c1tEWl9OQl9QT1JUXTsKIAotI2lmZGVmIERFQlVHX0RaCi0vKgotICogZGVidWdnaW5nIGNvZGUgdG8gc2VuZCBvdXQgY2hhcnMgdmlhIHByb20KLSAqLwotc3RhdGljIHZvaWQgZGVidWdfY29uc29sZShjb25zdCBjaGFyICpzLCBpbnQgY291bnQpCi17Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmICgqcyA9PSAxMCkKLQkJCXByb21fcHJpbnRmKCIlYyIsIDEzKTsKLQkJcHJvbV9wcmludGYoIiVjIiwgKnMrKyk7Ci0JfQotfQotI2VuZGlmCi0KIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIGR6X2luICgpIGFuZCBkel9vdXQgKCkKQEAgLTkwLDYgKzc4LDcgQEAKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqYWRkciA9CiAJCSh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSAoZHBvcnQtPnBvcnQubWVtYmFzZSArIG9mZnNldCk7CisKIAlyZXR1cm4gKmFkZHI7CiB9CiAKQEAgLTk4LDYgKzg3LDcgQEAKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqYWRkciA9CiAJCSh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSAoZHBvcnQtPnBvcnQubWVtYmFzZSArIG9mZnNldCk7CisKIAkqYWRkciA9IHZhbHVlOwogfQogCkBAIC0xNDQsNyArMTM0LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJZHBvcnQtPmNmbGFnICY9IH5EWl9DUkVBRDsKLQlkel9vdXQoZHBvcnQsIERaX0xQUiwgZHBvcnQtPmNmbGFnKTsKKwlkel9vdXQoZHBvcnQsIERaX0xQUiwgZHBvcnQtPmNmbGFnIHwgZHBvcnQtPnBvcnQubGluZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHBvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwogfQogCkBAIC0xNTUsMTQgKzE0NSwxNCBAQAogCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBIZXJlIHN0YXJ0cyB0aGUgaW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmVzLiAgQWxsIG9mIHRoZQotICogZm9sbG93aW5nIHN1YnJvdXRpbmVzIGFyZSBkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGFyZSBmb2xkZWQKLSAqIGludG8gZHpfaW50ZXJydXB0LiAgVGhleSB3ZXJlIHNlcGFyYXRlZCBvdXQgZm9yIHJlYWRhYmlsaXR5J3MKLSAqIHNha2UuCiAgKgotICogTm90ZTogcnNfaW50ZXJydXB0KCkgaXMgYSAiZmFzdCIgaW50ZXJydXB0LCB3aGljaCBtZWFucyB0aGF0IGl0CisgKiBIZXJlIHN0YXJ0IHRoZSBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZXMuICBBbGwgb2YgdGhlIGZvbGxvd2luZworICogc3Vicm91dGluZXMgYXJlIGRlY2xhcmVkIGFzIGlubGluZSBhbmQgYXJlIGZvbGRlZCBpbnRvCisgKiBkel9pbnRlcnJ1cHQuICBUaGV5IHdlcmUgc2VwYXJhdGVkIG91dCBmb3IgcmVhZGFiaWxpdHkncyBzYWtlLgorICoKKyAqIE5vdGU6IGR6X2ludGVycnVwdCgpIGlzIGEgImZhc3QiIGludGVycnVwdCwgd2hpY2ggbWVhbnMgdGhhdCBpdAogICogcnVucyB3aXRoIGludGVycnVwdHMgdHVybmVkIG9mZi4gIFBlb3BsZSB3aG8gbWF5IHdhbnQgdG8gbW9kaWZ5Ci0gKiByc19pbnRlcnJ1cHQoKSBzaG91bGQgdHJ5IHRvIGtlZXAgdGhlIGludGVycnVwdCBoYW5kbGVyIGFzIGZhc3QgYXMKKyAqIGR6X2ludGVycnVwdCgpIHNob3VsZCB0cnkgdG8ga2VlcCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYXMgZmFzdCBhcwogICogcG9zc2libGUuICBBZnRlciB5b3UgYXJlIGRvbmUgbWFraW5nIG1vZGlmaWNhdGlvbnMsIGl0IGlzIG5vdCBhIGJhZAogICogaWRlYSB0byBkbzoKICAqCkBAIC0xODAsOTIgKzE3MCw3NCBAQAogICogVGhpcyByb3V0aW5lIGRlYWxzIHdpdGggaW5wdXRzIGZyb20gYW55IGxpbmVzLgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkel9yZWNlaXZlX2NoYXJzKHN0cnVjdCBkel9wb3J0ICpkcG9ydCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkel9yZWNlaXZlX2NoYXJzKHN0cnVjdCBkel9wb3J0ICpkcG9ydF9pbiwKKwkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBOVUxMOwogCXN0cnVjdCB1YXJ0X2ljb3VudCAqaWNvdW50OwotCWludCBpZ25vcmUgPSAwOwotCXVuc2lnbmVkIHNob3J0IHN0YXR1cywgdG1wOworCWludCBsaW5lc19yeFtEWl9OQl9QT1JUXSA9IHsgWzAgLi4uIERaX05CX1BPUlQgLSAxXSA9IDAgfTsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CiAJdW5zaWduZWQgY2hhciBjaCwgZmxhZzsKKwlpbnQgaTsKIAotCS8qIHRoaXMgY29kZSBpcyBnb2luZyB0byBiZSBhIHByb2JsZW0uLi4KLQkgICB0aGUgY2FsbCB0byB0dHlfZmxpcF9idWZmZXIgaXMgZ29pbmcgdG8gbmVlZAotCSAgIHRvIGJlIHJldGhvdWdodC4uLgotCSAqLwotCWRvIHsKLQkJc3RhdHVzID0gZHpfaW4oZHBvcnQsIERaX1JCVUYpOworCXdoaWxlICgoc3RhdHVzID0gZHpfaW4oZHBvcnRfaW4sIERaX1JCVUYpKSAmIERaX0RWQUwpIHsKKwkJZHBvcnQgPSAmZHpfcG9ydHNbTElORShzdGF0dXMpXTsKKwkJdHR5ID0gZHBvcnQtPnBvcnQuaW5mby0+dHR5OwkvKiBwb2ludCB0byB0aGUgcHJvcGVyIGRldiAqLwogCi0JCS8qIHB1bnQgc28gd2UgZG9uJ3QgZ2V0IGR1cGxpY2F0ZSBjaGFyYWN0ZXJzICovCi0JCWlmICghKHN0YXR1cyAmIERaX0RWQUwpKQotCQkJZ290byBpZ25vcmVfY2hhcjsKKwkJY2ggPSBVQ0hBUihzdGF0dXMpOwkJLyogZ3JhYiB0aGUgY2hhciAqLwogCi0KLQkJY2ggPSBVQ0hBUihzdGF0dXMpOwkvKiBncmFiIHRoZSBjaGFyICovCi0JCWZsYWcgPSBUVFlfTk9STUFMOwotCi0jaWYgMAotCQlpZiAoaW5mby0+aXNfY29uc29sZSkgewotCQkJaWYgKGNoID09IDApCi0JCQkJcmV0dXJuOwkJLyogaXQncyBhIGJyZWFrIC4uLiAqLwotCQl9Ci0jZW5kaWYKLQotCQl0dHkgPSBkcG9ydC0+cG9ydC5pbmZvLT50dHk7Lyogbm93IHR0eSBwb2ludHMgdG8gdGhlIHByb3BlciBkZXYgKi8KIAkJaWNvdW50ID0gJmRwb3J0LT5wb3J0Lmljb3VudDsKLQotCQlpZiAoIXR0eSkKLQkJCWJyZWFrOwotCiAJCWljb3VudC0+cngrKzsKIAotCQkvKiBrZWVwIHRyYWNrIG9mIHRoZSBzdGF0aXN0aWNzICovCi0JCWlmIChzdGF0dXMgJiAoRFpfT0VSUiB8IERaX0ZFUlIgfCBEWl9QRVJSKSkgewotCQkJaWYgKHN0YXR1cyAmIERaX1BFUlIpCS8qIHBhcml0eSBlcnJvciAqLwotCQkJCWljb3VudC0+cGFyaXR5Kys7Ci0JCQllbHNlIGlmIChzdGF0dXMgJiBEWl9GRVJSKQkvKiBmcmFtZSBlcnJvciAqLwotCQkJCWljb3VudC0+ZnJhbWUrKzsKLQkJCWlmIChzdGF0dXMgJiBEWl9PRVJSKQkvKiBvdmVycnVuIGVycm9yICovCi0JCQkJaWNvdW50LT5vdmVycnVuKys7Ci0KLQkJCS8qICBjaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGlnbm9yZSB0aGUgY2hhcmFjdGVyCi0JCQkgICBhbmQgbWFzayBvZmYgY29uZGl0aW9ucyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisJCWZsYWcgPSBUVFlfTk9STUFMOworCQlpZiAoc3RhdHVzICYgRFpfRkVSUikgewkJLyogZnJhbWUgZXJyb3IgKi8KKwkJCS8qCisJCQkgKiBUaGVyZSBpcyBubyBzZXBhcmF0ZSBCUkVBSyBzdGF0dXMgYml0LCBzbworCQkJICogdHJlYXQgZnJhbWluZyBlcnJvcnMgYXMgQlJFQUtzIGZvciBNYWdpYyBTeXNScQorCQkJICogYW5kIFNBSzsgbm9ybWFsbHksIG90aGVyd2lzZS4KIAkJCSAqLwotCi0JCQlpZiAoc3RhdHVzICYgZHBvcnQtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrKSB7Ci0JCQkJaWYgKCsraWdub3JlID4gMTAwKQotCQkJCQlicmVhazsKLQkJCQlnb3RvIGlnbm9yZV9jaGFyOwotCQkJfQotCQkJLyogbWFzayBvZmYgdGhlIGVycm9yIGNvbmRpdGlvbnMgd2Ugd2FudCB0byBpZ25vcmUgKi8KLQkJCXRtcCA9IHN0YXR1cyAmIGRwb3J0LT5wb3J0LnJlYWRfc3RhdHVzX21hc2s7Ci0KLQkJCWlmICh0bXAgJiBEWl9QRVJSKSB7Ci0JCQkJZmxhZyA9IFRUWV9QQVJJVFk7Ci0jaWZkZWYgREVCVUdfRFoKLQkJCQlkZWJ1Z19jb25zb2xlKCJQRVJSXG4iLCA1KTsKLSNlbmRpZgotCQkJfSBlbHNlIGlmICh0bXAgJiBEWl9GRVJSKSB7CisJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsoJmRwb3J0LT5wb3J0KSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChkcG9ydC0+cG9ydC5mbGFncyAmIFVQRl9TQUspCisJCQkJZmxhZyA9IFRUWV9CUkVBSzsKKwkJCWVsc2UKIAkJCQlmbGFnID0gVFRZX0ZSQU1FOwotI2lmZGVmIERFQlVHX0RaCi0JCQkJZGVidWdfY29uc29sZSgiRkVSUlxuIiwgNSk7Ci0jZW5kaWYKLQkJCX0KLQkJCWlmICh0bXAgJiBEWl9PRVJSKSB7Ci0jaWZkZWYgREVCVUdfRFoKLQkJCQlkZWJ1Z19jb25zb2xlKCJPRVJSXG4iLCA1KTsKLSNlbmRpZgotCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIGZsYWcpOwotCQkJCWNoID0gMDsKLQkJCQlmbGFnID0gVFRZX09WRVJSVU47Ci0JCQl9Ci0JCX0KLQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7Ci0JICAgICAgaWdub3JlX2NoYXI6Ci0JCQk7Ci0JfSB3aGlsZSAoc3RhdHVzICYgRFpfRFZBTCk7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgRFpfT0VSUikJLyogb3ZlcnJ1biBlcnJvciAqLworCQkJZmxhZyA9IFRUWV9PVkVSUlVOOworCQllbHNlIGlmIChzdGF0dXMgJiBEWl9QRVJSKQkvKiBwYXJpdHkgZXJyb3IgKi8KKwkJCWZsYWcgPSBUVFlfUEFSSVRZOwogCi0JaWYgKHR0eSkKLQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJLyoga2VlcCB0cmFjayBvZiB0aGUgc3RhdGlzdGljcyAqLworCQlzd2l0Y2ggKGZsYWcpIHsKKwkJY2FzZSBUVFlfRlJBTUU6CisJCQlpY291bnQtPmZyYW1lKys7CisJCQlicmVhazsKKwkJY2FzZSBUVFlfUEFSSVRZOgorCQkJaWNvdW50LT5wYXJpdHkrKzsKKwkJCWJyZWFrOworCQljYXNlIFRUWV9PVkVSUlVOOgorCQkJaWNvdW50LT5vdmVycnVuKys7CisJCQlicmVhazsKKwkJY2FzZSBUVFlfQlJFQUs6CisJCQlpY291bnQtPmJyaysrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKCZkcG9ydC0+cG9ydCwgY2gsIHJlZ3MpKQorCQkJY29udGludWU7CisKKwkJaWYgKChzdGF0dXMgJiBkcG9ydC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2spID09IDApIHsKKwkJCXVhcnRfaW5zZXJ0X2NoYXIoJmRwb3J0LT5wb3J0LAorCQkJCQkgc3RhdHVzLCBEWl9PRVJSLCBjaCwgZmxhZyk7CisJCQlsaW5lc19yeFtMSU5FKHN0YXR1cyldID0gMTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgRFpfTkJfUE9SVDsgaSsrKQorCQlpZiAobGluZXNfcnhbaV0pCisJCQl0dHlfZmxpcF9idWZmZXJfcHVzaChkel9wb3J0c1tpXS5wb3J0LmluZm8tPnR0eSk7CiB9CiAKIC8qCkBAIC0yNzUsMjYgKzI0NywzMiBAQAogICogVGhpcyByb3V0aW5lIGRlYWxzIHdpdGggb3V0cHV0cyB0byBhbnkgbGluZXMuCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGR6X3RyYW5zbWl0X2NoYXJzKHN0cnVjdCBkel9wb3J0ICpkcG9ydCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkel90cmFuc21pdF9jaGFycyhzdHJ1Y3QgZHpfcG9ydCAqZHBvcnRfaW4pCiB7Ci0Jc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJmRwb3J0LT5wb3J0LmluZm8tPnhtaXQ7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0OworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CiAJdW5zaWduZWQgY2hhciB0bXA7CiAKLQlpZiAoZHBvcnQtPnBvcnQueF9jaGFyKSB7CS8qIFhPTi9YT0ZGIGNoYXJzICovCisJc3RhdHVzID0gZHpfaW4oZHBvcnRfaW4sIERaX0NTUik7CisJZHBvcnQgPSAmZHpfcG9ydHNbTElORShzdGF0dXMpXTsKKwl4bWl0ID0gJmRwb3J0LT5wb3J0LmluZm8tPnhtaXQ7CisKKwlpZiAoZHBvcnQtPnBvcnQueF9jaGFyKSB7CQkvKiBYT04vWE9GRiBjaGFycyAqLwogCQlkel9vdXQoZHBvcnQsIERaX1REUiwgZHBvcnQtPnBvcnQueF9jaGFyKTsKIAkJZHBvcnQtPnBvcnQuaWNvdW50LnR4Kys7CiAJCWRwb3J0LT5wb3J0LnhfY2hhciA9IDA7CiAJCXJldHVybjsKIAl9Ci0JLyogaWYgbm90aGluZyB0byBkbyBvciBzdG9wcGVkIG9yIGhhcmR3YXJlIHN0b3BwZWQgKi8KKwkvKiBJZiBub3RoaW5nIHRvIGRvIG9yIHN0b3BwZWQgb3IgaGFyZHdhcmUgc3RvcHBlZC4gKi8KIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmZHBvcnQtPnBvcnQpKSB7CiAJCWR6X3N0b3BfdHgoJmRwb3J0LT5wb3J0KTsKIAkJcmV0dXJuOwogCX0KIAogCS8qCi0JICogaWYgc29tZXRoaW5nIHRvIGRvIC4uLiAocmVtYmVyIHRoZSBkeiBoYXMgbm8gb3V0cHV0IGZpZm8gc28gd2UgZ28KLQkgKiBvbmUgY2hhciBhdCBhIHRpbWUgOi08CisJICogSWYgc29tZXRoaW5nIHRvIGRvLi4uIChyZW1lbWJlciB0aGUgZHogaGFzIG5vIG91dHB1dCBmaWZvLAorCSAqIHNvIHdlIGdvIG9uZSBjaGFyIGF0IGEgdGltZSkgOi08CiAJICovCiAJdG1wID0geG1pdC0+YnVmW3htaXQtPnRhaWxdOwogCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKERaX1hNSVRfU0laRSAtIDEpOwpAQCAtMzA0LDIzICsyODIsMjkgQEAKIAlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBEWl9XQUtFVVBfQ0hBUlMpCiAJCXVhcnRfd3JpdGVfd2FrZXVwKCZkcG9ydC0+cG9ydCk7CiAKLQkvKiBBcmUgd2UgZG9uZSAqLworCS8qIEFyZSB3ZSBhcmUgZG9uZS4gKi8KIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQogCQlkel9zdG9wX3R4KCZkcG9ydC0+cG9ydCk7CiB9CiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGNoZWNrX21vZGVtX3N0YXR1cyAoKQorICogY2hlY2tfbW9kZW1fc3RhdHVzKCkKICAqCi0gKiBPbmx5IHZhbGlkIGZvciB0aGUgTU9ERU0gbGluZSBkdWggIQorICogRFMgMzEwMCAmIDUxMDA6IE9ubHkgdmFsaWQgZm9yIHRoZSBNT0RFTSBsaW5lLCBkdWghCisgKiBEUyA1MDAwLzIwMDogVmFsaWQgZm9yIHRoZSBNT0RFTSBhbmQgUFJJTlRFUiBsaW5lLgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IGR6X3BvcnQgKmRwb3J0KQogeworCS8qCisJICogRklYTUU6CisJICogMS4gTm8gc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQ7IHVzZSBhIHRpbWVyLgorCSAqIDIuIEhhbmRsZSB0aGUgMzEwMC81MDAwIGFzIGFwcHJvcHJpYXRlLiAtLW1hY3JvCisJICovCiAJdW5zaWduZWQgc2hvcnQgc3RhdHVzOwogCi0JLyogaWYgbm90IG5lIG1vZGVtIGxpbmUganVzdCByZXR1cm4gKi8KKwkvKiBJZiBub3QgdGhlIG1vZGVtIGxpbmUganVzdCByZXR1cm4uICAqLwogCWlmIChkcG9ydC0+cG9ydC5saW5lICE9IERaX01PREVNKQogCQlyZXR1cm47CiAKQEAgLTM0MSwyMSArMzI1LDE4IEBACiAgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBkel9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQogewotCXN0cnVjdCBkel9wb3J0ICpkcG9ydDsKKwlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAoc3RydWN0IGR6X3BvcnQgKilkZXY7CiAJdW5zaWduZWQgc2hvcnQgc3RhdHVzOwogCiAJLyogZ2V0IHRoZSByZWFzb24gd2h5IHdlIGp1c3QgZ290IGFuIGlycSAqLwotCXN0YXR1cyA9IGR6X2luKChzdHJ1Y3QgZHpfcG9ydCAqKWRldiwgRFpfQ1NSKTsKLQlkcG9ydCA9ICZkel9wb3J0c1tMSU5FKHN0YXR1cyldOworCXN0YXR1cyA9IGR6X2luKGRwb3J0LCBEWl9DU1IpOwogCi0JaWYgKHN0YXR1cyAmIERaX1JET05FKQotCQlkel9yZWNlaXZlX2NoYXJzKGRwb3J0KTsKKwlpZiAoKHN0YXR1cyAmIChEWl9SRE9ORSB8IERaX1JJRSkpID09IChEWl9SRE9ORSB8IERaX1JJRSkpCisJCWR6X3JlY2VpdmVfY2hhcnMoZHBvcnQsIHJlZ3MpOwogCi0JaWYgKHN0YXR1cyAmIERaX1RSRFkpCisJaWYgKChzdGF0dXMgJiAoRFpfVFJEWSB8IERaX1RJRSkpID09IChEWl9UUkRZIHwgRFpfVElFKSkKIAkJZHpfdHJhbnNtaXRfY2hhcnMoZHBvcnQpOwogCi0JLyogRklYTUU6IHdoYXQgYWJvdXQgY2hlY2sgbW9kZW0gc3RhdHVzPz8/IC0tcm1rICovCi0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTM2NywxMyArMzQ4LDEzIEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZHpfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQogeworCS8qCisJICogRklYTUU6IEhhbmRsZSB0aGUgMzEwMC81MDAwIGFzIGFwcHJvcHJpYXRlLiAtLW1hY3JvCisJICovCiAJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gKHN0cnVjdCBkel9wb3J0ICopdXBvcnQ7CiAJdW5zaWduZWQgaW50IG1jdHJsID0gVElPQ01fQ0FSIHwgVElPQ01fRFNSIHwgVElPQ01fQ1RTOwogCiAJaWYgKGRwb3J0LT5wb3J0LmxpbmUgPT0gRFpfTU9ERU0pIHsKLQkJLyoKLQkJICogQ0hFQ0tNRTogVGhpcyBpcyBhIGd1ZXNzIGZyb20gdGhlIG90aGVyIGNvZGUuLi4gLS1ybWsKLQkJICovCiAJCWlmIChkel9pbihkcG9ydCwgRFpfTVNSKSAmIERaX01PREVNX0RTUikKIAkJCW1jdHJsICY9IH5USU9DTV9EU1I7CiAJfQpAQCAtMzgzLDYgKzM2NCw5IEBACiAKIHN0YXRpYyB2b2lkIGR6X3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQogeworCS8qCisJICogRklYTUU6IEhhbmRsZSB0aGUgMzEwMC81MDAwIGFzIGFwcHJvcHJpYXRlLiAtLW1hY3JvCisJICovCiAJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gKHN0cnVjdCBkel9wb3J0ICopdXBvcnQ7CiAJdW5zaWduZWQgc2hvcnQgdG1wOwogCkBAIC00MDksMTMgKzM5Myw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCB0bXA7CiAKLQkvKiBUaGUgZHogbGluZXMgZm9yIHRoZSBtb3VzZS9rZXlib2FyZCBtdXN0IGJlCi0JICogb3BlbmVkIHVzaW5nIHRoZWlyIHJlc3BlY3RpdmUgZHJpdmVycy4KLQkgKi8KLQlpZiAoKGRwb3J0LT5wb3J0LmxpbmUgPT0gRFpfS0VZQk9BUkQpIHx8Ci0JICAgIChkcG9ydC0+cG9ydC5saW5lID09IERaX01PVVNFKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHBvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgYW5kIHRoZSBzY2FubmluZyAqLwpAQCAtNDQyLDcgKzQxOSw4IEBACiB9CiAKIC8qCi0gKiBnZXRfbHNyX2luZm8gLSBnZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgaW5mbworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZHpfdHhfZW1wdHkoKSAtLSBnZXQgdGhlIHRyYW5zbWl0dGVyIGVtcHR5IHN0YXR1cwogICoKICAqIFB1cnBvc2U6IExldCB1c2VyIGNhbGwgaW9jdGwoKSB0byBnZXQgaW5mbyB3aGVuIHRoZSBVQVJUIHBoeXNpY2FsbHkKICAqICAgICAgICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKQEAgLTQ1MCwyMSArNDI4LDI4IEBACiAgKiAgICAgICAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCiAgKiAgICAgICAgICB0cmFuc21pdCBob2xkaW5nIHJlZ2lzdGVyIGlzIGVtcHR5LiAgVGhpcyBmdW5jdGlvbmFsaXR5CiAgKiAgICAgICAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBkel90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKIHsKIAlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAoc3RydWN0IGR6X3BvcnQgKil1cG9ydDsKLQl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSBkel9pbihkcG9ydCwgRFpfTFBSKTsKKwl1bnNpZ25lZCBzaG9ydCB0bXAsIG1hc2sgPSAxIDw8IGRwb3J0LT5wb3J0LmxpbmU7CiAKLQkvKiBGSVhNRTogdGhpcyBhcHBlYXJzIHRvIGJlIG9idmlvdXNseSBicm9rZW4gLS1ybWsuICovCi0JcmV0dXJuIHN0YXR1cyA/IFRJT0NTRVJfVEVNVCA6IDA7CisJdG1wID0gZHpfaW4oZHBvcnQsIERaX1RDUik7CisJdG1wICY9IG1hc2s7CisKKwlyZXR1cm4gdG1wID8gMCA6IFRJT0NTRVJfVEVNVDsKIH0KIAogc3RhdGljIHZvaWQgZHpfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBpbnQgYnJlYWtfc3RhdGUpCiB7CisJLyoKKwkgKiBGSVhNRTogQ2FuJ3QgYWNjZXNzIEJSRUFLIGJpdHMgaW4gVERSIGVhc2lseTsKKwkgKiByZXVzZSB0aGUgY29kZSBmb3IgcG9sbGVkIFRYLiAtLW1hY3JvCisJICovCiAJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gKHN0cnVjdCBkel9wb3J0ICopdXBvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBzaG9ydCB0bXAsIG1hc2sgPSAxIDw8IHVwb3J0LT5saW5lOworCXVuc2lnbmVkIHNob3J0IHRtcCwgbWFzayA9IDEgPDwgZHBvcnQtPnBvcnQubGluZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOwogCXRtcCA9IGR6X2luKGRwb3J0LCBEWl9UQ1IpOwpAQCAtNDc2LDggKzQ2MSw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgZHpfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkJICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgZHpfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gKHN0cnVjdCBkel9wb3J0ICopdXBvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTU2MSw3ICs1NDYsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIAotCWR6X291dChkcG9ydCwgRFpfTFBSLCBjZmxhZyk7CisJZHpfb3V0KGRwb3J0LCBEWl9MUFIsIGNmbGFnIHwgZHBvcnQtPnBvcnQubGluZSk7CiAJZHBvcnQtPmNmbGFnID0gY2ZsYWc7CiAKIAkvKiBzZXR1cCBhY2NlcHQgZmxhZyAqLwpAQCAtNjUwLDcgKzYzNSw3IEBACiAJZm9yIChpID0gMCwgZHBvcnQgPSBkel9wb3J0czsgaSA8IERaX05CX1BPUlQ7IGkrKywgZHBvcnQrKykgewogCQlzcGluX2xvY2tfaW5pdCgmZHBvcnQtPnBvcnQubG9jayk7CiAJCWRwb3J0LT5wb3J0Lm1lbWJhc2UJPSAoY2hhciAqKSBiYXNlOwotCQlkcG9ydC0+cG9ydC5pb3R5cGUJPSBVUElPX1BPUlQ7CisJCWRwb3J0LT5wb3J0LmlvdHlwZQk9IFVQSU9fTUVNOwogCQlkcG9ydC0+cG9ydC5pcnEJCT0gZGVjX2ludGVycnVwdFtERUNfSVJRX0RaMTFdOwogCQlkcG9ydC0+cG9ydC5saW5lCT0gaTsKIAkJZHBvcnQtPnBvcnQuZmlmb3NpemUJPSAxOwpAQCAtNjYyLDEwICs2NDcsNyBAQAogc3RhdGljIHZvaWQgZHpfcmVzZXQoc3RydWN0IGR6X3BvcnQgKmRwb3J0KQogewogCWR6X291dChkcG9ydCwgRFpfQ1NSLCBEWl9DTFIpOwotCiAJd2hpbGUgKGR6X2luKGRwb3J0LCBEWl9DU1IpICYgRFpfQ0xSKTsKLQkJLyogRklYTUU6IGNwdV9yZWxheD8gKi8KLQogCWlvYigpOwogCiAJLyogZW5hYmxlIHNjYW5uaW5nICovCkBAIC02NzMsMjYgKzY1NSw1NSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NFUklBTF9EWl9DT05TT0xFCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZHpfY29uc29sZV9wdXRjaGFyKCkgLS0gdHJhbnNtaXQgYSBjaGFyYWN0ZXIKKyAqCisgKiBQb2xsZWQgdHJhbnNtaXNzaW9uLiAgVGhpcyBpcyB0cmlja3kuICBXZSBuZWVkIHRvIG1hc2sgdHJhbnNtaXQKKyAqIGludGVycnVwdHMgc28gdGhhdCB0aGV5IGRvIG5vdCBpbnRlcmZlcmUsIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIKKyAqIGZvciB0aGUgbGluZSByZXF1ZXN0ZWQgYW5kIHRoZW4gd2FpdCB0aWxsIHRoZSB0cmFuc21pdCBzY2FubmVyCisgKiByZXF1ZXN0cyBkYXRhIGZvciB0aGlzIGxpbmUuICBCdXQgaXQgbWF5IHJlcXVlc3QgZGF0YSBmb3IgYW5vdGhlcgorICogbGluZSBmaXJzdCwgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGRpc2FibGUgaXRzIHRyYW5zbWl0dGVyIGFuZAorICogcmVwZWF0IHdhaXRpbmcgdGlsbCBvdXIgbGluZSBwb3BzIHVwLiAgT25seSB0aGVuIHRoZSBjaGFyYWN0ZXIgbWF5CisgKiBiZSB0cmFuc21pdHRlZC4gIEZpbmFsbHksIHRoZSBzdGF0ZSBvZiB0aGUgdHJhbnNtaXR0ZXIgbWFzayBpcworICogcmVzdG9yZWQuICBXZWxjb21lIHRvIHRoZSB3b3JsZCBvZiBQRFAtMTEhCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIHN0YXRpYyB2b2lkIGR6X2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgaW50IGNoKQogewogCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IChzdHJ1Y3QgZHpfcG9ydCAqKXVwb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGxvb3BzID0gMjUwMDsKLQl1bnNpZ25lZCBzaG9ydCB0bXAgPSAodW5zaWduZWQgY2hhciljaDsKLQkvKiB0aGlzIGNvZGUgc2VuZHMgc3R1ZmYgb3V0IHRvIHNlcmlhbCBkZXZpY2UgLSBzcGlubmluZyBpdHMKLQkgICB3aGVlbHMgYW5kIHdhaXRpbmcuICovCisJdW5zaWduZWQgc2hvcnQgY3NyLCB0Y3IsIHRyZHksIG1hc2s7CisJaW50IGxvb3BzID0gMTAwMDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHBvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0JLyogc3BpbiBvdXIgd2hlZWxzICovCi0Jd2hpbGUgKCgoZHpfaW4oZHBvcnQsIERaX0NTUikgJiBEWl9UUkRZKSAhPSBEWl9UUkRZKSAmJiBsb29wcy0tKQotCQkvKiBGSVhNRTogY3B1X3JlbGF4LCB1ZGVsYXk/IC0tcm1rICovCi0JCTsKLQotCS8qIEFjdHVhbGx5IHRyYW5zbWl0IHRoZSBjaGFyYWN0ZXIuICovCi0JZHpfb3V0KGRwb3J0LCBEWl9URFIsIHRtcCk7Ci0KKwljc3IgPSBkel9pbihkcG9ydCwgRFpfQ1NSKTsKKwlkel9vdXQoZHBvcnQsIERaX0NTUiwgY3NyICYgfkRaX1RJRSk7CisJdGNyID0gZHpfaW4oZHBvcnQsIERaX1RDUik7CisJdGNyIHw9IDEgPDwgZHBvcnQtPnBvcnQubGluZTsKKwltYXNrID0gdGNyOworCWR6X291dChkcG9ydCwgRFpfVENSLCBtYXNrKTsKKwlpb2IoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAobG9vcHMtLSkgeworCQl0cmR5ID0gZHpfaW4oZHBvcnQsIERaX0NTUik7CisJCWlmICghKHRyZHkgJiBEWl9UUkRZKSkKKwkJCWNvbnRpbnVlOworCQl0cmR5ID0gKHRyZHkgJiBEWl9UTElORSkgPj4gODsKKwkJaWYgKHRyZHkgPT0gZHBvcnQtPnBvcnQubGluZSkKKwkJCWJyZWFrOworCQltYXNrICY9IH4oMSA8PCB0cmR5KTsKKwkJZHpfb3V0KGRwb3J0LCBEWl9UQ1IsIG1hc2spOworCQlpb2IoKTsKKwkJdWRlbGF5KDIpOworCX0KKworCWlmIChsb29wcykJCQkJLyogQ2Fubm90IHNlbmQgb3RoZXJ3aXNlLiAqLworCQlkel9vdXQoZHBvcnQsIERaX1REUiwgY2gpOworCisJZHpfb3V0KGRwb3J0LCBEWl9UQ1IsIHRjcik7CisJZHpfb3V0KGRwb3J0LCBEWl9DU1IsIGNzcik7CiB9CiAKIC8qCkBAIC03MDMsMTEgKzcxNCwxMSBAQAogICogVGhlIGNvbnNvbGUgbXVzdCBiZSBsb2NrZWQgd2hlbiB3ZSBnZXQgaGVyZS4KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotc3RhdGljIHZvaWQgZHpfY29uc29sZV9wcmludChzdHJ1Y3QgY29uc29sZSAqY29ucywKK3N0YXRpYyB2b2lkIGR6X2NvbnNvbGVfcHJpbnQoc3RydWN0IGNvbnNvbGUgKmNvLAogCQkJICAgICBjb25zdCBjaGFyICpzdHIsCiAJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCkKIHsKLQlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAmZHpfcG9ydHNbQ09OU09MRV9MSU5FXTsKKwlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAmZHpfcG9ydHNbY28tPmluZGV4XTsKICNpZmRlZiBERUJVR19EWgogCXByb21fcHJpbnRmKChjaGFyICopIHN0cik7CiAjZW5kaWYKQEAgLTcxNiw0OSArNzI3LDQzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGR6X2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQogewotCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9ICZkel9wb3J0c1tDT05TT0xFX0xJTkVdOworCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9ICZkel9wb3J0c1tjby0+aW5kZXhdOwogCWludCBiYXVkID0gOTYwMDsKIAlpbnQgYml0cyA9IDg7CiAJaW50IHBhcml0eSA9ICduJzsKIAlpbnQgZmxvdyA9ICduJzsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIHNob3J0IG1hc2ssIHRtcDsKIAogCWlmIChvcHRpb25zKQogCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CiAKIAlkel9yZXNldChkcG9ydCk7CiAKLQlyZXQgPSB1YXJ0X3NldF9vcHRpb25zKCZkcG9ydC0+cG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCW1hc2sgPSAxIDw8IGRwb3J0LT5wb3J0LmxpbmU7Ci0JCXRtcCA9IGR6X2luKGRwb3J0LCBEWl9UQ1IpOwkvKiByZWFkIHRoZSBUWCBmbGFnICovCi0JCWlmICghKHRtcCAmIG1hc2spKSB7Ci0JCQl0bXAgfD0gbWFzazsJCS8qIHNldCB0aGUgVFggZmxhZyAqLwotCQkJZHpfb3V0KGRwb3J0LCBEWl9UQ1IsIHRtcCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKCZkcG9ydC0+cG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBkel9zZXJjb25zID0KLXsKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgZHpfcmVnOworc3RhdGljIHN0cnVjdCBjb25zb2xlIGR6X3NlcmNvbnMgPSB7CiAJLm5hbWUJPSAidHR5UyIsCiAJLndyaXRlCT0gZHpfY29uc29sZV9wcmludCwKIAkuZGV2aWNlCT0gdWFydF9jb25zb2xlX2RldmljZSwKIAkuc2V0dXAJPSBkel9jb25zb2xlX3NldHVwLAotCS5mbGFncwk9IENPTl9DT05TREVWIHwgQ09OX1BSSU5UQlVGRkVSLAotCS5pbmRleAk9IENPTlNPTEVfTElORSwKKwkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CT0gLTEsCisJLmRhdGEJPSAmZHpfcmVnLAogfTsKIAotdm9pZCBfX2luaXQgZHpfc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZHpfc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKQogewotCWR6X2luaXRfcG9ydHMoKTsKLQotCXJlZ2lzdGVyX2NvbnNvbGUoJmR6X3NlcmNvbnMpOworCWlmICghSU9BU0lDKSB7CisJCWR6X2luaXRfcG9ydHMoKTsKKwkJcmVnaXN0ZXJfY29uc29sZSgmZHpfc2VyY29ucyk7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVOWElPOwogfQogCitjb25zb2xlX2luaXRjYWxsKGR6X3NlcmlhbF9jb25zb2xlX2luaXQpOworCiAjZGVmaW5lIFNFUklBTF9EWl9DT05TT0xFCSZkel9zZXJjb25zCiAjZWxzZQogI2RlZmluZSBTRVJJQUxfRFpfQ09OU09MRQlOVUxMCkBAIC03NjcsMzUgKzc3MiwyOSBAQAogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBkel9yZWcgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZHJpdmVyX25hbWUJCT0gInNlcmlhbCIsCi0JLmRldl9uYW1lCQk9ICJ0dHlTJWQiLAorCS5kZXZfbmFtZQkJPSAidHR5UyIsCiAJLm1ham9yCQkJPSBUVFlfTUFKT1IsCiAJLm1pbm9yCQkJPSA2NCwKIAkubnIJCQk9IERaX05CX1BPUlQsCiAJLmNvbnMJCQk9IFNFUklBTF9EWl9DT05TT0xFLAogfTsKIAotaW50IF9faW5pdCBkel9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBkel9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0LCBpOwogCisJaWYgKElPQVNJQykKKwkJcmV0dXJuIC1FTlhJTzsKKwogCXByaW50aygiJXMlc1xuIiwgZHpfbmFtZSwgZHpfdmVyc2lvbik7CiAKIAlkel9pbml0X3BvcnRzKCk7CiAKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQogI2lmbmRlZiBDT05GSUdfU0VSSUFMX0RaX0NPTlNPTEUKIAkvKiByZXNldCB0aGUgY2hpcCAqLwogCWR6X3Jlc2V0KCZkel9wb3J0c1swXSk7CiAjZW5kaWYKIAotCS8qIG9yZGVyIG1hdHRlcnMgaGVyZS4uLiB0aGUgdHJpY2sgaXMgdGhhdCBmbGFncwotCSAgIGlzIHVwZGF0ZWQuLi4gaW4gcmVxdWVzdF9pcnEgLSB0byBpbW1lZGlhdGVkbHkgb2JsaXRlcmF0ZQotCSAgIGl0IGlzIHVud2lzZS4gKi8KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQogCWlmIChyZXF1ZXN0X2lycShkel9wb3J0c1swXS5wb3J0LmlycSwgZHpfaW50ZXJydXB0LAogCQkJSVJRRl9ESVNBQkxFRCwgIkRaIiwgJmR6X3BvcnRzWzBdKSkKIAkJcGFuaWMoIlVuYWJsZSB0byByZWdpc3RlciBEWiBpbnRlcnJ1cHQiKTsKQEAgLTgxMCw1ICs4MDksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK21vZHVsZV9pbml0KGR6X2luaXQpOworCiBNT0RVTEVfREVTQ1JJUFRJT04oIkRFQ3N0YXRpb24gRFogc2VyaWFsIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvZHouaCBiL2RyaXZlcnMvc2VyaWFsL2R6LmgKaW5kZXggODZlZjQxNy4uOTY3NGQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvZHouaAorKysgYi9kcml2ZXJzL3NlcmlhbC9kei5oCkBAIC0xLDIwICsxLDIyIEBACiAvKgotICogZHouaDogU2VyaWFsIHBvcnQgZHJpdmVyIGZvciBERUNTdGF0aW9ucyBlcXVpcGVkIAorICogZHouaDogU2VyaWFsIHBvcnQgZHJpdmVyIGZvciBERUNzdGF0aW9ucyBlcXVpcHBlZAogICogICAgICAgd2l0aCB0aGUgRFogY2hpcHNldC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTggT2xpdmllciBBLiBELiBMZWJhaWxsaWYgCiAgKiAgICAgICAgICAgICAKICAqIEVtYWlsOiBvbGl2aWVyLmxlYmFpbGxpZkBpZnJzeXMuY29tCiAgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2ICBNYWNpZWogVy4gUm96eWNraQogICovCiAjaWZuZGVmIERaX1NFUklBTF9ICiAjZGVmaW5lIERaX1NFUklBTF9ICiAKIC8qCi0gKiBEZWZpbml0aW9ucyBmb3IgdGhlIENvbnRyb2wgYW5kIFN0YXR1cyBSZWNlaXZlZC4KKyAqIERlZmluaXRpb25zIGZvciB0aGUgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyLgogICovCiAjZGVmaW5lIERaX1RSRFkgICAgICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgLyogVHJhbnNtaXR0ZXIgZW1wdHkgKi8KLSNkZWZpbmUgRFpfVElFICAgICAgICAgMHg0MDAwICAgICAgICAgICAgICAgICAvKiBUcmFuc21pdHRlciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIERaX1RJRSAgICAgICAgIDB4NDAwMCAgICAgICAgICAgICAgICAgLyogVHJhbnNtaXR0ZXIgSW50ZXJydXB0IEVuYmwgKi8KKyNkZWZpbmUgRFpfVExJTkUgICAgICAgMHgwMzAwICAgICAgICAgICAgICAgICAvKiBUcmFuc21pdHRlciBMaW5lIE51bWJlciAqLwogI2RlZmluZSBEWl9SRE9ORSAgICAgICAweDAwODAgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmVyIGRhdGEgcmVhZHkgKi8KICNkZWZpbmUgRFpfUklFICAgICAgICAgMHgwMDQwICAgICAgICAgICAgICAgICAvKiBSZWNlaXZlIEludGVycnVwdCBFbmFibGUgKi8KICNkZWZpbmUgRFpfTVNFICAgICAgICAgMHgwMDIwICAgICAgICAgICAgICAgICAvKiBNYXN0ZXIgU2NhbiBFbmFibGUgKi8KQEAgLTIyLDMyICsyNCw0NCBAQAogI2RlZmluZSBEWl9NQUlOVCAgICAgICAweDAwMDggICAgICAgICAgICAgICAgIC8qIExvb3AgQmFjayBNb2RlICovCiAKIC8qCi0gKiBEZWZpbml0aW9ucyBmb3IgdGhlIFJlY2VpdmVkIGJ1ZmZlci4gCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIFJlY2VpdmVyIEJ1ZmZlciBSZWdpc3Rlci4KICAqLwotI2RlZmluZSBEWl9SQlVGX01BU0sgICAweDAwRkYgICAgICAgICAgICAgICAgIC8qIERhdGEgTWFzayBpbiB0aGUgUmVjZWl2ZSBCdWZmZXIgKi8KLSNkZWZpbmUgRFpfTElORV9NQVNLICAgMHgwMzAwICAgICAgICAgICAgICAgICAvKiBMaW5lIE1hc2sgaW4gdGhlIFJlY2VpdmUgQnVmZmVyICovCisjZGVmaW5lIERaX1JCVUZfTUFTSyAgIDB4MDBGRiAgICAgICAgICAgICAgICAgLyogRGF0YSBNYXNrICovCisjZGVmaW5lIERaX0xJTkVfTUFTSyAgIDB4MDMwMCAgICAgICAgICAgICAgICAgLyogTGluZSBNYXNrICovCiAjZGVmaW5lIERaX0RWQUwgICAgICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgLyogVmFsaWQgRGF0YSBpbmRpY2F0b3IgKi8KICNkZWZpbmUgRFpfT0VSUiAgICAgICAgMHg0MDAwICAgICAgICAgICAgICAgICAvKiBPdmVycnVuIGVycm9yIGluZGljYXRvciAqLwogI2RlZmluZSBEWl9GRVJSICAgICAgICAweDIwMDAgICAgICAgICAgICAgICAgIC8qIEZyYW1lIGVycm9yIGluZGljYXRvciAqLwogI2RlZmluZSBEWl9QRVJSICAgICAgICAweDEwMDAgICAgICAgICAgICAgICAgIC8qIFBhcml0eSBlcnJvciBpbmRpY2F0b3IgKi8KIAotI2RlZmluZSBMSU5FKHgpICh4ICYgRFpfTElORV9NQVNLKSA+PiA4ICAgICAgIC8qIEdldCB0aGUgbGluZSBudW1iZXIgZnJvbSB0aGUgaW5wdXQgYnVmZmVyICovCi0jZGVmaW5lIFVDSEFSKHgpICh1bnNpZ25lZCBjaGFyKSh4ICYgRFpfUkJVRl9NQVNLKQorI2RlZmluZSBMSU5FKHgpICgoeCAmIERaX0xJTkVfTUFTSykgPj4gOCkgICAgIC8qIEdldCB0aGUgbGluZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBpbnB1dCBidWZmZXIgKi8KKyNkZWZpbmUgVUNIQVIoeCkgKCh1bnNpZ25lZCBjaGFyKSh4ICYgRFpfUkJVRl9NQVNLKSkKIAogLyoKLSAqIERlZmluaXRpb25zIGZvciB0aGUgVHJhbnNtaXQgUmVnaXN0ZXIuCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIFRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIuCiAgKi8KICNkZWZpbmUgRFpfTElORV9LRVlCT0FSRCAweDAwMDEKICNkZWZpbmUgRFpfTElORV9NT1VTRSAgICAweDAwMDIKICNkZWZpbmUgRFpfTElORV9NT0RFTSAgICAweDAwMDQKICNkZWZpbmUgRFpfTElORV9QUklOVEVSICAweDAwMDgKIAorI2RlZmluZSBEWl9NT0RFTV9SVFMgICAgIDB4MDgwMCAgICAgICAgICAgICAgIC8qIFJUUyBmb3IgdGhlIG1vZGVtIGxpbmUgKDIpICovCiAjZGVmaW5lIERaX01PREVNX0RUUiAgICAgMHgwNDAwICAgICAgICAgICAgICAgLyogRFRSIGZvciB0aGUgbW9kZW0gbGluZSAoMikgKi8KKyNkZWZpbmUgRFpfUFJJTlRfUlRTICAgICAweDAyMDAgICAgICAgICAgICAgICAvKiBSVFMgZm9yIHRoZSBwcm50ciBsaW5lICgzKSAqLworI2RlZmluZSBEWl9QUklOVF9EVFIgICAgIDB4MDEwMCAgICAgICAgICAgICAgIC8qIERUUiBmb3IgdGhlIHBybnRyIGxpbmUgKDMpICovCisjZGVmaW5lIERaX0xORU5CICAgICAgICAgMHgwMDBmICAgICAgICAgICAgICAgLyogVHJhbnNtaXR0ZXIgTGluZSBFbmFibGUgKi8KIAogLyoKICAqIERlZmluaXRpb25zIGZvciB0aGUgTW9kZW0gU3RhdHVzIFJlZ2lzdGVyLgogICovCisjZGVmaW5lIERaX01PREVNX1JJICAgICAgMHgwODAwICAgICAgICAgICAgICAgLyogUkkgZm9yIHRoZSBtb2RlbSBsaW5lICgyKSAqLworI2RlZmluZSBEWl9NT0RFTV9DRCAgICAgIDB4MDQwMCAgICAgICAgICAgICAgIC8qIENEIGZvciB0aGUgbW9kZW0gbGluZSAoMikgKi8KICNkZWZpbmUgRFpfTU9ERU1fRFNSICAgICAweDAyMDAgICAgICAgICAgICAgICAvKiBEU1IgZm9yIHRoZSBtb2RlbSBsaW5lICgyKSAqLworI2RlZmluZSBEWl9NT0RFTV9DVFMgICAgIDB4MDEwMCAgICAgICAgICAgICAgIC8qIENUUyBmb3IgdGhlIG1vZGVtIGxpbmUgKDIpICovCisjZGVmaW5lIERaX1BSSU5UX1JJICAgICAgMHgwMDA4ICAgICAgICAgICAgICAgLyogUkkgZm9yIHRoZSBwcmludGVyIGxpbmUgKDMpICovCisjZGVmaW5lIERaX1BSSU5UX0NEICAgICAgMHgwMDA0ICAgICAgICAgICAgICAgLyogQ0QgZm9yIHRoZSBwcmludGVyIGxpbmUgKDMpICovCisjZGVmaW5lIERaX1BSSU5UX0RTUiAgICAgMHgwMDAyICAgICAgICAgICAgICAgLyogRFNSIGZvciB0aGUgcHJudHIgbGluZSAoMykgKi8KKyNkZWZpbmUgRFpfUFJJTlRfQ1RTICAgICAweDAwMDEgICAgICAgICAgICAgICAvKiBDVFMgZm9yIHRoZSBwcm50ciBsaW5lICgzKSAqLwogCiAvKgogICogRGVmaW5pdGlvbnMgZm9yIHRoZSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaWNvbS5jIGIvZHJpdmVycy9zZXJpYWwvaWNvbS5jCmluZGV4IDhhYTBmNjQxLi43MWU2YTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pY29tLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaWNvbS5jCkBAIC0xMDg3LDggKzEwODcsOCBAQAogfQogCiBzdGF0aWMgdm9pZCBpY29tX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCi0JCQkgICAgIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkJICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCQkgICAgIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlpbnQgYmF1ZDsKIAl1bnNpZ25lZCBjZmxhZywgaWZsYWc7CkBAIC0xNTEwLDcgKzE1MTAsNyBAQAogCX0KIAogCWlmICggKHJldHZhbCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCAiaWNvbSIpKSkgewotCQkgZGV2X2VycigmZGV2LT5kZXYsICJwY2lfcmVxdWVzdF9yZWdpb24gRkFJTEVEXG4iKTsKKwkJIGRldl9lcnIoJmRldi0+ZGV2LCAicGNpX3JlcXVlc3RfcmVnaW9ucyBGQUlMRURcbiIpOwogCQkgcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiAJCSByZXR1cm4gcmV0dmFsOwogCSB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pbXguYyBiL2RyaXZlcnMvc2VyaWFsL2lteC5jCmluZGV4IGVlNWM3ODIuLmUyMTZkY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lteC5jCkBAIC00NTksOCArNDU5LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLWlteF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJICAgc3RydWN0IHRlcm1pb3MgKm9sZCkKK2lteF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCBpbXhfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGlteF9wb3J0ICopcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaW9jM19zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL2lvYzNfc2VyaWFsLmMKaW5kZXggMjMwOGQyNi4uOWNjMGJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvaW9jM19zZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC9pb2MzX3NlcmlhbC5jCkBAIC05NTAsNyArOTUwLDcgQEAKICAqLwogc3RhdGljIHZvaWQKIGlvYzNfY2hhbmdlX3NwZWVkKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0LAotCQkgIHN0cnVjdCB0ZXJtaW9zICpuZXdfdGVybWlvcywgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorCQkgIHN0cnVjdCBrdGVybWlvcyAqbmV3X3Rlcm1pb3MsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IGlvYzNfcG9ydCAqcG9ydCA9IGdldF9pb2MzX3BvcnQodGhlX3BvcnQpOwogCXVuc2lnbmVkIGludCBjZmxhZzsKQEAgLTE4NTMsNyArMTg1Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkCiBpYzNfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqdGhlX3BvcnQsCi0JCXN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAl1bnNpZ25lZCBsb25nIHBvcnRfZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2lvYzRfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9pb2M0X3NlcmlhbC5jCmluZGV4IDk4Y2U4OGQuLmM4NjJmNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lvYzRfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaW9jNF9zZXJpYWwuYwpAQCAtOTIxLDcgKzkyMSw3IEBACiB7CiAJc3RydWN0IGlvYzRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgaW9jNF9wb3J0ICopYXJnOwogCXN0cnVjdCBob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5pcF9sb2NrLCBmbGFncyk7CiAKQEAgLTE2ODEsNyArMTY4MSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkCiBpb2M0X2NoYW5nZV9zcGVlZChzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydCwKLQkJICBzdHJ1Y3QgdGVybWlvcyAqbmV3X3Rlcm1pb3MsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKKwkJICBzdHJ1Y3Qga3Rlcm1pb3MgKm5ld190ZXJtaW9zLCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBpb2M0X3BvcnQgKnBvcnQgPSBnZXRfaW9jNF9wb3J0KHRoZV9wb3J0LCAwKTsKIAlpbnQgYmF1ZCwgYml0czsKQEAgLTE4MDIsNyArMTgwMiw3IEBACiAJaW9jNF9zZXRfcHJvdG8ocG9ydCwgdGhlX3BvcnQtPm1hcGJhc2UpOwogCiAJLyogc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQgKi8KLQlpb2M0X2NoYW5nZV9zcGVlZCh0aGVfcG9ydCwgaW5mby0+dHR5LT50ZXJtaW9zLCAoc3RydWN0IHRlcm1pb3MgKikwKTsKKwlpb2M0X2NoYW5nZV9zcGVlZCh0aGVfcG9ydCwgaW5mby0+dHR5LT50ZXJtaW9zLCAoc3RydWN0IGt0ZXJtaW9zICopMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MzQsNyArMTgzNCw3IEBACiAJc3RydWN0IGlvYzRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgaW9jNF9wb3J0ICopYXJnOwogCXN0cnVjdCBob29rcyAqaG9va3MgPSBwb3J0LT5pcF9ob29rczsKIAl1bnNpZ25lZCBpbnQgcnhfaGlnaF9yZF9hYm9ydGVkID0gMDsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdWFydF9wb3J0ICp0aGVfcG9ydDsKIAlpbnQgbG9vcF9jb3VudGVyOwogCkBAIC0yNTcwLDcgKzI1NzAsNyBAQAogICovCiBzdGF0aWMgdm9pZAogaWM0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnRoZV9wb3J0LAotCQlzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorCQlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3J0X2ZsYWdzOwogCkBAIC0yOTM1LDcgKzI5MzUsNyBAQAogCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvYzRfdWFydF9yczQyMik7CiB9CiAKLW1vZHVsZV9pbml0KGlvYzRfc2VyaWFsX2luaXQpOworbGF0ZV9pbml0Y2FsbChpb2M0X3NlcmlhbF9pbml0KTsgLyogQ2FsbCBvbmx5IGFmdGVyIHR0eSBpbml0IGlzIGRvbmUgKi8KIG1vZHVsZV9leGl0KGlvYzRfc2VyaWFsX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJQYXQgR2VmcmUgLSBTaWxpY29uIEdyYXBoaWNzIEluYy4gKFNHSSkgPHBmZ0BzZ2kuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaXAyMnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwppbmRleCBkY2E2YzFiLi4wNzQ2Yzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwpAQCAtODQwLDggKzg0MCw4IEBACiAKIC8qIFRoZSBwb3J0IGxvY2sgaXMgbm90IGhlbGQuICAqLwogc3RhdGljIHZvaWQKLWlwMjJ6aWxvZ19zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJICAgICAgc3RydWN0IHRlcm1pb3MgKm9sZCkKK2lwMjJ6aWxvZ19zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCB1YXJ0X2lwMjJ6aWxvZ19wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9pcDIyemlsb2dfcG9ydCAqKSBwb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbV90dHkuYwppbmRleCBmODI2MmU2Li43Y2YxYzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fdHR5LmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKIAlzdHJ1Y3QganNtX2NoYW5uZWwgKmNoYW5uZWwgPSAoc3RydWN0IGpzbV9jaGFubmVsICopcG9ydDsKLQlzdHJ1Y3QgdGVybWlvcyAqdGVybWlvczsKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgbG9ja19mbGFncyk7CiAJdGVybWlvcyA9IHBvcnQtPmluZm8tPnR0eS0+dGVybWlvczsKQEAgLTE4MCw3ICsxODAsNyBAQAogCXN0cnVjdCBqc21fYm9hcmQgKmJyZDsKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCBqc21fY2hhbm5lbCAqY2hhbm5lbCA9IChzdHJ1Y3QganNtX2NoYW5uZWwgKilwb3J0OwotCXN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zOworCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvczsKIAogCS8qIEdldCBib2FyZCBwb2ludGVyIGZyb20gb3VyIGFycmF5IG9mIG1ham9ycyB3ZSBoYXZlIGFsbG9jYXRlZCAqLwogCWJyZCA9IGNoYW5uZWwtPmNoX2JkOwpAQCAtMjY5LDcgKzI2OSw3IEBACiBzdGF0aWMgdm9pZCBqc21fdHR5X2Nsb3NlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGpzbV9ib2FyZCAqYmQ7Ci0Jc3RydWN0IHRlcm1pb3MgKnRzOworCXN0cnVjdCBrdGVybWlvcyAqdHM7CiAJc3RydWN0IGpzbV9jaGFubmVsICpjaGFubmVsID0gKHN0cnVjdCBqc21fY2hhbm5lbCAqKXBvcnQ7CiAKIAlqc21fcHJpbnRrKENMT1NFLCBJTkZPLCAmY2hhbm5lbC0+Y2hfYmQtPnBjaV9kZXYsICJzdGFydFxuIik7CkBAIC0zMDIsOCArMzAyLDggQEAKIH0KIAogc3RhdGljIHZvaWQganNtX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAotCQkJCSBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJCQkgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorCQkJCSBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCQkJIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOwogCXN0cnVjdCBqc21fY2hhbm5lbCAqY2hhbm5lbCA9IChzdHJ1Y3QganNtX2NoYW5uZWwgKilwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbTMycl9zaW8uYyBiL2RyaXZlcnMvc2VyaWFsL20zMnJfc2lvLmMKaW5kZXggNzY1NmEzNS4uNmUwOWM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbTMycl9zaW8uYworKysgYi9kcml2ZXJzL3NlcmlhbC9tMzJyX3Npby5jCkBAIC02OTksNyArNjk5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgbTMycl9zaW9fc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKLQlzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywgc3RydWN0IHRlcm1pb3MgKm9sZCkKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCB1YXJ0X3Npb19wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zaW9fcG9ydCAqKXBvcnQ7CiAJdW5zaWduZWQgY2hhciBjdmFsID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL21jZnNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKaW5kZXggYWVlMWIzMS4uMDg0MzA5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvbWNmc2VyaWFsLmMKQEAgLTYwLDcgKzYwLDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19IV19GRUlUSCkKICNkZWZpbmUJQ09OU09MRV9CQVVEX1JBVEUJMzg0MDAKICNkZWZpbmUJREVGQVVMVF9DQkFVRAkJQjM4NDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NT0Q1MjcyKSB8fCBkZWZpbmVkKENPTkZJR19NNTIwOEVWQikgfHwgZGVmaW5lZChDT05GSUdfTTUzMjlFVkIpCisjZWxpZiBkZWZpbmVkKENPTkZJR19NT0Q1MjcyKSB8fCBkZWZpbmVkKENPTkZJR19NNTIwOEVWQikgfHwgXAorICAgICAgZGVmaW5lZChDT05GSUdfTTUzMjlFVkIpIHx8IGRlZmluZWQoQ09ORklHX0dJTEJBUkNPKQogI2RlZmluZSBDT05TT0xFX0JBVURfUkFURSAJMTE1MjAwCiAjZGVmaW5lIERFRkFVTFRfQ0JBVUQJCUIxMTUyMDAKICNlbGlmIGRlZmluZWQoQ09ORklHX0FSTkVXU0gpIHx8IGRlZmluZWQoQ09ORklHX0ZSRUVTQ0FMRSkgfHwgXApAQCAtMTA5LDEyICsxMTAsMzAgQEAKIAkJLmlycSA9IElSUUJBU0UsCiAJCS5mbGFncyA9IEFTWU5DX0JPT1RfQVVUT0NPTkYsCiAJfSwKKyNpZmRlZiBNQ0ZVQVJUX0JBU0UyCiAJeyAgLyogdHR5UzEgKi8KIAkJLm1hZ2ljID0gMCwKIAkJLmFkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoTUNGX01CQVIrTUNGVUFSVF9CQVNFMiksCiAJCS5pcnEgPSBJUlFCQVNFKzEsCiAJCS5mbGFncyA9IEFTWU5DX0JPT1RfQVVUT0NPTkYsCiAJfSwKKyNlbmRpZgorI2lmZGVmIE1DRlVBUlRfQkFTRTMKKwl7ICAvKiB0dHlTMiAqLworCQkubWFnaWMgPSAwLAorCQkuYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChNQ0ZfTUJBUitNQ0ZVQVJUX0JBU0UzKSwKKwkJLmlycSA9IElSUUJBU0UrMiwKKwkJLmZsYWdzID0gQVNZTkNfQk9PVF9BVVRPQ09ORiwKKwl9LAorI2VuZGlmCisjaWZkZWYgTUNGVUFSVF9CQVNFNAorCXsgIC8qIHR0eVMzICovCisJCS5tYWdpYyA9IDAsCisJCS5hZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9NQkFSK01DRlVBUlRfQkFTRTQpLAorCQkuaXJxID0gSVJRQkFTRSszLAorCQkuZmxhZ3MgPSBBU1lOQ19CT09UX0FVVE9DT05GLAorCX0sCisjZW5kaWYKIH07CiAKIApAQCAtMTExMyw3ICsxMTMyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWNmcnNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgbWNmcnNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgbWNmX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWNmX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7CiAKQEAgLTE1MTYsNiArMTUzNSwyMiBAQAogCWltcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZJQ01fSU5UQzAgKwogCQlNQ0ZJTlRDX0lNUkwpOwogCSppbXJwICY9IH4oKDEgPDwgKGluZm8tPmlycSAtIE1DRklOVF9WRUNCQVNFKSkgfCAxKTsKKyNpZiBkZWZpbmVkKENPTkZJR19NNTI3eCkKKwl7CisJCS8qCisJCSAqIEV4dGVybmFsIFBpbiBNYXNrIFNldHRpbmcgJiBFbmFibGUgRXh0ZXJuYWwgUGluIGZvciBJbnRlcmZhY2UKKwkJICogbXJjYmlzQGFsaWNlcG9zdGEuaXQKKyAgICAgICAgCSAqLworCQl1bnNpZ25lZCBzaG9ydCAqc2VycGluX2VuYWJsZV9tYXNrOworCQlzZXJwaW5fZW5hYmxlX21hc2sgPSAoTUNGX0lQU0JBUiArIE1DRl9HUElPX1BBUl9VQVJUKTsKKwkJaWYgKGluZm8tPmxpbmUgPT0gMCkKKwkJCSpzZXJwaW5fZW5hYmxlX21hc2sgfD0gVUFSVDBfRU5BQkxFX01BU0s7CisJCWVsc2UgaWYgKGluZm8tPmxpbmUgPT0gMSkKKwkJCSpzZXJwaW5fZW5hYmxlX21hc2sgfD0gVUFSVDFfRU5BQkxFX01BU0s7CisJCWVsc2UgaWYgKGluZm8tPmxpbmUgPT0gMikKKwkJCSpzZXJwaW5fZW5hYmxlX21hc2sgfD0gVUFSVDJfRU5BQkxFX01BU0s7CisJfQorI2VuZGlmCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NNTIweCkKIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICppY3JwLCAqdWFydHA7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaW1ycDsKQEAgLTE3MTMsNyArMTc0OCw3IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KIAltY2Zyc19zZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOwogCW1jZnJzX3NlcmlhbF9kcml2ZXItPm5hbWUgPSAidHR5UyI7Ci0JbWNmcnNfc2VyaWFsX2RyaXZlci0+ZHJpdmVyX25hbWUgPSAic2VyaWFsIjsKKwltY2Zyc19zZXJpYWxfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJtY2ZzZXJpYWwiOwogCW1jZnJzX3NlcmlhbF9kcml2ZXItPm1ham9yID0gVFRZX01BSk9SOwogCW1jZnJzX3NlcmlhbF9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gNjQ7CiAJbWNmcnNfc2VyaWFsX2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CkBAIC0xNzk3LDEwICsxODMyLDIzIEBACiAJdWFydHBbTUNGVUFSVF9VTVJdID0gTUNGVUFSVF9NUjFfUEFSSVRZTk9ORSB8IE1DRlVBUlRfTVIxX0NTODsKIAl1YXJ0cFtNQ0ZVQVJUX1VNUl0gPSBNQ0ZVQVJUX01SMl9TVE9QMTsKIAorI2lmZGVmCUNPTkZJR19NNTI3MgoreworCS8qCisJICogRm9yIHRoZSBNQ0Y1MjcyLCBhbHNvIGNvbXB1dGUgdGhlIGJhdWRyYXRlIGZyYWN0aW9uLgorCSAqLworCWludCBmcmFjdGlvbiA9IE1DRl9CVVNDTEsgLSAoY2xrICogMzIgKiBtY2Zyc19jb25zb2xlX2JhdWQpOworCWZyYWN0aW9uICo9IDE2OworCWZyYWN0aW9uIC89ICgzMiAqIG1jZnJzX2NvbnNvbGVfYmF1ZCk7CisJdWFydHBbTUNGVUFSVF9VRlBEXSA9IChmcmFjdGlvbiAmIDB4Zik7CQkvKiBzZXQgZnJhY3Rpb24gKi8KKwljbGsgPSAoTUNGX0JVU0NMSyAvIG1jZnJzX2NvbnNvbGVfYmF1ZCkgLyAzMjsKK30KKyNlbHNlCiAJY2xrID0gKChNQ0ZfQlVTQ0xLIC8gbWNmcnNfY29uc29sZV9iYXVkKSArIDE2KSAvIDMyOyAvKiBzZXQgYmF1ZCAqLworI2VuZGlmCisKIAl1YXJ0cFtNQ0ZVQVJUX1VCRzFdID0gKGNsayAmIDB4ZmYwMCkgPj4gODsgIC8qIHNldCBtc2IgYmF1ZCAqLwogCXVhcnRwW01DRlVBUlRfVUJHMl0gPSAoY2xrICYgMHhmZik7ICAvKiBzZXQgbHNiIGJhdWQgKi8KLQogCXVhcnRwW01DRlVBUlRfVUNTUl0gPSBNQ0ZVQVJUX1VDU1JfUlhDTEtUSU1FUiB8IE1DRlVBUlRfVUNTUl9UWENMS1RJTUVSOwogCXVhcnRwW01DRlVBUlRfVUNSXSA9IE1DRlVBUlRfVUNSX1JYRU5BQkxFIHwgTUNGVUFSVF9VQ1JfVFhFTkFCTEU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jIGIvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKaW5kZXggNGY4MGM1Yi4uOWQxMWE3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKQEAgLTEsNiArMSw0IEBACiAvKgotICogZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKLSAqCiAgKiBEcml2ZXIgZm9yIHRoZSBQU0Mgb2YgdGhlIEZyZWVzY2FsZSBNUEM1Mnh4IFBTQ3MgY29uZmlndXJlZCBhcyBVQVJUcy4KICAqCiAgKiBGSVhNRSBBY2NvcmRpbmcgdG8gdGhlIHVzZXJtYW51YWwgdGhlIHN0YXR1cyBiaXRzIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIKQEAgLTE0LDE4ICsxMiwyMCBAQAogICoKICAqCiAgKiBNYWludGFpbmVyIDogU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgotICogCisgKgogICogU29tZSBvZiB0aGUgY29kZSBoYXMgYmVlbiBpbnNwaXJlZC9jb3BpZWQgZnJvbSB0aGUgMi40IGNvZGUgd3JpdHRlbgogICogYnkgRGFsZSBGYXJuc3dvcnRoIDxkZmFybnN3b3J0aEBtdmlzdGEuY29tPi4KLSAqIAotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKiAgICAgICAgICAgICAgICAgICAgR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCi0gKiAKKyAqCiAgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKICAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCi0gCisKIC8qIFBsYXRmb3JtIGRldmljZSBVc2FnZSA6CiAgKgogICogU2luY2UgUFNDcyBjYW4gaGF2ZSBtdWx0aXBsZSBmdW5jdGlvbiwgdGhlIGNvcnJlY3QgZHJpdmVyIGZvciBlYWNoIG9uZQpAQCAtNDQsNyArNDQsMjQgQEAKICAqIHdpbGwgYmUgbWFwcGVkIHRvLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKy8qIE9GIFBsYXRmb3JtIGRldmljZSBVc2FnZSA6CisgKgorICogVGhpcyBkcml2ZXIgaXMgb25seSB1c2VkIGZvciBQU0NzIGNvbmZpZ3VyZWQgaW4gdWFydCBtb2RlLiAgVGhlIGRldmljZQorICogdHJlZSB3aWxsIGhhdmUgYSBub2RlIGZvciBlYWNoIFBTQyBpbiB1YXJ0IG1vZGUgdy8gZGV2aWNlX3R5cGUgPSAic2VyaWFsIgorICogYW5kICJtcGM1Mnh4LXBzYy11YXJ0IiBpbiB0aGUgY29tcGF0aWJsZSBzdHJpbmcKKyAqCisgKiBCeSBkZWZhdWx0LCBQU0MgZGV2aWNlcyBhcmUgZW51bWVyYXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmQuICBIb3dldmVyCisgKiBhIHBhcnRpY3VsYXIgUFNDIG51bWJlciBjYW4gYmUgZm9yY2VzIGJ5IGFkZGluZyAnZGV2aWNlX25vID0gPHBvcnQjPicKKyAqIHRvIHRoZSBkZXZpY2Ugbm9kZS4KKyAqCisgKiBUaGUgZHJpdmVyIGluaXQgYWxsIG5lY2Vzc2FyeSByZWdpc3RlcnMgdG8gcGxhY2UgdGhlIFBTQyBpbiB1YXJ0IG1vZGUgd2l0aG91dAorICogRENELiBIb3dldmVyLCB0aGUgcGluIG11bHRpcGxleGluZyBhcmVuJ3QgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIHNldCBlaXRoZXIKKyAqIGJ5IHRoZSBib290bG9hZGVyIG9yIGluIHRoZSBwbGF0Zm9ybSBpbml0IGNvZGUuCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KQEAgLTU0LDYgKzcxLDEyIEBACiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgogI2luY2x1ZGUgPGFzbS9tcGM1Mnh4X3BzYy5oPgogCkBAIC04MCw2ICsxMDMsMTIgQEAKIAkgKiAgICAgICAgaXQncyBjbGVhcmVkLCB0aGVuIGEgbWVtc2V0KC4uLiwwLC4uLikgc2hvdWxkIGJlIGFkZGVkIHRvCiAJICogICAgICAgIHRoZSBjb25zb2xlX2luaXQKIAkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisvKiBsb29rdXAgdGFibGUgZm9yIG1hdGNoaW5nIGRldmljZSBub2RlcyB0byBpbmRleCBudW1iZXJzICovCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICptcGM1Mnh4X3VhcnRfbm9kZXNbTVBDNTJ4eF9QU0NfTUFYTlVNXTsKKworc3RhdGljIHZvaWQgbXBjNTJ4eF91YXJ0X29mX2VudW1lcmF0ZSh2b2lkKTsKKyNlbmRpZgogCiAjZGVmaW5lIFBTQyhwb3J0KSAoKHN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICopKChwb3J0KS0+bWVtYmFzZSkpCiAKQEAgLTk2LDMyICsxMjUsNDAgQEAKICNkZWZpbmUgdWFydF9jb25zb2xlKHBvcnQpCSgwKQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X3VhcnRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC50eXBlID0gInNlcmlhbCIsIC5jb21wYXRpYmxlID0gIm1wYzUyeHgtcHNjLXVhcnQiLCB9LAorCXsgLnR5cGUgPSAic2VyaWFsIiwgLmNvbXBhdGlibGUgPSAibXBjNTIwMC1wc2MiLCB9LCAvKiBFZmlrYSBvbmx5ISAqLworCXt9LAorfTsKKyNlbmRpZgorCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogVUFSVCBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCAKK3N0YXRpYyB1bnNpZ25lZCBpbnQKIG1wYzUyeHhfdWFydF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCWludCBzdGF0dXMgPSBpbl9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX3N0YXR1cyk7CiAJcmV0dXJuIChzdGF0dXMgJiBNUEM1Mnh4X1BTQ19TUl9UWEVNUCkgPyBUSU9DU0VSX1RFTVQgOiAwOwogfQogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBtcGM1Mnh4X3VhcnRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKIHsKIAkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCAKK3N0YXRpYyB1bnNpZ25lZCBpbnQKIG1wYzUyeHhfdWFydF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAkvKiBOb3QgaW1wbGVtZW50ZWQgKi8KIAlyZXR1cm4gVElPQ01fQ1RTIHwgVElPQ01fRFNSIHwgVElPQ01fQ0FSOwogfQogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBtcGM1Mnh4X3VhcnRfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCS8qIHBvcnQtPmxvY2sgdGFrZW4gYnkgY2FsbGVyICovCkBAIC0xMjksNyArMTY2LDcgQEAKIAlvdXRfYmUxNigmUFNDKHBvcnQpLT5tcGM1Mnh4X3BzY19pbXIscG9ydC0+cmVhZF9zdGF0dXNfbWFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIG1wYzUyeHhfdWFydF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCS8qIHBvcnQtPmxvY2sgdGFrZW4gYnkgY2FsbGVyICovCkBAIC0xMzcsMTIgKzE3NCwxMiBAQAogCW91dF9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2ltcixwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKIH0KIAotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogbXBjNTJ4eF91YXJ0X3NlbmRfeGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY2hhciBjaCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCisKIAlwb3J0LT54X2NoYXIgPSBjaDsKIAlpZiAoY2gpIHsKIAkJLyogTWFrZSBzdXJlIHR4IGludGVycnVwdHMgYXJlIG9uICovCkBAIC0xNTAsNyArMTg3LDcgQEAKIAkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBNUEM1Mnh4X1BTQ19JTVJfVFhSRFk7CiAJCW91dF9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2ltcixwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKIAl9Ci0JCisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTE3OCw3ICsyMTUsNyBAQAogCQlvdXRfOCgmUFNDKHBvcnQpLT5jb21tYW5kLE1QQzUyeHhfUFNDX1NUQVJUX0JSSyk7CiAJZWxzZQogCQlvdXRfOCgmUFNDKHBvcnQpLT5jb21tYW5kLE1QQzUyeHhfUFNDX1NUT1BfQlJLKTsKLQkKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTk3LDExICsyMzQsMTEgQEAKIAkvKiBSZXNldC9hY3RpdmF0ZSB0aGUgcG9ydCwgY2xlYXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCiAJb3V0XzgoJnBzYy0+Y29tbWFuZCxNUEM1Mnh4X1BTQ19SU1RfUlgpOwogCW91dF84KCZwc2MtPmNvbW1hbmQsTVBDNTJ4eF9QU0NfUlNUX1RYKTsKLQkKKwogCW91dF9iZTMyKCZwc2MtPnNpY3IsMCk7CS8qIFVBUlQgbW9kZSBEQ0QgaWdub3JlZCAqLwogCiAJb3V0X2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2NfY2xvY2tfc2VsZWN0LCAweGRkMDApOyAvKiAvMTYgcHJlc2NhbGVyIG9uICovCi0JCisKIAlvdXRfOCgmcHNjLT5yZmNudGwsIDB4MDApOwogCW91dF9iZTE2KCZwc2MtPnJmYWxhcm0sIDB4MWZmKTsKIAlvdXRfOCgmcHNjLT50ZmNudGwsIDB4MDcpOwpAQCAtMjA5LDEwICsyNDYsMTAgQEAKIAogCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gTVBDNTJ4eF9QU0NfSU1SX1JYUkRZIHwgTVBDNTJ4eF9QU0NfSU1SX1RYUkRZOwogCW91dF9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX2ltcixwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKLQkKKwogCW91dF84KCZwc2MtPmNvbW1hbmQsTVBDNTJ4eF9QU0NfVFhfRU5BQkxFKTsKIAlvdXRfOCgmcHNjLT5jb21tYW5kLE1QQzUyeHhfUFNDX1JYX0VOQUJMRSk7Ci0JCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyMCwzMSArMjU3LDMxIEBACiBtcGM1Mnh4X3VhcnRfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjID0gUFNDKHBvcnQpOwotCQorCiAJLyogU2h1dCBkb3duIHRoZSBwb3J0LCBpbnRlcnJ1cHQgYW5kIGFsbCAqLwogCW91dF84KCZwc2MtPmNvbW1hbmQsTVBDNTJ4eF9QU0NfUlNUX1JYKTsKIAlvdXRfOCgmcHNjLT5jb21tYW5kLE1QQzUyeHhfUFNDX1JTVF9UWCk7Ci0JCi0JcG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9IDA7IAorCisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9IDA7CiAJb3V0X2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2NfaW1yLHBvcnQtPnJlYWRfc3RhdHVzX21hc2spOwogCiAJLyogUmVsZWFzZSBpbnRlcnJ1cHQgKi8KIAlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwogfQogCi1zdGF0aWMgdm9pZCAKLW1wYzUyeHhfdWFydF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqbmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCitzdGF0aWMgdm9pZAorbXBjNTJ4eF91YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICpwc2MgPSBQU0MocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIG1yMSwgbXIyOwogCXVuc2lnbmVkIHNob3J0IGN0cjsKIAl1bnNpZ25lZCBpbnQgaiwgYmF1ZCwgcXVvdDsKLQkKKwogCS8qIFByZXBhcmUgd2hhdCB3ZSdyZSBnb25uYSB3cml0ZSAqLwogCW1yMSA9IDA7Ci0JCisKIAlzd2l0Y2ggKG5ldy0+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+ZnVsbF9uYW1lLCBpKTsKKwl9Cit9CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1wYzUyeHhfdWFydF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIG1wYzUyeHhfdWFydF9vZl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJtcGM1Mnh4LXBzYy11YXJ0IiwKKwkubWF0Y2hfdGFibGUJPSBtcGM1Mnh4X3VhcnRfb2ZfbWF0Y2gsCisJLnByb2JlCQk9IG1wYzUyeHhfdWFydF9vZl9wcm9iZSwKKwkucmVtb3ZlCQk9IG1wYzUyeHhfdWFydF9vZl9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBtcGM1Mnh4X3VhcnRfb2Zfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG1wYzUyeHhfdWFydF9vZl9yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibXBjNTJ4eC1wc2MtdWFydCIsCisJfSwKK307CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKSAqLwogCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtODExLDIyICsxMTA3LDQ1IEBACiB7CiAJaW50IHJldDsKIAotCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbDogTVBDNTJ4eCBQU0MgZHJpdmVyXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJTZXJpYWw6IE1QQzUyeHggUFNDIFVBUlQgZHJpdmVyXG4iKTsKIAotCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZtcGM1Mnh4X3VhcnRfZHJpdmVyKTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtcGM1Mnh4X3VhcnRfcGxhdGZvcm1fZHJpdmVyKTsKLQkJaWYgKHJldCkKLQkJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJm1wYzUyeHhfdWFydF9kcml2ZXIpOworCWlmICgocmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJm1wYzUyeHhfdWFydF9kcml2ZXIpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVhcnRfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCAoJWkpXG4iLAorCQkgICAgICAgX19GSUxFX18sIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIHJldDsKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpCisJbXBjNTJ4eF91YXJ0X29mX2VudW1lcmF0ZSgpOworCisJcmV0ID0gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZtcGM1Mnh4X3VhcnRfb2ZfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlciBmYWlsZWQgKCVpKVxuIiwKKwkJICAgICAgIF9fRklMRV9fLCByZXQpOworCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZtcGM1Mnh4X3VhcnRfZHJpdmVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisjZWxzZQorCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjNTJ4eF91YXJ0X3BsYXRmb3JtX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgZmFpbGVkICglaSlcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgcmV0KTsKKwkJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmbXBjNTJ4eF91YXJ0X2RyaXZlcik7CisJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CiBtcGM1Mnh4X3VhcnRfZXhpdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjNTJ4eF91YXJ0X29mX2RyaXZlcik7CisjZWxzZQogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtcGM1Mnh4X3VhcnRfcGxhdGZvcm1fZHJpdmVyKTsKKyNlbmRpZgogCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJm1wYzUyeHhfdWFydF9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tcHNjLmMgYi9kcml2ZXJzL3NlcmlhbC9tcHNjLmMKaW5kZXggOGVlYTY5Zi4uM2QyZmNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbXBzYy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL21wc2MuYwpAQCAtNTU1LDcgKzU1NSw3IEBACiAJaWYgKCFtcHNjX3NkbWFfdHhfYWN0aXZlKHBpKSkgewogCQl0eHJlID0gKHN0cnVjdCBtcHNjX3R4X2Rlc2MgKikocGktPnR4ciArCiAJCQkocGktPnR4cl90YWlsICogTVBTQ19UWFJFX1NJWkUpKTsKLQkJZG1hX2NhY2hlX3N5bmMoKHZvaWQgKikgdHhyZSwgTVBTQ19UWFJFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWRtYV9jYWNoZV9zeW5jKHBpLT5wb3J0LmRldiwgKHZvaWQgKikgdHhyZSwgTVBTQ19UWFJFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJCWlmIChwaS0+Y2FjaGVfbWdtdCkgLyogR1Q2NDJbNDZdMCBSZXMgI0NPTU0tMiAqLwogCQkJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVsb25nKXR4cmUsCkBAIC05MzEsNyArOTMxLDcgQEAKIAl9CiAJdHhyZS0+bGluayA9IGNwdV90b19iZTMyKHBpLT50eHJfcCk7CS8qIFdyYXAgbGFzdCBiYWNrIHRvIGZpcnN0ICovCiAKLQlkbWFfY2FjaGVfc3luYygodm9pZCAqKSBwaS0+ZG1hX3JlZ2lvbiwgTVBTQ19ETUFfQUxMT0NfU0laRSwKKwlkbWFfY2FjaGVfc3luYyhwaS0+cG9ydC5kZXYsICh2b2lkICopIHBpLT5kbWFfcmVnaW9uLCBNUFNDX0RNQV9BTExPQ19TSVpFLAogCQlETUFfQklESVJFQ1RJT05BTCk7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJCWlmIChwaS0+Y2FjaGVfbWdtdCkgLyogR1Q2NDJbNDZdMCBSZXMgI0NPTU0tMiAqLwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKIAogCXJ4cmUgPSAoc3RydWN0IG1wc2NfcnhfZGVzYyAqKShwaS0+cnhyICsgKHBpLT5yeHJfcG9zbipNUFNDX1JYUkVfU0laRSkpOwogCi0JZG1hX2NhY2hlX3N5bmMoKHZvaWQgKilyeHJlLCBNUFNDX1JYUkVfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlkbWFfY2FjaGVfc3luYyhwaS0+cG9ydC5kZXYsICh2b2lkICopcnhyZSwgTVBTQ19SWFJFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJaWYgKHBpLT5jYWNoZV9tZ210KSAvKiBHVDY0Mls0Nl0wIFJlcyAjQ09NTS0yICovCiAJCWludmFsaWRhdGVfZGNhY2hlX3JhbmdlKCh1bG9uZylyeHJlLApAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAkJfQogCiAJCWJwID0gcGktPnJ4YiArIChwaS0+cnhyX3Bvc24gKiBNUFNDX1JYQkVfU0laRSk7Ci0JCWRtYV9jYWNoZV9zeW5jKCh2b2lkICopIGJwLCBNUFNDX1JYQkVfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJZG1hX2NhY2hlX3N5bmMocGktPnBvcnQuZGV2LCAodm9pZCAqKSBicCwgTVBTQ19SWEJFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJCWlmIChwaS0+Y2FjaGVfbWdtdCkgLyogR1Q2NDJbNDZdMCBSZXMgI0NPTU0tMiAqLwogCQkJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVsb25nKWJwLApAQCAtMTA5OCw3ICsxMDk4LDcgQEAKIAkJCQkJICAgIFNETUFfREVTQ19DTURTVEFUX0YgfAogCQkJCQkgICAgU0RNQV9ERVNDX0NNRFNUQVRfTCk7CiAJCXdtYigpOwotCQlkbWFfY2FjaGVfc3luYygodm9pZCAqKXJ4cmUsIE1QU0NfUlhSRV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CisJCWRtYV9jYWNoZV9zeW5jKHBpLT5wb3J0LmRldiwgKHZvaWQgKilyeHJlLCBNUFNDX1JYUkVfU0laRSwgRE1BX0JJRElSRUNUSU9OQUwpOwogI2lmIGRlZmluZWQoQ09ORklHX1BQQzMyKSAmJiAhZGVmaW5lZChDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFKQogCQlpZiAocGktPmNhY2hlX21nbXQpIC8qIEdUNjQyWzQ2XTAgUmVzICNDT01NLTIgKi8KIAkJCWZsdXNoX2RjYWNoZV9yYW5nZSgodWxvbmcpcnhyZSwKQEAgLTExMDksNyArMTEwOSw3IEBACiAJCXBpLT5yeHJfcG9zbiA9IChwaS0+cnhyX3Bvc24gKyAxKSAmIChNUFNDX1JYUl9FTlRSSUVTIC0gMSk7CiAJCXJ4cmUgPSAoc3RydWN0IG1wc2NfcnhfZGVzYyAqKShwaS0+cnhyICsKIAkJCShwaS0+cnhyX3Bvc24gKiBNUFNDX1JYUkVfU0laRSkpOwotCQlkbWFfY2FjaGVfc3luYygodm9pZCAqKXJ4cmUsIE1QU0NfUlhSRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlkbWFfY2FjaGVfc3luYyhwaS0+cG9ydC5kZXYsICh2b2lkICopcnhyZSwgTVBTQ19SWFJFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJCWlmIChwaS0+Y2FjaGVfbWdtdCkgLyogR1Q2NDJbNDZdMCBSZXMgI0NPTU0tMiAqLwogCQkJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVsb25nKXJ4cmUsCkBAIC0xMTQzLDcgKzExNDMsNyBAQAogCQkJCQkJCSAgIFNETUFfREVTQ19DTURTVEFUX0VJCiAJCQkJCQkJICAgOiAwKSk7CiAJd21iKCk7Ci0JZG1hX2NhY2hlX3N5bmMoKHZvaWQgKikgdHhyZSwgTVBTQ19UWFJFX1NJWkUsIERNQV9CSURJUkVDVElPTkFMKTsKKwlkbWFfY2FjaGVfc3luYyhwaS0+cG9ydC5kZXYsICh2b2lkICopIHR4cmUsIE1QU0NfVFhSRV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJaWYgKHBpLT5jYWNoZV9tZ210KSAvKiBHVDY0Mls0Nl0wIFJlcyAjQ09NTS0yICovCiAJCWZsdXNoX2RjYWNoZV9yYW5nZSgodWxvbmcpdHhyZSwKQEAgLTExOTIsNyArMTE5Miw3IEBACiAJCWVsc2UgLyogQWxsIHR4IGRhdGEgY29waWVkIGludG8gcmluZyBidWZzICovCiAJCQlyZXR1cm47CiAKLQkJZG1hX2NhY2hlX3N5bmMoKHZvaWQgKikgYnAsIE1QU0NfVFhCRV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CisJCWRtYV9jYWNoZV9zeW5jKHBpLT5wb3J0LmRldiwgKHZvaWQgKikgYnAsIE1QU0NfVFhCRV9TSVpFLCBETUFfQklESVJFQ1RJT05BTCk7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJCWlmIChwaS0+Y2FjaGVfbWdtdCkgLyogR1Q2NDJbNDZdMCBSZXMgI0NPTU0tMiAqLwogCQkJZmx1c2hfZGNhY2hlX3JhbmdlKCh1bG9uZylicCwKQEAgLTEyMTcsNyArMTIxNyw3IEBACiAJCXR4cmUgPSAoc3RydWN0IG1wc2NfdHhfZGVzYyAqKShwaS0+dHhyICsKIAkJCShwaS0+dHhyX3RhaWwgKiBNUFNDX1RYUkVfU0laRSkpOwogCi0JCWRtYV9jYWNoZV9zeW5jKCh2b2lkICopIHR4cmUsIE1QU0NfVFhSRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlkbWFfY2FjaGVfc3luYyhwaS0+cG9ydC5kZXYsICh2b2lkICopIHR4cmUsIE1QU0NfVFhSRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwogI2lmIGRlZmluZWQoQ09ORklHX1BQQzMyKSAmJiAhZGVmaW5lZChDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFKQogCQlpZiAocGktPmNhY2hlX21nbXQpIC8qIEdUNjQyWzQ2XTAgUmVzICNDT01NLTIgKi8KIAkJCWludmFsaWRhdGVfZGNhY2hlX3JhbmdlKCh1bG9uZyl0eHJlLApAQCAtMTIzNSw3ICsxMjM1LDcgQEAKIAogCQkJdHhyZSA9IChzdHJ1Y3QgbXBzY190eF9kZXNjICopKHBpLT50eHIgKwogCQkJCShwaS0+dHhyX3RhaWwgKiBNUFNDX1RYUkVfU0laRSkpOwotCQkJZG1hX2NhY2hlX3N5bmMoKHZvaWQgKikgdHhyZSwgTVBTQ19UWFJFX1NJWkUsCisJCQlkbWFfY2FjaGVfc3luYyhwaS0+cG9ydC5kZXYsICh2b2lkICopIHR4cmUsIE1QU0NfVFhSRV9TSVpFLAogCQkJCURNQV9GUk9NX0RFVklDRSk7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmICFkZWZpbmVkKENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUpCiAJCQlpZiAocGktPmNhY2hlX21nbXQpIC8qIEdUNjQyWzQ2XTAgUmVzICNDT01NLTIgKi8KQEAgLTE0NDAsOCArMTQ0MCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1tcHNjX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkgc3RydWN0IHRlcm1pb3MgKm9sZCkKK21wc2Nfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQkgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJc3RydWN0IG1wc2NfcG9ydF9pbmZvICpwaSA9IChzdHJ1Y3QgbXBzY19wb3J0X2luZm8gKilwb3J0OwogCXUzMiBiYXVkOwpAQCAtMTY1Miw3ICsxNjUyLDcgQEAKIAkJCWNvdW50LS07CiAJCX0KIAotCQlkbWFfY2FjaGVfc3luYygodm9pZCAqKSBicCwgTVBTQ19UWEJFX1NJWkUsIERNQV9CSURJUkVDVElPTkFMKTsKKwkJZG1hX2NhY2hlX3N5bmMocGktPnBvcnQuZGV2LCAodm9pZCAqKSBicCwgTVBTQ19UWEJFX1NJWkUsIERNQV9CSURJUkVDVElPTkFMKTsKICNpZiBkZWZpbmVkKENPTkZJR19QUEMzMikgJiYgIWRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKIAkJaWYgKHBpLT5jYWNoZV9tZ210KSAvKiBHVDY0Mls0Nl0wIFJlcyAjQ09NTS0yICovCiAJCQlmbHVzaF9kY2FjaGVfcmFuZ2UoKHVsb25nKWJwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbXV4LmMgYi9kcml2ZXJzL3NlcmlhbC9tdXguYwppbmRleCA4YWQxYjhjLi5jY2I4ZmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9tdXguYworKysgYi9kcml2ZXJzL3NlcmlhbC9tdXguYwpAQCAtMjczLDggKzI3Myw4IEBACiAgKiBUaGUgU2VyaWFsIE11eCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb24uCiAgKi8KIHN0YXRpYyB2b2lkCi1tdXhfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorbXV4X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkgICAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9uZXR4LXNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvbmV0eC1zZXJpYWwuYwppbmRleCAwNjJiYWQ0Li5iNTZmN2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9uZXR4LXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL25ldHgtc2VyaWFsLmMKQEAgLTMzNyw4ICszMzcsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbmV0eF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJICAgc3RydWN0IHRlcm1pb3MgKm9sZCkKK25ldHhfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQkgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAl1bnNpZ25lZCBpbnQgYmF1ZCwgcXVvdDsKIAl1bnNpZ25lZCBjaGFyIG9sZF9jcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYwppbmRleCBiZjk4MDllLi43NTJlZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jCkBAIC0xMjYyLDggKzEyNjIsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIF9fcG16X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkJICAgICAgc3RydWN0IHRlcm1pb3MgKm9sZCkKK3N0YXRpYyB2b2lkIF9fcG16X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwID0gdG9fcG16KHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgYmF1ZDsKQEAgLTEyNzMsNyArMTI3Myw3IEBACiAJaWYgKFpTX0lTX0FTTEVFUCh1YXApKQogCQlyZXR1cm47CiAKLQltZW1jcHkoJnVhcC0+dGVybWlvc19jYWNoZSwgdGVybWlvcywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7CisJbWVtY3B5KCZ1YXAtPnRlcm1pb3NfY2FjaGUsIHRlcm1pb3MsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKTsKIAogCS8qIFhYWCBDaGVjayB3aGljaCByZXZzIG9mIG1hY2hpbmVzIGFjdHVhbGx5IGFsbG93IDEgYW5kIDRNYiBzcGVlZHMKIAkgKiBvbiB0aGUgSVIgZG9uZ2xlLiBOb3RlIHRoYXQgdGhlIElSVFRZIGRyaXZlciBjdXJyZW50bHkgZG9lc24ndCBrbm93CkBAIC0xMzEzLDggKzEzMTMsOCBAQAogfQogCiAvKiBUaGUgcG9ydCBsb2NrIGlzIG5vdCBoZWxkLiAgKi8KLXN0YXRpYyB2b2lkIHBtel9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJCSAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorc3RhdGljIHZvaWQgcG16X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAlzdHJ1Y3QgdWFydF9wbWFjX3BvcnQgKnVhcCA9IHRvX3Bteihwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5oIGIvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5oCmluZGV4IGMwM2Y5YmYuLjU3MGIwZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuaAorKysgYi9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmgKQEAgLTYwLDcgKzYwLDcgQEAKIAl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncwlfX2lvbWVtICp0eF9kbWFfcmVnczsKIAl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncwlfX2lvbWVtICpyeF9kbWFfcmVnczsKIAotCXN0cnVjdCB0ZXJtaW9zCQkJdGVybWlvc19jYWNoZTsKKwlzdHJ1Y3Qga3Rlcm1pb3MJCQl0ZXJtaW9zX2NhY2hlOwogfTsKIAogI2RlZmluZSB0b19wbXoocCkgKChzdHJ1Y3QgdWFydF9wbWFjX3BvcnQgKikocCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9weGEuYyBiL2RyaXZlcnMvc2VyaWFsL3B4YS5jCmluZGV4IDQxNWZlOTYuLmQ0MDNhYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3B4YS5jCkBAIC00MzMsOCArNDMzLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLXNlcmlhbF9weGFfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JCSAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorc2VyaWFsX3B4YV9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAlzdHJ1Y3QgdWFydF9weGFfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfcHhhX3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIGNoYXIgY3ZhbCwgZmNyID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYyBiL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYwppbmRleCA4ZGZjMmRkLi4zYmE5MjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCkBAIC03MzgsOCArNzM4LDggQEAKIH0KIAogc3RhdGljIHZvaWQgczNjMjR4eF9zZXJpYWxfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKLQkJCQkgICAgICAgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JCQkJICAgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCisJCQkJICAgICAgIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCQkgICAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnID0gczNjMjR4eF9wb3J0X3RvX2NmZyhwb3J0KTsKIAlzdHJ1Y3QgczNjMjR4eF91YXJ0X3BvcnQgKm91cnBvcnQgPSB0b19vdXJwb3J0KHBvcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2ExMTAwLmMgYi9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYwppbmRleCBkNDA2NTI2Li41OGE4M2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zYTExMDAuYwpAQCAtNDA4LDggKzQwOCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zYTExMDBfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JCSAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCitzYTExMDBfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQkgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAlzdHJ1Y3Qgc2ExMTAwX3BvcnQgKnNwb3J0ID0gKHN0cnVjdCBzYTExMDBfcG9ydCAqKXBvcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCmluZGV4IGM2N2IwNWUuLmY4NDk4MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtNjUsNyArNjUsNyBAQAogI2RlZmluZSB1YXJ0X2NvbnNvbGUocG9ydCkJKDApCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgdWFydF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpOworc3RhdGljIHZvaWQgdWFydF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKTsKIHN0YXRpYyB2b2lkIHVhcnRfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKIHN0YXRpYyB2b2lkIHVhcnRfY2hhbmdlX3BtKHN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZSwgaW50IHBtX3N0YXRlKTsKIApAQCAtMzM4LDggKzMzOCw4IEBACiAgKgl3ZSdyZSBhY3R1YWxseSBnb2luZyB0byBiZSB1c2luZy4KICAqLwogdW5zaWduZWQgaW50Ci11YXJ0X2dldF9iYXVkX3JhdGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JCSAgIHN0cnVjdCB0ZXJtaW9zICpvbGQsIHVuc2lnbmVkIGludCBtaW4sIHVuc2lnbmVkIGludCBtYXgpCit1YXJ0X2dldF9iYXVkX3JhdGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQkgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCwgdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCkKIHsKIAl1bnNpZ25lZCBpbnQgdHJ5LCBiYXVkLCBhbHRiYXVkID0gMzg0MDA7CiAJdXBmX3QgZmxhZ3MgPSBwb3J0LT5mbGFncyAmIFVQRl9TUERfTUFTSzsKQEAgLTQyMSwxMSArNDIxLDExIEBACiBFWFBPUlRfU1lNQk9MKHVhcnRfZ2V0X2Rpdmlzb3IpOwogCiBzdGF0aWMgdm9pZAotdWFydF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit1YXJ0X2NoYW5nZV9zcGVlZChzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHN0YXRlLT5pbmZvLT50dHk7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IHN0YXRlLT5wb3J0OwotCXN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zOworCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvczsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSBubyB0dHksIHRlcm1pb3MsIG9yIHRoZSBwb3J0IGRvZXMgbm90IGV4aXN0LApAQCAtMTEzOSw3ICsxMTM5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB1YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIHVhcnRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xODY2LDcgKzE4NjYsNyBAQAogdWFydF9zZXRfb3B0aW9ucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgY29uc29sZSAqY28sCiAJCSBpbnQgYmF1ZCwgaW50IHBhcml0eSwgaW50IGJpdHMsIGludCBmbG93KQogewotCXN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zIHRlcm1pb3M7CiAJaW50IGk7CiAKIAkvKgpAQCAtMTg3Niw3ICsxODc2LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CiAJbG9ja2RlcF9zZXRfY2xhc3MoJnBvcnQtPmxvY2ssICZwb3J0X2xvY2tfa2V5KTsKIAotCW1lbXNldCgmdGVybWlvcywgMCwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7CisJbWVtc2V0KCZ0ZXJtaW9zLCAwLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CiAKIAl0ZXJtaW9zLmNfY2ZsYWcgPSBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOwogCkBAIC0xOTkxLDEyICsxOTkxLDEyIEBACiAJICogUmUtZW5hYmxlIHRoZSBjb25zb2xlIGRldmljZSBhZnRlciBzdXNwZW5kaW5nLgogCSAqLwogCWlmICh1YXJ0X2NvbnNvbGUocG9ydCkpIHsKLQkJc3RydWN0IHRlcm1pb3MgdGVybWlvczsKKwkJc3RydWN0IGt0ZXJtaW9zIHRlcm1pb3M7CiAKIAkJLyoKIAkJICogRmlyc3QgdHJ5IHRvIHVzZSB0aGUgY29uc29sZSBjZmxhZyBzZXR0aW5nLgogCQkgKi8KLQkJbWVtc2V0KCZ0ZXJtaW9zLCAwLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKTsKKwkJbWVtc2V0KCZ0ZXJtaW9zLCAwLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CiAJCXRlcm1pb3MuY19jZmxhZyA9IHBvcnQtPmNvbnMtPmNmbGFnOwogCiAJCS8qCkBAIC0yMTg5LDYgKzIxODksNyBAQAogCW5vcm1hbC0+c3VidHlwZQkJPSBTRVJJQUxfVFlQRV9OT1JNQUw7CiAJbm9ybWFsLT5pbml0X3Rlcm1pb3MJPSB0dHlfc3RkX3Rlcm1pb3M7CiAJbm9ybWFsLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlub3JtYWwtPmluaXRfdGVybWlvcy5jX2lzcGVlZCA9IG5vcm1hbC0+aW5pdF90ZXJtaW9zLmNfb3NwZWVkID0gOTYwMDsKIAlub3JtYWwtPmZsYWdzCQk9IFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX0RZTkFNSUNfREVWOwogCW5vcm1hbC0+ZHJpdmVyX3N0YXRlICAgID0gZHJ2OwogCXR0eV9zZXRfb3BlcmF0aW9ucyhub3JtYWwsICZ1YXJ0X29wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCmluZGV4IDAwZjlmZmQuLjQzMTQzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jcy5jCkBAIC03MjMsNyArNzIzLDcgQEAKIAl1X2NoYXIgKmJ1ZjsKIAljaXNwYXJzZV90ICpwYXJzZTsKIAljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZjsKLQlpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisJaW50IGk7CiAKIAlERUJVRygwLCAic2VyaWFsX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKQEAgLTc0MCwxNSArNzQwLDYgQEAKIAl0dXBsZS0+VHVwbGVPZmZzZXQgPSAwOwogCXR1cGxlLT5UdXBsZURhdGFNYXggPSAyNTU7CiAJdHVwbGUtPkF0dHJpYnV0ZXMgPSAwOwotCS8qIEdldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGluZm9ybWF0aW9uICovCi0JdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JbGFzdF9yZXQgPSBmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpOwotCWlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7Ci0JCWxhc3RfZm4gPSBQYXJzZVR1cGxlOwotCQlnb3RvIGNzX2ZhaWxlZDsKLQl9Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07CiAKIAkvKiBJcyB0aGlzIGEgY29tcGxpYW50IG11bHRpZnVuY3Rpb24gY2FyZD8gKi8KIAl0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0xPTkdMSU5LX01GQzsKQEAgLTc1NywyNyArNzQ4LDI1IEBACiAKIAkvKiBJcyB0aGlzIGEgbXVsdGlwb3J0IGNhcmQ/ICovCiAJdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7Ci0JaWYgKGZpcnN0X3R1cGxlKGxpbmssIHR1cGxlLCBwYXJzZSkgPT0gQ1NfU1VDQ0VTUykgewotCQlpbmZvLT5tYW5maWQgPSBwYXJzZS0+bWFuZmlkLm1hbmY7Ci0JCWluZm8tPnByb2RpZCA9IHBhcnNlLT5tYW5maWQuY2FyZDsKKwlpbmZvLT5tYW5maWQgPSBsaW5rLT5tYW5mX2lkOworCWluZm8tPnByb2RpZCA9IGxpbmstPmNhcmRfaWQ7CiAKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocXVpcmtzKTsgaSsrKQotCQkJaWYgKChxdWlya3NbaV0ubWFuZmlkID09IH4wIHx8Ci0JCQkgICAgIHF1aXJrc1tpXS5tYW5maWQgPT0gaW5mby0+bWFuZmlkKSAmJgotCQkJICAgIChxdWlya3NbaV0ucHJvZGlkID09IH4wIHx8Ci0JCQkgICAgIHF1aXJrc1tpXS5wcm9kaWQgPT0gaW5mby0+cHJvZGlkKSkgewotCQkJCWluZm8tPnF1aXJrID0gJnF1aXJrc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocXVpcmtzKTsgaSsrKQorCQlpZiAoKHF1aXJrc1tpXS5tYW5maWQgPT0gfjAgfHwKKwkJICAgICBxdWlya3NbaV0ubWFuZmlkID09IGluZm8tPm1hbmZpZCkgJiYKKwkJICAgIChxdWlya3NbaV0ucHJvZGlkID09IH4wIHx8CisJCSAgICAgcXVpcmtzW2ldLnByb2RpZCA9PSBpbmZvLT5wcm9kaWQpKSB7CisJCQlpbmZvLT5xdWlyayA9ICZxdWlya3NbaV07CisJCQlicmVhazsKKwkJfQogCiAJLyogQW5vdGhlciBjaGVjayBmb3IgZHVhbC1zZXJpYWwgY2FyZHM6IGxvb2sgZm9yIGVpdGhlciBzZXJpYWwgb3IKIAkgICBtdWx0aWZ1bmN0aW9uIGNhcmRzIHRoYXQgYXNrIGZvciBhcHByb3ByaWF0ZSBJTyBwb3J0IHJhbmdlcyAqLwogCXR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0lEOwogCWlmICgoaW5mby0+bXVsdGkgPT0gMCkgJiYKLQkgICAgKChmaXJzdF90dXBsZShsaW5rLCB0dXBsZSwgcGFyc2UpICE9IENTX1NVQ0NFU1MpIHx8Ci0JICAgICAocGFyc2UtPmZ1bmNpZC5mdW5jID09IENJU1RQTF9GVU5DSURfTVVMVEkpIHx8Ci0JICAgICAocGFyc2UtPmZ1bmNpZC5mdW5jID09IENJU1RQTF9GVU5DSURfU0VSSUFMKSkpIHsKKwkgICAgKGxpbmstPmhhc19mdW5jX2lkKSAmJgorCSAgICAoKGxpbmstPmZ1bmNfaWQgPT0gQ0lTVFBMX0ZVTkNJRF9NVUxUSSkgfHwKKwkgICAgIChsaW5rLT5mdW5jX2lkID09IENJU1RQTF9GVU5DSURfU0VSSUFMKSkpIHsKIAkJdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCQlpZiAoZmlyc3RfdHVwbGUobGluaywgdHVwbGUsIHBhcnNlKSA9PSBDU19TVUNDRVNTKSB7CiAJCQlpZiAoKGNmLT5pby5ud2luID09IDEpICYmIChjZi0+aW8ud2luWzBdLmxlbiAlIDggPT0gMCkpCkBAIC04MTQsOCArODAzLDYgQEAKIAlrZnJlZShjZmdfbWVtKTsKIAlyZXR1cm4gMDsKIAotIGNzX2ZhaWxlZDoKLQljc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7CiAgZmFpbGVkOgogCXNlcmlhbF9yZW1vdmUobGluayk7CiAJa2ZyZWUoY2ZnX21lbSk7CkBAIC05MjUsNiArOTEyLDMwIEBACiAJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyMygiQURWQU5URUNIIiwgIkNPTXBhZC0zMi84NSIsICIxLjAiLCAweDk2OTEzYTg1LCAweDhmYmU5MmFlLCAweDA4NzdiNjI3LCAiQ09NcGFkMi5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMigiUlMtQ09NIDJQIiwgMHhhZDIwYjE1NiwgIlJTLUNPTS0yUC5jaXMiKSwKIAlQQ01DSUFfREVWSUNFX0NJU19NQU5GX0NBUkQoMHgwMDEzLCAweDAwMDAsICJHTE9CRVRST1RURVIuY2lzIiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMQU4gRElHSVRBTCBTWVNURU1TIExURCwgYzE5OTcuIiwiU0VSSUFMIENBUkQ6IFNMMTAwICAxLjAwLiIsMHgxOWNhNzhhZiwweGY5NjRmNDJiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRUxBTiBESUdJVEFMIFNZU1RFTVMgTFRELCBjMTk5Ny4iLCJTRVJJQUwgQ0FSRDogU0wxMDAiLDB4MTljYTc4YWYsMHg3MWQ5OGU4MyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMQU4gRElHSVRBTCBTWVNURU1TIExURCwgYzE5OTcuIiwiU0VSSUFMIENBUkQ6IFNMMjMyICAxLjAwLiIsMHgxOWNhNzhhZiwweDY5ZmI3NDkwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRUxBTiBESUdJVEFMIFNZU1RFTVMgTFRELCBjMTk5Ny4iLCJTRVJJQUwgQ0FSRDogU0wyMzIiLDB4MTljYTc4YWYsMHhiNmJjMDIzNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVMQU4gRElHSVRBTCBTWVNURU1TIExURCwgYzIwMDAuIiwiU0VSSUFMIENBUkQ6IENGMjMyIiwweDYzZjJlMGJkLDB4YjllMTc1ZDMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFTEFOIERJR0lUQUwgU1lTVEVNUyBMVEQsIGMyMDAwLiIsIlNFUklBTCBDQVJEOiBDRjIzMi01IiwweDYzZjJlMGJkLDB4ZmNlMzM0NDIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFbGFuIiwiU2VyaWFsIFBvcnQ6IENGMjMyIiwweDNiZWI4Y2YyLDB4MTcxZTcxOTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFbGFuIiwiU2VyaWFsIFBvcnQ6IENGMjMyLTUiLDB4M2JlYjhjZjIsMHgyMGRhNDI2MiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogQ0Y0MjgiLDB4M2JlYjhjZjIsMHhlYTVkZDU3ZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogQ0Y1MDAiLDB4M2JlYjhjZjIsMHhkNzcyNTVmYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogSUMyMzIiLDB4M2JlYjhjZjIsMHg2YTcwOTkwMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wyMzIiLDB4M2JlYjhjZjIsMHgxODQzMDY3NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVsYW4iLCJTZXJpYWwgUG9ydDogWEwyMzIiLDB4M2JlYjhjZjIsMHg2ZjkzMzc2NyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwgUG9ydDogQ0YzMzIiLDB4M2JlYjhjZjIsMHgxNmRjMWJhNyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wzMzIiLDB4M2JlYjhjZjIsMHgxOTgxNmM0MSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wzODUiLDB4M2JlYjhjZjIsMHg2NDExMjAyOSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0w0MzIiLDB4M2JlYjhjZjIsMHgxY2NlN2FjNCksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsIkVsYW4iLCJTZXJpYWwrUGFyYWxsZWwgUG9ydDogU1AyMzAiLDB4M2JlYjhjZjIsMHhkYjllNThiYyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwgUG9ydDogQ0YzMzIiLDB4M2JlYjhjZjIsMHgxNmRjMWJhNyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wzMzIiLDB4M2JlYjhjZjIsMHgxOTgxNmM0MSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0wzODUiLDB4M2JlYjhjZjIsMHg2NDExMjAyOSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0w0MzIiLDB4M2JlYjhjZjIsMHgxY2NlN2FjNCksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDIsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0w0MzIiLDB4M2JlYjhjZjIsMHgxY2NlN2FjNCksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDMsIkVsYW4iLCJTZXJpYWwgUG9ydDogU0w0MzIiLDB4M2JlYjhjZjIsMHgxY2NlN2FjNCksCiAJLyogdG9vIGdlbmVyaWMgKi8KIAkvKiBQQ01DSUFfTUZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMTYwLCAweDAwMDIpLCAqLwogCS8qIFBDTUNJQV9NRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxNjAsIDB4MDAwMiksICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfbGg3YTQweC5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2xoN2E0MHguYwppbmRleCA1ZTFhYzM1Li5lYjE4ZDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfbGg3YTQweC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9saDdhNDB4LmMKQEAgLTM0OCw4ICszNDgsOCBAQAogfQogCiBzdGF0aWMgdm9pZCBsaDdhNDB4dWFydF9zZXRfdGVybWlvcyAoc3RydWN0IHVhcnRfcG9ydCogcG9ydCwKLQkJCQkgICAgIHN0cnVjdCB0ZXJtaW9zKiB0ZXJtaW9zLAotCQkJCSAgICAgc3RydWN0IHRlcm1pb3MqIG9sZCkKKwkJCQkgICAgIHN0cnVjdCBrdGVybWlvcyogdGVybWlvcywKKwkJCQkgICAgIHN0cnVjdCBrdGVybWlvcyogb2xkKQogewogCXVuc2lnbmVkIGludCBjb247CiAJdW5zaWduZWQgaW50IGludGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKaW5kZXggMmE0ODI4OS4uNzE4NmE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCkBAIC01NTYsOCArNTU2LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLXNlcmlhbF90eHg5X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkgICAgICAgc3RydWN0IHRlcm1pb3MgKm9sZCkKK3NlcmlhbF90eHg5X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJICAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfdHh4OV9wb3J0ICopcG9ydDsKIAl1bnNpZ25lZCBpbnQgY3ZhbCwgZmNyID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKaW5kZXggY2ZjYzNjYS4uYzUzYjY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKQEAgLTMxOSw2ICszMTksMjggQEAKIAogCXNjaV9vdXQocG9ydCwgU0NGQ1IsIGZjcl92YWwpOwogfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQorc3RhdGljIHZvaWQgc2NpX2luaXRfcGluc19zY2lmKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKK3sKKwl1bnNpZ25lZCBpbnQgZmNyX3ZhbCA9IDA7CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWZjcl92YWwgfD0gU0NGQ1JfTUNFOworCisJCWN0cmxfb3V0dygweDAwMDAsIFBPUlRfUFNDUik7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgc2hvcnQgZGF0YTsKKworCQlkYXRhID0gY3RybF9pbncoUE9SVF9QU0NSKTsKKwkJZGF0YSAmPSAweDAzM2Y7CisJCWRhdGEgfD0gMHgwNDAwOworCQljdHJsX291dHcoZGF0YSwgUE9SVF9QU0NSKTsKKworCQljdHJsX291dHcoY3RybF9pbncoU0NTUFRSMCkgJiAweDE3LCBTQ1NQVFIwKTsKKwl9CisKKwlzY2lfb3V0KHBvcnQsIFNDRkNSLCBmY3JfdmFsKTsKK30KICNlbHNlCiAvKiBGb3IgU0g3NzUwICovCiBzdGF0aWMgdm9pZCBzY2lfaW5pdF9waW5zX3NjaWYoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQpAQCAtNzc1LDcgKzc5Nyw3IEBACiAJCQkgKgogCQkJICogQ2xlYW4gdGhpcyB1cCBsYXRlci4uCiAJCQkgKi8KLQkJCWNsayA9IGNsa19nZXQoIm1vZHVsZV9jbGsiKTsKKwkJCWNsayA9IGNsa19nZXQoTlVMTCwgIm1vZHVsZV9jbGsiKTsKIAkJCXBvcnQtPnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKSAqIDE2OwogCQkJY2xrX3B1dChjbGspOwogCQl9CkBAIC05NDMsOCArOTY1LDggQEAKIAkJcy0+ZGlzYWJsZShwb3J0KTsKIH0KIAotc3RhdGljIHZvaWQgc2NpX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkJICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCitzdGF0aWMgdm9pZCBzY2lfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQkJICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCBzY2lfcG9ydCAqcyA9ICZzY2lfcG9ydHNbcG9ydC0+bGluZV07CiAJdW5zaWduZWQgaW50IHN0YXR1cywgYmF1ZCwgc21yX3ZhbDsKQEAgLTk2MCw3ICs5ODIsNyBAQAogCQlkZWZhdWx0OgogCQl7CiAjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIKSAmJiAhZGVmaW5lZChDT05GSUdfU1VQRVJINjQpCi0JCQlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KCJtb2R1bGVfY2xrIik7CisJCQlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KE5VTEwsICJtb2R1bGVfY2xrIik7CiAJCQl0ID0gU0NCUlJfVkFMVUUoYmF1ZCwgY2xrX2dldF9yYXRlKGNsaykpOwogCQkJY2xrX3B1dChjbGspOwogI2Vsc2UKQEAgLTExMjgsNyArMTE1MCw3IEBACiAJCSAqIFhYWDogV2Ugc2hvdWxkIHVzZSBhIHByb3BlciBTQ0kvU0NJRiBjbG9jawogCQkgKi8KIAkJewotCQkJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldCgibW9kdWxlX2NsayIpOworCQkJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldChOVUxMLCAibW9kdWxlX2NsayIpOwogCQkJc2NpX3BvcnRzW2ldLnBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZShjbGspICogMTY7CiAJCQljbGtfcHV0KGNsayk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKaW5kZXggN2VlOTkyMS4uNzdmN2Q2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKKysrIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKQEAgLTkwLDYgKzkwLDEzIEBACiAjIGRlZmluZSBTQ1NQVFIzIDB4ZmZlMzAwMTAJLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgMHgzMgkvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0wLENLRT0xICovCiAjIGRlZmluZSBTQ0lGX09OTFkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikKKyMgZGVmaW5lIFNDUERSMAkJCTB4QTQwNTAxM0UJLyogMTYgYml0IFNDSUYwIFBTRFIgKi8KKyMgZGVmaW5lIFNDU1BUUjAJCVNDUERSMAorIyBkZWZpbmUgU0NJRl9PUkVSCQkweDAwMDEJLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KKyMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkJMHgwMDM4CS8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8KKyMgZGVmaW5lIFNDSUZfT05MWQorIyBkZWZpbmUgUE9SVF9QU0NSCQkweEE0MDUwMTFFCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQogIyBkZWZpbmUgU0NTUFRSMiAweGZmZTgwMDIwIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KQEAgLTEzMyw2ICsxNDAsMjAgQEAKICMgZGVmaW5lIFNDSUZfT1JFUgkweDAwMDEJCS8qIE92ZXJydW4gZXJyb3IgYml0ICovCiAjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpCTB4M2EJLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogIyBkZWZpbmUgU0NJRl9PTkxZCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYpCisjIGRlZmluZSBTQ1NQVFIwIDB4ZmZmZTgwMjAgLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDU1BUUjEgMHhmZmZlODgyMCAvKiAxNiBiaXQgU0NJRiAqLworIyBkZWZpbmUgU0NTUFRSMiAweGZmZmU5MDIwIC8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIzIDB4ZmZmZTk4MjAgLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkJMHgzOCAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCisjIGRlZmluZSBTQ0lGX09OTFkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkKKyMgZGVmaW5lIFNDU1BUUjAgMHhmODQwMDAyMCAvKiAxNiBiaXQgU0NJRiAqLworIyBkZWZpbmUgU0NTUFRSMSAweGY4NDEwMDIwIC8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIyIDB4Zjg0MjAwMjAgLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCisjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpCTB4MzggLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLworIyBkZWZpbmUgU0NJRl9PTkxZCiAjZWxzZQogIyBlcnJvciBDUFUgc3VidHlwZSBub3QgZGVmaW5lZAogI2VuZGlmCkBAIC0zNjUsNiArMzg2LDcgQEAKIFNDSXhfRk5TKFNDeFJEUiwgMHgwYSwgIDgsIDB4MTQsICA4LCAweDBBLCAgOCwgMHgxNCwgIDgsIDB4MDUsICA4KQogU0NJRl9GTlMoU0NGQ1IsICAgICAgICAgICAgICAgICAgICAgIDB4MGMsICA4LCAweDE4LCAxNikKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKK1NDSUZfRk5TKFNDRkRSLAkJCSAgICAgMHgwZSwgMTYsIDB4MUMsIDE2KQogU0NJRl9GTlMoU0NURkRSLAkJICAgICAweDBlLCAxNiwgMHgxQywgMTYpCiBTQ0lGX0ZOUyhTQ1JGRFIsCQkgICAgIDB4MGUsIDE2LCAweDIwLCAxNikKIFNDSUZfRk5TKFNDU1BUUiwJCQkwLCAgMCwgMHgyNCwgMTYpCkBAIC00ODAsNiArNTAyLDcgQEAKIAkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjEpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KIAlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZlNjIwMDAwKQogCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMikgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCXJldHVybiAxOwogfQogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQogc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtNTA2LDYgKzUyOSwxMyBAQAogCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMykgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLwogCXJldHVybiAxOwogfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQorc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZlMDAwMDApCisJCXJldHVybiBjdHJsX2luYihTQ1BEUjApICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYwICovCisJcmV0dXJuIDE7Cit9CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSkKIHN0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKQEAgLTUzNSw2ICs1NjUsNyBAQAogCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMSkgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLwogCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmY5MjUwMDApCiAJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIyKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCisJcmV0dXJuIDE7CiB9CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCiBzdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC01NDMsNiArNTc0LDMxIEBACiAJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIwKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCiAJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUxMDAwMCkKIAkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjEpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KKwlyZXR1cm4gMTsKK30KKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNikKK3N0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZmU4MDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMCkgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZmZTg4MDApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIxKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmZlOTAwMCkKKwkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjIpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZmU5ODAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMykgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCXJldHVybiAxOworfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQorc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4Zjg0MDAwMDApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIwKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmODQxMDAwMCkKKwkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjEpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGY4NDIwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMikgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCXJldHVybiAxOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYyBiL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYwppbmRleCA5NTZiMmNmLi4yNTNjZWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc25fY29uc29sZS5jCkBAIC0zNjEsOCArMzYxLDggQEAKICAqCiAgKi8KIHN0YXRpYyB2b2lkCi1zbnBfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCi0JCXN0cnVjdCB0ZXJtaW9zICpvbGQpCitzbnBfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3VuaHYuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMKaW5kZXggMDM5NDFkMi4uNDBkNDg1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3VuaHYuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5odi5jCkBAIC0yODEsOCArMjgxLDggQEAKIH0KIAogLyogcG9ydC0+bG9jayBpcyBub3QgaGVsZC4gICovCi1zdGF0aWMgdm9pZCBzdW5odl9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJCSAgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCitzdGF0aWMgdm9pZCBzdW5odl9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCQkgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAl1bnNpZ25lZCBpbnQgYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIDQwMDAwMDApOwogCXVuc2lnbmVkIGludCBxdW90ID0gdWFydF9nZXRfZGl2aXNvcihwb3J0LCBiYXVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggMDhhN2NkNi4uNDkzZDViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKQEAgLTc4Niw4ICs3ODYsOCBAQAogfQogCiAvKiBwb3J0LT5sb2NrIGlzIG5vdCBoZWxkLiAgKi8KLXN0YXRpYyB2b2lkIHN1bnNhYl9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJCSAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorc3RhdGljIHZvaWQgc3Vuc2FiX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuc2FiX3BvcnQgKikgcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKaW5kZXggYzU3N2ZhZS4uNTY0NTkyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCkBAIC04OTMsOCArODkzLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLXN1bnN1X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCitzdW5zdV9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJdW5zaWduZWQgaW50IGJhdWQsIHF1b3Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCmluZGV4IGIyY2M3MDMuLjc1ZGU5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwpAQCAtOTIyLDggKzkyMiw4IEBACiAKIC8qIFRoZSBwb3J0IGxvY2sgaXMgbm90IGhlbGQuICAqLwogc3RhdGljIHZvaWQKLXN1bnppbG9nX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpCitzdW56aWxvZ19zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJc3RydWN0IHVhcnRfc3Vuemlsb2dfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuemlsb2dfcG9ydCAqKSBwb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC91YXJ0bGl0ZS5jIGIvZHJpdmVycy9zZXJpYWwvdWFydGxpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmViYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvdWFydGxpdGUuYwpAQCAtMCwwICsxLDUwNSBAQAorLyoKKyAqIHVhcnRsaXRlLmM6IFNlcmlhbCBkcml2ZXIgZm9yIFhpbGlueCB1YXJ0bGl0ZSBzZXJpYWwgY29udHJvbGxlcgorICoKKyAqIFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgVUxJVEVfTUFKT1IJCTIwNAorI2RlZmluZSBVTElURV9NSU5PUgkJMTg3CisjZGVmaW5lIFVMSVRFX05SX1VBUlRTCQk0CisKKy8qIEZvciByZWdpc3RlciBkZXRhaWxzIHNlZSBkYXRhc2hlZXQ6CisgICBodHRwOi8vd3d3LnhpbGlueC5jb20vYnZkb2NzL2lwY2VudGVyL2RhdGFfc2hlZXQvb3BiX3VhcnRsaXRlLnBkZgorKi8KKyNkZWZpbmUgVUxJVEVfUlgJCTB4MDAKKyNkZWZpbmUgVUxJVEVfVFgJCTB4MDQKKyNkZWZpbmUgVUxJVEVfU1RBVFVTCQkweDA4CisjZGVmaW5lIFVMSVRFX0NPTlRST0wJCTB4MGMKKworI2RlZmluZSBVTElURV9SRUdJT04JCTE2CisKKyNkZWZpbmUgVUxJVEVfU1RBVFVTX1JYVkFMSUQJMHgwMQorI2RlZmluZSBVTElURV9TVEFUVVNfUlhGVUxMCTB4MDIKKyNkZWZpbmUgVUxJVEVfU1RBVFVTX1RYRU1QVFkJMHgwNAorI2RlZmluZSBVTElURV9TVEFUVVNfVFhGVUxMCTB4MDgKKyNkZWZpbmUgVUxJVEVfU1RBVFVTX0lFCQkweDEwCisjZGVmaW5lIFVMSVRFX1NUQVRVU19PVkVSUlVOCTB4MjAKKyNkZWZpbmUgVUxJVEVfU1RBVFVTX0ZSQU1FCTB4NDAKKyNkZWZpbmUgVUxJVEVfU1RBVFVTX1BBUklUWQkweDgwCisKKyNkZWZpbmUgVUxJVEVfQ09OVFJPTF9SU1RfVFgJMHgwMQorI2RlZmluZSBVTElURV9DT05UUk9MX1JTVF9SWAkweDAyCisjZGVmaW5lIFVMSVRFX0NPTlRST0xfSUUJMHgxMAorCisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9wb3J0IHBvcnRzW1VMSVRFX05SX1VBUlRTXTsKKworc3RhdGljIGludCB1bGl0ZV9yZWNlaXZlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBzdGF0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5pbmZvLT50dHk7CisJdW5zaWduZWQgY2hhciBjaCA9IDA7CisJY2hhciBmbGFnID0gVFRZX05PUk1BTDsKKworCWlmICgoc3RhdCAmIChVTElURV9TVEFUVVNfUlhWQUxJRCB8IFVMSVRFX1NUQVRVU19PVkVSUlVOCisJCSAgICAgfCBVTElURV9TVEFUVVNfRlJBTUUpKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIHN0YXRzICovCisJaWYgKHN0YXQgJiBVTElURV9TVEFUVVNfUlhWQUxJRCkgeworCQlwb3J0LT5pY291bnQucngrKzsKKwkJY2ggPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUxJVEVfUlgpOworCisJCWlmIChzdGF0ICYgVUxJVEVfU1RBVFVTX1BBUklUWSkKKwkJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKKwl9CisKKwlpZiAoc3RhdCAmIFVMSVRFX1NUQVRVU19PVkVSUlVOKQorCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOworCisJaWYgKHN0YXQgJiBVTElURV9TVEFUVVNfRlJBTUUpCisJCXBvcnQtPmljb3VudC5mcmFtZSsrOworCisKKwkvKiBkcm9wIGJ5dGUgd2l0aCBwYXJpdHkgZXJyb3IgaWYgSUdOUEFSIHNwZWNpZmljZWQgKi8KKwlpZiAoc3RhdCAmIHBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayAmIFVMSVRFX1NUQVRVU19QQVJJVFkpCisJCXN0YXQgJj0gflVMSVRFX1NUQVRVU19SWFZBTElEOworCisJc3RhdCAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCisJaWYgKHN0YXQgJiBVTElURV9TVEFUVVNfUEFSSVRZKQorCQlmbGFnID0gVFRZX1BBUklUWTsKKworCisJc3RhdCAmPSB+cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrOworCisJaWYgKHN0YXQgJiBVTElURV9TVEFUVVNfUlhWQUxJRCkKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CisKKwlpZiAoc3RhdCAmIFVMSVRFX1NUQVRVU19GUkFNRSkKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfRlJBTUUpOworCisJaWYgKHN0YXQgJiBVTElURV9TVEFUVVNfT1ZFUlJVTikKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1bGl0ZV90cmFuc21pdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgc3RhdCkKK3sKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgID0gJnBvcnQtPmluZm8tPnhtaXQ7CisKKwlpZiAoc3RhdCAmIFVMSVRFX1NUQVRVU19UWEZVTEwpCisJCXJldHVybiAwOworCisJaWYgKHBvcnQtPnhfY2hhcikgeworCQl3cml0ZWIocG9ydC0+eF9jaGFyLCBwb3J0LT5tZW1iYXNlICsgVUxJVEVfVFgpOworCQlwb3J0LT54X2NoYXIgPSAwOworCQlwb3J0LT5pY291bnQudHgrKzsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpCisJCXJldHVybiAwOworCisJd3JpdGViKHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgcG9ydC0+bWVtYmFzZSArIFVMSVRFX1RYKTsKKwl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRS0xKTsKKwlwb3J0LT5pY291bnQudHgrKzsKKworCS8qIHdha2UgdXAgKi8KKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB1bGl0ZV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAoc3RydWN0IHVhcnRfcG9ydCAqKWRldl9pZDsKKwlpbnQgYnVzeTsKKworCWRvIHsKKwkJaW50IHN0YXQgPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUxJVEVfU1RBVFVTKTsKKwkJYnVzeSAgPSB1bGl0ZV9yZWNlaXZlKHBvcnQsIHN0YXQpOworCQlidXN5IHw9IHVsaXRlX3RyYW5zbWl0KHBvcnQsIHN0YXQpOworCX0gd2hpbGUgKGJ1c3kpOworCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydC0+aW5mby0+dHR5KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB1bGl0ZV90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJcmV0ID0gcmVhZGIocG9ydC0+bWVtYmFzZSArIFVMSVRFX1NUQVRVUyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldCAmIFVMSVRFX1NUQVRVU19UWEVNUFRZID8gVElPQ1NFUl9URU1UIDogMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB1bGl0ZV9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gVElPQ01fQ1RTIHwgVElPQ01fRFNSIHwgVElPQ01fQ0FSOworfQorCitzdGF0aWMgdm9pZCB1bGl0ZV9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQoreworCS8qIE4vQSAqLworfQorCitzdGF0aWMgdm9pZCB1bGl0ZV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB2b2lkIHVsaXRlX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdWxpdGVfdHJhbnNtaXQocG9ydCwgcmVhZGIocG9ydC0+bWVtYmFzZSArIFVMSVRFX1NUQVRVUykpOworfQorCitzdGF0aWMgdm9pZCB1bGl0ZV9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogZG9uJ3QgZm9yd2FyZCBhbnkgbW9yZSBkYXRhIChsaWtlICFDUkVBRCkgKi8KKwlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgPSBVTElURV9TVEFUVVNfUlhWQUxJRCB8IFVMSVRFX1NUQVRVU19QQVJJVFkKKwkJfCBVTElURV9TVEFUVVNfRlJBTUUgfCBVTElURV9TVEFUVVNfT1ZFUlJVTjsKK30KKworc3RhdGljIHZvaWQgdWxpdGVfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB2b2lkIHVsaXRlX2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY3RsKQoreworCS8qIE4vQSAqLworfQorCitzdGF0aWMgaW50IHVsaXRlX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEocG9ydC0+aXJxLCB1bGl0ZV9pc3IsCisJCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00sICJ1YXJ0bGl0ZSIsIHBvcnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3cml0ZWIoVUxJVEVfQ09OVFJPTF9SU1RfUlggfCBVTElURV9DT05UUk9MX1JTVF9UWCwKKwkgICAgICAgcG9ydC0+bWVtYmFzZSArIFVMSVRFX0NPTlRST0wpOworCXdyaXRlYihVTElURV9DT05UUk9MX0lFLCBwb3J0LT5tZW1iYXNlICsgVUxJVEVfQ09OVFJPTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWxpdGVfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl3cml0ZWIoMCwgcG9ydC0+bWVtYmFzZSArIFVMSVRFX0NPTlRST0wpOworCXJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVTElURV9DT05UUk9MKTsgLyogZHVtbXkgKi8KKwlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOworfQorCitzdGF0aWMgdm9pZCB1bGl0ZV9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCQkgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBiYXVkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgPSBVTElURV9TVEFUVVNfUlhWQUxJRCB8IFVMSVRFX1NUQVRVU19PVkVSUlVOCisJCXwgVUxJVEVfU1RBVFVTX1RYRlVMTDsKKworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSU5QQ0spCisJCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0KKwkJCVVMSVRFX1NUQVRVU19QQVJJVFkgfCBVTElURV9TVEFUVVNfRlJBTUU7CisKKwlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQorCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUxJVEVfU1RBVFVTX1BBUklUWQorCQkJfCBVTElURV9TVEFUVVNfRlJBTUUgfCBVTElURV9TVEFUVVNfT1ZFUlJVTjsKKworCS8qIGlnbm9yZSBhbGwgY2hhcmFjdGVycyBpZiBDUkVBRCBpcyBub3Qgc2V0ICovCisJaWYgKCh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpID09IDApCisJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PQorCQkJVUxJVEVfU1RBVFVTX1JYVkFMSUQgfCBVTElURV9TVEFUVVNfUEFSSVRZCisJCQl8IFVMSVRFX1NUQVRVU19GUkFNRSB8IFVMSVRFX1NUQVRVU19PVkVSUlVOOworCisJLyogdXBkYXRlIHRpbWVvdXQgKi8KKwliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwgNDYwODAwKTsKKwl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdWxpdGVfdHlwZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBwb3J0LT50eXBlID09IFBPUlRfVUFSVExJVEUgPyAidWFydGxpdGUiIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgdWxpdGVfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsIFVMSVRFX1JFR0lPTik7CisJaW91bm1hcChwb3J0LT5tZW1iYXNlKTsKKwlwb3J0LT5tZW1iYXNlID0gMDsKK30KKworc3RhdGljIGludCB1bGl0ZV9yZXF1ZXN0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBVTElURV9SRUdJT04sICJ1YXJ0bGl0ZSIpKSB7CisJCWRldl9lcnIocG9ydC0+ZGV2LCAiTWVtb3J5IHJlZ2lvbiBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwb3J0LT5tZW1iYXNlID0gaW9yZW1hcChwb3J0LT5tYXBiYXNlLCBVTElURV9SRUdJT04pOworCWlmICghcG9ydC0+bWVtYmFzZSkgeworCQlkZXZfZXJyKHBvcnQtPmRldiwgIlVuYWJsZSB0byBtYXAgcmVnaXN0ZXJzXG4iKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsIFVMSVRFX1JFR0lPTik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVsaXRlX2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKK3sKKwl1bGl0ZV9yZXF1ZXN0X3BvcnQocG9ydCk7CisJcG9ydC0+dHlwZSA9IFBPUlRfVUFSVExJVEU7Cit9CisKK3N0YXRpYyBpbnQgdWxpdGVfdmVyaWZ5X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnNlcikKK3sKKwkvKiB3ZSBkb24ndCB3YW50IHRoZSBjb3JlIGNvZGUgdG8gbW9kaWZ5IGFueSBwb3J0IHBhcmFtcyAqLworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIHVsaXRlX29wcyA9IHsKKwkudHhfZW1wdHkJPSB1bGl0ZV90eF9lbXB0eSwKKwkuc2V0X21jdHJsCT0gdWxpdGVfc2V0X21jdHJsLAorCS5nZXRfbWN0cmwJPSB1bGl0ZV9nZXRfbWN0cmwsCisJLnN0b3BfdHgJPSB1bGl0ZV9zdG9wX3R4LAorCS5zdGFydF90eAk9IHVsaXRlX3N0YXJ0X3R4LAorCS5zdG9wX3J4CT0gdWxpdGVfc3RvcF9yeCwKKwkuZW5hYmxlX21zCT0gdWxpdGVfZW5hYmxlX21zLAorCS5icmVha19jdGwJPSB1bGl0ZV9icmVha19jdGwsCisJLnN0YXJ0dXAJPSB1bGl0ZV9zdGFydHVwLAorCS5zaHV0ZG93bgk9IHVsaXRlX3NodXRkb3duLAorCS5zZXRfdGVybWlvcwk9IHVsaXRlX3NldF90ZXJtaW9zLAorCS50eXBlCQk9IHVsaXRlX3R5cGUsCisJLnJlbGVhc2VfcG9ydAk9IHVsaXRlX3JlbGVhc2VfcG9ydCwKKwkucmVxdWVzdF9wb3J0CT0gdWxpdGVfcmVxdWVzdF9wb3J0LAorCS5jb25maWdfcG9ydAk9IHVsaXRlX2NvbmZpZ19wb3J0LAorCS52ZXJpZnlfcG9ydAk9IHVsaXRlX3ZlcmlmeV9wb3J0Cit9OworCisjaWZkZWYgQ09ORklHX1NFUklBTF9VQVJUTElURV9DT05TT0xFCitzdGF0aWMgdm9pZCB1bGl0ZV9jb25zb2xlX3dhaXRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpbnQgaTsKKworCS8qIHdhaXQgdXAgdG8gMTBtcyBmb3IgdGhlIGNoYXJhY3RlcihzKSB0byBiZSBzZW50ICovCisJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJaWYgKHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVTElURV9TVEFUVVMpICYgVUxJVEVfU1RBVFVTX1RYRU1QVFkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgdWxpdGVfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKK3sKKwl1bGl0ZV9jb25zb2xlX3dhaXRfdHgocG9ydCk7CisJd3JpdGViKGNoLCBwb3J0LT5tZW1iYXNlICsgVUxJVEVfVFgpOworfQorCitzdGF0aWMgdm9pZCB1bGl0ZV9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywKKwkJCQl1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZwb3J0c1tjby0+aW5kZXhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGllcjsKKwlpbnQgbG9ja2VkID0gMTsKKworCWlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJfSBlbHNlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwkvKiBzYXZlIGFuZCBkaXNhYmxlIGludGVycnVwdCAqLworCWllciA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVTElURV9TVEFUVVMpICYgVUxJVEVfU1RBVFVTX0lFOworCXdyaXRlYigwLCBwb3J0LT5tZW1iYXNlICsgVUxJVEVfQ09OVFJPTCk7CisKKwl1YXJ0X2NvbnNvbGVfd3JpdGUocG9ydCwgcywgY291bnQsIHVsaXRlX2NvbnNvbGVfcHV0Y2hhcik7CisKKwl1bGl0ZV9jb25zb2xlX3dhaXRfdHgocG9ydCk7CisKKwkvKiByZXN0b3JlIGludGVycnVwdCBzdGF0ZSAqLworCWlmIChpZXIpCisJCXdyaXRlYihVTElURV9DT05UUk9MX0lFLCBwb3J0LT5tZW1iYXNlICsgVUxJVEVfQ09OVFJPTCk7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHVsaXRlX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CisJaW50IGJhdWQgPSA5NjAwOworCWludCBiaXRzID0gODsKKwlpbnQgcGFyaXR5ID0gJ24nOworCWludCBmbG93ID0gJ24nOworCisJaWYgKGNvLT5pbmRleCA8IDAgfHwgY28tPmluZGV4ID49IFVMSVRFX05SX1VBUlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvcnQgPSAmcG9ydHNbY28tPmluZGV4XTsKKworCS8qIG5vdCBpbml0aWFsaXplZCB5ZXQ/ICovCisJaWYgKCFwb3J0LT5tZW1iYXNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChvcHRpb25zKQorCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CisKKwlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciB1bGl0ZV91YXJ0X2RyaXZlcjsKKworc3RhdGljIHN0cnVjdCBjb25zb2xlIHVsaXRlX2NvbnNvbGUgPSB7CisJLm5hbWUJPSAidHR5VUwiLAorCS53cml0ZQk9IHVsaXRlX2NvbnNvbGVfd3JpdGUsCisJLmRldmljZQk9IHVhcnRfY29uc29sZV9kZXZpY2UsCisJLnNldHVwCT0gdWxpdGVfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CT0gLTEsIC8qIFNwZWNpZmllZCBvbiB0aGUgY21kbGluZSAoZS5nLiBjb25zb2xlPXR0eVVMMCApICovCisJLmRhdGEJPSAmdWxpdGVfdWFydF9kcml2ZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1bGl0ZV9jb25zb2xlX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9jb25zb2xlKCZ1bGl0ZV9jb25zb2xlKTsKKwlyZXR1cm4gMDsKK30KKworY29uc29sZV9pbml0Y2FsbCh1bGl0ZV9jb25zb2xlX2luaXQpOworCisjZW5kaWYgLyogQ09ORklHX1NFUklBTF9VQVJUTElURV9DT05TT0xFICovCisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgdWxpdGVfdWFydF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJ1YXJ0bGl0ZSIsCisJLmRldl9uYW1lCT0gInR0eVVMIiwKKwkubWFqb3IJCT0gVUxJVEVfTUFKT1IsCisJLm1pbm9yCQk9IFVMSVRFX01JTk9SLAorCS5ucgkJPSBVTElURV9OUl9VQVJUUywKKyNpZmRlZiBDT05GSUdfU0VSSUFMX1VBUlRMSVRFX0NPTlNPTEUKKwkuY29ucwkJPSAmdWxpdGVfY29uc29sZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdWxpdGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgKnJlczI7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydDsKKworCWlmIChwZGV2LT5pZCA8IDAgfHwgcGRldi0+aWQgPj0gVUxJVEVfTlJfVUFSVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcnRzW3BkZXYtPmlkXS5tZW1iYXNlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXMyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAoIXJlczIpCisJCXJldHVybiAtRU5PREVWOworCisJcG9ydCA9ICZwb3J0c1twZGV2LT5pZF07CisKKwlwb3J0LT5maWZvc2l6ZQk9IDE2OworCXBvcnQtPnJlZ3NoaWZ0CT0gMjsKKwlwb3J0LT5pb3R5cGUJPSBVUElPX01FTTsKKwlwb3J0LT5pb2Jhc2UJPSAxOyAvKiBtYXJrIHBvcnQgaW4gdXNlICovCisJcG9ydC0+bWFwYmFzZQk9IHJlcy0+c3RhcnQ7CisJcG9ydC0+bWVtYmFzZQk9IDA7CisJcG9ydC0+b3BzCT0gJnVsaXRlX29wczsKKwlwb3J0LT5pcnEJPSByZXMyLT5zdGFydDsKKwlwb3J0LT5mbGFncwk9IFVQRl9CT09UX0FVVE9DT05GOworCXBvcnQtPmRldgk9ICZwZGV2LT5kZXY7CisJcG9ydC0+dHlwZQk9IFBPUlRfVU5LTk9XTjsKKwlwb3J0LT5saW5lCT0gcGRldi0+aWQ7CisKKwl1YXJ0X2FkZF9vbmVfcG9ydCgmdWxpdGVfdWFydF9kcml2ZXIsIHBvcnQpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWxpdGVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpZiAocG9ydCkKKwkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnVsaXRlX3VhcnRfZHJpdmVyLCBwb3J0KTsKKworCS8qIG1hcmsgcG9ydCBhcyBmcmVlICovCisJcG9ydC0+bWVtYmFzZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdWxpdGVfcGxhdGZvcm1fZHJpdmVyID0geworCS5wcm9iZQk9IHVsaXRlX3Byb2JlLAorCS5yZW1vdmUJPSB1bGl0ZV9yZW1vdmUsCisJLmRyaXZlcgk9IHsKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5uYW1lICA9ICJ1YXJ0bGl0ZSIsCisJCSAgIH0sCit9OworCitpbnQgX19pbml0IHVsaXRlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnVsaXRlX3VhcnRfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ1bGl0ZV9wbGF0Zm9ybV9kcml2ZXIpOworCWlmIChyZXQpCisJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnVsaXRlX3VhcnRfZHJpdmVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgX19leGl0IHVsaXRlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdWxpdGVfcGxhdGZvcm1fZHJpdmVyKTsKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZ1bGl0ZV91YXJ0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVsaXRlX2luaXQpOworbW9kdWxlX2V4aXQodWxpdGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhpbGlueCB1YXJ0bGl0ZSBzZXJpYWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC92ODUwZV91YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC92ODUwZV91YXJ0LmMKaW5kZXggMjhmM2JiZi4uZGQ5OGFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvdjg1MGVfdWFydC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3Y4NTBlX3VhcnQuYwpAQCAtNDA0LDggKzQwNCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi12ODUwZV91YXJ0X3NldF90ZXJtaW9zIChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKLQkJICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkKQordjg1MGVfdWFydF9zZXRfdGVybWlvcyAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQkgICAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXVuc2lnbmVkIGNmbGFncyA9IHRlcm1pb3MtPmNfY2ZsYWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3ZyNDF4eF9zaXUuYyBiL2RyaXZlcnMvc2VyaWFsL3ZyNDF4eF9zaXUuYwppbmRleCBmZDUxZjgxLi5jZjBlNjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC92cjQxeHhfc2l1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdnI0MXh4X3NpdS5jCkBAIC01NjIsOCArNTYyLDggQEAKIAlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwogfQogCi1zdGF0aWMgdm9pZCBzaXVfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm5ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorc3RhdGljIHZvaWQgc2l1X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXRjZmxhZ190IGNfY2ZsYWcsIGNfaWZsYWc7CiAJdWludDhfdCBsY3IsIGZjciwgaWVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zbi9LY29uZmlnIGIvZHJpdmVycy9zbi9LY29uZmlnCmluZGV4IGEzNDczMTYuLmM2NmJhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc24vS2NvbmZpZworKysgYi9kcml2ZXJzL3NuL0tjb25maWcKQEAgLTUsMTkgKzUsNiBAQAogbWVudSAiU04gRGV2aWNlcyIKIAlkZXBlbmRzIG9uIFNHSV9TTgogCi1jb25maWcgU0dJX0lPQzQKLQl0cmlzdGF0ZSAiU0dJIElPQzQgQmFzZSBJTyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTU1USU1FUgotCWRlZmF1bHQgbQotCS0tLWhlbHAtLS0KLQlUaGlzIG9wdGlvbiBlbmFibGVzIGJhc2ljIHN1cHBvcnQgZm9yIHRoZSBTR0kgSU9DNC1iYXNlZCBCYXNlIElPCi0JY29udHJvbGxlciBjYXJkLiAgVGhpcyBvcHRpb24gZG9lcyBub3QgZW5hYmxlIGFueSBzcGVjaWZpYwotCWZ1bmN0aW9ucyBvbiBzdWNoIGEgY2FyZCwgYnV0IHByb3ZpZGVzIG5lY2Vzc2FyeSBpbmZyYXN0cnVjdHVyZQotCWZvciBvdGhlciBkcml2ZXJzIHRvIHV0aWxpemUuCi0KLQlJZiB5b3UgaGF2ZSBhbiBTR0kgQWx0aXggd2l0aCBhbiBJT0M0LWJhc2VkCi0JSS9PIGNvbnRyb2xsZXIgc2F5IFkuICBPdGhlcndpc2Ugc2F5IE4uCi0KIGNvbmZpZyBTR0lfSU9DMwogCXRyaXN0YXRlICJTR0kgSU9DMyBCYXNlIElPIHN1cHBvcnQiCiAJZGVmYXVsdCBtCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NuL01ha2VmaWxlIGIvZHJpdmVycy9zbi9NYWtlZmlsZQppbmRleCAyY2RhMDExLi42OTNkYjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc24vTWFrZWZpbGUKQEAgLTMsNSArMyw0IEBACiAjCiAjCiAKLW9iai0kKENPTkZJR19TR0lfSU9DNCkgKz0gaW9jNC5vCiBvYmotJChDT05GSUdfU0dJX0lPQzMpICs9IGlvYzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zbi9pb2M0LmMgYi9kcml2ZXJzL3NuL2lvYzQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2MjgyMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NuL2lvYzQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYXN0ZXIgZHJpdmVyIG1vZHVsZSBmb3IgdXNlIGJ5IFNHSSBJT0M0IHN1YmRyaXZlcnMuCi0gKgotICogSXQgYWxsb2NhdGVzIGFueSByZXNvdXJjZXMgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgc3ViZGV2aWNlcywgYW5kCi0gKiBwcm92aWRlcyBhY2Nlc3NvciBmdW5jdGlvbnMgKHdoZXJlIG5lZWRlZCkgYW5kIHRoZSBsaWtlIGZvciB0aG9zZQotICogcmVzb3VyY2VzLiAgSXQgYWxzbyBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgdGhlIHN1YmRldmljZSBtb2R1bGVzCi0gKiB0byBzdXBwb3J0IGxvYWRpbmcgYW5kIHVubG9hZGluZy4KLSAqCi0gKiBOb24tc2hhcmVkIHJlc291cmNlcyAoZS5nLiBleHRlcm5hbCBpbnRlcnJ1cHQgQV9JTlRfT1VUIHJlZ2lzdGVyIHBhZ2UKLSAqIGFsaWFzLCBzZXJpYWwgcG9ydCBhbmQgVUFSVCByZWdpc3RlcnMpIGFyZSBoYW5kbGVkIGJ5IHRoZSBzdWJkZXZpY2UKLSAqIG1vZHVsZXMgdGhlbXNlbHZlcy4KLSAqCi0gKiBUaGlzIGlzIGFsbCBuZWNlc3NhcnkgYmVjYXVzZSBJT0M0IGlzIG5vdCBpbXBsZW1lbnRlZCBhcyBhIG11bHRpLWZ1bmN0aW9uCi0gKiBQQ0kgZGV2aWNlLCBidXQgYW4gYW1hbGdhbWF0aW9uIG9mIGRpc3BhcmF0ZSByZWdpc3RlcnMgZm9yIHNldmVyYWwKLSAqIHR5cGVzIG9mIGRldmljZSAoQVRBLCBzZXJpYWwsIGV4dGVybmFsIGludGVycnVwdHMpLiAgVGhlIG5vcm1hbAotICogcmVzb3VyY2UgbWFuYWdlbWVudCBpbiB0aGUga2VybmVsIGRvZXNuJ3QgaGF2ZSBxdWl0ZSB0aGUgcmlnaHQgaW50ZXJmYWNlcwotICogdG8gaGFuZGxlIHRoaXMgc2l0dWF0aW9uIChlLmcuIG11bHRpcGxlIG1vZHVsZXMgY2FuJ3QgY2xhaW0gdGhlIHNhbWUKLSAqIFBDSSBJRCksIHRodXMgdGhpcyBJT0M0IG1hc3RlciBtb2R1bGUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jNC5oPgotI2luY2x1ZGUgPGxpbnV4L21tdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9ydGMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgotI2luY2x1ZGUgPGFzbS9zbi9jbGtzdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NuL3NodWJfbW1yLmg+Ci0KLS8qKioqKioqKioqKioqKioKLSAqIERlZmluaXRpb25zICoKLSAqKioqKioqKioqKioqKiovCi0KLS8qIFR3ZWFrYWJsZSB2YWx1ZXMgKi8KLQotLyogUENJIGJ1cyBzcGVlZCBkZXRlY3Rpb24vY2FsaWJyYXRpb24gKi8KLSNkZWZpbmUgSU9DNF9DQUxJQlJBVEVfQ09VTlQgNjMJLyogQ2FsaWJyYXRpb24gY3ljbGUgcGVyaW9kICovCi0jZGVmaW5lIElPQzRfQ0FMSUJSQVRFX0NZQ0xFUyAyNTYJLyogQXZlcmFnZSBvdmVyIHRoaXMgbWFueSBjeWNsZXMgKi8KLSNkZWZpbmUgSU9DNF9DQUxJQlJBVEVfRElTQ0FSRCAyCS8qIERpc2NhcmQgZmlyc3QgZmV3IGN5Y2xlcyAqLwotI2RlZmluZSBJT0M0X0NBTElCUkFURV9MT1dfTUhaIDI1CS8qIExvd2VyIGJvdW5kIG9uIGJ1cyBzcGVlZCBzYW5pdHkgKi8KLSNkZWZpbmUgSU9DNF9DQUxJQlJBVEVfSElHSF9NSFogNzUJLyogVXBwZXIgYm91bmQgb24gYnVzIHNwZWVkIHNhbml0eSAqLwotI2RlZmluZSBJT0M0X0NBTElCUkFURV9ERUZBVUxUX01IWiA2NgkvKiBBc3N1bWVkIGlmIHNhbml0eSBjaGVjayBmYWlscyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdWJtb2R1bGUgbWFuYWdlbWVudCAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgREVGSU5FX01VVEVYKGlvYzRfbXV0ZXgpOwotCi1zdGF0aWMgTElTVF9IRUFEKGlvYzRfZGV2aWNlcyk7Ci1zdGF0aWMgTElTVF9IRUFEKGlvYzRfc3VibW9kdWxlcyk7Ci0KLS8qIFJlZ2lzdGVyIGFuIElPQzQgc3VibW9kdWxlICovCi1pbnQKLWlvYzRfcmVnaXN0ZXJfc3VibW9kdWxlKHN0cnVjdCBpb2M0X3N1Ym1vZHVsZSAqaXMpCi17Ci0Jc3RydWN0IGlvYzRfZHJpdmVyX2RhdGEgKmlkZDsKLQotCW11dGV4X2xvY2soJmlvYzRfbXV0ZXgpOwotCWxpc3RfYWRkKCZpcy0+aXNfbGlzdCwgJmlvYzRfc3VibW9kdWxlcyk7Ci0KLQkvKiBJbml0aWFsaXplIHN1Ym1vZHVsZSBmb3IgZWFjaCBJT0M0ICovCi0JaWYgKCFpcy0+aXNfcHJvYmUpCi0JCWdvdG8gb3V0OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpZGQsICZpb2M0X2RldmljZXMsIGlkZF9saXN0KSB7Ci0JCWlmIChpcy0+aXNfcHJvYmUoaWRkKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogSU9DNCBzdWJtb2R1bGUgJXMgcHJvYmUgZmFpbGVkICIKLQkJCSAgICAgICAiZm9yIHBjaV9kZXYgJXMiLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgbW9kdWxlX25hbWUoaXMtPmlzX293bmVyKSwKLQkJCSAgICAgICBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSk7Ci0JCX0KLQl9Ci0gb3V0OgotCW11dGV4X3VubG9jaygmaW9jNF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFVucmVnaXN0ZXIgYW4gSU9DNCBzdWJtb2R1bGUgKi8KLXZvaWQKLWlvYzRfdW5yZWdpc3Rlcl9zdWJtb2R1bGUoc3RydWN0IGlvYzRfc3VibW9kdWxlICppcykKLXsKLQlzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkOwotCi0JbXV0ZXhfbG9jaygmaW9jNF9tdXRleCk7Ci0JbGlzdF9kZWwoJmlzLT5pc19saXN0KTsKLQotCS8qIFJlbW92ZSBzdWJtb2R1bGUgZm9yIGVhY2ggSU9DNCAqLwotCWlmICghaXMtPmlzX3JlbW92ZSkKLQkJZ290byBvdXQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlkZCwgJmlvYzRfZGV2aWNlcywgaWRkX2xpc3QpIHsKLQkJaWYgKGlzLT5pc19yZW1vdmUoaWRkKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogSU9DNCBzdWJtb2R1bGUgJXMgcmVtb3ZlIGZhaWxlZCAiCi0JCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZHVsZV9uYW1lKGlzLT5pc19vd25lciksCi0JCQkgICAgICAgcGNpX25hbWUoaWRkLT5pZGRfcGRldikpOwotCQl9Ci0JfQotIG91dDoKLQltdXRleF91bmxvY2soJmlvYzRfbXV0ZXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZXZpY2UgbWFuYWdlbWVudCAqCi0gKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIElPQzRfQ0FMSUJSQVRFX0xPV19MSU1JVCBcCi0JKDEwMDAqSU9DNF9FWFRJTlRfQ09VTlRfRElWSVNPUi9JT0M0X0NBTElCUkFURV9MT1dfTUhaKQotI2RlZmluZSBJT0M0X0NBTElCUkFURV9ISUdIX0xJTUlUIFwKLQkoMTAwMCpJT0M0X0VYVElOVF9DT1VOVF9ESVZJU09SL0lPQzRfQ0FMSUJSQVRFX0hJR0hfTUhaKQotI2RlZmluZSBJT0M0X0NBTElCUkFURV9ERUZBVUxUIFwKLQkoMTAwMCpJT0M0X0VYVElOVF9DT1VOVF9ESVZJU09SL0lPQzRfQ0FMSUJSQVRFX0RFRkFVTFRfTUhaKQotCi0jZGVmaW5lIElPQzRfQ0FMSUJSQVRFX0VORCBcCi0JKElPQzRfQ0FMSUJSQVRFX0NZQ0xFUyArIElPQzRfQ0FMSUJSQVRFX0RJU0NBUkQpCi0KLSNkZWZpbmUgSU9DNF9JTlRfT1VUX01PREVfVE9HR0xFIDB4NwkvKiBUb2dnbGUgSU5UX09VVCBldmVyeSBDT1VOVCsxIHRpY2tzICovCi0KLS8qIERldGVybWluZXMgZXh0ZXJuYWwgaW50ZXJydXB0IG91dHB1dCBjbG9jayBwZXJpb2Qgb2YgdGhlIFBDSSBidXMgYW4KLSAqIElPQzQgaXMgYXR0YWNoZWQgdG8uICBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgUENJCi0gKiBidXMgc3BlZWQuCi0gKgotICogSU9DNCBoYXMgYSBkZXNpZ24gZmVhdHVyZSB0aGF0IHZhcmlvdXMgaW50ZXJuYWwgdGltZXJzIGFyZSBkZXJpdmVkIGZyb20KLSAqIHRoZSBQQ0kgYnVzIGNsb2NrLiAgVGhpcyBjYXVzZXMgSU9DNCBkZXZpY2UgZHJpdmVycyB0byBuZWVkIHRvIHRha2UgdGhlCi0gKiBidXMgc3BlZWQgaW50byBhY2NvdW50IHdoZW4gc2V0dGluZyB2YXJpb3VzIHJlZ2lzdGVyIHZhbHVlcyAoZS5nLiBJTlRfT1VUCi0gKiByZWdpc3RlciBDT1VOVCBmaWVsZCwgVUFSVCBkaXZpc29ycywgZXRjKS4gIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMKLSAqIG5lZWRlZCBieSBzZXZlcmFsIHN1YmRyaXZlcnMsIGl0IGlzIGRldGVybWluZWQgYnkgdGhlIG1haW4gSU9DNCBkcml2ZXIsCi0gKiBldmVuIHRob3VnaCB0aGUgZm9sbG93aW5nIGNvZGUgdXRpbGl6ZXMgZXh0ZXJuYWwgaW50ZXJydXB0IHJlZ2lzdGVycwotICogdG8gcGVyZm9ybSB0aGUgc3BlZWQgY2FsY3VsYXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1pb2M0X2Nsb2NrX2NhbGlicmF0ZShzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkKQotewotCWV4dGVybiB1bnNpZ25lZCBsb25nIHNuX3J0Y19jeWNsZXNfcGVyX3NlY29uZDsKLQl1bmlvbiBpb2M0X2ludF9vdXQgaW50X291dDsKLQl1bmlvbiBpb2M0X2dwY3IgZ3BjcjsKLQl1bnNpZ25lZCBpbnQgc3RhdGUsIGxhc3Rfc3RhdGUgPSAxOwotCXVpbnQ2NF90IHN0YXJ0ID0gMCwgZW5kLCBwZXJpb2Q7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCS8qIEVuYWJsZSBvdXRwdXQgKi8KLQlncGNyLnJhdyA9IDA7Ci0JZ3Bjci5maWVsZHMuZGlyID0gSU9DNF9HUENSX0RJUl8wOwotCWdwY3IuZmllbGRzLmludF9vdXRfZW4gPSAxOwotCXdyaXRlbChncGNyLnJhdywgJmlkZC0+aWRkX21pc2NfcmVncy0+Z3Bjcl9zLnJhdyk7Ci0KLQkvKiBSZXNldCB0byBwb3dlci1vbiBzdGF0ZSAqLwotCXdyaXRlbCgwLCAmaWRkLT5pZGRfbWlzY19yZWdzLT5pbnRfb3V0LnJhdyk7Ci0JbW1pb3diKCk7Ci0KLQkvKiBTZXQgdXAgc3F1YXJlIHdhdmUgKi8KLQlpbnRfb3V0LnJhdyA9IDA7Ci0JaW50X291dC5maWVsZHMuY291bnQgPSBJT0M0X0NBTElCUkFURV9DT1VOVDsKLQlpbnRfb3V0LmZpZWxkcy5tb2RlID0gSU9DNF9JTlRfT1VUX01PREVfVE9HR0xFOwotCWludF9vdXQuZmllbGRzLmRpYWcgPSAwOwotCXdyaXRlbChpbnRfb3V0LnJhdywgJmlkZC0+aWRkX21pc2NfcmVncy0+aW50X291dC5yYXcpOwotCW1taW93YigpOwotCi0JLyogQ2hlY2sgc3F1YXJlIHdhdmUgcGVyaW9kIGF2ZXJhZ2VkIG92ZXIgc29tZSBudW1iZXIgb2YgY3ljbGVzICovCi0JZG8gewotCQlpbnRfb3V0LnJhdyA9IHJlYWRsKCZpZGQtPmlkZF9taXNjX3JlZ3MtPmludF9vdXQucmF3KTsKLQkJc3RhdGUgPSBpbnRfb3V0LmZpZWxkcy5pbnRfb3V0OwotCQlpZiAoIWxhc3Rfc3RhdGUgJiYgc3RhdGUpIHsKLQkJCWNvdW50Kys7Ci0JCQlpZiAoY291bnQgPT0gSU9DNF9DQUxJQlJBVEVfRU5EKSB7Ci0JCQkJZW5kID0gcnRjX3RpbWUoKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoY291bnQgPT0gSU9DNF9DQUxJQlJBVEVfRElTQ0FSRCkKLQkJCQlzdGFydCA9IHJ0Y190aW1lKCk7Ci0JCX0KLQkJbGFzdF9zdGF0ZSA9IHN0YXRlOwotCX0gd2hpbGUgKDEpOwotCi0JLyogQ2FsY3VsYXRpb24gcmVhcnJhbmdlZCB0byBwcmVzZXJ2ZSBpbnRlcm1lZGlhdGUgcHJlY2lzaW9uLgotCSAqIExvZ2ljYWxseToKLQkgKiAxLiAiZW5kIC0gc3RhcnQiIGdpdmVzIHVzIG51bWJlciBvZiBSVEMgY3ljbGVzIG92ZXIgYWxsIHRoZQotCSAqICAgIHNxdWFyZSB3YXZlIGN5Y2xlcyBtZWFzdXJlZC4KLQkgKiAyLiBEaXZpZGUgYnkgbnVtYmVyIG9mIHNxdWFyZSB3YXZlIGN5Y2xlcyB0byBnZXQgbnVtYmVyIG9mCi0JICogICAgUlRDIGN5Y2xlcyBwZXIgc3F1YXJlIHdhdmUgY3ljbGUuCi0JICogMy4gRGl2aWRlIGJ5IDIqKGludF9vdXQuZmllbGRzLmNvdW50KzEpLCB3aGljaCBpcyB0aGUgZm9ybXVsYQotCSAqICAgIGJ5IHdoaWNoIHRoZSBJT0M0IGdlbmVyYXRlcyB0aGUgc3F1YXJlIHdhdmUsIHRvIGdldCB0aGUKLQkgKiAgICBudW1iZXIgb2YgUlRDIGN5Y2xlcyBwZXIgSU9DNCBJTlRfT1VUIGNvdW50LgotCSAqIDQuIERpdmlkZSBieSBzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQgdG8gZ2V0IHNlY29uZHMgcGVyCi0JICogICAgY291bnQuCi0JICogNS4gTXVsdGlwbHkgYnkgMUU5IHRvIGdldCBuYW5vc2Vjb25kcyBwZXIgY291bnQuCi0JICovCi0JcGVyaW9kID0gKChlbmQgLSBzdGFydCkgKiAxMDAwMDAwMDAwKSAvCi0JICAgIChJT0M0X0NBTElCUkFURV9DWUNMRVMgKiAyICogKElPQzRfQ0FMSUJSQVRFX0NPVU5UICsgMSkKLQkgICAgICogc25fcnRjX2N5Y2xlc19wZXJfc2Vjb25kKTsKLQotCS8qIEJvdW5kcyBjaGVjayB0aGUgcmVzdWx0LiAqLwotCWlmIChwZXJpb2QgPiBJT0M0X0NBTElCUkFURV9MT1dfTElNSVQgfHwKLQkgICAgcGVyaW9kIDwgSU9DNF9DQUxJQlJBVEVfSElHSF9MSU1JVCkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiSU9DNCAlczogQ2xvY2sgY2FsaWJyYXRpb24gZmFpbGVkLiAgQXNzdW1pbmciCi0JCSAgICAgICAiUENJIGNsb2NrIGlzICVkIG5zLlxuIiwKLQkJICAgICAgIHBjaV9uYW1lKGlkZC0+aWRkX3BkZXYpLAotCQkgICAgICAgSU9DNF9DQUxJQlJBVEVfREVGQVVMVCAvIElPQzRfRVhUSU5UX0NPVU5UX0RJVklTT1IpOwotCQlwZXJpb2QgPSBJT0M0X0NBTElCUkFURV9ERUZBVUxUOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAgICAiSU9DNCAlczogUENJIGNsb2NrIGlzICVsZCBucy5cbiIsCi0JCSAgICAgICBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSwKLQkJICAgICAgIHBlcmlvZCAvIElPQzRfRVhUSU5UX0NPVU5UX0RJVklTT1IpOwotCX0KLQotCS8qIFJlbWVtYmVyIHJlc3VsdHMuICBXZSBzdG9yZSB0aGUgZXh0aW50IGNsb2NrIHBlcmlvZCByYXRoZXIKLQkgKiB0aGFuIHRoZSBQQ0kgY2xvY2sgcGVyaW9kIHNvIHRoYXQgZ3JlYXRlciBwcmVjaXNpb24gaXMKLQkgKiByZXRhaW5lZC4gIERpdmlkZSBieSBJT0M0X0VYVElOVF9DT1VOVF9ESVZJU09SIHRvIGdldAotCSAqIFBDSSBjbG9jayBwZXJpb2QuCi0JICovCi0JaWRkLT5jb3VudF9wZXJpb2QgPSBwZXJpb2Q7Ci19Ci0KLS8qIFRoZXJlIGFyZSB0aHJlZSB2YXJpYW50cyBvZiBJT0M0IGNhcmRzOiBJTzksIElPMTAsIGFuZCBQQ0ktUlQuCi0gKiBFYWNoIGJyaW5ncyBvdXQgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBJT0M0IHNpZ25hbHMsIHRodXMuCi0gKiB0aGUgSU9DNCBzdWJkcml2ZXJzIG5lZWQgdG8ga25vdyB0byB3aGljaCB3ZSdyZSBhdHRhY2hlZC4KLSAqCi0gKiBXZSBsb29rIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBTQ1NJIChJTzkpIG9yIFNBVEEgKElPMTApIGNvbnRyb2xsZXIKLSAqIG9uIHRoZSBzYW1lIFBDSSBidXMgYXQgc2xvdCBudW1iZXIgMyB0byBkaWZmZXJlbnRpYXRlIElPOSBmcm9tIElPMTAuCi0gKiBJZiBuZWl0aGVyIGlzIHByZXNlbnQsIGl0J3MgYSBQQ0ktUlQuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWlvYzRfdmFyaWFudChzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlpbnQgZm91bmQgPSAwOwotCi0JLyogSU85OiBMb29rIGZvciBhIFFMb2dpYyBJU1AgMTIxNjAgYXQgdGhlIHNhbWUgYnVzIGFuZCBzbG90IDMuICovCi0JZG8gewotCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsCi0JCQkJICAgICAgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTIxNjAsIHBkZXYpOwotCQlpZiAocGRldiAmJgotCQkgICAgaWRkLT5pZGRfcGRldi0+YnVzLT5udW1iZXIgPT0gcGRldi0+YnVzLT5udW1iZXIgJiYKLQkJICAgIDMgPT0gUENJX1NMT1QocGRldi0+ZGV2Zm4pKQotCQkJZm91bmQgPSAxOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQl9IHdoaWxlIChwZGV2ICYmICFmb3VuZCk7Ci0JaWYgKE5VTEwgIT0gcGRldikKLQkJcmV0dXJuIElPQzRfVkFSSUFOVF9JTzk7Ci0KLQkvKiBJTzEwOiBMb29rIGZvciBhIFZpdGVzc2UgVlNDIDcxNzQgYXQgdGhlIHNhbWUgYnVzIGFuZCBzbG90IDMuICovCi0JcGRldiA9IE5VTEw7Ci0JZG8gewotCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSVRFU1NFLAotCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfVklURVNTRV9WU0M3MTc0LCBwZGV2KTsKLQkJaWYgKHBkZXYgJiYKLQkJICAgIGlkZC0+aWRkX3BkZXYtPmJ1cy0+bnVtYmVyID09IHBkZXYtPmJ1cy0+bnVtYmVyICYmCi0JCSAgICAzID09IFBDSV9TTE9UKHBkZXYtPmRldmZuKSkKLQkJCWZvdW5kID0gMTsKLQkJcGNpX2Rldl9wdXQocGRldik7Ci0JfSB3aGlsZSAocGRldiAmJiAhZm91bmQpOwotCWlmIChOVUxMICE9IHBkZXYpCi0JCXJldHVybiBJT0M0X1ZBUklBTlRfSU8xMDsKLQotCS8qIFBDSS1SVDogTm8gU0NTSS9TQVRBIGNvbnRyb2xsZXIgd2lsbCBiZSBwcmVzZW50ICovCi0JcmV0dXJuIElPQzRfVkFSSUFOVF9QQ0lfUlQ7Ci19Ci0KLS8qIEFkZHMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gSU9DNCBjYXJkICovCi1zdGF0aWMgaW50Ci1pb2M0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQotewotCXN0cnVjdCBpb2M0X2RyaXZlcl9kYXRhICppZGQ7Ci0Jc3RydWN0IGlvYzRfc3VibW9kdWxlICppczsKLQl1aW50MzJfdCBwY21kOwotCWludCByZXQ7Ci0KLQkvKiBFbmFibGUgSU9DNCBhbmQgdGFrZSBvd25lcnNoaXAgb2YgaXQgKi8KLQlpZiAoKHJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiJXM6IEZhaWxlZCB0byBlbmFibGUgSU9DNCBkZXZpY2UgZm9yIHBjaV9kZXYgJXMuXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShwZGV2KSk7Ci0JCWdvdG8gb3V0OwotCX0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCS8qIFNldCB1cCBwZXItSU9DNCBkYXRhICovCi0JaWRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlvYzRfZHJpdmVyX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlkZCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBJT0M0IGRhdGEgZm9yIHBjaV9kZXYgJXMuXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShwZGV2KSk7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2lkZDsKLQl9Ci0JaWRkLT5pZGRfcGRldiA9IHBkZXY7Ci0JaWRkLT5pZGRfcGNpX2lkID0gcGNpX2lkOwotCi0JLyogTWFwIElPQzQgbWlzYyByZWdpc3RlcnMuICBUaGVzZSBhcmUgc2hhcmVkIGJldHdlZW4gc3ViZGV2aWNlcwotCSAqIHNvIHRoZSBtYWluIElPQzQgbW9kdWxlIG1hbmFnZXMgdGhlbS4KLQkgKi8KLQlpZGQtPmlkZF9iYXIwID0gcGNpX3Jlc291cmNlX3N0YXJ0KGlkZC0+aWRkX3BkZXYsIDApOwotCWlmICghaWRkLT5pZGRfYmFyMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiJXM6IFVuYWJsZSB0byBmaW5kIElPQzQgbWlzYyByZXNvdXJjZSAiCi0JCSAgICAgICAiZm9yIHBjaV9kZXYgJXMuXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSk7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3BjaTsKLQl9Ci0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihpZGQtPmlkZF9iYXIwLCBzaXplb2Yoc3RydWN0IGlvYzRfbWlzY19yZWdzKSwKLQkJCSAgICAiaW9jNF9taXNjIikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBJT0M0IG1pc2MgcmVnaW9uICIKLQkJICAgICAgICJmb3IgcGNpX2RldiAlcy5cbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKGlkZC0+aWRkX3BkZXYpKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfcGNpOwotCX0KLQlpZGQtPmlkZF9taXNjX3JlZ3MgPSBpb3JlbWFwKGlkZC0+aWRkX2JhcjAsCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IGlvYzRfbWlzY19yZWdzKSk7Ci0JaWYgKCFpZGQtPmlkZF9taXNjX3JlZ3MpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmVtYXAgSU9DNCBtaXNjIHJlZ2lvbiAiCi0JCSAgICAgICAiZm9yIHBjaV9kZXYgJXMuXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSk7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X21pc2NfcmVnaW9uOwotCX0KLQotCS8qIEZhaWxzYWZlIHBvcnRpb24gb2YgcGVyLUlPQzQgaW5pdGlhbGl6YXRpb24gKi8KLQotCS8qIERldGVjdCBjYXJkIHZhcmlhbnQgKi8KLQlpZGQtPmlkZF92YXJpYW50ID0gaW9jNF92YXJpYW50KGlkZCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiSU9DNCAlczogJXMgY2FyZCBkZXRlY3RlZC5cbiIsIHBjaV9uYW1lKHBkZXYpLAotCSAgICAgICBpZGQtPmlkZF92YXJpYW50ID09IElPQzRfVkFSSUFOVF9JTzkgPyAiSU85IiA6Ci0JICAgICAgIGlkZC0+aWRkX3ZhcmlhbnQgPT0gSU9DNF9WQVJJQU5UX1BDSV9SVCA/ICJQQ0ktUlQiIDoKLQkgICAgICAgaWRkLT5pZGRfdmFyaWFudCA9PSBJT0M0X1ZBUklBTlRfSU8xMCA/ICJJTzEwIiA6ICJ1bmtub3duIik7Ci0KLQkvKiBJbml0aWFsaXplIElPQzQgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaWRkLT5pZGRfcGRldiwgUENJX0NPTU1BTkQsICZwY21kKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGlkZC0+aWRkX3BkZXYsIFBDSV9DT01NQU5ELAotCQkJICAgICAgIHBjbWQgfCBQQ0lfQ09NTUFORF9QQVJJVFkgfCBQQ0lfQ09NTUFORF9TRVJSKTsKLQotCS8qIERldGVybWluZSBQQ0kgY2xvY2sgKi8KLQlpb2M0X2Nsb2NrX2NhbGlicmF0ZShpZGQpOwotCi0JLyogRGlzYWJsZS9jbGVhciBhbGwgaW50ZXJydXB0cy4gIE5lZWQgdG8gZG8gdGhpcyBoZXJlIGxlc3QKLQkgKiBvbmUgc3VibW9kdWxlIHJlcXVlc3QgdGhlIHNoYXJlZCBJT0M0IElSUSwgYnV0IGludGVycnVwdAotCSAqIGlzIGdlbmVyYXRlZCBieSBhIGRpZmZlcmVudCBzdWJkZXZpY2UuCi0JICovCi0JLyogRGlzYWJsZSAqLwotCXdyaXRlbCh+MCwgJmlkZC0+aWRkX21pc2NfcmVncy0+b3RoZXJfaWVjLnJhdyk7Ci0Jd3JpdGVsKH4wLCAmaWRkLT5pZGRfbWlzY19yZWdzLT5zaW9faWVjKTsKLQkvKiBDbGVhciAoaS5lLiBhY2tub3dsZWRnZSkgKi8KLQl3cml0ZWwofjAsICZpZGQtPmlkZF9taXNjX3JlZ3MtPm90aGVyX2lyLnJhdyk7Ci0Jd3JpdGVsKH4wLCAmaWRkLT5pZGRfbWlzY19yZWdzLT5zaW9faXIpOwotCi0JLyogVHJhY2sgUENJLWRldmljZSBzcGVjaWZpYyBkYXRhICovCi0JaWRkLT5pZGRfc2VyaWFsX2RhdGEgPSBOVUxMOwotCXBjaV9zZXRfZHJ2ZGF0YShpZGQtPmlkZF9wZGV2LCBpZGQpOwotCi0JbXV0ZXhfbG9jaygmaW9jNF9tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmaWRkLT5pZGRfbGlzdCwgJmlvYzRfZGV2aWNlcyk7Ci0KLQkvKiBBZGQgdGhpcyBJT0M0IHRvIGFsbCBzdWJtb2R1bGVzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpcywgJmlvYzRfc3VibW9kdWxlcywgaXNfbGlzdCkgewotCQlpZiAoaXMtPmlzX3Byb2JlICYmIGlzLT5pc19wcm9iZShpZGQpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIiVzOiBJT0M0IHN1Ym1vZHVsZSAweCVzIHByb2JlIGZhaWxlZCAiCi0JCQkgICAgICAgImZvciBwY2lfZGV2ICVzLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZHVsZV9uYW1lKGlzLT5pc19vd25lciksCi0JCQkgICAgICAgcGNpX25hbWUoaWRkLT5pZGRfcGRldikpOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmaW9jNF9tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLQotb3V0X21pc2NfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKGlkZC0+aWRkX2JhcjAsIHNpemVvZihzdHJ1Y3QgaW9jNF9taXNjX3JlZ3MpKTsKLW91dF9wY2k6Ci0Ja2ZyZWUoaWRkKTsKLW91dF9pZGQ6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFJlbW92ZXMgYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIGFuIElPQzQgY2FyZC4gKi8KLXN0YXRpYyB2b2lkCi1pb2M0X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgaW9jNF9zdWJtb2R1bGUgKmlzOwotCXN0cnVjdCBpb2M0X2RyaXZlcl9kYXRhICppZGQ7Ci0KLQlpZGQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQkvKiBSZW1vdmUgdGhpcyBJT0M0IGZyb20gYWxsIHN1Ym1vZHVsZXMgKi8KLQltdXRleF9sb2NrKCZpb2M0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlzLCAmaW9jNF9zdWJtb2R1bGVzLCBpc19saXN0KSB7Ci0JCWlmIChpcy0+aXNfcmVtb3ZlICYmIGlzLT5pc19yZW1vdmUoaWRkKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogSU9DNCBzdWJtb2R1bGUgMHglcyByZW1vdmUgZmFpbGVkICIKLQkJCSAgICAgICAiZm9yIHBjaV9kZXYgJXMuXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgbW9kdWxlX25hbWUoaXMtPmlzX293bmVyKSwKLQkJCSAgICAgICBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpb2M0X211dGV4KTsKLQotCS8qIFJlbGVhc2UgcmVzb3VyY2VzICovCi0JaW91bm1hcChpZGQtPmlkZF9taXNjX3JlZ3MpOwotCWlmICghaWRkLT5pZGRfYmFyMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiJXM6IFVuYWJsZSB0byBnZXQgSU9DNCBtaXNjIG1hcHBpbmcgZm9yIHBjaV9kZXYgJXMuICIKLQkJICAgICAgICJEZXZpY2UgcmVtb3ZhbCBtYXkgYmUgaW5jb21wbGV0ZS5cbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKGlkZC0+aWRkX3BkZXYpKTsKLQl9Ci0JcmVsZWFzZV9yZWdpb24oaWRkLT5pZGRfYmFyMCwgc2l6ZW9mKHN0cnVjdCBpb2M0X21pc2NfcmVncykpOwotCi0JLyogRGlzYWJsZSBJT0M0IGFuZCByZWxpbnF1aXNoICovCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCi0JLyogUmVtb3ZlIGFuZCBmcmVlIGRyaXZlciBkYXRhICovCi0JbXV0ZXhfbG9jaygmaW9jNF9tdXRleCk7Ci0JbGlzdF9kZWwoJmlkZC0+aWRkX2xpc3QpOwotCW11dGV4X3VubG9jaygmaW9jNF9tdXRleCk7Ci0Ja2ZyZWUoaWRkKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlvYzRfaWRfdGFibGVbXSA9IHsKLQl7UENJX1ZFTkRPUl9JRF9TR0ksIFBDSV9ERVZJQ0VfSURfU0dJX0lPQzQsIFBDSV9BTllfSUQsCi0JIFBDSV9BTllfSUQsIDB4MGI0MDAwLCAweEZGRkZGRn0sCi0JezB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaW9jNF9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiSU9DNCIsCi0JLmlkX3RhYmxlID0gaW9jNF9pZF90YWJsZSwKLQkucHJvYmUgPSBpb2M0X3Byb2JlLAotCS5yZW1vdmUgPSBpb2M0X3JlbW92ZSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpb2M0X2lkX3RhYmxlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKgotICogTW9kdWxlIG1hbmFnZW1lbnQgKgotICoqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTW9kdWxlIGxvYWQgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1pb2M0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaW9jNF9kcml2ZXIpOwotfQotCi0vKiBNb2R1bGUgdW5sb2FkICovCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQKLWlvYzRfZXhpdCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaW9jNF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChpb2M0X2luaXQpOwotbW9kdWxlX2V4aXQoaW9jNF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiQnJlbnQgQ2FzYXZhbnQgLSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIDxiY2FzYXZhbkBzZ2kuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1hc3RlciBtb2R1bGUgZm9yIFNHSSBJT0M0IEJhc2UtSU8gQ2FyZCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1FWFBPUlRfU1lNQk9MKGlvYzRfcmVnaXN0ZXJfc3VibW9kdWxlKTsKLUVYUE9SVF9TWU1CT0woaW9jNF91bnJlZ2lzdGVyX3N1Ym1vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwppbmRleCAyMzMzNGM4Li5kODk1YTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTE2LDcgKzE2LDcgQEAKIAkgIGNvbnRyb2xsZXIgYW5kIGEgY2hpcHNlbGVjdC4gIE1vc3QgU1BJIHNsYXZlcyBkb24ndCBzdXBwb3J0CiAJICBkeW5hbWljIGRldmljZSBkaXNjb3Zlcnk7IHNvbWUgYXJlIGV2ZW4gd3JpdGUtb25seSBvciByZWFkLW9ubHkuCiAKLQkgIFNQSSBpcyB3aWRlbHkgdXNlZCBieSBtaWNyb2NvbnRvbGxlcnMgdG8gdGFsayB3aXRoIHNlbnNvcnMsCisJICBTUEkgaXMgd2lkZWx5IHVzZWQgYnkgbWljcm9jb250cm9sbGVycyB0byB0YWxrIHdpdGggc2Vuc29ycywKIAkgIGVlcHJvbSBhbmQgZmxhc2ggbWVtb3J5LCBjb2RlY3MgYW5kIHZhcmlvdXMgb3RoZXIgY29udHJvbGxlcgogCSAgY2hpcHMsIGFuYWxvZyB0byBkaWdpdGFsIChhbmQgZC10by1hKSBjb252ZXJ0ZXJzLCBhbmQgbW9yZS4KIAkgIE1NQyBhbmQgU0QgY2FyZHMgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIFNQSSBwcm90b2NvbDsgYW5kIGZvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCmluZGV4IDcyMDI1ZGYuLjZlZDNmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKQEAgLTQ5LDYgKzQ5LDE0IEBACiAjZGVmaW5lIFJFU0VUX0RNQV9DSEFOTkVMIChEQ1NSX05PREVTQyB8IERNQV9JTlRfTUFTSykKICNkZWZpbmUgSVNfRE1BX0FMSUdORUQoeCkgKCgodTMyKSh4KSYweDA3KT09MCkKIAorLyogZm9yIHRlc3RpbmcgU1NDUjEgY2hhbmdlcyB0aGF0IHJlcXVpcmUgU1NQIHJlc3RhcnQsIGJhc2ljYWxseQorICogZXZlcnl0aGluZyBleGNlcHQgdGhlIHNlcnZpY2UgYW5kIGludGVycnVwdCBlbmFibGVzICovCisjZGVmaW5lIFNTQ1IxX0NIQU5HRV9NQVNLIChTU0NSMV9UVEVMUCB8IFNTQ1IxX1RURSB8IFNTQ1IxX0VCQ0VJIHwgU1NDUjFfU0NGUiBcCisJCQkJfCBTU0NSMV9FQ1JBIHwgU1NDUjFfRUNSQiB8IFNTQ1IxX1NDTEtESVIgXAorCQkJCXwgU1NDUjFfUldPVCB8IFNTQ1IxX1RSQUlMIHwgU1NDUjFfUElOVEUgXAorCQkJCXwgU1NDUjFfU1RSRiB8IFNTQ1IxX0VGV1IgfFNTQ1IxX1JGVCBcCisJCQkJfCBTU0NSMV9URlQgfCBTU0NSMV9TUEggfCBTU0NSMV9TUE8gfCBTU0NSMV9MQk0pCisKICNkZWZpbmUgREVGSU5FX1NTUF9SRUcocmVnLCBvZmYpIFwKIHN0YXRpYyBpbmxpbmUgdTMyIHJlYWRfIyNyZWcodm9pZCAqcCkgeyByZXR1cm4gX19yYXdfcmVhZGwocCArIChvZmYpKTsgfSBcCiBzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfIyNyZWcodTMyIHYsIHZvaWQgKnApIHsgX19yYXdfd3JpdGVsKHYsIHAgKyAob2ZmKSk7IH0KQEAgLTEyMyw4ICsxMzEsOCBAQAogCXU4IG5fYnl0ZXM7CiAJdTMyIGRtYV93aWR0aDsKIAlpbnQgY3NfY2hhbmdlOwotCXZvaWQgKCp3cml0ZSkoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSk7Ci0Jdm9pZCAoKnJlYWQpKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpOworCWludCAoKndyaXRlKShzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKTsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKTsKIAlpcnFyZXR1cm5fdCAoKnRyYW5zZmVyX2hhbmRsZXIpKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpOwogCXZvaWQgKCpjc19jb250cm9sKSh1MzIgY29tbWFuZCk7CiB9OwpAQCAtMTMyLDcgKzE0MCw2IEBACiBzdHJ1Y3QgY2hpcF9kYXRhIHsKIAl1MzIgY3IwOwogCXUzMiBjcjE7Ci0JdTMyIHRvOwogCXUzMiBwc3A7CiAJdTMyIHRpbWVvdXQ7CiAJdTggbl9ieXRlczsKQEAgLTE0MywxMiArMTUwLDEyIEBACiAJdTggZW5hYmxlX2RtYTsKIAl1OCBiaXRzX3Blcl93b3JkOwogCXUzMiBzcGVlZF9oejsKLQl2b2lkICgqd3JpdGUpKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpOwotCXZvaWQgKCpyZWFkKShzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSk7CisJaW50ICgqcmVhZCkoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSk7CiAJdm9pZCAoKmNzX2NvbnRyb2wpKHUzMiBjb21tYW5kKTsKIH07CiAKLXN0YXRpYyB2b2lkIHB1bXBfbWVzc2FnZXModm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBwdW1wX21lc3NhZ2VzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIHN0YXRpYyBpbnQgZmx1c2goc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKIHsKQEAgLTE2NiwxMTQgKzE3MywxMTggQEAKIAlyZXR1cm4gbGltaXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHJlc3RvcmVfc3RhdGUoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKLXsKLQl2b2lkICpyZWcgPSBkcnZfZGF0YS0+aW9hZGRyOwotCi0JLyogQ2xlYXIgc3RhdHVzIGFuZCBkaXNhYmxlIGNsb2NrICovCi0Jd3JpdGVfU1NTUihkcnZfZGF0YS0+Y2xlYXJfc3IsIHJlZyk7Ci0Jd3JpdGVfU1NDUjAoZHJ2X2RhdGEtPmN1cl9jaGlwLT5jcjAgJiB+U1NDUjBfU1NFLCByZWcpOwotCi0JLyogTG9hZCB0aGUgcmVnaXN0ZXJzICovCi0Jd3JpdGVfU1NDUjEoZHJ2X2RhdGEtPmN1cl9jaGlwLT5jcjEsIHJlZyk7Ci0Jd3JpdGVfU1NDUjAoZHJ2X2RhdGEtPmN1cl9jaGlwLT5jcjAsIHJlZyk7Ci0JaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQKSB7Ci0JCXdyaXRlX1NTVE8oMCwgcmVnKTsKLQkJd3JpdGVfU1NQU1AoZHJ2X2RhdGEtPmN1cl9jaGlwLT5wc3AsIHJlZyk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBudWxsX2NzX2NvbnRyb2wodTMyIGNvbW1hbmQpCiB7CiB9CiAKLXN0YXRpYyB2b2lkIG51bGxfd3JpdGVyKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCitzdGF0aWMgaW50IG51bGxfd3JpdGVyKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7CiAJdm9pZCAqcmVnID0gZHJ2X2RhdGEtPmlvYWRkcjsKIAl1OCBuX2J5dGVzID0gZHJ2X2RhdGEtPm5fYnl0ZXM7CiAKLQl3aGlsZSAoKHJlYWRfU1NTUihyZWcpICYgU1NTUl9UTkYpCi0JCQkmJiAoZHJ2X2RhdGEtPnR4IDwgZHJ2X2RhdGEtPnR4X2VuZCkpIHsKLQkJd3JpdGVfU1NEUigwLCByZWcpOwotCQlkcnZfZGF0YS0+dHggKz0gbl9ieXRlczsKLQl9CisJaWYgKCgocmVhZF9TU1NSKHJlZykgJiAweDAwMDAwZjAwKSA9PSAweDAwMDAwZjAwKQorCQl8fCAoZHJ2X2RhdGEtPnR4ID09IGRydl9kYXRhLT50eF9lbmQpKQorCQlyZXR1cm4gMDsKKworCXdyaXRlX1NTRFIoMCwgcmVnKTsKKwlkcnZfZGF0YS0+dHggKz0gbl9ieXRlczsKKworCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBudWxsX3JlYWRlcihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQorc3RhdGljIGludCBudWxsX3JlYWRlcihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQogewogCXZvaWQgKnJlZyA9IGRydl9kYXRhLT5pb2FkZHI7CiAJdTggbl9ieXRlcyA9IGRydl9kYXRhLT5uX2J5dGVzOwogCiAJd2hpbGUgKChyZWFkX1NTU1IocmVnKSAmIFNTU1JfUk5FKQotCQkJJiYgKGRydl9kYXRhLT5yeCA8IGRydl9kYXRhLT5yeF9lbmQpKSB7CisJCSYmIChkcnZfZGF0YS0+cnggPCBkcnZfZGF0YS0+cnhfZW5kKSkgewogCQlyZWFkX1NTRFIocmVnKTsKIAkJZHJ2X2RhdGEtPnJ4ICs9IG5fYnl0ZXM7CiAJfQorCisJcmV0dXJuIGRydl9kYXRhLT5yeCA9PSBkcnZfZGF0YS0+cnhfZW5kOwogfQogCi1zdGF0aWMgdm9pZCB1OF93cml0ZXIoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKK3N0YXRpYyBpbnQgdThfd3JpdGVyKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7CiAJdm9pZCAqcmVnID0gZHJ2X2RhdGEtPmlvYWRkcjsKIAotCXdoaWxlICgocmVhZF9TU1NSKHJlZykgJiBTU1NSX1RORikKLQkJCSYmIChkcnZfZGF0YS0+dHggPCBkcnZfZGF0YS0+dHhfZW5kKSkgewotCQl3cml0ZV9TU0RSKCoodTggKikoZHJ2X2RhdGEtPnR4KSwgcmVnKTsKLQkJKytkcnZfZGF0YS0+dHg7Ci0JfQorCWlmICgoKHJlYWRfU1NTUihyZWcpICYgMHgwMDAwMGYwMCkgPT0gMHgwMDAwMGYwMCkKKwkJfHwgKGRydl9kYXRhLT50eCA9PSBkcnZfZGF0YS0+dHhfZW5kKSkKKwkJcmV0dXJuIDA7CisKKwl3cml0ZV9TU0RSKCoodTggKikoZHJ2X2RhdGEtPnR4KSwgcmVnKTsKKwkrK2Rydl9kYXRhLT50eDsKKworCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCB1OF9yZWFkZXIoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKK3N0YXRpYyBpbnQgdThfcmVhZGVyKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7CiAJdm9pZCAqcmVnID0gZHJ2X2RhdGEtPmlvYWRkcjsKIAogCXdoaWxlICgocmVhZF9TU1NSKHJlZykgJiBTU1NSX1JORSkKLQkJCSYmIChkcnZfZGF0YS0+cnggPCBkcnZfZGF0YS0+cnhfZW5kKSkgeworCQkmJiAoZHJ2X2RhdGEtPnJ4IDwgZHJ2X2RhdGEtPnJ4X2VuZCkpIHsKIAkJKih1OCAqKShkcnZfZGF0YS0+cngpID0gcmVhZF9TU0RSKHJlZyk7CiAJCSsrZHJ2X2RhdGEtPnJ4OwogCX0KKworCXJldHVybiBkcnZfZGF0YS0+cnggPT0gZHJ2X2RhdGEtPnJ4X2VuZDsKIH0KIAotc3RhdGljIHZvaWQgdTE2X3dyaXRlcihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQorc3RhdGljIGludCB1MTZfd3JpdGVyKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7CiAJdm9pZCAqcmVnID0gZHJ2X2RhdGEtPmlvYWRkcjsKIAotCXdoaWxlICgocmVhZF9TU1NSKHJlZykgJiBTU1NSX1RORikKLQkJCSYmIChkcnZfZGF0YS0+dHggPCBkcnZfZGF0YS0+dHhfZW5kKSkgewotCQl3cml0ZV9TU0RSKCoodTE2ICopKGRydl9kYXRhLT50eCksIHJlZyk7Ci0JCWRydl9kYXRhLT50eCArPSAyOwotCX0KKwlpZiAoKChyZWFkX1NTU1IocmVnKSAmIDB4MDAwMDBmMDApID09IDB4MDAwMDBmMDApCisJCXx8IChkcnZfZGF0YS0+dHggPT0gZHJ2X2RhdGEtPnR4X2VuZCkpCisJCXJldHVybiAwOworCisJd3JpdGVfU1NEUigqKHUxNiAqKShkcnZfZGF0YS0+dHgpLCByZWcpOworCWRydl9kYXRhLT50eCArPSAyOworCisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIHUxNl9yZWFkZXIoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKK3N0YXRpYyBpbnQgdTE2X3JlYWRlcihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQogewogCXZvaWQgKnJlZyA9IGRydl9kYXRhLT5pb2FkZHI7CiAKIAl3aGlsZSAoKHJlYWRfU1NTUihyZWcpICYgU1NTUl9STkUpCi0JCQkmJiAoZHJ2X2RhdGEtPnJ4IDwgZHJ2X2RhdGEtPnJ4X2VuZCkpIHsKKwkJJiYgKGRydl9kYXRhLT5yeCA8IGRydl9kYXRhLT5yeF9lbmQpKSB7CiAJCSoodTE2ICopKGRydl9kYXRhLT5yeCkgPSByZWFkX1NTRFIocmVnKTsKIAkJZHJ2X2RhdGEtPnJ4ICs9IDI7CiAJfQorCisJcmV0dXJuIGRydl9kYXRhLT5yeCA9PSBkcnZfZGF0YS0+cnhfZW5kOwogfQotc3RhdGljIHZvaWQgdTMyX3dyaXRlcihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQorCitzdGF0aWMgaW50IHUzMl93cml0ZXIoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKIHsKIAl2b2lkICpyZWcgPSBkcnZfZGF0YS0+aW9hZGRyOwogCi0Jd2hpbGUgKChyZWFkX1NTU1IocmVnKSAmIFNTU1JfVE5GKQotCQkJJiYgKGRydl9kYXRhLT50eCA8IGRydl9kYXRhLT50eF9lbmQpKSB7Ci0JCXdyaXRlX1NTRFIoKih1MzIgKikoZHJ2X2RhdGEtPnR4KSwgcmVnKTsKLQkJZHJ2X2RhdGEtPnR4ICs9IDQ7Ci0JfQorCWlmICgoKHJlYWRfU1NTUihyZWcpICYgMHgwMDAwMGYwMCkgPT0gMHgwMDAwMGYwMCkKKwkJfHwgKGRydl9kYXRhLT50eCA9PSBkcnZfZGF0YS0+dHhfZW5kKSkKKwkJcmV0dXJuIDA7CisKKwl3cml0ZV9TU0RSKCoodTMyICopKGRydl9kYXRhLT50eCksIHJlZyk7CisJZHJ2X2RhdGEtPnR4ICs9IDQ7CisKKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgdTMyX3JlYWRlcihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQorc3RhdGljIGludCB1MzJfcmVhZGVyKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7CiAJdm9pZCAqcmVnID0gZHJ2X2RhdGEtPmlvYWRkcjsKIAogCXdoaWxlICgocmVhZF9TU1NSKHJlZykgJiBTU1NSX1JORSkKLQkJCSYmIChkcnZfZGF0YS0+cnggPCBkcnZfZGF0YS0+cnhfZW5kKSkgeworCQkmJiAoZHJ2X2RhdGEtPnJ4IDwgZHJ2X2RhdGEtPnJ4X2VuZCkpIHsKIAkJKih1MzIgKikoZHJ2X2RhdGEtPnJ4KSA9IHJlYWRfU1NEUihyZWcpOwogCQlkcnZfZGF0YS0+cnggKz0gNDsKIAl9CisKKwlyZXR1cm4gZHJ2X2RhdGEtPnJ4ID09IGRydl9kYXRhLT5yeF9lbmQ7CiB9CiAKIHN0YXRpYyB2b2lkICpuZXh0X3RyYW5zZmVyKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCkBAIC00MDksMTY2ICs0MjAsMTM0IEBACiAJcmV0dXJuIGxpbWl0OwogfQogCit2b2lkIGRtYV9lcnJvcl9zdG9wKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwl2b2lkICpyZWcgPSBkcnZfZGF0YS0+aW9hZGRyOworCisJLyogU3RvcCBhbmQgcmVzZXQgKi8KKwlEQ1NSKGRydl9kYXRhLT5yeF9jaGFubmVsKSA9IFJFU0VUX0RNQV9DSEFOTkVMOworCURDU1IoZHJ2X2RhdGEtPnR4X2NoYW5uZWwpID0gUkVTRVRfRE1BX0NIQU5ORUw7CisJd3JpdGVfU1NTUihkcnZfZGF0YS0+Y2xlYXJfc3IsIHJlZyk7CisJd3JpdGVfU1NDUjEocmVhZF9TU0NSMShyZWcpICYgfmRydl9kYXRhLT5kbWFfY3IxLCByZWcpOworCWlmIChkcnZfZGF0YS0+c3NwX3R5cGUgIT0gUFhBMjV4X1NTUCkKKwkJd3JpdGVfU1NUTygwLCByZWcpOworCWZsdXNoKGRydl9kYXRhKTsKKwl3cml0ZV9TU0NSMChyZWFkX1NTQ1IwKHJlZykgJiB+U1NDUjBfU1NFLCByZWcpOworCisJdW5tYXBfZG1hX2J1ZmZlcnMoZHJ2X2RhdGEpOworCisJZGV2X2VycigmZHJ2X2RhdGEtPnBkZXYtPmRldiwgIiVzXG4iLCBtc2cpOworCisJZHJ2X2RhdGEtPmN1cl9tc2ctPnN0YXRlID0gRVJST1JfU1RBVEU7CisJdGFza2xldF9zY2hlZHVsZSgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3RyYW5zZmVyX2NvbXBsZXRlKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCit7CisJdm9pZCAqcmVnID0gZHJ2X2RhdGEtPmlvYWRkcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGRydl9kYXRhLT5jdXJfbXNnOworCisJLyogQ2xlYXIgYW5kIGRpc2FibGUgaW50ZXJydXB0cyBvbiBTU1AgYW5kIERNQSBjaGFubmVscyovCisJd3JpdGVfU1NDUjEocmVhZF9TU0NSMShyZWcpICYgfmRydl9kYXRhLT5kbWFfY3IxLCByZWcpOworCXdyaXRlX1NTU1IoZHJ2X2RhdGEtPmNsZWFyX3NyLCByZWcpOworCURDU1IoZHJ2X2RhdGEtPnR4X2NoYW5uZWwpID0gUkVTRVRfRE1BX0NIQU5ORUw7CisJRENTUihkcnZfZGF0YS0+cnhfY2hhbm5lbCkgPSBSRVNFVF9ETUFfQ0hBTk5FTDsKKworCWlmICh3YWl0X2RtYV9jaGFubmVsX3N0b3AoZHJ2X2RhdGEtPnJ4X2NoYW5uZWwpID09IDApCisJCWRldl9lcnIoJmRydl9kYXRhLT5wZGV2LT5kZXYsCisJCQkiZG1hX2hhbmRsZXI6IGRtYSByeCBjaGFubmVsIHN0b3AgZmFpbGVkXG4iKTsKKworCWlmICh3YWl0X3NzcF9yeF9zdGFsbChkcnZfZGF0YS0+aW9hZGRyKSA9PSAwKQorCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAorCQkJImRtYV90cmFuc2Zlcjogc3NwIHJ4IHN0YWxsIGZhaWxlZFxuIik7CisKKwl1bm1hcF9kbWFfYnVmZmVycyhkcnZfZGF0YSk7CisKKwkvKiB1cGRhdGUgdGhlIGJ1ZmZlciBwb2ludGVyIGZvciB0aGUgYW1vdW50IGNvbXBsZXRlZCBpbiBkbWEgKi8KKwlkcnZfZGF0YS0+cnggKz0gZHJ2X2RhdGEtPmxlbiAtCisJCQkoRENNRChkcnZfZGF0YS0+cnhfY2hhbm5lbCkgJiBEQ01EX0xFTkdUSCk7CisKKwkvKiByZWFkIHRyYWlsaW5nIGRhdGEgZnJvbSBmaWZvLCBpdCBkb2VzIG5vdCBtYXR0ZXIgaG93IG1hbnkKKwkgKiBieXRlcyBhcmUgaW4gdGhlIGZpZm8ganVzdCByZWFkIHVudGlsIGJ1ZmZlciBpcyBmdWxsCisJICogb3IgZmlmbyBpcyBlbXB0eSwgd2hpY2ggZXZlciBvY2N1cnMgZmlyc3QgKi8KKwlkcnZfZGF0YS0+cmVhZChkcnZfZGF0YSk7CisKKwkvKiByZXR1cm4gY291bnQgb2Ygd2hhdCB3YXMgYWN0dWFsbHkgcmVhZCAqLworCW1zZy0+YWN0dWFsX2xlbmd0aCArPSBkcnZfZGF0YS0+bGVuIC0KKwkJCQkoZHJ2X2RhdGEtPnJ4X2VuZCAtIGRydl9kYXRhLT5yeCk7CisKKwkvKiBSZWxlYXNlIGNoaXAgc2VsZWN0IGlmIHJlcXVlc3RlZCwgdHJhbnNmZXIgZGVsYXlzIGFyZQorCSAqIGhhbmRsZWQgaW4gcHVtcF90cmFuc2ZlcnMgKi8KKwlpZiAoZHJ2X2RhdGEtPmNzX2NoYW5nZSkKKwkJZHJ2X2RhdGEtPmNzX2NvbnRyb2woUFhBMlhYX0NTX0RFQVNTRVJUKTsKKworCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLworCW1zZy0+c3RhdGUgPSBuZXh0X3RyYW5zZmVyKGRydl9kYXRhKTsKKworCS8qIFNjaGVkdWxlIHRyYW5zZmVyIHRhc2tsZXQgKi8KKwl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOworfQorCiBzdGF0aWMgdm9pZCBkbWFfaGFuZGxlcihpbnQgY2hhbm5lbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gZGF0YTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGRydl9kYXRhLT5jdXJfbXNnOwotCXZvaWQgKnJlZyA9IGRydl9kYXRhLT5pb2FkZHI7CiAJdTMyIGlycV9zdGF0dXMgPSBEQ1NSKGNoYW5uZWwpICYgRE1BX0lOVF9NQVNLOwotCXUzMiB0cmFpbGluZ19zc3NyID0gMDsKIAogCWlmIChpcnFfc3RhdHVzICYgRENTUl9CVVNFUlIpIHsKIAotCQkvKiBEaXNhYmxlIGludGVycnVwdHMsIGNsZWFyIHN0YXR1cyBhbmQgcmVzZXQgRE1BICovCi0JCXdyaXRlX1NTQ1IwKHJlYWRfU1NDUjAocmVnKSAmIH5TU0NSMF9TU0UsIHJlZyk7Ci0JCXdyaXRlX1NTQ1IxKHJlYWRfU1NDUjEocmVnKSAmIH5kcnZfZGF0YS0+ZG1hX2NyMSwgcmVnKTsKLQkJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQKQotCQkJd3JpdGVfU1NUTygwLCByZWcpOwotCQl3cml0ZV9TU1NSKGRydl9kYXRhLT5jbGVhcl9zciwgcmVnKTsKLQkJRENTUihkcnZfZGF0YS0+cnhfY2hhbm5lbCkgPSBSRVNFVF9ETUFfQ0hBTk5FTDsKLQkJRENTUihkcnZfZGF0YS0+dHhfY2hhbm5lbCkgPSBSRVNFVF9ETUFfQ0hBTk5FTDsKLQotCQlpZiAoZmx1c2goZHJ2X2RhdGEpID09IDApCi0JCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAotCQkJCQkiZG1hX2hhbmRsZXI6IGZsdXNoIGZhaWxcbiIpOwotCi0JCXVubWFwX2RtYV9idWZmZXJzKGRydl9kYXRhKTsKLQogCQlpZiAoY2hhbm5lbCA9PSBkcnZfZGF0YS0+dHhfY2hhbm5lbCkKLQkJCWRldl9lcnIoJmRydl9kYXRhLT5wZGV2LT5kZXYsCi0JCQkJImRtYV9oYW5kbGVyOiBiYWQgYnVzIGFkZHJlc3Mgb24gIgotCQkJCSJ0eCBjaGFubmVsICVkLCBzb3VyY2UgJXggdGFyZ2V0ID0gJXhcbiIsCi0JCQkJY2hhbm5lbCwgRFNBRFIoY2hhbm5lbCksIERUQURSKGNoYW5uZWwpKTsKKwkJCWRtYV9lcnJvcl9zdG9wKGRydl9kYXRhLAorCQkJCQkiZG1hX2hhbmRsZXI6ICIKKwkJCQkJImJhZCBidXMgYWRkcmVzcyBvbiB0eCBjaGFubmVsIik7CiAJCWVsc2UKLQkJCWRldl9lcnIoJmRydl9kYXRhLT5wZGV2LT5kZXYsCi0JCQkJImRtYV9oYW5kbGVyOiBiYWQgYnVzIGFkZHJlc3Mgb24gIgotCQkJCSJyeCBjaGFubmVsICVkLCBzb3VyY2UgJXggdGFyZ2V0ID0gJXhcbiIsCi0JCQkJY2hhbm5lbCwgRFNBRFIoY2hhbm5lbCksIERUQURSKGNoYW5uZWwpKTsKLQotCQltc2ctPnN0YXRlID0gRVJST1JfU1RBVEU7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycyk7CisJCQlkbWFfZXJyb3Jfc3RvcChkcnZfZGF0YSwKKwkJCQkJImRtYV9oYW5kbGVyOiAiCisJCQkJCSJiYWQgYnVzIGFkZHJlc3Mgb24gcnggY2hhbm5lbCIpOworCQlyZXR1cm47CiAJfQogCiAJLyogUFhBMjU1eF9TU1AgaGFzIG5vIHRpbWVvdXQgaW50ZXJydXB0LCB3YWl0IGZvciB0YWlsaW5nIGJ5dGVzICovCi0JaWYgKChkcnZfZGF0YS0+c3NwX3R5cGUgPT0gUFhBMjV4X1NTUCkKLQkJJiYgKGNoYW5uZWwgPT0gZHJ2X2RhdGEtPnR4X2NoYW5uZWwpCi0JCSYmIChpcnFfc3RhdHVzICYgRENTUl9FTkRJTlRSKSkgeworCWlmICgoY2hhbm5lbCA9PSBkcnZfZGF0YS0+dHhfY2hhbm5lbCkKKwkJJiYgKGlycV9zdGF0dXMgJiBEQ1NSX0VORElOVFIpCisJCSYmIChkcnZfZGF0YS0+c3NwX3R5cGUgPT0gUFhBMjV4X1NTUCkpIHsKIAogCQkvKiBXYWl0IGZvciByeCB0byBzdGFsbCAqLwogCQlpZiAod2FpdF9zc3Bfcnhfc3RhbGwoZHJ2X2RhdGEtPmlvYWRkcikgPT0gMCkKIAkJCWRldl9lcnIoJmRydl9kYXRhLT5wZGV2LT5kZXYsCiAJCQkJImRtYV9oYW5kbGVyOiBzc3Agcnggc3RhbGwgZmFpbGVkXG4iKTsKIAotCQkvKiBDbGVhciBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIFNTUCBhbmQgRE1BIGNoYW5uZWxzKi8KLQkJd3JpdGVfU1NDUjEocmVhZF9TU0NSMShyZWcpICYgfmRydl9kYXRhLT5kbWFfY3IxLCByZWcpOwotCQl3cml0ZV9TU1NSKGRydl9kYXRhLT5jbGVhcl9zciwgcmVnKTsKLQkJRENTUihkcnZfZGF0YS0+dHhfY2hhbm5lbCkgPSBSRVNFVF9ETUFfQ0hBTk5FTDsKLQkJRENTUihkcnZfZGF0YS0+cnhfY2hhbm5lbCkgPSBSRVNFVF9ETUFfQ0hBTk5FTDsKLQkJaWYgKHdhaXRfZG1hX2NoYW5uZWxfc3RvcChkcnZfZGF0YS0+cnhfY2hhbm5lbCkgPT0gMCkKLQkJCWRldl9lcnIoJmRydl9kYXRhLT5wZGV2LT5kZXYsCi0JCQkJImRtYV9oYW5kbGVyOiBkbWEgcnggY2hhbm5lbCBzdG9wIGZhaWxlZFxuIik7Ci0KLQkJdW5tYXBfZG1hX2J1ZmZlcnMoZHJ2X2RhdGEpOwotCi0JCS8qIFJlYWQgdHJhaWxpbmcgYnl0ZXMgKi8KLQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiB0cmFpbGluZyBieXRlcywgcmVhZCB0aGVtICovCi0JCXRyYWlsaW5nX3Nzc3IgPSByZWFkX1NTU1IocmVnKTsKLQkJaWYgKCh0cmFpbGluZ19zc3NyICYgMHhmMDA4KSAhPSAweGYwMDApIHsKLQkJCWRydl9kYXRhLT5yeCA9IGRydl9kYXRhLT5yeF9lbmQgLQotCQkJCQkoKCh0cmFpbGluZ19zc3NyID4+IDEyKSAmIDB4MGYpICsgMSk7Ci0JCQlkcnZfZGF0YS0+cmVhZChkcnZfZGF0YSk7Ci0JCX0KLQkJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGRydl9kYXRhLT5sZW47Ci0KLQkJLyogUmVsZWFzZSBjaGlwIHNlbGVjdCBpZiByZXF1ZXN0ZWQsIHRyYW5zZmVyIGRlbGF5cyBhcmUKLQkJICogaGFuZGxlZCBpbiBwdW1wX3RyYW5zZmVycyAqLwotCQlpZiAoZHJ2X2RhdGEtPmNzX2NoYW5nZSkKLQkJCWRydl9kYXRhLT5jc19jb250cm9sKFBYQTJYWF9DU19ERUFTU0VSVCk7Ci0KLQkJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCi0JCW1zZy0+c3RhdGUgPSBuZXh0X3RyYW5zZmVyKGRydl9kYXRhKTsKLQotCQkvKiBTY2hlZHVsZSB0cmFuc2ZlciB0YXNrbGV0ICovCi0JCXRhc2tsZXRfc2NoZWR1bGUoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycyk7CisJCS8qIGZpbmlzaCB0aGlzIHRyYW5zZmVyLCBzdGFydCB0aGUgbmV4dCAqLworCQlkbWFfdHJhbnNmZXJfY29tcGxldGUoZHJ2X2RhdGEpOwogCX0KIH0KIAogc3RhdGljIGlycXJldHVybl90IGRtYV90cmFuc2ZlcihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQogewogCXUzMiBpcnFfc3RhdHVzOwotCXUzMiB0cmFpbGluZ19zc3NyID0gMDsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGRydl9kYXRhLT5jdXJfbXNnOwogCXZvaWQgKnJlZyA9IGRydl9kYXRhLT5pb2FkZHI7CiAKIAlpcnFfc3RhdHVzID0gcmVhZF9TU1NSKHJlZykgJiBkcnZfZGF0YS0+bWFza19zcjsKIAlpZiAoaXJxX3N0YXR1cyAmIFNTU1JfUk9SKSB7Ci0JCS8qIENsZWFyIGFuZCBkaXNhYmxlIGludGVycnVwdHMgb24gU1NQIGFuZCBETUEgY2hhbm5lbHMqLwotCQl3cml0ZV9TU0NSMChyZWFkX1NTQ1IwKHJlZykgJiB+U1NDUjBfU1NFLCByZWcpOwotCQl3cml0ZV9TU0NSMShyZWFkX1NTQ1IxKHJlZykgJiB+ZHJ2X2RhdGEtPmRtYV9jcjEsIHJlZyk7Ci0JCWlmIChkcnZfZGF0YS0+c3NwX3R5cGUgIT0gUFhBMjV4X1NTUCkKLQkJCXdyaXRlX1NTVE8oMCwgcmVnKTsKLQkJd3JpdGVfU1NTUihkcnZfZGF0YS0+Y2xlYXJfc3IsIHJlZyk7Ci0JCURDU1IoZHJ2X2RhdGEtPnR4X2NoYW5uZWwpID0gUkVTRVRfRE1BX0NIQU5ORUw7Ci0JCURDU1IoZHJ2X2RhdGEtPnJ4X2NoYW5uZWwpID0gUkVTRVRfRE1BX0NIQU5ORUw7Ci0JCXVubWFwX2RtYV9idWZmZXJzKGRydl9kYXRhKTsKLQotCQlpZiAoZmx1c2goZHJ2X2RhdGEpID09IDApCi0JCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAotCQkJCQkiZG1hX3RyYW5zZmVyOiBmbHVzaCBmYWlsXG4iKTsKLQotCQlkZXZfd2FybigmZHJ2X2RhdGEtPnBkZXYtPmRldiwgImRtYV90cmFuc2ZlcjogZmlmbyBvdmVydW5cbiIpOwotCi0JCWRydl9kYXRhLT5jdXJfbXNnLT5zdGF0ZSA9IEVSUk9SX1NUQVRFOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOwotCisJCWRtYV9lcnJvcl9zdG9wKGRydl9kYXRhLCAiZG1hX3RyYW5zZmVyOiBmaWZvIG92ZXJydW4iKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIAogCS8qIENoZWNrIGZvciBmYWxzZSBwb3NpdGl2ZSB0aW1lb3V0ICovCi0JaWYgKChpcnFfc3RhdHVzICYgU1NTUl9USU5UKSAmJiBEQ1NSKGRydl9kYXRhLT50eF9jaGFubmVsKSAmIERDU1JfUlVOKSB7CisJaWYgKChpcnFfc3RhdHVzICYgU1NTUl9USU5UKQorCQkmJiAoRENTUihkcnZfZGF0YS0+dHhfY2hhbm5lbCkgJiBEQ1NSX1JVTikpIHsKIAkJd3JpdGVfU1NTUihTU1NSX1RJTlQsIHJlZyk7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKIAlpZiAoaXJxX3N0YXR1cyAmIFNTU1JfVElOVCB8fCBkcnZfZGF0YS0+cnggPT0gZHJ2X2RhdGEtPnJ4X2VuZCkgewogCi0JCS8qIENsZWFyIGFuZCBkaXNhYmxlIGludGVycnVwdHMgb24gU1NQIGFuZCBETUEgY2hhbm5lbHMqLwotCQl3cml0ZV9TU0NSMShyZWFkX1NTQ1IxKHJlZykgJiB+ZHJ2X2RhdGEtPmRtYV9jcjEsIHJlZyk7CisJCS8qIENsZWFyIGFuZCBkaXNhYmxlIHRpbWVvdXQgaW50ZXJydXB0LCBkbyB0aGUgcmVzdCBpbgorCQkgKiBkbWFfdHJhbnNmZXJfY29tcGxldGUgKi8KIAkJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQKQogCQkJd3JpdGVfU1NUTygwLCByZWcpOwotCQl3cml0ZV9TU1NSKGRydl9kYXRhLT5jbGVhcl9zciwgcmVnKTsKLQkJRENTUihkcnZfZGF0YS0+dHhfY2hhbm5lbCkgPSBSRVNFVF9ETUFfQ0hBTk5FTDsKLQkJRENTUihkcnZfZGF0YS0+cnhfY2hhbm5lbCkgPSBSRVNFVF9ETUFfQ0hBTk5FTDsKIAotCQlpZiAod2FpdF9kbWFfY2hhbm5lbF9zdG9wKGRydl9kYXRhLT5yeF9jaGFubmVsKSA9PSAwKQotCQkJZGV2X2VycigmZHJ2X2RhdGEtPnBkZXYtPmRldiwKLQkJCQkiZG1hX3RyYW5zZmVyOiBkbWEgcnggY2hhbm5lbCBzdG9wIGZhaWxlZFxuIik7Ci0KLQkJaWYgKHdhaXRfc3NwX3J4X3N0YWxsKGRydl9kYXRhLT5pb2FkZHIpID09IDApCi0JCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LAotCQkJCSJkbWFfdHJhbnNmZXI6IHNzcCByeCBzdGFsbCBmYWlsZWRcbiIpOwotCi0JCXVubWFwX2RtYV9idWZmZXJzKGRydl9kYXRhKTsKLQotCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHRyYWlsaW5nIGJ5dGVzLCByZWFkIHRoZW0gKi8KLQkJdHJhaWxpbmdfc3NzciA9IHJlYWRfU1NTUihyZWcpOwotCQlpZiAoKHRyYWlsaW5nX3Nzc3IgJiAweGYwMDgpICE9IDB4ZjAwMCkgewotCQkJZHJ2X2RhdGEtPnJ4ID0gZHJ2X2RhdGEtPnJ4X2VuZCAtCi0JCQkJCSgoKHRyYWlsaW5nX3Nzc3IgPj4gMTIpICYgMHgwZikgKyAxKTsKLQkJCWRydl9kYXRhLT5yZWFkKGRydl9kYXRhKTsKLQkJfQotCQltc2ctPmFjdHVhbF9sZW5ndGggKz0gZHJ2X2RhdGEtPmxlbjsKLQotCQkvKiBSZWxlYXNlIGNoaXAgc2VsZWN0IGlmIHJlcXVlc3RlZCwgdHJhbnNmZXIgZGVsYXlzIGFyZQotCQkgKiBoYW5kbGVkIGluIHB1bXBfdHJhbnNmZXJzICovCi0JCWlmIChkcnZfZGF0YS0+Y3NfY2hhbmdlKQotCQkJZHJ2X2RhdGEtPmNzX2NvbnRyb2woUFhBMlhYX0NTX0RFQVNTRVJUKTsKLQotCQkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KLQkJbXNnLT5zdGF0ZSA9IG5leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOwotCi0JCS8qIFNjaGVkdWxlIHRyYW5zZmVyIHRhc2tsZXQgKi8KLQkJdGFza2xldF9zY2hlZHVsZSgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzKTsKKwkJLyogZmluaXNoIHRoaXMgdHJhbnNmZXIsIHN0YXJ0IHRoZSBuZXh0ICovCisJCWRtYV90cmFuc2Zlcl9jb21wbGV0ZShkcnZfZGF0YSk7CiAKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KQEAgLTU3Nyw4OSArNTU2LDEwMyBAQAogCXJldHVybiBJUlFfTk9ORTsKIH0KIAorc3RhdGljIHZvaWQgaW50X2Vycm9yX3N0b3Aoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSwgY29uc3QgY2hhciogbXNnKQoreworCXZvaWQgKnJlZyA9IGRydl9kYXRhLT5pb2FkZHI7CisKKwkvKiBTdG9wIGFuZCByZXNldCBTU1AgKi8KKwl3cml0ZV9TU1NSKGRydl9kYXRhLT5jbGVhcl9zciwgcmVnKTsKKwl3cml0ZV9TU0NSMShyZWFkX1NTQ1IxKHJlZykgJiB+ZHJ2X2RhdGEtPmludF9jcjEsIHJlZyk7CisJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQKQorCQl3cml0ZV9TU1RPKDAsIHJlZyk7CisJZmx1c2goZHJ2X2RhdGEpOworCXdyaXRlX1NTQ1IwKHJlYWRfU1NDUjAocmVnKSAmIH5TU0NSMF9TU0UsIHJlZyk7CisKKwlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAiJXNcbiIsIG1zZyk7CisKKwlkcnZfZGF0YS0+Y3VyX21zZy0+c3RhdGUgPSBFUlJPUl9TVEFURTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOworfQorCitzdGF0aWMgdm9pZCBpbnRfdHJhbnNmZXJfY29tcGxldGUoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKK3sKKwl2b2lkICpyZWcgPSBkcnZfZGF0YS0+aW9hZGRyOworCisJLyogU3RvcCBTU1AgKi8KKwl3cml0ZV9TU1NSKGRydl9kYXRhLT5jbGVhcl9zciwgcmVnKTsKKwl3cml0ZV9TU0NSMShyZWFkX1NTQ1IxKHJlZykgJiB+ZHJ2X2RhdGEtPmludF9jcjEsIHJlZyk7CisJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQKQorCQl3cml0ZV9TU1RPKDAsIHJlZyk7CisKKwkvKiBVcGRhdGUgdG90YWwgYnl0ZSB0cmFuc2ZlcmVkIHJldHVybiBjb3VudCBhY3R1YWwgYnl0ZXMgcmVhZCAqLworCWRydl9kYXRhLT5jdXJfbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGRydl9kYXRhLT5sZW4gLQorCQkJCShkcnZfZGF0YS0+cnhfZW5kIC0gZHJ2X2RhdGEtPnJ4KTsKKworCS8qIFJlbGVhc2UgY2hpcCBzZWxlY3QgaWYgcmVxdWVzdGVkLCB0cmFuc2ZlciBkZWxheXMgYXJlCisJICogaGFuZGxlZCBpbiBwdW1wX3RyYW5zZmVycyAqLworCWlmIChkcnZfZGF0YS0+Y3NfY2hhbmdlKQorCQlkcnZfZGF0YS0+Y3NfY29udHJvbChQWEEyWFhfQ1NfREVBU1NFUlQpOworCisJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCisJZHJ2X2RhdGEtPmN1cl9tc2ctPnN0YXRlID0gbmV4dF90cmFuc2ZlcihkcnZfZGF0YSk7CisKKwkvKiBTY2hlZHVsZSB0cmFuc2ZlciB0YXNrbGV0ICovCisJdGFza2xldF9zY2hlZHVsZSgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzKTsKK30KKwogc3RhdGljIGlycXJldHVybl90IGludGVycnVwdF90cmFuc2ZlcihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQogewotCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnID0gZHJ2X2RhdGEtPmN1cl9tc2c7CiAJdm9pZCAqcmVnID0gZHJ2X2RhdGEtPmlvYWRkcjsKLQl1bnNpZ25lZCBsb25nIGxpbWl0ID0gbG9vcHNfcGVyX2ppZmZ5IDw8IDE7Ci0JdTMyIGlycV9zdGF0dXM7CisKIAl1MzIgaXJxX21hc2sgPSAocmVhZF9TU0NSMShyZWcpICYgU1NDUjFfVElFKSA/CiAJCQlkcnZfZGF0YS0+bWFza19zciA6IGRydl9kYXRhLT5tYXNrX3NyICYgflNTU1JfVEZTOwogCi0Jd2hpbGUgKChpcnFfc3RhdHVzID0gcmVhZF9TU1NSKHJlZykgJiBpcnFfbWFzaykpIHsKKwl1MzIgaXJxX3N0YXR1cyA9IHJlYWRfU1NTUihyZWcpICYgaXJxX21hc2s7CiAKLQkJaWYgKGlycV9zdGF0dXMgJiBTU1NSX1JPUikgeworCWlmIChpcnFfc3RhdHVzICYgU1NTUl9ST1IpIHsKKwkJaW50X2Vycm9yX3N0b3AoZHJ2X2RhdGEsICJpbnRlcnJ1cHRfdHJhbnNmZXI6IGZpZm8gb3ZlcnJ1biIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQogCi0JCQkvKiBDbGVhciBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JCQl3cml0ZV9TU0NSMChyZWFkX1NTQ1IwKHJlZykgJiB+U1NDUjBfU1NFLCByZWcpOwotCQkJd3JpdGVfU1NDUjEocmVhZF9TU0NSMShyZWcpICYgfmRydl9kYXRhLT5pbnRfY3IxLCByZWcpOwotCQkJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQKQotCQkJCXdyaXRlX1NTVE8oMCwgcmVnKTsKLQkJCXdyaXRlX1NTU1IoZHJ2X2RhdGEtPmNsZWFyX3NyLCByZWcpOwotCi0JCQlpZiAoZmx1c2goZHJ2X2RhdGEpID09IDApCi0JCQkJZGV2X2VycigmZHJ2X2RhdGEtPnBkZXYtPmRldiwKLQkJCQkJImludGVycnVwdF90cmFuc2ZlcjogZmx1c2ggZmFpbFxuIik7Ci0KLQkJCS8qIFN0b3AgdGhlIFNTUCAqLwotCi0JCQlkZXZfd2FybigmZHJ2X2RhdGEtPnBkZXYtPmRldiwKLQkJCQkJImludGVycnVwdF90cmFuc2ZlcjogZmlmbyBvdmVydW5cbiIpOwotCi0JCQltc2ctPnN0YXRlID0gRVJST1JfU1RBVEU7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOwotCisJaWYgKGlycV9zdGF0dXMgJiBTU1NSX1RJTlQpIHsKKwkJd3JpdGVfU1NTUihTU1NSX1RJTlQsIHJlZyk7CisJCWlmIChkcnZfZGF0YS0+cmVhZChkcnZfZGF0YSkpIHsKKwkJCWludF90cmFuc2Zlcl9jb21wbGV0ZShkcnZfZGF0YSk7CiAJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJCX0KKwl9CiAKLQkJLyogTG9vayBmb3IgZmFsc2UgcG9zaXRpdmUgdGltZW91dCAqLwotCQlpZiAoKGlycV9zdGF0dXMgJiBTU1NSX1RJTlQpCi0JCQkJJiYgKGRydl9kYXRhLT5yeCA8IGRydl9kYXRhLT5yeF9lbmQpKQotCQkJd3JpdGVfU1NTUihTU1NSX1RJTlQsIHJlZyk7Ci0KLQkJLyogUHVtcCBkYXRhICovCi0JCWRydl9kYXRhLT5yZWFkKGRydl9kYXRhKTsKLQkJZHJ2X2RhdGEtPndyaXRlKGRydl9kYXRhKTsKLQotCQlpZiAoZHJ2X2RhdGEtPnR4ID09IGRydl9kYXRhLT50eF9lbmQpIHsKLQkJCS8qIERpc2FibGUgdHggaW50ZXJydXB0ICovCi0JCQl3cml0ZV9TU0NSMShyZWFkX1NTQ1IxKHJlZykgJiB+U1NDUjFfVElFLCByZWcpOwotCQkJaXJxX21hc2sgPSBkcnZfZGF0YS0+bWFza19zciAmIH5TU1NSX1RGUzsKLQotCQkJLyogUFhBMjV4X1NTUCBoYXMgbm8gdGltZW91dCwgcmVhZCB0cmFpbGluZyBieXRlcyAqLwotCQkJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSA9PSBQWEEyNXhfU1NQKSB7Ci0JCQkJd2hpbGUgKChyZWFkX1NTU1IocmVnKSAmIFNTU1JfQlNZKSAmJiBsaW1pdC0tKQotCQkJCQlkcnZfZGF0YS0+cmVhZChkcnZfZGF0YSk7Ci0KLQkJCQlpZiAobGltaXQgPT0gMCkKLQkJCQkJZGV2X2VycigmZHJ2X2RhdGEtPnBkZXYtPmRldiwKLQkJCQkJCSJpbnRlcnJ1cHRfdHJhbnNmZXI6ICIKLQkJCQkJCSJ0cmFpbGluZyBieXRlIHJlYWQgZmFpbGVkXG4iKTsKLQkJCX0KKwkvKiBEcmFpbiByeCBmaWZvLCBGaWxsIHR4IGZpZm8gYW5kIHByZXZlbnQgb3ZlcnJ1bnMgKi8KKwlkbyB7CisJCWlmIChkcnZfZGF0YS0+cmVhZChkcnZfZGF0YSkpIHsKKwkJCWludF90cmFuc2Zlcl9jb21wbGV0ZShkcnZfZGF0YSk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJCX0KKwl9IHdoaWxlIChkcnZfZGF0YS0+d3JpdGUoZHJ2X2RhdGEpKTsKIAotCQlpZiAoKGlycV9zdGF0dXMgJiBTU1NSX1RJTlQpCi0JCQkJfHwgKGRydl9kYXRhLT5yeCA9PSBkcnZfZGF0YS0+cnhfZW5kKSkgeworCWlmIChkcnZfZGF0YS0+cmVhZChkcnZfZGF0YSkpIHsKKwkJaW50X3RyYW5zZmVyX2NvbXBsZXRlKGRydl9kYXRhKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KIAotCQkJLyogQ2xlYXIgdGltZW91dCAqLwotCQkJd3JpdGVfU1NDUjEocmVhZF9TU0NSMShyZWcpICYgfmRydl9kYXRhLT5pbnRfY3IxLCByZWcpOwotCQkJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQKQotCQkJCXdyaXRlX1NTVE8oMCwgcmVnKTsKLQkJCXdyaXRlX1NTU1IoZHJ2X2RhdGEtPmNsZWFyX3NyLCByZWcpOwotCi0JCQkvKiBVcGRhdGUgdG90YWwgYnl0ZSB0cmFuc2ZlcmVkICovCi0JCQltc2ctPmFjdHVhbF9sZW5ndGggKz0gZHJ2X2RhdGEtPmxlbjsKLQotCQkJLyogUmVsZWFzZSBjaGlwIHNlbGVjdCBpZiByZXF1ZXN0ZWQsIHRyYW5zZmVyIGRlbGF5cyBhcmUKLQkJCSAqIGhhbmRsZWQgaW4gcHVtcF90cmFuc2ZlcnMgKi8KLQkJCWlmIChkcnZfZGF0YS0+Y3NfY2hhbmdlKQotCQkJCWRydl9kYXRhLT5jc19jb250cm9sKFBYQTJYWF9DU19ERUFTU0VSVCk7Ci0KLQkJCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwotCQkJbXNnLT5zdGF0ZSA9IG5leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOwotCi0JCQkvKiBTY2hlZHVsZSB0cmFuc2ZlciB0YXNrbGV0ICovCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOworCWlmIChkcnZfZGF0YS0+dHggPT0gZHJ2X2RhdGEtPnR4X2VuZCkgeworCQl3cml0ZV9TU0NSMShyZWFkX1NTQ1IxKHJlZykgJiB+U1NDUjFfVElFLCByZWcpOworCQkvKiBQWEEyNXhfU1NQIGhhcyBubyB0aW1lb3V0LCByZWFkIHRyYWlsaW5nIGJ5dGVzICovCisJCWlmIChkcnZfZGF0YS0+c3NwX3R5cGUgPT0gUFhBMjV4X1NTUCkgeworCQkJaWYgKCF3YWl0X3NzcF9yeF9zdGFsbChyZWcpKQorCQkJeworCQkJCWludF9lcnJvcl9zdG9wKGRydl9kYXRhLCAiaW50ZXJydXB0X3RyYW5zZmVyOiAiCisJCQkJCQkicnggc3RhbGwgZmFpbGVkIik7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQkJaWYgKCFkcnZfZGF0YS0+cmVhZChkcnZfZGF0YSkpCisJCQl7CisJCQkJaW50X2Vycm9yX3N0b3AoZHJ2X2RhdGEsCisJCQkJCQkiaW50ZXJydXB0X3RyYW5zZmVyOiAiCisJCQkJCQkidHJhaWxpbmcgYnl0ZSByZWFkIGZhaWxlZCIpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJCWludF90cmFuc2Zlcl9jb21wbGV0ZShkcnZfZGF0YSk7CiAJCX0KIAl9CiAKQEAgLTY4MSw3ICs2NzQsNyBAQAogCQl3cml0ZV9TU1NSKGRydl9kYXRhLT5jbGVhcl9zciwgcmVnKTsKIAogCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAiYmFkIG1lc3NhZ2Ugc3RhdGUgIgotCQkJCSJpbiBpbnRlcnJ1cHQgaGFuZGxlciIpOworCQkJImluIGludGVycnVwdCBoYW5kbGVyXG4iKTsKIAogCQkvKiBOZXZlciBmYWlsICovCiAJCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTY5MCw2ICs2ODMsMTAyIEBACiAJcmV0dXJuIGRydl9kYXRhLT50cmFuc2Zlcl9oYW5kbGVyKGRydl9kYXRhKTsKIH0KIAoraW50IHNldF9kbWFfYnVyc3RfYW5kX3RocmVzaG9sZChzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCXU4IGJpdHNfcGVyX3dvcmQsIHUzMiAqYnVyc3RfY29kZSwKKwkJCQl1MzIgKnRocmVzaG9sZCkKK3sKKwlzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwICpjaGlwX2luZm8gPQorCQkJKHN0cnVjdCBweGEyeHhfc3BpX2NoaXAgKilzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwlpbnQgYnl0ZXNfcGVyX3dvcmQ7CisJaW50IGJ1cnN0X2J5dGVzOworCWludCB0aHJlc2hfd29yZHM7CisJaW50IHJlcV9idXJzdF9zaXplOworCWludCByZXR2YWwgPSAwOworCisJLyogU2V0IHRoZSB0aHJlc2hvbGQgKGluIHJlZ2lzdGVycykgdG8gZXF1YWwgdGhlIHNhbWUgYW1vdW50IG9mIGRhdGEKKwkgKiBhcyByZXByZXNlbnRlZCBieSBidXJzdCBzaXplIChpbiBieXRlcykuICBUaGUgY29tcHV0YXRpb24gYmVsb3cKKwkgKiBpcyAoYnVyc3Rfc2l6ZSByb3VuZGVkIHVwIHRvIG5lYXJlc3QgOCBieXRlLCB3b3JkIG9yIGxvbmcgd29yZCkKKwkgKiBkaXZpZGVkIGJ5IChieXRlcy9yZWdpc3Rlcik7IHRoZSB0eCB0aHJlc2hvbGQgaXMgdGhlIGludmVyc2Ugb2YKKwkgKiB0aGUgcngsIHNvIHRoYXQgdGhlcmUgd2lsbCBhbHdheXMgYmUgZW5vdWdoIGRhdGEgaW4gdGhlIHJ4IGZpZm8KKwkgKiB0byBzYXRpc2Z5IGEgYnVyc3QsIGFuZCB0aGVyZSB3aWxsIGFsd2F5cyBiZSBlbm91Z2ggc3BhY2UgaW4gdGhlCisJICogdHggZmlmbyB0byBhY2NlcHQgYSBidXJzdCAoYSB0eCBidXJzdCB3aWxsIG92ZXJ3cml0ZSB0aGUgZmlmbyBpZgorCSAqIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UpLCB0aGVyZSBtdXN0IGFsd2F5cyByZW1haW4gZW5vdWdoIGVtcHR5CisJICogc3BhY2UgaW4gdGhlIHJ4IGZpZm8gZm9yIGFueSBkYXRhIGxvYWRlZCB0byB0aGUgdHggZmlmby4KKwkgKiBXaGVuZXZlciBidXJzdF9zaXplIChpbiBieXRlcykgZXF1YWxzIGJpdHMvd29yZCwgdGhlIGZpZm8gdGhyZXNob2xkCisJICogd2lsbCBiZSA4LCBvciBoYWxmIHRoZSBmaWZvOworCSAqIFRoZSB0aHJlc2hvbGQgY2FuIG9ubHkgYmUgc2V0IHRvIDIsIDQgb3IgOCwgYnV0IG5vdCAxNiwgYmVjYXVzZQorCSAqIHRvIGJ1cnN0IDE2IHRvIHRoZSB0eCBmaWZvLCB0aGUgZmlmbyB3b3VsZCBoYXZlIHRvIGJlIGVtcHR5OworCSAqIGhvd2V2ZXIsIHRoZSBtaW5pbXVtIGZpZm8gdHJpZ2dlciBsZXZlbCBpcyAxLCBhbmQgdGhlIHR4IHdpbGwKKwkgKiByZXF1ZXN0IHNlcnZpY2Ugd2hlbiB0aGUgZmlmbyBpcyBhdCB0aGlzIGxldmVsLCB3aXRoIG9ubHkgMTUgc3BhY2VzLgorCSAqLworCisJLyogZmluZCBieXRlcy93b3JkICovCisJaWYgKGJpdHNfcGVyX3dvcmQgPD0gOCkKKwkJYnl0ZXNfcGVyX3dvcmQgPSAxOworCWVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPD0gMTYpCisJCWJ5dGVzX3Blcl93b3JkID0gMjsKKwllbHNlCisJCWJ5dGVzX3Blcl93b3JkID0gNDsKKworCS8qIHVzZSBzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwLT5kbWFfYnVyc3Rfc2l6ZSBpZiBhdmFpbGFibGUgKi8KKwlpZiAoY2hpcF9pbmZvKQorCQlyZXFfYnVyc3Rfc2l6ZSA9IGNoaXBfaW5mby0+ZG1hX2J1cnN0X3NpemU7CisJZWxzZSB7CisJCXN3aXRjaCAoY2hpcC0+ZG1hX2J1cnN0X3NpemUpIHsKKwkJZGVmYXVsdDoKKwkJCS8qIGlmIHRoZSBkZWZhdWx0IGJ1cnN0IHNpemUgaXMgbm90IHNldCwKKwkJCSAqIGRvIGl0IG5vdyAqLworCQkJY2hpcC0+ZG1hX2J1cnN0X3NpemUgPSBEQ01EX0JVUlNUODsKKwkJY2FzZSBEQ01EX0JVUlNUODoKKwkJCXJlcV9idXJzdF9zaXplID0gODsKKwkJCWJyZWFrOworCQljYXNlIERDTURfQlVSU1QxNjoKKwkJCXJlcV9idXJzdF9zaXplID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSBEQ01EX0JVUlNUMzI6CisJCQlyZXFfYnVyc3Rfc2l6ZSA9IDMyOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJlcV9idXJzdF9zaXplIDw9IDgpIHsKKwkJKmJ1cnN0X2NvZGUgPSBEQ01EX0JVUlNUODsKKwkJYnVyc3RfYnl0ZXMgPSA4OworCX0gZWxzZSBpZiAocmVxX2J1cnN0X3NpemUgPD0gMTYpIHsKKwkJaWYgKGJ5dGVzX3Blcl93b3JkID09IDEpIHsKKwkJCS8qIGRvbid0IGJ1cnN0IG1vcmUgdGhhbiAxLzIgdGhlIGZpZm8gKi8KKwkJCSpidXJzdF9jb2RlID0gRENNRF9CVVJTVDg7CisJCQlidXJzdF9ieXRlcyA9IDg7CisJCQlyZXR2YWwgPSAxOworCQl9IGVsc2UgeworCQkJKmJ1cnN0X2NvZGUgPSBEQ01EX0JVUlNUMTY7CisJCQlidXJzdF9ieXRlcyA9IDE2OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGJ5dGVzX3Blcl93b3JkID09IDEpIHsKKwkJCS8qIGRvbid0IGJ1cnN0IG1vcmUgdGhhbiAxLzIgdGhlIGZpZm8gKi8KKwkJCSpidXJzdF9jb2RlID0gRENNRF9CVVJTVDg7CisJCQlidXJzdF9ieXRlcyA9IDg7CisJCQlyZXR2YWwgPSAxOworCQl9IGVsc2UgaWYgKGJ5dGVzX3Blcl93b3JkID09IDIpIHsKKwkJCS8qIGRvbid0IGJ1cnN0IG1vcmUgdGhhbiAxLzIgdGhlIGZpZm8gKi8KKwkJCSpidXJzdF9jb2RlID0gRENNRF9CVVJTVDE2OworCQkJYnVyc3RfYnl0ZXMgPSAxNjsKKwkJCXJldHZhbCA9IDE7CisJCX0gZWxzZSB7CisJCQkqYnVyc3RfY29kZSA9IERDTURfQlVSU1QzMjsKKwkJCWJ1cnN0X2J5dGVzID0gMzI7CisJCX0KKwl9CisKKwl0aHJlc2hfd29yZHMgPSBidXJzdF9ieXRlcyAvIGJ5dGVzX3Blcl93b3JkOworCisJLyogdGhyZXNoX3dvcmRzIHdpbGwgYmUgYmV0d2VlbiAyIGFuZCA4ICovCisJKnRocmVzaG9sZCA9IChTU0NSMV9SeFRyZXNoKHRocmVzaF93b3JkcykgJiBTU0NSMV9SRlQpCisJCQl8IChTU0NSMV9UeFRyZXNoKDE2LXRocmVzaF93b3JkcykgJiBTU0NSMV9URlQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKwogc3RhdGljIHZvaWQgcHVtcF90cmFuc2ZlcnModW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSAoc3RydWN0IGRyaXZlcl9kYXRhICopZGF0YTsKQEAgLTcwMiw2ICs3OTEsOSBAQAogCXU4IGJpdHMgPSAwOwogCXUzMiBzcGVlZCA9IDA7CiAJdTMyIGNyMDsKKwl1MzIgY3IxOworCXUzMiBkbWFfdGhyZXNoID0gZHJ2X2RhdGEtPmN1cl9jaGlwLT5kbWFfdGhyZXNob2xkOworCXUzMiBkbWFfYnVyc3QgPSBkcnZfZGF0YS0+Y3VyX2NoaXAtPmRtYV9idXJzdF9zaXplOwogCiAJLyogR2V0IGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gKi8KIAltZXNzYWdlID0gZHJ2X2RhdGEtPmN1cl9tc2c7CkBAIC03MzEsNiArODIzLDE2IEBACiAJCQl1ZGVsYXkocHJldmlvdXMtPmRlbGF5X3VzZWNzKTsKIAl9CiAKKwkvKiBDaGVjayB0cmFuc2ZlciBsZW5ndGggKi8KKwlpZiAodHJhbnNmZXItPmxlbiA+IDgxOTEpCisJeworCQlkZXZfd2FybigmZHJ2X2RhdGEtPnBkZXYtPmRldiwgInB1bXBfdHJhbnNmZXJzOiB0cmFuc2ZlciAiCisJCQkJImxlbmd0aCBncmVhdGVyIHRoYW4gODE5MVxuIik7CisJCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU5WQUw7CisJCWdpdmViYWNrKGRydl9kYXRhKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIFNldHVwIHRoZSB0cmFuc2ZlciBzdGF0ZSBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0cmFuc2ZlciAqLwogCWlmIChmbHVzaChkcnZfZGF0YSkgPT0gMCkgewogCQlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAicHVtcF90cmFuc2ZlcnM6IGZsdXNoIGZhaWxlZFxuIik7CkBAIC03NDcsMTcgKzg0OSwxNSBAQAogCWRydl9kYXRhLT5yeF9lbmQgPSBkcnZfZGF0YS0+cnggKyB0cmFuc2Zlci0+bGVuOwogCWRydl9kYXRhLT5yeF9kbWEgPSB0cmFuc2Zlci0+cnhfZG1hOwogCWRydl9kYXRhLT50eF9kbWEgPSB0cmFuc2Zlci0+dHhfZG1hOwotCWRydl9kYXRhLT5sZW4gPSB0cmFuc2Zlci0+bGVuOworCWRydl9kYXRhLT5sZW4gPSB0cmFuc2Zlci0+bGVuICYgRENNRF9MRU5HVEg7CiAJZHJ2X2RhdGEtPndyaXRlID0gZHJ2X2RhdGEtPnR4ID8gY2hpcC0+d3JpdGUgOiBudWxsX3dyaXRlcjsKIAlkcnZfZGF0YS0+cmVhZCA9IGRydl9kYXRhLT5yeCA/IGNoaXAtPnJlYWQgOiBudWxsX3JlYWRlcjsKIAlkcnZfZGF0YS0+Y3NfY2hhbmdlID0gdHJhbnNmZXItPmNzX2NoYW5nZTsKIAogCS8qIENoYW5nZSBzcGVlZCBhbmQgYml0IHBlciB3b3JkIG9uIGEgcGVyIHRyYW5zZmVyICovCisJY3IwID0gY2hpcC0+Y3IwOwogCWlmICh0cmFuc2Zlci0+c3BlZWRfaHogfHwgdHJhbnNmZXItPmJpdHNfcGVyX3dvcmQpIHsKIAotCQkvKiBEaXNhYmxlIGNsb2NrICovCi0JCXdyaXRlX1NTQ1IwKGNoaXAtPmNyMCAmIH5TU0NSMF9TU0UsIHJlZyk7Ci0JCWNyMCA9IGNoaXAtPmNyMDsKIAkJYml0cyA9IGNoaXAtPmJpdHNfcGVyX3dvcmQ7CiAJCXNwZWVkID0gY2hpcC0+c3BlZWRfaHo7CiAKQEAgLTc5NiwxNSArODk2LDI0IEBACiAJCQlkcnZfZGF0YS0+d3JpdGUgPSBkcnZfZGF0YS0+d3JpdGUgIT0gbnVsbF93cml0ZXIgPwogCQkJCQkJdTMyX3dyaXRlciA6IG51bGxfd3JpdGVyOwogCQl9CisJCS8qIGlmIGJpdHMvd29yZCBpcyBjaGFuZ2VkIGluIGRtYSBtb2RlLCB0aGVuIG11c3QgY2hlY2sgdGhlCisJCSAqIHRocmVzaG9sZHMgYW5kIGJ1cnN0IGFsc28gKi8KKwkJaWYgKGNoaXAtPmVuYWJsZV9kbWEpIHsKKwkJCWlmIChzZXRfZG1hX2J1cnN0X2FuZF90aHJlc2hvbGQoY2hpcCwgbWVzc2FnZS0+c3BpLAorCQkJCQkJCWJpdHMsICZkbWFfYnVyc3QsCisJCQkJCQkJJmRtYV90aHJlc2gpKQorCQkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQkJCWRldl93YXJuKCZtZXNzYWdlLT5zcGktPmRldiwKKwkJCQkJCSJwdW1wX3RyYW5zZmVyOiAiCisJCQkJCQkiRE1BIGJ1cnN0IHNpemUgcmVkdWNlZCB0byAiCisJCQkJCQkibWF0Y2ggYml0c19wZXJfd29yZFxuIik7CisJCX0KIAogCQljcjAgPSBjbGtfZGl2CiAJCQl8IFNTQ1IwX01vdG9yb2xhCiAJCQl8IFNTQ1IwX0RhdGFTaXplKGJpdHMgPiAxNiA/IGJpdHMgLSAxNiA6IGJpdHMpCiAJCQl8IFNTQ1IwX1NTRQogCQkJfCAoYml0cyA+IDE2ID8gU1NDUjBfRURTUyA6IDApOwotCi0JCS8qIFN0YXJ0IGl0IGJhY2sgdXAgKi8KLQkJd3JpdGVfU1NDUjAoY3IwLCByZWcpOwogCX0KIAogCW1lc3NhZ2UtPnN0YXRlID0gUlVOTklOR19TVEFURTsKQEAgLTgyMywxMyArOTMyLDEzIEBACiAJCQkvKiBObyB0YXJnZXQgYWRkcmVzcyBpbmNyZW1lbnQgKi8KIAkJCURDTUQoZHJ2X2RhdGEtPnJ4X2NoYW5uZWwpID0gRENNRF9GTE9XU1JDCiAJCQkJCQkJfCBkcnZfZGF0YS0+ZG1hX3dpZHRoCi0JCQkJCQkJfCBjaGlwLT5kbWFfYnVyc3Rfc2l6ZQorCQkJCQkJCXwgZG1hX2J1cnN0CiAJCQkJCQkJfCBkcnZfZGF0YS0+bGVuOwogCQllbHNlCiAJCQlEQ01EKGRydl9kYXRhLT5yeF9jaGFubmVsKSA9IERDTURfSU5DVFJHQUREUgogCQkJCQkJCXwgRENNRF9GTE9XU1JDCiAJCQkJCQkJfCBkcnZfZGF0YS0+ZG1hX3dpZHRoCi0JCQkJCQkJfCBjaGlwLT5kbWFfYnVyc3Rfc2l6ZQorCQkJCQkJCXwgZG1hX2J1cnN0CiAJCQkJCQkJfCBkcnZfZGF0YS0+bGVuOwogCiAJCS8qIFNldHVwIHR4IERNQSBDaGFubmVsICovCkBAIC04NDAsMTMgKzk0OSwxMyBAQAogCQkJLyogTm8gc291cmNlIGFkZHJlc3MgaW5jcmVtZW50ICovCiAJCQlEQ01EKGRydl9kYXRhLT50eF9jaGFubmVsKSA9IERDTURfRkxPV1RSRwogCQkJCQkJCXwgZHJ2X2RhdGEtPmRtYV93aWR0aAotCQkJCQkJCXwgY2hpcC0+ZG1hX2J1cnN0X3NpemUKKwkJCQkJCQl8IGRtYV9idXJzdAogCQkJCQkJCXwgZHJ2X2RhdGEtPmxlbjsKIAkJZWxzZQogCQkJRENNRChkcnZfZGF0YS0+dHhfY2hhbm5lbCkgPSBEQ01EX0lOQ1NSQ0FERFIKIAkJCQkJCQl8IERDTURfRkxPV1RSRwogCQkJCQkJCXwgZHJ2X2RhdGEtPmRtYV93aWR0aAotCQkJCQkJCXwgY2hpcC0+ZG1hX2J1cnN0X3NpemUKKwkJCQkJCQl8IGRtYV9idXJzdAogCQkJCQkJCXwgZHJ2X2RhdGEtPmxlbjsKIAogCQkvKiBFbmFibGUgZG1hIGVuZCBpcnFzIG9uIFNTUCB0byBkZXRlY3QgZW5kIG9mIHRyYW5zZmVyICovCkBAIC04NTYsMTYgKzk2NSwxMSBAQAogCQkvKiBGaXggbWUsIG5lZWQgdG8gaGFuZGxlIGNzIHBvbGFyaXR5ICovCiAJCWRydl9kYXRhLT5jc19jb250cm9sKFBYQTJYWF9DU19BU1NFUlQpOwogCi0JCS8qIEdvIGJhYnksIGdvICovCisJCS8qIENsZWFyIHN0YXR1cyBhbmQgc3RhcnQgRE1BIGVuZ2luZSAqLworCQljcjEgPSBjaGlwLT5jcjEgfCBkbWFfdGhyZXNoIHwgZHJ2X2RhdGEtPmRtYV9jcjE7CiAJCXdyaXRlX1NTU1IoZHJ2X2RhdGEtPmNsZWFyX3NyLCByZWcpOwogCQlEQ1NSKGRydl9kYXRhLT5yeF9jaGFubmVsKSB8PSBEQ1NSX1JVTjsKIAkJRENTUihkcnZfZGF0YS0+dHhfY2hhbm5lbCkgfD0gRENTUl9SVU47Ci0JCWlmIChkcnZfZGF0YS0+c3NwX3R5cGUgIT0gUFhBMjV4X1NTUCkKLQkJCXdyaXRlX1NTVE8oY2hpcC0+dGltZW91dCwgcmVnKTsKLQkJd3JpdGVfU1NDUjEoY2hpcC0+Y3IxCi0JCQkJfCBjaGlwLT5kbWFfdGhyZXNob2xkCi0JCQkJfCBkcnZfZGF0YS0+ZG1hX2NyMSwKLQkJCQlyZWcpOwogCX0gZWxzZSB7CiAJCS8qIEVuc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IGludGVycnVwdCBoYW5kbGVyCSovCiAJCWRydl9kYXRhLT50cmFuc2Zlcl9oYW5kbGVyID0gaW50ZXJydXB0X3RyYW5zZmVyOwpAQCAtODczLDIwICs5NzcsMzIgQEAKIAkJLyogRml4IG1lLCBuZWVkIHRvIGhhbmRsZSBjcyBwb2xhcml0eSAqLwogCQlkcnZfZGF0YS0+Y3NfY29udHJvbChQWEEyWFhfQ1NfQVNTRVJUKTsKIAotCQkvKiBHbyBiYWJ5LCBnbyAqLworCQkvKiBDbGVhciBzdGF0dXMgICovCisJCWNyMSA9IGNoaXAtPmNyMSB8IGNoaXAtPnRocmVzaG9sZCB8IGRydl9kYXRhLT5pbnRfY3IxOwogCQl3cml0ZV9TU1NSKGRydl9kYXRhLT5jbGVhcl9zciwgcmVnKTsKKwl9CisKKwkvKiBzZWUgaWYgd2UgbmVlZCB0byByZWxvYWQgdGhlIGNvbmZpZyByZWdpc3RlcnMgKi8KKwlpZiAoKHJlYWRfU1NDUjAocmVnKSAhPSBjcjApCisJCXx8IChyZWFkX1NTQ1IxKHJlZykgJiBTU0NSMV9DSEFOR0VfTUFTSykgIT0KKwkJCShjcjEgJiBTU0NSMV9DSEFOR0VfTUFTSykpIHsKKworCQl3cml0ZV9TU0NSMChjcjAgJiB+U1NDUjBfU1NFLCByZWcpOwogCQlpZiAoZHJ2X2RhdGEtPnNzcF90eXBlICE9IFBYQTI1eF9TU1ApCiAJCQl3cml0ZV9TU1RPKGNoaXAtPnRpbWVvdXQsIHJlZyk7Ci0JCXdyaXRlX1NTQ1IxKGNoaXAtPmNyMQotCQkJCXwgY2hpcC0+dGhyZXNob2xkCi0JCQkJfCBkcnZfZGF0YS0+aW50X2NyMSwKLQkJCQlyZWcpOworCQl3cml0ZV9TU0NSMShjcjEsIHJlZyk7CisJCXdyaXRlX1NTQ1IwKGNyMCwgcmVnKTsKKwl9IGVsc2UgeworCQlpZiAoZHJ2X2RhdGEtPnNzcF90eXBlICE9IFBYQTI1eF9TU1ApCisJCQl3cml0ZV9TU1RPKGNoaXAtPnRpbWVvdXQsIHJlZyk7CisJCXdyaXRlX1NTQ1IxKGNyMSwgcmVnKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHB1bXBfbWVzc2FnZXModm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHB1bXBfbWVzc2FnZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBkYXRhOworCXN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRyaXZlcl9kYXRhLCBwdW1wX21lc3NhZ2VzKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogTG9jayBxdWV1ZSBhbmQgY2hlY2sgZm9yIHF1ZXVlIHdvcmsgKi8KQEAgLTkxNCw5ICsxMDMwLDkgQEAKIAkJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCiAJCQkJCQl0cmFuc2Zlcl9saXN0KTsKIAotCS8qIFNldHVwIHRoZSBTU1AgdXNpbmcgdGhlIHBlciBjaGlwIGNvbmZpZ3VyYXRpb24gKi8KKwkvKiBwcmVwYXJlIHRvIHNldHVwIHRoZSBTU1AsIGluIHB1bXBfdHJhbnNmZXJzLCB1c2luZyB0aGUgcGVyCisJICogY2hpcCBjb25maWd1cmF0aW9uICovCiAJZHJ2X2RhdGEtPmN1cl9jaGlwID0gc3BpX2dldF9jdGxkYXRhKGRydl9kYXRhLT5jdXJfbXNnLT5zcGkpOwotCXJlc3RvcmVfc3RhdGUoZHJ2X2RhdGEpOwogCiAJLyogTWFyayBhcyBidXN5IGFuZCBsYXVuY2ggdHJhbnNmZXJzICovCiAJdGFza2xldF9zY2hlZHVsZSgmZHJ2X2RhdGEtPnB1bXBfdHJhbnNmZXJzKTsKQEAgLTk2Miw2MyArMTA3OCw3NyBAQAogCQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwogCiAJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSAhPSBQWEEyNXhfU1NQCi0JCQkmJiAoc3BpLT5iaXRzX3Blcl93b3JkIDwgNCB8fCBzcGktPmJpdHNfcGVyX3dvcmQgPiAzMikpCisJCSYmIChzcGktPmJpdHNfcGVyX3dvcmQgPCA0IHx8IHNwaS0+Yml0c19wZXJfd29yZCA+IDMyKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCBzZXR1cDogc3NwX3R5cGU9JWQsIGJpdHMvd3JkPSVkICIKKwkJCQkiYi93IG5vdCA0LTMyIGZvciB0eXBlIG5vbi1QWEEyNXhfU1NQXG4iLAorCQkJCWRydl9kYXRhLT5zc3BfdHlwZSwgc3BpLT5iaXRzX3Blcl93b3JkKTsKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZSBpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDwgNCB8fCBzcGktPmJpdHNfcGVyX3dvcmQgPiAxNikKKwl9CisJZWxzZSBpZiAoZHJ2X2RhdGEtPnNzcF90eXBlID09IFBYQTI1eF9TU1AKKwkJCSYmIChzcGktPmJpdHNfcGVyX3dvcmQgPCA0CisJCQkJfHwgc3BpLT5iaXRzX3Blcl93b3JkID4gMTYpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHNldHVwOiBzc3BfdHlwZT0lZCwgYml0cy93cmQ9JWQgIgorCQkJCSJiL3cgbm90IDQtMTYgZm9yIHR5cGUgUFhBMjV4X1NTUFxuIiwKKwkJCQlkcnZfZGF0YS0+c3NwX3R5cGUsIHNwaS0+Yml0c19wZXJfd29yZCk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAotCS8qIE9ubHkgYWxsb2MgKG9yIHVzZSBjaGlwX2luZm8pIG9uIGZpcnN0IHNldHVwICovCisJLyogT25seSBhbGxvYyBvbiBmaXJzdCBzZXR1cCAqLwogCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKLQlpZiAoY2hpcCA9PSBOVUxMKSB7CisJaWYgKCFjaGlwKSB7CiAJCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hpcF9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2hpcCkKKwkJaWYgKCFjaGlwKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkiZmFpbGVkIHNldHVwOiBjYW4ndCBhbGxvY2F0ZSBjaGlwIGRhdGFcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAogCQljaGlwLT5jc19jb250cm9sID0gbnVsbF9jc19jb250cm9sOwogCQljaGlwLT5lbmFibGVfZG1hID0gMDsKLQkJY2hpcC0+dGltZW91dCA9IFNTUF9USU1FT1VUKDEwMDApOworCQljaGlwLT50aW1lb3V0ID0gMTAwMDsKIAkJY2hpcC0+dGhyZXNob2xkID0gU1NDUjFfUnhUcmVzaCgxKSB8IFNTQ1IxX1R4VHJlc2goMSk7CiAJCWNoaXAtPmRtYV9idXJzdF9zaXplID0gZHJ2X2RhdGEtPm1hc3Rlcl9pbmZvLT5lbmFibGVfZG1hID8KIAkJCQkJRENNRF9CVVJTVDggOiAwOwotCi0JCWNoaXBfaW5mbyA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCX0KIAorCS8qIHByb3RvY29sIGRyaXZlcnMgbWF5IGNoYW5nZSB0aGUgY2hpcCBzZXR0aW5ncywgc28uLi4KKwkgKiBpZiBjaGlwX2luZm8gZXhpc3RzLCB1c2UgaXQgKi8KKwljaGlwX2luZm8gPSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwogCS8qIGNoaXBfaW5mbyBpc24ndCBhbHdheXMgbmVlZGVkICovCisJY2hpcC0+Y3IxID0gMDsKIAlpZiAoY2hpcF9pbmZvKSB7CiAJCWlmIChjaGlwX2luZm8tPmNzX2NvbnRyb2wpCiAJCQljaGlwLT5jc19jb250cm9sID0gY2hpcF9pbmZvLT5jc19jb250cm9sOwogCi0JCWNoaXAtPnRpbWVvdXQgPSBTU1BfVElNRU9VVChjaGlwX2luZm8tPnRpbWVvdXRfbWljcm9zZWNzKTsKKwkJY2hpcC0+dGltZW91dCA9IGNoaXBfaW5mby0+dGltZW91dDsKIAotCQljaGlwLT50aHJlc2hvbGQgPSBTU0NSMV9SeFRyZXNoKGNoaXBfaW5mby0+cnhfdGhyZXNob2xkKQotCQkJCQl8IFNTQ1IxX1R4VHJlc2goY2hpcF9pbmZvLT50eF90aHJlc2hvbGQpOworCQljaGlwLT50aHJlc2hvbGQgPSAoU1NDUjFfUnhUcmVzaChjaGlwX2luZm8tPnJ4X3RocmVzaG9sZCkgJgorCQkJCQkJCQlTU0NSMV9SRlQpIHwKKwkJCQkoU1NDUjFfVHhUcmVzaChjaGlwX2luZm8tPnR4X3RocmVzaG9sZCkgJgorCQkJCQkJCQlTU0NSMV9URlQpOwogCiAJCWNoaXAtPmVuYWJsZV9kbWEgPSBjaGlwX2luZm8tPmRtYV9idXJzdF9zaXplICE9IDAKIAkJCQkJJiYgZHJ2X2RhdGEtPm1hc3Rlcl9pbmZvLT5lbmFibGVfZG1hOwogCQljaGlwLT5kbWFfdGhyZXNob2xkID0gMDsKIAotCQlpZiAoY2hpcC0+ZW5hYmxlX2RtYSkgewotCQkJaWYgKGNoaXBfaW5mby0+ZG1hX2J1cnN0X3NpemUgPD0gOCkgewotCQkJCWNoaXAtPmRtYV90aHJlc2hvbGQgPSBTU0NSMV9SeFRyZXNoKDgpCi0JCQkJCQkJfCBTU0NSMV9UeFRyZXNoKDgpOwotCQkJCWNoaXAtPmRtYV9idXJzdF9zaXplID0gRENNRF9CVVJTVDg7Ci0JCQl9IGVsc2UgaWYgKGNoaXBfaW5mby0+ZG1hX2J1cnN0X3NpemUgPD0gMTYpIHsKLQkJCQljaGlwLT5kbWFfdGhyZXNob2xkID0gU1NDUjFfUnhUcmVzaCgxNikKLQkJCQkJCQl8IFNTQ1IxX1R4VHJlc2goMTYpOwotCQkJCWNoaXAtPmRtYV9idXJzdF9zaXplID0gRENNRF9CVVJTVDE2OwotCQkJfSBlbHNlIHsKLQkJCQljaGlwLT5kbWFfdGhyZXNob2xkID0gU1NDUjFfUnhUcmVzaCgzMikKLQkJCQkJCQl8IFNTQ1IxX1R4VHJlc2goMzIpOwotCQkJCWNoaXAtPmRtYV9idXJzdF9zaXplID0gRENNRF9CVVJTVDMyOwotCQkJfQotCQl9Ci0KLQogCQlpZiAoY2hpcF9pbmZvLT5lbmFibGVfbG9vcGJhY2spCiAJCQljaGlwLT5jcjEgPSBTU0NSMV9MQk07CiAJfQogCisJLyogc2V0IGRtYSBidXJzdCBhbmQgdGhyZXNob2xkIG91dHNpZGUgb2YgY2hpcF9pbmZvIHBhdGggc28gdGhhdCBpZgorCSAqIGNoaXBfaW5mbyBnb2VzIGF3YXkgYWZ0ZXIgc2V0dGluZyBjaGlwLT5lbmFibGVfZG1hLCB0aGUKKwkgKiBidXJzdCBhbmQgdGhyZXNob2xkIGNhbiBzdGlsbCByZXNwb25kIHRvIGNoYW5nZXMgaW4gYml0c19wZXJfd29yZCAqLworCWlmIChjaGlwLT5lbmFibGVfZG1hKSB7CisJCS8qIHNldCB1cCBsZWdhbCBidXJzdCBhbmQgdGhyZXNob2xkIGZvciBkbWEgKi8KKwkJaWYgKHNldF9kbWFfYnVyc3RfYW5kX3RocmVzaG9sZChjaGlwLCBzcGksIHNwaS0+Yml0c19wZXJfd29yZCwKKwkJCQkJCSZjaGlwLT5kbWFfYnVyc3Rfc2l6ZSwKKwkJCQkJCSZjaGlwLT5kbWFfdGhyZXNob2xkKSkgeworCQkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAiaW4gc2V0dXA6IERNQSBidXJzdCBzaXplIHJlZHVjZWQgIgorCQkJCQkidG8gbWF0Y2ggYml0c19wZXJfd29yZFxuIik7CisJCX0KKwl9CisKIAlpZiAoZHJ2X2RhdGEtPmlvYWRkciA9PSBTU1AxX1ZJUlQpCiAJCWNsa19kaXYgPSBTU1AxX1NlckNsa0RpdihzcGktPm1heF9zcGVlZF9oeik7CiAJZWxzZSBpZiAoZHJ2X2RhdGEtPmlvYWRkciA9PSBTU1AyX1ZJUlQpCkBAIC0xMDI2LDcgKzExNTYsMTEgQEAKIAllbHNlIGlmIChkcnZfZGF0YS0+aW9hZGRyID09IFNTUDNfVklSVCkKIAkJY2xrX2RpdiA9IFNTUDNfU2VyQ2xrRGl2KHNwaS0+bWF4X3NwZWVkX2h6KTsKIAllbHNlCisJeworCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCBzZXR1cDogdW5rbm93biBJTyBhZGRyZXNzPTB4JXBcbiIsCisJCQlkcnZfZGF0YS0+aW9hZGRyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CisJfQogCWNoaXAtPnNwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CiAKIAljaGlwLT5jcjAgPSBjbGtfZGl2CkBAIC0xMDcwLDcgKzEyMDQsNiBAQAogCQljaGlwLT53cml0ZSA9IHUzMl93cml0ZXI7CiAJfSBlbHNlIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJpbnZhbGlkIHdvcmRzaXplXG4iKTsKLQkJa2ZyZWUoY2hpcCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAljaGlwLT5iaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwpAQCAtMTA5OCw3ICsxMjMxLDcgQEAKIAl0YXNrbGV0X2luaXQoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycywKIAkJCXB1bXBfdHJhbnNmZXJzLAkodW5zaWduZWQgbG9uZylkcnZfZGF0YSk7CiAKLQlJTklUX1dPUksoJmRydl9kYXRhLT5wdW1wX21lc3NhZ2VzLCBwdW1wX21lc3NhZ2VzLCBkcnZfZGF0YSk7CisJSU5JVF9XT1JLKCZkcnZfZGF0YS0+cHVtcF9tZXNzYWdlcywgcHVtcF9tZXNzYWdlcyk7CiAJZHJ2X2RhdGEtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAogCQkJCQlkcnZfZGF0YS0+bWFzdGVyLT5jZGV2LmRldi0+YnVzX2lkKTsKIAlpZiAoZHJ2X2RhdGEtPndvcmtxdWV1ZSA9PSBOVUxMKQpAQCAtMTE2MSw2ICsxMjk0LDEyIEBACiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IHN0b3BfcXVldWUoZHJ2X2RhdGEpOworCS8qIHdlIGFyZSB1bmxvYWRpbmcgdGhlIG1vZHVsZSBvciBmYWlsaW5nIHRvIGxvYWQgKG9ubHkgdHdvIGNhbGxzCisJICogdG8gdGhpcyByb3V0aW5lKSwgYW5kIG5laXRoZXIgY2FsbCBjYW4gaGFuZGxlIGEgcmV0dXJuIHZhbHVlLgorCSAqIEhvd2V2ZXIsIGRlc3Ryb3lfd29ya3F1ZXVlIGNhbGxzIGZsdXNoX3dvcmtxdWV1ZSwgYW5kIHRoYXQgd2lsbAorCSAqIGJsb2NrIHVudGlsIGFsbCB3b3JrIGlzIGRvbmUuICBJZiB0aGUgcmVhc29uIHRoYXQgc3RvcF9xdWV1ZQorCSAqIHRpbWVkIG91dCBpcyB0aGF0IHRoZSB3b3JrIHdpbGwgbmV2ZXIgZmluaXNoLCB0aGVuIGl0IGRvZXMgbm8KKwkgKiBnb29kIHRvIGNhbGwgZGVzdHJveV93b3JrcXVldWUsIHNvIHJldHVybiBhbnl3YXkuICovCiAJaWYgKHN0YXR1cyAhPSAwKQogCQlyZXR1cm4gc3RhdHVzOwogCkBAIC0xMzU5LDcgKzE0OTgsMTYgQEAKIAkvKiBSZW1vdmUgdGhlIHF1ZXVlICovCiAJc3RhdHVzID0gZGVzdHJveV9xdWV1ZShkcnZfZGF0YSk7CiAJaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gc3RhdHVzOworCQkvKiB0aGUga2VybmVsIGRvZXMgbm90IGNoZWNrIHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoaXMKKwkJICogdGhpcyByb3V0aW5lIChtb2QtPmV4aXQsIHdpdGhpbiB0aGUga2VybmVsKS4gIFRoZXJlZm9yZQorCQkgKiBub3RoaW5nIGlzIGdhaW5lZCBieSByZXR1cm5pbmcgZnJvbSBoZXJlLCB0aGUgbW9kdWxlIGlzCisJCSAqIGdvaW5nIGF3YXkgcmVnYXJkbGVzcywgYW5kIHdlIHNob3VsZCBub3QgbGVhdmUgYW55IG1vcmUKKwkJICogcmVzb3VyY2VzIGFsbG9jYXRlZCB0aGFuIG5lY2Vzc2FyeS4gIFdlIGNhbm5vdCBmcmVlIHRoZQorCQkgKiBtZXNzYWdlIG1lbW9yeSBpbiBkcnZfZGF0YS0+cXVldWUsIGJ1dCB3ZSBjYW4gcmVsZWFzZSB0aGUKKwkJICogcmVzb3VyY2VzIGJlbG93LiAgSSB0aGluayB0aGUga2VybmVsIHNob3VsZCBob25vciAtRUJVU1kKKwkJICogcmV0dXJucyBidXQuLi4gKi8KKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicHhhMnh4X3NwaV9yZW1vdmU6IHdvcmtxdWV1ZSB3aWxsIG5vdCAiCisJCQkiY29tcGxldGUsIG1lc3NhZ2UgbWVtb3J5IG5vdCBmcmVlZFxuIik7CiAKIAkvKiBEaXNhYmxlIHRoZSBTU1AgYXQgdGhlIHBlcmlwaGVyYWwgYW5kIFNPQyBsZXZlbCAqLwogCXdyaXRlX1NTQ1IwKDAsIGRydl9kYXRhLT5pb2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkuYwppbmRleCAxNDYyOThhLi4yNzBlNjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGkuYwpAQCAtMjgxLDcgKzI4MSw2IEBACiAJdXAoJmJvYXJkX2xvY2spOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8pOwogCiAvKiBGSVhNRSBzb21lb25lIHNob3VsZCBhZGQgc3VwcG9ydCBmb3IgYSBfX3NldHVwKCJzcGkiLCAuLi4pIHRoYXQKICAqIGNyZWF0ZXMgYm9hcmQgaW5mbyBmcm9tIGtlcm5lbCBjb21tYW5kIGxpbmVzCkBAIC0zNjEsMTIgKzM2MCwxMyBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKIAotCW1hc3RlciA9IGt6YWxsb2Moc2l6ZSArIHNpemVvZiAqbWFzdGVyLCBTTEFCX0tFUk5FTCk7CisJbWFzdGVyID0ga3phbGxvYyhzaXplICsgc2l6ZW9mICptYXN0ZXIsIEdGUF9LRVJORUwpOwogCWlmICghbWFzdGVyKQogCQlyZXR1cm4gTlVMTDsKIAogCWNsYXNzX2RldmljZV9pbml0aWFsaXplKCZtYXN0ZXItPmNkZXYpOwogCW1hc3Rlci0+Y2Rldi5jbGFzcyA9ICZzcGlfbWFzdGVyX2NsYXNzOworCWtvYmpfc2V0X2tzZXRfcygmbWFzdGVyLT5jZGV2LCBzcGlfbWFzdGVyX2NsYXNzLnN1YnN5cyk7CiAJbWFzdGVyLT5jZGV2LmRldiA9IGdldF9kZXZpY2UoZGV2KTsKIAlzcGlfbWFzdGVyX3NldF9kZXZkYXRhKG1hc3RlciwgJm1hc3RlclsxXSk7CiAKQEAgLTQ0OCw3ICs0NDgsOSBAQAogICovCiB2b2lkIHNwaV91bnJlZ2lzdGVyX21hc3RlcihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQogewotCSh2b2lkKSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQobWFzdGVyLT5jZGV2LmRldiwgTlVMTCwgX191bnJlZ2lzdGVyKTsKKwlpbnQgZHVtbXk7CisKKwlkdW1teSA9IGRldmljZV9mb3JfZWFjaF9jaGlsZChtYXN0ZXItPmNkZXYuZGV2LCBOVUxMLCBfX3VucmVnaXN0ZXIpOwogCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZtYXN0ZXItPmNkZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3BpX3VucmVnaXN0ZXJfbWFzdGVyKTsKQEAgLTQ2NCwxNSArNDY2LDEzIEBACiAgKi8KIHN0cnVjdCBzcGlfbWFzdGVyICpzcGlfYnVzbnVtX3RvX21hc3Rlcih1MTYgYnVzX251bSkKIHsKLQlpZiAoYnVzX251bSkgewotCQljaGFyCQkJbmFtZVs4XTsKLQkJc3RydWN0IGtvYmplY3QJCSpidXM7CisJY2hhcgkJCW5hbWVbOV07CisJc3RydWN0IGtvYmplY3QJCSpidXM7CiAKLQkJc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJzcGkldSIsIGJ1c19udW0pOwotCQlidXMgPSBrc2V0X2ZpbmRfb2JqKCZzcGlfbWFzdGVyX2NsYXNzLnN1YnN5cy5rc2V0LCBuYW1lKTsKLQkJaWYgKGJ1cykKLQkJCXJldHVybiBjb250YWluZXJfb2YoYnVzLCBzdHJ1Y3Qgc3BpX21hc3RlciwgY2Rldi5rb2JqKTsKLQl9CisJc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJzcGkldSIsIGJ1c19udW0pOworCWJ1cyA9IGtzZXRfZmluZF9vYmooJnNwaV9tYXN0ZXJfY2xhc3Muc3Vic3lzLmtzZXQsIG5hbWUpOworCWlmIChidXMpCisJCXJldHVybiBjb250YWluZXJfb2YoYnVzLCBzdHJ1Y3Qgc3BpX21hc3RlciwgY2Rldi5rb2JqKTsKIAlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwaV9idXNudW1fdG9fbWFzdGVyKTsKQEAgLTYwOCw3ICs2MDgsNyBAQAogewogCWludAlzdGF0dXM7CiAKLQlidWYgPSBrbWFsbG9jKFNQSV9CVUZTSVosIFNMQUJfS0VSTkVMKTsKKwlidWYgPSBrbWFsbG9jKFNQSV9CVUZTSVosIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCmluZGV4IGEyMzg2MmUuLjU3Mjg5YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFjcykgewotCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgU0xBQl9LRVJORUwpOworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CiAJCWlmICghY3MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CkBAIC0yNjUsOSArMjY1LDEwIEBACiAgKiBEcml2ZXJzIGNhbiBwcm92aWRlIHdvcmQtYXQtYS10aW1lIGkvbyBwcmltaXRpdmVzLCBvciBwcm92aWRlCiAgKiB0cmFuc2Zlci1hdC1hLXRpbWUgb25lcyB0byBsZXZlcmFnZSBkbWEgb3IgZmlmbyBoYXJkd2FyZS4KICAqLwotc3RhdGljIHZvaWQgYml0YmFuZ193b3JrKHZvaWQgKl9iaXRiYW5nKQorc3RhdGljIHZvaWQgYml0YmFuZ193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJpdGJhbmcgPSBfYml0YmFuZzsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJKmJpdGJhbmcgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwaV9iaXRiYW5nLCB3b3JrKTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRiYW5nLT5sb2NrLCBmbGFncyk7CkBAIC00NTYsNyArNDU3LDcgQEAKIAlpZiAoIWJpdGJhbmctPm1hc3RlciB8fCAhYml0YmFuZy0+Y2hpcHNlbGVjdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlJTklUX1dPUksoJmJpdGJhbmctPndvcmssIGJpdGJhbmdfd29yaywgYml0YmFuZyk7CisJSU5JVF9XT1JLKCZiaXRiYW5nLT53b3JrLCBiaXRiYW5nX3dvcmspOwogCXNwaW5fbG9ja19pbml0KCZiaXRiYW5nLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmYml0YmFuZy0+cXVldWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMgYi9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKaW5kZXggMzlkOWIyMC4uMzEyOTg3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KIAorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgpAQCAtMjUwLDYgKzI1MSw4IEBACiAJICogc2V0dGluZyB1cCBhIHBsYXRmb3JtIGRldmljZSBsaWtlIHRoaXMgaXMgYW4gdWdseSBrbHVnZS4uLgogCSAqLwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJidXR0ZXJmbHkiLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihwZGV2KSkKKwkJcmV0dXJuOwogCiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YgKnBwKTsKIAlpZiAoIW1hc3RlcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90Yy96cy5jIGIvZHJpdmVycy90Yy96cy5jCmluZGV4IDc5MmJlY2QuLmZjMzE5NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGMvenMuYworKysgYi9kcml2ZXJzL3RjL3pzLmMKQEAgLTEyMzgsNyArMTIzOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIHJzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IGRlY19zZXJpYWwgKmluZm8gPSAoc3RydWN0IGRlY19zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwogCWludCB3YXNfc3RvcHBlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4ai5jIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKaW5kZXggZjZiMjk0OC4uZGY0Y2MxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKQEAgLTI4NCw2ICsyODQsMTQgQEAKIAogbW9kdWxlX3BhcmFtKGl4amRlYnVnLCBpbnQsIDApOwogCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXhqX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9RVUlDS05FVCwgUENJX0RFVklDRV9JRF9RVUlDS05FVF9YSiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGl4al9wY2lfdGJsKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBpeGpkZWJ1ZyBtZWFuaW5ncyBhcmUgbm93IGJpdCBtYXBwZWQgaW5zdGVhZCBvZiBsZXZlbCBiYXNlZApAQCAtMjczOSw3ICsyNzQ3LDcgQEAKIHN0YXRpYyBzc2l6ZV90IGl4al9yZWFkKHN0cnVjdCBmaWxlICogZmlsZV9wLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuZ3RoLCBsb2ZmX3QgKiBwcG9zKQogewogCXVuc2lnbmVkIGxvbmcgaSA9ICpwcG9zOwotCUlYSiAqIGogPSBnZXRfaXhqKE5VTShmaWxlX3AtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisJSVhKICogaiA9IGdldF9peGooTlVNKGZpbGVfcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpOwogCiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKQEAgLTI3OTYsNyArMjgwNCw3IEBACiB7CiAJaW50IHByZV9yZXR2YWw7CiAJc3NpemVfdCByZWFkX3JldHZhbCA9IDA7Ci0JSVhKICpqID0gZ2V0X2l4aihOVU0oZmlsZV9wLT5mX2RlbnRyeS0+ZF9pbm9kZSkpOworCUlYSiAqaiA9IGdldF9peGooTlVNKGZpbGVfcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpOwogCiAJcHJlX3JldHZhbCA9IGl4al9QcmVSZWFkKGosIDBMKTsKIAlzd2l0Y2ggKHByZV9yZXR2YWwpIHsKQEAgLTI4NzUsNyArMjg4Myw3IEBACiAJaW50IHByZV9yZXR2YWw7CiAJc3NpemVfdCB3cml0ZV9yZXR2YWwgPSAwOwogCi0JSVhKICpqID0gZ2V0X2l4aihOVU0oZmlsZV9wLT5mX2RlbnRyeS0+ZF9pbm9kZSkpOworCUlYSiAqaiA9IGdldF9peGooTlVNKGZpbGVfcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpOwogCiAJcHJlX3JldHZhbCA9IGl4al9QcmVXcml0ZShqLCAwTCk7CiAJc3dpdGNoIChwcmVfcmV0dmFsKSB7CkBAIC00NTc0LDcgKzQ1ODIsNyBAQAogewogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAotCUlYSiAqaiA9IGdldF9peGooTlVNKGZpbGVfcC0+Zl9kZW50cnktPmRfaW5vZGUpKTsKKwlJWEogKmogPSBnZXRfaXhqKE5VTShmaWxlX3AtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKTsKIAogCXBvbGxfd2FpdChmaWxlX3AsICYoai0+cG9sbF9xKSwgd2FpdCk7CiAJaWYgKGotPnJlYWRfYnVmZmVyX3JlYWR5ID4gMCkKQEAgLTY2NDksNyArNjY1Nyw3IEBACiAKIHN0YXRpYyBpbnQgaXhqX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlX3AsIGludCBtb2RlKQogewotCUlYSiAqaiA9IGdldF9peGooTlVNKGZpbGVfcC0+Zl9kZW50cnktPmRfaW5vZGUpKTsKKwlJWEogKmogPSBnZXRfaXhqKE5VTShmaWxlX3AtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKTsKIAogCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlX3AsIG1vZGUsICZqLT5hc3luY19xdWV1ZSk7CiB9CkBAIC03NjgzLDcgKzc2OTEsOCBAQAogCUlYSiAqaiA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSVhKTUFYIC0gKmNudDsgaSsrKSB7Ci0JCXBjaSA9IHBjaV9maW5kX2RldmljZSgweDE1RTIsIDB4MDUwMCwgcGNpKTsKKwkJcGNpID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUVVJQ0tORVQsCisJCQkJICAgICAgUENJX0RFVklDRV9JRF9RVUlDS05FVF9YSiwgcGNpKTsKIAkJaWYgKCFwY2kpCiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmggYi9kcml2ZXJzL3RlbGVwaG9ueS9peGouaAppbmRleCBmYmVhNDU0Li44ZDY5YmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGouaAorKysgYi9kcml2ZXJzL3RlbGVwaG9ueS9peGouaApAQCAtMTI5NSw3ICsxMjk1LDcgQEAKIAlQcm9jX0luZm9fVHlwZSBJbmZvX3dyaXRlOwogCXVuc2lnbmVkIHNob3J0IGZyYW1lX2NvdW50OwogCXVuc2lnbmVkIGludCBmaWx0ZXJfaGlzdFs0XTsKLQl1bnNpZ25lZCBjaGFyIGZpbHRlcl9lbls0XTsKKwl1bnNpZ25lZCBjaGFyIGZpbHRlcl9lbls2XTsKIAl1bnNpZ25lZCBzaG9ydCBwcm9jX2xvYWQ7CiAJdW5zaWduZWQgbG9uZyBmcmFtZXNyZWFkOwogCXVuc2lnbmVkIGxvbmcgZnJhbWVzd3JpdHRlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYyBiL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYwppbmRleCBkZGEwY2E0Li4xNjRhNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGpfcGNtY2lhLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqX3BjbWNpYS5jCkBAIC02OSwyNSArNjksMjEgQEAKIAogc3RhdGljIHZvaWQgaXhqX2dldF9zZXJpYWwoc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBsaW5rLCBJWEogKiBqKQogewotCXR1cGxlX3QgdHVwbGU7Ci0JdV9zaG9ydCBidWZbMTI4XTsKIAljaGFyICpzdHI7Ci0JaW50IGxhc3RfcmV0LCBsYXN0X2ZuLCBpLCBwbGFjZTsKKwlpbnQgaSwgcGxhY2U7CiAJREVCVUcoMCwgIml4al9nZXRfc2VyaWFsKDB4JXApXG4iLCBsaW5rKTsKLQl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhTWF4ID0gODA7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCXN0ciA9IChjaGFyICopIGJ1ZjsKLQlwcmludGsoIlBDTUNJQSBWZXJzaW9uICVkLiVkXG4iLCBzdHJbMF0sIHN0clsxXSk7Ci0Jc3RyICs9IDI7CisKKwlzdHIgPSBsaW5rLT5wcm9kX2lkWzBdOworCWlmICghc3RyKQorCQlnb3RvIGNzX2ZhaWxlZDsKIAlwcmludGsoIiVzIiwgc3RyKTsKLQlzdHIgPSBzdHIgKyBzdHJsZW4oc3RyKSArIDE7CisJc3RyID0gbGluay0+cHJvZF9pZFsxXTsKKwlpZiAoIXN0cikKKwkJZ290byBjc19mYWlsZWQ7CiAJcHJpbnRrKCIgJXMiLCBzdHIpOwotCXN0ciA9IHN0ciArIHN0cmxlbihzdHIpICsgMTsKKwlzdHIgPSBsaW5rLT5wcm9kX2lkWzJdOworCWlmICghc3RyKQorCQlnb3RvIGNzX2ZhaWxlZDsKIAlwbGFjZSA9IDE7CiAJZm9yIChpID0gc3RybGVuKHN0cikgLSAxOyBpID49IDA7IGktLSkgewogCQlzd2l0Y2ggKHN0cltpXSkgewpAQCAtMTIyLDcgKzExOCw5IEBACiAJCX0KIAkJcGxhY2UgPSBwbGFjZSAqIDB4MTA7CiAJfQotCXN0ciA9IHN0ciArIHN0cmxlbihzdHIpICsgMTsKKwlzdHIgPSBsaW5rLT5wcm9kX2lkWzNdOworCWlmICghc3RyKQorCQlnb3RvIGNzX2ZhaWxlZDsKIAlwcmludGsoIiB2ZXJzaW9uICVzXG4iLCBzdHIpOwogICAgICAgY3NfZmFpbGVkOgogCXJldHVybjsKQEAgLTE0NiwxMyArMTQ0LDYgQEAKIAl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKIAl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAJdHVwbGUuVHVwbGVEYXRhTWF4ID0gMjU1OwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CiAJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAJdHVwbGUuQXR0cmlidXRlcyA9IDA7CiAJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9LY29uZmlnCmluZGV4IGY5YjE3MTkuLjk5ODBhNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvS2NvbmZpZwpAQCAtMjQsNyArMjQsNyBAQAogCWRlZmF1bHQgeSBpZiBBUkNIX1MzQzI0MTAKIAlkZWZhdWx0IHkgaWYgUFhBMjd4CiAJZGVmYXVsdCB5IGlmIEFSQ0hfRVA5M1hYCi0JZGVmYXVsdCB5IGlmIChBUkNIX0FUOTFSTTkyMDAgfHwgQVJDSF9BVDkxU0FNOTI2MSkKKwlkZWZhdWx0IHkgaWYgQVJDSF9BVDkxCiAJZGVmYXVsdCB5IGlmIEFSQ0hfUE5YNDAwOAogCSMgUFBDOgogCWRlZmF1bHQgeSBpZiBTVEIwM3h4eApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQppbmRleCA5N2Q1N2NmLi44MjViZjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQpAQCAtMzMsNyArMzMsNiBAQAogb2JqLSQoQ09ORklHX1VTQl9NT1VTRSkJCSs9IGlucHV0Lwogb2JqLSQoQ09ORklHX1VTQl9NVE9VQ0gpCSs9IGlucHV0Lwogb2JqLSQoQ09ORklHX1VTQl9QT1dFUk1BVEUpCSs9IGlucHV0Lwotb2JqLSQoQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUikrPSBpbnB1dC8KIG9iai0kKENPTkZJR19VU0JfV0FDT00pCQkrPSBpbnB1dC8KIG9iai0kKENPTkZJR19VU0JfWFBBRCkJCSs9IGlucHV0LwogCkBAIC02Niw2ICs2NSw3IEBACiBvYmotJChDT05GSUdfVVNCX1JJTzUwMCkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfU0lTVVNCVkdBKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9URVNUKQkJKz0gbWlzYy8KK29iai0kKENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IpKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfVVNTNzIwKQkrPSBtaXNjLwogCiBvYmotJChDT05GSUdfVVNCX0FUTSkJCSs9IGF0bS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwppbmRleCAzODkyYTllLi4zZGZhM2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKKysrIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIAljb25zdCBzdHJ1Y3QgY3hhY3J1X21vZGVtX3R5cGUgKm1vZGVtX3R5cGU7CiAKIAlpbnQgbGluZV9zdGF0dXM7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHBvbGxfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHBvbGxfd29yazsKIAogCS8qIGNvbnRvbCBoYW5kbGVzICovCiAJc3RydWN0IG11dGV4IGNtX3NlcmlhbGl6ZTsKQEAgLTM0Nyw3ICszNDcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjeGFjcnVfcG9sbF9zdGF0dXMoc3RydWN0IGN4YWNydV9kYXRhICppbnN0YW5jZSk7CitzdGF0aWMgdm9pZCBjeGFjcnVfcG9sbF9zdGF0dXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RhdGljIGludCBjeGFjcnVfYXRtX3N0YXJ0KHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtX2luc3RhbmNlLAogCQlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldikKQEAgLTM3NiwxMiArMzc2LDE0IEBACiAJfQogCiAJLyogU3RhcnQgc3RhdHVzIHBvbGxpbmcgKi8KLQljeGFjcnVfcG9sbF9zdGF0dXMoaW5zdGFuY2UpOworCWN4YWNydV9wb2xsX3N0YXR1cygmaW5zdGFuY2UtPnBvbGxfd29yay53b3JrKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY3hhY3J1X3BvbGxfc3RhdHVzKHN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UpCitzdGF0aWMgdm9pZCBjeGFjcnVfcG9sbF9zdGF0dXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGN4YWNydV9kYXRhLCBwb2xsX3dvcmsud29yayk7CiAJdTMyIGJ1ZltDWElORl9NQVhdID0ge307CiAJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0gPSBpbnN0YW5jZS0+dXNiYXRtOwogCXN0cnVjdCBhdG1fZGV2ICphdG1fZGV2ID0gdXNiYXRtLT5hdG1fZGV2OwpAQCAtNzIwLDcgKzcyMiw3IEBACiAKIAltdXRleF9pbml0KCZpbnN0YW5jZS0+Y21fc2VyaWFsaXplKTsKIAotCUlOSVRfV09SSygmaW5zdGFuY2UtPnBvbGxfd29yaywgKHZvaWQgKiljeGFjcnVfcG9sbF9zdGF0dXMsIGluc3RhbmNlKTsKKwlJTklUX0RFTEFZRURfV09SSygmaW5zdGFuY2UtPnBvbGxfd29yaywgY3hhY3J1X3BvbGxfc3RhdHVzKTsKIAogCXVzYmF0bV9pbnN0YW5jZS0+ZHJpdmVyX2RhdGEgPSBpbnN0YW5jZTsKIApAQCAtNzkzLDYgKzc5NSw5IEBACiAJeyAvKiBWID0gQ29uZXhhbnQJCQlQID0gQURTTCBtb2RlbQkJCQkqLwogCQlVU0JfREVWSUNFKDB4MDU3MiwgMHhjYjA2KSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAogCX0sCisJeyAvKiBWID0gQ29uZXhhbnQJCQlQID0gQURTTCBtb2RlbSAoWlRFIFpYRFNMIDg1MikJCSovCisJCVVTQl9ERVZJQ0UoMHgwNTcyLCAweGNiMDcpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYjAwCisJfSwKIAl7IC8qIFYgPSBPbGl0ZWMJCQkJUCA9IEFEU0wgbW9kZW0gdmVyc2lvbiAyCQkqLwogCQlVU0JfREVWSUNFKDB4MDhlMywgMHgwMTAwKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2FmZQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYyBiL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jCmluZGV4IDdjN2I1MDcuLjhlZDZjNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jCkBAIC01NSw3ICs1NSw2IEBACiAjZGVmaW5lIE9GRlNFVF9kCTkJCS8qIHNpemUgNCAqLwogI2RlZmluZSBPRkZTRVRfZQkxMwkJLyogc2l6ZSAxICovCiAjZGVmaW5lIE9GRlNFVF9mCTE0CQkvKiBzaXplIDEgKi8KLSNkZWZpbmUgVE9UQUwJCTE1CiAKICNkZWZpbmUgU0laRV83CQkxCiAjZGVmaW5lIFNJWkVfYgkJOApAQCAtNzksNiArNzgsMTggQEAKIHN0YXRpYyBpbnQgZW5hYmxlX2lzb2MgPSBERUZBVUxUX0VOQUJMRV9JU09DOwogc3RhdGljIGludCBzd19idWZmZXJpbmcgPSBERUZBVUxUX1NXX0JVRkZFUklORzsKIAorI2RlZmluZSBERUZBVUxUX0JfTUFYX0RTTAk4MTI4CisjZGVmaW5lIERFRkFVTFRfTU9ERU1fTU9ERQkxMQorI2RlZmluZSBNT0RFTV9PUFRJT05fTEVOR1RICTE2CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBERUZBVUxUX01PREVNX09QVElPTltNT0RFTV9PUFRJT05fTEVOR1RIXSA9IHsKKwkweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IEJNYXhEU0wgPSBERUZBVUxUX0JfTUFYX0RTTDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIE1vZGVtTW9kZSA9IERFRkFVTFRfTU9ERU1fTU9ERTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIE1vZGVtT3B0aW9uW01PREVNX09QVElPTl9MRU5HVEhdOworc3RhdGljIGludCBudW1fTW9kZW1PcHRpb247CisKIG1vZHVsZV9wYXJhbShhbHRzZXR0aW5nLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGFsdHNldHRpbmcsCiAJCSJBbHRlcm5hdGl2ZSBzZXR0aW5nIGZvciBkYXRhIGludGVyZmFjZSAoYnVsa19kZWZhdWx0OiAiCkBAIC0xMDAsNiArMTExLDE3IEBACiAJCSAiRW5hYmxlIHNvZnR3YXJlIGJ1ZmZlcmluZyAoZGVmYXVsdDogIgogCQkgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfU1dfQlVGRkVSSU5HKSAiKSIpOwogCittb2R1bGVfcGFyYW0oQk1heERTTCwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhCTWF4RFNMLAorCQkiZGVmYXVsdDogIiBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9CX01BWF9EU0wpKTsKKworbW9kdWxlX3BhcmFtKE1vZGVtTW9kZSwgYnl0ZSwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhNb2RlbU1vZGUsCisJCSJkZWZhdWx0OiAiIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX01PREVNX01PREUpKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KE1vZGVtT3B0aW9uLCBieXRlLCAmbnVtX01vZGVtT3B0aW9uLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoTW9kZW1PcHRpb24sICJkZWZhdWx0OiAweDEwLDB4MDAsMHgwMCwweDAwLDB4MjAiKTsKKwogI2RlZmluZSBJTlRFUkZBQ0VfREFUQQkJMQogI2RlZmluZSBFTkRQT0lOVF9JTlQJCTB4ODEKICNkZWZpbmUgRU5EUE9JTlRfQlVMS19EQVRBCTB4MDcKQEAgLTEwOCwxMiArMTMwLDE5IEBACiAKICNkZWZpbmUgaGV4MmludChjKSAoIChjID49ICcwJykgJiYgKGMgPD0gJzknKSA/IChjIC0gJzAnKSA6ICgoYyAmIDB4ZikgKyA5KSApCiAKK3N0cnVjdCBzcGVlZHRjaF9wYXJhbXMgeworCXVuc2lnbmVkIGludCBhbHRzZXR0aW5nOworCXVuc2lnbmVkIGludCBCTWF4RFNMOworCXVuc2lnbmVkIGNoYXIgTW9kZW1Nb2RlOworCXVuc2lnbmVkIGNoYXIgTW9kZW1PcHRpb25bTU9ERU1fT1BUSU9OX0xFTkdUSF07Cit9OworCiBzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSB7CiAJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG07CiAKLQl1bnNpZ25lZCBpbnQgYWx0c2V0dGluZzsKKwlzdHJ1Y3Qgc3BlZWR0Y2hfcGFyYW1zIHBhcmFtczsgLyogc2V0IGluIHByb2JlLCBjb25zdGFudCBhZnRlcndhcmRzICovCiAKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhdHVzX2NoZWNrZXI7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzdGF0dXNfY2hlY2tlcjsKIAogCXVuc2lnbmVkIGNoYXIgbGFzdF9zdGF0dXM7CiAKQEAgLTEyMyw3ICsxNTIsNyBAQAogCXN0cnVjdCB1cmIgKmludF91cmI7CiAJdW5zaWduZWQgY2hhciBpbnRfZGF0YVsxNl07CiAKLQl1bnNpZ25lZCBjaGFyIHNjcmF0Y2hfYnVmZmVyW1RPVEFMXTsKKwl1bnNpZ25lZCBjaGFyIHNjcmF0Y2hfYnVmZmVyWzE2XTsKIH07CiAKIC8qKioqKioqKioqKioqKioKQEAgLTE4Niw2ICsyMTUsMzQgQEAKIAkJCSAgICAgIDB4MDEsIDB4NDAsIDB4MDQsIDB4MDAsIGJ1ZiwgMywgQ1RSTF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKIAkJdXNiX3dhcm4odXNiYXRtLCAiJXMgZmFpbGVkIG9uIFVSQjE1MDogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJLyogRXh0cmEgaW5pdGlhbGlzYXRpb24gaW4gcmVjZW50IGRyaXZlcnMgLSBnaXZlcyBoaWdoZXIgc3BlZWRzICovCisKKwkvKiBVUkJleHQxICovCisJYnVmWzBdID0gaW5zdGFuY2UtPnBhcmFtcy5Nb2RlbU1vZGU7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MDEsIDB4NDAsIDB4MTEsIDB4MDAsIGJ1ZiwgMSwgQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkKKwkJdXNiX3dhcm4odXNiYXRtLCAiJXMgZmFpbGVkIG9uIFVSQmV4dDE6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCS8qIFVSQmV4dDIgKi8KKwkvKiBUaGlzIHNlZW1zIHRvIGJlIHRoZSBvbmUgd2hpY2ggYWN0dWFsbHkgdHJpZ2dlcnMgdGhlIGhpZ2hlciBzeW5jCisJICAgcmF0ZSAtLSBpdCBkb2VzIHJlcXVpcmUgdGhlIG5ldyBmaXJtd2FyZSB0b28sIGFsdGhvdWdoIGl0IHdvcmtzIE9LCisJICAgd2l0aCBvbGRlciBmaXJtd2FyZSAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDAxLCAweDQwLCAweDE0LCAweDAwLAorCQkJICAgICAgaW5zdGFuY2UtPnBhcmFtcy5Nb2RlbU9wdGlvbiwKKwkJCSAgICAgIE1PREVNX09QVElPTl9MRU5HVEgsIENUUkxfVElNRU9VVCk7CisJaWYgKHJldCA8IDApCisJCXVzYl93YXJuKHVzYmF0bSwgIiVzIGZhaWxlZCBvbiBVUkJleHQyOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwkvKiBVUkJleHQzICovCisJYnVmWzBdID0gaW5zdGFuY2UtPnBhcmFtcy5CTWF4RFNMICYgMHhmZjsKKwlidWZbMV0gPSBpbnN0YW5jZS0+cGFyYW1zLkJNYXhEU0wgPj4gODsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3NuZGN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgwMSwgMHg0MCwgMHgxMiwgMHgwMCwgYnVmLCAyLCBDVFJMX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKQorCQl1c2Jfd2Fybih1c2JhdG0sICIlcyBmYWlsZWQgb24gVVJCZXh0MzogJWRcbiIsIF9fZnVuY19fLCByZXQpOwogfQogCiBzdGF0aWMgaW50IHNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZShzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsCkBAIC0yODUsOCArMzQyLDggQEAKIAkgICBiZWNhdXNlIHdlJ3JlIGluIG91ciBvd24ga2VybmVsIHRocmVhZCBhbnl3YXkuICovCiAJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CiAKLQlpZiAoKHJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYl9kZXYsIElOVEVSRkFDRV9EQVRBLCBpbnN0YW5jZS0+YWx0c2V0dGluZykpIDwgMCkgewotCQl1c2JfZXJyKHVzYmF0bSwgIiVzOiBzZXR0aW5nIGludGVyZmFjZSB0byAlZCBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCBpbnN0YW5jZS0+YWx0c2V0dGluZywgcmV0KTsKKwlpZiAoKHJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYl9kZXYsIElOVEVSRkFDRV9EQVRBLCBpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcpKSA8IDApIHsKKwkJdXNiX2Vycih1c2JhdG0sICIlczogc2V0dGluZyBpbnRlcmZhY2UgdG8gJWQgZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nLCByZXQpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIApAQCAtMzcyLDcgKzQyOSw3IEBACiAJdW5zaWduZWQgY2hhciAqYnVmID0gaW5zdGFuY2UtPnNjcmF0Y2hfYnVmZmVyOwogCWludCByZXQ7CiAKLQltZW1zZXQoYnVmLCAwLCBUT1RBTCk7CisJbWVtc2V0KGJ1ZiwgMCwgMTYpOwogCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2JfZGV2LCAwKSwKIAkJCSAgICAgIDB4MTIsIDB4YzAsIDB4MDcsIDB4MDAsIGJ1ZiArIE9GRlNFVF83LCBTSVpFXzcsCkBAIC00NDEsOCArNDk4LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgc3BlZWR0Y2hfY2hlY2tfc3RhdHVzKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSkKK3N0YXRpYyB2b2lkIHNwZWVkdGNoX2NoZWNrX3N0YXR1cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhLAorCQkJICAgICBzdGF0dXNfY2hlY2tlci53b3JrKTsKIAlzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSA9IGluc3RhbmNlLT51c2JhdG07CiAJc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYgPSB1c2JhdG0tPmF0bV9kZXY7CiAJdW5zaWduZWQgY2hhciAqYnVmID0gaW5zdGFuY2UtPnNjcmF0Y2hfYnVmZmVyOwpAQCAtNTE5LDcgKzU3OSw3IEBACiB7CiAJc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gKHZvaWQgKilkYXRhOwogCi0Jc2NoZWR1bGVfd29yaygmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5zdGF0dXNfY2hlY2tlciwgMCk7CiAKIAkvKiBUaGUgZm9sbG93aW5nIGNoZWNrIGlzIHJhY3ksIGJ1dCB0aGUgcmFjZSBpcyBoYXJtbGVzcyAqLwogCWlmIChpbnN0YW5jZS0+cG9sbF9kZWxheSA8IE1BWF9QT0xMX0RFTEFZKQpAQCAtNTM5LDcgKzU5OSw3IEBACiAJaWYgKGludF91cmIpIHsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIoaW50X3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmICghcmV0KQotCQkJc2NoZWR1bGVfd29yaygmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyKTsKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLCAwKTsKIAkJZWxzZSB7CiAJCQlhdG1fZGJnKGluc3RhbmNlLT51c2JhdG0sICIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJCW1vZF90aW1lcigmaW5zdGFuY2UtPnJlc3VibWl0X3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhSRVNVQk1JVF9ERUxBWSkpOwpAQCAtNTgzLDcgKzY0Myw3IEBACiAKIAlpZiAoKGludF91cmIgPSBpbnN0YW5jZS0+aW50X3VyYikpIHsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIoaW50X3VyYiwgR0ZQX0FUT01JQyk7Ci0JCXNjaGVkdWxlX3dvcmsoJmluc3RhbmNlLT5zdGF0dXNfY2hlY2tlcik7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLCAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWF0bV9kYmcodXNiYXRtLCAiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAJCQlnb3RvIGZhaWw7CkBAIC03NDYsMTcgKzgwNiwyMSBAQAogCiAJaW5zdGFuY2UtPnVzYmF0bSA9IHVzYmF0bTsKIAotCS8qIGFsdHNldHRpbmcgYW5kIGVuYWJsZV9pc29jIG1heSBjaGFuZ2UgYXQgYW55IG1vbWVudCwgc28gdGFrZSBhIHNuYXBzaG90ICovCi0JaW5zdGFuY2UtPmFsdHNldHRpbmcgPSBhbHRzZXR0aW5nOworCS8qIG1vZHVsZSBwYXJhbWV0ZXJzIG1heSBjaGFuZ2UgYXQgYW55IG1vbWVudCwgc28gdGFrZSBhIHNuYXBzaG90ICovCisJaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nID0gYWx0c2V0dGluZzsKKwlpbnN0YW5jZS0+cGFyYW1zLkJNYXhEU0wgPSBCTWF4RFNMOworCWluc3RhbmNlLT5wYXJhbXMuTW9kZW1Nb2RlID0gTW9kZW1Nb2RlOworCW1lbWNweShpbnN0YW5jZS0+cGFyYW1zLk1vZGVtT3B0aW9uLCBERUZBVUxUX01PREVNX09QVElPTiwgTU9ERU1fT1BUSU9OX0xFTkdUSCk7CisJbWVtY3B5KGluc3RhbmNlLT5wYXJhbXMuTW9kZW1PcHRpb24sIE1vZGVtT3B0aW9uLCBudW1fTW9kZW1PcHRpb24pOwogCXVzZV9pc29jID0gZW5hYmxlX2lzb2M7CiAKLQlpZiAoaW5zdGFuY2UtPmFsdHNldHRpbmcpCi0JCWlmICgocmV0ID0gdXNiX3NldF9pbnRlcmZhY2UodXNiX2RldiwgSU5URVJGQUNFX0RBVEEsIGluc3RhbmNlLT5hbHRzZXR0aW5nKSkgPCAwKSB7Ci0JCQl1c2JfZXJyKHVzYmF0bSwgIiVzOiBzZXR0aW5nIGludGVyZmFjZSB0byAlMmQgZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgaW5zdGFuY2UtPmFsdHNldHRpbmcsIHJldCk7Ci0JCQlpbnN0YW5jZS0+YWx0c2V0dGluZyA9IDA7IC8qIGZhbGwgYmFjayB0byBkZWZhdWx0ICovCisJaWYgKGluc3RhbmNlLT5wYXJhbXMuYWx0c2V0dGluZykKKwkJaWYgKChyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JfZGV2LCBJTlRFUkZBQ0VfREFUQSwgaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nKSkgPCAwKSB7CisJCQl1c2JfZXJyKHVzYmF0bSwgIiVzOiBzZXR0aW5nIGludGVyZmFjZSB0byAlMmQgZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nLCByZXQpOworCQkJaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nID0gMDsgLyogZmFsbCBiYWNrIHRvIGRlZmF1bHQgKi8KIAkJfQogCi0JaWYgKCFpbnN0YW5jZS0+YWx0c2V0dGluZyAmJiB1c2VfaXNvYykKKwlpZiAoIWluc3RhbmNlLT5wYXJhbXMuYWx0c2V0dGluZyAmJiB1c2VfaXNvYykKIAkJaWYgKChyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JfZGV2LCBJTlRFUkZBQ0VfREFUQSwgREVGQVVMVF9JU09DX0FMVFNFVFRJTkcpKSA8IDApIHsKIAkJCXVzYl9kYmcodXNiYXRtLCAiJXM6IHNldHRpbmcgaW50ZXJmYWNlIHRvICUyZCBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCBERUZBVUxUX0lTT0NfQUxUU0VUVElORywgcmV0KTsKIAkJCXVzZV9pc29jID0gMDsgLyogZmFsbCBiYWNrIHRvIGJ1bGsgKi8KQEAgLTc3Myw4ICs4MzcsOCBAQAogCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludF9kZXNjID0gJmRlc2MtPmVuZHBvaW50W2ldLmRlc2M7CiAKIAkJCWlmICgoZW5kcG9pbnRfZGVzYy0+YkVuZHBvaW50QWRkcmVzcyA9PSB0YXJnZXRfYWRkcmVzcykpIHsKLQkJCQl1c2VfaXNvYyA9IChlbmRwb2ludF9kZXNjLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KLQkJCQkJVVNCX0VORFBPSU5UX1hGRVJfSVNPQzsKKwkJCQl1c2VfaXNvYyA9CisJCQkJCXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnRfZGVzYyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTc4MywxOCArODQ3LDE4IEBACiAJCQl1c2JfaW5mbyh1c2JhdG0sICJpc29jaHJvbm91cyB0cmFuc2ZlciBub3Qgc3VwcG9ydGVkIC0gdXNpbmcgYnVsa1xuIik7CiAJfQogCi0JaWYgKCF1c2VfaXNvYyAmJiAhaW5zdGFuY2UtPmFsdHNldHRpbmcpCisJaWYgKCF1c2VfaXNvYyAmJiAhaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nKQogCQlpZiAoKHJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYl9kZXYsIElOVEVSRkFDRV9EQVRBLCBERUZBVUxUX0JVTEtfQUxUU0VUVElORykpIDwgMCkgewogCQkJdXNiX2Vycih1c2JhdG0sICIlczogc2V0dGluZyBpbnRlcmZhY2UgdG8gJTJkIGZhaWxlZCAoJWQpIVxuIiwgX19mdW5jX18sIERFRkFVTFRfQlVMS19BTFRTRVRUSU5HLCByZXQpOwogCQkJZ290byBmYWlsX2ZyZWU7CiAJCX0KIAotCWlmICghaW5zdGFuY2UtPmFsdHNldHRpbmcpCi0JCWluc3RhbmNlLT5hbHRzZXR0aW5nID0gdXNlX2lzb2MgPyBERUZBVUxUX0lTT0NfQUxUU0VUVElORyA6IERFRkFVTFRfQlVMS19BTFRTRVRUSU5HOworCWlmICghaW5zdGFuY2UtPnBhcmFtcy5hbHRzZXR0aW5nKQorCQlpbnN0YW5jZS0+cGFyYW1zLmFsdHNldHRpbmcgPSB1c2VfaXNvYyA/IERFRkFVTFRfSVNPQ19BTFRTRVRUSU5HIDogREVGQVVMVF9CVUxLX0FMVFNFVFRJTkc7CiAKIAl1c2JhdG0tPmZsYWdzIHw9ICh1c2VfaXNvYyA/IFVEU0xfVVNFX0lTT0MgOiAwKTsKIAotCUlOSVRfV09SSygmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLCAodm9pZCAqKXNwZWVkdGNoX2NoZWNrX3N0YXR1cywgaW5zdGFuY2UpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIsIHNwZWVkdGNoX2NoZWNrX3N0YXR1cyk7CiAKIAlpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIudGltZXIuZnVuY3Rpb24gPSBzcGVlZHRjaF9zdGF0dXNfcG9sbDsKIAlpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIudGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluc3RhbmNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKaW5kZXggZjU0MzRiMS4uZGFlNGVmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYworKysgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCkBAIC02NCwxMSArNjQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorCiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSAidXNiYXRtLmgiCiAKLSNkZWZpbmUgRUFHTEVVU0JWRVJTSU9OICJ1ZWFnbGUgMS4zIgorI2RlZmluZSBFQUdMRVVTQlZFUlNJT04gInVlYWdsZSAxLjQiCiAKIAogLyoKQEAgLTgwLDE0ICs4MiwxNCBAQAogCQkJZGV2X2RiZygmKHVzYl9kZXYpLT5kZXYsIFwKIAkJCQkiW3VlYWdsZS1hdG0gZGJnXSAlczogIiBmb3JtYXQsIFwKIAkJCQkJX19GVU5DVElPTl9fLCAjI2FyZ3MpOyBcCi0gICAgICAgfSB3aGlsZSAoMCkKKwl9IHdoaWxlICgwKQogCiAjZGVmaW5lIHVlYV92ZGJnKHVzYl9kZXYsIGZvcm1hdCwgYXJncy4uLikJXAogCWRvIHsgXAogCQlpZiAoZGVidWcgPj0gMikgXAogCQkJZGV2X2RiZygmKHVzYl9kZXYpLT5kZXYsIFwKIAkJCQkiW3VlYWdsZS1hdG0gdmRiZ10gICIgZm9ybWF0LCAjI2FyZ3MpOyBcCi0gICAgICAgfSB3aGlsZSAoMCkKKwl9IHdoaWxlICgwKQogCiAjZGVmaW5lIHVlYV9lbnRlcnModXNiX2RldikgXAogCXVlYV92ZGJnKHVzYl9kZXYsICJlbnRlcmluZyAlc1xuIiwgX19GVU5DVElPTl9fKQpAQCAtMjE4LDggKzIyMCw4IEBACiAjZGVmaW5lIFVFQV9DSElQX1ZFUlNJT04oeCkgXAogCSgoeCktPmRyaXZlcl9pbmZvICYgMHhmKQogCi0jZGVmaW5lIElTX0lTRE4oc2MpIFwKLQkobGUxNl90b19jcHUoc2MtPnVzYl9kZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSAmIDB4ODApCisjZGVmaW5lIElTX0lTRE4odXNiX2RldikgXAorCShsZTE2X3RvX2NwdSgodXNiX2RldiktPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSAmIDB4ODApCiAKICNkZWZpbmUgSU5TX1RPX1VTQkRFVihpbnMpIGlucy0+dXNiX2RldgogCkBAIC00MDEsOSArNDAzLDggQEAKIAlpbnQgcmV0ID0gLUVOT01FTTsKIAl1OCAqeGZlcl9idWZmOwogCi0JeGZlcl9idWZmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwl4ZmVyX2J1ZmYgPSBrbWVtZHVwKGJ1ZmYsIHNpemUsIEdGUF9LRVJORUwpOwogCWlmICh4ZmVyX2J1ZmYpIHsKLQkJbWVtY3B5KHhmZXJfYnVmZiwgYnVmZiwgc2l6ZSk7CiAJCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2IsCiAJCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKHVzYiwgMCksCiAJCQkJICAgICAgTE9BRF9JTlRFUk5BTCwKQEAgLTU5NSwxNCArNTk2LDEyIEBACiAJdTggKnhmZXJfYnVmZjsKIAlpbnQgYnl0ZXNfcmVhZDsKIAotCXhmZXJfYnVmZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJeGZlcl9idWZmID0ga21lbWR1cChkYXRhLCBzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXhmZXJfYnVmZikgewogCQl1ZWFfZXJyKElOU19UT19VU0JERVYoc2MpLCAiY2FuJ3QgYWxsb2NhdGUgeGZlcl9idWZmXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQltZW1jcHkoeGZlcl9idWZmLCBkYXRhLCBzaXplKTsKLQogCXJldCA9IHVzYl9idWxrX21zZyhzYy0+dXNiX2RldiwKIAkJCSB1c2Jfc25kYnVsa3BpcGUoc2MtPnVzYl9kZXYsIFVFQV9JRE1BX1BJUEUpLAogCQkJIHhmZXJfYnVmZiwgc2l6ZSwgJmJ5dGVzX3JlYWQsIEJVTEtfVElNRU9VVCk7CkBAIC02MjUsMTIgKzYyNCwxMiBAQAogCWNoYXIgKmRzcF9uYW1lOwogCiAJaWYgKFVFQV9DSElQX1ZFUlNJT04oc2MpID09IEFESTkzMCkgewotCQlpZiAoSVNfSVNETihzYykpCisJCWlmIChJU19JU0ROKHNjLT51c2JfZGV2KSkKIAkJCWRzcF9uYW1lID0gRldfRElSICJEU1A5aS5iaW4iOwogCQllbHNlCiAJCQlkc3BfbmFtZSA9IEZXX0RJUiAiRFNQOXAuYmluIjsKIAl9IGVsc2UgewotCQlpZiAoSVNfSVNETihzYykpCisJCWlmIChJU19JU0ROKHNjLT51c2JfZGV2KSkKIAkJCWRzcF9uYW1lID0gRldfRElSICJEU1BlaS5iaW4iOwogCQllbHNlCiAJCQlkc3BfbmFtZSA9IEZXX0RJUiAiRFNQZXAuYmluIjsKQEAgLTY1OCw5ICs2NTcsOSBAQAogLyoKICAqIFRoZSB1ZWFfbG9hZF9wYWdlKCkgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aGluIGEgcHJvY2VzcyBjb250ZXh0CiAgKi8KLXN0YXRpYyB2b2lkIHVlYV9sb2FkX3BhZ2Uodm9pZCAqeHNjKQorc3RhdGljIHZvaWQgdWVhX2xvYWRfcGFnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHVlYV9zb2Z0YyAqc2MgPSB4c2M7CisJc3RydWN0IHVlYV9zb2Z0YyAqc2MgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVlYV9zb2Z0YywgdGFzayk7CiAJdTE2IHBhZ2VubyA9IHNjLT5wYWdlbm87CiAJdTE2IG92bCA9IHNjLT5vdmw7CiAJc3RydWN0IGJsb2NrX2luZm8gYmk7CkBAIC03NDQsNyArNzQzLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgd2FpdF9jbXZfYWNrKHN0cnVjdCB1ZWFfc29mdGMgKnNjKQogewotCWludCByZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoc2MtPmNtdl9hY2tfd2FpdCwKKwlpbnQgcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc2MtPmNtdl9hY2tfd2FpdCwKIAkJCQkJCSAgIHNjLT5jbXZfYWNrLCBBQ0tfVElNRU9VVCk7CiAJc2MtPmNtdl9hY2sgPSAwOwogCkBAIC03NjUsMTIgKzc2NCwxMSBAQAogCXU4ICp4ZmVyX2J1ZmY7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKLQl4ZmVyX2J1ZmYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCXhmZXJfYnVmZiA9IGttZW1kdXAoZGF0YSwgc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF4ZmVyX2J1ZmYpIHsKIAkJdWVhX2VycihJTlNfVE9fVVNCREVWKHNjKSwgImNhbid0IGFsbG9jYXRlIHhmZXJfYnVmZlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQotCW1lbWNweSh4ZmVyX2J1ZmYsIGRhdGEsIHNpemUpOwogCiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHNjLT51c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUoc2MtPnVzYl9kZXYsIDApLAogCQkJICAgICAgVUNEQ19TRU5EX0VOQ0FQU1VMQVRFRF9DT01NQU5ELApAQCAtODg1LDcgKzg4Myw4IEBACiAJCWJyZWFrOwogCiAJY2FzZSAzOgkJLyogZmFpbCAuLi4gKi8KLQkJdWVhX2luZm8oSU5TX1RPX1VTQkRFVihzYyksICJtb2RlbSBzeW5jaHJvbml6YXRpb24gZmFpbGVkXG4iKTsKKwkJdWVhX2luZm8oSU5TX1RPX1VTQkRFVihzYyksICJtb2RlbSBzeW5jaHJvbml6YXRpb24gZmFpbGVkIgorCQkJCSIgKG1heSBiZSB0cnkgb3RoZXIgY212L2RzcClcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAogCWNhc2UgNCAuLi4gNjoJLyogdGVzdCBzdGF0ZSAqLwpAQCAtOTEzLDEyICs5MTIsNiBAQAogCQkJcmVsZWFzZV9maXJtd2FyZShzYy0+ZHNwX2Zpcm0pOwogCQkJc2MtPmRzcF9maXJtID0gTlVMTDsKIAkJfQotCi0JCXJldCA9IHVlYV9yZWFkX2NtdihzYywgU0FfSU5GTywgMTAsICZzYy0+c3RhdHMucGh5LmZpcm1pZCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJdWVhX2luZm8oSU5TX1RPX1VTQkRFVihzYyksICJBVFUtUiBmaXJtd2FyZSB2ZXJzaW9uIDogJXhcbiIsCi0JCQkJc2MtPnN0YXRzLnBoeS5maXJtaWQpOwogCX0KIAogCS8qIGFsd2F5cyB1cGRhdGUgaXQgYXMgYXRtIGxheWVyIGNvdWxkIG5vdCBiZSBpbml0IHdoZW4gd2Ugc3dpdGNoIHRvCkBAIC0xMDMzLDkgKzEwMjYsOSBAQAogCiAJaWYgKGNtdl9maWxlW3NjLT5tb2RlbV9pbmRleF0gPT0gTlVMTCkgewogCQlpZiAoVUVBX0NISVBfVkVSU0lPTihzYykgPT0gQURJOTMwKQotCQkJZmlsZSA9IChJU19JU0ROKHNjKSkgPyAiQ01WOWkuYmluIiA6ICJDTVY5cC5iaW4iOworCQkJZmlsZSA9IChJU19JU0ROKHNjLT51c2JfZGV2KSkgPyAiQ01WOWkuYmluIiA6ICJDTVY5cC5iaW4iOwogCQllbHNlCi0JCQlmaWxlID0gKElTX0lTRE4oc2MpKSA/ICJDTVZlaS5iaW4iIDogIkNNVmVwLmJpbiI7CisJCQlmaWxlID0gKElTX0lTRE4oc2MtPnVzYl9kZXYpKSA/ICJDTVZlaS5iaW4iIDogIkNNVmVwLmJpbiI7CiAJfSBlbHNlCiAJCWZpbGUgPSBjbXZfZmlsZVtzYy0+bW9kZW1faW5kZXhdOwogCkBAIC0xMTMxLDYgKzExMjQsMTMgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIER1bXAgZmlybXdhcmUgdmVyc2lvbiAqLworCXJldCA9IHVlYV9yZWFkX2NtdihzYywgU0FfSU5GTywgMTAsICZzYy0+c3RhdHMucGh5LmZpcm1pZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJdWVhX2luZm8oSU5TX1RPX1VTQkRFVihzYyksICJBVFUtUiBmaXJtd2FyZSB2ZXJzaW9uIDogJXhcbiIsCisJCQlzYy0+c3RhdHMucGh5LmZpcm1pZCk7CisKIAkvKiBnZXQgb3B0aW9ucyAqLwogIAlyZXQgPSBsZW4gPSByZXF1ZXN0X2NtdnMoc2MsICZjbXZzLCAmY212c19mdyk7CiAJaWYgKHJldCA8IDApCkBAIC0xMTQ3LDYgKzExNDcsOCBAQAogCS8qIEVudGVyIGluIFItQUNULVJFUSAqLwogCXJldCA9IHVlYV93cml0ZV9jbXYoc2MsIFNBX0NOVEwsIDAsIDIpOwogCXVlYV92ZGJnKElOU19UT19VU0JERVYoc2MpLCAiRW50ZXJpbmcgaW4gUi1BQ1QtUkVRIHN0YXRlXG4iKTsKKwl1ZWFfaW5mbyhJTlNfVE9fVVNCREVWKHNjKSwgIk1vZGVtIHN0YXJ0ZWQsICIKKwkJIndhaXRpbmcgc3luY2hyb25pemF0aW9uXG4iKTsKIG91dDoKIAlyZWxlYXNlX2Zpcm13YXJlKGNtdnNfZncpOwogCXNjLT5yZXNldCA9IDA7CkBAIC0xMTcyLDcgKzExNzQsMTAgQEAKIAkJaWYgKCFyZXQpCiAJCQlyZXQgPSB1ZWFfc3RhdChzYyk7CiAJCWlmIChyZXQgIT0gLUVBR0FJTikKLQkJCW1zbGVlcCgxMDAwKTsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOworIAkJaWYgKHRyeV90b19mcmVlemUoKSkKKwkJCXVlYV9lcnIoSU5TX1RPX1VTQkRFVihzYyksICJzdXNwZW5kL3Jlc3VtZSBub3Qgc3VwcG9ydGVkLCAiCisJCQkJInBsZWFzZSB1bnBsdWcvcmVwbHVnIHlvdXIgbW9kZW1cbiIpOwogCX0KIAl1ZWFfbGVhdmVzKElOU19UT19VU0JERVYoc2MpKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTM0NSw3ICsxMzUwLDcgQEAKIAogCXVlYV9lbnRlcnMoSU5TX1RPX1VTQkRFVihzYykpOwogCi0JSU5JVF9XT1JLKCZzYy0+dGFzaywgdWVhX2xvYWRfcGFnZSwgc2MpOworCUlOSVRfV09SSygmc2MtPnRhc2ssIHVlYV9sb2FkX3BhZ2UpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNjLT5zeW5jX3EpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNjLT5jbXZfYWNrX3dhaXQpOwogCkBAIC0xNTY2LDYgKzE1NzEsNyBAQAogVUVBX0FUVFIoZHNjb3JyLCAwKTsKIFVFQV9BVFRSKHVzdW5jLCAwKTsKIFVFQV9BVFRSKGRzdW5jLCAwKTsKK1VFQV9BVFRSKGZpcm1pZCwgMCk7CiAKIC8qIFJldHJpZXZlIHRoZSBkZXZpY2UgRW5kIFN5c3RlbSBJZGVudGlmaWVyIChNQUMpICovCiAKQEAgLTE1OTcsNyArMTYwMyw3IEBACiB7CiAJc3RydWN0IHVlYV9zb2Z0YyAqc2MgPSB1c2JhdG0tPmRyaXZlcl9kYXRhOwogCi0Jd2FpdF9ldmVudChzYy0+c3luY19xLCBJU19PUEVSQVRJT05BTChzYykpOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzYy0+c3luY19xLCBJU19PUEVSQVRJT05BTChzYykpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTE2MzksMTYgKzE2NDUsMTMgQEAKIAkmZGV2X2F0dHJfc3RhdF9kc2NvcnIuYXR0ciwKIAkmZGV2X2F0dHJfc3RhdF91c3VuYy5hdHRyLAogCSZkZXZfYXR0cl9zdGF0X2RzdW5jLmF0dHIsCisJJmRldl9hdHRyX3N0YXRfZmlybWlkLmF0dHIsCisJTlVMTCwKIH07CiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dycCA9IHsKIAkuYXR0cnMgPSBhdHRycywKIH07CiAKLXN0YXRpYyBpbnQgY3JlYXRlX2ZzX2VudHJpZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZhdHRyX2dycCk7Ci19Ci0KIHN0YXRpYyBpbnQgdWVhX2JpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0sIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQkgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xNzA4LDMxICsxNzExLDI1IEBACiAJCX0KIAl9CiAKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmYXR0cl9ncnApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCiAJcmV0ID0gdWVhX2Jvb3Qoc2MpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWtmcmVlKHNjKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CiAKLQlyZXQgPSBjcmVhdGVfZnNfZW50cmllcyhpbnRmKTsKLQlpZiAocmV0KSB7Ci0JCXVlYV9zdG9wKHNjKTsKLQkJa2ZyZWUoc2MpOwotCQlyZXR1cm4gcmV0OwotCX0KIAlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZGVzdHJveV9mc19lbnRyaWVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZhdHRyX2dycCk7CitlcnJvcjoKKwlrZnJlZShzYyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgdWVhX3VuYmluZChzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVlYV9zb2Z0YyAqc2MgPSB1c2JhdG0tPmRyaXZlcl9kYXRhOwogCi0JZGVzdHJveV9mc19lbnRyaWVzKGludGYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZhdHRyX2dycCk7CiAJdWVhX3N0b3Aoc2MpOwogCWtmcmVlKHNjKTsKIH0KQEAgLTE3NTMsMTAgKzE3NTAsMTAgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAogCXVlYV9lbnRlcnModXNiKTsKLQl1ZWFfaW5mbyh1c2IsICJBRFNMIGRldmljZSBmb3VuZGVkIHZpZCAoJSNYKSBwaWQgKCUjWCkgOiAlc1xuIiwKKwl1ZWFfaW5mbyh1c2IsICJBRFNMIGRldmljZSBmb3VuZGVkIHZpZCAoJSNYKSBwaWQgKCUjWCkgOiAlcyAlc1xuIiwKIAkgICAgICAgbGUxNl90b19jcHUodXNiLT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKIAkgICAgICAgbGUxNl90b19jcHUodXNiLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCi0JICAgICAgIGNoaXBfbmFtZVtVRUFfQ0hJUF9WRVJTSU9OKGlkKV0pOworCSAgICAgICBjaGlwX25hbWVbVUVBX0NISVBfVkVSU0lPTihpZCldLCBJU19JU0ROKHVzYik/ImlzZG4iOiJwb3RzIik7CiAKIAl1c2JfcmVzZXRfZGV2aWNlKHVzYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwppbmRleCAzMDkwNzNmLi5lYzYzYjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC0xMDAxLDYgKzEwMDEsNyBAQAogCiAJZGFlbW9uaXplKGluc3RhbmNlLT5kcml2ZXItPmRyaXZlcl9uYW1lKTsKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisJaW5zdGFuY2UtPnRocmVhZF9waWQgPSBjdXJyZW50LT5waWQ7CiAKIAljb21wbGV0ZSgmaW5zdGFuY2UtPnRocmVhZF9zdGFydGVkKTsKIApAQCAtMTAyNSwxMCArMTAyNiw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7Ci0JaW5zdGFuY2UtPnRocmVhZF9waWQgPSByZXQ7Ci0JbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKLQogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmluc3RhbmNlLT50aHJlYWRfc3RhcnRlZCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCBlYzRkMWQ3Li45ODE5OTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0zMjUsNyArMzI1LDcgQEAKIAlzdHJ1Y3QgYWNtX3JiICpidWY7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGFjbS0+dHR5OwogCXN0cnVjdCBhY21fcnUgKnJjdjsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaSA9IDA7CiAJZGJnKCJFbnRlcmluZyBhY21fcnhfdGFza2xldCIpOwogCkBAIC0zMzMsMTUgKzMzMywxNSBAQAogCQlyZXR1cm47CiAKIG5leHRfYnVmZmVyOgotCXNwaW5fbG9jaygmYWNtLT5yZWFkX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPnJlYWRfbG9jaywgZmxhZ3MpOwogCWlmIChsaXN0X2VtcHR5KCZhY20tPmZpbGxlZF9yZWFkX2J1ZnMpKSB7Ci0JCXNwaW5fdW5sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAJCWdvdG8gdXJiczsKIAl9CiAJYnVmID0gbGlzdF9lbnRyeShhY20tPmZpbGxlZF9yZWFkX2J1ZnMubmV4dCwKIAkJCSBzdHJ1Y3QgYWNtX3JiLCBsaXN0KTsKIAlsaXN0X2RlbCgmYnVmLT5saXN0KTsKLQlzcGluX3VubG9jaygmYWNtLT5yZWFkX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAKIAlkYmcoImFjbV9yeF90YXNrbGV0OiBwcm9jZXNpbmcgYnVmIDB4JXAsIHNpemUgPSAlZCIsIGJ1ZiwgYnVmLT5zaXplKTsKIApAQCAtMzU2LDI5ICszNTYsMjkgQEAKIAkJbWVtbW92ZShidWYtPmJhc2UsIGJ1Zi0+YmFzZSArIGksIGJ1Zi0+c2l6ZSAtIGkpOwogCQlidWYtPnNpemUgLT0gaTsKIAkJc3Bpbl91bmxvY2soJmFjbS0+dGhyb3R0bGVfbG9jayk7Ci0JCXNwaW5fbG9jaygmYWNtLT5yZWFkX2xvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJbGlzdF9hZGQoJmJ1Zi0+bGlzdCwgJmFjbS0+ZmlsbGVkX3JlYWRfYnVmcyk7Ci0JCXNwaW5fdW5sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAJc3Bpbl91bmxvY2soJmFjbS0+dGhyb3R0bGVfbG9jayk7CiAKLQlzcGluX2xvY2soJmFjbS0+cmVhZF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZCgmYnVmLT5saXN0LCAmYWNtLT5zcGFyZV9yZWFkX2J1ZnMpOwotCXNwaW5fdW5sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAlnb3RvIG5leHRfYnVmZmVyOwogCiB1cmJzOgogCXdoaWxlICghbGlzdF9lbXB0eSgmYWNtLT5zcGFyZV9yZWFkX2J1ZnMpKSB7Ci0JCXNwaW5fbG9jaygmYWNtLT5yZWFkX2xvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJaWYgKGxpc3RfZW1wdHkoJmFjbS0+c3BhcmVfcmVhZF91cmJzKSkgewotCQkJc3Bpbl91bmxvY2soJmFjbS0+cmVhZF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJcmN2ID0gbGlzdF9lbnRyeShhY20tPnNwYXJlX3JlYWRfdXJicy5uZXh0LAogCQkJCSBzdHJ1Y3QgYWNtX3J1LCBsaXN0KTsKIAkJbGlzdF9kZWwoJnJjdi0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CiAKIAkJYnVmID0gbGlzdF9lbnRyeShhY20tPnNwYXJlX3JlYWRfYnVmcy5uZXh0LAogCQkJCSBzdHJ1Y3QgYWNtX3JiLCBsaXN0KTsKQEAgLTQwMCw5ICs0MDAsOSBAQAogCQkgICBmcmVlLXVyYnMtcG9vbCBhbmQgcmVzdWJtaXRlZCBBU0FQICovCiAJCWlmICh1c2Jfc3VibWl0X3VyYihyY3YtPnVyYiwgR0ZQX0FUT01JQykgPCAwKSB7CiAJCQlsaXN0X2FkZCgmYnVmLT5saXN0LCAmYWNtLT5zcGFyZV9yZWFkX2J1ZnMpOwotCQkJc3Bpbl9sb2NrKCZhY20tPnJlYWRfbG9jayk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJCWxpc3RfYWRkKCZyY3YtPmxpc3QsICZhY20tPnNwYXJlX3JlYWRfdXJicyk7Ci0JCQlzcGluX3VubG9jaygmYWNtLT5yZWFkX2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTQyMSw5ICs0MjEsOSBAQAogCQlzY2hlZHVsZV93b3JrKCZhY20tPndvcmspOwogfQogCi1zdGF0aWMgdm9pZCBhY21fc29mdGludCh2b2lkICpwcml2YXRlKQorc3RhdGljIHZvaWQgYWNtX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhY20gKmFjbSA9IHByaXZhdGU7CisJc3RydWN0IGFjbSAqYWNtID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhY20sIHdvcmspOwogCWRiZygiRW50ZXJpbmcgYWNtX3NvZnRpbnQuIik7CiAJCiAJaWYgKCFBQ01fUkVBRFkoYWNtKSkKQEAgLTY3NywxMCArNjc3LDEwIEBACiAJNSwgNiwgNywgOAogfTsKIAotc3RhdGljIHZvaWQgYWNtX3R0eV9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvc19vbGQpCitzdGF0aWMgdm9pZCBhY21fdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvc19vbGQpCiB7CiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcyA9IHR0eS0+dGVybWlvczsKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MgPSB0dHktPnRlcm1pb3M7CiAJc3RydWN0IHVzYl9jZGNfbGluZV9jb2RpbmcgbmV3bGluZTsKIAlpbnQgbmV3Y3RybCA9IGFjbS0+Y3RybG91dDsKIApAQCAtODkyLDcgKzg5Miw3IEBACiAKIAogCS8qIHdvcmthcm91bmQgZm9yIHN3aXRjaGVkIGVuZHBvaW50cyAqLwotCWlmICgoZXByZWFkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgIT0gVVNCX0RJUl9JTikgeworCWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbihlcHJlYWQpKSB7CiAJCS8qIGRlc2NyaXB0b3JzIGFyZSBzd2FwcGVkICovCiAJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdDsKIAkJZGV2X2RiZygmaW50Zi0+ZGV2LCJUaGUgZGF0YSBpbnRlcmZhY2UgaGFzIHN3aXRjaGVkIGVuZHBvaW50cyIpOwpAQCAtOTI3LDcgKzkyNyw3IEBACiAJYWNtLT5yeF9idWZsaW1pdCA9IG51bV9yeF9idWY7CiAJYWNtLT51cmJfdGFzay5mdW5jID0gYWNtX3J4X3Rhc2tsZXQ7CiAJYWNtLT51cmJfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFjbTsKLQlJTklUX1dPUksoJmFjbS0+d29yaywgYWNtX3NvZnRpbnQsIGFjbSk7CisJSU5JVF9XT1JLKCZhY20tPndvcmssIGFjbV9zb2Z0aW50KTsKIAlzcGluX2xvY2tfaW5pdCgmYWNtLT50aHJvdHRsZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWNtLT53cml0ZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWNtLT5yZWFkX2xvY2spOwpAQCAtMTA4Myw2ICsxMDgzLDkgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNDgyLCAweDAyMDMpLCAvKiBLWU9DRVJBIEFILUszMDAxViAqLwogCS5kcml2ZXJfaW5mbyA9IE5PX1VOSU9OX05PUk1BTCwgLyogaGFzIG5vIHVuaW9uIGRlc2NyaXB0b3IgKi8KIAl9LAorCXsgVVNCX0RFVklDRSgweDA3OWIsIDB4MDAwZiksIC8qIEJUIE9uLUFpciBVU0IgTU9ERU0gKi8KKwkuZHJpdmVyX2luZm8gPSBOT19VTklPTl9OT1JNQUwsIC8qIGhhcyBubyB1bmlvbiBkZXNjcmlwdG9yICovCisJfSwKIAl7IFVTQl9ERVZJQ0UoMHgwYWNlLCAweDE2MDgpLCAvKiBaeURBUyA1NksgVVNCIE1PREVNICovCiAJLmRyaXZlcl9pbmZvID0gU0lOR0xFX1JYX1VSQiwgLyogZmlybXdhcmUgYnVnICovCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jCmluZGV4IGExNjFkNzAuLjYzMDM5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYwpAQCAtMTU0LDYgKzE1NCw3IEBACiAJdW5zaWduZWQgY2hhcgkJdXNlZDsJCQkvKiBUcnVlIGlmIG9wZW4gKi8KIAl1bnNpZ25lZCBjaGFyCQlwcmVzZW50OwkJLyogVHJ1ZSBpZiBub3QgZGlzY29ubmVjdGVkICovCiAJdW5zaWduZWQgY2hhcgkJYmlkaXI7CQkJLyogaW50ZXJmYWNlIGlzIGJpZGlyZWN0aW9uYWwgKi8KKwl1bnNpZ25lZCBjaGFyCQlzbGVlcGluZzsJCS8qIGludGVyZmFjZSBpcyBzdXNwZW5kZWQgKi8KIAl1bnNpZ25lZCBjaGFyCQkqZGV2aWNlX2lkX3N0cmluZzsJLyogSUVFRSAxMjg0IERFVklDRSBJRCBzdHJpbmcgKHB0cikgKi8KIAkJCQkJCQkvKiBmaXJzdCAyIGJ5dGVzIGFyZSAoYmlnLWVuZGlhbikgbGVuZ3RoICovCiB9OwpAQCAtMTgzLDYgKzE4NCw3IEBACiAJZGJnKCJxdWlya3M9JWQiLCB1c2JscC0+cXVpcmtzKTsKIAlkYmcoInVzZWQ9JWQiLCB1c2JscC0+dXNlZCk7CiAJZGJnKCJiaWRpcj0lZCIsIHVzYmxwLT5iaWRpcik7CisJZGJnKCJzbGVlcGluZz0lZCIsIHVzYmxwLT5zbGVlcGluZyk7CiAJZGJnKCJkZXZpY2VfaWRfc3RyaW5nPVwiJXNcIiIsCiAJCXVzYmxwLT5kZXZpY2VfaWRfc3RyaW5nID8KIAkJCXVzYmxwLT5kZXZpY2VfaWRfc3RyaW5nICsgMiA6CkBAIC0zMzgsNiArMzQwLDIwIEBACiAJcmV0dXJuIG5ld2VycjsKIH0KIAorc3RhdGljIGludCBoYW5kbGVfYmlkaXIgKHN0cnVjdCB1c2JscCAqdXNibHApCit7CisJaWYgKHVzYmxwLT5iaWRpciAmJiB1c2JscC0+dXNlZCAmJiAhdXNibHAtPnNsZWVwaW5nKSB7CisJCXVzYmxwLT5yZWFkY291bnQgPSAwOworCQl1c2JscC0+cmVhZHVyYi0+ZGV2ID0gdXNibHAtPmRldjsKKwkJaWYgKHVzYl9zdWJtaXRfdXJiKHVzYmxwLT5yZWFkdXJiLCBHRlBfS0VSTkVMKSA8IDApIHsKKwkJCXVzYmxwLT51c2VkID0gMDsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBGaWxlIG9wIGZ1bmN0aW9ucy4KICAqLwpAQCAtMzkwLDE0ICs0MDYsOSBAQAogCXVzYmxwLT53cml0ZXVyYi0+c3RhdHVzID0gMDsKIAl1c2JscC0+cmVhZHVyYi0+c3RhdHVzID0gMDsKIAotCWlmICh1c2JscC0+YmlkaXIpIHsKLQkJdXNibHAtPnJlYWRjb3VudCA9IDA7Ci0JCXVzYmxwLT5yZWFkdXJiLT5kZXYgPSB1c2JscC0+ZGV2OwotCQlpZiAodXNiX3N1Ym1pdF91cmIodXNibHAtPnJlYWR1cmIsIEdGUF9LRVJORUwpIDwgMCkgewotCQkJcmV0dmFsID0gLUVJTzsKLQkJCXVzYmxwLT51c2VkID0gMDsKLQkJCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JCX0KKwlpZiAoaGFuZGxlX2JpZGlyKHVzYmxwKSA8IDApIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJcmV0dmFsID0gLUVJTzsKIAl9CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrICgmdXNibHBfbXV0ZXgpOwpAQCAtNDYwLDYgKzQ3MSwxMSBAQAogCQlnb3RvIGRvbmU7CiAJfQogCisJaWYgKHVzYmxwLT5zbGVlcGluZykgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCiAJZGJnKCJ1c2JscF9pb2N0bDogY21kPTB4JXggKCVjIG5yPSVkIGxlbj0lZCBkaXI9JWQpIiwgY21kLCBfSU9DX1RZUEUoY21kKSwKIAkJX0lPQ19OUihjbWQpLCBfSU9DX1NJWkUoY21kKSwgX0lPQ19ESVIoY21kKSApOwogCkBAIC02NTgsNiArNjc0LDExIEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCisJCWlmICh1c2JscC0+c2xlZXBpbmcpIHsKKwkJCXVwICgmdXNibHAtPnNlbSk7CisJCQlyZXR1cm4gd3JpdGVjb3VudCA/IHdyaXRlY291bnQgOiAtRU5PREVWOworCQl9CisKIAkJaWYgKHVzYmxwLT53cml0ZXVyYi0+c3RhdHVzICE9IDApIHsKIAkJCWlmICh1c2JscC0+cXVpcmtzICYgVVNCTFBfUVVJUktfQklESVIpIHsKIAkJCQlpZiAoIXVzYmxwLT53Y29tcGxldGUpCkBAIC03MDEsNiArNzIyLDcgQEAKIAkJdXNibHAtPndjb21wbGV0ZSA9IDA7CiAJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVzYmxwLT53cml0ZXVyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIpIHsKKwkJCXVzYmxwLT53Y29tcGxldGUgPSAxOwogCQkJaWYgKGVyciAhPSAtRU5PTUVNKQogCQkJCWNvdW50ID0gLUVJTzsKIAkJCWVsc2UKQEAgLTc0OSw2ICs3NzEsMTEgQEAKIAkJZ290byBkb25lOwogCX0KIAorCWlmICh1c2JscC0+c2xlZXBpbmcpIHsKKwkJY291bnQgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCiAJaWYgKHVzYmxwLT5yZWFkdXJiLT5zdGF0dXMpIHsKIAkJZXJyKCJ1c2JscCVkOiBlcnJvciAlZCByZWFkaW5nIGZyb20gcHJpbnRlciIsCiAJCQl1c2JscC0+bWlub3IsIHVzYmxwLT5yZWFkdXJiLT5zdGF0dXMpOwpAQCAtMTE2Nyw2ICsxMTk0LDM5IEBACiAJbXV0ZXhfdW5sb2NrICgmdXNibHBfbXV0ZXgpOwogfQogCitzdGF0aWMgaW50IHVzYmxwX3N1c3BlbmQgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgdXNibHAgKnVzYmxwID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisKKwkvKiB0aGlzIHJhY2VzIGFnYWluc3Qgbm9ybWFsIGFjY2VzcyBhbmQgb3BlbiAqLworCW11dGV4X2xvY2sgKCZ1c2JscF9tdXRleCk7CisJZG93biAoJnVzYmxwLT5zZW0pOworCS8qIHdlIHRha2Ugbm8gbW9yZSBJTyAqLworCXVzYmxwLT5zbGVlcGluZyA9IDE7CisJdXNibHBfdW5saW5rX3VyYnModXNibHApOworCXVwICgmdXNibHAtPnNlbSk7CisJbXV0ZXhfdW5sb2NrICgmdXNibHBfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNibHBfcmVzdW1lIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNibHAgKnVzYmxwID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJaW50IHI7CisKKwltdXRleF9sb2NrICgmdXNibHBfbXV0ZXgpOworCWRvd24gKCZ1c2JscC0+c2VtKTsKKworCXVzYmxwLT5zbGVlcGluZyA9IDA7CisJciA9IGhhbmRsZV9iaWRpciAodXNibHApOworCisJdXAgKCZ1c2JscC0+c2VtKTsKKwltdXRleF91bmxvY2sgKCZ1c2JscF9tdXRleCk7CisKKwlyZXR1cm4gcjsKK30KKwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYmxwX2lkcyBbXSA9IHsKIAl7IFVTQl9ERVZJQ0VfSU5GTyg3LCAxLCAxKSB9LAogCXsgVVNCX0RFVklDRV9JTkZPKDcsIDEsIDIpIH0sCkBAIC0xMTgzLDYgKzEyNDMsOCBAQAogCS5uYW1lID0JCSJ1c2JscCIsCiAJLnByb2JlID0JdXNibHBfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPQl1c2JscF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JdXNibHBfc3VzcGVuZCwKKwkucmVzdW1lID0JdXNibHBfcmVzdW1lLAogCS5pZF90YWJsZSA9CXVzYmxwX2lkcywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZwppbmRleCA2ZTNiNTM1Li5mODMyNGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvY29yZS9LY29uZmlnCkBAIC03Miw2ICs3MiwyMSBAQAogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBhYm91dCB0aGlzLCBzYXkgTiBoZXJlLgogCitjb25maWcgVVNCX01VTFRJVEhSRUFEX1BST0JFCisJYm9vbCAiVVNCIE11bHRpLXRocmVhZGVkIHByb2JlIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVVNCICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIFVTQiBjb3JlIHRvIHNwYXduIGEgbmV3IHRocmVhZCBmb3IKKwkgIGV2ZXJ5IFVTQiBkZXZpY2UgdGhhdCBpcyBwcm9iZWQuICBUaGlzIGNhbiBjYXVzZSBhIHNtYWxsIHNwZWVkdXAKKwkgIGluIGJvb3QgdGltZXMgb24gc3lzdGVtcyB3aXRoIGEgbG90IG9mIGRpZmZlcmVudCBVU0IgZGV2aWNlcy4KKworCSAgVGhpcyBvcHRpb24gc2hvdWxkIGJlIHNhZmUgdG8gZW5hYmxlLCBidXQgaWYgYW55IG9kZCBwcm9iaW5nCisJICBwcm9ibGVtcyBhcmUgZm91bmQsIHBsZWFzZSBkaXNhYmxlIGl0LCBvciBkeW5hbWljYWxseSB0dXJuIGl0CisJICBvZmYgaW4gdGhlIC9zeXMvbW9kdWxlL3VzYmNvcmUvcGFyYW1ldGVycy9tdWx0aXRocmVhZF9wcm9iZQorCSAgZmlsZQorCisJICBXaGVuIGluIGRvdWJ0LCBzYXkgTi4KIAogY29uZmlnIFVTQl9PVEcKIAlib29sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2J1ZmZlci5jIGIvZHJpdmVycy91c2IvY29yZS9idWZmZXIuYwppbmRleCA4NDA0NDJhLi5jMzkxNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvYnVmZmVyLmMKQEAgLTkzLDcgKzkzLDcgQEAKIH0KIAogCi0vKiBzb21ldGltZXMgYWxsb2MvZnJlZSBjb3VsZCB1c2Uga21hbGxvYyB3aXRoIFNMQUJfRE1BLCBmb3IKKy8qIHNvbWV0aW1lcyBhbGxvYy9mcmVlIGNvdWxkIHVzZSBrbWFsbG9jIHdpdGggR0ZQX0RNQSwgZm9yCiAgKiBiZXR0ZXIgc2hhcmluZyBhbmQgdG8gbGV2ZXJhZ2UgbW0vc2xhYi5jIGludGVsbGlnZW5jZS4KICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmljZXMuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aWNlcy5jCmluZGV4IDM1MzhjMmYuLmVhMzk4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aWNlcy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aWNlcy5jCkBAIC0xNzUsMTIgKzE3NSwxMyBAQAogKQogewogCWNoYXIgZGlyLCB1bml0LCAqdHlwZTsKLQl1bnNpZ25lZCBpbnRlcnZhbCwgaW4sIGJhbmR3aWR0aCA9IDE7CisJdW5zaWduZWQgaW50ZXJ2YWwsIGJhbmR3aWR0aCA9IDE7CiAKIAlpZiAoc3RhcnQgPiBlbmQpCiAJCXJldHVybiBzdGFydDsKLQlpbiA9IChkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTik7Ci0JZGlyID0gaW4gPyAnSScgOiAnTyc7CisKKwlkaXIgPSB1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpID8gJ0knIDogJ08nOworCiAJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSB7CiAJCXN3aXRjaCAobGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpICYgKDB4MDMgPDwgMTEpKSB7CiAJCWNhc2UgMSA8PCAxMToJYmFuZHdpZHRoID0gMjsgYnJlYWs7CkBAIC0yMDQsNyArMjA1LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgogCQl0eXBlID0gIkJ1bGsiOwotCQlpZiAoc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0ggJiYgIWluKQkvKiB1ZnJhbWVzIHBlciBOQUsgKi8KKwkJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9ISUdIICYmIGRpciA9PSAnTycpIC8qIHVmcmFtZXMgcGVyIE5BSyAqLwogCQkJaW50ZXJ2YWwgPSBkZXNjLT5iSW50ZXJ2YWw7CiAJCWVsc2UKIAkJCWludGVydmFsID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCA3MjQ4MjJjLi4zZWQ0Y2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC01NjEsNyArNTYxLDcgQEAKIAkJZGV2ID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAlpZiAoIWRldikKIAkJZ290byBvdXQ7Ci0JcmV0ID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKGRldiwgMSk7CisJcmV0ID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKGRldik7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKQEAgLTYwOSw3ICs2MDksNyBAQAogCQkJcmVsZWFzZWludGYocHMsIGlmbnVtKTsKIAl9CiAJZGVzdHJveV9hbGxfYXN5bmMocHMpOwotCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2LCAxKTsKKwl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldik7CiAJdXNiX3VubG9ja19kZXZpY2UoZGV2KTsKIAl1c2JfcHV0X2RldihkZXYpOwogCXB1dF9waWQocHMtPmRpc2NfcGlkKTsKQEAgLTE1ODgsMTUgKzE1ODgsMTggQEAKIAkucmVsZWFzZSA9CXVzYmRldl9yZWxlYXNlLAogfTsKIAotc3RhdGljIHZvaWQgdXNiZGV2X2FkZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQorc3RhdGljIGludCB1c2JkZXZfYWRkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCiB7CiAJaW50IG1pbm9yID0gKChkZXYtPmJ1cy0+YnVzbnVtLTEpICogMTI4KSArIChkZXYtPmRldm51bS0xKTsKIAogCWRldi0+Y2xhc3NfZGV2ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZSh1c2JfZGV2aWNlX2NsYXNzLCBOVUxMLAogCQkJCU1LREVWKFVTQl9ERVZJQ0VfTUFKT1IsIG1pbm9yKSwgJmRldi0+ZGV2LAogCQkJCSJ1c2JkZXYlZC4lZCIsIGRldi0+YnVzLT5idXNudW0sIGRldi0+ZGV2bnVtKTsKKwlpZiAoSVNfRVJSKGRldi0+Y2xhc3NfZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2LT5jbGFzc19kZXYpOwogCiAJZGV2LT5jbGFzc19kZXYtPmNsYXNzX2RhdGEgPSBkZXY7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHVzYmRldl9yZW1vdmUoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKQEAgLTE2MDksNyArMTYxMiw4IEBACiB7CiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIFVTQl9ERVZJQ0VfQUREOgotCQl1c2JkZXZfYWRkKGRldik7CisJCWlmICh1c2JkZXZfYWRkKGRldikpCisJCQlyZXR1cm4gTk9USUZZX0JBRDsKIAkJYnJlYWs7CiAJY2FzZSBVU0JfREVWSUNFX1JFTU9WRToKIAkJdXNiZGV2X3JlbW92ZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKaW5kZXggMTEzZTQ4NC4uZDZlYjVjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAlpZiAoaWQpIHsKIAkJZGV2X2RiZyhkZXYsICIlcyAtIGdvdCBpZFxuIiwgX19GVU5DVElPTl9fKTsKIAotCQllcnJvciA9IHVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LCAxKTsKKwkJZXJyb3IgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UodWRldik7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKIApAQCAtMjI5LDcgKzIyOSw3IEBACiAJCX0gZWxzZQogCQkJaW50Zi0+Y29uZGl0aW9uID0gVVNCX0lOVEVSRkFDRV9CT1VORDsKIAotCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYsIDEpOworCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYpOwogCX0KIAogCXJldHVybiBlcnJvcjsKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCiAJLyogQXV0b3Jlc3VtZSBmb3Igc2V0X2ludGVyZmFjZSBjYWxsIGJlbG93ICovCiAJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JZXJyb3IgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UodWRldiwgMSk7CisJZXJyb3IgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UodWRldik7CiAKIAkvKiByZWxlYXNlIGFsbCB1cmJzIGZvciB0aGlzIGludGVyZmFjZSAqLwogCXVzYl9kaXNhYmxlX2ludGVyZmFjZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCBpbnRmKTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCWludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOwogCiAJaWYgKCFlcnJvcikKLQkJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2LCAxKTsKKwkJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDA4LDYgKzQwOCwxNiBAQAogCSAgICAoaWQtPmJEZXZpY2VQcm90b2NvbCAhPSBkZXYtPmRlc2NyaXB0b3IuYkRldmljZVByb3RvY29sKSkKIAkJcmV0dXJuIDA7CiAKKwkvKiBUaGUgaW50ZXJmYWNlIGNsYXNzLCBzdWJjbGFzcywgYW5kIHByb3RvY29sIHNob3VsZCBuZXZlciBiZQorCSAqIGNoZWNrZWQgZm9yIGEgbWF0Y2ggaWYgdGhlIGRldmljZSBjbGFzcyBpcyBWZW5kb3IgU3BlY2lmaWMsCisJICogdW5sZXNzIHRoZSBtYXRjaCByZWNvcmQgc3BlY2lmaWVzIHRoZSBWZW5kb3IgSUQuICovCisJaWYgKGRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgPT0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDICYmCisJCQkhKGlkLT5tYXRjaF9mbGFncyAmIFVTQl9ERVZJQ0VfSURfTUFUQ0hfVkVORE9SKSAmJgorCQkJKGlkLT5tYXRjaF9mbGFncyAmIChVU0JfREVWSUNFX0lEX01BVENIX0lOVF9DTEFTUyB8CisJCQkJVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfU1VCQ0xBU1MgfAorCQkJCVVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX1BST1RPQ09MKSkpCisJCXJldHVybiAwOworCiAJaWYgKChpZC0+bWF0Y2hfZmxhZ3MgJiBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9DTEFTUykgJiYKIAkgICAgKGlkLT5iSW50ZXJmYWNlQ2xhc3MgIT0gaW50Zi0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MpKQogCQlyZXR1cm4gMDsKQEAgLTQ3Niw3ICs0ODYsMTcgQEAKICAqIG1vc3QgZ2VuZXJhbDsgdGhleSBsZXQgZHJpdmVycyBiaW5kIHRvIGFueSBpbnRlcmZhY2Ugb24gYQogICogbXVsdGlwbGUtZnVuY3Rpb24gZGV2aWNlLiAgVXNlIHRoZSBVU0JfSU5URVJGQUNFX0lORk8KICAqIG1hY3JvLCBvciBpdHMgc2libGluZ3MsIHRvIG1hdGNoIGNsYXNzLXBlci1pbnRlcmZhY2Ugc3R5bGUKLSAqIGRldmljZXMgKGFzIHJlY29yZGVkIGluIGJEZXZpY2VDbGFzcykuCisgKiBkZXZpY2VzIChhcyByZWNvcmRlZCBpbiBiSW50ZXJmYWNlQ2xhc3MpLgorICoKKyAqIE5vdGUgdGhhdCBhbiBlbnRyeSBjcmVhdGVkIGJ5IFVTQl9JTlRFUkZBQ0VfSU5GTyB3b24ndCBtYXRjaAorICogYW55IGludGVyZmFjZSBpZiB0aGUgZGV2aWNlIGNsYXNzIGlzIHNldCB0byBWZW5kb3ItU3BlY2lmaWMuCisgKiBUaGlzIGlzIGRlbGliZXJhdGU7IGFjY29yZGluZyB0byB0aGUgVVNCIHNwZWMgdGhlIG1lYW5pbmdzIG9mCisgKiB0aGUgaW50ZXJmYWNlIGNsYXNzL3N1YmNsYXNzL3Byb3RvY29sIGZvciB0aGVzZSBkZXZpY2VzIGFyZSBhbHNvCisgKiB2ZW5kb3Itc3BlY2lmaWMsIGFuZCBoZW5jZSBtYXRjaGluZyBhZ2FpbnN0IGEgc3RhbmRhcmQgcHJvZHVjdAorICogY2xhc3Mgd291bGRuJ3Qgd29yayBhbnl3YXkuICBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIGFuCisgKiBpbnRlcmZhY2UtYmFzZWQgbWF0Y2ggZm9yIHN1Y2ggYSBkZXZpY2UsIGNyZWF0ZSBhIG1hdGNoIHJlY29yZAorICogdGhhdCBhbHNvIHNwZWNpZmllcyB0aGUgdmVuZG9yIElELiAgKFVuZm9ydW5hdGVseSB0aGVyZSBpc24ndCBhCisgKiBzdGFuZGFyZCBtYWNybyBmb3IgY3JlYXRpbmcgcmVjb3JkcyBsaWtlIHRoaXMuKQogICoKICAqIFdpdGhpbiB0aG9zZSBncm91cHMsIHJlbWVtYmVyIHRoYXQgbm90IGFsbCBjb21iaW5hdGlvbnMgYXJlCiAgKiBtZWFuaW5nZnVsLiAgRm9yIGV4YW1wbGUsIGRvbid0IGdpdmUgYSBwcm9kdWN0IHZlcnNpb24gcmFuZ2UKQEAgLTUwNSw3ICs1MjUsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUExfRlVUVVJFKHVzYl9tYXRjaF9pZCk7CiAKLWludCB1c2JfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3N0YXRpYyBpbnQgdXNiX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiB7CiAJLyogZGV2aWNlcyBhbmQgaW50ZXJmYWNlcyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5ICovCiAJaWYgKGlzX3VzYl9kZXZpY2UoZGV2KSkgewpAQCAtNzkwLDcgKzgxMCw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiAKIC8qIENhbGxlciBoYXMgbG9ja2VkIHVkZXYncyBwbV9tdXRleCAqLwotc3RhdGljIGludCBzdXNwZW5kX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKK3N0YXRpYyBpbnQgdXNiX3N1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlcgkqdWRyaXZlcjsKIAlpbnQJCQkJc3RhdHVzID0gMDsKQEAgLTgxNyw3ICs4MzcsNyBAQAogfQogCiAvKiBDYWxsZXIgaGFzIGxvY2tlZCB1ZGV2J3MgcG1fbXV0ZXggKi8KLXN0YXRpYyBpbnQgcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyBpbnQgdXNiX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyCSp1ZHJpdmVyOwogCWludAkJCQlzdGF0dXMgPSAwOwpAQCAtODQzLDcgKzg2Myw3IEBACiB9CiAKIC8qIENhbGxlciBoYXMgbG9ja2VkIGludGYncyB1c2JfZGV2aWNlJ3MgcG0gbXV0ZXggKi8KLXN0YXRpYyBpbnQgc3VzcGVuZF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtc2cpCitzdGF0aWMgaW50IHVzYl9zdXNwZW5kX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2RyaXZlcgkqZHJpdmVyOwogCWludAkJCXN0YXR1cyA9IDA7CkBAIC04ODAsNyArOTAwLDcgQEAKIH0KIAogLyogQ2FsbGVyIGhhcyBsb2NrZWQgaW50ZidzIHVzYl9kZXZpY2UncyBwbV9tdXRleCAqLwotc3RhdGljIGludCByZXN1bWVfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCB1c2JfcmVzdW1lX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNiX2RyaXZlcgkqZHJpdmVyOwogCWludAkJCXN0YXR1cyA9IDA7CkBAIC05MjAsNiArOTQwLDQ0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAorCisvKiBJbnRlcm5hbCByb3V0aW5lIHRvIGNoZWNrIHdoZXRoZXIgd2UgbWF5IGF1dG9zdXNwZW5kIGEgZGV2aWNlLiAqLworc3RhdGljIGludCBhdXRvc3VzcGVuZF9jaGVjayhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlpbnQJCQlpOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOworCisJLyogRm9yIGF1dG9zdXNwZW5kLCBmYWlsIGZhc3QgaWYgYW55dGhpbmcgaXMgaW4gdXNlLgorCSAqIEFsc28gZmFpbCBpZiBhbnkgaW50ZXJmYWNlcyByZXF1aXJlIHJlbW90ZSB3YWtldXAgYnV0IGl0CisJICogaXNuJ3QgYXZhaWxhYmxlLiAqLworCXVkZXYtPmRvX3JlbW90ZV93YWtldXAgPSBkZXZpY2VfbWF5X3dha2V1cCgmdWRldi0+ZGV2KTsKKwlpZiAodWRldi0+cG1fdXNhZ2VfY250ID4gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAodWRldi0+YWN0Y29uZmlnKSB7CisJCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgeworCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOworCQkJaWYgKCFpc19hY3RpdmUoaW50ZikpCisJCQkJY29udGludWU7CisJCQlpZiAoaW50Zi0+cG1fdXNhZ2VfY250ID4gMCkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJaWYgKGludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgJiYKKwkJCQkJIXVkZXYtPmRvX3JlbW90ZV93YWtldXApIHsKKwkJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJyZW1vdGUgd2FrZXVwIG5lZWRlZCAiCisJCQkJCQkiZm9yIGF1dG9zdXNwZW5kXG4iKTsKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgYXV0b3N1c3BlbmRfY2hlY2sodWRldikJCTAKKworI2VuZGlmCisKIC8qKgogICogdXNiX3N1c3BlbmRfYm90aCAtIHN1c3BlbmQgYSBVU0IgZGV2aWNlIGFuZCBpdHMgaW50ZXJmYWNlcwogICogQHVkZXY6IHRoZSB1c2JfZGV2aWNlIHRvIHN1c3BlbmQKQEAgLTk3MSw1MiArMTAyOSwzNCBAQAogCiAJdWRldi0+ZG9fcmVtb3RlX3dha2V1cCA9IGRldmljZV9tYXlfd2FrZXVwKCZ1ZGV2LT5kZXYpOwogCi0JLyogRm9yIGF1dG9zdXNwZW5kLCBmYWlsIGZhc3QgaWYgYW55dGhpbmcgaXMgaW4gdXNlLgotCSAqIEFsc28gZmFpbCBpZiBhbnkgaW50ZXJmYWNlcyByZXF1aXJlIHJlbW90ZSB3YWtldXAgYnV0IGl0Ci0JICogaXNuJ3QgYXZhaWxhYmxlLiAqLwogCWlmICh1ZGV2LT5hdXRvX3BtKSB7Ci0JCWlmICh1ZGV2LT5wbV91c2FnZV9jbnQgPiAwKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKHVkZXYtPmFjdGNvbmZpZykgewotCQkJZm9yICg7IGkgPCB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewotCQkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKLQkJCQlpZiAoIWlzX2FjdGl2ZShpbnRmKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGludGYtPnBtX3VzYWdlX2NudCA+IDApCi0JCQkJCXJldHVybiAtRUJVU1k7Ci0JCQkJaWYgKGludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgJiYKLQkJCQkJCSF1ZGV2LT5kb19yZW1vdGVfd2FrZXVwKSB7Ci0JCQkJCWRldl9kYmcoJnVkZXYtPmRldiwKLQkicmVtb3RlIHdha2V1cCBuZWVkZWQgZm9yIGF1dG9zdXNwZW5kXG4iKTsKLQkJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkJCX0KLQkJCX0KLQkJCWkgPSAwOwotCQl9CisJCXN0YXR1cyA9IGF1dG9zdXNwZW5kX2NoZWNrKHVkZXYpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJLyogU3VzcGVuZCBhbGwgdGhlIGludGVyZmFjZXMgYW5kIHRoZW4gdWRldiBpdHNlbGYgKi8KIAlpZiAodWRldi0+YWN0Y29uZmlnKSB7CiAJCWZvciAoOyBpIDwgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyBpKyspIHsKIAkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKLQkJCXN0YXR1cyA9IHN1c3BlbmRfaW50ZXJmYWNlKGludGYsIG1zZyk7CisJCQlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9pbnRlcmZhY2UoaW50ZiwgbXNnKTsKIAkJCWlmIChzdGF0dXMgIT0gMCkKIAkJCQlicmVhazsKIAkJfQogCX0KIAlpZiAoc3RhdHVzID09IDApCi0JCXN0YXR1cyA9IHN1c3BlbmRfZGV2aWNlKHVkZXYsIG1zZyk7CisJCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2RldmljZSh1ZGV2LCBtc2cpOwogCiAJLyogSWYgdGhlIHN1c3BlbmQgZmFpbGVkLCByZXN1bWUgaW50ZXJmYWNlcyB0aGF0IGRpZCBnZXQgc3VzcGVuZGVkICovCiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCXdoaWxlICgtLWkgPj0gMCkgewogCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJcmVzdW1lX2ludGVyZmFjZShpbnRmKTsKKwkJCXVzYl9yZXN1bWVfaW50ZXJmYWNlKGludGYpOwogCQl9CiAKIAkvKiBJZiB0aGUgc3VzcGVuZCBzdWNjZWVkZWQsIHByb3BhZ2F0ZSBpdCB1cCB0aGUgdHJlZSAqLwogCX0gZWxzZSBpZiAocGFyZW50KQotCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHBhcmVudCwgMCk7CisJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UocGFyZW50KTsKIAogCS8vIGRldl9kYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTA2NCw5ICsxMTA0LDI1IEBACiAJLyogUHJvcGFnYXRlIHRoZSByZXN1bWUgdXAgdGhlIHRyZWUsIGlmIG5lY2Vzc2FyeSAqLwogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKSB7CiAJCWlmIChwYXJlbnQpIHsKLQkJCXVzYl9wbV9sb2NrKHBhcmVudCk7Ci0JCQlwYXJlbnQtPmF1dG9fcG0gPSAxOwotCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHBhcmVudCk7CisJCQlzdGF0dXMgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UocGFyZW50KTsKKwkJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYpOworCQkJCWlmIChzdGF0dXMpIHsKKwkJCQkJdXNiX2F1dG9zdXNwZW5kX2RldmljZShwYXJlbnQpOworCisJCQkJCS8qIEl0J3MgcG9zc2libGUgdXNiX3Jlc3VtZV9kZXZpY2UoKQorCQkJCQkgKiBmYWlsZWQgYWZ0ZXIgdGhlIHBvcnQgd2FzCisJCQkJCSAqIHVuc3VzcGVuZGVkLCBjYXVzaW5nIHVkZXYgdG8gYmUKKwkJCQkJICogbG9naWNhbGx5IGRpc2Nvbm5lY3RlZC4gIFdlIGRvbid0CisJCQkJCSAqIHdhbnQgdXNiX2Rpc2Nvbm5lY3QoKSB0byBhdXRvc3VzcGVuZAorCQkJCQkgKiB0aGUgcGFyZW50IGFnYWluLCBzbyB0ZWxsIGl0IHRoYXQKKwkJCQkJICogdWRldiBkaXNjb25uZWN0ZWQgd2hpbGUgc3RpbGwKKwkJCQkJICogc3VzcGVuZGVkLiAqLworCQkJCQlpZiAodWRldi0+c3RhdGUgPT0KKwkJCQkJCQlVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCisJCQkJCQl1ZGV2LT5kaXNjb25fc3VzcGVuZGVkID0gMTsKKwkJCQl9CisJCQl9CiAJCX0gZWxzZSB7CiAKIAkJCS8qIFdlIGNhbid0IHByb2dhZ2F0ZSBiZXlvbmQgdGhlIFVTQiBzdWJzeXN0ZW0sCkBAIC0xMDc1LDI0ICsxMTMxLDIwIEBACiAJCQlpZiAodWRldi0+ZGV2LnBhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0KIAkJCQkJUE1fRVZFTlRfT04pCiAJCQkJc3RhdHVzID0gLUVIT1NUVU5SRUFDSDsKLQkJfQotCQlpZiAoc3RhdHVzID09IDApCi0JCQlzdGF0dXMgPSByZXN1bWVfZGV2aWNlKHVkZXYpOwotCQlpZiAocGFyZW50KQotCQkJdXNiX3BtX3VubG9jayhwYXJlbnQpOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYpOworIAkJfQogCX0gZWxzZSB7CiAKIAkJLyogTmVlZGVkIG9ubHkgZm9yIHNldHRpbmcgdWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50CiAJCSAqIGFuZCBmb3IgcG9zc2libGUgZGVidWdnaW5nIG1lc3NhZ2UuICovCi0JCXN0YXR1cyA9IHJlc3VtZV9kZXZpY2UodWRldik7CisJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYpOwogCX0KIAotCS8qIE5vdyB0aGUgcGFyZW50IHdvbid0IHN1c3BlbmQgdW50aWwgd2UgYXJlIGZpbmlzaGVkICovCi0KIAlpZiAoc3RhdHVzID09IDAgJiYgdWRldi0+YWN0Y29uZmlnKSB7CiAJCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewogCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJcmVzdW1lX2ludGVyZmFjZShpbnRmKTsKKwkJCXVzYl9yZXN1bWVfaW50ZXJmYWNlKGludGYpOwogCQl9CiAJfQogCkBAIC0xMTAyLDM5ICsxMTU0LDUzIEBACiAKICNpZmRlZiBDT05GSUdfVVNCX1NVU1BFTkQKIAorLyogSW50ZXJuYWwgcm91dGluZSB0byBhZGp1c3QgYSBkZXZpY2UncyB1c2FnZSBjb3VudGVyIGFuZCBjaGFuZ2UKKyAqIGl0cyBhdXRvc3VzcGVuZCBzdGF0ZS4KKyAqLworc3RhdGljIGludCB1c2JfYXV0b3BtX2RvX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGluY191c2FnZV9jbnQpCit7CisJaW50CXN0YXR1cyA9IDA7CisKKwl1c2JfcG1fbG9jayh1ZGV2KTsKKwl1ZGV2LT5wbV91c2FnZV9jbnQgKz0gaW5jX3VzYWdlX2NudDsKKwlXQVJOX09OKHVkZXYtPnBtX3VzYWdlX2NudCA8IDApOworCWlmIChpbmNfdXNhZ2VfY250ID49IDAgJiYgdWRldi0+cG1fdXNhZ2VfY250ID4gMCkgeworCQl1ZGV2LT5hdXRvX3BtID0gMTsKKwkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOworCQlpZiAoc3RhdHVzICE9IDApCisJCQl1ZGV2LT5wbV91c2FnZV9jbnQgLT0gaW5jX3VzYWdlX2NudDsKKwl9IGVsc2UgaWYgKGluY191c2FnZV9jbnQgPD0gMCAmJiBhdXRvc3VzcGVuZF9jaGVjayh1ZGV2KSA9PSAwKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmdWRldi0+YXV0b3N1c3BlbmQsCisJCQkJVVNCX0FVVE9TVVNQRU5EX0RFTEFZKTsKKwl1c2JfcG1fdW5sb2NrKHVkZXYpOworCXJldHVybiBzdGF0dXM7Cit9CisKIC8qKgogICogdXNiX2F1dG9zdXNwZW5kX2RldmljZSAtIGRlbGF5ZWQgYXV0b3N1c3BlbmQgb2YgYSBVU0IgZGV2aWNlIGFuZCBpdHMgaW50ZXJmYWNlcwogICogQHVkZXY6IHRoZSB1c2JfZGV2aWNlIHRvIGF1dG9zdXNwZW5kCi0gKiBAZGVjX3VzYWdlX2NudDogZmxhZyB0byBkZWNyZW1lbnQgQHVkZXYncyBQTS11c2FnZSBjb3VudGVyCiAgKgogICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIGNvcmUgc3Vic3lzdGVtIGlzIGZpbmlzaGVkIHVzaW5nCiAgKiBAdWRldiBhbmQgd2FudHMgdG8gYWxsb3cgaXQgdG8gYXV0b3N1c3BlbmQuICBFeGFtcGxlcyB3b3VsZCBiZSB3aGVuCiAgKiBAdWRldidzIGRldmljZSBmaWxlIGluIHVzYmZzIGlzIGNsb3NlZCBvciBhZnRlciBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlLgogICoKLSAqIEBkZWNfdXNhZ2VfY250IHNob3VsZCBiZSAxIGlmIHRoZSBzdWJzeXN0ZW0gcHJldmlvdXNseSBpbmNyZW1lbnRlZAotICogQHVkZXYncyB1c2FnZSBjb3VudGVyIChzdWNoIGFzIGJ5IHBhc3NpbmcgMSB0byB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UpOwotICogb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSAwLgotICoKLSAqIElmIHRoZSB1c2FnZSBjb3VudGVyIGZvciBAdWRldiBvciBhbnkgb2YgaXRzIGFjdGl2ZSBpbnRlcmZhY2VzIGlzIGdyZWF0ZXIKLSAqIHRoYW4gMCwgdGhlIGF1dG9zdXNwZW5kIHJlcXVlc3Qgd2lsbCBub3QgYmUgcXVldWVkLiAgKElmIGFuIGludGVyZmFjZQotICogZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYXV0b3N1c3BlbmQgdGhlbiBpdHMgdXNhZ2UgY291bnRlciBpcyBwZXJtYW5lbnRseQotICogcG9zaXRpdmUuKSAgTGlrZXdpc2UsIGlmIGFuIGludGVyZmFjZSBkcml2ZXIgcmVxdWlyZXMgcmVtb3RlLXdha2V1cAotICogY2FwYWJpbGl0eSBkdXJpbmcgYXV0b3N1c3BlbmQgYnV0IHJlbW90ZSB3YWtldXAgaXMgZGlzYWJsZWQsIHRoZQotICogYXV0b3N1c3BlbmQgd2lsbCBmYWlsLgorICogQHVkZXYncyB1c2FnZSBjb3VudGVyIGlzIGRlY3JlbWVudGVkLiAgSWYgaXQgb3IgYW55IG9mIHRoZSB1c2FnZSBjb3VudGVycworICogZm9yIGFuIGFjdGl2ZSBpbnRlcmZhY2UgaXMgZ3JlYXRlciB0aGFuIDAsIG5vIGF1dG9zdXNwZW5kIHJlcXVlc3Qgd2lsbCBiZQorICogcXVldWVkLiAgKElmIGFuIGludGVyZmFjZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBhdXRvc3VzcGVuZCB0aGVuIGl0cworICogdXNhZ2UgY291bnRlciBpcyBwZXJtYW5lbnRseSBwb3NpdGl2ZS4pICBGdXJ0aGVybW9yZSwgaWYgYW4gaW50ZXJmYWNlCisgKiBkcml2ZXIgcmVxdWlyZXMgcmVtb3RlLXdha2V1cCBjYXBhYmlsaXR5IGR1cmluZyBhdXRvc3VzcGVuZCBidXQgcmVtb3RlCisgKiB3YWtldXAgaXMgZGlzYWJsZWQsIHRoZSBhdXRvc3VzcGVuZCB3aWxsIGZhaWwuCiAgKgogICogT2Z0ZW4gdGhlIGNhbGxlciB3aWxsIGhvbGQgQHVkZXYncyBkZXZpY2UgbG9jaywgYnV0IHRoaXMgaXMgbm90CiAgKiBuZWNlc3NhcnkuCiAgKgogICogVGhpcyByb3V0aW5lIGNhbiBydW4gb25seSBpbiBwcm9jZXNzIGNvbnRleHQuCiAgKi8KLXZvaWQgdXNiX2F1dG9zdXNwZW5kX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGRlY191c2FnZV9jbnQpCit2b2lkIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7Ci0JdXNiX3BtX2xvY2sodWRldik7Ci0JdWRldi0+cG1fdXNhZ2VfY250IC09IGRlY191c2FnZV9jbnQ7Ci0JaWYgKHVkZXYtPnBtX3VzYWdlX2NudCA8PSAwKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmdWRldi0+YXV0b3N1c3BlbmQsCi0JCQkJVVNCX0FVVE9TVVNQRU5EX0RFTEFZKTsKLQl1c2JfcG1fdW5sb2NrKHVkZXYpOworCWludAlzdGF0dXM7CisKKwlzdGF0dXMgPSB1c2JfYXV0b3BtX2RvX2RldmljZSh1ZGV2LCAtMSk7CiAJLy8gZGV2X2RiZygmdWRldi0+ZGV2LCAiJXM6IGNudCAlZFxuIiwKIAkvLwkJX19GVU5DVElPTl9fLCB1ZGV2LT5wbV91c2FnZV9jbnQpOwogfQpAQCAtMTE0Miw0NCArMTIwOCw1OSBAQAogLyoqCiAgKiB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UgLSBpbW1lZGlhdGVseSBhdXRvcmVzdW1lIGEgVVNCIGRldmljZSBhbmQgaXRzIGludGVyZmFjZXMKICAqIEB1ZGV2OiB0aGUgdXNiX2RldmljZSB0byBhdXRvcmVzdW1lCi0gKiBAaW5jX3VzYWdlX2NudDogZmxhZyB0byBpbmNyZW1lbnQgQHVkZXYncyBQTS11c2FnZSBjb3VudGVyCiAgKgogICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIGNvcmUgc3Vic3lzdGVtIHdhbnRzIHRvIHVzZSBAdWRldgotICogYW5kIG5lZWRzIHRvIGd1YXJhbnRlZSB0aGF0IGl0IGlzIG5vdCBzdXNwZW5kZWQuICBJbiBhZGRpdGlvbiwgdGhlCi0gKiBjYWxsZXIgY2FuIHByZXZlbnQgQHVkZXYgZnJvbSBiZWluZyBhdXRvc3VzcGVuZGVkIHN1YnNlcXVlbnRseS4gIChOb3RlCi0gKiB0aGF0IHRoaXMgd2lsbCBub3QgcHJldmVudCBzdXNwZW5kIGV2ZW50cyBvcmlnaW5hdGluZyBpbiB0aGUgUE0gY29yZS4pCi0gKiBFeGFtcGxlcyB3b3VsZCBiZSB3aGVuIEB1ZGV2J3MgZGV2aWNlIGZpbGUgaW4gdXNiZnMgaXMgb3BlbmVkIChhdXRvc3VzcGVuZAotICogc2hvdWxkIGJlIHByZXZlbnRlZCB1bnRpbCB0aGUgZmlsZSBpcyBjbG9zZWQpIG9yIHdoZW4gYSByZW1vdGUtd2FrZXVwCi0gKiByZXF1ZXN0IGlzIHJlY2VpdmVkIChsYXRlciBhdXRvc3VzcGVuZHMgc2hvdWxkIG5vdCBiZSBwcmV2ZW50ZWQpLgorICogYW5kIG5lZWRzIHRvIGd1YXJhbnRlZSB0aGF0IGl0IGlzIG5vdCBzdXNwZW5kZWQuICBObyBhdXRvc3VzcGVuZCB3aWxsCisgKiBvY2N1ciB1bnRpbCB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlIGlzIGNhbGxlZC4gIChOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdAorICogcHJldmVudCBzdXNwZW5kIGV2ZW50cyBvcmlnaW5hdGluZyBpbiB0aGUgUE0gY29yZS4pICBFeGFtcGxlcyB3b3VsZCBiZQorICogd2hlbiBAdWRldidzIGRldmljZSBmaWxlIGluIHVzYmZzIGlzIG9wZW5lZCBvciB3aGVuIGEgcmVtb3RlLXdha2V1cAorICogcmVxdWVzdCBpcyByZWNlaXZlZC4KICAqCi0gKiBAaW5jX3VzYWdlX2NudCBzaG91bGQgYmUgMSB0byBpbmNyZW1lbnQgQHVkZXYncyB1c2FnZSBjb3VudGVyIGFuZCBwcmV2ZW50Ci0gKiBhdXRvc3VzcGVuZHMuICBUaGlzIHByZXZlbnRpb24gd2lsbCBwZXJzaXN0IHVudGlsIHRoZSB1c2FnZSBjb3VudGVyIGlzCi0gKiBkZWNyZW1lbnRlZCBhZ2FpbiAoc3VjaCBhcyBieSBwYXNzaW5nIDEgdG8gdXNiX2F1dG9zdXNwZW5kX2RldmljZSkuCi0gKiBPdGhlcndpc2UgQGluY191c2FnZV9jbnQgc2hvdWxkIGJlIDAgdG8gbGVhdmUgdGhlIHVzYWdlIGNvdW50ZXIgdW5jaGFuZ2VkLgotICogUmVnYXJkbGVzcywgaWYgdGhlIGF1dG9yZXN1bWUgZmFpbHMgdGhlbiB0aGUgdXNhZ2UgY291bnRlciBpcyBub3QKLSAqIGluY3JlbWVudGVkLgorICogQHVkZXYncyB1c2FnZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIHRvIHByZXZlbnQgc3Vic2VxdWVudCBhdXRvc3VzcGVuZHMuCisgKiBIb3dldmVyIGlmIHRoZSBhdXRvcmVzdW1lIGZhaWxzIHRoZW4gdGhlIHVzYWdlIGNvdW50ZXIgaXMgcmUtZGVjcmVtZW50ZWQuCiAgKgogICogT2Z0ZW4gdGhlIGNhbGxlciB3aWxsIGhvbGQgQHVkZXYncyBkZXZpY2UgbG9jaywgYnV0IHRoaXMgaXMgbm90CiAgKiBuZWNlc3NhcnkgKGFuZCBhdHRlbXB0aW5nIGl0IG1pZ2h0IGNhdXNlIGRlYWRsb2NrKS4KICAqCiAgKiBUaGlzIHJvdXRpbmUgY2FuIHJ1biBvbmx5IGluIHByb2Nlc3MgY29udGV4dC4KICAqLwotaW50IHVzYl9hdXRvcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IGluY191c2FnZV9jbnQpCitpbnQgdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludAlzdGF0dXM7CiAKLQl1c2JfcG1fbG9jayh1ZGV2KTsKLQl1ZGV2LT5wbV91c2FnZV9jbnQgKz0gaW5jX3VzYWdlX2NudDsKLQl1ZGV2LT5hdXRvX3BtID0gMTsKLQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQl1ZGV2LT5wbV91c2FnZV9jbnQgLT0gaW5jX3VzYWdlX2NudDsKLQl1c2JfcG1fdW5sb2NrKHVkZXYpOworCXN0YXR1cyA9IHVzYl9hdXRvcG1fZG9fZGV2aWNlKHVkZXYsIDEpOwogCS8vIGRldl9kYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAogCS8vCQlfX0ZVTkNUSU9OX18sIHN0YXR1cywgdWRldi0+cG1fdXNhZ2VfY250KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKiBJbnRlcm5hbCByb3V0aW5lIHRvIGFkanVzdCBhbiBpbnRlcmZhY2UncyB1c2FnZSBjb3VudGVyIGFuZCBjaGFuZ2UKKyAqIGl0cyBkZXZpY2UncyBhdXRvc3VzcGVuZCBzdGF0ZS4KKyAqLworc3RhdGljIGludCB1c2JfYXV0b3BtX2RvX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJaW50IGluY191c2FnZV9jbnQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWludAkJCXN0YXR1cyA9IDA7CisKKwl1c2JfcG1fbG9jayh1ZGV2KTsKKwlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwllbHNlIHsKKwkJaW50Zi0+cG1fdXNhZ2VfY250ICs9IGluY191c2FnZV9jbnQ7CisJCWlmIChpbmNfdXNhZ2VfY250ID49IDAgJiYgaW50Zi0+cG1fdXNhZ2VfY250ID4gMCkgeworCQkJdWRldi0+YXV0b19wbSA9IDE7CisJCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7CisJCQlpZiAoc3RhdHVzICE9IDApCisJCQkJaW50Zi0+cG1fdXNhZ2VfY250IC09IGluY191c2FnZV9jbnQ7CisJCX0gZWxzZSBpZiAoaW5jX3VzYWdlX2NudCA8PSAwICYmIGF1dG9zdXNwZW5kX2NoZWNrKHVkZXYpID09IDApCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmdWRldi0+YXV0b3N1c3BlbmQsCisJCQkJCVVTQl9BVVRPU1VTUEVORF9ERUxBWSk7CisJfQorCXVzYl9wbV91bmxvY2sodWRldik7CisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoqCiAgKiB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UgLSBkZWNyZW1lbnQgYSBVU0IgaW50ZXJmYWNlJ3MgUE0tdXNhZ2UgY291bnRlcgogICogQGludGY6IHRoZSB1c2JfaW50ZXJmYWNlIHdob3NlIGNvdW50ZXIgc2hvdWxkIGJlIGRlY3JlbWVudGVkCkBAIC0xMjEzLDE3ICsxMjk0LDExIEBACiAgKi8KIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQJc3RhdHVzOwogCi0JdXNiX3BtX2xvY2sodWRldik7Ci0JaWYgKGludGYtPmNvbmRpdGlvbiAhPSBVU0JfSU5URVJGQUNFX1VOQk9VTkQgJiYKLQkJCS0taW50Zi0+cG1fdXNhZ2VfY250IDw9IDApIHsKLQkJcXVldWVfZGVsYXllZF93b3JrKGtzdXNwZW5kX3VzYl93cSwgJnVkZXYtPmF1dG9zdXNwZW5kLAotCQkJCVVTQl9BVVRPU1VTUEVORF9ERUxBWSk7Ci0JfQotCXVzYl9wbV91bmxvY2sodWRldik7Ci0JLy8gZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXM6IGNudCAlZFxuIiwKLQkvLwkJX19GVU5DVElPTl9fLCBpbnRmLT5wbV91c2FnZV9jbnQpOworCXN0YXR1cyA9IHVzYl9hdXRvcG1fZG9faW50ZXJmYWNlKGludGYsIC0xKTsKKwkvLyBkZXZfZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkIGNudCAlZFxuIiwKKwkvLwkJX19GVU5DVElPTl9fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UpOwogCkBAIC0xMjYwLDI2ICsxMzM1LDM3IEBACiAgKi8KIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UJKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCWludAkJCXN0YXR1czsKKwlpbnQJc3RhdHVzOwogCi0JdXNiX3BtX2xvY2sodWRldik7Ci0JaWYgKGludGYtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpCi0JCXN0YXR1cyA9IC1FTk9ERVY7Ci0JZWxzZSB7Ci0JCSsraW50Zi0+cG1fdXNhZ2VfY250OwotCQl1ZGV2LT5hdXRvX3BtID0gMTsKLQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOwotCQlpZiAoc3RhdHVzICE9IDApCi0JCQktLWludGYtPnBtX3VzYWdlX2NudDsKLQl9Ci0JdXNiX3BtX3VubG9jayh1ZGV2KTsKKwlzdGF0dXMgPSB1c2JfYXV0b3BtX2RvX2ludGVyZmFjZShpbnRmLCAxKTsKIAkvLyBkZXZfZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkIGNudCAlZFxuIiwKIAkvLwkJX19GVU5DVElPTl9fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSk7CiAKKy8qKgorICogdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlIC0gc2V0IGEgVVNCIGludGVyZmFjZSdzIGF1dG9zdXNwZW5kIHN0YXRlCisgKiBAaW50ZjogdGhlIHVzYl9pbnRlcmZhY2Ugd2hvc2Ugc3RhdGUgc2hvdWxkIGJlIHNldAorICoKKyAqIFRoaXMgcm91dGluZSBzZXRzIHRoZSBhdXRvc3VzcGVuZCBzdGF0ZSBvZiBAaW50ZidzIGRldmljZSBhY2NvcmRpbmcKKyAqIHRvIEBpbnRmJ3MgdXNhZ2UgY291bnRlciwgd2hpY2ggdGhlIGNhbGxlciBtdXN0IGhhdmUgc2V0IHByZXZpb3VzbHkuCisgKiBJZiB0aGUgY291bnRlciBpcyA8PSAwLCB0aGUgZGV2aWNlIGlzIGF1dG9zdXNwZW5kZWQgKGlmIGl0IGlzbid0CisgKiBhbHJlYWR5IHN1c3BlbmRlZCBhbmQgaWYgbm90aGluZyBlbHNlIHByZXZlbnRzIHRoZSBhdXRvc3VzcGVuZCkuICBJZgorICogdGhlIGNvdW50ZXIgaXMgPiAwLCB0aGUgZGV2aWNlIGlzIGF1dG9yZXN1bWVkIChpZiBpdCBpc24ndCBhbHJlYWR5CisgKiBhd2FrZSkuCisgKi8KK2ludCB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJaW50CXN0YXR1czsKKworCXN0YXR1cyA9IHVzYl9hdXRvcG1fZG9faW50ZXJmYWNlKGludGYsIDApOworCS8vIGRldl9kYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAorCS8vCQlfX0ZVTkNUSU9OX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKTsKKwogI2VuZGlmIC8qIENPTkZJR19VU0JfU1VTUEVORCAqLwogCiBzdGF0aWMgaW50IHVzYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMgYi9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMKaW5kZXggM2ViYjkwMS4uYzUwNWI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9lbmRwb2ludC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYwpAQCAtMTAsMTUgKzEwLDIwIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSAidXNiLmgiCiAKLS8qIGVuZHBvaW50IHN0dWZmICovCisjZGVmaW5lIE1BWF9FTkRQT0lOVF9NSU5PUlMgKDY0KjEyOCozMikKK3N0YXRpYyBpbnQgdXNiX2VuZHBvaW50X21ham9yOworc3RhdGljIERFRklORV9JRFIoZW5kcG9pbnRfaWRyKTsKIAogc3RydWN0IGVwX2RldmljZSB7CiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCXN0cnVjdCBkZXZpY2UgZGV2OworCWludCBtaW5vcjsKIH07CiAjZGVmaW5lIHRvX2VwX2RldmljZShfZGV2KSBcCiAJY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBlcF9kZXZpY2UsIGRldikKQEAgLTE1Miw2ICsxNTcsNTUgQEAKIAkuYXR0cnMgPSBlcF9kZXZfYXR0cnMsCiB9OwogCitzdGF0aWMgaW50IHVzYl9lbmRwb2ludF9tYWpvcl9pbml0KHZvaWQpCit7CisJZGV2X3QgZGV2OworCWludCBlcnJvcjsKKworCWVycm9yID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2LCAwLCBNQVhfRU5EUE9JTlRfTUlOT1JTLAorCQkJCSAgICAidXNiX2VuZHBvaW50Iik7CisJaWYgKGVycm9yKSB7CisJCWVycigidW5hYmxlIHRvIGdldCBhIGR5bmFtaWMgbWFqb3IgZm9yIHVzYiBlbmRwb2ludHMiKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwl1c2JfZW5kcG9pbnRfbWFqb3IgPSBNQUpPUihkZXYpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCB1c2JfZW5kcG9pbnRfbWFqb3JfY2xlYW51cCh2b2lkKQoreworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVih1c2JfZW5kcG9pbnRfbWFqb3IsIDApLAorCQkJCSBNQVhfRU5EUE9JTlRfTUlOT1JTKTsKK30KKworc3RhdGljIGludCBlbmRwb2ludF9nZXRfbWlub3Ioc3RydWN0IGVwX2RldmljZSAqZXBfZGV2KQoreworCXN0YXRpYyBERUZJTkVfTVVURVgobWlub3JfbG9jayk7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJaW50IGlkOworCisJbXV0ZXhfbG9jaygmbWlub3JfbG9jayk7CisJaWYgKGlkcl9wcmVfZ2V0KCZlbmRwb2ludF9pZHIsIEdGUF9LRVJORUwpID09IDApCisJCWdvdG8gZXhpdDsKKworCXJldHZhbCA9IGlkcl9nZXRfbmV3KCZlbmRwb2ludF9pZHIsIGVwX2RldiwgJmlkKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlpZiAocmV0dmFsID09IC1FQUdBSU4pCisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCWVwX2Rldi0+bWlub3IgPSBpZCAmIE1BWF9JRF9NQVNLOworZXhpdDoKKwltdXRleF91bmxvY2soJm1pbm9yX2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGVuZHBvaW50X2ZyZWVfbWlub3Ioc3RydWN0IGVwX2RldmljZSAqZXBfZGV2KQoreworCWlkcl9yZW1vdmUoJmVuZHBvaW50X2lkciwgZXBfZGV2LT5taW5vcik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZW5kcG9pbnRfY2xhc3MgewogCXN0cnVjdCBrcmVmIGtyZWY7CiAJc3RydWN0IGNsYXNzICpjbGFzczsKQEAgLTE3NiwxMSArMjMwLDIwIEBACiAJZXBfY2xhc3MtPmNsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAidXNiX2VuZHBvaW50Iik7CiAJaWYgKElTX0VSUihlcF9jbGFzcy0+Y2xhc3MpKSB7CiAJCXJlc3VsdCA9IElTX0VSUihlcF9jbGFzcy0+Y2xhc3MpOwotCQlrZnJlZShlcF9jbGFzcyk7Ci0JCWVwX2NsYXNzID0gTlVMTDsKLQkJZ290byBleGl0OworCQlnb3RvIGNsYXNzX2NyZWF0ZV9lcnJvcjsKIAl9CiAKKwlyZXN1bHQgPSB1c2JfZW5kcG9pbnRfbWFqb3JfaW5pdCgpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZW5kcG9pbnRfbWFqb3JfZXJyb3I7CisKKwlnb3RvIGV4aXQ7CisKK2VuZHBvaW50X21ham9yX2Vycm9yOgorCWNsYXNzX2Rlc3Ryb3koZXBfY2xhc3MtPmNsYXNzKTsKK2NsYXNzX2NyZWF0ZV9lcnJvcjoKKwlrZnJlZShlcF9jbGFzcyk7CisJZXBfY2xhc3MgPSBOVUxMOwogZXhpdDoKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTkxLDYgKzI1NCw3IEBACiAJY2xhc3NfZGVzdHJveShlcF9jbGFzcy0+Y2xhc3MpOwogCWtmcmVlKGVwX2NsYXNzKTsKIAllcF9jbGFzcyA9IE5VTEw7CisJdXNiX2VuZHBvaW50X21ham9yX2NsZWFudXAoKTsKIH0KIAogc3RhdGljIHZvaWQgZGVzdHJveV9lbmRwb2ludF9jbGFzcyh2b2lkKQpAQCAtMjEzLDcgKzI3Nyw2IEBACiB7CiAJY2hhciBuYW1lWzhdOwogCXN0cnVjdCBlcF9kZXZpY2UgKmVwX2RldjsKLQlpbnQgbWlub3I7CiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IGluaXRfZW5kcG9pbnRfY2xhc3MoKTsKQEAgLTIyMywxNSArMjg2LDE5IEBACiAJZXBfZGV2ID0ga3phbGxvYyhzaXplb2YoKmVwX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZXBfZGV2KSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKKwkJZ290byBlcnJvcl9hbGxvYzsKIAl9CiAKLQkvKiBmdW4gY2FsY3VsYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBtaW5vciBvZiB0aGlzIGVuZHBvaW50ICovCi0JbWlub3IgPSAoKCh1ZGV2LT5idXMtPmJ1c251bSAtIDEpICogMTI4KSAqIDE2KSArICh1ZGV2LT5kZXZudW0gLSAxKTsKKwlyZXR2YWwgPSBlbmRwb2ludF9nZXRfbWlub3IoZXBfZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIocGFyZW50LCAiY2FuIG5vdCBhbGxvY2F0ZSBtaW5vciBudW1iZXIgZm9yICVzIiwKKwkJCWVwX2Rldi0+ZGV2LmJ1c19pZCk7CisJCWdvdG8gZXJyb3JfcmVnaXN0ZXI7CisJfQogCiAJZXBfZGV2LT5kZXNjID0gJmVuZHBvaW50LT5kZXNjOwogCWVwX2Rldi0+dWRldiA9IHVkZXY7Ci0JZXBfZGV2LT5kZXYuZGV2dCA9IE1LREVWKDQ0MiwgbWlub3IpOwkvLyBGSVhNRSBmYWtlIG51bWJlci4uLgorCWVwX2Rldi0+ZGV2LmRldnQgPSBNS0RFVih1c2JfZW5kcG9pbnRfbWFqb3IsIGVwX2Rldi0+bWlub3IpOwogCWVwX2Rldi0+ZGV2LmNsYXNzID0gZXBfY2xhc3MtPmNsYXNzOwogCWVwX2Rldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKIAllcF9kZXYtPmRldi5yZWxlYXNlID0gZXBfZGV2aWNlX3JlbGVhc2U7CkBAIC0yNDEsNDkgKzMwOCw1MCBAQAogCiAJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKCZlcF9kZXYtPmRldik7CiAJaWYgKHJldHZhbCkKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJvcl9jaHJkZXY7CiAJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZlcF9kZXYtPmRldi5rb2JqLCAmZXBfZGV2X2F0dHJfZ3JwKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yX2dyb3VwOwogCi0JZW5kcG9pbnQtPmVwX2RldiA9IGVwX2RldjsKLQogCS8qIGNyZWF0ZSB0aGUgc3ltbGluayB0byB0aGUgb2xkLXN0eWxlICJlcF9YWCIgZGlyZWN0b3J5ICovCiAJc3ByaW50ZihuYW1lLCAiZXBfJTAyeCIsIGVuZHBvaW50LT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwYXJlbnQtPmtvYmosCi0JCQkJICAgJmVuZHBvaW50LT5lcF9kZXYtPmRldi5rb2JqLCBuYW1lKTsKKwlyZXR2YWwgPSBzeXNmc19jcmVhdGVfbGluaygmcGFyZW50LT5rb2JqLCAmZXBfZGV2LT5kZXYua29iaiwgbmFtZSk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJvcl9saW5rOwotZXhpdDoKKwllbmRwb2ludC0+ZXBfZGV2ID0gZXBfZGV2OwogCXJldHVybiByZXR2YWw7CiAKIGVycm9yX2xpbms6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZlcF9kZXYtPmRldi5rb2JqLCAmZXBfZGV2X2F0dHJfZ3JwKTsKLQogZXJyb3JfZ3JvdXA6CiAJZGV2aWNlX3VucmVnaXN0ZXIoJmVwX2Rldi0+ZGV2KTsKLQllbmRwb2ludC0+ZXBfZGV2ID0gTlVMTDsKIAlkZXN0cm95X2VuZHBvaW50X2NsYXNzKCk7CiAJcmV0dXJuIHJldHZhbDsKLWVycm9yOgorCitlcnJvcl9jaHJkZXY6CisJZW5kcG9pbnRfZnJlZV9taW5vcihlcF9kZXYpOworCitlcnJvcl9yZWdpc3RlcjoKIAlrZnJlZShlcF9kZXYpOworZXJyb3JfYWxsb2M6CiAJZGVzdHJveV9lbmRwb2ludF9jbGFzcygpOworZXhpdDoKIAlyZXR1cm4gcmV0dmFsOwogfQogCiB2b2lkIHVzYl9yZW1vdmVfZXBfZmlsZXMoc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCkKIHsKKwlzdHJ1Y3QgZXBfZGV2aWNlICplcF9kZXYgPSBlbmRwb2ludC0+ZXBfZGV2OwogCi0JaWYgKGVuZHBvaW50LT5lcF9kZXYpIHsKKwlpZiAoZXBfZGV2KSB7CiAJCWNoYXIgbmFtZVs4XTsKIAogCQlzcHJpbnRmKG5hbWUsICJlcF8lMDJ4IiwgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7Ci0JCXN5c2ZzX3JlbW92ZV9saW5rKCZlbmRwb2ludC0+ZXBfZGV2LT5kZXYucGFyZW50LT5rb2JqLCBuYW1lKTsKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZlbmRwb2ludC0+ZXBfZGV2LT5kZXYua29iaiwgJmVwX2Rldl9hdHRyX2dycCk7Ci0JCWRldmljZV91bnJlZ2lzdGVyKCZlbmRwb2ludC0+ZXBfZGV2LT5kZXYpOworCQlzeXNmc19yZW1vdmVfbGluaygmZXBfZGV2LT5kZXYucGFyZW50LT5rb2JqLCBuYW1lKTsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZlcF9kZXYtPmRldi5rb2JqLCAmZXBfZGV2X2F0dHJfZ3JwKTsKKwkJZW5kcG9pbnRfZnJlZV9taW5vcihlcF9kZXYpOworCQlkZXZpY2VfdW5yZWdpc3RlcigmZXBfZGV2LT5kZXYpOwogCQllbmRwb2ludC0+ZXBfZGV2ID0gTlVMTDsKKwkJZGVzdHJveV9lbmRwb2ludF9jbGFzcygpOwogCX0KLQlkZXN0cm95X2VuZHBvaW50X2NsYXNzKCk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggYWZhMmRkMi4uMTAwNjRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC0yNTYsNyArMjU2LDkgQEAKIAkweDA1LCAgICAgICAvKiAgX191OCAgZXBfYkRlc2NyaXB0b3JUeXBlOyBFbmRwb2ludCAqLwogCTB4ODEsICAgICAgIC8qICBfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCiAgCTB4MDMsICAgICAgIC8qICBfX3U4ICBlcF9ibUF0dHJpYnV0ZXM7IEludGVycnVwdCAqLwotIAkweDAyLCAweDAwLCAvKiAgX19sZTE2IGVwX3dNYXhQYWNrZXRTaXplOyAxICsgKE1BWF9ST09UX1BPUlRTIC8gOCkgKi8KKwkJICAgIC8qIF9fbGUxNiBlcF93TWF4UGFja2V0U2l6ZTsgMSArIChNQVhfUk9PVF9QT1JUUyAvIDgpCisJCSAgICAgKiBzZWUgaHViLmM6aHViX2NvbmZpZ3VyZSgpIGZvciBkZXRhaWxzLiAqLworCShVU0JfTUFYQ0hJTERSRU4gKyAxICsgNykgLyA4LCAweDAwLAogCTB4MGMgICAgICAgIC8qICBfX3U4ICBlcF9iSW50ZXJ2YWw7ICgyNTZtcyAtLSB1c2IgMi4wIHNwZWMpICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCA2NmJmZjE4Li4yNjUxYzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTMxLDYgKzMyLDQ3IEBACiAjaW5jbHVkZSAiaGNkLmgiCiAjaW5jbHVkZSAiaHViLmgiCiAKK3N0cnVjdCB1c2JfaHViIHsKKwlzdHJ1Y3QgZGV2aWNlCQkqaW50ZmRldjsJLyogdGhlICJpbnRlcmZhY2UiIGRldmljZSAqLworCXN0cnVjdCB1c2JfZGV2aWNlCSpoZGV2OworCXN0cnVjdCB1cmIJCSp1cmI7CQkvKiBmb3IgaW50ZXJydXB0IHBvbGxpbmcgcGlwZSAqLworCisJLyogYnVmZmVyIGZvciB1cmIgLi4uIHdpdGggZXh0cmEgc3BhY2UgaW4gY2FzZSBvZiBiYWJibGUgKi8KKwljaGFyCQkJKCpidWZmZXIpWzhdOworCWRtYV9hZGRyX3QJCWJ1ZmZlcl9kbWE7CS8qIERNQSBhZGRyZXNzIGZvciBidWZmZXIgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB1c2JfaHViX3N0YXR1cwlodWI7CisJCXN0cnVjdCB1c2JfcG9ydF9zdGF0dXMJcG9ydDsKKwl9CQkJKnN0YXR1czsJLyogYnVmZmVyIGZvciBzdGF0dXMgcmVwb3J0cyAqLworCisJaW50CQkJZXJyb3I7CQkvKiBsYXN0IHJlcG9ydGVkIGVycm9yICovCisJaW50CQkJbmVycm9yczsJLyogdHJhY2sgY29uc2VjdXRpdmUgZXJyb3JzICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWV2ZW50X2xpc3Q7CS8qIGh1YnMgdy9kYXRhIG9yIGVycnMgcmVhZHkgKi8KKwl1bnNpZ25lZCBsb25nCQlldmVudF9iaXRzWzFdOwkvKiBzdGF0dXMgY2hhbmdlIGJpdG1hc2sgKi8KKwl1bnNpZ25lZCBsb25nCQljaGFuZ2VfYml0c1sxXTsJLyogcG9ydHMgd2l0aCBsb2dpY2FsIGNvbm5lY3QKKwkJCQkJCQlzdGF0dXMgY2hhbmdlICovCisJdW5zaWduZWQgbG9uZwkJYnVzeV9iaXRzWzFdOwkvKiBwb3J0cyBiZWluZyByZXNldCBvcgorCQkJCQkJCXJlc3VtZWQgKi8KKyNpZiBVU0JfTUFYQ0hJTERSRU4gPiAzMSAvKiA4KnNpemVvZih1bnNpZ25lZCBsb25nKSAtIDEgKi8KKyNlcnJvciBldmVudF9iaXRzW10gaXMgdG9vIHNob3J0IQorI2VuZGlmCisKKwlzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICpkZXNjcmlwdG9yOwkvKiBjbGFzcyBkZXNjcmlwdG9yICovCisJc3RydWN0IHVzYl90dAkJdHQ7CQkvKiBUcmFuc2FjdGlvbiBUcmFuc2xhdG9yICovCisKKwl1bnNpZ25lZAkJbUFfcGVyX3BvcnQ7CS8qIGN1cnJlbnQgZm9yIGVhY2ggY2hpbGQgKi8KKworCXVuc2lnbmVkCQlsaW1pdGVkX3Bvd2VyOjE7CisJdW5zaWduZWQJCXF1aWVzY2luZzoxOworCXVuc2lnbmVkCQlhY3RpdmF0aW5nOjE7CisKKwl1bnNpZ25lZAkJaGFzX2luZGljYXRvcnM6MTsKKwl1OAkJCWluZGljYXRvcltVU0JfTUFYQ0hJTERSRU5dOworCXN0cnVjdCBkZWxheWVkX3dvcmsJbGVkczsKK307CisKKwogLyogUHJvdGVjdCBzdHJ1Y3QgdXNiX2RldmljZS0+c3RhdGUgYW5kIC0+Y2hpbGRyZW4gbWVtYmVycwogICogTm90ZTogQm90aCBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgLT5kZXYuc2VtLCBleGNlcHQgdGhhdCAtPnN0YXRlIGNhbgogICogY2hhbmdlIHRvIFVTQl9TVEFURV9OT1RBVFRBQ0hFRCBldmVuIHdoZW4gdGhlIHNlbWFwaG9yZSBpc24ndCBoZWxkLiAqLwpAQCAtNDUsNiArODcsMTYgQEAKIAogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa2h1YmRfdGFzazsKIAorLyogbXVsdGl0aHJlYWRlZCBwcm9iZSBsb2dpYyAqLworc3RhdGljIGludCBtdWx0aXRocmVhZF9wcm9iZSA9CisjaWZkZWYgQ09ORklHX1VTQl9NVUxUSVRIUkVBRF9QUk9CRQorCTE7CisjZWxzZQorCTA7CisjZW5kaWYKK21vZHVsZV9wYXJhbShtdWx0aXRocmVhZF9wcm9iZSwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpdGhyZWFkX3Byb2JlLCAiUnVuIGVhY2ggVVNCIGRldmljZSBwcm9iZSBpbiBhIG5ldyB0aHJlYWQiKTsKKwogLyogY3ljbGUgbGVkcyBvbiBodWJzIHRoYXQgYXJlbid0IGJsaW5raW5nIGZvciBhdHRlbnRpb24gKi8KIHN0YXRpYyBpbnQgYmxpbmtlbmxpZ2h0cyA9IDA7CiBtb2R1bGVfcGFyYW0gKGJsaW5rZW5saWdodHMsIGJvb2wsIFNfSVJVR08pOwpAQCAtMTY3LDkgKzIxOSwxMCBAQAogCiAjZGVmaW5lCUxFRF9DWUNMRV9QRVJJT0QJKCgyKkhaKS8zKQogCi1zdGF0aWMgdm9pZCBsZWRfd29yayAodm9pZCAqX19odWIpCitzdGF0aWMgdm9pZCBsZWRfd29yayAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB1c2JfaHViCQkqaHViID0gX19odWI7CisJc3RydWN0IHVzYl9odWIJCSpodWIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYl9odWIsIGxlZHMud29yayk7CiAJc3RydWN0IHVzYl9kZXZpY2UJKmhkZXYgPSBodWItPmhkZXY7CiAJdW5zaWduZWQJCWk7CiAJdW5zaWduZWQJCWNoYW5nZWQgPSAwOwpAQCAtMjc2LDYgKzMyOSw5IEBACiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAorCS8qIFN1cHByZXNzIGF1dG9zdXNwZW5kIHVudGlsIGtodWJkIHJ1bnMgKi8KKwl0b191c2JfaW50ZXJmYWNlKGh1Yi0+aW50ZmRldiktPnBtX3VzYWdlX2NudCA9IDE7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHViX2V2ZW50X2xvY2ssIGZsYWdzKTsKIAlpZiAobGlzdF9lbXB0eSgmaHViLT5ldmVudF9saXN0KSkgewogCQlsaXN0X2FkZF90YWlsKCZodWItPmV2ZW50X2xpc3QsICZodWJfZXZlbnRfbGlzdCk7CkBAIC0zNTEsOSArNDA3LDEwIEBACiAgKiB0YWxraW5nIHRvIFRUcyBtdXN0IHF1ZXVlIGNvbnRyb2wgdHJhbnNmZXJzIChub3QganVzdCBidWxrIGFuZCBpc28pLCBzbwogICogYm90aCBjYW4gdGFsayB0byB0aGUgc2FtZSBodWIgY29uY3VycmVudGx5LgogICovCi1zdGF0aWMgdm9pZCBodWJfdHRfa2V2ZW50ICh2b2lkICphcmcpCitzdGF0aWMgdm9pZCBodWJfdHRfa2V2ZW50IChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHVzYl9odWIJCSpodWIgPSBhcmc7CisJc3RydWN0IHVzYl9odWIJCSpodWIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYl9odWIsIHR0LmtldmVudCk7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmh1Yi0+dHQubG9jaywgZmxhZ3MpOwpAQCAtNDA0LDcgKzQ2MSw3IEBACiAJICogc2luY2UgZWFjaCBUVCBoYXMgImF0IGxlYXN0IHR3byIgYnVmZmVycyB0aGF0IGNhbiBuZWVkIGl0IChhbmQKIAkgKiB0aGVyZSBjYW4gYmUgbWFueSBUVHMgcGVyIGh1YikuICBldmVuIGlmIHRoZXkncmUgdW5jb21tb24uCiAJICovCi0JaWYgKChjbGVhciA9IGttYWxsb2MgKHNpemVvZiAqY2xlYXIsIFNMQUJfQVRPTUlDKSkgPT0gTlVMTCkgeworCWlmICgoY2xlYXIgPSBrbWFsbG9jIChzaXplb2YgKmNsZWFyLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewogCQlkZXZfZXJyICgmdWRldi0+ZGV2LCAiY2FuJ3Qgc2F2ZSBDTEVBUl9UVF9CVUZGRVIgc3RhdGVcbiIpOwogCQkvKiBGSVhNRSByZWNvdmVyIHNvbWVob3cgLi4uIFJFU0VUX1RUPyAqLwogCQlyZXR1cm47CkBAIC00NTcsNyArNTE0LDYgQEAKIAkvKiAobm9uYmxvY2tpbmcpIGtodWJkIGFuZCByZWxhdGVkIGFjdGl2aXR5IHdvbid0IHJlLXRyaWdnZXIgKi8KIAlodWItPnF1aWVzY2luZyA9IDE7CiAJaHViLT5hY3RpdmF0aW5nID0gMDsKLQlodWItPnJlc3VtZV9yb290X2h1YiA9IDA7CiAKIAkvKiAoYmxvY2tpbmcpIHN0b3Aga2h1YmQgYW5kIHJlbGF0ZWQgYWN0aXZpdHkgKi8KIAl1c2Jfa2lsbF91cmIoaHViLT51cmIpOwpAQCAtNDczLDcgKzUyOSw3IEBACiAKIAlodWItPnF1aWVzY2luZyA9IDA7CiAJaHViLT5hY3RpdmF0aW5nID0gMTsKLQlodWItPnJlc3VtZV9yb290X2h1YiA9IDA7CisKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihodWItPnVyYiwgR0ZQX05PSU8pOwogCWlmIChzdGF0dXMgPCAwKQogCQlkZXZfZXJyKGh1Yi0+aW50ZmRldiwgImFjdGl2YXRlIC0tPiAlZFxuIiwgc3RhdHVzKTsKQEAgLTY0MSw3ICs2OTcsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQgKCZodWItPnR0LmxvY2spOwogCUlOSVRfTElTVF9IRUFEICgmaHViLT50dC5jbGVhcl9saXN0KTsKLQlJTklUX1dPUksgKCZodWItPnR0LmtldmVudCwgaHViX3R0X2tldmVudCwgaHViKTsKKwlJTklUX1dPUksgKCZodWItPnR0LmtldmVudCwgaHViX3R0X2tldmVudCk7CiAJc3dpdGNoIChoZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCkgewogCQljYXNlIDA6CiAJCQlicmVhazsKQEAgLTc1OSw3ICs4MTUsMTIgQEAKIAkJZGV2X2RiZyhodWJfZGV2LCAiJXNvdmVyLWN1cnJlbnQgY29uZGl0aW9uIGV4aXN0c1xuIiwKIAkJCShodWJzdGF0dXMgJiBIVUJfU1RBVFVTX09WRVJDVVJSRU5UKSA/ICIiIDogIm5vICIpOwogCi0JLyogc2V0IHVwIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KKwkvKiBzZXQgdXAgdGhlIGludGVycnVwdCBlbmRwb2ludAorCSAqIFdlIHVzZSB0aGUgRVAncyBtYXhwYWNrZXQgc2l6ZSBpbnN0ZWFkIG9mIChQT1JUUysxKzcpLzgKKwkgKiBieXRlcyBhcyBVU0IyLjBbMTEuMTIuM10gc2F5cyBiZWNhdXNlIHNvbWUgaHVicyBhcmUga25vd24KKwkgKiB0byBzZW5kIG1vcmUgZGF0YSAoYW5kIHRodXMgY2F1c2Ugb3ZlcmZsb3cpLiBGb3Igcm9vdCBodWJzLAorCSAqIG1heHBrdHNpemUgaXMgZGVmaW5lZCBpbiBoY2QuYydzIGZha2UgZW5kcG9pbnQgZGVzY3JpcHRvcnMKKwkgKiB0byBiZSBiaWcgZW5vdWdoIGZvciBhdCBsZWFzdCBVU0JfTUFYQ0hJTERSRU4gcG9ydHMuICovCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGhkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKIAltYXhwID0gdXNiX21heHBhY2tldChoZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CiAKQEAgLTg4MCw5ICs5NDEsMTAgQEAKIAlJTklUX0xJU1RfSEVBRCgmaHViLT5ldmVudF9saXN0KTsKIAlodWItPmludGZkZXYgPSAmaW50Zi0+ZGV2OwogCWh1Yi0+aGRldiA9IGhkZXY7Ci0JSU5JVF9XT1JLKCZodWItPmxlZHMsIGxlZF93b3JrLCBodWIpOworCUlOSVRfREVMQVlFRF9XT1JLKCZodWItPmxlZHMsIGxlZF93b3JrKTsKIAogCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIGh1Yik7CisJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7CiAKIAlpZiAoaGRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCWhpZ2hzcGVlZF9odWJzKys7CkBAIC05ODAsNiArMTA0Miw4IEBACiAJCWlmICh1ZGV2LT5jaGlsZHJlbltpXSkKIAkJCXJlY3Vyc2l2ZWx5X21hcmtfTk9UQVRUQUNIRUQodWRldi0+Y2hpbGRyZW5baV0pOwogCX0KKwlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKKwkJdWRldi0+ZGlzY29uX3N1c3BlbmRlZCA9IDE7CiAJdWRldi0+c3RhdGUgPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQ7CiB9CiAKQEAgLTExNjksNiArMTIzMywxNCBAQAogCSpwZGV2ID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnEoJmRldmljZV9zdGF0ZV9sb2NrKTsKIAorCS8qIERlY3JlbWVudCB0aGUgcGFyZW50J3MgY291bnQgb2YgdW5zdXNwZW5kZWQgY2hpbGRyZW4gKi8KKwlpZiAodWRldi0+cGFyZW50KSB7CisJCXVzYl9wbV9sb2NrKHVkZXYpOworCQlpZiAoIXVkZXYtPmRpc2Nvbl9zdXNwZW5kZWQpCisJCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYtPnBhcmVudCk7CisJCXVzYl9wbV91bmxvY2sodWRldik7CisJfQorCiAJcHV0X2RldmljZSgmdWRldi0+ZGV2KTsKIH0KIApAQCAtMTE4OCwzMSArMTI2MCwyMCBAQAogCiAjaWZkZWYJQ09ORklHX1VTQl9PVEcKICNpbmNsdWRlICJvdGdfd2hpdGVsaXN0LmgiCitzdGF0aWMgaW50IF9fdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqLCBpbnQgcG9ydDEpOwogI2VuZGlmCiAKLS8qKgotICogdXNiX25ld19kZXZpY2UgLSBwZXJmb3JtIGluaXRpYWwgZGV2aWNlIHNldHVwICh1c2Jjb3JlLWludGVybmFsKQotICogQHVkZXY6IG5ld2x5IGFkZHJlc3NlZCBkZXZpY2UgKGluIEFERFJFU1Mgc3RhdGUpCi0gKgotICogVGhpcyBpcyBjYWxsZWQgd2l0aCBkZXZpY2VzIHdoaWNoIGhhdmUgYmVlbiBlbnVtZXJhdGVkLCBidXQgbm90IHlldAotICogY29uZmlndXJlZC4gIFRoZSBkZXZpY2UgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUsIGJ1dCBub3QgZGVzY3JpcHRvcnMKLSAqIGZvciBhbnkgZGV2aWNlIGNvbmZpZ3VyYXRpb24uICBUaGUgY2FsbGVyIG11c3QgaGF2ZSBsb2NrZWQgZWl0aGVyCi0gKiB0aGUgcGFyZW50IGh1YiAoaWYgdWRldiBpcyBhIG5vcm1hbCBkZXZpY2UpIG9yIGVsc2UgdGhlCi0gKiB1c2JfYnVzX2xpc3RfbG9jayAoaWYgdWRldiBpcyBhIHJvb3QgaHViKS4gIFRoZSBwYXJlbnQncyBwb2ludGVyIHRvCi0gKiB1ZGV2IGhhcyBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkLCBidXQgdWRldiBpcyBub3QgeWV0IHZpc2libGUgdGhyb3VnaAotICogc3lzZnMgb3Igb3RoZXIgZmlsZXN5c3RlbSBjb2RlLgotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyAoZGV2aWNlIGlzIGNvbmZpZ3VyZWQgYW5kIGxpc3RlZCwgd2l0aCBpdHMKLSAqIGludGVyZmFjZXMsIGluIHN5c2ZzKTsgZWxzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlLgotICoKLSAqIFRoaXMgY2FsbCBpcyBzeW5jaHJvbm91cywgYW5kIG1heSBub3QgYmUgdXNlZCBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dC4KLSAqCi0gKiBPbmx5IHRoZSBodWIgZHJpdmVyIG9yIHJvb3QtaHViIHJlZ2lzdHJhciBzaG91bGQgZXZlciBjYWxsIHRoaXMuCi0gKi8KLWludCB1c2JfbmV3X2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyBpbnQgX191c2JfbmV3X2RldmljZSh2b2lkICp2b2lkX2RhdGEpCiB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB2b2lkX2RhdGE7CiAJaW50IGVycjsKIAorCS8qIExvY2sgb3Vyc2VsZiBpbnRvIG1lbW9yeSBpbiBvcmRlciB0byBrZWVwIGEgcHJvYmUgc2VxdWVuY2UKKwkgKiBzbGVlcGluZyBpbiBhIG5ldyB0aHJlYWQgZnJvbSBhbGxvd2luZyB1cyB0byBiZSB1bmxvYWRlZC4KKwkgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAllcnIgPSB1c2JfZ2V0X2NvbmZpZ3VyYXRpb24odWRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2VycigmdWRldi0+ZGV2LCAiY2FuJ3QgcmVhZCBjb25maWd1cmF0aW9ucywgZXJyb3IgJWRcbiIsCkBAIC0xMjg5LDggKzEzNTAsNiBAQAogCQkgKiAoSW5jbHVkZXMgSE5QIHRlc3QgZGV2aWNlLikKIAkJICovCiAJCWlmICh1ZGV2LT5idXMtPmJfaG5wX2VuYWJsZSB8fCB1ZGV2LT5idXMtPmlzX2JfaG9zdCkgewotCQkJc3RhdGljIGludCBfX3VzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKiwKLQkJCQkJCWludCBwb3J0MSk7CiAJCQllcnIgPSBfX3VzYl9wb3J0X3N1c3BlbmQodWRldiwgdWRldi0+YnVzLT5vdGdfcG9ydCk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJITlAgZmFpbCwgJWRcbiIsIGVycik7CkBAIC0xMzEwLDEzICsxMzY5LDU2IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlyZXR1cm4gMDsKKwkvKiBJbmNyZW1lbnQgdGhlIHBhcmVudCdzIGNvdW50IG9mIHVuc3VzcGVuZGVkIGNoaWxkcmVuICovCisJaWYgKHVkZXYtPnBhcmVudCkKKwkJdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYtPnBhcmVudCk7CisKK2V4aXQ6CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJcmV0dXJuIGVycjsKIAogZmFpbDoKIAl1c2Jfc2V0X2RldmljZV9zdGF0ZSh1ZGV2LCBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOwotCXJldHVybiBlcnI7CisJZ290byBleGl0OwogfQogCisvKioKKyAqIHVzYl9uZXdfZGV2aWNlIC0gcGVyZm9ybSBpbml0aWFsIGRldmljZSBzZXR1cCAodXNiY29yZS1pbnRlcm5hbCkKKyAqIEB1ZGV2OiBuZXdseSBhZGRyZXNzZWQgZGV2aWNlIChpbiBBRERSRVNTIHN0YXRlKQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdpdGggZGV2aWNlcyB3aGljaCBoYXZlIGJlZW4gZW51bWVyYXRlZCwgYnV0IG5vdCB5ZXQKKyAqIGNvbmZpZ3VyZWQuICBUaGUgZGV2aWNlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlLCBidXQgbm90IGRlc2NyaXB0b3JzCisgKiBmb3IgYW55IGRldmljZSBjb25maWd1cmF0aW9uLiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgbG9ja2VkIGVpdGhlcgorICogdGhlIHBhcmVudCBodWIgKGlmIHVkZXYgaXMgYSBub3JtYWwgZGV2aWNlKSBvciBlbHNlIHRoZQorICogdXNiX2J1c19saXN0X2xvY2sgKGlmIHVkZXYgaXMgYSByb290IGh1YikuICBUaGUgcGFyZW50J3MgcG9pbnRlciB0bworICogdWRldiBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZCwgYnV0IHVkZXYgaXMgbm90IHlldCB2aXNpYmxlIHRocm91Z2gKKyAqIHN5c2ZzIG9yIG90aGVyIGZpbGVzeXN0ZW0gY29kZS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGZvciB0aGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gaWYgdGhlCisgKiBtdWx0aXRocmVhZF9wcm9iZSB2YXJpYWJsZSBpcyBzZXQgb3Igbm90LiAgSWYgaXQncyBzZXQsIGl0IHdpbGwKKyAqIHJldHVybiBhIGlmIHRoZSBwcm9iZSB0aHJlYWQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIG9yIG5vdC4gIElmIHRoZQorICogdmFyaWFibGUgaXMgbm90IHNldCwgaXQgd2lsbCByZXR1cm4gaWYgdGhlIGRldmljZSBpcyBjb25maWd1cmVkCisgKiBwcm9wZXJseSBvciBub3QuICBpbnRlcmZhY2VzLCBpbiBzeXNmcyk7IGVsc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KKyAqCisgKiBUaGlzIGNhbGwgaXMgc3luY2hyb25vdXMsIGFuZCBtYXkgbm90IGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogT25seSB0aGUgaHViIGRyaXZlciBvciByb290LWh1YiByZWdpc3RyYXIgc2hvdWxkIGV2ZXIgY2FsbCB0aGlzLgorICovCitpbnQgdXNiX25ld19kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwcm9iZV90YXNrOworCWludCByZXQgPSAwOworCisJaWYgKG11bHRpdGhyZWFkX3Byb2JlKSB7CisJCXByb2JlX3Rhc2sgPSBrdGhyZWFkX3J1bihfX3VzYl9uZXdfZGV2aWNlLCB1ZGV2LAorCQkJCQkgInVzYi1wcm9iZS0lcyIsIHVkZXYtPmRldm51bSk7CisJCWlmIChJU19FUlIocHJvYmVfdGFzaykpCisJCQlyZXQgPSBQVFJfRVJSKHByb2JlX3Rhc2spOworCX0gZWxzZQorCQlyZXQgPSBfX3VzYl9uZXdfZGV2aWNlKHVkZXYpOworCisJcmV0dXJuIHJldDsKK30KIAogc3RhdGljIGludCBodWJfcG9ydF9zdGF0dXMoc3RydWN0IHVzYl9odWIgKmh1YiwgaW50IHBvcnQxLAogCQkJICAgICAgIHUxNiAqc3RhdHVzLCB1MTYgKmNoYW5nZSkKQEAgLTEzMjQsMTAgKzE0MjYsMTIgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gZ2V0X3BvcnRfc3RhdHVzKGh1Yi0+aGRldiwgcG9ydDEsICZodWItPnN0YXR1cy0+cG9ydCk7Ci0JaWYgKHJldCA8IDApCisJaWYgKHJldCA8IDQpIHsKIAkJZGV2X2VyciAoaHViLT5pbnRmZGV2LAogCQkJIiVzIGZhaWxlZCAoZXJyID0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0JZWxzZSB7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FSU87CisJfSBlbHNlIHsKIAkJKnN0YXR1cyA9IGxlMTZfdG9fY3B1KGh1Yi0+c3RhdHVzLT5wb3J0LndQb3J0U3RhdHVzKTsKIAkJKmNoYW5nZSA9IGxlMTZfdG9fY3B1KGh1Yi0+c3RhdHVzLT5wb3J0LndQb3J0Q2hhbmdlKTsgCiAJCXJldCA9IDA7CkBAIC0xNjc1LDYgKzE3NzksMTIgQEAKIGh1Yl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2h1YiAqaHViLCBpbnQgcG9ydDEsIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludAlzdGF0dXM7CisJdTE2CXBvcnRjaGFuZ2UsIHBvcnRzdGF0dXM7CisKKwkvKiBTa2lwIHRoZSBpbml0aWFsIENsZWFyLVN1c3BlbmQgc3RlcCBmb3IgYSByZW1vdGUgd2FrZXVwICovCisJc3RhdHVzID0gaHViX3BvcnRfc3RhdHVzKGh1YiwgcG9ydDEsICZwb3J0c3RhdHVzLCAmcG9ydGNoYW5nZSk7CisJaWYgKHN0YXR1cyA9PSAwICYmICEocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfU1VTUEVORCkpCisJCWdvdG8gU3VzcGVuZENsZWFyZWQ7CiAKIAkvLyBkZXZfZGJnKGh1Yi0+aW50ZmRldiwgInJlc3VtZSBwb3J0ICVkXG4iLCBwb3J0MSk7CiAKQEAgLTE2ODgsOSArMTc5OCw2IEBACiAJCQkiY2FuJ3QgcmVzdW1lIHBvcnQgJWQsIHN0YXR1cyAlZFxuIiwKIAkJCXBvcnQxLCBzdGF0dXMpOwogCX0gZWxzZSB7Ci0JCXUxNgkJZGV2c3RhdHVzOwotCQl1MTYJCXBvcnRjaGFuZ2U7Ci0KIAkJLyogZHJpdmUgcmVzdW1lIGZvciBhdCBsZWFzdCAyMCBtc2VjICovCiAJCWlmICh1ZGV2KQogCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAidXNiICVzcmVzdW1lXG4iLApAQCAtMTcwNSwxNiArMTgxMiwxNSBAQAogCQkgKiBzdG9wIHJlc3VtZSBzaWduYWxpbmcuICBUaGVuIGZpbmlzaCB0aGUgcmVzdW1lCiAJCSAqIHNlcXVlbmNlLgogCQkgKi8KLQkJZGV2c3RhdHVzID0gcG9ydGNoYW5nZSA9IDA7Ci0JCXN0YXR1cyA9IGh1Yl9wb3J0X3N0YXR1cyhodWIsIHBvcnQxLAotCQkJCSZkZXZzdGF0dXMsICZwb3J0Y2hhbmdlKTsKKwkJc3RhdHVzID0gaHViX3BvcnRfc3RhdHVzKGh1YiwgcG9ydDEsICZwb3J0c3RhdHVzLCAmcG9ydGNoYW5nZSk7CitTdXNwZW5kQ2xlYXJlZDoKIAkJaWYgKHN0YXR1cyA8IDAKLQkJCQl8fCAoZGV2c3RhdHVzICYgTElWRV9GTEFHUykgIT0gTElWRV9GTEFHUwotCQkJCXx8IChkZXZzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpICE9IDAKKwkJCQl8fCAocG9ydHN0YXR1cyAmIExJVkVfRkxBR1MpICE9IExJVkVfRkxBR1MKKwkJCQl8fCAocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfU1VTUEVORCkgIT0gMAogCQkJCSkgewogCQkJZGV2X2RiZyhodWItPmludGZkZXYsCiAJCQkJInBvcnQgJWQgc3RhdHVzICUwNHguJTA0eCBhZnRlciByZXN1bWUsICVkXG4iLAotCQkJCXBvcnQxLCBwb3J0Y2hhbmdlLCBkZXZzdGF0dXMsIHN0YXR1cyk7CisJCQkJcG9ydDEsIHBvcnRjaGFuZ2UsIHBvcnRzdGF0dXMsIHN0YXR1cyk7CiAJCQlpZiAoc3RhdHVzID49IDApCiAJCQkJc3RhdHVzID0gLUVOT0RFVjsKIAkJfSBlbHNlIHsKQEAgLTE3NzUsMjMgKzE4ODEsMTYgQEAKIHsKIAlpbnQJc3RhdHVzID0gMDsKIAotCS8qIEFsbCB0aGlzIGp1c3QgdG8gYXZvaWQgc2VuZGluZyBhIHBvcnQtcmVzdW1lIG1lc3NhZ2UKLQkgKiB0byB0aGUgcGFyZW50IGh1YiEgKi8KLQogCXVzYl9sb2NrX2RldmljZSh1ZGV2KTsKLQl1c2JfcG1fbG9jayh1ZGV2KTsKIAlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkgewogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2IgJXNyZXN1bWVcbiIsICJ3YWtldXAtIik7Ci0JCS8qIFRSU01SQ1kgPSAxMCBtc2VjICovCi0JCW1zbGVlcCgxMCk7Ci0JCXN0YXR1cyA9IGZpbmlzaF9wb3J0X3Jlc3VtZSh1ZGV2KTsKLQkJaWYgKHN0YXR1cyA9PSAwKQotCQkJdWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfT047Ci0JfQotCXVzYl9wbV91bmxvY2sodWRldik7CisJCXN0YXR1cyA9IHVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2KTsKIAotCWlmIChzdGF0dXMgPT0gMCkKLQkJdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYsIDApOworCQkvKiBHaXZlIHRoZSBpbnRlcmZhY2UgZHJpdmVycyBhIGNoYW5jZSB0byBkbyBzb21ldGhpbmcsCisJCSAqIHRoZW4gYXV0b3N1c3BlbmQgdGhlIGRldmljZSBhZ2Fpbi4gKi8KKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KTsKKwl9CiAJdXNiX3VubG9ja19kZXZpY2UodWRldik7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE4NTUsNiArMTk1NCw4IEBACiAJCX0KIAl9CiAKKwlkZXZfZGJnKCZpbnRmLT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwogCS8qICJnbG9iYWwgc3VzcGVuZCIgb2YgdGhlIGRvd25zdHJlYW0gSEMtdG8tVVNCIGludGVyZmFjZSAqLwogCWlmICghaGRldi0+cGFyZW50KSB7CiAJCXN0cnVjdCB1c2JfYnVzCSpidXMgPSBoZGV2LT5idXM7CkBAIC0xODc3LDEwICsxOTc4LDEyIEBACiAKIHN0YXRpYyBpbnQgaHViX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQlzdHJ1Y3QgdXNiX2RldmljZQkqaGRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJc3RydWN0IHVzYl9odWIJCSpodWIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwlzdHJ1Y3QgdXNiX2RldmljZQkqaGRldiA9IGh1Yi0+aGRldjsKIAlpbnQJCQlzdGF0dXM7CiAKKwlkZXZfZGJnKCZpbnRmLT5kZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwogCS8qICJnbG9iYWwgcmVzdW1lIiBvZiB0aGUgZG93bnN0cmVhbSBIQy10by1VU0IgaW50ZXJmYWNlICovCiAJaWYgKCFoZGV2LT5wYXJlbnQpIHsKIAkJc3RydWN0IHVzYl9idXMJKmJ1cyA9IGhkZXYtPmJ1czsKQEAgLTE5MTksNyArMjAyMiw2IEBACiB7CiAJc3RydWN0IHVzYl9odWIgKmh1YiA9IGhkZXZfdG9faHViKGhkZXYpOwogCi0JaHViLT5yZXN1bWVfcm9vdF9odWIgPSAxOwogCWtpY2tfa2h1YmQoaHViKTsKIH0KIApAQCAtMjI3MCw3ICsyMzcyLDcgQEAKIAlzdHJ1Y3QgdXNiX3F1YWxpZmllcl9kZXNjcmlwdG9yCSpxdWFsOwogCWludAkJCQlzdGF0dXM7CiAKLQlxdWFsID0ga21hbGxvYyAoc2l6ZW9mICpxdWFsLCBTTEFCX0tFUk5FTCk7CisJcXVhbCA9IGttYWxsb2MgKHNpemVvZiAqcXVhbCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHF1YWwgPT0gTlVMTCkKIAkJcmV0dXJuOwogCkBAIC0yMjgyLDcgKzIzODQsNyBAQAogCQkvKiBodWIgTEVEcyBhcmUgcHJvYmFibHkgaGFyZGVyIHRvIG1pc3MgdGhhbiBzeXNsb2cgKi8KIAkJaWYgKGh1Yi0+aGFzX2luZGljYXRvcnMpIHsKIAkJCWh1Yi0+aW5kaWNhdG9yW3BvcnQxLTFdID0gSU5ESUNBVE9SX0dSRUVOX0JMSU5LOwotCQkJc2NoZWR1bGVfd29yayAoJmh1Yi0+bGVkcyk7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsgKCZodWItPmxlZHMsIDApOwogCQl9CiAJfQogCWtmcmVlKHF1YWwpOwpAQCAtMjQ1Niw3ICsyNTU4LDcgQEAKIAkJCQlpZiAoaHViLT5oYXNfaW5kaWNhdG9ycykgewogCQkJCQlodWItPmluZGljYXRvcltwb3J0MS0xXSA9CiAJCQkJCQlJTkRJQ0FUT1JfQU1CRVJfQkxJTks7Ci0JCQkJCXNjaGVkdWxlX3dvcmsgKCZodWItPmxlZHMpOworCQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsgKCZodWItPmxlZHMsIDApOwogCQkJCX0KIAkJCQlzdGF0dXMgPSAtRU5PVENPTk47CS8qIERvbid0IHJldHJ5ICovCiAJCQkJZ290byBsb29wX2Rpc2FibGU7CkBAIC0yNTU2LDE2ICsyNjU4LDEzIEBACiAJCWludGYgPSB0b191c2JfaW50ZXJmYWNlKGh1Yi0+aW50ZmRldik7CiAJCWh1Yl9kZXYgPSAmaW50Zi0+ZGV2OwogCi0JCWkgPSBodWItPnJlc3VtZV9yb290X2h1YjsKLQotCQlkZXZfZGJnKGh1Yl9kZXYsICJzdGF0ZSAlZCBwb3J0cyAlZCBjaGcgJTA0eCBldnQgJTA0eCVzXG4iLAorCQlkZXZfZGJnKGh1Yl9kZXYsICJzdGF0ZSAlZCBwb3J0cyAlZCBjaGcgJTA0eCBldnQgJTA0eFxuIiwKIAkJCQloZGV2LT5zdGF0ZSwgaHViLT5kZXNjcmlwdG9yCiAJCQkJCT8gaHViLT5kZXNjcmlwdG9yLT5iTmJyUG9ydHMKIAkJCQkJOiAwLAogCQkJCS8qIE5PVEU6IGV4cGVjdHMgbWF4IDE1IHBvcnRzLi4uICovCiAJCQkJKHUxNikgaHViLT5jaGFuZ2VfYml0c1swXSwKLQkJCQkodTE2KSBodWItPmV2ZW50X2JpdHNbMF0sCi0JCQkJaSA/ICIsIHJlc3VtZSByb290IiA6ICIiKTsKKwkJCQkodTE2KSBodWItPmV2ZW50X2JpdHNbMF0pOwogCiAJCXVzYl9nZXRfaW50ZihpbnRmKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZodWJfZXZlbnRfbG9jayk7CkBAIC0yNTg2LDE2ICsyNjg1LDE2IEBACiAJCQlnb3RvIGxvb3A7CiAJCX0KIAotCQkvKiBJcyB0aGlzIGlzIGEgcm9vdCBodWIgd2FudGluZyB0byByZWFjdGl2YXRlIHRoZSBkb3duc3RyZWFtCi0JCSAqIHBvcnRzPyAgSWYgc28sIGJlIHN1cmUgdGhlIGludGVyZmFjZSByZXN1bWVzIGV2ZW4gaWYgaXRzCi0JCSAqIHN0dWIgImRldmljZSIgbm9kZSB3YXMgbmV2ZXIgc3VzcGVuZGVkLgotCQkgKi8KLQkJaWYgKGkpCi0JCQl1c2JfYXV0b3Jlc3VtZV9kZXZpY2UoaGRldiwgMCk7Ci0KLQkJLyogSWYgdGhpcyBpcyBhbiBpbmFjdGl2ZSBvciBzdXNwZW5kZWQgaHViLCBkbyBub3RoaW5nICovCi0JCWlmIChodWItPnF1aWVzY2luZykKKwkJLyogQXV0b3Jlc3VtZSAqLworCQlyZXQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaW50Zik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9kYmcoaHViX2RldiwgIkNhbid0IGF1dG9yZXN1bWU6ICVkXG4iLCByZXQpOwogCQkJZ290byBsb29wOworCQl9CisKKwkJLyogSWYgdGhpcyBpcyBhbiBpbmFjdGl2ZSBodWIsIGRvIG5vdGhpbmcgKi8KKwkJaWYgKGh1Yi0+cXVpZXNjaW5nKQorCQkJZ290byBsb29wX2F1dG9wbTsKIAogCQlpZiAoaHViLT5lcnJvcikgewogCQkJZGV2X2RiZyAoaHViX2RldiwgInJlc2V0dGluZyBmb3IgZXJyb3IgJWRcbiIsCkBAIC0yNjA1LDcgKzI3MDQsNyBAQAogCQkJaWYgKHJldCkgewogCQkJCWRldl9kYmcgKGh1Yl9kZXYsCiAJCQkJCSJlcnJvciByZXNldHRpbmcgaHViOiAlZFxuIiwgcmV0KTsKLQkJCQlnb3RvIGxvb3A7CisJCQkJZ290byBsb29wX2F1dG9wbTsKIAkJCX0KIAogCQkJaHViLT5uZXJyb3JzID0gMDsKQEAgLTI3MzMsNiArMjgzMiwxMCBAQAogCQlpZiAoIWhkZXYtPnBhcmVudCAmJiAhaHViLT5idXN5X2JpdHNbMF0pCiAJCQl1c2JfZW5hYmxlX3Jvb3RfaHViX2lycShoZGV2LT5idXMpOwogCitsb29wX2F1dG9wbToKKwkJLyogQWxsb3cgYXV0b3N1c3BlbmQgaWYgd2UncmUgbm90IGdvaW5nIHRvIHJ1biBhZ2FpbiAqLworCQlpZiAobGlzdF9lbXB0eSgmaHViLT5ldmVudF9saXN0KSkKKwkJCXVzYl9hdXRvcG1fZW5hYmxlKGludGYpOwogbG9vcDoKIAkJdXNiX3VubG9ja19kZXZpY2UoaGRldik7CiAJCXVzYl9wdXRfaW50ZihpbnRmKTsKQEAgLTI3NzQsNiArMjg3Nyw3IEBACiAJLnBvc3RfcmVzZXQgPQlodWJfcG9zdF9yZXNldCwKIAkuaW9jdGwgPQlodWJfaW9jdGwsCiAJLmlkX3RhYmxlID0JaHViX2lkX3RhYmxlLAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9CTEsCiB9OwogCiBpbnQgdXNiX2h1Yl9pbml0KHZvaWQpCkBAIC0yODE5LDcgKzI5MjMsNyBAQAogCQlpZiAobGVuIDwgbGUxNl90b19jcHUodWRldi0+Y29uZmlnW2luZGV4XS5kZXNjLndUb3RhbExlbmd0aCkpCiAJCQlsZW4gPSBsZTE2X3RvX2NwdSh1ZGV2LT5jb25maWdbaW5kZXhdLmRlc2Mud1RvdGFsTGVuZ3RoKTsKIAl9Ci0JYnVmID0ga21hbGxvYyAobGVuLCBTTEFCX0tFUk5FTCk7CisJYnVmID0ga21hbGxvYyAobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmID09IE5VTEwpIHsKIAkJZGV2X2VycigmdWRldi0+ZGV2LCAibm8gbWVtIHRvIHJlLXJlYWQgY29uZmlncyBhZnRlciByZXNldFxuIik7CiAJCS8qIGFzc3VtZSB0aGUgd29yc3QgKi8KQEAgLTI5OTgsNyArMzEwMiw3IEBACiAJfQogCiAJLyogUHJldmVudCBhdXRvc3VzcGVuZCBkdXJpbmcgdGhlIHJlc2V0ICovCi0JdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYsIDEpOworCXVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2KTsKIAogCWlmIChpZmFjZSAmJiBpZmFjZS0+Y29uZGl0aW9uICE9IFVTQl9JTlRFUkZBQ0VfQklORElORykKIAkJaWZhY2UgPSBOVUxMOwpAQCAtMzA0MSw3ICszMTQ1LDcgQEAKIAkJfQogCX0KIAotCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldiwgMSk7CisJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTCh1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oIGIvZHJpdmVycy91c2IvY29yZS9odWIuaAppbmRleCAwZjhlODJhLi5jZjk1NTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKQEAgLTE5Miw0NSArMTkyLDQgQEAKIAogZXh0ZXJuIHZvaWQgdXNiX2h1Yl90dF9jbGVhcl9idWZmZXIgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBwaXBlKTsKIAotc3RydWN0IHVzYl9odWIgewotCXN0cnVjdCBkZXZpY2UJCSppbnRmZGV2OwkvKiB0aGUgImludGVyZmFjZSIgZGV2aWNlICovCi0Jc3RydWN0IHVzYl9kZXZpY2UJKmhkZXY7Ci0Jc3RydWN0IHVyYgkJKnVyYjsJCS8qIGZvciBpbnRlcnJ1cHQgcG9sbGluZyBwaXBlICovCi0KLQkvKiBidWZmZXIgZm9yIHVyYiAuLi4gd2l0aCBleHRyYSBzcGFjZSBpbiBjYXNlIG9mIGJhYmJsZSAqLwotCWNoYXIJCQkoKmJ1ZmZlcilbOF07Ci0JZG1hX2FkZHJfdAkJYnVmZmVyX2RtYTsJLyogRE1BIGFkZHJlc3MgZm9yIGJ1ZmZlciAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHVzYl9odWJfc3RhdHVzCWh1YjsKLQkJc3RydWN0IHVzYl9wb3J0X3N0YXR1cwlwb3J0OwotCX0JCQkqc3RhdHVzOwkvKiBidWZmZXIgZm9yIHN0YXR1cyByZXBvcnRzICovCi0KLQlpbnQJCQllcnJvcjsJCS8qIGxhc3QgcmVwb3J0ZWQgZXJyb3IgKi8KLQlpbnQJCQluZXJyb3JzOwkvKiB0cmFjayBjb25zZWN1dGl2ZSBlcnJvcnMgKi8KLQotCXN0cnVjdCBsaXN0X2hlYWQJZXZlbnRfbGlzdDsJLyogaHVicyB3L2RhdGEgb3IgZXJycyByZWFkeSAqLwotCXVuc2lnbmVkIGxvbmcJCWV2ZW50X2JpdHNbMV07CS8qIHN0YXR1cyBjaGFuZ2UgYml0bWFzayAqLwotCXVuc2lnbmVkIGxvbmcJCWNoYW5nZV9iaXRzWzFdOwkvKiBwb3J0cyB3aXRoIGxvZ2ljYWwgY29ubmVjdAotCQkJCQkJCXN0YXR1cyBjaGFuZ2UgKi8KLQl1bnNpZ25lZCBsb25nCQlidXN5X2JpdHNbMV07CS8qIHBvcnRzIGJlaW5nIHJlc2V0IG9yCi0JCQkJCQkJcmVzdW1lZCAqLwotI2lmIFVTQl9NQVhDSElMRFJFTiA+IDMxIC8qIDgqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIC0gMSAqLwotI2Vycm9yIGV2ZW50X2JpdHNbXSBpcyB0b28gc2hvcnQhCi0jZW5kaWYKLQotCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2NyaXB0b3I7CS8qIGNsYXNzIGRlc2NyaXB0b3IgKi8KLQlzdHJ1Y3QgdXNiX3R0CQl0dDsJCS8qIFRyYW5zYWN0aW9uIFRyYW5zbGF0b3IgKi8KLQotCXVuc2lnbmVkCQltQV9wZXJfcG9ydDsJLyogY3VycmVudCBmb3IgZWFjaCBjaGlsZCAqLwotCi0JdW5zaWduZWQJCWxpbWl0ZWRfcG93ZXI6MTsKLQl1bnNpZ25lZAkJcXVpZXNjaW5nOjE7Ci0JdW5zaWduZWQJCWFjdGl2YXRpbmc6MTsKLQl1bnNpZ25lZAkJcmVzdW1lX3Jvb3RfaHViOjE7Ci0KLQl1bnNpZ25lZAkJaGFzX2luZGljYXRvcnM6MTsKLQllbnVtIGh1Yl9sZWRfbW9kZQlpbmRpY2F0b3JbVVNCX01BWENISUxEUkVOXTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbGVkczsKLX07Ci0KICNlbmRpZiAvKiBfX0xJTlVYX0hVQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKaW5kZXggYjVkNmE3OS4uMTFkYWQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwpAQCAtMzc5LDcgKzM3OSw3IEBACiB7CiAJbG9mZl90IHJldHZhbCA9IC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoKG9yaWcpIHsKIAljYXNlIDA6CiAJCWlmIChvZmZzZXQgPiAwKSB7CkBAIC0zOTYsNyArMzk2LDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IGZjY2QxOTUuLjE0OWFhOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC00ODgsNyArNDg4LDcgQEAKIAkJaW50CXJldHZhbDsKIAogCQlpby0+dXJicyBbaV0tPmRldiA9IGlvLT5kZXY7Ci0JCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiIChpby0+dXJicyBbaV0sIFNMQUJfQVRPTUlDKTsKKwkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKGlvLT51cmJzIFtpXSwgR0ZQX0FUT01JQyk7CiAKIAkJLyogYWZ0ZXIgd2Ugc3VibWl0LCBsZXQgY29tcGxldGlvbnMgb3IgY2FuY2VsYXRpb25zIGZpcmU7CiAJCSAqIHdlIGhhbmRzaGFrZSB1c2luZyBpby0+c3RhdHVzLgpAQCAtNzY0LDcgKzc2NCw3IEBACiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvdXQ7CiAJCX0gZWxzZSB7Ci0JCQlkZXYtPmhhdmVfbGFuZ2lkID0gLTE7CisJCQlkZXYtPmhhdmVfbGFuZ2lkID0gMTsKIAkJCWRldi0+c3RyaW5nX2xhbmdpZCA9IHRidWZbMl0gfCAodGJ1ZlszXTw8IDgpOwogCQkJCS8qIGFsd2F5cyB1c2UgdGhlIGZpcnN0IGxhbmdpZCBsaXN0ZWQgKi8KIAkJCWRldl9kYmcgKCZkZXYtPmRldiwgImRlZmF1bHQgbGFuZ3VhZ2UgMHglMDR4XG4iLApAQCAtODI4LDEwICs4MjgsNyBAQAogICogQ29udGV4dDogIWluX2ludGVycnVwdCAoKQogICoKICAqIFVwZGF0ZXMgdGhlIGNvcHkgb2YgdGhlIGRldmljZSBkZXNjcmlwdG9yIHN0b3JlZCBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwKLSAqIHdoaWNoIGRlZGljYXRlcyBzcGFjZSBmb3IgdGhpcyBwdXJwb3NlLiAgTm90ZSB0aGF0IHNldmVyYWwgZmllbGRzIGFyZQotICogY29udmVydGVkIHRvIHRoZSBob3N0IENQVSdzIGJ5dGUgb3JkZXI6ICB0aGUgVVNCIHZlcnNpb24gKGJjZFVTQiksIGFuZAotICogdmVuZG9ycyBwcm9kdWN0IGFuZCB2ZXJzaW9uIGZpZWxkcyAoaWRWZW5kb3IsIGlkUHJvZHVjdCwgYW5kIGJjZERldmljZSkuCi0gKiBUaGF0IGxldHMgZGV2aWNlIGRyaXZlcnMgY29tcGFyZSBhZ2FpbnN0IG5vbi1ieXRlc3dhcHBlZCBjb25zdGFudHMuCisgKiB3aGljaCBkZWRpY2F0ZXMgc3BhY2UgZm9yIHRoaXMgcHVycG9zZS4KICAqCiAgKiBOb3QgZXhwb3J0ZWQsIG9ubHkgZm9yIHVzZSBieSB0aGUgY29yZS4gIElmIGRyaXZlcnMgcmVhbGx5IHdhbnQgdG8gcmVhZAogICogdGhlIGRldmljZSBkZXNjcmlwdG9yIGRpcmVjdGx5LCB0aGV5IGNhbiBjYWxsIHVzYl9nZXRfZGVzY3JpcHRvcigpIHdpdGgKQEAgLTE0MDEsNyArMTM5OCw3IEBACiAJfQogCiAJLyogV2FrZSB1cCB0aGUgZGV2aWNlIHNvIHdlIGNhbiBzZW5kIGl0IHRoZSBTZXQtQ29uZmlnIHJlcXVlc3QgKi8KLQlyZXQgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UoZGV2LCAxKTsKKwlyZXQgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UoZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGZyZWVfaW50ZXJmYWNlczsKIApAQCAtMTQyNCw3ICsxNDIxLDcgQEAKIAlkZXYtPmFjdGNvbmZpZyA9IGNwOwogCWlmICghY3ApIHsKIAkJdXNiX3NldF9kZXZpY2Vfc3RhdGUoZGV2LCBVU0JfU1RBVEVfQUREUkVTUyk7Ci0JCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2LCAxKTsKKwkJdXNiX2F1dG9zdXNwZW5kX2RldmljZShkZXYpOwogCQlnb3RvIGZyZWVfaW50ZXJmYWNlczsKIAl9CiAJdXNiX3NldF9kZXZpY2Vfc3RhdGUoZGV2LCBVU0JfU1RBVEVfQ09ORklHVVJFRCk7CkBAIC0xNDkzLDcgKzE0OTAsNyBAQAogCQl1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMgKGludGYpOwogCX0KIAotCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2LCAxKTsKKwl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1MDQsOSArMTUwMSwxMCBAQAogfTsKIAogLyogV29ya2VyIHJvdXRpbmUgZm9yIHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24oKSAqLwotc3RhdGljIHZvaWQgZHJpdmVyX3NldF9jb25maWdfd29yayh2b2lkICpfcmVxKQorc3RhdGljIHZvaWQgZHJpdmVyX3NldF9jb25maWdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNldF9jb25maWdfcmVxdWVzdCAqcmVxID0gX3JlcTsKKwlzdHJ1Y3Qgc2V0X2NvbmZpZ19yZXF1ZXN0ICpyZXEgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNldF9jb25maWdfcmVxdWVzdCwgd29yayk7CiAKIAl1c2JfbG9ja19kZXZpY2UocmVxLT51ZGV2KTsKIAl1c2Jfc2V0X2NvbmZpZ3VyYXRpb24ocmVxLT51ZGV2LCByZXEtPmNvbmZpZyk7CkBAIC0xNTQ0LDcgKzE1NDIsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXEtPnVkZXYgPSB1ZGV2OwogCXJlcS0+Y29uZmlnID0gY29uZmlnOwotCUlOSVRfV09SSygmcmVxLT53b3JrLCBkcml2ZXJfc2V0X2NvbmZpZ193b3JrLCByZXEpOworCUlOSVRfV09SSygmcmVxLT53b3JrLCBkcml2ZXJfc2V0X2NvbmZpZ193b3JrKTsKIAogCXVzYl9nZXRfZGV2KHVkZXYpOwogCWlmICghc2NoZWR1bGVfd29yaygmcmVxLT53b3JrKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggNDY3Y2IwMi4uMDI0MjZkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC0yMDAsMTkgKzIwMCwxMyBAQAogCWRlc3Ryb3lfd29ya3F1ZXVlKGtzdXNwZW5kX3VzYl93cSk7CiB9CiAKLSNlbHNlCi0KLSNkZWZpbmUga3N1c3BlbmRfdXNiX2luaXQoKQkwCi0jZGVmaW5lIGtzdXNwZW5kX3VzYl9jbGVhbnVwKCkJZG8ge30gd2hpbGUgKDApCi0KLSNlbmRpZgotCiAjaWZkZWYJQ09ORklHX1VTQl9TVVNQRU5ECiAKIC8qIHVzYl9hdXRvc3VzcGVuZF93b3JrIC0gY2FsbGJhY2sgcm91dGluZSB0byBhdXRvc3VzcGVuZCBhIFVTQiBkZXZpY2UgKi8KLXN0YXRpYyB2b2lkIHVzYl9hdXRvc3VzcGVuZF93b3JrKHZvaWQgKl91ZGV2KQorc3RhdGljIHZvaWQgdXNiX2F1dG9zdXNwZW5kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gX3VkZXY7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYl9kZXZpY2UsIGF1dG9zdXNwZW5kLndvcmspOwogCiAJdXNiX3BtX2xvY2sodWRldik7CiAJdWRldi0+YXV0b19wbSA9IDE7CkBAIC0yMjIsMTAgKzIxNiwxNyBAQAogCiAjZWxzZQogCi1zdGF0aWMgdm9pZCB1c2JfYXV0b3N1c3BlbmRfd29yayh2b2lkICpfdWRldikKK3N0YXRpYyB2b2lkIHVzYl9hdXRvc3VzcGVuZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHt9CiAKLSNlbmRpZgorI2VuZGlmCS8qIENPTkZJR19VU0JfU1VTUEVORCAqLworCisjZWxzZQorCisjZGVmaW5lIGtzdXNwZW5kX3VzYl9pbml0KCkJMAorI2RlZmluZSBrc3VzcGVuZF91c2JfY2xlYW51cCgpCWRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYJLyogQ09ORklHX1BNICovCiAKIC8qKgogICogdXNiX2FsbG9jX2RldiAtIHVzYiBkZXZpY2UgY29uc3RydWN0b3IgKHVzYmNvcmUtaW50ZXJuYWwpCkBAIC0zMDQsNyArMzA1LDcgQEAKIAogI2lmZGVmCUNPTkZJR19QTQogCW11dGV4X2luaXQoJmRldi0+cG1fbXV0ZXgpOwotCUlOSVRfV09SSygmZGV2LT5hdXRvc3VzcGVuZCwgdXNiX2F1dG9zdXNwZW5kX3dvcmssIGRldik7CisJSU5JVF9ERUxBWUVEX1dPUksoJmRldi0+YXV0b3N1c3BlbmQsIHVzYl9hdXRvc3VzcGVuZF93b3JrKTsKICNlbmRpZgogCXJldHVybiBkZXY7CiB9CkBAIC01MzcsMTM4ICs1MzgsNiBAQAogCXJldHVybiB1c2JfaGNkX2dldF9mcmFtZV9udW1iZXIgKGRldik7CiB9CiAKLS8qKgotICogdXNiX2VuZHBvaW50X2Rpcl9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgSU4gZGlyZWN0aW9uCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIElOLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9kaXJfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKTsKLX0KLQotLyoqCi0gKiB1c2JfZW5kcG9pbnRfZGlyX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgT1VUIGRpcmVjdGlvbgotICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBPVVQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgotICovCi1pbnQgdXNiX2VuZHBvaW50X2Rpcl9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X3hmZXJfYnVsayAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGJ1bGssIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgotICovCi1pbnQgdXNiX2VuZHBvaW50X3hmZXJfYnVsayhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKTsKLX0KLQotLyoqCi0gKiB1c2JfZW5kcG9pbnRfeGZlcl9pbnQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGludGVycnVwdCwgb3RoZXJ3aXNlIGl0IHJldHVybnMKLSAqIGZhbHNlLgotICovCi1pbnQgdXNiX2VuZHBvaW50X3hmZXJfaW50KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09Ci0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X3hmZXJfaXNvYyAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgaXNvY2hyb25vdXMgdHJhbnNmZXIgdHlwZQotICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBpc29jaHJvbm91cywgb3RoZXJ3aXNlIGl0IHJldHVybnMKLSAqIGZhbHNlLgotICovCi1pbnQgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKTsKLX0KLQotLyoqCi0gKiB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBidWxrIElOCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCi0gKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9pc19idWxrX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGJ1bGsgT1VUCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlIGFuZCBPVVQgZGlyZWN0aW9uLAotICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCi0gKi8KLWludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCi17Ci0JcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X2lzX2ludF9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgSU4KLSAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgSU4gZGlyZWN0aW9uLAotICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCi0gKi8KLWludCB1c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKTsKLX0KLQotLyoqCi0gKiB1c2JfZW5kcG9pbnRfaXNfaW50X291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgT1VUCi0gKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCi0gKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X2lzX2lzb2NfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaXNvY2hyb25vdXMgSU4KLSAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpc29jaHJvbm91cyB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCi0gKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9pc19pc29jX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQotewotCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSk7Ci19Ci0KLS8qKgotICogdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGlzb2Nocm9ub3VzIE9VVAotICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCi0gKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KLSAqLwotaW50IHVzYl9lbmRwb2ludF9pc19pc29jX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKLXsKLQlyZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiBfX3VzYl9nZXRfZXh0cmFfZGVzY3JpcHRvcigpIGZpbmRzIGEgZGVzY3JpcHRvciBvZiBzcGVjaWZpYyB0eXBlIGluIHRoZQpAQCAtMTEwMiwxOCArOTcxLDYgQEAKIEVYUE9SVF9TWU1CT0wodXNiX2ZpbmRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wodXNiX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcik7CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHVzYl9lbmRwb2ludF9kaXJfaW4pOwotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X2Rpcl9vdXQpOwotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X3hmZXJfYnVsayk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfeGZlcl9pbnQpOwotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X3hmZXJfaXNvYyk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfYnVsa19pbik7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQpOwotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X2lzX2ludF9pbik7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfaW50X291dCk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfaXNvY19pbik7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfaXNvY19vdXQpOwotCiBFWFBPUlRfU1lNQk9MICh1c2JfYnVmZmVyX2FsbG9jKTsKIEVYUE9SVF9TWU1CT0wgKHVzYl9idWZmZXJfZnJlZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmggYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCmluZGV4IDEzMzIyZTMuLjE3ODMwYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuaApAQCAtNjQsMTQgKzY0LDEzIEBACiAKICNkZWZpbmUgVVNCX0FVVE9TVVNQRU5EX0RFTEFZCShIWioyKQogCi1leHRlcm4gdm9pZCB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgZGVjX2J1c3lfY250KTsKLWV4dGVybiBpbnQgdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgaW5jX2J1c3lfY250KTsKK2V4dGVybiB2b2lkIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworZXh0ZXJuIGludCB1c2JfYXV0b3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCiAjZWxzZQogCi0jZGVmaW5lIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldiwgZGVjX2J1c3lfY250KQlkbyB7fSB3aGlsZSAoMCkKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJaW50IGluY19idXN5X2NudCkKKyNkZWZpbmUgdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KQlkbyB7fSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKaW5kZXggYmJiYzgyYS4uNDA5N2E4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKQEAgLTE4OSw3ICsxODksNyBAQAogCiBjb25maWcgVVNCX0dBREdFVF9BVDkxCiAJYm9vbGVhbiAiQVQ5MSBVU0IgRGV2aWNlIFBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX0FUOTFSTTkyMDAKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MQogCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECiAJaGVscAogCSAgIE1hbnkgQXRtZWwgQVQ5MSBwcm9jZXNzb3JzIChzdWNoIGFzIHRoZSBBVDkxUk0yMDAwKSBoYXZlIGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKaW5kZXggNzJmM2RiOS4uM2UwYWJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMKQEAgLTU5OCw3ICs1OTgsNyBAQAogewogCXN0cnVjdCBhdDkxX3JlcXVlc3QgKnJlcTsKIAotCXJlcSA9IGtjYWxsb2MoMSwgc2l6ZW9mIChzdHJ1Y3QgYXQ5MV9yZXF1ZXN0KSwgZ2ZwX2ZsYWdzKTsKKwlyZXEgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGF0OTFfcmVxdWVzdCksIGdmcF9mbGFncyk7CiAJaWYgKCFyZXEpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCmluZGV4IDFjMTdkMjYuLmQxNWJmMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCkBAIC0xODMzLDkgKzE4MzMsOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVxX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgZXRoX3dvcmsgKHZvaWQgKl9kZXYpCitzdGF0aWMgdm9pZCBldGhfd29yayAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBldGhfZGV2CQkqZGV2ID0gX2RldjsKKwlzdHJ1Y3QgZXRoX2RldgkqZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBldGhfZGV2LCB3b3JrKTsKIAogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQgKFdPUktfUlhfTUVNT1JZLCAmZGV2LT50b2RvKSkgewogCQlpZiAobmV0aWZfcnVubmluZyAoZGV2LT5uZXQpKQpAQCAtMTg5NCwxMyArMTg5NCwxMyBAQAogCWlmICghZXRoX2lzX3Byb21pc2MgKGRldikpIHsKIAkJdTgJCSpkZXN0ID0gc2tiLT5kYXRhOwogCi0JCWlmIChkZXN0IFswXSAmIDB4MDEpIHsKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CiAJCQl1MTYJdHlwZTsKIAogCQkJLyogaWdub3JlcyBVU0JfQ0RDX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVCBhbmQgaG9zdAogCQkJICogU0VUX0VUSEVSTkVUX01VTFRJQ0FTVF9GSUxURVJTIHJlcXVlc3RzCiAJCQkgKi8KLQkJCWlmIChtZW1jbXAgKGRlc3QsIG5ldC0+YnJvYWRjYXN0LCBFVEhfQUxFTikgPT0gMCkKKwkJCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkKIAkJCQl0eXBlID0gVVNCX0NEQ19QQUNLRVRfVFlQRV9CUk9BRENBU1Q7CiAJCQllbHNlCiAJCQkJdHlwZSA9IFVTQl9DRENfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVDsKQEAgLTIzOTgsNyArMjM5OCw3IEBACiAJZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAlzcGluX2xvY2tfaW5pdCAoJmRldi0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQgKCZkZXYtPnJlcV9sb2NrKTsKLQlJTklUX1dPUksgKCZkZXYtPndvcmssIGV0aF93b3JrLCBkZXYpOworCUlOSVRfV09SSyAoJmRldi0+d29yaywgZXRoX3dvcmspOwogCUlOSVRfTElTVF9IRUFEICgmZGV2LT50eF9yZXFzKTsKIAlJTklUX0xJU1RfSEVBRCAoJmRldi0+cnhfcmVxcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwppbmRleCA4Yjk3NWQxLi5hMjY1ZTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCkBAIC0yNTAsNyArMjUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KQEAgLTE5MDksMTAgKzE5MDksMTAgQEAKIAlpZiAoIWZpbHAtPmZfb3AtPmZzeW5jKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlyYyA9IGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKLQllcnIgPSBmaWxwLT5mX29wLT5mc3luYyhmaWxwLCBmaWxwLT5mX2RlbnRyeSwgMSk7CisJZXJyID0gZmlscC0+Zl9vcC0+ZnN5bmMoZmlscCwgZmlscC0+Zl9wYXRoLmRlbnRyeSwgMSk7CiAJaWYgKCFyYykKIAkJcmMgPSBlcnI7CiAJZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7CkBAIC0xOTUwLDcgKzE5NTAsNyBAQAogc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9zdWIoc3RydWN0IGx1biAqY3VybHVuKQogewogCXN0cnVjdCBmaWxlCSpmaWxwID0gY3VybHVuLT5maWxwOwotCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAl1bnNpZ25lZCBsb25nCXJjOwogCiAJcmMgPSBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcpOwpAQCAtMzUyNiw4ICszNTI2LDggQEAKIAlpZiAoIShmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCiAJCXJvID0gMTsKIAotCWlmIChmaWxwLT5mX2RlbnRyeSkKLQkJaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoZmlscC0+Zl9wYXRoLmRlbnRyeSkKKwkJaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWlmIChpbm9kZSAmJiBTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CiAJCWlmIChiZGV2X3JlYWRfb25seShpbm9kZS0+aV9iZGV2KSkKIAkJCXJvID0gMTsKQEAgLTM2MDYsNyArMzYwNiw3IEBACiAKIAlkb3duX3JlYWQoJmZzZy0+ZmlsZXNlbSk7CiAJaWYgKGJhY2tpbmdfZmlsZV9pc19vcGVuKGN1cmx1bikpIHsJLy8gR2V0IHRoZSBjb21wbGV0ZSBwYXRobmFtZQotCQlwID0gZF9wYXRoKGN1cmx1bi0+ZmlscC0+Zl9kZW50cnksIGN1cmx1bi0+ZmlscC0+Zl92ZnNtbnQsCisJCXAgPSBkX3BhdGgoY3VybHVuLT5maWxwLT5mX3BhdGguZGVudHJ5LCBjdXJsdW4tPmZpbHAtPmZfcGF0aC5tbnQsCiAJCQkJYnVmLCBQQUdFX1NJWkUgLSAxKTsKIAkJaWYgKElTX0VSUihwKSkKIAkJCXJjID0gUFRSX0VSUihwKTsKQEAgLTQwMzAsOCArNDAzMCw4IEBACiAJCWlmIChiYWNraW5nX2ZpbGVfaXNfb3BlbihjdXJsdW4pKSB7CiAJCQlwID0gTlVMTDsKIAkJCWlmIChwYXRoYnVmKSB7Ci0JCQkJcCA9IGRfcGF0aChjdXJsdW4tPmZpbHAtPmZfZGVudHJ5LAotCQkJCQljdXJsdW4tPmZpbHAtPmZfdmZzbW50LAorCQkJCXAgPSBkX3BhdGgoY3VybHVuLT5maWxwLT5mX3BhdGguZGVudHJ5LAorCQkJCQljdXJsdW4tPmZpbHAtPmZfcGF0aC5tbnQsCiAJCQkJCXBhdGhidWYsIFBBVEhfTUFYKTsKIAkJCQlpZiAoSVNfRVJSKHApKQogCQkJCQlwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9nbWlkaS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dtaWRpLmMKaW5kZXggNjQ1NTRhYy4uMzEzNTE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dtaWRpLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dtaWRpLmMKQEAgLTEyMzYsNyArMTIzNiw3IEBACiAKIAogCS8qIG9rLCB3ZSBtYWRlIHNlbnNlIG9mIHRoZSBoYXJkd2FyZSAuLi4gKi8KLQlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgU0xBQl9LRVJORUwpOworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCmluZGV4IGEzMDc2ZGEuLjgwNWE5ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCkBAIC0xODY0LDcgKzE4NjQsNyBAQAogCX0KIAogCS8qIGFsbG9jLCBhbmQgc3RhcnQgaW5pdCAqLwotCWRldiA9IGttYWxsb2MgKHNpemVvZiAqZGV2LCBTTEFCX0tFUk5FTCk7CisJZGV2ID0ga21hbGxvYyAoc2l6ZW9mICpkZXYsIEdGUF9LRVJORUwpOwogCWlmIChkZXYgPT0gTlVMTCl7CiAJCXByX2RlYnVnKCJlbm9tZW0gJXNcbiIsIHBjaV9uYW1lKHBkZXYpKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKaW5kZXggODY5MjRmOS4uM2ZiMTA0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCkBAIC00MTIsNyArNDEyLDcgQEAKIAkvKiBGSVhNRSByZWFkYWhlYWQgZm9yIE9fTk9OQkxPQ0sgYW5kIHBvbGwoKTsgY2FyZWZ1bCB3aXRoIFpMUHMgKi8KIAogCXZhbHVlID0gLUVOT01FTTsKLQlrYnVmID0ga21hbGxvYyAobGVuLCBTTEFCX0tFUk5FTCk7CisJa2J1ZiA9IGttYWxsb2MgKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5ICgha2J1ZikpCiAJCWdvdG8gZnJlZTE7CiAKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCS8qIEZJWE1FIHdyaXRlYmVoaW5kIGZvciBPX05PTkJMT0NLIGFuZCBwb2xsKCksIHFsZW4gPSAxICovCiAKIAl2YWx1ZSA9IC1FTk9NRU07Ci0Ja2J1ZiA9IGttYWxsb2MgKGxlbiwgU0xBQl9LRVJORUwpOworCWtidWYgPSBrbWFsbG9jIChsZW4sIEdGUF9LRVJORUwpOwogCWlmICgha2J1ZikKIAkJZ290byBmcmVlMTsKIAlpZiAoY29weV9mcm9tX3VzZXIgKGtidWYsIGJ1ZiwgbGVuKSkgewpAQCAtMTg5OCw3ICsxODk4LDcgQEAKIAlidWYgKz0gNDsKIAlsZW5ndGggLT0gNDsKIAotCWtidWYgPSBrbWFsbG9jIChsZW5ndGgsIFNMQUJfS0VSTkVMKTsKKwlrYnVmID0ga21hbGxvYyAobGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWtidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCWlmIChjb3B5X2Zyb21fdXNlciAoa2J1ZiwgYnVmLCBsZW5ndGgpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCmluZGV4IDE3OTI1OTYuLjRhOTkxNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCkBAIC04Myw3ICs4Myw2IEBACiBzdGF0aWMgaW50IGxoN2E0MHhfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICopOwogc3RhdGljIGludCBsaDdhNDB4X3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQpOwogc3RhdGljIGludCBsaDdhNDB4X2ZpZm9fc3RhdHVzKHN0cnVjdCB1c2JfZXAgKmVwKTsKLXN0YXRpYyBpbnQgbGg3YTQweF9maWZvX3N0YXR1cyhzdHJ1Y3QgdXNiX2VwICplcCk7CiBzdGF0aWMgdm9pZCBsaDdhNDB4X2ZpZm9fZmx1c2goc3RydWN0IHVzYl9lcCAqZXApOwogc3RhdGljIHZvaWQgbGg3YTQweF9lcDBfa2ljayhzdHJ1Y3QgbGg3YTQweF91ZGMgKmRldiwgc3RydWN0IGxoN2E0MHhfZXAgKmVwKTsKIHN0YXRpYyB2b2lkIGxoN2E0MHhfaGFuZGxlX2VwMChzdHJ1Y3QgbGg3YTQweF91ZGMgKmRldiwgdTMyIGludHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKaW5kZXggZDk1NGRhYS4uMzAyNGM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCkBAIC0xMDQwLDYgKzEwNDAsNyBAQAogCiAJfSAvKiBlbHNlIHRoZSBpcnEgaGFuZGxlciBhZHZhbmNlcyB0aGUgcXVldWUuICovCiAKKwllcC0+cmVzcG9uZGVkID0gMTsKIAlpZiAocmVxKQogCQlsaXN0X2FkZF90YWlsICgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1ZSk7CiBkb25lOgpAQCAtMTc3NCw4ICsxNzc1LDggQEAKIAogI2Vsc2UKIAotI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGUoYSxiKQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgZGV2aWNlX3JlbW92ZV9maWxlCWRldmljZV9jcmVhdGVfZmlsZQorI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGUoYSxiKQkoMCkKKyNkZWZpbmUgZGV2aWNlX3JlbW92ZV9maWxlKGEsYikJZG8geyB9IHdoaWxlICgwKQogCiAjZW5kaWYKIApAQCAtMjA0NCw4ICsyMDQ1LDEwIEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JZGV2aWNlX2NyZWF0ZV9maWxlICgmZGV2LT5wZGV2LT5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlICgmZGV2LT5wZGV2LT5kZXYsICZkZXZfYXR0cl9xdWV1ZXMpOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSAoJmRldi0+cGRldi0+ZGV2LCAmZGV2X2F0dHJfZnVuY3Rpb24pOworCWlmIChyZXR2YWwpIGdvdG8gZXJyX3VuYmluZDsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUgKCZkZXYtPnBkZXYtPmRldiwgJmRldl9hdHRyX3F1ZXVlcyk7CisJaWYgKHJldHZhbCkgZ290byBlcnJfZnVuYzsKIAogCS8qIC4uLiB0aGVuIGVuYWJsZSBob3N0IGRldGVjdGlvbiBhbmQgZXAwOyBhbmQgd2UncmUgcmVhZHkKIAkgKiBmb3Igc2V0X2NvbmZpZ3VyYXRpb24gYXMgd2VsbCBhcyBldmVudHVhbCBkaXNjb25uZWN0LgpAQCAtMjA2MCw2ICsyMDYzLDE0IEBACiAKIAkvKiBwY2kgd3JpdGVzIG1heSBzdGlsbCBiZSBwb3N0ZWQgKi8KIAlyZXR1cm4gMDsKKworZXJyX2Z1bmM6CisJZGV2aWNlX3JlbW92ZV9maWxlICgmZGV2LT5wZGV2LT5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7CitlcnJfdW5iaW5kOgorCWRyaXZlci0+dW5iaW5kICgmZGV2LT5nYWRnZXQpOworCWRldi0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCWRldi0+ZHJpdmVyID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOwogfQogRVhQT1JUX1NZTUJPTCAodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOwogCkBAIC0yMTc4LDcgKzIxODksOCBAQAogCQkJCQllcC0+c3RvcHBlZCA9IDE7CiAJCQkJCXNldF9oYWx0IChlcCk7CiAJCQkJCW1vZGUgPSAyOwotCQkJCX0gZWxzZSBpZiAoIXJlcSAmJiAhZXAtPnN0b3BwZWQpCisJCQkJfSBlbHNlIGlmIChlcC0+cmVzcG9uZGVkICYmCisJCQkJCQkhcmVxICYmICFlcC0+c3RvcHBlZCkKIAkJCQkJd3JpdGVfZmlmbyAoZXAsIE5VTEwpOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMjE5Myw3ICsyMjA1LDcgQEAKIAkJCX0gZWxzZSBpZiAoKCh0ICYgKDEgPDwgREFUQV9PVVRfUElOR19UT0tFTl9JTlRFUlJVUFQpKQogCQkJCQkmJiByZXEKIAkJCQkJJiYgcmVxLT5yZXEuYWN0dWFsID09IHJlcS0+cmVxLmxlbmd0aCkKLQkJCQkJfHwgIXJlcSkgeworCQkJCQl8fCAoZXAtPnJlc3BvbmRlZCAmJiAhcmVxKSkgewogCQkJCWVwLT5kZXYtPnByb3RvY29sX3N0YWxsID0gMTsKIAkJCQlzZXRfaGFsdCAoZXApOwogCQkJCWVwLT5zdG9wcGVkID0gMTsKQEAgLTI0NTksNiArMjQ3MSw3IEBACiAJCS8qIHdlIG1hZGUgdGhlIGhhcmR3YXJlIGhhbmRsZSBtb3N0IGxvd2xldmVsIHJlcXVlc3RzOwogCQkgKiBldmVyeXRoaW5nIGVsc2UgZ29lcyB1cGxldmVsIHRvIHRoZSBnYWRnZXQgY29kZS4KIAkJICovCisJCWVwLT5yZXNwb25kZWQgPSAxOwogCQlzd2l0Y2ggKHUuci5iUmVxdWVzdCkgewogCQljYXNlIFVTQl9SRVFfR0VUX1NUQVRVUzogewogCQkJc3RydWN0IG5ldDIyODBfZXAJKmU7CkBAIC0yNTI3LDYgKzI1NDAsNyBAQAogCQkJCXUuci5iUmVxdWVzdFR5cGUsIHUuci5iUmVxdWVzdCwKIAkJCQl3X3ZhbHVlLCB3X2luZGV4LCB3X2xlbmd0aCwKIAkJCQlyZWFkbCAoJmVwLT5yZWdzLT5lcF9jZmcpKTsKKwkJCWVwLT5yZXNwb25kZWQgPSAwOwogCQkJc3Bpbl91bmxvY2sgKCZkZXYtPmxvY2spOwogCQkJdG1wID0gZGV2LT5kcml2ZXItPnNldHVwICgmZGV2LT5nYWRnZXQsICZ1LnIpOwogCQkJc3Bpbl9sb2NrICgmZGV2LT5sb2NrKTsKQEAgLTI4NDcsNyArMjg2MSw3IEBACiAJfQogCiAJLyogYWxsb2MsIGFuZCBzdGFydCBpbml0ICovCi0JZGV2ID0ga3phbGxvYyAoc2l6ZW9mICpkZXYsIFNMQUJfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jIChzaXplb2YgKmRldiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldiA9PSBOVUxMKXsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lOwpAQCAtMjk3NCw4ICsyOTg4LDEwIEBACiAJCQkJOiAiZGlzYWJsZWQiKTsKIAl0aGVfY29udHJvbGxlciA9IGRldjsKIAotCWRldmljZV9yZWdpc3RlciAoJmRldi0+Z2FkZ2V0LmRldik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlICgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKKwlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIgKCZkZXYtPmdhZGdldC5kZXYpOworCWlmIChyZXR2YWwpIGdvdG8gZG9uZTsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUgKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9yZWdpc3RlcnMpOworCWlmIChyZXR2YWwpIGdvdG8gZG9uZTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuaAppbmRleCA5NTdkNmRmLi40NGNhMTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmgKQEAgLTExMCw3ICsxMTAsOCBAQAogCQkJCQkJb3V0X292ZXJmbG93IDogMSwKIAkJCQkJCXN0b3BwZWQgOiAxLAogCQkJCQkJaXNfaW4gOiAxLAotCQkJCQkJaXNfaXNvIDogMTsKKwkJCQkJCWlzX2lzbyA6IDEsCisJCQkJCQlyZXNwb25kZWQgOiAxOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGFsbG93X3N0YXR1cyAoc3RydWN0IG5ldDIyODBfZXAgKmVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwppbmRleCA0OGEwOWZkLi4wMzBkODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwpAQCAtMjU4MSw3ICsyNTgxLDcgQEAKIAkvKiBVRENfUFVMTFVQX0VOIGdhdGVzIHRoZSBjaGlwIGNsb2NrICovCiAJLy8gT1RHX1NZU0NPTl8xX1JFRyB8PSBERVZfSURMRV9FTjsKIAotCXVkYyA9IGt6YWxsb2Moc2l6ZW9mKCp1ZGMpLCBTTEFCX0tFUk5FTCk7CisJdWRjID0ga3phbGxvYyhzaXplb2YoKnVkYyksIEdGUF9LRVJORUwpOwogCWlmICghdWRjKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKaW5kZXggZjQyYzAwZS4uMWVkNTA2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCkBAIC00MywxMSArNDMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CkBAIC0yNDcyLDYgKzI0NzIsNyBAQAogI2RlZmluZSBQWEEyMTBfQjEJCTB4MDAwMDAxMjMKICNkZWZpbmUgUFhBMjEwX0IwCQkweDAwMDAwMTIyCiAjZGVmaW5lIElYUDQyNV9BMAkJMHgwMDAwMDFjMQorI2RlZmluZSBJWFA0MjVfQjAJCTB4MDAwMDAxZjEKICNkZWZpbmUgSVhQNDY1X0FECQkweDAwMDAwMjAwCiAKIC8qCkBAIC0yNTA5LDYgKzI1MTAsNyBAQAogCQlicmVhazsKICNlbGlmCWRlZmluZWQoQ09ORklHX0FSQ0hfSVhQNFhYKQogCWNhc2UgSVhQNDI1X0EwOgorCWNhc2UgSVhQNDI1X0IwOgogCWNhc2UgSVhQNDY1X0FEOgogCQlkZXYtPmhhc19jZnIgPSAxOwogCQlvdXRfZG1hID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYwppbmRleCAyMDhlNTVhLi4yZDEyYmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIHN0YXRpYyB2b2lkIGdzX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSk7CiBzdGF0aWMgaW50ICBnc19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgdm9pZCBnc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKK3N0YXRpYyB2b2lkIGdzX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkKTsKIAogc3RhdGljIGludCBnc19zZW5kKHN0cnVjdCBnc19kZXYgKmRldik7CiBzdGF0aWMgaW50IGdzX3NlbmRfcGFja2V0KHN0cnVjdCBnc19kZXYgKmRldiwgY2hhciAqcGFja2V0LApAQCAtMTA3Nyw3ICsxMDc3LDcgQEAKIC8qCiAgKiBnc19zZXRfdGVybWlvcwogICovCi1zdGF0aWMgdm9pZCBnc19zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkKQorc3RhdGljIHZvaWQgZ3Nfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiB9CiAKQEAgLTIxOTUsNyArMjE5NSw3IEBACiAJaWYgKHNpemUgPT0gMCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlnYiA9IChzdHJ1Y3QgZ3NfYnVmICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGdzX2J1ZiksIGttYWxsb2NfZmxhZ3MpOworCWdiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdzX2J1ZiksIGttYWxsb2NfZmxhZ3MpOwogCWlmIChnYiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKaW5kZXggMGY4MDlkZC4uNDA3MTBlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCkBAIC0xMTkwLDcgKzExOTAsNyBAQAogCiAKIAkvKiBvaywgd2UgbWFkZSBzZW5zZSBvZiB0aGUgaGFyZHdhcmUgLi4uICovCi0JZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIFNMQUJfS0VSTkVMKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCXNwaW5fbG9ja19pbml0ICgmZGV2LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwppbmRleCBjZjEwY2JjLi5jYzYwNzU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCkBAIC0xNTMsNyArMTUzLDcgQEAKIAkgIGFkYXB0ZXIgd2lsbCAqTk9UKiB3b3JrIHdpdGggUEMgY2FyZHMgdGhhdCBkbyBub3QgY29udGFpbiBhbiBPSENJCiAJICBjb250cm9sbGVyLgogCi0JICBGb3IgdGhvc2UgUEMgY2FyZHMgdGhhdCBjb250YWluIG11bHRpcGxlIE9IQ0kgY29udHJvbGxlcnMgb25seSB0aGVyCisJICBGb3IgdGhvc2UgUEMgY2FyZHMgdGhhdCBjb250YWluIG11bHRpcGxlIE9IQ0kgY29udHJvbGxlcnMgb25seSB0aGUKIAkgIGZpcnN0IG9uZSBpcyB1c2VkLgogCiAJICBUaGUgZHJpdmVyIGNvbnNpc3RzIG9mIHR3byBtb2R1bGVzLCB0aGUgImZ0ZGktZWxhbiIgbW9kdWxlIGlzIGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYwppbmRleCAyM2I5NWIyLi41NjM0OWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCkBAIC00OTIsNyArNDkyLDcgQEAKIAl1bnNpZ25lZAkJaTsKIAlfX2xlMzIJCQl0YWc7CiAKLQlpZiAoIShzZWVuID0ga21hbGxvYyAoREJHX1NDSEVEX0xJTUlUICogc2l6ZW9mICpzZWVuLCBTTEFCX0FUT01JQykpKQorCWlmICghKHNlZW4gPSBrbWFsbG9jIChEQkdfU0NIRURfTElNSVQgKiBzaXplb2YgKnNlZW4sIEdGUF9BVE9NSUMpKSkKIAkJcmV0dXJuIDA7CiAJc2Vlbl9jb3VudCA9IDA7CiAKQEAgLTc1NCw3ICs3NTQsOSBAQAogCX0KIAogCWlmIChlaGNpLT5yZWNsYWltKSB7Ci0JCXRlbXAgPSBzY25wcmludGYgKG5leHQsIHNpemUsICJyZWNsYWltIHFoICVwXG4iLCBlaGNpLT5yZWNsYWltKTsKKwkJdGVtcCA9IHNjbnByaW50ZiAobmV4dCwgc2l6ZSwgInJlY2xhaW0gcWggJXAlc1xuIiwKKwkJCQllaGNpLT5yZWNsYWltLAorCQkJCWVoY2ktPnJlY2xhaW1fcmVhZHkgPyAiIHJlYWR5IiA6ICIiKTsKIAkJc2l6ZSAtPSB0ZW1wOwogCQluZXh0ICs9IHRlbXA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCmluZGV4IGFhYzZlYzUuLjAyNWQzMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogI2RlZmluZQlFSENJX1RVTkVfTVVMVF9UVAkxCiAjZGVmaW5lCUVIQ0lfVFVORV9GTFMJCTIJLyogKHNtYWxsKSAyNTYgZnJhbWUgc2NoZWR1bGUgKi8KIAotI2RlZmluZSBFSENJX0lBQV9NU0VDUwkJMTAJCS8qIGFyYml0cmFyeSAqLworI2RlZmluZSBFSENJX0lBQV9KSUZGSUVTCShIWi8xMDApCS8qIGFyYml0cmFyeTsgfjEwIG1zZWMgKi8KICNkZWZpbmUgRUhDSV9JT19KSUZGSUVTCQkoSFovMTApCQkvKiBpbyB3YXRjaGRvZyA+IGlycV90aHJlc2ggKi8KICNkZWZpbmUgRUhDSV9BU1lOQ19KSUZGSUVTCShIWi8yMCkJCS8qIGFzeW5jIGlkbGUgdGltZW91dCAqLwogI2RlZmluZSBFSENJX1NIUklOS19KSUZGSUVTCShIWi8yMDApCS8qIGFzeW5jIHFoIHVubGluayBkZWxheSAqLwpAQCAtMTI2LDYgKzEyNiwxMSBAQAogbW9kdWxlX3BhcmFtIChwYXJrLCB1aW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MgKHBhcmssICJwYXJrIHNldHRpbmc7IDEtMyBiYWNrLXRvLWJhY2sgYXN5bmMgcGFja2V0cyIpOwogCisvKiBmb3IgZmxha2V5IGhhcmR3YXJlLCBpZ25vcmUgb3ZlcmN1cnJlbnQgaW5kaWNhdG9ycyAqLworc3RhdGljIGludCBpZ25vcmVfb2MgPSAwOworbW9kdWxlX3BhcmFtIChpZ25vcmVfb2MsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyAoaWdub3JlX29jLCAiaWdub3JlIGJvZ3VzIGhhcmR3YXJlIG92ZXJjdXJyZW50IGluZGljYXRpb25zIik7CisKICNkZWZpbmUJSU5UUl9NQVNLIChTVFNfSUFBIHwgU1RTX0ZBVEFMIHwgU1RTX1BDRCB8IFNUU19FUlIgfCBTVFNfSU5UKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjU0LDcgKzI1OSw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyB2b2lkIGVuZF91bmxpbmtfYXN5bmMgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSk7CiBzdGF0aWMgdm9pZCBlaGNpX3dvcmsoc3RydWN0IGVoY2lfaGNkICplaGNpKTsKIAogI2luY2x1ZGUgImVoY2ktaHViLmMiCkBAIC0yNjQsMjkgKzI2OCw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyB2b2lkIGVoY2lfaWFhX3dhdGNoZG9nICh1bnNpZ25lZCBsb25nIHBhcmFtKQotewotCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSAoc3RydWN0IGVoY2lfaGNkICopIHBhcmFtOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCXUzMgkJCXN0YXR1czsKLQotCXNwaW5fbG9ja19pcnFzYXZlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwotCVdBUk5fT04oIWVoY2ktPnJlY2xhaW0pOwotCi0JLyogbG9zdCBJQUEgaXJxcyB3ZWRnZSB0aGluZ3MgYmFkbHk7IHNlZW4gZmlyc3Qgd2l0aCBhIHZ0ODIzNSAqLwotCWlmIChlaGNpLT5yZWNsYWltKSB7Ci0JCXN0YXR1cyA9IHJlYWRsICgmZWhjaS0+cmVncy0+c3RhdHVzKTsKLQkJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKLQkJCWVoY2lfdmRiZyAoZWhjaSwgImxvc3QgSUFBXG4iKTsKLQkJCUNPVU5UIChlaGNpLT5zdGF0cy5sb3N0X2lhYSk7Ci0JCQl3cml0ZWwgKFNUU19JQUEsICZlaGNpLT5yZWdzLT5zdGF0dXMpOwotCQkJZW5kX3VubGlua19hc3luYyAoZWhjaSk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBlaGNpX3dhdGNoZG9nICh1bnNpZ25lZCBsb25nIHBhcmFtKQogewogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSAoc3RydWN0IGVoY2lfaGNkICopIHBhcmFtOwpAQCAtMjk0LDcgKzI3NSwxOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CiAKLQkvKiBzdG9wIGFzeW5jIHByb2Nlc3NpbmcgYWZ0ZXIgaXQncyBpZGxlZCBhIGJpdCAqLworCS8qIGxvc3QgSUFBIGlycXMgd2VkZ2UgdGhpbmdzIGJhZGx5OyBzZWVuIHdpdGggYSB2dDgyMzUgKi8KKwlpZiAoZWhjaS0+cmVjbGFpbSkgeworCQl1MzIJCXN0YXR1cyA9IHJlYWRsICgmZWhjaS0+cmVncy0+c3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKKwkJCWVoY2lfdmRiZyAoZWhjaSwgImxvc3QgSUFBXG4iKTsKKwkJCUNPVU5UIChlaGNpLT5zdGF0cy5sb3N0X2lhYSk7CisJCQl3cml0ZWwgKFNUU19JQUEsICZlaGNpLT5yZWdzLT5zdGF0dXMpOworCQkJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDE7CisJCX0KKwl9CisKKyAJLyogc3RvcCBhc3luYyBwcm9jZXNzaW5nIGFmdGVyIGl0J3MgaWRsZWQgYSBiaXQgKi8KIAlpZiAodGVzdF9iaXQgKFRJTUVSX0FTWU5DX09GRiwgJmVoY2ktPmFjdGlvbnMpKQogCQlzdGFydF91bmxpbmtfYXN5bmMgKGVoY2ksIGVoY2ktPmFzeW5jKTsKIApAQCAtMzQ1LDYgKzMzNyw4IEBACiBzdGF0aWMgdm9pZCBlaGNpX3dvcmsgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKIHsKIAl0aW1lcl9hY3Rpb25fZG9uZSAoZWhjaSwgVElNRVJfSU9fV0FUQ0hET0cpOworCWlmIChlaGNpLT5yZWNsYWltX3JlYWR5KQorCQllbmRfdW5saW5rX2FzeW5jIChlaGNpKTsKIAogCS8qIGFub3RoZXIgQ1BVIG1heSBkcm9wIGVoY2ktPmxvY2sgZHVyaW5nIGEgc2NoZWR1bGUgc2NhbiB3aGlsZQogCSAqIGl0IHJlcG9ydHMgdXJiIGNvbXBsZXRpb25zLiAgdGhpcyBmbGFnIGd1YXJkcyBhZ2FpbnN0IGJvZ3VzCkBAIC0zNzksNyArMzczLDYgQEAKIAogCS8qIG5vIG1vcmUgaW50ZXJydXB0cyAuLi4gKi8KIAlkZWxfdGltZXJfc3luYyAoJmVoY2ktPndhdGNoZG9nKTsKLQlkZWxfdGltZXJfc3luYyAoJmVoY2ktPmlhYV93YXRjaGRvZyk7CiAKIAlzcGluX2xvY2tfaXJxKCZlaGNpLT5sb2NrKTsKIAlpZiAoSENfSVNfUlVOTklORyAoaGNkLT5zdGF0ZSkpCkBAIC00MjYsMTAgKzQxOSw2IEBACiAJZWhjaS0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBlaGNpX3dhdGNoZG9nOwogCWVoY2ktPndhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZWhjaTsKIAotCWluaXRfdGltZXIoJmVoY2ktPmlhYV93YXRjaGRvZyk7Ci0JZWhjaS0+aWFhX3dhdGNoZG9nLmZ1bmN0aW9uID0gZWhjaV9pYWFfd2F0Y2hkb2c7Ci0JZWhjaS0+aWFhX3dhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZWhjaTsKLQogCS8qCiAJICogaHcgZGVmYXVsdDogMUsgcGVyaW9kaWMgbGlzdCBoZWFkcywgb25lIHBlciBmcmFtZS4KIAkgKiBwZXJpb2RpY19zaXplIGNhbiBzaHJpbmsgYnkgVVNCQ01EIHVwZGF0ZSBpZiBoY2NfcGFyYW1zIGFsbG93cy4KQEAgLTQ0Niw2ICs0MzUsNyBAQAogCQllaGNpLT5pX3RocmVzaCA9IDIgKyBIQ0NfSVNPQ19USFJFUyhoY2NfcGFyYW1zKTsKIAogCWVoY2ktPnJlY2xhaW0gPSBOVUxMOworCWVoY2ktPnJlY2xhaW1fcmVhZHkgPSAwOwogCWVoY2ktPm5leHRfdWZyYW1lID0gLTE7CiAKIAkvKgpAQCAtNTU2LDkgKzU0NiwxMCBAQAogCiAJdGVtcCA9IEhDX1ZFUlNJT04ocmVhZGwgKCZlaGNpLT5jYXBzLT5oY19jYXBiYXNlKSk7CiAJZWhjaV9pbmZvIChlaGNpLAotCQkiVVNCICV4LiV4IHN0YXJ0ZWQsIEVIQ0kgJXguJTAyeCwgZHJpdmVyICVzXG4iLAorCQkiVVNCICV4LiV4IHN0YXJ0ZWQsIEVIQ0kgJXguJTAyeCwgZHJpdmVyICVzJXNcbiIsCiAJCSgoZWhjaS0+c2JybiAmIDB4ZjApPj40KSwgKGVoY2ktPnNicm4gJiAweDBmKSwKLQkJdGVtcCA+PiA4LCB0ZW1wICYgMHhmZiwgRFJJVkVSX1ZFUlNJT04pOworCQl0ZW1wID4+IDgsIHRlbXAgJiAweGZmLCBEUklWRVJfVkVSU0lPTiwKKwkJaWdub3JlX29jID8gIiwgb3ZlcmN1cnJlbnQgaWdub3JlZCIgOiAiIik7CiAKIAl3cml0ZWwgKElOVFJfTUFTSywgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsgLyogVHVybiBPbiBJbnRlcnJ1cHRzICovCiAKQEAgLTYxOSw3ICs2MTAsNyBAQAogCS8qIGNvbXBsZXRlIHRoZSB1bmxpbmtpbmcgb2Ygc29tZSBxaCBbNC4xNS4yLjNdICovCiAJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKIAkJQ09VTlQgKGVoY2ktPnN0YXRzLnJlY2xhaW0pOwotCQllbmRfdW5saW5rX2FzeW5jIChlaGNpKTsKKwkJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDE7CiAJCWJoID0gMTsKIAl9CiAKQEAgLTYyOCw5ICs2MTksOCBAQAogCQl1bnNpZ25lZAlpID0gSENTX05fUE9SVFMgKGVoY2ktPmhjc19wYXJhbXMpOwogCiAJCS8qIHJlc3VtZSByb290IGh1Yj8gKi8KLQkJc3RhdHVzID0gcmVhZGwgKCZlaGNpLT5yZWdzLT5jb21tYW5kKTsKLQkJaWYgKCEoc3RhdHVzICYgQ01EX1JVTikpCi0JCQl3cml0ZWwgKHN0YXR1cyB8IENNRF9SVU4sICZlaGNpLT5yZWdzLT5jb21tYW5kKTsKKwkJaWYgKCEocmVhZGwoJmVoY2ktPnJlZ3MtPmNvbW1hbmQpICYgQ01EX1JVTikpCisJCQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOwogCiAJCXdoaWxlIChpLS0pIHsKIAkJCWludCBwc3RhdHVzID0gcmVhZGwgKCZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbaV0pOwpAQCAtNjQ3LDcgKzYzNyw2IEBACiAJCQkgKi8KIAkJCWVoY2ktPnJlc2V0X2RvbmUgW2ldID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMgKDIwKTsKIAkJCWVoY2lfZGJnIChlaGNpLCAicG9ydCAlZCByZW1vdGUgd2FrZXVwXG4iLCBpICsgMSk7Ci0JCQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihoY2QpOwogCQl9CiAJfQogCkBAIC03MjMsMTQgKzcxMiwxMCBAQAogCiBzdGF0aWMgdm9pZCB1bmxpbmtfYXN5bmMgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IGVoY2lfcWggKnFoKQogewotCS8vIEJVR19PTihxaC0+cWhfc3RhdGUgIT0gUUhfU1RBVEVfTElOS0VEKTsKLQotCS8qIGZhaWxmYXN0ICovCi0JaWYgKCFIQ19JU19SVU5OSU5HIChlaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUpKQotCQllbmRfdW5saW5rX2FzeW5jIChlaGNpKTsKLQotCS8qIGRlZmVyIHRpbGwgbGF0ZXIgaWYgYnVzeSAqLwotCWVsc2UgaWYgKGVoY2ktPnJlY2xhaW0pIHsKKwkvKiBpZiB3ZSBuZWVkIHRvIHVzZSBJQUEgYW5kIGl0J3MgYnVzeSwgZGVmZXIgKi8KKwlpZiAocWgtPnFoX3N0YXRlID09IFFIX1NUQVRFX0xJTktFRAorCQkJJiYgZWhjaS0+cmVjbGFpbQorCQkJJiYgSENfSVNfUlVOTklORyAoZWhjaV90b19oY2QoZWhjaSktPnN0YXRlKSkgewogCQlzdHJ1Y3QgZWhjaV9xaAkJKmxhc3Q7CiAKIAkJZm9yIChsYXN0ID0gZWhjaS0+cmVjbGFpbTsKQEAgLTc0MCw4ICs3MjUsMTIgQEAKIAkJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfVU5MSU5LX1dBSVQ7CiAJCWxhc3QtPnJlY2xhaW0gPSBxaDsKIAotCS8qIHN0YXJ0IElBQSBjeWNsZSAqLwotCX0gZWxzZQorCS8qIGJ5cGFzcyBJQUEgaWYgdGhlIGhjIGNhbid0IGNhcmUgKi8KKwl9IGVsc2UgaWYgKCFIQ19JU19SVU5OSU5HIChlaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUpICYmIGVoY2ktPnJlY2xhaW0pCisJCWVuZF91bmxpbmtfYXN5bmMgKGVoY2kpOworCisJLyogc29tZXRoaW5nIGVsc2UgbWlnaHQgaGF2ZSB1bmxpbmtlZCB0aGUgcWggYnkgbm93ICovCisJaWYgKHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9MSU5LRUQpCiAJCXN0YXJ0X3VubGlua19hc3luYyAoZWhjaSwgcWgpOwogfQogCkBAIC03NjMsMTkgKzc1Miw3IEBACiAJCXFoID0gKHN0cnVjdCBlaGNpX3FoICopIHVyYi0+aGNwcml2OwogCQlpZiAoIXFoKQogCQkJYnJlYWs7Ci0JCXN3aXRjaCAocWgtPnFoX3N0YXRlKSB7Ci0JCWNhc2UgUUhfU1RBVEVfTElOS0VEOgotCQljYXNlIFFIX1NUQVRFX0NPTVBMRVRJTkc6Ci0JCQl1bmxpbmtfYXN5bmMgKGVoY2ksIHFoKTsKLQkJCWJyZWFrOwotCQljYXNlIFFIX1NUQVRFX1VOTElOSzoKLQkJY2FzZSBRSF9TVEFURV9VTkxJTktfV0FJVDoKLQkJCS8qIGFscmVhZHkgc3RhcnRlZCAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgUUhfU1RBVEVfSURMRToKLQkJCVdBUk5fT04oMSk7Ci0JCQlicmVhazsKLQkJfQorCQl1bmxpbmtfYXN5bmMgKGVoY2ksIHFoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBJUEVfSU5URVJSVVBUOgpAQCAtODY3LDcgKzg0NCw2IEBACiAJCXVubGlua19hc3luYyAoZWhjaSwgcWgpOwogCQkvKiBGQUxMIFRIUk9VR0ggKi8KIAljYXNlIFFIX1NUQVRFX1VOTElOSzoJCS8qIHdhaXQgZm9yIGh3IHRvIGZpbmlzaD8gKi8KLQljYXNlIFFIX1NUQVRFX1VOTElOS19XQUlUOgogaWRsZV90aW1lb3V0OgogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwppbmRleCAyMDEyMjEzLi5iZmU1ZjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCkBAIC0zNCw2ICszNCw3IEBACiB7CiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwogCWludAkJCXBvcnQ7CisJaW50CQkJbWFzazsKIAogCWlmICh0aW1lX2JlZm9yZSAoamlmZmllcywgZWhjaS0+bmV4dF9zdGF0ZWNoYW5nZSkpCiAJCW1zbGVlcCg1KTsKQEAgLTQ4LDE3ICs0OSwyOCBAQAogCX0KIAllaGNpLT5jb21tYW5kID0gcmVhZGwgKCZlaGNpLT5yZWdzLT5jb21tYW5kKTsKIAlpZiAoZWhjaS0+cmVjbGFpbSkKLQkJZW5kX3VubGlua19hc3luYyAoZWhjaSk7CisJCWVoY2ktPnJlY2xhaW1fcmVhZHkgPSAxOwogCWVoY2lfd29yayhlaGNpKTsKIAotCS8qIHN1c3BlbmQgYW55IGFjdGl2ZS91bnN1c3BlbmRlZCBwb3J0cywgbWF5YmUgYWxsb3cgd2FrZXVwICovCisJLyogVW5saWtlIG90aGVyIFVTQiBob3N0IGNvbnRyb2xsZXIgdHlwZXMsIEVIQ0kgZG9lc24ndCBoYXZlCisJICogYW55IG5vdGlvbiBvZiAiZ2xvYmFsIiBvciBidXMtd2lkZSBzdXNwZW5kLiAgVGhlIGRyaXZlciBoYXMKKwkgKiB0byBtYW51YWxseSBzdXNwZW5kIGFsbCB0aGUgYWN0aXZlIHVuc3VzcGVuZGVkIHBvcnRzLCBhbmQKKwkgKiB0aGVuIG1hbnVhbGx5IHJlc3VtZSB0aGVtIGluIHRoZSBidXNfcmVzdW1lKCkgcm91dGluZS4KKwkgKi8KKwllaGNpLT5idXNfc3VzcGVuZGVkID0gMDsKIAl3aGlsZSAocG9ydC0tKSB7CiAJCXUzMiBfX2lvbWVtCSpyZWcgPSAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW3BvcnRdOwogCQl1MzIJCXQxID0gcmVhZGwgKHJlZykgJiB+UE9SVF9SV0NfQklUUzsKIAkJdTMyCQl0MiA9IHQxOwogCi0JCWlmICgodDEgJiBQT1JUX1BFKSAmJiAhKHQxICYgUE9SVF9PV05FUikpCisJCS8qIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydHMgd2Ugc3VzcGVuZCAqLworCQlpZiAoKHQxICYgUE9SVF9QRSkgJiYgISh0MSAmIFBPUlRfT1dORVIpICYmCisJCQkJISh0MSAmIFBPUlRfU1VTUEVORCkpIHsKIAkJCXQyIHw9IFBPUlRfU1VTUEVORDsKKwkJCXNldF9iaXQocG9ydCwgJmVoY2ktPmJ1c19zdXNwZW5kZWQpOworCQl9CisKKwkJLyogZW5hYmxlIHJlbW90ZSB3YWtldXAgb24gYWxsIHBvcnRzICovCiAJCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYpKQogCQkJdDIgfD0gUE9SVF9XS09DX0V8UE9SVF9XS0RJU0NfRXxQT1JUX1dLQ09OTl9FOwogCQllbHNlCkBAIC03Niw2ICs4OCwxMyBAQAogCWVoY2lfaGFsdCAoZWhjaSk7CiAJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKIAorCS8qIGFsbG93IHJlbW90ZSB3YWtldXAgKi8KKwltYXNrID0gSU5UUl9NQVNLOworCWlmICghZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKKwkJbWFzayAmPSB+U1RTX1BDRDsKKwl3cml0ZWwobWFzaywgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKKwlyZWFkbCgmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOworCiAJZWhjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwKTsKIAlzcGluX3VubG9ja19pcnEgKCZlaGNpLT5sb2NrKTsKIAlyZXR1cm4gMDsKQEAgLTg4LDcgKzEwNyw2IEBACiAJc3RydWN0IGVoY2lfaGNkCQkqZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwogCXUzMgkJCXRlbXA7CiAJaW50CQkJaTsKLQlpbnQJCQlpbnRyX2VuYWJsZTsKIAogCWlmICh0aW1lX2JlZm9yZSAoamlmZmllcywgZWhjaS0+bmV4dF9zdGF0ZWNoYW5nZSkpCiAJCW1zbGVlcCg1KTsKQEAgLTEwMCwzMSArMTE4LDMwIEBACiAJICogdGhlIGxhc3QgdXNlciBvZiB0aGUgY29udHJvbGxlciwgbm90IHJlc2V0L3BtIGhhcmR3YXJlIGtlZXBpbmcKIAkgKiBzdGF0ZSB3ZSBnYXZlIHRvIGl0LgogCSAqLworCXRlbXAgPSByZWFkbCgmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOworCWVoY2lfZGJnKGVoY2ksICJyZXN1bWUgcm9vdCBodWIlc1xuIiwgdGVtcCA/ICIiIDogIiBhZnRlciBwb3dlciBsb3NzIik7CiAKLQkvKiByZS1pbml0IG9wZXJhdGlvbmFsIHJlZ2lzdGVycyBpbiBjYXNlIHdlIGxvc3QgcG93ZXIgKi8KLQlpZiAocmVhZGwgKCZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSkgPT0gMCkgewotCQkvKiBhdCBsZWFzdCBzb21lIEFQTSBpbXBsZW1lbnRhdGlvbnMgd2lsbCB0cnkgdG8gZGVsaXZlcgotCQkgKiBJUlFzIHJpZ2h0IGF3YXksIHNvIGRlbGF5IHRoZW0gdW50aWwgd2UncmUgcmVhZHkuCi0JCSAqLwotCQlpbnRyX2VuYWJsZSA9IDE7Ci0JCXdyaXRlbCAoMCwgJmVoY2ktPnJlZ3MtPnNlZ21lbnQpOwotCQl3cml0ZWwgKGVoY2ktPnBlcmlvZGljX2RtYSwgJmVoY2ktPnJlZ3MtPmZyYW1lX2xpc3QpOwotCQl3cml0ZWwgKCh1MzIpZWhjaS0+YXN5bmMtPnFoX2RtYSwgJmVoY2ktPnJlZ3MtPmFzeW5jX25leHQpOwotCX0gZWxzZQotCQlpbnRyX2VuYWJsZSA9IDA7Ci0JZWhjaV9kYmcoZWhjaSwgInJlc3VtZSByb290IGh1YiVzXG4iLAotCQkJaW50cl9lbmFibGUgPyAiIGFmdGVyIHBvd2VyIGxvc3MiIDogIiIpOworCS8qIGF0IGxlYXN0IHNvbWUgQVBNIGltcGxlbWVudGF0aW9ucyB3aWxsIHRyeSB0byBkZWxpdmVyCisJICogSVJRcyByaWdodCBhd2F5LCBzbyBkZWxheSB0aGVtIHVudGlsIHdlJ3JlIHJlYWR5LgorCSAqLworCXdyaXRlbCgwLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOworCisJLyogcmUtaW5pdCBvcGVyYXRpb25hbCByZWdpc3RlcnMgKi8KKwl3cml0ZWwoMCwgJmVoY2ktPnJlZ3MtPnNlZ21lbnQpOworCXdyaXRlbChlaGNpLT5wZXJpb2RpY19kbWEsICZlaGNpLT5yZWdzLT5mcmFtZV9saXN0KTsKKwl3cml0ZWwoKHUzMikgZWhjaS0+YXN5bmMtPnFoX2RtYSwgJmVoY2ktPnJlZ3MtPmFzeW5jX25leHQpOwogCiAJLyogcmVzdG9yZSBDTURfUlVOLCBmcmFtZWxpc3Qgc2l6ZSwgYW5kIGlycSB0aHJlc2hvbGQgKi8KIAl3cml0ZWwgKGVoY2ktPmNvbW1hbmQsICZlaGNpLT5yZWdzLT5jb21tYW5kKTsKIAotCS8qIHRha2UgcG9ydHMgb3V0IG9mIHN1c3BlbmQgKi8KKwkvKiBtYW51YWxseSByZXN1bWUgdGhlIHBvcnRzIHdlIHN1c3BlbmRlZCBkdXJpbmcgYnVzX3N1c3BlbmQoKSAqLwogCWkgPSBIQ1NfTl9QT1JUUyAoZWhjaS0+aGNzX3BhcmFtcyk7CiAJd2hpbGUgKGktLSkgewogCQl0ZW1wID0gcmVhZGwgKCZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbaV0pOwogCQl0ZW1wICY9IH4oUE9SVF9SV0NfQklUUwogCQkJfCBQT1JUX1dLT0NfRSB8IFBPUlRfV0tESVNDX0UgfCBQT1JUX1dLQ09OTl9FKTsKLQkJaWYgKHRlbXAgJiBQT1JUX1NVU1BFTkQpIHsKKwkJaWYgKHRlc3RfYml0KGksICZlaGNpLT5idXNfc3VzcGVuZGVkKSAmJgorCQkJCSh0ZW1wICYgUE9SVF9TVVNQRU5EKSkgewogCQkJZWhjaS0+cmVzZXRfZG9uZSBbaV0gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyAoMjApOwogCQkJdGVtcCB8PSBQT1JUX1JFU1VNRTsKIAkJfQpAQCAtMTM0LDExICsxNTEsMTIgQEAKIAltZGVsYXkgKDIwKTsKIAl3aGlsZSAoaS0tKSB7CiAJCXRlbXAgPSByZWFkbCAoJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtpXSk7Ci0JCWlmICgodGVtcCAmIFBPUlRfU1VTUEVORCkgPT0gMCkKLQkJCWNvbnRpbnVlOwotCQl0ZW1wICY9IH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUkVTVU1FKTsKLQkJd3JpdGVsICh0ZW1wLCAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKLQkJZWhjaV92ZGJnIChlaGNpLCAicmVzdW1lZCBwb3J0ICVkXG4iLCBpICsgMSk7CisJCWlmICh0ZXN0X2JpdChpLCAmZWhjaS0+YnVzX3N1c3BlbmRlZCkgJiYKKwkJCQkodGVtcCAmIFBPUlRfU1VTUEVORCkpIHsKKwkJCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9SRVNVTUUpOworCQkJd3JpdGVsICh0ZW1wLCAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKKwkJCWVoY2lfdmRiZyAoZWhjaSwgInJlc3VtZWQgcG9ydCAlZFxuIiwgaSArIDEpOworCQl9CiAJfQogCSh2b2lkKSByZWFkbCAoJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwogCkBAIC0xNTcsOCArMTc1LDcgQEAKIAloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKIAogCS8qIE5vdyB3ZSBjYW4gc2FmZWx5IHJlLWVuYWJsZSBpcnFzICovCi0JaWYgKGludHJfZW5hYmxlKQotCQl3cml0ZWwgKElOVFJfTUFTSywgJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKKwl3cml0ZWwoSU5UUl9NQVNLLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOwogCiAJc3Bpbl91bmxvY2tfaXJxICgmZWhjaS0+bG9jayk7CiAJcmV0dXJuIDA7CkBAIC0yMTgsNiArMjM1LDcgQEAKIHsKIAlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2kgPSBoY2RfdG9fZWhjaSAoaGNkKTsKIAl1MzIJCXRlbXAsIHN0YXR1cyA9IDA7CisJdTMyCQltYXNrOwogCWludAkJcG9ydHMsIGksIHJldHZhbCA9IDE7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIApAQCAtMjMzLDYgKzI1MSwxOCBAQAogCQlyZXR2YWwrKzsKIAl9CiAKKwkvKiBTb21lIGJvYXJkcyAobW9zdGx5IFZJQT8pIHJlcG9ydCBib2d1cyBvdmVyY3VycmVudCBpbmRpY2F0aW9ucywKKwkgKiBjYXVzaW5nIG1hc3NpdmUgbG9nIHNwYW0gdW5sZXNzIHdlIGNvbXBsZXRlbHkgaWdub3JlIHRoZW0uICBJdAorCSAqIG1heSBiZSByZWxldmFudCB0aGF0IFZJQSBWVDgyMzUgY29udHJvbGVycywgd2hlcmUgUE9SVF9QT1dFUiBpcworCSAqIGFsd2F5cyBzZXQsIHNlZW0gdG8gY2xlYXIgUE9SVF9PQ0MgYW5kIFBPUlRfQ1NDIHdoZW4gd3JpdGluZyB0bworCSAqIFBPUlRfUE9XRVI7IHRoYXQncyBzdXJwcmlzaW5nLCBidXQgbWF5YmUgd2l0aGluLXNwZWMuCisJICovCisJaWYgKCFpZ25vcmVfb2MpCisJCW1hc2sgPSBQT1JUX0NTQyB8IFBPUlRfUEVDIHwgUE9SVF9PQ0M7CisJZWxzZQorCQltYXNrID0gUE9SVF9DU0MgfCBQT1JUX1BFQzsKKwkvLyBQT1JUX1JFU1VNRSBmcm9tIGhhcmR3YXJlIH49IFBPUlRfU1RBVF9DX1NVU1BFTkQKKwogCS8qIG5vIGh1YiBjaGFuZ2UgcmVwb3J0cyAoYml0IDApIGZvciBub3cgKHBvd2VyLCAuLi4pICovCiAKIAkvKiBwb3J0IE4gY2hhbmdlcyAoYml0IE4pPyAqLwpAQCAtMjUwLDggKzI4MCw3IEBACiAJCX0KIAkJaWYgKCEodGVtcCAmIFBPUlRfQ09OTkVDVCkpCiAJCQllaGNpLT5yZXNldF9kb25lIFtpXSA9IDA7Ci0JCWlmICgodGVtcCAmIChQT1JUX0NTQyB8IFBPUlRfUEVDIHwgUE9SVF9PQ0MpKSAhPSAwCi0JCQkJLy8gUE9SVF9TVEFUX0NfU1VTUEVORD8KKwkJaWYgKCh0ZW1wICYgbWFzaykgIT0gMAogCQkJCXx8ICgodGVtcCAmIFBPUlRfUkVTVU1FKSAhPSAwCiAJCQkJCSYmIHRpbWVfYWZ0ZXIgKGppZmZpZXMsCiAJCQkJCQllaGNpLT5yZXNldF9kb25lIFtpXSkpKSB7CkBAIC0zMTksNiArMzQ4LDcgQEAKIAl1MzIJCXRlbXAsIHN0YXR1czsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCWludAkJcmV0dmFsID0gMDsKKwl1bnNpZ25lZAlzZWxlY3RvcjsKIAogCS8qCiAJICogRklYTUU6ICBzdXBwb3J0IFNldFBvcnRGZWF0dXJlcyBVU0JfUE9SVF9GRUFUX0lORElDQVRPUi4KQEAgLTQxNyw3ICs0NDcsNyBAQAogCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT047CiAJCWlmICh0ZW1wICYgUE9SVF9QRUMpCiAJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOwotCQlpZiAodGVtcCAmIFBPUlRfT0NDKQorCQlpZiAoKHRlbXAgJiBQT1JUX09DQykgJiYgIWlnbm9yZV9vYykKIAkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlQ7CiAKIAkJLyogd2hvZXZlciByZXN1bWVzIG11c3QgR2V0UG9ydFN0YXR1cyB0byBjb21wbGV0ZSBpdCEhICovCkBAIC01MDYsNiArNTM2LDggQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFNldFBvcnRGZWF0dXJlOgorCQlzZWxlY3RvciA9IHdJbmRleCA+PiA4OworCQl3SW5kZXggJj0gMHhmZjsKIAkJaWYgKCF3SW5kZXggfHwgd0luZGV4ID4gcG9ydHMpCiAJCQlnb3RvIGVycm9yOwogCQl3SW5kZXgtLTsKQEAgLTU1OSw2ICs1OTEsMjIgQEAKIAkJCX0KIAkJCXdyaXRlbCAodGVtcCwgJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFt3SW5kZXhdKTsKIAkJCWJyZWFrOworCisJCS8qIEZvciBkb3duc3RyZWFtIGZhY2luZyBwb3J0cyAodGhlc2UpOiAgb25lIGh1YiBwb3J0IGlzIHB1dAorCQkgKiBpbnRvIHRlc3QgbW9kZSBhY2NvcmRpbmcgdG8gVVNCMiAxMS4yNC4yLjEzLCB0aGVuIHRoZSBodWIKKwkJICogbXVzdCBiZSByZXNldCAod2hpY2ggZm9yIHJvb3QgaHViIG5vdyBtZWFucyBybW1vZCttb2Rwcm9iZSwKKwkJICogb3IgZWxzZSBzeXN0ZW0gcmVib290KS4gIFNlZSBFSENJIDIuMy45IGFuZCA0LjE0IGZvciBpbmZvCisJCSAqIGFib3V0IHRoZSBFSENJLXNwZWNpZmljIHN0dWZmLgorCQkgKi8KKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1RFU1Q6CisJCQlpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yID4gNSkKKwkJCQlnb3RvIGVycm9yOworCQkJZWhjaV9xdWllc2NlKGVoY2kpOworCQkJZWhjaV9oYWx0KGVoY2kpOworCQkJdGVtcCB8PSBzZWxlY3RvciA8PCAxNjsKKwkJCXdyaXRlbCAodGVtcCwgJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFt3SW5kZXhdKTsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlnb3RvIGVycm9yOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMKaW5kZXggMzVlM2ZhYi4uNGJjNzk3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYwpAQCAtMjU3LDkgKzI1Nyw3IEBACiBzdGF0aWMgaW50IGVoY2lfcGNpX3Jlc3VtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOwotCXVuc2lnbmVkCQlwb3J0OwogCXN0cnVjdCBwY2lfZGV2CQkqcGRldiA9IHRvX3BjaV9kZXYoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwotCWludAkJCXJldHZhbCA9IC1FSU5WQUw7CiAKIAkvLyBtYXliZSByZXN0b3JlIEZMQURKCiAKQEAgLTI2OSwyNyArMjY3LDE5IEBACiAJLyogTWFyayBoYXJkd2FyZSBhY2Nlc3NpYmxlIGFnYWluIGFzIHdlIGFyZSBvdXQgb2YgRDMgc3RhdGUgYnkgbm93ICovCiAJc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CiAKLQkvKiBJZiBDRiBpcyBjbGVhciwgd2UgbG9zdCBQQ0kgVmF1eCBwb3dlciBhbmQgbmVlZCB0byByZXN0YXJ0LiAgKi8KLQlpZiAocmVhZGwoJmVoY2ktPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZykgIT0gRkxBR19DRikKLQkJZ290byByZXN0YXJ0OwotCi0JLyogSWYgYW55IHBvcnQgaXMgc3VzcGVuZGVkIChvciBvd25lZCBieSB0aGUgY29tcGFuaW9uKSwKLQkgKiB3ZSBrbm93IHdlIGNhbi9tdXN0IHJlc3VtZSB0aGUgSEMgKGFuZCBtdXN0bid0IHJlc2V0IGl0KS4KLQkgKiBXZSBqdXN0IGRlZmVyIHRoYXQgdG8gdGhlIHJvb3QgaHViIGNvZGUuCisJLyogSWYgQ0YgaXMgc3RpbGwgc2V0LCB3ZSBtYWludGFpbmVkIFBDSSBWYXV4IHBvd2VyLgorCSAqIEp1c3QgdW5kbyB0aGUgZWZmZWN0IG9mIGVoY2lfcGNpX3N1c3BlbmQoKS4KIAkgKi8KLQlmb3IgKHBvcnQgPSBIQ1NfTl9QT1JUUyhlaGNpLT5oY3NfcGFyYW1zKTsgcG9ydCA+IDA7ICkgewotCQl1MzIJc3RhdHVzOwotCQlwb3J0LS07Ci0JCXN0YXR1cyA9IHJlYWRsKCZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbcG9ydF0pOwotCQlpZiAoIShzdGF0dXMgJiBQT1JUX1BPV0VSKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RhdHVzICYgKFBPUlRfU1VTUEVORCB8IFBPUlRfUkVTVU1FIHwgUE9SVF9PV05FUikpIHsKLQkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKGhjZCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQorCWlmIChyZWFkbCgmZWhjaS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKSA9PSBGTEFHX0NGKSB7CisJCWludAltYXNrID0gSU5UUl9NQVNLOworCisJCWlmICghZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKKwkJCW1hc2sgJj0gflNUU19QQ0Q7CisJCXdyaXRlbChtYXNrLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOworCQlyZWFkbCgmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOworCQlyZXR1cm4gMDsKIAl9CiAKLXJlc3RhcnQ6CiAJZWhjaV9kYmcoZWhjaSwgImxvc3QgcG93ZXIsIHJlc3RhcnRpbmdcbiIpOwogCXVzYl9yb290X2h1Yl9sb3N0X3Bvd2VyKGhjZC0+c2VsZi5yb290X2h1Yik7CiAKQEAgLTMwMywxNyArMjkzLDE5IEBACiAJLyogZW1wdHlpbmcgdGhlIHNjaGVkdWxlIGFib3J0cyBhbnkgdXJicyAqLwogCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOwogCWlmIChlaGNpLT5yZWNsYWltKQotCQllbmRfdW5saW5rX2FzeW5jIChlaGNpKTsKKwkJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDE7CiAJZWhjaV93b3JrKGVoY2kpOwogCXNwaW5fdW5sb2NrX2lycSgmZWhjaS0+bG9jayk7CiAKLQkvKiByZXN0YXJ0OyBraHViZCB3aWxsIGRpc2Nvbm5lY3QgZGV2aWNlcyAqLwotCXJldHZhbCA9IGVoY2lfcnVuKGhjZCk7Ci0KIAkvKiBoZXJlIHdlICJrbm93IiByb290IHBvcnRzIHNob3VsZCBhbHdheXMgc3RheSBwb3dlcmVkICovCiAJZWhjaV9wb3J0X3Bvd2VyKGVoY2ksIDEpOwogCi0JcmV0dXJuIHJldHZhbDsKKwl3cml0ZWwoZWhjaS0+Y29tbWFuZCwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOworCXdyaXRlbChGTEFHX0NGLCAmZWhjaS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKTsKKwlyZWFkbCgmZWhjaS0+cmVncy0+Y29tbWFuZCk7CS8qIHVuYmxvY2sgcG9zdGVkIHdyaXRlcyAqLworCisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwppbmRleCA0NjMyNzI3Li42MmU0NmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKQEAgLTk2Nyw3ICs5NjcsNyBAQAogCXN0cnVjdCBlaGNpX3FoCQkqcWggPSBlaGNpLT5yZWNsYWltOwogCXN0cnVjdCBlaGNpX3FoCQkqbmV4dDsKIAotCWlhYV93YXRjaGRvZ19kb25lIChlaGNpKTsKKwl0aW1lcl9hY3Rpb25fZG9uZSAoZWhjaSwgVElNRVJfSUFBX1dBVENIRE9HKTsKIAogCS8vIHFoLT5od19uZXh0ID0gY3B1X3RvX2xlMzIgKHFoLT5xaF9kbWEpOwogCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX0lETEU7CkBAIC05NzcsNiArOTc3LDcgQEAKIAkvKiBvdGhlciB1bmxpbmsocykgbWF5IGJlIHBlbmRpbmcgKGluIFFIX1NUQVRFX1VOTElOS19XQUlUKSAqLwogCW5leHQgPSBxaC0+cmVjbGFpbTsKIAllaGNpLT5yZWNsYWltID0gbmV4dDsKKwllaGNpLT5yZWNsYWltX3JlYWR5ID0gMDsKIAlxaC0+cmVjbGFpbSA9IE5VTEw7CiAKIAlxaF9jb21wbGV0aW9ucyAoZWhjaSwgcWgpOwpAQCAtMTA1MSwxMCArMTA1MiwxMSBAQAogCQlyZXR1cm47CiAJfQogCisJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDA7CiAJY21kIHw9IENNRF9JQUFEOwogCXdyaXRlbCAoY21kLCAmZWhjaS0+cmVncy0+Y29tbWFuZCk7CiAJKHZvaWQpIHJlYWRsICgmZWhjaS0+cmVncy0+Y29tbWFuZCk7Ci0JaWFhX3dhdGNoZG9nX3N0YXJ0IChlaGNpKTsKKwl0aW1lcl9hY3Rpb24gKGVoY2ksIFRJTUVSX0lBQV9XQVRDSERPRyk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCmluZGV4IDZhYWMzOWYuLjc0ZGJjNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCkBAIC01OCw2ICs1OCw3IEBACiAJLyogYXN5bmMgc2NoZWR1bGUgc3VwcG9ydCAqLwogCXN0cnVjdCBlaGNpX3FoCQkqYXN5bmM7CiAJc3RydWN0IGVoY2lfcWgJCSpyZWNsYWltOworCXVuc2lnbmVkCQlyZWNsYWltX3JlYWR5IDogMTsKIAl1bnNpZ25lZAkJc2Nhbm5pbmcgOiAxOwogCiAJLyogcGVyaW9kaWMgc2NoZWR1bGUgc3VwcG9ydCAqLwpAQCAtNzMsNiArNzQsNyBAQAogCiAJLyogcGVyIHJvb3QgaHViIHBvcnQgKi8KIAl1bnNpZ25lZCBsb25nCQlyZXNldF9kb25lIFtFSENJX01BWF9ST09UX1BPUlRTXTsKKwl1bnNpZ25lZCBsb25nCQlidXNfc3VzcGVuZGVkOwogCiAJLyogcGVyLUhDIG1lbW9yeSBwb29scyAoY291bGQgYmUgcGVyLWJ1cywgYnV0IC4uLikgKi8KIAlzdHJ1Y3QgZG1hX3Bvb2wJCSpxaF9wb29sOwkvKiBxaCBwZXIgYWN0aXZlIHVyYiAqLwpAQCAtODAsNyArODIsNiBAQAogCXN0cnVjdCBkbWFfcG9vbAkJKml0ZF9wb29sOwkvKiBpdGQgcGVyIGlzbyB1cmIgKi8KIAlzdHJ1Y3QgZG1hX3Bvb2wJCSpzaXRkX3Bvb2w7CS8qIHNpdGQgcGVyIHNwbGl0IGlzbyB1cmIgKi8KIAotCXN0cnVjdCB0aW1lcl9saXN0CWlhYV93YXRjaGRvZzsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZzsKIAl1bnNpZ25lZCBsb25nCQlhY3Rpb25zOwogCXVuc2lnbmVkCQlzdGFtcDsKQEAgLTExNCwyMSArMTE1LDkgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWlhYV93YXRjaGRvZ19zdGFydCAoc3RydWN0IGVoY2lfaGNkICplaGNpKQotewotCVdBUk5fT04odGltZXJfcGVuZGluZygmZWhjaS0+aWFhX3dhdGNoZG9nKSk7Ci0JbW9kX3RpbWVyICgmZWhjaS0+aWFhX3dhdGNoZG9nLAotCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRUhDSV9JQUFfTVNFQ1MpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGlhYV93YXRjaGRvZ19kb25lIChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kpCi17Ci0JZGVsX3RpbWVyICgmZWhjaS0+aWFhX3dhdGNoZG9nKTsKLX0KLQogZW51bSBlaGNpX3RpbWVyX2FjdGlvbiB7CiAJVElNRVJfSU9fV0FUQ0hET0csCisJVElNRVJfSUFBX1dBVENIRE9HLAogCVRJTUVSX0FTWU5DX1NIUklOSywKIAlUSU1FUl9BU1lOQ19PRkYsCiB9OwpAQCAtMTQ2LDYgKzEzNSw5IEBACiAJCXVuc2lnbmVkIGxvbmcgdDsKIAogCQlzd2l0Y2ggKGFjdGlvbikgeworCQljYXNlIFRJTUVSX0lBQV9XQVRDSERPRzoKKwkJCXQgPSBFSENJX0lBQV9KSUZGSUVTOworCQkJYnJlYWs7CiAJCWNhc2UgVElNRVJfSU9fV0FUQ0hET0c6CiAJCQl0ID0gRUhDSV9JT19KSUZGSUVTOwogCQkJYnJlYWs7CkBAIC0xNjIsNyArMTU0LDggQEAKIAkJLy8gYXN5bmMgcXVldWUgU0hSSU5LIG9mdGVuIHByZWNlZGVzIElBQS4gIHdoaWxlIGl0J3MgcmVhZHkKIAkJLy8gdG8gZ28gT0ZGIG5laXRoZXIgY2FuIG1hdHRlciwgYW5kIGFmdGVyd2FyZHMgdGhlIElPCiAJCS8vIHdhdGNoZG9nIHN0b3BzIHVubGVzcyB0aGVyZSdzIHN0aWxsIHBlcmlvZGljIHRyYWZmaWMuCi0JCWlmICh0aW1lX2JlZm9yZV9lcSh0LCBlaGNpLT53YXRjaGRvZy5leHBpcmVzKQorCQlpZiAoYWN0aW9uICE9IFRJTUVSX0lBQV9XQVRDSERPRworCQkJCSYmIHQgPiBlaGNpLT53YXRjaGRvZy5leHBpcmVzCiAJCQkJJiYgdGltZXJfcGVuZGluZyAoJmVoY2ktPndhdGNoZG9nKSkKIAkJCXJldHVybjsKIAkJbW9kX3RpbWVyICgmZWhjaS0+d2F0Y2hkb2csIHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9oY19jcmlzdjEwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYwppbmRleCA4N2VjYTZhLi4yODJkODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAjZGVmaW5lIENIRUNLX0FMSUdOKHgpIGlmICgoKF9fdTMyKSh4KSkgJiAweDAwMDAwMDAzKSBcCiB7cGFuaWMoIkFsaWdubWVudCBjaGVjayAoRFdPUkQpIGZhaWxlZCBhdCAlczolczolZFxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pO30KIAotI2RlZmluZSBTTEFCX0ZMQUcgICAgIChpbl9pbnRlcnJ1cHQoKSA/IFNMQUJfQVRPTUlDIDogU0xBQl9LRVJORUwpCisjZGVmaW5lIFNMQUJfRkxBRyAgICAgKGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpCiAjZGVmaW5lIEtNQUxMT0NfRkxBRyAgKGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpCiAKIC8qIE1vc3QgaGVscGZ1bCBkZWJ1Z2dpbmcgYWlkICovCkBAIC0yNzUsMTMgKzI3NSwxMyBAQAogc3RhdGljIGludCB6b3V0X2J1ZmZlcls0XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKIAogLyogQ2FjaGUgZm9yIGFsbG9jYXRpbmcgbmV3IEVQIGFuZCBTQiBkZXNjcmlwdG9ycy4gKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnVzYl9kZXNjX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp1c2JfZGVzY19jYWNoZTsKIAogLyogQ2FjaGUgZm9yIHRoZSByZWdpc3RlcnMgYWxsb2NhdGVkIGluIHRoZSB0b3AgaGFsZi4gKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnRvcF9oYWxmX3JlZ19jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqdG9wX2hhbGZfcmVnX2NhY2hlOwogCiAvKiBDYWNoZSBmb3IgdGhlIGRhdGEgYWxsb2NhdGVkIGluIHRoZSBpc29jIGRlc2NyIHRvcCBoYWxmLiAqLwotc3RhdGljIGttZW1fY2FjaGVfdCAqaXNvY19jb21wbF9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaXNvY19jb21wbF9jYWNoZTsKIAogc3RhdGljIHN0cnVjdCB1c2JfYnVzICpldHJheF91c2JfYnVzOwogCkBAIC0zNjUsNyArMzY1LDcgQEAKIC8qIEFkZHMgYW4gdXJiX2VudHJ5IGxhc3QgaW4gdGhlIGxpc3QgZm9yIHRoaXMgZXBpZC4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1cmJfbGlzdF9hZGQoc3RydWN0IHVyYiAqdXJiLCBpbnQgZXBpZCkKIHsKLQl1cmJfZW50cnlfdCAqdXJiX2VudHJ5ID0gKHVyYl9lbnRyeV90ICopa21hbGxvYyhzaXplb2YodXJiX2VudHJ5X3QpLCBLTUFMTE9DX0ZMQUcpOworCXVyYl9lbnRyeV90ICp1cmJfZW50cnkgPSBrbWFsbG9jKHNpemVvZih1cmJfZW50cnlfdCksIEtNQUxMT0NfRkxBRyk7CiAJYXNzZXJ0KHVyYl9lbnRyeSk7CiAKIAl1cmJfZW50cnktPnVyYiA9IHVyYjsKQEAgLTE3NDMsNyArMTc0Myw3IEBACiAKIAkJKlJfRE1BX0NIOF9TVUIzX0NMUl9JTlRSID0gSU9fU1RBVEUoUl9ETUFfQ0g4X1NVQjNfQ0xSX0lOVFIsIGNscl9kZXNjciwgZG8pOwogCi0JCWNvbXBfZGF0YSA9ICh1c2JfaXNvY19jb21wbGV0ZV9kYXRhX3QqKWttZW1fY2FjaGVfYWxsb2MoaXNvY19jb21wbF9jYWNoZSwgU0xBQl9BVE9NSUMpOworCQljb21wX2RhdGEgPSAodXNiX2lzb2NfY29tcGxldGVfZGF0YV90KilrbWVtX2NhY2hlX2FsbG9jKGlzb2NfY29tcGxfY2FjaGUsIEdGUF9BVE9NSUMpOwogCQlhc3NlcnQoY29tcF9kYXRhICE9IE5VTEwpOwogCiAgICAgICAgICAgICAgICAgSU5JVF9XT1JLKCZjb21wX2RhdGEtPnVzYl9iaCwgZXRyYXhfdXNiX2lzb2NfZGVzY3JfaW50ZXJydXB0X2JvdHRvbV9oYWxmLCBjb21wX2RhdGEpOwpAQCAtMzAxMCw3ICszMDEwLDcgQEAKIAkJCWlmICghdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGgpCiAJCQkJY29udGludWU7CiAKLQkJCW5leHRfc2JfZGVzYyA9IChVU0JfU0JfRGVzY190KilrbWVtX2NhY2hlX2FsbG9jKHVzYl9kZXNjX2NhY2hlLCBTTEFCX0FUT01JQyk7CisJCQluZXh0X3NiX2Rlc2MgPSAoVVNCX1NCX0Rlc2NfdCopa21lbV9jYWNoZV9hbGxvYyh1c2JfZGVzY19jYWNoZSwgR0ZQX0FUT01JQyk7CiAJCQlhc3NlcnQobmV4dF9zYl9kZXNjICE9IE5VTEwpOwogCiAJCQlpZiAodXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPiAwKSB7CkBAIC0zMDYzLDcgKzMwNjMsNyBAQAogCQlpZiAoVHhJc29jRVBMaXN0W2VwaWRdLnN1YiA9PSAwKSB7CiAJCQlkYmdfaXNvYygiSXNvYyB0cmFmZmljIG5vdCBhbHJlYWR5IHJ1bm5pbmcsIGFsbG9jYXRpbmcgU0IiKTsKIAotCQkJbmV4dF9zYl9kZXNjID0gKFVTQl9TQl9EZXNjX3QqKWttZW1fY2FjaGVfYWxsb2ModXNiX2Rlc2NfY2FjaGUsIFNMQUJfQVRPTUlDKTsKKwkJCW5leHRfc2JfZGVzYyA9IChVU0JfU0JfRGVzY190KilrbWVtX2NhY2hlX2FsbG9jKHVzYl9kZXNjX2NhY2hlLCBHRlBfQVRPTUlDKTsKIAkJCWFzc2VydChuZXh0X3NiX2Rlc2MgIT0gTlVMTCk7CiAKIAkJCW5leHRfc2JfZGVzYy0+Y29tbWFuZCA9IChJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIGluKSB8CkBAIC0zMzE3LDcgKzMzMTcsNyBAQAogCiAJcmVzdG9yZV9mbGFncyhmbGFncyk7CiAKLQlyZWcgPSAodXNiX2ludGVycnVwdF9yZWdpc3RlcnNfdCAqKWttZW1fY2FjaGVfYWxsb2ModG9wX2hhbGZfcmVnX2NhY2hlLCBTTEFCX0FUT01JQyk7CisJcmVnID0gKHVzYl9pbnRlcnJ1cHRfcmVnaXN0ZXJzX3QgKilrbWVtX2NhY2hlX2FsbG9jKHRvcF9oYWxmX3JlZ19jYWNoZSwgR0ZQX0FUT01JQyk7CiAKIAlhc3NlcnQocmVnICE9IE5VTEwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZGJnLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZGJnLmMKaW5kZXggODI5M2MxZC4uMGY0N2E1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWRiZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYmcuYwpAQCAtNTA1LDcgKzUwNSw3IEBACiAJY2hhcgkJCSpuZXh0OwogCXVuc2lnbmVkCQlpOwogCi0JaWYgKCEoc2VlbiA9IGttYWxsb2MgKERCR19TQ0hFRF9MSU1JVCAqIHNpemVvZiAqc2VlbiwgU0xBQl9BVE9NSUMpKSkKKwlpZiAoIShzZWVuID0ga21hbGxvYyAoREJHX1NDSEVEX0xJTUlUICogc2l6ZW9mICpzZWVuLCBHRlBfQVRPTUlDKSkpCiAJCXJldHVybiAwOwogCXNlZW5fY291bnQgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKaW5kZXggOWJlNmIzMC4uYjI4YTliNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwpAQCAtNzE1LDEzICs3MTUsNiBAQAogCQlyZXR1cm4gSVJRX05PVE1JTkU7CiAJfQogCi0JaWYgKGludHMgJiBPSENJX0lOVFJfUkhTQykgewotCQlvaGNpX3ZkYmcgKG9oY2ksICJyaHNjXG4iKTsKLQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBTVEFURUNIQU5HRV9ERUxBWTsKLQkJb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLCAmcmVncy0+aW50cnN0YXR1cyk7Ci0JCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMoaGNkKTsKLQl9Ci0KIAlpZiAoaW50cyAmIE9IQ0lfSU5UUl9VRSkgewogCQlkaXNhYmxlIChvaGNpKTsKIAkJb2hjaV9lcnIgKG9oY2ksICJPSENJIFVucmVjb3ZlcmFibGUgRXJyb3IsIGRpc2FibGVkXG4iKTsKQEAgLTczMSw5ICs3MjQsMzEgQEAKIAkJb2hjaV91c2JfcmVzZXQgKG9oY2kpOwogCX0KIAotCWlmIChpbnRzICYgT0hDSV9JTlRSX1JEKSB7Ci0JCW9oY2lfdmRiZyAob2hjaSwgInJlc3VtZSBkZXRlY3RcbiIpOwotCQlvaGNpX3dyaXRlbCAob2hjaSwgT0hDSV9JTlRSX1JELCAmcmVncy0+aW50cnN0YXR1cyk7CisJaWYgKGludHMgJiBPSENJX0lOVFJfUkhTQykgeworCQlvaGNpX3ZkYmcob2hjaSwgInJoc2NcbiIpOworCQlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllcyArIFNUQVRFQ0hBTkdFX0RFTEFZOworCQlvaGNpX3dyaXRlbChvaGNpLCBPSENJX0lOVFJfUkQgfCBPSENJX0lOVFJfUkhTQywKKwkJCQkmcmVncy0+aW50cnN0YXR1cyk7CisKKwkJLyogTk9URTogVmVuZG9ycyBkaWRuJ3QgYWx3YXlzIG1ha2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24KKwkJICogY2hvaWNlcyBmb3IgUkhTQy4gIE1hbnkgZm9sbG93ZWQgdGhlIHNwZWM7IFJIU0MgdHJpZ2dlcnMKKwkJICogb24gYW4gZWRnZSwgbGlrZSBzZXR0aW5nIGFuZCBtYXliZSBjbGVhcmluZyBhIHBvcnQgc3RhdHVzCisJCSAqIGNoYW5nZSBiaXQuICBXaXRoIG90aGVycyBpdCdzIGxldmVsLXRyaWdnZXJlZCwgYWN0aXZlCisJCSAqIHVudGlsIGtodWJkIGNsZWFycyBhbGwgdGhlIHBvcnQgc3RhdHVzIGNoYW5nZSBiaXRzLiAgV2UnbGwKKwkJICogYWx3YXlzIGRpc2FibGUgaXQgaGVyZSBhbmQgcmVseSBvbiBwb2xsaW5nIHVudGlsIGtodWJkCisJCSAqIHJlLWVuYWJsZXMgaXQuCisJCSAqLworCQlvaGNpX3dyaXRlbChvaGNpLCBPSENJX0lOVFJfUkhTQywgJnJlZ3MtPmludHJkaXNhYmxlKTsKKwkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhoY2QpOworCX0KKworCS8qIEZvciBjb25uZWN0IGFuZCBkaXNjb25uZWN0IGV2ZW50cywgd2UgZXhwZWN0IHRoZSBjb250cm9sbGVyCisJICogdG8gdHVybiBvbiBSSFNDIGFsb25nIHdpdGggUkQuICBCdXQgZm9yIHJlbW90ZSB3YWtldXAgZXZlbnRzCisJICogdGhpcyBtaWdodCBub3QgaGFwcGVuLgorCSAqLworCWVsc2UgaWYgKGludHMgJiBPSENJX0lOVFJfUkQpIHsKKwkJb2hjaV92ZGJnKG9oY2ksICJyZXN1bWUgZGV0ZWN0XG4iKTsKKwkJb2hjaV93cml0ZWwob2hjaSwgT0hDSV9JTlRSX1JELCAmcmVncy0+aW50cnN0YXR1cyk7CiAJCWhjZC0+cG9sbF9yaCA9IDE7CiAJCWlmIChvaGNpLT5hdXRvc3RvcCkgewogCQkJc3Bpbl9sb2NrICgmb2hjaS0+bG9jayk7CkBAIC05MzAsNyArOTQ1LDcgQEAKICNpbmNsdWRlICJvaGNpLXBwYy1zb2MuYyIKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxUk05MjAwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05MjYxKQorI2lmZGVmIENPTkZJR19BUkNIX0FUOTEKICNpbmNsdWRlICJvaGNpLWF0OTEuYyIKICNlbmRpZgogCkBAIC05NDcsOCArOTYyLDcgQEAKICAgICAgIHx8IGRlZmluZWQgKENPTkZJR19BUkNIX0VQOTNYWCkgXAogICAgICAgfHwgZGVmaW5lZCAoQ09ORklHX1NPQ19BVTFYMDApIFwKICAgICAgIHx8IGRlZmluZWQgKENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX1NPQykgXAotICAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCkgXAotICAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjEpIFwKKyAgICAgIHx8IGRlZmluZWQgKENPTkZJR19BUkNIX0FUOTEpIFwKICAgICAgIHx8IGRlZmluZWQgKENPTkZJR19BUkNIX1BOWDQwMDgpIFwKIAkpCiAjZXJyb3IgIm1pc3NpbmcgYnVzIGdsdWUgZm9yIG9oY2ktaGNkIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCmluZGV4IDZmMTEzNTkuLjI0NDE2NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKQEAgLTQxLDcgKzQxLDExIEBACiB7CiAJc3RydWN0IG9oY2lfaGNkCQkqb2hjaSA9IGhjZF90b19vaGNpIChoY2QpOwogCi0Jb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSk7CisJc3Bpbl9sb2NrX2lycSgmb2hjaS0+bG9jayk7CisJaWYgKCFvaGNpLT5hdXRvc3RvcCkKKwkJZGVsX3RpbWVyKCZoY2QtPnJoX3RpbWVyKTsJLyogUHJldmVudCBuZXh0IHBvbGwgKi8KKwlvaGNpX3dyaXRlbChvaGNpLCBPSENJX0lOVFJfUkhTQywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCXNwaW5fdW5sb2NrX2lycSgmb2hjaS0+bG9jayk7CiB9CiAKICNkZWZpbmUgT0hDSV9TQ0hFRF9FTkFCTEVTIFwKQEAgLTUwLDYgKzU0LDkgQEAKIHN0YXRpYyB2b2lkIGRsX2RvbmVfbGlzdCAoc3RydWN0IG9oY2lfaGNkICopOwogc3RhdGljIHZvaWQgZmluaXNoX3VubGlua3MgKHN0cnVjdCBvaGNpX2hjZCAqLCB1MTYpOwogCisjaWZkZWYJQ09ORklHX1BNCitzdGF0aWMgaW50IG9oY2lfcmVzdGFydChzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2kpOworCiBzdGF0aWMgaW50IG9oY2lfcmhfc3VzcGVuZCAoc3RydWN0IG9oY2lfaGNkICpvaGNpLCBpbnQgYXV0b3N0b3ApCiBfX3JlbGVhc2VzKG9oY2ktPmxvY2spCiBfX2FjcXVpcmVzKG9oY2ktPmxvY2spCkBAIC0xMzIsOCArMTM5LDYgQEAKIAlyZXR1cm4gZWQ7CiB9CiAKLXN0YXRpYyBpbnQgb2hjaV9yZXN0YXJ0IChzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2kpOwotCiAvKiBjYWxsZXIgaGFzIGxvY2tlZCB0aGUgcm9vdCBodWIgKi8KIHN0YXRpYyBpbnQgb2hjaV9yaF9yZXN1bWUgKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSkKIF9fcmVsZWFzZXMob2hjaS0+bG9jaykKQEAgLTE2OSw3ICsxNzQsOCBAQAogCQlicmVhazsKIAljYXNlIE9IQ0lfVVNCX1JFU1VNRToKIAkJLyogSENGUyBjaGFuZ2VzIHNvbWV0aW1lIGFmdGVyIElOVFJfUkQgKi8KLQkJb2hjaV9pbmZvIChvaGNpLCAid2FrZXVwXG4iKTsKKwkJb2hjaV9kYmcob2hjaSwgIiVzd2FrZXVwIHJvb3QgaHViXG4iLAorCQkJCWF1dG9zdG9wcGVkID8gImF1dG8tIiA6ICIiKTsKIAkJYnJlYWs7CiAJY2FzZSBPSENJX1VTQl9PUEVSOgogCQkvKiB0aGlzIGNhbiBoYXBwZW4gYWZ0ZXIgcmVzdW1pbmcgYSBzd3N1c3Agc25hcHNob3QgKi8KQEAgLTE4MCw3ICsxODYsNiBAQAogCQlvaGNpX2RiZyAob2hjaSwgImxvc3QgcG93ZXJcbiIpOwogCQlzdGF0dXMgPSAtRUJVU1k7CiAJfQotI2lmZGVmCUNPTkZJR19QTQogCWlmIChzdGF0dXMgPT0gLUVCVVNZKSB7CiAJCWlmICghYXV0b3N0b3BwZWQpIHsKIAkJCXNwaW5fdW5sb2NrX2lycSAoJm9oY2ktPmxvY2spOwpAQCAtMTkwLDI1ICsxOTUsMTIgQEAKIAkJfQogCQlyZXR1cm4gc3RhdHVzOwogCX0KLSNlbmRpZgogCWlmIChzdGF0dXMgIT0gLUVJTlBST0dSRVNTKQogCQlyZXR1cm4gc3RhdHVzOwogCWlmIChhdXRvc3RvcHBlZCkKIAkJZ290byBza2lwX3Jlc3VtZTsKIAlzcGluX3VubG9ja19pcnEgKCZvaGNpLT5sb2NrKTsKIAotCXRlbXAgPSBvaGNpLT5udW1fcG9ydHM7Ci0Jd2hpbGUgKHRlbXAtLSkgewotCQl1MzIgc3RhdCA9IG9oY2lfcmVhZGwgKG9oY2ksCi0JCQkJICAgICAgICZvaGNpLT5yZWdzLT5yb290aHViLnBvcnRzdGF0dXMgW3RlbXBdKTsKLQotCQkvKiBmb3JjZSBnbG9iYWwsIG5vdCBzZWxlY3RpdmUsIHJlc3VtZSAqLwotCQlpZiAoIShzdGF0ICYgUkhfUFNfUFNTKSkKLQkJCWNvbnRpbnVlOwotCQlvaGNpX3dyaXRlbCAob2hjaSwgUkhfUFNfUE9DSSwKLQkJCQkmb2hjaS0+cmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzIFt0ZW1wXSk7Ci0JfQotCiAJLyogU29tZSBjb250cm9sbGVycyAobHVjZW50IGVycmF0dW0pIG5lZWQgZXh0cmEtbG9uZyBkZWxheXMgKi8KIAltc2xlZXAgKDIwIC8qIHVzYiAxMS41LjEuMTAgKi8gKyAxMiAvKiAzMiBtc2VjIGNvdW50ZXIgKi8gKyAxKTsKIApAQCAtMjE2LDYgKzIwOCw3IEBACiAJdGVtcCAmPSBPSENJX0NUUkxfSENGUzsKIAlpZiAodGVtcCAhPSBPSENJX1VTQl9SRVNVTUUpIHsKIAkJb2hjaV9lcnIgKG9oY2ksICJjb250cm9sbGVyIHdvbid0IHJlc3VtZVxuIik7CisJCXNwaW5fbG9ja19pcnEoJm9oY2ktPmxvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjk1LDggKzI4OCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZglDT05GSUdfUE0KLQogc3RhdGljIGludCBvaGNpX2J1c19zdXNwZW5kIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBvaGNpX2hjZAkJKm9oY2kgPSBoY2RfdG9fb2hjaSAoaGNkKTsKQEAgLTMzNCw2ICszMjUsODMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qIENhcnJ5IG91dCBwb2xsaW5nLSwgYXV0b3N0b3AtLCBhbmQgYXV0b3Jlc3VtZS1yZWxhdGVkIHN0YXRlIGNoYW5nZXMgKi8KK3N0YXRpYyBpbnQgb2hjaV9yb290X2h1Yl9zdGF0ZV9jaGFuZ2VzKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSwgaW50IGNoYW5nZWQsCisJCWludCBhbnlfY29ubmVjdGVkKQoreworCWludAlwb2xsX3JoID0gMTsKKworCXN3aXRjaCAob2hjaS0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKSB7CisKKwljYXNlIE9IQ0lfVVNCX09QRVI6CisJCS8qIGtlZXAgb24gcG9sbGluZyB1bnRpbCB3ZSBrbm93IGEgZGV2aWNlIGlzIGNvbm5lY3RlZAorCQkgKiBhbmQgUkhTQyBpcyBlbmFibGVkICovCisJCWlmICghb2hjaS0+YXV0b3N0b3ApIHsKKwkJCWlmIChhbnlfY29ubmVjdGVkIHx8CisJCQkJCSFkZXZpY2VfbWF5X3dha2V1cCgmb2hjaV90b19oY2Qob2hjaSkKKwkJCQkJCS0+c2VsZi5yb290X2h1Yi0+ZGV2KSkgeworCQkJCWlmIChvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKSAmCisJCQkJCQlPSENJX0lOVFJfUkhTQykKKwkJCQkJcG9sbF9yaCA9IDA7CisJCQl9IGVsc2UgeworCQkJCW9oY2ktPmF1dG9zdG9wID0gMTsKKwkJCQlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllcyArIEhaOworCQkJfQorCisJCS8qIGlmIG5vIGRldmljZXMgaGF2ZSBiZWVuIGF0dGFjaGVkIGZvciBvbmUgc2Vjb25kLCBhdXRvc3RvcCAqLworCQl9IGVsc2UgeworCQkJaWYgKGNoYW5nZWQgfHwgYW55X2Nvbm5lY3RlZCkgeworCQkJCW9oY2ktPmF1dG9zdG9wID0gMDsKKwkJCQlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllcyArCisJCQkJCQlTVEFURUNIQU5HRV9ERUxBWTsKKwkJCX0gZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLAorCQkJCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSkKKwkJCQkJJiYgIW9oY2ktPmVkX3JtX2xpc3QKKwkJCQkJJiYgIShvaGNpLT5oY19jb250cm9sICYKKwkJCQkJCU9IQ0lfU0NIRURfRU5BQkxFUykpIHsKKwkJCQlvaGNpX3JoX3N1c3BlbmQob2hjaSwgMSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkvKiBpZiB0aGVyZSBpcyBhIHBvcnQgY2hhbmdlLCBhdXRvc3RhcnQgb3IgYXNrIHRvIGJlIHJlc3VtZWQgKi8KKwljYXNlIE9IQ0lfVVNCX1NVU1BFTkQ6CisJY2FzZSBPSENJX1VTQl9SRVNVTUU6CisJCWlmIChjaGFuZ2VkKSB7CisJCQlpZiAob2hjaS0+YXV0b3N0b3ApCisJCQkJb2hjaV9yaF9yZXN1bWUob2hjaSk7CisJCQllbHNlCisJCQkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIob2hjaV90b19oY2Qob2hjaSkpOworCQl9IGVsc2UgeworCQkJLyogZXZlcnl0aGluZyBpcyBpZGxlLCBubyBuZWVkIGZvciBwb2xsaW5nICovCisJCQlwb2xsX3JoID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIHBvbGxfcmg7Cit9CisKKyNlbHNlCS8qIENPTkZJR19QTSAqLworCitzdGF0aWMgaW5saW5lIGludCBvaGNpX3JoX3Jlc3VtZShzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2kpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhcnJ5IG91dCBwb2xsaW5nLXJlbGF0ZWQgc3RhdGUgY2hhbmdlcy4KKyAqIGF1dG9zdG9wIGlzbid0IHVzZWQgd2hlbiBDT05GSUdfUE0gaXMgdHVybmVkIG9mZi4KKyAqLworc3RhdGljIGludCBvaGNpX3Jvb3RfaHViX3N0YXRlX2NoYW5nZXMoc3RydWN0IG9oY2lfaGNkICpvaGNpLCBpbnQgY2hhbmdlZCwKKwkJaW50IGFueV9jb25uZWN0ZWQpCit7CisJaW50CXBvbGxfcmggPSAxOworCisJLyoga2VlcCBvbiBwb2xsaW5nIHVudGlsIFJIU0MgaXMgZW5hYmxlZCAqLworCWlmIChvaGNpX3JlYWRsKG9oY2ksICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKSAmIE9IQ0lfSU5UUl9SSFNDKQorCQlwb2xsX3JoID0gMDsKKwlyZXR1cm4gcG9sbF9yaDsKK30KKwogI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzQ1LDcgKzQxMyw3IEBACiB7CiAJc3RydWN0IG9oY2lfaGNkCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CiAJaW50CQlpLCBjaGFuZ2VkID0gMCwgbGVuZ3RoID0gMTsKLQlpbnQJCWFueV9jb25uZWN0ZWQgPSAwLCByaHNjX2VuYWJsZWQgPSAxOworCWludAkJYW55X2Nvbm5lY3RlZCA9IDA7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmb2hjaS0+bG9jaywgZmxhZ3MpOwpAQCAtMzg2LDY2ICs0NTQsOCBAQAogCQl9CiAJfQogCi0JLyogTk9URTogIHZlbmRvcnMgZGlkbid0IGFsd2F5cyBtYWtlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uCi0JICogY2hvaWNlcyBmb3IgUkhTQy4gIFNvbWV0aW1lcyBpdCB0cmlnZ2VycyBvbiBhbiBlZGdlIChsaWtlCi0JICogc2V0dGluZyBhbmQgbWF5YmUgY2xlYXJpbmcgYSBwb3J0IHN0YXR1cyBjaGFuZ2UgYml0KTsgYW5kCi0JICogaXQncyBsZXZlbC10cmlnZ2VyZWQgb24gb3RoZXIgc2lsaWNvbiwgYWN0aXZlIHVudGlsIGtodWJkCi0JICogY2xlYXJzIGFsbCBhY3RpdmUgcG9ydCBzdGF0dXMgY2hhbmdlIGJpdHMuICBJZiBpdCdzIHN0aWxsCi0JICogc2V0IChsZXZlbC10cmlnZ2VyZWQpIHdlIG11c3QgZGlzYWJsZSBpdCBhbmQgcmVseSBvbgotCSAqIHBvbGxpbmcgdW50aWwga2h1YmQgcmUtZW5hYmxlcyBpdC4KLQkgKi8KLQlpZiAob2hjaV9yZWFkbCAob2hjaSwgJm9oY2ktPnJlZ3MtPmludHJzdGF0dXMpICYgT0hDSV9JTlRSX1JIU0MpIHsKLQkJb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOwotCQkodm9pZCkgb2hjaV9yZWFkbCAob2hjaSwgJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKLQkJcmhzY19lbmFibGVkID0gMDsKLQl9Ci0JaGNkLT5wb2xsX3JoID0gMTsKLQotCS8qIGNhcnJ5IG91dCBhcHByb3ByaWF0ZSBzdGF0ZSBjaGFuZ2VzICovCi0Jc3dpdGNoIChvaGNpLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpIHsKLQotCWNhc2UgT0hDSV9VU0JfT1BFUjoKLQkJLyoga2VlcCBvbiBwb2xsaW5nIHVudGlsIHdlIGtub3cgYSBkZXZpY2UgaXMgY29ubmVjdGVkCi0JCSAqIGFuZCBSSFNDIGlzIGVuYWJsZWQgKi8KLQkJaWYgKCFvaGNpLT5hdXRvc3RvcCkgewotCQkJaWYgKGFueV9jb25uZWN0ZWQpIHsKLQkJCQlpZiAocmhzY19lbmFibGVkKQotCQkJCQloY2QtPnBvbGxfcmggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlvaGNpLT5hdXRvc3RvcCA9IDE7Ci0JCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBIWjsKLQkJCX0KLQotCQkvKiBpZiBubyBkZXZpY2VzIGhhdmUgYmVlbiBhdHRhY2hlZCBmb3Igb25lIHNlY29uZCwgYXV0b3N0b3AgKi8KLQkJfSBlbHNlIHsKLQkJCWlmIChjaGFuZ2VkIHx8IGFueV9jb25uZWN0ZWQpIHsKLQkJCQlvaGNpLT5hdXRvc3RvcCA9IDA7Ci0JCQkJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKwotCQkJCQkJU1RBVEVDSEFOR0VfREVMQVk7Ci0JCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEgKGppZmZpZXMsCi0JCQkJCQlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKQotCQkJCQkmJiAhb2hjaS0+ZWRfcm1fbGlzdAotCQkJCQkmJiAhKG9oY2ktPmhjX2NvbnRyb2wgJgotCQkJCQkJT0hDSV9TQ0hFRF9FTkFCTEVTKSkgewotCQkJCW9oY2lfcmhfc3VzcGVuZCAob2hjaSwgMSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkvKiBpZiB0aGVyZSBpcyBhIHBvcnQgY2hhbmdlLCBhdXRvc3RhcnQgb3IgYXNrIHRvIGJlIHJlc3VtZWQgKi8KLQljYXNlIE9IQ0lfVVNCX1NVU1BFTkQ6Ci0JY2FzZSBPSENJX1VTQl9SRVNVTUU6Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQlpZiAob2hjaS0+YXV0b3N0b3ApCi0JCQkJb2hjaV9yaF9yZXN1bWUgKG9oY2kpOwotCQkJZWxzZQotCQkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViIChoY2QpOwotCQl9IGVsc2UgewotCQkJLyogZXZlcnl0aGluZyBpcyBpZGxlLCBubyBuZWVkIGZvciBwb2xsaW5nICovCi0JCQloY2QtPnBvbGxfcmggPSAwOwotCQl9Ci0JCWJyZWFrOwotCX0KKwloY2QtPnBvbGxfcmggPSBvaGNpX3Jvb3RfaHViX3N0YXRlX2NoYW5nZXMob2hjaSwgY2hhbmdlZCwKKwkJCWFueV9jb25uZWN0ZWQpOwogCiBkb25lOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZvaGNpLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYwppbmRleCA4MmNiMjJmLi43ZjI2ZjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjOwogCi0JYyA9IChzdHJ1Y3QgaTJjX2NsaWVudCAqKWt6YWxsb2Moc2l6ZW9mKCpjKSwgU0xBQl9LRVJORUwpOworCWMgPSAoc3RydWN0IGkyY19jbGllbnQgKilremFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFjKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI2Miw2ICsyNjIsNyBAQAogCSAqLwogCS5zdGFydCA9IG9oY2lfcG54NDAwOF9zdGFydCwKIAkuc3RvcCA9IG9oY2lfc3RvcCwKKwkuc2h1dGRvd24gPSBvaGNpX3NodXRkb3duLAogCiAJLyoKIAkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcwpAQCAtMjgwLDcgKzI4MSwxMSBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPSBvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPSBvaGNpX2h1Yl9jb250cm9sLAotCisJLmh1Yl9pcnFfZW5hYmxlID0gb2hjaV9yaHNjX2VuYWJsZSwKKyNpZmRlZglDT05GSUdfUE0KKwkuYnVzX3N1c3BlbmQgPSBvaGNpX2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lID0gb2hjaV9idXNfcmVzdW1lLAorI2VuZGlmCiAJLnN0YXJ0X3BvcnRfcmVzZXQgPSBvaGNpX3N0YXJ0X3BvcnRfcmVzZXQsCiB9OwogCkBAIC00MTAsOCArNDE1LDYgQEAKIAkJZ290byBvdXQ0OwogCX0KIAotCWhjZC0+c2VsZi5oY3ByaXYgPSAodm9pZCAqKWhjZDsKLQogCXBueDQwMDhfc3RhcnRfaGMoKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBoY2QpOwogCW9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jCmluZGV4IDU0ZjU1NGUuLmFjOWYxMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExX2NzLmMKQEAgLTE2OSwyMSArMTY5LDE0IEBACiAKIAlEQkcoMCwgInNsODExX2NzX2NvbmZpZygweCVwKVxuIiwgbGluayk7CiAKLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpKTsKLQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpKTsKLQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLQlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07Ci0KIAkvKiBMb29rIHVwIHRoZSBjdXJyZW50IFZjYyAqLwogCUNTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLAogCQkJcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJmNvbmYpKTsKIAorCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOworCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKwl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CiAJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CiAJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpKTsKIAl3aGlsZSAoMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91MTMyLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC91MTMyLWhjZC5jCmluZGV4IDMyYzYzNWUuLmE5ZDcxMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdTEzMi1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMKQEAgLTcxLDcgKzcxLDcgQEAKIG1vZHVsZV9wYXJhbShkaXN0cnVzdF9maXJtd2FyZSwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRpc3RydXN0X2Zpcm13YXJlLCAidHJ1ZSB0byBkaXN0cnVzdCBmaXJtd2FyZSBwb3dlci9vdmVyY3VycmVuIgogICAgICAgICAidCBzZXR1cCIpOwotREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodTEzMl9oY2Rfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodTEzMl9oY2Rfd2FpdCk7CiAvKgogKiB1MTMyX21vZHVsZV9sb2NrIGV4aXN0cyB0byBwcm90ZWN0IGFjY2VzcyB0byBnbG9iYWwgdmFyaWFibGVzCiAqCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgdTE2IHF1ZXVlX25leHQ7CiAgICAgICAgIHN0cnVjdCB1cmIgKnVyYl9saXN0W0VORFBfUVVFVUVfU0laRV07CiAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgdXJiX21vcmU7Ci0gICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBzY2hlZHVsZXI7CisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgc2NoZWR1bGVyOwogfTsKIHN0cnVjdCB1MTMyX3JpbmcgewogICAgICAgICB1bnNpZ25lZCBpbl91c2U6MTsKQEAgLTE3MSw3ICsxNzEsNyBAQAogICAgICAgICB1OCBudW1iZXI7CiAgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyOwogICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICpjdXJyX2VuZHA7Ci0gICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBzY2hlZHVsZXI7CisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgc2NoZWR1bGVyOwogfTsKICNkZWZpbmUgT0hDSV9RVUlSS19BTUQ3NTYgMHgwMQogI2RlZmluZSBPSENJX1FVSVJLX1NVUEVSSU8gMHgwMgpAQCAtMTk4LDIwICsxOTgsMTYgQEAKICAgICAgICAgdTMyIGhjX3Jvb3RodWJfcG9ydHN0YXR1c1tNQVhfUk9PVF9QT1JUU107CiAgICAgICAgIGludCBmbGFnczsKICAgICAgICAgdW5zaWduZWQgbG9uZyBuZXh0X3N0YXRlY2hhbmdlOwotICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgbW9uaXRvcjsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBtb25pdG9yOwogICAgICAgICBpbnQgbnVtX2VuZHBvaW50czsKICAgICAgICAgc3RydWN0IHUxMzJfYWRkciBhZGRyW01BWF9VMTMyX0FERFJTXTsKICAgICAgICAgc3RydWN0IHUxMzJfdWRldiB1ZGV2W01BWF9VMTMyX1VERVZTXTsKICAgICAgICAgc3RydWN0IHUxMzJfcG9ydCBwb3J0W01BWF9VMTMyX1BPUlRTXTsKICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcFtNQVhfVTEzMl9FTkRQU107CiB9OwotaW50IHVzYl9mdGRpX2VsYW5fcmVhZF9yZWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdTMyICpkYXRhKTsKLWludCB1c2JfZnRkaV9lbGFuX3JlYWRfcGNpbWVtKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHU4IGFkZHJlc3NvZnMsCi0gICAgICAgIHU4IHdpZHRoLCB1MzIgKmRhdGEpOwotaW50IHVzYl9mdGRpX2VsYW5fd3JpdGVfcGNpbWVtKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHU4IGFkZHJlc3NvZnMsCi0gICAgICAgIHU4IHdpZHRoLCB1MzIgZGF0YSk7CisKIC8qCi0qIHRoZXNlIGNhbiBub3QgYmUgaW5saW5lcyBiZWNhdXNlIHdlIG5lZWQgdGhlIHN0cnVjdHVyZSBvZmZzZXQhIQorKiB0aGVzZSBjYW5ub3QgYmUgaW5saW5lcyBiZWNhdXNlIHdlIG5lZWQgdGhlIHN0cnVjdHVyZSBvZmZzZXQhIQogKiBEb2VzIGFueW9uZSBoYXZlIGEgYmV0dGVyIHdheT8/Pz8/CiAqLwogI2RlZmluZSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIG1lbWJlciwgZGF0YSkgXApAQCAtMzE0LDcgKzMxMCw3IEBACiAgICAgICAgIGlmIChkZWx0YSA+IDApIHsKICAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnJpbmctPnNjaGVkdWxlciwgZGVsdGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlX3dvcmsod29ya3F1ZXVlLCAmcmluZy0+c2NoZWR1bGVyKSkKKyAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsod29ya3F1ZXVlLCAmcmluZy0+c2NoZWR1bGVyLCAwKSkKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwogICAgICAgICByZXR1cm47CkBAIC0zOTMsMTIgKzM4OSw4IEBACiBzdGF0aWMgdm9pZCB1MTMyX2VuZHBfcXVldWVfd29yayhzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwKICAgICAgICAgdW5zaWduZWQgaW50IGRlbHRhKQogewotICAgICAgICBpZiAoZGVsdGEgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayh3b3JrcXVldWUsICZlbmRwLT5zY2hlZHVsZXIsIGRlbHRhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZlbmRwLT5rcmVmKTsKLSAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKHdvcmtxdWV1ZSwgJmVuZHAtPnNjaGVkdWxlcikpCi0gICAgICAgICAgICAgICAga3JlZl9nZXQoJmVuZHAtPmtyZWYpOwotICAgICAgICByZXR1cm47CisJaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayh3b3JrcXVldWUsICZlbmRwLT5zY2hlZHVsZXIsIGRlbHRhKSkKKwkJa3JlZl9nZXQoJmVuZHAtPmtyZWYpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX2VuZHBfY2FuY2VsX3dvcmsoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHApCkBAIC00MTQsMjQgKzQwNiwxNCBAQAogCiBzdGF0aWMgdm9pZCB1MTMyX21vbml0b3JfcXVldWVfd29yayhzdHJ1Y3QgdTEzMiAqdTEzMiwgdW5zaWduZWQgaW50IGRlbHRhKQogewotICAgICAgICBpZiAoZGVsdGEgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayh3b3JrcXVldWUsICZ1MTMyLT5tb25pdG9yLCBkZWx0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZ1MTMyLT5rcmVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocXVldWVfd29yayh3b3JrcXVldWUsICZ1MTMyLT5tb25pdG9yKSkKLSAgICAgICAgICAgICAgICBrcmVmX2dldCgmdTEzMi0+a3JlZik7Ci0gICAgICAgIHJldHVybjsKKwlpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnUxMzItPm1vbml0b3IsIGRlbHRhKSkKKwkJa3JlZl9nZXQoJnUxMzItPmtyZWYpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX21vbml0b3JfcmVxdWV1ZV93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0gICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnUxMzItPm1vbml0b3IsIGRlbHRhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKHdvcmtxdWV1ZSwgJnUxMzItPm1vbml0b3IpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAga3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7Ci0gICAgICAgIHJldHVybjsKKwlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayh3b3JrcXVldWUsICZ1MTMyLT5tb25pdG9yLCBkZWx0YSkpCisJCWtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCB1MTMyX21vbml0b3JfY2FuY2VsX3dvcmsoc3RydWN0IHUxMzIgKnUxMzIpCkBAIC00OTMsOSArNDc1LDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHUxMzJfaGNkX21vbml0b3Jfd29yayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgdTEzMl9oY2RfbW9uaXRvcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLSAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBkYXRhOworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdTEzMiwgbW9uaXRvci53b3JrKTsKICAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgewogICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOwpAQCAtMTMxOSwxNSArMTMwMSwxNCBAQAogICAgICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHUxMzJfaGNkX3Jpbmdfd29ya19zY2hlZHVsZXIodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCB1MTMyX2hjZF9lbmRwX3dvcmtfc2NoZWR1bGVyKHZvaWQgKmRhdGEpOwogLyoKICogdGhpcyB3b3JrIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgZnJvbSB0aGUgd29yayBxdWV1ZQogKgogKi8KLXN0YXRpYyB2b2lkIHUxMzJfaGNkX3Jpbmdfd29ya19zY2hlZHVsZXIodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHUxMzJfaGNkX3Jpbmdfd29ya19zY2hlZHVsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZGF0YTsKKyAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdTEzMl9yaW5nLCBzY2hlZHVsZXIud29yayk7CiAgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gcmluZy0+dTEzMjsKICAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOwogICAgICAgICBpZiAocmluZy0+aW5fdXNlKSB7CkBAIC0xMzg2LDEwICsxMzY3LDExIEBACiAgICAgICAgIH0KIH0KIAotc3RhdGljIHZvaWQgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7Ci0gICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1MTMyX2VuZHAsIHNjaGVkdWxlci53b3JrKTsKICAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOwogICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CiAgICAgICAgIHJpbmcgPSBlbmRwLT5yaW5nOwpAQCAtMTk0Nyw3ICsxOTI5LDcgQEAKICAgICAgICAgaWYgKCFlbmRwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgIH0KLSAgICAgICAgSU5JVF9XT1JLKCZlbmRwLT5zY2hlZHVsZXIsIHUxMzJfaGNkX2VuZHBfd29ya19zY2hlZHVsZXIsICh2b2lkICopZW5kcCk7CisgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZlbmRwLT5zY2hlZHVsZXIsIHUxMzJfaGNkX2VuZHBfd29ya19zY2hlZHVsZXIpOwogICAgICAgICBzcGluX2xvY2tfaW5pdCgmZW5kcC0+cXVldWVfbG9jay5zbG9jayk7CiAgICAgICAgIElOSVRfTElTVF9IRUFEKCZlbmRwLT51cmJfbW9yZSk7CiAgICAgICAgIHJpbmcgPSBlbmRwLT5yaW5nID0gJnUxMzItPnJpbmdbMF07CkBAIC0yMDM2LDcgKzIwMTgsNyBAQAogICAgICAgICBpZiAoIWVuZHApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgfQotICAgICAgICBJTklUX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlciwgKHZvaWQgKillbmRwKTsKKyAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcik7CiAgICAgICAgIHNwaW5fbG9ja19pbml0KCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrKTsKICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPnVyYl9tb3JlKTsKICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CkBAIC0yMTIxLDcgKzIxMDMsNyBAQAogICAgICAgICBpZiAoIWVuZHApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgfQotICAgICAgICBJTklUX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlciwgKHZvaWQgKillbmRwKTsKKyAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcik7CiAgICAgICAgIHNwaW5fbG9ja19pbml0KCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrKTsKICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPnVyYl9tb3JlKTsKICAgICAgICAgcmluZyA9IGVuZHAtPnJpbmcgPSAmdTEzMi0+cmluZ1swXTsKQEAgLTMwNDUsNyArMzAyNyw3IEBACiAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBieSB0aGUgVVNCIGNvcmUgd2hpbHN0IHRoZSAidXNiX2FsbF9kZXZpY2VzX3J3c2VtIgogKiBpcyBoZWxkIGZvciB3cml0aW5nLCB0aHVzIHRoaXMgbW9kdWxlIG11c3Qgbm90IGNhbGwgdXNiX3JlbW92ZV9oY2QoKQogKiBzeW5jaHJvbm91c2x5IC0gYnV0IGluc3RlYWQgc2hvdWxkIGltbWVkaWF0ZWx5IHN0b3AgYWN0aXZpdHkgdG8gdGhlCi0qIGRldmljZSBhbmQgYW5zeW5jaHJvbm91c2x5IGNhbGwgdXNiX3JlbW92ZV9oY2QoKQorKiBkZXZpY2UgYW5kIGFzeW5jaHJvbm91c2x5IGNhbGwgdXNiX3JlbW92ZV9oY2QoKQogKi8KIHN0YXRpYyBpbnQgX19kZXZleGl0IHUxMzJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0zMTAwLDEwICszMDgyLDEwIEBACiAgICAgICAgICAgICAgICAgcmluZy0+bnVtYmVyID0gcmluZ3MgKyAxOwogICAgICAgICAgICAgICAgIHJpbmctPmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gTlVMTDsKLSAgICAgICAgICAgICAgICBJTklUX1dPUksoJnJpbmctPnNjaGVkdWxlciwgdTEzMl9oY2RfcmluZ193b3JrX3NjaGVkdWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcmluZyk7CisgICAgICAgICAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJnJpbmctPnNjaGVkdWxlciwKKwkJCQkgIHUxMzJfaGNkX3Jpbmdfd29ya19zY2hlZHVsZXIpOwogICAgICAgICB9IGRvd24oJnUxMzItPnN3X2xvY2spOwotICAgICAgICBJTklUX1dPUksoJnUxMzItPm1vbml0b3IsIHUxMzJfaGNkX21vbml0b3Jfd29yaywgKHZvaWQgKil1MTMyKTsKKyAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJnUxMzItPm1vbml0b3IsIHUxMzJfaGNkX21vbml0b3Jfd29yayk7CiAgICAgICAgIHdoaWxlIChwb3J0cy0tID4gMCkgewogICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3BvcnQgKnBvcnQgPSAmdTEzMi0+cG9ydFtwb3J0c107CiAgICAgICAgICAgICAgICAgcG9ydC0+dTEzMiA9IHUxMzI7CkBAIC0zMjQxLDcgKzMyMjMsNyBAQAogI2RlZmluZSB1MTMyX3Jlc3VtZSBOVUxMCiAjZW5kaWYKIC8qCi0qIHRoaXMgZHJpdmVyIGlzIGxvYWRlZCBleHBsaWNpdGVseSBieSBmdGRpX3UxMzIKKyogdGhpcyBkcml2ZXIgaXMgbG9hZGVkIGV4cGxpY2l0bHkgYnkgZnRkaV91MTMyCiAqCiAqIHRoZSBwbGF0Zm9ybV9kcml2ZXIgc3RydWN0IGlzIHN0YXRpYyBiZWNhdXNlIGl0IGlzIHBlciB0eXBlIG9mIG1vZHVsZQogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwppbmRleCA0NWVlNjkyLi5lODc2OTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC04MCw3ICs4MSw3IEBACiBzdGF0aWMgY2hhciAqZXJyYnVmOwogI2RlZmluZSBFUlJCVUZfTEVOICAgICgzMiAqIDEwMjQpCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnVoY2lfdXBfY2FjaGVwOwkvKiB1cmJfcHJpdiAqLworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp1aGNpX3VwX2NhY2hlcDsJLyogdXJiX3ByaXYgKi8KIAogc3RhdGljIHZvaWQgc3VzcGVuZF9yaChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2ksIGVudW0gdWhjaV9yaF9zdGF0ZSBuZXdfc3RhdGUpOwogc3RhdGljIHZvaWQgd2FrZXVwX3JoKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSk7CkBAIC0xOTYsMTIgKzE5Nyw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJlbW90ZV93YWtldXBfaXNfYnJva2VuKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKK3sKKwlzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgYnJva2VuX3dha2V1cF90YWJsZVtdID0geworCQl7CisJCQkuaWRlbnQgPSAiQXN1cyBBN1Y4WCIsCisJCQkubWF0Y2hlcyA9IHsKKwkJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsiKSwKKwkJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJBN1Y4WCIpLAorCQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVSU0lPTiwgIlJFViAxLnh4IiksCisJCQl9CisJCX0sCisJCXsgfQorCX07CisJaW50IHBvcnQ7CisKKwkvKiBPbmUgb2YgQXN1cydzIG1vdGhlcmJvYXJkcyBoYXMgYSBidWcgd2hpY2ggY2F1c2VzIGl0IHRvCisJICogd2FrZSB1cCBpbW1lZGlhdGVseSBmcm9tIHN1c3BlbmQtdG8tUkFNIGlmIGFueSBvZiB0aGUgcG9ydHMKKwkgKiBhcmUgY29ubmVjdGVkLiAgSW4gc3VjaCBjYXNlcyB3ZSB3aWxsIG5vdCBzZXQgRUdTTS4KKwkgKi8KKwlpZiAoZG1pX2NoZWNrX3N5c3RlbShicm9rZW5fd2FrZXVwX3RhYmxlKSkgeworCQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgdWhjaS0+cmhfbnVtcG9ydHM7ICsrcG9ydCkgeworCQkJaWYgKGludyh1aGNpLT5pb19hZGRyICsgVVNCUE9SVFNDMSArIHBvcnQgKiAyKSAmCisJCQkJCVVTQlBPUlRTQ19DQ1MpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgc3VzcGVuZF9yaChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2ksIGVudW0gdWhjaV9yaF9zdGF0ZSBuZXdfc3RhdGUpCiBfX3JlbGVhc2VzKHVoY2ktPmxvY2spCiBfX2FjcXVpcmVzKHVoY2ktPmxvY2spCiB7CiAJaW50IGF1dG9fc3RvcDsKLQlpbnQgaW50X2VuYWJsZTsKKwlpbnQgaW50X2VuYWJsZSwgZWdzbV9lbmFibGU7CiAKIAlhdXRvX3N0b3AgPSAobmV3X3N0YXRlID09IFVIQ0lfUkhfQVVUT19TVE9QUEVEKTsKIAlkZXZfZGJnKCZ1aGNpX3RvX2hjZCh1aGNpKS0+c2VsZi5yb290X2h1Yi0+ZGV2LApAQCAtMjE3LDE1ICsyNDgsMTggQEAKIAl9CiAKIAkvKiBFbmFibGUgcmVzdW1lLWRldGVjdCBpbnRlcnJ1cHRzIGlmIHRoZXkgd29yay4KLQkgKiBUaGVuIGVudGVyIEdsb2JhbCBTdXNwZW5kIG1vZGUsIHN0aWxsIGNvbmZpZ3VyZWQuCisJICogVGhlbiBlbnRlciBHbG9iYWwgU3VzcGVuZCBtb2RlIGlmIF9pdF8gd29ya3MsIHN0aWxsIGNvbmZpZ3VyZWQuCiAJICovCisJZWdzbV9lbmFibGUgPSBVU0JDTURfRUdTTTsKIAl1aGNpLT53b3JraW5nX1JEID0gMTsKIAlpbnRfZW5hYmxlID0gVVNCSU5UUl9SRVNVTUU7Ci0JaWYgKHJlc3VtZV9kZXRlY3RfaW50ZXJydXB0c19hcmVfYnJva2VuKHVoY2kpKSB7CisJaWYgKHJlbW90ZV93YWtldXBfaXNfYnJva2VuKHVoY2kpKQorCQllZ3NtX2VuYWJsZSA9IDA7CisJaWYgKHJlc3VtZV9kZXRlY3RfaW50ZXJydXB0c19hcmVfYnJva2VuKHVoY2kpIHx8ICFlZ3NtX2VuYWJsZSkKIAkJdWhjaS0+d29ya2luZ19SRCA9IGludF9lbmFibGUgPSAwOwotCX0KKwogCW91dHcoaW50X2VuYWJsZSwgdWhjaS0+aW9fYWRkciArIFVTQklOVFIpOwotCW91dHcoVVNCQ01EX0VHU00gfCBVU0JDTURfQ0YsIHVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpOworCW91dHcoZWdzbV9lbmFibGUgfCBVU0JDTURfQ0YsIHVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpOwogCW1iKCk7CiAJdWRlbGF5KDUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYwppbmRleCAwNjExNWYyLi4zMGI4ODQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMKQEAgLTQ5OCw3ICs0OTgsNyBAQAogewogCXN0cnVjdCB1cmJfcHJpdiAqdXJicDsKIAotCXVyYnAgPSBrbWVtX2NhY2hlX2FsbG9jKHVoY2lfdXBfY2FjaGVwLCBTTEFCX0FUT01JQyk7CisJdXJicCA9IGttZW1fY2FjaGVfYWxsb2ModWhjaV91cF9jYWNoZXAsIEdGUF9BVE9NSUMpOwogCWlmICghdXJicCkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMgYi9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jCmluZGV4IDMwMzhlZDAuLjhjY2RkZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMKKysrIGIvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYwpAQCAtNzk2LDcgKzc5Niw3IEBACiAKIAluZXdfZGVzYy0+Y29udGV4dC5zY3NpX3N0YXR1cyA9IGttYWxsb2MoMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfZGVzYy0+Y29udGV4dC5zY3NpX3N0YXR1cykKLQkJZ290byBvdXRfa2ZyZWUyOworCQlnb3RvIG91dF9mcmVlX3VyYjsKIAogCW5ld19kZXNjLT51c2JfZGV2ID0gZGV2OwogCW5ld19kZXNjLT51c2JfaW50ZiA9IGludGY7CkBAIC04MjIsMTggKzgyMiwyMCBAQAogCW5ld19kZXNjLT5ob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZtdHNfc2NzaV9ob3N0X3RlbXBsYXRlLAogCQkJc2l6ZW9mKG5ld19kZXNjKSk7CiAJaWYgKCFuZXdfZGVzYy0+aG9zdCkKLQkJZ290byBvdXRfZnJlZV91cmI7CisJCWdvdG8gb3V0X2tmcmVlMjsKIAogCW5ld19kZXNjLT5ob3N0LT5ob3N0ZGF0YVswXSA9ICh1bnNpZ25lZCBsb25nKW5ld19kZXNjOwogCWlmIChzY3NpX2FkZF9ob3N0KG5ld19kZXNjLT5ob3N0LCBOVUxMKSkgewogCQllcnJfcmV0dmFsID0gLUVJTzsKLQkJZ290byBvdXRfZnJlZV91cmI7CisJCWdvdG8gb3V0X2hvc3RfcHV0OwogCX0KIAlzY3NpX3NjYW5faG9zdChuZXdfZGVzYy0+aG9zdCk7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIG5ld19kZXNjKTsKIAlyZXR1cm4gMDsKIAorIG91dF9ob3N0X3B1dDoKKwlzY3NpX2hvc3RfcHV0KG5ld19kZXNjLT5ob3N0KTsKICBvdXRfa2ZyZWUyOgogCWtmcmVlKG5ld19kZXNjLT5jb250ZXh0LnNjc2lfc3RhdHVzKTsKICBvdXRfZnJlZV91cmI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnIGIvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZwppbmRleCAyMWNkMjI2Li44YTYyZDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKQEAgLTYsOSArNiwxMCBAQAogCiBjb25maWcgVVNCX0hJRAogCXRyaXN0YXRlICJVU0IgSHVtYW4gSW50ZXJmYWNlIERldmljZSAoZnVsbCBISUQpIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0IKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVTQiAmJiBISUQKIAktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGZ1bGwgSElEIHN1cHBvcnQgdG8gY29ubmVjdCBrZXlib2FyZHMsCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGZ1bGwgSElEIHN1cHBvcnQgdG8gY29ubmVjdCBVU0Iga2V5Ym9hcmRzLAogCSAgbWljZSwgam95c3RpY2tzLCBncmFwaGljIHRhYmxldHMsIG9yIGFueSBvdGhlciBISUQgYmFzZWQgZGV2aWNlcwogCSAgdG8geW91ciBjb21wdXRlciB2aWEgVVNCLiBZb3UgYWxzbyBuZWVkIHRvIHNlbGVjdCBISUQgSW5wdXQgbGF5ZXIKIAkgIHN1cHBvcnQgKGJlbG93KSBpZiB5b3Ugd2FudCB0byB1c2Uga2V5Ym9hcmRzLCBtaWNlLCBqb3lzdGlja3MgYW5kCkBAIC0yNywyMCArMjgsMTAgQEAKIGNvbW1lbnQgIklucHV0IGNvcmUgc3VwcG9ydCBpcyBuZWVkZWQgZm9yIFVTQiBISUQgaW5wdXQgbGF5ZXIgb3IgSElEQlAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9ISUQgJiYgSU5QVVQ9bgogCi1jb25maWcgVVNCX0hJRElOUFVUCi0JYm9vbCAiSElEIGlucHV0IGxheWVyIHN1cHBvcnQiCi0JZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBJTlBVVCAmJiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBVU0Iga2V5Ym9hcmQsIG1vdXNlIG9yIGpveXN0aWNrLAotCSAgb3IgYW55IG90aGVyIEhJRCBpbnB1dCBkZXZpY2UuCi0KLQkgIElmIHVuc3VyZSwgc2F5IFkuCi0KLWNvbmZpZyBVU0JfSElESU5QVVRfUE9XRVJCT09LCitjb25maWcgVVNCX0hJRF9QT1dFUkJPT0sKIAlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgaUJvb2svUG93ZXJCb29rIHNwZWNpYWwga2V5cyIKIAlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIFVTQl9ISURJTlBVVAorCWRlcGVuZHMgb24gVVNCX0hJRAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIHNwZWNpYWwga2V5cyAoRm4sIE51bWxvY2spIG9uCiAJICBBcHBsZSBpQm9va3MgYW5kIFBvd2VyQm9va3MuCkBAIC00OSw3ICs0MCw3IEBACiAKIGNvbmZpZyBISURfRkYKIAlib29sICJGb3JjZSBmZWVkYmFjayBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX0hJRElOUFVUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gVVNCX0hJRCAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlzIHlvdSB3YW50IGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIGEgZmV3IEhJRCBkZXZpY2VzLgogCSAgU2VlIGJlbG93IGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuCkBAIC0yMjEsNiArMjEyLDcgQEAKIAkgIC0gSVRNCiAJICAtIHNvbWUgb3RoZXIgZVR1cmJvVG91Y2gKIAkgIC0gR3VuemUgQUhMNjEKKwkgIC0gRE1DIFRTQy0xMC8yNQogCiAJICBIYXZlIGEgbG9vayBhdCA8aHR0cDovL2xpbnV4LmNoYXB0ZXI3LmNoL3RvdWNoa2l0Lz4gZm9yCiAJICBhIHVzYWdlIGRlc2NyaXB0aW9uIGFuZCB0aGUgcmVxdWlyZWQgdXNlci1zcGFjZSBzdHVmZi4KQEAgLTI1OCw2ICsyNTAsMTEgQEAKIAlib29sICJHdW56ZSBBSEw2MSBkZXZpY2Ugc3VwcG9ydCIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIFVTQl9UT1VDSFNDUkVFTgogCitjb25maWcgVVNCX1RPVUNIU0NSRUVOX0RNQ19UU0MxMAorCWRlZmF1bHQgeQorCWJvb2wgIkRNQyBUU0MtMTAvMjUgZGV2aWNlIHN1cHBvcnQiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfVE9VQ0hTQ1JFRU4KKwogY29uZmlnIFVTQl9ZRUFMSU5LCiAJdHJpc3RhdGUgIlllYWxpbmsgdXNiLXAxayB2b2lwIHBob25lIgogCWRlcGVuZHMgb24gVVNCICYmIElOUFVUICYmIEVYUEVSSU1FTlRBTApAQCAtMzQ4LDEzICszNDUsMyBAQAogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcHBsZXRvdWNoLgotCi1jb25maWcgVVNCX1RSQU5DRVZJQlJBVE9SCi0JdHJpc3RhdGUgIlBsYXlTdGF0aW9uIDIgVHJhbmNlIFZpYnJhdG9yIGRyaXZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IGEgUGxheVN0YXRpb24gMiBUcmFuY2UgVmlicmF0b3IKLQkgIGRldmljZSB0byB5b3VyIGNvbXB1dGVyJ3MgVVNCIHBvcnQuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRyYW5jZXZpYnJhdG9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQppbmRleCAyOTVmNDU5Li4xYTI0YjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMKIAogIyBNdWx0aXBhcnQgb2JqZWN0cy4KLXdhY29tLW9ianMJOj0gd2Fjb21fc3lzLm8gd2Fjb21fd2FjLm8KK3dhY29tLW9ianMJOj0gd2Fjb21fd2FjLm8gd2Fjb21fc3lzLm8KIHVzYmhpZC1vYmpzCTo9IGhpZC1jb3JlLm8KIAogIyBPcHRpb25hbCBwYXJ0cyBvZiBtdWx0aXBhcnQgb2JqZWN0cy4KQEAgLTExLDkgKzExLDYgQEAKIGlmZXEgKCQoQ09ORklHX1VTQl9ISURERVYpLHkpCiAJdXNiaGlkLW9ianMJKz0gaGlkZGV2Lm8KIGVuZGlmCi1pZmVxICgkKENPTkZJR19VU0JfSElESU5QVVQpLHkpCi0JdXNiaGlkLW9ianMJKz0gaGlkLWlucHV0Lm8KLWVuZGlmCiBpZmVxICgkKENPTkZJR19ISURfUElEKSx5KQogCXVzYmhpZC1vYmpzCSs9IGhpZC1waWRmZi5vCiBlbmRpZgpAQCAtNDgsNyArNDUsNiBAQAogb2JqLSQoQ09ORklHX1VTQl9ZRUFMSU5LKQkrPSB5ZWFsaW5rLm8KIG9iai0kKENPTkZJR19VU0JfWFBBRCkJCSs9IHhwYWQubwogb2JqLSQoQ09ORklHX1VTQl9BUFBMRVRPVUNIKQkrPSBhcHBsZXRvdWNoLm8KLW9iai0kKENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IpCSs9IHRyYW5jZXZpYnJhdG9yLm8KIAogaWZlcSAoJChDT05GSUdfVVNCX0RFQlVHKSx5KQogRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jIGIvZHJpdmVycy91c2IvaW5wdXQvYWNlY2FkLmMKaW5kZXggMDA5NjM3My4uOTA5MTM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvYWNlY2FkLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvYWNlY2FkLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCWlmICghYWNlY2FkIHx8ICFpbnB1dF9kZXYpCiAJCWdvdG8gZmFpbDE7CiAKLQlhY2VjYWQtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgOCwgU0xBQl9LRVJORUwsICZhY2VjYWQtPmRhdGFfZG1hKTsKKwlhY2VjYWQtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgOCwgR0ZQX0tFUk5FTCwgJmFjZWNhZC0+ZGF0YV9kbWEpOwogCWlmICghYWNlY2FkLT5kYXRhKQogCQlnb3RvIGZhaWwxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9haXB0ZWsuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2FpcHRlay5jCmluZGV4IGJmNDI4MTguLjlmNTI0MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2FpcHRlay5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2FpcHRlay5jCkBAIC0xOTg4LDcgKzE5ODgsNyBAQAogCQlnb3RvIGZhaWwxOwogCiAJYWlwdGVrLT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyh1c2JkZXYsIEFJUFRFS19QQUNLRVRfTEVOR1RILAotCQkJCQlTTEFCX0FUT01JQywgJmFpcHRlay0+ZGF0YV9kbWEpOworCQkJCQlHRlBfQVRPTUlDLCAmYWlwdGVrLT5kYXRhX2RtYSk7CiAJaWYgKCFhaXB0ZWstPmRhdGEpCiAJCWdvdG8gZmFpbDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2FwcGxldG91Y2guYyBiL2RyaXZlcnMvdXNiL2lucHV0L2FwcGxldG91Y2guYwppbmRleCA0YzIxMzUxLi5jNzcyOTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9hcHBsZXRvdWNoLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvYXBwbGV0b3VjaC5jCkBAIC0zOCwxNCArMzgsMjkgQEAKICNkZWZpbmUgQVBQTEVfVkVORE9SX0lECQkweDA1QUMKIAogLyogVGhlc2UgbmFtZXMgY29tZSBmcm9tIEluZm8ucGxpc3QgaW4gQXBwbGVVU0JUcmFja3BhZC5rZXh0ICovCi0jZGVmaW5lIEdFWVNFUl9BTlNJX1BST0RVQ1RfSUQJMHgwMjE0Ci0jZGVmaW5lIEdFWVNFUl9JU09fUFJPRFVDVF9JRAkweDAyMTUKLSNkZWZpbmUgR0VZU0VSX0pJU19QUk9EVUNUX0lECTB4MDIxNgorI2RlZmluZSBGT1VOVEFJTl9BTlNJX1BST0RVQ1RfSUQJMHgwMjBFCisjZGVmaW5lIEZPVU5UQUlOX0lTT19QUk9EVUNUX0lECQkweDAyMEYKKworI2RlZmluZSBGT1VOVEFJTl9UUF9PTkxZX1BST0RVQ1RfSUQJMHgwMzBBCisKKyNkZWZpbmUgR0VZU0VSMV9UUF9PTkxZX1BST0RVQ1RfSUQJMHgwMzBCCisKKyNkZWZpbmUgR0VZU0VSX0FOU0lfUFJPRFVDVF9JRAkJMHgwMjE0CisjZGVmaW5lIEdFWVNFUl9JU09fUFJPRFVDVF9JRAkJMHgwMjE1CisjZGVmaW5lIEdFWVNFUl9KSVNfUFJPRFVDVF9JRAkJMHgwMjE2CiAKIC8qIE1hY0Jvb2sgZGV2aWNlcyAqLwotI2RlZmluZSBHRVlTRVIzX0FOU0lfUFJPRFVDVF9JRAkweDAyMTcKLSNkZWZpbmUgR0VZU0VSM19JU09fUFJPRFVDVF9JRAkweDAyMTgKLSNkZWZpbmUgR0VZU0VSM19KSVNfUFJPRFVDVF9JRAkweDAyMTkKKyNkZWZpbmUgR0VZU0VSM19BTlNJX1BST0RVQ1RfSUQJCTB4MDIxNworI2RlZmluZSBHRVlTRVIzX0lTT19QUk9EVUNUX0lECQkweDAyMTgKKyNkZWZpbmUgR0VZU0VSM19KSVNfUFJPRFVDVF9JRAkJMHgwMjE5CisKKy8qCisgKiBHZXlzZXIgSVY6IHNhbWUgYXMgR2V5c2VyIElJSSBhY2NvcmRpbmcgdG8gSW5mby5wbGlzdCBpbiBBcHBsZVVTQlRyYWNrcGFkLmtleHQKKyAqIC0+IHNhbWUgSU9DbGFzcyAoQXBwbGVVU0JHcklJSVRyYWNrcGFkKSwgc2FtZSBhY2NlbGVyYXRpb24gdGFibGVzCisgKi8KKyNkZWZpbmUgR0VZU0VSNF9BTlNJX1BST0RVQ1RfSUQJMHgwMjFBCisjZGVmaW5lIEdFWVNFUjRfSVNPX1BST0RVQ1RfSUQJMHgwMjFCCisjZGVmaW5lIEdFWVNFUjRfSklTX1BST0RVQ1RfSUQJMHgwMjFDCiAKICNkZWZpbmUgQVRQX0RFVklDRShwcm9kKQkJCQkJXAogCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwJCVwKQEAgLTU4LDIwICs3MywyNiBAQAogCiAvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRwX3RhYmxlIFtdID0gewotCXsgQVRQX0RFVklDRSgweDAyMEUpIH0sCi0JeyBBVFBfREVWSUNFKDB4MDIwRikgfSwKLQl7IEFUUF9ERVZJQ0UoMHgwMzBBKSB9LAotCXsgQVRQX0RFVklDRSgweDAzMEIpIH0sCisJeyBBVFBfREVWSUNFKEZPVU5UQUlOX0FOU0lfUFJPRFVDVF9JRCkgfSwKKwl7IEFUUF9ERVZJQ0UoRk9VTlRBSU5fSVNPX1BST0RVQ1RfSUQpIH0sCisJeyBBVFBfREVWSUNFKEZPVU5UQUlOX1RQX09OTFlfUFJPRFVDVF9JRCkgfSwKKwl7IEFUUF9ERVZJQ0UoR0VZU0VSMV9UUF9PTkxZX1BST0RVQ1RfSUQpIH0sCiAKIAkvKiBQb3dlckJvb2tzIE9jdCAyMDA1ICovCiAJeyBBVFBfREVWSUNFKEdFWVNFUl9BTlNJX1BST0RVQ1RfSUQpIH0sCiAJeyBBVFBfREVWSUNFKEdFWVNFUl9JU09fUFJPRFVDVF9JRCkgfSwKIAl7IEFUUF9ERVZJQ0UoR0VZU0VSX0pJU19QUk9EVUNUX0lEKSB9LAogCisJLyogQ29yZSBEdW8gTWFjQm9vayAmIE1hY0Jvb2sgUHJvICovCiAJeyBBVFBfREVWSUNFKEdFWVNFUjNfQU5TSV9QUk9EVUNUX0lEKSB9LAogCXsgQVRQX0RFVklDRShHRVlTRVIzX0lTT19QUk9EVUNUX0lEKSB9LAogCXsgQVRQX0RFVklDRShHRVlTRVIzX0pJU19QUk9EVUNUX0lEKSB9LAogCisJLyogQ29yZTIgRHVvIE1hY0Jvb2sgJiBNYWNCb29rIFBybyAqLworCXsgQVRQX0RFVklDRShHRVlTRVI0X0FOU0lfUFJPRFVDVF9JRCkgfSwKKwl7IEFUUF9ERVZJQ0UoR0VZU0VSNF9JU09fUFJPRFVDVF9JRCkgfSwKKwl7IEFUUF9ERVZJQ0UoR0VZU0VSNF9KSVNfUFJPRFVDVF9JRCkgfSwKKwogCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiAJeyB9CiB9OwpAQCAtMTA4LDcgKzEyOSw3IEBACiAgKi8KICNkZWZpbmUgQVRQX1RIUkVTSE9MRAkgNQogCi0vKiBNYWNCb29rIFBybyAoR2V5c2VyIDMpIGluaXRpYWxpemF0aW9uIGNvbnN0YW50cyAqLworLyogTWFjQm9vayBQcm8gKEdleXNlciAzICYgNCkgaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzICovCiAjZGVmaW5lIEFUUF9HRVlTRVIzX01PREVfUkVBRF9SRVFVRVNUX0lEIDEKICNkZWZpbmUgQVRQX0dFWVNFUjNfTU9ERV9XUklURV9SRVFVRVNUX0lEIDkKICNkZWZpbmUgQVRQX0dFWVNFUjNfTU9ERV9SRVFVRVNUX1ZBTFVFIDB4MzAwCkBAIC0xNTQsNiArMTc1LDEzIEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkFwcGxlIFBvd2VyQm9va3MgVVNCIHRvdWNocGFkIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisvKgorICogTWFrZSB0aGUgdGhyZXNob2xkIGEgbW9kdWxlIHBhcmFtZXRlcgorICovCitzdGF0aWMgaW50IHRocmVzaG9sZCA9IEFUUF9USFJFU0hPTEQ7Cittb2R1bGVfcGFyYW0odGhyZXNob2xkLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh0aHJlc2hvbGQsICJEaXNjYXJkcyBhbnkgY2hhbmdlIGluIGRhdGEgZnJvbSBhIHNlbnNvciAodHJhY2twYWQgaGFzIGh1bmRyZWRzIG9mIHRoZXNlIHNlbnNvcnMpIGxlc3MgdGhhbiB0aGlzIHZhbHVlIik7CisKIHN0YXRpYyBpbnQgZGVidWcgPSAxOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkFjdGl2YXRlIGRlYnVnZ2luZyBvdXRwdXQiKTsKQEAgLTE3NCw3ICsyMDIsMTAgQEAKIAogCXJldHVybiAocHJvZHVjdElkID09IEdFWVNFUjNfQU5TSV9QUk9EVUNUX0lEKSB8fAogCQkocHJvZHVjdElkID09IEdFWVNFUjNfSVNPX1BST0RVQ1RfSUQpIHx8Ci0JCShwcm9kdWN0SWQgPT0gR0VZU0VSM19KSVNfUFJPRFVDVF9JRCk7CisJCShwcm9kdWN0SWQgPT0gR0VZU0VSM19KSVNfUFJPRFVDVF9JRCkgfHwKKwkJKHByb2R1Y3RJZCA9PSBHRVlTRVI0X0FOU0lfUFJPRFVDVF9JRCkgfHwKKwkJKHByb2R1Y3RJZCA9PSBHRVlTRVI0X0lTT19QUk9EVUNUX0lEKSB8fAorCQkocHJvZHVjdElkID09IEdFWVNFUjRfSklTX1BST0RVQ1RfSUQpOwogfQogCiBzdGF0aWMgaW50IGF0cF9jYWxjdWxhdGVfYWJzKGludCAqeHlfc2Vuc29ycywgaW50IG5iX3NlbnNvcnMsIGludCBmYWN0LApAQCAtMTgzLDE2ICsyMTQsNDggQEAKIAlpbnQgaTsKIAkvKiB2YWx1ZXMgdG8gY2FsY3VsYXRlIG1lYW4gKi8KIAlpbnQgcGN1bSA9IDAsIHBzdW0gPSAwOworCWludCBpc19pbmNyZWFzaW5nID0gMDsKIAogCSpmaW5nZXJzID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBuYl9zZW5zb3JzOyBpKyspIHsKLQkJaWYgKHh5X3NlbnNvcnNbaV0gPCBBVFBfVEhSRVNIT0xEKQorCQlpZiAoeHlfc2Vuc29yc1tpXSA8IHRocmVzaG9sZCkgeworCQkJaWYgKGlzX2luY3JlYXNpbmcpCisJCQkJaXNfaW5jcmVhc2luZyA9IDA7CisKIAkJCWNvbnRpbnVlOwotCQlpZiAoKGkgLSAxIDwgMCkgfHwgKHh5X3NlbnNvcnNbaSAtIDFdIDwgQVRQX1RIUkVTSE9MRCkpCisJCX0KKworCQkvKgorCQkgKiBNYWtlcyB0aGUgZmluZ2VyIGRldGVjdGlvbiBtb3JlIHZlcnNhdGlsZS4gIEZvciBleGFtcGxlLAorCQkgKiB0d28gZmluZ2VycyB3aXRoIG5vIGdhcCB3aWxsIGJlIGRldGVjdGVkLiAgQWxzbywgbXkKKwkJICogdGVzdHMgc2hvdyBpdCBsZXNzIGxpa2VseSB0byBoYXZlIGludGVybWl0dGVudCBsb3NzCisJCSAqIG9mIG11bHRpcGxlIGZpbmdlciByZWFkaW5ncyB3aGlsZSBtb3ZpbmcgYXJvdW5kIChzY3JvbGxpbmcpLgorCQkgKgorCQkgKiBDaGFuZ2VzIHRoZSBtdWx0aXBsZSBmaW5nZXIgZGV0ZWN0aW9uIHRvIGNvdW50aW5nIGh1bXBzIG9uCisJCSAqIHNlbnNvcnMgKHRyYW5zaXRpb25zIGZyb20gbm9uaW5jcmVhc2luZyB0byBpbmNyZWFzaW5nKQorCQkgKiBpbnN0ZWFkIG9mIGNvdW50aW5nIHRyYW5zaXRpb25zIGZyb20gbG93IHNlbnNvcnMgKG5vCisJCSAqIGZpbmdlciByZWFkaW5nKSB0byBoaWdoIHNlbnNvcnMgKGZpbmdlciBhYm92ZQorCQkgKiBzZW5zb3IpCisJCSAqCisJCSAqIC0gSmFzb24gUGFyZWtoIDxqYXNvbnBhcmVraEBnbWFpbC5jb20+CisJCSAqLworCQlpZiAoaSA8IDEgfHwgKCFpc19pbmNyZWFzaW5nICYmIHh5X3NlbnNvcnNbaSAtIDFdIDwgeHlfc2Vuc29yc1tpXSkpIHsKIAkJCSgqZmluZ2VycykrKzsKLQkJcGN1bSArPSB4eV9zZW5zb3JzW2ldICogaTsKLQkJcHN1bSArPSB4eV9zZW5zb3JzW2ldOworCQkJaXNfaW5jcmVhc2luZyA9IDE7CisJCX0gZWxzZSBpZiAoaSA+IDAgJiYgeHlfc2Vuc29yc1tpIC0gMV0gPj0geHlfc2Vuc29yc1tpXSkgeworCQkJaXNfaW5jcmVhc2luZyA9IDA7CisJCX0KKworCQkvKgorCQkgKiBTdWJ0cmFjdHMgdGhyZXNob2xkIHNvIGEgaGlnaCBzZW5zb3IgdGhhdCBqdXN0IHBhc3NlcyB0aGUgdGhyZXNob2xkCisJCSAqIHdvbid0IHNrZXcgdGhlIGNhbGN1bGF0ZWQgYWJzb2x1dGUgY29vcmRpbmF0ZS4gIEZpeGVzIGFuIGlzc3VlCisJCSAqIHdoZXJlIHNsb3dseSBtb3ZpbmcgdGhlIG1vdXNlIHdvdWxkIG9jY2Fzc2lvbmFseSBqdW1wIGEgbnVtYmVyIG9mCisJCSAqIHBpeGVscyAobGV0IG1lIHJlc3RhdGUtLXNsb3dseSBtb3ZpbmcgdGhlIG1vdXNlIG1ha2VzIHRoaXMgaXNzdWUKKwkJICogbW9zdCBhcHBhcmVudCkuCisJCSAqLworCQlwY3VtICs9ICh4eV9zZW5zb3JzW2ldIC0gdGhyZXNob2xkKSAqIGk7CisJCXBzdW0gKz0gKHh5X3NlbnNvcnNbaV0gLSB0aHJlc2hvbGQpOwogCX0KIAogCWlmIChwc3VtID4gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZS5jCmluZGV4IGY2NTlmMzAuLmI3MjRlMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlLmMKQEAgLTU5Miw3ICs1OTIsNyBAQAogCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAJfQogCi0JcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBTTEFCX0FUT01JQyk7CisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0dmFsKQogCQlkZXZfZXJyKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIiVzOiB1c2Jfc3VibWl0X3VyYigpPSVkXG4iLAogCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOwpAQCAtNjA0LDEyICs2MDQsMTIgQEAKIHN0YXRpYyBpbnQgYXRpX3JlbW90ZV9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAogCQkJCSAgICBzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKIHsKLQlhdGlfcmVtb3RlLT5pbmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgREFUQV9CVUZTSVpFLCBTTEFCX0FUT01JQywKKwlhdGlfcmVtb3RlLT5pbmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgREFUQV9CVUZTSVpFLCBHRlBfQVRPTUlDLAogCQkJCQkgICAgICZhdGlfcmVtb3RlLT5pbmJ1Zl9kbWEpOwogCWlmICghYXRpX3JlbW90ZS0+aW5idWYpCiAJCXJldHVybiAtMTsKIAotCWF0aV9yZW1vdGUtPm91dGJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgREFUQV9CVUZTSVpFLCBTTEFCX0FUT01JQywKKwlhdGlfcmVtb3RlLT5vdXRidWYgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIERBVEFfQlVGU0laRSwgR0ZQX0FUT01JQywKIAkJCQkJICAgICAgJmF0aV9yZW1vdGUtPm91dGJ1Zl9kbWEpOwogCWlmICghYXRpX3JlbW90ZS0+b3V0YnVmKQogCQlyZXR1cm4gLTE7CkBAIC02MzAsMTkgKzYzMCwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBhdGlfcmVtb3RlX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSkKIHsKLQlpZiAoYXRpX3JlbW90ZS0+aXJxX3VyYikKLQkJdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOworCXVzYl9mcmVlX3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiKTsKKwl1c2JfZnJlZV91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYik7CiAKLQlpZiAoYXRpX3JlbW90ZS0+b3V0X3VyYikKLQkJdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIpOworCXVzYl9idWZmZXJfZnJlZShhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsCisJCWF0aV9yZW1vdGUtPmluYnVmLCBhdGlfcmVtb3RlLT5pbmJ1Zl9kbWEpOwogCi0JaWYgKGF0aV9yZW1vdGUtPmluYnVmKQotCQl1c2JfYnVmZmVyX2ZyZWUoYXRpX3JlbW90ZS0+dWRldiwgREFUQV9CVUZTSVpFLAotCQkJCWF0aV9yZW1vdGUtPmluYnVmLCBhdGlfcmVtb3RlLT5pbmJ1Zl9kbWEpOwotCi0JaWYgKGF0aV9yZW1vdGUtPm91dGJ1ZikKLQkJdXNiX2J1ZmZlcl9mcmVlKGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwKLQkJCQlhdGlfcmVtb3RlLT5pbmJ1ZiwgYXRpX3JlbW90ZS0+b3V0YnVmX2RtYSk7CisJdXNiX2J1ZmZlcl9mcmVlKGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwKKwkJYXRpX3JlbW90ZS0+b3V0YnVmLCBhdGlfcmVtb3RlLT5vdXRidWZfZG1hKTsKIH0KIAogc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pbnB1dF9pbml0KHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZTIuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUyLmMKaW5kZXggZjk4MmEyYi4uODNmMWY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZTIuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlMi5jCkBAIC0zNzIsOCArMzcyLDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJaWYgKGFyMi0+dXJiW2ldKQotCQkJdXNiX2ZyZWVfdXJiKGFyMi0+dXJiW2ldKTsKKwkJdXNiX2ZyZWVfdXJiKGFyMi0+dXJiW2ldKTsKIAogCQlpZiAoYXIyLT5idWZbaV0pCiAJCQl1c2JfYnVmZmVyX2ZyZWUoYXIyLT51ZGV2LCA0LCBhcjItPmJ1ZltpXSwgYXIyLT5idWZfZG1hW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCmluZGV4IGE2NzM4YTguLjg5ZmE2ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwpAQCAtNCw2ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKICAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgogICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNiBKaXJpIEtvc2luYQogICovCiAKIC8qCkBAIC0zMiw4ICszMyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KIAotI2luY2x1ZGUgImhpZC5oIgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZGRldi5oPgorI2luY2x1ZGUgInVzYmhpZC5oIgogCiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgpAQCAtNTQsODUxICs1NiwxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG1vdXNlcG9sbCwgaGlkX21vdXNlcG9sbF9pbnRlcnZhbCwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1vdXNlcG9sbCwgIlBvbGxpbmcgaW50ZXJ2YWwgb2YgbWljZSIpOwogCi0vKgotICogUmVnaXN0ZXIgYSBuZXcgcmVwb3J0IGZvciBhIGRldmljZS4KLSAqLwotCi1zdGF0aWMgc3RydWN0IGhpZF9yZXBvcnQgKmhpZF9yZWdpc3Rlcl9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgaWQpCi17Ci0Jc3RydWN0IGhpZF9yZXBvcnRfZW51bSAqcmVwb3J0X2VudW0gPSBkZXZpY2UtPnJlcG9ydF9lbnVtICsgdHlwZTsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotCi0JaWYgKHJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtpZF0pCi0JCXJldHVybiByZXBvcnRfZW51bS0+cmVwb3J0X2lkX2hhc2hbaWRdOwotCi0JaWYgKCEocmVwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9yZXBvcnQpLCBHRlBfS0VSTkVMKSkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGlkICE9IDApCi0JCXJlcG9ydF9lbnVtLT5udW1iZXJlZCA9IDE7Ci0KLQlyZXBvcnQtPmlkID0gaWQ7Ci0JcmVwb3J0LT50eXBlID0gdHlwZTsKLQlyZXBvcnQtPnNpemUgPSAwOwotCXJlcG9ydC0+ZGV2aWNlID0gZGV2aWNlOwotCXJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtpZF0gPSByZXBvcnQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZyZXBvcnQtPmxpc3QsICZyZXBvcnRfZW51bS0+cmVwb3J0X2xpc3QpOwotCi0JcmV0dXJuIHJlcG9ydDsKLX0KLQotLyoKLSAqIFJlZ2lzdGVyIGEgbmV3IGZpZWxkIGZvciB0aGlzIHJlcG9ydC4KLSAqLwotCi1zdGF0aWMgc3RydWN0IGhpZF9maWVsZCAqaGlkX3JlZ2lzdGVyX2ZpZWxkKHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsIHVuc2lnbmVkIHVzYWdlcywgdW5zaWduZWQgdmFsdWVzKQotewotCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkOwotCi0JaWYgKHJlcG9ydC0+bWF4ZmllbGQgPT0gSElEX01BWF9GSUVMRFMpIHsKLQkJZGJnKCJ0b28gbWFueSBmaWVsZHMgaW4gcmVwb3J0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmICghKGZpZWxkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9maWVsZCkgKyB1c2FnZXMgKiBzaXplb2Yoc3RydWN0IGhpZF91c2FnZSkKLQkJKyB2YWx1ZXMgKiBzaXplb2YodW5zaWduZWQpLCBHRlBfS0VSTkVMKSkpIHJldHVybiBOVUxMOwotCi0JZmllbGQtPmluZGV4ID0gcmVwb3J0LT5tYXhmaWVsZCsrOwotCXJlcG9ydC0+ZmllbGRbZmllbGQtPmluZGV4XSA9IGZpZWxkOwotCWZpZWxkLT51c2FnZSA9IChzdHJ1Y3QgaGlkX3VzYWdlICopKGZpZWxkICsgMSk7Ci0JZmllbGQtPnZhbHVlID0gKHVuc2lnbmVkICopKGZpZWxkLT51c2FnZSArIHVzYWdlcyk7Ci0JZmllbGQtPnJlcG9ydCA9IHJlcG9ydDsKLQotCXJldHVybiBmaWVsZDsKLX0KLQotLyoKLSAqIE9wZW4gYSBjb2xsZWN0aW9uLiBUaGUgdHlwZS91c2FnZSBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLgotICovCi0KLXN0YXRpYyBpbnQgb3Blbl9jb2xsZWN0aW9uKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHR5cGUpCi17Ci0Jc3RydWN0IGhpZF9jb2xsZWN0aW9uICpjb2xsZWN0aW9uOwotCXVuc2lnbmVkIHVzYWdlOwotCi0JdXNhZ2UgPSBwYXJzZXItPmxvY2FsLnVzYWdlWzBdOwotCi0JaWYgKHBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHIgPT0gSElEX0NPTExFQ1RJT05fU1RBQ0tfU0laRSkgewotCQlkYmcoImNvbGxlY3Rpb24gc3RhY2sgb3ZlcmZsb3ciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChwYXJzZXItPmRldmljZS0+bWF4Y29sbGVjdGlvbiA9PSBwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbl9zaXplKSB7Ci0JCWNvbGxlY3Rpb24gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24pICoKLQkJCQlwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbl9zaXplICogMiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjb2xsZWN0aW9uID09IE5VTEwpIHsKLQkJCWRiZygiZmFpbGVkIHRvIHJlYWxsb2NhdGUgY29sbGVjdGlvbiBhcnJheSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1lbWNweShjb2xsZWN0aW9uLCBwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbiwKLQkJCXNpemVvZihzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24pICoKLQkJCXBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uX3NpemUpOwotCQltZW1zZXQoY29sbGVjdGlvbiArIHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uX3NpemUsIDAsCi0JCQlzaXplb2Yoc3RydWN0IGhpZF9jb2xsZWN0aW9uKSAqCi0JCQlwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbl9zaXplKTsKLQkJa2ZyZWUocGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb24pOwotCQlwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JCXBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uX3NpemUgKj0gMjsKLQl9Ci0KLQlwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tbcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0cisrXSA9Ci0JCXBhcnNlci0+ZGV2aWNlLT5tYXhjb2xsZWN0aW9uOwotCi0JY29sbGVjdGlvbiA9IHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uICsKLQkJcGFyc2VyLT5kZXZpY2UtPm1heGNvbGxlY3Rpb24rKzsKLQljb2xsZWN0aW9uLT50eXBlID0gdHlwZTsKLQljb2xsZWN0aW9uLT51c2FnZSA9IHVzYWdlOwotCWNvbGxlY3Rpb24tPmxldmVsID0gcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0ciAtIDE7Ci0KLQlpZiAodHlwZSA9PSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTikKLQkJcGFyc2VyLT5kZXZpY2UtPm1heGFwcGxpY2F0aW9uKys7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENsb3NlIGEgY29sbGVjdGlvbi4KLSAqLwotCi1zdGF0aWMgaW50IGNsb3NlX2NvbGxlY3Rpb24oc3RydWN0IGhpZF9wYXJzZXIgKnBhcnNlcikKLXsKLQlpZiAoIXBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHIpIHsKLQkJZGJnKCJjb2xsZWN0aW9uIHN0YWNrIHVuZGVyZmxvdyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHItLTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENsaW1iIHVwIHRoZSBzdGFjaywgc2VhcmNoIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdHlwZQotICogYW5kIHJldHVybiB0aGUgdXNhZ2UuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGhpZF9sb29rdXBfY29sbGVjdGlvbihzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyLCB1bnNpZ25lZCB0eXBlKQotewotCWludCBuOwotCWZvciAobiA9IHBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHIgLSAxOyBuID49IDA7IG4tLSkKLQkJaWYgKHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uW3BhcnNlci0+Y29sbGVjdGlvbl9zdGFja1tuXV0udHlwZSA9PSB0eXBlKQotCQkJcmV0dXJuIHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uW3BhcnNlci0+Y29sbGVjdGlvbl9zdGFja1tuXV0udXNhZ2U7Ci0JcmV0dXJuIDA7IC8qIHdlIGtub3cgbm90aGluZyBhYm91dCB0aGlzIHVzYWdlIHR5cGUgKi8KLX0KLQotLyoKLSAqIEFkZCBhIHVzYWdlIHRvIHRoZSB0ZW1wb3JhcnkgcGFyc2VyIHRhYmxlLgotICovCi0KLXN0YXRpYyBpbnQgaGlkX2FkZF91c2FnZShzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyLCB1bnNpZ25lZCB1c2FnZSkKLXsKLQlpZiAocGFyc2VyLT5sb2NhbC51c2FnZV9pbmRleCA+PSBISURfTUFYX1VTQUdFUykgewotCQlkYmcoInVzYWdlIGluZGV4IGV4Y2VlZGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcGFyc2VyLT5sb2NhbC51c2FnZVtwYXJzZXItPmxvY2FsLnVzYWdlX2luZGV4XSA9IHVzYWdlOwotCXBhcnNlci0+bG9jYWwuY29sbGVjdGlvbl9pbmRleFtwYXJzZXItPmxvY2FsLnVzYWdlX2luZGV4XSA9Ci0JCXBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHIgPwotCQlwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tbcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0ciAtIDFdIDogMDsKLQlwYXJzZXItPmxvY2FsLnVzYWdlX2luZGV4Kys7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZWdpc3RlciBhIG5ldyBmaWVsZCBmb3IgdGhpcyByZXBvcnQuCi0gKi8KLQotc3RhdGljIGludCBoaWRfYWRkX2ZpZWxkKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHJlcG9ydF90eXBlLCB1bnNpZ25lZCBmbGFncykKLXsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkOwotCWludCB1c2FnZXM7Ci0JdW5zaWduZWQgb2Zmc2V0OwotCWludCBpOwotCi0JaWYgKCEocmVwb3J0ID0gaGlkX3JlZ2lzdGVyX3JlcG9ydChwYXJzZXItPmRldmljZSwgcmVwb3J0X3R5cGUsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9pZCkpKSB7Ci0JCWRiZygiaGlkX3JlZ2lzdGVyX3JlcG9ydCBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21heGltdW0gPCBwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21pbmltdW0pIHsKLQkJZGJnKCJsb2dpY2FsIHJhbmdlIGludmFsaWQgJWQgJWQiLCBwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21pbmltdW0sIHBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWF4aW11bSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlvZmZzZXQgPSByZXBvcnQtPnNpemU7Ci0JcmVwb3J0LT5zaXplICs9IHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9zaXplICogcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50OwotCi0JaWYgKCFwYXJzZXItPmxvY2FsLnVzYWdlX2luZGV4KSAvKiBJZ25vcmUgcGFkZGluZyBmaWVsZHMgKi8KLQkJcmV0dXJuIDA7Ci0KLQl1c2FnZXMgPSBtYXhfdChpbnQsIHBhcnNlci0+bG9jYWwudXNhZ2VfaW5kZXgsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCk7Ci0KLQlpZiAoKGZpZWxkID0gaGlkX3JlZ2lzdGVyX2ZpZWxkKHJlcG9ydCwgdXNhZ2VzLCBwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQpKSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCWZpZWxkLT5waHlzaWNhbCA9IGhpZF9sb29rdXBfY29sbGVjdGlvbihwYXJzZXIsIEhJRF9DT0xMRUNUSU9OX1BIWVNJQ0FMKTsKLQlmaWVsZC0+bG9naWNhbCA9IGhpZF9sb29rdXBfY29sbGVjdGlvbihwYXJzZXIsIEhJRF9DT0xMRUNUSU9OX0xPR0lDQUwpOwotCWZpZWxkLT5hcHBsaWNhdGlvbiA9IGhpZF9sb29rdXBfY29sbGVjdGlvbihwYXJzZXIsIEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OKTsKLQotCWZvciAoaSA9IDA7IGkgPCB1c2FnZXM7IGkrKykgewotCQlpbnQgaiA9IGk7Ci0JCS8qIER1cGxpY2F0ZSB0aGUgbGFzdCB1c2FnZSB3ZSBwYXJzZWQgaWYgd2UgaGF2ZSBleGNlc3MgdmFsdWVzICovCi0JCWlmIChpID49IHBhcnNlci0+bG9jYWwudXNhZ2VfaW5kZXgpCi0JCQlqID0gcGFyc2VyLT5sb2NhbC51c2FnZV9pbmRleCAtIDE7Ci0JCWZpZWxkLT51c2FnZVtpXS5oaWQgPSBwYXJzZXItPmxvY2FsLnVzYWdlW2pdOwotCQlmaWVsZC0+dXNhZ2VbaV0uY29sbGVjdGlvbl9pbmRleCA9Ci0JCQlwYXJzZXItPmxvY2FsLmNvbGxlY3Rpb25faW5kZXhbal07Ci0JfQotCi0JZmllbGQtPm1heHVzYWdlID0gdXNhZ2VzOwotCWZpZWxkLT5mbGFncyA9IGZsYWdzOwotCWZpZWxkLT5yZXBvcnRfb2Zmc2V0ID0gb2Zmc2V0OwotCWZpZWxkLT5yZXBvcnRfdHlwZSA9IHJlcG9ydF90eXBlOwotCWZpZWxkLT5yZXBvcnRfc2l6ZSA9IHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9zaXplOwotCWZpZWxkLT5yZXBvcnRfY291bnQgPSBwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQ7Ci0JZmllbGQtPmxvZ2ljYWxfbWluaW11bSA9IHBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWluaW11bTsKLQlmaWVsZC0+bG9naWNhbF9tYXhpbXVtID0gcGFyc2VyLT5nbG9iYWwubG9naWNhbF9tYXhpbXVtOwotCWZpZWxkLT5waHlzaWNhbF9taW5pbXVtID0gcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWluaW11bTsKLQlmaWVsZC0+cGh5c2ljYWxfbWF4aW11bSA9IHBhcnNlci0+Z2xvYmFsLnBoeXNpY2FsX21heGltdW07Ci0JZmllbGQtPnVuaXRfZXhwb25lbnQgPSBwYXJzZXItPmdsb2JhbC51bml0X2V4cG9uZW50OwotCWZpZWxkLT51bml0ID0gcGFyc2VyLT5nbG9iYWwudW5pdDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogUmVhZCBkYXRhIHZhbHVlIGZyb20gaXRlbS4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBpdGVtX3VkYXRhKHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKLXsKLQlzd2l0Y2ggKGl0ZW0tPnNpemUpIHsKLQkJY2FzZSAxOiByZXR1cm4gaXRlbS0+ZGF0YS51ODsKLQkJY2FzZSAyOiByZXR1cm4gaXRlbS0+ZGF0YS51MTY7Ci0JCWNhc2UgNDogcmV0dXJuIGl0ZW0tPmRhdGEudTMyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX19zMzIgaXRlbV9zZGF0YShzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCi17Ci0Jc3dpdGNoIChpdGVtLT5zaXplKSB7Ci0JCWNhc2UgMTogcmV0dXJuIGl0ZW0tPmRhdGEuczg7Ci0JCWNhc2UgMjogcmV0dXJuIGl0ZW0tPmRhdGEuczE2OwotCQljYXNlIDQ6IHJldHVybiBpdGVtLT5kYXRhLnMzMjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcm9jZXNzIGEgZ2xvYmFsIGl0ZW0uCi0gKi8KLQotc3RhdGljIGludCBoaWRfcGFyc2VyX2dsb2JhbChzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyLCBzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCi17Ci0Jc3dpdGNoIChpdGVtLT50YWcpIHsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUFVTSDoKLQotCQkJaWYgKHBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0ciA9PSBISURfR0xPQkFMX1NUQUNLX1NJWkUpIHsKLQkJCQlkYmcoImdsb2JhbCBlbnZpcm9tZW50IHN0YWNrIG92ZXJmbG93Iik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQltZW1jcHkocGFyc2VyLT5nbG9iYWxfc3RhY2sgKyBwYXJzZXItPmdsb2JhbF9zdGFja19wdHIrKywKLQkJCQkmcGFyc2VyLT5nbG9iYWwsIHNpemVvZihzdHJ1Y3QgaGlkX2dsb2JhbCkpOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BPUDoKLQotCQkJaWYgKCFwYXJzZXItPmdsb2JhbF9zdGFja19wdHIpIHsKLQkJCQlkYmcoImdsb2JhbCBlbnZpcm9tZW50IHN0YWNrIHVuZGVyZmxvdyIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJbWVtY3B5KCZwYXJzZXItPmdsb2JhbCwgcGFyc2VyLT5nbG9iYWxfc3RhY2sgKyAtLXBhcnNlci0+Z2xvYmFsX3N0YWNrX3B0ciwKLQkJCQlzaXplb2Yoc3RydWN0IGhpZF9nbG9iYWwpKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19VU0FHRV9QQUdFOgotCQkJcGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA9IGl0ZW1fdWRhdGEoaXRlbSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfTE9HSUNBTF9NSU5JTVVNOgotCQkJcGFyc2VyLT5nbG9iYWwubG9naWNhbF9taW5pbXVtID0gaXRlbV9zZGF0YShpdGVtKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19MT0dJQ0FMX01BWElNVU06Ci0JCQlpZiAocGFyc2VyLT5nbG9iYWwubG9naWNhbF9taW5pbXVtIDwgMCkKLQkJCQlwYXJzZXItPmdsb2JhbC5sb2dpY2FsX21heGltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOwotCQkJZWxzZQotCQkJCXBhcnNlci0+Z2xvYmFsLmxvZ2ljYWxfbWF4aW11bSA9IGl0ZW1fdWRhdGEoaXRlbSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUEhZU0lDQUxfTUlOSU1VTToKLQkJCXBhcnNlci0+Z2xvYmFsLnBoeXNpY2FsX21pbmltdW0gPSBpdGVtX3NkYXRhKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1BIWVNJQ0FMX01BWElNVU06Ci0JCQlpZiAocGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWluaW11bSA8IDApCi0JCQkJcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWF4aW11bSA9IGl0ZW1fc2RhdGEoaXRlbSk7Ci0JCQllbHNlCi0JCQkJcGFyc2VyLT5nbG9iYWwucGh5c2ljYWxfbWF4aW11bSA9IGl0ZW1fdWRhdGEoaXRlbSk7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfVU5JVF9FWFBPTkVOVDoKLQkJCXBhcnNlci0+Z2xvYmFsLnVuaXRfZXhwb25lbnQgPSBpdGVtX3NkYXRhKGl0ZW0pOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBISURfR0xPQkFMX0lURU1fVEFHX1VOSVQ6Ci0JCQlwYXJzZXItPmdsb2JhbC51bml0ID0gaXRlbV91ZGF0YShpdGVtKTsKLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfU0laRToKLQkJCWlmICgocGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemUgPSBpdGVtX3VkYXRhKGl0ZW0pKSA+IDMyKSB7Ci0JCQkJZGJnKCJpbnZhbGlkIHJlcG9ydF9zaXplICVkIiwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X3NpemUpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiAwOwotCi0JCWNhc2UgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfQ09VTlQ6Ci0JCQlpZiAoKHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCA9IGl0ZW1fdWRhdGEoaXRlbSkpID4gSElEX01BWF9VU0FHRVMpIHsKLQkJCQlkYmcoImludmFsaWQgcmVwb3J0X2NvdW50ICVkIiwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50KTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9HTE9CQUxfSVRFTV9UQUdfUkVQT1JUX0lEOgotCQkJaWYgKChwYXJzZXItPmdsb2JhbC5yZXBvcnRfaWQgPSBpdGVtX3VkYXRhKGl0ZW0pKSA9PSAwKSB7Ci0JCQkJZGJnKCJyZXBvcnRfaWQgMCBpcyBpbnZhbGlkIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0KLQkJZGVmYXVsdDoKLQkJCWRiZygidW5rbm93biBnbG9iYWwgdGFnIDB4JXgiLCBpdGVtLT50YWcpOwotCQkJcmV0dXJuIC0xOwotCX0KLX0KLQotLyoKLSAqIFByb2Nlc3MgYSBsb2NhbCBpdGVtLgotICovCi0KLXN0YXRpYyBpbnQgaGlkX3BhcnNlcl9sb2NhbChzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyLCBzdHJ1Y3QgaGlkX2l0ZW0gKml0ZW0pCi17Ci0JX191MzIgZGF0YTsKLQl1bnNpZ25lZCBuOwotCi0JaWYgKGl0ZW0tPnNpemUgPT0gMCkgewotCQlkYmcoIml0ZW0gZGF0YSBleHBlY3RlZCBmb3IgbG9jYWwgaXRlbSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZGF0YSA9IGl0ZW1fdWRhdGEoaXRlbSk7Ci0KLQlzd2l0Y2ggKGl0ZW0tPnRhZykgewotCi0JCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX0RFTElNSVRFUjoKLQotCQkJaWYgKGRhdGEpIHsKLQkJCQkvKgotCQkJCSAqIFdlIHRyZWF0IGl0ZW1zIGJlZm9yZSB0aGUgZmlyc3QgZGVsaW1pdGVyCi0JCQkJICogYXMgZ2xvYmFsIHRvIGFsbCB1c2FnZSBzZXRzIChicmFuY2ggMCkuCi0JCQkJICogSW4gdGhlIG1vbWVudCB3ZSBwcm9jZXNzIG9ubHkgdGhlc2UgZ2xvYmFsCi0JCQkJICogaXRlbXMgYW5kIHRoZSBmaXJzdCBkZWxpbWl0ZXIgc2V0LgotCQkJCSAqLwotCQkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCAhPSAwKSB7Ci0JCQkJCWRiZygibmVzdGVkIGRlbGltaXRlcnMiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCsrOwotCQkJCXBhcnNlci0+bG9jYWwuZGVsaW1pdGVyX2JyYW5jaCsrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGggPCAxKSB7Ci0JCQkJCWRiZygiYm9ndXMgY2xvc2UgZGVsaW1pdGVyIik7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfZGVwdGgtLTsKLQkJCX0KLQkJCXJldHVybiAxOwotCi0JCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFOgotCi0JCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgewotCQkJCWRiZygiYWx0ZXJuYXRpdmUgdXNhZ2UgaWdub3JlZCIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlpZiAoaXRlbS0+c2l6ZSA8PSAyKQotCQkJCWRhdGEgPSAocGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA8PCAxNikgKyBkYXRhOwotCi0JCQlyZXR1cm4gaGlkX2FkZF91c2FnZShwYXJzZXIsIGRhdGEpOwotCi0JCWNhc2UgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFX01JTklNVU06Ci0KLQkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9icmFuY2ggPiAxKSB7Ci0JCQkJZGJnKCJhbHRlcm5hdGl2ZSB1c2FnZSBpZ25vcmVkIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCWlmIChpdGVtLT5zaXplIDw9IDIpCi0JCQkJZGF0YSA9IChwYXJzZXItPmdsb2JhbC51c2FnZV9wYWdlIDw8IDE2KSArIGRhdGE7Ci0KLQkJCXBhcnNlci0+bG9jYWwudXNhZ2VfbWluaW11bSA9IGRhdGE7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIEhJRF9MT0NBTF9JVEVNX1RBR19VU0FHRV9NQVhJTVVNOgotCi0JCQlpZiAocGFyc2VyLT5sb2NhbC5kZWxpbWl0ZXJfYnJhbmNoID4gMSkgewotCQkJCWRiZygiYWx0ZXJuYXRpdmUgdXNhZ2UgaWdub3JlZCIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlpZiAoaXRlbS0+c2l6ZSA8PSAyKQotCQkJCWRhdGEgPSAocGFyc2VyLT5nbG9iYWwudXNhZ2VfcGFnZSA8PCAxNikgKyBkYXRhOwotCi0JCQlmb3IgKG4gPSBwYXJzZXItPmxvY2FsLnVzYWdlX21pbmltdW07IG4gPD0gZGF0YTsgbisrKQotCQkJCWlmIChoaWRfYWRkX3VzYWdlKHBhcnNlciwgbikpIHsKLQkJCQkJZGJnKCJoaWRfYWRkX3VzYWdlIGZhaWxlZFxuIik7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQlyZXR1cm4gMDsKLQotCQlkZWZhdWx0OgotCi0JCQlkYmcoInVua25vd24gbG9jYWwgaXRlbSB0YWcgMHgleCIsIGl0ZW0tPnRhZyk7Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcm9jZXNzIGEgbWFpbiBpdGVtLgotICovCi0KLXN0YXRpYyBpbnQgaGlkX3BhcnNlcl9tYWluKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKLXsKLQlfX3UzMiBkYXRhOwotCWludCByZXQ7Ci0KLQlkYXRhID0gaXRlbV91ZGF0YShpdGVtKTsKLQotCXN3aXRjaCAoaXRlbS0+dGFnKSB7Ci0JCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfQkVHSU5fQ09MTEVDVElPTjoKLQkJCXJldCA9IG9wZW5fY29sbGVjdGlvbihwYXJzZXIsIGRhdGEgJiAweGZmKTsKLQkJCWJyZWFrOwotCQljYXNlIEhJRF9NQUlOX0lURU1fVEFHX0VORF9DT0xMRUNUSU9OOgotCQkJcmV0ID0gY2xvc2VfY29sbGVjdGlvbihwYXJzZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfSU5QVVQ6Ci0JCQlyZXQgPSBoaWRfYWRkX2ZpZWxkKHBhcnNlciwgSElEX0lOUFVUX1JFUE9SVCwgZGF0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBISURfTUFJTl9JVEVNX1RBR19PVVRQVVQ6Ci0JCQlyZXQgPSBoaWRfYWRkX2ZpZWxkKHBhcnNlciwgSElEX09VVFBVVF9SRVBPUlQsIGRhdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSElEX01BSU5fSVRFTV9UQUdfRkVBVFVSRToKLQkJCXJldCA9IGhpZF9hZGRfZmllbGQocGFyc2VyLCBISURfRkVBVFVSRV9SRVBPUlQsIGRhdGEpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkYmcoInVua25vd24gbWFpbiBpdGVtIHRhZyAweCV4IiwgaXRlbS0+dGFnKTsKLQkJCXJldCA9IDA7Ci0JfQotCi0JbWVtc2V0KCZwYXJzZXItPmxvY2FsLCAwLCBzaXplb2YocGFyc2VyLT5sb2NhbCkpOwkvKiBSZXNldCB0aGUgbG9jYWwgcGFyc2VyIGVudmlyb25tZW50ICovCi0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogUHJvY2VzcyBhIHJlc2VydmVkIGl0ZW0uCi0gKi8KLQotc3RhdGljIGludCBoaWRfcGFyc2VyX3Jlc2VydmVkKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHN0cnVjdCBoaWRfaXRlbSAqaXRlbSkKLXsKLQlkYmcoInJlc2VydmVkIGl0ZW0gdHlwZSwgdGFnIDB4JXgiLCBpdGVtLT50YWcpOwotCXJldHVybiAwOwotfQotCi0vKgotICogRnJlZSBhIHJlcG9ydCBhbmQgYWxsIHJlZ2lzdGVyZWQgZmllbGRzLiBUaGUgZmllbGQtPnVzYWdlIGFuZAotICogZmllbGQtPnZhbHVlIHRhYmxlJ3MgYXJlIGFsbG9jYXRlZCBiZWhpbmQgdGhlIGZpZWxkLCBzbyB3ZSBuZWVkCi0gKiBvbmx5IHRvIGZyZWUoZmllbGQpIGl0c2VsZi4KLSAqLwotCi1zdGF0aWMgdm9pZCBoaWRfZnJlZV9yZXBvcnQoc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCkKLXsKLQl1bnNpZ25lZCBuOwotCi0JZm9yIChuID0gMDsgbiA8IHJlcG9ydC0+bWF4ZmllbGQ7IG4rKykKLQkJa2ZyZWUocmVwb3J0LT5maWVsZFtuXSk7Ci0Ja2ZyZWUocmVwb3J0KTsKLX0KLQotLyoKLSAqIEZyZWUgYSBkZXZpY2Ugc3RydWN0dXJlLCBhbGwgcmVwb3J0cywgYW5kIGFsbCBmaWVsZHMuCi0gKi8KLQotc3RhdGljIHZvaWQgaGlkX2ZyZWVfZGV2aWNlKHN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UpCi17Ci0JdW5zaWduZWQgaSxqOwotCi0JZm9yIChpID0gMDsgaSA8IEhJRF9SRVBPUlRfVFlQRVM7IGkrKykgewotCQlzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtICpyZXBvcnRfZW51bSA9IGRldmljZS0+cmVwb3J0X2VudW0gKyBpOwotCi0JCWZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgewotCQkJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCA9IHJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtqXTsKLQkJCWlmIChyZXBvcnQpCi0JCQkJaGlkX2ZyZWVfcmVwb3J0KHJlcG9ydCk7Ci0JCX0KLQl9Ci0KLQlrZnJlZShkZXZpY2UtPnJkZXNjKTsKLQlrZnJlZShkZXZpY2UpOwotfQotCi0vKgotICogRmV0Y2ggYSByZXBvcnQgZGVzY3JpcHRpb24gaXRlbSBmcm9tIHRoZSBkYXRhIHN0cmVhbS4gV2Ugc3VwcG9ydCBsb25nCi0gKiBpdGVtcywgdGhvdWdoIHRoZXkgYXJlIG5vdCB1c2VkIHlldC4KLSAqLwotCi1zdGF0aWMgdTggKmZldGNoX2l0ZW0oX191OCAqc3RhcnQsIF9fdTggKmVuZCwgc3RydWN0IGhpZF9pdGVtICppdGVtKQotewotCXU4IGI7Ci0KLQlpZiAoKGVuZCAtIHN0YXJ0KSA8PSAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWIgPSAqc3RhcnQrKzsKLQotCWl0ZW0tPnR5cGUgPSAoYiA+PiAyKSAmIDM7Ci0JaXRlbS0+dGFnICA9IChiID4+IDQpICYgMTU7Ci0KLQlpZiAoaXRlbS0+dGFnID09IEhJRF9JVEVNX1RBR19MT05HKSB7Ci0KLQkJaXRlbS0+Zm9ybWF0ID0gSElEX0lURU1fRk9STUFUX0xPTkc7Ci0KLQkJaWYgKChlbmQgLSBzdGFydCkgPCAyKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJaXRlbS0+c2l6ZSA9ICpzdGFydCsrOwotCQlpdGVtLT50YWcgID0gKnN0YXJ0Kys7Ci0KLQkJaWYgKChlbmQgLSBzdGFydCkgPCBpdGVtLT5zaXplKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJaXRlbS0+ZGF0YS5sb25nZGF0YSA9IHN0YXJ0OwotCQlzdGFydCArPSBpdGVtLT5zaXplOwotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JaXRlbS0+Zm9ybWF0ID0gSElEX0lURU1fRk9STUFUX1NIT1JUOwotCWl0ZW0tPnNpemUgPSBiICYgMzsKLQotCXN3aXRjaCAoaXRlbS0+c2l6ZSkgewotCi0JCWNhc2UgMDoKLQkJCXJldHVybiBzdGFydDsKLQotCQljYXNlIDE6Ci0JCQlpZiAoKGVuZCAtIHN0YXJ0KSA8IDEpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpdGVtLT5kYXRhLnU4ID0gKnN0YXJ0Kys7Ci0JCQlyZXR1cm4gc3RhcnQ7Ci0KLQkJY2FzZSAyOgotCQkJaWYgKChlbmQgLSBzdGFydCkgPCAyKQotCQkJCXJldHVybiBOVUxMOwotCQkJaXRlbS0+ZGF0YS51MTYgPSBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlMTYqKXN0YXJ0KSk7Ci0JCQlzdGFydCA9IChfX3U4ICopKChfX2xlMTYgKilzdGFydCArIDEpOwotCQkJcmV0dXJuIHN0YXJ0OwotCi0JCWNhc2UgMzoKLQkJCWl0ZW0tPnNpemUrKzsKLQkJCWlmICgoZW5kIC0gc3RhcnQpIDwgNCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWl0ZW0tPmRhdGEudTMyID0gbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19sZTMyKilzdGFydCkpOwotCQkJc3RhcnQgPSAoX191OCAqKSgoX19sZTMyICopc3RhcnQgKyAxKTsKLQkJCXJldHVybiBzdGFydDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIFBhcnNlIGEgcmVwb3J0IGRlc2NyaXB0aW9uIGludG8gYSBoaWRfZGV2aWNlIHN0cnVjdHVyZS4gUmVwb3J0cyBhcmUKLSAqIGVudW1lcmF0ZWQsIGZpZWxkcyBhcmUgYXR0YWNoZWQgdG8gdGhlc2UgcmVwb3J0cy4KLSAqLwotCi1zdGF0aWMgc3RydWN0IGhpZF9kZXZpY2UgKmhpZF9wYXJzZV9yZXBvcnQoX191OCAqc3RhcnQsIHVuc2lnbmVkIHNpemUpCi17Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmRldmljZTsKLQlzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyOwotCXN0cnVjdCBoaWRfaXRlbSBpdGVtOwotCV9fdTggKmVuZDsKLQl1bnNpZ25lZCBpOwotCXN0YXRpYyBpbnQgKCpkaXNwYXRjaF90eXBlW10pKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsCi0JCQkJICAgICAgc3RydWN0IGhpZF9pdGVtICppdGVtKSA9IHsKLQkJaGlkX3BhcnNlcl9tYWluLAotCQloaWRfcGFyc2VyX2dsb2JhbCwKLQkJaGlkX3BhcnNlcl9sb2NhbCwKLQkJaGlkX3BhcnNlcl9yZXNlcnZlZAotCX07Ci0KLQlpZiAoIShkZXZpY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2RldmljZSksIEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIShkZXZpY2UtPmNvbGxlY3Rpb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24pICoKLQkJCQkgICBISURfREVGQVVMVF9OVU1fQ09MTEVDVElPTlMsIEdGUF9LRVJORUwpKSkgewotCQlrZnJlZShkZXZpY2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGV2aWNlLT5jb2xsZWN0aW9uX3NpemUgPSBISURfREVGQVVMVF9OVU1fQ09MTEVDVElPTlM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSElEX1JFUE9SVF9UWVBFUzsgaSsrKQotCQlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5yZXBvcnRfZW51bVtpXS5yZXBvcnRfbGlzdCk7Ci0KLQlpZiAoIShkZXZpY2UtPnJkZXNjID0gKF9fdTggKilrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkgewotCQlrZnJlZShkZXZpY2UtPmNvbGxlY3Rpb24pOwotCQlrZnJlZShkZXZpY2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtY3B5KGRldmljZS0+cmRlc2MsIHN0YXJ0LCBzaXplKTsKLQlkZXZpY2UtPnJzaXplID0gc2l6ZTsKLQotCWlmICghKHBhcnNlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfcGFyc2VyKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCWtmcmVlKGRldmljZS0+cmRlc2MpOwotCQlrZnJlZShkZXZpY2UtPmNvbGxlY3Rpb24pOwotCQlrZnJlZShkZXZpY2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGFyc2VyLT5kZXZpY2UgPSBkZXZpY2U7Ci0KLQllbmQgPSBzdGFydCArIHNpemU7Ci0Jd2hpbGUgKChzdGFydCA9IGZldGNoX2l0ZW0oc3RhcnQsIGVuZCwgJml0ZW0pKSAhPSBOVUxMKSB7Ci0KLQkJaWYgKGl0ZW0uZm9ybWF0ICE9IEhJRF9JVEVNX0ZPUk1BVF9TSE9SVCkgewotCQkJZGJnKCJ1bmV4cGVjdGVkIGxvbmcgZ2xvYmFsIGl0ZW0iKTsKLQkJCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7Ci0JCQloaWRfZnJlZV9kZXZpY2UoZGV2aWNlKTsKLQkJCWtmcmVlKHBhcnNlcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCWlmIChkaXNwYXRjaF90eXBlW2l0ZW0udHlwZV0ocGFyc2VyLCAmaXRlbSkpIHsKLQkJCWRiZygiaXRlbSAldSAldSAldSAldSBwYXJzaW5nIGZhaWxlZFxuIiwKLQkJCQlpdGVtLmZvcm1hdCwgKHVuc2lnbmVkKWl0ZW0uc2l6ZSwgKHVuc2lnbmVkKWl0ZW0udHlwZSwgKHVuc2lnbmVkKWl0ZW0udGFnKTsKLQkJCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7Ci0JCQloaWRfZnJlZV9kZXZpY2UoZGV2aWNlKTsKLQkJCWtmcmVlKHBhcnNlcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCWlmIChzdGFydCA9PSBlbmQpIHsKLQkJCWlmIChwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tfcHRyKSB7Ci0JCQkJZGJnKCJ1bmJhbGFuY2VkIGNvbGxlY3Rpb24gYXQgZW5kIG9mIHJlcG9ydCBkZXNjcmlwdGlvbiIpOwotCQkJCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7Ci0JCQkJaGlkX2ZyZWVfZGV2aWNlKGRldmljZSk7Ci0JCQkJa2ZyZWUocGFyc2VyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWlmIChwYXJzZXItPmxvY2FsLmRlbGltaXRlcl9kZXB0aCkgewotCQkJCWRiZygidW5iYWxhbmNlZCBkZWxpbWl0ZXIgYXQgZW5kIG9mIHJlcG9ydCBkZXNjcmlwdGlvbiIpOwotCQkJCWtmcmVlKGRldmljZS0+Y29sbGVjdGlvbik7Ci0JCQkJaGlkX2ZyZWVfZGV2aWNlKGRldmljZSk7Ci0JCQkJa2ZyZWUocGFyc2VyKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWtmcmVlKHBhcnNlcik7Ci0JCQlyZXR1cm4gZGV2aWNlOwotCQl9Ci0JfQotCi0JZGJnKCJpdGVtIGZldGNoaW5nIGZhaWxlZCBhdCBvZmZzZXQgJWRcbiIsIChpbnQpKGVuZCAtIHN0YXJ0KSk7Ci0Ja2ZyZWUoZGV2aWNlLT5jb2xsZWN0aW9uKTsKLQloaWRfZnJlZV9kZXZpY2UoZGV2aWNlKTsKLQlrZnJlZShwYXJzZXIpOwotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogQ29udmVydCBhIHNpZ25lZCBuLWJpdCBpbnRlZ2VyIHRvIHNpZ25lZCAzMi1iaXQgaW50ZWdlci4gQ29tbW9uCi0gKiBjYXNlcyBhcmUgZG9uZSB0aHJvdWdoIHRoZSBjb21waWxlciwgdGhlIHNjcmV3ZWQgdGhpbmdzIGhhcyB0byBiZQotICogZG9uZSBieSBoYW5kLgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fczMyIHNudG8zMihfX3UzMiB2YWx1ZSwgdW5zaWduZWQgbikKLXsKLQlzd2l0Y2ggKG4pIHsKLQkJY2FzZSA4OiAgcmV0dXJuICgoX19zOCl2YWx1ZSk7Ci0JCWNhc2UgMTY6IHJldHVybiAoKF9fczE2KXZhbHVlKTsKLQkJY2FzZSAzMjogcmV0dXJuICgoX19zMzIpdmFsdWUpOwotCX0KLQlyZXR1cm4gdmFsdWUgJiAoMSA8PCAobiAtIDEpKSA/IHZhbHVlIHwgKC0xIDw8IG4pIDogdmFsdWU7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHRvIGEgc2lnbmVkIG4tYml0IGludGVnZXIuCi0gKi8KLQotc3RhdGljIF9faW5saW5lX18gX191MzIgczMydG9uKF9fczMyIHZhbHVlLCB1bnNpZ25lZCBuKQotewotCV9fczMyIGEgPSB2YWx1ZSA+PiAobiAtIDEpOwotCWlmIChhICYmIGEgIT0gLTEpCi0JCXJldHVybiB2YWx1ZSA8IDAgPyAxIDw8IChuIC0gMSkgOiAoMSA8PCAobiAtIDEpKSAtIDE7Ci0JcmV0dXJuIHZhbHVlICYgKCgxIDw8IG4pIC0gMSk7Ci19Ci0KLS8qCi0gKiBFeHRyYWN0L2ltcGxlbWVudCBhIGRhdGEgZmllbGQgZnJvbS90byBhIHJlcG9ydC4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBleHRyYWN0KF9fdTggKnJlcG9ydCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuKQotewotCXJlcG9ydCArPSAob2Zmc2V0ID4+IDUpIDw8IDI7IG9mZnNldCAmPSAzMTsKLQlyZXR1cm4gKGxlNjRfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGU2NCopcmVwb3J0KSkgPj4gb2Zmc2V0KSAmICgoMVVMTCA8PCBuKSAtIDEpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGltcGxlbWVudChfX3U4ICpyZXBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbiwgX191MzIgdmFsdWUpCi17Ci0JcmVwb3J0ICs9IChvZmZzZXQgPj4gNSkgPDwgMjsgb2Zmc2V0ICY9IDMxOwotCXB1dF91bmFsaWduZWQoKGdldF91bmFsaWduZWQoKF9fbGU2NCopcmVwb3J0KQotCQkmIGNwdV90b19sZTY0KH4oKCgoX191NjQpIDEgPDwgbikgLSAxKSA8PCBvZmZzZXQpKSkKLQkJfCBjcHVfdG9fbGU2NCgoX191NjQpdmFsdWUgPDwgb2Zmc2V0KSwgKF9fbGU2NCopcmVwb3J0KTsKLX0KLQotLyoKLSAqIFNlYXJjaCBhbiBhcnJheSBmb3IgYSB2YWx1ZS4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgc2VhcmNoKF9fczMyICphcnJheSwgX19zMzIgdmFsdWUsIHVuc2lnbmVkIG4pCi17Ci0Jd2hpbGUgKG4tLSkgewotCQlpZiAoKmFycmF5KysgPT0gdmFsdWUpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCBoaWRfcHJvY2Vzc19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlLCBpbnQgaW50ZXJydXB0KQotewotCWhpZF9kdW1wX2lucHV0KHVzYWdlLCB2YWx1ZSk7Ci0JaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQotCQloaWRpbnB1dF9oaWRfZXZlbnQoaGlkLCBmaWVsZCwgdXNhZ2UsIHZhbHVlKTsKLQlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWICYmIGludGVycnVwdCkKLQkJaGlkZGV2X2hpZF9ldmVudChoaWQsIGZpZWxkLCB1c2FnZSwgdmFsdWUpOwotfQotCi0vKgotICogQW5hbHlzZSBhIHJlY2VpdmVkIGZpZWxkLCBhbmQgZmV0Y2ggdGhlIGRhdGEgZnJvbSBpdC4gVGhlIGZpZWxkCi0gKiBjb250ZW50IGlzIHN0b3JlZCBmb3IgbmV4dCByZXBvcnQgcHJvY2Vzc2luZyAod2UgZG8gZGlmZmVyZW50aWFsCi0gKiByZXBvcnRpbmcgdG8gdGhlIGxheWVyKS4KLSAqLwotCi1zdGF0aWMgdm9pZCBoaWRfaW5wdXRfZmllbGQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIF9fdTggKmRhdGEsIGludCBpbnRlcnJ1cHQpCi17Ci0JdW5zaWduZWQgbjsKLQl1bnNpZ25lZCBjb3VudCA9IGZpZWxkLT5yZXBvcnRfY291bnQ7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gZmllbGQtPnJlcG9ydF9vZmZzZXQ7Ci0JdW5zaWduZWQgc2l6ZSA9IGZpZWxkLT5yZXBvcnRfc2l6ZTsKLQlfX3MzMiBtaW4gPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtOwotCV9fczMyIG1heCA9IGZpZWxkLT5sb2dpY2FsX21heGltdW07Ci0JX19zMzIgKnZhbHVlOwotCi0JaWYgKCEodmFsdWUgPSBrbWFsbG9jKHNpemVvZihfX3MzMikgKiBjb3VudCwgR0ZQX0FUT01JQykpKQotCQlyZXR1cm47Ci0KLQlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgewotCi0JCQl2YWx1ZVtuXSA9IG1pbiA8IDAgPyBzbnRvMzIoZXh0cmFjdChkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSksIHNpemUpIDoKLQkJCQkJCSAgICBleHRyYWN0KGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplKTsKLQotCQkJaWYgKCEoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9WQVJJQUJMRSkgLyogSWdub3JlIHJlcG9ydCBpZiBFcnJvclJvbGxPdmVyICovCi0JCQkgICAgJiYgdmFsdWVbbl0gPj0gbWluICYmIHZhbHVlW25dIDw9IG1heAotCQkJICAgICYmIGZpZWxkLT51c2FnZVt2YWx1ZVtuXSAtIG1pbl0uaGlkID09IEhJRF9VUF9LRVlCT0FSRCArIDEpCi0JCQkJZ290byBleGl0OwotCX0KLQotCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7Ci0KLQkJaWYgKEhJRF9NQUlOX0lURU1fVkFSSUFCTEUgJiBmaWVsZC0+ZmxhZ3MpIHsKLQkJCWhpZF9wcm9jZXNzX2V2ZW50KGhpZCwgZmllbGQsICZmaWVsZC0+dXNhZ2Vbbl0sIHZhbHVlW25dLCBpbnRlcnJ1cHQpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoZmllbGQtPnZhbHVlW25dID49IG1pbiAmJiBmaWVsZC0+dmFsdWVbbl0gPD0gbWF4Ci0JCQkmJiBmaWVsZC0+dXNhZ2VbZmllbGQtPnZhbHVlW25dIC0gbWluXS5oaWQKLQkJCSYmIHNlYXJjaCh2YWx1ZSwgZmllbGQtPnZhbHVlW25dLCBjb3VudCkpCi0JCQkJaGlkX3Byb2Nlc3NfZXZlbnQoaGlkLCBmaWVsZCwgJmZpZWxkLT51c2FnZVtmaWVsZC0+dmFsdWVbbl0gLSBtaW5dLCAwLCBpbnRlcnJ1cHQpOwotCi0JCWlmICh2YWx1ZVtuXSA+PSBtaW4gJiYgdmFsdWVbbl0gPD0gbWF4Ci0JCQkmJiBmaWVsZC0+dXNhZ2VbdmFsdWVbbl0gLSBtaW5dLmhpZAotCQkJJiYgc2VhcmNoKGZpZWxkLT52YWx1ZSwgdmFsdWVbbl0sIGNvdW50KSkKLQkJCQloaWRfcHJvY2Vzc19ldmVudChoaWQsIGZpZWxkLCAmZmllbGQtPnVzYWdlW3ZhbHVlW25dIC0gbWluXSwgMSwgaW50ZXJydXB0KTsKLQl9Ci0KLQltZW1jcHkoZmllbGQtPnZhbHVlLCB2YWx1ZSwgY291bnQgKiBzaXplb2YoX19zMzIpKTsKLWV4aXQ6Ci0Ja2ZyZWUodmFsdWUpOwotfQotCi1zdGF0aWMgaW50IGhpZF9pbnB1dF9yZXBvcnQoaW50IHR5cGUsIHN0cnVjdCB1cmIgKnVyYiwgaW50IGludGVycnVwdCkKLXsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gKnJlcG9ydF9lbnVtID0gaGlkLT5yZXBvcnRfZW51bSArIHR5cGU7Ci0JdTggKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQlpbnQgbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Ci0JaW50IG4sIHNpemU7Ci0KLQlpZiAoIWxlbikgewotCQlkYmcoImVtcHR5IHJlcG9ydCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0jaWZkZWYgREVCVUdfREFUQQotCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IHJlcG9ydCAoc2l6ZSAldSkgKCVzbnVtYmVyZWQpXG4iLCBsZW4sIHJlcG9ydF9lbnVtLT5udW1iZXJlZCA/ICIiIDogInVuIik7Ci0jZW5kaWYKLQotCW4gPSAwOwkJCQkvKiBOb3JtYWxseSByZXBvcnQgbnVtYmVyIGlzIDAgKi8KLQlpZiAocmVwb3J0X2VudW0tPm51bWJlcmVkKSB7CS8qIERldmljZSB1c2VzIG51bWJlcmVkIHJlcG9ydHMsIGRhdGFbMF0gaXMgcmVwb3J0IG51bWJlciAqLwotCQluID0gKmRhdGErKzsKLQkJbGVuLS07Ci0JfQotCi0jaWZkZWYgREVCVUdfREFUQQotCXsKLQkJaW50IGk7Ci0JCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IHJlcG9ydCAlZCAoc2l6ZSAldSkgPSAiLCBuLCBsZW4pOwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQlwcmludGsoIiAlMDJ4IiwgZGF0YVtpXSk7Ci0JCXByaW50aygiXG4iKTsKLQl9Ci0jZW5kaWYKLQotCWlmICghKHJlcG9ydCA9IHJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtuXSkpIHsKLQkJZGJnKCJ1bmRlZmluZWQgcmVwb3J0X2lkICVkIHJlY2VpdmVkIiwgbik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzaXplID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDE7Ci0KLQlpZiAobGVuIDwgc2l6ZSkgewotCQlkYmcoInJlcG9ydCAlZCBpcyB0b28gc2hvcnQsICglZCA8ICVkKSIsIHJlcG9ydC0+aWQsIGxlbiwgc2l6ZSk7Ci0JCW1lbXNldChkYXRhICsgbGVuLCAwLCBzaXplIC0gbGVuKTsKLQl9Ci0KLQlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWKQotCQloaWRkZXZfcmVwb3J0X2V2ZW50KGhpZCwgcmVwb3J0KTsKLQotCWZvciAobiA9IDA7IG4gPCByZXBvcnQtPm1heGZpZWxkOyBuKyspCi0JCWhpZF9pbnB1dF9maWVsZChoaWQsIHJlcG9ydC0+ZmllbGRbbl0sIGRhdGEsIGludGVycnVwdCk7Ci0KLQlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpCi0JCWhpZGlucHV0X3JlcG9ydF9ldmVudChoaWQsIHJlcG9ydCk7Ci0KLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyBpbnQgdXNiaGlkX3BiX2ZubW9kZSA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQocGJfZm5tb2RlLCB1c2JoaWRfcGJfZm5tb2RlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhwYl9mbm1vZGUsCisJCSJNb2RlIG9mIGZuIGtleSBvbiBQb3dlckJvb2tzICgwID0gZGlzYWJsZWQsIDEgPSBma2V5c2xhc3QsIDIgPSBma2V5c2ZpcnN0KSIpOwogCiAvKgogICogSW5wdXQgc3VibWlzc2lvbiBhbmQgSS9PIGVycm9yIGhhbmRsZXIuCkBAIC05MTEsMTUgKzcyLDE2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmMgPSAwOworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhpZC0+aW5sb2NrLCBmbGFncyk7Ci0JaWYgKGhpZC0+b3BlbiA+IDAgJiYgIXRlc3RfYml0KEhJRF9TVVNQRU5ERUQsICZoaWQtPmlvZmwpICYmCi0JCQkhdGVzdF9hbmRfc2V0X2JpdChISURfSU5fUlVOTklORywgJmhpZC0+aW9mbCkpIHsKLQkJcmMgPSB1c2Jfc3VibWl0X3VyYihoaWQtPnVyYmluLCBHRlBfQVRPTUlDKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5pbmxvY2ssIGZsYWdzKTsKKwlpZiAoaGlkLT5vcGVuID4gMCAmJiAhdGVzdF9iaXQoSElEX1NVU1BFTkRFRCwgJnVzYmhpZC0+aW9mbCkgJiYKKwkJCSF0ZXN0X2FuZF9zZXRfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkgeworCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHVzYmhpZC0+dXJiaW4sIEdGUF9BVE9NSUMpOwogCQlpZiAocmMgIT0gMCkKLQkJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJmhpZC0+aW9mbCk7CisJCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoaWQtPmlubG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+aW5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC05MjcsMzcgKzg5LDQ5IEBACiBzdGF0aWMgdm9pZCBoaWRfcmV0cnlfdGltZW91dCh1bnNpZ25lZCBsb25nIF9oaWQpCiB7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IChzdHJ1Y3QgaGlkX2RldmljZSAqKSBfaGlkOworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCi0JZGV2X2RiZygmaGlkLT5pbnRmLT5kZXYsICJyZXRyeWluZyBpbnRyIHVyYlxuIik7CisJZGV2X2RiZygmdXNiaGlkLT5pbnRmLT5kZXYsICJyZXRyeWluZyBpbnRyIHVyYlxuIik7CiAJaWYgKGhpZF9zdGFydF9pbihoaWQpKQogCQloaWRfaW9fZXJyb3IoaGlkKTsKIH0KIAotLyogV29ya3F1ZXVlIHJvdXRpbmUgdG8gcmVzZXQgdGhlIGRldmljZSAqLwotc3RhdGljIHZvaWQgaGlkX3Jlc2V0KHZvaWQgKl9oaWQpCisvKiBXb3JrcXVldWUgcm91dGluZSB0byByZXNldCB0aGUgZGV2aWNlIG9yIGNsZWFyIGEgaGFsdCAqLworc3RhdGljIHZvaWQgaGlkX3Jlc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gKHN0cnVjdCBoaWRfZGV2aWNlICopIF9oaWQ7Ci0JaW50IHJjX2xvY2ssIHJjOworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmhpZF9kZXZpY2UsIHJlc2V0X3dvcmspOworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JoaWQtPmhpZDsKKwlpbnQgcmNfbG9jaywgcmMgPSAwOwogCi0JZGV2X2RiZygmaGlkLT5pbnRmLT5kZXYsICJyZXNldHRpbmcgZGV2aWNlXG4iKTsKLQlyYyA9IHJjX2xvY2sgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KGhpZC0+ZGV2LCBoaWQtPmludGYpOwotCWlmIChyY19sb2NrID49IDApIHsKLQkJcmMgPSB1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZShoaWQtPmRldiwgaGlkLT5pbnRmKTsKLQkJaWYgKHJjX2xvY2spCi0JCQl1c2JfdW5sb2NrX2RldmljZShoaWQtPmRldik7CisJaWYgKHRlc3RfYml0KEhJRF9DTEVBUl9IQUxULCAmdXNiaGlkLT5pb2ZsKSkgeworCQlkZXZfZGJnKCZ1c2JoaWQtPmludGYtPmRldiwgImNsZWFyIGhhbHRcbiIpOworCQlyYyA9IHVzYl9jbGVhcl9oYWx0KHRvX3VzYl9kZXZpY2UoaGlkLT5kZXYpLCB1c2JoaWQtPnVyYmluLT5waXBlKTsKKwkJY2xlYXJfYml0KEhJRF9DTEVBUl9IQUxULCAmdXNiaGlkLT5pb2ZsKTsKKwkJaGlkX3N0YXJ0X2luKGhpZCk7CiAJfQotCWNsZWFyX2JpdChISURfUkVTRVRfUEVORElORywgJmhpZC0+aW9mbCk7CisKKwllbHNlIGlmICh0ZXN0X2JpdChISURfUkVTRVRfUEVORElORywgJnVzYmhpZC0+aW9mbCkpIHsKKwkJZGV2X2RiZygmdXNiaGlkLT5pbnRmLT5kZXYsICJyZXNldHRpbmcgZGV2aWNlXG4iKTsKKwkJcmMgPSByY19sb2NrID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCh0b191c2JfZGV2aWNlKGhpZC0+ZGV2KSwgdXNiaGlkLT5pbnRmKTsKKwkJaWYgKHJjX2xvY2sgPj0gMCkgeworCQkJcmMgPSB1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZSh0b191c2JfZGV2aWNlKGhpZC0+ZGV2KSwgdXNiaGlkLT5pbnRmKTsKKwkJCWlmIChyY19sb2NrKQorCQkJCXVzYl91bmxvY2tfZGV2aWNlKHRvX3VzYl9kZXZpY2UoaGlkLT5kZXYpKTsKKwkJfQorCQljbGVhcl9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpOworCX0KIAogCXN3aXRjaCAocmMpIHsKIAljYXNlIDA6Ci0JCWlmICghdGVzdF9iaXQoSElEX0lOX1JVTk5JTkcsICZoaWQtPmlvZmwpKQorCQlpZiAoIXRlc3RfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkKIAkJCWhpZF9pb19lcnJvcihoaWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIoImNhbid0IHJlc2V0IGRldmljZSwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkIiwKLQkJCQloaWQtPmRldi0+YnVzLT5idXNfbmFtZSwKLQkJCQloaWQtPmRldi0+ZGV2cGF0aCwKLQkJCQloaWQtPmlmbnVtLCByYyk7CisJCQkJdG9fdXNiX2RldmljZShoaWQtPmRldiktPmJ1cy0+YnVzX25hbWUsCisJCQkJdG9fdXNiX2RldmljZShoaWQtPmRldiktPmRldnBhdGgsCisJCQkJdXNiaGlkLT5pZm51bSwgcmMpOwogCQkvKiBGQUxMVEhST1VHSCAqLwogCWNhc2UgLUVIT1NUVU5SRUFDSDoKIAljYXNlIC1FTk9ERVY6CkBAIC05NzAsMzQgKzE0NCwzNCBAQAogc3RhdGljIHZvaWQgaGlkX2lvX2Vycm9yKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZoaWQtPmlubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPmlubG9jaywgZmxhZ3MpOwogCiAJLyogU3RvcCB3aGVuIGRpc2Nvbm5lY3RlZCAqLwotCWlmICh1c2JfZ2V0X2ludGZkYXRhKGhpZC0+aW50ZikgPT0gTlVMTCkKKwlpZiAodXNiX2dldF9pbnRmZGF0YSh1c2JoaWQtPmludGYpID09IE5VTEwpCiAJCWdvdG8gZG9uZTsKIAogCS8qIFdoZW4gYW4gZXJyb3Igb2NjdXJzLCByZXRyeSBhdCBpbmNyZWFzaW5nIGludGVydmFscyAqLwotCWlmIChoaWQtPnJldHJ5X2RlbGF5ID09IDApIHsKLQkJaGlkLT5yZXRyeV9kZWxheSA9IDEzOwkvKiBUaGVuIDI2LCA1MiwgMTA0LCAxMDQsIC4uLiAqLwotCQloaWQtPnN0b3BfcmV0cnkgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKLQl9IGVsc2UgaWYgKGhpZC0+cmV0cnlfZGVsYXkgPCAxMDApCi0JCWhpZC0+cmV0cnlfZGVsYXkgKj0gMjsKKwlpZiAodXNiaGlkLT5yZXRyeV9kZWxheSA9PSAwKSB7CisJCXVzYmhpZC0+cmV0cnlfZGVsYXkgPSAxMzsJLyogVGhlbiAyNiwgNTIsIDEwNCwgMTA0LCAuLi4gKi8KKwkJdXNiaGlkLT5zdG9wX3JldHJ5ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJfSBlbHNlIGlmICh1c2JoaWQtPnJldHJ5X2RlbGF5IDwgMTAwKQorCQl1c2JoaWQtPnJldHJ5X2RlbGF5ICo9IDI7CiAKLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBoaWQtPnN0b3BfcmV0cnkpKSB7CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdXNiaGlkLT5zdG9wX3JldHJ5KSkgewogCiAJCS8qIFJldHJpZXMgZmFpbGVkLCBzbyBkbyBhIHBvcnQgcmVzZXQgKi8KLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmaGlkLT5pb2ZsKSkgewotCQkJaWYgKHNjaGVkdWxlX3dvcmsoJmhpZC0+cmVzZXRfd29yaykpCi0JCQkJZ290byBkb25lOwotCQkJY2xlYXJfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmaGlkLT5pb2ZsKTsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmdXNiaGlkLT5pb2ZsKSkgeworCQkJc2NoZWR1bGVfd29yaygmdXNiaGlkLT5yZXNldF93b3JrKTsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCX0KIAotCW1vZF90aW1lcigmaGlkLT5pb19yZXRyeSwKLQkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGhpZC0+cmV0cnlfZGVsYXkpKTsKKwltb2RfdGltZXIoJnVzYmhpZC0+aW9fcmV0cnksCisJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh1c2JoaWQtPnJldHJ5X2RlbGF5KSk7CiBkb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhpZC0+aW5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5pbmxvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTEwMDcsMTA0ICsxODEsNTEgQEAKIHN0YXRpYyB2b2lkIGhpZF9pcnFfaW4oc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBoaWRfZGV2aWNlCSpoaWQgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgCSp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCWludAkJCXN0YXR1czsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAkJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KLQkJCWhpZC0+cmV0cnlfZGVsYXkgPSAwOwotCQkJaGlkX2lucHV0X3JlcG9ydChISURfSU5QVVRfUkVQT1JULCB1cmIsIDEpOworCQkJdXNiaGlkLT5yZXRyeV9kZWxheSA9IDA7CisJCQloaWRfaW5wdXRfcmVwb3J0KHVyYi0+Y29udGV4dCwgSElEX0lOUFVUX1JFUE9SVCwKKwkJCQkJIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoLCAxKTsKIAkJCWJyZWFrOworCQljYXNlIC1FUElQRToJCS8qIHN0YWxsICovCisJCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCQkJc2V0X2JpdChISURfQ0xFQVJfSEFMVCwgJnVzYmhpZC0+aW9mbCk7CisJCQlzY2hlZHVsZV93b3JrKCZ1c2JoaWQtPnJlc2V0X3dvcmspOworCQkJcmV0dXJuOwogCQljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KIAkJY2FzZSAtRU5PRU5UOgogCQljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLwotCQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmaGlkLT5pb2ZsKTsKKwkJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJnVzYmhpZC0+aW9mbCk7CiAJCQlyZXR1cm47CiAJCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwogCQljYXNlIC1FUFJPVE86CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KIAkJY2FzZSAtRVRJTUU6CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KIAkJY2FzZSAtRVRJTUVET1VUOgkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQuLi4gKi8KLQkJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJmhpZC0+aW9mbCk7CisJCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwogCQkJaGlkX2lvX2Vycm9yKGhpZCk7CiAJCQlyZXR1cm47CiAJCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwogCQkJd2FybigiaW5wdXQgaXJxIHN0YXR1cyAlZCByZWNlaXZlZCIsIHVyYi0+c3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIFNMQUJfQVRPTUlDKTsKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKLQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmaGlkLT5pb2ZsKTsKKwkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAkJaWYgKHN0YXR1cyAhPSAtRVBFUk0pIHsKIAkJCWVycigiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkIiwKLQkJCQkJaGlkLT5kZXYtPmJ1cy0+YnVzX25hbWUsCi0JCQkJCWhpZC0+ZGV2LT5kZXZwYXRoLAotCQkJCQloaWQtPmlmbnVtLCBzdGF0dXMpOworCQkJCQl0b191c2JfZGV2aWNlKGhpZC0+ZGV2KS0+YnVzLT5idXNfbmFtZSwKKwkJCQkJdG9fdXNiX2RldmljZShoaWQtPmRldiktPmRldnBhdGgsCisJCQkJCXVzYmhpZC0+aWZudW0sIHN0YXR1cyk7CiAJCQloaWRfaW9fZXJyb3IoaGlkKTsKIAkJfQogCX0KIH0KIAogLyoKLSAqIE91dHB1dCB0aGUgZmllbGQgaW50byB0aGUgcmVwb3J0LgotICovCi0KLXN0YXRpYyB2b2lkIGhpZF9vdXRwdXRfZmllbGQoc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIF9fdTggKmRhdGEpCi17Ci0JdW5zaWduZWQgY291bnQgPSBmaWVsZC0+cmVwb3J0X2NvdW50OwotCXVuc2lnbmVkIG9mZnNldCA9IGZpZWxkLT5yZXBvcnRfb2Zmc2V0OwotCXVuc2lnbmVkIHNpemUgPSBmaWVsZC0+cmVwb3J0X3NpemU7Ci0JdW5zaWduZWQgbjsKLQotCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7Ci0JCWlmIChmaWVsZC0+bG9naWNhbF9taW5pbXVtIDwgMCkJLyogc2lnbmVkIHZhbHVlcyAqLwotCQkJaW1wbGVtZW50KGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplLCBzMzJ0b24oZmllbGQtPnZhbHVlW25dLCBzaXplKSk7Ci0JCWVsc2UJCQkJLyogdW5zaWduZWQgdmFsdWVzICovCi0JCQlpbXBsZW1lbnQoZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUsIGZpZWxkLT52YWx1ZVtuXSk7Ci0JfQotfQotCi0vKgotICogQ3JlYXRlIGEgcmVwb3J0LgotICovCi0KLXN0YXRpYyB2b2lkIGhpZF9vdXRwdXRfcmVwb3J0KHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsIF9fdTggKmRhdGEpCi17Ci0JdW5zaWduZWQgbjsKLQotCWlmIChyZXBvcnQtPmlkID4gMCkKLQkJKmRhdGErKyA9IHJlcG9ydC0+aWQ7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgcmVwb3J0LT5tYXhmaWVsZDsgbisrKQotCQloaWRfb3V0cHV0X2ZpZWxkKHJlcG9ydC0+ZmllbGRbbl0sIGRhdGEpOwotfQotCi0vKgotICogU2V0IGEgZmllbGQgdmFsdWUuIFRoZSByZXBvcnQgdGhpcyBmaWVsZCBiZWxvbmdzIHRvIGhhcyB0byBiZQotICogY3JlYXRlZCBhbmQgdHJhbnNmZXJyZWQgdG8gdGhlIGRldmljZSwgdG8gc2V0IHRoaXMgdmFsdWUgaW4gdGhlCi0gKiBkZXZpY2UuCi0gKi8KLQotaW50IGhpZF9zZXRfZmllbGQoc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHVuc2lnbmVkIG9mZnNldCwgX19zMzIgdmFsdWUpCi17Ci0JdW5zaWduZWQgc2l6ZSA9IGZpZWxkLT5yZXBvcnRfc2l6ZTsKLQotCWhpZF9kdW1wX2lucHV0KGZpZWxkLT51c2FnZSArIG9mZnNldCwgdmFsdWUpOwotCi0JaWYgKG9mZnNldCA+PSBmaWVsZC0+cmVwb3J0X2NvdW50KSB7Ci0JCWRiZygib2Zmc2V0ICglZCkgZXhjZWVkcyByZXBvcnRfY291bnQgKCVkKSIsIG9mZnNldCwgZmllbGQtPnJlcG9ydF9jb3VudCk7Ci0JCWhpZF9kdW1wX2ZpZWxkKGZpZWxkLCA4KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoZmllbGQtPmxvZ2ljYWxfbWluaW11bSA8IDApIHsKLQkJaWYgKHZhbHVlICE9IHNudG8zMihzMzJ0b24odmFsdWUsIHNpemUpLCBzaXplKSkgewotCQkJZGJnKCJ2YWx1ZSAlZCBpcyBvdXQgb2YgcmFuZ2UiLCB2YWx1ZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZmllbGQtPnZhbHVlW29mZnNldF0gPSB2YWx1ZTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIEZpbmQgYSByZXBvcnQgZmllbGQgd2l0aCBhIHNwZWNpZmllZCBISUQgdXNhZ2UuCiAgKi8KICNpZiAwCkBAIC0xMTI0LDE2ICsyNDUsMTcgQEAKIHN0YXRpYyBpbnQgaGlkX3N1Ym1pdF9vdXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCi0JcmVwb3J0ID0gaGlkLT5vdXRbaGlkLT5vdXR0YWlsXTsKKwlyZXBvcnQgPSB1c2JoaWQtPm91dFt1c2JoaWQtPm91dHRhaWxdOwogCi0JaGlkX291dHB1dF9yZXBvcnQocmVwb3J0LCBoaWQtPm91dGJ1Zik7Ci0JaGlkLT51cmJvdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAoKHJlcG9ydC0+c2l6ZSAtIDEpID4+IDMpICsgMSArIChyZXBvcnQtPmlkID4gMCk7Ci0JaGlkLT51cmJvdXQtPmRldiA9IGhpZC0+ZGV2OworCWhpZF9vdXRwdXRfcmVwb3J0KHJlcG9ydCwgdXNiaGlkLT5vdXRidWYpOworCXVzYmhpZC0+dXJib3V0LT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKyAocmVwb3J0LT5pZCA+IDApOworCXVzYmhpZC0+dXJib3V0LT5kZXYgPSB0b191c2JfZGV2aWNlKGhpZC0+ZGV2KTsKIAogCWRiZygic3VibWl0dGluZyBvdXQgdXJiIik7CiAKLQlpZiAodXNiX3N1Ym1pdF91cmIoaGlkLT51cmJvdXQsIEdGUF9BVE9NSUMpKSB7CisJaWYgKHVzYl9zdWJtaXRfdXJiKHVzYmhpZC0+dXJib3V0LCBHRlBfQVRPTUlDKSkgewogCQllcnIoInVzYl9zdWJtaXRfdXJiKG91dCkgZmFpbGVkIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xMTQ2LDQyICsyNjgsNDMgQEAKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwogCXVuc2lnbmVkIGNoYXIgZGlyOwogCWludCBsZW47CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAKLQlyZXBvcnQgPSBoaWQtPmN0cmxbaGlkLT5jdHJsdGFpbF0ucmVwb3J0OwotCWRpciA9IGhpZC0+Y3RybFtoaWQtPmN0cmx0YWlsXS5kaXI7CisJcmVwb3J0ID0gdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybHRhaWxdLnJlcG9ydDsKKwlkaXIgPSB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0uZGlyOwogCiAJbGVuID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKyAocmVwb3J0LT5pZCA+IDApOwogCWlmIChkaXIgPT0gVVNCX0RJUl9PVVQpIHsKLQkJaGlkX291dHB1dF9yZXBvcnQocmVwb3J0LCBoaWQtPmN0cmxidWYpOwotCQloaWQtPnVyYmN0cmwtPnBpcGUgPSB1c2Jfc25kY3RybHBpcGUoaGlkLT5kZXYsIDApOwotCQloaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBsZW47CisJCWhpZF9vdXRwdXRfcmVwb3J0KHJlcG9ydCwgdXNiaGlkLT5jdHJsYnVmKTsKKwkJdXNiaGlkLT51cmJjdHJsLT5waXBlID0gdXNiX3NuZGN0cmxwaXBlKHRvX3VzYl9kZXZpY2UoaGlkLT5kZXYpLCAwKTsKKwkJdXNiaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbGVuOwogCX0gZWxzZSB7CiAJCWludCBtYXhwYWNrZXQsIHBhZGxlbjsKIAotCQloaWQtPnVyYmN0cmwtPnBpcGUgPSB1c2JfcmN2Y3RybHBpcGUoaGlkLT5kZXYsIDApOwotCQltYXhwYWNrZXQgPSB1c2JfbWF4cGFja2V0KGhpZC0+ZGV2LCBoaWQtPnVyYmN0cmwtPnBpcGUsIDApOworCQl1c2JoaWQtPnVyYmN0cmwtPnBpcGUgPSB1c2JfcmN2Y3RybHBpcGUodG9fdXNiX2RldmljZShoaWQtPmRldiksIDApOworCQltYXhwYWNrZXQgPSB1c2JfbWF4cGFja2V0KHRvX3VzYl9kZXZpY2UoaGlkLT5kZXYpLCB1c2JoaWQtPnVyYmN0cmwtPnBpcGUsIDApOwogCQlpZiAobWF4cGFja2V0ID4gMCkgewogCQkJcGFkbGVuID0gKGxlbiArIG1heHBhY2tldCAtIDEpIC8gbWF4cGFja2V0OwogCQkJcGFkbGVuICo9IG1heHBhY2tldDsKLQkJCWlmIChwYWRsZW4gPiBoaWQtPmJ1ZnNpemUpCi0JCQkJcGFkbGVuID0gaGlkLT5idWZzaXplOworCQkJaWYgKHBhZGxlbiA+IHVzYmhpZC0+YnVmc2l6ZSkKKwkJCQlwYWRsZW4gPSB1c2JoaWQtPmJ1ZnNpemU7CiAJCX0gZWxzZQogCQkJcGFkbGVuID0gMDsKLQkJaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gcGFkbGVuOworCQl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwYWRsZW47CiAJfQotCWhpZC0+dXJiY3RybC0+ZGV2ID0gaGlkLT5kZXY7CisJdXNiaGlkLT51cmJjdHJsLT5kZXYgPSB0b191c2JfZGV2aWNlKGhpZC0+ZGV2KTsKIAotCWhpZC0+Y3ItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IGRpcjsKLQloaWQtPmNyLT5iUmVxdWVzdCA9IChkaXIgPT0gVVNCX0RJUl9PVVQpID8gSElEX1JFUV9TRVRfUkVQT1JUIDogSElEX1JFUV9HRVRfUkVQT1JUOwotCWhpZC0+Y3ItPndWYWx1ZSA9IGNwdV90b19sZTE2KCgocmVwb3J0LT50eXBlICsgMSkgPDwgOCkgfCByZXBvcnQtPmlkKTsKLQloaWQtPmNyLT53SW5kZXggPSBjcHVfdG9fbGUxNihoaWQtPmlmbnVtKTsKLQloaWQtPmNyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYobGVuKTsKKwl1c2JoaWQtPmNyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBkaXI7CisJdXNiaGlkLT5jci0+YlJlcXVlc3QgPSAoZGlyID09IFVTQl9ESVJfT1VUKSA/IEhJRF9SRVFfU0VUX1JFUE9SVCA6IEhJRF9SRVFfR0VUX1JFUE9SVDsKKwl1c2JoaWQtPmNyLT53VmFsdWUgPSBjcHVfdG9fbGUxNigoKHJlcG9ydC0+dHlwZSArIDEpIDw8IDgpIHwgcmVwb3J0LT5pZCk7CisJdXNiaGlkLT5jci0+d0luZGV4ID0gY3B1X3RvX2xlMTYodXNiaGlkLT5pZm51bSk7CisJdXNiaGlkLT5jci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KGxlbik7CiAKIAlkYmcoInN1Ym1pdHRpbmcgY3RybCB1cmI6ICVzIHdWYWx1ZT0weCUwNHggd0luZGV4PTB4JTA0eCB3TGVuZ3RoPSV1IiwKLQkJaGlkLT5jci0+YlJlcXVlc3QgPT0gSElEX1JFUV9TRVRfUkVQT1JUID8gIlNldF9SZXBvcnQiIDogIkdldF9SZXBvcnQiLAotCQloaWQtPmNyLT53VmFsdWUsIGhpZC0+Y3ItPndJbmRleCwgaGlkLT5jci0+d0xlbmd0aCk7CisJCXVzYmhpZC0+Y3ItPmJSZXF1ZXN0ID09IEhJRF9SRVFfU0VUX1JFUE9SVCA/ICJTZXRfUmVwb3J0IiA6ICJHZXRfUmVwb3J0IiwKKwkJdXNiaGlkLT5jci0+d1ZhbHVlLCB1c2JoaWQtPmNyLT53SW5kZXgsIHVzYmhpZC0+Y3ItPndMZW5ndGgpOwogCi0JaWYgKHVzYl9zdWJtaXRfdXJiKGhpZC0+dXJiY3RybCwgR0ZQX0FUT01JQykpIHsKKwlpZiAodXNiX3N1Ym1pdF91cmIodXNiaGlkLT51cmJjdHJsLCBHRlBfQVRPTUlDKSkgewogCQllcnIoInVzYl9zdWJtaXRfdXJiKGN0cmwpIGZhaWxlZCIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTE5Niw2ICszMTksNyBAQAogc3RhdGljIHZvaWQgaGlkX2lycV9vdXQoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdW5wbHVnID0gMDsKIApAQCAtMTIxMywyNCArMzM3LDI0IEBACiAJCQl3YXJuKCJvdXRwdXQgaXJxIHN0YXR1cyAlZCByZWNlaXZlZCIsIHVyYi0+c3RhdHVzKTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaGlkLT5vdXRsb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOwogCiAJaWYgKHVucGx1ZykKLQkJaGlkLT5vdXR0YWlsID0gaGlkLT5vdXRoZWFkOworCQl1c2JoaWQtPm91dHRhaWwgPSB1c2JoaWQtPm91dGhlYWQ7CiAJZWxzZQotCQloaWQtPm91dHRhaWwgPSAoaGlkLT5vdXR0YWlsICsgMSkgJiAoSElEX09VVFBVVF9GSUZPX1NJWkUgLSAxKTsKKwkJdXNiaGlkLT5vdXR0YWlsID0gKHVzYmhpZC0+b3V0dGFpbCArIDEpICYgKEhJRF9PVVRQVVRfRklGT19TSVpFIC0gMSk7CiAKLQlpZiAoaGlkLT5vdXRoZWFkICE9IGhpZC0+b3V0dGFpbCkgeworCWlmICh1c2JoaWQtPm91dGhlYWQgIT0gdXNiaGlkLT5vdXR0YWlsKSB7CiAJCWlmIChoaWRfc3VibWl0X291dChoaWQpKSB7Ci0JCQljbGVhcl9iaXQoSElEX09VVF9SVU5OSU5HLCAmaGlkLT5pb2ZsKTsKKwkJCWNsZWFyX2JpdChISURfT1VUX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwogCQkJd2FrZV91cCgmaGlkLT53YWl0KTsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoaWQtPm91dGxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKLQljbGVhcl9iaXQoSElEX09VVF9SVU5OSU5HLCAmaGlkLT5pb2ZsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoaWQtPm91dGxvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQoSElEX09VVF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPm91dGxvY2ssIGZsYWdzKTsKIAl3YWtlX3VwKCZoaWQtPndhaXQpOwogfQogCkBAIC0xMjQxLDE1ICszNjUsMTcgQEAKIHN0YXRpYyB2b2lkIGhpZF9jdHJsKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHVucGx1ZyA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaGlkLT5jdHJsbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCi0JCQlpZiAoaGlkLT5jdHJsW2hpZC0+Y3RybHRhaWxdLmRpciA9PSBVU0JfRElSX0lOKQotCQkJCWhpZF9pbnB1dF9yZXBvcnQoaGlkLT5jdHJsW2hpZC0+Y3RybHRhaWxdLnJlcG9ydC0+dHlwZSwgdXJiLCAwKTsKKwkJCWlmICh1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0uZGlyID09IFVTQl9ESVJfSU4pCisJCQkJaGlkX2lucHV0X3JlcG9ydCh1cmItPmNvbnRleHQsIHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5yZXBvcnQtPnR5cGUsCisJCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLwogCQkJdW5wbHVnID0gMTsKQEAgLTEyNjQsNzYgKzM5MCwxMDIgQEAKIAl9CiAKIAlpZiAodW5wbHVnKQotCQloaWQtPmN0cmx0YWlsID0gaGlkLT5jdHJsaGVhZDsKKwkJdXNiaGlkLT5jdHJsdGFpbCA9IHVzYmhpZC0+Y3RybGhlYWQ7CiAJZWxzZQotCQloaWQtPmN0cmx0YWlsID0gKGhpZC0+Y3RybHRhaWwgKyAxKSAmIChISURfQ09OVFJPTF9GSUZPX1NJWkUgLSAxKTsKKwkJdXNiaGlkLT5jdHJsdGFpbCA9ICh1c2JoaWQtPmN0cmx0YWlsICsgMSkgJiAoSElEX0NPTlRST0xfRklGT19TSVpFIC0gMSk7CiAKLQlpZiAoaGlkLT5jdHJsaGVhZCAhPSBoaWQtPmN0cmx0YWlsKSB7CisJaWYgKHVzYmhpZC0+Y3RybGhlYWQgIT0gdXNiaGlkLT5jdHJsdGFpbCkgewogCQlpZiAoaGlkX3N1Ym1pdF9jdHJsKGhpZCkpIHsKLQkJCWNsZWFyX2JpdChISURfQ1RSTF9SVU5OSU5HLCAmaGlkLT5pb2ZsKTsKKwkJCWNsZWFyX2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAkJCXdha2VfdXAoJmhpZC0+d2FpdCk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGlkLT5jdHJsbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKLQljbGVhcl9iaXQoSElEX0NUUkxfUlVOTklORywgJmhpZC0+aW9mbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGlkLT5jdHJsbG9jaywgZmxhZ3MpOworCWNsZWFyX2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7CiAJd2FrZV91cCgmaGlkLT53YWl0KTsKIH0KIAotdm9pZCBoaWRfc3VibWl0X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LCB1bnNpZ25lZCBjaGFyIGRpcikKK3ZvaWQgdXNiaGlkX3N1Ym1pdF9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwgdW5zaWduZWQgY2hhciBkaXIpCiB7CiAJaW50IGhlYWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAogCWlmICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfTk9HRVQpICYmIGRpciA9PSBVU0JfRElSX0lOKQogCQlyZXR1cm47CiAKLQlpZiAoaGlkLT51cmJvdXQgJiYgZGlyID09IFVTQl9ESVJfT1VUICYmIHJlcG9ydC0+dHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkgeworCWlmICh1c2JoaWQtPnVyYm91dCAmJiBkaXIgPT0gVVNCX0RJUl9PVVQgJiYgcmVwb3J0LT50eXBlID09IEhJRF9PVVRQVVRfUkVQT1JUKSB7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhpZC0+b3V0bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7CiAKLQkJaWYgKChoZWFkID0gKGhpZC0+b3V0aGVhZCArIDEpICYgKEhJRF9PVVRQVVRfRklGT19TSVpFIC0gMSkpID09IGhpZC0+b3V0dGFpbCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGlkLT5vdXRsb2NrLCBmbGFncyk7CisJCWlmICgoaGVhZCA9ICh1c2JoaWQtPm91dGhlYWQgKyAxKSAmIChISURfT1VUUFVUX0ZJRk9fU0laRSAtIDEpKSA9PSB1c2JoaWQtPm91dHRhaWwpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOwogCQkJd2Fybigib3V0cHV0IHF1ZXVlIGZ1bGwiKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCWhpZC0+b3V0W2hpZC0+b3V0aGVhZF0gPSByZXBvcnQ7Ci0JCWhpZC0+b3V0aGVhZCA9IGhlYWQ7CisJCXVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0gPSByZXBvcnQ7CisJCXVzYmhpZC0+b3V0aGVhZCA9IGhlYWQ7CiAKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhJRF9PVVRfUlVOTklORywgJmhpZC0+aW9mbCkpCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChISURfT1VUX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpKQogCQkJaWYgKGhpZF9zdWJtaXRfb3V0KGhpZCkpCi0JCQkJY2xlYXJfYml0KEhJRF9PVVRfUlVOTklORywgJmhpZC0+aW9mbCk7CisJCQkJY2xlYXJfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGlkLT5vdXRsb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhpZC0+Y3RybGxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5jdHJsbG9jaywgZmxhZ3MpOwogCi0JaWYgKChoZWFkID0gKGhpZC0+Y3RybGhlYWQgKyAxKSAmIChISURfQ09OVFJPTF9GSUZPX1NJWkUgLSAxKSkgPT0gaGlkLT5jdHJsdGFpbCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoaWQtPmN0cmxsb2NrLCBmbGFncyk7CisJaWYgKChoZWFkID0gKHVzYmhpZC0+Y3RybGhlYWQgKyAxKSAmIChISURfQ09OVFJPTF9GSUZPX1NJWkUgLSAxKSkgPT0gdXNiaGlkLT5jdHJsdGFpbCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7CiAJCXdhcm4oImNvbnRyb2wgcXVldWUgZnVsbCIpOwogCQlyZXR1cm47CiAJfQogCi0JaGlkLT5jdHJsW2hpZC0+Y3RybGhlYWRdLnJlcG9ydCA9IHJlcG9ydDsKLQloaWQtPmN0cmxbaGlkLT5jdHJsaGVhZF0uZGlyID0gZGlyOwotCWhpZC0+Y3RybGhlYWQgPSBoZWFkOworCXVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yZXBvcnQgPSByZXBvcnQ7CisJdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLmRpciA9IGRpcjsKKwl1c2JoaWQtPmN0cmxoZWFkID0gaGVhZDsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdChISURfQ1RSTF9SVU5OSU5HLCAmaGlkLT5pb2ZsKSkKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSElEX0NUUkxfUlVOTklORywgJnVzYmhpZC0+aW9mbCkpCiAJCWlmIChoaWRfc3VibWl0X2N0cmwoaGlkKSkKLQkJCWNsZWFyX2JpdChISURfQ1RSTF9SVU5OSU5HLCAmaGlkLT5pb2ZsKTsKKwkJCWNsZWFyX2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhpZC0+Y3RybGxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7CiB9CiAKLWludCBoaWRfd2FpdF9pbyhzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQorc3RhdGljIGludCB1c2JfaGlkaW5wdXRfaW5wdXRfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKLQlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChoaWQtPndhaXQsICghdGVzdF9iaXQoSElEX0NUUkxfUlVOTklORywgJmhpZC0+aW9mbCkgJiYKLQkJCQkJIXRlc3RfYml0KEhJRF9PVVRfUlVOTklORywgJmhpZC0+aW9mbCkpLAorCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CisJaW50IG9mZnNldDsKKworCWlmICh0eXBlID09IEVWX0ZGKQorCQlyZXR1cm4gaW5wdXRfZmZfZXZlbnQoZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisKKwlpZiAodHlwZSAhPSBFVl9MRUQpCisJCXJldHVybiAtMTsKKworCWlmICgob2Zmc2V0ID0gaGlkaW5wdXRfZmluZF9maWVsZChoaWQsIHR5cGUsIGNvZGUsICZmaWVsZCkpID09IC0xKSB7CisJCXdhcm4oImV2ZW50IGZpZWxkIG5vdCBmb3VuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaGlkX3NldF9maWVsZChmaWVsZCwgb2Zmc2V0LCB2YWx1ZSk7CisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBmaWVsZC0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmhpZF93YWl0X2lvKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChoaWQtPndhaXQsICghdGVzdF9iaXQoSElEX0NUUkxfUlVOTklORywgJnVzYmhpZC0+aW9mbCkgJiYKKwkJCQkJIXRlc3RfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCkpLAogCQkJCQkxMCpIWikpIHsKIAkJZGJnKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIGN0cmwgb3Igb3V0IHF1ZXVlIHRvIGNsZWFyIik7CiAJCXJldHVybiAtMTsKQEAgLTEzNjUsNyArNTE3LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1pbnQgaGlkX29wZW4oc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK2ludCB1c2JoaWRfb3BlbihzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCSsraGlkLT5vcGVuOwogCWlmIChoaWRfc3RhcnRfaW4oaGlkKSkKQEAgLTEzNzMsMzggKzUyNSw1NiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGhpZF9jbG9zZShzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQordm9pZCB1c2JoaWRfY2xvc2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwogCWlmICghLS1oaWQtPm9wZW4pCi0JCXVzYl9raWxsX3VyYihoaWQtPnVyYmluKTsKKwkJdXNiX2tpbGxfdXJiKHVzYmhpZC0+dXJiaW4pOworfQorCitzdGF0aWMgaW50IGhpZGlucHV0X29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBkZXYtPnByaXZhdGU7CisJcmV0dXJuIHVzYmhpZF9vcGVuKGhpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGhpZGlucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gZGV2LT5wcml2YXRlOworCXVzYmhpZF9jbG9zZShoaWQpOwogfQogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfUEFOSklUCQkweDEzNGMKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1RVUkJPWAkJMHgwNjJhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVFVSQk9YX0tFWUJPQVJECTB4MDIwMQorCiAvKgogICogSW5pdGlhbGl6ZSBhbGwgcmVwb3J0cwogICovCiAKLXZvaWQgaGlkX2luaXRfcmVwb3J0cyhzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQordm9pZCB1c2JoaWRfaW5pdF9yZXBvcnRzKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCiB7CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAlpbnQgZXJyLCByZXQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX0lOUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCi0JCWhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKKwkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfSU4pOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsICZoaWQtPnJlcG9ydF9lbnVtW0hJRF9GRUFUVVJFX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCi0JCWhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKKwkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfSU4pOwogCiAJZXJyID0gMDsKLQlyZXQgPSBoaWRfd2FpdF9pbyhoaWQpOworCXJldCA9IHVzYmhpZF93YWl0X2lvKGhpZCk7CiAJd2hpbGUgKHJldCkgewogCQllcnIgfD0gcmV0OwotCQlpZiAodGVzdF9iaXQoSElEX0NUUkxfUlVOTklORywgJmhpZC0+aW9mbCkpCi0JCQl1c2Jfa2lsbF91cmIoaGlkLT51cmJjdHJsKTsKLQkJaWYgKHRlc3RfYml0KEhJRF9PVVRfUlVOTklORywgJmhpZC0+aW9mbCkpCi0JCQl1c2Jfa2lsbF91cmIoaGlkLT51cmJvdXQpOwotCQlyZXQgPSBoaWRfd2FpdF9pbyhoaWQpOworCQlpZiAodGVzdF9iaXQoSElEX0NUUkxfUlVOTklORywgJnVzYmhpZC0+aW9mbCkpCisJCQl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJjdHJsKTsKKwkJaWYgKHRlc3RfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCkpCisJCQl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJvdXQpOworCQlyZXQgPSB1c2JoaWRfd2FpdF9pbyhoaWQpOwogCX0KIAogCWlmIChlcnIpCkBAIC0xNTg5LDYgKzc1OSwxOSBAQAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQVBQTEUJCTB4MDVhYwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX01JR0hUWU1PVVNFCTB4MDMwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0FOU0kJMHgwMjBlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fSVNPCTB4MDIwZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9BTlNJCTB4MDIxNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9JU08JMHgwMjE1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0pJUwkweDAyMTYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0FOU0kJMHgwMjE3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19JU08JMHgwMjE4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19KSVMJMHgwMjE5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9BTlNJCTB4MDIxYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSVNPCTB4MDIxYgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSklTCTB4MDIxYworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFkJMHgwMzBhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZCTB4MDMwYgogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0hFUlJZCQkweDA0NmEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSEVSUllfQ1lNT1RJT04JMHgwMDIzCkBAIC0xNjAyLDYgKzc4NSwxMiBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1NVTgkJMHgwNDMwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUkFSSVRBTl9LVk1fRE9OR0xFCTB4Y2RhYgogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlSQ0FCTEUJCTB4MTZDQQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMQkJMHgxNTAyCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSAkJMHgwNDZkCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfVVNCX1JFQ0VJVkVSCTB4YzEwMQorCiAvKgogICogQWxwaGFiZXRpY2FsbHkgc29ydGVkIGJsYWNrbGlzdCBieSBxdWlyayB0eXBlLgogICovCkBAIC0xNjE5LDYgKzgwOCw3IEBACiAJeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjIsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMywgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzI0LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FJUkNBQkxFLCBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMSwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BTENPUiwgVVNCX0RFVklDRV9JRF9BTENPUl9VU0JSUzIzMiwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9CRVJLU0hJUkUsIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTLCBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1c0MCwgSElEX1FVSVJLX0lHTk9SRSB9LApAQCAtMTc1MiwyMiArOTQyLDI5IEBACiAKIAl7IFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTiwgSElEX1FVSVJLX0NZTU9USU9OIH0sCiAKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIwRSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIwRiwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNCwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNiwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxNywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxOCwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDIxOSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDMwQSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIDB4MDMwQiwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fQU5TSSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fSVNPLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfQU5TSSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0lTTywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfQU5TSSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19JU08sIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX1BPV0VSQk9PS19JU09fS0VZQk9BUkR9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0pJUywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9BTlNJLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0lTTywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9KSVMsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFksIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfSwKIAogCXsgVVNCX1ZFTkRPUl9JRF9QQU5KSVQsIDB4MDAwMSwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9QQU5KSVQsIDB4MDAwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9QQU5KSVQsIDB4MDAwMywgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9QQU5KSVQsIDB4MDAwNCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCisJeyBVU0JfVkVORE9SX0lEX1RVUkJPWCwgVVNCX0RFVklDRV9JRF9UVVJCT1hfS0VZQk9BUkQsIEhJRF9RVUlSS19OT0dFVCB9LAorCisJeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1VTQl9SRUNFSVZFUiwgSElEX1FVSVJLX0JBRF9SRUxBVElWRV9LRVlTIH0sCisKIAl7IDAsIDAgfQogfTsKIApAQCAtMTc5MCwxMyArOTg3LDE1IEBACiAKIHN0YXRpYyBpbnQgaGlkX2FsbG9jX2J1ZmZlcnMoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKLQlpZiAoIShoaWQtPmluYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIGhpZC0+YnVmc2l6ZSwgU0xBQl9BVE9NSUMsICZoaWQtPmluYnVmX2RtYSkpKQorCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOworCisJaWYgKCEodXNiaGlkLT5pbmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIEdGUF9BVE9NSUMsICZ1c2JoaWQtPmluYnVmX2RtYSkpKQogCQlyZXR1cm4gLTE7Ci0JaWYgKCEoaGlkLT5vdXRidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgaGlkLT5idWZzaXplLCBTTEFCX0FUT01JQywgJmhpZC0+b3V0YnVmX2RtYSkpKQorCWlmICghKHVzYmhpZC0+b3V0YnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0FUT01JQywgJnVzYmhpZC0+b3V0YnVmX2RtYSkpKQogCQlyZXR1cm4gLTE7Ci0JaWYgKCEoaGlkLT5jciA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBzaXplb2YoKihoaWQtPmNyKSksIFNMQUJfQVRPTUlDLCAmaGlkLT5jcl9kbWEpKSkKKwlpZiAoISh1c2JoaWQtPmNyID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHNpemVvZigqKHVzYmhpZC0+Y3IpKSwgR0ZQX0FUT01JQywgJnVzYmhpZC0+Y3JfZG1hKSkpCiAJCXJldHVybiAtMTsKLQlpZiAoIShoaWQtPmN0cmxidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgaGlkLT5idWZzaXplLCBTTEFCX0FUT01JQywgJmhpZC0+Y3RybGJ1Zl9kbWEpKSkKKwlpZiAoISh1c2JoaWQtPmN0cmxidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgdXNiaGlkLT5idWZzaXplLCBHRlBfQVRPTUlDLCAmdXNiaGlkLT5jdHJsYnVmX2RtYSkpKQogCQlyZXR1cm4gLTE7CiAKIAlyZXR1cm4gMDsKQEAgLTE4MDQsMTQgKzEwMDMsMTYgQEAKIAogc3RhdGljIHZvaWQgaGlkX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewotCWlmIChoaWQtPmluYnVmKQotCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBoaWQtPmJ1ZnNpemUsIGhpZC0+aW5idWYsIGhpZC0+aW5idWZfZG1hKTsKLQlpZiAoaGlkLT5vdXRidWYpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIGhpZC0+YnVmc2l6ZSwgaGlkLT5vdXRidWYsIGhpZC0+b3V0YnVmX2RtYSk7Ci0JaWYgKGhpZC0+Y3IpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIHNpemVvZigqKGhpZC0+Y3IpKSwgaGlkLT5jciwgaGlkLT5jcl9kbWEpOwotCWlmIChoaWQtPmN0cmxidWYpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIGhpZC0+YnVmc2l6ZSwgaGlkLT5jdHJsYnVmLCBoaWQtPmN0cmxidWZfZG1hKTsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKworCWlmICh1c2JoaWQtPmluYnVmKQorCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIHVzYmhpZC0+aW5idWYsIHVzYmhpZC0+aW5idWZfZG1hKTsKKwlpZiAodXNiaGlkLT5vdXRidWYpCisJCXVzYl9idWZmZXJfZnJlZShkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgdXNiaGlkLT5vdXRidWYsIHVzYmhpZC0+b3V0YnVmX2RtYSk7CisJaWYgKHVzYmhpZC0+Y3IpCisJCXVzYl9idWZmZXJfZnJlZShkZXYsIHNpemVvZigqKHVzYmhpZC0+Y3IpKSwgdXNiaGlkLT5jciwgdXNiaGlkLT5jcl9kbWEpOworCWlmICh1c2JoaWQtPmN0cmxidWYpCisJCXVzYl9idWZmZXJfZnJlZShkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgdXNiaGlkLT5jdHJsYnVmLCB1c2JoaWQtPmN0cmxidWZfZG1hKTsKIH0KIAogLyoKQEAgLTE4MzcsNiArMTAzOCw3IEBACiAJdW5zaWduZWQgcXVpcmtzID0gMCwgcnNpemUgPSAwOwogCWNoYXIgKnJkZXNjOwogCWludCBuLCBsZW4sIGluc2l6ZSA9IDA7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZDsKIAogICAgICAgICAvKiBJZ25vcmUgYWxsIFdhY29tIGRldmljZXMgKi8KICAgICAgICAgaWYgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gVVNCX1ZFTkRPUl9JRF9XQUNPTSkKQEAgLTE5MDYsMTMgKzExMDgsMTkgQEAKIAlrZnJlZShyZGVzYyk7CiAJaGlkLT5xdWlya3MgPSBxdWlya3M7CiAKLQloaWQtPmJ1ZnNpemUgPSBISURfTUlOX0JVRkZFUl9TSVpFOwotCWhpZF9maW5kX21heF9yZXBvcnQoaGlkLCBISURfSU5QVVRfUkVQT1JULCAmaGlkLT5idWZzaXplKTsKLQloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX09VVFBVVF9SRVBPUlQsICZoaWQtPmJ1ZnNpemUpOwotCWhpZF9maW5kX21heF9yZXBvcnQoaGlkLCBISURfRkVBVFVSRV9SRVBPUlQsICZoaWQtPmJ1ZnNpemUpOworCWlmICghKHVzYmhpZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JoaWRfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQorCQlnb3RvIGZhaWw7CiAKLQlpZiAoaGlkLT5idWZzaXplID4gSElEX01BWF9CVUZGRVJfU0laRSkKLQkJaGlkLT5idWZzaXplID0gSElEX01BWF9CVUZGRVJfU0laRTsKKwloaWQtPmRyaXZlcl9kYXRhID0gdXNiaGlkOworCXVzYmhpZC0+aGlkID0gaGlkOworCisJdXNiaGlkLT5idWZzaXplID0gSElEX01JTl9CVUZGRVJfU0laRTsKKwloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0lOUFVUX1JFUE9SVCwgJnVzYmhpZC0+YnVmc2l6ZSk7CisJaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9PVVRQVVRfUkVQT1JULCAmdXNiaGlkLT5idWZzaXplKTsKKwloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0ZFQVRVUkVfUkVQT1JULCAmdXNiaGlkLT5idWZzaXplKTsKKworCWlmICh1c2JoaWQtPmJ1ZnNpemUgPiBISURfTUFYX0JVRkZFUl9TSVpFKQorCQl1c2JoaWQtPmJ1ZnNpemUgPSBISURfTUFYX0JVRkZFUl9TSVpFOwogCiAJaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9JTlBVVF9SRVBPUlQsICZpbnNpemUpOwogCkBAIC0xOTQwLDQ4ICsxMTQ4LDQ4IEBACiAJCWlmIChoaWQtPmNvbGxlY3Rpb24tPnVzYWdlID09IEhJRF9HRF9NT1VTRSAmJiBoaWRfbW91c2Vwb2xsX2ludGVydmFsID4gMCkKIAkJCWludGVydmFsID0gaGlkX21vdXNlcG9sbF9pbnRlcnZhbDsKIAotCQlpZiAoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSB7Ci0JCQlpZiAoaGlkLT51cmJpbikKKwkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZW5kcG9pbnQpKSB7CisJCQlpZiAodXNiaGlkLT51cmJpbikKIAkJCQljb250aW51ZTsKLQkJCWlmICghKGhpZC0+dXJiaW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSkKKwkJCWlmICghKHVzYmhpZC0+dXJiaW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSkKIAkJCQlnb3RvIGZhaWw7CiAJCQlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7Ci0JCQl1c2JfZmlsbF9pbnRfdXJiKGhpZC0+dXJiaW4sIGRldiwgcGlwZSwgaGlkLT5pbmJ1ZiwgaW5zaXplLAorCQkJdXNiX2ZpbGxfaW50X3VyYih1c2JoaWQtPnVyYmluLCBkZXYsIHBpcGUsIHVzYmhpZC0+aW5idWYsIGluc2l6ZSwKIAkJCQkJIGhpZF9pcnFfaW4sIGhpZCwgaW50ZXJ2YWwpOwotCQkJaGlkLT51cmJpbi0+dHJhbnNmZXJfZG1hID0gaGlkLT5pbmJ1Zl9kbWE7Ci0JCQloaWQtPnVyYmluLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJCXVzYmhpZC0+dXJiaW4tPnRyYW5zZmVyX2RtYSA9IHVzYmhpZC0+aW5idWZfZG1hOworCQkJdXNiaGlkLT51cmJpbi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoaGlkLT51cmJvdXQpCisJCQlpZiAodXNiaGlkLT51cmJvdXQpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoIShoaWQtPnVyYm91dCA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKQorCQkJaWYgKCEodXNiaGlkLT51cmJvdXQgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSkKIAkJCQlnb3RvIGZhaWw7CiAJCQlwaXBlID0gdXNiX3NuZGludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7Ci0JCQl1c2JfZmlsbF9pbnRfdXJiKGhpZC0+dXJib3V0LCBkZXYsIHBpcGUsIGhpZC0+b3V0YnVmLCAwLAorCQkJdXNiX2ZpbGxfaW50X3VyYih1c2JoaWQtPnVyYm91dCwgZGV2LCBwaXBlLCB1c2JoaWQtPm91dGJ1ZiwgMCwKIAkJCQkJIGhpZF9pcnFfb3V0LCBoaWQsIGludGVydmFsKTsKLQkJCWhpZC0+dXJib3V0LT50cmFuc2Zlcl9kbWEgPSBoaWQtPm91dGJ1Zl9kbWE7Ci0JCQloaWQtPnVyYm91dC0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCQl1c2JoaWQtPnVyYm91dC0+dHJhbnNmZXJfZG1hID0gdXNiaGlkLT5vdXRidWZfZG1hOworCQkJdXNiaGlkLT51cmJvdXQtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCQl9CiAJfQogCi0JaWYgKCFoaWQtPnVyYmluKSB7CisJaWYgKCF1c2JoaWQtPnVyYmluKSB7CiAJCWVycigiY291bGRuJ3QgZmluZCBhbiBpbnB1dCBpbnRlcnJ1cHQgZW5kcG9pbnQiKTsKIAkJZ290byBmYWlsOwogCX0KIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhpZC0+d2FpdCk7CiAKLQlJTklUX1dPUksoJmhpZC0+cmVzZXRfd29yaywgaGlkX3Jlc2V0LCBoaWQpOwotCXNldHVwX3RpbWVyKCZoaWQtPmlvX3JldHJ5LCBoaWRfcmV0cnlfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpIGhpZCk7CisJSU5JVF9XT1JLKCZ1c2JoaWQtPnJlc2V0X3dvcmssIGhpZF9yZXNldCk7CisJc2V0dXBfdGltZXIoJnVzYmhpZC0+aW9fcmV0cnksIGhpZF9yZXRyeV90aW1lb3V0LCAodW5zaWduZWQgbG9uZykgaGlkKTsKIAotCXNwaW5fbG9ja19pbml0KCZoaWQtPmlubG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmhpZC0+b3V0bG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmhpZC0+Y3RybGxvY2spOworCXNwaW5fbG9ja19pbml0KCZ1c2JoaWQtPmlubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnVzYmhpZC0+b3V0bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnVzYmhpZC0+Y3RybGxvY2spOwogCiAJaGlkLT52ZXJzaW9uID0gbGUxNl90b19jcHUoaGRlc2MtPmJjZEhJRCk7CiAJaGlkLT5jb3VudHJ5ID0gaGRlc2MtPmJDb3VudHJ5Q29kZTsKLQloaWQtPmRldiA9IGRldjsKLQloaWQtPmludGYgPSBpbnRmOwotCWhpZC0+aWZudW0gPSBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwloaWQtPmRldiA9ICZkZXYtPmRldjsKKwl1c2JoaWQtPmludGYgPSBpbnRmOworCXVzYmhpZC0+aWZudW0gPSBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAogCWhpZC0+bmFtZVswXSA9IDA7CiAKQEAgLTE5OTksNiArMTIwNywxMCBAQAogCQkJIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCQkgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCisJaGlkLT5idXMgPSBCVVNfVVNCOworCWhpZC0+dmVuZG9yID0gZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yOworCWhpZC0+cHJvZHVjdCA9IGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3Q7CisKIAl1c2JfbWFrZV9wYXRoKGRldiwgaGlkLT5waHlzLCBzaXplb2YoaGlkLT5waHlzKSk7CiAJc3RybGNhdChoaWQtPnBoeXMsICIvaW5wdXQiLCBzaXplb2YoaGlkLT5waHlzKSk7CiAJbGVuID0gc3RybGVuKGhpZC0+cGh5cyk7CkBAIC0yMDA5LDI2ICsxMjIxLDMyIEBACiAJaWYgKHVzYl9zdHJpbmcoZGV2LCBkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgaGlkLT51bmlxLCA2NCkgPD0gMCkKIAkJaGlkLT51bmlxWzBdID0gMDsKIAotCWhpZC0+dXJiY3RybCA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoaWQtPnVyYmN0cmwpCisJdXNiaGlkLT51cmJjdHJsID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYmhpZC0+dXJiY3RybCkKIAkJZ290byBmYWlsOwogCi0JdXNiX2ZpbGxfY29udHJvbF91cmIoaGlkLT51cmJjdHJsLCBkZXYsIDAsICh2b2lkICopIGhpZC0+Y3IsCi0JCQkgICAgIGhpZC0+Y3RybGJ1ZiwgMSwgaGlkX2N0cmwsIGhpZCk7Ci0JaGlkLT51cmJjdHJsLT5zZXR1cF9kbWEgPSBoaWQtPmNyX2RtYTsKLQloaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2RtYSA9IGhpZC0+Y3RybGJ1Zl9kbWE7Ci0JaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9mbGFncyB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCk7CisJdXNiX2ZpbGxfY29udHJvbF91cmIodXNiaGlkLT51cmJjdHJsLCBkZXYsIDAsICh2b2lkICopIHVzYmhpZC0+Y3IsCisJCQkgICAgIHVzYmhpZC0+Y3RybGJ1ZiwgMSwgaGlkX2N0cmwsIGhpZCk7CisJdXNiaGlkLT51cmJjdHJsLT5zZXR1cF9kbWEgPSB1c2JoaWQtPmNyX2RtYTsKKwl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2RtYSA9IHVzYmhpZC0+Y3RybGJ1Zl9kbWE7CisJdXNiaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9mbGFncyB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCk7CisJaGlkLT5oaWRpbnB1dF9pbnB1dF9ldmVudCA9IHVzYl9oaWRpbnB1dF9pbnB1dF9ldmVudDsKKwloaWQtPmhpZGlucHV0X29wZW4gPSBoaWRpbnB1dF9vcGVuOworCWhpZC0+aGlkaW5wdXRfY2xvc2UgPSBoaWRpbnB1dF9jbG9zZTsKKyNpZmRlZiBDT05GSUdfVVNCX0hJRERFVgorCWhpZC0+aGlkZGV2X2hpZF9ldmVudCA9IGhpZGRldl9oaWRfZXZlbnQ7CisJaGlkLT5oaWRkZXZfcmVwb3J0X2V2ZW50ID0gaGlkZGV2X3JlcG9ydF9ldmVudDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LCisJaGlkLT5wYl9mbm1vZGUgPSB1c2JoaWRfcGJfZm5tb2RlOworI2VuZGlmCiAKIAlyZXR1cm4gaGlkOwogCiBmYWlsOgotCi0JaWYgKGhpZC0+dXJiaW4pCi0JCXVzYl9mcmVlX3VyYihoaWQtPnVyYmluKTsKLQlpZiAoaGlkLT51cmJvdXQpCi0JCXVzYl9mcmVlX3VyYihoaWQtPnVyYm91dCk7Ci0JaWYgKGhpZC0+dXJiY3RybCkKLQkJdXNiX2ZyZWVfdXJiKGhpZC0+dXJiY3RybCk7CisJdXNiX2ZyZWVfdXJiKHVzYmhpZC0+dXJiaW4pOworCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYm91dCk7CisJdXNiX2ZyZWVfdXJiKHVzYmhpZC0+dXJiY3RybCk7CiAJaGlkX2ZyZWVfYnVmZmVycyhkZXYsIGhpZCk7CiAJaGlkX2ZyZWVfZGV2aWNlKGhpZCk7CiAKQEAgLTIwMzgsMTggKzEyNTYsMjEgQEAKIHN0YXRpYyB2b2lkIGhpZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkOwogCiAJaWYgKCFoaWQpCiAJCXJldHVybjsKIAotCXNwaW5fbG9ja19pcnEoJmhpZC0+aW5sb2NrKTsJLyogU3luYyB3aXRoIGVycm9yIGhhbmRsZXIgKi8KLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmaGlkLT5pbmxvY2spOwotCXVzYl9raWxsX3VyYihoaWQtPnVyYmluKTsKLQl1c2Jfa2lsbF91cmIoaGlkLT51cmJvdXQpOwotCXVzYl9raWxsX3VyYihoaWQtPnVyYmN0cmwpOworCXVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAKLQlkZWxfdGltZXJfc3luYygmaGlkLT5pb19yZXRyeSk7CisJc3Bpbl9sb2NrX2lycSgmdXNiaGlkLT5pbmxvY2spOwkvKiBTeW5jIHdpdGggZXJyb3IgaGFuZGxlciAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ1c2JoaWQtPmlubG9jayk7CisJdXNiX2tpbGxfdXJiKHVzYmhpZC0+dXJiaW4pOworCXVzYl9raWxsX3VyYih1c2JoaWQtPnVyYm91dCk7CisJdXNiX2tpbGxfdXJiKHVzYmhpZC0+dXJiY3RybCk7CisKKwlkZWxfdGltZXJfc3luYygmdXNiaGlkLT5pb19yZXRyeSk7CiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkKQEAgLTIwNTcsMTIgKzEyNzgsMTEgQEAKIAlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWKQogCQloaWRkZXZfZGlzY29ubmVjdChoaWQpOwogCi0JdXNiX2ZyZWVfdXJiKGhpZC0+dXJiaW4pOwotCXVzYl9mcmVlX3VyYihoaWQtPnVyYmN0cmwpOwotCWlmIChoaWQtPnVyYm91dCkKLQkJdXNiX2ZyZWVfdXJiKGhpZC0+dXJib3V0KTsKKwl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJpbik7CisJdXNiX2ZyZWVfdXJiKHVzYmhpZC0+dXJiY3RybCk7CisJdXNiX2ZyZWVfdXJiKHVzYmhpZC0+dXJib3V0KTsKIAotCWhpZF9mcmVlX2J1ZmZlcnMoaGlkLT5kZXYsIGhpZCk7CisJaGlkX2ZyZWVfYnVmZmVycyh0b191c2JfZGV2aWNlKGhpZC0+ZGV2KSwgaGlkKTsKIAloaWRfZnJlZV9kZXZpY2UoaGlkKTsKIH0KIApAQCAtMjA3OSw3ICsxMjk5LDcgQEAKIAlpZiAoIShoaWQgPSB1c2JfaGlkX2NvbmZpZ3VyZShpbnRmKSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaGlkX2luaXRfcmVwb3J0cyhoaWQpOworCXVzYmhpZF9pbml0X3JlcG9ydHMoaGlkKTsKIAloaWRfZHVtcF9kZXZpY2UoaGlkKTsKIAogCWlmICghaGlkaW5wdXRfY29ubmVjdChoaWQpKQpAQCAtMjA5NSw2ICsxMzE1LDEzIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCS8qIFRoaXMgb25seSBnZXRzIGNhbGxlZCB3aGVuIHdlIGFyZSBhIHNpbmdsZS1pbnB1dCAobW9zdCBvZiB0aGUKKwkgKiB0aW1lKS4gSU9XLCBub3QgYSBISURfUVVJUktfTVVMVElfSU5QVVQuIFRoZSBoaWRfZmZfaW5pdCgpIGlzCisJICogb25seSB1c2VmdWwgaW4gdGhpcyBjYXNlLCBhbmQgbm90IGZvciBtdWx0aS1pbnB1dCBxdWlya3MuICovCisJaWYgKChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkgJiYKKwkJCSEoaGlkLT5xdWlya3MgJiBISURfUVVJUktfTVVMVElfSU5QVVQpKQorCQloaWRfZmZfaW5pdChoaWQpOworCiAJcHJpbnRrKEtFUk5fSU5GTyk7CiAKIAlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpCkBAIC0yMTI1LDEyICsxMzUyLDEzIEBACiBzdGF0aWMgaW50IGhpZF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAKLQlzcGluX2xvY2tfaXJxKCZoaWQtPmlubG9jayk7CS8qIFN5bmMgd2l0aCBlcnJvciBoYW5kbGVyICovCi0Jc2V0X2JpdChISURfU1VTUEVOREVELCAmaGlkLT5pb2ZsKTsKLQlzcGluX3VubG9ja19pcnEoJmhpZC0+aW5sb2NrKTsKLQlkZWxfdGltZXIoJmhpZC0+aW9fcmV0cnkpOwotCXVzYl9raWxsX3VyYihoaWQtPnVyYmluKTsKKwlzcGluX2xvY2tfaXJxKCZ1c2JoaWQtPmlubG9jayk7CS8qIFN5bmMgd2l0aCBlcnJvciBoYW5kbGVyICovCisJc2V0X2JpdChISURfU1VTUEVOREVELCAmdXNiaGlkLT5pb2ZsKTsKKwlzcGluX3VubG9ja19pcnEoJnVzYmhpZC0+aW5sb2NrKTsKKwlkZWxfdGltZXIoJnVzYmhpZC0+aW9fcmV0cnkpOworCXVzYl9raWxsX3VyYih1c2JoaWQtPnVyYmluKTsKIAlkZXZfZGJnKCZpbnRmLT5kZXYsICJzdXNwZW5kXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMzgsMTAgKzEzNjYsMTEgQEAKIHN0YXRpYyBpbnQgaGlkX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAJaW50IHN0YXR1czsKIAotCWNsZWFyX2JpdChISURfU1VTUEVOREVELCAmaGlkLT5pb2ZsKTsKLQloaWQtPnJldHJ5X2RlbGF5ID0gMDsKKwljbGVhcl9iaXQoSElEX1NVU1BFTkRFRCwgJnVzYmhpZC0+aW9mbCk7CisJdXNiaGlkLT5yZXRyeV9kZWxheSA9IDA7CiAJc3RhdHVzID0gaGlkX3N0YXJ0X2luKGhpZCk7CiAJZGV2X2RiZygmaW50Zi0+ZGV2LCAicmVzdW1lIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWZmLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZmYuYwppbmRleCBhOGZjNDZjLi5mOGY2NjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZmYuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZmYuYwpAQCAtMzIsNyArMzIsNyBAQAogI3VuZGVmIERFQlVHCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAKLSNpbmNsdWRlICJoaWQuaCIKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KIAogLyoKICAqIFRoaXMgdGFibGUgY29udGFpbnMgcG9pbnRlcnMgdG8gaW5pdGlhbGl6ZXJzLiBUbyBhZGQgc3VwcG9ydCBmb3IgbmV3CkBAIC03MCw4ICs3MCw4IEBACiBpbnQgaGlkX2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UqIGhpZCkKIHsKIAlzdHJ1Y3QgaGlkX2ZmX2luaXRpYWxpemVyICppbml0OwotCWludCB2ZW5kb3IgPSBsZTE2X3RvX2NwdShoaWQtPmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7Ci0JaW50IHByb2R1Y3QgPSBsZTE2X3RvX2NwdShoaWQtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCWludCB2ZW5kb3IgPSBsZTE2X3RvX2NwdSh0b191c2JfZGV2aWNlKGhpZC0+ZGV2KS0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJaW50IHByb2R1Y3QgPSBsZTE2X3RvX2NwdSh0b191c2JfZGV2aWNlKGhpZC0+ZGV2KS0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwogCiAJZm9yIChpbml0ID0gaW5pdHM7IGluaXQtPmlkVmVuZG9yOyBpbml0KyspCiAJCWlmIChpbml0LT5pZFZlbmRvciA9PSB2ZW5kb3IgJiYgaW5pdC0+aWRQcm9kdWN0ID09IHByb2R1Y3QpCkBAIC03OSwzICs3OSw1IEBACiAKIAlyZXR1cm4gaW5pdC0+aW5pdChoaWQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaGlkX2ZmX2luaXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTgwOGEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCisrKyAvZGV2L251bGwKQEAgLTEsODUxICswLDAgQEAKLS8qCi0gKiAkSWQ6IGhpZC1pbnB1dC5jLHYgMS4yIDIwMDIvMDQvMjMgMDA6NTk6MjUgcmRhbWF6aW8gRXhwICQKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVm9qdGVjaCBQYXZsaWsKLSAqCi0gKiAgVVNCIEhJRCB0byBMaW51eCBJbnB1dCBtYXBwaW5nCi0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKgotICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gZWl0aGVyIGJ5Ci0gKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8dm9qdGVjaEB1Y3cuY3o+LCBvciBieSBwYXBlciBtYWlsOgotICogVm9qdGVjaCBQYXZsaWssIFNpbXVua292YSAxNTk0LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KLQotI3VuZGVmIERFQlVHCi0KLSNpbmNsdWRlICJoaWQuaCIKLQotI2RlZmluZSB1bmsJS0VZX1VOS05PV04KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaGlkX2tleWJvYXJkWzI1Nl0gPSB7Ci0JICAwLCAgMCwgIDAsICAwLCAzMCwgNDgsIDQ2LCAzMiwgMTgsIDMzLCAzNCwgMzUsIDIzLCAzNiwgMzcsIDM4LAotCSA1MCwgNDksIDI0LCAyNSwgMTYsIDE5LCAzMSwgMjAsIDIyLCA0NywgMTcsIDQ1LCAyMSwgNDQsICAyLCAgMywKLQkgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAyOCwgIDEsIDE0LCAxNSwgNTcsIDEyLCAxMywgMjYsCi0JIDI3LCA0MywgNDMsIDM5LCA0MCwgNDEsIDUxLCA1MiwgNTMsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LAotCSA2NSwgNjYsIDY3LCA2OCwgODcsIDg4LCA5OSwgNzAsMTE5LDExMCwxMDIsMTA0LDExMSwxMDcsMTA5LDEwNiwKLQkxMDUsMTA4LDEwMywgNjksIDk4LCA1NSwgNzQsIDc4LCA5NiwgNzksIDgwLCA4MSwgNzUsIDc2LCA3NywgNzEsCi0JIDcyLCA3MywgODIsIDgzLCA4NiwxMjcsMTE2LDExNywxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLAotCTE5MSwxOTIsMTkzLDE5NCwxMzQsMTM4LDEzMCwxMzIsMTI4LDEyOSwxMzEsMTM3LDEzMywxMzUsMTM2LDExMywKLQkxMTUsMTE0LHVuayx1bmssdW5rLDEyMSx1bmssIDg5LCA5MywxMjQsIDkyLCA5NCwgOTUsdW5rLHVuayx1bmssCi0JMTIyLDEyMywgOTAsIDkxLCA4NSx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLAotCXVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuaywKLQl1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssCi0JdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLAotCXVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuayx1bmssdW5rLHVuaywKLQkgMjksIDQyLCA1NiwxMjUsIDk3LCA1NCwxMDAsMTI2LDE2NCwxNjYsMTY1LDE2MywxNjEsMTE1LDExNCwxMTMsCi0JMTUwLDE1OCwxNTksMTI4LDEzNiwxNzcsMTc4LDE3NiwxNDIsMTUyLDE3MywxNDAsdW5rLHVuayx1bmssdW5rCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLQlfX3MzMiB4OwotCV9fczMyIHk7Ci19ICBoaWRfaGF0X3RvX2F4aXNbXSA9IHt7IDAsIDB9LCB7IDAsLTF9LCB7IDEsLTF9LCB7IDEsIDB9LCB7IDEsIDF9LCB7IDAsIDF9LCB7LTEsIDF9LCB7LTEsIDB9LCB7LTEsLTF9fTsKLQotI2RlZmluZSBtYXBfYWJzKGMpCWRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX0FCUzsgYml0ID0gaW5wdXQtPmFic2JpdDsgbWF4ID0gQUJTX01BWDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbWFwX3JlbChjKQlkbyB7IHVzYWdlLT5jb2RlID0gYzsgdXNhZ2UtPnR5cGUgPSBFVl9SRUw7IGJpdCA9IGlucHV0LT5yZWxiaXQ7IG1heCA9IFJFTF9NQVg7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1hcF9rZXkoYykJZG8geyB1c2FnZS0+Y29kZSA9IGM7IHVzYWdlLT50eXBlID0gRVZfS0VZOyBiaXQgPSBpbnB1dC0+a2V5Yml0OyBtYXggPSBLRVlfTUFYOyB9IHdoaWxlICgwKQotI2RlZmluZSBtYXBfbGVkKGMpCWRvIHsgdXNhZ2UtPmNvZGUgPSBjOyB1c2FnZS0+dHlwZSA9IEVWX0xFRDsgYml0ID0gaW5wdXQtPmxlZGJpdDsgbWF4ID0gTEVEX01BWDsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtYXBfYWJzX2NsZWFyKGMpCWRvIHsgbWFwX2FicyhjKTsgY2xlYXJfYml0KGMsIGJpdCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG1hcF9rZXlfY2xlYXIoYykJZG8geyBtYXBfa2V5KGMpOyBjbGVhcl9iaXQoYywgYml0KTsgfSB3aGlsZSAoMCkKLQotI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LCi0KLXN0cnVjdCBoaWRpbnB1dF9rZXlfdHJhbnNsYXRpb24gewotCXUxNiBmcm9tOwotCXUxNiB0bzsKLQl1OCBmbGFnczsKLX07Ci0KLSNkZWZpbmUgUE9XRVJCT09LX0ZMQUdfRktFWSAweDAxCi0KLXN0YXRpYyBzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uIHBvd2VyYm9va19mbl9rZXlzW10gPSB7Ci0JeyBLRVlfQkFDS1NQQUNFLCBLRVlfREVMRVRFIH0sCi0JeyBLRVlfRjEsCUtFWV9CUklHSFRORVNTRE9XTiwJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YyLAlLRVlfQlJJR0hUTkVTU1VQLAlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCi0JeyBLRVlfRjMsCUtFWV9NVVRFLAkJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y0LAlLRVlfVk9MVU1FRE9XTiwJCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GNSwJS0VZX1ZPTFVNRVVQLAkJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y2LAlLRVlfTlVNTE9DSywJCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GNywJS0VZX1NXSVRDSFZJREVPTU9ERSwJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAotCXsgS0VZX0Y4LAlLRVlfS0JESUxMVU1UT0dHTEUsCVBPV0VSQk9PS19GTEFHX0ZLRVkgfSwKLQl7IEtFWV9GOSwJS0VZX0tCRElMTFVNRE9XTiwJUE9XRVJCT09LX0ZMQUdfRktFWSB9LAotCXsgS0VZX0YxMCwJS0VZX0tCRElMTFVNVVAsCQlQT1dFUkJPT0tfRkxBR19GS0VZIH0sCi0JeyBLRVlfVVAsCUtFWV9QQUdFVVAgfSwKLQl7IEtFWV9ET1dOLAlLRVlfUEFHRURPV04gfSwKLQl7IEtFWV9MRUZULAlLRVlfSE9NRSB9LAotCXsgS0VZX1JJR0hULAlLRVlfRU5EIH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiBwb3dlcmJvb2tfbnVtbG9ja19rZXlzW10gPSB7Ci0JeyBLRVlfSiwJS0VZX0tQMSB9LAotCXsgS0VZX0ssCUtFWV9LUDIgfSwKLQl7IEtFWV9MLAlLRVlfS1AzIH0sCi0JeyBLRVlfVSwJS0VZX0tQNCB9LAotCXsgS0VZX0ksCUtFWV9LUDUgfSwKLQl7IEtFWV9PLAlLRVlfS1A2IH0sCi0JeyBLRVlfNywJS0VZX0tQNyB9LAotCXsgS0VZXzgsCUtFWV9LUDggfSwKLQl7IEtFWV85LAlLRVlfS1A5IH0sCi0JeyBLRVlfTSwJS0VZX0tQMCB9LAotCXsgS0VZX0RPVCwJS0VZX0tQRE9UIH0sCi0JeyBLRVlfU0xBU0gsCUtFWV9LUFBMVVMgfSwKLQl7IEtFWV9TRU1JQ09MT04sIEtFWV9LUE1JTlVTIH0sCi0JeyBLRVlfUCwJS0VZX0tQQVNURVJJU0sgfSwKLQl7IEtFWV9NSU5VUywJS0VZX0tQRVFVQUwgfSwKLQl7IEtFWV8wLAlLRVlfS1BTTEFTSCB9LAotCXsgS0VZX0Y2LAlLRVlfTlVNTE9DSyB9LAotCXsgS0VZX0tQRU5URVIsCUtFWV9LUEVOVEVSIH0sCi0JeyBLRVlfQkFDS1NQQUNFLCBLRVlfQkFDS1NQQUNFIH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgaW50IHVzYmhpZF9wYl9mbm1vZGUgPSAxOwotbW9kdWxlX3BhcmFtX25hbWVkKHBiX2ZubW9kZSwgdXNiaGlkX3BiX2ZubW9kZSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocGJfZm5tb2RlLAotCSJNb2RlIG9mIGZuIGtleSBvbiBQb3dlckJvb2tzICgwID0gZGlzYWJsZWQsIDEgPSBma2V5c2xhc3QsIDIgPSBma2V5c2ZpcnN0KSIpOwotCi1zdGF0aWMgc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqZmluZF90cmFuc2xhdGlvbihzdHJ1Y3QgaGlkaW5wdXRfa2V5X3RyYW5zbGF0aW9uICp0YWJsZSwgdTE2IGZyb20pCi17Ci0Jc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdHJhbnM7Ci0KLQkvKiBMb29rIGZvciB0aGUgdHJhbnNsYXRpb24gKi8KLQlmb3IgKHRyYW5zID0gdGFibGU7IHRyYW5zLT5mcm9tOyB0cmFucysrKQotCQlpZiAodHJhbnMtPmZyb20gPT0gZnJvbSkKLQkJCXJldHVybiB0cmFuczsKLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGhpZGlucHV0X3BiX2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LAotCQkJICAgICBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCi17Ci0Jc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdHJhbnM7Ci0KLQlpZiAodXNhZ2UtPmNvZGUgPT0gS0VZX0ZOKSB7Ci0JCWlmICh2YWx1ZSkgaGlkLT5xdWlya3MgfD0gIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT047Ci0JCWVsc2UgICAgICAgaGlkLT5xdWlya3MgJj0gfkhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT047Ci0KLQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgdmFsdWUpOwotCi0JCXJldHVybiAxOwotCX0KLQotCWlmICh1c2JoaWRfcGJfZm5tb2RlKSB7Ci0JCWludCBkb190cmFuc2xhdGU7Ci0KLQkJdHJhbnMgPSBmaW5kX3RyYW5zbGF0aW9uKHBvd2VyYm9va19mbl9rZXlzLCB1c2FnZS0+Y29kZSk7Ci0JCWlmICh0cmFucykgewotCQkJaWYgKHRlc3RfYml0KHVzYWdlLT5jb2RlLCBoaWQtPnBiX3ByZXNzZWRfZm4pKQotCQkJCWRvX3RyYW5zbGF0ZSA9IDE7Ci0JCQllbHNlIGlmICh0cmFucy0+ZmxhZ3MgJiBQT1dFUkJPT0tfRkxBR19GS0VZKQotCQkJCWRvX3RyYW5zbGF0ZSA9Ci0JCQkJCSh1c2JoaWRfcGJfZm5tb2RlID09IDIgJiYgIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT04pKSB8fAotCQkJCQkodXNiaGlkX3BiX2ZubW9kZSA9PSAxICYmICEoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUE9XRVJCT09LX0ZOX09OKSk7Ci0JCQllbHNlCi0JCQkJZG9fdHJhbnNsYXRlID0gKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTik7Ci0KLQkJCWlmIChkb190cmFuc2xhdGUpIHsKLQkJCQlpZiAodmFsdWUpCi0JCQkJCXNldF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9mbik7Ci0JCQkJZWxzZQotCQkJCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9mbik7Ci0KLQkJCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHRyYW5zLT50bywgdmFsdWUpOwotCi0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGVzdF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9udW1sb2NrKSB8fAotCQkgICAgdGVzdF9iaXQoTEVEX05VTUwsIGlucHV0LT5sZWQpKSB7Ci0JCQl0cmFucyA9IGZpbmRfdHJhbnNsYXRpb24ocG93ZXJib29rX251bWxvY2tfa2V5cywgdXNhZ2UtPmNvZGUpOwotCi0JCQlpZiAodHJhbnMpIHsKLQkJCQlpZiAodmFsdWUpCi0JCQkJCXNldF9iaXQodXNhZ2UtPmNvZGUsIGhpZC0+cGJfcHJlc3NlZF9udW1sb2NrKTsKLQkJCQllbHNlCi0JCQkJCWNsZWFyX2JpdCh1c2FnZS0+Y29kZSwgaGlkLT5wYl9wcmVzc2VkX251bWxvY2spOwotCi0JCQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB0cmFucy0+dG8sIHZhbHVlKTsKLQkJCX0KLQotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaGlkaW5wdXRfcGJfc2V0dXAoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCi17Ci0Jc3RydWN0IGhpZGlucHV0X2tleV90cmFuc2xhdGlvbiAqdHJhbnM7Ci0KLQlzZXRfYml0KEtFWV9OVU1MT0NLLCBpbnB1dC0+a2V5Yml0KTsKLQotCS8qIEVuYWJsZSBhbGwgbmVlZGVkIGtleXMgKi8KLQlmb3IgKHRyYW5zID0gcG93ZXJib29rX2ZuX2tleXM7IHRyYW5zLT5mcm9tOyB0cmFucysrKQotCQlzZXRfYml0KHRyYW5zLT50bywgaW5wdXQtPmtleWJpdCk7Ci0KLQlmb3IgKHRyYW5zID0gcG93ZXJib29rX251bWxvY2tfa2V5czsgdHJhbnMtPmZyb207IHRyYW5zKyspCi0JCXNldF9iaXQodHJhbnMtPnRvLCBpbnB1dC0+a2V5Yml0KTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBoaWRpbnB1dF9wYl9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwKLQkJCQkgICAgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGlkaW5wdXRfcGJfc2V0dXAoc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCi17Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgaGlkaW5wdXRfY29uZmlndXJlX3VzYWdlKHN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKLQkJCQkgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlKQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gaGlkaW5wdXQtPmlucHV0OwotCXN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UgPSBpbnB1dC0+cHJpdmF0ZTsKLQlpbnQgbWF4ID0gMCwgY29kZTsKLQl1bnNpZ25lZCBsb25nICpiaXQgPSBOVUxMOwotCi0JZmllbGQtPmhpZGlucHV0ID0gaGlkaW5wdXQ7Ci0KLSNpZmRlZiBERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJNYXBwaW5nOiAiKTsKLQlyZXNvbHZfdXNhZ2UodXNhZ2UtPmhpZCk7Ci0JcHJpbnRrKCIgLS0tPiAiKTsKLSNlbmRpZgotCi0JaWYgKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fQ09OU1RBTlQpCi0JCWdvdG8gaWdub3JlOwotCi0Jc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFX1BBR0UpIHsKLQotCQljYXNlIEhJRF9VUF9VTkRFRklORUQ6Ci0JCQlnb3RvIGlnbm9yZTsKLQotCQljYXNlIEhJRF9VUF9LRVlCT0FSRDoKLQotCQkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7Ci0KLQkJCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgPCAyNTYpIHsKLQkJCQlpZiAoIWhpZF9rZXlib2FyZFt1c2FnZS0+aGlkICYgSElEX1VTQUdFXSkgZ290byBpZ25vcmU7Ci0JCQkJbWFwX2tleV9jbGVhcihoaWRfa2V5Ym9hcmRbdXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV0pOwotCQkJfSBlbHNlCi0JCQkJbWFwX2tleShLRVlfVU5LTk9XTik7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSElEX1VQX0JVVFRPTjoKLQotCQkJY29kZSA9ICgodXNhZ2UtPmhpZCAtIDEpICYgMHhmKTsKLQotCQkJc3dpdGNoIChmaWVsZC0+YXBwbGljYXRpb24pIHsKLQkJCQljYXNlIEhJRF9HRF9NT1VTRToKLQkJCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSAweDExMDsgYnJlYWs7Ci0JCQkJY2FzZSBISURfR0RfSk9ZU1RJQ0s6IGNvZGUgKz0gMHgxMjA7IGJyZWFrOwotCQkJCWNhc2UgSElEX0dEX0dBTUVQQUQ6ICBjb2RlICs9IDB4MTMwOyBicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlzd2l0Y2ggKGZpZWxkLT5waHlzaWNhbCkgewotCQkJCQkJY2FzZSBISURfR0RfTU9VU0U6Ci0JCQkJCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSAweDExMDsgYnJlYWs7Ci0JCQkJCQljYXNlIEhJRF9HRF9KT1lTVElDSzogY29kZSArPSAweDEyMDsgYnJlYWs7Ci0JCQkJCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSAweDEzMDsgYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OiAgICAgICAgICAgICAgY29kZSArPSAweDEwMDsKLQkJCQkJfQotCQkJfQotCi0JCQltYXBfa2V5KGNvZGUpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIEhJRF9VUF9TSU1VTEFUSU9OOgotCi0JCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGZmZmYpIHsKLQkJCQljYXNlIDB4YmE6IG1hcF9hYnMoQUJTX1JVRERFUik7ICAgYnJlYWs7Ci0JCQkJY2FzZSAweGJiOiBtYXBfYWJzKEFCU19USFJPVFRMRSk7IGJyZWFrOwotCQkJCWNhc2UgMHhjNDogbWFwX2FicyhBQlNfR0FTKTsgICAgICBicmVhazsKLQkJCQljYXNlIDB4YzU6IG1hcF9hYnMoQUJTX0JSQUtFKTsgICAgYnJlYWs7Ci0JCQkJY2FzZSAweGM4OiBtYXBfYWJzKEFCU19XSEVFTCk7ICAgIGJyZWFrOwotCQkJCWRlZmF1bHQ6ICAgZ290byBpZ25vcmU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9HRU5ERVNLOgotCi0JCQlpZiAoKHVzYWdlLT5oaWQgJiAweGYwKSA9PSAweDgwKSB7CS8qIFN5c3RlbUNvbnRyb2wgKi8KLQkJCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiAweGYpIHsKLQkJCQkJY2FzZSAweDE6IG1hcF9rZXlfY2xlYXIoS0VZX1BPV0VSKTsgIGJyZWFrOwotCQkJCQljYXNlIDB4MjogbWFwX2tleV9jbGVhcihLRVlfU0xFRVApOyAgYnJlYWs7Ci0JCQkJCWNhc2UgMHgzOiBtYXBfa2V5X2NsZWFyKEtFWV9XQUtFVVApOyBicmVhazsKLQkJCQkJZGVmYXVsdDogZ290byB1bmtub3duOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKCh1c2FnZS0+aGlkICYgMHhmMCkgPT0gMHg5MCkgewkvKiBELXBhZCAqLwotCQkJCXN3aXRjaCAodXNhZ2UtPmhpZCkgewotCQkJCQljYXNlIEhJRF9HRF9VUDoJICAgdXNhZ2UtPmhhdF9kaXIgPSAxOyBicmVhazsKLQkJCQkJY2FzZSBISURfR0RfRE9XTjogIHVzYWdlLT5oYXRfZGlyID0gNTsgYnJlYWs7Ci0JCQkJCWNhc2UgSElEX0dEX1JJR0hUOiB1c2FnZS0+aGF0X2RpciA9IDM7IGJyZWFrOwotCQkJCQljYXNlIEhJRF9HRF9MRUZUOiAgdXNhZ2UtPmhhdF9kaXIgPSA3OyBicmVhazsKLQkJCQkJZGVmYXVsdDogZ290byB1bmtub3duOwotCQkJCX0KLQkJCQlpZiAoZmllbGQtPmRwYWQpIHsKLQkJCQkJbWFwX2FicyhmaWVsZC0+ZHBhZCk7Ci0JCQkJCWdvdG8gaWdub3JlOwotCQkJCX0KLQkJCQltYXBfYWJzKEFCU19IQVQwWCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAodXNhZ2UtPmhpZCkgewotCi0JCQkJLyogVGhlc2UgdXNhZ2UgSURzIG1hcCBkaXJlY3RseSB0byB0aGUgdXNhZ2UgY29kZXMuICovCi0JCQkJY2FzZSBISURfR0RfWDogY2FzZSBISURfR0RfWTogY2FzZSBISURfR0RfWjoKLQkJCQljYXNlIEhJRF9HRF9SWDogY2FzZSBISURfR0RfUlk6IGNhc2UgSElEX0dEX1JaOgotCQkJCWNhc2UgSElEX0dEX1NMSURFUjogY2FzZSBISURfR0RfRElBTDogY2FzZSBISURfR0RfV0hFRUw6Ci0JCQkJCWlmIChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKQotCQkJCQkJbWFwX3JlbCh1c2FnZS0+aGlkICYgMHhmKTsKLQkJCQkJZWxzZQotCQkJCQkJbWFwX2Ficyh1c2FnZS0+aGlkICYgMHhmKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEhJRF9HRF9IQVRTV0lUQ0g6Ci0JCQkJCXVzYWdlLT5oYXRfbWluID0gZmllbGQtPmxvZ2ljYWxfbWluaW11bTsKLQkJCQkJdXNhZ2UtPmhhdF9tYXggPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtOwotCQkJCQltYXBfYWJzKEFCU19IQVQwWCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBISURfR0RfU1RBUlQ6CW1hcF9rZXlfY2xlYXIoQlROX1NUQVJUKTsJYnJlYWs7Ci0JCQkJY2FzZSBISURfR0RfU0VMRUNUOgltYXBfa2V5X2NsZWFyKEJUTl9TRUxFQ1QpOwlicmVhazsKLQotCQkJCWRlZmF1bHQ6IGdvdG8gdW5rbm93bjsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBISURfVVBfTEVEOgotCQkJaWYgKCgodXNhZ2UtPmhpZCAtIDEpICYgMHhmZmZmKSA+PSBMRURfTUFYKQotCQkJCWdvdG8gaWdub3JlOwotCQkJbWFwX2xlZCgodXNhZ2UtPmhpZCAtIDEpICYgMHhmZmZmKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSElEX1VQX0RJR0lUSVpFUjoKLQotCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgMHhmZikgewotCi0JCQkJY2FzZSAweDMwOiAvKiBUaXBQcmVzc3VyZSAqLwotCQkJCQlpZiAoIXRlc3RfYml0KEJUTl9UT1VDSCwgaW5wdXQtPmtleWJpdCkpIHsKLQkJCQkJCWRldmljZS0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT1RPVUNIOwotCQkJCQkJc2V0X2JpdChFVl9LRVksIGlucHV0LT5ldmJpdCk7Ci0JCQkJCQlzZXRfYml0KEJUTl9UT1VDSCwgaW5wdXQtPmtleWJpdCk7Ci0JCQkJCX0KLQotCQkJCQltYXBfYWJzX2NsZWFyKEFCU19QUkVTU1VSRSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSAweDMyOiAvKiBJblJhbmdlICovCi0JCQkJCXN3aXRjaCAoZmllbGQtPnBoeXNpY2FsICYgMHhmZikgewotCQkJCQkJY2FzZSAweDIxOiBtYXBfa2V5KEJUTl9UT09MX01PVVNFKTsgYnJlYWs7Ci0JCQkJCQljYXNlIDB4MjI6IG1hcF9rZXkoQlROX1RPT0xfRklOR0VSKTsgYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OiBtYXBfa2V5KEJUTl9UT09MX1BFTik7IGJyZWFrOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSAweDNjOiAvKiBJbnZlcnQgKi8KLQkJCQkJbWFwX2tleV9jbGVhcihCVE5fVE9PTF9SVUJCRVIpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgMHgzMzogLyogVG91Y2ggKi8KLQkJCQljYXNlIDB4NDI6IC8qIFRpcFN3aXRjaCAqLwotCQkJCWNhc2UgMHg0MzogLyogVGlwU3dpdGNoMiAqLwotCQkJCQlkZXZpY2UtPnF1aXJrcyAmPSB+SElEX1FVSVJLX05PVE9VQ0g7Ci0JCQkJCW1hcF9rZXlfY2xlYXIoQlROX1RPVUNIKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIDB4NDQ6IC8qIEJhcnJlbFN3aXRjaCAqLwotCQkJCQltYXBfa2V5X2NsZWFyKEJUTl9TVFlMVVMpOwotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6ICBnb3RvIHVua25vd247Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9DT05TVU1FUjoJLyogVVNCIEhVVCB2MS4xLCBwYWdlcyA1Ni02MiAqLwotCi0JCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJCQljYXNlIDB4MDAwOiBnb3RvIGlnbm9yZTsKLQkJCQljYXNlIDB4MDM0OiBtYXBfa2V5X2NsZWFyKEtFWV9TTEVFUCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDM2OiBtYXBfa2V5X2NsZWFyKEJUTl9NSVNDKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwNDU6IG1hcF9rZXlfY2xlYXIoS0VZX1JBRElPKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOGE6IG1hcF9rZXlfY2xlYXIoS0VZX1dXVyk7CQlicmVhazsKLQkJCQljYXNlIDB4MDhkOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HUkFNKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwOTU6IG1hcF9rZXlfY2xlYXIoS0VZX0hFTFApOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA5YzogbWFwX2tleV9jbGVhcihLRVlfQ0hBTk5FTFVQKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDA5ZDogbWFwX2tleV9jbGVhcihLRVlfQ0hBTk5FTERPV04pOwlicmVhazsKLQkJCQljYXNlIDB4MGIwOiBtYXBfa2V5X2NsZWFyKEtFWV9QTEFZKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwYjE6IG1hcF9rZXlfY2xlYXIoS0VZX1BBVVNFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwYjI6IG1hcF9rZXlfY2xlYXIoS0VZX1JFQ09SRCk7CQlicmVhazsKLQkJCQljYXNlIDB4MGIzOiBtYXBfa2V5X2NsZWFyKEtFWV9GQVNURk9SV0FSRCk7CWJyZWFrOwotCQkJCWNhc2UgMHgwYjQ6IG1hcF9rZXlfY2xlYXIoS0VZX1JFV0lORCk7CQlicmVhazsKLQkJCQljYXNlIDB4MGI1OiBtYXBfa2V5X2NsZWFyKEtFWV9ORVhUU09ORyk7CWJyZWFrOwotCQkJCWNhc2UgMHgwYjY6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVZJT1VTU09ORyk7CWJyZWFrOwotCQkJCWNhc2UgMHgwYjc6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1BDRCk7CQlicmVhazsKLQkJCQljYXNlIDB4MGI4OiBtYXBfa2V5X2NsZWFyKEtFWV9FSkVDVENEKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwY2Q6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVlQQVVTRSk7CWJyZWFrOwotCQkJICAgICAgICBjYXNlIDB4MGUwOiBtYXBfYWJzX2NsZWFyKEFCU19WT0xVTUUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDBlMjogbWFwX2tleV9jbGVhcihLRVlfTVVURSk7CQlicmVhazsKLQkJCQljYXNlIDB4MGU1OiBtYXBfa2V5X2NsZWFyKEtFWV9CQVNTQk9PU1QpOwlicmVhazsKLQkJCQljYXNlIDB4MGU5OiBtYXBfa2V5X2NsZWFyKEtFWV9WT0xVTUVVUCk7CWJyZWFrOwotCQkJCWNhc2UgMHgwZWE6IG1hcF9rZXlfY2xlYXIoS0VZX1ZPTFVNRURPV04pOwlicmVhazsKLQkJCQljYXNlIDB4MTgzOiBtYXBfa2V5X2NsZWFyKEtFWV9DT05GSUcpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDE4YTogbWFwX2tleV9jbGVhcihLRVlfTUFJTCk7CQlicmVhazsKLQkJCQljYXNlIDB4MTkyOiBtYXBfa2V5X2NsZWFyKEtFWV9DQUxDKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgxOTQ6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTEUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDFhNzogbWFwX2tleV9jbGVhcihLRVlfRE9DVU1FTlRTKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDIwMTogbWFwX2tleV9jbGVhcihLRVlfTkVXKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMDc6IG1hcF9rZXlfY2xlYXIoS0VZX1NBVkUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIwODogbWFwX2tleV9jbGVhcihLRVlfUFJJTlQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIwOTogbWFwX2tleV9jbGVhcihLRVlfUFJPUFMpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIxYTogbWFwX2tleV9jbGVhcihLRVlfVU5ETyk7CQlicmVhazsKLQkJCQljYXNlIDB4MjFiOiBtYXBfa2V5X2NsZWFyKEtFWV9DT1BZKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMWM6IG1hcF9rZXlfY2xlYXIoS0VZX0NVVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjFkOiBtYXBfa2V5X2NsZWFyKEtFWV9QQVNURSk7CQlicmVhazsKLQkJCQljYXNlIDB4MjIxOiBtYXBfa2V5X2NsZWFyKEtFWV9GSU5EKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMjM6IG1hcF9rZXlfY2xlYXIoS0VZX0hPTUVQQUdFKTsJYnJlYWs7Ci0JCQkJY2FzZSAweDIyNDogbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7CQlicmVhazsKLQkJCQljYXNlIDB4MjI1OiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJEKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgyMjY6IG1hcF9rZXlfY2xlYXIoS0VZX1NUT1ApOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDIyNzogbWFwX2tleV9jbGVhcihLRVlfUkVGUkVTSCk7CQlicmVhazsKLQkJCQljYXNlIDB4MjJhOiBtYXBfa2V5X2NsZWFyKEtFWV9CT09LTUFSS1MpOwlicmVhazsKLQkJCQljYXNlIDB4MjMzOiBtYXBfa2V5X2NsZWFyKEtFWV9TQ1JPTExVUCk7CWJyZWFrOwotCQkJCWNhc2UgMHgyMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NDUk9MTERPV04pOwlicmVhazsKLQkJCQljYXNlIDB4MjM4OiBtYXBfcmVsKFJFTF9IV0hFRUwpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDI3OTogbWFwX2tleV9jbGVhcihLRVlfUkVETyk7CQlicmVhazsKLQkJCQljYXNlIDB4Mjg5OiBtYXBfa2V5X2NsZWFyKEtFWV9SRVBMWSk7CQlicmVhazsKLQkJCQljYXNlIDB4MjhiOiBtYXBfa2V5X2NsZWFyKEtFWV9GT1JXQVJETUFJTCk7CWJyZWFrOwotCQkJCWNhc2UgMHgyOGM6IG1hcF9rZXlfY2xlYXIoS0VZX1NFTkQpOwkJYnJlYWs7Ci0KLQkJCQkvKiBSZXBvcnRlZCBvbiBhIENoZXJyeSBDeW1vdGlvbiBrZXlib2FyZCAqLwotCQkJCWNhc2UgMHgzMDE6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cxKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgzMDI6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0cyKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgzMDM6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0czKTsJCWJyZWFrOwotCi0JCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9IUFZFTkRPUjoJLyogUmVwb3J0ZWQgb24gYSBEdXRjaCBsYXlvdXQgSFA1MzA4ICovCi0KLQkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOwotCQkJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCQkgICAgICAgIGNhc2UgMHgwMjE6IG1hcF9rZXlfY2xlYXIoS0VZX1BSSU5UKTsgICAgICAgICAgIGJyZWFrOwotCQkJCWNhc2UgMHgwNzA6IG1hcF9rZXlfY2xlYXIoS0VZX0hQKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwNzE6IG1hcF9rZXlfY2xlYXIoS0VZX0NBTUVSQSk7CQlicmVhazsKLQkJCQljYXNlIDB4MDcyOiBtYXBfa2V5X2NsZWFyKEtFWV9TT1VORCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDczOiBtYXBfa2V5X2NsZWFyKEtFWV9RVUVTVElPTik7CWJyZWFrOwotCQkJCWNhc2UgMHgwODA6IG1hcF9rZXlfY2xlYXIoS0VZX0VNQUlMKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwODE6IG1hcF9rZXlfY2xlYXIoS0VZX0NIQVQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4MjogbWFwX2tleV9jbGVhcihLRVlfU0VBUkNIKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwODM6IG1hcF9rZXlfY2xlYXIoS0VZX0NPTk5FQ1QpOwkgICAgICAgIGJyZWFrOwotCQkJCWNhc2UgMHgwODQ6IG1hcF9rZXlfY2xlYXIoS0VZX0ZJTkFOQ0UpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4NTogbWFwX2tleV9jbGVhcihLRVlfU1BPUlQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA4NjogbWFwX2tleV9jbGVhcihLRVlfU0hPUCk7CSAgICAgICAgYnJlYWs7Ci0JCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9NU1ZFTkRPUjoKLQkJCWdvdG8gaWdub3JlOwotCi0JCWNhc2UgSElEX1VQX0NVU1RPTTogLyogUmVwb3J0ZWQgb24gTG9naXRlY2ggYW5kIFBvd2VyYm9vayBVU0Iga2V5Ym9hcmRzICovCi0KLQkJCXNldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOwotCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJCQljYXNlIDB4MDAzOgotCQkJCQkvKiBUaGUgZm4ga2V5IG9uIEFwcGxlIFBvd2VyQm9va3MgKi8KLQkJCQkJbWFwX2tleV9jbGVhcihLRVlfRk4pOwotCQkJCQloaWRpbnB1dF9wYl9zZXR1cChpbnB1dCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhJRF9VUF9MT0dJVkVORE9SOiAvKiBSZXBvcnRlZCBvbiBMb2dpdGVjaCBVbHRyYSBYIE1lZGlhIFJlbW90ZSAqLwotCi0JCQlzZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKLQkJCXN3aXRjaCh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7Ci0JCQkJY2FzZSAweDAwNDogbWFwX2tleV9jbGVhcihLRVlfQUdBSU4pOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDAwZDogbWFwX2tleV9jbGVhcihLRVlfSE9NRSk7CQlicmVhazsKLQkJCQljYXNlIDB4MDI0OiBtYXBfa2V5X2NsZWFyKEtFWV9TSFVGRkxFKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwMjU6IG1hcF9rZXlfY2xlYXIoS0VZX1RWKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwMjY6IG1hcF9rZXlfY2xlYXIoS0VZX01FTlUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDAzMTogbWFwX2tleV9jbGVhcihLRVlfQVVESU8pOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDAzMjogbWFwX2tleV9jbGVhcihLRVlfVEVYVCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDMzOiBtYXBfa2V5X2NsZWFyKEtFWV9MQVNUKTsJCWJyZWFrOwotCQkJCWNhc2UgMHgwNDc6IG1hcF9rZXlfY2xlYXIoS0VZX01QMyk7CQlicmVhazsKLQkJCQljYXNlIDB4MDQ4OiBtYXBfa2V5X2NsZWFyKEtFWV9EVkQpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA0OTogbWFwX2tleV9jbGVhcihLRVlfTUVESUEpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA0YTogbWFwX2tleV9jbGVhcihLRVlfVklERU8pOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA0YjogbWFwX2tleV9jbGVhcihLRVlfQU5HTEUpOwkJYnJlYWs7Ci0JCQkJY2FzZSAweDA0YzogbWFwX2tleV9jbGVhcihLRVlfTEFOR1VBR0UpOwlicmVhazsKLQkJCQljYXNlIDB4MDRkOiBtYXBfa2V5X2NsZWFyKEtFWV9TVUJUSVRMRSk7CWJyZWFrOwotCQkJCWNhc2UgMHgwNTE6IG1hcF9rZXlfY2xlYXIoS0VZX1JFRCk7CQlicmVhazsKLQkJCQljYXNlIDB4MDUyOiBtYXBfa2V5X2NsZWFyKEtFWV9DTE9TRSk7CQlicmVhazsKLQkJCQlkZWZhdWx0OiAgICBnb3RvIGlnbm9yZTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSElEX1VQX1BJRDoKLQotCQkJc3dpdGNoKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKLQkJCQljYXNlIDB4YTQ6IG1hcF9rZXlfY2xlYXIoQlROX0RFQUQpOwlicmVhazsKLQkJCQlkZWZhdWx0OiBnb3RvIGlnbm9yZTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCXVua25vd246Ci0JCQlpZiAoZmllbGQtPnJlcG9ydF9zaXplID09IDEpIHsKLQkJCQlpZiAoZmllbGQtPnJlcG9ydC0+dHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkgewotCQkJCQltYXBfbGVkKExFRF9NSVNDKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW1hcF9rZXkoQlROX01JU0MpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUpIHsKLQkJCQltYXBfcmVsKFJFTF9NSVNDKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1hcF9hYnMoQUJTX01JU0MpOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGRldmljZS0+cXVpcmtzICYgSElEX1FVSVJLX01JR0hUWU1PVVNFKSB7Ci0JCWlmICh1c2FnZS0+aGlkID09IEhJRF9HRF9aKQotCQkJbWFwX3JlbChSRUxfSFdIRUVMKTsKLQkJZWxzZSBpZiAodXNhZ2UtPmNvZGUgPT0gQlROXzEpCi0JCQltYXBfa2V5KEJUTl8yKTsKLQkJZWxzZSBpZiAodXNhZ2UtPmNvZGUgPT0gQlROXzIpCi0JCQltYXBfa2V5KEJUTl8xKTsKLQl9Ci0KLQlpZiAoKGRldmljZS0+cXVpcmtzICYgKEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183IHwgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzUpKSAmJgotCQkgKHVzYWdlLT50eXBlID09IEVWX1JFTCkgJiYgKHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkpCi0JCQlzZXRfYml0KFJFTF9IV0hFRUwsIGJpdCk7Ci0KLQlpZiAoKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA1KSkKLQkJfHwgKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA3KSkpCi0JCWdvdG8gaWdub3JlOwotCi0Jc2V0X2JpdCh1c2FnZS0+dHlwZSwgaW5wdXQtPmV2Yml0KTsKLQotCXdoaWxlICh1c2FnZS0+Y29kZSA8PSBtYXggJiYgdGVzdF9hbmRfc2V0X2JpdCh1c2FnZS0+Y29kZSwgYml0KSkKLQkJdXNhZ2UtPmNvZGUgPSBmaW5kX25leHRfemVyb19iaXQoYml0LCBtYXggKyAxLCB1c2FnZS0+Y29kZSk7Ci0KLQlpZiAodXNhZ2UtPmNvZGUgPiBtYXgpCi0JCWdvdG8gaWdub3JlOwotCi0KLQlpZiAodXNhZ2UtPnR5cGUgPT0gRVZfQUJTKSB7Ci0KLQkJaW50IGEgPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtOwotCQlpbnQgYiA9IGZpZWxkLT5sb2dpY2FsX21heGltdW07Ci0KLQkJaWYgKChkZXZpY2UtPnF1aXJrcyAmIEhJRF9RVUlSS19CQURQQUQpICYmICh1c2FnZS0+Y29kZSA9PSBBQlNfWCB8fCB1c2FnZS0+Y29kZSA9PSBBQlNfWSkpIHsKLQkJCWEgPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtID0gMDsKLQkJCWIgPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtID0gMjU1OwotCQl9Ci0KLQkJaWYgKGZpZWxkLT5hcHBsaWNhdGlvbiA9PSBISURfR0RfR0FNRVBBRCB8fCBmaWVsZC0+YXBwbGljYXRpb24gPT0gSElEX0dEX0pPWVNUSUNLKQotCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIHVzYWdlLT5jb2RlLCBhLCBiLCAoYiAtIGEpID4+IDgsIChiIC0gYSkgPj4gNCk7Ci0JCWVsc2UJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIHVzYWdlLT5jb2RlLCBhLCBiLCAwLCAwKTsKLQotCX0KLQotCWlmICh1c2FnZS0+dHlwZSA9PSBFVl9BQlMgJiYKLQkgICAgKHVzYWdlLT5oYXRfbWluIDwgdXNhZ2UtPmhhdF9tYXggfHwgdXNhZ2UtPmhhdF9kaXIpKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSB1c2FnZS0+Y29kZTsgaSA8IHVzYWdlLT5jb2RlICsgMiAmJiBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgaSwgLTEsIDEsIDAsIDApOwotCQkJc2V0X2JpdChpLCBpbnB1dC0+YWJzYml0KTsKLQkJfQotCQlpZiAodXNhZ2UtPmhhdF9kaXIgJiYgIWZpZWxkLT5kcGFkKQotCQkJZmllbGQtPmRwYWQgPSB1c2FnZS0+Y29kZTsKLQl9Ci0KLSNpZmRlZiBERUJVRwotCXJlc29sdl9ldmVudCh1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUpOwotCXByaW50aygiXG4iKTsKLSNlbmRpZgotCXJldHVybjsKLQotaWdub3JlOgotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJJR05PUkVEXG4iKTsKLSNlbmRpZgotCXJldHVybjsKLX0KLQotdm9pZCBoaWRpbnB1dF9oaWRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKLXsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKLQlpbnQgKnF1aXJrcyA9ICZoaWQtPnF1aXJrczsKLQotCWlmICghZmllbGQtPmhpZGlucHV0KQotCQlyZXR1cm47Ci0KLQlpbnB1dCA9IGZpZWxkLT5oaWRpbnB1dC0+aW5wdXQ7Ci0KLQlpZiAoIXVzYWdlLT50eXBlKQotCQlyZXR1cm47Ci0KLQlpZiAoKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA1KSkKLQkJfHwgKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183KSAmJiAodXNhZ2UtPmhpZCA9PSAweDAwMDkwMDA3KSkpIHsKLQkJaWYgKHZhbHVlKSBoaWQtPnF1aXJrcyB8PSAgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLX09OOwotCQllbHNlICAgICAgIGhpZC0+cXVpcmtzICY9IH5ISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT047Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX0lOVkVSVF9IV0hFRUwpICYmICh1c2FnZS0+Y29kZSA9PSBSRUxfSFdIRUVMKSkgewotCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCAtdmFsdWUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS19PTikgJiYgKHVzYWdlLT5jb2RlID09IFJFTF9XSEVFTCkpIHsKLQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCBSRUxfSFdIRUVMLCB2YWx1ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4pICYmIGhpZGlucHV0X3BiX2V2ZW50KGhpZCwgaW5wdXQsIHVzYWdlLCB2YWx1ZSkpCi0JCXJldHVybjsKLQotCWlmICh1c2FnZS0+aGF0X21pbiA8IHVzYWdlLT5oYXRfbWF4IHx8IHVzYWdlLT5oYXRfZGlyKSB7Ci0JCWludCBoYXRfZGlyID0gdXNhZ2UtPmhhdF9kaXI7Ci0JCWlmICghaGF0X2RpcikKLQkJCWhhdF9kaXIgPSAodmFsdWUgLSB1c2FnZS0+aGF0X21pbikgKiA4IC8gKHVzYWdlLT5oYXRfbWF4IC0gdXNhZ2UtPmhhdF9taW4gKyAxKSArIDE7Ci0JCWlmIChoYXRfZGlyIDwgMCB8fCBoYXRfZGlyID4gOCkgaGF0X2RpciA9IDA7Ci0JCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgdXNhZ2UtPmNvZGUgICAgLCBoaWRfaGF0X3RvX2F4aXNbaGF0X2Rpcl0ueCk7Ci0gICAgICAgICAgICAgICAgaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSArIDEsIGhpZF9oYXRfdG9fYXhpc1toYXRfZGlyXS55KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCWlmICh1c2FnZS0+aGlkID09IChISURfVVBfRElHSVRJWkVSIHwgMHgwMDNjKSkgeyAvKiBJbnZlcnQgKi8KLQkJKnF1aXJrcyA9IHZhbHVlID8gKCpxdWlya3MgfCBISURfUVVJUktfSU5WRVJUKSA6ICgqcXVpcmtzICYgfkhJRF9RVUlSS19JTlZFUlQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHVzYWdlLT5oaWQgPT0gKEhJRF9VUF9ESUdJVElaRVIgfCAweDAwMzIpKSB7IC8qIEluUmFuZ2UgKi8KLQkJaWYgKHZhbHVlKSB7Ci0JCQlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsICgqcXVpcmtzICYgSElEX1FVSVJLX0lOVkVSVCkgPyBCVE5fVE9PTF9SVUJCRVIgOiB1c2FnZS0+Y29kZSwgMSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgMCk7Ci0JCWlucHV0X2V2ZW50KGlucHV0LCB1c2FnZS0+dHlwZSwgQlROX1RPT0xfUlVCQkVSLCAwKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh1c2FnZS0+aGlkID09IChISURfVVBfRElHSVRJWkVSIHwgMHgwMDMwKSAmJiAoKnF1aXJrcyAmIEhJRF9RVUlSS19OT1RPVUNIKSkgeyAvKiBQcmVzc3VyZSAqLwotCQlpbnQgYSA9IGZpZWxkLT5sb2dpY2FsX21pbmltdW07Ci0JCWludCBiID0gZmllbGQtPmxvZ2ljYWxfbWF4aW11bTsKLQkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX0tFWSwgQlROX1RPVUNILCB2YWx1ZSA+IGEgKyAoKGIgLSBhKSA+PiAzKSk7Ci0JfQotCi0JaWYgKHVzYWdlLT5oaWQgPT0gKEhJRF9VUF9QSUQgfCAweDgzVUwpKSB7IC8qIFNpbXVsdGFuZW91cyBFZmZlY3RzIE1heCAqLwotCQlkYmcoIk1heGltdW0gRWZmZWN0cyAtICVkIix2YWx1ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodXNhZ2UtPmhpZCA9PSAoSElEX1VQX1BJRCB8IDB4N2ZVTCkpIHsKLQkJZGJnKCJQSUQgUG9vbCBSZXBvcnRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCh1c2FnZS0+dHlwZSA9PSBFVl9LRVkpICYmICh1c2FnZS0+Y29kZSA9PSAwKSkgLyogS2V5IDAgaXMgInVuYXNzaWduZWQiLCBub3QgS0VZX1VOS05PV04gKi8KLQkJcmV0dXJuOwotCi0JaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgdmFsdWUpOwotCi0JaWYgKChmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKSAmJiAodXNhZ2UtPnR5cGUgPT0gRVZfS0VZKSkKLQkJaW5wdXRfZXZlbnQoaW5wdXQsIHVzYWdlLT50eXBlLCB1c2FnZS0+Y29kZSwgMCk7Ci19Ci0KLXZvaWQgaGlkaW5wdXRfcmVwb3J0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpCi17Ci0Jc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhpZGlucHV0LCAmaGlkLT5pbnB1dHMsIGxpc3QpCi0JCWlucHV0X3N5bmMoaGlkaW5wdXQtPmlucHV0KTsKLX0KLQotc3RhdGljIGludCBoaWRpbnB1dF9maW5kX2ZpZWxkKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgc3RydWN0IGhpZF9maWVsZCAqKmZpZWxkKQotewotCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Ci0JaW50IGksIGo7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0LCBsaXN0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCByZXBvcnQtPm1heGZpZWxkOyBpKyspIHsKLQkJCSpmaWVsZCA9IHJlcG9ydC0+ZmllbGRbaV07Ci0JCQlmb3IgKGogPSAwOyBqIDwgKCpmaWVsZCktPm1heHVzYWdlOyBqKyspCi0JCQkJaWYgKCgqZmllbGQpLT51c2FnZVtqXS50eXBlID09IHR5cGUgJiYgKCpmaWVsZCktPnVzYWdlW2pdLmNvZGUgPT0gY29kZSkKLQkJCQkJcmV0dXJuIGo7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGhpZGlucHV0X2lucHV0X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZDsKLQlpbnQgb2Zmc2V0OwotCi0JaWYgKHR5cGUgPT0gRVZfRkYpCi0JCXJldHVybiBpbnB1dF9mZl9ldmVudChkZXYsIHR5cGUsIGNvZGUsIHZhbHVlKTsKLQotCWlmICh0eXBlICE9IEVWX0xFRCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKChvZmZzZXQgPSBoaWRpbnB1dF9maW5kX2ZpZWxkKGhpZCwgdHlwZSwgY29kZSwgJmZpZWxkKSkgPT0gLTEpIHsKLQkJd2FybigiZXZlbnQgZmllbGQgbm90IGZvdW5kIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQloaWRfc2V0X2ZpZWxkKGZpZWxkLCBvZmZzZXQsIHZhbHVlKTsKLQloaWRfc3VibWl0X3JlcG9ydChoaWQsIGZpZWxkLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhpZGlucHV0X29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBkZXYtPnByaXZhdGU7Ci0JcmV0dXJuIGhpZF9vcGVuKGhpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpZGlucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gZGV2LT5wcml2YXRlOwotCWhpZF9jbG9zZShoaWQpOwotfQotCi0vKgotICogUmVnaXN0ZXIgdGhlIGlucHV0IGRldmljZTsgcHJpbnQgYSBtZXNzYWdlLgotICogQ29uZmlndXJlIHRoZSBpbnB1dCBsYXllciBpbnRlcmZhY2UKLSAqIFJlYWQgYWxsIHJlcG9ydHMgYW5kIGluaXRpYWxpemUgdGhlIGFic29sdXRlIGZpZWxkIHZhbHVlcy4KLSAqLwotCi1pbnQgaGlkaW5wdXRfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBoaWQtPmRldjsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gTlVMTDsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7Ci0JaW50IGksIGosIGs7Ci0KLQlJTklUX0xJU1RfSEVBRCgmaGlkLT5pbnB1dHMpOwotCi0JZm9yIChpID0gMDsgaSA8IGhpZC0+bWF4Y29sbGVjdGlvbjsgaSsrKQotCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0gSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gfHwKLQkJICAgIGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09IEhJRF9DT0xMRUNUSU9OX1BIWVNJQ0FMKQotCQkJaWYgKElTX0lOUFVUX0FQUExJQ0FUSU9OKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSkpCi0JCQkJYnJlYWs7Ci0KLQlpZiAoaSA9PSBoaWQtPm1heGNvbGxlY3Rpb24pCi0JCXJldHVybiAtMTsKLQotCWZvciAoayA9IEhJRF9JTlBVVF9SRVBPUlQ7IGsgPD0gSElEX09VVFBVVF9SRVBPUlQ7IGsrKykKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsICZoaWQtPnJlcG9ydF9lbnVtW2tdLnJlcG9ydF9saXN0LCBsaXN0KSB7Ci0KLQkJCWlmICghcmVwb3J0LT5tYXhmaWVsZCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFoaWRpbnB1dCkgewotCQkJCWhpZGlucHV0ID0ga3phbGxvYyhzaXplb2YoKmhpZGlucHV0KSwgR0ZQX0tFUk5FTCk7Ci0JCQkJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JCQkJaWYgKCFoaWRpbnB1dCB8fCAhaW5wdXRfZGV2KSB7Ci0JCQkJCWtmcmVlKGhpZGlucHV0KTsKLQkJCQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJCQkJZXJyKCJPdXQgb2YgbWVtb3J5IGR1cmluZyBoaWQgaW5wdXQgcHJvYmUiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCWlucHV0X2Rldi0+cHJpdmF0ZSA9IGhpZDsKLQkJCQlpbnB1dF9kZXYtPmV2ZW50ID0gaGlkaW5wdXRfaW5wdXRfZXZlbnQ7Ci0JCQkJaW5wdXRfZGV2LT5vcGVuID0gaGlkaW5wdXRfb3BlbjsKLQkJCQlpbnB1dF9kZXYtPmNsb3NlID0gaGlkaW5wdXRfY2xvc2U7Ci0KLQkJCQlpbnB1dF9kZXYtPm5hbWUgPSBoaWQtPm5hbWU7Ci0JCQkJaW5wdXRfZGV2LT5waHlzID0gaGlkLT5waHlzOwotCQkJCWlucHV0X2Rldi0+dW5pcSA9IGhpZC0+dW5pcTsKLQkJCQl1c2JfdG9faW5wdXRfaWQoZGV2LCAmaW5wdXRfZGV2LT5pZCk7Ci0JCQkJaW5wdXRfZGV2LT5jZGV2LmRldiA9ICZoaWQtPmludGYtPmRldjsKLQotCQkJCWhpZGlucHV0LT5pbnB1dCA9IGlucHV0X2RldjsKLQkJCQlsaXN0X2FkZF90YWlsKCZoaWRpbnB1dC0+bGlzdCwgJmhpZC0+aW5wdXRzKTsKLQkJCX0KLQotCQkJZm9yIChpID0gMDsgaSA8IHJlcG9ydC0+bWF4ZmllbGQ7IGkrKykKLQkJCQlmb3IgKGogPSAwOyBqIDwgcmVwb3J0LT5maWVsZFtpXS0+bWF4dXNhZ2U7IGorKykKLQkJCQkJaGlkaW5wdXRfY29uZmlndXJlX3VzYWdlKGhpZGlucHV0LCByZXBvcnQtPmZpZWxkW2ldLAotCQkJCQkJCQkgcmVwb3J0LT5maWVsZFtpXS0+dXNhZ2UgKyBqKTsKLQotCQkJaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX01VTFRJX0lOUFVUKSB7Ci0JCQkJLyogVGhpcyB3aWxsIGxlYXZlIGhpZGlucHV0IE5VTEwsIHNvIHRoYXQgaXQKLQkJCQkgKiBhbGxvY2F0ZXMgYW5vdGhlciBvbmUgaWYgd2UgaGF2ZSBtb3JlIGlucHV0cyBvbgotCQkJCSAqIHRoZSBzYW1lIGludGVyZmFjZS4gU29tZSBkZXZpY2VzIChlLmcuIEhhcHAncwotCQkJCSAqIFVHQ0kpIGNyYW0gYSBsb3Qgb2YgdW5yZWxhdGVkIGlucHV0cyBpbnRvIHRoZQotCQkJCSAqIHNhbWUgaW50ZXJmYWNlLiAqLwotCQkJCWhpZGlucHV0LT5yZXBvcnQgPSByZXBvcnQ7Ci0JCQkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGhpZGlucHV0LT5pbnB1dCk7Ci0JCQkJaGlkaW5wdXQgPSBOVUxMOwotCQkJfQotCQl9Ci0KLQkvKiBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgd2hlbiB3ZSBhcmUgYSBzaW5nbGUtaW5wdXQgKG1vc3Qgb2YgdGhlCi0JICogdGltZSkuIElPVywgbm90IGEgSElEX1FVSVJLX01VTFRJX0lOUFVULiBUaGUgaGlkX2ZmX2luaXQoKSBpcwotCSAqIG9ubHkgdXNlZnVsIGluIHRoaXMgY2FzZSwgYW5kIG5vdCBmb3IgbXVsdGktaW5wdXQgcXVpcmtzLiAqLwotCWlmIChoaWRpbnB1dCkgewotCQloaWRfZmZfaW5pdChoaWQpOwotCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaGlkaW5wdXQtPmlucHV0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBoaWRpbnB1dF9kaXNjb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCi17Ci0Jc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQsICpuZXh0OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhpZGlucHV0LCBuZXh0LCAmaGlkLT5pbnB1dHMsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmhpZGlucHV0LT5saXN0KTsKLQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaGlkaW5wdXQtPmlucHV0KTsKLQkJa2ZyZWUoaGlkaW5wdXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1sZ2ZmLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtbGdmZi5jCmluZGV4IDkzZGEyMjIuLmU0NzQ2NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1sZ2ZmLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWxnZmYuYwpAQCAtMjksNyArMjksOCBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlICJoaWQuaCIKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlICJ1c2JoaWQuaCIKIAogc3RydWN0IGRldmljZV90eXBlIHsKIAl1MTYgaWRWZW5kb3I7CkBAIC03NSw3ICs3Niw3IEBACiAJCXJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzJdID0geDsKIAkJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbM10gPSB5OwogCQlkYmcoIih4LCB5KT0oJTA0eCwgJTA0eCkiLCB4LCB5KTsKLQkJaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKKwkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAkJYnJlYWs7CiAKIAljYXNlIEZGX1JVTUJMRToKQEAgLTkwLDcgKzkxLDcgQEAKIAkJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSBsZWZ0OwogCQlyZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVszXSA9IHJpZ2h0OwogCQlkYmcoIihsZWZ0LCByaWdodCk9KCUwNHgsICUwNHgpIiwgbGVmdCwgcmlnaHQpOwotCQloaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtcGlkZmYuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1waWRmZi5jCmluZGV4IDU0MjBjMTMuLmNiZDJkNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1waWRmZi5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1waWRmZi5jCkBAIC0yOCw3ICsyOCw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KIAotI2luY2x1ZGUgImhpZC5oIgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorCisjaW5jbHVkZSAidXNiaGlkLmgiCiAKICNkZWZpbmUJUElEX0VGRkVDVFNfTUFYCQk2NAogCkBAIC0yNjAsNyArMjYyLDcgQEAKIAlkZWJ1ZygiYXR0YWNrICV1ID0+ICVkIiwgZW52ZWxvcGUtPmF0dGFja19sZXZlbCwKIAkgICAgICBwaWRmZi0+c2V0X2VudmVsb3BlW1BJRF9BVFRBQ0tfTEVWRUxdLnZhbHVlWzBdKTsKIAotCWhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9TRVRfRU5WRUxPUEVdLAorCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9TRVRfRU5WRUxPUEVdLAogCQkJICBVU0JfRElSX09VVCk7CiB9CiAKQEAgLTI4Nyw3ICsyODksNyBAQAogCXBpZGZmX3NldF9zaWduZWQoJnBpZGZmLT5zZXRfY29uc3RhbnRbUElEX01BR05JVFVERV0sCiAJCQkgZWZmZWN0LT51LmNvbnN0YW50LmxldmVsKTsKIAotCWhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9TRVRfQ09OU1RBTlRdLAorCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9TRVRfQ09OU1RBTlRdLAogCQkJICBVU0JfRElSX09VVCk7CiB9CiAKQEAgLTMyMiw3ICszMjQsNyBAQAogCQkJCXBpZGZmLT5lZmZlY3RfZGlyZWN0aW9uKTsKIAlwaWRmZi0+c2V0X2VmZmVjdFtQSURfU1RBUlRfREVMQVldLnZhbHVlWzBdID0gZWZmZWN0LT5yZXBsYXkuZGVsYXk7CiAKLQloaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfU0VUX0VGRkVDVF0sCisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1NFVF9FRkZFQ1RdLAogCQkJICBVU0JfRElSX09VVCk7CiB9CiAKQEAgLTM1NCw3ICszNTYsNyBAQAogCXBpZGZmX3NldCgmcGlkZmYtPnNldF9wZXJpb2RpY1tQSURfUEhBU0VdLCBlZmZlY3QtPnUucGVyaW9kaWMucGhhc2UpOwogCXBpZGZmLT5zZXRfcGVyaW9kaWNbUElEX1BFUklPRF0udmFsdWVbMF0gPSBlZmZlY3QtPnUucGVyaW9kaWMucGVyaW9kOwogCi0JaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1NFVF9QRVJJT0RJQ10sCisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1NFVF9QRVJJT0RJQ10sCiAJCQkgIFVTQl9ESVJfT1VUKTsKIAogfQpAQCAtMzk2LDggKzM5OCw4IEBACiAJCQkgIGVmZmVjdC0+dS5jb25kaXRpb25baV0ubGVmdF9zYXR1cmF0aW9uKTsKIAkJcGlkZmZfc2V0KCZwaWRmZi0+c2V0X2NvbmRpdGlvbltQSURfREVBRF9CQU5EXSwKIAkJCSAgZWZmZWN0LT51LmNvbmRpdGlvbltpXS5kZWFkYmFuZCk7Ci0JCWhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOwotCQloaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfU0VUX0NPTkRJVElPTl0sCisJCXVzYmhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfU0VUX0NPTkRJVElPTl0sCiAJCQkJICBVU0JfRElSX09VVCk7CiAJfQogfQpAQCAtNDM4LDcgKzQ0MCw3IEBACiAJCQkgZWZmZWN0LT51LnJhbXAuc3RhcnRfbGV2ZWwpOwogCXBpZGZmX3NldF9zaWduZWQoJnBpZGZmLT5zZXRfcmFtcFtQSURfUkFNUF9FTkRdLAogCQkJIGVmZmVjdC0+dS5yYW1wLmVuZF9sZXZlbCk7Ci0JaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1NFVF9SQU1QXSwKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfU0VUX1JBTVBdLAogCQkJICBVU0JfRElSX09VVCk7CiB9CiAKQEAgLTQ2MywxOSArNDY1LDE5IEBACiAJaW50IGo7CiAKIAlwaWRmZi0+Y3JlYXRlX25ld19lZmZlY3RfdHlwZS0+dmFsdWVbMF0gPSBlZm51bTsKLQloaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfQ1JFQVRFX05FV19FRkZFQ1RdLAorCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9DUkVBVEVfTkVXX0VGRkVDVF0sCiAJCQkgIFVTQl9ESVJfT1VUKTsKIAlkZWJ1ZygiY3JlYXRlX25ld19lZmZlY3Qgc2VudCwgdHlwZTogJWQiLCBlZm51bSk7CiAKIAlwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS52YWx1ZVswXSA9IDA7CiAJcGlkZmYtPmJsb2NrX2xvYWRfc3RhdHVzLT52YWx1ZVswXSA9IDA7Ci0JaGlkX3dhaXRfaW8ocGlkZmYtPmhpZCk7CisJdXNiaGlkX3dhaXRfaW8ocGlkZmYtPmhpZCk7CiAKIAlmb3IgKGogPSAwOyBqIDwgNjA7IGorKykgewogCQlkZWJ1ZygicGlkX2Jsb2NrX2xvYWQgcmVxdWVzdGVkIik7Ci0JCWhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9CTE9DS19MT0FEXSwKKwkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX0JMT0NLX0xPQURdLAogCQkJCSAgVVNCX0RJUl9JTik7Ci0JCWhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOworCQl1c2JoaWRfd2FpdF9pbyhwaWRmZi0+aGlkKTsKIAkJaWYgKHBpZGZmLT5ibG9ja19sb2FkX3N0YXR1cy0+dmFsdWVbMF0gPT0KIAkJICAgIHBpZGZmLT5zdGF0dXNfaWRbUElEX0JMT0NLX0xPQURfU1VDQ0VTU10pIHsKIAkJCWRlYnVnKCJkZXZpY2UgcmVwb3J0ZWQgZnJlZSBtZW1vcnk6ICVkIGJ5dGVzIiwKQEAgLTUxMSw4ICs1MTMsOCBAQAogCQlwaWRmZi0+ZWZmZWN0X29wZXJhdGlvbltQSURfTE9PUF9DT1VOVF0udmFsdWVbMF0gPSBuOwogCX0KIAotCWhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOwotCWhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9FRkZFQ1RfT1BFUkFUSU9OXSwKKwl1c2JoaWRfd2FpdF9pbyhwaWRmZi0+aGlkKTsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfRUZGRUNUX09QRVJBVElPTl0sCiAJCQkgIFVTQl9ESVJfT1VUKTsKIH0KIApAQCAtNTM0LDcgKzUzNiw3IEBACiBzdGF0aWMgdm9pZCBwaWRmZl9lcmFzZV9waWQoc3RydWN0IHBpZGZmX2RldmljZSAqcGlkZmYsIGludCBwaWRfaWQpCiB7CiAJcGlkZmYtPmJsb2NrX2ZyZWVbUElEX0VGRkVDVF9CTE9DS19JTkRFWF0udmFsdWVbMF0gPSBwaWRfaWQ7Ci0JaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX0JMT0NLX0ZSRUVdLAorCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9CTE9DS19GUkVFXSwKIAkJCSAgVVNCX0RJUl9PVVQpOwogfQogCkBAIC03MTQsNyArNzE2LDcgQEAKIAlzdHJ1Y3QgcGlkZmZfZGV2aWNlICpwaWRmZiA9IGRldi0+ZmYtPnByaXZhdGU7CiAKIAlwaWRmZl9zZXQoJnBpZGZmLT5kZXZpY2VfZ2FpbltQSURfREVWSUNFX0dBSU5fRklFTERdLCBnYWluKTsKLQloaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfREVWSUNFX0dBSU5dLAorCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9ERVZJQ0VfR0FJTl0sCiAJCQkgIFVTQl9ESVJfT1VUKTsKIH0KIApAQCAtNzM5LDcgKzc0MSw3IEBACiAJcGlkZmZfc2V0KCZwaWRmZi0+c2V0X2VmZmVjdFtQSURfR0FJTl0sIG1hZ25pdHVkZSk7CiAJcGlkZmYtPnNldF9lZmZlY3RbUElEX1NUQVJUX0RFTEFZXS52YWx1ZVswXSA9IDA7CiAKLQloaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfU0VUX0VGRkVDVF0sCisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1NFVF9FRkZFQ1RdLAogCQkJICBVU0JfRElSX09VVCk7CiB9CiAKQEAgLTExNjMsMTkgKzExNjUsMTkgQEAKIAogCXBpZGZmLT5kZXZpY2VfY29udHJvbC0+dmFsdWVbMF0gPSBwaWRmZi0+Y29udHJvbF9pZFtQSURfUkVTRVRdOwogCS8qIFdlIHJlc2V0IHR3aWNlIGFzIHNvbWV0aW1lcyBoaWRfd2FpdF9pbyBpc24ndCB3YWl0aW5nIGxvbmcgZW5vdWdoICovCi0JaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfREVWSUNFX0NPTlRST0xdLCBVU0JfRElSX09VVCk7Ci0JaGlkX3dhaXRfaW8oaGlkKTsKLQloaWRfc3VibWl0X3JlcG9ydChoaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9ERVZJQ0VfQ09OVFJPTF0sIFVTQl9ESVJfT1VUKTsKLQloaWRfd2FpdF9pbyhoaWQpOworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX0RFVklDRV9DT05UUk9MXSwgVVNCX0RJUl9PVVQpOworCXVzYmhpZF93YWl0X2lvKGhpZCk7CisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfREVWSUNFX0NPTlRST0xdLCBVU0JfRElSX09VVCk7CisJdXNiaGlkX3dhaXRfaW8oaGlkKTsKIAogCXBpZGZmLT5kZXZpY2VfY29udHJvbC0+dmFsdWVbMF0gPQogCQlwaWRmZi0+Y29udHJvbF9pZFtQSURfRU5BQkxFX0FDVFVBVE9SU107Ci0JaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfREVWSUNFX0NPTlRST0xdLCBVU0JfRElSX09VVCk7Ci0JaGlkX3dhaXRfaW8oaGlkKTsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9ERVZJQ0VfQ09OVFJPTF0sIFVTQl9ESVJfT1VUKTsKKwl1c2JoaWRfd2FpdF9pbyhoaWQpOwogCiAJLyogcG9vbCByZXBvcnQgaXMgc29tZXRpbWVzIG1lc3NlZCB1cCwgcmVmZXRjaCBpdCAqLwotCWhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1BPT0xdLCBVU0JfRElSX0lOKTsKLQloaWRfd2FpdF9pbyhoaWQpOworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1BPT0xdLCBVU0JfRElSX0lOKTsKKwl1c2JoaWRfd2FpdF9pbyhoaWQpOwogCiAJaWYgKHBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZSkgewogCQlpbnQgc2ltX2VmZmVjdHMgPSBwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWVbMF07CkBAIC0xMTg3LDkgKzExODksOSBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJZGVidWcoInBpZF9wb29sIHJlcXVlc3RlZCBhZ2FpbiIpOwotCQkJaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfUE9PTF0sCisJCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9QT09MXSwKIAkJCQkJICBVU0JfRElSX0lOKTsKLQkJCWhpZF93YWl0X2lvKGhpZCk7CisJCQl1c2JoaWRfd2FpdF9pbyhoaWQpOwogCQl9CiAJfQogfQpAQCAtMTI3NSw3ICsxMjc3LDcgQEAKIAogCWlmICh0ZXN0X2JpdChGRl9HQUlOLCBkZXYtPmZmYml0KSkgewogCQlwaWRmZl9zZXQoJnBpZGZmLT5kZXZpY2VfZ2FpbltQSURfREVWSUNFX0dBSU5fRklFTERdLCAweGZmZmYpOwotCQloaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfREVWSUNFX0dBSU5dLAorCQl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfREVWSUNFX0dBSU5dLAogCQkJCSAgVVNCX0RJUl9PVVQpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLXRtZmYuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC10bWZmLmMKaW5kZXggMmQ1YmU0Yy4uYWI2NzMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLXRtZmYuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtdG1mZi5jCkBAIC0zMiw3ICszMiw4IEBACiAjdW5kZWYgREVCVUcKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KIAotI2luY2x1ZGUgImhpZC5oIgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgInVzYmhpZC5oIgogCiAvKiBVc2FnZXMgZm9yIHRocnVzdG1hc3RlciBkZXZpY2VzIEkga25vdyBhYm91dCAqLwogI2RlZmluZSBUSFJVU1RNQVNURVJfVVNBR0VfUlVNQkxFX0xSCShISURfVVBfR0VOREVTSyB8IDB4YmIpCkBAIC03MCw3ICs3MSw3IEBACiAJdG1mZi0+cnVtYmxlLT52YWx1ZVswXSA9IGxlZnQ7CiAJdG1mZi0+cnVtYmxlLT52YWx1ZVsxXSA9IHJpZ2h0OwogCWRiZygiKGxlZnQscmlnaHQpPSglMDh4LCAlMDh4KSIsIGxlZnQsIHJpZ2h0KTsKLQloaWRfc3VibWl0X3JlcG9ydChoaWQsIHRtZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgdG1mZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC16cGZmLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtenBmZi5jCmluZGV4IGQyY2UzMjEuLjdiZDgyMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC16cGZmLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLXpwZmYuYwpAQCAtMjcsNyArMjcsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlICJoaWQuaCIKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlICJ1c2JoaWQuaCIKIAogc3RydWN0IHpwZmZfZGV2aWNlIHsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwpAQCAtNTYsNyArNTcsNyBAQAogCXpwZmYtPnJlcG9ydC0+ZmllbGRbMl0tPnZhbHVlWzBdID0gbGVmdDsKIAl6cGZmLT5yZXBvcnQtPmZpZWxkWzNdLT52YWx1ZVswXSA9IHJpZ2h0OwogCWRlYnVnKCJydW5uaW5nIHdpdGggMHglMDJ4IDB4JTAyeCIsIGxlZnQsIHJpZ2h0KTsKLQloaWRfc3VibWl0X3JlcG9ydChoaWQsIHpwZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgenBmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMSw3ICsxMDIsNyBAQAogCXpwZmYtPnJlcG9ydC0+ZmllbGRbMV0tPnZhbHVlWzBdID0gMHgwMjsKIAl6cGZmLT5yZXBvcnQtPmZpZWxkWzJdLT52YWx1ZVswXSA9IDB4MDA7CiAJenBmZi0+cmVwb3J0LT5maWVsZFszXS0+dmFsdWVbMF0gPSAweDAwOwotCWhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgenBmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCB6cGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBaZXJvcGx1cyBiYXNlZCBkZXZpY2VzIGJ5ICIKIAkgICAgICAgIkFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaCBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjUwZWZmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLSNpZm5kZWYgX19ISURfSAotI2RlZmluZSBfX0hJRF9ICi0KLS8qCi0gKiAkSWQ6IGhpZC5oLHYgMS4yNCAyMDAxLzEyLzI3IDEwOjM3OjQxIHZvanRlY2ggRXhwICQKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVm9qdGVjaCBQYXZsaWsKLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqCi0gKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKLSAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6Ci0gKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLS8qCi0gKiBVU0IgSElEIChIdW1hbiBJbnRlcmZhY2UgRGV2aWNlKSBpbnRlcmZhY2UgY2xhc3MgY29kZQotICovCi0KLSNkZWZpbmUgVVNCX0lOVEVSRkFDRV9DTEFTU19ISUQJCTMKLQotLyoKLSAqIFVTQiBISUQgaW50ZXJmYWNlIHN1YmNsYXNzIGFuZCBwcm90b2NvbCBjb2RlcwotICovCi0KLSNkZWZpbmUgVVNCX0lOVEVSRkFDRV9TVUJDTEFTU19CT09UCTEKLSNkZWZpbmUgVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9LRVlCT0FSRAkxCi0jZGVmaW5lIFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfTU9VU0UJMgotCi0vKgotICogSElEIGNsYXNzIHJlcXVlc3RzCi0gKi8KLQotI2RlZmluZSBISURfUkVRX0dFVF9SRVBPUlQJCTB4MDEKLSNkZWZpbmUgSElEX1JFUV9HRVRfSURMRQkJMHgwMgotI2RlZmluZSBISURfUkVRX0dFVF9QUk9UT0NPTAkJMHgwMwotI2RlZmluZSBISURfUkVRX1NFVF9SRVBPUlQJCTB4MDkKLSNkZWZpbmUgSElEX1JFUV9TRVRfSURMRQkJMHgwQQotI2RlZmluZSBISURfUkVRX1NFVF9QUk9UT0NPTAkJMHgwQgotCi0vKgotICogSElEIGNsYXNzIGRlc2NyaXB0b3IgdHlwZXMKLSAqLwotCi0jZGVmaW5lIEhJRF9EVF9ISUQJCQkoVVNCX1RZUEVfQ0xBU1MgfCAweDAxKQotI2RlZmluZSBISURfRFRfUkVQT1JUCQkJKFVTQl9UWVBFX0NMQVNTIHwgMHgwMikKLSNkZWZpbmUgSElEX0RUX1BIWVNJQ0FMCQkJKFVTQl9UWVBFX0NMQVNTIHwgMHgwMykKLQotLyoKLSAqIFdlIHBhcnNlIGVhY2ggZGVzY3JpcHRpb24gaXRlbSBpbnRvIHRoaXMgc3RydWN0dXJlLiBTaG9ydCBpdGVtcyBkYXRhCi0gKiB2YWx1ZXMgYXJlIGV4cGFuZGVkIHRvIDMyLWJpdCBzaWduZWQgaW50LCBsb25nIGl0ZW1zIGNvbnRhaW4gYSBwb2ludGVyCi0gKiBpbnRvIHRoZSBkYXRhIGFyZWEuCi0gKi8KLQotc3RydWN0IGhpZF9pdGVtIHsKLQl1bnNpZ25lZCAgZm9ybWF0OwotCV9fdTggICAgICBzaXplOwotCV9fdTggICAgICB0eXBlOwotCV9fdTggICAgICB0YWc7Ci0JdW5pb24gewotCSAgICBfX3U4ICAgdTg7Ci0JICAgIF9fczggICBzODsKLQkgICAgX191MTYgIHUxNjsKLQkgICAgX19zMTYgIHMxNjsKLQkgICAgX191MzIgIHUzMjsKLQkgICAgX19zMzIgIHMzMjsKLQkgICAgX191OCAgKmxvbmdkYXRhOwotCX0gZGF0YTsKLX07Ci0KLS8qCi0gKiBISUQgcmVwb3J0IGl0ZW0gZm9ybWF0Ci0gKi8KLQotI2RlZmluZSBISURfSVRFTV9GT1JNQVRfU0hPUlQJMAotI2RlZmluZSBISURfSVRFTV9GT1JNQVRfTE9ORwkxCi0KLS8qCi0gKiBTcGVjaWFsIHRhZyBpbmRpY2F0aW5nIGxvbmcgaXRlbXMKLSAqLwotCi0jZGVmaW5lIEhJRF9JVEVNX1RBR19MT05HCTE1Ci0KLS8qCi0gKiBISUQgcmVwb3J0IGRlc2NyaXB0b3IgaXRlbSB0eXBlIChwcmVmaXggYml0IDIsMykKLSAqLwotCi0jZGVmaW5lIEhJRF9JVEVNX1RZUEVfTUFJTgkJMAotI2RlZmluZSBISURfSVRFTV9UWVBFX0dMT0JBTAkJMQotI2RlZmluZSBISURfSVRFTV9UWVBFX0xPQ0FMCQkyCi0jZGVmaW5lIEhJRF9JVEVNX1RZUEVfUkVTRVJWRUQJCTMKLQotLyoKLSAqIEhJRCByZXBvcnQgZGVzY3JpcHRvciBtYWluIGl0ZW0gdGFncwotICovCi0KLSNkZWZpbmUgSElEX01BSU5fSVRFTV9UQUdfSU5QVVQJCQk4Ci0jZGVmaW5lIEhJRF9NQUlOX0lURU1fVEFHX09VVFBVVAkJOQotI2RlZmluZSBISURfTUFJTl9JVEVNX1RBR19GRUFUVVJFCQkxMQotI2RlZmluZSBISURfTUFJTl9JVEVNX1RBR19CRUdJTl9DT0xMRUNUSU9OCTEwCi0jZGVmaW5lIEhJRF9NQUlOX0lURU1fVEFHX0VORF9DT0xMRUNUSU9OCTEyCi0KLS8qCi0gKiBISUQgcmVwb3J0IGRlc2NyaXB0b3IgbWFpbiBpdGVtIGNvbnRlbnRzCi0gKi8KLQotI2RlZmluZSBISURfTUFJTl9JVEVNX0NPTlNUQU5UCQkweDAwMQotI2RlZmluZSBISURfTUFJTl9JVEVNX1ZBUklBQkxFCQkweDAwMgotI2RlZmluZSBISURfTUFJTl9JVEVNX1JFTEFUSVZFCQkweDAwNAotI2RlZmluZSBISURfTUFJTl9JVEVNX1dSQVAJCTB4MDA4Ci0jZGVmaW5lIEhJRF9NQUlOX0lURU1fTk9OTElORUFSCQkweDAxMAotI2RlZmluZSBISURfTUFJTl9JVEVNX05PX1BSRUZFUlJFRAkweDAyMAotI2RlZmluZSBISURfTUFJTl9JVEVNX05VTExfU1RBVEUJMHgwNDAKLSNkZWZpbmUgSElEX01BSU5fSVRFTV9WT0xBVElMRQkJMHgwODAKLSNkZWZpbmUgSElEX01BSU5fSVRFTV9CVUZGRVJFRF9CWVRFCTB4MTAwCi0KLS8qCi0gKiBISUQgcmVwb3J0IGRlc2NyaXB0b3IgY29sbGVjdGlvbiBpdGVtIHR5cGVzCi0gKi8KLQotI2RlZmluZSBISURfQ09MTEVDVElPTl9QSFlTSUNBTAkJMAotI2RlZmluZSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTgkxCi0jZGVmaW5lIEhJRF9DT0xMRUNUSU9OX0xPR0lDQUwJCTIKLQotLyoKLSAqIEhJRCByZXBvcnQgZGVzY3JpcHRvciBnbG9iYWwgaXRlbSB0YWdzCi0gKi8KLQotI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1VTQUdFX1BBR0UJCTAKLSNkZWZpbmUgSElEX0dMT0JBTF9JVEVNX1RBR19MT0dJQ0FMX01JTklNVU0JMQotI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX0xPR0lDQUxfTUFYSU1VTQkyCi0jZGVmaW5lIEhJRF9HTE9CQUxfSVRFTV9UQUdfUEhZU0lDQUxfTUlOSU1VTQkzCi0jZGVmaW5lIEhJRF9HTE9CQUxfSVRFTV9UQUdfUEhZU0lDQUxfTUFYSU1VTQk0Ci0jZGVmaW5lIEhJRF9HTE9CQUxfSVRFTV9UQUdfVU5JVF9FWFBPTkVOVAk1Ci0jZGVmaW5lIEhJRF9HTE9CQUxfSVRFTV9UQUdfVU5JVAkJNgotI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1JFUE9SVF9TSVpFCQk3Ci0jZGVmaW5lIEhJRF9HTE9CQUxfSVRFTV9UQUdfUkVQT1JUX0lECQk4Ci0jZGVmaW5lIEhJRF9HTE9CQUxfSVRFTV9UQUdfUkVQT1JUX0NPVU5UCTkKLSNkZWZpbmUgSElEX0dMT0JBTF9JVEVNX1RBR19QVVNICQkxMAotI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1BPUAkJCTExCi0KLS8qCi0gKiBISUQgcmVwb3J0IGRlc2NyaXB0b3IgbG9jYWwgaXRlbSB0YWdzCi0gKi8KLQotI2RlZmluZSBISURfTE9DQUxfSVRFTV9UQUdfVVNBR0UJCTAKLSNkZWZpbmUgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFX01JTklNVU0JMQotI2RlZmluZSBISURfTE9DQUxfSVRFTV9UQUdfVVNBR0VfTUFYSU1VTQkyCi0jZGVmaW5lIEhJRF9MT0NBTF9JVEVNX1RBR19ERVNJR05BVE9SX0lOREVYCTMKLSNkZWZpbmUgSElEX0xPQ0FMX0lURU1fVEFHX0RFU0lHTkFUT1JfTUlOSU1VTQk0Ci0jZGVmaW5lIEhJRF9MT0NBTF9JVEVNX1RBR19ERVNJR05BVE9SX01BWElNVU0JNQotI2RlZmluZSBISURfTE9DQUxfSVRFTV9UQUdfU1RSSU5HX0lOREVYCQk3Ci0jZGVmaW5lIEhJRF9MT0NBTF9JVEVNX1RBR19TVFJJTkdfTUlOSU1VTQk4Ci0jZGVmaW5lIEhJRF9MT0NBTF9JVEVNX1RBR19TVFJJTkdfTUFYSU1VTQk5Ci0jZGVmaW5lIEhJRF9MT0NBTF9JVEVNX1RBR19ERUxJTUlURVIJCTEwCi0KLS8qCi0gKiBISUQgdXNhZ2UgdGFibGVzCi0gKi8KLQotI2RlZmluZSBISURfVVNBR0VfUEFHRQkJMHhmZmZmMDAwMAotCi0jZGVmaW5lIEhJRF9VUF9VTkRFRklORUQJMHgwMDAwMDAwMAotI2RlZmluZSBISURfVVBfR0VOREVTSwkJMHgwMDAxMDAwMAotI2RlZmluZSBISURfVVBfU0lNVUxBVElPTgkweDAwMDIwMDAwCi0jZGVmaW5lIEhJRF9VUF9LRVlCT0FSRAkJMHgwMDA3MDAwMAotI2RlZmluZSBISURfVVBfTEVECQkweDAwMDgwMDAwCi0jZGVmaW5lIEhJRF9VUF9CVVRUT04JCTB4MDAwOTAwMDAKLSNkZWZpbmUgSElEX1VQX09SRElOQUwJCTB4MDAwYTAwMDAKLSNkZWZpbmUgSElEX1VQX0NPTlNVTUVSCQkweDAwMGMwMDAwCi0jZGVmaW5lIEhJRF9VUF9ESUdJVElaRVIJMHgwMDBkMDAwMAotI2RlZmluZSBISURfVVBfUElECQkweDAwMGYwMDAwCi0jZGVmaW5lIEhJRF9VUF9IUFZFTkRPUiAgICAgICAgIDB4ZmY3ZjAwMDAKLSNkZWZpbmUgSElEX1VQX01TVkVORE9SCQkweGZmMDAwMDAwCi0jZGVmaW5lIEhJRF9VUF9DVVNUT00JCTB4MDBmZjAwMDAKLSNkZWZpbmUgSElEX1VQX0xPR0lWRU5ET1IJMHhmZmJjMDAwMAotCi0jZGVmaW5lIEhJRF9VU0FHRQkJMHgwMDAwZmZmZgotCi0jZGVmaW5lIEhJRF9HRF9QT0lOVEVSCQkweDAwMDEwMDAxCi0jZGVmaW5lIEhJRF9HRF9NT1VTRQkJMHgwMDAxMDAwMgotI2RlZmluZSBISURfR0RfSk9ZU1RJQ0sJCTB4MDAwMTAwMDQKLSNkZWZpbmUgSElEX0dEX0dBTUVQQUQJCTB4MDAwMTAwMDUKLSNkZWZpbmUgSElEX0dEX0tFWUJPQVJECQkweDAwMDEwMDA2Ci0jZGVmaW5lIEhJRF9HRF9LRVlQQUQJCTB4MDAwMTAwMDcKLSNkZWZpbmUgSElEX0dEX01VTFRJQVhJUwkweDAwMDEwMDA4Ci0jZGVmaW5lIEhJRF9HRF9YCQkweDAwMDEwMDMwCi0jZGVmaW5lIEhJRF9HRF9ZCQkweDAwMDEwMDMxCi0jZGVmaW5lIEhJRF9HRF9aCQkweDAwMDEwMDMyCi0jZGVmaW5lIEhJRF9HRF9SWAkJMHgwMDAxMDAzMwotI2RlZmluZSBISURfR0RfUlkJCTB4MDAwMTAwMzQKLSNkZWZpbmUgSElEX0dEX1JaCQkweDAwMDEwMDM1Ci0jZGVmaW5lIEhJRF9HRF9TTElERVIJCTB4MDAwMTAwMzYKLSNkZWZpbmUgSElEX0dEX0RJQUwJCTB4MDAwMTAwMzcKLSNkZWZpbmUgSElEX0dEX1dIRUVMCQkweDAwMDEwMDM4Ci0jZGVmaW5lIEhJRF9HRF9IQVRTV0lUQ0gJMHgwMDAxMDAzOQotI2RlZmluZSBISURfR0RfQlVGRkVSCQkweDAwMDEwMDNhCi0jZGVmaW5lIEhJRF9HRF9CWVRFQ09VTlQJMHgwMDAxMDAzYgotI2RlZmluZSBISURfR0RfTU9USU9OCQkweDAwMDEwMDNjCi0jZGVmaW5lIEhJRF9HRF9TVEFSVAkJMHgwMDAxMDAzZAotI2RlZmluZSBISURfR0RfU0VMRUNUCQkweDAwMDEwMDNlCi0jZGVmaW5lIEhJRF9HRF9WWAkJMHgwMDAxMDA0MAotI2RlZmluZSBISURfR0RfVlkJCTB4MDAwMTAwNDEKLSNkZWZpbmUgSElEX0dEX1ZaCQkweDAwMDEwMDQyCi0jZGVmaW5lIEhJRF9HRF9WQlJYCQkweDAwMDEwMDQzCi0jZGVmaW5lIEhJRF9HRF9WQlJZCQkweDAwMDEwMDQ0Ci0jZGVmaW5lIEhJRF9HRF9WQlJaCQkweDAwMDEwMDQ1Ci0jZGVmaW5lIEhJRF9HRF9WTk8JCTB4MDAwMTAwNDYKLSNkZWZpbmUgSElEX0dEX0ZFQVRVUkUJCTB4MDAwMTAwNDcKLSNkZWZpbmUgSElEX0dEX1VQCQkweDAwMDEwMDkwCi0jZGVmaW5lIEhJRF9HRF9ET1dOCQkweDAwMDEwMDkxCi0jZGVmaW5lIEhJRF9HRF9SSUdIVAkJMHgwMDAxMDA5MgotI2RlZmluZSBISURfR0RfTEVGVAkJMHgwMDAxMDA5MwotCi0vKgotICogSElEIHJlcG9ydCB0eXBlcyAtLS0gT3VjaCEgSElEIHNwZWMgc2F5cyAxIDIgMyEKLSAqLwotCi0jZGVmaW5lIEhJRF9JTlBVVF9SRVBPUlQJMAotI2RlZmluZSBISURfT1VUUFVUX1JFUE9SVAkxCi0jZGVmaW5lIEhJRF9GRUFUVVJFX1JFUE9SVAkyCi0KLS8qCi0gKiBISUQgZGV2aWNlIHF1aXJrcy4KLSAqLwotCi0jZGVmaW5lIEhJRF9RVUlSS19JTlZFUlQJCQkweDAwMDAwMDAxCi0jZGVmaW5lIEhJRF9RVUlSS19OT1RPVUNICQkJMHgwMDAwMDAwMgotI2RlZmluZSBISURfUVVJUktfSUdOT1JFCQkJMHgwMDAwMDAwNAotI2RlZmluZSBISURfUVVJUktfTk9HRVQJCQkJMHgwMDAwMDAwOAotI2RlZmluZSBISURfUVVJUktfSElEREVWCQkJMHgwMDAwMDAxMAotI2RlZmluZSBISURfUVVJUktfQkFEUEFECQkJMHgwMDAwMDAyMAotI2RlZmluZSBISURfUVVJUktfTVVMVElfSU5QVVQJCQkweDAwMDAwMDQwCi0jZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS183CQkweDAwMDAwMDgwCi0jZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181CQkweDAwMDAwMTAwCi0jZGVmaW5lIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS19PTgkJMHgwMDAwMDIwMAotI2RlZmluZSBISURfUVVJUktfTUlHSFRZTU9VU0UJCQkweDAwMDAwNDAwCi0jZGVmaW5lIEhJRF9RVUlSS19DWU1PVElPTgkJCTB4MDAwMDA4MDAKLSNkZWZpbmUgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4JCTB4MDAwMDEwMDAKLSNkZWZpbmUgSElEX1FVSVJLX1BPV0VSQk9PS19GTl9PTgkJMHgwMDAwMjAwMAotI2RlZmluZSBISURfUVVJUktfSU5WRVJUX0hXSEVFTAkJCTB4MDAwMDQwMDAKLQotLyoKLSAqIFRoaXMgaXMgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCBvZiB0aGUgcGFyc2VyLiBUaGlzIGluZm9ybWF0aW9uIGlzCi0gKiBwZXJzaXN0ZW50IGZvciBtYWluLWl0ZW1zLiBUaGUgZ2xvYmFsIGVudmlyb25tZW50IGNhbiBiZSBzYXZlZCBhbmQKLSAqIHJlc3RvcmVkIHdpdGggUFVTSC9QT1Agc3RhdGVtZW50cy4KLSAqLwotCi1zdHJ1Y3QgaGlkX2dsb2JhbCB7Ci0JdW5zaWduZWQgdXNhZ2VfcGFnZTsKLQlfX3MzMiAgICBsb2dpY2FsX21pbmltdW07Ci0JX19zMzIgICAgbG9naWNhbF9tYXhpbXVtOwotCV9fczMyICAgIHBoeXNpY2FsX21pbmltdW07Ci0JX19zMzIgICAgcGh5c2ljYWxfbWF4aW11bTsKLQlfX3MzMiAgICB1bml0X2V4cG9uZW50OwotCXVuc2lnbmVkIHVuaXQ7Ci0JdW5zaWduZWQgcmVwb3J0X2lkOwotCXVuc2lnbmVkIHJlcG9ydF9zaXplOwotCXVuc2lnbmVkIHJlcG9ydF9jb3VudDsKLX07Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBsb2NhbCBlbnZpcm9ubWVudC4gSXQgaXMgcGVyc2lzdGVudCB1cCB0aGUgbmV4dCBtYWluLWl0ZW0uCi0gKi8KLQotI2RlZmluZSBISURfTUFYX0RFU0NSSVBUT1JfU0laRQkJNDA5NgotI2RlZmluZSBISURfTUFYX1VTQUdFUwkJCTEwMjQKLSNkZWZpbmUgSElEX0RFRkFVTFRfTlVNX0NPTExFQ1RJT05TCTE2Ci0KLXN0cnVjdCBoaWRfbG9jYWwgewotCXVuc2lnbmVkIHVzYWdlW0hJRF9NQVhfVVNBR0VTXTsgLyogdXNhZ2UgYXJyYXkgKi8KLQl1bnNpZ25lZCBjb2xsZWN0aW9uX2luZGV4W0hJRF9NQVhfVVNBR0VTXTsgLyogY29sbGVjdGlvbiBpbmRleCBhcnJheSAqLwotCXVuc2lnbmVkIHVzYWdlX2luZGV4OwotCXVuc2lnbmVkIHVzYWdlX21pbmltdW07Ci0JdW5zaWduZWQgZGVsaW1pdGVyX2RlcHRoOwotCXVuc2lnbmVkIGRlbGltaXRlcl9icmFuY2g7Ci19OwotCi0vKgotICogVGhpcyBpcyB0aGUgY29sbGVjdGlvbiBzdGFjay4gV2UgY2xpbWIgdXAgdGhlIHN0YWNrIHRvIGRldGVybWluZQotICogYXBwbGljYXRpb24gYW5kIGZ1bmN0aW9uIG9mIGVhY2ggZmllbGQuCi0gKi8KLQotc3RydWN0IGhpZF9jb2xsZWN0aW9uIHsKLQl1bnNpZ25lZCB0eXBlOwotCXVuc2lnbmVkIHVzYWdlOwotCXVuc2lnbmVkIGxldmVsOwotfTsKLQotc3RydWN0IGhpZF91c2FnZSB7Ci0JdW5zaWduZWQgIGhpZDsJCQkvKiBoaWQgdXNhZ2UgY29kZSAqLwotCXVuc2lnbmVkICBjb2xsZWN0aW9uX2luZGV4OwkvKiBpbmRleCBpbnRvIGNvbGxlY3Rpb24gYXJyYXkgKi8KLQkvKiBoaWRpbnB1dCBkYXRhICovCi0JX191MTYgICAgIGNvZGU7CQkJLyogaW5wdXQgZHJpdmVyIGNvZGUgKi8KLQlfX3U4ICAgICAgdHlwZTsJCQkvKiBpbnB1dCBkcml2ZXIgdHlwZSAqLwotCV9fczgJICBoYXRfbWluOwkJLyogaGF0IHN3aXRjaCBmdW4gKi8KLQlfX3M4CSAgaGF0X21heDsJCS8qIGRpdHRvICovCi0JX19zOAkgIGhhdF9kaXI7CQkvKiBkaXR0byAqLwotfTsKLQotc3RydWN0IGhpZF9pbnB1dDsKLQotc3RydWN0IGhpZF9maWVsZCB7Ci0JdW5zaWduZWQgIHBoeXNpY2FsOwkJLyogcGh5c2ljYWwgdXNhZ2UgZm9yIHRoaXMgZmllbGQgKi8KLQl1bnNpZ25lZCAgbG9naWNhbDsJCS8qIGxvZ2ljYWwgdXNhZ2UgZm9yIHRoaXMgZmllbGQgKi8KLQl1bnNpZ25lZCAgYXBwbGljYXRpb247CQkvKiBhcHBsaWNhdGlvbiB1c2FnZSBmb3IgdGhpcyBmaWVsZCAqLwotCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlOwkvKiB1c2FnZSB0YWJsZSBmb3IgdGhpcyBmdW5jdGlvbiAqLwotCXVuc2lnbmVkICBtYXh1c2FnZTsJCS8qIG1heGltdW0gdXNhZ2UgaW5kZXggKi8KLQl1bnNpZ25lZCAgZmxhZ3M7CQkvKiBtYWluLWl0ZW0gZmxhZ3MgKGkuZS4gdm9sYXRpbGUsYXJyYXksY29uc3RhbnQpICovCi0JdW5zaWduZWQgIHJlcG9ydF9vZmZzZXQ7CS8qIGJpdCBvZmZzZXQgaW4gdGhlIHJlcG9ydCAqLwotCXVuc2lnbmVkICByZXBvcnRfc2l6ZTsJCS8qIHNpemUgb2YgdGhpcyBmaWVsZCBpbiB0aGUgcmVwb3J0ICovCi0JdW5zaWduZWQgIHJlcG9ydF9jb3VudDsJCS8qIG51bWJlciBvZiB0aGlzIGZpZWxkIGluIHRoZSByZXBvcnQgKi8KLQl1bnNpZ25lZCAgcmVwb3J0X3R5cGU7CQkvKiAoaW5wdXQsb3V0cHV0LGZlYXR1cmUpICovCi0JX19zMzIgICAgKnZhbHVlOwkJLyogbGFzdCBrbm93biB2YWx1ZShzKSAqLwotCV9fczMyICAgICBsb2dpY2FsX21pbmltdW07Ci0JX19zMzIgICAgIGxvZ2ljYWxfbWF4aW11bTsKLQlfX3MzMiAgICAgcGh5c2ljYWxfbWluaW11bTsKLQlfX3MzMiAgICAgcGh5c2ljYWxfbWF4aW11bTsKLQlfX3MzMiAgICAgdW5pdF9leHBvbmVudDsKLQl1bnNpZ25lZCAgdW5pdDsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwkvKiBhc3NvY2lhdGVkIHJlcG9ydCAqLwotCXVuc2lnbmVkIGluZGV4OwkJCS8qIGluZGV4IGludG8gcmVwb3J0LT5maWVsZFtdICovCi0JLyogaGlkaW5wdXQgZGF0YSAqLwotCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0OwkvKiBhc3NvY2lhdGVkIGlucHV0IHN0cnVjdHVyZSAqLwotCV9fdTE2IGRwYWQ7CQkJLyogZHBhZCBpbnB1dCBjb2RlICovCi19OwotCi0jZGVmaW5lIEhJRF9NQVhfRklFTERTIDY0Ci0KLXN0cnVjdCBoaWRfcmVwb3J0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JdW5zaWduZWQgaWQ7CQkJCQkvKiBpZCBvZiB0aGlzIHJlcG9ydCAqLwotCXVuc2lnbmVkIHR5cGU7CQkJCQkvKiByZXBvcnQgdHlwZSAqLwotCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkW0hJRF9NQVhfRklFTERTXTsJLyogZmllbGRzIG9mIHRoZSByZXBvcnQgKi8KLQl1bnNpZ25lZCBtYXhmaWVsZDsJCQkJLyogbWF4aW11bSB2YWxpZCBmaWVsZCBpbmRleCAqLwotCXVuc2lnbmVkIHNpemU7CQkJCQkvKiBzaXplIG9mIHRoZSByZXBvcnQgKGJpdHMpICovCi0Jc3RydWN0IGhpZF9kZXZpY2UgKmRldmljZTsJCQkvKiBhc3NvY2lhdGVkIGRldmljZSAqLwotfTsKLQotc3RydWN0IGhpZF9yZXBvcnRfZW51bSB7Ci0JdW5zaWduZWQgbnVtYmVyZWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCByZXBvcnRfbGlzdDsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0X2lkX2hhc2hbMjU2XTsKLX07Ci0KLSNkZWZpbmUgSElEX1JFUE9SVF9UWVBFUyAzCi0KLSNkZWZpbmUgSElEX01JTl9CVUZGRVJfU0laRQk2NAkJLyogbWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IGEgcGFja2V0IHNpemUgb2Ygc3BhY2UgKi8KLSNkZWZpbmUgSElEX01BWF9CVUZGRVJfU0laRQk0MDk2CQkvKiA0a2IgKi8KLSNkZWZpbmUgSElEX0NPTlRST0xfRklGT19TSVpFCTI1NgkJLyogdG8gaW5pdCBkZXZpY2VzIHdpdGggPjEwMCByZXBvcnRzICovCi0jZGVmaW5lIEhJRF9PVVRQVVRfRklGT19TSVpFCTY0Ci0KLXN0cnVjdCBoaWRfY29udHJvbF9maWZvIHsKLQl1bnNpZ25lZCBjaGFyIGRpcjsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotfTsKLQotI2RlZmluZSBISURfQ0xBSU1FRF9JTlBVVAkxCi0jZGVmaW5lIEhJRF9DTEFJTUVEX0hJRERFVgkyCi0KLSNkZWZpbmUgSElEX0NUUkxfUlVOTklORwkxCi0jZGVmaW5lIEhJRF9PVVRfUlVOTklORwkJMgotI2RlZmluZSBISURfSU5fUlVOTklORwkJMwotI2RlZmluZSBISURfUkVTRVRfUEVORElORwk0Ci0jZGVmaW5lIEhJRF9TVVNQRU5ERUQJCTUKLQotc3RydWN0IGhpZF9pbnB1dCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Ci19OwotCi1zdHJ1Y3QgaGlkX2RldmljZSB7CQkJCQkJCS8qIGRldmljZSByZXBvcnQgZGVzY3JpcHRvciAqLwotCSBfX3U4ICpyZGVzYzsKLQl1bnNpZ25lZCByc2l6ZTsKLQlzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24gKmNvbGxlY3Rpb247CQkJCS8qIExpc3Qgb2YgSElEIGNvbGxlY3Rpb25zICovCi0JdW5zaWduZWQgY29sbGVjdGlvbl9zaXplOwkJCQkJLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBoaWRfY29sbGVjdGlvbnMgKi8KLQl1bnNpZ25lZCBtYXhjb2xsZWN0aW9uOwkJCQkJCS8qIE51bWJlciBvZiBwYXJzZWQgY29sbGVjdGlvbnMgKi8KLQl1bnNpZ25lZCBtYXhhcHBsaWNhdGlvbjsJCQkJCS8qIE51bWJlciBvZiBhcHBsaWNhdGlvbnMgKi8KLQl1bnNpZ25lZCB2ZXJzaW9uOwkJCQkJCS8qIEhJRCB2ZXJzaW9uICovCi0JdW5zaWduZWQgY291bnRyeTsJCQkJCQkvKiBISUQgY291bnRyeSAqLwotCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gcmVwb3J0X2VudW1bSElEX1JFUE9SVF9UWVBFU107Ci0KLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwkJCQkJCS8qIFVTQiBkZXZpY2UgKi8KLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsJCQkJCS8qIFVTQiBpbnRlcmZhY2UgKi8KLQlpbnQgaWZudW07CQkJCQkJCS8qIFVTQiBpbnRlcmZhY2UgbnVtYmVyICovCi0KLQl1bnNpZ25lZCBsb25nIGlvZmw7CQkJCQkJLyogSS9PIGZsYWdzIChDVFJMX1JVTk5JTkcsIE9VVF9SVU5OSU5HKSAqLwotCXN0cnVjdCB0aW1lcl9saXN0IGlvX3JldHJ5OwkJCQkJLyogUmV0cnkgdGltZXIgKi8KLQl1bnNpZ25lZCBsb25nIHN0b3BfcmV0cnk7CQkJCQkvKiBUaW1lIHRvIGdpdmUgdXAsIGluIGppZmZpZXMgKi8KLQl1bnNpZ25lZCBpbnQgcmV0cnlfZGVsYXk7CQkJCQkvKiBEZWxheSBsZW5ndGggaW4gbXMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsJCQkJCS8qIFRhc2sgY29udGV4dCBmb3IgcmVzZXRzICovCi0KLQl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsJCQkJCQkvKiBVUkIgYnVmZmVyIHNpemUgKi8KLQotCXN0cnVjdCB1cmIgKnVyYmluOwkJCQkJCS8qIElucHV0IFVSQiAqLwotCWNoYXIgKmluYnVmOwkJCQkJCQkvKiBJbnB1dCBidWZmZXIgKi8KLQlkbWFfYWRkcl90IGluYnVmX2RtYTsJCQkJCQkvKiBJbnB1dCBidWZmZXIgZG1hICovCi0Jc3BpbmxvY2tfdCBpbmxvY2s7CQkJCQkJLyogSW5wdXQgZmlmbyBzcGlubG9jayAqLwotCi0Jc3RydWN0IHVyYiAqdXJiY3RybDsJCQkJCQkvKiBDb250cm9sIFVSQiAqLwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNyOwkJCQkJLyogQ29udHJvbCByZXF1ZXN0IHN0cnVjdCAqLwotCWRtYV9hZGRyX3QgY3JfZG1hOwkJCQkJCS8qIENvbnRyb2wgcmVxdWVzdCBzdHJ1Y3QgZG1hICovCi0Jc3RydWN0IGhpZF9jb250cm9sX2ZpZm8gY3RybFtISURfQ09OVFJPTF9GSUZPX1NJWkVdOwkJLyogQ29udHJvbCBmaWZvICovCi0JdW5zaWduZWQgY2hhciBjdHJsaGVhZCwgY3RybHRhaWw7CQkJCS8qIENvbnRyb2wgZmlmbyBoZWFkICYgdGFpbCAqLwotCWNoYXIgKmN0cmxidWY7CQkJCQkJCS8qIENvbnRyb2wgYnVmZmVyICovCi0JZG1hX2FkZHJfdCBjdHJsYnVmX2RtYTsJCQkJCQkvKiBDb250cm9sIGJ1ZmZlciBkbWEgKi8KLQlzcGlubG9ja190IGN0cmxsb2NrOwkJCQkJCS8qIENvbnRyb2wgZmlmbyBzcGlubG9jayAqLwotCi0Jc3RydWN0IHVyYiAqdXJib3V0OwkJCQkJCS8qIE91dHB1dCBVUkIgKi8KLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqb3V0W0hJRF9DT05UUk9MX0ZJRk9fU0laRV07CQkJLyogT3V0cHV0IHBpcGUgZmlmbyAqLwotCXVuc2lnbmVkIGNoYXIgb3V0aGVhZCwgb3V0dGFpbDsJCQkJCS8qIE91dHB1dCBwaXBlIGZpZm8gaGVhZCAmIHRhaWwgKi8KLQljaGFyICpvdXRidWY7CQkJCQkJCS8qIE91dHB1dCBidWZmZXIgKi8KLQlkbWFfYWRkcl90IG91dGJ1Zl9kbWE7CQkJCQkJLyogT3V0cHV0IGJ1ZmZlciBkbWEgKi8KLQlzcGlubG9ja190IG91dGxvY2s7CQkJCQkJLyogT3V0cHV0IGZpZm8gc3BpbmxvY2sgKi8KLQotCXVuc2lnbmVkIGNsYWltZWQ7CQkJCQkJLyogQ2xhaW1lZCBieSBoaWRpbnB1dCwgaGlkZGV2PyAqLwotCXVuc2lnbmVkIHF1aXJrczsJCQkJCQkvKiBWYXJpb3VzIHF1aXJrcyB0aGUgZGV2aWNlIGNhbiBwdWxsIG9uIHVzICovCi0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGlucHV0czsJCQkJCS8qIFRoZSBsaXN0IG9mIGlucHV0cyAqLwotCXZvaWQgKmhpZGRldjsJCQkJCQkJLyogVGhlIGhpZGRldiBzdHJ1Y3R1cmUgKi8KLQlpbnQgbWlub3I7CQkJCQkJCS8qIEhpZGRldiBtaW5vciBudW1iZXIgKi8KLQotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CQkJCQkJLyogRm9yIHNsZWVwaW5nICovCi0KLQlpbnQgb3BlbjsJCQkJCQkJLyogaXMgdGhlIGRldmljZSBvcGVuIGJ5IGFueW9uZT8gKi8KLQljaGFyIG5hbWVbMTI4XTsJCQkJCQkJLyogRGV2aWNlIG5hbWUgKi8KLQljaGFyIHBoeXNbNjRdOwkJCQkJCQkvKiBEZXZpY2UgcGh5c2ljYWwgbG9jYXRpb24gKi8KLQljaGFyIHVuaXFbNjRdOwkJCQkJCQkvKiBEZXZpY2UgdW5pcXVlIGlkZW50aWZpZXIgKHNlcmlhbCAjKSAqLwotCi0jaWZkZWYgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sKLQl1bnNpZ25lZCBsb25nIHBiX3ByZXNzZWRfZm5bTkJJVFMoS0VZX01BWCldOwotCXVuc2lnbmVkIGxvbmcgcGJfcHJlc3NlZF9udW1sb2NrW05CSVRTKEtFWV9NQVgpXTsKLSNlbmRpZgotfTsKLQotI2RlZmluZSBISURfR0xPQkFMX1NUQUNLX1NJWkUgNAotI2RlZmluZSBISURfQ09MTEVDVElPTl9TVEFDS19TSVpFIDQKLQotc3RydWN0IGhpZF9wYXJzZXIgewotCXN0cnVjdCBoaWRfZ2xvYmFsICAgICBnbG9iYWw7Ci0Jc3RydWN0IGhpZF9nbG9iYWwgICAgIGdsb2JhbF9zdGFja1tISURfR0xPQkFMX1NUQUNLX1NJWkVdOwotCXVuc2lnbmVkICAgICAgICAgICAgICBnbG9iYWxfc3RhY2tfcHRyOwotCXN0cnVjdCBoaWRfbG9jYWwgICAgICBsb2NhbDsKLQl1bnNpZ25lZCAgICAgICAgICAgICAgY29sbGVjdGlvbl9zdGFja1tISURfQ09MTEVDVElPTl9TVEFDS19TSVpFXTsKLQl1bnNpZ25lZCAgICAgICAgICAgICAgY29sbGVjdGlvbl9zdGFja19wdHI7Ci0Jc3RydWN0IGhpZF9kZXZpY2UgICAgKmRldmljZTsKLX07Ci0KLXN0cnVjdCBoaWRfY2xhc3NfZGVzY3JpcHRvciB7Ci0JX191OCAgYkRlc2NyaXB0b3JUeXBlOwotCV9fdTE2IHdEZXNjcmlwdG9yTGVuZ3RoOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBoaWRfZGVzY3JpcHRvciB7Ci0JX191OCAgYkxlbmd0aDsKLQlfX3U4ICBiRGVzY3JpcHRvclR5cGU7Ci0JX191MTYgYmNkSElEOwotCV9fdTggIGJDb3VudHJ5Q29kZTsKLQlfX3U4ICBiTnVtRGVzY3JpcHRvcnM7Ci0KLQlzdHJ1Y3QgaGlkX2NsYXNzX2Rlc2NyaXB0b3IgZGVzY1sxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jaWZkZWYgREVCVUcKLSNpbmNsdWRlICJoaWQtZGVidWcuaCIKLSNlbHNlCi0jZGVmaW5lIGhpZF9kdW1wX2lucHV0KGEsYikJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBoaWRfZHVtcF9kZXZpY2UoYykJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBoaWRfZHVtcF9maWVsZChhLGIpCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgcmVzb2x2X3VzYWdlKGEpCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHJlc29sdl9ldmVudChhLGIpCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVQKLS8qIEFwcGxpY2F0aW9ucyBmcm9tIEhJRCBVc2FnZSBUYWJsZXMgNC84Lzk5IFZlcnNpb24gMS4xICovCi0vKiBXZSBpZ25vcmUgYSBmZXcgaW5wdXQgYXBwbGljYXRpb25zIHRoYXQgYXJlIG5vdCB3aWRlbHkgdXNlZCAqLwotI2RlZmluZSBJU19JTlBVVF9BUFBMSUNBVElPTihhKSAoKChhID49IDB4MDAwMTAwMDApICYmIChhIDw9IDB4MDAwMTAwMDgpKSB8fCAoYSA9PSAweDAwMDEwMDgwKSB8fCAoYSA9PSAweDAwMGMwMDAxKSkKLWV4dGVybiB2b2lkIGhpZGlucHV0X2hpZF9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqLCBzdHJ1Y3QgaGlkX2ZpZWxkICosIHN0cnVjdCBoaWRfdXNhZ2UgKiwgX19zMzIpOwotZXh0ZXJuIHZvaWQgaGlkaW5wdXRfcmVwb3J0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpOwotZXh0ZXJuIGludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgaGlkaW5wdXRfZGlzY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqKTsKLSNlbHNlCi0jZGVmaW5lIElTX0lOUFVUX0FQUExJQ0FUSU9OKGEpICgwKQotc3RhdGljIGlubGluZSB2b2lkIGhpZGlucHV0X2hpZF9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBoaWRpbnB1dF9yZXBvcnRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCkgeyB9Ci1zdGF0aWMgaW5saW5lIGludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBoaWRpbnB1dF9kaXNjb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgfQotI2VuZGlmCi0KLWludCBoaWRfb3BlbihzdHJ1Y3QgaGlkX2RldmljZSAqKTsKLXZvaWQgaGlkX2Nsb3NlKHN0cnVjdCBoaWRfZGV2aWNlICopOwotaW50IGhpZF9zZXRfZmllbGQoc3RydWN0IGhpZF9maWVsZCAqLCB1bnNpZ25lZCwgX19zMzIpOwotdm9pZCBoaWRfc3VibWl0X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqLCBzdHJ1Y3QgaGlkX3JlcG9ydCAqLCB1bnNpZ25lZCBjaGFyIGRpcik7Ci12b2lkIGhpZF9pbml0X3JlcG9ydHMoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7Ci1pbnQgaGlkX3dhaXRfaW8oc3RydWN0IGhpZF9kZXZpY2UqIGhpZCk7Ci0KLQotI2lmZGVmIENPTkZJR19ISURfRkYKLWludCBoaWRfZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKLQotaW50IGhpZF9sZ2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7Ci1pbnQgaGlkX3RtZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKLWludCBoaWRfenBmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpOwotI2lmZGVmIENPTkZJR19ISURfUElECi1pbnQgaGlkX3BpZGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgaGlkX3BpZGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkgeyByZXR1cm4gLUVOT0RFVjsgfQotI2VuZGlmCi0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBoaWRfZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKSB7IHJldHVybiAtMTsgfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZGRldi5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMKaW5kZXggN2RjMTRkMC4uMTE0ZDZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMKQEAgLTMyLDggKzMyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSAiaGlkLmgiCisjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSA8bGludXgvaGlkZGV2Lmg+CisjaW5jbHVkZSAidXNiaGlkLmgiCiAKICNpZmRlZiBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTCiAjZGVmaW5lIEhJRERFVl9NSU5PUl9CQVNFCTAKQEAgLTE5Niw3ICsxOTcsNyBAQAogCiAJaGlkZGV2X3NlbmRfZXZlbnQoaGlkLCAmdXJlZik7CiB9Ci0KK0VYUE9SVF9TWU1CT0xfR1BMKGhpZGRldl9oaWRfZXZlbnQpOwogCiB2b2lkIGhpZGRldl9yZXBvcnRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCkKIHsKQEAgLTIxMyw2ICsyMTQsNyBAQAogCiAJaGlkZGV2X3NlbmRfZXZlbnQoaGlkLCAmdXJlZik7CiB9CisKIC8qCiAgKiBmYXN5bmMgZmlsZSBvcAogICovCkBAIC0yMzksNyArMjQxLDcgQEAKIAogCWlmICghLS1saXN0LT5oaWRkZXYtPm9wZW4pIHsKIAkJaWYgKGxpc3QtPmhpZGRldi0+ZXhpc3QpCi0JCQloaWRfY2xvc2UobGlzdC0+aGlkZGV2LT5oaWQpOworCQkJdXNiaGlkX2Nsb3NlKGxpc3QtPmhpZGRldi0+aGlkKTsKIAkJZWxzZQogCQkJa2ZyZWUobGlzdC0+aGlkZGV2KTsKIAl9CkBAIC0yNzAsNyArMjcyLDcgQEAKIAogCWlmICghbGlzdC0+aGlkZGV2LT5vcGVuKyspCiAJCWlmIChsaXN0LT5oaWRkZXYtPmV4aXN0KQotCQkJaGlkX29wZW4oaGlkZGV2X3RhYmxlW2ldLT5oaWQpOworCQkJdXNiaGlkX29wZW4oaGlkZGV2X3RhYmxlW2ldLT5oaWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zODIsNyArMzg0LDcgQEAKIAlzdHJ1Y3QgaGlkZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGhpZGRldiAqaGlkZGV2ID0gbGlzdC0+aGlkZGV2OwogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBoaWRkZXYtPmhpZDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaGlkLT5kZXY7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHRvX3VzYl9kZXZpY2UoaGlkLT5kZXYpOwogCXN0cnVjdCBoaWRkZXZfY29sbGVjdGlvbl9pbmZvIGNpbmZvOwogCXN0cnVjdCBoaWRkZXZfcmVwb3J0X2luZm8gcmluZm87CiAJc3RydWN0IGhpZGRldl9maWVsZF9pbmZvIGZpbmZvOwpAQCAtMzkxLDYgKzM5Myw3IEBACiAJc3RydWN0IGhpZGRldl9kZXZpbmZvIGRpbmZvOwogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBpOwogCkBAIC00MjAsNyArNDIzLDcgQEAKIAkJZGluZm8uYnVzdHlwZSA9IEJVU19VU0I7CiAJCWRpbmZvLmJ1c251bSA9IGRldi0+YnVzLT5idXNudW07CiAJCWRpbmZvLmRldm51bSA9IGRldi0+ZGV2bnVtOwotCQlkaW5mby5pZm51bSA9IGhpZC0+aWZudW07CisJCWRpbmZvLmlmbnVtID0gdXNiaGlkLT5pZm51bTsKIAkJZGluZm8udmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKIAkJZGluZm8ucHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwogCQlkaW5mby52ZXJzaW9uID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CkBAIC00NzksNyArNDgyLDcgQEAKIAkJfQogCiAJY2FzZSBISURJT0NJTklUUkVQT1JUOgotCQloaWRfaW5pdF9yZXBvcnRzKGhpZCk7CisJCXVzYmhpZF9pbml0X3JlcG9ydHMoaGlkKTsKIAogCQlyZXR1cm4gMDsKIApAQCAtNDkzLDggKzQ5Niw4IEBACiAJCWlmICgocmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfSU4pOwotCQloaWRfd2FpdF9pbyhoaWQpOworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9JTik7CisJCXVzYmhpZF93YWl0X2lvKGhpZCk7CiAKIAkJcmV0dXJuIDA7CiAKQEAgLTUwOCw4ICs1MTEsOCBAQAogCQlpZiAoKHJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7Ci0JCWhpZF93YWl0X2lvKGhpZCk7CisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7CisJCXVzYmhpZF93YWl0X2lvKGhpZCk7CiAKIAkJcmV0dXJuIDA7CiAKQEAgLTc0NSw2ICs3NDgsNyBAQAogaW50IGhpZGRldl9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCiB7CiAJc3RydWN0IGhpZGRldiAqaGlkZGV2OworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCWludCBpOwogCWludCByZXR2YWw7CiAKQEAgLTc2MCw3ICs3NjQsNyBAQAogCWlmICghKGhpZGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRkZXYpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtMTsKIAotCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYoaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KHVzYmhpZC0+aW50ZiwgJmhpZGRldl9jbGFzcyk7CiAJaWYgKHJldHZhbCkgewogCQllcnIoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKIAkJa2ZyZWUoaGlkZGV2KTsKQEAgLTc3MiwxMCArNzc2LDEwIEBACiAJaGlkZGV2LT5oaWQgPSBoaWQ7CiAJaGlkZGV2LT5leGlzdCA9IDE7CiAKLQloaWQtPm1pbm9yID0gaGlkLT5pbnRmLT5taW5vcjsKKwloaWQtPm1pbm9yID0gdXNiaGlkLT5pbnRmLT5taW5vcjsKIAloaWQtPmhpZGRldiA9IGhpZGRldjsKIAotCWhpZGRldl90YWJsZVtoaWQtPmludGYtPm1pbm9yIC0gSElEREVWX01JTk9SX0JBU0VdID0gaGlkZGV2OworCWhpZGRldl90YWJsZVt1c2JoaWQtPmludGYtPm1pbm9yIC0gSElEREVWX01JTk9SX0JBU0VdID0gaGlkZGV2OwogCiAJcmV0dXJuIDA7CiB9CkBAIC03ODgsMTQgKzc5MiwxNSBAQAogdm9pZCBoaWRkZXZfZGlzY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXN0cnVjdCBoaWRkZXYgKmhpZGRldiA9IGhpZC0+aGlkZGV2OworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCiAJaGlkZGV2LT5leGlzdCA9IDA7CiAKIAloaWRkZXZfdGFibGVbaGlkZGV2LT5oaWQtPm1pbm9yIC0gSElEREVWX01JTk9SX0JBU0VdID0gTlVMTDsKLQl1c2JfZGVyZWdpc3Rlcl9kZXYoaGlkZGV2LT5oaWQtPmludGYsICZoaWRkZXZfY2xhc3MpOworCXVzYl9kZXJlZ2lzdGVyX2Rldih1c2JoaWQtPmludGYsICZoaWRkZXZfY2xhc3MpOwogCiAJaWYgKGhpZGRldi0+b3BlbikgewotCQloaWRfY2xvc2UoaGlkZGV2LT5oaWQpOworCQl1c2JoaWRfY2xvc2UoaGlkZGV2LT5oaWQpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhpZGRldi0+d2FpdCk7CiAJfSBlbHNlIHsKIAkJa2ZyZWUoaGlkZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9rZXlzcGFuX3JlbW90ZS5jCmluZGV4IDUwYWE4MTAuLjk4YmQzMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQva2V5c3Bhbl9yZW1vdGUuYwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJcmVtb3RlLT5pbl9lbmRwb2ludCA9IGVuZHBvaW50OwogCXJlbW90ZS0+dG9nZ2xlID0gLTE7CS8qIFNldCB0byAtMSBzbyB3ZSB3aWxsIGFsd2F5cyBub3QgbWF0Y2ggdGhlIHRvZ2dsZSBmcm9tIHRoZSBmaXJzdCByZW1vdGUgbWVzc2FnZS4gKi8KIAotCXJlbW90ZS0+aW5fYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBSRUNWX1NJWkUsIFNMQUJfQVRPTUlDLCAmcmVtb3RlLT5pbl9kbWEpOworCXJlbW90ZS0+aW5fYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBSRUNWX1NJWkUsIEdGUF9BVE9NSUMsICZyZW1vdGUtPmluX2RtYSk7CiAJaWYgKCFyZW1vdGUtPmluX2J1ZmZlcikgewogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWwxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvbXRvdWNodXNiLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9tdG91Y2h1c2IuYwppbmRleCA3OWE4NWQ0Li45MmM0ZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9tdG91Y2h1c2IuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9tdG91Y2h1c2IuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJZGJnKCIlcyAtIGNhbGxlZCIsIF9fRlVOQ1RJT05fXyk7CiAKIAltdG91Y2gtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIE1UT1VDSFVTQl9SRVBPUlRfREFUQV9TSVpFLAotCQkJCQlTTEFCX0FUT01JQywgJm10b3VjaC0+ZGF0YV9kbWEpOworCQkJCQlHRlBfQVRPTUlDLCAmbXRvdWNoLT5kYXRhX2RtYSk7CiAKIAlpZiAoIW10b3VjaC0+ZGF0YSkKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvcG93ZXJtYXRlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYwppbmRleCAwYmY5MTc3Li5mZWE5N2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYwpAQCAtMjc3LDEyICsyNzcsMTIgQEAKIHN0YXRpYyBpbnQgcG93ZXJtYXRlX2FsbG9jX2J1ZmZlcnMoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCBwb3dlcm1hdGVfZGV2aWNlICpwbSkKIHsKIAlwbS0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgUE9XRVJNQVRFX1BBWUxPQURfU0laRV9NQVgsCi0JCQkJICAgIFNMQUJfQVRPTUlDLCAmcG0tPmRhdGFfZG1hKTsKKwkJCQkgICAgR0ZQX0FUT01JQywgJnBtLT5kYXRhX2RtYSk7CiAJaWYgKCFwbS0+ZGF0YSkKIAkJcmV0dXJuIC0xOwogCiAJcG0tPmNvbmZpZ2NyID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBzaXplb2YoKihwbS0+Y29uZmlnY3IpKSwKLQkJCQkJU0xBQl9BVE9NSUMsICZwbS0+Y29uZmlnY3JfZG1hKTsKKwkJCQkJR0ZQX0FUT01JQywgJnBtLT5jb25maWdjcl9kbWEpOwogCWlmICghcG0tPmNvbmZpZ2NyKQogCQlyZXR1cm4gLTE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3RvdWNoa2l0dXNiLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC90b3VjaGtpdHVzYi5jCmluZGV4IDA1YzBkMWMuLjJhMzE0YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3RvdWNoa2l0dXNiLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvdG91Y2hraXR1c2IuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCQkJICBzdHJ1Y3QgdG91Y2hraXRfdXNiICp0b3VjaGtpdCkKIHsKIAl0b3VjaGtpdC0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgVE9VQ0hLSVRfUkVQT1JUX0RBVEFfU0laRSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xBQl9BVE9NSUMsICZ0b3VjaGtpdC0+ZGF0YV9kbWEpOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfQVRPTUlDLCAmdG91Y2hraXQtPmRhdGFfZG1hKTsKIAogCWlmICghdG91Y2hraXQtPmRhdGEpCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYmhpZC5oIGIvZHJpdmVycy91c2IvaW5wdXQvdXNiaGlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwMTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYmhpZC5oCkBAIC0wLDAgKzEsODQgQEAKKyNpZm5kZWYgX19VU0JISURfSAorI2RlZmluZSBfX1VTQkhJRF9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVm9qdGVjaCBQYXZsaWsKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYgSmlyaSBLb3NpbmEKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKy8qICBBUEkgcHJvdmlkZWQgYnkgaGlkLWNvcmUuYyBmb3IgVVNCIEhJRCBkcml2ZXJzICovCitpbnQgdXNiaGlkX3dhaXRfaW8oc3RydWN0IGhpZF9kZXZpY2UqIGhpZCk7Cit2b2lkIHVzYmhpZF9jbG9zZShzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKK2ludCB1c2JoaWRfb3BlbihzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKK3ZvaWQgdXNiaGlkX2luaXRfcmVwb3J0cyhzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKK3ZvaWQgdXNiaGlkX3N1Ym1pdF9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwgdW5zaWduZWQgY2hhciBkaXIpOworCisvKgorICogVVNCLXNwZWNpZmljIEhJRCBzdHJ1Y3QsIHRvIGJlIHBvaW50ZWQgdG8KKyAqIGZyb20gc3RydWN0IGhpZF9kZXZpY2UtPmRyaXZlcl9kYXRhCisgKi8KKworc3RydWN0IHVzYmhpZF9kZXZpY2UgeworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQ7CQkJCQkJLyogcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIEhJRCBkZXYgKi8KKworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0IgaW50ZXJmYWNlICovCisJaW50IGlmbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTQiBpbnRlcmZhY2UgbnVtYmVyICovCisKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVJCIGJ1ZmZlciBzaXplICovCisKKwlzdHJ1Y3QgdXJiICp1cmJpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgVVJCICovCisJY2hhciAqaW5idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgaW5idWZfZG1hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgZG1hICovCisJc3BpbmxvY2tfdCBpbmxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGZpZm8gc3BpbmxvY2sgKi8KKworCXN0cnVjdCB1cmIgKnVyYmN0cmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFVSQiAqLworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIHJlcXVlc3Qgc3RydWN0ICovCisJZG1hX2FkZHJfdCBjcl9kbWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgcmVxdWVzdCBzdHJ1Y3QgZG1hICovCisJc3RydWN0IGhpZF9jb250cm9sX2ZpZm8gY3RybFtISURfQ09OVFJPTF9GSUZPX1NJWkVdOyAgCQkvKiBDb250cm9sIGZpZm8gKi8KKwl1bnNpZ25lZCBjaGFyIGN0cmxoZWFkLCBjdHJsdGFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBmaWZvIGhlYWQgJiB0YWlsICovCisJY2hhciAqY3RybGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgYnVmZmVyICovCisJZG1hX2FkZHJfdCBjdHJsYnVmX2RtYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgYnVmZmVyIGRtYSAqLworCXNwaW5sb2NrX3QgY3RybGxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIGZpZm8gc3BpbmxvY2sgKi8KKworCXN0cnVjdCB1cmIgKnVyYm91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgVVJCICovCisJc3RydWN0IGhpZF9yZXBvcnQgKm91dFtISURfQ09OVFJPTF9GSUZPX1NJWkVdOyAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBwaXBlIGZpZm8gKi8KKwl1bnNpZ25lZCBjaGFyIG91dGhlYWQsIG91dHRhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHBpcGUgZmlmbyBoZWFkICYgdGFpbCAqLworCWNoYXIgKm91dGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisJZG1hX2FkZHJfdCBvdXRidWZfZG1hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgZG1hICovCisJc3BpbmxvY2tfdCBvdXRsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBmaWZvIHNwaW5sb2NrICovCisKKwl1bnNpZ25lZCBsb25nIGlvZmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSS9PIGZsYWdzIChDVFJMX1JVTk5JTkcsIE9VVF9SVU5OSU5HKSAqLworCXN0cnVjdCB0aW1lcl9saXN0IGlvX3JldHJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXRyeSB0aW1lciAqLworCXVuc2lnbmVkIGxvbmcgc3RvcF9yZXRyeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIHRvIGdpdmUgdXAsIGluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBpbnQgcmV0cnlfZGVsYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgbGVuZ3RoIGluIG1zICovCisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dvcms7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhc2sgY29udGV4dCBmb3IgcmVzZXRzICovCisKK307CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC91c2JrYmQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYmtiZC5jCmluZGV4IGM3MzI4NWMuLjg1MDU4MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYmtiZC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYmtiZC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAltZW1jcHkoa2JkLT5vbGQsIGtiZC0+bmV3LCA4KTsKIAogcmVzdWJtaXQ6Ci0JaSA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIFNMQUJfQVRPTUlDKTsKKwlpID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKGkpCiAJCWVyciAoImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL2lucHV0MCwgc3RhdHVzICVkIiwKIAkJCQlrYmQtPnVzYmRldi0+YnVzLT5idXNfbmFtZSwKQEAgLTE5NiwxMSArMTk2LDExIEBACiAJCXJldHVybiAtMTsKIAlpZiAoIShrYmQtPmxlZCA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLTE7Ci0JaWYgKCEoa2JkLT5uZXcgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgOCwgU0xBQl9BVE9NSUMsICZrYmQtPm5ld19kbWEpKSkKKwlpZiAoIShrYmQtPm5ldyA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCA4LCBHRlBfQVRPTUlDLCAma2JkLT5uZXdfZG1hKSkpCiAJCXJldHVybiAtMTsKLQlpZiAoIShrYmQtPmNyID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwgU0xBQl9BVE9NSUMsICZrYmQtPmNyX2RtYSkpKQorCWlmICghKGtiZC0+Y3IgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpLCBHRlBfQVRPTUlDLCAma2JkLT5jcl9kbWEpKSkKIAkJcmV0dXJuIC0xOwotCWlmICghKGtiZC0+bGVkcyA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCAxLCBTTEFCX0FUT01JQywgJmtiZC0+bGVkc19kbWEpKSkKKwlpZiAoIShrYmQtPmxlZHMgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgMSwgR0ZQX0FUT01JQywgJmtiZC0+bGVkc19kbWEpKSkKIAkJcmV0dXJuIC0xOwogCiAJcmV0dXJuIDA7CkBAIC0yMDgsMTAgKzIwOCw4IEBACiAKIHN0YXRpYyB2b2lkIHVzYl9rYmRfZnJlZV9tZW0oc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc3RydWN0IHVzYl9rYmQgKmtiZCkKIHsKLQlpZiAoa2JkLT5pcnEpCi0JCXVzYl9mcmVlX3VyYihrYmQtPmlycSk7Ci0JaWYgKGtiZC0+bGVkKQotCQl1c2JfZnJlZV91cmIoa2JkLT5sZWQpOworCXVzYl9mcmVlX3VyYihrYmQtPmlycSk7CisJdXNiX2ZyZWVfdXJiKGtiZC0+bGVkKTsKIAlpZiAoa2JkLT5uZXcpCiAJCXVzYl9idWZmZXJfZnJlZShkZXYsIDgsIGtiZC0+bmV3LCBrYmQtPm5ld19kbWEpOwogCWlmIChrYmQtPmNyKQpAQCAtMjM2LDkgKzIzNCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOwotCWlmICghKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpCisJaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYwppbmRleCBjYmJiZWEzLi42NGEzM2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYm1vdXNlLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAogCWlucHV0X3N5bmMoZGV2KTsKIHJlc3VibWl0OgotCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIFNMQUJfQVRPTUlDKTsKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzKQogCQllcnIgKCJjYW4ndCByZXN1Ym1pdCBpbnRyLCAlcy0lcy9pbnB1dDAsIHN0YXR1cyAlZCIsCiAJCQkJbW91c2UtPnVzYmRldi0+YnVzLT5idXNfbmFtZSwKQEAgLTEyNiw5ICsxMjYsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKLQlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOwpAQCAtMTM5LDcgKzEzNyw3IEBACiAJaWYgKCFtb3VzZSB8fCAhaW5wdXRfZGV2KQogCQlnb3RvIGZhaWwxOwogCi0JbW91c2UtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgOCwgU0xBQl9BVE9NSUMsICZtb3VzZS0+ZGF0YV9kbWEpOworCW1vdXNlLT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIDgsIEdGUF9BVE9NSUMsICZtb3VzZS0+ZGF0YV9kbWEpOwogCWlmICghbW91c2UtPmRhdGEpCiAJCWdvdG8gZmFpbDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYnRvdWNoc2NyZWVuLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2J0b3VjaHNjcmVlbi5jCmluZGV4IGYyNmMxY2QuLjdmM2M1N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYnRvdWNoc2NyZWVuLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvdXNidG91Y2hzY3JlZW4uYwpAQCAtOCw2ICs4LDcgQEAKICAqICAtIFBhbkppdCBUb3VjaFNldAogICogIC0gZVR1cmJvVG91Y2gKICAqICAtIEd1bnplIEFITDYxCisgKiAgLSBETUMgVFNDLTEwLzI1CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgYnkgRGFuaWVsIFJpdHogPGRhbmllbC5yaXR6QGdteC5jaD4KICAqIENvcHlyaWdodCAoQykgYnkgVG9kZCBFLiBKb2huc29uIChtdG91Y2h1c2IuYykKQEAgLTMwLDYgKzMxLDggQEAKICAqIC0gSVRNIHBhcnRzIGFyZSBmcm9tIGl0bXRvdWNoLmMKICAqIC0gM00gcGFydHMgYXJlIGZyb20gbXRvdWNodXNiLmMKICAqIC0gUGFuSml0IHBhcnRzIGFyZSBmcm9tIGFuIHVubWVyZ2VkIGRyaXZlciBieSBMYW5zbG90dCBHaXNoCisgKiAtIERNQyBUU0MgMTAvMjUgYXJlIGZyb20gSG9sZ2VyIFNjaHVyaWcsIHdpdGggaWRlYXMgZnJvbSBhbiB1bm1lcmdlZAorICogICBkcml2ZXIgZnJvbSBNYXJpdXMgVm9sbG1lcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDQsNyArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgogCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJ2MC40IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYwLjUiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJEYW5pZWwgUml0eiA8ZGFuaWVsLnJpdHpAZ214LmNoPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MJCSJVU0IgVG91Y2hzY3JlZW4gRHJpdmVyIgogCkBAIC0xMDMsNiArMTA2LDcgQEAKIAlERVZUWVBFX0lUTSwKIAlERVZUWVBFX0VUVVJCTywKIAlERVZUWVBFX0dVTlpFLAorCURFVlRZUEVfRE1DX1RTQzEwLAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYnRvdWNoX2RldmljZXNbXSA9IHsKQEAgLTEzOSw2ICsxNDMsMTAgQEAKIAl7VVNCX0RFVklDRSgweDA2MzcsIDB4MDAwMSksIC5kcml2ZXJfaW5mbyA9IERFVlRZUEVfR1VOWkV9LAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVVNCX1RPVUNIU0NSRUVOX0RNQ19UU0MxMAorCXtVU0JfREVWSUNFKDB4MGFmYSwgMHgwM2U4KSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9ETUNfVFNDMTB9LAorI2VuZGlmCisKIAl7fQogfTsKIApAQCAtMjU2LDEwICsyNjQsMTAgQEAKIHsKIAkqeCA9ICgocGt0WzBdICYgMHgxRikgPDwgNykgfCAocGt0WzNdICYgMHg3Rik7CiAJKnkgPSAoKHBrdFsxXSAmIDB4MUYpIDw8IDcpIHwgKHBrdFs0XSAmIDB4N0YpOwotCSpwcmVzcyA9ICgocGt0WzJdICYgMHgxRikgPDwgNykgfCAocGt0WzVdICYgMHg3Rik7CisJKnByZXNzID0gKChwa3RbMl0gJiAweDAxKSA8PCA3KSB8IChwa3RbNV0gJiAweDdGKTsKIAkqdG91Y2ggPSB+cGt0WzddICYgMHgyMDsKIAotCXJldHVybiAxOworCXJldHVybiAqdG91Y2g7CiB9CiAjZW5kaWYKIApAQCAtMzEzLDYgKzMyMSw4MCBAQAogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRE1DIFRTQy0xMC8yNSBQYXJ0CisgKgorICogRG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgY29udHJvbGxlciBhbmQgaXQncyBwcm90b2NvbCBjYW4gYmUgZm91bmQgYXQKKyAqICAgaHR0cDovL3d3dy5kbWNjb2x0ZC5jb20vZmlsZXMvY29udHJvbGVyL3RzYzEwdXNiX3BpX2UucGRmCisgKiAgIGh0dHA6Ly93d3cuZG1jY29sdGQuY29tL2ZpbGVzL2NvbnRyb2xlci90c2MyNV91c2JfZS5wZGYKKyAqLworI2lmZGVmIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU5fRE1DX1RTQzEwCisKKy8qIHN1cHBvcnRlZCBkYXRhIHJhdGVzLiBjdXJyZW50bHkgdXNpbmcgMTMwICovCisjZGVmaW5lIFRTQzEwX1JBVEVfUE9JTlQJMHg1MAorI2RlZmluZSBUU0MxMF9SQVRFXzMwCQkweDQwCisjZGVmaW5lIFRTQzEwX1JBVEVfNTAJCTB4NDEKKyNkZWZpbmUgVFNDMTBfUkFURV84MAkJMHg0MgorI2RlZmluZSBUU0MxMF9SQVRFXzEwMAkJMHg0MworI2RlZmluZSBUU0MxMF9SQVRFXzEzMAkJMHg0NAorI2RlZmluZSBUU0MxMF9SQVRFXzE1MAkJMHg0NQorCisvKiBjb21tYW5kcyAqLworI2RlZmluZSBUU0MxMF9DTURfUkVTRVQJCTB4NTUKKyNkZWZpbmUgVFNDMTBfQ01EX1JBVEUJCTB4MDUKKyNkZWZpbmUgVFNDMTBfQ01EX0RBVEExCQkweDAxCisKK3N0YXRpYyBpbnQgZG1jX3RzYzEwX2luaXQoc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2gpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHVzYnRvdWNoLT51ZGV2OworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisKKwkvKiByZXNldCAqLworCWJ1ZlswXSA9IGJ1ZlsxXSA9IDB4RkY7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlIChkZXYsIDApLAorCSAgICAgICAgICAgICAgICAgICAgICBUU0MxMF9DTURfUkVTRVQsCisJICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCSAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBidWYsIDIsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoYnVmWzBdICE9IDB4MDYgfHwgYnVmWzFdICE9IDB4MDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogc2V0IGNvb3JkaW5hdGUgb3V0cHV0IHJhdGUgKi8KKwlidWZbMF0gPSBidWZbMV0gPSAweEZGOworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZSAoZGV2LCAwKSwKKwkgICAgICAgICAgICAgICAgICAgICAgVFNDMTBfQ01EX1JBVEUsCisJICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCSAgICAgICAgICAgICAgICAgICAgICBUU0MxMF9SQVRFXzE1MCwgMCwgYnVmLCAyLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKGJ1ZlswXSAhPSAweDA2IHx8IGJ1ZlsxXSAhPSAweDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHN0YXJ0IHNlbmRpbmcgZGF0YSAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZSAoZGV2LCAwKSwKKwkgICAgICAgICAgICAgICAgICAgICAgVFNDMTBfQ01EX0RBVEExLAorCSAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZG1jX3RzYzEwX3JlYWRfZGF0YSh1bnNpZ25lZCBjaGFyICpwa3QsIGludCAqeCwgaW50ICp5LCBpbnQgKnRvdWNoLCBpbnQgKnByZXNzKQoreworCSp4ID0gKChwa3RbMl0gJiAweDAzKSA8PCA4KSB8IHBrdFsxXTsKKwkqeSA9ICgocGt0WzRdICYgMHgwMykgPDwgOCkgfCBwa3RbM107CisJKnRvdWNoID0gcGt0WzBdICYgMHgwMTsKKworCXJldHVybiAxOworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiB0aGUgZGlmZmVyZW50IGRldmljZSBkZXNjcmlwdG9ycwogICovCiBzdGF0aWMgc3RydWN0IHVzYnRvdWNoX2RldmljZV9pbmZvIHVzYnRvdWNoX2Rldl9pbmZvW10gPSB7CkBAIC0zODksNiArNDcxLDE4IEBACiAJCS5yZWFkX2RhdGEJPSBndW56ZV9yZWFkX2RhdGEsCiAJfSwKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQl9UT1VDSFNDUkVFTl9ETUNfVFNDMTAKKwlbREVWVFlQRV9ETUNfVFNDMTBdID0geworCQkubWluX3hjCQk9IDB4MCwKKwkJLm1heF94YwkJPSAweDAzZmYsCisJCS5taW5feWMJCT0gMHgwLAorCQkubWF4X3ljCQk9IDB4MDNmZiwKKwkJLnJlcHRfc2l6ZQk9IDUsCisJCS5pbml0CQk9IGRtY190c2MxMF9pbml0LAorCQkucmVhZF9kYXRhCT0gZG1jX3RzYzEwX3JlYWRfZGF0YSwKKwl9LAorI2VuZGlmCiB9OwogCiAKQEAgLTU4Niw3ICs2ODAsNyBAQAogCQl0eXBlLT5wcm9jZXNzX3BrdCA9IHVzYnRvdWNoX3Byb2Nlc3NfcGt0OwogCiAJdXNidG91Y2gtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIHR5cGUtPnJlcHRfc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xBQl9LRVJORUwsICZ1c2J0b3VjaC0+ZGF0YV9kbWEpOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMLCAmdXNidG91Y2gtPmRhdGFfZG1hKTsKIAlpZiAoIXVzYnRvdWNoLT5kYXRhKQogCQlnb3RvIG91dF9mcmVlOwogCkBAIC02NDAsNyArNzM0LDcgQEAKIAkJICAgICAgICAgICAgICAgICAgICAgdHlwZS0+bWF4X3ByZXNzLCAwLCAwKTsKIAogCXVzYl9maWxsX2ludF91cmIodXNidG91Y2gtPmlycSwgdXNidG91Y2gtPnVkZXYsCi0JCQkgdXNiX3JjdmludHBpcGUodXNidG91Y2gtPnVkZXYsIDB4ODEpLAorCQkJIHVzYl9yY3ZpbnRwaXBlKHVzYnRvdWNoLT51ZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkgdXNidG91Y2gtPmRhdGEsIHR5cGUtPnJlcHRfc2l6ZSwKIAkJCSB1c2J0b3VjaF9pcnEsIHVzYnRvdWNoLCBlbmRwb2ludC0+YkludGVydmFsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uaCBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmgKaW5kZXggN2IzODQwZS4uZDg1YWJmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uaAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5oCkBAIC02Myw2ICs2Myw3IEBACiAgKiAgICAgIHYxLjQ2IChwYykgLSBTcGxpdCB3YWNvbS5jIGludG8gd2Fjb21fc3lzLmMgYW5kIHdhY29tX3dhYy5jLAogICoJCSAgIC0gd2hlcmUgd2Fjb21fc3lzLmMgZGVhbHMgd2l0aCBzeXN0ZW0gc3BlY2lmaWMgY29kZSwKICAqIAkJICAgLSBhbmQgd2Fjb21fd2FjLmMgZGVhbHMgd2l0aCBXYWNvbSBzcGVjaWZpYyBjb2RlCisgKgkJICAgLSBTdXBwb3J0IEludHVvczMgNHg2CiAgKi8KIAogLyoKQEAgLTEwOSw3ICsxMTAsNiBAQAogfTsKIAogZXh0ZXJuIGludCB3YWNvbV93YWNfaXJxKHN0cnVjdCB3YWNvbV93YWMgKiB3YWNvbV93YWMsIHZvaWQgKiB3Y29tYm8pOwotZXh0ZXJuIHZvaWQgd2Fjb21fc3lzX2lycShzdHJ1Y3QgdXJiICp1cmIpOwogZXh0ZXJuIHZvaWQgd2Fjb21fcmVwb3J0X2Ficyh2b2lkICp3Y29tYm8sIHVuc2lnbmVkIGludCBhYnNfdHlwZSwgaW50IGFic19kYXRhKTsKIGV4dGVybiB2b2lkIHdhY29tX3JlcG9ydF9yZWwodm9pZCAqd2NvbWJvLCB1bnNpZ25lZCBpbnQgcmVsX3R5cGUsIGludCByZWxfZGF0YSk7CiBleHRlcm4gdm9pZCB3YWNvbV9yZXBvcnRfa2V5KHZvaWQgKndjb21ibywgdW5zaWduZWQgaW50IGtleV90eXBlLCBpbnQga2V5X2RhdGEpOwpAQCAtMTE4LDYgKzExOCw3IEBACiBleHRlcm4gdm9pZCB3YWNvbV9pbml0X2lucHV0X2RldihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyk7CiBleHRlcm4gdm9pZCBpbnB1dF9kZXZfZzQoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpOwogZXh0ZXJuIHZvaWQgaW5wdXRfZGV2X2coc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpOworZXh0ZXJuIHZvaWQgaW5wdXRfZGV2X2kzcyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyk7CiBleHRlcm4gdm9pZCBpbnB1dF9kZXZfaTMoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpOwogZXh0ZXJuIHZvaWQgaW5wdXRfZGV2X2koc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpOwogZXh0ZXJuIHZvaWQgaW5wdXRfZGV2X3BsKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3N5cy5jIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fc3lzLmMKaW5kZXggZDIzM2MzNy4uZTdjYzIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fc3lzLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fc3lzLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAlyZXR1cm4gd2NvbWJvLT53YWNvbS0+ZGV2OwogfQogCi12b2lkIHdhY29tX3N5c19pcnEoc3RydWN0IHVyYiAqdXJiKQorc3RhdGljIHZvaWQgd2Fjb21fc3lzX2lycShzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHdhY29tICp3YWNvbSA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgd2Fjb21fY29tYm8gd2NvbWJvOwpAQCAtMTEwLDcgKzExMCw3IEBACiBfX3UxNiB3YWNvbV9sZTE2X3RvX2NwdSh1bnNpZ25lZCBjaGFyICpkYXRhKQogewogCV9fdTE2IHZhbHVlOwotCXZhbHVlID0gYmUxNl90b19jcHUoKihfX2JlMTYgKikgZGF0YSk7CisJdmFsdWUgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSBkYXRhKTsKIAlyZXR1cm4gdmFsdWU7CiB9CiAKQEAgLTE0Myw3ICsxNDMsNyBAQAogCWlucHV0X2Rldi0+ZXZiaXRbMF0gfD0gQklUKEVWX01TQyk7CiAJaW5wdXRfZGV2LT5tc2NiaXRbMF0gfD0gQklUKE1TQ19TRVJJQUwpOwogCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfRklOR0VSKTsKLQlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9MRUZUKV0gfD0gQklUKEJUTl8wKSB8IEJJVChCVE5fMSkgfCBCSVQoQlROXzIpIHwgQklUKEJUTl8zKSB8IEJJVChCVE5fNCkgfCBCSVQoQlROXzUpIHwgQklUKEJUTl82KSB8IEJJVChCVE5fNyk7CisJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fTEVGVCldIHw9IEJJVChCVE5fMCkgfCBCSVQoQlROXzQpOwogfQogCiB2b2lkIGlucHV0X2Rldl9nKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKQpAQCAtMTU1LDExICsxNTUsMTYgQEAKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ESVNUQU5DRSwgMCwgd2Fjb21fd2FjLT5mZWF0dXJlcy0+ZGlzdGFuY2VfbWF4LCAwLCAwKTsKIH0KIAotdm9pZCBpbnB1dF9kZXZfaTMoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpCit2b2lkIGlucHV0X2Rldl9pM3Moc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpCiB7CiAJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9GSU5HRVIpOwotCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROXzApIHwgQklUKEJUTl8xKSB8IEJJVChCVE5fMikgfCBCSVQoQlROXzMpIHwgQklUKEJUTl80KSB8IEJJVChCVE5fNSkgfCBCSVQoQlROXzYpIHwgQklUKEJUTl83KTsKKwlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9MRUZUKV0gfD0gQklUKEJUTl8wKSB8IEJJVChCVE5fMSkgfCBCSVQoQlROXzIpIHwgQklUKEJUTl8zKTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19SWCwgMCwgNDA5NywgMCwgMCk7Cit9CisKK3ZvaWQgaW5wdXRfZGV2X2kzKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKQoreworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROXzQpIHwgQklUKEJUTl81KSB8IEJJVChCVE5fNikgfCBCSVQoQlROXzcpOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1JZLCAwLCA0MDk3LCAwLCAwKTsKIH0KIApAQCAtMjE4LDggKzIyMyw3IEBACiAJc3RybGNhdCh3YWNvbS0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2Yod2Fjb20tPnBoeXMpKTsKIAogCXdhY29tX3dhYy0+ZmVhdHVyZXMgPSBnZXRfd2Fjb21fZmVhdHVyZShpZCk7Ci0JaWYgKHdhY29tX3dhYy0+ZmVhdHVyZXMtPnBrdGxlbiA+IDEwKQotCQlCVUcoKTsKKwlCVUdfT04od2Fjb21fd2FjLT5mZWF0dXJlcy0+cGt0bGVuID4gMTApOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gd2Fjb21fd2FjLT5mZWF0dXJlcy0+bmFtZTsKIAl3YWNvbS0+d2Fjb21fd2FjID0gd2Fjb21fd2FjOwpAQCAtMjQ0LDcgKzI0OCw3IEBACiAJdXNiX2ZpbGxfaW50X3VyYih3YWNvbS0+aXJxLCBkZXYsCiAJCQkgdXNiX3JjdmludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkgd2Fjb21fd2FjLT5kYXRhLCB3YWNvbV93YWMtPmZlYXR1cmVzLT5wa3RsZW4sCi0JCQkgd2Fjb21fd2FjLT5mZWF0dXJlcy0+aXJxLCB3YWNvbSwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisJCQkgd2Fjb21fc3lzX2lycSwgd2Fjb20sIGVuZHBvaW50LT5iSW50ZXJ2YWwpOwogCXdhY29tLT5pcnEtPnRyYW5zZmVyX2RtYSA9IHdhY29tLT5kYXRhX2RtYTsKIAl3YWNvbS0+aXJxLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIApAQCAtMjc4LDggKzI4Miw4IEBACiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHdhY29tLT5kZXYpOwogCQl1c2JfZnJlZV91cmIod2Fjb20tPmlycSk7CiAJCXVzYl9idWZmZXJfZnJlZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAxMCwgd2Fjb20tPndhY29tX3dhYy0+ZGF0YSwgd2Fjb20tPmRhdGFfZG1hKTsKLQkJa2ZyZWUod2Fjb20pOwogCQlrZnJlZSh3YWNvbS0+d2Fjb21fd2FjKTsKKwkJa2ZyZWUod2Fjb20pOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fd2FjLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuYwppbmRleCBhYTMxZDIyLi45MjcyNmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuYwpAQCAtMTkxLDkgKzE5MSw5IEBACiAJCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9MRUZULCBkYXRhWzFdICYgMHgwMSk7CiAJCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9SSUdIVCwgZGF0YVsxXSAmIDB4MDIpOwogCQkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gV0FDT01fRzQpCi0JCQkJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfRElTVEFOQ0UsIGRhdGFbNl0pOworCQkJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX0RJU1RBTkNFLCBkYXRhWzZdICYgMHgzZik7CiAJCQkJZWxzZQotCQkJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX0RJU1RBTkNFLCBkYXRhWzddKTsKKwkJCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19ESVNUQU5DRSwgZGF0YVs3XSAmIDB4M2YpOwogCQkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMzAzLDggKzMwMyw5IEBACiAJCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX1BFTjsKIAkJfQogCQkvKiBvbmx5IGxhcmdlIEkzIHN1cHBvcnQgTGVucyBDdXJzb3IgKi8KLQkJaWYoISgod2Fjb20tPnRvb2xbaWR4XSA9PSBCVE5fVE9PTF9MRU5TKSAmJgotCQkJCSh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TMykpKSB7CisJCWlmKCEoKHdhY29tLT50b29sW2lkeF0gPT0gQlROX1RPT0xfTEVOUykKKwkJCQkgJiYgKCh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TMykKKwkJCQkgfHwgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBJTlRVT1MzUykpKSkgewogCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19NSVNDLCB3YWNvbS0+aWRbaWR4XSk7IC8qIHJlcG9ydCB0b29sIGlkICovCiAJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgd2Fjb20tPnRvb2xbaWR4XSwgMSk7CiAJCQl3YWNvbV9pbnB1dF9ldmVudCh3Y29tYm8sIEVWX01TQywgTVNDX1NFUklBTCwgd2Fjb20tPnNlcmlhbFtpZHhdKTsKQEAgLTMxNSwxMCArMzE2LDE0IEBACiAKIAkvKiBFeGl0IHJlcG9ydCAqLwogCWlmICgoZGF0YVsxXSAmIDB4ZmUpID09IDB4ODApIHsKLQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIHdhY29tLT50b29sW2lkeF0sIDApOwotCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX01JU0MsIDApOyAvKiByZXNldCB0b29sIGlkICovCi0JCXdhY29tX2lucHV0X2V2ZW50KHdjb21ibywgRVZfTVNDLCBNU0NfU0VSSUFMLCB3YWNvbS0+c2VyaWFsW2lkeF0pOwotCQlyZXR1cm4gMjsKKyAJCWlmKCEoKHdhY29tLT50b29sW2lkeF0gPT0gQlROX1RPT0xfTEVOUykKKwkJCQkgJiYgKCh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TMykKKwkJCQkgfHwgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBJTlRVT1MzUykpKSkgeworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIHdhY29tLT50b29sW2lkeF0sIDApOworCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19NSVNDLCAwKTsgLyogcmVzZXQgdG9vbCBpZCAqLworCQkJd2Fjb21faW5wdXRfZXZlbnQod2NvbWJvLCBFVl9NU0MsIE1TQ19TRVJJQUwsIHdhY29tLT5zZXJpYWxbaWR4XSk7CisJCQlyZXR1cm4gMjsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM4Miw3ICszODcsOCBAQAogCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1JYLCAoKGRhdGFbMV0gJiAweDFmKSA8PCA4KSB8IGRhdGFbMl0pOwogCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1JZLCAoKGRhdGFbM10gJiAweDFmKSA8PCA4KSB8IGRhdGFbNF0pOwogCi0JCWlmKChkYXRhWzVdICYgMHgwZikgfCAoZGF0YVs2XSAmIDB4MGYpIHwgKGRhdGFbMV0gJiAweDFmKSB8IGRhdGFbMl0pCisJCWlmKChkYXRhWzVdICYgMHgwZikgfCAoZGF0YVs2XSAmIDB4MGYpIHwgKGRhdGFbMV0gJiAweDFmKSB8CisJCQlkYXRhWzJdIHwgKGRhdGFbM10gJiAweDFmKSB8IGRhdGFbNF0pCiAJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgd2Fjb20tPnRvb2xbMV0sIDEpOwogCQllbHNlCiAJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgd2Fjb20tPnRvb2xbMV0sIDApOwpAQCAtNDMyLDcgKzQzOCw3IEBACiAJCQkJCSgodCAtIDEpIC8gMikgOiAtdCAvIDIpOwogCQkJfQogCi0JCX0gZWxzZSBpZiAoIShkYXRhWzFdICYgMHgxMCkgJiYgd2Fjb20tPmZlYXR1cmVzLT50eXBlIDwgSU5UVU9TMykgeworCQl9IGVsc2UgaWYgKCEoZGF0YVsxXSAmIDB4MTApICYmIHdhY29tLT5mZWF0dXJlcy0+dHlwZSA8IElOVFVPUzNTKSB7CiAJCQkvKiA0RCBtb3VzZSBwYWNrZXQgKi8KIAkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwMSk7CiAJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX01JRERMRSwgZGF0YVs4XSAmIDB4MDIpOwpAQCAtNDUyLDEyICs0NTgsMTIgQEAKIAkJCQkJCSAtICgoZGF0YVs4XSAmIDB4MDIpID4+IDEpKTsKIAogCQkJLyogSTMgMkQgbW91c2Ugc2lkZSBidXR0b25zICovCi0JCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzMpIHsKKwkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPj0gSU5UVU9TM1MgJiYgd2Fjb20tPmZlYXR1cmVzLT50eXBlIDw9IElOVFVPUzNMKSB7CiAJCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9TSURFLCAgIGRhdGFbOF0gJiAweDQwKTsKIAkJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX0VYVFJBLCAgZGF0YVs4XSAmIDB4MjApOwogCQkJfQogCi0JCX0gZWxzZSBpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlIDwgSU5UVU9TMykgeworCQl9IGVsc2UgaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA8IElOVFVPUzNTIHx8IHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBJTlRVT1MzTCkgewogCQkJLyogTGVucyBjdXJzb3IgcGFja2V0cyAqLwogCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9MRUZULCAgIGRhdGFbOF0gJiAweDAxKTsKIAkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fTUlERExFLCBkYXRhWzhdICYgMHgwMik7CkBAIC00OTAsNiArNDk2LDcgQEAKIAkJCXJldHVybiAod2Fjb21fcHR1X2lycSh3YWNvbV93YWMsIHdjb21ibykpOwogCQkJYnJlYWs7CiAJCWNhc2UgSU5UVU9TOgorCQljYXNlIElOVFVPUzNTOgogCQljYXNlIElOVFVPUzM6CiAJCWNhc2UgSU5UVU9TM0w6CiAJCWNhc2UgQ0lOVElROgpAQCAtNTE1LDYgKzUyMiw4IEBACiAJCWNhc2UgQ0lOVElROgogCQkJaW5wdXRfZGV2X2kzKGlucHV0X2Rldiwgd2Fjb21fd2FjKTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElOVFVPUzNTOgorCQkJaW5wdXRfZGV2X2kzcyhpbnB1dF9kZXYsIHdhY29tX3dhYyk7CiAJCWNhc2UgSU5UVU9TOgogCQkJaW5wdXRfZGV2X2koaW5wdXRfZGV2LCB3YWNvbV93YWMpOwogCQkJYnJlYWs7CkBAIC01MzAsNDkgKzUzOSw1MCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzW10gPSB7Ci0JeyAiV2Fjb20gUGVucGFydG5lciIsICAgIDcsICAgNTA0MCwgIDM3ODAsICAyNTUsIDMyLCBQRU5QQVJUTkVSLAl3YWNvbV9zeXNfaXJxIH0sCi0gICAgICAgIHsgIldhY29tIEdyYXBoaXJlIiwgICAgICA4LCAgMTAyMDYsICA3NDIyLCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTIgNHg1IiwgOCwgIDEwMjA2LCAgNzQyMiwgIDUxMSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmUyIDV4NyIsIDgsICAxMzkxOCwgMTAyMDYsICA1MTEsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlMyIsICAgICA4LCAgMTAyMDgsICA3NDI0LCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTMgNng4IiwgOCwgIDE2NzA0LCAxMjA2NCwgIDUxMSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmU0IDR4NSIsIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCBXQUNPTV9HNCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlNCA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCAzMiwgV0FDT01fRzQsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBWb2xpdG8iLCAgICAgICAgOCwgICA1MTA0LCAgMzcxMiwgIDUxMSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gUGVuU3RhdGlvbjIiLCAgIDgsICAgMzI1MCwgIDIzMjAsICAyNTUsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIFZvbGl0bzIgNHg1IiwgICA4LCAgIDUxMDQsICAzNzEyLCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBWb2xpdG8yIDJ4MyIsICAgOCwgICAzMjQ4LCAgMjMyMCwgIDUxMSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gUGVuUGFydG5lcjIiLCAgIDgsICAgMzI1MCwgIDIzMjAsICAyNTUsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvcyA0eDUiLCAgIDEwLCAgMTI3MDAsIDEwNjAwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxfSwKLQl7ICJXYWNvbSBJbnR1b3MgNng4IiwgICAxMCwgIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvcyA5eDEyIiwgIDEwLCAgMzA0ODAsIDI0MDYwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zIDEyeDEyIiwgMTAsICAzMDQ4MCwgMzE2ODAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MgMTJ4MTgiLCAxMCwgIDQ1NzIwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycX0sCi0JeyAiV2Fjb20gUEw0MDAiLCAgICAgICAgIDgsICAgNTQwOCwgIDQwNTYsICAyNTUsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIFBMNTAwIiwgICAgICAgICA4LCAgIDYxNDQsICA0NjA4LCAgMjU1LCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBQTDYwMCIsICAgICAgICAgOCwgICA2MTI2LCAgNDYwNCwgIDI1NSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gUEw2MDBTWCIsICAgICAgIDgsICAgNjI2MCwgIDUwMTYsICAyNTUsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIFBMNTUwIiwgICAgICAgICA4LCAgIDYxNDQsICA0NjA4LCAgNTExLCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBQTDgwMCIsICAgICAgICAgOCwgICA3MjIwLCAgNTc4MCwgIDUxMSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gUEw3MDAiLCAgICAgICAgIDgsICAgNjc1OCwgIDU0MDYsICA1MTEsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIFBMNTEwIiwgICAgICAgICA4LCAgIDYyODIsICA0NzYyLCAgNTExLCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBEVFU3MTAiLCAgICAgICAgOCwgIDM0MDgwLCAyNzY2MCwgIDUxMSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gRFRGNTIxIiwgICAgICAgIDgsICAgNjI4MiwgIDQ3NjIsICA1MTEsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIERURjcyMCIsICAgICAgICA4LCAgIDY4NTgsICA1NTA2LCAgNTExLCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBDaW50aXEgUGFydG5lciIsOCwgIDIwNDgwLCAxNTM2MCwgIDUxMSwgMzIsIFBUVSwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvczIgNHg1IiwgICAxMCwgMTI3MDAsIDEwNjAwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiA2eDgiLCAgIDEwLCAyMDMyMCwgMTYyNDAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MyIDl4MTIiLCAgMTAsIDMwNDgwLCAyNDA2MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvczIgMTJ4MTIiLCAxMCwgMzA0ODAsIDMxNjgwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiAxMngxOCIsIDEwLCA0NTcyMCwgMzE2ODAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MzIDR4NSIsICAgMTAsIDI1NDAwLCAyMDMyMCwgMTAyMywgMTUsIElOVFVPUzMsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MzIDZ4OCIsICAgMTAsIDQwNjQwLCAzMDQ4MCwgMTAyMywgMTUsIElOVFVPUzMsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MzIDl4MTIiLCAgMTAsIDYwOTYwLCA0NTcyMCwgMTAyMywgMTUsIElOVFVPUzMsCXdhY29tX3N5c19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MzIDEyeDEyIiwgMTAsIDYwOTYwLCA2MDk2MCwgMTAyMywgMTUsIElOVFVPUzNMLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyAxMngxOSIsIDEwLCA5NzUzNiwgNjA5NjAsIDEwMjMsIDE1LCBJTlRVT1MzTCwJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIEludHVvczMgNngxMSIsICAxMCwgNTQyMDQsIDMxNzUwLCAxMDIzLCAxNSwgSU5UVU9TMywJd2Fjb21fc3lzX2lycSB9LAotCXsgIldhY29tIENpbnRpcSAyMVVYIiwgICAxMCwgODcyMDAsIDY1NjAwLCAxMDIzLCAxNSwgQ0lOVElRLAl3YWNvbV9zeXNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiA2eDgiLCAgIDEwLCAyMDMyMCwgMTYyNDAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBQZW5wYXJ0bmVyIiwgICAgNywgICA1MDQwLCAgMzc4MCwgIDI1NSwgIDAsIFBFTlBBUlRORVIgfSwKKyAgICAgICAgeyAiV2Fjb20gR3JhcGhpcmUiLCAgICAgIDgsICAxMDIwNiwgIDc0MjIsICA1MTEsIDYzLCBHUkFQSElSRSB9LAorCXsgIldhY29tIEdyYXBoaXJlMiA0eDUiLCA4LCAgMTAyMDYsICA3NDIyLCAgNTExLCA2MywgR1JBUEhJUkUgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTIgNXg3IiwgOCwgIDEzOTE4LCAxMDIwNiwgIDUxMSwgNjMsIEdSQVBISVJFIH0sCisJeyAiV2Fjb20gR3JhcGhpcmUzIiwgICAgIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDYzLCBHUkFQSElSRSB9LAorCXsgIldhY29tIEdyYXBoaXJlMyA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCA2MywgR1JBUEhJUkUgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTQgNHg1IiwgOCwgIDEwMjA4LCAgNzQyNCwgIDUxMSwgNjMsIFdBQ09NX0c0IH0sCisJeyAiV2Fjb20gR3JhcGhpcmU0IDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDYzLCBXQUNPTV9HNCB9LAorCXsgIldhY29tIFZvbGl0byIsICAgICAgICA4LCAgIDUxMDQsICAzNzEyLCAgNTExLCAgMCwgR1JBUEhJUkUgfSwKKwl7ICJXYWNvbSBQZW5TdGF0aW9uMiIsICAgOCwgICAzMjUwLCAgMjMyMCwgIDI1NSwgIDAsIEdSQVBISVJFIH0sCisJeyAiV2Fjb20gVm9saXRvMiA0eDUiLCAgIDgsICAgNTEwNCwgIDM3MTIsICA1MTEsICAwLCBHUkFQSElSRSB9LAorCXsgIldhY29tIFZvbGl0bzIgMngzIiwgICA4LCAgIDMyNDgsICAyMzIwLCAgNTExLCAgMCwgR1JBUEhJUkUgfSwKKwl7ICJXYWNvbSBQZW5QYXJ0bmVyMiIsICAgOCwgICAzMjUwLCAgMjMyMCwgIDI1NSwgIDAsIEdSQVBISVJFIH0sCisJeyAiV2Fjb20gSW50dW9zIDR4NSIsICAgMTAsICAxMjcwMCwgMTA2MDAsIDEwMjMsIDYzLCBJTlRVT1MgfSwKKwl7ICJXYWNvbSBJbnR1b3MgNng4IiwgICAxMCwgIDIwMzIwLCAxNjI0MCwgMTAyMywgNjMsIElOVFVPUyB9LAorCXsgIldhY29tIEludHVvcyA5eDEyIiwgIDEwLCAgMzA0ODAsIDI0MDYwLCAxMDIzLCA2MywgSU5UVU9TIH0sCisJeyAiV2Fjb20gSW50dW9zIDEyeDEyIiwgMTAsICAzMDQ4MCwgMzE2ODAsIDEwMjMsIDYzLCBJTlRVT1MgfSwKKwl7ICJXYWNvbSBJbnR1b3MgMTJ4MTgiLCAxMCwgIDQ1NzIwLCAzMTY4MCwgMTAyMywgNjMsIElOVFVPUyB9LAorCXsgIldhY29tIFBMNDAwIiwgICAgICAgICA4LCAgIDU0MDgsICA0MDU2LCAgMjU1LCAgMCwgUEwgfSwKKwl7ICJXYWNvbSBQTDUwMCIsICAgICAgICAgOCwgICA2MTQ0LCAgNDYwOCwgIDI1NSwgIDAsIFBMIH0sCisJeyAiV2Fjb20gUEw2MDAiLCAgICAgICAgIDgsICAgNjEyNiwgIDQ2MDQsICAyNTUsICAwLCBQTCB9LAorCXsgIldhY29tIFBMNjAwU1giLCAgICAgICA4LCAgIDYyNjAsICA1MDE2LCAgMjU1LCAgMCwgUEwgfSwKKwl7ICJXYWNvbSBQTDU1MCIsICAgICAgICAgOCwgICA2MTQ0LCAgNDYwOCwgIDUxMSwgIDAsIFBMIH0sCisJeyAiV2Fjb20gUEw4MDAiLCAgICAgICAgIDgsICAgNzIyMCwgIDU3ODAsICA1MTEsICAwLCBQTCB9LAorCXsgIldhY29tIFBMNzAwIiwgICAgICAgICA4LCAgIDY3NTgsICA1NDA2LCAgNTExLCAgMCwgUEwgfSwKKwl7ICJXYWNvbSBQTDUxMCIsICAgICAgICAgOCwgICA2MjgyLCAgNDc2MiwgIDUxMSwgIDAsIFBMIH0sCisJeyAiV2Fjb20gRFRVNzEwIiwgICAgICAgIDgsICAzNDA4MCwgMjc2NjAsICA1MTEsICAwLCBQTCB9LAorCXsgIldhY29tIERURjUyMSIsICAgICAgICA4LCAgIDYyODIsICA0NzYyLCAgNTExLCAgMCwgUEwgfSwKKwl7ICJXYWNvbSBEVEY3MjAiLCAgICAgICAgOCwgICA2ODU4LCAgNTUwNiwgIDUxMSwgIDAsIFBMIH0sCisJeyAiV2Fjb20gQ2ludGlxIFBhcnRuZXIiLDgsICAyMDQ4MCwgMTUzNjAsICA1MTEsICAwLCBQVFUgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDR4NSIsICAgMTAsIDEyNzAwLCAxMDYwMCwgMTAyMywgNjMsIElOVFVPUyB9LAorCXsgIldhY29tIEludHVvczIgNng4IiwgICAxMCwgMjAzMjAsIDE2MjQwLCAxMDIzLCA2MywgSU5UVU9TIH0sCisJeyAiV2Fjb20gSW50dW9zMiA5eDEyIiwgIDEwLCAzMDQ4MCwgMjQwNjAsIDEwMjMsIDYzLCBJTlRVT1MgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDEyeDEyIiwgMTAsIDMwNDgwLCAzMTY4MCwgMTAyMywgNjMsIElOVFVPUyB9LAorCXsgIldhY29tIEludHVvczIgMTJ4MTgiLCAxMCwgNDU3MjAsIDMxNjgwLCAxMDIzLCA2MywgSU5UVU9TIH0sCisJeyAiV2Fjb20gSW50dW9zMyA0eDUiLCAgIDEwLCAyNTQwMCwgMjAzMjAsIDEwMjMsIDYzLCBJTlRVT1MzUyB9LAorCXsgIldhY29tIEludHVvczMgNng4IiwgICAxMCwgNDA2NDAsIDMwNDgwLCAxMDIzLCA2MywgSU5UVU9TMyB9LAorCXsgIldhY29tIEludHVvczMgOXgxMiIsICAxMCwgNjA5NjAsIDQ1NzIwLCAxMDIzLCA2MywgSU5UVU9TMyB9LAorCXsgIldhY29tIEludHVvczMgMTJ4MTIiLCAxMCwgNjA5NjAsIDYwOTYwLCAxMDIzLCA2MywgSU5UVU9TM0wgfSwKKwl7ICJXYWNvbSBJbnR1b3MzIDEyeDE5IiwgMTAsIDk3NTM2LCA2MDk2MCwgMTAyMywgNjMsIElOVFVPUzNMIH0sCisJeyAiV2Fjb20gSW50dW9zMyA2eDExIiwgIDEwLCA1NDIwNCwgMzE3NTAsIDEwMjMsIDYzLCBJTlRVT1MzIH0sCisJeyAiV2Fjb20gSW50dW9zMyA0eDYiLCAgIDEwLCAzMTQ5NiwgMTk2ODUsIDEwMjMsIDE1LCBJTlRVT1MzUyB9LAorCXsgIldhY29tIENpbnRpcSAyMVVYIiwgICAxMCwgODcyMDAsIDY1NjAwLCAxMDIzLCA2MywgQ0lOVElRIH0sCisJeyAiV2Fjb20gSW50dW9zMiA2eDgiLCAgIDEwLCAyMDMyMCwgMTYyNDAsIDEwMjMsIDYzLCBJTlRVT1MgfSwKIAl7IH0KIH07CiAKQEAgLTYxOCw2ICs2MjgsNyBAQAogCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEIzKSB9LAogCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEI0KSB9LAogCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEI1KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEI3KSB9LAogCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDNGKSB9LAogCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDQ3KSB9LAogCXsgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fd2FjLmggYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuaAppbmRleCBjZWFlN2JmLi5hMWQ5Y2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuaAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuaApAQCAtMjAsNiArMjAsNyBAQAogCVBUVSwKIAlQTCwKIAlJTlRVT1MsCisJSU5UVU9TM1MsCiAJSU5UVU9TMywKIAlJTlRVT1MzTCwKIAlDSU5USVEsCkBAIC0zNCw3ICszNSw2IEBACiAJaW50IHByZXNzdXJlX21heDsKIAlpbnQgZGlzdGFuY2VfbWF4OwogCWludCB0eXBlOwotCXVzYl9jb21wbGV0ZV90IGlycTsKIH07CiAKIHN0cnVjdCB3YWNvbV93YWMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQveHBhZC5jIGIvZHJpdmVycy91c2IvaW5wdXQveHBhZC5jCmluZGV4IGNlYmI2YzQuLmU0YmM3NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3hwYWQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC94cGFkLmMKQEAgLTEsOCArMSwxMyBAQAogLyoKLSAqIFgtQm94IGdhbWVwYWQgLSB2MC4wLjUKKyAqIFgtQm94IGdhbWVwYWQgLSB2MC4wLjYKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTWFya28gRnJpZWRlbWFubiA8bWZyQGJteC1jaGVtbml0ei5kZT4KLSAqCisgKiAgICAgICAgICAgICAgIDIwMDQgT2xpdmVyIFNjaHdhcnR6IDxPbGl2ZXIuU2Nod2FydHpAZ214LmRlPiwKKyAqICAgICAgICAgICAgICAgICAgICBTdGV2ZW4gVG90aCA8c3RldmVAdG90aC5kZW1vbi5jby51az4sCisgKiAgICAgICAgICAgICAgICAgICAgRnJhbnogTGVobmVyIDxmcmFuekBjYW9zLmF0PiwKKyAqICAgICAgICAgICAgICAgICAgICBJdmFuIEhhd2tlcyA8YmxhY2toYXdrQGl2YW5oYXdrZXMuY29tPgorICogICAgICAgICAgICAgICAyMDA1IERvbWluaWMgQ2VycXVldHRpIDxiaW5hcnkxMjMwQHlhaG9vLmNvbT4KKyAqICAgICAgICAgICAgICAgMjAwNiBBZGFtIEJ1Y2hiaW5kZXIgPGFkYW0uYnVjaGJpbmRlckBnbWFpbC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTI4LDExICszMywxMyBAQAogICogIC0gSVRPIFRha2F5dWtpIGZvciBwcm92aWRpbmcgZXNzZW50aWFsIHhwYWQgaW5mb3JtYXRpb24gb24gaGlzIHdlYnNpdGUKICAqICAtIFZvanRlY2ggUGF2bGlrICAgICAtIGlmb3JjZSBkcml2ZXIgLyBpbnB1dCBzdWJzeXN0ZW0KICAqICAtIEdyZWcgS3JvYWgtSGFydG1hbiAtIHVzYi1za2VsZXRvbiBkcml2ZXIKKyAqICAtIFhCT1ggTGludXggcHJvamVjdCAtIGV4dHJhIFVTQiBpZCdzCiAgKgogICogVE9ETzoKLSAqICAtIGZpbmUgdHVuZSBheGVzCisgKiAgLSBmaW5lIHR1bmUgYXhlcyAoZXNwZWNpYWxseSB0cmlnZ2VyIGF4ZXMpCiAgKiAgLSBmaXggImFuYWxvZyIgYnV0dG9ucyAocmVwb3J0ZWQgYXMgZGlnaXRhbCBub3cpCiAgKiAgLSBnZXQgcnVtYmxlIHdvcmtpbmcKKyAqICAtIG5lZWQgVVNCIElEcyBmb3Igb3RoZXIgZGFuY2UgcGFkcwogICoKICAqIEhpc3Rvcnk6CiAgKgpAQCAtNTIsMzAgKzU5LDc5IEBACiAgKiAgLSBmaXhlZCBkLXBhZCB0byBheGVzIG1hcHBpbmcKICAqCiAgKiAyMDAyLTA3LTE3IC0gMC4wLjUgOiBzaW1wbGlmaWVkIGQtcGFkIGhhbmRsaW5nCisgKgorICogMjAwNC0xMC0wMiAtIDAuMC42IDogRERSIHBhZCBzdXBwb3J0CisgKiAgLSBib3Jyb3dlZCBmcm9tIHRoZSBYQk9YIGxpbnV4IGtlcm5lbAorICogIC0gVVNCIGlkJ3MgZm9yIGNvbW1vbmx5IHVzZWQgZGFuY2UgcGFkcyBhcmUgcHJlc2VudAorICogIC0gZGFuY2UgcGFkcyB3aWxsIG1hcCBELVBBRCB0byBidXR0b25zLCBub3QgYXhlcworICogIC0gcGFzcyB0aGUgbW9kdWxlIHBhcmFtYXRlciAnZHBhZF90b19idXR0b25zJyB0byBmb3JjZQorICogICAgdGhlIEQtUEFEIHRvIG1hcCB0byBidXR0b25zIGlmIHlvdXIgcGFkIGlzIG5vdCBkZXRlY3RlZAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjAuNSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjAuNiIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiTWFya28gRnJpZWRlbWFubiA8bWZyQGJteC1jaGVtbml0ei5kZT4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICJYLUJveCBwYWQgZHJpdmVyIgogCiAjZGVmaW5lIFhQQURfUEtUX0xFTiAzMgogCisvKiB4Ym94IGQtcGFkcyBzaG91bGQgbWFwIHRvIGJ1dHRvbnMsIGFzIGlzIHJlcXVpcmVkIGZvciBERFIgcGFkcworICAgYnV0IHdlIG1hcCB0aGVtIHRvIGF4ZXMgd2hlbiBwb3NzaWJsZSB0byBzaW1wbGlmeSB0aGluZ3MgKi8KKyNkZWZpbmUgTUFQX0RQQURfVE9fQlVUVE9OUyAgICAwCisjZGVmaW5lIE1BUF9EUEFEX1RPX0FYRVMgICAgICAgMQorI2RlZmluZSBNQVBfRFBBRF9VTktOT1dOICAgICAgIC0xCisKK3N0YXRpYyBpbnQgZHBhZF90b19idXR0b25zOworbW9kdWxlX3BhcmFtKGRwYWRfdG9fYnV0dG9ucywgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGRwYWRfdG9fYnV0dG9ucywgIk1hcCBELVBBRCB0byBidXR0b25zIHJhdGhlciB0aGFuIGF4ZXMgZm9yIHVua25vd24gcGFkcyIpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHhwYWRfZGV2aWNlIHsKIAl1MTYgaWRWZW5kb3I7CiAJdTE2IGlkUHJvZHVjdDsKIAljaGFyICpuYW1lOworCXU4IGRwYWRfbWFwcGluZzsKIH0geHBhZF9kZXZpY2VbXSA9IHsKLQl7IDB4MDQ1ZSwgMHgwMjAyLCAiTWljcm9zb2Z0IFgtQm94IHBhZCAoVVMpIiB9LAotCXsgMHgwNDVlLCAweDAyODUsICJNaWNyb3NvZnQgWC1Cb3ggcGFkIChKYXBhbikiIH0sCi0JeyAweDA1ZmQsIDB4MTA3YSwgIkludGVyQWN0ICdQb3dlclBhZCBQcm8nIFgtQm94IHBhZCAoR2VybWFueSkiIH0sCi0JeyAweDAwMDAsIDB4MDAwMCwgIlgtQm94IHBhZCIgfQorCXsgMHgwNDVlLCAweDAyMDIsICJNaWNyb3NvZnQgWC1Cb3ggcGFkIHYxIChVUykiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDA0NWUsIDB4MDI4OSwgIk1pY3Jvc29mdCBYLUJveCBwYWQgdjIgKFVTKSIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDQ1ZSwgMHgwMjg1LCAiTWljcm9zb2Z0IFgtQm94IHBhZCAoSmFwYW4pIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwNDVlLCAweDAyODcsICJNaWNyb3NvZnQgWGJveCBDb250cm9sbGVyIFMiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDBjMTIsIDB4ODgwOSwgIlJlZE9jdGFuZSBYYm94IERhbmNlIFBhZCIsIE1BUF9EUEFEX1RPX0JVVFRPTlMgfSwKKwl7IDB4MDQ0ZiwgMHgwZjA3LCAiVGhydXN0bWFzdGVyLCBJbmMuIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDA0NmQsIDB4Y2E4NCwgIkxvZ2l0ZWNoIFhib3ggQ29yZGxlc3MgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDQ2ZCwgMHhjYTg4LCAiTG9naXRlY2ggQ29tcGFjdCBDb250cm9sbGVyIGZvciBYYm94IiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwNWZkLCAweDEwMDcsICJNYWQgQ2F0eiBDb250cm9sbGVyICh1bnZlcmlmaWVkKSIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDVmZCwgMHgxMDdhLCAiSW50ZXJBY3QgJ1Bvd2VyUGFkIFBybycgWC1Cb3ggcGFkIChHZXJtYW55KSIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDczOCwgMHg0NTE2LCAiTWFkIENhdHogQ29udHJvbCBQYWQiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDA3MzgsIDB4NDUyMiwgIk1hZCBDYXR6IEx1bWlDT04iLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDA3MzgsIDB4NDUyNiwgIk1hZCBDYXR6IENvbnRyb2wgUGFkIFBybyIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDczOCwgMHg0NTM2LCAiTWFkIENhdHogTWljcm9DT04iLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDA3MzgsIDB4NDU0MCwgIk1hZCBDYXR6IEJlYXQgUGFkIiwgTUFQX0RQQURfVE9fQlVUVE9OUyB9LAorCXsgMHgwNzM4LCAweDQ1NTYsICJNYWQgQ2F0eiBMeW54IFdpcmVsZXNzIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDA3MzgsIDB4NjA0MCwgIk1hZCBDYXR6IEJlYXQgUGFkIFBybyIsIE1BUF9EUEFEX1RPX0JVVFRPTlMgfSwKKwl7IDB4MGMxMiwgMHg4ODAyLCAiWmVyb3BsdXMgWGJveCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwYzEyLCAweDg4MTAsICJaZXJvcGx1cyBYYm94IENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDBjMTIsIDB4OTkwMiwgIkhBTUEgVmlicmFYIC0gKkZBVUxUWSBIQVJEV0FSRSoiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDBlNGMsIDB4MTA5NywgIlJhZGljYSBHYW1lc3RlciBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwZTRjLCAweDIzOTAsICJSYWRpY2EgR2FtZXMgSnRlY2ggQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVN9LAorCXsgMHgwZTZmLCAweDAwMDMsICJMb2dpYzMgRnJlZWJpcmQgd2lyZWxlc3MgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MGU2ZiwgMHgwMDA1LCAiRWNsaXBzZSB3aXJlbGVzcyBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwZTZmLCAweDAwMDYsICJFZGdlIHdpcmVsZXNzIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDBlOGYsIDB4MDIwMSwgIlNtYXJ0Sm95IEZyYWcgWHBhZC9QUzIgYWRhcHRvciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MGYzMCwgMHgwMjAyLCAiSm95dGVjaCBBZHZhbmNlZCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUyB9LAorCXsgMHgwZjMwLCAweDg4ODgsICJCaWdCZW4gWEJNaW5pUGFkIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTIH0sCisJeyAweDEwMmMsIDB4ZmYwYywgIkpveXRlY2ggV2lyZWxlc3MgQWR2YW5jZWQgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MTJhYiwgMHg4ODA5LCAiWGJveCBERFIgZGFuY2VwYWQiLCBNQVBfRFBBRF9UT19CVVRUT05TIH0sCisJeyAweDE0MzAsIDB4ODg4OCwgIlRYNjUwMCsgRGFuY2UgUGFkIChmaXJzdCBnZW5lcmF0aW9uKSIsIE1BUF9EUEFEX1RPX0JVVFRPTlMgfSwKKwl7IDB4ZmZmZiwgMHhmZmZmLCAiQ2hpbmVzZS1tYWRlIFhib3ggQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMgfSwKKwl7IDB4MDAwMCwgMHgwMDAwLCAiR2VuZXJpYyBYLUJveCBwYWQiLCBNQVBfRFBBRF9VTktOT1dOIH0KIH07CiAKIHN0YXRpYyBjb25zdCBzaWduZWQgc2hvcnQgeHBhZF9idG5bXSA9IHsKQEAgLTg0LDExICsxNDAsMjMgQEAKIAktMQkJCQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCisvKiBvbmx5IHVzZWQgaWYgTUFQX0RQQURfVE9fQlVUVE9OUyAqLworc3RhdGljIGNvbnN0IHNpZ25lZCBzaG9ydCB4cGFkX2J0bl9wYWRbXSA9IHsKKwlCVE5fTEVGVCwgQlROX1JJR0hULAkJLyogZC1wYWQgbGVmdCwgcmlnaHQgKi8KKwlCVE5fMCwgQlROXzEsCQkJLyogZC1wYWQgdXAsIGRvd24gKFhYWCBuYW1lcz8/KSAqLworCS0xCQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCiBzdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IHhwYWRfYWJzW10gPSB7CiAJQUJTX1gsIEFCU19ZLAkJLyogbGVmdCBzdGljayAqLwogCUFCU19SWCwgQUJTX1JZLAkJLyogcmlnaHQgc3RpY2sgKi8KIAlBQlNfWiwgQUJTX1JaLAkJLyogdHJpZ2dlcnMgbGVmdC9yaWdodCAqLwotCUFCU19IQVQwWCwgQUJTX0hBVDBZLAkvKiBkaWdpdGFsIHBhZCAqLworCS0xCQkJLyogdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKKy8qIG9ubHkgdXNlZCBpZiBNQVBfRFBBRF9UT19BWEVTICovCitzdGF0aWMgY29uc3Qgc2lnbmVkIHNob3J0IHhwYWRfYWJzX3BhZFtdID0geworCUFCU19IQVQwWCwgQUJTX0hBVDBZLAkvKiBkLXBhZCBheGVzICovCiAJLTEJCQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApAQCAtMTAwLDE0ICsxNjgsMTYgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgeHBhZF90YWJsZSk7CiAKIHN0cnVjdCB1c2JfeHBhZCB7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2OwkJCS8qIGlucHV0IGRldmljZSBpbnRlcmZhY2UgKi8KLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJCS8qIHVzYiBkZXZpY2UgKi8KKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CQkvKiBpbnB1dCBkZXZpY2UgaW50ZXJmYWNlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8qIHVzYiBkZXZpY2UgKi8KIAotCXN0cnVjdCB1cmIgKmlycV9pbjsJCQkvKiB1cmIgZm9yIGludGVycnVwdCBpbiByZXBvcnQgKi8KLQl1bnNpZ25lZCBjaGFyICppZGF0YTsJCQkvKiBpbnB1dCBkYXRhICovCisJc3RydWN0IHVyYiAqaXJxX2luOwkJLyogdXJiIGZvciBpbnRlcnJ1cHQgaW4gcmVwb3J0ICovCisJdW5zaWduZWQgY2hhciAqaWRhdGE7CQkvKiBpbnB1dCBkYXRhICovCiAJZG1hX2FkZHJfdCBpZGF0YV9kbWE7CiAKLQljaGFyIHBoeXNbNjVdOwkJCQkvKiBwaHlzaWNhbCBkZXZpY2UgcGF0aCAqLworCWNoYXIgcGh5c1s2NV07CQkJLyogcGh5c2ljYWwgZGV2aWNlIHBhdGggKi8KKworCWludCBkcGFkX21hcHBpbmc7CQkvKiBtYXAgZC1wYWQgdG8gYnV0dG9ucyBvciB0byBheGVzICovCiB9OwogCiAvKgpAQCAtMTM3LDE0ICsyMDcsMjEgQEAKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JaLCBkYXRhWzExXSk7CiAKIAkvKiBkaWdpdGFsIHBhZCAqLwotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfSEFUMFgsICEhKGRhdGFbMl0gJiAweDA4KSAtICEhKGRhdGFbMl0gJiAweDA0KSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWSwgISEoZGF0YVsyXSAmIDB4MDIpIC0gISEoZGF0YVsyXSAmIDB4MDEpKTsKKwlpZiAoeHBhZC0+ZHBhZF9tYXBwaW5nID09IE1BUF9EUEFEX1RPX0FYRVMpIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWCwgISEoZGF0YVsyXSAmIDB4MDgpIC0gISEoZGF0YVsyXSAmIDB4MDQpKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWSwgISEoZGF0YVsyXSAmIDB4MDIpIC0gISEoZGF0YVsyXSAmIDB4MDEpKTsKKwl9IGVsc2UgLyogeHBhZC0+ZHBhZF9tYXBwaW5nID09IE1BUF9EUEFEX1RPX0JVVFRPTlMgKi8geworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsICBkYXRhWzJdICYgMHgwNCk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGRhdGFbMl0gJiAweDA4KTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8wLCAgICAgZGF0YVsyXSAmIDB4MDEpOyAvLyB1cAorCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROXzEsICAgICBkYXRhWzJdICYgMHgwMik7IC8vIGRvd24KKwl9CiAKIAkvKiBzdGFydC9iYWNrIGJ1dHRvbnMgYW5kIHN0aWNrIHByZXNzIGxlZnQvcmlnaHQgKi8KLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUQVJULCAoZGF0YVsyXSAmIDB4MTApID4+IDQpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQkFDSywgKGRhdGFbMl0gJiAweDIwKSA+PiA1KTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RIVU1CTCwgKGRhdGFbMl0gJiAweDQwKSA+PiA2KTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RIVU1CUiwgZGF0YVsyXSA+PiA3KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUQVJULCAgZGF0YVsyXSAmIDB4MTApOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQkFDSywgICBkYXRhWzJdICYgMHgyMCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9USFVNQkwsIGRhdGFbMl0gJiAweDQwKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RIVU1CUiwgZGF0YVsyXSAmIDB4ODApOwogCiAJLyogImFuYWxvZyIgYnV0dG9ucyBBLCBCLCBYLCBZICovCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9BLCBkYXRhWzRdKTsKQEAgLTIwNiw2ICsyODMsMjggQEAKIAl1c2Jfa2lsbF91cmIoeHBhZC0+aXJxX2luKTsKIH0KIAorc3RhdGljIHZvaWQgeHBhZF9zZXRfdXBfYWJzKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc2lnbmVkIHNob3J0IGFicykKK3sKKwlzZXRfYml0KGFicywgaW5wdXRfZGV2LT5hYnNiaXQpOworCisJc3dpdGNoIChhYnMpIHsKKwljYXNlIEFCU19YOgorCWNhc2UgQUJTX1k6CisJY2FzZSBBQlNfUlg6CisJY2FzZSBBQlNfUlk6CS8qIHRoZSB0d28gc3RpY2tzICovCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgYWJzLCAtMzI3NjgsIDMyNzY3LCAxNiwgMTI4KTsKKwkJYnJlYWs7CisJY2FzZSBBQlNfWjoKKwljYXNlIEFCU19SWjoJLyogdGhlIHRyaWdnZXJzICovCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgYWJzLCAwLCAyNTUsIDAsIDApOworCQlicmVhazsKKwljYXNlIEFCU19IQVQwWDoKKwljYXNlIEFCU19IQVQwWToJLyogdGhlIGQtcGFkIChvbmx5IGlmIE1BUF9EUEFEX1RPX0FYRVMpICovCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgYWJzLCAtMSwgMSwgMCwgMCk7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIGludCB4cGFkX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKQEAgLTIyNiw3ICszMjUsNyBAQAogCQlnb3RvIGZhaWwxOwogCiAJeHBhZC0+aWRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIFhQQURfUEtUX0xFTiwKLQkJCQkgICAgICAgU0xBQl9BVE9NSUMsICZ4cGFkLT5pZGF0YV9kbWEpOworCQkJCSAgICAgICBHRlBfQVRPTUlDLCAmeHBhZC0+aWRhdGFfZG1hKTsKIAlpZiAoIXhwYWQtPmlkYXRhKQogCQlnb3RvIGZhaWwxOwogCkBAIC0yMzUsNiArMzM0LDkgQEAKIAkJZ290byBmYWlsMjsKIAogCXhwYWQtPnVkZXYgPSB1ZGV2OworCXhwYWQtPmRwYWRfbWFwcGluZyA9IHhwYWRfZGV2aWNlW2ldLmRwYWRfbWFwcGluZzsKKwlpZiAoeHBhZC0+ZHBhZF9tYXBwaW5nID09IE1BUF9EUEFEX1VOS05PV04pCisJCXhwYWQtPmRwYWRfbWFwcGluZyA9IGRwYWRfdG9fYnV0dG9uczsKIAl4cGFkLT5kZXYgPSBpbnB1dF9kZXY7CiAJdXNiX21ha2VfcGF0aCh1ZGV2LCB4cGFkLT5waHlzLCBzaXplb2YoeHBhZC0+cGh5cykpOwogCXN0cmxjYXQoeHBhZC0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YoeHBhZC0+cGh5cykpOwpAQCAtMjQ5LDMyICszNTEsMTkgQEAKIAogCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOwogCisJLyogc2V0IHVwIGJ1dHRvbnMgKi8KIAlmb3IgKGkgPSAwOyB4cGFkX2J0bltpXSA+PSAwOyBpKyspCiAJCXNldF9iaXQoeHBhZF9idG5baV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKKwlpZiAoeHBhZC0+ZHBhZF9tYXBwaW5nID09IE1BUF9EUEFEX1RPX0JVVFRPTlMpCisJCWZvciAoaSA9IDA7IHhwYWRfYnRuX3BhZFtpXSA+PSAwOyBpKyspCisJCQlzZXRfYml0KHhwYWRfYnRuX3BhZFtpXSwgaW5wdXRfZGV2LT5rZXliaXQpOwogCi0JZm9yIChpID0gMDsgeHBhZF9hYnNbaV0gPj0gMDsgaSsrKSB7Ci0KLQkJc2lnbmVkIHNob3J0IHQgPSB4cGFkX2Fic1tpXTsKLQotCQlzZXRfYml0KHQsIGlucHV0X2Rldi0+YWJzYml0KTsKLQotCQlzd2l0Y2ggKHQpIHsKLQkJCWNhc2UgQUJTX1g6Ci0JCQljYXNlIEFCU19ZOgotCQkJY2FzZSBBQlNfUlg6Ci0JCQljYXNlIEFCU19SWToJLyogdGhlIHR3byBzdGlja3MgKi8KLQkJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIHQsIC0zMjc2OCwgMzI3NjcsIDE2LCAxMjgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBQlNfWjoKLQkJCWNhc2UgQUJTX1JaOgkvKiB0aGUgdHJpZ2dlcnMgKi8KLQkJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIHQsIDAsIDI1NSwgMCwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFCU19IQVQwWDoKLQkJCWNhc2UgQUJTX0hBVDBZOgkvKiB0aGUgZC1wYWQgKi8KLQkJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIHQsIC0xLCAxLCAwLCAwKTsKLQkJCQlicmVhazsKLQkJfQotCX0KKwkvKiBzZXQgdXAgYXhlcyAqLworCWZvciAoaSA9IDA7IHhwYWRfYWJzW2ldID49IDA7IGkrKykKKwkJeHBhZF9zZXRfdXBfYWJzKGlucHV0X2RldiwgeHBhZF9hYnNbaV0pOworCWlmICh4cGFkLT5kcGFkX21hcHBpbmcgPT0gTUFQX0RQQURfVE9fQVhFUykKKwkJZm9yIChpID0gMDsgeHBhZF9hYnNfcGFkW2ldID49IDA7IGkrKykKKwkJICAgIHhwYWRfc2V0X3VwX2FicyhpbnB1dF9kZXYsIHhwYWRfYWJzX3BhZFtpXSk7CiAKIAllcF9pcnFfaW4gPSAmaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50WzBdLmRlc2M7CiAJdXNiX2ZpbGxfaW50X3VyYih4cGFkLT5pcnFfaW4sIHVkZXYsCkBAIC0zMDUsNyArMzk0LDggQEAKIAkJdXNiX2tpbGxfdXJiKHhwYWQtPmlycV9pbik7CiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHhwYWQtPmRldik7CiAJCXVzYl9mcmVlX3VyYih4cGFkLT5pcnFfaW4pOwotCQl1c2JfYnVmZmVyX2ZyZWUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgWFBBRF9QS1RfTEVOLCB4cGFkLT5pZGF0YSwgeHBhZC0+aWRhdGFfZG1hKTsKKwkJdXNiX2J1ZmZlcl9mcmVlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIFhQQURfUEtUX0xFTiwKKwkJCQl4cGFkLT5pZGF0YSwgeHBhZC0+aWRhdGFfZG1hKTsKIAkJa2ZyZWUoeHBhZCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5jIGIvZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5jCmluZGV4IDkwNWJmNjMuLmNhZmY4ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3llYWxpbmsuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmMKQEAgLTg1OSwxMCArODU5LDggQEAKIAogCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKLQlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pKQotCQlyZXR1cm4gLUVJTzsKLQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXVzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXlsZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB5ZWFsaW5rX2RldiksIEdGUF9LRVJORUwpOwogCWlmICgheWxkKQpAQCAtODc2LDE3ICs4NzQsMTcgQEAKIAogCS8qIGFsbG9jYXRlIHVzYiBidWZmZXJzICovCiAJeWxkLT5pcnFfZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgVVNCX1BLVF9MRU4sCi0JCQkJCVNMQUJfQVRPTUlDLCAmeWxkLT5pcnFfZG1hKTsKKwkJCQkJR0ZQX0FUT01JQywgJnlsZC0+aXJxX2RtYSk7CiAJaWYgKHlsZC0+aXJxX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIHVzYl9jbGVhbnVwKHlsZCwgLUVOT01FTSk7CiAKIAl5bGQtPmN0bF9kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBVU0JfUEtUX0xFTiwKLQkJCQkJU0xBQl9BVE9NSUMsICZ5bGQtPmN0bF9kbWEpOworCQkJCQlHRlBfQVRPTUlDLCAmeWxkLT5jdGxfZG1hKTsKIAlpZiAoIXlsZC0+Y3RsX2RhdGEpCiAJCXJldHVybiB1c2JfY2xlYW51cCh5bGQsIC1FTk9NRU0pOwogCiAJeWxkLT5jdGxfcmVxID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBzaXplb2YoKih5bGQtPmN0bF9yZXEpKSwKLQkJCQkJU0xBQl9BVE9NSUMsICZ5bGQtPmN0bF9yZXFfZG1hKTsKKwkJCQkJR0ZQX0FUT01JQywgJnlsZC0+Y3RsX3JlcV9kbWEpOwogCWlmICh5bGQtPmN0bF9yZXEgPT0gTlVMTCkKIAkJcmV0dXJuIHVzYl9jbGVhbnVwKHlsZCwgLUVOT01FTSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwppbmRleCBjMjk2NThmLi5hNzRiZjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCkBAIC0yMjMsNiArMjIzLDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsZHVzYi4KIAorY29uZmlnIFVTQl9UUkFOQ0VWSUJSQVRPUgorCXRyaXN0YXRlICJQbGF5U3RhdGlvbiAyIFRyYW5jZSBWaWJyYXRvciBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhIFBsYXlTdGF0aW9uIDIgVHJhbmNlIFZpYnJhdG9yCisJICBkZXZpY2UgdG8geW91ciBjb21wdXRlcidzIFVTQiBwb3J0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0cmFuY2V2aWJyYXRvci4KKwogY29uZmlnIFVTQl9URVNUCiAJdHJpc3RhdGUgIlVTQiB0ZXN0aW5nIGRyaXZlciAoREVWRUxPUE1FTlQpIgogCWRlcGVuZHMgb24gVVNCICYmIFVTQl9ERVZJQ0VGUyAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCmluZGV4IDJiZTcwZmEuLjJjYmEwN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQpAQCAtNCw2ICs0LDcgQEAKICMKIAogb2JqLSQoQ09ORklHX1VTQl9BRFVUVVgpCSs9IGFkdXR1eC5vCitvYmotJChDT05GSUdfVVNCX0FQUExFRElTUExBWSkJKz0gYXBwbGVkaXNwbGF5Lm8KIG9iai0kKENPTkZJR19VU0JfQVVFUlNXQUxEKQkrPSBhdWVyc3dhbGQubwogb2JqLSQoQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MykrPSBjeXByZXNzX2N5N2M2My5vCiBvYmotJChDT05GSUdfVVNCX0NZVEhFUk0pCSs9IGN5dGhlcm0ubwpAQCAtMjEsNiArMjIsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9QSElER0VUU0VSVk8pCSs9IHBoaWRnZXRzZXJ2by5vCiBvYmotJChDT05GSUdfVVNCX1JJTzUwMCkJKz0gcmlvNTAwLm8KIG9iai0kKENPTkZJR19VU0JfVEVTVCkJCSs9IHVzYnRlc3Qubworb2JqLSQoQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUikJKz0gdHJhbmNldmlicmF0b3Iubwogb2JqLSQoQ09ORklHX1VTQl9VU1M3MjApCSs9IHVzczcyMC5vCiAKIG9iai0kKENPTkZJR19VU0JfU0lTVVNCVkdBKQkrPSBzaXN1c2J2Z2EvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jIGIvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYwppbmRleCBhZWNkNjMzLi5hZjI5MzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKQEAgLTM3MCw3ICszNzAsOCBAQAogCXJldHZhbCA9IGFkdV9yZWxlYXNlX2ludGVybmFsKGRldik7CiAKIGV4aXQ6Ci0JdXAoJmRldi0+c2VtKTsKKwlpZiAoZGV2KQorCQl1cCgmZGV2LT5zZW0pOwogCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jIGIvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYwppbmRleCA2YjIzYTFkLi4wMmNiYjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKQEAgLTc2LDcgKzc2LDcgQEAKIAljaGFyICp1cmJkYXRhOwkJCS8qIGludGVycnVwdCBVUkIgZGF0YSBidWZmZXIgKi8KIAljaGFyICptc2dkYXRhOwkJCS8qIGNvbnRyb2wgbWVzc2FnZSBkYXRhIGJ1ZmZlciAqLwogCi0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCWludCBidXR0b25fcHJlc3NlZDsKIAlzcGlubG9ja190IGxvY2s7CiB9OwpAQCAtMTE3LDcgKzExNyw3IEBACiAJY2FzZSBBQ0RfQlROX0JSSUdIVF9VUDoKIAljYXNlIEFDRF9CVE5fQlJJR0hUX0RPV046CiAJCXBkYXRhLT5idXR0b25fcHJlc3NlZCA9IDE7Ci0JCXF1ZXVlX3dvcmsod3EsICZwZGF0YS0+d29yayk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayh3cSwgJnBkYXRhLT53b3JrLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBBQ0RfQlROX05PTkU6CiAJZGVmYXVsdDoKQEAgLTE4NCw5ICsxODQsMTAgQEAKIAkubWF4X2JyaWdodG5lc3MJPSAweEZGCiB9OwogCi1zdGF0aWMgdm9pZCBhcHBsZWRpc3BsYXlfd29yayh2b2lkICpwcml2YXRlKQorc3RhdGljIHZvaWQgYXBwbGVkaXNwbGF5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBhcHBsZWRpc3BsYXkgKnBkYXRhID0gcHJpdmF0ZTsKKwlzdHJ1Y3QgYXBwbGVkaXNwbGF5ICpwZGF0YSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXBwbGVkaXNwbGF5LCB3b3JrLndvcmspOwogCWludCByZXR2YWw7CiAKIAl1cCgmcGRhdGEtPmJkLT5zZW0pOwpAQCAtMjE2LDEwICsyMTcsNyBAQAogCWlmYWNlX2Rlc2MgPSBpZmFjZS0+Y3VyX2FsdHNldHRpbmc7CiAJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CiAJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7Ci0JCWlmICghaW50X2luX2VuZHBvaW50QWRkciAmJgotCQkgICAgKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgJiYKLQkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQotCQkgICAgIFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkpIHsKKwkJaWYgKCFpbnRfaW5fZW5kcG9pbnRBZGRyICYmIHVzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKSB7CiAJCQkvKiB3ZSBmb3VuZCBhbiBpbnRlcnJ1cHQgaW4gZW5kcG9pbnQgKi8KIAkJCWludF9pbl9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKIAkJCWJyZWFrOwpAQCAtMjQxLDcgKzIzOSw3IEBACiAJcGRhdGEtPnVkZXYgPSB1ZGV2OwogCiAJc3Bpbl9sb2NrX2luaXQoJnBkYXRhLT5sb2NrKTsKLQlJTklUX1dPUksoJnBkYXRhLT53b3JrLCBhcHBsZWRpc3BsYXlfd29yaywgcGRhdGEpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwZGF0YS0+d29yaywgYXBwbGVkaXNwbGF5X3dvcmspOwogCiAJLyogQWxsb2NhdGUgYnVmZmVyIGZvciBjb250cm9sIG1lc3NhZ2VzICovCiAJcGRhdGEtPm1zZ2RhdGEgPSBrbWFsbG9jKEFDRF9NU0dfQlVGRkVSX0xFTiwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jIGIvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYwppbmRleCAwYmU5ZDYyLi42YzdmM2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMKQEAgLTcwNCw5ICs3MDQsNyBAQAogewogCWtmcmVlKGJwLT5idWZwKTsKIAlrZnJlZShicC0+ZHIpOwotCWlmIChicC0+dXJicCkgewotCQl1c2JfZnJlZV91cmIoYnAtPnVyYnApOwotCX0KKwl1c2JfZnJlZV91cmIoYnAtPnVyYnApOwogCWtmcmVlKGJwKTsKIH0KIApAQCAtNzY4LDcgKzc2Niw3IEBACiAgICAgICAgICAgICAgICAgYmVwLT5idWZwID0ga21hbGxvYyAoYnVmc2l6ZSwgR0ZQX0tFUk5FTCk7CiAgICAgICAgICAgICAgICAgaWYgKCFiZXAtPmJ1ZnApCiAJCQlnb3RvIGJsX2ZhaWw7Ci0gICAgICAgICAgICAgICAgYmVwLT5kciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopIGttYWxsb2MgKHNpemVvZiAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksIEdGUF9LRVJORUwpOworICAgICAgICAgICAgICAgIGJlcC0+ZHIgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksIEdGUF9LRVJORUwpOwogICAgICAgICAgICAgICAgIGlmICghYmVwLT5kcikKIAkJCWdvdG8gYmxfZmFpbDsKICAgICAgICAgICAgICAgICBiZXAtPnVyYnAgPSB1c2JfYWxsb2NfdXJiICgwLCBHRlBfS0VSTkVMKTsKQEAgLTc4MCw3ICs3NzgsNyBAQAogCiBibF9mYWlsOi8qIG5vdCBlbm91Z2ggbWVtb3J5LiBGcmVlIGFsbG9jYXRlZCBlbGVtZW50cyAqLwogICAgICAgICBkYmcgKCJhdWVyYnVmX3NldHVwOiBubyBtb3JlIG1lbW9yeSIpOwotCWtmcmVlKGJlcCk7CisJYXVlcmJ1Zl9mcmVlKGJlcCk7CiAgICAgICAgIGF1ZXJidWZfZnJlZV9idWZmZXJzIChiY3ApOwogICAgICAgICByZXR1cm4gLUVOT01FTTsKIH0KQEAgLTExNTUsOCArMTE1Myw3IEBACiAgICAgICAgIGRiZyAoImF1ZXJzd2FsZF9pbnRfcmVsZWFzZSIpOwogCiAgICAgICAgIC8qIHN0b3AgdGhlIGludCBlbmRwb2ludCAqLwotICAgICAgICBpZiAoY3AtPmludHVyYnApCi0gICAgICAgICAgICAgICAgdXNiX2tpbGxfdXJiIChjcC0+aW50dXJicCk7CisJdXNiX2tpbGxfdXJiIChjcC0+aW50dXJicCk7CiAKICAgICAgICAgLyogZGVhbGxvY2F0ZSBtZW1vcnkgKi8KICAgICAgICAgYXVlcnN3YWxkX2ludF9mcmVlIChjcCk7CkBAIC0xOTcyLDcgKzE5NjksNyBAQAogCWluZm8oImRldmljZSBpcyBhICVzIiwgY3AtPmRldl9kZXNjKTsKIAogICAgICAgICAvKiBnZXQgdGhlIG1heGltdW0gYWxsb3dlZCBjb250cm9sIHRyYW5zZmVyIGxlbmd0aCAqLwotICAgICAgICBwYnVmID0gKF9fbGUxNiAqKSBrbWFsbG9jICgyLCBHRlBfS0VSTkVMKTsgICAgLyogdXNlIGFuIGFsbG9jYXRlZCBidWZmZXIgYmVjYXVzZSBvZiB1cmIgdGFyZ2V0ICovCisgICAgICAgIHBidWYgPSBrbWFsbG9jKDIsIEdGUF9LRVJORUwpOyAgICAvKiB1c2UgYW4gYWxsb2NhdGVkIGJ1ZmZlciBiZWNhdXNlIG9mIHVyYiB0YXJnZXQgKi8KICAgICAgICAgaWYgKCFwYnVmKSB7CiAJCWVyciggIm91dCBvZiBtZW1vcnkiKTsKIAkJZ290byBwZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYwppbmRleCAxZmQ5Y2I4Li41YzBhMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9lbWkyNi5jCkBAIC01MywxMyArNTMsMTIgQEAKIHN0YXRpYyBpbnQgZW1pMjZfd3JpdGVtZW1vcnkgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuZ3RoLCBfX3U4IHJlcXVlc3QpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAga21hbGxvYyAobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAga21lbWR1cChkYXRhLCBsZW5ndGgsIEdGUF9LRVJORUwpOwogCiAJaWYgKCFidWZmZXIpIHsKIAkJZXJyKCJlbWkyNjoga21hbGxvYyglZCkgZmFpbGVkLiIsIGxlbmd0aCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1jcHkgKGJ1ZmZlciwgZGF0YSwgbGVuZ3RoKTsKIAkvKiBOb3RlOiB1c2JfY29udHJvbF9tc2cgcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciBvciBsZW5ndGggb2YgdGhlCiAJICogCQkgZGF0YSB0aGF0IHdhcyB3cml0dGVuISAqLwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgcmVxdWVzdCwgMHg0MCwgYWRkcmVzcywgMCwgYnVmZmVyLCBsZW5ndGgsIDMwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2VtaTYyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2VtaTYyLmMKaW5kZXggZmUzNTEzNy4uMjMxNTNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9lbWk2Mi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pNjIuYwpAQCAtNjEsMTMgKzYxLDEyIEBACiBzdGF0aWMgaW50IGVtaTYyX3dyaXRlbWVtb3J5IChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgYWRkcmVzcywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgX191OCByZXF1ZXN0KQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyID0gIGttYWxsb2MgKGxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyID0gIGttZW1kdXAoZGF0YSwgbGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAogCWlmICghYnVmZmVyKSB7CiAJCWVycigiZW1pNjI6IGttYWxsb2MoJWQpIGZhaWxlZC4iLCBsZW5ndGgpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtY3B5IChidWZmZXIsIGRhdGEsIGxlbmd0aCk7CiAJLyogTm90ZTogdXNiX2NvbnRyb2xfbXNnIHJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3Igb3IgbGVuZ3RoIG9mIHRoZQogCSAqIAkJIGRhdGEgdGhhdCB3YXMgd3JpdHRlbiEgKi8KIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2cgKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksIHJlcXVlc3QsIDB4NDAsIGFkZHJlc3MsIDAsIGJ1ZmZlciwgbGVuZ3RoLCAzMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYyBiL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKaW5kZXggMGViMjZhMi4uMThiMTkyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCkBAIC0xNTYsOSArMTU2LDkgQEAKICAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAgICAgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAgICAgICAgIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyICpjbGFzczsKLSAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHN0YXR1c193b3JrOwotICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29tbWFuZF93b3JrOwotICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzcG9uZF93b3JrOworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXR1c193b3JrOworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGNvbW1hbmRfd29yazsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayByZXNwb25kX3dvcms7CiAgICAgICAgIHN0cnVjdCB1MTMyX3BsYXRmb3JtX2RhdGEgcGxhdGZvcm1fZGF0YTsKICAgICAgICAgc3RydWN0IHJlc291cmNlIHJlc291cmNlc1swXTsKICAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwbGF0Zm9ybV9kZXY7CkBAIC0yMTAsMjMgKzIxMCwxNCBAQAogCiBzdGF0aWMgdm9pZCBmdGRpX3N0YXR1c19yZXF1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0gICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKHN0YXR1c19xdWV1ZSwgJmZ0ZGktPnN0YXR1c193b3JrLCBkZWx0YSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAocXVldWVfd29yayhzdGF0dXNfcXVldWUsICZmdGRpLT5zdGF0dXNfd29yaykpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7Ci0gICAgICAgIHJldHVybjsKKwlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhzdGF0dXNfcXVldWUsICZmdGRpLT5zdGF0dXNfd29yaywgZGVsdGEpKQorCQlrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfc3RhdHVzX3F1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0gICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKHN0YXR1c19xdWV1ZSwgJmZ0ZGktPnN0YXR1c193b3JrLCBkZWx0YSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBrcmVmX2dldCgmZnRkaS0+a3JlZik7Ci0gICAgICAgIH0gZWxzZSBpZiAocXVldWVfd29yayhzdGF0dXNfcXVldWUsICZmdGRpLT5zdGF0dXNfd29yaykpCi0gICAgICAgICAgICAgICAga3JlZl9nZXQoJmZ0ZGktPmtyZWYpOwotICAgICAgICByZXR1cm47CisJaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhzdGF0dXNfcXVldWUsICZmdGRpLT5zdGF0dXNfd29yaywgZGVsdGEpKQorCQlrcmVmX2dldCgmZnRkaS0+a3JlZik7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfc3RhdHVzX2NhbmNlbF93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKQEAgLTIzNywyNSArMjI4LDE0IEBACiAKIHN0YXRpYyB2b2lkIGZ0ZGlfY29tbWFuZF9yZXF1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0gICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKGNvbW1hbmRfcXVldWUsICZmdGRpLT5jb21tYW5kX3dvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAocXVldWVfd29yayhjb21tYW5kX3F1ZXVlLCAmZnRkaS0+Y29tbWFuZF93b3JrKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKLSAgICAgICAgcmV0dXJuOworCWlmICghcXVldWVfZGVsYXllZF93b3JrKGNvbW1hbmRfcXVldWUsICZmdGRpLT5jb21tYW5kX3dvcmssIGRlbHRhKSkKKwkJa3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX2NvbW1hbmRfcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHVuc2lnbmVkIGludCBkZWx0YSkKIHsKLSAgICAgICAgaWYgKGRlbHRhID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsoY29tbWFuZF9xdWV1ZSwgJmZ0ZGktPmNvbW1hbmRfd29yaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKLSAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKGNvbW1hbmRfcXVldWUsICZmdGRpLT5jb21tYW5kX3dvcmspKQotICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKLSAgICAgICAgcmV0dXJuOworCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsoY29tbWFuZF9xdWV1ZSwgJmZ0ZGktPmNvbW1hbmRfd29yaywgZGVsdGEpKQorCQlrcmVmX2dldCgmZnRkaS0+a3JlZik7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfY29tbWFuZF9jYW5jZWxfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCkBAIC0yNjcsMjUgKzI0NywxNCBAQAogc3RhdGljIHZvaWQgZnRkaV9yZXNwb25zZV9yZXF1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLAogICAgICAgICB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0gICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKHJlc3BvbmRfcXVldWUsICZmdGRpLT5yZXNwb25kX3dvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAocXVldWVfd29yayhyZXNwb25kX3F1ZXVlLCAmZnRkaS0+cmVzcG9uZF93b3JrKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKLSAgICAgICAgcmV0dXJuOworCWlmICghcXVldWVfZGVsYXllZF93b3JrKHJlc3BvbmRfcXVldWUsICZmdGRpLT5yZXNwb25kX3dvcmssIGRlbHRhKSkKKwkJa3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX3Jlc3BvbmRfcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHVuc2lnbmVkIGludCBkZWx0YSkKIHsKLSAgICAgICAgaWYgKGRlbHRhID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsocmVzcG9uZF9xdWV1ZSwgJmZ0ZGktPnJlc3BvbmRfd29yaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKLSAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKHJlc3BvbmRfcXVldWUsICZmdGRpLT5yZXNwb25kX3dvcmspKQotICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKLSAgICAgICAgcmV0dXJuOworCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsocmVzcG9uZF9xdWV1ZSwgJmZ0ZGktPnJlc3BvbmRfd29yaywgZGVsdGEpKQorCQlrcmVmX2dldCgmZnRkaS0+a3JlZik7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfcmVzcG9uc2VfY2FuY2VsX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpKQpAQCAtMzAzLDcgKzI3Miw3IEBACiAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZnRkaV9lbGFuX2dvbmVfYXdheSk7Ci12b2lkIGZ0ZGlfcmVsZWFzZV9wbGF0Zm9ybV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZnRkaV9yZWxlYXNlX3BsYXRmb3JtX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAgICAgICAgIGRldi0+cGFyZW50ID0gTlVMTDsKIH0KQEAgLTQ3NSw5ICs0NDQsMTEgQEAKICAgICAgICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBmdGRpX2VsYW5fY29tbWFuZF93b3JrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBmdGRpX2VsYW5fY29tbWFuZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLSAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gZGF0YTsKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JfZnRkaSwgY29tbWFuZF93b3JrLndvcmspOworCiAgICAgICAgIGlmIChmdGRpLT5kaXNjb25uZWN0ZWQgPiAwKSB7CiAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX3B1dF9rcmVmKGZ0ZGkpOwogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTUwMCw5ICs0NzEsMTAgQEAKICAgICAgICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBmdGRpX2VsYW5fcmVzcG9uZF93b3JrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBmdGRpX2VsYW5fcmVzcG9uZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLSAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gZGF0YTsKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JfZnRkaSwgcmVzcG9uZF93b3JrLndvcmspOwogICAgICAgICBpZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgewogICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9wdXRfa3JlZihmdGRpKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC01MTMsOCArNDg1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmRpc2Nvbm5lY3RlZCArPSAxOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0dmFsID09IC1FTk9ERVYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmRpc2Nvbm5lY3RlZCArPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0dmFsID09IC1FTk9ERVYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmRpc2Nvbm5lY3RlZCArPSAxOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0dmFsID09IC1FSUxTRVEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmRpc2Nvbm5lY3RlZCArPSAxOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01MzYsOSArNTA2LDEwIEBACiAqIGFmdGVyIHRoZSBGVERJIGhhcyBiZWVuIHN5bmNocm9uaXplZAogKgogKi8KLXN0YXRpYyB2b2lkIGZ0ZGlfZWxhbl9zdGF0dXNfd29yayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZnRkaV9lbGFuX3N0YXR1c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLSAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gZGF0YTsKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JfZnRkaSwgc3RhdHVzX3dvcmsud29yayk7CiAgICAgICAgIGludCB3b3JrX2RlbGF5X2luX21zZWMgPSAwOwogICAgICAgICBpZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgewogICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9wdXRfa3JlZihmdGRpKTsKQEAgLTExODYsMTEgKzExNTcsOCBAQAogICAgICAgICBpbnQgcmV0dmFsID0gMDsKICAgICAgICAgc3RydWN0IHVyYiAqdXJiOwogICAgICAgICBjaGFyICpidWY7Ci0gICAgICAgIGNoYXIgZGF0YVszMCAqMyArIDRdOwotICAgICAgICBjaGFyICpkID0gZGF0YTsKLSAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnMgPSB1c2VyX2J1ZmZlcjsKLSAgICAgICAgaW50IG0gPSAoc2l6ZW9mKGRhdGEpIC0gMSkgLyAzOwotICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSAoc3RydWN0IHVzYl9mdGRpICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKICAgICAgICAgaWYgKGZ0ZGktPmRpc2Nvbm5lY3RlZCA+IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICAgICAgfQpAQCAtMTIyMCwyNyArMTE4OCwxOCBAQAogICAgICAgICBpZiAocmV0dmFsKSB7CiAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlIgogICAgICAgICAgICAgICAgICAgICAgICAgImRcbiIsIHJldHZhbCk7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcl80OworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfMzsKICAgICAgICAgfQogICAgICAgICB1c2JfZnJlZV91cmIodXJiKTsKLSAgICAgIGV4aXQ6OwotICAgICAgICBpZiAoY291bnQgPiBtKSB7Ci0gICAgICAgICAgICAgICAgaW50IEkgPSBtIC0gMTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoSS0tID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgJTAyWCIsIDB4MDAwMDAwRkYgJiAqcysrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgLi4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgSSA9IGNvdW50OwotICAgICAgICAgICAgICAgIHdoaWxlIChJLS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAlMDJYIiwgMHgwMDAwMDBGRiAmICpzKyspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCitleGl0OgogICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgICBlcnJvcl80OiBlcnJvcl8zOnVzYl9idWZmZXJfZnJlZShmdGRpLT51ZGV2LCBjb3VudCwgYnVmLAotICAgICAgICAgICAgICB1cmItPnRyYW5zZmVyX2RtYSk7Ci0gICAgICBlcnJvcl8yOnVzYl9mcmVlX3VyYih1cmIpOwotICAgICAgZXJyb3JfMTpyZXR1cm4gcmV0dmFsOworZXJyb3JfMzoKKwl1c2JfYnVmZmVyX2ZyZWUoZnRkaS0+dWRldiwgY291bnQsIGJ1ZiwgdXJiLT50cmFuc2Zlcl9kbWEpOworZXJyb3JfMjoKKwl1c2JfZnJlZV91cmIodXJiKTsKK2Vycm9yXzE6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnRkaV9lbGFuX2ZvcHMgPSB7CkBAIC0xNDQwLDE0ICsxMzk5LDYgQEAKICAgICAgICAgfQogfQogCi1pbnQgdXNiX2Z0ZGlfZWxhbl9yZWFkX3JlZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1MzIgKmRhdGEpCi17Ci0gICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IHBsYXRmb3JtX2RldmljZV90b191c2JfZnRkaShwZGV2KTsKLSAgICAgICAgcmV0dXJuIGZ0ZGlfZWxhbl9yZWFkX3JlZyhmdGRpLCBkYXRhKTsKLX0KLQotCi1FWFBPUlRfU1lNQk9MX0dQTCh1c2JfZnRkaV9lbGFuX3JlYWRfcmVnKTsKIHN0YXRpYyBpbnQgZnRkaV9lbGFuX3JlYWRfY29uZmlnKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgaW50IGNvbmZpZ19vZmZzZXQsCiAgICAgICAgIHU4IHdpZHRoLCB1MzIgKmRhdGEpCiB7CkBAIC0yNjQ3LDEwICsyNTk4LDcgQEAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CiAgICAgICAgICAgICAgICAgZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKICAgICAgICAgICAgICAgICBpZiAoIWZ0ZGktPmJ1bGtfaW5fZW5kcG9pbnRBZGRyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gVVNCX0RJUl9JTikgJiYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYKLSAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKKwkJICAgIHVzYl9lbmRwb2ludF9pc19idWxrX2luKGVuZHBvaW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19pbl9zaXplID0gYnVmZmVyX3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwpAQCAtMjY2MywxMCArMjYxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICghZnRkaS0+YnVsa19vdXRfZW5kcG9pbnRBZGRyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gVVNCX0RJUl9PVVQpICYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmCi0gICAgICAgICAgICAgICAgICAgICAgICBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpCi0gICAgICAgICAgICAgICAgICAgICAgICB7CisJCSAgICB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5idWxrX291dF9lbmRwb2ludEFkZHIgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKICAgICAgICAgICAgICAgICB9CkBAIC0yNzA1LDEyICsyNjUwLDkgQEAKICAgICAgICAgICAgICAgICBmdGRpLT5jbGFzcyA9IE5VTEw7CiAgICAgICAgICAgICAgICAgZGV2X2luZm8oJmZ0ZGktPnVkZXYtPmRldiwgIlVTQiBGRFRJPSVwIEVMQU4gaW50ZXJmYWNlICVkIG5vdyBhIgogICAgICAgICAgICAgICAgICAgICAgICAgImN0aXZhdGVkXG4iLCBmdGRpLCBpZmFjZV9kZXNjLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwotICAgICAgICAgICAgICAgIElOSVRfV09SSygmZnRkaS0+c3RhdHVzX3dvcmssIGZ0ZGlfZWxhbl9zdGF0dXNfd29yaywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZnRkaSk7Ci0gICAgICAgICAgICAgICAgSU5JVF9XT1JLKCZmdGRpLT5jb21tYW5kX3dvcmssIGZ0ZGlfZWxhbl9jb21tYW5kX3dvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWZ0ZGkpOwotICAgICAgICAgICAgICAgIElOSVRfV09SSygmZnRkaS0+cmVzcG9uZF93b3JrLCBmdGRpX2VsYW5fcmVzcG9uZF93b3JrLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilmdGRpKTsKKyAgICAgICAgICAgICAgICBJTklUX0RFTEFZRURfV09SSygmZnRkaS0+c3RhdHVzX3dvcmssIGZ0ZGlfZWxhbl9zdGF0dXNfd29yayk7CisgICAgICAgICAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmZ0ZGktPmNvbW1hbmRfd29yaywgZnRkaV9lbGFuX2NvbW1hbmRfd29yayk7CisgICAgICAgICAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmZ0ZGktPnJlc3BvbmRfd29yaywgZnRkaV9lbGFuX3Jlc3BvbmRfd29yayk7CiAgICAgICAgICAgICAgICAgZnRkaV9zdGF0dXNfcXVldWVfd29yayhmdGRpLCBtc2Vjc190b19qaWZmaWVzKDMgKjEwMDApKTsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jIGIvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMKaW5kZXggOGU2ZTE5NS4uYzk0MTg1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMKQEAgLTEyNSwxMiArMTI1LDEyIEBACiAKIHN0YXRpYyBpbnQgaWRtb3VzZV9jcmVhdGVfaW1hZ2Uoc3RydWN0IHVzYl9pZG1vdXNlICpkZXYpCiB7Ci0JaW50IGJ5dGVzX3JlYWQgPSAwOwotCWludCBidWxrX3JlYWQgPSAwOwotCWludCByZXN1bHQgPSAwOworCWludCBieXRlc19yZWFkOworCWludCBidWxrX3JlYWQ7CisJaW50IHJlc3VsdDsKIAogCW1lbWNweShkZXYtPmJ1bGtfaW5fYnVmZmVyLCBIRUFERVIsIHNpemVvZihIRUFERVIpLTEpOwotCWJ5dGVzX3JlYWQgKz0gc2l6ZW9mKEhFQURFUiktMTsKKwlieXRlc19yZWFkID0gc2l6ZW9mKEhFQURFUiktMTsKIAogCS8qIHJlc2V0IHRoZSBkZXZpY2UgYW5kIHNldCBhIGZhc3QgYmxpbmsgcmF0ZSAqLwogCXJlc3VsdCA9IGZ0aXBfY29tbWFuZChkZXYsIEZUSVBfUkVMRUFTRSwgMCwgMCk7CkBAIC0yMDgsOSArMjA4LDkgQEAKIAogc3RhdGljIGludCBpZG1vdXNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IHVzYl9pZG1vdXNlICpkZXYgPSBOVUxMOworCXN0cnVjdCB1c2JfaWRtb3VzZSAqZGV2OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7Ci0JaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdDsKIAogCS8qIHByZXZlbnQgZGlzY29ubmVjdHMgKi8KIAltdXRleF9sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKQEAgLTMwNSw3ICszMDUsNyBAQAogCQkJCWxvZmZfdCAqIHBwb3MpCiB7CiAJc3RydWN0IHVzYl9pZG1vdXNlICpkZXY7Ci0JaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdDsKIAogCWRldiA9IChzdHJ1Y3QgdXNiX2lkbW91c2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwogCkBAIC0zMjksNyArMzI5LDcgQEAKIAkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7Ci0Jc3RydWN0IHVzYl9pZG1vdXNlICpkZXYgPSBOVUxMOworCXN0cnVjdCB1c2JfaWRtb3VzZSAqZGV2OwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKIAlpbnQgcmVzdWx0OwpAQCAtMzUwLDExICszNTAsNyBAQAogCiAJLyogc2V0IHVwIHRoZSBlbmRwb2ludCBpbmZvcm1hdGlvbiAtIHVzZSBvbmx5IHRoZSBmaXJzdCBidWxrLWluIGVuZHBvaW50ICovCiAJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbMF0uZGVzYzsKLQlpZiAoIWRldi0+YnVsa19pbl9lbmRwb2ludEFkZHIKLQkJJiYgKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKLQkJJiYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09Ci0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspKSB7Ci0KKwlpZiAoIWRldi0+YnVsa19pbl9lbmRwb2ludEFkZHIgJiYgdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKSB7CiAJCS8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLwogCQlkZXYtPm9yaWdfYmlfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CiAJCWRldi0+YnVsa19pbl9zaXplID0gMHgyMDA7IC8qIHdvcmtzIF9tdWNoXyBmYXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCmluZGV4IDI3MDg5NDkuLjVkY2U3OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYwpAQCAtMzE3LDEyICszMTcsOCBAQAogCXRvd2VyX2Fib3J0X3RyYW5zZmVycyAoZGV2KTsKIAogCS8qIGZyZWUgZGF0YSBzdHJ1Y3R1cmVzICovCi0JaWYgKGRldi0+aW50ZXJydXB0X2luX3VyYiAhPSBOVUxMKSB7Ci0JCXVzYl9mcmVlX3VyYiAoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKLQl9Ci0JaWYgKGRldi0+aW50ZXJydXB0X291dF91cmIgIT0gTlVMTCkgewotCQl1c2JfZnJlZV91cmIgKGRldi0+aW50ZXJydXB0X291dF91cmIpOwotCX0KKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7CiAJa2ZyZWUgKGRldi0+cmVhZF9idWZmZXIpOwogCWtmcmVlIChkZXYtPmludGVycnVwdF9pbl9idWZmZXIpOwogCWtmcmVlIChkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKTsKQEAgLTUwMiwxNSArNDk4LDExIEBACiAJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcpIHsKIAkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CiAJCW1iKCk7Ci0JCWlmIChkZXYtPmludGVycnVwdF9pbl91cmIgIT0gTlVMTCAmJiBkZXYtPnVkZXYpIHsKKwkJaWYgKGRldi0+dWRldikKIAkJCXVzYl9raWxsX3VyYiAoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKLQkJfQogCX0KLQlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpIHsKLQkJaWYgKGRldi0+aW50ZXJydXB0X291dF91cmIgIT0gTlVMTCAmJiBkZXYtPnVkZXYpIHsKLQkJCXVzYl9raWxsX3VyYiAoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7Ci0JCX0KLQl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5ICYmIGRldi0+dWRldikKKwkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOwogCiBleGl0OgogCWRiZygyLCAiJXM6IGxlYXZlIiwgX19GVU5DVElPTl9fKTsKQEAgLTg5OCwxNCArODkwLDExIEBACiAJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CiAJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CiAKLQkJaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pICYmCi0JCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkgewotCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPSBlbmRwb2ludDsKLQkJfQotCi0JCWlmICgoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCkgJiYKLQkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7Ci0JCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPSBlbmRwb2ludDsKKwkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChlbmRwb2ludCkpIHsKKwkJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKGVuZHBvaW50KSkKKwkJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9IGVuZHBvaW50OworCQkJZWxzZQorCQkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9IGVuZHBvaW50OwogCQl9CiAJfQogCWlmKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldGtpdC5jIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKaW5kZXggYWJiNGRjZC4uMzcxYmYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0a2l0LmMKQEAgLTgxLDggKzgxLDggQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCWRtYV9hZGRyX3QgZGF0YV9kbWE7CiAKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZG9fbm90aWZ5OwotCXN0cnVjdCB3b3JrX3N0cnVjdCBkb19yZXN1Ym1pdDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGRvX25vdGlmeTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGRvX3Jlc3VibWl0OwogCXVuc2lnbmVkIGxvbmcgaW5wdXRfZXZlbnRzOwogCXVuc2lnbmVkIGxvbmcgc2Vuc29yX2V2ZW50czsKIH07CkBAIC0zNzQsMTkgKzM3NCwyMCBAQAogCX0KIAogCWlmIChraXQtPmlucHV0X2V2ZW50cyB8fCBraXQtPnNlbnNvcl9ldmVudHMpCi0JCXNjaGVkdWxlX3dvcmsoJmtpdC0+ZG9fbm90aWZ5KTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZraXQtPmRvX25vdGlmeSwgMCk7CiAKIHJlc3VibWl0OgotCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgU0xBQl9BVE9NSUMpOworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0YXR1cykKIAkJZXJyKCJjYW4ndCByZXN1Ym1pdCBpbnRyLCAlcy0lcy9pbnRlcmZhY2VraXQwLCBzdGF0dXMgJWQiLAogCQkJa2l0LT51ZGV2LT5idXMtPmJ1c19uYW1lLAogCQkJa2l0LT51ZGV2LT5kZXZwYXRoLCBzdGF0dXMpOwogfQogCi1zdGF0aWMgdm9pZCBkb19ub3RpZnkodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGRvX25vdGlmeShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGludGVyZmFjZWtpdCAqa2l0ID0gZGF0YTsKKwlzdHJ1Y3QgaW50ZXJmYWNla2l0ICpraXQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGludGVyZmFjZWtpdCwgZG9fbm90aWZ5LndvcmspOwogCWludCBpOwogCWNoYXIgc3lzZnNfZmlsZVs4XTsKIApAQCAtNDA1LDkgKzQwNiwxMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZG9fcmVzdWJtaXQodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGRvX3Jlc3VibWl0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzZXRfb3V0cHV0cyhkYXRhKTsKKwlzdHJ1Y3QgaW50ZXJmYWNla2l0ICpraXQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGludGVyZmFjZWtpdCwgZG9fcmVzdWJtaXQud29yayk7CisJc2V0X291dHB1dHMoa2l0KTsKIH0KIAogI2RlZmluZSBzaG93X3NldF9vdXRwdXQodmFsdWUpCQlcCkBAIC01NTEsNyArNTU0LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7Ci0JaWYgKCEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSkgCisJaWYgKCF1c2JfZW5kcG9pbnRfZGlyX2luKGVuZHBvaW50KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJLyoKIAkgKiBibUF0dHJpYnV0ZXMKQEAgLTU2NSw3ICs1NjgsNyBAQAogCiAJa2l0LT5kZXZfbm8gPSAtMTsKIAlraXQtPmlma2l0ID0gaWZraXQ7Ci0Ja2l0LT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIFVSQl9JTlRfU0laRSwgU0xBQl9BVE9NSUMsICZraXQtPmRhdGFfZG1hKTsKKwlraXQtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgVVJCX0lOVF9TSVpFLCBHRlBfQVRPTUlDLCAma2l0LT5kYXRhX2RtYSk7CiAJaWYgKCFraXQtPmRhdGEpCiAJCWdvdG8gb3V0OwogCkBAIC01NzUsOCArNTc4LDggQEAKIAogCWtpdC0+dWRldiA9IHVzYl9nZXRfZGV2KGRldik7CiAJa2l0LT5pbnRmID0gaW50ZjsKLQlJTklUX1dPUksoJmtpdC0+ZG9fbm90aWZ5LCBkb19ub3RpZnksIGtpdCk7Ci0JSU5JVF9XT1JLKCZraXQtPmRvX3Jlc3VibWl0LCBkb19yZXN1Ym1pdCwga2l0KTsKKwlJTklUX0RFTEFZRURfV09SSygma2l0LT5kb19ub3RpZnksIGRvX25vdGlmeSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmtpdC0+ZG9fcmVzdWJtaXQsIGRvX3Jlc3VibWl0KTsKIAl1c2JfZmlsbF9pbnRfdXJiKGtpdC0+aXJxLCBraXQtPnVkZXYsIHBpcGUsIGtpdC0+ZGF0YSwKIAkJCW1heHAgPiBVUkJfSU5UX1NJWkUgPyBVUkJfSU5UX1NJWkUgOiBtYXhwLAogCQkJaW50ZXJmYWNla2l0X2lycSwga2l0LCBlbmRwb2ludC0+YkludGVydmFsKTsKQEAgLTY1MCw4ICs2NTMsNyBAQAogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoa2l0LT5kZXYsICZkZXZfb3V0cHV0X2F0dHJzW2ldKTsKIG91dDoKIAlpZiAoa2l0KSB7Ci0JCWlmIChraXQtPmlycSkKLQkJCXVzYl9mcmVlX3VyYihraXQtPmlycSk7CisJCXVzYl9mcmVlX3VyYihraXQtPmlycSk7CiAJCWlmIChraXQtPmRhdGEpCiAJCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBVUkJfSU5UX1NJWkUsIGtpdC0+ZGF0YSwga2l0LT5kYXRhX2RtYSk7CiAJCWlmIChraXQtPmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0bW90b3Jjb250cm9sLmMKaW5kZXggNWM3ODBjYS4uNTcyN2UxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0bW90b3Jjb250cm9sLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0bW90b3Jjb250cm9sLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCWRtYV9hZGRyX3QgZGF0YV9kbWE7CiAKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZG9fbm90aWZ5OworCXN0cnVjdCBkZWxheWVkX3dvcmsgZG9fbm90aWZ5OwogCXVuc2lnbmVkIGxvbmcgaW5wdXRfZXZlbnRzOwogCXVuc2lnbmVkIGxvbmcgc3BlZWRfZXZlbnRzOwogCXVuc2lnbmVkIGxvbmcgZXhjZWVkX2V2ZW50czsKQEAgLTE0OCwxMCArMTQ4LDEwIEBACiAJCXNldF9iaXQoMSwgJm1jLT5leGNlZWRfZXZlbnRzKTsKIAogCWlmIChtYy0+aW5wdXRfZXZlbnRzIHx8IG1jLT5leGNlZWRfZXZlbnRzIHx8IG1jLT5zcGVlZF9ldmVudHMpCi0JCXNjaGVkdWxlX3dvcmsoJm1jLT5kb19ub3RpZnkpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1jLT5kb19ub3RpZnksIDApOwogCiByZXN1Ym1pdDoKLQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIFNMQUJfQVRPTUlDKTsKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpCiAJCWRldl9lcnIoJm1jLT5pbnRmLT5kZXYsCiAJCQkiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvbW90b3Jjb250cm9sMCwgc3RhdHVzICVkIiwKQEAgLTE1OSw5ICsxNTksMTAgQEAKIAkJCW1jLT51ZGV2LT5kZXZwYXRoLCBzdGF0dXMpOwogfQogCi1zdGF0aWMgdm9pZCBkb19ub3RpZnkodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGRvX25vdGlmeShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG1vdG9yY29udHJvbCAqbWMgPSBkYXRhOworCXN0cnVjdCBtb3RvcmNvbnRyb2wgKm1jID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtb3RvcmNvbnRyb2wsIGRvX25vdGlmeS53b3JrKTsKIAlpbnQgaTsKIAljaGFyIHN5c2ZzX2ZpbGVbOF07CiAKQEAgLTMyMyw3ICszMjQsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKLQlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApKQorCWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbihlbmRwb2ludCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJLyoKQEAgLTMzNyw3ICszMzgsNyBAQAogCQlnb3RvIG91dDsKIAogCW1jLT5kZXZfbm8gPSAtMTsKLQltYy0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBVUkJfSU5UX1NJWkUsIFNMQUJfQVRPTUlDLCAmbWMtPmRhdGFfZG1hKTsKKwltYy0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBVUkJfSU5UX1NJWkUsIEdGUF9BVE9NSUMsICZtYy0+ZGF0YV9kbWEpOwogCWlmICghbWMtPmRhdGEpCiAJCWdvdG8gb3V0OwogCkBAIC0zNDgsNyArMzQ5LDcgQEAKIAltYy0+dWRldiA9IHVzYl9nZXRfZGV2KGRldik7CiAJbWMtPmludGYgPSBpbnRmOwogCW1jLT5hY2NlbGVyYXRpb25bMF0gPSBtYy0+YWNjZWxlcmF0aW9uWzFdID0gMTA7Ci0JSU5JVF9XT1JLKCZtYy0+ZG9fbm90aWZ5LCBkb19ub3RpZnksIG1jKTsKKwlJTklUX0RFTEFZRURfV09SSygmbWMtPmRvX25vdGlmeSwgZG9fbm90aWZ5KTsKIAl1c2JfZmlsbF9pbnRfdXJiKG1jLT5pcnEsIG1jLT51ZGV2LCBwaXBlLCBtYy0+ZGF0YSwKIAkJCW1heHAgPiBVUkJfSU5UX1NJWkUgPyBVUkJfSU5UX1NJWkUgOiBtYXhwLAogCQkJbW90b3Jjb250cm9sX2lycSwgbWMsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOwpAQCAtMzkyLDggKzM5Myw3IEBACiAJCWRldmljZV9yZW1vdmVfZmlsZShtYy0+ZGV2LCAmZGV2X2F0dHJzW2ldKTsKIG91dDoKIAlpZiAobWMpIHsKLQkJaWYgKG1jLT5pcnEpCi0JCQl1c2JfZnJlZV91cmIobWMtPmlycSk7CisJCXVzYl9mcmVlX3VyYihtYy0+aXJxKTsKIAkJaWYgKG1jLT5kYXRhKQogCQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgVVJCX0lOVF9TSVpFLCBtYy0+ZGF0YSwgbWMtPmRhdGFfZG1hKTsKIAkJaWYgKG1jLT5kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCmluZGV4IGI5OWNhOWMuLjAzOTg5MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCkBAIC0zMTY4LDcgKzMxNjgsNyBAQAogCQljYXNlIFNJU1VTQl9HRVRfQ09ORklHOgogCQljYXNlIFNJU1VTQl9DT01NQU5EOgogCQkJbG9ja19rZXJuZWwoKTsKLQkJCXJldHZhbCA9IHNpc3VzYl9pb2N0bChmLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZiwgY21kLCBhcmcpOworCQkJcmV0dmFsID0gc2lzdXNiX2lvY3RsKGYtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGYsIGNtZCwgYXJnKTsKIAkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXJldHVybiByZXR2YWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3RyYW5jZXZpYnJhdG9yLmMgYi9kcml2ZXJzL3VzYi9taXNjL3RyYW5jZXZpYnJhdG9yLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvdXNiL2lucHV0L3RyYW5jZXZpYnJhdG9yLmMKcmVuYW1lIHRvIGRyaXZlcnMvdXNiL21pc2MvdHJhbmNldmlicmF0b3IuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2JfdTEzMi5oIGIvZHJpdmVycy91c2IvbWlzYy91c2JfdTEzMi5oCmluZGV4IDU1MWJhODkuLmRjMmU1YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNiX3UxMzIuaAorKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYl91MTMyLmgKQEAgLTUyLDcgKzUyLDcgQEAKICogdGhlIGtlcm5lbCB0byBsb2FkIHRoZSAidTEzMi1oY2QiIG1vZHVsZS4KICoKICogVGhlICJmdGRpLXUxMzIiIG1vZHVsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBpbnNlcnRlZAotKiBQQyBjYXJkIGFuZCB0aGUgInUxMzItaGNkIiBtb2R1bGUgdXNlcyB0aGUgQVBJIHRvIHNlbmQgYW5kIHJlY2lldmUKKyogUEMgY2FyZCBhbmQgdGhlICJ1MTMyLWhjZCIgbW9kdWxlIHVzZXMgdGhlIEFQSSB0byBzZW5kIGFuZCByZWNlaXZlCiAqIGRhdGEuIFRoZSBBUEkgZmVhdHVyZXMgY2FsbC1iYWNrcywgc28gdGhhdCBwYXJ0IG9mIHRoZSAidTEzMi1oY2QiCiAqIG1vZHVsZSBjb2RlIHdpbGwgcnVuIGluIHRoZSBjb250ZXh0IG9mIG9uZSBvZiB0aGUga2VybmVsIHRocmVhZHMKICogb2YgdGhlICJmdGRpLXUxMzIiIG1vZHVsZS4KQEAgLTk1LDMgKzk1LDcgQEAKICAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKTsKIGludCB1c2JfZnRkaV9lbGFuX2Vkc2V0X2ZsdXNoKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHU4IGVkX251bWJlciwKICAgICAgICAgdm9pZCAqZW5kcCk7CitpbnQgdXNiX2Z0ZGlfZWxhbl9yZWFkX3BjaW1lbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgbWVtX29mZnNldCwKKwkJCSAgICAgIHU4IHdpZHRoLCB1MzIgKmRhdGEpOworaW50IHVzYl9mdGRpX2VsYW5fd3JpdGVfcGNpbWVtKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBtZW1fb2Zmc2V0LAorCQkJICAgICAgIHU4IHdpZHRoLCB1MzIgZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCmluZGV4IDdjMmNiZGYuLmZiMzIxODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJCWRlZmF1bHQ6CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAoZS0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgeworCQkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oJmUtPmRlc2MpKSB7CiAJCQkJaWYgKCFpbikKIAkJCQkJaW4gPSBlOwogCQkJfSBlbHNlIHsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCQkJfQogCQkJY29udGludWU7CiB0cnlfaXNvOgotCQkJaWYgKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pIHsKKwkJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKCZlLT5kZXNjKSkgewogCQkJCWlmICghaXNvX2luKQogCQkJCQlpc29faW4gPSBlOwogCQkJfSBlbHNlIHsKQEAgLTIxMyw3ICsyMTMsNyBAQAogCiAJaWYgKGJ5dGVzIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgU0xBQl9LRVJORUwpOworCXVyYiA9IHVzYl9hbGxvY191cmIgKDAsIEdGUF9LRVJORUwpOwogCWlmICghdXJiKQogCQlyZXR1cm4gdXJiOwogCXVzYl9maWxsX2J1bGtfdXJiICh1cmIsIHVkZXYsIHBpcGUsIE5VTEwsIGJ5dGVzLCBzaW1wbGVfY2FsbGJhY2ssIE5VTEwpOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCWlmICh1c2JfcGlwZWluIChwaXBlKSkKIAkJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfU0hPUlRfTk9UX09LOwotCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyAodWRldiwgYnl0ZXMsIFNMQUJfS0VSTkVMLAorCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyAodWRldiwgYnl0ZXMsIEdGUF9LRVJORUwsCiAJCQkmdXJiLT50cmFuc2Zlcl9kbWEpOwogCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKIAkJdXNiX2ZyZWVfdXJiICh1cmIpOwpAQCAtMzE1LDcgKzMxNSw3IEBACiAJCWluaXRfY29tcGxldGlvbiAoJmNvbXBsZXRpb24pOwogCQlpZiAodXNiX3BpcGVvdXQgKHVyYi0+cGlwZSkpCiAJCQlzaW1wbGVfZmlsbF9idWYgKHVyYik7Ci0JCWlmICgocmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgU0xBQl9LRVJORUwpKSAhPSAwKQorCQlpZiAoKHJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9LRVJORUwpKSAhPSAwKQogCQkJYnJlYWs7CiAKIAkJLyogTk9URTogIG5vIHRpbWVvdXRzOyBjYW4ndCBiZSBicm9rZW4gb3V0IG9mIGJ5IGludGVycnVwdCAqLwpAQCAtMzc0LDcgKzM3NCw3IEBACiAJdW5zaWduZWQJCWk7CiAJdW5zaWduZWQJCXNpemUgPSBtYXg7CiAKLQlzZyA9IGttYWxsb2MgKG5lbnRzICogc2l6ZW9mICpzZywgU0xBQl9LRVJORUwpOworCXNnID0ga21hbGxvYyAobmVudHMgKiBzaXplb2YgKnNnLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNnKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMzgyLDcgKzM4Miw3IEBACiAJCWNoYXIJCSpidWY7CiAJCXVuc2lnbmVkCWo7CiAKLQkJYnVmID0ga3phbGxvYyAoc2l6ZSwgU0xBQl9LRVJORUwpOworCQlidWYgPSBremFsbG9jIChzaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFidWYpIHsKIAkJCWZyZWVfc2dsaXN0IChzZywgaSk7CiAJCQlyZXR1cm4gTlVMTDsKQEAgLTQyOCw3ICs0MjgsNyBAQAogCQkJCSh1ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKIAkJCQkJPyAoSU5URVJSVVBUX1JBVEUgPDwgMykKIAkJCQkJOiBJTlRFUlJVUFRfUkFURSwKLQkJCQlzZywgbmVudHMsIDAsIFNMQUJfS0VSTkVMKTsKKwkJCQlzZywgbmVudHMsIDAsIEdGUF9LRVJORUwpOwogCQkKIAkJaWYgKHJldHZhbCkKIAkJCWJyZWFrOwpAQCAtODE5LDcgKzgxOSw3IEBACiAKIAkvKiByZXN1Ym1pdCBpZiB3ZSBuZWVkIHRvLCBlbHNlIG1hcmsgdGhpcyBhcyBkb25lICovCiAJaWYgKChzdGF0dXMgPT0gMCkgJiYgKGN0eC0+cGVuZGluZyA8IGN0eC0+Y291bnQpKSB7Ci0JCWlmICgoc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgU0xBQl9BVE9NSUMpKSAhPSAwKSB7CisJCWlmICgoc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKIAkJCWRiZyAoImNhbid0IHJlc3VibWl0IGN0cmwgJTAyeC4lMDJ4LCBlcnIgJWQiLAogCQkJCXJlcXAtPmJSZXF1ZXN0VHlwZSwgcmVxcC0+YlJlcXVlc3QsIHN0YXR1cyk7CiAJCQl1cmItPmRldiA9IE5VTEw7CkBAIC04NTUsNyArODU1LDcgQEAKIAkgKiBhcyB3aXRoIGJ1bGsvaW50ciBzZ2xpc3RzLCBzZ2xlbiBpcyB0aGUgcXVldWUgZGVwdGg7IGl0IGFsc28KIAkgKiBjb250cm9scyB3aGljaCBzdWJ0ZXN0cyBydW4gKG1vcmUgdGVzdHMgdGhhbiBzZ2xlbikgb3IgcmVydW4uCiAJICovCi0JdXJiID0ga2NhbGxvYyhwYXJhbS0+c2dsZW4sIHNpemVvZihzdHJ1Y3QgdXJiICopLCBTTEFCX0tFUk5FTCk7CisJdXJiID0ga2NhbGxvYyhwYXJhbS0+c2dsZW4sIHNpemVvZihzdHJ1Y3QgdXJiICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyYikKIAkJcmV0dXJuIC1FTk9NRU07CiAJZm9yIChpID0gMDsgaSA8IHBhcmFtLT5zZ2xlbjsgaSsrKSB7CkBAIC05ODEsNyArOTgxLDcgQEAKIAkJaWYgKCF1KQogCQkJZ290byBjbGVhbnVwOwogCi0JCXJlcXAgPSB1c2JfYnVmZmVyX2FsbG9jICh1ZGV2LCBzaXplb2YgKnJlcXAsIFNMQUJfS0VSTkVMLAorCQlyZXFwID0gdXNiX2J1ZmZlcl9hbGxvYyAodWRldiwgc2l6ZW9mICpyZXFwLCBHRlBfS0VSTkVMLAogCQkJCSZ1LT5zZXR1cF9kbWEpOwogCQlpZiAoIXJlcXApCiAJCQlnb3RvIGNsZWFudXA7CkBAIC05OTksNyArOTk5LDcgQEAKIAljb250ZXh0LnVyYiA9IHVyYjsKIAlzcGluX2xvY2tfaXJxICgmY29udGV4dC5sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgcGFyYW0tPnNnbGVuOyBpKyspIHsKLQkJY29udGV4dC5zdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiIFtpXSwgU0xBQl9BVE9NSUMpOworCQljb250ZXh0LnN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIgW2ldLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGNvbnRleHQuc3RhdHVzICE9IDApIHsKIAkJCWRiZyAoImNhbid0IHN1Ym1pdCB1cmJbJWRdLCBzdGF0dXMgJWQiLAogCQkJCQlpLCBjb250ZXh0LnN0YXR1cyk7CkBAIC0xMDQxLDcgKzEwNDEsNyBAQAogCiAJLy8gd2UgImtub3ciIC1FUElQRSAoc3RhbGwpIG5ldmVyIGhhcHBlbnMKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgU0xBQl9BVE9NSUMpOworCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzKSB7CiAJCXVyYi0+c3RhdHVzID0gc3RhdHVzOwogCQljb21wbGV0ZSAoKHN0cnVjdCBjb21wbGV0aW9uICopIHVyYi0+Y29udGV4dCk7CkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogCSAqIEZJWE1FIHdhbnQgYWRkaXRpb25hbCB0ZXN0cyBmb3Igd2hlbiBlbmRwb2ludCBpcyBTVEFMTGluZwogCSAqIGR1ZSB0byBlcnJvcnMsIG9yIGlzIGp1c3QgTkFLaW5nIHJlcXVlc3RzLgogCSAqLwotCWlmICgocmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgU0xBQl9LRVJORUwpKSAhPSAwKSB7CisJaWYgKChyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfS0VSTkVMKSkgIT0gMCkgewogCQlkZXZfZGJnICgmZGV2LT5pbnRmLT5kZXYsICJzdWJtaXQgZmFpbCAlZFxuIiwgcmV0dmFsKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CkBAIC0xMjUxLDcgKzEyNTEsNyBAQAogCWlmIChsZW5ndGggPCAxIHx8IGxlbmd0aCA+IDB4ZmZmZiB8fCB2YXJ5ID49IGxlbmd0aCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlidWYgPSBrbWFsbG9jKGxlbmd0aCwgU0xBQl9LRVJORUwpOworCWJ1ZiA9IGttYWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE0MDMsNyArMTQwMyw3IEBACiAJbWF4cCAqPSAxICsgKDB4MyAmIChsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkgPj4gMTEpKTsKIAlwYWNrZXRzID0gKGJ5dGVzICsgbWF4cCAtIDEpIC8gbWF4cDsKIAotCXVyYiA9IHVzYl9hbGxvY191cmIgKHBhY2tldHMsIFNMQUJfS0VSTkVMKTsKKwl1cmIgPSB1c2JfYWxsb2NfdXJiIChwYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyYikKIAkJcmV0dXJuIHVyYjsKIAl1cmItPmRldiA9IHVkZXY7CkBAIC0xNDExLDcgKzE0MTEsNyBAQAogCiAJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IHBhY2tldHM7CiAJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gYnl0ZXM7Ci0JdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jICh1ZGV2LCBieXRlcywgU0xBQl9LRVJORUwsCisJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jICh1ZGV2LCBieXRlcywgR0ZQX0tFUk5FTCwKIAkJCSZ1cmItPnRyYW5zZmVyX2RtYSk7CiAJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikgewogCQl1c2JfZnJlZV91cmIgKHVyYik7CkBAIC0xNDgxLDcgKzE0ODEsNyBAQAogCXNwaW5fbG9ja19pcnEgKCZjb250ZXh0LmxvY2spOwogCWZvciAoaSA9IDA7IGkgPCBwYXJhbS0+c2dsZW47IGkrKykgewogCQkrK2NvbnRleHQucGVuZGluZzsKLQkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYnMgW2ldLCBTTEFCX0FUT01JQyk7CisJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmJzIFtpXSwgR0ZQX0FUT01JQyk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlFUlJPUiAoZGV2LCAic3VibWl0IGlzb1slZF0sIGVycm9yICVkXG4iLCBpLCBzdGF0dXMpOwogCQkJaWYgKGkgPT0gMCkgewpAQCAtMTkwMCw3ICsxOTAwLDcgQEAKIAl9CiAjZW5kaWYKIAotCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBTTEFCX0tFUk5FTCk7CisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAlpbmZvID0gKHN0cnVjdCB1c2J0ZXN0X2luZm8gKikgaWQtPmRyaXZlcl9pbmZvOwpAQCAtMTkxMCw3ICsxOTEwLDcgQEAKIAlkZXYtPmludGYgPSBpbnRmOwogCiAJLyogY2FjaGVsaW5lLWFsaWduZWQgc2NyYXRjaCBmb3IgaS9vICovCi0JaWYgKChkZXYtPmJ1ZiA9IGttYWxsb2MgKFRCVUZfU0laRSwgU0xBQl9LRVJORUwpKSA9PSBOVUxMKSB7CisJaWYgKChkZXYtPmJ1ZiA9IGttYWxsb2MgKFRCVUZfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKIAkJa2ZyZWUgKGRldik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNzNzIwLmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzczcyMC5jCmluZGV4IDdlOGEwYWMuLjcwMjUwMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNzNzIwLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c3M3MjAuYwpAQCAtNzA1LDcgKzcwNSw3IEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBwYXJwb3J0IGludGVyZmFjZSAKIAkgKi8KLQlpZiAoIShwcml2ID0ga2NhbGxvYyhzaXplb2Yoc3RydWN0IHBhcnBvcnRfdXNzNzIwX3ByaXZhdGUpLCAxLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhcnBvcnRfdXNzNzIwX3ByaXZhdGUpLCBHRlBfS0VSTkVMKSkpIHsKIAkJdXNiX3B1dF9kZXYodXNiZGV2KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwppbmRleCA3YTIzNDZjLi4wNWNmMmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwpAQCAtNTAsNyArNTAsNyBAQAogCiAjZGVmaW5lIFNMQUJfTkFNRV9TWiAgMzAKIHN0cnVjdCBtb25fcmVhZGVyX3RleHQgewotCWttZW1fY2FjaGVfdCAqZV9zbGFiOworCXN0cnVjdCBrbWVtX2NhY2hlICplX3NsYWI7CiAJaW50IG5ldmVudHM7CiAJc3RydWN0IGxpc3RfaGVhZCBlX2xpc3Q7CiAJc3RydWN0IG1vbl9yZWFkZXIgcjsJLyogSW4gQywgcGFyZW50IGNsYXNzIGNhbiBiZSBwbGFjZWQgYW55d2hlcmUgKi8KQEAgLTYzLDcgKzYzLDcgQEAKIAljaGFyIHNsYWJfbmFtZVtTTEFCX05BTUVfU1pdOwogfTsKIAotc3RhdGljIHZvaWQgbW9uX3RleHRfY3Rvcih2b2lkICosIGttZW1fY2FjaGVfdCAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyB2b2lkIG1vbl90ZXh0X2N0b3Iodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKTsKIAogLyoKICAqIG1vbl90ZXh0X3N1Ym1pdApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJc3RhbXAgPSBtb25fZ2V0X3RpbWVzdGFtcCgpOwogCiAJaWYgKHJwLT5uZXZlbnRzID49IEVWRU5UX01BWCB8fAotCSAgICAoZXAgPSBrbWVtX2NhY2hlX2FsbG9jKHJwLT5lX3NsYWIsIFNMQUJfQVRPTUlDKSkgPT0gTlVMTCkgeworCSAgICAoZXAgPSBrbWVtX2NhY2hlX2FsbG9jKHJwLT5lX3NsYWIsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CiAJCXJwLT5yLm1fYnVzLT5jbnRfdGV4dF9sb3N0Kys7CiAJCXJldHVybjsKIAl9CkBAIC0xODgsNyArMTg4LDcgQEAKIAlzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgKmVwOwogCiAJaWYgKHJwLT5uZXZlbnRzID49IEVWRU5UX01BWCB8fAotCSAgICAoZXAgPSBrbWVtX2NhY2hlX2FsbG9jKHJwLT5lX3NsYWIsIFNMQUJfQVRPTUlDKSkgPT0gTlVMTCkgeworCSAgICAoZXAgPSBrbWVtX2NhY2hlX2FsbG9jKHJwLT5lX3NsYWIsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CiAJCXJwLT5yLm1fYnVzLT5jbnRfdGV4dF9sb3N0Kys7CiAJCXJldHVybjsKIAl9CkBAIC00NTAsNyArNDUwLDcgQEAKIC8qCiAgKiBTbGFiIGludGVyZmFjZTogY29uc3RydWN0b3IuCiAgKi8KLXN0YXRpYyB2b2lkIG1vbl90ZXh0X2N0b3Iodm9pZCAqbWVtLCBrbWVtX2NhY2hlX3QgKnNsYWIsIHVuc2lnbmVkIGxvbmcgc2ZsYWdzKQorc3RhdGljIHZvaWQgbW9uX3RleHRfY3Rvcih2b2lkICptZW0sIHN0cnVjdCBrbWVtX2NhY2hlICpzbGFiLCB1bnNpZ25lZCBsb25nIHNmbGFncykKIHsKIAkvKgogCSAqIE5vdGhpbmcgdG8gaW5pdGlhbGl6ZS4gTm8sIHJlYWxseSEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9LY29uZmlnIGIvZHJpdmVycy91c2IvbmV0L0tjb25maWcKaW5kZXggMDU0MDU5Ni4uZTA4MTgzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbmV0L0tjb25maWcKQEAgLTkyLDggKzkyLDEzIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGw4MTUwLgogCitjb25maWcgVVNCX1VTQk5FVF9NSUkKKwl0cmlzdGF0ZQorCWRlZmF1bHQgbgorCiBjb25maWcgVVNCX1VTQk5FVAogCXRyaXN0YXRlICJNdWx0aS1wdXJwb3NlIFVTQiBOZXR3b3JraW5nIEZyYW1ld29yayIKKwlzZWxlY3QgTUlJIGlmIFVTQk5FVF9NSUkgIT0gbgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHNldmVyYWwga2luZHMgb2YgbmV0d29yayBsaW5rcyBvdmVyIFVTQiwKIAkgIHdpdGggIm1pbmlkcml2ZXJzIiBidWlsdCBhcm91bmQgYSBjb21tb24gbmV0d29yayBkcml2ZXIgY29yZQpAQCAtMTI5LDcgKzEzNCw3IEBACiAJdHJpc3RhdGUgIkFTSVggQVg4OHh4eCBCYXNlZCBVU0IgMi4wIEV0aGVybmV0IEFkYXB0ZXJzIgogCWRlcGVuZHMgb24gVVNCX1VTQk5FVCAmJiBORVRfRVRIRVJORVQKIAlzZWxlY3QgQ1JDMzIKLQlzZWxlY3QgTUlJCisJc2VsZWN0IFVTQl9VU0JORVRfTUlJCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBBU0lYIEFYODh4eHggYmFzZWQgVVNCIDIuMApAQCAtMjA3LDYgKzIxMiwxNSBAQAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSdyZSB1c2luZyBhIGhvc3QtdG8taG9zdCBjYWJsZQogCSAgd2l0aCBvbmUgb2YgdGhlc2UgY2hpcHMuCiAKK2NvbmZpZyBVU0JfTkVUX01DUzc4MzAKKwl0cmlzdGF0ZSAiTW9zQ2hpcCBNQ1M3ODMwIGJhc2VkIEV0aGVybmV0IGFkYXB0ZXJzIgorCWRlcGVuZHMgb24gVVNCX1VTQk5FVAorCXNlbGVjdCBVU0JfVVNCTkVUX01JSQorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UncmUgdXNpbmcgYSAxMC8xMDAgRXRoZXJuZXQgVVNCMgorCSAgYWRhcHRlciBiYXNlZCBvbiB0aGUgTW9zQ2hpcCA3ODMwIGNvbnRyb2xsZXIuIFRoaXMgaW5jbHVkZXMKKwkgIGFkYXB0ZXJzIG1hcmtldGVkIHVuZGVyIHRoZSBEZUxPQ0sgYnJhbmQuCisKIGNvbmZpZyBVU0JfTkVUX1JORElTX0hPU1QKIAl0cmlzdGF0ZSAiSG9zdCBmb3IgUk5ESVMgZGV2aWNlcyAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIFVTQl9VU0JORVQgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9uZXQvTWFrZWZpbGUKaW5kZXggMTYwZjE5ZC4uN2I1MTk2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL25ldC9NYWtlZmlsZQpAQCAtMTQsNiArMTQsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9ORVRfUk5ESVNfSE9TVCkJKz0gcm5kaXNfaG9zdC5vCiBvYmotJChDT05GSUdfVVNCX05FVF9DRENfU1VCU0VUKQkrPSBjZGNfc3Vic2V0Lm8KIG9iai0kKENPTkZJR19VU0JfTkVUX1pBVVJVUykJKz0gemF1cnVzLm8KK29iai0kKENPTkZJR19VU0JfTkVUX01DUzc4MzApCSs9IG1jczc4MzAubwogb2JqLSQoQ09ORklHX1VTQl9VU0JORVQpCSs9IHVzYm5ldC5vCiAKIGlmZXEgKCQoQ09ORklHX1VTQl9ERUJVRykseSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMgYi9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jCmluZGV4IGM3M2RkMjIuLjk1ZTY4MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwpAQCAtMjQ5LDkgKzI0OSw5IEBACiAKIAlyZXEtPmJSZXF1ZXN0VHlwZSA9IFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRTsKIAlyZXEtPmJSZXF1ZXN0ID0gY21kOwotCXJlcS0+d1ZhbHVlID0gdmFsdWU7Ci0JcmVxLT53SW5kZXggPSBpbmRleDsKLQlyZXEtPndMZW5ndGggPSBzaXplOworCXJlcS0+d1ZhbHVlID0gY3B1X3RvX2xlMTYodmFsdWUpOworCXJlcS0+d0luZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOworCXJlcS0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwogCiAJdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCBkZXYtPnVkZXYsCiAJCQkgICAgIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLApAQCAtNTY5LDEwICs1NjksMTIgQEAKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXUxNiByZXM7CiAKKwltdXRleF9sb2NrKCZkZXYtPnBoeV9tdXRleCk7CiAJYXNpeF9zZXRfc3dfbWlpKGRldik7CiAJYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01JSV9SRUcsIHBoeV9pZCwKIAkJCQkoX191MTYpbG9jLCAyLCAodTE2ICopJnJlcyk7CiAJYXNpeF9zZXRfaHdfbWlpKGRldik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CiAKIAlkZXZkYmcoZGV2LCAiYXNpeF9tZGlvX3JlYWQoKSBwaHlfaWQ9MHglMDJ4LCBsb2M9MHglMDJ4LCByZXR1cm5zPTB4JTA0eCIsIHBoeV9pZCwgbG9jLCBsZTE2X3RvX2NwdShyZXMgJiAweGZmZmYpKTsKIApAQCAtNTg2LDEwICs1ODgsMTIgQEAKIAl1MTYgcmVzID0gY3B1X3RvX2xlMTYodmFsKTsKIAogCWRldmRiZyhkZXYsICJhc2l4X21kaW9fd3JpdGUoKSBwaHlfaWQ9MHglMDJ4LCBsb2M9MHglMDJ4LCB2YWw9MHglMDR4IiwgcGh5X2lkLCBsb2MsIHZhbCk7CisJbXV0ZXhfbG9jaygmZGV2LT5waHlfbXV0ZXgpOwogCWFzaXhfc2V0X3N3X21paShkZXYpOwogCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01JSV9SRUcsIHBoeV9pZCwKIAkJCQkoX191MTYpbG9jLCAyLCAodTE2ICopJnJlcyk7CiAJYXNpeF9zZXRfaHdfbWlpKGRldik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CiB9CiAKIC8qIEdldCB0aGUgUEhZIElkZW50aWZpZXIgZnJvbSB0aGUgUEhZU0lEMSAmIFBIWVNJRDIgTUlJIHJlZ2lzdGVycyAqLwpAQCAtNzAwLDMyICs3MDQsNiBAQAogCWluZm8tPmVlZHVtcF9sZW4gPSBkYXRhLT5lZXByb21fbGVuOwogfQogCi1zdGF0aWMgaW50IGFzaXhfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7Ci0KLQlyZXR1cm4gbWlpX2V0aHRvb2xfZ3NldCgmZGV2LT5taWksY21kKTsKLX0KLQotc3RhdGljIGludCBhc2l4X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwotCWludCByZXMgPSBtaWlfZXRodG9vbF9zc2V0KCZkZXYtPm1paSxjbWQpOwotCi0JLyogbGluayBzcGVlZC9kdXBsZXggbWlnaHQgaGF2ZSBjaGFuZ2VkICovCi0JaWYgKGRldi0+ZHJpdmVyX2luZm8tPmxpbmtfcmVzZXQpCi0JCWRldi0+ZHJpdmVyX2luZm8tPmxpbmtfcmVzZXQoZGV2KTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgYXNpeF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0Jc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQotCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7Ci19Ci0KIHN0YXRpYyB1MzIgYXNpeF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CkBAIC03NDYsMTUgKzcyNCwxNSBAQAogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBheDg4MTcyX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBhc2l4X2dldF9kcnZpbmZvLAogCS5nZXRfbGluawkJPSBhc2l4X2dldF9saW5rLAotCS5ud2F5X3Jlc2V0CQk9IGFzaXhfbndheV9yZXNldCwKIAkuZ2V0X21zZ2xldmVsCQk9IHVzYm5ldF9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAkJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAogCS5nZXRfd29sCQk9IGFzaXhfZ2V0X3dvbCwKIAkuc2V0X3dvbAkJPSBhc2l4X3NldF93b2wsCiAJLmdldF9lZXByb21fbGVuCQk9IGFzaXhfZ2V0X2VlcHJvbV9sZW4sCiAJLmdldF9lZXByb20JCT0gYXNpeF9nZXRfZWVwcm9tLAotCS5nZXRfc2V0dGluZ3MJCT0gYXNpeF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBhc2l4X3NldF9zZXR0aW5ncywKKwkuZ2V0X3NldHRpbmdzCQk9IHVzYm5ldF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSB1c2JuZXRfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0CQk9IHVzYm5ldF9ud2F5X3Jlc2V0LAogfTsKIAogc3RhdGljIHZvaWQgYXg4ODE3Ml9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCkBAIC04ODUsMTUgKzg2MywxNSBAQAogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBheDg4NzcyX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBhc2l4X2dldF9kcnZpbmZvLAogCS5nZXRfbGluawkJPSBhc2l4X2dldF9saW5rLAotCS5ud2F5X3Jlc2V0CQk9IGFzaXhfbndheV9yZXNldCwKIAkuZ2V0X21zZ2xldmVsCQk9IHVzYm5ldF9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAkJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAogCS5nZXRfd29sCQk9IGFzaXhfZ2V0X3dvbCwKIAkuc2V0X3dvbAkJPSBhc2l4X3NldF93b2wsCiAJLmdldF9lZXByb21fbGVuCQk9IGFzaXhfZ2V0X2VlcHJvbV9sZW4sCiAJLmdldF9lZXByb20JCT0gYXNpeF9nZXRfZWVwcm9tLAotCS5nZXRfc2V0dGluZ3MJCT0gYXNpeF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBhc2l4X3NldF9zZXR0aW5ncywKKwkuZ2V0X3NldHRpbmdzCQk9IHVzYm5ldF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSB1c2JuZXRfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0CQk9IHVzYm5ldF9ud2F5X3Jlc2V0LAogfTsKIAogc3RhdGljIGludCBheDg4NzcyX2xpbmtfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQpAQCAtMTA0NiwxNSArMTAyNCwxNSBAQAogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBheDg4MTc4X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBhc2l4X2dldF9kcnZpbmZvLAogCS5nZXRfbGluawkJPSBhc2l4X2dldF9saW5rLAotCS5ud2F5X3Jlc2V0CQk9IGFzaXhfbndheV9yZXNldCwKIAkuZ2V0X21zZ2xldmVsCQk9IHVzYm5ldF9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAkJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAogCS5nZXRfd29sCQk9IGFzaXhfZ2V0X3dvbCwKIAkuc2V0X3dvbAkJPSBhc2l4X3NldF93b2wsCiAJLmdldF9lZXByb21fbGVuCQk9IGFzaXhfZ2V0X2VlcHJvbV9sZW4sCiAJLmdldF9lZXByb20JCT0gYXNpeF9nZXRfZWVwcm9tLAotCS5nZXRfc2V0dGluZ3MJCT0gYXNpeF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBhc2l4X3NldF9zZXR0aW5ncywKKwkuZ2V0X3NldHRpbmdzCQk9IHVzYm5ldF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSB1c2JuZXRfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0CQk9IHVzYm5ldF9ud2F5X3Jlc2V0LAogfTsKIAogc3RhdGljIGludCBtYXJ2ZWxsX3BoeV9pbml0KHN0cnVjdCB1c2JuZXQgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMgYi9kcml2ZXJzL3VzYi9uZXQvY2F0Yy5jCmluZGV4IGY3NDAzMjUuLjQ4NTIwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2NhdGMuYwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAJCX0gCiAJfQogcmVzdWJtaXQ6Ci0Jc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgU0xBQl9BVE9NSUMpOworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpCiAJCWVyciAoImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzLCBzdGF0dXMgJWQiLAogCQkJCWNhdGMtPnVzYmRldi0+YnVzLT5idXNfbmFtZSwKQEAgLTc4NiwxNCArNzg2LDEwIEBACiAJaWYgKCghY2F0Yy0+Y3RybF91cmIpIHx8ICghY2F0Yy0+dHhfdXJiKSB8fCAKIAkgICAgKCFjYXRjLT5yeF91cmIpIHx8ICghY2F0Yy0+aXJxX3VyYikpIHsKIAkJZXJyKCJObyBmcmVlIHVyYnMgYXZhaWxhYmxlLiIpOwotCQlpZiAoY2F0Yy0+Y3RybF91cmIpCi0JCQl1c2JfZnJlZV91cmIoY2F0Yy0+Y3RybF91cmIpOwotCQlpZiAoY2F0Yy0+dHhfdXJiKQotCQkJdXNiX2ZyZWVfdXJiKGNhdGMtPnR4X3VyYik7Ci0JCWlmIChjYXRjLT5yeF91cmIpCi0JCQl1c2JfZnJlZV91cmIoY2F0Yy0+cnhfdXJiKTsKLQkJaWYgKGNhdGMtPmlycV91cmIpCi0JCQl1c2JfZnJlZV91cmIoY2F0Yy0+aXJxX3VyYik7CisJCXVzYl9mcmVlX3VyYihjYXRjLT5jdHJsX3VyYik7CisJCXVzYl9mcmVlX3VyYihjYXRjLT50eF91cmIpOworCQl1c2JfZnJlZV91cmIoY2F0Yy0+cnhfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKGNhdGMtPmlycV91cmIpOwogCQlmcmVlX25ldGRldihuZXRkZXYpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvY2RjX2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9uZXQvY2RjX2V0aGVyLmMKaW5kZXggODJjZTAzNS4uNDRhOTE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2NkY19ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9jZGNfZXRoZXIuYwpAQCAtMjAwLDggKzIwMCw3IEBACiAKIAkJZGV2LT5zdGF0dXMgPSAmaW5mby0+Y29udHJvbC0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50IFswXTsKIAkJZGVzYyA9ICZkZXYtPnN0YXR1cy0+ZGVzYzsKLQkJaWYgKGRlc2MtPmJtQXR0cmlidXRlcyAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQKLQkJCQl8fCAhKGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKQorCQlpZiAoIXVzYl9lbmRwb2ludF9pc19pbnRfaW4oZGVzYykKIAkJCQl8fCAobGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpCiAJCQkJCTwgc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbikpCiAJCQkJfHwgIWRlc2MtPmJJbnRlcnZhbCkgewpAQCAtNDk4LDcgKzQ5Nyw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNkY19pbml0KHZvaWQpCiB7Ci0JQlVHX09OKChzaXplb2YoKChzdHJ1Y3QgdXNibmV0ICopMCktPmRhdGEpCisJQlVJTERfQlVHX09OKChzaXplb2YoKChzdHJ1Y3QgdXNibmV0ICopMCktPmRhdGEpCiAJCQk8IHNpemVvZihzdHJ1Y3QgY2RjX3N0YXRlKSkpOwogCiAgCXJldHVybiB1c2JfcmVnaXN0ZXIoJmNkY19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jIGIvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCmluZGV4IDk1N2Q0YWQuLmZhNzgzMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYworKysgYi9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKQEAgLTY1LDE2ICs2NSw2IEBACiAKICN1bmRlZiBERUJVRwogCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUga2F3ZXRoX2RiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjogIiBmb3JtYXQgIlxuIiAsIyNhcmcpCi0jZWxzZQotI2RlZmluZSBrYXdldGhfZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotI2RlZmluZSBrYXdldGhfZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogIiBmb3JtYXQgIlxuIiAsIyNhcmcpCi0jZGVmaW5lIGthd2V0aF9pbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPIF9fRklMRV9fICI6ICIgZm9ybWF0ICJcbiIgLCAjI2FyZykKLSNkZWZpbmUga2F3ZXRoX3dhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgX19GSUxFX18gIjogIiBmb3JtYXQgIlxuIiAsICMjYXJnKQotCi0KICNpbmNsdWRlICJrYXdldGhmdy5oIgogCiAjZGVmaW5lIEtBV0VUSF9NVFUJCQkxNTE0CkBAIC04Niw2ICs3Niw5IEBACiAKICNkZWZpbmUgS0FXRVRIX1NUQVRVU19CUk9LRU4JCTB4MDAwMDAwMQogI2RlZmluZSBLQVdFVEhfU1RBVFVTX0NMT1NJTkcJCTB4MDAwMDAwMgorI2RlZmluZSBLQVdFVEhfU1RBVFVTX1NVU1BFTkRJTkcJMHgwMDAwMDA0CisKKyNkZWZpbmUgS0FXRVRIX1NUQVRVU19CTE9DS0VEIChLQVdFVEhfU1RBVFVTX0NMT1NJTkcgfCBLQVdFVEhfU1RBVFVTX1NVU1BFTkRJTkcpCiAKICNkZWZpbmUgS0FXRVRIX1BBQ0tFVF9GSUxURVJfUFJPTUlTQ1VPVVMJMHgwMQogI2RlZmluZSBLQVdFVEhfUEFDS0VUX0ZJTFRFUl9BTExfTVVMVElDQVNUCTB4MDIKQEAgLTExMiw2ICsxMDUsOCBAQAogI2RlZmluZSBTVEFURV9NQVNLCQkJCTB4NDAKICNkZWZpbmUJU1RBVEVfU0hJRlQJCQkJNQogCisjZGVmaW5lIElTX0JMT0NLRUQocykgKHMgJiBLQVdFVEhfU1RBVFVTX0JMT0NLRUQpCisKIAogTU9EVUxFX0FVVEhPUigiTWljaGFlbCBaYXBwZSA8emFwbWFuQGludGVybGFuLm5ldD4sIFN0ZXBoYW5lIEFsbmV0IDxzdGVwaGFuZUB1LXBpY2FyZGllLmZyPiwgQnJhZCBIYXJkcyA8YmhhcmRzQGJpZ3BvbmQubmV0LmF1PiBhbmQgT2xpdmVyIE5ldWt1bSA8b2xpdmVyQG5ldWt1bS5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIktMNVVTQjEwMSBVU0IgRXRoZXJuZXQgZHJpdmVyIik7CkBAIC0xMjgsNiArMTIzLDggQEAKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IHBpcGUsCiAJCQkJICAgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNtZCwgdm9pZCAqZGF0YSwKIAkJCQkgICAgICAgaW50IGxlbiwgaW50IHRpbWVvdXQpOworc3RhdGljIGludCBrYXdldGhfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOworc3RhdGljIGludCBrYXdldGhfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICB1c2JfZGV2aWNlX2lkCkBAIC0xNzksNiArMTc2LDggQEAKIAkubmFtZSA9CQlkcml2ZXJfbmFtZSwKIAkucHJvYmUgPQlrYXdldGhfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPQlrYXdldGhfZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9CWthd2V0aF9zdXNwZW5kLAorCS5yZXN1bWUgPQlrYXdldGhfcmVzdW1lLAogCS5pZF90YWJsZSA9ICAgICB1c2Jfa2xzaV90YWJsZSwKIH07CiAKQEAgLTIyMiw3ICsyMjEsOCBAQAogCWludCBzdXNwZW5kX2xvd21lbV9yeDsKIAlpbnQgc3VzcGVuZF9sb3dtZW1fY3RybDsKIAlpbnQgbGlua3N0YXRlOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBsb3dtZW1fd29yazsKKwlpbnQgb3BlbmVkOworCXN0cnVjdCBkZWxheWVkX3dvcmsgbG93bWVtX3dvcms7CiAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CkBAIC0yNjUsMTcgKzI2NSwxNyBAQAogewogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwogCi0Ja2F3ZXRoX2RiZygia2F3ZXRoX2NvbnRyb2woKSIpOworCWRiZygia2F3ZXRoX2NvbnRyb2woKSIpOwogCiAJaWYoaW5faW50ZXJydXB0KCkpIHsKLQkJa2F3ZXRoX2RiZygiaW5faW50ZXJydXB0KCkiKTsKKwkJZGJnKCJpbl9pbnRlcnJ1cHQoKSIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksIEdGUF9BVE9NSUMpOwogCiAJaWYgKCFkcikgewotCQlrYXdldGhfZGJnKCJrbWFsbG9jKCkgZmFpbGVkIik7CisJCWRiZygia21hbGxvYygpIGZhaWxlZCIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTMwMCw3ICszMDAsNyBAQAogewogCWludCByZXR2YWw7CiAKLQlrYXdldGhfZGJnKCJSZWFkaW5nIGthd2V0aCBjb25maWd1cmF0aW9uIik7CisJZGJnKCJSZWFkaW5nIGthd2V0aCBjb25maWd1cmF0aW9uIik7CiAKIAlyZXR2YWwgPSBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkJdXNiX3JjdmN0cmxwaXBlKGthd2V0aC0+ZGV2LCAwKSwKQEAgLTMyMiw3ICszMjIsNyBAQAogewogCWludCByZXR2YWw7CiAKLQlrYXdldGhfZGJnKCJTZXR0aW5nIFVSQiBzaXplIHRvICVkIiwgKHVuc2lnbmVkKXVyYl9zaXplKTsKKwlkYmcoIlNldHRpbmcgVVJCIHNpemUgdG8gJWQiLCAodW5zaWduZWQpdXJiX3NpemUpOwogCiAJcmV0dmFsID0ga2F3ZXRoX2NvbnRyb2woa2F3ZXRoLAogCQkJCXVzYl9zbmRjdHJscGlwZShrYXdldGgtPmRldiwgMCksCkBAIC0zNDQsNyArMzQ0LDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0Ja2F3ZXRoX2RiZygiU2V0IFNPRlMgd2FpdCB0byAlZCIsICh1bnNpZ25lZClzb2ZzX3dhaXQpOworCWRiZygiU2V0IFNPRlMgd2FpdCB0byAlZCIsICh1bnNpZ25lZClzb2ZzX3dhaXQpOwogCiAJcmV0dmFsID0ga2F3ZXRoX2NvbnRyb2woa2F3ZXRoLAogCQkJCXVzYl9zbmRjdHJscGlwZShrYXdldGgtPmRldiwgMCksCkBAIC0zNjcsNyArMzY3LDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0Ja2F3ZXRoX2RiZygiU2V0IHJlY2VpdmUgZmlsdGVyIHRvICVkIiwgKHVuc2lnbmVkKXJlY2VpdmVfZmlsdGVyKTsKKwlkYmcoIlNldCByZWNlaXZlIGZpbHRlciB0byAlZCIsICh1bnNpZ25lZClyZWNlaXZlX2ZpbHRlcik7CiAKIAlyZXR2YWwgPSBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkJdXNiX3NuZGN0cmxwaXBlKGthd2V0aC0+ZGV2LCAwKSwKQEAgLTM5Miw3ICszOTIsNyBAQAogCQkJCSAgICBfX3U4IHR5cGUpCiB7CiAJaWYoZGF0YV9sZW4gPiBLQVdFVEhfRklSTVdBUkVfQlVGX1NJWkUpCXsKLQkJa2F3ZXRoX2VycigiRmlybXdhcmUgdG9vIGJpZzogJWQiLCBkYXRhX2xlbik7CisJCWVycigiRmlybXdhcmUgdG9vIGJpZzogJWQiLCBkYXRhX2xlbik7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KIApAQCAtNDAzLDEzICs0MDMsMTMgQEAKIAlrYXdldGgtPmZpcm13YXJlX2J1Zls0XSA9IHR5cGU7CiAJa2F3ZXRoLT5maXJtd2FyZV9idWZbNV0gPSBpbnRlcnJ1cHQ7CiAKLQlrYXdldGhfZGJnKCJIaWdoOiAlaSwgTG93OiVpIiwga2F3ZXRoLT5maXJtd2FyZV9idWZbM10sCisJZGJnKCJIaWdoOiAlaSwgTG93OiVpIiwga2F3ZXRoLT5maXJtd2FyZV9idWZbM10sCiAJCSAgIGthd2V0aC0+ZmlybXdhcmVfYnVmWzJdKTsKIAotCWthd2V0aF9kYmcoIkRvd25sb2FkaW5nIGZpcm13YXJlIGF0ICVwIHRvIGthd2V0aCBkZXZpY2UgYXQgJXAiLAorCWRiZygiRG93bmxvYWRpbmcgZmlybXdhcmUgYXQgJXAgdG8ga2F3ZXRoIGRldmljZSBhdCAlcCIsCiAJICAgIGRhdGEsCiAJICAgIGthd2V0aCk7Ci0Ja2F3ZXRoX2RiZygiRmlybXdhcmUgbGVuZ3RoOiAlZCIsIGRhdGFfbGVuKTsKKwlkYmcoIkZpcm13YXJlIGxlbmd0aDogJWQiLCBkYXRhX2xlbik7CiAKIAlyZXR1cm4ga2F3ZXRoX2NvbnRyb2woa2F3ZXRoLAogCQkgICAgICAgICAgICAgIHVzYl9zbmRjdHJscGlwZShrYXdldGgtPmRldiwgMCksCkBAIC00MzcsNyArNDM3LDcgQEAKIAlrYXdldGgtPmZpcm13YXJlX2J1Zls2XSA9IDB4MDA7CiAJa2F3ZXRoLT5maXJtd2FyZV9idWZbN10gPSAweDAwOwogCi0Ja2F3ZXRoX2RiZygiVHJpZ2dlcmluZyBmaXJtd2FyZSIpOworCWRiZygiVHJpZ2dlcmluZyBmaXJtd2FyZSIpOwogCiAJcmV0dXJuIGthd2V0aF9jb250cm9sKGthd2V0aCwKIAkJCSAgICAgIHVzYl9zbmRjdHJscGlwZShrYXdldGgtPmRldiwgMCksCkBAIC00NTcsNyArNDU3LDcgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0Ja2F3ZXRoX2RiZygia2F3ZXRoX3Jlc2V0KCVwKSIsIGthd2V0aCk7CisJZGJnKCJrYXdldGhfcmVzZXQoJXApIiwga2F3ZXRoKTsKIAlyZXN1bHQgPSBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkJdXNiX3NuZGN0cmxwaXBlKGthd2V0aC0+ZGV2LCAwKSwKIAkJCQlVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OLApAQCAtNDcwLDcgKzQ3MCw3IEBACiAKIAltZGVsYXkoMTApOwogCi0Ja2F3ZXRoX2RiZygia2F3ZXRoX3Jlc2V0KCkgcmV0dXJucyAlZC4iLHJlc3VsdCk7CisJZGJnKCJrYXdldGhfcmVzZXQoKSByZXR1cm5zICVkLiIscmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC01MzAsMTEgKzUzMCwxMiBAQAogCWthd2V0aF9yZXN1Ym1pdF9pbnRfdXJiKGthd2V0aCwgR0ZQX0FUT01JQyk7CiB9CiAKLXN0YXRpYyB2b2lkIGthd2V0aF9yZXN1Ym1pdF90bCh2b2lkICpkKQorc3RhdGljIHZvaWQga2F3ZXRoX3Jlc3VibWl0X3RsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gKHN0cnVjdCBrYXdldGhfZGV2aWNlICopZDsKKwlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBrYXdldGhfZGV2aWNlLCBsb3dtZW1fd29yay53b3JrKTsKIAotCWlmIChrYXdldGgtPnN0YXR1cyB8IEtBV0VUSF9TVEFUVVNfQ0xPU0lORykKKwlpZiAoSVNfQkxPQ0tFRChrYXdldGgtPnN0YXR1cykpCiAJCXJldHVybjsKIAogCWlmIChrYXdldGgtPnN1c3BlbmRfbG93bWVtX3J4KQpAQCAtNTY4LDcgKzU2OSw3IEBACiAJCQlrYXdldGgtPnN1c3BlbmRfbG93bWVtX3J4ID0gMTsKIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygma2F3ZXRoLT5sb3dtZW1fd29yaywgSFovNCk7CiAJCX0KLQkJa2F3ZXRoX2VycigicmVzdWJtaXR0aW5nIHJ4X3VyYiAlZCBmYWlsZWQiLCByZXN1bHQpOworCQllcnIoInJlc3VibWl0dGluZyByeF91cmIgJWQgZmFpbGVkIiwgcmVzdWx0KTsKIAl9IGVsc2UgewogCQlrYXdldGgtPnN1c3BlbmRfbG93bWVtX3J4ID0gMDsKIAl9CkBAIC02MDEsMTEgKzYwMiwxNSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGthd2V0aC0+c3RhdHVzICYgS0FXRVRIX1NUQVRVU19DTE9TSU5HKQorCXNwaW5fbG9jaygma2F3ZXRoLT5kZXZpY2VfbG9jayk7CisJaWYgKElTX0JMT0NLRUQoa2F3ZXRoLT5zdGF0dXMpKSB7CisJCXNwaW5fdW5sb2NrKCZrYXdldGgtPmRldmljZV9sb2NrKTsKIAkJcmV0dXJuOworCX0KKwlzcGluX3VubG9jaygma2F3ZXRoLT5kZXZpY2VfbG9jayk7CiAKIAlpZih1cmItPnN0YXR1cyAmJiB1cmItPnN0YXR1cyAhPSAtRVJFTU9URUlPICYmIGNvdW50ICE9IDEpIHsKLQkJa2F3ZXRoX2VycigiJXMgUlggc3RhdHVzOiAlZCBjb3VudDogJWQgcGFja2V0X2xlbjogJWQiLAorCQllcnIoIiVzIFJYIHN0YXR1czogJWQgY291bnQ6ICVkIHBhY2tldF9sZW46ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC0+bmFtZSwKIAkJCSAgIHVyYi0+c3RhdHVzLAogCQkJICAgY291bnQsCkBAIC02MTYsOSArNjIxLDkgQEAKIAogCWlmKGthd2V0aC0+bmV0ICYmIChjb3VudCA+IDIpKSB7CiAJCWlmKHBrdF9sZW4gPiAoY291bnQgLSAyKSkgewotCQkJa2F3ZXRoX2VycigiUGFja2V0IGxlbmd0aCB0b28gbG9uZyBmb3IgVVNCIGZyYW1lIChwa3RfbGVuOiAleCwgY291bnQ6ICV4KSIscGt0X2xlbiwgY291bnQpOwotCQkJa2F3ZXRoX2VycigiUGFja2V0IGxlbiAmIDIwNDc6ICV4IiwgcGt0X2xlbiAmIDIwNDcpOwotCQkJa2F3ZXRoX2VycigiQ291bnQgMjogJXgiLCBjb3VudDIpOworCQkJZXJyKCJQYWNrZXQgbGVuZ3RoIHRvbyBsb25nIGZvciBVU0IgZnJhbWUgKHBrdF9sZW46ICV4LCBjb3VudDogJXgpIixwa3RfbGVuLCBjb3VudCk7CisJCQllcnIoIlBhY2tldCBsZW4gJiAyMDQ3OiAleCIsIHBrdF9sZW4gJiAyMDQ3KTsKKwkJCWVycigiQ291bnQgMjogJXgiLCBjb3VudDIpOwogCQkgICAgICAgIGthd2V0aF9yZXN1Ym1pdF9yeF91cmIoa2F3ZXRoLCBHRlBfQVRPTUlDKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC02NTUsNyArNjYwLDcgQEAKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gbmV0ZGV2X3ByaXYobmV0KTsKIAlpbnQgcmVzOwogCi0Ja2F3ZXRoX2RiZygiT3BlbmluZyBuZXR3b3JrIGRldmljZS4iKTsKKwlkYmcoIk9wZW5pbmcgbmV0d29yayBkZXZpY2UuIik7CiAKIAlyZXMgPSBrYXdldGhfcmVzdWJtaXRfcnhfdXJiKGthd2V0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlcykKQEAgLTY3OCw2ICs2ODMsNyBAQAogCQl1c2Jfa2lsbF91cmIoa2F3ZXRoLT5yeF91cmIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CisJa2F3ZXRoLT5vcGVuZWQgPSAxOwogCiAJbmV0aWZfc3RhcnRfcXVldWUobmV0KTsKIApAQCAtNjg4LDE0ICs2OTQsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICBrYXdldGhfY2xvc2UKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBrYXdldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3N0YXRpYyB2b2lkIGthd2V0aF9raWxsX3VyYnMoc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCkKIHsKLQlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gbmV0ZGV2X3ByaXYobmV0KTsKLQotCW5ldGlmX3N0b3BfcXVldWUobmV0KTsKLQotCWthd2V0aC0+c3RhdHVzIHw9IEtBV0VUSF9TVEFUVVNfQ0xPU0lORzsKLQogCXVzYl9raWxsX3VyYihrYXdldGgtPmlycV91cmIpOwogCXVzYl9raWxsX3VyYihrYXdldGgtPnJ4X3VyYik7CiAJdXNiX2tpbGxfdXJiKGthd2V0aC0+dHhfdXJiKTsKQEAgLTcwNiw2ICs3MDYsMjEgQEAKIAkgICB3ZSBoaXQgdGhlbSBhZ2FpbiAqLwogCXVzYl9raWxsX3VyYihrYXdldGgtPmlycV91cmIpOwogCXVzYl9raWxsX3VyYihrYXdldGgtPnJ4X3VyYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAga2F3ZXRoX2Nsb3NlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQga2F3ZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IG5ldGRldl9wcml2KG5ldCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldCk7CisJa2F3ZXRoLT5vcGVuZWQgPSAwOworCisJa2F3ZXRoLT5zdGF0dXMgfD0gS0FXRVRIX1NUQVRVU19DTE9TSU5HOworCisJa2F3ZXRoX2tpbGxfdXJicyhrYXdldGgpOwogCiAJa2F3ZXRoLT5zdGF0dXMgJj0gfktBV0VUSF9TVEFUVVNfQ0xPU0lORzsKIApAQCAtNzMyLDcgKzc0Nyw3IEBACiAKIAlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMgIT0gMCkpCiAJCWlmICh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKQotCQkJa2F3ZXRoX2RiZygiJXM6IFRYIHN0YXR1cyAlZC4iLCBrYXdldGgtPm5ldC0+bmFtZSwgdXJiLT5zdGF0dXMpOworCQkJZGJnKCIlczogVFggc3RhdHVzICVkLiIsIGthd2V0aC0+bmV0LT5uYW1lLCB1cmItPnN0YXR1cyk7CiAKIAluZXRpZl93YWtlX3F1ZXVlKGthd2V0aC0+bmV0KTsKIAlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwpAQCAtNzUyLDYgKzc2Nyw5IEBACiAKIAlrYXdldGhfYXN5bmNfc2V0X3J4X21vZGUoa2F3ZXRoKTsKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldCk7CisJaWYgKElTX0JMT0NLRUQoa2F3ZXRoLT5zdGF0dXMpKSB7CisJCWdvdG8gc2tpcDsKKwl9CiAKIAkvKiBXZSBub3cgZGVjaWRlIHdoZXRoZXIgd2UgY2FuIHB1dCBvdXIgc3BlY2lhbCBoZWFkZXIgaW50byB0aGUgc2tfYnVmZiAqLwogCWlmIChza2JfY2xvbmVkKHNrYikgfHwgc2tiX2hlYWRyb29tKHNrYikgPCAyKSB7CkBAIC03ODMsNyArODAxLDggQEAKIAogCWlmKChyZXMgPSB1c2Jfc3VibWl0X3VyYihrYXdldGgtPnR4X3VyYiwgR0ZQX0FUT01JQykpKQogCXsKLQkJa2F3ZXRoX3dhcm4oImthd2V0aCBmYWlsZWQgdHhfdXJiICVkIiwgcmVzKTsKKwkJd2Fybigia2F3ZXRoIGZhaWxlZCB0eF91cmIgJWQiLCByZXMpOworc2tpcDoKIAkJa2F3ZXRoLT5zdGF0cy50eF9lcnJvcnMrKzsKIAogCQluZXRpZl9zdGFydF9xdWV1ZShuZXQpOwpAQCAtODEyLDcgKzgzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0FXRVRIX1BBQ0tFVF9GSUxURVJfQlJPQURDQVNUIHwKIAkJICAgICAgICAgICAgICAgICAgICAgS0FXRVRIX1BBQ0tFVF9GSUxURVJfTVVMVElDQVNUOwogCi0Ja2F3ZXRoX2RiZygiU2V0dGluZyBSeCBtb2RlIHRvICVkIiwgcGFja2V0X2ZpbHRlcl9iaXRtYXApOworCWRiZygiU2V0dGluZyBSeCBtb2RlIHRvICVkIiwgcGFja2V0X2ZpbHRlcl9iaXRtYXApOwogCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwogCkBAIC04NTAsMTAgKzg2OSwxMCBAQAogCQkJCUtBV0VUSF9DT05UUk9MX1RJTUVPVVQpOwogCiAJaWYocmVzdWx0IDwgMCkgewotCQlrYXdldGhfZXJyKCJGYWlsZWQgdG8gc2V0IFJ4IG1vZGU6ICVkIiwgcmVzdWx0KTsKKwkJZXJyKCJGYWlsZWQgdG8gc2V0IFJ4IG1vZGU6ICVkIiwgcmVzdWx0KTsKIAl9CiAJZWxzZSB7Ci0JCWthd2V0aF9kYmcoIlNldCBSeCBtb2RlIHRvICVkIiwgcGFja2V0X2ZpbHRlcl9iaXRtYXApOworCQlkYmcoIlNldCBSeCBtb2RlIHRvICVkIiwgcGFja2V0X2ZpbHRlcl9iaXRtYXApOwogCX0KIAl9CiB9CkBAIC04NzQsNyArODkzLDcgQEAKIHsKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gbmV0ZGV2X3ByaXYobmV0KTsKIAotCWthd2V0aF93YXJuKCIlczogVHggdGltZWQgb3V0LiBSZXNldHRpbmcuIiwgbmV0LT5uYW1lKTsKKwl3YXJuKCIlczogVHggdGltZWQgb3V0LiBSZXNldHRpbmcuIiwgbmV0LT5uYW1lKTsKIAlrYXdldGgtPnN0YXRzLnR4X2Vycm9ycysrOwogCW5ldC0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCkBAIC04ODIsNiArOTAxLDQyIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAga2F3ZXRoX3N1c3BlbmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBrYXdldGhfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CisJa2F3ZXRoLT5zdGF0dXMgfD0gS0FXRVRIX1NUQVRVU19TVVNQRU5ESU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmthd2V0aC0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCWthd2V0aF9raWxsX3VyYnMoa2F3ZXRoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBrYXdldGhfcmVzdW1lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQga2F3ZXRoX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmthd2V0aC0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlrYXdldGgtPnN0YXR1cyAmPSB+S0FXRVRIX1NUQVRVU19TVVNQRU5ESU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmthd2V0aC0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCWlmICgha2F3ZXRoLT5vcGVuZWQpCisJCXJldHVybiAwOworCWthd2V0aF9yZXN1Ym1pdF9yeF91cmIoa2F3ZXRoLCBHRlBfTk9JTyk7CisJa2F3ZXRoX3Jlc3VibWl0X2ludF91cmIoa2F3ZXRoLCBHRlBfTk9JTyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICBrYXdldGhfcHJvYmUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBrYXdldGhfcHJvYmUoCkBAIC04OTUsMTUgKzk1MCwxNSBAQAogCWNvbnN0IGV0aF9hZGRyX3QgYmNhc3RfYWRkciA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OwogCWludCByZXN1bHQgPSAwOwogCi0Ja2F3ZXRoX2RiZygiS2F3YXNha2kgRGV2aWNlIFByb2JlIChEZXZpY2UgbnVtYmVyOiVkKTogMHglNC40eDoweCU0LjR4OjB4JTQuNHgiLAorCWRiZygiS2F3YXNha2kgRGV2aWNlIFByb2JlIChEZXZpY2UgbnVtYmVyOiVkKTogMHglNC40eDoweCU0LjR4OjB4JTQuNHgiLAogCQkgZGV2LT5kZXZudW0sCiAJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAogCQkgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCiAJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSk7CiAKLQlrYXdldGhfZGJnKCJEZXZpY2UgYXQgJXAiLCBkZXYpOworCWRiZygiRGV2aWNlIGF0ICVwIiwgZGV2KTsKIAotCWthd2V0aF9kYmcoIkRlc2NyaXB0b3IgbGVuZ3RoOiAleCB0eXBlOiAleCIsCisJZGJnKCJEZXNjcmlwdG9yIGxlbmd0aDogJXggdHlwZTogJXgiLAogCQkgKGludClkZXYtPmRlc2NyaXB0b3IuYkxlbmd0aCwKIAkJIChpbnQpZGV2LT5kZXNjcmlwdG9yLmJEZXNjcmlwdG9yVHlwZSk7CiAKQEAgLTkxOCw3ICs5NzMsNyBAQAogCXNwaW5fbG9ja19pbml0KCZrYXdldGgtPmRldmljZV9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZrYXdldGgtPnRlcm1fd2FpdCk7CiAKLQlrYXdldGhfZGJnKCJSZXNldHRpbmcuIik7CisJZGJnKCJSZXNldHRpbmcuIik7CiAKIAlrYXdldGhfcmVzZXQoa2F3ZXRoKTsKIApAQCAtOTI4LDE3ICs5ODMsMTcgQEAKIAkgKi8KIAogCWlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSA+PiA4KSB7Ci0JCWthd2V0aF9pbmZvKCJGaXJtd2FyZSBwcmVzZW50IGluIGRldmljZS4iKTsKKwkJaW5mbygiRmlybXdhcmUgcHJlc2VudCBpbiBkZXZpY2UuIik7CiAJfSBlbHNlIHsKIAkJLyogRG93bmxvYWQgdGhlIGZpcm13YXJlICovCi0JCWthd2V0aF9pbmZvKCJEb3dubG9hZGluZyBmaXJtd2FyZS4uLiIpOworCQlpbmZvKCJEb3dubG9hZGluZyBmaXJtd2FyZS4uLiIpOwogCQlrYXdldGgtPmZpcm13YXJlX2J1ZiA9IChfX3U4ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQlpZiAoKHJlc3VsdCA9IGthd2V0aF9kb3dubG9hZF9maXJtd2FyZShrYXdldGgsCiAJCQkJCQkgICAgICBrYXdldGhfbmV3X2NvZGUsCiAJCQkJCQkgICAgICBsZW5fa2F3ZXRoX25ld19jb2RlLAogCQkJCQkJICAgICAgMTAwLAogCQkJCQkJICAgICAgMikpIDwgMCkgewotCQkJa2F3ZXRoX2VycigiRXJyb3IgZG93bmxvYWRpbmcgZmlybXdhcmUgKCVkKSIsIHJlc3VsdCk7CisJCQllcnIoIkVycm9yIGRvd25sb2FkaW5nIGZpcm13YXJlICglZCkiLCByZXN1bHQpOwogCQkJZ290byBlcnJfZnc7CiAJCX0KIApAQCAtOTQ3LDcgKzEwMDIsNyBAQAogCQkJCQkJICAgICAgbGVuX2thd2V0aF9uZXdfY29kZV9maXgsCiAJCQkJCQkgICAgICAxMDAsCiAJCQkJCQkgICAgICAzKSkgPCAwKSB7Ci0JCQlrYXdldGhfZXJyKCJFcnJvciBkb3dubG9hZGluZyBmaXJtd2FyZSBmaXggKCVkKSIsIHJlc3VsdCk7CisJCQllcnIoIkVycm9yIGRvd25sb2FkaW5nIGZpcm13YXJlIGZpeCAoJWQpIiwgcmVzdWx0KTsKIAkJCWdvdG8gZXJyX2Z3OwogCQl9CiAKQEAgLTk1Niw3ICsxMDExLDcgQEAKIAkJCQkJCSAgICAgIGxlbl9rYXdldGhfdHJpZ2dlcl9jb2RlLAogCQkJCQkJICAgICAgMTI2LAogCQkJCQkJICAgICAgMikpIDwgMCkgewotCQkJa2F3ZXRoX2VycigiRXJyb3IgZG93bmxvYWRpbmcgdHJpZ2dlciBjb2RlICglZCkiLCByZXN1bHQpOworCQkJZXJyKCJFcnJvciBkb3dubG9hZGluZyB0cmlnZ2VyIGNvZGUgKCVkKSIsIHJlc3VsdCk7CiAJCQlnb3RvIGVycl9mdzsKIAogCQl9CkBAIC05NjYsMTggKzEwMjEsMTggQEAKIAkJCQkJCSAgICAgIGxlbl9rYXdldGhfdHJpZ2dlcl9jb2RlX2ZpeCwKIAkJCQkJCSAgICAgIDEyNiwKIAkJCQkJCSAgICAgIDMpKSA8IDApIHsKLQkJCWthd2V0aF9lcnIoIkVycm9yIGRvd25sb2FkaW5nIHRyaWdnZXIgY29kZSBmaXggKCVkKSIsIHJlc3VsdCk7CisJCQllcnIoIkVycm9yIGRvd25sb2FkaW5nIHRyaWdnZXIgY29kZSBmaXggKCVkKSIsIHJlc3VsdCk7CiAJCQlnb3RvIGVycl9mdzsKIAkJfQogCiAKIAkJaWYgKChyZXN1bHQgPSBrYXdldGhfdHJpZ2dlcl9maXJtd2FyZShrYXdldGgsIDEyNikpIDwgMCkgewotCQkJa2F3ZXRoX2VycigiRXJyb3IgdHJpZ2dlcmluZyBmaXJtd2FyZSAoJWQpIiwgcmVzdWx0KTsKKwkJCWVycigiRXJyb3IgdHJpZ2dlcmluZyBmaXJtd2FyZSAoJWQpIiwgcmVzdWx0KTsKIAkJCWdvdG8gZXJyX2Z3OwogCQl9CiAKIAkJLyogRGV2aWNlIHdpbGwgbm93IGRpc2FwcGVhciBmb3IgYSBtb21lbnQuLi4gICovCi0JCWthd2V0aF9pbmZvKCJGaXJtd2FyZSBsb2FkZWQuICBJJ2xsIGJlIGJhY2suLi4iKTsKKwkJaW5mbygiRmlybXdhcmUgbG9hZGVkLiAgSSdsbCBiZSBiYWNrLi4uIik7CiBlcnJfZnc6CiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYXdldGgtPmZpcm13YXJlX2J1Zik7CiAJCWZyZWVfbmV0ZGV2KG5ldGRldik7CkBAIC05ODcsMTQgKzEwNDIsMTQgQEAKIAlyZXN1bHQgPSBrYXdldGhfcmVhZF9jb25maWd1cmF0aW9uKGthd2V0aCk7CiAKIAlpZihyZXN1bHQgPCAwKSB7Ci0JCWthd2V0aF9lcnIoIkVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbiAoJWQpLCBubyBuZXQgZGV2aWNlIGNyZWF0ZWQiLCByZXN1bHQpOworCQllcnIoIkVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbiAoJWQpLCBubyBuZXQgZGV2aWNlIGNyZWF0ZWQiLCByZXN1bHQpOwogCQlnb3RvIGVycl9mcmVlX25ldGRldjsKIAl9CiAKLQlrYXdldGhfaW5mbygiU3RhdGlzdGljcyBjb2xsZWN0aW9uOiAleCIsIGthd2V0aC0+Y29uZmlndXJhdGlvbi5zdGF0aXN0aWNzX21hc2spOwotCWthd2V0aF9pbmZvKCJNdWx0aWNhc3QgZmlsdGVyIGxpbWl0OiAleCIsIGthd2V0aC0+Y29uZmlndXJhdGlvbi5tYXhfbXVsdGljYXN0X2ZpbHRlcnMgJiAoKDEgPDwgMTUpIC0gMSkpOwotCWthd2V0aF9pbmZvKCJNVFU6ICVkIiwgbGUxNl90b19jcHUoa2F3ZXRoLT5jb25maWd1cmF0aW9uLnNlZ21lbnRfc2l6ZSkpOwotCWthd2V0aF9pbmZvKCJSZWFkIE1BQyBhZGRyZXNzICUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4IiwKKwlpbmZvKCJTdGF0aXN0aWNzIGNvbGxlY3Rpb246ICV4Iiwga2F3ZXRoLT5jb25maWd1cmF0aW9uLnN0YXRpc3RpY3NfbWFzayk7CisJaW5mbygiTXVsdGljYXN0IGZpbHRlciBsaW1pdDogJXgiLCBrYXdldGgtPmNvbmZpZ3VyYXRpb24ubWF4X211bHRpY2FzdF9maWx0ZXJzICYgKCgxIDw8IDE1KSAtIDEpKTsKKwlpbmZvKCJNVFU6ICVkIiwgbGUxNl90b19jcHUoa2F3ZXRoLT5jb25maWd1cmF0aW9uLnNlZ21lbnRfc2l6ZSkpOworCWluZm8oIlJlYWQgTUFDIGFkZHJlc3MgJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMngiLAogCQkgKGludClrYXdldGgtPmNvbmZpZ3VyYXRpb24uaHdfYWRkclswXSwKIAkJIChpbnQpa2F3ZXRoLT5jb25maWd1cmF0aW9uLmh3X2FkZHJbMV0sCiAJCSAoaW50KWthd2V0aC0+Y29uZmlndXJhdGlvbi5od19hZGRyWzJdLApAQCAtMTAwNSwxNyArMTA2MCwxNyBAQAogCWlmKCFtZW1jbXAoJmthd2V0aC0+Y29uZmlndXJhdGlvbi5od19hZGRyLAogICAgICAgICAgICAgICAgICAgICZiY2FzdF9hZGRyLAogCQkgICBzaXplb2YoYmNhc3RfYWRkcikpKSB7Ci0JCWthd2V0aF9lcnIoIkZpcm13YXJlIG5vdCBmdW5jdGlvbmluZyBwcm9wZXJseSwgbm8gbmV0IGRldmljZSBjcmVhdGVkIik7CisJCWVycigiRmlybXdhcmUgbm90IGZ1bmN0aW9uaW5nIHByb3Blcmx5LCBubyBuZXQgZGV2aWNlIGNyZWF0ZWQiKTsKIAkJZ290byBlcnJfZnJlZV9uZXRkZXY7CiAJfQogCiAJaWYoa2F3ZXRoX3NldF91cmJfc2l6ZShrYXdldGgsIEtBV0VUSF9CVUZfU0laRSkgPCAwKSB7Ci0JCWthd2V0aF9kYmcoIkVycm9yIHNldHRpbmcgVVJCIHNpemUiKTsKKwkJZGJnKCJFcnJvciBzZXR0aW5nIFVSQiBzaXplIik7CiAJCWdvdG8gZXJyX2ZyZWVfbmV0ZGV2OwogCX0KIAogCWlmKGthd2V0aF9zZXRfc29mc193YWl0KGthd2V0aCwgS0FXRVRIX1NPRlNfVE9fV0FJVCkgPCAwKSB7Ci0JCWthd2V0aF9lcnIoIkVycm9yIHNldHRpbmcgU09GUyB3YWl0Iik7CisJCWVycigiRXJyb3Igc2V0dGluZyBTT0ZTIHdhaXQiKTsKIAkJZ290byBlcnJfZnJlZV9uZXRkZXY7CiAJfQogCkBAIC0xMDI1LDExICsxMDgwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0FXRVRIX1BBQ0tFVF9GSUxURVJfTVVMVElDQVNUKTsKIAogCWlmKHJlc3VsdCA8IDApIHsKLQkJa2F3ZXRoX2VycigiRXJyb3Igc2V0dGluZyByZWNlaXZlIGZpbHRlciIpOworCQllcnIoIkVycm9yIHNldHRpbmcgcmVjZWl2ZSBmaWx0ZXIiKTsKIAkJZ290byBlcnJfZnJlZV9uZXRkZXY7CiAJfQogCi0Ja2F3ZXRoX2RiZygiSW5pdGlhbGl6aW5nIG5ldCBkZXZpY2UuIik7CisJZGJnKCJJbml0aWFsaXppbmcgbmV0IGRldmljZS4iKTsKIAogCWthd2V0aC0+dHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWthd2V0aC0+dHhfdXJiKQpAQCAtMTA3Miw3ICsxMTI3LDcgQEAKIAogCS8qIGthd2V0aCBpcyB6ZXJvZWQgYXMgcGFydCBvZiBhbGxvY19uZXRkZXYgKi8KIAotCUlOSVRfV09SSygma2F3ZXRoLT5sb3dtZW1fd29yaywga2F3ZXRoX3Jlc3VibWl0X3RsLCAodm9pZCAqKWthd2V0aCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmthd2V0aC0+bG93bWVtX3dvcmssIGthd2V0aF9yZXN1Ym1pdF90bCk7CiAKIAlTRVRfTU9EVUxFX09XTkVSKG5ldGRldik7CiAKQEAgLTEwODYsMTMgKzExNDEsMTMgQEAKIAogCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJmludGYtPmRldik7CiAJaWYgKHJlZ2lzdGVyX25ldGRldihuZXRkZXYpICE9IDApIHsKLQkJa2F3ZXRoX2VycigiRXJyb3IgcmVnaXN0ZXJpbmcgbmV0ZGV2LiIpOworCQllcnIoIkVycm9yIHJlZ2lzdGVyaW5nIG5ldGRldi4iKTsKIAkJZ290byBlcnJfaW50ZmRhdGE7CiAJfQogCi0Ja2F3ZXRoX2luZm8oImthd2V0aCBpbnRlcmZhY2UgY3JlYXRlZCBhdCAlcyIsIGthd2V0aC0+bmV0LT5uYW1lKTsKKwlpbmZvKCJrYXdldGggaW50ZXJmYWNlIGNyZWF0ZWQgYXQgJXMiLCBrYXdldGgtPm5ldC0+bmFtZSk7CiAKLQlrYXdldGhfZGJnKCJLYXdldGggcHJvYmUgcmV0dXJuaW5nLiIpOworCWRiZygiS2F3ZXRoIHByb2JlIHJldHVybmluZy4iKTsKIAogCXJldHVybiAwOwogCkBAIC0xMTIxLDE2ICsxMTc2LDE2IEBACiAJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAotCWthd2V0aF9pbmZvKCJVbnJlZ2lzdGVyaW5nIik7CisJaW5mbygiVW5yZWdpc3RlcmluZyIpOwogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlpZiAoIWthd2V0aCkgewotCQlrYXdldGhfd2FybigidW5yZWdpc3RlcmluZyBub24tZXhpc3RhbnQgZGV2aWNlIik7CisJCXdhcm4oInVucmVnaXN0ZXJpbmcgbm9uLWV4aXN0YW50IGRldmljZSIpOwogCQlyZXR1cm47CiAJfQogCW5ldGRldiA9IGthd2V0aC0+bmV0OwogCi0Ja2F3ZXRoX2RiZygiVW5yZWdpc3RlcmluZyBuZXQgZGV2aWNlIik7CisJZGJnKCJVbnJlZ2lzdGVyaW5nIG5ldCBkZXZpY2UiKTsKIAl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCiAJdXNiX2ZyZWVfdXJiKGthd2V0aC0+cnhfdXJiKTsKQEAgLTExODUsNyArMTI0MCw3IEBACiAKIAlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChhd2Qud3FoLCBhd2QuZG9uZSwgdGltZW91dCkpIHsKICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0Ci0gICAgICAgICAgICAgICAga2F3ZXRoX3dhcm4oInVzYl9jb250cm9sL2J1bGtfbXNnOiB0aW1lb3V0Iik7CisgICAgICAgICAgICAgICAgd2FybigidXNiX2NvbnRyb2wvYnVsa19tc2c6IHRpbWVvdXQiKTsKICAgICAgICAgICAgICAgICB1c2Jfa2lsbF91cmIodXJiKTsgIC8vIHJlbW92ZSB1cmIgc2FmZWx5CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVUSU1FRE9VVDsKICAgICAgICAgfQpAQCAtMTIzNCw3ICsxMjg5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBfX2luaXQga2F3ZXRoX2luaXQodm9pZCkKIHsKLQlrYXdldGhfZGJnKCJEcml2ZXIgbG9hZGluZyIpOworCWRiZygiRHJpdmVyIGxvYWRpbmciKTsKIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZrYXdldGhfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L21jczc4MzAuYyBiL2RyaXZlcnMvdXNiL25ldC9tY3M3ODMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0MGI5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL25ldC9tY3M3ODMwLmMKQEAgLTAsMCArMSw1MzQgQEAKKy8qCisgKiBNb3NDaGlwcyBNQ1M3ODMwIGJhc2VkIFVTQiAyLjAgRXRoZXJuZXQgRGV2aWNlcworICoKKyAqIGJhc2VkIG9uIHVzYm5ldC5jLCBhc2l4LmMgYW5kIHRoZSB2ZW5kb3IgcHJvdmlkZWQgbWNzNzgzMCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXJuZCBCZXJnbWFubiA8YXJuZEBhcm5kYi5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IERhdmlkIEhvbGxpcyA8ZGhvbGxpc0BkYXZlaG9sbGlzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBQaGlsIENoYW5nIDxwY2hhbmcyM0BzYmNnbG9iYWwubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgVGlWbyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgInVzYm5ldC5oIgorCisvKiByZXF1ZXN0cyAqLworI2RlZmluZSBNQ1M3ODMwX1JEX0JNUkVRCShVU0JfRElSX0lOICB8IFVTQl9UWVBFX1ZFTkRPUiB8IFwKKwkJCQkgVVNCX1JFQ0lQX0RFVklDRSkKKyNkZWZpbmUgTUNTNzgzMF9XUl9CTVJFUQkoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBcCisJCQkJIFVTQl9SRUNJUF9ERVZJQ0UpCisjZGVmaW5lIE1DUzc4MzBfUkRfQlJFUQkJMHgwRQorI2RlZmluZSBNQ1M3ODMwX1dSX0JSRVEJCTB4MEQKKworI2RlZmluZSBNQ1M3ODMwX0NUUkxfVElNRU9VVAkxMDAwCisjZGVmaW5lIE1DUzc4MzBfTUFYX01DQVNUCTY0CisKKyNkZWZpbmUgTUNTNzgzMF9WRU5ET1JfSUQJMHg5NzEwCisjZGVmaW5lIE1DUzc4MzBfUFJPRFVDVF9JRAkweDc4MzAKKworI2RlZmluZSBNQ1M3ODMwX01JSV9BRFZFUlRJU0UJKEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfMTAwRlVMTCB8IFwKKwkJCQkgQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwgXAorCQkJCSBBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFX0NTTUEpCisKKy8qIEhJRl9SRUdfWFggY29yZXNzcG9uZGluZyBpbmRleCB2YWx1ZSAqLworZW51bSB7CisJSElGX1JFR19NVUxUSUNBU1RfSEFTSAkJCT0gMHgwMCwKKwlISUZfUkVHX1BBQ0tFVF9HQVAxCQkJPSAweDA4LAorCUhJRl9SRUdfUEFDS0VUX0dBUDIJCQk9IDB4MDksCisJSElGX1JFR19QSFlfREFUQQkJCT0gMHgwYSwKKwlISUZfUkVHX1BIWV9DTUQxCQkJPSAweDBjLAorCSAgIEhJRl9SRUdfUEhZX0NNRDFfUkVBRAkJPSAweDQwLAorCSAgIEhJRl9SRUdfUEhZX0NNRDFfV1JJVEUJCT0gMHgyMCwKKwkgICBISUZfUkVHX1BIWV9DTUQxX1BIWUFERFIJCT0gMHgwMSwKKwlISUZfUkVHX1BIWV9DTUQyCQkJPSAweDBkLAorCSAgIEhJRl9SRUdfUEhZX0NNRDJfUEVORF9GTEFHX0JJVAk9IDB4ODAsCisJICAgSElGX1JFR19QSFlfQ01EMl9SRUFEWV9GTEFHX0JJVAk9IDB4NDAsCisJSElGX1JFR19DT05GSUcJCQkJPSAweDBlLAorCSAgIEhJRl9SRUdfQ09ORklHX0NGRwkJCT0gMHg4MCwKKwkgICBISUZfUkVHX0NPTkZJR19TUEVFRDEwMAkJPSAweDQwLAorCSAgIEhJRl9SRUdfQ09ORklHX0ZVTExEVVBMRVhfRU5BQkxFCT0gMHgyMCwKKwkgICBISUZfUkVHX0NPTkZJR19SWEVOQUJMRQkJPSAweDEwLAorCSAgIEhJRl9SRUdfQ09ORklHX1RYRU5BQkxFCQk9IDB4MDgsCisJICAgSElGX1JFR19DT05GSUdfU0xFRVBNT0RFCQk9IDB4MDQsCisJICAgSElGX1JFR19DT05GSUdfQUxMTVVMVElDQVNUCQk9IDB4MDIsCisJICAgSElGX1JFR19DT05GSUdfUFJPTUlTQ0lPVVMJCT0gMHgwMSwKKwlISUZfUkVHX0VUSEVSTkVUX0FERFIJCQk9IDB4MGYsCisJSElGX1JFR18yMgkJCQk9IDB4MTUsCisJSElGX1JFR19QQVVTRV9USFJFU0hPTEQJCQk9IDB4MTYsCisJICAgSElGX1JFR19QQVVTRV9USFJFU0hPTERfREVGQVVMVAk9IDAsCit9OworCitzdHJ1Y3QgbWNzNzgzMF9kYXRhIHsKKwl1OCBtdWx0aV9maWx0ZXJbOF07CisJdTggY29uZmlnOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJNT1NDSElQIHVzYi1ldGhlcm5ldCBkcml2ZXIiOworCitzdGF0aWMgaW50IG1jczc4MzBfZ2V0X3JlZyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBpbmRleCwgdTE2IHNpemUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnhkZXYgPSBkZXYtPnVkZXY7CisJaW50IHJldDsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyh4ZGV2LCB1c2JfcmN2Y3RybHBpcGUoeGRldiwgMCksIE1DUzc4MzBfUkRfQlJFUSwKKwkJCSAgICAgIE1DUzc4MzBfUkRfQk1SRVEsIDB4MDAwMCwgaW5kZXgsIGRhdGEsCisJCQkgICAgICBzaXplLCBtc2Vjc190b19qaWZmaWVzKE1DUzc4MzBfQ1RSTF9USU1FT1VUKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtY3M3ODMwX3NldF9yZWcoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgaW5kZXgsIHUxNiBzaXplLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp4ZGV2ID0gZGV2LT51ZGV2OworCWludCByZXQ7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coeGRldiwgdXNiX3NuZGN0cmxwaXBlKHhkZXYsIDApLCBNQ1M3ODMwX1dSX0JSRVEsCisJCQkgICAgICBNQ1M3ODMwX1dSX0JNUkVRLCAweDAwMDAsIGluZGV4LCBkYXRhLAorCQkJICAgICAgc2l6ZSwgbXNlY3NfdG9famlmZmllcyhNQ1M3ODMwX0NUUkxfVElNRU9VVCkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1jczc4MzBfYXN5bmNfY21kX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKXVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0RFQlVHICJtY3M3ODMwX2FzeW5jX2NtZF9jYWxsYmFjaygpIGZhaWxlZCB3aXRoICVkIiwKKwkJCXVyYi0+c3RhdHVzKTsKKworCWtmcmVlKHJlcSk7CisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKK3N0YXRpYyB2b2lkIG1jczc4MzBfc2V0X3JlZ19hc3luYyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBpbmRleCwgdTE2IHNpemUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqcmVxOworCWludCByZXQ7CisJc3RydWN0IHVyYiAqdXJiOworCisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXVyYikgeworCQlkZXZfZGJnKCZkZXYtPnVkZXYtPmRldiwgIkVycm9yIGFsbG9jYXRpbmcgVVJCICIKKwkJCQkiaW4gd3JpdGVfY21kX2FzeW5jISIpOworCQlyZXR1cm47CisJfQorCisJcmVxID0ga21hbGxvYyhzaXplb2YgKnJlcSwgR0ZQX0FUT01JQyk7CisJaWYgKCFyZXEpIHsKKwkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkJImNvbnRyb2wgcmVxdWVzdCIpOworCQlnb3RvIG91dDsKKwl9CisJcmVxLT5iUmVxdWVzdFR5cGUgPSBNQ1M3ODMwX1dSX0JNUkVROworCXJlcS0+YlJlcXVlc3QgPSBNQ1M3ODMwX1dSX0JSRVE7CisJcmVxLT53VmFsdWUgPSAwOworCXJlcS0+d0luZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOworCXJlcS0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOworCisJdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCBkZXYtPnVkZXYsCisJCQkgICAgIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAorCQkJICAgICAodm9pZCAqKXJlcSwgZGF0YSwgc2l6ZSwKKwkJCSAgICAgbWNzNzgzMF9hc3luY19jbWRfY2FsbGJhY2ssIHJlcSk7CisKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LCAiRXJyb3Igc3VibWl0dGluZyB0aGUgY29udHJvbCAiCisJCQkJIm1lc3NhZ2U6IHJldD0lZCIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlyZXR1cm47CitvdXQ6CisJa2ZyZWUocmVxKTsKKwl1c2JfZnJlZV91cmIodXJiKTsKK30KKworc3RhdGljIGludCBtY3M3ODMwX2dldF9hZGRyZXNzKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IG1jczc4MzBfZ2V0X3JlZyhkZXYsIEhJRl9SRUdfRVRIRVJORVRfQUREUiwgRVRIX0FMRU4sCisJCQkJICAgZGV2LT5uZXQtPmRldl9hZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY3M3ODMwX3JlYWRfcGh5KHN0cnVjdCB1c2JuZXQgKmRldiwgdTggaW5kZXgpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKwlfX2xlMTYgdmFsOworCisJdTggY21kWzJdID0geworCQlISUZfUkVHX1BIWV9DTUQxX1JFQUQgfCBISUZfUkVHX1BIWV9DTUQxX1BIWUFERFIsCisJCUhJRl9SRUdfUEhZX0NNRDJfUEVORF9GTEFHX0JJVCB8IGluZGV4LAorCX07CisKKwltdXRleF9sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisJLyogd3JpdGUgdGhlIE1JSSBjb21tYW5kICovCisJcmV0ID0gbWNzNzgzMF9zZXRfcmVnKGRldiwgSElGX1JFR19QSFlfQ01EMSwgMiwgY21kKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiB3YWl0IGZvciB0aGUgZGF0YSB0byBiZWNvbWUgdmFsaWQsIHNob3VsZCBiZSB3aXRoaW4gPCAxbXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlyZXQgPSBtY3M3ODMwX2dldF9yZWcoZGV2LCBISUZfUkVHX1BIWV9DTUQxLCAyLCBjbWQpOworCQlpZiAoKHJldCA8IDApIHx8IChjbWRbMV0gJiBISUZfUkVHX1BIWV9DTUQyX1JFQURZX0ZMQUdfQklUKSkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlPOworCQltc2xlZXAoMSk7CisJfQorCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHJlYWQgYWN0dWFsIHJlZ2lzdGVyIGNvbnRlbnRzICovCisJcmV0ID0gbWNzNzgzMF9nZXRfcmVnKGRldiwgSElGX1JFR19QSFlfREFUQSwgMiwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IGxlMTZfdG9fY3B1KHZhbCk7CisJZGV2X2RiZygmZGV2LT51ZGV2LT5kZXYsICJyZWFkIFBIWSByZWcgJTAyeDogJTA0eCAoJWQgdHJpZXMpXG4iLAorCQlpbmRleCwgdmFsLCBpKTsKK291dDoKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jczc4MzBfd3JpdGVfcGh5KHN0cnVjdCB1c2JuZXQgKmRldiwgdTggaW5kZXgsIHUxNiB2YWwpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKwlfX2xlMTYgbGVfdmFsOworCisJdTggY21kWzJdID0geworCQlISUZfUkVHX1BIWV9DTUQxX1dSSVRFIHwgSElGX1JFR19QSFlfQ01EMV9QSFlBRERSLAorCQlISUZfUkVHX1BIWV9DTUQyX1BFTkRfRkxBR19CSVQgfCAoaW5kZXggJiAweDFGKSwKKwl9OworCisJbXV0ZXhfbG9jaygmZGV2LT5waHlfbXV0ZXgpOworCisJLyogd3JpdGUgdGhlIG5ldyByZWdpc3RlciBjb250ZW50cyAqLworCWxlX3ZhbCA9IGNwdV90b19sZTE2KHZhbCk7CisJcmV0ID0gbWNzNzgzMF9zZXRfcmVnKGRldiwgSElGX1JFR19QSFlfREFUQSwgMiwgJmxlX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyogd3JpdGUgdGhlIE1JSSBjb21tYW5kICovCisJcmV0ID0gbWNzNzgzMF9zZXRfcmVnKGRldiwgSElGX1JFR19QSFlfQ01EMSwgMiwgY21kKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBiZSBhY2NlcHRlZCBieSB0aGUgUEhZICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJcmV0ID0gbWNzNzgzMF9nZXRfcmVnKGRldiwgSElGX1JFR19QSFlfQ01EMSwgMiwgY21kKTsKKwkJaWYgKChyZXQgPCAwKSB8fCAoY21kWzFdICYgSElGX1JFR19QSFlfQ01EMl9SRUFEWV9GTEFHX0JJVCkpCisJCQlicmVhazsKKwkJcmV0ID0gLUVJTzsKKwkJbXNsZWVwKDEpOworCX0KKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAwOworCWRldl9kYmcoJmRldi0+dWRldi0+ZGV2LCAid3JpdGUgUEhZIHJlZyAlMDJ4OiAlMDR4ICglZCB0cmllcylcbiIsCisJCWluZGV4LCB2YWwsIGkpOworb3V0OgorCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGFsZ29yaXRobSBjb21lcyBmcm9tIHRoZSBvcmlnaW5hbCBtY3M3ODMwIHZlcnNpb24gMS40IGRyaXZlciwKKyAqIG5vdCBzdXJlIGlmIGl0IGlzIG5lZWRlZC4KKyAqLworc3RhdGljIGludCBtY3M3ODMwX3NldF9hdXRvbmVnKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IHB0clVzZXJQaHlNb2RlKQoreworCWludCByZXQ7CisJLyogRW5hYmxlIGFsbCBtZWRpYSB0eXBlcyAqLworCXJldCA9IG1jczc4MzBfd3JpdGVfcGh5KGRldiwgTUlJX0FEVkVSVElTRSwgTUNTNzgzMF9NSUlfQURWRVJUSVNFKTsKKworCS8qIEZpcnN0IHJlc2V0IEJNQ1IgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gbWNzNzgzMF93cml0ZV9waHkoZGV2LCBNSUlfQk1DUiwgMHgwMDAwKTsKKwkvKiBFbmFibGUgQXV0byBOZWcgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gbWNzNzgzMF93cml0ZV9waHkoZGV2LCBNSUlfQk1DUiwgQk1DUl9BTkVOQUJMRSk7CisJLyogUmVzdGFydCBBdXRvIE5lZyAoS2VlcCB0aGUgRW5hYmxlIEF1dG8gTmVnIEJpdCBTZXQpICovCisJaWYgKCFyZXQpCisJCXJldCA9IG1jczc4MzBfd3JpdGVfcGh5KGRldiwgTUlJX0JNQ1IsCisJCQkJQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUCSk7CisJcmV0dXJuIHJldCA8IDAgPyA6IDA7Cit9CisKKworLyoKKyAqIGlmIHdlIGNhbiByZWFkIHJlZ2lzdGVyIDIyLCB0aGUgY2hpcCByZXZpc2lvbiBpcyBDIG9yIGhpZ2hlcgorICovCitzdGF0aWMgaW50IG1jczc4MzBfZ2V0X3JldihzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJdTggZHVtbXlbMl07CisJaW50IHJldDsKKwlyZXQgPSBtY3M3ODMwX2dldF9yZWcoZGV2LCBISUZfUkVHXzIyLCAyLCBkdW1teSk7CisJaWYgKHJldCA+IDApCisJCXJldHVybiAyOyAvKiBSZXYgQyBvciBsYXRlciAqLworCXJldHVybiAxOyAvKiBlYXJsaWVyIHJldmlzaW9uICovCit9CisKKy8qCisgKiBPbiByZXYuIEMgd2UgbmVlZCB0byBzZXQgdGhlIHBhdXNlIHRocmVzaG9sZAorICovCitzdGF0aWMgdm9pZCBtY3M3ODMwX3Jldl9DX2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwl1OCBwYXVzZV90aHJlc2hvbGQgPSBISUZfUkVHX1BBVVNFX1RIUkVTSE9MRF9ERUZBVUxUOworCWludCByZXRyeTsKKworCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDI7IHJldHJ5KyspIHsKKwkJaWYgKG1jczc4MzBfZ2V0X3JldihkZXYpID09IDIpIHsKKwkJCWRldl9pbmZvKCZkZXYtPnVkZXYtPmRldiwgImFwcGx5aW5nIHJldi5DIGZpeHVwXG4iKTsKKwkJCW1jczc4MzBfc2V0X3JlZyhkZXYsIEhJRl9SRUdfUEFVU0VfVEhSRVNIT0xELAorCQkJCQkxLCAmcGF1c2VfdGhyZXNob2xkKTsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorfQorCitzdGF0aWMgaW50IG1jczc4MzBfaW5pdF9kZXYoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWludCByZXQ7CisJaW50IHJldHJ5OworCisJLyogUmVhZCBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCXJldCA9IC1FSU5WQUw7CisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgNSAmJiByZXQ7IHJldHJ5KyspCisJCXJldCA9IG1jczc4MzBfZ2V0X2FkZHJlc3MoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl93YXJuKCZkZXYtPnVkZXYtPmRldiwgIkNhbm5vdCByZWFkIE1BQyBhZGRyZXNzXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2V0IHVwIFBIWSAqLworCXJldCA9IG1jczc4MzBfc2V0X2F1dG9uZWcoZGV2LCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9pbmZvKCZkZXYtPnVkZXYtPmRldiwgIkNhbm5vdCBzZXQgYXV0b25lZ1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCW1jczc4MzBfcmV2X0NfZml4dXAoZGV2KTsKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNzNzgzMF9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwKKwkJCSAgICAgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldi0+cHJpdjsKKwlyZXR1cm4gbWNzNzgzMF9yZWFkX3BoeShkZXYsIGxvY2F0aW9uKTsKK30KKworc3RhdGljIHZvaWQgbWNzNzgzMF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsCisJCQkJaW50IGxvY2F0aW9uLCBpbnQgdmFsKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldi0+cHJpdjsKKwltY3M3ODMwX3dyaXRlX3BoeShkZXYsIGxvY2F0aW9uLCB2YWwpOworfQorCitzdGF0aWMgaW50IG1jczc4MzBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXJldHVybiBnZW5lcmljX21paV9pb2N0bCgmZGV2LT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7Cit9CisKKy8qIGNyZWRpdHMgZ28gdG8gYXNpeF9zZXRfbXVsdGljYXN0ICovCitzdGF0aWMgdm9pZCBtY3M3ODMwX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBtY3M3ODMwX2RhdGEgKmRhdGEgPSAoc3RydWN0IG1jczc4MzBfZGF0YSAqKSZkZXYtPmRhdGE7CisKKwlkYXRhLT5jb25maWcgPSBISUZfUkVHX0NPTkZJR19UWEVOQUJMRTsKKworCS8qIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgb3RoZXJ3aXNlICovCisJZGF0YS0+Y29uZmlnIHw9IEhJRl9SRUdfQ09ORklHX0FMTE1VTFRJQ0FTVDsKKworCWlmIChuZXQtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJZGF0YS0+Y29uZmlnIHw9IEhJRl9SRUdfQ09ORklHX1BST01JU0NJT1VTOworCX0gZWxzZSBpZiAobmV0LT5mbGFncyAmIElGRl9BTExNVUxUSQorCQkgICB8fCBuZXQtPm1jX2NvdW50ID4gTUNTNzgzMF9NQVhfTUNBU1QpIHsKKwkJZGF0YS0+Y29uZmlnIHw9IEhJRl9SRUdfQ09ORklHX0FMTE1VTFRJQ0FTVDsKKwl9IGVsc2UgaWYgKG5ldC0+bWNfY291bnQgPT0gMCkgeworCQkvKiBqdXN0IGJyb2FkY2FzdCBhbmQgZGlyZWN0ZWQgKi8KKwl9IGVsc2UgeworCQkvKiBXZSB1c2UgdGhlIDIwIGJ5dGUgZGV2LT5kYXRhCisJCSAqIGZvciBvdXIgOCBieXRlIGZpbHRlciBidWZmZXIKKwkJICogdG8gYXZvaWQgYWxsb2NhdGluZyBtZW1vcnkgdGhhdAorCQkgKiBpcyB0cmlja3kgdG8gZnJlZSBsYXRlciAqLworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX2xpc3QgPSBuZXQtPm1jX2xpc3Q7CisJCXUzMiBjcmNfYml0czsKKwkJaW50IGk7CisKKwkJbWVtc2V0KGRhdGEtPm11bHRpX2ZpbHRlciwgMCwgc2l6ZW9mIGRhdGEtPm11bHRpX2ZpbHRlcik7CisKKwkJLyogQnVpbGQgdGhlIG11bHRpY2FzdCBoYXNoIGZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IG5ldC0+bWNfY291bnQ7IGkrKykgeworCQkJY3JjX2JpdHMgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jX2xpc3QtPmRtaV9hZGRyKSA+PiAyNjsKKwkJCWRhdGEtPm11bHRpX2ZpbHRlcltjcmNfYml0cyA+PiAzXSB8PSAxIDw8IChjcmNfYml0cyAmIDcpOworCQkJbWNfbGlzdCA9IG1jX2xpc3QtPm5leHQ7CisJCX0KKworCQltY3M3ODMwX3NldF9yZWdfYXN5bmMoZGV2LCBISUZfUkVHX01VTFRJQ0FTVF9IQVNILAorCQkJCXNpemVvZiBkYXRhLT5tdWx0aV9maWx0ZXIsCisJCQkJZGF0YS0+bXVsdGlfZmlsdGVyKTsKKwl9CisKKwltY3M3ODMwX3NldF9yZWdfYXN5bmMoZGV2LCBISUZfUkVHX0NPTkZJRywgMSwgJmRhdGEtPmNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgbWNzNzgzMF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJc3dpdGNoIChtY3M3ODMwX2dldF9yZXYoZGV2KSkgeworCWNhc2UgMToKKwkJcmV0dXJuIDIxOworCWNhc2UgMjoKKwkJcmV0dXJuIDMyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWNzNzgzMF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQoreworCXVzYm5ldF9nZXRfZHJ2aW5mbyhuZXQsIGRydmluZm8pOworCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gbWNzNzgzMF9nZXRfcmVnc19sZW4obmV0KTsKK30KKworc3RhdGljIHZvaWQgbWNzNzgzMF9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisKKwlyZWdzLT52ZXJzaW9uID0gbWNzNzgzMF9nZXRfcmV2KGRldik7CisJbWNzNzgzMF9nZXRfcmVnKGRldiwgMCwgcmVncy0+bGVuLCBkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBtY3M3ODMwX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBtY3M3ODMwX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4JCT0gbWNzNzgzMF9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzCQk9IG1jczc4MzBfZ2V0X3JlZ3MsCisKKwkvKiBjb21tb24gdXNibmV0IGNhbGxzICovCisJLmdldF9saW5rCQk9IHVzYm5ldF9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCQk9IHVzYm5ldF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAorCS5nZXRfc2V0dGluZ3MJCT0gdXNibmV0X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHVzYm5ldF9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gdXNibmV0X253YXlfcmVzZXQsCit9OworCitzdGF0aWMgaW50IG1jczc4MzBfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1ZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBkZXYtPm5ldDsKKwlpbnQgcmV0OworCisJcmV0ID0gbWNzNzgzMF9pbml0X2RldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJbmV0LT5kb19pb2N0bCA9IG1jczc4MzBfaW9jdGw7CisJbmV0LT5ldGh0b29sX29wcyA9ICZtY3M3ODMwX2V0aHRvb2xfb3BzOworCW5ldC0+c2V0X211bHRpY2FzdF9saXN0ID0gbWNzNzgzMF9zZXRfbXVsdGljYXN0OworCW1jczc4MzBfc2V0X211bHRpY2FzdChuZXQpOworCisJLyogcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHN0YXR1cyBieXRlIG9uIHJ4ICovCisJZGV2LT5yeF91cmJfc2l6ZSA9IEVUSF9GUkFNRV9MRU4gKyAxOworCisJZGV2LT5taWkubWRpb19yZWFkID0gbWNzNzgzMF9tZGlvX3JlYWQ7CisJZGV2LT5taWkubWRpb193cml0ZSA9IG1jczc4MzBfbWRpb193cml0ZTsKKwlkZXYtPm1paS5kZXYgPSBuZXQ7CisJZGV2LT5taWkucGh5X2lkX21hc2sgPSAweDNmOworCWRldi0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CisJZGV2LT5taWkucGh5X2lkID0gKigodTggKikgbmV0LT5kZXZfYWRkciArIDEpOworCisJcmV0ID0gdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LCB1ZGV2KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBUaGUgY2hpcCBhbHdheXMgYXBwZW5kcyBhIHN0YXR1cyBieXRlcyB0aGF0IHdlIG5lZWQgdG8gc3RyaXAgKi8KK3N0YXRpYyBpbnQgbWNzNzgzMF9yeF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggc3RhdHVzOworCisJaWYgKHNrYi0+bGVuID09IDApIHsKKwkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsICJ1bmV4cGVjdGVkIGVtcHR5IHJ4IGZyYW1lXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDEpOworCXN0YXR1cyA9IHNrYi0+ZGF0YVtza2ItPmxlbl07CisKKwlpZiAoc3RhdHVzICE9IDB4MjApCisJCWRldl9kYmcoJmRldi0+dWRldi0+ZGV2LCAicnggZml4dXAgc3RhdHVzICV4XG4iLCBzdGF0dXMpOworCisJcmV0dXJuIHNrYi0+bGVuID4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcml2ZXJfaW5mbyBtb3NjaGlwX2luZm8gPSB7CisJLmRlc2NyaXB0aW9uCT0gIk1PU0NISVAgNzgzMCB1c2ItTkVUIGFkYXB0ZXIiLAorCS5iaW5kCQk9IG1jczc4MzBfYmluZCwKKwkucnhfZml4dXAJPSBtY3M3ODMwX3J4X2ZpeHVwLAorCS5mbGFncwkJPSBGTEFHX0VUSEVSLAorCS5pbgkJPSAxLAorCS5vdXQJCT0gMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwcm9kdWN0c1tdID0geworCXsKKwkJVVNCX0RFVklDRShNQ1M3ODMwX1ZFTkRPUl9JRCwgTUNTNzgzMF9QUk9EVUNUX0lEKSwKKwkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZtb3NjaGlwX2luZm8sCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcHJvZHVjdHMpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgbWNzNzgzMF9kcml2ZXIgPSB7CisJLm5hbWUgPSBkcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUgPSBwcm9kdWN0cywKKwkucHJvYmUgPSB1c2JuZXRfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSB1c2JuZXRfZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9IHVzYm5ldF9zdXNwZW5kLAorCS5yZXN1bWUgPSB1c2JuZXRfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWNzNzgzMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3RlcigmbWNzNzgzMF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQobWNzNzgzMF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1jczc4MzBfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZtY3M3ODMwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtY3M3ODMwX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlVTQiB0byBuZXR3b3JrIGFkYXB0ZXIgTUNTNzgzMCkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMgYi9kcml2ZXJzL3VzYi9uZXQvbmV0MTA4MC5jCmluZGV4IGNlMDBkZTguLjQ5MzYzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L25ldDEwODAuYwpAQCAtMjM3LDEyICsyMzcsMTIgQEAKICNkZWZpbmUJU1RBVFVTX0NPTk5fT1RIRVIJKDEgPDwgMTQpCiAjZGVmaW5lCVNUQVRVU19TVVNQRU5EX09USEVSCSgxIDw8IDEzKQogI2RlZmluZQlTVEFUVVNfTUFJTEJPWF9PVEhFUgkoMSA8PCAxMikKLSNkZWZpbmUJU1RBVFVTX1BBQ0tFVFNfT1RIRVIobikJKCgobikgPj4gOCkgJiYgMHgwMykKKyNkZWZpbmUJU1RBVFVTX1BBQ0tFVFNfT1RIRVIobikJKCgobikgPj4gOCkgJiAweDAzKQogCiAjZGVmaW5lCVNUQVRVU19DT05OX1RISVMJKDEgPDwgNikKICNkZWZpbmUJU1RBVFVTX1NVU1BFTkRfVEhJUwkoMSA8PCA1KQogI2RlZmluZQlTVEFUVVNfTUFJTEJPWF9USElTCSgxIDw8IDQpCi0jZGVmaW5lCVNUQVRVU19QQUNLRVRTX1RISVMobikJKCgobikgPj4gMCkgJiYgMHgwMykKKyNkZWZpbmUJU1RBVFVTX1BBQ0tFVFNfVEhJUyhuKQkoKChuKSA+PiAwKSAmIDB4MDMpCiAKICNkZWZpbmUJU1RBVFVTX1VOU1BFQ19NQVNLCTB4MGM4YwogI2RlZmluZQlTVEFUVVNfTk9JU0VfTUFTSyAJKCh1MTYpfigweDAzMDN8U1RBVFVTX1VOU1BFQ19NQVNLKSkKQEAgLTM4Myw3ICszODMsNyBAQAogCQlpbnQJCQlzdGF0dXM7CiAKIAkJLyogU2VuZCBhIGZsdXNoICovCi0JCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgU0xBQl9BVE9NSUMpOworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVyYikKIAkJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYyBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKaW5kZXggMzNhYmJkMi4uZDQ4YzAyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCkBAIC0xNjMsNiArMTYzLDcgQEAKIAogCS8qIHVzaW5nIEFUT01JQywgd2UnZCBuZXZlciB3YWtlIHVwIGlmIHdlIHNsZXB0ICovCiAJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihwZWdhc3VzLT5jdHJsX3VyYiwgR0ZQX0FUT01JQykpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCWlmIChyZXQgPT0gLUVOT0RFVikKIAkJCW5ldGlmX2RldmljZV9kZXRhY2gocGVnYXN1cy0+bmV0KTsKIAkJaWYgKG5ldGlmX21zZ19kcnYocGVnYXN1cykpCkBAIC04NTUsNyArODU2LDcgQEAKIAkJcGVnYXN1cy0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoKGRbM10gJiAweDdmKSA8PCA4KSB8IGRbNF07CiAJfQogCi0Jc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBTTEFCX0FUT01JQyk7CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzID09IC1FTk9ERVYpCiAJCW5ldGlmX2RldmljZV9kZXRhY2gocGVnYXN1cy0+bmV0KTsKIAlpZiAoc3RhdHVzICYmIG5ldGlmX21zZ190aW1lcihwZWdhc3VzKSkKQEAgLTEyODAsOSArMTI4MSw5IEBACiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBlZ2FzdXNfd29ya3F1ZXVlID0gTlVMTDsKICNkZWZpbmUgQ0FSUklFUl9DSEVDS19ERUxBWSAoMiAqIEhaKQogCi1zdGF0aWMgdm9pZCBjaGVja19jYXJyaWVyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBjaGVja19jYXJyaWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlwZWdhc3VzX3QgKnBlZ2FzdXMgPSBkYXRhOworCXBlZ2FzdXNfdCAqcGVnYXN1cyA9IGNvbnRhaW5lcl9vZih3b3JrLCBwZWdhc3VzX3QsIGNhcnJpZXJfY2hlY2sud29yayk7CiAJc2V0X2NhcnJpZXIocGVnYXN1cy0+bmV0KTsKIAlpZiAoIShwZWdhc3VzLT5mbGFncyAmIFBFR0FTVVNfVU5QTFVHKSkgewogCQlxdWV1ZV9kZWxheWVkX3dvcmsocGVnYXN1c193b3JrcXVldWUsICZwZWdhc3VzLT5jYXJyaWVyX2NoZWNrLApAQCAtMTMxOCw3ICsxMzE5LDcgQEAKIAogCXRhc2tsZXRfaW5pdCgmcGVnYXN1cy0+cnhfdGwsIHJ4X2ZpeHVwLCAodW5zaWduZWQgbG9uZykgcGVnYXN1cyk7CiAKLQlJTklUX1dPUksoJnBlZ2FzdXMtPmNhcnJpZXJfY2hlY2ssIGNoZWNrX2NhcnJpZXIsIHBlZ2FzdXMpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwZWdhc3VzLT5jYXJyaWVyX2NoZWNrLCBjaGVja19jYXJyaWVyKTsKIAogCXBlZ2FzdXMtPmludGYgPSBpbnRmOwogCXBlZ2FzdXMtPnVzYiA9IGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmggYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5oCmluZGV4IDAwNjQzODAuLjk4ZjY4OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmgKKysrIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuaApAQCAtOTUsNyArOTUsNyBAQAogCWludAkJCWRldl9pbmRleDsKIAlpbnQJCQlpbnRyX2ludGVydmFsOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlyeF90bDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJY2Fycmllcl9jaGVjazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWNhcnJpZXJfY2hlY2s7CiAJc3RydWN0IHVyYgkJKmN0cmxfdXJiLCAqcnhfdXJiLCAqdHhfdXJiLCAqaW50cl91cmI7CiAJc3RydWN0IHNrX2J1ZmYJCSpyeF9wb29sW1JYX1NLQlNdOwogCXN0cnVjdCBza19idWZmCQkqcnhfc2tiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3JuZGlzX2hvc3QuYyBiL2RyaXZlcnMvdXNiL25ldC9ybmRpc19ob3N0LmMKaW5kZXggYzJhMjhkOC4uZWE1ZjQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3JuZGlzX2hvc3QuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvcm5kaXNfaG9zdC5jCkBAIC00NjksNyArNDY5LDcgQEAKIAlzdHJ1Y3Qgcm5kaXNfaGFsdAkqaGFsdDsKIAogCS8qIHRyeSB0byBjbGVhciBhbnkgcm5kaXMgc3RhdGUvYWN0aXZpdHkgKG5vIGkvbyBmcm9tIHN0YWNrISkgKi8KLQloYWx0ID0ga2NhbGxvYygxLCBzaXplb2YgKmhhbHQsIFNMQUJfS0VSTkVMKTsKKwloYWx0ID0ga3phbGxvYyhzaXplb2YgKmhhbHQsIEdGUF9LRVJORUwpOwogCWlmIChoYWx0KSB7CiAJCWhhbHQtPm1zZ190eXBlID0gUk5ESVNfTVNHX0hBTFQ7CiAJCWhhbHQtPm1zZ19sZW4gPSBjY3B1MihzaXplb2YgKmhhbHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYyBiL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMKaW5kZXggNzIxNzFmOS4uYzU0MjM1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvcnRsODE1MC5jCkBAIC01ODcsNyArNTg3LDcgQEAKIAl9CiAKIHJlc3VibWl0OgotCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIFNMQUJfQVRPTUlDKTsKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzID09IC1FTk9ERVYpCiAJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2LT5uZXRkZXYpOwogCWVsc2UgaWYgKHN0YXR1cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYwppbmRleCAyNGJkMzQ4Li42ZTM5ZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJCWUgPSBhbHQtPmVuZHBvaW50ICsgZXA7CiAJCQlzd2l0Y2ggKGUtPmRlc2MuYm1BdHRyaWJ1dGVzKSB7CiAJCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKLQkJCQlpZiAoIShlLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSkKKwkJCQlpZiAoIXVzYl9lbmRwb2ludF9kaXJfaW4oJmUtPmRlc2MpKQogCQkJCQljb250aW51ZTsKIAkJCQlpbnRyID0gMTsKIAkJCQkvKiBGQUxMVEhST1VHSCAqLwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJCQlkZWZhdWx0OgogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pIHsKKwkJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKCZlLT5kZXNjKSkgewogCQkJCWlmICghaW50ciAmJiAhaW4pCiAJCQkJCWluID0gZTsKIAkJCQllbHNlIGlmIChpbnRyICYmICFzdGF0dXMpCkBAIC0xNzksOSArMTc5LDkgQEAKIAlwZXJpb2QgPSBtYXggKChpbnQpIGRldi0+c3RhdHVzLT5kZXNjLmJJbnRlcnZhbCwKIAkJKGRldi0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpID8gNyA6IDMpOwogCi0JYnVmID0ga21hbGxvYyAobWF4cCwgU0xBQl9LRVJORUwpOworCWJ1ZiA9IGttYWxsb2MgKG1heHAsIEdGUF9LRVJORUwpOwogCWlmIChidWYpIHsKLQkJZGV2LT5pbnRlcnJ1cHQgPSB1c2JfYWxsb2NfdXJiICgwLCBTTEFCX0tFUk5FTCk7CisJCWRldi0+aW50ZXJydXB0ID0gdXNiX2FsbG9jX3VyYiAoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGV2LT5pbnRlcnJ1cHQpIHsKIAkJCWtmcmVlIChidWYpOwogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC01NTQsNyArNTU0LDcgQEAKIHsKIAlzdHJ1Y3QgdXNibmV0CQkqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAlpbnQJCQl0ZW1wOwotCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEICh1bmxpbmtfd2FrZXVwKTsgCisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyAodW5saW5rX3dha2V1cCk7CiAJREVDTEFSRV9XQUlUUVVFVUUgKHdhaXQsIGN1cnJlbnQpOwogCiAJbmV0aWZfc3RvcF9xdWV1ZSAobmV0KTsKQEAgLTY2OSw2ICs2NjksNjkgQEAKICAqIHRoZXknbGwgcHJvYmFibHkgd2FudCB0byB1c2UgdGhpcyBiYXNlIHNldC4KICAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19NSUlfTU9EVUxFKQorI2RlZmluZSBIQVZFX01JSQorCitpbnQgdXNibmV0X2dldF9zZXR0aW5ncyAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKworCWlmICghZGV2LT5taWkubWRpb19yZWFkKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gbWlpX2V0aHRvb2xfZ3NldCgmZGV2LT5taWksIGNtZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JuZXRfZ2V0X3NldHRpbmdzKTsKKworaW50IHVzYm5ldF9zZXRfc2V0dGluZ3MgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJaW50IHJldHZhbDsKKworCWlmICghZGV2LT5taWkubWRpb193cml0ZSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dmFsID0gbWlpX2V0aHRvb2xfc3NldCgmZGV2LT5taWksIGNtZCk7CisKKwkvKiBsaW5rIHNwZWVkL2R1cGxleCBtaWdodCBoYXZlIGNoYW5nZWQgKi8KKwlpZiAoZGV2LT5kcml2ZXJfaW5mby0+bGlua19yZXNldCkKKwkJZGV2LT5kcml2ZXJfaW5mby0+bGlua19yZXNldChkZXYpOworCisJcmV0dXJuIHJldHZhbDsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X3NldF9zZXR0aW5ncyk7CisKK3UzMiB1c2JuZXRfZ2V0X2xpbmsgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKworCS8qIElmIGEgY2hlY2tfY29ubmVjdCBpcyBkZWZpbmVkLCByZXR1cm4gaXRzIHJlc3VsdCAqLworCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5jaGVja19jb25uZWN0KQorCQlyZXR1cm4gZGV2LT5kcml2ZXJfaW5mby0+Y2hlY2tfY29ubmVjdCAoZGV2KSA9PSAwOworCisJLyogaWYgdGhlIGRldmljZSBoYXMgbWlpIG9wZXJhdGlvbnMsIHVzZSB0aG9zZSAqLworCWlmIChkZXYtPm1paS5tZGlvX3JlYWQpCisJCXJldHVybiBtaWlfbGlua19vaygmZGV2LT5taWkpOworCisJLyogT3RoZXJ3aXNlLCBzYXkgd2UncmUgdXAgKHRvIGF2b2lkIGJyZWFraW5nIHNjcmlwdHMpICovCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JuZXRfZ2V0X2xpbmspOworCitpbnQgdXNibmV0X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJaWYgKCFkZXYtPm1paS5tZGlvX3dyaXRlKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X253YXlfcmVzZXQpOworCisjZW5kaWYJLyogSEFWRV9NSUkgKi8KKwogdm9pZCB1c2JuZXRfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKQEAgLTY4MiwxOCArNzQ1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYm5ldF9nZXRfZHJ2aW5mbyk7CiAKLXN0YXRpYyB1MzIgdXNibmV0X2dldF9saW5rIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQotewotCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7Ci0KLQkvKiBJZiBhIGNoZWNrX2Nvbm5lY3QgaXMgZGVmaW5lZCwgcmV0dXJuIGl0cyByZXN1bHQgKi8KLQlpZiAoZGV2LT5kcml2ZXJfaW5mby0+Y2hlY2tfY29ubmVjdCkKLQkJcmV0dXJuIGRldi0+ZHJpdmVyX2luZm8tPmNoZWNrX2Nvbm5lY3QgKGRldikgPT0gMDsKLQotCS8qIE90aGVyd2lzZSwgc2F5IHdlJ3JlIHVwICh0byBhdm9pZCBicmVha2luZyBzY3JpcHRzKSAqLwotCXJldHVybiAxOwotfQotCiB1MzIgdXNibmV0X2dldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwpAQCAtNzEyLDggKzc2MywxMyBAQAogCiAvKiBkcml2ZXJzIG1heSBvdmVycmlkZSBkZWZhdWx0IGV0aHRvb2xfb3BzIGluIHRoZWlyIGJpbmQoKSByb3V0aW5lICovCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHVzYm5ldF9ldGh0b29sX29wcyA9IHsKLQkuZ2V0X2RydmluZm8JCT0gdXNibmV0X2dldF9kcnZpbmZvLAorI2lmZGVmCUhBVkVfTUlJCisJLmdldF9zZXR0aW5ncwkJPSB1c2JuZXRfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gdXNibmV0X3NldF9zZXR0aW5ncywKIAkuZ2V0X2xpbmsJCT0gdXNibmV0X2dldF9saW5rLAorCS5ud2F5X3Jlc2V0CQk9IHVzYm5ldF9ud2F5X3Jlc2V0LAorI2VuZGlmCisJLmdldF9kcnZpbmZvCQk9IHVzYm5ldF9nZXRfZHJ2aW5mbywKIAkuZ2V0X21zZ2xldmVsCQk9IHVzYm5ldF9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAkJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAogfTsKQEAgLTcyNiw5ICs3ODIsMTAgQEAKICAqIGVzcGVjaWFsbHkgbm93IHRoYXQgY29udHJvbCB0cmFuc2ZlcnMgY2FuIGJlIHF1ZXVlZC4KICAqLwogc3RhdGljIHZvaWQKLWtldmVudCAodm9pZCAqZGF0YSkKK2tldmVudCAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB1c2JuZXQJCSpkZXYgPSBkYXRhOworCXN0cnVjdCB1c2JuZXQJCSpkZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYm5ldCwga2V2ZW50KTsKIAlpbnQJCQlzdGF0dXM7CiAKIAkvKiB1c2JfY2xlYXJfaGFsdCgpIG5lZWRzIGEgdGhyZWFkIGNvbnRleHQgKi8KQEAgLTEwOTAsMTAgKzExNDcsMTEgQEAKIAlza2JfcXVldWVfaGVhZF9pbml0ICgmZGV2LT5kb25lKTsKIAlkZXYtPmJoLmZ1bmMgPSB1c2JuZXRfYmg7CiAJZGV2LT5iaC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKLQlJTklUX1dPUksgKCZkZXYtPmtldmVudCwga2V2ZW50LCBkZXYpOworCUlOSVRfV09SSyAoJmRldi0+a2V2ZW50LCBrZXZlbnQpOwogCWRldi0+ZGVsYXkuZnVuY3Rpb24gPSB1c2JuZXRfYmg7CiAJZGV2LT5kZWxheS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKIAlpbml0X3RpbWVyICgmZGV2LT5kZWxheSk7CisJbXV0ZXhfaW5pdCAoJmRldi0+cGh5X211dGV4KTsKIAogCVNFVF9NT0RVTEVfT1dORVIgKG5ldCk7CiAJZGV2LT5uZXQgPSBuZXQ7CkBAIC0xMjI1LDcgKzEyODMsNyBAQAogc3RhdGljIGludCBfX2luaXQgdXNibmV0X2luaXQodm9pZCkKIHsKIAkvKiBjb21waWxlciBzaG91bGQgb3B0aW1pemUgdGhpcyBvdXQgKi8KLQlCVUdfT04gKHNpemVvZiAoKChzdHJ1Y3Qgc2tfYnVmZiAqKTApLT5jYikKKwlCVUlMRF9CVUdfT04gKHNpemVvZiAoKChzdHJ1Y3Qgc2tfYnVmZiAqKTApLT5jYikKIAkJCTwgc2l6ZW9mIChzdHJ1Y3Qgc2tiX2RhdGEpKTsKIAogCXJhbmRvbV9ldGhlcl9hZGRyKG5vZGVfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5oIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5oCmluZGV4IGMwNzQ2ZjAuLjA3YzcwYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuaAorKysgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmgKQEAgLTMwLDYgKzMwLDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIAlzdHJ1Y3QgZHJpdmVyX2luZm8JKmRyaXZlcl9pbmZvOwogCXdhaXRfcXVldWVfaGVhZF90CSp3YWl0OworCXN0cnVjdCBtdXRleAkJcGh5X211dGV4OwogCiAJLyogaS9vIGluZm86IHBpcGVzIGV0YyAqLwogCXVuc2lnbmVkCQlpbiwgb3V0OwpAQCAtMTY4LDkgKzE2OSwxMyBAQAogZXh0ZXJuIHZvaWQgdXNibmV0X3NrYl9yZXR1cm4gKHN0cnVjdCB1c2JuZXQgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiBleHRlcm4gdm9pZCB1c2JuZXRfdW5saW5rX3J4X3VyYnMoc3RydWN0IHVzYm5ldCAqKTsKIAorZXh0ZXJuIGludCB1c2JuZXRfZ2V0X3NldHRpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCk7CitleHRlcm4gaW50IHVzYm5ldF9zZXRfc2V0dGluZ3MgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKTsKK2V4dGVybiB1MzIgdXNibmV0X2dldF9saW5rIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KTsKIGV4dGVybiB1MzIgdXNibmV0X2dldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCB1c2JuZXRfc2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIpOwogZXh0ZXJuIHZvaWQgdXNibmV0X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICopOworZXh0ZXJuIGludCB1c2JuZXRfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KTsKIAogLyogbWVzc2FnaW5nIHN1cHBvcnQgaW5jbHVkZXMgdGhlIGludGVyZmFjZSBuYW1lLCBzbyBpdCBtdXN0IG5vdCBiZQogICogdXNlZCBiZWZvcmUgaXQgaGFzIG9uZSAuLi4gbm90YWJseSwgaW4gbWluaWRyaXZlciBiaW5kKCkgY2FsbHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCmluZGV4IDUwNzZiOWQuLjJmNGQzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCkBAIC01NCwxMCArNTQsMTAgQEAKIAkgIHByb3Blcmx5LgogCiBjb25maWcgVVNCX1NFUklBTF9BSVJDQUJMRQotCXRyaXN0YXRlICJBSVJjYWJsZSBVU0IgQmx1ZXRvb3RoIERvbmdsZSBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCisJdHJpc3RhdGUgIlVTQiBBSVJjYWJsZSBCbHVldG9vdGggRG9uZ2xlIERyaXZlciAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIFVTQl9TRVJJQUwgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAotCSAgICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBBSVJjYWJsZSBVU0IgQmx1ZXRvb3QgRG9uZ2xlLgorCSAgICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBVU0IgQUlSY2FibGUgQmx1ZXRvb3RoIERvbmdsZS4KIAogCSAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICAgIHdpbGwgYmUgY2FsbGVkIGFpcmNhYmxlLgpAQCAtNDIyLDYgKzQyMiwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWN0X3UyMzIuCiAKK2NvbmZpZyBVU0JfU0VSSUFMX01PUzc3MjAKKwl0cmlzdGF0ZSAiVVNCIE1vc2NoaXAgNzcyMCBTaW5nbGUgUG9ydCBTZXJpYWwgRHJpdmVyIgorCWRlcGVuZHMgb24gVVNCX1NFUklBTAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgVVNCIFNlcmlhbCBzaW5nbGUgcG9ydCBhZGFwdGVyIGZyb20KKwkgIE1vc2NoaXAgU2VtaWNvbmR1Y3RvciBUZWNoLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtb3M3NzIwLgorCiBjb25maWcgVVNCX1NFUklBTF9NT1M3ODQwCiAJdHJpc3RhdGUgIlVTQiBNb3NjaGlwIDc4NDAvNzgyMCBVU0IgU2VyaWFsIERyaXZlciIKIAlkZXBlbmRzIG9uIFVTQl9TRVJJQUwKQEAgLTUyNyw4ICs1MzcsNyBAQAogCSAgVGhlIFVTQiBidXMgb24gdGhlc2UgY2FyZHMgaXMgbm90IGFjY2Vzc2libGUgZXh0ZXJuYWxseS4KIAogCSAgU3VwcG9ydGVkIGRldmljZXMgaW5jbHVkZSAoc29tZSBvZj8pIHRob3NlIG1hZGUgYnk6Ci0JICBPcHRpb24sIEh1YXdlaSwgQXVkaW92b3gsIFNpZXJyYSBXaXJlbGVzcywgTm92YXRlbCBXaXJlbGVzcywgb3IKLQkgIEFueWRhdGEuCisJICBPcHRpb24sIEh1YXdlaSwgQXVkaW92b3gsIE5vdmF0ZWwgV2lyZWxlc3MsIG9yIEFueWRhdGEuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9wdGlvbi4KQEAgLTU0NSw2ICs1NTQsMTcgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9tbmluZXQuCiAKK2NvbmZpZyBVU0JfU0VSSUFMX0RFQlVHCisJdHJpc3RhdGUgIlVTQiBEZWJ1Z2dpbmcgRGV2aWNlIgorCWRlcGVuZHMgb24gVVNCX1NFUklBTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBVU0IgZGVidWdnaW5nIGRldmljZSB1c2VkIHRvIHJlY2lldmUKKwkgIGRlYnVnZ2luZyBkYXRhIGZyb20gYW5vdGhlciBtYWNoaW5lLiAgVGhlIG1vc3QgY29tbW9uIG9mIHRoZXNlCisJICBkZXZpY2VzIGlzIHRoZSBOZXRDaGlwIFR1cmJvQ09OTkVDVCBkZXZpY2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVzYi1kZWJ1Zy4KKwogY29uZmlnIFVTQl9FWlVTQgogCWJvb2wKIAlkZXBlbmRzIG9uIFVTQl9TRVJJQUxfS0VZU1BBTl9QREEgfHwgVVNCX1NFUklBTF9YSVJDT00gfHwgVVNCX1NFUklBTF9LRVlTUEFOIHx8IFVTQl9TRVJJQUxfV0hJVEVIRUFUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKaW5kZXggOGRjZTgzMy4uNjExNjZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQpAQCAtMTgsNiArMTgsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfQ1AyMTAxKQkJCSs9IGNwMjEwMS5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9DWUJFUkpBQ0spCQkrPSBjeWJlcmphY2subwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOCkJCSs9IGN5cHJlc3NfbTgubworb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfREVCVUcpCQkJKz0gdXNiX2RlYnVnLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0RJR0lfQUNDRUxFUE9SVCkJKz0gZGlnaV9hY2NlbGVwb3J0Lm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUKQkJKz0gaW9fZWRnZXBvcnQubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlRfVEkpCQkrPSBpb190aS5vCkBAIC0zNCw2ICszNSw3IEBACiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9LTFNJKQkJCSs9IGtsNWt1c2IxMDUubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NUKQkJKz0ga29iaWxfc2N0Lm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX01DVF9VMjMyKQkJKz0gbWN0X3UyMzIubworb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfTU9TNzcyMCkJCSs9IG1vczc3MjAubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfTU9TNzg0MCkJCSs9IG1vczc4NDAubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfTkFWTUFOKQkJCSs9IG5hdm1hbi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9PTU5JTkVUKQkJKz0gb21uaW5ldC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJjYWJsZS5jCmluZGV4IDgxMjI3NTUuLjg2YmNmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJjYWJsZS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJjYWJsZS5jCkBAIC05Miw2ICs5Miw3IEBACiAJc3RydWN0IGNpcmNfYnVmICpyeF9idWY7CS8qIHJlYWQgYnVmZmVyICovCiAJaW50IHJ4X2ZsYWdzOwkJCS8qIGZvciB0aHJvdHRpbG5nICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHJ4X3dvcms7CS8qIHdvcmsgY3VlIGZvciB0aGUgcmVjZWl2aW5nIGxpbmUgKi8KKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwkvKiBVU0IgcG9ydCB3aXRoIHdoaWNoIGFzc29jaWF0ZWQgKi8KIH07CiAKIC8qIFByaXZhdGUgbWV0aG9kcyAqLwpAQCAtMjUxLDEwICsyNTIsMTEgQEAKIAlzY2hlZHVsZV93b3JrKCZwb3J0LT53b3JrKTsKIH0KIAotc3RhdGljIHZvaWQgYWlyY2FibGVfcmVhZCh2b2lkICpwYXJhbXMpCitzdGF0aWMgdm9pZCBhaXJjYWJsZV9yZWFkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gcGFyYW1zOwotCXN0cnVjdCBhaXJjYWJsZV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXN0cnVjdCBhaXJjYWJsZV9wcml2YXRlICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhaXJjYWJsZV9wcml2YXRlLCByeF93b3JrKTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gcHJpdi0+cG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CiAJaW50IGNvdW50OwpAQCAtMjcwLDggKzI3MiwxMSBAQAogCSAqLwogCXR0eSA9IHBvcnQtPnR0eTsKIAotCWlmICghdHR5KQorCWlmICghdHR5KSB7CiAJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X3dvcmspOworCQllcnIoIiVzIC0gTm8gdHR5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiA7CisJfQogCiAJY291bnQgPSBtaW4oNjQsIHNlcmlhbF9idWZfZGF0YV9hdmFpbChwcml2LT5yeF9idWYpKTsKIApAQCAtMzA1LDkgKzMxMCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKLQkJaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSA9PSAweDAwKSAmJgotCQkJKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMikpIHsKLQkJCS8qIHdlIGZvdW5kIG91ciBidWxrIG91dCBlbmRwb2ludCAqLworCQlpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgewogCQkJZGJnKCJmb3VuZCBidWxrIG91dCBvbiBlbmRwb2ludCAlZCIsIGkpOwogCQkJKytudW1fYnVsa19vdXQ7CiAJCX0KQEAgLTM0OCw3ICszNTEsOCBAQAogCX0KIAogCXByaXYtPnJ4X2ZsYWdzICY9IH4oVEhST1RUTEVEIHwgQUNUVUFMTFlfVEhST1RUTEVEKTsKLQlJTklUX1dPUksoJnByaXYtPnJ4X3dvcmssIGFpcmNhYmxlX3JlYWQsIHBvcnQpOworCXByaXYtPnBvcnQgPSBwb3J0OworCUlOSVRfV09SSygmcHJpdi0+cnhfd29yaywgYWlyY2FibGVfcmVhZCk7CiAKIAl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdLCBwcml2KTsKIApAQCAtNTE1LDcgKzUxOSw3IEBACiAJCQkJCXBhY2thZ2VfbGVuZ3RoIC0gc2hpZnQpOwogCQkJfQogCQl9Ci0JCWFpcmNhYmxlX3JlYWQocG9ydCk7CisJCWFpcmNhYmxlX3JlYWQoJnByaXYtPnJ4X3dvcmspOwogCX0KIAogCS8qIFNjaGVkdWxlIHRoZSBuZXh0IHJlYWQgX2lmXyB3ZSBhcmUgc3RpbGwgb3BlbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcnByaW1lLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlycHJpbWUuYwppbmRleCAyYzE5ZjE5Li45NmM3MzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlycHJpbWUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlycHJpbWUuYwpAQCAtMTgsMTIgKzE4LDkgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0gewogCXsgVVNCX0RFVklDRSgweDBjODgsIDB4MTdkYSkgfSwgLyogS3lvY2VyYSBXaXJlbGVzcyBLUEM2NTAvUGFzc3BvcnQgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwZjNkLCAweDAxMTIpIH0sIC8qIEFpclByaW1lIENETUEgV2lyZWxlc3MgUEMgQ2FyZCAqLwotCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxNykgfSwgLyogU2llcnJhIFdpcmVsZXNzIEVNNTYyNSAqLwotCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxOCkgfSwgLyogU2llcnJhIFdpcmVsZXNzIE1DNTcyMCAqLwotCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDExMikgfSwgLyogU2llcnJhIFdpcmVsZXNzIEFpcmNhcmQgNTgwICovCi0JeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMjE4KSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgTUM1NzIwICovCiAJeyBVU0JfREVWSUNFKDB4MTQxMCwgMHgxMTEwKSB9LCAvKiBOb3ZhdGVsIFdpcmVsZXNzIE1lcmxpbiBDRE1BICovCisJeyBVU0JfREVWSUNFKDB4MTQxMCwgMHgxNDMwKSB9LAkvKiBOb3ZhdGVsIE1lcmxpbiBYVTg3MCBIU0RQQS8zRyAqLworCXsgVVNCX0RFVklDRSgweDE0MTAsIDB4MTEwMCkgfSwgLyogRXhwcmVzc0NhcmQzNCBRdWFsY29tbSAzRyBDRE1BICovCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CkBAIC0xMzMsNiArMTMwLDcgQEAKIAkJfQogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYikgeworCQkJa2ZyZWUoYnVmZmVyKTsKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm8gbW9yZSB1cmJzP1xuIiwKIAkJCQlfX0ZVTkNUSU9OX18pOwogCQkJcmVzdWx0ID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jCmluZGV4IGNhNTJmMTIuLjUyNjFjZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYwpAQCAtODUsMTAgKzg1LDkgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7Ci0JCXByaXYgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGFyazMxMTZfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCQlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFyazMxMTZfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXByaXYpCiAJCQlnb3RvIGNsZWFudXA7Ci0JCW1lbXNldChwcml2LCAweDAwLCBzaXplb2YgKHN0cnVjdCBhcmszMTE2X3ByaXZhdGUpKTsKIAkJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0sIHByaXYpOwpAQCAtMTU3LDcgKzE1Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGFyazMxMTZfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQlzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBhcmszMTE2X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0zMjcsNyArMzI2LDcgQEAKIAogc3RhdGljIGludCBhcmszMTE2X29wZW4oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IHRlcm1pb3MgdG1wX3Rlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zIHRtcF90ZXJtaW9zOwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJY2hhciAqYnVmOwogCWludCByZXN1bHQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2JlbGtpbl9zYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2JlbGtpbl9zYS5jCmluZGV4IDg4MzViYjUuLjM4YjRkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9iZWxraW5fc2EuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYmVsa2luX3NhLmMKQEAgLTkyLDcgKzkyLDcgQEAKIHN0YXRpYyBpbnQgIGJlbGtpbl9zYV9vcGVuCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIHZvaWQgYmVsa2luX3NhX2Nsb3NlCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIHZvaWQgYmVsa2luX3NhX3JlYWRfaW50X2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpOwotc3RhdGljIHZvaWQgYmVsa2luX3NhX3NldF90ZXJtaW9zCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCk7CitzdGF0aWMgdm9pZCBiZWxraW5fc2Ffc2V0X3Rlcm1pb3MJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqIG9sZCk7CiBzdGF0aWMgaW50ICBiZWxraW5fc2FfaW9jdGwJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyB2b2lkIGJlbGtpbl9zYV9icmVha19jdGwJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUgKTsKIHN0YXRpYyBpbnQgIGJlbGtpbl9zYV90aW9jbWdldAkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKTsKQEAgLTMzMyw3ICszMzMsNyBAQAogCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKIH0KIAotc3RhdGljIHZvaWQgYmVsa2luX3NhX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCBiZWxraW5fc2Ffc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3QgYmVsa2luX3NhX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY29uc29sZS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYwppbmRleCAzYTkwNzNkLi45Mzg2ZTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY29uc29sZS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jb25zb2xlLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OwogCWludCByZXR2YWwgPSAwOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0Jc3RydWN0IHRlcm1pb3MgKnRlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zOwogCiAJZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0xNjYsMTkgKzE2NiwxNyBAQAogCWlmIChzZXJpYWwtPnR5cGUtPnNldF90ZXJtaW9zKSB7CiAJCS8qIGJ1aWxkIHVwIGEgZmFrZSB0dHkgc3RydWN0dXJlIHNvIHRoYXQgdGhlIG9wZW4gY2FsbCBoYXMgc29tZXRoaW5nCiAJCSAqIHRvIGxvb2sgYXQgdG8gZ2V0IHRoZSBjZmxhZyB2YWx1ZSAqLwotCQl0dHkgPSBrbWFsbG9jIChzaXplb2YgKCp0dHkpLCBHRlBfS0VSTkVMKTsKKwkJdHR5ID0ga3phbGxvYyhzaXplb2YoKnR0eSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXR0eSkgewogCQkJZXJyICgibm8gbW9yZSBtZW1vcnkiKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCXRlcm1pb3MgPSBrbWFsbG9jIChzaXplb2YgKCp0ZXJtaW9zKSwgR0ZQX0tFUk5FTCk7CisJCXRlcm1pb3MgPSBremFsbG9jKHNpemVvZigqdGVybWlvcyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRlcm1pb3MpIHsKIAkJCWVyciAoIm5vIG1vcmUgbWVtb3J5Iik7CiAJCQlrZnJlZSAodHR5KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCW1lbXNldCAodHR5LCAweDAwLCBzaXplb2YoKnR0eSkpOwotCQltZW1zZXQgKHRlcm1pb3MsIDB4MDAsIHNpemVvZigqdGVybWlvcykpOwogCQl0ZXJtaW9zLT5jX2NmbGFnID0gY2ZsYWc7CiAJCXR0eS0+dGVybWlvcyA9IHRlcm1pb3M7CiAJCXBvcnQtPnR0eSA9IHR0eTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYwppbmRleCA0ODZjNzQxLi4yZjliN2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCkBAIC00MSw3ICs0MSw3IEBACiBzdGF0aWMgdm9pZCBjcDIxMDFfY2xlYW51cChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0Kik7CiBzdGF0aWMgdm9pZCBjcDIxMDFfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCosIHN0cnVjdCBmaWxlKik7CiBzdGF0aWMgdm9pZCBjcDIxMDFfZ2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCopOwotc3RhdGljIHZvaWQgY3AyMTAxX3NldF90ZXJtaW9zKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQqLCBzdHJ1Y3QgdGVybWlvcyopOworc3RhdGljIHZvaWQgY3AyMTAxX3NldF90ZXJtaW9zKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQqLCBzdHJ1Y3Qga3Rlcm1pb3MqKTsKIHN0YXRpYyBpbnQgY3AyMTAxX3Rpb2NtZ2V0IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIGludCBjcDIxMDFfdGlvY21zZXQgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiwgc3RydWN0IGZpbGUgKiwKIAkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwpAQCAtNjQsNyArNjQsMTEgQEAKIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgwRjYpIH0sIC8qIFN1dW50byBzcG9ydHMgaW5zdHJ1bWVudCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODEzRCkgfSwgLyogQnVybnNpZGUgVGVsZWNvbSBEZXNrbW9iaWxlICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MTVFKSB9LCAvKiBIZWxpY29tbSBJUC1MaW5rIDEyMjAtRFZNICovCisJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MUM4KSB9LCAvKiBMaXBvd3NreSBJbmR1c3RyaWUgRWxla3Ryb25payBHbWJILCBCYWJ5LUpUQUcgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxRTIpIH0sIC8qIExpcG93c2t5IEluZHVzdHJpZSBFbGVrdHJvbmlrIEdtYkgsIEJhYnktTElOICovCisJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MjE4KSB9LCAvKiBMaXBvd3NreSBJbmR1c3RyaWUgRWxla3Ryb25payBHbWJILCBIQVJQLTEgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweEVBNjApIH0sIC8qIFNpbGljb24gTGFicyBmYWN0b3J5IGRlZmF1bHQgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweEVBNjEpIH0sIC8qIFNpbGljb24gTGFicyBmYWN0b3J5IGRlZmF1bHQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxNkQ2LCAweDAwMDEpIH0sIC8qIEphYmxvdHJvbiBzZXJpYWwgaW50ZXJmYWNlICovCiAJeyB9IC8qIFRlcm1pbmF0aW5nIEVudHJ5ICovCiB9OwpAQCAtNTAyLDcgKzUwNiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGNwMjEwMV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXVuc2lnbmVkIGludCBjZmxhZywgb2xkX2NmbGFnPTA7CiAJaW50IGJhdWQ9MCwgYml0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCmluZGV4IGYyZTg5YTAuLjQ1Y2RmOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QgZGVsdGFfbXNyX3dhaXQ7ICAvKiB1c2VkIGZvciBUSU9DTUlXQUlUICovCiAJY2hhciBwcmV2X3N0YXR1cywgZGlmZl9zdGF0dXM7CSAgIC8qIHVzZWQgZm9yIFRJT0NNSVdBSVQgKi8KIAkvKiB3ZSBwYXNzIGEgcG9pbnRlciB0byB0aGlzIGFzIHRoZSBhcmd1ZW1lbnQgc2VudCB0byBjeXByZXNzX3NldF90ZXJtaW9zIG9sZF90ZXJtaW9zICovCi0Jc3RydWN0IHRlcm1pb3MgdG1wX3Rlcm1pb3M7IAkgICAvKiBzdG9yZXMgdGhlIG9sZCB0ZXJtaW9zIHNldHRpbmdzICovCisJc3RydWN0IGt0ZXJtaW9zIHRtcF90ZXJtaW9zOyAJICAgLyogc3RvcmVzIHRoZSBvbGQgdGVybWlvcyBzZXR0aW5ncyAqLwogfTsKIAogLyogd3JpdGUgYnVmZmVyIHN0cnVjdHVyZSAqLwpAQCAtMTY1LDcgKzE2NSw3IEBACiBzdGF0aWMgdm9pZCBjeXByZXNzX3NlbmQJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyBpbnQgIGN5cHJlc3Nfd3JpdGVfcm9vbQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIGludCAgY3lwcmVzc19pb2N0bAkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIHZvaWQgY3lwcmVzc19zZXRfdGVybWlvcwkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICogb2xkKTsKK3N0YXRpYyB2b2lkIGN5cHJlc3Nfc2V0X3Rlcm1pb3MJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogc3RhdGljIGludCAgY3lwcmVzc190aW9jbWdldAkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBpbnQgIGN5cHJlc3NfdGlvY21zZXQJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKIHN0YXRpYyBpbnQgIGN5cHJlc3NfY2hhcnNfaW5fYnVmZmVyCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKQEAgLTk0OSwxMyArOTQ5LDEzIEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCQljYXNlIFRJT0NHU0VSSUFMOgotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHBvcnQtPnR0eS0+dGVybWlvcywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwb3J0LT50dHktPnRlcm1pb3MsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKSkgewogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCQkJcmV0dXJuICgwKTsKIAkJCWJyZWFrOwogCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBvcnQtPnR0eS0+dGVybWlvcywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBvcnQtPnR0eS0+dGVybWlvcywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSkpIHsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAkJCS8qIGhlcmUgd2UgbmVlZCB0byBjYWxsIGN5cHJlc3Nfc2V0X3Rlcm1pb3MgdG8gaW52b2tlIHRoZSBuZXcgc2V0dGluZ3MgKi8KQEAgLTEwMTksNyArMTAxOSw3IEBACiAKIAogc3RhdGljIHZvaWQgY3lwcmVzc19zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKQEAgLTE0OTMsNyArMTQ5Myw3IEBACiAJaWYgKHNpemUgPT0gMCkKIAkJcmV0dXJuIE5VTEw7CiAKLQljYiA9IChzdHJ1Y3QgY3lwcmVzc19idWYgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3lwcmVzc19idWYpLCBHRlBfS0VSTkVMKTsKKwljYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeXByZXNzX2J1ZiksIEdGUF9LRVJORUwpOwogCWlmIChjYiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTY4NCwxNSArMTY4NCwxNCBAQAogCiAJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOwogCXJldHVybiAwOwotZmFpbGVkX3VzYl9yZWdpc3RlcjoKLQl1c2JfZGVyZWdpc3RlcigmY3lwcmVzc19kcml2ZXIpOwotZmFpbGVkX2NhNDJ2Ml9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmN5cHJlc3NfY2E0MnYyX2RldmljZSk7Ci1mYWlsZWRfaGlkY29tX3JlZ2lzdGVyOgotCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmY3lwcmVzc19oaWRjb21fZGV2aWNlKTsKLWZhaWxlZF9lbV9yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmN5cHJlc3NfZWFydGhtYXRlX2RldmljZSk7CiAKK2ZhaWxlZF91c2JfcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZjeXByZXNzX2NhNDJ2Ml9kZXZpY2UpOworZmFpbGVkX2NhNDJ2Ml9yZWdpc3RlcjoKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmN5cHJlc3NfaGlkY29tX2RldmljZSk7CitmYWlsZWRfaGlkY29tX3JlZ2lzdGVyOgorCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmY3lwcmVzc19lYXJ0aG1hdGVfZGV2aWNlKTsKK2ZhaWxlZF9lbV9yZWdpc3RlcjoKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKaW5kZXggYmRiNTgxMC4uZWZkOWNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAqICAgICAgIHRvIFRBU0tfUlVOTklORyB3aWxsIGJlIGxvc3QgYW5kIHdyaXRlX2NoYW4ncyBzdWJzZXF1ZW50IGNhbGwgdG8KICogICAgICAgc2NoZWR1bGUoKSB3aWxsIG5ldmVyIHJldHVybiAodW5sZXNzIGl0IGNhdGNoZXMgYSBzaWduYWwpLgogKiAgICAgICBUaGlzIHJhY2UgY29uZGl0aW9uIG9jY3VycyBiZWNhdXNlIHdyaXRlX2J1bGtfY2FsbGJhY2soKSAoYW5kIHRodXMKLSogICAgICAgdGhlIHdha2V1cCkgYXJlIGNhbGxlZCBhc3luY2hvbm91c2x5IGZyb20gYW4gaW50ZXJydXB0LCByYXRoZXIgdGhhbgorKiAgICAgICB0aGUgd2FrZXVwKSBhcmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IGZyb20gYW4gaW50ZXJydXB0LCByYXRoZXIgdGhhbgogKiAgICAgICBmcm9tIHRoZSBzY2hlZHVsZXIuICBXZSBjYW4gYXZvaWQgdGhlIHJhY2UgYnkgY2FsbGluZyB0aGUgd2FrZXVwCiAqICAgICAgIGZyb20gdGhlIHNjaGVkdWxlciBxdWV1ZSBhbmQgdGhhdCdzIG91ciBmaXg6ICBOb3csIGF0IHRoZSBlbmQgb2YKICogICAgICAgd3JpdGVfYnVsa19jYWxsYmFjaygpIHdlIHF1ZXVlIHVwIGEgd2FrZXVwIGNhbGwgb24gdGhlIHNjaGVkdWxlcgpAQCAtNDMwLDEzICs0MzAsMTQgQEAKIAlpbnQgZHBfaW5fY2xvc2U7CQkJLyogY2xvc2UgaW4gcHJvZ3Jlc3MgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBkcF9jbG9zZV93YWl0OwkvKiB3YWl0IHF1ZXVlIGZvciBjbG9zZSAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCBkcF93YWtldXBfd29yazsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpkcF9wb3J0OwogfTsKIAogCiAvKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAogc3RhdGljIHZvaWQgZGlnaV93YWtldXBfd3JpdGUoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgKTsKLXN0YXRpYyB2b2lkIGRpZ2lfd2FrZXVwX3dyaXRlX2xvY2sodm9pZCAqKTsKK3N0YXRpYyB2b2lkIGRpZ2lfd2FrZXVwX3dyaXRlX2xvY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyBpbnQgZGlnaV93cml0ZV9vb2JfY29tbWFuZCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAl1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCwgaW50IGludGVycnVwdGlibGUgKTsKIHN0YXRpYyBpbnQgZGlnaV93cml0ZV9pbmJfY29tbWFuZCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKQEAgLTQ0OCw3ICs0NDksNyBAQAogc3RhdGljIHZvaWQgZGlnaV9yeF90aHJvdHRsZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiBzdGF0aWMgdm9pZCBkaWdpX3J4X3VudGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIHZvaWQgZGlnaV9zZXRfdGVybWlvcyggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgCi0Jc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zICk7CisJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyApOwogc3RhdGljIHZvaWQgZGlnaV9icmVha19jdGwoIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSApOwogc3RhdGljIGludCBkaWdpX2lvY3RsKCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOwpAQCAtNTk4LDExICs1OTksMTIgQEAKICogIG9uIHdyaXRlcy4KICovCiAKLXN0YXRpYyB2b2lkIGRpZ2lfd2FrZXVwX3dyaXRlX2xvY2sodm9pZCAqYXJnKQorc3RhdGljIHZvaWQgZGlnaV93YWtldXBfd3JpdGVfbG9jayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IGFyZzsKKwlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkaWdpX3BvcnQsIGRwX3dha2V1cF93b3JrKTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gcHJpdi0+ZHBfcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCAmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyApOwpAQCAtOTc0LDcgKzk3Niw3IEBACiAKIAogc3RhdGljIHZvaWQgZGlnaV9zZXRfdGVybWlvcyggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgCi0Jc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zICkKKwlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zICkKIHsKIAogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0xNDYxLDcgKzE0NjMsNyBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgY2hhciBidWZbMzJdOwogCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0Jc3RydWN0IHRlcm1pb3Mgbm90X3Rlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zIG5vdF90ZXJtaW9zOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCiAKQEAgLTE2NzksNyArMTY4MSw3IEBACiAJZm9yKCBpPTA7IGk8c2VyaWFsLT50eXBlLT5udW1fcG9ydHMrMTsgaSsrICkgewogCiAJCS8qIGFsbG9jYXRlIHBvcnQgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLQkJcHJpdiA9IChzdHJ1Y3QgZGlnaV9wb3J0ICopa21hbGxvYyggc2l6ZW9mKHN0cnVjdCBkaWdpX3BvcnQpLAorCQlwcml2ID0ga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBkaWdpX3BvcnQpLAogCQkJR0ZQX0tFUk5FTCApOwogCQlpZiggcHJpdiA9PSAoc3RydWN0IGRpZ2lfcG9ydCAqKTAgKSB7CiAJCQl3aGlsZSggLS1pID49IDAgKQpAQCAtMTcwMiw4ICsxNzA0LDggQEAKIAkJaW5pdF93YWl0cXVldWVfaGVhZCggJnByaXYtPmRwX2ZsdXNoX3dhaXQgKTsKIAkJcHJpdi0+ZHBfaW5fY2xvc2UgPSAwOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCAmcHJpdi0+ZHBfY2xvc2Vfd2FpdCApOwotCQlJTklUX1dPUksoJnByaXYtPmRwX3dha2V1cF93b3JrLAotCQkJCWRpZ2lfd2FrZXVwX3dyaXRlX2xvY2ssIHNlcmlhbC0+cG9ydFtpXSk7CisJCUlOSVRfV09SSygmcHJpdi0+ZHBfd2FrZXVwX3dvcmssIGRpZ2lfd2FrZXVwX3dyaXRlX2xvY2spOworCQlwcml2LT5kcF9wb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwogCiAJCS8qIGluaXRpYWxpemUgd3JpdGUgd2FpdCBxdWV1ZSBmb3IgdGhpcyBwb3J0ICovCiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoICZzZXJpYWwtPnBvcnRbaV0tPndyaXRlX3dhaXQgKTsKQEAgLTE3MTIsNyArMTcxNCw3IEBACiAJfQogCiAJLyogYWxsb2NhdGUgc2VyaWFsIHByaXZhdGUgc3RydWN0dXJlICovCi0Jc2VyaWFsX3ByaXYgPSAoc3RydWN0IGRpZ2lfc2VyaWFsICopa21hbGxvYyggc2l6ZW9mKHN0cnVjdCBkaWdpX3NlcmlhbCksCisJc2VyaWFsX3ByaXYgPSBrbWFsbG9jKCBzaXplb2Yoc3RydWN0IGRpZ2lfc2VyaWFsKSwKIAkJR0ZQX0tFUk5FTCApOwogCWlmKCBzZXJpYWxfcHJpdiA9PSAoc3RydWN0IGRpZ2lfc2VyaWFsICopMCApIHsKIAkJZm9yKCBpPTA7IGk8c2VyaWFsLT50eXBlLT5udW1fcG9ydHMrMTsgaSsrICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKaW5kZXggNGNlMTBhOC4uOTJiZWViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAkJCQkJc3RydWN0IGZpbGUgKiBmaWxlLAogCQkJCQl1bnNpZ25lZCBpbnQgY21kLAogCQkJCQl1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgdm9pZCBlbXBlZ19zZXRfdGVybWlvcwkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgdm9pZCBlbXBlZ19zZXRfdGVybWlvcwkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpOwogc3RhdGljIHZvaWQgZW1wZWdfd3JpdGVfYnVsa19jYWxsYmFjawkoc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkIGVtcGVnX3JlYWRfYnVsa19jYWxsYmFjawkoc3RydWN0IHVyYiAqdXJiKTsKIApAQCAtNDQyLDcgKzQ0Miw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgZW1wZWdfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIGVtcGVnX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZXp1c2IuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCmluZGV4IDUxNjljMmQuLjk3ZWU3MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9lenVzYi5jCkBAIC0zMSwxMiArMzEsMTEgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JdHJhbnNmZXJfYnVmZmVyID0gIGttYWxsb2MgKGxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJdHJhbnNmZXJfYnVmZmVyID0ga21lbWR1cChkYXRhLCBsZW5ndGgsIEdGUF9LRVJORUwpOwogCWlmICghdHJhbnNmZXJfYnVmZmVyKSB7CiAJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIGttYWxsb2MoJWQpIGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbWNweSAodHJhbnNmZXJfYnVmZmVyLCBkYXRhLCBsZW5ndGgpOwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoc2VyaWFsLT5kZXYsIHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCksIGJSZXF1ZXN0LCAweDQwLCBhZGRyZXNzLCAwLCB0cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCwgMzAwMCk7CiAJa2ZyZWUgKHRyYW5zZmVyX2J1ZmZlcik7CiAJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggZDNkYzFhMS4uNDFiMGFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTEsMTYgKzEsMTYgQEAKIC8qCiAgKiBVU0IgRlRESSBTSU8gZHJpdmVyCiAgKgotICogCUNvcHlyaWdodCAoQykgMTk5OSAtIDIwMDEKLSAqIAkgICAgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKKyAqCUNvcHlyaWdodCAoQykgMTk5OSAtIDIwMDEKKyAqCSAgICBHcmVnIEtyb2FoLUhhcnRtYW4gKGdyZWdAa3JvYWguY29tKQogICogICAgICAgICAgQmlsbCBSeWRlciAoYnJ5ZGVyQHNnaS5jb20pCiAgKglDb3B5cmlnaHQgKEMpIDIwMDIKICAqCSAgICBLdWJhIE9iZXIgKGt1YmFAbWFyZWltYnJpdW0ub3JnKQogICoKLSAqIAlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIAkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCiAgKiBTZWUgRG9jdW1lbnRhdGlvbi91c2IvdXNiLXNlcmlhbC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhpcyBkcml2ZXIKICAqCkBAIC0zMiw3ICszMiw3IEBACiAgKiAgICAgIENoYW5nZWQgZnVsbCBuYW1lIG9mIFVTQi1VSVJUIGRldmljZSB0byBhdm9pZCAiLyIgY2hhcmFjdGVyLgogICogICAgICBBZGRlZCBGVERJJ3MgYWx0ZXJuYXRlIFBJRCAoMHg2MDA2KSBmb3IgRlQyMzIvMjQ1IGRldmljZXMuCiAgKiAgICAgIEFkZGVkIFBJRCBmb3IgIkVMViBVU0IgTW9kdWxlIFVPMTAwIiBmcm9tIFN0ZWZhbiBGcmluZ3MuCi0gKiAKKyAqCiAgKiAoMjEvT2N0LzIwMDMpIElhbiBBYmJvdHQKICAqICAgICAgUmVuYW1lZCBzb21lIFZJRC9QSUQgbWFjcm9zIGZvciBNYXRyaXggT3JiaXRhbCBhbmQgUGVybGUgU3lzdGVtcwogICogICAgICBkZXZpY2VzLiAgUmVtb3ZlZCBNYXRyaXggT3JiaXRhbCBhbmQgUGVybGUgU3lzdGVtcyBkZXZpY2VzIGZyb20gdGhlCkBAIC02OSw3ICs2OSw3IEBACiAgKglkb2VzIG5vdCBpbmN1cmUgYW55IG1lYXN1cmFibGUgb3ZlcmhlYWQuICBUaGlzIGFsc28gcmVsaWVzIG9uIHRoZSBmYWN0CiAgKgl0aGF0IHdlIGhhdmUgcHJvcGVyIHJlZmVyZW5jZSBjb3VudGluZyBsb2dpYyBmb3IgdXJicy4gIEkgbmlja2VkIHRoaXMKICAqCWZyb20gR3JlZyBLSCdzIFZpc29yIGRyaXZlci4KLSAqICAgICAgCisgKgogICogKDIzL0p1bi8yMDAzKSBJYW4gQWJib3R0CiAgKiAgICAgIFJlZHVjZWQgZmxpcCBidWZmZXIgcHVzaGVzIGFuZCBjb3JyZWN0ZWQgYSBkYXRhIGxlbmd0aCB0ZXN0IGluCiAgKiAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLgpAQCAtNzcsNyArNzcsNyBAQAogICoKICAqICgyMS9KdW4vMjAwMykgRXJpayBOeWdyZW4KICAqICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgSG9tZSBFbGVjdHJvbmljcyBUaXJhLTEgSVIgdHJhbnNjZWl2ZXIgdXNpbmcgRlQyMzJCTSBjaGlwLgotICogICAgICBTZWUgPGh0dHA6Ly93d3cuaG9tZS1lbGVjdHJvLmNvbS90aXJhMS5odG0+LiAgT25seSBvcGVyYXRlcyBwcm9wZXJseSAKKyAqICAgICAgU2VlIDxodHRwOi8vd3d3LmhvbWUtZWxlY3Ryby5jb20vdGlyYTEuaHRtPi4gIE9ubHkgb3BlcmF0ZXMgcHJvcGVybHkKICAqICAgICAgYXQgMTAwMDAwIGFuZCBSVFMtQ1RTLCBzbyBzZXQgY3VzdG9tIGRpdmlzb3IgbW9kZSBvbiBzdGFydHVwLgogICogICAgICBBbHNvIGZvcmNlIHRoZSBUaXJhLTEgYW5kIFVTQi1VSVJUIHRvIG9ubHkgdXNlIHRoZWlyIGN1c3RvbSBiYXVkIHJhdGVzLgogICoKQEAgLTEzNywxNyArMTM3LDE3IEBACiAgKiAoMTcvRmViLzIwMDMpIEJpbGwgUnlkZXIKICAqICAgICAgQWRkZWQgd3JpdGUgdXJiIGJ1ZmZlciBwb29sIG9uIGEgcGVyIGRldmljZSBiYXNpcwogICogICAgICBBZGRlZCBtb3JlIGNoZWNraW5nIGZvciBvcGVuIGZpbGUgb24gY2FsbGJhY2tzIChmaXhlZCBPT1BTKQotICogICAgICBBZGRlZCBDcnlzdGFsRm9udHogNjMyIGFuZCA2MzQgUElEcyAKKyAqICAgICAgQWRkZWQgQ3J5c3RhbEZvbnR6IDYzMiBhbmQgNjM0IFBJRHMKICAqICAgICAgICAgKHRoYW54IHRvIENyeXN0YWxGb250eiBmb3IgdGhlIHNhbXBsZSBkZXZpY2VzIC0gdGhleSBmbHVzaGVkIG91dAogICogICAgICAgICAgIHNvbWUgZHJpdmVyIGJ1Z3MpCiAgKiAgICAgIE1pbm9yIGRlYnVnZ2luZyBtZXNzYWdlIGNoYW5nZXMKICAqICAgICAgQWRkZWQgdGhyb3R0bGUsIHVudGhyb3R0bGUgYW5kIGNoYXJzX2luX2J1ZmZlciBmdW5jdGlvbnMKICAqICAgICAgRml4ZWQgRlRESV9TSU8gKHRoZSBvcmlnaW5hbCBkZXZpY2UpIGJ1ZwogICogICAgICBGaXhlZCBzb21lIHNodXRkb3duIGhhbmRsaW5nCi0gKiAgICAgIAotICogCi0gKiAKLSAqIAorICoKKyAqCisgKgorICoKICAqICgwNy9KdW4vMjAwMikgS3ViYSBPYmVyCiAgKglDaGFuZ2VkIEZURElfU0lPX0JBU0VfQkFVRF9UT19ESVZJU09SIG1hY3JvIGludG8gZnRkaV9iYXVkX3RvX2Rpdmlzb3IKICAqCWZ1bmN0aW9uLiBJdCB3YXMgZ2V0dGluZyB0b28gY29tcGxleC4KQEAgLTE1OCw3ICsxNTgsNyBAQAogICoKICAqICgyNS9KdWwvMjAwMikgQmlsbCBSeWRlciBpbnNlcnRlZCBEbWl0cmkncyBUSU9DTUlXQUlUIHBhdGNoCiAgKiAgICAgIE5vdCB0ZXN0ZWQgYnkgbWUgYnV0IGl0IGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcgSSB1c2UuCi0gKiAKKyAqCiAgKiAoMDQvSmFuLzIwMDIpIEt1YmEgT2JlcgogICoJSW1wbGVtZW50ZWQgMzg0MDAgYmF1ZHJhdGUga2x1ZGdlLCB3aGVyZSBpdCBjYW4gYmUgc3Vic3RpdHV0ZWQgd2l0aCBvdGhlcgogICoJICB2YWx1ZXMuIFRoYXQncyB0aGUgb25seSB3YXkgdG8gc2V0IGN1c3RvbSBiYXVkcmF0ZXMuCkBAIC0xNzksNyArMTc5LDcgQEAKICAqICAgICAgICAodGhlIHByZXZpb3VzIHZlcnNpb24gY2F1c2VkIHBhbmljcykKICAqCVJlbW92ZWQgcG9ydCBpdGVyYXRpb24gY29kZSBzaW5jZSB0aGUgZGV2aWNlIG9ubHkgaGFzIG9uZSBJL08gcG9ydCBhbmQgaXQKICAqCSAgd2FzIHdyb25nIGFueXdheS4KLSAqIAorICoKICAqICgzMS9NYXkvMjAwMSkgZ2toCiAgKglTd2l0Y2hlZCBmcm9tIHVzaW5nIHNwaW5sb2NrIHRvIGEgc2VtYXBob3JlLCB3aGljaCBmaXhlcyBsb3RzIG9mIHByb2JsZW1zLgogICoKQEAgLTE4OCwxNiArMTg4LDE2IEBACiAgKglDbGVhbmVkIHVwIGNvbW1lbnRzIGZvciA4VTIzMgogICoJQWRkZWQgcGFyaXR5LCBmcmFtaW5nIGFuZCBvdmVycnVuIGVycm9yIGhhbmRsaW5nCiAgKglBZGRlZCByZWNlaXZlIGJyZWFrIGhhbmRsaW5nLgotICogCisgKgogICogKDA0LzA4LzIwMDEpIGdiCiAgKglJZGVudGlmeSB2ZXJzaW9uIG9uIG1vZHVsZSBsb2FkLgotICogICAgICAgCisgKgogICogKDE4L01hcmNoLzIwMDEpIEJpbGwgUnlkZXIKICAqCShOb3QgcmVsZWFzZWQpCiAgKglBZGRlZCBzZW5kIGJyZWFrIGhhbmRsaW5nLiAocmVxdWlyZXMga2VybmVsIHBhdGNoIHRvbykKICAqCUZpeGVkIDhVMjMyQU0gaGFyZHdhcmUgUlRTL0NUUyBldGMgc3RhdHVzIHJlcG9ydGluZy4KICAqCUFkZGVkIGZsaXBidWYgZml4IGNvcGllZCBmcm9tIGdlbmVyaWMgZGV2aWNlCi0gKiAKKyAqCiAgKiAoMTIvMy8yMDAwKSBCaWxsIFJ5ZGVyCiAgKglBZGRlZCBzdXBwb3J0IGZvciA4VTIzMkFNIGRldmljZS4KICAqCU1vdmVkIFBJRCBhbmQgVklEcyBpbnRvIGhlYWRlciBmaWxlIG9ubHkuCkBAIC0yMTEsMTQgKzIxMSwxNCBAQAogICoJQ2xlYW5lZCB1cCBjb21tZW50cy4gUmVtb3ZlZCBtdWx0aXBsZSBQSUQvVklEIGRlZmluaXRpb25zLgogICoJRmFjdG9yaXNlZCBjdHMvZHRyIGNvZGUKICAqCU1hZGUgdXNlIG9mIF9fRlVOQ1RJT05fXyBpbiBkYmcncwotICogICAgICAKKyAqCiAgKiAoMTEvMDEvMjAwMCkgQWRhbSBKLiBSaWNodGVyCiAgKgl1c2JfZGV2aWNlX2lkIHRhYmxlIHN1cHBvcnQKLSAqIAorICoKICAqICgxMC8wNS8yMDAwKSBna2gKICAqCUZpeGVkIGJ1ZyB3aXRoIHVyYi0+ZGV2IG5vdCBiZWluZyBzZXQgcHJvcGVybHksIG5vdyB0aGF0IHRoZSB1c2IKICAqCWNvcmUgbmVlZHMgaXQuCi0gKiAKKyAqCiAgKiAoMDkvMTEvMjAwMCkgZ2toCiAgKglSZW1vdmVkIERFQlVHICNpZmRlZnMgd2l0aCBjYWxsIHRvIHVzYl9zZXJpYWxfZGVidWdfZGF0YQogICoKQEAgLTIyNiwxMSArMjI2LDExIEBACiAgKglBZGRlZCBtb2R1bGVfaW5pdCBhbmQgbW9kdWxlX2V4aXQgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgZmFjdCB0aGF0IHRoaXMKICAqCWRyaXZlciBpcyBhIGxvYWRhYmxlIG1vZHVsZSBub3cuCiAgKgotICogKDA0LzA0LzIwMDApIEJpbGwgUnlkZXIgCisgKiAoMDQvMDQvMjAwMCkgQmlsbCBSeWRlcgogICoJRml4ZWQgYnVncyBpbiBUQ0dFVC9UQ1NFVCBpb2N0bHMgKGJ5IHJlbW92aW5nIHRoZW0gLSB0aGV5IGFyZQogICogICAgICAgIGhhbmRsZWQgZWxzZXdoZXJlIGluIHRoZSB0dHkgaW8gZHJpdmVyIGNoYWluKS4KICAqCi0gKiAoMDMvMzAvMjAwMCkgQmlsbCBSeWRlciAKKyAqICgwMy8zMC8yMDAwKSBCaWxsIFJ5ZGVyCiAgKglJbXBsZW1lbnRlZCBsb3RzIG9mIGlvY3RscwogICoJRml4ZWQgYSByYWNlIGNvbmRpdGlvbiBpbiB3cml0ZQogICoJQ2hhbmdlZCBzb21lIGRiZydzIHRvIGVycnMKQEAgLTMxMSw2ICszMTEsNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9BQ1RaV0FWRV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lSVFJBTlNfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9JUExVU19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0RNWDRBTEwpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1NJT19QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjMyQU1fUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV84VTIzMkFNX0FMVF9QSUQpIH0sCkBAIC00NDQsMTMgKzQ0NSwxMyBAQAogCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfV1MzMDBQQ19QSUQpIH0sICovCiAJLyogeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9GSFoxMzAwUENfUElEKSB9LCAqLwogCS8qIHsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfV1M1MDBfUElEKSB9LCAqLwotIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfU0RNVVNCUVNTX1BJRCkgfSwKLSAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX01BU1RFUkRFVkVMMl9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMF9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMV9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMl9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVMjBfMF9QSUQpIH0sCi0gCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVNDBfMV9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX01BU1RFUkRFVkVMMl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX0ZVVFVSRV8wX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzFfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9GVVRVUkVfMl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFUyMF8wX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTQwXzFfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgSU5TSURFX0FDQ0VTU08pIH0sCiAJeyBVU0JfREVWSUNFKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfVkFMVUVDQU5fUElEKSB9LAogCXsgVVNCX0RFVklDRShJTlRSRVBJRF9WSUQsIElOVFJFUElEX05FT1ZJX1BJRCkgfSwKQEAgLTUxMSw2ICs1MTIsNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9UQUNUUklYX09QRU5QT1JUXzEzTV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1RBQ1RSSVhfT1BFTlBPUlRfMTNTX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVEFDVFJJWF9PUEVOUE9SVF8xM1VfUElEKSB9LAorCXsgVVNCX0RFVklDRShFTEVLVE9SX1ZJRCwgRUxFS1RPUl9GVDMyM1JfUElEKSB9LAogCXsgfSwJCQkJCS8qIE9wdGlvbmFsIHBhcmFtZXRlciBlbnRyeSAqLwogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CkBAIC01MjIsNyArNTI0LDcgQEAKIAkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAogCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAogCS5pZF90YWJsZSA9CWlkX3RhYmxlX2NvbWJpbmVkLAotCS5ub19keW5hbWljX2lkID0gCTEsCisJLm5vX2R5bmFtaWNfaWQgPQkxLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZ0ZGlfY2hpcF9uYW1lW10gPSB7CkBAIC01NDgsMTYgKzU1MCwxNyBAQAogCWludCBjdXN0b21fZGl2aXNvcjsJLyogY3VzdG9tX2Rpdmlzb3Iga2x1ZGdlLCB0aGlzIGlzIGZvciBiYXVkX2Jhc2UgKGRpZmZlcmVudCBmcm9tIHdoYXQgZ29lcyB0byB0aGUgY2hpcCEpICovCiAJX191MTYgbGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgOwogCQkJCS8qIHRoZSBsYXN0IGRhdGEgc3RhdGUgc2V0IC0gbmVlZGVkIGZvciBkb2luZyBhIGJyZWFrICovCi0gICAgICAgIGludCB3cml0ZV9vZmZzZXQ7ICAgICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgdXNiIGRhdGEgYmxvY2sgdG8gd3JpdGUgdGhlIHNlcmlhbCBkYXRhIC0gCisgICAgICAgIGludCB3cml0ZV9vZmZzZXQ7ICAgICAgIC8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgdXNiIGRhdGEgYmxvY2sgdG8gd3JpdGUgdGhlIHNlcmlhbCBkYXRhIC0KIAkJCQkgKiBpdCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBkZXZpY2VzCiAJCQkJICovCiAJaW50IGZsYWdzOwkJLyogc29tZSBBU1lOQ194eHh4IGZsYWdzIGFyZSBzdXBwb3J0ZWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfZHRyX3J0czsJLyogc2F2ZWQgbW9kZW0gY29udHJvbCBvdXRwdXRzICovCiAgICAgICAgIHdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OyAvKiBVc2VkIGZvciBUSU9DTUlXQUlUICovCi0gCWNoYXIgcHJldl9zdGF0dXMsIGRpZmZfc3RhdHVzOyAgICAgICAgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLworCWNoYXIgcHJldl9zdGF0dXMsIGRpZmZfc3RhdHVzOyAgICAgICAgLyogVXNlZCBmb3IgVElPQ01JV0FJVCAqLwogCV9fdTggcnhfZmxhZ3M7CQkvKiByZWNlaXZlIHN0YXRlIGZsYWdzICh0aHJvdHRsaW5nKSAqLwogCXNwaW5sb2NrX3QgcnhfbG9jazsJLyogc3BpbmxvY2sgZm9yIHJlY2VpdmUgc3RhdGUgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHJ4X3dvcms7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlpbnQgcnhfcHJvY2Vzc2VkOwogCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXM7CiAKQEAgLTU5MSw4ICs1OTQsOCBAQAogc3RhdGljIGludCAgZnRkaV9jaGFyc19pbl9idWZmZXIJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIHZvaWQgZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrCShzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIHZvaWQgZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYik7Ci1zdGF0aWMgdm9pZCBmdGRpX3Byb2Nlc3NfcmVhZAkJKHZvaWQgKnBhcmFtKTsKLXN0YXRpYyB2b2lkIGZ0ZGlfc2V0X3Rlcm1pb3MJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCk7CitzdGF0aWMgdm9pZCBmdGRpX3Byb2Nlc3NfcmVhZAkJKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBmdGRpX3NldF90ZXJtaW9zCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICogb2xkKTsKIHN0YXRpYyBpbnQgIGZ0ZGlfdGlvY21nZXQgICAgICAgICAgICAgICAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCAgZnRkaV90aW9jbXNldAkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKIHN0YXRpYyBpbnQgIGZ0ZGlfaW9jdGwJCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC03MjEsNyArNzI0LDcgQEAKIAkJdXJiX3ZhbHVlIHw9IEZURElfU0lPX1NFVF9SVFNfSElHSDsKIAlydiA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAotCQkJICAgICAgIEZURElfU0lPX1NFVF9NT0RFTV9DVFJMX1JFUVVFU1QsIAorCQkJICAgICAgIEZURElfU0lPX1NFVF9NT0RFTV9DVFJMX1JFUVVFU1QsCiAJCQkgICAgICAgRlRESV9TSU9fU0VUX01PREVNX0NUUkxfUkVRVUVTVF9UWVBFLAogCQkJICAgICAgIHVyYl92YWx1ZSwgcHJpdi0+aW50ZXJmYWNlLAogCQkJICAgICAgIGJ1ZiwgMCwgV0RSX1RJTUVPVVQpOwpAQCAtNzY4LDcgKzc3MSw3IEBACiAJaWYgKHByaXYtPmludGVyZmFjZSkgewkvKiBGVDIyMzJDICovCiAJCXVyYl9pbmRleCA9IChfX3UxNikoKHVyYl9pbmRleCA8PCA4KSB8IHByaXYtPmludGVyZmFjZSk7CiAJfQotCQorCiAJcnYgPSB1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkgICAgdXNiX3NuZGN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKIAkJCSAgICBGVERJX1NJT19TRVRfQkFVRFJBVEVfUkVRVUVTVCwKQEAgLTgyNyw3ICs4MzAsNyBAQAogCiAJLyogMy4gQ29udmVydCBiYXVkcmF0ZSB0byBkZXZpY2Utc3BlY2lmaWMgZGl2aXNvciAqLwogCi0JaWYgKCFiYXVkKSBiYXVkID0gOTYwMDsJCisJaWYgKCFiYXVkKSBiYXVkID0gOTYwMDsKIAlzd2l0Y2gocHJpdi0+Y2hpcF90eXBlKSB7CiAJY2FzZSBTSU86IC8qIFNJTyBjaGlwICovCiAJCXN3aXRjaChiYXVkKSB7CkBAIC04NDMsNyArODQ2LDcgQEAKIAkJY2FzZSAxMTUyMDA6IGRpdl92YWx1ZSA9IGZ0ZGlfc2lvX2IxMTUyMDA7IGJyZWFrOwogCQl9IC8qIGJhdWQgKi8KIAkJaWYgKGRpdl92YWx1ZSA9PSAwKSB7Ci0gIAkJCWRiZygiJXMgLSBCYXVkcmF0ZSAoJWQpIHJlcXVlc3RlZCBpcyBub3Qgc3VwcG9ydGVkIiwgX19GVU5DVElPTl9fLCAgYmF1ZCk7CisJCQlkYmcoIiVzIC0gQmF1ZHJhdGUgKCVkKSByZXF1ZXN0ZWQgaXMgbm90IHN1cHBvcnRlZCIsIF9fRlVOQ1RJT05fXywgIGJhdWQpOwogCQkJZGl2X3ZhbHVlID0gZnRkaV9zaW9fYjk2MDA7CiAJCQlkaXZfb2theSA9IDA7CiAJCX0KQEAgLTkyNSw3ICs5MjgsNyBAQAogCS8qIE1ha2UgdGhlIGNoYW5nZXMgLSB0aGVzZSBhcmUgcHJpdmlsZWdlZCBjaGFuZ2VzISAqLwogCiAJcHJpdi0+ZmxhZ3MgPSAoKHByaXYtPmZsYWdzICYgfkFTWU5DX0ZMQUdTKSB8Ci0JICAgICAgICAgICAgICAgKG5ld19zZXJpYWwuZmxhZ3MgJiBBU1lOQ19GTEFHUykpOwkKKwkgICAgICAgICAgICAgICAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CiAJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwogCiAJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IChwcml2LT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOwpAQCAtOTUwLDcgKzk1Myw3IEBACiAJICAgICAob2xkX3ByaXYuY3VzdG9tX2Rpdmlzb3IgIT0gcHJpdi0+Y3VzdG9tX2Rpdmlzb3IpKSkgewogCQljaGFuZ2Vfc3BlZWQocG9ydCk7CiAJfQotCQorCiAJcmV0dXJuICgwKTsKIAogfSAvKiBzZXRfc2VyaWFsX2luZm8gKi8KQEAgLTEwMjIsMTggKzEwMjUsMTggQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAl1bnNpZ25lZCBzaG9ydCBsYXRlbmN5ID0gMDsKIAlpbnQgcnYgPSAwOwotCQorCiAJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKLQkKKwogCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7Ci0JCisKIAlydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAogCQkJICAgICB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCiAJCQkgICAgIEZURElfU0lPX0dFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1QsCiAJCQkgICAgIEZURElfU0lPX0dFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1RfVFlQRSwKLQkJCSAgICAgMCwgcHJpdi0+aW50ZXJmYWNlLCAKKwkJCSAgICAgMCwgcHJpdi0+aW50ZXJmYWNlLAogCQkJICAgICAoY2hhciopICZsYXRlbmN5LCAxLCBXRFJfVElNRU9VVCk7Ci0JCisKIAlpZiAocnYgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHJlYWQgbGF0ZW5jeSB0aW1lcjogJWkiLCBydik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTA1MSwyMyArMTA1NCwyMyBAQAogCWNoYXIgYnVmWzFdOwogCWludCB2ID0gc2ltcGxlX3N0cnRvdWwodmFsYnVmLCBOVUxMLCAxMCk7CiAJaW50IHJ2ID0gMDsKLQkKKwogCXVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7Ci0JCisKIAlkYmcoIiVzOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgPSAlaSIsIF9fRlVOQ1RJT05fXywgdik7Ci0JCisKIAlydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAogCQkJICAgICB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCiAJCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1QsCiAJCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1RfVFlQRSwKLQkJCSAgICAgdiwgcHJpdi0+aW50ZXJmYWNlLCAKKwkJCSAgICAgdiwgcHJpdi0+aW50ZXJmYWNlLAogCQkJICAgICBidWYsIDAsIFdEUl9USU1FT1VUKTsKLQkKKwogCWlmIChydiA8IDApIHsKIAkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gd3JpdGUgbGF0ZW5jeSB0aW1lcjogJWkiLCBydik7CiAJCXJldHVybiAtRUlPOwogCX0KLQkKKwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTA4MiwyMyArMTA4NSwyMyBAQAogCWNoYXIgYnVmWzFdOwogCWludCB2ID0gc2ltcGxlX3N0cnRvdWwodmFsYnVmLCBOVUxMLCAxMCk7CiAJaW50IHJ2ID0gMDsKLQkKKwogCXVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7Ci0JCisKIAlkYmcoIiVzOiBzZXR0aW5nIGV2ZW50IGNoYXIgPSAlaSIsIF9fRlVOQ1RJT05fXywgdik7Ci0JCisKIAlydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAogCQkJICAgICB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCiAJCQkgICAgIEZURElfU0lPX1NFVF9FVkVOVF9DSEFSX1JFUVVFU1QsCiAJCQkgICAgIEZURElfU0lPX1NFVF9FVkVOVF9DSEFSX1JFUVVFU1RfVFlQRSwKLQkJCSAgICAgdiwgcHJpdi0+aW50ZXJmYWNlLCAKKwkJCSAgICAgdiwgcHJpdi0+aW50ZXJmYWNlLAogCQkJICAgICBidWYsIDAsIFdEUl9USU1FT1VUKTsKLQkKKwogCWlmIChydiA8IDApIHsKIAkJZGJnKCJVbmFibGUgdG8gd3JpdGUgZXZlbnQgY2hhcmFjdGVyOiAlaSIsIHJ2KTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCQorCiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0xMTM1LDExICsxMTM4LDExIEBACiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAotCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CQorCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7CiAJdWRldiA9IHNlcmlhbC0+ZGV2OwotCQorCiAJLyogWFhYIHNlZSBjcmVhdGVfc3lzZnNfYXR0cnMgKi8KIAlpZiAocHJpdi0+Y2hpcF90eXBlICE9IFNJTykgewogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnVkZXYtPmRldiwgJmRldl9hdHRyX2V2ZW50X2NoYXIpOwpAQCAtMTE0Nyw3ICsxMTUwLDcgQEAKIAkJCWRldmljZV9yZW1vdmVfZmlsZSgmdWRldi0+ZGV2LCAmZGV2X2F0dHJfbGF0ZW5jeV90aW1lcik7CiAJCX0KIAl9Ci0JCisKIH0KIAogLyoKQEAgLTExOTksNyArMTIwMiw4IEBACiAJCXBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gQlVGU1o7CiAJfQogCi0JSU5JVF9XT1JLKCZwcml2LT5yeF93b3JrLCBmdGRpX3Byb2Nlc3NfcmVhZCwgcG9ydCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnJ4X3dvcmssIGZ0ZGlfcHJvY2Vzc19yZWFkKTsKKwlwcml2LT5wb3J0ID0gcG9ydDsKIAogCS8qIEZyZWUgcG9ydCdzIGV4aXN0aW5nIHdyaXRlIHVyYiBhbmQgdHJhbnNmZXIgYnVmZmVyLiAqLwogCWlmIChwb3J0LT53cml0ZV91cmIpIHsKQEAgLTEyNTgsNyArMTI2Miw3IEBACiB9IC8qIGZ0ZGlfSEVfVElSQTFfc2V0dXAgKi8KIAogCi0vKiBmdGRpX3NodXRkb3duIGlzIGNhbGxlZCBmcm9tIHVzYnNlcmlhbDp1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QgCisvKiBmdGRpX3NodXRkb3duIGlzIGNhbGxlZCBmcm9tIHVzYnNlcmlhbDp1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QKICAqICAgaXQgaXMgY2FsbGVkIHdoZW4gdGhlIHVzYiBkZXZpY2UgaXMgZGlzY29ubmVjdGVkCiAgKgogICogICB1c2JzZXJpYWw6dXNiX3NlcmlhbF9kaXNjb25uZWN0CkBAIC0xMjY5LDE2ICsxMjczLDE2IEBACiAKIHN0YXRpYyB2b2lkIGZ0ZGlfc2h1dGRvd24gKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7IC8qIGZ0ZGlfc2h1dGRvd24gKi8KLQkKKwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAJcmVtb3ZlX3N5c2ZzX2F0dHJzKHNlcmlhbCk7Ci0JCi0JLyogYWxsIG9wZW4gcG9ydHMgYXJlIGNsb3NlZCBhdCB0aGlzIHBvaW50IAotICAgICAgICAgKiAgICAoYnkgdXNic2VyaWFsLmM6X19zZXJpYWxfY2xvc2UsIHdoaWNoIGNhbGxzIGZ0ZGlfY2xvc2UpICAKKworCS8qIGFsbCBvcGVuIHBvcnRzIGFyZSBjbG9zZWQgYXQgdGhpcyBwb2ludAorICAgICAgICAgKiAgICAoYnkgdXNic2VyaWFsLmM6X19zZXJpYWxfY2xvc2UsIHdoaWNoIGNhbGxzIGZ0ZGlfY2xvc2UpCiAJICovCiAKIAlpZiAocHJpdikgewpAQCAtMTI5Myw3ICsxMjk3LDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQorCiAJaW50IHJlc3VsdCA9IDA7CiAJY2hhciBidWZbMV07IC8qIE5lZWRlZCBmb3IgdGhlIHVzYl9jb250cm9sX21zZyBJIHRoaW5rICovCiAKQEAgLTEzMTIsOCArMTMxNiw4IEBACiAJLyogTm8gZXJyb3IgY2hlY2tpbmcgZm9yIHRoaXMgKHdpbGwgZ2V0IGVycm9ycyBsYXRlciBhbnl3YXkpICovCiAJLyogU2VlIGZ0ZGlfc2lvLmggZm9yIGRlc2NyaXB0aW9uIG9mIHdoYXQgaXMgcmVzZXQgKi8KIAl1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKLQkJCUZURElfU0lPX1JFU0VUX1JFUVVFU1QsIEZURElfU0lPX1JFU0VUX1JFUVVFU1RfVFlQRSwgCi0JCQlGVERJX1NJT19SRVNFVF9TSU8sIAorCQkJRlRESV9TSU9fUkVTRVRfUkVRVUVTVCwgRlRESV9TSU9fUkVTRVRfUkVRVUVTVF9UWVBFLAorCQkJRlRESV9TSU9fUkVTRVRfU0lPLAogCQkJcHJpdi0+aW50ZXJmYWNlLCBidWYsIDAsIFdEUl9USU1FT1VUKTsKIAogCS8qIFRlcm1pb3MgZGVmYXVsdHMgYXJlIHNldCBieSB1c2Jfc2VyaWFsX2luaXQuIFdlIGRvbid0IGNoYW5nZQpAQCAtMTM1MCwxMiArMTM1NCwxMiBAQAogCiAKIAotLyogCisvKgogICogdXNic2VyaWFsOl9fc2VyaWFsX2Nsb3NlICBvbmx5IGNhbGxzIGZ0ZGlfY2xvc2UgaWYgdGhlIHBvaW50IGlzIG9wZW4KICAqCiAgKiAgIFRoaXMgb25seSBnZXRzIGNhbGxlZCB3aGVuIGl0IGlzIHRoZSBsYXN0IGNsb3NlCi0gKiAgIAotICogICAKKyAqCisgKgogICovCiAKIHN0YXRpYyB2b2lkIGZ0ZGlfY2xvc2UgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQpAQCAtMTM2OCwxNCArMTM3MiwxNCBAQAogCiAJaWYgKGNfY2ZsYWcgJiBIVVBDTCl7CiAJCS8qIERpc2FibGUgZmxvdyBjb250cm9sICovCi0JCWlmICh1c2JfY29udHJvbF9tc2cocG9ydC0+c2VyaWFsLT5kZXYsIAorCQlpZiAodXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCSAgICB1c2Jfc25kY3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAogCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCiAJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAogCQkJCSAgICAwLCBwcml2LT5pbnRlcmZhY2UsIGJ1ZiwgMCwKIAkJCQkgICAgV0RSX1RJTUVPVVQpIDwgMCkgewogCQkJZXJyKCJlcnJvciBmcm9tIGZsb3djb250cm9sIHVyYiIpOwotCQl9CSAgICAKKwkJfQogCiAJCS8qIGRyb3AgUlRTIGFuZCBEVFIgKi8KIAkJY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKQEAgLTEzODQsMTQgKzEzODgsMTMgQEAKIAkvKiBjYW5jZWwgYW55IHNjaGVkdWxlZCByZWFkaW5nICovCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cnhfd29yayk7CiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQkKKwogCS8qIHNodXRkb3duIG91ciBidWxrIHJlYWQgKi8KLQlpZiAocG9ydC0+cmVhZF91cmIpCi0JCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CisJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIH0gLyogZnRkaV9jbG9zZSAqLwogCiAKLSAgCisKIC8qIFRoZSBTSU8gcmVxdWlyZXMgdGhlIGZpcnN0IGJ5dGUgdG8gaGF2ZToKICAqICBCMCAxCiAgKiAgQjEgMApAQCAtMTQyMyw3ICsxNDI2LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKLQkKKwogCWRhdGFfb2Zmc2V0ID0gcHJpdi0+d3JpdGVfb2Zmc2V0OwogICAgICAgICBkYmcoImRhdGFfb2Zmc2V0IHNldCB0byAlZCIsZGF0YV9vZmZzZXQpOwogCkBAIC0xNDYyLDcgKzE0NjUsNyBAQAogCQkJCXVzZXJfcGt0c3ogPSB0b2RvOwogCQkJfQogCQkJLyogV3JpdGUgdGhlIGNvbnRyb2wgYnl0ZSBhdCB0aGUgZnJvbnQgb2YgdGhlIHBhY2tldCovCi0JCQkqZmlyc3RfYnl0ZSA9IDEgfCAoKHVzZXJfcGt0c3opIDw8IDIpOyAKKwkJCSpmaXJzdF9ieXRlID0gMSB8ICgodXNlcl9wa3RzeikgPDwgMik7CiAJCQkvKiBDb3B5IGRhdGEgZm9yIHBhY2tldCAqLwogCQkJbWVtY3B5IChmaXJzdF9ieXRlICsgZGF0YV9vZmZzZXQsCiAJCQkJY3VycmVudF9wb3NpdGlvbiwgdXNlcl9wa3Rzeik7CkBAIC0xNDc5LDcgKzE0ODIsNyBAQAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB0cmFuc2Zlcl9zaXplLCBidWZmZXIpOwogCiAJLyogZmlsbCB0aGUgYnVmZmVyIGFuZCBzZW5kIGl0ICovCi0JdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwb3J0LT5zZXJpYWwtPmRldiwgCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCBwb3J0LT5idWxrX291dF9lbmRwb2ludEFkZHJlc3MpLAogCQkgICAgICBidWZmZXIsIHRyYW5zZmVyX3NpemUsCiAJCSAgICAgIGZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywgcG9ydCk7CkBAIC0xNTIwLDcgKzE1MjMsNyBAQAogCWtmcmVlICh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKLQkKKwogCWlmICh1cmItPnN0YXR1cykgewogCQlkYmcoIm5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CkBAIC0xNjM5LDE5ICsxNjQyLDIwIEBACiAJcHJpdi0+cnhfYnl0ZXMgKz0gY291bnRyZWFkOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKIAotCWZ0ZGlfcHJvY2Vzc19yZWFkKHBvcnQpOworCWZ0ZGlfcHJvY2Vzc19yZWFkKCZwcml2LT5yeF93b3JrLndvcmspOwogCiB9IC8qIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrICovCiAKIAotc3RhdGljIHZvaWQgZnRkaV9wcm9jZXNzX3JlYWQgKHZvaWQgKnBhcmFtKQorc3RhdGljIHZvaWQgZnRkaV9wcm9jZXNzX3JlYWQgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsgLyogZnRkaV9wcm9jZXNzX3JlYWQgKi8KLQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQqKXBhcmFtOworCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZ0ZGlfcHJpdmF0ZSwgcnhfd29yay53b3JrKTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gcHJpdi0+cG9ydDsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwogCWNoYXIgZXJyb3JfZmxhZzsKLSAgICAgICAJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOwogCiAJaW50IGk7CiAJaW50IHJlc3VsdDsKQEAgLTE3NTksNyArMTc2Myw3IEBACiAJCX0KIAkJaWYgKGxlbmd0aCA+IDApIHsKIAkJCWZvciAoaSA9IDI7IGkgPCBsZW5ndGgrMjsgaSsrKSB7Ci0JCQkJLyogTm90ZSB0aGF0IHRoZSBlcnJvciBmbGFnIGlzIGR1cGxpY2F0ZWQgZm9yIAorCQkJCS8qIE5vdGUgdGhhdCB0aGUgZXJyb3IgZmxhZyBpcyBkdXBsaWNhdGVkIGZvcgogCQkJCSAgIGV2ZXJ5IGNoYXJhY3RlciByZWNlaXZlZCBzaW5jZSB3ZSBkb24ndCBrbm93CiAJCQkJICAgd2hpY2ggY2hhcmFjdGVyIGl0IGFwcGxpZWQgdG8gKi8KIAkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGRhdGFbcGFja2V0X29mZnNldCtpXSwgZXJyb3JfZmxhZyk7CkBAIC0xNzczLDcgKzE3NzcsNyBAQAogCQkgICBUaGlzIGRvZXNuJ3Qgd29yayB3ZWxsIHNpbmNlIHRoZSBhcHBsaWNhdGlvbiByZWNlaXZlcyBhIG5ldmVyCiAJCSAgIGVuZGluZyBzdHJlYW0gb2YgYmFkIGRhdGEgLSBldmVuIHRob3VnaCBuZXcgZGF0YSBoYXNuJ3QgYmVlbiBzZW50LgogCQkgICBUaGVyZWZvcmUgSSAoYmlsbCkgaGF2ZSB0YWtlbiB0aGlzIG91dC4KLQkJICAgSG93ZXZlciAtIHRoaXMgbWlnaHQgbWFrZSBzZW5zZSBmb3IgZnJhbWluZyBlcnJvcnMgYW5kIHNvIG9uIAorCQkgICBIb3dldmVyIC0gdGhpcyBtaWdodCBtYWtlIHNlbnNlIGZvciBmcmFtaW5nIGVycm9ycyBhbmQgc28gb24KIAkJICAgc28gSSBhbSBsZWF2aW5nIHRoZSBjb2RlIGluIGZvciBub3cuCiAJCSovCiAJCWVsc2UgewpAQCAtMTgyNyw3ICsxODMxLDcgQEAKIAkvKiBpZiB0aGUgcG9ydCBpcyBjbG9zZWQgc3RvcCB0cnlpbmcgdG8gcmVhZCAqLwogCWlmIChwb3J0LT5vcGVuX2NvdW50ID4gMCl7CiAJCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZCAgKi8KLQkJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LCAKKwkJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJICAgICAgdXNiX3JjdmJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCiAJCQkgICAgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCSAgICAgIGZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKQEAgLTE4NDQsOSArMTg0OCw5IEBACiBzdGF0aWMgdm9pZCBmdGRpX2JyZWFrX2N0bCggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlICkKIHsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCV9fdTE2IHVyYl92YWx1ZSA9IDA7IAorCV9fdTE2IHVyYl92YWx1ZSA9IDA7CiAJY2hhciBidWZbMV07Ci0JCisKIAkvKiBicmVha19zdGF0ZSA9IC0xIHRvIHR1cm4gb24gYnJlYWssIGFuZCAwIHRvIHR1cm4gb2ZmIGJyZWFrICovCiAJLyogc2VlIGRyaXZlcnMvY2hhci90dHlfaW8uYyB0byBzZWUgaXQgdXNlZCAqLwogCS8qIGxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlIE5FVkVSIGhhcyB0aGUgYnJlYWsgYml0IHNldCBpbiBpdCAqLwpAQCAtMTg1NCwyMCArMTg1OCwyMCBAQAogCWlmIChicmVha19zdGF0ZSkgewogCQl1cmJfdmFsdWUgPSBwcml2LT5sYXN0X3NldF9kYXRhX3VyYl92YWx1ZSB8IEZURElfU0lPX1NFVF9CUkVBSzsKIAl9IGVsc2UgewotCQl1cmJfdmFsdWUgPSBwcml2LT5sYXN0X3NldF9kYXRhX3VyYl92YWx1ZTsgCisJCXVyYl92YWx1ZSA9IHByaXYtPmxhc3Rfc2V0X2RhdGFfdXJiX3ZhbHVlOwogCX0KIAotCQorCiAJaWYgKHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKLQkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNULCAKKwkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNULAogCQkJICAgIEZURElfU0lPX1NFVF9EQVRBX1JFUVVFU1RfVFlQRSwKIAkJCSAgICB1cmJfdmFsdWUgLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7CiAJCWVycigiJXMgRkFJTEVEIHRvIGVuYWJsZS9kaXNhYmxlIGJyZWFrIHN0YXRlIChzdGF0ZSB3YXMgJWQpIiwgX19GVU5DVElPTl9fLGJyZWFrX3N0YXRlKTsKLQl9CSAgIAorCX0KIAogCWRiZygiJXMgYnJlYWsgc3RhdGUgaXMgJWQgLSB1cmIgaXMgJWQiLCBfX0ZVTkNUSU9OX18sYnJlYWtfc3RhdGUsIHVyYl92YWx1ZSk7Ci0JCisKIH0KIAogCkBAIC0xODc2LDE5ICsxODgwLDE5IEBACiAgKiBXQVJOSU5HOiBzZXRfdGVybWlvcyBjYWxscyB0aGlzIHdpdGggb2xkX3Rlcm1pb3MgaW4ga2VybmVsIHNwYWNlCiAgKi8KIAotc3RhdGljIHZvaWQgZnRkaV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgZnRkaV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsgLyogZnRkaV90ZXJtaW9zICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCXVuc2lnbmVkIGludCBjZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCV9fdTE2IHVyYl92YWx1ZTsgLyogd2lsbCBob2xkIHRoZSBuZXcgZmxhZ3MgKi8KIAljaGFyIGJ1ZlsxXTsgLyogUGVyaGFwcyBJIHNob3VsZCBkeW5hbWljYWxseSBhbGxvYyB0aGlzPyAqLwotCQorCiAJLy8gQWRkZWQgZm9yIHhvbi94b2ZmIHN1cHBvcnQKIAl1bnNpZ25lZCBpbnQgaWZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfaWZsYWc7CiAJdW5zaWduZWQgY2hhciB2c3RvcDsKIAl1bnNpZ25lZCBjaGFyIHZzdGFydDsKLQkKKwogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAJLyogRm9yY2UgYmF1ZCByYXRlIGlmIHRoaXMgZGV2aWNlIHJlcXVpcmVzIGl0LCB1bmxlc3MgaXQgaXMgc2V0IHRvIEIwLiAqLwpAQCAtMTkwNiwyMCArMTkxMCwyMCBAQAogCiAJY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAKLQkvKiBGSVhNRSAtRm9yIHRoaXMgY3V0IEkgZG9uJ3QgY2FyZSBpZiB0aGUgbGluZSBpcyByZWFsbHkgY2hhbmdpbmcgb3IgCi0JICAgbm90ICAtIHNvIGp1c3QgZG8gdGhlIGNoYW5nZSByZWdhcmRsZXNzICAtIHNob3VsZCBiZSBhYmxlIHRvIAorCS8qIEZJWE1FIC1Gb3IgdGhpcyBjdXQgSSBkb24ndCBjYXJlIGlmIHRoZSBsaW5lIGlzIHJlYWxseSBjaGFuZ2luZyBvcgorCSAgIG5vdCAgLSBzbyBqdXN0IGRvIHRoZSBjaGFuZ2UgcmVnYXJkbGVzcyAgLSBzaG91bGQgYmUgYWJsZSB0bwogCSAgIGNvbXBhcmUgb2xkX3Rlcm1pb3MgYW5kIHR0eS0+dGVybWlvcyAqLwotCS8qIE5PVEUgVGhlc2Ugcm91dGluZXMgY2FuIGdldCBpbnRlcnJ1cHRlZCBieSAKLQkgICBmdGRpX3Npb19yZWFkX2J1bGtfY2FsbGJhY2sgIC0gbmVlZCB0byBleGFtaW5lIHdoYXQgdGhpcyAKKwkvKiBOT1RFIFRoZXNlIHJvdXRpbmVzIGNhbiBnZXQgaW50ZXJydXB0ZWQgYnkKKwkgICBmdGRpX3Npb19yZWFkX2J1bGtfY2FsbGJhY2sgIC0gbmVlZCB0byBleGFtaW5lIHdoYXQgdGhpcwogICAgICAgICAgICBtZWFucyAtIGRvbid0IHNlZSBhbnkgcHJvYmxlbXMgeWV0ICovCi0JCisKIAkvKiBTZXQgbnVtYmVyIG9mIGRhdGEgYml0cywgcGFyaXR5LCBzdG9wIGJpdHMgKi8KLQkKKwogCXVyYl92YWx1ZSA9IDA7CiAJdXJiX3ZhbHVlIHw9IChjZmxhZyAmIENTVE9QQiA/IEZURElfU0lPX1NFVF9EQVRBX1NUT1BfQklUU18yIDoKIAkJICAgICAgRlRESV9TSU9fU0VUX0RBVEFfU1RPUF9CSVRTXzEpOwotCXVyYl92YWx1ZSB8PSAoY2ZsYWcgJiBQQVJFTkIgPyAKLQkJICAgICAgKGNmbGFnICYgUEFST0REID8gRlRESV9TSU9fU0VUX0RBVEFfUEFSSVRZX09ERCA6IAorCXVyYl92YWx1ZSB8PSAoY2ZsYWcgJiBQQVJFTkIgPworCQkgICAgICAoY2ZsYWcgJiBQQVJPREQgPyBGVERJX1NJT19TRVRfREFUQV9QQVJJVFlfT0REIDoKIAkJICAgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9FVkVOKSA6CiAJCSAgICAgIEZURElfU0lPX1NFVF9EQVRBX1BBUklUWV9OT05FKTsKIAlpZiAoY2ZsYWcgJiBDU0laRSkgewpAQCAtMTkzNiwyNSArMTk0MCwyNSBAQAogCS8qIFRoaXMgaXMgbmVlZGVkIGJ5IHRoZSBicmVhayBjb21tYW5kIHNpbmNlIGl0IHVzZXMgdGhlIHNhbWUgY29tbWFuZCAtIGJ1dCBpcwogCSAqICBvcidlZCB3aXRoIHRoaXMgdmFsdWUgICovCiAJcHJpdi0+bGFzdF9zZXRfZGF0YV91cmJfdmFsdWUgPSB1cmJfdmFsdWU7Ci0JCisKIAlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVCwgCisJCQkgICAgRlRESV9TSU9fU0VUX0RBVEFfUkVRVUVTVCwKIAkJCSAgICBGVERJX1NJT19TRVRfREFUQV9SRVFVRVNUX1RZUEUsCiAJCQkgICAgdXJiX3ZhbHVlICwgcHJpdi0+aW50ZXJmYWNlLAogCQkJICAgIGJ1ZiwgMCwgV0RSX1NIT1JUX1RJTUVPVVQpIDwgMCkgewogCQllcnIoIiVzIEZBSUxFRCB0byBzZXQgZGF0YWJpdHMvc3RvcGJpdHMvcGFyaXR5IiwgX19GVU5DVElPTl9fKTsKLQl9CSAgIAorCX0KIAogCS8qIE5vdyBkbyB0aGUgYmF1ZHJhdGUgKi8KIAlpZiAoKGNmbGFnICYgQ0JBVUQpID09IEIwICkgewogCQkvKiBEaXNhYmxlIGZsb3cgY29udHJvbCAqLwogCQlpZiAodXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCi0JCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwgCisJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwKIAkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNUX1RZUEUsCi0JCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwgCisJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwKIAkJCQkgICAgYnVmLCAwLCBXRFJfVElNRU9VVCkgPCAwKSB7CiAJCQllcnIoIiVzIGVycm9yIGZyb20gZGlzYWJsZSBmbG93Y29udHJvbCB1cmIiLCBfX0ZVTkNUSU9OX18pOwotCQl9CSAgICAKKwkJfQogCQkvKiBEcm9wIFJUUyBhbmQgRFRSICovCiAJCWNsZWFyX21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7CiAJfSBlbHNlIHsKQEAgLTE5NzIsMTYgKzE5NzYsMTYgQEAKIAkvKiBOb3RlIGRldmljZSBhbHNvIHN1cHBvcnRzIERUUi9DRCAodWdoKSBhbmQgWG9uL1hvZmYgaW4gaGFyZHdhcmUgKi8KIAlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CiAJCWRiZygiJXMgU2V0dGluZyB0byBDUlRTQ1RTIGZsb3cgY29udHJvbCIsIF9fRlVOQ1RJT05fXyk7Ci0JCWlmICh1c2JfY29udHJvbF9tc2coZGV2LCAKKwkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsCiAJCQkJICAgIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAotCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsIAorCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCiAJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAogCQkJCSAgICAwICwgKEZURElfU0lPX1JUU19DVFNfSFMgfCBwcml2LT5pbnRlcmZhY2UpLAogCQkJCSAgICBidWYsIDAsIFdEUl9USU1FT1VUKSA8IDApIHsKIAkJCWVycigidXJiIGZhaWxlZCB0byBzZXQgdG8gcnRzL2N0cyBmbG93IGNvbnRyb2wiKTsKLQkJfQkJCi0JCQotCX0gZWxzZSB7IAorCQl9CisKKwl9IGVsc2UgewogCQkvKgogCQkgKiBYb24vWG9mZiBjb2RlCiAJCSAqCkBAIC0yMDExLDE2ICsyMDE1LDE2IEBACiAJCQkvKiBlbHNlIGNsYXVzZSB0byBvbmx5IHJ1biBpZiBjZmFnICEgQ1JUU0NUUyBhbmQgaWZsYWcgISBYT0ZGICovCiAJCQkvKiBDSEVDS01FIEFzc3VtaW5nIFhPTi9YT0ZGIGhhbmRsZWQgYnkgdHR5IHN0YWNrIC0gbm90IGJ5IGRldmljZSAqLwogCQkJZGJnKCIlcyBUdXJuaW5nIG9mZiBoYXJkd2FyZSBmbG93IGNvbnRyb2wiLCBfX0ZVTkNUSU9OX18pOwotCQkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsIAorCQkJaWYgKHVzYl9jb250cm9sX21zZyhkZXYsCiAJCQkJCSAgICB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKLQkJCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVCwgCisJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1QsCiAJCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKLQkJCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwgCisJCQkJCSAgICAwLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkJCSAgICBidWYsIDAsIFdEUl9USU1FT1VUKSA8IDApIHsKIAkJCQllcnIoInVyYiBmYWlsZWQgdG8gY2xlYXIgZmxvdyBjb250cm9sIik7Ci0JCQl9CQkJCQorCQkJfQogCQl9Ci0JCQorCiAJfQogCXJldHVybjsKIH0gLyogZnRkaV90ZXJtaW9zICovCkBAIC0yMDM2LDExICsyMDQwLDExIEBACiAJc3dpdGNoIChwcml2LT5jaGlwX3R5cGUpIHsKIAljYXNlIFNJTzoKIAkJLyogUmVxdWVzdCB0aGUgc3RhdHVzIGZyb20gdGhlIGRldmljZSAqLwotCQlpZiAoKHJldCA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwgCisJCWlmICgocmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQkgICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAotCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1QsIAorCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1QsCiAJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVF9UWVBFLAotCQkJCQkgICAwLCAwLCAKKwkJCQkJICAgMCwgMCwKIAkJCQkJICAgYnVmLCAxLCBXRFJfVElNRU9VVCkpIDwgMCApIHsKIAkJCWVycigiJXMgQ291bGQgbm90IGdldCBtb2RlbSBzdGF0dXMgb2YgZGV2aWNlIC0gZXJyOiAlZCIsIF9fRlVOQ1RJT05fXywKIAkJCSAgICByZXQpOwpAQCAtMjA1MiwxMSArMjA1NiwxMSBAQAogCWNhc2UgRlQyMjMyQzoKIAkJLyogdGhlIDhVMjMyQU0gcmV0dXJucyBhIHR3byBieXRlIHZhbHVlICh0aGUgc2lvIGlzIGEgMSBieXRlIHZhbHVlKSAtIGluIHRoZSBzYW1lCiAJCSAgIGZvcm1hdCBhcyB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBpbiBwb2ludCAqLwotCQlpZiAoKHJldCA9IHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwgCisJCWlmICgocmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQkgICB1c2JfcmN2Y3RybHBpcGUocG9ydC0+c2VyaWFsLT5kZXYsIDApLAotCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1QsIAorCQkJCQkgICBGVERJX1NJT19HRVRfTU9ERU1fU1RBVFVTX1JFUVVFU1QsCiAJCQkJCSAgIEZURElfU0lPX0dFVF9NT0RFTV9TVEFUVVNfUkVRVUVTVF9UWVBFLAotCQkJCQkgICAwLCBwcml2LT5pbnRlcmZhY2UsIAorCQkJCQkgICAwLCBwcml2LT5pbnRlcmZhY2UsCiAJCQkJCSAgIGJ1ZiwgMiwgV0RSX1RJTUVPVVQpKSA8IDAgKSB7CiAJCQllcnIoIiVzIENvdWxkIG5vdCBnZXQgbW9kZW0gc3RhdHVzIG9mIGRldmljZSAtIGVycjogJWQiLCBfX0ZVTkNUSU9OX18sCiAJCQkgICAgcmV0KTsKQEAgLTIwNjcsMTIgKzIwNzEsMTIgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJCWJyZWFrOwogCX0KLQkKKwogCXJldHVybiAgKGJ1ZlswXSAmIEZURElfU0lPX0RTUl9NQVNLID8gVElPQ01fRFNSIDogMCkgfAogCQkoYnVmWzBdICYgRlRESV9TSU9fQ1RTX01BU0sgPyBUSU9DTV9DVFMgOiAwKSB8CiAJCShidWZbMF0gICYgRlRESV9TSU9fUklfTUFTSyAgPyBUSU9DTV9SSSAgOiAwKSB8CiAJCShidWZbMF0gICYgRlRESV9TSU9fUkxTRF9NQVNLID8gVElPQ01fQ0QgIDogMCkgfAotCQlwcml2LT5sYXN0X2R0cl9ydHM7CQkJCisJCXByaXYtPmxhc3RfZHRyX3J0czsKIH0KIAogc3RhdGljIGludCBmdGRpX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQpAQCAtMjEzOCwxMSArMjE0MiwxMSBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKLQkJCisKIAl9CiAKIAotCS8qIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIC0gdHVybnMgb3V0IHRoZSBoaWdoZXIgbGF5ZXJzIHdpbGwgZG8gCisJLyogVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IgLSB0dXJucyBvdXQgdGhlIGhpZ2hlciBsYXllcnMgd2lsbCBkbwogCSAqICBzb21lIGlvY3RscyBpdHNlbGYgKHNlZSBjb21tZW50IGFib3ZlKQogCSAqLwogCWRiZygiJXMgYXJnIG5vdCBzdXBwb3J0ZWQgLSBpdCB3YXMgMHglMDR4IC0gY2hlY2sgL3Vzci9pbmNsdWRlL2FzbS9pb2N0bHMuaCIsIF9fRlVOQ1RJT05fXywgY21kKTsKQEAgLTIxNzgsNyArMjE4Miw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGFjdHVhbGx5X3Rocm90dGxlZCkKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cnhfd29yayk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+cnhfd29yaywgMCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGZ0ZGlfaW5pdCAodm9pZCkKQEAgLTIxOTksNyArMjIwMyw3IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBmYWlsZWRfc2lvX3JlZ2lzdGVyOwogCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmZnRkaV9kcml2ZXIpOwotCWlmIChyZXR2YWwpIAorCWlmIChyZXR2YWwpCiAJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKIAogCWluZm8oRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKaW5kZXggZjBlZGI4Ny4uYmFlMTE3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKQEAgLTU1LDYgKzU1LDkgQEAKIC8qIGlQbHVzIGRldmljZSAqLwogI2RlZmluZSBGVERJX0lQTFVTX1BJRCAweEQwNzAgLyogUHJvZHVjdCBJZCAqLwogCisvKiBETVg0QUxMIERNWCBJbnRlcmZhY2VzICovCisjZGVmaW5lIEZURElfRE1YNEFMTCAweEM4NTAKKwogLyogd3d3LmNyeXN0YWxmb250ei5jb20gZGV2aWNlcyAtIHRoYW54IGZvciBwcm92aWRpbmcgZnJlZSBkZXZpY2VzIGZvciBldmFsdWF0aW9uICEgKi8KIC8qIHRoZXkgdXNlIHRoZSBmdGRpIGNoaXBzZXQgZm9yIHRoZSBVU0IgaW50ZXJmYWNlIGFuZCB0aGUgdmVuZG9yIGlkIGlzIHRoZSBzYW1lICovCiAjZGVmaW5lIEZURElfWEZfNjMyX1BJRCAweEZDMDgJLyogNjMyOiAxNngyIENoYXJhY3RlciBEaXNwbGF5ICovCkBAIC0xNzUsOSArMTc4LDE1IEBACiAjZGVmaW5lIEZURElfQVNLX1JEUjQwMF9QSUQJMHhDOTkxCS8qIEFTSyBSRFIgNDAwIHNlcmllcyBjYXJkIHJlYWRlciAqLwogCiAvKgorICogRlRESSBVU0IgVUFSVCBjaGlwcyB1c2VkIGluIGNvbnN0cnVjdGlvbiBwcm9qZWN0cyBmcm9tIHRoZQorICogRWxla3RvciBFbGVjdHJvbmljcyBtYWdhemluZSAoaHR0cDovL2VsZWt0b3ItZWxlY3Ryb25pY3MuY28udWspCisgKi8KKyNkZWZpbmUgRUxFS1RPUl9WSUQJCTB4MEM3RAorI2RlZmluZSBFTEVLVE9SX0ZUMzIzUl9QSUQJMHgwMDA1CS8qIFJGSUQtUmVhZGVyLCBpc3N1ZSAwOS0yMDA2ICovCisKKy8qCiAgKiBEU1MtMjAgU3luYyBTdGF0aW9uIGZvciBTb255IEVyaWNzc29uIFA4MDAKICAqLwotIAogI2RlZmluZSBGVERJX0RTUzIwX1BJRCAgICAgICAgICAweEZDODIgIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKaW5kZXggNDU0MzE1Mi4uNjUzMGQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCkBAIC0xNTIzLDEyICsxNTIzLDExIEBACiAKIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKIAotCWdhcm1pbl9kYXRhX3AgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IGdhcm1pbl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJZ2FybWluX2RhdGFfcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnYXJtaW5fZGF0YSksIEdGUF9LRVJORUwpOwogCWlmIChnYXJtaW5fZGF0YV9wID09IE5VTEwpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBPdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0IChnYXJtaW5fZGF0YV9wLCAwLCBzaXplb2Yoc3RydWN0IGdhcm1pbl9kYXRhKSk7CiAJaW5pdF90aW1lcigmZ2FybWluX2RhdGFfcC0+dGltZXIpOwogCXNwaW5fbG9ja19pbml0KCZnYXJtaW5fZGF0YV9wLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZ2FybWluX2RhdGFfcC0+cGt0bGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fZWRnZXBvcnQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jCmluZGV4IDkxYmQzMDEuLmY2MjNkNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jCkBAIC0yMjksNyArMjI5LDcgQEAKIHN0YXRpYyBpbnQgIGVkZ2VfY2hhcnNfaW5fYnVmZmVyCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyB2b2lkIGVkZ2VfdGhyb3R0bGUJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyB2b2lkIGVkZ2VfdW50aHJvdHRsZQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgZWRnZV9zZXRfdGVybWlvcwkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgdm9pZCBlZGdlX3NldF90ZXJtaW9zCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyk7CiBzdGF0aWMgaW50ICBlZGdlX2lvY3RsCQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgdm9pZCBlZGdlX2JyZWFrCQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSk7CiBzdGF0aWMgaW50ICBlZGdlX3Rpb2NtZ2V0CQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiBzdGF0aWMgaW50ICBzZW5kX2lvc3BfZXh0X2NtZAkJKHN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQsIF9fdTggY29tbWFuZCwgX191OCBwYXJhbSk7CiBzdGF0aWMgaW50ICBjYWxjX2JhdWRfcmF0ZV9kaXZpc29yCShpbnQgYmF1ZF9yYXRlLCBpbnQgKmRpdmlzb3IpOwogc3RhdGljIGludCAgc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlCShzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0LCBpbnQgYmF1ZFJhdGUpOwotc3RhdGljIHZvaWQgY2hhbmdlX3BvcnRfc2V0dGluZ3MJKHN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfcG9ydF9zZXR0aW5ncwkoc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyk7CiBzdGF0aWMgaW50ICBzZW5kX2NtZF93cml0ZV91YXJ0X3JlZ2lzdGVyCShzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0LCBfX3U4IHJlZ051bSwgX191OCByZWdWYWx1ZSk7CiBzdGF0aWMgaW50ICB3cml0ZV9jbWRfdXNiCQkoc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgd3JpdGVMZW5ndGgpOwogc3RhdGljIHZvaWQgc2VuZF9tb3JlX3BvcnRfZGF0YQkJKHN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKmVkZ2Vfc2VyaWFsLCBzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0KTsKQEAgLTEwMzgsOSArMTAzOCw3IEBACiAJZWRnZV9wb3J0LT5vcGVuID0gRkFMU0U7CiAJZWRnZV9wb3J0LT5vcGVuUGVuZGluZyA9IEZBTFNFOwogCi0JaWYgKGVkZ2VfcG9ydC0+d3JpdGVfdXJiKSB7Ci0JCXVzYl9raWxsX3VyYihlZGdlX3BvcnQtPndyaXRlX3VyYik7Ci0JfQorCXVzYl9raWxsX3VyYihlZGdlX3BvcnQtPndyaXRlX3VyYik7CiAKIAlpZiAoZWRnZV9wb3J0LT53cml0ZV91cmIpIHsKIAkJLyogaWYgdGhpcyB1cmIgaGFkIGEgdHJhbnNmZXIgYnVmZmVyIGFscmVhZHkgKG9sZCB0cmFuc2ZlcikgZnJlZSBpdCAqLwpAQCAtMTQzMyw3ICsxNDMxLDcgQEAKICAqIFNlcmlhbFNldFRlcm1pb3MKICAqCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHdoZW4gaXQgd2FudHMgdG8gY2hhbmdlIHRoZSB0ZXJtaW9zIHN0cnVjdHVyZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZWRnZV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgZWRnZV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT50dHk7CkBAIC0yNDE0LDcgKzI0MTIsNyBAQAogI2lmbmRlZiBDTVNQQVIKICNkZWZpbmUgQ01TUEFSIDAKICNlbmRpZgotc3RhdGljIHZvaWQgY2hhbmdlX3BvcnRfc2V0dGluZ3MgKHN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQsIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIGNoYW5nZV9wb3J0X3NldHRpbmdzIChzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IGJhdWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCmluZGV4IGVlMGM5MjEuLjk4MDI4NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIHN0YXRpYyB2b2lkIHN0b3BfcmVhZChzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0KTsKIHN0YXRpYyBpbnQgcmVzdGFydF9yZWFkKHN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQpOwogCi1zdGF0aWMgdm9pZCBlZGdlX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpOworc3RhdGljIHZvaWQgZWRnZV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyk7CiBzdGF0aWMgdm9pZCBlZGdlX3NlbmQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiAKIC8qIGNpcmN1bGFyIGJ1ZmZlciAqLwpAQCAtMjM2MSw3ICsyMzYxLDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZCBjaGFuZ2VfcG9ydF9zZXR0aW5ncyAoc3RydWN0IGVkZ2Vwb3J0X3BvcnQgKmVkZ2VfcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgY2hhbmdlX3BvcnRfc2V0dGluZ3MgKHN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHVtcF91YXJ0X2NvbmZpZyAqY29uZmlnOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CkBAIC0yNTEyLDcgKzI1MTIsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgZWRnZV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgZWRnZV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgZWRnZXBvcnRfcG9ydCAqZWRnZV9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT50dHk7CkBAIC0yODExLDcgKzI4MTEsNyBAQAogCWlmIChzaXplID09IDApCiAJCXJldHVybiBOVUxMOwogCi0JZWIgPSAoc3RydWN0IGVkZ2VfYnVmICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGVkZ2VfYnVmKSwgR0ZQX0tFUk5FTCk7CisJZWIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWRnZV9idWYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZWIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCmluZGV4IDYyMzhhZmYuLjQyZjc1N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYwpAQCAtMzIwLDYgKzMyMCw3IEBACiAJeyBVU0JfREVWSUNFKDB4MEIwNSwgMHg5MjAwKSB9LCAvKiBBU1VTIFVTQiBTeW5jICovCiAJeyBVU0JfREVWSUNFKDB4MEIwNSwgMHg5MjAyKSB9LCAvKiBBU1VTIFVTQiBTeW5jICovCiAJeyBVU0JfREVWSUNFKDB4MEJCNCwgMHgwMENFKSB9LCAvKiBIVEMgVVNCIFN5bmMgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwQkI0LCAweDAwQ0YpIH0sIC8qIEhUQyBVU0IgTW9kZW0gKi8KIAl7IFVTQl9ERVZJQ0UoMHgwQkI0LCAweDBBMDEpIH0sIC8qIFBvY2tldFBDIFVTQiBTeW5jICovCiAJeyBVU0JfREVWSUNFKDB4MEJCNCwgMHgwQTAyKSB9LCAvKiBQb2NrZXRQQyBVU0IgU3luYyAqLwogCXsgVVNCX0RFVklDRSgweDBCQjQsIDB4MEEwMykgfSwgLyogUG9ja2V0UEMgVVNCIFN5bmMgKi8KQEAgLTU5NCw3ICs1OTUsNyBAQAogCiAJYnl0ZXNfaW4gPSAwOwogCWJ5dGVzX291dCA9IDA7Ci0JcHJpdiA9IChzdHJ1Y3QgaXBhcV9wcml2YXRlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGlwYXFfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCXByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBhcV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHByaXYgPT0gTlVMTCkgewogCQllcnIoIiVzIC0gT3V0IG9mIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCmluZGV4IDJhNGJiNjYuLmQzYjlhMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKQEAgLTIwNiwxMCArMjA2LDkgQEAKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCi0JYnVmX2Zsb3dfaW5pdCA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOworCWJ1Zl9mbG93X2luaXQgPSBrbWVtZHVwKGJ1Zl9mbG93X3N0YXRpYywgMTYsIEdGUF9LRVJORUwpOwogCWlmICghYnVmX2Zsb3dfaW5pdCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGJ1Zl9mbG93X2luaXQsIGJ1Zl9mbG93X3N0YXRpYywgMTYpOwogCiAJaWYgKHBvcnQtPnR0eSkKIAkJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMKaW5kZXggMzMxYmY4MS4uOGZkZjQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lyLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pci11c2IuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiBzdGF0aWMgaW50ICBpcl93cml0ZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwogc3RhdGljIHZvaWQgaXJfd3JpdGVfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkIGlyX3JlYWRfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyB2b2lkIGlyX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpOworc3RhdGljIHZvaWQgaXJfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpOwogCiBzdGF0aWMgdTggaXJfYmF1ZCA9IDA7CiBzdGF0aWMgdTggaXJfeGJvZiA9IDA7CkBAIC00OTcsNyArNDk3LDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGlyX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCBpcl9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXI7CiAJdW5zaWduZWQgaW50IGNmbGFnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKaW5kZXggNTNiZTgyNC4uOWQyZmRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCkBAIC0yNjQsNyArMjY0LDcgQEAKIAogCiBzdGF0aWMgdm9pZCBrZXlzcGFuX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCAKLQkJCQkgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKKwkJCQkgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJaW50CQkJCWJhdWRfcmF0ZSwgZGV2aWNlX3BvcnQ7CiAJc3RydWN0IGtleXNwYW5fcG9ydF9wcml2YXRlIAkqcF9wcml2OwpAQCAtMjMwNiwyMiArMjMwNiwxNiBAQAogCX0KIAogCS8qIE5vdyBmcmVlIHRoZW0gKi8KLQlpZiAoc19wcml2LT5pbnN0YXRfdXJiKQotCQl1c2JfZnJlZV91cmIoc19wcml2LT5pbnN0YXRfdXJiKTsKLQlpZiAoc19wcml2LT5nbG9jb250X3VyYikKLQkJdXNiX2ZyZWVfdXJiKHNfcHJpdi0+Z2xvY29udF91cmIpOworCXVzYl9mcmVlX3VyYihzX3ByaXYtPmluc3RhdF91cmIpOworCXVzYl9mcmVlX3VyYihzX3ByaXYtPmdsb2NvbnRfdXJiKTsKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwogCQlwX3ByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JCWlmIChwX3ByaXYtPmluYWNrX3VyYikKLQkJCXVzYl9mcmVlX3VyYihwX3ByaXYtPmluYWNrX3VyYik7Ci0JCWlmIChwX3ByaXYtPm91dGNvbnRfdXJiKQotCQkJdXNiX2ZyZWVfdXJiKHBfcHJpdi0+b3V0Y29udF91cmIpOworCQl1c2JfZnJlZV91cmIocF9wcml2LT5pbmFja191cmIpOworCQl1c2JfZnJlZV91cmIocF9wcml2LT5vdXRjb250X3VyYik7CiAJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCWlmIChwX3ByaXYtPmluX3VyYnNbal0pCi0JCQkJdXNiX2ZyZWVfdXJiKHBfcHJpdi0+aW5fdXJic1tqXSk7Ci0JCQlpZiAocF9wcml2LT5vdXRfdXJic1tqXSkKLQkJCQl1c2JfZnJlZV91cmIocF9wcml2LT5vdXRfdXJic1tqXSk7CisJCQl1c2JfZnJlZV91cmIocF9wcml2LT5pbl91cmJzW2pdKTsKKwkJCXVzYl9mcmVlX3VyYihwX3ByaXYtPm91dF91cmJzW2pdKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmgKaW5kZXggNzQ3MmVkNi4uNjQxM2Q3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5oCkBAIC01OSw3ICs1OSw3IEBACiAJCQkJCSB1bnNpZ25lZCBpbnQgY21kLAogCQkJCQkgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIHZvaWQga2V5c3Bhbl9zZXRfdGVybWlvcwkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCQkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKKwkJCQkJIHN0cnVjdCBrdGVybWlvcyAqb2xkKTsKIHN0YXRpYyB2b2lkIGtleXNwYW5fYnJlYWtfY3RsCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCQkJIGludCBicmVha19zdGF0ZSk7CiBzdGF0aWMgaW50ICBrZXlzcGFuX3Rpb2NtZ2V0CQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggOTA5MDA1MS4uMTI2Yjk3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTEyMCw2ICsxMjAsOCBAQAogCWludAkJCXR4X3Rocm90dGxlZDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCQl3YWtldXBfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCQl1bnRocm90dGxlX3dvcms7CisJc3RydWN0IHVzYl9zZXJpYWwJKnNlcmlhbDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CSpwb3J0OwogfTsKIAogCkBAIC0xNzUsOSArMTc3LDExIEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGtleXNwYW5fcGRhX3dha2V1cF93cml0ZSggc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCApCitzdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV93YWtldXBfd3JpdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCisJc3RydWN0IGtleXNwYW5fcGRhX3ByaXZhdGUgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGtleXNwYW5fcGRhX3ByaXZhdGUsIHdha2V1cF93b3JrKTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gcHJpdi0+cG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dHR5OwogCiAJLyogd2FrZSB1cCBwb3J0IHByb2Nlc3NlcyAqLwpAQCAtMTg3LDggKzE5MSwxMSBAQAogCXR0eV93YWtldXAodHR5KTsKIH0KIAotc3RhdGljIHZvaWQga2V5c3Bhbl9wZGFfcmVxdWVzdF91bnRocm90dGxlKCBzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsICkKK3N0YXRpYyB2b2lkIGtleXNwYW5fcGRhX3JlcXVlc3RfdW50aHJvdHRsZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGtleXNwYW5fcGRhX3ByaXZhdGUgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGtleXNwYW5fcGRhX3ByaXZhdGUsIHVudGhyb3R0bGVfd29yayk7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHByaXYtPnNlcmlhbDsKIAlpbnQgcmVzdWx0OwogCiAJZGJnKCIgcmVxdWVzdF91bnRocm90dGxlIik7CkBAIC0zNTgsNyArMzY1LDcgQEAKIAogCiBzdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgCi0JCQkJICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCQkJICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJdW5zaWduZWQgaW50IGNmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwpAQCAtNzY1LDExICs3NzIsMTAgQEAKIAkJcmV0dXJuICgxKTsgLyogZXJyb3IgKi8KIAl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdLCBwcml2KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJpYWwtPnBvcnRbMF0tPndyaXRlX3dhaXQpOwotCUlOSVRfV09SSygmcHJpdi0+d2FrZXVwX3dvcmssICh2b2lkICopa2V5c3Bhbl9wZGFfd2FrZXVwX3dyaXRlLAotCQkJKHZvaWQgKikoc2VyaWFsLT5wb3J0WzBdKSk7Ci0JSU5JVF9XT1JLKCZwcml2LT51bnRocm90dGxlX3dvcmssCi0JCQkodm9pZCAqKWtleXNwYW5fcGRhX3JlcXVlc3RfdW50aHJvdHRsZSwKLQkJCSh2b2lkICopKHNlcmlhbCkpOworCUlOSVRfV09SSygmcHJpdi0+d2FrZXVwX3dvcmssIGtleXNwYW5fcGRhX3dha2V1cF93cml0ZSk7CisJSU5JVF9XT1JLKCZwcml2LT51bnRocm90dGxlX3dvcmssIGtleXNwYW5fcGRhX3JlcXVlc3RfdW50aHJvdHRsZSk7CisJcHJpdi0+c2VyaWFsID0gc2VyaWFsOworCXByaXYtPnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CiAJcmV0dXJuICgwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKaW5kZXggMTdlMjA1Ni4uNzNkNzU1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCkBAIC04Niw3ICs4Niw3IEBACiAKIHN0YXRpYyB2b2lkIGtsc2lfMTA1X3JlYWRfYnVsa19jYWxsYmFjayAgKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZCBrbHNpXzEwNV9zZXRfdGVybWlvcyAgICAgICAgIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJCQkgIHN0cnVjdCB0ZXJtaW9zICogb2xkKTsKKwkJCQkJICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCk7CiBzdGF0aWMgaW50ICBrbHNpXzEwNV9pb2N0bAkgICAgICAgICAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCQkJICBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCQkJCSAgdW5zaWduZWQgaW50IGNtZCwKQEAgLTE2NCw3ICsxNjQsNyBAQAogI2RlZmluZSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUJNjQKIHN0cnVjdCBrbHNpXzEwNV9wcml2YXRlIHsKIAlzdHJ1Y3Qga2xzaV8xMDVfcG9ydF9zZXR0aW5ncwljZmc7Ci0Jc3RydWN0IHRlcm1pb3MJCQl0ZXJtaW9zOworCXN0cnVjdCBrdGVybWlvcwkJCXRlcm1pb3M7CiAJdW5zaWduZWQgbG9uZwkJCWxpbmVfc3RhdGU7IC8qIG1vZGVtIGxpbmUgc2V0dGluZ3MgKi8KIAkvKiB3cml0ZSBwb29sICovCiAJc3RydWN0IHVyYiAqCQkJd3JpdGVfdXJiX3Bvb2xbTlVNX1VSQlNdOwpAQCAtNjg4LDcgKzY4OCw3IEBACiAKIAogc3RhdGljIHZvaWQga2xzaV8xMDVfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCQkJICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCQkJICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCBrbHNpXzEwNV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGludCBpZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYwppbmRleCBmZjAzMzMxLi42MmJlYTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAlpbnQgY3VyX3BvczsgLy8gaW5kZXggb2YgdGhlIG5leHQgY2hhciB0byBzZW5kIGluIGJ1ZgogCV9fdTE2IGRldmljZV90eXBlOwogCWludCBsaW5lX3N0YXRlOwotCXN0cnVjdCB0ZXJtaW9zIGludGVybmFsX3Rlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zIGludGVybmFsX3Rlcm1pb3M7CiB9OwogCiAKQEAgLTE4NSwxMyArMTg1LDExIEBACiAgIAogIAlmb3IgKGkgPSAwOyBpIDwgYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKIAkJZW5kcG9pbnQgPSAmYWx0c2V0dGluZy0+ZW5kcG9pbnRbaV07Ci0JCWlmICgoKGVuZHBvaW50LT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSAmJiAKLSAJCSAgICAoKGVuZHBvaW50LT5kZXNjLmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7CisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X291dCgmZW5kcG9pbnQtPmRlc2MpKSB7CiAJCSAJZGJnKCIlcyBGb3VuZCBpbnRlcnJ1cHQgb3V0IGVuZHBvaW50LiBBZGRyZXNzOiAlZCIsIF9fRlVOQ1RJT05fXywgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CiAJCSAJcHJpdi0+d3JpdGVfaW50X2VuZHBvaW50X2FkZHJlc3MgPSBlbmRwb2ludC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogIAkJfQotIAkJaWYgKCgoZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikgJiYgCi0gCQkgICAgKChlbmRwb2ludC0+ZGVzYy5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSkgeworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbigmZW5kcG9pbnQtPmRlc2MpKSB7CiAJCSAJZGJnKCIlcyBGb3VuZCBpbnRlcnJ1cHQgaW4gIGVuZHBvaW50LiBBZGRyZXNzOiAlZCIsIF9fRlVOQ1RJT05fXywgZW5kcG9pbnQtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CiAJCSAJcHJpdi0+cmVhZF9pbnRfZW5kcG9pbnRfYWRkcmVzcyA9IGVuZHBvaW50LT5kZXNjLmJFbmRwb2ludEFkZHJlc3M7CiAJIAl9CkBAIC0yNzEsNyArMjY5LDcgQEAKIAl9CiAKIAkvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdyaXRlX3VyYiB0cmFuc2ZlciBidWZmZXIKLQlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2Mod3JpdGVfdXJiX3RyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIEdGUF9LRVJORUwpOworCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyh3cml0ZV91cmJfdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKIAkJa2ZyZWUodHJhbnNmZXJfYnVmZmVyKTsKIAkJdXNiX2ZyZWVfdXJiKHBvcnQtPndyaXRlX3VyYik7CkBAIC0zNTUsOCArMzUzLDcgQEAKIAkJdXNiX2ZyZWVfdXJiKCBwb3J0LT53cml0ZV91cmIgKTsKIAkJcG9ydC0+d3JpdGVfdXJiID0gTlVMTDsKIAl9Ci0JaWYgKHBvcnQtPmludGVycnVwdF9pbl91cmIpCi0JCXVzYl9raWxsX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CiB9CiAKIApAQCAtNjI3LDExICs2MjQsMTEgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBUQ0dFVFM6ICAgLy8gMHg1NDAxCi0JCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXNlcl9hcmcsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpKSB7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXNlcl9hcmcsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKSkgewogCQkJZGJnKCIlcyAtIHBvcnQgJWQgRXJyb3IgaW4gYWNjZXNzX29rIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KLQkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLAorCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3Qga3Rlcm1pb3MgX191c2VyICopYXJnLAogCQkJCQkJICAgJnByaXYtPmludGVybmFsX3Rlcm1pb3MpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwpAQCAtNjQxLDEyICs2MzgsMTIgQEAKIAkJCWRiZygiJXMgLSBwb3J0ICVkIEVycm9yOiBwb3J0LT50dHktPnRlcm1pb3MgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIAkJCXJldHVybiAtRU5PVFRZOwogCQl9Ci0JCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1c2VyX2FyZywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkpIHsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVzZXJfYXJnLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSkpIHsKIAkJCWRiZygiJXMgLSBwb3J0ICVkIEVycm9yIGluIGFjY2Vzc19vayIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJCWlmICh1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoJnByaXYtPmludGVybmFsX3Rlcm1pb3MsCi0JCQkJCQkgICAoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnKSkKKwkJCQkJCSAgIChzdHJ1Y3Qga3Rlcm1pb3MgX191c2VyICopYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQkKIAkJc2V0dGluZ3MgPSBremFsbG9jKDUwLCBHRlBfS0VSTkVMKTsKQEAgLTY5OSw3ICs2OTYsNyBAQAogCQlyZXR1cm4gMDsKIAogCWNhc2UgVENGTFNIOiAgIC8vIDB4NTQwQgotCQl0cmFuc2Zlcl9idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIEdGUF9LRVJORUwpOworCQl0cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIEdGUF9LRVJORUwpOwogCQlpZiAoISB0cmFuc2Zlcl9idWZmZXIpIHsKIAkJIAlyZXR1cm4gLUVOT0JVRlM7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKaW5kZXggYjc1ODJjYy4uMzhiMWQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBzdGF0aWMgdm9pZCBtY3RfdTIzMl9yZWFkX2ludF9jYWxsYmFjayAgIChzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIHZvaWQgbWN0X3UyMzJfc2V0X3Rlcm1pb3MgICAgICAgICAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQkJICBzdHJ1Y3QgdGVybWlvcyAqIG9sZCk7CisJCQkJCSAgc3RydWN0IGt0ZXJtaW9zICogb2xkKTsKIHN0YXRpYyBpbnQgIG1jdF91MjMyX2lvY3RsCSAgICAgICAgIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZSwKIAkJCQkJICB1bnNpZ25lZCBpbnQgY21kLApAQCAtMzU4LDEwICszNTgsOCBAQAogCS8qIFB1aCwgdGhhdCdzIGRpcnR5ICovCiAJcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlycG9ydCA9IHNlcmlhbC0+cG9ydFsxXTsKLQlpZiAocG9ydC0+cmVhZF91cmIpIHsKLQkJLyogTm8gdW5saW5raW5nLCBpdCB3YXNuJ3Qgc3VibWl0dGVkIHlldC4gKi8KLQkJdXNiX2ZyZWVfdXJiKHBvcnQtPnJlYWRfdXJiKTsKLQl9CisJLyogTm8gdW5saW5raW5nLCBpdCB3YXNuJ3Qgc3VibWl0dGVkIHlldC4gKi8KKwl1c2JfZnJlZV91cmIocG9ydC0+cmVhZF91cmIpOwogCXBvcnQtPnJlYWRfdXJiID0gcnBvcnQtPmludGVycnVwdF9pbl91cmI7CiAJcnBvcnQtPmludGVycnVwdF9pbl91cmIgPSBOVUxMOwogCXBvcnQtPnJlYWRfdXJiLT5jb250ZXh0ID0gcG9ydDsKQEAgLTU1OCw3ICs1NTYsNyBAQAogfSAvKiBtY3RfdTIzMl9yZWFkX2ludF9jYWxsYmFjayAqLwogCiBzdGF0aWMgdm9pZCBtY3RfdTIzMl9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQkgIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKKwkJCQkgIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3QgbWN0X3UyMzJfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWY0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCkBAIC0wLDAgKzEsMTY4MyBAQAorLyoKKyAqIG1vczc3MjAuYworICogICBDb250cm9scyB0aGUgTW9zY2hpcCA3NzIwIHVzYiB0byBkdWFsIHBvcnQgc2VyaWFsIGNvbnZlcnRvcgorICoKKyAqIENvcHlyaWdodCAyMDA2IE1vc2NoaXAgU2VtaWNvbmR1Y3RvciBUZWNoLiBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogRGV2ZWxvcGVkIGJ5OgorICogCVZpamF5YUt1bWFyLkcuTi4gPHZpamF5a3VtYXJAYXNwaXJlY29tLm5ldD4KKyAqCUFqYXlLdW1hciA8YWpheUBhc3BpcmVjb20ubmV0PgorICoJR3VydWRldmEuTi4gPGd1cnVkZXZAYXNwaXJlY29tLm5ldD4KKyAqCisgKiBDbGVhbmVkIHVwIGZyb20gdGhlIG9yaWdpbmFsIGJ5OgorICoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKyAqCisgKiBPcmlnaW5hbGx5IGJhc2VkIG9uIGRyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jIHdoaWNoIGlzOgorICoJQ29weXJpZ2h0IChDKSAyMDAwIEluc2lkZSBPdXQgTmV0d29ya3MsIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKglDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8qCisgKiBWZXJzaW9uIEluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjEuMC4wLjRGIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJBc3BpcmUgQ29tbXVuaWNhdGlvbnMgcHZ0IEx0ZC4iCisjZGVmaW5lIERSSVZFUl9ERVNDICJNb3NjaGlwIFVTQiBTZXJpYWwgRHJpdmVyIgorCisvKiBkZWZhdWx0IHVyYiB0aW1lb3V0ICovCisjZGVmaW5lIE1PU19XRFJfVElNRU9VVAkoSFogKiA1KQorCisjZGVmaW5lIE1PU19QT1JUMQkweDAyMDAKKyNkZWZpbmUgTU9TX1BPUlQyCTB4MDMwMAorI2RlZmluZSBNT1NfVkVOUkVHCTB4MDAwMAorI2RlZmluZSBNT1NfTUFYX1BPUlQJMHgwMgorI2RlZmluZSBNT1NfV1JJVEUJMHgwRQorI2RlZmluZSBNT1NfUkVBRAkweDBECisKKy8qIEludGVycnVwdCBSb3RpbnVlIERlZmluZXMJKi8KKyNkZWZpbmUgU0VSSUFMX0lJUl9STFMJMHgwNgorI2RlZmluZSBTRVJJQUxfSUlSX1JEQQkweDA0CisjZGVmaW5lIFNFUklBTF9JSVJfQ1RJCTB4MGMKKyNkZWZpbmUgU0VSSUFMX0lJUl9USFIJMHgwMgorI2RlZmluZSBTRVJJQUxfSUlSX01TCTB4MDAKKworI2RlZmluZSBOVU1fVVJCUwkJCTE2CS8qIFVSQiBDb3VudCAqLworI2RlZmluZSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUJMzIJLyogVVJCIFNpemUgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIG9mIHRoZSBsb2NhbCBwb3J0IGluZm9ybWF0aW9uICovCitzdHJ1Y3QgbW9zY2hpcF9wb3J0Cit7CisJX191OAlzaGFkb3dMQ1I7CQkvKiBsYXN0IExDUiB2YWx1ZSByZWNlaXZlZCAqLworCV9fdTgJc2hhZG93TUNSOwkJLyogbGFzdCBNQ1IgdmFsdWUgcmVjZWl2ZWQgKi8KKwlfX3U4CXNoYWRvd01TUjsJCS8qIGxhc3QgTVNSIHZhbHVlIHJlY2VpdmVkICovCisJY2hhcgkJCW9wZW47CisJc3RydWN0IGFzeW5jX2ljb3VudAlpY291bnQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydAkqcG9ydDsJLyogbG9vcCBiYWNrIHRvIHRoZSBvd25lciAqLworCXN0cnVjdCB1cmIJCSp3cml0ZV91cmJfcG9vbFtOVU1fVVJCU107Cit9OworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgb2YgdGhlIGluZGl2aWR1YWwgc2VyaWFsIGRldmljZSBpbmZvcm1hdGlvbiAqLworc3RydWN0IG1vc2NoaXBfc2VyaWFsCit7CisJaW50IGludGVycnVwdF9zdGFydGVkOworfTsKKworc3RhdGljIGludCBkZWJ1ZzsKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX01PU0NISVAJCTB4OTcxMAorI2RlZmluZSBNT1NDSElQX0RFVklDRV9JRF83NzIwCQkweDc3MjAKKyNkZWZpbmUgTU9TQ0hJUF9ERVZJQ0VfSURfNzcxNQkJMHg3NzE1CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtb3NjaGlwX3BvcnRfaWRfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTU9TQ0hJUCxNT1NDSElQX0RFVklDRV9JRF83NzIwKSB9LAorCXsgfSAvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBtb3NjaGlwX3BvcnRfaWRfdGFibGUpOworCisKKy8qCisgKiBtb3M3NzIwX2ludGVycnVwdF9jYWxsYmFjaworICoJdGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gd2UgaGF2ZSByZWNlaXZlZCBkYXRhIG9uIHRoZQorICoJaW50ZXJydXB0IGVuZHBvaW50LgorICovCitzdGF0aWMgdm9pZCBtb3M3NzIwX2ludGVycnVwdF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgbGVuZ3RoOworCV9fdTMyICpkYXRhOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJX191OCBzcDE7CisJX191OCBzcDI7CisJX191OCBzdDsKKworCWRiZygiJXMiLCIgOiBFbnRlcmluZ1xuIik7CisKKwlpZiAoIXVyYikgeworCQlkYmcoIiVzIiwiSW52YWxpZCBQb2ludGVyICEhISE6XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLAorCQkgICAgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCSAgICB1cmItPnN0YXR1cyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlsZW5ndGggPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCisJLyogTW9zY2hpcCBnZXQgNCBieXRlcworCSAqIEJ5dGUgMSBJSVIgUG9ydCAxIChwb3J0Lm51bWJlciBpcyAwKQorCSAqIEJ5dGUgMiBJSVIgUG9ydCAyIChwb3J0Lm51bWJlciBpcyAxKQorCSAqIEJ5dGUgMyAtLS0tLS0tLS0tLS0tLQorCSAqIEJ5dGUgNCBGSUZPIHN0YXR1cyBmb3IgYm90aCAqLworCWlmIChsZW5ndGggJiYgbGVuZ3RoID4gNCkgeworCQlkYmcoIldyb25nIGRhdGEgISEhIik7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXMgPSAqZGF0YTsKKworCXNwMSA9IChzdGF0dXMgJiAweGZmMDAwMDAwKT4+MjQ7CisJc3AyID0gKHN0YXR1cyAmIDB4MDBmZjAwMDApPj4xNjsKKwlzdCA9IHN0YXR1cyAmIDB4MDAwMDAwZmY7CisKKwlpZiAoKHNwMSAmIDB4MDEpIHx8IChzcDIgJiAweDAxKSkgeworCQkvKiBObyBJbnRlcnJ1cHQgUGVuZGluZyBpbiBib3RoIHRoZSBwb3J0cyAqLworCQlkYmcoIk5vIEludGVycnVwdCAhISEiKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHNwMSAmIDB4MGYpIHsKKwkJY2FzZSBTRVJJQUxfSUlSX1JMUzoKKwkJCWRiZygiU2VyaWFsIFBvcnQgMTogUmVjZWl2ZXIgc3RhdHVzIGVycm9yIG9yIGFkZHJlc3MgIgorCQkJICAgICJiaXQgZGV0ZWN0ZWQgaW4gOS1iaXQgbW9kZVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTRVJJQUxfSUlSX0NUSToKKwkJCWRiZygiU2VyaWFsIFBvcnQgMTogUmVjZWl2ZXIgdGltZSBvdXQiKTsKKwkJCWJyZWFrOworCQljYXNlIFNFUklBTF9JSVJfTVM6CisJCQlkYmcoIlNlcmlhbCBQb3J0IDE6IE1vZGVtIHN0YXR1cyBjaGFuZ2UiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChzcDIgJiAweDBmKSB7CisJCWNhc2UgU0VSSUFMX0lJUl9STFM6CisJCQlkYmcoIlNlcmlhbCBQb3J0IDI6IFJlY2VpdmVyIHN0YXR1cyBlcnJvciBvciBhZGRyZXNzICIKKwkJCSAgICAiYml0IGRldGVjdGVkIGluIDktYml0IG1vZGUiKTsKKwkJCWJyZWFrOworCQljYXNlIFNFUklBTF9JSVJfQ1RJOgorCQkJZGJnKCJTZXJpYWwgUG9ydCAyOiBSZWNlaXZlciB0aW1lIG91dCIpOworCQkJYnJlYWs7CisJCWNhc2UgU0VSSUFMX0lJUl9NUzoKKwkJCWRiZygiU2VyaWFsIFBvcnQgMjogTW9kZW0gc3RhdHVzIGNoYW5nZSIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2V4aXQ6CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVzdWx0KQorCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwKKwkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBtb3M3NzIwX2J1bGtfaW5fY2FsbGJhY2sKKyAqCXRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIHdlIGhhdmUgcmVjZWl2ZWQgZGF0YSBvbiB0aGUKKyAqCWJ1bGsgaW4gZW5kcG9pbnQuCisgKi8KK3N0YXRpYyB2b2lkIG1vczc3MjBfYnVsa19pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyICpkYXRhIDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJaWYgKHVyYi0+c3RhdHVzKSB7CisJCWRiZygibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJbW9zNzcyMF9wb3J0ID0gdXJiLT5jb250ZXh0OworCWlmICghbW9zNzcyMF9wb3J0KSB7CisJCWRiZygiJXMiLCJOVUxMIG1vczc3MjBfcG9ydCBwb2ludGVyIFxuIik7CisJCXJldHVybiA7CisJfQorCisJcG9ydCA9IG1vczc3MjBfcG9ydC0+cG9ydDsKKworCWRiZygiRW50ZXJpbmcuLi4lcyIsIF9fRlVOQ1RJT05fXyk7CisKKwlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKHR0eSAmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwl9CisKKwlpZiAoIXBvcnQtPnJlYWRfdXJiKSB7CisJCWRiZygiVVJCIEtJTExFRCAhISEiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwb3J0LT5yZWFkX3VyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgeworCQlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CisKKwkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3RhdHVzKQorCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAorCQkJICAgIHN0YXR1cyk7CisJfQorfQorCisvKgorICogbW9zNzcyMF9idWxrX291dF9kYXRhX2NhbGxiYWNrCisgKgl0aGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB3ZSBoYXZlIGZpbmlzaGVkIHNlbmRpbmcgc2VyaWFsCisgKglkYXRhIG9uIHRoZSBidWxrIG91dCBlbmRwb2ludC4KKyAqLworc3RhdGljIHZvaWQgbW9zNzcyMF9idWxrX291dF9kYXRhX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlkYmcoIm5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6JWQiLCB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwltb3M3NzIwX3BvcnQgPSB1cmItPmNvbnRleHQ7CisJaWYgKCFtb3M3NzIwX3BvcnQpIHsKKwkJZGJnKCJOVUxMIG1vczc3MjBfcG9ydCBwb2ludGVyIik7CisJCXJldHVybiA7CisJfQorCisJZGJnKCJFbnRlcmluZyAuLi4uLi4uLi4iKTsKKworCXR0eSA9IG1vczc3MjBfcG9ydC0+cG9ydC0+dHR5OworCisJaWYgKHR0eSAmJiBtb3M3NzIwX3BvcnQtPm9wZW4pIHsKKwkJLyogbGV0IHRoZSB0dHkgZHJpdmVyIHdha2V1cCBpZiBpdCBoYXMgYSBzcGVjaWFsICoKKwkJICogd3JpdGVfd2FrZXVwIGZ1bmN0aW9uICovCisJCWlmICgodHR5LT5mbGFncyAmICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApKSAmJgorCQkgICAgIHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKQorCQkJKHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKSh0dHkpOworCisJCS8qIHRlbGwgdGhlIHR0eSBkcml2ZXIgdGhhdCBzb21ldGhpbmcgaGFzIGNoYW5nZWQgKi8KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KKworCS8qIHNjaGVkdWxlX3dvcmsoJm1vczc3MjBfcG9ydC0+cG9ydC0+d29yayk7ICovCit9CisKKy8qCisgKiBzZW5kX21vc19jbWQKKyAqCXRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VuZF9tb3NfY21kKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIF9fdTggcmVxdWVzdCwgX191MTYgdmFsdWUsCisJCQlfX3UxNiBpbmRleCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBwaXBlOworCXUxNiBwcm9kdWN0ID0gbGUxNl90b19jcHUoc2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwlfX3U4IHJlcXVlc3R0eXBlOworCV9fdTE2IHNpemUgPSAweDAwMDA7CisKKwlpZiAodmFsdWUgPCBNT1NfTUFYX1BPUlQpIHsKKwkJaWYgKHByb2R1Y3QgPT0gTU9TQ0hJUF9ERVZJQ0VfSURfNzcxNSkgeworCQkJdmFsdWUgPSB2YWx1ZSoweDEwMCsweDEwMDsKKwkJfSBlbHNlIHsKKwkJCXZhbHVlID0gdmFsdWUqMHgxMDArMHgyMDA7CisJCX0KKwl9IGVsc2UgeworCQl2YWx1ZSA9IDB4MDAwMDsKKwkJaWYgKChwcm9kdWN0ID09IE1PU0NISVBfREVWSUNFX0lEXzc3MTUpICYmCisJCSAgICAoaW5kZXggIT0gMHgwOCkpIHsKKwkJCWRiZygic2VyaWFsLT5wcm9kdWN0PT0gTU9TQ0hJUF9ERVZJQ0VfSURfNzcxNSIpOworCQkJLy9pbmRleCA9IDB4MDEgOworCQl9CisJfQorCisJaWYgKHJlcXVlc3QgPT0gTU9TX1dSSVRFKSB7CisJCXJlcXVlc3QgPSAoX191OClNT1NfV1JJVEU7CisJCXJlcXVlc3R0eXBlID0gKF9fdTgpMHg0MDsKKwkJdmFsdWUgID0gdmFsdWUgKyAoX191MTYpKigodW5zaWduZWQgY2hhciAqKWRhdGEpOworCQlkYXRhID0gTlVMTDsKKwkJcGlwZSA9IHVzYl9zbmRjdHJscGlwZShzZXJpYWwtPmRldiwgMCk7CisJfSBlbHNlIHsKKwkJcmVxdWVzdCA9IChfX3U4KU1PU19SRUFEOworCQlyZXF1ZXN0dHlwZSA9IChfX3U4KTB4QzA7CisJCXNpemUgPSAweDAxOworCQlwaXBlID0gdXNiX3JjdmN0cmxwaXBlKHNlcmlhbC0+ZGV2LDApOworCX0KKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdWVzdHR5cGUsCisJCQkJIHZhbHVlLCBpbmRleCwgZGF0YSwgc2l6ZSwgTU9TX1dEUl9USU1FT1VUKTsKKworCWlmIChzdGF0dXMgPCAwKQorCQlkYmcoIkNvbW1hbmQgV3JpdGUgZmFpbGVkIFZhbHVlICV4IGluZGV4ICV4XG4iLHZhbHVlLGluZGV4KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbW9zNzcyMF9vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQwOworCXN0cnVjdCB1cmIgKnVyYjsKKwlzdHJ1Y3QgbW9zY2hpcF9zZXJpYWwgKm1vczc3MjBfc2VyaWFsOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydDsKKwlpbnQgcmVzcG9uc2U7CisJaW50IHBvcnRfbnVtYmVyOworCWNoYXIgZGF0YTsKKwlpbnQgajsKKworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCW1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcG9ydDAgPSBzZXJpYWwtPnBvcnRbMF07CisKKwltb3M3NzIwX3NlcmlhbCA9IHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKKworCWlmIChtb3M3NzIwX3NlcmlhbCA9PSBOVUxMIHx8IHBvcnQwID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPndyaXRlX3VyYi0+cGlwZSk7CisJdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIHBvcnQtPnJlYWRfdXJiLT5waXBlKTsKKworCS8qIEluaXRpYWxpc2luZyB0aGUgd3JpdGUgdXJiIHBvb2wgKi8KKwlmb3IgKGogPSAwOyBqIDwgTlVNX1VSQlM7ICsraikgeworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsR0ZQX0FUT01JQyk7CisJCW1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0gPSB1cmI7CisKKwkJaWYgKHVyYiA9PSBOVUxMKSB7CisJCQllcnIoIk5vIG1vcmUgdXJicz8/PyIpOworCQkJY29udGludWU7CisJCX0KKworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKKwkJCWVycigiJXMtb3V0IG9mIG1lbW9yeSBmb3IgdXJiIGJ1ZmZlcnMuIiwgX19GVU5DVElPTl9fKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJIC8qIEluaXRpYWxpemUgTUNTNzcyMCAtLSBXcml0ZSBJbml0IHZhbHVlcyB0byBjb3JyZXNwb25kaW5nIFJlZ2lzdGVycworCSAgKgorCSAgKiBSZWdpc3RlciBJbmRleAorCSAgKiAxIDogSUVSCisJICAqIDIgOiBGQ1IKKwkgICogMyA6IExDUgorCSAgKiA0IDogTUNSCisJICAqCisJICAqIDB4MDggOiBTUDEvMiBDb250cm9sIFJlZworCSAgKi8KKwlwb3J0X251bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7CisJc2VuZF9tb3NfY21kKHBvcnQtPnNlcmlhbCwgTU9TX1JFQUQsIHBvcnRfbnVtYmVyLCBVQVJUX0xTUiwgJmRhdGEpOworCWRiZygiU1M6OiVwIExTUjoleFxuIixtb3M3NzIwX3BvcnQsIGRhdGEpOworCisJZGJnKCJDaGVjazpTZW5kaW5nIENvbW1hbmQgLi4uLi4uLi4uLiIpOworCisJZGF0YSA9IDB4MDI7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBNT1NfTUFYX1BPUlQsIDB4MDEsICZkYXRhKTsKKwlkYXRhID0gMHgwMjsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgMHgwMiwgJmRhdGEpOworCisJZGF0YSA9IDB4MDA7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMSwgJmRhdGEpOworCWRhdGEgPSAweDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDIsICZkYXRhKTsKKworCWRhdGEgPSAweENGOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDIsICZkYXRhKTsKKwlkYXRhID0gMHgwMzsKKyAgICAgICAgbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgID0gZGF0YTsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAzLCAmZGF0YSk7CisJZGF0YSA9IDB4MGI7CisgICAgICAgIG1vczc3MjBfcG9ydC0+c2hhZG93TUNSICA9IGRhdGE7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwNCwgJmRhdGEpOworCWRhdGEgPSAweDBiOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDQsICZkYXRhKTsKKworCWRhdGEgPSAweDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19SRUFELCBNT1NfTUFYX1BPUlQsIDB4MDgsICZkYXRhKTsKKwlkYXRhID0gMHgwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgMHgwOCwgJmRhdGEpOworCisvKglkYXRhID0gMHgwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfUkVBRCwgTU9TX01BWF9QT1JULCBwb3J0X251bWJlciArIDEsICZkYXRhKTsKKwlkYXRhID0gMHgwMzsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgcG9ydF9udW1iZXIgKyAxLCAmZGF0YSk7CisJZGF0YSA9IDB4MDA7CisJc2VuZF9tb3NfY21kKHBvcnQtPnNlcmlhbCwgTU9TX1dSSVRFLCBNT1NfTUFYX1BPUlQsIHBvcnRfbnVtYmVyICsgMSwgJmRhdGEpOworKi8KKwlkYXRhID0gMHgwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfUkVBRCwgTU9TX01BWF9QT1JULCAweDA4LCAmZGF0YSk7CisKKwlkYXRhID0gZGF0YSB8IChwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yICsgMSk7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBNT1NfTUFYX1BPUlQsIDB4MDgsICZkYXRhKTsKKworCWRhdGEgPSAweDgzOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAgPSBkYXRhOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDMsICZkYXRhKTsKKwlkYXRhID0gMHgwYzsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAwLCAmZGF0YSk7CisJZGF0YSA9IDB4MDA7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMSwgJmRhdGEpOworCWRhdGEgPSAweDAzOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAgPSBkYXRhOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDMsICZkYXRhKTsKKwlkYXRhID0gMHgwYzsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAxLCAmZGF0YSk7CisJZGF0YSA9IDB4MGM7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMSwgJmRhdGEpOworCisvL01hdHJpeAorCisJLyogZm9yY2UgbG93X2xhdGVuY3kgb24gc28gdGhhdCBvdXIgdHR5X3B1c2ggYWN0dWFsbHkgZm9yY2VzICoKKwkgKiB0aGUgZGF0YSB0aHJvdWdoLG90aGVyd2lzZSBpdCBpcyBzY2hlZHVsZWQsIGFuZCB3aXRoICAgICAgKgorCSAqIGhpZ2ggZGF0YSByYXRlcyAobGlrZSB3aXRoIE9IQ0kpIGRhdGEgY2FuIGdldCBsb3N0LiAgICAgICAqLworCisJaWYgKHBvcnQtPnR0eSkKKwkJcG9ydC0+dHR5LT5sb3dfbGF0ZW5jeSA9IDE7CisKKwkvKiBzZWUgaWYgd2UndmUgc2V0IHVwIG91ciBlbmRwb2ludCBpbmZvIHlldCAgICoKKwkgKiAoY2FuJ3Qgc2V0IGl0IHVwIGluIG1vczc3MjBfc3RhcnR1cCBhcyB0aGUgICoKKwkgKiBzdHJ1Y3R1cmVzIHdlcmUgbm90IHNldCB1cCBhdCB0aGF0IHRpbWUuKSAgICovCisJaWYgKCFtb3M3NzIwX3NlcmlhbC0+aW50ZXJydXB0X3N0YXJ0ZWQpIHsKKwkJZGJnKCJJbnRlcnJ1cHQgYnVmZmVyIE5VTEwgISEhIik7CisKKwkJLyogbm90IHNldCB1cCB5ZXQsIHNvIGRvIGl0IG5vdyAqLworCQltb3M3NzIwX3NlcmlhbC0+aW50ZXJydXB0X3N0YXJ0ZWQgPSAxOworCisJCWRiZygiVG8gU3VibWl0IFVSQiAhISEiKTsKKworCQkvKiBzZXQgdXAgb3VyIGludGVycnVwdCB1cmIgKi8KKwkJdXNiX2ZpbGxfaW50X3VyYihwb3J0MC0+aW50ZXJydXB0X2luX3VyYiwgc2VyaWFsLT5kZXYsCisJCQkJIHVzYl9yY3ZpbnRwaXBlKHNlcmlhbC0+ZGV2LAorCQkJCSAJCXBvcnQtPmludGVycnVwdF9pbl9lbmRwb2ludEFkZHJlc3MpLAorCQkJCSBwb3J0MC0+aW50ZXJydXB0X2luX2J1ZmZlciwKKwkJCQkgcG9ydDAtPmludGVycnVwdF9pbl91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJIG1vczc3MjBfaW50ZXJydXB0X2NhbGxiYWNrLCBtb3M3NzIwX3BvcnQsCisJCQkJIHBvcnQwLT5pbnRlcnJ1cHRfaW5fdXJiLT5pbnRlcnZhbCk7CisKKwkJLyogc3RhcnQgaW50ZXJydXB0IHJlYWQgZm9yIHRoaXMgbW9zNzcyMCB0aGlzIGludGVycnVwdCAqCisJICAgICAgICAgKiB3aWxsIGNvbnRpbnVlIGFzIGxvbmcgYXMgdGhlIG1vczc3MjAgaXMgY29ubmVjdGVkICAgICovCisJCWRiZygiU3VibWl0IFVSQiBvdmVyICEhISIpOworCQlyZXNwb25zZSA9IHVzYl9zdWJtaXRfdXJiKHBvcnQwLT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJlc3BvbnNlKQorCQkJZGV2X2VycigmcG9ydC0+ZGV2LAorCQkJCSIlcyAtIEVycm9yICVkIHN1Ym1pdHRpbmcgY29udHJvbCB1cmIiLAorCQkJCV9fRlVOQ1RJT05fXywgcmVzcG9uc2UpOworCX0KKworCS8qIHNldCB1cCBvdXIgYnVsayBpbiB1cmIgKi8KKwl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgc2VyaWFsLT5kZXYsCisJCQkgIHVzYl9yY3ZidWxrcGlwZShzZXJpYWwtPmRldiwKKwkJCSAgCQkgIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKKwkJCSAgcG9ydC0+YnVsa19pbl9idWZmZXIsCisJCQkgIHBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJICBtb3M3NzIwX2J1bGtfaW5fY2FsbGJhY2ssIG1vczc3MjBfcG9ydCk7CisJcmVzcG9uc2UgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlc3BvbnNlKQorCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIHJlYWQgdXJiIiwgX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisKKwkvKiBpbml0aWFsaXplIG91ciBpY291bnQgc3RydWN0dXJlICovCisJbWVtc2V0KCYobW9zNzcyMF9wb3J0LT5pY291bnQpLCAweDAwLCBzaXplb2YobW9zNzcyMF9wb3J0LT5pY291bnQpKTsKKworCS8qIGluaXRpYWxpemUgb3VyIHBvcnQgc2V0dGluZ3MgKi8KKwltb3M3NzIwX3BvcnQtPnNoYWRvd01DUiA9IFVBUlRfTUNSX09VVDI7IC8qIE11c3Qgc2V0IHRvIGVuYWJsZSBpbnRzISAqLworCisJLyogc2VuZCBhIG9wZW4gcG9ydCBjb21tYW5kICovCisJbW9zNzcyMF9wb3J0LT5vcGVuID0gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogbW9zNzcyMF9jaGFyc19pbl9idWZmZXIKKyAqCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHdoZW4gaXQgd2FudHMgdG8ga25vdyBob3cgbWFueQorICoJYnl0ZXMgb2YgZGF0YSB3ZSBjdXJyZW50bHkgaGF2ZSBvdXRzdGFuZGluZyBpbiB0aGUgcG9ydCAoZGF0YSB0aGF0IGhhcworICoJYmVlbiB3cml0dGVuLCBidXQgaGFzbid0IG1hZGUgaXQgb3V0IHRoZSBwb3J0IHlldCkKKyAqCUlmIHN1Y2Nlc3NmdWwsIHdlIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gYmUgd3JpdHRlbiBpbiB0aGUKKyAqCXN5c3RlbSwKKyAqCU90aGVyd2lzZSB3ZSByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQgbW9zNzcyMF9jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgY2hhcnMgPSAwOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydDsKKworCWRiZygiJXM6ZW50ZXJpbmcgLi4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCisJbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkgeworCQlkYmcoIiVzOmxlYXZpbmcgLi4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1VSQlM7ICsraSkgeworCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXS0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJCWNoYXJzICs9IFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRTsKKwl9CisJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIGNoYXJzKTsKKwlyZXR1cm4gY2hhcnM7Cit9CisKK3N0YXRpYyB2b2lkIG1vczc3MjBfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJY2hhciBkYXRhOworCWludCBqOworCisJZGJnKCJtb3M3NzIwX2Nsb3NlOmVudGVyaW5nLi4uIik7CisKKwlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisKKwltb3M3NzIwX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGogPSAwOyBqIDwgTlVNX1VSQlM7ICsraikKKwkJdXNiX2tpbGxfdXJiKG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0pOworCisJLyogRnJlZWluZyBXcml0ZSBVUkJzICovCisJZm9yIChqID0gMDsgaiA8IE5VTV9VUkJTOyArK2opIHsKKwkJaWYgKG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0pIHsKKwkJCWtmcmVlKG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0tPnRyYW5zZmVyX2J1ZmZlcik7CisJCQl1c2JfZnJlZV91cmIobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSk7CisJCX0KKwl9CisKKwkvKiBXaGlsZSBjbG9zaW5nIHBvcnQsIHNodXRkb3duIGFsbCBidWxrIHJlYWQsIHdyaXRlICAqCisJICogYW5kIGludGVycnVwdCByZWFkIGlmIHRoZXkgZXhpc3RzICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoc2VyaWFsLT5kZXYpIHsKKwkJZGJnKCJTaHV0ZG93biBidWxrIHdyaXRlIik7CisJCXVzYl9raWxsX3VyYihwb3J0LT53cml0ZV91cmIpOworCQlkYmcoIlNodXRkb3duIGJ1bGsgcmVhZCIpOworCQl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOworCX0KKworCWRhdGEgPSAweDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vciwKKwkJICAgICAweDA0LCAmZGF0YSk7CisKKwlkYXRhID0gMHgwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3IsCisJCSAgICAgMHgwMSwgJmRhdGEpOworCisJbW9zNzcyMF9wb3J0LT5vcGVuID0gMDsKKworCWRiZygiTGVhdmluZyAlcyIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3N0YXRpYyB2b2lkIG1vczc3MjBfYnJlYWsoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGE7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisKKwlkYmcoIkVudGVyaW5nICVzIiwgX19GVU5DVElPTl9fKTsKKworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCW1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChicmVha19zdGF0ZSA9PSAtMSkKKwkJZGF0YSA9IG1vczc3MjBfcG9ydC0+c2hhZG93TENSIHwgVUFSVF9MQ1JfU0JDOworCWVsc2UKKwkJZGF0YSA9IG1vczc3MjBfcG9ydC0+c2hhZG93TENSICYgflVBUlRfTENSX1NCQzsKKworCW1vczc3MjBfcG9ydC0+c2hhZG93TENSICA9IGRhdGE7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yLAorCQkgICAgIDB4MDMsICZkYXRhKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIG1vczc3MjBfd3JpdGVfcm9vbQorICoJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgd2hlbiBpdCB3YW50cyB0byBrbm93IGhvdyBtYW55CisgKglieXRlcyBvZiBkYXRhIHdlIGNhbiBhY2NlcHQgZm9yIGEgc3BlY2lmaWMgcG9ydC4KKyAqCUlmIHN1Y2Nlc3NmdWwsIHdlIHJldHVybiB0aGUgYW1vdW50IG9mIHJvb20gdGhhdCB3ZSBoYXZlIGZvciB0aGlzIHBvcnQKKyAqCU90aGVyd2lzZSB3ZSByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQgbW9zNzcyMF93cml0ZV9yb29tKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0OworCWludCByb29tID0gMDsKKwlpbnQgaTsKKworCWRiZygiJXM6ZW50ZXJpbmcgLi4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCisJbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkgeworCQlkYmcoIiVzOmxlYXZpbmcgLi4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1VSQlM7ICsraSkgeworCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXS0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykKKwkJCXJvb20gKz0gVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFOworCX0KKworCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCByb29tKTsKKwlyZXR1cm4gcm9vbTsKK30KKworc3RhdGljIGludCBtb3M3NzIwX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGNvdW50KQoreworCWludCBzdGF0dXM7CisJaW50IGk7CisJaW50IGJ5dGVzX3NlbnQgPSAwOworCWludCB0cmFuc2Zlcl9zaXplOworCisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0OworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWw7CisJc3RydWN0IHVyYiAgICAqdXJiOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cnJlbnRfcG9zaXRpb24gPSBkYXRhOworCisJZGJnKCIlczplbnRlcmluZyAuLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisKKwltb3M3NzIwX3BvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKSB7CisJCWRiZygibW9zNzcyMF9wb3J0IGlzIE5VTEwiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogdHJ5IHRvIGZpbmQgYSBmcmVlIHVyYiBpbiB0aGUgbGlzdCAqLworCXVyYiA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1VSQlM7ICsraSkgeworCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXS0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgeworCQkJdXJiID0gbW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXTsKKwkJCWRiZygiVVJCOiVkIixpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHVyYiA9PSBOVUxMKSB7CisJCWRiZygiJXMgLSBubyBtb3JlIGZyZWUgdXJicyIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgeworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CisJCQllcnIoIiVzIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisJdHJhbnNmZXJfc2l6ZSA9IG1pbiAoY291bnQsIFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRSk7CisKKwltZW1jcHkodXJiLT50cmFuc2Zlcl9idWZmZXIsIGN1cnJlbnRfcG9zaXRpb24sIHRyYW5zZmVyX3NpemUpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB0cmFuc2Zlcl9zaXplLAorCQkJICAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCisJLyogZmlsbCB1cmIgd2l0aCBkYXRhIGFuZCBzdWJtaXQgICovCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZXJpYWwtPmRldiwKKwkJCSAgdXNiX3NuZGJ1bGtwaXBlKHNlcmlhbC0+ZGV2LAorCQkJICAJCSAgcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKSwKKwkJCSAgdXJiLT50cmFuc2Zlcl9idWZmZXIsIHRyYW5zZmVyX3NpemUsCisJCQkgIG1vczc3MjBfYnVsa19vdXRfZGF0YV9jYWxsYmFjaywgbW9zNzcyMF9wb3J0KTsKKworCS8qIHNlbmQgaXQgZG93biB0aGUgcGlwZSAqLworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYixHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKSB7CisJCWVycigiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgd2l0aCBzdGF0dXMgPSAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWJ5dGVzX3NlbnQgPSBzdGF0dXM7CisJCWdvdG8gZXhpdDsKKwl9CisJYnl0ZXNfc2VudCA9IHRyYW5zZmVyX3NpemU7CisKK2V4aXQ6CisJcmV0dXJuIGJ5dGVzX3NlbnQ7Cit9CisKK3N0YXRpYyB2b2lkIG1vczc3MjBfdGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgc3RhdHVzOworCisJZGJnKCIlcy0gcG9ydCAlZFxuIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCisJbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoIW1vczc3MjBfcG9ydC0+b3BlbikgeworCQlkYmcoInBvcnQgbm90IG9wZW5lZCIpOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlczogRW50ZXJpbmcgLi4uLi4uLi4uLiIsIF9fRlVOQ1RJT05fXyk7CisKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKCF0dHkpIHsKKwkJZGJnKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJLyogaWYgd2UgYXJlIGltcGxlbWVudGluZyBYT04vWE9GRiwgc2VuZCB0aGUgc3RvcCBjaGFyYWN0ZXIgKi8KKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCXVuc2lnbmVkIGNoYXIgc3RvcF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CisJCXN0YXR1cyA9IG1vczc3MjBfd3JpdGUocG9ydCwgJnN0b3BfY2hhciwgMSk7CisJCWlmIChzdGF0dXMgPD0gMCkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBpZiB3ZSBhcmUgaW1wbGVtZW50aW5nIFJUUy9DVFMsIHRvZ2dsZSB0aGF0IGxpbmUgKi8KKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQltb3M3NzIwX3BvcnQtPnNoYWRvd01DUiAmPSB+VUFSVF9NQ1JfUlRTOworCQlzdGF0dXMgPSBzZW5kX21vc19jbWQocG9ydC0+c2VyaWFsLCBNT1NfV1JJVEUsCisJCQkJICAgICAgcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vciwKKwkJCQkgICAgICBVQVJUX01DUiwgJm1vczc3MjBfcG9ydC0+c2hhZG93TUNSKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgbW9zNzcyMF91bnRocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKCFtb3M3NzIwX3BvcnQtPm9wZW4pIHsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKworCXR0eSA9IHBvcnQtPnR0eTsKKwlpZiAoIXR0eSkgeworCQlkYmcoIiVzIC0gbm8gdHR5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiB3ZSBhcmUgaW1wbGVtZW50aW5nIFhPTi9YT0ZGLCBzZW5kIHRoZSBzdGFydCBjaGFyYWN0ZXIgKi8KKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCXVuc2lnbmVkIGNoYXIgc3RhcnRfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKKwkJc3RhdHVzID0gbW9zNzcyMF93cml0ZShwb3J0LCAmc3RhcnRfY2hhciwgMSk7CisJCWlmIChzdGF0dXMgPD0gMCkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBpZiB3ZSBhcmUgaW1wbGVtZW50aW5nIFJUUy9DVFMsIHRvZ2dsZSB0aGF0IGxpbmUgKi8KKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQltb3M3NzIwX3BvcnQtPnNoYWRvd01DUiB8PSBVQVJUX01DUl9SVFM7CisJCXN0YXR1cyA9IHNlbmRfbW9zX2NtZChwb3J0LT5zZXJpYWwsIE1PU19XUklURSwKKwkJCQkgICAgICBwb3J0LT5udW1iZXIgLSBwb3J0LT5zZXJpYWwtPm1pbm9yLAorCQkJCSAgICAgIFVBUlRfTUNSLCAmbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1IpOworCQlpZiAoc3RhdHVzICE9IDApCisJCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW50IHNldF9oaWdoZXJfcmF0ZXMoc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0LAorCQkJICAgIHVuc2lnbmVkIGludCBiYXVkKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWw7CisJaW50IHBvcnRfbnVtYmVyOworCisJaWYgKG1vczc3MjBfcG9ydCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvcnQgPSBtb3M3NzIwX3BvcnQtPnBvcnQ7CisJc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKiAgICAgIEluaXQgU2VxdWVuY2UgZm9yIGhpZ2hlciByYXRlcworICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJZGJnKCJTZW5kaW5nIFNldHRpbmcgQ29tbWFuZHMgLi4uLi4uLi4uLiIpOworCXBvcnRfbnVtYmVyID0gcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vcjsKKworCWRhdGEgPSAweDAwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAxLCAmZGF0YSk7CisJZGF0YSA9IDB4MDAwOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDIsICZkYXRhKTsKKwlkYXRhID0gMHgwQ0Y7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0LT5udW1iZXIsIDB4MDIsICZkYXRhKTsKKwlkYXRhID0gMHgwMGI7CisgICAgICAgIG1vczc3MjBfcG9ydC0+c2hhZG93TUNSICA9IGRhdGE7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwNCwgJmRhdGEpOworCWRhdGEgPSAweDAwYjsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDA0LCAmZGF0YSk7CisKKwlkYXRhID0gMHgwMDA7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1JFQUQsIE1PU19NQVhfUE9SVCwgMHgwOCwgJmRhdGEpOworCWRhdGEgPSAweDAwMDsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgMHgwOCwgJmRhdGEpOworCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqICAgICAgICAgICAgICBTZXQgZm9yIGhpZ2hlciByYXRlcyAgICAgICAgICAgKgorICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlkYXRhID0gYmF1ZCAqIDB4MTA7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBNT1NfTUFYX1BPUlQsIHBvcnRfbnVtYmVyICsgMSwmZGF0YSk7CisKKwlkYXRhID0gMHgwMDM7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1JFQUQsIE1PU19NQVhfUE9SVCwgMHgwOCwgJmRhdGEpOworCWRhdGEgPSAweDAwMzsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwgMHgwOCwgJmRhdGEpOworCisJZGF0YSA9IDB4MDJiOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd01DUiAgPSBkYXRhOworCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDQsICZkYXRhKTsKKwlkYXRhID0gMHgwMmI7CisJc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwNCwgJmRhdGEpOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKiAgICAgICAgICAgICAgU2V0IERMTC9ETE0KKyAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJZGF0YSA9IG1vczc3MjBfcG9ydC0+c2hhZG93TENSIHwgVUFSVF9MQ1JfRExBQjsKKyAgICAgICAgbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgID0gZGF0YTsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAzLCAmZGF0YSk7CisKKwlkYXRhID0gIDB4MDAxOyAvKiBETEwgKi8KKyAgICAgICAgc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwMCwgJmRhdGEpOworCWRhdGEgPSAgMHgwMDA7IC8qIERMTSAqLworICAgICAgICBzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAxLCAmZGF0YSk7CisKKwlkYXRhID0gbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgJiB+VUFSVF9MQ1JfRExBQjsKKyAgICAgICAgbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgID0gZGF0YTsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCAweDAzLCAmZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYmF1ZCByYXRlIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgZGl2aXNvcl90YWJsZV9lbnRyeQoreworCV9fdTMyICBiYXVkcmF0ZTsKKwlfX3UxNiAgZGl2aXNvcjsKK307CisKKy8qIERlZmluZSB0YWJsZSBvZiBkaXZpc29ycyBmb3IgbW9zY2hpcCA3NzIwIGhhcmR3YXJlCSAgICoKKyAqIFRoZXNlIGFzc3VtZSBhIDMuNjg2NE1IeiBjcnlzdGFsLCB0aGUgc3RhbmRhcmQgLzE2LCBhbmQgKgorICogTUNSLjcgPSAwLgkJCQkJCSAgICovCitzdGF0aWMgc3RydWN0IGRpdmlzb3JfdGFibGVfZW50cnkgZGl2aXNvcl90YWJsZVtdID0geworCXsgICA1MCwJCTIzMDR9LAorCXsgICAxMTAsCTEwNDd9LAkvKiAyMDk0LjU0NTQ1NSA9PiAyMzA0NTAgICA9PiAuMDIxNyAlIG92ZXIgKi8KKwl7ICAgMTM0LAk4NTd9LAkvKiAxNzEzLjAxMTE1MiA9PiAyMzAzOTguNSA9PiAuMDAwNjUlIHVuZGVyICovCisJeyAgIDE1MCwJNzY4fSwKKwl7ICAgMzAwLAkzODR9LAorCXsgICA2MDAsCTE5Mn0sCisJeyAgIDEyMDAsCTk2fSwKKwl7ICAgMTgwMCwJNjR9LAorCXsgICAyNDAwLAk0OH0sCisJeyAgIDQ4MDAsCTI0fSwKKwl7ICAgNzIwMCwJMTZ9LAorCXsgICA5NjAwLAkxMn0sCisJeyAgIDE5MjAwLAk2fSwKKwl7ICAgMzg0MDAsCTN9LAorCXsgICA1NzYwMCwJMn0sCisJeyAgIDExNTIwMCwJMX0sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNhbGNfYmF1ZF9yYXRlX2Rpdmlzb3IKKyAqCXRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgcHJvcGVyIGJhdWQgcmF0ZSBkaXZpc29yIGZvciB0aGUgc3BlY2lmaWVkCisgKgliYXVkIHJhdGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGNhbGNfYmF1ZF9yYXRlX2Rpdmlzb3IoaW50IGJhdWRyYXRlLCBpbnQgKmRpdmlzb3IpCit7CisJaW50IGk7CisJX191MTYgY3VzdG9tOworCV9fdTE2IHJvdW5kMTsKKwlfX3UxNiByb3VuZDsKKworCisJZGJnKCIlcyAtICVkIiwgX19GVU5DVElPTl9fLCBiYXVkcmF0ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkaXZpc29yX3RhYmxlKTsgaSsrKSB7CisJCWlmIChkaXZpc29yX3RhYmxlW2ldLmJhdWRyYXRlID09IGJhdWRyYXRlKSB7CisJCQkqZGl2aXNvciA9IGRpdmlzb3JfdGFibGVbaV0uZGl2aXNvcjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisgICAgICAgIC8qIEFmdGVyIHRyeWluZyBmb3IgYWxsIHRoZSBzdGFuZGFyZCBiYXVkIHJhdGVzICAgICoKKyAgICAgICAgICogVHJ5IGNhbGN1bGF0aW5nIHRoZSBkaXZpc29yIGZvciB0aGlzIGJhdWQgcmF0ZSAgKi8KKwlpZiAoYmF1ZHJhdGUgPiA3NSAmJiAgYmF1ZHJhdGUgPCAyMzA0MDApIHsKKwkJLyogZ2V0IHRoZSBkaXZpc29yICovCisJCWN1c3RvbSA9IChfX3UxNikoMjMwNDAwTCAgLyBiYXVkcmF0ZSk7CisKKwkJLyogQ2hlY2sgZm9yIHJvdW5kIG9mZiAqLworCQlyb3VuZDEgPSAoX191MTYpKDIzMDQwMDBMIC8gYmF1ZHJhdGUpOworCQlyb3VuZCA9IChfX3UxNikocm91bmQxIC0gKGN1c3RvbSAqIDEwKSk7CisJCWlmIChyb3VuZCA+IDQpCisJCQljdXN0b20rKzsKKwkJKmRpdmlzb3IgPSBjdXN0b207CisKKwkJZGJnKCJCYXVkICVkID0gJWQiLGJhdWRyYXRlLCBjdXN0b20pOworCQlyZXR1cm4gMDsKKwl9CisKKwlkYmcoIkJhdWQgY2FsY3VsYXRpb24gRmFpbGVkLi4uIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBzZW5kX2NtZF93cml0ZV9iYXVkX3JhdGUKKyAqCXRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIHByb3BlciBjb21tYW5kIHRvIGNoYW5nZSB0aGUgYmF1ZCByYXRlIG9mIHRoZQorICoJc3BlY2lmaWVkIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlKHN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydCwKKwkJCQkgICAgaW50IGJhdWRyYXRlKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlpbnQgZGl2aXNvcjsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwl1bnNpZ25lZCBjaGFyIG51bWJlcjsKKworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcG9ydCA9IG1vczc3MjBfcG9ydC0+cG9ydDsKKwlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKworCW51bWJlciA9IHBvcnQtPm51bWJlciAtIHBvcnQtPnNlcmlhbC0+bWlub3I7CisJZGJnKCIlcyAtIHBvcnQgPSAlZCwgYmF1ZCA9ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGJhdWRyYXRlKTsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIERpdmlzb3IgKi8KKwlzdGF0dXMgPSBjYWxjX2JhdWRfcmF0ZV9kaXZpc29yKGJhdWRyYXRlLCAmZGl2aXNvcik7CisJaWYgKHN0YXR1cykgeworCQllcnIoIiVzIC0gYmFkIGJhdWQgcmF0ZSIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisgICAgICAgIC8qIEVuYWJsZSBhY2Nlc3MgdG8gZGl2aXNvciBsYXRjaCAqLworICAgICAgICBkYXRhID0gbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgfCBVQVJUX0xDUl9ETEFCOworICAgICAgICBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAgPSBkYXRhOworICAgICAgICBzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIG51bWJlciwgVUFSVF9MQ1IsICZkYXRhKTsKKworCS8qIFdyaXRlIHRoZSBkaXZpc29yICovCisJZGF0YSA9ICgodW5zaWduZWQgY2hhcikoZGl2aXNvciAmIDB4ZmYpKTsKKyAgICAgICAgc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBudW1iZXIsIDB4MDAsICZkYXRhKTsKKworCWRhdGEgPSAoKHVuc2lnbmVkIGNoYXIpKChkaXZpc29yICYgMHhmZjAwKSA+PiA4KSk7CisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgbnVtYmVyLCAweDAxLCAmZGF0YSk7CisKKyAgICAgICAgLyogRGlzYWJsZSBhY2Nlc3MgdG8gZGl2aXNvciBsYXRjaCAqLworICAgICAgICBkYXRhID0gbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgJiB+VUFSVF9MQ1JfRExBQjsKKyAgICAgICAgbW9zNzcyMF9wb3J0LT5zaGFkb3dMQ1IgPSBkYXRhOworICAgICAgICBzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIG51bWJlciwgMHgwMywgJmRhdGEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIGNoYW5nZV9wb3J0X3NldHRpbmdzCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHNldCB0aGUgVUFSVCBvbiB0aGUgZGV2aWNlIHRvIG1hdGNoCisgKiAgICAgIHRoZSBzcGVjaWZpZWQgbmV3IHNldHRpbmdzLgorICovCitzdGF0aWMgdm9pZCBjaGFuZ2VfcG9ydF9zZXR0aW5ncyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQsCisJCQkJIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IGJhdWQ7CisJdW5zaWduZWQgY2ZsYWc7CisJdW5zaWduZWQgaWZsYWc7CisJX191OCBtYXNrID0gMHhmZjsKKwlfX3U4IGxEYXRhOworCV9fdTggbFBhcml0eTsKKwlfX3U4IGxTdG9wOworCWludCBzdGF0dXM7CisJaW50IHBvcnRfbnVtYmVyOworCWNoYXIgZGF0YTsKKworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIDsKKworCXBvcnQgPSBtb3M3NzIwX3BvcnQtPnBvcnQ7CisJc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCXBvcnRfbnVtYmVyID0gcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vcjsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCisJaWYgKCFtb3M3NzIwX3BvcnQtPm9wZW4pIHsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwl0dHkgPSBtb3M3NzIwX3BvcnQtPnBvcnQtPnR0eTsKKworCWlmICgoIXR0eSkgfHwgKCF0dHktPnRlcm1pb3MpKSB7CisJCWRiZygiJXMgLSBubyB0dHkgc3RydWN0dXJlcyIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKworCWxEYXRhID0gVUFSVF9MQ1JfV0xFTjg7CisJbFN0b3AgPSAweDAwOwkvKiAxIHN0b3AgYml0ICovCisJbFBhcml0eSA9IDB4MDA7CS8qIE5vIHBhcml0eSAqLworCisJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisJaWZsYWcgPSB0dHktPnRlcm1pb3MtPmNfaWZsYWc7CisKKwkvKiBDaGFuZ2UgdGhlIG51bWJlciBvZiBiaXRzICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWxEYXRhID0gVUFSVF9MQ1JfV0xFTjU7CisJCW1hc2sgPSAweDFmOworCQlicmVhazsKKworCWNhc2UgQ1M2OgorCQlsRGF0YSA9IFVBUlRfTENSX1dMRU42OworCQltYXNrID0gMHgzZjsKKwkJYnJlYWs7CisKKwljYXNlIENTNzoKKwkJbERhdGEgPSBVQVJUX0xDUl9XTEVONzsKKwkJbWFzayA9IDB4N2Y7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBDUzg6CisJCWxEYXRhID0gVUFSVF9MQ1JfV0xFTjg7CisJCWJyZWFrOworCX0KKworCS8qIENoYW5nZSB0aGUgUGFyaXR5IGJpdCAqLworCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlpZiAoY2ZsYWcgJiBQQVJPREQpIHsKKwkJCWxQYXJpdHkgPSBVQVJUX0xDUl9QQVJJVFk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gb2RkIiwgX19GVU5DVElPTl9fKTsKKwkJfSBlbHNlIHsKKwkJCWxQYXJpdHkgPSAoVUFSVF9MQ1JfRVBBUiB8IFVBUlRfTENSX1BBUklUWSk7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fRlVOQ1RJT05fXyk7CisJCX0KKworCX0gZWxzZSB7CisJCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKwlpZiAoY2ZsYWcgJiBDTVNQQVIpCisJCWxQYXJpdHkgPSBsUGFyaXR5IHwgMHgyMDsKKworCS8qIENoYW5nZSB0aGUgU3RvcCBiaXQgKi8KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKKwkJbFN0b3AgPSBVQVJUX0xDUl9TVE9QOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fRlVOQ1RJT05fXyk7CisJfSBlbHNlIHsKKwkJbFN0b3AgPSAweDAwOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisjZGVmaW5lIExDUl9CSVRTX01BU0sJCTB4MDMJLyogTWFzayBmb3IgYml0cy9jaGFyIGZpZWxkICovCisjZGVmaW5lIExDUl9TVE9QX01BU0sJCTB4MDQJLyogTWFzayBmb3Igc3RvcCBiaXRzIGZpZWxkICovCisjZGVmaW5lIExDUl9QQVJfTUFTSwkJMHgzOAkvKiBNYXNrIGZvciBwYXJpdHkgZmllbGQgKi8KKworCS8qIFVwZGF0ZSB0aGUgTENSIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUgKi8KKwltb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiAmPSB+KExDUl9CSVRTX01BU0sgfCBMQ1JfU1RPUF9NQVNLIHwgTENSX1BBUl9NQVNLKTsKKwltb3M3NzIwX3BvcnQtPnNoYWRvd0xDUiB8PSAobERhdGEgfCBsUGFyaXR5IHwgbFN0b3ApOworCisKKwkvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKwlkYXRhID0gMHgwMDsKKyAgICAgICAgc2VuZF9tb3NfY21kKHNlcmlhbCxNT1NfV1JJVEUscG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vciwgVUFSVF9JRVIsICZkYXRhKTsKKworCWRhdGEgPSAweDAwOworICAgICAgICBzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCBVQVJUX0ZDUiwgJmRhdGEpOworCisJZGF0YSA9IDB4Y2Y7CisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIFVBUlRfRkNSLCAmZGF0YSk7CisKKwkvKiBTZW5kIHRoZSB1cGRhdGVkIExDUiB2YWx1ZSB0byB0aGUgbW9zNzcyMCAqLworCWRhdGEgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd0xDUjsKKyAgICAgICAgc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgVUFSVF9MQ1IsICZkYXRhKTsKKworICAgICAgICBkYXRhID0gMHgwMGI7CisgICAgICAgIG1vczc3MjBfcG9ydC0+c2hhZG93TUNSID0gZGF0YTsKKyAgICAgICAgc2VuZF9tb3NfY21kKHNlcmlhbCwgTU9TX1dSSVRFLCBwb3J0X251bWJlciwgMHgwNCwgJmRhdGEpOworICAgICAgICBkYXRhID0gMHgwMGI7CisgICAgICAgIHNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIDB4MDQsICZkYXRhKTsKKworCS8qIHNldCB1cCB0aGUgTUNSIHJlZ2lzdGVyIGFuZCBzZW5kIGl0IHRvIHRoZSBtb3M3NzIwICovCisJbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1IgPSBVQVJUX01DUl9PVVQyOworCWlmIChjZmxhZyAmIENCQVVEKQorCQltb3M3NzIwX3BvcnQtPnNoYWRvd01DUiB8PSAoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTKTsKKworCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKKwkJbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1IgfD0gKFVBUlRfTUNSX1hPTkFOWSk7CisKKyAgICAgICAgICAgICAgICAvKiBUbyBzZXQgaGFyZHdhcmUgZmxvdyBjb250cm9sIHRvIHRoZSBzcGVjaWZpZWQgKgorICAgICAgICAgICAgICAgICAqIHNlcmlhbCBwb3J0LCBpbiBTUDEvMl9DT05UUk9MX1JFRyAgICAgICAgICAgICAqLworCQlpZiAocG9ydC0+bnVtYmVyKSB7CisJCQlkYXRhID0gMHgwMDE7CisJCQlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIE1PU19NQVhfUE9SVCwKKwkJCQkgICAgIDB4MDgsICZkYXRhKTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEgPSAweDAwMjsKKwkJCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgTU9TX01BWF9QT1JULAorCQkJCSAgICAgMHgwOCwgJmRhdGEpOworCQl9CisJfSBlbHNlIHsKKwkJbW9zNzcyMF9wb3J0LT5zaGFkb3dNQ1IgJj0gfihVQVJUX01DUl9YT05BTlkpOworCX0KKworCWRhdGEgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd01DUjsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCBVQVJUX01DUiwgJmRhdGEpOworCisJLyogRGV0ZXJtaW5lIGRpdmlzb3IgYmFzZWQgb24gYmF1ZCByYXRlICovCisJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSk7CisJaWYgKCFiYXVkKSB7CisJCS8qIHBpY2sgYSBkZWZhdWx0LCBhbnkgZGVmYXVsdC4uLiAqLworCQlkYmcoIlBpY2tlZCBkZWZhdWx0IGJhdWQuLi4iKTsKKwkJYmF1ZCA9IDk2MDA7CisJfQorCisJaWYgKGJhdWQgPj0gMjMwNDAwKSB7CisJCXNldF9oaWdoZXJfcmF0ZXMobW9zNzcyMF9wb3J0LCBiYXVkKTsKKwkJLyogRW5hYmxlIEludGVycnVwdHMgKi8KKwkJZGF0YSA9IDB4MGM7CisJCXNlbmRfbW9zX2NtZChzZXJpYWwsIE1PU19XUklURSwgcG9ydF9udW1iZXIsIFVBUlRfSUVSLCAmZGF0YSk7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIiVzIC0gYmF1ZCByYXRlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWQpOworCXN0YXR1cyA9IHNlbmRfY21kX3dyaXRlX2JhdWRfcmF0ZShtb3M3NzIwX3BvcnQsIGJhdWQpOworCisJLyogRW5hYmxlIEludGVycnVwdHMgKi8KKwlkYXRhID0gMHgwYzsKKwlzZW5kX21vc19jbWQoc2VyaWFsLCBNT1NfV1JJVEUsIHBvcnRfbnVtYmVyLCBVQVJUX0lFUiwgJmRhdGEpOworCisJaWYgKHBvcnQtPnJlYWRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJCXBvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKworCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChzdGF0dXMpCisJCQlkYmcoInVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCisJCQkgICAgc3RhdHVzKTsKKwl9CisJcmV0dXJuOworfQorCisvKgorICogbW9zNzcyMF9zZXRfdGVybWlvcworICoJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgd2hlbiBpdCB3YW50cyB0byBjaGFuZ2UgdGhlCisgKgl0ZXJtaW9zIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgbW9zNzcyMF9zZXRfdGVybWlvcyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgY2ZsYWc7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCW1vczc3MjBfcG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJdHR5ID0gcG9ydC0+dHR5OworCisJaWYgKCFwb3J0LT50dHkgfHwgIXBvcnQtPnR0eS0+dGVybWlvcykgeworCQlkYmcoIiVzIC0gbm8gdHR5IG9yIHRlcm1pb3MiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKCFtb3M3NzIwX3BvcnQtPm9wZW4pIHsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIiVzXG4iLCJzZXR0aW5nIHRlcm1pb3MgLSBBU1BJUkUiKTsKKworCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJaWYgKCFjZmxhZykgeworCQlwcmludGsoIiVzICVzXG4iLF9fRlVOQ1RJT05fXywiY2ZsYWcgaXMgTlVMTCIpOworCQlyZXR1cm47CisJfQorCisJLyogY2hlY2sgdGhhdCB0aGV5IHJlYWxseSB3YW50IHVzIHRvIGNoYW5nZSBzb21ldGhpbmcgKi8KKwlpZiAob2xkX3Rlcm1pb3MpIHsKKwkJaWYgKChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykgJiYKKwkJICAgIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpID09CisJCSAgICAgUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCQkJZGJnKCJOb3RoaW5nIHRvIGNoYW5nZSIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnLAorCSAgICBSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpKTsKKworCWlmIChvbGRfdGVybWlvcykKKwkJZGJnKCIlcyAtIG9sZCBjbGZhZyAlMDh4IG9sZCBpZmxhZyAlMDh4IiwgX19GVU5DVElPTl9fLAorCQkgICAgb2xkX3Rlcm1pb3MtPmNfY2ZsYWcsCisJCSAgICBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisKKwkvKiBjaGFuZ2UgdGhlIHBvcnQgc2V0dGluZ3MgdG8gdGhlIG5ldyBvbmVzIHNwZWNpZmllZCAqLworCWNoYW5nZV9wb3J0X3NldHRpbmdzKG1vczc3MjBfcG9ydCwgb2xkX3Rlcm1pb3MpOworCisJaWYoIXBvcnQtPnJlYWRfdXJiKSB7CisJCWRiZygiJXMiLCJVUkIgS0lMTEVEICEhISEhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmKHBvcnQtPnJlYWRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJCXBvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKwkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoc3RhdHVzKQorCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAorCQkJICAgIHN0YXR1cyk7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIGdldF9sc3JfaW5mbyAtIGdldCBsaW5lIHN0YXR1cyByZWdpc3RlciBpbmZvCisgKgorICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCgpIHRvIGdldCBpbmZvIHdoZW4gdGhlIFVBUlQgcGh5c2ljYWxseQorICogCSAgICBpcyBlbXB0aWVkLiAgT24gYnVzIHR5cGVzIGxpa2UgUlM0ODUsIHRoZSB0cmFuc21pdHRlciBtdXN0CisgKiAJICAgIHJlbGVhc2UgdGhlIGJ1cyBhZnRlciB0cmFuc21pdHRpbmcuIFRoaXMgbXVzdCBiZSBkb25lIHdoZW4KKyAqIAkgICAgdGhlIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5LCBub3QgYmUgZG9uZSB3aGVuIHRoZQorICogCSAgICB0cmFuc21pdCBob2xkaW5nIHJlZ2lzdGVyIGlzIGVtcHR5LiAgVGhpcyBmdW5jdGlvbmFsaXR5CisgKiAJICAgIGFsbG93cyBhbiBSUzQ4NSBkcml2ZXIgdG8gYmUgd3JpdHRlbiBpbiB1c2VyIHNwYWNlLgorICovCitzdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQsCisJCQl1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisKKwljb3VudCA9IG1vczc3MjBfY2hhcnNfaW5fYnVmZmVyKG1vczc3MjBfcG9ydC0+cG9ydCk7CisJaWYgKGNvdW50ID09IDApIHsKKwkJZGJnKCIlcyAtLSBFbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisJCXJlc3VsdCA9IFRJT0NTRVJfVEVNVDsKKwl9CisKKwlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKgorICogZ2V0X251bWJlcl9ieXRlc19hdmFpbCAtIGdldCBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlCisgKgorICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCB0byBnZXQgdGhlIGNvdW50IG9mIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X251bWJlcl9ieXRlc19hdmFpbChzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQsCisJCQkJICB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gbW9zNzcyMF9wb3J0LT5wb3J0LT50dHk7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCXJlc3VsdCA9IHR0eS0+cmVhZF9jbnQ7CisKKwlkYmcoIiVzKCVkKSA9ICVkIiwgX19GVU5DVElPTl9fLCAgbW9zNzcyMF9wb3J0LT5wb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0X21vZGVtX2luZm8oc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWNyIDsKKwl1bnNpZ25lZCBpbnQgYXJnOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisKKwlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCopbW9zNzcyMF9wb3J0LT5wb3J0OworCW1jciA9IG1vczc3MjBfcG9ydC0+c2hhZG93TUNSOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZhcmcsIHZhbHVlLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NNQklTOgorCQlpZiAoYXJnICYgVElPQ01fUlRTKQorCQkJbWNyIHw9IFVBUlRfTUNSX1JUUzsKKwkJaWYgKGFyZyAmIFRJT0NNX0RUUikKKwkJCW1jciB8PSBVQVJUX01DUl9SVFM7CisJCWlmIChhcmcgJiBUSU9DTV9MT09QKQorCQkJbWNyIHw9IFVBUlRfTUNSX0xPT1A7CisJCWJyZWFrOworCisJY2FzZSBUSU9DTUJJQzoKKwkJaWYgKGFyZyAmIFRJT0NNX1JUUykKKwkJCW1jciAmPSB+VUFSVF9NQ1JfUlRTOworCQlpZiAoYXJnICYgVElPQ01fRFRSKQorCQkJbWNyICY9IH5VQVJUX01DUl9SVFM7CisJCWlmIChhcmcgJiBUSU9DTV9MT09QKQorCQkJbWNyICY9IH5VQVJUX01DUl9MT09QOworCQlicmVhazsKKworCWNhc2UgVElPQ01TRVQ6CisJCS8qIHR1cm4gb2ZmIHRoZSBSVFMgYW5kIERUUiBhbmQgTE9PUEJBQ0sKKwkJICogYW5kIHRoZW4gb25seSB0dXJuIG9uIHdoYXQgd2FzIGFza2VkIHRvICovCisJCW1jciAmPSAgfihVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9MT09QKTsKKwkJbWNyIHw9ICgoYXJnICYgVElPQ01fUlRTKSA/IFVBUlRfTUNSX1JUUyA6IDApOworCQltY3IgfD0gKChhcmcgJiBUSU9DTV9EVFIpID8gVUFSVF9NQ1JfRFRSIDogMCk7CisJCW1jciB8PSAoKGFyZyAmIFRJT0NNX0xPT1ApID8gVUFSVF9NQ1JfTE9PUCA6IDApOworCQlicmVhazsKKwl9CisKKwltb3M3NzIwX3BvcnQtPnNoYWRvd01DUiA9IG1jcjsKKworCWRhdGEgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd01DUjsKKwlzZW5kX21vc19jbWQocG9ydC0+c2VyaWFsLCBNT1NfV1JJVEUsCisJCSAgICAgcG9ydC0+bnVtYmVyIC0gcG9ydC0+c2VyaWFsLT5taW5vciwgVUFSVF9NQ1IsICZkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9tb2RlbV9pbmZvKHN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc3MjBfcG9ydCwKKwkJCSAgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IG1zciA9IG1vczc3MjBfcG9ydC0+c2hhZG93TVNSOworCXVuc2lnbmVkIGludCBtY3IgPSBtb3M3NzIwX3BvcnQtPnNoYWRvd01DUjsKKworCXJlc3VsdCA9ICgobWNyICYgVUFSVF9NQ1JfRFRSKQk/IFRJT0NNX0RUUjogMCkJICAvKiAweDAwMiAqLworCQkgIHwgKChtY3IgJiBVQVJUX01DUl9SVFMpCT8gVElPQ01fUlRTOiAwKSAgIC8qIDB4MDA0ICovCisJCSAgfCAoKG1zciAmIFVBUlRfTVNSX0NUUykJPyBUSU9DTV9DVFM6IDApICAgLyogMHgwMjAgKi8KKwkJICB8ICgobXNyICYgVUFSVF9NU1JfRENEKQk/IFRJT0NNX0NBUjogMCkgICAvKiAweDA0MCAqLworCQkgIHwgKChtc3IgJiBVQVJUX01TUl9SSSkJPyBUSU9DTV9SSTogIDApICAgLyogMHgwODAgKi8KKwkJICB8ICgobXNyICYgVUFSVF9NU1JfRFNSKQk/IFRJT0NNX0RTUjogMCk7ICAvKiAweDEwMCAqLworCisKKwlkYmcoIiVzIC0tICV4IiwgX19GVU5DVElPTl9fLCByZXN1bHQpOworCisJaWYgKGNvcHlfdG9fdXNlcih2YWx1ZSwgJnJlc3VsdCwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0LAorCQkJICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCWlmICghcmV0aW5mbykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCisJdG1wLnR5cGUJCT0gUE9SVF8xNjU1MEE7CisJdG1wLmxpbmUJCT0gbW9zNzcyMF9wb3J0LT5wb3J0LT5zZXJpYWwtPm1pbm9yOworCXRtcC5wb3J0CQk9IG1vczc3MjBfcG9ydC0+cG9ydC0+bnVtYmVyOworCXRtcC5pcnEJCQk9IDA7CisJdG1wLmZsYWdzCQk9IEFTWU5DX1NLSVBfVEVTVCB8IEFTWU5DX0FVVE9fSVJROworICAgICAgICB0bXAueG1pdF9maWZvX3NpemUJPSBOVU1fVVJCUyAqIFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRTsKKwl0bXAuYmF1ZF9iYXNlCQk9IDk2MDA7CisJdG1wLmNsb3NlX2RlbGF5CQk9IDUqSFo7CisJdG1wLmNsb3Npbmdfd2FpdAk9IDMwKkhaOworCisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9zNzcyMF9pb2N0bChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IGFzeW5jX2ljb3VudCBjbm93OworCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXY7CisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50OworCisJbW9zNzcyMF9wb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWlmIChtb3M3NzIwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJT0NJTlE6CisJCS8qIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlICovCisJCWRiZygiJXMgKCVkKSBUSU9DSU5RIiwgX19GVU5DVElPTl9fLCAgcG9ydC0+bnVtYmVyKTsKKwkJcmV0dXJuIGdldF9udW1iZXJfYnl0ZXNfYXZhaWwobW9zNzcyMF9wb3J0LAorCQkJCQkgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBUSU9DU0VSR0VUTFNSOgorCQlkYmcoIiVzICglZCkgVElPQ1NFUkdFVExTUiIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCXJldHVybiBnZXRfbHNyX2luZm8obW9zNzcyMF9wb3J0LCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisJCXJldHVybiAwOworCisJY2FzZSBUSU9DTUJJUzoKKwljYXNlIFRJT0NNQklDOgorCWNhc2UgVElPQ01TRVQ6CisJCWRiZygiJXMgKCVkKSBUSU9DTVNFVC9USU9DTUJJQy9USU9DTVNFVCIsIF9fRlVOQ1RJT05fXywKKwkJICAgIHBvcnQtPm51bWJlcik7CisJCXJldHVybiBzZXRfbW9kZW1faW5mbyhtb3M3NzIwX3BvcnQsIGNtZCwKKwkJCQkgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7CisKKwljYXNlIFRJT0NNR0VUOgorCQlkYmcoIiVzICglZCkgVElPQ01HRVQiLCBfX0ZVTkNUSU9OX18sICBwb3J0LT5udW1iZXIpOworCQlyZXR1cm4gZ2V0X21vZGVtX2luZm8obW9zNzcyMF9wb3J0LAorCQkJCSAgICAgICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKTsKKworCWNhc2UgVElPQ0dTRVJJQUw6CisJCWRiZygiJXMgKCVkKSBUSU9DR1NFUklBTCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCXJldHVybiBnZXRfc2VyaWFsX2luZm8obW9zNzcyMF9wb3J0LAorCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopYXJnKTsKKworCWNhc2UgVElPQ1NTRVJJQUw6CisJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWJyZWFrOworCisJY2FzZSBUSU9DTUlXQUlUOgorCQlkYmcoIiVzICglZCkgVElPQ01JV0FJVCIsIF9fRlVOQ1RJT05fXywgIHBvcnQtPm51bWJlcik7CisJCWNwcmV2ID0gbW9zNzcyMF9wb3J0LT5pY291bnQ7CisJCXdoaWxlICgxKSB7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWNub3cgPSBtb3M3NzIwX3BvcnQtPmljb3VudDsKKwkJCWlmIChjbm93LnJuZyA9PSBjcHJldi5ybmcgJiYgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCisJCQkgICAgY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmIGNub3cuY3RzID09IGNwcmV2LmN0cykKKwkJCQlyZXR1cm4gLUVJTzsgLyogbm8gY2hhbmdlID0+IGVycm9yICovCisJCQlpZiAoKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAorCQkJICAgICgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwKKwkJCSAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8CisJCQkgICAgKChhcmcgJiBUSU9DTV9DVFMpICYmIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKSApIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWNwcmV2ID0gY25vdzsKKwkJfQorCQkvKiBOT1RSRUFDSEVEICovCisJCWJyZWFrOworCisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJY25vdyA9IG1vczc3MjBfcG9ydC0+aWNvdW50OworCQlpY291bnQuY3RzID0gY25vdy5jdHM7CisJCWljb3VudC5kc3IgPSBjbm93LmRzcjsKKwkJaWNvdW50LnJuZyA9IGNub3cucm5nOworCQlpY291bnQuZGNkID0gY25vdy5kY2Q7CisJCWljb3VudC5yeCA9IGNub3cucng7CisJCWljb3VudC50eCA9IGNub3cudHg7CisJCWljb3VudC5mcmFtZSA9IGNub3cuZnJhbWU7CisJCWljb3VudC5vdmVycnVuID0gY25vdy5vdmVycnVuOworCQlpY291bnQucGFyaXR5ID0gY25vdy5wYXJpdHk7CisJCWljb3VudC5icmsgPSBjbm93LmJyazsKKwkJaWNvdW50LmJ1Zl9vdmVycnVuID0gY25vdy5idWZfb3ZlcnJ1bjsKKworCQlkYmcoIiVzICglZCkgVElPQ0dJQ09VTlQgUlg9JWQsIFRYPSVkIiwgX19GVU5DVElPTl9fLAorCQkgICAgcG9ydC0+bnVtYmVyLCBpY291bnQucngsIGljb3VudC50eCApOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyBpbnQgbW9zNzcyMF9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJc3RydWN0IG1vc2NoaXBfc2VyaWFsICptb3M3NzIwX3NlcmlhbDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3NzIwX3BvcnQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKwljaGFyIGRhdGE7CisKKwlkYmcoIiVzOiBFbnRlcmluZyAuLi4uLi4uLi4uIiwgX19GVU5DVElPTl9fKTsKKworCWlmICghc2VyaWFsKSB7CisJCWRiZygiSW52YWxpZCBIYW5kbGVyIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldiA9IHNlcmlhbC0+ZGV2OworCisJLyogY3JlYXRlIG91ciBwcml2YXRlIHNlcmlhbCBzdHJ1Y3R1cmUgKi8KKwltb3M3NzIwX3NlcmlhbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtb3NjaGlwX3NlcmlhbCksIEdGUF9LRVJORUwpOworCWlmIChtb3M3NzIwX3NlcmlhbCA9PSBOVUxMKSB7CisJCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsIG1vczc3MjBfc2VyaWFsKTsKKworCS8qIHdlIHNldCB1cCB0aGUgcG9pbnRlcnMgdG8gdGhlIGVuZHBvaW50cyBpbiB0aGUgbW9zNzcyMF9vcGVuICoKKwkgKiBmdW5jdGlvbiwgYXMgdGhlIHN0cnVjdHVyZXMgYXJlbid0IGNyZWF0ZWQgeWV0LiAgICAgICAgICAgICAqLworCisJLyogc2V0IHVwIHBvcnQgcHJpdmF0ZSBzdHJ1Y3R1cmVzICovCisJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKKwkJbW9zNzcyMF9wb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1vc2NoaXBfcG9ydCksIEdGUF9LRVJORUwpOworCQlpZiAobW9zNzcyMF9wb3J0ID09IE5VTEwpIHsKKwkJCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKKwkJCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCBOVUxMKTsKKwkJCWtmcmVlKG1vczc3MjBfc2VyaWFsKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJLyogSW5pdGlhbGl6ZSBhbGwgcG9ydCBpbnRlcnJ1cHQgZW5kIHBvaW50IHRvIHBvcnQgMCBpbnQKKwkJICogZW5kcG9pbnQuICBPdXIgZGV2aWNlIGhhcyBvbmx5IG9uZSBpbnRlcnJ1cHQgZW5kcG9pbnQKKwkJICogY29tbWFuIHRvIGFsbCBwb3J0cyAqLworCQlzZXJpYWwtPnBvcnRbaV0tPmludGVycnVwdF9pbl9lbmRwb2ludEFkZHJlc3MgPSBzZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl9lbmRwb2ludEFkZHJlc3M7CisKKwkJbW9zNzcyMF9wb3J0LT5wb3J0ID0gc2VyaWFsLT5wb3J0W2ldOworCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldLCBtb3M3NzIwX3BvcnQpOworCisJCWRiZygicG9ydCBudW1iZXIgaXMgJWQiLCBzZXJpYWwtPnBvcnRbaV0tPm51bWJlcik7CisJCWRiZygic2VyaWFsIG51bWJlciBpcyAlZCIsIHNlcmlhbC0+bWlub3IpOworCX0KKworCisJLyogc2V0dGluZyBjb25maWd1cmF0aW9uIGZlYXR1cmUgdG8gb25lICovCisJdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAorCQkJKF9fdTgpMHgwMywgMHgwMCwweDAxLDB4MDAsIE5VTEwsIDB4MDAsIDUqSFopOworCisJc2VuZF9tb3NfY21kKHNlcmlhbCxNT1NfUkVBRCwweDAwLCBVQVJUX0xTUiwgJmRhdGEpOyAgLy8gTFNSIEZvciBQb3J0IDEKKwlkYmcoIkxTUjoleCIsZGF0YSk7CisKKwlzZW5kX21vc19jbWQoc2VyaWFsLE1PU19SRUFELDB4MDEsIFVBUlRfTFNSLCAmZGF0YSk7ICAvLyBMU1IgRm9yIFBvcnQgMgorCWRiZygiTFNSOiV4IixkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtb3M3NzIwX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGk7CisKKwkvKiBmcmVlIHByaXZhdGUgc3RydWN0dXJlIGFsbG9jYXRlZCBmb3Igc2VyaWFsIHBvcnQgKi8KKwlmb3IgKGk9MDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKKwkJa2ZyZWUodXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFtpXSkpOworCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldLCBOVUxMKTsKKwl9CisKKwkvKiBmcmVlIHByaXZhdGUgc3RydWN0dXJlIGFsbG9jYXRlZCBmb3Igc2VyaWFsIGRldmljZSAqLworCWtmcmVlKHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKSk7CisJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIG1vc2NoaXA3NzIwXzJwb3J0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLm5hbWUgPQkJIm1vc2NoaXA3NzIwIiwKKwl9LAorCS5kZXNjcmlwdGlvbgkJPSAiTW9zY2hpcCAyIHBvcnQgYWRhcHRlciIsCisJLmlkX3RhYmxlCQk9IG1vc2NoaXBfcG9ydF9pZF90YWJsZSwKKwkubnVtX2ludGVycnVwdF9pbgk9IDEsCisJLm51bV9idWxrX2luCQk9IDIsCisJLm51bV9idWxrX291dAkJPSAyLAorCS5udW1fcG9ydHMJCT0gMiwKKwkub3BlbgkJCT0gbW9zNzcyMF9vcGVuLAorCS5jbG9zZQkJCT0gbW9zNzcyMF9jbG9zZSwKKwkudGhyb3R0bGUJCT0gbW9zNzcyMF90aHJvdHRsZSwKKwkudW50aHJvdHRsZQkJPSBtb3M3NzIwX3VudGhyb3R0bGUsCisJLmF0dGFjaAkJCT0gbW9zNzcyMF9zdGFydHVwLAorCS5zaHV0ZG93bgkJPSBtb3M3NzIwX3NodXRkb3duLAorCS5pb2N0bAkJCT0gbW9zNzcyMF9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MJCT0gbW9zNzcyMF9zZXRfdGVybWlvcywKKwkud3JpdGUJCQk9IG1vczc3MjBfd3JpdGUsCisJLndyaXRlX3Jvb20JCT0gbW9zNzcyMF93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIJPSBtb3M3NzIwX2NoYXJzX2luX2J1ZmZlciwKKwkuYnJlYWtfY3RsCQk9IG1vczc3MjBfYnJlYWssCisJLnJlYWRfYnVsa19jYWxsYmFjawk9IG1vczc3MjBfYnVsa19pbl9jYWxsYmFjaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfZHJpdmVyID0geworCS5uYW1lID0JCSJtb3NjaGlwNzcyMCIsCisJLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9zZXJpYWxfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQltb3NjaGlwX3BvcnRfaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtb3NjaGlwNzcyMF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCWRiZygiJXM6IEVudGVyaW5nIC4uLi4uLi4uLi4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUmVnaXN0ZXIgd2l0aCB0aGUgdXNiIHNlcmlhbCAqLworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJm1vc2NoaXA3NzIwXzJwb3J0X2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsZWRfcG9ydF9kZXZpY2VfcmVnaXN0ZXI7CisKKwlpbmZvKERSSVZFUl9ERVNDICIgIiBEUklWRVJfVkVSU0lPTik7CisKKwkvKiBSZWdpc3RlciB3aXRoIHRoZSB1c2IgKi8KKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnVzYl9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKKworCXJldHVybiAwOworCitmYWlsZWRfdXNiX3JlZ2lzdGVyOgorCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmbW9zY2hpcDc3MjBfMnBvcnRfZHJpdmVyKTsKKworZmFpbGVkX3BvcnRfZGV2aWNlX3JlZ2lzdGVyOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtb3NjaGlwNzcyMF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYl9kcml2ZXIpOworCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmbW9zY2hpcDc3MjBfMnBvcnRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobW9zY2hpcDc3MjBfaW5pdCk7Cittb2R1bGVfZXhpdChtb3NjaGlwNzcyMF9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwppbmRleCAwMjFiZTM5Li44Y2M3MjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKQEAgLTgyNiw3ICs4MjYsNyBAQAogCiAJLyogSW5pdGlhbGlzaW5nIHRoZSB3cml0ZSB1cmIgcG9vbCAqLwogCWZvciAoaiA9IDA7IGogPCBOVU1fVVJCUzsgKytqKSB7Ci0JCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgU0xBQl9BVE9NSUMpOworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCQltb3M3ODQwX3BvcnQtPndyaXRlX3VyYl9wb29sW2pdID0gdXJiOwogCiAJCWlmICh1cmIgPT0gTlVMTCkgewpAQCAtMTkzMSw3ICsxOTMxLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQgbW9zNzg0MF9jaGFuZ2VfcG9ydF9zZXR0aW5ncyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQsCi0JCQkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCQkJCSBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IGJhdWQ7CkBAIC0yMTE4LDcgKzIxMTgsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZCBtb3M3ODQwX3NldF90ZXJtaW9zKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCQkJc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorCQkJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgY2ZsYWc7CkBAIC0yNDEzLDExICsyNDEzLDEyIEBACiAJfQogCiAJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwotCXR0eSA9IG1vczc4NDBfcG9ydC0+cG9ydC0+dHR5OwogCiAJaWYgKG1vczc4NDBfcG9ydCA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKKwl0dHkgPSBtb3M3ODQwX3BvcnQtPnBvcnQtPnR0eTsKKwogCWRiZygiJXMgLSBwb3J0ICVkLCBjbWQgPSAweCV4IiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMjU5NSwxMiArMjU5NiwxMSBAQAogCiAJLyogc2V0IHVwIHBvcnQgcHJpdmF0ZSBzdHJ1Y3R1cmVzICovCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKLQkJbW9zNzg0MF9wb3J0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1vc2NoaXBfcG9ydCksIEdGUF9LRVJORUwpOworCQltb3M3ODQwX3BvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9zY2hpcF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkgewogCQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJbWVtc2V0KG1vczc4NDBfcG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCBtb3NjaGlwX3BvcnQpKTsKIAogCQkvKiBJbml0aWFsaXplIGFsbCBwb3J0IGludGVycnVwdCBlbmQgcG9pbnQgdG8gcG9ydCAwIGludCBlbmRwb2ludCAqCiAJCSAqIE91ciBkZXZpY2UgaGFzIG9ubHkgb25lIGludGVycnVwdCBlbmQgcG9pbnQgY29tbWFuIHRvIGFsbCBwb3J0ICovCkBAIC0yNzg2LDcgKzI3ODYsNyBAQAogCQkJCSAgICBpICsgMSwgc3RhdHVzKTsKIAogCQl9Ci0JCW1vczc4NDBfcG9ydC0+Y29udHJvbF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIFNMQUJfQVRPTUlDKTsKKwkJbW9zNzg0MF9wb3J0LT5jb250cm9sX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJCW1vczc4NDBfcG9ydC0+Y3RybF9idWYgPSBrbWFsbG9jKDE2LCBHRlBfS0VSTkVMKTsKIAogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9uYXZtYW4uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9uYXZtYW4uYwppbmRleCAwNjEwNDA5Li4wNTRhYmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvbmF2bWFuLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jCkBAIC05NSw4ICs5NSw3IEBACiB7CiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CiAKLQlpZiAocG9ydC0+aW50ZXJydXB0X2luX3VyYikKLQkJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOworCXVzYl9raWxsX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKIH0KIAogc3RhdGljIGludCBuYXZtYW5fd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCAxMzBhZmJiLi4wYWU0MDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC01OSw3ICs1OSw3IEBACiBzdGF0aWMgaW50ICBvcHRpb25faW9jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgdm9pZCBvcHRpb25fc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQlzdHJ1Y3QgdGVybWlvcyAqb2xkKTsKKwkJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCk7CiBzdGF0aWMgdm9pZCBvcHRpb25fYnJlYWtfY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSk7CiBzdGF0aWMgaW50ICBvcHRpb25fdGlvY21nZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCAgb3B0aW9uX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMjMwLDcgKzIzMCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIG9wdGlvbl9zZXRfdGVybWlvcyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorCQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCmluZGV4IGJjODAwYzguLjVkYzJhYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCWlmIChzaXplID09IDApCiAJCXJldHVybiBOVUxMOwogCi0JcGIgPSAoc3RydWN0IHBsMjMwM19idWYgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGwyMzAzX2J1ZiksIEdGUF9LRVJORUwpOworCXBiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBsMjMwM19idWYpLCBHRlBfS0VSTkVMKTsKIAlpZiAocGIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTQ1NSw3ICs0NTUsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBwbDIzMDNfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCSAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJCQkgICAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBwbDIzMDNfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCiBzdGF0aWMgaW50IHBsMjMwM19vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCB0ZXJtaW9zIHRtcF90ZXJtaW9zOworCXN0cnVjdCBrdGVybWlvcyB0bXBfdGVybWlvczsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBwbDIzMDNfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBjaGFyICpidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKaW5kZXggZDI5NjM4ZC4uNmQ4ZTkxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYwpAQCAtMSw3NSArMSw3MTMgQEAKIC8qCi0gKiBTaWVycmEgV2lyZWxlc3MgQ0RNQSBXaXJlbGVzcyBTZXJpYWwgVVNCIGRyaXZlcgotICoKLSAqIEN1cnJlbnQgQ29weSBtb2RpZmllZCBieTogS2V2aW4gTGxveWQgPGxpbnV4QHNpZXJyYXdpcmVsZXNzLmNvbT4KLSAqIE9yaWdpbmFsIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+Ci0gKgotICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICoJMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLworICBVU0IgRHJpdmVyIGZvciBTaWVycmEgV2lyZWxlc3MKKworICBDb3B5cmlnaHQgKEMpIDIwMDYgIEtldmluIExsb3lkIDxsaW51eEBzaWVycmF3aXJlbGVzcy5jb20+CisKKyAgSU1QT1JUQU5UIERJU0NMQUlNRVI6IFRoaXMgZHJpdmVyIGlzIG5vdCBjb21tZXJjaWFsbHkgc3VwcG9ydGVkIGJ5CisgIFNpZXJyYSBXaXJlbGVzcy4gVXNlIGF0IHlvdXIgb3duIHJpc2suCisKKyAgVGhpcyBkcml2ZXIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgVmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBQb3J0aW9ucyBiYXNlZCBvbiB0aGUgb3B0aW9uIGRyaXZlciBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4KKyAgV2hvbSBiYXNlZCBoaXMgb24gdGhlIEtleXNwYW4gZHJpdmVyIGJ5IEh1Z2ggQmxlbWluZ3MgPGh1Z2hAYmxlbWluZ3Mub3JnPgorCisgIEhpc3Rvcnk6CisqLworCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2LjEuMC41IgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJLZXZpbiBMbG95ZCA8bGludXhAc2llcnJhd2lyZWxlc3MuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBEcml2ZXIgZm9yIFNpZXJyYSBXaXJlbGVzcyBVU0IgbW9kZW1zIgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgogCisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTgpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMjApIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTcpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBFTTU2MjUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTkpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDU5NSAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDIxOCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DNTcyMCAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgwMikgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc1NSAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgwMykgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc2NSAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgwNCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc1NSBmb3IgRXVyb3BlICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODEyKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4Nzc1ICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODIwKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4NzUgKi8KLQkvKiBGb2xsb3dpbmcgZGV2aWNlcyBhcmUgc3VwcG9ydGVkIGluIHRoZSBhaXJwcmltZS5jIGRyaXZlciAqLwotCS8qIHsgVVNCX0RFVklDRSgweDExOTksIDB4MDExMikgfSwgKi8JLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTgwICovCi0JLyogeyBVU0JfREVWSUNFKDB4MEYzRCwgMHgwMTEyKSB9LCAqLwkvKiBBaXJQcmltZS9TaWVycmEgUEMgNTIyMCAqLworCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMTEyKSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA1ODAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwRjNELCAweDAxMTIpIH0sIC8qIEFpclByaW1lL1NpZXJyYSBQQyA1MjIwICovCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKIAorc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlXzFwb3J0IFtdID0geworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDExMikgfSwgLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTgwICovCisJeyBVU0JfREVWSUNFKDB4MEYzRCwgMHgwMTEyKSB9LCAvKiBBaXJQcmltZS9TaWVycmEgUEMgNTIyMCAqLworCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlXzNwb3J0IFtdID0geworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxOCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DNTcyMCAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAyMCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DNTcyNSAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxNykgfSwJLyogU2llcnJhIFdpcmVsZXNzIEVNNTYyNSAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDAxOSkgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTk1ICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMjE4KSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM1NzIwICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODAyKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzU1ICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODAzKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzY1ICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODA0KSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzU1IGZvciBFdXJvcGUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MTIpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3NzUgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MjApIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg3NSAqLworCXsgfQorfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNpZXJyYV9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJInNpZXJyYV93aXJlbGVzcyIsCi0JLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKLQkuZGlzY29ubmVjdCA9CXVzYl9zZXJpYWxfZGlzY29ubmVjdCwKLQkuaWRfdGFibGUgPQlpZF90YWJsZSwKKwkubmFtZSAgICAgICA9ICJzaWVycmEiLAorCS5wcm9iZSAgICAgID0gdXNiX3NlcmlhbF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVzYl9zZXJpYWxfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgICA9IGlkX3RhYmxlLAorCS5ub19keW5hbWljX2lkID0gCTEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIHNpZXJyYV9kZXZpY2UgPSB7CisKK3N0YXRpYyBpbnQgZGVidWc7CisKKy8qIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLworI2RlZmluZSBOX0lOX1VSQgk0CisjZGVmaW5lIE5fT1VUX1VSQgkxCisjZGVmaW5lIElOX0JVRkxFTgk0MDk2CisjZGVmaW5lIE9VVF9CVUZMRU4JMTI4CisKK3N0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlIHsKKwkvKiBJbnB1dCBlbmRwb2ludHMgYW5kIGJ1ZmZlciBmb3IgdGhpcyBwb3J0ICovCisJc3RydWN0IHVyYiAqaW5fdXJic1tOX0lOX1VSQl07CisJY2hhciBpbl9idWZmZXJbTl9JTl9VUkJdW0lOX0JVRkxFTl07CisJLyogT3V0cHV0IGVuZHBvaW50cyBhbmQgYnVmZmVyIGZvciB0aGlzIHBvcnQgKi8KKwlzdHJ1Y3QgdXJiICpvdXRfdXJic1tOX09VVF9VUkJdOworCWNoYXIgb3V0X2J1ZmZlcltOX09VVF9VUkJdW09VVF9CVUZMRU5dOworCisJLyogU2V0dGluZ3MgZm9yIHRoZSBwb3J0ICovCisJaW50IHJ0c19zdGF0ZTsJLyogSGFuZHNoYWtpbmcgcGlucyAob3V0cHV0cykgKi8KKwlpbnQgZHRyX3N0YXRlOworCWludCBjdHNfc3RhdGU7CS8qIEhhbmRzaGFraW5nIHBpbnMgKGlucHV0cykgKi8KKwlpbnQgZHNyX3N0YXRlOworCWludCBkY2Rfc3RhdGU7CisJaW50IHJpX3N0YXRlOworCisJdW5zaWduZWQgbG9uZyB0eF9zdGFydF90aW1lW05fT1VUX1VSQl07Cit9OworCitzdGF0aWMgaW50IHNpZXJyYV9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKworCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJaWYgKHBvcnQtPnR0eSkgeworCQlpbnQgdmFsID0gMDsKKwkJaWYgKHBvcnRkYXRhLT5kdHJfc3RhdGUpCisJCQl2YWwgfD0gMHgwMTsKKwkJaWYgKHBvcnRkYXRhLT5ydHNfc3RhdGUpCisJCQl2YWwgfD0gMHgwMjsKKworCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAorCQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCisJCQkJMHgyMiwweDIxLHZhbCwwLE5VTEwsMCxVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpZXJyYV9yeF90aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfcnhfdW50aHJvdHRsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfYnJlYWtfY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKK3sKKwkvKiBVbmZvcnR1bmF0ZWx5LCBJIGRvbid0IGtub3cgaG93IHRvIHNlbmQgYSBicmVhayAqLworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKwlzaWVycmFfc2VuZF9zZXR1cChwb3J0KTsKK30KKworc3RhdGljIGludCBzaWVycmFfdGlvY21nZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKKworCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJdmFsdWUgPSAoKHBvcnRkYXRhLT5ydHNfc3RhdGUpID8gVElPQ01fUlRTIDogMCkgfAorCQkoKHBvcnRkYXRhLT5kdHJfc3RhdGUpID8gVElPQ01fRFRSIDogMCkgfAorCQkoKHBvcnRkYXRhLT5jdHNfc3RhdGUpID8gVElPQ01fQ1RTIDogMCkgfAorCQkoKHBvcnRkYXRhLT5kc3Jfc3RhdGUpID8gVElPQ01fRFNSIDogMCkgfAorCQkoKHBvcnRkYXRhLT5kY2Rfc3RhdGUpID8gVElPQ01fQ0FSIDogMCkgfAorCQkoKHBvcnRkYXRhLT5yaV9zdGF0ZSkgPyBUSU9DTV9STkcgOiAwKTsKKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBzaWVycmFfdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOworCisJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQlwb3J0ZGF0YS0+cnRzX3N0YXRlID0gMTsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlwb3J0ZGF0YS0+ZHRyX3N0YXRlID0gMTsKKworCWlmIChjbGVhciAmIFRJT0NNX1JUUykKKwkJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDA7CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKQorCQlwb3J0ZGF0YS0+ZHRyX3N0YXRlID0gMDsKKwlyZXR1cm4gc2llcnJhX3NlbmRfc2V0dXAocG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgc2llcnJhX2lvY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworLyogV3JpdGUgKi8KK3N0YXRpYyBpbnQgc2llcnJhX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisJaW50IGk7CisJaW50IGxlZnQsIHRvZG87CisJc3RydWN0IHVyYiAqdGhpc191cmIgPSBOVUxMOyAvKiBzcHVyaW91cyAqLworCWludCBlcnI7CisKKwlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCWRiZygiJXM6IHdyaXRlICglZCBjaGFycykiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKworCWkgPSAwOworCWxlZnQgPSBjb3VudDsKKwlmb3IgKGk9MDsgbGVmdCA+IDAgJiYgaSA8IE5fT1VUX1VSQjsgaSsrKSB7CisJCXRvZG8gPSBsZWZ0OworCQlpZiAodG9kbyA+IE9VVF9CVUZMRU4pCisJCQl0b2RvID0gT1VUX0JVRkxFTjsKKworCQl0aGlzX3VyYiA9IHBvcnRkYXRhLT5vdXRfdXJic1tpXTsKKwkJaWYgKHRoaXNfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7CisJCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywKKwkJCQkJcG9ydGRhdGEtPnR4X3N0YXJ0X3RpbWVbaV0gKyAxMCAqIEhaKSkKKwkJCQljb250aW51ZTsKKwkJCXVzYl91bmxpbmtfdXJiKHRoaXNfdXJiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0aGlzX3VyYi0+c3RhdHVzICE9IDApCisJCQlkYmcoInVzYl93cml0ZSAlcCBmYWlsZWQgKGVycj0lZCkiLAorCQkJCXRoaXNfdXJiLCB0aGlzX3VyYi0+c3RhdHVzKTsKKworCQlkYmcoIiVzOiBlbmRwb2ludCAlZCBidWYgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQl1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgaSk7CisKKwkJLyogc2VuZCB0aGUgZGF0YSAqLworCQltZW1jcHkgKHRoaXNfdXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwgdG9kbyk7CisJCXRoaXNfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdG9kbzsKKworCQl0aGlzX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHRoaXNfdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVycikgeworCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYiAlcCAod3JpdGUgYnVsaykgZmFpbGVkICIKKwkJCQkiKCVkLCBoYXMgJWQpIiwgdGhpc191cmIsCisJCQkJZXJyLCB0aGlzX3VyYi0+c3RhdHVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBvcnRkYXRhLT50eF9zdGFydF90aW1lW2ldID0gamlmZmllczsKKwkJYnVmICs9IHRvZG87CisJCWxlZnQgLT0gdG9kbzsKKwl9CisKKwljb3VudCAtPSBsZWZ0OworCWRiZygiJXM6IHdyb3RlIChkaWQgJWQpIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfaW5kYXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCWludCBlcnI7CisJaW50IGVuZHBvaW50OworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKwlkYmcoIiVzOiAlcCIsIF9fRlVOQ1RJT05fXywgdXJiKTsKKworCWVuZHBvaW50ID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOworCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJZGJnKCIlczogbm9uemVybyBzdGF0dXM6ICVkIG9uIGVuZHBvaW50ICUwMnguIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMsIGVuZHBvaW50KTsKKwl9IGVsc2UgeworCQl0dHkgPSBwb3J0LT50dHk7CisJCWlmICh1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCXR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJfSBlbHNlIHsKKwkJCWRiZygiJXM6IGVtcHR5IHJlYWQgdXJiIHJlY2VpdmVkIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCisJCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KKwkJaWYgKHBvcnQtPm9wZW5fY291bnQgJiYgdXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikgeworCQkJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChlcnIpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiAiCisJCQkJCSIoJWQpIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQl9CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgc2llcnJhX291dGRhdF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCisJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHVyYi0+Y29udGV4dDsKKworCXVzYl9zZXJpYWxfcG9ydF9zb2Z0aW50KHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzaWVycmFfaW5zdGF0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzOiB1cmIgJXAgcG9ydCAlcCBoYXMgZGF0YSAlcCIsIF9fRlVOQ1RJT05fXyx1cmIscG9ydCxwb3J0ZGF0YSk7CisKKwlpZiAodXJiLT5zdGF0dXMgPT0gMCkgeworCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXFfcGt0ID0KKwkJCQkoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyOworCisJCWlmICghcmVxX3BrdCkgeworCQkJZGJnKCIlczogTlVMTCByZXFfcGt0XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuOworCQl9CisJCWlmICgocmVxX3BrdC0+YlJlcXVlc3RUeXBlID09IDB4QTEpICYmCisJCQkJKHJlcV9wa3QtPmJSZXF1ZXN0ID09IDB4MjApKSB7CisJCQlpbnQgb2xkX2RjZF9zdGF0ZTsKKwkJCXVuc2lnbmVkIGNoYXIgc2lnbmFscyA9ICooKHVuc2lnbmVkIGNoYXIgKikKKwkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgKworCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCkpOworCisJCQlkYmcoIiVzOiBzaWduYWwgeCV4IiwgX19GVU5DVElPTl9fLCBzaWduYWxzKTsKKworCQkJb2xkX2RjZF9zdGF0ZSA9IHBvcnRkYXRhLT5kY2Rfc3RhdGU7CisJCQlwb3J0ZGF0YS0+Y3RzX3N0YXRlID0gMTsKKwkJCXBvcnRkYXRhLT5kY2Rfc3RhdGUgPSAoKHNpZ25hbHMgJiAweDAxKSA/IDEgOiAwKTsKKwkJCXBvcnRkYXRhLT5kc3Jfc3RhdGUgPSAoKHNpZ25hbHMgJiAweDAyKSA/IDEgOiAwKTsKKwkJCXBvcnRkYXRhLT5yaV9zdGF0ZSA9ICgoc2lnbmFscyAmIDB4MDgpID8gMSA6IDApOworCisJCQlpZiAocG9ydC0+dHR5ICYmICFDX0NMT0NBTChwb3J0LT50dHkpICYmCisJCQkJCW9sZF9kY2Rfc3RhdGUgJiYgIXBvcnRkYXRhLT5kY2Rfc3RhdGUpCisJCQkJdHR5X2hhbmd1cChwb3J0LT50dHkpOworCQl9IGVsc2UgeworCQkJZGJnKCIlczogdHlwZSAleCByZXEgJXgiLCBfX0ZVTkNUSU9OX18sCisJCQkJcmVxX3BrdC0+YlJlcXVlc3RUeXBlLHJlcV9wa3QtPmJSZXF1ZXN0KTsKKwkJfQorCX0gZWxzZQorCQlkYmcoIiVzOiBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCisJLyogUmVzdWJtaXQgdXJiIHNvIHdlIGNvbnRpbnVlIHJlY2VpdmluZyBJUlEgZGF0YSAqLworCWlmICh1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSB7CisJCXVyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnIpCisJCQlkYmcoIiVzOiByZXN1Ym1pdCBpbnRyIHVyYiBmYWlsZWQuICglZCkiLAorCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2llcnJhX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisJaW50IGk7CisJaW50IGRhdGFfbGVuID0gMDsKKwlzdHJ1Y3QgdXJiICp0aGlzX3VyYjsKKworCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJZm9yIChpPTA7IGkgPCBOX09VVF9VUkI7IGkrKykgeworCQl0aGlzX3VyYiA9IHBvcnRkYXRhLT5vdXRfdXJic1tpXTsKKwkJaWYgKHRoaXNfdXJiICYmIHRoaXNfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQorCQkJZGF0YV9sZW4gKz0gT1VUX0JVRkxFTjsKKwl9CisKKwlkYmcoIiVzOiAlZCIsIF9fRlVOQ1RJT05fXywgZGF0YV9sZW4pOworCXJldHVybiBkYXRhX2xlbjsKK30KKworc3RhdGljIGludCBzaWVycmFfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOworCWludCBpOworCWludCBkYXRhX2xlbiA9IDA7CisJc3RydWN0IHVyYiAqdGhpc191cmI7CisKKwlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCWZvciAoaT0wOyBpIDwgTl9PVVRfVVJCOyBpKyspIHsKKwkJdGhpc191cmIgPSBwb3J0ZGF0YS0+b3V0X3VyYnNbaV07CisJCWlmICh0aGlzX3VyYiAmJiB0aGlzX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJCWRhdGFfbGVuICs9IHRoaXNfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCX0KKwlkYmcoIiVzOiAlZCIsIF9fRlVOQ1RJT05fXywgZGF0YV9sZW4pOworCXJldHVybiBkYXRhX2xlbjsKK30KKworc3RhdGljIGludCBzaWVycmFfb3BlbihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlpbnQgaSwgZXJyOworCXN0cnVjdCB1cmIgKnVyYjsKKworCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBTZXQgc29tZSBzYW5lIGRlZmF1bHRzICovCisJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDE7CisJcG9ydGRhdGEtPmR0cl9zdGF0ZSA9IDE7CisKKwkvKiBSZXNldCBsb3cgbGV2ZWwgZGF0YSB0b2dnbGUgYW5kIHN0YXJ0IHJlYWRpbmcgZnJvbSBlbmRwb2ludHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTl9JTl9VUkI7IGkrKykgeworCQl1cmIgPSBwb3J0ZGF0YS0+aW5fdXJic1tpXTsKKwkJaWYgKCEgdXJiKQorCQkJY29udGludWU7CisJCWlmICh1cmItPmRldiAhPSBzZXJpYWwtPmRldikgeworCQkJZGJnKCIlczogZGV2ICVwICE9ICVwIiwgX19GVU5DVElPTl9fLAorCQkJCXVyYi0+ZGV2LCBzZXJpYWwtPmRldik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIG1ha2Ugc3VyZSBlbmRwb2ludCBkYXRhIHRvZ2dsZSBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUKKwkJICogZGV2aWNlCisJCSAqLworCQl1c2JfY2xlYXJfaGFsdCh1cmItPmRldiwgdXJiLT5waXBlKTsKKworCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyKSB7CisJCQlkYmcoIiVzOiBzdWJtaXQgdXJiICVkIGZhaWxlZCAoJWQpICVkIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGksIGVyciwKKwkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCQl9CisJfQorCisJLyogUmVzZXQgbG93IGxldmVsIGRhdGEgdG9nZ2xlIG9uIG91dCBlbmRwb2ludHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTl9PVVRfVVJCOyBpKyspIHsKKwkJdXJiID0gcG9ydGRhdGEtPm91dF91cmJzW2ldOworCQlpZiAoISB1cmIpCisJCQljb250aW51ZTsKKwkJdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKwkJLyogdXNiX3NldHRvZ2dsZSh1cmItPmRldiwgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAorCQkJCXVzYl9waXBlb3V0KHVyYi0+cGlwZSksIDApOyAqLworCX0KKworCXBvcnQtPnR0eS0+bG93X2xhdGVuY3kgPSAxOworCisJc2llcnJhX3NlbmRfc2V0dXAocG9ydCk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF91cmIoc3RydWN0IHVyYiAqdXJiKQoreworCWlmICh1cmIgJiYgdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQl1c2Jfa2lsbF91cmIodXJiKTsKK30KKworc3RhdGljIHZvaWQgc2llcnJhX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBpOworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOworCisJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwlwb3J0ZGF0YS0+cnRzX3N0YXRlID0gMDsKKwlwb3J0ZGF0YS0+ZHRyX3N0YXRlID0gMDsKKworCWlmIChzZXJpYWwtPmRldikgeworCQlzaWVycmFfc2VuZF9zZXR1cChwb3J0KTsKKworCQkvKiBTdG9wIHJlYWRpbmcvd3JpdGluZyB1cmJzICovCisJCWZvciAoaSA9IDA7IGkgPCBOX0lOX1VSQjsgaSsrKQorCQkJc3RvcF91cmIocG9ydGRhdGEtPmluX3VyYnNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgTl9PVVRfVVJCOyBpKyspCisJCQlzdG9wX3VyYihwb3J0ZGF0YS0+b3V0X3VyYnNbaV0pOworCX0KKwlwb3J0LT50dHkgPSBOVUxMOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb25zIHVzZWQgYnkgc2llcnJhX3NldHVwX3VyYnMgKi8KK3N0YXRpYyBzdHJ1Y3QgdXJiICpzaWVycmFfc2V0dXBfdXJiKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsIGludCBlbmRwb2ludCwKKwkJCQkgICAgaW50IGRpciwgdm9pZCAqY3R4LCBjaGFyICpidWYsIGludCBsZW4sCisJCQkJICAgIHVzYl9jb21wbGV0ZV90IGNhbGxiYWNrKQoreworCXN0cnVjdCB1cmIgKnVyYjsKKworCWlmIChlbmRwb2ludCA9PSAtMSkKKwkJcmV0dXJuIE5VTEw7CQkvKiBlbmRwb2ludCBub3QgbmVlZGVkICovCisKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwkJLyogTm8gSVNPICovCisJaWYgKHVyYiA9PSBOVUxMKSB7CisJCWRiZygiJXM6IGFsbG9jIGZvciBlbmRwb2ludCAlZCBmYWlsZWQuIiwgX19GVU5DVElPTl9fLCBlbmRwb2ludCk7CisJCXJldHVybiBOVUxMOworCX0KKworCQkvKiBGaWxsIFVSQiB1c2luZyBzdXBwbGllZCBkYXRhLiAqLworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2VyaWFsLT5kZXYsCisJCSAgICAgIHVzYl9zbmRidWxrcGlwZShzZXJpYWwtPmRldiwgZW5kcG9pbnQpIHwgZGlyLAorCQkgICAgICBidWYsIGxlbiwgY2FsbGJhY2ssIGN0eCk7CisKKwlyZXR1cm4gdXJiOworfQorCisvKiBTZXR1cCB1cmJzICovCitzdGF0aWMgdm9pZCBzaWVycmFfc2V0dXBfdXJicyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoreworCWludCBpLGo7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CisKKwlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKKworCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CisJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CisJCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJLyogRG8gaW5kYXQgZW5kcG9pbnRzIGZpcnN0ICovCisJCWZvciAoaiA9IDA7IGogPCBOX0lOX1VSQjsgKytqKSB7CisJCQlwb3J0ZGF0YS0+aW5fdXJic1tqXSA9IHNpZXJyYV9zZXR1cF91cmIgKHNlcmlhbCwKKyAgICAgICAgICAgICAgICAgIAlwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcywgVVNCX0RJUl9JTiwgcG9ydCwKKyAgICAgICAgICAgICAgICAgIAlwb3J0ZGF0YS0+aW5fYnVmZmVyW2pdLCBJTl9CVUZMRU4sIHNpZXJyYV9pbmRhdF9jYWxsYmFjayk7CisJCX0KKworCQkvKiBvdXRkYXQgZW5kcG9pbnRzICovCisJCWZvciAoaiA9IDA7IGogPCBOX09VVF9VUkI7ICsraikgeworCQkJcG9ydGRhdGEtPm91dF91cmJzW2pdID0gc2llcnJhX3NldHVwX3VyYiAoc2VyaWFsLAorICAgICAgICAgICAgICAgICAgCXBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcywgVVNCX0RJUl9PVVQsIHBvcnQsCisgICAgICAgICAgICAgICAgICAJcG9ydGRhdGEtPm91dF9idWZmZXJbal0sIE9VVF9CVUZMRU4sIHNpZXJyYV9vdXRkYXRfY2FsbGJhY2spOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHNpZXJyYV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGksIGVycjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OworCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKKworCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOworCisJLyogTm93IHNldHVwIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CisJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CisJCXBvcnRkYXRhID0ga3phbGxvYyhzaXplb2YoKnBvcnRkYXRhKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcG9ydGRhdGEpIHsKKwkJCWRiZygiJXM6IGttYWxsb2MgZm9yIHNpZXJyYV9wb3J0X3ByaXZhdGUgKCVkKSBmYWlsZWQhLiIsCisJCQkJCV9fRlVOQ1RJT05fXywgaSk7CisJCQlyZXR1cm4gKDEpOworCQl9CisKKwkJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQsIHBvcnRkYXRhKTsKKworCQlpZiAoISBwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKQorCQkJY29udGludWU7CisJCWVyciA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyKQorCQkJZGJnKCIlczogc3VibWl0IGlycV9pbiB1cmIgZmFpbGVkICVkIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJfQorCisJc2llcnJhX3NldHVwX3VyYnMoc2VyaWFsKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZXJyYV9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoreworCWludCBpLCBqOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOworCisJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBTdG9wIHJlYWRpbmcvd3JpdGluZyB1cmJzICovCisJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKKwkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKKwkJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJCWZvciAoaiA9IDA7IGogPCBOX0lOX1VSQjsgaisrKQorCQkJc3RvcF91cmIocG9ydGRhdGEtPmluX3VyYnNbal0pOworCQlmb3IgKGogPSAwOyBqIDwgTl9PVVRfVVJCOyBqKyspCisJCQlzdG9wX3VyYihwb3J0ZGF0YS0+b3V0X3VyYnNbal0pOworCX0KKworCS8qIE5vdyBmcmVlIHRoZW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgeworCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOworCQlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCQlmb3IgKGogPSAwOyBqIDwgTl9JTl9VUkI7IGorKykgeworCQkJaWYgKHBvcnRkYXRhLT5pbl91cmJzW2pdKSB7CisJCQkJdXNiX2ZyZWVfdXJiKHBvcnRkYXRhLT5pbl91cmJzW2pdKTsKKwkJCQlwb3J0ZGF0YS0+aW5fdXJic1tqXSA9IE5VTEw7CisJCQl9CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IE5fT1VUX1VSQjsgaisrKSB7CisJCQlpZiAocG9ydGRhdGEtPm91dF91cmJzW2pdKSB7CisJCQkJdXNiX2ZyZWVfdXJiKHBvcnRkYXRhLT5vdXRfdXJic1tqXSk7CisJCQkJcG9ydGRhdGEtPm91dF91cmJzW2pdID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCS8qIE5vdyBmcmVlIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgaSsrKSB7CisJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CisJCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIHNpZXJyYV8xcG9ydF9kZXZpY2UgPSB7CiAJLmRyaXZlciA9IHsKLQkub3duZXIgPQkJVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJCSJTaWVycmFfV2lyZWxlc3MiLAorCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLm5hbWUgPQkJInNpZXJyYTEiLAogCX0sCi0JLmlkX3RhYmxlID0JCWlkX3RhYmxlLAotCS5udW1faW50ZXJydXB0X2luID0JTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfaW4gPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX2J1bGtfb3V0ID0JCU5VTV9ET05UX0NBUkUsCi0JLm51bV9wb3J0cyA9CQkzLAorCS5kZXNjcmlwdGlvbiAgICAgICA9ICJTaWVycmEgVVNCIG1vZGVtICgxIHBvcnQpIiwKKwkuaWRfdGFibGUgICAgICAgICAgPSBpZF90YWJsZV8xcG9ydCwKKwkubnVtX2ludGVycnVwdF9pbiAgPSBOVU1fRE9OVF9DQVJFLAorCS5udW1fYnVsa19pbiAgICAgICA9IDEsCisJLm51bV9idWxrX291dCAgICAgID0gMSwKKwkubnVtX3BvcnRzICAgICAgICAgPSAxLAorCS5vcGVuICAgICAgICAgICAgICA9IHNpZXJyYV9vcGVuLAorCS5jbG9zZSAgICAgICAgICAgICA9IHNpZXJyYV9jbG9zZSwKKwkud3JpdGUgICAgICAgICAgICAgPSBzaWVycmFfd3JpdGUsCisJLndyaXRlX3Jvb20gICAgICAgID0gc2llcnJhX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciAgID0gc2llcnJhX2NoYXJzX2luX2J1ZmZlciwKKwkudGhyb3R0bGUgICAgICAgICAgPSBzaWVycmFfcnhfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgICAgICAgID0gc2llcnJhX3J4X3VudGhyb3R0bGUsCisJLmlvY3RsICAgICAgICAgICAgID0gc2llcnJhX2lvY3RsLAorCS5zZXRfdGVybWlvcyAgICAgICA9IHNpZXJyYV9zZXRfdGVybWlvcywKKwkuYnJlYWtfY3RsICAgICAgICAgPSBzaWVycmFfYnJlYWtfY3RsLAorCS50aW9jbWdldCAgICAgICAgICA9IHNpZXJyYV90aW9jbWdldCwKKwkudGlvY21zZXQgICAgICAgICAgPSBzaWVycmFfdGlvY21zZXQsCisJLmF0dGFjaCAgICAgICAgICAgID0gc2llcnJhX3N0YXJ0dXAsCisJLnNodXRkb3duICAgICAgICAgID0gc2llcnJhX3NodXRkb3duLAorCS5yZWFkX2ludF9jYWxsYmFjayA9IHNpZXJyYV9pbnN0YXRfY2FsbGJhY2ssCiB9OwogCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIHNpZXJyYV8zcG9ydF9kZXZpY2UgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0JVEhJU19NT0RVTEUsCisJCS5uYW1lID0JCSJzaWVycmEzIiwKKwl9LAorCS5kZXNjcmlwdGlvbiAgICAgICA9ICJTaWVycmEgVVNCIG1vZGVtICgzIHBvcnQpIiwKKwkuaWRfdGFibGUgICAgICAgICAgPSBpZF90YWJsZV8zcG9ydCwKKwkubnVtX2ludGVycnVwdF9pbiAgPSBOVU1fRE9OVF9DQVJFLAorCS5udW1fYnVsa19pbiAgICAgICA9IDMsCisJLm51bV9idWxrX291dCAgICAgID0gMywKKwkubnVtX3BvcnRzICAgICAgICAgPSAzLAorCS5vcGVuICAgICAgICAgICAgICA9IHNpZXJyYV9vcGVuLAorCS5jbG9zZSAgICAgICAgICAgICA9IHNpZXJyYV9jbG9zZSwKKwkud3JpdGUgICAgICAgICAgICAgPSBzaWVycmFfd3JpdGUsCisJLndyaXRlX3Jvb20gICAgICAgID0gc2llcnJhX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciAgID0gc2llcnJhX2NoYXJzX2luX2J1ZmZlciwKKwkudGhyb3R0bGUgICAgICAgICAgPSBzaWVycmFfcnhfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgICAgICAgID0gc2llcnJhX3J4X3VudGhyb3R0bGUsCisJLmlvY3RsICAgICAgICAgICAgID0gc2llcnJhX2lvY3RsLAorCS5zZXRfdGVybWlvcyAgICAgICA9IHNpZXJyYV9zZXRfdGVybWlvcywKKwkuYnJlYWtfY3RsICAgICAgICAgPSBzaWVycmFfYnJlYWtfY3RsLAorCS50aW9jbWdldCAgICAgICAgICA9IHNpZXJyYV90aW9jbWdldCwKKwkudGlvY21zZXQgICAgICAgICAgPSBzaWVycmFfdGlvY21zZXQsCisJLmF0dGFjaCAgICAgICAgICAgID0gc2llcnJhX3N0YXJ0dXAsCisJLnNodXRkb3duICAgICAgICAgID0gc2llcnJhX3NodXRkb3duLAorCS5yZWFkX2ludF9jYWxsYmFjayA9IHNpZXJyYV9pbnN0YXRfY2FsbGJhY2ssCit9OworCisvKiBGdW5jdGlvbnMgdXNlZCBieSBuZXcgdXNiLXNlcmlhbCBjb2RlLiAqLwogc3RhdGljIGludCBfX2luaXQgc2llcnJhX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3Rlcigmc2llcnJhX2RldmljZSk7CisJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3Rlcigmc2llcnJhXzFwb3J0X2RldmljZSk7CiAJaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKKwkJZ290byBmYWlsZWRfMXBvcnRfZGV2aWNlX3JlZ2lzdGVyOworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJnNpZXJyYV8zcG9ydF9kZXZpY2UpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkXzNwb3J0X2RldmljZV9yZWdpc3RlcjsKKworCiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZzaWVycmFfZHJpdmVyKTsKIAlpZiAocmV0dmFsKQotCQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJnNpZXJyYV9kZXZpY2UpOworCQlnb3RvIGZhaWxlZF9kcml2ZXJfcmVnaXN0ZXI7CisKKwlpbmZvKERSSVZFUl9ERVNDICI6ICIgRFJJVkVSX1ZFUlNJT04pOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9kcml2ZXJfcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzaWVycmFfM3BvcnRfZGV2aWNlKTsKK2ZhaWxlZF8zcG9ydF9kZXZpY2VfcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzaWVycmFfMXBvcnRfZGV2aWNlKTsKK2ZhaWxlZF8xcG9ydF9kZXZpY2VfcmVnaXN0ZXI6CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNpZXJyYV9leGl0KHZvaWQpCiB7Ci0JdXNiX2RlcmVnaXN0ZXIoJnNpZXJyYV9kcml2ZXIpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3Rlcigmc2llcnJhX2RldmljZSk7CisJdXNiX2RlcmVnaXN0ZXIgKCZzaWVycmFfZHJpdmVyKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJnNpZXJyYV8xcG9ydF9kZXZpY2UpOworCXVzYl9zZXJpYWxfZGVyZWdpc3Rlcigmc2llcnJhXzNwb3J0X2RldmljZSk7CiB9CiAKIG1vZHVsZV9pbml0KHNpZXJyYV9pbml0KTsKIG1vZHVsZV9leGl0KHNpZXJyYV9leGl0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCittb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBtZXNzYWdlcyIpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCmluZGV4IDA3NDAwYzAuLjgzMTg5MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiBzdGF0aWMgdm9pZCB0aV91bnRocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIGludCB0aV9pb2N0bChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIHZvaWQgdGlfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQlzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpOworCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpOwogc3RhdGljIGludCB0aV90aW9jbWdldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IHRpX3Rpb2Ntc2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAogCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CkBAIC0yMjgsNiArMjI4LDcgQEAKIC8qIG51bGwgZW50cnkgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB0aV9pZF90YWJsZV8zNDEwWzErVElfRVhUUkFfVklEX1BJRF9DT1VOVCsxXSA9IHsKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV8zNDEwX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKFRJX1ZFTkRPUl9JRCwgVElfMzQxMF9FWjQzMF9JRCkgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB0aV9pZF90YWJsZV81MDUyWzQrVElfRVhUUkFfVklEX1BJRF9DT1VOVCsxXSA9IHsKQEAgLTIzOSw2ICsyNDAsNyBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdGlfaWRfdGFibGVfY29tYmluZWRbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV8zNDEwX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKFRJX1ZFTkRPUl9JRCwgVElfMzQxMF9FWjQzMF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV81MDUyX0JPT1RfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV81MTUyX0JPT1RfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV81MDUyX0VFUFJPTV9QUk9EVUNUX0lEKSB9LApAQCAtNDU5LDEzICs0NjEsMTIgQEAKIAogCS8qIHNldCB1cCBwb3J0IHN0cnVjdHVyZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewotCQl0cG9ydCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aV9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJCXRwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRpX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHRwb3J0ID09IE5VTEwpIHsKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWdvdG8gZnJlZV90cG9ydHM7CiAJCX0KLQkJbWVtc2V0KHRwb3J0LCAwLCBzaXplb2Yoc3RydWN0IHRpX3BvcnQpKTsKIAkJc3Bpbl9sb2NrX2luaXQoJnRwb3J0LT50cF9sb2NrKTsKIAkJdHBvcnQtPnRwX3VhcnRfYmFzZV9hZGRyID0gKGkgPT0gMCA/IFRJX1VBUlQxX0JBU0VfQUREUiA6IFRJX1VBUlQyX0JBU0VfQUREUik7CiAJCXRwb3J0LT50cF9mbGFncyA9IGxvd19sYXRlbmN5ID8gQVNZTkNfTE9XX0xBVEVOQ1kgOiAwOwpAQCAtODgwLDcgKzg4MSw3IEBACiAKIAogc3RhdGljIHZvaWQgdGlfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQlzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCisJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKIAlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKQEAgLTE3MDksNyArMTcxMCw3IEBACiB7CiAJc3RydWN0IGNpcmNfYnVmICpjYjsKIAotCWNiID0gKHN0cnVjdCBjaXJjX2J1ZiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaXJjX2J1ZiksIEdGUF9LRVJORUwpOworCWNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNpcmNfYnVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNiID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuaAppbmRleCAwMmMxYWViLi5iNTU0MWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmgKQEAgLTI4LDYgKzI4LDcgQEAKIC8qIFZlbmRvciBhbmQgcHJvZHVjdCBpZHMgKi8KICNkZWZpbmUgVElfVkVORE9SX0lECQkJMHgwNDUxCiAjZGVmaW5lIFRJXzM0MTBfUFJPRFVDVF9JRAkJMHgzNDEwCisjZGVmaW5lIFRJXzM0MTBfRVo0MzBfSUQJCTB4RjQzMCAgLyogVEkgZXo0MzAgZGV2ZWxvcG1lbnQgdG9vbCAqLwogI2RlZmluZSBUSV81MDUyX0JPT1RfUFJPRFVDVF9JRAkJMHg1MDUyCS8qIG5vIEVFUFJPTSwgbm8gZmlybXdhcmUgKi8KICNkZWZpbmUgVElfNTE1Ml9CT09UX1BST0RVQ1RfSUQJCTB4NTE1MgkvKiBubyBFRVBST00sIG5vIGZpcm13YXJlICovCiAjZGVmaW5lIFRJXzUwNTJfRUVQUk9NX1BST0RVQ1RfSUQJMHg1MDVBCS8qIEVFUFJPTSwgbm8gZmlybXdhcmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCmluZGV4IDgwMDZlNTEuLjcxNmY2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgc2VyaWFsX3NldF90ZXJtaW9zIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCkKK3N0YXRpYyB2b2lkIHNlcmlhbF9zZXRfdGVybWlvcyAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICogb2xkKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCkBAIC01MzMsOSArNTMzLDEwIEBACiAJc2NoZWR1bGVfd29yaygmcG9ydC0+d29yayk7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYl9zZXJpYWxfcG9ydF93b3JrKHZvaWQgKnByaXZhdGUpCitzdGF0aWMgdm9pZCB1c2Jfc2VyaWFsX3BvcnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHByaXZhdGU7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0LCB3b3JrKTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CkBAIC03OTksNyArODAwLDcgQEAKIAkJcG9ydC0+c2VyaWFsID0gc2VyaWFsOwogCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CiAJCW11dGV4X2luaXQoJnBvcnQtPm11dGV4KTsKLQkJSU5JVF9XT1JLKCZwb3J0LT53b3JrLCB1c2Jfc2VyaWFsX3BvcnRfd29yaywgcG9ydCk7CisJCUlOSVRfV09SSygmcG9ydC0+d29yaywgdXNiX3NlcmlhbF9wb3J0X3dvcmspOwogCQlzZXJpYWwtPnBvcnRbaV0gPSBwb3J0OwogCX0KIApAQCAtOTUyLDMyICs5NTMsMjggQEAKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKIAkJaWYgKCFwb3J0KQogCQkJY29udGludWU7Ci0JCWlmIChwb3J0LT5yZWFkX3VyYikKLQkJCXVzYl9mcmVlX3VyYiAocG9ydC0+cmVhZF91cmIpOworCQl1c2JfZnJlZV91cmIocG9ydC0+cmVhZF91cmIpOwogCQlrZnJlZShwb3J0LT5idWxrX2luX2J1ZmZlcik7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBudW1fYnVsa19vdXQ7ICsraSkgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwogCQlpZiAoIXBvcnQpCiAJCQljb250aW51ZTsKLQkJaWYgKHBvcnQtPndyaXRlX3VyYikKLQkJCXVzYl9mcmVlX3VyYiAocG9ydC0+d3JpdGVfdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJCWtmcmVlKHBvcnQtPmJ1bGtfb3V0X2J1ZmZlcik7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBudW1faW50ZXJydXB0X2luOyArK2kpIHsKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKIAkJaWYgKCFwb3J0KQogCQkJY29udGludWU7Ci0JCWlmIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKQotCQkJdXNiX2ZyZWVfdXJiIChwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOwogCQlrZnJlZShwb3J0LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IG51bV9pbnRlcnJ1cHRfb3V0OyArK2kpIHsKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKIAkJaWYgKCFwb3J0KQogCQkJY29udGludWU7Ci0JCWlmIChwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYikKLQkJCXVzYl9mcmVlX3VyYiAocG9ydC0+aW50ZXJydXB0X291dF91cmIpOworCQl1c2JfZnJlZV91cmIocG9ydC0+aW50ZXJydXB0X291dF91cmIpOwogCQlrZnJlZShwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3YTVlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogVVNCIERlYnVnIGNhYmxlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqCTIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivc2VyaWFsLmg+CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwNTI1LCAweDEyN2EpIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkZWJ1Z19kcml2ZXIgPSB7CisJLm5hbWUgPQkJImRlYnVnIiwKKwkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWlkX3RhYmxlLAorCS5ub19keW5hbWljX2lkID0gCTEsCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIGRlYnVnX2RldmljZSA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLm5hbWUgPQkJImRlYnVnIiwKKwl9LAorCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKKwkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCisJLm51bV9idWxrX2luID0JCU5VTV9ET05UX0NBUkUsCisJLm51bV9idWxrX291dCA9CQlOVU1fRE9OVF9DQVJFLAorCS5udW1fcG9ydHMgPQkJMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRlYnVnX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZGVidWdfZGV2aWNlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmZGVidWdfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmRlYnVnX2RldmljZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRlYnVnX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmZGVidWdfZHJpdmVyKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmRlYnVnX2RldmljZSk7Cit9CisKK21vZHVsZV9pbml0KGRlYnVnX2luaXQpOworbW9kdWxlX2V4aXQoZGVidWdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCmluZGV4IGJlZmUyZTEuLmIwOWYwNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCkBAIC00Niw3ICs0Niw3IEBACiBzdGF0aWMgaW50ICB2aXNvcl9jYWxjX251bV9wb3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKIHN0YXRpYyB2b2lkIHZpc29yX3NodXRkb3duCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKIHN0YXRpYyBpbnQgIHZpc29yX2lvY3RsCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgdm9pZCB2aXNvcl9zZXRfdGVybWlvcwkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKTsKK3N0YXRpYyB2b2lkIHZpc29yX3NldF90ZXJtaW9zCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKTsKIHN0YXRpYyB2b2lkIHZpc29yX3dyaXRlX2J1bGtfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZCB2aXNvcl9yZWFkX2J1bGtfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZCB2aXNvcl9yZWFkX2ludF9jYWxsYmFjawkoc3RydWN0IHVyYiAqdXJiKTsKQEAgLTM0OCw4ICszNDgsNyBAQAogCQkJIAogCS8qIHNodXRkb3duIG91ciB1cmJzICovCiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKLQlpZiAocG9ydC0+aW50ZXJydXB0X2luX3VyYikKLQkJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOworCXVzYl9raWxsX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKIAogCS8qIFRyeSB0byBzZW5kIHNodXRkb3duIG1lc3NhZ2UsIGlmIHRoZSBkZXZpY2UgaXMgZ29uZSwgdGhpcyB3aWxsIGp1c3QgZmFpbC4gKi8KIAl0cmFuc2Zlcl9idWZmZXIgPSAga21hbGxvYyAoMHgxMiwgR0ZQX0tFUk5FTCk7CkBAIC05MTcsNyArOTE2LDcgQEAKIAogCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGFsbCBuaWNlIGFuZCBnb29kLCBidXQgd2UgZG9uJ3QgY2hhbmdlIGFueXRoaW5nIGJhc2VkIG9uIGl0IDopICovCi1zdGF0aWMgdm9pZCB2aXNvcl9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgdmlzb3Jfc2V0X3Rlcm1pb3MgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJdW5zaWduZWQgaW50IGNmbGFnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKaW5kZXggNGQxY2Q3YS4uNTQ4M2Q4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiBzdGF0aWMgaW50ICB3aGl0ZWhlYXRfd3JpdGUJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiBzdGF0aWMgaW50ICB3aGl0ZWhlYXRfd3JpdGVfcm9vbQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiBzdGF0aWMgaW50ICB3aGl0ZWhlYXRfaW9jdGwJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyB2b2lkIHdoaXRlaGVhdF9zZXRfdGVybWlvcwkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKiBvbGQpOworc3RhdGljIHZvaWQgd2hpdGVoZWF0X3NldF90ZXJtaW9zCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogc3RhdGljIGludCAgd2hpdGVoZWF0X3Rpb2NtZ2V0CQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCAgd2hpdGVoZWF0X3Rpb2Ntc2V0CQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CiBzdGF0aWMgdm9pZCB3aGl0ZWhlYXRfYnJlYWtfY3RsCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKTsKQEAgLTIyNyw2ICsyMjcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJcnhfdXJic19zdWJtaXR0ZWQ7CiAJc3RydWN0IGxpc3RfaGVhZAlyeF91cmJfcTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcnhfd29yazsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CSpwb3J0OwogCXN0cnVjdCBsaXN0X2hlYWQJdHhfdXJic19mcmVlOwogCXN0cnVjdCBsaXN0X2hlYWQJdHhfdXJic19zdWJtaXR0ZWQ7CiB9OwpAQCAtMjQxLDcgKzI0Miw3IEBACiBzdGF0aWMgaW50IHN0YXJ0X3BvcnRfcmVhZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyBzdHJ1Y3Qgd2hpdGVoZWF0X3VyYl93cmFwICp1cmJfdG9fd3JhcChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3RfZmlyc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Ci1zdGF0aWMgdm9pZCByeF9kYXRhX3NvZnRpbnQodm9pZCAqcHJpdmF0ZSk7CitzdGF0aWMgdm9pZCByeF9kYXRhX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RhdGljIGludCBmaXJtX3NlbmRfY29tbWFuZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBfX3U4IGNvbW1hbmQsIF9fdTggKmRhdGEsIF9fdTggZGF0YXNpemUpOwogc3RhdGljIGludCBmaXJtX29wZW4oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CkBAIC00MTUsNyArNDE2LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7IGkrKykgewogCQlwb3J0ID0gc2VyaWFsLT5wb3J0W2ldOwogCi0JCWluZm8gPSAoc3RydWN0IHdoaXRlaGVhdF9wcml2YXRlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHdoaXRlaGVhdF9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGluZm8gPT0gTlVMTCkgewogCQkJZXJyKCIlczogT3V0IG9mIG1lbW9yeSBmb3IgcG9ydCBzdHJ1Y3R1cmVzXG4iLCBzZXJpYWwtPnR5cGUtPmRlc2NyaXB0aW9uKTsKIAkJCWdvdG8gbm9fcHJpdmF0ZTsKQEAgLTQyNCw3ICs0MjUsOCBAQAogCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CiAJCWluZm8tPmZsYWdzID0gMDsKIAkJaW5mby0+bWNyID0gMDsKLQkJSU5JVF9XT1JLKCZpbmZvLT5yeF93b3JrLCByeF9kYXRhX3NvZnRpbnQsIHBvcnQpOworCQlJTklUX1dPUksoJmluZm8tPnJ4X3dvcmssIHJ4X2RhdGFfc29mdGludCk7CisJCWluZm8tPnBvcnQgPSBwb3J0OwogCiAJCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5yeF91cmJzX2ZyZWUpOwogCQlJTklUX0xJU1RfSEVBRCgmaW5mby0+cnhfdXJic19zdWJtaXR0ZWQpOwpAQCAtNDg1LDcgKzQ4Nyw3IEBACiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBpbmZvKTsKIAl9CiAKLQljb21tYW5kX2luZm8gPSAoc3RydWN0IHdoaXRlaGVhdF9jb21tYW5kX3ByaXZhdGUgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd2hpdGVoZWF0X2NvbW1hbmRfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCWNvbW1hbmRfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3aGl0ZWhlYXRfY29tbWFuZF9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNvbW1hbmRfaW5mbyA9PSBOVUxMKSB7CiAJCWVycigiJXM6IE91dCBvZiBtZW1vcnkgZm9yIHBvcnQgc3RydWN0dXJlc1xuIiwgc2VyaWFsLT50eXBlLT5kZXNjcmlwdGlvbik7CiAJCWdvdG8gbm9fY29tbWFuZF9wcml2YXRlOwpAQCAtNTk1LDcgKzU5Nyw3IEBACiBzdGF0aWMgaW50IHdoaXRlaGVhdF9vcGVuIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpbnQJCXJldHZhbCA9IDA7Ci0Jc3RydWN0IHRlcm1pb3MJb2xkX3Rlcm07CisJc3RydWN0IGt0ZXJtaW9zCW9sZF90ZXJtOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTg2OCw3ICs4NzAsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHdoaXRlaGVhdF9zZXRfdGVybWlvcyAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorc3RhdGljIHZvaWQgd2hpdGVoZWF0X3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCWRiZygiJXMgLXBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTk0OSw3ICs5NTEsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKIAogCWlmIChhY3R1YWxseV90aHJvdHRsZWQpCi0JCXJ4X2RhdGFfc29mdGludChwb3J0KTsKKwkJcnhfZGF0YV9zb2Z0aW50KCZpbmZvLT5yeF93b3JrKTsKIAogCXJldHVybjsKIH0KQEAgLTE0MDAsMTAgKzE0MDIsMTEgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCByeF9kYXRhX3NvZnRpbnQodm9pZCAqcHJpdmF0ZSkKK3N0YXRpYyB2b2lkIHJ4X2RhdGFfc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopcHJpdmF0ZTsKLQlzdHJ1Y3Qgd2hpdGVoZWF0X3ByaXZhdGUgKmluZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJc3RydWN0IHdoaXRlaGVhdF9wcml2YXRlICppbmZvID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3aGl0ZWhlYXRfcHJpdmF0ZSwgcnhfd29yayk7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IGluZm8tPnBvcnQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKIAlzdHJ1Y3Qgd2hpdGVoZWF0X3VyYl93cmFwICp3cmFwOwogCXN0cnVjdCB1cmIgKnVyYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYwppbmRleCAzYmFmNDQ4Li5lNTY1ZDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL29uZXRvdWNoLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vbmV0b3VjaC5jCkBAIC03Niw3ICs3Niw3IEBACiAJaW5wdXRfc3luYyhkZXYpOwogCiByZXN1Ym1pdDoKLQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBTTEFCX0FUT01JQyk7CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0YXR1cykKIAkJZXJyICgiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQwLCBzdGF0dXMgJWQiLAogCQkJb25ldG91Y2gtPnVkZXYtPmJ1cy0+YnVzX25hbWUsCkBAIC0xNDIsMTAgKzE0Miw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFsyXS5kZXNjOwotCWlmICghKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKQotCQkJIT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKHVkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKQEAgLTE1Nyw3ICsxNTQsNyBAQAogCQlnb3RvIGZhaWwxOwogCiAJb25ldG91Y2gtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIE9ORVRPVUNIX1BLVF9MRU4sCi0JCQkJCSAgU0xBQl9BVE9NSUMsICZvbmV0b3VjaC0+ZGF0YV9kbWEpOworCQkJCQkgIEdGUF9BVE9NSUMsICZvbmV0b3VjaC0+ZGF0YV9kbWEpOwogCWlmICghb25ldG91Y2gtPmRhdGEpCiAJCWdvdG8gZmFpbDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jCmluZGV4IGZiOGJhY2EuLmUzNTI4ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuYwpAQCAtNjQ2LDcgKzY0Niw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JYnVmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyhidWxrbGVuLCBHRlBfTk9JTyk7CisJYnVmID0ga21hbGxvYyhidWxrbGVuLCBHRlBfTk9JTyk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwppbmRleCA0NzY0NGI1Li4zMjMyOTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKQEAgLTQyNyw3ICs0MjcsNyBAQAogCVVTX0RFQlVHUCgiJXM6IHhmZXIgJXUgYnl0ZXMsICVkIGVudHJpZXNcbiIsIF9fRlVOQ1RJT05fXywKIAkJCWxlbmd0aCwgbnVtX3NnKTsKIAlyZXN1bHQgPSB1c2Jfc2dfaW5pdCgmdXMtPmN1cnJlbnRfc2csIHVzLT5wdXNiX2RldiwgcGlwZSwgMCwKLQkJCXNnLCBudW1fc2csIGxlbmd0aCwgU0xBQl9OT0lPKTsKKwkJCXNnLCBudW1fc2csIGxlbmd0aCwgR0ZQX05PSU8pOwogCWlmIChyZXN1bHQpIHsKIAkJVVNfREVCVUdQKCJ1c2Jfc2dfaW5pdCByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKIAkJcmV0dXJuIFVTQl9TVE9SX1hGRVJfRVJST1I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCBjOWE4ZDUwLi5kYjhiMjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTU1LDcgKzU1LDggQEAKICAgICAgICAgICAgICAgICBVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKICAgICAgICAgICAgICAgICBVU19GTF9JR05PUkVfUkVTSURVRSksCiAKLVVOVVNVQUxfREVWKCAgMHgwM2VlLCAweDY5MDEsIDB4MDAwMCwgMHgwMTAwLAorLyogbW9kaWZpZWQgYnkgVG9iaWFzIExvcmVueiA8dG9iaWFzLmxvcmVuekBnbXgubmV0PiAqLworVU5VU1VBTF9ERVYoICAweDAzZWUsIDB4NjkwMSwgMHgwMDAwLCAweDAyMDAsCiAJCSJNaXRzdW1pIiwKIAkJIlVTQiBGREQiLAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKQEAgLTE4Miw2ICsxODMsMjAgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0lHTk9SRV9SRVNJRFVFIHwgVVNfRkxfRklYX0NBUEFDSVRZICksCiAKKy8qIFJlcG9ydGVkIGJ5IEJhcmR1ciBBcmFudHNzb24gPGJhcmR1ckBzY2llbnRpY2lhbi5uZXQ+ICovCitVTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwNDdjLCAweDAzNzAsIDB4MDM3MCwKKwkJIk5va2lhIiwKKwkJIjYxMzEiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKKworLyogUmVwb3J0ZWQgYnkgQWxleCBDb3Jjb2xlcyA8YWxleEBjb3Jjb2xlcy5uZXQ+ICovCitVTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwNDk1LCAweDAzNzAsIDB4MDM3MCwKKwkJIk5va2lhIiwKKwkJIjYyMzQiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKKwogLyogUmVwb3J0ZWQgYnkgT2xhZiBIZXJpbmcgPG9saEBzdXNlLmRlPiBmcm9tIG5vdmVsbCBidWcgIzEwNTg3OCAqLwogVU5VU1VBTF9ERVYoICAweDA0MjQsIDB4MGZkYywgMHgwMjEwLCAweDAyMTAsCiAJCSJTTVNDIiwKQEAgLTEyMjEsNyArMTIzNiw3IEBACiAJCSJDb3dvbiBTeXN0ZW1zIiwKIAkJImlBVURJTyBNNSIsCiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfQlVMSywgTlVMTCwKLQkJMCApLAorCQlVU19GTF9ORUVEX09WRVJSSURFICksCiAKIC8qIFN1Ym1pdHRlZCBieSBBbnRvaW5lIE1haXJlc3NlIDxhbnRvaW5lLm1haXJlc3NlQGZyZWUuZnI+ICovCiBVTlVTVUFMX0RFViggMHgwZWQxLCAweDY2NjAsIDB4MDEwMCwgMHgwMzAwLApAQCAtMTI5NCwxMyArMTMwOSwyNSBAQAogLyogUmVwb3J0ZWQgYnkgS2V2aW4gQ2VybmVrZWUgPGtwYy11c2JkZXZAZ2VsYXRvLnVpdWMuZWR1PgogICogVGVzdGVkIG9uIGhhcmR3YXJlIHZlcnNpb24gMS4xMC4KICAqIEVudHJ5IGlzIG5lZWRlZCBvbmx5IGZvciB0aGUgaW5pdGlhbGl6ZXIgZnVuY3Rpb24gb3ZlcnJpZGUuCisgKiBEZXZpY2VzIHdpdGggYmNkID4gMTEwIHNlZW0gdG8gbm90IG5lZWQgaXQgd2hpbGUgdGhvc2UKKyAqIHdpdGggYmNkIDwgMTEwIGFwcGVhciB0byBuZWVkIGl0LgogICovCi1VTlVTVUFMX0RFViggIDB4MTAxOSwgMHgwYzU1LCAweDAxMTAsIDB4MDExMCwKK1VOVVNVQUxfREVWKCAgMHgxMDE5LCAweDBjNTUsIDB4MDAwMCwgMHgwMTEwLAogCQkiRGVza25vdGUiLAogCQkiVUNSLTYxUzJCIiwKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIHVzYl9zdG9yX3VjcjYxczJiX2luaXQsCiAJCTAgKSwKIAorLyogUmVwb3J0ZWQgYnkgSmFjbyBLcm9vbiA8amFjb0Brcm9vbi5jby56YT4KKyAqIFRoZSB1c2Itc3RvcmFnZSBtb2R1bGUgZm91bmQgb24gdGhlIERpZ2l0ZWNoIEdOWDQgKGFuZCBzdXBwb3NlZGx5IG90aGVyCisgKiBkZXZpY2VzKSBtaXNiZWhhdmVzIGFuZCBjYXVzZXMgYSBidW5jaCBvZiBpbnZhbGlkIEkvTyBlcnJvcnMuCisgKi8KK1VOVVNVQUxfREVWKCAgMHgxMjEwLCAweDAwMDMsIDB4MDEwMCwgMHgwMTAwLAorCQkiRGlnaXRlY2ggSE1HIiwKKwkJIkRpZ2lUZWNoIE1hc3MgU3RvcmFnZSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9JR05PUkVfUkVTSURVRSApLAorCiAvKiBSZXBvcnRlZCBieSBWaWxpdXMgQmlsaW5rZXZpY2l1cyA8dmlsaXNhcyBBVCB4eHggRE9UIGx0KSAqLwogVU5VU1VBTF9ERVYoICAweDEzMmIsIDB4MDAwYiwgMHgwMDAxLCAweDAwMDEsCiAJCSJNaW5vbHRhIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCmluZGV4IGI4ZDYwMzEuLjcwNjQ0NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwpAQCAtNDksNyArNDksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTc0MCwxOCArNzQwLDE2IEBACiAJCWVwID0gJmFsdHNldHRpbmctPmVuZHBvaW50W2ldLmRlc2M7CiAKIAkJLyogSXMgaXQgYSBCVUxLIGVuZHBvaW50PyAqLwotCQlpZiAoKGVwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKLQkJCQk9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwKSkgewogCQkJLyogQlVMSyBpbiBvciBvdXQ/ICovCi0JCQlpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKQorCQkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZXApKQogCQkJCWVwX2luID0gZXA7CiAJCQllbHNlCiAJCQkJZXBfb3V0ID0gZXA7CiAJCX0KIAogCQkvKiBJcyBpdCBhbiBpbnRlcnJ1cHQgZW5kcG9pbnQ/ICovCi0JCWVsc2UgaWYgKChlcC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCi0JCQkJPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKSB7CisJCWVsc2UgaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcCkpIHsKIAkJCWVwX2ludCA9IGVwOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9LY29uZmlnIGIvZHJpdmVycy92aWRlby9LY29uZmlnCmluZGV4IDdhNDMwMjAuLjRlODNmMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKQEAgLTU0MSw2ICs1NDEsNyBAQAogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKKwlzZWxlY3QgQklUUkVWRVJTRQogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgZHJpdmVyIGZvciBnZW5lcmljIFRHQSBncmFwaGljCiAJICBjYXJkcy4gU2F5IFkgaWYgeW91IGhhdmUgb25lIG9mIHRob3NlLgpAQCAtNTUxLDYgKzU1Miw3IEBACiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAorCXNlbGVjdCBWSURFT19TRUxFQ1QKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlIGRyaXZlciBmb3IgZ2VuZXJpYyBWRVNBIDIuMAogCSAgY29tcGxpYW50IGdyYXBoaWMgY2FyZHMuIFRoZSBvbGRlciBWRVNBIDEuMiBjYXJkcyBhcmUgbm90IHN1cHBvcnRlZC4KQEAgLTcwNSw2ICs3MDcsNyBAQAogCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKIAlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKKwlzZWxlY3QgQklUUkVWRVJTRQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGdyYXBoaWNzIGJvYXJkcyB3aXRoIHRoZSBuVmlkaWEgY2hpcHMsIFROVAogCSAgYW5kIG5ld2VyLiBGb3IgdmVyeSBvbGQgY2hpcHNldHMsIHN1Y2ggYXMgdGhlIFJJVkExMjgsIHRoZW4gdXNlCkBAIC03NDQsNiArNzQ3LDcgQEAKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQogCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJc2VsZWN0IEJJVFJFVkVSU0UKIAloZWxwCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBncmFwaGljcyBib2FyZHMgd2l0aCB0aGUgblZpZGlhIFJpdmEvR2Vmb3JjZQogCSAgY2hpcHMuCkBAIC0xNjExLDYgKzE2MTUsMTYgQEAKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBQTlg0MDA4IFJHQiBGcmFtZWJ1ZmZlcgogCitjb25maWcgRkJfSUJNX0dYVDQ1MDAKKwl0cmlzdGF0ZSAiRnJhbWVidWZmZXIgc3VwcG9ydCBmb3IgSUJNIEdYVDQ1MDBQIGFkYXB0b3IiCisJZGVwZW5kcyBvbiBQUEMKKwlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCisJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQorCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIElCTSBHWFQ0NTAwUCBkaXNwbGF5CisJICBhZGFwdG9yLCBmb3VuZCBvbiBzb21lIElCTSBTeXN0ZW0gUCAocFNlcmllcykgbWFjaGluZXMuCisKIGNvbmZpZyBGQl9WSVJUVUFMCiAJdHJpc3RhdGUgIlZpcnR1YWwgRnJhbWUgQnVmZmVyIHN1cHBvcnQgKE9OTFkgRk9SIFRFU1RJTkchKSIKIAlkZXBlbmRzIG9uIEZCCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQppbmRleCBhNjk4MGU5Li4zMDlhMjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKQEAgLTk5LDYgKzk5LDcgQEAKIG9iai0kKENPTkZJR19GQl9TM0MyNDEwKQkgICs9IHMzYzI0MTBmYi5vCiBvYmotJChDT05GSUdfRkJfUE5YNDAwOF9EVU0pCSAgKz0gcG54NDAwOC8KIG9iai0kKENPTkZJR19GQl9QTlg0MDA4X0RVTV9SR0IpICArPSBwbng0MDA4Lworb2JqLSQoQ09ORklHX0ZCX0lCTV9HWFQ0NTAwKQkgICs9IGd4dDQ1MDAubwogCiAjIFBsYXRmb3JtIG9yIGZhbGxiYWNrIGRyaXZlcnMgZ28gaGVyZQogb2JqLSQoQ09ORklHX0ZCX1ZFU0EpICAgICAgICAgICAgICs9IHZlc2FmYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL1MzdHJpb2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL1MzdHJpb2ZiLmMKaW5kZXggMzk3MDA1ZS4uYjM3MTdjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9TM3RyaW9mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vUzN0cmlvZmIuYwpAQCAtNTM1LDggKzUzNSwxMSBAQAogI2VuZGlmCiAKICAgICBmYl9pbmZvLmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKLSAgICBpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoJmZiX2luZm8pIDwgMCkKLQlyZXR1cm47CisgICAgaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKSA8IDApIHsKKwkJaW91bm1hcChmYl9pbmZvLnNjcmVlbl9iYXNlKTsKKwkJZmJfaW5mby5zY3JlZW5fYmFzZSA9IE5VTEw7CisJCXJldHVybjsKKyAgICB9CiAKICAgICBwcmludGsoImZiJWQ6IFMzIFRyaW8gZnJhbWUgYnVmZmVyIGRldmljZSBvbiAlc1xuIiwKIAkgICBmYl9pbmZvLm5vZGUsIGRwLT5mdWxsX25hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYyBiL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKaW5kZXggNjc2MWI2OC4uNmM5ZGMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCkBAIC00NDcsNyArNDQ3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZmIgPSAoc3RydWN0IGNsY2RfZmIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGNsY2RfZmIpLCBHRlBfS0VSTkVMKTsKKwlmYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGNkX2ZiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmYikgewogCQlwcmludGsoS0VSTl9JTkZPICJDTENEOiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IGNsY2RfZmIgc3RydWN0XG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYW1pZmIuYyBiL2RyaXZlcnMvdmlkZW8vYW1pZmIuYwppbmRleCBhNGUzZmNhLi4xYTg0OWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2FtaWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hbWlmYi5jCkBAIC0yNDA3LDEwICsyNDA3LDEwIEBACiAJCQkJCQkgICBmYl9pbmZvLmZpeC5zbWVtX2xlbik7CiAJaWYgKCF2aWRlb21lbW9yeSkgewogCQlwcmludGsoImFtaWZiOiBXQVJOSU5HISB1bmFibGUgdG8gbWFwIHZpZGVvbWVtIGNhY2hlZCB3cml0ZXRocm91Z2hcbiIpOwotCQl2aWRlb21lbW9yeSA9IFpUV09fVkFERFIoZmJfaW5mby5maXguc21lbV9zdGFydCk7Ci0JfQorCQlmYl9pbmZvLnNjcmVlbl9iYXNlID0gKGNoYXIgKilaVFdPX1ZBRERSKGZiX2luZm8uZml4LnNtZW1fc3RhcnQpOworCX0gZWxzZQorCQlmYl9pbmZvLnNjcmVlbl9iYXNlID0gKGNoYXIgKil2aWRlb21lbW9yeTsKIAotCWZiX2luZm8uc2NyZWVuX2Jhc2UgPSAoY2hhciAqKXZpZGVvbWVtb3J5OwogCW1lbXNldChkdW1teXNwcml0ZSwgMCwgRFVNTVlTUFJJVEVNRU1TSVpFKTsKIAogCS8qCkBAIC0yNDUzLDYgKzI0NTMsOCBAQAogewogCWZiX2RlYWxsb2NfY21hcCgmZmJfaW5mby5jbWFwKTsKIAljaGlwZnJlZSgpOworCWlmICh2aWRlb21lbW9yeSkKKwkJaW91bm1hcCgodm9pZCopdmlkZW9tZW1vcnkpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihDVVNUT01fUEhZU0FERFIrMHhlMCwgMHgxMjApOwogCWN1c3RvbS5kbWFjb24gPSBETUFGX0FMTCB8IERNQUZfTUFTVEVSOwogfQpAQCAtMjkwNCwxNCArMjkwNiw2IEBACiAJcGFyLT5jcnNyLnNwb3RfeCA9IHBhci0+Y3Jzci5zcG90X3kgPSAwOwogCXBhci0+Y3Jzci5oZWlnaHQgPSBwYXItPmNyc3Iud2lkdGggPSAwOwogCi0jaWYgMAkvKiBmYm1vbiBub3QgZG9uZS4gIHVuY29tbWVudCBmb3IgMi41LnggLWJyYWQgKi8KLQlpZiAoIWZibW9uX3ZhbGlkX3RpbWluZ3MocGl4Y2xvY2tbY2xrX3NoaWZ0XSwgaHRvdGFsLCB2dG90YWwsCi0JCQkJICZmYl9pbmZvKSkgewotCQlEUFJJTlRLKCJtb2RlIGRvZXNuJ3QgZml0IGZvciBtb25pdG9yXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotI2VuZGlmCi0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hcmNmYi5jIGIvZHJpdmVycy92aWRlby9hcmNmYi5jCmluZGV4IGFiMzRiOTYuLjMwYTgzNjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2FyY2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hcmNmYi5jCkBAIC00NTQsNyArNDU0LDcgQEAKIAl1bnNpZ25lZCBpbnQgeHJlczsKIAogCXAgPSAqcHBvczsKLQlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlmYmlkeCA9IGltaW5vcihpbm9kZSk7CiAJaW5mbyA9IHJlZ2lzdGVyZWRfZmJbZmJpZHhdOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0YWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0YWZiLmMKaW5kZXggMDJjNDFhNi4uNjAyZGI2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdGFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXRhZmIuYwpAQCAtMjgwNCw4ICsyODA0LDE5IEBACiAJYXRhZmJfc2V0X2Rpc3AoLTEsICZmYl9pbmZvKTsKIAlkb19pbnN0YWxsX2NtYXAoMCwgJmZiX2luZm8pOwogCi0JaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKSA8IDApCisJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKSA8IDApIHsKKyNpZmRlZiBBVEFGQl9FWFQKKwkJaWYgKGV4dGVybmFsX2FkZHIpIHsKKwkJCWlvdW5tYXAoZXh0ZXJuYWxfYWRkcik7CisJCQlleHRlcm5hbF9hZGRyID0gTlVMTDsKKwkJfQorCQlpZiAoZXh0ZXJuYWxfdmdhaW9iYXNlKSB7CisJCQlpb3VubWFwKCh2b2lkKilleHRlcm5hbF92Z2Fpb2Jhc2UpOworCQkJZXh0ZXJuYWxfdmdhaW9iYXNlID0gMDsKKwkJfQorI2VuZGlmCiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXByaW50aygiRGV0ZXJtaW5lZCAlZHglZCwgZGVwdGggJWRcbiIsCiAJICAgICAgIGRpc3AudmFyLnhyZXMsIGRpc3AudmFyLnlyZXMsIGRpc3AudmFyLmJpdHNfcGVyX3BpeGVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCmluZGV4IDI3NmEyMTUuLjNmZWRkZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwpAQCAtMTMzMyw2ICsxMzMzLDggQEAKIAlpZiAodmNsayAqIDEyIDwgYy5wcGxsX21pbikKIAkJdmNsayA9IGMucHBsbF9taW4vMTI7CiAKKwlwbGwtPnBvc3RfZGl2aWRlciA9IC0xOworCiAJLyogbm93LCBmaW5kIGFuIGFjY2VwdGFibGUgZGl2aWRlciAqLwogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocG9zdF9kaXZpZGVycyk7IGkrKykgewogCQlvdXRwdXRfZnJlcSA9IHBvc3RfZGl2aWRlcnNbaV0gKiB2Y2xrOwpAQCAtMTM0Miw2ICsxMzQ0LDkgQEAKIAkJfQogCX0KIAorCWlmIChwbGwtPnBvc3RfZGl2aWRlciA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogY2FsY3VsYXRlIGZlZWRiYWNrIGRpdmlkZXIgKi8KIAluID0gYy5yZWZfZGl2aWRlciAqIG91dHB1dF9mcmVxOwogCWQgPSBjLnJlZl9jbGs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYi5oIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmIuaAppbmRleCBiMDRmNDlmLi5mNzJmYWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiLmgKQEAgLTEyNiw3ICsxMjYsNiBAQAogICAgICAqLwogCiBzdHJ1Y3QgYXR5ZmJfcGFyIHsKLQlzdHJ1Y3QgYXR5X2NtYXBfcmVncyBfX2lvbWVtICphdHlfY21hcF9yZWdzOwogCXN0cnVjdCB7IHU4IHJlZCwgZ3JlZW4sIGJsdWU7IH0gcGFsZXR0ZVsyNTZdOwogCWNvbnN0IHN0cnVjdCBhdHlfZGFjX29wcyAqZGFjX29wczsKIAljb25zdCBzdHJ1Y3QgYXR5X3BsbF9vcHMgKnBsbF9vcHM7CkBAIC0xODYsNiArMTg1LDcgQEAKIAlpbnQgbXRycl9hcGVyOwogCWludCBtdHJyX3JlZzsKICNlbmRpZgorCXUzMiBtZW1fY250bDsKIH07CiAKICAgICAvKgpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCXJlZ2luZGV4IC09IDB4ODAwOwogCiAjaWZkZWYgQ09ORklHX0FUQVJJCi0JcmV0dXJuIGluX2xlMzIoKHZvbGF0aWxlIHUzMiAqKShwYXItPmF0aV9yZWdiYXNlICsgcmVnaW5kZXgpKTsKKwlyZXR1cm4gaW5fbGUzMihwYXItPmF0aV9yZWdiYXNlICsgcmVnaW5kZXgpOwogI2Vsc2UKIAlyZXR1cm4gcmVhZGwocGFyLT5hdGlfcmVnYmFzZSArIHJlZ2luZGV4KTsKICNlbmRpZgpAQCAtMjQwLDcgKzI0MCw3IEBACiAJCXJlZ2luZGV4IC09IDB4ODAwOwogCiAjaWZkZWYgQ09ORklHX0FUQVJJCi0Jb3V0X2xlMzIoKHZvbGF0aWxlIHUzMiAqKShwYXItPmF0aV9yZWdiYXNlICsgcmVnaW5kZXgpLCB2YWwpOworCW91dF9sZTMyKHBhci0+YXRpX3JlZ2Jhc2UgKyByZWdpbmRleCwgdmFsKTsKICNlbHNlCiAJd3JpdGVsKHZhbCwgcGFyLT5hdGlfcmVnYmFzZSArIHJlZ2luZGV4KTsKICNlbmRpZgpAQCAtMjUzLDcgKzI1Myw3IEBACiAJaWYgKHJlZ2luZGV4ID49IDB4NDAwKQogCQlyZWdpbmRleCAtPSAweDgwMDsKICNpZmRlZiBDT05GSUdfQVRBUkkKLQlvdXRfbGUxNigodm9sYXRpbGUgdTE2ICopKHBhci0+YXRpX3JlZ2Jhc2UgKyByZWdpbmRleCksIHZhbCk7CisJb3V0X2xlMTYocGFyLT5hdGlfcmVnYmFzZSArIHJlZ2luZGV4LCB2YWwpOwogI2Vsc2UKIAl3cml0ZWwodmFsLCBwYXItPmF0aV9yZWdiYXNlICsgcmVnaW5kZXgpOwogI2VuZGlmCkBAIC0zMTUsNiArMzE1LDcgQEAKIAl2b2lkICgqc2V0X3BsbCkgICAoY29uc3Qgc3RydWN0IGZiX2luZm8gKiBpbmZvLCBjb25zdCB1bmlvbiBhdHlfcGxsICogcGxsKTsKIAl2b2lkICgqZ2V0X3BsbCkgICAoY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8sIHVuaW9uIGF0eV9wbGwgKiBwbGwpOwogCWludCAoKmluaXRfcGxsKSAgIChjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqIGluZm8sIHVuaW9uIGF0eV9wbGwgKiBwbGwpOworCXZvaWQgKCpyZXN1bWVfcGxsKShjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5pb24gYXR5X3BsbCAqcGxsKTsKIH07CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYXR5X3BsbF9vcHMgYXR5X3BsbF9hdGkxODgxOF8xOyAvKiBBVEkgMTg4MTggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwppbmRleCBiNzdiMzA5Li4wOTY4NGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCkBAIC0yMDMsMTQgKzIwMyw2IEBACiAgICAgICogIFRoZSBIYXJkd2FyZSBwYXJhbWV0ZXJzIGZvciBlYWNoIGNhcmQKICAgICAgKi8KIAotc3RydWN0IGF0eV9jbWFwX3JlZ3MgewotCXU4IHdpbmRleDsKLQl1OCBsdXQ7Ci0JdTggbWFzazsKLQl1OCByaW5kZXg7Ci0JdTggY250bDsKLX07Ci0KIHN0cnVjdCBwY2lfbW1hcF9tYXAgewogCXVuc2lnbmVkIGxvbmcgdm9mZjsKIAl1bnNpZ25lZCBsb25nIHBvZmY7CkBAIC0yNDksNyArMjQxLDggQEAKICAgICAgKiAgSW50ZXJuYWwgcm91dGluZXMKICAgICAgKi8KIAotc3RhdGljIGludCBhdHlfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IGF0eV9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIGF0eV9yZXN1bWVfY2hpcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAjaWZkZWYgQ09ORklHX0FUQVJJCiBzdGF0aWMgaW50IHN0b3JlX3ZpZGVvX3BhcihjaGFyICp2aWRlb3BhciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKTsKICNlbmRpZgpAQCAtNDA2LDcgKzM5OSw3IEBACiAJeyBQQ0lfQ0hJUF9NQUNINjRMQiwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEIsIEFHUCkiLCAyMzYsIDc1LCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKIAl7IFBDSV9DSElQX01BQ0g2NExELCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMRCwgQUdQKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKIAl7IFBDSV9DSElQX01BQ0g2NExJLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMSSwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfCBNNjRGX0czX1BCXzFfMSB8IE02NEZfRzNfUEJfMTAyNHg3NjggfSwKLQl7IFBDSV9DSElQX01BQ0g2NExQLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMUCwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKKwl7IFBDSV9DSElQX01BQ0g2NExQLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMUCwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCiAJeyBQQ0lfQ0hJUF9NQUNINjRMUSwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTFEsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIH0sCiAKIAl7IFBDSV9DSElQX01BQ0g2NEdNLCAiM0QgUkFHRSBYTCAoTWFjaDY0IEdNLCBBR1AgMngpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKQEAgLTE0OTUsMTAgKzE0ODgsNiBAQAogCWVsc2UKIAkJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gMDsKIAotI2lmIDAgLyogZmJtb24gaXMgbm90IGRvbmUuIHVuY29tbWVudCBmb3IgMi41LnggLWJyYWQgKi8KLQlpZiAoIWZibW9uX3ZhbGlkX3RpbWluZ3MocGl4Y2xvY2ssIGh0b3RhbCwgdnRvdGFsLCBpbmZvKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKIAlhdHlfY3J0Y190b192YXIoJmNydGMsIHZhcik7CiAJdmFyLT5waXhjbG9jayA9IHBhci0+cGxsX29wcy0+cGxsX3RvX3ZhcihpbmZvLCAmcGxsKTsKIAlyZXR1cm4gMDsKQEAgLTE5MzcsMTcgKzE5MjYsMTQgQEAKIAkJYXR5X3N0XzgoREFDX0NOVEwsIHRtcCwgcGFyKTsKIAkJYXR5X3N0XzgoREFDX01BU0ssIDB4ZmYsIHBhcik7CiAKLQkJd3JpdGViKGksICZwYXItPmF0eV9jbWFwX3JlZ3MtPnJpbmRleCk7Ci0JCWF0eWZiX3NhdmUucltlbnRlcl1baV0gPSByZWFkYigmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwotCQlhdHlmYl9zYXZlLmdbZW50ZXJdW2ldID0gcmVhZGIoJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKLQkJYXR5ZmJfc2F2ZS5iW2VudGVyXVtpXSA9IHJlYWRiKCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7Ci0JCXdyaXRlYihpLCAmcGFyLT5hdHlfY21hcF9yZWdzLT53aW5kZXgpOwotCQl3cml0ZWIoYXR5ZmJfc2F2ZS5yWzEgLSBlbnRlcl1baV0sCi0JCSAgICAgICAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwotCQl3cml0ZWIoYXR5ZmJfc2F2ZS5nWzEgLSBlbnRlcl1baV0sCi0JCSAgICAgICAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwotCQl3cml0ZWIoYXR5ZmJfc2F2ZS5iWzEgLSBlbnRlcl1baV0sCi0JCSAgICAgICAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOworCQlhdHlfc3RfOChEQUNfUl9JTkRFWCwgaSwgcGFyKTsKKwkJYXR5ZmJfc2F2ZS5yW2VudGVyXVtpXSA9IGF0eV9sZF84KERBQ19EQVRBLCBwYXIpOworCQlhdHlmYl9zYXZlLmdbZW50ZXJdW2ldID0gYXR5X2xkXzgoREFDX0RBVEEsIHBhcik7CisJCWF0eWZiX3NhdmUuYltlbnRlcl1baV0gPSBhdHlfbGRfOChEQUNfREFUQSwgcGFyKTsKKwkJYXR5X3N0XzgoREFDX1dfSU5ERVgsIGksIHBhcik7CisJCWF0eV9zdF84KERBQ19EQVRBLCBhdHlmYl9zYXZlLnJbMSAtIGVudGVyXVtpXSwgcGFyKTsKKwkJYXR5X3N0XzgoREFDX0RBVEEsIGF0eWZiX3NhdmUuZ1sxIC0gZW50ZXJdW2ldLCBwYXIpOworCQlhdHlfc3RfOChEQUNfREFUQSwgYXR5ZmJfc2F2ZS5iWzEgLSBlbnRlcl1baV0sIHBhcik7CiAJfQogfQogCkBAIC0xOTgyLDYgKzE5NjgsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BDSSkKIAorI2lmZGVmIENPTkZJR19QUENfUE1BQwogLyogUG93ZXIgbWFuYWdlbWVudCByb3V0aW5lcy4gVGhvc2UgYXJlIHVzZWQgZm9yIFBvd2VyQm9vayBzbGVlcC4KICAqLwogc3RhdGljIGludCBhdHlfcG93ZXJfbWdtdChpbnQgc2xlZXAsIHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKQEAgLTIwMzgsMjEgKzIwMjUsMTMgQEAKIAogCXJldHVybiB0aW1lb3V0ID8gMCA6IC1FSU87CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBhdHlmYl9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKIAotI2lmbmRlZiBDT05GSUdfUFBDX1BNQUMKLQkvKiBIQUNLIEFMRVJUICEgT25jZSBJIGZpbmQgYSBwcm9wZXIgd2F5IHRvIHNheSB0byBlYWNoIGRyaXZlcgotCSAqIGluZGl2aWR1YWxseSB3aGF0IHdpbGwgaGFwcGVuIHdpdGggaXQncyBQQ0kgc2xvdCwgSSdsbCBjaGFuZ2UKLQkgKiB0aGF0LiBPbiBsYXB0b3BzLCB0aGUgQUdQIHNsb3QgaXMganVzdCB1bmNsb2NrZWQsIHNvIEQyIGlzCi0JICogZXhwZWN0ZWQsIHdoaWxlIG9uIGRlc2t0b3BzLCB0aGUgY2FyZCBpcyBwb3dlcmVkIG9mZgotCSAqLwotCXJldHVybiAwOwotI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwotCiAJaWYgKHN0YXRlLmV2ZW50ID09IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKIAkJcmV0dXJuIDA7CiAKQEAgLTIwNzAsNiArMjA0OSw3IEBACiAJcGFyLT5hc2xlZXAgPSAxOwogCXBhci0+bG9ja19ibGFuayA9IDE7CiAKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAkvKiBTZXQgY2hpcCB0byAic3VzcGVuZCIgbW9kZSAqLwogCWlmIChhdHlfcG93ZXJfbWdtdCgxLCBwYXIpKSB7CiAJCXBhci0+YXNsZWVwID0gMDsKQEAgLTIwNzksNiArMjA1OSw5IEBACiAJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIAkJcmV0dXJuIC1FSU87CiAJfQorI2Vsc2UKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKyNlbmRpZgogCiAJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwogCkBAIC0yMDk3LDggKzIwODAsMTUgQEAKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKIAorI2lmZGVmIENPTkZJR19QUENfUE1BQwogCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gMikKIAkJYXR5X3Bvd2VyX21nbXQoMCwgcGFyKTsKKyNlbHNlCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworI2VuZGlmCisKKwlhdHlfcmVzdW1lX2NoaXAoaW5mbyk7CisKIAlwYXItPmFzbGVlcCA9IDA7CiAKIAkvKiBSZXN0b3JlIGRpc3BsYXkgKi8KQEAgLTIzNDQsMjQgKzIzMzQsMTYgQEAKIH0KICNlbmRpZiAvKiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGF0eV9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIGludCBfX2RldmluaXQgYXR5X2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwogCWNvbnN0IGNoYXIgKnJhbW5hbWUgPSBOVUxMLCAqeHRhbDsKIAlpbnQgZ3RiX21lbXNpemUsIGhhc192YXIgPSAwOwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7Ci0JdTggcGxsX3JlZl9kaXY7Ci0JdTMyIGk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUFBDKQotCWludCBzZW5zZTsKLSNlbmRpZgogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcGFyLT52Ymxhbmsud2FpdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnBhci0+aW50X2xvY2spOwogCi0JcGFyLT5hdHlfY21hcF9yZWdzID0KLQkgICAgKHN0cnVjdCBhdHlfY21hcF9yZWdzIF9faW9tZW0gKikgKHBhci0+YXRpX3JlZ2Jhc2UgKyAweGMwKTsKLQogI2lmZGVmIENPTkZJR19QUENfUE1BQwogCS8qIFRoZSBBcHBsZSBpQm9vazEgdXNlcyBub24tc3RhbmRhcmQgbWVtb3J5IGZyZXF1ZW5jaWVzLiBXZSBkZXRlY3QgaXQKIAkgKiBhbmQgc2V0IHRoZSBmcmVxdWVuY3kgbWFudWFsbHkuICovCkBAIC0yNDY0LDE4ICsyNDQ2LDIxIEBACiAJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDYzOwogCX0KIAotCWlmIChNNjRfSEFTKEdUQl9EU1ApCi0JICAgICYmIChwbGxfcmVmX2RpdiA9IGF0eV9sZF9wbGxfY3QoUExMX1JFRl9ESVYsIHBhcikpKSB7Ci0JCWludCBkaWZmMSwgZGlmZjI7Ci0JCWRpZmYxID0gNTEwICogMTQgLyBwbGxfcmVmX2RpdiAtIHBhci0+cGxsX2xpbWl0cy5wbGxfbWF4OwotCQlkaWZmMiA9IDUxMCAqIDI5IC8gcGxsX3JlZl9kaXYgLSBwYXItPnBsbF9saW1pdHMucGxsX21heDsKLQkJaWYgKGRpZmYxIDwgMCkKLQkJCWRpZmYxID0gLWRpZmYxOwotCQlpZiAoZGlmZjIgPCAwKQotCQkJZGlmZjIgPSAtZGlmZjI7Ci0JCWlmIChkaWZmMiA8IGRpZmYxKSB7Ci0JCQlwYXItPnJlZl9jbGtfcGVyID0gMTAwMDAwMDAwMDAwMFVMTCAvIDI5NDk4OTI4OwotCQkJeHRhbCA9ICIyOS40OTg5MjgiOworCWlmIChNNjRfSEFTKEdUQl9EU1ApKSB7CisJCXU4IHBsbF9yZWZfZGl2ID0gYXR5X2xkX3BsbF9jdChQTExfUkVGX0RJViwgcGFyKTsKKworCQlpZiAocGxsX3JlZl9kaXYpIHsKKwkJCWludCBkaWZmMSwgZGlmZjI7CisJCQlkaWZmMSA9IDUxMCAqIDE0IC8gcGxsX3JlZl9kaXYgLSBwYXItPnBsbF9saW1pdHMucGxsX21heDsKKwkJCWRpZmYyID0gNTEwICogMjkgLyBwbGxfcmVmX2RpdiAtIHBhci0+cGxsX2xpbWl0cy5wbGxfbWF4OworCQkJaWYgKGRpZmYxIDwgMCkKKwkJCQlkaWZmMSA9IC1kaWZmMTsKKwkJCWlmIChkaWZmMiA8IDApCisJCQkJZGlmZjIgPSAtZGlmZjI7CisJCQlpZiAoZGlmZjIgPCBkaWZmMSkgeworCQkJCXBhci0+cmVmX2Nsa19wZXIgPSAxMDAwMDAwMDAwMDAwVUxMIC8gMjk0OTg5Mjg7CisJCQkJeHRhbCA9ICIyOS40OTg5MjgiOworCQkJfQogCQl9CiAJfQogI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KQEAgLTI0ODUsMTAgKzI0NzAsMTAgQEAKIAlpZihwYXItPnBsbF9vcHMtPmdldF9wbGwpCiAJCXBhci0+cGxsX29wcy0+Z2V0X3BsbChpbmZvLCAmc2F2ZWRfcGxsKTsKIAotCWkgPSBhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKTsKKwlwYXItPm1lbV9jbnRsID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcik7CiAJZ3RiX21lbXNpemUgPSBNNjRfSEFTKEdUQl9EU1ApOwogCWlmIChndGJfbWVtc2l6ZSkKLQkJc3dpdGNoIChpICYgMHhGKSB7CS8qIDB4RiB1c2VkIGluc3RlYWQgb2YgTUVNX1NJWkVfQUxJQVMgKi8KKwkJc3dpdGNoIChwYXItPm1lbV9jbnRsICYgMHhGKSB7CS8qIDB4RiB1c2VkIGluc3RlYWQgb2YgTUVNX1NJWkVfQUxJQVMgKi8KIAkJY2FzZSBNRU1fU0laRV81MTJLOgogCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDsKIAkJCWJyZWFrOwpAQCAtMjUxMCw3ICsyNDk1LDcgQEAKIAkJZGVmYXVsdDoKIAkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7CiAJfSBlbHNlCi0JCXN3aXRjaCAoaSAmIE1FTV9TSVpFX0FMSUFTKSB7CisJCXN3aXRjaCAocGFyLT5tZW1fY250bCAmIE1FTV9TSVpFX0FMSUFTKSB7CiAJCWNhc2UgTUVNX1NJWkVfNTEySzoKIAkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7CiAJCQlicmVhazsKQEAgLTI1NDAsMjAgKzI1MjUsMjAgQEAKIAogCWlmICh2cmFtKSB7CiAJCWluZm8tPmZpeC5zbWVtX2xlbiA9IHZyYW0gKiAxMDI0OwotCQlpID0gaSAmIH4oZ3RiX21lbXNpemUgPyAweEYgOiBNRU1fU0laRV9BTElBUyk7CisJCXBhci0+bWVtX2NudGwgJj0gfihndGJfbWVtc2l6ZSA/IDB4RiA6IE1FTV9TSVpFX0FMSUFTKTsKIAkJaWYgKGluZm8tPmZpeC5zbWVtX2xlbiA8PSAweDgwMDAwKQotCQkJaSB8PSBNRU1fU0laRV81MTJLOworCQkJcGFyLT5tZW1fY250bCB8PSBNRU1fU0laRV81MTJLOwogCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHgxMDAwMDApCi0JCQlpIHw9IE1FTV9TSVpFXzFNOworCQkJcGFyLT5tZW1fY250bCB8PSBNRU1fU0laRV8xTTsKIAkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4MjAwMDAwKQotCQkJaSB8PSBndGJfbWVtc2l6ZSA/IE1FTV9TSVpFXzJNX0dUQiA6IE1FTV9TSVpFXzJNOworCQkJcGFyLT5tZW1fY250bCB8PSBndGJfbWVtc2l6ZSA/IE1FTV9TSVpFXzJNX0dUQiA6IE1FTV9TSVpFXzJNOwogCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHg0MDAwMDApCi0JCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfNE1fR1RCIDogTUVNX1NJWkVfNE07CisJCQlwYXItPm1lbV9jbnRsIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfNE1fR1RCIDogTUVNX1NJWkVfNE07CiAJCWVsc2UgaWYgKGluZm8tPmZpeC5zbWVtX2xlbiA8PSAweDYwMDAwMCkKLQkJCWkgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV82TV9HVEIgOiBNRU1fU0laRV82TTsKKwkJCXBhci0+bWVtX2NudGwgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV82TV9HVEIgOiBNRU1fU0laRV82TTsKIAkJZWxzZQotCQkJaSB8PSBndGJfbWVtc2l6ZSA/IE1FTV9TSVpFXzhNX0dUQiA6IE1FTV9TSVpFXzhNOwotCQlhdHlfc3RfbGUzMihNRU1fQ05UTCwgaSwgcGFyKTsKKwkJCXBhci0+bWVtX2NudGwgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV84TV9HVEIgOiBNRU1fU0laRV84TTsKKwkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIHBhci0+bWVtX2NudGwsIHBhcik7CiAJfQogCiAJLyoKQEAgLTI1OTksMTEgKzI1ODQsMTIgQEAKICNlbmRpZgogCWlmKHBhci0+cGxsX29wcy0+aW5pdF9wbGwpCiAJCXBhci0+cGxsX29wcy0+aW5pdF9wbGwoaW5mbywgJnBhci0+cGxsKTsKKwlpZiAocGFyLT5wbGxfb3BzLT5yZXN1bWVfcGxsKQorCQlwYXItPnBsbF9vcHMtPnJlc3VtZV9wbGwoaW5mbywgJnBhci0+cGxsKTsKIAogCS8qCi0JICogIExhc3QgcGFnZSBvZiA4IE1CICg0IE1CIG9uIElTQSkgYXBlcnR1cmUgaXMgTU1JTwotCSAqICBGSVhNRTogd2Ugc2hvdWxkIHVzZSB0aGUgYXV4aWxpYXJ5IGFwZXJ0dXJlIGluc3RlYWQgc28gd2UgY2FuIGFjY2VzcwotCSAqICB0aGUgZnVsbCA4IE1CIG9mIHZpZGVvIFJBTSBvbiA4IE1CIGJvYXJkcworCSAqICBMYXN0IHBhZ2Ugb2YgOCBNQiAoNCBNQiBvbiBJU0EpIGFwZXJ0dXJlIGlzIE1NSU8sCisJICogIHVubGVzcyB0aGUgYXV4aWxpYXJ5IHJlZ2lzdGVyIGFwZXJ0dXJlIGlzIHVzZWQuCiAJICovCiAKIAlpZiAoIXBhci0+YXV4X3N0YXJ0ICYmCkBAIC0yNjY5LDYgKzI2NTUsNyBAQAogCQkJCWhhc192YXIgPSAxOwogCQl9IGVsc2UgewogCQkJaWYgKGRlZmF1bHRfdm1vZGUgPT0gVk1PREVfQ0hPT1NFKSB7CisJCQkJaW50IHNlbnNlOwogCQkJCWlmIChNNjRfSEFTKEczX1BCXzEwMjR4NzY4KSkKIAkJCQkJLyogRzMgUG93ZXJCb29rIHdpdGggMTAyNHg3NjggTENEICovCiAJCQkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV8xMDI0Xzc2OF82MDsKQEAgLTI3NDksNyArMjczNiw3IEBACiAJZmJfbGlzdCA9IGluZm87CiAKIAlQUklOVEtJKCJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlIG9uICVzXG4iLAotCSAgICAgICBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQsIG5hbWUpOworCQlpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQsIHBhci0+YnVzX3R5cGUgPT0gSVNBID8gIklTQSIgOiAiUENJIik7CiAJcmV0dXJuIDA7CiAKIGF0eV9pbml0X2V4aXQ6CkBAIC0yNzcwLDYgKzI3NTcsMTkgQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyB2b2lkIGF0eV9yZXN1bWVfY2hpcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlhdHlfc3RfbGUzMihNRU1fQ05UTCwgcGFyLT5tZW1fY250bCwgcGFyKTsKKworCWlmIChwYXItPnBsbF9vcHMtPnJlc3VtZV9wbGwpCisJCXBhci0+cGxsX29wcy0+cmVzdW1lX3BsbChpbmZvLCAmcGFyLT5wbGwpOworCisJaWYgKHBhci0+YXV4X3N0YXJ0KQorCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgYXR5X2xkX2xlMzIoQlVTX0NOVEwsIHBhcikgfCBCVVNfQVBFUl9SRUdfRElTLCBwYXIpOworfQorCiAjaWZkZWYgQ09ORklHX0FUQVJJCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzdG9yZV92aWRlb19wYXIoY2hhciAqdmlkZW9fc3RyLCB1bnNpZ25lZCBjaGFyIG02NF9udW0pCiB7CkBAIC0yODI2LDkgKzI4MjYsOSBAQAogI2VuZGlmCiAKIAlnZW5fY250bCA9IGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcik7CisJZ2VuX2NudGwgJj0gfjB4NDAwMDA0YzsKIAlzd2l0Y2ggKGJsYW5rKSB7Ci0gICAgICAgIAljYXNlIEZCX0JMQU5LX1VOQkxBTks6Ci0JCQlnZW5fY250bCAmPSB+MHg0MDAwMDRjOworCQljYXNlIEZCX0JMQU5LX1VOQkxBTks6CiAJCQlicmVhazsKIAkJY2FzZSBGQl9CTEFOS19OT1JNQUw6CiAJCQlnZW5fY250bCB8PSAweDQwMDAwNDA7CkBAIC0yODYzLDE3ICsyODYzLDEwIEBACiBzdGF0aWMgdm9pZCBhdHlfc3RfcGFsKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAogCQkgICAgICAgY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKQogewotI2lmZGVmIENPTkZJR19BVEFSSQotCW91dF84KCZwYXItPmF0eV9jbWFwX3JlZ3MtPndpbmRleCwgcmVnbm8pOwotCW91dF84KCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCwgcmVkKTsKLQlvdXRfOCgmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQsIGdyZWVuKTsKLQlvdXRfOCgmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQsIGJsdWUpOwotI2Vsc2UKLQl3cml0ZWIocmVnbm8sICZwYXItPmF0eV9jbWFwX3JlZ3MtPndpbmRleCk7Ci0Jd3JpdGViKHJlZCwgJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKLQl3cml0ZWIoZ3JlZW4sICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7Ci0Jd3JpdGViKGJsdWUsICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7Ci0jZW5kaWYKKwlhdHlfc3RfOChEQUNfV19JTkRFWCwgcmVnbm8sIHBhcik7CisJYXR5X3N0XzgoREFDX0RBVEEsIHJlZCwgcGFyKTsKKwlhdHlfc3RfOChEQUNfREFUQSwgZ3JlZW4sIHBhcik7CisJYXR5X3N0XzgoREFDX0RBVEEsIGJsdWUsIHBhcik7CiB9CiAKICAgICAvKgpAQCAtMzE4Miw3ICszMTc1LDcgQEAKIAogI2lmZGVmIF9faTM4Nl9fCiAjaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAotc3RhdGljIHZvaWQgYXR5X2luaXRfbGNkKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgdTMyIGJpb3NfYmFzZSkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdHlfaW5pdF9sY2Qoc3RydWN0IGF0eWZiX3BhciAqcGFyLCB1MzIgYmlvc19iYXNlKQogewogCXUzMiBkcml2X2luZl90YWIsIHNpZzsKIAl1MTYgbGNkX29mczsKQEAgLTM1MjcsNiArMzUyMCwxMCBAQAogYXR5ZmJfc2V0dXBfZ2VuZXJpY19mYWlsOgogCWlvdW5tYXAocGFyLT5hdGlfcmVnYmFzZSk7CiAJcGFyLT5hdGlfcmVnYmFzZSA9IE5VTEw7CisJaWYgKGluZm8tPnNjcmVlbl9iYXNlKSB7CisJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCQlpbmZvLT5zY3JlZW5fYmFzZSA9IE5VTEw7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM1OTQsNyArMzU5MSw3IEBACiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOwogCiAJLyogSW5pdCBjaGlwICYgcmVnaXN0ZXIgZnJhbWVidWZmZXIgKi8KLQlpZiAoYXR5X2luaXQoaW5mbywgIlBDSSIpKQorCWlmIChhdHlfaW5pdChpbmZvKSkKIAkJZ290byBlcnJfcmVsZWFzZV9pbzsKIAogI2lmZGVmIF9fc3BhcmNfXwpAQCAtMzY0MSwxMiArMzYzOCwxMyBAQAogCiAjaWZkZWYgQ09ORklHX0FUQVJJCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX2F0YXJpX3Byb2JlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhdHlmYl9hdGFyaV9wcm9iZSh2b2lkKQogewogCXN0cnVjdCBhdHlmYl9wYXIgKnBhcjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlpbnQgbTY0X251bTsKIAl1MzIgY2xvY2tfcjsKKwlpbnQgbnVtX2ZvdW5kID0gMDsKIAogCWZvciAobTY0X251bSA9IDA7IG02NF9udW0gPCBtYWNoNjRfY291bnQ7IG02NF9udW0rKykgewogCQlpZiAoIXBoeXNfdm1lbWJhc2VbbTY0X251bV0gfHwgIXBoeXNfc2l6ZVttNjRfbnVtXSB8fApAQCAtMzY5NCwxNiArMzY5MiwzNCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoYXR5X2luaXQoaW5mbywgIklTQSBidXMiKSkgeworCQkvKiBGYWtlIHBjaV9pZCBmb3IgY29ycmVjdF9jaGlwc2V0KCkgKi8KKwkJc3dpdGNoIChhdHlfbGRfbGUzMihDT05GSUdfQ0hJUF9JRCwgcGFyKSAmIENGR19DSElQX1RZUEUpIHsKKwkJY2FzZSAweDAwZDc6CisJCQlwYXItPnBjaV9pZCA9IFBDSV9DSElQX01BQ0g2NEdYOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDU3OgorCQkJcGFyLT5wY2lfaWQgPSBQQ0lfQ0hJUF9NQUNINjRDWDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY29ycmVjdF9jaGlwc2V0KHBhcikgfHwgYXR5X2luaXQoaW5mbykpIHsKKwkJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCQkJaW91bm1hcChwYXItPmF0aV9yZWdiYXNlKTsKIAkJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Ci0JCQkvKiBUaGlzIGlzIGluc3VmZmljaWVudCEga2VybmVsX21hcCBoYXMgYWRkZWQgdHdvIGxhcmdlIGNodW5rcyEhICovCi0JCQlyZXR1cm4gLUVOWElPOworCQl9IGVsc2UgeworCQkJbnVtX2ZvdW5kKys7CiAJCX0KIAl9CisKKwlyZXR1cm4gbnVtX2ZvdW5kID8gMCA6IC1FTlhJTzsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19BVEFSSSAqLwogCisjaWZkZWYgQ09ORklHX1BDSQorCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXR5ZmJfcmVtb3ZlKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKQEAgLTM3NTEsNyArMzc2Nyw2IEBACiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIH0KIAotI2lmZGVmIENPTkZJR19QQ0kKIAogc3RhdGljIHZvaWQgX19kZXZleGl0IGF0eWZiX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CkBAIC0zNzg2LDcgKzM4MDEsNyBAQAogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50IF9faW5pdCBhdHlmYl9zZXR1cChjaGFyICpvcHRpb25zKQogewogCWNoYXIgKnRoaXNfb3B0OwogCkBAIC0zODU4LDcgKzM4NzMsNyBAQAogfQogI2VuZGlmICAvKiAgTU9EVUxFICAqLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhdHlmYl9pbml0KHZvaWQpCiB7CiAgICAgaW50IGVycjEgPSAxLCBlcnIyID0gMTsKICNpZm5kZWYgTU9EVUxFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9tYWNoNjRfY3QuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L21hY2g2NF9jdC5jCmluZGV4IDUwODA4MTYuLmYzYjQ4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L21hY2g2NF9jdC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L21hY2g2NF9jdC5jCkBAIC0zNzAsOCArMzcwLDggQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR5X2dldF9wbGxfY3QoY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8sCi0JCQkJICB1bmlvbiBhdHlfcGxsICpwbGwpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYXR5X2dldF9wbGxfY3QoY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJICAgICB1bmlvbiBhdHlfcGxsICpwbGwpCiB7CiAJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwogCXU4IHRtcCwgY2xvY2s7CkBAIC0zOTQsMTIgKzM5NCwxMiBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgYXR5X2luaXRfcGxsX2N0KGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvLAotCQkJCSB1bmlvbiBhdHlfcGxsICpwbGwpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlfaW5pdF9wbGxfY3QoY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJICAgICB1bmlvbiBhdHlfcGxsICpwbGwpCiB7CiAJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwotCXU4IG1wb3N0X2RpdiwgeHBvc3RfZGl2LCBzY2xrX3Bvc3RfZGl2X3JlYWwsIHNjbGtfZmJfZGl2LCBzcGxsX2NudGwyOwotCXUzMiBxLCBpLCBtZW1jbnRsLCB0cnA7CisJdTggbXBvc3RfZGl2LCB4cG9zdF9kaXYsIHNjbGtfcG9zdF9kaXZfcmVhbDsKKwl1MzIgcSwgbWVtY250bCwgdHJwOwogCXUzMiBkc3BfY29uZmlnLCBkc3Bfb25fb2ZmLCB2Z2FfZHNwX2NvbmZpZywgdmdhX2RzcF9vbl9vZmY7CiAjaWZkZWYgREVCVUcKIAlpbnQgcGxsbWNsaywgcGxsc2NsazsKQEAgLTU3NSwxNCArNTc1LDMwIEBACiAJCQltcG9zdF9kaXYgKz0gKHEgPCAgMzIqOCk7CiAJCX0KIAkJc2Nsa19wb3N0X2Rpdl9yZWFsID0gcG9zdGRpdmlkZXJzW21wb3N0X2Rpdl07Ci0JCXNjbGtfZmJfZGl2ID0gcSAqIHNjbGtfcG9zdF9kaXZfcmVhbCAvIDg7Ci0JCXNwbGxfY250bDIgPSBtcG9zdF9kaXYgPDwgNDsKKwkJcGxsLT5jdC5zY2xrX2ZiX2RpdiA9IHEgKiBzY2xrX3Bvc3RfZGl2X3JlYWwgLyA4OworCQlwbGwtPmN0LnNwbGxfY250bDIgPSBtcG9zdF9kaXYgPDwgNDsKICNpZmRlZiBERUJVRwotCQlwbGxzY2xrID0gKDEwMDAwMDAgKiAyICogc2Nsa19mYl9kaXYpIC8KKwkJcGxsc2NsayA9ICgxMDAwMDAwICogMiAqIHBsbC0+Y3Quc2Nsa19mYl9kaXYpIC8KIAkJCShwYXItPnJlZl9jbGtfcGVyICogcGxsLT5jdC5wbGxfcmVmX2Rpdik7CiAJCXByaW50aygiYXR5ZmIoJXMpOiB1c2Ugc2NsaywgcGxsc2Nsaz0lZCBNSHosIHNjbGs9bWNsaz0lZCBNSHpcbiIsCiAJCQlfX0ZVTkNUSU9OX18sIHBsbHNjbGssIHBsbHNjbGsgLyBzY2xrX3Bvc3RfZGl2X3JlYWwpOwogI2VuZGlmCisJfQorCisJLyogRGlzYWJsZSB0aGUgZXh0cmEgcHJlY2lzaW9uIHBpeGVsIGNsb2NrIGNvbnRyb2xzIHNpbmNlIHdlIGRvIG5vdCB1c2UgdGhlbS4gKi8KKwlwbGwtPmN0LmV4dF92cGxsX2NudGwgPSBhdHlfbGRfcGxsX2N0KEVYVF9WUExMX0NOVEwsIHBhcik7CisJcGxsLT5jdC5leHRfdnBsbF9jbnRsICY9IH4oRVhUX1ZQTExfRU4gfCBFWFRfVlBMTF9WR0FfRU4gfCBFWFRfVlBMTF9JTlNZTkMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0eV9yZXN1bWVfcGxsX2N0KGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gYXR5X3BsbCAqcGxsKQoreworCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKworCWlmIChwYXItPm1jbGtfcGVyICE9IHBhci0+eGNsa19wZXIpIHsKKwkJaW50IGk7CiAJCS8qCiAJCSogVGhpcyBkaXNhYmxlcyB0aGUgc2NsaywgY3Jhc2hlcyB0aGUgY29tcHV0ZXIgYXMgcmVwb3J0ZWQ6CiAJCSogYXR5X3N0X3BsbF9jdChTUExMX0NOVEwyLCAzLCBpbmZvKTsKQEAgLTU5MCw4ICs2MDYsOCBAQAogCQkqIFNvIGl0IHNlZW1zIHRoZSBzY2xrIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgaXQgaXMgdXNlZDsKIAkJKiBzbyBQTExfR0VOX0NOVEwgbXVzdCBiZSBwcm9ncmFtbWVkICphZnRlciogdGhlIHNjbGsuCiAJCSovCi0JCWF0eV9zdF9wbGxfY3QoU0NMS19GQl9ESVYsIHNjbGtfZmJfZGl2LCBwYXIpOwotCQlhdHlfc3RfcGxsX2N0KFNQTExfQ05UTDIsIHNwbGxfY250bDIsIHBhcik7CisJCWF0eV9zdF9wbGxfY3QoU0NMS19GQl9ESVYsIHBsbC0+Y3Quc2Nsa19mYl9kaXYsIHBhcik7CisJCWF0eV9zdF9wbGxfY3QoU1BMTF9DTlRMMiwgcGxsLT5jdC5zcGxsX2NudGwyLCBwYXIpOwogCQkvKgogCQkgKiBUaGUgc2NsayBoYXMgYmVlbiBzdGFydGVkLiBIb3dldmVyLCBJIGJlbGlldmUgdGhlIGZpcnN0IGNsb2NrCiAJCSAqIHRpY2tzIGl0IGdlbmVyYXRlcyBhcmUgbm90IHZlcnkgc3RhYmxlLiBIb3BlIHRoaXMgcHJpbWl0aXZlIGxvb3AKQEAgLTYwNSwxMSArNjIxLDcgQEAKIAlhdHlfc3RfcGxsX2N0KFBMTF9HRU5fQ05UTCwgcGxsLT5jdC5wbGxfZ2VuX2NudGwsIHBhcik7CiAJYXR5X3N0X3BsbF9jdChNQ0xLX0ZCX0RJViwgcGxsLT5jdC5tY2xrX2ZiX2RpdiwgcGFyKTsKIAlhdHlfc3RfcGxsX2N0KFBMTF9FWFRfQ05UTCwgcGxsLT5jdC5wbGxfZXh0X2NudGwsIHBhcik7Ci0JLyogRGlzYWJsZSB0aGUgZXh0cmEgcHJlY2lzaW9uIHBpeGVsIGNsb2NrIGNvbnRyb2xzIHNpbmNlIHdlIGRvIG5vdCB1c2UgdGhlbS4gKi8KLQlhdHlfc3RfcGxsX2N0KEVYVF9WUExMX0NOVEwsIGF0eV9sZF9wbGxfY3QoRVhUX1ZQTExfQ05UTCwgcGFyKSAmCi0JCX4oRVhUX1ZQTExfRU4gfCBFWFRfVlBMTF9WR0FfRU4gfCBFWFRfVlBMTF9JTlNZTkMpLCBwYXIpOwotCi0JcmV0dXJuIDA7CisJYXR5X3N0X3BsbF9jdChFWFRfVlBMTF9DTlRMLCBwbGwtPmN0LmV4dF92cGxsX2NudGwsIHBhcik7CiB9CiAKIHN0YXRpYyBpbnQgZHVtbXkodm9pZCkKQEAgLTYyNiw1ICs2MzgsNiBAQAogCS5wbGxfdG9fdmFyCT0gYXR5X3BsbF90b192YXJfY3QsCiAJLnNldF9wbGwJPSBhdHlfc2V0X3BsbF9jdCwKIAkuZ2V0X3BsbAk9IGF0eV9nZXRfcGxsX2N0LAotCS5pbml0X3BsbCAgICAgICA9IGF0eV9pbml0X3BsbF9jdAorCS5pbml0X3BsbAk9IGF0eV9pbml0X3BsbF9jdCwKKwkucmVzdW1lX3BsbAk9IGF0eV9yZXN1bWVfcGxsX2N0LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9pMmMuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9pMmMuYwppbmRleCA2NzY3NTQ1Li5lN2M1YjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25faTJjLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2kyYy5jCkBAIC0xMjAsMjYgKzEyMCwzMiBAQAogdm9pZCByYWRlb25fZGVsZXRlX2kyY19idXNzZXMoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvKQogewogCWlmIChyaW5mby0+aTJjWzBdLnJpbmZvKQotCQlpMmNfYml0X2RlbF9idXMoJnJpbmZvLT5pMmNbMF0uYWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmcmluZm8tPmkyY1swXS5hZGFwdGVyKTsKIAlyaW5mby0+aTJjWzBdLnJpbmZvID0gTlVMTDsKIAogCWlmIChyaW5mby0+aTJjWzFdLnJpbmZvKQotCQlpMmNfYml0X2RlbF9idXMoJnJpbmZvLT5pMmNbMV0uYWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmcmluZm8tPmkyY1sxXS5hZGFwdGVyKTsKIAlyaW5mby0+aTJjWzFdLnJpbmZvID0gTlVMTDsKIAogCWlmIChyaW5mby0+aTJjWzJdLnJpbmZvKQotCQlpMmNfYml0X2RlbF9idXMoJnJpbmZvLT5pMmNbMl0uYWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmcmluZm8tPmkyY1syXS5hZGFwdGVyKTsKIAlyaW5mby0+aTJjWzJdLnJpbmZvID0gTlVMTDsKIAogCWlmIChyaW5mby0+aTJjWzNdLnJpbmZvKQotCQlpMmNfYml0X2RlbF9idXMoJnJpbmZvLT5pMmNbM10uYWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmcmluZm8tPmkyY1szXS5hZGFwdGVyKTsKIAlyaW5mby0+aTJjWzNdLnJpbmZvID0gTlVMTDsKIH0KIAogaW50IHJhZGVvbl9wcm9iZV9pMmNfY29ubmVjdG9yKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgaW50IGNvbm4sCiAJCQkgICAgICAgdTggKipvdXRfZWRpZCkKIHsKLQl1OCAqZWRpZCA9IGZiX2RkY19yZWFkKCZyaW5mby0+aTJjW2Nvbm4tMV0uYWRhcHRlcik7CisJdTMyIHJlZyA9IHJpbmZvLT5pMmNbY29ubi0xXS5kZGNfcmVnOworCXU4ICplZGlkOworCisJT1VUUkVHKHJlZywgSU5SRUcocmVnKSAmCisJCQl+KFZHQV9ERENfREFUQV9PVVRQVVQgfCBWR0FfRERDX0NMS19PVVRQVVQpKTsKKworCWVkaWQgPSBmYl9kZGNfcmVhZCgmcmluZm8tPmkyY1tjb25uLTFdLmFkYXB0ZXIpOwogCiAJaWYgKG91dF9lZGlkKQogCQkqb3V0X2VkaWQgPSBlZGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX21vbml0b3IuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9tb25pdG9yLmMKaW5kZXggZWE1MzFhNi4uMzhjN2RiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX21vbml0b3IuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fbW9uaXRvci5jCkBAIC0xMDQsMTAgKzEwNCw5IEBACiAJaWYgKHBlZGlkID09IE5VTEwpCiAJCXJldHVybiBtdDsKIAotCXRtcCA9ICh1OCAqKWttYWxsb2MoRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOworCXRtcCA9IGttZW1kdXAocGVkaWQsIEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRtcCkKIAkJcmV0dXJuIG10OwotCW1lbWNweSh0bXAsIHBlZGlkLCBFRElEX0xFTkdUSCk7CiAJKm91dF9FRElEID0gdG1wOwogCXJldHVybiBtdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuaCBiL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuaAppbmRleCAyODU1NTM0Li4xNjRmZTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmgKKysrIGIvZHJpdmVycy92aWRlby9hdTExMDBmYi5oCkBAIC0yNzQsNyArMjc0LDcgQEAKIAkJLmJwcCA9IDE2LAogCQkuY29udHJvbF9iYXNlID0JMHgwMDA0ODg2QSB8CiAJCQlMQ0RfQ09OVFJPTF9ERUZBVUxUX1BPIHwgTENEX0NPTlRST0xfREVGQVVMVF9TQlBQRiB8Ci0JCQlMQ0RfQ09OVFJPTF9CUFBfMTYsCisJCQlMQ0RfQ09OVFJPTF9CUFBfMTYgfCBMQ0RfQ09OVFJPTF9TQkJfNCwKIAkJLmNsa2NvbnRyb2xfYmFzZSA9IDB4MDAwMjAwMDAsCiAJCS5ob3J6dGltaW5nID0gMHgwMDVhZmYxZiwKIAkJLnZlcnR0aW1pbmcgPSAweDE2MDAwZTU3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYwppbmRleCAyNzU5N2M1Li5kYjhjMTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYwpAQCAtMTQsNiArMTQsNTkgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQikgfHwgKGRlZmluZWQoQ09ORklHX0ZCX01PRFVMRSkgJiYgXAorCQkJICAgZGVmaW5lZChDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRV9NT0RVTEUpKQorLyogVGhpcyBjYWxsYmFjayBnZXRzIGNhbGxlZCB3aGVuIHNvbWV0aGluZyBpbXBvcnRhbnQgaGFwcGVucyBpbnNpZGUgYQorICogZnJhbWVidWZmZXIgZHJpdmVyLiBXZSdyZSBsb29raW5nIGlmIHRoYXQgaW1wb3J0YW50IGV2ZW50IGlzIGJsYW5raW5nLAorICogYW5kIGlmIGl0IGlzLCB3ZSdyZSBzd2l0Y2hpbmcgYmFja2xpZ2h0IHBvd2VyIGFzIHdlbGwgLi4uCisgKi8KK3N0YXRpYyBpbnQgZmJfbm90aWZpZXJfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCXVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOworCXN0cnVjdCBmYl9ldmVudCAqZXZkYXRhID0gZGF0YTsKKworCS8qIElmIHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQsIHNraXAgaXQgaW1tZWRpYXRlbHkgLi4uICovCisJaWYgKGV2ZW50ICE9IEZCX0VWRU5UX0JMQU5LKQorCQlyZXR1cm4gMDsKKworCWJkID0gY29udGFpbmVyX29mKHNlbGYsIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlLCBmYl9ub3RpZik7CisJZG93bigmYmQtPnNlbSk7CisJaWYgKGJkLT5wcm9wcykKKwkJaWYgKCFiZC0+cHJvcHMtPmNoZWNrX2ZiIHx8CisJCSAgICBiZC0+cHJvcHMtPmNoZWNrX2ZiKGV2ZGF0YS0+aW5mbykpIHsKKwkJCWJkLT5wcm9wcy0+ZmJfYmxhbmsgPSAqKGludCAqKWV2ZGF0YS0+ZGF0YTsKKwkJCWlmIChsaWtlbHkoYmQtPnByb3BzICYmIGJkLT5wcm9wcy0+dXBkYXRlX3N0YXR1cykpCisJCQkJYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKGJkKTsKKwkJfQorCXVwKCZiZC0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiYWNrbGlnaHRfcmVnaXN0ZXJfZmIoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCW1lbXNldCgmYmQtPmZiX25vdGlmLCAwLCBzaXplb2YoYmQtPmZiX25vdGlmKSk7CisJYmQtPmZiX25vdGlmLm5vdGlmaWVyX2NhbGwgPSBmYl9ub3RpZmllcl9jYWxsYmFjazsKKworCXJldHVybiBmYl9yZWdpc3Rlcl9jbGllbnQoJmJkLT5mYl9ub3RpZik7Cit9CisKK3N0YXRpYyB2b2lkIGJhY2tsaWdodF91bnJlZ2lzdGVyX2ZiKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlmYl91bnJlZ2lzdGVyX2NsaWVudCgmYmQtPmZiX25vdGlmKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBiYWNrbGlnaHRfcmVnaXN0ZXJfZmIoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmFja2xpZ2h0X3VucmVnaXN0ZXJfZmIoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworfQorI2VuZGlmIC8qIENPTkZJR19GQiAqLworCiBzdGF0aWMgc3NpemVfdCBiYWNrbGlnaHRfc2hvd19wb3dlcihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCiB7CiAJaW50IHJjID0gLUVOWElPOwpAQCAtMTQyLDcgKzE5NSw3IEBACiAJLnN0b3JlCT0gX3N0b3JlLAkJCQkJXAogfQogCi1zdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgYmxfY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBibF9jbGFzc19kZXZpY2VfYXR0cmlidXRlc1tdID0gewogCURFQ0xBUkVfQVRUUihwb3dlciwgMDY0NCwgYmFja2xpZ2h0X3Nob3dfcG93ZXIsIGJhY2tsaWdodF9zdG9yZV9wb3dlciksCiAJREVDTEFSRV9BVFRSKGJyaWdodG5lc3MsIDA2NDQsIGJhY2tsaWdodF9zaG93X2JyaWdodG5lc3MsCiAJCSAgICAgYmFja2xpZ2h0X3N0b3JlX2JyaWdodG5lc3MpLApAQCAtMTUxLDMzICsyMDQsNiBAQAogCURFQ0xBUkVfQVRUUihtYXhfYnJpZ2h0bmVzcywgMDQ0NCwgYmFja2xpZ2h0X3Nob3dfbWF4X2JyaWdodG5lc3MsIE5VTEwpLAogfTsKIAotLyogVGhpcyBjYWxsYmFjayBnZXRzIGNhbGxlZCB3aGVuIHNvbWV0aGluZyBpbXBvcnRhbnQgaGFwcGVucyBpbnNpZGUgYQotICogZnJhbWVidWZmZXIgZHJpdmVyLiBXZSdyZSBsb29raW5nIGlmIHRoYXQgaW1wb3J0YW50IGV2ZW50IGlzIGJsYW5raW5nLAotICogYW5kIGlmIGl0IGlzLCB3ZSdyZSBzd2l0Y2hpbmcgYmFja2xpZ2h0IHBvd2VyIGFzIHdlbGwgLi4uCi0gKi8KLXN0YXRpYyBpbnQgZmJfbm90aWZpZXJfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCXVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOwotCXN0cnVjdCBmYl9ldmVudCAqZXZkYXRhID0oc3RydWN0IGZiX2V2ZW50ICopZGF0YTsKLQotCS8qIElmIHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQsIHNraXAgaXQgaW1tZWRpYXRlbHkgLi4uICovCi0JaWYgKGV2ZW50ICE9IEZCX0VWRU5UX0JMQU5LKQotCQlyZXR1cm4gMDsKLQotCWJkID0gY29udGFpbmVyX29mKHNlbGYsIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlLCBmYl9ub3RpZik7Ci0JZG93bigmYmQtPnNlbSk7Ci0JaWYgKGJkLT5wcm9wcykKLQkJaWYgKCFiZC0+cHJvcHMtPmNoZWNrX2ZiIHx8Ci0JCSAgICBiZC0+cHJvcHMtPmNoZWNrX2ZiKGV2ZGF0YS0+aW5mbykpIHsKLQkJCWJkLT5wcm9wcy0+ZmJfYmxhbmsgPSAqKGludCAqKWV2ZGF0YS0+ZGF0YTsKLQkJCWlmIChsaWtlbHkoYmQtPnByb3BzICYmIGJkLT5wcm9wcy0+dXBkYXRlX3N0YXR1cykpCi0JCQkJYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKGJkKTsKLQkJfQotCXVwKCZiZC0+c2VtKTsKLQlyZXR1cm4gMDsKLX0KLQogLyoqCiAgKiBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyIC0gY3JlYXRlIGFuZCByZWdpc3RlciBhIG5ldyBvYmplY3Qgb2YKICAqICAgYmFja2xpZ2h0X2RldmljZSBjbGFzcy4KQEAgLTIxNSwxMCArMjQxLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIocmMpOwogCX0KIAotCW1lbXNldCgmbmV3X2JkLT5mYl9ub3RpZiwgMCwgc2l6ZW9mKG5ld19iZC0+ZmJfbm90aWYpKTsKLQluZXdfYmQtPmZiX25vdGlmLm5vdGlmaWVyX2NhbGwgPSBmYl9ub3RpZmllcl9jYWxsYmFjazsKLQotCXJjID0gZmJfcmVnaXN0ZXJfY2xpZW50KCZuZXdfYmQtPmZiX25vdGlmKTsKKwlyYyA9IGJhY2tsaWdodF9yZWdpc3Rlcl9mYihuZXdfYmQpOwogCWlmICh1bmxpa2VseShyYykpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTI1OSwxNiArMjgyLDEwIEBACiAJCQkJCSAmYmxfY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZXNbaV0pOwogCiAJZG93bigmYmQtPnNlbSk7Ci0JaWYgKGxpa2VseShiZC0+cHJvcHMgJiYgYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKSkgewotCQliZC0+cHJvcHMtPmJyaWdodG5lc3MgPSAwOwotCQliZC0+cHJvcHMtPnBvd2VyID0gMDsKLQkJYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKGJkKTsKLQl9Ci0KIAliZC0+cHJvcHMgPSBOVUxMOwogCXVwKCZiZC0+c2VtKTsKIAotCWZiX3VucmVnaXN0ZXJfY2xpZW50KCZiZC0+ZmJfbm90aWYpOworCWJhY2tsaWdodF91bnJlZ2lzdGVyX2ZiKGJkKTsKIAogCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZiZC0+Y2xhc3NfZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2NvcmdpX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9jb3JnaV9ibC5jCmluZGV4IDJlYmJmZDkuLjYxNTg3Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2NvcmdpX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfYmwuYwpAQCAtMTExLDcgKzExMSw3IEBACiAJLnVwZGF0ZV9zdGF0dXMgID0gY29yZ2libF9zZXRfaW50ZW5zaXR5LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgY29yZ2libF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBjb3JnaWJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGNvcmdpYmxfbWFjaGluZm8gKm1hY2hpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKQEAgLTEzNSw2ICsxMzUsMTAgQEAKIAogc3RhdGljIGludCBjb3JnaWJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CisJY29yZ2libF9kYXRhLnBvd2VyID0gMDsKKwljb3JnaWJsX2RhdGEuYnJpZ2h0bmVzcyA9IDA7CisJY29yZ2libF9zZW5kX2ludGVuc2l0eShjb3JnaV9iYWNrbGlnaHRfZGV2aWNlKTsKKwogCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihjb3JnaV9iYWNrbGlnaHRfZGV2aWNlKTsKIAogCXByaW50aygiQ29yZ2kgQmFja2xpZ2h0IERyaXZlciBVbmxvYWRlZFxuIik7CkBAIC0xNjYsNCArMTcwLDQgQEAKIAogTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAcnBzeXMubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDb3JnaSBCYWNrbGlnaHQgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2hwNjgwX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9ocDY4MF9ibC5jCmluZGV4IGZlMTQ4ODMuLjFjNTY5ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2hwNjgwX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvaHA2ODBfYmwuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KLSNpbmNsdWRlIDxhc20vaHA2eHgvaHA2eHguaD4KKyNpbmNsdWRlIDxhc20vaHA2eHguaD4KICNpbmNsdWRlIDxhc20vaGQ2NDQ2MS5oPgogCiAjZGVmaW5lIEhQNjgwX01BWF9JTlRFTlNJVFkgMjU1CkBAIC0xMTcsNiArMTE3LDEwIEBACiAKIHN0YXRpYyBpbnQgaHA2ODBibF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogeworCWhwNjgwYmxfZGF0YS5icmlnaHRuZXNzID0gMDsKKwlocDY4MGJsX2RhdGEucG93ZXIgPSAwOworCWhwNjgwYmxfc2VuZF9pbnRlbnNpdHkoaHA2ODBfYmFja2xpZ2h0X2RldmljZSk7CisKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaHA2ODBfYmFja2xpZ2h0X2RldmljZSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMKaW5kZXggYmM4YWIwMC4uZjZlMDQxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMKQEAgLTE0LDYgKzE0LDUzIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX0ZCKSB8fCAoZGVmaW5lZChDT05GSUdfRkJfTU9EVUxFKSAmJiBcCisJCQkgICBkZWZpbmVkKENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFX01PRFVMRSkpCisvKiBUaGlzIGNhbGxiYWNrIGdldHMgY2FsbGVkIHdoZW4gc29tZXRoaW5nIGltcG9ydGFudCBoYXBwZW5zIGluc2lkZSBhCisgKiBmcmFtZWJ1ZmZlciBkcml2ZXIuIFdlJ3JlIGxvb2tpbmcgaWYgdGhhdCBpbXBvcnRhbnQgZXZlbnQgaXMgYmxhbmtpbmcsCisgKiBhbmQgaWYgaXQgaXMsIHdlJ3JlIHN3aXRjaGluZyBsY2QgcG93ZXIgYXMgd2VsbCAuLi4KKyAqLworc3RhdGljIGludCBmYl9ub3RpZmllcl9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxjZF9kZXZpY2UgKmxkOworCXN0cnVjdCBmYl9ldmVudCAqZXZkYXRhID0gZGF0YTsKKworCS8qIElmIHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQsIHNraXAgaXQgaW1tZWRpYXRlbHkgLi4uICovCisJaWYgKGV2ZW50ICE9IEZCX0VWRU5UX0JMQU5LKQorCQlyZXR1cm4gMDsKKworCWxkID0gY29udGFpbmVyX29mKHNlbGYsIHN0cnVjdCBsY2RfZGV2aWNlLCBmYl9ub3RpZik7CisJZG93bigmbGQtPnNlbSk7CisJaWYgKGxkLT5wcm9wcykKKwkJaWYgKCFsZC0+cHJvcHMtPmNoZWNrX2ZiIHx8IGxkLT5wcm9wcy0+Y2hlY2tfZmIoZXZkYXRhLT5pbmZvKSkKKwkJCWxkLT5wcm9wcy0+c2V0X3Bvd2VyKGxkLCAqKGludCAqKWV2ZGF0YS0+ZGF0YSk7CisJdXAoJmxkLT5zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxjZF9yZWdpc3Rlcl9mYihzdHJ1Y3QgbGNkX2RldmljZSAqbGQpCit7CisJbWVtc2V0KCZsZC0+ZmJfbm90aWYsIDAsIHNpemVvZigmbGQtPmZiX25vdGlmKSk7CisJbGQtPmZiX25vdGlmLm5vdGlmaWVyX2NhbGwgPSBmYl9ub3RpZmllcl9jYWxsYmFjazsKKwlyZXR1cm4gZmJfcmVnaXN0ZXJfY2xpZW50KCZsZC0+ZmJfbm90aWYpOworfQorCitzdGF0aWMgdm9pZCBsY2RfdW5yZWdpc3Rlcl9mYihzdHJ1Y3QgbGNkX2RldmljZSAqbGQpCit7CisJZmJfdW5yZWdpc3Rlcl9jbGllbnQoJmxkLT5mYl9ub3RpZik7Cit9CisjZWxzZQorc3RhdGljIGludCBsY2RfcmVnaXN0ZXJfZmIoc3RydWN0IGxjZF9kZXZpY2UgKmxkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGNkX3VucmVnaXN0ZXJfZmIoc3RydWN0IGxjZF9kZXZpY2UgKmxkKQoreworfQorI2VuZGlmIC8qIENPTkZJR19GQiAqLworCiBzdGF0aWMgc3NpemVfdCBsY2Rfc2hvd19wb3dlcihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCiB7CiAJaW50IHJjOwpAQCAtMTIxLDM1ICsxNjgsMTIgQEAKIAkuc3RvcmUJPSBfc3RvcmUsCQkJCQlcCiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBsY2RfY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBsY2RfY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZXNbXSA9IHsKIAlERUNMQVJFX0FUVFIocG93ZXIsIDA2NDQsIGxjZF9zaG93X3Bvd2VyLCBsY2Rfc3RvcmVfcG93ZXIpLAogCURFQ0xBUkVfQVRUUihjb250cmFzdCwgMDY0NCwgbGNkX3Nob3dfY29udHJhc3QsIGxjZF9zdG9yZV9jb250cmFzdCksCiAJREVDTEFSRV9BVFRSKG1heF9jb250cmFzdCwgMDQ0NCwgbGNkX3Nob3dfbWF4X2NvbnRyYXN0LCBOVUxMKSwKIH07CiAKLS8qIFRoaXMgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgd2hlbiBzb21ldGhpbmcgaW1wb3J0YW50IGhhcHBlbnMgaW5zaWRlIGEKLSAqIGZyYW1lYnVmZmVyIGRyaXZlci4gV2UncmUgbG9va2luZyBpZiB0aGF0IGltcG9ydGFudCBldmVudCBpcyBibGFua2luZywKLSAqIGFuZCBpZiBpdCBpcywgd2UncmUgc3dpdGNoaW5nIGxjZCBwb3dlciBhcyB3ZWxsIC4uLgotICovCi1zdGF0aWMgaW50IGZiX25vdGlmaWVyX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbGNkX2RldmljZSAqbGQ7Ci0Jc3RydWN0IGZiX2V2ZW50ICpldmRhdGEgPShzdHJ1Y3QgZmJfZXZlbnQgKilkYXRhOwotCi0JLyogSWYgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhpcyBldmVudCwgc2tpcCBpdCBpbW1lZGlhdGVseSAuLi4gKi8KLQlpZiAoZXZlbnQgIT0gRkJfRVZFTlRfQkxBTkspCi0JCXJldHVybiAwOwotCi0JbGQgPSBjb250YWluZXJfb2Yoc2VsZiwgc3RydWN0IGxjZF9kZXZpY2UsIGZiX25vdGlmKTsKLQlkb3duKCZsZC0+c2VtKTsKLQlpZiAobGQtPnByb3BzKQotCQlpZiAoIWxkLT5wcm9wcy0+Y2hlY2tfZmIgfHwgbGQtPnByb3BzLT5jaGVja19mYihldmRhdGEtPmluZm8pKQotCQkJbGQtPnByb3BzLT5zZXRfcG93ZXIobGQsICooaW50ICopZXZkYXRhLT5kYXRhKTsKLQl1cCgmbGQtPnNlbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qKgogICogbGNkX2RldmljZV9yZWdpc3RlciAtIHJlZ2lzdGVyIGEgbmV3IG9iamVjdCBvZiBsY2RfZGV2aWNlIGNsYXNzLgogICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBuZXcgb2JqZWN0KG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlCkBAIC0xODYsMTAgKzIxMCw4IEBACiAJCXJldHVybiBFUlJfUFRSKHJjKTsKIAl9CiAKLQltZW1zZXQoJm5ld19sZC0+ZmJfbm90aWYsIDAsIHNpemVvZihuZXdfbGQtPmZiX25vdGlmKSk7Ci0JbmV3X2xkLT5mYl9ub3RpZi5ub3RpZmllcl9jYWxsID0gZmJfbm90aWZpZXJfY2FsbGJhY2s7CisJcmMgPSBsY2RfcmVnaXN0ZXJfZmIobmV3X2xkKTsKIAotCXJjID0gZmJfcmVnaXN0ZXJfY2xpZW50KCZuZXdfbGQtPmZiX25vdGlmKTsKIAlpZiAodW5saWtlbHkocmMpKQogCQlnb3RvIGVycm9yOwogCkBAIC0yMzIsOSArMjU0LDcgQEAKIAlkb3duKCZsZC0+c2VtKTsKIAlsZC0+cHJvcHMgPSBOVUxMOwogCXVwKCZsZC0+c2VtKTsKLQotCWZiX3VucmVnaXN0ZXJfY2xpZW50KCZsZC0+ZmJfbm90aWYpOwotCisJbGNkX3VucmVnaXN0ZXJfZmIobGQpOwogCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZsZC0+Y2xhc3NfZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0wobGNkX2RldmljZV91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xvY29tb2xjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMKaW5kZXggNjI4NTcxYy4uMmQ3OTA1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG9jb21vbGNkLmMKQEAgLTIwMCw2ICsyMDAsMTAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJbG9jb21vYmxfZGF0YS5icmlnaHRuZXNzID0gMDsKKwlsb2NvbW9ibF9kYXRhLnBvd2VyID0gMDsKKwlsb2NvbW9sY2Rfc2V0X2ludGVuc2l0eShsb2NvbW9sY2RfYmxfZGV2aWNlKTsKKwogCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihsb2NvbW9sY2RfYmxfZGV2aWNlKTsKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJbG9jb21vbGNkX2RldiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NmYmltZ2JsdC5jIGIvZHJpdmVycy92aWRlby9jZmJpbWdibHQuYwppbmRleCA1MWQzNTM4Li4yNjEwMDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NmYmltZ2JsdC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2ZiaW1nYmx0LmMKQEAgLTQyLDcgKzQyLDcgQEAKICNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCiAjZW5kaWYKIAotc3RhdGljIHUzMiBjZmJfdGFiOFtdID0geworc3RhdGljIGNvbnN0IHUzMiBjZmJfdGFiOFtdID0gewogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogICAgIDB4MDAwMDAwMDAsMHgwMDAwMDBmZiwweDAwMDBmZjAwLDB4MDAwMGZmZmYsCiAgICAgMHgwMGZmMDAwMCwweDAwZmYwMGZmLDB4MDBmZmZmMDAsMHgwMGZmZmZmZiwKQEAgLTU4LDcgKzU4LDcgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIHUzMiBjZmJfdGFiMTZbXSA9IHsKK3N0YXRpYyBjb25zdCB1MzIgY2ZiX3RhYjE2W10gPSB7CiAjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCiAgICAgMHgwMDAwMDAwMCwgMHgwMDAwZmZmZiwgMHhmZmZmMDAwMCwgMHhmZmZmZmZmZgogI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCkBAIC02OCw3ICs2OCw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyB1MzIgY2ZiX3RhYjMyW10gPSB7CitzdGF0aWMgY29uc3QgdTMyIGNmYl90YWIzMltdID0gewogCTB4MDAwMDAwMDAsIDB4ZmZmZmZmZmYKIH07CiAKQEAgLTIxOCw3ICsyMTgsNyBAQAogCXUzMiBiaXRfbWFzaywgZW5kX21hc2ssIGVvcngsIHNoaWZ0OwogCWNvbnN0IGNoYXIgKnMgPSBpbWFnZS0+ZGF0YSwgKnNyYzsKIAl1MzIgX19pb21lbSAqZHN0OwotCXUzMiAqdGFiID0gTlVMTDsKKwljb25zdCB1MzIgKnRhYiA9IE5VTEw7CiAJaW50IGksIGosIGs7CiAJCQogCXN3aXRjaCAoYnBwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NpcnJ1c2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NpcnJ1c2ZiLmMKaW5kZXggZGFmNDNmNS4uMmM0YmM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jaXJydXNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2lycnVzZmIuYwpAQCAtMjQ0Miw3ICsyNDQyLDEwIEBACiAJcHJpbnRrICgiQ2lycnVzIExvZ2ljIGNoaXBzZXQgb24gUENJIGJ1c1xuIik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOwogCi0JcmV0dXJuIGNpcnJ1c2ZiX3JlZ2lzdGVyKGNpbmZvKTsKKwlyZXQgPSBjaXJydXNmYl9yZWdpc3RlcihjaW5mbyk7CisJaWYgKHJldCkKKwkJaW91bm1hcChjaW5mby0+ZmJtZW0pOworCXJldHVybiByZXQ7CiAKIGVycl9yZWxlYXNlX2xlZ2FjeToKIAlpZiAocmVsZWFzZV9pb19wb3J0cykKQEAgLTI1NzQsNyArMjU3NywxNSBAQAogCXByaW50ayAoS0VSTl9JTkZPICJDaXJydXMgTG9naWMgY2hpcHNldCBvbiBab3JybyBidXNcbiIpOwogCXpvcnJvX3NldF9kcnZkYXRhKHosIGluZm8pOwogCi0JcmV0dXJuIGNpcnJ1c2ZiX3JlZ2lzdGVyKGNpbmZvKTsKKwlyZXQgPSBjaXJydXNmYl9yZWdpc3RlcihjaW5mbyk7CisJaWYgKHJldCkgeworCQlpZiAoYnR5cGUgPT0gQlRfUElDQVNTTzQpIHsKKwkJCWlvdW5tYXAoY2luZm8tPmZibWVtKTsKKwkJCWlvdW5tYXAoY2luZm8tPnJlZ2Jhc2UgLSAweDYwMDAwMCk7CisJCX0gZWxzZSBpZiAoYm9hcmRfYWRkciA+IDB4MDEwMDAwMDApCisJCQlpb3VubWFwKGNpbmZvLT5mYm1lbSk7CisJfQorCXJldHVybiByZXQ7CiAKIGVycl91bm1hcF9yZWdiYXNlOgogCS8qIFBhcmVudGFsIGFkdmlzb3J5OiBleHBsaWNpdCBoYWNrICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCmluZGV4IDMwMjE3NGIuLjMxZjQ3NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCkBAIC0zODMsOSArMzgzLDkgQEAKIAkJc29mdGJhY2tfdG9wID0gMDsKIH0KIAotc3RhdGljIHZvaWQgZmJfZmxhc2hjdXJzb3Iodm9pZCAqcHJpdmF0ZSkKK3N0YXRpYyB2b2lkIGZiX2ZsYXNoY3Vyc29yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHByaXZhdGU7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGZiX2luZm8sIHF1ZXVlKTsKIAlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAJc3RydWN0IGRpc3BsYXkgKnA7CiAJc3RydWN0IHZjX2RhdGEgKnZjID0gTlVMTDsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCWlmICgoIWluZm8tPnF1ZXVlLmZ1bmMgfHwgaW5mby0+cXVldWUuZnVuYyA9PSBmYl9mbGFzaGN1cnNvcikgJiYKIAkgICAgIShvcHMtPmZsYWdzICYgRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSKSkgewogCQlpZiAoIWluZm8tPnF1ZXVlLmZ1bmMpCi0JCQlJTklUX1dPUksoJmluZm8tPnF1ZXVlLCBmYl9mbGFzaGN1cnNvciwgaW5mbyk7CisJCQlJTklUX1dPUksoJmluZm8tPnF1ZXVlLCBmYl9mbGFzaGN1cnNvcik7CiAKIAkJaW5pdF90aW1lcigmb3BzLT5jdXJzb3JfdGltZXIpOwogCQlvcHMtPmN1cnNvcl90aW1lci5mdW5jdGlvbiA9IGN1cnNvcl90aW1lcl9oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3NvZnRjdXJzb3IuYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zb2Z0Y3Vyc29yLmMKaW5kZXggN2QwN2Q4My4uZjU3N2JkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL3NvZnRjdXJzb3IuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc29mdGN1cnNvci5jCkBAIC0xLDExICsxLDEzIEBACiAvKgotICogbGludXgvZHJpdmVycy92aWRlby9zb2Z0Y3Vyc29yLmMgLS0gR2VuZXJpYyBzb2Z0d2FyZSBjdXJzb3IgZm9yIGZyYW1lIGJ1ZmZlciBkZXZpY2VzCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL3NvZnRjdXJzb3IuYworICoKKyAqIEdlbmVyaWMgc29mdHdhcmUgY3Vyc29yIGZvciBmcmFtZSBidWZmZXIgZGV2aWNlcwogICoKICAqICBDcmVhdGVkIDE0IE5vdiAyMDAyIGJ5IEphbWVzIFNpbW1vbnMKICAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCisgKiBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjUsNyArMjcsNyBAQAogCXVuc2lnbmVkIGludCBidWZfYWxpZ24gPSBpbmZvLT5waXhtYXAuYnVmX2FsaWduIC0gMTsKIAl1bnNpZ25lZCBpbnQgaSwgc2l6ZSwgZHNpemUsIHNfcGl0Y2gsIGRfcGl0Y2g7CiAJc3RydWN0IGZiX2ltYWdlICppbWFnZTsKLQl1OCAqZHN0OworCXU4ICpzcmMsICpkc3Q7CiAKIAlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCiAJCXJldHVybiAwOwpAQCAtNDUsNyArNDcsOCBAQAogCQl9CiAJfQogCi0JaW1hZ2UgPSAoc3RydWN0IGZiX2ltYWdlICopIChvcHMtPmN1cnNvcl9zcmMgKyBkc2l6ZSk7CisJc3JjID0gb3BzLT5jdXJzb3Jfc3JjICsgc2l6ZW9mKHN0cnVjdCBmYl9pbWFnZSk7CisJaW1hZ2UgPSAoc3RydWN0IGZiX2ltYWdlICopb3BzLT5jdXJzb3Jfc3JjOwogCSppbWFnZSA9IGN1cnNvci0+aW1hZ2U7CiAJZF9waXRjaCA9IChzX3BpdGNoICsgc2Nhbl9hbGlnbikgJiB+c2Nhbl9hbGlnbjsKIApAQCAtNTcsMjEgKzYwLDE4IEBACiAJCXN3aXRjaCAoY3Vyc29yLT5yb3ApIHsKIAkJY2FzZSBST1BfWE9SOgogCQkJZm9yIChpID0gMDsgaSA8IGRzaXplOyBpKyspCi0JCQkJb3BzLT5jdXJzb3Jfc3JjW2ldID0gaW1hZ2UtPmRhdGFbaV0gXgotCQkJCQljdXJzb3ItPm1hc2tbaV07CisJCQkJc3JjW2ldID0gaW1hZ2UtPmRhdGFbaV0gXiBjdXJzb3ItPm1hc2tbaV07CiAJCQlicmVhazsKIAkJY2FzZSBST1BfQ09QWToKIAkJZGVmYXVsdDoKIAkJCWZvciAoaSA9IDA7IGkgPCBkc2l6ZTsgaSsrKQotCQkJCW9wcy0+Y3Vyc29yX3NyY1tpXSA9IGltYWdlLT5kYXRhW2ldICYKLQkJCQkJY3Vyc29yLT5tYXNrW2ldOworCQkJCXNyY1tpXSA9IGltYWdlLT5kYXRhW2ldICYgY3Vyc29yLT5tYXNrW2ldOwogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UKLQkJbWVtY3B5KG9wcy0+Y3Vyc29yX3NyYywgaW1hZ2UtPmRhdGEsIGRzaXplKTsKKwkJbWVtY3B5KHNyYywgaW1hZ2UtPmRhdGEsIGRzaXplKTsKIAotCWZiX3BhZF9hbGlnbmVkX2J1ZmZlcihkc3QsIGRfcGl0Y2gsIG9wcy0+Y3Vyc29yX3NyYywgc19waXRjaCwKLQkJCSAgICAgIGltYWdlLT5oZWlnaHQpOworCWZiX3BhZF9hbGlnbmVkX2J1ZmZlcihkc3QsIGRfcGl0Y2gsIHNyYywgc19waXRjaCwgaW1hZ2UtPmhlaWdodCk7CiAJaW1hZ2UtPmRhdGEgPSBkc3Q7CiAJaW5mby0+ZmJvcHMtPmZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc3RpY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvc3RpY29uLmMKaW5kZXggNDU1ODZhYS4uNTdiMjFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL3N0aWNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9zdGljb24uYwpAQCAtMzQ1LDcgKzM0NSw3IEBACiB7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY29uc3cgc3RpX2NvbiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29uc3cgc3RpX2NvbiA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5jb25fc3RhcnR1cAkJPSBzdGljb25fc3RhcnR1cCwKIAkuY29uX2luaXQJCT0gc3RpY29uX2luaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKaW5kZXggMGEyYzEwYS4uNGE5YmRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYwpAQCAtOTMsMjcgKzkzLDI3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2Z2Fjb25fdW5pX3BhZ2VkaXJbMl07CiAKIC8qIERlc2NyaXB0aW9uIG9mIHRoZSBoYXJkd2FyZSBzaXR1YXRpb24gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCXZnYV92cmFtX2Jhc2U7CQkvKiBCYXNlIG9mIHZpZGVvIG1lbW9yeSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcJdmdhX3ZyYW1fZW5kOwkJLyogRW5kIG9mIHZpZGVvIG1lbW9yeSAqLwotc3RhdGljIGludAkJdmdhX3ZyYW1fc2l6ZTsJCS8qIFNpemUgb2YgdmlkZW8gbWVtb3J5ICovCi1zdGF0aWMgdTE2CQl2Z2FfdmlkZW9fcG9ydF9yZWc7CS8qIFZpZGVvIHJlZ2lzdGVyIHNlbGVjdCBwb3J0ICovCi1zdGF0aWMgdTE2CQl2Z2FfdmlkZW9fcG9ydF92YWw7CS8qIFZpZGVvIHJlZ2lzdGVyIHZhbHVlIHBvcnQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQJdmdhX3ZpZGVvX251bV9jb2x1bW5zOwkvKiBOdW1iZXIgb2YgdGV4dCBjb2x1bW5zICovCi1zdGF0aWMgdW5zaWduZWQgaW50CXZnYV92aWRlb19udW1fbGluZXM7CS8qIE51bWJlciBvZiB0ZXh0IGxpbmVzICovCi1zdGF0aWMgaW50CQl2Z2FfY2FuX2RvX2NvbG9yID0gMDsJLyogRG8gd2Ugc3VwcG9ydCBjb2xvcnM/ICovCi1zdGF0aWMgdW5zaWduZWQgaW50CXZnYV9kZWZhdWx0X2ZvbnRfaGVpZ2h0Oy8qIEhlaWdodCBvZiBkZWZhdWx0IHNjcmVlbiBmb250ICovCi1zdGF0aWMgdW5zaWduZWQgY2hhcgl2Z2FfdmlkZW9fdHlwZTsJCS8qIENhcmQgdHlwZSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIJdmdhX2hhcmRzY3JvbGxfZW5hYmxlZDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyCXZnYV9oYXJkc2Nyb2xsX3VzZXJfZW5hYmxlID0gMTsKK3N0YXRpYyBpbnQJCXZnYV9pbml0X2RvbmUJCV9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5zaWduZWQgbG9uZwl2Z2FfdnJhbV9iYXNlCQlfX3JlYWRfbW9zdGx5OwkvKiBCYXNlIG9mIHZpZGVvIG1lbW9yeSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJdmdhX3ZyYW1fZW5kCQlfX3JlYWRfbW9zdGx5OwkvKiBFbmQgb2YgdmlkZW8gbWVtb3J5ICovCitzdGF0aWMgdW5zaWduZWQgaW50CXZnYV92cmFtX3NpemUJCV9fcmVhZF9tb3N0bHk7CS8qIFNpemUgb2YgdmlkZW8gbWVtb3J5ICovCitzdGF0aWMgdTE2CQl2Z2FfdmlkZW9fcG9ydF9yZWcJX19yZWFkX21vc3RseTsJLyogVmlkZW8gcmVnaXN0ZXIgc2VsZWN0IHBvcnQgKi8KK3N0YXRpYyB1MTYJCXZnYV92aWRlb19wb3J0X3ZhbAlfX3JlYWRfbW9zdGx5OwkvKiBWaWRlbyByZWdpc3RlciB2YWx1ZSBwb3J0ICovCitzdGF0aWMgdW5zaWduZWQgaW50CXZnYV92aWRlb19udW1fY29sdW1uczsJCQkvKiBOdW1iZXIgb2YgdGV4dCBjb2x1bW5zICovCitzdGF0aWMgdW5zaWduZWQgaW50CXZnYV92aWRlb19udW1fbGluZXM7CQkJLyogTnVtYmVyIG9mIHRleHQgbGluZXMgKi8KK3N0YXRpYyBpbnQJCXZnYV9jYW5fZG9fY29sb3IJX19yZWFkX21vc3RseTsJLyogRG8gd2Ugc3VwcG9ydCBjb2xvcnM/ICovCitzdGF0aWMgdW5zaWduZWQgaW50CXZnYV9kZWZhdWx0X2ZvbnRfaGVpZ2h0IF9fcmVhZF9tb3N0bHk7CS8qIEhlaWdodCBvZiBkZWZhdWx0IHNjcmVlbiBmb250ICovCitzdGF0aWMgdW5zaWduZWQgY2hhcgl2Z2FfdmlkZW9fdHlwZQkJX19yZWFkX21vc3RseTsJLyogQ2FyZCB0eXBlICovCitzdGF0aWMgdW5zaWduZWQgY2hhcgl2Z2FfaGFyZHNjcm9sbF9lbmFibGVkCV9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5zaWduZWQgY2hhcgl2Z2FfaGFyZHNjcm9sbF91c2VyX2VuYWJsZSBfX3JlYWRfbW9zdGx5ID0gMTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyCXZnYV9mb250X2lzX2RlZmF1bHQgPSAxOwogc3RhdGljIGludAkJdmdhX3Zlc2FfYmxhbmtlZDsKIHN0YXRpYyBpbnQgCQl2Z2FfcGFsZXR0ZV9ibGFua2VkOwogc3RhdGljIGludCAJCXZnYV9pc19nZng7CiBzdGF0aWMgaW50IAkJdmdhXzUxMl9jaGFyczsKIHN0YXRpYyBpbnQgCQl2Z2FfdmlkZW9fZm9udF9oZWlnaHQ7Ci1zdGF0aWMgaW50IAkJdmdhX3NjYW5fbGluZXM7Ci1zdGF0aWMgdW5zaWduZWQgaW50IAl2Z2Ffcm9sbGVkX292ZXIgPSAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgdmdhX2luaXRfZG9uZTsKK3N0YXRpYyBpbnQgCQl2Z2Ffc2Nhbl9saW5lcwkJX19yZWFkX21vc3RseTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgCXZnYV9yb2xsZWRfb3ZlcjsKIAogc3RhdGljIGludCBfX2luaXQgbm9fc2Nyb2xsKGNoYXIgKnN0cikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCmluZGV4IDhjYzZjMGUuLjA0YzZkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwpAQCAtNDE1LDEzICs0MTUsMTUgQEAKIAlmdWxsID0gcC0+dG90YWxfdnJhbSA9PSAweDQwMDAwMDsKIAogCS8qIFRyeSB0byBwaWNrIGEgdmlkZW8gbW9kZSBvdXQgb2YgTlZSQU0gaWYgd2UgaGF2ZSBvbmUuICovCisjaWZkZWYgQ09ORklHX05WUkFNCiAJaWYgKGRlZmF1bHRfY21vZGUgPT0gQ01PREVfTlZSQU0pewogCQljbW9kZSA9IG52cmFtX3JlYWRfYnl0ZShOVl9DTU9ERSk7CiAJCWlmKGNtb2RlIDwgQ01PREVfOCB8fCBjbW9kZSA+IENNT0RFXzMyKQogCQkJY21vZGUgPSBDTU9ERV84OwogCX0gZWxzZQorI2VuZGlmCiAJCWNtb2RlPWRlZmF1bHRfY21vZGU7Ci0KKyNpZmRlZiBDT05GSUdfTlZSQU0KIAlpZiAoZGVmYXVsdF92bW9kZSA9PSBWTU9ERV9OVlJBTSkgewogCQl2bW9kZSA9IG52cmFtX3JlYWRfYnl0ZShOVl9WTU9ERSk7CiAJCWlmICh2bW9kZSA8IDEgfHwgdm1vZGUgPiBWTU9ERV9NQVggfHwKQEAgLTQzMiw3ICs0MzQsOSBAQAogCQkJaWYgKGNvbnRyb2xfbWFjX21vZGVzW3Ztb2RlIC0gMV0ubVtmdWxsXSA8IGNtb2RlKQogCQkJCXZtb2RlID0gVk1PREVfNjQwXzQ4MF82MDsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlCisjZW5kaWYKKwl7CiAJCXZtb2RlPWRlZmF1bHRfdm1vZGU7CiAJCWlmIChjb250cm9sX21hY19tb2Rlc1t2bW9kZSAtIDFdLm1bZnVsbF0gPCBjbW9kZSkgewogCQkJaWYgKGNtb2RlID4gQ01PREVfOCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY3liZXJmYi5jIGIvZHJpdmVycy92aWRlby9jeWJlcmZiLmMKaW5kZXggYzQwZTcyZC4uMGI4ZDViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jeWJlcmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jeWJlcmZiLmMKQEAgLTEwOSw4ICsxMDksNiBAQAogI2RlZmluZSB3Yl82NChyZWdzLHJlZyxkYXQpICgqKCgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXJlZ3MpICsgcmVnKSA9IGRhdCkKICNkZWZpbmUgcmJfNjQocmVncywgcmVnKSAoKigoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilyZWdzKSArIHJlZykpCiAKLSNkZWZpbmUgd3dfNjQocmVncyxyZWcsZGF0KSAoKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikocmVncyArIHJlZykgPSBkYXQpCi0KIHN0cnVjdCBjeWJlcmZiX3BhciB7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAlfX3UzMiB0eXBlOwpAQCAtMTA1NSw2ICsxMDUzLDggQEAKIAogCSAgICBpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoJmZiX2luZm8pIDwgMCkgewogCQkgICAgRFBSSU5USygiRVhJVCAtIHJlZ2lzdGVyX2ZyYW1lYnVmZmVyIGZhaWxlZFxuIik7CisJCQlpZiAoQ3liZXJCYXNlKQorCQkJCWlvdW5tYXAoQ3liZXJCYXNlKTsKIAkJICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihDeWJlck1lbV9waHlzLCAweDQwMDAwMCk7CiAJCSAgICByZWxlYXNlX21lbV9yZWdpb24oQ3liZXJSZWdzX3BoeXMsIDB4MTAwMDApOwogCQkgICAgcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2Vwc29uMTM1NWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2Vwc29uMTM1NWZiLmMKaW5kZXggNzM3MjU3ZC4uMjllMDdjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZXBzb24xMzU1ZmIuYwpAQCAtNDA1LDcgKzQwNSw3IEBACiBzdGF0aWMgc3NpemVfdAogZXBzb24xMzU1ZmJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBmYmlkeCA9IGltaW5vcihpbm9kZSk7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XTsKIAl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKQEAgLTQzNyw3ICs0MzcsNyBAQAogZXBzb24xMzU1ZmJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBmYmlkeCA9IGltaW5vcihpbm9kZSk7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XTsKIAl1bnNpZ25lZCBsb25nIHAgPSAqcHBvczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJfZGRjLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiX2RkYy5jCmluZGV4IDNhYTZlYmYuLmY4MzYxMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJfZGRjLmMKKysrIGIvZHJpdmVycy92aWRlby9mYl9kZGMuYwpAQCAtMjAsMjYgKzIwLDI2IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciAqZmJfZG9fcHJvYmVfZGRjX2VkaWQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewogCXVuc2lnbmVkIGNoYXIgc3RhcnQgPSAweDA7CisJdW5zaWduZWQgY2hhciAqYnVmID0ga21hbGxvYyhFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CiAJc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewogCQl7CiAJCQkuYWRkcgk9IEREQ19BRERSLAorCQkJLmZsYWdzCT0gMCwKIAkJCS5sZW4JPSAxLAogCQkJLmJ1Zgk9ICZzdGFydCwKIAkJfSwgewogCQkJLmFkZHIJPSBERENfQUREUiwKIAkJCS5mbGFncwk9IEkyQ19NX1JELAogCQkJLmxlbgk9IEVESURfTEVOR1RILAorCQkJLmJ1Zgk9IGJ1ZiwKIAkJfQogCX07Ci0JdW5zaWduZWQgY2hhciAqYnVmOwogCi0JYnVmID0ga21hbGxvYyhFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKIAkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVESUQgIgogCQkJICJibG9jay5cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbXNnc1sxXS5idWYgPSBidWY7CiAKIAlpZiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpCiAJCXJldHVybiBidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZiY21hcC5jIGIvZHJpdmVycy92aWRlby9mYmNtYXAuYwppbmRleCBlOGIxMzVmLi4xNDgxMDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZiY21hcC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJjbWFwLmMKQEAgLTE4LDYzICsxOCw2NCBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotc3RhdGljIHUxNiByZWQyW10gPSB7CitzdGF0aWMgdTE2IHJlZDJbXSBfX3JlYWRfbW9zdGx5ID0gewogICAgIDB4MDAwMCwgMHhhYWFhCiB9Owotc3RhdGljIHUxNiBncmVlbjJbXSA9IHsKK3N0YXRpYyB1MTYgZ3JlZW4yW10gX19yZWFkX21vc3RseSA9IHsKICAgICAweDAwMDAsIDB4YWFhYQogfTsKLXN0YXRpYyB1MTYgYmx1ZTJbXSA9IHsKK3N0YXRpYyB1MTYgYmx1ZTJbXSBfX3JlYWRfbW9zdGx5ID0gewogICAgIDB4MDAwMCwgMHhhYWFhCiB9OwogCi1zdGF0aWMgdTE2IHJlZDRbXSA9IHsKK3N0YXRpYyB1MTYgcmVkNFtdIF9fcmVhZF9tb3N0bHkgPSB7CiAgICAgMHgwMDAwLCAweGFhYWEsIDB4NTU1NSwgMHhmZmZmCiB9Owotc3RhdGljIHUxNiBncmVlbjRbXSA9IHsKK3N0YXRpYyB1MTYgZ3JlZW40W10gX19yZWFkX21vc3RseSA9IHsKICAgICAweDAwMDAsIDB4YWFhYSwgMHg1NTU1LCAweGZmZmYKIH07Ci1zdGF0aWMgdTE2IGJsdWU0W10gPSB7CitzdGF0aWMgdTE2IGJsdWU0W10gX19yZWFkX21vc3RseSA9IHsKICAgICAweDAwMDAsIDB4YWFhYSwgMHg1NTU1LCAweGZmZmYKIH07CiAKLXN0YXRpYyB1MTYgcmVkOFtdID0geworc3RhdGljIHUxNiByZWQ4W10gX19yZWFkX21vc3RseSA9IHsKICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4YWFhYSwgMHhhYWFhLCAweGFhYWEsIDB4YWFhYQogfTsKLXN0YXRpYyB1MTYgZ3JlZW44W10gPSB7CitzdGF0aWMgdTE2IGdyZWVuOFtdIF9fcmVhZF9tb3N0bHkgPSB7CiAgICAgMHgwMDAwLCAweDAwMDAsIDB4YWFhYSwgMHhhYWFhLCAweDAwMDAsIDB4MDAwMCwgMHg1NTU1LCAweGFhYWEKIH07Ci1zdGF0aWMgdTE2IGJsdWU4W10gPSB7CitzdGF0aWMgdTE2IGJsdWU4W10gX19yZWFkX21vc3RseSA9IHsKICAgICAweDAwMDAsIDB4YWFhYSwgMHgwMDAwLCAweGFhYWEsIDB4MDAwMCwgMHhhYWFhLCAweDAwMDAsIDB4YWFhYQogfTsKIAotc3RhdGljIHUxNiByZWQxNltdID0geworc3RhdGljIHUxNiByZWQxNltdIF9fcmVhZF9tb3N0bHkgPSB7CiAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGFhYWEsIDB4YWFhYSwgMHhhYWFhLCAweGFhYWEsCiAgICAgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYKIH07Ci1zdGF0aWMgdTE2IGdyZWVuMTZbXSA9IHsKK3N0YXRpYyB1MTYgZ3JlZW4xNltdIF9fcmVhZF9tb3N0bHkgPSB7CiAgICAgMHgwMDAwLCAweDAwMDAsIDB4YWFhYSwgMHhhYWFhLCAweDAwMDAsIDB4MDAwMCwgMHg1NTU1LCAweGFhYWEsCiAgICAgMHg1NTU1LCAweDU1NTUsIDB4ZmZmZiwgMHhmZmZmLCAweDU1NTUsIDB4NTU1NSwgMHhmZmZmLCAweGZmZmYKIH07Ci1zdGF0aWMgdTE2IGJsdWUxNltdID0geworc3RhdGljIHUxNiBibHVlMTZbXSBfX3JlYWRfbW9zdGx5ID0gewogICAgIDB4MDAwMCwgMHhhYWFhLCAweDAwMDAsIDB4YWFhYSwgMHgwMDAwLCAweGFhYWEsIDB4MDAwMCwgMHhhYWFhLAogICAgIDB4NTU1NSwgMHhmZmZmLCAweDU1NTUsIDB4ZmZmZiwgMHg1NTU1LCAweGZmZmYsIDB4NTU1NSwgMHhmZmZmCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX2NtYXAgZGVmYXVsdF8yX2NvbG9ycyA9IHsKLSAgICAwLCAyLCByZWQyLCBncmVlbjIsIGJsdWUyLCBOVUxMCitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX2NtYXAgZGVmYXVsdF8yX2NvbG9ycyA9IHsKKyAgICAubGVuPTIsIC5yZWQ9cmVkMiwgLmdyZWVuPWdyZWVuMiwgLmJsdWU9Ymx1ZTIKIH07Ci1zdGF0aWMgc3RydWN0IGZiX2NtYXAgZGVmYXVsdF84X2NvbG9ycyA9IHsKLSAgICAwLCA4LCByZWQ4LCBncmVlbjgsIGJsdWU4LCBOVUxMCitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX2NtYXAgZGVmYXVsdF84X2NvbG9ycyA9IHsKKyAgICAubGVuPTgsIC5yZWQ9cmVkOCwgLmdyZWVuPWdyZWVuOCwgLmJsdWU9Ymx1ZTgKIH07Ci1zdGF0aWMgc3RydWN0IGZiX2NtYXAgZGVmYXVsdF80X2NvbG9ycyA9IHsKLSAgICAwLCA0LCByZWQ0LCBncmVlbjQsIGJsdWU0LCBOVUxMCitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX2NtYXAgZGVmYXVsdF80X2NvbG9ycyA9IHsKKyAgICAubGVuPTQsIC5yZWQ9cmVkNCwgLmdyZWVuPWdyZWVuNCwgLmJsdWU9Ymx1ZTQKIH07Ci1zdGF0aWMgc3RydWN0IGZiX2NtYXAgZGVmYXVsdF8xNl9jb2xvcnMgPSB7Ci0gICAgMCwgMTYsIHJlZDE2LCBncmVlbjE2LCBibHVlMTYsIE5VTEwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfY21hcCBkZWZhdWx0XzE2X2NvbG9ycyA9IHsKKyAgICAubGVuPTE2LCAucmVkPXJlZDE2LCAuZ3JlZW49Z3JlZW4xNiwgLmJsdWU9Ymx1ZTE2CiB9OwogCiAKKwogLyoqCiAgKglmYl9hbGxvY19jbWFwIC0gYWxsb2NhdGUgYSBjb2xvcm1hcAogICoJQGNtYXA6IGZyYW1lIGJ1ZmZlciBjb2xvcm1hcCBzdHJ1Y3R1cmUKQEAgLTE0Niw3ICsxNDcsNyBAQAogICoJQ29weSBjb250ZW50cyBvZiBjb2xvcm1hcCBmcm9tIEBmcm9tIHRvIEB0by4KICAqLwogCi1pbnQgZmJfY29weV9jbWFwKHN0cnVjdCBmYl9jbWFwICpmcm9tLCBzdHJ1Y3QgZmJfY21hcCAqdG8pCitpbnQgZmJfY29weV9jbWFwKGNvbnN0IHN0cnVjdCBmYl9jbWFwICpmcm9tLCBzdHJ1Y3QgZmJfY21hcCAqdG8pCiB7CiAJaW50IHRvb2ZmID0gMCwgZnJvbW9mZiA9IDA7CiAJaW50IHNpemU7CkBAIC0xNzAsNyArMTcxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGZiX2NtYXBfdG9fdXNlcihzdHJ1Y3QgZmJfY21hcCAqZnJvbSwgc3RydWN0IGZiX2NtYXBfdXNlciAqdG8pCitpbnQgZmJfY21hcF90b191c2VyKGNvbnN0IHN0cnVjdCBmYl9jbWFwICpmcm9tLCBzdHJ1Y3QgZmJfY21hcF91c2VyICp0bykKIHsKIAlpbnQgdG9vZmYgPSAwLCBmcm9tb2ZmID0gMDsKIAlpbnQgc2l6ZTsKQEAgLTI4Miw3ICsyODMsNyBAQAogICoKICAqLwogCi1zdHJ1Y3QgZmJfY21hcCAqZmJfZGVmYXVsdF9jbWFwKGludCBsZW4pCitjb25zdCBzdHJ1Y3QgZmJfY21hcCAqZmJfZGVmYXVsdF9jbWFwKGludCBsZW4pCiB7CiAgICAgaWYgKGxlbiA8PSAyKQogCXJldHVybiAmZGVmYXVsdF8yX2NvbG9yczsKQEAgLTMwNSwyMiArMzA2LDIyIEBACiB7CiAgICAgdV9pbnQgaTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWQyKTsgaSsrKSB7CiAJcmVkMltpXSA9IH5yZWQyW2ldOwogCWdyZWVuMltpXSA9IH5ncmVlbjJbaV07CiAJYmx1ZTJbaV0gPSB+Ymx1ZTJbaV07CiAgICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWQ0KTsgaSsrKSB7CiAJcmVkNFtpXSA9IH5yZWQ0W2ldOwogCWdyZWVuNFtpXSA9IH5ncmVlbjRbaV07CiAJYmx1ZTRbaV0gPSB+Ymx1ZTRbaV07CiAgICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWQ4KTsgaSsrKSB7CiAJcmVkOFtpXSA9IH5yZWQ4W2ldOwogCWdyZWVuOFtpXSA9IH5ncmVlbjhbaV07CiAJYmx1ZThbaV0gPSB+Ymx1ZThbaV07CiAgICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVkMTYpOyBpKyspIHsKIAlyZWQxNltpXSA9IH5yZWQxNltpXTsKIAlncmVlbjE2W2ldID0gfmdyZWVuMTZbaV07CiAJYmx1ZTE2W2ldID0gfmJsdWUxNltpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJjdnQuYyBiL2RyaXZlcnMvdmlkZW8vZmJjdnQuYwppbmRleCBiNTQ5ODk5Li4wODQ3YzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZiY3Z0LmMKKysrIGIvZHJpdmVycy92aWRlby9mYmN2dC5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJdTMyIHN0YXR1czsKIH07CiAKLXN0YXRpYyBpbnQgZmJfY3Z0X3ZiaV90YWJbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZiX2N2dF92YmlfdGFiW10gPSB7CiAJNCwgICAgICAgIC8qIDQ6MyAgICAgICovCiAJNSwgICAgICAgIC8qIDE2OjkgICAgICovCiAJNiwgICAgICAgIC8qIDE2OjEwICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKaW5kZXggOTNmZmNkZC4uM2NmZWEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwpAQCAtNTIsOCArNTIsOCBAQAogCiAjZGVmaW5lIEZCUElYTUFQU0laRQkoMTAyNCAqIDgpCiAKLXN0cnVjdCBmYl9pbmZvICpyZWdpc3RlcmVkX2ZiW0ZCX01BWF07Ci1pbnQgbnVtX3JlZ2lzdGVyZWRfZmI7CitzdHJ1Y3QgZmJfaW5mbyAqcmVnaXN0ZXJlZF9mYltGQl9NQVhdIF9fcmVhZF9tb3N0bHk7CitpbnQgbnVtX3JlZ2lzdGVyZWRfZmIgX19yZWFkX21vc3RseTsKIAogLyoKICAqIEhlbHBlcnMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCQkJCQkgICAgY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmxvZ28sCiAJCQkJCSAgICB1MzIgKnBhbGV0dGUpCiB7Ci0JdW5zaWduZWQgY2hhciBtYXNrWzldID0geyAwLDB4ODAsMHhjMCwweGUwLDB4ZjAsMHhmOCwweGZjLDB4ZmUsMHhmZiB9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hc2tbXSA9IHsgMCwweDgwLDB4YzAsMHhlMCwweGYwLDB4ZjgsMHhmYywweGZlLDB4ZmYgfTsKIAl1bnNpZ25lZCBjaGFyIHJlZG1hc2ssIGdyZWVubWFzaywgYmx1ZW1hc2s7CiAJaW50IHJlZHNoaWZ0LCBncmVlbnNoaWZ0LCBibHVlc2hpZnQ7CiAJaW50IGk7CkBAIC0zMTcsNyArMzE3LDcgQEAKIAlpbnQgbmVlZHNfdHJ1ZXBhbGV0dGU7CiAJaW50IG5lZWRzX2NtYXByZXNldDsKIAljb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqbG9nbzsKLX0gZmJfbG9nbzsKK30gZmJfbG9nbyBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgdm9pZCBmYl9yb3RhdGVfbG9nb191ZChjb25zdCB1OCAqaW4sIHU4ICpvdXQsIHUzMiB3aWR0aCwgdTMyIGhlaWdodCkKIHsKQEAgLTU3Miw3ICs1NzIsNyBAQAogZmJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBmYmlkeCA9IGltaW5vcihpbm9kZSk7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XTsKIAl1MzIgKmJ1ZmZlciwgKmRzdDsKQEAgLTY0Nyw3ICs2NDcsNyBAQAogZmJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXVuc2lnbmVkIGxvbmcgcCA9ICpwcG9zOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZmJpZHggPSBpbWlub3IoaW5vZGUpOwogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcmVnaXN0ZXJlZF9mYltmYmlkeF07CiAJdTMyICpidWZmZXIsICpzcmM7CkBAIC0xMDgxLDcgKzEwODEsNyBAQAogc3RhdGljIGxvbmcKIGZiX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBmYmlkeCA9IGltaW5vcihpbm9kZSk7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XTsKIAlzdHJ1Y3QgZmJfb3BzICpmYiA9IGluZm8tPmZib3BzOwpAQCAtMTEyMSw3ICsxMTIxLDcgQEAKIHN0YXRpYyBpbnQgCiBmYl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCiB7Ci0JaW50IGZiaWR4ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgZmJpZHggPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XTsKIAlzdHJ1Y3QgZmJfb3BzICpmYiA9IGluZm8tPmZib3BzOwogCXVuc2lnbmVkIGxvbmcgb2ZmOwpAQCAtMTI1Myw3ICsxMjUzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmJfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZiX2ZvcHMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLnJlYWQgPQkJZmJfcmVhZCwKIAkud3JpdGUgPQlmYl93cml0ZSwKQEAgLTEyOTYsMTQgKzEyOTYsMTQgQEAKIAkJCWJyZWFrOwogCWZiX2luZm8tPm5vZGUgPSBpOwogCi0JZmJfaW5mby0+Y2xhc3NfZGV2aWNlID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShmYl9jbGFzcywgTlVMTCwgTUtERVYoRkJfTUFKT1IsIGkpLAotCQkJCSAgICBmYl9pbmZvLT5kZXZpY2UsICJmYiVkIiwgaSk7Ci0JaWYgKElTX0VSUihmYl9pbmZvLT5jbGFzc19kZXZpY2UpKSB7CisJZmJfaW5mby0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShmYl9jbGFzcywgZmJfaW5mby0+ZGV2aWNlLAorCQkJCSAgICAgTUtERVYoRkJfTUFKT1IsIGkpLCAiZmIlZCIsIGkpOworCWlmIChJU19FUlIoZmJfaW5mby0+ZGV2KSkgewogCQkvKiBOb3QgZmF0YWwgKi8KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBjbGFzc19kZXZpY2UgZm9yIGZyYW1lYnVmZmVyICVkOyBlcnJubyA9ICVsZFxuIiwgaSwgUFRSX0VSUihmYl9pbmZvLT5jbGFzc19kZXZpY2UpKTsKLQkJZmJfaW5mby0+Y2xhc3NfZGV2aWNlID0gTlVMTDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBkZXZpY2UgZm9yIGZyYW1lYnVmZmVyICVkOyBlcnJubyA9ICVsZFxuIiwgaSwgUFRSX0VSUihmYl9pbmZvLT5kZXYpKTsKKwkJZmJfaW5mby0+ZGV2ID0gTlVMTDsKIAl9IGVsc2UKLQkJZmJfaW5pdF9jbGFzc19kZXZpY2UoZmJfaW5mbyk7CisJCWZiX2luaXRfZGV2aWNlKGZiX2luZm8pOwogCiAJaWYgKGZiX2luZm8tPnBpeG1hcC5hZGRyID09IE5VTEwpIHsKIAkJZmJfaW5mby0+cGl4bWFwLmFkZHIgPSBrbWFsbG9jKEZCUElYTUFQU0laRSwgR0ZQX0tFUk5FTCk7CkBAIC0xMzU2LDggKzEzNTYsOCBAQAogCWZiX2Rlc3Ryb3lfbW9kZWxpc3QoJmZiX2luZm8tPm1vZGVsaXN0KTsKIAlyZWdpc3RlcmVkX2ZiW2ldPU5VTEw7CiAJbnVtX3JlZ2lzdGVyZWRfZmItLTsKLQlmYl9jbGVhbnVwX2NsYXNzX2RldmljZShmYl9pbmZvKTsKLQljbGFzc19kZXZpY2VfZGVzdHJveShmYl9jbGFzcywgTUtERVYoRkJfTUFKT1IsIGkpKTsKKwlmYl9jbGVhbnVwX2RldmljZShmYl9pbmZvKTsKKwlkZXZpY2VfZGVzdHJveShmYl9jbGFzcywgTUtERVYoRkJfTUFKT1IsIGkpKTsKIAlldmVudC5pbmZvID0gZmJfaW5mbzsKIAlmYl9ub3RpZmllcl9jYWxsX2NoYWluKEZCX0VWRU5UX0ZCX1VOUkVHSVNURVJFRCwgJmV2ZW50KTsKIAlyZXR1cm4gMDsKQEAgLTE0NTksOCArMTQ1OSw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGNoYXIgKnZpZGVvX29wdGlvbnNbRkJfTUFYXTsKLXN0YXRpYyBpbnQgb2Zvbmx5Oworc3RhdGljIGNoYXIgKnZpZGVvX29wdGlvbnNbRkJfTUFYXSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGludCBvZm9ubHkgX19yZWFkX21vc3RseTsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKmdsb2JhbF9tb2RlX29wdGlvbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYm1vbi5jIGIvZHJpdmVycy92aWRlby9mYm1vbi5jCmluZGV4IGRlOTMxMzkuLjZiMzg1YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJtb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZibW9uLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAl1MzIgZml4OwogfTsKIAotc3RhdGljIHN0cnVjdCBicm9rZW5fZWRpZCBicm9rZW5kYltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBicm9rZW5fZWRpZCBicm9rZW5kYltdID0gewogCS8qIERFQyBGUi1QQ1hBVi1ZWiAqLwogCXsKIAkJLm1hbnVmYWN0dXJlciA9ICJERUMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMgYi9kcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYwppbmRleCBkM2E1MDQxLi4zMjNiZGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYwpAQCAtNzMsNyArNzMsNyBAQAogICoKICAqIEBpbmZvOiBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKICAqCi0gKiBEcm9wIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGNsYXNzX2RldmljZSBlbWJlZGRlZCBpbiB0aGUKKyAqIERyb3AgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZGV2aWNlIGVtYmVkZGVkIGluIHRoZQogICogZnJhbWVidWZmZXIgaW5mbyBzdHJ1Y3R1cmUuCiAgKgogICovCkBAIC0xMjAsMTAgKzEyMCwxMCBAQAogCSAgICAgICAgICAgICAgICBtLCBtb2RlLT54cmVzLCBtb2RlLT55cmVzLCB2LCBtb2RlLT5yZWZyZXNoKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfbW9kZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNvbnN0IGNoYXIgKiBidWYsCi0JCQkgIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJY2hhciBtc3RyWzEwMF07CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAlzdHJ1Y3QgZmJfbW9kZWxpc3QgKm1vZGVsaXN0OwpAQCAtMTUxLDkgKzE1MSwxMCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X21vZGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAKIAlpZiAoIWZiX2luZm8tPm1vZGUpCiAJCXJldHVybiAwOwpAQCAtMTYxLDEwICsxNjIsMTEgQEAKIAlyZXR1cm4gbW9kZV9zdHJpbmcoYnVmLCAwLCBmYl9pbmZvLT5tb2RlKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfbW9kZXMoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjb25zdCBjaGFyICogYnVmLAotCQkJICAgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlMSVNUX0hFQUQob2xkX2xpc3QpOwogCWludCBpID0gY291bnQgLyBzaXplb2Yoc3RydWN0IGZiX3ZpZGVvbW9kZSk7CiAKQEAgLTE4Niw5ICsxODgsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19tb2RlcyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlzdHJ1Y3QgZmJfbW9kZWxpc3QgKm1vZGVsaXN0OwpAQCAtMjAzLDEwICsyMDYsMTAgQEAKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfYnBwKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY29uc3QgY2hhciAqIGJ1ZiwKLQkJCSBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9icHAoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwogCWNoYXIgKiogbGFzdCA9IE5VTEw7CiAJaW50IGVycjsKQEAgLTIxOCwxNiArMjIxLDE4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2JwcChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfYnBwKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3JvdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yb3RhdGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CiAJY2hhciAqKmxhc3QgPSBOVUxMOwogCWludCBlcnI7CkBAIC0yNDIsMTcgKzI0NywxOSBAQAogfQogCiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfcm90YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19yb3RhdGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBmYl9pbmZvLT52YXIucm90YXRlKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfdmlydHVhbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCi0JCQkgICAgIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3ZpcnR1YWwoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKIAljaGFyICpsYXN0ID0gTlVMTDsKIAlpbnQgZXJyOwpAQCAtMjY5LDIzICsyNzYsMjYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdmlydHVhbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlydHVhbChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZCwlZFxuIiwgZmJfaW5mby0+dmFyLnhyZXNfdmlydHVhbCwKIAkJCWZiX2luZm8tPnZhci55cmVzX3ZpcnR1YWwpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3N0cmlkZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RyaWRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGZiX2luZm8tPmZpeC5saW5lX2xlbmd0aCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2JsYW5rKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY29uc3QgY2hhciAqIGJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2JsYW5rKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJY2hhciAqbGFzdCA9IE5VTEw7CiAJaW50IGVycjsKIApAQCAtMjk5LDQyICszMDksNDggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfYmxhbmsoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2JsYW5rKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLS8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKy8vCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2NvbnNvbGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAotCQkJICAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9jb25zb2xlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19jb25zb2xlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19jb25zb2xlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfY3Vyc29yKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKLQkJCSAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9jdXJzb3Ioc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19jdXJzb3Ioc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2N1cnNvcihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworLy8Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfcGFuKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY29uc3QgY2hhciAqIGJ1ZiwKLQkJCSBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wYW4oc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CiAJY2hhciAqbGFzdCA9IE5VTEw7CiAJaW50IGVycjsKQEAgLTM1NSwyNCArMzcxLDI3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3BhbihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfcGFuKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQsJWRcbiIsIGZiX2luZm8tPnZhci54b2Zmc2V0LAogCQkJZmJfaW5mby0+dmFyLnhvZmZzZXQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZmJfaW5mby0+Zml4LmlkKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfZmJzdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2Zic3RhdGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXZpY2UpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJdTMyIHN0YXRlOwogCWNoYXIgKmxhc3QgPSBOVUxMOwogCkBAIC0zODUsMTcgKzQwNCwxOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19mYnN0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19mYnN0YXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBmYl9pbmZvLT5zdGF0ZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9ibF9jdXJ2ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfYmxfY3VydmUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAl1OCB0bXBfY3VydmVbRkJfQkFDS0xJR0hUX0xFVkVMU107CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTQzMiw5ICs0NTMsMTAgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfYmxfY3VydmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2JsX2N1cnZlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3RydWN0IGZiX2luZm8gKmZiX2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzc2l6ZV90IGxlbiA9IDA7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTQ2NSw3ICs0ODcsNyBAQAogLyogV2hlbiBjbWFwIGlzIGFkZGVkIGJhY2sgaW4gaXQgc2hvdWxkIGJlIGEgYmluYXJ5IGF0dHJpYnV0ZQogICogbm90IGEgdGV4dCBvbmUuIENvbnNpZGVyYXRpb24gc2hvdWxkIGFsc28gYmUgZ2l2ZW4gdG8gY29udmVydGluZwogICogZmJkZXYgdG8gdXNlIGNvbmZpZ2ZzIGluc3RlYWQgb2Ygc3lzZnMgKi8KLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19kZXZpY2VfYXR0cnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZpY2VfYXR0cnNbXSA9IHsKIAlfX0FUVFIoYml0c19wZXJfcGl4ZWwsIFNfSVJVR098U19JV1VTUiwgc2hvd19icHAsIHN0b3JlX2JwcCksCiAJX19BVFRSKGJsYW5rLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfYmxhbmssIHN0b3JlX2JsYW5rKSwKIAlfX0FUVFIoY29uc29sZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2NvbnNvbGUsIHN0b3JlX2NvbnNvbGUpLApAQCAtNDgzLDE3ICs1MDUsMTYgQEAKICNlbmRpZgogfTsKIAotaW50IGZiX2luaXRfY2xhc3NfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKQoraW50IGZiX2luaXRfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKQogewogCWludCBpLCBlcnJvciA9IDA7CiAKLQljbGFzc19zZXRfZGV2ZGF0YShmYl9pbmZvLT5jbGFzc19kZXZpY2UsIGZiX2luZm8pOworCWRldl9zZXRfZHJ2ZGF0YShmYl9pbmZvLT5kZXYsIGZiX2luZm8pOwogCiAJZmJfaW5mby0+Y2xhc3NfZmxhZyB8PSBGQl9TWVNGU19GTEFHX0FUVFI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspIHsKLQkJZXJyb3IgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoZmJfaW5mby0+Y2xhc3NfZGV2aWNlLAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmljZV9hdHRycyk7IGkrKykgeworCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShmYl9pbmZvLT5kZXYsICZkZXZpY2VfYXR0cnNbaV0pOwogCiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwpAQCAtNTAxLDIyICs1MjIsMjAgQEAKIAogCWlmIChlcnJvcikgewogCQl3aGlsZSAoLS1pID49IDApCi0JCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoZmJfaW5mby0+Y2xhc3NfZGV2aWNlLAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCQkJZGV2aWNlX3JlbW92ZV9maWxlKGZiX2luZm8tPmRldiwgJmRldmljZV9hdHRyc1tpXSk7CiAJCWZiX2luZm8tPmNsYXNzX2ZsYWcgJj0gfkZCX1NZU0ZTX0ZMQUdfQVRUUjsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBmYl9jbGVhbnVwX2NsYXNzX2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbykKK3ZvaWQgZmJfY2xlYW51cF9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoZmJfaW5mby0+Y2xhc3NfZmxhZyAmIEZCX1NZU0ZTX0ZMQUdfQVRUUikgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGFzc19kZXZpY2VfYXR0cnMpOyBpKyspCi0JCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoZmJfaW5mby0+Y2xhc3NfZGV2aWNlLAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspCisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJfaW5mby0+ZGV2LCAmZGV2aWNlX2F0dHJzW2ldKTsKIAogCQlmYl9pbmZvLT5jbGFzc19mbGFnICY9IH5GQl9TWVNGU19GTEFHX0FUVFI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mZmIuYyBiL2RyaXZlcnMvdmlkZW8vZmZiLmMKaW5kZXggMmEwZTgyMS4uOTQ5MTQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZmYi5jCkBAIC05NjgsNiArOTY4LDggQEAKIAogCWlmIChmYl9hbGxvY19jbWFwKCZhbGwtPmluZm8uY21hcCwgMjU2LCAwKSkgewogCQlwcmludGsoS0VSTl9FUlIgImZmYjogQ291bGQgbm90IGFsbG9jYXRlIGNvbG9yIG1hcC5cbiIpOworCQlvZl9pb3VubWFwKGFsbC0+cGFyLmZiYywgc2l6ZW9mKHN0cnVjdCBmZmJfZmJjKSk7CisJCW9mX2lvdW5tYXAoYWxsLT5wYXIuZGFjLCBzaXplb2Yoc3RydWN0IGZmYl9kYWMpKTsKIAkJa2ZyZWUoYWxsKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtOTc4LDYgKzk4MCw4IEBACiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmZmI6IENvdWxkIG5vdCByZWdpc3RlciBmcmFtZWJ1ZmZlci5cbiIpOwogCQlmYl9kZWFsbG9jX2NtYXAoJmFsbC0+aW5mby5jbWFwKTsKKwkJb2ZfaW91bm1hcChhbGwtPnBhci5mYmMsIHNpemVvZihzdHJ1Y3QgZmZiX2ZiYykpOworCQlvZl9pb3VubWFwKGFsbC0+cGFyLmRhYywgc2l6ZW9mKHN0cnVjdCBmZmJfZGFjKSk7CiAJCWtmcmVlKGFsbCk7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mbTJmYi5jIGIvZHJpdmVycy92aWRlby9mbTJmYi5jCmluZGV4IDk5ODM3NGMuLjcwZmY1NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZm0yZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ZtMmZiLmMKQEAgLTI4Myw2ICsyODMsNyBAQAogCiAJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkgewogCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAkJem9ycm9fcmVsZWFzZV9kZXZpY2Uoeik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9LY29uZmlnIGIvZHJpdmVycy92aWRlby9nZW9kZS9LY29uZmlnCmluZGV4IDRlMTczZWYuLmE4MTRiNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL0tjb25maWcKQEAgLTIzLDYgKzIzLDI2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBGQl9HRU9ERV9HWF9TRVRfRkJTSVpFCisJYm9vbCAiTWFudWFsbHkgc3BlY2lmeSB0aGUgR2VvZGUgR1ggZnJhbWVidWZmZXIgc2l6ZSIKKwlkZXBlbmRzIG9uIEZCX0dFT0RFX0dYCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgSWYgeW91IHdhbnQgdG8gbWFudWFsbHkgc3BlY2lmeSB0aGUgc2l6ZSBvZiB5b3VyIEdYIGZyYW1lYnVmZmVyLAorCSAgc2F5IFkgaGVyZSwgb3RoZXJ3aXNlIHNheSBOIHRvIGR5bmFtaWNhbGx5IHByb2JlIGl0LgorCisJICBTYXkgTiB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCitjb25maWcgRkJfR0VPREVfR1hfRkJTSVpFCisJaGV4ICJTaXplIG9mIHRoZSBHWCBmcmFtZWJ1ZmZlciwgaW4gYnl0ZXMiCisJZGVwZW5kcyBvbiBGQl9HRU9ERV9HWF9TRVRfRkJTSVpFCisJZGVmYXVsdCAiMHgxNjAwMDAwIgorCS0tLWhlbHAtLS0KKwkgIFNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIEdYIGZyYW1lYnVmZmVyLiAgTm9ybWFsbHksIHlvdSB3aWxsCisJICB3YW50IHRoaXMgdG8gYmUgTUIgYWxpZ25lZC4gIENvbW1vbiB2YWx1ZXMgYXJlIDB4ODAwMDAgKDhNQikKKwkgIGFuZCAweDE2MDAwMDAgKDE2TUIpLiAgRG9uJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQKKwkgIHlvdSBhcmUgZG9pbmcKKwogY29uZmlnIEZCX0dFT0RFX0dYMQogCXRyaXN0YXRlICJBTUQgR2VvZGUgR1gxIGZyYW1lYnVmZmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBGQiAmJiBGQl9HRU9ERSAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZGlzcGxheV9neC5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9kaXNwbGF5X2d4LmMKaW5kZXggODI1YzM0MC4uMGYxNmU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9kaXNwbGF5X2d4LmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9kaXNwbGF5X2d4LmMKQEAgLTIxLDExICsyMSwyNyBAQAogI2luY2x1ZGUgImdlb2RlZmIuaCIKICNpbmNsdWRlICJkaXNwbGF5X2d4LmgiCiAKLWludCBneF9mcmFtZV9idWZmZXJfc2l6ZSh2b2lkKQorI2lmZGVmIENPTkZJR19GQl9HRU9ERV9HWF9TRVRfRkJTSVpFCit1bnNpZ25lZCBpbnQgZ3hfZnJhbWVfYnVmZmVyX3NpemUodm9pZCkKIHsKLQkvKiBBc3N1bWluZyAxNiBNaUIuICovCi0JcmV0dXJuIDE2KjEwMjQqMTAyNDsKKwlyZXR1cm4gQ09ORklHX0ZCX0dFT0RFX0dYX0ZCU0laRTsKIH0KKyNlbHNlCit1bnNpZ25lZCBpbnQgZ3hfZnJhbWVfYnVmZmVyX3NpemUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJLyogRkIgc2l6ZSBpcyByZXBvcnRlZCBieSBhIHZpcnR1YWwgcmVnaXN0ZXIgKi8KKwkvKiBWaXJ0dWFsIHJlZ2lzdGVyIGNsYXNzID0gMHgwMiAqLworCS8qIFZHX01FTV9TSVpFKDUxMktiIHVuaXRzKSA9IDB4MDAgKi8KKworCW91dHcoMHhGQzUzLCAweEFDMUMpOworCW91dHcoMHgwMjAwLCAweEFDMUMpOworCisJdmFsID0gKHVuc2lnbmVkIGludCkoaW53KDB4QUMxRSkpICYgMHhGRmw7CisJcmV0dXJuICh2YWwgPDwgMTkpOworfQorI2VuZGlmCiAKIGludCBneF9saW5lX2RlbHRhKGludCB4cmVzLCBpbnQgYnBwKQogewpAQCAtODEsNiArOTcsNyBAQAogCXdyaXRlbCgoKGluZm8tPnZhci54cmVzICogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLzgpID4+IDMpICsgMiwKIAkgICAgICAgcGFyLT5kY19yZWdzICsgRENfTElORV9TSVpFKTsKIAorCiAJLyogRW5hYmxlIGdyYXBoaWNzIGFuZCB2aWRlbyBkYXRhIGFuZCB1bm1hc2sgYWRkcmVzcyBsaW5lcy4gKi8KIAlkY2ZnIHw9IERDX0RDRkdfR0RFTiB8IERDX0RDRkdfVkRFTiB8IERDX0RDRkdfQTIwTSB8IERDX0RDRkdfQTE4TTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9kaXNwbGF5X2d4LmggYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2Rpc3BsYXlfZ3guaAppbmRleCA4NmM2MjMzLi4wYWYzM2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL2Rpc3BsYXlfZ3guaAorKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2Rpc3BsYXlfZ3guaApAQCAtMTEsMTEgKzExLDE1IEBACiAjaWZuZGVmIF9fRElTUExBWV9HWF9IX18KICNkZWZpbmUgX19ESVNQTEFZX0dYX0hfXwogCi1pbnQgZ3hfZnJhbWVfYnVmZmVyX3NpemUodm9pZCk7Cit1bnNpZ25lZCBpbnQgZ3hfZnJhbWVfYnVmZmVyX3NpemUodm9pZCk7CiBpbnQgZ3hfbGluZV9kZWx0YShpbnQgeHJlcywgaW50IGJwcCk7CiAKIGV4dGVybiBzdHJ1Y3QgZ2VvZGVfZGNfb3BzIGd4X2RjX29wczsKIAorLyogTVNSIHRoYXQgdGVsbHMgdXMgaWYgYSBURlQgb3IgQ1JUIGlzIGF0dGFjaGVkICovCisjZGVmaW5lIEdMRF9NU1JfQ09ORklHICAgMHhDMDAwMjAwMQorI2RlZmluZSBHTERfTVNSX0NPTkZJR19ETV9GUCAweDQwCisKIC8qIERpc3BsYXkgY29udHJvbGxlciByZWdpc3RlcnMgKi8KIAogI2RlZmluZSBEQ19VTkxPQ0sgMHgwMApAQCAtOTMsNCArOTcsNSBAQAogI2RlZmluZSBEQ19QQUxfQUREUkVTUyAweDcwCiAjZGVmaW5lIERDX1BBTF9EQVRBICAgIDB4NzQKIAorI2RlZmluZSBEQ19HTElVMF9NRU1fT0ZGU0VUIDB4ODQKICNlbmRpZiAvKiAhX19ESVNQTEFZX0dYMV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3hmYl9jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4ZmJfY29yZS5jCmluZGV4IDBkMzY0M2YuLmNmODQxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3hmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYwpAQCAtMzUsMTAgKzM1LDEwIEBACiAjaW5jbHVkZSAiZGlzcGxheV9neC5oIgogI2luY2x1ZGUgInZpZGVvX2d4LmgiCiAKLXN0YXRpYyBjaGFyIG1vZGVfb3B0aW9uWzMyXSA9ICI2NDB4NDgwLTE2QDYwIjsKK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbjsKIAogLyogTW9kZXMgcmVsZXZhbnQgdG8gdGhlIEdYICh0YWtlbiBmcm9tIG1vZGVkYi5jKSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgX19pbml0ZGF0YSBneF9tb2RlZGJbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIGd4X21vZGVkYltdIF9faW5pdGRhdGEgPSB7CiAJLyogNjQweDQ4MC02MCBWRVNBICovCiAJeyBOVUxMLCA2MCwgNjQwLCA0ODAsIDM5NjgyLCAgNDgsIDE2LCAzMywgMTAsIDk2LCAyLAogCSAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCkBAIC0yNDAsNiArMjQwLDEyIEBACiAJaWYgKCFpbmZvLT5zY3JlZW5fYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwkvKiBTZXQgdGhlIDE2TUIgYWxpZ25lZCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGdyYXBoaWNzIG1lbW9yeSByZWdpb24KKwkgKiBpbiB0aGUgZGlzcGxheSBjb250cm9sbGVyICovCisKKwl3cml0ZWwoaW5mby0+Zml4LnNtZW1fc3RhcnQgJiAweEZGMDAwMDAwLAorCQkJcGFyLT5kY19yZWdzICsgRENfR0xJVTBfTUVNX09GRlNFVCk7CisKIAlkZXZfaW5mbygmZGV2LT5kZXYsICIlZCBLaWJ5dGUgb2YgdmlkZW8gbWVtb3J5IGF0IDB4JWx4XG4iLAogCQkgaW5mby0+Zml4LnNtZW1fbGVuIC8gMTAyNCwgaW5mby0+Zml4LnNtZW1fc3RhcnQpOwogCkBAIC0zMDIsNiArMzA4LDcgQEAKIAlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhcjsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdmFsOwogCiAJaW5mbyA9IGd4ZmJfaW5pdF9mYmluZm8oJnBkZXYtPmRldik7CiAJaWYgKCFpbmZvKQpAQCAtMzE3LDYgKzMyNCwxNSBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwkvKiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgYSBURlQgb3IgQ1JUIHBhcnQgKi8KKworCXJkbXNybChHTERfTVNSX0NPTkZJRywgdmFsKTsKKworCWlmICgodmFsICYgR0xEX01TUl9DT05GSUdfRE1fRlApID09IEdMRF9NU1JfQ09ORklHX0RNX0ZQKQorCQlwYXItPmVuYWJsZV9jcnQgPSAwOworCWVsc2UKKwkJcGFyLT5lbmFibGVfY3J0ID0gMTsKKwogCXJldCA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBtb2RlX29wdGlvbiwKIAkJCSAgIGd4X21vZGVkYiwgQVJSQVlfU0laRShneF9tb2RlZGIpLCBOVUxMLCAxNik7CiAJaWYgKHJldCA9PSAwIHx8IHJldCA9PSA0KSB7CkBAIC0zMjUsNyArMzQxLDggQEAKIAkJZ290byBlcnI7CiAJfQogCi0gICAgICAgIC8qIENsZWFyIHRoZSBmcmFtZSBidWZmZXIgb2YgZ2FyYmFnZS4gKi8KKworCS8qIENsZWFyIHRoZSBmcmFtZSBidWZmZXIgb2YgZ2FyYmFnZS4gKi8KICAgICAgICAgbWVtc2V0X2lvKGluZm8tPnNjcmVlbl9iYXNlLCAwLCBpbmZvLT5maXguc21lbV9sZW4pOwogCiAJZ3hmYl9jaGVja192YXIoJmluZm8tPnZhciwgaW5mbyk7CkBAIC0zODAsNyArMzk3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGd4ZmJfaWRfdGFibGVbXSA9IHsKLQl7IFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfQ1M1NTM1X1ZJREVPLAorCXsgUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19HWF9WSURFTywKIAkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkgPDwgMTYsCiAJICAweGZmMDAwMCwgMCB9LAogCXsgMCwgfQpAQCAtMzk1LDExICs0MTIsMzUgQEAKIAkucmVtb3ZlCQk9IGd4ZmJfcmVtb3ZlLAogfTsKIAorI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGd4ZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKworCWNoYXIgKm9wdDsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKChvcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqb3B0KQorCQkJY29udGludWU7CisKKwkJbW9kZV9vcHRpb24gPSBvcHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgZ3hmYl9pbml0KHZvaWQpCiB7CiAjaWZuZGVmIE1PRFVMRQotCWlmIChmYl9nZXRfb3B0aW9ucygiZ3hmYiIsIE5VTEwpKQorCWNoYXIgKm9wdGlvbiA9IE5VTEw7CisKKwlpZiAoZmJfZ2V0X29wdGlvbnMoImd4ZmIiLCAmb3B0aW9uKSkKIAkJcmV0dXJuIC1FTk9ERVY7CisKKwlneGZiX3NldHVwKG9wdGlvbik7CiAjZW5kaWYKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZ3hmYl9kcml2ZXIpOwogfQpAQCAtNDEyLDggKzQ1Myw4IEBACiBtb2R1bGVfaW5pdChneGZiX2luaXQpOwogbW9kdWxlX2V4aXQoZ3hmYl9jbGVhbnVwKTsKIAotbW9kdWxlX3BhcmFtX3N0cmluZyhtb2RlLCBtb2RlX29wdGlvbiwgc2l6ZW9mKG1vZGVfb3B0aW9uKSwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJ2aWRlbyBtb2RlICg8eD54PHk+Wy08YnBwPl1bQDxyZWZyPl0pIik7Cittb2R1bGVfcGFyYW0obW9kZV9vcHRpb24sIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZV9vcHRpb24sICJ2aWRlbyBtb2RlICg8eD54PHk+Wy08YnBwPl1bQDxyZWZyPl0pIik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiRnJhbWVidWZmZXIgZHJpdmVyIGZvciB0aGUgQU1EIEdlb2RlIEdYIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL3ZpZGVvX2d4LmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL3ZpZGVvX2d4LmMKaW5kZXggMmIyYTc4OC4uN2YzZjE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS92aWRlb19neC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvdmlkZW9fZ3guYwpAQCAtMTc1LDEzICsxNzUsODggQEAKIAl9IHdoaWxlICh0aW1lb3V0LS0gJiYgIShkb3RwbGwgJiBNU1JfR0xDUF9ET1RQTExfTE9DSykpOwogfQogCitzdGF0aWMgdm9pZAorZ3hfY29uZmlndXJlX3RmdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZ2VvZGVmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZwOworCisJLyogU2V0IHVwIHRoZSBERiBwYWQgc2VsZWN0IE1TUiAqLworCisJcmRtc3JsKEdYX1ZQX01TUl9QQURfU0VMRUNULCB2YWwpOworCXZhbCAmPSB+R1hfVlBfUEFEX1NFTEVDVF9NQVNLOworCXZhbCB8PSBHWF9WUF9QQURfU0VMRUNUX1RGVDsKKwl3cm1zcmwoR1hfVlBfTVNSX1BBRF9TRUxFQ1QsIHZhbCk7CisKKwkvKiBUdXJuIG9mZiB0aGUgcGFuZWwgKi8KKworCWZwID0gcmVhZGwocGFyLT52aWRfcmVncyArIEdYX0ZQX1BNKTsKKwlmcCAmPSB+R1hfRlBfUE1fUDsKKwl3cml0ZWwoZnAsIHBhci0+dmlkX3JlZ3MgKyBHWF9GUF9QTSk7CisKKwkvKiBTZXQgdGltaW5nIDEgKi8KKworCWZwID0gcmVhZGwocGFyLT52aWRfcmVncyArIEdYX0ZQX1BUMSk7CisJZnAgJj0gR1hfRlBfUFQxX1ZTSVpFX01BU0s7CisJZnAgfD0gaW5mby0+dmFyLnlyZXMgPDwgR1hfRlBfUFQxX1ZTSVpFX1NISUZUOworCXdyaXRlbChmcCwgcGFyLT52aWRfcmVncyArIEdYX0ZQX1BUMSk7CisKKwkvKiBUaW1pbmcgMiAqLworCS8qIFNldCBiaXRzIHRoYXQgYXJlIGFsd2F5cyBvbiBmb3IgVEZUICovCisKKwlmcCA9IDB4MEYxMDAwMDA7CisKKwkvKiBBZGQgc3luYyBwb2xhcml0eSAqLworCisJaWYgKCEoaW5mby0+dmFyLnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpKQorCQlmcCB8PSBHWF9GUF9QVDJfVlNQOworCisJaWYgKCEoaW5mby0+dmFyLnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkpCisJCWZwIHw9IEdYX0ZQX1BUMl9IU1A7CisKKwl3cml0ZWwoZnAsIHBhci0+dmlkX3JlZ3MgKyBHWF9GUF9QVDIpOworCisJLyogIFNldCB0aGUgZGl0aGVyIGNvbnRyb2wgKi8KKwl3cml0ZWwoMHg3MCwgcGFyLT52aWRfcmVncyArIEdYX0ZQX0RGQyk7CisKKwkvKiBFbmFibGUgdGhlIEZQIGRhdGEgYW5kIHBvd2VyIChpbiBjYXNlIHRoZSBCSU9TIGRpZG4ndCkgKi8KKworCWZwID0gcmVhZGwocGFyLT52aWRfcmVncyArIEdYX0RDRkcpOworCWZwIHw9IEdYX0RDRkdfRlBfUFdSX0VOIHwgR1hfRENGR19GUF9EQVRBX0VOOworCXdyaXRlbChmcCwgcGFyLT52aWRfcmVncyArIEdYX0RDRkcpOworCisJLyogVW5ibGFuayB0aGUgcGFuZWwgKi8KKworCWZwID0gcmVhZGwocGFyLT52aWRfcmVncyArIEdYX0ZQX1BNKTsKKwlmcCB8PSBHWF9GUF9QTV9QOworCXdyaXRlbChmcCwgcGFyLT52aWRfcmVncyArIEdYX0ZQX1BNKTsKK30KKwogc3RhdGljIHZvaWQgZ3hfY29uZmlndXJlX2Rpc3BsYXkoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGdlb2RlZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7Ci0JdTMyIGRjZmcsIGZwX3BtOworCXUzMiBkY2ZnLCBtaXNjOwogCisJLyogU2V0IHVwIHRoZSBNSVNDIHJlZ2lzdGVyICovCisKKwltaXNjID0gcmVhZGwocGFyLT52aWRfcmVncyArIEdYX01JU0MpOworCisJLyogUG93ZXIgdXAgdGhlIERBQyAqLworCW1pc2MgJj0gfihHWF9NSVNDX0FfUFdSRE4gfCBHWF9NSVNDX0RBQ19QV1JETik7CisKKwkvKiBEaXNhYmxlIGdhbW1hIGNvcnJlY3Rpb24gKi8KKwltaXNjIHw9IEdYX01JU0NfR0FNX0VOOworCisJd3JpdGVsKG1pc2MsIHBhci0+dmlkX3JlZ3MgKyBHWF9NSVNDKTsKKworCS8qIFdyaXRlIHRoZSBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gKi8KIAlkY2ZnID0gcmVhZGwocGFyLT52aWRfcmVncyArIEdYX0RDRkcpOwogCisJLyogRGlzYWJsZSBoc3luYyBhbmQgdnN5bmMgKi8KKwlkY2ZnICY9IH4oR1hfRENGR19WU1lOQ19FTiB8IEdYX0RDRkdfSFNZTkNfRU4pOworCXdyaXRlbChkY2ZnLCBwYXItPnZpZF9yZWdzICsgR1hfRENGRyk7CisKIAkvKiBDbGVhciBiaXRzIGZyb20gZXhpc3RpbmcgbW9kZS4gKi8KIAlkY2ZnICY9IH4oR1hfRENGR19DUlRfU1lOQ19TS1dfTUFTSwogCQkgIHwgR1hfRENGR19DUlRfSFNZTkNfUE9MICAgfCBHWF9EQ0ZHX0NSVF9WU1lOQ19QT0wKQEAgLTE5OSwxMiArMjc0LDE5IEBACiAJaWYgKGluZm8tPnZhci5zeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKQogCQlkY2ZnIHw9IEdYX0RDRkdfQ1JUX1ZTWU5DX1BPTDsKIAorCS8qIEVuYWJsZSB0aGUgZGlzcGxheSBsb2dpYyAqLworCS8qIFNldCB1cCB0aGUgREFDUyB0byBibGFuayBub3JtYWxseSAqLworCisJZGNmZyB8PSBHWF9EQ0ZHX0NSVF9FTiB8IEdYX0RDRkdfREFDX0JMX0VOOworCisJLyogRW5hYmxlIHRoZSBleHRlcm5hbCBEQUMgVlJFRj8gKi8KKwogCXdyaXRlbChkY2ZnLCBwYXItPnZpZF9yZWdzICsgR1hfRENGRyk7CiAKLQkvKiBQb3dlciBvbiBmbGF0IHBhbmVsLiAqLwotCWZwX3BtID0gcmVhZGwocGFyLT52aWRfcmVncyArIEdYX0ZQX1BNKTsKLQlmcF9wbSB8PSBHWF9GUF9QTV9QOwotCXdyaXRlbChmcF9wbSwgcGFyLT52aWRfcmVncyArIEdYX0ZQX1BNKTsKKwkvKiBTZXQgdXAgdGhlIGZsYXQgcGFuZWwgKGlmIGl0IGlzIGVuYWJsZWQpICovCisKKwlpZiAocGFyLT5lbmFibGVfY3J0ID09IDApCisJCWd4X2NvbmZpZ3VyZV90ZnQoaW5mbyk7CiB9CiAKIHN0YXRpYyBpbnQgZ3hfYmxhbmtfZGlzcGxheShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGJsYW5rX21vZGUpCkBAIC0yNDUsMTIgKzMyNywxNSBAQAogCXdyaXRlbChkY2ZnLCBwYXItPnZpZF9yZWdzICsgR1hfRENGRyk7CiAKIAkvKiBQb3dlciBvbi9vZmYgZmxhdCBwYW5lbC4gKi8KLQlmcF9wbSA9IHJlYWRsKHBhci0+dmlkX3JlZ3MgKyBHWF9GUF9QTSk7Ci0JaWYgKGJsYW5rX21vZGUgPT0gRkJfQkxBTktfUE9XRVJET1dOKQotCQlmcF9wbSAmPSB+R1hfRlBfUE1fUDsKLQllbHNlCi0JCWZwX3BtIHw9IEdYX0ZQX1BNX1A7Ci0Jd3JpdGVsKGZwX3BtLCBwYXItPnZpZF9yZWdzICsgR1hfRlBfUE0pOworCisJaWYgKHBhci0+ZW5hYmxlX2NydCA9PSAwKSB7CisJCWZwX3BtID0gcmVhZGwocGFyLT52aWRfcmVncyArIEdYX0ZQX1BNKTsKKwkJaWYgKGJsYW5rX21vZGUgPT0gRkJfQkxBTktfUE9XRVJET1dOKQorCQkJZnBfcG0gJj0gfkdYX0ZQX1BNX1A7CisJCWVsc2UKKwkJCWZwX3BtIHw9IEdYX0ZQX1BNX1A7CisJCXdyaXRlbChmcF9wbSwgcGFyLT52aWRfcmVncyArIEdYX0ZQX1BNKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvdmlkZW9fZ3guaCBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvdmlkZW9fZ3guaAppbmRleCAyZDkyMTFmLi5jZTI4ZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2dlb2RlL3ZpZGVvX2d4LmgKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS92aWRlb19neC5oCkBAIC0xMyw2ICsxMywxMSBAQAogCiBleHRlcm4gc3RydWN0IGdlb2RlX3ZpZF9vcHMgZ3hfdmlkX29wczsKIAorLyogR1ggRmxhdHBhbmVsIGNvbnRyb2wgTVNSICovCisjZGVmaW5lIEdYX1ZQX01TUl9QQURfU0VMRUNUICAgICAgICAgICAweEMwMDAyMDExCisjZGVmaW5lIEdYX1ZQX1BBRF9TRUxFQ1RfTUFTSyAgICAgICAgICAweDNGRkZGRkZGCisjZGVmaW5lIEdYX1ZQX1BBRF9TRUxFQ1RfVEZUICAgICAgICAgICAweDFGRkZGRkZGCisKIC8qIEdlb2RlIEdYIHZpZGVvIHByb2Nlc3NvciByZWdpc3RlcnMgKi8KIAogI2RlZmluZSBHWF9EQ0ZHCQkweDAwMDgKQEAgLTIwLDYgKzI1LDggQEAKICMgIGRlZmluZSBHWF9EQ0ZHX0hTWU5DX0VOCQkweDAwMDAwMDAyCiAjICBkZWZpbmUgR1hfRENGR19WU1lOQ19FTgkJMHgwMDAwMDAwNAogIyAgZGVmaW5lIEdYX0RDRkdfREFDX0JMX0VOCQkweDAwMDAwMDA4CisjICBkZWZpbmUgR1hfRENGR19GUF9QV1JfRU4JCTB4MDAwMDAwNDAKKyMgIGRlZmluZSBHWF9EQ0ZHX0ZQX0RBVEFfRU4JCTB4MDAwMDAwODAKICMgIGRlZmluZSBHWF9EQ0ZHX0NSVF9IU1lOQ19QT0wJCTB4MDAwMDAxMDAKICMgIGRlZmluZSBHWF9EQ0ZHX0NSVF9WU1lOQ19QT0wJCTB4MDAwMDAyMDAKICMgIGRlZmluZSBHWF9EQ0ZHX0NSVF9TWU5DX1NLV19NQVNLCTB4MDAwMUMwMDAKQEAgLTI4LDEwICszNSwyOCBAQAogIyAgZGVmaW5lIEdYX0RDRkdfR1ZfR0FNCQkweDAwMjAwMDAwCiAjICBkZWZpbmUgR1hfRENGR19EQUNfVlJFRgkJMHgwNDAwMDAwMAogCisvKiBHZW9kZSBHWCBNSVNDIHZpZGVvIGNvbmZpZ3VyYXRpb24gKi8KKworI2RlZmluZSBHWF9NSVNDIDB4NTAKKyNkZWZpbmUgR1hfTUlTQ19HQU1fRU4gICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR1hfTUlTQ19EQUNfUFdSRE4gIDB4MDAwMDA0MDAKKyNkZWZpbmUgR1hfTUlTQ19BX1BXUkROICAgIDB4MDAwMDA4MDAKKwogLyogR2VvZGUgR1ggZmxhdCBwYW5lbCBkaXNwbGF5IGNvbnRyb2wgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgR1hfRlBfUFQxIDB4MDQwMAorI2RlZmluZSBHWF9GUF9QVDFfVlNJWkVfTUFTSyAweDdGRjAwMDAKKyNkZWZpbmUgR1hfRlBfUFQxX1ZTSVpFX1NISUZUIDE2CisKKyNkZWZpbmUgR1hfRlBfUFQyIDB4NDA4CisjZGVmaW5lIEdYX0ZQX1BUMl9WU1AgKDEgPDwgMjMpCisjZGVmaW5lIEdYX0ZQX1BUMl9IU1AgKDEgPDwgMjIpCisKICNkZWZpbmUgR1hfRlBfUE0gMHg0MTAKICMgIGRlZmluZSBHWF9GUF9QTV9QIDB4MDEwMDAwMDAKIAorI2RlZmluZSBHWF9GUF9ERkMgMHg0MTgKKwogLyogR2VvZGUgR1ggY2xvY2sgY29udHJvbCBNU1JzICovCiAKICNkZWZpbmUgTVNSX0dMQ1BfU1lTX1JTVFBMTAkweDRjMDAwMDE0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYyBiL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGY2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2d4dDQ1MDAuYwpAQCAtMCwwICsxLDc0MSBAQAorLyoKKyAqIEZyYW1lIGJ1ZmZlciBkZXZpY2UgZm9yIElCTSBHWFQ0NTAwUCBkaXNwbGF5IGFkYXB0b3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLiA8cGF1bHVzQHNhbWJhLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fR1hUNDUwMFAJMHgyMWMKKworLyogR1hUNDUwMFAgcmVnaXN0ZXJzICovCisKKy8qIFJlZ2lzdGVycyBpbiBQQ0kgY29uZmlnIHNwYWNlICovCisjZGVmaW5lIENGR19FTkRJQU4wCQkweDQwCisKKy8qIE1pc2MgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNUQVRVUwkJCTB4MTAwMAorI2RlZmluZSBDVFJMX1JFRzAJCTB4MTAwNAorI2RlZmluZSAgIENSMF9IQUxUX0RNQQkJCTB4NAorI2RlZmluZSAgIENSMF9SQVNURVJfUkVTRVQJCTB4OAorI2RlZmluZSAgIENSMF9HRU9NX1JFU0VUCQkweDEwCisjZGVmaW5lICAgQ1IwX01FTV9DVFJMRVJfUkVTRVQJCTB4MjAKKworLyogRnJhbWVidWZmZXIgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRkJfQUJfQ1RSTAkJMHgxMTAwCisjZGVmaW5lIEZCX0NEX0NUUkwJCTB4MTEwNAorI2RlZmluZSBGQl9XSURfQ1RSTAkJMHgxMTA4CisjZGVmaW5lIEZCX1pfQ1RSTAkJMHgxMTBjCisjZGVmaW5lIEZCX1ZHQV9DVFJMCQkweDExMTAKKyNkZWZpbmUgUkVGUkVTSF9BQl9DVFJMCQkweDExMTQKKyNkZWZpbmUgUkVGUkVTSF9DRF9DVFJMCQkweDExMTgKKyNkZWZpbmUgRkJfT1ZMX0NUUkwJCTB4MTExYworI2RlZmluZSAgIEZCX0NUUkxfVFlQRQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgICBGQl9DVFJMX1dJRFRIX01BU0sJCTB4MDA3ZjAwMDAKKyNkZWZpbmUgICBGQl9DVFJMX1dJRFRIX1NISUZUCQkxNgorI2RlZmluZSAgIEZCX0NUUkxfU1RBUlRfU0VHX01BU0sJMHgwMDAwM2ZmZgorCisjZGVmaW5lIFJFRlJFU0hfU1RBUlQJCTB4MTA5OAorI2RlZmluZSBSRUZSRVNIX1NJWkUJCTB4MTA5YworCisvKiAiRGlyZWN0IiBmcmFtZWJ1ZmZlciBhY2Nlc3MgcmVnaXN0ZXJzICovCisjZGVmaW5lIERGQV9GQl9BCQkweDExZTAKKyNkZWZpbmUgREZBX0ZCX0IJCTB4MTFlNAorI2RlZmluZSBERkFfRkJfQwkJMHgxMWU4CisjZGVmaW5lIERGQV9GQl9ECQkweDExZWMKKyNkZWZpbmUgICBERkFfRkJfRU5BQkxFCQkJMHg4MDAwMDAwMAorI2RlZmluZSAgIERGQV9GQl9CQVNFX01BU0sJCTB4MDNmMDAwMDAKKyNkZWZpbmUgICBERkFfRkJfU1RSSURFXzFrCQkweDAwMDAwMDAwCisjZGVmaW5lICAgREZBX0ZCX1NUUklERV8yawkJMHgwMDAwMDAxMAorI2RlZmluZSAgIERGQV9GQl9TVFJJREVfNGsJCTB4MDAwMDAwMjAKKyNkZWZpbmUgICBERkFfUElYXzhCSVQJCQkweDAwMDAwMDAwCisjZGVmaW5lICAgREZBX1BJWF8xNkJJVF81NjUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgICBERkFfUElYXzE2QklUXzE1NTUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgICBERkFfUElYXzI0QklUCQkJMHgwMDAwMDAwNAorI2RlZmluZSAgIERGQV9QSVhfMzJCSVQJCQkweDAwMDAwMDA1CisKKy8qIG1hcHMgREZBX1BJWF8qIHRvIHBpeGVsIHNpemUgaW4gYnl0ZXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBpeHNpemVbXSA9IHsKKwkxLCAyLCAyLCAyLCA0LCA0Cit9OworCisvKiBEaXNwbGF5IHRpbWluZyBnZW5lcmF0b3IgcmVnaXN0ZXJzICovCisjZGVmaW5lIERUR19DT05UUk9MCQkweDE5MDAKKyNkZWZpbmUgICBEVEdfQ1RMX1NDUkVFTl9SRUZSRVNICTIKKyNkZWZpbmUgICBEVEdfQ1RMX0VOQUJMRQkJMQorI2RlZmluZSBEVEdfSE9SSVpfRVhURU5UCTB4MTkwNAorI2RlZmluZSBEVEdfSE9SSVpfRElTUExBWQkweDE5MDgKKyNkZWZpbmUgRFRHX0hTWU5DX1NUQVJUCQkweDE5MGMKKyNkZWZpbmUgRFRHX0hTWU5DX0VORAkJMHgxOTEwCisjZGVmaW5lIERUR19IU1lOQ19FTkRfQ09NUAkweDE5MTQKKyNkZWZpbmUgRFRHX1ZFUlRfRVhURU5UCQkweDE5MTgKKyNkZWZpbmUgRFRHX1ZFUlRfRElTUExBWQkweDE5MWMKKyNkZWZpbmUgRFRHX1ZTWU5DX1NUQVJUCQkweDE5MjAKKyNkZWZpbmUgRFRHX1ZTWU5DX0VORAkJMHgxOTI0CisjZGVmaW5lIERUR19WRVJUX1NIT1JUCQkweDE5MjgKKworLyogUExML1JBTURBQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRElTUF9DVEwJCTB4NDAyYworI2RlZmluZSAgIERJU1BfQ1RMX09GRgkJCTIKKyNkZWZpbmUgU1lOQ19DVEwJCTB4NDAzNAorI2RlZmluZSAgIFNZTkNfQ1RMX1NZTkNfT05fUkdCCQkxCisjZGVmaW5lICAgU1lOQ19DVExfU1lOQ19PRkYJCTIKKyNkZWZpbmUgICBTWU5DX0NUTF9IU1lOQ19JTlYJCTgKKyNkZWZpbmUgICBTWU5DX0NUTF9WU1lOQ19JTlYJCTB4MTAKKyNkZWZpbmUgICBTWU5DX0NUTF9IU1lOQ19PRkYJCTB4MjAKKyNkZWZpbmUgICBTWU5DX0NUTF9WU1lOQ19PRkYJCTB4NDAKKworI2RlZmluZSBQTExfTQkJCTB4NDA0MAorI2RlZmluZSBQTExfTgkJCTB4NDA0NAorI2RlZmluZSBQTExfUE9TVERJVgkJMHg0MDQ4CisKKy8qIEhhcmR3YXJlIGN1cnNvciAqLworI2RlZmluZSBDVVJTT1JfWAkJMHg0MDc4CisjZGVmaW5lIENVUlNPUl9ZCQkweDQwN2MKKyNkZWZpbmUgQ1VSU09SX0hPVFNQT1QJCTB4NDA4MAorI2RlZmluZSBDVVJTT1JfTU9ERQkJMHg0MDg0CisjZGVmaW5lICAgQ1VSU09SX01PREVfT0ZGCQkwCisjZGVmaW5lICAgQ1VSU09SX01PREVfNEJQUAkJMQorI2RlZmluZSBDVVJTT1JfUElYTUFQCQkweDUwMDAKKyNkZWZpbmUgQ1VSU09SX0NNQVAJCTB4NzQwMAorCisvKiBXaW5kb3cgYXR0cmlidXRlIHRhYmxlICovCisjZGVmaW5lIFdBVF9GTVQJCQkweDQxMDAKKyNkZWZpbmUgICBXQVRfRk1UXzI0QklUCQkJMAorI2RlZmluZSAgIFdBVF9GTVRfMTZCSVRfNTY1CQkxCisjZGVmaW5lICAgV0FUX0ZNVF8xNkJJVF8xNTU1CQkyCisjZGVmaW5lICAgV0FUX0ZNVF8zMkJJVAkJCTMJLyogMCB2cy4gMyBpcyBhIGd1ZXNzICovCisjZGVmaW5lICAgV0FUX0ZNVF84QklUXzMzMgkJOQorI2RlZmluZSAgIFdBVF9GTVRfOEJJVAkJCTB4YQorI2RlZmluZSAgIFdBVF9GTVRfTk9fQ01BUAkJNAkvKiBPUmQgaW4gdG8gb3RoZXIgdmFsdWVzICovCisjZGVmaW5lIFdBVF9DTUFQX09GRlNFVAkJMHg0MTA0CQkvKiA0LWJpdCB2YWx1ZSBnZXRzIDw8IDYgKi8KKyNkZWZpbmUgV0FUX0NUUkwJCTB4NDEwOAorI2RlZmluZSAgIFdBVF9DVFJMX1NFTF9CCQkxCS8qIHNlbGVjdCBCIGJ1ZmZlciBpZiAxICovCisjZGVmaW5lICAgV0FUX0NUUkxfTk9fSU5DCQkyCisjZGVmaW5lIFdBVF9HQU1NQV9DVFJMCQkweDQxMGMKKyNkZWZpbmUgICBXQVRfR0FNTUFfRElTQUJMRQkJMQkvKiBkaXNhYmxlcyBnYW1tYSBjbWFwICovCisjZGVmaW5lIFdBVF9PVkxfQ1RSTAkJMHg0MzBjCQkvKiBjb250cm9scyBvdmVybGF5ICovCisKKy8qIEluZGV4ZWQgYnkgREZBX1BJWF8qIHZhbHVlcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgd2F0Zm10W10gPSB7CisJV0FUX0ZNVF84QklULCBXQVRfRk1UXzE2QklUXzU2NSwgV0FUX0ZNVF8xNkJJVF8xNTU1LCAwLAorCVdBVF9GTVRfMjRCSVQsIFdBVF9GTVRfMzJCSVQKK307CisKKy8qIENvbG9ybWFwIGFycmF5OyAxayBlbnRyaWVzIG9mIDQgYnl0ZXMgZWFjaCAqLworI2RlZmluZSBDTUFQCQkJMHg2MDAwCisKKyNkZWZpbmUgcmVhZHJlZyhwYXIsIHJlZykJcmVhZGwoKHBhciktPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgd3JpdGVyZWcocGFyLCByZWcsIHZhbCkJd3JpdGVsKCh2YWwpLCAocGFyKS0+cmVncyArIChyZWcpKQorCitzdHJ1Y3QgZ3h0NDUwMF9wYXIgeworCXZvaWQgX19pb21lbSAqcmVnczsKKworCWludCBwaXhmbXQ7CQkvKiBwaXhlbCBmb3JtYXQsIHNlZSBERkFfUElYXyogdmFsdWVzICovCisKKwkvKiBQTEwgcGFyYW1ldGVycyAqLworCWludCBwbGxfbTsJCS8qIHJlZiBjbG9jayBkaXZpc29yICovCisJaW50IHBsbF9uOwkJLyogVkNPIGRpdmlzb3IgKi8KKwlpbnQgcGxsX3BkMTsJCS8qIGZpcnN0IHBvc3QtZGl2aXNvciAqLworCWludCBwbGxfcGQyOwkJLyogc2Vjb25kIHBvc3QtZGl2aXNvciAqLworCisJdTMyIHBzZXVkb19wYWxldHRlWzE2XTsJLyogdXNlZCBpbiBjb2xvciBibGl0cyAqLworfTsKKworLyogbW9kZSByZXF1ZXN0ZWQgYnkgdXNlciAqLworc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uOworCisvKiBkZWZhdWx0IG1vZGU6IDEyODB4MTAyNCBAIDYwIEh6LCA4IGJwcCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgZGVmYXVsdG1vZGUgX19kZXZpbml0ZGF0YSA9IHsKKwkucmVmcmVzaCA9IDYwLAorCS54cmVzID0gMTI4MCwKKwkueXJlcyA9IDEwMjQsCisJLnBpeGNsb2NrID0gOTI5NSwKKwkubGVmdF9tYXJnaW4gPSAyNDgsCisJLnJpZ2h0X21hcmdpbiA9IDQ4LAorCS51cHBlcl9tYXJnaW4gPSAzOCwKKwkubG93ZXJfbWFyZ2luID0gMSwKKwkuaHN5bmNfbGVuID0gMTEyLAorCS52c3luY19sZW4gPSAzLAorCS52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKK307CisKKy8qCisgKiBUaGUgcmVmY2xrIGFuZCBWQ08gZGl2aWRlcnMgYXBwZWFyIHRvIHVzZSBhIGxpbmVhciBmZWVkYmFjayBzaGlmdAorICogcmVnaXN0ZXIsIHdoaWNoIGdldHMgcmVsb2FkZWQgd2hlbiBpdCByZWFjaGVzIGEgdGVybWluYWwgdmFsdWUsIGF0CisgKiB3aGljaCBwb2ludCB0aGUgZGl2aWRlciBvdXRwdXQgaXMgdG9nZ2xlZC4gIFRodXMgb25lIGNhbiBvYnRhaW4KKyAqIHdoYXRldmVyIGRpdmlzb3IgaXMgcmVxdWlyZWQgYnkgcHV0dGluZyB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW50bworICogdGhlIHJlbG9hZCByZWdpc3Rlci4gIEZvciBhIGRpdmlzb3Igb2YgTiwgb25lIHB1dHMgdGhlIHZhbHVlIGZyb20KKyAqIHRoZSBMRlNSIHNlcXVlbmNlIHRoYXQgY29tZXMgTi0xIHBsYWNlcyBiZWZvcmUgdGhlIHRlcm1pbmFsIHZhbHVlCisgKiBpbnRvIHRoZSByZWxvYWQgcmVnaXN0ZXIuCisgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWRpdnRhYltdID0geworLyogMSAqLwkJICAgICAgMHgzZiwgMHgwMCwgMHgyMCwgMHgxMCwgMHgyOCwgMHgxNCwgMHgyYSwgMHgxNSwgMHgwYSwKKy8qIDEwICovCTB4MjUsIDB4MzIsIDB4MTksIDB4MGMsIDB4MjYsIDB4MTMsIDB4MDksIDB4MDQsIDB4MjIsIDB4MTEsCisvKiAyMCAqLwkweDA4LCAweDI0LCAweDEyLCAweDI5LCAweDM0LCAweDFhLCAweDJkLCAweDM2LCAweDFiLCAweDBkLAorLyogMzAgKi8JMHgwNiwgMHgyMywgMHgzMSwgMHgzOCwgMHgxYywgMHgyZSwgMHgxNywgMHgwYiwgMHgwNSwgMHgwMiwKKy8qIDQwICovCTB4MjEsIDB4MzAsIDB4MTgsIDB4MmMsIDB4MTYsIDB4MmIsIDB4MzUsIDB4M2EsIDB4MWQsIDB4MGUsCisvKiA1MCAqLwkweDI3LCAweDMzLCAweDM5LCAweDNjLCAweDFlLCAweDJmLCAweDM3LCAweDNiLCAweDNkLCAweDNlLAorLyogNjAgKi8JMHgxZiwgMHgwZiwgMHgwNywgMHgwMywgMHgwMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5kaXZ0YWJbXSA9IHsKKy8qIDIgKi8JCSAgICAgICAgICAgIDB4MDAsIDB4ODAsIDB4YzAsIDB4ZTAsIDB4ZjAsIDB4NzgsIDB4YmMsIDB4NWUsCisvKiAxMCAqLwkweDJmLCAweDE3LCAweDBiLCAweDg1LCAweGMyLCAweGUxLCAweDcwLCAweDM4LCAweDljLCAweDRlLAorLyogMjAgKi8JMHhhNywgMHhkMywgMHhlOSwgMHhmNCwgMHhmYSwgMHhmZCwgMHhmZSwgMHg3ZiwgMHhiZiwgMHhkZiwKKy8qIDMwICovCTB4ZWYsIDB4NzcsIDB4M2IsIDB4MWQsIDB4OGUsIDB4YzcsIDB4ZTMsIDB4NzEsIDB4YjgsIDB4ZGMsCisvKiA0MCAqLwkweDZlLCAweGI3LCAweDViLCAweDJkLCAweDE2LCAweDhiLCAweGM1LCAweGUyLCAweGYxLCAweGY4LAorLyogNTAgKi8JMHhmYywgMHg3ZSwgMHgzZiwgMHg5ZiwgMHhjZiwgMHg2NywgMHhiMywgMHhkOSwgMHg2YywgMHhiNiwKKy8qIDYwICovCTB4ZGIsIDB4NmQsIDB4MzYsIDB4OWIsIDB4NGQsIDB4MjYsIDB4MTMsIDB4ODksIDB4YzQsIDB4NjIsCisvKiA3MCAqLwkweGIxLCAweGQ4LCAweGVjLCAweGY2LCAweGZiLCAweDdkLCAweGJlLCAweDVmLCAweGFmLCAweDU3LAorLyogODAgKi8JMHgyYiwgMHg5NSwgMHg0YSwgMHgyNSwgMHg5MiwgMHg0OSwgMHhhNCwgMHg1MiwgMHgyOSwgMHg5NCwKKy8qIDkwICovCTB4Y2EsIDB4NjUsIDB4YjIsIDB4NTksIDB4MmMsIDB4OTYsIDB4Y2IsIDB4ZTUsIDB4ZjIsIDB4NzksCisvKiAxMDAgKi8JMHgzYywgMHgxZSwgMHgwZiwgMHgwNywgMHg4MywgMHg0MSwgMHgyMCwgMHg5MCwgMHg0OCwgMHgyNCwKKy8qIDExMCAqLwkweDEyLCAweDA5LCAweDg0LCAweDQyLCAweGExLCAweDUwLCAweDI4LCAweDE0LCAweDhhLCAweDQ1LAorLyogMTIwICovCTB4YTIsIDB4ZDEsIDB4ZTgsIDB4NzQsIDB4YmEsIDB4ZGQsIDB4ZWUsIDB4ZjcsIDB4N2IsIDB4M2QsCisvKiAxMzAgKi8JMHg5ZSwgMHg0ZiwgMHgyNywgMHg5MywgMHhjOSwgMHhlNCwgMHg3MiwgMHgzOSwgMHgxYywgMHgwZSwKKy8qIDE0MCAqLwkweDg3LCAweGMzLCAweDYxLCAweDMwLCAweDE4LCAweDhjLCAweGM2LCAweDYzLCAweDMxLCAweDk4LAorLyogMTUwICovCTB4Y2MsIDB4ZTYsIDB4NzMsIDB4YjksIDB4NWMsIDB4MmUsIDB4OTcsIDB4NGIsIDB4YTUsIDB4ZDIsCisvKiAxNjAgKi8JMHg2OSwgMHhiNCwgMHhkYSwgMHhlZCwgMHg3NiwgMHhiYiwgMHg1ZCwgMHhhZSwgMHhkNywgMHg2YiwKKy8qIDE3MCAqLwkweGI1LCAweDVhLCAweGFkLCAweDU2LCAweGFiLCAweGQ1LCAweDZhLCAweDM1LCAweDFhLCAweDhkLAorLyogMTgwICovCTB4NDYsIDB4MjMsIDB4MTEsIDB4ODgsIDB4NDQsIDB4MjIsIDB4OTEsIDB4YzgsIDB4NjQsIDB4MzIsCisvKiAxOTAgKi8JMHgxOSwgMHgwYywgMHg4NiwgMHg0MywgMHgyMSwgMHgxMCwgMHgwOCwgMHgwNCwgMHgwMiwgMHg4MSwKKy8qIDIwMCAqLwkweDQwLCAweGEwLCAweGQwLCAweDY4LCAweDM0LCAweDlhLCAweGNkLCAweDY2LCAweDMzLCAweDk5LAorLyogMjEwICovCTB4NGMsIDB4YTYsIDB4NTMsIDB4YTksIDB4ZDQsIDB4ZWEsIDB4NzUsIDB4M2EsIDB4OWQsIDB4Y2UsCisvKiAyMjAgKi8JMHhlNywgMHhmMywgMHhmOSwgMHg3YywgMHgzZSwgMHgxZiwgMHg4ZiwgMHg0NywgMHhhMywgMHg1MSwKKy8qIDIzMCAqLwkweGE4LCAweDU0LCAweGFhLCAweDU1LCAweDJhLCAweDE1LCAweDBhLCAweDA1LCAweDgyLCAweGMxLAorLyogMjQwICovCTB4NjAsIDB4YjAsIDB4NTgsIDB4YWMsIDB4ZDYsIDB4ZWIsIDB4ZjUsIDB4N2EsIDB4YmQsIDB4ZGUsCisvKiAyNTAgKi8JMHg2ZiwgMHgzNywgMHgxYiwgMHgwZCwgMHgwNiwgMHgwMywgMHgwMSwKK307CisKKyNkZWZpbmUgUkVGX1BFUklPRF9QUwk5MjU5CS8qIHBlcmlvZCBvZiByZWZlcmVuY2UgY2xvY2sgaW4gcHMgKi8KKworc3RhdGljIGludCBjYWxjX3BsbChpbnQgcGVyaW9kX3BzLCBzdHJ1Y3QgZ3h0NDUwMF9wYXIgKnBhcikKK3sKKwlpbnQgbSwgbiwgcGRpdjEsIHBkaXYyLCBwb3N0ZGl2OworCWludCBwbGxfcGVyaW9kLCBiZXN0X2Vycm9yLCB0OworCisJLyogb25seSBkZWFsIHdpdGggcmFuZ2UgMU1IeiAtIDQwME1IeiAqLworCWlmIChwZXJpb2RfcHMgPCAyNTAwIHx8IHBlcmlvZF9wcyA+IDEwMDAwMDApCisJCXJldHVybiAtMTsKKworCWJlc3RfZXJyb3IgPSAxMDAwMDAwOworCWZvciAocGRpdjEgPSAxOyBwZGl2MSA8PSA4OyArK3BkaXYxKSB7CisJCWZvciAocGRpdjIgPSAxOyBwZGl2MiA8PSBwZGl2MTsgKytwZGl2MikgeworCQkJcG9zdGRpdiA9IHBkaXYxICogcGRpdjI7CisJCQlwbGxfcGVyaW9kID0gKHBlcmlvZF9wcyArIHBvc3RkaXYgLSAxKSAvIHBvc3RkaXY7CisJCQkvKiBrZWVwIHBsbCBpbiByYW5nZSA1MDAuLjEyNTAgTUh6ICovCisJCQlpZiAocGxsX3BlcmlvZCA8IDgwMCB8fCBwbGxfcGVyaW9kID4gMjAwMCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAobSA9IDM7IG0gPD0gNDA7ICsrbSkgeworCQkJCW4gPSBSRUZfUEVSSU9EX1BTICogbSAqIHBvc3RkaXYgLyBwZXJpb2RfcHM7CisJCQkJaWYgKG4gPCA1IHx8IG4gPiAyNTYpCisJCQkJCWNvbnRpbnVlOworCQkJCXQgPSBSRUZfUEVSSU9EX1BTICogbSAqIHBvc3RkaXYgLyBuOworCQkJCXQgLT0gcGVyaW9kX3BzOworCQkJCWlmICh0ID49IDAgJiYgdCA8IGJlc3RfZXJyb3IpIHsKKwkJCQkJcGFyLT5wbGxfbSA9IG07CisJCQkJCXBhci0+cGxsX24gPSBuOworCQkJCQlwYXItPnBsbF9wZDEgPSBwZGl2MTsKKwkJCQkJcGFyLT5wbGxfcGQyID0gcGRpdjI7CisJCQkJCWJlc3RfZXJyb3IgPSB0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoYmVzdF9lcnJvciA9PSAxMDAwMDAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19waXhjbG9jayhzdHJ1Y3QgZ3h0NDUwMF9wYXIgKnBhcikKK3sKKwlyZXR1cm4gUkVGX1BFUklPRF9QUyAqIHBhci0+cGxsX20gKiBwYXItPnBsbF9wZDEgKiBwYXItPnBsbF9wZDIKKwkJLyBwYXItPnBsbF9uOworfQorCitzdGF0aWMgaW50IGd4dDQ1MDBfdmFyX3RvX3BhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgIHN0cnVjdCBneHQ0NTAwX3BhciAqcGFyKQoreworCWlmICh2YXItPnhyZXMgKyB2YXItPnhvZmZzZXQgPiB2YXItPnhyZXNfdmlydHVhbCB8fAorCSAgICB2YXItPnlyZXMgKyB2YXItPnlvZmZzZXQgPiB2YXItPnlyZXNfdmlydHVhbCB8fAorCSAgICB2YXItPnhyZXNfdmlydHVhbCA+IDQwOTYpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgodmFyLT52bW9kZSAmIEZCX1ZNT0RFX01BU0spICE9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNhbGNfcGxsKHZhci0+cGl4Y2xvY2ssIHBhcikgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMzI6CisJCWlmICh2YXItPnRyYW5zcC5sZW5ndGgpCisJCQlwYXItPnBpeGZtdCA9IERGQV9QSVhfMzJCSVQ7CisJCWVsc2UKKwkJCXBhci0+cGl4Zm10ID0gREZBX1BJWF8yNEJJVDsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJcGFyLT5waXhmbXQgPSBERkFfUElYXzI0QklUOworCQlicmVhazsKKwljYXNlIDE2OgorCQlpZiAodmFyLT5ncmVlbi5sZW5ndGggPT0gNSkKKwkJCXBhci0+cGl4Zm10ID0gREZBX1BJWF8xNkJJVF8xNTU1OworCQllbHNlCisJCQlwYXItPnBpeGZtdCA9IERGQV9QSVhfMTZCSVRfNTY1OworCQlicmVhazsKKwljYXNlIDg6CisJCXBhci0+cGl4Zm10ID0gREZBX1BJWF84QklUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl9iaXRmaWVsZCBlaWdodGJpdHMgPSB7MCwgOH07CitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX2JpdGZpZWxkIG5vYml0cyA9IHswLCAwfTsKKworc3RhdGljIHZvaWQgZ3h0NDUwMF91bnBhY2tfcGl4Zm10KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJCSAgaW50IHBpeGZtdCkKK3sKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gcGl4c2l6ZVtwaXhmbXRdICogODsKKwl2YXItPnJlZCA9IGVpZ2h0Yml0czsKKwl2YXItPmdyZWVuID0gZWlnaHRiaXRzOworCXZhci0+Ymx1ZSA9IGVpZ2h0Yml0czsKKwl2YXItPnRyYW5zcCA9IG5vYml0czsKKworCXN3aXRjaCAocGl4Zm10KSB7CisJY2FzZSBERkFfUElYXzE2QklUXzU2NToKKwkJdmFyLT5yZWQubGVuZ3RoID0gNTsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA2OworCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwkJYnJlYWs7CisJY2FzZSBERkFfUElYXzE2QklUXzE1NTU6CisJCXZhci0+cmVkLmxlbmd0aCA9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNTsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7CisJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDE7CisJCWJyZWFrOworCWNhc2UgREZBX1BJWF8zMkJJVDoKKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gODsKKwkJYnJlYWs7CisJfQorCWlmIChwaXhmbXQgIT0gREZBX1BJWF84QklUKSB7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gdmFyLT5yZWQubGVuZ3RoOworCQl2YXItPmJsdWUub2Zmc2V0ID0gdmFyLT5ncmVlbi5vZmZzZXQgKyB2YXItPmdyZWVuLmxlbmd0aDsKKwkJaWYgKHZhci0+dHJhbnNwLmxlbmd0aCkKKwkJCXZhci0+dHJhbnNwLm9mZnNldCA9CisJCQkJdmFyLT5ibHVlLm9mZnNldCArIHZhci0+Ymx1ZS5sZW5ndGg7CisJfQorfQorCitzdGF0aWMgaW50IGd4dDQ1MDBfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZ3h0NDUwMF9wYXIgcGFyOworCWludCBlcnI7CisKKwlwYXIgPSAqKHN0cnVjdCBneHQ0NTAwX3BhciAqKWluZm8tPnBhcjsKKwllcnIgPSBneHQ0NTAwX3Zhcl90b19wYXIodmFyLCAmcGFyKTsKKwlpZiAoIWVycikgeworCQl2YXItPnBpeGNsb2NrID0gY2FsY19waXhjbG9jaygmcGFyKTsKKwkJZ3h0NDUwMF91bnBhY2tfcGl4Zm10KHZhciwgcGFyLnBpeGZtdCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZ3h0NDUwMF9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBneHQ0NTAwX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmluZm8tPnZhcjsKKwlpbnQgZXJyOworCXUzMiBjdHJscmVnOworCXVuc2lnbmVkIGludCBkZmFfY3RsLCBwaXhmbXQsIHN0cmlkZTsKKwl1bnNpZ25lZCBpbnQgd2lkX3RpbGVzLCBpOworCXVuc2lnbmVkIGludCBwcmVmZXRjaF9waXgsIGh0b3Q7CisJc3RydWN0IGd4dDQ1MDBfcGFyIHNhdmVfcGFyOworCisJc2F2ZV9wYXIgPSAqcGFyOworCWVyciA9IGd4dDQ1MDBfdmFyX3RvX3Bhcih2YXIsIHBhcik7CisJaWYgKGVycikgeworCQkqcGFyID0gc2F2ZV9wYXI7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogdHVybiBvZmYgRFRHIGZvciBub3cgKi8KKwljdHJscmVnID0gcmVhZHJlZyhwYXIsIERUR19DT05UUk9MKTsKKwljdHJscmVnICY9IH4oRFRHX0NUTF9FTkFCTEUgfCBEVEdfQ1RMX1NDUkVFTl9SRUZSRVNIKTsKKwl3cml0ZXJlZyhwYXIsIERUR19DT05UUk9MLCBjdHJscmVnKTsKKworCS8qIHNldCBQTEwgcmVnaXN0ZXJzICovCisJd3JpdGVyZWcocGFyLCBQTExfTSwgbWRpdnRhYltwYXItPnBsbF9tIC0gMV0pOworCXdyaXRlcmVnKHBhciwgUExMX04sIG5kaXZ0YWJbcGFyLT5wbGxfbiAtIDJdKTsKKwl3cml0ZXJlZyhwYXIsIFBMTF9QT1NURElWLAorCQkgKCg4IC0gcGFyLT5wbGxfcGQxKSA8PCAzKSB8ICg4IC0gcGFyLT5wbGxfcGQyKSk7CisJbXNsZWVwKDIwKTsKKworCS8qIHR1cm4gb2ZmIGhhcmR3YXJlIGN1cnNvciAqLworCXdyaXRlcmVnKHBhciwgQ1VSU09SX01PREUsIENVUlNPUl9NT0RFX09GRik7CisKKwkvKiByZXNldCByYXN0ZXIgZW5naW5lICovCisJd3JpdGVyZWcocGFyLCBDVFJMX1JFRzAsIENSMF9SQVNURVJfUkVTRVQgfCAoQ1IwX1JBU1RFUl9SRVNFVCA8PCAxNikpOworCXVkZWxheSgxMCk7CisJd3JpdGVyZWcocGFyLCBDVFJMX1JFRzAsIENSMF9SQVNURVJfUkVTRVQgPDwgMTYpOworCisJLyogc2V0IGRpc3BsYXkgdGltaW5nIGdlbmVyYXRvciByZWdpc3RlcnMgKi8KKwlodG90ID0gdmFyLT54cmVzICsgdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+cmlnaHRfbWFyZ2luICsKKwkJdmFyLT5oc3luY19sZW47CisJd3JpdGVyZWcocGFyLCBEVEdfSE9SSVpfRVhURU5ULCBodG90IC0gMSk7CisJd3JpdGVyZWcocGFyLCBEVEdfSE9SSVpfRElTUExBWSwgdmFyLT54cmVzIC0gMSk7CisJd3JpdGVyZWcocGFyLCBEVEdfSFNZTkNfU1RBUlQsIHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luIC0gMSk7CisJd3JpdGVyZWcocGFyLCBEVEdfSFNZTkNfRU5ELAorCQkgdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbiAtIDEpOworCXdyaXRlcmVnKHBhciwgRFRHX0hTWU5DX0VORF9DT01QLAorCQkgdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbiAtIDEpOworCXdyaXRlcmVnKHBhciwgRFRHX1ZFUlRfRVhURU5ULAorCQkgdmFyLT55cmVzICsgdmFyLT51cHBlcl9tYXJnaW4gKyB2YXItPmxvd2VyX21hcmdpbiArCisJCSB2YXItPnZzeW5jX2xlbiAtIDEpOworCXdyaXRlcmVnKHBhciwgRFRHX1ZFUlRfRElTUExBWSwgdmFyLT55cmVzIC0gMSk7CisJd3JpdGVyZWcocGFyLCBEVEdfVlNZTkNfU1RBUlQsIHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luIC0gMSk7CisJd3JpdGVyZWcocGFyLCBEVEdfVlNZTkNfRU5ELAorCQkgdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnZzeW5jX2xlbiAtIDEpOworCXByZWZldGNoX3BpeCA9IDMzMDAwMDAgLyB2YXItPnBpeGNsb2NrOworCWlmIChwcmVmZXRjaF9waXggPj0gaHRvdCkKKwkJcHJlZmV0Y2hfcGl4ID0gaHRvdCAtIDE7CisJd3JpdGVyZWcocGFyLCBEVEdfVkVSVF9TSE9SVCwgaHRvdCAtIHByZWZldGNoX3BpeCAtIDEpOworCWN0cmxyZWcgfD0gRFRHX0NUTF9FTkFCTEUgfCBEVEdfQ1RMX1NDUkVFTl9SRUZSRVNIOworCXdyaXRlcmVnKHBhciwgRFRHX0NPTlRST0wsIGN0cmxyZWcpOworCisJLyogY2FsY3VsYXRlIHN0cmlkZSBpbiBERkEgYXBlcnR1cmUgKi8KKwlpZiAodmFyLT54cmVzX3ZpcnR1YWwgPiAyMDQ4KSB7CisJCXN0cmlkZSA9IDQwOTY7CisJCWRmYV9jdGwgPSBERkFfRkJfU1RSSURFXzRrOworCX0gZWxzZSBpZiAodmFyLT54cmVzX3ZpcnR1YWwgPiAxMDI0KSB7CisJCXN0cmlkZSA9IDIwNDg7CisJCWRmYV9jdGwgPSBERkFfRkJfU1RSSURFXzJrOworCX0gZWxzZSB7CisJCXN0cmlkZSA9IDEwMjQ7CisJCWRmYV9jdGwgPSBERkFfRkJfU1RSSURFXzFrOworCX0KKworCS8qIFNldCB1cCBmcmFtZWJ1ZmZlciBkZWZpbml0aW9uICovCisJd2lkX3RpbGVzID0gKHZhci0+eHJlc192aXJ0dWFsICsgNjMpID4+IDY7CisKKwkvKiBYWFggYWRkIHByb3BlciBGQiBhbGxvY2F0aW9uIGhlcmUgc29tZWRheSAqLworCXdyaXRlcmVnKHBhciwgRkJfQUJfQ1RSTCwgRkJfQ1RSTF9UWVBFIHwgKHdpZF90aWxlcyA8PCAxNikgfCAwKTsKKwl3cml0ZXJlZyhwYXIsIFJFRlJFU0hfQUJfQ1RSTCwgRkJfQ1RSTF9UWVBFIHwgKHdpZF90aWxlcyA8PCAxNikgfCAwKTsKKwl3cml0ZXJlZyhwYXIsIEZCX0NEX0NUUkwsIEZCX0NUUkxfVFlQRSB8ICh3aWRfdGlsZXMgPDwgMTYpIHwgMCk7CisJd3JpdGVyZWcocGFyLCBSRUZSRVNIX0NEX0NUUkwsIEZCX0NUUkxfVFlQRSB8ICh3aWRfdGlsZXMgPDwgMTYpIHwgMCk7CisJd3JpdGVyZWcocGFyLCBSRUZSRVNIX1NUQVJULCAodmFyLT54b2Zmc2V0IDw8IDE2KSB8IHZhci0+eW9mZnNldCk7CisJd3JpdGVyZWcocGFyLCBSRUZSRVNIX1NJWkUsICh2YXItPnhyZXMgPDwgMTYpIHwgdmFyLT55cmVzKTsKKworCS8qIFNldCB1cCBmcmFtZWJ1ZmZlciBhY2Nlc3MgYnkgQ1BVICovCisKKwlwaXhmbXQgPSBwYXItPnBpeGZtdDsKKwlkZmFfY3RsIHw9IERGQV9GQl9FTkFCTEUgfCBwaXhmbXQ7CisJd3JpdGVyZWcocGFyLCBERkFfRkJfQSwgZGZhX2N0bCk7CisKKwkvKgorCSAqIFNldCB1cCB3aW5kb3cgYXR0cmlidXRlIHRhYmxlLgorCSAqIFdlIHNldCBhbGwgV0FUIGVudHJpZXMgdGhlIHNhbWUgc28gaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUKKwkgKiB3aW5kb3cgSUQgKFdJRCkgcGxhbmUgY29udGFpbnMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKKwkJd3JpdGVyZWcocGFyLCBXQVRfRk1UICsgKGkgPDwgNCksIHdhdGZtdFtwaXhmbXRdKTsKKwkJd3JpdGVyZWcocGFyLCBXQVRfQ01BUF9PRkZTRVQgKyAoaSA8PCA0KSwgMCk7CisJCXdyaXRlcmVnKHBhciwgV0FUX0NUUkwgKyAoaSA8PCA0KSwgMCk7CisJCXdyaXRlcmVnKHBhciwgV0FUX0dBTU1BX0NUUkwgKyAoaSA8PCA0KSwgV0FUX0dBTU1BX0RJU0FCTEUpOworCX0KKworCS8qIFNldCBzeW5jIHBvbGFyaXR5IGV0Yy4gKi8KKwljdHJscmVnID0gcmVhZHJlZyhwYXIsIFNZTkNfQ1RMKSAmCisJCX4oU1lOQ19DVExfU1lOQ19PTl9SR0IgfCBTWU5DX0NUTF9IU1lOQ19JTlYgfAorCQkgIFNZTkNfQ1RMX1ZTWU5DX0lOVik7CisJaWYgKHZhci0+c3luYyAmIEZCX1NZTkNfT05fR1JFRU4pCisJCWN0cmxyZWcgfD0gU1lOQ19DVExfU1lOQ19PTl9SR0I7CisJaWYgKCEodmFyLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpKQorCQljdHJscmVnIHw9IFNZTkNfQ1RMX0hTWU5DX0lOVjsKKwlpZiAoISh2YXItPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpKQorCQljdHJscmVnIHw9IFNZTkNfQ1RMX1ZTWU5DX0lOVjsKKwl3cml0ZXJlZyhwYXIsIFNZTkNfQ1RMLCBjdHJscmVnKTsKKworCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHN0cmlkZSAqIHBpeHNpemVbcGl4Zm10XTsKKwlpbmZvLT5maXgudmlzdWFsID0gKHBpeGZtdCA9PSBERkFfUElYXzhCSVQpPyBGQl9WSVNVQUxfUFNFVURPQ09MT1I6CisJCUZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd4dDQ1MDBfc2V0Y29scmVnKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCByZWQsCisJCQkgICAgIHVuc2lnbmVkIGludCBncmVlbiwgdW5zaWduZWQgaW50IGJsdWUsCisJCQkgICAgIHVuc2lnbmVkIGludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXUzMiBjbWFwX2VudHJ5OworCXN0cnVjdCBneHQ0NTAwX3BhciAqcGFyID0gaW5mby0+cGFyOworCisJaWYgKHJlZyA+IDEwMjMpCisJCXJldHVybiAxOworCWNtYXBfZW50cnkgPSAoKHRyYW5zcCAmIDB4ZmYwMCkgPDwgMTYpIHwgKChibHVlICYgMHhmZjAwKSA8PCA4KSB8CisJCShncmVlbiAmIDB4ZmYwMCkgfCAocmVkID4+IDgpOworCXdyaXRlcmVnKHBhciwgQ01BUCArIHJlZyAqIDQsIGNtYXBfZW50cnkpOworCisJaWYgKHJlZyA8IDE2ICYmIHBhci0+cGl4Zm10ICE9IERGQV9QSVhfOEJJVCkgeworCQl1MzIgKnBhbCA9IGluZm8tPnBzZXVkb19wYWxldHRlOworCQl1MzIgdmFsID0gcmVnOworCQlzd2l0Y2ggKHBhci0+cGl4Zm10KSB7CisJCWNhc2UgREZBX1BJWF8xNkJJVF81NjU6CisJCQl2YWwgfD0gKHJlZyA8PCAxMSkgfCAocmVnIDw8IDYpOworCQkJYnJlYWs7CisJCWNhc2UgREZBX1BJWF8xNkJJVF8xNTU1OgorCQkJdmFsIHw9IChyZWcgPDwgMTApIHwgKHJlZyA8PCA1KTsKKwkJCWJyZWFrOworCQljYXNlIERGQV9QSVhfMzJCSVQ6CisJCQl2YWwgfD0gKHJlZyA8PCAyNCk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBERkFfUElYXzI0QklUOgorCQkJdmFsIHw9IChyZWcgPDwgMTYpIHwgKHJlZyA8PCA4KTsKKwkJCWJyZWFrOworCQl9CisJCXBhbFtyZWddID0gdmFsOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd4dDQ1MDBfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGd4dDQ1MDBfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisKKwlpZiAodmFyLT54b2Zmc2V0ICYgNykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsIHx8CisJICAgIHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlcmVnKHBhciwgUkVGUkVTSF9TVEFSVCwgKHZhci0+eG9mZnNldCA8PCAxNikgfCB2YXItPnlvZmZzZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd4dDQ1MDBfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZ3h0NDUwMF9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlpbnQgY3RybCwgZGN0bDsKKworCWN0cmwgPSByZWFkcmVnKHBhciwgU1lOQ19DVEwpOworCWN0cmwgJj0gfihTWU5DX0NUTF9TWU5DX09GRiB8IFNZTkNfQ1RMX0hTWU5DX09GRiB8IFNZTkNfQ1RMX1ZTWU5DX09GRik7CisJZGN0bCA9IHJlYWRyZWcocGFyLCBESVNQX0NUTCk7CisJZGN0bCB8PSBESVNQX0NUTF9PRkY7CisJc3dpdGNoIChibGFuaykgeworCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKKwkJZGN0bCAmPSB+RElTUF9DVExfT0ZGOworCQlicmVhazsKKwljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKKwkJY3RybCB8PSBTWU5DX0NUTF9TWU5DX09GRjsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgorCQljdHJsIHw9IFNZTkNfQ1RMX0hTWU5DX09GRjsKKwkJYnJlYWs7CisJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgorCQljdHJsIHw9IFNZTkNfQ1RMX1ZTWU5DX09GRjsKKwkJYnJlYWs7CisJZGVmYXVsdDogOworCX0KKwl3cml0ZXJlZyhwYXIsIFNZTkNfQ1RMLCBjdHJsKTsKKwl3cml0ZXJlZyhwYXIsIERJU1BfQ1RMLCBkY3RsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGd4dDQ1MDBfZml4IF9fZGV2aW5pdGRhdGEgPSB7CisJLmlkID0gIklCTSBHWFQ0NTAwUCIsCisJLnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCisJLnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiwKKwkueHBhbnN0ZXAgPSA4LAorCS55cGFuc3RlcCA9IDEsCisJLm1taW9fbGVuID0gMHgyMDAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIGd4dDQ1MDBfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5mYl9jaGVja192YXIgPSBneHQ0NTAwX2NoZWNrX3ZhciwKKwkuZmJfc2V0X3BhciA9IGd4dDQ1MDBfc2V0X3BhciwKKwkuZmJfc2V0Y29scmVnID0gZ3h0NDUwMF9zZXRjb2xyZWcsCisJLmZiX3Bhbl9kaXNwbGF5ID0gZ3h0NDUwMF9wYW5fZGlzcGxheSwKKwkuZmJfYmxhbmsgPSBneHQ0NTAwX2JsYW5rLAorCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCit9OworCisvKiBQQ0kgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBneHQ0NTAwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIHJlZ19waHlzLCBmYl9waHlzOworCXN0cnVjdCBneHQ0NTAwX3BhciAqcGFyOworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCBlbmFibGUgUENJIGRldmljZTogJWRcbiIsCisJCQllcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJlZ19waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlZ19waHlzLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApLAorCQkJCSJneHQ0NTAwIHJlZ3MiKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJneHQ0NTAwOiBjYW5ub3QgZ2V0IHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZXJyX25vZGV2OworCX0KKworCWZiX3BoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZmJfcGh5cywgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwKKwkJCQkiZ3h0NDUwMCBGQiIpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCBnZXQgZnJhbWVidWZmZXJcbiIpOworCQlnb3RvIGVycl9mcmVlX3JlZ3M7CisJfQorCisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3h0NDUwMF9wYXIpLCAmcGRldi0+ZGV2KTsKKwlpZiAoIWluZm8pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ3h0NDUwMDogY2Fubm90IGFsbG9jIEZCIGluZm8gcmVjb3JkIik7CisJCWdvdG8gZXJyX2ZyZWVfZmI7CisJfQorCXBhciA9IGluZm8tPnBhcjsKKwlpbmZvLT5maXggPSBneHQ0NTAwX2ZpeDsKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhci0+cHNldWRvX3BhbGV0dGU7CisKKwlpbmZvLT5maXgubW1pb19zdGFydCA9IHJlZ19waHlzOworCXBhci0+cmVncyA9IGlvcmVtYXAocmVnX3BoeXMsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWlmICghcGFyLT5yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCBtYXAgcmVnaXN0ZXJzXG4iKTsKKwkJZ290byBlcnJfZnJlZV9hbGw7CisJfQorCisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBmYl9waHlzOworCWluZm8tPmZpeC5zbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CisJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGZiX3BoeXMsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ3h0NDUwMDogY2Fubm90IG1hcCBmcmFtZWJ1ZmZlclxuIik7CisJCWdvdG8gZXJyX3VubWFwX3JlZ3M7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCisJLyogU2V0IGJ5dGUtc3dhcHBpbmcgZm9yIERGQSBhcGVydHVyZSBmb3IgYWxsIHBpeGVsIHNpemVzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBDRkdfRU5ESUFOMCwgMHgzMzMzMDApOworCisJaW5mby0+ZmJvcHMgPSAmZ3h0NDUwMF9vcHM7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOworCisJZXJyID0gZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCBhbGxvY2F0ZSBjbWFwXG4iKTsKKwkJZ290byBlcnJfdW5tYXBfYWxsOworCX0KKworCWd4dDQ1MDBfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgaW5mbyk7CisKKwlpZiAoIWZiX2ZpbmRfbW9kZSgmdmFyLCBpbmZvLCBtb2RlX29wdGlvbiwgTlVMTCwgMCwgJmRlZmF1bHRtb2RlLCA4KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJneHQ0NTAwOiBjYW5ub3QgZmluZCB2YWxpZCB2aWRlbyBtb2RlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9jbWFwOworCX0KKwlpbmZvLT52YXIgPSB2YXI7CisJaWYgKGd4dDQ1MDBfc2V0X3BhcihpbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgImd4dDQ1MDA6IGNhbm5vdCBzZXQgdmlkZW8gbW9kZVxuIik7CisJCWdvdG8gZXJyX2ZyZWVfY21hcDsKKwl9CisKKwlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCByZWdpc3RlciBmcmFtZWJ1ZmZlclxuIik7CisJCWdvdG8gZXJyX2ZyZWVfY21hcDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZVxuIiwKKwkgICAgICAgaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkKTsKKworCXJldHVybiAwOworCisgZXJyX2ZyZWVfY21hcDoKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworIGVycl91bm1hcF9hbGw6CisJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CisgZXJyX3VubWFwX3JlZ3M6CisJaW91bm1hcChwYXItPnJlZ3MpOworIGVycl9mcmVlX2FsbDoKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworIGVycl9mcmVlX2ZiOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihmYl9waHlzLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpKTsKKyBlcnJfZnJlZV9yZWdzOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZWdfcGh5cywgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisgZXJyX25vZGV2OgorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZ3h0NDUwMF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGd4dDQ1MDBfcGFyICpwYXI7CisKKwlpZiAoIWluZm8pCisJCXJldHVybjsKKwlwYXIgPSBpbmZvLT5wYXI7CisJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCWlvdW5tYXAocGFyLT5yZWdzKTsKKwlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCQkJICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwKKwkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Cit9CisKKy8qIHN1cHBvcnRlZCBjaGlwc2V0cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGd4dDQ1MDBfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9JQk0sIFBDSV9ERVZJQ0VfSURfSUJNX0dYVDQ1MDBQLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZ3h0NDUwMF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGd4dDQ1MDBfZHJpdmVyID0geworCS5uYW1lID0gImd4dDQ1MDAiLAorCS5pZF90YWJsZSA9IGd4dDQ1MDBfcGNpX3RibCwKKwkucHJvYmUgPSBneHQ0NTAwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChneHQ0NTAwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBneHQ0NTAwX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgTU9EVUxFCisJaWYgKGZiX2dldF9vcHRpb25zKCJneHQ0NTAwIiwgJm1vZGVfb3B0aW9uKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisjZW5kaWYKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZneHQ0NTAwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChneHQ0NTAwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZ3h0NDUwMF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZneHQ0NTAwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChneHQ0NTAwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRkJEZXYgZHJpdmVyIGZvciBJQk0gR1hUNDUwMFAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShtb2RlX29wdGlvbiwgY2hhcnAsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlX29wdGlvbiwgIlNwZWNpZnkgcmVzb2x1dGlvbiBhcyBcIjx4cmVzPng8eXJlcz5bLTxicHA+XVtAPHJlZnJlc2g+XVwiIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2hpdGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2hpdGZiLmMKaW5kZXggM2FmYjQ3Mi4uM2RjNDk0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9oaXRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaGl0ZmIuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KLSNpbmNsdWRlIDxhc20vaHA2eHgvaHA2eHguaD4KIAogI2RlZmluZQlXSURUSCA2NDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9ocGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2hwZmIuYwppbmRleCA5MWNmM2I1Li45YWI5YjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2hwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2hwZmIuYwpAQCAtMjk1LDYgKzI5NSw4IEBACiAKIAlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoJmZiX2luZm8pIDwgMCkgewogCQlmYl9kZWFsbG9jX2NtYXAoJmZiX2luZm8uY21hcCk7CisJCWlvdW5tYXAoZmJfaW5mby5zY3JlZW5fYmFzZSk7CisJCWZiX2luZm8uc2NyZWVuX2Jhc2UgPSBOVUxMOwogCQlyZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLWkyYy5jIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAtaTJjLmMKaW5kZXggYjM4ZDgwNS4uOTYxZjRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pODEwL2k4MTAtaTJjLmMKKysrIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAtaTJjLmMKQEAgLTEzNywxNSArMTM3LDE1IEBACiB2b2lkIGk4MTBfZGVsZXRlX2kyY19idXNzZXMoc3RydWN0IGk4MTBmYl9wYXIgKnBhcikKIHsKICAgICAgICAgaWYgKHBhci0+Y2hhblswXS5wYXIpCi0gICAgICAgICAgICAgICAgaTJjX2JpdF9kZWxfYnVzKCZwYXItPmNoYW5bMF0uYWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmcGFyLT5jaGFuWzBdLmFkYXB0ZXIpOwogICAgICAgICBwYXItPmNoYW5bMF0ucGFyID0gTlVMTDsKIAogCWlmIChwYXItPmNoYW5bMV0ucGFyKQotCQlpMmNfYml0X2RlbF9idXMoJnBhci0+Y2hhblsxXS5hZGFwdGVyKTsKKwkJaTJjX2RlbF9hZGFwdGVyKCZwYXItPmNoYW5bMV0uYWRhcHRlcik7CiAJcGFyLT5jaGFuWzFdLnBhciA9IE5VTEw7CiAKIAlpZiAocGFyLT5jaGFuWzJdLnBhcikKLQkJaTJjX2JpdF9kZWxfYnVzKCZwYXItPmNoYW5bMl0uYWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmcGFyLT5jaGFuWzJdLmFkYXB0ZXIpOwogCXBhci0+Y2hhblsyXS5wYXIgPSBOVUxMOwogfQogCkBAIC0xNjIsOSArMTYyLDcgQEAKIAogCQlpZiAoZSAhPSBOVUxMKSB7CiAJCQlEUFJJTlRLKCJpODEwLWkyYzogR2V0dGluZyBFRElEIGZyb20gQklPU1xuIik7Ci0JCQllZGlkID0ga21hbGxvYyhFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoZWRpZCkKLQkJCQltZW1jcHkoZWRpZCwgZSwgRURJRF9MRU5HVEgpOworCQkJZWRpZCA9IGttZW1kdXAoZSwgRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMKaW5kZXggNjdmMzg0Zi4uNjU1YWUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pZ2FmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaWdhZmIuYwpAQCAtMzg0LDE5ICszODQsMjEgQEAKICAgICAgICAgaWYgKCFjb25faXNfcHJlc2VudCgpKQogICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CiAKLSAgICAgICAgcGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVSRywgCisgICAgICAgIHBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVSRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVSR18xNjgyLCAwKTsKIAlpZiAocGRldiA9PSBOVUxMKSB7CiAJCS8qCiAJCSAqIFhYWCBXZSB0cmllZCB0byB1c2UgY3liZXIyMDAwZmIuYyBmb3IgSUdTIDIwMDAuCiAJCSAqIEJ1dCBpdCBkb2VzIG5vdCBpbml0aWFsaXplIHRoZSBjaGlwIGluIEphdmFTdGF0aW9uLUUsIGFsYXMuCiAJCSAqLwotICAgICAgICAJcGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVSRywgMHgyMDAwLCAwKTsKKyAgICAgICAgCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVSRywgMHgyMDAwLCAwKTsKICAgICAgICAgCWlmKHBkZXYgPT0gTlVMTCkgewogICAgICAgICAJICAgICAgICByZXR1cm4gLUVOWElPOwogCQl9CiAJCWlnYTIwMDAgPSAxOwogCX0KKwkvKiBXZSBsZWFrIGEgcmVmZXJlbmNlIGhlcmUgYnV0IGFzIGl0IGNhbm5vdCBiZSB1bmxvYWRlZCB0aGlzIGlzCisJICAgZmluZS4gSWYgeW91IHdyaXRlIHVubG9hZCBjb2RlIHJlbWVtYmVyIHRvIGZyZWUgaXQgaW4gdW5sb2FkICovCiAJCiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmJfaW5mbykgKyBzaXplb2Yoc3RydWN0IGlnYV9wYXIpICsgc2l6ZW9mKHUzMikqMTY7CiAKQEAgLTU3MywzICs1NzUsMTAgQEAKIAogbW9kdWxlX2luaXQoaWdhZmJfaW5pdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWdhZmJfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lOVEVSRywgUENJX0RFVklDRV9JRF9JTlRFUkdfMTY4MiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlnYWZiX3BjaV90YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJfaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYl9pMmMuYwppbmRleCA1Njg2ZTIxLi4zM2JjNDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYl9pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYl9pMmMuYwpAQCAtMTg4LDExICsxODgsMTEgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfT1VUUFVUUzsgaSsrKSB7CiAJCWlmIChkaW5mby0+b3V0cHV0W2ldLmkyY19idXMuZGluZm8pIHsKLQkJCWkyY19iaXRfZGVsX2J1cygmZGluZm8tPm91dHB1dFtpXS5pMmNfYnVzLmFkYXB0ZXIpOworCQkJaTJjX2RlbF9hZGFwdGVyKCZkaW5mby0+b3V0cHV0W2ldLmkyY19idXMuYWRhcHRlcik7CiAJCQlkaW5mby0+b3V0cHV0W2ldLmkyY19idXMuZGluZm8gPSBOVUxMOwogCQl9CiAJCWlmIChkaW5mby0+b3V0cHV0W2ldLmRkY19idXMuZGluZm8pIHsKLQkJCWkyY19iaXRfZGVsX2J1cygmZGluZm8tPm91dHB1dFtpXS5kZGNfYnVzLmFkYXB0ZXIpOworCQkJaTJjX2RlbF9hZGFwdGVyKCZkaW5mby0+b3V0cHV0W2ldLmRkY19idXMuYWRhcHRlcik7CiAJCQlkaW5mby0+b3V0cHV0W2ldLmRkY19idXMuZGluZm8gPSBOVUxMOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKaW5kZXggNmY5ZGUwNC4uNjY0ZmM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCkBAIC0xMDU4LDEwICsxMDU4LDkgQEAKIAkJdTggKmVkaWRfZCA9IE5VTEw7CiAKIAkJaWYgKGVkaWRfcykgewotCQkJZWRpZF9kID0ga21hbGxvYyhFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJCQllZGlkX2QgPSBrbWVtZHVwKGVkaWRfcywgRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOwogCiAJCQlpZiAoZWRpZF9kKSB7Ci0JCQkJbWVtY3B5KGVkaWRfZCwgZWRpZF9zLCBFRElEX0xFTkdUSCk7CiAJCQkJZmJfZWRpZF90b19tb25zcGVjcyhlZGlkX2QsCiAJCQkJCQkgICAgJmRpbmZvLT5pbmZvLT5tb25zcGVjcyk7CiAJCQkJa2ZyZWUoZWRpZF9kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYyBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYwppbmRleCBlZWVlZmY5Li5hOTU4MzY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJody5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIAkJcmV0dXJuIDE7CiAKIAkvKiBGaW5kIHRoZSBicmlkZ2UgZGV2aWNlLiAgSXQgaXMgYWx3YXlzIDA6MC4wICovCi0JaWYgKCEoYnJpZGdlX2RldiA9IHBjaV9maW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsIDApKSkpIHsKKwlpZiAoIShicmlkZ2VfZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsIDApKSkpIHsKIAkJRVJSX01TRygiY2Fubm90IGZpbmQgYnJpZGdlIGRldmljZVxuIik7CiAJCXJldHVybiAxOwogCX0KQEAgLTE2OSw2ICsxNjksOCBAQAogCS8qIEdldCB0aGUgZmIgYXBlcnR1cmUgc2l6ZSBhbmQgInN0b2xlbiIgbWVtb3J5IGFtb3VudC4gKi8KIAl0bXAgPSAwOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZV9kZXYsIElOVEVMX0dNQ0hfQ1RSTCwgJnRtcCk7CisJcGNpX2Rldl9wdXQoYnJpZGdlX2Rldik7CisKIAlzd2l0Y2ggKHBkZXYtPmRldmljZSkgewogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF85MTVHOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF85MTVHTToKQEAgLTY2Miw3ICs2NjQsNyBAQAogCWludCBpbmRleCA9IGRpbmZvLT5wbGxfaW5kZXg7CiAJREJHX01TRygiaW50ZWxmYmh3X3ByaW50X2h3X3N0YXRlXG4iKTsKIAotCWlmICghaHcgfHwgIWRpbmZvKQorCWlmICghaHcpCiAJCXJldHVybjsKIAkvKiBSZWFkIGluIGFzIG11Y2ggb2YgdGhlIEhXIHN0YXRlIGFzIHBvc3NpYmxlLiAqLwogCXByaW50aygiaHcgc3RhdGUgZHVtcCBzdGFydFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMKaW5kZXggODBhMDQzOC4uMTgwZDk0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYWNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWFjZmIuYwpAQCAtNjA4LDYgKzYwOCwyMiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgX19pbml0IGlvdW5tYXBfbWFjZmIodm9pZCkKK3sKKwlpZiAodmFsa3lyaWVfY21hcF9yZWdzKQorCQlpb3VubWFwKHZhbGt5cmllX2NtYXBfcmVncyk7CisJaWYgKGRhZmJfY21hcF9yZWdzKQorCQlpb3VubWFwKGRhZmJfY21hcF9yZWdzKTsKKwlpZiAodjhfYnJhemlsX2NtYXBfcmVncykKKwkJaW91bm1hcCh2OF9icmF6aWxfY21hcF9yZWdzKTsKKwlpZiAocmJ2X2NtYXBfcmVncykKKwkJaW91bm1hcChyYnZfY21hcF9yZWdzKTsKKwlpZiAoY2l2aWNfY21hcF9yZWdzKQorCQlpb3VubWFwKGNpdmljX2NtYXBfcmVncyk7CisJaWYgKGNzY19jbWFwX3JlZ3MpCisJCWlvdW5tYXAoY3NjX2NtYXBfcmVncyk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IG1hY2ZiX2luaXQodm9pZCkKIHsKIAlpbnQgdmlkZW9fY21hcF9sZW4sIHZpZGVvX2lzX251YnVzID0gMDsKQEAgLTk2Miw2ICs5NzgsMTAgQEAKIAlpZiAoIWVycikKIAkJcHJpbnRrKCJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlXG4iLAogCQkgICAgICAgZmJfaW5mby5ub2RlLCBmYl9pbmZvLmZpeC5pZCk7CisJZWxzZSB7CisJCWlvdW5tYXAoZmJfaW5mby5zY3JlZW5fYmFzZSk7CisJCWlvdW5tYXBfbWFjZmIoKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvaTJjLW1hdHJveGZiLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9pMmMtbWF0cm94ZmIuYwppbmRleCA3OTVjMWE5Li5mZTI4ODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9pMmMtbWF0cm94ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9pMmMtbWF0cm94ZmIuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIHN0YXRpYyB2b2lkIGkyY19iaXRfYnVzX2RlbChzdHJ1Y3QgaTJjX2JpdF9hZGFwdGVyKiBiKSB7CiAJaWYgKGItPmluaXRpYWxpemVkKSB7Ci0JCWkyY19iaXRfZGVsX2J1cygmYi0+YWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmYi0+YWRhcHRlcik7CiAJCWItPmluaXRpYWxpemVkID0gMDsKIAl9CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtYXRyb3hmYl9kaF9tYXZlbl9pbmZvKiBtMmluZm87CiAKLQltMmluZm8gPSAoc3RydWN0IG1hdHJveGZiX2RoX21hdmVuX2luZm8qKWttYWxsb2Moc2l6ZW9mKCptMmluZm8pLCBHRlBfS0VSTkVMKTsKKwltMmluZm8gPSBrbWFsbG9jKHNpemVvZigqbTJpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtMmluZm8pCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKaW5kZXggZTliNDExNS4uY2IyYWE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwpAQCAtMjAyOCw3ICsyMDI4LDcgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfRkJfTUFUUk9YX01VTFRJSEVBRAotCW1pbmZvID0gKHN0cnVjdCBtYXRyb3hfZmJfaW5mbyopa21hbGxvYyhzaXplb2YoKm1pbmZvKSwgR0ZQX0tFUk5FTCk7CisJbWluZm8gPSBrbWFsbG9jKHNpemVvZigqbWluZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1pbmZvKQogCQlyZXR1cm4gLTE7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMKaW5kZXggMjdlYjRiYi4uMmM5ODAxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5jCkBAIC02OTQsNyArNjk0LDcgQEAKIAkvKiBoYXJkd2FyZSBpcyBDUlRDMiBpbmNhcGFibGUuLi4gKi8KIAlpZiAoIUFDQ0VTU19GQklORk8oZGV2ZmxhZ3MuY3J0YzIpKQogCQlyZXR1cm4gTlVMTDsKLQltMmluZm8gPSAoc3RydWN0IG1hdHJveGZiX2RoX2ZiX2luZm8qKWttYWxsb2Moc2l6ZW9mKCptMmluZm8pLCBHRlBfS0VSTkVMKTsKKwltMmluZm8gPSBrbWFsbG9jKHNpemVvZigqbTJpbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtMmluZm8pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtYXRyb3hmYl9jcnRjMjogTm90IGVub3VnaCBtZW1vcnkgZm9yIENSVEMyIGNvbnRyb2wgc3RydWN0c1xuIik7CiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYngvbWJ4ZGVidWdmcy5jIGIvZHJpdmVycy92aWRlby9tYngvbWJ4ZGVidWdmcy5jCmluZGV4IDg0YWFiM2EuLjQ3MmEzY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWJ4L21ieGRlYnVnZnMuYworKysgYi9kcml2ZXJzL3ZpZGVvL21ieC9tYnhkZWJ1Z2ZzLmMKQEAgLTEwLDYgKzEwLDggQEAKIAlzdHJ1Y3QgZGVudHJ5ICpjbG9jazsKIAlzdHJ1Y3QgZGVudHJ5ICpkaXNwbGF5OwogCXN0cnVjdCBkZW50cnkgKmdzY3RsOworCXN0cnVjdCBkZW50cnkgKnNkcmFtOworCXN0cnVjdCBkZW50cnkgKm1pc2M7CiB9OwogCiBzdGF0aWMgaW50IG9wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMjksMTEgKzMxLDExIEBACiB7CiAJY2hhciAqIHMgPSBiaWdfYnVmZmVyOwogCi0JcyArPSBzcHJpbnRmKHMsICJTWVNDRkcgPSAlMDhseFxuIiwgU1lTQ0ZHKTsKLQlzICs9IHNwcmludGYocywgIlBGQkFTRSA9ICUwOGx4XG4iLCBQRkJBU0UpOwotCXMgKz0gc3ByaW50ZihzLCAiUEZDRUlMID0gJTA4bHhcbiIsIFBGQ0VJTCk7Ci0JcyArPSBzcHJpbnRmKHMsICJQT0xMRkxBRyA9ICUwOGx4XG4iLCBQT0xMRkxBRyk7Ci0JcyArPSBzcHJpbnRmKHMsICJTWVNSU1QgPSAlMDhseFxuIiwgU1lTUlNUKTsKKwlzICs9IHNwcmludGYocywgIlNZU0NGRyA9ICUwOHhcbiIsIHJlYWRsKFNZU0NGRykpOworCXMgKz0gc3ByaW50ZihzLCAiUEZCQVNFID0gJTA4eFxuIiwgcmVhZGwoUEZCQVNFKSk7CisJcyArPSBzcHJpbnRmKHMsICJQRkNFSUwgPSAlMDh4XG4iLCByZWFkbChQRkNFSUwpKTsKKwlzICs9IHNwcmludGYocywgIlBPTExGTEFHID0gJTA4eFxuIiwgcmVhZGwoUE9MTEZMQUcpKTsKKwlzICs9IHNwcmludGYocywgIlNZU1JTVCA9ICUwOHhcbiIsIHJlYWRsKFNZU1JTVCkpOwogCiAJcmV0dXJuICBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywKIAkJCQkJYmlnX2J1ZmZlciwgcy1iaWdfYnVmZmVyKTsKQEAgLTQ1LDI0ICs0NywyNCBAQAogewogCWNoYXIgKiBzID0gYmlnX2J1ZmZlcjsKIAotCXMgKz0gc3ByaW50ZihzLCAiR1NDVFJMID0gJTA4bHhcbiIsIEdTQ1RSTCk7Ci0JcyArPSBzcHJpbnRmKHMsICJWU0NUUkwgPSAlMDhseFxuIiwgVlNDVFJMKTsKLQlzICs9IHNwcmludGYocywgIkdCQkFTRSA9ICUwOGx4XG4iLCBHQkJBU0UpOwotCXMgKz0gc3ByaW50ZihzLCAiVkJCQVNFID0gJTA4bHhcbiIsIFZCQkFTRSk7Ci0JcyArPSBzcHJpbnRmKHMsICJHRFJDVFJMID0gJTA4bHhcbiIsIEdEUkNUUkwpOwotCXMgKz0gc3ByaW50ZihzLCAiVkNNU0sgPSAlMDhseFxuIiwgVkNNU0spOwotCXMgKz0gc3ByaW50ZihzLCAiR1NDQURSID0gJTA4bHhcbiIsIEdTQ0FEUik7Ci0JcyArPSBzcHJpbnRmKHMsICJWU0NBRFIgPSAlMDhseFxuIiwgVlNDQURSKTsKLQlzICs9IHNwcmludGYocywgIlZVQkFTRSA9ICUwOGx4XG4iLCBWVUJBU0UpOwotCXMgKz0gc3ByaW50ZihzLCAiVlZCQVNFID0gJTA4bHhcbiIsIFZWQkFTRSk7Ci0JcyArPSBzcHJpbnRmKHMsICJHU0FEUiA9ICUwOGx4XG4iLCBHU0FEUik7Ci0JcyArPSBzcHJpbnRmKHMsICJWU0FEUiA9ICUwOGx4XG4iLCBWU0FEUik7Ci0JcyArPSBzcHJpbnRmKHMsICJIQ0NUUkwgPSAlMDhseFxuIiwgSENDVFJMKTsKLQlzICs9IHNwcmludGYocywgIkhDU0laRSA9ICUwOGx4XG4iLCBIQ1NJWkUpOwotCXMgKz0gc3ByaW50ZihzLCAiSENQT1MgPSAlMDhseFxuIiwgSENQT1MpOwotCXMgKz0gc3ByaW50ZihzLCAiSENCQURSID0gJTA4bHhcbiIsIEhDQkFEUik7Ci0JcyArPSBzcHJpbnRmKHMsICJIQ0NLTVNLID0gJTA4bHhcbiIsIEhDQ0tNU0spOwotCXMgKz0gc3ByaW50ZihzLCAiR1BMVVQgPSAlMDhseFxuIiwgR1BMVVQpOworCXMgKz0gc3ByaW50ZihzLCAiR1NDVFJMID0gJTA4eFxuIiwgcmVhZGwoR1NDVFJMKSk7CisJcyArPSBzcHJpbnRmKHMsICJWU0NUUkwgPSAlMDh4XG4iLCByZWFkbChWU0NUUkwpKTsKKwlzICs9IHNwcmludGYocywgIkdCQkFTRSA9ICUwOHhcbiIsIHJlYWRsKEdCQkFTRSkpOworCXMgKz0gc3ByaW50ZihzLCAiVkJCQVNFID0gJTA4eFxuIiwgcmVhZGwoVkJCQVNFKSk7CisJcyArPSBzcHJpbnRmKHMsICJHRFJDVFJMID0gJTA4eFxuIiwgcmVhZGwoR0RSQ1RSTCkpOworCXMgKz0gc3ByaW50ZihzLCAiVkNNU0sgPSAlMDh4XG4iLCByZWFkbChWQ01TSykpOworCXMgKz0gc3ByaW50ZihzLCAiR1NDQURSID0gJTA4eFxuIiwgcmVhZGwoR1NDQURSKSk7CisJcyArPSBzcHJpbnRmKHMsICJWU0NBRFIgPSAlMDh4XG4iLCByZWFkbChWU0NBRFIpKTsKKwlzICs9IHNwcmludGYocywgIlZVQkFTRSA9ICUwOHhcbiIsIHJlYWRsKFZVQkFTRSkpOworCXMgKz0gc3ByaW50ZihzLCAiVlZCQVNFID0gJTA4eFxuIiwgcmVhZGwoVlZCQVNFKSk7CisJcyArPSBzcHJpbnRmKHMsICJHU0FEUiA9ICUwOHhcbiIsIHJlYWRsKEdTQURSKSk7CisJcyArPSBzcHJpbnRmKHMsICJWU0FEUiA9ICUwOHhcbiIsIHJlYWRsKFZTQURSKSk7CisJcyArPSBzcHJpbnRmKHMsICJIQ0NUUkwgPSAlMDh4XG4iLCByZWFkbChIQ0NUUkwpKTsKKwlzICs9IHNwcmludGYocywgIkhDU0laRSA9ICUwOHhcbiIsIHJlYWRsKEhDU0laRSkpOworCXMgKz0gc3ByaW50ZihzLCAiSENQT1MgPSAlMDh4XG4iLCByZWFkbChIQ1BPUykpOworCXMgKz0gc3ByaW50ZihzLCAiSENCQURSID0gJTA4eFxuIiwgcmVhZGwoSENCQURSKSk7CisJcyArPSBzcHJpbnRmKHMsICJIQ0NLTVNLID0gJTA4eFxuIiwgcmVhZGwoSENDS01TSykpOworCXMgKz0gc3ByaW50ZihzLCAiR1BMVVQgPSAlMDh4XG4iLCByZWFkbChHUExVVCkpOwogCiAJcmV0dXJuICBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywKIAkJCQkJYmlnX2J1ZmZlciwgcy1iaWdfYnVmZmVyKTsKQEAgLTczLDM2ICs3NSwzNiBAQAogewogCWNoYXIgKiBzID0gYmlnX2J1ZmZlcjsKIAotCXMgKz0gc3ByaW50ZihzLCAiRFNDVFJMID0gJTA4bHhcbiIsIERTQ1RSTCk7Ci0JcyArPSBzcHJpbnRmKHMsICJESFQwMSA9ICUwOGx4XG4iLCBESFQwMSk7Ci0JcyArPSBzcHJpbnRmKHMsICJESFQwMiA9ICUwOGx4XG4iLCBESFQwMik7Ci0JcyArPSBzcHJpbnRmKHMsICJESFQwMyA9ICUwOGx4XG4iLCBESFQwMyk7Ci0JcyArPSBzcHJpbnRmKHMsICJEVlQwMSA9ICUwOGx4XG4iLCBEVlQwMSk7Ci0JcyArPSBzcHJpbnRmKHMsICJEVlQwMiA9ICUwOGx4XG4iLCBEVlQwMik7Ci0JcyArPSBzcHJpbnRmKHMsICJEVlQwMyA9ICUwOGx4XG4iLCBEVlQwMyk7Ci0JcyArPSBzcHJpbnRmKHMsICJEQkNPTCA9ICUwOGx4XG4iLCBEQkNPTCk7Ci0JcyArPSBzcHJpbnRmKHMsICJCR0NPTE9SID0gJTA4bHhcbiIsIEJHQ09MT1IpOwotCXMgKz0gc3ByaW50ZihzLCAiRElOVFJTID0gJTA4bHhcbiIsIERJTlRSUyk7Ci0JcyArPSBzcHJpbnRmKHMsICJESU5UUkUgPSAlMDhseFxuIiwgRElOVFJFKTsKLQlzICs9IHNwcmludGYocywgIkRJTlRSQ05UID0gJTA4bHhcbiIsIERJTlRSQ05UKTsKLQlzICs9IHNwcmludGYocywgIkRTSUcgPSAlMDhseFxuIiwgRFNJRyk7Ci0JcyArPSBzcHJpbnRmKHMsICJETUNUUkwgPSAlMDhseFxuIiwgRE1DVFJMKTsKLQlzICs9IHNwcmludGYocywgIkNMSVBDVFJMID0gJTA4bHhcbiIsIENMSVBDVFJMKTsKLQlzICs9IHNwcmludGYocywgIlNQT0NUUkwgPSAlMDhseFxuIiwgU1BPQ1RSTCk7Ci0JcyArPSBzcHJpbnRmKHMsICJTVkNUUkwgPSAlMDhseFxuIiwgU1ZDVFJMKTsKLQlzICs9IHNwcmludGYocywgIkRMU1RTID0gJTA4bHhcbiIsIERMU1RTKTsKLQlzICs9IHNwcmludGYocywgIkRMTENUUkwgPSAlMDhseFxuIiwgRExMQ1RSTCk7Ci0JcyArPSBzcHJpbnRmKHMsICJEVkxOVU0gPSAlMDhseFxuIiwgRFZMTlVNKTsKLQlzICs9IHNwcmludGYocywgIkRVQ1RSTCA9ICUwOGx4XG4iLCBEVUNUUkwpOwotCXMgKz0gc3ByaW50ZihzLCAiRFZFQ1RSTCA9ICUwOGx4XG4iLCBEVkVDVFJMKTsKLQlzICs9IHNwcmludGYocywgIkRIREVUID0gJTA4bHhcbiIsIERIREVUKTsKLQlzICs9IHNwcmludGYocywgIkRWREVUID0gJTA4bHhcbiIsIERWREVUKTsKLQlzICs9IHNwcmludGYocywgIkRPRE1TSyA9ICUwOGx4XG4iLCBET0RNU0spOwotCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDEgPSAlMDhseFxuIiwgQ1NDMDEpOwotCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDIgPSAlMDhseFxuIiwgQ1NDMDIpOwotCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDMgPSAlMDhseFxuIiwgQ1NDMDMpOwotCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDQgPSAlMDhseFxuIiwgQ1NDMDQpOwotCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDUgPSAlMDhseFxuIiwgQ1NDMDUpOworCXMgKz0gc3ByaW50ZihzLCAiRFNDVFJMID0gJTA4eFxuIiwgcmVhZGwoRFNDVFJMKSk7CisJcyArPSBzcHJpbnRmKHMsICJESFQwMSA9ICUwOHhcbiIsIHJlYWRsKERIVDAxKSk7CisJcyArPSBzcHJpbnRmKHMsICJESFQwMiA9ICUwOHhcbiIsIHJlYWRsKERIVDAyKSk7CisJcyArPSBzcHJpbnRmKHMsICJESFQwMyA9ICUwOHhcbiIsIHJlYWRsKERIVDAzKSk7CisJcyArPSBzcHJpbnRmKHMsICJEVlQwMSA9ICUwOHhcbiIsIHJlYWRsKERWVDAxKSk7CisJcyArPSBzcHJpbnRmKHMsICJEVlQwMiA9ICUwOHhcbiIsIHJlYWRsKERWVDAyKSk7CisJcyArPSBzcHJpbnRmKHMsICJEVlQwMyA9ICUwOHhcbiIsIHJlYWRsKERWVDAzKSk7CisJcyArPSBzcHJpbnRmKHMsICJEQkNPTCA9ICUwOHhcbiIsIHJlYWRsKERCQ09MKSk7CisJcyArPSBzcHJpbnRmKHMsICJCR0NPTE9SID0gJTA4eFxuIiwgcmVhZGwoQkdDT0xPUikpOworCXMgKz0gc3ByaW50ZihzLCAiRElOVFJTID0gJTA4eFxuIiwgcmVhZGwoRElOVFJTKSk7CisJcyArPSBzcHJpbnRmKHMsICJESU5UUkUgPSAlMDh4XG4iLCByZWFkbChESU5UUkUpKTsKKwlzICs9IHNwcmludGYocywgIkRJTlRSQ05UID0gJTA4eFxuIiwgcmVhZGwoRElOVFJDTlQpKTsKKwlzICs9IHNwcmludGYocywgIkRTSUcgPSAlMDh4XG4iLCByZWFkbChEU0lHKSk7CisJcyArPSBzcHJpbnRmKHMsICJETUNUUkwgPSAlMDh4XG4iLCByZWFkbChETUNUUkwpKTsKKwlzICs9IHNwcmludGYocywgIkNMSVBDVFJMID0gJTA4eFxuIiwgcmVhZGwoQ0xJUENUUkwpKTsKKwlzICs9IHNwcmludGYocywgIlNQT0NUUkwgPSAlMDh4XG4iLCByZWFkbChTUE9DVFJMKSk7CisJcyArPSBzcHJpbnRmKHMsICJTVkNUUkwgPSAlMDh4XG4iLCByZWFkbChTVkNUUkwpKTsKKwlzICs9IHNwcmludGYocywgIkRMU1RTID0gJTA4eFxuIiwgcmVhZGwoRExTVFMpKTsKKwlzICs9IHNwcmludGYocywgIkRMTENUUkwgPSAlMDh4XG4iLCByZWFkbChETExDVFJMKSk7CisJcyArPSBzcHJpbnRmKHMsICJEVkxOVU0gPSAlMDh4XG4iLCByZWFkbChEVkxOVU0pKTsKKwlzICs9IHNwcmludGYocywgIkRVQ1RSTCA9ICUwOHhcbiIsIHJlYWRsKERVQ1RSTCkpOworCXMgKz0gc3ByaW50ZihzLCAiRFZFQ1RSTCA9ICUwOHhcbiIsIHJlYWRsKERWRUNUUkwpKTsKKwlzICs9IHNwcmludGYocywgIkRIREVUID0gJTA4eFxuIiwgcmVhZGwoREhERVQpKTsKKwlzICs9IHNwcmludGYocywgIkRWREVUID0gJTA4eFxuIiwgcmVhZGwoRFZERVQpKTsKKwlzICs9IHNwcmludGYocywgIkRPRE1TSyA9ICUwOHhcbiIsIHJlYWRsKERPRE1TSykpOworCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDEgPSAlMDh4XG4iLCByZWFkbChDU0MwMSkpOworCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDIgPSAlMDh4XG4iLCByZWFkbChDU0MwMikpOworCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDMgPSAlMDh4XG4iLCByZWFkbChDU0MwMykpOworCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDQgPSAlMDh4XG4iLCByZWFkbChDU0MwNCkpOworCXMgKz0gc3ByaW50ZihzLCAiQ1NDMDUgPSAlMDh4XG4iLCByZWFkbChDU0MwNSkpOwogCiAJcmV0dXJuICBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywKIAkJCQkJYmlnX2J1ZmZlciwgcy1iaWdfYnVmZmVyKTsKQEAgLTExMywyNCArMTE1LDYxIEBACiB7CiAJY2hhciAqIHMgPSBiaWdfYnVmZmVyOwogCi0JcyArPSBzcHJpbnRmKHMsICJTWVNDTEtTUkMgPSAlMDhseFxuIiwgU1lTQ0xLU1JDKTsKLQlzICs9IHNwcmludGYocywgIlBJWENMS1NSQyA9ICUwOGx4XG4iLCBQSVhDTEtTUkMpOwotCXMgKz0gc3ByaW50ZihzLCAiQ0xLU0xFRVAgPSAlMDhseFxuIiwgQ0xLU0xFRVApOwotCXMgKz0gc3ByaW50ZihzLCAiQ09SRVBMTCA9ICUwOGx4XG4iLCBDT1JFUExMKTsKLQlzICs9IHNwcmludGYocywgIkRJU1BQTEwgPSAlMDhseFxuIiwgRElTUFBMTCk7Ci0JcyArPSBzcHJpbnRmKHMsICJQTExTVEFUID0gJTA4bHhcbiIsIFBMTFNUQVQpOwotCXMgKz0gc3ByaW50ZihzLCAiVk9WUkNMSyA9ICUwOGx4XG4iLCBWT1ZSQ0xLKTsKLQlzICs9IHNwcmludGYocywgIlBJWENMSyA9ICUwOGx4XG4iLCBQSVhDTEspOwotCXMgKz0gc3ByaW50ZihzLCAiTUVNQ0xLID0gJTA4bHhcbiIsIE1FTUNMSyk7Ci0JcyArPSBzcHJpbnRmKHMsICJNMjRDTEsgPSAlMDhseFxuIiwgTTI0Q0xLKTsKLQlzICs9IHNwcmludGYocywgIk1CWENMSyA9ICUwOGx4XG4iLCBNQlhDTEspOwotCXMgKz0gc3ByaW50ZihzLCAiU0RDTEsgPSAlMDhseFxuIiwgU0RDTEspOwotCXMgKz0gc3ByaW50ZihzLCAiUElYQ0xLRElWID0gJTA4bHhcbiIsIFBJWENMS0RJVik7CisJcyArPSBzcHJpbnRmKHMsICJTWVNDTEtTUkMgPSAlMDh4XG4iLCByZWFkbChTWVNDTEtTUkMpKTsKKwlzICs9IHNwcmludGYocywgIlBJWENMS1NSQyA9ICUwOHhcbiIsIHJlYWRsKFBJWENMS1NSQykpOworCXMgKz0gc3ByaW50ZihzLCAiQ0xLU0xFRVAgPSAlMDh4XG4iLCByZWFkbChDTEtTTEVFUCkpOworCXMgKz0gc3ByaW50ZihzLCAiQ09SRVBMTCA9ICUwOHhcbiIsIHJlYWRsKENPUkVQTEwpKTsKKwlzICs9IHNwcmludGYocywgIkRJU1BQTEwgPSAlMDh4XG4iLCByZWFkbChESVNQUExMKSk7CisJcyArPSBzcHJpbnRmKHMsICJQTExTVEFUID0gJTA4eFxuIiwgcmVhZGwoUExMU1RBVCkpOworCXMgKz0gc3ByaW50ZihzLCAiVk9WUkNMSyA9ICUwOHhcbiIsIHJlYWRsKFZPVlJDTEspKTsKKwlzICs9IHNwcmludGYocywgIlBJWENMSyA9ICUwOHhcbiIsIHJlYWRsKFBJWENMSykpOworCXMgKz0gc3ByaW50ZihzLCAiTUVNQ0xLID0gJTA4eFxuIiwgcmVhZGwoTUVNQ0xLKSk7CisJcyArPSBzcHJpbnRmKHMsICJNMjRDTEsgPSAlMDh4XG4iLCByZWFkbChNMjRDTEspKTsKKwlzICs9IHNwcmludGYocywgIk1CWENMSyA9ICUwOHhcbiIsIHJlYWRsKE1CWENMSykpOworCXMgKz0gc3ByaW50ZihzLCAiU0RDTEsgPSAlMDh4XG4iLCByZWFkbChTRENMSykpOworCXMgKz0gc3ByaW50ZihzLCAiUElYQ0xLRElWID0gJTA4eFxuIiwgcmVhZGwoUElYQ0xLRElWKSk7CiAKIAlyZXR1cm4gIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLAogCQkJCQliaWdfYnVmZmVyLCBzLWJpZ19idWZmZXIpOwogfQogCitzdGF0aWMgc3NpemVfdCBzZHJhbV9yZWFkX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKiBzID0gYmlnX2J1ZmZlcjsKKworCXMgKz0gc3ByaW50ZihzLCAiTE1SU1QgPSAlMDh4XG4iLCByZWFkbChMTVJTVCkpOworCXMgKz0gc3ByaW50ZihzLCAiTE1DRkcgPSAlMDh4XG4iLCByZWFkbChMTUNGRykpOworCXMgKz0gc3ByaW50ZihzLCAiTE1QV1IgPSAlMDh4XG4iLCByZWFkbChMTVBXUikpOworCXMgKz0gc3ByaW50ZihzLCAiTE1QV1JTVEFUID0gJTA4eFxuIiwgcmVhZGwoTE1QV1JTVEFUKSk7CisJcyArPSBzcHJpbnRmKHMsICJMTUNFTVIgPSAlMDh4XG4iLCByZWFkbChMTUNFTVIpKTsKKwlzICs9IHNwcmludGYocywgIkxNVFlQRSA9ICUwOHhcbiIsIHJlYWRsKExNVFlQRSkpOworCXMgKz0gc3ByaW50ZihzLCAiTE1USU0gPSAlMDh4XG4iLCByZWFkbChMTVRJTSkpOworCXMgKz0gc3ByaW50ZihzLCAiTE1SRUZSRVNIID0gJTA4eFxuIiwgcmVhZGwoTE1SRUZSRVNIKSk7CisJcyArPSBzcHJpbnRmKHMsICJMTVBST1RNSU4gPSAlMDh4XG4iLCByZWFkbChMTVBST1RNSU4pKTsKKwlzICs9IHNwcmludGYocywgIkxNUFJPVE1BWCA9ICUwOHhcbiIsIHJlYWRsKExNUFJPVE1BWCkpOworCXMgKz0gc3ByaW50ZihzLCAiTE1QUk9UQ0ZHID0gJTA4eFxuIiwgcmVhZGwoTE1QUk9UQ0ZHKSk7CisJcyArPSBzcHJpbnRmKHMsICJMTVBST1RFUlIgPSAlMDh4XG4iLCByZWFkbChMTVBST1RFUlIpKTsKKworCXJldHVybiAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsCisJCQkJCWJpZ19idWZmZXIsIHMtYmlnX2J1ZmZlcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1pc2NfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICogcyA9IGJpZ19idWZmZXI7CisKKwlzICs9IHNwcmludGYocywgIkxDRF9DT05GSUcgPSAlMDh4XG4iLCByZWFkbChMQ0RfQ09ORklHKSk7CisJcyArPSBzcHJpbnRmKHMsICJPREZCUFdSID0gJTA4eFxuIiwgcmVhZGwoT0RGQlBXUikpOworCXMgKz0gc3ByaW50ZihzLCAiT0RGQlNUQVQgPSAlMDh4XG4iLCByZWFkbChPREZCU1RBVCkpOworCXMgKz0gc3ByaW50ZihzLCAiSUQgPSAlMDh4XG4iLCByZWFkbChJRCkpOworCisJcmV0dXJuICBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywKKwkJCQkJYmlnX2J1ZmZlciwgcy1iaWdfYnVmZmVyKTsKK30KKworCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXNjb25mX2ZvcHMgPSB7CiAJLnJlYWQgPSBzeXNjb25mX3JlYWRfZmlsZSwKIAkud3JpdGUgPSB3cml0ZV9maWxlX2R1bW15LApAQCAtMTU1LDYgKzE5NCwxNyBAQAogCS5vcGVuID0gb3Blbl9maWxlX2dlbmVyaWMsCiB9OwogCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZHJhbV9mb3BzID0geworCS5yZWFkID0gc2RyYW1fcmVhZF9maWxlLAorCS53cml0ZSA9IHdyaXRlX2ZpbGVfZHVtbXksCisJLm9wZW4gPSBvcGVuX2ZpbGVfZ2VuZXJpYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pc2NfZm9wcyA9IHsKKwkucmVhZCA9IG1pc2NfcmVhZF9maWxlLAorCS53cml0ZSA9IHdyaXRlX2ZpbGVfZHVtbXksCisJLm9wZW4gPSBvcGVuX2ZpbGVfZ2VuZXJpYywKK307CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYnhmYl9kZWJ1Z2ZzX2luaXQoc3RydWN0IGZiX2luZm8gKmZiaSkKIHsKQEAgLTE3Myw2ICsyMjMsMTAgQEAKIAkJCQkgICAgICBmYmksICZkaXNwbGF5X2ZvcHMpOwogCWRiZy0+Z3NjdGwgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJnc2N0bCIsIDA0NDQsIGRiZy0+ZGlyLAogCQkJCSAgICBmYmksICZnc2N0bF9mb3BzKTsKKwlkYmctPnNkcmFtID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2RyYW0iLCAwNDQ0LCBkYmctPmRpciwKKwkJCQkJZmJpLCAmc2RyYW1fZm9wcyk7CisJZGJnLT5taXNjID0gZGVidWdmc19jcmVhdGVfZmlsZSgibWlzYyIsIDA0NDQsIGRiZy0+ZGlyLAorCQkJCQlmYmksICZtaXNjX2ZvcHMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgbWJ4ZmJfZGVidWdmc19yZW1vdmUoc3RydWN0IGZiX2luZm8gKmZiaSkKQEAgLTE4MCw2ICsyMzQsOCBAQAogCXN0cnVjdCBtYnhmYl9pbmZvICptZmJpID0gZmJpLT5wYXI7CiAJc3RydWN0IG1ieGZiX2RlYnVnZnNfZGF0YSAqZGJnID0gbWZiaS0+ZGVidWdmc19kYXRhOwogCisJZGVidWdmc19yZW1vdmUoZGJnLT5taXNjKTsKKwlkZWJ1Z2ZzX3JlbW92ZShkYmctPnNkcmFtKTsKIAlkZWJ1Z2ZzX3JlbW92ZShkYmctPmdzY3RsKTsKIAlkZWJ1Z2ZzX3JlbW92ZShkYmctPmRpc3BsYXkpOwogCWRlYnVnZnNfcmVtb3ZlKGRiZy0+Y2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYngvbWJ4ZmIuYyBiL2RyaXZlcnMvdmlkZW8vbWJ4L21ieGZiLmMKaW5kZXggYTMyZDFhZi4uOTgwZDVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYngvbWJ4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21ieC9tYnhmYi5jCkBAIC0xLDggKzEsMTQgQEAKIC8qCiAgKiAgbGludXgvZHJpdmVycy92aWRlby9tYngvbWJ4ZmIuYwogICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgOEQgVGVjaG5vbG9naWVzIGluYworICogIFJhcGhhZWwgQXNzZW5hdCA8cmFwaEA4ZC5jb20+CisgKiAgCS0gQWRkZWQgdmlkZW8gb3ZlcmxheSBzdXBwb3J0CisgKiAgCS0gVmFyaW91cyBpbXByb3ZlbWVudHMKKyAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2IENvbXB1bGFiLCBMdGQuCiAgKiAgTWlrZSBSYXBvcG9ydCA8bWlrZUBjb21wdWxhYi5jby5pbD4KKyAqICAJLSBDcmVhdGlvbiBvZiBkcml2ZXIKICAqCiAgKiAgIEJhc2VkIG9uIHB4YWZiLmMKICAqCkBAIC0xOSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC0yOSw2ICszNiwxNCBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2aXJ0X2Jhc2VfMjcwMDsKIAorI2RlZmluZSB3cml0ZV9yZWcodmFsLCByZWcpIGRvIHsgd3JpdGVsKCh2YWwpLCAocmVnKSk7IH0gd2hpbGUoMCkKKworLyogV2l0aG91dCB0aGlzIGRlbGF5LCB0aGUgZ3JhcGhpY3MgYXBwZWFycyBzb21laG93IHNjYWxlZCBhbmQKKyAqIHRoZXJlIGlzIGEgbG90IG9mIGppdHRlciBpbiBzY2FubGluZXMuIFRoaXMgZGVsYXkgaXMgcHJvYmFibHkKKyAqIG5lZWRlZCBvbmx5IGFmdGVyIHNldHRpbmcgc29tZSBzcGVjaWZpYyByZWdpc3RlcihzKSBzb21ld2hlcmUsCisgKiBub3QgYWxsIG92ZXIgdGhlIHBsYWNlLi4uICovCisjZGVmaW5lIHdyaXRlX3JlZ19kbHkodmFsLCByZWcpIGRvIHsgd3JpdGVsKCh2YWwpLCByZWcpOyB1ZGVsYXkoMTAwMCk7IH0gd2hpbGUoMCkKKwogI2RlZmluZSBNSU5fWFJFUwkxNgogI2RlZmluZSBNSU5fWVJFUwkxNgogI2RlZmluZSBNQVhfWFJFUwkyMDQ4CkBAIC0yNTcsMTkgKzI3MiwxNyBAQAogCWdzY3RybCAmPSB+KEZNc2soR1NDVFJMX0dTV0lEVEgpIHwgRk1zayhHU0NUUkxfR1NIRUlHSFQpKTsKIAlnc2N0cmwgfD0gR3NjdHJsX1dpZHRoKGluZm8tPnZhci54cmVzKSB8CiAJCUdzY3RybF9IZWlnaHQoaW5mby0+dmFyLnlyZXMpOwotCXdyaXRlbChnc2N0cmwsIEdTQ1RSTCk7Ci0JdWRlbGF5KDEwMDApOworCXdyaXRlX3JlZ19kbHkoZ3NjdHJsLCBHU0NUUkwpOwogCiAJZ3NhZHIgJj0gfihGTXNrKEdTQURSX1NSQ1NUUklERSkpOwogCWdzYWRyIHw9IEdzYWRyX1NyY3N0cmlkZShpbmZvLT52YXIueHJlcyAqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCAvCiAJCQkJICg4ICogMTYpIC0gMSk7Ci0Jd3JpdGVsKGdzYWRyLCBHU0FEUik7Ci0JdWRlbGF5KDEwMDApOworCXdyaXRlX3JlZ19kbHkoZ3NhZHIsIEdTQURSKTsKIAogCS8qIHNldHVwIHRpbWluZ3MgKi8KIAl2YXItPnBpeGNsb2NrID0gbWJ4ZmJfZ2V0X3BpeGNsb2NrKGluZm8tPnZhci5waXhjbG9jaywgJmRpdik7CiAKLQl3cml0ZWwoKERpc3BfUGxsX00oZGl2Lm0pIHwgRGlzcF9QbGxfTihkaXYubikgfAorCXdyaXRlX3JlZ19kbHkoKERpc3BfUGxsX00oZGl2Lm0pIHwgRGlzcF9QbGxfTihkaXYubikgfAogCQlEaXNwX1BsbF9QKGRpdi5wKSB8IERJU1BfUExMX0VOKSwgRElTUFBMTCk7CiAKIAloYnBzID0gdmFyLT5oc3luY19sZW47CkBAIC0yODIsMTggKzI5NSwyMCBAQAogCXZmcHMgPSB2YXMgKyB2YXItPnlyZXM7CiAJdnQgPSB2ZnBzICsgdmFyLT5sb3dlcl9tYXJnaW47CiAKLQl3cml0ZWwoKERodDAxX0hicHMoaGJwcykgfCBEaHQwMV9IdChodCkpLCBESFQwMSk7Ci0Jd3JpdGVsKChEaHQwMl9IbGJzKGhhcykgfCBEaHQwMl9IYXMoaGFzKSksIERIVDAyKTsKLQl3cml0ZWwoKERodDAzX0hmcHMoaGZwcykgfCBEaHQwM19IcmJzKGhmcHMpKSwgREhUMDMpOwotCXdyaXRlbCgoRGhkZXRfSGRlcyhoYXMpIHwgRGhkZXRfSGRlZihoZnBzKSksIERIREVUKTsKKwl3cml0ZV9yZWdfZGx5KChEaHQwMV9IYnBzKGhicHMpIHwgRGh0MDFfSHQoaHQpKSwgREhUMDEpOworCXdyaXRlX3JlZ19kbHkoKERodDAyX0hsYnMoaGFzKSB8IERodDAyX0hhcyhoYXMpKSwgREhUMDIpOworCXdyaXRlX3JlZ19kbHkoKERodDAzX0hmcHMoaGZwcykgfCBEaHQwM19IcmJzKGhmcHMpKSwgREhUMDMpOworCXdyaXRlX3JlZ19kbHkoKERoZGV0X0hkZXMoaGFzKSB8IERoZGV0X0hkZWYoaGZwcykpLCBESERFVCk7CiAKLQl3cml0ZWwoKER2dDAxX1ZicHModmJwcykgfCBEdnQwMV9WdCh2dCkpLCBEVlQwMSk7Ci0Jd3JpdGVsKChEdnQwMl9WdGJzKHZhcykgfCBEdnQwMl9WYXModmFzKSksIERWVDAyKTsKLQl3cml0ZWwoKER2dDAzX1ZmcHModmZwcykgfCBEdnQwM19WYmJzKHZmcHMpKSwgRFZUMDMpOwotCXdyaXRlbCgoRHZkZXRfVmRlcyh2YXMpIHwgRHZkZXRfVmRlZih2ZnBzKSksIERWREVUKTsKLQl3cml0ZWwoKER2ZWN0cmxfVmV2ZW50KHZmcHMpIHwgRHZlY3RybF9WZmV0Y2godmJwcykpLCBEVkVDVFJMKTsKKwl3cml0ZV9yZWdfZGx5KChEdnQwMV9WYnBzKHZicHMpIHwgRHZ0MDFfVnQodnQpKSwgRFZUMDEpOworCXdyaXRlX3JlZ19kbHkoKER2dDAyX1Z0YnModmFzKSB8IER2dDAyX1Zhcyh2YXMpKSwgRFZUMDIpOworCXdyaXRlX3JlZ19kbHkoKER2dDAzX1ZmcHModmZwcykgfCBEdnQwM19WYmJzKHZmcHMpKSwgRFZUMDMpOworCXdyaXRlX3JlZ19kbHkoKER2ZGV0X1ZkZXModmFzKSB8IER2ZGV0X1ZkZWYodmZwcykpLCBEVkRFVCk7CisJd3JpdGVfcmVnX2RseSgoRHZlY3RybF9WZXZlbnQodmZwcykgfCBEdmVjdHJsX1ZmZXRjaCh2YnBzKSksIERWRUNUUkwpOwogCi0Jd3JpdGVsKChyZWFkbChEU0NUUkwpIHwgRFNDVFJMX1NZTkNHRU5fRU4pLCBEU0NUUkwpOworCXdyaXRlX3JlZ19kbHkoKHJlYWRsKERTQ1RSTCkgfCBEU0NUUkxfU1lOQ0dFTl9FTiksIERTQ1RSTCk7CisKKwl3cml0ZV9yZWdfZGx5KERJTlRSRV9WRVZFTlQwX0VOLCBESU5UUkUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMDUsMjMgKzMyMCwyMDMgQEAKIAljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CiAJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgogCWNhc2UgRkJfQkxBTktfTk9STUFMOgotCQl3cml0ZWwoKHJlYWRsKERTQ1RSTCkgJiB+RFNDVFJMX1NZTkNHRU5fRU4pLCBEU0NUUkwpOwotCQl1ZGVsYXkoMTAwMCk7Ci0JCXdyaXRlbCgocmVhZGwoUElYQ0xLKSAmIH5QSVhDTEtfRU4pLCBQSVhDTEspOwotCQl1ZGVsYXkoMTAwMCk7Ci0JCXdyaXRlbCgocmVhZGwoVk9WUkNMSykgJiB+Vk9WUkNMS19FTiksIFZPVlJDTEspOwotCQl1ZGVsYXkoMTAwMCk7CisJCXdyaXRlX3JlZ19kbHkoKHJlYWRsKERTQ1RSTCkgJiB+RFNDVFJMX1NZTkNHRU5fRU4pLCBEU0NUUkwpOworCQl3cml0ZV9yZWdfZGx5KChyZWFkbChQSVhDTEspICYgflBJWENMS19FTiksIFBJWENMSyk7CisJCXdyaXRlX3JlZ19kbHkoKHJlYWRsKFZPVlJDTEspICYgflZPVlJDTEtfRU4pLCBWT1ZSQ0xLKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgotCQl3cml0ZWwoKHJlYWRsKERTQ1RSTCkgfCBEU0NUUkxfU1lOQ0dFTl9FTiksIERTQ1RSTCk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVsKChyZWFkbChQSVhDTEspIHwgUElYQ0xLX0VOKSwgUElYQ0xLKTsKLQkJdWRlbGF5KDEwMDApOworCQl3cml0ZV9yZWdfZGx5KChyZWFkbChEU0NUUkwpIHwgRFNDVFJMX1NZTkNHRU5fRU4pLCBEU0NUUkwpOworCQl3cml0ZV9yZWdfZGx5KChyZWFkbChQSVhDTEspIHwgUElYQ0xLX0VOKSwgUElYQ0xLKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1ieGZiX3NldHVwT3ZlcmxheShzdHJ1Y3QgbWJ4ZmJfb3ZlcmxheVNldHVwICpzZXQpCit7CisJdTMyIHZzY3RybCwgdmJiYXNlLCB2c2NhZHIsIHZzYWRyOworCXUzMiBzc3NpemUsIHNwb2N0cmwsIHN2Y3RybCwgc2hjdHJsOworCXUzMiB2dWJhc2UsIHZ2YmFzZTsKKwl1MzIgdm92cmNsazsKKworCWlmIChzZXQtPnNjYWxlZF93aWR0aD09MCB8fCBzZXQtPnNjYWxlZF9oZWlnaHQ9PTApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogcmVhZCByZWdpc3RlcnMgd2hpY2ggaGF2ZSByZXNlcnZlZCBiaXRzCisJICogc28gd2UgY2FuIHdyaXRlIHRoZW0gYmFjayBhcy1pcy4gKi8KKwl2b3ZyY2xrID0gcmVhZGwoVk9WUkNMSyk7CisJdnNjdHJsID0gcmVhZGwoVlNDVFJMKTsKKwl2c2NhZHIgPSByZWFkbChWU0NBRFIpOworCXZ1YmFzZSA9IHJlYWRsKFZVQkFTRSk7CisJdnZiYXNlID0gcmVhZGwoVlZCQVNFKTsKKworCXNwb2N0cmwgPSByZWFkbChTUE9DVFJMKTsKKwlzc3NpemUgPSByZWFkbChTU1NJWkUpOworCisKKwl2YmJhc2UgPSBWYmJhc2VfR2xhbHBoYShzZXQtPmFscGhhKTsKKworCXZzY3RybCAmPSB+KAlGTXNrKFZTQ1RSTF9WU1dJRFRIKSB8CisJCQkJCUZNc2soVlNDVFJMX1ZTSEVJR0hUKSB8CisJCQkJCUZNc2soVlNDVFJMX1ZQSVhGTVQpIHwKKwkJCQkJVlNDVFJMX0dBTU1BX0VOIHwgVlNDVFJMX0NTQ19FTiB8CisJCQkJCVZTQ1RSTF9DT1NJVEVEICk7CisJdnNjdHJsIHw9IFZzY3RybF9XaWR0aChzZXQtPndpZHRoKSB8IFZzY3RybF9IZWlnaHQoc2V0LT5oZWlnaHQpIHwKKwkJCQlWU0NUUkxfQ1NDX0VOOworCisJdnNjYWRyICY9IH4oVlNDQURSX1NUUl9FTiB8IFZTQ0FEUl9DT0xLRVlfRU4gfCBWU0NBRFJfQ09MS0VZU1JDIHwKKwkJCQlGTXNrKFZTQ0FEUl9CTEVORF9NKSB8IEZNc2soVlNDQURSX0JMRU5EX1BPUykgfAorCQkJCUZNc2soVlNDQURSX1ZCQVNFX0FEUikgKTsKKwl2dWJhc2UgJj0gfihWVUJBU0VfVVZIQUxGU1RSIHwgRk1zayhWVUJBU0VfVUJBU0VfQURSKSk7CisJdnZiYXNlICY9IH4oRk1zayhWVkJBU0VfVkJBU0VfQURSKSk7CisKKwlzd2l0Y2ggKHNldC0+Zm10KQorCXsKKwkJY2FzZSBNQlhGQl9GTVRfWVVWMTI6CisJCQl2c2N0cmwgfD0gVlNDVFJMX1ZQSVhGTVRfWVVWMTI7CisKKwkJCXNldC0+WV9zdHJpZGUgPSAoKHNldC0+d2lkdGgpICsgMHhmICkgJiB+MHhmOworCisJCQlicmVhazsKKwkJY2FzZSBNQlhGQl9GTVRfVVkwVlkxOgorCQkJdnNjdHJsIHw9IFZTQ1RSTF9WUElYRk1UX1VZMFZZMTsKKwkJCXNldC0+WV9zdHJpZGUgPSAoc2V0LT53aWR0aCoyICsgMHhmICkgJiB+MHhmOworCQkJYnJlYWs7CisJCWNhc2UgTUJYRkJfRk1UX1ZZMFVZMToKKwkJCXZzY3RybCB8PSBWU0NUUkxfVlBJWEZNVF9WWTBVWTE7CisJCQlzZXQtPllfc3RyaWRlID0gKHNldC0+d2lkdGgqMiArIDB4ZiApICYgfjB4ZjsKKwkJCWJyZWFrOworCQljYXNlIE1CWEZCX0ZNVF9ZMFVZMVY6CisJCQl2c2N0cmwgfD0gVlNDVFJMX1ZQSVhGTVRfWTBVWTFWOworCQkJc2V0LT5ZX3N0cmlkZSA9IChzZXQtPndpZHRoKjIgKyAweGYgKSAmIH4weGY7CisJCQlicmVhazsKKwkJY2FzZSBNQlhGQl9GTVRfWTBWWTFVOgorCQkJdnNjdHJsIHw9IFZTQ1RSTF9WUElYRk1UX1kwVlkxVTsKKwkJCXNldC0+WV9zdHJpZGUgPSAoc2V0LT53aWR0aCoyICsgMHhmICkgJiB+MHhmOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWU0NUUkwgaGFzIHRoZSBiaXRzIHdoaWNoIHNldHMgdGhlIFZpZGVvIFBpeGVsIEZvcm1hdC4KKwkgKiBXaGVuIHBhc3NpbmcgZnJvbSBhIHBhY2tlZCB0byBwbGFuYXIgZm9ybWF0LAorCSAqIGlmIHdlIHdyaXRlIFZTQ1RSTCBmaXJzdCwgVlZCQVNFIGFuZCBWVUJBU0Ugd291bGQKKwkgKiBiZSB6ZXJvIGlmIHdlIHdvdWxkIG5vdCBzZXQgdGhlbSBoZXJlLiAoQW5kIHRoZW4sCisJICogdGhlIGNoaXBzIGhhbmdzIGFuZCBvbmx5IGEgcmVzZXQgc2VlbXMgdG8gZml4IGl0KS4KKwkgKgorCSAqIElmIGNvdXJzZSwgdGhlIHZhbHVlcyBjYWxjdWxhdGVkIGhlcmUgaGF2ZSBubyBtZWFuaW5nCisJICogZm9yIHBhY2tlZCBmb3JtYXRzLgorCSAqLworCXNldC0+VVZfc3RyaWRlID0gKChzZXQtPndpZHRoLzIpICsgMHg3ICkgJiB+MHg3OworCQlzZXQtPlVfb2Zmc2V0ID0gc2V0LT5oZWlnaHQgKiBzZXQtPllfc3RyaWRlOworCQlzZXQtPlZfb2Zmc2V0ID0gc2V0LT5VX29mZnNldCArCisJCQkJCQlzZXQtPmhlaWdodCAqIHNldC0+VVZfc3RyaWRlOworCXZ1YmFzZSB8PSBWdWJhc2VfVWJhc2VfQWRyKAorCQkJKDB4NjAwMDAgKyBzZXQtPm1lbV9vZmZzZXQgKyBzZXQtPlVfb2Zmc2V0KT4+Myk7CisJdnZiYXNlIHw9IFZ2YmFzZV9WYmFzZV9BZHIoCisJCQkoMHg2MDAwMCArIHNldC0+bWVtX29mZnNldCArIHNldC0+Vl9vZmZzZXQpPj4zKTsKKworCisJdnNjYWRyIHw9IFZTQ0FEUl9CTEVORF9WSUQgfCBWU0NBRFJfQkxFTkRfR0xPQiB8CisJCVZzY2Fkcl9WYmFzZV9BZHIoKDB4NjAwMDAgKyBzZXQtPm1lbV9vZmZzZXQpPj40KTsKKworCWlmIChzZXQtPmVuYWJsZSkKKwkJdnNjYWRyIHw9IFZTQ0FEUl9TVFJfRU47CisKKworCXZzYWRyID0gVnNhZHJfU3Jjc3RyaWRlKChzZXQtPllfc3RyaWRlKS8xNi0xKSB8CisJCVZzYWRyX1hzdGFydChzZXQtPngpIHwgVnNhZHJfWXN0YXJ0KHNldC0+eSk7CisKKwlzc3NpemUgJj0gfihGTXNrKFNTU0laRV9TQ19XSURUSCkgfCBGTXNrKFNTU0laRV9TQ19IRUlHSFQpKTsKKwlzc3NpemUgPSBTc3NpemVfU2NfV2lkdGgoc2V0LT5zY2FsZWRfd2lkdGgtMSkgfAorCQkJU3NzaXplX1NjX0hlaWdodChzZXQtPnNjYWxlZF9oZWlnaHQtMSk7CisKKwlzcG9jdHJsICY9IH4oU1BPQ1RSTF9IX1NDX0JQIHwgU1BPQ1RSTF9WX1NDX0JQIHwKKwkJCVNQT0NUUkxfSFZfU0NfT1IgfCBTUE9DVFJMX1ZTX1VSX0MgfAorCQkJRk1zayhTUE9DVFJMX1ZPUkRFUikgfCBGTXNrKFNQT0NUUkxfVlBJVENIKSk7CisJc3BvY3RybCA9IFNwb2N0cmxfVnBpdGNoKChzZXQtPmhlaWdodDw8MTEpL3NldC0+c2NhbGVkX2hlaWdodCkKKwkJCQkJCQl8IFNQT0NUUkxfVk9SREVSXzJUQVA7CisKKwkvKiBCeXBhc3MgaG9yaXovdmVydCBzY2FsZXIgd2hlbiBzYW1lIHNpemUgKi8KKwlpZiAoc2V0LT5zY2FsZWRfd2lkdGggPT0gc2V0LT53aWR0aCkKKwkJc3BvY3RybCB8PSBTUE9DVFJMX0hfU0NfQlA7CisJaWYgKHNldC0+c2NhbGVkX2hlaWdodCA9PSBzZXQtPmhlaWdodCkKKwkJc3BvY3RybCB8PSBTUE9DVFJMX1ZfU0NfQlA7CisKKwlzdmN0cmwgPSBTdmN0cmxfSW5pdGlhbDEoMTw8MTApIHwgU3ZjdHJsX0luaXRpYWwyKDE8PDEwKTsKKworCXNoY3RybCA9IFNoY3RybF9IaW5pdGlhbCg0PDwxMSkKKwkJCXwgU2hjdHJsX0hwaXRjaCgoc2V0LT53aWR0aDw8MTEpL3NldC0+c2NhbGVkX3dpZHRoKTsKKworCS8qIFZpZGVvIHBsYW5lIHJlZ2lzdGVycyAqLworCXdyaXRlX3JlZyh2c2N0cmwsIFZTQ1RSTCk7CisJd3JpdGVfcmVnKHZiYmFzZSwgVkJCQVNFKTsKKwl3cml0ZV9yZWcodnNjYWRyLCBWU0NBRFIpOworCXdyaXRlX3JlZyh2dWJhc2UsIFZVQkFTRSk7CisJd3JpdGVfcmVnKHZ2YmFzZSwgVlZCQVNFKTsKKwl3cml0ZV9yZWcodnNhZHIsIFZTQURSKTsKKworCS8qIFZpZGVvIHNjYWxlciByZWdpc3RlcnMgKi8KKwl3cml0ZV9yZWcoc3NzaXplLCBTU1NJWkUpOworCXdyaXRlX3JlZyhzcG9jdHJsLCBTUE9DVFJMKTsKKwl3cml0ZV9yZWcoc3ZjdHJsLCBTVkNUUkwpOworCXdyaXRlX3JlZyhzaGN0cmwsIFNIQ1RSTCk7CisKKwkvKiBSQVBIOiBVc2luZyB0aG9zZSBjb2VmZmljaWVudHMsIHRoZSBzY2FsZWQKKwkgKiBpbWFnZSBpcyBxdWl0ZSBibHVycnkuIEkgZG9udCBrbm93IGhvdworCSAqIHRvIGltcHJvdmUgdGhlbSA7IFRoZSBjaGlwIGRvY3VtZW50YXRpb24KKwkgKiB3YXMgbm90IGhlbHBmdWwuLiAqLworCXdyaXRlX3JlZygweDIxMjEyMTIxLCBWU0NPRUZGMCk7CisJd3JpdGVfcmVnKDB4MjEyMTIxMjEsIFZTQ09FRkYxKTsKKwl3cml0ZV9yZWcoMHgyMTIxMjEyMSwgVlNDT0VGRjIpOworCXdyaXRlX3JlZygweDIxMjEyMTIxLCBWU0NPRUZGMyk7CisJd3JpdGVfcmVnKDB4MjEyMTIxMjEsIFZTQ09FRkY0KTsKKwl3cml0ZV9yZWcoMHgwMDAwMDAwMCwgSFNDT0VGRjApOworCXdyaXRlX3JlZygweDAwMDAwMDAwLCBIU0NPRUZGMSk7CisJd3JpdGVfcmVnKDB4MDAwMDAwMDAsIEhTQ09FRkYyKTsKKwl3cml0ZV9yZWcoMHgwMzAyMDIwMSwgSFNDT0VGRjMpOworCXdyaXRlX3JlZygweDA5MDcwNjA0LCBIU0NPRUZGNCk7CisJd3JpdGVfcmVnKDB4MGYwZTBjMGEsIEhTQ09FRkY1KTsKKwl3cml0ZV9yZWcoMHgxNTE0MTIxMSwgSFNDT0VGRjYpOworCXdyaXRlX3JlZygweDE5MTgxNzE2LCBIU0NPRUZGNyk7CisJd3JpdGVfcmVnKDB4MDAwMDAwMTksIEhTQ09FRkY4KTsKKworCS8qIENsb2NrICovCisJaWYgKHNldC0+ZW5hYmxlKQorCQl2b3ZyY2xrIHw9IDE7CisJZWxzZQorCQl2b3ZyY2xrICY9IH4xOworCisJd3JpdGVfcmVnKHZvdnJjbGssIFZPVlJDTEspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWJ4ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1ieGZiX292ZXJsYXlTZXR1cCBzZXR1cDsKKwlpbnQgcmVzOworCisJaWYgKGNtZCA9PSBNQlhGQl9JT0NYX09WRVJMQVkpCisJeworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNldHVwLCAodm9pZCBfX3VzZXIqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBtYnhmYl9vdmVybGF5U2V0dXApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJlcyA9IG1ieGZiX3NldHVwT3ZlcmxheSgmc2V0dXApOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciopYXJnLCAmc2V0dXAsCisJCQkJCXNpemVvZihzdHJ1Y3QgbWJ4ZmJfb3ZlcmxheVNldHVwKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIG1ieGZiX29wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZmJfY2hlY2tfdmFyID0gbWJ4ZmJfY2hlY2tfdmFyLApAQCAtMzMxLDYgKzUyNiw3IEBACiAJLmZiX2NvcHlhcmVhID0gY2ZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQgPSBjZmJfaW1hZ2VibGl0LAogCS5mYl9ibGFuayA9IG1ieGZiX2JsYW5rLAorCS5mYl9pb2N0bCA9IG1ieGZiX2lvY3RsLAogfTsKIAogLyoKQEAgLTMzOSwzNiArNTM1LDI5IEBACiAqLwogc3RhdGljIHZvaWQgX19kZXZpbml0IHNldHVwX21lbWMoc3RydWN0IGZiX2luZm8gKmZiaSkKIHsKLQlzdHJ1Y3QgbWJ4ZmJfaW5mbyAqbWZiaSA9IGZiaS0+cGFyOwogCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCBpOwogCiAJLyogRklYTUU6IHVzZSBwbGF0ZnJvbSBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCiAJLyogc2V0dXAgU0RSQU0gY29udHJvbGxlciAqLwotCXdyaXRlbCgoTE1DRkdfTE1DX0RTIHwgTE1DRkdfTE1DX1RTIHwgTE1DRkdfTE1EX1RTIHwKKwl3cml0ZV9yZWdfZGx5KChMTUNGR19MTUNfRFMgfCBMTUNGR19MTUNfVFMgfCBMTUNGR19MTURfVFMgfAogCQlMTUNGR19MTUFfVFMpLAogCSAgICAgICBMTUNGRyk7Ci0JdWRlbGF5KDEwMDApOwogCi0Jd3JpdGVsKExNUFdSX01DX1BXUl9BQ1QsIExNUFdSKTsKLQl1ZGVsYXkoMTAwMCk7CisJd3JpdGVfcmVnX2RseShMTVBXUl9NQ19QV1JfQUNULCBMTVBXUik7CiAKIAkvKiBzZXR1cCBTRFJBTSB0aW1pbmdzICovCi0Jd3JpdGVsKChMbXRpbV9UcmFzKDcpIHwgTG10aW1fVHJwKDMpIHwgTG10aW1fVHJjZCgzKSB8CisJd3JpdGVfcmVnX2RseSgoTG10aW1fVHJhcyg3KSB8IExtdGltX1RycCgzKSB8IExtdGltX1RyY2QoMykgfAogCQlMbXRpbV9UcmMoOSkgfCBMbXRpbV9UZHBsKDIpKSwKIAkgICAgICAgTE1USU0pOwotCXVkZWxheSgxMDAwKTsKIAkvKiBzZXR1cCBTRFJBTSByZWZyZXNoIHJhdGUgKi8KLQl3cml0ZWwoMHhjMmIsIExNUkVGUkVTSCk7Ci0JdWRlbGF5KDEwMDApOworCXdyaXRlX3JlZ19kbHkoMHhjMmIsIExNUkVGUkVTSCk7CiAJLyogc2V0dXAgU0RSQU0gdHlwZSBwYXJhbWV0ZXJzICovCi0Jd3JpdGVsKChMTVRZUEVfQ0FTTEFUXzMgfCBMTVRZUEVfQktTWl8yIHwgTE1UWVBFX1JPV1NaXzExIHwKKwl3cml0ZV9yZWdfZGx5KChMTVRZUEVfQ0FTTEFUXzMgfCBMTVRZUEVfQktTWl8yIHwgTE1UWVBFX1JPV1NaXzExIHwKIAkJTE1UWVBFX0NPTFNaXzgpLAogCSAgICAgICBMTVRZUEUpOwotCXVkZWxheSgxMDAwKTsKIAkvKiBlbmFibGUgbWVtb3J5IGNvbnRyb2xsZXIgKi8KLQl3cml0ZWwoTE1QV1JfTUNfUFdSX0FDVCwgTE1QV1IpOwotCXVkZWxheSgxMDAwKTsKKwl3cml0ZV9yZWdfZGx5KExNUFdSX01DX1BXUl9BQ1QsIExNUFdSKTsKIAogCS8qIHBlcmZvcm0gZHVtbXkgcmVhZHMgKi8KIAlmb3IgKCBpID0gMDsgaSA8IDE2OyBpKysgKSB7CkBAIC0zNzksMzQgKzU2OCwzMCBAQAogc3RhdGljIHZvaWQgZW5hYmxlX2Nsb2NrcyhzdHJ1Y3QgZmJfaW5mbyAqZmJpKQogewogCS8qIGVuYWJsZSBjbG9ja3MgKi8KLQl3cml0ZWwoU1lTQ0xLU1JDX1BMTF8yLCBTWVNDTEtTUkMpOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoUElYQ0xLU1JDX1BMTF8xLCBQSVhDTEtTUkMpOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoMHgwMDAwMDAwMCwgQ0xLU0xFRVApOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoKENvcmVfUGxsX00oMHgxNykgfCBDb3JlX1BsbF9OKDB4MykgfCBDb3JlX1BsbF9QKDB4MCkgfAorCXdyaXRlX3JlZ19kbHkoU1lTQ0xLU1JDX1BMTF8yLCBTWVNDTEtTUkMpOworCXdyaXRlX3JlZ19kbHkoUElYQ0xLU1JDX1BMTF8xLCBQSVhDTEtTUkMpOworCXdyaXRlX3JlZ19kbHkoMHgwMDAwMDAwMCwgQ0xLU0xFRVApOworCisJLyogUExMIG91dHB1dCA9IChGcmVmY2xrICogTSkgLyAoTiAqIDJeUCApCisJICoKKwkgKiBNOiAweDE3LCBOOiAweDMsIFA6IDB4MCA9PSAxMDAgTWh6IQorCSAqIE06IDB4YiwgTjogMHgxLCBQOiAweDEgPT0gNzEgTWh6CisJICogKi8KKwl3cml0ZV9yZWdfZGx5KChDb3JlX1BsbF9NKDB4YikgfCBDb3JlX1BsbF9OKDB4MSkgfCBDb3JlX1BsbF9QKDB4MSkgfAogCQlDT1JFX1BMTF9FTiksCiAJICAgICAgIENPUkVQTEwpOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoKERpc3BfUGxsX00oMHgxYikgfCBEaXNwX1BsbF9OKDB4NykgfCBEaXNwX1BsbF9QKDB4MSkgfAorCisJd3JpdGVfcmVnX2RseSgoRGlzcF9QbGxfTSgweDFiKSB8IERpc3BfUGxsX04oMHg3KSB8IERpc3BfUGxsX1AoMHgxKSB8CiAJCURJU1BfUExMX0VOKSwKIAkgICAgICAgRElTUFBMTCk7CiAKLQl3cml0ZWwoMHgwMDAwMDAwMCwgVk9WUkNMSyk7Ci0JdWRlbGF5KDEwMDApOwotCXdyaXRlbChQSVhDTEtfRU4sIFBJWENMSyk7Ci0JdWRlbGF5KDEwMDApOwotCXdyaXRlbChNRU1DTEtfRU4sIE1FTUNMSyk7Ci0JdWRlbGF5KDEwMDApOwotCXdyaXRlbCgweDAwMDAwMDA2LCBNMjRDTEspOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoMHgwMDAwMDAwNiwgTUJYQ0xLKTsKLQl1ZGVsYXkoMTAwMCk7Ci0Jd3JpdGVsKFNEQ0xLX0VOLCBTRENMSyk7Ci0JdWRlbGF5KDEwMDApOwotCXdyaXRlbCgweDAwMDAwMDAxLCBQSVhDTEtESVYpOwotCXVkZWxheSgxMDAwKTsKKwl3cml0ZV9yZWdfZGx5KDB4MDAwMDAwMDAsIFZPVlJDTEspOworCXdyaXRlX3JlZ19kbHkoUElYQ0xLX0VOLCBQSVhDTEspOworCXdyaXRlX3JlZ19kbHkoTUVNQ0xLX0VOLCBNRU1DTEspOworCXdyaXRlX3JlZ19kbHkoMHgwMDAwMDAwNiwgTTI0Q0xLKTsKKwl3cml0ZV9yZWdfZGx5KDB4MDAwMDAwMDYsIE1CWENMSyk7CisJd3JpdGVfcmVnX2RseShTRENMS19FTiwgU0RDTEspOworCXdyaXRlX3JlZ19kbHkoMHgwMDAwMDAwMSwgUElYQ0xLRElWKTsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHNldHVwX2dyYXBoaWNzKHN0cnVjdCBmYl9pbmZvICpmYmkpCkBAIC00MzAsMTYgKzYxNSwxMSBAQAogCQlicmVhazsKIAl9CiAKLQl3cml0ZWwoZ3NjdHJsLCBHU0NUUkwpOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoMHgwMDAwMDAwMCwgR0JCQVNFKTsKLQl1ZGVsYXkoMTAwMCk7Ci0Jd3JpdGVsKDB4MDBmZmZmZmYsIEdEUkNUUkwpOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoKEdTQ0FEUl9TVFJfRU4gfCBHc2NhZHJfR2Jhc2VfQWRyKDB4NjAwMCkpLCBHU0NBRFIpOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoMHgwMDAwMDAwMCwgR1BMVVQpOwotCXVkZWxheSgxMDAwKTsKKwl3cml0ZV9yZWdfZGx5KGdzY3RybCwgR1NDVFJMKTsKKwl3cml0ZV9yZWdfZGx5KDB4MDAwMDAwMDAsIEdCQkFTRSk7CisJd3JpdGVfcmVnX2RseSgweDAwZmZmZmZmLCBHRFJDVFJMKTsKKwl3cml0ZV9yZWdfZGx5KChHU0NBRFJfU1RSX0VOIHwgR3NjYWRyX0diYXNlX0FkcigweDYwMDApKSwgR1NDQURSKTsKKwl3cml0ZV9yZWdfZGx5KDB4MDAwMDAwMDAsIEdQTFVUKTsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHNldHVwX2Rpc3BsYXkoc3RydWN0IGZiX2luZm8gKmZiaSkKQEAgLTQ1MSwxNyArNjMxLDE0IEBACiAJCWRzY3RybCB8PSBEU0NUUkxfSFNfUE9MOwogCWlmIChmYmktPnZhci5zeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKQogCQlkc2N0cmwgfD0gRFNDVFJMX1ZTX1BPTDsKLQl3cml0ZWwoZHNjdHJsLCBEU0NUUkwpOwotCXVkZWxheSgxMDAwKTsKLQl3cml0ZWwoMHhkMDMwMzAxMCwgRE1DVFJMKTsKLQl1ZGVsYXkoMTAwMCk7Ci0Jd3JpdGVsKChyZWFkbChEU0NUUkwpIHwgRFNDVFJMX1NZTkNHRU5fRU4pLCBEU0NUUkwpOworCXdyaXRlX3JlZ19kbHkoZHNjdHJsLCBEU0NUUkwpOworCXdyaXRlX3JlZ19kbHkoMHhkMDMwMzAxMCwgRE1DVFJMKTsKKwl3cml0ZV9yZWdfZGx5KChyZWFkbChEU0NUUkwpIHwgRFNDVFJMX1NZTkNHRU5fRU4pLCBEU0NUUkwpOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgZW5hYmxlX2NvbnRyb2xsZXIoc3RydWN0IGZiX2luZm8gKmZiaSkKIHsKLQl3cml0ZWwoU1lTUlNUX1JTVCwgU1lTUlNUKTsKLQl1ZGVsYXkoMTAwMCk7CisJd3JpdGVfcmVnX2RseShTWVNSU1RfUlNULCBTWVNSU1QpOwogCiAKIAllbmFibGVfY2xvY2tzKGZiaSk7CkBAIC00NzgsMTIgKzY1NSwxMiBAQAogc3RhdGljIGludCBtYnhmYl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCS8qIG1ha2UgZnJhbWUgYnVmZmVyIG1lbW9yeSBlbnRlciBzZWxmLXJlZnJlc2ggbW9kZSAqLwotCXdyaXRlbChMTVBXUl9NQ19QV1JfU1JNLCBMTVBXUik7CisJd3JpdGVfcmVnX2RseShMTVBXUl9NQ19QV1JfU1JNLCBMTVBXUik7CiAJd2hpbGUgKExNUFdSU1RBVCAhPSBMTVBXUlNUQVRfTUNfUFdSX1NSTSkKIAkJOyAvKiBlbXB0eSBzdGF0ZW1lbnQgKi8KIAogCS8qIHJlc2V0IHRoZSBkZXZpY2UsIHNpbmNlIGl0J3MgaW5pdGlhbCBzdGF0ZSBpcyAnbW9zdGx5IHNsZWVwaW5nJyAqLwotCXdyaXRlbChTWVNSU1RfUlNULCBTWVNSU1QpOworCXdyaXRlX3JlZ19kbHkoU1lTUlNUX1JTVCwgU1lTUlNUKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDk1LDcgKzY3Miw3IEBACiAvKiAJc2V0dXBfZ3JhcGhpY3MoZmJpKTsgKi8KIC8qIAlzZXR1cF9kaXNwbGF5KGZiaSk7ICovCiAKLQl3cml0ZWwoKHJlYWRsKERTQ1RSTCkgfCBEU0NUUkxfU1lOQ0dFTl9FTiksIERTQ1RSTCk7CisJd3JpdGVfcmVnX2RseSgocmVhZGwoRFNDVFJMKSB8IERTQ1RSTF9TWU5DR0VOX0VOKSwgRFNDVFJMKTsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCkBAIC01MjAsNiArNjk3LDEyIEBACiAKIAlkZXZfZGJnKGRldiwgIm1ieGZiX3Byb2JlXG4iKTsKIAorCXBkYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAicGxhdGZvcm0gZGF0YSBpcyByZXF1aXJlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWZiaSA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgbWJ4ZmJfaW5mbyksICZkZXYtPmRldik7CiAJaWYgKGZiaSA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiZnJhbWVidWZmZXJfYWxsb2MgZmFpbGVkXG4iKTsKQEAgLTUyOCw3ICs3MTEsOCBAQAogCiAJbWZiaSA9IGZiaS0+cGFyOwogCWZiaS0+cHNldWRvX3BhbGV0dGUgPSBtZmJpLT5wc2V1ZG9fcGFsZXR0ZTsKLQlwZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwogCWlmIChwZGF0YS0+cHJvYmUpCiAJCW1mYmktPnBsYXRmb3JtX3Byb2JlID0gcGRhdGEtPnByb2JlOwogCWlmIChwZGF0YS0+cmVtb3ZlKQpAQCAtNTc4LDE2ICs3NjIsMTYgQEAKIAkJZ290byBlcnI0OwogCX0KIAotCS8qIEZJWE1FOiBnZXQgZnJvbSBwbGF0Zm9ybSAqLwogCWZiaS0+c2NyZWVuX2Jhc2UgPSAoY2hhciBfX2lvbWVtICopKG1mYmktPmZiX3ZpcnRfYWRkciArIDB4NjAwMDApOwotCWZiaS0+c2NyZWVuX3NpemUgPSA4ICogMTAyNCAqIDEwMjQ7CS8qIDggTWVncyAqLworCWZiaS0+c2NyZWVuX3NpemUgPSBwZGF0YS0+bWVtc2l6ZTsKIAlmYmktPmZib3BzID0gJm1ieGZiX29wczsKIAogCWZiaS0+dmFyID0gbWJ4ZmJfZGVmYXVsdDsKIAlmYmktPmZpeCA9IG1ieGZiX2ZpeDsKIAlmYmktPmZpeC5zbWVtX3N0YXJ0ID0gbWZiaS0+ZmJfcGh5c19hZGRyICsgMHg2MDAwMDsKLQlmYmktPmZpeC5zbWVtX2xlbiA9IDggKiAxMDI0ICogMTAyNDsKLQlmYmktPmZpeC5saW5lX2xlbmd0aCA9IDY0MCAqIDI7CisJZmJpLT5maXguc21lbV9sZW4gPSBwZGF0YS0+bWVtc2l6ZTsKKwlmYmktPmZpeC5saW5lX2xlbmd0aCA9IG1ieGZiX2RlZmF1bHQueHJlc192aXJ0dWFsICoKKwkJCQkJbWJ4ZmJfZGVmYXVsdC5iaXRzX3Blcl9waXhlbCAvIDg7CiAKIAlyZXQgPSBmYl9hbGxvY19jbWFwKCZmYmktPmNtYXAsIDI1NiwgMCk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTYzNiw4ICs4MjAsNyBAQAogewogCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCi0Jd3JpdGVsKFNZU1JTVF9SU1QsIFNZU1JTVCk7Ci0JdWRlbGF5KDEwMDApOworCXdyaXRlX3JlZ19kbHkoU1lTUlNUX1JTVCwgU1lTUlNUKTsKIAogCW1ieGZiX2RlYnVnZnNfcmVtb3ZlKGZiaSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWJ4L3JlZ19iaXRzLmggYi9kcml2ZXJzL3ZpZGVvL21ieC9yZWdfYml0cy5oCmluZGV4IGMyMjZhOGUuLjlhMjRmYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWJ4L3JlZ19iaXRzLmgKKysrIGIvZHJpdmVycy92aWRlby9tYngvcmVnX2JpdHMuaApAQCAtMjQyLDYgKzI0Miw2NyBAQAogI2RlZmluZSBHUExVVF9MVVREQVRBCUZsZCgyNCwwKQogI2RlZmluZSBHcGx1dF9MdXRkYXRhKHgpCSgoeCkgPDwgRlNoZnQoR1BMVVRfTFVUREFUQSkpCiAKKy8qIFZTQ1RSTCAtIFZpZGVvIFN1cmZhY2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBWU0NUUkxfVlBJWEZNVAkJRmxkKDQsMjcpCisjZGVmaW5lIFZTQ1RSTF9WUElYRk1UX1lVVjEyCSgoMHg5KSA8PCBGU2hmdChWU0NUUkxfVlBJWEZNVCkpCisjZGVmaW5lIFZTQ1RSTF9WUElYRk1UX1VZMFZZMQkoKDB4YykgPDwgRlNoZnQoVlNDVFJMX1ZQSVhGTVQpKQorI2RlZmluZSBWU0NUUkxfVlBJWEZNVF9WWTBVWTEJKCgweGQpIDw8IEZTaGZ0KFZTQ1RSTF9WUElYRk1UKSkKKyNkZWZpbmUgVlNDVFJMX1ZQSVhGTVRfWTBVWTFWCSgoMHhlKSA8PCBGU2hmdChWU0NUUkxfVlBJWEZNVCkpCisjZGVmaW5lIFZTQ1RSTF9WUElYRk1UX1kwVlkxVQkoKDB4ZikgPDwgRlNoZnQoVlNDVFJMX1ZQSVhGTVQpKQorI2RlZmluZSBWU0NUUkxfR0FNTUFfRU4JCSgxIDw8IDI2KQorI2RlZmluZSBWU0NUUkxfQ1NDX0VOCQkoMSA8PCAyNSkKKyNkZWZpbmUgVlNDVFJMX0NPU0lURUQJCSgxIDw8IDIyKQorI2RlZmluZSBWU0NUUkxfVlNXSURUSAkJRmxkKDExLDExKQorI2RlZmluZSBWc2N0cmxfV2lkdGgoUGl4ZWxzKSAvKiBWaWRlbyBXaWR0aCBbMS0yMDQ4XSAqLyBcCisJCQkoKChQaXhlbHMpIC0gMSkgPDwgRlNoZnQoVlNDVFJMX1ZTV0lEVEgpKQorI2RlZmluZSBWU0NUUkxfVlNIRUlHSFQJCUZsZCgxMSwwKQorI2RlZmluZSBWc2N0cmxfSGVpZ2h0KFBpeGVscykgLyogVmlkZW8gSGVpZ2h0IFsxLTIwNDhdICovIFwKKwkJCSgoKFBpeGVscykgLSAxKSA8PCBGU2hmdChWU0NUUkxfVlNIRUlHSFQpKQorCisvKiBWQkJBU0UgLSBWaWRlbyBCbGVuZGluZyBCYXNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFZCQkFTRV9HTEFMUEhBCQlGbGQoOCwyNCkKKyNkZWZpbmUgVmJiYXNlX0dsYWxwaGEoeCkJKCh4KSA8PCBGU2hmdChWQkJBU0VfR0xBTFBIQSkpCisKKyNkZWZpbmUgVkJCQVNFX0NPTEtFWQkJRmxkKDI0LDApCisjZGVmaW5lIFZiYmFzZV9Db2xrZXkoeCkJKCh4KSA8PCBGU2hmdChWQkJBU0VfQ09MS0VZKSkKKworLyogVkNNU0sgLSBWaWRlbyBDb2xvciBLZXkgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBWQ01TS19DT0xLRVlfTQkJRmxkKDI0LDApCisjZGVmaW5lIFZjbXNrX2NvbGtleV9tKHgpCSgoeCkgPDwgRlNoZnQoVkNNU0tfQ09MS0VZX00pKQorCisvKiBWU0NBRFIgLSBWaWRlbyBTdHJlYW0gQ29udHJvbCBSZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFZTQ0FEUl9TVFJfRU4JCSgxIDw8IDMxKQorI2RlZmluZSBWU0NBRFJfQ09MS0VZX0VOCSgxIDw8IDMwKQorI2RlZmluZSBWU0NBRFJfQ09MS0VZU1JDCSgxIDw8IDI5KQorI2RlZmluZSBWU0NBRFJfQkxFTkRfTQkJRmxkKDIsMjcpCisjZGVmaW5lIFZTQ0FEUl9CTEVORF9OT05FCSgoMHgwKSA8PCBGU2hmdChWU0NBRFJfQkxFTkRfTSkpCisjZGVmaW5lIFZTQ0FEUl9CTEVORF9JTlYJKCgweDEpIDw8IEZTaGZ0KFZTQ0FEUl9CTEVORF9NKSkKKyNkZWZpbmUgVlNDQURSX0JMRU5EX0dMT0IJKCgweDIpIDw8IEZTaGZ0KFZTQ0FEUl9CTEVORF9NKSkKKyNkZWZpbmUgVlNDQURSX0JMRU5EX1BJWAkoKDB4MykgPDwgRlNoZnQoVlNDQURSX0JMRU5EX00pKQorI2RlZmluZSBWU0NBRFJfQkxFTkRfUE9TCUZsZCgyLDI0KQorI2RlZmluZSBWU0NBRFJfQkxFTkRfR0ZYCSgoMHgwKSA8PCBGU2hmdChWU0NBRFJfQkxFTkRfUE9TKSkKKyNkZWZpbmUgVlNDQURSX0JMRU5EX1ZJRAkoKDB4MSkgPDwgRlNoZnQoVlNDQURSX0JMRU5EX1BPUykpCisjZGVmaW5lIFZTQ0FEUl9CTEVORF9DVVIJKCgweDIpIDw8IEZTaGZ0KFZTQ0FEUl9CTEVORF9QT1MpKQorI2RlZmluZSBWU0NBRFJfVkJBU0VfQURSCUZsZCgyMywwKQorI2RlZmluZSBWc2NhZHJfVmJhc2VfQWRyKHgpCSgoeCkgPDwgRlNoZnQoVlNDQURSX1ZCQVNFX0FEUikpCisKKy8qIFZVQkFTRSAtIFZpZGVvIFUgQmFzZSBSZWdpc3RlciAqLworI2RlZmluZSBWVUJBU0VfVVZIQUxGU1RSCSgxIDw8IDMxKQorI2RlZmluZSBWVUJBU0VfVUJBU0VfQURSCUZsZCgyNCwwKQorI2RlZmluZSBWdWJhc2VfVWJhc2VfQWRyKHgpCSgoeCkgPDwgRlNoZnQoVlVCQVNFX1VCQVNFX0FEUikpCisKKy8qIFZWQkFTRSAtIFZpZGVvIFYgQmFzZSBSZWdpc3RlciAqLworI2RlZmluZSBWVkJBU0VfVkJBU0VfQURSCUZsZCgyNCwwKQorI2RlZmluZSBWdmJhc2VfVmJhc2VfQWRyKHgpCSgoeCkgPDwgRlNoZnQoVlZCQVNFX1ZCQVNFX0FEUikpCisKKy8qIFZTQURSIC0gVmlkZW8gU3RyaWRlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVlNBRFJfU1JDU1RSSURFCQlGbGQoMTAsMjIpCisjZGVmaW5lIFZzYWRyX1NyY3N0cmlkZSh4KQkoKHgpIDw8IEZTaGZ0KFZTQURSX1NSQ1NUUklERSkpCisjZGVmaW5lIFZTQURSX1hTVEFSVAkJRmxkKDExLDExKQorI2RlZmluZSBWc2Fkcl9Yc3RhcnQoeCkJCSgoeCkgPDwgRlNoZnQoVlNBRFJfWFNUQVJUKSkKKyNkZWZpbmUgVlNBRFJfWVNUQVJUCQlGbGQoMTEsMCkKKyNkZWZpbmUgVnNhZHJfWXN0YXJ0KHgpCQkoKHgpIDw8IEZTaGZ0KFZTQURSX1lTVEFSVCkpCisKIC8qIEhDQ1RSTCAtIEhhcmR3YXJlIEN1cnNvciBSZWdpc3RlciBmaWVsZHMgKi8KICNkZWZpbmUgSENDVFJMX0NVUl9FTgkoMSA8PCAzMSkKICNkZWZpbmUgSENDVFJMX0NPTEtFWV9FTgkoMSA8PCAyOSkKQEAgLTM5NCw2ICs0NTUsMzAgQEAKICNkZWZpbmUgRE1DVFJMX0JVUlNUTEVOCUZsZCg2LDApCiAjZGVmaW5lIERtY3RybF9CdXJzdGxlbih4KQkoKHgpIDw8IEZTaGZ0KERNQ1RSTF9CVVJTVExFTikpCiAKKy8qIERJTlRSUyAtIERpc3BsYXkgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBESU5UUlNfQ1VSX09SX1MJCSgxIDw8IDE4KQorI2RlZmluZSBESU5UUlNfU1RSMl9PUl9TCSgxIDw8IDE3KQorI2RlZmluZSBESU5UUlNfU1RSMV9PUl9TCSgxIDw8IDE2KQorI2RlZmluZSBESU5UUlNfQ1VSX1VSX1MJCSgxIDw8IDYpCisjZGVmaW5lIERJTlRSU19TVFIyX1VSX1MJKDEgPDwgNSkKKyNkZWZpbmUgRElOVFJTX1NUUjFfVVJfUwkoMSA8PCA0KQorI2RlZmluZSBESU5UUlNfVkVWRU5UMV9TCSgxIDw8IDMpCisjZGVmaW5lIERJTlRSU19WRVZFTlQwX1MJKDEgPDwgMikKKyNkZWZpbmUgRElOVFJTX0hCTE5LMV9TCQkoMSA8PCAxKQorI2RlZmluZSBESU5UUlNfSEJMTkswX1MJCSgxIDw8IDApCisKKy8qIERJTlRSRSAtIERpc3BsYXkgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBESU5UUkVfQ1VSX09SX0VOCSgxIDw8IDE4KQorI2RlZmluZSBESU5UUkVfU1RSMl9PUl9FTgkoMSA8PCAxNykKKyNkZWZpbmUgRElOVFJFX1NUUjFfT1JfRU4JKDEgPDwgMTYpCisjZGVmaW5lIERJTlRSRV9DVVJfVVJfRU4JKDEgPDwgNikKKyNkZWZpbmUgRElOVFJFX1NUUjJfVVJfRU4JKDEgPDwgNSkKKyNkZWZpbmUgRElOVFJFX1NUUjFfVVJfRU4JKDEgPDwgNCkKKyNkZWZpbmUgRElOVFJFX1ZFVkVOVDFfRU4JKDEgPDwgMykKKyNkZWZpbmUgRElOVFJFX1ZFVkVOVDBfRU4JKDEgPDwgMikKKyNkZWZpbmUgRElOVFJFX0hCTE5LMV9FTgkoMSA8PCAxKQorI2RlZmluZSBESU5UUkVfSEJMTkswX0VOCSgxIDw8IDApCisKIAogLyogRExTVFMgLSBkaXNwbGF5IGxvYWQgc3RhdHVzIHJlZ2lzdGVyICovCiAjZGVmaW5lIERMU1RTX1JMRF9BRE9ORQkoMSA8PCAyMykKQEAgLTQwMywxNiArNDg4LDQxIEBACiAjZGVmaW5lIERMTENUUkxfUkxEX0FEUkxOCUZsZCg4LDI0KQogI2RlZmluZSBEbGxjdHJsX1JsZF9BZHJsbih4KQkoKHgpIDw8IEZTaGZ0KERMTENUUkxfUkxEX0FEUkxOKSkKIAorLyogQ0xJUENUUkwgLSBDbGlwcGluZyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIENMSVBDVFJMX0hTS0lQCQlGbGQoMTEsMTYpCisjZGVmaW5lIENsaXBjdHJsX0hza2lwCQkoKHgpIDw8IEZTaGZ0KENMSVBDVFJMX0hTS0lQKSkKKyNkZWZpbmUgQ0xJUENUUkxfVlNLSVAJCUZsZCgxMSwwKQorI2RlZmluZSBDbGlwY3RybF9Wc2tpcAkJKCh4KSA8PCBGU2hmdChDTElQQ1RSTF9WU0tJUCkpCisKIC8qIFNQT0NUUkwgLSBTY2FsZSBQaXRjaC9PcmRlciBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQT0NUUkxfSF9TQ19CUAkJKDEgPDwgMzEpCiAjZGVmaW5lIFNQT0NUUkxfVl9TQ19CUAkJKDEgPDwgMzApCiAjZGVmaW5lIFNQT0NUUkxfSFZfU0NfT1IJKDEgPDwgMjkpCiAjZGVmaW5lIFNQT0NUUkxfVlNfVVJfQwkJKDEgPDwgMjcpCi0jZGVmaW5lIFNQT0NUUkxfVk9SREVSCUZsZCgyLDE2KQorI2RlZmluZSBTUE9DVFJMX1ZPUkRFUgkJRmxkKDIsMTYpCiAjZGVmaW5lIFNQT0NUUkxfVk9SREVSXzFUQVAJKCgweDApIDw8IEZTaGZ0KFNQT0NUUkxfVk9SREVSKSkKICNkZWZpbmUgU1BPQ1RSTF9WT1JERVJfMlRBUAkoKDB4MSkgPDwgRlNoZnQoU1BPQ1RSTF9WT1JERVIpKQogI2RlZmluZSBTUE9DVFJMX1ZPUkRFUl80VEFQCSgoMHgzKSA8PCBGU2hmdChTUE9DVFJMX1ZPUkRFUikpCi0jZGVmaW5lIFNQT0NUUkxfVlBJVENICUZsZCgxNiwwKQorI2RlZmluZSBTUE9DVFJMX1ZQSVRDSAkJRmxkKDE2LDApCiAjZGVmaW5lIFNwb2N0cmxfVnBpdGNoKHgpCSgoeCkgPDwgRlNoZnQoU1BPQ1RSTF9WUElUQ0gpKQogCisvKiBTVkNUUkwgLSBTY2FsZSBWZXJ0aWNhbCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNWQ1RSTF9JTklUSUFMMQkJRmxkKDE2LDE2KQorI2RlZmluZSBTdmN0cmxfSW5pdGlhbDEoeCkJKCh4KSA8PCBGU2hmdChTVkNUUkxfSU5JVElBTDEpKQorI2RlZmluZSBTVkNUUkxfSU5JVElBTDIJCUZsZCgxNiwwKQorI2RlZmluZSBTdmN0cmxfSW5pdGlhbDIoeCkJKCh4KSA8PCBGU2hmdChTVkNUUkxfSU5JVElBTDIpKQorCisvKiBTSENUUkwgLSBTY2FsZSBIb3Jpem9udGFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0hDVFJMX0hJTklUSUFMCQlGbGQoMTYsMTYpCisjZGVmaW5lIFNoY3RybF9IaW5pdGlhbCh4KQkoKHgpIDw8IEZTaGZ0KFNIQ1RSTF9ISU5JVElBTCkpCisjZGVmaW5lIFNIQ1RSTF9IREVDSU0JCSgxIDw8IDE1KQorI2RlZmluZSBTSENUUkxfSFBJVENICQlGbGQoMTUsMCkKKyNkZWZpbmUgU2hjdHJsX0hwaXRjaCh4KQkoKHgpIDw8IEZTaGZ0KFNIQ1RSTF9IUElUQ0gpKQorCisvKiBTU1NJWkUgLSBTY2FsZSBTdXJmYWNlIFNpemUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1NTSVpFX1NDX1dJRFRICQlGbGQoMTEsMTYpCisjZGVmaW5lIFNzc2l6ZV9TY19XaWR0aCh4KQkoKHgpIDw8IEZTaGZ0KFNTU0laRV9TQ19XSURUSCkpCisjZGVmaW5lIFNTU0laRV9TQ19IRUlHSFQJRmxkKDExLDApCisjZGVmaW5lIFNzc2l6ZV9TY19IZWlnaHQoeCkJKCh4KSA8PCBGU2hmdChTU1NJWkVfU0NfSEVJR0hUKSkKKwogI2VuZGlmIC8qIF9fUkVHX0JJVFNfMjcwMEdfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21ieC9yZWdzLmggYi9kcml2ZXJzL3ZpZGVvL21ieC9yZWdzLmgKaW5kZXggYWQyMGJlMC4uYTdjNjNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYngvcmVncy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbWJ4L3JlZ3MuaApAQCAtMTI3LDcgKzEyNyw3IEBACiAjZGVmaW5lIEhTQ09FRkYwCV9fUkVHXzI3MDBHKDB4MDAwMDIxYjQpCiAjZGVmaW5lIEhTQ09FRkYxCV9fUkVHXzI3MDBHKDB4MDAwMDIxYjgpCiAjZGVmaW5lIEhTQ09FRkYyCV9fUkVHXzI3MDBHKDB4MDAwMDIxYmMpCi0jZGVmaW5lIEhTQ09FRkYzCV9fUkVHXzI3MDBHKDB4MDAwMDIxYjApCisjZGVmaW5lIEhTQ09FRkYzCV9fUkVHXzI3MDBHKDB4MDAwMDIxYzApCiAjZGVmaW5lIEhTQ09FRkY0CV9fUkVHXzI3MDBHKDB4MDAwMDIxYzQpCiAjZGVmaW5lIEhTQ09FRkY1CV9fUkVHXzI3MDBHKDB4MDAwMDIxYzgpCiAjZGVmaW5lIEhTQ09FRkY2CV9fUkVHXzI3MDBHKDB4MDAwMDIxY2MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwppbmRleCBkMTI2NzkwLi41ZGY0MWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKQEAgLTM0LDggKzM0LDYgQEAKICAgICAgKiAgU3RhbmRhcmQgdmlkZW8gbW9kZSBkZWZpbml0aW9ucyAodGFrZW4gZnJvbSBYRnJlZTg2KQogICAgICAqLwogCi0jZGVmaW5lIERFRkFVTFRfTU9ERURCX0lOREVYCTAKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgbW9kZWRiW10gPSB7CiAgICAgewogCS8qIDY0MHg0MDAgQCA3MCBIeiwgMzEuNSBrSHogaHN5bmMgKi8KQEAgLTUwNSw4ICs1MDMsMTAgQEAKIAlkYiA9IG1vZGVkYjsKIAlkYnNpemUgPSBBUlJBWV9TSVpFKG1vZGVkYik7CiAgICAgfQorCiAgICAgaWYgKCFkZWZhdWx0X21vZGUpCi0JZGVmYXVsdF9tb2RlID0gJm1vZGVkYltERUZBVUxUX01PREVEQl9JTkRFWF07CisJZGVmYXVsdF9tb2RlID0gJmRiWzBdOworCiAgICAgaWYgKCFkZWZhdWx0X2JwcCkKIAlkZWZhdWx0X2JwcCA9IDg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbmVvZmIuYyBiL2RyaXZlcnMvdmlkZW8vbmVvZmIuYwppbmRleCA1OWE2ZjVmLi5kZWFmODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9uZW9mYi5jCkBAIC0xOTMyLDcgKzE5MzIsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHICItLS0gTmVvIGV4dGVuZGVkIHJlZ2lzdGVyIGR1bXAgLS0tXG4iKTsKIAlmb3IgKGludCB3ID0gMDsgdyA8IDB4ODU7IHcrKykKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkNSICVwOiAlcFxuIiwgKHZvaWQgKikgdywKLQkJICAgICAgICh2b2lkICopIHZnYV9yY3J0KE5VTEwsIHcpOworCQkgICAgICAgKHZvaWQgKikgdmdhX3JjcnQoTlVMTCwgdykpOwogCWZvciAoaW50IHcgPSAwOyB3IDwgMHhDNzsgdysrKQogCQlwcmludGsoS0VSTl9ERUJVRyAiR1IgJXA6ICVwXG4iLCAodm9pZCAqKSB3LAogCQkgICAgICAgKHZvaWQgKikgdmdhX3JnZngoTlVMTCwgdykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2FjY2VsLmMKaW5kZXggNGFlZmI4Zi4uOWVmYjhhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYWNjZWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9hY2NlbC5jCkBAIC0yNjEsNDEgKzI2MSw2IEBACiAJTlZEbWFLaWNrb2ZmKHBhcik7CiB9CiAKLXU4IGJ5dGVfcmV2WzI1Nl0gPSB7Ci0JMHgwMCwgMHg4MCwgMHg0MCwgMHhjMCwgMHgyMCwgMHhhMCwgMHg2MCwgMHhlMCwKLQkweDEwLCAweDkwLCAweDUwLCAweGQwLCAweDMwLCAweGIwLCAweDcwLCAweGYwLAotCTB4MDgsIDB4ODgsIDB4NDgsIDB4YzgsIDB4MjgsIDB4YTgsIDB4NjgsIDB4ZTgsCi0JMHgxOCwgMHg5OCwgMHg1OCwgMHhkOCwgMHgzOCwgMHhiOCwgMHg3OCwgMHhmOCwKLQkweDA0LCAweDg0LCAweDQ0LCAweGM0LCAweDI0LCAweGE0LCAweDY0LCAweGU0LAotCTB4MTQsIDB4OTQsIDB4NTQsIDB4ZDQsIDB4MzQsIDB4YjQsIDB4NzQsIDB4ZjQsCi0JMHgwYywgMHg4YywgMHg0YywgMHhjYywgMHgyYywgMHhhYywgMHg2YywgMHhlYywKLQkweDFjLCAweDljLCAweDVjLCAweGRjLCAweDNjLCAweGJjLCAweDdjLCAweGZjLAotCTB4MDIsIDB4ODIsIDB4NDIsIDB4YzIsIDB4MjIsIDB4YTIsIDB4NjIsIDB4ZTIsCi0JMHgxMiwgMHg5MiwgMHg1MiwgMHhkMiwgMHgzMiwgMHhiMiwgMHg3MiwgMHhmMiwKLQkweDBhLCAweDhhLCAweDRhLCAweGNhLCAweDJhLCAweGFhLCAweDZhLCAweGVhLAotCTB4MWEsIDB4OWEsIDB4NWEsIDB4ZGEsIDB4M2EsIDB4YmEsIDB4N2EsIDB4ZmEsCi0JMHgwNiwgMHg4NiwgMHg0NiwgMHhjNiwgMHgyNiwgMHhhNiwgMHg2NiwgMHhlNiwKLQkweDE2LCAweDk2LCAweDU2LCAweGQ2LCAweDM2LCAweGI2LCAweDc2LCAweGY2LAotCTB4MGUsIDB4OGUsIDB4NGUsIDB4Y2UsIDB4MmUsIDB4YWUsIDB4NmUsIDB4ZWUsCi0JMHgxZSwgMHg5ZSwgMHg1ZSwgMHhkZSwgMHgzZSwgMHhiZSwgMHg3ZSwgMHhmZSwKLQkweDAxLCAweDgxLCAweDQxLCAweGMxLCAweDIxLCAweGExLCAweDYxLCAweGUxLAotCTB4MTEsIDB4OTEsIDB4NTEsIDB4ZDEsIDB4MzEsIDB4YjEsIDB4NzEsIDB4ZjEsCi0JMHgwOSwgMHg4OSwgMHg0OSwgMHhjOSwgMHgyOSwgMHhhOSwgMHg2OSwgMHhlOSwKLQkweDE5LCAweDk5LCAweDU5LCAweGQ5LCAweDM5LCAweGI5LCAweDc5LCAweGY5LAotCTB4MDUsIDB4ODUsIDB4NDUsIDB4YzUsIDB4MjUsIDB4YTUsIDB4NjUsIDB4ZTUsCi0JMHgxNSwgMHg5NSwgMHg1NSwgMHhkNSwgMHgzNSwgMHhiNSwgMHg3NSwgMHhmNSwKLQkweDBkLCAweDhkLCAweDRkLCAweGNkLCAweDJkLCAweGFkLCAweDZkLCAweGVkLAotCTB4MWQsIDB4OWQsIDB4NWQsIDB4ZGQsIDB4M2QsIDB4YmQsIDB4N2QsIDB4ZmQsCi0JMHgwMywgMHg4MywgMHg0MywgMHhjMywgMHgyMywgMHhhMywgMHg2MywgMHhlMywKLQkweDEzLCAweDkzLCAweDUzLCAweGQzLCAweDMzLCAweGIzLCAweDczLCAweGYzLAotCTB4MGIsIDB4OGIsIDB4NGIsIDB4Y2IsIDB4MmIsIDB4YWIsIDB4NmIsIDB4ZWIsCi0JMHgxYiwgMHg5YiwgMHg1YiwgMHhkYiwgMHgzYiwgMHhiYiwgMHg3YiwgMHhmYiwKLQkweDA3LCAweDg3LCAweDQ3LCAweGM3LCAweDI3LCAweGE3LCAweDY3LCAweGU3LAotCTB4MTcsIDB4OTcsIDB4NTcsIDB4ZDcsIDB4MzcsIDB4YjcsIDB4NzcsIDB4ZjcsCi0JMHgwZiwgMHg4ZiwgMHg0ZiwgMHhjZiwgMHgyZiwgMHhhZiwgMHg2ZiwgMHhlZiwKLQkweDFmLCAweDlmLCAweDVmLCAweGRmLCAweDNmLCAweGJmLCAweDdmLCAweGZmLAotfTsKLQogaW50IG52aWRpYWZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IG52aWRpYV9wYXIgKnBhciA9IGluZm8tPnBhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCmluZGV4IDllZDY0MGQuLmVhNDI2MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYwpAQCAtMTQ1LDEyICsxNDUsMTggQEAKIAogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzQwKSB7CiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAyMCk7Ci0JCVAgPSAocGxsID4+IDE2KSAmIDB4MDM7CisJCVAgPSAocGxsID4+IDE2KSAmIDB4MDc7CiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAyNCk7CiAJCU0gPSBwbGwgJiAweEZGOwogCQlOID0gKHBsbCA+PiA4KSAmIDB4RkY7Ci0JCU1CID0gKHBsbCA+PiAxNikgJiAweEZGOwotCQlOQiA9IChwbGwgPj4gMjQpICYgMHhGRjsKKwkJaWYgKCgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApIHx8CisJCQkJKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDM5MCkpIHsKKwkJCU1CID0gMTsKKwkJCU5CID0gMTsKKwkJfSBlbHNlIHsKKwkJCU1CID0gKHBsbCA+PiAxNikgJiAweEZGOworCQkJTkIgPSAocGxsID4+IDI0KSAmIDB4RkY7CisJCX0KIAkJKk1DbGsgPSAoKE4gKiBOQiAqIHBhci0+Q3J5c3RhbEZyZXFLSHopIC8gKE0gKiBNQikpID4+IFA7CiAKIAkJcGxsID0gTlZfUkQzMihwYXItPlBNQywgMHg0MDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2kyYy5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKaW5kZXggMTllZWYzYS4uODQ1NGFkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaTJjLmMKQEAgLTE0NywxNSArMTQ3LDE1IEBACiB2b2lkIG52aWRpYV9kZWxldGVfaTJjX2J1c3NlcyhzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKQogewogCWlmIChwYXItPmNoYW5bMF0ucGFyKQotCQlpMmNfYml0X2RlbF9idXMoJnBhci0+Y2hhblswXS5hZGFwdGVyKTsKKwkJaTJjX2RlbF9hZGFwdGVyKCZwYXItPmNoYW5bMF0uYWRhcHRlcik7CiAJcGFyLT5jaGFuWzBdLnBhciA9IE5VTEw7CiAKIAlpZiAocGFyLT5jaGFuWzFdLnBhcikKLQkJaTJjX2JpdF9kZWxfYnVzKCZwYXItPmNoYW5bMV0uYWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmcGFyLT5jaGFuWzFdLmFkYXB0ZXIpOwogCXBhci0+Y2hhblsxXS5wYXIgPSBOVUxMOwogCiAJaWYgKHBhci0+Y2hhblsyXS5wYXIpCi0JCWkyY19iaXRfZGVsX2J1cygmcGFyLT5jaGFuWzJdLmFkYXB0ZXIpOworCQlpMmNfZGVsX2FkYXB0ZXIoJnBhci0+Y2hhblsyXS5hZGFwdGVyKTsKIAlwYXItPmNoYW5bMl0ucGFyID0gTlVMTDsKIAogfQpAQCAtMjEwLDExICsyMTAsOCBAQAogCQkvKiB0cnkgdG8gZ2V0IGZyb20gZmlybXdhcmUgKi8KIAkJY29uc3QgdTggKmUgPSBmYl9maXJtd2FyZV9lZGlkKGluZm8tPmRldmljZSk7CiAKLQkJaWYgKGUgIT0gTlVMTCkgewotCQkJZWRpZCA9IGttYWxsb2MoRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOwotCQkJaWYgKGVkaWQpCi0JCQkJbWVtY3B5KGVkaWQsIGUsIEVESURfTEVOR1RIKTsKLQkJfQorCQlpZiAoZSAhPSBOVUxMKQorCQkJZWRpZCA9IGttZW1kdXAoZSwgRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOwogCX0KIAogCSpvdXRfZWRpZCA9IGVkaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9sb2NhbC5oIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfbG9jYWwuaAppbmRleCA0MjQzZDdmLi5lMDA5ZDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9sb2NhbC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2xvY2FsLmgKQEAgLTk2LDEzICs5NiwxNiBAQAogI2RlZmluZSBSRUFEX0dFVChwYXIpIChOVl9SRDMyKCYocGFyKS0+RklGT1sweDAwMTFdLCAwKSA+PiAyKQogCiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisKKyNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKwogI2RlZmluZSByZXZlcnNlX29yZGVyKGwpICAgICAgICBcCiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl1OCAqYSA9ICh1OCAqKShsKTsgICAgICBcCi0JKmEgPSBieXRlX3JldlsqYV0sIGErKzsgXAotCSphID0gYnl0ZV9yZXZbKmFdLCBhKys7IFwKLQkqYSA9IGJ5dGVfcmV2WyphXSwgYSsrOyBcCi0JKmEgPSBieXRlX3JldlsqYV07ICAgICAgXAorCWFbMF0gPSBiaXRyZXY4KGFbMF0pOyAgIFwKKwlhWzFdID0gYml0cmV2OChhWzFdKTsgICBcCisJYVsyXSA9IGJpdHJldjgoYVsyXSk7ICAgXAorCWFbM10gPSBiaXRyZXY4KGFbM10pOyAgIFwKIH0gd2hpbGUoMCkKICNlbHNlCiAjZGVmaW5lIHJldmVyc2Vfb3JkZXIobCkgZG8geyB9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9vZi5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfb2YuYwppbmRleCBkOWFmODhjLi4xODE4NzVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9vZi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X29mLmMKQEAgLTcyLDEwICs3Miw5IEBACiAJCX0KIAl9CiAJaWYgKHBlZGlkKSB7Ci0JCSpvdXRfZWRpZCA9IGttYWxsb2MoRURJRF9MRU5HVEgsIEdGUF9LRVJORUwpOworCQkqb3V0X2VkaWQgPSBrbWVtZHVwKHBlZGlkLCBFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CiAJCWlmICgqb3V0X2VkaWQgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKLQkJbWVtY3B5KCpvdXRfZWRpZCwgcGVkaWQsIEVESURfTEVOR1RIKTsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIm52aWRpYWZiOiBGb3VuZCBPRiBFRElEIGZvciBoZWFkICVkXG4iLCBjb25uKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfcHJvdG8uaCBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmgKaW5kZXggODYxMjcxMC4uNDMwNThkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfcHJvdG8uaAorKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9wcm90by5oCkBAIC02Miw3ICs2Miw2IEBACiBleHRlcm4gdm9pZCBudmlkaWFmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CiBleHRlcm4gaW50IG52aWRpYWZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pOwotZXh0ZXJuIHU4IGJ5dGVfcmV2WzI1Nl07CiAKIC8qIGluIG52X2JhY2tsaWdodC5oICovCiAjaWZkZWYgQ09ORklHX0ZCX05WSURJQV9CQUNLTElHSFQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCmluZGV4IGExOGE5YWUuLmVhYjNlMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAjZW5kaWYKIAogCWRldiA9IHBjaV9maW5kX3Nsb3QoMCwgMSk7Ci0JaWYgKChwYXItPkNoaXBzZXQgJiYgMHhmZmZmKSA9PSAweDAxYTApIHsKKwlpZiAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmZikgPT0gMHgwMWEwKSB7CiAJCWludCBhbXQgPSAwOwogCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4N2MsICZhbXQpOwpAQCAtMzU5LDYgKzM1OSw3IEBACiAJY2FzZSAweDAxODY6CiAJY2FzZSAweDAxODc6CiAJY2FzZSAweDAxOEQ6CisJY2FzZSAweDAyMjg6CiAJY2FzZSAweDAyODY6CiAJY2FzZSAweDAyOEM6CiAJY2FzZSAweDAzMTY6CkBAIC0zODIsNiArMzgzLDEwIEBACiAJY2FzZSAweDAzNEM6CiAJY2FzZSAweDAxNjA6CiAJY2FzZSAweDAxNjY6CisJY2FzZSAweDAxNjk6CisJY2FzZSAweDAxNkI6CisJY2FzZSAweDAxNkM6CisJY2FzZSAweDAxNkQ6CiAJY2FzZSAweDAwQzg6CiAJY2FzZSAweDAwQ0M6CiAJY2FzZSAweDAxNDQ6CkBAIC02MzksMTIgKzY0NCwyMyBAQAogCQlwYXItPmZwSGVpZ2h0ID0gTlZfUkQzMihwYXItPlBSQU1EQUMsIDB4MDgwMCkgKyAxOwogCQlwYXItPmZwU3luY3MgPSBOVl9SRDMyKHBhci0+UFJBTURBQywgMHgwODQ4KSAmIDB4MzAwMDAwMzM7CiAKLQkJcHJpbnRrKCJQYW5lbCBzaXplIGlzICVpIHggJWlcbiIsIHBhci0+ZnBXaWR0aCwgcGFyLT5mcEhlaWdodCk7CisJCXByaW50aygibnZpZGlhZmI6IFBhbmVsIHNpemUgaXMgJWkgeCAlaVxuIiwgcGFyLT5mcFdpZHRoLCBwYXItPmZwSGVpZ2h0KTsKIAl9CiAKIAlpZiAobW9uQSkKIAkJaW5mby0+bW9uc3BlY3MgPSAqbW9uQTsKIAorCWlmICghcGFyLT5GbGF0UGFuZWwgfHwgIXBhci0+dHdvSGVhZHMpCisJCXBhci0+RlBEaXRoZXIgPSAwOworCisJcGFyLT5MVkRTID0gMDsKKwlpZiAocGFyLT5GbGF0UGFuZWwgJiYgcGFyLT50d29IZWFkcykgeworCQlOVl9XUjMyKHBhci0+UFJBTURBQzAsIDB4MDhCMCwgMHgwMDAxMDAwNCk7CisJCWlmIChwYXItPlBSQU1EQUMwWzB4MDhiNF0gJiAxKQorCQkJcGFyLT5MVkRTID0gMTsKKwkJcHJpbnRrKCJudmlkaWFmYjogUGFuZWwgaXMgJXNcbiIsIHBhci0+TFZEUyA/ICJMVkRTIiA6ICJUTURTIik7CisJfQorCiAJa2ZyZWUoZWRpZEEpOwogCWtmcmVlKGVkaWRCKTsKIGRvbmU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmggYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmgKaW5kZXggYWNkYzI2Ni4uODZlNjVkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfdHlwZS5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaApAQCAtMTI5LDYgKzEyOSw3IEBACiAJaW50IGZwSGVpZ2h0OwogCWludCBQYW5lbFR3ZWFrOwogCWludCBwYW5lbHR3ZWFrOworCWludCBMVkRTOwogCWludCBwbV9zdGF0ZTsKIAl1MzIgY3J0Y1N5bmNfcmVhZDsKIAl1MzIgZnBTeW5jczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKaW5kZXggZWIyNDEwNy4uNTM4ZTk0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKQEAgLTExNjAsMjAgKzExNjAsMjAgQEAKIAljYXNlIDB4MDM0MDoJCS8qIEdlRm9yY2VGWCA1NzAwICovCiAJCWFyY2ggPSBOVl9BUkNIXzMwOwogCQlicmVhazsKLQljYXNlIDB4MDA0MDoKLQljYXNlIDB4MDBDMDoKLQljYXNlIDB4MDEyMDoKKwljYXNlIDB4MDA0MDoJCS8qIEdlRm9yY2UgNjgwMCAqLworCWNhc2UgMHgwMEMwOgkJLyogR2VGb3JjZSA2ODAwICovCisJY2FzZSAweDAxMjA6CQkvKiBHZUZvcmNlIDY4MDAgKi8KIAljYXNlIDB4MDEzMDoKLQljYXNlIDB4MDE0MDoKLQljYXNlIDB4MDE2MDoKLQljYXNlIDB4MDFEMDoKLQljYXNlIDB4MDA5MDoKLQljYXNlIDB4MDIxMDoKLQljYXNlIDB4MDIyMDoKKwljYXNlIDB4MDE0MDoJCS8qIEdlRm9yY2UgNjYwMCAqLworCWNhc2UgMHgwMTYwOgkJLyogR2VGb3JjZSA2MjAwICovCisJY2FzZSAweDAxRDA6CQkvKiBHZUZvcmNlIDcyMDAsIDczMDAsIDc0MDAgKi8KKwljYXNlIDB4MDA5MDoJCS8qIEdlRm9yY2UgNzgwMCAqLworCWNhc2UgMHgwMjEwOgkJLyogR2VGb3JjZSA2ODAwICovCisJY2FzZSAweDAyMjA6CQkvKiBHZUZvcmNlIDYyMDAgKi8KIAljYXNlIDB4MDIzMDoKLQljYXNlIDB4MDI0MDoKLQljYXNlIDB4MDI5MDoKLQljYXNlIDB4MDM5MDoKKwljYXNlIDB4MDI0MDoJCS8qIEdlRm9yY2UgNjEwMCAqLworCWNhc2UgMHgwMjkwOgkJLyogR2VGb3JjZSA3OTAwICovCisJY2FzZSAweDAzOTA6CQkvKiBHZUZvcmNlIDc2MDAgKi8KIAkJYXJjaCA9IE5WX0FSQ0hfNDA7CiAJCWJyZWFrOwogCWNhc2UgMHgwMDIwOgkJLyogVE5ULCBUTlQyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29mZmIuYyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCmluZGV4IGJhZDBlOTguLjk1NzZhNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAkJb3V0X2xlMzIocGFyLT5jbWFwX2FkciArIDB4YjQsIChyZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZSkpOwogCQlicmVhazsKIAljYXNlIGNtYXBfZ3h0MjAwMDoKLQkJb3V0X2xlMzIoKHVuc2lnbmVkIF9faW9tZW0gKikgcGFyLT5jbWFwX2FkciArIHJlZ25vLAorCQlvdXRfbGUzMigoKHVuc2lnbmVkIF9faW9tZW0gKikgcGFyLT5jbWFwX2FkcikgKyByZWdubywKIAkJCSAocmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWUpKTsKIAkJYnJlYWs7CiAJfQpAQCAtMjEzLDcgKzIxMyw3IEBACiAJCQkJb3V0X2xlMzIocGFyLT5jbWFwX2FkciArIDB4YjQsIDApOwogCQkJCWJyZWFrOwogCQkJY2FzZSBjbWFwX2d4dDIwMDA6Ci0JCQkJb3V0X2xlMzIoKHVuc2lnbmVkIF9faW9tZW0gKikgcGFyLT5jbWFwX2FkciArIGksCisJCQkJb3V0X2xlMzIoKCh1bnNpZ25lZCBfX2lvbWVtICopIHBhci0+Y21hcF9hZHIpICsgaSwKIAkJCQkJIDApOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjI2LDEzICsyMjYsMjMgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKm9mZmJfbWFwX3JlZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgsCiAJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCXN0cnVjdCByZXNvdXJjZSByOworCWNvbnN0IHUzMiAqYWRkcnA7CisJdTY0IGFzaXplLCB0YWRkcjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAKLQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgaW5kZXgsICZyKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKChyLnN0YXJ0ICsgb2Zmc2V0ICsgc2l6ZSkgPiByLmVuZCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlvcmVtYXAoci5zdGFydCArIG9mZnNldCwgc2l6ZSk7CisJYWRkcnAgPSBvZl9nZXRfcGNpX2FkZHJlc3MobnAsIGluZGV4LCAmYXNpemUsICZmbGFncyk7CisJaWYgKGFkZHJwID09IE5VTEwpCisJCWFkZHJwID0gb2ZfZ2V0X2FkZHJlc3MobnAsIGluZGV4LCAmYXNpemUsICZmbGFncyk7CisJaWYgKGFkZHJwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWlmICgoZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKChvZmZzZXQgKyBzaXplKSA+IGFzaXplKQorCQlyZXR1cm4gTlVMTDsKKwl0YWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5wLCBhZGRycCk7CisJaWYgKHRhZGRyID09IE9GX0JBRF9BRERSKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaW9yZW1hcCh0YWRkciArIG9mZnNldCwgc2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZmZiX2luaXRfZmIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZnVsbF9uYW1lLApAQCAtMjg5LDcgKzI5OSw2IEBACiAKIAlwYXItPmNtYXBfdHlwZSA9IGNtYXBfdW5rbm93bjsKIAlpZiAoZGVwdGggPT0gOCkgewotCQkvKiBQYWxldHRlIGhhY2tzIGRpc2FibGVkIGZvciBub3cgKi8KIAkJaWYgKGRwICYmICFzdHJuY21wKG5hbWUsICJBVFksUmFnZTEyOCIsIDExKSkgewogCQkJcGFyLT5jbWFwX2FkciA9IG9mZmJfbWFwX3JlZyhkcCwgMiwgMCwgMHgxZmZmKTsKIAkJCWlmIChwYXItPmNtYXBfYWRyKQpAQCAtMzEzLDcgKzMyMiw4IEBACiAJCQkgICAgaW9yZW1hcChiYXNlICsgMHg3ZmYwMDAsIDB4MTAwMCkgKyAweGNjMDsKIAkJCXBhci0+Y21hcF9kYXRhID0gcGFyLT5jbWFwX2FkciArIDE7CiAJCQlwYXItPmNtYXBfdHlwZSA9IGNtYXBfbTY0OwotCQl9IGVsc2UgaWYgKGRwICYmIGRldmljZV9pc19jb21wYXRpYmxlKGRwLCAicGNpMTAxNCxiNyIpKSB7CisJCX0gZWxzZSBpZiAoZHAgJiYgKGRldmljZV9pc19jb21wYXRpYmxlKGRwLCAicGNpMTAxNCxiNyIpIHx8CisJCQkJICBkZXZpY2VfaXNfY29tcGF0aWJsZShkcCwgInBjaTEwMTQsMjFjIikpKSB7CiAJCQlwYXItPmNtYXBfYWRyID0gb2ZmYl9tYXBfcmVnKGRwLCAwLCAweDYwMDAsIDB4MTAwMCk7CiAJCQlpZiAocGFyLT5jbWFwX2FkcikKIAkJCQlwYXItPmNtYXBfdHlwZSA9IGNtYXBfZ3h0MjAwMDsKQEAgLTM5Miw2ICs0MDIsOSBAQAogCWZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCk7CiAKIAlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKSB7CisJCWlvdW5tYXAocGFyLT5jbWFwX2Fkcik7CisJCXBhci0+Y21hcF9hZHIgPSBOVUxMOworCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAkJa2ZyZWUoaW5mbyk7CiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXNfc3RhcnQsIHJlc19zaXplKTsKIAkJcmV0dXJuOwpAQCAtNDMzLDcgKzQ0Niw3IEBACiAJcHAgPSBnZXRfcHJvcGVydHkoZHAsICJsaW51eCxib290eC1saW5lYnl0ZXMiLCAmbGVuKTsKIAlpZiAocHAgPT0gTlVMTCkKIAkJcHAgPSBnZXRfcHJvcGVydHkoZHAsICJsaW5lYnl0ZXMiLCAmbGVuKTsKLQlpZiAocHAgJiYgbGVuID09IHNpemVvZih1MzIpKQorCWlmIChwcCAmJiBsZW4gPT0gc2l6ZW9mKHUzMikgJiYgKCpwcCAhPSAweGZmZmZmZmZmdSkpCiAJCXBpdGNoID0gKnBwOwogCWVsc2UKIAkJcGl0Y2ggPSB3aWR0aCAqICgoZGVwdGggKyA3KSAvIDgpOwpAQCAtNDk2LDcgKzUwOSw3IEBACiAJCW9mZmJfaW5pdF9mYihub19yZWFsX25vZGUgPyAiYm9vdHgiIDogZHAtPm5hbWUsCiAJCQkgICAgIG5vX3JlYWxfbm9kZSA/ICJkaXNwbGF5IiA6IGRwLT5mdWxsX25hbWUsCiAJCQkgICAgIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwaXRjaCwgYWRkcmVzcywKLQkJCSAgICAgbm9fcmVhbF9ub2RlID8gZHAgOiBOVUxMKTsKKwkJCSAgICAgbm9fcmVhbF9ub2RlID8gTlVMTCA6IGRwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jIGIvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKaW5kZXggOTgzYmUzZS4uMjMzODcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSAibWFjbW9kZXMuaCIKICNpbmNsdWRlICJwbGF0aW51bWZiLmgiCkBAIC0zMzksMTEgKzM0MCwxMiBAQAogCiAJc2Vuc2UgPSByZWFkX3BsYXRpbnVtX3NlbnNlKHBpbmZvKTsKIAlwcmludGsoS0VSTl9JTkZPICJwbGF0aW51bWZiOiBNb25pdG9yIHNlbnNlIHZhbHVlID0gMHgleCwgIiwgc2Vuc2UpOwotCiAJaWYgKGRlZmF1bHRfdm1vZGUgPT0gVk1PREVfTlZSQU0pIHsKKyNpZmRlZiBDT05GSUdfTlZSQU0KIAkJZGVmYXVsdF92bW9kZSA9IG52cmFtX3JlYWRfYnl0ZShOVl9WTU9ERSk7CiAJCWlmIChkZWZhdWx0X3Ztb2RlIDw9IDAgfHwgZGVmYXVsdF92bW9kZSA+IFZNT0RFX01BWCB8fAogCQkgICAgIXBsYXRpbnVtX3JlZ19pbml0W2RlZmF1bHRfdm1vZGUtMV0pCisjZW5kaWYKIAkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV9DSE9PU0U7CiAJfQogCWlmIChkZWZhdWx0X3Ztb2RlID09IFZNT0RFX0NIT09TRSkgewpAQCAtMzUxLDggKzM1MywxMCBAQAogCX0KIAlpZiAoZGVmYXVsdF92bW9kZSA8PSAwIHx8IGRlZmF1bHRfdm1vZGUgPiBWTU9ERV9NQVgpCiAJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV82NDBfNDgwXzYwOworI2lmZGVmIENPTkZJR19OVlJBTQogCWlmIChkZWZhdWx0X2Ntb2RlID09IENNT0RFX05WUkFNKQogCQlkZWZhdWx0X2Ntb2RlID0gbnZyYW1fcmVhZF9ieXRlKE5WX0NNT0RFKTsKKyNlbmRpZgogCWlmIChkZWZhdWx0X2Ntb2RlIDwgQ01PREVfOCB8fCBkZWZhdWx0X2Ntb2RlID4gQ01PREVfMzIpCiAJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV84OwogCS8qCkBAIC02MjMsNiArNjI3LDkgQEAKIAkKIAlyYyA9IHBsYXRpbnVtX2luaXRfZmIoaW5mbyk7CiAJaWYgKHJjICE9IDApIHsKKwkJaW91bm1hcChwaW5mby0+ZnJhbWVfYnVmZmVyKTsKKwkJaW91bm1hcChwaW5mby0+cGxhdGludW1fcmVncyk7CisJCWlvdW5tYXAocGluZm8tPmNtYXBfcmVncyk7CiAJCWRldl9zZXRfZHJ2ZGF0YSgmb2Rldi0+ZGV2LCBOVUxMKTsKIAkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAl9CkBAIC02NzksMTQgKzY4NiwxNCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAlwbGF0aW51bWZiX3NldHVwKG9wdGlvbik7CiAjZW5kaWYKLQlvZl9yZWdpc3Rlcl9kcml2ZXIoJnBsYXRpbnVtX2RyaXZlcik7CisJb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZwbGF0aW51bV9kcml2ZXIpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwbGF0aW51bWZiX2V4aXQodm9pZCkKIHsKLQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmcGxhdGludW1fZHJpdmVyKTsJCisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnBsYXRpbnVtX2RyaXZlcik7CiB9CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG1hZ2ItYi1mYi5jIGIvZHJpdmVycy92aWRlby9wbWFnYi1iLWZiLmMKaW5kZXggNzNlMmQ3ZC4uYTA2YTA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbWFnYi1iLWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbWFnYi1iLWZiLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHBtYWdiYmZiX29zY19zZXR1cChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdGF0aWMgdW5zaWduZWQgaW50IHBtYWdiYmZiX2ZyZXFzW10gX19pbml0ZGF0YSA9IHsKLQkJMTMwODA4LCAxMTk4NDMsIDEwNDAwMCwgOTI5ODAsIDc0MzY3LCA3MjgwMCwKKwkJMTMwODA4LCAxMTk4NDMsIDEwNDAwMCwgOTI5ODAsIDc0MzcwLCA3MjgwMCwKIAkJNjkxOTcsIDY2MDAwLCA2NTAwMCwgNTAzNTAsIDM2MDAwLCAzMjAwMCwgMjUxNzUKIAl9OwogCXN0cnVjdCBwbWFnYmJmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG54NDAwOC9wbnhyZ2JmYi5jIGIvZHJpdmVycy92aWRlby9wbng0MDA4L3BueHJnYmZiLmMKaW5kZXggN2Q5NDUzYy4uZjI5ZTY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbng0MDA4L3BueHJnYmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbng0MDA4L3BueHJnYmZiLmMKQEAgLTE1NCw3ICsxNTQsOCBAQAogCQkJZ290byBlcnIxOwogCX0KIAotCWlmICghZmJfZ2V0X29wdGlvbnMoInBueHJnYmZiIiwgJm9wdGlvbikgJiYgIXN0cmNtcChvcHRpb24sICJub2N1cnNvciIpKQorCWlmICghZmJfZ2V0X29wdGlvbnMoInBueHJnYmZiIiwgJm9wdGlvbikgJiYgb3B0aW9uICYmCisJCQkhc3RyY21wKG9wdGlvbiwgIm5vY3Vyc29yIikpCiAJCXJnYmZiX29wcy5mYl9jdXJzb3IgPSBub19jdXJzb3I7CiAKIAlpbmZvLT5ub2RlID0gLTE7CkBAIC0xOTEsNyArMTkyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmdiZmJfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInJnYmZiIiwKKwkJLm5hbWUgPSAicG54NDAwOC1yZ2JmYiIsCiAJfSwKIAkucHJvYmUgPSByZ2JmYl9wcm9iZSwKIAkucmVtb3ZlID0gcmdiZmJfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbng0MDA4L3NkdW0uYyBiL2RyaXZlcnMvdmlkZW8vcG54NDAwOC9zZHVtLmMKaW5kZXggNTFmMGVjYy4uZDIzYmYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbng0MDA4L3NkdW0uYworKysgYi9kcml2ZXJzL3ZpZGVvL3BueDQwMDgvc2R1bS5jCkBAIC04NDgsNyArODQ4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2R1bV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAic2R1bSIsCisJCS5uYW1lID0gInBueDQwMDgtc2R1bSIsCiAJfSwKIAkucHJvYmUgPSBzZHVtX3Byb2JlLAogCS5yZW1vdmUgPSBzZHVtX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3B2cjJmYi5jCmluZGV4IGM3YmM4MDkuLmE5MzYxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wdnIyZmIuYwpAQCAtOTA1LDYgKzkwNSwxNSBAQAogCiBzdGF0aWMgdm9pZCBwdnIyZmJfZGNfZXhpdCh2b2lkKQogeworCWlmIChmYl9pbmZvLT5zY3JlZW5fYmFzZSkgeworCQlpb3VubWFwKGZiX2luZm8tPnNjcmVlbl9iYXNlKTsKKwkJZmJfaW5mby0+c2NyZWVuX2Jhc2UgPSBOVUxMOworCX0KKwlpZiAoY3VycmVudHBhci0+bW1pb19iYXNlKSB7CisJCWlvdW5tYXAoKHZvaWQgKiljdXJyZW50cGFyLT5tbWlvX2Jhc2UpOworCQljdXJyZW50cGFyLT5tbWlvX2Jhc2UgPSAwOworCX0KKwogCWZyZWVfaXJxKEhXX0VWRU5UX1ZTWU5DLCAwKTsKICNpZmRlZiBDT05GSUdfU0hfRE1BCiAJZnJlZV9kbWEocHZyMmRtYSk7CkBAIC05NDYsNiArOTU1LDE1IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwdnIyZmJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKKwlpZiAoZmJfaW5mby0+c2NyZWVuX2Jhc2UpIHsKKwkJaW91bm1hcChmYl9pbmZvLT5zY3JlZW5fYmFzZSk7CisJCWZiX2luZm8tPnNjcmVlbl9iYXNlID0gTlVMTDsKKwl9CisJaWYgKGN1cnJlbnRwYXItPm1taW9fYmFzZSkgeworCQlpb3VubWFwKCh2b2lkICopY3VycmVudHBhci0+bW1pb19iYXNlKTsKKwkJY3VycmVudHBhci0+bW1pb19iYXNlID0gMDsKKwl9CisKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKaW5kZXggOGE4YWU1NS4uMzhlYjBiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9weGFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcHhhZmIuYwpAQCAtOTY0LDkgKzk2NCwxMCBAQAogICogT3VyIExDRCBjb250cm9sbGVyIHRhc2sgKHdoaWNoIGlzIGNhbGxlZCB3aGVuIHdlIGJsYW5rIG9yIHVuYmxhbmspCiAgKiB2aWEga2V2ZW50ZC4KICAqLwotc3RhdGljIHZvaWQgcHhhZmJfdGFzayh2b2lkICpkdW1teSkKK3N0YXRpYyB2b2lkIHB4YWZiX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBweGFmYl9pbmZvICpmYmkgPSBkdW1teTsKKwlzdHJ1Y3QgcHhhZmJfaW5mbyAqZmJpID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBweGFmYl9pbmZvLCB0YXNrKTsKIAl1X2ludCBzdGF0ZSA9IHhjaGcoJmZiaS0+dGFza19zdGF0ZSwgLTEpOwogCiAJc2V0X2N0cmxyX3N0YXRlKGZiaSwgc3RhdGUpOwpAQCAtMTE1OSw3ICsxMTYwLDcgQEAKIAl9CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYmktPmN0cmxyX3dhaXQpOwotCUlOSVRfV09SSygmZmJpLT50YXNrLCBweGFmYl90YXNrLCBmYmkpOworCUlOSVRfV09SSygmZmJpLT50YXNrLCBweGFmYl90YXNrKTsKIAlpbml0X01VVEVYKCZmYmktPmN0cmxyX3NlbSk7CiAKIAlyZXR1cm4gZmJpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9yZXR6M2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3JldHozZmIuYwppbmRleCBjZjQxZmYxLi5iYzdmZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3JldHozZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3JldHozZmIuYwpAQCAtMTQyMyw4ICsxNDIzLDEwIEBACiAKIAkJZG9faW5zdGFsbF9jbWFwKDAsIGZiX2luZm8pOwogCi0JCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihmYl9pbmZvKSA8IDApCisJCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihmYl9pbmZvKSA8IDApIHsKKwkJCWlvdW5tYXAoemluZm8tPmJhc2UpOwogCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAogCQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlLCB1c2luZyAlbGRLIG9mICIKIAkJICAgICAgICJ2aWRlbyBtZW1vcnlcbiIsIGZiX2luZm8tPm5vZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYyBiL2RyaXZlcnMvdmlkZW8vcml2YS9mYmRldi5jCmluZGV4IGE0MzNjYzcuLjM0NWU4YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcml2YS9mYmRldi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcml2YS9mYmRldi5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgogI2lmZGVmIENPTkZJR19NVFJSCiAjaW5jbHVkZSA8YXNtL210cnIuaD4KICNlbmRpZgpAQCAtNTIxLDQ4ICs1MjIsMTMgQEAKIAlyZXR1cm4gKFZHQV9SRDA4KHBhci0+cml2YS5QVklPLCAweDNjYykpOwogfQogCi1zdGF0aWMgdTggYnl0ZV9yZXZbMjU2XSA9IHsKLQkweDAwLCAweDgwLCAweDQwLCAweGMwLCAweDIwLCAweGEwLCAweDYwLCAweGUwLAotCTB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsCi0JMHgwOCwgMHg4OCwgMHg0OCwgMHhjOCwgMHgyOCwgMHhhOCwgMHg2OCwgMHhlOCwKLQkweDE4LCAweDk4LCAweDU4LCAweGQ4LCAweDM4LCAweGI4LCAweDc4LCAweGY4LAotCTB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsCi0JMHgxNCwgMHg5NCwgMHg1NCwgMHhkNCwgMHgzNCwgMHhiNCwgMHg3NCwgMHhmNCwKLQkweDBjLCAweDhjLCAweDRjLCAweGNjLCAweDJjLCAweGFjLCAweDZjLCAweGVjLAotCTB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsCi0JMHgwMiwgMHg4MiwgMHg0MiwgMHhjMiwgMHgyMiwgMHhhMiwgMHg2MiwgMHhlMiwKLQkweDEyLCAweDkyLCAweDUyLCAweGQyLCAweDMyLCAweGIyLCAweDcyLCAweGYyLAotCTB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsCi0JMHgxYSwgMHg5YSwgMHg1YSwgMHhkYSwgMHgzYSwgMHhiYSwgMHg3YSwgMHhmYSwKLQkweDA2LCAweDg2LCAweDQ2LCAweGM2LCAweDI2LCAweGE2LCAweDY2LCAweGU2LAotCTB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsCi0JMHgwZSwgMHg4ZSwgMHg0ZSwgMHhjZSwgMHgyZSwgMHhhZSwgMHg2ZSwgMHhlZSwKLQkweDFlLCAweDllLCAweDVlLCAweGRlLCAweDNlLCAweGJlLCAweDdlLCAweGZlLAotCTB4MDEsIDB4ODEsIDB4NDEsIDB4YzEsIDB4MjEsIDB4YTEsIDB4NjEsIDB4ZTEsCi0JMHgxMSwgMHg5MSwgMHg1MSwgMHhkMSwgMHgzMSwgMHhiMSwgMHg3MSwgMHhmMSwKLQkweDA5LCAweDg5LCAweDQ5LCAweGM5LCAweDI5LCAweGE5LCAweDY5LCAweGU5LAotCTB4MTksIDB4OTksIDB4NTksIDB4ZDksIDB4MzksIDB4YjksIDB4NzksIDB4ZjksCi0JMHgwNSwgMHg4NSwgMHg0NSwgMHhjNSwgMHgyNSwgMHhhNSwgMHg2NSwgMHhlNSwKLQkweDE1LCAweDk1LCAweDU1LCAweGQ1LCAweDM1LCAweGI1LCAweDc1LCAweGY1LAotCTB4MGQsIDB4OGQsIDB4NGQsIDB4Y2QsIDB4MmQsIDB4YWQsIDB4NmQsIDB4ZWQsCi0JMHgxZCwgMHg5ZCwgMHg1ZCwgMHhkZCwgMHgzZCwgMHhiZCwgMHg3ZCwgMHhmZCwKLQkweDAzLCAweDgzLCAweDQzLCAweGMzLCAweDIzLCAweGEzLCAweDYzLCAweGUzLAotCTB4MTMsIDB4OTMsIDB4NTMsIDB4ZDMsIDB4MzMsIDB4YjMsIDB4NzMsIDB4ZjMsCi0JMHgwYiwgMHg4YiwgMHg0YiwgMHhjYiwgMHgyYiwgMHhhYiwgMHg2YiwgMHhlYiwKLQkweDFiLCAweDliLCAweDViLCAweGRiLCAweDNiLCAweGJiLCAweDdiLCAweGZiLAotCTB4MDcsIDB4ODcsIDB4NDcsIDB4YzcsIDB4MjcsIDB4YTcsIDB4NjcsIDB4ZTcsCi0JMHgxNywgMHg5NywgMHg1NywgMHhkNywgMHgzNywgMHhiNywgMHg3NywgMHhmNywKLQkweDBmLCAweDhmLCAweDRmLCAweGNmLCAweDJmLCAweGFmLCAweDZmLCAweGVmLAotCTB4MWYsIDB4OWYsIDB4NWYsIDB4ZGYsIDB4M2YsIDB4YmYsIDB4N2YsIDB4ZmYsCi19OwotCiBzdGF0aWMgaW5saW5lIHZvaWQgcmV2ZXJzZV9vcmRlcih1MzIgKmwpCiB7CiAJdTggKmEgPSAodTggKilsOwotCSphID0gYnl0ZV9yZXZbKmFdLCBhKys7Ci0JKmEgPSBieXRlX3JldlsqYV0sIGErKzsKLQkqYSA9IGJ5dGVfcmV2WyphXSwgYSsrOwotCSphID0gYnl0ZV9yZXZbKmFdOworCWFbMF0gPSBiaXRyZXY4KGFbMF0pOworCWFbMV0gPSBiaXRyZXY4KGFbMV0pOworCWFbMl0gPSBiaXRyZXY4KGFbMl0pOworCWFbM10gPSBiaXRyZXY4KGFbM10pOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKQEAgLTc3NCwxMSArNzQwLDEyIEBACiAgKiBDQUxMRUQgRlJPTToKICAqIHJpdmFmYl9zZXRfcGFyKCkKICAqLwotc3RhdGljIHZvaWQgcml2YV9sb2FkX3ZpZGVvX21vZGUoc3RydWN0IGZiX2luZm8gKmluZm8pCitzdGF0aWMgaW50IHJpdmFfbG9hZF92aWRlb19tb2RlKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCWludCBicHAsIHdpZHRoLCBoRGlzcGxheVNpemUsIGhEaXNwbGF5LCBoU3RhcnQsCiAJICAgIGhFbmQsIGhUb3RhbCwgaGVpZ2h0LCB2RGlzcGxheSwgdlN0YXJ0LCB2RW5kLCB2VG90YWwsIGRvdENsb2NrOwogCWludCBoQmxhbmtTdGFydCwgaEJsYW5rRW5kLCB2QmxhbmtTdGFydCwgdkJsYW5rRW5kOworCWludCByYzsKIAlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlzdHJ1Y3Qgcml2YV9yZWdzIG5ld21vZGU7CiAJCkBAIC04ODQsOCArODUxLDEwIEBACiAJZWxzZQogCQluZXdtb2RlLm1pc2Nfb3V0cHV0IHw9IDB4ODA7CQogCi0JcGFyLT5yaXZhLkNhbGNTdGF0ZUV4dCgmcGFyLT5yaXZhLCAmbmV3bW9kZS5leHQsIGJwcCwgd2lkdGgsCi0JCQkJICBoRGlzcGxheVNpemUsIGhlaWdodCwgZG90Q2xvY2spOworCXJjID0gQ2FsY1N0YXRlRXh0KCZwYXItPnJpdmEsICZuZXdtb2RlLmV4dCwgYnBwLCB3aWR0aCwKKwkJCSAgaERpc3BsYXlTaXplLCBoZWlnaHQsIGRvdENsb2NrKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OwogCiAJbmV3bW9kZS5leHQuc2NhbGUgPSBOVl9SRDMyKHBhci0+cml2YS5QUkFNREFDLCAweDAwMDAwODQ4KSAmCiAJCTB4ZmZmMDAwZmY7CkBAIC05MTcsOCArODg2LDEyIEBACiAJcGFyLT5jdXJyZW50X3N0YXRlID0gbmV3bW9kZTsKIAlyaXZhX2xvYWRfc3RhdGUocGFyLCAmcGFyLT5jdXJyZW50X3N0YXRlKTsKIAlwYXItPnJpdmEuTG9ja1VubG9jaygmcGFyLT5yaXZhLCAwKTsgLyogaW1wb3J0YW50IGZvciBIVyBjdXJzb3IgKi8KKworb3V0OgogCXJpdmFmYl9ibGFuayhGQl9CTEFOS19VTkJMQU5LLCBpbmZvKTsKIAlOVlRSQUNFX0xFQVZFKCk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIHJpdmFfdXBkYXRlX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZWRiKQpAQCAtMTI4NiwxMiArMTI1OSwxNSBAQAogc3RhdGljIGludCByaXZhZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGluZm8tPnBhcjsKKwlpbnQgcmMgPSAwOwogCiAJTlZUUkFDRV9FTlRFUigpOwogCS8qIHZnYUhXdW5sb2NrKCkgKyByaXZhIHVubG9jayAoMHg3RikgKi8KIAlDUlRDb3V0KHBhciwgMHgxMSwgMHhGRik7CiAJcGFyLT5yaXZhLkxvY2tVbmxvY2soJnBhci0+cml2YSwgMCk7Ci0Jcml2YV9sb2FkX3ZpZGVvX21vZGUoaW5mbyk7CisJcmMgPSByaXZhX2xvYWRfdmlkZW9fbW9kZShpbmZvKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OwogCWlmKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkpCiAJCXJpdmFfc2V0dXBfYWNjZWwoaW5mbyk7CiAJCkBAIC0xMzA0LDggKzEyODAsMTAgQEAKIAkJaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSAxOwogCWVsc2UKIAkJaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSA0OworCitvdXQ6CiAJTlZUUkFDRV9MRUFWRSgpOwotCXJldHVybiAwOworCXJldHVybiByYzsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3JpdmEvcml2YV9ody5jIGIvZHJpdmVycy92aWRlby9yaXZhL3JpdmFfaHcuYwppbmRleCBiNmY4NjkwLi5lMGI4YzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3JpdmEvcml2YV9ody5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcml2YS9yaXZhX2h3LmMKQEAgLTEyMjcsNyArMTIyNyw3IEBACiAgKiBDYWxjdWxhdGUgZXh0ZW5kZWQgbW9kZSBwYXJhbWV0ZXJzIChTVkdBKSBhbmQgc2F2ZSBpbiBhIAogICogbW9kZSBzdGF0ZSBzdHJ1Y3R1cmUuCiAgKi8KLXN0YXRpYyB2b2lkIENhbGNTdGF0ZUV4dAoraW50IENhbGNTdGF0ZUV4dAogKAogICAgIFJJVkFfSFdfSU5TVCAgKmNoaXAsCiAgICAgUklWQV9IV19TVEFURSAqc3RhdGUsCkBAIC0xMjQ5LDcgKzEyNDksOCBAQAogICAgICAqIEV4dGVuZGVkIFJJVkEgcmVnaXN0ZXJzLgogICAgICAqLwogICAgIHBpeGVsRGVwdGggPSAoYnBwICsgMSkvODsKLSAgICBDYWxjVkNsb2NrKGRvdENsb2NrLCAmVkNsaywgJm0sICZuLCAmcCwgY2hpcCk7CisgICAgaWYgKCFDYWxjVkNsb2NrKGRvdENsb2NrLCAmVkNsaywgJm0sICZuLCAmcCwgY2hpcCkpCisgICAgCXJldHVybiAtRUlOVkFMOwogCiAgICAgc3dpdGNoIChjaGlwLT5BcmNoaXRlY3R1cmUpCiAgICAgewpAQCAtMTMyNyw2ICsxMzI4LDggQEAKICAgICBzdGF0ZS0+cGl0Y2gxICAgPQogICAgIHN0YXRlLT5waXRjaDIgICA9CiAgICAgc3RhdGUtPnBpdGNoMyAgID0gcGl4ZWxEZXB0aCAqIHdpZHRoOworCisgICAgcmV0dXJuIDA7CiB9CiAvKgogICogTG9hZCBmaXhlZCBmdW5jdGlvbiBzdGF0ZSBhbmQgcHJlLWNhbGN1bGF0ZWQvc3RvcmVkIHN0YXRlLgpAQCAtMjAyNiw3ICsyMDI5LDYgQEAKICAgICAgKi8KICAgICBjaGlwLT5CdXN5ICAgICAgICAgICAgPSBudjNCdXN5OwogICAgIGNoaXAtPlNob3dIaWRlQ3Vyc29yICA9IFNob3dIaWRlQ3Vyc29yOwotICAgIGNoaXAtPkNhbGNTdGF0ZUV4dCAgICA9IENhbGNTdGF0ZUV4dDsKICAgICBjaGlwLT5Mb2FkU3RhdGVFeHQgICAgPSBMb2FkU3RhdGVFeHQ7CiAgICAgY2hpcC0+VW5sb2FkU3RhdGVFeHQgID0gVW5sb2FkU3RhdGVFeHQ7CiAgICAgY2hpcC0+U2V0U3RhcnRBZGRyZXNzID0gU2V0U3RhcnRBZGRyZXNzMzsKQEAgLTIwODQsNyArMjA4Niw2IEBACiAgICAgICovCiAgICAgY2hpcC0+QnVzeSAgICAgICAgICAgID0gbnY0QnVzeTsKICAgICBjaGlwLT5TaG93SGlkZUN1cnNvciAgPSBTaG93SGlkZUN1cnNvcjsKLSAgICBjaGlwLT5DYWxjU3RhdGVFeHQgICAgPSBDYWxjU3RhdGVFeHQ7CiAgICAgY2hpcC0+TG9hZFN0YXRlRXh0ICAgID0gTG9hZFN0YXRlRXh0OwogICAgIGNoaXAtPlVubG9hZFN0YXRlRXh0ICA9IFVubG9hZFN0YXRlRXh0OwogICAgIGNoaXAtPlNldFN0YXJ0QWRkcmVzcyA9IFNldFN0YXJ0QWRkcmVzczsKQEAgLTIxODYsNyArMjE4Nyw2IEBACiAgICAgICovCiAgICAgY2hpcC0+QnVzeSAgICAgICAgICAgID0gbnYxMEJ1c3k7CiAgICAgY2hpcC0+U2hvd0hpZGVDdXJzb3IgID0gU2hvd0hpZGVDdXJzb3I7Ci0gICAgY2hpcC0+Q2FsY1N0YXRlRXh0ICAgID0gQ2FsY1N0YXRlRXh0OwogICAgIGNoaXAtPkxvYWRTdGF0ZUV4dCAgICA9IExvYWRTdGF0ZUV4dDsKICAgICBjaGlwLT5VbmxvYWRTdGF0ZUV4dCAgPSBVbmxvYWRTdGF0ZUV4dDsKICAgICBjaGlwLT5TZXRTdGFydEFkZHJlc3MgPSBTZXRTdGFydEFkZHJlc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3JpdmEvcml2YV9ody5oIGIvZHJpdmVycy92aWRlby9yaXZhL3JpdmFfaHcuaAppbmRleCBhMWU3MWE2Li5jMjc2OWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3JpdmEvcml2YV9ody5oCisrKyBiL2RyaXZlcnMvdmlkZW8vcml2YS9yaXZhX2h3LmgKQEAgLTQ2Myw3ICs0NjMsNiBAQAogICAgICAqIENvbW1vbiBjaGlwIGZ1bmN0aW9ucy4KICAgICAgKi8KICAgICBpbnQgICgqQnVzeSkoc3RydWN0IF9yaXZhX2h3X2luc3QgKik7Ci0gICAgdm9pZCAoKkNhbGNTdGF0ZUV4dCkoc3RydWN0IF9yaXZhX2h3X2luc3QgKixzdHJ1Y3QgX3JpdmFfaHdfc3RhdGUgKixpbnQsaW50LGludCxpbnQsaW50KTsKICAgICB2b2lkICgqTG9hZFN0YXRlRXh0KShzdHJ1Y3QgX3JpdmFfaHdfaW5zdCAqLHN0cnVjdCBfcml2YV9od19zdGF0ZSAqKTsKICAgICB2b2lkICgqVW5sb2FkU3RhdGVFeHQpKHN0cnVjdCBfcml2YV9od19pbnN0ICosc3RydWN0IF9yaXZhX2h3X3N0YXRlICopOwogICAgIHZvaWQgKCpTZXRTdGFydEFkZHJlc3MpKHN0cnVjdCBfcml2YV9od19pbnN0ICosVTAzMik7CkBAIC01MjgsNiArNTI3LDIyIEBACiAgICAgVTAzMiBwaXRjaDI7CiAgICAgVTAzMiBwaXRjaDM7CiB9IFJJVkFfSFdfU1RBVEU7CisKKy8qCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKworZXh0ZXJuIGludCBDYWxjU3RhdGVFeHQKKygKKyAgICBSSVZBX0hXX0lOU1QgICpjaGlwLAorICAgIFJJVkFfSFdfU1RBVEUgKnN0YXRlLAorICAgIGludCAgICAgICAgICAgIGJwcCwKKyAgICBpbnQgICAgICAgICAgICB3aWR0aCwKKyAgICBpbnQgICAgICAgICAgICBoRGlzcGxheVNpemUsCisgICAgaW50ICAgICAgICAgICAgaGVpZ2h0LAorICAgIGludCAgICAgICAgICAgIGRvdENsb2NrCispOworCiAvKgogICogRXh0ZXJuYWwgcm91dGluZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcml2YS9yaXZhZmItaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvcml2YWZiLWkyYy5jCmluZGV4IGMxNWIyNTkuLjAxYjg1ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcml2YS9yaXZhZmItaTJjLmMKKysrIGIvZHJpdmVycy92aWRlby9yaXZhL3JpdmFmYi1pMmMuYwpAQCAtMTQ0LDE1ICsxNDQsMTUgQEAKIHZvaWQgcml2YV9kZWxldGVfaTJjX2J1c3NlcyhzdHJ1Y3Qgcml2YV9wYXIgKnBhcikKIHsKIAlpZiAocGFyLT5jaGFuWzBdLnBhcikKLQkJaTJjX2JpdF9kZWxfYnVzKCZwYXItPmNoYW5bMF0uYWRhcHRlcik7CisJCWkyY19kZWxfYWRhcHRlcigmcGFyLT5jaGFuWzBdLmFkYXB0ZXIpOwogCXBhci0+Y2hhblswXS5wYXIgPSBOVUxMOwogCiAJaWYgKHBhci0+Y2hhblsxXS5wYXIpCi0JCWkyY19iaXRfZGVsX2J1cygmcGFyLT5jaGFuWzFdLmFkYXB0ZXIpOworCQlpMmNfZGVsX2FkYXB0ZXIoJnBhci0+Y2hhblsxXS5hZGFwdGVyKTsKIAlwYXItPmNoYW5bMV0ucGFyID0gTlVMTDsKIAogCWlmIChwYXItPmNoYW5bMl0ucGFyKQotCQlpMmNfYml0X2RlbF9idXMoJnBhci0+Y2hhblsyXS5hZGFwdGVyKTsKKwkJaTJjX2RlbF9hZGFwdGVyKCZwYXItPmNoYW5bMl0uYWRhcHRlcik7CiAJcGFyLT5jaGFuWzJdLnBhciA9IE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCmluZGV4IDU5NDA3MzQuLmNjZWY1NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAJc2FkZHIyICs9ICh2YXItPnhyZXMgKiB2YXItPnlyZXMgKiB2YXItPmJpdHNfcGVyX3BpeGVsKS84OwogCXNhZGRyMj4+PSAxOwogCi0Jc2FkZHIzID0gIFMzQzI0MTBfT0ZGU0laRSgwKSB8IFMzQzI0MTBfUEFHRVdJRFRIKHZhci0+eHJlcyk7CisJc2FkZHIzID0gIFMzQzI0MTBfT0ZGU0laRSgwKSB8IFMzQzI0MTBfUEFHRVdJRFRIKCh2YXItPnhyZXMgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gMTYpICYgMHgzZmYpOwogCiAJZHByaW50aygiTENEU0FERFIxID0gMHglMDhseFxuIiwgc2FkZHIxKTsKIAlkcHJpbnRrKCJMQ0RTQUREUjIgPSAweCUwOGx4XG4iLCBzYWRkcjIpOwpAQCAtMTk5LDI4ICsxOTksODYgQEAKIAkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IGZiaS0+bWFjaF9pbmZvLT5icHAubWluOwogCiAJLyogc2V0IHIvZy9iIHBvc2l0aW9ucyAqLworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJY2FzZSA0OgorCQkJdmFyLT5yZWQub2Zmc2V0ICAgIAk9IDA7CisJCQl2YXItPnJlZC5sZW5ndGggICAgCT0gdmFyLT5iaXRzX3Blcl9waXhlbDsKKwkJCXZhci0+Z3JlZW4gICAgICAgICAJPSB2YXItPnJlZDsKKwkJCXZhci0+Ymx1ZSAgICAgICAgICAJPSB2YXItPnJlZDsKKwkJCXZhci0+dHJhbnNwLm9mZnNldCAJPSAwOworCQkJdmFyLT50cmFuc3AubGVuZ3RoIAk9IDA7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJaWYgKCBmYmktPm1hY2hfaW5mby0+dHlwZSAhPSBTM0MyNDEwX0xDRENPTjFfVEZUICkgeworCQkJCS8qIDggYnBwIDMzMiAqLworCQkJCXZhci0+cmVkLmxlbmd0aAkJPSAzOworCQkJCXZhci0+cmVkLm9mZnNldAkJPSA1OworCQkJCXZhci0+Z3JlZW4ubGVuZ3RoCT0gMzsKKwkJCQl2YXItPmdyZWVuLm9mZnNldAk9IDI7CisJCQkJdmFyLT5ibHVlLmxlbmd0aAk9IDI7CisJCQkJdmFyLT5ibHVlLm9mZnNldAk9IDA7CisJCQkJdmFyLT50cmFuc3AubGVuZ3RoCT0gMDsKKwkJCX0gZWxzZSB7CisJCQkJdmFyLT5yZWQub2Zmc2V0ICAgIAk9IDA7CisJCQkJdmFyLT5yZWQubGVuZ3RoICAgIAk9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJCQkJdmFyLT5ncmVlbiAgICAgICAgIAk9IHZhci0+cmVkOworCQkJCXZhci0+Ymx1ZSAgICAgICAgICAJPSB2YXItPnJlZDsKKwkJCQl2YXItPnRyYW5zcC5vZmZzZXQgCT0gMDsKKwkJCQl2YXItPnRyYW5zcC5sZW5ndGggCT0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJLyogMTIgYnBwIDQ0NCAqLworCQkJdmFyLT5yZWQubGVuZ3RoCQk9IDQ7CisJCQl2YXItPnJlZC5vZmZzZXQJCT0gODsKKwkJCXZhci0+Z3JlZW4ubGVuZ3RoCT0gNDsKKwkJCXZhci0+Z3JlZW4ub2Zmc2V0CT0gNDsKKwkJCXZhci0+Ymx1ZS5sZW5ndGgJPSA0OworCQkJdmFyLT5ibHVlLm9mZnNldAk9IDA7CisJCQl2YXItPnRyYW5zcC5sZW5ndGgJPSAwOworCQkJYnJlYWs7CiAKLQlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA9PSAxNikgewotCQl2YXItPnJlZC5vZmZzZXQJCT0gMTE7Ci0JCXZhci0+Z3JlZW4ub2Zmc2V0CT0gNTsKLQkJdmFyLT5ibHVlLm9mZnNldAk9IDA7Ci0JCXZhci0+cmVkLmxlbmd0aAkJPSA1OwotCQl2YXItPmdyZWVuLmxlbmd0aAk9IDY7Ci0JCXZhci0+Ymx1ZS5sZW5ndGgJPSA1OwotCQl2YXItPnRyYW5zcC5sZW5ndGgJPSAwOwotCX0gZWxzZSB7Ci0JCXZhci0+cmVkLmxlbmd0aAkJPSB2YXItPmJpdHNfcGVyX3BpeGVsOwotCQl2YXItPnJlZC5vZmZzZXQJCT0gMDsKLQkJdmFyLT5ncmVlbi5sZW5ndGgJPSB2YXItPmJpdHNfcGVyX3BpeGVsOwotCQl2YXItPmdyZWVuLm9mZnNldAk9IDA7Ci0JCXZhci0+Ymx1ZS5sZW5ndGgJPSB2YXItPmJpdHNfcGVyX3BpeGVsOwotCQl2YXItPmJsdWUub2Zmc2V0CT0gMDsKLQkJdmFyLT50cmFuc3AubGVuZ3RoCT0gMDsKKwkJZGVmYXVsdDoKKwkJY2FzZSAxNjoKKwkJCWlmIChmYmktPnJlZ3MubGNkY29uNSAmIFMzQzI0MTBfTENEQ09ONV9GUk01NjUgKSB7CisJCQkJLyogMTYgYnBwLCA1NjUgZm9ybWF0ICovCisJCQkJdmFyLT5yZWQub2Zmc2V0CQk9IDExOworCQkJCXZhci0+Z3JlZW4ub2Zmc2V0CT0gNTsKKwkJCQl2YXItPmJsdWUub2Zmc2V0CT0gMDsKKwkJCQl2YXItPnJlZC5sZW5ndGgJCT0gNTsKKwkJCQl2YXItPmdyZWVuLmxlbmd0aAk9IDY7CisJCQkJdmFyLT5ibHVlLmxlbmd0aAk9IDU7CisJCQkJdmFyLT50cmFuc3AubGVuZ3RoCT0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyogMTYgYnBwLCA1NTUxIGZvcm1hdCAqLworCQkJCXZhci0+cmVkLm9mZnNldAkJPSAxMTsKKwkJCQl2YXItPmdyZWVuLm9mZnNldAk9IDY7CisJCQkJdmFyLT5ibHVlLm9mZnNldAk9IDE7CisJCQkJdmFyLT5yZWQubGVuZ3RoCQk9IDU7CisJCQkJdmFyLT5ncmVlbi5sZW5ndGgJPSA1OworCQkJCXZhci0+Ymx1ZS5sZW5ndGgJPSA1OworCQkJCXZhci0+dHJhbnNwLmxlbmd0aAk9IDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCS8qIDI0IGJwcCA4ODggKi8KKwkJCXZhci0+cmVkLmxlbmd0aAkJPSA4OworCQkJdmFyLT5yZWQub2Zmc2V0CQk9IDE2OworCQkJdmFyLT5ncmVlbi5sZW5ndGgJPSA4OworCQkJdmFyLT5ncmVlbi5vZmZzZXQJPSA4OworCQkJdmFyLT5ibHVlLmxlbmd0aAk9IDg7CisJCQl2YXItPmJsdWUub2Zmc2V0CT0gMDsKKwkJCXZhci0+dHJhbnNwLmxlbmd0aAk9IDA7CisJCQlicmVhazsKKworCiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKKwogLyogczNjMjQxMGZiX2FjdGl2YXRlX3ZhcgogICoKICAqIGFjdGl2YXRlIChzZXQpIHRoZSBjb250cm9sbGVyIGZyb20gdGhlIGdpdmVuIGZyYW1lYnVmZmVyCkBAIC0yMzAsMjkgKzI4OCw2MSBAQAogc3RhdGljIHZvaWQgczNjMjQxMGZiX2FjdGl2YXRlX3ZhcihzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSwKIAkJCQkgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKIHsKKwlpbnQgaHM7CisKIAlmYmktPnJlZ3MubGNkY29uMSAmPSB+UzNDMjQxMF9MQ0RDT04xX01PREVNQVNLOworCWZiaS0+cmVncy5sY2Rjb24xICY9IH5TM0MyNDEwX0xDRENPTjFfVEZUOwogCiAJZHByaW50aygiJXM6IHZhci0+eHJlcyAgPSAlZFxuIiwgX19GVU5DVElPTl9fLCB2YXItPnhyZXMpOwogCWRwcmludGsoIiVzOiB2YXItPnlyZXMgID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgdmFyLT55cmVzKTsKIAlkcHJpbnRrKCIlczogdmFyLT5icHAgICA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhci0+Yml0c19wZXJfcGl4ZWwpOwogCi0Jc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7Ci0JY2FzZSAxOgotCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUMUJQUDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUMkJQUDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUNEJQUDsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUOEJQUDsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJZmJpLT5yZWdzLmxjZGNvbjEgfD0gUzNDMjQxMF9MQ0RDT04xX1RGVDE2QlBQOwotCQlicmVhazsKLQl9CisJZmJpLT5yZWdzLmxjZGNvbjEgfD0gZmJpLT5tYWNoX2luZm8tPnR5cGU7CisKKwlpZiAoZmJpLT5tYWNoX2luZm8tPnR5cGUgPT0gUzNDMjQxMF9MQ0RDT04xX1RGVCkKKwkJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgMToKKwkJCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9URlQxQlBQOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9URlQyQlBQOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9URlQ0QlBQOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9URlQ4QlBQOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfVEZUMTZCUFA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogaW52YWxpZCBwaXhlbCBkZXB0aCAqLworCQkJZGV2X2VycihmYmktPmRldiwgImludmFsaWQgYnBwICVkXG4iLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKKwkJfQorCWVsc2UKKwkJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJCWNhc2UgMToKKwkJCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9TVE4xQlBQOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9TVE4yR1JFWTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlmYmktPnJlZ3MubGNkY29uMSB8PSBTM0MyNDEwX0xDRENPTjFfU1RONEdSRVk7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJZmJpLT5yZWdzLmxjZGNvbjEgfD0gUzNDMjQxMF9MQ0RDT04xX1NUTjhCUFA7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCWZiaS0+cmVncy5sY2Rjb24xIHw9IFMzQzI0MTBfTENEQ09OMV9TVE4xMkJQUDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBpbnZhbGlkIHBpeGVsIGRlcHRoICovCisJCQlkZXZfZXJyKGZiaS0+ZGV2LCAiaW52YWxpZCBicHAgJWRcbiIsIHZhci0+Yml0c19wZXJfcGl4ZWwpOworCQl9CiAKIAkvKiBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB1cGRhdGUgc3luYy9ib3JkZXJzICovCiAKQEAgLTI4MywxNSArMzczLDQ0IEBACiAJZmJpLT5yZWdzLmxjZGNvbjIgJj0gflMzQzI0MTBfTENEQ09OMl9MSU5FVkFMKDB4M2ZmKTsKIAlmYmktPnJlZ3MubGNkY29uMiB8PSAgUzNDMjQxMF9MQ0RDT04yX0xJTkVWQUwodmFyLT55cmVzIC0gMSk7CiAKKwlzd2l0Y2goZmJpLT5tYWNoX2luZm8tPnR5cGUpIHsKKwkJY2FzZSBTM0MyNDEwX0xDRENPTjFfRFNDQU40OgorCQljYXNlIFMzQzI0MTBfTENEQ09OMV9TVE44OgorCQkJaHMgPSB2YXItPnhyZXMgLyA4OworCQkJYnJlYWs7CisJCWNhc2UgUzNDMjQxMF9MQ0RDT04xX1NUTjQ6CisJCQlocyA9IHZhci0+eHJlcyAvIDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBTM0MyNDEwX0xDRENPTjFfVEZUOgorCQkJaHMgPSB2YXItPnhyZXM7CisJCQlicmVhazsKKworCX0KKworCS8qIFNwZWNpYWwgY2FzZXMgOiBTVE4gY29sb3IgZGlzcGxheXMgKi8KKwlpZiAoICgoZmJpLT5yZWdzLmxjZGNvbjEgJiBTM0MyNDEwX0xDRENPTjFfTU9ERU1BU0spID09IFMzQzI0MTBfTENEQ09OMV9TVE44QlBQKSBcCisJICB8fCAoKGZiaS0+cmVncy5sY2Rjb24xICYgUzNDMjQxMF9MQ0RDT04xX01PREVNQVNLKSA9PSBTM0MyNDEwX0xDRENPTjFfU1ROMTJCUFApICkgeworCQlocyA9IGhzICogMzsKKwl9CisKKwogCWZiaS0+cmVncy5sY2Rjb24zICY9IH5TM0MyNDEwX0xDRENPTjNfSE9aVkFMKDB4N2ZmKTsKLQlmYmktPnJlZ3MubGNkY29uMyB8PSAgUzNDMjQxMF9MQ0RDT04zX0hPWlZBTCh2YXItPnhyZXMgLSAxKTsKKwlmYmktPnJlZ3MubGNkY29uMyB8PSAgUzNDMjQxMF9MQ0RDT04zX0hPWlZBTChocyAtIDEpOwogCiAJaWYgKHZhci0+cGl4Y2xvY2sgPiAwKSB7CiAJCWludCBjbGtkaXYgPSBzM2MyNDEwZmJfY2FsY19waXhjbGsoZmJpLCB2YXItPnBpeGNsb2NrKTsKIAotCQljbGtkaXYgPSAoY2xrZGl2IC8gMikgLTE7Ci0JCWlmIChjbGtkaXYgPCAwKQotCQkJY2xrZGl2ID0gMDsKKwkJaWYgKGZiaS0+bWFjaF9pbmZvLT50eXBlID09IFMzQzI0MTBfTENEQ09OMV9URlQpIHsKKwkJCWNsa2RpdiA9IChjbGtkaXYgLyAyKSAtMTsKKwkJCWlmIChjbGtkaXYgPCAwKQorCQkJCWNsa2RpdiA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQljbGtkaXYgPSAoY2xrZGl2IC8gMik7CisJCQlpZiAoY2xrZGl2IDwgMikKKwkJCQljbGtkaXYgPSAyOworCQl9CiAKIAkJZmJpLT5yZWdzLmxjZGNvbjEgJj0gflMzQzI0MTBfTENEQ09OMV9DTEtWQUwoMHgzZmYpOwogCQlmYmktPnJlZ3MubGNkY29uMSB8PSAgUzNDMjQxMF9MQ0RDT04xX0NMS1ZBTChjbGtkaXYpOwpAQCAtMzI5LDEwICs0NDgsMTggQEAKIAlzdHJ1Y3QgczNjMjQxMGZiX2luZm8gKmZiaSA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7CiAKLQlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA9PSAxNikKLQkJZmJpLT5mYi0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7Ci0JZWxzZQotCQlmYmktPmZiLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkKKwl7CisJCWNhc2UgMTY6CisJCQlmYmktPmZiLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkgZmJpLT5mYi0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9NT05PMDE7CisJCQkgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkgZmJpLT5mYi0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKwkJCSBicmVhazsKKwl9CiAKIAlmYmktPmZiLT5maXgubGluZV9sZW5ndGggICAgID0gKHZhci0+d2lkdGgqdmFyLT5iaXRzX3Blcl9waXhlbCkvODsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmItaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYwppbmRleCAzZjk0MjIzLi4xNDExZjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYi1pMmMuYwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJaWYgKHBhci0+Y2hhbi5wYXIpCi0JCWkyY19iaXRfZGVsX2J1cygmcGFyLT5jaGFuLmFkYXB0ZXIpOworCQlpMmNfZGVsX2FkYXB0ZXIoJnBhci0+Y2hhbi5hZGFwdGVyKTsKIAogCXBhci0+Y2hhbi5wYXIgPSBOVUxMOwogfQpAQCAtMjI3LDExICsyMjcsOCBAQAogCQkvKiB0cnkgdG8gZ2V0IGZyb20gZmlybXdhcmUgKi8KIAkJY29uc3QgdTggKmUgPSBmYl9maXJtd2FyZV9lZGlkKGluZm8tPmRldmljZSk7CiAKLQkJaWYgKGUpIHsKLQkJCWVkaWQgPSBrbWFsbG9jKEVESURfTEVOR1RILCBHRlBfS0VSTkVMKTsKLQkJCWlmIChlZGlkKQotCQkJCW1lbWNweShlZGlkLCBlLCBFRElEX0xFTkdUSCk7Ci0JCX0KKwkJaWYgKGUpCisJCQllZGlkID0ga21lbWR1cChlLCBFRElEX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CiAJfQogCiAJKm91dF9lZGlkID0gZWRpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuYyBiL2RyaXZlcnMvdmlkZW8vc2lzL2luaXQzMDEuYwppbmRleCBmMTNmYWRkLi40N2UxODk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Npcy9pbml0MzAxLmMKKysrIGIvZHJpdmVycy92aWRlby9zaXMvaW5pdDMwMS5jCkBAIC00NDUsMTEgKzQ0NSw4IEBACiB2b2lkCiBTaVNfRERDMkRlbGF5KHN0cnVjdCBTaVNfUHJpdmF0ZSAqU2lTX1ByLCB1bnNpZ25lZCBpbnQgZGVsYXl0aW1lKQogewotICAgdW5zaWduZWQgaW50IGksIGo7Ci0KLSAgIGZvcihpID0gMDsgaSA8IGRlbGF5dGltZTsgaSsrKSB7Ci0gICAgICBqICs9IFNpU19HZXRSZWcoU2lTX1ByLT5TaVNfUDNjNCwweDA1KTsKLSAgIH0KKyAgIHdoaWxlIChkZWxheXRpbWUtLSA+IDApCisgICAgICBTaVNfR2V0UmVnKFNpU19Qci0+U2lTX1AzYzQsIDB4MDUpOwogfQogCiAjaWYgZGVmaW5lZChTSVMzMDApIHx8IGRlZmluZWQoU0lTMzE1SCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc3N0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc3N0ZmIuYwppbmRleCA3MTFjYjExLi41OWNkMWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NzdGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zc3RmYi5jCkBAIC0yMSw2ICsyMSwxMSBAQAogICoJUmVtb3ZlIG5ldmVyIGZpbmlzaGVkIGFuZCBib2d1cyAyNC8zMmJpdCBzdXBwb3J0CiAgKglDbGVhbiB1cCBtYWNybyBhYnVzZQogICoJTWlub3IgdGlkeWluZyBmb3IgZm9ybWF0LgorICogMTIvMjAwNiBIZWxnZSBEZWxsZXIgICAgPGRlbGxlckBnbXguZGU+CisgKglhZGQgL3N5cy9jbGFzcy9ncmFwaGljcy9mYlgvdmdhcGFzcyBzeXNmcy1pbnRlcmZhY2UKKyAqCWFkZCBtb2R1bGUgb3B0aW9uICJtb2RlX29wdGlvbiIgdG8gc2V0IGluaXRpYWwgc2NyZWVuIG1vZGUKKyAqCXVzZSBmYmRldiBkZWZhdWx0IHZpZGVvbW9kZSBkYXRhYmFzZQorICoJcmVtb3ZlIGRlYnVnIGZ1bmN0aW9ucyBmcm9tIGlvY3RsCiAgKi8KIAogLyoKQEAgLTY1LDE5ICs3MCwxMCBAQAogICoKICAqIHNzdGZiIHNwZWNpZmljIGlvY3RsczoKICAqICAgCQl0b2dnbGUgdmdhICgweDQ2ZGIpIDogdG9nZ2xlIHZnYV9wYXNzX3Rocm91Z2gKLSAqICAgCQlmaWxsIGZiICAgICgweDQ2ZGMpIDogZmlsbHMgZmIKLSAqICAgCQl0ZXN0IGRpc3AgICgweDQ2ZGUpIDogZHJhd3MgYSB0ZXN0IGltYWdlCiAgKi8KIAogI3VuZGVmIFNTVF9ERUJVRwogCi0vKgotICBEZWZhdWx0IHZpZGVvIG1vZGUgLgotICAwIDgwMHg2MDBANjAgIHRvb2sgZnJvbSBnbGlkZQotICAxIDY0MHg0ODBANzUgIHRvb2sgZnJvbSBnbGlkZQotICAyIDEwMjR4NzY4QDc2IHN0ZCBmYi5tb2RlCi0gIDMgNjQweDQ4MEA2MCAgZ2xpZGUgZGVmYXVsdCAqLwotI2RlZmluZSBERUZBVUxUX01PREUgMyAKIAogLyoKICAqIEluY2x1ZGVzCkBAIC05MiwyMCArODgsMjQgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8dmlkZW8vc3N0ZmIuaD4KIAogCiAvKiBpbml0aWFsaXplZCBieSBzZXR1cCAqLwogCi1zdGF0aWMgaW50IHZnYXBhc3M7CQkvKiBlbmFibGUgVmdhIHBhc3N0aHJvdWdoIGNhYmxlICovCitzdGF0aWMgaW50IHZnYXBhc3M7CQkvKiBlbmFibGUgVkdBIHBhc3N0aHJvdWdoIGNhYmxlICovCiBzdGF0aWMgaW50IG1lbTsJCQkvKiBtZW0gc2l6ZSBpbiBNQiwgMCA9IGF1dG9kZXRlY3QgKi8KIHN0YXRpYyBpbnQgY2xpcHBpbmcgPSAxOwkvKiB1c2UgY2xpcHBpbmcgKHNsb3dlciwgc2FmZXIpICovCiBzdGF0aWMgaW50IGdmeGNsazsJCS8qIGZvcmNlIEZCSSBmcmVxIGluIE1oeiAuIERhbmdlcm91cyAqLwogc3RhdGljIGludCBzbG93cGNpOwkJLyogc2xvdyBQQ0kgc2V0dGluZ3MgKi8KIAotc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9fZGV2aW5pdGRhdGE7CisvKgorICBQb3NzaWJsZSBkZWZhdWx0IHZpZGVvIG1vZGVzOiA4MDB4NjAwQDYwLCA2NDB4NDgwQDc1LCAxMDI0eDc2OEA3NiwgNjQweDQ4MEA2MAorKi8KKyNkZWZpbmUgREVGQVVMVF9WSURFT19NT0RFICI2NDB4NDgwQDYwIgorCitzdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19kZXZpbml0ZGF0YSA9IERFRkFVTFRfVklERU9fTU9ERTsKIAogZW51bSB7CiAJSURfVk9PRE9PMSA9IDAsCkBAIC0xMTksNDggKzExOSwxMSBAQAogIHsgLm5hbWUgPSAiVm9vZG9vMiIsCSAgICAgIC5kZWZhdWx0X2dmeF9jbG9jayA9IDc1MDAwLCAubWF4X2dmeGNsayA9IDg1IH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvCXNzdGZiX2RlZmF1bHQgPQotI2lmICggREVGQVVMVF9NT0RFID09IDAgKQotICAgIHsgLyogODAweDYwMEA2MCwgMTYgYnBwIC5ib3Jvd2VkIGZyb20gZ2xpZGUvc3N0MS9pbmNsdWRlL3NzdDFpbml0LmggKi8KLSAgICA4MDAsIDYwMCwgODAwLCA2MDAsIDAsIDAsIDE2LCAwLAotICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCi0gICAgMCwgMCwgLTEsIC0xLCAwLAotICAgIDI1MDAwLCA4NiwgNDEsIDIzLCAxLCAxMjcsIDQsCi0gICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9OwotI2VsaWYgKCBERUZBVUxUX01PREUgPT0gMSApCi0gICAgey8qIDY0MHg0ODBANzUsIDE2IGJwcCAuYm9yb3dlZCBmcm9tIGdsaWRlL3NzdDEvaW5jbHVkZS9zc3QxaW5pdC5oICovCi0gICAgNjQwLCA0ODAsIDY0MCwgNDgwLCAwLCAwLCAxNiwgMCwKLSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAotICAgIDAsIDAsIC0xLCAtMSwgMCwKLSAgICAzMTc0NiwgMTE4LCAxNywgMTYsIDEsIDYzLCAzLAotICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfTsKLSNlbGlmICggREVGQVVMVF9NT0RFID09IDIgKQotICAgIHsgLyogMTAyNHg3NjhANzYgdG9vayBmcm9tIG15IC9ldGMvZmIubW9kZXMgKi8KLSAgICAxMDI0LCA3NjgsIDEwMjQsIDc2OCwwLCAwLCAxNiwwLAotICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCi0gICAgMCwgMCwgLTEsIC0xLCAwLAotICAgIDExNzY0LCAyMDgsIDgsIDM2LCAxNiwgMTIwLCAzICwKLSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH07Ci0jZWxpZiAoIERFRkFVTFRfTU9ERSA9PSAzICkKLSAgICB7IC8qIDY0MHg0ODBANjAgLCAxNmJwcCBnbGlkZSBkZWZhdWx0ID8qLwotICAgIDY0MCwgNDgwLCA2NDAsIDQ4MCwgMCwgMCwgMTYsIDAsCi0gICAgezExLCA1LCAwfSwgezUsIDYsIDB9LCB7MCwgNSwgMH0sIHswLCAwLCAwfSwKLSAgICAwLCAwLCAtMSwgLTEsIDAsCi0gICAgMzk3MjEgLCAgMzgsIDI2ICwgIDI1ICwxOCAgLCA5NiAsMiwKLSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH07Ci0jZWxpZgotICAgICNlcnJvciAiSW52YWxpZCBERUZBVUxUX01PREUgdmFsdWUgISIKLSNlbmRpZgotCiAKIC8qCiAgKiBkZWJ1ZyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCBzc3RmYl9kcmF3ZGVidWdpbWFnZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50IHNzdGZiX2R1bXBfcmVncyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci0KLQogI2lmIChTU1RfREVCVUdfUkVHID4gMCkKIHN0YXRpYyB2b2lkIHNzdF9kYmdfcHJpbnRfcmVhZF9yZWcodTMyIHJlZywgdTMyIHZhbCkgewogCWNvbnN0IGNoYXIgKnJlZ25hbWU7CkBAIC03MjYsNTEgKzY4OSw3NyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNzdGZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCitzdGF0aWMgdm9pZCBzc3RmYl9zZXR2Z2FwYXNzKCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGVuYWJsZSApCiB7CiAJc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCXN0cnVjdCBwY2lfZGV2ICpzc3RfZGV2ID0gcGFyLT5kZXY7Ci0JdTMyIGZiaWluaXQwLCB0bXAsIHZhbDsKLQl1X2xvbmcgcDsKKwl1MzIgZmJpaW5pdDAsIHRtcDsKKworCWVuYWJsZSA9IGVuYWJsZSA/IDE6MDsKKwlpZiAocGFyLT52Z2FwYXNzID09IGVuYWJsZSkKKwkJcmV0dXJuOworCXBhci0+dmdhcGFzcyA9IGVuYWJsZTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzc3RfZGV2LCBQQ0lfSU5JVF9FTkFCTEUsICZ0bXApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc3N0X2RldiwgUENJX0lOSVRfRU5BQkxFLAorCQkJICAgICAgIHRtcCB8IFBDSV9FTl9JTklUX1dSICk7CisJZmJpaW5pdDAgPSBzc3RfcmVhZCAoRkJJSU5JVDApOworCWlmIChwYXItPnZnYXBhc3MpIHsKKwkJc3N0X3dyaXRlKEZCSUlOSVQwLCBmYmlpbml0MCAmIH5ESVNfVkdBX1BBU1NUSFJPVUdIKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogRW5hYmxpbmcgVkdBIHBhc3MtdGhyb3VnaFxuIiwgaW5mby0+bm9kZSApOworCX0gZWxzZSB7CisJCXNzdF93cml0ZShGQklJTklUMCwgZmJpaW5pdDAgfCBESVNfVkdBX1BBU1NUSFJPVUdIKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogRGlzYWJsaW5nIFZHQSBwYXNzLXRocm91Z2hcbiIsIGluZm8tPm5vZGUgKTsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzc3RfZGV2LCBQQ0lfSU5JVF9FTkFCTEUsIHRtcCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3ZnYXBhc3Moc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJY2hhciAqKiBsYXN0ID0gTlVMTDsKKwlpbnQgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBsYXN0LCAwKTsKKwlzc3RmYl9zZXR2Z2FwYXNzKGluZm8sIHZhbCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmdhcGFzcyhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBwYXItPnZnYXBhc3MpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2aWNlX2F0dHJzW10gPSB7CisJX19BVFRSKHZnYXBhc3MsIFNfSVJVR098U19JV1VTUiwgc2hvd192Z2FwYXNzLCBzdG9yZV92Z2FwYXNzKQorCX07CisKK3N0YXRpYyBpbnQgc3N0ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXI7CisJdTMyIHZhbDsKIAogCXN3aXRjaCAoY21kKSB7Ci0JCQotCS8qIGR1bXAgY3VycmVudCBGQklJTklUIHZhbHVlcyB0byBzeXN0ZW0gbG9nICovCi0JY2FzZSBfSU8oJ0YnLCAweGRiKTogICAgICAgICAgICAvKiAweDQ2ZGIgKi8KLQkJcmV0dXJuIHNzdGZiX2R1bXBfcmVncyhpbmZvKTsKLQkJCi0JLyogZmlsbHMgbGZiIHdpdGggI2FyZyBwaXhlbHMgKi8KLQljYXNlIF9JT1coJ0YnLCAweGRjLCB1MzIpOgkvKiAweDQ2ZGMgKi8KKwkvKiBzZXQvZ2V0IFZHQSBwYXNzX3Rocm91Z2ggbW9kZSAqLworCWNhc2UgU1NURkJfU0VUX1ZHQVBBU1M6CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih2YWwpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAodmFsID4gaW5mby0+Zml4LnNtZW1fbGVuKQotCQkJdmFsID0gaW5mby0+Zml4LnNtZW1fbGVuOwotCQlmb3IgKHAgPSAwIDsgcCA8IHZhbDsgcCArPSAyKQotCQkJd3JpdGV3KHAgPj4gNiwgaW5mby0+c2NyZWVuX2Jhc2UgKyBwKTsKKwkJc3N0ZmJfc2V0dmdhcGFzcyhpbmZvLCB2YWwpOwogCQlyZXR1cm4gMDsKLQkJCi0JLyogY2hhbmdlIFZHQSBwYXNzX3Rocm91Z2ggbW9kZSAqLwotCWNhc2UgX0lPVygnRicsIDB4ZGQsIHUzMik6CS8qIDB4NDZkZCAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodmFsKSkpCisJY2FzZSBTU1RGQl9HRVRfVkdBUEFTUzoKKwkJcGFyID0gaW5mby0+cGFyOworCQl2YWwgPSBwYXItPnZnYXBhc3M7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNzdF9kZXYsIFBDSV9JTklUX0VOQUJMRSwgJnRtcCk7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc3N0X2RldiwgUENJX0lOSVRfRU5BQkxFLAotCQkJCSAgICAgICB0bXAgfCBQQ0lfRU5fSU5JVF9XUiApOwotCQlmYmlpbml0MCA9IHNzdF9yZWFkIChGQklJTklUMCk7Ci0JCWlmICh2YWwpCi0JCQlzc3Rfd3JpdGUoRkJJSU5JVDAsIGZiaWluaXQwICYgfkVOX1ZHQV9QQVNTVEhST1VHSCk7Ci0JCWVsc2UKLQkJCXNzdF93cml0ZShGQklJTklUMCwgZmJpaW5pdDAgfCBFTl9WR0FfUEFTU1RIUk9VR0gpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNzdF9kZXYsIFBDSV9JTklUX0VOQUJMRSwgdG1wKTsKLQkJcmV0dXJuIDA7Ci0JCQotCS8qIGRyYXcgdGVzdCBpbWFnZSAgKi8KLQljYXNlIF9JTygnRicsIDB4ZGUpOgkJLyogMHg0NmRlICovCi0JCWZfZHByaW50aygidGVzdCBjb2xvciBkaXNwbGF5IGF0ICVkIGJwcFxuIiwKLQkJCQkJaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKLQkJc3N0ZmJfZHJhd2RlYnVnaW1hZ2UoaW5mbyk7CiAJCXJldHVybiAwOwogCX0KKwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC04MDQsNiArNzkzLDcgQEAKIC8qCiAgKiBGaWxsUmVjdCAyRCBjb21tYW5kIChzb2xpZGZpbGwgb3IgaW52ZXJ0ICh2aWEgUk9QX1hPUikpIC0gVm9vZG9vMiBvbmx5CiAgKi8KKyNpZiAwCiBzdGF0aWMgdm9pZCBzc3RmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KSAKIHsKIAlzdHJ1Y3Qgc3N0ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CkBAIC04MjUsNiArODE1LDcgQEAKIAkJIHwgKEJMVF8xNkJQUF9GTVQgPDwgMykgLyogfCBCSVQoMTQpICovIHwgQklUKDE1KSB8IEJJVCgxNikgKTsKIAlzc3Rfd2FpdF9pZGxlKCk7CiB9CisjZW5kaWYKIAogCiAKQEAgLTExNTYsNiArMTE0Nyw3IEBACiAJc3RydWN0IHBsbF90aW1pbmcgZ2Z4X3RpbWluZ3M7CiAJc3RydWN0IHNzdF9zcGVjICpzcGVjOwogCWludCBGb3V0OworCWludCBnZnhfY2xvY2s7CiAKIAlzcGVjID0gJnZvb2Rvb19zcGVjW3Bhci0+dHlwZV07CiAJZl9kZHByaW50aygiIGZiaWluaXQwICAgZmJpaW5pdDEgICBmYmlpbml0MiAgIGZiaWluaXQzICAgZmJpaW5pdDQgICIKQEAgLTExOTYsMTUgKzExODgsMTUgQEAKIAl9CiAKIAkvKiBzZXQgZ3JhcGhpYyBjbG9jayAqLwotCXBhci0+Z2Z4X2Nsb2NrID0gc3BlYy0+ZGVmYXVsdF9nZnhfY2xvY2s7CisJZ2Z4X2Nsb2NrID0gc3BlYy0+ZGVmYXVsdF9nZnhfY2xvY2s7CiAJaWYgKChnZnhjbGsgPjEwICkgJiYgKGdmeGNsayA8IHNwZWMtPm1heF9nZnhjbGspKSB7CiAJCXByaW50ayhLRVJOX0lORk8gInNzdGZiOiBVc2luZyBzdXBwbGllZCBncmFwaGljIGZyZXEgOiAlZE1IelxuIiwgZ2Z4Y2xrKTsKLQkJIHBhci0+Z2Z4X2Nsb2NrID0gZ2Z4Y2xrICoxMDAwOworCQkgZ2Z4X2Nsb2NrID0gZ2Z4Y2xrICoxMDAwOwogCX0gZWxzZSBpZiAoZ2Z4Y2xrKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNzdGZiOiAlZE1oeiBpcyB3YXkgb3V0IG9mIHNwZWMhIFVzaW5nIGRlZmF1bHRcbiIsIGdmeGNsayk7CiAJfQogCi0Jc3N0X2NhbGNfcGxsKHBhci0+Z2Z4X2Nsb2NrLCAmRm91dCwgJmdmeF90aW1pbmdzKTsKKwlzc3RfY2FsY19wbGwoZ2Z4X2Nsb2NrLCAmRm91dCwgJmdmeF90aW1pbmdzKTsKIAlwYXItPmRhY19zdy5zZXRfcGxsKGluZm8sICZnZnhfdGltaW5ncywgR0ZYX0NMT0NLKTsKIAogCS8qIGRpc2FibGUgZmJpaW5pdCByZW1hcCAqLwpAQCAtMTIxNSwxMCArMTIwNywxMSBAQAogCWZiaWluaXQwID0gRkJJSU5JVDBfREVGQVVMVDsKIAlmYmlpbml0MSA9IEZCSUlOSVQxX0RFRkFVTFQ7CiAJZmJpaW5pdDQgPSBGQklJTklUNF9ERUZBVUxUOwotCWlmICh2Z2FwYXNzKQotCQlmYmlpbml0MCAmPSB+RU5fVkdBX1BBU1NUSFJPVUdIOworCXBhci0+dmdhcGFzcyA9IHZnYXBhc3M7CisJaWYgKHBhci0+dmdhcGFzcykKKwkJZmJpaW5pdDAgJj0gfkRJU19WR0FfUEFTU1RIUk9VR0g7CiAJZWxzZQotCQlmYmlpbml0MCB8PSBFTl9WR0FfUEFTU1RIUk9VR0g7CisJCWZiaWluaXQwIHw9IERJU19WR0FfUEFTU1RIUk9VR0g7CiAJaWYgKHNsb3dwY2kpIHsKIAkJZmJpaW5pdDEgfD0gU0xPV19QQ0lfV1JJVEVTOwogCQlmYmlpbml0NCB8PSBTTE9XX1BDSV9SRUFEUzsKQEAgLTEyNjcsNyArMTI2MCw3IEBACiAJLyogVE9ETyBtYXliZSBzaHV0ZG93biB0aGUgZGFjLCB2cmVmcmVzaCBhbmQgc28gb24uLi4gKi8KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0lOSVRfRU5BQkxFLAogCSAgICAgICAgICAgICAgICAgICAgICAgUENJX0VOX0lOSVRfV1IpOwotCXNzdF91bnNldF9iaXRzKEZCSUlOSVQwLCBGQklfUkVTRVQgfCBGSUZPX1JFU0VUIHwgRU5fVkdBX1BBU1NUSFJPVUdIKTsKKwlzc3RfdW5zZXRfYml0cyhGQklJTklUMCwgRkJJX1JFU0VUIHwgRklGT19SRVNFVCB8IERJU19WR0FfUEFTU1RIUk9VR0gpOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfVkNMS19ESVNBQkxFLDApOwogCS8qIG1heWJlIGtlZXAgZmJpaW5pdCogYW5kIFBDSV9JTklUX2VuYWJsZSBpbiB0aGUgZmJfaW5mbyBzdHJ1Y3QKIAkgKiBmcm9tIHN0YXJ0ID8gKi8KQEAgLTEyNzgsOCArMTI3MSw3IEBACiAvKgogICogSW50ZXJmYWNlIHRvIHRoZSB3b3JsZAogICovCi0jaWZuZGVmIE1PRFVMRQotc3RhdGljIGludCAgX19pbml0IHNzdGZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50ICBfX2RldmluaXQgc3N0ZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKIAljaGFyICp0aGlzX29wdDsKIApAQCAtMTMxMiw3ICsxMzA0LDcgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKwogCiBzdGF0aWMgc3RydWN0IGZiX29wcyBzc3RmYl9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtMTQxNiwxNSArMTQwOCwxMCBAQAogCSAqLwogCWZpeC0+bGluZV9sZW5ndGggPSAyMDQ4OyAvKiBkZWZhdWx0IHZhbHVlLCBmb3IgMjQgb3IgMzJiaXQ6IDQwOTYgKi8KIAkKLQlpZiAoIG1vZGVfb3B0aW9uICYmCi0JICAgICBmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgbW9kZV9vcHRpb24sIE5VTEwsIDAsIE5VTEwsIDE2KSkgewotCQlwcmludGsoS0VSTl9FUlIgInNzdGZiOiBjYW4ndCBzZXQgc3VwcGxpZWQgdmlkZW8gbW9kZS4gVXNpbmcgZGVmYXVsdFxuIik7Ci0JCWluZm8tPnZhciA9IHNzdGZiX2RlZmF1bHQ7Ci0JfSBlbHNlCi0JCWluZm8tPnZhciA9IHNzdGZiX2RlZmF1bHQ7CisJZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIG1vZGVfb3B0aW9uLCBOVUxMLCAwLCBOVUxMLCAxNik7CiAKIAlpZiAoc3N0ZmJfY2hlY2tfdmFyKCZpbmZvLT52YXIsIGluZm8pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic3N0ZmI6IGludmFsaWQgZGVmYXVsdCB2aWRlbyBtb2RlLlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAic3N0ZmI6IGludmFsaWQgdmlkZW8gbW9kZS5cbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC0xNDQyLDEwICsxNDI5LDExIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAoMSkgLyogc2V0IHRvIDAgdG8gc2VlIGFuIGluaXRpYWwgYml0bWFwIGluc3RlYWQgKi8KLQkJc3N0ZmJfY2xlYXJfc2NyZWVuKGluZm8pOwotCWVsc2UKLQkJc3N0ZmJfZHJhd2RlYnVnaW1hZ2UoaW5mbyk7CisJc3N0ZmJfY2xlYXJfc2NyZWVuKGluZm8pOworCisJaWYgKGRldmljZV9jcmVhdGVfZmlsZShpbmZvLT5kZXYsICZkZXZpY2VfYXR0cnNbMF0pKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJzc3RmYjogY2FuJ3QgY3JlYXRlIHN5c2ZzIGVudHJ5LlxuIik7CisKIAogCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2UgYXQgMHglcFxuIiwKIAkgICAgICAgaW5mby0+bm9kZSwgZml4LT5pZCwgaW5mby0+c2NyZWVuX2Jhc2UpOwpAQCAtMTQ1Myw2ICsxNDQxLDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwogZmFpbF9mYl9yZW1hcDoKIAlpb3VubWFwKHBhci0+bW1pb192YmFzZSk7CkBAIC0xNDczLDIxICsxNDYyLDIzIEBACiAJaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlwYXIgPSBpbmZvLT5wYXI7CiAJCisJZGV2aWNlX3JlbW92ZV9maWxlKGluZm8tPmRldiwgJmRldmljZV9hdHRyc1swXSk7CiAJc3N0X3NodXRkb3duKGluZm8pOwotCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CiAJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiAJaW91bm1hcChwYXItPm1taW9fdmJhc2UpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXguc21lbV9zdGFydCwgMHg0MDAwMDApOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXgubW1pb19zdGFydCwgaW5mby0+Zml4Lm1taW9fbGVuKTsKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIH0KIAogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3N0ZmJfaWRfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEXzNERlgsIFBDSV9ERVZJQ0VfSURfM0RGWF9WT09ET08sCi0JICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBJRF9WT09ET08xIH0sCi0JeyBQQ0lfVkVORE9SX0lEXzNERlgsIFBDSV9ERVZJQ0VfSURfM0RGWF9WT09ET08yLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSURfVk9PRE9PMiB9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNzdGZiX2lkX3RibFtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEXzNERlgsIFBDSV9ERVZJQ0VfSURfM0RGWF9WT09ET08gKSwKKwkJLmRyaXZlcl9kYXRhID0gSURfVk9PRE9PMSwgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF8zREZYLCBQQ0lfREVWSUNFX0lEXzNERlhfVk9PRE9PMiksCisJCS5kcml2ZXJfZGF0YSA9IElEX1ZPT0RPTzIsIH0sCiAJeyAwIH0sCiB9OwogCkBAIC0xNTAxLDE0MiArMTQ5MiwyMyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzc3RmYl9pbml0KHZvaWQpCiB7Ci0jaWZuZGVmIE1PRFVMRQogCWNoYXIgKm9wdGlvbiA9IE5VTEw7CiAKIAlpZiAoZmJfZ2V0X29wdGlvbnMoInNzdGZiIiwgJm9wdGlvbikpCiAJCXJldHVybiAtRU5PREVWOwogCXNzdGZiX3NldHVwKG9wdGlvbik7Ci0jZW5kaWYKKwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzc3RmYl9kcml2ZXIpOwogfQogCi0jaWZkZWYgTU9EVUxFCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgc3N0ZmJfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3N0ZmJfZHJpdmVyKTsKIH0KLSNlbmRpZgogCiAKLS8qCi0gKiB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcgZnVuY3Rpb25zCi0gKi8KLQotc3RhdGljIGludCBzc3RmYl9kdW1wX3JlZ3Moc3RydWN0IGZiX2luZm8gKmluZm8pCi17Ci0jaWZkZWYgU1NUX0RFQlVHCi0Jc3RhdGljIHN0cnVjdCB7IHUzMiByZWcgOyBjb25zdCBjaGFyICpyZWdfbmFtZTt9ICBwY2lfcmVnc1tdID0gewotCQl7IFBDSV9JTklUX0VOQUJMRSwgImluaXRlbmFibGUifSwKLQkJeyBQQ0lfVkNMS19FTkFCTEUsICJlbmFibGUgdmNsayJ9LAotCQl7IFBDSV9WQ0xLX0RJU0FCTEUsICJkaXNhYmxlIHZjbGsifSwKLQl9OwotCi0Jc3RhdGljIHN0cnVjdCB7IHUzMiByZWcgOyBjb25zdCBjaGFyICpyZWdfbmFtZTt9ICBzc3RfcmVnc1tdID0gewotCQl7RkJJSU5JVDAsImZiaWluaXQwIn0sCi0JCXtGQklJTklUMSwiZmJpaW5pdDEifSwKLQkJe0ZCSUlOSVQyLCJmYmlpbml0MiJ9LAotCQl7RkJJSU5JVDMsImZiaWluaXQzIn0sCi0JCXtGQklJTklUNCwiZmJpaW5pdDQifSwKLQkJe0ZCSUlOSVQ1LCJmYmlpbml0NSJ9LAotCQl7RkJJSU5JVDYsImZiaWluaXQ2In0sCi0JCXtGQklJTklUNywiZmJpaW5pdDcifSwKLQkJe0xGQk1PREUsImxmYm1vZGUifSwKLQkJe0ZCWk1PREUsImZiem1vZGUifSwKLQl9OwotCi0JY29uc3QgaW50IHBjaV9zID0gQVJSQVlfU0laRShwY2lfcmVncyk7Ci0JY29uc3QgaW50IHNzdF9zID0gQVJSQVlfU0laRShzc3RfcmVncyk7Ci0Jc3RydWN0IHNzdGZiX3BhciAqcGFyID0gaW5mby0+cGFyOwotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBwYXItPmRldjsKLQl1MzIgcGNpX3Jlc1twY2lfc107Ci0JdTMyIHNzdF9yZXNbc3N0X3NdOwotCWludCBpOwotCi0JZm9yIChpPTA7IGk8cGNpX3M7IGkrKykgewotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwY2lfcmVnc1tpXS5yZWcsICZwY2lfcmVzW2ldKTsKLQl9Ci0JZm9yIChpPTA7IGk8c3N0X3M7IGkrKykgewotCQlzc3RfcmVzW2ldID0gc3N0X3JlYWQoc3N0X3JlZ3NbaV0ucmVnKTsKLQl9Ci0KLQlkcHJpbnRrKCJoYXJkd2FyZSByZWdpc3RlciBkdW1wOlxuIik7Ci0JZm9yIChpPTA7IGk8cGNpX3M7IGkrKykgewotCQlkcHJpbnRrKCIlcyAlMCMxMHhcbiIsIHBjaV9yZWdzW2ldLnJlZ19uYW1lLCBwY2lfcmVzW2ldKTsKLQl9Ci0JZm9yIChpPTA7IGk8c3N0X3M7IGkrKykgewotCQlkcHJpbnRrKCIlcyAlMCMxMHhcbiIsIHNzdF9yZWdzW2ldLnJlZ19uYW1lLCBzc3RfcmVzW2ldKTsKLQl9Ci0JcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHNzdGZiX2ZpbGxyZWN0X3NvZnR3KCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQotewotCXU4IF9faW9tZW0gKmZiYmFzZV92aXJ0ID0gaW5mby0+c2NyZWVuX2Jhc2U7Ci0JaW50IHgsIHksIHcgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gMTYgPyAyIDogNDsKLQl1MzIgY29sb3IgPSByZWN0LT5jb2xvciwgaGVpZ2h0ID0gcmVjdC0+aGVpZ2h0OwotCXU4IF9faW9tZW0gKnA7Ci0JCi0JaWYgKHc9PTIpIGNvbG9yIHw9IGNvbG9yPDwxNjsKLQlmb3IgKHk9cmVjdC0+ZHk7IGhlaWdodDsgeSsrLCBoZWlnaHQtLSkgewotCQlwID0gZmJiYXNlX3ZpcnQgKyB5KmluZm8tPmZpeC5saW5lX2xlbmd0aCArIHJlY3QtPmR4Knc7Ci0JCXggPSByZWN0LT53aWR0aDsKLQkJaWYgKHc9PTIpIHg+Pj0xOwotCQl3aGlsZSAoeCkgewotCQkJd3JpdGVsKGNvbG9yLCBwKTsKLQkJCXAgKz0gNDsKLQkJCXgtLTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgc3N0ZmJfZHJhd3JlY3RfWFkoIHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgeCwgaW50IHksCi0JCWludCB3LCBpbnQgaCwgaW50IGNvbG9yLCBpbnQgaHdmdW5jKQotewotCXN0cnVjdCBmYl9maWxscmVjdCByZWN0OwotCXJlY3QuZHggPSB4OwotCXJlY3QuZHkgPSB5OwotCXJlY3QuaGVpZ2h0ID0gaDsKLQlyZWN0LndpZHRoID0gdzsKLQlyZWN0LmNvbG9yID0gY29sb3I7Ci0JcmVjdC5yb3AgPSBST1BfQ09QWTsKLQlpZiAoaHdmdW5jKQotCQlzc3RmYl9maWxscmVjdChpbmZvLCAmcmVjdCk7Ci0JZWxzZQotCQlzc3RmYl9maWxscmVjdF9zb2Z0dyhpbmZvLCAmcmVjdCk7Ci19Ci0KLS8qIHByaW50IHNvbWUgc3F1YXJlcyBvbiB0aGUgZmIgKi8KLXN0YXRpYyB2b2lkIHNzdGZiX2RyYXdkZWJ1Z2ltYWdlKHN0cnVjdCBmYl9pbmZvICppbmZvKQotewotCXN0YXRpYyBpbnQgaWR4OwotCi0JLyogY2xlYXIgc2NyZWVuICovCi0Jc3N0ZmJfY2xlYXJfc2NyZWVuKGluZm8pOwotCQotICAgCWlkeCA9IChpZHgrMSkgJiAxOwotCi0JLyogd2hpdGUgcmVjdCAqLwotCXNzdGZiX2RyYXdyZWN0X1hZKGluZm8sIDAsIDAsIDUwLCA1MCwgMHhmZmZmLCBpZHgpOwotCQotCS8qIGJsdWUgcmVjdCAqLwotCXNzdGZiX2RyYXdyZWN0X1hZKGluZm8sIDUwLCA1MCwgNTAsIDUwLCAweDAwMWYsIGlkeCk7Ci0KLQkvKiBncmVlbiByZWN0ICovCi0Jc3N0ZmJfZHJhd3JlY3RfWFkoaW5mbywgMTAwLCAxMDAsIDgwLCA4MCwgMHgwN2UwLCBpZHgpOwotCQotCS8qIHJlZCByZWN0ICovCi0Jc3N0ZmJfZHJhd3JlY3RfWFkoaW5mbywgMjUwLCAyNTAsIDEyMCwgMTAwLCAweGY4MDAsIGlkeCk7Ci19Ci0KIG1vZHVsZV9pbml0KHNzdGZiX2luaXQpOwotCi0jaWZkZWYgTU9EVUxFCiBtb2R1bGVfZXhpdChzc3RmYl9leGl0KTsKLSNlbmRpZgogCiBNT0RVTEVfQVVUSE9SKCIoYykgMjAwMCwyMDAyIEdob3psYW5lIFRvdW1pIDxndG91bWlAbGFwb3N0ZS5uZXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkZCRGV2IGRyaXZlciBmb3IgM2RmeCBWb29kb28gR3JhcGhpY3MgYW5kIFZvb2RvbzIgYmFzZWQgdmlkZW8gYm9hcmRzIik7CkBAIC0xNjUyLDMgKzE1MjQsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhnZnhjbGssICJGb3JjZSBncmFwaGljIGNoaXAgZnJlcXVlbmN5IGluIE1Iei4gREFOR0VST1VTLiAoZGVmYXVsdD1hdXRvKSIpOwogbW9kdWxlX3BhcmFtKHNsb3dwY2ksIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhzbG93cGNpLCAiVXNlcyBzbG93IFBDSSBzZXR0aW5ncyAoMCBvciAxKSAoZGVmYXVsdD0wKSIpOworbW9kdWxlX3BhcmFtKG1vZGVfb3B0aW9uLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGVfb3B0aW9uLCAiSW5pdGlhbCB2aWRlbyBtb2RlIChkZWZhdWx0PSIgREVGQVVMVF9WSURFT19NT0RFICIpIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc3RpZmIuYyBiL2RyaXZlcnMvdmlkZW8vc3RpZmIuYwppbmRleCAzZTE2ZTJkLi42OWYzYjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3N0aWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zdGlmYi5jCkBAIC0xMjkxLDYgKzEyOTEsNyBAQAogb3V0X2VycjI6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGZpeC0+c21lbV9zdGFydCwgZml4LT5zbWVtX2xlbik7CiBvdXRfZXJyMToKKwlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogb3V0X2VycjA6CiAJa2ZyZWUoZmIpOwpAQCAtMTM2NCw2ICsxMzY1LDggQEAKIAkJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoc3RpLT5pbmZvKTsKIAkJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXgubW1pb19zdGFydCwgaW5mby0+Zml4Lm1taW9fbGVuKTsKIAkJICAgICAgICByZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsIGluZm8tPmZpeC5zbWVtX2xlbik7CisJCQkJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQorCQkJCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAkJICAgICAgICBmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwogCQkgICAgICAgIGtmcmVlKGluZm8pOyAKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90Z2FmYi5jIGIvZHJpdmVycy92aWRlby90Z2FmYi5jCmluZGV4IDk0ZmRlNjIuLjRiODhmYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdGdhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHZpZGVvL3RnYWZiLmg+CiAKQEAgLTUxNyw0MSArNTE4LDYgQEAKIHN0YXRpYyB2b2lkCiB0Z2FmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgY29uc3QgYml0cmV2WzI1Nl0gPSB7Ci0JCTB4MDAsIDB4ODAsIDB4NDAsIDB4YzAsIDB4MjAsIDB4YTAsIDB4NjAsIDB4ZTAsCi0JCTB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsCi0JCTB4MDgsIDB4ODgsIDB4NDgsIDB4YzgsIDB4MjgsIDB4YTgsIDB4NjgsIDB4ZTgsCi0JCTB4MTgsIDB4OTgsIDB4NTgsIDB4ZDgsIDB4MzgsIDB4YjgsIDB4NzgsIDB4ZjgsCi0JCTB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsCi0JCTB4MTQsIDB4OTQsIDB4NTQsIDB4ZDQsIDB4MzQsIDB4YjQsIDB4NzQsIDB4ZjQsCi0JCTB4MGMsIDB4OGMsIDB4NGMsIDB4Y2MsIDB4MmMsIDB4YWMsIDB4NmMsIDB4ZWMsCi0JCTB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsCi0JCTB4MDIsIDB4ODIsIDB4NDIsIDB4YzIsIDB4MjIsIDB4YTIsIDB4NjIsIDB4ZTIsCi0JCTB4MTIsIDB4OTIsIDB4NTIsIDB4ZDIsIDB4MzIsIDB4YjIsIDB4NzIsIDB4ZjIsCi0JCTB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsCi0JCTB4MWEsIDB4OWEsIDB4NWEsIDB4ZGEsIDB4M2EsIDB4YmEsIDB4N2EsIDB4ZmEsCi0JCTB4MDYsIDB4ODYsIDB4NDYsIDB4YzYsIDB4MjYsIDB4YTYsIDB4NjYsIDB4ZTYsCi0JCTB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsCi0JCTB4MGUsIDB4OGUsIDB4NGUsIDB4Y2UsIDB4MmUsIDB4YWUsIDB4NmUsIDB4ZWUsCi0JCTB4MWUsIDB4OWUsIDB4NWUsIDB4ZGUsIDB4M2UsIDB4YmUsIDB4N2UsIDB4ZmUsCi0JCTB4MDEsIDB4ODEsIDB4NDEsIDB4YzEsIDB4MjEsIDB4YTEsIDB4NjEsIDB4ZTEsCi0JCTB4MTEsIDB4OTEsIDB4NTEsIDB4ZDEsIDB4MzEsIDB4YjEsIDB4NzEsIDB4ZjEsCi0JCTB4MDksIDB4ODksIDB4NDksIDB4YzksIDB4MjksIDB4YTksIDB4NjksIDB4ZTksCi0JCTB4MTksIDB4OTksIDB4NTksIDB4ZDksIDB4MzksIDB4YjksIDB4NzksIDB4ZjksCi0JCTB4MDUsIDB4ODUsIDB4NDUsIDB4YzUsIDB4MjUsIDB4YTUsIDB4NjUsIDB4ZTUsCi0JCTB4MTUsIDB4OTUsIDB4NTUsIDB4ZDUsIDB4MzUsIDB4YjUsIDB4NzUsIDB4ZjUsCi0JCTB4MGQsIDB4OGQsIDB4NGQsIDB4Y2QsIDB4MmQsIDB4YWQsIDB4NmQsIDB4ZWQsCi0JCTB4MWQsIDB4OWQsIDB4NWQsIDB4ZGQsIDB4M2QsIDB4YmQsIDB4N2QsIDB4ZmQsCi0JCTB4MDMsIDB4ODMsIDB4NDMsIDB4YzMsIDB4MjMsIDB4YTMsIDB4NjMsIDB4ZTMsCi0JCTB4MTMsIDB4OTMsIDB4NTMsIDB4ZDMsIDB4MzMsIDB4YjMsIDB4NzMsIDB4ZjMsCi0JCTB4MGIsIDB4OGIsIDB4NGIsIDB4Y2IsIDB4MmIsIDB4YWIsIDB4NmIsIDB4ZWIsCi0JCTB4MWIsIDB4OWIsIDB4NWIsIDB4ZGIsIDB4M2IsIDB4YmIsIDB4N2IsIDB4ZmIsCi0JCTB4MDcsIDB4ODcsIDB4NDcsIDB4YzcsIDB4MjcsIDB4YTcsIDB4NjcsIDB4ZTcsCi0JCTB4MTcsIDB4OTcsIDB4NTcsIDB4ZDcsIDB4MzcsIDB4YjcsIDB4NzcsIDB4ZjcsCi0JCTB4MGYsIDB4OGYsIDB4NGYsIDB4Y2YsIDB4MmYsIDB4YWYsIDB4NmYsIDB4ZWYsCi0JCTB4MWYsIDB4OWYsIDB4NWYsIDB4ZGYsIDB4M2YsIDB4YmYsIDB4N2YsIDB4ZmYKLQl9OwotCiAJc3RydWN0IHRnYV9wYXIgKnBhciA9IChzdHJ1Y3QgdGdhX3BhciAqKSBpbmZvLT5wYXI7CiAJdTMyIGZnY29sb3IsIGJnY29sb3IsIGR4LCBkeSwgd2lkdGgsIGhlaWdodCwgdnhyZXMsIHZ5cmVzLCBwaXhlbG1hc2s7CiAJdW5zaWduZWQgbG9uZyByaW5jciwgbGluZV9sZW5ndGgsIHNoaWZ0LCBwb3MsIGlzOGJwcDsKQEAgLTY0OSw3ICs2MTUsNyBAQAogCQkJLyogVGhlIGltYWdlIGRhdGEgaXMgYml0IGJpZyBlbmRpYW47IHdlIG5lZWQKIAkJCSAgIGxpdHRsZSBlbmRpYW4uICAqLwogCQkJZm9yIChqID0gMDsgaiA8IGJ3aWR0aDsgKytqKQotCQkJCW1hc2sgfD0gYml0cmV2W2RhdGFbal1dIDw8IChqICogOCk7CisJCQkJbWFzayB8PSBiaXRyZXY4KGRhdGFbal0pIDw8IChqICogOCk7CiAKIAkJCV9fcmF3X3dyaXRlbChtYXNrIDw8IHNoaWZ0LCBmYl9iYXNlICsgcG9zKTsKIApAQCAtNjc2LDEwICs2NDIsMTAgQEAKIAkJZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgYndpZHRoOyBqICs9IDQpIHsKIAkJCQl1MzIgbWFzayA9IDA7Ci0JCQkJbWFzayB8PSBiaXRyZXZbZGF0YVtqKzBdXSA8PCAoMCAqIDgpOwotCQkJCW1hc2sgfD0gYml0cmV2W2RhdGFbaisxXV0gPDwgKDEgKiA4KTsKLQkJCQltYXNrIHw9IGJpdHJldltkYXRhW2orMl1dIDw8ICgyICogOCk7Ci0JCQkJbWFzayB8PSBiaXRyZXZbZGF0YVtqKzNdXSA8PCAoMyAqIDgpOworCQkJCW1hc2sgfD0gYml0cmV2OChkYXRhW2orMF0pIDw8ICgwICogOCk7CisJCQkJbWFzayB8PSBiaXRyZXY4KGRhdGFbaisxXSkgPDwgKDEgKiA4KTsKKwkJCQltYXNrIHw9IGJpdHJldjgoZGF0YVtqKzJdKSA8PCAoMiAqIDgpOworCQkJCW1hc2sgfD0gYml0cmV2OChkYXRhW2orM10pIDw8ICgzICogOCk7CiAJCQkJX19yYXdfd3JpdGVsKG1hc2ssIGZiX2Jhc2UgKyBwb3MgKyBqKmJpbmNyKTsKIAkJCX0KIAkJCXBvcyArPSBsaW5lX2xlbmd0aDsKQEAgLTY5OSw3ICs2NjUsNyBAQAogCQkJZm9yIChpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CiAJCQkJdTMyIG1hc2sgPSAwOwogCQkJCWZvciAoaiA9IDA7IGogPCBid2lkdGg7ICsraikKLQkJCQkJbWFzayB8PSBiaXRyZXZbZGF0YVtqXV0gPDwgKGogKiA4KTsKKwkJCQkJbWFzayB8PSBiaXRyZXY4KGRhdGFbal0pIDw8IChqICogOCk7CiAJCQkJX19yYXdfd3JpdGVsKG1hc2ssIGZiX2Jhc2UgKyBwb3MpOwogCQkJCXBvcyArPSBsaW5lX2xlbmd0aDsKIAkJCQlkYXRhICs9IHJpbmNyOwpAQCAtNzI2LDggKzY5Miw4IEBACiAJCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewogCQkJZm9yIChqID0gMDsgaiA8IGJ3aWR0aDsgaiArPSAyKSB7CiAJCQkJdTMyIG1hc2sgPSAwOwotCQkJCW1hc2sgfD0gYml0cmV2W2RhdGFbaiswXV0gPDwgKDAgKiA4KTsKLQkJCQltYXNrIHw9IGJpdHJldltkYXRhW2orMV1dIDw8ICgxICogOCk7CisJCQkJbWFzayB8PSBiaXRyZXY4KGRhdGFbaiswXSkgPDwgKDAgKiA4KTsKKwkJCQltYXNrIHw9IGJpdHJldjgoZGF0YVtqKzFdKSA8PCAoMSAqIDgpOwogCQkJCW1hc2sgPDw9IHNoaWZ0OwogCQkJCV9fcmF3X3dyaXRlbChtYXNrLCBmYl9iYXNlICsgcG9zICsgaipiaW5jcik7CiAJCQl9CkBAIC03NDYsOSArNzEyLDkgQEAKIAkJCWJ3aWR0aCA9ICh3aWR0aCAmIDE1KSA+IDg7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotCQkJCXUzMiBtYXNrID0gYml0cmV2W2RhdGFbMF1dOworCQkJCXUzMiBtYXNrID0gYml0cmV2OChkYXRhWzBdKTsKIAkJCQlpZiAoYndpZHRoKQotCQkJCQltYXNrIHw9IGJpdHJldltkYXRhWzFdXSA8PCA4OworCQkJCQltYXNrIHw9IGJpdHJldjgoZGF0YVsxXSkgPDwgODsKIAkJCQltYXNrIDw8PSBzaGlmdDsKIAkJCQlfX3Jhd193cml0ZWwobWFzaywgZmJfYmFzZSArIHBvcyk7CiAJCQkJcG9zICs9IGxpbmVfbGVuZ3RoOwpAQCAtMTQ3Myw2ICsxNDM5LDggQEAKIAlyZXR1cm4gMDsKIAogIGVycjE6CisJaWYgKG1lbV9iYXNlKQorCQlpb3VubWFwKG1lbV9iYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oYmFyMF9zdGFydCwgYmFyMF9sZW4pOwogIGVycjA6CiAJa2ZyZWUoYWxsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCmluZGV4IDE0MTc1Y2RiLi41NWU4YWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKQEAgLTExMzAsNyArMTEzMCw4IEBACiAJCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24odHJpZGVudGZiX2ZpeC5zbWVtX3N0YXJ0LCB0cmlkZW50ZmJfZml4LnNtZW1fbGVuLCAidHJpZGVudGZiIikpIHsKIAkJZGVidWcoInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIC0xOworCQllcnIgPSAtMTsKKwkJZ290byBvdXRfdW5tYXA7CiAJfQogCiAJZmJfaW5mby5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZSh0cmlkZW50ZmJfZml4LnNtZW1fc3RhcnQsCkBAIC0xMTM5LDcgKzExNDAsOCBAQAogCWlmICghZmJfaW5mby5zY3JlZW5fYmFzZSkgewogCQlyZWxlYXNlX21lbV9yZWdpb24odHJpZGVudGZiX2ZpeC5zbWVtX3N0YXJ0LCB0cmlkZW50ZmJfZml4LnNtZW1fbGVuKTsKIAkJZGVidWcoImlvcmVtYXAgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC0xOworCQllcnIgPSAtMTsKKwkJZ290byBvdXRfdW5tYXA7CiAJfQogCiAJb3V0cHV0KCIlcyBib2FyZCBmb3VuZFxuIiwgcGNpX25hbWUoZGV2KSk7CkBAIC0xMTYyLDggKzExNjQsMTAgQEAKICNlbmRpZgogCWZiX2luZm8ucHNldWRvX3BhbGV0dGUgPSBwc2V1ZG9fcGFsOwogCi0JaWYgKCFmYl9maW5kX21vZGUoJmRlZmF1bHRfdmFyLCZmYl9pbmZvLG1vZGUsTlVMTCwwLE5VTEwsYnBwKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFmYl9maW5kX21vZGUoJmRlZmF1bHRfdmFyLCZmYl9pbmZvLG1vZGUsTlVMTCwwLE5VTEwsYnBwKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bm1hcDsKKwl9CiAJZmJfYWxsb2NfY21hcCgmZmJfaW5mby5jbWFwLDI1NiwwKTsKIAlpZiAoZGVmYXVsdGFjY2VsICYmIGFjYykKIAkJZGVmYXVsdF92YXIuYWNjZWxfZmxhZ3MgfD0gRkJfQUNDRUxGX1RFWFQ7CkBAIC0xMTc0LDEyICsxMTc4LDIwIEBACiAJZmJfaW5mby5kZXZpY2UgPSAmZGV2LT5kZXY7CiAJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50ZmI6IGNvdWxkIG5vdCByZWdpc3RlciBUcmlkZW50IGZyYW1lYnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubWFwOwogCX0KIAlvdXRwdXQoImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2UgJWR4JWQtJWRicHBcbiIsCiAJICAgZmJfaW5mby5ub2RlLCBmYl9pbmZvLmZpeC5pZCxkZWZhdWx0X3Zhci54cmVzLAogCSAgIGRlZmF1bHRfdmFyLnlyZXMsZGVmYXVsdF92YXIuYml0c19wZXJfcGl4ZWwpOwogCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJaWYgKGRlZmF1bHRfcGFyLmlvX3ZpcnQpCisJCWlvdW5tYXAoZGVmYXVsdF9wYXIuaW9fdmlydCk7CisJaWYgKGZiX2luZm8uc2NyZWVuX2Jhc2UpCisJCWlvdW5tYXAoZmJfaW5mby5zY3JlZW5fYmFzZSk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZleGl0IHRyaWRlbnRfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqIGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmFsa3lyaWVmYi5jIGIvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMKaW5kZXggNDdmMjc5Mi4uMDZmYzE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby92YWxreXJpZWZiLmMKQEAgLTI4NCw3ICsyODQsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIk1vbml0b3Igc2Vuc2UgdmFsdWUgPSAweCV4XG4iLCBwLT5zZW5zZSk7CiAKIAkvKiBUcnkgdG8gcGljayBhIHZpZGVvIG1vZGUgb3V0IG9mIE5WUkFNIGlmIHdlIGhhdmUgb25lLiAqLwotI2lmbmRlZiBDT05GSUdfTUFDCisjaWYgIWRlZmluZWQoQ09ORklHX01BQykgJiYgZGVmaW5lZChDT05GSUdfTlZSQU0pCiAJaWYgKGRlZmF1bHRfdm1vZGUgPT0gVk1PREVfTlZSQU0pIHsKIAkJZGVmYXVsdF92bW9kZSA9IG52cmFtX3JlYWRfYnl0ZShOVl9WTU9ERSk7CiAJCWlmIChkZWZhdWx0X3Ztb2RlIDw9IDAKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCQlkZWZhdWx0X3Ztb2RlID0gbWFjX21hcF9tb25pdG9yX3NlbnNlKHAtPnNlbnNlKTsKIAlpZiAoIXZhbGt5cmllX3JlZ19pbml0W2RlZmF1bHRfdm1vZGUgLSAxXSkKIAkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzY0MF80ODBfNjc7Ci0jaWZuZGVmIENPTkZJR19NQUMKKyNpZiAhZGVmaW5lZChDT05GSUdfTUFDKSAmJiBkZWZpbmVkKENPTkZJR19OVlJBTSkKIAlpZiAoZGVmYXVsdF9jbW9kZSA9PSBDTU9ERV9OVlJBTSkKIAkJZGVmYXVsdF9jbW9kZSA9IG52cmFtX3JlYWRfYnl0ZShOVl9DTU9ERSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jCmluZGV4IDIxOTY0NDguLmUxNjMyMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby92ZXNhZmIuYwpAQCAtNDcsMTcgKzQ3LDE2IEBACiAJLmFjY2VsCT0gRkJfQUNDRUxfTk9ORSwKIH07CiAKLXN0YXRpYyBpbnQgICAgICAgICAgICAgaW52ZXJzZSAgID0gMDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgbXRyciAgICAgID0gMDsgLyogZGlzYWJsZSBtdHJyICovCi1zdGF0aWMgaW50CSAgICAgICB2cmFtX3JlbWFwIF9faW5pdGRhdGEgPSAwOyAvKiBTZXQgYW1vdW50IG9mIG1lbW9yeSB0byBiZSB1c2VkICovCi1zdGF0aWMgaW50CSAgICAgICB2cmFtX3RvdGFsIF9faW5pdGRhdGEgPSAwOyAvKiBTZXQgdG90YWwgYW1vdW50IG9mIG1lbW9yeSAqLwotc3RhdGljIGludCAgICAgICAgICAgICBwbWlfc2V0cGFsID0gMTsJLyogcG1pIGZvciBwYWxldHRlIGNoYW5nZXMgPz8/ICovCi1zdGF0aWMgaW50ICAgICAgICAgICAgIHlwYW4gICAgICAgPSAwOyAgLyogMC4ubm90aGluZywgMS4ueXBhbiwgMi4ueXdyYXAgKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAgKnBtaV9iYXNlICA9IE5VTEw7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICgqcG1pX3N0YXJ0KSh2b2lkKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgKCpwbWlfcGFsKSh2b2lkKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgZGVwdGg7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgIHZnYV9jb21wYXQ7CitzdGF0aWMgaW50ICAgaW52ZXJzZSAgICBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGludCAgIG10cnIgICAgICAgX19yZWFkX21vc3RseTsJCS8qIGRpc2FibGUgbXRyciAqLworc3RhdGljIGludCAgIHZyYW1fcmVtYXAgX19pbml0ZGF0YTsJCS8qIFNldCBhbW91bnQgb2YgbWVtb3J5IHRvIGJlIHVzZWQgKi8KK3N0YXRpYyBpbnQgICB2cmFtX3RvdGFsIF9faW5pdGRhdGE7CQkvKiBTZXQgdG90YWwgYW1vdW50IG9mIG1lbW9yeSAqLworc3RhdGljIGludCAgIHBtaV9zZXRwYWwgX19yZWFkX21vc3RseSA9IDE7CS8qIHBtaSBmb3IgcGFsZXR0ZSBjaGFuZ2VzID8/PyAqLworc3RhdGljIGludCAgIHlwYW4gICAgICAgX19yZWFkX21vc3RseTsJCS8qIDAuLm5vdGhpbmcsIDEuLnlwYW4sIDIuLnl3cmFwICovCitzdGF0aWMgdm9pZCAgKCpwbWlfc3RhcnQpKHZvaWQpIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdm9pZCAgKCpwbWlfcGFsKSAgKHZvaWQpIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50ICAgZGVwdGggICAgICBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGludCAgIHZnYV9jb21wYXQgX19yZWFkX21vc3RseTsKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50IHZlc2FmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKQEAgLTMxMiw2ICszMTEsNyBAQAogCQl5cGFuID0gcG1pX3NldHBhbCA9IDA7IC8qIG5vdCBhdmFpbGFibGUgb3Igc29tZSBET1MgVFNSIC4uLiAqLwogCiAJaWYgKHlwYW4gfHwgcG1pX3NldHBhbCkgeworCQl1bnNpZ25lZCBzaG9ydCAqcG1pX2Jhc2U7CiAJCXBtaV9iYXNlICA9ICh1bnNpZ25lZCBzaG9ydCopcGh5c190b192aXJ0KCgodW5zaWduZWQgbG9uZylzY3JlZW5faW5mby52ZXNhcG1fc2VnIDw8IDQpICsgc2NyZWVuX2luZm8udmVzYXBtX29mZik7CiAJCXBtaV9zdGFydCA9ICh2b2lkKikoKGNoYXIqKXBtaV9iYXNlICsgcG1pX2Jhc2VbMV0pOwogCQlwbWlfcGFsICAgPSAodm9pZCopKChjaGFyKilwbWlfYmFzZSArIHBtaV9iYXNlWzJdKTsKQEAgLTQ1Niw2ICs0NTYsOCBAQAogCSAgICAgICBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQpOwogCXJldHVybiAwOwogZXJyOgorCWlmIChpbmZvLT5zY3JlZW5fYmFzZSkKKwkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIAlyZWxlYXNlX21lbV9yZWdpb24odmVzYWZiX2ZpeC5zbWVtX3N0YXJ0LCBzaXplX3RvdGFsKTsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92Z2ExNmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwppbmRleCA0M2Q1YTZkLi42YWZmNjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQkgICAgICAgaW50IG11bCwgaW50IGRpdikKIHsKLQlzdGF0aWMgc3RydWN0IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAkJdTMyIHBpeGNsb2NrOwogCQl1OCAgbWlzYzsKIAkJdTggIHNlcV9jbG9ja19tb2RlOwpAQCAtNjUyLDcgKzY1Miw3IEBACiAKIHN0YXRpYyB2b2lkIGVnYTE2X3NldHBhbGV0dGUoaW50IHJlZ25vLCB1bnNpZ25lZCByZWQsIHVuc2lnbmVkIGdyZWVuLCB1bnNpZ25lZCBibHVlKQogewotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1hcFtdID0geyAwMDAsIDAwMSwgMDEwLCAwMTEgfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtYXBbXSA9IHsgMDAwLCAwMDEsIDAxMCwgMDExIH07CiAJaW50IHZhbDsKIAkKIAlpZiAocmVnbm8gPj0gMTYpCkBAIC0xMTM5LDIzICsxMTM5LDE5IEBACiAJfQogfQogCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi1zdGF0aWMgdW5zaWduZWQgaW50IHRyYW5zbF9sW10gPQotezB4MCwweDgsMHg0LDB4QywweDIsMHhBLDB4NiwweEUsMHgxLDB4OSwweDUsMHhELDB4MywweEIsMHg3LDB4Rn07Ci1zdGF0aWMgdW5zaWduZWQgaW50IHRyYW5zbF9oW10gPQotezB4MDAwLCAweDgwMCwgMHg0MDAsIDB4QzAwLCAweDIwMCwgMHhBMDAsIDB4NjAwLCAweEUwMCwKLSAweDEwMCwgMHg5MDAsIDB4NTAwLCAweEQwMCwgMHgzMDAsIDB4QjAwLCAweDcwMCwgMHhGMDB9OwotI2Vsc2UKLSNpZmRlZiBfX0JJR19FTkRJQU4KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHJhbnNsX2hbXSA9Ci17MHgwLDB4OCwweDQsMHhDLDB4MiwweEEsMHg2LDB4RSwweDEsMHg5LDB4NSwweEQsMHgzLDB4QiwweDcsMHhGfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdHJhbnNsX2xbXSA9Ci17MHgwMDAsIDB4ODAwLCAweDQwMCwgMHhDMDAsIDB4MjAwLCAweEEwMCwgMHg2MDAsIDB4RTAwLAotIDB4MTAwLCAweDkwMCwgMHg1MDAsIDB4RDAwLCAweDMwMCwgMHhCMDAsIDB4NzAwLCAweEYwMH07CisjZGVmaW5lIFRSQU5TX01BU0tfTE9XICB7MHgwLDB4OCwweDQsMHhDLDB4MiwweEEsMHg2LDB4RSwweDEsMHg5LDB4NSwweEQsMHgzLDB4QiwweDcsMHhGfQorI2RlZmluZSBUUkFOU19NQVNLX0hJR0ggezB4MDAwLCAweDgwMCwgMHg0MDAsIDB4QzAwLCAweDIwMCwgMHhBMDAsIDB4NjAwLCAweEUwMCwgXAorCQkJIDB4MTAwLCAweDkwMCwgMHg1MDAsIDB4RDAwLCAweDMwMCwgMHhCMDAsIDB4NzAwLCAweEYwMH0KKworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorc3RhdGljIGNvbnN0IHUxNiB0cmFuc2xfbFtdID0gVFJBTlNfTUFTS19MT1c7CitzdGF0aWMgY29uc3QgdTE2IHRyYW5zbF9oW10gPSBUUkFOU19NQVNLX0hJR0g7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKK3N0YXRpYyBjb25zdCB1MTYgdHJhbnNsX2xbXSA9IFRSQU5TX01BU0tfSElHSDsKK3N0YXRpYyBjb25zdCB1MTYgdHJhbnNsX2hbXSA9IFRSQU5TX01BU0tfTE9XOwogI2Vsc2UKICNlcnJvciAiT25seSBfX0JJR19FTkRJQU4gYW5kIF9fTElUVExFX0VORElBTiBhcmUgc3VwcG9ydGVkIGluIHZnYS1wbGFuZXMiCiAjZW5kaWYKLSNlbmRpZgogCiBzdGF0aWMgdm9pZCB2Z2FfOHBsYW5lc19pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZpcmdlZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmlyZ2VmYi5jCmluZGV4IDY0Mzc4OTUuLmI5ZmI2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmlyZ2VmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmlyZ2VmYi5jCkBAIC0xNzk5LDcgKzE3OTksNyBAQAogCQkjd2FybmluZyByZWxlYXNlIHJlc291cmNlcwogCQlwcmludGsoS0VSTl9FUlIgInZpcmdlZmIuYzogcmVnaXN0ZXJfZnJhbWVidWZmZXIgZmFpbGVkXG4iKTsKIAkJRFBSSU5USygiRVhJVFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dF91bm1hcDsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlLCB1c2luZyAlbGRLIG9mIHZpZGVvIG1lbW9yeVxuIiwKQEAgLTE4MDksNiArMTgwOSwyMSBAQAogCiAJRFBSSU5USygiRVhJVFxuIik7CiAJcmV0dXJuIDA7CisKK291dF91bm1hcDoKKwlpZiAoYm9hcmRfYWRkciA+PSAweDAxMDAwMDAwKSB7CisJCWlmICh2X3JhbSkKKwkJCWlvdW5tYXAoKHZvaWQqKXZfcmFtKTsKKwkJaWYgKHZnYWlvX3JlZ3MpCisJCQlpb3VubWFwKHZnYWlvX3JlZ3MpOworCQlpZiAobW1pb19yZWdzKQorCQkJaW91bm1hcChtbWlvX3JlZ3MpOworCQlpZiAodmNvZGVfc3dpdGNoX2Jhc2UpCisJCQlpb3VubWFwKCh2b2lkKil2Y29kZV9zd2l0Y2hfYmFzZSk7CisJCXZfcmFtID0gdmNvZGVfc3dpdGNoX2Jhc2UgPSAwOworCQl2Z2Fpb19yZWdzID0gbW1pb19yZWdzID0gTlVMTDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9LY29uZmlnIGIvZHJpdmVycy93MS9LY29uZmlnCmluZGV4IDI3YzlkMDUuLmMyODdhOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL0tjb25maWcKQEAgLTIsNyArMiw2IEBACiAKIGNvbmZpZyBXMQogCXRyaXN0YXRlICJEYWxsYXMncyAxLXdpcmUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENPTk5FQ1RPUgogCS0tLWhlbHAtLS0KIAkgIERhbGxhcycgMS13aXJlIGJ1cyBpcyB1c2VmdWwgdG8gY29ubmVjdCBzbG93IDEtcGluIGRldmljZXMKIAkgIHN1Y2ggYXMgaUJ1dHRvbnMgYW5kIHRoZXJtYWwgc2Vuc29ycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvTWFrZWZpbGUgYi9kcml2ZXJzL3cxL01ha2VmaWxlCmluZGV4IDkzODQ1YTIuLjZiYjBiNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy93MS9NYWtlZmlsZQpAQCAtMiwxMCArMiw2IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgRGFsbGFzJ3MgMS13aXJlIGJ1cy4KICMKIAotaWZlcSAoJChDT05GSUdfVzFfRFMyNDMzX0NSQyksIHkpCi1FWFRSQV9DRkxBR1MJKz0gLURDT05GSUdfVzFfRjIzX0NSQwotZW5kaWYKLQogb2JqLSQoQ09ORklHX1cxKQkrPSB3aXJlLm8KIHdpcmUtb2JqcwkJOj0gdzEubyB3MV9pbnQubyB3MV9mYW1pbHkubyB3MV9uZXRsaW5rLm8gdzFfaW8ubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvbWF0cm94X3cxLmMgYi9kcml2ZXJzL3cxL21hc3RlcnMvbWF0cm94X3cxLmMKaW5kZXggMjc4OGI4Yy4uNmY5ZDg4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL21hdHJveF93MS5jCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9tYXRyb3hfdzEuYwpAQCAtMjE1LDYgKzIxNSw4IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfZnJlZV9kZXZpY2U6CisJaWYgKGRldi0+dmlydF9hZGRyKQorCQlpb3VubWFwKGRldi0+dmlydF9hZGRyKTsKIAlrZnJlZShkZXYpOwogCiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcgYi9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCmluZGV4IGQxOGQ2NDIuLjkwNGU1YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwpAQCAtOSw3ICs5LDcgQEAKIAl0cmlzdGF0ZSAiVGhlcm1hbCBmYW1pbHkgaW1wbGVtZW50YXRpb24iCiAJZGVwZW5kcyBvbiBXMQogCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCAxLXdpcmUgdGhlcm1hbCBzZW5zb3JzIHRvIHlvdQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IDEtd2lyZSB0aGVybWFsIHNlbnNvcnMgdG8geW91cgogCSAgd2lyZS4KIAogY29uZmlnIFcxX1NMQVZFX1NNRU0KQEAgLTE3LDcgKzE3LDcgQEAKIAlkZXBlbmRzIG9uIFcxCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IDEtd2lyZQotCSAgc2ltcGxlIDY0Yml0IG1lbW9yeSByb20oZHMyNDAxL2RzMjQxMS9kczE5OTAqKSB0byB5b3Ugd2lyZS4KKwkgIHNpbXBsZSA2NGJpdCBtZW1vcnkgcm9tKGRzMjQwMS9kczI0MTEvZHMxOTkwKikgdG8geW91ciB3aXJlLgogCiBjb25maWcgVzFfU0xBVkVfRFMyNDMzCiAJdHJpc3RhdGUgIjRrYiBFRVBST00gZmFtaWx5IHN1cHBvcnQgKERTMjQzMykiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy9NYWtlZmlsZSBiL2RyaXZlcnMvdzEvc2xhdmVzL01ha2VmaWxlCmluZGV4IDcwZTIxZTIuLjcyNWRjZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL01ha2VmaWxlCkBAIC0yLDEwICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBEYWxsYXMncyAxLXdpcmUgc2xhdmVzLgogIwogCi1pZmVxICgkKENPTkZJR19XMV9TTEFWRV9EUzI0MzNfQ1JDKSwgeSkKLUVYVFJBX0NGTEFHUyArPSAtRENPTkZJR19XMV9GMjNfQ1JDCi1lbmRpZgotCiBvYmotJChDT05GSUdfVzFfU0xBVkVfVEhFUk0pCSs9IHcxX3RoZXJtLm8KIG9iai0kKENPTkZJR19XMV9TTEFWRV9TTUVNKQkrPSB3MV9zbWVtLm8KIG9iai0kKENPTkZJR19XMV9TTEFWRV9EUzI0MzMpCSs9IHcxX2RzMjQzMy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI0MzMuYyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjQzMy5jCmluZGV4IDJhYzIzOGYuLjhlYTE3YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjQzMy5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjQzMy5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2lmZGVmIENPTkZJR19XMV9GMjNfQ1JDCisjaWZkZWYgQ09ORklHX1cxX1NMQVZFX0RTMjQzM19DUkMKICNpbmNsdWRlIDxsaW51eC9jcmMxNi5oPgogCiAjZGVmaW5lIENSQzE2X0lOSVQJCTAKQEAgLTYyLDcgKzYyLDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworI2lmZGVmIENPTkZJR19XMV9TTEFWRV9EUzI0MzNfQ1JDCiBzdGF0aWMgaW50IHcxX2YyM19yZWZyZXNoX2Jsb2NrKHN0cnVjdCB3MV9zbGF2ZSAqc2wsIHN0cnVjdCB3MV9mMjNfZGF0YSAqZGF0YSwKIAkJCQlpbnQgYmxvY2spCiB7CkBAIC04OSwxMyArODksMTMgQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisjZW5kaWYJLyogQ09ORklHX1cxX1NMQVZFX0RTMjQzM19DUkMgKi8KIAogc3RhdGljIHNzaXplX3QgdzFfZjIzX3JlYWRfYmluKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsCiAJCQkgICAgICAgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBrb2JqX3RvX3cxX3NsYXZlKGtvYmopOwotI2lmZGVmIENPTkZJR19XMV9GMjNfQ1JDCisjaWZkZWYgQ09ORklHX1cxX1NMQVZFX0RTMjQzM19DUkMKIAlzdHJ1Y3QgdzFfZjIzX2RhdGEgKmRhdGEgPSBzbC0+ZmFtaWx5X2RhdGE7CiAJaW50IGksIG1pbl9wYWdlLCBtYXhfcGFnZTsKICNlbHNlCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogCW11dGV4X2xvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKIAotI2lmZGVmIENPTkZJR19XMV9GMjNfQ1JDCisjaWZkZWYgQ09ORklHX1cxX1NMQVZFX0RTMjQzM19DUkMKIAogCW1pbl9wYWdlID0gKG9mZiA+PiBXMV9QQUdFX0JJVFMpOwogCW1heF9wYWdlID0gKG9mZiArIGNvdW50IC0gMSkgPj4gVzFfUEFHRV9CSVRTOwpAQCAtMTE5LDcgKzExOSw3IEBACiAJfQogCW1lbWNweShidWYsICZkYXRhLT5tZW1vcnlbb2ZmXSwgY291bnQpOwogCi0jZWxzZSAJLyogQ09ORklHX1cxX0YyM19DUkMgKi8KKyNlbHNlIAkvKiBDT05GSUdfVzFfU0xBVkVfRFMyNDMzX0NSQyAqLwogCiAJLyogcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBFRVBST00gKi8KIAlpZiAodzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkgewpAQCAtMTMzLDcgKzEzMyw3IEBACiAJdzFfd3JpdGVfYmxvY2soc2wtPm1hc3Rlciwgd3JidWYsIDMpOwogCXcxX3JlYWRfYmxvY2soc2wtPm1hc3RlciwgYnVmLCBjb3VudCk7CiAKLSNlbmRpZgkvKiBDT05GSUdfVzFfRjIzX0NSQyAqLworI2VuZGlmCS8qIENPTkZJR19XMV9TTEFWRV9EUzI0MzNfQ1JDICovCiAKIG91dF91cDoKIAltdXRleF91bmxvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKQEAgLTIwOCw3ICsyMDgsNyBAQAogCWlmICgoY291bnQgPSB3MV9mMjNfZml4X2NvdW50KG9mZiwgY291bnQsIFcxX0VFUFJPTV9TSVpFKSkgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQworI2lmZGVmIENPTkZJR19XMV9TTEFWRV9EUzI0MzNfQ1JDCiAJLyogY2FuIG9ubHkgd3JpdGUgZnVsbCBibG9ja3MgaW4gY2FjaGVkIG1vZGUgKi8KIAlpZiAoKG9mZiAmIFcxX1BBR0VfTUFTSykgfHwgKGNvdW50ICYgVzFfUEFHRV9NQVNLKSkgewogCQlkZXZfZXJyKCZzbC0+ZGV2LCAiaW52YWxpZCBvZmZzZXQvY291bnQgb2ZmPSVkIGNudD0lemRcbiIsCkBAIC0yMjMsNyArMjIzLDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQotI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisjZW5kaWYJLyogQ09ORklHX1cxX1NMQVZFX0RTMjQzM19DUkMgKi8KIAogCW11dGV4X2xvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKIApAQCAtMjYyLDcgKzI2Miw3IEBACiBzdGF0aWMgaW50IHcxX2YyM19hZGRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKIHsKIAlpbnQgZXJyOwotI2lmZGVmIENPTkZJR19XMV9GMjNfQ1JDCisjaWZkZWYgQ09ORklHX1cxX1NMQVZFX0RTMjQzM19DUkMKIAlzdHJ1Y3QgdzFfZjIzX2RhdGEgKmRhdGE7CiAKIAlkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHcxX2YyM19kYXRhKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNzEsMjQgKzI3MSwyNCBAQAogCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHcxX2YyM19kYXRhKSk7CiAJc2wtPmZhbWlseV9kYXRhID0gZGF0YTsKIAotI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCisjZW5kaWYJLyogQ09ORklHX1cxX1NMQVZFX0RTMjQzM19DUkMgKi8KIAogCWVyciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmc2wtPmRldi5rb2JqLCAmdzFfZjIzX2Jpbl9hdHRyKTsKIAotI2lmZGVmIENPTkZJR19XMV9GMjNfQ1JDCisjaWZkZWYgQ09ORklHX1cxX1NMQVZFX0RTMjQzM19DUkMKIAlpZiAoZXJyKQogCQlrZnJlZShkYXRhKTsKLSNlbmRpZgkvKiBDT05GSUdfVzFfRjIzX0NSQyAqLworI2VuZGlmCS8qIENPTkZJR19XMV9TTEFWRV9EUzI0MzNfQ1JDICovCiAKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCB3MV9mMjNfcmVtb3ZlX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCiB7Ci0jaWZkZWYgQ09ORklHX1cxX0YyM19DUkMKKyNpZmRlZiBDT05GSUdfVzFfU0xBVkVfRFMyNDMzX0NSQwogCWtmcmVlKHNsLT5mYW1pbHlfZGF0YSk7CiAJc2wtPmZhbWlseV9kYXRhID0gTlVMTDsKLSNlbmRpZgkvKiBDT05GSUdfVzFfRjIzX0NSQyAqLworI2VuZGlmCS8qIENPTkZJR19XMV9TTEFWRV9EUzI0MzNfQ1JDICovCiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9mMjNfYmluX2F0dHIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYwppbmRleCA1MzcyY2ZjLi5iMDIyZmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IGRlM2U5NzkuLjYzYzA3MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3pvcnJvL3Byb2MuYyBiL2RyaXZlcnMvem9ycm8vcHJvYy5jCmluZGV4IDdhYTJkM2QuLjYwYjA1YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvem9ycm8vcHJvYy5jCisrKyBiL2RyaXZlcnMvem9ycm8vcHJvYy5jCkBAIC00Nyw3ICs0Nyw3IEBACiBzdGF0aWMgc3NpemVfdAogcHJvY19idXNfem9ycm9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqaW5vID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm8gPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vKTsKIAlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gZHAtPmRhdGE7CiAJc3RydWN0IENvbmZpZ0RldiBjZDsKZGlmZiAtLWdpdCBhL2ZzLzlwL2NvbnYuYyBiL2ZzLzlwL2NvbnYuYwppbmRleCA1NmQ4OGMxLi5hM2VkNTcxIDEwMDY0NAotLS0gYS9mcy85cC9jb252LmMKKysrIGIvZnMvOXAvY29udi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvZnMvOXAvZmNhbGwuYyBiL2ZzLzlwL2ZjYWxsLmMKaW5kZXggODU1NjA5Ny4uZGMzMzZhNiAxMDA2NDQKLS0tIGEvZnMvOXAvZmNhbGwuYworKysgYi9mcy85cC9mY2FsbC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAKICNpbmNsdWRlICJkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvZnMvOXAvZmlkLmMgYi9mcy85cC9maWQuYwppbmRleCA3MDQ5MmNjLi4yNzUwNzIwIDEwMDY0NAotLS0gYS9mcy85cC9maWQuYworKysgYi9mcy85cC9maWQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogCiAjaW5jbHVkZSAiZGVidWcuaCIKZGlmZiAtLWdpdCBhL2ZzLzlwL211eC5jIGIvZnMvOXAvbXV4LmMKaW5kZXggOTBhNzljNy4uOTQ0MjczYyAxMDA2NDQKLS0tIGEvZnMvOXAvbXV4LmMKKysrIGIvZnMvOXAvbXV4LmMKQEAgLTExMCw4ICsxMTAsOCBAQAogfTsKIAogc3RhdGljIGludCB2OWZzX3BvbGxfcHJvYyh2b2lkICopOwotc3RhdGljIHZvaWQgdjlmc19yZWFkX3dvcmsodm9pZCAqKTsKLXN0YXRpYyB2b2lkIHY5ZnNfd3JpdGVfd29yayh2b2lkICopOworc3RhdGljIHZvaWQgdjlmc19yZWFkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIHY5ZnNfd3JpdGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgdjlmc19wb2xsd2FpdChzdHJ1Y3QgZmlsZSAqZmlscCwgd2FpdF9xdWV1ZV9oZWFkX3QgKiB3YWl0X2FkZHJlc3MsCiAJCQkgIHBvbGxfdGFibGUgKiBwKTsKIHN0YXRpYyB1MTYgdjlmc19tdXhfZ2V0X3RhZyhzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqKTsKQEAgLTI5Nyw4ICsyOTcsOCBAQAogCW0tPnJidWYgPSBOVUxMOwogCW0tPndwb3MgPSBtLT53c2l6ZSA9IDA7CiAJbS0+d2J1ZiA9IE5VTEw7Ci0JSU5JVF9XT1JLKCZtLT5ycSwgdjlmc19yZWFkX3dvcmssIG0pOwotCUlOSVRfV09SSygmbS0+d3EsIHY5ZnNfd3JpdGVfd29yaywgbSk7CisJSU5JVF9XT1JLKCZtLT5ycSwgdjlmc19yZWFkX3dvcmspOworCUlOSVRfV09SSygmbS0+d3EsIHY5ZnNfd3JpdGVfd29yayk7CiAJbS0+d3NjaGVkID0gMDsKIAltZW1zZXQoJm0tPnBvbGxfd2FkZHIsIDAsIHNpemVvZihtLT5wb2xsX3dhZGRyKSk7CiAJbS0+cG9sbF90YXNrID0gTlVMTDsKQEAgLTQ1OCwxMyArNDU4LDEzIEBACiAvKioKICAqIHY5ZnNfd3JpdGVfd29yayAtIGNhbGxlZCB3aGVuIGEgdHJhbnNwb3J0IGNhbiBzZW5kIHNvbWUgZGF0YQogICovCi1zdGF0aWMgdm9pZCB2OWZzX3dyaXRlX3dvcmsodm9pZCAqYSkKK3N0YXRpYyB2b2lkIHY5ZnNfd3JpdGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJaW50IG4sIGVycjsKIAlzdHJ1Y3Qgdjlmc19tdXhfZGF0YSAqbTsKIAlzdHJ1Y3Qgdjlmc19yZXEgKnJlcTsKIAotCW0gPSBhOworCW0gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHY5ZnNfbXV4X2RhdGEsIHdxKTsKIAogCWlmIChtLT5lcnIgPCAwKSB7CiAJCWNsZWFyX2JpdChXd29ya3NjaGVkLCAmbS0+d3NjaGVkKTsKQEAgLTU2NCw3ICs1NjQsNyBAQAogLyoqCiAgKiB2OWZzX3JlYWRfd29yayAtIGNhbGxlZCB3aGVuIHRoZXJlIGlzIHNvbWUgZGF0YSB0byBiZSByZWFkIGZyb20gYSB0cmFuc3BvcnQKICAqLwotc3RhdGljIHZvaWQgdjlmc19yZWFkX3dvcmsodm9pZCAqYSkKK3N0YXRpYyB2b2lkIHY5ZnNfcmVhZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpbnQgbiwgZXJyOwogCXN0cnVjdCB2OWZzX211eF9kYXRhICptOwpAQCAtNTcyLDcgKzU3Miw3IEBACiAJc3RydWN0IHY5ZnNfZmNhbGwgKnJjYWxsOwogCWNoYXIgKnJidWY7CiAKLQltID0gYTsKKwltID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2OWZzX211eF9kYXRhLCBycSk7CiAKIAlpZiAobS0+ZXJyIDwgMCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5jIGIvZnMvOXAvdjlmcy5jCmluZGV4IDBmNjI4MDQuLjBiOTZmYWUgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnMuYworKysgYi9mcy85cC92OWZzLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KIApkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2FkZHIuYyBiL2ZzLzlwL3Zmc19hZGRyLmMKaW5kZXggOWRmZDI1OS4uY2MyNGFiZiAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2FkZHIuYworKysgYi9mcy85cC92ZnNfYWRkci5jCkBAIC01NCw3ICs1NCw3IEBACiAJaW50IHJldHZhbCA9IC1FSU87CiAJbG9mZl90IG9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwogCWludCBjb3VudCA9IFBBR0VfQ0FDSEVfU0laRTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoaW5vZGUpOwogCWludCByc2l6ZSA9IHY5c2VzLT5tYXhkYXRhIC0gVjlGU19JT0hEUlNaOwogCXN0cnVjdCB2OWZzX2ZpZCAqdjlmID0gZmlscC0+cHJpdmF0ZV9kYXRhOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2Rpci5jIGIvZnMvOXAvdmZzX2Rpci5jCmluZGV4IGUzMmQ1OTcuLjMxMjk2ODggMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19kaXIuYworKysgYi9mcy85cC92ZnNfZGlyLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KIApAQCAtNzAsNyArNzEsNyBAQAogc3RhdGljIGludCB2OWZzX2Rpcl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewogCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbCA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGlub2RlKTsKIAlzdHJ1Y3Qgdjlmc19maWQgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IGksIG4sIHM7CkBAIC03OSw3ICs4MCw3IEBACiAJc3RydWN0IHY5ZnNfc3RhdCBzdGF0OwogCWludCBvdmVyID0gMDsKIAotCWRwcmludGsoREVCVUdfVkZTLCAibmFtZSAlc1xuIiwgZmlscC0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwlkcHJpbnRrKERFQlVHX1ZGUywgIm5hbWUgJXNcbiIsIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCWZpZCA9IGZpbGUtPmZpZDsKIApkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2ZpbGUuYyBiL2ZzLzlwL3Zmc19maWxlLmMKaW5kZXggYzNjNDdlZC4uZTg2YTA3MSAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2ZpbGUuYworKysgYi9mcy85cC92ZnNfZmlsZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTU5LDcgKzYwLDcgQEAKIAogCWRwcmludGsoREVCVUdfVkZTLCAiaW5vZGU6ICVwIGZpbGU6ICVwIFxuIiwgaW5vZGUsIGZpbGUpOwogCi0JdmZpZCA9IHY5ZnNfZmlkX2xvb2t1cChmaWxlLT5mX2RlbnRyeSk7CisJdmZpZCA9IHY5ZnNfZmlkX2xvb2t1cChmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAlpZiAoIXZmaWQpIHsKIAkJZHByaW50ayhERUJVR19FUlJPUiwgIkNvdWxkbid0IHJlc29sdmUgZmlkIGZyb20gZGVudHJ5XG4iKTsKIAkJcmV0dXJuIC1FQkFERjsKQEAgLTEzMiw3ICsxMzMsNyBAQAogc3RhdGljIGludCB2OWZzX2ZpbGVfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7CiAJaW50IHJlcyA9IDA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJZHByaW50ayhERUJVR19WRlMsICJmaWxwOiAlcCBsb2NrOiAlcFxuIiwgZmlscCwgZmwpOwogCkBAIC0xNjAsNyArMTYxLDcgQEAKIHY5ZnNfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqIGRhdGEsIHNpemVfdCBjb3VudCwKIAkgICAgICAgbG9mZl90ICogb2Zmc2V0KQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhpbm9kZSk7CiAJc3RydWN0IHY5ZnNfZmlkICp2OWYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsID0gTlVMTDsKQEAgLTIyNCw3ICsyMjUsNyBAQAogdjlmc19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqIGRhdGEsCiAJCXNpemVfdCBjb3VudCwgbG9mZl90ICogb2Zmc2V0KQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhpbm9kZSk7CiAJc3RydWN0IHY5ZnNfZmlkICp2OWZpZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGw7CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfaW5vZGUuYyBiL2ZzLzlwL3Zmc19pbm9kZS5jCmluZGV4IDUyNDFjNjAuLjE4ZjI2Y2QgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19pbm9kZS5jCisrKyBiL2ZzLzlwL3Zmc19pbm9kZS5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIHY5ZnNfY3JlYXRlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHUzMiBwZmlkLCBjaGFyICpuYW1lLCB1MzIgcGVybSwKIAl1OCBtb2RlLCBjaGFyICpleHRlbnNpb24sIHUzMiAqZmlkcCwgc3RydWN0IHY5ZnNfcWlkICpxaWQsIHUzMiAqaW91bml0KQogewotCXUzMiBmaWQ7CisJaW50IGZpZDsKIAlpbnQgZXJyOwogCXN0cnVjdCB2OWZzX2ZjYWxsICpmY2FsbDsKIApAQCAtMzEwLDcgKzMxMCw3IEBACiB2OWZzX2Nsb25lX3dhbGsoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgdTMyIGZpZCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWludCBlcnI7Ci0JdTMyIG5maWQ7CisJaW50IG5maWQ7CiAJc3RydWN0IHY5ZnNfZmlkICpyZXQ7CiAJc3RydWN0IHY5ZnNfZmNhbGwgKmZjYWxsOwogCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCA2YTNkZjA1Li4yNzZmZjNiIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTEyLDkgKzEyLDcgQEAKIAkgIEV4dDIgaXMgYSBzdGFuZGFyZCBMaW51eCBmaWxlIHN5c3RlbSBmb3IgaGFyZCBkaXNrcy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDIuICBCZSBhd2FyZSBob3dldmVyIHRoYXQgdGhlIGZpbGUgc3lzdGVtCi0JICBvZiB5b3VyIHJvb3QgcGFydGl0aW9uICh0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBjYW5ub3QKLQkgIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlLCBhbmQgc28gdGhpcyBjb3VsZCBiZSBkYW5nZXJvdXMuCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0Mi4KIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIApAQCAtOTgsOSArOTYsNyBAQAogCSAgKGF2YWlsYWJsZSBhdCA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lMmZzcHJvZ3MvPikuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBleHQzLiAgQmUgYXdhcmUgaG93ZXZlciB0aGF0IHRoZSBmaWxlIHN5c3RlbQotCSAgb2YgeW91ciByb290IHBhcnRpdGlvbiAodGhlIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgY2Fubm90Ci0JICBiZSBjb21waWxlZCBhcyBhIG1vZHVsZSwgYW5kIHNvIHRoaXMgbWF5IGJlIGRhbmdlcm91cy4KKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBleHQzLgogCiBjb25maWcgRVhUM19GU19YQVRUUgogCWJvb2wgIkV4dDMgZXh0ZW5kZWQgYXR0cmlidXRlcyIKQEAgLTE2Myw5ICsxNTksNyBAQAogCSAgZmVhdHVyZXMgd2lsbCBiZSBhZGRlZCB0byBleHQ0ZGV2IGdyYWR1YWxseS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDRkZXYuICBCZSBhd2FyZSwgaG93ZXZlciwgdGhhdCB0aGUgZmlsZXN5c3RlbQotCSAgb2YgeW91ciByb290IHBhcnRpdGlvbiAodGhlIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgY2Fubm90Ci0JICBiZSBjb21waWxlZCBhcyBhIG1vZHVsZSwgYW5kIHNvIHRoaXMgY291bGQgYmUgZGFuZ2Vyb3VzLgorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV4dDRkZXYuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKQEAgLTYzNCw2ICs2MjgsMTAgQEAKIAkgIElmIHlvdSB3YW50IHRvIGRldmVsb3AgYSB1c2Vyc3BhY2UgRlMsIG9yIGlmIHlvdSB3YW50IHRvIHVzZQogCSAgYSBmaWxlc3lzdGVtIGJhc2VkIG9uIEZVU0UsIGFuc3dlciBZIG9yIE0uCiAKK2NvbmZpZyBHRU5FUklDX0FDTAorCWJvb2wKKwlzZWxlY3QgRlNfUE9TSVhfQUNMCisKIGlmIEJMT0NLCiBtZW51ICJDRC1ST00vRFZEIEZpbGVzeXN0ZW1zIgogCkBAIC05NjgsNyArOTY2LDcgQEAKIAogCVNvbWUgc3lzdGVtIGFnZW50cyByZWx5IG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBzeXNmcyB0byBvcGVyYXRlLgogCS9zYmluL2hvdHBsdWcgdXNlcyBkZXZpY2UgYW5kIG9iamVjdCBhdHRyaWJ1dGVzIGluIHN5c2ZzIHRvIGFzc2lzdCBpbgotCWRlbGVnYXRpbmcgcG9saWN5IGRlY2lzaW9ucywgbGlrZSBwZXJzaXN0YW50bHkgbmFtaW5nIGRldmljZXMuCisJZGVsZWdhdGluZyBwb2xpY3kgZGVjaXNpb25zLCBsaWtlIHBlcnNpc3RlbnRseSBuYW1pbmcgZGV2aWNlcy4KIAogCXN5c2ZzIGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBibG9jayBzdWJzeXN0ZW0gdG8gbW91bnQgdGhlIHJvb3QKIAlwYXJ0aXRpb24uICBJZiBzeXNmcyBpcyBkaXNhYmxlZCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBib290IGRldmljZSBvbgpAQCAtMTAwNCw3ICsxMDAyLDcgQEAKIAogY29uZmlnIEhVR0VUTEJGUwogCWJvb2wgIkh1Z2VUTEIgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKLQlkZXBlbmRzIFg4NiB8fCBJQTY0IHx8IFBQQzY0IHx8IFNQQVJDNjQgfHwgU1VQRVJIIHx8IEJST0tFTgorCWRlcGVuZHMgb24gWDg2IHx8IElBNjQgfHwgUFBDNjQgfHwgU1BBUkM2NCB8fCBTVVBFUkggfHwgQlJPS0VOCiAJaGVscAogCSAgaHVnZXRsYmZzIGlzIGEgZmlsZXN5c3RlbSBiYWNraW5nIGZvciBIdWdlVExCIHBhZ2VzLCBiYXNlZCBvbgogCSAgcmFtZnMuIEZvciBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCBpdCwgc2F5IFkgaGVyZSBhbmQgcmVhZApAQCAtMTE0MSw3ICsxMTM5LDcgQEAKIAloZWxwCiAJICBUaGUgQmVPUyBGaWxlIFN5c3RlbSAoQmVGUykgaXMgdGhlIG5hdGl2ZSBmaWxlIHN5c3RlbSBvZiBCZSwgSW5jJ3MKIAkgIEJlT1MuIE5vdGFibGUgZmVhdHVyZXMgaW5jbHVkZSBzdXBwb3J0IGZvciBhcmJpdHJhcnkgYXR0cmlidXRlcwotCSAgb24gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCBhbmQgZGF0YWJhc2UtbGlrZSBpbmRlY2VzIG9uIHNlbGVjdGVkCisJICBvbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIGFuZCBkYXRhYmFzZS1saWtlIGluZGljZXMgb24gc2VsZWN0ZWQKIAkgIGF0dHJpYnV0ZXMuIChBbHNvIG5vdGUgdGhhdCB0aGlzIGRyaXZlciBkb2Vzbid0IG1ha2UgdGhvc2UgZmVhdHVyZXMKIAkgIGF2YWlsYWJsZSBhdCB0aGlzIHRpbWUpLiBJdCBpcyBhIDY0IGJpdCBmaWxlc3lzdGVtLCBzbyBpdCBzdXBwb3J0cwogCSAgZXh0cmVtZWx5IGxhcmdlIHZvbHVtZXMgYW5kIGZpbGVzLgpAQCAtMTc3Myw2ICsxNzcxLDcgQEAKIAlzZWxlY3QgQ1JZUFRPCiAJc2VsZWN0IENSWVBUT19NRDUKIAlzZWxlY3QgQ1JZUFRPX0RFUworCXNlbGVjdCBDUllQVE9fQ0JDCiAJaGVscAogCSAgUHJvdmlkZXMgZm9yIHNlY3VyZSBSUEMgY2FsbHMgYnkgbWVhbnMgb2YgYSBnc3MtYXBpCiAJICBtZWNoYW5pc20gYmFzZWQgb24gS2VyYmVyb3MgVjUuIFRoaXMgaXMgcmVxdWlyZWQgZm9yCkBAIC0xNzkxLDYgKzE3OTAsNyBAQAogCXNlbGVjdCBDUllQVE9fTUQ1CiAJc2VsZWN0IENSWVBUT19ERVMKIAlzZWxlY3QgQ1JZUFRPX0NBU1Q1CisJc2VsZWN0IENSWVBUT19DQkMKIAloZWxwCiAJICBQcm92aWRlcyBmb3Igc2VjdXJlIFJQQyBjYWxscyBieSBtZWFucyBvZiBhIGdzcy1hcGkKIAkgIG1lY2hhbmlzbSBiYXNlZCBvbiB0aGUgU1BLTTMgcHVibGljLWtleSBtZWNoYW5pc20uCkBAIC0yMDU0LDggKzIwNTQsNyBAQAogCSAgRm9yIG1vc3QgY2FzZXMgeW91IHByb2JhYmx5IHdhbnQgdG8gc2F5IE4uCiAKIGNvbmZpZyBBRlNfRlMKLSMgZm9yIGZzL25scy9Db25maWcuaW4KLQl0cmlzdGF0ZSAiQW5kcmV3IEZpbGUgU3lzdGVtIHN1cHBvcnQgKEFGUykgKEV4cGVyaW1lbnRhbCkiCisJdHJpc3RhdGUgIkFuZHJldyBGaWxlIFN5c3RlbSBzdXBwb3J0IChBRlMpIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgUlhSUEMKIAloZWxwCkBAIC0yMDgwLDEwICsyMDc5LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIEdFTkVSSUNfQUNMCi0JYm9vbAotCXNlbGVjdCBGU19QT1NJWF9BQ0wKLQogZW5kbWVudQogCiBpZiBCTE9DSwpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCA5YTVjZTkzLi5iOWZmYTYzZiAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDggQEAKIAkJaW9jdGwubyByZWFkZGlyLm8gc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gZGNhY2hlLm8gaW5vZGUubyBcCiAJCWF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBhaW8ubyBcCiAJCXNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIFwKLQkJcG5vZGUubyBkcm9wX2NhY2hlcy5vIHNwbGljZS5vIHN5bmMubyB1dGltZXMubworCQlwbm9kZS5vIGRyb3BfY2FjaGVzLm8gc3BsaWNlLm8gc3luYy5vIHV0aW1lcy5vIFwKKwkJc3RhY2subwogCiBpZmVxICgkKENPTkZJR19CTE9DSykseSkKIG9iai15ICs9CWJ1ZmZlci5vIGJpby5vIGJsb2NrX2Rldi5vIGRpcmVjdC1pby5vIG1wYWdlLm8gaW9wcmlvLm8KZGlmZiAtLWdpdCBhL2ZzL2FkZnMvZGlyLmMgYi9mcy9hZGZzL2Rpci5jCmluZGV4IGQzYzc5MDUuLjJiODkwMzggMTAwNjQ0Ci0tLSBhL2ZzL2FkZnMvZGlyLmMKKysrIGIvZnMvYWRmcy9kaXIuYwpAQCAtMjgsNyArMjgsNyBAQAogc3RhdGljIGludAogYWRmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGFkZnNfZGlyX29wcyAqb3BzID0gQURGU19TQihzYiktPnNfZGlyOwogCXN0cnVjdCBvYmplY3RfaW5mbyBvYmo7CmRpZmYgLS1naXQgYS9mcy9hZGZzL3N1cGVyLmMgYi9mcy9hZGZzL3N1cGVyLmMKaW5kZXggOWFkZTEzOS4uNTAyMzM1MSAxMDA2NDQKLS0tIGEvZnMvYWRmcy9zdXBlci5jCisrKyBiL2ZzL2FkZnMvc3VwZXIuYwpAQCAtMzYsNyArMzYsNyBAQAogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNwcmludGYoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZzbnByaW50ZihlcnJvcl9idWYsIHNpemVvZihlcnJvcl9idWYpLCBmbXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIAogCXByaW50ayhLRVJOX0NSSVQgIkFERlMtZnMgZXJyb3IgKGRldmljZSAlcyklcyVzOiAlc1xuIiwKQEAgLTIxMiwxMiArMjEyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmFkZnNfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICphZGZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqYWRmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBhZGZzX2lub2RlX2luZm8gKmVpOwotCWVpID0gKHN0cnVjdCBhZGZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGFkZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZWkgPSAoc3RydWN0IGFkZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoYWRmc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAmZWktPnZmc19pbm9kZTsKQEAgLTIyOCw3ICsyMjgsNyBAQAogCWttZW1fY2FjaGVfZnJlZShhZGZzX2lub2RlX2NhY2hlcCwgQURGU19JKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGFkZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGFkZnNfaW5vZGVfaW5mbyAqKSBmb287CiAKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvYW1pZ2FmZnMuYyBiL2ZzL2FmZnMvYW1pZ2FmZnMuYwppbmRleCBjY2Q2MjRlLi5mNGRlNGI5IDEwMDY0NAotLS0gYS9mcy9hZmZzL2FtaWdhZmZzLmMKKysrIGIvZnMvYWZmcy9hbWlnYWZmcy5jCkBAIC00NDUsNyArNDQ1LDcgQEAKIAl2YV9saXN0CSBhcmdzOwogCiAJdmFfc3RhcnQoYXJncyxmbXQpOwotCXZzcHJpbnRmKEVycm9yQnVmZmVyLGZtdCxhcmdzKTsKKwl2c25wcmludGYoRXJyb3JCdWZmZXIsc2l6ZW9mKEVycm9yQnVmZmVyKSxmbXQsYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwogCiAJcHJpbnRrKEtFUk5fQ1JJVCAiQUZGUyBlcnJvciAoZGV2aWNlICVzKTogJXMoKTogJXNcbiIsIHNiLT5zX2lkLApAQCAtNDYxLDcgKzQ2MSw3IEBACiAJdmFfbGlzdAkgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsZm10KTsKLQl2c3ByaW50ZihFcnJvckJ1ZmZlcixmbXQsYXJncyk7CisJdnNucHJpbnRmKEVycm9yQnVmZmVyLHNpemVvZihFcnJvckJ1ZmZlciksZm10LGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIAogCXByaW50ayhLRVJOX1dBUk5JTkcgIkFGRlMgd2FybmluZyAoZGV2aWNlICVzKTogJXMoKTogJXNcbiIsIHNiLT5zX2lkLApkaWZmIC0tZ2l0IGEvZnMvYWZmcy9iaXRtYXAuYyBiL2ZzL2FmZnMvYml0bWFwLmMKaW5kZXggYjBiOTUzNi4uYjMzMDAwOSAxMDA2NDQKLS0tIGEvZnMvYWZmcy9iaXRtYXAuYworKysgYi9mcy9hZmZzL2JpdG1hcC5jCkBAIC0yODksMTIgKzI4OSwxMSBAQAogCXNiaS0+c19ibWFwX2NvdW50ID0gKHNiaS0+c19wYXJ0aXRpb25fc2l6ZSAtIHNiaS0+c19yZXNlcnZlZCArCiAJCQkJIHNiaS0+c19ibWFwX2JpdHMgLSAxKSAvIHNiaS0+c19ibWFwX2JpdHM7CiAJc2l6ZSA9IHNiaS0+c19ibWFwX2NvdW50ICogc2l6ZW9mKCpibSk7Ci0JYm0gPSBzYmktPnNfYml0bWFwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlibSA9IHNiaS0+c19iaXRtYXAgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghc2JpLT5zX2JpdG1hcCkgewogCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IEJpdG1hcCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoc2JpLT5zX2JpdG1hcCwgMCwgc2l6ZSk7CiAKIAlibWFwX2JsayA9IChfX2JlMzIgKilzYmktPnNfcm9vdF9iaC0+Yl9kYXRhOwogCWJsayA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIDQgLSA0OTsKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvZGlyLmMgYi9mcy9hZmZzL2Rpci5jCmluZGV4IDVkOTY0OWYuLmNhZDNlZTMgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvZGlyLmMKKysrIGIvZnMvYWZmcy9kaXIuYwpAQCAtNDEsNyArNDEsNyBAQAogc3RhdGljIGludAogYWZmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmRpcl9iaDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmZoX2JoOwpAQCAtNzEsNyArNzEsNyBAQAogCQlzdG9yZWQrKzsKIAl9CiAJaWYgKGZfcG9zID09IDEpIHsKLQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCBmX3BvcywgcGFyZW50X2lubyhmaWxwLT5mX2RlbnRyeSksIERUX0RJUikgPCAwKQorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGZfcG9zLCBwYXJlbnRfaW5vKGZpbHAtPmZfcGF0aC5kZW50cnkpLCBEVF9ESVIpIDwgMCkKIAkJCXJldHVybiBzdG9yZWQ7CiAJCWZpbHAtPmZfcG9zID0gZl9wb3MgPSAyOwogCQlzdG9yZWQrKzsKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvc3VwZXIuYyBiL2ZzL2FmZnMvc3VwZXIuYwppbmRleCA1ZWE3MmMzLi4zZGU5M2U3IDEwMDY0NAotLS0gYS9mcy9hZmZzL3N1cGVyLmMKKysrIGIvZnMvYWZmcy9zdXBlci5jCkBAIC02NiwxMiArNjYsMTIgQEAKIAlwcl9kZWJ1ZygiQUZGUzogd3JpdGVfc3VwZXIoKSBhdCAlbHUsIGNsZWFuPSVkXG4iLCBnZXRfc2Vjb25kcygpLCBjbGVhbik7CiB9CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKiBhZmZzX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIGFmZnNfaW5vZGVfY2FjaGVwOwogCiBzdGF0aWMgc3RydWN0IGlub2RlICphZmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGFmZnNfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IGFmZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoYWZmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwllaSA9IChzdHJ1Y3QgYWZmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhhZmZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJZWktPnZmc19pbm9kZS5pX3ZlcnNpb24gPSAxOwpAQCAtODMsNyArODMsNyBAQAogCWttZW1fY2FjaGVfZnJlZShhZmZzX2lub2RlX2NhY2hlcCwgQUZGU19JKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGFmZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGFmZnNfaW5vZGVfaW5mbyAqKSBmb287CiAKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9kaXIuYyBiL2ZzL2Fmcy9kaXIuYwppbmRleCBhNmVjNzVjLi40YWNkMDQxIDEwMDY0NAotLS0gYS9mcy9hZnMvZGlyLmMKKysrIGIvZnMvYWZzL2Rpci5jCkBAIC0zOTIsMTAgKzM5MiwxMCBAQAogCXVuc2lnbmVkIGZwb3M7CiAJaW50IHJldDsKIAotCV9lbnRlcigieyVMZCx7JWx1fX0iLCBmaWxlLT5mX3BvcywgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwlfZW50ZXIoInslTGQseyVsdX19IiwgZmlsZS0+Zl9wb3MsIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKIAogCWZwb3MgPSBmaWxlLT5mX3BvczsKLQlyZXQgPSBhZnNfZGlyX2l0ZXJhdGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZmcG9zLCBjb29raWUsIGZpbGxkaXIpOworCXJldCA9IGFmc19kaXJfaXRlcmF0ZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCAmZnBvcywgY29va2llLCBmaWxsZGlyKTsKIAlmaWxlLT5mX3BvcyA9IGZwb3M7CiAKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9rYWZzYXN5bmNkLmMgYi9mcy9hZnMva2Fmc2FzeW5jZC5jCmluZGV4IGYwOWE3OTQuLjYxNWRmMjQgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9rYWZzYXN5bmNkLmMKKysrIGIvZnMvYWZzL2thZnNhc3luY2QuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSAiY2VsbC5oIgogI2luY2x1ZGUgInNlcnZlci5oIgogI2luY2x1ZGUgInZvbHVtZS5oIgpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnN0aW1vZC5jIGIvZnMvYWZzL2thZnN0aW1vZC5jCmluZGV4IDY1YmMwNWEuLjY5NDM0NGUgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9rYWZzdGltb2QuYworKysgYi9mcy9hZnMva2Fmc3RpbW9kLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgImNlbGwuaCIKICNpbmNsdWRlICJ2b2x1bWUuaCIKICNpbmNsdWRlICJrYWZzdGltb2QuaCIKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tbnRwdC5jIGIvZnMvYWZzL21udHB0LmMKaW5kZXggOTk3ODVhNy4uOGY3NGU4NCAxMDA2NDQKLS0tIGEvZnMvYWZzL21udHB0LmMKKysrIGIvZnMvYWZzL21udHB0LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgotI2luY2x1ZGUgPGxpbnV4L25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgImNlbGwuaCIKICNpbmNsdWRlICJ2b2x1bWUuaCIKQEAgLTEzNiwxMSArMTM2LDExIEBACiB7CiAJa2VudGVyKCIlcCwlcHslcHslc30sJXN9IiwKIAkgICAgICAgaW5vZGUsIGZpbGUsCi0JICAgICAgIGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudCwKLQkgICAgICAgZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50ID8KLQkgICAgICAgZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSA6CisJICAgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50LAorCSAgICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudCA/CisJICAgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSA6CiAJICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopICIiLAotCSAgICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCSAgICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAlyZXR1cm4gLUVSRU1PVEU7CiB9IC8qIGVuZCBhZnNfbW50cHRfb3BlbigpICovCmRpZmYgLS1naXQgYS9mcy9hZnMvc2VydmVyLmMgYi9mcy9hZnMvc2VydmVyLmMKaW5kZXggMjJhZmFhZS4uNDRhZmY4MSAxMDA2NDQKLS0tIGEvZnMvYWZzL3NlcnZlci5jCisrKyBiL2ZzL2Fmcy9zZXJ2ZXIuYwpAQCAtNTUsMTMgKzU1LDEyIEBACiAJX2VudGVyKCIlcCwlMDh4LCIsIGNlbGwsIG50b2hsKGFkZHItPnNfYWRkcikpOwogCiAJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBzZXJ2ZXIgcmVjb3JkICovCi0Jc2VydmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFmc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKKwlzZXJ2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3NlcnZlciksIEdGUF9LRVJORUwpOwogCWlmICghc2VydmVyKSB7CiAJCV9sZWF2ZSgiID0gLUVOT01FTSIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltZW1zZXQoc2VydmVyLCAwLCBzaXplb2Yoc3RydWN0IGFmc19zZXJ2ZXIpKTsKIAlhdG9taWNfc2V0KCZzZXJ2ZXItPnVzYWdlLCAxKTsKIAogCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmxpbmspOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmMgYi9mcy9hZnMvc3VwZXIuYwppbmRleCA2N2QxZjVjLi4xOGQ5Yjc3IDEwMDY0NAotLS0gYS9mcy9hZnMvc3VwZXIuYworKysgYi9mcy9hZnMvc3VwZXIuYwpAQCAtMzUsNyArMzUsNyBAQAogCXN0cnVjdCBhZnNfdm9sdW1lCSp2b2x1bWU7CiB9OwogCi1zdGF0aWMgdm9pZCBhZnNfaV9pbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKK3N0YXRpYyB2b2lkIGFmc19pX2luaXRfb25jZSh2b2lkICpmb28sIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAKIHN0YXRpYyBpbnQgYWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKQEAgLTY1LDcgKzY1LDcgQEAKIAkucHV0X3N1cGVyCT0gYWZzX3B1dF9zdXBlciwKIH07CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmFmc19pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmFmc19pbm9kZV9jYWNoZXA7CiBzdGF0aWMgYXRvbWljX3QgYWZzX2NvdW50X2FjdGl2ZV9pbm9kZXM7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0MiwxNCArMjQyLDEyIEBACiAJa2VudGVyKCIiKTsKIAogCS8qIGFsbG9jYXRlIGEgc3VwZXJibG9jayBpbmZvIHJlY29yZCAqLwotCWFzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFmc19zdXBlcl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJYXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3N1cGVyX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFzKSB7CiAJCV9sZWF2ZSgiID0gLUVOT01FTSIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltZW1zZXQoYXMsIDAsIHNpemVvZihzdHJ1Y3QgYWZzX3N1cGVyX2luZm8pKTsKLQogCWFmc19nZXRfdm9sdW1lKHBhcmFtcy0+dm9sdW1lKTsKIAlhcy0+dm9sdW1lID0gcGFyYW1zLT52b2x1bWU7CiAKQEAgLTM4NCw3ICszODIsNyBAQAogLyoKICAqIGluaXRpYWxpc2UgYW4gaW5vZGUgY2FjaGUgc2xhYiBlbGVtZW50IHByaW9yIHRvIGFueSB1c2UKICAqLwotc3RhdGljIHZvaWQgYWZzX2lfaW5pdF9vbmNlKHZvaWQgKl92bm9kZSwga21lbV9jYWNoZV90ICpjYWNoZXAsCitzdGF0aWMgdm9pZCBhZnNfaV9pbml0X29uY2Uodm9pZCAqX3Zub2RlLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSAoc3RydWN0IGFmc192bm9kZSAqKSBfdm5vZGU7CkBAIC00MTIsNyArNDEwLDcgQEAKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKIAogCXZub2RlID0gKHN0cnVjdCBhZnNfdm5vZGUgKikKLQkJa21lbV9jYWNoZV9hbGxvYyhhZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJCWttZW1fY2FjaGVfYWxsb2MoYWZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bm9kZSkKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKaW5kZXggOTQ3NjY1OS4uNWY1NzdhNiAxMDA2NDQKLS0tIGEvZnMvYWlvLmMKKysrIGIvZnMvYWlvLmMKQEAgLTQ3LDE5ICs0NywxOSBAQAogdW5zaWduZWQgbG9uZyBhaW9fbWF4X25yID0gMHgxMDAwMDsgLyogc3lzdGVtIHdpZGUgbWF4aW11bSBudW1iZXIgb2YgYWlvIHJlcXVlc3RzICovCiAvKi0tLS1lbmQgc3lzY3RsIHZhcmlhYmxlcy0tLSovCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QJKmtpb2NiX2NhY2hlcDsKLXN0YXRpYyBrbWVtX2NhY2hlX3QJKmtpb2N0eF9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUJKmtpb2NiX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZQkqa2lvY3R4X2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphaW9fd3E7CiAKIC8qIFVzZWQgZm9yIHJhcmUgZnB1dCBjb21wbGV0aW9uLiAqLwotc3RhdGljIHZvaWQgYWlvX2ZwdXRfcm91dGluZSh2b2lkICopOwotc3RhdGljIERFQ0xBUkVfV09SSyhmcHV0X3dvcmssIGFpb19mcHV0X3JvdXRpbmUsIE5VTEwpOworc3RhdGljIHZvaWQgYWlvX2ZwdXRfcm91dGluZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgREVDTEFSRV9XT1JLKGZwdXRfd29yaywgYWlvX2ZwdXRfcm91dGluZSk7CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZnB1dF9sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQoZnB1dF9oZWFkKTsKIAotc3RhdGljIHZvaWQgYWlvX2tpY2tfaGFuZGxlcih2b2lkICopOworc3RhdGljIHZvaWQgYWlvX2tpY2tfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiBzdGF0aWMgdm9pZCBhaW9fcXVldWVfd29yayhzdHJ1Y3Qga2lvY3R4ICopOwogCiAvKiBhaW9fc2V0dXAKQEAgLTIyNyw3ICsyMjcsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJmN0eC0+YWN0aXZlX3JlcXMpOwogCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJ1bl9saXN0KTsKLQlJTklUX1dPUksoJmN0eC0+d3EsIGFpb19raWNrX2hhbmRsZXIsIGN0eCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmN0eC0+d3EsIGFpb19raWNrX2hhbmRsZXIpOwogCiAJaWYgKGFpb19zZXR1cF9yaW5nKGN0eCkgPCAwKQogCQlnb3RvIG91dF9mcmVlY3R4OwpAQCAtMzY3LDggKzM2Nyw3IEBACiB7CiAJdW5zaWduZWQgbnJfZXZlbnRzID0gY3R4LT5tYXhfcmVxczsKIAotCWlmICh1bmxpa2VseShjdHgtPnJlcXNfYWN0aXZlKSkKLQkJQlVHKCk7CisJQlVHX09OKGN0eC0+cmVxc19hY3RpdmUpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmY3R4LT53cSk7CiAJZmx1c2hfd29ya3F1ZXVlKGFpb193cSk7CkBAIC00NzAsNyArNDY5LDcgQEAKIAkJd2FrZV91cCgmY3R4LT53YWl0KTsKIH0KIAotc3RhdGljIHZvaWQgYWlvX2ZwdXRfcm91dGluZSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgYWlvX2ZwdXRfcm91dGluZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCiB7CiAJc3Bpbl9sb2NrX2lycSgmZnB1dF9sb2NrKTsKIAl3aGlsZSAobGlrZWx5KCFsaXN0X2VtcHR5KCZmcHV0X2hlYWQpKSkgewpAQCAtNTA1LDggKzUwNCw3IEBACiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZjdHgtPmN0eF9sb2NrKTsKIAogCXJlcS0+a2lfdXNlcnMgLS07Ci0JaWYgKHVubGlrZWx5KHJlcS0+a2lfdXNlcnMgPCAwKSkKLQkJQlVHKCk7CisJQlVHX09OKHJlcS0+a2lfdXNlcnMgPCAwKTsKIAlpZiAobGlrZWx5KHJlcS0+a2lfdXNlcnMpKQogCQlyZXR1cm4gMDsKIAlsaXN0X2RlbCgmcmVxLT5raV9saXN0KTsJCS8qIHJlbW92ZSBmcm9tIGFjdGl2ZV9yZXFzICovCkBAIC01ODgsNyArNTg2LDcgQEAKIAkgKiBOb3RlIHRoYXQgb24gVU1MIHRoaXMgKnJlcXVpcmVzKiBQRl9CT1JST1dFRF9NTSB0byBiZSBzZXQsIG90aGVyd2lzZQogCSAqIGl0IHdvbid0IHdvcmsuIFVwZGF0ZSBpdCBhY2NvcmRpbmdseSBpZiB5b3UgY2hhbmdlIGl0IGhlcmUKIAkgKi8KLQlhY3RpdmF0ZV9tbShhY3RpdmVfbW0sIG1tKTsKKwlzd2l0Y2hfbW0oYWN0aXZlX21tLCBtbSwgdHNrKTsKIAl0YXNrX3VubG9jayh0c2spOwogCiAJbW1kcm9wKGFjdGl2ZV9tbSk7CkBAIC02NjgsMTcgKzY2Niw2IEBACiAJc3NpemVfdCAoKnJldHJ5KShzdHJ1Y3Qga2lvY2IgKik7CiAJc3NpemVfdCByZXQ7CiAKLQlpZiAoaW9jYi0+a2lfcmV0cmllZCsrID4gMTAyNCoxMDI0KSB7Ci0JCXByaW50aygiTWF4aW1hbCByZXRyeSBjb3VudC4gIEJ5dGVzIGRvbmUgJVpkXG4iLAotCQkJaW9jYi0+a2lfbmJ5dGVzIC0gaW9jYi0+a2lfbGVmdCk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWlmICghKGlvY2ItPmtpX3JldHJpZWQgJiAweGZmKSkgewotCQlwcl9kZWJ1ZygiJWxkIHJldHJ5OiAlemQgb2YgJXpkXG4iLCBpb2NiLT5raV9yZXRyaWVkLAotCQkJaW9jYi0+a2lfbmJ5dGVzIC0gaW9jYi0+a2lfbGVmdCwgaW9jYi0+a2lfbmJ5dGVzKTsKLQl9Ci0KIAlpZiAoIShyZXRyeSA9IGlvY2ItPmtpX3JldHJ5KSkgewogCQlwcmludGsoImFpb19ydW5faW9jYjogaW9jYi0+a2lfcmV0cnkgPSBOVUxMXG4iKTsKIAkJcmV0dXJuIDA7CkBAIC04NTksOSArODQ2LDkgQEAKICAqICAgICAgc3BhY2UuCiAgKiBSdW4gb24gYWlvZCdzIGNvbnRleHQuCiAgKi8KLXN0YXRpYyB2b2lkIGFpb19raWNrX2hhbmRsZXIodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGFpb19raWNrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBraW9jdHggKmN0eCA9IGRhdGE7CisJc3RydWN0IGtpb2N0eCAqY3R4ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBraW9jdHgsIHdxLndvcmspOwogCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOwogCWludCByZXF1ZXVlOwogCkBAIC04NzYsNyArODYzLDcgQEAKIAkgKiB3ZSdyZSBpbiBhIHdvcmtlciB0aHJlYWQgYWxyZWFkeSwgZG9uJ3QgdXNlIHF1ZXVlX2RlbGF5ZWRfd29yaywKIAkgKi8KIAlpZiAocmVxdWV1ZSkKLQkJcXVldWVfd29yayhhaW9fd3EsICZjdHgtPndxKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKGFpb193cSwgJmN0eC0+d3EsIDApOwogfQogCiAKQEAgLTEwMDcsOSArOTk0LDYgQEAKIAlrdW5tYXBfYXRvbWljKHJpbmcsIEtNX0lSUTEpOwogCiAJcHJfZGVidWcoImFkZGVkIHRvIHJpbmcgJXAgYXQgWyVsdV1cbiIsIGlvY2IsIHRhaWwpOwotCi0JcHJfZGVidWcoIiVsZCByZXRyaWVzOiAlemQgb2YgJXpkXG4iLCBpb2NiLT5raV9yZXRyaWVkLAotCQlpb2NiLT5raV9uYnl0ZXMgLSBpb2NiLT5raV9sZWZ0LCBpb2NiLT5raV9uYnl0ZXMpOwogcHV0X3JxOgogCS8qIGV2ZXJ5dGhpbmcgdHVybmVkIG91dCB3ZWxsLCBkaXNwb3NlIG9mIHRoZSBhaW9jYi4gKi8KIAlyZXQgPSBfX2Fpb19wdXRfcmVxKGN0eCwgaW9jYik7CkBAIC0xNDE1LDcgKzEzOTksNiBAQAogCWtpb2NiLT5raV9pb3ZlYy0+aW92X2xlbiA9IGtpb2NiLT5raV9sZWZ0OwogCWtpb2NiLT5raV9ucl9zZWdzID0gMTsKIAlraW9jYi0+a2lfY3VyX3NlZyA9IDA7Ci0Ja2lvY2ItPmtpX25ieXRlcyA9IGtpb2NiLT5raV9sZWZ0OwogCXJldHVybiAwOwogfQogCkBAIC0xNTkzLDcgKzE1NzYsNiBAQAogCXJlcS0+a2lfb3Bjb2RlID0gaW9jYi0+YWlvX2xpb19vcGNvZGU7CiAJaW5pdF93YWl0cXVldWVfZnVuY19lbnRyeSgmcmVxLT5raV93YWl0LCBhaW9fd2FrZV9mdW5jdGlvbik7CiAJSU5JVF9MSVNUX0hFQUQoJnJlcS0+a2lfd2FpdC50YXNrX2xpc3QpOwotCXJlcS0+a2lfcmV0cmllZCA9IDA7CiAKIAlyZXQgPSBhaW9fc2V0dXBfaW9jYihyZXEpOwogCmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvYXV0b2ZzX2kuaCBiL2ZzL2F1dG9mcy9hdXRvZnNfaS5oCmluZGV4IGM3NzAwZDkuLjkwNmJhNWMgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mcy9hdXRvZnNfaS5oCisrKyBiL2ZzL2F1dG9mcy9hdXRvZnNfaS5oCkBAIC0xNDksNiArMTQ5LDcgQEAKIC8qIEluaXRpYWxpemluZyBmdW5jdGlvbiAqLwogCiBpbnQgYXV0b2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KTsKK3ZvaWQgYXV0b2ZzX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKIC8qIFF1ZXVlIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9kaXJoYXNoLmMgYi9mcy9hdXRvZnMvZGlyaGFzaC5jCmluZGV4IDNmZGVkMzguLmJmOGM4YWYgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mcy9kaXJoYXNoLmMKKysrIGIvZnMvYXV0b2ZzL2Rpcmhhc2guYwpAQCAtMjQ2LDUgKzI0Niw0IEBACiAJCQlrZnJlZShlbnQpOwogCQl9CiAJfQotCXNocmlua19kY2FjaGVfc2Ioc2JpLT5zYik7CiB9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvaW5pdC5jIGIvZnMvYXV0b2ZzL2luaXQuYwppbmRleCBhY2ExMjM3Li5jZWE1MjE5IDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvaW5pdC5jCisrKyBiL2ZzL2F1dG9mcy9pbml0LmMKQEAgLTI0LDcgKzI0LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gImF1dG9mcyIsCiAJLmdldF9zYgkJPSBhdXRvZnNfZ2V0X3NiLAotCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5raWxsX3NiCT0gYXV0b2ZzX2tpbGxfc2IsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2F1dG9mc19mcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2lub2RlLmMgYi9mcy9hdXRvZnMvaW5vZGUuYwppbmRleCAyYzk3NTliYS4uZjk2OGQxMyAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzL2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzL2lub2RlLmMKQEAgLTIwLDExICsyMCwyMCBAQAogI2luY2x1ZGUgImF1dG9mc19pLmgiCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKLXN0YXRpYyB2b2lkIGF1dG9mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3ZvaWQgYXV0b2ZzX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mc19zYmkoc2IpOwogCXVuc2lnbmVkIGludCBuOwogCisJLyoKKwkgKiBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIGluIGdldF9zYl9ub2RldiB0aGUgc3VwZXJibG9jaworCSAqIGluZm8gaXMgbm90IHByZXNlbnQgc28gbm90aGluZyBlbHNlIGhhcyBiZWVuIHNldHVwLCBzbworCSAqIGp1c3QgY2FsbCBraWxsX2Fub25fc3VwZXIgd2hlbiB3ZSBhcmUgY2FsbGVkIGZyb20KKwkgKiBkZWFjdGl2YXRlX3N1cGVyLgorCSAqLworCWlmICghc2JpKQorCQlnb3RvIG91dF9raWxsX3NiOworCiAJaWYgKCAhc2JpLT5jYXRhdG9uaWMgKQogCQlhdXRvZnNfY2F0YXRvbmljX21vZGUoc2JpKTsgLyogRnJlZSB3YWl0IHF1ZXVlcywgY2xvc2UgcGlwZSAqLwogCkBAIC0zNiwxNCArNDUsMTUgQEAKIAogCWtmcmVlKHNiLT5zX2ZzX2luZm8pOwogCitvdXRfa2lsbF9zYjoKIAlEUFJJTlRLKCgiYXV0b2ZzOiBzaHV0dGluZyBkb3duXG4iKSk7CisJa2lsbF9hbm9uX3N1cGVyKHNiKTsKIH0KIAogc3RhdGljIHZvaWQgYXV0b2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBhdXRvZnNfc29wcyA9IHsKIAkucmVhZF9pbm9kZQk9IGF1dG9mc19yZWFkX2lub2RlLAotCS5wdXRfc3VwZXIJPSBhdXRvZnNfcHV0X3N1cGVyLAogCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKIH07CiAKQEAgLTEzNiw3ICsxNDYsOCBAQAogCiAJcy0+c19mc19pbmZvID0gc2JpOwogCXNiaS0+bWFnaWMgPSBBVVRPRlNfU0JJX01BR0lDOwotCXNiaS0+Y2F0YXRvbmljID0gMDsKKwlzYmktPnBpcGUgPSBOVUxMOworCXNiaS0+Y2F0YXRvbmljID0gMTsKIAlzYmktPmV4cF90aW1lb3V0ID0gMDsKIAlzYmktPm96X3BncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOwogCWF1dG9mc19pbml0aWFsaXplX2hhc2goJnNiaS0+ZGlyaGFzaCk7CkBAIC0xODAsNiArMTkxLDcgQEAKIAlpZiAoICFwaXBlLT5mX29wIHx8ICFwaXBlLT5mX29wLT53cml0ZSApCiAJCWdvdG8gZmFpbF9mcHV0OwogCXNiaS0+cGlwZSA9IHBpcGU7CisJc2JpLT5jYXRhdG9uaWMgPSAwOwogCiAJLyoKIAkgKiBTdWNjZXNzISBJbnN0YWxsIHRoZSByb290IGRlbnRyeSBub3cgdG8gaW5kaWNhdGUgY29tcGxldGlvbi4KQEAgLTE5OCw2ICsyMTAsNyBAQAogCWlwdXQocm9vdF9pbm9kZSk7CiBmYWlsX2ZyZWU6CiAJa2ZyZWUoc2JpKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOwogZmFpbF91bmxvY2s6CiAJcmV0dXJuIC1FSU5WQUw7CiB9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvcm9vdC5jIGIvZnMvYXV0b2ZzL3Jvb3QuYwppbmRleCAzNjhhMWMzLi5lNjk4YzUxIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvcm9vdC5jCisrKyBiL2ZzL2F1dG9mcy9yb290LmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudCA9IE5VTEw7CiAJc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaXJoYXNoOwogCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOwotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCW9mZl90IG9uciwgbnI7CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJY2FzZSBBVVRPRlNfSU9DX1NFVFRJTUVPVVQ6CiAJCXJldHVybiBhdXRvZnNfZ2V0X3NldF90aW1lb3V0KHNiaSwgYXJncCk7CiAJY2FzZSBBVVRPRlNfSU9DX0VYUElSRToKLQkJcmV0dXJuIGF1dG9mc19leHBpcmVfcnVuKGlub2RlLT5pX3NiLCBzYmksIGZpbHAtPmZfdmZzbW50LAorCQlyZXR1cm4gYXV0b2ZzX2V4cGlyZV9ydW4oaW5vZGUtPmlfc2IsIHNiaSwgZmlscC0+Zl9wYXRoLm1udCwKIAkJCQkJIGFyZ3ApOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PU1lTOwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL3dhaXRxLmMgYi9mcy9hdXRvZnMvd2FpdHEuYwppbmRleCA2MzNmNjI4Li4xOWE5Y2FmIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvd2FpdHEuYworKysgYi9mcy9hdXRvZnMvd2FpdHEuYwpAQCAtNDEsNiArNDEsNyBAQAogCQl3cSA9IG53cTsKIAl9CiAJZnB1dChzYmktPnBpcGUpOwkvKiBDbG9zZSB0aGUgcGlwZSAqLworCXNiaS0+cGlwZSA9IE5VTEw7CiAJYXV0b2ZzX2hhc2hfZHB1dGFsbCgmc2JpLT5kaXJoYXNoKTsgLyogUmVtb3ZlIGFsbCBkZW50cnkgcG9pbnRlcnMgKi8KIH0KIApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oIGIvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCmluZGV4IGIxM2YzMmMuLjIxNmIxYTMgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaAorKysgYi9mcy9hdXRvZnM0L2F1dG9mc19pLmgKQEAgLTE1MCw3ICsxNTAsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXV0b2ZzNF9jb3B5X2F0aW1lKHN0cnVjdCBmaWxlICpzcmMsIHN0cnVjdCBmaWxlICpkc3QpCiB7Ci0JZHN0LT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9hdGltZSA9IHNyYy0+Zl9kZW50cnktPmRfaW5vZGUtPmlfYXRpbWU7CisJZHN0LT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lID0KKwkJc3JjLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lOwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9pbm9kZS5jIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCmluZGV4IDUxZmQ4NTkuLmU4ZjZjNWEgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvaW5vZGUuYworKysgYi9mcy9hdXRvZnM0L2lub2RlLmMKQEAgLTk5LDYgKzk5LDkgQEAKIAlzdHJ1Y3QgZGVudHJ5ICp0aGlzX3BhcmVudCA9IHNiaS0+c2ItPnNfcm9vdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OwogCisJaWYgKCFzYmktPnNiLT5zX3Jvb3QpCisJCXJldHVybjsKKwogCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogcmVwZWF0OgogCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CkBAIC0xNDYsNiArMTQ5LDE1IEBACiB7CiAJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShzYik7CiAKKwkvKgorCSAqIEluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUgaW4gZ2V0X3NiX25vZGV2IHRoZSBzdXBlcmJsb2NrCisJICogaW5mbyBpcyBub3QgcHJlc2VudCBzbyBub3RoaW5nIGVsc2UgaGFzIGJlZW4gc2V0dXAsIHNvCisJICoganVzdCBjYWxsIGtpbGxfYW5vbl9zdXBlciB3aGVuIHdlIGFyZSBjYWxsZWQgZnJvbQorCSAqIGRlYWN0aXZhdGVfc3VwZXIuCisJICovCisJaWYgKCFzYmkpCisJCWdvdG8gb3V0X2tpbGxfc2I7CisKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKIAogCWlmICggIXNiaS0+Y2F0YXRvbmljICkKQEAgLTE1Niw2ICsxNjgsNyBAQAogCiAJa2ZyZWUoc2JpKTsKIAorb3V0X2tpbGxfc2I6CiAJRFBSSU5USygic2h1dHRpbmcgZG93biIpOwogCWtpbGxfYW5vbl9zdXBlcihzYik7CiB9CkBAIC0zMDAsNyArMzEzLDcgQEAKIAlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaTsKIAlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubzsKIAotCXNiaSA9IChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKikga21hbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoICFzYmkgKQogCQlnb3RvIGZhaWxfdW5sb2NrOwogCURQUklOVEsoInN0YXJ0aW5nIHVwLCBzYmkgPSAlcCIsc2JpKTsKQEAgLTMxMCw3ICszMjMsOCBAQAogCXMtPnNfZnNfaW5mbyA9IHNiaTsKIAlzYmktPm1hZ2ljID0gQVVUT0ZTX1NCSV9NQUdJQzsKIAlzYmktPnBpcGVmZCA9IC0xOwotCXNiaS0+Y2F0YXRvbmljID0gMDsKKwlzYmktPnBpcGUgPSBOVUxMOworCXNiaS0+Y2F0YXRvbmljID0gMTsKIAlzYmktPmV4cF90aW1lb3V0ID0gMDsKIAlzYmktPm96X3BncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOwogCXNiaS0+c2IgPSBzOwpAQCAtMzg4LDYgKzQwMiw3IEBACiAJCWdvdG8gZmFpbF9mcHV0OwogCXNiaS0+cGlwZSA9IHBpcGU7CiAJc2JpLT5waXBlZmQgPSBwaXBlZmQ7CisJc2JpLT5jYXRhdG9uaWMgPSAwOwogCiAJLyoKIAkgKiBTdWNjZXNzISBJbnN0YWxsIHRoZSByb290IGRlbnRyeSBub3cgdG8gaW5kaWNhdGUgY29tcGxldGlvbi4KQEAgLTQxMiw2ICs0MjcsNyBAQAogCWtmcmVlKGlubyk7CiBmYWlsX2ZyZWU6CiAJa2ZyZWUoc2JpKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOwogZmFpbF91bmxvY2s6CiAJcmV0dXJuIC1FSU5WQUw7CiB9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3Jvb3QuYyBiL2ZzL2F1dG9mczQvcm9vdC5jCmluZGV4IGMxNDkzNTIuLjhkMDViOWYgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvcm9vdC5jCisrKyBiL2ZzL2F1dG9mczQvcm9vdC5jCkBAIC03NCw3ICs3NCw3IEBACiBzdGF0aWMgaW50IGF1dG9mczRfcm9vdF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpkaXJlbnQsCiAJCQkJZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0Jc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3NiKTsKIAlpbnQgb3pfbW9kZSA9IGF1dG9mczRfb3pfbW9kZShzYmkpOwogCiAJRFBSSU5USygiY2FsbGVkLCBmaWxwLT5mX3BvcyA9ICVsbGQiLCBmaWxlLT5mX3Bvcyk7CkBAIC05NSw4ICs5NSw4IEBACiAKIHN0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGZpbGUtPmZfdmZzbW50OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBmaWxlLT5mX3BhdGgubW50OwogCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZGVudHJ5LT5kX3NiKTsKIAlzdHJ1Y3QgZGVudHJ5ICpjdXJzb3I7CiAJaW50IHN0YXR1czsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiBzdGF0aWMgaW50IGF1dG9mczRfZGlyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkZW50cnktPmRfc2IpOwogCXN0cnVjdCBkZW50cnkgKmN1cnNvciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTIwNCw3ICsyMDQsNyBAQAogCiBzdGF0aWMgaW50IGF1dG9mczRfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRlbnRyeS0+ZF9zYik7CiAJc3RydWN0IGRlbnRyeSAqY3Vyc29yID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCBzdGF0dXM7CkBAIC04NTgsMTQgKzg1OCwxNCBAQAogCQlyZXR1cm4gYXV0b2ZzNF9hc2tfcmVnaG9zdChzYmksIHApOwogCiAJY2FzZSBBVVRPRlNfSU9DX0FTS1VNT1VOVDoKLQkJcmV0dXJuIGF1dG9mczRfYXNrX3Vtb3VudChmaWxwLT5mX3Zmc21udCwgcCk7CisJCXJldHVybiBhdXRvZnM0X2Fza191bW91bnQoZmlscC0+Zl9wYXRoLm1udCwgcCk7CiAKIAkvKiByZXR1cm4gYSBzaW5nbGUgdGhpbmcgdG8gZXhwaXJlICovCiAJY2FzZSBBVVRPRlNfSU9DX0VYUElSRToKLQkJcmV0dXJuIGF1dG9mczRfZXhwaXJlX3J1bihpbm9kZS0+aV9zYixmaWxwLT5mX3Zmc21udCxzYmksIHApOworCQlyZXR1cm4gYXV0b2ZzNF9leHBpcmVfcnVuKGlub2RlLT5pX3NiLGZpbHAtPmZfcGF0aC5tbnQsc2JpLCBwKTsKIAkvKiBzYW1lIGFzIGFib3ZlLCBidXQgY2FuIHNlbmQgbXVsdGlwbGUgZXhwaXJlcyB0aHJvdWdoIHBpcGUgKi8KIAljYXNlIEFVVE9GU19JT0NfRVhQSVJFX01VTFRJOgotCQlyZXR1cm4gYXV0b2ZzNF9leHBpcmVfbXVsdGkoaW5vZGUtPmlfc2IsZmlscC0+Zl92ZnNtbnQsc2JpLCBwKTsKKwkJcmV0dXJuIGF1dG9mczRfZXhwaXJlX211bHRpKGlub2RlLT5pX3NiLGZpbHAtPmZfcGF0aC5tbnQsc2JpLCBwKTsKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PU1lTOwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC93YWl0cS5jIGIvZnMvYXV0b2ZzNC93YWl0cS5jCmluZGV4IGMwYTZjOGQuLjFlNGE1MzkgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvd2FpdHEuYworKysgYi9mcy9hdXRvZnM0L3dhaXRxLmMKQEAgLTQxLDEwICs0MSw4IEBACiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmd3EtPnF1ZXVlKTsKIAkJd3EgPSBud3E7CiAJfQotCWlmIChzYmktPnBpcGUpIHsKLQkJZnB1dChzYmktPnBpcGUpOwkvKiBDbG9zZSB0aGUgcGlwZSAqLwotCQlzYmktPnBpcGUgPSBOVUxMOwotCX0KKwlmcHV0KHNiaS0+cGlwZSk7CS8qIENsb3NlIHRoZSBwaXBlICovCisJc2JpLT5waXBlID0gTlVMTDsKIH0KIAogc3RhdGljIGludCBhdXRvZnM0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCB2b2lkICphZGRyLCBpbnQgYnl0ZXMpCmRpZmYgLS1naXQgYS9mcy9iZWZzL2J0cmVlLmMgYi9mcy9iZWZzL2J0cmVlLmMKaW5kZXggODFiMDQyZS4uYWY1YmI5MyAxMDA2NDQKLS0tIGEvZnMvYmVmcy9idHJlZS5jCisrKyBiL2ZzL2JlZnMvYnRyZWUuYwpAQCAtMjYwLDcgKzI2MCw3IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JdGhpc19ub2RlID0gKGJlZnNfYnRyZWVfbm9kZSAqKSBrbWFsbG9jKHNpemVvZiAoYmVmc19idHJlZV9ub2RlKSwKKwl0aGlzX25vZGUgPSBrbWFsbG9jKHNpemVvZiAoYmVmc19idHJlZV9ub2RlKSwKIAkJCQkJCUdGUF9OT0ZTKTsKIAlpZiAoIXRoaXNfbm9kZSkgewogCQliZWZzX2Vycm9yKHNiLCAiYmVmc19idHJlZV9maW5kKCkgZmFpbGVkIHRvIGFsbG9jYXRlICV1ICIKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvZGVidWcuYyBiL2ZzL2JlZnMvZGVidWcuYwppbmRleCBlODMxYThmLi5iOGUzMDRhIDEwMDY0NAotLS0gYS9mcy9iZWZzL2RlYnVnLmMKKysrIGIvZnMvYmVmcy9kZWJ1Zy5jCkBAIC0yOCw3ICsyOCw3IEBACiBiZWZzX2Vycm9yKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKLQljaGFyICplcnJfYnVmID0gKGNoYXIgKikga21hbGxvYyhFUlJCVUZTSVpFLCBHRlBfS0VSTkVMKTsKKwljaGFyICplcnJfYnVmID0ga21hbGxvYyhFUlJCVUZTSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoZXJyX2J1ZiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY291bGQgbm90IGFsbG9jYXRlICVkIGJ5dGVzXG4iLCBFUlJCVUZTSVpFKTsKIAkJcmV0dXJuOwpAQCAtNDYsNyArNDYsNyBAQAogYmVmc193YXJuaW5nKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKLQljaGFyICplcnJfYnVmID0gKGNoYXIgKikga21hbGxvYyhFUlJCVUZTSVpFLCBHRlBfS0VSTkVMKTsKKwljaGFyICplcnJfYnVmID0ga21hbGxvYyhFUlJCVUZTSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoZXJyX2J1ZiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY291bGQgbm90IGFsbG9jYXRlICVkIGJ5dGVzXG4iLCBFUlJCVUZTSVpFKTsKIAkJcmV0dXJuOwpAQCAtNzAsNyArNzAsNyBAQAogCWNoYXIgKmVycl9idWYgPSBOVUxMOwogCiAJaWYgKEJFRlNfU0Ioc2IpLT5tb3VudF9vcHRzLmRlYnVnKSB7Ci0JCWVycl9idWYgPSAoY2hhciAqKSBrbWFsbG9jKEVSUkJVRlNJWkUsIEdGUF9LRVJORUwpOworCQllcnJfYnVmID0ga21hbGxvYyhFUlJCVUZTSVpFLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycl9idWYgPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3QgYWxsb2NhdGUgJWQgYnl0ZXNcbiIsCiAJCQkJRVJSQlVGU0laRSk7CmRpZmYgLS1naXQgYS9mcy9iZWZzL2xpbnV4dmZzLmMgYi9mcy9iZWZzL2xpbnV4dmZzLmMKaW5kZXggMDdmNzE0NC4uNDgxZTU5YiAxMDA2NDQKLS0tIGEvZnMvYmVmcy9saW51eHZmcy5jCisrKyBiL2ZzL2JlZnMvbGludXh2ZnMuYwpAQCAtNjEsNyArNjEsNyBAQAogfTsKIAogLyogc2xhYiBjYWNoZSBmb3IgYmVmc19pbm9kZV9pbmZvIG9iamVjdHMgKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmJlZnNfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiZWZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYmVmc19kaXJfb3BlcmF0aW9ucyA9IHsKIAkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLApAQCAtMjEyLDcgKzIxMiw3IEBACiBzdGF0aWMgaW50CiBiZWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAliZWZzX2RhdGFfc3RyZWFtICpkcyA9ICZCRUZTX0koaW5vZGUpLT5pX2RhdGEuZHM7CiAJYmVmc19vZmZfdCB2YWx1ZTsKQEAgLTIyMiw3ICsyMjIsNyBAQAogCWNoYXIga2V5YnVmW0JFRlNfTkFNRV9MRU4gKyAxXTsKIAljaGFyICpubHNuYW1lOwogCWludCBubHNuYW1lbGVuOwotCWNvbnN0IGNoYXIgKmRpcm5hbWUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWU7CisJY29uc3QgY2hhciAqZGlybmFtZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lOwogCiAJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19yZWFkZGlyKCkgIgogCQkgICAibmFtZSAlcywgaW5vZGUgJWxkLCBmaWxwLT5mX3BvcyAlTGQiLApAQCAtMjc3LDcgKzI3Nyw3IEBACiB7CiAgICAgICAgIHN0cnVjdCBiZWZzX2lub2RlX2luZm8gKmJpOwogICAgICAgICBiaSA9IChzdHJ1Y3QgYmVmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhiZWZzX2lub2RlX2NhY2hlcCwKLQkJCQkJCQlTTEFCX0tFUk5FTCk7CisJCQkJCQkJR0ZQX0tFUk5FTCk7CiAgICAgICAgIGlmICghYmkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHJldHVybiAmYmktPnZmc19pbm9kZTsKQEAgLTI4OSw3ICsyODksNyBAQAogICAgICAgICBrbWVtX2NhY2hlX2ZyZWUoYmVmc19pbm9kZV9jYWNoZXAsIEJFRlNfSShpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogICAgICAgICBzdHJ1Y3QgYmVmc19pbm9kZV9pbmZvICpiaSA9IChzdHJ1Y3QgYmVmc19pbm9kZV9pbmZvICopIGZvbzsKIAkKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9kaXIuYyBiL2ZzL2Jmcy9kaXIuYwppbmRleCBhNjUwZjFkLi4yYTc0NmU2IDEwMDY0NAotLS0gYS9mcy9iZnMvZGlyLmMKKysrIGIvZnMvYmZzL2Rpci5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0YXRpYyBpbnQgYmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKiBkaXIgPSBmLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBkaXIgPSBmLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwogCXN0cnVjdCBiZnNfZGlyZW50ICogZGU7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKaW5kZXggZWQyN2ZmYi4uMTM0Yzk5OSAxMDA2NDQKLS0tIGEvZnMvYmZzL2lub2RlLmMKKysrIGIvZnMvYmZzL2lub2RlLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICoJZnMvYmZzL2lub2RlLmMKICAqCUJGUyBzdXBlcmJsb2NrIGFuZCBpbm9kZSBvcGVyYXRpb25zLgotICoJQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKglDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az4KICAqCUZyb20gZnMvbWluaXgsIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcy4KICAqCiAgKiAgICAgIE1hZGUgZW5kaWFubmVzcy1jbGVhbiBieSBBbmRyZXcgU3RyaWJibGVoaWxsIDxhZHNAd29tcG9tLm9yZz4sIDIwMDUuCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJiZnMuaCIKIAotTU9EVUxFX0FVVEhPUigiVGlncmFuIEEuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU0NPIFVuaXhXYXJlIEJGUyBmaWxlc3lzdGVtIGZvciBMaW51eCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCkBAIC0yMjgsMTIgKzIyOCwxMiBAQAogCXVubG9ja19rZXJuZWwoKTsKIH0KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIGJmc19pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKiBiZnNfaW5vZGVfY2FjaGVwOwogCiBzdGF0aWMgc3RydWN0IGlub2RlICpiZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgYmZzX2lub2RlX2luZm8gKmJpOwotCWJpID0ga21lbV9jYWNoZV9hbGxvYyhiZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJYmkgPSBrbWVtX2NhY2hlX2FsbG9jKGJmc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghYmkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAmYmktPnZmc19pbm9kZTsKQEAgLTI0NCw3ICsyNDQsNyBAQAogCWttZW1fY2FjaGVfZnJlZShiZnNfaW5vZGVfY2FjaGVwLCBCRlNfSShpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBiZnNfaW5vZGVfaW5mbyAqYmkgPSBmb287CiAKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9hb3V0LmMgYi9mcy9iaW5mbXRfYW91dC5jCmluZGV4IDUxN2UxMTEuLjgxM2E4ODcgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9hb3V0LmMKKysrIGIvZnMvYmluZm10X2FvdXQuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiAJaWYgKChOX01BR0lDKGV4KSAhPSBaTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gT01BR0lDICYmCiAJICAgICBOX01BR0lDKGV4KSAhPSBRTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gTk1BR0lDKSB8fAogCSAgICBOX1RSU0laRShleCkgfHwgTl9EUlNJWkUoZXgpIHx8Ci0JICAgIGlfc2l6ZV9yZWFkKGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSA8IGV4LmFfdGV4dCtleC5hX2RhdGErTl9TWU1TSVpFKGV4KStOX1RYVE9GRihleCkpIHsKKwkgICAgaV9zaXplX3JlYWQoYnBybS0+ZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkgPCBleC5hX3RleHQrZXguYV9kYXRhK05fU1lNU0laRShleCkrTl9UWFRPRkYoZXgpKSB7CiAJCXJldHVybiAtRU5PRVhFQzsKIAl9CiAKQEAgLTM4OSw3ICszODksNyBAQAogCQl7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJICAgICAgICJmZF9vZmZzZXQgaXMgbm90IHBhZ2UgYWxpZ25lZC4gUGxlYXNlIGNvbnZlcnQgcHJvZ3JhbTogJXNcbiIsCi0JCQkgICAgICAgYnBybS0+ZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCSAgICAgICBicHJtLT5maWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCQllcnJvcl90aW1lID0gamlmZmllczsKIAkJfQogCkBAIC00NjksNyArNDY5LDcgQEAKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBleGVjIGV4OwogCi0JaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAlyZXR2YWwgPSAtRU5PRVhFQzsKIAllcnJvciA9IGtlcm5lbF9yZWFkKGZpbGUsIDAsIChjaGFyICopICZleCwgc2l6ZW9mKGV4KSk7CkBAIC01MDYsNyArNTA2LDcgQEAKIAkJewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKIAkJCSAgICAgICAiTl9UWFRPRkYgaXMgbm90IHBhZ2UgYWxpZ25lZC4gUGxlYXNlIGNvbnZlcnQgbGlicmFyeTogJXNcbiIsCi0JCQkgICAgICAgZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCSAgICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCQllcnJvcl90aW1lID0gamlmZmllczsKIAkJfQogCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCmluZGV4IDU2MTAwNjEuLmQzYWRmZDMgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9lbGYuYworKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTQ3LDEwICs0Nyw2IEBACiBzdGF0aWMgaW50IGxvYWRfZWxmX2xpYnJhcnkoc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBlbGZfbWFwIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZWxmX3BoZHIgKiwgaW50LCBpbnQpOwogCi0jaWZuZGVmIGVsZl9hZGRyX3QKLSNkZWZpbmUgZWxmX2FkZHJfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQogLyoKICAqIElmIHdlIGRvbid0IHN1cHBvcnQgY29yZSBkdW1waW5nLCB0aGVuIHN1cHBseSBhIE5VTEwgc28gd2UKICAqIGRvbid0IGV2ZW4gdHJ5LgpAQCAtMjQzLDggKzIzOSw5IEBACiAJaWYgKGludGVycF9hb3V0KSB7CiAJCWFyZ3YgPSBzcCArIDI7CiAJCWVudnAgPSBhcmd2ICsgYXJnYyArIDE7Ci0JCV9fcHV0X3VzZXIoKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpYXJndiwgc3ArKyk7Ci0JCV9fcHV0X3VzZXIoKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpZW52cCwgc3ArKyk7CisJCWlmIChfX3B1dF91c2VyKChlbGZfYWRkcl90KSh1bnNpZ25lZCBsb25nKWFyZ3YsIHNwKyspIHx8CisJCSAgICBfX3B1dF91c2VyKChlbGZfYWRkcl90KSh1bnNpZ25lZCBsb25nKWVudnAsIHNwKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfSBlbHNlIHsKIAkJYXJndiA9IHNwOwogCQllbnZwID0gYXJndiArIGFyZ2MgKyAxOwpAQCAtMjU0LDcgKzI1MSw4IEBACiAJcCA9IGN1cnJlbnQtPm1tLT5hcmdfZW5kID0gY3VycmVudC0+bW0tPmFyZ19zdGFydDsKIAl3aGlsZSAoYXJnYy0tID4gMCkgewogCQlzaXplX3QgbGVuOwotCQlfX3B1dF91c2VyKChlbGZfYWRkcl90KXAsIGFyZ3YrKyk7CisJCWlmIChfX3B1dF91c2VyKChlbGZfYWRkcl90KXAsIGFyZ3YrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJbGVuID0gc3Rybmxlbl91c2VyKCh2b2lkIF9fdXNlciAqKXAsIFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTKTsKIAkJaWYgKCFsZW4gfHwgbGVuID4gUEFHRV9TSVpFKk1BWF9BUkdfUEFHRVMpCiAJCQlyZXR1cm4gMDsKQEAgLTI2NSw3ICsyNjMsOCBAQAogCWN1cnJlbnQtPm1tLT5hcmdfZW5kID0gY3VycmVudC0+bW0tPmVudl9zdGFydCA9IHA7CiAJd2hpbGUgKGVudmMtLSA+IDApIHsKIAkJc2l6ZV90IGxlbjsKLQkJX19wdXRfdXNlcigoZWxmX2FkZHJfdClwLCBlbnZwKyspOworCQlpZiAoX19wdXRfdXNlcigoZWxmX2FkZHJfdClwLCBlbnZwKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWxlbiA9IHN0cm5sZW5fdXNlcigodm9pZCBfX3VzZXIgKilwLCBQQUdFX1NJWkUqTUFYX0FSR19QQUdFUyk7CiAJCWlmICghbGVuIHx8IGxlbiA+IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTKQogCQkJcmV0dXJuIDA7CkBAIC01NDUsNyArNTQ0LDcgQEAKIAl1bnNpZ25lZCBsb25nIHJlbG9jX2Z1bmNfZGVzYyA9IDA7CiAJY2hhciBwYXNzZWRfZmlsZW5vWzZdOwogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOwotCWludCBoYXZlX3B0X2dudV9zdGFjaywgZXhlY3V0YWJsZV9zdGFjayA9IEVYU1RBQ0tfREVGQVVMVDsKKwlpbnQgZXhlY3V0YWJsZV9zdGFjayA9IEVYU1RBQ0tfREVGQVVMVDsKIAl1bnNpZ25lZCBsb25nIGRlZl9mbGFncyA9IDA7CiAJc3RydWN0IHsKIAkJc3RydWN0IGVsZmhkciBlbGZfZXg7CkBAIC03MDgsNyArNzA3LDYgQEAKIAkJCQlleGVjdXRhYmxlX3N0YWNrID0gRVhTVEFDS19ESVNBQkxFX1g7CiAJCQlicmVhazsKIAkJfQotCWhhdmVfcHRfZ251X3N0YWNrID0gKGkgPCBsb2MtPmVsZl9leC5lX3BobnVtKTsKIAogCS8qIFNvbWUgc2ltcGxlIGNvbnNpc3RlbmN5IGNoZWNrcyBmb3IgdGhlIGludGVycHJldGVyICovCiAJaWYgKGVsZl9pbnRlcnByZXRlcikgewpAQCAtODU2LDcgKzg1NCwxMyBAQAogCQkJICogZGVmYXVsdCBtbWFwIGJhc2UsIGFzIHdlbGwgYXMgd2hhdGV2ZXIgcHJvZ3JhbSB0aGV5CiAJCQkgKiBtaWdodCB0cnkgdG8gZXhlYy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgYnJrIHdpbGwKIAkJCSAqIGZvbGxvdyB0aGUgbG9hZGVyLCBhbmQgaXMgbm90IG1vdmFibGUuICAqLwotCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChFTEZfRVRfRFlOX0JBU0UgLSB2YWRkcik7CisJCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9SQU5ET01JWkUpCisJCQkJbG9hZF9iaWFzID0gcmFuZG9taXplX3JhbmdlKDB4MTAwMDAsCisJCQkJCQkJICAgIEVMRl9FVF9EWU5fQkFTRSwKKwkJCQkJCQkgICAgMCk7CisJCQllbHNlCisJCQkJbG9hZF9iaWFzID0gRUxGX0VUX0RZTl9CQVNFOworCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChsb2FkX2JpYXMgLSB2YWRkcik7CiAJCX0KIAogCQllcnJvciA9IGVsZl9tYXAoYnBybS0+ZmlsZSwgbG9hZF9iaWFzICsgdmFkZHIsIGVsZl9wcG50LApAQCAtMTE4Niw3ICsxMTkwLDcgQEAKIAogCS8qIER1bXAgc2hhcmVkIG1lbW9yeSBvbmx5IGlmIG1hcHBlZCBmcm9tIGFuIGFub255bW91cyBmaWxlLiAqLwogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKQotCQlyZXR1cm4gdm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9PSAwOworCQlyZXR1cm4gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID09IDA7CiAKIAkvKiBJZiBpdCBoYXNuJ3QgYmVlbiB3cml0dGVuIHRvLCBkb24ndCB3cml0ZSBpdCBvdXQgKi8KIAlpZiAoIXZtYS0+YW5vbl92bWEpCkBAIC0xMjIwLDcgKzEyMjQsNyBAQAogCiBzdGF0aWMgaW50IGFsaWduZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90ICpmb2Zmc2V0KQogewotCWNoYXIgYnVmWzRdID0geyAwLCB9OworCXN0YXRpYyBjb25zdCBjaGFyIGJ1Zls0XSA9IHsgMCwgfTsKIAlEVU1QX1dSSVRFKGJ1Ziwgcm91bmR1cCgqZm9mZnNldCwgNCkgLSAqZm9mZnNldCwgZm9mZnNldCk7CiAJcmV0dXJuIDE7CiB9CkBAIC0xMzEzLDcgKzEzMTcsNyBAQAogCXByc3RhdHVzLT5wcl9waWQgPSBwLT5waWQ7CiAJcHJzdGF0dXMtPnByX3BwaWQgPSBwLT5wYXJlbnQtPnBpZDsKIAlwcnN0YXR1cy0+cHJfcGdycCA9IHByb2Nlc3NfZ3JvdXAocCk7Ci0JcHJzdGF0dXMtPnByX3NpZCA9IHAtPnNpZ25hbC0+c2Vzc2lvbjsKKwlwcnN0YXR1cy0+cHJfc2lkID0gcHJvY2Vzc19zZXNzaW9uKHApOwogCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKHApKSB7CiAJCS8qCiAJCSAqIFRoaXMgaXMgdGhlIHJlY29yZCBmb3IgdGhlIGdyb3VwIGxlYWRlci4gIEFkZCBpbiB0aGUKQEAgLTEzNTksNyArMTM2Myw3IEBACiAJcHNpbmZvLT5wcl9waWQgPSBwLT5waWQ7CiAJcHNpbmZvLT5wcl9wcGlkID0gcC0+cGFyZW50LT5waWQ7CiAJcHNpbmZvLT5wcl9wZ3JwID0gcHJvY2Vzc19ncm91cChwKTsKLQlwc2luZm8tPnByX3NpZCA9IHAtPnNpZ25hbC0+c2Vzc2lvbjsKKwlwc2luZm8tPnByX3NpZCA9IHByb2Nlc3Nfc2Vzc2lvbihwKTsKIAogCWkgPSBwLT5zdGF0ZSA/IGZmeih+cC0+c3RhdGUpICsgMSA6IDA7CiAJcHNpbmZvLT5wcl9zdGF0ZSA9IGk7CkBAIC0xNTY5LDcgKzE1NzMsOCBAQAogCiAJRFVNUF9XUklURShlbGYsIHNpemVvZigqZWxmKSk7CiAJb2Zmc2V0ICs9IHNpemVvZigqZWxmKTsJCQkJLyogRWxmIGhlYWRlciAqLwotCW9mZnNldCArPSAoc2VncysxKSAqIHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOwkvKiBQcm9ncmFtIGhlYWRlcnMgKi8KKwlvZmZzZXQgKz0gKHNlZ3MgKyAxKSAqIHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOyAvKiBQcm9ncmFtIGhlYWRlcnMgKi8KKwlmb2Zmc2V0ID0gb2Zmc2V0OwogCiAJLyogV3JpdGUgbm90ZXMgcGhkciBlbnRyeSAqLwogCXsKQEAgLTE1ODEsMTMgKzE1ODYsMTUgQEAKIAkJCiAJCXN6ICs9IHRocmVhZF9zdGF0dXNfc2l6ZTsKIAorI2lmZGVmIEVMRl9DT1JFX1dSSVRFX0VYVFJBX05PVEVTCisJCXN6ICs9IEVMRl9DT1JFX0VYVFJBX05PVEVTX1NJWkU7CisjZW5kaWYKKwogCQlmaWxsX2VsZl9ub3RlX3BoZHIoJnBoZHIsIHN6LCBvZmZzZXQpOwogCQlvZmZzZXQgKz0gc3o7CiAJCURVTVBfV1JJVEUoJnBoZHIsIHNpemVvZihwaGRyKSk7CiAJfQogCi0JZm9mZnNldCA9IG9mZnNldDsKLQogCWRhdGFvZmYgPSBvZmZzZXQgPSByb3VuZHVwKG9mZnNldCwgRUxGX0VYRUNfUEFHRVNJWkUpOwogCiAJLyogV3JpdGUgcHJvZ3JhbSBoZWFkZXJzIGZvciBzZWdtZW50cyBkdW1wICovCkBAIC0xNjEyLDcgKzE2MTksNiBAQAogCQlwaGRyLnBfYWxpZ24gPSBFTEZfRVhFQ19QQUdFU0laRTsKIAogCQlEVU1QX1dSSVRFKCZwaGRyLCBzaXplb2YocGhkcikpOwotCQlmb2Zmc2V0ICs9IHNpemVvZihwaGRyKTsKIAl9CiAKICNpZmRlZiBFTEZfQ09SRV9XUklURV9FWFRSQV9QSERSUwpAQCAtMTYyNCw2ICsxNjMwLDEwIEBACiAJCWlmICghd3JpdGVub3RlKG5vdGVzICsgaSwgZmlsZSwgJmZvZmZzZXQpKQogCQkJZ290byBlbmRfY29yZWR1bXA7CiAKKyNpZmRlZiBFTEZfQ09SRV9XUklURV9FWFRSQV9OT1RFUworCUVMRl9DT1JFX1dSSVRFX0VYVFJBX05PVEVTOworI2VuZGlmCisKIAkvKiB3cml0ZSBvdXQgdGhlIHRocmVhZCBzdGF0dXMgbm90ZXMgc2VjdGlvbiAqLwogCWxpc3RfZm9yX2VhY2godCwgJnRocmVhZF9saXN0KSB7CiAJCXN0cnVjdCBlbGZfdGhyZWFkX3N0YXR1cyAqdG1wID0KZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwppbmRleCBmODZkNWM5Li42ZTZkNDU2IDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKKysrIGIvZnMvYmluZm10X2VsZl9mZHBpYy5jCkBAIC00MCw5ICs0MCw2IEBACiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KIAogdHlwZWRlZiBjaGFyICplbGZfY2FkZHJfdDsKLSNpZm5kZWYgZWxmX2FkZHJfdAotI2RlZmluZSBlbGZfYWRkcl90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgogCiAjaWYgMAogI2RlZmluZSBrZGVidWcoZm10LCAuLi4pIHByaW50aygiRkRQSUMgImZtdCJcbiIgLCMjX19WQV9BUkdTX18gKQpAQCAtNzA5LDEyICs3MDYsMTEgQEAKIAkJcmV0dXJuIC1FTElCQkFEOwogCiAJc2l6ZSA9IHNpemVvZigqbG9hZG1hcCkgKyBubG9hZHMgKiBzaXplb2YoKnNlZyk7Ci0JbG9hZG1hcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbG9hZG1hcCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsb2FkbWFwKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBhcmFtcy0+bG9hZG1hcCA9IGxvYWRtYXA7Ci0JbWVtc2V0KGxvYWRtYXAsIDAsIHNpemUpOwogCiAJbG9hZG1hcC0+dmVyc2lvbiA9IEVMRjMyX0ZEUElDX0xPQURNQVBfVkVSU0lPTjsKIAlsb2FkbWFwLT5uc2VncyA9IG5sb2FkczsKQEAgLTg1OCw3ICs4NTQsNyBAQAogCiBkeW5hbWljX2Vycm9yOgogCXByaW50aygiRUxGIEZEUElDICVzIHdpdGggaW52YWxpZCBEWU5BTUlDIHNlY3Rpb24gKGlub2RlPSVsdSlcbiIsCi0JICAgICAgIHdoYXQsIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CisJICAgICAgIHdoYXQsIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKIAlyZXR1cm4gLUVMSUJCQUQ7CiB9CiAKQEAgLTExODksNyArMTE4NSw3IEBACiAKIAkvKiBEdW1wIHNoYXJlZCBtZW1vcnkgb25seSBpZiBtYXBwZWQgZnJvbSBhbiBhbm9ueW1vdXMgZmlsZS4gKi8KIAlpZiAodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgewotCQlpZiAodm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9PSAwKSB7CisJCWlmICh2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPT0gMCkgewogCQkJa2Rjb3JlKCIlMDhseDogJTA4bHg6IG5vIChzaGFyZSkiLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2ZsYWdzKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0xMzI1LDcgKzEzMjEsNyBAQAogCXByc3RhdHVzLT5wcl9waWQgPSBwLT5waWQ7CiAJcHJzdGF0dXMtPnByX3BwaWQgPSBwLT5wYXJlbnQtPnBpZDsKIAlwcnN0YXR1cy0+cHJfcGdycCA9IHByb2Nlc3NfZ3JvdXAocCk7Ci0JcHJzdGF0dXMtPnByX3NpZCA9IHAtPnNpZ25hbC0+c2Vzc2lvbjsKKwlwcnN0YXR1cy0+cHJfc2lkID0gcHJvY2Vzc19zZXNzaW9uKHApOwogCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKHApKSB7CiAJCS8qCiAJCSAqIFRoaXMgaXMgdGhlIHJlY29yZCBmb3IgdGhlIGdyb3VwIGxlYWRlci4gIEFkZCBpbiB0aGUKQEAgLTEzNzQsNyArMTM3MCw3IEBACiAJcHNpbmZvLT5wcl9waWQgPSBwLT5waWQ7CiAJcHNpbmZvLT5wcl9wcGlkID0gcC0+cGFyZW50LT5waWQ7CiAJcHNpbmZvLT5wcl9wZ3JwID0gcHJvY2Vzc19ncm91cChwKTsKLQlwc2luZm8tPnByX3NpZCA9IHAtPnNpZ25hbC0+c2Vzc2lvbjsKKwlwc2luZm8tPnByX3NpZCA9IHByb2Nlc3Nfc2Vzc2lvbihwKTsKIAogCWkgPSBwLT5zdGF0ZSA/IGZmeih+cC0+c3RhdGUpICsgMSA6IDA7CiAJcHNpbmZvLT5wcl9zdGF0ZSA9IGk7CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZmxhdC5jIGIvZnMvYmluZm10X2ZsYXQuYwppbmRleCBhNjJmZDQwLi5hZTg1OTVkIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZmxhdC5jCisrKyBiL2ZzL2JpbmZtdF9mbGF0LmMKQEAgLTQyOSw3ICs0MjksNyBAQAogCWludCByZXQ7CiAKIAloZHIgPSAoKHN0cnVjdCBmbGF0X2hkciAqKSBicHJtLT5idWYpOwkJLyogZXhlYy1oZWFkZXIgKi8KLQlpbm9kZSA9IGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gYnBybS0+ZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCXRleHRfbGVuICA9IG50b2hsKGhkci0+ZGF0YV9zdGFydCk7CiAJZGF0YV9sZW4gID0gbnRvaGwoaGRyLT5kYXRhX2VuZCkgLSBudG9obChoZHItPmRhdGFfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X21pc2MuYyBiL2ZzL2JpbmZtdF9taXNjLmMKaW5kZXggMTcxM2M0OC4uYzJlMDgyNSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X21pc2MuYworKysgYi9mcy9iaW5mbXRfbWlzYy5jCkBAIC0zMTEsNyArMzExLDcgQEAKIAogCWVyciA9IC1FTk9NRU07CiAJbWVtc2l6ZSA9IHNpemVvZihOb2RlKSArIGNvdW50ICsgODsKLQllID0gKE5vZGUgKikga21hbGxvYyhtZW1zaXplLCBHRlBfVVNFUik7CisJZSA9IGttYWxsb2MobWVtc2l6ZSwgR0ZQX1VTRVIpOwogCWlmICghZSkKIAkJZ290byBvdXQ7CiAKQEAgLTU0Miw3ICs1NDIsNyBAQAogc3RhdGljIHNzaXplX3QKIGJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQogewotCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOworCU5vZGUgKmUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAJbG9mZl90IHBvcyA9ICpwcG9zOwogCXNzaXplX3QgcmVzOwogCWNoYXIgKnBhZ2U7CkBAIC01NzYsNyArNTc2LDcgQEAKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpyb290OwotCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOworCU5vZGUgKmUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7CiAKIAlzd2l0Y2ggKHJlcykgewpAQCAtNTg0LDcgKzU4NCw3IEBACiAJCQlicmVhazsKIAkJY2FzZSAyOiBzZXRfYml0KEVuYWJsZWQsICZlLT5mbGFncyk7CiAJCQlicmVhazsKLQkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOworCQljYXNlIDM6IHJvb3QgPSBkZ2V0KGZpbGUtPmZfcGF0aC5tbnQtPm1udF9zYi0+c19yb290KTsKIAkJCW11dGV4X2xvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJCQlraWxsX25vZGUoZSk7CkBAIC02MTAsNyArNjEwLDcgQEAKIAlOb2RlICplOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGRlbnRyeSAqcm9vdCwgKmRlbnRyeTsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZS0+Zl92ZnNtbnQtPm1udF9zYjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZS0+Zl9wYXRoLm1udC0+bW50X3NiOwogCWludCBlcnIgPSAwOwogCiAJZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTsKQEAgLTY5OSw3ICs2OTksNyBAQAogCXN3aXRjaCAocmVzKSB7CiAJCWNhc2UgMTogZW5hYmxlZCA9IDA7IGJyZWFrOwogCQljYXNlIDI6IGVuYWJsZWQgPSAxOyBicmVhazsKLQkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOworCQljYXNlIDM6IHJvb3QgPSBkZ2V0KGZpbGUtPmZfcGF0aC5tbnQtPm1udF9zYi0+c19yb290KTsKIAkJCW11dGV4X2xvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmVudHJpZXMpKQpkaWZmIC0tZ2l0IGEvZnMvYmlvLmMgYi9mcy9iaW8uYwppbmRleCBmOTVjODc0Li43NjE4YmNiIDEwMDY0NAotLS0gYS9mcy9iaW8uYworKysgYi9mcy9iaW8uYwpAQCAtMzAsNyArMzAsNyBAQAogCiAjZGVmaW5lIEJJT19QT09MX1NJWkUgMjU2CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmJpb19zbGFiIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJpb19zbGFiIF9fcmVhZF9tb3N0bHk7CiAKICNkZWZpbmUgQklPVkVDX05SX1BPT0xTIDYKIApAQCAtNDQsNyArNDQsNyBAQAogc3RydWN0IGJpb3ZlY19zbGFiIHsKIAlpbnQgbnJfdmVjczsKIAljaGFyICpuYW1lOyAKLQlrbWVtX2NhY2hlX3QgKnNsYWI7CisJc3RydWN0IGttZW1fY2FjaGUgKnNsYWI7CiB9OwogCiAvKgpAQCAtNTYwLDEwICs1NjAsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoYmlvX2FkZF9wY19wYWdlKHEsIGJpbywgcGFnZSwgYnl0ZXMsIDApIDwgYnl0ZXMpIHsKLQkJCXJldCA9IC1FSU5WQUw7CisJCWlmIChiaW9fYWRkX3BjX3BhZ2UocSwgYmlvLCBwYWdlLCBieXRlcywgMCkgPCBieXRlcykKIAkJCWJyZWFrOwotCQl9CiAKIAkJbGVuIC09IGJ5dGVzOwogCX0KQEAgLTYyMiwxMCArNjIwLDkgQEAKIAogCQlucl9wYWdlcyArPSBlbmQgLSBzdGFydDsKIAkJLyoKLQkJICogdHJhbnNmZXIgYW5kIGJ1ZmZlciBtdXN0IGJlIGFsaWduZWQgdG8gYXQgbGVhc3QgaGFyZHNlY3RvcgotCQkgKiBzaXplIGZvciBub3csIGluIHRoZSBmdXR1cmUgd2UgY2FuIHJlbGF4IHRoaXMgcmVzdHJpY3Rpb24KKwkJICogYnVmZmVyIG11c3QgYmUgYWxpZ25lZCB0byBhdCBsZWFzdCBoYXJkc2VjdG9yIHNpemUgZm9yIG5vdwogCQkgKi8KLQkJaWYgKCh1YWRkciAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpIHx8IChsZW4gJiBxdWV1ZV9kbWFfYWxpZ25tZW50KHEpKSkKKwkJaWYgKHVhZGRyICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkKIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIApAQCAtNzUxLDcgKzc0OCw2IEBACiAJCQkgICAgIGludCB3cml0ZV90b192bSkKIHsKIAlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IGxlbiA9IDAsIGk7CiAKIAliaW8gPSBfX2Jpb19tYXBfdXNlcl9pb3YocSwgYmRldiwgaW92LCBpb3ZfY291bnQsIHdyaXRlX3RvX3ZtKTsKIApAQCAtNzY2LDE4ICs3NjIsNyBAQAogCSAqLwogCWJpb19nZXQoYmlvKTsKIAotCWZvciAoaSA9IDA7IGkgPCBpb3ZfY291bnQ7IGkrKykKLQkJbGVuICs9IGlvdltpXS5pb3ZfbGVuOwotCi0JaWYgKGJpby0+Ymlfc2l6ZSA9PSBsZW4pCi0JCXJldHVybiBiaW87Ci0KLQkvKgotCSAqIGRvbid0IHN1cHBvcnQgcGFydGlhbCBtYXBwaW5ncwotCSAqLwotCWJpb19lbmRpbyhiaW8sIGJpby0+Ymlfc2l6ZSwgMCk7Ci0JYmlvX3VubWFwX3VzZXIoYmlvKTsKLQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlyZXR1cm4gYmlvOwogfQogCiBzdGF0aWMgdm9pZCBfX2Jpb191bm1hcF91c2VyKHN0cnVjdCBiaW8gKmJpbykKQEAgLTkzMSw3ICs5MTYsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYmlvX3JlbGVhc2VfcGFnZXMoc3RydWN0IGJpbyAqYmlvKQordm9pZCBiaW9fcmVsZWFzZV9wYWdlcyhzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKIAlpbnQgaTsKQEAgLTk1NSwxNiArOTQwLDE2IEBACiAgKiBydW4gb25lIGJpb19wdXQoKSBhZ2FpbnN0IHRoZSBCSU8uCiAgKi8KIAotc3RhdGljIHZvaWQgYmlvX2RpcnR5X2ZuKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgYmlvX2RpcnR5X2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKLXN0YXRpYyBERUNMQVJFX1dPUksoYmlvX2RpcnR5X3dvcmssIGJpb19kaXJ0eV9mbiwgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9XT1JLKGJpb19kaXJ0eV93b3JrLCBiaW9fZGlydHlfZm4pOwogc3RhdGljIERFRklORV9TUElOTE9DSyhiaW9fZGlydHlfbG9jayk7CiBzdGF0aWMgc3RydWN0IGJpbyAqYmlvX2RpcnR5X2xpc3Q7CiAKIC8qCiAgKiBUaGlzIHJ1bnMgaW4gcHJvY2VzcyBjb250ZXh0CiAgKi8KLXN0YXRpYyB2b2lkIGJpb19kaXJ0eV9mbih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgYmlvX2RpcnR5X2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBiaW8gKmJpbzsKZGlmZiAtLWdpdCBhL2ZzL2Jsb2NrX2Rldi5jIGIvZnMvYmxvY2tfZGV2LmMKaW5kZXggYmM4ZjI3Yy4uMTcxNWQ2YiAxMDA2NDQKLS0tIGEvZnMvYmxvY2tfZGV2LmMKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTEyOSw0MyArMTI5LDE5MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1ibGtkZXZfZ2V0X2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCi0JCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBjcmVhdGUpCitzdGF0aWMgaW50IGJsa19lbmRfYWlvKHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IGJ5dGVzX2RvbmUsIGludCBlcnJvcikKIHsKLQlzZWN0b3JfdCBlbmRfYmxvY2sgPSBtYXhfYmxvY2soSV9CREVWKGlub2RlKSk7Ci0JdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzID0gYmgtPmJfc2l6ZSA+PiBpbm9kZS0+aV9ibGtiaXRzOworCXN0cnVjdCBraW9jYiAqaW9jYiA9IGJpby0+YmlfcHJpdmF0ZTsKKwlhdG9taWNfdCAqYmlvX2NvdW50ID0gJmlvY2ItPmtpX2Jpb19jb3VudDsKIAotCWlmICgoaWJsb2NrICsgbWF4X2Jsb2NrcykgPiBlbmRfYmxvY2spIHsKLQkJbWF4X2Jsb2NrcyA9IGVuZF9ibG9jayAtIGlibG9jazsKLQkJaWYgKChsb25nKW1heF9ibG9ja3MgPD0gMCkgewotCQkJaWYgKGNyZWF0ZSkKLQkJCQlyZXR1cm4gLUVJTzsJLyogd3JpdGUgZnVsbHkgYmV5b25kIEVPRiAqLwotCQkJLyoKLQkJCSAqIEl0IGlzIGEgcmVhZCB3aGljaCBpcyBmdWxseSBiZXlvbmQgRU9GLiAgV2UgcmV0dXJuCi0JCQkgKiBhICFidWZmZXJfbWFwcGVkIGJ1ZmZlcgotCQkJICovCi0JCQltYXhfYmxvY2tzID0gMDsKLQkJfQorCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEKQorCQliaW9fY2hlY2tfcGFnZXNfZGlydHkoYmlvKTsKKwllbHNlIHsKKwkJYmlvX3JlbGVhc2VfcGFnZXMoYmlvKTsKKwkJYmlvX3B1dChiaW8pOwogCX0KIAotCWJoLT5iX2JkZXYgPSBJX0JERVYoaW5vZGUpOwotCWJoLT5iX2Jsb2NrbnIgPSBpYmxvY2s7Ci0JYmgtPmJfc2l6ZSA9IG1heF9ibG9ja3MgPDwgaW5vZGUtPmlfYmxrYml0czsKLQlpZiAobWF4X2Jsb2NrcykKLQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCS8qIGlvY2ItPmtpX25ieXRlcyBzdG9yZXMgZXJyb3IgY29kZSBmcm9tIExMREQgKi8KKwlpZiAoZXJyb3IpCisJCWlvY2ItPmtpX25ieXRlcyA9IC1FSU87CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdChiaW9fY291bnQpKSB7CisJCWlmIChpb2NiLT5raV9uYnl0ZXMgPCAwKQorCQkJYWlvX2NvbXBsZXRlKGlvY2IsIGlvY2ItPmtpX25ieXRlcywgMCk7CisJCWVsc2UKKwkJCWFpb19jb21wbGV0ZShpb2NiLCBpb2NiLT5raV9sZWZ0LCAwKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBWRUNfU0laRQkxNgorc3RydWN0IHB2ZWMgeworCXVuc2lnbmVkIHNob3J0IG5yOworCXVuc2lnbmVkIHNob3J0IGlkeDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZVtWRUNfU0laRV07Cit9OworCisjZGVmaW5lIFBBR0VTX1NQQU5ORUQoYWRkciwgbGVuKQlcCisJKERJVl9ST1VORF9VUCgoYWRkcikgKyAobGVuKSwgUEFHRV9TSVpFKSAtIChhZGRyKSAvIFBBR0VfU0laRSk7CisKKy8qCisgKiBnZXQgcGFnZSBwb2ludGVyIGZvciB1c2VyIGFkZHIsIHdlIGludGVybmFsbHkgY2FjaGUgc3RydWN0IHBhZ2UgYXJyYXkgZm9yCisgKiAoYWRkciwgY291bnQpIHJhbmdlIGluIHB2ZWMgdG8gYXZvaWQgZnJlcXVlbnQgY2FsbCB0byBnZXRfdXNlcl9wYWdlcy4gIElmCisgKiBpbnRlcm5hbCBwYWdlIGxpc3QgaXMgZXhoYXVzdGVkLCBhIGJhdGNoIGNvdW50IG9mIHVwIHRvIFZFQ19TSVpFIGlzIHVzZWQKKyAqIHRvIGdldCBuZXh0IHNldCBvZiBwYWdlIHN0cnVjdC4KKyAqLworc3RhdGljIHN0cnVjdCBwYWdlICpibGtfZ2V0X3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgY291bnQsIGludCBydywKKwkJCQkgc3RydWN0IHB2ZWMgKnB2ZWMpCit7CisJaW50IHJldCwgbnJfcGFnZXM7CisJaWYgKHB2ZWMtPmlkeCA9PSBwdmVjLT5ucikgeworCQlucl9wYWdlcyA9IFBBR0VTX1NQQU5ORUQoYWRkciwgY291bnQpOworCQlucl9wYWdlcyA9IG1pbihucl9wYWdlcywgVkVDX1NJWkUpOworCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCBhZGRyLCBucl9wYWdlcywKKwkJCQkgICAgIHJ3ID09IFJFQUQsIDAsIHB2ZWMtPnBhZ2UsIE5VTEwpOworCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiBFUlJfUFRSKHJldCk7CisJCXB2ZWMtPm5yID0gcmV0OworCQlwdmVjLT5pZHggPSAwOworCX0KKwlyZXR1cm4gcHZlYy0+cGFnZVtwdmVjLT5pZHgrK107Cit9CisKIHN0YXRpYyBzc2l6ZV90CiBibGtkZXZfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCWxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKKwkJIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKIHsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nLT5ob3N0OworCXVuc2lnbmVkIGJsa2JpdHMgPSBibGtzaXplX2JpdHMoYmRldl9oYXJkc2VjdF9zaXplKElfQkRFVihpbm9kZSkpKTsKKwl1bnNpZ25lZCBibG9ja3NpemVfbWFzayA9ICgxIDw8IGJsa2JpdHMpIC0gMTsKKwl1bnNpZ25lZCBsb25nIHNlZyA9IDA7CS8qIGlvdiBzZWdtZW50IGl0ZXJhdG9yICovCisJdW5zaWduZWQgbG9uZyBudmVjOwkvKiBudW1iZXIgb2YgYmlvIHZlYyBuZWVkZWQgKi8KKwl1bnNpZ25lZCBsb25nIGN1cl9vZmY7CS8qIG9mZnNldCBpbnRvIGN1cnJlbnQgcGFnZSAqLworCXVuc2lnbmVkIGxvbmcgY3VyX2xlbjsJLyogSS9PIGxlbiBvZiBjdXJyZW50IHBhZ2UsIHVwIHRvIFBBR0VfU0laRSAqLwogCi0JcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JT19ub19sb2NraW5nKHJ3LCBpb2NiLCBpbm9kZSwgSV9CREVWKGlub2RlKSwKLQkJCQlpb3YsIG9mZnNldCwgbnJfc2VncywgYmxrZGV2X2dldF9ibG9ja3MsIE5VTEwpOworCXVuc2lnbmVkIGxvbmcgYWRkcjsJLyogdXNlciBpb3ZlYyBhZGRyZXNzICovCisJc2l6ZV90IGNvdW50OwkJLyogdXNlciBpb3ZlYyBsZW4gKi8KKwlzaXplX3QgbmJ5dGVzID0gaW9jYi0+a2lfbmJ5dGVzID0gaW9jYi0+a2lfbGVmdDsgLyogdG90YWwgeGZlciBzaXplICovCisJbG9mZl90IHNpemU7CQkvKiBzaXplIG9mIGJsb2NrIGRldmljZSAqLworCXN0cnVjdCBiaW8gKmJpbzsKKwlhdG9taWNfdCAqYmlvX2NvdW50ID0gJmlvY2ItPmtpX2Jpb19jb3VudDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgcHZlYyBwdmVjOworCisJcHZlYy5uciA9IDA7CisJcHZlYy5pZHggPSAwOworCisJaWYgKHBvcyAmIGJsb2Nrc2l6ZV9tYXNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJaWYgKHBvcyArIG5ieXRlcyA+IHNpemUpIHsKKwkJbmJ5dGVzID0gc2l6ZSAtIHBvczsKKwkJaW9jYi0+a2lfbGVmdCA9IG5ieXRlczsKKwl9CisKKwkvKgorCSAqIGNoZWNrIGZpcnN0IG5vbi16ZXJvIGlvdiBhbGlnbm1lbnQsIHRoZSByZW1haW5pbmcKKwkgKiBpb3YgYWxpZ25tZW50IGlzIGNoZWNrZWQgaW5zaWRlIGJpbyBsb29wIGJlbG93LgorCSAqLworCWRvIHsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpb3Zbc2VnXS5pb3ZfYmFzZTsKKwkJY291bnQgPSBtaW4oaW92W3NlZ10uaW92X2xlbiwgbmJ5dGVzKTsKKwkJaWYgKGFkZHIgJiBibG9ja3NpemVfbWFzayB8fCBjb3VudCAmIGJsb2Nrc2l6ZV9tYXNrKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSB3aGlsZSAoIWNvdW50ICYmICsrc2VnIDwgbnJfc2Vncyk7CisJYXRvbWljX3NldChiaW9fY291bnQsIDEpOworCisJd2hpbGUgKG5ieXRlcykgeworCQkvKiByb3VnaGx5IGVzdGltYXRlIG51bWJlciBvZiBiaW8gdmVjIG5lZWRlZCAqLworCQludmVjID0gKG5ieXRlcyArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCQludmVjID0gbWF4KG52ZWMsIG5yX3NlZ3MgLSBzZWcpOworCQludmVjID0gbWluKG52ZWMsICh1bnNpZ25lZCBsb25nKSBCSU9fTUFYX1BBR0VTKTsKKworCQkvKiBiaW9fYWxsb2Mgc2hvdWxkIG5vdCBmYWlsIHdpdGggR0ZQX0tFUk5FTCBmbGFnICovCisJCWJpbyA9IGJpb19hbGxvYyhHRlBfS0VSTkVMLCBudmVjKTsKKwkJYmlvLT5iaV9iZGV2ID0gSV9CREVWKGlub2RlKTsKKwkJYmlvLT5iaV9lbmRfaW8gPSBibGtfZW5kX2FpbzsKKwkJYmlvLT5iaV9wcml2YXRlID0gaW9jYjsKKwkJYmlvLT5iaV9zZWN0b3IgPSBwb3MgPj4gYmxrYml0czsKK3NhbWVfYmlvOgorCQljdXJfb2ZmID0gYWRkciAmIH5QQUdFX01BU0s7CisJCWN1cl9sZW4gPSBQQUdFX1NJWkUgLSBjdXJfb2ZmOworCQlpZiAoY291bnQgPCBjdXJfbGVuKQorCQkJY3VyX2xlbiA9IGNvdW50OworCisJCXBhZ2UgPSBibGtfZ2V0X3BhZ2UoYWRkciwgY291bnQsIHJ3LCAmcHZlYyk7CisJCWlmICh1bmxpa2VseShJU19FUlIocGFnZSkpKQorCQkJZ290byBiYWNrb3V0OworCisJCWlmIChiaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBjdXJfbGVuLCBjdXJfb2ZmKSkgeworCQkJcG9zICs9IGN1cl9sZW47CisJCQlhZGRyICs9IGN1cl9sZW47CisJCQljb3VudCAtPSBjdXJfbGVuOworCQkJbmJ5dGVzIC09IGN1cl9sZW47CisKKwkJCWlmIChjb3VudCkKKwkJCQlnb3RvIHNhbWVfYmlvOworCQkJd2hpbGUgKCsrc2VnIDwgbnJfc2VncykgeworCQkJCWFkZHIgPSAodW5zaWduZWQgbG9uZykgaW92W3NlZ10uaW92X2Jhc2U7CisJCQkJY291bnQgPSBpb3Zbc2VnXS5pb3ZfbGVuOworCQkJCWlmICghY291bnQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICh1bmxpa2VseShhZGRyICYgYmxvY2tzaXplX21hc2sgfHwKKwkJCQkJICAgICBjb3VudCAmIGJsb2Nrc2l6ZV9tYXNrKSkgeworCQkJCQlwYWdlID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJCQkJZ290byBiYWNrb3V0OworCQkJCX0KKwkJCQljb3VudCA9IG1pbihjb3VudCwgbmJ5dGVzKTsKKwkJCQlnb3RvIHNhbWVfYmlvOworCQkJfQorCQl9CisKKwkJLyogYmlvIGlzIHJlYWR5LCBzdWJtaXQgaXQgKi8KKwkJaWYgKHJ3ID09IFJFQUQpCisJCQliaW9fc2V0X3BhZ2VzX2RpcnR5KGJpbyk7CisJCWF0b21pY19pbmMoYmlvX2NvdW50KTsKKwkJc3VibWl0X2JpbyhydywgYmlvKTsKKwl9CisKK2NvbXBsZXRpb246CisJaW9jYi0+a2lfbGVmdCAtPSBuYnl0ZXM7CisJbmJ5dGVzID0gaW9jYi0+a2lfbGVmdDsKKwlpb2NiLT5raV9wb3MgKz0gbmJ5dGVzOworCisJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGlub2RlLT5pX21hcHBpbmcpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KGJpb19jb3VudCkpCisJCWFpb19jb21wbGV0ZShpb2NiLCBuYnl0ZXMsIDApOworCisJcmV0dXJuIC1FSU9DQlFVRVVFRDsKKworYmFja291dDoKKwkvKgorCSAqIGJhY2sgb3V0IG5ieXRlcyBjb3VudCBjb25zdHJ1Y3RlZCBzbyBmYXIgZm9yIHRoaXMgYmlvLAorCSAqIHdlIHdpbGwgdGhyb3cgYXdheSBjdXJyZW50IGJpby4KKwkgKi8KKwluYnl0ZXMgKz0gYmlvLT5iaV9zaXplOworCWJpb19yZWxlYXNlX3BhZ2VzKGJpbyk7CisJYmlvX3B1dChiaW8pOworCisJLyoKKwkgKiBpZiBubyBiaW8gd2FzIHN1Ym1taXR0ZWQsIHJldHVybiB0aGUgZXJyb3IgY29kZS4KKwkgKiBvdGhlcndpc2UsIHByb2NlZWQgd2l0aCBwZW5kaW5nIEkvTyBjb21wbGV0aW9uLgorCSAqLworCWlmIChhdG9taWNfcmVhZChiaW9fY291bnQpID09IDEpCisJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCWdvdG8gY29tcGxldGlvbjsKIH0KIAogc3RhdGljIGludCBibGtkZXZfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKQEAgLTE5MCw3ICszMzgsNyBAQAogCiAvKgogICogcHJpdmF0ZSBsbHNlZWs6Ci0gKiBmb3IgYSBibG9jayBzcGVjaWFsIGZpbGUgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSBpcyB6ZXJvCisgKiBmb3IgYSBibG9jayBzcGVjaWFsIGZpbGUgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplIGlzIHplcm8KICAqIHNvIHdlIGNvbXB1dGUgdGhlIHNpemUgYnkgaGFuZCAoanVzdCBhcyBpbiBibG9ja19yZWFkL3dyaXRlIGFib3ZlKQogICovCiBzdGF0aWMgbG9mZl90IGJsb2NrX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKQEAgLTIzNSwxMSArMzgzLDExIEBACiAgKi8KIAogc3RhdGljICBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0soYmRldl9sb2NrKTsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKiBiZGV2X2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICogYmRldl9jYWNoZXAgX19yZWFkX21vc3RseTsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqYmRldl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCBiZGV2X2lub2RlICplaSA9IGttZW1fY2FjaGVfYWxsb2MoYmRldl9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlzdHJ1Y3QgYmRldl9pbm9kZSAqZWkgPSBrbWVtX2NhY2hlX2FsbG9jKGJkZXZfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7CkBAIC0yNTMsNyArNDAxLDcgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoYmRldl9jYWNoZXAsIGJkaSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGJkZXZfaW5vZGUgKmVpID0gKHN0cnVjdCBiZGV2X2lub2RlICopIGZvbzsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gJmVpLT5iZGV2OwpAQCAtNjQyLDM0ICs3OTAsNDcgQEAKIH0KIAogLyoqCisgKiBmaW5kX2JkX2hvbGRlciAtIGZpbmQgbWF0Y2hpbmcgc3RydWN0IGJkX2hvbGRlciBmcm9tIHRoZSBibG9jayBkZXZpY2UKKyAqCisgKiBAYmRldjoJc3RydWN0IGJsb2NrIGRldmljZSB0byBiZSBzZWFyY2hlZAorICogQGJvOgkJdGFyZ2V0IHN0cnVjdCBiZF9ob2xkZXIKKyAqCisgKiBSZXR1cm5zIG1hdGNoaW5nIGVudHJ5IHdpdGggQGJvIGluIEBiZGV2LT5iZF9ob2xkZXJfbGlzdC4KKyAqIElmIGZvdW5kLCBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBhbmQgcmV0dXJuIHRoZSBwb2ludGVyLgorICogSWYgbm90IGZvdW5kLCByZXR1cm5zIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmRfaG9sZGVyICpmaW5kX2JkX2hvbGRlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCQlzdHJ1Y3QgYmRfaG9sZGVyICpibykKK3sKKwlzdHJ1Y3QgYmRfaG9sZGVyICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmJkZXYtPmJkX2hvbGRlcl9saXN0LCBsaXN0KQorCQlpZiAodG1wLT5zZGlyID09IGJvLT5zZGlyKSB7CisJCQl0bXAtPmNvdW50Kys7CisJCQlyZXR1cm4gdG1wOworCQl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCiAgKiBhZGRfYmRfaG9sZGVyIC0gY3JlYXRlIHN5c2ZzIHN5bWxpbmtzIGZvciBiZF9jbGFpbSgpIHJlbGF0aW9uc2hpcAogICoKICAqIEBiZGV2OglibG9jayBkZXZpY2UgdG8gYmUgYmRfY2xhaW1lZAogICogQGJvOgkJcHJlYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBieSBhbGxvY19iZF9ob2xkZXIoKQogICoKLSAqIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGVudHJ5IHdpdGggQGJvIGluIEBiZGV2LT5iZF9ob2xkZXJfbGlzdCwKLSAqIGFkZCBAYm8gdG8gdGhlIGxpc3QsIGNyZWF0ZSBzeW1saW5rcy4KKyAqIEFkZCBAYm8gdG8gQGJkZXYtPmJkX2hvbGRlcl9saXN0LCBjcmVhdGUgc3ltbGlua3MuCiAgKgotICogUmV0dXJucyAwIGlmIHN5bWxpbmtzIGFyZSBjcmVhdGVkIG9yIGFscmVhZHkgdGhlcmUuCi0gKiBSZXR1cm5zIC12ZSBpZiBzb21ldGhpbmcgZmFpbHMgYW5kIEBibyBjYW4gYmUgZnJlZWQuCisgKiBSZXR1cm5zIDAgaWYgc3ltbGlua3MgYXJlIGNyZWF0ZWQuCisgKiBSZXR1cm5zIC12ZSBpZiBzb21ldGhpbmcgZmFpbHMuCiAgKi8KIHN0YXRpYyBpbnQgYWRkX2JkX2hvbGRlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzdHJ1Y3QgYmRfaG9sZGVyICpibykKIHsKLQlzdHJ1Y3QgYmRfaG9sZGVyICp0bXA7CiAJaW50IHJldDsKIAogCWlmICghYm8pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZiZGV2LT5iZF9ob2xkZXJfbGlzdCwgbGlzdCkgewotCQlpZiAodG1wLT5zZGlyID09IGJvLT5zZGlyKSB7Ci0JCQl0bXAtPmNvdW50Kys7Ci0JCQkvKiBXZSd2ZSBhbHJlYWR5IGRvbmUgd2hhdCB3ZSBuZWVkIHRvIGRvIGhlcmUuICovCi0JCQlmcmVlX2JkX2hvbGRlcihibyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQogCWlmICghYmRfaG9sZGVyX2dyYWJfZGlycyhiZGV2LCBibykpCiAJCXJldHVybiAtRUJVU1k7CiAKQEAgLTc0MCw3ICs5MDEsNyBAQAogCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqKQogewogCWludCByZXM7Ci0Jc3RydWN0IGJkX2hvbGRlciAqYm87CisJc3RydWN0IGJkX2hvbGRlciAqYm8sICpmb3VuZDsKIAogCWlmICgha29iaikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NDksMTEgKzkxMCwxOCBAQAogCWlmICghYm8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXV0ZXhfbG9ja19uZXN0ZWQoJmJkZXYtPmJkX211dGV4LCBCRF9NVVRFWF9QQVJUSVRJT04pOworCW11dGV4X2xvY2soJmJkZXYtPmJkX211dGV4KTsKIAlyZXMgPSBiZF9jbGFpbShiZGV2LCBob2xkZXIpOwotCWlmIChyZXMgPT0gMCkKLQkJcmVzID0gYWRkX2JkX2hvbGRlcihiZGV2LCBibyk7Ci0JaWYgKHJlcykKKwlpZiAocmVzID09IDApIHsKKwkJZm91bmQgPSBmaW5kX2JkX2hvbGRlcihiZGV2LCBibyk7CisJCWlmIChmb3VuZCA9PSBOVUxMKSB7CisJCQlyZXMgPSBhZGRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKKwkJCWlmIChyZXMpCisJCQkJYmRfcmVsZWFzZShiZGV2KTsKKwkJfQorCX0KKworCWlmIChyZXMgfHwgZm91bmQpCiAJCWZyZWVfYmRfaG9sZGVyKGJvKTsKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIApAQCAtNzc2LDcgKzk0NCw3IEBACiAJaWYgKCFrb2JqKQogCQlyZXR1cm47CiAKLQltdXRleF9sb2NrX25lc3RlZCgmYmRldi0+YmRfbXV0ZXgsIEJEX01VVEVYX1BBUlRJVElPTik7CisJbXV0ZXhfbG9jaygmYmRldi0+YmRfbXV0ZXgpOwogCWJkX3JlbGVhc2UoYmRldik7CiAJaWYgKChibyA9IGRlbF9iZF9ob2xkZXIoYmRldiwga29iaikpKQogCQlmcmVlX2JkX2hvbGRlcihibyk7CkBAIC04MzQsMjIgKzEwMDIsNiBAQAogCiBFWFBPUlRfU1lNQk9MKG9wZW5fYnlfZGV2bnVtKTsKIAotc3RhdGljIGludAotYmxrZGV2X2dldF9wYXJ0aXRpb24oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgbW9kZV90IG1vZGUsIHVuc2lnbmVkIGZsYWdzKTsKLQotc3RydWN0IGJsb2NrX2RldmljZSAqb3Blbl9wYXJ0aXRpb25fYnlfZGV2bnVtKGRldl90IGRldiwgdW5zaWduZWQgbW9kZSkKLXsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gYmRnZXQoZGV2KTsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQlpbnQgZmxhZ3MgPSBtb2RlICYgRk1PREVfV1JJVEUgPyBPX1JEV1IgOiBPX1JET05MWTsKLQlpZiAoYmRldikKLQkJZXJyID0gYmxrZGV2X2dldF9wYXJ0aXRpb24oYmRldiwgbW9kZSwgZmxhZ3MpOwotCXJldHVybiBlcnIgPyBFUlJfUFRSKGVycikgOiBiZGV2OwotfQotCi1FWFBPUlRfU1lNQk9MKG9wZW5fcGFydGl0aW9uX2J5X2Rldm51bSk7Ci0KLQogLyoKICAqIFRoaXMgcm91dGluZSBjaGVja3Mgd2hldGhlciBhIHJlbW92YWJsZSBtZWRpYSBoYXMgYmVlbiBjaGFuZ2VkLAogICogYW5kIGludmFsaWRhdGVzIGFsbCBidWZmZXItY2FjaGUtZW50cmllcyBpbiB0aGF0IGNhc2UuIFRoaXMKQEAgLTg5Niw2NiArMTA0OCwxMSBAQAogfQogRVhQT1JUX1NZTUJPTChiZF9zZXRfc2l6ZSk7CiAKLXN0YXRpYyBpbnQgX19ibGtkZXZfcHV0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGludCBzdWJjbGFzcykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gYmRldi0+YmRfaW5vZGU7Ci0Jc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworc3RhdGljIGludCBfX2Jsa2Rldl9nZXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgbW9kZV90IG1vZGUsIHVuc2lnbmVkIGZsYWdzLAorCQkJaW50IGZvcl9wYXJ0KTsKK3N0YXRpYyBpbnQgX19ibGtkZXZfcHV0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGludCBmb3JfcGFydCk7CiAKLQltdXRleF9sb2NrX25lc3RlZCgmYmRldi0+YmRfbXV0ZXgsIHN1YmNsYXNzKTsKLQlsb2NrX2tlcm5lbCgpOwotCWlmICghLS1iZGV2LT5iZF9vcGVuZXJzKSB7Ci0JCXN5bmNfYmxvY2tkZXYoYmRldik7Ci0JCWtpbGxfYmRldihiZGV2KTsKLQl9Ci0JaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpIHsKLQkJaWYgKGRpc2stPmZvcHMtPnJlbGVhc2UpCi0JCQlyZXQgPSBkaXNrLT5mb3BzLT5yZWxlYXNlKGJkX2lub2RlLCBOVUxMKTsKLQl9IGVsc2UgewotCQltdXRleF9sb2NrX25lc3RlZCgmYmRldi0+YmRfY29udGFpbnMtPmJkX211dGV4LAotCQkJCSAgc3ViY2xhc3MgKyAxKTsKLQkJYmRldi0+YmRfY29udGFpbnMtPmJkX3BhcnRfY291bnQtLTsKLQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9jb250YWlucy0+YmRfbXV0ZXgpOwotCX0KLQlpZiAoIWJkZXYtPmJkX29wZW5lcnMpIHsKLQkJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBkaXNrLT5mb3BzLT5vd25lcjsKLQotCQlwdXRfZGlzayhkaXNrKTsKLQkJbW9kdWxlX3B1dChvd25lcik7Ci0KLQkJaWYgKGJkZXYtPmJkX2NvbnRhaW5zICE9IGJkZXYpIHsKLQkJCWtvYmplY3RfcHV0KCZiZGV2LT5iZF9wYXJ0LT5rb2JqKTsKLQkJCWJkZXYtPmJkX3BhcnQgPSBOVUxMOwotCQl9Ci0JCWJkZXYtPmJkX2Rpc2sgPSBOVUxMOwotCQliZGV2LT5iZF9pbm9kZS0+aV9kYXRhLmJhY2tpbmdfZGV2X2luZm8gPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOwotCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKLQkJCV9fYmxrZGV2X3B1dChiZGV2LT5iZF9jb250YWlucywgc3ViY2xhc3MgKyAxKTsKLQkJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOwotCX0KLQl1bmxvY2tfa2VybmVsKCk7Ci0JbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7Ci0JYmRwdXQoYmRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGJsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKLXsKLQlyZXR1cm4gX19ibGtkZXZfcHV0KGJkZXYsIEJEX01VVEVYX05PUk1BTCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGJsa2Rldl9wdXQpOwotCi1pbnQgYmxrZGV2X3B1dF9wYXJ0aXRpb24oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKLXsKLQlyZXR1cm4gX19ibGtkZXZfcHV0KGJkZXYsIEJEX01VVEVYX1BBUlRJVElPTik7Ci19Ci1FWFBPUlRfU1lNQk9MKGJsa2Rldl9wdXRfcGFydGl0aW9uKTsKLQotc3RhdGljIGludAotYmxrZGV2X2dldF93aG9sZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBtb2RlX3QgbW9kZSwgdW5zaWduZWQgZmxhZ3MpOwotCi1zdGF0aWMgaW50Ci1kb19vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgc3ViY2xhc3MpCitzdGF0aWMgaW50IGRvX29wZW4oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBmb3JfcGFydCkKIHsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IE5VTEw7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CkBAIC05NzIsOCArMTA2OSw3IEBACiAJfQogCW93bmVyID0gZGlzay0+Zm9wcy0+b3duZXI7CiAKLQltdXRleF9sb2NrX25lc3RlZCgmYmRldi0+YmRfbXV0ZXgsIHN1YmNsYXNzKTsKLQorCW11dGV4X2xvY2tfbmVzdGVkKCZiZGV2LT5iZF9tdXRleCwgZm9yX3BhcnQpOwogCWlmICghYmRldi0+YmRfb3BlbmVycykgewogCQliZGV2LT5iZF9kaXNrID0gZGlzazsKIAkJYmRldi0+YmRfY29udGFpbnMgPSBiZGV2OwpAQCAtMTAwMCwyNSArMTA5NiwyMSBAQAogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWlmICghd2hvbGUpCiAJCQkJZ290byBvdXRfZmlyc3Q7Ci0JCQlyZXQgPSBibGtkZXZfZ2V0X3dob2xlKHdob2xlLCBmaWxlLT5mX21vZGUsIGZpbGUtPmZfZmxhZ3MpOworCQkJQlVHX09OKGZvcl9wYXJ0KTsKKwkJCXJldCA9IF9fYmxrZGV2X2dldCh3aG9sZSwgZmlsZS0+Zl9tb2RlLCBmaWxlLT5mX2ZsYWdzLCAxKTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBvdXRfZmlyc3Q7CiAJCQliZGV2LT5iZF9jb250YWlucyA9IHdob2xlOwotCQkJbXV0ZXhfbG9ja19uZXN0ZWQoJndob2xlLT5iZF9tdXRleCwgQkRfTVVURVhfV0hPTEUpOwotCQkJd2hvbGUtPmJkX3BhcnRfY291bnQrKzsKIAkJCXAgPSBkaXNrLT5wYXJ0W3BhcnQgLSAxXTsKIAkJCWJkZXYtPmJkX2lub2RlLT5pX2RhdGEuYmFja2luZ19kZXZfaW5mbyA9CiAJCQkgICB3aG9sZS0+YmRfaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvOwogCQkJaWYgKCEoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkgfHwgIXAgfHwgIXAtPm5yX3NlY3RzKSB7Ci0JCQkJd2hvbGUtPmJkX3BhcnRfY291bnQtLTsKLQkJCQltdXRleF91bmxvY2soJndob2xlLT5iZF9tdXRleCk7CiAJCQkJcmV0ID0gLUVOWElPOwogCQkJCWdvdG8gb3V0X2ZpcnN0OwogCQkJfQogCQkJa29iamVjdF9nZXQoJnAtPmtvYmopOwogCQkJYmRldi0+YmRfcGFydCA9IHA7CiAJCQliZF9zZXRfc2l6ZShiZGV2LCAobG9mZl90KSBwLT5ucl9zZWN0cyA8PCA5KTsKLQkJCW11dGV4X3VubG9jaygmd2hvbGUtPmJkX211dGV4KTsKIAkJfQogCX0gZWxzZSB7CiAJCXB1dF9kaXNrKGRpc2spOwpAQCAtMTAzMSwxNCArMTEyMywxMSBAQAogCQkJfQogCQkJaWYgKGJkZXYtPmJkX2ludmFsaWRhdGVkKQogCQkJCXJlc2Nhbl9wYXJ0aXRpb25zKGJkZXYtPmJkX2Rpc2ssIGJkZXYpOwotCQl9IGVsc2UgewotCQkJbXV0ZXhfbG9ja19uZXN0ZWQoJmJkZXYtPmJkX2NvbnRhaW5zLT5iZF9tdXRleCwKLQkJCQkJICBCRF9NVVRFWF9XSE9MRSk7Ci0JCQliZGV2LT5iZF9jb250YWlucy0+YmRfcGFydF9jb3VudCsrOwotCQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9jb250YWlucy0+YmRfbXV0ZXgpOwogCQl9CiAJfQogCWJkZXYtPmJkX29wZW5lcnMrKzsKKwlpZiAoZm9yX3BhcnQpCisJCWJkZXYtPmJkX3BhcnRfY291bnQrKzsKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CkBAIC0xMDQ3LDcgKzExMzYsNyBAQAogCWJkZXYtPmJkX2Rpc2sgPSBOVUxMOwogCWJkZXYtPmJkX2lub2RlLT5pX2RhdGEuYmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CiAJaWYgKGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpCi0JCV9fYmxrZGV2X3B1dChiZGV2LT5iZF9jb250YWlucywgQkRfTVVURVhfV0hPTEUpOworCQlfX2Jsa2Rldl9wdXQoYmRldi0+YmRfY29udGFpbnMsIDEpOwogCWJkZXYtPmJkX2NvbnRhaW5zID0gTlVMTDsKIAlwdXRfZGlzayhkaXNrKTsKIAltb2R1bGVfcHV0KG93bmVyKTsKQEAgLTEwNTksNjQgKzExNDgsMzEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IF9fYmxrZGV2X2dldChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBtb2RlX3QgbW9kZSwgdW5zaWduZWQgZmxhZ3MsCisJCQlpbnQgZm9yX3BhcnQpCit7CisJLyoKKwkgKiBUaGlzIGNyb2NrbG9hZCBpcyBkdWUgdG8gYmFkIGNob2ljZSBvZiAtPm9wZW4oKSB0eXBlLgorCSAqIEl0IHdpbGwgZ28gYXdheS4KKwkgKiBGb3Igbm93LCBibG9jayBkZXZpY2UgLT5vcGVuKCkgcm91dGluZSBtdXN0IF9ub3RfCisJICogZXhhbWluZSBhbnl0aGluZyBpbiAnaW5vZGUnIGFyZ3VtZW50IGV4Y2VwdCAtPmlfcmRldi4KKwkgKi8KKwlzdHJ1Y3QgZmlsZSBmYWtlX2ZpbGUgPSB7fTsKKwlzdHJ1Y3QgZGVudHJ5IGZha2VfZGVudHJ5ID0ge307CisJZmFrZV9maWxlLmZfbW9kZSA9IG1vZGU7CisJZmFrZV9maWxlLmZfZmxhZ3MgPSBmbGFnczsKKwlmYWtlX2ZpbGUuZl9wYXRoLmRlbnRyeSA9ICZmYWtlX2RlbnRyeTsKKwlmYWtlX2RlbnRyeS5kX2lub2RlID0gYmRldi0+YmRfaW5vZGU7CisKKwlyZXR1cm4gZG9fb3BlbihiZGV2LCAmZmFrZV9maWxlLCBmb3JfcGFydCk7Cit9CisKIGludCBibGtkZXZfZ2V0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIG1vZGVfdCBtb2RlLCB1bnNpZ25lZCBmbGFncykKIHsKLQkvKgotCSAqIFRoaXMgY3JvY2tsb2FkIGlzIGR1ZSB0byBiYWQgY2hvaWNlIG9mIC0+b3BlbigpIHR5cGUuCi0JICogSXQgd2lsbCBnbyBhd2F5LgotCSAqIEZvciBub3csIGJsb2NrIGRldmljZSAtPm9wZW4oKSByb3V0aW5lIG11c3QgX25vdF8KLQkgKiBleGFtaW5lIGFueXRoaW5nIGluICdpbm9kZScgYXJndW1lbnQgZXhjZXB0IC0+aV9yZGV2LgotCSAqLwotCXN0cnVjdCBmaWxlIGZha2VfZmlsZSA9IHt9OwotCXN0cnVjdCBkZW50cnkgZmFrZV9kZW50cnkgPSB7fTsKLQlmYWtlX2ZpbGUuZl9tb2RlID0gbW9kZTsKLQlmYWtlX2ZpbGUuZl9mbGFncyA9IGZsYWdzOwotCWZha2VfZmlsZS5mX2RlbnRyeSA9ICZmYWtlX2RlbnRyeTsKLQlmYWtlX2RlbnRyeS5kX2lub2RlID0gYmRldi0+YmRfaW5vZGU7Ci0KLQlyZXR1cm4gZG9fb3BlbihiZGV2LCAmZmFrZV9maWxlLCBCRF9NVVRFWF9OT1JNQUwpOworCXJldHVybiBfX2Jsa2Rldl9nZXQoYmRldiwgbW9kZSwgZmxhZ3MsIDApOwogfQotCiBFWFBPUlRfU1lNQk9MKGJsa2Rldl9nZXQpOwogCi1zdGF0aWMgaW50Ci1ibGtkZXZfZ2V0X3dob2xlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIG1vZGVfdCBtb2RlLCB1bnNpZ25lZCBmbGFncykKLXsKLQkvKgotCSAqIFRoaXMgY3JvY2tsb2FkIGlzIGR1ZSB0byBiYWQgY2hvaWNlIG9mIC0+b3BlbigpIHR5cGUuCi0JICogSXQgd2lsbCBnbyBhd2F5LgotCSAqIEZvciBub3csIGJsb2NrIGRldmljZSAtPm9wZW4oKSByb3V0aW5lIG11c3QgX25vdF8KLQkgKiBleGFtaW5lIGFueXRoaW5nIGluICdpbm9kZScgYXJndW1lbnQgZXhjZXB0IC0+aV9yZGV2LgotCSAqLwotCXN0cnVjdCBmaWxlIGZha2VfZmlsZSA9IHt9OwotCXN0cnVjdCBkZW50cnkgZmFrZV9kZW50cnkgPSB7fTsKLQlmYWtlX2ZpbGUuZl9tb2RlID0gbW9kZTsKLQlmYWtlX2ZpbGUuZl9mbGFncyA9IGZsYWdzOwotCWZha2VfZmlsZS5mX2RlbnRyeSA9ICZmYWtlX2RlbnRyeTsKLQlmYWtlX2RlbnRyeS5kX2lub2RlID0gYmRldi0+YmRfaW5vZGU7Ci0KLQlyZXR1cm4gZG9fb3BlbihiZGV2LCAmZmFrZV9maWxlLCBCRF9NVVRFWF9XSE9MRSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWJsa2Rldl9nZXRfcGFydGl0aW9uKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIG1vZGVfdCBtb2RlLCB1bnNpZ25lZCBmbGFncykKLXsKLQkvKgotCSAqIFRoaXMgY3JvY2tsb2FkIGlzIGR1ZSB0byBiYWQgY2hvaWNlIG9mIC0+b3BlbigpIHR5cGUuCi0JICogSXQgd2lsbCBnbyBhd2F5LgotCSAqIEZvciBub3csIGJsb2NrIGRldmljZSAtPm9wZW4oKSByb3V0aW5lIG11c3QgX25vdF8KLQkgKiBleGFtaW5lIGFueXRoaW5nIGluICdpbm9kZScgYXJndW1lbnQgZXhjZXB0IC0+aV9yZGV2LgotCSAqLwotCXN0cnVjdCBmaWxlIGZha2VfZmlsZSA9IHt9OwotCXN0cnVjdCBkZW50cnkgZmFrZV9kZW50cnkgPSB7fTsKLQlmYWtlX2ZpbGUuZl9tb2RlID0gbW9kZTsKLQlmYWtlX2ZpbGUuZl9mbGFncyA9IGZsYWdzOwotCWZha2VfZmlsZS5mX2RlbnRyeSA9ICZmYWtlX2RlbnRyeTsKLQlmYWtlX2RlbnRyeS5kX2lub2RlID0gYmRldi0+YmRfaW5vZGU7Ci0KLQlyZXR1cm4gZG9fb3BlbihiZGV2LCAmZmFrZV9maWxlLCBCRF9NVVRFWF9QQVJUSVRJT04pOwotfQotCiBzdGF0aWMgaW50IGJsa2Rldl9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKQEAgLTExMzEsOCArMTE4NywxMCBAQAogCWZpbHAtPmZfZmxhZ3MgfD0gT19MQVJHRUZJTEU7CiAKIAliZGV2ID0gYmRfYWNxdWlyZShpbm9kZSk7CisJaWYgKGJkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXMgPSBkb19vcGVuKGJkZXYsIGZpbHAsIEJEX01VVEVYX05PUk1BTCk7CisJcmVzID0gZG9fb3BlbihiZGV2LCBmaWxwLCAwKTsKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCkBAIC0xMTQ2LDYgKzEyMDQsNTYgQEAKIAlyZXR1cm4gcmVzOwogfQogCitzdGF0aWMgaW50IF9fYmxrZGV2X3B1dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgZm9yX3BhcnQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGlub2RlICpiZF9pbm9kZSA9IGJkZXYtPmJkX2lub2RlOworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICp2aWN0aW0gPSBOVUxMOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJmJkZXYtPmJkX211dGV4LCBmb3JfcGFydCk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZm9yX3BhcnQpCisJCWJkZXYtPmJkX3BhcnRfY291bnQtLTsKKworCWlmICghLS1iZGV2LT5iZF9vcGVuZXJzKSB7CisJCXN5bmNfYmxvY2tkZXYoYmRldik7CisJCWtpbGxfYmRldihiZGV2KTsKKwl9CisJaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpIHsKKwkJaWYgKGRpc2stPmZvcHMtPnJlbGVhc2UpCisJCQlyZXQgPSBkaXNrLT5mb3BzLT5yZWxlYXNlKGJkX2lub2RlLCBOVUxMKTsKKwl9CisJaWYgKCFiZGV2LT5iZF9vcGVuZXJzKSB7CisJCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gZGlzay0+Zm9wcy0+b3duZXI7CisKKwkJcHV0X2Rpc2soZGlzayk7CisJCW1vZHVsZV9wdXQob3duZXIpOworCisJCWlmIChiZGV2LT5iZF9jb250YWlucyAhPSBiZGV2KSB7CisJCQlrb2JqZWN0X3B1dCgmYmRldi0+YmRfcGFydC0+a29iaik7CisJCQliZGV2LT5iZF9wYXJ0ID0gTlVMTDsKKwkJfQorCQliZGV2LT5iZF9kaXNrID0gTlVMTDsKKwkJYmRldi0+YmRfaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKKwkJaWYgKGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpCisJCQl2aWN0aW0gPSBiZGV2LT5iZF9jb250YWluczsKKwkJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7CisJYmRwdXQoYmRldik7CisJaWYgKHZpY3RpbSkKKwkJX19ibGtkZXZfcHV0KHZpY3RpbSwgMSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGJsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlyZXR1cm4gX19ibGtkZXZfcHV0KGJkZXYsIDApOworfQorRVhQT1JUX1NZTUJPTChibGtkZXZfcHV0KTsKKwogc3RhdGljIGludCBibGtkZXZfY2xvc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gSV9CREVWKGZpbHAtPmZfbWFwcGluZy0+aG9zdCk7CmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IGY2NWVmODguLmQxZjFiNTQgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgpAQCAtNDUyLDYgKzQ1Myw3IEBACiAJCQkgICAgICAgYmRldm5hbWUoYmgtPmJfYmRldiwgYikpOwogCQl9CiAJCXNldF9iaXQoQVNfRUlPLCAmcGFnZS0+bWFwcGluZy0+ZmxhZ3MpOworCQlzZXRfYnVmZmVyX3dyaXRlX2lvX2Vycm9yKGJoKTsKIAkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCX0KQEAgLTU3MSw2ICs1NzMsMTAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3JlbW92ZV9hc3NvY19xdWV1ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewogCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCVdBUk5fT04oIWJoLT5iX2Fzc29jX21hcCk7CisJaWYgKGJ1ZmZlcl93cml0ZV9pb19lcnJvcihiaCkpCisJCXNldF9iaXQoQVNfRUlPLCAmYmgtPmJfYXNzb2NfbWFwLT5mbGFncyk7CisJYmgtPmJfYXNzb2NfbWFwID0gTlVMTDsKIH0KIAogaW50IGlub2RlX2hhc19idWZmZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC02NjksNiArNjc1LDcgQEAKIAkJc3Bpbl9sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIAkJbGlzdF9tb3ZlX3RhaWwoJmJoLT5iX2Fzc29jX2J1ZmZlcnMsCiAJCQkJJm1hcHBpbmctPnByaXZhdGVfbGlzdCk7CisJCWJoLT5iX2Fzc29jX21hcCA9IG1hcHBpbmc7CiAJCXNwaW5fdW5sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIAl9CiB9CkBAIC03MTgsMjAgKzcyNSwyMSBAQAogCX0KIAlzcGluX3VubG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIAotCWlmICghVGVzdFNldFBhZ2VEaXJ0eShwYWdlKSkgewotCQl3cml0ZV9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQkJaWYgKHBhZ2UtPm1hcHBpbmcpIHsJLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLwotCQkJaWYgKG1hcHBpbmdfY2FwX2FjY291bnRfZGlydHkobWFwcGluZykpCi0JCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOwotCQkJcmFkaXhfdHJlZV90YWdfc2V0KCZtYXBwaW5nLT5wYWdlX3RyZWUsCi0JCQkJCQlwYWdlX2luZGV4KHBhZ2UpLAotCQkJCQkJUEFHRUNBQ0hFX1RBR19ESVJUWSk7CisJaWYgKFRlc3RTZXRQYWdlRGlydHkocGFnZSkpCisJCXJldHVybiAwOworCisJd3JpdGVfbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJaWYgKHBhZ2UtPm1hcHBpbmcpIHsJLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLworCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgeworCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOworCQkJdGFza19pb19hY2NvdW50X3dyaXRlKFBBR0VfQ0FDSEVfU0laRSk7CiAJCX0KLQkJd3JpdGVfdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQkJX19tYXJrX2lub2RlX2RpcnR5KG1hcHBpbmctPmhvc3QsIElfRElSVFlfUEFHRVMpOwotCQlyZXR1cm4gMTsKKwkJcmFkaXhfdHJlZV90YWdfc2V0KCZtYXBwaW5nLT5wYWdlX3RyZWUsCisJCQkJcGFnZV9pbmRleChwYWdlKSwgUEFHRUNBQ0hFX1RBR19ESVJUWSk7CiAJfQotCXJldHVybiAwOworCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJX19tYXJrX2lub2RlX2RpcnR5KG1hcHBpbmctPmhvc3QsIElfRElSVFlfUEFHRVMpOworCXJldHVybiAxOwogfQogRVhQT1JUX1NZTUJPTChfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMpOwogCkBAIC03NjUsNyArNzczLDcgQEAKIAlzcGluX2xvY2sobG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CiAJCWJoID0gQkhfRU5UUlkobGlzdC0+bmV4dCk7Ci0JCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCQlfX3JlbW92ZV9hc3NvY19xdWV1ZShiaCk7CiAJCWlmIChidWZmZXJfZGlydHkoYmgpIHx8IGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CiAJCQlsaXN0X2FkZCgmYmgtPmJfYXNzb2NfYnVmZmVycywgJnRtcCk7CiAJCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgewpAQCAtNzg2LDcgKzc5NCw3IEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcCkpIHsKIAkJYmggPSBCSF9FTlRSWSh0bXAucHJldik7Ci0JCV9fcmVtb3ZlX2Fzc29jX3F1ZXVlKGJoKTsKKwkJbGlzdF9kZWxfaW5pdCgmYmgtPmJfYXNzb2NfYnVmZmVycyk7CiAJCWdldF9iaChiaCk7CiAJCXNwaW5fdW5sb2NrKGxvY2spOwogCQl3YWl0X29uX2J1ZmZlcihiaCk7CkBAIC0xMTY3LDYgKzExNzUsNyBAQAogCiAJCXNwaW5fbG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CiAJCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCQliaC0+Yl9hc3NvY19tYXAgPSBOVUxMOwogCQlzcGluX3VubG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CiAJfQogCV9fYnJlbHNlKGJoKTsKQEAgLTI4NDQsOCArMjg1MywxMyBAQAogCQkgKiBjb3VsZCBlbmNvdW50ZXIgYSBub24tdXB0b2RhdGUgcGFnZSwgd2hpY2ggaXMgdW5yZXNvbHZhYmxlLgogCQkgKiBUaGlzIG9ubHkgYXBwbGllcyBpbiB0aGUgcmFyZSBjYXNlIHdoZXJlIHRyeV90b19mcmVlX2J1ZmZlcnMKIAkJICogc3VjY2VlZHMgYnV0IHRoZSBwYWdlIGlzIG5vdCBmcmVlZC4KKwkJICoKKwkJICogQWxzbywgZHVyaW5nIHRydW5jYXRlLCBkaXNjYXJkX2J1ZmZlciB3aWxsIGhhdmUgbWFya2VkIGFsbAorCQkgKiB0aGUgcGFnZSdzIGJ1ZmZlcnMgY2xlYW4uICBXZSBkaXNjb3ZlciB0aGF0IGhlcmUgYW5kIGNsZWFuCisJCSAqIHRoZSBwYWdlIGFsc28uCiAJCSAqLwotCQljbGVhcl9wYWdlX2RpcnR5KHBhZ2UpOworCQlpZiAodGVzdF9jbGVhcl9wYWdlX2RpcnR5KHBhZ2UpKQorCQkJdGFza19pb19hY2NvdW50X2NhbmNlbGxlZF93cml0ZShQQUdFX0NBQ0hFX1NJWkUpOwogCX0KIG91dDoKIAlpZiAoYnVmZmVyc190b19mcmVlKSB7CkBAIC0yOTAxLDcgKzI5MTUsNyBAQAogLyoKICAqIEJ1ZmZlci1oZWFkIGFsbG9jYXRpb24KICAqLwotc3RhdGljIGttZW1fY2FjaGVfdCAqYmhfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiaF9jYWNoZXA7CiAKIC8qCiAgKiBPbmNlIHRoZSBudW1iZXIgb2YgYmgncyBpbiB0aGUgbWFjaGluZSBleGNlZWRzIHRoaXMgbGV2ZWwsIHdlIHN0YXJ0CkBAIC0yOTU0LDcgKzI5NjgsNyBAQAogRVhQT1JUX1NZTUJPTChmcmVlX2J1ZmZlcl9oZWFkKTsKIAogc3RhdGljIHZvaWQKLWluaXRfYnVmZmVyX2hlYWQodm9pZCAqZGF0YSwga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbml0X2J1ZmZlcl9oZWFkKHZvaWQgKmRhdGEsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CiAJCQkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CkBAIC0yOTY1LDcgKzI5NzksNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIHZvaWQgYnVmZmVyX2V4aXRfY3B1KGludCBjcHUpCiB7CiAJaW50IGk7CkBAIC0yOTg3LDcgKzMwMDAsNiBAQAogCQlidWZmZXJfZXhpdF9jcHUoKHVuc2lnbmVkIGxvbmcpaGNwdSk7CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAogdm9pZCBfX2luaXQgYnVmZmVyX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvQ0hBTkdFUyBiL2ZzL2NpZnMvQ0hBTkdFUwppbmRleCAxZWI5YTJlLi4zNTM5ZDZlIDEwMDY0NAotLS0gYS9mcy9jaWZzL0NIQU5HRVMKKysrIGIvZnMvY2lmcy9DSEFOR0VTCkBAIC0xLDYgKzEsMTIgQEAKIFZlcnNpb24gMS40NgogLS0tLS0tLS0tLS0tCiBTdXBwb3J0IGRlZXAgdHJlZSBtb3VudHMuICBCZXR0ZXIgc3VwcG9ydCBPUy8yLCBXaW45eCAoRE9TKSB0aW1lIHN0YW1wcy4KK0FsbG93IG51bGwgdXNlciB0byBiZSBzcGVjaWZpZWQgb24gbW91bnQgKCJ1c2VybmFtZT0iKS4gRG8gbm90IHJldHVybgorRUlOVkFMIG9uIHJlYWRkaXIgd2hlbiBmaWxsZGlyIGZhaWxzIGR1ZSB0byBvdmVyd3JpdHRlbiBibG9ja3NpemUKKyhmaXhlcyBGQyBwcm9ibGVtKS4gIFJldHVybiBlcnJvciBpbiByZW5hbWUgMm5kIGF0dGVtcHQgcmV0cnkgKGllIHJlcG9ydAoraWYgcmVuYW1lIGJ5IGhhbmRsZSBhbHNvIGZhaWxzLCBhZnRlciByZW5hbWUgYnkgcGF0aCBmYWlscywgd2Ugd2VyZQorbm90IHJlcG9ydGluZyB3aGV0aGVyIHRoZSByZXRyeSB3b3JrZWQgb3Igbm90KS4gRml4IE5UTE12MiB0bword29yayB0byBXaW5kb3dzIHNlcnZlcnMgKG1vdW50IHdpdGggb3B0aW9uICJzZWM9bnRsbXYyIikuCiAKIFZlcnNpb24gMS40NQogLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMgYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKaW5kZXggNGJjMjUwYi4uZmRlZGE1MSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCisrKyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwpAQCAtMzcyLDggKzM3MiwxMCBAQAogCWJ1Zi0+dGltZSA9IGNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKENVUlJFTlRfVElNRSkpOwogCWdldF9yYW5kb21fYnl0ZXMoJmJ1Zi0+Y2xpZW50X2NoYWwsIHNpemVvZihidWYtPmNsaWVudF9jaGFsKSk7CiAJYnVmLT5yZXNlcnZlZDIgPSAwOwotCWJ1Zi0+bmFtZXNbMF0udHlwZSA9IDA7CisJYnVmLT5uYW1lc1swXS50eXBlID0gY3B1X3RvX2xlMTYoTlRMTVNTUF9ET01BSU5fVFlQRSk7CiAJYnVmLT5uYW1lc1swXS5sZW5ndGggPSAwOworCWJ1Zi0+bmFtZXNbMV0udHlwZSA9IDA7CisJYnVmLT5uYW1lc1sxXS5sZW5ndGggPSAwOwogCiAJLyogY2FsY3VsYXRlIGJ1Zi0+bnRsbXYyX2hhc2ggKi8KIAlyYyA9IGNhbGNfbnRsbXYyX2hhc2goc2VzLCBubHNfY3ApOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggODQ5NzZjZC4uMTBjOTAyOSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlICJjaWZzZnMuaCIKICNpbmNsdWRlICJjaWZzcGR1LmgiCiAjZGVmaW5lIERFQ0xBUkVfR0xPQkFMU19IRVJFCkBAIC04MSw3ICs4Miw3IEBACiBleHRlcm4gbWVtcG9vbF90ICpjaWZzX3JlcV9wb29scDsKIGV4dGVybiBtZW1wb29sX3QgKmNpZnNfbWlkX3Bvb2xwOwogCi1leHRlcm4ga21lbV9jYWNoZV90ICpjaWZzX29wbG9ja19jYWNoZXA7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmNpZnNfb3Bsb2NrX2NhY2hlcDsKIAogc3RhdGljIGludAogY2lmc19yZWFkX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsCkBAIC0yMzIsMTEgKzIzMywxMSBAQAogCQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKIH0KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqY2lmc19pbm9kZV9jYWNoZXA7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpjaWZzX3JlcV9jYWNoZXA7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpjaWZzX21pZF9jYWNoZXA7Ci1rbWVtX2NhY2hlX3QgKmNpZnNfb3Bsb2NrX2NhY2hlcDsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmNpZnNfc21fcmVxX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY2lmc19pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmNpZnNfcmVxX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY2lmc19taWRfY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUgKmNpZnNfb3Bsb2NrX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY2lmc19zbV9yZXFfY2FjaGVwOwogbWVtcG9vbF90ICpjaWZzX3NtX3JlcV9wb29scDsKIG1lbXBvb2xfdCAqY2lmc19yZXFfcG9vbHA7CiBtZW1wb29sX3QgKmNpZnNfbWlkX3Bvb2xwOwpAQCAtMjQ1LDcgKzI0Niw3IEBACiBjaWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNfaW5vZGU7Ci0JY2lmc19pbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoY2lmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwljaWZzX2lub2RlID0ga21lbV9jYWNoZV9hbGxvYyhjaWZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaWZzX2lub2RlKQogCQlyZXR1cm4gTlVMTDsKIAljaWZzX2lub2RlLT5jaWZzQXR0cnMgPSAweDIwOwkvKiBkZWZhdWx0ICovCkBAIC00OTcsNyArNDk4LDcgQEAKIHN0YXRpYyBzc2l6ZV90IGNpZnNfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNzaXplX3Qgd3JpdHRlbjsKIAogCXdyaXR0ZW4gPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywgcG9zKTsKQEAgLTUxMCw3ICs1MTEsNyBAQAogewogCS8qIG9yaWdpbiA9PSBTRUVLX0VORCA9PiB3ZSBtdXN0IHJldmFsaWRhdGUgdGhlIGNhY2hlZCBmaWxlIGxlbmd0aCAqLwogCWlmIChvcmlnaW4gPT0gU0VFS19FTkQpIHsKLQkJaW50IHJldHZhbCA9IGNpZnNfcmV2YWxpZGF0ZShmaWxlLT5mX2RlbnRyeSk7CisJCWludCByZXR2YWwgPSBjaWZzX3JldmFsaWRhdGUoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJCWlmIChyZXR2YWwgPCAwKQogCQkJcmV0dXJuIChsb2ZmX3QpcmV0dmFsOwogCX0KQEAgLTY2OCw3ICs2NjksNyBAQAogfTsKIAogc3RhdGljIHZvaWQKLWNpZnNfaW5pdF9vbmNlKHZvaWQgKmlub2RlLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitjaWZzX2luaXRfb25jZSh2b2lkICppbm9kZSwgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNpID0gaW5vZGU7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3BkdS5oIGIvZnMvY2lmcy9jaWZzcGR1LmgKaW5kZXggNmRmOWRhZC4uMDY4ZWY1MWUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3BkdS5oCisrKyBiL2ZzL2NpZnMvY2lmc3BkdS5oCkBAIC01ODAsNiArNTgwLDEyIEBACiAKIC8qIGZvcm1hdCBvZiBOTFRNdjIgUmVzcG9uc2UgaWUgImNhc2Ugc2Vuc2l0aXZlIHBhc3N3b3JkIiBoYXNoIHdoZW4gTlRMTXYyICovCiAKKyNkZWZpbmUgTlRMTVNTUF9TRVJWRVJfVFlQRQkxCisjZGVmaW5lIE5UTE1TU1BfRE9NQUlOX1RZUEUJMgorI2RlZmluZSBOVExNU1NQX0ZRX0RPTUFJTl9UWVBFCTMKKyNkZWZpbmUgTlRMTVNTUF9ETlNfRE9NQUlOX1RZUEUJNAorI2RlZmluZSBOVExNU1NQX0ROU19QQVJFTlRfVFlQRQk1CisKIHN0cnVjdCBudGxtc3NwMl9uYW1lIHsKIAlfX2xlMTYgdHlwZTsKIAlfX2xlMTYgbGVuZ3RoOwpAQCAtNTkzLDcgKzU5OSw3IEBACiAJX19sZTY0ICB0aW1lOwogCV9fdTY0ICBjbGllbnRfY2hhbDsgLyogcmFuZG9tICovCiAJX191MzIgIHJlc2VydmVkMjsKLQlzdHJ1Y3QgbnRsbXNzcDJfbmFtZSBuYW1lc1sxXTsKKwlzdHJ1Y3QgbnRsbXNzcDJfbmFtZSBuYW1lc1syXTsKIAkvKiBhcnJheSBvZiBuYW1lIGVudHJpZXMgY291bGQgZm9sbG93IGVuZGluZyBpbiBtaW5pbXVtIDQgYnl0ZSBzdHJ1Y3QgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3NtYi5jIGIvZnMvY2lmcy9jaWZzc21iLmMKaW5kZXggNWRjNWE5Ni4uNDcyZTMzZSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzc21iLmMKKysrIGIvZnMvY2lmcy9jaWZzc21iLmMKQEAgLTM5OSw2ICszOTksNyBAQAogCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKiBzZXJ2ZXI7CiAJdTE2IGNvdW50OwogCXVuc2lnbmVkIGludCBzZWNGbGFnczsKKwl1MTYgZGlhbGVjdDsKIAogCWlmKHNlcy0+c2VydmVyKQogCQlzZXJ2ZXIgPSBzZXMtPnNlcnZlcjsKQEAgLTQzOCw5ICs0MzksMTAgQEAKIAlpZiAocmMgIT0gMCkgCiAJCWdvdG8gbmVnX2Vycl9leGl0OwogCi0JY0ZZSSgxLCgiRGlhbGVjdDogJWQiLCBwU01Cci0+RGlhbGVjdEluZGV4KSk7CisJZGlhbGVjdCA9IGxlMTZfdG9fY3B1KHBTTUJyLT5EaWFsZWN0SW5kZXgpOworCWNGWUkoMSwoIkRpYWxlY3Q6ICVkIiwgZGlhbGVjdCkpOwogCS8qIENoZWNrIHdjdCA9IDEgZXJyb3IgY2FzZSAqLwotCWlmKChwU01Cci0+aGRyLldvcmRDb3VudCA8IDEzKSB8fCAocFNNQnItPkRpYWxlY3RJbmRleCA9PSBCQURfUFJPVCkpIHsKKwlpZigocFNNQnItPmhkci5Xb3JkQ291bnQgPCAxMykgfHwgKGRpYWxlY3QgPT0gQkFEX1BST1QpKSB7CiAJCS8qIGNvcmUgcmV0dXJucyB3Y3QgPSAxLCBidXQgd2UgZG8gbm90IGFzayBmb3IgY29yZSAtIG90aGVyd2lzZQogCQlzbWFsbCB3Y3QganVzdCBjb21lcyB3aGVuIGRpYWxlY3QgaW5kZXggaXMgLTEgaW5kaWNhdGluZyB3ZSAKIAkJY291bGQgbm90IG5lZ290aWF0ZSBhIGNvbW1vbiBkaWFsZWN0ICovCkBAIC00NDgsOCArNDUwLDggQEAKIAkJZ290byBuZWdfZXJyX2V4aXQ7CiAjaWZkZWYgQ09ORklHX0NJRlNfV0VBS19QV19IQVNIIAogCX0gZWxzZSBpZigocFNNQnItPmhkci5Xb3JkQ291bnQgPT0gMTMpCi0JCQkmJiAoKHBTTUJyLT5EaWFsZWN0SW5kZXggPT0gTEFOTUFOX1BST1QpCi0JCQkJfHwgKHBTTUJyLT5EaWFsZWN0SW5kZXggPT0gTEFOTUFOMl9QUk9UKSkpIHsKKwkJCSYmICgoZGlhbGVjdCA9PSBMQU5NQU5fUFJPVCkKKwkJCQl8fCAoZGlhbGVjdCA9PSBMQU5NQU4yX1BST1QpKSkgewogCQlfX3MxNiB0bXA7CiAJCXN0cnVjdCBsYW5tYW5fbmVnX3JzcCAqIHJzcCA9IChzdHJ1Y3QgbGFubWFuX25lZ19yc3AgKilwU01CcjsKIApAQCAtMjk0Myw3ICsyOTQ1LDcgQEAKIAkJdHMudHZfbnNlYyA9IDA7CiAJCXRzLnR2X3NlYyA9IHRpbWU7CiAJCS8qIGRlY29kZSB0aW1lIGZpZWxkcyAqLwotCQlwRmluZm8tPkNoYW5nZVRpbWUgPSBjaWZzX1VuaXhUaW1lVG9OVCh0cyk7CisJCXBGaW5mby0+Q2hhbmdlVGltZSA9IGNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKHRzKSk7CiAJCXBGaW5mby0+TGFzdFdyaXRlVGltZSA9IHBGaW5mby0+Q2hhbmdlVGltZTsKIAkJcEZpbmZvLT5MYXN0QWNjZXNzVGltZSA9IDA7CiAJCXBGaW5mby0+QWxsb2NhdGlvblNpemUgPQpAQCAtNDg3NCw3ICs0ODc2LDcgQEAKIAl9IGVsc2UgewogCQkvKiBBZGQgZmlsZSB0byBvdXRzdGFuZGluZyByZXF1ZXN0cyAqLwogCQkvKiBCQiBjaGFuZ2UgdG8ga21lbSBjYWNoZSBhbGxvYyAqLwkKLQkJZG5vdGlmeV9yZXEgPSAoc3RydWN0IGRpcl9ub3RpZnlfcmVxICopIGttYWxsb2MoCisJCWRub3RpZnlfcmVxID0ga21hbGxvYygKIAkJCQkJCXNpemVvZihzdHJ1Y3QgZGlyX25vdGlmeV9yZXEpLAogCQkJCQkJIEdGUF9LRVJORUwpOwogCQlpZihkbm90aWZ5X3JlcSkgewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jb25uZWN0LmMgYi9mcy9jaWZzL2Nvbm5lY3QuYwppbmRleCA0MDkzZDUzLi4yY2FjYTA2IDEwMDY0NAotLS0gYS9mcy9jaWZzL2Nvbm5lY3QuYworKysgYi9mcy9jaWZzL2Nvbm5lY3QuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSAiY2lmc3BkdS5oIgpAQCAtODIyLDEwICs4MjMsMTMgQEAKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm91c2VyX3hhdHRyIiwxMikgPT0gMCkgewogCQkJdm9sLT5ub194YXR0ciA9IDE7CiAJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInVzZXIiLCA0KSA9PSAwKSB7Ci0JCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCWlmICghdmFsdWUpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJICAgICAgICJDSUZTOiBpbnZhbGlkIG9yIG1pc3NpbmcgdXNlcm5hbWVcbiIpOwogCQkJCXJldHVybiAxOwkvKiBuZWVkc19hcmc7ICovCisJCQl9IGVsc2UgaWYoISp2YWx1ZSkgeworCQkJCS8qIG51bGwgdXNlciwgaWUgYW5vbnltb3VzLCBhdXRoZW50aWNhdGlvbiAqLworCQkJCXZvbC0+bnVsbGF1dGggPSAxOwogCQkJfQogCQkJaWYgKHN0cm5sZW4odmFsdWUsIDIwMCkgPCAyMDApIHsKIAkJCQl2b2wtPnVzZXJuYW1lID0gdmFsdWU7CkBAIC0xNjQyLDYgKzE2NDYsOCBAQAogCQkvKiBCQiBmaXhtZSBwYXJzZSBmb3IgZG9tYWluIG5hbWUgaGVyZSAqLwogCQljRllJKDEsICgiVXNlcm5hbWU6ICVzICIsIHZvbHVtZV9pbmZvLnVzZXJuYW1lKSk7CiAKKwl9IGVsc2UgaWYgKHZvbHVtZV9pbmZvLm51bGxhdXRoKSB7CisJCWNGWUkoMSwoIm51bGwgdXNlciIpKTsKIAl9IGVsc2UgewogCQljaWZzZXJyb3IoIk5vIHVzZXJuYW1lIHNwZWNpZmllZCIpOwogICAgICAgICAvKiBJbiB1c2Vyc3BhY2UgbW91bnQgaGVscGVyIHdlIGNhbiBnZXQgdXNlciBuYW1lIGZyb20gYWx0ZXJuYXRlCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZjbnRsLmMgYi9mcy9jaWZzL2ZjbnRsLmMKaW5kZXggZDkxYTNkNC4uZGExMmI0OCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9mY250bC5jCisrKyBiL2ZzL2NpZnMvZmNudGwuYwpAQCAtODMsMTAgKzgzLDEwIEBACiAJCXJldHVybiAwOwogCiAJeGlkID0gR2V0WGlkKCk7Ci0JY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCXBUY29uID0gY2lmc19zYi0+dGNvbjsKIAotCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZmlsZS0+Zl9kZW50cnkpOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAKIAlpZihmdWxsX3BhdGggPT0gTlVMTCkgewogCQlyYyA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IDk3NmE2OTEuLjBmMDVjYWIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSAiY2lmc2ZzLmgiCkBAIC0xMjIsMzQgKzEyMywzNCBAQAogCS8qIGlmIG5vdCBvcGxvY2tlZCwgaW52YWxpZGF0ZSBpbm9kZSBwYWdlcyBpZiBtdGltZSBvciBmaWxlCiAJICAgc2l6ZSBjaGFuZ2VkICovCiAJdGVtcCA9IGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KGJ1Zi0+TGFzdFdyaXRlVGltZSkpOwotCWlmICh0aW1lc3BlY19lcXVhbCgmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXRpbWUsICZ0ZW1wKSAmJiAKLQkJCSAgIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zaXplID09IAorCWlmICh0aW1lc3BlY19lcXVhbCgmZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZSwgJnRlbXApICYmCisJCQkgICAoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplID09CiAJCQkgICAgKGxvZmZfdClsZTY0X3RvX2NwdShidWYtPkVuZE9mRmlsZSkpKSB7CiAJCWNGWUkoMSwgKCJpbm9kZSB1bmNoYW5nZWQgb24gc2VydmVyIikpOwogCX0gZWxzZSB7Ci0JCWlmIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKSB7CisJCWlmIChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpIHsKIAkJLyogQkIgbm8gbmVlZCB0byBsb2NrIGlub2RlIHVudGlsIGFmdGVyIGludmFsaWRhdGUKIAkJICAgc2luY2UgbmFtZWkgY29kZSBzaG91bGQgYWxyZWFkeSBoYXZlIGl0IGxvY2tlZD8gKi8KLQkJCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CiAJCX0KIAkJY0ZZSSgxLCAoImludmFsaWRhdGluZyByZW1vdGUgaW5vZGUgc2luY2Ugb3BlbiBkZXRlY3RlZCBpdCAiCiAJCQkgImNoYW5nZWQiKSk7Ci0JCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJfQogCiBjbGllbnRfY2FuX2NhY2hlOgogCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKLQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvX3VuaXgoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKIAkJCWZ1bGxfcGF0aCwgaW5vZGUtPmlfc2IsIHhpZCk7CiAJZWxzZQotCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm8oJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm8oJmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsCiAJCQlmdWxsX3BhdGgsIGJ1ZiwgaW5vZGUtPmlfc2IsIHhpZCk7CiAKIAlpZiAoKCpvcGxvY2sgJiAweEYpID09IE9QTE9DS19FWENMVVNJVkUpIHsKIAkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVBbGwgPSBUUlVFOwogCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBUUlVFOwogCQljRllJKDEsICgiRXhjbHVzaXZlIE9wbG9jayBncmFudGVkIG9uIGlub2RlICVwIiwKLQkJCSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkpOworCQkJIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKTsKIAl9IGVsc2UgaWYgKCgqb3Bsb2NrICYgMHhGKSA9PSBPUExPQ0tfUkVBRCkKIAkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKIApAQCAtMTc4LDcgKzE3OSw3IEBACiAKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQ1JFQVQpIHsKIAkJLyogc2VhcmNoIGlub2RlIGZvciB0aGlzIGZpbGUgYW5kIGZpbGwgaW4gZmlsZS0+cHJpdmF0ZV9kYXRhICovCi0JCXBDaWZzSW5vZGUgPSBDSUZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCQlwQ2lmc0lub2RlID0gQ0lGU19JKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCQlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnBDaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCkgewogCQkJcENpZnNGaWxlID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjaWZzRmlsZUluZm8sCkBAIC0yMDYsNyArMjA3LDcgQEAKIAkJfQogCX0KIAotCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZmlsZS0+Zl9kZW50cnkpOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CiAJCUZyZWVYaWQoeGlkKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yOTEsNyArMjkyLDcgQEAKIAl3cml0ZV9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKIAlsaXN0X2FkZCgmcENpZnNGaWxlLT50bGlzdCwgJnBUY29uLT5vcGVuRmlsZUxpc3QpOwogCi0JcENpZnNJbm9kZSA9IENJRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJcENpZnNJbm9kZSA9IENJRlNfSShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAocENpZnNJbm9kZSkgewogCQlyYyA9IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoaW5vZGUsIGZpbGUsIHBDaWZzSW5vZGUsCiAJCQkJCSAgICBwQ2lmc0ZpbGUsIHBUY29uLApAQCAtMzY2LDcgKzM2Nyw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKSB7CisJaWYgKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gTlVMTCkgewogCQl1cCgmcENpZnNGaWxlLT5maF9zZW0pOwogCQljRllJKDEsICgiZmFpbGVkIGZpbGUgcmVvcGVuLCBubyB2YWxpZCBuYW1lIGlmIGRlbnRyeSBmcmVlZCIpKTsKIAkJRnJlZVhpZCh4aWQpOwpAQCAtMzc4LDcgKzM3OSw3IEBACiAgICB0aG9zZSB0aGF0IGFscmVhZHkgaGF2ZSB0aGUgcmVuYW1lIHNlbSBjYW4gZW5kIHVwIGNhdXNpbmcgd3JpdGVwYWdlCiAgICB0byBnZXQgY2FsbGVkIGFuZCBpZiB0aGUgc2VydmVyIHdhcyBkb3duIHRoYXQgbWVhbnMgd2UgZW5kIHVwIGhlcmUsCiAgICBhbmQgd2UgY2FuIG5ldmVyIHRlbGwgaWYgdGhlIGNhbGxlciBhbHJlYWR5IGhhcyB0aGUgcmVuYW1lX3NlbSAqLwotCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZmlsZS0+Zl9kZW50cnkpOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CiAJCXVwKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CiAJCUZyZWVYaWQoeGlkKTsKQEAgLTQ0NCw3ICs0NDUsNyBAQAogCQkJCXBDaWZzSW5vZGUtPmNsaWVudENhbkNhY2hlQWxsID0gVFJVRTsKIAkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBUUlVFOwogCQkJCWNGWUkoMSwgKCJFeGNsdXNpdmUgT3Bsb2NrIGdyYW50ZWQgb24gaW5vZGUgJXAiLAotCQkJCQkgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKTsKKwkJCQkJIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKTsKIAkJCX0gZWxzZSBpZiAoKG9wbG9jayAmIDB4RikgPT0gT1BMT0NLX1JFQUQpIHsKIAkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBUUlVFOwogCQkJCXBDaWZzSW5vZGUtPmNsaWVudENhbkNhY2hlQWxsID0gRkFMU0U7CkBAIC00OTIsMTAgKzQ5MywxNCBAQAogCQkJCQl0aGUgc3RydWN0IHdvdWxkIGJlIGluIGVhY2ggb3BlbiBmaWxlLAogCQkJCQlidXQgdGhpcyBzaG91bGQgZ2l2ZSBlbm91Z2ggdGltZSB0byAKIAkJCQkJY2xlYXIgdGhlIHNvY2tldCAqLwotCQkJCQljRVJST1IoMSwoImNsb3NlIHdpdGggcGVuZGluZyB3cml0ZXMiKSk7CisjaWZkZWYgQ09ORklHX0NJRlNfREVCVUcyCisJCQkJCWNGWUkoMSwoImNsb3NlIGRlbGF5LCB3cml0ZSBwZW5kaW5nIikpOworI2VuZGlmIC8qIERFQlVHMiAqLwogCQkJCQltc2xlZXAodGltZW91dCk7CiAJCQkJCXRpbWVvdXQgKj0gNDsKLQkJCQl9IAorCQkJCX0KKwkJCQlpZihhdG9taWNfcmVhZCgmcFNNQkZpbGUtPndydFBlbmRpbmcpKQorCQkJCQljRVJST1IoMSwoImNsb3NlIHdpdGggcGVuZGluZyB3cml0ZXMiKSk7CiAJCQkJcmMgPSBDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwKIAkJCQkJCSAgcFNNQkZpbGUtPm5ldGZpZCk7CiAJCQl9CkBAIC01NDcsNyArNTUyLDcgQEAKIAogCWlmIChwQ0ZpbGVTdHJ1Y3QpIHsKIAkJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247Ci0JCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwkJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CiAKIAkJcFRjb24gPSBjaWZzX3NiLT50Y29uOwogCkBAIC02NjAsNyArNjY1LDcgQEAKIAl9IGVsc2UKIAkJY0ZZSSgxLCAoIlVua25vd24gdHlwZSBvZiBsb2NrIikpOwogCi0JY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCXBUY29uID0gY2lmc19zYi0+dGNvbjsKIAogCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgewpAQCAtNzg3LDEwICs3OTIsMTAgQEAKIAlpbnQgeGlkLCBsb25nX29wOwogCXN0cnVjdCBjaWZzRmlsZUluZm8gKm9wZW5fZmlsZTsKIAotCWlmIChmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCWlmIChmaWxlLT5mX3BhdGguZGVudHJ5ID09IE5VTEwpCiAJCXJldHVybiAtRUJBREY7CiAKLQljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CiAJaWYgKGNpZnNfc2IgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQkFERjsKIApAQCAtNzk4LDcgKzgwMyw3IEBACiAKIAkvKiBjRllJKDEsCiAJICAgKCIgd3JpdGUgJWQgYnl0ZXMgdG8gb2Zmc2V0ICVsbGQgb2YgJXMiLCB3cml0ZV9zaXplLAotCSAgICpwb2Zmc2V0LCBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpKTsgKi8KKwkgICAqcG9mZnNldCwgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUpKTsgKi8KIAogCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQkFERjsKQEAgLTgwNiwxMiArODExLDEyIEBACiAJCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopIGZpbGUtPnByaXZhdGVfZGF0YTsKIAkKIAl4aWQgPSBHZXRYaWQoKTsKLQlpZiAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUgPT0gTlVMTCkgeworCWlmIChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlID09IE5VTEwpIHsKIAkJRnJlZVhpZCh4aWQpOwogCQlyZXR1cm4gLUVCQURGOwogCX0KIAotCWlmICgqcG9mZnNldCA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJaWYgKCpwb2Zmc2V0ID4gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplKQogCQlsb25nX29wID0gMjsgLyogd3JpdGVzIHBhc3QgZW5kIG9mIGZpbGUgY2FuIHRha2UgYSBsb25nIHRpbWUgKi8KIAllbHNlCiAJCWxvbmdfb3AgPSAxOwpAQCAtODM2LDggKzg0MSw4IEBACiAJCQkJCXJldHVybiAtRUJBREY7CiAJCQl9CiAJCQlpZiAob3Blbl9maWxlLT5pbnZhbGlkSGFuZGxlKSB7Ci0JCQkJaWYgKChmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKSB8fAotCQkJCSAgICAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUgPT0gTlVMTCkpIHsKKwkJCQlpZiAoKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gTlVMTCkgfHwKKwkJCQkgICAgKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUgPT0gTlVMTCkpIHsKIAkJCQkJRnJlZVhpZCh4aWQpOwogCQkJCQlyZXR1cm4gdG90YWxfd3JpdHRlbjsKIAkJCQl9CkBAIC04NDUsNyArODUwLDcgQEAKIAkJCQkgICBmaWxlbWFwX2ZkYXRhd2FpdCBmcm9tIGhlcmUgc28gdGVsbAogCQkJCSAgIHJlb3Blbl9maWxlIG5vdCB0byBmbHVzaCBkYXRhIHRvIHNlcnZlcgogCQkJCSAgIG5vdyAqLwotCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQlyYyA9IGNpZnNfcmVvcGVuX2ZpbGUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKIAkJCQkJZmlsZSwgRkFMU0UpOwogCQkJCWlmIChyYyAhPSAwKQogCQkJCQlicmVhazsKQEAgLTg3NCwxNyArODc5LDE3IEBACiAJY2lmc19zdGF0c19ieXRlc193cml0dGVuKHBUY29uLCB0b3RhbF93cml0dGVuKTsKIAogCS8qIHNpbmNlIHRoZSB3cml0ZSBtYXkgaGF2ZSBibG9ja2VkIGNoZWNrIHRoZXNlIHBvaW50ZXJzIGFnYWluICovCi0JaWYgKGZpbGUtPmZfZGVudHJ5KSB7Ci0JCWlmIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgewotCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWlmIChmaWxlLT5mX3BhdGguZGVudHJ5KSB7CisJCWlmIChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSB7CisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAkJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPQogCQkJCWN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CiAJCQlpZiAodG90YWxfd3JpdHRlbiA+IDApIHsKLQkJCQlpZiAoKnBvZmZzZXQgPiBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zaXplKQotCQkJCQlpX3NpemVfd3JpdGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQkJaWYgKCpwb2Zmc2V0ID4gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplKQorCQkJCQlpX3NpemVfd3JpdGUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKIAkJCQkJKnBvZmZzZXQpOwogCQkJfQotCQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAkJfQogCX0KIAlGcmVlWGlkKHhpZCk7CkBAIC05MDIsMTcgKzkwNywxNyBAQAogCWludCB4aWQsIGxvbmdfb3A7CiAJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOwogCi0JaWYgKGZpbGUtPmZfZGVudHJ5ID09IE5VTEwpCisJaWYgKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FQkFERjsKIAotCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3NiKTsKIAlpZiAoY2lmc19zYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVCQURGOwogCiAJcFRjb24gPSBjaWZzX3NiLT50Y29uOwogCiAJY0ZZSSgxLCgid3JpdGUgJXpkIGJ5dGVzIHRvIG9mZnNldCAlbGxkIG9mICVzIiwgd3JpdGVfc2l6ZSwKLQkgICAqcG9mZnNldCwgZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKSk7CisJICAgKnBvZmZzZXQsIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKSk7CiAKIAlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpCiAJCXJldHVybiAtRUJBREY7CkBAIC05MjAsMTIgKzkyNSwxMiBAQAogCQlvcGVuX2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKIAkKIAl4aWQgPSBHZXRYaWQoKTsKLQlpZiAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUgPT0gTlVMTCkgeworCWlmIChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlID09IE5VTEwpIHsKIAkJRnJlZVhpZCh4aWQpOwogCQlyZXR1cm4gLUVCQURGOwogCX0KIAotCWlmICgqcG9mZnNldCA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJaWYgKCpwb2Zmc2V0ID4gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplKQogCQlsb25nX29wID0gMjsgLyogd3JpdGVzIHBhc3QgZW5kIG9mIGZpbGUgY2FuIHRha2UgYSBsb25nIHRpbWUgKi8KIAllbHNlCiAJCWxvbmdfb3AgPSAxOwpAQCAtOTUxLDggKzk1Niw4IEBACiAJCQkJCXJldHVybiAtRUJBREY7CiAJCQl9CiAJCQlpZiAob3Blbl9maWxlLT5pbnZhbGlkSGFuZGxlKSB7Ci0JCQkJaWYgKChmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKSB8fAotCQkJCSAgIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMKSkgeworCQkJCWlmICgoZmlsZS0+Zl9wYXRoLmRlbnRyeSA9PSBOVUxMKSB8fAorCQkJCSAgIChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlID09IE5VTEwpKSB7CiAJCQkJCUZyZWVYaWQoeGlkKTsKIAkJCQkJcmV0dXJuIHRvdGFsX3dyaXR0ZW47CiAJCQkJfQpAQCAtOTYwLDcgKzk2NSw3IEBACiAJCQkJICAgZmlsZW1hcF9mZGF0YXdhaXQgZnJvbSBoZXJlIHNvIHRlbGwKIAkJCQkgICByZW9wZW5fZmlsZSBub3QgdG8gZmx1c2ggZGF0YSB0byAKIAkJCQkgICBzZXJ2ZXIgbm93ICovCi0JCQkJcmMgPSBjaWZzX3Jlb3Blbl9maWxlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLAogCQkJCQlmaWxlLCBGQUxTRSk7CiAJCQkJaWYgKHJjICE9IDApCiAJCQkJCWJyZWFrOwpAQCAtMTAwNywxNiArMTAxMiwxNiBAQAogCWNpZnNfc3RhdHNfYnl0ZXNfd3JpdHRlbihwVGNvbiwgdG90YWxfd3JpdHRlbik7CiAKIAkvKiBzaW5jZSB0aGUgd3JpdGUgbWF5IGhhdmUgYmxvY2tlZCBjaGVjayB0aGVzZSBwb2ludGVycyBhZ2FpbiAqLwotCWlmIChmaWxlLT5mX2RlbnRyeSkgewotCQlpZiAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpIHsKLQkJCWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gCi0JCQlmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKwlpZiAoZmlsZS0+Zl9wYXRoLmRlbnRyeSkgeworCQlpZiAoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkgeworCQkJZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9CisJCQlmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwogCQkJaWYgKHRvdGFsX3dyaXR0ZW4gPiAwKSB7Ci0JCQkJaWYgKCpwb2Zmc2V0ID4gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSkKLQkJCQkJaV9zaXplX3dyaXRlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCAKKwkJCQlpZiAoKnBvZmZzZXQgPiBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJCQkJCWlfc2l6ZV93cml0ZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLAogCQkJCQkJICAgICAqcG9mZnNldCk7CiAJCQl9Ci0JCQltYXJrX2lub2RlX2RpcnR5X3N5bmMoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCQl9CiAJfQogCUZyZWVYaWQoeGlkKTsKQEAgLTEzODAsNyArMTM4NSw3IEBACiAJCQkJaWYgKChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpICYmIAogCQkJCSAgICAoIW9wZW5fZmlsZS0+Y2xvc2VQZW5kKSkgewogCQkJCQlyYyA9IGNpZnNfcmVvcGVuX2ZpbGUoCi0JCQkJCQlmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSk7CisJCQkJCQlmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmaWxlKTsKIAkJCQkJaWYgKHJjICE9IDApCiAJCQkJCQlicmVhazsKIAkJCQl9CkBAIC0xNDMwLDcgKzE0MzUsNyBAQAogewogCWludCB4aWQ7CiAJaW50IHJjID0gMDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIApAQCAtMTQ3OCw3ICsxNDgzLDcgQEAKICAqLwogaW50IGNpZnNfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCiB7Ci0Jc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IHJjID0gMDsKIAogCS8qIFJhdGhlciB0aGFuIGRvIHRoZSBzdGVwcyBtYW51YWxseToKQEAgLTE1MTUsNyArMTUyMCw3IEBACiAJc3RydWN0IHNtYl9jb21fcmVhZF9yc3AgKnBTTUJyOwogCiAJeGlkID0gR2V0WGlkKCk7Ci0JY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCXBUY29uID0gY2lmc19zYi0+dGNvbjsKIAogCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgewpAQCAtMTUzOCw3ICsxNTQzLDcgQEAKIAkJCWludCBidWZfdHlwZSA9IENJRlNfTk9fQlVGRkVSOwogCQkJaWYgKChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpICYmIAogCQkJICAgICghb3Blbl9maWxlLT5jbG9zZVBlbmQpKSB7Ci0JCQkJcmMgPSBjaWZzX3Jlb3Blbl9maWxlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLAogCQkJCQlmaWxlLCBUUlVFKTsKIAkJCQlpZiAocmMgIT0gMCkKIAkJCQkJYnJlYWs7CkBAIC0xNTk3LDcgKzE2MDIsNyBAQAogCWludCBidWZfdHlwZSA9IENJRlNfTk9fQlVGRkVSOwogCiAJeGlkID0gR2V0WGlkKCk7Ci0JY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCXBUY29uID0gY2lmc19zYi0+dGNvbjsKIAogCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgewpAQCAtMTYyNSw3ICsxNjMwLDcgQEAKIAkJd2hpbGUgKHJjID09IC1FQUdBSU4pIHsKIAkJCWlmICgob3Blbl9maWxlLT5pbnZhbGlkSGFuZGxlKSAmJiAKIAkJCSAgICAoIW9wZW5fZmlsZS0+Y2xvc2VQZW5kKSkgewotCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQlyYyA9IGNpZnNfcmVvcGVuX2ZpbGUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKIAkJCQkJZmlsZSwgVFJVRSk7CiAJCQkJaWYgKHJjICE9IDApCiAJCQkJCWJyZWFrOwpAQCAtMTY1NCw3ICsxNjU5LDcgQEAKIAogaW50IGNpZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCWludCByYywgeGlkOwogCiAJeGlkID0gR2V0WGlkKCk7CkBAIC0xNzQwLDcgKzE3NDUsNyBAQAogCQlyZXR1cm4gLUVCQURGOwogCX0KIAlvcGVuX2ZpbGUgPSAoc3RydWN0IGNpZnNGaWxlSW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CiAJcFRjb24gPSBjaWZzX3NiLT50Y29uOwogCiAJcGFnZXZlY19pbml0KCZscnVfcHZlYywgMCk7CkBAIC0xNzgyLDcgKzE3ODcsNyBAQAogCQl3aGlsZSAocmMgPT0gLUVBR0FJTikgewogCQkJaWYgKChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpICYmIAogCQkJICAgICghb3Blbl9maWxlLT5jbG9zZVBlbmQpKSB7Ci0JCQkJcmMgPSBjaWZzX3Jlb3Blbl9maWxlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLAogCQkJCQlmaWxlLCBUUlVFKTsKIAkJCQlpZiAocmMgIT0gMCkKIAkJCQkJYnJlYWs7CkBAIC0xODA2LDE1ICsxODExLDkgQEAKIAkJfQogCQlpZiAoKHJjIDwgMCkgfHwgKHNtYl9yZWFkX2RhdGEgPT0gTlVMTCkpIHsKIAkJCWNGWUkoMSwgKCJSZWFkIGVycm9yIGluIHJlYWRwYWdlczogJWQiLCByYykpOwotCQkJLyogY2xlYW4gdXAgcmVtYWluZyBwYWdlcyBvZmYgbGlzdCAqLwotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KHBhZ2VfbGlzdCkgJiYgKGkgPCBudW1fcGFnZXMpKSB7Ci0JCQkJcGFnZSA9IGxpc3RfZW50cnkocGFnZV9saXN0LT5wcmV2LCBzdHJ1Y3QgcGFnZSwKLQkJCQkJCSAgbHJ1KTsKLQkJCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQl9CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmIChieXRlc19yZWFkID4gMCkgeworCQkJdGFza19pb19hY2NvdW50X3JlYWQoYnl0ZXNfcmVhZCk7CiAJCQlwU01CciA9IChzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqKXNtYl9yZWFkX2RhdGE7CiAJCQljaWZzX2NvcHlfY2FjaGVfcGFnZXMobWFwcGluZywgcGFnZV9saXN0LCBieXRlc19yZWFkLAogCQkJCXNtYl9yZWFkX2RhdGEgKyA0IC8qIFJGQzEwMDEgaGRyICovICsKQEAgLTE4MzEsMTMgKzE4MzAsNyBAQAogCQkJCSAgIHRoaXMgY2FzZSBpcyBvayAtIGlmIHdlIGFyZSBhdCBzZXJ2ZXIgRU9GIAogCQkJCSAgIHdlIHdpbGwgaGl0IGl0IG9uIG5leHQgcmVhZCAqLwogCi0JCQkvKiB3aGlsZSAoIWxpc3RfZW1wdHkocGFnZV9saXN0KSAmJiAoaSA8IG51bV9wYWdlcykpIHsKLQkJCQkJcGFnZSA9IGxpc3RfZW50cnkocGFnZV9saXN0LT5wcmV2LCAKLQkJCQkJCQkgIHN0cnVjdCBwYWdlLCBsaXN0KTsKLQkJCQkJbGlzdF9kZWwoJnBhZ2UtPmxpc3QpOwotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJfQotCQkJCWJyZWFrOyAqLworCQkJCS8qIGJyZWFrOyAqLwogCQkJfQogCQl9IGVsc2UgewogCQkJY0ZZSSgxLCAoIk5vIGJ5dGVzIHJlYWQgKCVkKSBhdCBvZmZzZXQgJWxsZCAuICIKQEAgLTE4NDUsMTQgKzE4MzgsNiBAQAogCQkJCSBieXRlc19yZWFkLCBvZmZzZXQpKTsKIAkJCS8qIEJCIHR1cm4gb2ZmIGNhY2hpbmcgYW5kIGRvIG5ldyBsb29rdXAgb24gCiAJCQkgICBmaWxlIHNpemUgYXQgc2VydmVyPyAqLwotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KHBhZ2VfbGlzdCkgJiYgKGkgPCBudW1fcGFnZXMpKSB7Ci0JCQkJcGFnZSA9IGxpc3RfZW50cnkocGFnZV9saXN0LT5wcmV2LCBzdHJ1Y3QgcGFnZSwKLQkJCQkJCSAgbHJ1KTsKLQkJCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKLQotCQkJCS8qIEJCIHJlbW92ZW1lIC0gcmVwbGFjZSB3aXRoIHplcm8gb2YgcGFnZT8gKi8KLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQl9CiAJCQlicmVhazsKIAkJfQogCQlpZiAoc21iX3JlYWRfZGF0YSkgewpAQCAtMTg5Nyw4ICsxODgyLDggQEAKIAllbHNlCiAJCWNGWUkoMSwgKCJCeXRlcyByZWFkICVkIixyYykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfYXRpbWUgPQotCQljdXJyZW50X2ZzX3RpbWUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IpOworCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfYXRpbWUgPQorCQljdXJyZW50X2ZzX3RpbWUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAlpZiAoUEFHRV9DQUNIRV9TSVpFID4gcmMpCiAJCW1lbXNldChyZWFkX2RhdGEgKyByYywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gcmMpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IDM1ZDU0YmIuLmM0ZmE5MWIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvaW5vZGUuYworKysgYi9mcy9jaWZzL2lub2RlLmMKQEAgLTMxOCw2ICszMTgsNyBAQAogCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKIAljaGFyICp0bXBfcGF0aDsKIAljaGFyICpidWYgPSBOVUxMOworCWludCBhZGp1c3RUWiA9IEZBTFNFOwogCiAJcFRjb24gPSBjaWZzX3NiLT50Y29uOwogCWNGWUkoMSwoIkdldHRpbmcgaW5mbyBvbiAlcyIsIHNlYXJjaF9wYXRoKSk7CkBAIC0zNDgsNiArMzQ5LDcgQEAKIAkJCQkJcGZpbmREYXRhLCBjaWZzX3NiLT5sb2NhbF9ubHMsIAogCQkJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJCSAgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCQkJYWRqdXN0VFogPSBUUlVFOwogCQl9CiAJCQogCX0KQEAgLTQ0NCw2ICs0NDYsMTAgQEAKIAkJaW5vZGUtPmlfY3RpbWUgPQogCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5DaGFuZ2VUaW1lKSk7CiAJCWNGWUkoMCwgKCJBdHRyaWJ1dGVzIGNhbWUgaW4gYXMgMHgleCIsIGF0dHIpKTsKKwkJaWYoYWRqdXN0VFogJiYgKHBUY29uLT5zZXMpICYmIChwVGNvbi0+c2VzLT5zZXJ2ZXIpKSB7CisJCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgKz0gcFRjb24tPnNlcy0+c2VydmVyLT50aW1lQWRqOworCSAgICAgICAgICAgICAgICBpbm9kZS0+aV9tdGltZS50dl9zZWMgKz0gcFRjb24tPnNlcy0+c2VydmVyLT50aW1lQWRqOworCQl9CiAKIAkJLyogc2V0IGRlZmF1bHQgbW9kZS4gd2lsbCBvdmVycmlkZSBmb3IgZGlycyBiZWxvdyAqLwogCQlpZiAoYXRvbWljX3JlYWQoJmNpZnNJbmZvLT5pblVzZSkgPT0gMCkKQEAgLTg4NSwxMCArODkxLDE0IEBACiAJCQlrbWFsbG9jKDIgKiBzaXplb2YoRklMRV9VTklYX0JBU0lDX0lORk8pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGluZm9fYnVmX3NvdXJjZSAhPSBOVUxMKSB7CiAJCQlpbmZvX2J1Zl90YXJnZXQgPSBpbmZvX2J1Zl9zb3VyY2UgKyAxOwotCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCBmcm9tTmFtZSwKLQkJCQlpbmZvX2J1Zl9zb3VyY2UsIGNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMsIAotCQkJCWNpZnNfc2Jfc291cmNlLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwkJCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJCQlyYyA9IENJRlNTTUJVbml4UVBhdGhJbmZvKHhpZCwgcFRjb24sIGZyb21OYW1lLAorCQkJCQlpbmZvX2J1Zl9zb3VyY2UsIAorCQkJCQljaWZzX3NiX3NvdXJjZS0+bG9jYWxfbmxzLAorCQkJCQljaWZzX3NiX3NvdXJjZS0+bW50X2NpZnNfZmxhZ3MgJgorCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCQkJLyogZWxzZSByYyBpcyBzdGlsbCBFRVhJU1Qgc28gd2lsbCBmYWxsIHRocm91Z2ggdG8KKwkJCSAgIHVubGluayB0aGUgdGFyZ2V0IGFuZCByZXRyeSByZW5hbWUgKi8KIAkJCWlmIChyYyA9PSAwKSB7CiAJCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCB0b05hbWUsCiAJCQkJCQlpbmZvX2J1Zl90YXJnZXQsCkBAIC05MzcsNyArOTQ3LDcgQEAKIAkJCQkgY2lmc19zYl9zb3VyY2UtPm1udF9jaWZzX2ZsYWdzICYgCiAJCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKIAkJaWYgKHJjPT0wKSB7Ci0JCQlDSUZTU01CUmVuYW1lT3BlbkZpbGUoeGlkLCBwVGNvbiwgbmV0ZmlkLCB0b05hbWUsCisJCQlyYyA9IENJRlNTTUJSZW5hbWVPcGVuRmlsZSh4aWQsIHBUY29uLCBuZXRmaWQsIHRvTmFtZSwKIAkJCQkJICAgICAgY2lmc19zYl9zb3VyY2UtPmxvY2FsX25scywgCiAJCQkJCSAgICAgIGNpZnNfc2Jfc291cmNlLT5tbnRfY2lmc19mbGFncyAmCiAJCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CkBAIC0xMDg1LDggKzEwOTUsMTAgQEAKIAlzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7CiAJaW50IGVyciA9IGNpZnNfcmV2YWxpZGF0ZShkZW50cnkpOwotCWlmICghZXJyKQorCWlmICghZXJyKSB7CiAJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwkJc3RhdC0+Ymxrc2l6ZSA9IENJRlNfTUFYX01TR1NJWkU7CisJfQogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbGluay5jIGIvZnMvY2lmcy9saW5rLmMKaW5kZXggMGJlZThiNy4uOGUyNTk5NiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9saW5rLmMKKysrIGIvZnMvY2lmcy9saW5rLmMKQEAgLTY5LDE3ICs2OSwzMCBAQAogCQkJcmMgPSAtRU9QTk9UU1VQUDsgIAogCX0KIAotLyogaWYgKCFyYykgICAgICovCi0JewotCQkvKiAgIHJlbmV3X3BhcmVudGFsX3RpbWVzdGFtcHMob2xkX2ZpbGUpOwotCQkgICBpbm9kZS0+aV9ubGluaysrOwotCQkgICBtYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQkJICAgZF9pbnN0YW50aWF0ZShkaXJlbnRyeSwgaW5vZGUpOyAqLwotCQkvKiBCQiBhZGQgY2FsbCB0byBlaXRoZXIgbWFyayBpbm9kZSBkaXJ0eSBvciByZWZyZXNoIGl0cyBkYXRhIGFuZCB0aW1lc3RhbXAgdG8gY3VycmVudCB0aW1lICovCisJZF9kcm9wKGRpcmVudHJ5KTsJLyogZm9yY2UgbmV3IGxvb2t1cCBmcm9tIHNlcnZlciBvZiB0YXJnZXQgKi8KKworCS8qIGlmIHNvdXJjZSBmaWxlIGlzIGNhY2hlZCAob3Bsb2NrZWQpIHJldmFsaWRhdGUgd2lsbCBub3QgZ28gdG8gc2VydmVyCisJICAgdW50aWwgdGhlIGZpbGUgaXMgY2xvc2VkIG9yIG9wbG9jayBicm9rZW4gc28gdXBkYXRlIG5saW5rcyBsb2NhbGx5ICovCisJaWYob2xkX2ZpbGUtPmRfaW5vZGUpIHsKKwkJY2lmc0lub2RlID0gQ0lGU19JKG9sZF9maWxlLT5kX2lub2RlKTsKKwkJaWYocmMgPT0gMCkgeworCQkJb2xkX2ZpbGUtPmRfaW5vZGUtPmlfbmxpbmsrKzsKKwkJCW9sZF9maWxlLT5kX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQkJLyogcGFyZW50IGRpciB0aW1lc3RhbXBzIHdpbGwgdXBkYXRlIGZyb20gc3J2CisJCQl3aXRoaW4gYSBzZWNvbmQsIHdvdWxkIGl0IHJlYWxseSBiZSB3b3J0aCBpdAorCQkJdG8gc2V0IHRoZSBwYXJlbnQgZGlyIGNpZnMgaW5vZGUgdGltZSB0byB6ZXJvCisJCQl0byBmb3JjZSByZXZhbGlkYXRlIChmYXN0ZXIpIGZvciBpdCB0b28/ICovCisJCX0KKwkJLyogaWYgbm90IG9wbG9ja2VkIHdpbGwgZm9yY2UgcmV2YWxpZGF0ZSB0byBnZXQgaW5mbyAKKwkJICAgb24gc291cmNlIGZpbGUgZnJvbSBzcnYgKi8KKwkJY2lmc0lub2RlLT50aW1lID0gMDsKKworICAgICAgICAgICAgICAgIC8qIFdpbGwgdXBkYXRlIHBhcmVudCBkaXIgdGltZXN0YW1wcyBmcm9tIHNydiB3aXRoaW4gYSBzZWNvbmQuCisJCSAgIFdvdWxkIGl0IHJlYWxseSBiZSB3b3J0aCBpdCB0byBzZXQgdGhlIHBhcmVudCBkaXIgKGNpZnMKKwkJICAgaW5vZGUpIHRpbWUgZmllbGQgdG8gemVybyB0byBmb3JjZSByZXZhbGlkYXRlIG9uIHBhcmVudAorCQkgICBkaXJlY3RvcnkgZmFzdGVyIGllIAorCQkJQ0lGU19JKGlub2RlKS0+dGltZSA9IDA7ICAqLwogCX0KLQlkX2Ryb3AoZGlyZW50cnkpOwkvKiBmb3JjZSBuZXcgbG9va3VwIGZyb20gc2VydmVyICovCi0JY2lmc0lub2RlID0gQ0lGU19JKG9sZF9maWxlLT5kX2lub2RlKTsKLQljaWZzSW5vZGUtPnRpbWUgPSAwOwkvKiB3aWxsIGZvcmNlIHJldmFsaWRhdGUgdG8gZ28gZ2V0IGluZm8gd2hlbiBuZWVkZWQgKi8KIAogY2lmc19obF9leGl0OgogCWtmcmVlKGZyb21OYW1lKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbWlzYy5jIGIvZnMvY2lmcy9taXNjLmMKaW5kZXggYmJjOWNkMy4uYWVkZjY4MyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9taXNjLmMKKysrIGIvZnMvY2lmcy9taXNjLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgYWxiZWl0IHNsaWdodGx5IGxhcmdlciB0aGFuIG5lY2Vzc2FyeSBhbmQgbWF4YnVmZmVyc2l6ZSAKICAgIGRlZmF1bHRzIHRvIHRoaXMgYW5kIGNhbiBub3QgYmUgYmlnZ2VyICovCiAJcmV0X2J1ZiA9Ci0JICAgIChzdHJ1Y3Qgc21iX2hkciAqKSBtZW1wb29sX2FsbG9jKGNpZnNfcmVxX3Bvb2xwLCBTTEFCX0tFUk5FTCB8IFNMQUJfTk9GUyk7CisJICAgIChzdHJ1Y3Qgc21iX2hkciAqKSBtZW1wb29sX2FsbG9jKGNpZnNfcmVxX3Bvb2xwLCBHRlBfS0VSTkVMIHwgR0ZQX05PRlMpOwogCiAJLyogY2xlYXIgdGhlIGZpcnN0IGZldyBoZWFkZXIgYnl0ZXMgKi8KIAkvKiBmb3IgbW9zdCBwYXRocywgbW9yZSBpcyBjbGVhcmVkIGluIGhlYWRlcl9hc3NlbWJsZSAqLwpAQCAtMTkyLDcgKzE5Miw3IEBACiAgICBhbGJlaXQgc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gbmVjZXNzYXJ5IGFuZCBtYXhidWZmZXJzaXplIAogICAgZGVmYXVsdHMgdG8gdGhpcyBhbmQgY2FuIG5vdCBiZSBiaWdnZXIgKi8KIAlyZXRfYnVmID0KLQkgICAgKHN0cnVjdCBzbWJfaGRyICopIG1lbXBvb2xfYWxsb2MoY2lmc19zbV9yZXFfcG9vbHAsIFNMQUJfS0VSTkVMIHwgU0xBQl9OT0ZTKTsKKwkgICAgKHN0cnVjdCBzbWJfaGRyICopIG1lbXBvb2xfYWxsb2MoY2lmc19zbV9yZXFfcG9vbHAsIEdGUF9LRVJORUwgfCBHRlBfTk9GUyk7CiAJaWYgKHJldF9idWYpIHsKIAkvKiBObyBuZWVkIHRvIGNsZWFyIG1lbW9yeSBoZXJlLCBjbGVhcmVkIGluIGhlYWRlciBhc3NlbWJsZSAqLwogCS8qCW1lbXNldChyZXRfYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMjcpOyovCmRpZmYgLS1naXQgYS9mcy9jaWZzL3JlYWRkaXIuYyBiL2ZzL2NpZnMvcmVhZGRpci5jCmluZGV4IGI1YjBhMmEuLjk5ZGZiNTMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvcmVhZGRpci5jCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC02OCwzMCArNjgsMzAgQEAKIAlpbnQgcmMgPSAwOwogCiAJY0ZZSSgxLCAoIkZvciAlcyIsIHFzdHJpbmctPm5hbWUpKTsKLQljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CiAJcFRjb24gPSBjaWZzX3NiLT50Y29uOwogCiAJcXN0cmluZy0+aGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHFzdHJpbmctPm5hbWUsIHFzdHJpbmctPmxlbik7Ci0JdG1wX2RlbnRyeSA9IGRfbG9va3VwKGZpbGUtPmZfZGVudHJ5LCBxc3RyaW5nKTsKKwl0bXBfZGVudHJ5ID0gZF9sb29rdXAoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgcXN0cmluZyk7CiAJaWYgKHRtcF9kZW50cnkpIHsKIAkJY0ZZSSgwLCAoImV4aXN0aW5nIGRlbnRyeSB3aXRoIGlub2RlIDB4JXAiLCB0bXBfZGVudHJ5LT5kX2lub2RlKSk7CiAJCSpwdG1wX2lub2RlID0gdG1wX2RlbnRyeS0+ZF9pbm9kZTsKIC8qIEJCIG92ZXJ3cml0ZSBvbGQgbmFtZT8gaS5lLiB0bXBfZGVudHJ5LT5kX25hbWUgYW5kIHRtcF9kZW50cnktPmRfbmFtZS5sZW4/PyovCiAJCWlmKCpwdG1wX2lub2RlID09IE5VTEwpIHsKLQkJCSpwdG1wX2lub2RlID0gbmV3X2lub2RlKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwkJCSpwdG1wX2lub2RlID0gbmV3X2lub2RlKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCQkJaWYoKnB0bXBfaW5vZGUgPT0gTlVMTCkKIAkJCQlyZXR1cm4gcmM7CiAJCQlyYyA9IDE7CiAJCX0KIAl9IGVsc2UgewotCQl0bXBfZGVudHJ5ID0gZF9hbGxvYyhmaWxlLT5mX2RlbnRyeSwgcXN0cmluZyk7CisJCXRtcF9kZW50cnkgPSBkX2FsbG9jKGZpbGUtPmZfcGF0aC5kZW50cnksIHFzdHJpbmcpOwogCQlpZih0bXBfZGVudHJ5ID09IE5VTEwpIHsKIAkJCWNFUlJPUigxLCgiRmFpbGVkIGFsbG9jYXRpbmcgZGVudHJ5IikpOwogCQkJKnB0bXBfaW5vZGUgPSBOVUxMOwogCQkJcmV0dXJuIHJjOwogCQl9CiAKLQkJKnB0bXBfaW5vZGUgPSBuZXdfaW5vZGUoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCQkqcHRtcF9pbm9kZSA9IG5ld19pbm9kZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3NiKTsKIAkJaWYgKHBUY29uLT5ub2Nhc2UpCiAJCQl0bXBfZGVudHJ5LT5kX29wID0gJmNpZnNfY2lfZGVudHJ5X29wczsKIAkJZWxzZQpAQCAtNDMyLDEwICs0MzIsMTAgQEAKIAljaWZzRmlsZS0+aW52YWxpZEhhbmRsZSA9IFRSVUU7CiAJY2lmc0ZpbGUtPnNyY2hfaW5mLmVuZE9mU2VhcmNoID0gRkFMU0U7CiAKLQlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCWlmKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9zYik7CiAJaWYoY2lmc19zYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNDQzLDcgKzQ0Myw3IEBACiAJaWYocFRjb24gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGZpbGUtPmZfZGVudHJ5KTsKKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCiAJaWYoZnVsbF9wYXRoID09IE5VTEwpIHsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02MDksMTAgKzYwOSwxMCBAQAogCXN0cnVjdCBpbm9kZSAqIGlub2RlOwogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5mbzsKIAotCWlmKGZpbGUtPmZfZGVudHJ5ID09IE5VTEwpCisJaWYoZmlsZS0+Zl9wYXRoLmRlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJaWYoaW5vZGUgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CkBAIC04MzksNyArODM5LDcgQEAKIAlpZigoc2NyYXRjaF9idWYgPT0gTlVMTCkgfHwgKHBmaW5kRW50cnkgPT0gTlVMTCkgfHwgKHBDaWZzRiA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCWlmKGZpbGUtPmZfcGF0aC5kZW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlyYyA9IGNpZnNfZW50cnlfaXNfZG90KHBmaW5kRW50cnkscENpZnNGKTsKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCWlmKHJjICE9IDApIAogCQlyZXR1cm4gMDsKIAotCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3NiKTsKIAogCXFzdHJpbmcubmFtZSA9IHNjcmF0Y2hfYnVmOwogCXJjID0gY2lmc19nZXRfbmFtZV9mcm9tX3NlYXJjaF9idWYoJnFzdHJpbmcscGZpbmRFbnRyeSwKQEAgLTg5Niw2ICs4OTYsMTAgQEAKIAkJICAgICB0bXBfaW5vZGUtPmlfaW5vLG9ial90eXBlKTsKIAlpZihyYykgewogCQljRllJKDEsKCJmaWxsZGlyIHJjID0gJWQiLHJjKSk7CisJCS8qIHdlIGNhbiBub3QgcmV0dXJuIGZpbGxkaXIgZXJyb3JzIHRvIHRoZSBjYWxsZXIKKwkJc2luY2UgdGhleSBhcmUgIm5vcm1hbCIgd2hlbiB0aGUgc3RhdCBibG9ja3NpemUKKwkJaXMgdG9vIHNtYWxsIC0gd2UgcmV0dXJuIHJlbWFwcGVkIGVycm9yIGluc3RlYWQgKi8KKwkJcmMgPSAtRU9WRVJGTE9XOwogCX0KIAogCWRwdXQodG1wX2RlbnRyeSk7CkBAIC05ODEsMTIgKzk4NSwxMiBAQAogCiAJeGlkID0gR2V0WGlkKCk7CiAKLQlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKSB7CisJaWYoZmlsZS0+Zl9wYXRoLmRlbnRyeSA9PSBOVUxMKSB7CiAJCUZyZWVYaWQoeGlkKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfc2IpOwogCXBUY29uID0gY2lmc19zYi0+dGNvbjsKIAlpZihwVGNvbiA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk5NCw3ICs5OTgsNyBAQAogCXN3aXRjaCAoKGludCkgZmlsZS0+Zl9wb3MpIHsKIAljYXNlIDA6CiAJCWlmIChmaWxsZGlyKGRpcmVudHJ5LCAiLiIsIDEsIGZpbGUtPmZfcG9zLAotCQkgICAgIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubywgRFRfRElSKSA8IDApIHsKKwkJICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2lubywgRFRfRElSKSA8IDApIHsKIAkJCWNFUlJPUigxLCAoIkZpbGxkaXIgZm9yIGN1cnJlbnQgZGlyIGZhaWxlZCIpKTsKIAkJCXJjID0gLUVOT01FTTsKIAkJCWJyZWFrOwpAQCAtMTAwMiw3ICsxMDA2LDcgQEAKIAkJZmlsZS0+Zl9wb3MrKzsKIAljYXNlIDE6CiAJCWlmIChmaWxsZGlyKGRpcmVudHJ5LCAiLi4iLCAyLCBmaWxlLT5mX3BvcywKLQkJICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkgeworCQkgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX2lubywgRFRfRElSKSA8IDApIHsKIAkJCWNFUlJPUigxLCAoIkZpbGxkaXIgZm9yIHBhcmVudCBkaXIgZmFpbGVkIikpOwogCQkJcmMgPSAtRU5PTUVNOwogCQkJYnJlYWs7CkBAIC0xMDc0LDYgKzEwNzgsMTEgQEAKIAkJCXdlIHdhbnQgdG8gY2hlY2sgZm9yIHRoYXQgaGVyZT8gKi8KIAkJCXJjID0gY2lmc19maWxsZGlyKGN1cnJlbnRfZW50cnksIGZpbGUsCiAJCQkJCWZpbGxkaXIsIGRpcmVudHJ5LCB0bXBfYnVmLCBtYXhfbGVuKTsKKwkJCWlmKHJjID09IC1FT1ZFUkZMT1cpIHsKKwkJCQlyYyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCWZpbGUtPmZfcG9zKys7CiAJCQlpZihmaWxlLT5mX3BvcyA9PSAKIAkJCQljaWZzRmlsZS0+c3JjaF9pbmYuaW5kZXhfb2ZfbGFzdF9lbnRyeSkgewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zZXNzLmMgYi9mcy9jaWZzL3Nlc3MuYwppbmRleCBhOGEwODM1Li5iYmRkYTk5IDEwMDY0NAotLS0gYS9mcy9jaWZzL3Nlc3MuYworKysgYi9mcy9jaWZzL3Nlc3MuYwpAQCAtOTAsNyArOTAsOSBAQAogCX0gKi8KIAkvKiBjb3B5IHVzZXIgKi8KIAlpZihzZXMtPnVzZXJOYW1lID09IE5VTEwpIHsKLQkJLyogQkIgd2hhdCBhYm91dCBudWxsIHVzZXIgbW91bnRzIC0gY2hlY2sgdGhhdCB3ZSBkbyB0aGlzIEJCICovCisJCS8qIG51bGwgdXNlciBtb3VudCAqLworCQkqYmNjX3B0ciA9IDA7CisJCSooYmNjX3B0cisxKSA9IDA7CiAJfSBlbHNlIHsgLyogMzAwIHNob3VsZCBiZSBsb25nIGVub3VnaCBmb3IgYW55IGNvbmNlaXZhYmxlIHVzZXIgbmFtZSAqLwogCQlieXRlc19yZXQgPSBjaWZzX3N0cnRvVUNTKChfX2xlMTYgKikgYmNjX3B0ciwgc2VzLT51c2VyTmFtZSwKIAkJCQkJICAzMDAsIG5sc19jcCk7CkBAIC05OCwxMCArMTAwLDEzIEBACiAJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0OwogCWJjY19wdHIgKz0gMjsgLyogYWNjb3VudCBmb3IgbnVsbCB0ZXJtaW5hdGlvbiAqLwogCS8qIGNvcHkgZG9tYWluICovCi0JaWYoc2VzLT5kb21haW5OYW1lID09IE5VTEwpCi0JCWJ5dGVzX3JldCA9IGNpZnNfc3RydG9VQ1MoKF9fbGUxNiAqKSBiY2NfcHRyLAotCQkJCQkgICJDSUZTX0xJTlVYX0RPTSIsIDMyLCBubHNfY3ApOwotCWVsc2UKKwlpZihzZXMtPmRvbWFpbk5hbWUgPT0gTlVMTCkgeworCQkvKiBTZW5kaW5nIG51bGwgZG9tYWluIGJldHRlciB0aGFuIHVzaW5nIGEgYm9ndXMgZG9tYWluIG5hbWUgKGFzCisJCXdlIGRpZCBicmllZmx5IGluIDIuNi4xOCkgc2luY2Ugc2VydmVyIHdpbGwgdXNlIGl0cyBkZWZhdWx0ICovCisJCSpiY2NfcHRyID0gMDsKKwkJKihiY2NfcHRyKzEpID0gMDsKKwkJYnl0ZXNfcmV0ID0gMDsKKwl9IGVsc2UKIAkJYnl0ZXNfcmV0ID0gY2lmc19zdHJ0b1VDUygoX19sZTE2ICopIGJjY19wdHIsIHNlcy0+ZG9tYWluTmFtZSwgCiAJCQkJCSAgMjU2LCBubHNfY3ApOwogCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldDsKQEAgLTE0NCwxMyArMTQ5LDExIEBACiAKICAgICAgICAgLyogY29weSBkb21haW4gKi8KIAkKLSAgICAgICAgaWYoc2VzLT5kb21haW5OYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdHJjcHkoYmNjX3B0ciwgIkNJRlNfTElOVVhfRE9NIik7Ci0JCWJjY19wdHIgKz0gMTQ7ICAvKiBzdHJsZW4oQ0lGU19MSU5VWF9ET00pICovCi0gCX0gZWxzZSB7CisgICAgICAgIGlmKHNlcy0+ZG9tYWluTmFtZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgc3RybmNweShiY2NfcHRyLCBzZXMtPmRvbWFpbk5hbWUsIDI1Nik7IAogCQliY2NfcHRyICs9IHN0cm5sZW4oc2VzLT5kb21haW5OYW1lLCAyNTYpOwotCX0KKwl9IC8qIGVsc2Ugd2Ugd2lsbCBzZW5kIGEgbnVsbCBkb21haW4gbmFtZSAKKwkgICAgIHNvIHRoZSBzZXJ2ZXIgd2lsbCBkZWZhdWx0IHRvIGl0cyBvd24gZG9tYWluICovCiAJKmJjY19wdHIgPSAwOwogCWJjY19wdHIrKzsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy90cmFuc3BvcnQuYyBiL2ZzL2NpZnMvdHJhbnNwb3J0LmMKaW5kZXggNDhkNDdiNC4uZjgwMDA3ZSAxMDA2NDQKLS0tIGEvZnMvY2lmcy90cmFuc3BvcnQuYworKysgYi9mcy9jaWZzL3RyYW5zcG9ydC5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgogICAKIGV4dGVybiBtZW1wb29sX3QgKmNpZnNfbWlkX3Bvb2xwOwotZXh0ZXJuIGttZW1fY2FjaGVfdCAqY2lmc19vcGxvY2tfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpjaWZzX29wbG9ja19jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3QgbWlkX3FfZW50cnkgKgogQWxsb2NNaWRRRW50cnkoY29uc3Qgc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQpAQCAtNTEsNyArNTEsNyBAQAogCX0KIAkKIAl0ZW1wID0gKHN0cnVjdCBtaWRfcV9lbnRyeSAqKSBtZW1wb29sX2FsbG9jKGNpZnNfbWlkX3Bvb2xwLAotCQkJCQkJICAgIFNMQUJfS0VSTkVMIHwgU0xBQl9OT0ZTKTsKKwkJCQkJCSAgICBHRlBfS0VSTkVMIHwgR0ZQX05PRlMpOwogCWlmICh0ZW1wID09IE5VTEwpCiAJCXJldHVybiB0ZW1wOwogCWVsc2UgewpAQCAtMTE4LDcgKzExOCw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAl0ZW1wID0gKHN0cnVjdCBvcGxvY2tfcV9lbnRyeSAqKSBrbWVtX2NhY2hlX2FsbG9jKGNpZnNfb3Bsb2NrX2NhY2hlcCwKLQkJCQkJCSAgICAgICBTTEFCX0tFUk5FTCk7CisJCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKHRlbXAgPT0gTlVMTCkKIAkJcmV0dXJuIHRlbXA7CiAJZWxzZSB7CmRpZmYgLS1naXQgYS9mcy9jb2RhL2Rpci5jIGIvZnMvY29kYS9kaXIuYwppbmRleCAwMTAyYjI4Li4wYzZmN2YzIDEwMDY0NAotLS0gYS9mcy9jb2RhL2Rpci5jCisrKyBiL2ZzL2NvZGEvZGlyLmMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogLyogZmlsZSBvcGVyYXRpb25zIGZvciBkaXJlY3RvcmllcyAqLwogaW50IGNvZGFfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBkZW50cnkgKmNvZGFfZGVudHJ5ID0gY29kYV9maWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpjb2RhX2RlbnRyeSA9IGNvZGFfZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKIAlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOwogCXN0cnVjdCBpbm9kZSAqaG9zdF9pbm9kZTsKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCiAJY29kYV92ZnNfc3RhdC5yZWFkZGlyKys7CiAKLQlob3N0X2lub2RlID0gaG9zdF9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlob3N0X2lub2RlID0gaG9zdF9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCW11dGV4X2xvY2soJmhvc3RfaW5vZGUtPmlfbXV0ZXgpOwogCWhvc3RfZmlsZS0+Zl9wb3MgPSBjb2RhX2ZpbGUtPmZfcG9zOwogCkBAIC01NDQsMTQgKzU0NCwxNCBAQAogCQkvKiBjYXRjaCB0cnVuY2F0ZWQgcmVhZHMgKi8KIAkJaWYgKHJldCA8IHZkaXJfc2l6ZSB8fCByZXQgPCB2ZGlyX3NpemUgKyB2ZGlyLT5kX25hbWxlbikgewogCQkJcHJpbnRrKCJjb2RhX3ZlbnVzX3JlYWRkaXI6IHNob3J0IHJlYWQ6ICVsZFxuIiwKLQkJCSAgICAgICBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCQkJICAgICAgIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKIAkJCXJldCA9IC1FQkFERjsKIAkJCWJyZWFrOwogCQl9CiAJCS8qIHZhbGlkYXRlIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBmaWxlIGFjdHVhbGx5IG1ha2VzIHNlbnNlICovCiAJCWlmICh2ZGlyLT5kX3JlY2xlbiA8IHZkaXJfc2l6ZSArIHZkaXItPmRfbmFtbGVuKSB7CiAJCQlwcmludGsoImNvZGFfdmVudXNfcmVhZGRpcjogSW52YWxpZCBkaXI6ICVsZFxuIiwKLQkJCSAgICAgICBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCQkJICAgICAgIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKIAkJCXJldCA9IC1FQkFERjsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9mcy9jb2RhL2ZpbGUuYyBiL2ZzL2NvZGEvZmlsZS5jCmluZGV4IGRiZmJjZmEuLjVlZjJiNjAgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvZmlsZS5jCisrKyBiL2ZzL2NvZGEvZmlsZS5jCkBAIC02Niw3ICs2Niw3IEBACiBzdGF0aWMgc3NpemVfdAogY29kYV9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpjb2RhX2ZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqaG9zdF9pbm9kZSwgKmNvZGFfaW5vZGUgPSBjb2RhX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaG9zdF9pbm9kZSwgKmNvZGFfaW5vZGUgPSBjb2RhX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGNvZGFfZmlsZV9pbmZvICpjZmk7CiAJc3RydWN0IGZpbGUgKmhvc3RfZmlsZTsKIAlzc2l6ZV90IHJldDsKQEAgLTc4LDcgKzc4LDcgQEAKIAlpZiAoIWhvc3RfZmlsZS0+Zl9vcCB8fCAhaG9zdF9maWxlLT5mX29wLT53cml0ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlob3N0X2lub2RlID0gaG9zdF9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlob3N0X2lub2RlID0gaG9zdF9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCW11dGV4X2xvY2soJmNvZGFfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0ID0gaG9zdF9maWxlLT5mX29wLT53cml0ZShob3N0X2ZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOwpAQCAtMTA2LDggKzEwNiw4IEBACiAJaWYgKCFob3N0X2ZpbGUtPmZfb3AgfHwgIWhvc3RfZmlsZS0+Zl9vcC0+bW1hcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQljb2RhX2lub2RlID0gY29kYV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlob3N0X2lub2RlID0gaG9zdF9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwljb2RhX2lub2RlID0gY29kYV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCWhvc3RfaW5vZGUgPSBob3N0X2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJY29kYV9maWxlLT5mX21hcHBpbmcgPSBob3N0X2ZpbGUtPmZfbWFwcGluZzsKIAlpZiAoY29kYV9pbm9kZS0+aV9tYXBwaW5nID09ICZjb2RhX2lub2RlLT5pX2RhdGEpCiAJCWNvZGFfaW5vZGUtPmlfbWFwcGluZyA9IGhvc3RfaW5vZGUtPmlfbWFwcGluZzsKQEAgLTE5MCw3ICsxOTAsNyBAQAogCWNmaSA9IENPREFfRlRPQyhjb2RhX2ZpbGUpOwogCUJVR19PTighY2ZpIHx8IGNmaS0+Y2ZpX21hZ2ljICE9IENPREFfTUFHSUMpOwogCi0JY29kYV9pbm9kZSA9IGNvZGFfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJY29kYV9pbm9kZSA9IGNvZGFfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCWVyciA9IHZlbnVzX3N0b3JlKGNvZGFfaW5vZGUtPmlfc2IsIGNvZGFfaTJmKGNvZGFfaW5vZGUpLCBjb2RhX2ZsYWdzLAogCQkJICBjb2RhX2ZpbGUtPmZfdWlkKTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQllcnIgPSB2ZW51c19jbG9zZShjb2RhX2lub2RlLT5pX3NiLCBjb2RhX2kyZihjb2RhX2lub2RlKSwKIAkJCQkgIGNvZGFfZmxhZ3MsIGNvZGFfZmlsZS0+Zl91aWQpOwogCi0JaG9zdF9pbm9kZSA9IGNmaS0+Y2ZpX2NvbnRhaW5lci0+Zl9kZW50cnktPmRfaW5vZGU7CisJaG9zdF9pbm9kZSA9IGNmaS0+Y2ZpX2NvbnRhaW5lci0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAljaWkgPSBJVE9DKGNvZGFfaW5vZGUpOwogCiAJLyogZGlkIHdlIG1tYXAgdGhpcyBmaWxlPyAqLwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJY29kYV92ZnNfc3RhdC5mc3luYysrOwogCiAJaWYgKGhvc3RfZmlsZS0+Zl9vcCAmJiBob3N0X2ZpbGUtPmZfb3AtPmZzeW5jKSB7Ci0JCWhvc3RfZGVudHJ5ID0gaG9zdF9maWxlLT5mX2RlbnRyeTsKKwkJaG9zdF9kZW50cnkgPSBob3N0X2ZpbGUtPmZfcGF0aC5kZW50cnk7CiAJCWhvc3RfaW5vZGUgPSBob3N0X2RlbnRyeS0+ZF9pbm9kZTsKIAkJbXV0ZXhfbG9jaygmaG9zdF9pbm9kZS0+aV9tdXRleCk7CiAJCWVyciA9IGhvc3RfZmlsZS0+Zl9vcC0+ZnN5bmMoaG9zdF9maWxlLCBob3N0X2RlbnRyeSwgZGF0YXN5bmMpOwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9pbm9kZS5jIGIvZnMvY29kYS9pbm9kZS5jCmluZGV4IDg4ZDEyMzMuLjAxMzk1ZGUgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvaW5vZGUuYworKysgYi9mcy9jb2RhL2lub2RlLmMKQEAgLTM4LDEyICszOCwxMiBAQAogc3RhdGljIHZvaWQgY29kYV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogc3RhdGljIGludCBjb2RhX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICogY29kYV9pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKiBjb2RhX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqY29kYV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmVpOwotCWVpID0gKHN0cnVjdCBjb2RhX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGNvZGFfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZWkgPSAoc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoY29kYV9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCW1lbXNldCgmZWktPmNfZmlkLCAwLCBzaXplb2Yoc3RydWN0IENvZGFGaWQpKTsKQEAgLTU4LDcgKzU4LDcgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoY29kYV9pbm9kZV9jYWNoZXAsIElUT0MoaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvICopIGZvbzsKIApAQCAtMTE5LDcgKzExOSw3IEBACiAJZmlsZSA9IGZnZXQoZGF0YS0+ZmQpOwogCWlub2RlID0gTlVMTDsKIAlpZihmaWxlKQotCQlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJCiAJaWYoIWlub2RlIHx8ICFTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8CiAJICAgaW1ham9yKGlub2RlKSAhPSBDT0RBX1BTREVWX01BSk9SKSB7CmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IDUwNjI0ZDQuLjBlYzcwZTMgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3RzYWNjdF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8bmV0L3NvY2suaD4JCS8qIHNpb2NkZXZwcml2YXRlX2lvY3RsICovCkBAIC0yMzAsNyArMjMyLDcgQEAKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dDsKLQllcnJvciA9IHZmc19zdGF0ZnMoZmlsZS0+Zl9kZW50cnksICZ0bXApOworCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX3BhdGguZGVudHJ5LCAmdG1wKTsKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IHB1dF9jb21wYXRfc3RhdGZzKGJ1ZiwgJnRtcCk7CiAJZnB1dChmaWxlKTsKQEAgLTMwMSw3ICszMDMsNyBAQAogCWZpbGUgPSBmZ2V0KGZkKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0OwotCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeSwgJnRtcCk7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfcGF0aC5kZW50cnksICZ0bXApOwogCWlmICghZXJyb3IpCiAJCWVycm9yID0gcHV0X2NvbXBhdF9zdGF0ZnM2NChidWYsICZ0bXApOwogCWZwdXQoZmlsZSk7CkBAIC0zNjMsNyArMzY1LDcgQEAKIAkvKiBmaW5kIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UuICovCiAJcGF0aCA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmIChwYXRoKSB7Ci0JCWZuID0gZF9wYXRoKGZpbHAtPmZfZGVudHJ5LCBmaWxwLT5mX3Zmc21udCwgcGF0aCwgUEFHRV9TSVpFKTsKKwkJZm4gPSBkX3BhdGgoZmlscC0+Zl9wYXRoLmRlbnRyeSwgZmlscC0+Zl9wYXRoLm1udCwgcGF0aCwgUEFHRV9TSVpFKTsKIAkJaWYgKElTX0VSUihmbikpCiAJCQlmbiA9ICI/IjsKIAl9CkBAIC00MTQsNyArNDE2LDcgQEAKIAljYXNlIEZJQk1BUDoKIAljYXNlIEZJR0VUQlNaOgogCWNhc2UgRklPTlJFQUQ6Ci0JCWlmIChTX0lTUkVHKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorCQlpZiAoU19JU1JFRyhmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQkJYnJlYWs7CiAJCS8qRkFMTCBUSFJPVUdIKi8KIApAQCAtNDM2LDcgKzQzOCw3IEBACiAJCQlnb3RvIGZvdW5kX2hhbmRsZXI7CiAJfQogCi0JaWYgKFNfSVNTT0NLKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICYmCisJaWYgKFNfSVNTT0NLKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgJiYKIAkgICAgY21kID49IFNJT0NERVZQUklWQVRFICYmIGNtZCA8PSAoU0lPQ0RFVlBSSVZBVEUgKyAxNSkpIHsKIAkJZXJyb3IgPSBzaW9jZGV2cHJpdmF0ZV9pb2N0bChmZCwgY21kLCBhcmcpOwogCX0gZWxzZSB7CkBAIC04NjksNyArODcxLDcgQEAKIAogCXJldHZhbCA9IC1FSU5WQUw7CiAKLQlpZiAodHlwZV9wYWdlKSB7CisJaWYgKHR5cGVfcGFnZSAmJiBkYXRhX3BhZ2UpIHsKIAkJaWYgKCFzdHJjbXAoKGNoYXIgKil0eXBlX3BhZ2UsIFNNQkZTX05BTUUpKSB7CiAJCQlkb19zbWJfc3VwZXJfZGF0YV9jb252KCh2b2lkICopZGF0YV9wYWdlKTsKIAkJfSBlbHNlIGlmICghc3RyY21wKChjaGFyICopdHlwZV9wYWdlLCBOQ1BGU19OQU1FKSkgewpAQCAtMTE0Miw3ICsxMTQ0LDkgQEAKIAlsYXN0ZGlyZW50ID0gYnVmLnByZXZpb3VzOwogCWlmIChsYXN0ZGlyZW50KSB7CiAJCXR5cGVvZihsYXN0ZGlyZW50LT5kX29mZikgZF9vZmYgPSBmaWxlLT5mX3BvczsKLQkJX19wdXRfdXNlcl91bmFsaWduZWQoZF9vZmYsICZsYXN0ZGlyZW50LT5kX29mZik7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJaWYgKF9fcHV0X3VzZXJfdW5hbGlnbmVkKGRfb2ZmLCAmbGFzdGRpcmVudC0+ZF9vZmYpKQorCQkJZ290byBvdXRfcHV0ZjsKIAkJZXJyb3IgPSBjb3VudCAtIGJ1Zi5jb3VudDsKIAl9CiAKQEAgLTEyNTUsNyArMTI1OSw3IEBACiAJaWYgKGlvdiAhPSBpb3ZzdGFjaykKIAkJa2ZyZWUoaW92KTsKIAlpZiAoKHJldCArICh0eXBlID09IFJFQUQpKSA+IDApIHsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJCWlmICh0eXBlID09IFJFQUQpCiAJCQlmc25vdGlmeV9hY2Nlc3MoZGVudHJ5KTsKIAkJZWxzZQpAQCAtMTYwOSwxNCArMTYxMywxNCBAQAogCQluciAmPSB+MVVMOwogCQl3aGlsZSAobnIpIHsKIAkJCXVuc2lnbmVkIGxvbmcgaCwgbDsKLQkJCV9fZ2V0X3VzZXIobCwgdWZkc2V0KTsKLQkJCV9fZ2V0X3VzZXIoaCwgdWZkc2V0KzEpOworCQkJaWYgKF9fZ2V0X3VzZXIobCwgdWZkc2V0KSB8fCBfX2dldF91c2VyKGgsIHVmZHNldCsxKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXVmZHNldCArPSAyOwogCQkJKmZkc2V0KysgPSBoIDw8IDMyIHwgbDsKIAkJCW5yIC09IDI7CiAJCX0KLQkJaWYgKG9kZCkKLQkJCV9fZ2V0X3VzZXIoKmZkc2V0LCB1ZmRzZXQpOworCQlpZiAob2RkICYmIF9fZ2V0X3VzZXIoKmZkc2V0LCB1ZmRzZXQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfSBlbHNlIHsKIAkJLyogVHJpY2t5LCBtdXN0IGNsZWFyIGZ1bGwgdW5zaWduZWQgbG9uZyBpbiB0aGUKIAkJICoga2VybmVsIGZkc2V0IGF0IHRoZSBlbmQsIHRoaXMgbWFrZXMgc3VyZSB0aGF0CkBAIC0xNjI4LDE0ICsxNjMyLDE0IEBACiB9CiAKIHN0YXRpYwotdm9pZCBjb21wYXRfc2V0X2ZkX3NldCh1bnNpZ25lZCBsb25nIG5yLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKnVmZHNldCwKLQkJCXVuc2lnbmVkIGxvbmcgKmZkc2V0KQoraW50IGNvbXBhdF9zZXRfZmRfc2V0KHVuc2lnbmVkIGxvbmcgbnIsIGNvbXBhdF91bG9uZ190IF9fdXNlciAqdWZkc2V0LAorCQkgICAgICB1bnNpZ25lZCBsb25nICpmZHNldCkKIHsKIAl1bnNpZ25lZCBsb25nIG9kZDsKIAluciA9IFJPVU5EX1VQKG5yLCBfX0NPTVBBVF9ORkRCSVRTKTsKIAogCWlmICghdWZkc2V0KQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJb2RkID0gbnIgJiAxVUw7CiAJbnIgJj0gfjFVTDsKQEAgLTE2NDMsMTMgKzE2NDcsMTQgQEAKIAkJdW5zaWduZWQgbG9uZyBoLCBsOwogCQlsID0gKmZkc2V0Kys7CiAJCWggPSBsID4+IDMyOwotCQlfX3B1dF91c2VyKGwsIHVmZHNldCk7Ci0JCV9fcHV0X3VzZXIoaCwgdWZkc2V0KzEpOworCQlpZiAoX19wdXRfdXNlcihsLCB1ZmRzZXQpIHx8IF9fcHV0X3VzZXIoaCwgdWZkc2V0KzEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXVmZHNldCArPSAyOwogCQluciAtPSAyOwogCX0KLQlpZiAob2RkKQotCQlfX3B1dF91c2VyKCpmZHNldCwgdWZkc2V0KTsKKwlpZiAob2RkICYmIF9fcHV0X3VzZXIoKmZkc2V0LCB1ZmRzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xNjc0LDE5ICsxNjc5LDE5IEBACiB7CiAJZmRfc2V0X2JpdHMgZmRzOwogCWNoYXIgKmJpdHM7Ci0JaW50IHNpemUsIG1heF9mZHNldCwgcmV0ID0gLUVJTlZBTDsKKwlpbnQgc2l6ZSwgbWF4X2ZkcywgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJaWYgKG4gPCAwKQogCQlnb3RvIG91dF9ub2ZkczsKIAotCS8qIG1heF9mZHNldCBjYW4gaW5jcmVhc2UsIHNvIGdyYWIgaXQgb25jZSB0byBhdm9pZCByYWNlICovCisJLyogbWF4X2ZkcyBjYW4gaW5jcmVhc2UsIHNvIGdyYWIgaXQgb25jZSB0byBhdm9pZCByYWNlICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWZkdCA9IGZpbGVzX2ZkdGFibGUoY3VycmVudC0+ZmlsZXMpOwotCW1heF9mZHNldCA9IGZkdC0+bWF4X2Zkc2V0OworCW1heF9mZHMgPSBmZHQtPm1heF9mZHM7CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JaWYgKG4gPiBtYXhfZmRzZXQpCi0JCW4gPSBtYXhfZmRzZXQ7CisJaWYgKG4gPiBtYXhfZmRzKQorCQluID0gbWF4X2ZkczsKIAogCS8qCiAJICogV2UgbmVlZCA2IGJpdG1hcHMgKGluL291dC9leCBmb3IgYm90aCBpbmNvbWluZyBhbmQgb3V0Z29pbmcpLApAQCAtMTcyNCwxMCArMTcyOSwxMCBAQAogCQlyZXQgPSAwOwogCX0KIAotCWNvbXBhdF9zZXRfZmRfc2V0KG4sIGlucCwgZmRzLnJlc19pbik7Ci0JY29tcGF0X3NldF9mZF9zZXQobiwgb3V0cCwgZmRzLnJlc19vdXQpOwotCWNvbXBhdF9zZXRfZmRfc2V0KG4sIGV4cCwgZmRzLnJlc19leCk7Ci0KKwlpZiAoY29tcGF0X3NldF9mZF9zZXQobiwgaW5wLCBmZHMucmVzX2luKSB8fAorCSAgICBjb21wYXRfc2V0X2ZkX3NldChuLCBvdXRwLCBmZHMucmVzX291dCkgfHwKKwkgICAgY29tcGF0X3NldF9mZF9zZXQobiwgZXhwLCBmZHMucmVzX2V4KSkKKwkJcmV0ID0gLUVGQVVMVDsKIG91dDoKIAlrZnJlZShiaXRzKTsKIG91dF9ub2ZkczoKQEAgLTE4MzUsOSArMTg0MCwxMiBAQAogCiAJfSB3aGlsZSAoIXJldCAmJiAhdGltZW91dCAmJiB0c3AgJiYgKHRzLnR2X3NlYyB8fCB0cy50dl9uc2VjKSk7CiAKLQlpZiAocmV0ID09IDAgJiYgdHNwICYmICEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBTVElDS1lfVElNRU9VVFMpKSB7CisJaWYgKHRzcCkgewogCQlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHJ0czsKIAorCQlpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgJiBTVElDS1lfVElNRU9VVFMpCisJCQlnb3RvIHN0aWNreTsKKwogCQlydHMudHZfc2VjID0gdGltZW91dCAvIEhaOwogCQlydHMudHZfbnNlYyA9ICh0aW1lb3V0ICUgSFopICogKE5TRUNfUEVSX1NFQy9IWik7CiAJCWlmIChydHMudHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpIHsKQEAgLTE4NDYsOCArMTg1NCwxOSBAQAogCQl9CiAJCWlmIChjb21wYXRfdGltZXNwZWNfY29tcGFyZSgmcnRzLCAmdHMpID49IDApCiAJCQlydHMgPSB0czsKLQkJaWYgKGNvcHlfdG9fdXNlcih0c3AsICZydHMsIHNpemVvZihydHMpKSkKLQkJCXJldCA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIodHNwLCAmcnRzLCBzaXplb2YocnRzKSkpIHsKK3N0aWNreToKKwkJCS8qCisJCQkgKiBJZiBhbiBhcHBsaWNhdGlvbiBwdXRzIGl0cyB0aW1ldmFsIGluIHJlYWQtb25seQorCQkJICogbWVtb3J5LCB3ZSBkb24ndCB3YW50IHRoZSBMaW51eC1zcGVjaWZpYyB1cGRhdGUgdG8KKwkJCSAqIHRoZSB0aW1ldmFsIHRvIGNhdXNlIGEgZmF1bHQgYWZ0ZXIgdGhlIHNlbGVjdCBoYXMKKwkJCSAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIEhvd2V2ZXIsIGJlY2F1c2Ugd2UncmUgbm90CisJCQkgKiB1cGRhdGluZyB0aGUgdGltZXZhbCwgd2UgY2FuJ3QgcmVzdGFydCB0aGUgc3lzdGVtCisJCQkgKiBjYWxsLgorCQkJICovCisJCQlpZiAocmV0ID09IC1FUkVTVEFSVE5PSEFORCkKKwkJCQlyZXQgPSAtRUlOVFI7CisJCX0KIAl9CiAKIAlpZiAocmV0ID09IC1FUkVTVEFSVE5PSEFORCkgewpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCBhOTFmMjYyLi5jODFjOTU4IDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtMjExLDggKzIxMSwxMCBAQAogCXVwX25hdGl2ZSA9CiAJCWNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgdmlkZW9fc3RpbGxfcGljdHVyZSkpOwogCi0JcHV0X3VzZXIoY29tcGF0X3B0cihmcCksICZ1cF9uYXRpdmUtPmlGcmFtZSk7Ci0JcHV0X3VzZXIoc2l6ZSwgJnVwX25hdGl2ZS0+c2l6ZSk7CisJZXJyID0gIHB1dF91c2VyKGNvbXBhdF9wdHIoZnApLCAmdXBfbmF0aXZlLT5pRnJhbWUpOworCWVyciB8PSBwdXRfdXNlcihzaXplLCAmdXBfbmF0aXZlLT5zaXplKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKIAogCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgdXBfbmF0aXZlKTsKIApAQCAtMjM2LDggKzIzOCwxMCBAQAogCWVyciB8PSBnZXRfdXNlcihsZW5ndGgsICZ1cC0+bGVuZ3RoKTsKIAogCXVwX25hdGl2ZSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgdmlkZW9fc3B1X3BhbGV0dGUpKTsKLQlwdXRfdXNlcihjb21wYXRfcHRyKHBhbHApLCAmdXBfbmF0aXZlLT5wYWxldHRlKTsKLQlwdXRfdXNlcihsZW5ndGgsICZ1cF9uYXRpdmUtPmxlbmd0aCk7CisJZXJyICA9IHB1dF91c2VyKGNvbXBhdF9wdHIocGFscCksICZ1cF9uYXRpdmUtPnBhbGV0dGUpOworCWVyciB8PSBwdXRfdXNlcihsZW5ndGgsICZ1cF9uYXRpdmUtPmxlbmd0aCk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHVwX25hdGl2ZSk7CiAKQEAgLTExNzMsNyArMTE3Nyw3IEBACiBzdGF0aWMgaW50IHZ0X2NoZWNrKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCQogCWlmIChmaWxlLT5mX29wLT5pb2N0bCAhPSB0dHlfaW9jdGwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjA0MywxNiArMjA0NywxOSBAQAogICAgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzczsKICAgICAgICAgbW1fc2VnbWVudF90IG9sZHNlZyA9IGdldF9mcygpOwogICAgICAgICBfX3UzMiB1ZGF0YTsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKIAogICAgICAgICBpZiAoY21kID09IFRJT0NTU0VSSUFMKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNzMzIsIHNpemVvZihTUzMyKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgICBpZiAoX19jb3B5X2Zyb21fdXNlcigmc3MsIHNzMzIsIG9mZnNldG9mKFNTMzIsIGlvbWVtX2Jhc2UpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIF9fZ2V0X3VzZXIodWRhdGEsICZzczMyLT5pb21lbV9iYXNlKTsKKyAgICAgICAgICAgICAgICBpZiAoX19nZXRfdXNlcih1ZGF0YSwgJnNzMzItPmlvbWVtX2Jhc2UpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICAgc3MuaW9tZW1fYmFzZSA9IGNvbXBhdF9wdHIodWRhdGEpOwotICAgICAgICAgICAgICAgIF9fZ2V0X3VzZXIoc3MuaW9tZW1fcmVnX3NoaWZ0LCAmc3MzMi0+aW9tZW1fcmVnX3NoaWZ0KTsKLSAgICAgICAgICAgICAgICBfX2dldF91c2VyKHNzLnBvcnRfaGlnaCwgJnNzMzItPnBvcnRfaGlnaCk7CisgICAgICAgICAgICAgICAgaWYgKF9fZ2V0X3VzZXIoc3MuaW9tZW1fcmVnX3NoaWZ0LCAmc3MzMi0+aW9tZW1fcmVnX3NoaWZ0KSB8fAorCQkgICAgX19nZXRfdXNlcihzcy5wb3J0X2hpZ2gsICZzczMyLT5wb3J0X2hpZ2gpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICAgc3MuaW9tYXBfYmFzZSA9IDBVTDsKICAgICAgICAgfQogICAgICAgICBzZXRfZnMoS0VSTkVMX0RTKTsKQEAgLTIwNjMsMTIgKzIwNzAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgIGlmIChfX2NvcHlfdG9fdXNlcihzczMyLCZzcyxvZmZzZXRvZihTUzMyLGlvbWVtX2Jhc2UpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpc3MuaW9tZW1fYmFzZSAgPj4gMzIgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYgOiAodW5zaWduZWQpKHVuc2lnbmVkIGxvbmcpc3MuaW9tZW1fYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3MzMi0+aW9tZW1fYmFzZSk7Ci0gICAgICAgICAgICAgICAgX19wdXRfdXNlcihzcy5pb21lbV9yZWdfc2hpZnQsICZzczMyLT5pb21lbV9yZWdfc2hpZnQpOwotICAgICAgICAgICAgICAgIF9fcHV0X3VzZXIoc3MucG9ydF9oaWdoLCAmc3MzMi0+cG9ydF9oaWdoKTsKLQorCQliYXNlID0gKHVuc2lnbmVkIGxvbmcpc3MuaW9tZW1fYmFzZSAgPj4gMzIgPworCQkJMHhmZmZmZmZmZiA6ICh1bnNpZ25lZCkodW5zaWduZWQgbG9uZylzcy5pb21lbV9iYXNlOworCQlpZiAoX19wdXRfdXNlcihiYXNlLCAmc3MzMi0+aW9tZW1fYmFzZSkgfHwKKwkJICAgIF9fcHV0X3VzZXIoc3MuaW9tZW1fcmVnX3NoaWZ0LCAmc3MzMi0+aW9tZW1fcmVnX3NoaWZ0KSB8fAorCQkgICAgX19wdXRfdXNlcihzcy5wb3J0X2hpZ2gsICZzczMyLT5wb3J0X2hpZ2gpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTIzOTcsNiArMjQwNCw3IEBACiBIQU5ETEVfSU9DVEwoU0lPQ1NJRk1BUCwgZGV2X2lmc2lvYykKIEhBTkRMRV9JT0NUTChTSU9DR0lGQUREUiwgZGV2X2lmc2lvYykKIEhBTkRMRV9JT0NUTChTSU9DU0lGQUREUiwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DU0lGSFdCUk9BRENBU1QsIGRldl9pZnNpb2MpCiAKIC8qIGlvY3RscyB1c2VkIGJ5IGFwcGxldGFsayBkZHAuYyAqLwogSEFORExFX0lPQ1RMKFNJT0NBVEFMS0RJRkFERFIsIGRldl9pZnNpb2MpCmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oIGIvZnMvY29uZmlnZnMvY29uZmlnZnNfaW50ZXJuYWwuaAppbmRleCAzZjRmZjdhLi5mOTJjZDMwIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oCisrKyBiL2ZzL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2ludGVybmFsLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKICNkZWZpbmUgQ09ORklHRlNfTk9UX1BJTk5FRAkoQ09ORklHRlNfSVRFTV9BVFRSKQogCiBleHRlcm4gc3RydWN0IHZmc21vdW50ICogY29uZmlnZnNfbW91bnQ7Ci1leHRlcm4ga21lbV9jYWNoZV90ICpjb25maWdmc19kaXJfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpjb25maWdmc19kaXJfY2FjaGVwOwogCiBleHRlcm4gaW50IGNvbmZpZ2ZzX2lzX3Jvb3Qoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKIApkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvZGlyLmMgYi9mcy9jb25maWdmcy9kaXIuYwppbmRleCA4YTNiNmExLi4xODE0YmE0NDYgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2Rpci5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2Rpci5jCkBAIC05Myw4ICs5Myw4IEBACiAgKgogICogY2FsbGVkIHdpdGggcGFyZW50IGlub2RlJ3MgaV9tdXRleCBoZWxkCiAgKi8KLWludCBjb25maWdmc19kaXJlbnRfZXhpc3RzKHN0cnVjdCBjb25maWdmc19kaXJlbnQgKnBhcmVudF9zZCwKLQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldykKK3N0YXRpYyBpbnQgY29uZmlnZnNfZGlyZW50X2V4aXN0cyhzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpwYXJlbnRfc2QsCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXcpCiB7CiAJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIHNkOwogCkBAIC05ODAsNyArOTgwLDcgQEAKIAogc3RhdGljIGludCBjb25maWdmc19kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIHBhcmVudF9zZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAKIAltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwpAQCAtOTkzLDcgKzk5Myw3IEBACiAKIHN0YXRpYyBpbnQgY29uZmlnZnNfZGlyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICogY3Vyc29yID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJbXV0ZXhfbG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKQEAgLTEwMTMsNyArMTAxMyw3IEBACiAKIHN0YXRpYyBpbnQgY29uZmlnZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqIHBhcmVudF9zZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqY3Vyc29yID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpxID0gJmN1cnNvci0+c19zaWJsaW5nOwpAQCAtMTA3MCw3ICsxMDcwLDcgQEAKIAogc3RhdGljIGxvZmZfdCBjb25maWdmc19kaXJfbHNlZWsoc3RydWN0IGZpbGUgKiBmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQogewotCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAogCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoIChvcmlnaW4pIHsKQEAgLTEwODAsNyArMTA4MCw3IEBACiAJCQlpZiAob2Zmc2V0ID49IDApCiAJCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQltdXRleF91bmxvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwkJCW11dGV4X3VubG9jaygmZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgewpAQCAtMTE3Niw4ICsxMTc2LDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCW11dGV4X2xvY2soJmNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmNvbmZpZ2ZzX3NiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgsCisJCQkgIElfTVVURVhfUEFSRU5UKTsKKwltdXRleF9sb2NrX25lc3RlZCgmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4LCBJX01VVEVYX0NISUxEKTsKIAlpZiAoY29uZmlnZnNfZGV0YWNoX3ByZXAoZGVudHJ5KSkgewogCQlwcmludGsoS0VSTl9FUlIgImNvbmZpZ2ZzOiBUcmllZCB0byB1bnJlZ2lzdGVyIG5vbi1lbXB0eSBzdWJzeXN0ZW0hXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9maWxlLmMgYi9mcy9jb25maWdmcy9maWxlLmMKaW5kZXggZTZkNTc1NC4uMmE3Y2IwOCAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvZmlsZS5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2ZpbGUuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIAlkb3duKCZidWZmZXItPnNlbSk7CiAJaWYgKGJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsKSB7Ci0JCWlmICgocmV0dmFsID0gZmlsbF9yZWFkX2J1ZmZlcihmaWxlLT5mX2RlbnRyeSxidWZmZXIpKSkKKwkJaWYgKChyZXR2YWwgPSBmaWxsX3JlYWRfYnVmZmVyKGZpbGUtPmZfcGF0aC5kZW50cnksYnVmZmVyKSkpCiAJCQlnb3RvIG91dDsKIAl9CiAJcHJfZGVidWcoIiVzOiBjb3VudCA9ICV6ZCwgcHBvcyA9ICVsbGQsIGJ1ZiA9ICVzXG4iLApAQCAtMjIyLDcgKzIyMiw3IEBACiAJZG93bigmYnVmZmVyLT5zZW0pOwogCWxlbiA9IGZpbGxfd3JpdGVfYnVmZmVyKGJ1ZmZlciwgYnVmLCBjb3VudCk7CiAJaWYgKGxlbiA+IDApCi0JCWxlbiA9IGZsdXNoX3dyaXRlX2J1ZmZlcihmaWxlLT5mX2RlbnRyeSwgYnVmZmVyLCBjb3VudCk7CisJCWxlbiA9IGZsdXNoX3dyaXRlX2J1ZmZlcihmaWxlLT5mX3BhdGguZGVudHJ5LCBidWZmZXIsIGNvdW50KTsKIAlpZiAobGVuID4gMCkKIAkJKnBwb3MgKz0gbGVuOwogCXVwKCZidWZmZXItPnNlbSk7CkBAIC0yMzEsOCArMjMxLDggQEAKIAogc3RhdGljIGludCBjaGVja19wZXJtKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCiB7Ci0Jc3RydWN0IGNvbmZpZ19pdGVtICppdGVtID0gY29uZmlnZnNfZ2V0X2NvbmZpZ19pdGVtKGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudCk7Ci0Jc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSAqIGF0dHIgPSB0b19hdHRyKGZpbGUtPmZfZGVudHJ5KTsKKwlzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0gPSBjb25maWdmc19nZXRfY29uZmlnX2l0ZW0oZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQpOworCXN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKiBhdHRyID0gdG9fYXR0cihmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAlzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyICogYnVmZmVyOwogCXN0cnVjdCBjb25maWdmc19pdGVtX29wZXJhdGlvbnMgKiBvcHMgPSBOVUxMOwogCWludCBlcnJvciA9IDA7CkBAIC0yNzUsMTMgKzI3NSwxNCBAQAogCSAqIGl0IGluIGZpbGUtPnByaXZhdGVfZGF0YSBmb3IgZWFzeSBhY2Nlc3MuCiAJICovCiAJYnVmZmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbmZpZ2ZzX2J1ZmZlciksR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZmZlcikgewotCQlpbml0X01VVEVYKCZidWZmZXItPnNlbSk7Ci0JCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMTsKLQkJYnVmZmVyLT5vcHMgPSBvcHM7Ci0JCWZpbGUtPnByaXZhdGVfZGF0YSA9IGJ1ZmZlcjsKLQl9IGVsc2UKKwlpZiAoIWJ1ZmZlcikgewogCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gRW5vbWVtOworCX0KKwlpbml0X01VVEVYKCZidWZmZXItPnNlbSk7CisJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAxOworCWJ1ZmZlci0+b3BzID0gb3BzOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGJ1ZmZlcjsKIAlnb3RvIERvbmU7CiAKICBFaW52YWw6CkBAIC0yODksNiArMjkwLDcgQEAKIAlnb3RvIERvbmU7CiAgRWFjY2VzczoKIAllcnJvciA9IC1FQUNDRVM7CisgRW5vbWVtOgogCW1vZHVsZV9wdXQoYXR0ci0+Y2Ffb3duZXIpOwogIERvbmU6CiAJaWYgKGVycm9yICYmIGl0ZW0pCkBAIC0zMDMsOCArMzA1LDggQEAKIAogc3RhdGljIGludCBjb25maWdmc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0Jc3RydWN0IGNvbmZpZ19pdGVtICogaXRlbSA9IHRvX2l0ZW0oZmlscC0+Zl9kZW50cnktPmRfcGFyZW50KTsKLQlzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlICogYXR0ciA9IHRvX2F0dHIoZmlscC0+Zl9kZW50cnkpOworCXN0cnVjdCBjb25maWdfaXRlbSAqIGl0ZW0gPSB0b19pdGVtKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlICogYXR0ciA9IHRvX2F0dHIoZmlscC0+Zl9wYXRoLmRlbnRyeSk7CiAJc3RydWN0IG1vZHVsZSAqIG93bmVyID0gYXR0ci0+Y2Ffb3duZXI7CiAJc3RydWN0IGNvbmZpZ2ZzX2J1ZmZlciAqIGJ1ZmZlciA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIApkaWZmIC0tZ2l0IGEvZnMvY29uZmlnZnMvbW91bnQuYyBiL2ZzL2NvbmZpZ2ZzL21vdW50LmMKaW5kZXggNjhiZDVjOS4uZWQ2Nzg1MiAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvbW91bnQuYworKysgYi9mcy9jb25maWdmcy9tb3VudC5jCkBAIC0zOCw3ICszOCw3IEBACiAKIHN0cnVjdCB2ZnNtb3VudCAqIGNvbmZpZ2ZzX21vdW50ID0gTlVMTDsKIHN0cnVjdCBzdXBlcl9ibG9jayAqIGNvbmZpZ2ZzX3NiID0gTlVMTDsKLWttZW1fY2FjaGVfdCAqY29uZmlnZnNfZGlyX2NhY2hlcDsKK3N0cnVjdCBrbWVtX2NhY2hlICpjb25maWdmc19kaXJfY2FjaGVwOwogc3RhdGljIGludCBjb25maWdmc19tbnRfY291bnQgPSAwOwogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY29uZmlnZnNfb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL2lub2RlLmMgYi9mcy9jcmFtZnMvaW5vZGUuYwppbmRleCBhNjI0YzNlLi42ZGIwM2ZiIDEwMDY0NAotLS0gYS9mcy9jcmFtZnMvaW5vZGUuYworKysgYi9mcy9jcmFtZnMvaW5vZGUuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgY3JhbWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAljaGFyICpidWY7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKQEAgLTQ4MSw2ICs0ODEsOCBAQAogCQlwZ2RhdGEgPSBrbWFwKHBhZ2UpOwogCQlpZiAoY29tcHJfbGVuID09IDApCiAJCQk7IC8qIGhvbGUgKi8KKwkJZWxzZSBpZiAoY29tcHJfbGVuID4gKFBBR0VfQ0FDSEVfU0laRSA8PCAxKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiY3JhbWZzOiBiYWQgY29tcHJlc3NlZCBibG9ja3NpemUgJXVcbiIsIGNvbXByX2xlbik7CiAJCWVsc2UgewogCQkJbXV0ZXhfbG9jaygmcmVhZF9tdXRleCk7CiAJCQlieXRlc19maWxsZWQgPSBjcmFtZnNfdW5jb21wcmVzc19ibG9jayhwZ2RhdGEsCmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IDJiYWM0YmEuLmQ2ODYzMWYgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC00Myw3ICs0Myw3IEBACiAKIEVYUE9SVF9TWU1CT0woZGNhY2hlX2xvY2spOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICpkZW50cnlfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZGVudHJ5X2NhY2hlIF9fcmVhZF9tb3N0bHk7CiAKICNkZWZpbmUgRE5BTUVfSU5MSU5FX0xFTiAoc2l6ZW9mKHN0cnVjdCBkZW50cnkpLW9mZnNldG9mKHN0cnVjdCBkZW50cnksZF9pbmFtZSkpCiAKQEAgLTY4LDE1ICs2OCwxOSBAQAogCS5hZ2VfbGltaXQgPSA0NSwKIH07CiAKLXN0YXRpYyB2b2lkIGRfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpoZWFkKQorc3RhdGljIHZvaWQgX19kX2ZyZWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewotCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGRlbnRyeSwgZF91LmRfcmN1KTsKLQogCWlmIChkbmFtZV9leHRlcm5hbChkZW50cnkpKQogCQlrZnJlZShkZW50cnktPmRfbmFtZS5uYW1lKTsKIAlrbWVtX2NhY2hlX2ZyZWUoZGVudHJ5X2NhY2hlLCBkZW50cnkpOyAKIH0KIAorc3RhdGljIHZvaWQgZF9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9yY3UpOworCV9fZF9mcmVlKGRlbnRyeSk7Cit9CisKIC8qCiAgKiBubyBkY2FjaGVfbG9jaywgcGxlYXNlLiAgVGhlIGNhbGxlciBtdXN0IGRlY3JlbWVudCBkZW50cnlfc3RhdC5ucl9kZW50cnkKICAqIGluc2lkZSBkY2FjaGVfbG9jay4KQEAgLTg1LDcgKzg5LDExIEBACiB7CiAJaWYgKGRlbnRyeS0+ZF9vcCAmJiBkZW50cnktPmRfb3AtPmRfcmVsZWFzZSkKIAkJZGVudHJ5LT5kX29wLT5kX3JlbGVhc2UoZGVudHJ5KTsKLSAJY2FsbF9yY3UoJmRlbnRyeS0+ZF91LmRfcmN1LCBkX2NhbGxiYWNrKTsKKwkvKiBpZiBkZW50cnkgd2FzIG5ldmVyIGluc2VydGVkIGludG8gaGFzaCwgaW1tZWRpYXRlIGZyZWUgaXMgT0sgKi8KKwlpZiAoZGVudHJ5LT5kX2hhc2gucHByZXYgPT0gTlVMTCkKKwkJX19kX2ZyZWUoZGVudHJ5KTsKKwllbHNlCisJCWNhbGxfcmN1KCZkZW50cnktPmRfdS5kX3JjdSwgZF9jYWxsYmFjayk7CiB9CiAKIC8qCkBAIC00NzgsMTEgKzQ4NiwxMiBAQAogCQkJdXBfcmVhZChzX3Vtb3VudCk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQkJLyogQ2Fubm90IHJlbW92ZSB0aGUgZmlyc3QgZGVudHJ5LCBhbmQgaXQgaXNuJ3QgYXBwcm9wcmlhdGUKLQkJICogdG8gbW92ZSBpdCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgc28gZ2l2ZSB1cCwgYW5kIHRyeQotCQkgKiBsYXRlcgorCQkvKgorCQkgKiBJbnNlcnQgZGVudHJ5IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0IGFzIGluc2VydGluZyBhdCB0aGUKKwkJICogdGFpbCBsZWFkcyB0byBhIGN5Y2xlLgogCQkgKi8KLQkJYnJlYWs7CisgCQlsaXN0X2FkZCgmZGVudHJ5LT5kX2xydSwgJmRlbnRyeV91bnVzZWQpOworCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKIAl9CiAJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKIH0KQEAgLTU1Niw2ICs1NjUsNyBAQAogc3RhdGljIHZvaWQgc2hyaW5rX2RjYWNoZV9mb3JfdW1vdW50X3N1YnRyZWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwl1bnNpZ25lZCBkZXRhY2hlZCA9IDA7CiAKIAlCVUdfT04oIUlTX1JPT1QoZGVudHJ5KSk7CiAKQEAgLTYyMCw3ICs2MzAsNyBAQAogCQkJCWF0b21pY19kZWMoJnBhcmVudC0+ZF9jb3VudCk7CiAKIAkJCWxpc3RfZGVsKCZkZW50cnktPmRfdS5kX2NoaWxkKTsKLQkJCWRlbnRyeV9zdGF0Lm5yX2RlbnRyeS0tOwkvKiBGb3IgZF9mcmVlLCBiZWxvdyAqLworCQkJZGV0YWNoZWQrKzsKIAogCQkJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJCQlpZiAoaW5vZGUpIHsKQEAgLTYzOCw3ICs2NDgsNyBAQAogCQkJICogb3RoZXJ3aXNlIHdlIGFzY2VuZCB0byB0aGUgcGFyZW50IGFuZCBtb3ZlIHRvIHRoZQogCQkJICogbmV4dCBzaWJsaW5nIGlmIHRoZXJlIGlzIG9uZSAqLwogCQkJaWYgKCFwYXJlbnQpCi0JCQkJcmV0dXJuOworCQkJCWdvdG8gb3V0OwogCiAJCQlkZW50cnkgPSBwYXJlbnQ7CiAKQEAgLTY0Nyw2ICs2NTcsMTEgQEAKIAkJZGVudHJ5ID0gbGlzdF9lbnRyeShkZW50cnktPmRfc3ViZGlycy5uZXh0LAogCQkJCSAgICBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7CiAJfQorb3V0OgorCS8qIHNldmVyYWwgZGVudHJpZXMgd2VyZSBmcmVlZCwgbmVlZCB0byBjb3JyZWN0IG5yX2RlbnRyeSAqLworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWRlbnRyeV9zdGF0Lm5yX2RlbnRyeSAtPSBkZXRhY2hlZDsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogfQogCiAvKgpAQCAtMTQ2OSwyMyArMTQ4NCwyMSBAQAogICogZGVsZXRlZCBpdC4KICAqLwogIAotLyoqCi0gKiBkX21vdmUgLSBtb3ZlIGEgZGVudHJ5CisvKgorICogZF9tb3ZlX2xvY2tlZCAtIG1vdmUgYSBkZW50cnkKICAqIEBkZW50cnk6IGVudHJ5IHRvIG1vdmUKICAqIEB0YXJnZXQ6IG5ldyBkZW50cnkKICAqCiAgKiBVcGRhdGUgdGhlIGRjYWNoZSB0byByZWZsZWN0IHRoZSBtb3ZlIG9mIGEgZmlsZSBuYW1lLiBOZWdhdGl2ZQogICogZGNhY2hlIGVudHJpZXMgc2hvdWxkIG5vdCBiZSBtb3ZlZCBpbiB0aGlzIHdheS4KICAqLwotCi12b2lkIGRfbW92ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICogdGFyZ2V0KQorc3RhdGljIHZvaWQgZF9tb3ZlX2xvY2tlZChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICogdGFyZ2V0KQogewogCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0OwogCiAJaWYgKCFkZW50cnktPmRfaW5vZGUpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZGUzogbW92aW5nIG5lZ2F0aXZlIGRjYWNoZSBlbnRyeVxuIik7CiAKLQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKIAl3cml0ZV9zZXFsb2NrKCZyZW5hbWVfbG9jayk7CiAJLyoKIAkgKiBYWFhYOiBkbyB3ZSByZWFsbHkgbmVlZCB0byB0YWtlIHRhcmdldC0+ZF9sb2NrPwpAQCAtMTUzNiwxMCArMTU0OSw4NCBAQAogCWZzbm90aWZ5X2RfbW92ZShkZW50cnkpOwogCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJd3JpdGVfc2VxdW5sb2NrKCZyZW5hbWVfbG9jayk7Cit9CisKKy8qKgorICogZF9tb3ZlIC0gbW92ZSBhIGRlbnRyeQorICogQGRlbnRyeTogZW50cnkgdG8gbW92ZQorICogQHRhcmdldDogbmV3IGRlbnRyeQorICoKKyAqIFVwZGF0ZSB0aGUgZGNhY2hlIHRvIHJlZmxlY3QgdGhlIG1vdmUgb2YgYSBmaWxlIG5hbWUuIE5lZ2F0aXZlCisgKiBkY2FjaGUgZW50cmllcyBzaG91bGQgbm90IGJlIG1vdmVkIGluIHRoaXMgd2F5LgorICovCisKK3ZvaWQgZF9tb3ZlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBkZW50cnkgKiB0YXJnZXQpCit7CisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJZF9tb3ZlX2xvY2tlZChkZW50cnksIHRhcmdldCk7CiAJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKIH0KIAogLyoKKyAqIEhlbHBlciB0aGF0IHJldHVybnMgMSBpZiBwMSBpcyBhIHBhcmVudCBvZiBwMiwgZWxzZSAwCisgKi8KK3N0YXRpYyBpbnQgZF9pc3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpwMSwgc3RydWN0IGRlbnRyeSAqcDIpCit7CisJc3RydWN0IGRlbnRyeSAqcDsKKworCWZvciAocCA9IHAyOyBwLT5kX3BhcmVudCAhPSBwOyBwID0gcC0+ZF9wYXJlbnQpIHsKKwkJaWYgKHAtPmRfcGFyZW50ID09IHAxKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBoZWxwZXIgYXR0ZW1wdHMgdG8gY29wZSB3aXRoIHJlbW90ZWx5IHJlbmFtZWQgZGlyZWN0b3JpZXMKKyAqCisgKiBJdCBhc3N1bWVzIHRoYXQgdGhlIGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcKKyAqIGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXggYW5kIHRoZSBkY2FjaGVfbG9jaworICoKKyAqIE5vdGU6IElmIGV2ZXIgdGhlIGxvY2tpbmcgaW4gbG9ja19yZW5hbWUoKSBjaGFuZ2VzLCB0aGVuIHBsZWFzZQorICogcmVtZW1iZXIgdG8gdXBkYXRlIHRoaXMgdG9vLi4uCisgKgorICogT24gcmV0dXJuLCBkY2FjaGVfbG9jayB3aWxsIGhhdmUgYmVlbiB1bmxvY2tlZC4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKl9fZF91bmFsaWFzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqYWxpYXMpCit7CisJc3RydWN0IG11dGV4ICptMSA9IE5VTEwsICptMiA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqcmV0OworCisJLyogSWYgYWxpYXMgYW5kIGRlbnRyeSBzaGFyZSBhIHBhcmVudCwgdGhlbiBubyBleHRyYSBsb2NrcyByZXF1aXJlZCAqLworCWlmIChhbGlhcy0+ZF9wYXJlbnQgPT0gZGVudHJ5LT5kX3BhcmVudCkKKwkJZ290byBvdXRfdW5hbGlhczsKKworCS8qIENoZWNrIGZvciBsb29wcyAqLworCXJldCA9IEVSUl9QVFIoLUVMT09QKTsKKwlpZiAoZF9pc3BhcmVudChhbGlhcywgZGVudHJ5KSkKKwkJZ290byBvdXRfZXJyOworCisJLyogU2VlIGxvY2tfcmVuYW1lKCkgKi8KKwlyZXQgPSBFUlJfUFRSKC1FQlVTWSk7CisJaWYgKCFtdXRleF90cnlsb2NrKCZkZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9tdXRleCkpCisJCWdvdG8gb3V0X2VycjsKKwltMSA9ICZkZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9tdXRleDsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmFsaWFzLT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCkpCisJCWdvdG8gb3V0X2VycjsKKwltMiA9ICZhbGlhcy0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXg7CitvdXRfdW5hbGlhczoKKwlkX21vdmVfbG9ja2VkKGFsaWFzLCBkZW50cnkpOworCXJldCA9IGFsaWFzOworb3V0X2VycjoKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCWlmIChtMikKKwkJbXV0ZXhfdW5sb2NrKG0yKTsKKwlpZiAobTEpCisJCW11dGV4X3VubG9jayhtMSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIFByZXBhcmUgYW4gYW5vbnltb3VzIGRlbnRyeSBmb3IgbGlmZSBpbiB0aGUgc3VwZXJibG9jaydzIGRlbnRyeSB0cmVlIGFzIGEKICAqIG5hbWVkIGRlbnRyeSBpbiBwbGFjZSBvZiB0aGUgZGVudHJ5IHRvIGJlIHJlcGxhY2VkLgogICovCkBAIC0xNTgxLDcgKzE2NjgsNyBAQAogICovCiBzdHJ1Y3QgZGVudHJ5ICpkX21hdGVyaWFsaXNlX3VuaXF1ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqYWxpYXMsICphY3R1YWw7CisJc3RydWN0IGRlbnRyeSAqYWN0dWFsOwogCiAJQlVHX09OKCFkX3VuaGFzaGVkKGRlbnRyeSkpOwogCkBAIC0xNTkzLDI2ICsxNjgwLDI3IEBACiAJCWdvdG8gZm91bmRfbG9jazsKIAl9CiAKLQkvKiBTZWUgaWYgYSBkaXNjb25uZWN0ZWQgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIGFzIGFuIGFub255bW91cyByb290Ci0JICogdGhhdCB3ZSBzaG91bGQgc3BsaWNlIGludG8gdGhlIHRyZWUgaW5zdGVhZCAqLwotCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIChhbGlhcyA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAxKSkpIHsKLQkJc3Bpbl9sb2NrKCZhbGlhcy0+ZF9sb2NrKTsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKIAotCQkvKiBJcyB0aGlzIGEgbW91bnRwb2ludCB0aGF0IHdlIGNvdWxkIHNwbGljZSBpbnRvIG91ciB0cmVlPyAqLwotCQlpZiAoSVNfUk9PVChhbGlhcykpCi0JCQlnb3RvIGNvbm5lY3RfbW91bnRwb2ludDsKLQotCQlpZiAoYWxpYXMtPmRfbmFtZS5sZW4gPT0gZGVudHJ5LT5kX25hbWUubGVuICYmCi0JCSAgICBhbGlhcy0+ZF9wYXJlbnQgPT0gZGVudHJ5LT5kX3BhcmVudCAmJgotCQkgICAgbWVtY21wKGFsaWFzLT5kX25hbWUubmFtZSwKLQkJCSAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCQkgICBkZW50cnktPmRfbmFtZS5sZW4pID09IDApCi0JCQlnb3RvIHJlcGxhY2Vfd2l0aF9hbGlhczsKLQotCQlzcGluX3VubG9jaygmYWxpYXMtPmRfbG9jayk7Ci0KLQkJLyogRG9oISBTZWVtIHRvIGJlIGFsaWFzaW5nIGRpcmVjdG9yaWVzIGZvciBzb21lIHJlYXNvbi4uLiAqLwotCQlkcHV0KGFsaWFzKTsKKwkJLyogRG9lcyBhbiBhbGlhc2VkIGRlbnRyeSBhbHJlYWR5IGV4aXN0PyAqLworCQlhbGlhcyA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAwKTsKKwkJaWYgKGFsaWFzKSB7CisJCQlhY3R1YWwgPSBhbGlhczsKKwkJCS8qIElzIHRoaXMgYW4gYW5vbnltb3VzIG1vdW50cG9pbnQgdGhhdCB3ZSBjb3VsZCBzcGxpY2UKKwkJCSAqIGludG8gb3VyIHRyZWU/ICovCisJCQlpZiAoSVNfUk9PVChhbGlhcykpIHsKKwkJCQlzcGluX2xvY2soJmFsaWFzLT5kX2xvY2spOworCQkJCV9fZF9tYXRlcmlhbGlzZV9kZW50cnkoZGVudHJ5LCBhbGlhcyk7CisJCQkJX19kX2Ryb3AoYWxpYXMpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCQkvKiBOb3BlLCBidXQgd2UgbXVzdCghKSBhdm9pZCBkaXJlY3RvcnkgYWxpYXNpbmcgKi8KKwkJCWFjdHVhbCA9IF9fZF91bmFsaWFzKGRlbnRyeSwgYWxpYXMpOworCQkJaWYgKElTX0VSUihhY3R1YWwpKQorCQkJCWRwdXQoYWxpYXMpOworCQkJZ290byBvdXRfbm9sb2NrOworCQl9CiAJfQogCiAJLyogQWRkIGEgdW5pcXVlIHJlZmVyZW5jZSAqLwpAQCAtMTYyOCw3ICsxNzE2LDcgQEAKIAlfZF9yZWhhc2goYWN0dWFsKTsKIAlzcGluX3VubG9jaygmYWN0dWFsLT5kX2xvY2spOwogCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0KK291dF9ub2xvY2s6CiAJaWYgKGFjdHVhbCA9PSBkZW50cnkpIHsKIAkJc2VjdXJpdHlfZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNjM3LDE2ICsxNzI1LDYgQEAKIAlpcHV0KGlub2RlKTsKIAlyZXR1cm4gYWN0dWFsOwogCi0JLyogQ29udmVydCB0aGUgYW5vbnltb3VzL3Jvb3QgYWxpYXMgaW50byBhbiBvcmRpbmFyeSBkZW50cnkgKi8KLWNvbm5lY3RfbW91bnRwb2ludDoKLQlfX2RfbWF0ZXJpYWxpc2VfZGVudHJ5KGRlbnRyeSwgYWxpYXMpOwotCi0JLyogUmVwbGFjZSB0aGUgY2FuZGlkYXRlIGRlbnRyeSB3aXRoIHRoZSBhbGlhcyBpbiB0aGUgdHJlZSAqLwotcmVwbGFjZV93aXRoX2FsaWFzOgotCV9fZF9kcm9wKGFsaWFzKTsKLQlhY3R1YWwgPSBhbGlhczsKLQlnb3RvIGZvdW5kOwotCiBzaG91bGRudF9iZV9oYXNoZWQ6CiAJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKIAlCVUcoKTsKQEAgLTIwMDIsMTAgKzIwODAsMTAgQEAKIH0KIAogLyogU0xBQiBjYWNoZSBmb3IgX19nZXRuYW1lKCkgY29uc3VtZXJzICovCi1rbWVtX2NhY2hlX3QgKm5hbWVzX2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RydWN0IGttZW1fY2FjaGUgKm5hbWVzX2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCiAvKiBTTEFCIGNhY2hlIGZvciBmaWxlIHN0cnVjdHVyZXMgKi8KLWttZW1fY2FjaGVfdCAqZmlscF9jYWNoZXAgX19yZWFkX21vc3RseTsKK3N0cnVjdCBrbWVtX2NhY2hlICpmaWxwX2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCiBFWFBPUlRfU1lNQk9MKGRfZ2Vub2NpZGUpOwogCmRpZmYgLS1naXQgYS9mcy9kY29va2llcy5jIGIvZnMvZGNvb2tpZXMuYwppbmRleCAwYzRiMDY3Li4yMWFmMTYyIDEwMDY0NAotLS0gYS9mcy9kY29va2llcy5jCisrKyBiL2ZzL2Rjb29raWVzLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogc3RhdGljIExJU1RfSEVBRChkY29va2llX3VzZXJzKTsKIHN0YXRpYyBERUZJTkVfTVVURVgoZGNvb2tpZV9tdXRleCk7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpkY29va2llX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmRjb29raWVfY2FjaGUgX19yZWFkX21vc3RseTsKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpkY29va2llX2hhc2h0YWJsZSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHNpemVfdCBoYXNoX3NpemUgX19yZWFkX21vc3RseTsKIApkaWZmIC0tZ2l0IGEvZnMvZGVidWdmcy9pbm9kZS5jIGIvZnMvZGVidWdmcy9pbm9kZS5jCmluZGV4IGU3NzY3NmQuLmM2OTI0ODcgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvaW5vZGUuYworKysgYi9mcy9kZWJ1Z2ZzL2lub2RlLmMKQEAgLTIxLDggKzIxLDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogCiAjZGVmaW5lIERFQlVHRlNfTUFHSUMJMHg2NDYyNjcyMAogCkBAIC01Myw3ICs1NSw4IEBACiAJCQlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwogCi0JCQkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwkJCS8qIGRpcmVjdG9yeSBpbm9kZXMgc3RhcnQgb2ZmIHdpdGggaV9ubGluayA9PSAyCisJCQkgKiAoZm9yICIuIiBlbnRyeSkgKi8KIAkJCWluY19ubGluayhpbm9kZSk7CiAJCQlicmVhazsKIAkJfQpAQCAtODYsMTUgKzg5LDIyIEBACiAKIAltb2RlID0gKG1vZGUgJiAoU19JUldYVUdPIHwgU19JU1ZUWCkpIHwgU19JRkRJUjsKIAlyZXMgPSBkZWJ1Z2ZzX21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCAwKTsKLQlpZiAoIXJlcykKKwlpZiAoIXJlcykgewogCQlpbmNfbmxpbmsoZGlyKTsKKwkJZnNub3RpZnlfbWtkaXIoZGlyLCBkZW50cnkpOworCX0KIAlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50IGRlYnVnZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQogeworCWludCByZXM7CisKIAltb2RlID0gKG1vZGUgJiBTX0lBTExVR08pIHwgU19JRlJFRzsKLQlyZXR1cm4gZGVidWdmc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgMCk7CisJcmVzID0gZGVidWdmc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgMCk7CisJaWYgKCFyZXMpCisJCWZzbm90aWZ5X2NyZWF0ZShkaXIsIGRlbnRyeSk7CisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZGVidWdmc19wb3NpdGl2ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCkBAIC0xMzQsNyArMTQ0LDcgQEAKIAkgKiBibG9jay4gQSBwb2ludGVyIHRvIHRoYXQgaXMgaW4gdGhlIHN0cnVjdCB2ZnNtb3VudCB0aGF0IHdlCiAJICogaGF2ZSBhcm91bmQuCiAJICovCi0JaWYgKCFwYXJlbnQgKSB7CisJaWYgKCFwYXJlbnQpIHsKIAkJaWYgKGRlYnVnZnNfbW91bnQgJiYgZGVidWdmc19tb3VudC0+bW50X3NiKSB7CiAJCQlwYXJlbnQgPSBkZWJ1Z2ZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKIAkJfQpAQCAtMTQ3LDEzICsxNTcsMTQgQEAKIAkqZGVudHJ5ID0gTlVMTDsKIAltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCSpkZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLCBwYXJlbnQsIHN0cmxlbihuYW1lKSk7Ci0JaWYgKCFJU19FUlIoZGVudHJ5KSkgeworCWlmICghSVNfRVJSKCpkZW50cnkpKSB7CiAJCWlmICgobW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikKIAkJCWVycm9yID0gZGVidWdmc19ta2RpcihwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUpOwogCQllbHNlIAogCQkJZXJyb3IgPSBkZWJ1Z2ZzX2NyZWF0ZShwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUpOworCQlkcHV0KCpkZW50cnkpOwogCX0gZWxzZQotCQllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKKwkJZXJyb3IgPSBQVFJfRVJSKCpkZW50cnkpOwogCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAogCXJldHVybiBlcnJvcjsKQEAgLTE5NiwxMyArMjA3LDE1IEBACiAKIAlwcl9kZWJ1ZygiZGVidWdmczogY3JlYXRpbmcgZmlsZSAnJXMnXG4iLG5hbWUpOwogCi0JZXJyb3IgPSBzaW1wbGVfcGluX2ZzKCZkZWJ1Z19mc190eXBlLCAmZGVidWdmc19tb3VudCwgJmRlYnVnZnNfbW91bnRfY291bnQpOworCWVycm9yID0gc2ltcGxlX3Bpbl9mcygmZGVidWdfZnNfdHlwZSwgJmRlYnVnZnNfbW91bnQsCisJCQkgICAgICAmZGVidWdmc19tb3VudF9jb3VudCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGV4aXQ7CiAKIAllcnJvciA9IGRlYnVnZnNfY3JlYXRlX2J5X25hbWUobmFtZSwgbW9kZSwgcGFyZW50LCAmZGVudHJ5KTsKIAlpZiAoZXJyb3IpIHsKIAkJZGVudHJ5ID0gTlVMTDsKKwkJc2ltcGxlX3JlbGVhc2VfZnMoJmRlYnVnZnNfbW91bnQsICZkZWJ1Z2ZzX21vdW50X2NvdW50KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjYxLDYgKzI3NCw3IEBACiB2b2lkIGRlYnVnZnNfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJaW50IHJldCA9IDA7CiAJCiAJaWYgKCFkZW50cnkpCiAJCXJldHVybjsKQEAgLTI3MiwxMSArMjg2LDE5IEBACiAJbXV0ZXhfbG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAlpZiAoZGVidWdmc19wb3NpdGl2ZShkZW50cnkpKSB7CiAJCWlmIChkZW50cnktPmRfaW5vZGUpIHsKLQkJCWlmIChTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKLQkJCQlzaW1wbGVfcm1kaXIocGFyZW50LT5kX2lub2RlLCBkZW50cnkpOwotCQkJZWxzZQorCQkJZGdldChkZW50cnkpOworCQkJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCQkJcmV0ID0gc2ltcGxlX3JtZGlyKHBhcmVudC0+ZF9pbm9kZSwgZGVudHJ5KTsKKwkJCQlpZiAocmV0KQorCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJCSJEZWJ1Z0ZTIHJtZGlyIG9uICVzIGZhaWxlZCA6ICIKKwkJCQkJCSJkaXJlY3Rvcnkgbm90IGVtcHR5LlxuIiwKKwkJCQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkJfSBlbHNlCiAJCQkJc2ltcGxlX3VubGluayhwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7Ci0JCWRwdXQoZGVudHJ5KTsKKwkJCWlmICghcmV0KQorCQkJCWRfZGVsZXRlKGRlbnRyeSk7CisJCQlkcHV0KGRlbnRyeSk7CiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZnMvZGlyZWN0LWlvLmMgYi9mcy9kaXJlY3QtaW8uYwppbmRleCA1OTgxZTE3Zi4uZDlkMDgzMyAxMDA2NDQKLS0tIGEvZnMvZGlyZWN0LWlvLmMKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtMTIxLDggKzEyMiw3IEBACiAKIAkvKiBCSU8gY29tcGxldGlvbiBzdGF0ZSAqLwogCXNwaW5sb2NrX3QgYmlvX2xvY2s7CQkvKiBwcm90ZWN0cyBCSU8gZmllbGRzIGJlbG93ICovCi0JaW50IGJpb19jb3VudDsJCQkvKiBuciBiaW9zIHRvIGJlIGNvbXBsZXRlZCAqLwotCWludCBiaW9zX2luX2ZsaWdodDsJCS8qIG5yIGJpb3MgaW4gZmxpZ2h0ICovCisJdW5zaWduZWQgbG9uZyByZWZjb3VudDsJCS8qIGRpcmVjdF9pb193b3JrZXIoKSBhbmQgYmlvcyAqLwogCXN0cnVjdCBiaW8gKmJpb19saXN0OwkJLyogc2luZ2x5IGxpbmtlZCB2aWEgYmlfcHJpdmF0ZSAqLwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqd2FpdGVyOwkvKiB3YWl0aW5nIHRhc2sgKE5VTEwgaWYgbm9uZSkgKi8KIApAQCAtMjA5LDc2ICsyMDksNTUgQEAKIAlyZXR1cm4gZGlvLT5wYWdlc1tkaW8tPmhlYWQrK107CiB9CiAKLS8qCi0gKiBDYWxsZWQgd2hlbiBhbGwgRElPIEJJTyBJL08gaGFzIGJlZW4gY29tcGxldGVkIC0gbGV0IHRoZSBmaWxlc3lzdGVtCi0gKiBrbm93LCBpZiBpdCByZWdpc3RlcmVkIGFuIGludGVyZXN0IGVhcmxpZXIgdmlhIGdldF9ibG9jay4gIFBhc3MgdGhlCi0gKiBwcml2YXRlIGZpZWxkIG9mIHRoZSBtYXAgYnVmZmVyX2hlYWQgc28gdGhhdCBmaWxlc3lzdGVtcyBjYW4gdXNlIGl0Ci0gKiB0byBob2xkIGFkZGl0aW9uYWwgc3RhdGUgYmV0d2VlbiBnZXRfYmxvY2sgY2FsbHMgYW5kIGRpb19jb21wbGV0ZS4KKy8qKgorICogZGlvX2NvbXBsZXRlKCkgLSBjYWxsZWQgd2hlbiBhbGwgRElPIEJJTyBJL08gaGFzIGJlZW4gY29tcGxldGVkCisgKiBAb2Zmc2V0OiB0aGUgYnl0ZSBvZmZzZXQgaW4gdGhlIGZpbGUgb2YgdGhlIGNvbXBsZXRlZCBvcGVyYXRpb24KKyAqCisgKiBUaGlzIHJlbGVhc2VzIGxvY2tzIGFzIGRpY3RhdGVkIGJ5IHRoZSBsb2NraW5nIHR5cGUsIGxldHMgaW50ZXJlc3RlZCBwYXJ0aWVzCisgKiBrbm93IHRoYXQgYSBESU8gb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQsIGFuZCBjYWxjdWxhdGVzIHRoZSByZXN1bHRpbmcgcmV0dXJuCisgKiBjb2RlIGZvciB0aGUgb3BlcmF0aW9uLgorICoKKyAqIEl0IGxldHMgdGhlIGZpbGVzeXN0ZW0ga25vdyBpZiBpdCByZWdpc3RlcmVkIGFuIGludGVyZXN0IGVhcmxpZXIgdmlhCisgKiBnZXRfYmxvY2suICBQYXNzIHRoZSBwcml2YXRlIGZpZWxkIG9mIHRoZSBtYXAgYnVmZmVyX2hlYWQgc28gdGhhdAorICogZmlsZXN5c3RlbXMgY2FuIHVzZSBpdCB0byBob2xkIGFkZGl0aW9uYWwgc3RhdGUgYmV0d2VlbiBnZXRfYmxvY2sgY2FsbHMgYW5kCisgKiBkaW9fY29tcGxldGUuCiAgKi8KLXN0YXRpYyB2b2lkIGRpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIGxvZmZfdCBvZmZzZXQsIHNzaXplX3QgYnl0ZXMpCitzdGF0aWMgaW50IGRpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIGxvZmZfdCBvZmZzZXQsIGludCByZXQpCiB7CisJc3NpemVfdCB0cmFuc2ZlcnJlZCA9IDA7CisKKwkvKgorCSAqIEFJTyBzdWJtaXNzaW9uIGNhbiByYWNlIHdpdGggYmlvIGNvbXBsZXRpb24gdG8gZ2V0IGhlcmUgd2hpbGUKKwkgKiBleHBlY3RpbmcgdG8gaGF2ZSB0aGUgbGFzdCBpbyBjb21wbGV0ZWQgYnkgYmlvIGNvbXBsZXRpb24uCisJICogSW4gdGhhdCBjYXNlIC1FSU9DQlFVRVVFRCBpcyBpbiBmYWN0IG5vdCBhbiBlcnJvciB3ZSB3YW50CisJICogdG8gcHJlc2VydmUgdGhyb3VnaCB0aGlzIGNhbGwuCisJICovCisJaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQpCisJCXJldCA9IDA7CisKKwlpZiAoZGlvLT5yZXN1bHQpIHsKKwkJdHJhbnNmZXJyZWQgPSBkaW8tPnJlc3VsdDsKKworCQkvKiBDaGVjayBmb3Igc2hvcnQgcmVhZCBjYXNlICovCisJCWlmICgoZGlvLT5ydyA9PSBSRUFEKSAmJiAoKG9mZnNldCArIHRyYW5zZmVycmVkKSA+IGRpby0+aV9zaXplKSkKKwkJCXRyYW5zZmVycmVkID0gZGlvLT5pX3NpemUgLSBvZmZzZXQ7CisJfQorCiAJaWYgKGRpby0+ZW5kX2lvICYmIGRpby0+cmVzdWx0KQotCQlkaW8tPmVuZF9pbyhkaW8tPmlvY2IsIG9mZnNldCwgYnl0ZXMsIGRpby0+bWFwX2JoLmJfcHJpdmF0ZSk7CisJCWRpby0+ZW5kX2lvKGRpby0+aW9jYiwgb2Zmc2V0LCB0cmFuc2ZlcnJlZCwKKwkJCSAgICBkaW8tPm1hcF9iaC5iX3ByaXZhdGUpOwogCWlmIChkaW8tPmxvY2tfdHlwZSA9PSBESU9fTE9DS0lORykKIAkJLyogbG9ja2RlcDogbm9uLW93bmVyIHJlbGVhc2UgKi8KIAkJdXBfcmVhZF9ub25fb3duZXIoJmRpby0+aW5vZGUtPmlfYWxsb2Nfc2VtKTsKLX0KIAotLyoKLSAqIENhbGxlZCB3aGVuIGEgQklPIGhhcyBiZWVuIHByb2Nlc3NlZC4gIElmIHRoZSBjb3VudCBnb2VzIHRvIHplcm8gdGhlbiBJTyBpcwotICogY29tcGxldGUgYW5kIHdlIGNhbiBzaWduYWwgdGhpcyB0byB0aGUgQUlPIGxheWVyLgotICovCi1zdGF0aWMgdm9pZCBmaW5pc2hlZF9vbmVfYmlvKHN0cnVjdCBkaW8gKmRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZGlvLT5wYWdlX2Vycm9yczsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGRpby0+aW9fZXJyb3I7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSB0cmFuc2ZlcnJlZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7Ci0JaWYgKGRpby0+YmlvX2NvdW50ID09IDEpIHsKLQkJaWYgKGRpby0+aXNfYXN5bmMpIHsKLQkJCXNzaXplX3QgdHJhbnNmZXJyZWQ7Ci0JCQlsb2ZmX3Qgb2Zmc2V0OwotCi0JCQkvKgotCQkJICogTGFzdCByZWZlcmVuY2UgdG8gdGhlIGRpbyBpcyBnb2luZyBhd2F5LgotCQkJICogRHJvcCBzcGlubG9jayBhbmQgY29tcGxldGUgdGhlIERJTy4KLQkJCSAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOwotCi0JCQkvKiBDaGVjayBmb3Igc2hvcnQgcmVhZCBjYXNlICovCi0JCQl0cmFuc2ZlcnJlZCA9IGRpby0+cmVzdWx0OwotCQkJb2Zmc2V0ID0gZGlvLT5pb2NiLT5raV9wb3M7Ci0KLQkJCWlmICgoZGlvLT5ydyA9PSBSRUFEKSAmJgotCQkJICAgICgob2Zmc2V0ICsgdHJhbnNmZXJyZWQpID4gZGlvLT5pX3NpemUpKQotCQkJCXRyYW5zZmVycmVkID0gZGlvLT5pX3NpemUgLSBvZmZzZXQ7Ci0KLQkJCS8qIGNoZWNrIGZvciBlcnJvciBpbiBjb21wbGV0aW9uIHBhdGggKi8KLQkJCWlmIChkaW8tPmlvX2Vycm9yKQotCQkJCXRyYW5zZmVycmVkID0gZGlvLT5pb19lcnJvcjsKLQotCQkJZGlvX2NvbXBsZXRlKGRpbywgb2Zmc2V0LCB0cmFuc2ZlcnJlZCk7Ci0KLQkJCS8qIENvbXBsZXRlIEFJTyBsYXRlciBpZiBmYWxsaW5nIGJhY2sgdG8gYnVmZmVyZWQgaS9vICovCi0JCQlpZiAoZGlvLT5yZXN1bHQgPT0gZGlvLT5zaXplIHx8Ci0JCQkJKChkaW8tPnJ3ID09IFJFQUQpICYmIGRpby0+cmVzdWx0KSkgewotCQkJCWFpb19jb21wbGV0ZShkaW8tPmlvY2IsIHRyYW5zZmVycmVkLCAwKTsKLQkJCQlrZnJlZShkaW8pOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBGYWxsaW5nIGJhY2sgdG8gYnVmZmVyZWQKLQkJCQkgKi8KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOwotCQkJCWRpby0+YmlvX2NvdW50LS07Ci0JCQkJaWYgKGRpby0+d2FpdGVyKQotCQkJCQl3YWtlX3VwX3Byb2Nlc3MoZGlvLT53YWl0ZXIpOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JZGlvLT5iaW9fY291bnQtLTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkaW9fYmlvX2NvbXBsZXRlKHN0cnVjdCBkaW8gKmRpbywgc3RydWN0IGJpbyAqYmlvKTsKQEAgLTI4OCwxMiArMjY3LDI3IEBACiBzdGF0aWMgaW50IGRpb19iaW9fZW5kX2FpbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlc19kb25lLCBpbnQgZXJyb3IpCiB7CiAJc3RydWN0IGRpbyAqZGlvID0gYmlvLT5iaV9wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgcmVtYWluaW5nOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoYmlvLT5iaV9zaXplKQogCQlyZXR1cm4gMTsKIAogCS8qIGNsZWFudXAgdGhlIGJpbyAqLwogCWRpb19iaW9fY29tcGxldGUoZGlvLCBiaW8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlyZW1haW5pbmcgPSAtLWRpby0+cmVmY291bnQ7CisJaWYgKHJlbWFpbmluZyA9PSAxICYmIGRpby0+d2FpdGVyKQorCQl3YWtlX3VwX3Byb2Nlc3MoZGlvLT53YWl0ZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKworCWlmIChyZW1haW5pbmcgPT0gMCkgeworCQlpbnQgcmV0ID0gZGlvX2NvbXBsZXRlKGRpbywgZGlvLT5pb2NiLT5raV9wb3MsIDApOworCQlhaW9fY29tcGxldGUoZGlvLT5pb2NiLCByZXQsIDApOworCQlrZnJlZShkaW8pOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0zMTUsOCArMzA5LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOwogCWJpby0+YmlfcHJpdmF0ZSA9IGRpby0+YmlvX2xpc3Q7CiAJZGlvLT5iaW9fbGlzdCA9IGJpbzsKLQlkaW8tPmJpb3NfaW5fZmxpZ2h0LS07Ci0JaWYgKGRpby0+d2FpdGVyICYmIGRpby0+Ymlvc19pbl9mbGlnaHQgPT0gMCkKKwlpZiAoLS1kaW8tPnJlZmNvdW50ID09IDEgJiYgZGlvLT53YWl0ZXIpCiAJCXdha2VfdXBfcHJvY2VzcyhkaW8tPndhaXRlcik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwpAQCAtMzQ3LDYgKzM0MCw4IEBACiAgKiBJbiB0aGUgQUlPIHJlYWQgY2FzZSB3ZSBzcGVjdWxhdGl2ZWx5IGRpcnR5IHRoZSBwYWdlcyBiZWZvcmUgc3RhcnRpbmcgSU8uCiAgKiBEdXJpbmcgSU8gY29tcGxldGlvbiwgYW55IG9mIHRoZXNlIHBhZ2VzIHdoaWNoIGhhcHBlbiB0byBoYXZlIGJlZW4gd3JpdHRlbgogICogYmFjayB3aWxsIGJlIHJlZGlydGllZCBieSBiaW9fY2hlY2tfcGFnZXNfZGlydHkoKS4KKyAqCisgKiBiaW9zIGhvbGQgYSBkaW8gcmVmZXJlbmNlIGJldHdlZW4gc3VibWl0X2JpbyBhbmQgLT5lbmRfaW8uCiAgKi8KIHN0YXRpYyB2b2lkIGRpb19iaW9fc3VibWl0KHN0cnVjdCBkaW8gKmRpbykKIHsKQEAgLTM1NCwxMiArMzQ5LDE0IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWJpby0+YmlfcHJpdmF0ZSA9IGRpbzsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7Ci0JZGlvLT5iaW9fY291bnQrKzsKLQlkaW8tPmJpb3NfaW5fZmxpZ2h0Kys7CisJZGlvLT5yZWZjb3VudCsrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwogCWlmIChkaW8tPmlzX2FzeW5jICYmIGRpby0+cncgPT0gUkVBRCkKIAkJYmlvX3NldF9wYWdlc19kaXJ0eShiaW8pOworCiAJc3VibWl0X2JpbyhkaW8tPnJ3LCBiaW8pOwogCiAJZGlvLT5iaW8gPSBOVUxMOwpAQCAtMzc2LDI4ICszNzMsMzcgQEAKIH0KIAogLyoKLSAqIFdhaXQgZm9yIHRoZSBuZXh0IEJJTyB0byBjb21wbGV0ZS4gIFJlbW92ZSBpdCBhbmQgcmV0dXJuIGl0LgorICogV2FpdCBmb3IgdGhlIG5leHQgQklPIHRvIGNvbXBsZXRlLiAgUmVtb3ZlIGl0IGFuZCByZXR1cm4gaXQuICBOVUxMIGlzCisgKiByZXR1cm5lZCBvbmNlIGFsbCBCSU9zIGhhdmUgYmVlbiBjb21wbGV0ZWQuICBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgb25jZQorICogYWxsIGJpb3MgaGF2ZSBiZWVuIGlzc3VlZCBzbyB0aGF0IGRpby0+cmVmY291bnQgY2FuIG9ubHkgZGVjcmVhc2UuICBUaGlzCisgKiByZXF1aXJlcyB0aGF0IHRoYXQgdGhlIGNhbGxlciBob2xkIGEgcmVmZXJlbmNlIG9uIHRoZSBkaW8uCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmlvICpkaW9fYXdhaXRfb25lKHN0cnVjdCBkaW8gKmRpbykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBiaW8gKmJpbzsKKwlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoZGlvLT5iaW9fbGlzdCA9PSBOVUxMKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGRpby0+YmlvX2xpc3QgPT0gTlVMTCkgewotCQkJZGlvLT53YWl0ZXIgPSBjdXJyZW50OwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOwotCQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGRpby0+aW5vZGUtPmlfbWFwcGluZyk7Ci0JCQlpb19zY2hlZHVsZSgpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKLQkJCWRpby0+d2FpdGVyID0gTlVMTDsKLQkJfQotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJLyoKKwkgKiBXYWl0IGFzIGxvbmcgYXMgdGhlIGxpc3QgaXMgZW1wdHkgYW5kIHRoZXJlIGFyZSBiaW9zIGluIGZsaWdodC4gIGJpbworCSAqIGNvbXBsZXRpb24gZHJvcHMgdGhlIGNvdW50LCBtYXliZSBhZGRzIHRvIHRoZSBsaXN0LCBhbmQgd2FrZXMgd2hpbGUKKwkgKiBob2xkaW5nIHRoZSBiaW9fbG9jayBzbyB3ZSBkb24ndCBuZWVkIHNldF9jdXJyZW50X3N0YXRlKCkncyBiYXJyaWVyCisJICogYW5kIGNhbiBjYWxsIGl0IGFmdGVyIHRlc3Rpbmcgb3VyIGNvbmRpdGlvbi4KKwkgKi8KKwl3aGlsZSAoZGlvLT5yZWZjb3VudCA+IDEgJiYgZGlvLT5iaW9fbGlzdCA9PSBOVUxMKSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlkaW8tPndhaXRlciA9IGN1cnJlbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJaW9fc2NoZWR1bGUoKTsKKwkJLyogd2FrZSB1cCBzZXRzIHVzIFRBU0tfUlVOTklORyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCQlkaW8tPndhaXRlciA9IE5VTEw7CiAJfQotCWJpbyA9IGRpby0+YmlvX2xpc3Q7Ci0JZGlvLT5iaW9fbGlzdCA9IGJpby0+YmlfcHJpdmF0ZTsKKwlpZiAoZGlvLT5iaW9fbGlzdCkgeworCQliaW8gPSBkaW8tPmJpb19saXN0OworCQlkaW8tPmJpb19saXN0ID0gYmlvLT5iaV9wcml2YXRlOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGJpbzsKIH0KQEAgLTQyNiwzNCArNDMyLDI0IEBACiAJCX0KIAkJYmlvX3B1dChiaW8pOwogCX0KLQlmaW5pc2hlZF9vbmVfYmlvKGRpbyk7CiAJcmV0dXJuIHVwdG9kYXRlID8gMCA6IC1FSU87CiB9CiAKIC8qCi0gKiBXYWl0IG9uIGFuZCBwcm9jZXNzIGFsbCBpbi1mbGlnaHQgQklPcy4KKyAqIFdhaXQgb24gYW5kIHByb2Nlc3MgYWxsIGluLWZsaWdodCBCSU9zLiAgVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIG9uY2UKKyAqIGFsbCBiaW9zIGhhdmUgYmVlbiBpc3N1ZWQgc28gdGhhdCB0aGUgcmVmY291bnQgY2FuIG9ubHkgZGVjcmVhc2UuCisgKiBUaGlzIGp1c3Qgd2FpdHMgZm9yIGFsbCBiaW9zIHRvIG1ha2UgaXQgdGhyb3VnaCBkaW9fYmlvX2NvbXBsZXRlLiAgSU8KKyAqIGVycm9ycyBhcmUgcHJvcG9nYXRlZCB0aHJvdWdoIGRpby0+aW9fZXJyb3IgYW5kIHNob3VsZCBiZSBwcm9wb2dhdGVkIHZpYQorICogZGlvX2NvbXBsZXRlKCkuCiAgKi8KLXN0YXRpYyBpbnQgZGlvX2F3YWl0X2NvbXBsZXRpb24oc3RydWN0IGRpbyAqZGlvKQorc3RhdGljIHZvaWQgZGlvX2F3YWl0X2NvbXBsZXRpb24oc3RydWN0IGRpbyAqZGlvKQogewotCWludCByZXQgPSAwOwotCi0JaWYgKGRpby0+YmlvKQotCQlkaW9fYmlvX3N1Ym1pdChkaW8pOwotCi0JLyoKLQkgKiBUaGUgYmlvX2xvY2sgaXMgbm90IGhlbGQgZm9yIHRoZSByZWFkIG9mIGJpb19jb3VudC4KLQkgKiBUaGlzIGlzIG9rIHNpbmNlIGl0IGlzIHRoZSBkaW9fYmlvX2NvbXBsZXRlKCkgdGhhdCBjaGFuZ2VzCi0JICogYmlvX2NvdW50LgotCSAqLwotCXdoaWxlIChkaW8tPmJpb19jb3VudCkgewotCQlzdHJ1Y3QgYmlvICpiaW8gPSBkaW9fYXdhaXRfb25lKGRpbyk7Ci0JCWludCByZXQyOwotCi0JCXJldDIgPSBkaW9fYmlvX2NvbXBsZXRlKGRpbywgYmlvKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJcmV0ID0gcmV0MjsKLQl9Ci0JcmV0dXJuIHJldDsKKwlzdHJ1Y3QgYmlvICpiaW87CisJZG8geworCQliaW8gPSBkaW9fYXdhaXRfb25lKGRpbyk7CisJCWlmIChiaW8pCisJCQlkaW9fYmlvX2NvbXBsZXRlKGRpbywgYmlvKTsKKwl9IHdoaWxlIChiaW8pOwogfQogCiAvKgpAQCAtNjc1LDYgKzY3MSwxMyBAQAogewogCWludCByZXQgPSAwOwogCisJaWYgKGRpby0+cncgJiBXUklURSkgeworCQkvKgorCQkgKiBSZWFkIGFjY291bnRpbmcgaXMgcGVyZm9ybWVkIGluIHN1Ym1pdF9iaW8oKQorCQkgKi8KKwkJdGFza19pb19hY2NvdW50X3dyaXRlKGxlbik7CisJfQorCiAJLyoKIAkgKiBDYW4gd2UganVzdCBncm93IHRoZSBjdXJyZW50IHBhZ2UncyBwcmVzZW5jZSBpbiB0aGUgZGlvPwogCSAqLwpAQCAtOTUzLDYgKzk1Niw3IEBACiAJc3RydWN0IGRpbyAqZGlvKQogewogCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyOyAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzZWc7CiAJc3NpemVfdCByZXQgPSAwOwogCXNzaXplX3QgcmV0MjsKQEAgLTk4MywxNyArOTg3LDggQEAKIAlkaW8tPmlvY2IgPSBpb2NiOwogCWRpby0+aV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCi0JLyoKLQkgKiBCSU8gY29tcGxldGlvbiBzdGF0ZS4KLQkgKgotCSAqIC0+YmlvX2NvdW50IHN0YXJ0cyBvdXQgYXQgb25lLCBhbmQgd2UgZGVjcmVtZW50IGl0IHRvIHplcm8gYWZ0ZXIgYWxsCi0JICogQklPcyBhcmUgc3VibWl0dGVkLiAgVGhpcyB0byBhdm9pZCB0aGUgc2l0dWF0aW9uIHdoZXJlIGEgcmVhbGx5IGZhc3QKLQkgKiAob3Igc3luY2hyb25vdXMpIGRldmljZSBjb3VsZCB0YWtlIHRoZSBjb3VudCB0byB6ZXJvIHdoaWxlIHdlJ3JlCi0JICogc3RpbGwgc3VibWl0dGluZyBCSU9zLgotCSAqLwotCWRpby0+YmlvX2NvdW50ID0gMTsKLQlkaW8tPmJpb3NfaW5fZmxpZ2h0ID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmZGlvLT5iaW9fbG9jayk7CisJZGlvLT5yZWZjb3VudCA9IDE7CiAJZGlvLT5iaW9fbGlzdCA9IE5VTEw7CiAJZGlvLT53YWl0ZXIgPSBOVUxMOwogCkBAIC0xMDY5LDYgKzEwNjQsOSBAQAogCWlmIChkaW8tPmJpbykKIAkJZGlvX2Jpb19zdWJtaXQoZGlvKTsKIAorCS8qIEFsbCBJTyBpcyBub3cgaXNzdWVkLCBzZW5kIGl0IG9uIGl0cyB3YXkgKi8KKwlibGtfcnVuX2FkZHJlc3Nfc3BhY2UoaW5vZGUtPmlfbWFwcGluZyk7CisKIAkvKgogCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQsIHdlIHJldHVybiBzaG9ydCBJTyBkdWUgdG8gZW5kIG9mIGZpbGUuCiAJICogSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHJlbGVhc2UgYWxsIHRoZSBwYWdlcyB3ZSBnb3QgaG9sZCBvbi4KQEAgLTEwODQsNzQgKzEwODIsNDEgQEAKIAkJbXV0ZXhfdW5sb2NrKCZkaW8tPmlub2RlLT5pX211dGV4KTsKIAogCS8qCi0JICogT0ssIGFsbCBCSU9zIGFyZSBzdWJtaXR0ZWQsIHNvIHdlIGNhbiBkZWNyZW1lbnQgYmlvX2NvdW50IHRvIHRydWx5Ci0JICogcmVmbGVjdCB0aGUgbnVtYmVyIG9mIHRvLWJlLXByb2Nlc3NlZCBCSU9zLgorCSAqIFRoZSBvbmx5IHRpbWUgd2Ugd2FudCB0byBsZWF2ZSBiaW9zIGluIGZsaWdodCBpcyB3aGVuIGEgc3VjY2Vzc2Z1bAorCSAqIHBhcnRpYWwgYWlvIHJlYWQgb3IgZnVsbCBhaW8gd3JpdGUgaGF2ZSBiZWVuIHNldHVwLiAgSW4gdGhhdCBjYXNlCisJICogYmlvIGNvbXBsZXRpb24gd2lsbCBjYWxsIGFpb19jb21wbGV0ZS4gIFRoZSBvbmx5IHRpbWUgaXQncyBzYWZlIHRvCisJICogY2FsbCBhaW9fY29tcGxldGUgaXMgd2hlbiB3ZSByZXR1cm4gLUVJT0NCUVVFVUVELCBzbyB3ZSBrZXkgb24gdGhhdC4KKwkgKiBUaGlzIGhhZCAqYmV0dGVyKiBiZSB0aGUgb25seSBwbGFjZSB0aGF0IHJhaXNlcyAtRUlPQ0JRVUVVRUQuCiAJICovCi0JaWYgKGRpby0+aXNfYXN5bmMpIHsKLQkJaW50IHNob3VsZF93YWl0ID0gMDsKKwlCVUdfT04ocmV0ID09IC1FSU9DQlFVRVVFRCk7CisJaWYgKGRpby0+aXNfYXN5bmMgJiYgcmV0ID09IDAgJiYgZGlvLT5yZXN1bHQgJiYKKwkgICAgKChydyAmIFJFQUQpIHx8IChkaW8tPnJlc3VsdCA9PSBkaW8tPnNpemUpKSkKKwkJcmV0ID0gLUVJT0NCUVVFVUVEOwogCi0JCWlmIChkaW8tPnJlc3VsdCA8IGRpby0+c2l6ZSAmJiAocncgJiBXUklURSkpIHsKLQkJCWRpby0+d2FpdGVyID0gY3VycmVudDsKLQkJCXNob3VsZF93YWl0ID0gMTsKLQkJfQotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSBkaW8tPnJlc3VsdDsKLQkJZmluaXNoZWRfb25lX2JpbyhkaW8pOwkJLyogVGhpcyBjYW4gZnJlZSB0aGUgZGlvICovCi0JCWJsa19ydW5fYWRkcmVzc19zcGFjZShpbm9kZS0+aV9tYXBwaW5nKTsKLQkJaWYgKHNob3VsZF93YWl0KSB7Ci0JCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQkJLyoKLQkJCSAqIFdhaXQgZm9yIGFscmVhZHkgaXNzdWVkIEkvTyB0byBkcmFpbiBvdXQgYW5kCi0JCQkgKiByZWxlYXNlIGl0cyByZWZlcmVuY2VzIHRvIHVzZXItc3BhY2UgcGFnZXMKLQkJCSAqIGJlZm9yZSByZXR1cm5pbmcgdG8gZmFsbGJhY2sgb24gYnVmZmVyZWQgSS9PCi0JCQkgKi8KKwlpZiAocmV0ICE9IC1FSU9DQlFVRVVFRCkKKwkJZGlvX2F3YWl0X2NvbXBsZXRpb24oZGlvKTsKIAotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJCXdoaWxlIChkaW8tPmJpb19jb3VudCkgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKLQkJCQlpb19zY2hlZHVsZSgpOwotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCWtmcmVlKGRpbyk7Ci0JCX0KLQl9IGVsc2UgewotCQlzc2l6ZV90IHRyYW5zZmVycmVkID0gMDsKLQotCQlmaW5pc2hlZF9vbmVfYmlvKGRpbyk7Ci0JCXJldDIgPSBkaW9fYXdhaXRfY29tcGxldGlvbihkaW8pOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSByZXQyOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSBkaW8tPnBhZ2VfZXJyb3JzOwotCQlpZiAoZGlvLT5yZXN1bHQpIHsKLQkJCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0KLQkJCXRyYW5zZmVycmVkID0gZGlvLT5yZXN1bHQ7Ci0JCQkvKgotCQkJICogQWRqdXN0IHRoZSByZXR1cm4gdmFsdWUgaWYgdGhlIHJlYWQgY3Jvc3NlZCBhCi0JCQkgKiBub24tYmxvY2stYWxpZ25lZCBFT0YuCi0JCQkgKi8KLQkJCWlmIChydyA9PSBSRUFEICYmIChvZmZzZXQgKyB0cmFuc2ZlcnJlZCA+IGlfc2l6ZSkpCi0JCQkJdHJhbnNmZXJyZWQgPSBpX3NpemUgLSBvZmZzZXQ7Ci0JCX0KLQkJZGlvX2NvbXBsZXRlKGRpbywgb2Zmc2V0LCB0cmFuc2ZlcnJlZCk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IHRyYW5zZmVycmVkOwotCi0JCS8qIFdlIGNvdWxkIGhhdmUgYWxzbyBjb21lIGhlcmUgb24gYW4gQUlPIGZpbGUgZXh0ZW5kICovCi0JCWlmICghaXNfc3luY19raW9jYihpb2NiKSAmJiAocncgJiBXUklURSkgJiYKLQkJICAgIHJldCA+PSAwICYmIGRpby0+cmVzdWx0ID09IGRpby0+c2l6ZSkKLQkJCS8qCi0JCQkgKiBGb3IgQUlPIHdyaXRlcyB3aGVyZSB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUKLQkJCSAqIGkvbywgd2UgaGF2ZSB0byBtYXJrIHRoZSB0aGUgYWlvIGNvbXBsZXRlLgotCQkJICovCi0JCQlhaW9fY29tcGxldGUoaW9jYiwgcmV0LCAwKTsKKwkvKgorCSAqIFN5bmMgd2lsbCBhbHdheXMgYmUgZHJvcHBpbmcgdGhlIGZpbmFsIHJlZiBhbmQgY29tcGxldGluZyB0aGUKKwkgKiBvcGVyYXRpb24uICBBSU8gY2FuIGlmIGl0IHdhcyBhIGJyb2tlbiBvcGVyYXRpb24gZGVzY3JpYmVkIGFib3ZlIG9yCisJICogaW4gZmFjdCBpZiBhbGwgdGhlIGJpb3MgcmFjZSB0byBjb21wbGV0ZSBiZWZvcmUgd2UgZ2V0IGhlcmUuICBJbgorCSAqIHRoYXQgY2FzZSBkaW9fY29tcGxldGUoKSB0cmFuc2xhdGVzIHRoZSBFSU9DQlFVRVVFRCBpbnRvIHRoZSBwcm9wZXIKKwkgKiByZXR1cm4gY29kZSB0aGF0IHRoZSBjYWxsZXIgd2lsbCBoYW5kIHRvIGFpb19jb21wbGV0ZSgpLgorCSAqCisJICogVGhpcyBpcyBtYW5hZ2VkIGJ5IHRoZSBiaW9fbG9jayBpbnN0ZWFkIG9mIGJlaW5nIGFuIGF0b21pY190IHNvIHRoYXQKKwkgKiBjb21wbGV0aW9uIHBhdGhzIGNhbiBkcm9wIHRoZWlyIHJlZiBhbmQgdXNlIHRoZSByZW1haW5pbmcgY291bnQgdG8KKwkgKiBkZWNpZGUgdG8gd2FrZSB0aGUgc3VibWlzc2lvbiBwYXRoIGF0b21pY2FsbHkuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlyZXQyID0gLS1kaW8tPnJlZmNvdW50OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlCVUdfT04oIWRpby0+aXNfYXN5bmMgJiYgcmV0MiAhPSAwKTsKKwlpZiAocmV0MiA9PSAwKSB7CisJCXJldCA9IGRpb19jb21wbGV0ZShkaW8sIG9mZnNldCwgcmV0KTsKIAkJa2ZyZWUoZGlvKTsKLQl9CisJfSBlbHNlCisJCUJVR19PTihyZXQgIT0gLUVJT0NCUVVFVUVEKTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS9LY29uZmlnIGIvZnMvZGxtL0tjb25maWcKaW5kZXggODFiMmM2NC4uYjU2NTRhMiAxMDA2NDQKLS0tIGEvZnMvZGxtL0tjb25maWcKKysrIGIvZnMvZGxtL0tjb25maWcKQEAgLTEsMTQgKzEsMzIgQEAKIG1lbnUgIkRpc3RyaWJ1dGVkIExvY2sgTWFuYWdlciIKLQlkZXBlbmRzIG9uIElORVQgJiYgSVBfU0NUUCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJTkVUCiAKIGNvbmZpZyBETE0KIAl0cmlzdGF0ZSAiRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyIChETE0pIgogCWRlcGVuZHMgb24gSVBWNiB8fCBJUFY2PW4KIAlzZWxlY3QgQ09ORklHRlNfRlMKKwlzZWxlY3QgSVBfU0NUUCBpZiBETE1fU0NUUAogCWhlbHAKIAlBIGdlbmVyYWwgcHVycG9zZSBkaXN0cmlidXRlZCBsb2NrIG1hbmFnZXIgZm9yIGtlcm5lbCBvciB1c2Vyc3BhY2UKIAlhcHBsaWNhdGlvbnMuCiAKK2Nob2ljZQorCXByb21wdCAiU2VsZWN0IERMTSBjb21tdW5pY2F0aW9ucyBwcm90b2NvbCIKKwlkZXBlbmRzIG9uIERMTQorCWRlZmF1bHQgRExNX1RDUAorCWhlbHAKKwlUaGUgRExNIENhbiB1c2UgVENQIG9yIFNDVFAgZm9yIGl0J3MgbmV0d29yayBjb21tdW5pY2F0aW9ucy4KKwlTQ1RQIHN1cHBvcnRzIG11bHRpLWhvbWVkIG9wZXJhdGlvbnMgd2hlcmVhcyBUQ1AgZG9lc24ndC4KKwlIb3dldmVyLCBTQ1RQIHNlZW1zIHRvIGhhdmUgc3RhYmlsaXR5IHByb2JsZW1zIGF0IHRoZSBtb21lbnQuCisKK2NvbmZpZyBETE1fVENQCisJYm9vbCAiVENQL0lQIgorCitjb25maWcgRExNX1NDVFAKKwlib29sICJTQ1RQIgorCitlbmRjaG9pY2UKKwogY29uZmlnIERMTV9ERUJVRwogCWJvb2wgIkRMTSBkZWJ1Z2dpbmciCiAJZGVwZW5kcyBvbiBETE0KZGlmZiAtLWdpdCBhL2ZzL2RsbS9NYWtlZmlsZSBiL2ZzL2RsbS9NYWtlZmlsZQppbmRleCAxODMyZTAyLi42NTM4ODk0IDEwMDY0NAotLS0gYS9mcy9kbG0vTWFrZWZpbGUKKysrIGIvZnMvZGxtL01ha2VmaWxlCkBAIC00LDcgKzQsNiBAQAogCQkJCWRpci5vIFwKIAkJCQlsb2NrLm8gXAogCQkJCWxvY2tzcGFjZS5vIFwKLQkJCQlsb3djb21tcy5vIFwKIAkJCQltYWluLm8gXAogCQkJCW1lbWJlci5vIFwKIAkJCQltZW1vcnkubyBcCkBAIC0xNywzICsxNiw2IEBACiAJCQkJdXRpbC5vCiBkbG0tJChDT05GSUdfRExNX0RFQlVHKSArPQlkZWJ1Z19mcy5vCiAKK2RsbS0kKENPTkZJR19ETE1fVENQKSAgICs9IGxvd2NvbW1zLXRjcC5vCisKK2RsbS0kKENPTkZJR19ETE1fU0NUUCkgICs9IGxvd2NvbW1zLXNjdHAubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kbG1faW50ZXJuYWwuaCBiL2ZzL2RsbS9kbG1faW50ZXJuYWwuaAppbmRleCAxZTVjZDY3Li4xZWU4MTk1IDEwMDY0NAotLS0gYS9mcy9kbG0vZGxtX2ludGVybmFsLmgKKysrIGIvZnMvZGxtL2RsbV9pbnRlcm5hbC5oCkBAIC00NzEsNiArNDcxLDcgQEAKIAljaGFyCQkJKmxzX3JlY292ZXJfYnVmOwogCWludAkJCWxzX3JlY292ZXJfbm9kZWlkOyAvKiBmb3IgZGVidWdnaW5nICovCiAJdWludDY0X3QJCWxzX3Jjb21fc2VxOworCXNwaW5sb2NrX3QJCWxzX3Jjb21fc3BpbjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxzX3JlY292ZXJfbGlzdDsKIAlzcGlubG9ja190CQlsc19yZWNvdmVyX2xpc3RfbG9jazsKIAlpbnQJCQlsc19yZWNvdmVyX2xpc3RfY291bnQ7CkBAIC00ODgsNyArNDg5LDggQEAKICNkZWZpbmUgTFNGTF9SVU5OSU5HCQkxCiAjZGVmaW5lIExTRkxfUkVDT1ZFUllfU1RPUAkyCiAjZGVmaW5lIExTRkxfUkNPTV9SRUFEWQkJMwotI2RlZmluZSBMU0ZMX1VFVkVOVF9XQUlUCTQKKyNkZWZpbmUgTFNGTF9SQ09NX1dBSVQJCTQKKyNkZWZpbmUgTFNGTF9VRVZFTlRfV0FJVAk1CiAKIC8qIG11Y2ggb2YgdGhpcyBpcyBqdXN0IHNhdmluZyB1c2VyIHNwYWNlIHBvaW50ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgIGxvY2sgdGhhdCB3ZSBwYXNzIGJhY2sgdG8gdGhlIHVzZXIgbGliIHdpdGggYW4gYXN0ICovCmRpZmYgLS1naXQgYS9mcy9kbG0vbG9jay5jIGIvZnMvZGxtL2xvY2suYwppbmRleCAzZjJiZWZhLi4zMDg3OGRlIDEwMDY0NAotLS0gYS9mcy9kbG0vbG9jay5jCisrKyBiL2ZzL2RsbS9sb2NrLmMKQEAgLTIzNzIsNiArMjM3Miw3IEBACiBzdGF0aWMgdm9pZCByZWNlaXZlX2ZsYWdzKHN0cnVjdCBkbG1fbGtiICpsa2IsIHN0cnVjdCBkbG1fbWVzc2FnZSAqbXMpCiB7CiAJbGtiLT5sa2JfZXhmbGFncyA9IG1zLT5tX2V4ZmxhZ3M7CisJbGtiLT5sa2Jfc2JmbGFncyA9IG1zLT5tX3NiZmxhZ3M7CiAJbGtiLT5sa2JfZmxhZ3MgPSAobGtiLT5sa2JfZmxhZ3MgJiAweEZGRkYwMDAwKSB8CiAJCSAgICAgICAgIChtcy0+bV9mbGFncyAmIDB4MDAwMEZGRkYpOwogfQpAQCAtMzAyOCwxMCArMzAyOSwxNyBAQAogCiAJd2hpbGUgKDEpIHsKIAkJaWYgKGRsbV9sb2NraW5nX3N0b3BwZWQobHMpKSB7Ci0JCQlpZiAoIXJlY292ZXJ5KQotCQkJCWRsbV9hZGRfcmVxdWVzdHF1ZXVlKGxzLCBub2RlaWQsIGhkKTsKLQkJCWVycm9yID0gLUVJTlRSOwotCQkJZ290byBvdXQ7CisJCQlpZiAocmVjb3ZlcnkpIHsKKwkJCQllcnJvciA9IC1FSU5UUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWVycm9yID0gZGxtX2FkZF9yZXF1ZXN0cXVldWUobHMsIG5vZGVpZCwgaGQpOworCQkJaWYgKGVycm9yID09IC1FQUdBSU4pCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQllcnJvciA9IC1FSU5UUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQogCiAJCWlmIChsb2NrX3JlY292ZXJ5X3RyeShscykpCmRpZmYgLS1naXQgYS9mcy9kbG0vbG9ja3NwYWNlLmMgYi9mcy9kbG0vbG9ja3NwYWNlLmMKaW5kZXggMTA5MzMzYy4uNTkwMTJiMCAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvY2tzcGFjZS5jCisrKyBiL2ZzL2RsbS9sb2Nrc3BhY2UuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgIm1lbW9yeS5oIgogI2luY2x1ZGUgImxvY2suaCIKICNpbmNsdWRlICJyZWNvdmVyLmgiCisjaW5jbHVkZSAicmVxdWVzdHF1ZXVlLmgiCiAKICNpZmRlZiBDT05GSUdfRExNX0RFQlVHCiBpbnQgZGxtX2NyZWF0ZV9kZWJ1Z19maWxlKHN0cnVjdCBkbG1fbHMgKmxzKTsKQEAgLTQzLDYgKzQ0LDEwIEBACiAJc3NpemVfdCByZXQgPSBsZW47CiAJaW50IG4gPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMCk7CiAKKwlscyA9IGRsbV9maW5kX2xvY2tzcGFjZV9sb2NhbChscy0+bHNfbG9jYWxfaGFuZGxlKTsKKwlpZiAoIWxzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXN3aXRjaCAobikgewogCWNhc2UgMDoKIAkJZGxtX2xzX3N0b3AobHMpOwpAQCAtNTMsNiArNTgsNyBAQAogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7CiAJfQorCWRsbV9wdXRfbG9ja3NwYWNlKGxzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDMsNiArMTQ5LDEyIEBACiAJcmV0dXJuIGEtPnN0b3JlID8gYS0+c3RvcmUobHMsIGJ1ZiwgbGVuKSA6IGxlbjsKIH0KIAorc3RhdGljIHZvaWQgbG9ja3NwYWNlX2tvYmpfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqaykKK3sKKwlzdHJ1Y3QgZGxtX2xzICpscyAgPSBjb250YWluZXJfb2Yoaywgc3RydWN0IGRsbV9scywgbHNfa29iaik7CisJa2ZyZWUobHMpOworfQorCiBzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBkbG1fYXR0cl9vcHMgPSB7CiAJLnNob3cgID0gZGxtX2F0dHJfc2hvdywKIAkuc3RvcmUgPSBkbG1fYXR0cl9zdG9yZSwKQEAgLTE1MSw2ICsxNjMsNyBAQAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgZGxtX2t0eXBlID0gewogCS5kZWZhdWx0X2F0dHJzID0gZGxtX2F0dHJzLAogCS5zeXNmc19vcHMgICAgID0gJmRsbV9hdHRyX29wcywKKwkucmVsZWFzZSAgICAgICA9IGxvY2tzcGFjZV9rb2JqX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGtzZXQgZGxtX2tzZXQgPSB7CkBAIC00NjYsNiArNDc5LDggQEAKIAlscy0+bHNfcmVjb3ZlcmRfdGFzayA9IE5VTEw7CiAJbXV0ZXhfaW5pdCgmbHMtPmxzX3JlY292ZXJkX2FjdGl2ZSk7CiAJc3Bpbl9sb2NrX2luaXQoJmxzLT5sc19yZWNvdmVyX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZscy0+bHNfcmNvbV9zcGluKTsKKwlnZXRfcmFuZG9tX2J5dGVzKCZscy0+bHNfcmNvbV9zZXEsIHNpemVvZih1aW50NjRfdCkpOwogCWxzLT5sc19yZWNvdmVyX3N0YXR1cyA9IDA7CiAJbHMtPmxzX3JlY292ZXJfc2VxID0gMDsKIAlscy0+bHNfcmVjb3Zlcl9hcmdzID0gTlVMTDsKQEAgLTY3MiwxMyArNjg3LDE0IEBACiAJICogRnJlZSBzdHJ1Y3R1cmVzIG9uIGFueSBvdGhlciBsaXN0cwogCSAqLwogCisJZGxtX3B1cmdlX3JlcXVlc3RxdWV1ZShscyk7CiAJa2ZyZWUobHMtPmxzX3JlY292ZXJfYXJncyk7CiAJZGxtX2NsZWFyX2ZyZWVfZW50cmllcyhscyk7CiAJZGxtX2NsZWFyX21lbWJlcnMobHMpOwogCWRsbV9jbGVhcl9tZW1iZXJzX2dvbmUobHMpOwogCWtmcmVlKGxzLT5sc19ub2RlX2FycmF5KTsKIAlrb2JqZWN0X3VucmVnaXN0ZXIoJmxzLT5sc19rb2JqKTsKLQlrZnJlZShscyk7CisgICAgICAgIC8qIFRoZSBscyBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBrb2JqZWN0IGlzIGRvbmUgd2l0aCAqLwogCiAJbXV0ZXhfbG9jaygmbHNfbG9jayk7CiAJbHNfY291bnQtLTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb3djb21tcy1zY3RwLmMgYi9mcy9kbG0vbG93Y29tbXMtc2N0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTU4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9kbG0vbG93Y29tbXMtc2N0cC5jCkBAIC0wLDAgKzEsMTIyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKioKKyoqICBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyoqICBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworKiogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogbG93Y29tbXMuYworICoKKyAqIFRoaXMgaXMgdGhlICJsb3ctbGV2ZWwiIGNvbW1zIGxheWVyLgorICoKKyAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nL3JlY2VpdmluZyBtZXNzYWdlcworICogZnJvbSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAqCisgKiBDbHVzdGVyIG5vZGVzIGFyZSByZWZlcnJlZCB0byBieSB0aGVpciBub2RlaWRzLiBub2RlaWRzIGFyZQorICogc2ltcGx5IDMyIGJpdCBudW1iZXJzIHRvIHRoZSBsb2NraW5nIG1vZHVsZSAtIGlmIHRoZXkgbmVlZCB0bworICogYmUgZXhwYW5kZWQgZm9yIHRoZSBjbHVzdGVyIGluZnJhc3RydWN0dXJlIHRoZW4gdGhhdCBpcyBpdCdzCisgKiByZXNwb25zaWJpbGl0eS4gSXQgaXMgdGhpcyBsYXllcidzCisgKiByZXNwb25zaWJpbGl0eSB0byByZXNvbHZlIHRoZXNlIGludG8gSVAgYWRkcmVzcyBvcgorICogd2hhdGV2ZXIgaXQgbmVlZHMgZm9yIGludGVyLW5vZGUgY29tbXVuaWNhdGlvbi4KKyAqCisgKiBUaGUgY29tbXMgbGV2ZWwgaXMgdHdvIGtlcm5lbCB0aHJlYWRzIHRoYXQgZGVhbCBtYWlubHkgd2l0aAorICogdGhlIHJlY2VpdmluZyBvZiBtZXNzYWdlcyBmcm9tIG90aGVyIG5vZGVzIGFuZCBwYXNzaW5nIHRoZW0KKyAqIHVwIHRvIHRoZSBtaWQtbGV2ZWwgY29tbXMgbGF5ZXIgKHdoaWNoIHVuZGVyc3RhbmRzIHRoZQorICogbWVzc2FnZSBmb3JtYXQpIGZvciBleGVjdXRpb24gYnkgdGhlIGxvY2tpbmcgY29yZSwgYW5kCisgKiBhIHNlbmQgdGhyZWFkIHdoaWNoIGRvZXMgYWxsIHRoZSBzZXR0aW5nIHVwIG9mIGNvbm5lY3Rpb25zCisgKiB0byByZW1vdGUgbm9kZXMgYW5kIHRoZSBzZW5kaW5nIG9mIGRhdGEuIFRocmVhZHMgYXJlIG5vdCBhbGxvd2VkCisgKiB0byBzZW5kIHRoZWlyIG93biBkYXRhIGJlY2F1c2UgaXQgbWF5IGNhdXNlIHRoZW0gdG8gd2FpdCBpbiB0aW1lcworICogb2YgaGlnaCBsb2FkLiBBbHNvLCB0aGlzIHdheSwgdGhlIHNlbmRpbmcgdGhyZWFkIGNhbiBjb2xsZWN0IHRvZ2V0aGVyCisgKiBtZXNzYWdlcyBib3VuZCBmb3Igb25lIG5vZGUgYW5kIHNlbmQgdGhlbSBpbiBvbmUgYmxvY2suCisgKgorICogSSBkb24ndCBzZWUgYW55IHByb2JsZW0gd2l0aCB0aGUgcmVjdiB0aHJlYWQgZXhlY3V0aW5nIHRoZSBsb2NraW5nCisgKiBjb2RlIG9uIGJlaGFsZiBvZiByZW1vdGUgcHJvY2Vzc2VzIGFzIHRoZSBsb2NraW5nIGNvZGUgaXMKKyAqIHNob3J0LCBlZmZpY2llbnQgYW5kIG5ldmVyICh3ZWxsLCBoYXJkbHkgZXZlcikgd2FpdHMuCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3NjdHAvdXNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImRsbV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvd2NvbW1zLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibWlkY29tbXMuaCIKKworc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpkbG1fbG9jYWxfYWRkcltETE1fTUFYX0FERFJfQ09VTlRdOworc3RhdGljIGludAkJCWRsbV9sb2NhbF9jb3VudDsKK3N0YXRpYyBpbnQJCQlkbG1fbG9jYWxfbm9kZWlkOworCisvKiBPbmUgb2YgdGhlc2UgcGVyIGNvbm5lY3RlZCBub2RlICovCisKKyNkZWZpbmUgTklfSU5JVF9QRU5ESU5HIDEKKyNkZWZpbmUgTklfV1JJVEVfUEVORElORyAyCisKK3N0cnVjdCBub2RlaW5mbyB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzY3RwX2Fzc29jX3QJCWFzc29jX2lkOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQJd3JpdGVfbGlzdDsgLyogbm9kZXMgd2l0aCBwZW5kaW5nIHdyaXRlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQJd3JpdGVxdWV1ZTsgLyogb3V0Z29pbmcgd3JpdGVxdWV1ZV9lbnRyaWVzICovCisJc3BpbmxvY2tfdAkJd3JpdGVxdWV1ZV9sb2NrOworCWludAkJCW5vZGVpZDsKK307CisKK3N0YXRpYyBERUZJTkVfSURSKG5vZGVpbmZvX2lkcik7CitzdGF0aWMgREVDTEFSRV9SV1NFTShub2RlaW5mb19sb2NrKTsKK3N0YXRpYyBpbnQgbWF4X25vZGVpZDsKKworc3RydWN0IGNidWYgeworCXVuc2lnbmVkIGludCBiYXNlOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgaW50IG1hc2s7Cit9OworCisvKiBKdXN0IHRoZSBvbmUgb2YgdGhlc2UsIG5vdy4gQnV0IHRoaXMgc3RydWN0IGtlZXBzCisgICB0aGUgY29ubmVjdGlvbi1zcGVjaWZpYyB2YXJpYWJsZXMgdG9nZXRoZXIgKi8KKworI2RlZmluZSBDRl9SRUFEX1BFTkRJTkcgMQorCitzdHJ1Y3QgY29ubmVjdGlvbiB7CisJc3RydWN0IHNvY2tldCAgICAgICAgICAgKnNvY2s7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc3RydWN0IHBhZ2UgICAgICAgICAgICAgKnJ4X3BhZ2U7CisJYXRvbWljX3QJCXdhaXRpbmdfcmVxdWVzdHM7CisJc3RydWN0IGNidWYJCWNiOworCWludCAgICAgICAgICAgICAgICAgICAgIGVhZ2Fpbl9mbGFnOworfTsKKworLyogQW4gZW50cnkgd2FpdGluZyB0byBiZSBzZW50ICovCisKK3N0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IHBhZ2UgICAgICAgICAgICAgKnBhZ2U7CisJaW50CQkJb2Zmc2V0OworCWludAkJCWxlbjsKKwlpbnQJCQllbmQ7CisJaW50CQkJdXNlcnM7CisJc3RydWN0IG5vZGVpbmZvICAgICAgICAgKm5pOworfTsKKworc3RhdGljIHZvaWQgY2J1Zl9hZGQoc3RydWN0IGNidWYgKmNiLCBpbnQgbikKK3sKKwljYi0+bGVuICs9IG47Cit9CisKK3N0YXRpYyBpbnQgY2J1Zl9kYXRhKHN0cnVjdCBjYnVmICpjYikKK3sKKwlyZXR1cm4gKChjYi0+YmFzZSArIGNiLT5sZW4pICYgY2ItPm1hc2spOworfQorCitzdGF0aWMgdm9pZCBjYnVmX2luaXQoc3RydWN0IGNidWYgKmNiLCBpbnQgc2l6ZSkKK3sKKwljYi0+YmFzZSA9IGNiLT5sZW4gPSAwOworCWNiLT5tYXNrID0gc2l6ZS0xOworfQorCitzdGF0aWMgdm9pZCBjYnVmX2VhdChzdHJ1Y3QgY2J1ZiAqY2IsIGludCBuKQoreworCWNiLT5sZW4gIC09IG47CisJY2ItPmJhc2UgKz0gbjsKKwljYi0+YmFzZSAmPSBjYi0+bWFzazsKK30KKworLyogTGlzdCBvZiBub2RlcyB3aGljaCBoYXZlIHdyaXRlcyBwZW5kaW5nICovCitzdGF0aWMgTElTVF9IRUFEKHdyaXRlX25vZGVzKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sod3JpdGVfbm9kZXNfbG9jayk7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGluY29taW5nIG1lc3NhZ2VzIHRvIHByb2Nlc3MgYmVmb3JlCisgKiBkb2luZyBhIHNjaGVkdWxlKCkKKyAqLworI2RlZmluZSBNQVhfUlhfTVNHX0NPVU5UIDI1CisKKy8qIE1hbmFnZSBkYWVtb25zICovCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpyZWN2X3Rhc2s7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzZW5kX3Rhc2s7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobG93Y29tbXNfcmVjdl93YWl0KTsKKworLyogVGhlIFNDVFAgY29ubmVjdGlvbiAqLworc3RhdGljIHN0cnVjdCBjb25uZWN0aW9uIHNjdHBfY29uOworCisKK3N0YXRpYyBpbnQgbm9kZWlkX3RvX2FkZHIoaW50IG5vZGVpZCwgc3RydWN0IHNvY2thZGRyICpyZXRhZGRyKQoreworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisJaW50IGVycm9yOworCisJaWYgKCFkbG1fbG9jYWxfY291bnQpCisJCXJldHVybiAtMTsKKworCWVycm9yID0gZGxtX25vZGVpZF90b19hZGRyKG5vZGVpZCwgJmFkZHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKGRsbV9sb2NhbF9hZGRyWzBdLT5zc19mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmluNCAgPSAoc3RydWN0IHNvY2thZGRyX2luICopICZhZGRyOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnJldDQgPSAoc3RydWN0IHNvY2thZGRyX2luICopIHJldGFkZHI7CisJCXJldDQtPnNpbl9hZGRyLnNfYWRkciA9IGluNC0+c2luX2FkZHIuc19hZGRyOworCX0gZWxzZSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmluNiAgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmYWRkcjsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqcmV0NiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHJldGFkZHI7CisJCW1lbWNweSgmcmV0Ni0+c2luNl9hZGRyLCAmaW42LT5zaW42X2FkZHIsCisJCSAgICAgICBzaXplb2YoaW42LT5zaW42X2FkZHIpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSWYgYWxsb2MgaXMgMCBoZXJlIHdlIHdpbGwgbm90IGF0dGVtcHQgdG8gYWxsb2NhdGUgYSBuZXcKKyAgIG5vZGVpbmZvIHN0cnVjdCAqLworc3RhdGljIHN0cnVjdCBub2RlaW5mbyAqbm9kZWlkMm5vZGVpbmZvKGludCBub2RlaWQsIGdmcF90IGFsbG9jKQoreworCXN0cnVjdCBub2RlaW5mbyAqbmk7CisJaW50IHI7CisJaW50IG47CisKKwlkb3duX3JlYWQoJm5vZGVpbmZvX2xvY2spOworCW5pID0gaWRyX2ZpbmQoJm5vZGVpbmZvX2lkciwgbm9kZWlkKTsKKwl1cF9yZWFkKCZub2RlaW5mb19sb2NrKTsKKworCWlmIChuaSB8fCAhYWxsb2MpCisJCXJldHVybiBuaTsKKworCWRvd25fd3JpdGUoJm5vZGVpbmZvX2xvY2spOworCisJbmkgPSBpZHJfZmluZCgmbm9kZWluZm9faWRyLCBub2RlaWQpOworCWlmIChuaSkKKwkJZ290byBvdXRfdXA7CisKKwlyID0gaWRyX3ByZV9nZXQoJm5vZGVpbmZvX2lkciwgYWxsb2MpOworCWlmICghcikKKwkJZ290byBvdXRfdXA7CisKKwluaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlaW5mbyksIGFsbG9jKTsKKwlpZiAoIW5pKQorCQlnb3RvIG91dF91cDsKKworCXIgPSBpZHJfZ2V0X25ld19hYm92ZSgmbm9kZWluZm9faWRyLCBuaSwgbm9kZWlkLCAmbik7CisJaWYgKHIpIHsKKwkJa2ZyZWUobmkpOworCQluaSA9IE5VTEw7CisJCWdvdG8gb3V0X3VwOworCX0KKwlpZiAobiAhPSBub2RlaWQpIHsKKwkJaWRyX3JlbW92ZSgmbm9kZWluZm9faWRyLCBuKTsKKwkJa2ZyZWUobmkpOworCQluaSA9IE5VTEw7CisJCWdvdG8gb3V0X3VwOworCX0KKwltZW1zZXQobmksIDAsIHNpemVvZihzdHJ1Y3Qgbm9kZWluZm8pKTsKKwlzcGluX2xvY2tfaW5pdCgmbmktPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZuaS0+d3JpdGVxdWV1ZSk7CisJc3Bpbl9sb2NrX2luaXQoJm5pLT53cml0ZXF1ZXVlX2xvY2spOworCW5pLT5ub2RlaWQgPSBub2RlaWQ7CisKKwlpZiAobm9kZWlkID4gbWF4X25vZGVpZCkKKwkJbWF4X25vZGVpZCA9IG5vZGVpZDsKK291dF91cDoKKwl1cF93cml0ZSgmbm9kZWluZm9fbG9jayk7CisKKwlyZXR1cm4gbmk7Cit9CisKKy8qIERvbid0IGNhbGwgdGhpcyB0b28gb2Z0ZW4uLi4gKi8KK3N0YXRpYyBzdHJ1Y3Qgbm9kZWluZm8gKmFzc29jMm5vZGVpbmZvKHNjdHBfYXNzb2NfdCBhc3NvYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgbm9kZWluZm8gKm5pOworCisJZm9yIChpPTE7IGk8PW1heF9ub2RlaWQ7IGkrKykgeworCQluaSA9IG5vZGVpZDJub2RlaW5mbyhpLCAwKTsKKwkJaWYgKG5pICYmIG5pLT5hc3NvY19pZCA9PSBhc3NvYykKKwkJCXJldHVybiBuaTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIERhdGEgb3Igbm90aWZpY2F0aW9uIGF2YWlsYWJsZSBvbiBzb2NrZXQgKi8KK3N0YXRpYyB2b2lkIGxvd2NvbW1zX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgY291bnRfdW51c2VkKQoreworCWF0b21pY19pbmMoJnNjdHBfY29uLndhaXRpbmdfcmVxdWVzdHMpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KENGX1JFQURfUEVORElORywgJnNjdHBfY29uLmZsYWdzKSkKKwkJcmV0dXJuOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb3djb21tc19yZWN2X3dhaXQpOworfQorCisKKy8qIEFkZCB0aGUgcG9ydCBudW1iZXIgdG8gYW4gSVA2IG9yIDQgc29ja2FkZHIgYW5kIHJldHVybiB0aGUgYWRkcmVzcyBsZW5ndGguCisgICBBbHNvIHBhZGQgb3V0IHRoZSBzdHJ1Y3Qgd2l0aCB6ZXJvcyB0byBtYWtlIGNvbXBhcmlzb25zIG1lYW5pbmdmdWwgKi8KKworc3RhdGljIHZvaWQgbWFrZV9zb2NrYWRkcihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc2FkZHIsIHVpbnQxNl90IHBvcnQsCisJCQkgIGludCAqYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luICpsb2NhbDRfYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpsb2NhbDZfYWRkcjsKKworCWlmICghZGxtX2xvY2FsX2NvdW50KQorCQlyZXR1cm47CisKKwlpZiAoIXBvcnQpIHsKKwkJaWYgKGRsbV9sb2NhbF9hZGRyWzBdLT5zc19mYW1pbHkgPT0gQUZfSU5FVCkgeworCQkJbG9jYWw0X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopZGxtX2xvY2FsX2FkZHJbMF07CisJCQlwb3J0ID0gYmUxNl90b19jcHUobG9jYWw0X2FkZHItPnNpbl9wb3J0KTsKKwkJfSBlbHNlIHsKKwkJCWxvY2FsNl9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilkbG1fbG9jYWxfYWRkclswXTsKKwkJCXBvcnQgPSBiZTE2X3RvX2NwdShsb2NhbDZfYWRkci0+c2luNl9wb3J0KTsKKwkJfQorCX0KKworCXNhZGRyLT5zc19mYW1pbHkgPSBkbG1fbG9jYWxfYWRkclswXS0+c3NfZmFtaWx5OworCWlmIChkbG1fbG9jYWxfYWRkclswXS0+c3NfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luICppbjRfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYWRkcjsKKwkJaW40X2FkZHItPnNpbl9wb3J0ID0gY3B1X3RvX2JlMTYocG9ydCk7CisJCW1lbXNldCgmaW40X2FkZHItPnNpbl96ZXJvLCAwLCBzaXplb2YoaW40X2FkZHItPnNpbl96ZXJvKSk7CisJCW1lbXNldChpbjRfYWRkcisxLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpIC0KKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwkJKmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqaW42X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhZGRyOworCQlpbjZfYWRkci0+c2luNl9wb3J0ID0gY3B1X3RvX2JlMTYocG9ydCk7CisJCW1lbXNldChpbjZfYWRkcisxLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpIC0KKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJCSphZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwl9Cit9CisKKy8qIENsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCB0aWR5IHVwICovCitzdGF0aWMgdm9pZCBjbG9zZV9jb25uZWN0aW9uKHZvaWQpCit7CisJaWYgKHNjdHBfY29uLnNvY2spIHsKKwkJc29ja19yZWxlYXNlKHNjdHBfY29uLnNvY2spOworCQlzY3RwX2Nvbi5zb2NrID0gTlVMTDsKKwl9CisKKwlpZiAoc2N0cF9jb24ucnhfcGFnZSkgeworCQlfX2ZyZWVfcGFnZShzY3RwX2Nvbi5yeF9wYWdlKTsKKwkJc2N0cF9jb24ucnhfcGFnZSA9IE5VTEw7CisJfQorfQorCisvKiBXZSBvbmx5IHNlbmQgc2h1dGRvd24gbWVzc2FnZXMgdG8gbm9kZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGNsdXN0ZXIgKi8KK3N0YXRpYyB2b2lkIHNlbmRfc2h1dGRvd24oc2N0cF9hc3NvY190IGFzc29jaWQpCit7CisJc3RhdGljIGNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKwlpbnQgcmV0OworCisJb3V0bWVzc2FnZS5tc2dfbmFtZSA9IE5VTEw7CisJb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IDA7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbCA9IG91dGNtc2c7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKwlvdXRtZXNzYWdlLm1zZ19mbGFncyA9IE1TR19FT1I7CisKKwljbXNnID0gQ01TR19GSVJTVEhEUigmb3V0bWVzc2FnZSk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gQ01TR19EQVRBKGNtc2cpOworCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworCXNpbmZvLT5zaW5mb19mbGFncyB8PSBNU0dfRU9GOworCXNpbmZvLT5zaW5mb19hc3NvY19pZCA9IGFzc29jaWQ7CisKKwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhzY3RwX2Nvbi5zb2NrLCAmb3V0bWVzc2FnZSwgTlVMTCwgMCwgMCk7CisKKwlpZiAocmV0ICE9IDApCisJCWxvZ19wcmludCgic2VuZCBFT0YgdG8gbm9kZSBmYWlsZWQ6ICVkIiwgcmV0KTsKK30KKworCisvKiBJTklUIGZhaWxlZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBub2RlLi4uCisgICByZXN0YXJ0IElOSVQgb24gYWxsIHBlbmRpbmcgbm9kZXMgKi8KK3N0YXRpYyB2b2lkIGluaXRfZmFpbGVkKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IG5vZGVpbmZvICpuaTsKKworCWZvciAoaT0xOyBpPD1tYXhfbm9kZWlkOyBpKyspIHsKKwkJbmkgPSBub2RlaWQybm9kZWluZm8oaSwgMCk7CisJCWlmICghbmkpCisJCQljb250aW51ZTsKKworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5JX0lOSVRfUEVORElORywgJm5pLT5mbGFncykpIHsKKwkJCW5pLT5hc3NvY19pZCA9IDA7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTklfV1JJVEVfUEVORElORywgJm5pLT5mbGFncykpIHsKKwkJCQlzcGluX2xvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOworCQkJCWxpc3RfYWRkX3RhaWwoJm5pLT53cml0ZV9saXN0LCAmd3JpdGVfbm9kZXMpOworCQkJCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKKwkJCX0KKwkJfQorCX0KKwl3YWtlX3VwX3Byb2Nlc3Moc2VuZF90YXNrKTsKK30KKworLyogU29tZXRoaW5nIGhhcHBlbmVkIHRvIGFuIGFzc29jaWF0aW9uICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3NjdHBfbm90aWZpY2F0aW9uKHN0cnVjdCBtc2doZHIgKm1zZywgY2hhciAqYnVmKQoreworCXVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICpzbiA9ICh1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqKWJ1ZjsKKworCWlmIChzbi0+c25faGVhZGVyLnNuX3R5cGUgPT0gU0NUUF9BU1NPQ19DSEFOR0UpIHsKKwkJc3dpdGNoIChzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19zdGF0ZSkgeworCisJCWNhc2UgU0NUUF9DT01NX1VQOgorCQljYXNlIFNDVFBfUkVTVEFSVDoKKwkJeworCQkJLyogQ2hlY2sgdGhhdCB0aGUgbmV3IG5vZGUgaXMgaW4gdGhlIGxvY2tzcGFjZSAqLworCQkJc3RydWN0IHNjdHBfcHJpbSBwcmltOworCQkJbW1fc2VnbWVudF90IGZzOworCQkJaW50IG5vZGVpZDsKKwkJCWludCBwcmltX2xlbiwgcmV0OworCQkJaW50IGFkZHJfbGVuOworCQkJc3RydWN0IG5vZGVpbmZvICpuaTsKKworCQkJLyogVGhpcyBzZWVtcyB0byBoYXBwZW4gd2hlbiB3ZSByZWNlaXZlZCBhIGNvbm5lY3Rpb24KKwkJCSAqIHRvbyBlYXJseS4uLiBvciBzb21ldGhpbmcuLi4gIGFueXdheSwgaXQgaGFwcGVucyBidXQKKwkJCSAqIHdlIGFsd2F5cyBzZWVtIHRvIGdldCBhIHJlYWwgbWVzc2FnZSB0b28sIHNlZQorCQkJICogcmVjZWl2ZV9mcm9tX3NvY2sgKi8KKworCQkJaWYgKChpbnQpc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfYXNzb2NfaWQgPD0gMCkgeworCQkJCWxvZ19wcmludCgiQ09NTV9VUCBmb3IgaW52YWxpZCBhc3NvYyBJRCAlZCIsCisJCQkJCSAgKGludClzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZCk7CisJCQkJaW5pdF9mYWlsZWQoKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQltZW1zZXQoJnByaW0sIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9wcmltKSk7CisJCQlwcmltX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9wcmltKTsKKwkJCXByaW0uc3NwX2Fzc29jX2lkID0gc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfYXNzb2NfaWQ7CisKKwkJCWZzID0gZ2V0X2ZzKCk7CisJCQlzZXRfZnMoZ2V0X2RzKCkpOworCQkJcmV0ID0gc2N0cF9jb24uc29jay0+b3BzLT5nZXRzb2Nrb3B0KHNjdHBfY29uLnNvY2ssCisJCQkJCQkJICAgICBJUFBST1RPX1NDVFAsCisJCQkJCQkJICAgICBTQ1RQX1BSSU1BUllfQUREUiwKKwkJCQkJCQkgICAgIChjaGFyKikmcHJpbSwKKwkJCQkJCQkgICAgICZwcmltX2xlbik7CisJCQlzZXRfZnMoZnMpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlzdHJ1Y3Qgbm9kZWluZm8gKm5pOworCisJCQkJbG9nX3ByaW50KCJnZXRzb2Nrb3B0L3NjdHBfcHJpbWFyeV9hZGRyIG9uICIKKwkJCQkJICAibmV3IGFzc29jICVkIGZhaWxlZCA6ICVkIiwKKwkJCQkJICAoaW50KXNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX2Fzc29jX2lkLAorCQkJCQkgIHJldCk7CisKKwkJCQkvKiBSZXRyeSBJTklUIGxhdGVyICovCisJCQkJbmkgPSBhc3NvYzJub2RlaW5mbyhzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZCk7CisJCQkJaWYgKG5pKQorCQkJCQljbGVhcl9iaXQoTklfSU5JVF9QRU5ESU5HLCAmbmktPmZsYWdzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQltYWtlX3NvY2thZGRyKCZwcmltLnNzcF9hZGRyLCAwLCAmYWRkcl9sZW4pOworCQkJaWYgKGRsbV9hZGRyX3RvX25vZGVpZCgmcHJpbS5zc3BfYWRkciwgJm5vZGVpZCkpIHsKKwkJCQlsb2dfcHJpbnQoInJlamVjdCBjb25uZWN0IGZyb20gdW5rbm93biBhZGRyIik7CisJCQkJc2VuZF9zaHV0ZG93bihwcmltLnNzcF9hc3NvY19pZCk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQluaSA9IG5vZGVpZDJub2RlaW5mbyhub2RlaWQsIEdGUF9LRVJORUwpOworCQkJaWYgKCFuaSkKKwkJCQlyZXR1cm47CisKKwkJCS8qIFNhdmUgdGhlIGFzc29jIElEICovCisJCQluaS0+YXNzb2NfaWQgPSBzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZDsKKworCQkJbG9nX3ByaW50KCJnb3QgbmV3L3Jlc3RhcnRlZCBhc3NvY2lhdGlvbiAlZCBub2RlaWQgJWQiLAorCQkJCSAgKGludClzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZCwgbm9kZWlkKTsKKworCQkJLyogU2VuZCBhbnkgcGVuZGluZyB3cml0ZXMgKi8KKwkJCWNsZWFyX2JpdChOSV9JTklUX1BFTkRJTkcsICZuaS0+ZmxhZ3MpOworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE5JX1dSSVRFX1BFTkRJTkcsICZuaS0+ZmxhZ3MpKSB7CisJCQkJc3Bpbl9sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKKwkJCQlsaXN0X2FkZF90YWlsKCZuaS0+d3JpdGVfbGlzdCwgJndyaXRlX25vZGVzKTsKKwkJCQlzcGluX3VubG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7CisJCQl9CisJCQl3YWtlX3VwX3Byb2Nlc3Moc2VuZF90YXNrKTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIFNDVFBfQ09NTV9MT1NUOgorCQljYXNlIFNDVFBfU0hVVERPV05fQ09NUDoKKwkJeworCQkJc3RydWN0IG5vZGVpbmZvICpuaTsKKworCQkJbmkgPSBhc3NvYzJub2RlaW5mbyhzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZCk7CisJCQlpZiAobmkpIHsKKwkJCQlzcGluX2xvY2soJm5pLT5sb2NrKTsKKwkJCQluaS0+YXNzb2NfaWQgPSAwOworCQkJCXNwaW5fdW5sb2NrKCZuaS0+bG9jayk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkJLyogV2UgZG9uJ3Qga25vdyB3aGljaCBJTklUIGZhaWxlZCwgc28gY2xlYXIgdGhlIFBFTkRJTkcgZmxhZ3MKKwkJICogb24gdGhlbSBhbGwuICBpZiBhc3NvY19pZCBpcyB6ZXJvIHRoZW4gaXQgd2lsbCB0aGVuIHRyeQorCQkgKiBhZ2FpbiAqLworCisJCWNhc2UgU0NUUF9DQU5UX1NUUl9BU1NPQzoKKwkJeworCQkJbG9nX3ByaW50KCJDYW4ndCBzdGFydCBTQ1RQIGFzc29jaWF0aW9uIC0gcmV0cnlpbmciKTsKKwkJCWluaXRfZmFpbGVkKCk7CisJCX0KKwkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWxvZ19wcmludCgidW5leHBlY3RlZCBTQ1RQIGFzc29jIGNoYW5nZSBpZD0lZCBzdGF0ZT0lZCIsCisJCQkJICAoaW50KXNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX2Fzc29jX2lkLAorCQkJCSAgc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfc3RhdGUpOworCQl9CisJfQorfQorCisvKiBEYXRhIHJlY2VpdmVkIGZyb20gcmVtb3RlIGVuZCAqLworc3RhdGljIGludCByZWNlaXZlX2Zyb21fc29jayh2b2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsyXTsKKwl1bnNpZ25lZCBsZW47CisJaW50IHI7CisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IG5vZGVpbmZvICpuaTsKKworCS8qIFRoZXNlIHR3byBhcmUgbWFyZ2luYWxseSB0b28gYmlnIGZvciBzdGFjayBhbGxvY2F0aW9uLCBidXQgdGhpcworCSAqIGZ1bmN0aW9uIGlzIChjdXJyZW50bHkpIG9ubHkgY2FsbGVkIGJ5IGRsbV9yZWN2ZCBzbyBzdGF0aWMgc2hvdWxkIGJlCisJICogT0suCisJICovCisJc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIG1zZ25hbWU7CisJc3RhdGljIGNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07CisKKwlpZiAoc2N0cF9jb24uc29jayA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmIChzY3RwX2Nvbi5yeF9wYWdlID09IE5VTEwpIHsKKwkJLyoKKwkJICogVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgYXRvbWljLCBidXQgSSB0aGluayBpdCBzaG91bGQKKwkJICogaW1wcm92ZSBwZXJmb3JtYW5jZSBpZiBpdCBpcy4KKwkJICovCisJCXNjdHBfY29uLnJ4X3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOworCQlpZiAoc2N0cF9jb24ucnhfcGFnZSA9PSBOVUxMKQorCQkJZ290byBvdXRfcmVzY2hlZDsKKwkJY2J1Zl9pbml0KCZzY3RwX2Nvbi5jYiwgUEFHRV9DQUNIRV9TSVpFKTsKKwl9CisKKwltZW1zZXQoJmluY21zZywgMCwgc2l6ZW9mKGluY21zZykpOworCW1lbXNldCgmbXNnbmFtZSwgMCwgc2l6ZW9mKG1zZ25hbWUpKTsKKworCW1zZy5tc2dfbmFtZSA9ICZtc2duYW1lOworCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihtc2duYW1lKTsKKwltc2cubXNnX2ZsYWdzID0gMDsKKwltc2cubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCisJLyogSSBkb24ndCBzZWUgd2h5IHRoaXMgY2lyY3VsYXIgYnVmZmVyIHN0dWZmIGlzIG5lY2Vzc2FyeSBmb3IgU0NUUAorCSAqIHdoaWNoIGlzIGEgcGFja2V0LWJhc2VkIHByb3RvY29sLCBidXQgdGhlIHdob2xlIHRoaW5nIGJyZWFrcyB1bmRlcgorCSAqIGxvYWQgd2l0aG91dCBpdCEgVGhlIG92ZXJoZWFkIGlzIG1pbmltYWwgKGFuZCBpcyBpbiB0aGUgVENQIGxvd2NvbW1zCisJICogYW55d2F5LCBvZiBjb3Vyc2UpIHNvIEknbGwgbGVhdmUgaXQgaW4gdW50aWwgSSBjYW4gZmlndXJlIG91dCB3aGF0J3MKKwkgKiByZWFsbHkgaGFwcGVuaW5nLgorCSAqLworCisJLyoKKwkgKiBpb3ZbMF0gaXMgdGhlIGJpdCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGJldHdlZW4gdGhlIGN1cnJlbnQgZW5kCisJICogcG9pbnQgKGNiLmJhc2UgKyBjYi5sZW4pIGFuZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisJICovCisJaW92WzBdLmlvdl9sZW4gPSBzY3RwX2Nvbi5jYi5iYXNlIC0gY2J1Zl9kYXRhKCZzY3RwX2Nvbi5jYik7CisJaW92WzBdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKHNjdHBfY29uLnJ4X3BhZ2UpICsKKwkJY2J1Zl9kYXRhKCZzY3RwX2Nvbi5jYik7CisJaW92WzFdLmlvdl9sZW4gPSAwOworCisJLyoKKwkgKiBpb3ZbMV0gaXMgdGhlIGJpdCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQorCSAqIGJ1ZmZlciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50bHkgdXNlZCBzZWN0aW9uIChjYi5iYXNlKQorCSAqLworCWlmIChjYnVmX2RhdGEoJnNjdHBfY29uLmNiKSA+PSBzY3RwX2Nvbi5jYi5iYXNlKSB7CisJCWlvdlswXS5pb3ZfbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0gY2J1Zl9kYXRhKCZzY3RwX2Nvbi5jYik7CisJCWlvdlsxXS5pb3ZfbGVuID0gc2N0cF9jb24uY2IuYmFzZTsKKwkJaW92WzFdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKHNjdHBfY29uLnJ4X3BhZ2UpOworCQltc2cubXNnX2lvdmxlbiA9IDI7CisJfQorCWxlbiA9IGlvdlswXS5pb3ZfbGVuICsgaW92WzFdLmlvdl9sZW47CisKKwlyID0gcmV0ID0ga2VybmVsX3JlY3Ztc2coc2N0cF9jb24uc29jaywgJm1zZywgaW92LCBtc2cubXNnX2lvdmxlbiwgbGVuLAorCQkJCSBNU0dfTk9TSUdOQUwgfCBNU0dfRE9OVFdBSVQpOworCWlmIChyZXQgPD0gMCkKKwkJZ290byBvdXRfY2xvc2U7CisKKwltc2cubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisJc2luZm8gPSBDTVNHX0RBVEEoY21zZyk7CisKKwlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19OT1RJRklDQVRJT04pIHsKKwkJcHJvY2Vzc19zY3RwX25vdGlmaWNhdGlvbigmbXNnLCBwYWdlX2FkZHJlc3Moc2N0cF9jb24ucnhfcGFnZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJcyB0aGlzIGEgbmV3IGFzc29jaWF0aW9uID8gKi8KKwluaSA9IG5vZGVpZDJub2RlaW5mbyhsZTMyX3RvX2NwdShzaW5mby0+c2luZm9fcHBpZCksIEdGUF9LRVJORUwpOworCWlmIChuaSkgeworCQluaS0+YXNzb2NfaWQgPSBzaW5mby0+c2luZm9fYXNzb2NfaWQ7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTklfSU5JVF9QRU5ESU5HLCAmbmktPmZsYWdzKSkgeworCisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTklfV1JJVEVfUEVORElORywgJm5pLT5mbGFncykpIHsKKwkJCQlzcGluX2xvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOworCQkJCWxpc3RfYWRkX3RhaWwoJm5pLT53cml0ZV9saXN0LCAmd3JpdGVfbm9kZXMpOworCQkJCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKKwkJCX0KKwkJCXdha2VfdXBfcHJvY2VzcyhzZW5kX3Rhc2spOworCQl9CisJfQorCisJLyogSU5JVCBzZW5kcyBhIG1lc3NhZ2Ugd2l0aCBsZW5ndGggb2YgMSAtIGlnbm9yZSBpdCAqLworCWlmIChyID09IDEpCisJCXJldHVybiAwOworCisJY2J1Zl9hZGQoJnNjdHBfY29uLmNiLCByZXQpOworCXJldCA9IGRsbV9wcm9jZXNzX2luY29taW5nX2J1ZmZlcihjcHVfdG9fbGUzMihzaW5mby0+c2luZm9fcHBpZCksCisJCQkJCSAgcGFnZV9hZGRyZXNzKHNjdHBfY29uLnJ4X3BhZ2UpLAorCQkJCQkgIHNjdHBfY29uLmNiLmJhc2UsIHNjdHBfY29uLmNiLmxlbiwKKwkJCQkJICBQQUdFX0NBQ0hFX1NJWkUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9jbG9zZTsKKwljYnVmX2VhdCgmc2N0cF9jb24uY2IsIHJldCk7CisKK291dDoKKwlyZXQgPSAwOworCWdvdG8gb3V0X3JldDsKKworb3V0X3Jlc2NoZWQ6CisJbG93Y29tbXNfZGF0YV9yZWFkeShzY3RwX2Nvbi5zb2NrLT5zaywgMCk7CisJcmV0ID0gMDsKKwljb25kX3Jlc2NoZWQoKTsKKwlnb3RvIG91dF9yZXQ7CisKK291dF9jbG9zZToKKwlpZiAocmV0ICE9IC1FQUdBSU4pCisJCWxvZ19wcmludCgiZXJyb3IgcmVhZGluZyBmcm9tIHNjdHAgc29ja2V0OiAlZCIsIHJldCk7CitvdXRfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIEJpbmQgdG8gYW4gSVAgYWRkcmVzcy4gU0NUUCBhbGxvd3MgbXVsdGlwbGUgYWRkcmVzcyBzbyBpdCBjYW4gZG8gbXVsdGktaG9taW5nICovCitzdGF0aWMgaW50IGFkZF9iaW5kX2FkZHIoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIGludCBhZGRyX2xlbiwgaW50IG51bSkKK3sKKwltbV9zZWdtZW50X3QgZnM7CisJaW50IHJlc3VsdCA9IDA7CisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisJaWYgKG51bSA9PSAxKQorCQlyZXN1bHQgPSBzY3RwX2Nvbi5zb2NrLT5vcHMtPmJpbmQoc2N0cF9jb24uc29jaywKKwkJCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSBhZGRyLAorCQkJCQkJICBhZGRyX2xlbik7CisJZWxzZQorCQlyZXN1bHQgPSBzY3RwX2Nvbi5zb2NrLT5vcHMtPnNldHNvY2tvcHQoc2N0cF9jb24uc29jaywgU09MX1NDVFAsCisJCQkJCQkJU0NUUF9TT0NLT1BUX0JJTkRYX0FERCwKKwkJCQkJCQkoY2hhciAqKWFkZHIsIGFkZHJfbGVuKTsKKwlzZXRfZnMoZnMpOworCisJaWYgKHJlc3VsdCA8IDApCisJCWxvZ19wcmludCgiQ2FuJ3QgYmluZCB0byBwb3J0ICVkIGFkZHIgbnVtYmVyICVkIiwKKwkJCSAgZGxtX2NvbmZpZy50Y3BfcG9ydCwgbnVtKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfbG9jYWwodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYXMsICphZGRyOworCWludCBpOworCisJZGxtX2xvY2FsX25vZGVpZCA9IGRsbV9vdXJfbm9kZWlkKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRExNX01BWF9BRERSX0NPVU5UIC0gMTsgaSsrKSB7CisJCWlmIChkbG1fb3VyX2FkZHIoJnNhcywgaSkpCisJCQlicmVhazsKKworCQlhZGRyID0ga21hbGxvYyhzaXplb2YoKmFkZHIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhZGRyKQorCQkJYnJlYWs7CisJCW1lbWNweShhZGRyLCAmc2FzLCBzaXplb2YoKmFkZHIpKTsKKwkJZGxtX2xvY2FsX2FkZHJbZGxtX2xvY2FsX2NvdW50KytdID0gYWRkcjsKKwl9Cit9CisKKy8qIEluaXRpYWxpc2UgU0NUUCBzb2NrZXQgYW5kIGJpbmQgdG8gYWxsIGludGVyZmFjZXMgKi8KK3N0YXRpYyBpbnQgaW5pdF9zb2NrKHZvaWQpCit7CisJbW1fc2VnbWVudF90IGZzOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGxvY2FsYWRkcjsKKwlzdHJ1Y3Qgc2N0cF9ldmVudF9zdWJzY3JpYmUgc3Vic2NyaWJlOworCWludCByZXN1bHQgPSAtRUlOVkFMLCBudW0gPSAxLCBpLCBhZGRyX2xlbjsKKworCWlmICghZGxtX2xvY2FsX2NvdW50KSB7CisJCWluaXRfbG9jYWwoKTsKKwkJaWYgKCFkbG1fbG9jYWxfY291bnQpIHsKKwkJCWxvZ19wcmludCgibm8gbG9jYWwgSVAgYWRkcmVzcyBoYXMgYmVlbiBzZXQiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmVzdWx0ID0gc29ja19jcmVhdGVfa2VybihkbG1fbG9jYWxfYWRkclswXS0+c3NfZmFtaWx5LCBTT0NLX1NFUVBBQ0tFVCwKKwkJCQkgIElQUFJPVE9fU0NUUCwgJnNvY2spOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWxvZ19wcmludCgiQ2FuJ3QgY3JlYXRlIGNvbW1zIHNvY2tldCwgY2hlY2sgU0NUUCBpcyBsb2FkZWQiKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTGlzdGVuIGZvciBldmVudHMgKi8KKwltZW1zZXQoJnN1YnNjcmliZSwgMCwgc2l6ZW9mKHN1YnNjcmliZSkpOworCXN1YnNjcmliZS5zY3RwX2RhdGFfaW9fZXZlbnQgPSAxOworCXN1YnNjcmliZS5zY3RwX2Fzc29jaWF0aW9uX2V2ZW50ID0gMTsKKwlzdWJzY3JpYmUuc2N0cF9zZW5kX2ZhaWx1cmVfZXZlbnQgPSAxOworCXN1YnNjcmliZS5zY3RwX3NodXRkb3duX2V2ZW50ID0gMTsKKwlzdWJzY3JpYmUuc2N0cF9wYXJ0aWFsX2RlbGl2ZXJ5X2V2ZW50ID0gMTsKKworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwlyZXN1bHQgPSBzb2NrLT5vcHMtPnNldHNvY2tvcHQoc29jaywgU09MX1NDVFAsIFNDVFBfRVZFTlRTLAorCQkJCSAgICAgICAoY2hhciAqKSZzdWJzY3JpYmUsIHNpemVvZihzdWJzY3JpYmUpKTsKKwlzZXRfZnMoZnMpOworCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJbG9nX3ByaW50KCJGYWlsZWQgdG8gc2V0IFNDVFBfRVZFTlRTIG9uIHNvY2tldDogcmVzdWx0PSVkIiwKKwkJCSAgcmVzdWx0KTsKKwkJZ290byBjcmVhdGVfZGVsc29jazsKKwl9CisKKwkvKiBJbml0IGNvbiBzdHJ1Y3QgKi8KKwlzb2NrLT5zay0+c2tfdXNlcl9kYXRhID0gJnNjdHBfY29uOworCXNjdHBfY29uLnNvY2sgPSBzb2NrOworCXNjdHBfY29uLnNvY2stPnNrLT5za19kYXRhX3JlYWR5ID0gbG93Y29tbXNfZGF0YV9yZWFkeTsKKworCS8qIEJpbmQgdG8gYWxsIGludGVyZmFjZXMuICovCisJZm9yIChpID0gMDsgaSA8IGRsbV9sb2NhbF9jb3VudDsgaSsrKSB7CisJCW1lbWNweSgmbG9jYWxhZGRyLCBkbG1fbG9jYWxfYWRkcltpXSwgc2l6ZW9mKGxvY2FsYWRkcikpOworCQltYWtlX3NvY2thZGRyKCZsb2NhbGFkZHIsIGRsbV9jb25maWcudGNwX3BvcnQsICZhZGRyX2xlbik7CisKKwkJcmVzdWx0ID0gYWRkX2JpbmRfYWRkcigmbG9jYWxhZGRyLCBhZGRyX2xlbiwgbnVtKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gY3JlYXRlX2RlbHNvY2s7CisJCSsrbnVtOworCX0KKworCXJlc3VsdCA9IHNvY2stPm9wcy0+bGlzdGVuKHNvY2ssIDUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWxvZ19wcmludCgiQ2FuJ3Qgc2V0IHNvY2tldCBsaXN0ZW5pbmciKTsKKwkJZ290byBjcmVhdGVfZGVsc29jazsKKwl9CisKKwlyZXR1cm4gMDsKKworY3JlYXRlX2RlbHNvY2s6CisJc29ja19yZWxlYXNlKHNvY2spOworCXNjdHBfY29uLnNvY2sgPSBOVUxMOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICpuZXdfd3JpdGVxdWV1ZV9lbnRyeShnZnBfdCBhbGxvY2F0aW9uKQoreworCXN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdyaXRlcXVldWVfZW50cnkpLCBhbGxvY2F0aW9uKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCWVudHJ5LT5wYWdlID0gYWxsb2NfcGFnZShhbGxvY2F0aW9uKTsKKwlpZiAoIWVudHJ5LT5wYWdlKSB7CisJCWtmcmVlKGVudHJ5KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZW50cnktPm9mZnNldCA9IDA7CisJZW50cnktPmxlbiA9IDA7CisJZW50cnktPmVuZCA9IDA7CisJZW50cnktPnVzZXJzID0gMDsKKworCXJldHVybiBlbnRyeTsKK30KKwordm9pZCAqZGxtX2xvd2NvbW1zX2dldF9idWZmZXIoaW50IG5vZGVpZCwgaW50IGxlbiwgZ2ZwX3QgYWxsb2NhdGlvbiwgY2hhciAqKnBwYykKK3sKKwlzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSAqZTsKKwlpbnQgb2Zmc2V0ID0gMDsKKwlpbnQgdXNlcnMgPSAwOworCXN0cnVjdCBub2RlaW5mbyAqbmk7CisKKwluaSA9IG5vZGVpZDJub2RlaW5mbyhub2RlaWQsIGFsbG9jYXRpb24pOworCWlmICghbmkpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKKwllID0gbGlzdF9lbnRyeShuaS0+d3JpdGVxdWV1ZS5wcmV2LCBzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSwgbGlzdCk7CisJaWYgKCgmZS0+bGlzdCA9PSAmbmktPndyaXRlcXVldWUpIHx8CisJICAgIChQQUdFX0NBQ0hFX1NJWkUgLSBlLT5lbmQgPCBsZW4pKSB7CisJCWUgPSBOVUxMOworCX0gZWxzZSB7CisJCW9mZnNldCA9IGUtPmVuZDsKKwkJZS0+ZW5kICs9IGxlbjsKKwkJdXNlcnMgPSBlLT51c2VycysrOworCX0KKwlzcGluX3VubG9jaygmbmktPndyaXRlcXVldWVfbG9jayk7CisKKwlpZiAoZSkgeworCWdvdF9vbmU6CisJCWlmICh1c2VycyA9PSAwKQorCQkJa21hcChlLT5wYWdlKTsKKwkJKnBwYyA9IHBhZ2VfYWRkcmVzcyhlLT5wYWdlKSArIG9mZnNldDsKKwkJcmV0dXJuIGU7CisJfQorCisJZSA9IG5ld193cml0ZXF1ZXVlX2VudHJ5KGFsbG9jYXRpb24pOworCWlmIChlKSB7CisJCXNwaW5fbG9jaygmbmktPndyaXRlcXVldWVfbG9jayk7CisJCW9mZnNldCA9IGUtPmVuZDsKKwkJZS0+ZW5kICs9IGxlbjsKKwkJZS0+bmkgPSBuaTsKKwkJdXNlcnMgPSBlLT51c2VycysrOworCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmbmktPndyaXRlcXVldWUpOworCQlzcGluX3VubG9jaygmbmktPndyaXRlcXVldWVfbG9jayk7CisJCWdvdG8gZ290X29uZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZGxtX2xvd2NvbW1zX2NvbW1pdF9idWZmZXIodm9pZCAqYXJnKQoreworCXN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICplID0gKHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICopIGFyZzsKKwlpbnQgdXNlcnM7CisJc3RydWN0IG5vZGVpbmZvICpuaSA9IGUtPm5pOworCisJc3Bpbl9sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKKwl1c2VycyA9IC0tZS0+dXNlcnM7CisJaWYgKHVzZXJzKQorCQlnb3RvIG91dDsKKwllLT5sZW4gPSBlLT5lbmQgLSBlLT5vZmZzZXQ7CisJa3VubWFwKGUtPnBhZ2UpOworCXNwaW5fdW5sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChOSV9XUklURV9QRU5ESU5HLCAmbmktPmZsYWdzKSkgeworCQlzcGluX2xvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZuaS0+d3JpdGVfbGlzdCwgJndyaXRlX25vZGVzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOworCQl3YWtlX3VwX3Byb2Nlc3Moc2VuZF90YXNrKTsKKwl9CisJcmV0dXJuOworCitvdXQ6CisJc3Bpbl91bmxvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZnJlZV9lbnRyeShzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSAqZSkKK3sKKwlfX2ZyZWVfcGFnZShlLT5wYWdlKTsKKwlrZnJlZShlKTsKK30KKworLyogSW5pdGlhdGUgYW4gU0NUUCBhc3NvY2lhdGlvbi4gSW4gdGhlb3J5IHdlIGNvdWxkIGp1c3QgdXNlIHNlbmRtc2coKSBvbgorICAgdGhlIGZpcnN0IElQIGFkZHJlc3MgYW5kIGl0IHNob3VsZCB3b3JrLCBidXQgdGhpcyBhbGxvd3MgdXMgdG8gc2V0IHVwIHRoZQorICAgYXNzb2NpYXRpb24gYmVmb3JlIHNlbmRpbmcgYW55IHZhbHVhYmxlIGRhdGEgdGhhdCB3ZSBjYW4ndCBhZmZvcmQgdG8gbG9zZS4KKyAgIEl0IGFsc28ga2VlcHMgdGhlIHNlbmQgcGF0aCBjbGVhbiBhcyBpdCBjYW4gbm93IGFsd2F5cyB1c2UgdGhlIGFzc29jaWF0aW9uIElEICovCitzdGF0aWMgdm9pZCBpbml0aWF0ZV9hc3NvY2lhdGlvbihpbnQgbm9kZWlkKQoreworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHJlbV9hZGRyOworCXN0YXRpYyBjaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKwlzdHJ1Y3QgbXNnaGRyIG91dG1lc3NhZ2U7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CisJaW50IHJldDsKKwlpbnQgYWRkcmxlbjsKKwljaGFyIGJ1ZlsxXTsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CisJc3RydWN0IG5vZGVpbmZvICpuaTsKKworCWxvZ19wcmludCgiSW5pdGlhdGluZyBhc3NvY2lhdGlvbiB3aXRoIG5vZGUgJWQiLCBub2RlaWQpOworCisJbmkgPSBub2RlaWQybm9kZWluZm8obm9kZWlkLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5pKQorCQlyZXR1cm47CisKKwlpZiAobm9kZWlkX3RvX2FkZHIobm9kZWlkLCAoc3RydWN0IHNvY2thZGRyICopJnJlbV9hZGRyKSkgeworCQlsb2dfcHJpbnQoIm5vIGFkZHJlc3MgZm9yIG5vZGVpZCAlZCIsIG5vZGVpZCk7CisJCXJldHVybjsKKwl9CisKKwltYWtlX3NvY2thZGRyKCZyZW1fYWRkciwgZGxtX2NvbmZpZy50Y3BfcG9ydCwgJmFkZHJsZW4pOworCisJb3V0bWVzc2FnZS5tc2dfbmFtZSA9ICZyZW1fYWRkcjsKKwlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gYWRkcmxlbjsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworCW91dG1lc3NhZ2UubXNnX2ZsYWdzID0gTVNHX0VPUjsKKworCWlvdlswXS5pb3ZfYmFzZSA9IGJ1ZjsKKwlpb3ZbMF0uaW92X2xlbiA9IDE7CisKKwkvKiBSZWFsIElOSVQgbWVzc2FnZXMgc2VlbSB0byBjYXVzZSB0cm91YmxlLiBKdXN0IHNlbmQgYSAxIGJ5dGUgbWVzc2FnZQorCSAgIHdlIGNhbiBhZmZvcmQgdG8gbG9zZSAqLworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlzaW5mbyA9IENNU0dfREFUQShjbXNnKTsKKwltZW1zZXQoc2luZm8sIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJc2luZm8tPnNpbmZvX3BwaWQgPSBjcHVfdG9fbGUzMihkbG1fbG9jYWxfbm9kZWlkKTsKKworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhzY3RwX2Nvbi5zb2NrLCAmb3V0bWVzc2FnZSwgaW92LCAxLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlsb2dfcHJpbnQoInNlbmQgSU5JVCB0byBub2RlIGZhaWxlZDogJWQiLCByZXQpOworCQkvKiBUcnkgYWdhaW4gbGF0ZXIgKi8KKwkJY2xlYXJfYml0KE5JX0lOSVRfUEVORElORywgJm5pLT5mbGFncyk7CisJfQorfQorCisvKiBTZW5kIGEgbWVzc2FnZSAqLworc3RhdGljIHZvaWQgc2VuZF90b19zb2NrKHN0cnVjdCBub2RlaW5mbyAqbmkpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmU7CisJaW50IGxlbiwgb2Zmc2V0OworCXN0cnVjdCBtc2doZHIgb3V0bXNnOworCXN0YXRpYyBjaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisKKwkvKiBTZWUgaWYgd2UgbmVlZCB0byBpbml0IGFuIGFzc29jaWF0aW9uIGJlZm9yZSB3ZSBzdGFydAorCSAgIHNlbmRpbmcgcHJlY2lvdXMgbWVzc2FnZXMgKi8KKwlzcGluX2xvY2soJm5pLT5sb2NrKTsKKwlpZiAoIW5pLT5hc3NvY19pZCAmJiAhdGVzdF9hbmRfc2V0X2JpdChOSV9JTklUX1BFTkRJTkcsICZuaS0+ZmxhZ3MpKSB7CisJCXNwaW5fdW5sb2NrKCZuaS0+bG9jayk7CisJCWluaXRpYXRlX2Fzc29jaWF0aW9uKG5pLT5ub2RlaWQpOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrKCZuaS0+bG9jayk7CisKKwlvdXRtc2cubXNnX25hbWUgPSBOVUxMOyAvKiBXZSB1c2UgYXNzb2NfaWQgKi8KKwlvdXRtc2cubXNnX25hbWVsZW4gPSAwOworCW91dG1zZy5tc2dfY29udHJvbCA9IG91dGNtc2c7CisJb3V0bXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworCW91dG1zZy5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQgfCBNU0dfTk9TSUdOQUwgfCBNU0dfRU9SOworCisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1zZyk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJc2luZm8gPSBDTVNHX0RBVEEoY21zZyk7CisJbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNpbmZvLT5zaW5mb19wcGlkID0gY3B1X3RvX2xlMzIoZGxtX2xvY2FsX25vZGVpZCk7CisJc2luZm8tPnNpbmZvX2Fzc29jX2lkID0gbmktPmFzc29jX2lkOworCW91dG1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCisJc3Bpbl9sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKKwlmb3IgKDs7KSB7CisJCWlmIChsaXN0X2VtcHR5KCZuaS0+d3JpdGVxdWV1ZSkpCisJCQlicmVhazsKKwkJZSA9IGxpc3RfZW50cnkobmktPndyaXRlcXVldWUubmV4dCwgc3RydWN0IHdyaXRlcXVldWVfZW50cnksCisJCQkgICAgICAgbGlzdCk7CisJCWxlbiA9IGUtPmxlbjsKKwkJb2Zmc2V0ID0gZS0+b2Zmc2V0OworCQlCVUdfT04obGVuID09IDAgJiYgZS0+dXNlcnMgPT0gMCk7CisJCXNwaW5fdW5sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKKwkJa21hcChlLT5wYWdlKTsKKworCQlyZXQgPSAwOworCQlpZiAobGVuKSB7CisJCQlpb3YuaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MoZS0+cGFnZSkrb2Zmc2V0OworCQkJaW92Lmlvdl9sZW4gPSBsZW47CisKKwkJCXJldCA9IGtlcm5lbF9zZW5kbXNnKHNjdHBfY29uLnNvY2ssICZvdXRtc2csICZpb3YsIDEsCisJCQkJCSAgICAgbGVuKTsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJCXNjdHBfY29uLmVhZ2Fpbl9mbGFnID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZSBpZiAocmV0IDwgMCkKKwkJCQlnb3RvIHNlbmRfZXJyb3I7CisJCX0gZWxzZSB7CisJCQkvKiBEb24ndCBzdGFydmUgcGVvcGxlIGZpbGxpbmcgYnVmZmVycyAqLworCQkJY29uZF9yZXNjaGVkKCk7CisJCX0KKworCQlzcGluX2xvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOworCQllLT5vZmZzZXQgKz0gcmV0OworCQllLT5sZW4gLT0gcmV0OworCisJCWlmIChlLT5sZW4gPT0gMCAmJiBlLT51c2VycyA9PSAwKSB7CisJCQlsaXN0X2RlbCgmZS0+bGlzdCk7CisJCQlrdW5tYXAoZS0+cGFnZSk7CisJCQlmcmVlX2VudHJ5KGUpOworCQkJY29udGludWU7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOworb3V0OgorCXJldHVybjsKKworc2VuZF9lcnJvcjoKKwlsb2dfcHJpbnQoIkVycm9yIHNlbmRpbmcgdG8gbm9kZSAlZCAlZCIsIG5pLT5ub2RlaWQsIHJldCk7CisJc3Bpbl9sb2NrKCZuaS0+bG9jayk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE5JX0lOSVRfUEVORElORywgJm5pLT5mbGFncykpIHsKKwkJbmktPmFzc29jX2lkID0gMDsKKwkJc3Bpbl91bmxvY2soJm5pLT5sb2NrKTsKKwkJaW5pdGlhdGVfYXNzb2NpYXRpb24obmktPm5vZGVpZCk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZuaS0+bG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qIFRyeSB0byBzZW5kIGFueSBtZXNzYWdlcyB0aGF0IGFyZSBwZW5kaW5nICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX291dHB1dF9xdWV1ZSh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqdGVtcDsKKworCXNwaW5fbG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZ3cml0ZV9ub2RlcykgeworCQlzdHJ1Y3Qgbm9kZWluZm8gKm5pID0KKwkJCWxpc3RfZW50cnkobGlzdCwgc3RydWN0IG5vZGVpbmZvLCB3cml0ZV9saXN0KTsKKwkJY2xlYXJfYml0KE5JX1dSSVRFX1BFTkRJTkcsICZuaS0+ZmxhZ3MpOworCQlsaXN0X2RlbCgmbmktPndyaXRlX2xpc3QpOworCisJCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKKworCQlzZW5kX3RvX3NvY2sobmkpOworCQlzcGluX2xvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7Cit9CisKKy8qIENhbGxlZCBhZnRlciB3ZSd2ZSBoYWQgLUVBR0FJTiBhbmQgYmVlbiB3b2tlbiB1cCAqLworc3RhdGljIHZvaWQgcmVmaWxsX3dyaXRlX3F1ZXVlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MTsgaTw9bWF4X25vZGVpZDsgaSsrKSB7CisJCXN0cnVjdCBub2RlaW5mbyAqbmkgPSBub2RlaWQybm9kZWluZm8oaSwgMCk7CisKKwkJaWYgKG5pKSB7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTklfV1JJVEVfUEVORElORywgJm5pLT5mbGFncykpIHsKKwkJCQlzcGluX2xvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOworCQkJCWxpc3RfYWRkX3RhaWwoJm5pLT53cml0ZV9saXN0LCAmd3JpdGVfbm9kZXMpOworCQkJCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY2xlYW5fb25lX3dyaXRlcXVldWUoc3RydWN0IG5vZGVpbmZvICpuaSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKnRlbXA7CisKKwlzcGluX2xvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wLCAmbmktPndyaXRlcXVldWUpIHsKKwkJc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmUgPQorCQkJbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSwgbGlzdCk7CisJCWxpc3RfZGVsKCZlLT5saXN0KTsKKwkJZnJlZV9lbnRyeShlKTsKKwl9CisJc3Bpbl91bmxvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjbGVhbl93cml0ZXF1ZXVlcyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpPTE7IGk8PW1heF9ub2RlaWQ7IGkrKykgeworCQlzdHJ1Y3Qgbm9kZWluZm8gKm5pID0gbm9kZWlkMm5vZGVpbmZvKGksIDApOworCQlpZiAobmkpCisJCQljbGVhbl9vbmVfd3JpdGVxdWV1ZShuaSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGRlYWxsb2Nfbm9kZWluZm8odm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0xOyBpPD1tYXhfbm9kZWlkOyBpKyspIHsKKwkJc3RydWN0IG5vZGVpbmZvICpuaSA9IG5vZGVpZDJub2RlaW5mbyhpLCAwKTsKKwkJaWYgKG5pKSB7CisJCQlpZHJfcmVtb3ZlKCZub2RlaW5mb19pZHIsIGkpOworCQkJa2ZyZWUobmkpOworCQl9CisJfQorfQorCitpbnQgZGxtX2xvd2NvbW1zX2Nsb3NlKGludCBub2RlaWQpCit7CisJc3RydWN0IG5vZGVpbmZvICpuaTsKKworCW5pID0gbm9kZWlkMm5vZGVpbmZvKG5vZGVpZCwgMCk7CisJaWYgKCFuaSkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrKCZuaS0+bG9jayk7CisJaWYgKG5pLT5hc3NvY19pZCkgeworCQluaS0+YXNzb2NfaWQgPSAwOworCQkvKiBEb24ndCBzZW5kIHNodXRkb3duIGhlcmUsIHNjdHAgd2lsbCBqdXN0IHF1ZXVlIGl0CisJCSAgIHRpbGwgdGhlIG5vZGUgY29tZXMgYmFjayB1cCEgKi8KKwl9CisJc3Bpbl91bmxvY2soJm5pLT5sb2NrKTsKKworCWNsZWFuX29uZV93cml0ZXF1ZXVlKG5pKTsKKwljbGVhcl9iaXQoTklfSU5JVF9QRU5ESU5HLCAmbmktPmZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9saXN0X2VtcHR5KHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXNwaW5fbG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7CisJc3RhdHVzID0gbGlzdF9lbXB0eSgmd3JpdGVfbm9kZXMpOworCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGxtX3JlY3ZkKHZvaWQgKmRhdGEpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlpbnQgY291bnQgPSAwOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWFkZF93YWl0X3F1ZXVlKCZsb3djb21tc19yZWN2X3dhaXQsICZ3YWl0KTsKKwkJaWYgKCF0ZXN0X2JpdChDRl9SRUFEX1BFTkRJTkcsICZzY3RwX2Nvbi5mbGFncykpCisJCQljb25kX3Jlc2NoZWQoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmxvd2NvbW1zX3JlY3Zfd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ0ZfUkVBRF9QRU5ESU5HLCAmc2N0cF9jb24uZmxhZ3MpKSB7CisJCQlpbnQgcmV0OworCisJCQlkbyB7CisJCQkJcmV0ID0gcmVjZWl2ZV9mcm9tX3NvY2soKTsKKworCQkJCS8qIERvbid0IHN0YXJ2ZSBvdXQgZXZlcnlvbmUgZWxzZSAqLworCQkJCWlmICgrK2NvdW50ID49IE1BWF9SWF9NU0dfQ09VTlQpIHsKKwkJCQkJY29uZF9yZXNjaGVkKCk7CisJCQkJCWNvdW50ID0gMDsKKwkJCQl9CisJCQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIHJldCA+PTApOworCQl9CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRsbV9zZW5kZCh2b2lkICpkYXRhKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJYWRkX3dhaXRfcXVldWUoc2N0cF9jb24uc29jay0+c2stPnNrX3NsZWVwLCAmd2FpdCk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAod3JpdGVfbGlzdF9lbXB0eSgpKQorCQkJY29uZF9yZXNjaGVkKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkJaWYgKHNjdHBfY29uLmVhZ2Fpbl9mbGFnKSB7CisJCQlzY3RwX2Nvbi5lYWdhaW5fZmxhZyA9IDA7CisJCQlyZWZpbGxfd3JpdGVfcXVldWUoKTsKKwkJfQorCQlwcm9jZXNzX291dHB1dF9xdWV1ZSgpOworCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKHNjdHBfY29uLnNvY2stPnNrLT5za19zbGVlcCwgJndhaXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRhZW1vbnNfc3RvcCh2b2lkKQoreworCWt0aHJlYWRfc3RvcChyZWN2X3Rhc2spOworCWt0aHJlYWRfc3RvcChzZW5kX3Rhc2spOworfQorCitzdGF0aWMgaW50IGRhZW1vbnNfc3RhcnQodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJaW50IGVycm9yOworCisJcCA9IGt0aHJlYWRfcnVuKGRsbV9yZWN2ZCwgTlVMTCwgImRsbV9yZWN2ZCIpOworCWVycm9yID0gSVNfRVJSKHApOworCWlmIChlcnJvcikgeworCQlsb2dfcHJpbnQoImNhbid0IHN0YXJ0IGRsbV9yZWN2ZCAlZCIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyZWN2X3Rhc2sgPSBwOworCisJcCA9IGt0aHJlYWRfcnVuKGRsbV9zZW5kZCwgTlVMTCwgImRsbV9zZW5kZCIpOworCWVycm9yID0gSVNfRVJSKHApOworCWlmIChlcnJvcikgeworCQlsb2dfcHJpbnQoImNhbid0IHN0YXJ0IGRsbV9zZW5kZCAlZCIsIGVycm9yKTsKKwkJa3RocmVhZF9zdG9wKHJlY3ZfdGFzayk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJc2VuZF90YXNrID0gcDsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBxdWl0ZSBsaWtlbHkgdG8gc2xlZXAuLi4KKyAqLworaW50IGRsbV9sb3djb21tc19zdGFydCh2b2lkKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gaW5pdF9zb2NrKCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfc29jazsKKwllcnJvciA9IGRhZW1vbnNfc3RhcnQoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9zb2NrOworCXJldHVybiAwOworCitmYWlsX3NvY2s6CisJY2xvc2VfY29ubmVjdGlvbigpOworCXJldHVybiBlcnJvcjsKK30KKwordm9pZCBkbG1fbG93Y29tbXNfc3RvcCh2b2lkKQoreworCWludCBpOworCisJc2N0cF9jb24uZmxhZ3MgPSAweDc7CisJZGFlbW9uc19zdG9wKCk7CisJY2xlYW5fd3JpdGVxdWV1ZXMoKTsKKwljbG9zZV9jb25uZWN0aW9uKCk7CisJZGVhbGxvY19ub2RlaW5mbygpOworCW1heF9ub2RlaWQgPSAwOworCisJZGxtX2xvY2FsX2NvdW50ID0gMDsKKwlkbG1fbG9jYWxfbm9kZWlkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBkbG1fbG9jYWxfY291bnQ7IGkrKykKKwkJa2ZyZWUoZGxtX2xvY2FsX2FkZHJbaV0pOworfQorCmRpZmYgLS1naXQgYS9mcy9kbG0vbG93Y29tbXMtdGNwLmMgYi9mcy9kbG0vbG93Y29tbXMtdGNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyNzkxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RsbS9sb3djb21tcy10Y3AuYwpAQCAtMCwwICsxLDExODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqCisqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyoqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGxvd2NvbW1zLmMKKyAqCisgKiBUaGlzIGlzIHRoZSAibG93LWxldmVsIiBjb21tcyBsYXllci4KKyAqCisgKiBJdCBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZy9yZWNlaXZpbmcgbWVzc2FnZXMKKyAqIGZyb20gb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCisgKgorICogQ2x1c3RlciBub2RlcyBhcmUgcmVmZXJyZWQgdG8gYnkgdGhlaXIgbm9kZWlkcy4gbm9kZWlkcyBhcmUKKyAqIHNpbXBseSAzMiBiaXQgbnVtYmVycyB0byB0aGUgbG9ja2luZyBtb2R1bGUgLSBpZiB0aGV5IG5lZWQgdG8KKyAqIGJlIGV4cGFuZGVkIGZvciB0aGUgY2x1c3RlciBpbmZyYXN0cnVjdHVyZSB0aGVuIHRoYXQgaXMgaXQncworICogcmVzcG9uc2liaWxpdHkuIEl0IGlzIHRoaXMgbGF5ZXIncworICogcmVzcG9uc2liaWxpdHkgdG8gcmVzb2x2ZSB0aGVzZSBpbnRvIElQIGFkZHJlc3Mgb3IKKyAqIHdoYXRldmVyIGl0IG5lZWRzIGZvciBpbnRlci1ub2RlIGNvbW11bmljYXRpb24uCisgKgorICogVGhlIGNvbW1zIGxldmVsIGlzIHR3byBrZXJuZWwgdGhyZWFkcyB0aGF0IGRlYWwgbWFpbmx5IHdpdGgKKyAqIHRoZSByZWNlaXZpbmcgb2YgbWVzc2FnZXMgZnJvbSBvdGhlciBub2RlcyBhbmQgcGFzc2luZyB0aGVtCisgKiB1cCB0byB0aGUgbWlkLWxldmVsIGNvbW1zIGxheWVyICh3aGljaCB1bmRlcnN0YW5kcyB0aGUKKyAqIG1lc3NhZ2UgZm9ybWF0KSBmb3IgZXhlY3V0aW9uIGJ5IHRoZSBsb2NraW5nIGNvcmUsIGFuZAorICogYSBzZW5kIHRocmVhZCB3aGljaCBkb2VzIGFsbCB0aGUgc2V0dGluZyB1cCBvZiBjb25uZWN0aW9ucworICogdG8gcmVtb3RlIG5vZGVzIGFuZCB0aGUgc2VuZGluZyBvZiBkYXRhLiBUaHJlYWRzIGFyZSBub3QgYWxsb3dlZAorICogdG8gc2VuZCB0aGVpciBvd24gZGF0YSBiZWNhdXNlIGl0IG1heSBjYXVzZSB0aGVtIHRvIHdhaXQgaW4gdGltZXMKKyAqIG9mIGhpZ2ggbG9hZC4gQWxzbywgdGhpcyB3YXksIHRoZSBzZW5kaW5nIHRocmVhZCBjYW4gY29sbGVjdCB0b2dldGhlcgorICogbWVzc2FnZXMgYm91bmQgZm9yIG9uZSBub2RlIGFuZCBzZW5kIHRoZW0gaW4gb25lIGJsb2NrLgorICoKKyAqIEkgZG9uJ3Qgc2VlIGFueSBwcm9ibGVtIHdpdGggdGhlIHJlY3YgdGhyZWFkIGV4ZWN1dGluZyB0aGUgbG9ja2luZworICogY29kZSBvbiBiZWhhbGYgb2YgcmVtb3RlIHByb2Nlc3NlcyBhcyB0aGUgbG9ja2luZyBjb2RlIGlzCisgKiBzaG9ydCwgZWZmaWNpZW50IGFuZCBuZXZlciB3YWl0cy4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgImRsbV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvd2NvbW1zLmgiCisjaW5jbHVkZSAibWlkY29tbXMuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworc3RydWN0IGNidWYgeworCXVuc2lnbmVkIGludCBiYXNlOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgaW50IG1hc2s7Cit9OworCisjZGVmaW5lIE5PREVfSU5DUkVNRU5UIDMyCitzdGF0aWMgdm9pZCBjYnVmX2FkZChzdHJ1Y3QgY2J1ZiAqY2IsIGludCBuKQoreworCWNiLT5sZW4gKz0gbjsKK30KKworc3RhdGljIGludCBjYnVmX2RhdGEoc3RydWN0IGNidWYgKmNiKQoreworCXJldHVybiAoKGNiLT5iYXNlICsgY2ItPmxlbikgJiBjYi0+bWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGNidWZfaW5pdChzdHJ1Y3QgY2J1ZiAqY2IsIGludCBzaXplKQoreworCWNiLT5iYXNlID0gY2ItPmxlbiA9IDA7CisJY2ItPm1hc2sgPSBzaXplLTE7Cit9CisKK3N0YXRpYyB2b2lkIGNidWZfZWF0KHN0cnVjdCBjYnVmICpjYiwgaW50IG4pCit7CisJY2ItPmxlbiAgLT0gbjsKKwljYi0+YmFzZSArPSBuOworCWNiLT5iYXNlICY9IGNiLT5tYXNrOworfQorCitzdGF0aWMgYm9vbCBjYnVmX2VtcHR5KHN0cnVjdCBjYnVmICpjYikKK3sKKwlyZXR1cm4gY2ItPmxlbiA9PSAwOworfQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBpbmNvbWluZyBtZXNzYWdlcyB0byBwcm9jZXNzIGJlZm9yZQorICAgZG9pbmcgYSBjb25kX3Jlc2NoZWQoKQorKi8KKyNkZWZpbmUgTUFYX1JYX01TR19DT1VOVCAyNQorCitzdHJ1Y3QgY29ubmVjdGlvbiB7CisJc3RydWN0IHNvY2tldCAqc29jazsJLyogTlVMTCBpZiBub3QgY29ubmVjdGVkICovCisJdWludDMyX3Qgbm9kZWlkOwkvKiBTbyB3ZSBrbm93IHdobyB3ZSBhcmUgaW4gdGhlIGxpc3QgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHNvY2tfc2VtOyAvKiBTdG9wIGNvbm5lY3QgcmFjZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlYWRfbGlzdDsgICAvKiBPbiB0aGlzIGxpc3Qgd2hlbiByZWFkeSBmb3IgcmVhZGluZyAqLworCXN0cnVjdCBsaXN0X2hlYWQgd3JpdGVfbGlzdDsgIC8qIE9uIHRoaXMgbGlzdCB3aGVuIHJlYWR5IGZvciB3cml0aW5nICovCisJc3RydWN0IGxpc3RfaGVhZCBzdGF0ZV9saXN0OyAgLyogT24gdGhpcyBsaXN0IHdoZW4gcmVhZHkgdG8gY29ubmVjdCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGJpdCAxLDIgPSBXZSBhcmUgb24gdGhlIHJlYWQvd3JpdGUgbGlzdHMgKi8KKyNkZWZpbmUgQ0ZfUkVBRF9QRU5ESU5HIDEKKyNkZWZpbmUgQ0ZfV1JJVEVfUEVORElORyAyCisjZGVmaW5lIENGX0NPTk5FQ1RfUEVORElORyAzCisjZGVmaW5lIENGX0lTX09USEVSQ09OIDQKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdyaXRlcXVldWU7ICAvKiBMaXN0IG9mIG91dGdvaW5nIHdyaXRlcXVldWVfZW50cmllcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdGVubGlzdDsgIC8qIExpc3Qgb2YgYWxsb2NhdGVkIGxpc3RlbmluZyBzb2NrZXRzICovCisJc3BpbmxvY2tfdCB3cml0ZXF1ZXVlX2xvY2s7CisJaW50ICgqcnhfYWN0aW9uKSAoc3RydWN0IGNvbm5lY3Rpb24gKik7CS8qIFdoYXQgdG8gZG8gd2hlbiBhY3RpdmUgKi8KKwlzdHJ1Y3QgcGFnZSAqcnhfcGFnZTsKKwlzdHJ1Y3QgY2J1ZiBjYjsKKwlpbnQgcmV0cmllczsKKwlhdG9taWNfdCB3YWl0aW5nX3JlcXVlc3RzOworI2RlZmluZSBNQVhfQ09OTkVDVF9SRVRSSUVTIDMKKwlzdHJ1Y3QgY29ubmVjdGlvbiAqb3RoZXJjb247Cit9OworI2RlZmluZSBzb2NrMmNvbih4KSAoKHN0cnVjdCBjb25uZWN0aW9uICopKHgpLT5za191c2VyX2RhdGEpCisKKy8qIEFuIGVudHJ5IHdhaXRpbmcgdG8gYmUgc2VudCAqLworc3RydWN0IHdyaXRlcXVldWVfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgb2Zmc2V0OworCWludCBsZW47CisJaW50IGVuZDsKKwlpbnQgdXNlcnM7CisJc3RydWN0IGNvbm5lY3Rpb24gKmNvbjsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBkbG1fbG9jYWxfYWRkcjsKKworLyogTWFuYWdlIGRhZW1vbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJlY3ZfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlbmRfdGFzazsKKworc3RhdGljIHdhaXRfcXVldWVfdCBsb3djb21tc19zZW5kX3dhaXRxX2hlYWQ7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobG93Y29tbXNfc2VuZF93YWl0cSk7CitzdGF0aWMgd2FpdF9xdWV1ZV90IGxvd2NvbW1zX3JlY3Zfd2FpdHFfaGVhZDsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChsb3djb21tc19yZWN2X3dhaXRxKTsKKworLyogQW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gY29ubmVjdGlvbnMsIGluZGV4ZWQgYnkgTk9ERUlEICovCitzdGF0aWMgc3RydWN0IGNvbm5lY3Rpb24gKipjb25uZWN0aW9uczsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGNvbm5lY3Rpb25zX2xvY2spOworc3RhdGljIGttZW1fY2FjaGVfdCAqY29uX2NhY2hlOworc3RhdGljIGludCBjb25uX2FycmF5X3NpemU7CisKKy8qIExpc3Qgb2Ygc29ja2V0cyB0aGF0IGhhdmUgcmVhZHMgcGVuZGluZyAqLworc3RhdGljIExJU1RfSEVBRChyZWFkX3NvY2tldHMpOworc3RhdGljIERFRklORV9TUElOTE9DSyhyZWFkX3NvY2tldHNfbG9jayk7CisKKy8qIExpc3Qgb2Ygc29ja2V0cyB3aGljaCBoYXZlIHdyaXRlcyBwZW5kaW5nICovCitzdGF0aWMgTElTVF9IRUFEKHdyaXRlX3NvY2tldHMpOworc3RhdGljIERFRklORV9TUElOTE9DSyh3cml0ZV9zb2NrZXRzX2xvY2spOworCisvKiBMaXN0IG9mIHNvY2tldHMgd2hpY2ggaGF2ZSBjb25uZWN0cyBwZW5kaW5nICovCitzdGF0aWMgTElTVF9IRUFEKHN0YXRlX3NvY2tldHMpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzdGF0ZV9zb2NrZXRzX2xvY2spOworCitzdGF0aWMgc3RydWN0IGNvbm5lY3Rpb24gKm5vZGVpZDJjb24oaW50IG5vZGVpZCwgZ2ZwX3QgYWxsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uID0gTlVMTDsKKworCWRvd24oJmNvbm5lY3Rpb25zX2xvY2spOworCWlmIChub2RlaWQgPj0gY29ubl9hcnJheV9zaXplKSB7CisJCWludCBuZXdfc2l6ZSA9IG5vZGVpZCArIE5PREVfSU5DUkVNRU5UOworCQlzdHJ1Y3QgY29ubmVjdGlvbiAqKm5ld19jb25uczsKKworCQluZXdfY29ubnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29ubmVjdGlvbiAqKSAqCisJCQkJICAgIG5ld19zaXplLCBhbGxvY2F0aW9uKTsKKwkJaWYgKCFuZXdfY29ubnMpCisJCQlnb3RvIGZpbmlzaDsKKworCQltZW1jcHkobmV3X2Nvbm5zLCBjb25uZWN0aW9ucywgIHNpemVvZihzdHJ1Y3QgY29ubmVjdGlvbiAqKSAqIGNvbm5fYXJyYXlfc2l6ZSk7CisJCWNvbm5fYXJyYXlfc2l6ZSA9IG5ld19zaXplOworCQlrZnJlZShjb25uZWN0aW9ucyk7CisJCWNvbm5lY3Rpb25zID0gbmV3X2Nvbm5zOworCisJfQorCisJY29uID0gY29ubmVjdGlvbnNbbm9kZWlkXTsKKwlpZiAoY29uID09IE5VTEwgJiYgYWxsb2NhdGlvbikgeworCQljb24gPSBrbWVtX2NhY2hlX3phbGxvYyhjb25fY2FjaGUsIGFsbG9jYXRpb24pOworCQlpZiAoIWNvbikKKwkJCWdvdG8gZmluaXNoOworCisJCWNvbi0+bm9kZWlkID0gbm9kZWlkOworCQlpbml0X3J3c2VtKCZjb24tPnNvY2tfc2VtKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNvbi0+d3JpdGVxdWV1ZSk7CisJCXNwaW5fbG9ja19pbml0KCZjb24tPndyaXRlcXVldWVfbG9jayk7CisKKwkJY29ubmVjdGlvbnNbbm9kZWlkXSA9IGNvbjsKKwl9CisKK2ZpbmlzaDoKKwl1cCgmY29ubmVjdGlvbnNfbG9jayk7CisJcmV0dXJuIGNvbjsKK30KKworLyogRGF0YSBhdmFpbGFibGUgb24gc29ja2V0IG9yIGxpc3RlbiBzb2NrZXQgcmVjZWl2ZWQgYSBjb25uZWN0ICovCitzdGF0aWMgdm9pZCBsb3djb21tc19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGNvdW50X3VudXNlZCkKK3sKKwlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uID0gc29jazJjb24oc2spOworCisJYXRvbWljX2luYygmY29uLT53YWl0aW5nX3JlcXVlc3RzKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChDRl9SRUFEX1BFTkRJTkcsICZjb24tPmZsYWdzKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZyZWFkX3NvY2tldHNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY29uLT5yZWFkX2xpc3QsICZyZWFkX3NvY2tldHMpOworCXNwaW5fdW5sb2NrX2JoKCZyZWFkX3NvY2tldHNfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvd2NvbW1zX3JlY3Zfd2FpdHEpOworfQorCitzdGF0aWMgdm9pZCBsb3djb21tc193cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGNvbm5lY3Rpb24gKmNvbiA9IHNvY2syY29uKHNrKTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KENGX1dSSVRFX1BFTkRJTkcsICZjb24tPmZsYWdzKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZ3cml0ZV9zb2NrZXRzX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmNvbi0+d3JpdGVfbGlzdCwgJndyaXRlX3NvY2tldHMpOworCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9zb2NrZXRzX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb3djb21tc19zZW5kX3dhaXRxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvd2NvbW1zX2Nvbm5lY3Rfc29jayhzdHJ1Y3QgY29ubmVjdGlvbiAqY29uKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KENGX0NPTk5FQ1RfUEVORElORywgJmNvbi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJnN0YXRlX3NvY2tldHNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY29uLT5zdGF0ZV9saXN0LCAmc3RhdGVfc29ja2V0cyk7CisJc3Bpbl91bmxvY2tfYmgoJnN0YXRlX3NvY2tldHNfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvd2NvbW1zX3NlbmRfd2FpdHEpOworfQorCitzdGF0aWMgdm9pZCBsb3djb21tc19zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNvY2sgKnNrKQoreworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKQorCQlsb3djb21tc193cml0ZV9zcGFjZShzayk7Cit9CisKKy8qIE1ha2UgYSBzb2NrZXQgYWN0aXZlICovCitzdGF0aWMgaW50IGFkZF9zb2NrKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBjb25uZWN0aW9uICpjb24pCit7CisJY29uLT5zb2NrID0gc29jazsKKworCS8qIEluc3RhbGwgYSBkYXRhX3JlYWR5IGNhbGxiYWNrICovCisJY29uLT5zb2NrLT5zay0+c2tfZGF0YV9yZWFkeSA9IGxvd2NvbW1zX2RhdGFfcmVhZHk7CisJY29uLT5zb2NrLT5zay0+c2tfd3JpdGVfc3BhY2UgPSBsb3djb21tc193cml0ZV9zcGFjZTsKKwljb24tPnNvY2stPnNrLT5za19zdGF0ZV9jaGFuZ2UgPSBsb3djb21tc19zdGF0ZV9jaGFuZ2U7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWRkIHRoZSBwb3J0IG51bWJlciB0byBhbiBJUDYgb3IgNCBzb2NrYWRkciBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzCisgICBsZW5ndGggKi8KK3N0YXRpYyB2b2lkIG1ha2Vfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNhZGRyLCB1aW50MTZfdCBwb3J0LAorCQkJICBpbnQgKmFkZHJfbGVuKQoreworCXNhZGRyLT5zc19mYW1pbHkgPSAgZGxtX2xvY2FsX2FkZHIuc3NfZmFtaWx5OworCWlmIChzYWRkci0+c3NfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luICppbjRfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYWRkcjsKKwkJaW40X2FkZHItPnNpbl9wb3J0ID0gY3B1X3RvX2JlMTYocG9ydCk7CisJCSphZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCX0gZWxzZSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmluNl9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYWRkcjsKKwkJaW42X2FkZHItPnNpbjZfcG9ydCA9IGNwdV90b19iZTE2KHBvcnQpOworCQkqYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJfQorfQorCisvKiBDbG9zZSBhIHJlbW90ZSBjb25uZWN0aW9uIGFuZCB0aWR5IHVwICovCitzdGF0aWMgdm9pZCBjbG9zZV9jb25uZWN0aW9uKHN0cnVjdCBjb25uZWN0aW9uICpjb24sIGJvb2wgYW5kX290aGVyKQoreworCWRvd25fd3JpdGUoJmNvbi0+c29ja19zZW0pOworCisJaWYgKGNvbi0+c29jaykgeworCQlzb2NrX3JlbGVhc2UoY29uLT5zb2NrKTsKKwkJY29uLT5zb2NrID0gTlVMTDsKKwl9CisJaWYgKGNvbi0+b3RoZXJjb24gJiYgYW5kX290aGVyKSB7CisJCS8qIFdpbGwgb25seSByZS1lbnRlciBvbmNlLiAqLworCQljbG9zZV9jb25uZWN0aW9uKGNvbi0+b3RoZXJjb24sIGZhbHNlKTsKKwl9CisJaWYgKGNvbi0+cnhfcGFnZSkgeworCQlfX2ZyZWVfcGFnZShjb24tPnJ4X3BhZ2UpOworCQljb24tPnJ4X3BhZ2UgPSBOVUxMOworCX0KKwljb24tPnJldHJpZXMgPSAwOworCXVwX3dyaXRlKCZjb24tPnNvY2tfc2VtKTsKK30KKworLyogRGF0YSByZWNlaXZlZCBmcm9tIHJlbW90ZSBlbmQgKi8KK3N0YXRpYyBpbnQgcmVjZWl2ZV9mcm9tX3NvY2soc3RydWN0IGNvbm5lY3Rpb24gKmNvbikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3QgaW92ZWMgaW92WzJdOworCW1tX3NlZ21lbnRfdCBmczsKKwl1bnNpZ25lZCBsZW47CisJaW50IHI7CisJaW50IGNhbGxfYWdhaW5fc29vbiA9IDA7CisKKwlkb3duX3JlYWQoJmNvbi0+c29ja19zZW0pOworCisJaWYgKGNvbi0+c29jayA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAoY29uLT5yeF9wYWdlID09IE5VTEwpIHsKKwkJLyoKKwkJICogVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgYXRvbWljLCBidXQgSSB0aGluayBpdCBzaG91bGQKKwkJICogaW1wcm92ZSBwZXJmb3JtYW5jZSBpZiBpdCBpcy4KKwkJICovCisJCWNvbi0+cnhfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7CisJCWlmIChjb24tPnJ4X3BhZ2UgPT0gTlVMTCkKKwkJCWdvdG8gb3V0X3Jlc2NoZWQ7CisJCWNidWZfaW5pdCgmY29uLT5jYiwgUEFHRV9DQUNIRV9TSVpFKTsKKwl9CisKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfaW92ID0gaW92OworCW1zZy5tc2dfbmFtZSA9IE5VTEw7CisJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwltc2cubXNnX2ZsYWdzID0gMDsKKworCS8qCisJICogaW92WzBdIGlzIHRoZSBiaXQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciBiZXR3ZWVuIHRoZSBjdXJyZW50IGVuZAorCSAqIHBvaW50IChjYi5iYXNlICsgY2IubGVuKSBhbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorCSAqLworCWlvdlswXS5pb3ZfbGVuID0gY29uLT5jYi5iYXNlIC0gY2J1Zl9kYXRhKCZjb24tPmNiKTsKKwlpb3ZbMF0uaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MoY29uLT5yeF9wYWdlKSArIGNidWZfZGF0YSgmY29uLT5jYik7CisJaW92WzFdLmlvdl9sZW4gPSAwOworCisJLyoKKwkgKiBpb3ZbMV0gaXMgdGhlIGJpdCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQorCSAqIGJ1ZmZlciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50bHkgdXNlZCBzZWN0aW9uIChjYi5iYXNlKQorCSAqLworCWlmIChjYnVmX2RhdGEoJmNvbi0+Y2IpID49IGNvbi0+Y2IuYmFzZSkgeworCQlpb3ZbMF0uaW92X2xlbiA9IFBBR0VfQ0FDSEVfU0laRSAtIGNidWZfZGF0YSgmY29uLT5jYik7CisJCWlvdlsxXS5pb3ZfbGVuID0gY29uLT5jYi5iYXNlOworCQlpb3ZbMV0uaW92X2Jhc2UgPSBwYWdlX2FkZHJlc3MoY29uLT5yeF9wYWdlKTsKKwkJbXNnLm1zZ19pb3ZsZW4gPSAyOworCX0KKwlsZW4gPSBpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuOworCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCXIgPSByZXQgPSBzb2NrX3JlY3Ztc2coY29uLT5zb2NrLCAmbXNnLCBsZW4sCisJCQkgICAgICAgTVNHX0RPTlRXQUlUIHwgTVNHX05PU0lHTkFMKTsKKwlzZXRfZnMoZnMpOworCisJaWYgKHJldCA8PSAwKQorCQlnb3RvIG91dF9jbG9zZTsKKwlpZiAocmV0ID09IGxlbikKKwkJY2FsbF9hZ2Fpbl9zb29uID0gMTsKKwljYnVmX2FkZCgmY29uLT5jYiwgcmV0KTsKKwlyZXQgPSBkbG1fcHJvY2Vzc19pbmNvbWluZ19idWZmZXIoY29uLT5ub2RlaWQsCisJCQkJCSAgcGFnZV9hZGRyZXNzKGNvbi0+cnhfcGFnZSksCisJCQkJCSAgY29uLT5jYi5iYXNlLCBjb24tPmNiLmxlbiwKKwkJCQkJICBQQUdFX0NBQ0hFX1NJWkUpOworCWlmIChyZXQgPT0gLUVCQURNU0cpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGxtOiBsb3djb21tczogYWRkcj0lcCwgYmFzZT0ldSwgbGVuPSV1LCAiCisJCSAgICAgICAiaW92X2xlbj0ldSwgaW92X2Jhc2VbMF09JXAsIHJlYWQ9JWRcbiIsCisJCSAgICAgICBwYWdlX2FkZHJlc3MoY29uLT5yeF9wYWdlKSwgY29uLT5jYi5iYXNlLCBjb24tPmNiLmxlbiwKKwkJICAgICAgIGxlbiwgaW92WzBdLmlvdl9iYXNlLCByKTsKKwl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2Nsb3NlOworCWNidWZfZWF0KCZjb24tPmNiLCByZXQpOworCisJaWYgKGNidWZfZW1wdHkoJmNvbi0+Y2IpICYmICFjYWxsX2FnYWluX3Nvb24pIHsKKwkJX19mcmVlX3BhZ2UoY29uLT5yeF9wYWdlKTsKKwkJY29uLT5yeF9wYWdlID0gTlVMTDsKKwl9CisKK291dDoKKwlpZiAoY2FsbF9hZ2Fpbl9zb29uKQorCQlnb3RvIG91dF9yZXNjaGVkOworCXVwX3JlYWQoJmNvbi0+c29ja19zZW0pOworCXJldHVybiAwOworCitvdXRfcmVzY2hlZDoKKwlsb3djb21tc19kYXRhX3JlYWR5KGNvbi0+c29jay0+c2ssIDApOworCXVwX3JlYWQoJmNvbi0+c29ja19zZW0pOworCWNvbmRfcmVzY2hlZCgpOworCXJldHVybiAwOworCitvdXRfY2xvc2U6CisJdXBfcmVhZCgmY29uLT5zb2NrX3NlbSk7CisJaWYgKHJldCAhPSAtRUFHQUlOICYmICF0ZXN0X2JpdChDRl9JU19PVEhFUkNPTiwgJmNvbi0+ZmxhZ3MpKSB7CisJCWNsb3NlX2Nvbm5lY3Rpb24oY29uLCBmYWxzZSk7CisJCS8qIFJlY29ubmVjdCB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzZW5kICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogTGlzdGVuaW5nIHNvY2tldCBpcyBidXN5LCBhY2NlcHQgYSBjb25uZWN0aW9uICovCitzdGF0aWMgaW50IGFjY2VwdF9mcm9tX3NvY2soc3RydWN0IGNvbm5lY3Rpb24gKmNvbikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHBlZXJhZGRyOworCXN0cnVjdCBzb2NrZXQgKm5ld3NvY2s7CisJaW50IGxlbjsKKwlpbnQgbm9kZWlkOworCXN0cnVjdCBjb25uZWN0aW9uICpuZXdjb247CisKKwltZW1zZXQoJnBlZXJhZGRyLCAwLCBzaXplb2YocGVlcmFkZHIpKTsKKwlyZXN1bHQgPSBzb2NrX2NyZWF0ZV9rZXJuKGRsbV9sb2NhbF9hZGRyLnNzX2ZhbWlseSwgU09DS19TVFJFQU0sCisJCQkJICBJUFBST1RPX1RDUCwgJm5ld3NvY2spOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRvd25fcmVhZCgmY29uLT5zb2NrX3NlbSk7CisKKwlyZXN1bHQgPSAtRU5PVENPTk47CisJaWYgKGNvbi0+c29jayA9PSBOVUxMKQorCQlnb3RvIGFjY2VwdF9lcnI7CisKKwluZXdzb2NrLT50eXBlID0gY29uLT5zb2NrLT50eXBlOworCW5ld3NvY2stPm9wcyA9IGNvbi0+c29jay0+b3BzOworCisJcmVzdWx0ID0gY29uLT5zb2NrLT5vcHMtPmFjY2VwdChjb24tPnNvY2ssIG5ld3NvY2ssIE9fTk9OQkxPQ0spOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGFjY2VwdF9lcnI7CisKKwkvKiBHZXQgdGhlIGNvbm5lY3RlZCBzb2NrZXQncyBwZWVyICovCisJbWVtc2V0KCZwZWVyYWRkciwgMCwgc2l6ZW9mKHBlZXJhZGRyKSk7CisJaWYgKG5ld3NvY2stPm9wcy0+Z2V0bmFtZShuZXdzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnBlZXJhZGRyLAorCQkJCSAgJmxlbiwgMikpIHsKKwkJcmVzdWx0ID0gLUVDT05OQUJPUlRFRDsKKwkJZ290byBhY2NlcHRfZXJyOworCX0KKworCS8qIEdldCB0aGUgbmV3IG5vZGUncyBOT0RFSUQgKi8KKwltYWtlX3NvY2thZGRyKCZwZWVyYWRkciwgMCwgJmxlbik7CisJaWYgKGRsbV9hZGRyX3RvX25vZGVpZCgmcGVlcmFkZHIsICZub2RlaWQpKSB7CisJCXByaW50aygiZGxtOiBjb25uZWN0IGZyb20gbm9uIGNsdXN0ZXIgbm9kZVxuIik7CisJCXNvY2tfcmVsZWFzZShuZXdzb2NrKTsKKwkJdXBfcmVhZCgmY29uLT5zb2NrX3NlbSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlsb2dfcHJpbnQoImdvdCBjb25uZWN0aW9uIGZyb20gJWQiLCBub2RlaWQpOworCisJLyogIENoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBjb25uZWN0aW9uIHRvIHRoaXMgbm9kZS4gVGhpcworCSAqICBjb3VsZCBoYXBwZW4gaWYgdGhlIHR3byBub2RlcyBpbml0aWF0ZSBhIGNvbm5lY3Rpb24gYXQgcm91Z2hseQorCSAqICB0aGUgc2FtZSB0aW1lIGFuZCB0aGUgY29ubmVjdGlvbnMgY3Jvc3Mgb24gdGhlIHdpcmUuCisJICogVEVNUE9SQVJZIEZJWDoKKwkgKiAgSW4gdGhpcyBjYXNlIHdlIHN0b3JlIHRoZSBpbmNvbWluZyBvbmUgaW4gIm90aGVyY29uIgorCSAqLworCW5ld2NvbiA9IG5vZGVpZDJjb24obm9kZWlkLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld2NvbikgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGFjY2VwdF9lcnI7CisJfQorCWRvd25fd3JpdGUoJm5ld2Nvbi0+c29ja19zZW0pOworCWlmIChuZXdjb24tPnNvY2spIHsKKwkJc3RydWN0IGNvbm5lY3Rpb24gKm90aGVyY29uID0gbmV3Y29uLT5vdGhlcmNvbjsKKworCQlpZiAoIW90aGVyY29uKSB7CisJCQlvdGhlcmNvbiA9IGttZW1fY2FjaGVfemFsbG9jKGNvbl9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW90aGVyY29uKSB7CisJCQkJcHJpbnRrKCJkbG06IGZhaWxlZCB0byBhbGxvY2F0ZSBpbmNvbWluZyBzb2NrZXRcbiIpOworCQkJCXVwX3dyaXRlKCZuZXdjb24tPnNvY2tfc2VtKTsKKwkJCQlyZXN1bHQgPSAtRU5PTUVNOworCQkJCWdvdG8gYWNjZXB0X2VycjsKKwkJCX0KKwkJCW90aGVyY29uLT5ub2RlaWQgPSBub2RlaWQ7CisJCQlvdGhlcmNvbi0+cnhfYWN0aW9uID0gcmVjZWl2ZV9mcm9tX3NvY2s7CisJCQlpbml0X3J3c2VtKCZvdGhlcmNvbi0+c29ja19zZW0pOworCQkJc2V0X2JpdChDRl9JU19PVEhFUkNPTiwgJm90aGVyY29uLT5mbGFncyk7CisJCQluZXdjb24tPm90aGVyY29uID0gb3RoZXJjb247CisJCX0KKwkJb3RoZXJjb24tPnNvY2sgPSBuZXdzb2NrOworCQluZXdzb2NrLT5zay0+c2tfdXNlcl9kYXRhID0gb3RoZXJjb247CisJCWFkZF9zb2NrKG5ld3NvY2ssIG90aGVyY29uKTsKKwl9CisJZWxzZSB7CisJCW5ld3NvY2stPnNrLT5za191c2VyX2RhdGEgPSBuZXdjb247CisJCW5ld2Nvbi0+cnhfYWN0aW9uID0gcmVjZWl2ZV9mcm9tX3NvY2s7CisJCWFkZF9zb2NrKG5ld3NvY2ssIG5ld2Nvbik7CisKKwl9CisKKwl1cF93cml0ZSgmbmV3Y29uLT5zb2NrX3NlbSk7CisKKwkvKgorCSAqIEFkZCBpdCB0byB0aGUgYWN0aXZlIHF1ZXVlIGluIGNhc2Ugd2UgZ290IGRhdGEKKwkgKiBiZXdlZW4gcHJvY2Vzc2luZyB0aGUgYWNjZXB0IGFkZGluZyB0aGUgc29ja2V0CisJICogdG8gdGhlIHJlYWRfc29ja2V0cyBsaXN0CisJICovCisJbG93Y29tbXNfZGF0YV9yZWFkeShuZXdzb2NrLT5zaywgMCk7CisJdXBfcmVhZCgmY29uLT5zb2NrX3NlbSk7CisKKwlyZXR1cm4gMDsKKworYWNjZXB0X2VycjoKKwl1cF9yZWFkKCZjb24tPnNvY2tfc2VtKTsKKwlzb2NrX3JlbGVhc2UobmV3c29jayk7CisKKwlpZiAocmVzdWx0ICE9IC1FQUdBSU4pCisJCXByaW50aygiZGxtOiBlcnJvciBhY2NlcHRpbmcgY29ubmVjdGlvbiBmcm9tIG5vZGU6ICVkXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIENvbm5lY3QgYSBuZXcgc29ja2V0IHRvIGl0cyBwZWVyICovCitzdGF0aWMgdm9pZCBjb25uZWN0X3RvX3NvY2soc3RydWN0IGNvbm5lY3Rpb24gKmNvbikKK3sKKwlpbnQgcmVzdWx0ID0gLUVIT1NUVU5SRUFDSDsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYWRkcjsKKwlpbnQgYWRkcl9sZW47CisJc3RydWN0IHNvY2tldCAqc29jazsKKworCWlmIChjb24tPm5vZGVpZCA9PSAwKSB7CisJCWxvZ19wcmludCgiYXR0ZW1wdCB0byBjb25uZWN0IHNvY2sgMCBmb2lsZWQiKTsKKwkJcmV0dXJuOworCX0KKworCWRvd25fd3JpdGUoJmNvbi0+c29ja19zZW0pOworCWlmIChjb24tPnJldHJpZXMrKyA+IE1BWF9DT05ORUNUX1JFVFJJRVMpCisJCWdvdG8gb3V0OworCisJLyogU29tZSBvZGQgcmFjZXMgY2FuIGNhdXNlIGRvdWJsZS1jb25uZWN0cywgaWdub3JlIHRoZW0gKi8KKwlpZiAoY29uLT5zb2NrKSB7CisJCXJlc3VsdCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENyZWF0ZSBhIHNvY2tldCB0byBjb21tdW5pY2F0ZSB3aXRoICovCisJcmVzdWx0ID0gc29ja19jcmVhdGVfa2VybihkbG1fbG9jYWxfYWRkci5zc19mYW1pbHksIFNPQ0tfU1RSRUFNLAorCQkJCSAgSVBQUk9UT19UQ1AsICZzb2NrKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7CisJaWYgKGRsbV9ub2RlaWRfdG9fYWRkcihjb24tPm5vZGVpZCwgJnNhZGRyKSkKKwkJZ290byBvdXRfZXJyOworCisJc29jay0+c2stPnNrX3VzZXJfZGF0YSA9IGNvbjsKKwljb24tPnJ4X2FjdGlvbiA9IHJlY2VpdmVfZnJvbV9zb2NrOworCisJbWFrZV9zb2NrYWRkcigmc2FkZHIsIGRsbV9jb25maWcudGNwX3BvcnQsICZhZGRyX2xlbik7CisKKwlhZGRfc29jayhzb2NrLCBjb24pOworCisJbG9nX3ByaW50KCJjb25uZWN0aW5nIHRvICVkIiwgY29uLT5ub2RlaWQpOworCXJlc3VsdCA9CisJCXNvY2stPm9wcy0+Y29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCBhZGRyX2xlbiwKKwkJCQkgICBPX05PTkJMT0NLKTsKKwlpZiAocmVzdWx0ID09IC1FSU5QUk9HUkVTUykKKwkJcmVzdWx0ID0gMDsKKwlpZiAocmVzdWx0ID09IDApCisJCWdvdG8gb3V0OworCitvdXRfZXJyOgorCWlmIChjb24tPnNvY2spIHsKKwkJc29ja19yZWxlYXNlKGNvbi0+c29jayk7CisJCWNvbi0+c29jayA9IE5VTEw7CisJfQorCS8qCisJICogU29tZSBlcnJvcnMgYXJlIGZhdGFsIGFuZCB0aGlzIGxpc3QgbWlnaHQgbmVlZCBhZGp1c3RpbmcuIEZvciBvdGhlcgorCSAqIGVycm9ycyB3ZSB0cnkgYWdhaW4gdW50aWwgdGhlIG1heCBudW1iZXIgb2YgcmV0cmllcyBpcyByZWFjaGVkLgorCSAqLworCWlmIChyZXN1bHQgIT0gLUVIT1NUVU5SRUFDSCAmJiByZXN1bHQgIT0gLUVORVRVTlJFQUNIICYmCisJICAgIHJlc3VsdCAhPSAtRU5FVERPV04gJiYgcmVzdWx0ICE9IEVJTlZBTAorCSAgICAmJiByZXN1bHQgIT0gLUVQUk9UT05PU1VQUE9SVCkgeworCQlsb3djb21tc19jb25uZWN0X3NvY2soY29uKTsKKwkJcmVzdWx0ID0gMDsKKwl9CitvdXQ6CisJdXBfd3JpdGUoJmNvbi0+c29ja19zZW0pOworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrZXQgKmNyZWF0ZV9saXN0ZW5fc29jayhzdHJ1Y3QgY29ubmVjdGlvbiAqY29uLAorCQkJCQkgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNhZGRyKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOworCW1tX3NlZ21lbnRfdCBmczsKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgb25lID0gMTsKKwlpbnQgYWRkcl9sZW47CisKKwlpZiAoZGxtX2xvY2FsX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpCisJCWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJZWxzZQorCQlhZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKworCS8qIENyZWF0ZSBhIHNvY2tldCB0byBjb21tdW5pY2F0ZSB3aXRoICovCisJcmVzdWx0ID0gc29ja19jcmVhdGVfa2VybihkbG1fbG9jYWxfYWRkci5zc19mYW1pbHksIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgJnNvY2spOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50aygiZGxtOiBDYW4ndCBjcmVhdGUgbGlzdGVuaW5nIGNvbW1zIHNvY2tldFxuIik7CisJCWdvdG8gY3JlYXRlX291dDsKKwl9CisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisJcmVzdWx0ID0gc29ja19zZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKKwkJCQkgKGNoYXIgKikmb25lLCBzaXplb2Yob25lKSk7CisJc2V0X2ZzKGZzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcmludGsoImRsbTogRmFpbGVkIHRvIHNldCBTT19SRVVTRUFERFIgb24gc29ja2V0OiByZXN1bHQ9JWRcbiIsCisJCSAgICAgICByZXN1bHQpOworCX0KKwlzb2NrLT5zay0+c2tfdXNlcl9kYXRhID0gY29uOworCWNvbi0+cnhfYWN0aW9uID0gYWNjZXB0X2Zyb21fc29jazsKKwljb24tPnNvY2sgPSBzb2NrOworCisJLyogQmluZCB0byBvdXIgcG9ydCAqLworCW1ha2Vfc29ja2FkZHIoc2FkZHIsIGRsbV9jb25maWcudGNwX3BvcnQsICZhZGRyX2xlbik7CisJcmVzdWx0ID0gc29jay0+b3BzLT5iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgc2FkZHIsIGFkZHJfbGVuKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcmludGsoImRsbTogQ2FuJ3QgYmluZCB0byBwb3J0ICVkXG4iLCBkbG1fY29uZmlnLnRjcF9wb3J0KTsKKwkJc29ja19yZWxlYXNlKHNvY2spOworCQlzb2NrID0gTlVMTDsKKwkJY29uLT5zb2NrID0gTlVMTDsKKwkJZ290byBjcmVhdGVfb3V0OworCX0KKworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKworCXJlc3VsdCA9IHNvY2tfc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsCisJCQkJIChjaGFyICopJm9uZSwgc2l6ZW9mKG9uZSkpOworCXNldF9mcyhmcyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKCJkbG06IFNldCBrZWVwYWxpdmUgZmFpbGVkOiAlZFxuIiwgcmVzdWx0KTsKKwl9CisKKwlyZXN1bHQgPSBzb2NrLT5vcHMtPmxpc3Rlbihzb2NrLCA1KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlwcmludGsoImRsbTogQ2FuJ3QgbGlzdGVuIG9uIHBvcnQgJWRcbiIsIGRsbV9jb25maWcudGNwX3BvcnQpOworCQlzb2NrX3JlbGVhc2Uoc29jayk7CisJCXNvY2sgPSBOVUxMOworCQlnb3RvIGNyZWF0ZV9vdXQ7CisJfQorCitjcmVhdGVfb3V0OgorCXJldHVybiBzb2NrOworfQorCisKKy8qIExpc3RlbiBvbiBhbGwgaW50ZXJmYWNlcyAqLworc3RhdGljIGludCBsaXN0ZW5fZm9yX2FsbCh2b2lkKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOworCXN0cnVjdCBjb25uZWN0aW9uICpjb24gPSBub2RlaWQyY29uKDAsIEdGUF9LRVJORUwpOworCWludCByZXN1bHQgPSAtRUlOVkFMOworCisJLyogV2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aS1ob21lZCBob3N0cyAqLworCXNldF9iaXQoQ0ZfSVNfT1RIRVJDT04sICZjb24tPmZsYWdzKTsKKworCXNvY2sgPSBjcmVhdGVfbGlzdGVuX3NvY2soY29uLCAmZGxtX2xvY2FsX2FkZHIpOworCWlmIChzb2NrKSB7CisJCWFkZF9zb2NrKHNvY2ssIGNvbik7CisJCXJlc3VsdCA9IDA7CisJfQorCWVsc2UgeworCQlyZXN1bHQgPSAtRUFERFJJTlVTRTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKworc3RhdGljIHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICpuZXdfd3JpdGVxdWV1ZV9lbnRyeShzdHJ1Y3QgY29ubmVjdGlvbiAqY29uLAorCQkJCQkJICAgICBnZnBfdCBhbGxvY2F0aW9uKQoreworCXN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdyaXRlcXVldWVfZW50cnkpLCBhbGxvY2F0aW9uKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCWVudHJ5LT5wYWdlID0gYWxsb2NfcGFnZShhbGxvY2F0aW9uKTsKKwlpZiAoIWVudHJ5LT5wYWdlKSB7CisJCWtmcmVlKGVudHJ5KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZW50cnktPm9mZnNldCA9IDA7CisJZW50cnktPmxlbiA9IDA7CisJZW50cnktPmVuZCA9IDA7CisJZW50cnktPnVzZXJzID0gMDsKKwllbnRyeS0+Y29uID0gY29uOworCisJcmV0dXJuIGVudHJ5OworfQorCit2b2lkICpkbG1fbG93Y29tbXNfZ2V0X2J1ZmZlcihpbnQgbm9kZWlkLCBpbnQgbGVuLAorCQkJICAgICAgZ2ZwX3QgYWxsb2NhdGlvbiwgY2hhciAqKnBwYykKK3sKKwlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uOworCXN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICplOworCWludCBvZmZzZXQgPSAwOworCWludCB1c2VycyA9IDA7CisKKwljb24gPSBub2RlaWQyY29uKG5vZGVpZCwgYWxsb2NhdGlvbik7CisJaWYgKCFjb24pCisJCXJldHVybiBOVUxMOworCisJZSA9IGxpc3RfZW50cnkoY29uLT53cml0ZXF1ZXVlLnByZXYsIHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5LCBsaXN0KTsKKwlpZiAoKCZlLT5saXN0ID09ICZjb24tPndyaXRlcXVldWUpIHx8CisJICAgIChQQUdFX0NBQ0hFX1NJWkUgLSBlLT5lbmQgPCBsZW4pKSB7CisJCWUgPSBOVUxMOworCX0gZWxzZSB7CisJCW9mZnNldCA9IGUtPmVuZDsKKwkJZS0+ZW5kICs9IGxlbjsKKwkJdXNlcnMgPSBlLT51c2VycysrOworCX0KKwlzcGluX3VubG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOworCisJaWYgKGUpIHsKKwlnb3Rfb25lOgorCQlpZiAodXNlcnMgPT0gMCkKKwkJCWttYXAoZS0+cGFnZSk7CisJCSpwcGMgPSBwYWdlX2FkZHJlc3MoZS0+cGFnZSkgKyBvZmZzZXQ7CisJCXJldHVybiBlOworCX0KKworCWUgPSBuZXdfd3JpdGVxdWV1ZV9lbnRyeShjb24sIGFsbG9jYXRpb24pOworCWlmIChlKSB7CisJCXNwaW5fbG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOworCQlvZmZzZXQgPSBlLT5lbmQ7CisJCWUtPmVuZCArPSBsZW47CisJCXVzZXJzID0gZS0+dXNlcnMrKzsKKwkJbGlzdF9hZGRfdGFpbCgmZS0+bGlzdCwgJmNvbi0+d3JpdGVxdWV1ZSk7CisJCXNwaW5fdW5sb2NrKCZjb24tPndyaXRlcXVldWVfbG9jayk7CisJCWdvdG8gZ290X29uZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZGxtX2xvd2NvbW1zX2NvbW1pdF9idWZmZXIodm9pZCAqbWgpCit7CisJc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmUgPSAoc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKiltaDsKKwlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uID0gZS0+Y29uOworCWludCB1c2VyczsKKworCXVzZXJzID0gLS1lLT51c2VyczsKKwlpZiAodXNlcnMpCisJCWdvdG8gb3V0OworCWUtPmxlbiA9IGUtPmVuZCAtIGUtPm9mZnNldDsKKwlrdW5tYXAoZS0+cGFnZSk7CisJc3Bpbl91bmxvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KENGX1dSSVRFX1BFTkRJTkcsICZjb24tPmZsYWdzKSA9PSAwKSB7CisJCXNwaW5fbG9ja19iaCgmd3JpdGVfc29ja2V0c19sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29uLT53cml0ZV9saXN0LCAmd3JpdGVfc29ja2V0cyk7CisJCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9zb2NrZXRzX2xvY2spOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG93Y29tbXNfc2VuZF93YWl0cSk7CisJfQorCXJldHVybjsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZjb24tPndyaXRlcXVldWVfbG9jayk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2VudHJ5KHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICplKQoreworCV9fZnJlZV9wYWdlKGUtPnBhZ2UpOworCWtmcmVlKGUpOworfQorCisvKiBTZW5kIGEgbWVzc2FnZSAqLworc3RhdGljIHZvaWQgc2VuZF90b19zb2NrKHN0cnVjdCBjb25uZWN0aW9uICpjb24pCit7CisJaW50IHJldCA9IDA7CisJc3NpemVfdCgqc2VuZHBhZ2UpIChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBwYWdlICosIGludCwgc2l6ZV90LCBpbnQpOworCWNvbnN0IGludCBtc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQgfCBNU0dfTk9TSUdOQUw7CisJc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmU7CisJaW50IGxlbiwgb2Zmc2V0OworCisJZG93bl9yZWFkKCZjb24tPnNvY2tfc2VtKTsKKwlpZiAoY29uLT5zb2NrID09IE5VTEwpCisJCWdvdG8gb3V0X2Nvbm5lY3Q7CisKKwlzZW5kcGFnZSA9IGNvbi0+c29jay0+b3BzLT5zZW5kcGFnZTsKKworCXNwaW5fbG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOworCWZvciAoOzspIHsKKwkJZSA9IGxpc3RfZW50cnkoY29uLT53cml0ZXF1ZXVlLm5leHQsIHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5LAorCQkJICAgICAgIGxpc3QpOworCQlpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKikgZSA9PSAmY29uLT53cml0ZXF1ZXVlKQorCQkJYnJlYWs7CisKKwkJbGVuID0gZS0+bGVuOworCQlvZmZzZXQgPSBlLT5vZmZzZXQ7CisJCUJVR19PTihsZW4gPT0gMCAmJiBlLT51c2VycyA9PSAwKTsKKwkJc3Bpbl91bmxvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKKworCQlyZXQgPSAwOworCQlpZiAobGVuKSB7CisJCQlyZXQgPSBzZW5kcGFnZShjb24tPnNvY2ssIGUtPnBhZ2UsIG9mZnNldCwgbGVuLAorCQkJCSAgICAgICBtc2dfZmxhZ3MpOworCQkJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAwKQorCQkJCWdvdG8gb3V0OworCQkJaWYgKHJldCA8PSAwKQorCQkJCWdvdG8gc2VuZF9lcnJvcjsKKwkJfQorCQllbHNlIHsKKwkJCS8qIERvbid0IHN0YXJ2ZSBwZW9wbGUgZmlsbGluZyBidWZmZXJzICovCisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCisJCXNwaW5fbG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOworCQllLT5vZmZzZXQgKz0gcmV0OworCQllLT5sZW4gLT0gcmV0OworCisJCWlmIChlLT5sZW4gPT0gMCAmJiBlLT51c2VycyA9PSAwKSB7CisJCQlsaXN0X2RlbCgmZS0+bGlzdCk7CisJCQlrdW5tYXAoZS0+cGFnZSk7CisJCQlmcmVlX2VudHJ5KGUpOworCQkJY29udGludWU7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKK291dDoKKwl1cF9yZWFkKCZjb24tPnNvY2tfc2VtKTsKKwlyZXR1cm47CisKK3NlbmRfZXJyb3I6CisJdXBfcmVhZCgmY29uLT5zb2NrX3NlbSk7CisJY2xvc2VfY29ubmVjdGlvbihjb24sIGZhbHNlKTsKKwlsb3djb21tc19jb25uZWN0X3NvY2soY29uKTsKKwlyZXR1cm47CisKK291dF9jb25uZWN0OgorCXVwX3JlYWQoJmNvbi0+c29ja19zZW0pOworCWxvd2NvbW1zX2Nvbm5lY3Rfc29jayhjb24pOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2xlYW5fb25lX3dyaXRlcXVldWUoc3RydWN0IGNvbm5lY3Rpb24gKmNvbikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKnRlbXA7CisKKwlzcGluX2xvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJmNvbi0+d3JpdGVxdWV1ZSkgeworCQlzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSAqZSA9CisJCQlsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5LCBsaXN0KTsKKwkJbGlzdF9kZWwoJmUtPmxpc3QpOworCQlmcmVlX2VudHJ5KGUpOworCX0KKwlzcGluX3VubG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOworfQorCisvKiBDYWxsZWQgZnJvbSByZWNvdmVyeSB3aGVuIGl0IGtub3dzIHRoYXQgYSBub2RlIGhhcworICAgbGVmdCB0aGUgY2x1c3RlciAqLworaW50IGRsbV9sb3djb21tc19jbG9zZShpbnQgbm9kZWlkKQoreworCXN0cnVjdCBjb25uZWN0aW9uICpjb247CisKKwlpZiAoIWNvbm5lY3Rpb25zKQorCQlnb3RvIG91dDsKKworCWxvZ19wcmludCgiY2xvc2luZyBjb25uZWN0aW9uIHRvIG5vZGUgJWQiLCBub2RlaWQpOworCWNvbiA9IG5vZGVpZDJjb24obm9kZWlkLCAwKTsKKwlpZiAoY29uKSB7CisJCWNsZWFuX29uZV93cml0ZXF1ZXVlKGNvbik7CisJCWNsb3NlX2Nvbm5lY3Rpb24oY29uLCB0cnVlKTsKKwkJYXRvbWljX3NldCgmY29uLT53YWl0aW5nX3JlcXVlc3RzLCAwKTsKKwl9CisJcmV0dXJuIDA7CisKK291dDoKKwlyZXR1cm4gLTE7Cit9CisKKy8qIEFQSSBzZW5kIG1lc3NhZ2UgY2FsbCwgbWF5IHF1ZXVlIHRoZSByZXF1ZXN0ICovCisvKiBOLkIuIFRoaXMgaXMgdGhlIG9sZCBpbnRlcmZhY2UgLSB1c2UgdGhlIG5ldyBvbmUgZm9yIG5ldyBjYWxscyAqLworaW50IGxvd2NvbW1zX3NlbmRfbWVzc2FnZShpbnQgbm9kZWlkLCBjaGFyICpidWYsIGludCBsZW4sIGdmcF90IGFsbG9jYXRpb24pCit7CisJc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmU7CisJY2hhciAqYjsKKworCWUgPSBkbG1fbG93Y29tbXNfZ2V0X2J1ZmZlcihub2RlaWQsIGxlbiwgYWxsb2NhdGlvbiwgJmIpOworCWlmIChlKSB7CisJCW1lbWNweShiLCBidWYsIGxlbik7CisJCWRsbV9sb3djb21tc19jb21taXRfYnVmZmVyKGUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FTk9CVUZTOworfQorCisvKiBMb29rIGZvciBhY3Rpdml0eSBvbiBhY3RpdmUgc29ja2V0cyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19zb2NrZXRzKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0ZW1wOworCWludCBjb3VudCA9IDA7CisKKwlzcGluX2xvY2tfYmgoJnJlYWRfc29ja2V0c19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJnJlYWRfc29ja2V0cykgeworCisJCXN0cnVjdCBjb25uZWN0aW9uICpjb24gPQorCQkJbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY29ubmVjdGlvbiwgcmVhZF9saXN0KTsKKwkJbGlzdF9kZWwoJmNvbi0+cmVhZF9saXN0KTsKKwkJY2xlYXJfYml0KENGX1JFQURfUEVORElORywgJmNvbi0+ZmxhZ3MpOworCisJCXNwaW5fdW5sb2NrX2JoKCZyZWFkX3NvY2tldHNfbG9jayk7CisKKwkJLyogVGhpcyBjYW4gcmVhY2ggemVybyBpZiB3ZSBhcmUgcHJvY2Vzc2luZyByZXF1ZXN0cworCQkgKiBhcyB0aGV5IGNvbWUgaW4uCisJCSAqLworCQlpZiAoYXRvbWljX3JlYWQoJmNvbi0+d2FpdGluZ19yZXF1ZXN0cykgPT0gMCkgeworCQkJc3Bpbl9sb2NrX2JoKCZyZWFkX3NvY2tldHNfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRvIHsKKwkJCWNvbi0+cnhfYWN0aW9uKGNvbik7CisKKwkJCS8qIERvbid0IHN0YXJ2ZSBvdXQgZXZlcnlvbmUgZWxzZSAqLworCQkJaWYgKCsrY291bnQgPj0gTUFYX1JYX01TR19DT1VOVCkgeworCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJCWNvdW50ID0gMDsKKwkJCX0KKworCQl9IHdoaWxlICghYXRvbWljX2RlY19hbmRfdGVzdCgmY29uLT53YWl0aW5nX3JlcXVlc3RzKSAmJgorCQkJICFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCisJCXNwaW5fbG9ja19iaCgmcmVhZF9zb2NrZXRzX2xvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmcmVhZF9zb2NrZXRzX2xvY2spOworfQorCisvKiBUcnkgdG8gc2VuZCBhbnkgbWVzc2FnZXMgdGhhdCBhcmUgcGVuZGluZworICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX291dHB1dF9xdWV1ZSh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqdGVtcDsKKworCXNwaW5fbG9ja19iaCgmd3JpdGVfc29ja2V0c19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJndyaXRlX3NvY2tldHMpIHsKKwkJc3RydWN0IGNvbm5lY3Rpb24gKmNvbiA9CisJCQlsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjb25uZWN0aW9uLCB3cml0ZV9saXN0KTsKKwkJY2xlYXJfYml0KENGX1dSSVRFX1BFTkRJTkcsICZjb24tPmZsYWdzKTsKKwkJbGlzdF9kZWwoJmNvbi0+d3JpdGVfbGlzdCk7CisKKwkJc3Bpbl91bmxvY2tfYmgoJndyaXRlX3NvY2tldHNfbG9jayk7CisJCXNlbmRfdG9fc29jayhjb24pOworCQlzcGluX2xvY2tfYmgoJndyaXRlX3NvY2tldHNfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9zb2NrZXRzX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3N0YXRlX3F1ZXVlKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0ZW1wOworCisJc3Bpbl9sb2NrX2JoKCZzdGF0ZV9zb2NrZXRzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wLCAmc3RhdGVfc29ja2V0cykgeworCQlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uID0KKwkJCWxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNvbm5lY3Rpb24sIHN0YXRlX2xpc3QpOworCQlsaXN0X2RlbCgmY29uLT5zdGF0ZV9saXN0KTsKKwkJY2xlYXJfYml0KENGX0NPTk5FQ1RfUEVORElORywgJmNvbi0+ZmxhZ3MpOworCQlzcGluX3VubG9ja19iaCgmc3RhdGVfc29ja2V0c19sb2NrKTsKKworCQljb25uZWN0X3RvX3NvY2soY29uKTsKKwkJc3Bpbl9sb2NrX2JoKCZzdGF0ZV9zb2NrZXRzX2xvY2spOworCX0KKwlzcGluX3VubG9ja19iaCgmc3RhdGVfc29ja2V0c19sb2NrKTsKK30KKworCisvKiBEaXNjYXJkIGFsbCBlbnRyaWVzIG9uIHRoZSB3cml0ZSBxdWV1ZXMgKi8KK3N0YXRpYyB2b2lkIGNsZWFuX3dyaXRlcXVldWVzKHZvaWQpCit7CisJaW50IG5vZGVpZDsKKworCWZvciAobm9kZWlkID0gMTsgbm9kZWlkIDwgY29ubl9hcnJheV9zaXplOyBub2RlaWQrKykgeworCQlzdHJ1Y3QgY29ubmVjdGlvbiAqY29uID0gbm9kZWlkMmNvbihub2RlaWQsIDApOworCisJCWlmIChjb24pCisJCQljbGVhbl9vbmVfd3JpdGVxdWV1ZShjb24pOworCX0KK30KKworc3RhdGljIGludCByZWFkX2xpc3RfZW1wdHkodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2JoKCZyZWFkX3NvY2tldHNfbG9jayk7CisJc3RhdHVzID0gbGlzdF9lbXB0eSgmcmVhZF9zb2NrZXRzKTsKKwlzcGluX3VubG9ja19iaCgmcmVhZF9zb2NrZXRzX2xvY2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogRExNIFRyYW5zcG9ydCBjb21tcyByZWNlaXZlIGRhZW1vbiAqLworc3RhdGljIGludCBkbG1fcmVjdmQodm9pZCAqZGF0YSkKK3sKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmbG93Y29tbXNfcmVjdl93YWl0cV9oZWFkLCBjdXJyZW50KTsKKwlhZGRfd2FpdF9xdWV1ZSgmbG93Y29tbXNfcmVjdl93YWl0cSwgJmxvd2NvbW1zX3JlY3Zfd2FpdHFfaGVhZCk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAocmVhZF9saXN0X2VtcHR5KCkpCisJCQljb25kX3Jlc2NoZWQoKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQlwcm9jZXNzX3NvY2tldHMoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9hbmRfc3RhdGVfbGlzdHNfZW1wdHkodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2JoKCZ3cml0ZV9zb2NrZXRzX2xvY2spOworCXN0YXR1cyA9IGxpc3RfZW1wdHkoJndyaXRlX3NvY2tldHMpOworCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9zb2NrZXRzX2xvY2spOworCisJc3Bpbl9sb2NrX2JoKCZzdGF0ZV9zb2NrZXRzX2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZzdGF0ZV9zb2NrZXRzKSA9PSAwKQorCQlzdGF0dXMgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZV9zb2NrZXRzX2xvY2spOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogRExNIFRyYW5zcG9ydCBzZW5kIGRhZW1vbiAqLworc3RhdGljIGludCBkbG1fc2VuZGQodm9pZCAqZGF0YSkKK3sKKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmbG93Y29tbXNfc2VuZF93YWl0cV9oZWFkLCBjdXJyZW50KTsKKwlhZGRfd2FpdF9xdWV1ZSgmbG93Y29tbXNfc2VuZF93YWl0cSwgJmxvd2NvbW1zX3NlbmRfd2FpdHFfaGVhZCk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAod3JpdGVfYW5kX3N0YXRlX2xpc3RzX2VtcHR5KCkpCisJCQljb25kX3Jlc2NoZWQoKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQlwcm9jZXNzX3N0YXRlX3F1ZXVlKCk7CisJCXByb2Nlc3Nfb3V0cHV0X3F1ZXVlKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRhZW1vbnNfc3RvcCh2b2lkKQoreworCWt0aHJlYWRfc3RvcChyZWN2X3Rhc2spOworCWt0aHJlYWRfc3RvcChzZW5kX3Rhc2spOworfQorCitzdGF0aWMgaW50IGRhZW1vbnNfc3RhcnQodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJaW50IGVycm9yOworCisJcCA9IGt0aHJlYWRfcnVuKGRsbV9yZWN2ZCwgTlVMTCwgImRsbV9yZWN2ZCIpOworCWVycm9yID0gSVNfRVJSKHApOworCWlmIChlcnJvcikgeworCQlsb2dfcHJpbnQoImNhbid0IHN0YXJ0IGRsbV9yZWN2ZCAlZCIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyZWN2X3Rhc2sgPSBwOworCisJcCA9IGt0aHJlYWRfcnVuKGRsbV9zZW5kZCwgTlVMTCwgImRsbV9zZW5kZCIpOworCWVycm9yID0gSVNfRVJSKHApOworCWlmIChlcnJvcikgeworCQlsb2dfcHJpbnQoImNhbid0IHN0YXJ0IGRsbV9zZW5kZCAlZCIsIGVycm9yKTsKKwkJa3RocmVhZF9zdG9wKHJlY3ZfdGFzayk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJc2VuZF90YXNrID0gcDsKKworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIHRoZSBsYXJnZXN0IGJ1ZmZlciBzaXplIHdlIGNhbiBjb3BlIHdpdGguCisgKi8KK2ludCBsb3djb21tc19tYXhfYnVmZmVyX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gUEFHRV9DQUNIRV9TSVpFOworfQorCit2b2lkIGRsbV9sb3djb21tc19zdG9wKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBTZXQgYWxsIHRoZSBmbGFncyB0byBwcmV2ZW50IGFueQorCSAgIHNvY2tldCBhY3Rpdml0eS4KKwkqLworCWZvciAoaSA9IDA7IGkgPCBjb25uX2FycmF5X3NpemU7IGkrKykgeworCQlpZiAoY29ubmVjdGlvbnNbaV0pCisJCQljb25uZWN0aW9uc1tpXS0+ZmxhZ3MgfD0gMHhGRjsKKwl9CisKKwlkYWVtb25zX3N0b3AoKTsKKwljbGVhbl93cml0ZXF1ZXVlcygpOworCisJZm9yIChpID0gMDsgaSA8IGNvbm5fYXJyYXlfc2l6ZTsgaSsrKSB7CisJCWlmIChjb25uZWN0aW9uc1tpXSkgeworCQkJY2xvc2VfY29ubmVjdGlvbihjb25uZWN0aW9uc1tpXSwgdHJ1ZSk7CisJCQlpZiAoY29ubmVjdGlvbnNbaV0tPm90aGVyY29uKQorCQkJCWttZW1fY2FjaGVfZnJlZShjb25fY2FjaGUsIGNvbm5lY3Rpb25zW2ldLT5vdGhlcmNvbik7CisJCQlrbWVtX2NhY2hlX2ZyZWUoY29uX2NhY2hlLCBjb25uZWN0aW9uc1tpXSk7CisJCX0KKwl9CisKKwlrZnJlZShjb25uZWN0aW9ucyk7CisJY29ubmVjdGlvbnMgPSBOVUxMOworCisJa21lbV9jYWNoZV9kZXN0cm95KGNvbl9jYWNoZSk7Cit9CisKKy8qIFRoaXMgaXMgcXVpdGUgbGlrZWx5IHRvIHNsZWVwLi4uICovCitpbnQgZGxtX2xvd2NvbW1zX3N0YXJ0KHZvaWQpCit7CisJaW50IGVycm9yID0gMDsKKworCWVycm9yID0gLUVOT01FTTsKKwljb25uZWN0aW9ucyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25uZWN0aW9uICopICoKKwkJCSAgICAgIE5PREVfSU5DUkVNRU5ULCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbm5lY3Rpb25zKQorCQlnb3RvIG91dDsKKworCWNvbm5fYXJyYXlfc2l6ZSA9IE5PREVfSU5DUkVNRU5UOworCisJaWYgKGRsbV9vdXJfYWRkcigmZGxtX2xvY2FsX2FkZHIsIDApKSB7CisJCWxvZ19wcmludCgibm8gbG9jYWwgSVAgYWRkcmVzcyBoYXMgYmVlbiBzZXQiKTsKKwkJZ290byBmYWlsX2ZyZWVfY29ubjsKKwl9CisJaWYgKCFkbG1fb3VyX2FkZHIoJmRsbV9sb2NhbF9hZGRyLCAxKSkgeworCQlsb2dfcHJpbnQoIlRoaXMgZGxtIGNvbW1zIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpLWhvbWVkIGNsdXN0ZXJpbmciKTsKKwkJZ290byBmYWlsX2ZyZWVfY29ubjsKKwl9CisKKwljb25fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZGxtX2Nvbm4iLCBzaXplb2Yoc3RydWN0IGNvbm5lY3Rpb24pLAorCQkJCSAgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBjb25uZWN0aW9uKSwgMCwKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoIWNvbl9jYWNoZSkKKwkJZ290byBmYWlsX2ZyZWVfY29ubjsKKworCisJLyogU3RhcnQgbGlzdGVuaW5nICovCisJZXJyb3IgPSBsaXN0ZW5fZm9yX2FsbCgpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX3VubGlzdGVuOworCisJZXJyb3IgPSBkYWVtb25zX3N0YXJ0KCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfdW5saXN0ZW47CisKKwlyZXR1cm4gMDsKKworZmFpbF91bmxpc3RlbjoKKwljbG9zZV9jb25uZWN0aW9uKGNvbm5lY3Rpb25zWzBdLCBmYWxzZSk7CisJa21lbV9jYWNoZV9mcmVlKGNvbl9jYWNoZSwgY29ubmVjdGlvbnNbMF0pOworCWttZW1fY2FjaGVfZGVzdHJveShjb25fY2FjaGUpOworCitmYWlsX2ZyZWVfY29ubjoKKwlrZnJlZShjb25uZWN0aW9ucyk7CisKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9kbG0vbG93Y29tbXMuYyBiL2ZzL2RsbS9sb3djb21tcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdmOTNkLi4wMDAwMDAwCi0tLSBhL2ZzL2RsbS9sb3djb21tcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qKgotKiogIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAotKiogIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0qKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBsb3djb21tcy5jCi0gKgotICogVGhpcyBpcyB0aGUgImxvdy1sZXZlbCIgY29tbXMgbGF5ZXIuCi0gKgotICogSXQgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcvcmVjZWl2aW5nIG1lc3NhZ2VzCi0gKiBmcm9tIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgotICoKLSAqIENsdXN0ZXIgbm9kZXMgYXJlIHJlZmVycmVkIHRvIGJ5IHRoZWlyIG5vZGVpZHMuIG5vZGVpZHMgYXJlCi0gKiBzaW1wbHkgMzIgYml0IG51bWJlcnMgdG8gdGhlIGxvY2tpbmcgbW9kdWxlIC0gaWYgdGhleSBuZWVkIHRvCi0gKiBiZSBleHBhbmRlZCBmb3IgdGhlIGNsdXN0ZXIgaW5mcmFzdHJ1Y3R1cmUgdGhlbiB0aGF0IGlzIGl0J3MKLSAqIHJlc3BvbnNpYmlsaXR5LiBJdCBpcyB0aGlzIGxheWVyJ3MKLSAqIHJlc3BvbnNpYmlsaXR5IHRvIHJlc29sdmUgdGhlc2UgaW50byBJUCBhZGRyZXNzIG9yCi0gKiB3aGF0ZXZlciBpdCBuZWVkcyBmb3IgaW50ZXItbm9kZSBjb21tdW5pY2F0aW9uLgotICoKLSAqIFRoZSBjb21tcyBsZXZlbCBpcyB0d28ga2VybmVsIHRocmVhZHMgdGhhdCBkZWFsIG1haW5seSB3aXRoCi0gKiB0aGUgcmVjZWl2aW5nIG9mIG1lc3NhZ2VzIGZyb20gb3RoZXIgbm9kZXMgYW5kIHBhc3NpbmcgdGhlbQotICogdXAgdG8gdGhlIG1pZC1sZXZlbCBjb21tcyBsYXllciAod2hpY2ggdW5kZXJzdGFuZHMgdGhlCi0gKiBtZXNzYWdlIGZvcm1hdCkgZm9yIGV4ZWN1dGlvbiBieSB0aGUgbG9ja2luZyBjb3JlLCBhbmQKLSAqIGEgc2VuZCB0aHJlYWQgd2hpY2ggZG9lcyBhbGwgdGhlIHNldHRpbmcgdXAgb2YgY29ubmVjdGlvbnMKLSAqIHRvIHJlbW90ZSBub2RlcyBhbmQgdGhlIHNlbmRpbmcgb2YgZGF0YS4gVGhyZWFkcyBhcmUgbm90IGFsbG93ZWQKLSAqIHRvIHNlbmQgdGhlaXIgb3duIGRhdGEgYmVjYXVzZSBpdCBtYXkgY2F1c2UgdGhlbSB0byB3YWl0IGluIHRpbWVzCi0gKiBvZiBoaWdoIGxvYWQuIEFsc28sIHRoaXMgd2F5LCB0aGUgc2VuZGluZyB0aHJlYWQgY2FuIGNvbGxlY3QgdG9nZXRoZXIKLSAqIG1lc3NhZ2VzIGJvdW5kIGZvciBvbmUgbm9kZSBhbmQgc2VuZCB0aGVtIGluIG9uZSBibG9jay4KLSAqCi0gKiBJIGRvbid0IHNlZSBhbnkgcHJvYmxlbSB3aXRoIHRoZSByZWN2IHRocmVhZCBleGVjdXRpbmcgdGhlIGxvY2tpbmcKLSAqIGNvZGUgb24gYmVoYWxmIG9mIHJlbW90ZSBwcm9jZXNzZXMgYXMgdGhlIGxvY2tpbmcgY29kZSBpcwotICogc2hvcnQsIGVmZmljaWVudCBhbmQgbmV2ZXIgKHdlbGwsIGhhcmRseSBldmVyKSB3YWl0cy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLSNpbmNsdWRlIDxuZXQvc2N0cC91c2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L2lkci5oPgotCi0jaW5jbHVkZSAiZGxtX2ludGVybmFsLmgiCi0jaW5jbHVkZSAibG93Y29tbXMuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJtaWRjb21tcy5oIgotCi1zdGF0aWMgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmRsbV9sb2NhbF9hZGRyW0RMTV9NQVhfQUREUl9DT1VOVF07Ci1zdGF0aWMgaW50CQkJZGxtX2xvY2FsX2NvdW50Owotc3RhdGljIGludAkJCWRsbV9sb2NhbF9ub2RlaWQ7Ci0KLS8qIE9uZSBvZiB0aGVzZSBwZXIgY29ubmVjdGVkIG5vZGUgKi8KLQotI2RlZmluZSBOSV9JTklUX1BFTkRJTkcgMQotI2RlZmluZSBOSV9XUklURV9QRU5ESU5HIDIKLQotc3RydWN0IG5vZGVpbmZvIHsKLQlzcGlubG9ja190CQlsb2NrOwotCXNjdHBfYXNzb2NfdAkJYXNzb2NfaWQ7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZAl3cml0ZV9saXN0OyAvKiBub2RlcyB3aXRoIHBlbmRpbmcgd3JpdGVzICovCi0Jc3RydWN0IGxpc3RfaGVhZAl3cml0ZXF1ZXVlOyAvKiBvdXRnb2luZyB3cml0ZXF1ZXVlX2VudHJpZXMgKi8KLQlzcGlubG9ja190CQl3cml0ZXF1ZXVlX2xvY2s7Ci0JaW50CQkJbm9kZWlkOwotfTsKLQotc3RhdGljIERFRklORV9JRFIobm9kZWluZm9faWRyKTsKLXN0YXRpYyBzdHJ1Y3Qgcndfc2VtYXBob3JlCW5vZGVpbmZvX2xvY2s7Ci1zdGF0aWMgaW50CQkJbWF4X25vZGVpZDsKLQotc3RydWN0IGNidWYgewotCXVuc2lnbmVkCQliYXNlOwotCXVuc2lnbmVkCQlsZW47Ci0JdW5zaWduZWQJCW1hc2s7Ci19OwotCi0vKiBKdXN0IHRoZSBvbmUgb2YgdGhlc2UsIG5vdy4gQnV0IHRoaXMgc3RydWN0IGtlZXBzCi0gICB0aGUgY29ubmVjdGlvbi1zcGVjaWZpYyB2YXJpYWJsZXMgdG9nZXRoZXIgKi8KLQotI2RlZmluZSBDRl9SRUFEX1BFTkRJTkcgMQotCi1zdHJ1Y3QgY29ubmVjdGlvbiB7Ci0Jc3RydWN0IHNvY2tldCAgICAgICAgICAqc29jazsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlzdHJ1Y3QgcGFnZSAgICAgICAgICAgICpyeF9wYWdlOwotCWF0b21pY190CQl3YWl0aW5nX3JlcXVlc3RzOwotCXN0cnVjdCBjYnVmCQljYjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBlYWdhaW5fZmxhZzsKLX07Ci0KLS8qIEFuIGVudHJ5IHdhaXRpbmcgdG8gYmUgc2VudCAqLwotCi1zdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBwYWdlICAgICAgICAgICAgKnBhZ2U7Ci0JaW50CQkJb2Zmc2V0OwotCWludAkJCWxlbjsKLQlpbnQJCQllbmQ7Ci0JaW50CQkJdXNlcnM7Ci0Jc3RydWN0IG5vZGVpbmZvICAgICAgICAqbmk7Ci19OwotCi0jZGVmaW5lIENCVUZfQUREKGNiLCBuKSBkbyB7IChjYiktPmxlbiArPSBuOyB9IHdoaWxlKDApCi0jZGVmaW5lIENCVUZfRU1QVFkoY2IpICgoY2IpLT5sZW4gPT0gMCkKLSNkZWZpbmUgQ0JVRl9NQVlfQUREKGNiLCBuKSAoKChjYiktPmxlbiArIChuKSkgPCAoKGNiKS0+bWFzayArIDEpKQotI2RlZmluZSBDQlVGX0RBVEEoY2IpICgoKGNiKS0+YmFzZSArIChjYiktPmxlbikgJiAoY2IpLT5tYXNrKQotCi0jZGVmaW5lIENCVUZfSU5JVChjYiwgc2l6ZSkgXAotZG8geyBcCi0JKGNiKS0+YmFzZSA9IChjYiktPmxlbiA9IDA7IFwKLQkoY2IpLT5tYXNrID0gKChzaXplKS0xKTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIENCVUZfRUFUKGNiLCBuKSBcCi1kbyB7IFwKLQkoY2IpLT5sZW4gIC09IChuKTsgXAotCShjYiktPmJhc2UgKz0gKG4pOyBcCi0JKGNiKS0+YmFzZSAmPSAoY2IpLT5tYXNrOyBcCi19IHdoaWxlKDApCi0KLQotLyogTGlzdCBvZiBub2RlcyB3aGljaCBoYXZlIHdyaXRlcyBwZW5kaW5nICovCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB3cml0ZV9ub2RlczsKLXN0YXRpYyBzcGlubG9ja190IHdyaXRlX25vZGVzX2xvY2s7Ci0KLS8qIE1heGltdW0gbnVtYmVyIG9mIGluY29taW5nIG1lc3NhZ2VzIHRvIHByb2Nlc3MgYmVmb3JlCi0gKiBkb2luZyBhIHNjaGVkdWxlKCkKLSAqLwotI2RlZmluZSBNQVhfUlhfTVNHX0NPVU5UIDI1Ci0KLS8qIE1hbmFnZSBkYWVtb25zICovCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpyZWN2X3Rhc2s7Ci1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzZW5kX3Rhc2s7Ci1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgbG93Y29tbXNfcmVjdl93YWl0Owotc3RhdGljIGF0b21pY190IGFjY2VwdGluZzsKLQotLyogVGhlIFNDVFAgY29ubmVjdGlvbiAqLwotc3RhdGljIHN0cnVjdCBjb25uZWN0aW9uIHNjdHBfY29uOwotCi0KLXN0YXRpYyBpbnQgbm9kZWlkX3RvX2FkZHIoaW50IG5vZGVpZCwgc3RydWN0IHNvY2thZGRyICpyZXRhZGRyKQotewotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7Ci0JaW50IGVycm9yOwotCi0JaWYgKCFkbG1fbG9jYWxfY291bnQpCi0JCXJldHVybiAtMTsKLQotCWVycm9yID0gZGxtX25vZGVpZF90b19hZGRyKG5vZGVpZCwgJmFkZHIpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JaWYgKGRsbV9sb2NhbF9hZGRyWzBdLT5zc19mYW1pbHkgPT0gQUZfSU5FVCkgewotCSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICppbjQgID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmYWRkcjsKLQkJc3RydWN0IHNvY2thZGRyX2luICpyZXQ0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSByZXRhZGRyOwotCQlyZXQ0LT5zaW5fYWRkci5zX2FkZHIgPSBpbjQtPnNpbl9hZGRyLnNfYWRkcjsKLQl9IGVsc2UgewotCSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqaW42ICA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZhZGRyOwotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpyZXQ2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgcmV0YWRkcjsKLQkJbWVtY3B5KCZyZXQ2LT5zaW42X2FkZHIsICZpbjYtPnNpbjZfYWRkciwKLQkJICAgICAgIHNpemVvZihpbjYtPnNpbjZfYWRkcikpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG5vZGVpbmZvICpub2RlaWQybm9kZWluZm8oaW50IG5vZGVpZCwgZ2ZwX3QgYWxsb2MpCi17Ci0Jc3RydWN0IG5vZGVpbmZvICpuaTsKLQlpbnQgcjsKLQlpbnQgbjsKLQotCWRvd25fcmVhZCgmbm9kZWluZm9fbG9jayk7Ci0JbmkgPSBpZHJfZmluZCgmbm9kZWluZm9faWRyLCBub2RlaWQpOwotCXVwX3JlYWQoJm5vZGVpbmZvX2xvY2spOwotCi0JaWYgKCFuaSAmJiBhbGxvYykgewotCQlkb3duX3dyaXRlKCZub2RlaW5mb19sb2NrKTsKLQotCQluaSA9IGlkcl9maW5kKCZub2RlaW5mb19pZHIsIG5vZGVpZCk7Ci0JCWlmIChuaSkKLQkJCWdvdG8gb3V0X3VwOwotCi0JCXIgPSBpZHJfcHJlX2dldCgmbm9kZWluZm9faWRyLCBhbGxvYyk7Ci0JCWlmICghcikKLQkJCWdvdG8gb3V0X3VwOwotCi0JCW5pID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGVpbmZvKSwgYWxsb2MpOwotCQlpZiAoIW5pKQotCQkJZ290byBvdXRfdXA7Ci0KLQkJciA9IGlkcl9nZXRfbmV3X2Fib3ZlKCZub2RlaW5mb19pZHIsIG5pLCBub2RlaWQsICZuKTsKLQkJaWYgKHIpIHsKLQkJCWtmcmVlKG5pKTsKLQkJCW5pID0gTlVMTDsKLQkJCWdvdG8gb3V0X3VwOwotCQl9Ci0JCWlmIChuICE9IG5vZGVpZCkgewotCQkJaWRyX3JlbW92ZSgmbm9kZWluZm9faWRyLCBuKTsKLQkJCWtmcmVlKG5pKTsKLQkJCW5pID0gTlVMTDsKLQkJCWdvdG8gb3V0X3VwOwotCQl9Ci0JCW1lbXNldChuaSwgMCwgc2l6ZW9mKHN0cnVjdCBub2RlaW5mbykpOwotCQlzcGluX2xvY2tfaW5pdCgmbmktPmxvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmbmktPndyaXRlcXVldWUpOwotCQlzcGluX2xvY2tfaW5pdCgmbmktPndyaXRlcXVldWVfbG9jayk7Ci0JCW5pLT5ub2RlaWQgPSBub2RlaWQ7Ci0KLQkJaWYgKG5vZGVpZCA+IG1heF9ub2RlaWQpCi0JCQltYXhfbm9kZWlkID0gbm9kZWlkOwotCW91dF91cDoKLQkJdXBfd3JpdGUoJm5vZGVpbmZvX2xvY2spOwotCX0KLQotCXJldHVybiBuaTsKLX0KLQotLyogRG9uJ3QgY2FsbCB0aGlzIHRvbyBvZnRlbi4uLiAqLwotc3RhdGljIHN0cnVjdCBub2RlaW5mbyAqYXNzb2Mybm9kZWluZm8oc2N0cF9hc3NvY190IGFzc29jKQotewotCWludCBpOwotCXN0cnVjdCBub2RlaW5mbyAqbmk7Ci0KLQlmb3IgKGk9MTsgaTw9bWF4X25vZGVpZDsgaSsrKSB7Ci0JCW5pID0gbm9kZWlkMm5vZGVpbmZvKGksIDApOwotCQlpZiAobmkgJiYgbmktPmFzc29jX2lkID09IGFzc29jKQotCQkJcmV0dXJuIG5pOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogRGF0YSBvciBub3RpZmljYXRpb24gYXZhaWxhYmxlIG9uIHNvY2tldCAqLwotc3RhdGljIHZvaWQgbG93Y29tbXNfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqc2ssIGludCBjb3VudF91bnVzZWQpCi17Ci0JYXRvbWljX2luYygmc2N0cF9jb24ud2FpdGluZ19yZXF1ZXN0cyk7Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoQ0ZfUkVBRF9QRU5ESU5HLCAmc2N0cF9jb24uZmxhZ3MpKQotCQlyZXR1cm47Ci0KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvd2NvbW1zX3JlY3Zfd2FpdCk7Ci19Ci0KLQotLyogQWRkIHRoZSBwb3J0IG51bWJlciB0byBhbiBJUDYgb3IgNCBzb2NrYWRkciBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIGxlbmd0aC4KLSAgIEFsc28gcGFkZCBvdXQgdGhlIHN0cnVjdCB3aXRoIHplcm9zIHRvIG1ha2UgY29tcGFyaXNvbnMgbWVhbmluZ2Z1bCAqLwotCi1zdGF0aWMgdm9pZCBtYWtlX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICpzYWRkciwgdWludDE2X3QgcG9ydCwKLQkJCSAgaW50ICphZGRyX2xlbikKLXsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmxvY2FsNF9hZGRyOwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmxvY2FsNl9hZGRyOwotCi0JaWYgKCFkbG1fbG9jYWxfY291bnQpCi0JCXJldHVybjsKLQotCWlmICghcG9ydCkgewotCQlpZiAoZGxtX2xvY2FsX2FkZHJbMF0tPnNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JCQlsb2NhbDRfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilkbG1fbG9jYWxfYWRkclswXTsKLQkJCXBvcnQgPSBiZTE2X3RvX2NwdShsb2NhbDRfYWRkci0+c2luX3BvcnQpOwotCQl9IGVsc2UgewotCQkJbG9jYWw2X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWRsbV9sb2NhbF9hZGRyWzBdOwotCQkJcG9ydCA9IGJlMTZfdG9fY3B1KGxvY2FsNl9hZGRyLT5zaW42X3BvcnQpOwotCQl9Ci0JfQotCi0Jc2FkZHItPnNzX2ZhbWlseSA9IGRsbV9sb2NhbF9hZGRyWzBdLT5zc19mYW1pbHk7Ci0JaWYgKGRsbV9sb2NhbF9hZGRyWzBdLT5zc19mYW1pbHkgPT0gQUZfSU5FVCkgewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmluNF9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhZGRyOwotCQlpbjRfYWRkci0+c2luX3BvcnQgPSBjcHVfdG9fYmUxNihwb3J0KTsKLQkJbWVtc2V0KCZpbjRfYWRkci0+c2luX3plcm8sIDAsIHNpemVvZihpbjRfYWRkci0+c2luX3plcm8pKTsKLQkJbWVtc2V0KGluNF9hZGRyKzEsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkgLQotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKLQkJKmFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHNvY2thZGRyX2luNiAqaW42X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhZGRyOwotCQlpbjZfYWRkci0+c2luNl9wb3J0ID0gY3B1X3RvX2JlMTYocG9ydCk7Ci0JCW1lbXNldChpbjZfYWRkcisxLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpIC0KLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwotCQkqYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7Ci0JfQotfQotCi0vKiBDbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgdGlkeSB1cCAqLwotc3RhdGljIHZvaWQgY2xvc2VfY29ubmVjdGlvbih2b2lkKQotewotCWlmIChzY3RwX2Nvbi5zb2NrKSB7Ci0JCXNvY2tfcmVsZWFzZShzY3RwX2Nvbi5zb2NrKTsKLQkJc2N0cF9jb24uc29jayA9IE5VTEw7Ci0JfQotCi0JaWYgKHNjdHBfY29uLnJ4X3BhZ2UpIHsKLQkJX19mcmVlX3BhZ2Uoc2N0cF9jb24ucnhfcGFnZSk7Ci0JCXNjdHBfY29uLnJ4X3BhZ2UgPSBOVUxMOwotCX0KLX0KLQotLyogV2Ugb25seSBzZW5kIHNodXRkb3duIG1lc3NhZ2VzIHRvIG5vZGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjbHVzdGVyICovCi1zdGF0aWMgdm9pZCBzZW5kX3NodXRkb3duKHNjdHBfYXNzb2NfdCBhc3NvY2lkKQotewotCXN0YXRpYyBjaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKLQlzdHJ1Y3QgbXNnaGRyIG91dG1lc3NhZ2U7Ci0Jc3RydWN0IGNtc2doZHIgKmNtc2c7Ci0Jc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87Ci0JaW50IHJldDsKLQotCW91dG1lc3NhZ2UubXNnX25hbWUgPSBOVUxMOwotCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSAwOwotCW91dG1lc3NhZ2UubXNnX2NvbnRyb2wgPSBvdXRjbXNnOwotCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7Ci0Jb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSBNU0dfRU9SOwotCi0JY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOwotCWNtc2ctPmNtc2dfbGV2ZWwgPSBJUFBST1RPX1NDVFA7Ci0JY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7Ci0JY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOwotCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKLQlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOwotCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKLQotCXNpbmZvLT5zaW5mb19mbGFncyB8PSBNU0dfRU9GOwotCXNpbmZvLT5zaW5mb19hc3NvY19pZCA9IGFzc29jaWQ7Ci0KLQlyZXQgPSBrZXJuZWxfc2VuZG1zZyhzY3RwX2Nvbi5zb2NrLCAmb3V0bWVzc2FnZSwgTlVMTCwgMCwgMCk7Ci0KLQlpZiAocmV0ICE9IDApCi0JCWxvZ19wcmludCgic2VuZCBFT0YgdG8gbm9kZSBmYWlsZWQ6ICVkIiwgcmV0KTsKLX0KLQotCi0vKiBJTklUIGZhaWxlZCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCBub2RlLi4uCi0gICByZXN0YXJ0IElOSVQgb24gYWxsIHBlbmRpbmcgbm9kZXMgKi8KLXN0YXRpYyB2b2lkIGluaXRfZmFpbGVkKHZvaWQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG5vZGVpbmZvICpuaTsKLQotCWZvciAoaT0xOyBpPD1tYXhfbm9kZWlkOyBpKyspIHsKLQkJbmkgPSBub2RlaWQybm9kZWluZm8oaSwgMCk7Ci0JCWlmICghbmkpCi0JCQljb250aW51ZTsKLQotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5JX0lOSVRfUEVORElORywgJm5pLT5mbGFncykpIHsKLQkJCW5pLT5hc3NvY19pZCA9IDA7Ci0JCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTklfV1JJVEVfUEVORElORywgJm5pLT5mbGFncykpIHsKLQkJCQlzcGluX2xvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOwotCQkJCWxpc3RfYWRkX3RhaWwoJm5pLT53cml0ZV9saXN0LCAmd3JpdGVfbm9kZXMpOwotCQkJCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKLQkJCX0KLQkJfQotCX0KLQl3YWtlX3VwX3Byb2Nlc3Moc2VuZF90YXNrKTsKLX0KLQotLyogU29tZXRoaW5nIGhhcHBlbmVkIHRvIGFuIGFzc29jaWF0aW9uICovCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3NjdHBfbm90aWZpY2F0aW9uKHN0cnVjdCBtc2doZHIgKm1zZywgY2hhciAqYnVmKQotewotCXVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICpzbiA9ICh1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqKWJ1ZjsKLQotCWlmIChzbi0+c25faGVhZGVyLnNuX3R5cGUgPT0gU0NUUF9BU1NPQ19DSEFOR0UpIHsKLQkJc3dpdGNoIChzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19zdGF0ZSkgewotCi0JCWNhc2UgU0NUUF9DT01NX1VQOgotCQljYXNlIFNDVFBfUkVTVEFSVDoKLQkJewotCQkJLyogQ2hlY2sgdGhhdCB0aGUgbmV3IG5vZGUgaXMgaW4gdGhlIGxvY2tzcGFjZSAqLwotCQkJc3RydWN0IHNjdHBfcHJpbSBwcmltOwotCQkJbW1fc2VnbWVudF90IGZzOwotCQkJaW50IG5vZGVpZDsKLQkJCWludCBwcmltX2xlbiwgcmV0OwotCQkJaW50IGFkZHJfbGVuOwotCQkJc3RydWN0IG5vZGVpbmZvICpuaTsKLQotCQkJLyogVGhpcyBzZWVtcyB0byBoYXBwZW4gd2hlbiB3ZSByZWNlaXZlZCBhIGNvbm5lY3Rpb24KLQkJCSAqIHRvbyBlYXJseS4uLiBvciBzb21ldGhpbmcuLi4gIGFueXdheSwgaXQgaGFwcGVucyBidXQKLQkJCSAqIHdlIGFsd2F5cyBzZWVtIHRvIGdldCBhIHJlYWwgbWVzc2FnZSB0b28sIHNlZQotCQkJICogcmVjZWl2ZV9mcm9tX3NvY2sgKi8KLQotCQkJaWYgKChpbnQpc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfYXNzb2NfaWQgPD0gMCkgewotCQkJCWxvZ19wcmludCgiQ09NTV9VUCBmb3IgaW52YWxpZCBhc3NvYyBJRCAlZCIsCi0JCQkJCSAoaW50KXNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX2Fzc29jX2lkKTsKLQkJCQlpbml0X2ZhaWxlZCgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCW1lbXNldCgmcHJpbSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3ByaW0pKTsKLQkJCXByaW1fbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3ByaW0pOwotCQkJcHJpbS5zc3BfYXNzb2NfaWQgPSBzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZDsKLQotCQkJZnMgPSBnZXRfZnMoKTsKLQkJCXNldF9mcyhnZXRfZHMoKSk7Ci0JCQlyZXQgPSBzY3RwX2Nvbi5zb2NrLT5vcHMtPmdldHNvY2tvcHQoc2N0cF9jb24uc29jaywKLQkJCQkJCUlQUFJPVE9fU0NUUCwgU0NUUF9QUklNQVJZX0FERFIsCi0JCQkJCQkoY2hhciopJnByaW0sICZwcmltX2xlbik7Ci0JCQlzZXRfZnMoZnMpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlzdHJ1Y3Qgbm9kZWluZm8gKm5pOwotCi0JCQkJbG9nX3ByaW50KCJnZXRzb2Nrb3B0L3NjdHBfcHJpbWFyeV9hZGRyIG9uICIKLQkJCQkJICAibmV3IGFzc29jICVkIGZhaWxlZCA6ICVkIiwKLQkJCQkgICAgKGludClzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZCwgcmV0KTsKLQotCQkJCS8qIFJldHJ5IElOSVQgbGF0ZXIgKi8KLQkJCQluaSA9IGFzc29jMm5vZGVpbmZvKHNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX2Fzc29jX2lkKTsKLQkJCQlpZiAobmkpCi0JCQkJCWNsZWFyX2JpdChOSV9JTklUX1BFTkRJTkcsICZuaS0+ZmxhZ3MpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCW1ha2Vfc29ja2FkZHIoJnByaW0uc3NwX2FkZHIsIDAsICZhZGRyX2xlbik7Ci0JCQlpZiAoZGxtX2FkZHJfdG9fbm9kZWlkKCZwcmltLnNzcF9hZGRyLCAmbm9kZWlkKSkgewotCQkJCWxvZ19wcmludCgicmVqZWN0IGNvbm5lY3QgZnJvbSB1bmtub3duIGFkZHIiKTsKLQkJCQlzZW5kX3NodXRkb3duKHByaW0uc3NwX2Fzc29jX2lkKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCW5pID0gbm9kZWlkMm5vZGVpbmZvKG5vZGVpZCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIW5pKQotCQkJCXJldHVybjsKLQotCQkJLyogU2F2ZSB0aGUgYXNzb2MgSUQgKi8KLQkJCXNwaW5fbG9jaygmbmktPmxvY2spOwotCQkJbmktPmFzc29jX2lkID0gc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfYXNzb2NfaWQ7Ci0JCQlzcGluX3VubG9jaygmbmktPmxvY2spOwotCi0JCQlsb2dfcHJpbnQoImdvdCBuZXcvcmVzdGFydGVkIGFzc29jaWF0aW9uICVkIG5vZGVpZCAlZCIsCi0JCQkgICAgICAgKGludClzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZCwgbm9kZWlkKTsKLQotCQkJLyogU2VuZCBhbnkgcGVuZGluZyB3cml0ZXMgKi8KLQkJCWNsZWFyX2JpdChOSV9JTklUX1BFTkRJTkcsICZuaS0+ZmxhZ3MpOwotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE5JX1dSSVRFX1BFTkRJTkcsICZuaS0+ZmxhZ3MpKSB7Ci0JCQkJc3Bpbl9sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKLQkJCQlsaXN0X2FkZF90YWlsKCZuaS0+d3JpdGVfbGlzdCwgJndyaXRlX25vZGVzKTsKLQkJCQlzcGluX3VubG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7Ci0JCQl9Ci0JCQl3YWtlX3VwX3Byb2Nlc3Moc2VuZF90YXNrKTsKLQkJfQotCQlicmVhazsKLQotCQljYXNlIFNDVFBfQ09NTV9MT1NUOgotCQljYXNlIFNDVFBfU0hVVERPV05fQ09NUDoKLQkJewotCQkJc3RydWN0IG5vZGVpbmZvICpuaTsKLQotCQkJbmkgPSBhc3NvYzJub2RlaW5mbyhzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZCk7Ci0JCQlpZiAobmkpIHsKLQkJCQlzcGluX2xvY2soJm5pLT5sb2NrKTsKLQkJCQluaS0+YXNzb2NfaWQgPSAwOwotCQkJCXNwaW5fdW5sb2NrKCZuaS0+bG9jayk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJLyogV2UgZG9uJ3Qga25vdyB3aGljaCBJTklUIGZhaWxlZCwgc28gY2xlYXIgdGhlIFBFTkRJTkcgZmxhZ3MKLQkJICogb24gdGhlbSBhbGwuICBpZiBhc3NvY19pZCBpcyB6ZXJvIHRoZW4gaXQgd2lsbCB0aGVuIHRyeQotCQkgKiBhZ2FpbiAqLwotCi0JCWNhc2UgU0NUUF9DQU5UX1NUUl9BU1NPQzoKLQkJewotCQkJbG9nX3ByaW50KCJDYW4ndCBzdGFydCBTQ1RQIGFzc29jaWF0aW9uIC0gcmV0cnlpbmciKTsKLQkJCWluaXRfZmFpbGVkKCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWxvZ19wcmludCgidW5leHBlY3RlZCBTQ1RQIGFzc29jIGNoYW5nZSBpZD0lZCBzdGF0ZT0lZCIsCi0JCQkJICAoaW50KXNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX2Fzc29jX2lkLAotCQkJCSAgc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfc3RhdGUpOwotCQl9Ci0JfQotfQotCi0vKiBEYXRhIHJlY2VpdmVkIGZyb20gcmVtb3RlIGVuZCAqLwotc3RhdGljIGludCByZWNlaXZlX2Zyb21fc29jayh2b2lkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBrdmVjIGlvdlsyXTsKLQl1bnNpZ25lZCBsZW47Ci0JaW50IHI7Ci0Jc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87Ci0Jc3RydWN0IGNtc2doZHIgKmNtc2c7Ci0Jc3RydWN0IG5vZGVpbmZvICpuaTsKLQotCS8qIFRoZXNlIHR3byBhcmUgbWFyZ2luYWxseSB0b28gYmlnIGZvciBzdGFjayBhbGxvY2F0aW9uLCBidXQgdGhpcwotCSAqIGZ1bmN0aW9uIGlzIChjdXJyZW50bHkpIG9ubHkgY2FsbGVkIGJ5IGRsbV9yZWN2ZCBzbyBzdGF0aWMgc2hvdWxkIGJlCi0JICogT0suCi0JICovCi0Jc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIG1zZ25hbWU7Ci0Jc3RhdGljIGNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07Ci0KLQlpZiAoc2N0cF9jb24uc29jayA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCWlmIChzY3RwX2Nvbi5yeF9wYWdlID09IE5VTEwpIHsKLQkJLyoKLQkJICogVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgYXRvbWljLCBidXQgSSB0aGluayBpdCBzaG91bGQKLQkJICogaW1wcm92ZSBwZXJmb3JtYW5jZSBpZiBpdCBpcy4KLQkJICovCi0JCXNjdHBfY29uLnJ4X3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOwotCQlpZiAoc2N0cF9jb24ucnhfcGFnZSA9PSBOVUxMKQotCQkJZ290byBvdXRfcmVzY2hlZDsKLQkJQ0JVRl9JTklUKCZzY3RwX2Nvbi5jYiwgUEFHRV9DQUNIRV9TSVpFKTsKLQl9Ci0KLQltZW1zZXQoJmluY21zZywgMCwgc2l6ZW9mKGluY21zZykpOwotCW1lbXNldCgmbXNnbmFtZSwgMCwgc2l6ZW9mKG1zZ25hbWUpKTsKLQotCW1lbXNldChpbmNtc2csIDAsIHNpemVvZihpbmNtc2cpKTsKLQltc2cubXNnX25hbWUgPSAmbXNnbmFtZTsKLQltc2cubXNnX25hbWVsZW4gPSBzaXplb2YobXNnbmFtZSk7Ci0JbXNnLm1zZ19mbGFncyA9IDA7Ci0JbXNnLm1zZ19jb250cm9sID0gaW5jbXNnOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOwotCi0JLyogSSBkb24ndCBzZWUgd2h5IHRoaXMgY2lyY3VsYXIgYnVmZmVyIHN0dWZmIGlzIG5lY2Vzc2FyeSBmb3IgU0NUUAotCSAqIHdoaWNoIGlzIGEgcGFja2V0LWJhc2VkIHByb3RvY29sLCBidXQgdGhlIHdob2xlIHRoaW5nIGJyZWFrcyB1bmRlcgotCSAqIGxvYWQgd2l0aG91dCBpdCEgVGhlIG92ZXJoZWFkIGlzIG1pbmltYWwgKGFuZCBpcyBpbiB0aGUgVENQIGxvd2NvbW1zCi0JICogYW55d2F5LCBvZiBjb3Vyc2UpIHNvIEknbGwgbGVhdmUgaXQgaW4gdW50aWwgSSBjYW4gZmlndXJlIG91dCB3aGF0J3MKLQkgKiByZWFsbHkgaGFwcGVuaW5nLgotCSAqLwotCi0JLyoKLQkgKiBpb3ZbMF0gaXMgdGhlIGJpdCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGJldHdlZW4gdGhlIGN1cnJlbnQgZW5kCi0JICogcG9pbnQgKGNiLmJhc2UgKyBjYi5sZW4pIGFuZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0JICovCi0JaW92WzBdLmlvdl9sZW4gPSBzY3RwX2Nvbi5jYi5iYXNlIC0gQ0JVRl9EQVRBKCZzY3RwX2Nvbi5jYik7Ci0JaW92WzBdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKHNjdHBfY29uLnJ4X3BhZ2UpICsKLQkJCSAgQ0JVRl9EQVRBKCZzY3RwX2Nvbi5jYik7Ci0JaW92WzFdLmlvdl9sZW4gPSAwOwotCi0JLyoKLQkgKiBpb3ZbMV0gaXMgdGhlIGJpdCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQotCSAqIGJ1ZmZlciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50bHkgdXNlZCBzZWN0aW9uIChjYi5iYXNlKQotCSAqLwotCWlmIChDQlVGX0RBVEEoJnNjdHBfY29uLmNiKSA+PSBzY3RwX2Nvbi5jYi5iYXNlKSB7Ci0JCWlvdlswXS5pb3ZfbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0gQ0JVRl9EQVRBKCZzY3RwX2Nvbi5jYik7Ci0JCWlvdlsxXS5pb3ZfbGVuID0gc2N0cF9jb24uY2IuYmFzZTsKLQkJaW92WzFdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKHNjdHBfY29uLnJ4X3BhZ2UpOwotCQltc2cubXNnX2lvdmxlbiA9IDI7Ci0JfQotCWxlbiA9IGlvdlswXS5pb3ZfbGVuICsgaW92WzFdLmlvdl9sZW47Ci0KLQlyID0gcmV0ID0ga2VybmVsX3JlY3Ztc2coc2N0cF9jb24uc29jaywgJm1zZywgaW92LCBtc2cubXNnX2lvdmxlbiwgbGVuLAotCQkJCSBNU0dfTk9TSUdOQUwgfCBNU0dfRE9OVFdBSVQpOwotCWlmIChyZXQgPD0gMCkKLQkJZ290byBvdXRfY2xvc2U7Ci0KLQltc2cubXNnX2NvbnRyb2wgPSBpbmNtc2c7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7Ci0JY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7Ci0Jc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKLQotCWlmIChtc2cubXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikgewotCQlwcm9jZXNzX3NjdHBfbm90aWZpY2F0aW9uKCZtc2csIHBhZ2VfYWRkcmVzcyhzY3RwX2Nvbi5yeF9wYWdlKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIElzIHRoaXMgYSBuZXcgYXNzb2NpYXRpb24gPyAqLwotCW5pID0gbm9kZWlkMm5vZGVpbmZvKGxlMzJfdG9fY3B1KHNpbmZvLT5zaW5mb19wcGlkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5pKSB7Ci0JCW5pLT5hc3NvY19pZCA9IHNpbmZvLT5zaW5mb19hc3NvY19pZDsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChOSV9JTklUX1BFTkRJTkcsICZuaS0+ZmxhZ3MpKSB7Ci0KLQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChOSV9XUklURV9QRU5ESU5HLCAmbmktPmZsYWdzKSkgewotCQkJCXNwaW5fbG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmbmktPndyaXRlX2xpc3QsICZ3cml0ZV9ub2Rlcyk7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOwotCQkJfQotCQkJd2FrZV91cF9wcm9jZXNzKHNlbmRfdGFzayk7Ci0JCX0KLQl9Ci0KLQkvKiBJTklUIHNlbmRzIGEgbWVzc2FnZSB3aXRoIGxlbmd0aCBvZiAxIC0gaWdub3JlIGl0ICovCi0JaWYgKHIgPT0gMSkKLQkJcmV0dXJuIDA7Ci0KLQlDQlVGX0FERCgmc2N0cF9jb24uY2IsIHJldCk7Ci0JcmV0ID0gZGxtX3Byb2Nlc3NfaW5jb21pbmdfYnVmZmVyKGNwdV90b19sZTMyKHNpbmZvLT5zaW5mb19wcGlkKSwKLQkJCQkJICBwYWdlX2FkZHJlc3Moc2N0cF9jb24ucnhfcGFnZSksCi0JCQkJCSAgc2N0cF9jb24uY2IuYmFzZSwgc2N0cF9jb24uY2IubGVuLAotCQkJCQkgIFBBR0VfQ0FDSEVfU0laRSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2Nsb3NlOwotCUNCVUZfRUFUKCZzY3RwX2Nvbi5jYiwgcmV0KTsKLQotICAgICAgb3V0OgotCXJldCA9IDA7Ci0JZ290byBvdXRfcmV0OwotCi0gICAgICBvdXRfcmVzY2hlZDoKLQlsb3djb21tc19kYXRhX3JlYWR5KHNjdHBfY29uLnNvY2stPnNrLCAwKTsKLQlyZXQgPSAwOwotCXNjaGVkdWxlKCk7Ci0JZ290byBvdXRfcmV0OwotCi0gICAgICBvdXRfY2xvc2U6Ci0JaWYgKHJldCAhPSAtRUFHQUlOKQotCQlsb2dfcHJpbnQoImVycm9yIHJlYWRpbmcgZnJvbSBzY3RwIHNvY2tldDogJWQiLCByZXQpOwotICAgICAgb3V0X3JldDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBCaW5kIHRvIGFuIElQIGFkZHJlc3MuIFNDVFAgYWxsb3dzIG11bHRpcGxlIGFkZHJlc3Mgc28gaXQgY2FuIGRvIG11bHRpLWhvbWluZyAqLwotc3RhdGljIGludCBhZGRfYmluZF9hZGRyKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBpbnQgYWRkcl9sZW4sIGludCBudW0pCi17Ci0JbW1fc2VnbWVudF90IGZzOwotCWludCByZXN1bHQgPSAwOwotCi0JZnMgPSBnZXRfZnMoKTsKLQlzZXRfZnMoZ2V0X2RzKCkpOwotCWlmIChudW0gPT0gMSkKLQkJcmVzdWx0ID0gc2N0cF9jb24uc29jay0+b3BzLT5iaW5kKHNjdHBfY29uLnNvY2ssCi0JCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkciwgYWRkcl9sZW4pOwotCWVsc2UKLQkJcmVzdWx0ID0gc2N0cF9jb24uc29jay0+b3BzLT5zZXRzb2Nrb3B0KHNjdHBfY29uLnNvY2ssIFNPTF9TQ1RQLAotCQkJCVNDVFBfU09DS09QVF9CSU5EWF9BREQsIChjaGFyICopYWRkciwgYWRkcl9sZW4pOwotCXNldF9mcyhmcyk7Ci0KLQlpZiAocmVzdWx0IDwgMCkKLQkJbG9nX3ByaW50KCJDYW4ndCBiaW5kIHRvIHBvcnQgJWQgYWRkciBudW1iZXIgJWQiLAotCQkJICBkbG1fY29uZmlnLnRjcF9wb3J0LCBudW0pOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9sb2NhbCh2b2lkKQotewotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhcywgKmFkZHI7Ci0JaW50IGk7Ci0KLQlkbG1fbG9jYWxfbm9kZWlkID0gZGxtX291cl9ub2RlaWQoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBETE1fTUFYX0FERFJfQ09VTlQgLSAxOyBpKyspIHsKLQkJaWYgKGRsbV9vdXJfYWRkcigmc2FzLCBpKSkKLQkJCWJyZWFrOwotCi0JCWFkZHIgPSBrbWFsbG9jKHNpemVvZigqYWRkciksIEdGUF9LRVJORUwpOwotCQlpZiAoIWFkZHIpCi0JCQlicmVhazsKLQkJbWVtY3B5KGFkZHIsICZzYXMsIHNpemVvZigqYWRkcikpOwotCQlkbG1fbG9jYWxfYWRkcltkbG1fbG9jYWxfY291bnQrK10gPSBhZGRyOwotCX0KLX0KLQotLyogSW5pdGlhbGlzZSBTQ1RQIHNvY2tldCBhbmQgYmluZCB0byBhbGwgaW50ZXJmYWNlcyAqLwotc3RhdGljIGludCBpbml0X3NvY2sodm9pZCkKLXsKLQltbV9zZWdtZW50X3QgZnM7Ci0Jc3RydWN0IHNvY2tldCAqc29jayA9IE5VTEw7Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbG9jYWxhZGRyOwotCXN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSBzdWJzY3JpYmU7Ci0JaW50IHJlc3VsdCA9IC1FSU5WQUwsIG51bSA9IDEsIGksIGFkZHJfbGVuOwotCi0JaWYgKCFkbG1fbG9jYWxfY291bnQpIHsKLQkJaW5pdF9sb2NhbCgpOwotCQlpZiAoIWRsbV9sb2NhbF9jb3VudCkgewotCQkJbG9nX3ByaW50KCJubyBsb2NhbCBJUCBhZGRyZXNzIGhhcyBiZWVuIHNldCIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlyZXN1bHQgPSBzb2NrX2NyZWF0ZV9rZXJuKGRsbV9sb2NhbF9hZGRyWzBdLT5zc19mYW1pbHksIFNPQ0tfU0VRUEFDS0VULAotCQkJCSAgSVBQUk9UT19TQ1RQLCAmc29jayk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJbG9nX3ByaW50KCJDYW4ndCBjcmVhdGUgY29tbXMgc29ja2V0LCBjaGVjayBTQ1RQIGlzIGxvYWRlZCIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBMaXN0ZW4gZm9yIGV2ZW50cyAqLwotCW1lbXNldCgmc3Vic2NyaWJlLCAwLCBzaXplb2Yoc3Vic2NyaWJlKSk7Ci0Jc3Vic2NyaWJlLnNjdHBfZGF0YV9pb19ldmVudCA9IDE7Ci0Jc3Vic2NyaWJlLnNjdHBfYXNzb2NpYXRpb25fZXZlbnQgPSAxOwotCXN1YnNjcmliZS5zY3RwX3NlbmRfZmFpbHVyZV9ldmVudCA9IDE7Ci0Jc3Vic2NyaWJlLnNjdHBfc2h1dGRvd25fZXZlbnQgPSAxOwotCXN1YnNjcmliZS5zY3RwX3BhcnRpYWxfZGVsaXZlcnlfZXZlbnQgPSAxOwotCi0JZnMgPSBnZXRfZnMoKTsKLQlzZXRfZnMoZ2V0X2RzKCkpOwotCXJlc3VsdCA9IHNvY2stPm9wcy0+c2V0c29ja29wdChzb2NrLCBTT0xfU0NUUCwgU0NUUF9FVkVOVFMsCi0JCQkJICAgICAgIChjaGFyICopJnN1YnNjcmliZSwgc2l6ZW9mKHN1YnNjcmliZSkpOwotCXNldF9mcyhmcyk7Ci0KLQlpZiAocmVzdWx0IDwgMCkgewotCQlsb2dfcHJpbnQoIkZhaWxlZCB0byBzZXQgU0NUUF9FVkVOVFMgb24gc29ja2V0OiByZXN1bHQ9JWQiLAotCQkJICByZXN1bHQpOwotCQlnb3RvIGNyZWF0ZV9kZWxzb2NrOwotCX0KLQotCS8qIEluaXQgY29uIHN0cnVjdCAqLwotCXNvY2stPnNrLT5za191c2VyX2RhdGEgPSAmc2N0cF9jb247Ci0Jc2N0cF9jb24uc29jayA9IHNvY2s7Ci0Jc2N0cF9jb24uc29jay0+c2stPnNrX2RhdGFfcmVhZHkgPSBsb3djb21tc19kYXRhX3JlYWR5OwotCi0JLyogQmluZCB0byBhbGwgaW50ZXJmYWNlcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGxtX2xvY2FsX2NvdW50OyBpKyspIHsKLQkJbWVtY3B5KCZsb2NhbGFkZHIsIGRsbV9sb2NhbF9hZGRyW2ldLCBzaXplb2YobG9jYWxhZGRyKSk7Ci0JCW1ha2Vfc29ja2FkZHIoJmxvY2FsYWRkciwgZGxtX2NvbmZpZy50Y3BfcG9ydCwgJmFkZHJfbGVuKTsKLQotCQlyZXN1bHQgPSBhZGRfYmluZF9hZGRyKCZsb2NhbGFkZHIsIGFkZHJfbGVuLCBudW0pOwotCQlpZiAocmVzdWx0KQotCQkJZ290byBjcmVhdGVfZGVsc29jazsKLQkJKytudW07Ci0JfQotCi0JcmVzdWx0ID0gc29jay0+b3BzLT5saXN0ZW4oc29jaywgNSk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJbG9nX3ByaW50KCJDYW4ndCBzZXQgc29ja2V0IGxpc3RlbmluZyIpOwotCQlnb3RvIGNyZWF0ZV9kZWxzb2NrOwotCX0KLQotCXJldHVybiAwOwotCi0gY3JlYXRlX2RlbHNvY2s6Ci0Jc29ja19yZWxlYXNlKHNvY2spOwotCXNjdHBfY29uLnNvY2sgPSBOVUxMOwotIG91dDoKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSAqbmV3X3dyaXRlcXVldWVfZW50cnkoZ2ZwX3QgYWxsb2NhdGlvbikKLXsKLQlzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSAqZW50cnk7Ci0KLQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5KSwgYWxsb2NhdGlvbik7Ci0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQllbnRyeS0+cGFnZSA9IGFsbG9jX3BhZ2UoYWxsb2NhdGlvbik7Ci0JaWYgKCFlbnRyeS0+cGFnZSkgewotCQlrZnJlZShlbnRyeSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWVudHJ5LT5vZmZzZXQgPSAwOwotCWVudHJ5LT5sZW4gPSAwOwotCWVudHJ5LT5lbmQgPSAwOwotCWVudHJ5LT51c2VycyA9IDA7Ci0KLQlyZXR1cm4gZW50cnk7Ci19Ci0KLXZvaWQgKmRsbV9sb3djb21tc19nZXRfYnVmZmVyKGludCBub2RlaWQsIGludCBsZW4sIGdmcF90IGFsbG9jYXRpb24sIGNoYXIgKipwcGMpCi17Ci0Jc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmU7Ci0JaW50IG9mZnNldCA9IDA7Ci0JaW50IHVzZXJzID0gMDsKLQlzdHJ1Y3Qgbm9kZWluZm8gKm5pOwotCi0JaWYgKCFhdG9taWNfcmVhZCgmYWNjZXB0aW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQluaSA9IG5vZGVpZDJub2RlaW5mbyhub2RlaWQsIGFsbG9jYXRpb24pOwotCWlmICghbmkpCi0JCXJldHVybiBOVUxMOwotCi0Jc3Bpbl9sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKLQllID0gbGlzdF9lbnRyeShuaS0+d3JpdGVxdWV1ZS5wcmV2LCBzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSwgbGlzdCk7Ci0JaWYgKCgoc3RydWN0IGxpc3RfaGVhZCAqKSBlID09ICZuaS0+d3JpdGVxdWV1ZSkgfHwKLQkgICAgKFBBR0VfQ0FDSEVfU0laRSAtIGUtPmVuZCA8IGxlbikpIHsKLQkJZSA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJb2Zmc2V0ID0gZS0+ZW5kOwotCQllLT5lbmQgKz0gbGVuOwotCQl1c2VycyA9IGUtPnVzZXJzKys7Ci0JfQotCXNwaW5fdW5sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKLQotCWlmIChlKSB7Ci0JICAgICAgZ290X29uZToKLQkJaWYgKHVzZXJzID09IDApCi0JCQlrbWFwKGUtPnBhZ2UpOwotCQkqcHBjID0gcGFnZV9hZGRyZXNzKGUtPnBhZ2UpICsgb2Zmc2V0OwotCQlyZXR1cm4gZTsKLQl9Ci0KLQllID0gbmV3X3dyaXRlcXVldWVfZW50cnkoYWxsb2NhdGlvbik7Ci0JaWYgKGUpIHsKLQkJc3Bpbl9sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKLQkJb2Zmc2V0ID0gZS0+ZW5kOwotCQllLT5lbmQgKz0gbGVuOwotCQllLT5uaSA9IG5pOwotCQl1c2VycyA9IGUtPnVzZXJzKys7Ci0JCWxpc3RfYWRkX3RhaWwoJmUtPmxpc3QsICZuaS0+d3JpdGVxdWV1ZSk7Ci0JCXNwaW5fdW5sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKLQkJZ290byBnb3Rfb25lOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBkbG1fbG93Y29tbXNfY29tbWl0X2J1ZmZlcih2b2lkICphcmcpCi17Ci0Jc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmUgPSAoc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKikgYXJnOwotCWludCB1c2VyczsKLQlzdHJ1Y3Qgbm9kZWluZm8gKm5pID0gZS0+bmk7Ci0KLQlpZiAoIWF0b21pY19yZWFkKCZhY2NlcHRpbmcpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOwotCXVzZXJzID0gLS1lLT51c2VyczsKLQlpZiAodXNlcnMpCi0JCWdvdG8gb3V0OwotCWUtPmxlbiA9IGUtPmVuZCAtIGUtPm9mZnNldDsKLQlrdW5tYXAoZS0+cGFnZSk7Ci0Jc3Bpbl91bmxvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOwotCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE5JX1dSSVRFX1BFTkRJTkcsICZuaS0+ZmxhZ3MpKSB7Ci0JCXNwaW5fbG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJm5pLT53cml0ZV9saXN0LCAmd3JpdGVfbm9kZXMpOwotCQlzcGluX3VubG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7Ci0JCXdha2VfdXBfcHJvY2VzcyhzZW5kX3Rhc2spOwotCX0KLQlyZXR1cm47Ci0KLSAgICAgIG91dDoKLQlzcGluX3VubG9jaygmbmktPndyaXRlcXVldWVfbG9jayk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2VudHJ5KHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICplKQotewotCV9fZnJlZV9wYWdlKGUtPnBhZ2UpOwotCWtmcmVlKGUpOwotfQotCi0vKiBJbml0aWF0ZSBhbiBTQ1RQIGFzc29jaWF0aW9uLiBJbiB0aGVvcnkgd2UgY291bGQganVzdCB1c2Ugc2VuZG1zZygpIG9uCi0gICB0aGUgZmlyc3QgSVAgYWRkcmVzcyBhbmQgaXQgc2hvdWxkIHdvcmssIGJ1dCB0aGlzIGFsbG93cyB1cyB0byBzZXQgdXAgdGhlCi0gICBhc3NvY2lhdGlvbiBiZWZvcmUgc2VuZGluZyBhbnkgdmFsdWFibGUgZGF0YSB0aGF0IHdlIGNhbid0IGFmZm9yZCB0byBsb3NlLgotICAgSXQgYWxzbyBrZWVwcyB0aGUgc2VuZCBwYXRoIGNsZWFuIGFzIGl0IGNhbiBub3cgYWx3YXlzIHVzZSB0aGUgYXNzb2NpYXRpb24gSUQgKi8KLXN0YXRpYyB2b2lkIGluaXRpYXRlX2Fzc29jaWF0aW9uKGludCBub2RlaWQpCi17Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcmVtX2FkZHI7Ci0Jc3RhdGljIGNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOwotCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKLQlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKLQlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKLQlpbnQgcmV0OwotCWludCBhZGRybGVuOwotCWNoYXIgYnVmWzFdOwotCXN0cnVjdCBrdmVjIGlvdlsxXTsKLQlzdHJ1Y3Qgbm9kZWluZm8gKm5pOwotCi0JbG9nX3ByaW50KCJJbml0aWF0aW5nIGFzc29jaWF0aW9uIHdpdGggbm9kZSAlZCIsIG5vZGVpZCk7Ci0KLQluaSA9IG5vZGVpZDJub2RlaW5mbyhub2RlaWQsIEdGUF9LRVJORUwpOwotCWlmICghbmkpCi0JCXJldHVybjsKLQotCWlmIChub2RlaWRfdG9fYWRkcihub2RlaWQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtX2FkZHIpKSB7Ci0JCWxvZ19wcmludCgibm8gYWRkcmVzcyBmb3Igbm9kZWlkICVkIiwgbm9kZWlkKTsKLQkJcmV0dXJuOwotCX0KLQotCW1ha2Vfc29ja2FkZHIoJnJlbV9hZGRyLCBkbG1fY29uZmlnLnRjcF9wb3J0LCAmYWRkcmxlbik7Ci0KLQlvdXRtZXNzYWdlLm1zZ19uYW1lID0gJnJlbV9hZGRyOwotCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBhZGRybGVuOwotCW91dG1lc3NhZ2UubXNnX2NvbnRyb2wgPSBvdXRjbXNnOwotCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7Ci0Jb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSBNU0dfRU9SOwotCi0JaW92WzBdLmlvdl9iYXNlID0gYnVmOwotCWlvdlswXS5pb3ZfbGVuID0gMTsKLQotCS8qIFJlYWwgSU5JVCBtZXNzYWdlcyBzZWVtIHRvIGNhdXNlIHRyb3VibGUuIEp1c3Qgc2VuZCBhIDEgYnl0ZSBtZXNzYWdlCi0JICAgd2UgY2FuIGFmZm9yZCB0byBsb3NlICovCi0JY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOwotCWNtc2ctPmNtc2dfbGV2ZWwgPSBJUFBST1RPX1NDVFA7Ci0JY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7Ci0JY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOwotCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7Ci0JbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOwotCXNpbmZvLT5zaW5mb19wcGlkID0gY3B1X3RvX2xlMzIoZGxtX2xvY2FsX25vZGVpZCk7Ci0KLQlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47Ci0JcmV0ID0ga2VybmVsX3NlbmRtc2coc2N0cF9jb24uc29jaywgJm91dG1lc3NhZ2UsIGlvdiwgMSwgMSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJbG9nX3ByaW50KCJzZW5kIElOSVQgdG8gbm9kZSBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJLyogVHJ5IGFnYWluIGxhdGVyICovCi0JCWNsZWFyX2JpdChOSV9JTklUX1BFTkRJTkcsICZuaS0+ZmxhZ3MpOwotCX0KLX0KLQotLyogU2VuZCBhIG1lc3NhZ2UgKi8KLXN0YXRpYyBpbnQgc2VuZF90b19zb2NrKHN0cnVjdCBub2RlaW5mbyAqbmkpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmU7Ci0JaW50IGxlbiwgb2Zmc2V0OwotCXN0cnVjdCBtc2doZHIgb3V0bXNnOwotCXN0YXRpYyBjaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKLQlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKLQlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKLQlzdHJ1Y3Qga3ZlYyBpb3Y7Ci0KLSAgICAgICAgLyogU2VlIGlmIHdlIG5lZWQgdG8gaW5pdCBhbiBhc3NvY2lhdGlvbiBiZWZvcmUgd2Ugc3RhcnQKLQkgICBzZW5kaW5nIHByZWNpb3VzIG1lc3NhZ2VzICovCi0Jc3Bpbl9sb2NrKCZuaS0+bG9jayk7Ci0JaWYgKCFuaS0+YXNzb2NfaWQgJiYgIXRlc3RfYW5kX3NldF9iaXQoTklfSU5JVF9QRU5ESU5HLCAmbmktPmZsYWdzKSkgewotCQlzcGluX3VubG9jaygmbmktPmxvY2spOwotCQlpbml0aWF0ZV9hc3NvY2lhdGlvbihuaS0+bm9kZWlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNwaW5fdW5sb2NrKCZuaS0+bG9jayk7Ci0KLQlvdXRtc2cubXNnX25hbWUgPSBOVUxMOyAvKiBXZSB1c2UgYXNzb2NfaWQgKi8KLQlvdXRtc2cubXNnX25hbWVsZW4gPSAwOwotCW91dG1zZy5tc2dfY29udHJvbCA9IG91dGNtc2c7Ci0Jb3V0bXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOwotCW91dG1zZy5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQgfCBNU0dfTk9TSUdOQUwgfCBNU0dfRU9SOwotCi0JY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1zZyk7Ci0JY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKLQljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKLQljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7Ci0Jc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKLQltZW1zZXQoc2luZm8sIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7Ci0Jc2luZm8tPnNpbmZvX3BwaWQgPSBjcHVfdG9fbGUzMihkbG1fbG9jYWxfbm9kZWlkKTsKLQlzaW5mby0+c2luZm9fYXNzb2NfaWQgPSBuaS0+YXNzb2NfaWQ7Ci0Jb3V0bXNnLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47Ci0KLQlzcGluX2xvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOwotCWZvciAoOzspIHsKLQkJaWYgKGxpc3RfZW1wdHkoJm5pLT53cml0ZXF1ZXVlKSkKLQkJCWJyZWFrOwotCQllID0gbGlzdF9lbnRyeShuaS0+d3JpdGVxdWV1ZS5uZXh0LCBzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSwKLQkJCSAgICAgICBsaXN0KTsKLQkJbGVuID0gZS0+bGVuOwotCQlvZmZzZXQgPSBlLT5vZmZzZXQ7Ci0JCUJVR19PTihsZW4gPT0gMCAmJiBlLT51c2VycyA9PSAwKTsKLQkJc3Bpbl91bmxvY2soJm5pLT53cml0ZXF1ZXVlX2xvY2spOwotCQlrbWFwKGUtPnBhZ2UpOwotCi0JCXJldCA9IDA7Ci0JCWlmIChsZW4pIHsKLQkJCWlvdi5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhlLT5wYWdlKStvZmZzZXQ7Ci0JCQlpb3YuaW92X2xlbiA9IGxlbjsKLQotCQkJcmV0ID0ga2VybmVsX3NlbmRtc2coc2N0cF9jb24uc29jaywgJm91dG1zZywgJmlvdiwgMSwKLQkJCQkJICAgICBsZW4pOwotCQkJaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQkJc2N0cF9jb24uZWFnYWluX2ZsYWcgPSAxOwotCQkJCWdvdG8gb3V0OwotCQkJfSBlbHNlIGlmIChyZXQgPCAwKQotCQkJCWdvdG8gc2VuZF9lcnJvcjsKLQkJfSBlbHNlIHsKLQkJCS8qIERvbid0IHN0YXJ2ZSBwZW9wbGUgZmlsbGluZyBidWZmZXJzICovCi0JCQlzY2hlZHVsZSgpOwotCQl9Ci0KLQkJc3Bpbl9sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKLQkJZS0+b2Zmc2V0ICs9IHJldDsKLQkJZS0+bGVuIC09IHJldDsKLQotCQlpZiAoZS0+bGVuID09IDAgJiYgZS0+dXNlcnMgPT0gMCkgewotCQkJbGlzdF9kZWwoJmUtPmxpc3QpOwotCQkJZnJlZV9lbnRyeShlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZuaS0+d3JpdGVxdWV1ZV9sb2NrKTsKLSBvdXQ6Ci0JcmV0dXJuIHJldDsKLQotIHNlbmRfZXJyb3I6Ci0JbG9nX3ByaW50KCJFcnJvciBzZW5kaW5nIHRvIG5vZGUgJWQgJWQiLCBuaS0+bm9kZWlkLCByZXQpOwotCXNwaW5fbG9jaygmbmktPmxvY2spOwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChOSV9JTklUX1BFTkRJTkcsICZuaS0+ZmxhZ3MpKSB7Ci0JCW5pLT5hc3NvY19pZCA9IDA7Ci0JCXNwaW5fdW5sb2NrKCZuaS0+bG9jayk7Ci0JCWluaXRpYXRlX2Fzc29jaWF0aW9uKG5pLT5ub2RlaWQpOwotCX0gZWxzZQotCQlzcGluX3VubG9jaygmbmktPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogVHJ5IHRvIHNlbmQgYW55IG1lc3NhZ2VzIHRoYXQgYXJlIHBlbmRpbmcgKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3Nfb3V0cHV0X3F1ZXVlKHZvaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0ZW1wOwotCi0Jc3Bpbl9sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJndyaXRlX25vZGVzKSB7Ci0JCXN0cnVjdCBub2RlaW5mbyAqbmkgPQotCQkgICAgbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgbm9kZWluZm8sIHdyaXRlX2xpc3QpOwotCQljbGVhcl9iaXQoTklfV1JJVEVfUEVORElORywgJm5pLT5mbGFncyk7Ci0JCWxpc3RfZGVsKCZuaS0+d3JpdGVfbGlzdCk7Ci0KLQkJc3Bpbl91bmxvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOwotCi0JCXNlbmRfdG9fc29jayhuaSk7Ci0JCXNwaW5fbG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKLX0KLQotLyogQ2FsbGVkIGFmdGVyIHdlJ3ZlIGhhZCAtRUFHQUlOIGFuZCBiZWVuIHdva2VuIHVwICovCi1zdGF0aWMgdm9pZCByZWZpbGxfd3JpdGVfcXVldWUodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaT0xOyBpPD1tYXhfbm9kZWlkOyBpKyspIHsKLQkJc3RydWN0IG5vZGVpbmZvICpuaSA9IG5vZGVpZDJub2RlaW5mbyhpLCAwKTsKLQotCQlpZiAobmkpIHsKLQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChOSV9XUklURV9QRU5ESU5HLCAmbmktPmZsYWdzKSkgewotCQkJCXNwaW5fbG9ja19iaCgmd3JpdGVfbm9kZXNfbG9jayk7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmbmktPndyaXRlX2xpc3QsICZ3cml0ZV9ub2Rlcyk7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjbGVhbl9vbmVfd3JpdGVxdWV1ZShzdHJ1Y3Qgbm9kZWluZm8gKm5pKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdGVtcDsKLQotCXNwaW5fbG9jaygmbmktPndyaXRlcXVldWVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZuaS0+d3JpdGVxdWV1ZSkgewotCQlzdHJ1Y3Qgd3JpdGVxdWV1ZV9lbnRyeSAqZSA9Ci0JCQlsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmUtPmxpc3QpOwotCQlmcmVlX2VudHJ5KGUpOwotCX0KLQlzcGluX3VubG9jaygmbmktPndyaXRlcXVldWVfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFuX3dyaXRlcXVldWVzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGk9MTsgaTw9bWF4X25vZGVpZDsgaSsrKSB7Ci0JCXN0cnVjdCBub2RlaW5mbyAqbmkgPSBub2RlaWQybm9kZWluZm8oaSwgMCk7Ci0JCWlmIChuaSkKLQkJCWNsZWFuX29uZV93cml0ZXF1ZXVlKG5pKTsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgZGVhbGxvY19ub2RlaW5mbyh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpPTE7IGk8PW1heF9ub2RlaWQ7IGkrKykgewotCQlzdHJ1Y3Qgbm9kZWluZm8gKm5pID0gbm9kZWlkMm5vZGVpbmZvKGksIDApOwotCQlpZiAobmkpIHsKLQkJCWlkcl9yZW1vdmUoJm5vZGVpbmZvX2lkciwgaSk7Ci0JCQlrZnJlZShuaSk7Ci0JCX0KLQl9Ci19Ci0KLWludCBkbG1fbG93Y29tbXNfY2xvc2UoaW50IG5vZGVpZCkKLXsKLQlzdHJ1Y3Qgbm9kZWluZm8gKm5pOwotCi0JbmkgPSBub2RlaWQybm9kZWluZm8obm9kZWlkLCAwKTsKLQlpZiAoIW5pKQotCQlyZXR1cm4gLTE7Ci0KLQlzcGluX2xvY2soJm5pLT5sb2NrKTsKLQlpZiAobmktPmFzc29jX2lkKSB7Ci0JCW5pLT5hc3NvY19pZCA9IDA7Ci0JCS8qIERvbid0IHNlbmQgc2h1dGRvd24gaGVyZSwgc2N0cCB3aWxsIGp1c3QgcXVldWUgaXQKLQkJICAgdGlsbCB0aGUgbm9kZSBjb21lcyBiYWNrIHVwISAqLwotCX0KLQlzcGluX3VubG9jaygmbmktPmxvY2spOwotCi0JY2xlYW5fb25lX3dyaXRlcXVldWUobmkpOwotCWNsZWFyX2JpdChOSV9JTklUX1BFTkRJTkcsICZuaS0+ZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdyaXRlX2xpc3RfZW1wdHkodm9pZCkKLXsKLQlpbnQgc3RhdHVzOwotCi0Jc3Bpbl9sb2NrX2JoKCZ3cml0ZV9ub2Rlc19sb2NrKTsKLQlzdGF0dXMgPSBsaXN0X2VtcHR5KCZ3cml0ZV9ub2Rlcyk7Ci0Jc3Bpbl91bmxvY2tfYmgoJndyaXRlX25vZGVzX2xvY2spOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBkbG1fcmVjdmQodm9pZCAqZGF0YSkKLXsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJYWRkX3dhaXRfcXVldWUoJmxvd2NvbW1zX3JlY3Zfd2FpdCwgJndhaXQpOwotCQlpZiAoIXRlc3RfYml0KENGX1JFQURfUEVORElORywgJnNjdHBfY29uLmZsYWdzKSkKLQkJCXNjaGVkdWxlKCk7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZsb3djb21tc19yZWN2X3dhaXQsICZ3YWl0KTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENGX1JFQURfUEVORElORywgJnNjdHBfY29uLmZsYWdzKSkgewotCQkJaW50IHJldDsKLQotCQkJZG8gewotCQkJCXJldCA9IHJlY2VpdmVfZnJvbV9zb2NrKCk7Ci0KLQkJCQkvKiBEb24ndCBzdGFydmUgb3V0IGV2ZXJ5b25lIGVsc2UgKi8KLQkJCQlpZiAoKytjb3VudCA+PSBNQVhfUlhfTVNHX0NPVU5UKSB7Ci0JCQkJCXNjaGVkdWxlKCk7Ci0JCQkJCWNvdW50ID0gMDsKLQkJCQl9Ci0JCQl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIHJldCA+PTApOwotCQl9Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGxtX3NlbmRkKHZvaWQgKmRhdGEpCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0KLQlhZGRfd2FpdF9xdWV1ZShzY3RwX2Nvbi5zb2NrLT5zay0+c2tfc2xlZXAsICZ3YWl0KTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmICh3cml0ZV9saXN0X2VtcHR5KCkpCi0JCQlzY2hlZHVsZSgpOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JCWlmIChzY3RwX2Nvbi5lYWdhaW5fZmxhZykgewotCQkJc2N0cF9jb24uZWFnYWluX2ZsYWcgPSAwOwotCQkJcmVmaWxsX3dyaXRlX3F1ZXVlKCk7Ci0JCX0KLQkJcHJvY2Vzc19vdXRwdXRfcXVldWUoKTsKLQl9Ci0KLQlyZW1vdmVfd2FpdF9xdWV1ZShzY3RwX2Nvbi5zb2NrLT5zay0+c2tfc2xlZXAsICZ3YWl0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkYWVtb25zX3N0b3Aodm9pZCkKLXsKLQlrdGhyZWFkX3N0b3AocmVjdl90YXNrKTsKLQlrdGhyZWFkX3N0b3Aoc2VuZF90YXNrKTsKLX0KLQotc3RhdGljIGludCBkYWVtb25zX3N0YXJ0KHZvaWQpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCWludCBlcnJvcjsKLQotCXAgPSBrdGhyZWFkX3J1bihkbG1fcmVjdmQsIE5VTEwsICJkbG1fcmVjdmQiKTsKLQllcnJvciA9IElTX0VSUihwKTsKLSAgICAgICAJaWYgKGVycm9yKSB7Ci0JCWxvZ19wcmludCgiY2FuJ3Qgc3RhcnQgZGxtX3JlY3ZkICVkIiwgZXJyb3IpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCXJlY3ZfdGFzayA9IHA7Ci0KLQlwID0ga3RocmVhZF9ydW4oZGxtX3NlbmRkLCBOVUxMLCAiZGxtX3NlbmRkIik7Ci0JZXJyb3IgPSBJU19FUlIocCk7Ci0gICAgICAgCWlmIChlcnJvcikgewotCQlsb2dfcHJpbnQoImNhbid0IHN0YXJ0IGRsbV9zZW5kZCAlZCIsIGVycm9yKTsKLQkJa3RocmVhZF9zdG9wKHJlY3ZfdGFzayk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0Jc2VuZF90YXNrID0gcDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVGhpcyBpcyBxdWl0ZSBsaWtlbHkgdG8gc2xlZXAuLi4KLSAqLwotaW50IGRsbV9sb3djb21tc19zdGFydCh2b2lkKQotewotCWludCBlcnJvcjsKLQotCWVycm9yID0gaW5pdF9zb2NrKCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGZhaWxfc29jazsKLQllcnJvciA9IGRhZW1vbnNfc3RhcnQoKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gZmFpbF9zb2NrOwotCWF0b21pY19zZXQoJmFjY2VwdGluZywgMSk7Ci0JcmV0dXJuIDA7Ci0KLSBmYWlsX3NvY2s6Ci0JY2xvc2VfY29ubmVjdGlvbigpOwotCXJldHVybiBlcnJvcjsKLX0KLQotLyogU2V0IGFsbCB0aGUgYWN0aXZpdHkgZmxhZ3MgdG8gcHJldmVudCBhbnkgc29ja2V0IGFjdGl2aXR5LiAqLwotCi12b2lkIGRsbV9sb3djb21tc19zdG9wKHZvaWQpCi17Ci0JYXRvbWljX3NldCgmYWNjZXB0aW5nLCAwKTsKLQlzY3RwX2Nvbi5mbGFncyA9IDB4NzsKLQlkYWVtb25zX3N0b3AoKTsKLQljbGVhbl93cml0ZXF1ZXVlcygpOwotCWNsb3NlX2Nvbm5lY3Rpb24oKTsKLQlkZWFsbG9jX25vZGVpbmZvKCk7Ci0JbWF4X25vZGVpZCA9IDA7Ci19Ci0KLWludCBkbG1fbG93Y29tbXNfaW5pdCh2b2lkKQotewotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxvd2NvbW1zX3JlY3Zfd2FpdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJndyaXRlX25vZGVzX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZ3cml0ZV9ub2Rlcyk7Ci0JaW5pdF9yd3NlbSgmbm9kZWluZm9fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZGxtX2xvd2NvbW1zX2V4aXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBkbG1fbG9jYWxfY291bnQ7IGkrKykKLQkJa2ZyZWUoZGxtX2xvY2FsX2FkZHJbaV0pOwotCWRsbV9sb2NhbF9jb3VudCA9IDA7Ci0JZGxtX2xvY2FsX25vZGVpZCA9IDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb3djb21tcy5oIGIvZnMvZGxtL2xvd2NvbW1zLmgKaW5kZXggMmQwNDVlMC4uYTlhOTYxOCAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvd2NvbW1zLmgKKysrIGIvZnMvZGxtL2xvd2NvbW1zLmgKQEAgLTE0LDggKzE0LDYgQEAKICNpZm5kZWYgX19MT1dDT01NU19ET1RfSF9fCiAjZGVmaW5lIF9fTE9XQ09NTVNfRE9UX0hfXwogCi1pbnQgZGxtX2xvd2NvbW1zX2luaXQodm9pZCk7Ci12b2lkIGRsbV9sb3djb21tc19leGl0KHZvaWQpOwogaW50IGRsbV9sb3djb21tc19zdGFydCh2b2lkKTsKIHZvaWQgZGxtX2xvd2NvbW1zX3N0b3Aodm9pZCk7CiBpbnQgZGxtX2xvd2NvbW1zX2Nsb3NlKGludCBub2RlaWQpOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL21haW4uYyBiL2ZzL2RsbS9tYWluLmMKaW5kZXggYThkYThkYy4uMTYyZmJhZSAxMDA2NDQKLS0tIGEvZnMvZGxtL21haW4uYworKysgYi9mcy9kbG0vbWFpbi5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSAibG9jay5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJtZW1vcnkuaCIKLSNpbmNsdWRlICJsb3djb21tcy5oIgogI2luY2x1ZGUgImNvbmZpZy5oIgogCiAjaWZkZWYgQ09ORklHX0RMTV9ERUJVRwpAQCAtNDcsMjAgKzQ2LDE0IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9jb25maWc7CiAKLQllcnJvciA9IGRsbV9sb3djb21tc19pbml0KCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9kZWJ1ZzsKLQogCWVycm9yID0gZGxtX3VzZXJfaW5pdCgpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXRfbG93Y29tbXM7CisJCWdvdG8gb3V0X2RlYnVnOwogCiAJcHJpbnRrKCJETE0gKGJ1aWx0ICVzICVzKSBpbnN0YWxsZWRcbiIsIF9fREFURV9fLCBfX1RJTUVfXyk7CiAKIAlyZXR1cm4gMDsKIAotIG91dF9sb3djb21tczoKLQlkbG1fbG93Y29tbXNfZXhpdCgpOwogIG91dF9kZWJ1ZzoKIAlkbG1fdW5yZWdpc3Rlcl9kZWJ1Z2ZzKCk7CiAgb3V0X2NvbmZpZzoKQEAgLTc2LDcgKzY5LDYgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2RsbSh2b2lkKQogewogCWRsbV91c2VyX2V4aXQoKTsKLQlkbG1fbG93Y29tbXNfZXhpdCgpOwogCWRsbV9jb25maWdfZXhpdCgpOwogCWRsbV9tZW1vcnlfZXhpdCgpOwogCWRsbV9sb2Nrc3BhY2VfZXhpdCgpOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL21lbWJlci5jIGIvZnMvZGxtL21lbWJlci5jCmluZGV4IGEzZjdkZTcuLjg1ZTI4OTcgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9tZW1iZXIuYworKysgYi9mcy9kbG0vbWVtYmVyLmMKQEAgLTE4Niw2ICsxODYsMTQgQEAKIAlzdHJ1Y3QgZGxtX21lbWJlciAqbWVtYiwgKnNhZmU7CiAJaW50IGksIGVycm9yLCBmb3VuZCwgcG9zID0gMCwgbmVnID0gMCwgbG93ID0gLTE7CiAKKwkvKiBwcmV2aW91c2x5IHJlbW92ZWQgbWVtYmVycyB0aGF0IHdlJ3ZlIG5vdCBmaW5pc2hlZCByZW1vdmluZyBuZWVkIHRvCisJICAgY291bnQgYXMgYSBuZWdhdGl2ZSBjaGFuZ2Ugc28gdGhlICJuZWciIHJlY292ZXJ5IHN0ZXBzIHdpbGwgaGFwcGVuICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1lbWIsICZscy0+bHNfbm9kZXNfZ29uZSwgbGlzdCkgeworCQlsb2dfZGVidWcobHMsICJwcmV2IHJlbW92ZWQgbWVtYmVyICVkIiwgbWVtYi0+bm9kZWlkKTsKKwkJbmVnKys7CisJfQorCiAJLyogbW92ZSBkZXBhcnRlZCBtZW1iZXJzIGZyb20gbHNfbm9kZXMgdG8gbHNfbm9kZXNfZ29uZSAqLwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1lbWIsIHNhZmUsICZscy0+bHNfbm9kZXMsIGxpc3QpIHsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9tZW1vcnkuYyBiL2ZzL2RsbS9tZW1vcnkuYwppbmRleCA5ODliNjA4Li41MzUyYjAzIDEwMDY0NAotLS0gYS9mcy9kbG0vbWVtb3J5LmMKKysrIGIvZnMvZGxtL21lbW9yeS5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAibWVtb3J5LmgiCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmxrYl9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbGtiX2NhY2hlOwogCiAKIGludCBkbG1fbWVtb3J5X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2ZzL2RsbS9yY29tLmMgYi9mcy9kbG0vcmNvbS5jCmluZGV4IDUxODIzOWEuLjRjYzMxYmUgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9yY29tLmMKKysrIGIvZnMvZGxtL3Jjb20uYwpAQCAtOTAsMTMgKzkwLDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGFsbG93X3N5bmNfcmVwbHkoc3RydWN0IGRsbV9scyAqbHMsIHVpbnQ2NF90ICpuZXdfc2VxKQoreworCXNwaW5fbG9jaygmbHMtPmxzX3Jjb21fc3Bpbik7CisJKm5ld19zZXEgPSArK2xzLT5sc19yY29tX3NlcTsKKwlzZXRfYml0KExTRkxfUkNPTV9XQUlULCAmbHMtPmxzX2ZsYWdzKTsKKwlzcGluX3VubG9jaygmbHMtPmxzX3Jjb21fc3Bpbik7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FsbG93X3N5bmNfcmVwbHkoc3RydWN0IGRsbV9scyAqbHMpCit7CisJc3Bpbl9sb2NrKCZscy0+bHNfcmNvbV9zcGluKTsKKwljbGVhcl9iaXQoTFNGTF9SQ09NX1dBSVQsICZscy0+bHNfZmxhZ3MpOworCWNsZWFyX2JpdChMU0ZMX1JDT01fUkVBRFksICZscy0+bHNfZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZscy0+bHNfcmNvbV9zcGluKTsKK30KKwogaW50IGRsbV9yY29tX3N0YXR1cyhzdHJ1Y3QgZGxtX2xzICpscywgaW50IG5vZGVpZCkKIHsKIAlzdHJ1Y3QgZGxtX3Jjb20gKnJjOwogCXN0cnVjdCBkbG1fbWhhbmRsZSAqbWg7CiAJaW50IGVycm9yID0gMDsKIAotCW1lbXNldChscy0+bHNfcmVjb3Zlcl9idWYsIDAsIGRsbV9jb25maWcuYnVmZmVyX3NpemUpOwogCWxzLT5sc19yZWNvdmVyX25vZGVpZCA9IG5vZGVpZDsKIAogCWlmIChub2RlaWQgPT0gZGxtX291cl9ub2RlaWQoKSkgewpAQCAtMTA4LDEyICsxMjMsMTQgQEAKIAllcnJvciA9IGNyZWF0ZV9yY29tKGxzLCBub2RlaWQsIERMTV9SQ09NX1NUQVRVUywgMCwgJnJjLCAmbWgpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7Ci0JcmMtPnJjX2lkID0gKytscy0+bHNfcmNvbV9zZXE7CisKKwlhbGxvd19zeW5jX3JlcGx5KGxzLCAmcmMtPnJjX2lkKTsKKwltZW1zZXQobHMtPmxzX3JlY292ZXJfYnVmLCAwLCBkbG1fY29uZmlnLmJ1ZmZlcl9zaXplKTsKIAogCXNlbmRfcmNvbShscywgbWgsIHJjKTsKIAogCWVycm9yID0gZGxtX3dhaXRfZnVuY3Rpb24obHMsICZyY29tX3Jlc3BvbnNlKTsKLQljbGVhcl9iaXQoTFNGTF9SQ09NX1JFQURZLCAmbHMtPmxzX2ZsYWdzKTsKKwlkaXNhbGxvd19zeW5jX3JlcGx5KGxzKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCkBAIC0xNTAsMTQgKzE2NywyMSBAQAogCiBzdGF0aWMgdm9pZCByZWNlaXZlX3N5bmNfcmVwbHkoc3RydWN0IGRsbV9scyAqbHMsIHN0cnVjdCBkbG1fcmNvbSAqcmNfaW4pCiB7Ci0JaWYgKHJjX2luLT5yY19pZCAhPSBscy0+bHNfcmNvbV9zZXEpIHsKLQkJbG9nX2RlYnVnKGxzLCAicmVqZWN0IG9sZCByZXBseSAlZCBnb3QgJWxseCB3YW50ZWQgJWxseCIsCi0JCQkgIHJjX2luLT5yY190eXBlLCByY19pbi0+cmNfaWQsIGxzLT5sc19yY29tX3NlcSk7Ci0JCXJldHVybjsKKwlzcGluX2xvY2soJmxzLT5sc19yY29tX3NwaW4pOworCWlmICghdGVzdF9iaXQoTFNGTF9SQ09NX1dBSVQsICZscy0+bHNfZmxhZ3MpIHx8CisJICAgIHJjX2luLT5yY19pZCAhPSBscy0+bHNfcmNvbV9zZXEpIHsKKwkJbG9nX2RlYnVnKGxzLCAicmVqZWN0IHJlcGx5ICVkIGZyb20gJWQgc2VxICVsbHggZXhwZWN0ICVsbHgiLAorCQkJICByY19pbi0+cmNfdHlwZSwgcmNfaW4tPnJjX2hlYWRlci5oX25vZGVpZCwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylyY19pbi0+cmNfaWQsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpbHMtPmxzX3Jjb21fc2VxKTsKKwkJZ290byBvdXQ7CiAJfQogCW1lbWNweShscy0+bHNfcmVjb3Zlcl9idWYsIHJjX2luLCByY19pbi0+cmNfaGVhZGVyLmhfbGVuZ3RoKTsKIAlzZXRfYml0KExTRkxfUkNPTV9SRUFEWSwgJmxzLT5sc19mbGFncyk7CisJY2xlYXJfYml0KExTRkxfUkNPTV9XQUlULCAmbHMtPmxzX2ZsYWdzKTsKIAl3YWtlX3VwKCZscy0+bHNfd2FpdF9nZW5lcmFsKTsKKyBvdXQ6CisJc3Bpbl91bmxvY2soJmxzLT5sc19yY29tX3NwaW4pOwogfQogCiBzdGF0aWMgdm9pZCByZWNlaXZlX3Jjb21fc3RhdHVzX3JlcGx5KHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX3Jjb20gKnJjX2luKQpAQCAtMTcxLDcgKzE5NSw2IEBACiAJc3RydWN0IGRsbV9taGFuZGxlICptaDsKIAlpbnQgZXJyb3IgPSAwLCBsZW4gPSBzaXplb2Yoc3RydWN0IGRsbV9yY29tKTsKIAotCW1lbXNldChscy0+bHNfcmVjb3Zlcl9idWYsIDAsIGRsbV9jb25maWcuYnVmZmVyX3NpemUpOwogCWxzLT5sc19yZWNvdmVyX25vZGVpZCA9IG5vZGVpZDsKIAogCWlmIChub2RlaWQgPT0gZGxtX291cl9ub2RlaWQoKSkgewpAQCAtMTg1LDEyICsyMDgsMTQgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCW1lbWNweShyYy0+cmNfYnVmLCBsYXN0X25hbWUsIGxhc3RfbGVuKTsKLQlyYy0+cmNfaWQgPSArK2xzLT5sc19yY29tX3NlcTsKKworCWFsbG93X3N5bmNfcmVwbHkobHMsICZyYy0+cmNfaWQpOworCW1lbXNldChscy0+bHNfcmVjb3Zlcl9idWYsIDAsIGRsbV9jb25maWcuYnVmZmVyX3NpemUpOwogCiAJc2VuZF9yY29tKGxzLCBtaCwgcmMpOwogCiAJZXJyb3IgPSBkbG1fd2FpdF9mdW5jdGlvbihscywgJnJjb21fcmVzcG9uc2UpOwotCWNsZWFyX2JpdChMU0ZMX1JDT01fUkVBRFksICZscy0+bHNfZmxhZ3MpOworCWRpc2FsbG93X3N5bmNfcmVwbHkobHMpOwogIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0zNzAsOSArMzk1LDEwIEBACiBzdGF0aWMgaW50IHNlbmRfbHNfbm90X3JlYWR5KGludCBub2RlaWQsIHN0cnVjdCBkbG1fcmNvbSAqcmNfaW4pCiB7CiAJc3RydWN0IGRsbV9yY29tICpyYzsKKwlzdHJ1Y3QgcmNvbV9jb25maWcgKnJmOwogCXN0cnVjdCBkbG1fbWhhbmRsZSAqbWg7CiAJY2hhciAqbWI7Ci0JaW50IG1iX2xlbiA9IHNpemVvZihzdHJ1Y3QgZGxtX3Jjb20pOworCWludCBtYl9sZW4gPSBzaXplb2Yoc3RydWN0IGRsbV9yY29tKSArIHNpemVvZihzdHJ1Y3QgcmNvbV9jb25maWcpOwogCiAJbWggPSBkbG1fbG93Y29tbXNfZ2V0X2J1ZmZlcihub2RlaWQsIG1iX2xlbiwgR0ZQX0tFUk5FTCwgJm1iKTsKIAlpZiAoIW1oKQpAQCAtMzkxLDYgKzQxNyw5IEBACiAJcmMtPnJjX2lkID0gcmNfaW4tPnJjX2lkOwogCXJjLT5yY19yZXN1bHQgPSAtRVNSQ0g7CiAKKwlyZiA9IChzdHJ1Y3QgcmNvbV9jb25maWcgKikgcmMtPnJjX2J1ZjsKKwlyZi0+cmZfbHZibGVuID0gLTE7CisKIAlkbG1fcmNvbV9vdXQocmMpOwogCWRsbV9sb3djb21tc19jb21taXRfYnVmZmVyKG1oKTsKIApAQCAtNDEyLDkgKzQ0MSwxMCBAQAogCiAJbHMgPSBkbG1fZmluZF9sb2Nrc3BhY2VfZ2xvYmFsKGhkLT5oX2xvY2tzcGFjZSk7CiAJaWYgKCFscykgewotCQlsb2dfcHJpbnQoImxvY2tzcGFjZSAleCBmcm9tICVkIG5vdCBmb3VuZCIsCi0JCQkgIGhkLT5oX2xvY2tzcGFjZSwgbm9kZWlkKTsKLQkJc2VuZF9sc19ub3RfcmVhZHkobm9kZWlkLCByYyk7CisJCWxvZ19wcmludCgibG9ja3NwYWNlICV4IGZyb20gJWQgdHlwZSAleCBub3QgZm91bmQiLAorCQkJICBoZC0+aF9sb2Nrc3BhY2UsIG5vZGVpZCwgcmMtPnJjX3R5cGUpOworCQlpZiAocmMtPnJjX3R5cGUgPT0gRExNX1JDT01fU1RBVFVTKQorCQkJc2VuZF9sc19ub3RfcmVhZHkobm9kZWlkLCByYyk7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS9yZWNvdmVyLmMgYi9mcy9kbG0vcmVjb3Zlci5jCmluZGV4IGE1ZTZkMTguLmNmOWY2ODMgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9yZWNvdmVyLmMKKysrIGIvZnMvZGxtL3JlY292ZXIuYwpAQCAtMjUyLDYgKzI1Miw3IEBACiAJc3Bpbl9sb2NrKCZscy0+bHNfcmVjb3Zlcl9saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyLCBzLCAmbHMtPmxzX3JlY292ZXJfbGlzdCwgcmVzX3JlY292ZXJfbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZyLT5yZXNfcmVjb3Zlcl9saXN0KTsKKwkJci0+cmVzX3JlY292ZXJfbG9ja3NfY291bnQgPSAwOwogCQlkbG1fcHV0X3JzYihyKTsKIAkJbHMtPmxzX3JlY292ZXJfbGlzdF9jb3VudC0tOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2RsbS9yZWNvdmVyZC5jIGIvZnMvZGxtL3JlY292ZXJkLmMKaW5kZXggMzYyZTNlZi4uNjUwNTM2YWEgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9yZWNvdmVyZC5jCisrKyBiL2ZzL2RsbS9yZWNvdmVyZC5jCkBAIC00NSw3ICs0NSw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydDsKIAlpbnQgZXJyb3IsIG5lZyA9IDA7CiAKLQlsb2dfZGVidWcobHMsICJyZWNvdmVyICVsbHgiLCBydi0+c2VxKTsKKwlsb2dfZGVidWcobHMsICJyZWNvdmVyICVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKXJ2LT5zZXEpOwogCiAJbXV0ZXhfbG9jaygmbHMtPmxzX3JlY292ZXJkX2FjdGl2ZSk7CiAKQEAgLTk0LDE0ICs5NCw2IEBACiAJfQogCiAJLyoKLQkgKiBQdXJnZSBkaXJlY3RvcnktcmVsYXRlZCByZXF1ZXN0cyB0aGF0IGFyZSBzYXZlZCBpbiByZXF1ZXN0cXVldWUuCi0JICogQWxsIGRpciByZXF1ZXN0cyBmcm9tIGJlZm9yZSByZWNvdmVyeSBhcmUgaW52YWxpZCBub3cgZHVlIHRvIHRoZSBkaXIKLQkgKiByZWJ1aWxkIGFuZCB3aWxsIGJlIHJlc2VudCBieSB0aGUgcmVxdWVzdGluZyBub2Rlcy4KLQkgKi8KLQotCWRsbV9wdXJnZV9yZXF1ZXN0cXVldWUobHMpOwotCi0JLyoKIAkgKiBXYWl0IGZvciBhbGwgbm9kZXMgdG8gY29tcGxldGUgZGlyZWN0b3J5IHJlYnVpbGQuCiAJICovCiAKQEAgLTE2NCwxMCArMTU2LDMxIEBACiAJCSAqLwogCiAJCWRsbV9yZWNvdmVyX3JzYnMobHMpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE90aGVyIGxvY2tzcGFjZSBtZW1iZXJzIG1heSBiZSBnb2luZyB0aHJvdWdoIHRoZSAibmVnIiBzdGVwcworCQkgKiB3aGlsZSBhbHNvIGFkZGluZyB1cyB0byB0aGUgbG9ja3NwYWNlLCBpbiB3aGljaCBjYXNlIHRoZXknbGwKKwkJICogYmUgZG9pbmcgdGhlIHJlY292ZXJfbG9ja3MgKFJTX0xPQ0tTKSBiYXJyaWVyLgorCQkgKi8KKwkJZGxtX3NldF9yZWNvdmVyX3N0YXR1cyhscywgRExNX1JTX0xPQ0tTKTsKKworCQllcnJvciA9IGRsbV9yZWNvdmVyX2xvY2tzX3dhaXQobHMpOworCQlpZiAoZXJyb3IpIHsKKwkJCWxvZ19lcnJvcihscywgInJlY292ZXJfbG9ja3Nfd2FpdCBmYWlsZWQgJWQiLCBlcnJvcik7CisJCQlnb3RvIGZhaWw7CisJCX0KIAl9CiAKIAlkbG1fcmVsZWFzZV9yb290X2xpc3QobHMpOwogCisJLyoKKwkgKiBQdXJnZSBkaXJlY3RvcnktcmVsYXRlZCByZXF1ZXN0cyB0aGF0IGFyZSBzYXZlZCBpbiByZXF1ZXN0cXVldWUuCisJICogQWxsIGRpciByZXF1ZXN0cyBmcm9tIGJlZm9yZSByZWNvdmVyeSBhcmUgaW52YWxpZCBub3cgZHVlIHRvIHRoZSBkaXIKKwkgKiByZWJ1aWxkIGFuZCB3aWxsIGJlIHJlc2VudCBieSB0aGUgcmVxdWVzdGluZyBub2Rlcy4KKwkgKi8KKworCWRsbV9wdXJnZV9yZXF1ZXN0cXVldWUobHMpOworCiAJZGxtX3NldF9yZWNvdmVyX3N0YXR1cyhscywgRExNX1JTX0RPTkUpOwogCWVycm9yID0gZGxtX3JlY292ZXJfZG9uZV93YWl0KGxzKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTE5OSw3ICsyMTIsOCBAQAogCiAJZGxtX2FzdGRfd2FrZSgpOwogCi0JbG9nX2RlYnVnKGxzLCAicmVjb3ZlciAlbGx4IGRvbmU6ICV1IG1zIiwgcnYtPnNlcSwKKwlsb2dfZGVidWcobHMsICJyZWNvdmVyICVsbHggZG9uZTogJXUgbXMiLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpcnYtPnNlcSwKIAkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwogCW11dGV4X3VubG9jaygmbHMtPmxzX3JlY292ZXJkX2FjdGl2ZSk7CiAKQEAgLTIwNywxMSArMjIxLDE2IEBACiAKICBmYWlsOgogCWRsbV9yZWxlYXNlX3Jvb3RfbGlzdChscyk7Ci0JbG9nX2RlYnVnKGxzLCAicmVjb3ZlciAlbGx4IGVycm9yICVkIiwgcnYtPnNlcSwgZXJyb3IpOworCWxvZ19kZWJ1ZyhscywgInJlY292ZXIgJWxseCBlcnJvciAlZCIsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylydi0+c2VxLCBlcnJvcik7CiAJbXV0ZXhfdW5sb2NrKCZscy0+bHNfcmVjb3ZlcmRfYWN0aXZlKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qIFRoZSBkbG1fbHNfc3RhcnQoKSB0aGF0IGNyZWF0ZWQgdGhlIHJ2IHdlIHRha2UgaGVyZSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4KKyAgIHN0b3BwZWQgdmlhIGRsbV9sc19zdG9wKCk7IGluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBSRUNPVkVSWV9TVE9QCisgICBmbGFnIHNldC4gKi8KKwogc3RhdGljIHZvaWQgZG9fbHNfcmVjb3Zlcnkoc3RydWN0IGRsbV9scyAqbHMpCiB7CiAJc3RydWN0IGRsbV9yZWNvdmVyICpydiA9IE5VTEw7CkBAIC0yMTksNyArMjM4LDggQEAKIAlzcGluX2xvY2soJmxzLT5sc19yZWNvdmVyX2xvY2spOwogCXJ2ID0gbHMtPmxzX3JlY292ZXJfYXJnczsKIAlscy0+bHNfcmVjb3Zlcl9hcmdzID0gTlVMTDsKLQljbGVhcl9iaXQoTFNGTF9SRUNPVkVSWV9TVE9QLCAmbHMtPmxzX2ZsYWdzKTsKKwlpZiAocnYgJiYgbHMtPmxzX3JlY292ZXJfc2VxID09IHJ2LT5zZXEpCisJCWNsZWFyX2JpdChMU0ZMX1JFQ09WRVJZX1NUT1AsICZscy0+bHNfZmxhZ3MpOwogCXNwaW5fdW5sb2NrKCZscy0+bHNfcmVjb3Zlcl9sb2NrKTsKIAogCWlmIChydikgewpkaWZmIC0tZ2l0IGEvZnMvZGxtL3JlcXVlc3RxdWV1ZS5jIGIvZnMvZGxtL3JlcXVlc3RxdWV1ZS5jCmluZGV4IDdiMmIwODkuLjY1MDA4ZDcgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9yZXF1ZXN0cXVldWUuYworKysgYi9mcy9kbG0vcmVxdWVzdHF1ZXVlLmMKQEAgLTMwLDI2ICszMCwzNiBAQAogICogbG9ja3NwYWNlIGlzIGVuYWJsZWQgb24gc29tZSB3aGlsZSBzdGlsbCBzdXNwZW5kZWQgb24gb3RoZXJzLgogICovCiAKLXZvaWQgZGxtX2FkZF9yZXF1ZXN0cXVldWUoc3RydWN0IGRsbV9scyAqbHMsIGludCBub2RlaWQsIHN0cnVjdCBkbG1faGVhZGVyICpoZCkKK2ludCBkbG1fYWRkX3JlcXVlc3RxdWV1ZShzdHJ1Y3QgZGxtX2xzICpscywgaW50IG5vZGVpZCwgc3RydWN0IGRsbV9oZWFkZXIgKmhkKQogewogCXN0cnVjdCBycV9lbnRyeSAqZTsKIAlpbnQgbGVuZ3RoID0gaGQtPmhfbGVuZ3RoOwotCi0JaWYgKGRsbV9pc19yZW1vdmVkKGxzLCBub2RlaWQpKQotCQlyZXR1cm47CisJaW50IHJ2ID0gMDsKIAogCWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnFfZW50cnkpICsgbGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWUpIHsKIAkJbG9nX3ByaW50KCJkbG1fYWRkX3JlcXVlc3RxdWV1ZTogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCiAJZS0+bm9kZWlkID0gbm9kZWlkOwogCW1lbWNweShlLT5yZXF1ZXN0LCBoZCwgbGVuZ3RoKTsKIAorCS8qIFdlIG5lZWQgdG8gY2hlY2sgZGxtX2xvY2tpbmdfc3RvcHBlZCgpIGFmdGVyIHRha2luZyB0aGUgbXV0ZXggdG8KKwkgICBhdm9pZCBhIHJhY2Ugd2hlcmUgZGxtX3JlY292ZXJkIGVuYWJsZXMgbG9ja2luZyBhbmQgcnVucworCSAgIHByb2Nlc3NfcmVxdWVzdHF1ZXVlIGJldHdlZW4gb3VyIGVhcmxpZXIgZGxtX2xvY2tpbmdfc3RvcHBlZCBjaGVjaworCSAgIGFuZCB0aGlzIGFkZGl0aW9uIHRvIHRoZSByZXF1ZXN0cXVldWUuICovCisKIAltdXRleF9sb2NrKCZscy0+bHNfcmVxdWVzdHF1ZXVlX211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmbHMtPmxzX3JlcXVlc3RxdWV1ZSk7CisJaWYgKGRsbV9sb2NraW5nX3N0b3BwZWQobHMpKQorCQlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmbHMtPmxzX3JlcXVlc3RxdWV1ZSk7CisJZWxzZSB7CisJCWxvZ19kZWJ1ZyhscywgImRsbV9hZGRfcmVxdWVzdHF1ZXVlIHNraXAgZnJvbSAlZCIsIG5vZGVpZCk7CisJCWtmcmVlKGUpOworCQlydiA9IC1FQUdBSU47CisJfQogCW11dGV4X3VubG9jaygmbHMtPmxzX3JlcXVlc3RxdWV1ZV9tdXRleCk7CisJcmV0dXJuIHJ2OwogfQogCiBpbnQgZGxtX3Byb2Nlc3NfcmVxdWVzdHF1ZXVlKHN0cnVjdCBkbG1fbHMgKmxzKQpAQCAtMTIwLDYgKzEzMCwxMCBAQAogewogCXVpbnQzMl90IHR5cGUgPSBtcy0+bV90eXBlOwogCisJLyogdGhlIGxzIGlzIGJlaW5nIGNsZWFuZWQgdXAgYW5kIGZyZWVkIGJ5IHJlbGVhc2VfbG9ja3NwYWNlICovCisJaWYgKCFscy0+bHNfY291bnQpCisJCXJldHVybiAxOworCiAJaWYgKGRsbV9pc19yZW1vdmVkKGxzLCBub2RlaWQpKQogCQlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvZnMvZGxtL3JlcXVlc3RxdWV1ZS5oIGIvZnMvZGxtL3JlcXVlc3RxdWV1ZS5oCmluZGV4IDM0OWYwZDIuLjZhNTNlYTAgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9yZXF1ZXN0cXVldWUuaAorKysgYi9mcy9kbG0vcmVxdWVzdHF1ZXVlLmgKQEAgLTEzLDcgKzEzLDcgQEAKICNpZm5kZWYgX19SRVFVRVNUUVVFVUVfRE9UX0hfXwogI2RlZmluZSBfX1JFUVVFU1RRVUVVRV9ET1RfSF9fCiAKLXZvaWQgZGxtX2FkZF9yZXF1ZXN0cXVldWUoc3RydWN0IGRsbV9scyAqbHMsIGludCBub2RlaWQsIHN0cnVjdCBkbG1faGVhZGVyICpoZCk7CitpbnQgZGxtX2FkZF9yZXF1ZXN0cXVldWUoc3RydWN0IGRsbV9scyAqbHMsIGludCBub2RlaWQsIHN0cnVjdCBkbG1faGVhZGVyICpoZCk7CiBpbnQgZGxtX3Byb2Nlc3NfcmVxdWVzdHF1ZXVlKHN0cnVjdCBkbG1fbHMgKmxzKTsKIHZvaWQgZGxtX3dhaXRfcmVxdWVzdHF1ZXVlKHN0cnVjdCBkbG1fbHMgKmxzKTsKIHZvaWQgZGxtX3B1cmdlX3JlcXVlc3RxdWV1ZShzdHJ1Y3QgZGxtX2xzICpscyk7CmRpZmYgLS1naXQgYS9mcy9kbm90aWZ5LmMgYi9mcy9kbm90aWZ5LmMKaW5kZXggMmIwNDQyZC4uOTM2NDA5ZiAxMDA2NDQKLS0tIGEvZnMvZG5vdGlmeS5jCisrKyBiL2ZzL2Rub3RpZnkuYwpAQCAtMjMsNyArMjMsNyBAQAogCiBpbnQgZGlyX25vdGlmeV9lbmFibGUgX19yZWFkX21vc3RseSA9IDE7CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmRuX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmRuX2NhY2hlIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyB2b2lkIHJlZG9faW5vZGVfbWFzayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpAQCAtNDIsNyArNDIsNyBAQAogCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqKnByZXY7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAotCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuOwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CkBAIC03NCwxMCArNzQsMTAgQEAKIAl9CiAJaWYgKCFkaXJfbm90aWZ5X2VuYWJsZSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gLUVOT1RESVI7Ci0JZG4gPSBrbWVtX2NhY2hlX2FsbG9jKGRuX2NhY2hlLCBTTEFCX0tFUk5FTCk7CisJZG4gPSBrbWVtX2NhY2hlX2FsbG9jKGRuX2NhY2hlLCBHRlBfS0VSTkVMKTsKIAlpZiAoZG4gPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2RxdW90LmMgYi9mcy9kcXVvdC5jCmluZGV4IDlhZjc4OTUuLjA5NTJjYzQgMTAwNjQ0Ci0tLSBhL2ZzL2RxdW90LmMKKysrIGIvZnMvZHF1b3QuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiBzdGF0aWMgc3RydWN0IHF1b3RhX21vZHVsZV9uYW1lIG1vZHVsZV9uYW1lc1tdID0gSU5JVF9RVU9UQV9NT0RVTEVfTkFNRVM7CiAKIC8qIFNMQUIgY2FjaGUgZm9yIGRxdW90IHN0cnVjdHVyZXMgKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmRxdW90X2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZHF1b3RfY2FjaGVwOwogCiBpbnQgcmVnaXN0ZXJfcXVvdGFfZm9ybWF0KHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqZm10KQogewpAQCAtNjAwLDcgKzYwMCw3IEBACiB7CiAJc3RydWN0IGRxdW90ICpkcXVvdDsKIAotCWRxdW90ID0ga21lbV9jYWNoZV9hbGxvYyhkcXVvdF9jYWNoZXAsIFNMQUJfTk9GUyk7CisJZHF1b3QgPSBrbWVtX2NhY2hlX2FsbG9jKGRxdW90X2NhY2hlcCwgR0ZQX05PRlMpOwogCWlmKCFkcXVvdCkKIAkJcmV0dXJuIE5PRFFVT1Q7CiAKQEAgLTY5NCw5ICs2OTQsOSBAQAogCWZpbGVfbGlzdF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaChwLCAmc2ItPnNfZmlsZXMpIHsKIAkJc3RydWN0IGZpbGUgKmZpbHAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBmaWxlLCBmX3UuZnVfbGlzdCk7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBkcWluaXRfbmVlZGVkKGlub2RlLCB0eXBlKSkgewotCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZGdldChmaWxwLT5mX2RlbnRyeSk7CisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBkZ2V0KGZpbHAtPmZfcGF0aC5kZW50cnkpOwogCQkJZmlsZV9saXN0X3VubG9jaygpOwogCQkJc2ItPmRxX29wLT5pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKIAkJCWRwdXQoZGVudHJ5KTsKQEAgLTgyOCw2ICs4MjgsNyBAQAogc3RhdGljIHZvaWQgcHJpbnRfd2FybmluZyhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBjb25zdCBjaGFyIHdhcm50eXBlKQogewogCWNoYXIgKm1zZyA9IE5VTEw7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlpbnQgZmxhZyA9ICh3YXJudHlwZSA9PSBCSEFSRFdBUk4gfHwgd2FybnR5cGUgPT0gQlNPRlRMT05HV0FSTikgPyBEUV9CTEtTX0IgOgogCSAgKCh3YXJudHlwZSA9PSBJSEFSRFdBUk4gfHwgd2FybnR5cGUgPT0gSVNPRlRMT05HV0FSTikgPyBEUV9JTk9ERVNfQiA6IDApOwogCkBAIC04MzUsMTQgKzgzNiwxNSBAQAogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwotCWlmICghY3VycmVudC0+c2lnbmFsLT50dHkpCisJdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7CisJaWYgKCF0dHkpCiAJCWdvdG8gb3V0X2xvY2s7Ci0JdHR5X3dyaXRlX21lc3NhZ2UoY3VycmVudC0+c2lnbmFsLT50dHksIGRxdW90LT5kcV9zYi0+c19pZCk7CisJdHR5X3dyaXRlX21lc3NhZ2UodHR5LCBkcXVvdC0+ZHFfc2ItPnNfaWQpOwogCWlmICh3YXJudHlwZSA9PSBJU09GVFdBUk4gfHwgd2FybnR5cGUgPT0gQlNPRlRXQVJOKQotCQl0dHlfd3JpdGVfbWVzc2FnZShjdXJyZW50LT5zaWduYWwtPnR0eSwgIjogd2FybmluZywgIik7CisJCXR0eV93cml0ZV9tZXNzYWdlKHR0eSwgIjogd2FybmluZywgIik7CiAJZWxzZQotCQl0dHlfd3JpdGVfbWVzc2FnZShjdXJyZW50LT5zaWduYWwtPnR0eSwgIjogd3JpdGUgZmFpbGVkLCAiKTsKLQl0dHlfd3JpdGVfbWVzc2FnZShjdXJyZW50LT5zaWduYWwtPnR0eSwgcXVvdGF0eXBlc1tkcXVvdC0+ZHFfdHlwZV0pOworCQl0dHlfd3JpdGVfbWVzc2FnZSh0dHksICI6IHdyaXRlIGZhaWxlZCwgIik7CisJdHR5X3dyaXRlX21lc3NhZ2UodHR5LCBxdW90YXR5cGVzW2RxdW90LT5kcV90eXBlXSk7CiAJc3dpdGNoICh3YXJudHlwZSkgewogCQljYXNlIElIQVJEV0FSTjoKIAkJCW1zZyA9ICIgZmlsZSBsaW1pdCByZWFjaGVkLlxyXG4iOwpAQCAtODYzLDcgKzg2NSw3IEBACiAJCQltc2cgPSAiIGJsb2NrIHF1b3RhIGV4Y2VlZGVkLlxyXG4iOwogCQkJYnJlYWs7CiAJfQotCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnNpZ25hbC0+dHR5LCBtc2cpOworCXR0eV93cml0ZV9tZXNzYWdlKHR0eSwgbXNnKTsKIG91dF9sb2NrOgogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2NyeXB0by5jIGIvZnMvZWNyeXB0ZnMvY3J5cHRvLmMKaW5kZXggZWQzNWE5NzEyLi43MTk2ZjUwIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9jcnlwdG8uYworKysgYi9mcy9lY3J5cHRmcy9jcnlwdG8uYwpAQCAtOTQsMjUgKzk0LDUzIEBACiAJCQkJICBzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKIAkJCQkgIGNoYXIgKnNyYywgaW50IGxlbikKIHsKLQlpbnQgcmMgPSAwOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2MgPSB7CisJCS50Zm0gPSBjcnlwdF9zdGF0LT5oYXNoX3RmbSwKKwkJLmZsYWdzID0gQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQCisJfTsKKwlpbnQgcmMgPSAwOwogCi0JbXV0ZXhfbG9jaygmY3J5cHRfc3RhdC0+Y3NfbWQ1X3RmbV9tdXRleCk7CisJbXV0ZXhfbG9jaygmY3J5cHRfc3RhdC0+Y3NfaGFzaF90Zm1fbXV0ZXgpOwogCXNnX2luaXRfb25lKCZzZywgKHU4ICopc3JjLCBsZW4pOwotCWlmICghY3J5cHRfc3RhdC0+bWQ1X3RmbSkgewotCQljcnlwdF9zdGF0LT5tZDVfdGZtID0KLQkJCWNyeXB0b19hbGxvY190Zm0oIm1kNSIsIENSWVBUT19URk1fUkVRX01BWV9TTEVFUCk7Ci0JCWlmICghY3J5cHRfc3RhdC0+bWQ1X3RmbSkgewotCQkJcmMgPSAtRU5PTUVNOworCWlmICghZGVzYy50Zm0pIHsKKwkJZGVzYy50Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaChFQ1JZUFRGU19ERUZBVUxUX0hBU0gsIDAsCisJCQkJCSAgICAgQ1JZUFRPX0FMR19BU1lOQyk7CisJCWlmIChJU19FUlIoZGVzYy50Zm0pKSB7CisJCQlyYyA9IFBUUl9FUlIoZGVzYy50Zm0pOwogCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgYXR0ZW1wdGluZyB0byAiCi0JCQkJCSJhbGxvY2F0ZSBjcnlwdG8gY29udGV4dFxuIik7CisJCQkJCSJhbGxvY2F0ZSBjcnlwdG8gY29udGV4dDsgcmMgPSBbJWRdXG4iLAorCQkJCQlyYyk7CiAJCQlnb3RvIG91dDsKIAkJfQorCQljcnlwdF9zdGF0LT5oYXNoX3RmbSA9IGRlc2MudGZtOwogCX0KLQljcnlwdG9fZGlnZXN0X2luaXQoY3J5cHRfc3RhdC0+bWQ1X3RmbSk7Ci0JY3J5cHRvX2RpZ2VzdF91cGRhdGUoY3J5cHRfc3RhdC0+bWQ1X3RmbSwgJnNnLCAxKTsKLQljcnlwdG9fZGlnZXN0X2ZpbmFsKGNyeXB0X3N0YXQtPm1kNV90Zm0sIGRzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5jc19tZDVfdGZtX211dGV4KTsKKwljcnlwdG9faGFzaF9pbml0KCZkZXNjKTsKKwljcnlwdG9faGFzaF91cGRhdGUoJmRlc2MsICZzZywgbGVuKTsKKwljcnlwdG9faGFzaF9maW5hbCgmZGVzYywgZHN0KTsKKwltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmNzX2hhc2hfdGZtX211dGV4KTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBlY3J5cHRmc19jcnlwdG9fYXBpX2FsZ2lmeV9jaXBoZXJfbmFtZShjaGFyICoqYWxnaWZpZWRfbmFtZSwKKwkJCQkJICAgY2hhciAqY2lwaGVyX25hbWUsCisJCQkJCSAgIGNoYXIgKmNoYWluaW5nX21vZGlmaWVyKQoreworCWludCBjaXBoZXJfbmFtZV9sZW4gPSBzdHJsZW4oY2lwaGVyX25hbWUpOworCWludCBjaGFpbmluZ19tb2RpZmllcl9sZW4gPSBzdHJsZW4oY2hhaW5pbmdfbW9kaWZpZXIpOworCWludCBhbGdpZmllZF9uYW1lX2xlbjsKKwlpbnQgcmM7CisKKwlhbGdpZmllZF9uYW1lX2xlbiA9IChjaGFpbmluZ19tb2RpZmllcl9sZW4gKyBjaXBoZXJfbmFtZV9sZW4gKyAzKTsKKwkoKmFsZ2lmaWVkX25hbWUpID0ga21hbGxvYyhhbGdpZmllZF9uYW1lX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEoKmFsZ2lmaWVkX25hbWUpKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXNucHJpbnRmKCgqYWxnaWZpZWRfbmFtZSksIGFsZ2lmaWVkX25hbWVfbGVuLCAiJXMoJXMpIiwKKwkJIGNoYWluaW5nX21vZGlmaWVyLCBjaXBoZXJfbmFtZSk7CisJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTE3OCw3ICsyMDYsNyBAQAogCW1lbXNldCgodm9pZCAqKWNyeXB0X3N0YXQsIDAsIHNpemVvZihzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCkpOwogCW11dGV4X2luaXQoJmNyeXB0X3N0YXQtPmNzX211dGV4KTsKIAltdXRleF9pbml0KCZjcnlwdF9zdGF0LT5jc190Zm1fbXV0ZXgpOwotCW11dGV4X2luaXQoJmNyeXB0X3N0YXQtPmNzX21kNV90Zm1fbXV0ZXgpOworCW11dGV4X2luaXQoJmNyeXB0X3N0YXQtPmNzX2hhc2hfdGZtX211dGV4KTsKIAlFQ1JZUFRGU19TRVRfRkxBRyhjcnlwdF9zdGF0LT5mbGFncywgRUNSWVBURlNfU1RSVUNUX0lOSVRJQUxJWkVEKTsKIH0KIApAQCAtMTkxLDkgKzIxOSw5IEBACiB2b2lkIGVjcnlwdGZzX2Rlc3RydWN0X2NyeXB0X3N0YXQoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQpCiB7CiAJaWYgKGNyeXB0X3N0YXQtPnRmbSkKLQkJY3J5cHRvX2ZyZWVfdGZtKGNyeXB0X3N0YXQtPnRmbSk7Ci0JaWYgKGNyeXB0X3N0YXQtPm1kNV90Zm0pCi0JCWNyeXB0b19mcmVlX3RmbShjcnlwdF9zdGF0LT5tZDVfdGZtKTsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGNyeXB0X3N0YXQtPnRmbSk7CisJaWYgKGNyeXB0X3N0YXQtPmhhc2hfdGZtKQorCQljcnlwdG9fZnJlZV9oYXNoKGNyeXB0X3N0YXQtPmhhc2hfdGZtKTsKIAltZW1zZXQoY3J5cHRfc3RhdCwgMCwgc2l6ZW9mKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0KSk7CiB9CiAKQEAgLTIwMyw3ICsyMzEsNyBAQAogCWlmIChtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfa2V5KQogCQlrZXlfcHV0KG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19rZXkpOwogCWlmIChtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbSkKLQkJY3J5cHRvX2ZyZWVfdGZtKG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9rZXlfdGZtKTsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9rZXlfdGZtKTsKIAltZW1zZXQobW91bnRfY3J5cHRfc3RhdCwgMCwgc2l6ZW9mKHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0KSk7CiB9CiAKQEAgLTI2OSw2ICsyOTcsMTEgQEAKIAkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyY19zZywgaW50IHNpemUsCiAJCQkgICAgICAgdW5zaWduZWQgY2hhciAqaXYpCiB7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7CisJCS50Zm0gPSBjcnlwdF9zdGF0LT50Zm0sCisJCS5pbmZvID0gaXYsCisJCS5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUAorCX07CiAJaW50IHJjID0gMDsKIAogCUJVR19PTighY3J5cHRfc3RhdCB8fCAhY3J5cHRfc3RhdC0+dGZtCkBAIC0yODIsOCArMzE1LDggQEAKIAl9CiAJLyogQ29uc2lkZXIgZG9pbmcgdGhpcyBvbmNlLCB3aGVuIHRoZSBmaWxlIGlzIG9wZW5lZCAqLwogCW11dGV4X2xvY2soJmNyeXB0X3N0YXQtPmNzX3RmbV9tdXRleCk7Ci0JcmMgPSBjcnlwdG9fY2lwaGVyX3NldGtleShjcnlwdF9zdGF0LT50Zm0sIGNyeXB0X3N0YXQtPmtleSwKLQkJCQkgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGNyeXB0X3N0YXQtPnRmbSwgY3J5cHRfc3RhdC0+a2V5LAorCQkJCSAgICAgY3J5cHRfc3RhdC0+a2V5X3NpemUpOwogCWlmIChyYykgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBzZXR0aW5nIGtleTsgcmMgPSBbJWRdXG4iLAogCQkJCXJjKTsKQEAgLTI5Miw3ICszMjUsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJFbmNyeXB0aW5nIFslZF0gYnl0ZXMuXG4iLCBzaXplKTsKLQljcnlwdG9fY2lwaGVyX2VuY3J5cHRfaXYoY3J5cHRfc3RhdC0+dGZtLCBkZXN0X3NnLCBzcmNfc2csIHNpemUsIGl2KTsKKwljcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJmRlc2MsIGRlc3Rfc2csIHNyY19zZywgc2l6ZSk7CiAJbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5jc190Zm1fbXV0ZXgpOwogb3V0OgogCXJldHVybiByYzsKQEAgLTU5NSw3ICs2MjgsNyBAQAogCW51bV9leHRlbnRzX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gY3J5cHRfc3RhdC0+ZXh0ZW50X3NpemU7CiAJYmFzZV9leHRlbnQgPSAocGFnZS0+aW5kZXggKiBudW1fZXh0ZW50c19wZXJfcGFnZSk7CiAJbG93ZXJfcGFnZV92aXJ0ID0ga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19sb3dlcl9wYWdlX2NhY2hlLAotCQkJCQkgICBTTEFCX0tFUk5FTCk7CisJCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghbG93ZXJfcGFnZV92aXJ0KSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgZ2V0dGluZyBwYWdlIGZvciBlbmNyeXB0ZWQgIgpAQCAtNjc1LDEyICs3MDgsMTcgQEAKIAkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyY19zZywgaW50IHNpemUsCiAJCQkgICAgICAgdW5zaWduZWQgY2hhciAqaXYpCiB7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7CisJCS50Zm0gPSBjcnlwdF9zdGF0LT50Zm0sCisJCS5pbmZvID0gaXYsCisJCS5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUAorCX07CiAJaW50IHJjID0gMDsKIAogCS8qIENvbnNpZGVyIGRvaW5nIHRoaXMgb25jZSwgd2hlbiB0aGUgZmlsZSBpcyBvcGVuZWQgKi8KIAltdXRleF9sb2NrKCZjcnlwdF9zdGF0LT5jc190Zm1fbXV0ZXgpOwotCXJjID0gY3J5cHRvX2NpcGhlcl9zZXRrZXkoY3J5cHRfc3RhdC0+dGZtLCBjcnlwdF9zdGF0LT5rZXksCi0JCQkJICBjcnlwdF9zdGF0LT5rZXlfc2l6ZSk7CisJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleShjcnlwdF9zdGF0LT50Zm0sIGNyeXB0X3N0YXQtPmtleSwKKwkJCQkgICAgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3Igc2V0dGluZyBrZXk7IHJjID0gWyVkXVxuIiwKIAkJCQlyYyk7CkBAIC02ODksOCArNzI3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiRGVjcnlwdGluZyBbJWRdIGJ5dGVzLlxuIiwgc2l6ZSk7Ci0JcmMgPSBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfaXYoY3J5cHRfc3RhdC0+dGZtLCBkZXN0X3NnLCBzcmNfc2csIHNpemUsCi0JCQkJICAgICAgaXYpOworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0X2l2KCZkZXNjLCBkZXN0X3NnLCBzcmNfc2csIHNpemUpOwogCW11dGV4X3VubG9jaygmY3J5cHRfc3RhdC0+Y3NfdGZtX211dGV4KTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgZGVjcnlwdGluZzsgcmMgPSBbJWRdXG4iLApAQCAtNzU5LDYgKzc5Niw3IEBACiAgKi8KIGludCBlY3J5cHRmc19pbml0X2NyeXB0X2N0eChzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCkKIHsKKwljaGFyICpmdWxsX2FsZ19uYW1lOwogCWludCByYyA9IC1FSU5WQUw7CiAKIAlpZiAoIWNyeXB0X3N0YXQtPmNpcGhlcikgewpAQCAtNzc1LDE2ICs4MTMsMjUgQEAKIAkJZ290byBvdXQ7CiAJfQogCW11dGV4X2xvY2soJmNyeXB0X3N0YXQtPmNzX3RmbV9tdXRleCk7Ci0JY3J5cHRfc3RhdC0+dGZtID0gY3J5cHRvX2FsbG9jX3RmbShjcnlwdF9zdGF0LT5jaXBoZXIsCi0JCQkJCSAgIEVDUllQVEZTX0RFRkFVTFRfQ0hBSU5JTkdfTU9ERQotCQkJCQkgICB8IENSWVBUT19URk1fUkVRX1dFQUtfS0VZKTsKLQltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmNzX3RmbV9tdXRleCk7Ci0JaWYgKCFjcnlwdF9zdGF0LT50Zm0pIHsKKwlyYyA9IGVjcnlwdGZzX2NyeXB0b19hcGlfYWxnaWZ5X2NpcGhlcl9uYW1lKCZmdWxsX2FsZ19uYW1lLAorCQkJCQkJICAgIGNyeXB0X3N0YXQtPmNpcGhlciwgImNiYyIpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJY3J5cHRfc3RhdC0+dGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihmdWxsX2FsZ19uYW1lLCAwLAorCQkJCQkJIENSWVBUT19BTEdfQVNZTkMpOworCWtmcmVlKGZ1bGxfYWxnX25hbWUpOworCWlmIChJU19FUlIoY3J5cHRfc3RhdC0+dGZtKSkgeworCQlyYyA9IFBUUl9FUlIoY3J5cHRfc3RhdC0+dGZtKTsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiY3J5cHRmczogaW5pdF9jcnlwdF9jdHgoKTogIgogCQkJCSJFcnJvciBpbml0aWFsaXppbmcgY2lwaGVyIFslc11cbiIsCiAJCQkJY3J5cHRfc3RhdC0+Y2lwaGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5jc190Zm1fbXV0ZXgpOwogCQlnb3RvIG91dDsKIAl9CisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRfZmxhZ3MoY3J5cHRfc3RhdC0+dGZtLAorCQkJCSAgIChFQ1JZUFRGU19ERUZBVUxUX0NIQUlOSU5HX01PREUKKwkJCQkgICAgfCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpOworCW11dGV4X3VubG9jaygmY3J5cHRfc3RhdC0+Y3NfdGZtX211dGV4KTsKIAlyYyA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJjOwpAQCAtMTE0NSwyOCArMTE5MiwyOCBAQAogaW50IGVjcnlwdGZzX3JlYWRfaGVhZGVyX3JlZ2lvbihjaGFyICpkYXRhLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0Jc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGZpbGUgKmxvd2VyX2ZpbGU7CiAJbW1fc2VnbWVudF90IG9sZGZzOwogCWludCByYzsKIAotCW1udCA9IG1udGdldChtbnQpOwotCWZpbGUgPSBkZW50cnlfb3BlbihkZW50cnksIG1udCwgT19SRE9OTFkpOwotCWlmIChJU19FUlIoZmlsZSkpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJFcnJvciBvcGVuaW5nIGZpbGUgdG8gIgotCQkJCSJyZWFkIGhlYWRlciByZWdpb25cbiIpOwotCQltbnRwdXQobW50KTsKLQkJcmMgPSBQVFJfRVJSKGZpbGUpOworCWlmICgocmMgPSBlY3J5cHRmc19vcGVuX2xvd2VyX2ZpbGUoJmxvd2VyX2ZpbGUsIGRlbnRyeSwgbW50LAorCQkJCQkgICBPX1JET05MWSkpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkVycm9yIG9wZW5pbmcgbG93ZXJfZmlsZSB0byByZWFkIGhlYWRlciByZWdpb25cbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0JZmlsZS0+Zl9wb3MgPSAwOworCWxvd2VyX2ZpbGUtPmZfcG9zID0gMDsKIAlvbGRmcyA9IGdldF9mcygpOwogCXNldF9mcyhnZXRfZHMoKSk7CiAJLyogRm9yIHJlbGVhc2VzIDAuMSBhbmQgMC4yLCBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbgogCSAqIGZpdHMgaW4gdGhlIGZpcnN0IGRhdGEgZXh0ZW50LXNpemVkIHJlZ2lvbi4gKi8KLQlyYyA9IGZpbGUtPmZfb3AtPnJlYWQoZmlsZSwgKGNoYXIgX191c2VyICopZGF0YSwKLQkJCSAgICAgIEVDUllQVEZTX0RFRkFVTFRfRVhURU5UX1NJWkUsICZmaWxlLT5mX3Bvcyk7CisJcmMgPSBsb3dlcl9maWxlLT5mX29wLT5yZWFkKGxvd2VyX2ZpbGUsIChjaGFyIF9fdXNlciAqKWRhdGEsCisJCQkgICAgICBFQ1JZUFRGU19ERUZBVUxUX0VYVEVOVF9TSVpFLCAmbG93ZXJfZmlsZS0+Zl9wb3MpOwogCXNldF9mcyhvbGRmcyk7Ci0JZnB1dChmaWxlKTsKKwlpZiAoKHJjID0gZWNyeXB0ZnNfY2xvc2VfbG93ZXJfZmlsZShsb3dlcl9maWxlKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBjbG9zaW5nIGxvd2VyX2ZpbGVcbiIpOworCQlnb3RvIG91dDsKKwl9CiAJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKQEAgLTEyODcsNyArMTMzNCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAkvKiBSZWxlYXNlZCBpbiB0aGlzIGZ1bmN0aW9uICovCi0JcGFnZV92aXJ0ID0ga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19oZWFkZXJfY2FjaGVfMCwgU0xBQl9VU0VSKTsKKwlwYWdlX3ZpcnQgPSBrbWVtX2NhY2hlX2FsbG9jKGVjcnlwdGZzX2hlYWRlcl9jYWNoZV8wLCBHRlBfVVNFUik7CiAJaWYgKCFwYWdlX3ZpcnQpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAJCXJjID0gLUVOT01FTTsKQEAgLTE0NDYsNyArMTQ5Myw3IEBACiAJICAgICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGVjcnlwdGZzX2RlbnRyeS0+ZF9pbm9kZSktPmNyeXB0X3N0YXQ7CiAKIAkvKiBSZWFkIHRoZSBmaXJzdCBwYWdlIGZyb20gdGhlIHVuZGVybHlpbmcgZmlsZSAqLwotCXBhZ2VfdmlydCA9IGttZW1fY2FjaGVfYWxsb2MoZWNyeXB0ZnNfaGVhZGVyX2NhY2hlXzEsIFNMQUJfVVNFUik7CisJcGFnZV92aXJ0ID0ga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19oZWFkZXJfY2FjaGVfMSwgR0ZQX1VTRVIpOwogCWlmICghcGFnZV92aXJ0KSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHBhZ2VfdmlydFxuIik7CkBAIC0xNTczLDg0ICsxNjIwLDUyIEBACiAKIC8qKgogICogZWNyeXB0ZnNfcHJvY2Vzc19jaXBoZXIgLSBQZXJmb3JtIGNpcGhlciBpbml0aWFsaXphdGlvbi4KLSAqIEB0Zm06IENyeXB0byBjb250ZXh0IHNldCBieSB0aGlzIGZ1bmN0aW9uCiAgKiBAa2V5X3RmbTogQ3J5cHRvIGNvbnRleHQgZm9yIGtleSBtYXRlcmlhbCwgc2V0IGJ5IHRoaXMgZnVuY3Rpb24KLSAqIEBjaXBoZXJfbmFtZTogTmFtZSBvZiB0aGUgY2lwaGVyLgotICogQGtleV9zaXplOiBTaXplIG9mIHRoZSBrZXkgaW4gYnl0ZXMuCisgKiBAY2lwaGVyX25hbWU6IE5hbWUgb2YgdGhlIGNpcGhlcgorICogQGtleV9zaXplOiBTaXplIG9mIHRoZSBrZXkgaW4gYnl0ZXMKICAqCiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4gQW55IGNyeXB0b190Zm0gc3RydWN0cyBhbGxvY2F0ZWQgaGVyZQogICogc2hvdWxkIGJlIHJlbGVhc2VkIGJ5IG90aGVyIGZ1bmN0aW9ucywgc3VjaCBhcyBvbiBhIHN1cGVyYmxvY2sgcHV0CiAgKiBldmVudCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMgZm9yIGZhaWxzLgogICovCiBpbnQKLWVjcnlwdGZzX3Byb2Nlc3NfY2lwaGVyKHN0cnVjdCBjcnlwdG9fdGZtICoqdGZtLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqKmtleV90Zm0sCi0JCQljaGFyICpjaXBoZXJfbmFtZSwgc2l6ZV90IGtleV9zaXplKQorZWNyeXB0ZnNfcHJvY2Vzc19jaXBoZXIoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKiprZXlfdGZtLCBjaGFyICpjaXBoZXJfbmFtZSwKKwkJCXNpemVfdCAqa2V5X3NpemUpCiB7CiAJY2hhciBkdW1teV9rZXlbRUNSWVBURlNfTUFYX0tFWV9CWVRFU107CisJY2hhciAqZnVsbF9hbGdfbmFtZTsKIAlpbnQgcmM7CiAKLQkqdGZtID0gKmtleV90Zm0gPSBOVUxMOwotCWlmIChrZXlfc2l6ZSA+IEVDUllQVEZTX01BWF9LRVlfQllURVMpIHsKKwkqa2V5X3RmbSA9IE5VTEw7CisJaWYgKCprZXlfc2l6ZSA+IEVDUllQVEZTX01BWF9LRVlfQllURVMpIHsKIAkJcmMgPSAtRUlOVkFMOwogCQlwcmludGsoS0VSTl9FUlIgIlJlcXVlc3RlZCBrZXkgc2l6ZSBpcyBbJVpkXSBieXRlczsgbWF4aW11bSAiCi0JCSAgICAgICAiYWxsb3dhYmxlIGlzIFslZF1cbiIsIGtleV9zaXplLCBFQ1JZUFRGU19NQVhfS0VZX0JZVEVTKTsKKwkJICAgICAgImFsbG93YWJsZSBpcyBbJWRdXG4iLCAqa2V5X3NpemUsIEVDUllQVEZTX01BWF9LRVlfQllURVMpOwogCQlnb3RvIG91dDsKIAl9Ci0JKnRmbSA9IGNyeXB0b19hbGxvY190Zm0oY2lwaGVyX25hbWUsIChFQ1JZUFRGU19ERUZBVUxUX0NIQUlOSU5HX01PREUKLQkJCQkJICAgICAgfCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpOwotCWlmICghKCp0Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKKwlyYyA9IGVjcnlwdGZzX2NyeXB0b19hcGlfYWxnaWZ5X2NpcGhlcl9uYW1lKCZmdWxsX2FsZ19uYW1lLCBjaXBoZXJfbmFtZSwKKwkJCQkJCSAgICAiZWNiIik7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwkqa2V5X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoZnVsbF9hbGdfbmFtZSwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJa2ZyZWUoZnVsbF9hbGdfbmFtZSk7CisJaWYgKElTX0VSUigqa2V5X3RmbSkpIHsKKwkJcmMgPSBQVFJfRVJSKCprZXlfdGZtKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgY3J5cHRvIGNpcGhlciB3aXRoIG5hbWUgIgotCQkgICAgICAgIlslc11cbiIsIGNpcGhlcl9uYW1lKTsKKwkJICAgICAgICJbJXNdOyByYyA9IFslZF1cbiIsIGNpcGhlcl9uYW1lLCByYyk7CiAJCWdvdG8gb3V0OwogCX0KLQkqa2V5X3RmbSA9IGNyeXB0b19hbGxvY190Zm0oY2lwaGVyX25hbWUsIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKTsKLQlpZiAoISgqa2V5X3RmbSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBjcnlwdG8gY2lwaGVyIHdpdGggbmFtZSAiCi0JCSAgICAgICAiWyVzXVxuIiwgY2lwaGVyX25hbWUpOwotCQlnb3RvIG91dDsKKwljcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncygqa2V5X3RmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOworCWlmICgqa2V5X3NpemUgPT0gMCkgeworCQlzdHJ1Y3QgYmxrY2lwaGVyX2FsZyAqYWxnID0gY3J5cHRvX2Jsa2NpcGhlcl9hbGcoKmtleV90Zm0pOworCisJCSprZXlfc2l6ZSA9IGFsZy0+bWF4X2tleXNpemU7CiAJfQotCWlmIChrZXlfc2l6ZSA8IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKCp0Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGtleSBzaXplIGlzIFslWmRdOyBtaW5pbXVtIGtleSBzaXplICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgY2lwaGVyIFslc10gaXMgWyVkXVxuIiwga2V5X3NpemUsCi0JCSAgICAgICBjaXBoZXJfbmFtZSwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKnRmbSkpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGtleV9zaXplIDwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKmtleV90Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGtleSBzaXplIGlzIFslWmRdOyBtaW5pbXVtIGtleSBzaXplICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgY2lwaGVyIFslc10gaXMgWyVkXVxuIiwga2V5X3NpemUsCi0JCSAgICAgICBjaXBoZXJfbmFtZSwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKmtleV90Zm0pKTsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChrZXlfc2l6ZSA+IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKCp0Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGtleSBzaXplIGlzIFslWmRdOyBtYXhpbXVtIGtleSBzaXplICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgY2lwaGVyIFslc10gaXMgWyVkXVxuIiwga2V5X3NpemUsCi0JCSAgICAgICBjaXBoZXJfbmFtZSwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKnRmbSkpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGtleV9zaXplID4gY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoKmtleV90Zm0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0IGtleSBzaXplIGlzIFslWmRdOyBtYXhpbXVtIGtleSBzaXplICIKLQkJICAgICAgICJzdXBwb3J0ZWQgYnkgY2lwaGVyIFslc10gaXMgWyVkXVxuIiwga2V5X3NpemUsCi0JCSAgICAgICBjaXBoZXJfbmFtZSwgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoKmtleV90Zm0pKTsKLQkJZ290byBvdXQ7Ci0JfQotCWdldF9yYW5kb21fYnl0ZXMoZHVtbXlfa2V5LCBrZXlfc2l6ZSk7Ci0JcmMgPSBjcnlwdG9fY2lwaGVyX3NldGtleSgqdGZtLCBkdW1teV9rZXksIGtleV9zaXplKTsKKwlnZXRfcmFuZG9tX2J5dGVzKGR1bW15X2tleSwgKmtleV9zaXplKTsKKwlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KCprZXlfdGZtLCBkdW1teV9rZXksICprZXlfc2l6ZSk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBzZXQga2V5IG9mIHNpemUgWyVaZF0gZm9yICIKLQkJICAgICAgICJjaXBoZXIgWyVzXTsgcmMgPSBbJWRdXG4iLCBrZXlfc2l6ZSwgY2lwaGVyX25hbWUsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JcmMgPSBjcnlwdG9fY2lwaGVyX3NldGtleSgqa2V5X3RmbSwgZHVtbXlfa2V5LCBrZXlfc2l6ZSk7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBzZXQga2V5IG9mIHNpemUgWyVaZF0gZm9yICIKLQkJICAgICAgICJjaXBoZXIgWyVzXTsgcmMgPSBbJWRdXG4iLCBrZXlfc2l6ZSwgY2lwaGVyX25hbWUsIHJjKTsKKwkJICAgICAgICJjaXBoZXIgWyVzXTsgcmMgPSBbJWRdXG4iLCAqa2V5X3NpemUsIGNpcGhlcl9uYW1lLCByYyk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZGVudHJ5LmMgYi9mcy9lY3J5cHRmcy9kZW50cnkuYwppbmRleCBmMGQyYTQzLi4zMjllZmNkIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9kZW50cnkuYworKysgYi9mcy9lY3J5cHRmcy9kZW50cnkuYwpAQCAtMjQsNiArMjQsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzX3N0YWNrLmg+CiAjaW5jbHVkZSAiZWNyeXB0ZnNfa2VybmVsLmgiCiAKIC8qKgpAQCAtNTYsNiArNTgsMTIgQEAKIAlyYyA9IGxvd2VyX2RlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKGxvd2VyX2RlbnRyeSwgbmQpOwogCW5kLT5kZW50cnkgPSBkZW50cnlfc2F2ZTsKIAluZC0+bW50ID0gdmZzbW91bnRfc2F2ZTsKKwlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCXN0cnVjdCBpbm9kZSAqbG93ZXJfaW5vZGUgPQorCQkJZWNyeXB0ZnNfaW5vZGVfdG9fbG93ZXIoZGVudHJ5LT5kX2lub2RlKTsKKworCQlmc3N0YWNrX2NvcHlfYXR0cl9hbGwoZGVudHJ5LT5kX2lub2RlLCBsb3dlcl9pbm9kZSwgTlVMTCk7CisJfQogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTc2LDggKzg0LDEzIEBACiAJaWYgKGVjcnlwdGZzX2RlbnRyeV90b19wcml2YXRlKGRlbnRyeSkpCiAJCWttZW1fY2FjaGVfZnJlZShlY3J5cHRmc19kZW50cnlfaW5mb19jYWNoZSwKIAkJCQllY3J5cHRmc19kZW50cnlfdG9fcHJpdmF0ZShkZW50cnkpKTsKLQlpZiAobG93ZXJfZGVudHJ5KQorCWlmIChsb3dlcl9kZW50cnkpIHsKKwkJc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQgPQorCQkJZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyX21udChkZW50cnkpOworCisJCW1udHB1dChsb3dlcl9tbnQpOwogCQlkcHV0KGxvd2VyX2RlbnRyeSk7CisJfQogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmggYi9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaAppbmRleCA4NzJjOTk1Li5hZmI2NGJkIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaAorKysgYi9mcy9lY3J5cHRmcy9lY3J5cHRmc19rZXJuZWwuaApAQCAtMjgsNiArMjgsOCBAQAogCiAjaW5jbHVkZSA8a2V5cy91c2VyLXR5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzX3N0YWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAvKiBWZXJzaW9uIHZlcmlmaWNhdGlvbiBmb3Igc2hhcmVkIGRhdGEgc3RydWN0dXJlcyB3LyB1c2Vyc3BhY2UgKi8KQEAgLTE3NSw2ICsxNzcsNyBAQAogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0NJUEhFUiAiYWVzIgogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0tFWV9CWVRFUyAxNgogI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0NIQUlOSU5HX01PREUgQ1JZUFRPX1RGTV9NT0RFX0NCQworI2RlZmluZSBFQ1JZUFRGU19ERUZBVUxUX0hBU0ggIm1kNSIKICNkZWZpbmUgRUNSWVBURlNfVEFHXzNfUEFDS0VUX1RZUEUgMHg4QwogI2RlZmluZSBFQ1JZUFRGU19UQUdfMTFfUEFDS0VUX1RZUEUgMHhFRAogI2RlZmluZSBNRDVfRElHRVNUX1NJWkUgMTYKQEAgLTIwNCwxNSArMjA3LDE1IEBACiAJc2l6ZV90IGV4dGVudF9zaGlmdDsKIAl1bnNpZ25lZCBpbnQgZXh0ZW50X21hc2s7CiAJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQ7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqbWQ1X3RmbTsgLyogQ3J5cHRvIGNvbnRleHQgZm9yIGdlbmVyYXRpbmcKLQkJCQkgICAgICogdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvcnMgKi8KKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtOworCXN0cnVjdCBjcnlwdG9faGFzaCAqaGFzaF90Zm07IC8qIENyeXB0byBjb250ZXh0IGZvciBnZW5lcmF0aW5nCisJCQkJICAgICAgICogdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvcnMgKi8KIAl1bnNpZ25lZCBjaGFyIGNpcGhlcltFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRV07CiAJdW5zaWduZWQgY2hhciBrZXlbRUNSWVBURlNfTUFYX0tFWV9CWVRFU107CiAJdW5zaWduZWQgY2hhciByb290X2l2W0VDUllQVEZTX01BWF9JVl9CWVRFU107CiAJdW5zaWduZWQgY2hhciBrZXlzaWdzW0VDUllQVEZTX01BWF9OVU1fS0VZU0lHU11bRUNSWVBURlNfU0lHX1NJWkVfSEVYXTsKIAlzdHJ1Y3QgbXV0ZXggY3NfdGZtX211dGV4OwotCXN0cnVjdCBtdXRleCBjc19tZDVfdGZtX211dGV4OworCXN0cnVjdCBtdXRleCBjc19oYXNoX3RmbV9tdXRleDsKIAlzdHJ1Y3QgbXV0ZXggY3NfbXV0ZXg7CiB9OwogCkBAIC0yMjYsOCArMjI5LDcgQEAKIC8qIGRlbnRyeSBwcml2YXRlIGRhdGEuIEVhY2ggZGVudHJ5IG11c3Qga2VlcCB0cmFjayBvZiBhIGxvd2VyCiAgKiB2ZnNtb3VudCB0b28uICovCiBzdHJ1Y3QgZWNyeXB0ZnNfZGVudHJ5X2luZm8gewotCXN0cnVjdCBkZW50cnkgKndkaV9kZW50cnk7Ci0Jc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQ7CisJc3RydWN0IHBhdGggbG93ZXJfcGF0aDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdDsKIH07CiAKQEAgLTI0NCw3ICsyNDYsNyBAQAogCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqZ2xvYmFsX2F1dGhfdG9rOwogCXN0cnVjdCBrZXkgKmdsb2JhbF9hdXRoX3Rva19rZXk7CiAJc2l6ZV90IGdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZTsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqZ2xvYmFsX2tleV90Zm07CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKmdsb2JhbF9rZXlfdGZtOwogCXN0cnVjdCBtdXRleCBnbG9iYWxfa2V5X3RmbV9tdXRleDsKIAl1bnNpZ25lZCBjaGFyIGdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lW0VDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFCiAJCQkJCQkgKyAxXTsKQEAgLTM1NCwyNiArMzU2LDI2IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKgogZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlyZXR1cm4gKChzdHJ1Y3QgZWNyeXB0ZnNfZGVudHJ5X2luZm8gKilkZW50cnktPmRfZnNkYXRhKS0+d2RpX2RlbnRyeTsKKwlyZXR1cm4gKChzdHJ1Y3QgZWNyeXB0ZnNfZGVudHJ5X2luZm8gKilkZW50cnktPmRfZnNkYXRhKS0+bG93ZXJfcGF0aC5kZW50cnk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZWNyeXB0ZnNfc2V0X2RlbnRyeV9sb3dlcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeSkKIHsKLQkoKHN0cnVjdCBlY3J5cHRmc19kZW50cnlfaW5mbyAqKWRlbnRyeS0+ZF9mc2RhdGEpLT53ZGlfZGVudHJ5ID0KKwkoKHN0cnVjdCBlY3J5cHRmc19kZW50cnlfaW5mbyAqKWRlbnRyeS0+ZF9mc2RhdGEpLT5sb3dlcl9wYXRoLmRlbnRyeSA9CiAJCWxvd2VyX2RlbnRyeTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdmZzbW91bnQgKgogZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyX21udChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0JcmV0dXJuICgoc3RydWN0IGVjcnlwdGZzX2RlbnRyeV9pbmZvICopZGVudHJ5LT5kX2ZzZGF0YSktPmxvd2VyX21udDsKKwlyZXR1cm4gKChzdHJ1Y3QgZWNyeXB0ZnNfZGVudHJ5X2luZm8gKilkZW50cnktPmRfZnNkYXRhKS0+bG93ZXJfcGF0aC5tbnQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZWNyeXB0ZnNfc2V0X2RlbnRyeV9sb3dlcl9tbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKmxvd2VyX21udCkKIHsKLQkoKHN0cnVjdCBlY3J5cHRmc19kZW50cnlfaW5mbyAqKWRlbnRyeS0+ZF9mc2RhdGEpLT5sb3dlcl9tbnQgPQorCSgoc3RydWN0IGVjcnlwdGZzX2RlbnRyeV9pbmZvICopZGVudHJ5LT5kX2ZzZGF0YSktPmxvd2VyX3BhdGgubW50ID0KIAkJbG93ZXJfbW50OwogfQogCkBAIC00MTIsOSArNDE0LDYgQEAKIAkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCwKIAkJCSAgICAgY2hhciAqKmVuY29kZWRfbmFtZSk7CiBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19sb3dlcl9kZW50cnkoc3RydWN0IGRlbnRyeSAqdGhpc19kZW50cnkpOwotdm9pZCBlY3J5cHRmc19jb3B5X2F0dHJfYXRpbWUoc3RydWN0IGlub2RlICpkZXN0LCBjb25zdCBzdHJ1Y3QgaW5vZGUgKnNyYyk7Ci12b2lkIGVjcnlwdGZzX2NvcHlfYXR0cl9hbGwoc3RydWN0IGlub2RlICpkZXN0LCBjb25zdCBzdHJ1Y3QgaW5vZGUgKnNyYyk7Ci12b2lkIGVjcnlwdGZzX2NvcHlfaW5vZGVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmRzdCwgY29uc3Qgc3RydWN0IGlub2RlICpzcmMpOwogdm9pZCBlY3J5cHRmc19kdW1wX2hleChjaGFyICpkYXRhLCBpbnQgYnl0ZXMpOwogaW50IHZpcnRfdG9fc2NhdHRlcmxpc3QoY29uc3Qgdm9pZCAqYWRkciwgaW50IHNpemUsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCiAJCQlpbnQgc2dfc2l6ZSk7CkBAIC00MjUsNiArNDI0LDkgQEAKIHZvaWQgZWNyeXB0ZnNfZGVzdHJ1Y3RfbW91bnRfY3J5cHRfc3RhdCgKIAlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCk7CiBpbnQgZWNyeXB0ZnNfaW5pdF9jcnlwdF9jdHgoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQpOworaW50IGVjcnlwdGZzX2NyeXB0b19hcGlfYWxnaWZ5X2NpcGhlcl9uYW1lKGNoYXIgKiphbGdpZmllZF9uYW1lLAorCQkJCQkgICBjaGFyICpjaXBoZXJfbmFtZSwKKwkJCQkJICAgY2hhciAqY2hhaW5pbmdfbW9kaWZpZXIpOwogaW50IGVjcnlwdGZzX3dyaXRlX2lub2RlX3NpemVfdG9faGVhZGVyKHN0cnVjdCBmaWxlICpsb3dlcl9maWxlLAogCQkJCQlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlLAogCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTQ3MywxMCArNDc1LDE0IEBACiAJCQkgIHVuc2lnbmVkIGNoYXIgKnNyYywgc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGVudHJ5KTsKIGludCBlY3J5cHRmc190cnVuY2F0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGxvZmZfdCBuZXdfbGVuZ3RoKTsKIGludAotZWNyeXB0ZnNfcHJvY2Vzc19jaXBoZXIoc3RydWN0IGNyeXB0b190Zm0gKip0Zm0sIHN0cnVjdCBjcnlwdG9fdGZtICoqa2V5X3RmbSwKLQkJCWNoYXIgKmNpcGhlcl9uYW1lLCBzaXplX3Qga2V5X3NpemUpOworZWNyeXB0ZnNfcHJvY2Vzc19jaXBoZXIoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKiprZXlfdGZtLCBjaGFyICpjaXBoZXJfbmFtZSwKKwkJCXNpemVfdCAqa2V5X3NpemUpOwogaW50IGVjcnlwdGZzX2lub2RlX3Rlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqY2FuZGlkYXRlX2xvd2VyX2lub2RlKTsKIGludCBlY3J5cHRmc19pbm9kZV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqbG93ZXJfaW5vZGUpOwogdm9pZCBlY3J5cHRmc19pbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqbG93ZXJfaW5vZGUpOworaW50IGVjcnlwdGZzX29wZW5fbG93ZXJfZmlsZShzdHJ1Y3QgZmlsZSAqKmxvd2VyX2ZpbGUsCisJCQkgICAgIHN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeSwKKwkJCSAgICAgc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQsIGludCBmbGFncyk7CitpbnQgZWNyeXB0ZnNfY2xvc2VfbG93ZXJfZmlsZShzdHJ1Y3QgZmlsZSAqbG93ZXJfZmlsZSk7CiAKICNlbmRpZiAvKiAjaWZuZGVmIEVDUllQVEZTX0tFUk5FTF9IICovCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9maWxlLmMgYi9mcy9lY3J5cHRmcy9maWxlLmMKaW5kZXggYzg1NTBjOS4uYzVhMmU1MiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZmlsZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2ZpbGUuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mc19zdGFjay5oPgogI2luY2x1ZGUgImVjcnlwdGZzX2tlcm5lbC5oIgogCiAvKioKQEAgLTc1LDcgKzc2LDcgQEAKIAl9CiAJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJuZXdfZW5kX3BvcyA9IFsweCUuMTZ4XVxuIiwgbmV3X2VuZF9wb3MpOwogCWlmIChleHBhbmRpbmdfZmlsZSkgewotCQlyYyA9IGVjcnlwdGZzX3RydW5jYXRlKGZpbGUtPmZfZGVudHJ5LCBuZXdfZW5kX3Bvcyk7CisJCXJjID0gZWNyeXB0ZnNfdHJ1bmNhdGUoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgbmV3X2VuZF9wb3MpOwogCQlpZiAocmMpIHsKIAkJCXJ2ID0gcmM7CiAJCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBvbiBhdHRlbXB0IHRvICIKQEAgLTExNiw4ICsxMTcsOCBAQAogCWlmICgtRUlPQ0JRVUVVRUQgPT0gcmMpCiAJCXJjID0gd2FpdF9vbl9zeW5jX2tpb2NiKGlvY2IpOwogCWlmIChyYyA+PSAwKSB7Ci0JCWxvd2VyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihmaWxlLT5mX2RlbnRyeSk7Ci0JCWxvd2VyX3Zmc21vdW50ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyX21udChmaWxlLT5mX2RlbnRyeSk7CisJCWxvd2VyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihmaWxlLT5mX3BhdGguZGVudHJ5KTsKKwkJbG93ZXJfdmZzbW91bnQgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfbW50KGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCQl0b3VjaF9hdGltZShsb3dlcl92ZnNtb3VudCwgbG93ZXJfZGVudHJ5KTsKIAl9CiAJcmV0dXJuIHJjOwpAQCAtMTc2LDEwICsxNzcsMTAgQEAKIAogCWxvd2VyX2ZpbGUgPSBlY3J5cHRmc19maWxlX3RvX2xvd2VyKGZpbGUpOwogCWxvd2VyX2ZpbGUtPmZfcG9zID0gZmlsZS0+Zl9wb3M7Ci0JaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKIAlidWYuZGlyZW50ID0gZGlyZW50OwotCWJ1Zi5kZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlidWYuZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlidWYuZmlsbGRpciA9IGZpbGxkaXI7CiByZXRyeToKIAlidWYuZmlsbGRpcl9jYWxsZWQgPSAwOwpAQCAtMTkyLDEyICsxOTMsMzkgQEAKIAkJZ290byByZXRyeTsKIAlmaWxlLT5mX3BvcyA9IGxvd2VyX2ZpbGUtPmZfcG9zOwogCWlmIChyYyA+PSAwKQotCQllY3J5cHRmc19jb3B5X2F0dHJfYXRpbWUoaW5vZGUsIGxvd2VyX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJZnNzdGFja19jb3B5X2F0dHJfYXRpbWUoaW5vZGUsIGxvd2VyX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXJldHVybiByYzsKIH0KIAogc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2ZpbGVfaW5mb19jYWNoZTsKIAoraW50IGVjcnlwdGZzX29wZW5fbG93ZXJfZmlsZShzdHJ1Y3QgZmlsZSAqKmxvd2VyX2ZpbGUsCisJCQkgICAgIHN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeSwKKwkJCSAgICAgc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQsIGludCBmbGFncykKK3sKKwlpbnQgcmMgPSAwOworCisJZGdldChsb3dlcl9kZW50cnkpOworCW1udGdldChsb3dlcl9tbnQpOworCSpsb3dlcl9maWxlID0gZGVudHJ5X29wZW4obG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKCpsb3dlcl9maWxlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIG9wZW5pbmcgbG93ZXIgZmlsZSBmb3IgbG93ZXJfZGVudHJ5ICIKKwkJICAgICAgICJbMHglcF0sIGxvd2VyX21udCBbMHglcF0sIGFuZCBmbGFncyBbMHgleF1cbiIsCisJCSAgICAgICBsb3dlcl9kZW50cnksIGxvd2VyX21udCwgZmxhZ3MpOworCQlyYyA9IFBUUl9FUlIoKmxvd2VyX2ZpbGUpOworCQkqbG93ZXJfZmlsZSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBlY3J5cHRmc19jbG9zZV9sb3dlcl9maWxlKHN0cnVjdCBmaWxlICpsb3dlcl9maWxlKQoreworCWZwdXQobG93ZXJfZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogZWNyeXB0ZnNfb3BlbgogICogQGlub2RlOiBpbm9kZSBzcGVjaXlpbmcgZmlsZSB0byBvcGVuCkBAIC0yMTIsNyArMjQwLDcgQEAKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdDsKLQlzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCS8qIFByaXZhdGUgdmFsdWUgb2YgZWNyeXB0ZnNfZGVudHJ5IGFsbG9jYXRlZCBpbgogCSAqIGVjcnlwdGZzX2xvb2t1cCgpICovCiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGVjcnlwdGZzX2RlbnRyeSk7CkBAIC0yMjMsNyArMjUxLDcgQEAKIAlpbnQgbG93ZXJfZmxhZ3M7CiAKIAkvKiBSZWxlYXNlZCBpbiBlY3J5cHRmc19yZWxlYXNlIG9yIGVuZCBvZiBmdW5jdGlvbiBpZiBmYWlsdXJlICovCi0JZmlsZV9pbmZvID0ga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19maWxlX2luZm9fY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwlmaWxlX2luZm8gPSBrbWVtX2NhY2hlX2FsbG9jKGVjcnlwdGZzX2ZpbGVfaW5mb19jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJZWNyeXB0ZnNfc2V0X2ZpbGVfcHJpdmF0ZShmaWxlLCBmaWxlX2luZm8pOwogCWlmICghZmlsZV9pbmZvKSB7CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwKQEAgLTI0NCwxOSArMjcyLDE1IEBACiAJCUVDUllQVEZTX1NFVF9GTEFHKGNyeXB0X3N0YXQtPmZsYWdzLCBFQ1JZUFRGU19FTkNSWVBURUQpOwogCX0KIAltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmNzX211dGV4KTsKLQkvKiBUaGlzIG1udGdldCAmIGRnZXQgaXMgdW5kb25lIHZpYSBmcHV0IHdoZW4gdGhlIGZpbGUgaXMgcmVsZWFzZWQgKi8KLQlkZ2V0KGxvd2VyX2RlbnRyeSk7CiAJbG93ZXJfZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzOwogCWlmICgobG93ZXJfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKQogCQlsb3dlcl9mbGFncyA9IChsb3dlcl9mbGFncyAmIE9fQUNDTU9ERSkgfCBPX1JEV1I7CiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkKIAkJbG93ZXJfZmxhZ3MgJj0gfk9fQVBQRU5EOwogCWxvd2VyX21udCA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZWNyeXB0ZnNfZGVudHJ5KTsKLQltbnRnZXQobG93ZXJfbW50KTsKIAkvKiBDb3JyZXNwb25kaW5nIGZwdXQoKSBpbiBlY3J5cHRmc19yZWxlYXNlKCkgKi8KLQlsb3dlcl9maWxlID0gZGVudHJ5X29wZW4obG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsIGxvd2VyX2ZsYWdzKTsKLQlpZiAoSVNfRVJSKGxvd2VyX2ZpbGUpKSB7Ci0JCXJjID0gUFRSX0VSUihsb3dlcl9maWxlKTsKKwlpZiAoKHJjID0gZWNyeXB0ZnNfb3Blbl9sb3dlcl9maWxlKCZsb3dlcl9maWxlLCBsb3dlcl9kZW50cnksIGxvd2VyX21udCwKKwkJCQkJICAgbG93ZXJfZmxhZ3MpKSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBvcGVuaW5nIGxvd2VyIGZpbGVcbiIpOwogCQlnb3RvIG91dF9wdXRzOwogCX0KQEAgLTM0MSwxMSArMzY1LDE2IEBACiAJc3RydWN0IGZpbGUgKmxvd2VyX2ZpbGUgPSBlY3J5cHRmc19maWxlX3RvX2xvd2VyKGZpbGUpOwogCXN0cnVjdCBlY3J5cHRmc19maWxlX2luZm8gKmZpbGVfaW5mbyA9IGVjcnlwdGZzX2ZpbGVfdG9fcHJpdmF0ZShmaWxlKTsKIAlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlID0gZWNyeXB0ZnNfaW5vZGVfdG9fbG93ZXIoaW5vZGUpOworCWludCByYzsKIAotCWZwdXQobG93ZXJfZmlsZSk7CisJaWYgKChyYyA9IGVjcnlwdGZzX2Nsb3NlX2xvd2VyX2ZpbGUobG93ZXJfZmlsZSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgY2xvc2luZyBsb3dlcl9maWxlXG4iKTsKKwkJZ290byBvdXQ7CisJfQogCWlub2RlLT5pX2Jsb2NrcyA9IGxvd2VyX2lub2RlLT5pX2Jsb2NrczsKIAlrbWVtX2NhY2hlX2ZyZWUoZWNyeXB0ZnNfZmlsZV9pbmZvX2NhY2hlLCBmaWxlX2luZm8pOwotCXJldHVybiAwOworb3V0OgorCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvaW5vZGUuYyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKaW5kZXggZWZkZDJiNy4uMTFmNWU1MCAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvaW5vZGUuYworKysgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzX3N0YWNrLmg+CiAjaW5jbHVkZSAiZWNyeXB0ZnNfa2VybmVsLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpsb2NrX3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCkBAIC01Myw0OCArNTQsNiBAQAogCWRwdXQoZGlyKTsKIH0KIAotdm9pZCBlY3J5cHRmc19jb3B5X2lub2RlX3NpemUoc3RydWN0IGlub2RlICpkc3QsIGNvbnN0IHN0cnVjdCBpbm9kZSAqc3JjKQotewotCWlfc2l6ZV93cml0ZShkc3QsIGlfc2l6ZV9yZWFkKChzdHJ1Y3QgaW5vZGUgKilzcmMpKTsKLQlkc3QtPmlfYmxvY2tzID0gc3JjLT5pX2Jsb2NrczsKLX0KLQotdm9pZCBlY3J5cHRmc19jb3B5X2F0dHJfYXRpbWUoc3RydWN0IGlub2RlICpkZXN0LCBjb25zdCBzdHJ1Y3QgaW5vZGUgKnNyYykKLXsKLQlkZXN0LT5pX2F0aW1lID0gc3JjLT5pX2F0aW1lOwotfQotCi1zdGF0aWMgdm9pZCBlY3J5cHRmc19jb3B5X2F0dHJfdGltZXMoc3RydWN0IGlub2RlICpkZXN0LAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGlub2RlICpzcmMpCi17Ci0JZGVzdC0+aV9hdGltZSA9IHNyYy0+aV9hdGltZTsKLQlkZXN0LT5pX210aW1lID0gc3JjLT5pX210aW1lOwotCWRlc3QtPmlfY3RpbWUgPSBzcmMtPmlfY3RpbWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGVjcnlwdGZzX2NvcHlfYXR0cl90aW1lc2l6ZXMoc3RydWN0IGlub2RlICpkZXN0LAotCQkJCQkgY29uc3Qgc3RydWN0IGlub2RlICpzcmMpCi17Ci0JZGVzdC0+aV9hdGltZSA9IHNyYy0+aV9hdGltZTsKLQlkZXN0LT5pX210aW1lID0gc3JjLT5pX210aW1lOwotCWRlc3QtPmlfY3RpbWUgPSBzcmMtPmlfY3RpbWU7Ci0JZWNyeXB0ZnNfY29weV9pbm9kZV9zaXplKGRlc3QsIHNyYyk7Ci19Ci0KLXZvaWQgZWNyeXB0ZnNfY29weV9hdHRyX2FsbChzdHJ1Y3QgaW5vZGUgKmRlc3QsIGNvbnN0IHN0cnVjdCBpbm9kZSAqc3JjKQotewotCWRlc3QtPmlfbW9kZSA9IHNyYy0+aV9tb2RlOwotCWRlc3QtPmlfbmxpbmsgPSBzcmMtPmlfbmxpbms7Ci0JZGVzdC0+aV91aWQgPSBzcmMtPmlfdWlkOwotCWRlc3QtPmlfZ2lkID0gc3JjLT5pX2dpZDsKLQlkZXN0LT5pX3JkZXYgPSBzcmMtPmlfcmRldjsKLQlkZXN0LT5pX2F0aW1lID0gc3JjLT5pX2F0aW1lOwotCWRlc3QtPmlfbXRpbWUgPSBzcmMtPmlfbXRpbWU7Ci0JZGVzdC0+aV9jdGltZSA9IHNyYy0+aV9jdGltZTsKLQlkZXN0LT5pX2Jsa2JpdHMgPSBzcmMtPmlfYmxrYml0czsKLQlkZXN0LT5pX2ZsYWdzID0gc3JjLT5pX2ZsYWdzOwotfQotCiAvKioKICAqIGVjcnlwdGZzX2NyZWF0ZV91bmRlcmx5aW5nX2ZpbGUKICAqIEBsb3dlcl9kaXJfaW5vZGU6IGlub2RlIG9mIHRoZSBwYXJlbnQgaW4gdGhlIGxvd2VyIGZzIG9mIHRoZSBuZXcgZmlsZQpAQCAtMTcxLDggKzEzMCw4IEBACiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkZhaWx1cmUgaW4gZWNyeXB0ZnNfaW50ZXJwb3NlXG4iKTsKIAkJZ290byBvdXRfbG9jazsKIAl9Ci0JZWNyeXB0ZnNfY29weV9hdHRyX3RpbWVzaXplcyhkaXJlY3RvcnlfaW5vZGUsCi0JCQkJICAgICBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKKwlmc3N0YWNrX2NvcHlfYXR0cl90aW1lcyhkaXJlY3RvcnlfaW5vZGUsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOworCWZzc3RhY2tfY29weV9pbm9kZV9zaXplKGRpcmVjdG9yeV9pbm9kZSwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CiBvdXRfbG9jazoKIAl1bmxvY2tfZGlyKGxvd2VyX2Rpcl9kZW50cnkpOwogb3V0OgpAQCAtMTk2LDcgKzE1NSw3IEBACiAJc3RydWN0IGVjcnlwdGZzX2ZpbGVfaW5mbyB0bXBfZmlsZV9pbmZvOwogCiAJbWVtc2V0KCZmYWtlX2ZpbGUsIDAsIHNpemVvZihmYWtlX2ZpbGUpKTsKLQlmYWtlX2ZpbGUuZl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnk7CisJZmFrZV9maWxlLmZfcGF0aC5kZW50cnkgPSBlY3J5cHRmc19kZW50cnk7CiAJbWVtc2V0KCZ0bXBfZmlsZV9pbmZvLCAwLCBzaXplb2YodG1wX2ZpbGVfaW5mbykpOwogCWVjcnlwdGZzX3NldF9maWxlX3ByaXZhdGUoJmZha2VfZmlsZSwgJnRtcF9maWxlX2luZm8pOwogCWVjcnlwdGZzX3NldF9maWxlX2xvd2VyKCZmYWtlX2ZpbGUsIGxvd2VyX2ZpbGUpOwpAQCAtMjMxLDcgKzE5MCw2IEBACiAJaW50IGxvd2VyX2ZsYWdzOwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0OwogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKLQlzdHJ1Y3QgZGVudHJ5ICp0bG93ZXJfZGVudHJ5ID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZSAqbG93ZXJfZmlsZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqbG93ZXJfaW5vZGU7CiAJc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQ7CkBAIC0yNDEsMzAgKzE5OSwxOSBAQAogCQkJbG93ZXJfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJaW5vZGUgPSBlY3J5cHRmc19kZW50cnktPmRfaW5vZGU7CiAJY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGlub2RlKS0+Y3J5cHRfc3RhdDsKLQl0bG93ZXJfZGVudHJ5ID0gZGdldChsb3dlcl9kZW50cnkpOwotCWlmICghdGxvd2VyX2RlbnRyeSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGRnZXQnaW5nIGxvd2VyX2RlbnRyeVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KIAlsb3dlcl9mbGFncyA9ICgoT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQykgJiBPX0FDQ01PREUpIHwgT19SRFdSOwogI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKIAlsb3dlcl9mbGFncyB8PSBPX0xBUkdFRklMRTsKICNlbmRpZgogCWxvd2VyX21udCA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZWNyeXB0ZnNfZGVudHJ5KTsKLQltbnRnZXQobG93ZXJfbW50KTsKIAkvKiBDb3JyZXNwb25kaW5nIGZwdXQoKSBhdCBlbmQgb2YgdGhpcyBmdW5jdGlvbiAqLwotCWxvd2VyX2ZpbGUgPSBkZW50cnlfb3Blbih0bG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsIGxvd2VyX2ZsYWdzKTsKLQlpZiAoSVNfRVJSKGxvd2VyX2ZpbGUpKSB7Ci0JCXJjID0gUFRSX0VSUihsb3dlcl9maWxlKTsKKwlpZiAoKHJjID0gZWNyeXB0ZnNfb3Blbl9sb3dlcl9maWxlKCZsb3dlcl9maWxlLCBsb3dlcl9kZW50cnksIGxvd2VyX21udCwKKwkJCQkJICAgbG93ZXJfZmxhZ3MpKSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsCiAJCQkJIkVycm9yIG9wZW5pbmcgZGVudHJ5OyByYyA9IFslaV1cbiIsIHJjKTsKIAkJZ290byBvdXQ7CiAJfQotCS8qIGZwdXQobG93ZXJfZmlsZSkgc2hvdWxkIGhhbmRsZSB0aGUgcHV0cyBpZiB3ZSBkbyB0aGlzICovCi0JbG93ZXJfZmlsZS0+Zl9kZW50cnkgPSB0bG93ZXJfZGVudHJ5OwotCWxvd2VyX2ZpbGUtPmZfdmZzbW50ID0gbG93ZXJfbW50OwotCWxvd2VyX2lub2RlID0gdGxvd2VyX2RlbnRyeS0+ZF9pbm9kZTsKKwlsb3dlcl9pbm9kZSA9IGxvd2VyX2RlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoU19JU0RJUihlY3J5cHRmc19kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJUaGlzIGlzIGEgZGlyZWN0b3J5XG4iKTsKIAkJRUNSWVBURlNfQ0xFQVJfRkxBRyhjcnlwdF9zdGF0LT5mbGFncywgRUNSWVBURlNfRU5DUllQVEVEKTsKQEAgLTI4NSw3ICsyMzIsOCBAQAogCX0KIAlyYyA9IGdyb3dfZmlsZShlY3J5cHRmc19kZW50cnksIGxvd2VyX2ZpbGUsIGlub2RlLCBsb3dlcl9pbm9kZSk7CiBvdXRfZnB1dDoKLQlmcHV0KGxvd2VyX2ZpbGUpOworCWlmICgocmMgPSBlY3J5cHRmc19jbG9zZV9sb3dlcl9maWxlKGxvd2VyX2ZpbGUpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBjbG9zaW5nIGxvd2VyX2ZpbGVcbiIpOwogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTMzNiw3ICsyODQsNiBAQAogCXN0cnVjdCBkZW50cnkgKmxvd2VyX2Rpcl9kZW50cnk7CiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwogCXN0cnVjdCB2ZnNtb3VudCAqbG93ZXJfbW50OwotCXN0cnVjdCBkZW50cnkgKnRsb3dlcl9kZW50cnkgPSBOVUxMOwogCWNoYXIgKmVuY29kZWRfbmFtZTsKIAl1bnNpZ25lZCBpbnQgZW5jb2RlZF9uYW1lbGVuOwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKQEAgLTM0NywzNiArMjk0LDQxIEBACiAJbG93ZXJfZGlyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnktPmRfcGFyZW50KTsKIAlkZW50cnktPmRfb3AgPSAmZWNyeXB0ZnNfZG9wczsKIAlpZiAoKGRlbnRyeS0+ZF9uYW1lLmxlbiA9PSAxICYmICFzdHJjbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgIi4iKSkKLQkgICAgfHwgKGRlbnRyeS0+ZF9uYW1lLmxlbiA9PSAyICYmICFzdHJjbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgIi4uIikpKQotCQlnb3RvIG91dF9kcm9wOworCSAgICB8fCAoZGVudHJ5LT5kX25hbWUubGVuID09IDIKKwkJJiYgIXN0cmNtcChkZW50cnktPmRfbmFtZS5uYW1lLCAiLi4iKSkpIHsKKwkJZF9kcm9wKGRlbnRyeSk7CisJCWdvdG8gb3V0OworCX0KIAllbmNvZGVkX25hbWVsZW4gPSBlY3J5cHRmc19lbmNvZGVfZmlsZW5hbWUoY3J5cHRfc3RhdCwKIAkJCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sCiAJCQkJCQkgICAmZW5jb2RlZF9uYW1lKTsKIAlpZiAoZW5jb2RlZF9uYW1lbGVuIDwgMCkgewogCQlyYyA9IGVuY29kZWRfbmFtZWxlbjsKLQkJZ290byBvdXRfZHJvcDsKKwkJZF9kcm9wKGRlbnRyeSk7CisJCWdvdG8gb3V0OwogCX0KIAllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgImVuY29kZWRfbmFtZSA9IFslc107IGVuY29kZWRfbmFtZWxlbiAiCiAJCQkiPSBbJWRdXG4iLCBlbmNvZGVkX25hbWUsIGVuY29kZWRfbmFtZWxlbik7CiAJbG93ZXJfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZW5jb2RlZF9uYW1lLCBsb3dlcl9kaXJfZGVudHJ5LAogCQkJCSAgICAgIGVuY29kZWRfbmFtZWxlbiAtIDEpOwogCWtmcmVlKGVuY29kZWRfbmFtZSk7Ci0JbG93ZXJfbW50ID0gbW50Z2V0KGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZGVudHJ5LT5kX3BhcmVudCkpOwogCWlmIChJU19FUlIobG93ZXJfZGVudHJ5KSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFUlIgZnJvbSBsb3dlcl9kZW50cnlcbiIpOwogCQlyYyA9IFBUUl9FUlIobG93ZXJfZGVudHJ5KTsKLQkJZ290byBvdXRfZHJvcDsKKwkJZF9kcm9wKGRlbnRyeSk7CisJCWdvdG8gb3V0OwogCX0KKwlsb3dlcl9tbnQgPSBtbnRnZXQoZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyX21udChkZW50cnktPmRfcGFyZW50KSk7CiAJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJsb3dlcl9kZW50cnkgPSBbJXBdOyBsb3dlcl9kZW50cnktPiIKICAgICAgICAJCSJkX25hbWUubmFtZSA9IFslc11cbiIsIGxvd2VyX2RlbnRyeSwKIAkJbG93ZXJfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJbG93ZXJfaW5vZGUgPSBsb3dlcl9kZW50cnktPmRfaW5vZGU7Ci0JZWNyeXB0ZnNfY29weV9hdHRyX2F0aW1lKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CisJZnNzdGFja19jb3B5X2F0dHJfYXRpbWUoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIAlCVUdfT04oIWF0b21pY19yZWFkKCZsb3dlcl9kZW50cnktPmRfY291bnQpKTsKIAllY3J5cHRmc19zZXRfZGVudHJ5X3ByaXZhdGUoZGVudHJ5LAogCQkJCSAgICBrbWVtX2NhY2hlX2FsbG9jKGVjcnlwdGZzX2RlbnRyeV9pbmZvX2NhY2hlLAotCQkJCQkJICAgICBTTEFCX0tFUk5FTCkpOworCQkJCQkJICAgICBHRlBfS0VSTkVMKSk7CiAJaWYgKCFlY3J5cHRmc19kZW50cnlfdG9fcHJpdmF0ZShkZW50cnkpKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCkBAIC00MDgsMTYgKzM2MCwxMCBAQAogCQkJCSJhcyB3ZSAqdGhpbmsqIHdlIGFyZSBhYm91dCB0byB1bmxpbmtcbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0JdGxvd2VyX2RlbnRyeSA9IGRnZXQobG93ZXJfZGVudHJ5KTsKLQlpZiAoIXRsb3dlcl9kZW50cnkgfHwgSVNfRVJSKHRsb3dlcl9kZW50cnkpKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiQ2Fubm90IGRnZXQgbG93ZXJfZGVudHJ5XG4iKTsKLQkJZ290byBvdXRfZHB1dDsKLQl9CiAJLyogUmVsZWFzZWQgaW4gdGhpcyBmdW5jdGlvbiAqLwogCXBhZ2VfdmlydCA9CiAJICAgIChjaGFyICopa21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19oZWFkZXJfY2FjaGVfMiwKLQkJCQkgICAgIFNMQUJfVVNFUik7CisJCQkJICAgICBHRlBfVVNFUik7CiAJaWYgKCFwYWdlX3ZpcnQpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsCkBAIC00MjUsNyArMzcxLDcgQEAKIAkJZ290byBvdXRfZHB1dDsKIAl9CiAJbWVtc2V0KHBhZ2VfdmlydCwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKLQlyYyA9IGVjcnlwdGZzX3JlYWRfaGVhZGVyX3JlZ2lvbihwYWdlX3ZpcnQsIHRsb3dlcl9kZW50cnksIG5kLT5tbnQpOworCXJjID0gZWNyeXB0ZnNfcmVhZF9oZWFkZXJfcmVnaW9uKHBhZ2VfdmlydCwgbG93ZXJfZGVudHJ5LCBuZC0+bW50KTsKIAljcnlwdF9zdGF0ID0gJmVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZGVudHJ5LT5kX2lub2RlKS0+Y3J5cHRfc3RhdDsKIAlpZiAoIUVDUllQVEZTX0NIRUNLX0ZMQUcoY3J5cHRfc3RhdC0+ZmxhZ3MsIEVDUllQVEZTX1BPTElDWV9BUFBMSUVEKSkKIAkJZWNyeXB0ZnNfc2V0X2RlZmF1bHRfc2l6ZXMoY3J5cHRfc3RhdCk7CkBAIC00NDgsOSArMzk0LDYgQEAKIAogb3V0X2RwdXQ6CiAJZHB1dChsb3dlcl9kZW50cnkpOwotCWlmICh0bG93ZXJfZGVudHJ5KQotCQlkcHV0KHRsb3dlcl9kZW50cnkpOwotb3V0X2Ryb3A6CiAJZF9kcm9wKGRlbnRyeSk7CiBvdXQ6CiAJcmV0dXJuIEVSUl9QVFIocmMpOwpAQCAtNDc4LDcgKzQyMSw4IEBACiAJcmMgPSBlY3J5cHRmc19pbnRlcnBvc2UobG93ZXJfbmV3X2RlbnRyeSwgbmV3X2RlbnRyeSwgZGlyLT5pX3NiLCAwKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2xvY2s7Ci0JZWNyeXB0ZnNfY29weV9hdHRyX3RpbWVzaXplcyhkaXIsIGxvd2VyX25ld19kZW50cnktPmRfaW5vZGUpOworCWZzc3RhY2tfY29weV9hdHRyX3RpbWVzKGRpciwgbG93ZXJfbmV3X2RlbnRyeS0+ZF9pbm9kZSk7CisJZnNzdGFja19jb3B5X2lub2RlX3NpemUoZGlyLCBsb3dlcl9uZXdfZGVudHJ5LT5kX2lub2RlKTsKIAlvbGRfZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0KIAkJZWNyeXB0ZnNfaW5vZGVfdG9fbG93ZXIob2xkX2RlbnRyeS0+ZF9pbm9kZSktPmlfbmxpbms7CiAJaV9zaXplX3dyaXRlKG5ld19kZW50cnktPmRfaW5vZGUsIGZpbGVfc2l6ZV9zYXZlKTsKQEAgLTQ4Niw4ICs0MzAsOSBAQAogCXVubG9ja19kaXIobG93ZXJfZGlyX2RlbnRyeSk7CiAJZHB1dChsb3dlcl9uZXdfZGVudHJ5KTsKIAlkcHV0KGxvd2VyX29sZF9kZW50cnkpOwotCWlmICghbmV3X2RlbnRyeS0+ZF9pbm9kZSkKLQkJZF9kcm9wKG5ld19kZW50cnkpOworCWRfZHJvcChsb3dlcl9vbGRfZGVudHJ5KTsKKwlkX2Ryb3AobmV3X2RlbnRyeSk7CisJZF9kcm9wKG9sZF9kZW50cnkpOwogCXJldHVybiByYzsKIH0KIApAQCAtNTAwLDEwICs0NDUsMTAgQEAKIAlsb2NrX3BhcmVudChsb3dlcl9kZW50cnkpOwogCXJjID0gdmZzX3VubGluayhsb3dlcl9kaXJfaW5vZGUsIGxvd2VyX2RlbnRyeSk7CiAJaWYgKHJjKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGluIHZmc191bmxpbmtcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluIHZmc191bmxpbms7IHJjID0gWyVkXVxuIiwgcmMpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQotCWVjcnlwdGZzX2NvcHlfYXR0cl90aW1lcyhkaXIsIGxvd2VyX2Rpcl9pbm9kZSk7CisJZnNzdGFja19jb3B5X2F0dHJfdGltZXMoZGlyLCBsb3dlcl9kaXJfaW5vZGUpOwogCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9CiAJCWVjcnlwdGZzX2lub2RlX3RvX2xvd2VyKGRlbnRyeS0+ZF9pbm9kZSktPmlfbmxpbms7CiAJZGVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lOwpAQCAtNTQyLDcgKzQ4Nyw4IEBACiAJcmMgPSBlY3J5cHRmc19pbnRlcnBvc2UobG93ZXJfZGVudHJ5LCBkZW50cnksIGRpci0+aV9zYiwgMCk7CiAJaWYgKHJjKQogCQlnb3RvIG91dF9sb2NrOwotCWVjcnlwdGZzX2NvcHlfYXR0cl90aW1lc2l6ZXMoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKKwlmc3N0YWNrX2NvcHlfYXR0cl90aW1lcyhkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOworCWZzc3RhY2tfY29weV9pbm9kZV9zaXplKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CiBvdXRfbG9jazoKIAl1bmxvY2tfZGlyKGxvd2VyX2Rpcl9kZW50cnkpOwogCWRwdXQobG93ZXJfZGVudHJ5KTsKQEAgLTU2NSw3ICs1MTEsOCBAQAogCXJjID0gZWNyeXB0ZnNfaW50ZXJwb3NlKGxvd2VyX2RlbnRyeSwgZGVudHJ5LCBkaXItPmlfc2IsIDApOwogCWlmIChyYykKIAkJZ290byBvdXQ7Ci0JZWNyeXB0ZnNfY29weV9hdHRyX3RpbWVzaXplcyhkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOworCWZzc3RhY2tfY29weV9hdHRyX3RpbWVzKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CisJZnNzdGFja19jb3B5X2lub2RlX3NpemUoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIAlkaXItPmlfbmxpbmsgPSBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlLT5pX25saW5rOwogb3V0OgogCXVubG9ja19kaXIobG93ZXJfZGlyX2RlbnRyeSk7CkBAIC01NzYsNDEgKzUyMywyNCBAQAogCiBzdGF0aWMgaW50IGVjcnlwdGZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgZGVudHJ5ICp0ZGVudHJ5ID0gTlVMTDsKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7Ci0Jc3RydWN0IGRlbnRyeSAqdGxvd2VyX2RlbnRyeSA9IE5VTEw7CiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGlyX2RlbnRyeTsKKwlpbnQgcmM7CiAKIAlsb3dlcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5KTsKLQlpZiAoISh0ZGVudHJ5ID0gZGdldChkZW50cnkpKSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGRnZXQnaW5nIGRlbnRyeSBbJXBdXG4iLAotCQkJCWRlbnRyeSk7Ci0JCWdvdG8gb3V0OwotCX0KKwlkZ2V0KGRlbnRyeSk7CiAJbG93ZXJfZGlyX2RlbnRyeSA9IGxvY2tfcGFyZW50KGxvd2VyX2RlbnRyeSk7Ci0JaWYgKCEodGxvd2VyX2RlbnRyeSA9IGRnZXQobG93ZXJfZGVudHJ5KSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBkZ2V0J2luZyBsb3dlcl9kZW50cnkgIgotCQkJCSJbJXBdXG4iLCBsb3dlcl9kZW50cnkpOwotCQlnb3RvIG91dDsKLQl9CisJZGdldChsb3dlcl9kZW50cnkpOwogCXJjID0gdmZzX3JtZGlyKGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUsIGxvd2VyX2RlbnRyeSk7Ci0JaWYgKCFyYykgewotCQlkX2RlbGV0ZSh0bG93ZXJfZGVudHJ5KTsKLQkJdGxvd2VyX2RlbnRyeSA9IE5VTEw7Ci0JfQotCWVjcnlwdGZzX2NvcHlfYXR0cl90aW1lcyhkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOworCWRwdXQobG93ZXJfZGVudHJ5KTsKKwlpZiAoIXJjKQorCQlkX2RlbGV0ZShsb3dlcl9kZW50cnkpOworCWZzc3RhY2tfY29weV9hdHRyX3RpbWVzKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CiAJZGlyLT5pX25saW5rID0gbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluazsKIAl1bmxvY2tfZGlyKGxvd2VyX2Rpcl9kZW50cnkpOwogCWlmICghcmMpCiAJCWRfZHJvcChkZW50cnkpOwotb3V0OgotCWlmICh0ZGVudHJ5KQotCQlkcHV0KHRkZW50cnkpOwotCWlmICh0bG93ZXJfZGVudHJ5KQotCQlkcHV0KHRsb3dlcl9kZW50cnkpOworCWRwdXQoZGVudHJ5KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTYyOSw3ICs1NTksOCBAQAogCXJjID0gZWNyeXB0ZnNfaW50ZXJwb3NlKGxvd2VyX2RlbnRyeSwgZGVudHJ5LCBkaXItPmlfc2IsIDApOwogCWlmIChyYykKIAkJZ290byBvdXQ7Ci0JZWNyeXB0ZnNfY29weV9hdHRyX3RpbWVzaXplcyhkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOworCWZzc3RhY2tfY29weV9hdHRyX3RpbWVzKGRpciwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CisJZnNzdGFja19jb3B5X2lub2RlX3NpemUoZGlyLCBsb3dlcl9kaXJfZGVudHJ5LT5kX2lub2RlKTsKIG91dDoKIAl1bmxvY2tfZGlyKGxvd2VyX2Rpcl9kZW50cnkpOwogCWlmICghZGVudHJ5LT5kX2lub2RlKQpAQCAtNjU4LDExICs1ODksMTMgQEAKIAkJCWxvd2VyX25ld19kaXJfZGVudHJ5LT5kX2lub2RlLCBsb3dlcl9uZXdfZGVudHJ5KTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2xvY2s7Ci0JZWNyeXB0ZnNfY29weV9hdHRyX2FsbChuZXdfZGlyLCBsb3dlcl9uZXdfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CisJZnNzdGFja19jb3B5X2F0dHJfYWxsKG5ld19kaXIsIGxvd2VyX25ld19kaXJfZGVudHJ5LT5kX2lub2RlLCBOVUxMKTsKIAlpZiAobmV3X2RpciAhPSBvbGRfZGlyKQotCQllY3J5cHRmc19jb3B5X2F0dHJfYWxsKG9sZF9kaXIsIGxvd2VyX29sZF9kaXJfZGVudHJ5LT5kX2lub2RlKTsKKwkJZnNzdGFja19jb3B5X2F0dHJfYWxsKG9sZF9kaXIsIGxvd2VyX29sZF9kaXJfZGVudHJ5LT5kX2lub2RlLCBOVUxMKTsKIG91dF9sb2NrOgogCXVubG9ja19yZW5hbWUobG93ZXJfb2xkX2Rpcl9kZW50cnksIGxvd2VyX25ld19kaXJfZGVudHJ5KTsKKwlkcHV0KGxvd2VyX25ld19kZW50cnktPmRfcGFyZW50KTsKKwlkcHV0KGxvd2VyX29sZF9kZW50cnktPmRfcGFyZW50KTsKIAlkcHV0KGxvd2VyX25ld19kZW50cnkpOwogCWRwdXQobG93ZXJfb2xkX2RlbnRyeSk7CiAJcmV0dXJuIHJjOwpAQCAtNzE0LDggKzY0Nyw4IEBACiAJCQkJcmMgPSAtRUZBVUxUOwogCQl9CiAJCWtmcmVlKGRlY29kZWRfbmFtZSk7Ci0JCWVjcnlwdGZzX2NvcHlfYXR0cl9hdGltZShkZW50cnktPmRfaW5vZGUsCi0JCQkJCSBsb3dlcl9kZW50cnktPmRfaW5vZGUpOworCQlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShkZW50cnktPmRfaW5vZGUsCisJCQkJCWxvd2VyX2RlbnRyeS0+ZF9pbm9kZSk7CiAJfQogb3V0X2ZyZWVfbG93ZXJfYnVmOgogCWtmcmVlKGxvd2VyX2J1Zik7CkBAIC04MjEsMjMgKzc1NCwyMiBAQAogCSAqIHRoZSBmaWxlIGluIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gc28gdGhhdCB0aGUKIAkgKiB0cnVuY2F0aW9uIGhhcyBhbiBlZmZlY3QgdGhlcmUgYXMgd2VsbC4gKi8KIAltZW1zZXQoJmZha2VfZWNyeXB0ZnNfZmlsZSwgMCwgc2l6ZW9mKGZha2VfZWNyeXB0ZnNfZmlsZSkpOwotCWZha2VfZWNyeXB0ZnNfZmlsZS5mX2RlbnRyeSA9IGRlbnRyeTsKKwlmYWtlX2VjcnlwdGZzX2ZpbGUuZl9wYXRoLmRlbnRyeSA9IGRlbnRyeTsKIAkvKiBSZWxlYXNlZCBhdCBvdXRfZnJlZTogbGFiZWwgKi8KIAllY3J5cHRmc19zZXRfZmlsZV9wcml2YXRlKCZmYWtlX2VjcnlwdGZzX2ZpbGUsCiAJCQkJICBrbWVtX2NhY2hlX2FsbG9jKGVjcnlwdGZzX2ZpbGVfaW5mb19jYWNoZSwKLQkJCQkJCSAgIFNMQUJfS0VSTkVMKSk7CisJCQkJCQkgICBHRlBfS0VSTkVMKSk7CiAJaWYgKHVubGlrZWx5KCFlY3J5cHRmc19maWxlX3RvX3ByaXZhdGUoJmZha2VfZWNyeXB0ZnNfZmlsZSkpKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCWxvd2VyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnkpOwogCS8qIFRoaXMgZGdldCAmIG1udGdldCBpcyByZWxlYXNlZCB0aHJvdWdoIGZwdXQgYXQgb3V0X2ZwdXQ6ICovCi0JZGdldChsb3dlcl9kZW50cnkpOwogCWxvd2VyX21udCA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZGVudHJ5KTsKLQltbnRnZXQobG93ZXJfbW50KTsKLQlsb3dlcl9maWxlID0gZGVudHJ5X29wZW4obG93ZXJfZGVudHJ5LCBsb3dlcl9tbnQsIE9fUkRXUik7Ci0JaWYgKHVubGlrZWx5KElTX0VSUihsb3dlcl9maWxlKSkpIHsKLQkJcmMgPSBQVFJfRVJSKGxvd2VyX2ZpbGUpOworCWlmICgocmMgPSBlY3J5cHRmc19vcGVuX2xvd2VyX2ZpbGUoJmxvd2VyX2ZpbGUsIGxvd2VyX2RlbnRyeSwgbG93ZXJfbW50LAorCQkJCQkgICBPX1JEV1IpKSkgeworCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsCisJCQkJIkVycm9yIG9wZW5pbmcgZGVudHJ5OyByYyA9IFslaV1cbiIsIHJjKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAJZWNyeXB0ZnNfc2V0X2ZpbGVfbG93ZXIoJmZha2VfZWNyeXB0ZnNfZmlsZSwgbG93ZXJfZmlsZSk7CkBAIC04NzksNyArODExLDggQEAKIAkJPSBDVVJSRU5UX1RJTUU7CiAJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKIG91dF9mcHV0OgotCWZwdXQobG93ZXJfZmlsZSk7CisJaWYgKChyYyA9IGVjcnlwdGZzX2Nsb3NlX2xvd2VyX2ZpbGUobG93ZXJfZmlsZSkpKQorCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGNsb3NpbmcgbG93ZXJfZmlsZVxuIik7CiBvdXRfZnJlZToKIAlpZiAoZWNyeXB0ZnNfZmlsZV90b19wcml2YXRlKCZmYWtlX2VjcnlwdGZzX2ZpbGUpKQogCQlrbWVtX2NhY2hlX2ZyZWUoZWNyeXB0ZnNfZmlsZV9pbmZvX2NhY2hlLApAQCAtOTQ1LDcgKzg3OCw3IEBACiAJfQogCXJjID0gbm90aWZ5X2NoYW5nZShsb3dlcl9kZW50cnksIGlhKTsKIG91dDoKLQllY3J5cHRmc19jb3B5X2F0dHJfYWxsKGlub2RlLCBsb3dlcl9pbm9kZSk7CisJZnNzdGFja19jb3B5X2F0dHJfYWxsKGlub2RlLCBsb3dlcl9pbm9kZSwgTlVMTCk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwppbmRleCBiYTQ1NDc4Li43NDVjMGYxIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCS8qIFJlbGVhc2VkOiB3aXBlX2F1dGhfdG9rX2xpc3QgY2FsbGVkIGluIGVjcnlwdGZzX3BhcnNlX3BhY2tldF9zZXQgb3IKIAkgKiBhdCBlbmQgb2YgZnVuY3Rpb24gdXBvbiBmYWlsdXJlICovCiAJYXV0aF90b2tfbGlzdF9pdGVtID0KLQkgICAga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19hdXRoX3Rva19saXN0X2l0ZW1fY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwkgICAga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19hdXRoX3Rva19saXN0X2l0ZW1fY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghYXV0aF90b2tfbGlzdF9pdGVtKSB7CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQlyYyA9IC1FTk9NRU07CkBAIC00NTgsMTQgKzQ1OCwxNiBAQAogc3RhdGljIGludCBkZWNyeXB0X3Nlc3Npb25fa2V5KHN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2ssCiAJCQkgICAgICAgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQpCiB7Ci0JaW50IHJjID0gMDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfcGFzc3dvcmQgKnBhc3N3b3JkX3NfcHRyOwotCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBOVUxMOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzcmNfc2dbMl0sIGRzdF9zZ1syXTsKIAlzdHJ1Y3QgbXV0ZXggKnRmbV9tdXRleCA9IE5VTEw7CiAJLyogVE9ETzogVXNlIHZpcnRfdG9fc2NhdHRlcmxpc3QgZm9yIHRoZXNlICovCiAJY2hhciAqZW5jcnlwdGVkX3Nlc3Npb25fa2V5OwogCWNoYXIgKnNlc3Npb25fa2V5OworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0geworCQkuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAKKwl9OworCWludCByYyA9IDA7CiAKIAlwYXNzd29yZF9zX3B0ciA9ICZhdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQ7CiAJaWYgKEVDUllQVEZTX0NIRUNLX0ZMQUcocGFzc3dvcmRfc19wdHItPmZsYWdzLApAQCAtNDgyLDMwICs0ODQsMzcgQEAKIAlpZiAoIXN0cmNtcChjcnlwdF9zdGF0LT5jaXBoZXIsCiAJCSAgICBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSkKIAkgICAgJiYgY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2tleV90Zm0pIHsKLQkJdGZtID0gY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2tleV90Zm07CisJCWRlc2MudGZtID0gY3J5cHRfc3RhdC0+bW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2tleV90Zm07CiAJCXRmbV9tdXRleCA9ICZjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbV9tdXRleDsKIAl9IGVsc2UgewotCQl0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKGNyeXB0X3N0YXQtPmNpcGhlciwKLQkJCQkgICAgICAgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOwotCQlpZiAoIXRmbSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhbGxvY2F0aW5nIGNyeXB0byBjb250ZXh0XG4iKTsKLQkJCXJjID0gLUVOT01FTTsKKwkJY2hhciAqZnVsbF9hbGdfbmFtZTsKKworCQlyYyA9IGVjcnlwdGZzX2NyeXB0b19hcGlfYWxnaWZ5X2NpcGhlcl9uYW1lKCZmdWxsX2FsZ19uYW1lLAorCQkJCQkJCSAgICBjcnlwdF9zdGF0LT5jaXBoZXIsCisJCQkJCQkJICAgICJlY2IiKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJCWRlc2MudGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihmdWxsX2FsZ19uYW1lLCAwLAorCQkJCQkJICBDUllQVE9fQUxHX0FTWU5DKTsKKwkJa2ZyZWUoZnVsbF9hbGdfbmFtZSk7CisJCWlmIChJU19FUlIoZGVzYy50Zm0pKSB7CisJCQlyYyA9IFBUUl9FUlIoZGVzYy50Zm0pOworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhbGxvY2F0aW5nIGNyeXB0byBjb250ZXh0OyAiCisJCQkgICAgICAgInJjID0gWyVkXVxuIiwgcmMpOwogCQkJZ290byBvdXQ7CiAJCX0KLQl9Ci0JaWYgKHBhc3N3b3JkX3NfcHRyLT5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleV9ieXRlcwotCSAgICA8IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHRmbSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2Vzc2lvbiBrZXkgZW5jcnlwdGlvbiBrZXkgaXMgWyVkXSBieXRlczsgIgotCQkgICAgICAgIm1pbmltdW0ga2V5c2l6ZSBmb3Igc2VsZWN0ZWQgY2lwaGVyIGlzIFslZF0gYnl0ZXMuXG4iLAotCQkgICAgICAgcGFzc3dvcmRfc19wdHItPnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5X2J5dGVzLAotCQkgICAgICAgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUodGZtKSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7CisJCWNyeXB0b19ibGtjaXBoZXJfc2V0X2ZsYWdzKGRlc2MudGZtLCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7CiAJfQogCWlmICh0Zm1fbXV0ZXgpCiAJCW11dGV4X2xvY2sodGZtX211dGV4KTsKLQljcnlwdG9fY2lwaGVyX3NldGtleSh0Zm0sIHBhc3N3b3JkX3NfcHRyLT5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKLQkJCSAgICAgY3J5cHRfc3RhdC0+a2V5X3NpemUpOworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoZGVzYy50Zm0sCisJCQkJICAgICBwYXNzd29yZF9zX3B0ci0+c2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXksCisJCQkJICAgICBjcnlwdF9zdGF0LT5rZXlfc2l6ZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIHNldHRpbmcga2V5IGZvciBjcnlwdG8gY29udGV4dFxuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV90Zm07CisJfQogCS8qIFRPRE86IHZpcnRfdG9fc2NhdHRlcmxpc3QgKi8KIAllbmNyeXB0ZWRfc2Vzc2lvbl9rZXkgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWVuY3J5cHRlZF9zZXNzaW9uX2tleSkgewpAQCAtNTMxLDkgKzU0MCwxMiBAQAogCWF1dGhfdG9rLT5zZXNzaW9uX2tleS5kZWNyeXB0ZWRfa2V5X3NpemUgPQogCSAgICBhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleV9zaXplOwogCWRzdF9zZ1swXS5sZW5ndGggPSBhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleV9zaXplOwotCS8qIFRPRE86IEhhbmRsZSBlcnJvciBjb25kaXRpb24gKi8KLQljcnlwdG9fY2lwaGVyX2RlY3J5cHQodGZtLCBkc3Rfc2csIHNyY19zZywKLQkJCSAgICAgIGF1dGhfdG9rLT5zZXNzaW9uX2tleS5lbmNyeXB0ZWRfa2V5X3NpemUpOworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0KCZkZXNjLCBkc3Rfc2csIHNyY19zZywKKwkJCQkgICAgICBhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleV9zaXplKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBkZWNyeXB0aW5nOyByYyA9IFslZF1cbiIsIHJjKTsKKwkJZ290byBvdXRfZnJlZV9tZW1vcnk7CisJfQogCWF1dGhfdG9rLT5zZXNzaW9uX2tleS5kZWNyeXB0ZWRfa2V5X3NpemUgPQogCSAgICBhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleV9zaXplOwogCW1lbWNweShhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZGVjcnlwdGVkX2tleSwgc2Vzc2lvbl9rZXksCkBAIC01NDYsNiArNTU4LDcgQEAKIAlpZiAoZWNyeXB0ZnNfdmVyYm9zaXR5ID4gMCkKIAkJZWNyeXB0ZnNfZHVtcF9oZXgoY3J5cHRfc3RhdC0+a2V5LAogCQkJCSAgY3J5cHRfc3RhdC0+a2V5X3NpemUpOworb3V0X2ZyZWVfbWVtb3J5OgogCW1lbXNldChlbmNyeXB0ZWRfc2Vzc2lvbl9rZXksIDAsIFBBR0VfQ0FDSEVfU0laRSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWVuY3J5cHRlZF9zZXNzaW9uX2tleSk7CiAJbWVtc2V0KHNlc3Npb25fa2V5LCAwLCBQQUdFX0NBQ0hFX1NJWkUpOwpAQCAtNTU0LDcgKzU2Nyw3IEBACiAJaWYgKHRmbV9tdXRleCkKIAkJbXV0ZXhfdW5sb2NrKHRmbV9tdXRleCk7CiAJZWxzZQotCQljcnlwdG9fZnJlZV90Zm0odGZtKTsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGRlc2MudGZtKTsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC04MDMsMTkgKzgxNiwyMSBAQAogCQkgICBzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKIAkJICAgc3RydWN0IGVjcnlwdGZzX2tleV9yZWNvcmQgKmtleV9yZWMsIHNpemVfdCAqcGFja2V0X3NpemUpCiB7Ci0JaW50IHJjID0gMDsKLQogCXNpemVfdCBpOwogCXNpemVfdCBzaWduYXR1cmVfaXNfdmFsaWQgPSAwOwogCXNpemVfdCBlbmNyeXB0ZWRfc2Vzc2lvbl9rZXlfdmFsaWQgPSAwOwogCWNoYXIgc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXlbRUNSWVBURlNfTUFYX0tFWV9CWVRFU107CiAJc3RydWN0IHNjYXR0ZXJsaXN0IGRlc3Rfc2dbMl07CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNyY19zZ1syXTsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gTlVMTDsKIAlzdHJ1Y3QgbXV0ZXggKnRmbV9tdXRleCA9IE5VTEw7CiAJc2l6ZV90IGtleV9yZWNfc2l6ZTsKIAlzaXplX3QgcGFja2V0X3NpemVfbGVuZ3RoOwogCXNpemVfdCBjaXBoZXJfY29kZTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsKKwkJLnRmbSA9IE5VTEwsCisJCS5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUAorCX07CisJaW50IHJjID0gMDsKIAogCSgqcGFja2V0X3NpemUpID0gMDsKIAkvKiBDaGVjayBmb3IgYSB2YWxpZCBzaWduYXR1cmUgb24gdGhlIGF1dGhfdG9rICovCkBAIC04ODIsMzMgKzg5Nyw0OCBAQAogCWlmICghc3RyY21wKGNyeXB0X3N0YXQtPmNpcGhlciwKIAkJICAgIGNyeXB0X3N0YXQtPm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lKQogCSAgICAmJiBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbSkgewotCQl0Zm0gPSBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbTsKKwkJZGVzYy50Zm0gPSBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbTsKIAkJdGZtX211dGV4ID0gJmNyeXB0X3N0YXQtPm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9rZXlfdGZtX211dGV4OwotCX0gZWxzZQotCQl0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKGNyeXB0X3N0YXQtPmNpcGhlciwgMCk7Ci0JaWYgKCF0Zm0pIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiQ291bGQgbm90IGluaXRpYWxpemUgY3J5cHRvICIKLQkJCQkiY29udGV4dCBmb3IgY2lwaGVyIFslc11cbiIsCi0JCQkJY3J5cHRfc3RhdC0+Y2lwaGVyKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQljaGFyICpmdWxsX2FsZ19uYW1lOworCisJCXJjID0gZWNyeXB0ZnNfY3J5cHRvX2FwaV9hbGdpZnlfY2lwaGVyX25hbWUoJmZ1bGxfYWxnX25hbWUsCisJCQkJCQkJICAgIGNyeXB0X3N0YXQtPmNpcGhlciwKKwkJCQkJCQkgICAgImVjYiIpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwkJZGVzYy50Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKGZ1bGxfYWxnX25hbWUsIDAsCisJCQkJCQkgIENSWVBUT19BTEdfQVNZTkMpOworCQlrZnJlZShmdWxsX2FsZ19uYW1lKTsKKwkJaWYgKElTX0VSUihkZXNjLnRmbSkpIHsKKwkJCXJjID0gUFRSX0VSUihkZXNjLnRmbSk7CisJCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBjcnlwdG8gIgorCQkJCQkiY29udGV4dCBmb3IgY2lwaGVyIFslc107IHJjID0gWyVkXVxuIiwKKwkJCQkJY3J5cHRfc3RhdC0+Y2lwaGVyLCByYyk7CisJCQlnb3RvIG91dDsKKwkJfQorCQljcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncyhkZXNjLnRmbSwgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOwogCX0KIAlpZiAodGZtX211dGV4KQogCQltdXRleF9sb2NrKHRmbV9tdXRleCk7Ci0JcmMgPSBjcnlwdG9fY2lwaGVyX3NldGtleSh0Zm0sIHNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAotCQkJCSAgY3J5cHRfc3RhdC0+a2V5X3NpemUpOworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoZGVzYy50Zm0sIHNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQkJCSAgICAgY3J5cHRfc3RhdC0+a2V5X3NpemUpOwogCWlmIChyYyA8IDApIHsKIAkJaWYgKHRmbV9tdXRleCkKIAkJCW11dGV4X3VubG9jayh0Zm1fbXV0ZXgpOwogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBzZXR0aW5nIGtleSBmb3IgY3J5cHRvICIKLQkJCQkiY29udGV4dFxuIik7CisJCQkJImNvbnRleHQ7IHJjID0gWyVkXVxuIiwgcmMpOwogCQlnb3RvIG91dDsKIAl9CiAJcmMgPSAwOwogCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiRW5jcnlwdGluZyBbJWRdIGJ5dGVzIG9mIHRoZSBrZXlcbiIsCiAJCQljcnlwdF9zdGF0LT5rZXlfc2l6ZSk7Ci0JY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHRmbSwgZGVzdF9zZywgc3JjX3NnLAotCQkJICAgICAgKCprZXlfcmVjKS5lbmNfa2V5X3NpemUpOworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCBkZXN0X3NnLCBzcmNfc2csCisJCQkJICAgICAgKCprZXlfcmVjKS5lbmNfa2V5X3NpemUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGVuY3J5cHRpbmc7IHJjID0gWyVkXVxuIiwgcmMpOworCQlnb3RvIG91dDsKKwl9CiAJaWYgKHRmbV9tdXRleCkKIAkJbXV0ZXhfdW5sb2NrKHRmbV9tdXRleCk7CiAJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJUaGlzIHNob3VsZCBiZSB0aGUgZW5jcnlwdGVkIGtleTpcbiIpOwpAQCAtOTcxLDggKzEwMDEsOCBAQAogCSAgICAgICAoKmtleV9yZWMpLmVuY19rZXlfc2l6ZSk7CiAJKCpwYWNrZXRfc2l6ZSkgKz0gKCprZXlfcmVjKS5lbmNfa2V5X3NpemU7CiBvdXQ6Ci0JaWYgKHRmbSAmJiAhdGZtX211dGV4KQotCQljcnlwdG9fZnJlZV90Zm0odGZtKTsKKwlpZiAoZGVzYy50Zm0gJiYgIXRmbV9tdXRleCkKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGRlc2MudGZtKTsKIAlpZiAocmMpCiAJCSgqcGFja2V0X3NpemUpID0gMDsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tYWluLmMgYi9mcy9lY3J5cHRmcy9tYWluLmMKaW5kZXggN2ExMWI4YS4uZDA1NDFhZTggMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21haW4uYworKysgYi9mcy9lY3J5cHRmcy9tYWluLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvZnNfc3RhY2suaD4KICNpbmNsdWRlICJlY3J5cHRmc19rZXJuZWwuaCIKIAogLyoqCkBAIC0xMDQsMTAgKzEwNSw3IEBACiAJCWlub2RlLT5pX29wID0gJmVjcnlwdGZzX2Rpcl9pb3BzOwogCWlmIChTX0lTRElSKGxvd2VyX2lub2RlLT5pX21vZGUpKQogCQlpbm9kZS0+aV9mb3AgPSAmZWNyeXB0ZnNfZGlyX2ZvcHM7Ci0JLyogVE9ETzogSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGlkZW50aWZ5IGlmIHRoZSBpbm9kZSBpcwotCSAqIHNwZWNpYWw/ICovCi0JaWYgKFNfSVNCTEsobG93ZXJfaW5vZGUtPmlfbW9kZSkgfHwgU19JU0NIUihsb3dlcl9pbm9kZS0+aV9tb2RlKSB8fAotCSAgICBTX0lTRklGTyhsb3dlcl9pbm9kZS0+aV9tb2RlKSB8fCBTX0lTU09DSyhsb3dlcl9pbm9kZS0+aV9tb2RlKSkKKwlpZiAoc3BlY2lhbF9maWxlKGxvd2VyX2lub2RlLT5pX21vZGUpKQogCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGxvd2VyX2lub2RlLT5pX21vZGUsCiAJCQkJICAgbG93ZXJfaW5vZGUtPmlfcmRldik7CiAJZGVudHJ5LT5kX29wID0gJmVjcnlwdGZzX2RvcHM7CkBAIC0xMTUsMTAgKzExMywxMCBAQAogCQlkX2FkZChkZW50cnksIGlub2RlKTsKIAllbHNlCiAJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JZWNyeXB0ZnNfY29weV9hdHRyX2FsbChpbm9kZSwgbG93ZXJfaW5vZGUpOworCWZzc3RhY2tfY29weV9hdHRyX2FsbChpbm9kZSwgbG93ZXJfaW5vZGUsIE5VTEwpOwogCS8qIFRoaXMgc2l6ZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGZvciByZWFsIGZpbGVzIHcvIGhlYWRlcnMgYW5kCiAJICogb3RoZXIgbWV0YWRhdGEgKi8KLQllY3J5cHRmc19jb3B5X2lub2RlX3NpemUoaW5vZGUsIGxvd2VyX2lub2RlKTsKKwlmc3N0YWNrX2NvcHlfaW5vZGVfc2l6ZShpbm9kZSwgbG93ZXJfaW5vZGUpOwogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTIxMSw3ICsyMDksNiBAQAogCWNoYXIgKmNpcGhlcl9uYW1lX2RzdDsKIAljaGFyICpjaXBoZXJfbmFtZV9zcmM7CiAJY2hhciAqY2lwaGVyX2tleV9ieXRlc19zcmM7Ci0Jc3RydWN0IGNyeXB0b190Zm0gKnRtcF90Zm07CiAJaW50IGNpcGhlcl9uYW1lX2xlbjsKIAogCWlmICghb3B0aW9ucykgewpAQCAtMzA4LDI1ICszMDUsMTkgQEAKIAkJICAgID0gJ1wwJzsKIAl9CiAJaWYgKCFjaXBoZXJfa2V5X2J5dGVzX3NldCkgewotCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUgPQotCQkJRUNSWVBURlNfREVGQVVMVF9LRVlfQllURVM7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiQ2lwaGVyIGtleSBzaXplIHdhcyBub3QgIgotCQkJCSJzcGVjaWZpZWQuICBEZWZhdWx0aW5nIHRvIFslZF1cbiIsCi0JCQkJbW91bnRfY3J5cHRfc3RhdC0+Ci0JCQkJZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplKTsKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplID0gMDsKIAl9CiAJcmMgPSBlY3J5cHRmc19wcm9jZXNzX2NpcGhlcigKLQkJJnRtcF90Zm0sCiAJCSZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbSwKIAkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUsCi0JCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSk7Ci0JaWYgKHRtcF90Zm0pCi0JCWNyeXB0b19mcmVlX3RmbSh0bXBfdGZtKTsKKwkJJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBpbml0aWFsaXplIGNpcGhlciBbJXNdICIKIAkJICAgICAgICJ3aXRoIGtleSBzaXplIFslWmRdIGJ5dGVzOyByYyA9IFslZF1cbiIsCiAJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKIAkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSwgcmMpOworCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfa2V5X3RmbSA9IE5VTEw7CisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19rZXkgPSBOVUxMOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTM4OCw3ICszNzksNyBAQAogCS8qIFJlbGVhc2VkIGluIGVjcnlwdGZzX3B1dF9zdXBlcigpICovCiAJZWNyeXB0ZnNfc2V0X3N1cGVyYmxvY2tfcHJpdmF0ZShzYiwKIAkJCQkJa21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19zYl9pbmZvX2NhY2hlLAotCQkJCQkJCSBTTEFCX0tFUk5FTCkpOworCQkJCQkJCSBHRlBfS0VSTkVMKSk7CiAJaWYgKCFlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoc2IpKSB7CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJPdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmMgPSAtRU5PTUVNOwpAQCAtNDEyLDcgKzQwMyw3IEBACiAJLyogdGhyb3VnaCBkZWFjdGl2YXRlX3N1cGVyKHNiKSBmcm9tIGdldF9zYl9ub2RldigpICovCiAJZWNyeXB0ZnNfc2V0X2RlbnRyeV9wcml2YXRlKHNiLT5zX3Jvb3QsCiAJCQkJICAgIGttZW1fY2FjaGVfYWxsb2MoZWNyeXB0ZnNfZGVudHJ5X2luZm9fY2FjaGUsCi0JCQkJCQkgICAgIFNMQUJfS0VSTkVMKSk7CisJCQkJCQkgICAgIEdGUF9LRVJORUwpKTsKIAlpZiAoIWVjcnlwdGZzX2RlbnRyeV90b19wcml2YXRlKHNiLT5zX3Jvb3QpKSB7CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwKIAkJCQkiZGVudHJ5X2luZm9fY2FjaGUgYWxsb2MgZmFpbGVkXG4iKTsKQEAgLTU1Niw3ICs1NDcsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGVjcnlwdGZzX2NhY2hlX2luZm8gewotCWttZW1fY2FjaGVfdCAqKmNhY2hlOworCXN0cnVjdCBrbWVtX2NhY2hlICoqY2FjaGU7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlzaXplX3Qgc2l6ZTsKIAl2b2lkICgqY3Rvcikodm9pZCosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpOwpAQCAtNzAxLDcgKzY5Miw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZWNyeXB0ZnNfYXR0cmlidXRlIHN5c2ZzX2F0dHJfdmVyc2lvbiA9IF9fQVRUUl9STyh2ZXJzaW9uKTsKIAotc3RydWN0IGVjcnlwdGZzX3ZlcnNpb25fc3RyX21hcF9lbGVtIHsKK3N0YXRpYyBzdHJ1Y3QgZWNyeXB0ZnNfdmVyc2lvbl9zdHJfbWFwX2VsZW0gewogCXUzMiBmbGFnOwogCWNoYXIgKnN0cjsKIH0gZWNyeXB0ZnNfdmVyc2lvbl9zdHJfbWFwW10gPSB7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tbWFwLmMgYi9mcy9lY3J5cHRmcy9tbWFwLmMKaW5kZXggOTI0ZGQ5MC4uMDY4NDNkMiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvbW1hcC5jCisrKyBiL2ZzL2VjcnlwdGZzL21tYXAuYwpAQCAtNTEsNyArNTEsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CiAKLQlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCW1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgsCkBAIC04NCw3ICs4NCw3IEBACiBpbnQgZWNyeXB0ZnNfZmlsbF96ZXJvcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG5ld19sZW5ndGgpCiB7CiAJaW50IHJjID0gMDsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJcGdvZmZfdCBvbGRfZW5kX3BhZ2VfaW5kZXggPSAwOwogCXBnb2ZmX3QgaW5kZXggPSBvbGRfZW5kX3BhZ2VfaW5kZXg7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAljaGFyICpsb3dlcl9wYWdlX2RhdGE7CiAJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqbG93ZXJfYV9vcHM7CiAKLQlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCWxvd2VyX2ZpbGUgPSBlY3J5cHRmc19maWxlX3RvX2xvd2VyKGZpbGUpOwogCWxvd2VyX2RlbnRyeSA9IGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnkpOwogCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwpAQCAtMjc1LDkgKzI3NSw5IEBACiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdDsKIAotCUJVR19PTighKGZpbGUgJiYgZmlsZS0+Zl9kZW50cnkgJiYgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKTsKLQljcnlwdF9zdGF0ID0KLQkJJmVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLT5jcnlwdF9zdGF0OworCUJVR19PTighKGZpbGUgJiYgZmlsZS0+Zl9wYXRoLmRlbnRyeSAmJiBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSk7CisJY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpCisJCQktPmNyeXB0X3N0YXQ7CiAJaWYgKCFjcnlwdF9zdGF0CiAJICAgIHx8ICFFQ1JZUFRGU19DSEVDS19GTEFHKGNyeXB0X3N0YXQtPmZsYWdzLCBFQ1JZUFRGU19FTkNSWVBURUQpCiAJICAgIHx8IEVDUllQVEZTX0NIRUNLX0ZMQUcoY3J5cHRfc3RhdC0+ZmxhZ3MsIEVDUllQVEZTX05FV19GSUxFKSkgewpAQCAtNjM4LDggKzYzOCw4IEBACiAJbG93ZXJfaW5vZGUgPSBlY3J5cHRmc19pbm9kZV90b19sb3dlcihpbm9kZSk7CiAJbG93ZXJfZmlsZSA9IGVjcnlwdGZzX2ZpbGVfdG9fbG93ZXIoZmlsZSk7CiAJbXV0ZXhfbG9jaygmbG93ZXJfaW5vZGUtPmlfbXV0ZXgpOwotCWNyeXB0X3N0YXQgPQotCQkmZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmNyeXB0X3N0YXQ7CisJY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpCisJCQkJLT5jcnlwdF9zdGF0OwogCWlmIChFQ1JZUFRGU19DSEVDS19GTEFHKGNyeXB0X3N0YXQtPmZsYWdzLCBFQ1JZUFRGU19ORVdfRklMRSkpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJFQ1JZUFRGU19ORVdfRklMRSBmbGFnIHNldCBpbiAiCiAJCQkiY3J5cHRfc3RhdCBhdCBtZW1vcnkgbG9jYXRpb24gWyVwXVxuIiwgY3J5cHRfc3RhdCk7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9zdXBlci5jIGIvZnMvZWNyeXB0ZnMvc3VwZXIuYwppbmRleCBjMzM3YzA0Li5lYWE1ZGFhIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9zdXBlci5jCisrKyBiL2ZzL2VjcnlwdGZzL3N1cGVyLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAogCWVjcnlwdGZzX2lub2RlID0ga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19pbm9kZV9pbmZvX2NhY2hlLAotCQkJCQkgIFNMQUJfS0VSTkVMKTsKKwkJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIWVjcnlwdGZzX2lub2RlKSkKIAkJZ290byBvdXQ7CiAJZWNyeXB0ZnNfaW5pdF9jcnlwdF9zdGF0KCZlY3J5cHRmc19pbm9kZS0+Y3J5cHRfc3RhdCk7CkBAIC0xMzgsMjMgKzEzOCw2IEBACiB9CiAKIC8qKgotICogZWNyeXB0ZnNfdW1vdW50X2JlZ2luCi0gKgotICogQ2FsbGVkIGluIGRvX3Vtb3VudCgpLgotICovCi1zdGF0aWMgdm9pZCBlY3J5cHRmc191bW91bnRfYmVnaW4oc3RydWN0IHZmc21vdW50ICp2ZnNtbnQsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgdmZzbW91bnQgKmxvd2VyX21udCA9Ci0JCWVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQodmZzbW50LT5tbnRfc2ItPnNfcm9vdCk7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpsb3dlcl9zYjsKLQotCW1udHB1dChsb3dlcl9tbnQpOwotCWxvd2VyX3NiID0gbG93ZXJfbW50LT5tbnRfc2I7Ci0JaWYgKGxvd2VyX3NiLT5zX29wLT51bW91bnRfYmVnaW4pCi0JCWxvd2VyX3NiLT5zX29wLT51bW91bnRfYmVnaW4obG93ZXJfbW50LCBmbGFncyk7Ci19Ci0KLS8qKgogICogZWNyeXB0ZnNfc2hvd19vcHRpb25zCiAgKgogICogUHJpbnRzIHRoZSBkaXJlY3Rvcnkgd2UgYXJlIGN1cnJlbnRseSBtb3VudGVkIG92ZXIuCkBAIC0xOTMsNiArMTc2LDUgQEAKIAkuc3RhdGZzID0gZWNyeXB0ZnNfc3RhdGZzLAogCS5yZW1vdW50X2ZzID0gTlVMTCwKIAkuY2xlYXJfaW5vZGUgPSBlY3J5cHRmc19jbGVhcl9pbm9kZSwKLQkudW1vdW50X2JlZ2luID0gZWNyeXB0ZnNfdW1vdW50X2JlZ2luLAogCS5zaG93X29wdGlvbnMgPSBlY3J5cHRmc19zaG93X29wdGlvbnMKIH07CmRpZmYgLS1naXQgYS9mcy9lZnMvZGlyLmMgYi9mcy9lZnMvZGlyLmMKaW5kZXggMTdmNWIyZC4uYjQ2YzQ4OCAxMDA2NDQKLS0tIGEvZnMvZWZzL2Rpci5jCisrKyBiL2ZzL2Vmcy9kaXIuYwpAQCAtMjAsNyArMjAsNyBAQAogfTsKIAogc3RhdGljIGludCBlZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikgewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCiAJc3RydWN0IGVmc19kaXIJCSpkaXJibG9jazsKZGlmZiAtLWdpdCBhL2ZzL2Vmcy9zdXBlci5jIGIvZnMvZWZzL3N1cGVyLmMKaW5kZXggYjNmNTA2NS4uZGZlYmYyMSAxMDA2NDQKLS0tIGEvZnMvZWZzL3N1cGVyLmMKKysrIGIvZnMvZWZzL3N1cGVyLmMKQEAgLTUyLDEyICs1MiwxMiBAQAogfTsKIAogCi1zdGF0aWMga21lbV9jYWNoZV90ICogZWZzX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIGVmc19pbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmVmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IGVmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhlZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZWkgPSAoc3RydWN0IGVmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhlZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7CkBAIC02OCw3ICs2OCw3IEBACiAJa21lbV9jYWNoZV9mcmVlKGVmc19pbm9kZV9jYWNoZXAsIElOT0RFX0lORk8oaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZWZzX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqKSBmb287CiAKZGlmZiAtLWdpdCBhL2ZzL2V2ZW50cG9sbC5jIGIvZnMvZXZlbnRwb2xsLmMKaW5kZXggYWUyMjhlYy4uM2FlNjQ0ZSAxMDA2NDQKLS0tIGEvZnMvZXZlbnRwb2xsLmMKKysrIGIvZnMvZXZlbnRwb2xsLmMKQEAgLTI4MywxMCArMjgzLDEwIEBACiBzdGF0aWMgc3RydWN0IHBvbGxfc2FmZXdha2UgcHN3OwogCiAvKiBTbGFiIGNhY2hlIHVzZWQgdG8gYWxsb2NhdGUgInN0cnVjdCBlcGl0ZW0iICovCi1zdGF0aWMga21lbV9jYWNoZV90ICplcGlfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXBpX2NhY2hlIF9fcmVhZF9tb3N0bHk7CiAKIC8qIFNsYWIgY2FjaGUgdXNlZCB0byBhbGxvY2F0ZSAic3RydWN0IGVwcG9sbF9lbnRyeSIgKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnB3cV9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwd3FfY2FjaGUgX19yZWFkX21vc3RseTsKIAogLyogVmlydHVhbCBmcyB1c2VkIHRvIGFsbG9jYXRlIGlub2RlcyBmb3IgZXZlbnRwb2xsIGZpbGVzICovCiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpldmVudHBvbGxfbW50IF9fcmVhZF9tb3N0bHk7CkBAIC03OTUsOCArNzk1LDggQEAKIAkJZ290byBlZXhpdF80OwogCWRlbnRyeS0+ZF9vcCA9ICZldmVudHBvbGxmc19kZW50cnlfb3BlcmF0aW9uczsKIAlkX2FkZChkZW50cnksIGlub2RlKTsKLQlmaWxlLT5mX3Zmc21udCA9IG1udGdldChldmVudHBvbGxfbW50KTsKLQlmaWxlLT5mX2RlbnRyeSA9IGRlbnRyeTsKKwlmaWxlLT5mX3BhdGgubW50ID0gbW50Z2V0KGV2ZW50cG9sbF9tbnQpOworCWZpbGUtPmZfcGF0aC5kZW50cnkgPSBkZW50cnk7CiAJZmlsZS0+Zl9tYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAogCWZpbGUtPmZfcG9zID0gMDsKQEAgLTk2MSw3ICs5NjEsNyBAQAogCXN0cnVjdCBlcGl0ZW0gKmVwaSA9IGVwX2l0ZW1fZnJvbV9lcHF1ZXVlKHB0KTsKIAlzdHJ1Y3QgZXBwb2xsX2VudHJ5ICpwd3E7CiAKLQlpZiAoZXBpLT5ud2FpdCA+PSAwICYmIChwd3EgPSBrbWVtX2NhY2hlX2FsbG9jKHB3cV9jYWNoZSwgU0xBQl9LRVJORUwpKSkgeworCWlmIChlcGktPm53YWl0ID49IDAgJiYgKHB3cSA9IGttZW1fY2FjaGVfYWxsb2MocHdxX2NhY2hlLCBHRlBfS0VSTkVMKSkpIHsKIAkJaW5pdF93YWl0cXVldWVfZnVuY19lbnRyeSgmcHdxLT53YWl0LCBlcF9wb2xsX2NhbGxiYWNrKTsKIAkJcHdxLT53aGVhZCA9IHdoZWFkOwogCQlwd3EtPmJhc2UgPSBlcGk7CkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCXN0cnVjdCBlcF9wcXVldWUgZXBxOwogCiAJZXJyb3IgPSAtRU5PTUVNOwotCWlmICghKGVwaSA9IGttZW1fY2FjaGVfYWxsb2MoZXBpX2NhY2hlLCBTTEFCX0tFUk5FTCkpKQorCWlmICghKGVwaSA9IGttZW1fY2FjaGVfYWxsb2MoZXBpX2NhY2hlLCBHRlBfS0VSTkVMKSkpCiAJCWdvdG8gZWV4aXRfMTsKIAogCS8qIEl0ZW0gaW5pdGlhbGl6YXRpb24gZm9sbG93IGhlcmUgLi4uICovCmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggZDk5M2VhMS4uMTFmZTkzZiAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KQEAgLTQwNCw3ICs0MDUsNyBAQAogCQlicHJtLT5sb2FkZXIgKz0gc3RhY2tfYmFzZTsKIAlicHJtLT5leGVjICs9IHN0YWNrX2Jhc2U7CiAKLQltcG50ID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCW1wbnQgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1wbnQpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02MjAsOCArNjIxLDggQEAKIAkgKiBSZXBhcmVudGluZyBuZWVkcyB3cml0ZV9sb2NrIG9uIHRhc2tsaXN0X2xvY2ssCiAJICogc28gaXQgaXMgc2FmZSB0byBkbyBpdCB1bmRlciByZWFkX2xvY2suCiAJICovCi0JaWYgKHVubGlrZWx5KHRzay0+Z3JvdXBfbGVhZGVyID09IGNoaWxkX3JlYXBlcikpCi0JCWNoaWxkX3JlYXBlciA9IHRzazsKKwlpZiAodW5saWtlbHkodHNrLT5ncm91cF9sZWFkZXIgPT0gY2hpbGRfcmVhcGVyKHRzaykpKQorCQl0c2stPm5zcHJveHktPnBpZF9ucy0+Y2hpbGRfcmVhcGVyID0gdHNrOwogCiAJemFwX290aGVyX3RocmVhZHModHNrKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CkBAIC03ODIsNyArNzgzLDcgQEAKIAkJaisrOwogCQlpID0gaiAqIF9fTkZEQklUUzsKIAkJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JCWlmIChpID49IGZkdC0+bWF4X2ZkcyB8fCBpID49IGZkdC0+bWF4X2Zkc2V0KQorCQlpZiAoaSA+PSBmZHQtPm1heF9mZHMpCiAJCQlicmVhazsKIAkJc2V0ID0gZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0c1tqXTsKIAkJaWYgKCFzZXQpCkBAIC05MTIsNyArOTEzLDcgQEAKIGludCBwcmVwYXJlX2JpbnBybShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogewogCWludCBtb2RlOwotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gYnBybS0+ZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBicHJtLT5maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCByZXR2YWw7CiAKIAltb2RlID0gaW5vZGUtPmlfbW9kZTsKQEAgLTkyMiw3ICs5MjMsNyBAQAogCWJwcm0tPmVfdWlkID0gY3VycmVudC0+ZXVpZDsKIAlicHJtLT5lX2dpZCA9IGN1cnJlbnQtPmVnaWQ7CiAKLQlpZighKGJwcm0tPmZpbGUtPmZfdmZzbW50LT5tbnRfZmxhZ3MgJiBNTlRfTk9TVUlEKSkgeworCWlmKCEoYnBybS0+ZmlsZS0+Zl9wYXRoLm1udC0+bW50X2ZsYWdzICYgTU5UX05PU1VJRCkpIHsKIAkJLyogU2V0LXVpZD8gKi8KIAkJaWYgKG1vZGUgJiBTX0lTVUlEKSB7CiAJCQljdXJyZW50LT5wZXJzb25hbGl0eSAmPSB+UEVSX0NMRUFSX09OX1NFVElEOwpAQCAtMTUxNSwxMyArMTUxNiwxNCBAQAogCQlpc3BpcGUgPSAxOwogIAl9IGVsc2UKICAJCWZpbGUgPSBmaWxwX29wZW4oY29yZW5hbWUsCi0JCQkJIE9fQ1JFQVQgfCAyIHwgT19OT0ZPTExPVyB8IE9fTEFSR0VGSUxFLCAwNjAwKTsKKwkJCQkgT19DUkVBVCB8IDIgfCBPX05PRk9MTE9XIHwgT19MQVJHRUZJTEUgfCBmbGFnLAorCQkJCSAwNjAwKTsKIAlpZiAoSVNfRVJSKGZpbGUpKQogCQlnb3RvIGZhaWxfdW5sb2NrOwotCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWlmIChpbm9kZS0+aV9ubGluayA+IDEpCiAJCWdvdG8gY2xvc2VfZmFpbDsJLyogbXVsdGlwbGUgbGlua3MgLSBkb24ndCBkdW1wICovCi0JaWYgKCFpc3BpcGUgJiYgZF91bmhhc2hlZChmaWxlLT5mX2RlbnRyeSkpCisJaWYgKCFpc3BpcGUgJiYgZF91bmhhc2hlZChmaWxlLT5mX3BhdGguZGVudHJ5KSkKIAkJZ290byBjbG9zZV9mYWlsOwogCiAJLyogQUs6IGFjdHVhbGx5IGkgc2VlIG5vIHJlYXNvbiB0byBub3QgYWxsb3cgdGhpcyBmb3IgbmFtZWQgcGlwZXMgZXRjLiwKQEAgLTE1MzIsNyArMTUzNCw3IEBACiAJCWdvdG8gY2xvc2VfZmFpbDsKIAlpZiAoIWZpbGUtPmZfb3AtPndyaXRlKQogCQlnb3RvIGNsb3NlX2ZhaWw7Ci0JaWYgKCFpc3BpcGUgJiYgZG9fdHJ1bmNhdGUoZmlsZS0+Zl9kZW50cnksIDAsIDAsIGZpbGUpICE9IDApCisJaWYgKCFpc3BpcGUgJiYgZG9fdHJ1bmNhdGUoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgMCwgMCwgZmlsZSkgIT0gMCkKIAkJZ290byBjbG9zZV9mYWlsOwogCiAJcmV0dmFsID0gYmluZm10LT5jb3JlX2R1bXAoc2lnbnIsIHJlZ3MsIGZpbGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9kaXIuYyBiL2ZzL2V4dDIvZGlyLmMKaW5kZXggM2U3YTg0YS4uMGIwMmJhOSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9kaXIuYworKysgYi9mcy9leHQyL2Rpci5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKIGV4dDJfcmVhZGRpciAoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlsb2ZmX3QgcG9zID0gZmlscC0+Zl9wb3M7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKIAl1bnNpZ25lZCBsb25nIG4gPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW9jdGwuYyBiL2ZzL2V4dDIvaW9jdGwuYwppbmRleCAxZGZiYTc3Li40YjA5OWQzIDEwMDY0NAotLS0gYS9mcy9leHQyL2lvY3RsLmMKKysrIGIvZnMvZXh0Mi9pb2N0bC5jCkBAIC00NCw2ICs0NCw3IEBACiAJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKIAkJCWZsYWdzICY9IH5FWFQyX0RJUlNZTkNfRkw7CiAKKwkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlvbGRmbGFncyA9IGVpLT5pX2ZsYWdzOwogCiAJCS8qCkBAIC01MywxMyArNTQsMTYgQEAKIAkJICogVGhpcyB0ZXN0IGxvb2tzIG5pY2VyLiBUaGFua3MgdG8gUGF1bGluZSBNaWRkZWxpbmsKIAkJICovCiAJCWlmICgoZmxhZ3MgXiBvbGRmbGFncykgJiAoRVhUMl9BUFBFTkRfRkwgfCBFWFQyX0lNTVVUQUJMRV9GTCkpIHsKLQkJCWlmICghY2FwYWJsZShDQVBfTElOVVhfSU1NVVRBQkxFKSkKKwkJCWlmICghY2FwYWJsZShDQVBfTElOVVhfSU1NVVRBQkxFKSkgeworCQkJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkJCXJldHVybiAtRVBFUk07CisJCQl9CiAJCX0KIAogCQlmbGFncyA9IGZsYWdzICYgRVhUMl9GTF9VU0VSX01PRElGSUFCTEU7CiAJCWZsYWdzIHw9IG9sZGZsYWdzICYgfkVYVDJfRkxfVVNFUl9NT0RJRklBQkxFOwogCQllaS0+aV9mbGFncyA9IGZsYWdzOworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCQlleHQyX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CiAJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKQEAgLTg2LDcgKzkwLDcgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBsb25nIGV4dDJfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IHJldDsKIAogCS8qIFRoZXNlIGFyZSBqdXN0IG1pc25hbWVkLCB0aGV5IGFjdHVhbGx5IGdldC9wdXQgZnJvbS90byB1c2VyIGFuIGludCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IGQ4YjlhYmQuLjYzNDdjMmQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTEzNSwxMiArMTM1LDEyIEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMga21lbV9jYWNoZV90ICogZXh0Ml9pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKiBleHQyX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0Ml9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpOwotCWVpID0gKHN0cnVjdCBleHQyX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGV4dDJfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZWkgPSAoc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoZXh0Ml9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogI2lmZGVmIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTApAQCAtMTU2LDcgKzE1Niw3IEBACiAJa21lbV9jYWNoZV9mcmVlKGV4dDJfaW5vZGVfY2FjaGVwLCBFWFQyX0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICopIGZvbzsKIApAQCAtNTk3LDggKzU5Nyw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNkZWZpbmUgbG9nMihuKSBmZnoofihuKSkKLSAKIC8qCiAgKiBNYXhpbWFsIGZpbGUgc2l6ZS4gIFRoZXJlIGlzIGEgZGlyZWN0LCBhbmQgeyxkb3VibGUtLHRyaXBsZS19aW5kaXJlY3QKICAqIGJsb2NrIGxpbWl0LCBhbmQgYWxzbyBhIGxpbWl0IG9mICgyXjMyIC0gMSkgNTEyLWJ5dGUgc2VjdG9ycyBpbiBpX2Jsb2Nrcy4KQEAgLTgzNCw5ICs4MzIsOSBAQAogCXNiaS0+c19zYmggPSBiaDsKIAlzYmktPnNfbW91bnRfc3RhdGUgPSBsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSk7CiAJc2JpLT5zX2FkZHJfcGVyX2Jsb2NrX2JpdHMgPQotCQlsb2cyIChFWFQyX0FERFJfUEVSX0JMT0NLKHNiKSk7CisJCWlsb2cyIChFWFQyX0FERFJfUEVSX0JMT0NLKHNiKSk7CiAJc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrX2JpdHMgPQotCQlsb2cyIChFWFQyX0RFU0NfUEVSX0JMT0NLKHNiKSk7CisJCWlsb2cyIChFWFQyX0RFU0NfUEVSX0JMT0NLKHNiKSk7CiAKIAlpZiAoc2ItPnNfbWFnaWMgIT0gRVhUMl9TVVBFUl9NQUdJQykKIAkJZ290byBjYW50ZmluZF9leHQyOwpAQCAtMTA5MCw4ICsxMDg4LDEwIEBACiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CiAJdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKIAlpbnQgaTsKKwl1NjQgZnNpZDsKIAogCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKIAkJb3ZlcmhlYWQgPSAwOwpAQCAtMTEwNCw3ICsxMTA0LDcgQEAKIAkJICogQWxsIG9mIHRoZSBibG9ja3MgYmVmb3JlIGZpcnN0X2RhdGFfYmxvY2sgYXJlCiAJCSAqIG92ZXJoZWFkCiAJCSAqLwotCQlvdmVyaGVhZCA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwkJb3ZlcmhlYWQgPSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKIAogCQkvKgogCQkgKiBBZGQgdGhlIG92ZXJoZWFkIGF0dHJpYnV0ZWQgdG8gdGhlIHN1cGVyYmxvY2sgYW5kCkBAIC0xMTI1LDE0ICsxMTI1LDE4IEBACiAKIAlidWYtPmZfdHlwZSA9IEVYVDJfU1VQRVJfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWJ1Zi0+Zl9ibG9ja3MgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfYmxvY2tzX2NvdW50KSAtIG92ZXJoZWFkOworCWJ1Zi0+Zl9ibG9ja3MgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0gb3ZlcmhlYWQ7CiAJYnVmLT5mX2JmcmVlID0gZXh0Ml9jb3VudF9mcmVlX2Jsb2NrcyhzYik7Ci0JYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZSAtIGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yX2Jsb2Nrc19jb3VudCk7Ci0JaWYgKGJ1Zi0+Zl9iZnJlZSA8IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yX2Jsb2Nrc19jb3VudCkpCisJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZSAtIGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KTsKKwlpZiAoYnVmLT5mX2JmcmVlIDwgbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpKQogCQlidWYtPmZfYmF2YWlsID0gMDsKLQlidWYtPmZfZmlsZXMgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfaW5vZGVzX2NvdW50KTsKLQlidWYtPmZfZmZyZWUgPSBleHQyX2NvdW50X2ZyZWVfaW5vZGVzIChzYik7CisJYnVmLT5mX2ZpbGVzID0gbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KTsKKwlidWYtPmZfZmZyZWUgPSBleHQyX2NvdW50X2ZyZWVfaW5vZGVzKHNiKTsKIAlidWYtPmZfbmFtZWxlbiA9IEVYVDJfTkFNRV9MRU47CisJZnNpZCA9IGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQpIF4KKwkgICAgICAgbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCArIHNpemVvZih1NjQpKTsKKwlidWYtPmZfZnNpZC52YWxbMF0gPSBmc2lkICYgMHhGRkZGRkZGRlVMOworCWJ1Zi0+Zl9mc2lkLnZhbFsxXSA9IChmc2lkID4+IDMyKSAmIDB4RkZGRkZGRkZVTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0Mi94YXR0ci5jIGIvZnMvZXh0Mi94YXR0ci5jCmluZGV4IGFmNTJhN2YuLjI0N2VmZDAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIveGF0dHIuYworKysgYi9mcy9leHQyL3hhdHRyLmMKQEAgLTM0MiwxMiArMzQyLDkgQEAKIAlpZiAoRVhUMl9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpKQogCQlyZXR1cm47CiAKLQlsb2NrX3N1cGVyKHNiKTsKLQlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCB8PQotCQljcHVfdG9fbGUzMihFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKTsKKwlFWFQyX1NFVF9DT01QQVRfRkVBVFVSRShzYiwgRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUik7CiAJc2ItPnNfZGlydCA9IDE7CiAJbWFya19idWZmZXJfZGlydHkoRVhUMl9TQihzYiktPnNfc2JoKTsKLQl1bmxvY2tfc3VwZXIoc2IpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZXh0My9NYWtlZmlsZSBiL2ZzL2V4dDMvTWFrZWZpbGUKaW5kZXggNzA0Y2Q0NC4uZTc3NzY2YSAxMDA2NDQKLS0tIGEvZnMvZXh0My9NYWtlZmlsZQorKysgYi9mcy9leHQzL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogb2JqLSQoQ09ORklHX0VYVDNfRlMpICs9IGV4dDMubwogCiBleHQzLXkJOj0gYmFsbG9jLm8gYml0bWFwLm8gZGlyLm8gZmlsZS5vIGZzeW5jLm8gaWFsbG9jLm8gaW5vZGUubyBcCi0JICAgaW9jdGwubyBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vIGhhc2gubyByZXNpemUubworCSAgIGlvY3RsLm8gbmFtZWkubyBzdXBlci5vIHN5bWxpbmsubyBoYXNoLm8gcmVzaXplLm8gZXh0M19qYmQubwogCiBleHQzLSQoQ09ORklHX0VYVDNfRlNfWEFUVFIpCSArPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KIGV4dDMtJChDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wpICs9IGFjbC5vCmRpZmYgLS1naXQgYS9mcy9leHQzL2JhbGxvYy5jIGIvZnMvZXh0My9iYWxsb2MuYwppbmRleCBiNDFhN2Q3Li4yMjE2MTc0IDEwMDY0NAotLS0gYS9mcy9leHQzL2JhbGxvYy5jCisrKyBiL2ZzL2V4dDMvYmFsbG9jLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiAJcHJpbnRrKCJCbG9jayBBbGxvY2F0aW9uIFJlc2VydmF0aW9uIFdpbmRvd3MgTWFwICglcyk6XG4iLCBmbik7CiAJd2hpbGUgKG4pIHsKLQkJcnN2ID0gbGlzdF9lbnRyeShuLCBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlLCByc3Zfbm9kZSk7CisJCXJzdiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKIAkJaWYgKHZlcmJvc2UpCiAJCQlwcmludGsoInJlc2VydmF0aW9uIHdpbmRvdyAweCVwICIKIAkJCSAgICAgICAic3RhcnQ6ICAlbHUsIGVuZDogICVsdVxuIiwKQEAgLTczMCw3ICs3MzAsNyBAQAogCQloZXJlID0gMDsKIAogCXAgPSAoKGNoYXIgKiliaC0+Yl9kYXRhKSArIChoZXJlID4+IDMpOwotCXIgPSBtZW1zY2FuKHAsIDAsIChtYXhibG9ja3MgLSBoZXJlICsgNykgPj4gMyk7CisJciA9IG1lbXNjYW4ocCwgMCwgKChtYXhibG9ja3MgKyA3KSA+PiAzKSAtIChoZXJlID4+IDMpKTsKIAluZXh0ID0gKHIgLSAoKGNoYXIgKiliaC0+Yl9kYXRhKSkgPDwgMzsKIAogCWlmIChuZXh0IDwgbWF4YmxvY2tzICYmIG5leHQgPj0gc3RhcnQgJiYgZXh0M190ZXN0X2FsbG9jYXRhYmxlKG5leHQsIGJoKSkKQEAgLTk0OSw3ICs5NDksNyBAQAogCiAJCXByZXYgPSByc3Y7CiAJCW5leHQgPSByYl9uZXh0KCZyc3YtPnJzdl9ub2RlKTsKLQkJcnN2ID0gbGlzdF9lbnRyeShuZXh0LHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUscnN2X25vZGUpOworCQlyc3YgPSByYl9lbnRyeShuZXh0LHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUscnN2X25vZGUpOwogCiAJCS8qCiAJCSAqIFJlYWNoZWQgdGhlIGxhc3QgcmVzZXJ2YXRpb24sIHdlIGNhbiBqdXN0IGFwcGVuZCB0byB0aGUKQEAgLTExNDgsNyArMTE0OCw3IEBACiAJICogY2hlY2sgaWYgdGhlIGZpcnN0IGZyZWUgYmxvY2sgaXMgd2l0aGluIHRoZQogCSAqIGZyZWUgc3BhY2Ugd2UganVzdCByZXNlcnZlZAogCSAqLwotCWlmIChzdGFydF9ibG9jayA+PSBteV9yc3YtPnJzdl9zdGFydCAmJiBzdGFydF9ibG9jayA8IG15X3Jzdi0+cnN2X2VuZCkKKwlpZiAoc3RhcnRfYmxvY2sgPj0gbXlfcnN2LT5yc3Zfc3RhcnQgJiYgc3RhcnRfYmxvY2sgPD0gbXlfcnN2LT5yc3ZfZW5kKQogCQlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KIAkvKgogCSAqIGlmIHRoZSBmaXJzdCBmcmVlIGJpdCB3ZSBmb3VuZCBpcyBvdXQgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKQEAgLTExOTMsNyArMTE5Myw3IEBACiAJaWYgKCFuZXh0KQogCQlteV9yc3YtPnJzdl9lbmQgKz0gc2l6ZTsKIAllbHNlIHsKLQkJbmV4dF9yc3YgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKwkJbmV4dF9yc3YgPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlLCByc3Zfbm9kZSk7CiAKIAkJaWYgKChuZXh0X3Jzdi0+cnN2X3N0YXJ0IC0gbXlfcnN2LT5yc3ZfZW5kIC0gMSkgPj0gc2l6ZSkKIAkJCW15X3Jzdi0+cnN2X2VuZCArPSBzaXplOwpAQCAtMTI3MSw3ICsxMjcxLDcgQEAKIAl9CiAJLyoKIAkgKiBncnBfZ29hbCBpcyBhIGdyb3VwIHJlbGF0aXZlIGJsb2NrIG51bWJlciAoaWYgdGhlcmUgaXMgYSBnb2FsKQotCSAqIDAgPCBncnBfZ29hbCA8IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikKKwkgKiAwIDw9IGdycF9nb2FsIDwgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQogCSAqIGZpcnN0IGJsb2NrIGlzIGEgZmlsZXN5c3RlbSB3aWRlIGJsb2NrIG51bWJlcgogCSAqIGZpcnN0IGJsb2NrIGlzIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIGluIHRoaXMgZ3JvdXAKIAkgKi8KQEAgLTEzMDcsMTAgKzEzMDcsMTQgQEAKIAkJCWlmICghZ29hbF9pbl9teV9yZXNlcnZhdGlvbigmbXlfcnN2LT5yc3Zfd2luZG93LAogCQkJCQkJCWdycF9nb2FsLCBncm91cCwgc2IpKQogCQkJCWdycF9nb2FsID0gLTE7Ci0JCX0gZWxzZSBpZiAoZ3JwX2dvYWwgPiAwICYmCi0JCQkgIChteV9yc3YtPnJzdl9lbmQtZ3JwX2dvYWwrMSkgPCAqY291bnQpCi0JCQl0cnlfdG9fZXh0ZW5kX3Jlc2VydmF0aW9uKG15X3Jzdiwgc2IsCi0JCQkJCSpjb3VudC1teV9yc3YtPnJzdl9lbmQgKyBncnBfZ29hbCAtIDEpOworCQl9IGVsc2UgaWYgKGdycF9nb2FsID49IDApIHsKKwkJCWludCBjdXJyID0gbXlfcnN2LT5yc3ZfZW5kIC0KKwkJCQkJKGdycF9nb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2spICsgMTsKKworCQkJaWYgKGN1cnIgPCAqY291bnQpCisJCQkJdHJ5X3RvX2V4dGVuZF9yZXNlcnZhdGlvbihteV9yc3YsIHNiLAorCQkJCQkJCSpjb3VudCAtIGN1cnIpOworCQl9CiAKIAkJaWYgKChteV9yc3YtPnJzdl9zdGFydCA+IGdyb3VwX2xhc3RfYmxvY2spIHx8CiAJCQkJKG15X3Jzdi0+cnN2X2VuZCA8IGdyb3VwX2ZpcnN0X2Jsb2NrKSkgewpAQCAtMTUxMSwxMCArMTUxNSw4IEBACiAJCWlmIChncm91cF9ubyA+PSBuZ3JvdXBzKQogCQkJZ3JvdXBfbm8gPSAwOwogCQlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBncm91cF9ubywgJmdkcF9iaCk7Ci0JCWlmICghZ2RwKSB7Ci0JCQkqZXJycCA9IC1FSU87Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoIWdkcCkKKwkJCWdvdG8gaW9fZXJyb3I7CiAJCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CiAJCS8qCiAJCSAqIHNraXAgdGhpcyBncm91cCBpZiB0aGUgbnVtYmVyIG9mCkBAIC0xNTQ4LDYgKzE1NTAsNyBAQAogCSAqLwogCWlmIChteV9yc3YpIHsKIAkJbXlfcnN2ID0gTlVMTDsKKwkJd2luZG93c3ogPSAwOwogCQlncm91cF9ubyA9IGdvYWxfZ3JvdXA7CiAJCWdvdG8gcmV0cnlfYWxsb2M7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9kaXIuYyBiL2ZzL2V4dDMvZGlyLmMKaW5kZXggZDBiNTRmMy4uNjY1YWRlZSAxMDA2NDQKLS0tIGEvZnMvZXh0My9kaXIuYworKysgYi9mcy9leHQzL2Rpci5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlpbnQgZXJyOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0ID0gMDsKIAogCXNiID0gaW5vZGUtPmlfc2I7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJICogV2UgZG9uJ3Qgc2V0IHRoZSBpbm9kZSBkaXJ0eSBmbGFnIHNpbmNlIGl0J3Mgbm90CiAJCSAqIGNyaXRpY2FsIHRoYXQgaXQgZ2V0IGZsdXNoZWQgYmFjayB0byB0aGUgZGlzay4KIAkJICovCi0JCUVYVDNfSShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgJj0gfkVYVDNfSU5ERVhfRkw7CisJCUVYVDNfSShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+aV9mbGFncyAmPSB+RVhUM19JTkRFWF9GTDsKIAl9CiAjZW5kaWYKIAlzdG9yZWQgPSAwOwpAQCAtMTU0LDYgKzE1NCw5IEBACiAJCQlleHQzX2Vycm9yIChzYiwgImV4dDNfcmVhZGRpciIsCiAJCQkJImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKIAkJCQlpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKTsKKwkJCS8qIGNvcnJ1cHQgc2l6ZT8gIE1heWJlIG5vIG1vcmUgYmxvY2tzIHRvIHJlYWQgKi8KKwkJCWlmIChmaWxwLT5mX3BvcyA+IGlub2RlLT5pX2Jsb2NrcyA8PCA5KQorCQkJCWJyZWFrOwogCQkJZmlscC0+Zl9wb3MgKz0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0OwogCQkJY29udGludWU7CiAJCX0KQEAgLTM5OSw3ICs0MDIsNyBAQAogewogCXN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICppbmZvID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWxvZmZfdAljdXJyX3BvczsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CiAJaW50IGVycm9yOwogCkBAIC00MjksNyArNDMyLDcgQEAKIAkJCSB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGZuYW1lICpmbmFtZTsKIAlpbnQJcmV0OwogCmRpZmYgLS1naXQgYS9mcy9leHQzL2V4dDNfamJkLmMgYi9mcy9leHQzL2V4dDNfamJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmOTFmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvZXh0M19qYmQuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogSW50ZXJmYWNlIGJldHdlZW4gZXh0MyBhbmQgSkJECisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V4dDNfamJkLmg+CisKK2ludCBfX2V4dDNfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyID0gam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IF9fZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyID0gam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCWlmIChlcnIpCisJCWV4dDNfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fRlVOQ1RJT05fXywgYmgsIGhhbmRsZSxlcnIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2V4dDNfam91cm5hbF9mb3JnZXQoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyID0gam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IF9fZXh0M19qb3VybmFsX3Jldm9rZShjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQl1bnNpZ25lZCBsb25nIGJsb2NrbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVyciA9IGpvdXJuYWxfcmV2b2tlKGhhbmRsZSwgYmxvY2tuciwgYmgpOworCWlmIChlcnIpCisJCWV4dDNfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fRlVOQ1RJT05fXywgYmgsIGhhbmRsZSxlcnIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2V4dDNfam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwKKwkJCQloYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnIgPSBqb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCWlmIChlcnIpCisJCWV4dDNfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fRlVOQ1RJT05fXywgYmgsIGhhbmRsZSxlcnIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2V4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShjb25zdCBjaGFyICp3aGVyZSwKKwkJCQloYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnIgPSBqb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCWlmIChlcnIpCisJCWV4dDNfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fRlVOQ1RJT05fXywgYmgsIGhhbmRsZSxlcnIpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQzL2ZpbGUuYyBiL2ZzL2V4dDMvZmlsZS5jCmluZGV4IGU5NmMzODguLjg4MWY2MzYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvZmlsZS5jCisrKyBiL2ZzL2V4dDMvZmlsZS5jCkBAIC01Miw3ICs1Miw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNzaXplX3QgcmV0OwogCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaW5vZGUuYyBiL2ZzL2V4dDMvaW5vZGUuYwppbmRleCAwM2JhNWJjLi5iZWFmMjVmIDEwMDY0NAotLS0gYS9mcy9leHQzL2lub2RlLmMKKysrIGIvZnMvZXh0My9pbm9kZS5jCkBAIC0xMTQ4LDM3ICsxMTQ4LDEwMiBAQAogCXJldHVybiBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKIH0KIAorLyoKKyAqIFRoZSBpZGVhIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIGZvbGxvd2luZzoKKyAqIGlmIHByZXBhcmVfd3JpdGUgaGFzIGFsbG9jYXRlZCBzb21lIGJsb2NrcywgYnV0IG5vdCBhbGwgb2YgdGhlbSwgdGhlCisgKiB0cmFuc2FjdGlvbiBtdXN0IGluY2x1ZGUgdGhlIGNvbnRlbnQgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9ja3MuCisgKiBUaGlzIGNvbnRlbnQgaXMgZXhwZWN0ZWQgdG8gYmUgc2V0IHRvIHplcm9lcyBieSBibG9ja19wcmVwYXJlX3dyaXRlKCkuCisgKiAyMDA2LzEwLzE0ICBTQVcKKyAqLworc3RhdGljIGludCBleHQzX3ByZXBhcmVfZmFpbHVyZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICpuZXh0OworCXVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CisJdW5zaWduZWQgYmxvY2tzaXplOworCWludCByZXQ7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCisJbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJaWYgKGV4dDNfc2hvdWxkX3dyaXRlYmFja19kYXRhKG1hcHBpbmctPmhvc3QpKSB7CisJCS8qIG9wdGltaXphdGlvbjogbm8gY29uc3RyYWludHMgYWJvdXQgZGF0YSAqLworc2tpcDoKKwkJcmV0dXJuIGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJfQorCisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlibG9ja3NpemUgPSBoZWFkLT5iX3NpemU7CisJZm9yICgJYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7CisJCWJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCSAgICAJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIGJoID0gbmV4dCkKKwl7CisJCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20pCisJCQljb250aW51ZTsKKwkJaWYgKGJsb2NrX3N0YXJ0ID49IHRvKSB7CisJCQlibG9ja19zdGFydCA9IHRvOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJLyogcHJlcGFyZV93cml0ZSBmYWlsZWQgb24gdGhpcyBiaCAqLworCQkJYnJlYWs7CisJCWlmIChleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEobWFwcGluZy0+aG9zdCkpIHsKKwkJCXJldCA9IGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkvKgorCSAqIGJsb2NrX3N0YXJ0IGhlcmUgYmVjb21lcyB0aGUgZmlyc3QgYmxvY2sgd2hlcmUgdGhlIGN1cnJlbnQgaXRlcmF0aW9uCisJICogb2YgcHJlcGFyZV93cml0ZSBmYWlsZWQuCisJICovCisJfQorCWlmIChibG9ja19zdGFydCA8PSBmcm9tKQorCQlnb3RvIHNraXA7CisKKwkvKiBjb21taXQgYWxsb2NhdGVkIGFuZCB6ZXJvZWQgYnVmZmVycyAqLworCXJldHVybiBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKGZpbGUsIHBhZ2UsIGZyb20sIGJsb2NrX3N0YXJ0KTsKK30KKwogc3RhdGljIGludCBleHQzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0JaW50IHJldCwgbmVlZGVkX2Jsb2NrcyA9IGV4dDNfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSk7CisJaW50IHJldCwgcmV0MjsKKwlpbnQgbmVlZGVkX2Jsb2NrcyA9IGV4dDNfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSk7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlpbnQgcmV0cmllcyA9IDA7CiAKIHJldHJ5OgogCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgbmVlZGVkX2Jsb2Nrcyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpICYmIGV4dDNfc2hvdWxkX3dyaXRlYmFja19kYXRhKGlub2RlKSkKIAkJcmV0ID0gbm9iaF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBleHQzX2dldF9ibG9jayk7CiAJZWxzZQogCQlyZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBleHQzX2dldF9ibG9jayk7CiAJaWYgKHJldCkKLQkJZ290byBwcmVwYXJlX3dyaXRlX2ZhaWxlZDsKKwkJZ290byBmYWlsdXJlOwogCiAJaWYgKGV4dDNfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKIAkJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZmZlcnMocGFnZSksCiAJCQkJZnJvbSwgdG8sIE5VTEwsIGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyk7CisJCWlmIChyZXQpCisJCQkvKiBmYXRhbCBlcnJvciwganVzdCBwdXQgdGhlIGhhbmRsZSBhbmQgcmV0dXJuICovCisJCQlqb3VybmFsX3N0b3AoaGFuZGxlKTsKIAl9Ci1wcmVwYXJlX3dyaXRlX2ZhaWxlZDoKLQlpZiAocmV0KQotCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCXJldHVybiByZXQ7CisKK2ZhaWx1cmU6CisJcmV0MiA9IGV4dDNfcHJlcGFyZV9mYWlsdXJlKGZpbGUsIHBhZ2UsIGZyb20sIHRvKTsKKwlpZiAocmV0MiA8IDApCisJCXJldHVybiByZXQyOwogCWlmIChyZXQgPT0gLUVOT1NQQyAmJiBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS0+aV9zYiwgJnJldHJpZXMpKQogCQlnb3RvIHJldHJ5Owotb3V0OgorCS8qIHJldHJ5IG51bWJlciBleGNlZWRlZCwgb3Igb3RoZXIgZXJyb3IgbGlrZSAtRURRVU9UICovCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pb2N0bC5jIGIvZnMvZXh0My9pb2N0bC5jCmluZGV4IDEyZGFhNjguLjliODA5MGQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW9jdGwuYworKysgYi9mcy9leHQzL2lvY3RsLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogI2lmZGVmIENPTkZJR19DT01QQVQKIGxvbmcgZXh0M19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0OwogCiAJLyogVGhlc2UgYXJlIGp1c3QgbWlzbmFtZWQsIHRoZXkgYWN0dWFsbHkgZ2V0L3B1dCBmcm9tL3RvIHVzZXIgYW4gaW50ICovCmRpZmYgLS1naXQgYS9mcy9leHQzL25hbWVpLmMgYi9mcy9leHQzL25hbWVpLmMKaW5kZXggOTA2NzMxYS4uNGRmMzljNCAxMDA2NDQKLS0tIGEvZnMvZXh0My9uYW1laS5jCisrKyBiL2ZzL2V4dDMvbmFtZWkuYwpAQCAtNTUyLDYgKzU1MiwxNSBAQAogCQkJCQkgICBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0KIAkJCQkJICAgRVhUM19ESVJfUkVDX0xFTigwKSk7CiAJZm9yICg7IGRlIDwgdG9wOyBkZSA9IGV4dDNfbmV4dF9lbnRyeShkZSkpIHsKKwkJaWYgKCFleHQzX2NoZWNrX2Rpcl9lbnRyeSgiaHRyZWVfZGlyYmxvY2tfdG9fdHJlZSIsIGRpciwgZGUsIGJoLAorCQkJCQkoYmxvY2s8PEVYVDNfQkxPQ0tfU0laRV9CSVRTKGRpci0+aV9zYikpCisJCQkJCQkrKChjaGFyICopZGUgLSBiaC0+Yl9kYXRhKSkpIHsKKwkJCS8qIE9uIGVycm9yLCBza2lwIHRoZSBmX3BvcyB0byB0aGUgbmV4dCBibG9jay4gKi8KKwkJCWRpcl9maWxlLT5mX3BvcyA9IChkaXJfZmlsZS0+Zl9wb3MgfAorCQkJCQkoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSArIDE7CisJCQlicmVsc2UgKGJoKTsKKwkJCXJldHVybiBjb3VudDsKKwkJfQogCQlleHQzZnNfZGlyaGFzaChkZS0+bmFtZSwgZGUtPm5hbWVfbGVuLCBoaW5mbyk7CiAJCWlmICgoaGluZm8tPmhhc2ggPCBzdGFydF9oYXNoKSB8fAogCQkgICAgKChoaW5mby0+aGFzaCA9PSBzdGFydF9oYXNoKSAmJgpAQCAtNTkzLDcgKzYwMiw3IEBACiAKIAlkeHRyYWNlKHByaW50aygiSW4gaHRyZWVfZmlsbF90cmVlLCBzdGFydCBoYXNoOiAleDoleFxuIiwgc3RhcnRfaGFzaCwKIAkJICAgICAgIHN0YXJ0X21pbm9yX2hhc2gpKTsKLQlkaXIgPSBkaXJfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJZGlyID0gZGlyX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKCEoRVhUM19JKGRpciktPmlfZmxhZ3MgJiBFWFQzX0lOREVYX0ZMKSkgewogCQloaW5mby5oYXNoX3ZlcnNpb24gPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfZGVmX2hhc2hfdmVyc2lvbjsKIAkJaGluZm8uc2VlZCA9IEVYVDNfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CkBAIC02MDQsNyArNjEzLDcgQEAKIAl9CiAJaGluZm8uaGFzaCA9IHN0YXJ0X2hhc2g7CiAJaGluZm8ubWlub3JfaGFzaCA9IDA7Ci0JZnJhbWUgPSBkeF9wcm9iZShOVUxMLCBkaXJfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsICZoaW5mbywgZnJhbWVzLCAmZXJyKTsKKwlmcmFtZSA9IGR4X3Byb2JlKE5VTEwsIGRpcl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCAmaGluZm8sIGZyYW1lcywgJmVycik7CiAJaWYgKCFmcmFtZSkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IGFmYzJkNGYuLmIzNDg4NjcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTQzNiw3ICs0MzYsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqZXh0M19pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dDNfaW5vZGVfY2FjaGVwOwogCiAvKgogICogQ2FsbGVkIGluc2lkZSB0cmFuc2FjdGlvbiwgc28gdXNlIEdGUF9OT0ZTCkBAIC00NDUsNyArNDQ1LDcgQEAKIHsKIAlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaTsKIAotCWVpID0ga21lbV9jYWNoZV9hbGxvYyhleHQzX2lub2RlX2NhY2hlcCwgU0xBQl9OT0ZTKTsKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MoZXh0M19pbm9kZV9jYWNoZXAsIEdGUF9OT0ZTKTsKIAlpZiAoIWVpKQogCQlyZXR1cm4gTlVMTDsKICNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCWttZW1fY2FjaGVfZnJlZShleHQzX2lub2RlX2NhY2hlcCwgRVhUM19JKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqKSBmb287CiAKQEAgLTEyNjQsNiArMTI2NCwxMiBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKGJkZXZfcmVhZF9vbmx5KHNiLT5zX2JkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogd3JpdGUgYWNjZXNzICIKKwkJCSJ1bmF2YWlsYWJsZSwgc2tpcHBpbmcgb3JwaGFuIGNsZWFudXAuXG4iKTsKKwkJcmV0dXJuOworCX0KKwogCWlmIChFWFQzX1NCKHNiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDNfRVJST1JfRlMpIHsKIAkJaWYgKGVzLT5zX2xhc3Rfb3JwaGFuKQogCQkJamJkX2RlYnVnKDEsICJFcnJvcnMgb24gZmlsZXN5c3RlbSwgIgpAQCAtMTM0MSw4ICsxMzQ3LDYgQEAKIAlzYi0+c19mbGFncyA9IHNfZmxhZ3M7IC8qIFJlc3RvcmUgTVNfUkRPTkxZIHN0YXR1cyAqLwogfQogCi0jZGVmaW5lIGxvZzIobikgZmZ6KH4obikpCi0KIC8qCiAgKiBNYXhpbWFsIGZpbGUgc2l6ZS4gIFRoZXJlIGlzIGEgZGlyZWN0LCBhbmQgeyxkb3VibGUtLHRyaXBsZS19aW5kaXJlY3QKICAqIGJsb2NrIGxpbWl0LCBhbmQgYWxzbyBhIGxpbWl0IG9mICgyXjMyIC0gMSkgNTEyLWJ5dGUgc2VjdG9ycyBpbiBpX2Jsb2Nrcy4KQEAgLTE1OTEsOCArMTU5NSw4IEBACiAJc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrID0gYmxvY2tzaXplIC8gc2l6ZW9mKHN0cnVjdCBleHQzX2dyb3VwX2Rlc2MpOwogCXNiaS0+c19zYmggPSBiaDsKIAlzYmktPnNfbW91bnRfc3RhdGUgPSBsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSk7Ci0Jc2JpLT5zX2FkZHJfcGVyX2Jsb2NrX2JpdHMgPSBsb2cyKEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpKTsKLQlzYmktPnNfZGVzY19wZXJfYmxvY2tfYml0cyA9IGxvZzIoRVhUM19ERVNDX1BFUl9CTE9DSyhzYikpOworCXNiaS0+c19hZGRyX3Blcl9ibG9ja19iaXRzID0gaWxvZzIoRVhUM19BRERSX1BFUl9CTE9DSyhzYikpOworCXNiaS0+c19kZXNjX3Blcl9ibG9ja19iaXRzID0gaWxvZzIoRVhUM19ERVNDX1BFUl9CTE9DSyhzYikpOwogCWZvciAoaT0wOyBpIDwgNDsgaSsrKQogCQlzYmktPnNfaGFzaF9zZWVkW2ldID0gbGUzMl90b19jcHUoZXMtPnNfaGFzaF9zZWVkW2ldKTsKIAlzYmktPnNfZGVmX2hhc2hfdmVyc2lvbiA9IGVzLT5zX2RlZl9oYXNoX3ZlcnNpb247CkBAIC0yMzg3LDYgKzIzOTEsNyBAQAogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKIAlleHQzX2ZzYmxrX3Qgb3ZlcmhlYWQ7CiAJaW50IGk7CisJdTY0IGZzaWQ7CiAKIAlpZiAodGVzdF9vcHQgKHNiLCBNSU5JWF9ERikpCiAJCW92ZXJoZWFkID0gMDsKQEAgLTI0MzMsNiArMjQzOCwxMCBAQAogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CiAJYnVmLT5mX2ZmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlidWYtPmZfbmFtZWxlbiA9IEVYVDNfTkFNRV9MRU47CisJZnNpZCA9IGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQpIF4KKwkgICAgICAgbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCArIHNpemVvZih1NjQpKTsKKwlidWYtPmZfZnNpZC52YWxbMF0gPSBmc2lkICYgMHhGRkZGRkZGRlVMOworCWJ1Zi0+Zl9mc2lkLnZhbFsxXSA9IChmc2lkID4+IDMyKSAmIDB4RkZGRkZGRkZVTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5jIGIvZnMvZXh0My94YXR0ci5jCmluZGV4IGY4NmYyNDguLjk5ODU3YTQwIDEwMDY0NAotLS0gYS9mcy9leHQzL3hhdHRyLmMKKysrIGIvZnMvZXh0My94YXR0ci5jCkBAIC00NTksMTQgKzQ1OSwxMSBAQAogCWlmIChFWFQzX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUikpCiAJCXJldHVybjsKIAotCWxvY2tfc3VwZXIoc2IpOwogCWlmIChleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCkgPT0gMCkgewotCQlFWFQzX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCB8PQotCQkJY3B1X3RvX2xlMzIoRVhUM19GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUik7CisJCUVYVDNfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKTsKIAkJc2ItPnNfZGlydCA9IDE7CiAJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CiAJfQotCXVubG9ja19zdXBlcihzYik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9leHQ0L01ha2VmaWxlIGIvZnMvZXh0NC9NYWtlZmlsZQppbmRleCBhNmFjYjk2Li5hZTZlN2U1IDEwMDY0NAotLS0gYS9mcy9leHQ0L01ha2VmaWxlCisrKyBiL2ZzL2V4dDQvTWFrZWZpbGUKQEAgLTUsNyArNSw4IEBACiBvYmotJChDT05GSUdfRVhUNERFVl9GUykgKz0gZXh0NGRldi5vCiAKIGV4dDRkZXYteQk6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIFwKLQkgICBpb2N0bC5vIG5hbWVpLm8gc3VwZXIubyBzeW1saW5rLm8gaGFzaC5vIHJlc2l6ZS5vIGV4dGVudHMubworCQkgICBpb2N0bC5vIG5hbWVpLm8gc3VwZXIubyBzeW1saW5rLm8gaGFzaC5vIHJlc2l6ZS5vIGV4dGVudHMubyBcCisJCSAgIGV4dDRfamJkMi5vCiAKIGV4dDRkZXYtJChDT05GSUdfRVhUNERFVl9GU19YQVRUUikJKz0geGF0dHIubyB4YXR0cl91c2VyLm8geGF0dHJfdHJ1c3RlZC5vCiBleHQ0ZGV2LSQoQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMKQkrPSBhY2wubwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9iYWxsb2MuYyBiL2ZzL2V4dDQvYmFsbG9jLmMKaW5kZXggNWQ0NTU4Mi4uYzRkZDExMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9iYWxsb2MuYworKysgYi9mcy9leHQ0L2JhbGxvYy5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAogCXByaW50aygiQmxvY2sgQWxsb2NhdGlvbiBSZXNlcnZhdGlvbiBXaW5kb3dzIE1hcCAoJXMpOlxuIiwgZm4pOwogCXdoaWxlIChuKSB7Ci0JCXJzdiA9IGxpc3RfZW50cnkobiwgc3RydWN0IGV4dDRfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOworCQlyc3YgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlLCByc3Zfbm9kZSk7CiAJCWlmICh2ZXJib3NlKQogCQkJcHJpbnRrKCJyZXNlcnZhdGlvbiB3aW5kb3cgMHglcCAiCiAJCQkgICAgICAgInN0YXJ0OiAgJWxsdSwgZW5kOiAgJWxsdVxuIiwKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCQloZXJlID0gMDsKIAogCXAgPSAoKGNoYXIgKiliaC0+Yl9kYXRhKSArIChoZXJlID4+IDMpOwotCXIgPSBtZW1zY2FuKHAsIDAsIChtYXhibG9ja3MgLSBoZXJlICsgNykgPj4gMyk7CisJciA9IG1lbXNjYW4ocCwgMCwgKChtYXhibG9ja3MgKyA3KSA+PiAzKSAtIChoZXJlID4+IDMpKTsKIAluZXh0ID0gKHIgLSAoKGNoYXIgKiliaC0+Yl9kYXRhKSkgPDwgMzsKIAogCWlmIChuZXh0IDwgbWF4YmxvY2tzICYmIG5leHQgPj0gc3RhcnQgJiYgZXh0NF90ZXN0X2FsbG9jYXRhYmxlKG5leHQsIGJoKSkKQEAgLTk2Niw3ICs5NjYsNyBAQAogCiAJCXByZXYgPSByc3Y7CiAJCW5leHQgPSByYl9uZXh0KCZyc3YtPnJzdl9ub2RlKTsKLQkJcnN2ID0gbGlzdF9lbnRyeShuZXh0LHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUscnN2X25vZGUpOworCQlyc3YgPSByYl9lbnRyeShuZXh0LHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUscnN2X25vZGUpOwogCiAJCS8qCiAJCSAqIFJlYWNoZWQgdGhlIGxhc3QgcmVzZXJ2YXRpb24sIHdlIGNhbiBqdXN0IGFwcGVuZCB0byB0aGUKQEAgLTExNjUsNyArMTE2NSw3IEBACiAJICogY2hlY2sgaWYgdGhlIGZpcnN0IGZyZWUgYmxvY2sgaXMgd2l0aGluIHRoZQogCSAqIGZyZWUgc3BhY2Ugd2UganVzdCByZXNlcnZlZAogCSAqLwotCWlmIChzdGFydF9ibG9jayA+PSBteV9yc3YtPnJzdl9zdGFydCAmJiBzdGFydF9ibG9jayA8IG15X3Jzdi0+cnN2X2VuZCkKKwlpZiAoc3RhcnRfYmxvY2sgPj0gbXlfcnN2LT5yc3Zfc3RhcnQgJiYgc3RhcnRfYmxvY2sgPD0gbXlfcnN2LT5yc3ZfZW5kKQogCQlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KIAkvKgogCSAqIGlmIHRoZSBmaXJzdCBmcmVlIGJpdCB3ZSBmb3VuZCBpcyBvdXQgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAJaWYgKCFuZXh0KQogCQlteV9yc3YtPnJzdl9lbmQgKz0gc2l6ZTsKIAllbHNlIHsKLQkJbmV4dF9yc3YgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBleHQ0X3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKwkJbmV4dF9yc3YgPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgZXh0NF9yZXNlcnZlX3dpbmRvd19ub2RlLCByc3Zfbm9kZSk7CiAKIAkJaWYgKChuZXh0X3Jzdi0+cnN2X3N0YXJ0IC0gbXlfcnN2LT5yc3ZfZW5kIC0gMSkgPj0gc2l6ZSkKIAkJCW15X3Jzdi0+cnN2X2VuZCArPSBzaXplOwpAQCAtMTI4OCw3ICsxMjg4LDcgQEAKIAl9CiAJLyoKIAkgKiBncnBfZ29hbCBpcyBhIGdyb3VwIHJlbGF0aXZlIGJsb2NrIG51bWJlciAoaWYgdGhlcmUgaXMgYSBnb2FsKQotCSAqIDAgPCBncnBfZ29hbCA8IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikKKwkgKiAwIDw9IGdycF9nb2FsIDwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKQogCSAqIGZpcnN0IGJsb2NrIGlzIGEgZmlsZXN5c3RlbSB3aWRlIGJsb2NrIG51bWJlcgogCSAqIGZpcnN0IGJsb2NrIGlzIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIGluIHRoaXMgZ3JvdXAKIAkgKi8KQEAgLTEzMjQsMTAgKzEzMjQsMTQgQEAKIAkJCWlmICghZ29hbF9pbl9teV9yZXNlcnZhdGlvbigmbXlfcnN2LT5yc3Zfd2luZG93LAogCQkJCQkJCWdycF9nb2FsLCBncm91cCwgc2IpKQogCQkJCWdycF9nb2FsID0gLTE7Ci0JCX0gZWxzZSBpZiAoZ3JwX2dvYWwgPiAwICYmCi0JCQkgIChteV9yc3YtPnJzdl9lbmQtZ3JwX2dvYWwrMSkgPCAqY291bnQpCi0JCQl0cnlfdG9fZXh0ZW5kX3Jlc2VydmF0aW9uKG15X3Jzdiwgc2IsCi0JCQkJCSpjb3VudC1teV9yc3YtPnJzdl9lbmQgKyBncnBfZ29hbCAtIDEpOworCQl9IGVsc2UgaWYgKGdycF9nb2FsID49IDApIHsKKwkJCWludCBjdXJyID0gbXlfcnN2LT5yc3ZfZW5kIC0KKwkJCQkJKGdycF9nb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2spICsgMTsKKworCQkJaWYgKGN1cnIgPCAqY291bnQpCisJCQkJdHJ5X3RvX2V4dGVuZF9yZXNlcnZhdGlvbihteV9yc3YsIHNiLAorCQkJCQkJCSpjb3VudCAtIGN1cnIpOworCQl9CiAKIAkJaWYgKChteV9yc3YtPnJzdl9zdGFydCA+IGdyb3VwX2xhc3RfYmxvY2spIHx8CiAJCQkJKG15X3Jzdi0+cnN2X2VuZCA8IGdyb3VwX2ZpcnN0X2Jsb2NrKSkgewpAQCAtMTUyNSwxMCArMTUyOSw4IEBACiAJCWlmIChncm91cF9ubyA+PSBuZ3JvdXBzKQogCQkJZ3JvdXBfbm8gPSAwOwogCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cF9ubywgJmdkcF9iaCk7Ci0JCWlmICghZ2RwKSB7Ci0JCQkqZXJycCA9IC1FSU87Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoIWdkcCkKKwkJCWdvdG8gaW9fZXJyb3I7CiAJCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CiAJCS8qCiAJCSAqIHNraXAgdGhpcyBncm91cCBpZiB0aGUgbnVtYmVyIG9mCkBAIC0xNTYyLDYgKzE1NjQsNyBAQAogCSAqLwogCWlmIChteV9yc3YpIHsKIAkJbXlfcnN2ID0gTlVMTDsKKwkJd2luZG93c3ogPSAwOwogCQlncm91cF9ubyA9IGdvYWxfZ3JvdXA7CiAJCWdvdG8gcmV0cnlfYWxsb2M7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9kaXIuYyBiL2ZzL2V4dDQvZGlyLmMKaW5kZXggZjg1OTU3OC4uZGE4MDM2OCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9kaXIuYworKysgYi9mcy9leHQ0L2Rpci5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlpbnQgZXJyOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0ID0gMDsKIAogCXNiID0gaW5vZGUtPmlfc2I7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJICogV2UgZG9uJ3Qgc2V0IHRoZSBpbm9kZSBkaXJ0eSBmbGFnIHNpbmNlIGl0J3Mgbm90CiAJCSAqIGNyaXRpY2FsIHRoYXQgaXQgZ2V0IGZsdXNoZWQgYmFjayB0byB0aGUgZGlzay4KIAkJICovCi0JCUVYVDRfSShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgJj0gfkVYVDRfSU5ERVhfRkw7CisJCUVYVDRfSShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+aV9mbGFncyAmPSB+RVhUNF9JTkRFWF9GTDsKIAl9CiAjZW5kaWYKIAlzdG9yZWQgPSAwOwpAQCAtMTUzLDYgKzE1Myw5IEBACiAJCQlleHQ0X2Vycm9yIChzYiwgImV4dDRfcmVhZGRpciIsCiAJCQkJImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKIAkJCQlpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKTsKKwkJCS8qIGNvcnJ1cHQgc2l6ZT8gIE1heWJlIG5vIG1vcmUgYmxvY2tzIHRvIHJlYWQgKi8KKwkJCWlmIChmaWxwLT5mX3BvcyA+IGlub2RlLT5pX2Jsb2NrcyA8PCA5KQorCQkJCWJyZWFrOwogCQkJZmlscC0+Zl9wb3MgKz0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0OwogCQkJY29udGludWU7CiAJCX0KQEAgLTM5OSw3ICs0MDIsNyBAQAogewogCXN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICppbmZvID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWxvZmZfdAljdXJyX3BvczsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CiAJaW50IGVycm9yOwogCkBAIC00MjksNyArNDMyLDcgQEAKIAkJCSB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGZuYW1lICpmbmFtZTsKIAlpbnQJcmV0OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfamJkMi5jIGIvZnMvZXh0NC9leHQ0X2piZDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmFmZTRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0NC9leHQ0X2piZDIuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogSW50ZXJmYWNlIGJldHdlZW4gZXh0NCBhbmQgSkJECisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V4dDRfamJkMi5oPgorCitpbnQgX19leHQ0X2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVyciA9IGpiZDJfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IF9fZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyID0gamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IF9fZXh0NF9qb3VybmFsX2ZvcmdldChjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpOworCWlmIChlcnIpCisJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fRlVOQ1RJT05fXywgYmgsIGhhbmRsZSxlcnIpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX2V4dDRfam91cm5hbF9yZXZva2UoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJZXh0NF9mc2Jsa190IGJsb2NrbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVyciA9IGpiZDJfam91cm5hbF9yZXZva2UoaGFuZGxlLCBibG9ja25yLCBiaCk7CisJaWYgKGVycikKKwkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IF9fZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGNvbnN0IGNoYXIgKndoZXJlLAorCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVyciA9IGpiZDJfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKQorCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX0ZVTkNUSU9OX18sIGJoLCBoYW5kbGUsZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgX19leHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoY29uc3QgY2hhciAqd2hlcmUsCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCWlmIChlcnIpCisJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fRlVOQ1RJT05fXywgYmgsIGhhbmRsZSxlcnIpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCmluZGV4IDI2MDhkY2UuLmRjMjcyNGYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jCisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCkBAIC00OCw3ICs0OCw3IEBACiAgKiBleHRfcGJsb2NrOgogICogY29tYmluZSBsb3cgYW5kIGhpZ2ggcGFydHMgb2YgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGludG8gZXh0NF9mc2Jsa190CiAgKi8KLXN0YXRpYyBpbmxpbmUgZXh0NF9mc2Jsa190IGV4dF9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCkKK3N0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0X3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4KQogewogCWV4dDRfZnNibGtfdCBibG9jazsKIApAQCAtNjEsNyArNjEsNyBAQAogICogaWR4X3BibG9jazoKICAqIGNvbWJpbmUgbG93IGFuZCBoaWdoIHBhcnRzIG9mIGEgbGVhZiBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBleHQ0X2ZzYmxrX3QKICAqLwotc3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgaWR4X3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeCkKK3N0YXRpYyBleHQ0X2ZzYmxrX3QgaWR4X3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeCkKIHsKIAlleHQ0X2ZzYmxrX3QgYmxvY2s7CiAKQEAgLTc1LDcgKzc1LDcgQEAKICAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGV4dGVudCBzdHJ1Y3QsCiAgKiBicmVha2luZyBpdCBpbnRvIHBhcnRzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCwgZXh0NF9mc2Jsa190IHBiKQorc3RhdGljIHZvaWQgZXh0NF9leHRfc3RvcmVfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsIGV4dDRfZnNibGtfdCBwYikKIHsKIAlleC0+ZWVfc3RhcnQgPSBjcHVfdG9fbGUzMigodW5zaWduZWQgbG9uZykgKHBiICYgMHhmZmZmZmZmZikpOwogCWV4LT5lZV9zdGFydF9oaSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBsb25nKSAoKHBiID4+IDMxKSA+PiAxKSAmIDB4ZmZmZik7CkBAIC04Niw3ICs4Niw3IEBACiAgKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBpbmRleCBzdHJ1Y3QsCiAgKiBicmVha2luZyBpdCBpbnRvIHBhcnRzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2lkeF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgsIGV4dDRfZnNibGtfdCBwYikKK3N0YXRpYyB2b2lkIGV4dDRfaWR4X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeCwgZXh0NF9mc2Jsa190IHBiKQogewogCWl4LT5laV9sZWFmID0gY3B1X3RvX2xlMzIoKHVuc2lnbmVkIGxvbmcpIChwYiAmIDB4ZmZmZmZmZmYpKTsKIAlpeC0+ZWlfbGVhZl9oaSA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBsb25nKSAoKHBiID4+IDMxKSA+PiAxKSAmIDB4ZmZmZik7CkBAIC0xODYsNyArMTg2LDggQEAKIAkJZGVwdGggPSBwYXRoLT5wX2RlcHRoOwogCiAJCS8qIHRyeSB0byBwcmVkaWN0IGJsb2NrIHBsYWNlbWVudCAqLwotCQlpZiAoKGV4ID0gcGF0aFtkZXB0aF0ucF9leHQpKQorCQlleCA9IHBhdGhbZGVwdGhdLnBfZXh0OworCQlpZiAoZXgpCiAJCQlyZXR1cm4gZXh0X3BibG9jayhleCkrKGJsb2NrLWxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykpOwogCiAJCS8qIGl0IGxvb2tzIGxpa2UgaW5kZXggaXMgZW1wdHk7CkBAIC0yMTUsNyArMjE2LDcgQEAKIAlyZXR1cm4gbmV3YmxvY2s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGV4dDRfZXh0X3NwYWNlX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IGV4dDRfZXh0X3NwYWNlX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IHNpemU7CiAKQEAgLTIyOCw3ICsyMjksNyBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBleHQ0X2V4dF9zcGFjZV9ibG9ja19pZHgoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbnQgZXh0NF9leHRfc3BhY2VfYmxvY2tfaWR4KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IHNpemU7CiAKQEAgLTI0MSw3ICsyNDIsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBleHQ0X2V4dF9zcGFjZV9yb290KHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IGV4dDRfZXh0X3NwYWNlX3Jvb3Qoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlpbnQgc2l6ZTsKIApAQCAtMjU1LDcgKzI1Niw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4KHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IHNpemU7CiAKQEAgLTQ3NiwxMyArNDc3LDEyIEBACiAKIAkvKiBhY2NvdW50IHBvc3NpYmxlIGRlcHRoIGluY3JlYXNlICovCiAJaWYgKCFwYXRoKSB7Ci0JCXBhdGggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfcGF0aCkgKiAoZGVwdGggKyAyKSwKKwkJcGF0aCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dF9wYXRoKSAqIChkZXB0aCArIDIpLAogCQkJCUdGUF9OT0ZTKTsKIAkJaWYgKCFwYXRoKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJCWFsbG9jID0gMTsKIAl9Ci0JbWVtc2V0KHBhdGgsIDAsIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfcGF0aCkgKiAoZGVwdGggKyAxKSk7CiAJcGF0aFswXS5wX2hkciA9IGVoOwogCiAJLyogd2FsayB0aHJvdWdoIHRoZSB0cmVlICovCkBAIC01NDMsNyArNTQzLDggQEAKIAlzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeDsKIAlpbnQgbGVuLCBlcnI7CiAKLQlpZiAoKGVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgY3VycCkpKQorCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgY3VycCk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCUJVR19PTihsb2dpY2FsID09IGxlMzJfdG9fY3B1KGN1cnAtPnBfaWR4LT5laV9ibG9jaykpOwpAQCAtNjQxLDEwICs2NDIsOSBAQAogCSAqIFdlIG5lZWQgdGhpcyB0byBoYW5kbGUgZXJyb3JzIGFuZCBmcmVlIGJsb2NrcwogCSAqIHVwb24gdGhlbS4KIAkgKi8KLQlhYmxvY2tzID0ga21hbGxvYyhzaXplb2YoZXh0NF9mc2Jsa190KSAqIGRlcHRoLCBHRlBfTk9GUyk7CisJYWJsb2NrcyA9IGt6YWxsb2Moc2l6ZW9mKGV4dDRfZnNibGtfdCkgKiBkZXB0aCwgR0ZQX05PRlMpOwogCWlmICghYWJsb2NrcykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGFibG9ja3MsIDAsIHNpemVvZihleHQ0X2ZzYmxrX3QpICogZGVwdGgpOwogCiAJLyogYWxsb2NhdGUgYWxsIG5lZWRlZCBibG9ja3MgKi8KIAlleHRfZGVidWcoImFsbG9jYXRlICVkIGJsb2NrcyBmb3IgaW5kZXhlcy9sZWFmXG4iLCBkZXB0aCAtIGF0KTsKQEAgLTY2NSw3ICs2NjUsOCBAQAogCX0KIAlsb2NrX2J1ZmZlcihiaCk7CiAKLQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKSkpCisJZXJyID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCWlmIChlcnIpCiAJCWdvdG8gY2xlYW51cDsKIAogCW5laCA9IGV4dF9ibG9ja19oZHIoYmgpOwpAQCAtNzAyLDE4ICs3MDMsMjEgQEAKIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAl1bmxvY2tfYnVmZmVyKGJoKTsKIAotCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpKSkKKwllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKIAkJZ290byBjbGVhbnVwOwogCWJyZWxzZShiaCk7CiAJYmggPSBOVUxMOwogCiAJLyogY29ycmVjdCBvbGQgbGVhZiAqLwogCWlmIChtKSB7Ci0JCWlmICgoZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpKSkKKwkJZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCQlpZiAoZXJyKQogCQkJZ290byBjbGVhbnVwOwogCQlwYXRoW2RlcHRoXS5wX2hkci0+ZWhfZW50cmllcyA9CiAJCSAgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocGF0aFtkZXB0aF0ucF9oZHItPmVoX2VudHJpZXMpLW0pOwotCQlpZiAoKGVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCkpKQorCQllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCQlpZiAoZXJyKQogCQkJZ290byBjbGVhbnVwOwogCiAJfQpAQCAtNzM2LDcgKzc0MCw4IEBACiAJCX0KIAkJbG9ja19idWZmZXIoYmgpOwogCi0JCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpKSkKKwkJZXJyID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKQogCQkJZ290byBjbGVhbnVwOwogCiAJCW5laCA9IGV4dF9ibG9ja19oZHIoYmgpOwpAQCAtNzgwLDcgKzc4NSw4IEBACiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAotCQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKSkpCisJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJaWYgKGVycikKIAkJCWdvdG8gY2xlYW51cDsKIAkJYnJlbHNlKGJoKTsKIAkJYmggPSBOVUxMOwpAQCAtODAwLDkgKzgwNiw2IEBACiAJfQogCiAJLyogaW5zZXJ0IG5ldyBpbmRleCAqLwotCWlmIChlcnIpCi0JCWdvdG8gY2xlYW51cDsKLQogCWVyciA9IGV4dDRfZXh0X2luc2VydF9pbmRleChoYW5kbGUsIGlub2RlLCBwYXRoICsgYXQsCiAJCQkJICAgIGxlMzJfdG9fY3B1KGJvcmRlciksIG5ld2Jsb2NrKTsKIApAQCAtODU3LDcgKzg2MCw4IEBACiAJfQogCWxvY2tfYnVmZmVyKGJoKTsKIAotCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpKSkgeworCWVyciA9IGV4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKSB7CiAJCXVubG9ja19idWZmZXIoYmgpOwogCQlnb3RvIG91dDsKIAl9CkBAIC04NzcsMTEgKzg4MSwxMyBAQAogCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCXVubG9ja19idWZmZXIoYmgpOwogCi0JaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCkpKQorCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAogCS8qIGNyZWF0ZSBpbmRleCBpbiBuZXcgdG9wLWxldmVsIGluZGV4OiBudW0sbWF4LHBvaW50ZXIgKi8KLQlpZiAoKGVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgY3VycCkpKQorCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgY3VycCk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAljdXJwLT5wX2hkci0+ZWhfbWFnaWMgPSBFWFQ0X0VYVF9NQUdJQzsKQEAgLTEwNzMsMjcgKzEwNzksMzEgQEAKIAkgKi8KIAlrID0gZGVwdGggLSAxOwogCWJvcmRlciA9IHBhdGhbZGVwdGhdLnBfZXh0LT5lZV9ibG9jazsKLQlpZiAoKGVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGspKSkKKwllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBrKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCXBhdGhba10ucF9pZHgtPmVpX2Jsb2NrID0gYm9yZGVyOwotCWlmICgoZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGspKSkKKwllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgayk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCXdoaWxlIChrLS0pIHsKIAkJLyogY2hhbmdlIGFsbCBsZWZ0LXNpZGUgaW5kZXhlcyAqLwogCQlpZiAocGF0aFtrKzFdLnBfaWR4ICE9IEVYVF9GSVJTVF9JTkRFWChwYXRoW2srMV0ucF9oZHIpKQogCQkJYnJlYWs7Ci0JCWlmICgoZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgaykpKQorCQllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBrKTsKKwkJaWYgKGVycikKIAkJCWJyZWFrOwogCQlwYXRoW2tdLnBfaWR4LT5laV9ibG9jayA9IGJvcmRlcjsKLQkJaWYgKChlcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgaykpKQorCQllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoICsgayk7CisJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGlubGluZQorc3RhdGljIGludAogZXh0NF9jYW5fZXh0ZW50c19iZV9tZXJnZWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZXh0ZW50ICpleDEsCiAJCQkJc3RydWN0IGV4dDRfZXh0ZW50ICpleDIpCiB7CkBAIC0xMTQ1LDcgKzExNTUsOCBAQAogCQkJCWxlMTZfdG9fY3B1KG5ld2V4dC0+ZWVfbGVuKSwKIAkJCQlsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spLAogCQkJCWxlMTZfdG9fY3B1KGV4LT5lZV9sZW4pLCBleHRfcGJsb2NrKGV4KSk7Ci0JCWlmICgoZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpKSkKKwkJZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJZXgtPmVlX2xlbiA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGV4LT5lZV9sZW4pCiAJCQkJCSArIGxlMTZfdG9fY3B1KG5ld2V4dC0+ZWVfbGVuKSk7CkBAIC0xMTk1LDcgKzEyMDYsOCBAQAogaGFzX3NwYWNlOgogCW5lYXJleCA9IHBhdGhbZGVwdGhdLnBfZXh0OwogCi0JaWYgKChlcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCkpKQorCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCArIGRlcHRoKTsKKwlpZiAoZXJyKQogCQlnb3RvIGNsZWFudXA7CiAKIAlpZiAoIW5lYXJleCkgewpAQCAtMTM4Myw3ICsxMzk1LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBleHQ0X2V4dF9wdXRfaW5fY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgX191MzIgYmxvY2ssCiAJCQlfX3UzMiBsZW4sIF9fdTMyIHN0YXJ0LCBpbnQgdHlwZSkKIHsKQEAgLTE0MDEsNyArMTQxMyw3IEBACiAgKiBjYWxjdWxhdGUgYm91bmRhcmllcyBvZiB0aGUgZ2FwIHRoYXQgdGhlIHJlcXVlc3RlZCBibG9jayBmaXRzIGludG8KICAqIGFuZCBjYWNoZSB0aGlzIGdhcAogICovCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyB2b2lkCiBleHQ0X2V4dF9wdXRfZ2FwX2luX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAogCQkJCXVuc2lnbmVkIGxvbmcgYmxvY2spCiB7CkBAIC0xNDQyLDcgKzE0NTQsNyBAQAogCWV4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgbGJsb2NrLCBsZW4sIDAsIEVYVDRfRVhUX0NBQ0hFX0dBUCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CiBleHQ0X2V4dF9pbl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGJsb2NrLAogCQkJc3RydWN0IGV4dDRfZXh0ZW50ICpleCkKIHsKQEAgLTE0ODksMTAgKzE1MDEsMTIgQEAKIAlwYXRoLS07CiAJbGVhZiA9IGlkeF9wYmxvY2socGF0aC0+cF9pZHgpOwogCUJVR19PTihwYXRoLT5wX2hkci0+ZWhfZW50cmllcyA9PSAwKTsKLQlpZiAoKGVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCkpKQorCWVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aCk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlwYXRoLT5wX2hkci0+ZWhfZW50cmllcyA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KHBhdGgtPnBfaGRyLT5laF9lbnRyaWVzKS0xKTsKLQlpZiAoKGVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGgpKSkKKwllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCWV4dF9kZWJ1ZygiaW5kZXggaXMgZW1wdHksIHJlbW92ZSBpdCwgZnJlZSBibG9jayAlbGx1XG4iLCBsZWFmKTsKIAliaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKGlub2RlLT5pX3NiLCBsZWFmKTsKQEAgLTE1MDksNyArMTUyMyw3IEBACiAgKiB0aGUgY2FsbGVyIHNob3VsZCBjYWxjdWxhdGUgY3JlZGl0cyB1bmRlciB0cnVuY2F0ZV9tdXRleCBhbmQKICAqIHBhc3MgdGhlIGFjdHVhbCBwYXRoLgogICovCi1pbnQgaW5saW5lIGV4dDRfZXh0X2NhbGNfY3JlZGl0c19mb3JfaW5zZXJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCitpbnQgZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9pbnNlcnQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQogewogCWludCBkZXB0aCwgbmVlZGVkOwpAQCAtMTUzNCwxNiArMTU0OCwxNyBAQAogCiAJLyoKIAkgKiB0cmVlIGNhbiBiZSBmdWxsLCBzbyBpdCB3b3VsZCBuZWVkIHRvIGdyb3cgaW4gZGVwdGg6Ci0JICogYWxsb2NhdGlvbiArIG9sZCByb290ICsgbmV3IHJvb3QKKwkgKiB3ZSBuZWVkIG9uZSBjcmVkaXQgdG8gbW9kaWZ5IG9sZCByb290LCBjcmVkaXRzIGZvcgorCSAqIG5ldyByb290IHdpbGwgYmUgYWRkZWQgaW4gc3BsaXQgYWNjb3VudGluZwogCSAqLwotCW5lZWRlZCArPSAyICsgMSArIDE7CisJbmVlZGVkICs9IDE7CiAKIAkvKgogCSAqIEluZGV4IHNwbGl0IGNhbiBoYXBwZW4sIHdlIHdvdWxkIG5lZWQ6CiAJICogICAgYWxsb2NhdGUgaW50ZXJtZWRpYXRlIGluZGV4ZXMgKGJpdG1hcCArIGdyb3VwKQogCSAqICArIGNoYW5nZSB0d28gYmxvY2tzIGF0IGVhY2ggbGV2ZWwsIGJ1dCByb290IChhbHJlYWR5IGluY2x1ZGVkKQogCSAqLwotCW5lZWRlZCA9IChkZXB0aCAqIDIpICsgKGRlcHRoICogMik7CisJbmVlZGVkICs9IChkZXB0aCAqIDIpICsgKGRlcHRoICogMik7CiAKIAkvKiBhbnkgYWxsb2NhdGlvbiBtb2RpZmllcyBzdXBlcmJsb2NrICovCiAJbmVlZGVkICs9IDE7CkBAIC0xNzE4LDcgKzE3MzMsNyBAQAogICogZXh0NF9leHRfbW9yZV90b19ybToKICAqIHJldHVybnMgMSBpZiBjdXJyZW50IGluZGV4IGhhcyB0byBiZSBmcmVlZCAoZXZlbiBwYXJ0aWFsKQogICovCi1zdGF0aWMgaW50IGlubGluZQorc3RhdGljIGludAogZXh0NF9leHRfbW9yZV90b19ybShzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKIHsKIAlCVUdfT04ocGF0aC0+cF9pZHggPT0gTlVMTCk7CkBAIC0xNzU2LDEyICsxNzcxLDExIEBACiAJICogV2Ugc3RhcnQgc2Nhbm5pbmcgZnJvbSByaWdodCBzaWRlLCBmcmVlaW5nIGFsbCB0aGUgYmxvY2tzCiAJICogYWZ0ZXIgaV9zaXplIGFuZCB3YWxraW5nIGludG8gdGhlIHRyZWUgZGVwdGgtd2lzZS4KIAkgKi8KLQlwYXRoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGV4dDRfZXh0X3BhdGgpICogKGRlcHRoICsgMSksIEdGUF9LRVJORUwpOworCXBhdGggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfcGF0aCkgKiAoZGVwdGggKyAxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBhdGggPT0gTlVMTCkgewogCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHBhdGgsIDAsIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfcGF0aCkgKiAoZGVwdGggKyAxKSk7CiAJcGF0aFswXS5wX2hkciA9IGV4dF9pbm9kZV9oZHIoaW5vZGUpOwogCWlmIChleHQ0X2V4dF9jaGVja19oZWFkZXIoX19GVU5DVElPTl9fLCBpbm9kZSwgcGF0aFswXS5wX2hkcikpIHsKIAkJZXJyID0gLUVJTzsKQEAgLTE5MzIsNyArMTk0Niw4IEBACiAJbXV0ZXhfbG9jaygmRVhUNF9JKGlub2RlKS0+dHJ1bmNhdGVfbXV0ZXgpOwogCiAJLyogY2hlY2sgaW4gY2FjaGUgKi8KLQlpZiAoKGdvYWwgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCAmbmV3ZXgpKSkgeworCWdvYWwgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCAmbmV3ZXgpOworCWlmIChnb2FsKSB7CiAJCWlmIChnb2FsID09IEVYVDRfRVhUX0NBQ0hFX0dBUCkgewogCQkJaWYgKCFjcmVhdGUpIHsKIAkJCQkvKiBibG9jayBpc24ndCBhbGxvY2F0ZWQgeWV0IGFuZApAQCAtMTk3MSw3ICsxOTg2LDggQEAKIAkgKi8KIAlCVUdfT04ocGF0aFtkZXB0aF0ucF9leHQgPT0gTlVMTCAmJiBkZXB0aCAhPSAwKTsKIAotCWlmICgoZXggPSBwYXRoW2RlcHRoXS5wX2V4dCkpIHsKKwlleCA9IHBhdGhbZGVwdGhdLnBfZXh0OworCWlmIChleCkgewogCSAgICAgICAgdW5zaWduZWQgbG9uZyBlZV9ibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7CiAJCWV4dDRfZnNibGtfdCBlZV9zdGFydCA9IGV4dF9wYmxvY2soZXgpOwogCQl1bnNpZ25lZCBzaG9ydCBlZV9sZW4gID0gbGUxNl90b19jcHUoZXgtPmVlX2xlbik7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZpbGUuYyBiL2ZzL2V4dDQvZmlsZS5jCmluZGV4IDBiNjIyYzAuLjNiYmMyNGIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZmlsZS5jCisrKyBiL2ZzL2V4dDQvZmlsZS5jCkBAIC01Miw3ICs1Miw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNzaXplX3QgcmV0OwogCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5vZGUuYyBiL2ZzL2V4dDQvaW5vZGUuYwppbmRleCAwYTYwZWM1Li5hMTI3Y2MwIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lub2RlLmMKKysrIGIvZnMvZXh0NC9pbm9kZS5jCkBAIC0xMTQ3LDM3ICsxMTQ3LDEwMiBAQAogCXJldHVybiBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKIH0KIAorLyoKKyAqIFRoZSBpZGVhIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIGZvbGxvd2luZzoKKyAqIGlmIHByZXBhcmVfd3JpdGUgaGFzIGFsbG9jYXRlZCBzb21lIGJsb2NrcywgYnV0IG5vdCBhbGwgb2YgdGhlbSwgdGhlCisgKiB0cmFuc2FjdGlvbiBtdXN0IGluY2x1ZGUgdGhlIGNvbnRlbnQgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9ja3MuCisgKiBUaGlzIGNvbnRlbnQgaXMgZXhwZWN0ZWQgdG8gYmUgc2V0IHRvIHplcm9lcyBieSBibG9ja19wcmVwYXJlX3dyaXRlKCkuCisgKiAyMDA2LzEwLzE0ICBTQVcKKyAqLworc3RhdGljIGludCBleHQ0X3ByZXBhcmVfZmFpbHVyZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICpuZXh0OworCXVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CisJdW5zaWduZWQgYmxvY2tzaXplOworCWludCByZXQ7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGV4dDRfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCisJbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJaWYgKGV4dDRfc2hvdWxkX3dyaXRlYmFja19kYXRhKG1hcHBpbmctPmhvc3QpKSB7CisJCS8qIG9wdGltaXphdGlvbjogbm8gY29uc3RyYWludHMgYWJvdXQgZGF0YSAqLworc2tpcDoKKwkJcmV0dXJuIGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJfQorCisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlibG9ja3NpemUgPSBoZWFkLT5iX3NpemU7CisJZm9yICgJYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7CisJCWJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCSAgICAJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIGJoID0gbmV4dCkKKwl7CisJCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20pCisJCQljb250aW51ZTsKKwkJaWYgKGJsb2NrX3N0YXJ0ID49IHRvKSB7CisJCQlibG9ja19zdGFydCA9IHRvOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJLyogcHJlcGFyZV93cml0ZSBmYWlsZWQgb24gdGhpcyBiaCAqLworCQkJYnJlYWs7CisJCWlmIChleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEobWFwcGluZy0+aG9zdCkpIHsKKwkJCXJldCA9IGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkvKgorCSAqIGJsb2NrX3N0YXJ0IGhlcmUgYmVjb21lcyB0aGUgZmlyc3QgYmxvY2sgd2hlcmUgdGhlIGN1cnJlbnQgaXRlcmF0aW9uCisJICogb2YgcHJlcGFyZV93cml0ZSBmYWlsZWQuCisJICovCisJfQorCWlmIChibG9ja19zdGFydCA8PSBmcm9tKQorCQlnb3RvIHNraXA7CisKKwkvKiBjb21taXQgYWxsb2NhdGVkIGFuZCB6ZXJvZWQgYnVmZmVycyAqLworCXJldHVybiBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKGZpbGUsIHBhZ2UsIGZyb20sIGJsb2NrX3N0YXJ0KTsKK30KKwogc3RhdGljIGludCBleHQ0X3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0JaW50IHJldCwgbmVlZGVkX2Jsb2NrcyA9IGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSk7CisJaW50IHJldCwgcmV0MjsKKwlpbnQgbmVlZGVkX2Jsb2NrcyA9IGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSk7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlpbnQgcmV0cmllcyA9IDA7CiAKIHJldHJ5OgogCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgbmVlZGVkX2Jsb2Nrcyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpICYmIGV4dDRfc2hvdWxkX3dyaXRlYmFja19kYXRhKGlub2RlKSkKIAkJcmV0ID0gbm9iaF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBleHQ0X2dldF9ibG9jayk7CiAJZWxzZQogCQlyZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBleHQ0X2dldF9ibG9jayk7CiAJaWYgKHJldCkKLQkJZ290byBwcmVwYXJlX3dyaXRlX2ZhaWxlZDsKKwkJZ290byBmYWlsdXJlOwogCiAJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKIAkJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZmZlcnMocGFnZSksCiAJCQkJZnJvbSwgdG8sIE5VTEwsIGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyk7CisJCWlmIChyZXQpCisJCQkvKiBmYXRhbCBlcnJvciwganVzdCBwdXQgdGhlIGhhbmRsZSBhbmQgcmV0dXJuICovCisJCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCX0KLXByZXBhcmVfd3JpdGVfZmFpbGVkOgotCWlmIChyZXQpCi0JCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJcmV0dXJuIHJldDsKKworZmFpbHVyZToKKwlyZXQyID0gZXh0NF9wcmVwYXJlX2ZhaWx1cmUoZmlsZSwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChyZXQyIDwgMCkKKwkJcmV0dXJuIHJldDI7CiAJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCiAJCWdvdG8gcmV0cnk7Ci1vdXQ6CisJLyogcmV0cnkgbnVtYmVyIGV4Y2VlZGVkLCBvciBvdGhlciBlcnJvciBsaWtlIC1FRFFVT1QgKi8KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lvY3RsLmMgYi9mcy9leHQ0L2lvY3RsLmMKaW5kZXggMjJhNzM3Yy4uNTAwNTY3ZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pb2N0bC5jCisrKyBiL2ZzL2V4dDQvaW9jdGwuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAjaWZkZWYgQ09ORklHX0NPTVBBVAogbG9uZyBleHQ0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCByZXQ7CiAKIAkvKiBUaGVzZSBhcmUganVzdCBtaXNuYW1lZCwgdGhleSBhY3R1YWxseSBnZXQvcHV0IGZyb20vdG8gdXNlciBhbiBpbnQgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCA4YjFiZDAzLi5lNWE3NGE1IDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC01NTIsNiArNTUyLDE1IEBACiAJCQkJCSAgIGRpci0+aV9zYi0+c19ibG9ja3NpemUgLQogCQkJCQkgICBFWFQ0X0RJUl9SRUNfTEVOKDApKTsKIAlmb3IgKDsgZGUgPCB0b3A7IGRlID0gZXh0NF9uZXh0X2VudHJ5KGRlKSkgeworCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5KCJodHJlZV9kaXJibG9ja190b190cmVlIiwgZGlyLCBkZSwgYmgsCisJCQkJCShibG9jazw8RVhUNF9CTE9DS19TSVpFX0JJVFMoZGlyLT5pX3NiKSkKKwkJCQkJCSsoKGNoYXIgKilkZSAtIGJoLT5iX2RhdGEpKSkgeworCQkJLyogT24gZXJyb3IsIHNraXAgdGhlIGZfcG9zIHRvIHRoZSBuZXh0IGJsb2NrLiAqLworCQkJZGlyX2ZpbGUtPmZfcG9zID0gKGRpcl9maWxlLT5mX3BvcyB8CisJCQkJCShkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKKwkJCWJyZWxzZSAoYmgpOworCQkJcmV0dXJuIGNvdW50OworCQl9CiAJCWV4dDRmc19kaXJoYXNoKGRlLT5uYW1lLCBkZS0+bmFtZV9sZW4sIGhpbmZvKTsKIAkJaWYgKChoaW5mby0+aGFzaCA8IHN0YXJ0X2hhc2gpIHx8CiAJCSAgICAoKGhpbmZvLT5oYXNoID09IHN0YXJ0X2hhc2gpICYmCkBAIC01OTMsNyArNjAyLDcgQEAKIAogCWR4dHJhY2UocHJpbnRrKCJJbiBodHJlZV9maWxsX3RyZWUsIHN0YXJ0IGhhc2g6ICV4OiV4XG4iLCBzdGFydF9oYXNoLAogCQkgICAgICAgc3RhcnRfbWlub3JfaGFzaCkpOwotCWRpciA9IGRpcl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlkaXIgPSBkaXJfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoIShFWFQ0X0koZGlyKS0+aV9mbGFncyAmIEVYVDRfSU5ERVhfRkwpKSB7CiAJCWhpbmZvLmhhc2hfdmVyc2lvbiA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19kZWZfaGFzaF92ZXJzaW9uOwogCQloaW5mby5zZWVkID0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKQEAgLTYwNCw3ICs2MTMsNyBAQAogCX0KIAloaW5mby5oYXNoID0gc3RhcnRfaGFzaDsKIAloaW5mby5taW5vcl9oYXNoID0gMDsKLQlmcmFtZSA9IGR4X3Byb2JlKE5VTEwsIGRpcl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmhpbmZvLCBmcmFtZXMsICZlcnIpOworCWZyYW1lID0gZHhfcHJvYmUoTlVMTCwgZGlyX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsICZoaW5mbywgZnJhbWVzLCAmZXJyKTsKIAlpZiAoIWZyYW1lKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L3Jlc2l6ZS5jIGIvZnMvZXh0NC9yZXNpemUuYwppbmRleCAxZTk1NzgwLi40ZmU0OWMzIDEwMDY0NAotLS0gYS9mcy9leHQ0L3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTY5LDQ0ICs2OSw0OSBAQAogCWVsc2UgaWYgKG91dHNpZGUoaW5wdXQtPmJsb2NrX2JpdG1hcCwgc3RhcnQsIGVuZCkpCiAJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJICAgICAiQmxvY2sgYml0bWFwIG5vdCBpbiBncm91cCAoYmxvY2sgJWxsdSkiLAotCQkJICAgICBpbnB1dC0+YmxvY2tfYml0bWFwKTsKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dC0+YmxvY2tfYml0bWFwKTsKIAllbHNlIGlmIChvdXRzaWRlKGlucHV0LT5pbm9kZV9iaXRtYXAsIHN0YXJ0LCBlbmQpKQogCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKIAkJCSAgICAgIklub2RlIGJpdG1hcCBub3QgaW4gZ3JvdXAgKGJsb2NrICVsbHUpIiwKLQkJCSAgICAgaW5wdXQtPmlub2RlX2JpdG1hcCk7CisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXQtPmlub2RlX2JpdG1hcCk7CiAJZWxzZSBpZiAob3V0c2lkZShpbnB1dC0+aW5vZGVfdGFibGUsIHN0YXJ0LCBlbmQpIHx8CiAJICAgICAgICAgb3V0c2lkZShpdGVuZCAtIDEsIHN0YXJ0LCBlbmQpKQogCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKIAkJCSAgICAgIklub2RlIHRhYmxlIG5vdCBpbiBncm91cCAoYmxvY2tzICVsbHUtJWxsdSkiLAotCQkJICAgICBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kIC0gMSk7CisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEpOwogCWVsc2UgaWYgKGlucHV0LT5pbm9kZV9iaXRtYXAgPT0gaW5wdXQtPmJsb2NrX2JpdG1hcCkKIAkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCiAJCQkgICAgICJCbG9jayBiaXRtYXAgc2FtZSBhcyBpbm9kZSBiaXRtYXAgKCVsbHUpIiwKLQkJCSAgICAgaW5wdXQtPmJsb2NrX2JpdG1hcCk7CisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXQtPmJsb2NrX2JpdG1hcCk7CiAJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5ibG9ja19iaXRtYXAsIGlucHV0LT5pbm9kZV90YWJsZSwgaXRlbmQpKQogCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKIAkJCSAgICAgIkJsb2NrIGJpdG1hcCAoJWxsdSkgaW4gaW5vZGUgdGFibGUgKCVsbHUtJWxsdSkiLAotCQkJICAgICBpbnB1dC0+YmxvY2tfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kLTEpOworCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0LT5ibG9ja19iaXRtYXAsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEpOwogCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+aW5vZGVfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kKSkKIAkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCiAJCQkgICAgICJJbm9kZSBiaXRtYXAgKCVsbHUpIGluIGlub2RlIHRhYmxlICglbGx1LSVsbHUpIiwKLQkJCSAgICAgaW5wdXQtPmlub2RlX2JpdG1hcCwgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZC0xKTsKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dC0+aW5vZGVfYml0bWFwLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0LT5pbm9kZV90YWJsZSwgaXRlbmQgLSAxKTsKIAllbHNlIGlmIChpbnNpZGUoaW5wdXQtPmJsb2NrX2JpdG1hcCwgc3RhcnQsIG1ldGFlbmQpKQogCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKIAkJCSAgICAgIkJsb2NrIGJpdG1hcCAoJWxsdSkgaW4gR0RUIHRhYmxlIgogCQkJICAgICAiICglbGx1LSVsbHUpIiwKLQkJCSAgICAgaW5wdXQtPmJsb2NrX2JpdG1hcCwgc3RhcnQsIG1ldGFlbmQgLSAxKTsKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dC0+YmxvY2tfYml0bWFwLAorCQkJICAgICBzdGFydCwgbWV0YWVuZCAtIDEpOwogCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+aW5vZGVfYml0bWFwLCBzdGFydCwgbWV0YWVuZCkpCiAJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJICAgICAiSW5vZGUgYml0bWFwICglbGx1KSBpbiBHRFQgdGFibGUiCiAJCQkgICAgICIgKCVsbHUtJWxsdSkiLAotCQkJICAgICBpbnB1dC0+aW5vZGVfYml0bWFwLCBzdGFydCwgbWV0YWVuZCAtIDEpOworCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0LT5pbm9kZV9iaXRtYXAsCisJCQkgICAgIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CiAJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5pbm9kZV90YWJsZSwgc3RhcnQsIG1ldGFlbmQpIHx8CiAJICAgICAgICAgaW5zaWRlKGl0ZW5kIC0gMSwgc3RhcnQsIG1ldGFlbmQpKQogCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKIAkJCSAgICAgIklub2RlIHRhYmxlICglbGx1LSVsbHUpIG92ZXJsYXBzIgogCQkJICAgICAiR0RUIHRhYmxlICglbGx1LSVsbHUpIiwKLQkJCSAgICAgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXQtPmlub2RlX3RhYmxlLAorCQkJICAgICBpdGVuZCAtIDEsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CiAJZWxzZQogCQllcnIgPSAwOwogCWJyZWxzZShiaCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggYjRiMDIyYS4uNDg2YTY0MSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtNDg2LDcgKzQ4Niw3IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMga21lbV9jYWNoZV90ICpleHQ0X2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0NF9pbm9kZV9jYWNoZXA7CiAKIC8qCiAgKiBDYWxsZWQgaW5zaWRlIHRyYW5zYWN0aW9uLCBzbyB1c2UgR0ZQX05PRlMKQEAgLTQ5NSw3ICs0OTUsNyBAQAogewogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpOwogCi0JZWkgPSBrbWVtX2NhY2hlX2FsbG9jKGV4dDRfaW5vZGVfY2FjaGVwLCBTTEFCX05PRlMpOworCWVpID0ga21lbV9jYWNoZV9hbGxvYyhleHQ0X2lub2RlX2NhY2hlcCwgR0ZQX05PRlMpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogI2lmZGVmIENPTkZJR19FWFQ0REVWX0ZTX1BPU0lYX0FDTApAQCAtNTEzLDcgKzUxMyw3IEBACiAJa21lbV9jYWNoZV9mcmVlKGV4dDRfaW5vZGVfY2FjaGVwLCBFWFQ0X0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICopIGZvbzsKIApAQCAtMTMyMSw2ICsxMzIxLDEyIEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAoYmRldl9yZWFkX29ubHkoc2ItPnNfYmRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiB3cml0ZSBhY2Nlc3MgIgorCQkJInVuYXZhaWxhYmxlLCBza2lwcGluZyBvcnBoYW4gY2xlYW51cC5cbiIpOworCQlyZXR1cm47CisJfQorCiAJaWYgKEVYVDRfU0Ioc2IpLT5zX21vdW50X3N0YXRlICYgRVhUNF9FUlJPUl9GUykgewogCQlpZiAoZXMtPnNfbGFzdF9vcnBoYW4pCiAJCQlqYmRfZGVidWcoMSwgIkVycm9ycyBvbiBmaWxlc3lzdGVtLCAiCkBAIC0yNDYwLDYgKzI0NjYsNyBAQAogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKIAlleHQ0X2ZzYmxrX3Qgb3ZlcmhlYWQ7CiAJaW50IGk7CisJdTY0IGZzaWQ7CiAKIAlpZiAodGVzdF9vcHQgKHNiLCBNSU5JWF9ERikpCiAJCW92ZXJoZWFkID0gMDsKQEAgLTI1MDYsNiArMjUxMywxMCBAQAogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CiAJYnVmLT5mX2ZmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlidWYtPmZfbmFtZWxlbiA9IEVYVDRfTkFNRV9MRU47CisJZnNpZCA9IGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQpIF4KKwkgICAgICAgbGU2NF90b19jcHVwKCh2b2lkICopZXMtPnNfdXVpZCArIHNpemVvZih1NjQpKTsKKwlidWYtPmZfZnNpZC52YWxbMF0gPSBmc2lkICYgMHhGRkZGRkZGRlVMOworCWJ1Zi0+Zl9mc2lkLnZhbFsxXSA9IChmc2lkID4+IDMyKSAmIDB4RkZGRkZGRkZVTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC94YXR0ci5jIGIvZnMvZXh0NC94YXR0ci5jCmluZGV4IDYzMjMzY2QuLmRjOTY5YzMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQveGF0dHIuYworKysgYi9mcy9leHQ0L3hhdHRyLmMKQEAgLTQ1OSwxNCArNDU5LDExIEBACiAJaWYgKEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKSkKIAkJcmV0dXJuOwogCi0JbG9ja19zdXBlcihzYik7CiAJaWYgKGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKSA9PSAwKSB7Ci0JCUVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0IHw9Ci0JCQljcHVfdG9fbGUzMihFWFQ0X0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKTsKKwkJRVhUNF9TRVRfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpOwogCQlzYi0+c19kaXJ0ID0gMTsKIAkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKIAl9Ci0JdW5sb2NrX3N1cGVyKHNiKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9jYWNoZS5jIGIvZnMvZmF0L2NhY2hlLmMKaW5kZXggODJjYzRmNTkuLjA1YzI5NDEgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9jYWNoZS5jCisrKyBiL2ZzL2ZhdC9jYWNoZS5jCkBAIC0zNCw5ICszNCw5IEBACiAJcmV0dXJuIEZBVF9NQVhfQ0FDSEU7CiB9CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmZhdF9jYWNoZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZhdF9jYWNoZV9jYWNoZXA7CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZmF0X2NhY2hlICpjYWNoZSA9IChzdHJ1Y3QgZmF0X2NhY2hlICopZm9vOwogCkBAIC02Myw3ICs2Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZhdF9jYWNoZSAqZmF0X2NhY2hlX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoZmF0X2NhY2hlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGZhdF9jYWNoZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmF0X2NhY2hlX2ZyZWUoc3RydWN0IGZhdF9jYWNoZSAqY2FjaGUpCmRpZmYgLS1naXQgYS9mcy9mYXQvZGlyLmMgYi9mcy9mYXQvZGlyLmMKaW5kZXggNjljNDM5Zi4uYzE2YWYyNCAxMDA2NDQKLS0tIGEvZnMvZmF0L2Rpci5jCisrKyBiL2ZzL2ZhdC9kaXIuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiAJaWYgKCFtZW1jbXAoZGUtPm5hbWUsIE1TRE9TX0RPVCwgTVNET1NfTkFNRSkpCiAJCWludW0gPSBpbm9kZS0+aV9pbm87CiAJZWxzZSBpZiAoIW1lbWNtcChkZS0+bmFtZSwgTVNET1NfRE9URE9ULCBNU0RPU19OQU1FKSkgewotCQlpbnVtID0gcGFyZW50X2lubyhmaWxwLT5mX2RlbnRyeSk7CisJCWludW0gPSBwYXJlbnRfaW5vKGZpbHAtPmZfcGF0aC5kZW50cnkpOwogCX0gZWxzZSB7CiAJCWxvZmZfdCBpX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCBiaCwgZGUpOwogCQlzdHJ1Y3QgaW5vZGUgKnRtcCA9IGZhdF9pZ2V0KHNiLCBpX3Bvcyk7CkBAIC02NDMsNyArNjQzLDcgQEAKIAogc3RhdGljIGludCBmYXRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJcmV0dXJuIF9fZmF0X3JlYWRkaXIoaW5vZGUsIGZpbHAsIGRpcmVudCwgZmlsbGRpciwgMCwgMCk7CiB9CiAKQEAgLTc4Miw3ICs3ODIsNyBAQAogCiAJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJbG9ja19rZXJuZWwoKTsKLQlyZXQgPSBmYXRfZGlyX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCXJldCA9IGZhdF9kaXJfaW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKIAkJCSAgICBjbWQsICh1bnNpZ25lZCBsb25nKSAmZCk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCXNldF9mcyhvbGRmcyk7CmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwppbmRleCBmNGI4ZjhiLi5jMTIzN2I3IDEwMDY0NAotLS0gYS9mcy9mYXQvZmlsZS5jCisrKyBiL2ZzL2ZhdC9maWxlLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KIAogaW50IGZhdF9nZW5lcmljX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLApAQCAtOTEsNyArOTIsNyBAQAogCQl9CiAKIAkJLyogVGhpcyBNVVNUIGJlIGRvbmUgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGlycmV2ZXJzaWJsZS4uLiAqLwotCQllcnIgPSBub3RpZnlfY2hhbmdlKGZpbHAtPmZfZGVudHJ5LCAmaWEpOworCQllcnIgPSBub3RpZnlfY2hhbmdlKGZpbHAtPmZfcGF0aC5kZW50cnksICZpYSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIHVwOwogCkBAIC0xMTgsNyArMTE5LDcgQEAKIAlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgogCSAgICAgTVNET1NfU0IoaW5vZGUtPmlfc2IpLT5vcHRpb25zLmZsdXNoKSB7CiAJCWZhdF9mbHVzaF9pbm9kZXMoaW5vZGUtPmlfc2IsIGlub2RlLCBOVUxMKTsKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMDIsNyArMzAzLDE3IEBACiAJZmF0X2ZsdXNoX2lub2Rlcyhpbm9kZS0+aV9zYiwgaW5vZGUsIE5VTEwpOwogfQogCitpbnQgZmF0X2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7CisJc3RhdC0+Ymxrc2l6ZSA9IE1TRE9TX1NCKGlub2RlLT5pX3NiKS0+Y2x1c3Rlcl9zaXplOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmF0X2dldGF0dHIpOworCiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBmYXRfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewogCS50cnVuY2F0ZQk9IGZhdF90cnVuY2F0ZSwKIAkuc2V0YXR0cgk9IGZhdF9ub3RpZnlfY2hhbmdlLAorCS5nZXRhdHRyCT0gZmF0X2dldGF0dHIsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwppbmRleCA3ODk0NWI1Li5hOWU0Njg4IDEwMDY0NAotLS0gYS9mcy9mYXQvaW5vZGUuYworKysgYi9mcy9mYXQvaW5vZGUuYwpAQCAtNDc3LDEyICs0NzcsMTIgQEAKIAlrZnJlZShzYmkpOwogfQogCi1zdGF0aWMga21lbV9jYWNoZV90ICpmYXRfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmYXRfaW5vZGVfY2FjaGVwOwogCiBzdGF0aWMgc3RydWN0IGlub2RlICpmYXRfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgbXNkb3NfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSBrbWVtX2NhY2hlX2FsbG9jKGZhdF9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MoZmF0X2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwpAQCAtNDkzLDcgKzQ5Myw3IEBACiAJa21lbV9jYWNoZV9mcmVlKGZhdF9pbm9kZV9jYWNoZXAsIE1TRE9TX0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgbXNkb3NfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IG1zZG9zX2lub2RlX2luZm8gKilmb287CiAKZGlmZiAtLWdpdCBhL2ZzL2ZjbnRsLmMgYi9mcy9mY250bC5jCmluZGV4IGU0ZjI2MTYuLjhlMzgyYTUgMTAwNjQ0Ci0tLSBhL2ZzL2ZjbnRsLmMKKysrIGIvZnMvZmNudGwuYwpAQCAtNzcsMTAgKzc3LDkgQEAKIAkJc3RhcnQgPSBmaWxlcy0+bmV4dF9mZDsKIAogCW5ld2ZkID0gc3RhcnQ7Ci0JaWYgKHN0YXJ0IDwgZmR0LT5tYXhfZmRzZXQpIHsKKwlpZiAoc3RhcnQgPCBmZHQtPm1heF9mZHMpCiAJCW5ld2ZkID0gZmluZF9uZXh0X3plcm9fYml0KGZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLAotCQkJZmR0LT5tYXhfZmRzZXQsIHN0YXJ0KTsKLQl9CisJCQkJCSAgIGZkdC0+bWF4X2Zkcywgc3RhcnQpOwogCQogCWVycm9yID0gLUVNRklMRTsKIAlpZiAobmV3ZmQgPj0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyKQpAQCAtMjA0LDcgKzIwMyw3IEBACiAKIHN0YXRpYyBpbnQgc2V0ZmwoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBlcnJvciA9IDA7CiAKIAkvKgpAQCAtNTUzLDcgKzU1Miw3IEBACiB9CiAKIHN0YXRpYyBERUZJTkVfUldMT0NLKGZhc3luY19sb2NrKTsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmZhc3luY19jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmYXN5bmNfY2FjaGUgX19yZWFkX21vc3RseTsKIAogLyoKICAqIGZhc3luY19oZWxwZXIoKSBpcyB1c2VkIGJ5IHNvbWUgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzIChtYWlubHkgbWljZSkKQEAgLTU2Nyw3ICs1NjYsNyBAQAogCWludCByZXN1bHQgPSAwOwogCiAJaWYgKG9uKSB7Ci0JCW5ldyA9IGttZW1fY2FjaGVfYWxsb2MoZmFzeW5jX2NhY2hlLCBTTEFCX0tFUk5FTCk7CisJCW5ldyA9IGttZW1fY2FjaGVfYWxsb2MoZmFzeW5jX2NhY2hlLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFuZXcpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmMKaW5kZXggOGU4MTc3NS4uODU3ZmE0OSAxMDA2NDQKLS0tIGEvZnMvZmlsZS5jCisrKyBiL2ZzL2ZpbGUuYwpAQCAtMjEsNyArMjEsNiBAQAogc3RydWN0IGZkdGFibGVfZGVmZXIgewogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3E7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAJc3RydWN0IGZkdGFibGUgKm5leHQ7CiB9OwogCkBAIC0zMyw2NiArMzIsMzQgQEAKICAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBmZHRhYmxlX2RlZmVyLCBmZHRhYmxlX2RlZmVyX2xpc3QpOwogCi0KLS8qCi0gKiBBbGxvY2F0ZSBhbiBmZCBhcnJheSwgdXNpbmcga21hbGxvYyBvciB2bWFsbG9jLgotICogTm90ZTogdGhlIGFycmF5IGlzbid0IGNsZWFyZWQgYXQgYWxsb2NhdGlvbiB0aW1lLgotICovCi1zdHJ1Y3QgZmlsZSAqKiBhbGxvY19mZF9hcnJheShpbnQgbnVtKQorc3RhdGljIGlubGluZSB2b2lkICogYWxsb2NfZmRtZW0odW5zaWduZWQgaW50IHNpemUpCiB7Ci0Jc3RydWN0IGZpbGUgKipuZXdfZmRzOwotCWludCBzaXplID0gbnVtICogc2l6ZW9mKHN0cnVjdCBmaWxlICopOwotCiAJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQotCQluZXdfZmRzID0gKHN0cnVjdCBmaWxlICoqKSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWVsc2UgCi0JCW5ld19mZHMgPSAoc3RydWN0IGZpbGUgKiopIHZtYWxsb2Moc2l6ZSk7Ci0JcmV0dXJuIG5ld19mZHM7Ci19Ci0KLXZvaWQgZnJlZV9mZF9hcnJheShzdHJ1Y3QgZmlsZSAqKmFycmF5LCBpbnQgbnVtKQotewotCWludCBzaXplID0gbnVtICogc2l6ZW9mKHN0cnVjdCBmaWxlICopOwotCi0JaWYgKCFhcnJheSkgewotCQlwcmludGsgKEtFUk5fRVJSICJmcmVlX2ZkX2FycmF5OiBhcnJheSA9IDAgKG51bSA9ICVkKVxuIiwgbnVtKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChudW0gPD0gTlJfT1BFTl9ERUZBVUxUKSAvKiBEb24ndCBmcmVlIHRoZSBlbWJlZGRlZCBmZCBhcnJheSEgKi8KLQkJcmV0dXJuOwotCWVsc2UgaWYgKHNpemUgPD0gUEFHRV9TSVpFKQotCQlrZnJlZShhcnJheSk7CisJCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWVsc2UKLQkJdmZyZWUoYXJyYXkpOworCQlyZXR1cm4gdm1hbGxvYyhzaXplKTsKIH0KIAotc3RhdGljIHZvaWQgX19mcmVlX2ZkdGFibGUoc3RydWN0IGZkdGFibGUgKmZkdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2ZkYXJyKHN0cnVjdCBmZHRhYmxlICpmZHQpCiB7Ci0JZnJlZV9mZHNldChmZHQtPm9wZW5fZmRzLCBmZHQtPm1heF9mZHNldCk7Ci0JZnJlZV9mZHNldChmZHQtPmNsb3NlX29uX2V4ZWMsIGZkdC0+bWF4X2Zkc2V0KTsKLQlmcmVlX2ZkX2FycmF5KGZkdC0+ZmQsIGZkdC0+bWF4X2Zkcyk7Ci0Ja2ZyZWUoZmR0KTsKKwlpZiAoZmR0LT5tYXhfZmRzIDw9IChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZpbGUgKikpKQorCQlrZnJlZShmZHQtPmZkKTsKKwllbHNlCisJCXZmcmVlKGZkdC0+ZmQpOwogfQogCi1zdGF0aWMgdm9pZCBmZHRhYmxlX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2Zkc2V0KHN0cnVjdCBmZHRhYmxlICpmZHQpCiB7Ci0Jc3RydWN0IGZkdGFibGVfZGVmZXIgKmZkZGVmID0gKHN0cnVjdCBmZHRhYmxlX2RlZmVyICopZGF0YTsKLQotCXNwaW5fbG9jaygmZmRkZWYtPmxvY2spOwotCS8qCi0JICogSWYgc29tZW9uZSBhbHJlYWR5IGVtcHRpZWQgdGhlIHF1ZXVlIHJldHVybi4KLQkgKi8KLQlpZiAoIWZkZGVmLT5uZXh0KQotCQlnb3RvIG91dDsKLQlpZiAoIXNjaGVkdWxlX3dvcmsoJmZkZGVmLT53cSkpCi0JCW1vZF90aW1lcigmZmRkZWYtPnRpbWVyLCA1KTsKLW91dDoKLQlzcGluX3VubG9jaygmZmRkZWYtPmxvY2spOworCWlmIChmZHQtPm1heF9mZHMgPD0gKFBBR0VfU0laRSAqIEJJVFNfUEVSX0JZVEUgLyAyKSkKKwkJa2ZyZWUoZmR0LT5vcGVuX2Zkcyk7CisJZWxzZQorCQl2ZnJlZShmZHQtPm9wZW5fZmRzKTsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9mZHRhYmxlX3dvcmsoc3RydWN0IGZkdGFibGVfZGVmZXIgKmYpCitzdGF0aWMgdm9pZCBmcmVlX2ZkdGFibGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGZkdGFibGVfZGVmZXIgKmYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZkdGFibGVfZGVmZXIsIHdxKTsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCiAJc3Bpbl9sb2NrX2JoKCZmLT5sb2NrKTsKQEAgLTEwMSwxODkgKzY4LDExMyBAQAogCXNwaW5fdW5sb2NrX2JoKCZmLT5sb2NrKTsKIAl3aGlsZShmZHQpIHsKIAkJc3RydWN0IGZkdGFibGUgKm5leHQgPSBmZHQtPm5leHQ7Ci0JCV9fZnJlZV9mZHRhYmxlKGZkdCk7CisJCXZmcmVlKGZkdC0+ZmQpOworCQlmcmVlX2Zkc2V0KGZkdCk7CisJCWtmcmVlKGZkdCk7CiAJCWZkdCA9IG5leHQ7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBmcmVlX2ZkdGFibGVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQordm9pZCBmcmVlX2ZkdGFibGVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQogewogCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgZmR0YWJsZSwgcmN1KTsKLQlpbnQgZmRzZXRfc2l6ZSwgZmRhcnJheV9zaXplOwogCXN0cnVjdCBmZHRhYmxlX2RlZmVyICpmZGRlZjsKIAogCUJVR19PTighZmR0KTsKLQlmZHNldF9zaXplID0gZmR0LT5tYXhfZmRzZXQgLyA4OwotCWZkYXJyYXlfc2l6ZSA9IGZkdC0+bWF4X2ZkcyAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKTsKIAotCWlmIChmZHQtPmZyZWVfZmlsZXMpIHsKKwlpZiAoZmR0LT5tYXhfZmRzIDw9IE5SX09QRU5fREVGQVVMVCkgewogCQkvKgotCQkgKiBUaGUgdGhpcyBmZHRhYmxlIHdhcyBlbWJlZGRlZCBpbiB0aGUgZmlsZXMgc3RydWN0dXJlCi0JCSAqIGFuZCB0aGUgZmlsZXMgc3RydWN0dXJlIGl0c2VsZiB3YXMgZ2V0dGluZyBkZXN0cm95ZWQuCi0JCSAqIEl0IGlzIG5vdyBzYWZlIHRvIGZyZWUgdGhlIGZpbGVzIHN0cnVjdHVyZS4KKwkJICogVGhpcyBmZHRhYmxlIGlzIGVtYmVkZGVkIGluIHRoZSBmaWxlcyBzdHJ1Y3R1cmUgYW5kIHRoYXQKKwkJICogc3RydWN0dXJlIGl0c2VsZiBpcyBnZXR0aW5nIGRlc3Ryb3llZC4KIAkJICovCi0JCWttZW1fY2FjaGVfZnJlZShmaWxlc19jYWNoZXAsIGZkdC0+ZnJlZV9maWxlcyk7CisJCWttZW1fY2FjaGVfZnJlZShmaWxlc19jYWNoZXAsCisJCQkJY29udGFpbmVyX29mKGZkdCwgc3RydWN0IGZpbGVzX3N0cnVjdCwgZmR0YWIpKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoZmR0LT5tYXhfZmRzZXQgPD0gRU1CRURERURfRkRfU0VUX1NJWkUgJiYKLQkJZmR0LT5tYXhfZmRzIDw9IE5SX09QRU5fREVGQVVMVCkgewotCQkvKgotCQkgKiBUaGUgZmR0YWJsZSB3YXMgZW1iZWRkZWQKLQkJICovCi0JCXJldHVybjsKLQl9Ci0JaWYgKGZkc2V0X3NpemUgPD0gUEFHRV9TSVpFICYmIGZkYXJyYXlfc2l6ZSA8PSBQQUdFX1NJWkUpIHsKLQkJa2ZyZWUoZmR0LT5vcGVuX2Zkcyk7Ci0JCWtmcmVlKGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJaWYgKGZkdC0+bWF4X2ZkcyA8PSAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBmaWxlICopKSkgewogCQlrZnJlZShmZHQtPmZkKTsKKwkJa2ZyZWUoZmR0LT5vcGVuX2Zkcyk7CiAJCWtmcmVlKGZkdCk7CiAJfSBlbHNlIHsKIAkJZmRkZWYgPSAmZ2V0X2NwdV92YXIoZmR0YWJsZV9kZWZlcl9saXN0KTsKIAkJc3Bpbl9sb2NrKCZmZGRlZi0+bG9jayk7CiAJCWZkdC0+bmV4dCA9IGZkZGVmLT5uZXh0OwogCQlmZGRlZi0+bmV4dCA9IGZkdDsKLQkJLyoKLQkJICogdm1hbGxvY3MgYXJlIGhhbmRsZWQgZnJvbSB0aGUgd29ya3F1ZXVlIGNvbnRleHQuCi0JCSAqIElmIHRoZSBwZXItY3B1IHdvcmtxdWV1ZSBpcyBydW5uaW5nLCB0aGVuIHdlCi0JCSAqIGRlZmVyIHdvcmsgc2NoZWR1bGluZyB0aHJvdWdoIGEgdGltZXIuCi0JCSAqLwotCQlpZiAoIXNjaGVkdWxlX3dvcmsoJmZkZGVmLT53cSkpCi0JCQltb2RfdGltZXIoJmZkZGVmLT50aW1lciwgNSk7CisJCS8qIHZtYWxsb2NzIGFyZSBoYW5kbGVkIGZyb20gdGhlIHdvcmtxdWV1ZSBjb250ZXh0ICovCisJCXNjaGVkdWxlX3dvcmsoJmZkZGVmLT53cSk7CiAJCXNwaW5fdW5sb2NrKCZmZGRlZi0+bG9jayk7CiAJCXB1dF9jcHVfdmFyKGZkdGFibGVfZGVmZXJfbGlzdCk7CiAJfQogfQogCi12b2lkIGZyZWVfZmR0YWJsZShzdHJ1Y3QgZmR0YWJsZSAqZmR0KQotewotCWlmIChmZHQtPmZyZWVfZmlsZXMgfHwKLQkJZmR0LT5tYXhfZmRzZXQgPiBFTUJFRERFRF9GRF9TRVRfU0laRSB8fAotCQlmZHQtPm1heF9mZHMgPiBOUl9PUEVOX0RFRkFVTFQpCi0JCWNhbGxfcmN1KCZmZHQtPnJjdSwgZnJlZV9mZHRhYmxlX3JjdSk7Ci19Ci0KIC8qCiAgKiBFeHBhbmQgdGhlIGZkc2V0IGluIHRoZSBmaWxlc19zdHJ1Y3QuICBDYWxsZWQgd2l0aCB0aGUgZmlsZXMgc3BpbmxvY2sKICAqIGhlbGQgZm9yIHdyaXRlLgogICovCi1zdGF0aWMgdm9pZCBjb3B5X2ZkdGFibGUoc3RydWN0IGZkdGFibGUgKm5mZHQsIHN0cnVjdCBmZHRhYmxlICpmZHQpCitzdGF0aWMgdm9pZCBjb3B5X2ZkdGFibGUoc3RydWN0IGZkdGFibGUgKm5mZHQsIHN0cnVjdCBmZHRhYmxlICpvZmR0KQogewotCWludCBpOwotCWludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgY3B5LCBzZXQ7CiAKLQlCVUdfT04obmZkdC0+bWF4X2Zkc2V0IDwgZmR0LT5tYXhfZmRzZXQpOwotCUJVR19PTihuZmR0LT5tYXhfZmRzIDwgZmR0LT5tYXhfZmRzKTsKLQkvKiBDb3B5IHRoZSBleGlzdGluZyB0YWJsZXMgYW5kIGluc3RhbGwgdGhlIG5ldyBwb2ludGVycyAqLwotCi0JaSA9IGZkdC0+bWF4X2Zkc2V0IC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpOwotCWNvdW50ID0gKG5mZHQtPm1heF9mZHNldCAtIGZkdC0+bWF4X2Zkc2V0KSAvIDg7Ci0KLQkvKgotCSAqIERvbid0IGNvcHkgdGhlIGVudGlyZSBhcnJheSBpZiB0aGUgY3VycmVudCBmZHNldCBpcwotCSAqIG5vdCB5ZXQgaW5pdGlhbGlzZWQuCi0JICovCi0JaWYgKGkpIHsKLQkJbWVtY3B5IChuZmR0LT5vcGVuX2ZkcywgZmR0LT5vcGVuX2ZkcywKLQkJCQkJCWZkdC0+bWF4X2Zkc2V0LzgpOwotCQltZW1jcHkgKG5mZHQtPmNsb3NlX29uX2V4ZWMsIGZkdC0+Y2xvc2Vfb25fZXhlYywKLQkJCQkJCWZkdC0+bWF4X2Zkc2V0LzgpOwotCQltZW1zZXQgKCZuZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbaV0sIDAsIGNvdW50KTsKLQkJbWVtc2V0ICgmbmZkdC0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHNbaV0sIDAsIGNvdW50KTsKLQl9Ci0KLQkvKiBEb24ndCBjb3B5L2NsZWFyIHRoZSBhcnJheSBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcKLQkgICBmZCBhcnJheSBmb3IgZm9yaygpICovCi0JaWYgKGZkdC0+bWF4X2ZkcykgewotCQltZW1jcHkobmZkdC0+ZmQsIGZkdC0+ZmQsCi0JCQlmZHQtPm1heF9mZHMgKiBzaXplb2Yoc3RydWN0IGZpbGUgKikpOwotCQkvKiBjbGVhciB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcnJheSAqLwotCQltZW1zZXQoJm5mZHQtPmZkW2ZkdC0+bWF4X2Zkc10sIDAsCi0JCSAgICAgICAobmZkdC0+bWF4X2ZkcyAtIGZkdC0+bWF4X2ZkcykgKgotCQkJCQlzaXplb2Yoc3RydWN0IGZpbGUgKikpOwotCX0KLX0KLQotLyoKLSAqIEFsbG9jYXRlIGFuIGZkc2V0IGFycmF5LCB1c2luZyBrbWFsbG9jIG9yIHZtYWxsb2MuCi0gKiBOb3RlOiB0aGUgYXJyYXkgaXNuJ3QgY2xlYXJlZCBhdCBhbGxvY2F0aW9uIHRpbWUuCi0gKi8KLWZkX3NldCAqIGFsbG9jX2Zkc2V0KGludCBudW0pCi17Ci0JZmRfc2V0ICpuZXdfZmRzZXQ7Ci0JaW50IHNpemUgPSBudW0gLyA4OwotCi0JaWYgKHNpemUgPD0gUEFHRV9TSVpFKQotCQluZXdfZmRzZXQgPSAoZmRfc2V0ICopIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JZWxzZQotCQluZXdfZmRzZXQgPSAoZmRfc2V0ICopIHZtYWxsb2Moc2l6ZSk7Ci0JcmV0dXJuIG5ld19mZHNldDsKLX0KLQotdm9pZCBmcmVlX2Zkc2V0KGZkX3NldCAqYXJyYXksIGludCBudW0pCi17Ci0JaWYgKG51bSA8PSBFTUJFRERFRF9GRF9TRVRfU0laRSkgLyogRG9uJ3QgZnJlZSBhbiBlbWJlZGRlZCBmZHNldCAqLworCUJVR19PTihuZmR0LT5tYXhfZmRzIDwgb2ZkdC0+bWF4X2Zkcyk7CisJaWYgKG9mZHQtPm1heF9mZHMgPT0gMCkKIAkJcmV0dXJuOwotCWVsc2UgaWYgKG51bSA8PSA4ICogUEFHRV9TSVpFKQotCQlrZnJlZShhcnJheSk7Ci0JZWxzZQotCQl2ZnJlZShhcnJheSk7CisKKwljcHkgPSBvZmR0LT5tYXhfZmRzICogc2l6ZW9mKHN0cnVjdCBmaWxlICopOworCXNldCA9IChuZmR0LT5tYXhfZmRzIC0gb2ZkdC0+bWF4X2ZkcykgKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisJbWVtY3B5KG5mZHQtPmZkLCBvZmR0LT5mZCwgY3B5KTsKKwltZW1zZXQoKGNoYXIgKikobmZkdC0+ZmQpICsgY3B5LCAwLCBzZXQpOworCisJY3B5ID0gb2ZkdC0+bWF4X2ZkcyAvIEJJVFNfUEVSX0JZVEU7CisJc2V0ID0gKG5mZHQtPm1heF9mZHMgLSBvZmR0LT5tYXhfZmRzKSAvIEJJVFNfUEVSX0JZVEU7CisJbWVtY3B5KG5mZHQtPm9wZW5fZmRzLCBvZmR0LT5vcGVuX2ZkcywgY3B5KTsKKwltZW1zZXQoKGNoYXIgKikobmZkdC0+b3Blbl9mZHMpICsgY3B5LCAwLCBzZXQpOworCW1lbWNweShuZmR0LT5jbG9zZV9vbl9leGVjLCBvZmR0LT5jbG9zZV9vbl9leGVjLCBjcHkpOworCW1lbXNldCgoY2hhciAqKShuZmR0LT5jbG9zZV9vbl9leGVjKSArIGNweSwgMCwgc2V0KTsKIH0KIAotc3RhdGljIHN0cnVjdCBmZHRhYmxlICphbGxvY19mZHRhYmxlKGludCBucikKK3N0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqIGFsbG9jX2ZkdGFibGUodW5zaWduZWQgaW50IG5yKQogewotCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBOVUxMOwotCWludCBuZmRzID0gMDsKLSAgCWZkX3NldCAqbmV3X29wZW5zZXQgPSBOVUxMLCAqbmV3X2V4ZWNzZXQgPSBOVUxMOwotCXN0cnVjdCBmaWxlICoqbmV3X2ZkczsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCWNoYXIgKmRhdGE7CiAKLQlmZHQgPSBremFsbG9jKHNpemVvZigqZmR0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmZHQpCi0gIAkJZ290byBvdXQ7Ci0KLQluZmRzID0gbWF4X3QoaW50LCA4ICogTDFfQ0FDSEVfQllURVMsIHJvdW5kdXBfcG93X29mX3R3byhuciArIDEpKTsKLQlpZiAobmZkcyA+IE5SX09QRU4pCi0JCW5mZHMgPSBOUl9PUEVOOwotCi0gIAluZXdfb3BlbnNldCA9IGFsbG9jX2Zkc2V0KG5mZHMpOwotICAJbmV3X2V4ZWNzZXQgPSBhbGxvY19mZHNldChuZmRzKTsKLSAgCWlmICghbmV3X29wZW5zZXQgfHwgIW5ld19leGVjc2V0KQotICAJCWdvdG8gb3V0OwotCWZkdC0+b3Blbl9mZHMgPSBuZXdfb3BlbnNldDsKLQlmZHQtPmNsb3NlX29uX2V4ZWMgPSBuZXdfZXhlY3NldDsKLQlmZHQtPm1heF9mZHNldCA9IG5mZHM7Ci0KLQluZmRzID0gTlJfT1BFTl9ERUZBVUxUOwogCS8qCi0JICogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcywgYW5kIGtlZXAgZXhwYW5kaW5nIGl0IHVudGlsCi0JICogd2UgaGF2ZSBlbm91Z2ggZm9yIHRoZSByZXF1ZXN0ZWQgZmQgYXJyYXkgc2l6ZS4KKwkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IGZkcyB3ZSBhY3R1YWxseSB3YW50IHRvIHN1cHBvcnQgaW4gdGhpcyBmZHRhYmxlLgorCSAqIEFsbG9jYXRpb24gc3RlcHMgYXJlIGtleWVkIHRvIHRoZSBzaXplIG9mIHRoZSBmZGFycmF5LCBzaW5jZSBpdAorCSAqIGdyb3dzIGZhciBmYXN0ZXIgdGhhbiBhbnkgb2YgdGhlIG90aGVyIGR5bmFtaWMgZGF0YS4gV2UgdHJ5IHRvIGZpdAorCSAqIHRoZSBmZGFycmF5IGludG8gY29tZm9ydGFibGUgcGFnZS10dW5lZCBjaHVua3M6IHN0YXJ0aW5nIGF0IDEwMjRCCisJICogYW5kIGdyb3dpbmcgaW4gcG93ZXJzIG9mIHR3byBmcm9tIHRoZXJlIG9uLgogCSAqLwotCWRvIHsKLSNpZiBOUl9PUEVOX0RFRkFVTFQgPCAyNTYKLQkJaWYgKG5mZHMgPCAyNTYpCi0JCQluZmRzID0gMjU2OwotCQllbHNlCi0jZW5kaWYKLQkJaWYgKG5mZHMgPCAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBmaWxlICopKSkKLQkJCW5mZHMgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZpbGUgKik7Ci0JCWVsc2UgewotCQkJbmZkcyA9IG5mZHMgKiAyOwotCQkJaWYgKG5mZHMgPiBOUl9PUEVOKQotCQkJCW5mZHMgPSBOUl9PUEVOOwotICAJCX0KLQl9IHdoaWxlIChuZmRzIDw9IG5yKTsKLQluZXdfZmRzID0gYWxsb2NfZmRfYXJyYXkobmZkcyk7Ci0JaWYgKCFuZXdfZmRzKQotCQlnb3RvIG91dDI7Ci0JZmR0LT5mZCA9IG5ld19mZHM7Ci0JZmR0LT5tYXhfZmRzID0gbmZkczsKLQlmZHQtPmZyZWVfZmlsZXMgPSBOVUxMOworCW5yIC89ICgxMDI0IC8gc2l6ZW9mKHN0cnVjdCBmaWxlICopKTsKKwluciA9IHJvdW5kdXBfcG93X29mX3R3byhuciArIDEpOworCW5yICo9ICgxMDI0IC8gc2l6ZW9mKHN0cnVjdCBmaWxlICopKTsKKwlpZiAobnIgPiBOUl9PUEVOKQorCQluciA9IE5SX09QRU47CisKKwlmZHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmR0YWJsZSksIEdGUF9LRVJORUwpOworCWlmICghZmR0KQorCQlnb3RvIG91dDsKKwlmZHQtPm1heF9mZHMgPSBucjsKKwlkYXRhID0gYWxsb2NfZmRtZW0obnIgKiBzaXplb2Yoc3RydWN0IGZpbGUgKikpOworCWlmICghZGF0YSkKKwkJZ290byBvdXRfZmR0OworCWZkdC0+ZmQgPSAoc3RydWN0IGZpbGUgKiopZGF0YTsKKwlkYXRhID0gYWxsb2NfZmRtZW0obWF4X3QodW5zaWduZWQgaW50LAorCQkJCSAyICogbnIgLyBCSVRTX1BFUl9CWVRFLCBMMV9DQUNIRV9CWVRFUykpOworCWlmICghZGF0YSkKKwkJZ290byBvdXRfYXJyOworCWZkdC0+b3Blbl9mZHMgPSAoZmRfc2V0ICopZGF0YTsKKwlkYXRhICs9IG5yIC8gQklUU19QRVJfQllURTsKKwlmZHQtPmNsb3NlX29uX2V4ZWMgPSAoZmRfc2V0ICopZGF0YTsKKwlJTklUX1JDVV9IRUFEKCZmZHQtPnJjdSk7CisJZmR0LT5uZXh0ID0gTlVMTDsKKwogCXJldHVybiBmZHQ7Ci1vdXQyOgotCW5mZHMgPSBmZHQtPm1heF9mZHNldDsKLW91dDoKLQlmcmVlX2Zkc2V0KG5ld19vcGVuc2V0LCBuZmRzKTsKLQlmcmVlX2Zkc2V0KG5ld19leGVjc2V0LCBuZmRzKTsKKworb3V0X2FycjoKKwlmcmVlX2ZkYXJyKGZkdCk7CitvdXRfZmR0OgogCWtmcmVlKGZkdCk7CitvdXQ6CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTMxMCwxNCArMjAxLDE3IEBACiAJICogd2UgZHJvcHBlZCB0aGUgbG9jawogCSAqLwogCWN1cl9mZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKLQlpZiAobnIgPj0gY3VyX2ZkdC0+bWF4X2ZkcyB8fCBuciA+PSBjdXJfZmR0LT5tYXhfZmRzZXQpIHsKKwlpZiAobnIgPj0gY3VyX2ZkdC0+bWF4X2ZkcykgewogCQkvKiBDb250aW51ZSBhcyBwbGFubmVkICovCiAJCWNvcHlfZmR0YWJsZShuZXdfZmR0LCBjdXJfZmR0KTsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKGZpbGVzLT5mZHQsIG5ld19mZHQpOwotCQlmcmVlX2ZkdGFibGUoY3VyX2ZkdCk7CisJCWlmIChjdXJfZmR0LT5tYXhfZmRzID4gTlJfT1BFTl9ERUZBVUxUKQorCQkJY2FsbF9yY3UoJmN1cl9mZHQtPnJjdSwgZnJlZV9mZHRhYmxlX3JjdSk7CiAJfSBlbHNlIHsKIAkJLyogU29tZWJvZHkgZWxzZSBleHBhbmRlZCwgc28gdW5kbyBvdXIgYXR0ZW1wdCAqLwotCQlfX2ZyZWVfZmR0YWJsZShuZXdfZmR0KTsKKwkJZnJlZV9mZGFycihuZXdfZmR0KTsKKwkJZnJlZV9mZHNldChuZXdfZmR0KTsKKwkJa2ZyZWUobmV3X2ZkdCk7CiAJfQogCXJldHVybiAxOwogfQpAQCAtMzM2LDExICsyMzAsMTAgQEAKIAogCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOwogCS8qIERvIHdlIG5lZWQgdG8gZXhwYW5kPyAqLwotCWlmIChuciA8IGZkdC0+bWF4X2Zkc2V0ICYmIG5yIDwgZmR0LT5tYXhfZmRzKQorCWlmIChuciA8IGZkdC0+bWF4X2ZkcykKIAkJcmV0dXJuIDA7CiAJLyogQ2FuIHdlIGV4cGFuZD8gKi8KLQlpZiAoZmR0LT5tYXhfZmRzZXQgPj0gTlJfT1BFTiB8fCBmZHQtPm1heF9mZHMgPj0gTlJfT1BFTiB8fAotCSAgICBuciA+PSBOUl9PUEVOKQorCWlmIChuciA+PSBOUl9PUEVOKQogCQlyZXR1cm4gLUVNRklMRTsKIAogCS8qIEFsbCBnb29kLCBzbyB3ZSB0cnkgKi8KQEAgLTM1MSwxMCArMjQ0LDcgQEAKIHsKIAlzdHJ1Y3QgZmR0YWJsZV9kZWZlciAqZmRkZWYgPSAmcGVyX2NwdShmZHRhYmxlX2RlZmVyX2xpc3QsIGNwdSk7CiAJc3Bpbl9sb2NrX2luaXQoJmZkZGVmLT5sb2NrKTsKLQlJTklUX1dPUksoJmZkZGVmLT53cSwgKHZvaWQgKCopKHZvaWQgKikpZnJlZV9mZHRhYmxlX3dvcmssIGZkZGVmKTsKLQlpbml0X3RpbWVyKCZmZGRlZi0+dGltZXIpOwotCWZkZGVmLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZmRkZWY7Ci0JZmRkZWYtPnRpbWVyLmZ1bmN0aW9uID0gZmR0YWJsZV90aW1lcjsKKwlJTklUX1dPUksoJmZkZGVmLT53cSwgZnJlZV9mZHRhYmxlX3dvcmspOwogCWZkZGVmLT5uZXh0ID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZmlsZV90YWJsZS5jIGIvZnMvZmlsZV90YWJsZS5jCmluZGV4IDI0ZjI1YTAuLjRjMTdhMTggMTAwNjQ0Ci0tLSBhL2ZzL2ZpbGVfdGFibGUuYworKysgYi9mcy9maWxlX3RhYmxlLmMKQEAgLTE1Miw4ICsxNTIsOCBAQAogICovCiB2b2lkIGZhc3RjYWxsIF9fZnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGZpbGUtPmZfdmZzbW50OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBmaWxlLT5mX3BhdGgubW50OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKIAltaWdodF9zbGVlcCgpOwpAQCAtMTc2LDggKzE3Niw4IEBACiAJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOwogCXB1dF9waWQoZmlsZS0+Zl9vd25lci5waWQpOwogCWZpbGVfa2lsbChmaWxlKTsKLQlmaWxlLT5mX2RlbnRyeSA9IE5VTEw7Ci0JZmlsZS0+Zl92ZnNtbnQgPSBOVUxMOworCWZpbGUtPmZfcGF0aC5kZW50cnkgPSBOVUxMOworCWZpbGUtPmZfcGF0aC5tbnQgPSBOVUxMOwogCWZpbGVfZnJlZShmaWxlKTsKIAlkcHV0KGRlbnRyeSk7CiAJbW50cHV0KG1udCk7CkBAIC0yNzEsNyArMjcxLDcgQEAKIAlmaWxlX2xpc3RfbG9jaygpOwogCWxpc3RfZm9yX2VhY2gocCwgJnNiLT5zX2ZpbGVzKSB7CiAJCXN0cnVjdCBmaWxlICpmaWxlID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZmlsZSwgZl91LmZ1X2xpc3QpOwotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJCS8qIEZpbGUgd2l0aCBwZW5kaW5nIGRlbGV0ZT8gKi8KIAkJaWYgKGlub2RlLT5pX25saW5rID09IDApCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMgYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMKaW5kZXggNDc4NmQ1MS4uMGI3YWU4OSAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYwpAQCAtNDYsNyArNDYsNyBAQAogCiBleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9zeW1saW5rX2lvcHM7CiAKLWttZW1fY2FjaGVfdAkJKnZ4ZnNfaW5vZGVfY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUJCSp2eGZzX2lub2RlX2NhY2hlcDsKIAogCiAjaWZkZWYgRElBR05PU1RJQwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JKnZpcDsKIAkJc3RydWN0IHZ4ZnNfZGlub2RlCSpkaXA7CiAKLQkJaWYgKCEodmlwID0ga21lbV9jYWNoZV9hbGxvYyh2eGZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpKSkKKwkJaWYgKCEodmlwID0ga21lbV9jYWNoZV9hbGxvYyh2eGZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCkpKQogCQkJZ290byBmYWlsOwogCQlkaXAgPSAoc3RydWN0IHZ4ZnNfZGlub2RlICopKGJwLT5iX2RhdGEgKyBvZmZzZXQpOwogCQltZW1jcHkodmlwLCBkaXAsIHNpemVvZigqdmlwKSk7CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkJc3RydWN0IHZ4ZnNfZGlub2RlCSpkaXA7CiAJCWNhZGRyX3QJCQlrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBwKTsKIAotCQlpZiAoISh2aXAgPSBrbWVtX2NhY2hlX2FsbG9jKHZ4ZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCkpKQorCQlpZiAoISh2aXAgPSBrbWVtX2NhY2hlX2FsbG9jKHZ4ZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKSkpCiAJCQlnb3RvIGZhaWw7CiAJCWRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoa2FkZHIgKyBvZmZzZXQpOwogCQltZW1jcHkodmlwLCBkaXAsIHNpemVvZigqdmlwKSk7CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwppbmRleCA0Mzg4NmZhLi4zOTk1ZDdmIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmMKQEAgLTI0MCw3ICsyNDAsNyBAQAogc3RhdGljIGludAogdnhmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmcCwgdm9pZCAqcmV0cCwgZmlsbGRpcl90IGZpbGxlcikKIHsKLQlzdHJ1Y3QgaW5vZGUJCSppcCA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUJCSppcCA9IGZwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jawkqc2JwID0gaXAtPmlfc2I7CiAJdV9sb25nCQkJYnNpemUgPSBzYnAtPnNfYmxvY2tzaXplOwogCXVfbG9uZwkJCXBhZ2UsIG5wYWdlcywgYmxvY2ssIHBibG9ja3MsIG5ibG9ja3MsIG9mZnNldDsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY29udHJvbC5jIGIvZnMvZnVzZS9jb250cm9sLmMKaW5kZXggMTZiMzljMC4uOGM1OGJkNCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9jb250cm9sLmMKKysrIGIvZnMvZnVzZS9jb250cm9sLmMKQEAgLTIzLDcgKzIzLDcgQEAKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKIAltdXRleF9sb2NrKCZmdXNlX211dGV4KTsKLQlmYyA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CisJZmMgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAJaWYgKGZjKQogCQlmYyA9IGZ1c2VfY29ubl9nZXQoZmMpOwogCW11dGV4X3VubG9jaygmZnVzZV9tdXRleCk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rldi5jIGIvZnMvZnVzZS9kZXYuYwppbmRleCA2NjU3MWVhLi4zNTc3NjRkIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rldi5jCisrKyBiL2ZzL2Z1c2UvZGV2LmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogTU9EVUxFX0FMSUFTX01JU0NERVYoRlVTRV9NSU5PUik7CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmZ1c2VfcmVxX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZnVzZV9yZXFfY2FjaGVwOwogCiBzdGF0aWMgc3RydWN0IGZ1c2VfY29ubiAqZnVzZV9nZXRfY29ubihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKQEAgLTQxLDcgKzQxLDcgQEAKIAogc3RydWN0IGZ1c2VfcmVxICpmdXNlX3JlcXVlc3RfYWxsb2Modm9pZCkKIHsKLQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IGttZW1fY2FjaGVfYWxsb2MoZnVzZV9yZXFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKGZ1c2VfcmVxX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlcSkKIAkJZnVzZV9yZXF1ZXN0X2luaXQocmVxKTsKIAlyZXR1cm4gcmVxOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggODYwNTE1NS4uNDAwODA0NyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0xMzgsOSArMTM4LDggQEAKIAkJc3RydWN0IGZ1c2VfZW50cnlfb3V0IG91dGFyZzsKIAkJc3RydWN0IGZ1c2VfY29ubiAqZmM7CiAJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwotCi0JCS8qIERvZXNuJ3QgaHVydCB0byAicmVzZXQiIHRoZSB2YWxpZGl0eSB0aW1lb3V0ICovCi0JCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeV9jYWNoZShlbnRyeSk7CisJCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50OwogCiAJCS8qIEZvciBuZWdhdGl2ZSBkZW50cmllcywgYWx3YXlzIGRvIGEgZnJlc2ggbG9va3VwICovCiAJCWlmICghaW5vZGUpCkBAIC0xNTEsMjEgKzE1MCwzMyBAQAogCQlpZiAoSVNfRVJSKHJlcSkpCiAJCQlyZXR1cm4gMDsKIAotCQlmdXNlX2xvb2t1cF9pbml0KHJlcSwgZW50cnktPmRfcGFyZW50LT5kX2lub2RlLCBlbnRyeSwgJm91dGFyZyk7CisJCWZvcmdldF9yZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCQlpZiAoSVNfRVJSKGZvcmdldF9yZXEpKSB7CisJCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChlbnRyeSk7CisJCWZ1c2VfbG9va3VwX2luaXQocmVxLCBwYXJlbnQtPmRfaW5vZGUsIGVudHJ5LCAmb3V0YXJnKTsKIAkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQlkcHV0KHBhcmVudCk7CiAJCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CisJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJCS8qIFplcm8gbm9kZWlkIGlzIHNhbWUgYXMgLUVOT0VOVCAqLwogCQlpZiAoIWVyciAmJiAhb3V0YXJnLm5vZGVpZCkKIAkJCWVyciA9IC1FTk9FTlQ7CiAJCWlmICghZXJyKSB7CiAJCQlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CiAJCQlpZiAob3V0YXJnLm5vZGVpZCAhPSBnZXRfbm9kZV9pZChpbm9kZSkpIHsKLQkJCQlmdXNlX3NlbmRfZm9yZ2V0KGZjLCByZXEsIG91dGFyZy5ub2RlaWQsIDEpOworCQkJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsCisJCQkJCQkgb3V0YXJnLm5vZGVpZCwgMSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CisJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAkJCWZpLT5ubG9va3VwICsrOworCQkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAkJfQotCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKIAkJaWYgKGVyciB8fCAob3V0YXJnLmF0dHIubW9kZSBeIGlub2RlLT5pX21vZGUpICYgU19JRk1UKQogCQkJcmV0dXJuIDA7CiAKQEAgLTE3NSwyMiArMTg2LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyoKLSAqIENoZWNrIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIGhhc2hlZCBhbGlhcyBvZiB0aGlzIGRpcmVjdG9yeSBpbm9kZS4KLSAqIElmIHllcywgdGhlbiBsb29rdXAgYW5kIG1rZGlyIG11c3Qgbm90IGNyZWF0ZSBhIG5ldyBhbGlhcy4KLSAqLwotc3RhdGljIGludCBkaXJfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQlzdHJ1Y3QgZGVudHJ5ICphbGlhcyA9IGRfZmluZF9hbGlhcyhpbm9kZSk7Ci0JCWlmIChhbGlhcykgewotCQkJZHB1dChhbGlhcyk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBpbnZhbGlkX25vZGVpZCh1NjQgbm9kZWlkKQogewogCXJldHVybiAhbm9kZWlkIHx8IG5vZGVpZCA9PSBGVVNFX1JPT1RfSUQ7CkBAIC0yMDYsNiArMjAxLDI0IEBACiAJCVNfSVNCTEsobSkgfHwgU19JU0ZJRk8obSkgfHwgU19JU1NPQ0sobSk7CiB9CiAKKy8qCisgKiBBZGQgYSBkaXJlY3RvcnkgaW5vZGUgdG8gYSBkZW50cnksIGVuc3VyaW5nIHRoYXQgbm8gb3RoZXIgZGVudHJ5CisgKiByZWZlcnMgdG8gdGhpcyBpbm9kZS4gIENhbGxlZCB3aXRoIGZjLT5pbnN0X211dGV4LgorICovCitzdGF0aWMgaW50IGZ1c2VfZF9hZGRfZGlyZWN0b3J5KHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmFsaWFzID0gZF9maW5kX2FsaWFzKGlub2RlKTsKKwlpZiAoYWxpYXMpIHsKKwkJLyogVGhpcyB0cmllcyB0byBzaHJpbmsgdGhlIHN1YnRyZWUgYmVsb3cgYWxpYXMgKi8KKwkJZnVzZV9pbnZhbGlkYXRlX2VudHJ5KGFsaWFzKTsKKwkJZHB1dChhbGlhcyk7CisJCWlmICghbGlzdF9lbXB0eSgmaW5vZGUtPmlfZGVudHJ5KSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCWRfYWRkKGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpmdXNlX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZW50cnksCiAJCQkJICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKQEAgLTIxNCw2ICsyMjcsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihkaXIpOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKIAogCWlmIChlbnRyeS0+ZF9uYW1lLmxlbiA+IEZVU0VfTkFNRV9NQVgpCiAJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwpAQCAtMjIyLDkgKzIzNiwxNiBAQAogCWlmIChJU19FUlIocmVxKSkKIAkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihyZXEpKTsKIAorCWZvcmdldF9yZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCWlmIChJU19FUlIoZm9yZ2V0X3JlcSkpIHsKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihmb3JnZXRfcmVxKSk7CisJfQorCiAJZnVzZV9sb29rdXBfaW5pdChyZXEsIGRpciwgZW50cnksICZvdXRhcmcpOwogCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJLyogWmVybyBub2RlaWQgaXMgc2FtZSBhcyAtRU5PRU5ULCBidXQgd2l0aCB2YWxpZCB0aW1lb3V0ICovCiAJaWYgKCFlcnIgJiYgb3V0YXJnLm5vZGVpZCAmJgogCSAgICAoaW52YWxpZF9ub2RlaWQob3V0YXJnLm5vZGVpZCkgfHwgIXZhbGlkX21vZGUob3V0YXJnLmF0dHIubW9kZSkpKQpAQCAtMjMzLDE5ICsyNTQsMjUgQEAKIAkJaW5vZGUgPSBmdXNlX2lnZXQoZGlyLT5pX3NiLCBvdXRhcmcubm9kZWlkLCBvdXRhcmcuZ2VuZXJhdGlvbiwKIAkJCQkgICZvdXRhcmcuYXR0cik7CiAJCWlmICghaW5vZGUpIHsKLQkJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIHJlcSwgb3V0YXJnLm5vZGVpZCwgMSk7CisJCQlmdXNlX3NlbmRfZm9yZ2V0KGZjLCBmb3JnZXRfcmVxLCBvdXRhcmcubm9kZWlkLCAxKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCQl9CiAJfQotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0VOVCkKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAotCWlmIChpbm9kZSAmJiBkaXJfYWxpYXMoaW5vZGUpKSB7Ci0JCWlwdXQoaW5vZGUpOwotCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKLQl9Ci0JZF9hZGQoZW50cnksIGlub2RlKTsKKwlpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQltdXRleF9sb2NrKCZmYy0+aW5zdF9tdXRleCk7CisJCWVyciA9IGZ1c2VfZF9hZGRfZGlyZWN0b3J5KGVudHJ5LCBpbm9kZSk7CisJCW11dGV4X3VubG9jaygmZmMtPmluc3RfbXV0ZXgpOworCQlpZiAoZXJyKSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCX0KKwl9IGVsc2UKKwkJZF9hZGQoZW50cnksIGlub2RlKTsKKwogCWVudHJ5LT5kX29wID0gJmZ1c2VfZGVudHJ5X29wZXJhdGlvbnM7CiAJaWYgKCFlcnIpCiAJCWZ1c2VfY2hhbmdlX3RpbWVvdXQoZW50cnksICZvdXRhcmcpOwpAQCAtMzc1LDYgKzQwMiwxMyBAQAogCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRhcmc7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgZXJyOworCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKworCWZvcmdldF9yZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCWlmIChJU19FUlIoZm9yZ2V0X3JlcSkpIHsKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwkJcmV0dXJuIFBUUl9FUlIoZm9yZ2V0X3JlcSk7CisJfQogCiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGRpcik7CiAJcmVxLT5vdXQubnVtYXJncyA9IDE7CkBAIC0zODIsMzcgKzQxNiw0NyBAQAogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwogCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwotCWlmIChlcnIpIHsKLQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wdXRfZm9yZ2V0X3JlcTsKKwogCWVyciA9IC1FSU87CiAJaWYgKGludmFsaWRfbm9kZWlkKG91dGFyZy5ub2RlaWQpKQotCQlnb3RvIG91dF9wdXRfcmVxdWVzdDsKKwkJZ290byBvdXRfcHV0X2ZvcmdldF9yZXE7CiAKIAlpZiAoKG91dGFyZy5hdHRyLm1vZGUgXiBtb2RlKSAmIFNfSUZNVCkKLQkJZ290byBvdXRfcHV0X3JlcXVlc3Q7CisJCWdvdG8gb3V0X3B1dF9mb3JnZXRfcmVxOwogCiAJaW5vZGUgPSBmdXNlX2lnZXQoZGlyLT5pX3NiLCBvdXRhcmcubm9kZWlkLCBvdXRhcmcuZ2VuZXJhdGlvbiwKIAkJCSAgJm91dGFyZy5hdHRyKTsKIAlpZiAoIWlub2RlKSB7Ci0JCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIHJlcSwgb3V0YXJnLm5vZGVpZCwgMSk7CisJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGFyZy5ub2RlaWQsIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKIAotCWlmIChkaXJfYWxpYXMoaW5vZGUpKSB7Ci0JCWlwdXQoaW5vZGUpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJc3RydWN0IGRlbnRyeSAqYWxpYXM7CisJCW11dGV4X2xvY2soJmZjLT5pbnN0X211dGV4KTsKKwkJYWxpYXMgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOworCQlpZiAoYWxpYXMpIHsKKwkJCS8qIE5ldyBkaXJlY3RvcnkgbXVzdCBoYXZlIG1vdmVkIHNpbmNlIG1rZGlyICovCisJCQltdXRleF91bmxvY2soJmZjLT5pbnN0X211dGV4KTsKKwkJCWRwdXQoYWxpYXMpOworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWRfaW5zdGFudGlhdGUoZW50cnksIGlub2RlKTsKKwkJbXV0ZXhfdW5sb2NrKCZmYy0+aW5zdF9tdXRleCk7CisJfSBlbHNlCisJCWRfaW5zdGFudGlhdGUoZW50cnksIGlub2RlKTsKIAotCWRfaW5zdGFudGlhdGUoZW50cnksIGlub2RlKTsKIAlmdXNlX2NoYW5nZV90aW1lb3V0KGVudHJ5LCAmb3V0YXJnKTsKIAlmdXNlX2ludmFsaWRhdGVfYXR0cihkaXIpOwogCXJldHVybiAwOwogCi0gb3V0X3B1dF9yZXF1ZXN0OgotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7Cisgb3V0X3B1dF9mb3JnZXRfcmVxOgorCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTgxMiw3ICs4NTYsNyBAQAogCWludCBlcnI7CiAJc2l6ZV90IG5ieXRlczsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKIApAQCAtOTM1LDE0ICs5NzksMzAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGZ1c2Vfdm10cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0KQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJaW50IG5lZWRfdHJ1bmM7CisKKwlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwluZWVkX3RydW5jID0gaW5vZGUtPmlfc2l6ZSA+IG9mZnNldDsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZnNldCk7CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKworCWlmIChuZWVkX3RydW5jKSB7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwkJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBvZmZzZXQgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMobWFwcGluZywgb2Zmc2V0KTsKKwl9Cit9CisKIC8qCiAgKiBTZXQgYXR0cmlidXRlcywgYW5kIGF0IHRoZSBzYW1lIHRpbWUgcmVmcmVzaCB0aGVtLgogICoKICAqIFRydW5jYXRpb24gaXMgc2xpZ2h0bHkgY29tcGxpY2F0ZWQsIGJlY2F1c2UgdGhlICd0cnVuY2F0ZScgcmVxdWVzdAogICogbWF5IGZhaWwsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byB0b3VjaCB0aGUgbWFwcGluZy4KLSAqIHZtdHJ1bmNhdGUoKSBkb2Vzbid0IGFsbG93IGZvciB0aGlzIGNhc2UuICBTbyBkbyB0aGUgcmxpbWl0Ci0gKiBjaGVja2luZyBieSBoYW5kIGFuZCBjYWxsIHZtdHJ1bmNhdGUoKSBvbmx5IGFmdGVyIHRoZSBmaWxlIGhhcwotICogYWN0dWFsbHkgYmVlbiB0cnVuY2F0ZWQuCisgKiB2bXRydW5jYXRlKCkgZG9lc24ndCBhbGxvdyBmb3IgdGhpcyBjYXNlLCBzbyBkbyB0aGUgcmxpbWl0IGNoZWNraW5nCisgKiBhbmQgdGhlIGFjdHVhbCB0cnVuY2F0aW9uIGJ5IGhhbmQuCiAgKi8KIHN0YXRpYyBpbnQgZnVzZV9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CkBAIC05NjQsNiArMTAyNCw4IEBACiAJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CiAJCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAJCWlzX3RydW5jYXRlID0gMTsKKwkJaWYgKElTX1NXQVBGSUxFKGlub2RlKSkKKwkJCXJldHVybiAtRVRYVEJTWTsKIAkJbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0ZTSVpFXS5ybGltX2N1cjsKIAkJaWYgKGxpbWl0ICE9IFJMSU1fSU5GSU5JVFkgJiYgYXR0ci0+aWFfc2l6ZSA+IChsb2ZmX3QpIGxpbWl0KSB7CiAJCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKQEAgLTk5MywxMiArMTA1NSw4IEBACiAJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJCQllcnIgPSAtRUlPOwogCQl9IGVsc2UgewotCQkJaWYgKGlzX3RydW5jYXRlKSB7Ci0JCQkJbG9mZl90IG9yaWdzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgb3V0YXJnLmF0dHIuc2l6ZSk7Ci0JCQkJaWYgKG9yaWdzaXplID4gb3V0YXJnLmF0dHIuc2l6ZSkKLQkJCQkJdm10cnVuY2F0ZShpbm9kZSwgb3V0YXJnLmF0dHIuc2l6ZSk7Ci0JCQl9CisJCQlpZiAoaXNfdHJ1bmNhdGUpCisJCQkJZnVzZV92bXRydW5jYXRlKGlub2RlLCBvdXRhcmcuYXR0ci5zaXplKTsKIAkJCWZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoaW5vZGUsICZvdXRhcmcuYXR0cik7CiAJCQlmaS0+aV90aW1lID0gdGltZV90b19qaWZmaWVzKG91dGFyZy5hdHRyX3ZhbGlkLAogCQkJCQkJICAgICBvdXRhcmcuYXR0cl92YWxpZF9uc2VjKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKaW5kZXggMTgzNjI2OC4uMTM4Nzc0OSAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKKysrIGIvZnMvZnVzZS9maWxlLmMKQEAgLTE0MSw4ICsxNDEsOCBAQAogCQkJCQlpc2RpciA/IEZVU0VfUkVMRUFTRURJUiA6IEZVU0VfUkVMRUFTRSk7CiAKIAkJLyogSG9sZCB2ZnNtb3VudCBhbmQgZGVudHJ5IHVudGlsIHJlbGVhc2UgaXMgZmluaXNoZWQgKi8KLQkJcmVxLT52ZnNtb3VudCA9IG1udGdldChmaWxlLT5mX3Zmc21udCk7Ci0JCXJlcS0+ZGVudHJ5ID0gZGdldChmaWxlLT5mX2RlbnRyeSk7CisJCXJlcS0+dmZzbW91bnQgPSBtbnRnZXQoZmlsZS0+Zl9wYXRoLm1udCk7CisJCXJlcS0+ZGVudHJ5ID0gZGdldChmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAkJcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7CiAJfQogCkBAIC0xODQsNyArMTg0LDcgQEAKIAogc3RhdGljIGludCBmdXNlX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlLCBmbF9vd25lcl90IGlkKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCXN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwpAQCAtMzk3LDE0ICszOTcsMTQgQEAKIAogCWVyciA9IC1FSU87CiAJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCi0JCWdvdG8gY2xlYW5fcGFnZXNfdXA7CisJCWdvdG8gb3V0OwogCiAJZGF0YS5maWxlID0gZmlsZTsKIAlkYXRhLmlub2RlID0gaW5vZGU7CiAJZGF0YS5yZXEgPSBmdXNlX2dldF9yZXEoZmMpOwogCWVyciA9IFBUUl9FUlIoZGF0YS5yZXEpOwogCWlmIChJU19FUlIoZGF0YS5yZXEpKQotCQlnb3RvIGNsZWFuX3BhZ2VzX3VwOworCQlnb3RvIG91dDsKIAogCWVyciA9IHJlYWRfY2FjaGVfcGFnZXMobWFwcGluZywgcGFnZXMsIGZ1c2VfcmVhZHBhZ2VzX2ZpbGwsICZkYXRhKTsKIAlpZiAoIWVycikgewpAQCAtNDEzLDEwICs0MTMsNyBAQAogCQllbHNlCiAJCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBkYXRhLnJlcSk7CiAJfQotCXJldHVybiBlcnI7Ci0KLWNsZWFuX3BhZ2VzX3VwOgotCXB1dF9wYWdlc19saXN0KHBhZ2VzKTsKK291dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00ODEsOCArNDc4LDEwIEBACiAJCWVyciA9IC1FSU87CiAJaWYgKCFlcnIpIHsKIAkJcG9zICs9IGNvdW50OwotCQlpZiAocG9zID4gaV9zaXplX3JlYWQoaW5vZGUpKQorCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwkJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpCiAJCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcyk7CisJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAKIAkJaWYgKG9mZnNldCA9PSAwICYmIHRvID09IFBBR0VfQ0FDSEVfU0laRSkgewogCQkJY2xlYXJfcGFnZV9kaXJ0eShwYWdlKTsKQEAgLTUzNCw3ICs1MzMsNyBAQAogc3RhdGljIHNzaXplX3QgZnVzZV9kaXJlY3RfaW8oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywgaW50IHdyaXRlKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCXNpemVfdCBubWF4ID0gd3JpdGUgPyBmYy0+bWF4X3dyaXRlIDogZmMtPm1heF9yZWFkOwogCWxvZmZfdCBwb3MgPSAqcHBvczsKQEAgLTU4Niw4ICs1ODUsMTIgQEAKIAl9CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAocmVzID4gMCkgewotCQlpZiAod3JpdGUgJiYgcG9zID4gaV9zaXplX3JlYWQoaW5vZGUpKQotCQkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCQlpZiAod3JpdGUpIHsKKwkJCXNwaW5fbG9jaygmZmMtPmxvY2spOworCQkJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpCisJCQkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCQkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwkJfQogCQkqcHBvcyA9IHBvczsKIAl9CiAJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOwpAQCAtNjA0LDcgKzYwNyw3IEBACiBzdGF0aWMgc3NpemVfdCBmdXNlX2RpcmVjdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNzaXplX3QgcmVzOwogCS8qIERvbid0IGFsbG93IHBhcmFsbGVsIHdyaXRlcyB0byB0aGUgc2FtZSBmaWxlICovCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwpAQCAtNjU5LDcgKzY2Miw3IEBACiBzdGF0aWMgdm9pZCBmdXNlX2xrX2ZpbGwoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJIGNvbnN0IHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBpbnQgb3Bjb2RlLCBwaWRfdCBwaWQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CiAJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGZ1c2VfbGtfaW4gKmFyZyA9ICZyZXEtPm1pc2MubGtfaW47CkBAIC02NzksNyArNjgyLDcgQEAKIAogc3RhdGljIGludCBmdXNlX2dldGxrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKIAlzdHJ1Y3QgZnVzZV9sa19vdXQgb3V0YXJnOwpAQCAtNzA0LDcgKzcwNyw3IEBACiAKIHN0YXRpYyBpbnQgZnVzZV9zZXRsayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CiAJc3RydWN0IGZ1c2VfcmVxICpyZXE7CiAJaW50IG9wY29kZSA9IChmbC0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkgPyBGVVNFX1NFVExLVyA6IEZVU0VfU0VUTEs7CkBAIC03MzEsNyArNzM0LDcgQEAKIAogc3RhdGljIGludCBmdXNlX2ZpbGVfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CiAJaW50IGVycjsKIApAQCAtNzUxLDYgKzc1NCw0MiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBzZWN0b3JfdCBmdXNlX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJc3RydWN0IGZ1c2VfYm1hcF9pbiBpbmFyZzsKKwlzdHJ1Y3QgZnVzZV9ibWFwX291dCBvdXRhcmc7CisJaW50IGVycjsKKworCWlmICghaW5vZGUtPmlfc2ItPnNfYmRldiB8fCBmYy0+bm9fYm1hcCkKKwkJcmV0dXJuIDA7CisKKwlyZXEgPSBmdXNlX2dldF9yZXEoZmMpOworCWlmIChJU19FUlIocmVxKSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy5ibG9jayA9IGJsb2NrOworCWluYXJnLmJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9CTUFQOworCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJcmVxLT5pbi5udW1hcmdzID0gMTsKKwlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKGVyciA9PSAtRU5PU1lTKQorCQlmYy0+bm9fYm1hcCA9IDE7CisKKwlyZXR1cm4gZXJyID8gMCA6IG91dGFyZy5ibG9jazsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKQEAgLTc4NCw2ICs4MjMsNyBAQAogCS5jb21taXRfd3JpdGUJPSBmdXNlX2NvbW1pdF93cml0ZSwKIAkucmVhZHBhZ2VzCT0gZnVzZV9yZWFkcGFnZXMsCiAJLnNldF9wYWdlX2RpcnR5CT0gZnVzZV9zZXRfcGFnZV9kaXJ0eSwKKwkuYm1hcAkJPSBmdXNlX2JtYXAsCiB9OwogCiB2b2lkIGZ1c2VfaW5pdF9maWxlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaAppbmRleCA2OWM3NzUwLi5iOThiMjBkIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Z1c2VfaS5oCisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmgKQEAgLTIzOSw2ICsyMzksOSBAQAogCS8qKiBMb2NrIHByb3RlY3RpbmcgYWNjZXNzZXNzIHRvICBtZW1iZXJzIG9mIHRoaXMgc3RydWN0dXJlICovCiAJc3BpbmxvY2tfdCBsb2NrOwogCisJLyoqIE11dGV4IHByb3RlY3RpbmcgYWdhaW5zdCBkaXJlY3RvcnkgYWxpYXMgY3JlYXRpb24gKi8KKwlzdHJ1Y3QgbXV0ZXggaW5zdF9tdXRleDsKKwogCS8qKiBSZWZjb3VudCAqLwogCWF0b21pY190IGNvdW50OwogCkBAIC0yOTUsNiArMjk4LDkgQEAKIAkgICAgcmVwbHksIGJlZm9yZSBhbnkgb3RoZXIgcmVxdWVzdCwgYW5kIG5ldmVyIGNsZWFyZWQgKi8KIAl1bnNpZ25lZCBjb25uX2Vycm9yIDogMTsKIAorCS8qKiBDb25uZWN0aW9uIHN1Y2Nlc3NmdWwuICBPbmx5IHNldCBpbiBJTklUICovCisJdW5zaWduZWQgY29ubl9pbml0IDogMTsKKwogCS8qKiBEbyByZWFkcGFnZXMgYXN5bmNocm9ub3VzbHk/ICBPbmx5IHNldCBpbiBJTklUICovCiAJdW5zaWduZWQgYXN5bmNfcmVhZCA6IDE7CiAKQEAgLTMzNiw2ICszNDIsOSBAQAogCS8qKiBJcyBpbnRlcnJ1cHQgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwogCXVuc2lnbmVkIG5vX2ludGVycnVwdCA6IDE7CiAKKwkvKiogSXMgYm1hcCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fYm1hcCA6IDE7CisKIAkvKiogVGhlIG51bWJlciBvZiByZXF1ZXN0cyB3YWl0aW5nIGZvciBjb21wbGV0aW9uICovCiAJYXRvbWljX3QgbnVtX3dhaXRpbmc7CiAKQEAgLTM2Miw2ICszNzEsOSBAQAogCiAJLyoqIEtleSBmb3IgbG9jayBvd25lciBJRCBzY3JhbWJsaW5nICovCiAJdTMyIHNjcmFtYmxlX2tleVs0XTsKKworCS8qKiBSZXNlcnZlZCByZXF1ZXN0IGZvciB0aGUgREVTVFJPWSBtZXNzYWdlICovCisJc3RydWN0IGZ1c2VfcmVxICpkZXN0cm95X3JlcTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZ1c2VfY29ubiAqZ2V0X2Z1c2VfY29ubl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IDdkMGE5YWUuLjEyNDUwZDIgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTIyLDcgKzIyLDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqZnVzZV9pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZ1c2VfaW5vZGVfY2FjaGVwOwogc3RydWN0IGxpc3RfaGVhZCBmdXNlX2Nvbm5fbGlzdDsKIERFRklORV9NVVRFWChmdXNlX211dGV4KTsKIApAQCAtMzksNiArMzksNyBAQAogCXVuc2lnbmVkIGdyb3VwX2lkX3ByZXNlbnQgOiAxOwogCXVuc2lnbmVkIGZsYWdzOwogCXVuc2lnbmVkIG1heF9yZWFkOworCXVuc2lnbmVkIGJsa3NpemU7CiB9OwogCiBzdGF0aWMgc3RydWN0IGlub2RlICpmdXNlX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC00Niw3ICs0Nyw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmk7CiAKLQlpbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoZnVzZV9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoZnVzZV9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghaW5vZGUpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDksNiArMTEwLDcgQEAKIAogdm9pZCBmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmdXNlX2F0dHIgKmF0dHIpCiB7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiBpX3NpemVfcmVhZChpbm9kZSkgIT0gYXR0ci0+c2l6ZSkKIAkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nKTsKIApAQCAtMTE3LDcgKzExOSw5IEBACiAJaW5vZGUtPmlfbmxpbmsgICA9IGF0dHItPm5saW5rOwogCWlub2RlLT5pX3VpZCAgICAgPSBhdHRyLT51aWQ7CiAJaW5vZGUtPmlfZ2lkICAgICA9IGF0dHItPmdpZDsKKwlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAlpX3NpemVfd3JpdGUoaW5vZGUsIGF0dHItPnNpemUpOworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJaW5vZGUtPmlfYmxvY2tzICA9IGF0dHItPmJsb2NrczsKIAlpbm9kZS0+aV9hdGltZS50dl9zZWMgICA9IGF0dHItPmF0aW1lOwogCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgID0gYXR0ci0+YXRpbWVuc2VjOwpAQCAtMTMwLDcgKzEzNCw3IEBACiBzdGF0aWMgdm9pZCBmdXNlX2luaXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cikKIHsKIAlpbm9kZS0+aV9tb2RlID0gYXR0ci0+bW9kZSAmIFNfSUZNVDsKLQlpX3NpemVfd3JpdGUoaW5vZGUsIGF0dHItPnNpemUpOworCWlub2RlLT5pX3NpemUgPSBhdHRyLT5zaXplOwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CiAJCWZ1c2VfaW5pdF9jb21tb24oaW5vZGUpOwogCQlmdXNlX2luaXRfZmlsZV9pbm9kZShpbm9kZSk7CkBAIC0xNjksNyArMTczLDYgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmdXNlX2lub2RlICpmaTsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm5fc3VwZXIoc2IpOwotCWludCByZXRyaWVkID0gMDsKIAogIHJldHJ5OgogCWlub2RlID0gaWdldDVfbG9ja2VkKHNiLCBub2RlaWQsIGZ1c2VfaW5vZGVfZXEsIGZ1c2VfaW5vZGVfc2V0LCAmbm9kZWlkKTsKQEAgLTE4MywxNiArMTg2LDE2IEBACiAJCWZ1c2VfaW5pdF9pbm9kZShpbm9kZSwgYXR0cik7CiAJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogCX0gZWxzZSBpZiAoKGlub2RlLT5pX21vZGUgXiBhdHRyLT5tb2RlKSAmIFNfSUZNVCkgewotCQlCVUdfT04ocmV0cmllZCk7CiAJCS8qIElub2RlIGhhcyBjaGFuZ2VkIHR5cGUsIGFueSBJL08gb24gdGhlIG9sZCBzaG91bGQgZmFpbCAqLwogCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwotCQlyZXRyaWVkID0gMTsKIAkJZ290byByZXRyeTsKIAl9CiAKIAlmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKKwlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAlmaS0+bmxvb2t1cCArKzsKKwlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCWZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoaW5vZGUsIGF0dHIpOwogCXJldHVybiBpbm9kZTsKIH0KQEAgLTIwMywxMCArMjA2LDIzIEBACiAJCWZ1c2VfYWJvcnRfY29ubihnZXRfZnVzZV9jb25uX3N1cGVyKHZmc21udC0+bW50X3NiKSk7CiB9CiAKK3N0YXRpYyB2b2lkIGZ1c2Vfc2VuZF9kZXN0cm95KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQoreworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZmMtPmRlc3Ryb3lfcmVxOworCWlmIChyZXEgJiYgZmMtPmNvbm5faW5pdCkgeworCQlmYy0+ZGVzdHJveV9yZXEgPSBOVUxMOworCQlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9ERVNUUk9ZOworCQlyZXEtPmZvcmNlID0gMTsKKwkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCX0KK30KKwogc3RhdGljIHZvaWQgZnVzZV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm5fc3VwZXIoc2IpOwogCisJZnVzZV9zZW5kX2Rlc3Ryb3koZmMpOwogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCWZjLT5jb25uZWN0ZWQgPSAwOwogCWZjLT5ibG9ja2VkID0gMDsKQEAgLTI3Miw2ICsyODgsNyBAQAogCU9QVF9ERUZBVUxUX1BFUk1JU1NJT05TLAogCU9QVF9BTExPV19PVEhFUiwKIAlPUFRfTUFYX1JFQUQsCisJT1BUX0JMS1NJWkUsCiAJT1BUX0VSUgogfTsKIApAQCAtMjgzLDE0ICszMDAsMTYgQEAKIAl7T1BUX0RFRkFVTFRfUEVSTUlTU0lPTlMsCSJkZWZhdWx0X3Blcm1pc3Npb25zIn0sCiAJe09QVF9BTExPV19PVEhFUiwJCSJhbGxvd19vdGhlciJ9LAogCXtPUFRfTUFYX1JFQUQsCQkJIm1heF9yZWFkPSV1In0sCisJe09QVF9CTEtTSVpFLAkJCSJibGtzaXplPSV1In0sCiAJe09QVF9FUlIsCQkJTlVMTH0KIH07CiAKLXN0YXRpYyBpbnQgcGFyc2VfZnVzZV9vcHQoY2hhciAqb3B0LCBzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhICpkKQorc3RhdGljIGludCBwYXJzZV9mdXNlX29wdChjaGFyICpvcHQsIHN0cnVjdCBmdXNlX21vdW50X2RhdGEgKmQsIGludCBpc19iZGV2KQogewogCWNoYXIgKnA7CiAJbWVtc2V0KGQsIDAsIHNpemVvZihzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhKSk7CiAJZC0+bWF4X3JlYWQgPSB+MDsKKwlkLT5ibGtzaXplID0gNTEyOwogCiAJd2hpbGUgKChwID0gc3Ryc2VwKCZvcHQsICIsIikpICE9IE5VTEwpIHsKIAkJaW50IHRva2VuOwpAQCAtMzQzLDYgKzM2MiwxMiBAQAogCQkJZC0+bWF4X3JlYWQgPSB2YWx1ZTsKIAkJCWJyZWFrOwogCisJCWNhc2UgT1BUX0JMS1NJWkU6CisJCQlpZiAoIWlzX2JkZXYgfHwgbWF0Y2hfaW50KCZhcmdzWzBdLCAmdmFsdWUpKQorCQkJCXJldHVybiAwOworCQkJZC0+Ymxrc2l6ZSA9IHZhbHVlOworCQkJYnJlYWs7CisKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAwOwogCQl9CkBAIC0zNzcsNiArNDAyLDcgQEAKIAlmYyA9IGt6YWxsb2Moc2l6ZW9mKCpmYyksIEdGUF9LRVJORUwpOwogCWlmIChmYykgewogCQlzcGluX2xvY2tfaW5pdCgmZmMtPmxvY2spOworCQltdXRleF9pbml0KCZmYy0+aW5zdF9tdXRleCk7CiAJCWF0b21pY19zZXQoJmZjLT5jb3VudCwgMSk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT53YWl0cSk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5ibG9ja2VkX3dhaXRxKTsKQEAgLTM5Niw4ICs0MjIsMTIgQEAKIAogdm9pZCBmdXNlX2Nvbm5fcHV0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmYy0+Y291bnQpKQorCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmYy0+Y291bnQpKSB7CisJCWlmIChmYy0+ZGVzdHJveV9yZXEpCisJCQlmdXNlX3JlcXVlc3RfZnJlZShmYy0+ZGVzdHJveV9yZXEpOworCQltdXRleF9kZXN0cm95KCZmYy0+aW5zdF9tdXRleCk7CiAJCWtmcmVlKGZjKTsKKwl9CiB9CiAKIHN0cnVjdCBmdXNlX2Nvbm4gKmZ1c2VfY29ubl9nZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpCkBAIC00NTEsNiArNDgxLDcgQEAKIAkJZmMtPmJkaS5yYV9wYWdlcyA9IG1pbihmYy0+YmRpLnJhX3BhZ2VzLCByYV9wYWdlcyk7CiAJCWZjLT5taW5vciA9IGFyZy0+bWlub3I7CiAJCWZjLT5tYXhfd3JpdGUgPSBhcmctPm1pbm9yIDwgNSA/IDQwOTYgOiBhcmctPm1heF93cml0ZTsKKwkJZmMtPmNvbm5faW5pdCA9IDE7CiAJfQogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJZmMtPmJsb2NrZWQgPSAwOwpAQCAtNDk1LDE1ICs1MjYsMjMgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpyb290X2RlbnRyeTsKIAlzdHJ1Y3QgZnVzZV9yZXEgKmluaXRfcmVxOwogCWludCBlcnI7CisJaW50IGlzX2JkZXYgPSBzYi0+c19iZGV2ICE9IE5VTEw7CiAKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19NQU5ETE9DSykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIXBhcnNlX2Z1c2Vfb3B0KChjaGFyICopIGRhdGEsICZkKSkKKwlpZiAoIXBhcnNlX2Z1c2Vfb3B0KChjaGFyICopIGRhdGEsICZkLCBpc19iZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzYi0+c19ibG9ja3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0Jc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOworCWlmIChpc19iZGV2KSB7CisjaWZkZWYgQ09ORklHX0JMT0NLCisJCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgZC5ibGtzaXplKSkKKwkJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisJfSBlbHNlIHsKKwkJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJfQogCXNiLT5zX21hZ2ljID0gRlVTRV9TVVBFUl9NQUdJQzsKIAlzYi0+c19vcCA9ICZmdXNlX3N1cGVyX29wZXJhdGlvbnM7CiAJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwpAQCAtNTQyLDYgKzU4MSwxMiBAQAogCWlmICghaW5pdF9yZXEpCiAJCWdvdG8gZXJyX3B1dF9yb290OwogCisJaWYgKGlzX2JkZXYpIHsKKwkJZmMtPmRlc3Ryb3lfcmVxID0gZnVzZV9yZXF1ZXN0X2FsbG9jKCk7CisJCWlmICghZmMtPmRlc3Ryb3lfcmVxKQorCQkJZ290byBlcnJfcHV0X3Jvb3Q7CisJfQorCiAJbXV0ZXhfbG9jaygmZnVzZV9tdXRleCk7CiAJZXJyID0gLUVJTlZBTDsKIAlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhKQpAQCAtNTkzLDEwICs2MzgsNDcgQEAKIAkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKIH07CiAKKyNpZmRlZiBDT05GSUdfQkxPQ0sKK3N0YXRpYyBpbnQgZnVzZV9nZXRfc2JfYmxrKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCSAgIHZvaWQgKnJhd19kYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCByYXdfZGF0YSwgZnVzZV9maWxsX3N1cGVyLAorCQkJICAgbW50KTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGZ1c2VibGtfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImZ1c2VibGsiLAorCS5nZXRfc2IJCT0gZnVzZV9nZXRfc2JfYmxrLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9mdXNlYmxrKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmZ1c2VibGtfZnNfdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bnJlZ2lzdGVyX2Z1c2VibGsodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmZ1c2VibGtfZnNfdHlwZSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfZnVzZWJsayh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl9mdXNlYmxrKHZvaWQpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIGRlY2xfc3Vic3lzKGZ1c2UsIE5VTEwsIE5VTEwpOwogc3RhdGljIGRlY2xfc3Vic3lzKGNvbm5lY3Rpb25zLCBOVUxMLCBOVUxMKTsKIAotc3RhdGljIHZvaWQgZnVzZV9pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKK3N0YXRpYyB2b2lkIGZ1c2VfaW5vZGVfaW5pdF9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKIAkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZvbzsKQEAgLTYxMiwyNCArNjk0LDM0IEBACiAKIAllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZmdXNlX2ZzX3R5cGUpOwogCWlmIChlcnIpCi0JCXByaW50aygiZnVzZTogZmFpbGVkIHRvIHJlZ2lzdGVyIGZpbGVzeXN0ZW1cbiIpOwotCWVsc2UgewotCQlmdXNlX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmdXNlX2lub2RlIiwKLQkJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgZnVzZV9pbm9kZSksCi0JCQkJCQkgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCi0JCQkJCQkgICAgICBmdXNlX2lub2RlX2luaXRfb25jZSwgTlVMTCk7Ci0JCWlmICghZnVzZV9pbm9kZV9jYWNoZXApIHsKLQkJCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZnVzZV9mc190eXBlKTsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCX0KLQl9CisJCWdvdG8gb3V0OwogCisJZXJyID0gcmVnaXN0ZXJfZnVzZWJsaygpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucmVnOworCisJZnVzZV9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZnVzZV9pbm9kZSIsCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgZnVzZV9pbm9kZSksCisJCQkJCSAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgICAgZnVzZV9pbm9kZV9pbml0X29uY2UsIE5VTEwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFmdXNlX2lub2RlX2NhY2hlcCkKKwkJZ290byBvdXRfdW5yZWcyOworCisJcmV0dXJuIDA7CisKKyBvdXRfdW5yZWcyOgorCXVucmVnaXN0ZXJfZnVzZWJsaygpOworIG91dF91bnJlZzoKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmZ1c2VfZnNfdHlwZSk7Cisgb3V0OgogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2VfZnNfY2xlYW51cCh2b2lkKQogewogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZnVzZV9mc190eXBlKTsKKwl1bnJlZ2lzdGVyX2Z1c2VibGsoKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZnVzZV9pbm9kZV9jYWNoZXApOwogfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL0tjb25maWcgYi9mcy9nZnMyL0tjb25maWcKaW5kZXggOGMyN2RlOC4uYzA3OTFjYiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9LY29uZmlnCisrKyBiL2ZzL2dmczIvS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAl0cmlzdGF0ZSAiR0ZTMiBmaWxlIHN5c3RlbSBzdXBwb3J0IgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJc2VsZWN0IEZTX1BPU0lYX0FDTAorCXNlbGVjdCBDUkMzMgogCWhlbHAKIAlBIGNsdXN0ZXIgZmlsZXN5c3RlbS4KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hY2wuYyBiL2ZzL2dmczIvYWNsLmMKaW5kZXggNWY5NTliOC4uNmU4MDg0NCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hY2wuYworKysgYi9mcy9nZnMyL2FjbC5jCkBAIC03NCwxMSArNzQsMTEgQEAKIHsKIAlpZiAoIUdGUzJfU0IoJmlwLT5pX2lub2RlKS0+c2RfYXJncy5hcl9wb3NpeF9hY2wpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaXAtPmlfZGkuZGlfdWlkICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCWlmIChjdXJyZW50LT5mc3VpZCAhPSBpcC0+aV9pbm9kZS5pX3VpZCAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKIAkJcmV0dXJuIC1FUEVSTTsKLQlpZiAoU19JU0xOSyhpcC0+aV9kaS5kaV9tb2RlKSkKKwlpZiAoU19JU0xOSyhpcC0+aV9pbm9kZS5pX21vZGUpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JaWYgKCFhY2Nlc3MgJiYgIVNfSVNESVIoaXAtPmlfZGkuZGlfbW9kZSkpCisJaWYgKCFhY2Nlc3MgJiYgIVNfSVNESVIoaXAtPmlfaW5vZGUuaV9tb2RlKSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKIAlyZXR1cm4gMDsKQEAgLTE0NSwxNCArMTQ1LDE0IEBACiB9CiAKIC8qKgotICogZ2ZzMl9jaGVja19hY2xfbG9ja2VkIC0gQ2hlY2sgYW4gQUNMIHRvIHNlZSBpZiB3ZSdyZSBhbGxvd2VkIHRvIGRvIHNvbWV0aGluZworICogZ2ZzMl9jaGVja19hY2wgLSBDaGVjayBhbiBBQ0wgdG8gc2VlIGlmIHdlJ3JlIGFsbG93ZWQgdG8gZG8gc29tZXRoaW5nCiAgKiBAaW5vZGU6IHRoZSBmaWxlIHdlIHdhbnQgdG8gZG8gc29tZXRoaW5nIHRvCiAgKiBAbWFzazogd2hhdCB3ZSB3YW50IHRvIGRvCiAgKgogICogUmV0dXJuczogZXJybm8KICAqLwogCi1pbnQgZ2ZzMl9jaGVja19hY2xfbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoraW50IGdmczJfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CiAJaW50IGVycm9yOwpAQCAtMTcwLDIxICsxNzAsNiBAQAogCXJldHVybiAtRUFHQUlOOwogfQogCi1pbnQgZ2ZzMl9jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCi17Ci0Jc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKLQlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgaV9naDsKLQlpbnQgZXJyb3I7Ci0KLQllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCBMTV9GTEFHX0FOWSwgJmlfZ2gpOwotCWlmICghZXJyb3IpIHsKLQkJZXJyb3IgPSBnZnMyX2NoZWNrX2FjbF9sb2NrZWQoaW5vZGUsIG1hc2spOwotCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmaV9naCk7Ci0JfQotCi0JcmV0dXJuIGVycm9yOwotfQotCiBzdGF0aWMgaW50IG11bmdlX21vZGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKQEAgLTE5OCwxMCArMTgzLDEwIEBACiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJaWYgKCFlcnJvcikgewogCQlnZnMyX2Fzc2VydF93aXRoZHJhdyhzZHAsCi0JCQkJKGlwLT5pX2RpLmRpX21vZGUgJiBTX0lGTVQpID09IChtb2RlICYgU19JRk1UKSk7Ci0JCWlwLT5pX2RpLmRpX21vZGUgPSBtb2RlOworCQkJCShpcC0+aV9pbm9kZS5pX21vZGUgJiBTX0lGTVQpID09IChtb2RlICYgU19JRk1UKSk7CisJCWlwLT5pX2lub2RlLmlfbW9kZSA9IG1vZGU7CiAJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQkJZ2ZzMl9kaW5vZGVfb3V0KCZpcC0+aV9kaSwgZGliaC0+Yl9kYXRhKTsKKwkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwogCQlicmVsc2UoZGliaCk7CiAJfQogCkBAIC0yMTUsMTIgKzIwMCwxMiBAQAogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmZGlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBOVUxMLCAqY2xvbmU7CiAJc3RydWN0IGdmczJfZWFfcmVxdWVzdCBlcjsKLQltb2RlX3QgbW9kZSA9IGlwLT5pX2RpLmRpX21vZGU7CisJbW9kZV90IG1vZGUgPSBpcC0+aV9pbm9kZS5pX21vZGU7CiAJaW50IGVycm9yOwogCiAJaWYgKCFzZHAtPnNkX2FyZ3MuYXJfcG9zaXhfYWNsKQogCQlyZXR1cm4gMDsKLQlpZiAoU19JU0xOSyhpcC0+aV9kaS5kaV9tb2RlKSkKKwlpZiAoU19JU0xOSyhpcC0+aV9pbm9kZS5pX21vZGUpKQogCQlyZXR1cm4gMDsKIAogCW1lbXNldCgmZXIsIDAsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9lYV9yZXF1ZXN0KSk7CkBAIC0yMzIsNyArMjE3LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCWlmICghYWNsKSB7CiAJCW1vZGUgJj0gfmN1cnJlbnQtPmZzLT51bWFzazsKLQkJaWYgKG1vZGUgIT0gaXAtPmlfZGkuZGlfbW9kZSkKKwkJaWYgKG1vZGUgIT0gaXAtPmlfaW5vZGUuaV9tb2RlKQogCQkJZXJyb3IgPSBtdW5nZV9tb2RlKGlwLCBtb2RlKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTI0NCw3ICsyMjksNyBAQAogCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAJYWNsID0gY2xvbmU7CiAKLQlpZiAoU19JU0RJUihpcC0+aV9kaS5kaV9tb2RlKSkgeworCWlmIChTX0lTRElSKGlwLT5pX2lub2RlLmlfbW9kZSkpIHsKIAkJZXIuZXJfbmFtZSA9IEdGUzJfUE9TSVhfQUNMX0RFRkFVTFQ7CiAJCWVyLmVyX25hbWVfbGVuID0gR0ZTMl9QT1NJWF9BQ0xfREVGQVVMVF9MRU47CiAJCWVycm9yID0gZ2ZzMl9zeXN0ZW1fZWFvcHMuZW9fc2V0KGlwLCAmZXIpOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hY2wuaCBiL2ZzL2dmczIvYWNsLmgKaW5kZXggMDVjMjk0Zi4uNjc1MTkzMCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hY2wuaAorKysgYi9mcy9nZnMyL2FjbC5oCkBAIC0zMSw3ICszMSw2IEBACiAJCQkgIHN0cnVjdCBnZnMyX2VhX3JlcXVlc3QgKmVyLAogCQkJICBpbnQgKnJlbW92ZSwgbW9kZV90ICptb2RlKTsKIGludCBnZnMyX2FjbF92YWxpZGF0ZV9yZW1vdmUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBpbnQgYWNjZXNzKTsKLWludCBnZnMyX2NoZWNrX2FjbF9sb2NrZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOwogaW50IGdmczJfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKIGludCBnZnMyX2FjbF9jcmVhdGUoc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIGludCBnZnMyX2FjbF9jaG1vZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBpYXR0ciAqYXR0cik7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2JtYXAuYyBiL2ZzL2dmczIvYm1hcC5jCmluZGV4IGNjNTdmMmUuLjgyNDBjMWYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYm1hcC5jCisrKyBiL2ZzL2dmczIvYm1hcC5jCkBAIC0zOCw4ICszOCw4IEBACiB9OwogCiB0eXBlZGVmIGludCAoKmJsb2NrX2NhbGxfdCkgKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1NjQgKnRvcCwKLQkJCSAgICAgdTY0ICpib3R0b20sIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fYmU2NCAqdG9wLAorCQkJICAgICBfX2JlNjQgKmJvdHRvbSwgdW5zaWduZWQgaW50IGhlaWdodCwKIAkJCSAgICAgdm9pZCAqZGF0YSk7CiAKIHN0cnVjdCBzdHJpcF9taW5lIHsKQEAgLTE2Myw2ICsxNjMsNyBAQAogCWlmIChpcC0+aV9kaS5kaV9zaXplKSB7CiAJCSooX19iZTY0ICopKGRpICsgMSkgPSBjcHVfdG9fYmU2NChibG9jayk7CiAJCWlwLT5pX2RpLmRpX2Jsb2NrcysrOworCQlnZnMyX3NldF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlKTsKIAkJZGktPmRpX2Jsb2NrcyA9IGNwdV90b19iZTY0KGlwLT5pX2RpLmRpX2Jsb2Nrcyk7CiAJfQogCkBAIC0yMzAsNyArMjMxLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJsb2Nrc1tHRlMyX01BWF9NRVRBX0hFSUdIVF07CiAJc3RydWN0IGdmczJfZGlub2RlICpkaTsKIAlpbnQgZXJyb3I7Ci0JdTY0ICpicDsKKwlfX2JlNjQgKmJwOwogCXU2NCBibjsKIAl1bnNpZ25lZCBuOwogCkBAIC0yNTUsNyArMjU2LDcgQEAKIAkJCQkJICBHRlMyX0ZPUk1BVF9JTik7CiAJCQlnZnMyX2J1ZmZlcl9jbGVhcl90YWlsKGJsb2Nrc1tuXSwKIAkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcikpOwotCQkJYnAgPSAodTY0ICopKGJsb2Nrc1tuXS0+Yl9kYXRhICsKKwkJCWJwID0gKF9fYmU2NCAqKShibG9ja3Nbbl0tPmJfZGF0YSArCiAJCQkJICAgICBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpKTsKIAkJCSpicCA9IGNwdV90b19iZTY0KGJsb2Nrc1tuKzFdLT5iX2Jsb2NrbnIpOwogCQkJYnJlbHNlKGJsb2Nrc1tuXSk7CkBAIC0yNzIsNiArMjczLDcgQEAKIAkqKF9fYmU2NCAqKShkaSArIDEpID0gY3B1X3RvX2JlNjQoYm4pOwogCWlwLT5pX2RpLmRpX2hlaWdodCArPSBuZXdfaGVpZ2h0OwogCWlwLT5pX2RpLmRpX2Jsb2NrcyArPSBuZXdfaGVpZ2h0OworCWdmczJfc2V0X2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUpOwogCWRpLT5kaV9oZWlnaHQgPSBjcHVfdG9fYmUxNihpcC0+aV9kaS5kaV9oZWlnaHQpOwogCWRpLT5kaV9ibG9ja3MgPSBjcHVfdG9fYmU2NChpcC0+aV9kaS5kaV9ibG9ja3MpOwogCWJyZWxzZShkaWJoKTsKQEAgLTM2MCwxNSArMzYyLDE1IEBACiAgKiBtZXRhZGF0YSB0cmVlLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdTY0ICptZXRhcG9pbnRlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgKmJvdW5kYXJ5LAorc3RhdGljIGlubGluZSBfX2JlNjQgKm1ldGFwb2ludGVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCAqYm91bmRhcnksCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGhlaWdodCwgY29uc3Qgc3RydWN0IG1ldGFwYXRoICptcCkKIHsKIAl1bnNpZ25lZCBpbnQgaGVhZF9zaXplID0gKGhlaWdodCA+IDApID8KIAkJc2l6ZW9mKHN0cnVjdCBnZnMyX21ldGFfaGVhZGVyKSA6IHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpOwotCXU2NCAqcHRyOworCV9fYmU2NCAqcHRyOwogCSpib3VuZGFyeSA9IDA7Ci0JcHRyID0gKCh1NjQgKikoYmgtPmJfZGF0YSArIGhlYWRfc2l6ZSkpICsgbXAtPm1wX2xpc3RbaGVpZ2h0XTsKLQlpZiAocHRyICsgMSA9PSAodTY0ICopKGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplKSkKKwlwdHIgPSAoKF9fYmU2NCAqKShiaC0+Yl9kYXRhICsgaGVhZF9zaXplKSkgKyBtcC0+bXBfbGlzdFtoZWlnaHRdOworCWlmIChwdHIgKyAxID09IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIGJoLT5iX3NpemUpKQogCQkqYm91bmRhcnkgPSAxOwogCXJldHVybiBwdHI7CiB9CkBAIC0zOTQsNyArMzk2LDcgQEAKIAkJCWludCAqbmV3LCB1NjQgKmJsb2NrKQogewogCWludCBib3VuZGFyeTsKLQl1NjQgKnB0ciA9IG1ldGFwb2ludGVyKGJoLCAmYm91bmRhcnksIGhlaWdodCwgbXApOworCV9fYmU2NCAqcHRyID0gbWV0YXBvaW50ZXIoYmgsICZib3VuZGFyeSwgaGVpZ2h0LCBtcCk7CiAKIAlpZiAoKnB0cikgewogCQkqYmxvY2sgPSBiZTY0X3RvX2NwdSgqcHRyKTsKQEAgLTQxNSwxMTMgKzQxNywxMiBAQAogCiAJKnB0ciA9IGNwdV90b19iZTY0KCpibG9jayk7CiAJaXAtPmlfZGkuZGlfYmxvY2tzKys7CisJZ2ZzMl9zZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSk7CiAKIAkqbmV3ID0gMTsKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBnZnMyX2Jsb2NrX3BvaW50ZXJzIC0gTWFwIGEgYmxvY2sgZnJvbSBhbiBpbm9kZSB0byBhIGRpc2sgYmxvY2sKLSAqIEBpbm9kZTogVGhlIGlub2RlCi0gKiBAbGJsb2NrOiBUaGUgbG9naWNhbCBibG9jayBudW1iZXIKLSAqIEBtYXBfYmg6IFRoZSBiaCB0byBiZSBtYXBwZWQKLSAqIEBtcDogbWV0YXBhdGggdG8gdXNlCi0gKgotICogRmluZCB0aGUgYmxvY2sgbnVtYmVyIG9uIHRoZSBjdXJyZW50IGRldmljZSB3aGljaCBjb3JyZXNwb25kcyB0byBhbgotICogaW5vZGUncyBibG9jay4gSWYgdGhlIGJsb2NrIGhhZCB0byBiZSBjcmVhdGVkLCAibmV3IiB3aWxsIGJlIHNldC4KLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLXN0YXRpYyBpbnQgZ2ZzMl9ibG9ja19wb2ludGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbGJsb2NrLCBpbnQgY3JlYXRlLAotCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfbWFwLCBzdHJ1Y3QgbWV0YXBhdGggKm1wLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXhsZW4pCi17Ci0Jc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0JdW5zaWduZWQgaW50IGJzaXplOwotCXVuc2lnbmVkIGludCBoZWlnaHQ7Ci0JdW5zaWduZWQgaW50IGVuZF9vZl9tZXRhZGF0YTsKLQl1bnNpZ25lZCBpbnQgeDsKLQlpbnQgZXJyb3IgPSAwOwotCWludCBuZXcgPSAwOwotCXU2NCBkYmxvY2sgPSAwOwotCWludCBib3VuZGFyeTsKLQotCUJVR19PTihtYXhsZW4gPT0gMCk7Ci0KLQlpZiAoZ2ZzMl9hc3NlcnRfd2FybihzZHAsICFnZnMyX2lzX3N0dWZmZWQoaXApKSkKLQkJcmV0dXJuIDA7Ci0KLQlic2l6ZSA9IGdmczJfaXNfZGlyKGlwKSA/IHNkcC0+c2RfamJzaXplIDogc2RwLT5zZF9zYi5zYl9ic2l6ZTsKLQotCWhlaWdodCA9IGNhbGNfdHJlZV9oZWlnaHQoaXAsIChsYmxvY2sgKyAxKSAqIGJzaXplKTsKLQlpZiAoaXAtPmlfZGkuZGlfaGVpZ2h0IDwgaGVpZ2h0KSB7Ci0JCWlmICghY3JlYXRlKQotCQkJcmV0dXJuIDA7Ci0KLQkJZXJyb3IgPSBidWlsZF9oZWlnaHQoaW5vZGUsIGhlaWdodCk7Ci0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlmaW5kX21ldGFwYXRoKGlwLCBsYmxvY2ssIG1wKTsKLQllbmRfb2ZfbWV0YWRhdGEgPSBpcC0+aV9kaS5kaV9oZWlnaHQgLSAxOwotCi0JZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmYmgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JZm9yICh4ID0gMDsgeCA8IGVuZF9vZl9tZXRhZGF0YTsgeCsrKSB7Ci0JCWxvb2t1cF9ibG9jayhpcCwgYmgsIHgsIG1wLCBjcmVhdGUsICZuZXcsICZkYmxvY2spOwotCQlicmVsc2UoYmgpOwotCQlpZiAoIWRibG9jaykKLQkJCXJldHVybiAwOwotCi0JCWVycm9yID0gZ2ZzMl9tZXRhX2luZGlyZWN0X2J1ZmZlcihpcCwgeCsxLCBkYmxvY2ssIG5ldywgJmJoKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQotCWJvdW5kYXJ5ID0gbG9va3VwX2Jsb2NrKGlwLCBiaCwgZW5kX29mX21ldGFkYXRhLCBtcCwgY3JlYXRlLCAmbmV3LCAmZGJsb2NrKTsKLQljbGVhcl9idWZmZXJfbWFwcGVkKGJoX21hcCk7Ci0JY2xlYXJfYnVmZmVyX25ldyhiaF9tYXApOwotCWNsZWFyX2J1ZmZlcl9ib3VuZGFyeShiaF9tYXApOwotCi0JaWYgKGRibG9jaykgewotCQltYXBfYmgoYmhfbWFwLCBpbm9kZS0+aV9zYiwgZGJsb2NrKTsKLQkJaWYgKGJvdW5kYXJ5KQotCQkJc2V0X2J1ZmZlcl9ib3VuZGFyeShiaCk7Ci0JCWlmIChuZXcpIHsKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqZGliaDsKLQkJCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwotCQkJaWYgKCFlcnJvcikgewotCQkJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQkJCQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOwotCQkJCWJyZWxzZShkaWJoKTsKLQkJCX0KLQkJCXNldF9idWZmZXJfbmV3KGJoX21hcCk7Ci0JCQlnb3RvIG91dF9icmVsc2U7Ci0JCX0KLQkJd2hpbGUoLS1tYXhsZW4gJiYgIWJ1ZmZlcl9ib3VuZGFyeShiaF9tYXApKSB7Ci0JCQl1NjQgZWJsb2NrOwotCi0JCQltcC0+bXBfbGlzdFtlbmRfb2ZfbWV0YWRhdGFdKys7Ci0JCQlib3VuZGFyeSA9IGxvb2t1cF9ibG9jayhpcCwgYmgsIGVuZF9vZl9tZXRhZGF0YSwgbXAsIDAsICZuZXcsICZlYmxvY2spOwotCQkJaWYgKGVibG9jayAhPSArK2RibG9jaykKLQkJCQlicmVhazsKLQkJCWJoX21hcC0+Yl9zaXplICs9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOwotCQkJaWYgKGJvdW5kYXJ5KQotCQkJCXNldF9idWZmZXJfYm91bmRhcnkoYmhfbWFwKTsKLQkJfQotCX0KLW91dF9icmVsc2U6Ci0JYnJlbHNlKGJoKTsKLQlyZXR1cm4gMDsKLX0KLQotCiBzdGF0aWMgaW5saW5lIHZvaWQgYm1hcF9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjcmVhdGUpCiB7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKQEAgLTU0MCwyMiArNDQxLDExNyBAQAogCQl1cF9yZWFkKCZpcC0+aV9yd19tdXRleCk7CiB9CiAKKy8qKgorICogZ2ZzMl9ibG9ja19tYXAgLSBNYXAgYSBibG9jayBmcm9tIGFuIGlub2RlIHRvIGEgZGlzayBibG9jaworICogQGlub2RlOiBUaGUgaW5vZGUKKyAqIEBsYmxvY2s6IFRoZSBsb2dpY2FsIGJsb2NrIG51bWJlcgorICogQGJoX21hcDogVGhlIGJoIHRvIGJlIG1hcHBlZAorICoKKyAqIEZpbmQgdGhlIGJsb2NrIG51bWJlciBvbiB0aGUgY3VycmVudCBkZXZpY2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4KKyAqIGlub2RlJ3MgYmxvY2suIElmIHRoZSBibG9jayBoYWQgdG8gYmUgY3JlYXRlZCwgIm5ldyIgd2lsbCBiZSBzZXQuCisgKgorICogUmV0dXJuczogZXJybm8KKyAqLworCiBpbnQgZ2ZzMl9ibG9ja19tYXAoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGxibG9jaywgaW50IGNyZWF0ZSwKLQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdW5zaWduZWQgaW50IG1heGxlbikKKwkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9tYXApCiB7CisJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJdW5zaWduZWQgaW50IGJzaXplOworCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJdW5zaWduZWQgaW50IGVuZF9vZl9tZXRhZGF0YTsKKwl1bnNpZ25lZCBpbnQgeDsKKwlpbnQgZXJyb3IgPSAwOworCWludCBuZXcgPSAwOworCXU2NCBkYmxvY2sgPSAwOworCWludCBib3VuZGFyeTsKKwl1bnNpZ25lZCBpbnQgbWF4bGVuID0gYmhfbWFwLT5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKIAlzdHJ1Y3QgbWV0YXBhdGggbXA7Ci0JaW50IHJldDsKKwl1NjQgc2l6ZTsKKworCUJVR19PTihtYXhsZW4gPT0gMCk7CisKKwlpZiAoZ2ZzMl9hc3NlcnRfd2FybihzZHAsICFnZnMyX2lzX3N0dWZmZWQoaXApKSkKKwkJcmV0dXJuIDA7CiAKIAlibWFwX2xvY2soaW5vZGUsIGNyZWF0ZSk7Ci0JcmV0ID0gZ2ZzMl9ibG9ja19wb2ludGVycyhpbm9kZSwgbGJsb2NrLCBjcmVhdGUsIGJoLCAmbXAsIG1heGxlbik7CisJY2xlYXJfYnVmZmVyX21hcHBlZChiaF9tYXApOworCWNsZWFyX2J1ZmZlcl9uZXcoYmhfbWFwKTsKKwljbGVhcl9idWZmZXJfYm91bmRhcnkoYmhfbWFwKTsKKwlic2l6ZSA9IGdmczJfaXNfZGlyKGlwKSA/IHNkcC0+c2RfamJzaXplIDogc2RwLT5zZF9zYi5zYl9ic2l6ZTsKKwlzaXplID0gKGxibG9jayArIDEpICogYnNpemU7CisKKwlpZiAoc2l6ZSA+IGlwLT5pX2RpLmRpX3NpemUpIHsKKwkJaGVpZ2h0ID0gY2FsY190cmVlX2hlaWdodChpcCwgc2l6ZSk7CisJCWlmIChpcC0+aV9kaS5kaV9oZWlnaHQgPCBoZWlnaHQpIHsKKwkJCWlmICghY3JlYXRlKQorCQkJCWdvdG8gb3V0X29rOworCQorCQkJZXJyb3IgPSBidWlsZF9oZWlnaHQoaW5vZGUsIGhlaWdodCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCX0KKworCWZpbmRfbWV0YXBhdGgoaXAsIGxibG9jaywgJm1wKTsKKwllbmRfb2ZfbWV0YWRhdGEgPSBpcC0+aV9kaS5kaV9oZWlnaHQgLSAxOworCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmJoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwlmb3IgKHggPSAwOyB4IDwgZW5kX29mX21ldGFkYXRhOyB4KyspIHsKKwkJbG9va3VwX2Jsb2NrKGlwLCBiaCwgeCwgJm1wLCBjcmVhdGUsICZuZXcsICZkYmxvY2spOworCQlicmVsc2UoYmgpOworCQlpZiAoIWRibG9jaykKKwkJCWdvdG8gb3V0X29rOworCisJCWVycm9yID0gZ2ZzMl9tZXRhX2luZGlyZWN0X2J1ZmZlcihpcCwgeCsxLCBkYmxvY2ssIG5ldywgJmJoKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfZmFpbDsKKwl9CisKKwlib3VuZGFyeSA9IGxvb2t1cF9ibG9jayhpcCwgYmgsIGVuZF9vZl9tZXRhZGF0YSwgJm1wLCBjcmVhdGUsICZuZXcsICZkYmxvY2spOworCWlmIChkYmxvY2spIHsKKwkJbWFwX2JoKGJoX21hcCwgaW5vZGUtPmlfc2IsIGRibG9jayk7CisJCWlmIChib3VuZGFyeSkKKwkJCXNldF9idWZmZXJfYm91bmRhcnkoYmhfbWFwKTsKKwkJaWYgKG5ldykgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOworCQkJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CisJCQlpZiAoIWVycm9yKSB7CisJCQkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOworCQkJCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKKwkJCQlicmVsc2UoZGliaCk7CisJCQl9CisJCQlzZXRfYnVmZmVyX25ldyhiaF9tYXApOworCQkJZ290byBvdXRfYnJlbHNlOworCQl9CisJCXdoaWxlKC0tbWF4bGVuICYmICFidWZmZXJfYm91bmRhcnkoYmhfbWFwKSkgeworCQkJdTY0IGVibG9jazsKKworCQkJbXAubXBfbGlzdFtlbmRfb2ZfbWV0YWRhdGFdKys7CisJCQlib3VuZGFyeSA9IGxvb2t1cF9ibG9jayhpcCwgYmgsIGVuZF9vZl9tZXRhZGF0YSwgJm1wLCAwLCAmbmV3LCAmZWJsb2NrKTsKKwkJCWlmIChlYmxvY2sgIT0gKytkYmxvY2spCisJCQkJYnJlYWs7CisJCQliaF9tYXAtPmJfc2l6ZSArPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKKwkJCWlmIChib3VuZGFyeSkKKwkJCQlzZXRfYnVmZmVyX2JvdW5kYXJ5KGJoX21hcCk7CisJCX0KKwl9CitvdXRfYnJlbHNlOgorCWJyZWxzZShiaCk7CitvdXRfb2s6CisJZXJyb3IgPSAwOworb3V0X2ZhaWw6CiAJYm1hcF91bmxvY2soaW5vZGUsIGNyZWF0ZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIGludCBnZnMyX2V4dGVudF9tYXAoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGxibG9jaywgaW50ICpuZXcsIHU2NCAqZGJsb2NrLCB1bnNpZ25lZCAqZXh0bGVuKQogewotCXN0cnVjdCBtZXRhcGF0aCBtcDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmggPSB7IC5iX3N0YXRlID0gMCwgLmJfYmxvY2tuciA9IDAsIC5iX3NpemUgPSAwIH07CisJc3RydWN0IGJ1ZmZlcl9oZWFkIGJoID0geyAuYl9zdGF0ZSA9IDAsIC5iX2Jsb2NrbnIgPSAwIH07CiAJaW50IHJldDsKIAlpbnQgY3JlYXRlID0gKm5ldzsKIApAQCAtNTYzLDkgKzU1OSw4IEBACiAJQlVHX09OKCFkYmxvY2spOwogCUJVR19PTighbmV3KTsKIAotCWJtYXBfbG9jayhpbm9kZSwgY3JlYXRlKTsKLQlyZXQgPSBnZnMyX2Jsb2NrX3BvaW50ZXJzKGlub2RlLCBsYmxvY2ssIGNyZWF0ZSwgJmJoLCAmbXAsIDMyKTsKLQlibWFwX3VubG9jayhpbm9kZSwgY3JlYXRlKTsKKwliaC5iX3NpemUgPSAxIDw8IChpbm9kZS0+aV9ibGtiaXRzICsgNSk7CisJcmV0ID0gZ2ZzMl9ibG9ja19tYXAoaW5vZGUsIGxibG9jaywgY3JlYXRlLCAmYmgpOwogCSpleHRsZW4gPSBiaC5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKIAkqZGJsb2NrID0gYmguYl9ibG9ja25yOwogCWlmIChidWZmZXJfbmV3KCZiaCkpCkBAIC01OTksNyArNTk0LDcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQl1NjQgKnRvcCwgKmJvdHRvbTsKKwlfX2JlNjQgKnRvcCwgKmJvdHRvbTsKIAl1NjQgYm47CiAJaW50IGVycm9yOwogCWludCBtaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBnZnMyX21ldGFfaGVhZGVyKTsKQEAgLTYxMCwxNyArNjA1LDE3IEBACiAJCQlyZXR1cm4gZXJyb3I7CiAJCWRpYmggPSBiaDsKIAotCQl0b3AgPSAodTY0ICopKGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSkgKyBtcC0+bXBfbGlzdFswXTsKLQkJYm90dG9tID0gKHU2NCAqKShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpICsgc2RwLT5zZF9kaXB0cnM7CisJCXRvcCA9IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSArIG1wLT5tcF9saXN0WzBdOworCQlib3R0b20gPSAoX19iZTY0ICopKGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSkgKyBzZHAtPnNkX2RpcHRyczsKIAl9IGVsc2UgewogCQllcnJvciA9IGdmczJfbWV0YV9pbmRpcmVjdF9idWZmZXIoaXAsIGhlaWdodCwgYmxvY2ssIDAsICZiaCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKIAotCQl0b3AgPSAodTY0ICopKGJoLT5iX2RhdGEgKyBtaF9zaXplKSArCisJCXRvcCA9IChfX2JlNjQgKikoYmgtPmJfZGF0YSArIG1oX3NpemUpICsKIAkJCQkgIChmaXJzdCA/IG1wLT5tcF9saXN0W2hlaWdodF0gOiAwKTsKIAotCQlib3R0b20gPSAodTY0ICopKGJoLT5iX2RhdGEgKyBtaF9zaXplKSArIHNkcC0+c2RfaW5wdHJzOworCQlib3R0b20gPSAoX19iZTY0ICopKGJoLT5iX2RhdGEgKyBtaF9zaXplKSArIHNkcC0+c2RfaW5wdHJzOwogCX0KIAogCWVycm9yID0gYmMoaXAsIGRpYmgsIGJoLCB0b3AsIGJvdHRvbSwgaGVpZ2h0LCBkYXRhKTsKQEAgLTY1OSw3ICs2NTQsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgZG9fc3RyaXAoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpYmgsCi0JCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1NjQgKnRvcCwgdTY0ICpib3R0b20sCisJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBfX2JlNjQgKnRvcCwgX19iZTY0ICpib3R0b20sCiAJCSAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBzdHJpcF9taW5lICpzbSA9IGRhdGE7CkBAIC02NjcsNyArNjYyLDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3Qgcmxpc3Q7CiAJdTY0IGJuLCBic3RhcnQ7CiAJdTMyIGJsZW47Ci0JdTY0ICpwOworCV9fYmU2NCAqcDsKIAl1bnNpZ25lZCBpbnQgcmdfYmxvY2tzID0gMDsKIAlpbnQgbWV0YWRhdGE7CiAJdW5zaWduZWQgaW50IHJldm9rZXMgPSAwOwpAQCAtNzY5LDYgKzc2NCw3IEBACiAJCWlmICghaXAtPmlfZGkuZGlfYmxvY2tzKQogCQkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKIAkJaXAtPmlfZGkuZGlfYmxvY2tzLS07CisJCWdmczJfc2V0X2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUpOwogCX0KIAlpZiAoYnN0YXJ0KSB7CiAJCWlmIChtZXRhZGF0YSkKQEAgLTc3Nyw5ICs3NzMsOSBAQAogCQkJZ2ZzMl9mcmVlX2RhdGEoaXAsIGJzdGFydCwgYmxlbik7CiAJfQogCi0JaXAtPmlfZGkuZGlfbXRpbWUgPSBpcC0+aV9kaS5kaV9jdGltZSA9IGdldF9zZWNvbmRzKCk7CisJaXAtPmlfaW5vZGUuaV9tdGltZS50dl9zZWMgPSBpcC0+aV9pbm9kZS5pX2N0aW1lLnR2X3NlYyA9IGdldF9zZWNvbmRzKCk7CiAKLQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAogCXVwX3dyaXRlKCZpcC0+aV9yd19tdXRleCk7CiAKQEAgLTgxOCw3ICs4MTQsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKLQllcnJvciA9IGdmczJfcXVvdGFfY2hlY2soaXAsIGlwLT5pX2RpLmRpX3VpZCwgaXAtPmlfZGkuZGlfZ2lkKTsKKwllcnJvciA9IGdmczJfcXVvdGFfY2hlY2soaXAsIGlwLT5pX2lub2RlLmlfdWlkLCBpcC0+aV9pbm9kZS5pX2dpZCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9ndW5sb2NrX3E7CiAKQEAgLTg1MiwxNCArODQ4LDE0IEBACiAJfQogCiAJaXAtPmlfZGkuZGlfc2l6ZSA9IHNpemU7Ci0JaXAtPmlfZGkuZGlfbXRpbWUgPSBpcC0+aV9kaS5kaV9jdGltZSA9IGdldF9zZWNvbmRzKCk7CisJaXAtPmlfaW5vZGUuaV9tdGltZS50dl9zZWMgPSBpcC0+aV9pbm9kZS5pX2N0aW1lLnR2X3NlYyA9IGdldF9zZWNvbmRzKCk7CiAKIAllcnJvciA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZkaWJoKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2VuZF90cmFuczsKIAogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAlicmVsc2UoZGliaCk7CiAKIG91dF9lbmRfdHJhbnM6CkBAIC05NjcsOSArOTYzLDkgQEAKIAogCWlmIChnZnMyX2lzX3N0dWZmZWQoaXApKSB7CiAJCWlwLT5pX2RpLmRpX3NpemUgPSBzaXplOwotCQlpcC0+aV9kaS5kaV9tdGltZSA9IGlwLT5pX2RpLmRpX2N0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwkJaXAtPmlfaW5vZGUuaV9tdGltZS50dl9zZWMgPSBpcC0+aV9pbm9kZS5pX2N0aW1lLnR2X3NlYyA9IGdldF9zZWNvbmRzKCk7CiAJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQkJZ2ZzMl9kaW5vZGVfb3V0KCZpcC0+aV9kaSwgZGliaC0+Yl9kYXRhKTsKKwkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwogCQlnZnMyX2J1ZmZlcl9jbGVhcl90YWlsKGRpYmgsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpICsgc2l6ZSk7CiAJCWVycm9yID0gMTsKIApAQCAtOTc5LDEwICs5NzUsMTAgQEAKIAogCQlpZiAoIWVycm9yKSB7CiAJCQlpcC0+aV9kaS5kaV9zaXplID0gc2l6ZTsKLQkJCWlwLT5pX2RpLmRpX210aW1lID0gaXAtPmlfZGkuZGlfY3RpbWUgPSBnZXRfc2Vjb25kcygpOworCQkJaXAtPmlfaW5vZGUuaV9tdGltZS50dl9zZWMgPSBpcC0+aV9pbm9kZS5pX2N0aW1lLnR2X3NlYyA9IGdldF9zZWNvbmRzKCk7CiAJCQlpcC0+aV9kaS5kaV9mbGFncyB8PSBHRlMyX0RJRl9UUlVOQ19JTl9QUk9HOwogCQkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwotCQkJZ2ZzMl9kaW5vZGVfb3V0KCZpcC0+aV9kaSwgZGliaC0+Yl9kYXRhKTsKKwkJCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAkJfQogCX0KIApAQCAtMTA1MiwxMSArMTA0OCwxMSBAQAogCQkJaXAtPmlfbnVtLm5vX2FkZHI7CiAJCWdmczJfYnVmZmVyX2NsZWFyX3RhaWwoZGliaCwgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpOwogCX0KLQlpcC0+aV9kaS5kaV9tdGltZSA9IGlwLT5pX2RpLmRpX2N0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlpcC0+aV9pbm9kZS5pX210aW1lLnR2X3NlYyA9IGlwLT5pX2lub2RlLmlfY3RpbWUudHZfc2VjID0gZ2V0X3NlY29uZHMoKTsKIAlpcC0+aV9kaS5kaV9mbGFncyAmPSB+R0ZTMl9ESUZfVFJVTkNfSU5fUFJPRzsKIAogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAlicmVsc2UoZGliaCk7CiAKIG91dDoKQEAgLTExMDgsNyArMTEwNCw3IEBACiB7CiAJaW50IGVycm9yOwogCi0JaWYgKGdmczJfYXNzZXJ0X3dhcm4oR0ZTMl9TQigmaXAtPmlfaW5vZGUpLCBTX0lTUkVHKGlwLT5pX2RpLmRpX21vZGUpKSkKKwlpZiAoZ2ZzMl9hc3NlcnRfd2FybihHRlMyX1NCKCZpcC0+aV9pbm9kZSksIFNfSVNSRUcoaXAtPmlfaW5vZGUuaV9tb2RlKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHNpemUgPiBpcC0+aV9kaS5kaV9zaXplKQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9ibWFwLmggYi9mcy9nZnMyL2JtYXAuaAppbmRleCAwZmQzNzliLi5hYzJmZDA0IDEwMDY0NAotLS0gYS9mcy9nZnMyL2JtYXAuaAorKysgYi9mcy9nZnMyL2JtYXAuaApAQCAtMTUsNyArMTUsNyBAQAogc3RydWN0IHBhZ2U7CiAKIGludCBnZnMyX3Vuc3R1ZmZfZGlub2RlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IHBhZ2UgKnBhZ2UpOwotaW50IGdmczJfYmxvY2tfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBsYmxvY2ssIGludCBjcmVhdGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHVuc2lnbmVkIGludCBtYXhsZW4pOworaW50IGdmczJfYmxvY2tfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBsYmxvY2ssIGludCBjcmVhdGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogaW50IGdmczJfZXh0ZW50X21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbGJsb2NrLCBpbnQgKm5ldywgdTY0ICpkYmxvY2ssIHVuc2lnbmVkICpleHRsZW4pOwogCiBpbnQgZ2ZzMl90cnVuY2F0ZWkoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgc2l6ZSk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2RhZW1vbi5jIGIvZnMvZ2ZzMi9kYWVtb24uYwppbmRleCBjYWIxZjY4Li42ODNjYjViIDEwMDY0NAotLS0gYS9mcy9nZnMyL2RhZW1vbi5jCisrKyBiL2ZzL2dmczIvZGFlbW9uLmMKQEAgLTExMiw2ICsxMTIsNyBAQAogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZGF0YTsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgamlfZ2g7CiAJdW5zaWduZWQgbG9uZyB0OworCWludCBuZWVkX2ZsdXNoOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJLyogQWR2YW5jZSB0aGUgbG9nIHRhaWwgKi8KQEAgLTEyMCw4ICsxMjEsMTAgQEAKIAkJICAgIGdmczJfdHVuZV9nZXQoc2RwLCBndF9sb2dfZmx1c2hfc2VjcykgKiBIWjsKIAogCQlnZnMyX2FpbDFfZW1wdHkoc2RwLCBESU9fQUxMKTsKLQotCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0KSkgeworCQlnZnMyX2xvZ19sb2NrKHNkcCk7CisJCW5lZWRfZmx1c2ggPSBzZHAtPnNkX2xvZ19udW1fYnVmID4gZ2ZzMl90dW5lX2dldChzZHAsIGd0X2luY29yZV9sb2dfYmxvY2tzKTsKKwkJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7CisJCWlmIChuZWVkX2ZsdXNoIHx8IHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdCkpIHsKIAkJCWdmczJfbG9nX2ZsdXNoKHNkcCwgTlVMTCk7CiAJCQlzZHAtPnNkX2xvZ19mbHVzaF90aW1lID0gamlmZmllczsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kaXIuYyBiL2ZzL2dmczIvZGlyLmMKaW5kZXggNDU5NDk4Yy4uMGZkY2I3NyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuYworKysgYi9mcy9nZnMyL2Rpci5jCkBAIC0xMzEsOCArMTMxLDggQEAKIAltZW1jcHkoZGliaC0+Yl9kYXRhICsgb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSksIGJ1Ziwgc2l6ZSk7CiAJaWYgKGlwLT5pX2RpLmRpX3NpemUgPCBvZmZzZXQgKyBzaXplKQogCQlpcC0+aV9kaS5kaV9zaXplID0gb2Zmc2V0ICsgc2l6ZTsKLQlpcC0+aV9kaS5kaV9tdGltZSA9IGlwLT5pX2RpLmRpX2N0aW1lID0gZ2V0X3NlY29uZHMoKTsKLQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCWlwLT5pX2lub2RlLmlfbXRpbWUudHZfc2VjID0gaXAtPmlfaW5vZGUuaV9jdGltZS50dl9zZWMgPSBnZXRfc2Vjb25kcygpOworCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAogCWJyZWxzZShkaWJoKTsKIApAQCAtMTg0LDcgKzE4NCw3IEBACiAJd2hpbGUgKGNvcGllZCA8IHNpemUpIHsKIAkJdW5zaWduZWQgaW50IGFtb3VudDsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQkJaW50IG5ldzsKKwkJaW50IG5ldyA9IDA7CiAKIAkJYW1vdW50ID0gc2l6ZSAtIGNvcGllZDsKIAkJaWYgKGFtb3VudCA+IHNkcC0+c2Rfc2Iuc2JfYnNpemUgLSBvKQpAQCAtMjEyLDggKzIxMiw2IEBACiAJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMSk7CiAJCW1lbWNweShiaC0+Yl9kYXRhICsgbywgYnVmLCBhbW91bnQpOwogCQlicmVsc2UoYmgpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGZhaWw7CiAKIAkJYnVmICs9IGFtb3VudDsKIAkJY29waWVkICs9IGFtb3VudDsKQEAgLTIzMSwxMCArMjI5LDEwIEBACiAKIAlpZiAoaXAtPmlfZGkuZGlfc2l6ZSA8IG9mZnNldCArIGNvcGllZCkKIAkJaXAtPmlfZGkuZGlfc2l6ZSA9IG9mZnNldCArIGNvcGllZDsKLQlpcC0+aV9kaS5kaV9tdGltZSA9IGlwLT5pX2RpLmRpX2N0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlpcC0+aV9pbm9kZS5pX210aW1lLnR2X3NlYyA9IGlwLT5pX2lub2RlLmlfY3RpbWUudHZfc2VjID0gZ2V0X3NlY29uZHMoKTsKIAogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAlicmVsc2UoZGliaCk7CiAKIAlyZXR1cm4gY29waWVkOwpAQCAtMzE3LDggKzMxNSw3IEBACiAJCQlpZiAoIXJhKQogCQkJCWV4dGxlbiA9IDE7CiAJCQliaCA9IGdmczJfbWV0YV9yYShpcC0+aV9nbCwgZGJsb2NrLCBleHRsZW4pOwotCQl9Ci0JCWlmICghYmgpIHsKKwkJfSBlbHNlIHsKIAkJCWVycm9yID0gZ2ZzMl9tZXRhX3JlYWQoaXAtPmlfZ2wsIGRibG9jaywgRElPX1dBSVQsICZiaCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBmYWlsOwpAQCAtMzMyLDcgKzMyOSw2IEBACiAJCWV4dGxlbi0tOwogCQltZW1jcHkoYnVmLCBiaC0+Yl9kYXRhICsgbywgYW1vdW50KTsKIAkJYnJlbHNlKGJoKTsKLQkJYmggPSBOVUxMOwogCQlidWYgKz0gYW1vdW50OwogCQljb3BpZWQgKz0gYW1vdW50OwogCQlsYmxvY2srKzsKQEAgLTM0NCwxMCArMzQwLDE1IEBACiAJcmV0dXJuIChjb3BpZWQpID8gY29waWVkIDogZXJyb3I7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGdmczJfZGlyZW50X3NlbnRpbmVsKGNvbnN0IHN0cnVjdCBnZnMyX2RpcmVudCAqZGVudCkKK3sKKwlyZXR1cm4gZGVudC0+ZGVfaW51bS5ub19hZGRyID09IDAgfHwgZGVudC0+ZGVfaW51bS5ub19mb3JtYWxfaW5vID09IDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IF9fZ2ZzMl9kaXJlbnRfZmluZChjb25zdCBzdHJ1Y3QgZ2ZzMl9kaXJlbnQgKmRlbnQsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgaW50IHJldCkKIHsKLQlpZiAoZGVudC0+ZGVfaW51bS5ub19hZGRyICE9IDAgJiYKKwlpZiAoIWdmczJfZGlyZW50X3NlbnRpbmVsKGRlbnQpICYmCiAJICAgIGJlMzJfdG9fY3B1KGRlbnQtPmRlX2hhc2gpID09IG5hbWUtPmhhc2ggJiYKIAkgICAgYmUxNl90b19jcHUoZGVudC0+ZGVfbmFtZV9sZW4pID09IG5hbWUtPmxlbiAmJgogCSAgICBtZW1jbXAoZGVudCsxLCBuYW1lLT5uYW1lLCBuYW1lLT5sZW4pID09IDApCkBAIC0zOTIsNyArMzkzLDcgQEAKIAl1bnNpZ25lZCBhY3R1YWwgPSBHRlMyX0RJUkVOVF9TSVpFKGJlMTZfdG9fY3B1KGRlbnQtPmRlX25hbWVfbGVuKSk7CiAJdW5zaWduZWQgdG90bGVuID0gYmUxNl90b19jcHUoZGVudC0+ZGVfcmVjX2xlbik7CiAKLQlpZiAoIWRlbnQtPmRlX2ludW0ubm9fYWRkcikKKwlpZiAoZ2ZzMl9kaXJlbnRfc2VudGluZWwoZGVudCkpCiAJCWFjdHVhbCA9IEdGUzJfRElSRU5UX1NJWkUoMCk7CiAJaWYgKHRvdGxlbiAtIGFjdHVhbCA+PSByZXF1aXJlZCkKIAkJcmV0dXJuIDE7CkBAIC00MDksNyArNDEwLDcgQEAKIAkJCSAgICAgIHZvaWQgKm9wYXF1ZSkKIHsKIAlzdHJ1Y3QgZGlyZW50X2dhdGhlciAqZyA9IG9wYXF1ZTsKLQlpZiAoZGVudC0+ZGVfaW51bS5ub19hZGRyKSB7CisJaWYgKCFnZnMyX2RpcmVudF9zZW50aW5lbChkZW50KSkgewogCQlnLT5wZGVudFtnLT5vZmZzZXQrK10gPSBkZW50OwogCX0KIAlyZXR1cm4gMDsKQEAgLTQzNywxMCArNDM4LDEwIEBACiAJaWYgKHVubGlrZWx5KG9mZnNldCArIHNpemUgPiBsZW4pKQogCQlnb3RvIGVycm9yOwogCW1zZyA9ICJ6ZXJvIGlub2RlIG51bWJlciI7Ci0JaWYgKHVubGlrZWx5KCFmaXJzdCAmJiAhZGVudC0+ZGVfaW51bS5ub19hZGRyKSkKKwlpZiAodW5saWtlbHkoIWZpcnN0ICYmIGdmczJfZGlyZW50X3NlbnRpbmVsKGRlbnQpKSkKIAkJZ290byBlcnJvcjsKIAltc2cgPSAibmFtZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHNwYWNlIGluIGRpcmVudCI7Ci0JaWYgKGRlbnQtPmRlX2ludW0ubm9fYWRkciAmJgorCWlmICghZ2ZzMl9kaXJlbnRfc2VudGluZWwoZGVudCkgJiYKIAkgICAgdW5saWtlbHkoc2l6ZW9mKHN0cnVjdCBnZnMyX2RpcmVudCkrYmUxNl90b19jcHUoZGVudC0+ZGVfbmFtZV9sZW4pID4KIAkJICAgICBzaXplKSkKIAkJZ290byBlcnJvcjsKQEAgLTYwMiw3ICs2MDMsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAgICAgICAgIC8qIE9ubHkgdGhlIGZpcnN0IGRlbnQgY291bGQgZXZlciBoYXZlIGRlX2ludW0ubm9fYWRkciA9PSAwICovCi0JaWYgKCF0bXAtPmRlX2ludW0ubm9fYWRkcikgeworCWlmIChnZnMyX2RpcmVudF9zZW50aW5lbCh0bXApKSB7CiAJCWdmczJfY29uc2lzdF9pbm9kZShkaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC02MjUsNyArNjI2LDcgQEAKIHsKIAl1MTYgY3VyX3JlY19sZW4sIHByZXZfcmVjX2xlbjsKIAotCWlmICghY3VyLT5kZV9pbnVtLm5vX2FkZHIpIHsKKwlpZiAoZ2ZzMl9kaXJlbnRfc2VudGluZWwoY3VyKSkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKIAkJcmV0dXJuOwogCX0KQEAgLTYzNyw3ICs2MzgsOCBAQAogCSAgIG91dCB0aGUgaW5vZGUgbnVtYmVyIGFuZCByZXR1cm4uICAqLwogCiAJaWYgKCFwcmV2KSB7Ci0JCWN1ci0+ZGVfaW51bS5ub19hZGRyID0gMDsJLyogTm8gZW5kaWFuZXNzIHdvcnJpZXMgKi8KKwkJY3VyLT5kZV9pbnVtLm5vX2FkZHIgPSAwOworCQljdXItPmRlX2ludW0ubm9fZm9ybWFsX2lubyA9IDA7CiAJCXJldHVybjsKIAl9CiAKQEAgLTY2OCw3ICs2NzAsNyBAQAogCXN0cnVjdCBnZnMyX2RpcmVudCAqbmRlbnQ7CiAJdW5zaWduZWQgb2Zmc2V0ID0gMCwgdG90bGVuOwogCi0JaWYgKGRlbnQtPmRlX2ludW0ubm9fYWRkcikKKwlpZiAoIWdmczJfZGlyZW50X3NlbnRpbmVsKGRlbnQpKQogCQlvZmZzZXQgPSBHRlMyX0RJUkVOVF9TSVpFKGJlMTZfdG9fY3B1KGRlbnQtPmRlX25hbWVfbGVuKSk7CiAJdG90bGVuID0gYmUxNl90b19jcHUoZGVudC0+ZGVfcmVjX2xlbik7CiAJQlVHX09OKG9mZnNldCArIG5hbWUtPmxlbiA+IHRvdGxlbik7CkBAIC03MTcsMTIgKzcxOSwxMiBAQAogc3RhdGljIGludCBnZXRfbGVhZl9ucihzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwLCB1MzIgaW5kZXgsCiAJCSAgICAgICB1NjQgKmxlYWZfb3V0KQogewotCXU2NCBsZWFmX25vOworCV9fYmU2NCBsZWFmX25vOwogCWludCBlcnJvcjsKIAogCWVycm9yID0gZ2ZzMl9kaXJfcmVhZF9kYXRhKGRpcCwgKGNoYXIgKikmbGVhZl9ubywKLQkJCQkgICAgaW5kZXggKiBzaXplb2YodTY0KSwKLQkJCQkgICAgc2l6ZW9mKHU2NCksIDApOworCQkJCSAgICBpbmRleCAqIHNpemVvZihfX2JlNjQpLAorCQkJCSAgICBzaXplb2YoX19iZTY0KSwgMCk7CiAJaWYgKGVycm9yICE9IHNpemVvZih1NjQpKQogCQlyZXR1cm4gKGVycm9yIDwgMCkgPyBlcnJvciA6IC1FSU87CiAKQEAgLTgxNSw3ICs4MTcsNyBAQAogCWxlYWYgPSAoc3RydWN0IGdmczJfbGVhZiAqKWJoLT5iX2RhdGE7CiAJbGVhZi0+bGZfZGVwdGggPSBjcHVfdG9fYmUxNihkZXB0aCk7CiAJbGVhZi0+bGZfZW50cmllcyA9IDA7Ci0JbGVhZi0+bGZfZGlyZW50X2Zvcm1hdCA9IGNwdV90b19iZTE2KEdGUzJfRk9STUFUX0RFKTsKKwlsZWFmLT5sZl9kaXJlbnRfZm9ybWF0ID0gY3B1X3RvX2JlMzIoR0ZTMl9GT1JNQVRfREUpOwogCWxlYWYtPmxmX25leHQgPSAwOwogCW1lbXNldChsZWFmLT5sZl9yZXNlcnZlZCwgMCwgc2l6ZW9mKGxlYWYtPmxmX3Jlc2VydmVkKSk7CiAJZGVudCA9IChzdHJ1Y3QgZ2ZzMl9kaXJlbnQgKikobGVhZisxKTsKQEAgLTg0MSw3ICs4NDMsOCBAQAogCXN0cnVjdCBnZnMyX2xlYWYgKmxlYWY7CiAJaW50IHk7CiAJdTMyIHg7Ci0JdTY0ICpscCwgYm47CisJX19iZTY0ICpscDsKKwl1NjQgYm47CiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGRpcCwgJmRpYmgpOwpAQCAtODk3LDIwICs5MDAsMjAgQEAKIAlnZnMyX3RyYW5zX2FkZF9iaChkaXAtPmlfZ2wsIGRpYmgsIDEpOwogCWdmczJfYnVmZmVyX2NsZWFyX3RhaWwoZGliaCwgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpOwogCi0JbHAgPSAodTY0ICopKGRpYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKTsKKwlscCA9IChfX2JlNjQgKikoZGliaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSkpOwogCiAJZm9yICh4ID0gc2RwLT5zZF9oYXNoX3B0cnM7IHgtLTsgbHArKykKIAkJKmxwID0gY3B1X3RvX2JlNjQoYm4pOwogCiAJZGlwLT5pX2RpLmRpX3NpemUgPSBzZHAtPnNkX3NiLnNiX2JzaXplIC8gMjsKIAlkaXAtPmlfZGkuZGlfYmxvY2tzKys7CisJZ2ZzMl9zZXRfaW5vZGVfYmxvY2tzKCZkaXAtPmlfaW5vZGUpOwogCWRpcC0+aV9kaS5kaV9mbGFncyB8PSBHRlMyX0RJRl9FWEhBU0g7Ci0JZGlwLT5pX2RpLmRpX3BheWxvYWRfZm9ybWF0ID0gMDsKIAogCWZvciAoeCA9IHNkcC0+c2RfaGFzaF9wdHJzLCB5ID0gLTE7IHg7IHggPj49IDEsIHkrKykgOwogCWRpcC0+aV9kaS5kaV9kZXB0aCA9IHk7CiAKLQlnZnMyX2Rpbm9kZV9vdXQoJmRpcC0+aV9kaSwgZGliaC0+Yl9kYXRhKTsKKwlnZnMyX2Rpbm9kZV9vdXQoZGlwLCBkaWJoLT5iX2RhdGEpOwogCiAJYnJlbHNlKGRpYmgpOwogCkBAIC05MzMsNyArOTM2LDggQEAKIAlzdHJ1Y3QgZ2ZzMl9sZWFmICpubGVhZiwgKm9sZWFmOwogCXN0cnVjdCBnZnMyX2RpcmVudCAqZGVudCA9IE5VTEwsICpwcmV2ID0gTlVMTCwgKm5leHQgPSBOVUxMLCAqbmV3OwogCXUzMiBzdGFydCwgbGVuLCBoYWxmX2xlbiwgZGl2aWRlcjsKLQl1NjQgYm4sICpscCwgbGVhZl9ubzsKKwl1NjQgYm4sIGxlYWZfbm87CisJX19iZTY0ICpscDsKIAl1MzIgaW5kZXg7CiAJaW50IHgsIG1vdmVkID0gMDsKIAlpbnQgZXJyb3I7CkBAIC05NzgsNyArOTgyLDcgQEAKIAkvKiBDaGFuZ2UgdGhlIHBvaW50ZXJzLgogCSAgIERvbid0IGJvdGhlciBkaXN0aW5ndWlzaGluZyBzdHVmZmVkIGZyb20gbm9uLXN0dWZmZWQuCiAJICAgVGhpcyBjb2RlIGlzIGNvbXBsaWNhdGVkIGVub3VnaCBhbHJlYWR5LiAqLwotCWxwID0ga21hbGxvYyhoYWxmX2xlbiAqIHNpemVvZih1NjQpLCBHRlBfTk9GUyB8IF9fR0ZQX05PRkFJTCk7CisJbHAgPSBrbWFsbG9jKGhhbGZfbGVuICogc2l6ZW9mKF9fYmU2NCksIEdGUF9OT0ZTIHwgX19HRlBfTk9GQUlMKTsKIAkvKiAgQ2hhbmdlIHRoZSBwb2ludGVycyAgKi8KIAlmb3IgKHggPSAwOyB4IDwgaGFsZl9sZW47IHgrKykKIAkJbHBbeF0gPSBjcHVfdG9fYmU2NChibik7CkBAIC0xMDA0LDcgKzEwMDgsNyBAQAogCQlpZiAoZGlyZW50X25leHQoZGlwLCBvYmgsICZuZXh0KSkKIAkJCW5leHQgPSBOVUxMOwogCi0JCWlmIChkZW50LT5kZV9pbnVtLm5vX2FkZHIgJiYKKwkJaWYgKCFnZnMyX2RpcmVudF9zZW50aW5lbChkZW50KSAmJgogCQkgICAgYmUzMl90b19jcHUoZGVudC0+ZGVfaGFzaCkgPCBkaXZpZGVyKSB7CiAJCQlzdHJ1Y3QgcXN0ciBzdHI7CiAJCQlzdHIubmFtZSA9IChjaGFyKikoZGVudCsxKTsKQEAgLTEwNDEsNyArMTA0NSw4IEBACiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGRpcCwgJmRpYmgpOwogCWlmICghZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoR0ZTMl9TQigmZGlwLT5pX2lub2RlKSwgIWVycm9yKSkgewogCQlkaXAtPmlfZGkuZGlfYmxvY2tzKys7Ci0JCWdmczJfZGlub2RlX291dCgmZGlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCQlnZnMyX3NldF9pbm9kZV9ibG9ja3MoJmRpcC0+aV9pbm9kZSk7CisJCWdmczJfZGlub2RlX291dChkaXAsIGRpYmgtPmJfZGF0YSk7CiAJCWJyZWxzZShkaWJoKTsKIAl9CiAKQEAgLTExMjEsNyArMTEyNiw3IEBACiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGRpcCwgJmRpYmgpOwogCWlmICghZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCAhZXJyb3IpKSB7CiAJCWRpcC0+aV9kaS5kaV9kZXB0aCsrOwotCQlnZnMyX2Rpbm9kZV9vdXQoJmRpcC0+aV9kaSwgZGliaC0+Yl9kYXRhKTsKKwkJZ2ZzMl9kaW5vZGVfb3V0KGRpcCwgZGliaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGRpYmgpOwogCX0KIApAQCAtMTE5OCw3ICsxMjAzLDcgQEAKIAkJCSAgIGludCAqY29waWVkKQogewogCWNvbnN0IHN0cnVjdCBnZnMyX2RpcmVudCAqZGVudCwgKmRlbnRfbmV4dDsKLQlzdHJ1Y3QgZ2ZzMl9pbnVtIGludW07CisJc3RydWN0IGdmczJfaW51bV9ob3N0IGludW07CiAJdTY0IG9mZiwgb2ZmX25leHQ7CiAJdW5zaWduZWQgaW50IHgsIHk7CiAJaW50IHJ1biA9IDA7CkBAIC0xMzQ1LDcgKzEzNTAsNyBAQAogCXUzMiBoc2l6ZSwgbGVuID0gMDsKIAl1MzIgaHRfb2Zmc2V0LCBscF9vZmZzZXQsIGh0X29mZnNldF9jdXIgPSAtMTsKIAl1MzIgaGFzaCwgaW5kZXg7Ci0JdTY0ICpscDsKKwlfX2JlNjQgKmxwOwogCWludCBjb3BpZWQgPSAwOwogCWludCBlcnJvciA9IDA7CiAJdW5zaWduZWQgZGVwdGggPSAwOwpAQCAtMTM2OSw3ICsxMzc0LDcgQEAKIAogCQlpZiAoaHRfb2Zmc2V0X2N1ciAhPSBodF9vZmZzZXQpIHsKIAkJCWVycm9yID0gZ2ZzMl9kaXJfcmVhZF9kYXRhKGRpcCwgKGNoYXIgKilscCwKLQkJCQkJCWh0X29mZnNldCAqIHNpemVvZih1NjQpLAorCQkJCQkJaHRfb2Zmc2V0ICogc2l6ZW9mKF9fYmU2NCksCiAJCQkJCQlzZHAtPnNkX2hhc2hfYnNpemUsIDEpOwogCQkJaWYgKGVycm9yICE9IHNkcC0+c2RfaGFzaF9ic2l6ZSkgewogCQkJCWlmIChlcnJvciA+PSAwKQpAQCAtMTQ2MCw3ICsxNDY1LDcgQEAKICAqLwogCiBpbnQgZ2ZzMl9kaXJfc2VhcmNoKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKLQkJICAgIHN0cnVjdCBnZnMyX2ludW0gKmludW0sIHVuc2lnbmVkIGludCAqdHlwZSkKKwkJICAgIHN0cnVjdCBnZnMyX2ludW1faG9zdCAqaW51bSwgdW5zaWduZWQgaW50ICp0eXBlKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGdmczJfZGlyZW50ICpkZW50OwpAQCAtMTUxOSw3ICsxNTI0LDggQEAKIAkJcmV0dXJuIGVycm9yOwogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMSk7CiAJaXAtPmlfZGkuZGlfYmxvY2tzKys7Ci0JZ2ZzMl9kaW5vZGVfb3V0KCZpcC0+aV9kaSwgYmgtPmJfZGF0YSk7CisJZ2ZzMl9zZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSk7CisJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBiaC0+Yl9kYXRhKTsKIAlicmVsc2UoYmgpOwogCXJldHVybiAwOwogfQpAQCAtMTUzNSw3ICsxNTQxLDcgQEAKICAqLwogCiBpbnQgZ2ZzMl9kaXJfYWRkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLAotCQkgY29uc3Qgc3RydWN0IGdmczJfaW51bSAqaW51bSwgdW5zaWduZWQgdHlwZSkKKwkJIGNvbnN0IHN0cnVjdCBnZnMyX2ludW1faG9zdCAqaW51bSwgdW5zaWduZWQgdHlwZSkKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CkBAIC0xNTYyLDggKzE1NjgsOCBAQAogCQkJCWJyZWFrOwogCQkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGJoLCAxKTsKIAkJCWlwLT5pX2RpLmRpX2VudHJpZXMrKzsKLQkJCWlwLT5pX2RpLmRpX210aW1lID0gaXAtPmlfZGkuZGlfY3RpbWUgPSBnZXRfc2Vjb25kcygpOwotCQkJZ2ZzMl9kaW5vZGVfb3V0KCZpcC0+aV9kaSwgYmgtPmJfZGF0YSk7CisJCQlpcC0+aV9pbm9kZS5pX210aW1lLnR2X3NlYyA9IGlwLT5pX2lub2RlLmlfY3RpbWUudHZfc2VjID0gZ2V0X3NlY29uZHMoKTsKKwkJCWdmczJfZGlub2RlX291dChpcCwgYmgtPmJfZGF0YSk7CiAJCQlicmVsc2UoYmgpOwogCQkJZXJyb3IgPSAwOwogCQkJYnJlYWs7CkBAIC0xNjQ4LDggKzE2NTQsOCBAQAogCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKIAlnZnMyX3RyYW5zX2FkZF9iaChkaXAtPmlfZ2wsIGJoLCAxKTsKIAlkaXAtPmlfZGkuZGlfZW50cmllcy0tOwotCWRpcC0+aV9kaS5kaV9tdGltZSA9IGRpcC0+aV9kaS5kaV9jdGltZSA9IGdldF9zZWNvbmRzKCk7Ci0JZ2ZzMl9kaW5vZGVfb3V0KCZkaXAtPmlfZGksIGJoLT5iX2RhdGEpOworCWRpcC0+aV9pbm9kZS5pX210aW1lLnR2X3NlYyA9IGRpcC0+aV9pbm9kZS5pX2N0aW1lLnR2X3NlYyA9IGdldF9zZWNvbmRzKCk7CisJZ2ZzMl9kaW5vZGVfb3V0KGRpcCwgYmgtPmJfZGF0YSk7CiAJYnJlbHNlKGJoKTsKIAltYXJrX2lub2RlX2RpcnR5KCZkaXAtPmlfaW5vZGUpOwogCkBAIC0xNjcwLDcgKzE2NzYsNyBAQAogICovCiAKIGludCBnZnMyX2Rpcl9tdmlubyhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwLCBjb25zdCBzdHJ1Y3QgcXN0ciAqZmlsZW5hbWUsCi0JCSAgIHN0cnVjdCBnZnMyX2ludW0gKmludW0sIHVuc2lnbmVkIGludCBuZXdfdHlwZSkKKwkJICAgc3RydWN0IGdmczJfaW51bV9ob3N0ICppbnVtLCB1bnNpZ25lZCBpbnQgbmV3X3R5cGUpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZ2ZzMl9kaXJlbnQgKmRlbnQ7CkBAIC0xNjk2LDggKzE3MDIsOCBAQAogCQlnZnMyX3RyYW5zX2FkZF9iaChkaXAtPmlfZ2wsIGJoLCAxKTsKIAl9CiAKLQlkaXAtPmlfZGkuZGlfbXRpbWUgPSBkaXAtPmlfZGkuZGlfY3RpbWUgPSBnZXRfc2Vjb25kcygpOwotCWdmczJfZGlub2RlX291dCgmZGlwLT5pX2RpLCBiaC0+Yl9kYXRhKTsKKwlkaXAtPmlfaW5vZGUuaV9tdGltZS50dl9zZWMgPSBkaXAtPmlfaW5vZGUuaV9jdGltZS50dl9zZWMgPSBnZXRfc2Vjb25kcygpOworCWdmczJfZGlub2RlX291dChkaXAsIGJoLT5iX2RhdGEpOwogCWJyZWxzZShiaCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzE5LDcgKzE3MjUsNyBAQAogCXUzMiBoc2l6ZSwgbGVuOwogCXUzMiBodF9vZmZzZXQsIGxwX29mZnNldCwgaHRfb2Zmc2V0X2N1ciA9IC0xOwogCXUzMiBpbmRleCA9IDA7Ci0JdTY0ICpscDsKKwlfX2JlNjQgKmxwOwogCXU2NCBsZWFmX25vOwogCWludCBlcnJvciA9IDA7CiAKQEAgLTE3MzksNyArMTc0NSw3IEBACiAKIAkJaWYgKGh0X29mZnNldF9jdXIgIT0gaHRfb2Zmc2V0KSB7CiAJCQllcnJvciA9IGdmczJfZGlyX3JlYWRfZGF0YShkaXAsIChjaGFyICopbHAsCi0JCQkJCQlodF9vZmZzZXQgKiBzaXplb2YodTY0KSwKKwkJCQkJCWh0X29mZnNldCAqIHNpemVvZihfX2JlNjQpLAogCQkJCQkJc2RwLT5zZF9oYXNoX2JzaXplLCAxKTsKIAkJCWlmIChlcnJvciAhPSBzZHAtPnNkX2hhc2hfYnNpemUpIHsKIAkJCQlpZiAoZXJyb3IgPj0gMCkKQEAgLTE4NjMsNiArMTg2OSw3IEBACiAJCWlmICghZGlwLT5pX2RpLmRpX2Jsb2NrcykKIAkJCWdmczJfY29uc2lzdF9pbm9kZShkaXApOwogCQlkaXAtPmlfZGkuZGlfYmxvY2tzLS07CisJCWdmczJfc2V0X2lub2RlX2Jsb2NrcygmZGlwLT5pX2lub2RlKTsKIAl9CiAKIAllcnJvciA9IGdmczJfZGlyX3dyaXRlX2RhdGEoZGlwLCBodCwgaW5kZXggKiBzaXplb2YodTY0KSwgc2l6ZSk7CkBAIC0xODc3LDcgKzE4ODQsNyBAQAogCQlnb3RvIG91dF9lbmRfdHJhbnM7CiAKIAlnZnMyX3RyYW5zX2FkZF9iaChkaXAtPmlfZ2wsIGRpYmgsIDEpOwotCWdmczJfZGlub2RlX291dCgmZGlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCWdmczJfZGlub2RlX291dChkaXAsIGRpYmgtPmJfZGF0YSk7CiAJYnJlbHNlKGRpYmgpOwogCiBvdXRfZW5kX3RyYW5zOgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kaXIuaCBiL2ZzL2dmczIvZGlyLmgKaW5kZXggMzcxMjMzNC4uYjIxYjMzNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuaAorKysgYi9mcy9nZnMyL2Rpci5oCkBAIC0zMSwxNyArMzEsMTcgQEAKIHR5cGVkZWYgaW50ICgqZ2ZzMl9maWxsZGlyX3QpICh2b2lkICpvcGFxdWUsCiAJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAogCQkJICAgICAgdTY0IG9mZnNldCwKLQkJCSAgICAgIHN0cnVjdCBnZnMyX2ludW0gKmludW0sIHVuc2lnbmVkIGludCB0eXBlKTsKKwkJCSAgICAgIHN0cnVjdCBnZnMyX2ludW1faG9zdCAqaW51bSwgdW5zaWduZWQgaW50IHR5cGUpOwogCiBpbnQgZ2ZzMl9kaXJfc2VhcmNoKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqZmlsZW5hbWUsCi0JCSAgICBzdHJ1Y3QgZ2ZzMl9pbnVtICppbnVtLCB1bnNpZ25lZCBpbnQgKnR5cGUpOworCQkgICAgc3RydWN0IGdmczJfaW51bV9ob3N0ICppbnVtLCB1bnNpZ25lZCBpbnQgKnR5cGUpOwogaW50IGdmczJfZGlyX2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBzdHJ1Y3QgcXN0ciAqZmlsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtICppbnVtLCB1bnNpZ25lZCBpbnQgdHlwZSk7CisJCSBjb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmludW0sIHVuc2lnbmVkIGludCB0eXBlKTsKIGludCBnZnMyX2Rpcl9kZWwoc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgY29uc3Qgc3RydWN0IHFzdHIgKmZpbGVuYW1lKTsKIGludCBnZnMyX2Rpcl9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCAqIG9mZnNldCwgdm9pZCAqb3BhcXVlLAogCQkgIGdmczJfZmlsbGRpcl90IGZpbGxkaXIpOwogaW50IGdmczJfZGlyX212aW5vKHN0cnVjdCBnZnMyX2lub2RlICpkaXAsIGNvbnN0IHN0cnVjdCBxc3RyICpmaWxlbmFtZSwKLQkJICAgc3RydWN0IGdmczJfaW51bSAqbmV3X2ludW0sIHVuc2lnbmVkIGludCBuZXdfdHlwZSk7CisJCSAgIHN0cnVjdCBnZnMyX2ludW1faG9zdCAqbmV3X2ludW0sIHVuc2lnbmVkIGludCBuZXdfdHlwZSk7CiAKIGludCBnZnMyX2Rpcl9leGhhc2hfZGVhbGxvYyhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwKTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9lYW9wcy5jIGIvZnMvZ2ZzMi9lYW9wcy5jCmluZGV4IDkyYzU0ZTkuLmNkNzQ3YzAgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZWFvcHMuYworKysgYi9mcy9nZnMyL2Vhb3BzLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCiAJaWYgKEdGUzJfQUNMX0lTX0FDQ0VTUyhlci0+ZXJfbmFtZSwgZXItPmVyX25hbWVfbGVuKSkgewogCQlpZiAoIShlci0+ZXJfZmxhZ3MgJiBHRlMyX0VSRl9NT0RFKSkgewotCQkJZXItPmVyX21vZGUgPSBpcC0+aV9kaS5kaV9tb2RlOworCQkJZXItPmVyX21vZGUgPSBpcC0+aV9pbm9kZS5pX21vZGU7CiAJCQllci0+ZXJfZmxhZ3MgfD0gR0ZTMl9FUkZfTU9ERTsKIAkJfQogCQllcnJvciA9IGdmczJfYWNsX3ZhbGlkYXRlX3NldChpcCwgMSwgZXIsCmRpZmYgLS1naXQgYS9mcy9nZnMyL2VhdHRyLmMgYi9mcy9nZnMyL2VhdHRyLmMKaW5kZXggYTY1YTRjYy4uZWJlYmJkYyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9lYXR0ci5jCisrKyBiL2ZzL2dmczIvZWF0dHIuYwpAQCAtMTEyLDcgKzExMiw3IEBACiBzdGF0aWMgaW50IGVhX2ZvcmVhY2goc3RydWN0IGdmczJfaW5vZGUgKmlwLCBlYV9jYWxsX3QgZWFfY2FsbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqZWFiaDsKLQl1NjQgKmVhYmxrLCAqZW5kOworCV9fYmU2NCAqZWFibGssICplbmQ7CiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChpcC0+aV9nbCwgaXAtPmlfZGkuZGlfZWF0dHIsIERJT19XQUlULCAmYmgpOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWVhYmxrID0gKHU2NCAqKShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX21ldGFfaGVhZGVyKSk7CisJZWFibGsgPSAoX19iZTY0ICopKGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpKTsKIAllbmQgPSBlYWJsayArIEdGUzJfU0IoJmlwLT5pX2lub2RlKS0+c2RfaW5wdHJzOwogCiAJZm9yICg7IGVhYmxrIDwgZW5kOyBlYWJsaysrKSB7CkBAIC0yMjQsNyArMjI0LDggQEAKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkOwogCXN0cnVjdCBnZnMyX2hvbGRlciByZ19naDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpYmg7Ci0JdTY0ICpkYXRhcHRycywgYm4gPSAwOworCV9fYmU2NCAqZGF0YXB0cnM7CisJdTY0IGJuID0gMDsKIAl1NjQgYnN0YXJ0ID0gMDsKIAl1bnNpZ25lZCBpbnQgYmxlbiA9IDA7CiAJdW5zaWduZWQgaW50IGJsa3MgPSAwOwpAQCAtMjgwLDYgKzI4MSw3IEBACiAJCWlmICghaXAtPmlfZGkuZGlfYmxvY2tzKQogCQkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKIAkJaXAtPmlfZGkuZGlfYmxvY2tzLS07CisJCWdmczJfc2V0X2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUpOwogCX0KIAlpZiAoYnN0YXJ0KQogCQlnZnMyX2ZyZWVfbWV0YShpcCwgYnN0YXJ0LCBibGVuKTsKQEAgLTI5OSw5ICszMDEsOSBAQAogCiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJaWYgKCFlcnJvcikgewotCQlpcC0+aV9kaS5kaV9jdGltZSA9IGdldF9zZWNvbmRzKCk7CisJCWlwLT5pX2lub2RlLmlfY3RpbWUudHZfc2VjID0gZ2V0X3NlY29uZHMoKTsKIAkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwotCQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpYmgtPmJfZGF0YSk7CiAJCWJyZWxzZShkaWJoKTsKIAl9CiAKQEAgLTQ0NCw3ICs0NDYsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoOwogCXVuc2lnbmVkIGludCBhbW91bnQgPSBHRlMyX0VBX0RBVEFfTEVOKGVhKTsKIAl1bnNpZ25lZCBpbnQgbnB0cnMgPSBESVZfUk9VTkRfVVAoYW1vdW50LCBzZHAtPnNkX2pic2l6ZSk7Ci0JdTY0ICpkYXRhcHRycyA9IEdGUzJfRUEyREFUQVBUUlMoZWEpOworCV9fYmU2NCAqZGF0YXB0cnMgPSBHRlMyX0VBMkRBVEFQVFJTKGVhKTsKIAl1bnNpZ25lZCBpbnQgeDsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC01OTcsNiArNTk5LDcgQEAKIAllYS0+ZWFfbnVtX3B0cnMgPSAwOwogCiAJaXAtPmlfZGkuZGlfYmxvY2tzKys7CisJZ2ZzMl9zZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYyOSw3ICs2MzIsNyBAQAogCQllYS0+ZWFfbnVtX3B0cnMgPSAwOwogCQltZW1jcHkoR0ZTMl9FQTJEQVRBKGVhKSwgZXItPmVyX2RhdGEsIGVyLT5lcl9kYXRhX2xlbik7CiAJfSBlbHNlIHsKLQkJdTY0ICpkYXRhcHRyID0gR0ZTMl9FQTJEQVRBUFRSUyhlYSk7CisJCV9fYmU2NCAqZGF0YXB0ciA9IEdGUzJfRUEyREFUQVBUUlMoZWEpOwogCQljb25zdCBjaGFyICpkYXRhID0gZXItPmVyX2RhdGE7CiAJCXVuc2lnbmVkIGludCBkYXRhX2xlbiA9IGVyLT5lcl9kYXRhX2xlbjsKIAkJdW5zaWduZWQgaW50IGNvcHk7CkBAIC02NDgsNiArNjUxLDcgQEAKIAkJCWdmczJfbWV0YXR5cGVfc2V0KGJoLCBHRlMyX01FVEFUWVBFX0VELCBHRlMyX0ZPUk1BVF9FRCk7CiAKIAkJCWlwLT5pX2RpLmRpX2Jsb2NrcysrOworCQkJZ2ZzMl9zZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSk7CiAKIAkJCWNvcHkgPSBkYXRhX2xlbiA+IHNkcC0+c2RfamJzaXplID8gc2RwLT5zZF9qYnNpemUgOgogCQkJCQkJCSAgIGRhdGFfbGVuOwpAQCAtNjg2LDcgKzY5MCw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAotCWVycm9yID0gZ2ZzMl9xdW90YV9jaGVjayhpcCwgaXAtPmlfZGkuZGlfdWlkLCBpcC0+aV9kaS5kaV9naWQpOworCWVycm9yID0gZ2ZzMl9xdW90YV9jaGVjayhpcCwgaXAtPmlfaW5vZGUuaV91aWQsIGlwLT5pX2lub2RlLmlfZ2lkKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2d1bmxvY2tfcTsKIApAQCAtNzEwLDEzICs3MTQsMTMgQEAKIAlpZiAoIWVycm9yKSB7CiAJCWlmIChlci0+ZXJfZmxhZ3MgJiBHRlMyX0VSRl9NT0RFKSB7CiAJCQlnZnMyX2Fzc2VydF93aXRoZHJhdyhHRlMyX1NCKCZpcC0+aV9pbm9kZSksCi0JCQkJCSAgICAoaXAtPmlfZGkuZGlfbW9kZSAmIFNfSUZNVCkgPT0KKwkJCQkJICAgIChpcC0+aV9pbm9kZS5pX21vZGUgJiBTX0lGTVQpID09CiAJCQkJCSAgICAoZXItPmVyX21vZGUgJiBTX0lGTVQpKTsKLQkJCWlwLT5pX2RpLmRpX21vZGUgPSBlci0+ZXJfbW9kZTsKKwkJCWlwLT5pX2lub2RlLmlfbW9kZSA9IGVyLT5lcl9tb2RlOwogCQl9Ci0JCWlwLT5pX2RpLmRpX2N0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwkJaXAtPmlfaW5vZGUuaV9jdGltZS50dl9zZWMgPSBnZXRfc2Vjb25kcygpOwogCQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7Ci0JCWdmczJfZGlub2RlX291dCgmaXAtPmlfZGksIGRpYmgtPmJfZGF0YSk7CisJCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGRpYmgpOwogCX0KIApAQCAtODQ2LDEyICs4NTAsMTIgQEAKIAogCWlmIChlci0+ZXJfZmxhZ3MgJiBHRlMyX0VSRl9NT0RFKSB7CiAJCWdmczJfYXNzZXJ0X3dpdGhkcmF3KEdGUzJfU0IoJmlwLT5pX2lub2RlKSwKLQkJCShpcC0+aV9kaS5kaV9tb2RlICYgU19JRk1UKSA9PSAoZXItPmVyX21vZGUgJiBTX0lGTVQpKTsKLQkJaXAtPmlfZGkuZGlfbW9kZSA9IGVyLT5lcl9tb2RlOworCQkJKGlwLT5pX2lub2RlLmlfbW9kZSAmIFNfSUZNVCkgPT0gKGVyLT5lcl9tb2RlICYgU19JRk1UKSk7CisJCWlwLT5pX2lub2RlLmlfbW9kZSA9IGVyLT5lcl9tb2RlOwogCX0KLQlpcC0+aV9kaS5kaV9jdGltZSA9IGdldF9zZWNvbmRzKCk7CisJaXAtPmlfaW5vZGUuaV9jdGltZS50dl9zZWMgPSBnZXRfc2Vjb25kcygpOwogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAlicmVsc2UoZGliaCk7CiBvdXQ6CiAJZ2ZzMl90cmFuc19lbmQoR0ZTMl9TQigmaXAtPmlfaW5vZGUpKTsKQEAgLTkzMSwxMiArOTM1LDEyIEBACiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICppbmRiaCwgKm5ld2JoOwotCXU2NCAqZWFibGs7CisJX19iZTY0ICplYWJsazsKIAlpbnQgZXJyb3I7CiAJaW50IG1oX3NpemUgPSBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpOwogCiAJaWYgKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRUFfSU5ESVJFQ1QpIHsKLQkJdTY0ICplbmQ7CisJCV9fYmU2NCAqZW5kOwogCiAJCWVycm9yID0gZ2ZzMl9tZXRhX3JlYWQoaXAtPmlfZ2wsIGlwLT5pX2RpLmRpX2VhdHRyLCBESU9fV0FJVCwKIAkJCQkgICAgICAgJmluZGJoKTsKQEAgLTk0OCw3ICs5NTIsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQllYWJsayA9ICh1NjQgKikoaW5kYmgtPmJfZGF0YSArIG1oX3NpemUpOworCQllYWJsayA9IChfX2JlNjQgKikoaW5kYmgtPmJfZGF0YSArIG1oX3NpemUpOwogCQllbmQgPSBlYWJsayArIHNkcC0+c2RfaW5wdHJzOwogCiAJCWZvciAoOyBlYWJsayA8IGVuZDsgZWFibGsrKykKQEAgLTk3MSwxMSArOTc1LDEyIEBACiAJCWdmczJfbWV0YXR5cGVfc2V0KGluZGJoLCBHRlMyX01FVEFUWVBFX0lOLCBHRlMyX0ZPUk1BVF9JTik7CiAJCWdmczJfYnVmZmVyX2NsZWFyX3RhaWwoaW5kYmgsIG1oX3NpemUpOwogCi0JCWVhYmxrID0gKHU2NCAqKShpbmRiaC0+Yl9kYXRhICsgbWhfc2l6ZSk7CisJCWVhYmxrID0gKF9fYmU2NCAqKShpbmRiaC0+Yl9kYXRhICsgbWhfc2l6ZSk7CiAJCSplYWJsayA9IGNwdV90b19iZTY0KGlwLT5pX2RpLmRpX2VhdHRyKTsKIAkJaXAtPmlfZGkuZGlfZWF0dHIgPSBibGs7CiAJCWlwLT5pX2RpLmRpX2ZsYWdzIHw9IEdGUzJfRElGX0VBX0lORElSRUNUOwogCQlpcC0+aV9kaS5kaV9ibG9ja3MrKzsKKwkJZ2ZzMl9zZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSk7CiAKIAkJZWFibGsrKzsKIAl9CkBAIC0xMTI5LDkgKzExMzQsOSBAQAogCiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJaWYgKCFlcnJvcikgewotCQlpcC0+aV9kaS5kaV9jdGltZSA9IGdldF9zZWNvbmRzKCk7CisJCWlwLT5pX2lub2RlLmlfY3RpbWUudHZfc2VjID0gZ2V0X3NlY29uZHMoKTsKIAkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwotCQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpYmgtPmJfZGF0YSk7CiAJCWJyZWxzZShkaWJoKTsKIAl9CiAKQEAgLTEyMDIsNyArMTIwNyw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmg7CiAJdW5zaWduZWQgaW50IGFtb3VudCA9IEdGUzJfRUFfREFUQV9MRU4oZWEpOwogCXVuc2lnbmVkIGludCBucHRycyA9IERJVl9ST1VORF9VUChhbW91bnQsIHNkcC0+c2RfamJzaXplKTsKLQl1NjQgKmRhdGFwdHJzID0gR0ZTMl9FQTJEQVRBUFRSUyhlYSk7CisJX19iZTY0ICpkYXRhcHRycyA9IEdGUzJfRUEyREFUQVBUUlMoZWEpOwogCXVuc2lnbmVkIGludCB4OwogCWludCBlcnJvcjsKIApAQCAtMTI4NCw5ICsxMjg5LDggQEAKIAlpZiAoIWVycm9yKSB7CiAJCWVycm9yID0gaW5vZGVfc2V0YXR0cigmaXAtPmlfaW5vZGUsIGF0dHIpOwogCQlnZnMyX2Fzc2VydF93YXJuKEdGUzJfU0IoJmlwLT5pX2lub2RlKSwgIWVycm9yKTsKLQkJZ2ZzMl9pbm9kZV9hdHRyX291dChpcCk7CiAJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQkJZ2ZzMl9kaW5vZGVfb3V0KCZpcC0+aV9kaSwgZGliaC0+Yl9kYXRhKTsKKwkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwogCQlicmVsc2UoZGliaCk7CiAJfQogCkBAIC0xMzAwLDcgKzEzMDQsNyBAQAogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBnZnMyX3JncnBfbGlzdCBybGlzdDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmluZGJoLCAqZGliaDsKLQl1NjQgKmVhYmxrLCAqZW5kOworCV9fYmU2NCAqZWFibGssICplbmQ7CiAJdW5zaWduZWQgaW50IHJnX2Jsb2NrcyA9IDA7CiAJdTY0IGJzdGFydCA9IDA7CiAJdW5zaWduZWQgaW50IGJsZW4gPSAwOwpAQCAtMTMxOSw3ICsxMzIzLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZWFibGsgPSAodTY0ICopKGluZGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpKTsKKwllYWJsayA9IChfX2JlNjQgKikoaW5kYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcikpOwogCWVuZCA9IGVhYmxrICsgc2RwLT5zZF9pbnB0cnM7CiAKIAlmb3IgKDsgZWFibGsgPCBlbmQ7IGVhYmxrKyspIHsKQEAgLTEzNjMsNyArMTM2Nyw3IEBACiAKIAlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgaW5kYmgsIDEpOwogCi0JZWFibGsgPSAodTY0ICopKGluZGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpKTsKKwllYWJsayA9IChfX2JlNjQgKikoaW5kYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcikpOwogCWJzdGFydCA9IDA7CiAJYmxlbiA9IDA7CiAKQEAgLTEzODcsNiArMTM5MSw3IEBACiAJCWlmICghaXAtPmlfZGkuZGlfYmxvY2tzKQogCQkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKIAkJaXAtPmlfZGkuZGlfYmxvY2tzLS07CisJCWdmczJfc2V0X2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUpOwogCX0KIAlpZiAoYnN0YXJ0KQogCQlnZnMyX2ZyZWVfbWV0YShpcCwgYnN0YXJ0LCBibGVuKTsKQEAgLTEzOTYsNyArMTQwMSw3IEBACiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJaWYgKCFlcnJvcikgewogCQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7Ci0JCWdmczJfZGlub2RlX291dCgmaXAtPmlfZGksIGRpYmgtPmJfZGF0YSk7CisJCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGRpYmgpOwogCX0KIApAQCAtMTQ0MSwxMSArMTQ0NiwxMiBAQAogCWlmICghaXAtPmlfZGkuZGlfYmxvY2tzKQogCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwogCWlwLT5pX2RpLmRpX2Jsb2Nrcy0tOworCWdmczJfc2V0X2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUpOwogCiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJaWYgKCFlcnJvcikgewogCQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgZGliaCwgMSk7Ci0JCWdmczJfZGlub2RlX291dCgmaXAtPmlfZGksIGRpYmgtPmJfZGF0YSk7CisJCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGRpYmgpOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9lYXR0ci5oIGIvZnMvZ2ZzMi9lYXR0ci5oCmluZGV4IGZmYTY1OTQuLmM4MmRiZTAgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZWF0dHIuaAorKysgYi9mcy9nZnMyL2VhdHRyLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgR0ZTMl9FQV9TSVpFKGVhKSBcCiBBTElHTihzaXplb2Yoc3RydWN0IGdmczJfZWFfaGVhZGVyKSArIChlYSktPmVhX25hbWVfbGVuICsgXAogICAgICAgKChHRlMyX0VBX0lTX1NUVUZGRUQoZWEpKSA/IEdGUzJfRUFfREFUQV9MRU4oZWEpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YodTY0KSAqIChlYSktPmVhX251bV9wdHJzKSksIDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihfX2JlNjQpICogKGVhKS0+ZWFfbnVtX3B0cnMpKSwgOCkKIAogI2RlZmluZSBHRlMyX0VBX0lTX1NUVUZGRUQoZWEpICghKGVhKS0+ZWFfbnVtX3B0cnMpCiAjZGVmaW5lIEdGUzJfRUFfSVNfTEFTVChlYSkgKChlYSktPmVhX2ZsYWdzICYgR0ZTMl9FQUZMQUdfTEFTVCkKQEAgLTI5LDEzICsyOSwxMyBAQAogCiAjZGVmaW5lIEdGUzJfRUFSRVFfU0laRV9VTlNUVUZGRUQoc2RwLCBlcikgXAogQUxJR04oc2l6ZW9mKHN0cnVjdCBnZnMyX2VhX2hlYWRlcikgKyAoZXIpLT5lcl9uYW1lX2xlbiArIFwKLSAgICAgIHNpemVvZih1NjQpICogRElWX1JPVU5EX1VQKChlciktPmVyX2RhdGFfbGVuLCAoc2RwKS0+c2RfamJzaXplKSwgOCkKKyAgICAgIHNpemVvZihfX2JlNjQpICogRElWX1JPVU5EX1VQKChlciktPmVyX2RhdGFfbGVuLCAoc2RwKS0+c2RfamJzaXplKSwgOCkKIAogI2RlZmluZSBHRlMyX0VBMk5BTUUoZWEpICgoY2hhciAqKSgoc3RydWN0IGdmczJfZWFfaGVhZGVyICopKGVhKSArIDEpKQogI2RlZmluZSBHRlMyX0VBMkRBVEEoZWEpIChHRlMyX0VBMk5BTUUoZWEpICsgKGVhKS0+ZWFfbmFtZV9sZW4pCiAKICNkZWZpbmUgR0ZTMl9FQTJEQVRBUFRSUyhlYSkgXAotKCh1NjQgKikoR0ZTMl9FQTJOQU1FKGVhKSArIEFMSUdOKChlYSktPmVhX25hbWVfbGVuLCA4KSkpCisoKF9fYmU2NCAqKShHRlMyX0VBMk5BTUUoZWEpICsgQUxJR04oKGVhKS0+ZWFfbmFtZV9sZW4sIDgpKSkKIAogI2RlZmluZSBHRlMyX0VBMk5FWFQoZWEpIFwKICgoc3RydWN0IGdmczJfZWFfaGVhZGVyICopKChjaGFyICopKGVhKSArIEdGUzJfRUFfUkVDX0xFTihlYSkpKQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9nbG9jay5jIGIvZnMvZ2ZzMi9nbG9jay5jCmluZGV4IDc4ZmUwZmEuLjQzODE0NjkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZ2xvY2suYworKysgYi9mcy9nZnMyL2dsb2NrLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogc3RydWN0IGdyZWVkeSB7CiAJc3RydWN0IGdmczJfaG9sZGVyIGdyX2doOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBncl93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZ3Jfd29yazsKIH07CiAKIHN0cnVjdCBnZnMyX2dsX2hhc2hfYnVja2V0IHsKQEAgLTk2LDcgKzk2LDcgQEAKIAlyZXR1cm4gJmdsX2hhc2hfbG9ja3NbeCAmIChHTF9IQVNIX0xPQ0tfU1otMSldOwogfQogI2Vsc2UgLyogbm90IFNNUCwgc28gbm8gc3BpbmxvY2tzIHJlcXVpcmVkICovCi1zdGF0aWMgaW5saW5lIHJ3bG9ja190ICpnbF9sb2NrX2FkZHIoeCkKK3N0YXRpYyBpbmxpbmUgcndsb2NrX3QgKmdsX2xvY2tfYWRkcih1bnNpZ25lZCBpbnQgeCkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTc2OSw3ICs3NjksNyBAQAogCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CiAKLQkJbmV3X2doID0gZ2ZzMl9ob2xkZXJfZ2V0KGdsLCBzdGF0ZSwgTE1fRkxBR19UUlksIEdGUF9LRVJORUwpOworCQluZXdfZ2ggPSBnZnMyX2hvbGRlcl9nZXQoZ2wsIHN0YXRlLCBMTV9GTEFHX1RSWSwgR0ZQX05PRlMpOwogCQlpZiAoIW5ld19naCkKIAkJCXJldHVybjsKIAkJc2V0X2JpdChISUZfREVNT1RFLCAmbmV3X2doLT5naF9pZmxhZ3MpOwpAQCAtNzg1LDIxICs3ODUsNiBAQAogCQlnZnMyX2hvbGRlcl9wdXQobmV3X2doKTsKIH0KIAotdm9pZCBnZnMyX2dsb2NrX2lub2RlX3NxdWlzaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBnZnMyX2hvbGRlciBnaDsKLQlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wgPSBHRlMyX0koaW5vZGUpLT5pX2dsOwotCWdmczJfaG9sZGVyX2luaXQoZ2wsIExNX1NUX1VOTE9DS0VELCAwLCAmZ2gpOwotCXNldF9iaXQoSElGX0RFTU9URSwgJmdoLmdoX2lmbGFncyk7Ci0Jc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7Ci0JZ2ZzMl9hc3NlcnQoaW5vZGUtPmlfc2ItPnNfZnNfaW5mbywgbGlzdF9lbXB0eSgmZ2wtPmdsX2hvbGRlcnMpKTsKLQlsaXN0X2FkZF90YWlsKCZnaC5naF9saXN0LCAmZ2wtPmdsX3dhaXRlcnMyKTsKLQlydW5fcXVldWUoZ2wpOwotCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmZ2guZ2hfd2FpdCk7Ci0JZ2ZzMl9ob2xkZXJfdW5pbml0KCZnaCk7Ci19Ci0KIC8qKgogICogc3RhdGVfY2hhbmdlIC0gcmVjb3JkIHRoYXQgdGhlIGdsb2NrIGlzIG5vdyBpbiBhIGRpZmZlcmVudCBzdGF0ZQogICogQGdsOiB0aGUgZ2xvY2sKQEAgLTg0NywxMiArODMyLDEyIEBACiAKIAlpZiAocHJldl9zdGF0ZSAhPSBMTV9TVF9VTkxPQ0tFRCAmJiAhKHJldCAmIExNX09VVF9DQUNIRUFCTEUpKSB7CiAJCWlmIChnbG9wcy0+Z29faW52YWwpCi0JCQlnbG9wcy0+Z29faW52YWwoZ2wsIERJT19NRVRBREFUQSB8IERJT19EQVRBKTsKKwkJCWdsb3BzLT5nb19pbnZhbChnbCwgRElPX01FVEFEQVRBKTsKIAl9IGVsc2UgaWYgKGdsLT5nbF9zdGF0ZSA9PSBMTV9TVF9ERUZFUlJFRCkgewogCQkvKiBXZSBtaWdodCBub3Qgd2FudCB0byBkbyB0aGlzIGhlcmUuCiAJCSAgIExvb2sgYXQgbW92aW5nIHRvIHRoZSBpbm9kZSBnbG9wcy4gKi8KIAkJaWYgKGdsb3BzLT5nb19pbnZhbCkKLQkJCWdsb3BzLT5nb19pbnZhbChnbCwgRElPX0RBVEEpOworCQkJZ2xvcHMtPmdvX2ludmFsKGdsLCAwKTsKIAl9CiAKIAkvKiAgRGVhbCB3aXRoIGVhY2ggcG9zc2libGUgZXhpdCBjb25kaXRpb24gICovCkBAIC05NTQsNyArOTM5LDcgQEAKIAlnZnMyX2Fzc2VydF93YXJuKHNkcCwgc3RhdGUgIT0gZ2wtPmdsX3N0YXRlKTsKIAogCWlmIChnbC0+Z2xfc3RhdGUgPT0gTE1fU1RfRVhDTFVTSVZFICYmIGdsb3BzLT5nb19zeW5jKQotCQlnbG9wcy0+Z29fc3luYyhnbCwgRElPX01FVEFEQVRBIHwgRElPX0RBVEEgfCBESU9fUkVMRUFTRSk7CisJCWdsb3BzLT5nb19zeW5jKGdsKTsKIAogCWdmczJfZ2xvY2tfaG9sZChnbCk7CiAJZ2wtPmdsX3JlcV9iaCA9IHhtb3RlX2JoOwpAQCAtOTk1LDcgKzk4MCw3IEBACiAJc3RhdGVfY2hhbmdlKGdsLCBMTV9TVF9VTkxPQ0tFRCk7CiAKIAlpZiAoZ2xvcHMtPmdvX2ludmFsKQotCQlnbG9wcy0+Z29faW52YWwoZ2wsIERJT19NRVRBREFUQSB8IERJT19EQVRBKTsKKwkJZ2xvcHMtPmdvX2ludmFsKGdsLCBESU9fTUVUQURBVEEpOwogCiAJaWYgKGdoKSB7CiAJCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOwpAQCAtMTA0MSw3ICsxMDI2LDcgQEAKIAlnZnMyX2Fzc2VydF93YXJuKHNkcCwgZ2wtPmdsX3N0YXRlICE9IExNX1NUX1VOTE9DS0VEKTsKIAogCWlmIChnbC0+Z2xfc3RhdGUgPT0gTE1fU1RfRVhDTFVTSVZFICYmIGdsb3BzLT5nb19zeW5jKQotCQlnbG9wcy0+Z29fc3luYyhnbCwgRElPX01FVEFEQVRBIHwgRElPX0RBVEEgfCBESU9fUkVMRUFTRSk7CisJCWdsb3BzLT5nb19zeW5jKGdsKTsKIAogCWdmczJfZ2xvY2tfaG9sZChnbCk7CiAJZ2wtPmdsX3JlcV9iaCA9IGRyb3BfYmg7CkBAIC0xMjQ0LDkgKzEyMjksNiBAQAogCiAJY2xlYXJfYml0KEdMRl9QUkVGRVRDSCwgJmdsLT5nbF9mbGFncyk7CiAKLQlpZiAoZXJyb3IgPT0gR0xSX1RSWUZBSUxFRCAmJiAoZ2gtPmdoX2ZsYWdzICYgR0xfRFVNUCkpCi0JCWR1bXBfZ2xvY2soZ2wpOwotCiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xMzY4LDkgKzEzNTAsOSBAQAogCWdsb3BzLT5nb194bW90ZV90aChnbCwgc3RhdGUsIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgZ3JlZWR5X3dvcmsodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGdyZWVkeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZ3JlZWR5ICpnciA9IGRhdGE7CisJc3RydWN0IGdyZWVkeSAqZ3IgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGdyZWVkeSwgZ3Jfd29yay53b3JrKTsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoID0gJmdyLT5ncl9naDsKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wgPSBnaC0+Z2hfZ2w7CiAJY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyAqZ2xvcHMgPSBnbC0+Z2xfb3BzOwpAQCAtMTQyMiw3ICsxNDA0LDcgQEAKIAogCWdmczJfaG9sZGVyX2luaXQoZ2wsIDAsIDAsIGdoKTsKIAlzZXRfYml0KEhJRl9HUkVFRFksICZnaC0+Z2hfaWZsYWdzKTsKLQlJTklUX1dPUksoJmdyLT5ncl93b3JrLCBncmVlZHlfd29yaywgZ3IpOworCUlOSVRfREVMQVlFRF9XT1JLKCZnci0+Z3Jfd29yaywgZ3JlZWR5X3dvcmspOwogCiAJc2V0X2JpdChHTEZfU0tJUF9XQUlURVJTMiwgJmdsLT5nbF9mbGFncyk7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZnci0+Z3Jfd29yaywgdGltZSk7CkBAIC0xOTIzLDcgKzE5MDUsNyBAQAogCiBzdGF0aWMgdm9pZCBzY2FuX2dsb2NrKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKIHsKLQlpZiAoZ2wtPmdsX29wcyA9PSAmZ2ZzMl9pbm9kZV9nbG9wcykKKwlpZiAoZ2wtPmdsX29wcyA9PSAmZ2ZzMl9pbm9kZV9nbG9wcyAmJiBnbC0+Z2xfb2JqZWN0KQogCQlyZXR1cm47CiAKIAlpZiAoZ2ZzMl9nbG11dGV4X3RyeWxvY2soZ2wpKSB7CkBAIC0yMDc4LDcgKzIwNjAsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIiAgICBudW0gPSAlbGx1ICVsbHVcbiIsCiAJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX251bS5ub19mb3JtYWxfaW5vLAogCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9udW0ubm9fYWRkcik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAgIHR5cGUgPSAldVxuIiwgSUYyRFQoaXAtPmlfZGkuZGlfbW9kZSkpOworCXByaW50ayhLRVJOX0lORk8gIiAgICB0eXBlID0gJXVcbiIsIElGMkRUKGlwLT5pX2lub2RlLmlfbW9kZSkpOwogCXByaW50ayhLRVJOX0lORk8gIiAgICBpX2ZsYWdzID0iKTsKIAlmb3IgKHggPSAwOyB4IDwgMzI7IHgrKykKIAkJaWYgKHRlc3RfYml0KHgsICZpcC0+aV9mbGFncykpCmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmggYi9mcy9nZnMyL2dsb2NrLmgKaW5kZXggMmIyYTg4OS4uZmIzOTEwOCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5oCisrKyBiL2ZzL2dmczIvZ2xvY2suaApAQCAtMjcsOCArMjcsNiBAQAogI2RlZmluZSBHTF9BVElNRQkJMHgwMDAwMDIwMAogI2RlZmluZSBHTF9OT0NBQ0hFCQkweDAwMDAwNDAwCiAjZGVmaW5lIEdMX05PQ0FOQ0VMCQkweDAwMDAxMDAwCi0jZGVmaW5lIEdMX0FPUAkJCTB4MDAwMDQwMDAKLSNkZWZpbmUgR0xfRFVNUAkJCTB4MDAwMDgwMDAKIAogI2RlZmluZSBHTFJfVFJZRkFJTEVECQkxMwogI2RlZmluZSBHTFJfQ0FOQ0VMRUQJCTE0CkBAIC0xMDgsNyArMTA2LDYgQEAKIHZvaWQgZ2ZzMl9nbG9ja19wcmVmZXRjaF9udW0oc3RydWN0IGdmczJfc2JkICpzZHAsIHU2NCBudW1iZXIsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrX29wZXJhdGlvbnMgKmdsb3BzLAogCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhdGUsIGludCBmbGFncyk7Ci12b2lkIGdmczJfZ2xvY2tfaW5vZGVfc3F1aXNoKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiAvKioKICAqIGdmczJfZ2xvY2tfbnFfaW5pdCAtIGludGlhbGl6ZSBhIGhvbGRlciBhbmQgZW5xdWV1ZSBpdCBvbiBhIGdsb2NrCmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb3BzLmMgYi9mcy9nZnMyL2dsb3BzLmMKaW5kZXggNDFhNmI2OC4uYjA2OGQxMCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9wcy5jCisrKyBiL2ZzL2dmczIvZ2xvcHMuYwpAQCAtOTIsNyArOTIsNyBAQAogCiAJaXAgPSBnbC0+Z2xfb2JqZWN0OwogCWlub2RlID0gJmlwLT5pX2lub2RlOwotCWlmICghaXAgfHwgIVNfSVNSRUcoaXAtPmlfZGkuZGlfbW9kZSkpCisJaWYgKCFpcCB8fCAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuOwogCiAJaWYgKCF0ZXN0X2JpdChHSUZfUEFHRUQsICZpcC0+aV9mbGFncykpCkBAIC0xMDcsODkgKzEwNywyMCBAQAogfQogCiAvKioKLSAqIGdmczJfcGFnZV9pbnZhbCAtIEludmFsaWRhdGUgYWxsIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdsb2NrCi0gKiBAZ2w6IHRoZSBnbG9jawotICoKLSAqLwotCi1zdGF0aWMgdm9pZCBnZnMyX3BhZ2VfaW52YWwoc3RydWN0IGdmczJfZ2xvY2sgKmdsKQotewotCXN0cnVjdCBnZnMyX2lub2RlICppcDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCi0JaXAgPSBnbC0+Z2xfb2JqZWN0OwotCWlub2RlID0gJmlwLT5pX2lub2RlOwotCWlmICghaXAgfHwgIVNfSVNSRUcoaXAtPmlfZGkuZGlfbW9kZSkpCi0JCXJldHVybjsKLQotCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDApOwotCWdmczJfYXNzZXJ0X3dpdGhkcmF3KEdGUzJfU0IoJmlwLT5pX2lub2RlKSwgIWlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMpOwotCWNsZWFyX2JpdChHSUZfUEFHRUQsICZpcC0+aV9mbGFncyk7Ci19Ci0KLS8qKgotICogZ2ZzMl9wYWdlX3dhaXQgLSBXYWl0IGZvciB3cml0ZWJhY2sgb2YgZGF0YQotICogQGdsOiB0aGUgZ2xvY2sKLSAqCi0gKiBTeW5jcyBkYXRhIChub3QgbWV0YWRhdGEpIGZvciBhIHJlZ3VsYXIgZmlsZS4KLSAqIE5vLW9wIGZvciBhbGwgb3RoZXIgdHlwZXMuCi0gKi8KLQotc3RhdGljIHZvaWQgZ2ZzMl9wYWdlX3dhaXQoc3RydWN0IGdmczJfZ2xvY2sgKmdsKQotewotCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IGdsLT5nbF9vYmplY3Q7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9ICZpcC0+aV9pbm9kZTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0JaW50IGVycm9yOwotCi0JaWYgKCFTX0lTUkVHKGlwLT5pX2RpLmRpX21vZGUpKQotCQlyZXR1cm47Ci0KLQllcnJvciA9IGZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOwotCi0JLyogUHV0IGJhY2sgYW55IGVycm9ycyBjbGVhcmVkIGJ5IGZpbGVtYXBfZmRhdGF3YWl0KCkKLQkgICBzbyB0aGV5IGNhbiBiZSBjYXVnaHQgYnkgc29tZW9uZSB3aG8gY2FuIHBhc3MgdGhlbQotCSAgIHVwIHRvIHVzZXIgc3BhY2UuICovCi0KLQlpZiAoZXJyb3IgPT0gLUVOT1NQQykKLQkJc2V0X2JpdChBU19FTk9TUEMsICZtYXBwaW5nLT5mbGFncyk7Ci0JZWxzZSBpZiAoZXJyb3IpCi0JCXNldF9iaXQoQVNfRUlPLCAmbWFwcGluZy0+ZmxhZ3MpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGdmczJfcGFnZV93cml0ZWJhY2soc3RydWN0IGdmczJfZ2xvY2sgKmdsKQotewotCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IGdsLT5nbF9vYmplY3Q7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9ICZpcC0+aV9pbm9kZTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0KLQlpZiAoIVNfSVNSRUcoaXAtPmlfZGkuZGlfbW9kZSkpCi0JCXJldHVybjsKLQotCWZpbGVtYXBfZmRhdGF3cml0ZShtYXBwaW5nKTsKLX0KLQotLyoqCiAgKiBtZXRhX2dvX3N5bmMgLSBzeW5jIG91dCB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgZ2xvY2sKICAqIEBnbDogdGhlIGdsb2NrCi0gKiBAZmxhZ3M6IERJT18qCiAgKgogICogQ2FsbGVkIHdoZW4gZGVtb3Rpbmcgb3IgdW5sb2NraW5nIGFuIEVYIGdsb2NrLiAgV2UgbXVzdCBmbHVzaAogICogdG8gZGlzayBhbGwgZGlydHkgYnVmZmVycy9wYWdlcyByZWxhdGluZyB0byB0aGlzIGdsb2NrLCBhbmQgbXVzdCBub3QKICAqIG5vdCByZXR1cm4gdG8gY2FsbGVyIHRvIGRlbW90ZS91bmxvY2sgdGhlIGdsb2NrIHVudGlsIEkvTyBpcyBjb21wbGV0ZS4KICAqLwogCi1zdGF0aWMgdm9pZCBtZXRhX2dvX3N5bmMoc3RydWN0IGdmczJfZ2xvY2sgKmdsLCBpbnQgZmxhZ3MpCitzdGF0aWMgdm9pZCBtZXRhX2dvX3N5bmMoc3RydWN0IGdmczJfZ2xvY2sgKmdsKQogewotCWlmICghKGZsYWdzICYgRElPX01FVEFEQVRBKSkKLQkJcmV0dXJuOwotCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChHTEZfRElSVFksICZnbC0+Z2xfZmxhZ3MpKSB7CiAJCWdmczJfbG9nX2ZsdXNoKGdsLT5nbF9zYmQsIGdsKTsKIAkJZ2ZzMl9tZXRhX3N5bmMoZ2wpOwotCQlpZiAoZmxhZ3MgJiBESU9fUkVMRUFTRSkKLQkJCWdmczJfYWlsX2VtcHR5X2dsKGdsKTsKKwkJZ2ZzMl9haWxfZW1wdHlfZ2woZ2wpOwogCX0KIAogfQpAQCAtMjY0LDMxICsxOTUsMzEgQEAKIC8qKgogICogaW5vZGVfZ29fc3luYyAtIFN5bmMgdGhlIGRpcnR5IGRhdGEgYW5kL29yIG1ldGFkYXRhIGZvciBhbiBpbm9kZSBnbG9jawogICogQGdsOiB0aGUgZ2xvY2sgcHJvdGVjdGluZyB0aGUgaW5vZGUKLSAqIEBmbGFnczoKICAqCiAgKi8KIAotc3RhdGljIHZvaWQgaW5vZGVfZ29fc3luYyhzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGludCBmbGFncykKK3N0YXRpYyB2b2lkIGlub2RlX2dvX3N5bmMoc3RydWN0IGdmczJfZ2xvY2sgKmdsKQogewotCWludCBtZXRhID0gKGZsYWdzICYgRElPX01FVEFEQVRBKTsKLQlpbnQgZGF0YSA9IChmbGFncyAmIERJT19EQVRBKTsKKwlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBnbC0+Z2xfb2JqZWN0OworCisJaWYgKGlwICYmICFTX0lTUkVHKGlwLT5pX2lub2RlLmlfbW9kZSkpCisJCWlwID0gTlVMTDsKIAogCWlmICh0ZXN0X2JpdChHTEZfRElSVFksICZnbC0+Z2xfZmxhZ3MpKSB7Ci0JCWlmIChtZXRhICYmIGRhdGEpIHsKLQkJCWdmczJfcGFnZV93cml0ZWJhY2soZ2wpOwotCQkJZ2ZzMl9sb2dfZmx1c2goZ2wtPmdsX3NiZCwgZ2wpOwotCQkJZ2ZzMl9tZXRhX3N5bmMoZ2wpOwotCQkJZ2ZzMl9wYWdlX3dhaXQoZ2wpOwotCQkJY2xlYXJfYml0KEdMRl9ESVJUWSwgJmdsLT5nbF9mbGFncyk7Ci0JCX0gZWxzZSBpZiAobWV0YSkgewotCQkJZ2ZzMl9sb2dfZmx1c2goZ2wtPmdsX3NiZCwgZ2wpOwotCQkJZ2ZzMl9tZXRhX3N5bmMoZ2wpOwotCQl9IGVsc2UgaWYgKGRhdGEpIHsKLQkJCWdmczJfcGFnZV93cml0ZWJhY2soZ2wpOwotCQkJZ2ZzMl9wYWdlX3dhaXQoZ2wpOworCQlnZnMyX2xvZ19mbHVzaChnbC0+Z2xfc2JkLCBnbCk7CisJCWlmIChpcCkKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShpcC0+aV9pbm9kZS5pX21hcHBpbmcpOworCQlnZnMyX21ldGFfc3luYyhnbCk7CisJCWlmIChpcCkgeworCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpcC0+aV9pbm9kZS5pX21hcHBpbmc7CisJCQlpbnQgZXJyb3IgPSBmaWxlbWFwX2ZkYXRhd2FpdChtYXBwaW5nKTsKKwkJCWlmIChlcnJvciA9PSAtRU5PU1BDKQorCQkJCXNldF9iaXQoQVNfRU5PU1BDLCAmbWFwcGluZy0+ZmxhZ3MpOworCQkJZWxzZSBpZiAoZXJyb3IpCisJCQkJc2V0X2JpdChBU19FSU8sICZtYXBwaW5nLT5mbGFncyk7CiAJCX0KLQkJaWYgKGZsYWdzICYgRElPX1JFTEVBU0UpCi0JCQlnZnMyX2FpbF9lbXB0eV9nbChnbCk7CisJCWNsZWFyX2JpdChHTEZfRElSVFksICZnbC0+Z2xfZmxhZ3MpOworCQlnZnMyX2FpbF9lbXB0eV9nbChnbCk7CiAJfQogfQogCkBAIC0zMDEsMTUgKzIzMiwyMCBAQAogCiBzdGF0aWMgdm9pZCBpbm9kZV9nb19pbnZhbChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGludCBmbGFncykKIHsKKwlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBnbC0+Z2xfb2JqZWN0OwogCWludCBtZXRhID0gKGZsYWdzICYgRElPX01FVEFEQVRBKTsKLQlpbnQgZGF0YSA9IChmbGFncyAmIERJT19EQVRBKTsKIAogCWlmIChtZXRhKSB7CiAJCWdmczJfbWV0YV9pbnZhbChnbCk7Ci0JCWdsLT5nbF92bisrOworCQlpZiAoaXApCisJCQlzZXRfYml0KEdJRl9JTlZBTElELCAmaXAtPmlfZmxhZ3MpOwogCX0KLQlpZiAoZGF0YSkKLQkJZ2ZzMl9wYWdlX2ludmFsKGdsKTsKKworCWlmIChpcCAmJiBTX0lTUkVHKGlwLT5pX2lub2RlLmlfbW9kZSkpIHsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaXAtPmlfaW5vZGUuaV9tYXBwaW5nLCAwKTsKKwkJZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoR0ZTMl9TQigmaXAtPmlfaW5vZGUpLCAhaXAtPmlfaW5vZGUuaV9tYXBwaW5nLT5ucnBhZ2VzKTsKKwkJY2xlYXJfYml0KEdJRl9QQUdFRCwgJmlwLT5pX2ZsYWdzKTsKKwl9CiB9CiAKIC8qKgpAQCAtMzUxLDExICsyODcsMTAgQEAKIAlpZiAoIWlwKQogCQlyZXR1cm4gMDsKIAotCWlmIChpcC0+aV92biAhPSBnbC0+Z2xfdm4pIHsKKwlpZiAodGVzdF9iaXQoR0lGX0lOVkFMSUQsICZpcC0+aV9mbGFncykpIHsKIAkJZXJyb3IgPSBnZnMyX2lub2RlX3JlZnJlc2goaXApOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCWdmczJfaW5vZGVfYXR0cl9pbihpcCk7CiAJfQogCiAJaWYgKChpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX1RSVU5DX0lOX1BST0cpICYmCkBAIC0zNzksMTEgKzMxNCw4IEBACiAJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gZ2gtPmdoX2dsOwogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IGdsLT5nbF9vYmplY3Q7CiAKLQlpZiAoaXAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmICh0ZXN0X2JpdChHTEZfRElSVFksICZnbC0+Z2xfZmxhZ3MpKQotCQlnZnMyX2lub2RlX2F0dHJfaW4oaXApOwotCWdmczJfbWV0YV9jYWNoZV9mbHVzaChpcCk7CisJaWYgKGlwKQorCQlnZnMyX21ldGFfY2FjaGVfZmx1c2goaXApOwogfQogCiAvKioKQEAgLTQ5MSwxMyArNDIzLDEzIEBACiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOwogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShzZHAtPnNkX2pkZXNjLT5qZF9pbm9kZSk7CiAJc3RydWN0IGdmczJfZ2xvY2sgKmpfZ2wgPSBpcC0+aV9nbDsKLQlzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyIGhlYWQ7CisJc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0IGhlYWQ7CiAJaW50IGVycm9yOwogCiAJaWYgKGdsLT5nbF9zdGF0ZSAhPSBMTV9TVF9VTkxPQ0tFRCAmJgogCSAgICB0ZXN0X2JpdChTREZfSk9VUk5BTF9MSVZFLCAmc2RwLT5zZF9mbGFncykpIHsKIAkJZ2ZzMl9tZXRhX2NhY2hlX2ZsdXNoKEdGUzJfSShzZHAtPnNkX2pkZXNjLT5qZF9pbm9kZSkpOwotCQlqX2dsLT5nbF9vcHMtPmdvX2ludmFsKGpfZ2wsIERJT19NRVRBREFUQSB8IERJT19EQVRBKTsKKwkJal9nbC0+Z2xfb3BzLT5nb19pbnZhbChqX2dsLCBESU9fTUVUQURBVEEpOwogCiAJCWVycm9yID0gZ2ZzMl9maW5kX2poZWFkKHNkcC0+c2RfamRlc2MsICZoZWFkKTsKIAkJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbmNvcmUuaCBiL2ZzL2dmczIvaW5jb3JlLmgKaW5kZXggMTE4ZGM2OS4uNzM0NDIxZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbmNvcmUuaAorKysgYi9mcy9nZnMyL2luY29yZS5oCkBAIC0xNCw4ICsxNCw2IEBACiAKICNkZWZpbmUgRElPX1dBSVQJMHgwMDAwMDAxMAogI2RlZmluZSBESU9fTUVUQURBVEEJMHgwMDAwMDAyMAotI2RlZmluZSBESU9fREFUQQkweDAwMDAwMDQwCi0jZGVmaW5lIERJT19SRUxFQVNFCTB4MDAwMDAwODAKICNkZWZpbmUgRElPX0FMTAkJMHgwMDAwMDEwMAogCiBzdHJ1Y3QgZ2ZzMl9sb2dfb3BlcmF0aW9uczsKQEAgLTQxLDcgKzM5LDcgQEAKIAl2b2lkICgqbG9fYmVmb3JlX2NvbW1pdCkgKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIAl2b2lkICgqbG9fYWZ0ZXJfY29tbWl0KSAoc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX2FpbCAqYWkpOwogCXZvaWQgKCpsb19iZWZvcmVfc2NhbikgKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwKLQkJCQlzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyICpoZWFkLCBpbnQgcGFzcyk7CisJCQkJc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0ICpoZWFkLCBpbnQgcGFzcyk7CiAJaW50ICgqbG9fc2Nhbl9lbGVtZW50cykgKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwgdW5zaWduZWQgaW50IHN0YXJ0LAogCQkJCSBzdHJ1Y3QgZ2ZzMl9sb2dfZGVzY3JpcHRvciAqbGQsIF9fYmU2NCAqcHRyLAogCQkJCSBpbnQgcGFzcyk7CkBAIC02Nyw4ICs2NSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCByZF9saXN0X21ydTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJkX3JlY2VudDsJLyogUmVjZW50bHkgdXNlZCByZ3JwcyAqLwogCXN0cnVjdCBnZnMyX2dsb2NrICpyZF9nbDsJLyogR2xvY2sgZm9yIHRoaXMgcmdycCAqLwotCXN0cnVjdCBnZnMyX3JpbmRleCByZF9yaTsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwIHJkX3JnOworCXN0cnVjdCBnZnMyX3JpbmRleF9ob3N0IHJkX3JpOworCXN0cnVjdCBnZnMyX3JncnBfaG9zdCByZF9yZzsKIAl1NjQgcmRfcmdfdm47CiAJc3RydWN0IGdmczJfYml0bWFwICpyZF9iaXRzOwogCXVuc2lnbmVkIGludCByZF9iaF9jb3VudDsKQEAgLTEwMywxOCArMTAxLDE3IEBACiB9OwogCiBzdHJ1Y3QgZ2ZzMl9nbG9ja19vcGVyYXRpb25zIHsKLQl2b2lkICgqZ29feG1vdGVfdGgpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqIGdsLCB1bnNpZ25lZCBpbnQgc3RhdGUsCi0JCQkgICAgIGludCBmbGFncyk7Ci0Jdm9pZCAoKmdvX3htb3RlX2JoKSAoc3RydWN0IGdmczJfZ2xvY2sgKiBnbCk7Ci0Jdm9pZCAoKmdvX2Ryb3BfdGgpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqIGdsKTsKLQl2b2lkICgqZ29fZHJvcF9iaCkgKHN0cnVjdCBnZnMyX2dsb2NrICogZ2wpOwotCXZvaWQgKCpnb19zeW5jKSAoc3RydWN0IGdmczJfZ2xvY2sgKiBnbCwgaW50IGZsYWdzKTsKLQl2b2lkICgqZ29faW52YWwpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqIGdsLCBpbnQgZmxhZ3MpOwotCWludCAoKmdvX2RlbW90ZV9vaykgKHN0cnVjdCBnZnMyX2dsb2NrICogZ2wpOwotCWludCAoKmdvX2xvY2spIChzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKiBnaCk7Ci0Jdm9pZCAoKmdvX3VubG9jaykgKHN0cnVjdCBnZnMyX2hvbGRlciAqIGdoKTsKLQl2b2lkICgqZ29fY2FsbGJhY2spIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqIGdsLCB1bnNpZ25lZCBpbnQgc3RhdGUpOwotCXZvaWQgKCpnb19ncmVlZHkpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqIGdsKTsKKwl2b2lkICgqZ29feG1vdGVfdGgpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIHVuc2lnbmVkIGludCBzdGF0ZSwgaW50IGZsYWdzKTsKKwl2b2lkICgqZ29feG1vdGVfYmgpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOworCXZvaWQgKCpnb19kcm9wX3RoKSAoc3RydWN0IGdmczJfZ2xvY2sgKmdsKTsKKwl2b2lkICgqZ29fZHJvcF9iaCkgKHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CisJdm9pZCAoKmdvX3N5bmMpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOworCXZvaWQgKCpnb19pbnZhbCkgKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgaW50IGZsYWdzKTsKKwlpbnQgKCpnb19kZW1vdGVfb2spIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOworCWludCAoKmdvX2xvY2spIChzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoKTsKKwl2b2lkICgqZ29fdW5sb2NrKSAoc3RydWN0IGdmczJfaG9sZGVyICpnaCk7CisJdm9pZCAoKmdvX2NhbGxiYWNrKSAoc3RydWN0IGdmczJfZ2xvY2sgKmdsLCB1bnNpZ25lZCBpbnQgc3RhdGUpOworCXZvaWQgKCpnb19ncmVlZHkpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOwogCWNvbnN0IGludCBnb190eXBlOwogfTsKIApAQCAtMjE3LDYgKzIxNCw3IEBACiB9OwogCiBlbnVtIHsKKwlHSUZfSU5WQUxJRAkJPSAwLAogCUdJRl9RRF9MT0NLRUQJCT0gMSwKIAlHSUZfUEFHRUQJCT0gMiwKIAlHSUZfU1dfUEFHRUQJCT0gMywKQEAgLTIyNCwxMiArMjIyLDExIEBACiAKIHN0cnVjdCBnZnMyX2lub2RlIHsKIAlzdHJ1Y3QgaW5vZGUgaV9pbm9kZTsKLQlzdHJ1Y3QgZ2ZzMl9pbnVtIGlfbnVtOworCXN0cnVjdCBnZnMyX2ludW1faG9zdCBpX251bTsKIAogCXVuc2lnbmVkIGxvbmcgaV9mbGFnczsJCS8qIEdJRl8uLi4gKi8KIAotCXU2NCBpX3ZuOwotCXN0cnVjdCBnZnMyX2Rpbm9kZSBpX2RpOyAvKiBUbyBiZSByZXBsYWNlZCBieSByZWYgdG8gYmxvY2sgKi8KKwlzdHJ1Y3QgZ2ZzMl9kaW5vZGVfaG9zdCBpX2RpOyAvKiBUbyBiZSByZXBsYWNlZCBieSByZWYgdG8gYmxvY2sgKi8KIAogCXN0cnVjdCBnZnMyX2dsb2NrICppX2dsOyAvKiBNb3ZlIGludG8gaV9naD8gKi8KIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgaV9pb3Blbl9naDsKQEAgLTQ1MCw3ICs0NDcsNyBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2RfdmZzX21ldGE7CiAJc3RydWN0IGtvYmplY3Qgc2Rfa29iajsKIAl1bnNpZ25lZCBsb25nIHNkX2ZsYWdzOwkvKiBTREZfLi4uICovCi0Jc3RydWN0IGdmczJfc2Igc2Rfc2I7CisJc3RydWN0IGdmczJfc2JfaG9zdCBzZF9zYjsKIAogCS8qIENvbnN0YW50cyBjb21wdXRlZCBvbiBtb3VudCAqLwogCkBAIC01MDMsOCArNTAwLDggQEAKIAogCXNwaW5sb2NrX3Qgc2Rfc3RhdGZzX3NwaW47CiAJc3RydWN0IG11dGV4IHNkX3N0YXRmc19tdXRleDsKLQlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlIHNkX3N0YXRmc19tYXN0ZXI7Ci0Jc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSBzZF9zdGF0ZnNfbG9jYWw7CisJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNkX3N0YXRmc19tYXN0ZXI7CisJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNkX3N0YXRmc19sb2NhbDsKIAl1bnNpZ25lZCBsb25nIHNkX3N0YXRmc19zeW5jX3RpbWU7CiAKIAkvKiBSZXNvdXJjZSBncm91cCBzdHVmZiAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5jIGIvZnMvZ2ZzMi9pbm9kZS5jCmluZGV4IDU3YzQzYWMuLmQxMjIwNzRjIDEwMDY0NAotLS0gYS9mcy9nZnMyL2lub2RlLmMKKysrIGIvZnMvZ2ZzMi9pbm9kZS5jCkBAIC0zOCw4MyArMzgsMTIgQEAKICNpbmNsdWRlICJ0cmFucy5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotLyoqCi0gKiBnZnMyX2lub2RlX2F0dHJfaW4gLSBDb3B5IGF0dHJpYnV0ZXMgZnJvbSB0aGUgZGlub2RlIGludG8gdGhlIFZGUyBpbm9kZQotICogQGlwOiBUaGUgR0ZTMiBpbm9kZSAod2l0aCBlbWJlZGRlZCBkaXNrIGlub2RlIGRhdGEpCi0gKiBAaW5vZGU6ICBUaGUgTGludXggVkZTIGlub2RlCi0gKgotICovCi0KLXZvaWQgZ2ZzMl9pbm9kZV9hdHRyX2luKHN0cnVjdCBnZnMyX2lub2RlICppcCkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmlwLT5pX2lub2RlOwotCXN0cnVjdCBnZnMyX2Rpbm9kZSAqZGkgPSAmaXAtPmlfZGk7Ci0KLQlpbm9kZS0+aV9pbm8gPSBpcC0+aV9udW0ubm9fYWRkcjsKLQotCXN3aXRjaCAoZGktPmRpX21vZGUgJiBTX0lGTVQpIHsKLQljYXNlIFNfSUZCTEs6Ci0JY2FzZSBTX0lGQ0hSOgotCQlpbm9kZS0+aV9yZGV2ID0gTUtERVYoZGktPmRpX21ham9yLCBkaS0+ZGlfbWlub3IpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbm9kZS0+aV9yZGV2ID0gMDsKLQkJYnJlYWs7Ci0JfTsKLQotCWlub2RlLT5pX21vZGUgPSBkaS0+ZGlfbW9kZTsKLQlpbm9kZS0+aV9ubGluayA9IGRpLT5kaV9ubGluazsKLQlpbm9kZS0+aV91aWQgPSBkaS0+ZGlfdWlkOwotCWlub2RlLT5pX2dpZCA9IGRpLT5kaV9naWQ7Ci0JaV9zaXplX3dyaXRlKGlub2RlLCBkaS0+ZGlfc2l6ZSk7Ci0JaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gZGktPmRpX2F0aW1lOwotCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGRpLT5kaV9tdGltZTsKLQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBkaS0+ZGlfY3RpbWU7Ci0JaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfYmxvY2tzID0gZGktPmRpX2Jsb2NrcyA8PAotCQkoR0ZTMl9TQihpbm9kZSktPnNkX3NiLnNiX2JzaXplX3NoaWZ0IC0gR0ZTMl9CQVNJQ19CTE9DS19TSElGVCk7Ci0KLQlpZiAoZGktPmRpX2ZsYWdzICYgR0ZTMl9ESUZfSU1NVVRBQkxFKQotCQlpbm9kZS0+aV9mbGFncyB8PSBTX0lNTVVUQUJMRTsKLQllbHNlCi0JCWlub2RlLT5pX2ZsYWdzICY9IH5TX0lNTVVUQUJMRTsKLQotCWlmIChkaS0+ZGlfZmxhZ3MgJiBHRlMyX0RJRl9BUFBFTkRPTkxZKQotCQlpbm9kZS0+aV9mbGFncyB8PSBTX0FQUEVORDsKLQllbHNlCi0JCWlub2RlLT5pX2ZsYWdzICY9IH5TX0FQUEVORDsKLX0KLQotLyoqCi0gKiBnZnMyX2lub2RlX2F0dHJfb3V0IC0gQ29weSBhdHRyaWJ1dGVzIGZyb20gVkZTIGlub2RlIGludG8gdGhlIGRpbm9kZQotICogQGlwOiBUaGUgR0ZTMiBpbm9kZQotICoKLSAqIE9ubHkgY29weSBvdXQgdGhlIGF0dHJpYnV0ZXMgdGhhdCB3ZSB3YW50IHRoZSBWRlMgbGF5ZXIKLSAqIHRvIGJlIGFibGUgdG8gbW9kaWZ5LgotICovCi0KLXZvaWQgZ2ZzMl9pbm9kZV9hdHRyX291dChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9ICZpcC0+aV9pbm9kZTsKLQlzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpID0gJmlwLT5pX2RpOwotCWdmczJfYXNzZXJ0X3dpdGhkcmF3KEdGUzJfU0IoaW5vZGUpLAotCQkoZGktPmRpX21vZGUgJiBTX0lGTVQpID09IChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSk7Ci0JZGktPmRpX21vZGUgPSBpbm9kZS0+aV9tb2RlOwotCWRpLT5kaV91aWQgPSBpbm9kZS0+aV91aWQ7Ci0JZGktPmRpX2dpZCA9IGlub2RlLT5pX2dpZDsKLQlkaS0+ZGlfYXRpbWUgPSBpbm9kZS0+aV9hdGltZS50dl9zZWM7Ci0JZGktPmRpX210aW1lID0gaW5vZGUtPmlfbXRpbWUudHZfc2VjOwotCWRpLT5kaV9jdGltZSA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYzsKLX0KLQogc3RhdGljIGludCBpZ2V0X3Rlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7Ci0Jc3RydWN0IGdmczJfaW51bSAqaW51bSA9IG9wYXF1ZTsKKwlzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmludW0gPSBvcGFxdWU7CiAKLQlpZiAoaXAgJiYgaXAtPmlfbnVtLm5vX2FkZHIgPT0gaW51bS0+bm9fYWRkcikKKwlpZiAoaXAtPmlfbnVtLm5vX2FkZHIgPT0gaW51bS0+bm9fYWRkcikKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTEyMywxOSArNTIsMjAgQEAKIHN0YXRpYyBpbnQgaWdldF9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7Ci0Jc3RydWN0IGdmczJfaW51bSAqaW51bSA9IG9wYXF1ZTsKKwlzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmludW0gPSBvcGFxdWU7CiAKIAlpcC0+aV9udW0gPSAqaW51bTsKKwlpbm9kZS0+aV9pbm8gPSBpbnVtLT5ub19hZGRyOwogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgaW5vZGUgKmdmczJfaWxvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZ2ZzMl9pbnVtICppbnVtKQorc3RydWN0IGlub2RlICpnZnMyX2lsb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGdmczJfaW51bV9ob3N0ICppbnVtKQogewogCXJldHVybiBpbG9va3VwNShzYiwgKHVuc2lnbmVkIGxvbmcpaW51bS0+bm9fZm9ybWFsX2lubywKIAkJCWlnZXRfdGVzdCwgaW51bSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmdmczJfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZ2ZzMl9pbnVtICppbnVtKQorc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2ZzMl9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBnZnMyX2ludW1faG9zdCAqaW51bSkKIHsKIAlyZXR1cm4gaWdldDVfbG9ja2VkKHNiLCAodW5zaWduZWQgbG9uZylpbnVtLT5ub19mb3JtYWxfaW5vLAogCQkgICAgIGlnZXRfdGVzdCwgaWdldF9zZXQsIGludW0pOwpAQCAtMTUwLDEzICs4MCwxNiBAQAogICogUmV0dXJuczogQSBWRlMgaW5vZGUsIG9yIGFuIGVycm9yCiAgKi8KIAotc3RydWN0IGlub2RlICpnZnMyX2lub2RlX2xvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZ2ZzMl9pbnVtICppbnVtLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3N0cnVjdCBpbm9kZSAqZ2ZzMl9pbm9kZV9sb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGdmczJfaW51bV9ob3N0ICppbnVtLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZ2ZzMl9pZ2V0KHNiLCBpbnVtKTsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwogCXN0cnVjdCBnZnMyX2dsb2NrICppb19nbDsKIAlpbnQgZXJyb3I7CiAKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PQlVGUyk7CisKIAlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewogCQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOwogCQl1bW9kZV90IG1vZGUgPSBEVDJJRih0eXBlKTsKQEAgLTE4NSw3ICsxMTgsNyBAQAogCQlpZiAodW5saWtlbHkoZXJyb3IpKQogCQkJZ290byBmYWlsX3B1dDsKIAotCQlpcC0+aV92biA9IGlwLT5pX2dsLT5nbF92biAtIDE7CisJCXNldF9iaXQoR0lGX0lOVkFMSUQsICZpcC0+aV9mbGFncyk7CiAJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlvX2dsLCBMTV9TVF9TSEFSRUQsIEdMX0VYQUNULCAmaXAtPmlfaW9wZW5fZ2gpOwogCQlpZiAodW5saWtlbHkoZXJyb3IpKQogCQkJZ290byBmYWlsX2lvcGVuOwpAQCAtMjA1LDYgKzEzOCw2MyBAQAogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIH0KIAorc3RhdGljIGludCBnZnMyX2Rpbm9kZV9pbihzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2ZzMl9kaW5vZGVfaG9zdCAqZGkgPSAmaXAtPmlfZGk7CisJY29uc3Qgc3RydWN0IGdmczJfZGlub2RlICpzdHIgPSBidWY7CisKKwlpZiAoaXAtPmlfbnVtLm5vX2FkZHIgIT0gYmU2NF90b19jcHUoc3RyLT5kaV9udW0ubm9fYWRkcikpIHsKKwkJaWYgKGdmczJfY29uc2lzdF9pbm9kZShpcCkpCisJCQlnZnMyX2Rpbm9kZV9wcmludChpcCk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoaXAtPmlfbnVtLm5vX2Zvcm1hbF9pbm8gIT0gYmU2NF90b19jcHUoc3RyLT5kaV9udW0ubm9fZm9ybWFsX2lubykpCisJCXJldHVybiAtRVNUQUxFOworCisJaXAtPmlfaW5vZGUuaV9tb2RlID0gYmUzMl90b19jcHUoc3RyLT5kaV9tb2RlKTsKKwlpcC0+aV9pbm9kZS5pX3JkZXYgPSAwOworCXN3aXRjaCAoaXAtPmlfaW5vZGUuaV9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGQkxLOgorCWNhc2UgU19JRkNIUjoKKwkJaXAtPmlfaW5vZGUuaV9yZGV2ID0gTUtERVYoYmUzMl90b19jcHUoc3RyLT5kaV9tYWpvciksCisJCQkJCSAgIGJlMzJfdG9fY3B1KHN0ci0+ZGlfbWlub3IpKTsKKwkJYnJlYWs7CisJfTsKKworCWlwLT5pX2lub2RlLmlfdWlkID0gYmUzMl90b19jcHUoc3RyLT5kaV91aWQpOworCWlwLT5pX2lub2RlLmlfZ2lkID0gYmUzMl90b19jcHUoc3RyLT5kaV9naWQpOworCS8qCisJICogV2Ugd2lsbCBuZWVkIHRvIHJldmlldyBzZXR0aW5nIHRoZSBubGluayBjb3VudCBoZXJlIGluIHRoZQorCSAqIGxpZ2h0IG9mIHRoZSBmb3J0aGNvbWluZyBybyBiaW5kIG1vdW50IHdvcmsuIFRoaXMgaXMgYSByZW1pbmRlcgorCSAqIHRvIGRvIHRoYXQuCisJICovCisJaXAtPmlfaW5vZGUuaV9ubGluayA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfbmxpbmspOworCWRpLT5kaV9zaXplID0gYmU2NF90b19jcHUoc3RyLT5kaV9zaXplKTsKKwlpX3NpemVfd3JpdGUoJmlwLT5pX2lub2RlLCBkaS0+ZGlfc2l6ZSk7CisJZGktPmRpX2Jsb2NrcyA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfYmxvY2tzKTsKKwlnZnMyX3NldF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlKTsKKwlpcC0+aV9pbm9kZS5pX2F0aW1lLnR2X3NlYyA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfYXRpbWUpOworCWlwLT5pX2lub2RlLmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaXAtPmlfaW5vZGUuaV9tdGltZS50dl9zZWMgPSBiZTY0X3RvX2NwdShzdHItPmRpX210aW1lKTsKKwlpcC0+aV9pbm9kZS5pX210aW1lLnR2X25zZWMgPSAwOworCWlwLT5pX2lub2RlLmlfY3RpbWUudHZfc2VjID0gYmU2NF90b19jcHUoc3RyLT5kaV9jdGltZSk7CisJaXAtPmlfaW5vZGUuaV9jdGltZS50dl9uc2VjID0gMDsKKworCWRpLT5kaV9nb2FsX21ldGEgPSBiZTY0X3RvX2NwdShzdHItPmRpX2dvYWxfbWV0YSk7CisJZGktPmRpX2dvYWxfZGF0YSA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfZ29hbF9kYXRhKTsKKwlkaS0+ZGlfZ2VuZXJhdGlvbiA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfZ2VuZXJhdGlvbik7CisKKwlkaS0+ZGlfZmxhZ3MgPSBiZTMyX3RvX2NwdShzdHItPmRpX2ZsYWdzKTsKKwlnZnMyX3NldF9pbm9kZV9mbGFncygmaXAtPmlfaW5vZGUpOworCWRpLT5kaV9oZWlnaHQgPSBiZTE2X3RvX2NwdShzdHItPmRpX2hlaWdodCk7CisKKwlkaS0+ZGlfZGVwdGggPSBiZTE2X3RvX2NwdShzdHItPmRpX2RlcHRoKTsKKwlkaS0+ZGlfZW50cmllcyA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfZW50cmllcyk7CisKKwlkaS0+ZGlfZWF0dHIgPSBiZTY0X3RvX2NwdShzdHItPmRpX2VhdHRyKTsKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBnZnMyX2lub2RlX3JlZnJlc2ggLSBSZWZyZXNoIHRoZSBpbmNvcmUgY29weSBvZiB0aGUgZGlub2RlCiAgKiBAaXA6IFRoZSBHRlMyIGlub2RlCkBAIC0yMjYsMjEgKzIxNiwxMSBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlnZnMyX2Rpbm9kZV9pbigmaXAtPmlfZGksIGRpYmgtPmJfZGF0YSk7Ci0KKwllcnJvciA9IGdmczJfZGlub2RlX2luKGlwLCBkaWJoLT5iX2RhdGEpOwogCWJyZWxzZShkaWJoKTsKKwljbGVhcl9iaXQoR0lGX0lOVkFMSUQsICZpcC0+aV9mbGFncyk7CiAKLQlpZiAoaXAtPmlfbnVtLm5vX2FkZHIgIT0gaXAtPmlfZGkuZGlfbnVtLm5vX2FkZHIpIHsKLQkJaWYgKGdmczJfY29uc2lzdF9pbm9kZShpcCkpCi0JCQlnZnMyX2Rpbm9kZV9wcmludCgmaXAtPmlfZGkpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JaWYgKGlwLT5pX251bS5ub19mb3JtYWxfaW5vICE9IGlwLT5pX2RpLmRpX251bS5ub19mb3JtYWxfaW5vKQotCQlyZXR1cm4gLUVTVEFMRTsKLQotCWlwLT5pX3ZuID0gaXAtPmlfZ2wtPmdsX3ZuOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycm9yOwogfQogCiBpbnQgZ2ZzMl9kaW5vZGVfZGVhbGxvYyhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCkBAIC0yNTIsNyArMjMyLDcgQEAKIAogCWlmIChpcC0+aV9kaS5kaV9ibG9ja3MgIT0gMSkgewogCQlpZiAoZ2ZzMl9jb25zaXN0X2lub2RlKGlwKSkKLQkJCWdmczJfZGlub2RlX3ByaW50KCZpcC0+aV9kaSk7CisJCQlnZnMyX2Rpbm9kZV9wcmludChpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMzE1LDE0ICsyOTUsMTQgQEAKIAl1MzIgbmxpbms7CiAJaW50IGVycm9yOwogCi0JQlVHX09OKGlwLT5pX2RpLmRpX25saW5rICE9IGlwLT5pX2lub2RlLmlfbmxpbmspOwotCW5saW5rID0gaXAtPmlfZGkuZGlfbmxpbmsgKyBkaWZmOworCUJVR19PTihkaWZmICE9IDEgJiYgZGlmZiAhPSAtMSk7CisJbmxpbmsgPSBpcC0+aV9pbm9kZS5pX25saW5rICsgZGlmZjsKIAogCS8qIElmIHdlIGFyZSByZWR1Y2luZyB0aGUgbmxpbmsgY291bnQsIGJ1dCB0aGUgbmV3IHZhbHVlIGVuZHMgdXAgYmVpbmcKIAkgICBiaWdnZXIgdGhhbiB0aGUgb2xkIG9uZSwgd2UgbXVzdCBoYXZlIHVuZGVyZmxvd2VkLiAqLwotCWlmIChkaWZmIDwgMCAmJiBubGluayA+IGlwLT5pX2RpLmRpX25saW5rKSB7CisJaWYgKGRpZmYgPCAwICYmIG5saW5rID4gaXAtPmlfaW5vZGUuaV9ubGluaykgewogCQlpZiAoZ2ZzMl9jb25zaXN0X2lub2RlKGlwKSkKLQkJCWdmczJfZGlub2RlX3ByaW50KCZpcC0+aV9kaSk7CisJCQlnZnMyX2Rpbm9kZV9wcmludChpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMzMwLDE2ICszMTAsMTkgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlwLT5pX2RpLmRpX25saW5rID0gbmxpbms7Ci0JaXAtPmlfZGkuZGlfY3RpbWUgPSBnZXRfc2Vjb25kcygpOwotCWlwLT5pX2lub2RlLmlfbmxpbmsgPSBubGluazsKKwlpZiAoZGlmZiA+IDApCisJCWluY19ubGluaygmaXAtPmlfaW5vZGUpOworCWVsc2UKKwkJZHJvcF9ubGluaygmaXAtPmlfaW5vZGUpOworCisJaXAtPmlfaW5vZGUuaV9jdGltZS50dl9zZWMgPSBnZXRfc2Vjb25kcygpOwogCiAJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwotCWdmczJfZGlub2RlX291dCgmaXAtPmlfZGksIGRpYmgtPmJfZGF0YSk7CisJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwogCWJyZWxzZShkaWJoKTsKIAltYXJrX2lub2RlX2RpcnR5KCZpcC0+aV9pbm9kZSk7CiAKLQlpZiAoaXAtPmlfZGkuZGlfbmxpbmsgPT0gMCkgeworCWlmIChpcC0+aV9pbm9kZS5pX25saW5rID09IDApIHsKIAkJc3RydWN0IGdmczJfcmdycGQgKnJnZDsKIAkJc3RydWN0IGdmczJfaG9sZGVyIHJpX2doLCByZ19naDsKIApAQCAtMzU0LDcgKzMzNyw2IEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X25vcmdycDsKIAotCQljbGVhcl9ubGluaygmaXAtPmlfaW5vZGUpOwogCQlnZnMyX3VubGlua19kaSgmaXAtPmlfaW5vZGUpOyAvKiBtYXJrIGlub2RlIHVubGlua2VkICovCiAJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZyZ19naCk7CiBvdXRfbm9yZ3JwOgpAQCAtMzkxLDcgKzM3Myw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwID0gR0ZTMl9JKGRpcik7CiAJc3RydWN0IGdmczJfaG9sZGVyIGRfZ2g7Ci0Jc3RydWN0IGdmczJfaW51bSBpbnVtOworCXN0cnVjdCBnZnMyX2ludW1faG9zdCBpbnVtOwogCXVuc2lnbmVkIGludCB0eXBlOwogCWludCBlcnJvciA9IDA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CkBAIC00MzMsNyArNDE1LDcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koc2RwLT5zZF9pcl9pbm9kZSk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlzdHJ1Y3QgZ2ZzMl9pbnVtX3JhbmdlIGlyOworCXN0cnVjdCBnZnMyX2ludW1fcmFuZ2VfaG9zdCBpcjsKIAlpbnQgZXJyb3I7CiAKIAllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBSRVNfRElOT0RFLCAwKTsKQEAgLTQ3Niw3ICs0NTgsNyBAQAogCXN0cnVjdCBnZnMyX2lub2RlICptX2lwID0gR0ZTMl9JKHNkcC0+c2RfaW51bV9pbm9kZSk7CiAJc3RydWN0IGdmczJfaG9sZGVyIGdoOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0Jc3RydWN0IGdmczJfaW51bV9yYW5nZSBpcjsKKwlzdHJ1Y3QgZ2ZzMl9pbnVtX3JhbmdlX2hvc3QgaXI7CiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQobV9pcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCAmZ2gpOwpAQCAtNDk3LDIxICs0NzksMjIgQEAKIAlpZiAoIWlyLmlyX2xlbmd0aCkgewogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1fYmg7CiAJCXU2NCB4LCB5OworCQlfX2JlNjQgejsKIAogCQllcnJvciA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIobV9pcCwgJm1fYmgpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9icmVsc2U7CiAKLQkJeCA9ICoodTY0ICopKG1fYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKTsKLQkJeCA9IHkgPSBiZTY0X3RvX2NwdSh4KTsKKwkJeiA9ICooX19iZTY0ICopKG1fYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKTsKKwkJeCA9IHkgPSBiZTY0X3RvX2NwdSh6KTsKIAkJaXIuaXJfc3RhcnQgPSB4OwogCQlpci5pcl9sZW5ndGggPSBHRlMyX0lOVU1fUVVBTlRVTTsKIAkJeCArPSBHRlMyX0lOVU1fUVVBTlRVTTsKIAkJaWYgKHggPCB5KQogCQkJZ2ZzMl9jb25zaXN0X2lub2RlKG1faXApOwotCQl4ID0gY3B1X3RvX2JlNjQoeCk7CisJCXogPSBjcHVfdG9fYmU2NCh4KTsKIAkJZ2ZzMl90cmFuc19hZGRfYmgobV9pcC0+aV9nbCwgbV9iaCwgMSk7Ci0JCSoodTY0ICopKG1fYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSA9IHg7CisJCSooX19iZTY0ICopKG1fYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSA9IHo7CiAKIAkJYnJlbHNlKG1fYmgpOwogCX0KQEAgLTU2NCw3ICs1NDcsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAKIAkvKiAgRG9uJ3QgY3JlYXRlIGVudHJpZXMgaW4gYW4gdW5saW5rZWQgZGlyZWN0b3J5ICAqLwotCWlmICghZGlwLT5pX2RpLmRpX25saW5rKQorCWlmICghZGlwLT5pX2lub2RlLmlfbmxpbmspCiAJCXJldHVybiAtRVBFUk07CiAKIAllcnJvciA9IGdmczJfZGlyX3NlYXJjaCgmZGlwLT5pX2lub2RlLCBuYW1lLCBOVUxMLCBOVUxMKTsKQEAgLTU4MCw3ICs1NjMsNyBAQAogCiAJaWYgKGRpcC0+aV9kaS5kaV9lbnRyaWVzID09ICh1MzIpLTEpCiAJCXJldHVybiAtRUZCSUc7Ci0JaWYgKFNfSVNESVIobW9kZSkgJiYgZGlwLT5pX2RpLmRpX25saW5rID09ICh1MzIpLTEpCisJaWYgKFNfSVNESVIobW9kZSkgJiYgZGlwLT5pX2lub2RlLmlfbmxpbmsgPT0gKHUzMiktMSkKIAkJcmV0dXJuIC1FTUxJTks7CiAKIAlyZXR1cm4gMDsKQEAgLTU5MCwyNCArNTczLDI0IEBACiAJCQkgICAgICAgdW5zaWduZWQgaW50ICp1aWQsIHVuc2lnbmVkIGludCAqZ2lkKQogewogCWlmIChHRlMyX1NCKCZkaXAtPmlfaW5vZGUpLT5zZF9hcmdzLmFyX3N1aWRkaXIgJiYKLQkgICAgKGRpcC0+aV9kaS5kaV9tb2RlICYgU19JU1VJRCkgJiYgZGlwLT5pX2RpLmRpX3VpZCkgeworCSAgICAoZGlwLT5pX2lub2RlLmlfbW9kZSAmIFNfSVNVSUQpICYmIGRpcC0+aV9pbm9kZS5pX3VpZCkgewogCQlpZiAoU19JU0RJUigqbW9kZSkpCiAJCQkqbW9kZSB8PSBTX0lTVUlEOwotCQllbHNlIGlmIChkaXAtPmlfZGkuZGlfdWlkICE9IGN1cnJlbnQtPmZzdWlkKQorCQllbHNlIGlmIChkaXAtPmlfaW5vZGUuaV91aWQgIT0gY3VycmVudC0+ZnN1aWQpCiAJCQkqbW9kZSAmPSB+MDcxMTE7Ci0JCSp1aWQgPSBkaXAtPmlfZGkuZGlfdWlkOworCQkqdWlkID0gZGlwLT5pX2lub2RlLmlfdWlkOwogCX0gZWxzZQogCQkqdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAKLQlpZiAoZGlwLT5pX2RpLmRpX21vZGUgJiBTX0lTR0lEKSB7CisJaWYgKGRpcC0+aV9pbm9kZS5pX21vZGUgJiBTX0lTR0lEKSB7CiAJCWlmIChTX0lTRElSKCptb2RlKSkKIAkJCSptb2RlIHw9IFNfSVNHSUQ7Ci0JCSpnaWQgPSBkaXAtPmlfZGkuZGlfZ2lkOworCQkqZ2lkID0gZGlwLT5pX2lub2RlLmlfZ2lkOwogCX0gZWxzZQogCQkqZ2lkID0gY3VycmVudC0+ZnNnaWQ7CiB9CiAKLXN0YXRpYyBpbnQgYWxsb2NfZGlub2RlKHN0cnVjdCBnZnMyX2lub2RlICpkaXAsIHN0cnVjdCBnZnMyX2ludW0gKmludW0sCitzdGF0aWMgaW50IGFsbG9jX2Rpbm9kZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwLCBzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmludW0sCiAJCQl1NjQgKmdlbmVyYXRpb24pCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZkaXAtPmlfaW5vZGUpOwpAQCAtNjQ3LDkgKzYzMCw5IEBACiAgKi8KIAogc3RhdGljIHZvaWQgaW5pdF9kaW5vZGUoc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgc3RydWN0IGdmczJfZ2xvY2sgKmdsLAotCQkJY29uc3Qgc3RydWN0IGdmczJfaW51bSAqaW51bSwgdW5zaWduZWQgaW50IG1vZGUsCisJCQljb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmludW0sIHVuc2lnbmVkIGludCBtb2RlLAogCQkJdW5zaWduZWQgaW50IHVpZCwgdW5zaWduZWQgaW50IGdpZCwKLQkJCWNvbnN0IHU2NCAqZ2VuZXJhdGlvbikKKwkJCWNvbnN0IHU2NCAqZ2VuZXJhdGlvbiwgZGV2X3QgZGV2KQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmZGlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpOwpAQCAtNjY2LDE0ICs2NDksMTUgQEAKIAlkaS0+ZGlfbW9kZSA9IGNwdV90b19iZTMyKG1vZGUpOwogCWRpLT5kaV91aWQgPSBjcHVfdG9fYmUzMih1aWQpOwogCWRpLT5kaV9naWQgPSBjcHVfdG9fYmUzMihnaWQpOwotCWRpLT5kaV9ubGluayA9IGNwdV90b19iZTMyKDApOwotCWRpLT5kaV9zaXplID0gY3B1X3RvX2JlNjQoMCk7CisJZGktPmRpX25saW5rID0gMDsKKwlkaS0+ZGlfc2l6ZSA9IDA7CiAJZGktPmRpX2Jsb2NrcyA9IGNwdV90b19iZTY0KDEpOwogCWRpLT5kaV9hdGltZSA9IGRpLT5kaV9tdGltZSA9IGRpLT5kaV9jdGltZSA9IGNwdV90b19iZTY0KGdldF9zZWNvbmRzKCkpOwotCWRpLT5kaV9tYWpvciA9IGRpLT5kaV9taW5vciA9IGNwdV90b19iZTMyKDApOworCWRpLT5kaV9tYWpvciA9IGNwdV90b19iZTMyKE1BSk9SKGRldikpOworCWRpLT5kaV9taW5vciA9IGNwdV90b19iZTMyKE1JTk9SKGRldikpOwogCWRpLT5kaV9nb2FsX21ldGEgPSBkaS0+ZGlfZ29hbF9kYXRhID0gY3B1X3RvX2JlNjQoaW51bS0+bm9fYWRkcik7CiAJZGktPmRpX2dlbmVyYXRpb24gPSBjcHVfdG9fYmU2NCgqZ2VuZXJhdGlvbik7Ci0JZGktPmRpX2ZsYWdzID0gY3B1X3RvX2JlMzIoMCk7CisJZGktPmRpX2ZsYWdzID0gMDsKIAogCWlmIChTX0lTUkVHKG1vZGUpKSB7CiAJCWlmICgoZGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfSU5IRVJJVF9KREFUQSkgfHwKQEAgLTY5MCwyMiArNjc0LDIyIEBACiAJfQogCiAJZGktPl9fcGFkMSA9IDA7Ci0JZGktPmRpX3BheWxvYWRfZm9ybWF0ID0gY3B1X3RvX2JlMzIoMCk7Ci0JZGktPmRpX2hlaWdodCA9IGNwdV90b19iZTMyKDApOworCWRpLT5kaV9wYXlsb2FkX2Zvcm1hdCA9IGNwdV90b19iZTMyKFNfSVNESVIobW9kZSkgPyBHRlMyX0ZPUk1BVF9ERSA6IDApOworCWRpLT5kaV9oZWlnaHQgPSAwOwogCWRpLT5fX3BhZDIgPSAwOwogCWRpLT5fX3BhZDMgPSAwOwotCWRpLT5kaV9kZXB0aCA9IGNwdV90b19iZTE2KDApOwotCWRpLT5kaV9lbnRyaWVzID0gY3B1X3RvX2JlMzIoMCk7CisJZGktPmRpX2RlcHRoID0gMDsKKwlkaS0+ZGlfZW50cmllcyA9IDA7CiAJbWVtc2V0KCZkaS0+X19wYWQ0LCAwLCBzaXplb2YoZGktPl9fcGFkNCkpOwotCWRpLT5kaV9lYXR0ciA9IGNwdV90b19iZTY0KDApOworCWRpLT5kaV9lYXR0ciA9IDA7CiAJbWVtc2V0KCZkaS0+ZGlfcmVzZXJ2ZWQsIDAsIHNpemVvZihkaS0+ZGlfcmVzZXJ2ZWQpKTsKIAogCWJyZWxzZShkaWJoKTsKIH0KIAogc3RhdGljIGludCBtYWtlX2Rpbm9kZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwLCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgY29uc3Qgc3RydWN0IGdmczJfaW51bSAqaW51bSwKLQkJICAgICAgIGNvbnN0IHU2NCAqZ2VuZXJhdGlvbikKKwkJICAgICAgIHVuc2lnbmVkIGludCBtb2RlLCBjb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmludW0sCisJCSAgICAgICBjb25zdCB1NjQgKmdlbmVyYXRpb24sIGRldl90IGRldikKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmRpcC0+aV9pbm9kZSk7CiAJdW5zaWduZWQgaW50IHVpZCwgZ2lkOwpAQCAtNzI2LDcgKzcxMCw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9xdW90YTsKIAotCWluaXRfZGlub2RlKGRpcCwgZ2wsIGludW0sIG1vZGUsIHVpZCwgZ2lkLCBnZW5lcmF0aW9uKTsKKwlpbml0X2Rpbm9kZShkaXAsIGdsLCBpbnVtLCBtb2RlLCB1aWQsIGdpZCwgZ2VuZXJhdGlvbiwgZGV2KTsKIAlnZnMyX3F1b3RhX2NoYW5nZShkaXAsICsxLCB1aWQsIGdpZCk7CiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIApAQCAtNzU2LDggKzc0MCw3IEBACiAJaWYgKGFsbG9jX3JlcXVpcmVkIDwgMCkKIAkJZ290byBmYWlsOwogCWlmIChhbGxvY19yZXF1aXJlZCkgewotCQllcnJvciA9IGdmczJfcXVvdGFfY2hlY2soZGlwLCBkaXAtPmlfZGkuZGlfdWlkLAotCQkJCQkgZGlwLT5pX2RpLmRpX2dpZCk7CisJCWVycm9yID0gZ2ZzMl9xdW90YV9jaGVjayhkaXAsIGRpcC0+aV9pbm9kZS5pX3VpZCwgZGlwLT5pX2lub2RlLmlfZ2lkKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBmYWlsX3F1b3RhX2xvY2tzOwogCkBAIC03NzksMTYgKzc2MiwxNiBAQAogCQkJZ290byBmYWlsX3F1b3RhX2xvY2tzOwogCX0KIAotCWVycm9yID0gZ2ZzMl9kaXJfYWRkKCZkaXAtPmlfaW5vZGUsIG5hbWUsICZpcC0+aV9udW0sIElGMkRUKGlwLT5pX2RpLmRpX21vZGUpKTsKKwllcnJvciA9IGdmczJfZGlyX2FkZCgmZGlwLT5pX2lub2RlLCBuYW1lLCAmaXAtPmlfbnVtLCBJRjJEVChpcC0+aV9pbm9kZS5pX21vZGUpKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbF9lbmRfdHJhbnM7CiAKIAllcnJvciA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZkaWJoKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbF9lbmRfdHJhbnM7Ci0JaXAtPmlfZGkuZGlfbmxpbmsgPSAxOworCWlwLT5pX2lub2RlLmlfbmxpbmsgPSAxOwogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAlicmVsc2UoZGliaCk7CiAJcmV0dXJuIDA7CiAKQEAgLTg1NywxMyArODQwLDEzIEBACiAgKi8KIAogc3RydWN0IGlub2RlICpnZnMyX2NyZWF0ZWkoc3RydWN0IGdmczJfaG9sZGVyICpnaHMsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLAotCQkJICAgdW5zaWduZWQgaW50IG1vZGUpCisJCQkgICB1bnNpZ25lZCBpbnQgbW9kZSwgZGV2X3QgZGV2KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGdmczJfaW5vZGUgKmRpcCA9IGdocy0+Z2hfZ2wtPmdsX29iamVjdDsKIAlzdHJ1Y3QgaW5vZGUgKmRpciA9ICZkaXAtPmlfaW5vZGU7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZkaXAtPmlfaW5vZGUpOwotCXN0cnVjdCBnZnMyX2ludW0gaW51bTsKKwlzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgaW51bTsKIAlpbnQgZXJyb3I7CiAJdTY0IGdlbmVyYXRpb247CiAKQEAgLTg4NywzNSArODcwLDEyIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWxfZ3VubG9jazsKIAotCWlmIChpbnVtLm5vX2FkZHIgPCBkaXAtPmlfbnVtLm5vX2FkZHIpIHsKLQkJZ2ZzMl9nbG9ja19kcShnaHMpOworCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9udW0oc2RwLCBpbnVtLm5vX2FkZHIsICZnZnMyX2lub2RlX2dsb3BzLAorCQkJCSAgTE1fU1RfRVhDTFVTSVZFLCBHTF9TS0lQLCBnaHMgKyAxKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9ndW5sb2NrOwogCi0JCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9udW0oc2RwLCBpbnVtLm5vX2FkZHIsCi0JCQkJCSAgJmdmczJfaW5vZGVfZ2xvcHMsIExNX1NUX0VYQ0xVU0lWRSwKLQkJCQkJICBHTF9TS0lQLCBnaHMgKyAxKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7Ci0JCX0KLQotCQlnZnMyX2hvbGRlcl9yZWluaXQoTE1fU1RfRVhDTFVTSVZFLCAwLCBnaHMpOwotCQllcnJvciA9IGdmczJfZ2xvY2tfbnEoZ2hzKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlnZnMyX2dsb2NrX2RxX3VuaW5pdChnaHMgKyAxKTsKLQkJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKLQkJfQotCi0JCWVycm9yID0gY3JlYXRlX29rKGRpcCwgbmFtZSwgbW9kZSk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gZmFpbF9ndW5sb2NrMjsKLQl9IGVsc2UgewotCQllcnJvciA9IGdmczJfZ2xvY2tfbnFfbnVtKHNkcCwgaW51bS5ub19hZGRyLAotCQkJCQkgICZnZnMyX2lub2RlX2dsb3BzLCBMTV9TVF9FWENMVVNJVkUsCi0JCQkJCSAgR0xfU0tJUCwgZ2hzICsgMSk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gZmFpbF9ndW5sb2NrOwotCX0KLQotCWVycm9yID0gbWFrZV9kaW5vZGUoZGlwLCBnaHNbMV0uZ2hfZ2wsIG1vZGUsICZpbnVtLCAmZ2VuZXJhdGlvbik7CisJZXJyb3IgPSBtYWtlX2Rpbm9kZShkaXAsIGdoc1sxXS5naF9nbCwgbW9kZSwgJmludW0sICZnZW5lcmF0aW9uLCBkZXYpOwogCWlmIChlcnJvcikKIAkJZ290byBmYWlsX2d1bmxvY2syOwogCkBAIC05NzIsNyArOTMyLDcgQEAKIAogCWlmIChpcC0+aV9kaS5kaV9lbnRyaWVzICE9IDIpIHsKIAkJaWYgKGdmczJfY29uc2lzdF9pbm9kZShpcCkpCi0JCQlnZnMyX2Rpbm9kZV9wcmludCgmaXAtPmlfZGkpOworCQkJZ2ZzMl9kaW5vZGVfcHJpbnQoaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTk5NCw3ICs5NTQsMTIgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWVycm9yID0gZ2ZzMl9jaGFuZ2VfbmxpbmsoaXAsIC0yKTsKKwkvKiBJdCBsb29rcyBvZGQsIGJ1dCBpdCByZWFsbHkgc2hvdWxkIGJlIGRvbmUgdHdpY2UgKi8KKwllcnJvciA9IGdmczJfY2hhbmdlX25saW5rKGlwLCAtMSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGdmczJfY2hhbmdlX25saW5rKGlwLCAtMSk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTEwMTUsMTYgKzk4MCwxNiBAQAogaW50IGdmczJfdW5saW5rX29rKHN0cnVjdCBnZnMyX2lub2RlICpkaXAsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLAogCQkgICBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7Ci0Jc3RydWN0IGdmczJfaW51bSBpbnVtOworCXN0cnVjdCBnZnMyX2ludW1faG9zdCBpbnVtOwogCXVuc2lnbmVkIGludCB0eXBlOwogCWludCBlcnJvcjsKIAogCWlmIChJU19JTU1VVEFCTEUoJmlwLT5pX2lub2RlKSB8fCBJU19BUFBFTkQoJmlwLT5pX2lub2RlKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICgoZGlwLT5pX2RpLmRpX21vZGUgJiBTX0lTVlRYKSAmJgotCSAgICBkaXAtPmlfZGkuZGlfdWlkICE9IGN1cnJlbnQtPmZzdWlkICYmCi0JICAgIGlwLT5pX2RpLmRpX3VpZCAhPSBjdXJyZW50LT5mc3VpZCAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwlpZiAoKGRpcC0+aV9pbm9kZS5pX21vZGUgJiBTX0lTVlRYKSAmJgorCSAgICBkaXAtPmlfaW5vZGUuaV91aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYKKwkgICAgaXAtPmlfaW5vZGUuaV91aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCiAJCXJldHVybiAtRVBFUk07CiAKIAlpZiAoSVNfQVBQRU5EKCZkaXAtPmlfaW5vZGUpKQpAQCAtMTA0MSw3ICsxMDA2LDcgQEAKIAlpZiAoIWdmczJfaW51bV9lcXVhbCgmaW51bSwgJmlwLT5pX251bSkpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JaWYgKElGMkRUKGlwLT5pX2RpLmRpX21vZGUpICE9IHR5cGUpIHsKKwlpZiAoSUYyRFQoaXAtPmlfaW5vZGUuaV9tb2RlKSAhPSB0eXBlKSB7CiAJCWdmczJfY29uc2lzdF9pbm9kZShkaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMTkxLDcgKzExNTYsNyBAQAogCQlyZXR1cm4gMDsKIAogCWN1cnRpbWUgPSBnZXRfc2Vjb25kcygpOwotCWlmIChjdXJ0aW1lIC0gaXAtPmlfZGkuZGlfYXRpbWUgPj0gcXVhbnR1bSkgeworCWlmIChjdXJ0aW1lIC0gaXAtPmlfaW5vZGUuaV9hdGltZS50dl9zZWMgPj0gcXVhbnR1bSkgewogCQlnZnMyX2dsb2NrX2RxKGdoKTsKIAkJZ2ZzMl9ob2xkZXJfcmVpbml0KExNX1NUX0VYQ0xVU0lWRSwgZ2gtPmdoX2ZsYWdzICYgfkxNX0ZMQUdfQU5ZLAogCQkJCSAgIGdoKTsKQEAgLTEyMDMsNyArMTE2OCw3IEBACiAJCSAgIHRyeWluZyB0byBnZXQgZXhjbHVzaXZlIGxvY2suICovCiAKIAkJY3VydGltZSA9IGdldF9zZWNvbmRzKCk7Ci0JCWlmIChjdXJ0aW1lIC0gaXAtPmlfZGkuZGlfYXRpbWUgPj0gcXVhbnR1bSkgeworCQlpZiAoY3VydGltZSAtIGlwLT5pX2lub2RlLmlfYXRpbWUudHZfc2VjID49IHF1YW50dW0pIHsKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqZGliaDsKIAkJCXN0cnVjdCBnZnMyX2Rpbm9kZSAqZGk7CiAKQEAgLTEyMTcsMTEgKzExODIsMTEgQEAKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGZhaWxfZW5kX3RyYW5zOwogCi0JCQlpcC0+aV9kaS5kaV9hdGltZSA9IGN1cnRpbWU7CisJCQlpcC0+aV9pbm9kZS5pX2F0aW1lLnR2X3NlYyA9IGN1cnRpbWU7CiAKIAkJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKIAkJCWRpID0gKHN0cnVjdCBnZnMyX2Rpbm9kZSAqKWRpYmgtPmJfZGF0YTsKLQkJCWRpLT5kaV9hdGltZSA9IGNwdV90b19iZTY0KGlwLT5pX2RpLmRpX2F0aW1lKTsKKwkJCWRpLT5kaV9hdGltZSA9IGNwdV90b19iZTY0KGlwLT5pX2lub2RlLmlfYXRpbWUudHZfc2VjKTsKIAkJCWJyZWxzZShkaWJoKTsKIAogCQkJZ2ZzMl90cmFuc19lbmQoc2RwKTsKQEAgLTEyNDYsOTIgKzEyMTEsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoqCi0gKiBnbG9ja19jb21wYXJlX2F0aW1lIC0gQ29tcGFyZSB0d28gc3RydWN0IGdmczJfZ2xvY2sgc3RydWN0dXJlcyBmb3Igc29ydAotICogQGFyZ19hOiB0aGUgZmlyc3Qgc3RydWN0dXJlCi0gKiBAYXJnX2I6IHRoZSBzZWNvbmQgc3RydWN0dXJlCi0gKgotICogUmV0dXJuczogMSBpZiBBID4gQgotICogICAgICAgICAtMSBpZiBBIDwgQgotICogICAgICAgICAgMCBpZiBBID09IEIKLSAqLwotCi1zdGF0aWMgaW50IGdsb2NrX2NvbXBhcmVfYXRpbWUoY29uc3Qgdm9pZCAqYXJnX2EsIGNvbnN0IHZvaWQgKmFyZ19iKQotewotCWNvbnN0IHN0cnVjdCBnZnMyX2hvbGRlciAqZ2hfYSA9ICooY29uc3Qgc3RydWN0IGdmczJfaG9sZGVyICoqKWFyZ19hOwotCWNvbnN0IHN0cnVjdCBnZnMyX2hvbGRlciAqZ2hfYiA9ICooY29uc3Qgc3RydWN0IGdmczJfaG9sZGVyICoqKWFyZ19iOwotCWNvbnN0IHN0cnVjdCBsbV9sb2NrbmFtZSAqYSA9ICZnaF9hLT5naF9nbC0+Z2xfbmFtZTsKLQljb25zdCBzdHJ1Y3QgbG1fbG9ja25hbWUgKmIgPSAmZ2hfYi0+Z2hfZ2wtPmdsX25hbWU7Ci0KLQlpZiAoYS0+bG5fbnVtYmVyID4gYi0+bG5fbnVtYmVyKQotCQlyZXR1cm4gMTsKLQlpZiAoYS0+bG5fbnVtYmVyIDwgYi0+bG5fbnVtYmVyKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGdoX2EtPmdoX3N0YXRlID09IExNX1NUX1NIQVJFRCAmJiBnaF9iLT5naF9zdGF0ZSA9PSBMTV9TVF9FWENMVVNJVkUpCi0JCXJldHVybiAxOwotCWlmIChnaF9hLT5naF9zdGF0ZSA9PSBMTV9TVF9TSEFSRUQgJiYgKGdoX2ItPmdoX2ZsYWdzICYgR0xfQVRJTUUpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGdmczJfZ2xvY2tfbnFfbV9hdGltZSAtIGFjcXVpcmUgbXVsdGlwbGUgZ2xvY2tzIHdoZXJlIG9uZSBtYXkgbmVlZCBhbgotICogICAgICBhdGltZSB1cGRhdGUKLSAqIEBudW1fZ2g6IHRoZSBudW1iZXIgb2Ygc3RydWN0dXJlcwotICogQGdoczogYW4gYXJyYXkgb2Ygc3RydWN0IGdmczJfaG9sZGVyIHN0cnVjdHVyZXMKLSAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MgKGFsbCBnbG9ja3MgYWNxdWlyZWQpLAotICogICAgICAgICAgZXJybm8gb24gZmFpbHVyZSAobm8gZ2xvY2tzIGFjcXVpcmVkKQotICovCi0KLWludCBnZnMyX2dsb2NrX25xX21fYXRpbWUodW5zaWduZWQgaW50IG51bV9naCwgc3RydWN0IGdmczJfaG9sZGVyICpnaHMpCi17Ci0Jc3RydWN0IGdmczJfaG9sZGVyICoqcDsKLQl1bnNpZ25lZCBpbnQgeDsKLQlpbnQgZXJyb3IgPSAwOwotCi0JaWYgKCFudW1fZ2gpCi0JCXJldHVybiAwOwotCi0JaWYgKG51bV9naCA9PSAxKSB7Ci0JCWdocy0+Z2hfZmxhZ3MgJj0gfihMTV9GTEFHX1RSWSB8IEdMX0FTWU5DKTsKLQkJaWYgKGdocy0+Z2hfZmxhZ3MgJiBHTF9BVElNRSkKLQkJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9hdGltZShnaHMpOwotCQllbHNlCi0JCQllcnJvciA9IGdmczJfZ2xvY2tfbnEoZ2hzKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXAgPSBrY2FsbG9jKG51bV9naCwgc2l6ZW9mKHN0cnVjdCBnZnMyX2hvbGRlciAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoeCA9IDA7IHggPCBudW1fZ2g7IHgrKykKLQkJcFt4XSA9ICZnaHNbeF07Ci0KLQlzb3J0KHAsIG51bV9naCwgc2l6ZW9mKHN0cnVjdCBnZnMyX2hvbGRlciAqKSwgZ2xvY2tfY29tcGFyZV9hdGltZSxOVUxMKTsKLQotCWZvciAoeCA9IDA7IHggPCBudW1fZ2g7IHgrKykgewotCQlwW3hdLT5naF9mbGFncyAmPSB+KExNX0ZMQUdfVFJZIHwgR0xfQVNZTkMpOwotCi0JCWlmIChwW3hdLT5naF9mbGFncyAmIEdMX0FUSU1FKQotCQkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2F0aW1lKHBbeF0pOwotCQllbHNlCi0JCQllcnJvciA9IGdmczJfZ2xvY2tfbnEocFt4XSk7Ci0KLQkJaWYgKGVycm9yKSB7Ci0JCQl3aGlsZSAoeC0tKQotCQkJCWdmczJfZ2xvY2tfZHEocFt4XSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWtmcmVlKHApOwotCXJldHVybiBlcnJvcjsKLX0KLQotCiBzdGF0aWMgaW50CiBfX2dmczJfc2V0YXR0cl9zaW1wbGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CkBAIC0xMzQyLDEwICsxMjIxLDggQEAKIAlpZiAoIWVycm9yKSB7CiAJCWVycm9yID0gaW5vZGVfc2V0YXR0cigmaXAtPmlfaW5vZGUsIGF0dHIpOwogCQlnZnMyX2Fzc2VydF93YXJuKEdGUzJfU0IoJmlwLT5pX2lub2RlKSwgIWVycm9yKTsKLQkJZ2ZzMl9pbm9kZV9hdHRyX291dChpcCk7Ci0KIAkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwotCQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpYmgtPmJfZGF0YSk7CiAJCWJyZWxzZShkaWJoKTsKIAl9CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5oIGIvZnMvZ2ZzMi9pbm9kZS5oCmluZGV4IGY1ZDg2MTcuLmI1N2Y0NDggMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuaAorKysgYi9mcy9nZnMyL2lub2RlLmgKQEAgLTIyLDEzICsyMiwxOSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBnZnMyX2lzX2RpcihzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7Ci0JcmV0dXJuIFNfSVNESVIoaXAtPmlfZGkuZGlfbW9kZSk7CisJcmV0dXJuIFNfSVNESVIoaXAtPmlfaW5vZGUuaV9tb2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdmczJfc2V0X2lub2RlX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CisJaW5vZGUtPmlfYmxvY2tzID0gaXAtPmlfZGkuZGlfYmxvY2tzIDw8CisJCShHRlMyX1NCKGlub2RlKS0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQgLSBHRlMyX0JBU0lDX0JMT0NLX1NISUZUKTsKIH0KIAogdm9pZCBnZnMyX2lub2RlX2F0dHJfaW4oc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKLXZvaWQgZ2ZzMl9pbm9kZV9hdHRyX291dChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwotc3RydWN0IGlub2RlICpnZnMyX2lub2RlX2xvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZ2ZzMl9pbnVtICppbnVtLCB1bnNpZ25lZCB0eXBlKTsKLXN0cnVjdCBpbm9kZSAqZ2ZzMl9pbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBnZnMyX2ludW0gKmludW0pOworc3RydWN0IGlub2RlICpnZnMyX2lub2RlX2xvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmludW0sIHVuc2lnbmVkIHR5cGUpOworc3RydWN0IGlub2RlICpnZnMyX2lsb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGdmczJfaW51bV9ob3N0ICppbnVtKTsKIAogaW50IGdmczJfaW5vZGVfcmVmcmVzaChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogCkBAIC0zNywxOSArNDMsMTUgQEAKIHN0cnVjdCBpbm9kZSAqZ2ZzMl9sb29rdXBpKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKIAkJCSAgIGludCBpc19yb290LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CiBzdHJ1Y3QgaW5vZGUgKmdmczJfY3JlYXRlaShzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdocywgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCi0JCQkgICB1bnNpZ25lZCBpbnQgbW9kZSk7CisJCQkgICB1bnNpZ25lZCBpbnQgbW9kZSwgZGV2X3QgZGV2KTsKIGludCBnZnMyX3JtZGlyaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKIAkJc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIGludCBnZnMyX3VubGlua19vayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKIAkJICAgc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIGludCBnZnMyX29rX3RvX21vdmUoc3RydWN0IGdmczJfaW5vZGUgKnRoaXMsIHN0cnVjdCBnZnMyX2lub2RlICp0byk7CiBpbnQgZ2ZzMl9yZWFkbGlua2koc3RydWN0IGdmczJfaW5vZGUgKmlwLCBjaGFyICoqYnVmLCB1bnNpZ25lZCBpbnQgKmxlbik7Ci0KIGludCBnZnMyX2dsb2NrX25xX2F0aW1lKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpOwotaW50IGdmczJfZ2xvY2tfbnFfbV9hdGltZSh1bnNpZ25lZCBpbnQgbnVtX2doLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdocyk7Ci0KIGludCBnZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyKTsKLQogc3RydWN0IGlub2RlICpnZnMyX2xvb2t1cF9zaW1wbGUoc3RydWN0IGlub2RlICpkaXAsIGNvbnN0IGNoYXIgKm5hbWUpOwogCiAjZW5kaWYgLyogX19JTk9ERV9ET1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvY2tpbmcvZGxtL3Bsb2NrLmMgYi9mcy9nZnMyL2xvY2tpbmcvZGxtL3Bsb2NrLmMKaW5kZXggNzM2NWFlYy4uMzc5OWYxOSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9sb2NraW5nL2RsbS9wbG9jay5jCisrKyBiL2ZzL2dmczIvbG9ja2luZy9kbG0vcGxvY2suYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrX2RsbV9wbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogI2luY2x1ZGUgImxvY2tfZGxtLmgiCiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbG9nLmMgYi9mcy9nZnMyL2xvZy5jCmluZGV4IDcyZWVjNjUuLjI5MTQxNWQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbG9nLmMKKysrIGIvZnMvZ2ZzMi9sb2cuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9sbV9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSAiZ2ZzMi5oIgogI2luY2x1ZGUgImluY29yZS5oIgpAQCAtMTQyLDcgKzE0Myw3IEBACiAJcmV0dXJuIGxpc3RfZW1wdHkoJmFpLT5haV9haWwxX2xpc3QpOwogfQogCi12b2lkIGdmczJfYWlsMV9zdGFydChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IGZsYWdzKQorc3RhdGljIHZvaWQgZ2ZzMl9haWwxX3N0YXJ0KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZzZHAtPnNkX2FpbDFfbGlzdDsKIAl1NjQgc3luY19nZW47CkBAIC0yNjEsNiArMjYyLDEyIEBACiAgKiBAc2RwOiBUaGUgR0ZTMiBzdXBlcmJsb2NrCiAgKiBAYmxrczogVGhlIG51bWJlciBvZiBibG9ja3MgdG8gcmVzZXJ2ZQogICoKKyAqIE5vdGUgdGhhdCB3ZSBuZXZlciBnaXZlIG91dCB0aGUgbGFzdCA2IGJsb2NrcyBvZiB0aGUgam91cm5hbC4gVGhhdHMKKyAqIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIGFyZSBhIHNtYWxsIG51bWJlciBvZiBoZWFkZXIgYmxvY2tzCisgKiBhc3NvY2lhdGVkIHdpdGggZWFjaCBsb2cgZmx1c2guIFRoZSBleGFjdCBudW1iZXIgY2FuJ3QgYmUga25vd24gdW50aWwKKyAqIGZsdXNoIHRpbWUsIHNvIHdlIGVuc3VyZSB0aGF0IHdlIGhhdmUganVzdCBlbm91Z2ggZnJlZSBibG9ja3MgYXQgYWxsCisgKiB0aW1lcyB0byBhdm9pZCBydW5uaW5nIG91dCBkdXJpbmcgYSBsb2cgZmx1c2guCisgKgogICogUmV0dXJuczogZXJybm8KICAqLwogCkBAIC0yNzQsNyArMjgxLDcgQEAKIAogCW11dGV4X2xvY2soJnNkcC0+c2RfbG9nX3Jlc2VydmVfbXV0ZXgpOwogCWdmczJfbG9nX2xvY2soc2RwKTsKLQl3aGlsZShzZHAtPnNkX2xvZ19ibGtzX2ZyZWUgPD0gYmxrcykgeworCXdoaWxlKHNkcC0+c2RfbG9nX2Jsa3NfZnJlZSA8PSAoYmxrcyArIDYpKSB7CiAJCWdmczJfbG9nX3VubG9jayhzZHApOwogCQlnZnMyX2FpbDFfZW1wdHkoc2RwLCAwKTsKIAkJZ2ZzMl9sb2dfZmx1c2goc2RwLCBOVUxMKTsKQEAgLTMxMiwxMiArMzE5LDE1IEBACiAKIHN0YXRpYyB1NjQgbG9nX2JtYXAoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBsYm4pCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNkcC0+c2RfamRlc2MtPmpkX2lub2RlOwogCWludCBlcnJvcjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmhfbWFwOworCXN0cnVjdCBidWZmZXJfaGVhZCBiaF9tYXAgPSB7IC5iX3N0YXRlID0gMCwgLmJfYmxvY2tuciA9IDAgfTsKIAotCWVycm9yID0gZ2ZzMl9ibG9ja19tYXAoc2RwLT5zZF9qZGVzYy0+amRfaW5vZGUsIGxibiwgMCwgJmJoX21hcCwgMSk7CisJYmhfbWFwLmJfc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKwllcnJvciA9IGdmczJfYmxvY2tfbWFwKGlub2RlLCBsYm4sIDAsICZiaF9tYXApOwogCWlmIChlcnJvciB8fCAhYmhfbWFwLmJfYmxvY2tucikKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZXJyb3I9JWQsIGRibj0lbGx1IGxibj0ldSIsIGVycm9yLCBiaF9tYXAuYl9ibG9ja25yLCBsYm4pOworCQlwcmludGsoS0VSTl9JTkZPICJlcnJvcj0lZCwgZGJuPSVsbHUgbGJuPSV1IiwgZXJyb3IsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoX21hcC5iX2Jsb2NrbnIsIGxibik7CiAJZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCAhZXJyb3IgJiYgYmhfbWFwLmJfYmxvY2tucik7CiAKIAlyZXR1cm4gYmhfbWFwLmJfYmxvY2tucjsKQEAgLTY0MSwxMiArNjUxLDkgQEAKIAl1cF9yZWFkKCZzZHAtPnNkX2xvZ19mbHVzaF9sb2NrKTsKIAogCWdmczJfbG9nX2xvY2soc2RwKTsKLQlpZiAoc2RwLT5zZF9sb2dfbnVtX2J1ZiA+IGdmczJfdHVuZV9nZXQoc2RwLCBndF9pbmNvcmVfbG9nX2Jsb2NrcykpIHsKLQkJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci0JCWdmczJfbG9nX2ZsdXNoKHNkcCwgTlVMTCk7Ci0JfSBlbHNlIHsKLQkJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci0JfQorCWlmIChzZHAtPnNkX2xvZ19udW1fYnVmID4gZ2ZzMl90dW5lX2dldChzZHAsIGd0X2luY29yZV9sb2dfYmxvY2tzKSkKKwkJd2FrZV91cF9wcm9jZXNzKHNkcC0+c2RfbG9nZF9wcm9jZXNzKTsKKwlnZnMyX2xvZ191bmxvY2soc2RwKTsKIH0KIAogLyoqCkBAIC02ODQsMyArNjkxLDIxIEBACiAJdXBfd3JpdGUoJnNkcC0+c2RfbG9nX2ZsdXNoX2xvY2spOwogfQogCisKKy8qKgorICogZ2ZzMl9tZXRhX3N5bmNmcyAtIHN5bmMgYWxsIHRoZSBidWZmZXJzIGluIGEgZmlsZXN5c3RlbQorICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KKyAqCisgKi8KKwordm9pZCBnZnMyX21ldGFfc3luY2ZzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQoreworCWdmczJfbG9nX2ZsdXNoKHNkcCwgTlVMTCk7CisJZm9yICg7OykgeworCQlnZnMyX2FpbDFfc3RhcnQoc2RwLCBESU9fQUxMKTsKKwkJaWYgKGdmczJfYWlsMV9lbXB0eShzZHAsIERJT19BTEwpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvZy5oIGIvZnMvZ2ZzMi9sb2cuaAppbmRleCA3ZjU3MzdkLi44ZTdhYTBmIDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvZy5oCisrKyBiL2ZzL2dmczIvbG9nLmgKQEAgLTQ4LDcgKzQ4LDYgQEAKIHVuc2lnbmVkIGludCBnZnMyX3N0cnVjdDJibGsoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBuc3RydWN0LAogCQkJICAgIHVuc2lnbmVkIGludCBzc2l6ZSk7CiAKLXZvaWQgZ2ZzMl9haWwxX3N0YXJ0KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgZmxhZ3MpOwogaW50IGdmczJfYWlsMV9lbXB0eShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IGZsYWdzKTsKIAogaW50IGdmczJfbG9nX3Jlc2VydmUoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBibGtzKTsKQEAgLTYxLDUgKzYwLDYgQEAKIHZvaWQgZ2ZzMl9sb2dfY29tbWl0KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl90cmFucyAqdHJhbnMpOwogCiB2b2lkIGdmczJfbG9nX3NodXRkb3duKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK3ZvaWQgZ2ZzMl9tZXRhX3N5bmNmcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiAKICNlbmRpZiAvKiBfX0xPR19ET1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvcHMuYyBiL2ZzL2dmczIvbG9wcy5jCmluZGV4IGFiNmQxMTEuLjRkN2Y5NGQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbG9wcy5jCisrKyBiL2ZzL2dmczIvbG9wcy5jCkBAIC0xODIsNyArMTgyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYnVmX2xvX2JlZm9yZV9zY2FuKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwKLQkJCSAgICAgICBzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyICpoZWFkLCBpbnQgcGFzcykKKwkJCSAgICAgICBzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyX2hvc3QgKmhlYWQsIGludCBwYXNzKQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQihqZC0+amRfaW5vZGUpOwogCkBAIC0zMjgsNyArMzI4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcmV2b2tlX2xvX2JlZm9yZV9zY2FuKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwKLQkJCQkgIHN0cnVjdCBnZnMyX2xvZ19oZWFkZXIgKmhlYWQsIGludCBwYXNzKQorCQkJCSAgc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0ICpoZWFkLCBpbnQgcGFzcykKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoamQtPmpkX2lub2RlKTsKIApAQCAtNTA5LDcgKzUwOSw3IEBACiB7CiAJTElTVF9IRUFEKHN0YXJ0ZWQpOwogCXN0cnVjdCBnZnMyX2J1ZmRhdGEgKmJkMSA9IE5VTEwsICpiZDIsICpiZHQ7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwsKmJoMSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgZ2ZzMl9sb2dfZGVzY3JpcHRvcik7CiAJc3RydWN0IGdmczJfbG9nX2Rlc2NyaXB0b3IgKmxkOwogCXVuc2lnbmVkIGludCBsaW1pdDsKQEAgLTUzNyw4ICs1MzcsMTMgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2NvbnRpbnVlKGJkMSwgYmR0LAogCQkJCQkJICAmc2RwLT5zZF9sb2dfbGVfZGF0YWJ1ZiwKIAkJCQkJCSAgYmRfbGUubGVfbGlzdCkgeworCQkJLyogc3RvcmUgb2ZmIHRoZSBidWZmZXIgaGVhZCBpbiBhIGxvY2FsIHB0ciBzaW5jZQorCQkJICogZ2ZzMl9idWZkYXRhIG1pZ2h0IGNoYW5nZSB3aGVuIHdlIGRyb3AgdGhlIGxvZyBsb2NrCisJCQkgKi8KKwkJCWJoMSA9IGJkMS0+YmRfYmg7CisKIAkJCS8qIEFuIG9yZGVyZWQgd3JpdGUgYnVmZmVyICovCi0JCQlpZiAoYmQxLT5iZF9iaCAmJiAhYnVmZmVyX3Bpbm5lZChiZDEtPmJkX2JoKSkgeworCQkJaWYgKGJoMSAmJiAhYnVmZmVyX3Bpbm5lZChiaDEpKSB7CiAJCQkJbGlzdF9tb3ZlKCZiZDEtPmJkX2xlLmxlX2xpc3QsICZzdGFydGVkKTsKIAkJCQlpZiAoYmQxID09IGJkMikgewogCQkJCQliZDIgPSBOVUxMOwpAQCAtNTQ3LDIwICs1NTIsMjEgQEAKIAkJCQkJCQliZF9sZS5sZV9saXN0KTsKIAkJCQl9CiAJCQkJdG90YWxfZGJ1Zi0tOwotCQkJCWlmIChiZDEtPmJkX2JoKSB7Ci0JCQkJCWdldF9iaChiZDEtPmJkX2JoKTsKLQkJCQkJaWYgKGJ1ZmZlcl9kaXJ0eShiZDEtPmJkX2JoKSkgeworCQkJCWlmIChiaDEpIHsKKwkJCQkJaWYgKGJ1ZmZlcl9kaXJ0eShiaDEpKSB7CisJCQkJCQlnZXRfYmgoYmgxKTsKKwogCQkJCQkJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7Ci0JCQkJCQl3YWl0X29uX2J1ZmZlcihiZDEtPmJkX2JoKTsKLQkJCQkJCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLAotCQkJCQkJCSAgICAmYmQxLT5iZF9iaCk7CisKKwkJCQkJCWxsX3J3X2Jsb2NrKFNXUklURSwgMSwgJmJoMSk7CisJCQkJCQlicmVsc2UoYmgxKTsKKwogCQkJCQkJZ2ZzMl9sb2dfbG9jayhzZHApOwogCQkJCQl9Ci0JCQkJCWJyZWxzZShiZDEtPmJkX2JoKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChiZDEtPmJkX2JoKSB7IC8qIEEgam91cm5hbGVkIGJ1ZmZlciAqLworCQkJfSBlbHNlIGlmIChiaDEpIHsgLyogQSBqb3VybmFsZWQgYnVmZmVyICovCiAJCQkJaW50IG1hZ2ljOwogCQkJCWdmczJfbG9nX3VubG9jayhzZHApOwogCQkJCWlmICghYmgpIHsKQEAgLTU4MiwxNiArNTg4LDE2IEBACiAJCQkJCWxkLT5sZF9kYXRhMiA9IGNwdV90b19iZTMyKDApOwogCQkJCQltZW1zZXQobGQtPmxkX3Jlc2VydmVkLCAwLCBzaXplb2YobGQtPmxkX3Jlc2VydmVkKSk7CiAJCQkJfQotCQkJCW1hZ2ljID0gZ2ZzMl9jaGVja19tYWdpYyhiZDEtPmJkX2JoKTsKLQkJCQkqcHRyKysgPSBjcHVfdG9fYmU2NChiZDEtPmJkX2JoLT5iX2Jsb2NrbnIpOworCQkJCW1hZ2ljID0gZ2ZzMl9jaGVja19tYWdpYyhiaDEpOworCQkJCSpwdHIrKyA9IGNwdV90b19iZTY0KGJoMS0+Yl9ibG9ja25yKTsKIAkJCQkqcHRyKysgPSBjcHVfdG9fYmU2NCgoX191NjQpbWFnaWMpOwotCQkJCWNsZWFyX2J1ZmZlcl9lc2NhcGVkKGJkMS0+YmRfYmgpOworCQkJCWNsZWFyX2J1ZmZlcl9lc2NhcGVkKGJoMSk7CiAJCQkJaWYgKHVubGlrZWx5KG1hZ2ljICE9IDApKQotCQkJCQlzZXRfYnVmZmVyX2VzY2FwZWQoYmQxLT5iZF9iaCk7CisJCQkJCXNldF9idWZmZXJfZXNjYXBlZChiaDEpOwogCQkJCWdmczJfbG9nX2xvY2soc2RwKTsKIAkJCQlpZiAobisrID4gbnVtKQogCQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoIWJkMS0+YmRfYmgpIHsKKwkJCX0gZWxzZSBpZiAoIWJoMSkgewogCQkJCXRvdGFsX2RidWYtLTsKIAkJCQlzZHAtPnNkX2xvZ19udW1fZGF0YWJ1Zi0tOwogCQkJCWxpc3RfZGVsX2luaXQoJmJkMS0+YmRfbGUubGVfbGlzdCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvcHMuaCBiL2ZzL2dmczIvbG9wcy5oCmluZGV4IDU4MzljMDUuLjk2NWJjNjUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbG9wcy5oCisrKyBiL2ZzL2dmczIvbG9wcy5oCkBAIC02MCw3ICs2MCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb3BzX2JlZm9yZV9zY2FuKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwKLQkJCQkgICAgc3RydWN0IGdmczJfbG9nX2hlYWRlciAqaGVhZCwKKwkJCQkgICAgc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0ICpoZWFkLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgcGFzcykKIHsKIAlpbnQgeDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbWFpbi5jIGIvZnMvZ2ZzMi9tYWluLmMKaW5kZXggMjE1MDhhMS4uN2MxYTllMiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9tYWluLmMKKysrIGIvZnMvZ2ZzMi9tYWluLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAiZ2xvY2suaCIKIAotc3RhdGljIHZvaWQgZ2ZzMl9pbml0X2lub2RlX29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGdmczJfaW5pdF9pbm9kZV9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBmb287CiAJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CkBAIC0zNyw3ICszNyw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBnZnMyX2luaXRfZ2xvY2tfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgZ2ZzMl9pbml0X2dsb2NrX29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBnZnMyX2dsb2NrICpnbCA9IGZvbzsKIAlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KQEAgLTg0LDggKzg0LDggQEAKIAogCWdmczJfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImdmczJfaW5vZGUiLAogCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGdmczJfaW5vZGUpLAotCQkJCQkgICAgICAwLCAoU0xBQl9SRUNMQUlNX0FDQ09VTlR8Ci0JCQkJCSAgICAgIFNMQUJfUEFOSUN8U0xBQl9NRU1fU1BSRUFEKSwKKwkJCQkJICAgICAgMCwgIFNMQUJfUkVDTEFJTV9BQ0NPVU5UfAorCQkJCQkgICAgICAgICAgU0xBQl9NRU1fU1BSRUFELAogCQkJCQkgICAgICBnZnMyX2luaXRfaW5vZGVfb25jZSwgTlVMTCk7CiAJaWYgKCFnZnMyX2lub2RlX2NhY2hlcCkKIAkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9tZXRhX2lvLmMgYi9mcy9nZnMyL21ldGFfaW8uYwppbmRleCAzOTEyZDZhLi4wZTM0ZDk5IDEwMDY0NAotLS0gYS9mcy9nZnMyL21ldGFfaW8uYworKysgYi9mcy9nZnMyL21ldGFfaW8uYwpAQCAtMTI3LDE3ICsxMjcsMTcgQEAKIAogLyoqCiAgKiBnZXRidWYgLSBHZXQgYSBidWZmZXIgd2l0aCBhIGdpdmVuIGFkZHJlc3Mgc3BhY2UKLSAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCi0gKiBAYXNwYWNlOiB0aGUgYWRkcmVzcyBzcGFjZQorICogQGdsOiB0aGUgZ2xvY2sKICAqIEBibGtubzogdGhlIGJsb2NrIG51bWJlciAoZmlsZXN5c3RlbSBzY29wZSkKICAqIEBjcmVhdGU6IDEgaWYgdGhlIGJ1ZmZlciBzaG91bGQgYmUgY3JlYXRlZAogICoKICAqIFJldHVybnM6IHRoZSBidWZmZXIKICAqLwogCi1zdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpnZXRidWYoc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBpbm9kZSAqYXNwYWNlLAotCQkJCSAgdTY0IGJsa25vLCBpbnQgY3JlYXRlKQorc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqZ2V0YnVmKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgdTY0IGJsa25vLCBpbnQgY3JlYXRlKQogeworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZ2wtPmdsX2FzcGFjZS0+aV9tYXBwaW5nOworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXVuc2lnbmVkIGludCBzaGlmdDsKQEAgLTE1MCwxMyArMTUwLDEzIEBACiAKIAlpZiAoY3JlYXRlKSB7CiAJCWZvciAoOzspIHsKLQkJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoYXNwYWNlLT5pX21hcHBpbmcsIGluZGV4KTsKKwkJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgpOwogCQkJaWYgKHBhZ2UpCiAJCQkJYnJlYWs7CiAJCQl5aWVsZCgpOwogCQl9CiAJfSBlbHNlIHsKLQkJcGFnZSA9IGZpbmRfbG9ja19wYWdlKGFzcGFjZS0+aV9tYXBwaW5nLCBpbmRleCk7CisJCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShtYXBwaW5nLCBpbmRleCk7CiAJCWlmICghcGFnZSkKIAkJCXJldHVybiBOVUxMOwogCX0KQEAgLTIwMiw3ICsyMDIsNyBAQAogc3RydWN0IGJ1ZmZlcl9oZWFkICpnZnMyX21ldGFfbmV3KHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgdTY0IGJsa25vKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0JYmggPSBnZXRidWYoZ2wtPmdsX3NiZCwgZ2wtPmdsX2FzcGFjZSwgYmxrbm8sIENSRUFURSk7CisJYmggPSBnZXRidWYoZ2wsIGJsa25vLCBDUkVBVEUpOwogCW1ldGFfcHJlcF9uZXcoYmgpOwogCXJldHVybiBiaDsKIH0KQEAgLTIyMCw3ICsyMjAsNyBAQAogaW50IGdmczJfbWV0YV9yZWFkKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgdTY0IGJsa25vLCBpbnQgZmxhZ3MsCiAJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocCkKIHsKLQkqYmhwID0gZ2V0YnVmKGdsLT5nbF9zYmQsIGdsLT5nbF9hc3BhY2UsIGJsa25vLCBDUkVBVEUpOworCSpiaHAgPSBnZXRidWYoZ2wsIGJsa25vLCBDUkVBVEUpOwogCWlmICghYnVmZmVyX3VwdG9kYXRlKCpiaHApKQogCQlsbF9yd19ibG9jayhSRUFEX01FVEEsIDEsIGJocCk7CiAJaWYgKGZsYWdzICYgRElPX1dBSVQpIHsKQEAgLTM3OSwxMSArMzc5LDEwIEBACiB2b2lkIGdmczJfbWV0YV93aXBlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0IGJzdGFydCwgdTMyIGJsZW4pCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7Ci0Jc3RydWN0IGlub2RlICphc3BhY2UgPSBpcC0+aV9nbC0+Z2xfYXNwYWNlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAl3aGlsZSAoYmxlbikgewotCQliaCA9IGdldGJ1ZihzZHAsIGFzcGFjZSwgYnN0YXJ0LCBOT19DUkVBVEUpOworCQliaCA9IGdldGJ1ZihpcC0+aV9nbCwgYnN0YXJ0LCBOT19DUkVBVEUpOwogCQlpZiAoYmgpIHsKIAkJCXN0cnVjdCBnZnMyX2J1ZmRhdGEgKmJkID0gYmgtPmJfcHJpdmF0ZTsKIApAQCAtNDcyLDYgKzQ3MSw5IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwsICoqYmhfc2xvdCA9IGlwLT5pX2NhY2hlICsgaGVpZ2h0OwogCWludCBpbl9jYWNoZSA9IDA7CiAKKwlCVUdfT04oIWdsKTsKKwlCVUdfT04oIXNkcCk7CisKIAlzcGluX2xvY2soJmlwLT5pX3NwaW4pOwogCWlmICgqYmhfc2xvdCAmJiAoKmJoX3Nsb3QpLT5iX2Jsb2NrbnIgPT0gbnVtKSB7CiAJCWJoID0gKmJoX3Nsb3Q7CkBAIC00ODEsNyArNDgzLDcgQEAKIAlzcGluX3VubG9jaygmaXAtPmlfc3Bpbik7CiAKIAlpZiAoIWJoKQotCQliaCA9IGdldGJ1ZihnbC0+Z2xfc2JkLCBnbC0+Z2xfYXNwYWNlLCBudW0sIENSRUFURSk7CisJCWJoID0gZ2V0YnVmKGdsLCBudW0sIENSRUFURSk7CiAKIAlpZiAoIWJoKQogCQlyZXR1cm4gLUVOT0JVRlM7CkBAIC01MzIsNyArNTM0LDYgQEAKIHN0cnVjdCBidWZmZXJfaGVhZCAqZ2ZzMl9tZXRhX3JhKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgdTY0IGRibG9jaywgdTMyIGV4dGxlbikKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGdsLT5nbF9zYmQ7Ci0Jc3RydWN0IGlub2RlICphc3BhY2UgPSBnbC0+Z2xfYXNwYWNlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZmlyc3RfYmgsICpiaDsKIAl1MzIgbWF4X3JhID0gZ2ZzMl90dW5lX2dldChzZHAsIGd0X21heF9yZWFkYWhlYWQpID4+CiAJCQkgIHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQ7CkBAIC01NDQsNyArNTQ1LDcgQEAKIAlpZiAoZXh0bGVuID4gbWF4X3JhKQogCQlleHRsZW4gPSBtYXhfcmE7CiAKLQlmaXJzdF9iaCA9IGdldGJ1ZihzZHAsIGFzcGFjZSwgZGJsb2NrLCBDUkVBVEUpOworCWZpcnN0X2JoID0gZ2V0YnVmKGdsLCBkYmxvY2ssIENSRUFURSk7CiAKIAlpZiAoYnVmZmVyX3VwdG9kYXRlKGZpcnN0X2JoKSkKIAkJZ290byBvdXQ7CkBAIC01NTUsNyArNTU2LDcgQEAKIAlleHRsZW4tLTsKIAogCXdoaWxlIChleHRsZW4pIHsKLQkJYmggPSBnZXRidWYoc2RwLCBhc3BhY2UsIGRibG9jaywgQ1JFQVRFKTsKKwkJYmggPSBnZXRidWYoZ2wsIGRibG9jaywgQ1JFQVRFKTsKIAogCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYgIWJ1ZmZlcl9sb2NrZWQoYmgpKQogCQkJbGxfcndfYmxvY2soUkVBREEsIDEsICZiaCk7CkBAIC01NzEsMjAgKzU3MiwzIEBACiAJcmV0dXJuIGZpcnN0X2JoOwogfQogCi0vKioKLSAqIGdmczJfbWV0YV9zeW5jZnMgLSBzeW5jIGFsbCB0aGUgYnVmZmVycyBpbiBhIGZpbGVzeXN0ZW0KLSAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCi0gKgotICovCi0KLXZvaWQgZ2ZzMl9tZXRhX3N5bmNmcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKLXsKLQlnZnMyX2xvZ19mbHVzaChzZHAsIE5VTEwpOwotCWZvciAoOzspIHsKLQkJZ2ZzMl9haWwxX3N0YXJ0KHNkcCwgRElPX0FMTCk7Ci0JCWlmIChnZnMyX2FpbDFfZW1wdHkoc2RwLCBESU9fQUxMKSkKLQkJCWJyZWFrOwotCQltc2xlZXAoMTApOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9tZXRhX2lvLmggYi9mcy9nZnMyL21ldGFfaW8uaAppbmRleCAzZWM5MzllLi5lMDM3NDI1IDEwMDY0NAotLS0gYS9mcy9nZnMyL21ldGFfaW8uaAorKysgYi9mcy9nZnMyL21ldGFfaW8uaApAQCAtNjcsNyArNjcsNiBAQAogfQogCiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdmczJfbWV0YV9yYShzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIHU2NCBkYmxvY2ssIHUzMiBleHRsZW4pOwotdm9pZCBnZnMyX21ldGFfc3luY2ZzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIAogI2RlZmluZSBidWZmZXJfYnVzeShiaCkgXAogKChiaCktPmJfc3RhdGUgJiAoKDF1bCA8PCBCSF9EaXJ0eSkgfCAoMXVsIDw8IEJIX0xvY2spIHwgKDF1bCA8PCBCSF9QaW5uZWQpKSkKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb25kaXNrLmMgYi9mcy9nZnMyL29uZGlzay5jCmluZGV4IDEwMjU5NjAuLmYyNDk1ZjEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb25kaXNrLmMKKysrIGIvZnMvZ2ZzMi9vbmRpc2suYwpAQCAtMTUsNiArMTUsOCBAQAogCiAjaW5jbHVkZSAiZ2ZzMi5oIgogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CisjaW5jbHVkZSA8bGludXgvbG1faW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiaW5jb3JlLmgiCiAKICNkZWZpbmUgcHYoc3RydWN0LCBtZW1iZXIsIGZtdCkgcHJpbnRrKEtFUk5fSU5GTyAiICAiI21lbWJlciIgPSAiZm10IlxuIiwgXAogCQkJCSAgICAgICBzdHJ1Y3QtPm1lbWJlcik7CkBAIC0zMiw3ICszNCw3IEBACiAgKiBmaXJzdCBhcmc6IHRoZSBjcHUtb3JkZXIgc3RydWN0dXJlCiAgKi8KIAotdm9pZCBnZnMyX2ludW1faW4oc3RydWN0IGdmczJfaW51bSAqbm8sIGNvbnN0IHZvaWQgKmJ1ZikKK3ZvaWQgZ2ZzMl9pbnVtX2luKHN0cnVjdCBnZnMyX2ludW1faG9zdCAqbm8sIGNvbnN0IHZvaWQgKmJ1ZikKIHsKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtICpzdHIgPSBidWY7CiAKQEAgLTQwLDcgKzQyLDcgQEAKIAluby0+bm9fYWRkciA9IGJlNjRfdG9fY3B1KHN0ci0+bm9fYWRkcik7CiB9CiAKLXZvaWQgZ2ZzMl9pbnVtX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtICpubywgdm9pZCAqYnVmKQordm9pZCBnZnMyX2ludW1fb3V0KGNvbnN0IHN0cnVjdCBnZnMyX2ludW1faG9zdCAqbm8sIHZvaWQgKmJ1ZikKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbnVtICpzdHIgPSBidWY7CiAKQEAgLTQ4LDEzICs1MCwxMyBAQAogCXN0ci0+bm9fYWRkciA9IGNwdV90b19iZTY0KG5vLT5ub19hZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgZ2ZzMl9pbnVtX3ByaW50KGNvbnN0IHN0cnVjdCBnZnMyX2ludW0gKm5vKQorc3RhdGljIHZvaWQgZ2ZzMl9pbnVtX3ByaW50KGNvbnN0IHN0cnVjdCBnZnMyX2ludW1faG9zdCAqbm8pCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICBub19mb3JtYWxfaW5vID0gJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyluby0+bm9fZm9ybWFsX2lubyk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICBub19hZGRyID0gJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyluby0+bm9fYWRkcik7CiB9CiAKLXN0YXRpYyB2b2lkIGdmczJfbWV0YV9oZWFkZXJfaW4oc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgKm1oLCBjb25zdCB2b2lkICpidWYpCitzdGF0aWMgdm9pZCBnZnMyX21ldGFfaGVhZGVyX2luKHN0cnVjdCBnZnMyX21ldGFfaGVhZGVyX2hvc3QgKm1oLCBjb25zdCB2b2lkICpidWYpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgKnN0ciA9IGJ1ZjsKIApAQCAtNjMsMjMgKzY1LDcgQEAKIAltaC0+bWhfZm9ybWF0ID0gYmUzMl90b19jcHUoc3RyLT5taF9mb3JtYXQpOwogfQogCi1zdGF0aWMgdm9pZCBnZnMyX21ldGFfaGVhZGVyX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciAqbWgsIHZvaWQgKmJ1ZikKLXsKLQlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciAqc3RyID0gYnVmOwotCi0Jc3RyLT5taF9tYWdpYyA9IGNwdV90b19iZTMyKG1oLT5taF9tYWdpYyk7Ci0Jc3RyLT5taF90eXBlID0gY3B1X3RvX2JlMzIobWgtPm1oX3R5cGUpOwotCXN0ci0+bWhfZm9ybWF0ID0gY3B1X3RvX2JlMzIobWgtPm1oX2Zvcm1hdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdmczJfbWV0YV9oZWFkZXJfcHJpbnQoY29uc3Qgc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgKm1oKQotewotCXB2KG1oLCBtaF9tYWdpYywgIjB4JS44WCIpOwotCXB2KG1oLCBtaF90eXBlLCAiJXUiKTsKLQlwdihtaCwgbWhfZm9ybWF0LCAiJXUiKTsKLX0KLQotdm9pZCBnZnMyX3NiX2luKHN0cnVjdCBnZnMyX3NiICpzYiwgY29uc3Qgdm9pZCAqYnVmKQordm9pZCBnZnMyX3NiX2luKHN0cnVjdCBnZnMyX3NiX2hvc3QgKnNiLCBjb25zdCB2b2lkICpidWYpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfc2IgKnN0ciA9IGJ1ZjsKIApAQCAtOTcsNyArODMsNyBAQAogCW1lbWNweShzYi0+c2JfbG9ja3RhYmxlLCBzdHItPnNiX2xvY2t0YWJsZSwgR0ZTMl9MT0NLTkFNRV9MRU4pOwogfQogCi12b2lkIGdmczJfcmluZGV4X2luKHN0cnVjdCBnZnMyX3JpbmRleCAqcmksIGNvbnN0IHZvaWQgKmJ1ZikKK3ZvaWQgZ2ZzMl9yaW5kZXhfaW4oc3RydWN0IGdmczJfcmluZGV4X2hvc3QgKnJpLCBjb25zdCB2b2lkICpidWYpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfcmluZGV4ICpzdHIgPSBidWY7CiAKQEAgLTEwOSw3ICs5NSw3IEBACiAKIH0KIAotdm9pZCBnZnMyX3JpbmRleF9wcmludChjb25zdCBzdHJ1Y3QgZ2ZzMl9yaW5kZXggKnJpKQordm9pZCBnZnMyX3JpbmRleF9wcmludChjb25zdCBzdHJ1Y3QgZ2ZzMl9yaW5kZXhfaG9zdCAqcmkpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICByaV9hZGRyID0gJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylyaS0+cmlfYWRkcik7CiAJcHYocmksIHJpX2xlbmd0aCwgIiV1Iik7CkBAIC0xMjAsMjIgKzEwNiwyMCBAQAogCXB2KHJpLCByaV9iaXRieXRlcywgIiV1Iik7CiB9CiAKLXZvaWQgZ2ZzMl9yZ3JwX2luKHN0cnVjdCBnZnMyX3JncnAgKnJnLCBjb25zdCB2b2lkICpidWYpCit2b2lkIGdmczJfcmdycF9pbihzdHJ1Y3QgZ2ZzMl9yZ3JwX2hvc3QgKnJnLCBjb25zdCB2b2lkICpidWYpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfcmdycCAqc3RyID0gYnVmOwogCi0JZ2ZzMl9tZXRhX2hlYWRlcl9pbigmcmctPnJnX2hlYWRlciwgYnVmKTsKIAlyZy0+cmdfZmxhZ3MgPSBiZTMyX3RvX2NwdShzdHItPnJnX2ZsYWdzKTsKIAlyZy0+cmdfZnJlZSA9IGJlMzJfdG9fY3B1KHN0ci0+cmdfZnJlZSk7CiAJcmctPnJnX2Rpbm9kZXMgPSBiZTMyX3RvX2NwdShzdHItPnJnX2Rpbm9kZXMpOwogCXJnLT5yZ19pZ2VuZXJhdGlvbiA9IGJlNjRfdG9fY3B1KHN0ci0+cmdfaWdlbmVyYXRpb24pOwogfQogCi12b2lkIGdmczJfcmdycF9vdXQoY29uc3Qgc3RydWN0IGdmczJfcmdycCAqcmcsIHZvaWQgKmJ1ZikKK3ZvaWQgZ2ZzMl9yZ3JwX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9yZ3JwX2hvc3QgKnJnLCB2b2lkICpidWYpCiB7CiAJc3RydWN0IGdmczJfcmdycCAqc3RyID0gYnVmOwogCi0JZ2ZzMl9tZXRhX2hlYWRlcl9vdXQoJnJnLT5yZ19oZWFkZXIsIGJ1Zik7CiAJc3RyLT5yZ19mbGFncyA9IGNwdV90b19iZTMyKHJnLT5yZ19mbGFncyk7CiAJc3RyLT5yZ19mcmVlID0gY3B1X3RvX2JlMzIocmctPnJnX2ZyZWUpOwogCXN0ci0+cmdfZGlub2RlcyA9IGNwdV90b19iZTMyKHJnLT5yZ19kaW5vZGVzKTsKQEAgLTE0NCw3ICsxMjgsNyBAQAogCW1lbXNldCgmc3RyLT5yZ19yZXNlcnZlZCwgMCwgc2l6ZW9mKHN0ci0+cmdfcmVzZXJ2ZWQpKTsKIH0KIAotdm9pZCBnZnMyX3F1b3RhX2luKHN0cnVjdCBnZnMyX3F1b3RhICpxdSwgY29uc3Qgdm9pZCAqYnVmKQordm9pZCBnZnMyX3F1b3RhX2luKHN0cnVjdCBnZnMyX3F1b3RhX2hvc3QgKnF1LCBjb25zdCB2b2lkICpidWYpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfcXVvdGEgKnN0ciA9IGJ1ZjsKIApAQCAtMTUzLDk2ICsxMzcsNTYgQEAKIAlxdS0+cXVfdmFsdWUgPSBiZTY0X3RvX2NwdShzdHItPnF1X3ZhbHVlKTsKIH0KIAotdm9pZCBnZnMyX2Rpbm9kZV9pbihzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpLCBjb25zdCB2b2lkICpidWYpCit2b2lkIGdmczJfZGlub2RlX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHZvaWQgKmJ1ZikKIHsKLQljb25zdCBzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKnN0ciA9IGJ1ZjsKLQotCWdmczJfbWV0YV9oZWFkZXJfaW4oJmRpLT5kaV9oZWFkZXIsIGJ1Zik7Ci0JZ2ZzMl9pbnVtX2luKCZkaS0+ZGlfbnVtLCAmc3RyLT5kaV9udW0pOwotCi0JZGktPmRpX21vZGUgPSBiZTMyX3RvX2NwdShzdHItPmRpX21vZGUpOwotCWRpLT5kaV91aWQgPSBiZTMyX3RvX2NwdShzdHItPmRpX3VpZCk7Ci0JZGktPmRpX2dpZCA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfZ2lkKTsKLQlkaS0+ZGlfbmxpbmsgPSBiZTMyX3RvX2NwdShzdHItPmRpX25saW5rKTsKLQlkaS0+ZGlfc2l6ZSA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfc2l6ZSk7Ci0JZGktPmRpX2Jsb2NrcyA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfYmxvY2tzKTsKLQlkaS0+ZGlfYXRpbWUgPSBiZTY0X3RvX2NwdShzdHItPmRpX2F0aW1lKTsKLQlkaS0+ZGlfbXRpbWUgPSBiZTY0X3RvX2NwdShzdHItPmRpX210aW1lKTsKLQlkaS0+ZGlfY3RpbWUgPSBiZTY0X3RvX2NwdShzdHItPmRpX2N0aW1lKTsKLQlkaS0+ZGlfbWFqb3IgPSBiZTMyX3RvX2NwdShzdHItPmRpX21ham9yKTsKLQlkaS0+ZGlfbWlub3IgPSBiZTMyX3RvX2NwdShzdHItPmRpX21pbm9yKTsKLQotCWRpLT5kaV9nb2FsX21ldGEgPSBiZTY0X3RvX2NwdShzdHItPmRpX2dvYWxfbWV0YSk7Ci0JZGktPmRpX2dvYWxfZGF0YSA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfZ29hbF9kYXRhKTsKLQlkaS0+ZGlfZ2VuZXJhdGlvbiA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfZ2VuZXJhdGlvbik7Ci0KLQlkaS0+ZGlfZmxhZ3MgPSBiZTMyX3RvX2NwdShzdHItPmRpX2ZsYWdzKTsKLQlkaS0+ZGlfcGF5bG9hZF9mb3JtYXQgPSBiZTMyX3RvX2NwdShzdHItPmRpX3BheWxvYWRfZm9ybWF0KTsKLQlkaS0+ZGlfaGVpZ2h0ID0gYmUxNl90b19jcHUoc3RyLT5kaV9oZWlnaHQpOwotCi0JZGktPmRpX2RlcHRoID0gYmUxNl90b19jcHUoc3RyLT5kaV9kZXB0aCk7Ci0JZGktPmRpX2VudHJpZXMgPSBiZTMyX3RvX2NwdShzdHItPmRpX2VudHJpZXMpOwotCi0JZGktPmRpX2VhdHRyID0gYmU2NF90b19jcHUoc3RyLT5kaV9lYXR0cik7Ci0KLX0KLQotdm9pZCBnZnMyX2Rpbm9kZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfZGlub2RlICpkaSwgdm9pZCAqYnVmKQoteworCWNvbnN0IHN0cnVjdCBnZnMyX2Rpbm9kZV9ob3N0ICpkaSA9ICZpcC0+aV9kaTsKIAlzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKnN0ciA9IGJ1ZjsKIAotCWdmczJfbWV0YV9oZWFkZXJfb3V0KCZkaS0+ZGlfaGVhZGVyLCBidWYpOwotCWdmczJfaW51bV9vdXQoJmRpLT5kaV9udW0sIChjaGFyICopJnN0ci0+ZGlfbnVtKTsKKwlzdHItPmRpX2hlYWRlci5taF9tYWdpYyA9IGNwdV90b19iZTMyKEdGUzJfTUFHSUMpOworCXN0ci0+ZGlfaGVhZGVyLm1oX3R5cGUgPSBjcHVfdG9fYmUzMihHRlMyX01FVEFUWVBFX0RJKTsKKwlzdHItPmRpX2hlYWRlci5fX3BhZDAgPSAwOworCXN0ci0+ZGlfaGVhZGVyLm1oX2Zvcm1hdCA9IGNwdV90b19iZTMyKEdGUzJfRk9STUFUX0RJKTsKKwlzdHItPmRpX2hlYWRlci5fX3BhZDEgPSAwOwogCi0Jc3RyLT5kaV9tb2RlID0gY3B1X3RvX2JlMzIoZGktPmRpX21vZGUpOwotCXN0ci0+ZGlfdWlkID0gY3B1X3RvX2JlMzIoZGktPmRpX3VpZCk7Ci0Jc3RyLT5kaV9naWQgPSBjcHVfdG9fYmUzMihkaS0+ZGlfZ2lkKTsKLQlzdHItPmRpX25saW5rID0gY3B1X3RvX2JlMzIoZGktPmRpX25saW5rKTsKKwlnZnMyX2ludW1fb3V0KCZpcC0+aV9udW0sICZzdHItPmRpX251bSk7CisKKwlzdHItPmRpX21vZGUgPSBjcHVfdG9fYmUzMihpcC0+aV9pbm9kZS5pX21vZGUpOworCXN0ci0+ZGlfdWlkID0gY3B1X3RvX2JlMzIoaXAtPmlfaW5vZGUuaV91aWQpOworCXN0ci0+ZGlfZ2lkID0gY3B1X3RvX2JlMzIoaXAtPmlfaW5vZGUuaV9naWQpOworCXN0ci0+ZGlfbmxpbmsgPSBjcHVfdG9fYmUzMihpcC0+aV9pbm9kZS5pX25saW5rKTsKIAlzdHItPmRpX3NpemUgPSBjcHVfdG9fYmU2NChkaS0+ZGlfc2l6ZSk7CiAJc3RyLT5kaV9ibG9ja3MgPSBjcHVfdG9fYmU2NChkaS0+ZGlfYmxvY2tzKTsKLQlzdHItPmRpX2F0aW1lID0gY3B1X3RvX2JlNjQoZGktPmRpX2F0aW1lKTsKLQlzdHItPmRpX210aW1lID0gY3B1X3RvX2JlNjQoZGktPmRpX210aW1lKTsKLQlzdHItPmRpX2N0aW1lID0gY3B1X3RvX2JlNjQoZGktPmRpX2N0aW1lKTsKLQlzdHItPmRpX21ham9yID0gY3B1X3RvX2JlMzIoZGktPmRpX21ham9yKTsKLQlzdHItPmRpX21pbm9yID0gY3B1X3RvX2JlMzIoZGktPmRpX21pbm9yKTsKKwlzdHItPmRpX2F0aW1lID0gY3B1X3RvX2JlNjQoaXAtPmlfaW5vZGUuaV9hdGltZS50dl9zZWMpOworCXN0ci0+ZGlfbXRpbWUgPSBjcHVfdG9fYmU2NChpcC0+aV9pbm9kZS5pX210aW1lLnR2X3NlYyk7CisJc3RyLT5kaV9jdGltZSA9IGNwdV90b19iZTY0KGlwLT5pX2lub2RlLmlfY3RpbWUudHZfc2VjKTsKIAogCXN0ci0+ZGlfZ29hbF9tZXRhID0gY3B1X3RvX2JlNjQoZGktPmRpX2dvYWxfbWV0YSk7CiAJc3RyLT5kaV9nb2FsX2RhdGEgPSBjcHVfdG9fYmU2NChkaS0+ZGlfZ29hbF9kYXRhKTsKIAlzdHItPmRpX2dlbmVyYXRpb24gPSBjcHVfdG9fYmU2NChkaS0+ZGlfZ2VuZXJhdGlvbik7CiAKIAlzdHItPmRpX2ZsYWdzID0gY3B1X3RvX2JlMzIoZGktPmRpX2ZsYWdzKTsKLQlzdHItPmRpX3BheWxvYWRfZm9ybWF0ID0gY3B1X3RvX2JlMzIoZGktPmRpX3BheWxvYWRfZm9ybWF0KTsKIAlzdHItPmRpX2hlaWdodCA9IGNwdV90b19iZTE2KGRpLT5kaV9oZWlnaHQpOwotCisJc3RyLT5kaV9wYXlsb2FkX2Zvcm1hdCA9IGNwdV90b19iZTMyKFNfSVNESVIoaXAtPmlfaW5vZGUuaV9tb2RlKSAmJgorCQkJCQkgICAgICEoaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpID8KKwkJCQkJICAgICBHRlMyX0ZPUk1BVF9ERSA6IDApOwogCXN0ci0+ZGlfZGVwdGggPSBjcHVfdG9fYmUxNihkaS0+ZGlfZGVwdGgpOwogCXN0ci0+ZGlfZW50cmllcyA9IGNwdV90b19iZTMyKGRpLT5kaV9lbnRyaWVzKTsKIAogCXN0ci0+ZGlfZWF0dHIgPSBjcHVfdG9fYmU2NChkaS0+ZGlfZWF0dHIpOwotCiB9CiAKLXZvaWQgZ2ZzMl9kaW5vZGVfcHJpbnQoY29uc3Qgc3RydWN0IGdmczJfZGlub2RlICpkaSkKK3ZvaWQgZ2ZzMl9kaW5vZGVfcHJpbnQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwKQogewotCWdmczJfbWV0YV9oZWFkZXJfcHJpbnQoJmRpLT5kaV9oZWFkZXIpOwotCWdmczJfaW51bV9wcmludCgmZGktPmRpX251bSk7CisJY29uc3Qgc3RydWN0IGdmczJfZGlub2RlX2hvc3QgKmRpID0gJmlwLT5pX2RpOwogCi0JcHYoZGksIGRpX21vZGUsICIwJW8iKTsKLQlwdihkaSwgZGlfdWlkLCAiJXUiKTsKLQlwdihkaSwgZGlfZ2lkLCAiJXUiKTsKLQlwdihkaSwgZGlfbmxpbmssICIldSIpOworCWdmczJfaW51bV9wcmludCgmaXAtPmlfbnVtKTsKKwogCXByaW50ayhLRVJOX0lORk8gIiAgZGlfc2l6ZSA9ICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZGktPmRpX3NpemUpOwogCXByaW50ayhLRVJOX0lORk8gIiAgZGlfYmxvY2tzID0gJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylkaS0+ZGlfYmxvY2tzKTsKLQlwcmludGsoS0VSTl9JTkZPICIgIGRpX2F0aW1lID0gJWxsZFxuIiwgKGxvbmcgbG9uZylkaS0+ZGlfYXRpbWUpOwotCXByaW50ayhLRVJOX0lORk8gIiAgZGlfbXRpbWUgPSAlbGxkXG4iLCAobG9uZyBsb25nKWRpLT5kaV9tdGltZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICBkaV9jdGltZSA9ICVsbGRcbiIsIChsb25nIGxvbmcpZGktPmRpX2N0aW1lKTsKLQlwdihkaSwgZGlfbWFqb3IsICIldSIpOwotCXB2KGRpLCBkaV9taW5vciwgIiV1Iik7Ci0KIAlwcmludGsoS0VSTl9JTkZPICIgIGRpX2dvYWxfbWV0YSA9ICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZGktPmRpX2dvYWxfbWV0YSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICBkaV9nb2FsX2RhdGEgPSAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWRpLT5kaV9nb2FsX2RhdGEpOwogCiAJcHYoZGksIGRpX2ZsYWdzLCAiMHglLjhYIik7Ci0JcHYoZGksIGRpX3BheWxvYWRfZm9ybWF0LCAiJXUiKTsKIAlwdihkaSwgZGlfaGVpZ2h0LCAiJXUiKTsKIAogCXB2KGRpLCBkaV9kZXB0aCwgIiV1Iik7CkBAIC0yNTEsNyArMTk1LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICIgIGRpX2VhdHRyID0gJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylkaS0+ZGlfZWF0dHIpOwogfQogCi12b2lkIGdmczJfbG9nX2hlYWRlcl9pbihzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyICpsaCwgY29uc3Qgdm9pZCAqYnVmKQordm9pZCBnZnMyX2xvZ19oZWFkZXJfaW4oc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0ICpsaCwgY29uc3Qgdm9pZCAqYnVmKQogewogCWNvbnN0IHN0cnVjdCBnZnMyX2xvZ19oZWFkZXIgKnN0ciA9IGJ1ZjsKIApAQCAtMjYzLDcgKzIwNyw3IEBACiAJbGgtPmxoX2hhc2ggPSBiZTMyX3RvX2NwdShzdHItPmxoX2hhc2gpOwogfQogCi12b2lkIGdmczJfaW51bV9yYW5nZV9pbihzdHJ1Y3QgZ2ZzMl9pbnVtX3JhbmdlICppciwgY29uc3Qgdm9pZCAqYnVmKQordm9pZCBnZnMyX2ludW1fcmFuZ2VfaW4oc3RydWN0IGdmczJfaW51bV9yYW5nZV9ob3N0ICppciwgY29uc3Qgdm9pZCAqYnVmKQogewogCWNvbnN0IHN0cnVjdCBnZnMyX2ludW1fcmFuZ2UgKnN0ciA9IGJ1ZjsKIApAQCAtMjcxLDcgKzIxNSw3IEBACiAJaXItPmlyX2xlbmd0aCA9IGJlNjRfdG9fY3B1KHN0ci0+aXJfbGVuZ3RoKTsKIH0KIAotdm9pZCBnZnMyX2ludW1fcmFuZ2Vfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX2ludW1fcmFuZ2UgKmlyLCB2b2lkICpidWYpCit2b2lkIGdmczJfaW51bV9yYW5nZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfaW51bV9yYW5nZV9ob3N0ICppciwgdm9pZCAqYnVmKQogewogCXN0cnVjdCBnZnMyX2ludW1fcmFuZ2UgKnN0ciA9IGJ1ZjsKIApAQCAtMjc5LDcgKzIyMyw3IEBACiAJc3RyLT5pcl9sZW5ndGggPSBjcHVfdG9fYmU2NChpci0+aXJfbGVuZ3RoKTsKIH0KIAotdm9pZCBnZnMyX3N0YXRmc19jaGFuZ2VfaW4oc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqc2MsIGNvbnN0IHZvaWQgKmJ1ZikKK3ZvaWQgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2luKHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqc2MsIGNvbnN0IHZvaWQgKmJ1ZikKIHsKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlICpzdHIgPSBidWY7CiAKQEAgLTI4OCw3ICsyMzIsNyBAQAogCXNjLT5zY19kaW5vZGVzID0gYmU2NF90b19jcHUoc3RyLT5zY19kaW5vZGVzKTsKIH0KIAotdm9pZCBnZnMyX3N0YXRmc19jaGFuZ2Vfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2UgKnNjLCB2b2lkICpidWYpCit2b2lkIGdmczJfc3RhdGZzX2NoYW5nZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYywgdm9pZCAqYnVmKQogewogCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2UgKnN0ciA9IGJ1ZjsKIApAQCAtMjk3LDcgKzI0MSw3IEBACiAJc3RyLT5zY19kaW5vZGVzID0gY3B1X3RvX2JlNjQoc2MtPnNjX2Rpbm9kZXMpOwogfQogCi12b2lkIGdmczJfcXVvdGFfY2hhbmdlX2luKHN0cnVjdCBnZnMyX3F1b3RhX2NoYW5nZSAqcWMsIGNvbnN0IHZvaWQgKmJ1ZikKK3ZvaWQgZ2ZzMl9xdW90YV9jaGFuZ2VfaW4oc3RydWN0IGdmczJfcXVvdGFfY2hhbmdlX2hvc3QgKnFjLCBjb25zdCB2b2lkICpidWYpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfcXVvdGFfY2hhbmdlICpzdHIgPSBidWY7CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2FkZHJlc3MuYyBiL2ZzL2dmczIvb3BzX2FkZHJlc3MuYwppbmRleCBlMDU5OWZlLi5kOGQ2OWE3IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19hZGRyZXNzLmMKKysrIGIvZnMvZ2ZzMi9vcHNfYWRkcmVzcy5jCkBAIC02NSw3ICs2NSw3IEBACiBpbnQgZ2ZzMl9nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgbGJsb2NrLAogCSAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0JcmV0dXJuIGdmczJfYmxvY2tfbWFwKGlub2RlLCBsYmxvY2ssIGNyZWF0ZSwgYmhfcmVzdWx0LCAzMik7CisJcmV0dXJuIGdmczJfYmxvY2tfbWFwKGlub2RlLCBsYmxvY2ssIGNyZWF0ZSwgYmhfcmVzdWx0KTsKIH0KIAogLyoqCkBAIC04Myw3ICs4Myw3IEBACiB7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBnZnMyX2Jsb2NrX21hcChpbm9kZSwgbGJsb2NrLCAwLCBiaF9yZXN1bHQsIDEpOworCWVycm9yID0gZ2ZzMl9ibG9ja19tYXAoaW5vZGUsIGxibG9jaywgMCwgYmhfcmVzdWx0KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAlpZiAoYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkKQEAgLTk0LDcgKzk0LDcgQEAKIHN0YXRpYyBpbnQgZ2ZzMl9nZXRfYmxvY2tfZGlyZWN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGxibG9jaywKIAkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0JcmV0dXJuIGdmczJfYmxvY2tfbWFwKGlub2RlLCBsYmxvY2ssIDAsIGJoX3Jlc3VsdCwgMzIpOworCXJldHVybiBnZnMyX2Jsb2NrX21hcChpbm9kZSwgbGJsb2NrLCAwLCBiaF9yZXN1bHQpOwogfQogCiAvKioKQEAgLTE1NiwxOSArMTU2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB6ZXJvX3JlYWRwYWdlKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXZvaWQgKmthZGRyOwotCi0Ja2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JbWVtc2V0KGthZGRyLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOwotCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQotCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLQotCXJldHVybiAwOwotfQotCiAvKioKICAqIHN0dWZmZWRfcmVhZHBhZ2UgLSBGaWxsIGluIGEgTGludXggcGFnZSB3aXRoIHN0dWZmZWQgZmlsZSBkYXRhCiAgKiBAaXA6IHRoZSBpbm9kZQpAQCAtMTgzLDkgKzE3MCw3IEBACiAJdm9pZCAqa2FkZHI7CiAJaW50IGVycm9yOwogCi0JLyogT25seSB0aGUgZmlyc3QgcGFnZSBvZiBhIHN0dWZmZWQgZmlsZSBtaWdodCBjb250YWluIGRhdGEgKi8KLQlpZiAodW5saWtlbHkocGFnZS0+aW5kZXgpKQotCQlyZXR1cm4gemVyb19yZWFkcGFnZShwYWdlKTsKKwlCVUdfT04ocGFnZS0+aW5kZXgpOwogCiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJaWYgKGVycm9yKQpAQCAtMjMwLDkgKzIxNSw5IEBACiAJCQkJLyogZ2ZzMl9zaGFyZXdyaXRlX25vcGFnZSBoYXMgZ3JhYmJlZCB0aGUgaXAtPmlfZ2wgYWxyZWFkeSAqLwogCQkJCWdvdG8gc2tpcF9sb2NrOwogCQl9Ci0JCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgR0xfQVRJTUV8R0xfQU9QLCAmZ2gpOworCQlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIEdMX0FUSU1FfExNX0ZMQUdfVFJZXzFDQiwgJmdoKTsKIAkJZG9fdW5sb2NrID0gMTsKLQkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX21fYXRpbWUoMSwgJmdoKTsKKwkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2F0aW1lKCZnaCk7CiAJCWlmICh1bmxpa2VseShlcnJvcikpCiAJCQlnb3RvIG91dF91bmxvY2s7CiAJfQpAQCAtMjU0LDYgKzIzOSw4IEBACiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogb3V0X3VubG9jazoKKwlpZiAoZXJyb3IgPT0gR0xSX1RSWUZBSUxFRCkKKwkJZXJyb3IgPSBBT1BfVFJVTkNBVEVEX1BBR0U7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJaWYgKGRvX3VubG9jaykKIAkJZ2ZzMl9ob2xkZXJfdW5pbml0KCZnaCk7CkBAIC0yOTMsOSArMjgwLDkgQEAKIAkJCQlnb3RvIHNraXBfbG9jazsKIAkJfQogCQlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsCi0JCQkJIExNX0ZMQUdfVFJZXzFDQnxHTF9BVElNRXxHTF9BT1AsICZnaCk7CisJCQkJIExNX0ZMQUdfVFJZXzFDQnxHTF9BVElNRSwgJmdoKTsKIAkJZG9fdW5sb2NrID0gMTsKLQkJcmV0ID0gZ2ZzMl9nbG9ja19ucV9tX2F0aW1lKDEsICZnaCk7CisJCXJldCA9IGdmczJfZ2xvY2tfbnFfYXRpbWUoJmdoKTsKIAkJaWYgKHJldCA9PSBHTFJfVFJZRkFJTEVEKQogCQkJZ290byBvdXRfbm9lcnJvcjsKIAkJaWYgKHVubGlrZWx5KHJldCkpCkBAIC0zMzcsMTMgKzMyNCw2IEBACiBvdXRfbm9lcnJvcjoKIAlyZXQgPSAwOwogb3V0X3VubG9jazoKLQkvKiB1bmxvY2sgYWxsIHBhZ2VzLCB3ZSBjYW4ndCBkbyBhbnkgSS9PIHJpZ2h0IG5vdyAqLwotCWZvciAocGFnZV9pZHggPSAwOyBwYWdlX2lkeCA8IG5yX3BhZ2VzOyBwYWdlX2lkeCsrKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gbGlzdF9lbnRyeShwYWdlcy0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7Ci0JCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCX0KIAlpZiAoZG9fdW5sb2NrKQogCQlnZnMyX2hvbGRlcl91bmluaXQoJmdoKTsKIAlnb3RvIG91dDsKQEAgLTM3MywxMCArMzUzLDEzIEBACiAJdW5zaWduZWQgaW50IHdyaXRlX2xlbiA9IHRvIC0gZnJvbTsKIAogCi0JZ2ZzMl9ob2xkZXJfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCBHTF9BVElNRXxHTF9BT1AsICZpcC0+aV9naCk7Ci0JZXJyb3IgPSBnZnMyX2dsb2NrX25xX21fYXRpbWUoMSwgJmlwLT5pX2doKTsKLQlpZiAoZXJyb3IpCisJZ2ZzMl9ob2xkZXJfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCBHTF9BVElNRXxMTV9GTEFHX1RSWV8xQ0IsICZpcC0+aV9naCk7CisJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2F0aW1lKCZpcC0+aV9naCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkgeworCQlpZiAoZXJyb3IgPT0gR0xSX1RSWUZBSUxFRCkKKwkJCWVycm9yID0gQU9QX1RSVU5DQVRFRF9QQUdFOwogCQlnb3RvIG91dF91bmluaXQ7CisJfQogCiAJZ2ZzMl93cml0ZV9jYWxjX3Jlc2VydihpcCwgd3JpdGVfbGVuLCAmZGF0YV9ibG9ja3MsICZpbmRfYmxvY2tzKTsKIApAQCAtMzkzLDcgKzM3Niw3IEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2FsbG9jX3B1dDsKIAotCQllcnJvciA9IGdmczJfcXVvdGFfY2hlY2soaXAsIGlwLT5pX2RpLmRpX3VpZCwgaXAtPmlfZGkuZGlfZ2lkKTsKKwkJZXJyb3IgPSBnZnMyX3F1b3RhX2NoZWNrKGlwLCBpcC0+aV9pbm9kZS5pX3VpZCwgaXAtPmlfaW5vZGUuaV9naWQpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9xdW5sb2NrOwogCkBAIC00ODksOCArNDcyLDEwIEBACiAKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCi0JCWlmIChpbm9kZS0+aV9zaXplIDwgZmlsZV9zaXplKQorCQlpZiAoaW5vZGUtPmlfc2l6ZSA8IGZpbGVfc2l6ZSkgewogCQkJaV9zaXplX3dyaXRlKGlub2RlLCBmaWxlX3NpemUpOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCX0KIAl9IGVsc2UgewogCQlpZiAoc2RwLT5zZF9hcmdzLmFyX2RhdGEgPT0gR0ZTMl9EQVRBX09SREVSRUQgfHwKIAkJICAgIGdmczJfaXNfamRhdGEoaXApKQpAQCAtNTA1LDExICs0OTAsNiBAQAogCQlkaS0+ZGlfc2l6ZSA9IGNwdV90b19iZTY0KGlub2RlLT5pX3NpemUpOwogCX0KIAotCWRpLT5kaV9tb2RlID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfbW9kZSk7Ci0JZGktPmRpX2F0aW1lID0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfYXRpbWUudHZfc2VjKTsKLQlkaS0+ZGlfbXRpbWUgPSBjcHVfdG9fYmU2NChpbm9kZS0+aV9tdGltZS50dl9zZWMpOwotCWRpLT5kaV9jdGltZSA9IGNwdV90b19iZTY0KGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7Ci0KIAlicmVsc2UoZGliaCk7CiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAlpZiAoYWwtPmFsX3JlcXVlc3RlZCkgewpAQCAtNjMxLDcgKzYxMSw3IEBACiAJICogb24gdGhpcyBwYXRoLiBBbGwgd2UgbmVlZCBjaGFuZ2UgaXMgYXRpbWUuCiAJICovCiAJZ2ZzMl9ob2xkZXJfaW5pdChpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCBHTF9BVElNRSwgJmdoKTsKLQlydiA9IGdmczJfZ2xvY2tfbnFfbV9hdGltZSgxLCAmZ2gpOworCXJ2ID0gZ2ZzMl9nbG9ja19ucV9hdGltZSgmZ2gpOwogCWlmIChydikKIAkJZ290byBvdXQ7CiAKQEAgLTc0NCw2ICs3MjQsOSBAQAogCQkJaWYgKCFhdG9taWNfcmVhZCgmYXNwYWNlLT5pX3dyaXRlY291bnQpKQogCQkJCXJldHVybiAwOwogCisJCQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKQorCQkJCXJldHVybiAwOworCiAJCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0KSkgewogCQkJCXN0dWNrX3JlbGVhc2VwYWdlKGJoKTsKIAkJCQkvKiBzaG91bGQgd2Ugd2l0aGRyYXcgaGVyZT8gKi8KZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2RlbnRyeS5jIGIvZnMvZ2ZzMi9vcHNfZGVudHJ5LmMKaW5kZXggMDAwNDFiMS4uZDM1NTg5OSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZGVudHJ5LmMKKysrIGIvZnMvZ2ZzMi9vcHNfZGVudHJ5LmMKQEAgLTQzLDcgKzQzLDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBnZnMyX2hvbGRlciBkX2doOwogCXN0cnVjdCBnZnMyX2lub2RlICppcDsKLQlzdHJ1Y3QgZ2ZzMl9pbnVtIGludW07CisJc3RydWN0IGdmczJfaW51bV9ob3N0IGludW07CiAJdW5zaWduZWQgaW50IHR5cGU7CiAJaW50IGVycm9yOwogCkBAIC03Niw3ICs3Niw3IEBACiAJaWYgKCFnZnMyX2ludW1fZXF1YWwoJmlwLT5pX251bSwgJmludW0pKQogCQlnb3RvIGludmFsaWRfZ3VubG9jazsKIAotCWlmIChJRjJEVChpcC0+aV9kaS5kaV9tb2RlKSAhPSB0eXBlKSB7CisJaWYgKElGMkRUKGlwLT5pX2lub2RlLmlfbW9kZSkgIT0gdHlwZSkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKIAkJZ290byBmYWlsX2d1bmxvY2s7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMgYi9mcy9nZnMyL29wc19leHBvcnQuYwppbmRleCA4NjEyN2Q5Li5iNGU3Yjg3IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19leHBvcnQuYworKysgYi9mcy9nZnMyL29wc19leHBvcnQuYwpAQCAtMjcsMTUgKzI3LDE2IEBACiAjaW5jbHVkZSAidXRpbC5oIgogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2ZzMl9kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkgICAgIF9fdTMyICpmaCwKKwkJCQkgICAgIF9fdTMyICpwLAogCQkJCSAgICAgaW50IGZoX2xlbiwKIAkJCQkgICAgIGludCBmaF90eXBlLAogCQkJCSAgICAgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwKIAkJCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpLAogCQkJCSAgICAgdm9pZCAqY29udGV4dCkKIHsKKwlfX2JlMzIgKmZoID0gKF9fZm9yY2UgX19iZTMyICopcDsKIAlzdHJ1Y3QgZ2ZzMl9maF9vYmogZmhfb2JqOwotCXN0cnVjdCBnZnMyX2ludW0gKnRoaXMsIHBhcmVudDsKKwlzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKnRoaXMsIHBhcmVudDsKIAogCWlmIChmaF90eXBlICE9IGZoX2xlbikKIAkJcmV0dXJuIE5VTEw7CkBAIC02NSw5ICs2NiwxMCBAQAogCQkJCQkJICAgIGFjY2VwdGFibGUsIGNvbnRleHQpOwogfQogCi1zdGF0aWMgaW50IGdmczJfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKmZoLCBpbnQgKmxlbiwKK3N0YXRpYyBpbnQgZ2ZzMl9lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqcCwgaW50ICpsZW4sCiAJCQkgIGludCBjb25uZWN0YWJsZSkKIHsKKwlfX2JlMzIgKmZoID0gKF9fZm9yY2UgX19iZTMyICopcDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwpAQCAtNzYsMTQgKzc4LDEwIEBACiAJICAgIChjb25uZWN0YWJsZSAmJiAqbGVuIDwgR0ZTMl9MQVJHRV9GSF9TSVpFKSkKIAkJcmV0dXJuIDI1NTsKIAotCWZoWzBdID0gaXAtPmlfbnVtLm5vX2Zvcm1hbF9pbm8gPj4gMzI7Ci0JZmhbMF0gPSBjcHVfdG9fYmUzMihmaFswXSk7Ci0JZmhbMV0gPSBpcC0+aV9udW0ubm9fZm9ybWFsX2lubyAmIDB4RkZGRkZGRkY7Ci0JZmhbMV0gPSBjcHVfdG9fYmUzMihmaFsxXSk7Ci0JZmhbMl0gPSBpcC0+aV9udW0ubm9fYWRkciA+PiAzMjsKLQlmaFsyXSA9IGNwdV90b19iZTMyKGZoWzJdKTsKLQlmaFszXSA9IGlwLT5pX251bS5ub19hZGRyICYgMHhGRkZGRkZGRjsKLQlmaFszXSA9IGNwdV90b19iZTMyKGZoWzNdKTsKKwlmaFswXSA9IGNwdV90b19iZTMyKGlwLT5pX251bS5ub19mb3JtYWxfaW5vID4+IDMyKTsKKwlmaFsxXSA9IGNwdV90b19iZTMyKGlwLT5pX251bS5ub19mb3JtYWxfaW5vICYgMHhGRkZGRkZGRik7CisJZmhbMl0gPSBjcHVfdG9fYmUzMihpcC0+aV9udW0ubm9fYWRkciA+PiAzMik7CisJZmhbM10gPSBjcHVfdG9fYmUzMihpcC0+aV9udW0ubm9fYWRkciAmIDB4RkZGRkZGRkYpOwogCSpsZW4gPSBHRlMyX1NNQUxMX0ZIX1NJWkU7CiAKIAlpZiAoIWNvbm5lY3RhYmxlIHx8IGlub2RlID09IHNiLT5zX3Jvb3QtPmRfaW5vZGUpCkBAIC05NSwxNCArOTMsMTAgQEAKIAlpZ3JhYihpbm9kZSk7CiAJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAotCWZoWzRdID0gaXAtPmlfbnVtLm5vX2Zvcm1hbF9pbm8gPj4gMzI7Ci0JZmhbNF0gPSBjcHVfdG9fYmUzMihmaFs0XSk7Ci0JZmhbNV0gPSBpcC0+aV9udW0ubm9fZm9ybWFsX2lubyAmIDB4RkZGRkZGRkY7Ci0JZmhbNV0gPSBjcHVfdG9fYmUzMihmaFs1XSk7Ci0JZmhbNl0gPSBpcC0+aV9udW0ubm9fYWRkciA+PiAzMjsKLQlmaFs2XSA9IGNwdV90b19iZTMyKGZoWzZdKTsKLQlmaFs3XSA9IGlwLT5pX251bS5ub19hZGRyICYgMHhGRkZGRkZGRjsKLQlmaFs3XSA9IGNwdV90b19iZTMyKGZoWzddKTsKKwlmaFs0XSA9IGNwdV90b19iZTMyKGlwLT5pX251bS5ub19mb3JtYWxfaW5vID4+IDMyKTsKKwlmaFs1XSA9IGNwdV90b19iZTMyKGlwLT5pX251bS5ub19mb3JtYWxfaW5vICYgMHhGRkZGRkZGRik7CisJZmhbNl0gPSBjcHVfdG9fYmUzMihpcC0+aV9udW0ubm9fYWRkciA+PiAzMik7CisJZmhbN10gPSBjcHVfdG9fYmUzMihpcC0+aV9udW0ubm9fYWRkciAmIDB4RkZGRkZGRkYpOwogCiAJZmhbOF0gID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfbW9kZSk7CiAJZmhbOV0gID0gMDsJLyogcGFkIHRvIGRvdWJsZSB3b3JkICovCkBAIC0xMTQsMTIgKzEwOCwxMiBAQAogfQogCiBzdHJ1Y3QgZ2V0X25hbWVfZmlsbGRpciB7Ci0Jc3RydWN0IGdmczJfaW51bSBpbnVtOworCXN0cnVjdCBnZnMyX2ludW1faG9zdCBpbnVtOwogCWNoYXIgKm5hbWU7CiB9OwogCiBzdGF0aWMgaW50IGdldF9uYW1lX2ZpbGxkaXIodm9pZCAqb3BhcXVlLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAotCQkJICAgIHU2NCBvZmZzZXQsIHN0cnVjdCBnZnMyX2ludW0gKmludW0sCisJCQkgICAgdTY0IG9mZnNldCwgc3RydWN0IGdmczJfaW51bV9ob3N0ICppbnVtLAogCQkJICAgIHVuc2lnbmVkIGludCB0eXBlKQogewogCXN0cnVjdCBnZXRfbmFtZV9maWxsZGlyICpnbmZkID0gKHN0cnVjdCBnZXRfbmFtZV9maWxsZGlyICopb3BhcXVlOwpAQCAtMjAyLDcgKzE5Niw3IEBACiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBzYi0+c19mc19pbmZvOwogCXN0cnVjdCBnZnMyX2ZoX29iaiAqZmhfb2JqID0gKHN0cnVjdCBnZnMyX2ZoX29iaiAqKWludW1fb2JqOwotCXN0cnVjdCBnZnMyX2ludW0gKmludW0gPSAmZmhfb2JqLT50aGlzOworCXN0cnVjdCBnZnMyX2ludW1faG9zdCAqaW51bSA9ICZmaF9vYmotPnRoaXM7CiAJc3RydWN0IGdmczJfaG9sZGVyIGlfZ2gsIHJpX2doLCByZ2RfZ2g7CiAJc3RydWN0IGdmczJfcmdycGQgKnJnZDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZXhwb3J0LmggYi9mcy9nZnMyL29wc19leHBvcnQuaAppbmRleCAwOWFjYTUwLi5mOTI1YTk1IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19leHBvcnQuaAorKysgYi9mcy9nZnMyL29wc19leHBvcnQuaApAQCAtMTUsNyArMTUsNyBAQAogCiBleHRlcm4gc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGdmczJfZXhwb3J0X29wczsKIHN0cnVjdCBnZnMyX2ZoX29iaiB7Ci0Jc3RydWN0IGdmczJfaW51bSB0aGlzOworCXN0cnVjdCBnZnMyX2ludW1faG9zdCB0aGlzOwogCV9fdTMyICAgICAgICAgICAgaW1vZGU7CiB9OwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19maWxlLmMgYi9mcy9nZnMyL29wc19maWxlLmMKaW5kZXggMzA2NGYxMy4uZmFhMDdlNCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZmlsZS5jCisrKyBiL2ZzL2dmczIvb3BzX2ZpbGUuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2xtX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCkBAIC03MSw3ICs3Miw3IEBACiAJCXNpemUgPSBjb3VudDsKIAogCWthZGRyID0ga21hcChwYWdlKTsKLQltZW1jcHkoZGVzYy0+YXJnLmJ1Ziwga2FkZHIgKyBvZmZzZXQsIHNpemUpOworCW1lbWNweShkZXNjLT5hcmcuZGF0YSwga2FkZHIgKyBvZmZzZXQsIHNpemUpOwogCWt1bm1hcChwYWdlKTsKIAogCWRlc2MtPmNvdW50ID0gY291bnQgLSBzaXplOwpAQCAtODYsNyArODcsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaXAtPmlfaW5vZGU7CiAJcmVhZF9kZXNjcmlwdG9yX3QgZGVzYzsKIAlkZXNjLndyaXR0ZW4gPSAwOwotCWRlc2MuYXJnLmJ1ZiA9IGJ1ZjsKKwlkZXNjLmFyZy5kYXRhID0gYnVmOwogCWRlc2MuY291bnQgPSBzaXplOwogCWRlc2MuZXJyb3IgPSAwOwogCWRvX2dlbmVyaWNfbWFwcGluZ19yZWFkKGlub2RlLT5pX21hcHBpbmcsIHJhX3N0YXRlLApAQCAtMTM5LDcgKzE0MCw3IEBACiAgKi8KIAogc3RhdGljIGludCBmaWxsZGlyX2Z1bmModm9pZCAqb3BhcXVlLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAotCQkJdTY0IG9mZnNldCwgc3RydWN0IGdmczJfaW51bSAqaW51bSwKKwkJCXU2NCBvZmZzZXQsIHN0cnVjdCBnZnMyX2ludW1faG9zdCAqaW51bSwKIAkJCXVuc2lnbmVkIGludCB0eXBlKQogewogCXN0cnVjdCBmaWxsZGlyX3JlZyAqZmRyID0gKHN0cnVjdCBmaWxsZGlyX3JlZyAqKW9wYXF1ZTsKQEAgLTI0NiwxNCArMjQ3LDE0IEBACiAKIHN0YXRpYyBpbnQgZ2ZzMl9nZXRfZmxhZ3Moc3RydWN0IGZpbGUgKmZpbHAsIHUzMiBfX3VzZXIgKnB0cikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CiAJaW50IGVycm9yOwogCXUzMiBmc2ZsYWdzOwogCiAJZ2ZzMl9ob2xkZXJfaW5pdChpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCBHTF9BVElNRSwgJmdoKTsKLQllcnJvciA9IGdmczJfZ2xvY2tfbnFfbV9hdGltZSgxLCAmZ2gpOworCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9hdGltZSgmZ2gpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCkBAIC0yNjYsNiArMjY3LDI0IEBACiAJcmV0dXJuIGVycm9yOwogfQogCit2b2lkIGdmczJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3QgZ2ZzMl9kaW5vZGVfaG9zdCAqZGkgPSAmaXAtPmlfZGk7CisJdW5zaWduZWQgaW50IGZsYWdzID0gaW5vZGUtPmlfZmxhZ3M7CisKKwlmbGFncyAmPSB+KFNfU1lOQ3xTX0FQUEVORHxTX0lNTVVUQUJMRXxTX05PQVRJTUV8U19ESVJTWU5DKTsKKwlpZiAoZGktPmRpX2ZsYWdzICYgR0ZTMl9ESUZfSU1NVVRBQkxFKQorCQlmbGFncyB8PSBTX0lNTVVUQUJMRTsKKwlpZiAoZGktPmRpX2ZsYWdzICYgR0ZTMl9ESUZfQVBQRU5ET05MWSkKKwkJZmxhZ3MgfD0gU19BUFBFTkQ7CisJaWYgKGRpLT5kaV9mbGFncyAmIEdGUzJfRElGX05PQVRJTUUpCisJCWZsYWdzIHw9IFNfTk9BVElNRTsKKwlpZiAoZGktPmRpX2ZsYWdzICYgR0ZTMl9ESUZfU1lOQykKKwkJZmxhZ3MgfD0gU19TWU5DOworCWlub2RlLT5pX2ZsYWdzID0gZmxhZ3M7Cit9CisKIC8qIEZsYWdzIHRoYXQgY2FuIGJlIHNldCBieSB1c2VyIHNwYWNlICovCiAjZGVmaW5lIEdGUzJfRkxBR1NfVVNFUl9TRVQgKEdGUzJfRElGX0pEQVRBfAkJCVwKIAkJCSAgICAgR0ZTMl9ESUZfRElSRUNUSU98CQkJXApAQCAtMjg2LDcgKzMwNSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZG9fZ2ZzMl9zZXRfZmxhZ3Moc3RydWN0IGZpbGUgKmZpbHAsIHUzMiByZXFmbGFncywgdTMyIG1hc2spCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwpAQCAtMzM2LDggKzM1NSw5IEBACiAJCWdvdG8gb3V0X3RyYW5zX2VuZDsKIAlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgYmgsIDEpOwogCWlwLT5pX2RpLmRpX2ZsYWdzID0gbmV3X2ZsYWdzOwotCWdmczJfZGlub2RlX291dCgmaXAtPmlfZGksIGJoLT5iX2RhdGEpOworCWdmczJfZGlub2RlX291dChpcCwgYmgtPmJfZGF0YSk7CiAJYnJlbHNlKGJoKTsKKwlnZnMyX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CiBvdXRfdHJhbnNfZW5kOgogCWdmczJfdHJhbnNfZW5kKHNkcCk7CiBvdXQ6CkBAIC00MjUsNyArNDQ1LDcgQEAKIAlnZnMyX2Fzc2VydF93YXJuKEdGUzJfU0IoaW5vZGUpLCAhZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmcDsKIAotCWlmIChTX0lTUkVHKGlwLT5pX2RpLmRpX21vZGUpKSB7CisJaWYgKFNfSVNSRUcoaXAtPmlfaW5vZGUuaV9tb2RlKSkgewogCQllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCBMTV9GTEFHX0FOWSwKIAkJCQkJICAgJmlfZ2gpOwogCQlpZiAoZXJyb3IpCkBAIC00ODQsMTYgKzUwNCw0MCBAQAogICogQGZpbGU6IHRoZSBmaWxlIHRoYXQgcG9pbnRzIHRvIHRoZSBkZW50cnkgKHdlIGlnbm9yZSB0aGlzKQogICogQGRlbnRyeTogdGhlIGRlbnRyeSB0aGF0IHBvaW50cyB0byB0aGUgaW5vZGUgdG8gc3luYwogICoKKyAqIFRoZSBWRlMgd2lsbCBmbHVzaCAibm9ybWFsIiBkYXRhIGZvciB1cy4gV2Ugb25seSBuZWVkIHRvIHdvcnJ5CisgKiBhYm91dCBtZXRhZGF0YSBoZXJlLiBGb3Igam91cm5hbGVkIGRhdGEsIHdlIGp1c3QgZG8gYSBsb2cgZmx1c2gKKyAqIGFzIHdlIGNhbid0IGF2b2lkIGl0LiBPdGhlcndpc2Ugd2UgY2FuIGp1c3QgYmFsZSBvdXQgaWYgZGF0YXN5bmMKKyAqIGlzIHNldC4gRm9yIHN0dWZmZWQgaW5vZGVzIHdlIG11c3QgZmx1c2ggdGhlIGxvZyBpbiBvcmRlciB0bworICogZW5zdXJlIHRoYXQgYWxsIGRhdGEgaXMgb24gZGlzay4KKyAqCisgKiBUaGUgY2FsbCB0byB3cml0ZV9pbm9kZV9ub3coKSBpcyB0aGVyZSB0byB3cml0ZSBiYWNrIG1ldGFkYXRhIGFuZAorICogdGhlIGlub2RlIGl0c2VsZi4gSXQgZG9lcyBhbHNvIHRyeSBhbmQgd3JpdGUgdGhlIGRhdGEsIGJ1dCB0aGF0cworICogKGhvcGVmdWxseSkgYSBuby1vcCBkdWUgdG8gdGhlIFZGUyBoYXZpbmcgYWxyZWFkeSBjYWxsZWQgZmlsZW1hcF9mZGF0YXdyaXRlKCkKKyAqIGZvciB1cy4KKyAqCiAgKiBSZXR1cm5zOiBlcnJubwogICovCiAKIHN0YXRpYyBpbnQgZ2ZzMl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCiB7Ci0Jc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGRlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgc3luY19zdGF0ZSA9IGlub2RlLT5pX3N0YXRlICYgKElfRElSVFlfU1lOQ3xJX0RJUlRZX0RBVEFTWU5DKTsKKwlpbnQgcmV0ID0gMDsKIAotCWdmczJfbG9nX2ZsdXNoKGlwLT5pX2dsLT5nbF9zYmQsIGlwLT5pX2dsKTsKKwlpZiAoZ2ZzMl9pc19qZGF0YShHRlMyX0koaW5vZGUpKSkgeworCQlnZnMyX2xvZ19mbHVzaChHRlMyX1NCKGlub2RlKSwgR0ZTMl9JKGlub2RlKS0+aV9nbCk7CisJCXJldHVybiAwOworCX0KIAotCXJldHVybiAwOworCWlmIChzeW5jX3N0YXRlICE9IDApIHsKKwkJaWYgKCFkYXRhc3luYykKKwkJCXJldCA9IHdyaXRlX2lub2RlX25vdyhpbm9kZSwgMCk7CisKKwkJaWYgKGdmczJfaXNfc3R1ZmZlZChHRlMyX0koaW5vZGUpKSkKKwkJCWdmczJfbG9nX2ZsdXNoKEdGUzJfU0IoaW5vZGUpLCBHRlMyX0koaW5vZGUpLT5pX2dsKTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTUxNSw3ICs1NTksNyBAQAogCiAJaWYgKCEoZmwtPmZsX2ZsYWdzICYgRkxfUE9TSVgpKQogCQlyZXR1cm4gLUVOT0xDSzsKLQlpZiAoKGlwLT5pX2RpLmRpX21vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PSBTX0lTR0lEKQorCWlmICgoaXAtPmlfaW5vZGUuaV9tb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gU19JU0dJRCkKIAkJcmV0dXJuIC1FTk9MQ0s7CiAKIAlpZiAoc2RwLT5zZF9hcmdzLmFyX2xvY2FsZmxvY2tzKSB7CkBAIC01NDQsNyArNTg4LDcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9maWxlICpmcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmZsX2doID0gJmZwLT5mX2ZsX2doOwotCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBnZnMyX2dsb2NrICpnbDsKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CiAJaW50IGZsYWdzOwpAQCAtNjE3LDcgKzY2MSw3IEBACiAKIAlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykpCiAJCXJldHVybiAtRU5PTENLOwotCWlmICgoaXAtPmlfZGkuZGlfbW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IFNfSVNHSUQpCisJaWYgKChpcC0+aV9pbm9kZS5pX21vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PSBTX0lTR0lEKQogCQlyZXR1cm4gLUVOT0xDSzsKIAogCWlmIChzZHAtPnNkX2FyZ3MuYXJfbG9jYWxmbG9ja3MpCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19maWxlLmggYi9mcy9nZnMyL29wc19maWxlLmgKaW5kZXggY2UzMTlmOC4uN2U1ZDhlYyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZmlsZS5oCisrKyBiL2ZzL2dmczIvb3BzX2ZpbGUuaApAQCAtMTcsNyArMTcsNyBAQAogZXh0ZXJuIGludCBnZnMyX2ludGVybmFsX3JlYWQoc3RydWN0IGdmczJfaW5vZGUgKmlwLAogCQkJICAgICAgc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhX3N0YXRlLAogCQkJICAgICAgY2hhciAqYnVmLCBsb2ZmX3QgKnBvcywgdW5zaWduZWQgc2l6ZSk7Ci0KK2V4dGVybiB2b2lkIGdmczJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2ZvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZnMyX2Rpcl9mb3BzOwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19mc3R5cGUuYyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCmluZGV4IDE3OGIzMzkuLmQxNGUxMzkgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCisrKyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2ZzMl9sb29rdXBfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSAgICAgIHN0cnVjdCBnZnMyX2ludW0gKmludW0pCisJCQkJICAgICAgc3RydWN0IGdmczJfaW51bV9ob3N0ICppbnVtKQogewogCXJldHVybiBnZnMyX2lub2RlX2xvb2t1cChzYiwgaW51bSwgRFRfRElSKTsKIH0KQEAgLTI0Niw3ICsyNDYsNyBAQAogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBzZHAtPnNkX3ZmczsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgc2JfZ2g7Ci0Jc3RydWN0IGdmczJfaW51bSAqaW51bTsKKwlzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmludW07CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC03OTQsOCArNzk0LDggQEAKIAkJZnNfZXJyKHNkcCwgImNhbid0IGdldCByb290IGRlbnRyeVxuIik7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJaXB1dChpbm9kZSk7Ci0JfQotCW5ldy0+c19yb290LT5kX29wID0gJmdmczJfZG9wczsKKwl9IGVsc2UKKwkJbmV3LT5zX3Jvb3QtPmRfb3AgPSAmZ2ZzMl9kb3BzOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtODU0LDcgKzg1NCw2IEBACiAJaW50IGVycm9yID0gMDsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gTlVMTCwgKm5ldzsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcDsKLQljaGFyICpnZnMybW50ID0gTlVMTDsKIAogCXNiID0gZ2V0X2dmczJfc2IoZGV2X25hbWUpOwogCWlmICghc2IpIHsKQEAgLTg5Miw4ICs4OTEsNiBAQAogCWF0b21pY19pbmMoJnNkcC0+c2RfZ2ZzMm1udC0+bW50X2NvdW50KTsKIAlyZXR1cm4gc2ltcGxlX3NldF9tbnQobW50LCBuZXcpOwogZXJyb3I6Ci0JaWYgKGdmczJtbnQpCi0JCWtmcmVlKGdmczJtbnQpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfaW5vZGUuYyBiL2ZzL2dmczIvb3BzX2lub2RlLmMKaW5kZXggZWY2ZTVlZC4uNjM2ZGRhNCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfaW5vZGUuYworKysgYi9mcy9nZnMyL29wc19pbm9kZS5jCkBAIC01OSw3ICs1OSw3IEBACiAJZ2ZzMl9ob2xkZXJfaW5pdChkaXAtPmlfZ2wsIDAsIDAsIGdocyk7CiAKIAlmb3IgKDs7KSB7Ci0JCWlub2RlID0gZ2ZzMl9jcmVhdGVpKGdocywgJmRlbnRyeS0+ZF9uYW1lLCBTX0lGUkVHIHwgbW9kZSk7CisJCWlub2RlID0gZ2ZzMl9jcmVhdGVpKGdocywgJmRlbnRyeS0+ZF9uYW1lLCBTX0lGUkVHIHwgbW9kZSwgMCk7CiAJCWlmICghSVNfRVJSKGlub2RlKSkgewogCQkJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAkJCWlmIChkaXAtPmlfYWxsb2MuYWxfcmdkKQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJaW50IGFsbG9jX3JlcXVpcmVkOwogCWludCBlcnJvcjsKIAotCWlmIChTX0lTRElSKGlwLT5pX2RpLmRpX21vZGUpKQorCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJZ2ZzMl9ob2xkZXJfaW5pdChkaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgZ2hzKTsKQEAgLTE2OSw3ICsxNjksNyBAQAogCX0KIAogCWVycm9yID0gLUVJTlZBTDsKLQlpZiAoIWRpcC0+aV9kaS5kaV9ubGluaykKKwlpZiAoIWRpcC0+aV9pbm9kZS5pX25saW5rKQogCQlnb3RvIG91dF9ndW5sb2NrOwogCWVycm9yID0gLUVGQklHOwogCWlmIChkaXAtPmlfZGkuZGlfZW50cmllcyA9PSAodTMyKS0xKQpAQCAtMTc4LDEwICsxNzgsMTAgQEAKIAlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQogCQlnb3RvIG91dF9ndW5sb2NrOwogCWVycm9yID0gLUVJTlZBTDsKLQlpZiAoIWlwLT5pX2RpLmRpX25saW5rKQorCWlmICghaXAtPmlfaW5vZGUuaV9ubGluaykKIAkJZ290byBvdXRfZ3VubG9jazsKIAllcnJvciA9IC1FTUxJTks7Ci0JaWYgKGlwLT5pX2RpLmRpX25saW5rID09ICh1MzIpLTEpCisJaWYgKGlwLT5pX2lub2RlLmlfbmxpbmsgPT0gKHUzMiktMSkKIAkJZ290byBvdXRfZ3VubG9jazsKIAogCWFsbG9jX3JlcXVpcmVkID0gZXJyb3IgPSBnZnMyX2RpcmFkZF9hbGxvY19yZXF1aXJlZChkaXIsICZkZW50cnktPmRfbmFtZSk7CkBAIC0xOTYsOCArMTk2LDcgQEAKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfYWxsb2M7CiAKLQkJZXJyb3IgPSBnZnMyX3F1b3RhX2NoZWNrKGRpcCwgZGlwLT5pX2RpLmRpX3VpZCwKLQkJCQkJIGRpcC0+aV9kaS5kaV9naWQpOworCQllcnJvciA9IGdmczJfcXVvdGFfY2hlY2soZGlwLCBkaXAtPmlfaW5vZGUuaV91aWQsIGRpcC0+aV9pbm9kZS5pX2dpZCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2d1bmxvY2tfcTsKIApAQCAtMjIwLDcgKzIxOSw3IEBACiAJfQogCiAJZXJyb3IgPSBnZnMyX2Rpcl9hZGQoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZpcC0+aV9udW0sCi0JCQkgICAgIElGMkRUKGlwLT5pX2RpLmRpX21vZGUpKTsKKwkJCSAgICAgSUYyRFQoaW5vZGUtPmlfbW9kZSkpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZW5kX3RyYW5zOwogCkBAIC0zMjYsNyArMzI1LDcgQEAKIAogCWdmczJfaG9sZGVyX2luaXQoZGlwLT5pX2dsLCAwLCAwLCBnaHMpOwogCi0JaW5vZGUgPSBnZnMyX2NyZWF0ZWkoZ2hzLCAmZGVudHJ5LT5kX25hbWUsIFNfSUZMTksgfCBTX0lSV1hVR08pOworCWlub2RlID0gZ2ZzMl9jcmVhdGVpKGdocywgJmRlbnRyeS0+ZF9uYW1lLCBTX0lGTE5LIHwgU19JUldYVUdPLCAwKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQlnZnMyX2hvbGRlcl91bmluaXQoZ2hzKTsKIAkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOwpAQCAtMzM5LDcgKzMzOCw3IEBACiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAKIAlpZiAoIWdmczJfYXNzZXJ0X3dpdGhkcmF3KHNkcCwgIWVycm9yKSkgewotCQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOworCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpYmgtPmJfZGF0YSk7CiAJCW1lbWNweShkaWJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSwgc3ltbmFtZSwKIAkJICAgICAgIHNpemUpOwogCQlicmVsc2UoZGliaCk7CkBAIC0zNzksNyArMzc4LDcgQEAKIAogCWdmczJfaG9sZGVyX2luaXQoZGlwLT5pX2dsLCAwLCAwLCBnaHMpOwogCi0JaW5vZGUgPSBnZnMyX2NyZWF0ZWkoZ2hzLCAmZGVudHJ5LT5kX25hbWUsIFNfSUZESVIgfCBtb2RlKTsKKwlpbm9kZSA9IGdmczJfY3JlYXRlaShnaHMsICZkZW50cnktPmRfbmFtZSwgU19JRkRJUiB8IG1vZGUsIDApOwogCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCWdmczJfaG9sZGVyX3VuaW5pdChnaHMpOwogCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CkBAIC0zODcsMTAgKzM4Niw5IEBACiAKIAlpcCA9IGdoc1sxXS5naF9nbC0+Z2xfb2JqZWN0OwogCi0JaXAtPmlfZGkuZGlfbmxpbmsgPSAyOworCWlwLT5pX2lub2RlLmlfbmxpbmsgPSAyOwogCWlwLT5pX2RpLmRpX3NpemUgPSBzZHAtPnNkX3NiLnNiX2JzaXplIC0gc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSk7CiAJaXAtPmlfZGkuZGlfZmxhZ3MgfD0gR0ZTMl9ESUZfSkRBVEE7Ci0JaXAtPmlfZGkuZGlfcGF5bG9hZF9mb3JtYXQgPSBHRlMyX0ZPUk1BVF9ERTsKIAlpcC0+aV9kaS5kaV9lbnRyaWVzID0gMjsKIAogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwpAQCAtNDE0LDcgKzQxMiw3IEBACiAJCWdmczJfaW51bV9vdXQoJmRpcC0+aV9udW0sICZkZW50LT5kZV9pbnVtKTsKIAkJZGVudC0+ZGVfdHlwZSA9IGNwdV90b19iZTE2KERUX0RJUik7CiAKLQkJZ2ZzMl9kaW5vZGVfb3V0KCZpcC0+aV9kaSwgZGkpOworCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpKTsKIAogCQlicmVsc2UoZGliaCk7CiAJfQpAQCAtNDY3LDcgKzQ2NSw3IEBACiAKIAlpZiAoaXAtPmlfZGkuZGlfZW50cmllcyA8IDIpIHsKIAkJaWYgKGdmczJfY29uc2lzdF9pbm9kZShpcCkpCi0JCQlnZnMyX2Rpbm9kZV9wcmludCgmaXAtPmlfZGkpOworCQkJZ2ZzMl9kaW5vZGVfcHJpbnQoaXApOwogCQllcnJvciA9IC1FSU87CiAJCWdvdG8gb3V0X2d1bmxvY2s7CiAJfQpAQCAtNTA0LDQ3ICs1MDIsMTkgQEAKIHN0YXRpYyBpbnQgZ2ZzMl9ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKIAkJICAgICAgZGV2X3QgZGV2KQogewotCXN0cnVjdCBnZnMyX2lub2RlICpkaXAgPSBHRlMyX0koZGlyKSwgKmlwOworCXN0cnVjdCBnZnMyX2lub2RlICpkaXAgPSBHRlMyX0koZGlyKTsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoZGlyKTsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2hzWzJdOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwotCXUzMiBtYWpvciA9IDAsIG1pbm9yID0gMDsKLQlpbnQgZXJyb3I7Ci0KLQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKLQljYXNlIFNfSUZCTEs6Ci0JY2FzZSBTX0lGQ0hSOgotCQltYWpvciA9IE1BSk9SKGRldik7Ci0JCW1pbm9yID0gTUlOT1IoZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBTX0lGSUZPOgotCWNhc2UgU19JRlNPQ0s6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9OwogCiAJZ2ZzMl9ob2xkZXJfaW5pdChkaXAtPmlfZ2wsIDAsIDAsIGdocyk7CiAKLQlpbm9kZSA9IGdmczJfY3JlYXRlaShnaHMsICZkZW50cnktPmRfbmFtZSwgbW9kZSk7CisJaW5vZGUgPSBnZnMyX2NyZWF0ZWkoZ2hzLCAmZGVudHJ5LT5kX25hbWUsIG1vZGUsIGRldik7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJZ2ZzMl9ob2xkZXJfdW5pbml0KGdocyk7CiAJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKIAl9CiAKLQlpcCA9IGdoc1sxXS5naF9nbC0+Z2xfb2JqZWN0OwotCi0JaXAtPmlfZGkuZGlfbWFqb3IgPSBtYWpvcjsKLQlpcC0+aV9kaS5kaV9taW5vciA9IG1pbm9yOwotCi0JZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7Ci0KLQlpZiAoIWdmczJfYXNzZXJ0X3dpdGhkcmF3KHNkcCwgIWVycm9yKSkgewotCQlnZnMyX2Rpbm9kZV9vdXQoJmlwLT5pX2RpLCBkaWJoLT5iX2RhdGEpOwotCQlicmVsc2UoZGliaCk7Ci0JfQotCiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKIAlpZiAoZGlwLT5pX2FsbG9jLmFsX3JnZCkKIAkJZ2ZzMl9pbnBsYWNlX3JlbGVhc2UoZGlwKTsKQEAgLTU5MiwxMSArNTYyLDEwIEBACiAKIAkvKiBNYWtlIHN1cmUgd2UgYXJlbid0IHRyeWluZyB0byBtb3ZlIGEgZGlyY3RvcnkgaW50byBpdCdzIHN1YmRpciAqLwogCi0JaWYgKFNfSVNESVIoaXAtPmlfZGkuZGlfbW9kZSkgJiYgb2RpcCAhPSBuZGlwKSB7CisJaWYgKFNfSVNESVIoaXAtPmlfaW5vZGUuaV9tb2RlKSAmJiBvZGlwICE9IG5kaXApIHsKIAkJZGlyX3JlbmFtZSA9IDE7CiAKLQkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF9yZW5hbWVfZ2wsCi0JCQkJCSAgIExNX1NUX0VYQ0xVU0lWRSwgMCwKKwkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF9yZW5hbWVfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwKIAkJCQkJICAgJnJfZ2gpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKQEAgLTYzNywxMCArNjA2LDEwIEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2d1bmxvY2s7CiAKLQkJaWYgKFNfSVNESVIobmlwLT5pX2RpLmRpX21vZGUpKSB7CisJCWlmIChTX0lTRElSKG5pcC0+aV9pbm9kZS5pX21vZGUpKSB7CiAJCQlpZiAobmlwLT5pX2RpLmRpX2VudHJpZXMgPCAyKSB7CiAJCQkJaWYgKGdmczJfY29uc2lzdF9pbm9kZShuaXApKQotCQkJCQlnZnMyX2Rpbm9kZV9wcmludCgmbmlwLT5pX2RpKTsKKwkJCQkJZ2ZzMl9kaW5vZGVfcHJpbnQobmlwKTsKIAkJCQllcnJvciA9IC1FSU87CiAJCQkJZ290byBvdXRfZ3VubG9jazsKIAkJCX0KQEAgLTY2Niw3ICs2MzUsNyBAQAogCQl9OwogCiAJCWlmIChvZGlwICE9IG5kaXApIHsKLQkJCWlmICghbmRpcC0+aV9kaS5kaV9ubGluaykgeworCQkJaWYgKCFuZGlwLT5pX2lub2RlLmlfbmxpbmspIHsKIAkJCQllcnJvciA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXRfZ3VubG9jazsKIAkJCX0KQEAgLTY3NCw4ICs2NDMsOCBAQAogCQkJCWVycm9yID0gLUVGQklHOwogCQkJCWdvdG8gb3V0X2d1bmxvY2s7CiAJCQl9Ci0JCQlpZiAoU19JU0RJUihpcC0+aV9kaS5kaV9tb2RlKSAmJgotCQkJICAgIG5kaXAtPmlfZGkuZGlfbmxpbmsgPT0gKHUzMiktMSkgeworCQkJaWYgKFNfSVNESVIoaXAtPmlfaW5vZGUuaV9tb2RlKSAmJgorCQkJICAgIG5kaXAtPmlfaW5vZGUuaV9ubGluayA9PSAodTMyKS0xKSB7CiAJCQkJZXJyb3IgPSAtRU1MSU5LOwogCQkJCWdvdG8gb3V0X2d1bmxvY2s7CiAJCQl9CkBAIC03MDIsOCArNjcxLDcgQEAKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfYWxsb2M7CiAKLQkJZXJyb3IgPSBnZnMyX3F1b3RhX2NoZWNrKG5kaXAsIG5kaXAtPmlfZGkuZGlfdWlkLAotCQkJCQkgbmRpcC0+aV9kaS5kaV9naWQpOworCQllcnJvciA9IGdmczJfcXVvdGFfY2hlY2sobmRpcCwgbmRpcC0+aV9pbm9kZS5pX3VpZCwgbmRpcC0+aV9pbm9kZS5pX2dpZCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2d1bmxvY2tfcTsKIApAQCAtNzI5LDcgKzY5Nyw3IEBACiAJLyogUmVtb3ZlIHRoZSB0YXJnZXQgZmlsZSwgaWYgaXQgZXhpc3RzICovCiAKIAlpZiAobmlwKSB7Ci0JCWlmIChTX0lTRElSKG5pcC0+aV9kaS5kaV9tb2RlKSkKKwkJaWYgKFNfSVNESVIobmlwLT5pX2lub2RlLmlfbW9kZSkpCiAJCQllcnJvciA9IGdmczJfcm1kaXJpKG5kaXAsICZuZGVudHJ5LT5kX25hbWUsIG5pcCk7CiAJCWVsc2UgewogCQkJZXJyb3IgPSBnZnMyX2Rpcl9kZWwobmRpcCwgJm5kZW50cnktPmRfbmFtZSk7CkBAIC03NjAsOSArNzI4LDkgQEAKIAkJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2VuZF90cmFuczsKLQkJaXAtPmlfZGkuZGlfY3RpbWUgPSBnZXRfc2Vjb25kcygpOworCQlpcC0+aV9pbm9kZS5pX2N0aW1lLnR2X3NlYyA9IGdldF9zZWNvbmRzKCk7CiAJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKLQkJZ2ZzMl9kaW5vZGVfb3V0KCZpcC0+aV9kaSwgZGliaC0+Yl9kYXRhKTsKKwkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwogCQlicmVsc2UoZGliaCk7CiAJfQogCkBAIC03NzEsNyArNzM5LDcgQEAKIAkJZ290byBvdXRfZW5kX3RyYW5zOwogCiAJZXJyb3IgPSBnZnMyX2Rpcl9hZGQobmRpciwgJm5kZW50cnktPmRfbmFtZSwgJmlwLT5pX251bSwKLQkJCSAgICAgSUYyRFQoaXAtPmlfZGkuZGlfbW9kZSkpOworCQkJICAgICBJRjJEVChpcC0+aV9pbm9kZS5pX21vZGUpKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2VuZF90cmFuczsKIApAQCAtODY3LDYgKzgzNSwxMCBAQAogICogQG1hc2s6CiAgKiBAbmQ6IHBhc3NlZCBmcm9tIExpbnV4IFZGUywgaWdub3JlZCBieSB1cwogICoKKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCBmcm9tIHRoZSBWRlMgZGlyZWN0bHksIG9yIGZyb20gd2l0aGluIEdGUzIgd2l0aCB0aGUKKyAqIGlub2RlIGxvY2tlZCwgc28gd2UgbG9vayB0byBzZWUgaWYgdGhlIGdsb2NrIGlzIGFscmVhZHkgbG9ja2VkIGFuZCBvbmx5CisgKiBsb2NrIHRoZSBnbG9jayBpZiBpdHMgbm90IGFscmVhZHkgYmVlbiBkb25lLgorICoKICAqIFJldHVybnM6IGVycm5vCiAgKi8KIApAQCAtODc1LDE2ICs4NDcsMTkgQEAKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwogCXN0cnVjdCBnZnMyX2hvbGRlciBpX2doOwogCWludCBlcnJvcjsKKwlpbnQgdW5sb2NrID0gMDsKIAotCWlmIChpcC0+aV92biA9PSBpcC0+aV9nbC0+Z2xfdm4pCi0JCXJldHVybiBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGdmczJfY2hlY2tfYWNsKTsKLQotCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIExNX0ZMQUdfQU5ZLCAmaV9naCk7Ci0JaWYgKCFlcnJvcikgewotCQllcnJvciA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZ2ZzMl9jaGVja19hY2xfbG9ja2VkKTsKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmlfZ2gpOworCWlmIChnZnMyX2dsb2NrX2lzX2xvY2tlZF9ieV9tZShpcC0+aV9nbCkgPT0gMCkgeworCQllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCBMTV9GTEFHX0FOWSwgJmlfZ2gpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCXVubG9jayA9IDE7CiAJfQogCisJZXJyb3IgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGdmczJfY2hlY2tfYWNsKTsKKwlpZiAodW5sb2NrKQorCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmaV9naCk7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTkxNCw4ICs4ODksOCBAQAogCXUzMiBvdWlkLCBvZ2lkLCBudWlkLCBuZ2lkOwogCWludCBlcnJvcjsKIAotCW91aWQgPSBpcC0+aV9kaS5kaV91aWQ7Ci0Jb2dpZCA9IGlwLT5pX2RpLmRpX2dpZDsKKwlvdWlkID0gaW5vZGUtPmlfdWlkOworCW9naWQgPSBpbm9kZS0+aV9naWQ7CiAJbnVpZCA9IGF0dHItPmlhX3VpZDsKIAluZ2lkID0gYXR0ci0+aWFfZ2lkOwogCkBAIC05NDYsMTAgKzkyMSw5IEBACiAKIAllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGF0dHIpOwogCWdmczJfYXNzZXJ0X3dhcm4oc2RwLCAhZXJyb3IpOwotCWdmczJfaW5vZGVfYXR0cl9vdXQoaXApOwogCiAJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwotCWdmczJfZGlub2RlX291dCgmaXAtPmlfZGksIGRpYmgtPmJfZGF0YSk7CisJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwogCWJyZWxzZShkaWJoKTsKIAogCWlmIChvdWlkICE9IE5PX1FVT1RBX0NIQU5HRSB8fCBvZ2lkICE9IE5PX1FVT1RBX0NIQU5HRSkgewpAQCAtMTAxOCw2ICs5OTIsMTIgQEAKICAqIEBkZW50cnk6IFRoZSBkZW50cnkgdG8gc3RhdAogICogQHN0YXQ6IFRoZSBpbm9kZSdzIHN0YXRzCiAgKgorICogVGhpcyBtYXkgYmUgY2FsbGVkIGZyb20gdGhlIFZGUyBkaXJlY3RseSwgb3IgZnJvbSB3aXRoaW4gR0ZTMiB3aXRoIHRoZQorICogaW5vZGUgbG9ja2VkLCBzbyB3ZSBsb29rIHRvIHNlZSBpZiB0aGUgZ2xvY2sgaXMgYWxyZWFkeSBsb2NrZWQgYW5kIG9ubHkKKyAqIGxvY2sgdGhlIGdsb2NrIGlmIGl0cyBub3QgYWxyZWFkeSBiZWVuIGRvbmUuIE5vdGUgdGhhdCBpdHMgdGhlIE5GUworICogcmVhZGRpcnBsdXMgb3BlcmF0aW9uIHdoaWNoIGNhdXNlcyB0aGlzIHRvIGJlIGNhbGxlZCAoZnJvbSBmaWxsZGlyKQorICogd2l0aCB0aGUgZ2xvY2sgYWxyZWFkeSBoZWxkLgorICoKICAqIFJldHVybnM6IGVycm5vCiAgKi8KIApAQCAtMTAyOCwxNCArMTAwOCwyMCBAQAogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJc3RydWN0IGdmczJfaG9sZGVyIGdoOwogCWludCBlcnJvcjsKKwlpbnQgdW5sb2NrID0gMDsKIAotCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIExNX0ZMQUdfQU5ZLCAmZ2gpOwotCWlmICghZXJyb3IpIHsKLQkJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7Ci0JCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZnaCk7CisJaWYgKGdmczJfZ2xvY2tfaXNfbG9ja2VkX2J5X21lKGlwLT5pX2dsKSA9PSAwKSB7CisJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIExNX0ZMQUdfQU5ZLCAmZ2gpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCXVubG9jayA9IDE7CiAJfQogCi0JcmV0dXJuIGVycm9yOworCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOworCWlmICh1bmxvY2spOworCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZ2ZzMl9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19zdXBlci5jIGIvZnMvZ2ZzMi9vcHNfc3VwZXIuYwppbmRleCAwNmYwNmY3Li43Njg1YjQ2IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19zdXBlci5jCisrKyBiL2ZzL2dmczIvb3BzX3N1cGVyLmMKQEAgLTEzOCwxNiArMTM4LDI4IEBACiB9CiAKIC8qKgotICogZ2ZzMl93cml0ZV9zdXBlciAtIGRpc2sgY29tbWl0IGFsbCBpbmNvcmUgdHJhbnNhY3Rpb25zCi0gKiBAc2I6IHRoZSBmaWxlc3lzdGVtCisgKiBnZnMyX3dyaXRlX3N1cGVyCisgKiBAc2I6IHRoZSBzdXBlcmJsb2NrCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBzeW5jKDIpIGlzIGNhbGxlZC4KLSAqIEFmdGVyIHRoaXMgZXhpdHMsIGFsbCBkaXJ0eSBidWZmZXJzIGFyZSBzeW5jZWQuCiAgKi8KIAogc3RhdGljIHZvaWQgZ2ZzMl93cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWdmczJfbG9nX2ZsdXNoKHNiLT5zX2ZzX2luZm8sIE5VTEwpOworCXNiLT5zX2RpcnQgPSAwOworfQorCisvKioKKyAqIGdmczJfc3luY19mcyAtIHN5bmMgdGhlIGZpbGVzeXN0ZW0KKyAqIEBzYjogdGhlIHN1cGVyYmxvY2sKKyAqCisgKiBGbHVzaGVzIHRoZSBsb2cgdG8gZGlzay4KKyAqLworc3RhdGljIGludCBnZnMyX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCit7CisJc2ItPnNfZGlydCA9IDA7CisJaWYgKHdhaXQpCisJCWdmczJfbG9nX2ZsdXNoKHNiLT5zX2ZzX2luZm8sIE5VTEwpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTIwNCw3ICsyMTYsNyBAQAogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfaW5vZGUtPmlfc2I7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBzYi0+c19mc19pbmZvOwotCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2Ugc2M7CisJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNjOwogCWludCBlcnJvcjsKIAogCWlmIChnZnMyX3R1bmVfZ2V0KHNkcCwgZ3Rfc3RhdGZzX3Nsb3cpKQpAQCAtMjgyLDggKzI5NCw2IEBACiAJICovCiAJaWYgKGlub2RlLT5pX3ByaXZhdGUpIHsKIAkJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKLQkJZ2ZzMl9nbG9ja19pbm9kZV9zcXVpc2goaW5vZGUpOwotCQlnZnMyX2Fzc2VydChpbm9kZS0+aV9zYi0+c19mc19pbmZvLCBpcC0+aV9nbC0+Z2xfc3RhdGUgPT0gTE1fU1RfVU5MT0NLRUQpOwogCQlpcC0+aV9nbC0+Z2xfb2JqZWN0ID0gTlVMTDsKIAkJZ2ZzMl9nbG9ja19zY2hlZHVsZV9mb3JfcmVjbGFpbShpcC0+aV9nbCk7CiAJCWdmczJfZ2xvY2tfcHV0KGlwLT5pX2dsKTsKQEAgLTM4NCw3ICszOTQsNyBAQAogCWlmICghaW5vZGUtPmlfcHJpdmF0ZSkKIAkJZ290byBvdXQ7CiAKLQllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCBMTV9GTEFHX1RSWV8xQ0IgfCBHTF9OT0NBQ0hFLCAmZ2gpOworCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9FWENMVVNJVkUsIExNX0ZMQUdfVFJZXzFDQiwgJmdoKTsKIAlpZiAodW5saWtlbHkoZXJyb3IpKSB7CiAJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZpcC0+aV9pb3Blbl9naCk7CiAJCWdvdG8gb3V0OwpAQCAtMzk2LDcgKzQwNiw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF91bmluaXQ7CiAKLQlpZiAoU19JU0RJUihpcC0+aV9kaS5kaV9tb2RlKSAmJgorCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmCiAJICAgIChpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VYSEFTSCkpIHsKIAkJZXJyb3IgPSBnZnMyX2Rpcl9leGhhc2hfZGVhbGxvYyhpcCk7CiAJCWlmIChlcnJvcikKQEAgLTQ1MiwxNyArNDYyLDE4IEBACiB9CiAKIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGdmczJfc3VwZXJfb3BzID0gewotCS5hbGxvY19pbm9kZSA9IGdmczJfYWxsb2NfaW5vZGUsCi0JLmRlc3Ryb3lfaW5vZGUgPSBnZnMyX2Rlc3Ryb3lfaW5vZGUsCi0JLndyaXRlX2lub2RlID0gZ2ZzMl93cml0ZV9pbm9kZSwKLQkuZGVsZXRlX2lub2RlID0gZ2ZzMl9kZWxldGVfaW5vZGUsCi0JLnB1dF9zdXBlciA9IGdmczJfcHV0X3N1cGVyLAotCS53cml0ZV9zdXBlciA9IGdmczJfd3JpdGVfc3VwZXIsCi0JLndyaXRlX3N1cGVyX2xvY2tmcyA9IGdmczJfd3JpdGVfc3VwZXJfbG9ja2ZzLAotCS51bmxvY2tmcyA9IGdmczJfdW5sb2NrZnMsCi0JLnN0YXRmcyA9IGdmczJfc3RhdGZzLAotCS5yZW1vdW50X2ZzID0gZ2ZzMl9yZW1vdW50X2ZzLAotCS5jbGVhcl9pbm9kZSA9IGdmczJfY2xlYXJfaW5vZGUsCi0JLnNob3dfb3B0aW9ucyA9IGdmczJfc2hvd19vcHRpb25zLAorCS5hbGxvY19pbm9kZQkJPSBnZnMyX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCQk9IGdmczJfZGVzdHJveV9pbm9kZSwKKwkud3JpdGVfaW5vZGUJCT0gZ2ZzMl93cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCQk9IGdmczJfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJCT0gZ2ZzMl9wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCQk9IGdmczJfd3JpdGVfc3VwZXIsCisJLnN5bmNfZnMJCT0gZ2ZzMl9zeW5jX2ZzLAorCS53cml0ZV9zdXBlcl9sb2NrZnMgCT0gZ2ZzMl93cml0ZV9zdXBlcl9sb2NrZnMsCisJLnVubG9ja2ZzCQk9IGdmczJfdW5sb2NrZnMsCisJLnN0YXRmcwkJCT0gZ2ZzMl9zdGF0ZnMsCisJLnJlbW91bnRfZnMJCT0gZ2ZzMl9yZW1vdW50X2ZzLAorCS5jbGVhcl9pbm9kZQkJPSBnZnMyX2NsZWFyX2lub2RlLAorCS5zaG93X29wdGlvbnMJCT0gZ2ZzMl9zaG93X29wdGlvbnMsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc192bS5jIGIvZnMvZ2ZzMi9vcHNfdm0uYwppbmRleCA1NDUzZDI5Li40NWE1ZjExIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc192bS5jCisrKyBiL2ZzL2dmczIvb3BzX3ZtLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBnZnMyX3F1b3RhX2NoZWNrKGlwLCBpcC0+aV9kaS5kaV91aWQsIGlwLT5pX2RpLmRpX2dpZCk7CisJZXJyb3IgPSBnZnMyX3F1b3RhX2NoZWNrKGlwLCBpcC0+aV9pbm9kZS5pX3VpZCwgaXAtPmlfaW5vZGUuaV9naWQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZ3VubG9ja19xOwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL3F1b3RhLmMgYi9mcy9nZnMyL3F1b3RhLmMKaW5kZXggYzY5Yjk0YS4uZDBkYjg4MSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9xdW90YS5jCisrKyBiL2ZzL2dmczIvcXVvdGEuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiAJdW5zaWduZWQgaW50IGJsb2NrLCBvZmZzZXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlpbnQgZXJyb3I7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkIGJoX21hcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmhfbWFwID0geyAuYl9zdGF0ZSA9IDAsIC5iX2Jsb2NrbnIgPSAwIH07CiAKIAltdXRleF9sb2NrKCZzZHAtPnNkX3F1b3RhX211dGV4KTsKIApAQCAtMjYzLDcgKzI2Myw4IEBACiAJYmxvY2sgPSBxZC0+cWRfc2xvdCAvIHNkcC0+c2RfcWNfcGVyX2Jsb2NrOwogCW9mZnNldCA9IHFkLT5xZF9zbG90ICUgc2RwLT5zZF9xY19wZXJfYmxvY2s7OwogCi0JZXJyb3IgPSBnZnMyX2Jsb2NrX21hcCgmaXAtPmlfaW5vZGUsIGJsb2NrLCAwLCAmYmhfbWFwLCAxKTsKKwliaF9tYXAuYl9zaXplID0gMSA8PCBpcC0+aV9pbm9kZS5pX2Jsa2JpdHM7CisJZXJyb3IgPSBnZnMyX2Jsb2NrX21hcCgmaXAtPmlfaW5vZGUsIGJsb2NrLCAwLCAmYmhfbWFwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbDsKIAllcnJvciA9IGdmczJfbWV0YV9yZWFkKGlwLT5pX2dsLCBiaF9tYXAuYl9ibG9ja25yLCBESU9fV0FJVCwgJmJoKTsKQEAgLTQ1MSwxOSArNDUyLDE5IEBACiAJaWYgKHNkcC0+c2RfYXJncy5hcl9xdW90YSA9PSBHRlMyX1FVT1RBX09GRikKIAkJcmV0dXJuIDA7CiAKLQllcnJvciA9IHFkc2JfZ2V0KHNkcCwgUVVPVEFfVVNFUiwgaXAtPmlfZGkuZGlfdWlkLCBDUkVBVEUsIHFkKTsKKwllcnJvciA9IHFkc2JfZ2V0KHNkcCwgUVVPVEFfVVNFUiwgaXAtPmlfaW5vZGUuaV91aWQsIENSRUFURSwgcWQpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAJYWwtPmFsX3FkX251bSsrOwogCXFkKys7CiAKLQllcnJvciA9IHFkc2JfZ2V0KHNkcCwgUVVPVEFfR1JPVVAsIGlwLT5pX2RpLmRpX2dpZCwgQ1JFQVRFLCBxZCk7CisJZXJyb3IgPSBxZHNiX2dldChzZHAsIFFVT1RBX0dST1VQLCBpcC0+aV9pbm9kZS5pX2dpZCwgQ1JFQVRFLCBxZCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAlhbC0+YWxfcWRfbnVtKys7CiAJcWQrKzsKIAotCWlmICh1aWQgIT0gTk9fUVVPVEFfQ0hBTkdFICYmIHVpZCAhPSBpcC0+aV9kaS5kaV91aWQpIHsKKwlpZiAodWlkICE9IE5PX1FVT1RBX0NIQU5HRSAmJiB1aWQgIT0gaXAtPmlfaW5vZGUuaV91aWQpIHsKIAkJZXJyb3IgPSBxZHNiX2dldChzZHAsIFFVT1RBX1VTRVIsIHVpZCwgQ1JFQVRFLCBxZCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwpAQCAtNDcxLDcgKzQ3Miw3IEBACiAJCXFkKys7CiAJfQogCi0JaWYgKGdpZCAhPSBOT19RVU9UQV9DSEFOR0UgJiYgZ2lkICE9IGlwLT5pX2RpLmRpX2dpZCkgeworCWlmIChnaWQgIT0gTk9fUVVPVEFfQ0hBTkdFICYmIGdpZCAhPSBpcC0+aV9pbm9kZS5pX2dpZCkgewogCQllcnJvciA9IHFkc2JfZ2V0KHNkcCwgUVVPVEFfR1JPVVAsIGdpZCwgQ1JFQVRFLCBxZCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwpAQCAtNTM4LDggKzUzOSw3IEBACiAJCXFjLT5xY19pZCA9IGNwdV90b19iZTMyKHFkLT5xZF9pZCk7CiAJfQogCi0JeCA9IHFjLT5xY19jaGFuZ2U7Ci0JeCA9IGJlNjRfdG9fY3B1KHgpICsgY2hhbmdlOworCXggPSBiZTY0X3RvX2NwdShxYy0+cWNfY2hhbmdlKSArIGNoYW5nZTsKIAlxYy0+cWNfY2hhbmdlID0gY3B1X3RvX2JlNjQoeCk7CiAKIAlzcGluX2xvY2soJnNkcC0+c2RfcXVvdGFfc3Bpbik7CkBAIC03NDIsNyArNzQyLDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHFkLT5xZF9nbC0+Z2xfc2JkOwogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShzZHAtPnNkX3F1b3RhX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgaV9naDsKLQlzdHJ1Y3QgZ2ZzMl9xdW90YSBxOworCXN0cnVjdCBnZnMyX3F1b3RhX2hvc3QgcTsKIAljaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGdmczJfcXVvdGEpXTsKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSByYV9zdGF0ZTsKIAlpbnQgZXJyb3I7CkBAIC0xMTAyLDcgKzExMDIsNyBAQAogCiAJCWZvciAoeSA9IDA7IHkgPCBzZHAtPnNkX3FjX3Blcl9ibG9jayAmJiBzbG90IDwgc2RwLT5zZF9xdW90YV9zbG90czsKIAkJICAgICB5KyssIHNsb3QrKykgewotCQkJc3RydWN0IGdmczJfcXVvdGFfY2hhbmdlIHFjOworCQkJc3RydWN0IGdmczJfcXVvdGFfY2hhbmdlX2hvc3QgcWM7CiAJCQlzdHJ1Y3QgZ2ZzMl9xdW90YV9kYXRhICpxZDsKIAogCQkJZ2ZzMl9xdW90YV9jaGFuZ2VfaW4oJnFjLCBiaC0+Yl9kYXRhICsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcmVjb3ZlcnkuYyBiL2ZzL2dmczIvcmVjb3ZlcnkuYwppbmRleCAwYThhNGI4Li5kMGM4MDZiIDEwMDY0NAotLS0gYS9mcy9nZnMyL3JlY292ZXJ5LmMKKysrIGIvZnMvZ2ZzMi9yZWNvdmVyeS5jCkBAIC0xMzIsMTAgKzEzMiwxMSBAQAogICovCiAKIHN0YXRpYyBpbnQgZ2V0X2xvZ19oZWFkZXIoc3RydWN0IGdmczJfamRlc2MgKmpkLCB1bnNpZ25lZCBpbnQgYmxrLAotCQkJICBzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyICpoZWFkKQorCQkJICBzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyX2hvc3QgKmhlYWQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyIGxoOworCXN0cnVjdCBnZnMyX2xvZ19oZWFkZXJfaG9zdCBsaDsKKwljb25zdCB1MzIgbm90aGluZyA9IDA7CiAJdTMyIGhhc2g7CiAJaW50IGVycm9yOwogCkBAIC0xNDMsMTEgKzE0NCwxMSBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JbWVtY3B5KCZsaCwgYmgtPmJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBnZnMyX2xvZ19oZWFkZXIpKTsKLQlsaC5saF9oYXNoID0gMDsKLQloYXNoID0gZ2ZzMl9kaXNrX2hhc2goKGNoYXIgKikmbGgsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyKSk7CisJaGFzaCA9IGNyYzMyX2xlKCh1MzIpfjAsIGJoLT5iX2RhdGEsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyKSAtCisJCQkJCSAgICAgc2l6ZW9mKHUzMikpOworCWhhc2ggPSBjcmMzMl9sZShoYXNoLCAodW5zaWduZWQgY2hhciBjb25zdCAqKSZub3RoaW5nLCBzaXplb2Yobm90aGluZykpOworCWhhc2ggXj0gKHUzMil+MDsKIAlnZnMyX2xvZ19oZWFkZXJfaW4oJmxoLCBiaC0+Yl9kYXRhKTsKLQogCWJyZWxzZShiaCk7CiAKIAlpZiAobGgubGhfaGVhZGVyLm1oX21hZ2ljICE9IEdGUzJfTUFHSUMgfHwKQEAgLTE3NCw3ICsxNzUsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgZmluZF9nb29kX2xoKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwgdW5zaWduZWQgaW50ICpibGssCi0JCQlzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyICpoZWFkKQorCQkJc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0ICpoZWFkKQogewogCXVuc2lnbmVkIGludCBvcmlnX2JsayA9ICpibGs7CiAJaW50IGVycm9yOwpAQCAtMjA1LDEwICsyMDYsMTAgQEAKICAqIFJldHVybnM6IGVycm5vCiAgKi8KIAotc3RhdGljIGludCBqaGVhZF9zY2FuKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwgc3RydWN0IGdmczJfbG9nX2hlYWRlciAqaGVhZCkKK3N0YXRpYyBpbnQgamhlYWRfc2NhbihzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQsIHN0cnVjdCBnZnMyX2xvZ19oZWFkZXJfaG9zdCAqaGVhZCkKIHsKIAl1bnNpZ25lZCBpbnQgYmxrID0gaGVhZC0+bGhfYmxrbm87Ci0Jc3RydWN0IGdmczJfbG9nX2hlYWRlciBsaDsKKwlzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyX2hvc3QgbGg7CiAJaW50IGVycm9yOwogCiAJZm9yICg7OykgewpAQCAtMjQ1LDkgKzI0Niw5IEBACiAgKiBSZXR1cm5zOiBlcnJubwogICovCiAKLWludCBnZnMyX2ZpbmRfamhlYWQoc3RydWN0IGdmczJfamRlc2MgKmpkLCBzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyICpoZWFkKQoraW50IGdmczJfZmluZF9qaGVhZChzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQsIHN0cnVjdCBnZnMyX2xvZ19oZWFkZXJfaG9zdCAqaGVhZCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyIGxoXzEsIGxoX207CisJc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0IGxoXzEsIGxoX207CiAJdTMyIGJsa18xLCBibGtfMiwgYmxrX207CiAJaW50IGVycm9yOwogCkBAIC0zMjAsNyArMzIxLDcgQEAKIAkJbGVuZ3RoID0gYmUzMl90b19jcHUobGQtPmxkX2xlbmd0aCk7CiAKIAkJaWYgKGJlMzJfdG9fY3B1KGxkLT5sZF9oZWFkZXIubWhfdHlwZSkgPT0gR0ZTMl9NRVRBVFlQRV9MSCkgewotCQkJc3RydWN0IGdmczJfbG9nX2hlYWRlciBsaDsKKwkJCXN0cnVjdCBnZnMyX2xvZ19oZWFkZXJfaG9zdCBsaDsKIAkJCWVycm9yID0gZ2V0X2xvZ19oZWFkZXIoamQsIHN0YXJ0LCAmbGgpOwogCQkJaWYgKCFlcnJvcikgewogCQkJCWdmczJfcmVwbGF5X2luY3JfYmxrKHNkcCwgJnN0YXJ0KTsKQEAgLTM2Myw3ICszNjQsNyBAQAogICogUmV0dXJuczogZXJybm8KICAqLwogCi1zdGF0aWMgaW50IGNsZWFuX2pvdXJuYWwoc3RydWN0IGdmczJfamRlc2MgKmpkLCBzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyICpoZWFkKQorc3RhdGljIGludCBjbGVhbl9qb3VybmFsKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwgc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0ICpoZWFkKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShqZC0+amRfaW5vZGUpOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQihqZC0+amRfaW5vZGUpOwpAQCAtMzcyLDExICszNzMsMTIgQEAKIAl1MzIgaGFzaDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWludCBlcnJvcjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgYmhfbWFwOworCXN0cnVjdCBidWZmZXJfaGVhZCBiaF9tYXAgPSB7IC5iX3N0YXRlID0gMCwgLmJfYmxvY2tuciA9IDAgfTsKIAogCWxibG9jayA9IGhlYWQtPmxoX2Jsa25vOwogCWdmczJfcmVwbGF5X2luY3JfYmxrKHNkcCwgJmxibG9jayk7Ci0JZXJyb3IgPSBnZnMyX2Jsb2NrX21hcCgmaXAtPmlfaW5vZGUsIGxibG9jaywgMCwgJmJoX21hcCwgMSk7CisJYmhfbWFwLmJfc2l6ZSA9IDEgPDwgaXAtPmlfaW5vZGUuaV9ibGtiaXRzOworCWVycm9yID0gZ2ZzMl9ibG9ja19tYXAoJmlwLT5pX2lub2RlLCBsYmxvY2ssIDAsICZiaF9tYXApOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCWlmICghYmhfbWFwLmJfYmxvY2tucikgewpAQCAtNDI0LDcgKzQyNiw3IEBACiB7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGpkLT5qZF9pbm9kZSk7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGpkLT5qZF9pbm9kZSk7Ci0Jc3RydWN0IGdmczJfbG9nX2hlYWRlciBoZWFkOworCXN0cnVjdCBnZnMyX2xvZ19oZWFkZXJfaG9zdCBoZWFkOwogCXN0cnVjdCBnZnMyX2hvbGRlciBqX2doLCBqaV9naCwgdF9naDsKIAl1bnNpZ25lZCBsb25nIHQ7CiAJaW50IHJvID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcmVjb3ZlcnkuaCBiL2ZzL2dmczIvcmVjb3ZlcnkuaAppbmRleCA5NjFmZWVkLi5mNzIzNWU2IDEwMDY0NAotLS0gYS9mcy9nZnMyL3JlY292ZXJ5LmgKKysrIGIvZnMvZ2ZzMi9yZWNvdmVyeS5oCkBAIC0yNiw3ICsyNiw3IEBACiB2b2lkIGdmczJfcmV2b2tlX2NsZWFuKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIAogaW50IGdmczJfZmluZF9qaGVhZChzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQsCi0JCSAgICBzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyICpoZWFkKTsKKwkJICAgIHN0cnVjdCBnZnMyX2xvZ19oZWFkZXJfaG9zdCAqaGVhZCk7CiBpbnQgZ2ZzMl9yZWNvdmVyX2pvdXJuYWwoc3RydWN0IGdmczJfamRlc2MgKmdmczJfamQpOwogdm9pZCBnZnMyX2NoZWNrX2pvdXJuYWxzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9yZ3JwLmMgYi9mcy9nZnMyL3JncnAuYwppbmRleCBiMjYxMzg1Li5mZjA4NDY1IDEwMDY0NAotLS0gYS9mcy9nZnMyL3JncnAuYworKysgYi9mcy9nZnMyL3JncnAuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiAKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmdycF9jb250YWluc19ibG9jayhzdHJ1Y3QgZ2ZzMl9yaW5kZXggKnJpLCB1NjQgYmxvY2spCitzdGF0aWMgaW5saW5lIGludCByZ3JwX2NvbnRhaW5zX2Jsb2NrKHN0cnVjdCBnZnMyX3JpbmRleF9ob3N0ICpyaSwgdTY0IGJsb2NrKQogewogCXU2NCBmaXJzdCA9IHJpLT5yaV9kYXRhMDsKIAl1NjQgbGFzdCA9IGZpcnN0ICsgcmktPnJpX2RhdGE7CkBAIC0xMjE3LDcgKzEyMTcsNyBAQAogCWFsLT5hbF9hbGxvY2VkKys7CiAKIAlnZnMyX3N0YXRmc19jaGFuZ2Uoc2RwLCAwLCAtMSwgMCk7Ci0JZ2ZzMl9xdW90YV9jaGFuZ2UoaXAsICsxLCBpcC0+aV9kaS5kaV91aWQsIGlwLT5pX2RpLmRpX2dpZCk7CisJZ2ZzMl9xdW90YV9jaGFuZ2UoaXAsICsxLCBpcC0+aV9pbm9kZS5pX3VpZCwgaXAtPmlfaW5vZGUuaV9naWQpOwogCiAJc3Bpbl9sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKIAlyZ2QtPnJkX2ZyZWVfY2xvbmUtLTsKQEAgLTEyNjEsNyArMTI2MSw3IEBACiAJYWwtPmFsX2FsbG9jZWQrKzsKIAogCWdmczJfc3RhdGZzX2NoYW5nZShzZHAsIDAsIC0xLCAwKTsKLQlnZnMyX3F1b3RhX2NoYW5nZShpcCwgKzEsIGlwLT5pX2RpLmRpX3VpZCwgaXAtPmlfZGkuZGlfZ2lkKTsKKwlnZnMyX3F1b3RhX2NoYW5nZShpcCwgKzEsIGlwLT5pX2lub2RlLmlfdWlkLCBpcC0+aV9pbm9kZS5pX2dpZCk7CiAJZ2ZzMl90cmFuc19hZGRfdW5yZXZva2Uoc2RwLCBibG9jayk7CiAKIAlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwpAQCAtMTMzNyw4ICsxMzM3LDcgQEAKIAlnZnMyX3RyYW5zX2FkZF9yZyhyZ2QpOwogCiAJZ2ZzMl9zdGF0ZnNfY2hhbmdlKHNkcCwgMCwgK2JsZW4sIDApOwotCWdmczJfcXVvdGFfY2hhbmdlKGlwLCAtKHM2NClibGVuLAotCQkJIGlwLT5pX2RpLmRpX3VpZCwgaXAtPmlfZGkuZGlfZ2lkKTsKKwlnZnMyX3F1b3RhX2NoYW5nZShpcCwgLShzNjQpYmxlbiwgaXAtPmlfaW5vZGUuaV91aWQsIGlwLT5pX2lub2RlLmlfZ2lkKTsKIH0KIAogLyoqCkBAIC0xMzY2LDcgKzEzNjUsNyBAQAogCWdmczJfdHJhbnNfYWRkX3JnKHJnZCk7CiAKIAlnZnMyX3N0YXRmc19jaGFuZ2Uoc2RwLCAwLCArYmxlbiwgMCk7Ci0JZ2ZzMl9xdW90YV9jaGFuZ2UoaXAsIC0oczY0KWJsZW4sIGlwLT5pX2RpLmRpX3VpZCwgaXAtPmlfZGkuZGlfZ2lkKTsKKwlnZnMyX3F1b3RhX2NoYW5nZShpcCwgLShzNjQpYmxlbiwgaXAtPmlfaW5vZGUuaV91aWQsIGlwLT5pX2lub2RlLmlfZ2lkKTsKIAlnZnMyX21ldGFfd2lwZShpcCwgYnN0YXJ0LCBibGVuKTsKIH0KIApAQCAtMTQxMSw3ICsxNDEwLDcgQEAKIHZvaWQgZ2ZzMl9mcmVlX2RpKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsIHN0cnVjdCBnZnMyX2lub2RlICppcCkKIHsKIAlnZnMyX2ZyZWVfdW5pbml0X2RpKHJnZCwgaXAtPmlfbnVtLm5vX2FkZHIpOwotCWdmczJfcXVvdGFfY2hhbmdlKGlwLCAtMSwgaXAtPmlfZGkuZGlfdWlkLCBpcC0+aV9kaS5kaV9naWQpOworCWdmczJfcXVvdGFfY2hhbmdlKGlwLCAtMSwgaXAtPmlfaW5vZGUuaV91aWQsIGlwLT5pX2lub2RlLmlfZ2lkKTsKIAlnZnMyX21ldGFfd2lwZShpcCwgaXAtPmlfbnVtLm5vX2FkZHIsIDEpOwogfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL3N1cGVyLmMgYi9mcy9nZnMyL3N1cGVyLmMKaW5kZXggNmE3OGIxYi4uNDNhMjRmMiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9zdXBlci5jCisrKyBiL2ZzL2dmczIvc3VwZXIuYwpAQCAtOTcsNyArOTcsNyBAQAogICogY2hhbmdlZC4KICAqLwogCi1pbnQgZ2ZzMl9jaGVja19zYihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc2IgKnNiLCBpbnQgc2lsZW50KQoraW50IGdmczJfY2hlY2tfc2Ioc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3NiX2hvc3QgKnNiLCBpbnQgc2lsZW50KQogewogCXVuc2lnbmVkIGludCB4OwogCkBAIC0xODAsNiArMTgwLDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogZ2ZzMl9yZWFkX3N1cGVyIC0gUmVhZCB0aGUgZ2ZzMiBzdXBlciBibG9jayBmcm9tIGRpc2sKKyAqIEBzYjogVGhlIFZGUyBzdXBlciBibG9jaworICogQHNlY3RvcjogVGhlIGxvY2F0aW9uIG9mIHRoZSBzdXBlciBibG9jaworICoKKyAqIFRoaXMgdXNlcyB0aGUgYmlvIGZ1bmN0aW9ucyB0byByZWFkIHRoZSBzdXBlciBibG9jayBmcm9tIGRpc2sKKyAqIGJlY2F1c2Ugd2Ugd2FudCB0byBiZSAxMDAlIHN1cmUgdGhhdCB3ZSBuZXZlciByZWFkIGNhY2hlZCBkYXRhLgorICogQSBzdXBlciBibG9jayBpcyByZWFkIHR3aWNlIG9ubHkgZHVyaW5nIGVhY2ggR0ZTMiBtb3VudCBhbmQgaXMKKyAqIG5ldmVyIHdyaXR0ZW4gdG8gYnkgdGhlIGZpbGVzeXN0ZW0uIFRoZSBmaXJzdCB0aW1lIGl0cyByZWFkIG5vCisgKiBsb2NrcyBhcmUgaGVsZCwgYW5kIHRoZSBvbmx5IGRldGFpbHMgd2hpY2ggYXJlIGxvb2tlZCBhdCBhcmUgdGhvc2UKKyAqIHJlbGF0aW5nIHRvIHRoZSBsb2NraW5nIHByb3RvY29sLiBPbmNlIGxvY2tpbmcgaXMgdXAgYW5kIHdvcmtpbmcsCisgKiB0aGUgc2IgaXMgcmVhZCBhZ2FpbiB1bmRlciB0aGUgbG9jayB0byBlc3RhYmxpc2ggdGhlIGxvY2F0aW9uIG9mCisgKiB0aGUgbWFzdGVyIGRpcmVjdG9yeSAoY29udGFpbnMgcG9pbnRlcnMgdG8gam91cm5hbHMgZXRjKSBhbmQgdGhlCisgKiByb290IGRpcmVjdG9yeS4KKyAqCisgKiBSZXR1cm5zOiBBIHBhZ2UgY29udGFpbmluZyB0aGUgc2Igb3IgTlVMTAorICovCisKIHN0cnVjdCBwYWdlICpnZnMyX3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc2VjdG9yX3Qgc2VjdG9yKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMTk5LDcgKzIxNyw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yICogKHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5KTsKIAliaW8tPmJpX2JkZXYgPSBzYi0+c19iZGV2OwogCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfU0laRSwgMCk7CiAKQEAgLTUwOCw3ICs1MjYsNyBAQAogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShzZHAtPnNkX2pkZXNjLT5qZF9pbm9kZSk7CiAJc3RydWN0IGdmczJfZ2xvY2sgKmpfZ2wgPSBpcC0+aV9nbDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgdF9naDsKLQlzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyIGhlYWQ7CisJc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0IGhlYWQ7CiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF90cmFuc19nbCwgTE1fU1RfU0hBUkVELApAQCAtNTE3LDcgKzUzNSw3IEBACiAJCXJldHVybiBlcnJvcjsKIAogCWdmczJfbWV0YV9jYWNoZV9mbHVzaChpcCk7Ci0Jal9nbC0+Z2xfb3BzLT5nb19pbnZhbChqX2dsLCBESU9fTUVUQURBVEEgfCBESU9fREFUQSk7CisJal9nbC0+Z2xfb3BzLT5nb19pbnZhbChqX2dsLCBESU9fTUVUQURBVEEpOwogCiAJZXJyb3IgPSBnZnMyX2ZpbmRfamhlYWQoc2RwLT5zZF9qZGVzYywgJmhlYWQpOwogCWlmIChlcnJvcikKQEAgLTU4Nyw5ICs2MDUsOSBAQAogaW50IGdmczJfc3RhdGZzX2luaXQoc3RydWN0IGdmczJfc2JkICpzZHApCiB7CiAJc3RydWN0IGdmczJfaW5vZGUgKm1faXAgPSBHRlMyX0koc2RwLT5zZF9zdGF0ZnNfaW5vZGUpOwotCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2UgKm1fc2MgPSAmc2RwLT5zZF9zdGF0ZnNfbWFzdGVyOworCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbV9zYyA9ICZzZHAtPnNkX3N0YXRmc19tYXN0ZXI7CiAJc3RydWN0IGdmczJfaW5vZGUgKmxfaXAgPSBHRlMyX0koc2RwLT5zZF9zY19pbm9kZSk7Ci0Jc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqbF9zYyA9ICZzZHAtPnNkX3N0YXRmc19sb2NhbDsKKwlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKmxfc2MgPSAmc2RwLT5zZF9zdGF0ZnNfbG9jYWw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICptX2JoLCAqbF9iaDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CiAJaW50IGVycm9yOwpAQCAtNjM0LDcgKzY1Miw3IEBACiAJCQlzNjQgZGlub2RlcykKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqbF9pcCA9IEdGUzJfSShzZHAtPnNkX3NjX2lub2RlKTsKLQlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlICpsX3NjID0gJnNkcC0+c2Rfc3RhdGZzX2xvY2FsOworCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbF9zYyA9ICZzZHAtPnNkX3N0YXRmc19sb2NhbDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxfYmg7CiAJaW50IGVycm9yOwogCkBAIC02NjAsOCArNjc4LDggQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqbV9pcCA9IEdGUzJfSShzZHAtPnNkX3N0YXRmc19pbm9kZSk7CiAJc3RydWN0IGdmczJfaW5vZGUgKmxfaXAgPSBHRlMyX0koc2RwLT5zZF9zY19pbm9kZSk7Ci0Jc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqbV9zYyA9ICZzZHAtPnNkX3N0YXRmc19tYXN0ZXI7Ci0Jc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqbF9zYyA9ICZzZHAtPnNkX3N0YXRmc19sb2NhbDsKKwlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKm1fc2MgPSAmc2RwLT5zZF9zdGF0ZnNfbWFzdGVyOworCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbF9zYyA9ICZzZHAtPnNkX3N0YXRmc19sb2NhbDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICptX2JoLCAqbF9iaDsKIAlpbnQgZXJyb3I7CkBAIC03MjcsMTAgKzc0NSwxMCBAQAogICogUmV0dXJuczogZXJybm8KICAqLwogCi1pbnQgZ2ZzMl9zdGF0ZnNfaShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqc2MpCitpbnQgZ2ZzMl9zdGF0ZnNfaShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKIHsKLQlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlICptX3NjID0gJnNkcC0+c2Rfc3RhdGZzX21hc3RlcjsKLQlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlICpsX3NjID0gJnNkcC0+c2Rfc3RhdGZzX2xvY2FsOworCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbV9zYyA9ICZzZHAtPnNkX3N0YXRmc19tYXN0ZXI7CisJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpsX3NjID0gJnNkcC0+c2Rfc3RhdGZzX2xvY2FsOwogCiAJc3Bpbl9sb2NrKCZzZHAtPnNkX3N0YXRmc19zcGluKTsKIApAQCAtNzYwLDcgKzc3OCw3IEBACiAgKi8KIAogc3RhdGljIGludCBzdGF0ZnNfc2xvd19maWxsKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsCi0JCQkgICAgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqc2MpCisJCQkgICAgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKIHsKIAlnZnMyX3JncnBfdmVyaWZ5KHJnZCk7CiAJc2MtPnNjX3RvdGFsICs9IHJnZC0+cmRfcmkucmlfZGF0YTsKQEAgLTc4Miw3ICs4MDAsNyBAQAogICogUmV0dXJuczogZXJybm8KICAqLwogCi1pbnQgZ2ZzMl9zdGF0ZnNfc2xvdyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqc2MpCitpbnQgZ2ZzMl9zdGF0ZnNfc2xvdyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKIHsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgcmlfZ2g7CiAJc3RydWN0IGdmczJfcmdycGQgKnJnZF9uZXh0OwpAQCAtNzkyLDcgKzgxMCw3IEBACiAJaW50IGRvbmU7CiAJaW50IGVycm9yID0gMCwgZXJyOwogCi0JbWVtc2V0KHNjLCAwLCBzaXplb2Yoc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSkpOworCW1lbXNldChzYywgMCwgc2l6ZW9mKHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCkpOwogCWdoYSA9IGtjYWxsb2Moc2xvdHMsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9ob2xkZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdoYSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC04NzMsNyArODkxLDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQ7CiAJc3RydWN0IGxmY2MgKmxmY2M7CiAJTElTVF9IRUFEKGxpc3QpOwotCXN0cnVjdCBnZnMyX2xvZ19oZWFkZXIgbGg7CisJc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0IGxoOwogCWludCBlcnJvcjsKIAogCWVycm9yID0gZ2ZzMl9qaW5kZXhfaG9sZChzZHAsICZqaV9naCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3N1cGVyLmggYi9mcy9nZnMyL3N1cGVyLmgKaW5kZXggNWJiNDQzYS4uZTU5MGIyZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9zdXBlci5oCisrKyBiL2ZzL2dmczIvc3VwZXIuaApAQCAtMTQsNyArMTQsNyBAQAogCiB2b2lkIGdmczJfdHVuZV9pbml0KHN0cnVjdCBnZnMyX3R1bmUgKmd0KTsKIAotaW50IGdmczJfY2hlY2tfc2Ioc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3NiICpzYiwgaW50IHNpbGVudCk7CitpbnQgZ2ZzMl9jaGVja19zYihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc2JfaG9zdCAqc2IsIGludCBzaWxlbnQpOwogaW50IGdmczJfcmVhZF9zYihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfZ2xvY2sgKmdsLCBpbnQgc2lsZW50KTsKIHN0cnVjdCBwYWdlICpnZnMyX3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc2VjdG9yX3Qgc2VjdG9yKTsKIApAQCAtNDUsOCArNDUsOCBAQAogdm9pZCBnZnMyX3N0YXRmc19jaGFuZ2Uoc3RydWN0IGdmczJfc2JkICpzZHAsCiAJCQlzNjQgdG90YWwsIHM2NCBmcmVlLCBzNjQgZGlub2Rlcyk7CiBpbnQgZ2ZzMl9zdGF0ZnNfc3luYyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7Ci1pbnQgZ2ZzMl9zdGF0ZnNfaShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqc2MpOwotaW50IGdmczJfc3RhdGZzX3Nsb3coc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2UgKnNjKTsKK2ludCBnZnMyX3N0YXRmc19pKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKTsKK2ludCBnZnMyX3N0YXRmc19zbG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKTsKIAogaW50IGdmczJfZnJlZXplX2ZzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIHZvaWQgZ2ZzMl91bmZyZWV6ZV9mcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3N5cy5jIGIvZnMvZ2ZzMi9zeXMuYwppbmRleCAwZTBlYzk4Li45ODNlYWYxIDEwMDY0NAotLS0gYS9mcy9nZnMyL3N5cy5jCisrKyBiL2ZzL2dmczIvc3lzLmMKQEAgLTQyNiw5ICs0MjYsNiBAQAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogVFVORV9BVFRSXzIobmFtZSwgbmFtZSMjX3N0b3JlKQogCi1UVU5FX0FUVFIoaWxpbWl0LCAwKTsKLVRVTkVfQVRUUihpbGltaXRfdHJpZXMsIDApOwotVFVORV9BVFRSKGlsaW1pdF9taW4sIDApOwogVFVORV9BVFRSKGRlbW90ZV9zZWNzLCAwKTsKIFRVTkVfQVRUUihpbmNvcmVfbG9nX2Jsb2NrcywgMCk7CiBUVU5FX0FUVFIobG9nX2ZsdXNoX3NlY3MsIDApOwpAQCAtNDQ3LDcgKzQ0NCw2IEBACiBUVU5FX0FUVFIocXVvdGFfY2FjaGVfc2VjcywgMSk7CiBUVU5FX0FUVFIobWF4X2F0b21pY193cml0ZSwgMSk7CiBUVU5FX0FUVFIoc3RhbGxfc2VjcywgMSk7Ci1UVU5FX0FUVFIoZW50cmllc19wZXJfcmVhZGRpciwgMSk7CiBUVU5FX0FUVFIoZ3JlZWR5X2RlZmF1bHQsIDEpOwogVFVORV9BVFRSKGdyZWVkeV9xdWFudHVtLCAxKTsKIFRVTkVfQVRUUihncmVlZHlfbWF4LCAxKTsKQEAgLTQ1OSw5ICs0NTUsNiBAQAogVFVORV9BVFRSXzMocXVvdGFfc2NhbGUsIHF1b3RhX3NjYWxlX3Nob3csIHF1b3RhX3NjYWxlX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnR1bmVfYXR0cnNbXSA9IHsKLQkmdHVuZV9hdHRyX2lsaW1pdC5hdHRyLAotCSZ0dW5lX2F0dHJfaWxpbWl0X3RyaWVzLmF0dHIsCi0JJnR1bmVfYXR0cl9pbGltaXRfbWluLmF0dHIsCiAJJnR1bmVfYXR0cl9kZW1vdGVfc2Vjcy5hdHRyLAogCSZ0dW5lX2F0dHJfaW5jb3JlX2xvZ19ibG9ja3MuYXR0ciwKIAkmdHVuZV9hdHRyX2xvZ19mbHVzaF9zZWNzLmF0dHIsCkBAIC00NzgsNyArNDcxLDYgQEAKIAkmdHVuZV9hdHRyX3F1b3RhX2NhY2hlX3NlY3MuYXR0ciwKIAkmdHVuZV9hdHRyX21heF9hdG9taWNfd3JpdGUuYXR0ciwKIAkmdHVuZV9hdHRyX3N0YWxsX3NlY3MuYXR0ciwKLQkmdHVuZV9hdHRyX2VudHJpZXNfcGVyX3JlYWRkaXIuYXR0ciwKIAkmdHVuZV9hdHRyX2dyZWVkeV9kZWZhdWx0LmF0dHIsCiAJJnR1bmVfYXR0cl9ncmVlZHlfcXVhbnR1bS5hdHRyLAogCSZ0dW5lX2F0dHJfZ3JlZWR5X21heC5hdHRyLApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi91dGlsLmMgYi9mcy9nZnMyL3V0aWwuYwppbmRleCAxOTZjNjA0Li5lNTcwN2E5IDEwMDY0NAotLS0gYS9mcy9nZnMyL3V0aWwuYworKysgYi9mcy9nZnMyL3V0aWwuYwpAQCAtMjMsOSArMjMsOSBAQAogI2luY2x1ZGUgImxtLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCi1rbWVtX2NhY2hlX3QgKmdmczJfZ2xvY2tfY2FjaGVwIF9fcmVhZF9tb3N0bHk7Ci1rbWVtX2NhY2hlX3QgKmdmczJfaW5vZGVfY2FjaGVwIF9fcmVhZF9tb3N0bHk7Ci1rbWVtX2NhY2hlX3QgKmdmczJfYnVmZGF0YV9jYWNoZXAgX19yZWFkX21vc3RseTsKK3N0cnVjdCBrbWVtX2NhY2hlICpnZnMyX2dsb2NrX2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RydWN0IGttZW1fY2FjaGUgKmdmczJfaW5vZGVfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3Qga21lbV9jYWNoZSAqZ2ZzMl9idWZkYXRhX2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCiB2b2lkIGdmczJfYXNzZXJ0X2koc3RydWN0IGdmczJfc2JkICpzZHApCiB7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3V0aWwuaCBiL2ZzL2dmczIvdXRpbC5oCmluZGV4IDc2YTUwODkuLjI4OTM4YTQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvdXRpbC5oCisrKyBiL2ZzL2dmczIvdXRpbC5oCkBAIC04Myw4ICs4Myw3IEBACiAJCQkJICAgIGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKQogewogCXN0cnVjdCBnZnMyX21ldGFfaGVhZGVyICptaCA9IChzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciAqKWJoLT5iX2RhdGE7Ci0JdTMyIG1hZ2ljID0gbWgtPm1oX21hZ2ljOwotCW1hZ2ljID0gYmUzMl90b19jcHUobWFnaWMpOworCXUzMiBtYWdpYyA9IGJlMzJfdG9fY3B1KG1oLT5taF9tYWdpYyk7CiAJaWYgKHVubGlrZWx5KG1hZ2ljICE9IEdGUzJfTUFHSUMpKQogCQlyZXR1cm4gZ2ZzMl9tZXRhX2NoZWNrX2lpKHNkcCwgYmgsICJtYWdpYyBudW1iZXIiLCBmdW5jdGlvbiwKIAkJCQkJICBmaWxlLCBsaW5lKTsKQEAgLTEwNyw5ICsxMDYsOCBAQAogCQkJCQljaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSkKIHsKIAlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciAqbWggPSAoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgKiliaC0+Yl9kYXRhOwotCXUzMiBtYWdpYyA9IG1oLT5taF9tYWdpYzsKKwl1MzIgbWFnaWMgPSBiZTMyX3RvX2NwdShtaC0+bWhfbWFnaWMpOwogCXUxNiB0ID0gYmUzMl90b19jcHUobWgtPm1oX3R5cGUpOwotCW1hZ2ljID0gYmUzMl90b19jcHUobWFnaWMpOwogCWlmICh1bmxpa2VseShtYWdpYyAhPSBHRlMyX01BR0lDKSkKIAkJcmV0dXJuIGdmczJfbWV0YV9jaGVja19paShzZHAsIGJoLCAibWFnaWMgbnVtYmVyIiwgZnVuY3Rpb24sCiAJCQkJCSAgZmlsZSwgbGluZSk7CkBAIC0xNDYsOSArMTQ0LDkgQEAKIGdmczJfaW9fZXJyb3JfYmhfaSgoc2RwKSwgKGJoKSwgX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pOwogCiAKLWV4dGVybiBrbWVtX2NhY2hlX3QgKmdmczJfZ2xvY2tfY2FjaGVwOwotZXh0ZXJuIGttZW1fY2FjaGVfdCAqZ2ZzMl9pbm9kZV9jYWNoZXA7Ci1leHRlcm4ga21lbV9jYWNoZV90ICpnZnMyX2J1ZmRhdGFfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpnZnMyX2dsb2NrX2NhY2hlcDsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2ZzMl9pbm9kZV9jYWNoZXA7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmdmczJfYnVmZGF0YV9jYWNoZXA7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdmczJfdHVuZV9nZXRfaShzdHJ1Y3QgZ2ZzMl90dW5lICpndCwKIAkJCQkJICAgdW5zaWduZWQgaW50ICpwKQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2Rpci5jIGIvZnMvaGZzL2Rpci5jCmluZGV4IDM3ZDY4MWIuLmUyZTAzNTggMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9kaXIuYworKysgYi9mcy9oZnMvZGlyLmMKQEAgLTUzLDcgKzUzLDcgQEAKICAqLwogc3RhdGljIGludCBoZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCWludCBsZW4sIGVycjsKIAljaGFyIHN0cmJ1ZltIRlNfTUFYX05BTUVMRU5dOwpkaWZmIC0tZ2l0IGEvZnMvaGZzL2lub2RlLmMgYi9mcy9oZnMvaW5vZGUuYwppbmRleCAwMmY1NTczLi41Y2I3ZjhmIDEwMDY0NAotLS0gYS9mcy9oZnMvaW5vZGUuYworKysgYi9mcy9oZnMvaW5vZGUuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmctPmhvc3Q7CiAKIAlyZXR1cm4gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAogCQkJCSAgb2Zmc2V0LCBucl9zZWdzLCBoZnNfZ2V0X2Jsb2NrLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9zdXBlci5jIGIvZnMvaGZzL3N1cGVyLmMKaW5kZXggZDQzYjRmYy4uYTM2OTg3OSAxMDA2NDQKLS0tIGEvZnMvaGZzL3N1cGVyLmMKKysrIGIvZnMvaGZzL3N1cGVyLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlICJoZnNfZnMuaCIKICNpbmNsdWRlICJidHJlZS5oIgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpoZnNfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpoZnNfaW5vZGVfY2FjaGVwOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKQEAgLTE0NSw3ICsxNDUsNyBAQAogewogCXN0cnVjdCBoZnNfaW5vZGVfaW5mbyAqaTsKIAotCWkgPSBrbWVtX2NhY2hlX2FsbG9jKGhmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpID0ga21lbV9jYWNoZV9hbGxvYyhoZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlyZXR1cm4gaSA/ICZpLT52ZnNfaW5vZGUgOiBOVUxMOwogfQogCkBAIC0zOTAsMTEgKzM5MCwxMyBAQAogCQloZnNfZmluZF9leGl0KCZmZCk7CiAJCWdvdG8gYmFpbF9ub19yb290OwogCX0KKwlyZXMgPSAtRUlOVkFMOwogCXJvb3RfaW5vZGUgPSBoZnNfaWdldChzYiwgJmZkLnNlYXJjaF9rZXktPmNhdCwgJnJlYyk7CiAJaGZzX2ZpbmRfZXhpdCgmZmQpOwogCWlmICghcm9vdF9pbm9kZSkKIAkJZ290byBiYWlsX25vX3Jvb3Q7CiAKKwlyZXMgPSAtRU5PTUVNOwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CiAJaWYgKCFzYi0+c19yb290KQogCQlnb3RvIGJhaWxfaXB1dDsKQEAgLTQyOCw3ICs0MzAsNyBAQAogCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKIH07CiAKLXN0YXRpYyB2b2lkIGhmc19pbml0X29uY2Uodm9pZCAqcCwga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBoZnNfaW5pdF9vbmNlKHZvaWQgKnAsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGhmc19pbm9kZV9pbmZvICppID0gcDsKIApkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9kaXIuYyBiL2ZzL2hmc3BsdXMvZGlyLmMKaW5kZXggN2UzMDk3NS4uZTg4NmFjOCAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9kaXIuYworKysgYi9mcy9oZnNwbHVzL2Rpci5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAogc3RhdGljIGludCBoZnNwbHVzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlpbnQgbGVuLCBlcnI7CiAJY2hhciBzdHJidWZbSEZTUExVU19NQVhfU1RSTEVOICsgMV07CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2lub2RlLmMgYi9mcy9oZnNwbHVzL2lub2RlLmMKaW5kZXggOWUzNjc1Mi4uNzVlOGM0ZCAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9pbm9kZS5jCisrKyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwpAQCAtOTcsNyArOTcsNyBAQAogCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nLT5ob3N0OwogCiAJcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKIAkJCQkgIG9mZnNldCwgbnJfc2VncywgaGZzcGx1c19nZXRfYmxvY2ssIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9zdXBlci5jIGIvZnMvaGZzcGx1cy9zdXBlci5jCmluZGV4IDE5NGVlZGUuLjBmNTEzYzYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvc3VwZXIuYworKysgYi9mcy9oZnNwbHVzL3N1cGVyLmMKQEAgLTQzNCwxMyArNDM0LDEzIEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkV4dGVuZGVkIE1hY2ludG9zaCBGaWxlc3lzdGVtIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmhmc3BsdXNfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpoZnNwbHVzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqaGZzcGx1c19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8gKmk7CiAKLQlpID0ga21lbV9jYWNoZV9hbGxvYyhoZnNwbHVzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWkgPSBrbWVtX2NhY2hlX2FsbG9jKGhmc3BsdXNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlyZXR1cm4gaSA/ICZpLT52ZnNfaW5vZGUgOiBOVUxMOwogfQogCkBAIC00NjcsNyArNDY3LDcgQEAKIAkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCiB9OwogCi1zdGF0aWMgdm9pZCBoZnNwbHVzX2luaXRfb25jZSh2b2lkICpwLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGhmc3BsdXNfaW5pdF9vbmNlKHZvaWQgKnAsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGhmc3BsdXNfaW5vZGVfaW5mbyAqaSA9IHA7CiAKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKaW5kZXggYjZiZDMzYy4uMWU2ZmMzNyAxMDA2NDQKLS0tIGEvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKKysrIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlyZXR1cm4obGlzdF9lbnRyeShpbm9kZSwgc3RydWN0IGhvc3Rmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpKTsKIH0KIAotI2RlZmluZSBGSUxFX0hPU1RGU19JKGZpbGUpIEhPU1RGU19JKChmaWxlKS0+Zl9kZW50cnktPmRfaW5vZGUpCisjZGVmaW5lIEZJTEVfSE9TVEZTX0koZmlsZSkgSE9TVEZTX0koKGZpbGUpLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKQogCiBpbnQgaG9zdGZzX2RfZGVsZXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKQEAgLTMyNSw3ICszMjUsNyBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXh0LCBpbm87CiAJaW50IGVycm9yLCBsZW47CiAKLQluYW1lID0gZGVudHJ5X25hbWUoZmlsZS0+Zl9kZW50cnksIDApOworCW5hbWUgPSBkZW50cnlfbmFtZShmaWxlLT5mX3BhdGguZGVudHJ5LCAwKTsKIAlpZihuYW1lID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKIAlkaXIgPSBvcGVuX2RpcihuYW1lLCAmZXJyb3IpOwogCWtmcmVlKG5hbWUpOwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJaWYodykKIAkJciA9IDE7CiAKLQluYW1lID0gZGVudHJ5X25hbWUoZmlsZS0+Zl9kZW50cnksIDApOworCW5hbWUgPSBkZW50cnlfbmFtZShmaWxlLT5mX3BhdGguZGVudHJ5LCAwKTsKIAlpZihuYW1lID09IE5VTEwpCiAJCXJldHVybigtRU5PTUVNKTsKIApkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kaXIuYyBiL2ZzL2hwZnMvZGlyLmMKaW5kZXggZWNjOTE4MC4uNjkxNmM0MSAxMDA2NDQKLS0tIGEvZnMvaHBmcy9kaXIuYworKysgYi9mcy9ocGZzL2Rpci5jCkBAIC0yNCw3ICsyNCw3IEBACiAJbG9mZl90IG5ld19vZmYgPSBvZmYgKyAod2hlbmNlID09IDEgPyBmaWxwLT5mX3BvcyA6IDApOwogCWxvZmZfdCBwb3M7CiAJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOwotCXN0cnVjdCBpbm9kZSAqaSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpLT5pX3NiOwogCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQgaHBmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX2lub2RlID0gaHBmc19pKGlub2RlKTsKIAlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CiAJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKQEAgLTg0LDcgKzg0LDggQEAKIAkJfQogCQlpZiAoIWZuby0+ZGlyZmxhZykgewogCQkJZSA9IDE7Ci0JCQlocGZzX2Vycm9yKGlub2RlLT5pX3NiLCAibm90IGEgZGlyZWN0b3J5LCBmbm9kZSAlMDh4Iixpbm9kZS0+aV9pbm8pOworCQkJaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgIm5vdCBhIGRpcmVjdG9yeSwgZm5vZGUgJTA4bHgiLAorCQkJCQkodW5zaWduZWQgbG9uZylpbm9kZS0+aV9pbm8pOwogCQl9CiAJCWlmIChocGZzX2lub2RlLT5pX2RubyAhPSBmbm8tPnUuZXh0ZXJuYWxbMF0uZGlza19zZWNubykgewogCQkJZSA9IDE7CkBAIC0xNDQsOCArMTQ1LDExIEBACiAJCX0KIAkJaWYgKGRlLT5maXJzdCB8fCBkZS0+bGFzdCkgewogCQkJaWYgKGhwZnNfc2IoaW5vZGUtPmlfc2IpLT5zYl9jaGspIHsKLQkJCQlpZiAoZGUtPmZpcnN0ICYmICFkZS0+bGFzdCAmJiAoZGUtPm5hbWVsZW4gIT0gMiB8fCBkZSAtPm5hbWVbMF0gIT0gMSB8fCBkZS0+bmFtZVsxXSAhPSAxKSkgaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgImhwZnNfcmVhZGRpcjogYmFkIF5BXkEgZW50cnk7IHBvcyA9ICUwOHgiLCBvbGRfcG9zKTsKLQkJCQlpZiAoZGUtPmxhc3QgJiYgKGRlLT5uYW1lbGVuICE9IDEgfHwgZGUgLT5uYW1lWzBdICE9IDI1NSkpIGhwZnNfZXJyb3IoaW5vZGUtPmlfc2IsICJocGZzX3JlYWRkaXI6IGJhZCBcXDM3NyBlbnRyeTsgcG9zID0gJTA4eCIsIG9sZF9wb3MpOworCQkJCWlmIChkZS0+Zmlyc3QgJiYgIWRlLT5sYXN0ICYmIChkZS0+bmFtZWxlbiAhPSAyCisJCQkJICAgIHx8IGRlIC0+bmFtZVswXSAhPSAxIHx8IGRlLT5uYW1lWzFdICE9IDEpKQorCQkJCQlocGZzX2Vycm9yKGlub2RlLT5pX3NiLCAiaHBmc19yZWFkZGlyOiBiYWQgXkFeQSBlbnRyeTsgcG9zID0gJTA4bHgiLCBvbGRfcG9zKTsKKwkJCQlpZiAoZGUtPmxhc3QgJiYgKGRlLT5uYW1lbGVuICE9IDEgfHwgZGUgLT5uYW1lWzBdICE9IDI1NSkpCisJCQkJCWhwZnNfZXJyb3IoaW5vZGUtPmlfc2IsICJocGZzX3JlYWRkaXI6IGJhZCBcXDM3NyBlbnRyeTsgcG9zID0gJTA4bHgiLCBvbGRfcG9zKTsKIAkJCX0KIAkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKIAkJCWdvdG8gYWdhaW47CmRpZmYgLS1naXQgYS9mcy9ocGZzL2Rub2RlLmMgYi9mcy9ocGZzL2Rub2RlLmMKaW5kZXggMjI5ZmYyZi4uZmU4M2MyYiAxMDA2NDQKLS0tIGEvZnMvaHBmcy9kbm9kZS5jCisrKyBiL2ZzL2hwZnMvZG5vZGUuYwpAQCAtNTMzLDEwICs1MzMsMTMgQEAKIAkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJCQlzdHJ1Y3QgZG5vZGUgKmQxOwogCQkJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoMTsKLQkJCWlmIChocGZzX3NiKGktPmlfc2IpLT5zYl9jaGspIGlmICh1cCAhPSBpLT5pX2lubykgewotCQkJCWhwZnNfZXJyb3IoaS0+aV9zYiwgImJhZCBwb2ludGVyIHRvIGZub2RlLCBkbm9kZSAlMDh4LCBwb2ludGluZyB0byAlMDh4LCBzaG91bGQgYmUgJTA4eCIsIGRubywgdXAsIGktPmlfaW5vKTsKKwkJCWlmIChocGZzX3NiKGktPmlfc2IpLT5zYl9jaGspCisJCQkgICAgaWYgKHVwICE9IGktPmlfaW5vKSB7CisJCQkJaHBmc19lcnJvcihpLT5pX3NiLAorCQkJCQkiYmFkIHBvaW50ZXIgdG8gZm5vZGUsIGRub2RlICUwOHgsIHBvaW50aW5nIHRvICUwOHgsIHNob3VsZCBiZSAlMDhseCIsCisJCQkJCWRubywgdXAsICh1bnNpZ25lZCBsb25nKWktPmlfaW5vKTsKIAkJCQlyZXR1cm47Ci0JCQl9CisJCQkgICAgfQogCQkJaWYgKChkMSA9IGhwZnNfbWFwX2Rub2RlKGktPmlfc2IsIGRvd24sICZxYmgxKSkpIHsKIAkJCQlkMS0+dXAgPSB1cDsKIAkJCQlkMS0+cm9vdF9kbm9kZSA9IDE7CkBAIC04NTEsNyArODU0LDkgQEAKIAkvKiBHb2luZyB0byB0aGUgbmV4dCBkaXJlbnQgKi8KIAlpZiAoKGQgPSBkZV9uZXh0X2RlKGRlKSkgPCBkbm9kZV9lbmRfZGUoZG5vZGUpKSB7CiAJCWlmICghKCsrKnBvc3AgJiAwNzcpKSB7Ci0JCQlocGZzX2Vycm9yKGlub2RlLT5pX3NiLCAibWFwX3Bvc19kaXJlbnQ6IHBvcyBjcm9zc2VkIGRub2RlIGJvdW5kYXJ5OyBwb3MgPSAlMDh4IiwgKnBvc3ApOworCQkJaHBmc19lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkibWFwX3Bvc19kaXJlbnQ6IHBvcyBjcm9zc2VkIGRub2RlIGJvdW5kYXJ5OyBwb3MgPSAlMDhsbHgiLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKnBvc3ApOwogCQkJZ290byBiYWlsOwogCQl9CiAJCS8qIFdlJ3JlIGdvaW5nIGRvd24gdGhlIHRyZWUgKi8KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvZWEuYyBiL2ZzL2hwZnMvZWEuYwppbmRleCA2NjMzOWRjLi41NDdhODM4IDEwMDY0NAotLS0gYS9mcy9ocGZzL2VhLmMKKysrIGIvZnMvaHBmcy9lYS5jCkBAIC0yNDMsOCArMjQzLDkgQEAKIAkJZm5vZGUtPmVhX29mZnMgPSAweGM0OwogCX0KIAlpZiAoZm5vZGUtPmVhX29mZnMgPCAweGM0IHx8IGZub2RlLT5lYV9vZmZzICsgZm5vZGUtPmFjbF9zaXplX3MgKyBmbm9kZS0+ZWFfc2l6ZV9zID4gMHgyMDApIHsKLQkJaHBmc19lcnJvcihzLCAiZm5vZGUgJTA4eDogZWFfb2ZmcyA9PSAlMDN4LCBlYV9zaXplX3MgPT0gJTAzeCIsCi0JCQlpbm9kZS0+aV9pbm8sIGZub2RlLT5lYV9vZmZzLCBmbm9kZS0+ZWFfc2l6ZV9zKTsKKwkJaHBmc19lcnJvcihzLCAiZm5vZGUgJTA4bHg6IGVhX29mZnMgPT0gJTAzeCwgZWFfc2l6ZV9zID09ICUwM3giLAorCQkJKHVuc2lnbmVkIGxvbmcpaW5vZGUtPmlfaW5vLAorCQkJZm5vZGUtPmVhX29mZnMsIGZub2RlLT5lYV9zaXplX3MpOwogCQlyZXR1cm47CiAJfQogCWlmICgoZm5vZGUtPmVhX3NpemVfcyB8fCAhZm5vZGUtPmVhX3NpemVfbCkgJiYKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvZmlsZS5jIGIvZnMvaHBmcy9maWxlLmMKaW5kZXggOGI5NGQyNC4uZmI0Yzg5MSAxMDA2NDQKLS0tIGEvZnMvaHBmcy9maWxlLmMKKysrIGIvZnMvaHBmcy9maWxlLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAJcmV0dmFsID0gZG9fc3luY193cml0ZShmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKIAlpZiAocmV0dmFsID4gMCkKLQkJaHBmc19pKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKS0+aV9kaXJ0eSA9IDE7CisJCWhwZnNfaShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+aV9kaXJ0eSA9IDE7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvaHBmcy9ocGZzX2ZuLmggYi9mcy9ocGZzL2hwZnNfZm4uaAppbmRleCAzMmFiNTFlLi4xYzA3YWE4IDEwMDY0NAotLS0gYS9mcy9ocGZzL2hwZnNfZm4uaAorKysgYi9mcy9ocGZzL2hwZnNfZm4uaApAQCAtMzE3LDcgKzMxNyw4IEBACiAKIC8qIHN1cGVyLmMgKi8KIAotdm9pZCBocGZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjaGFyICosIC4uLik7Cit2b2lkIGhwZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgLi4uKQorCV9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwogaW50IGhwZnNfc3RvcF9jeWNsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50ICosIGludCAqLCBjaGFyICopOwogdW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubyk7CiAKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvaW5vZGUuYyBiL2ZzL2hwZnMvaW5vZGUuYwppbmRleCA3ZmFlZjg1Li44NWQzZTFkIDEwMDY0NAotLS0gYS9mcy9ocGZzL2lub2RlLmMKKysrIGIvZnMvaHBmcy9pbm9kZS5jCkBAIC0yNTEsNyArMjUxLDEwIEBACiAJCQlkZS0+ZmlsZV9zaXplID0gMDsKIAkJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKIAkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKLQkJfSBlbHNlIGhwZnNfZXJyb3IoaS0+aV9zYiwgImRpcmVjdG9yeSAlMDh4IGRvZXNuJ3QgaGF2ZSAnLicgZW50cnkiLCBpLT5pX2lubyk7CisJCX0gZWxzZQorCQkJaHBmc19lcnJvcihpLT5pX3NiLAorCQkJCSJkaXJlY3RvcnkgJTA4bHggZG9lc24ndCBoYXZlICcuJyBlbnRyeSIsCisJCQkJKHVuc2lnbmVkIGxvbmcpaS0+aV9pbm8pOwogCX0KIAltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJYnJlbHNlKGJoKTsKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvbWFwLmMgYi9mcy9ocGZzL21hcC5jCmluZGV4IDBmZWNkYWMuLmM0NzI0NTggMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvbWFwLmMKKysrIGIvZnMvaHBmcy9tYXAuYwpAQCAtMTI2LDMyICsxMjYsNDAgQEAKIAkJCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhOwogCQkJc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWFfZW5kOwogCQkJaWYgKGZub2RlLT5tYWdpYyAhPSBGTk9ERV9NQUdJQykgewotCQkJCWhwZnNfZXJyb3IocywgImJhZCBtYWdpYyBvbiBmbm9kZSAlMDh4IiwgaW5vKTsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgbWFnaWMgb24gZm5vZGUgJTA4bHgiLAorCQkJCQkodW5zaWduZWQgbG9uZylpbm8pOwogCQkJCWdvdG8gYmFpbDsKIAkJCX0KIAkJCWlmICghZm5vZGUtPmRpcmZsYWcpIHsKIAkJCQlpZiAoKHVuc2lnbmVkKWZub2RlLT5idHJlZS5uX3VzZWRfbm9kZXMgKyAodW5zaWduZWQpZm5vZGUtPmJ0cmVlLm5fZnJlZV9ub2RlcyAhPQogCQkJCSAgICAoZm5vZGUtPmJ0cmVlLmludGVybmFsID8gMTIgOiA4KSkgewotCQkJCQlocGZzX2Vycm9yKHMsICJiYWQgbnVtYmVyIG9mIG5vZGVzIGluIGZub2RlICUwOHgiLCBpbm8pOworCQkJCQlocGZzX2Vycm9yKHMsCisJCQkJCSAgICJiYWQgbnVtYmVyIG9mIG5vZGVzIGluIGZub2RlICUwOGx4IiwKKwkJCQkJICAgICh1bnNpZ25lZCBsb25nKWlubyk7CiAJCQkJCWdvdG8gYmFpbDsKIAkJCQl9CiAJCQkJaWYgKGZub2RlLT5idHJlZS5maXJzdF9mcmVlICE9CiAJCQkJICAgIDggKyBmbm9kZS0+YnRyZWUubl91c2VkX25vZGVzICogKGZub2RlLT5idHJlZS5pbnRlcm5hbCA/IDggOiAxMikpIHsKLQkJCQkJaHBmc19lcnJvcihzLCAiYmFkIGZpcnN0X2ZyZWUgcG9pbnRlciBpbiBmbm9kZSAlMDh4IiwgaW5vKTsKKwkJCQkJaHBmc19lcnJvcihzLAorCQkJCQkgICAgImJhZCBmaXJzdF9mcmVlIHBvaW50ZXIgaW4gZm5vZGUgJTA4bHgiLAorCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpaW5vKTsKIAkJCQkJZ290byBiYWlsOwogCQkJCX0KIAkJCX0KIAkJCWlmIChmbm9kZS0+ZWFfc2l6ZV9zICYmICgoc2lnbmVkIGludClmbm9kZS0+ZWFfb2ZmcyA8IDB4YzQgfHwKIAkJCSAgIChzaWduZWQgaW50KWZub2RlLT5lYV9vZmZzICsgZm5vZGUtPmFjbF9zaXplX3MgKyBmbm9kZS0+ZWFfc2l6ZV9zID4gMHgyMDApKSB7Ci0JCQkJaHBmc19lcnJvcihzLCAiYmFkIEVBIGluZm8gaW4gZm5vZGUgJTA4eDogZWFfb2ZmcyA9PSAlMDR4IGVhX3NpemVfcyA9PSAlMDR4IiwKLQkJCQkJaW5vLCBmbm9kZS0+ZWFfb2ZmcywgZm5vZGUtPmVhX3NpemVfcyk7CisJCQkJaHBmc19lcnJvcihzLAorCQkJCQkiYmFkIEVBIGluZm8gaW4gZm5vZGUgJTA4bHg6IGVhX29mZnMgPT0gJTA0eCBlYV9zaXplX3MgPT0gJTA0eCIsCisJCQkJCSh1bnNpZ25lZCBsb25nKWlubywKKwkJCQkJZm5vZGUtPmVhX29mZnMsIGZub2RlLT5lYV9zaXplX3MpOwogCQkJCWdvdG8gYmFpbDsKIAkJCX0KIAkJCWVhID0gZm5vZGVfZWEoZm5vZGUpOwogCQkJZWFfZW5kID0gZm5vZGVfZW5kX2VhKGZub2RlKTsKIAkJCXdoaWxlIChlYSAhPSBlYV9lbmQpIHsKIAkJCQlpZiAoZWEgPiBlYV9lbmQpIHsKLQkJCQkJaHBmc19lcnJvcihzLCAiYmFkIEVBIGluIGZub2RlICUwOHgiLCBpbm8pOworCQkJCQlocGZzX2Vycm9yKHMsICJiYWQgRUEgaW4gZm5vZGUgJTA4bHgiLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcpaW5vKTsKIAkJCQkJZ290byBiYWlsOwogCQkJCX0KIAkJCQllYSA9IG5leHRfZWEoZWEpOwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9zdXBlci5jIGIvZnMvaHBmcy9zdXBlci5jCmluZGV4IDQ1MGI1ZTAuLmQ0YWJjMWEgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvc3VwZXIuYworKysgYi9mcy9ocGZzL3N1cGVyLmMKQEAgLTQ2LDIxICs0NiwxNyBAQAogfQogCiAvKiBGaWxlc3lzdGVtIGVycm9yLi4uICovCitzdGF0aWMgY2hhciBlcnJfYnVmWzEwMjRdOwogCi0jZGVmaW5lIEVSUl9CVUZfU0laRSAxMDI0Ci0KLXZvaWQgaHBmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNoYXIgKm0sLi4uKQordm9pZCBocGZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JY2hhciAqYnVmOwotCXZhX2xpc3QgbDsKLQl2YV9zdGFydChsLCBtKTsKLQlpZiAoIShidWYgPSBrbWFsbG9jKEVSUl9CVUZfU0laRSwgR0ZQX0tFUk5FTCkpKQotCQlwcmludGsoIkhQRlM6IE5vIG1lbW9yeSBmb3IgZXJyb3IgbWVzc2FnZSAnJXMnXG4iLG0pOwotCWVsc2UgaWYgKHZzcHJpbnRmKGJ1ZiwgbSwgbCkgPj0gRVJSX0JVRl9TSVpFKQotCQlwcmludGsoIkhQRlM6IEdycnJyLi4uIEtlcm5lbCBtZW1vcnkgY29ycnVwdGVkIC4uLiBnb2luZyBvbiwgYnV0IGl0J2xsIGNyYXNoIHZlcnkgc29vbiA6LShcbiIpOwotCXByaW50aygiSFBGUzogZmlsZXN5c3RlbSBlcnJvcjogIik7Ci0JaWYgKGJ1ZikgcHJpbnRrKCIlcyIsIGJ1Zik7Ci0JZWxzZSBwcmludGsoIiVzXG4iLG0pOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGVycl9idWYsIHNpemVvZihlcnJfYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlwcmludGsoIkhQRlM6IGZpbGVzeXN0ZW0gZXJyb3I6ICVzIiwgZXJyX2J1Zik7CiAJaWYgKCFocGZzX3NiKHMpLT5zYl93YXNfZXJyb3IpIHsKIAkJaWYgKGhwZnNfc2IocyktPnNiX2VyciA9PSAyKSB7CiAJCQlwcmludGsoIjsgY3Jhc2hpbmcgdGhlIHN5c3RlbSBiZWNhdXNlIHlvdSB3YW50ZWQgaXRcbiIpOwpAQCAtNzYsNyArNzIsNiBAQAogCQl9IGVsc2UgaWYgKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHByaW50aygiOyBnb2luZyBvbiAtIGJ1dCBhbnl0aGluZyB3b24ndCBiZSBkZXN0cm95ZWQgYmVjYXVzZSBpdCdzIHJlYWQtb25seVxuIik7CiAJCWVsc2UgcHJpbnRrKCI7IGNvcnJ1cHRlZCBmaWxlc3lzdGVtIG1vdW50ZWQgcmVhZC93cml0ZSAtIHlvdXIgY29tcHV0ZXIgd2lsbCBleHBsb2RlIHdpdGhpbiAyMCBzZWNvbmRzIC4uLiBidXQgeW91IHdhbnRlZCBpdCBzbyFcbiIpOwogCX0gZWxzZSBwcmludGsoIlxuIik7Ci0Ja2ZyZWUoYnVmKTsKIAlocGZzX3NiKHMpLT5zYl93YXNfZXJyb3IgPSAxOwogfQogCkBAIC0xNjAsMTIgKzE1NSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMga21lbV9jYWNoZV90ICogaHBmc19pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKiBocGZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqaHBmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmVpOwotCWVpID0gKHN0cnVjdCBocGZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGhwZnNfaW5vZGVfY2FjaGVwLCBTTEFCX05PRlMpOworCWVpID0gKHN0cnVjdCBocGZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGhwZnNfaW5vZGVfY2FjaGVwLCBHRlBfTk9GUyk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJZWktPnZmc19pbm9kZS5pX3ZlcnNpb24gPSAxOwpAQCAtMTc3LDcgKzE3Miw3IEBACiAJa21lbV9jYWNoZV9mcmVlKGhwZnNfaW5vZGVfY2FjaGVwLCBocGZzX2koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICopIGZvbzsKIApkaWZmIC0tZ2l0IGEvZnMvaHBwZnMvaHBwZnNfa2Vybi5jIGIvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCmluZGV4IDY0MjY3NWYuLmFmZDM0MGEgMTAwNjQ0Ci0tLSBhL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYworKysgYi9mcy9ocHBmcy9ocHBmc19rZXJuLmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogCXNzaXplX3QgKCpyZWFkKShzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIAlzc2l6ZV90IG47CiAKLQlyZWFkID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfZm9wLT5yZWFkOworCXJlYWQgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2ZvcC0+cmVhZDsKIAogCWlmKCFpc191c2VyKQogCQlzZXRfZnMoS0VSTkVMX0RTKTsKQEAgLTMyMCw3ICszMjAsNyBAQAogCXNzaXplX3QgKCp3cml0ZSkoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CiAJaW50IGVycjsKIAotCXdyaXRlID0gcHJvY19maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9mb3AtPndyaXRlOworCXdyaXRlID0gcHJvY19maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2ZvcC0+d3JpdGU7CiAKIAlwcm9jX2ZpbGUtPmZfcG9zID0gZmlsZS0+Zl9wb3M7CiAJZXJyID0gKCp3cml0ZSkocHJvY19maWxlLCBidWYsIGxlbiwgJnByb2NfZmlsZS0+Zl9wb3MpOwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJaWYoZGF0YSA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCWhvc3RfZmlsZSA9IGRlbnRyeV9uYW1lKGZpbGUtPmZfZGVudHJ5LCBzdHJsZW4oIi9ydyIpKTsKKwlob3N0X2ZpbGUgPSBkZW50cnlfbmFtZShmaWxlLT5mX3BhdGguZGVudHJ5LCBzdHJsZW4oIi9ydyIpKTsKIAlpZihob3N0X2ZpbGUgPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZTI7CiAKQEAgLTU0Nyw3ICs1NDcsNyBAQAogCWxvZmZfdCAoKmxsc2Vlaykoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOwogCWxvZmZfdCByZXQ7CiAKLQlsbHNlZWsgPSBwcm9jX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2ZvcC0+bGxzZWVrOworCWxsc2VlayA9IHByb2NfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9mb3AtPmxsc2VlazsKIAlpZihsbHNlZWsgIT0gTlVMTCl7CiAJCXJldCA9ICgqbGxzZWVrKShwcm9jX2ZpbGUsIG9mZiwgd2hlcmUpOwogCQlpZihyZXQgPCAwKQpAQCAtNTkxLDEwICs1OTEsMTAgQEAKIAlzdHJ1Y3QgaHBwZnNfZGlyZW50IGRpcmVudCA9ICgoc3RydWN0IGhwcGZzX2RpcmVudCkKIAkJICAgICAgICAgICAgICAgICAgICAgIHsgLnZmc19kaXJlbnQgIAk9IGVudCwKIAkJCQkJLmZpbGxkaXIgCT0gZmlsbGRpciwKLQkJCQkJLmRlbnRyeSAgCT0gZmlsZS0+Zl9kZW50cnkgfSApOworCQkJCQkuZGVudHJ5ICAJPSBmaWxlLT5mX3BhdGguZGVudHJ5IH0gKTsKIAlpbnQgZXJyOwogCi0JcmVhZGRpciA9IHByb2NfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfZm9wLT5yZWFkZGlyOworCXJlYWRkaXIgPSBwcm9jX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfZm9wLT5yZWFkZGlyOwogCiAJcHJvY19maWxlLT5mX3BvcyA9IGZpbGUtPmZfcG9zOwogCWVyciA9ICgqcmVhZGRpcikocHJvY19maWxlLCAmZGlyZW50LCBocHBmc19maWxsZGlyKTsKZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKaW5kZXggNGVlM2YwMC4uZWQyYzIyMyAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTU4LDI4ICs1OCwyMyBAQAogCiBzdGF0aWMgaW50IGh1Z2V0bGJmc19maWxlX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlsb2ZmX3QgbGVuLCB2bWFfbGVuOwogCWludCByZXQ7CiAKLQlpZiAodm1hLT52bV9wZ29mZiAmIChIUEFHRV9TSVpFIC8gUEFHRV9TSVpFIC0gMSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHZtYS0+dm1fc3RhcnQgJiB+SFBBR0VfTUFTSykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodm1hLT52bV9lbmQgJiB+SFBBR0VfTUFTSykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0IDwgSFBBR0VfU0laRSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiB2bWEgYWxpZ25tZW50IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBieSBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlLgorCSAqIElmIHlvdSBhZGQgYW55IGVycm9yIHJldHVybnMgaGVyZSwgZG8gc28gYWZ0ZXIgc2V0dGluZyBWTV9IVUdFVExCLAorCSAqIHNvIGlzX3ZtX2h1Z2V0bGJfcGFnZSB0ZXN0cyBiZWxvdyB1bm1hcF9yZWdpb24gZ28gdGhlIHJpZ2h0IHdheQorCSAqIHdoZW4gZG9fbW1hcF9wZ29mZiB1bndpbmRzIChtYXkgYmUgaW1wb3J0YW50IG9uIHBvd2VycGMgYW5kIGlhNjQpLgorCSAqLworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSFVHRVRMQiB8IFZNX1JFU0VSVkVEOworCXZtYS0+dm1fb3BzID0gJmh1Z2V0bGJfdm1fb3BzOwogCiAJdm1hX2xlbiA9IChsb2ZmX3QpKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJZmlsZV9hY2Nlc3NlZChmaWxlKTsKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0hVR0VUTEIgfCBWTV9SRVNFUlZFRDsKLQl2bWEtPnZtX29wcyA9ICZodWdldGxiX3ZtX29wczsKIAogCXJldCA9IC1FTk9NRU07CiAJbGVuID0gdm1hX2xlbiArICgobG9mZl90KXZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCk7CkBAIC0yNzEsMjYgKzI2NiwyNCBAQAogCQlodWdldGxiZnNfZm9yZ2V0X2lub2RlKGlub2RlKTsKIH0KIAotLyoKLSAqIGhfcGdvZmYgaXMgaW4gSFBBR0VfU0laRSB1bml0cy4KLSAqIHZtYS0+dm1fcGdvZmYgaXMgaW4gUEFHRV9TSVpFIHVuaXRzLgotICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWh1Z2V0bGJfdm10cnVuY2F0ZV9saXN0KHN0cnVjdCBwcmlvX3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBoX3Bnb2ZmKQoraHVnZXRsYl92bXRydW5jYXRlX2xpc3Qoc3RydWN0IHByaW9fdHJlZV9yb290ICpyb290LCBwZ29mZl90IHBnb2ZmKQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXN0cnVjdCBwcmlvX3RyZWVfaXRlciBpdGVyOwogCi0Jdm1hX3ByaW9fdHJlZV9mb3JlYWNoKHZtYSwgJml0ZXIsIHJvb3QsIGhfcGdvZmYsIFVMT05HX01BWCkgewotCQl1bnNpZ25lZCBsb25nIGhfdm1fcGdvZmY7CisJdm1hX3ByaW9fdHJlZV9mb3JlYWNoKHZtYSwgJml0ZXIsIHJvb3QsIHBnb2ZmLCBVTE9OR19NQVgpIHsKIAkJdW5zaWduZWQgbG9uZyB2X29mZnNldDsKIAotCQloX3ZtX3Bnb2ZmID0gdm1hLT52bV9wZ29mZiA+PiAoSFBBR0VfU0hJRlQgLSBQQUdFX1NISUZUKTsKLQkJdl9vZmZzZXQgPSAoaF9wZ29mZiAtIGhfdm1fcGdvZmYpIDw8IEhQQUdFX1NISUZUOwogCQkvKgotCQkgKiBJcyB0aGlzIFZNQSBmdWxseSBvdXRzaWRlIHRoZSB0cnVuY2F0aW9uIHBvaW50PworCQkgKiBDYW4gdGhlIGV4cHJlc3Npb24gYmVsb3cgb3ZlcmZsb3cgb24gMzItYml0IGFyY2hlcz8KKwkJICogTm8sIGJlY2F1c2UgdGhlIHByaW9fdHJlZSByZXR1cm5zIHVzIG9ubHkgdGhvc2Ugdm1hcworCQkgKiB3aGljaCBvdmVybGFwIHRoZSB0cnVuY2F0ZWQgYXJlYSBzdGFydGluZyBhdCBwZ29mZiwKKwkJICogYW5kIG5vIHZtYSBvbiBhIDMyLWJpdCBhcmNoIGNhbiBzcGFuIGJleW9uZCB0aGUgNEdCLgogCQkgKi8KLQkJaWYgKGhfdm1fcGdvZmYgPj0gaF9wZ29mZikKKwkJaWYgKHZtYS0+dm1fcGdvZmYgPCBwZ29mZikKKwkJCXZfb2Zmc2V0ID0gKHBnb2ZmIC0gdm1hLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVDsKKwkJZWxzZQogCQkJdl9vZmZzZXQgPSAwOwogCiAJCV9fdW5tYXBfaHVnZXBhZ2VfcmFuZ2Uodm1hLApAQCAtMzAzLDE0ICsyOTYsMTQgQEAKICAqLwogc3RhdGljIGludCBodWdldGxiX3ZtdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCkKIHsKLQl1bnNpZ25lZCBsb25nIHBnb2ZmOworCXBnb2ZmX3QgcGdvZmY7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCiAJaWYgKG9mZnNldCA+IGlub2RlLT5pX3NpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJQlVHX09OKG9mZnNldCAmIH5IUEFHRV9NQVNLKTsKLQlwZ29mZiA9IG9mZnNldCA+PiBIUEFHRV9TSElGVDsKKwlwZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwogCiAJaW5vZGUtPmlfc2l6ZSA9IG9mZnNldDsKIAlzcGluX2xvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKQEAgLTUyMCw3ICs1MTMsNyBAQAogfQogCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmh1Z2V0bGJmc19pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmh1Z2V0bGJmc19pbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmh1Z2V0bGJmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewpAQCAtNTI5LDcgKzUyMiw3IEBACiAKIAlpZiAodW5saWtlbHkoIWh1Z2V0bGJmc19kZWNfZnJlZV9pbm9kZXMoc2JpbmZvKSkpCiAJCXJldHVybiBOVUxMOwotCXAgPSBrbWVtX2NhY2hlX2FsbG9jKGh1Z2V0bGJmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlwID0ga21lbV9jYWNoZV9hbGxvYyhodWdldGxiZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXApKSB7CiAJCWh1Z2V0bGJmc19pbmNfZnJlZV9pbm9kZXMoc2JpbmZvKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC01NTIsNyArNTQ1LDcgQEAKIH07CiAKIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGh1Z2V0bGJmc19pbm9kZV9pbmZvICopZm9vOwogCkBAIC02MjQsNyArNjE3LDYgQEAKIAkJCQlkb19kaXYoc2l6ZSwgMTAwKTsKIAkJCQlyZXN0Kys7CiAJCQl9Ci0JCQlzaXplICY9IEhQQUdFX01BU0s7CiAJCQlwY29uZmlnLT5ucl9ibG9ja3MgPSAoc2l6ZSA+PiBIUEFHRV9TSElGVCk7CiAJCQl2YWx1ZSA9IHJlc3Q7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsIm5yX2lub2RlcyIpKSB7CkBAIC03ODIsOCArNzc0LDggQEAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCWlub2RlLT5pX3NpemUgPSBzaXplOwogCWlub2RlLT5pX25saW5rID0gMDsKLQlmaWxlLT5mX3Zmc21udCA9IG1udGdldChodWdldGxiZnNfdmZzbW91bnQpOwotCWZpbGUtPmZfZGVudHJ5ID0gZGVudHJ5OworCWZpbGUtPmZfcGF0aC5tbnQgPSBtbnRnZXQoaHVnZXRsYmZzX3Zmc21vdW50KTsKKwlmaWxlLT5mX3BhdGguZGVudHJ5ID0gZGVudHJ5OwogCWZpbGUtPmZfbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAJZmlsZS0+Zl9vcCA9ICZodWdldGxiZnNfZmlsZV9vcGVyYXRpb25zOwogCWZpbGUtPmZfbW9kZSA9IEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRDsKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IGQ5YTIxZDEuLmJmMjFkYzYgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtOTcsNyArOTcsNyBAQAogICovCiBzdHJ1Y3QgaW5vZGVzX3N0YXRfdCBpbm9kZXNfc3RhdDsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIGlub2RlX2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICogaW5vZGVfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC0xMDksNyArMTA5LDcgQEAKIAlpZiAoc2ItPnNfb3AtPmFsbG9jX2lub2RlKQogCQlpbm9kZSA9IHNiLT5zX29wLT5hbGxvY19pbm9kZShzYik7CiAJZWxzZQotCQlpbm9kZSA9IChzdHJ1Y3QgaW5vZGUgKikga21lbV9jYWNoZV9hbGxvYyhpbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwkJaW5vZGUgPSAoc3RydWN0IGlub2RlICopIGttZW1fY2FjaGVfYWxsb2MoaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAogCWlmIChpbm9kZSkgewogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKQEAgLTIwOSw3ICsyMDksNyBAQAogCiBFWFBPUlRfU1lNQk9MKGlub2RlX2luaXRfb25jZSk7CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGlub2RlICogaW5vZGUgPSAoc3RydWN0IGlub2RlICopIGZvbzsKIApAQCAtMTE0NCw3ICsxMTQ0LDYgQEAKIAkJcmVzID0gaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMtPmJtYXAoaW5vZGUtPmlfbWFwcGluZywgYmxvY2spOwogCXJldHVybiByZXM7CiB9Ci0KIEVYUE9SVF9TWU1CT0woYm1hcCk7CiAKIC8qKgpAQCAtMTE2MywyNyArMTE2Miw0MyBAQAogCiAJaWYgKElTX1JET05MWShpbm9kZSkpCiAJCXJldHVybjsKLQotCWlmICgoaW5vZGUtPmlfZmxhZ3MgJiBTX05PQVRJTUUpIHx8Ci0JICAgIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX05PQVRJTUUpIHx8Ci0JICAgICgoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSkKKwlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBTX05PQVRJTUUpCisJCXJldHVybjsKKwlpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19OT0FUSU1FKQorCQlyZXR1cm47CisJaWYgKChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybjsKIAogCS8qCiAJICogV2UgbWF5IGhhdmUgYSBOVUxMIHZmc21vdW50IHdoZW4gY29taW5nIGZyb20gTkZTRAogCSAqLwotCWlmIChtbnQgJiYKLQkgICAgKChtbnQtPm1udF9mbGFncyAmIE1OVF9OT0FUSU1FKSB8fAotCSAgICAgKChtbnQtPm1udF9mbGFncyAmIE1OVF9OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSkpCi0JCXJldHVybjsKKwlpZiAobW50KSB7CisJCWlmIChtbnQtPm1udF9mbGFncyAmIE1OVF9OT0FUSU1FKQorCQkJcmV0dXJuOworCQlpZiAoKG1udC0+bW50X2ZsYWdzICYgTU5UX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQlyZXR1cm47CisKKwkJaWYgKG1udC0+bW50X2ZsYWdzICYgTU5UX1JFTEFUSU1FKSB7CisJCQkvKgorCQkJICogV2l0aCByZWxhdGl2ZSBhdGltZSwgb25seSB1cGRhdGUgYXRpbWUgaWYgdGhlCisJCQkgKiBwcmV2aW91cyBhdGltZSBpcyBlYXJsaWVyIHRoYW4gZWl0aGVyIHRoZSBjdGltZSBvcgorCQkJICogbXRpbWUuCisJCQkgKi8KKwkJCWlmICh0aW1lc3BlY19jb21wYXJlKCZpbm9kZS0+aV9tdGltZSwKKwkJCQkJCSZpbm9kZS0+aV9hdGltZSkgPCAwICYmCisJCQkgICAgdGltZXNwZWNfY29tcGFyZSgmaW5vZGUtPmlfY3RpbWUsCisJCQkJCQkmaW5vZGUtPmlfYXRpbWUpIDwgMCkKKwkJCQlyZXR1cm47CisJCX0KKwl9CiAKIAlub3cgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwotCWlmICghdGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX2F0aW1lLCAmbm93KSkgewotCQlpbm9kZS0+aV9hdGltZSA9IG5vdzsKLQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKLQl9Ci19CisJaWYgKHRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9hdGltZSwgJm5vdykpCisJCXJldHVybjsKIAorCWlub2RlLT5pX2F0aW1lID0gbm93OworCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7Cit9CiBFWFBPUlRfU1lNQk9MKHRvdWNoX2F0aW1lKTsKIAogLyoqCkBAIC0xMjAwLDcgKzEyMTUsNyBAQAogCiB2b2lkIGZpbGVfdXBkYXRlX3RpbWUoc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCB0aW1lc3BlYyBub3c7CiAJaW50IHN5bmNfaXQgPSAwOwogCkBAIC0xMjQyLDkgKzEyNTcsNiBAQAogICovCiAjaWZkZWYgQ09ORklHX1FVT1RBCiAKLS8qIEZ1bmN0aW9uIGJhY2sgaW4gZHF1b3QuYyAqLwotaW50IHJlbW92ZV9pbm9kZV9kcXVvdF9yZWYoc3RydWN0IGlub2RlICosIGludCwgc3RydWN0IGxpc3RfaGVhZCAqKTsKLQogdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLAogCQkJc3RydWN0IGxpc3RfaGVhZCAqdG9mcmVlX2hlYWQpCiB7CkBAIC0xMzA2LDYgKzEzMTgsNDIgQEAKIAl3YWtlX3VwX2JpdCgmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKIH0KIAorLyoKKyAqIFdlIHJhcmVseSB3YW50IHRvIGxvY2sgdHdvIGlub2RlcyB0aGF0IGRvIG5vdCBoYXZlIGEgcGFyZW50L2NoaWxkCisgKiByZWxhdGlvbnNoaXAgKHN1Y2ggYXMgZGlyZWN0b3J5LCBjaGlsZCBpbm9kZSkgc2ltdWx0YW5lb3VzbHkuIFRoZQorICogdmFzdCBtYWpvcml0eSBvZiBmaWxlIHN5c3RlbXMgc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsb25nIGZpbmUKKyAqIHdpdGhvdXQgdGhpcy4gRG8gbm90IHVzZSB0aGVzZSBmdW5jdGlvbnMgZXhjZXB0IGFzIGEgbGFzdCByZXNvcnQuCisgKi8KK3ZvaWQgaW5vZGVfZG91YmxlX2xvY2soc3RydWN0IGlub2RlICppbm9kZTEsIHN0cnVjdCBpbm9kZSAqaW5vZGUyKQoreworCWlmIChpbm9kZTEgPT0gTlVMTCB8fCBpbm9kZTIgPT0gTlVMTCB8fCBpbm9kZTEgPT0gaW5vZGUyKSB7CisJCWlmIChpbm9kZTEpCisJCQltdXRleF9sb2NrKCZpbm9kZTEtPmlfbXV0ZXgpOworCQllbHNlIGlmIChpbm9kZTIpCisJCQltdXRleF9sb2NrKCZpbm9kZTItPmlfbXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlub2RlMSA8IGlub2RlMikgeworCQltdXRleF9sb2NrX25lc3RlZCgmaW5vZGUxLT5pX211dGV4LCBJX01VVEVYX1BBUkVOVCk7CisJCW11dGV4X2xvY2tfbmVzdGVkKCZpbm9kZTItPmlfbXV0ZXgsIElfTVVURVhfQ0hJTEQpOworCX0gZWxzZSB7CisJCW11dGV4X2xvY2tfbmVzdGVkKCZpbm9kZTItPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJmlub2RlMS0+aV9tdXRleCwgSV9NVVRFWF9DSElMRCk7CisJfQorfQorRVhQT1JUX1NZTUJPTChpbm9kZV9kb3VibGVfbG9jayk7CisKK3ZvaWQgaW5vZGVfZG91YmxlX3VubG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlMSwgc3RydWN0IGlub2RlICppbm9kZTIpCit7CisJaWYgKGlub2RlMSkKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZTEtPmlfbXV0ZXgpOworCisJaWYgKGlub2RlMiAmJiBpbm9kZTIgIT0gaW5vZGUxKQorCQltdXRleF91bmxvY2soJmlub2RlMi0+aV9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGlub2RlX2RvdWJsZV91bmxvY2spOworCiBzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBsb25nIGloYXNoX2VudHJpZXM7CiBzdGF0aWMgaW50IF9faW5pdCBzZXRfaWhhc2hfZW50cmllcyhjaGFyICpzdHIpCiB7CmRpZmYgLS1naXQgYS9mcy9pbm90aWZ5LmMgYi9mcy9pbm90aWZ5LmMKaW5kZXggNzIzODM2YS4uZjUwOTlkOCAxMDA2NDQKLS0tIGEvZnMvaW5vdGlmeS5jCisrKyBiL2ZzL2lub3RpZnkuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KZGlmZiAtLWdpdCBhL2ZzL2lub3RpZnlfdXNlci5jIGIvZnMvaW5vdGlmeV91c2VyLmMKaW5kZXggMDE3Y2IwZi4uNTVmNmRhNSAxMDA2NDQKLS0tIGEvZnMvaW5vdGlmeV91c2VyLmMKKysrIGIvZnMvaW5vdGlmeV91c2VyLmMKQEAgLTM0LDggKzM0LDggQEAKIAogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqd2F0Y2hfY2FjaGVwIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpldmVudF9jYWNoZXAgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqd2F0Y2hfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV2ZW50X2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICppbm90aWZ5X21udCBfX3JlYWRfbW9zdGx5OwogCkBAIC01NzAsOSArNTcwLDkgQEAKIAlkZXYtPmloID0gaWg7CiAKIAlmaWxwLT5mX29wID0gJmlub3RpZnlfZm9wczsKLQlmaWxwLT5mX3Zmc21udCA9IG1udGdldChpbm90aWZ5X21udCk7Ci0JZmlscC0+Zl9kZW50cnkgPSBkZ2V0KGlub3RpZnlfbW50LT5tbnRfcm9vdCk7Ci0JZmlscC0+Zl9tYXBwaW5nID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKwlmaWxwLT5mX3BhdGgubW50ID0gbW50Z2V0KGlub3RpZnlfbW50KTsKKwlmaWxwLT5mX3BhdGguZGVudHJ5ID0gZGdldChpbm90aWZ5X21udC0+bW50X3Jvb3QpOworCWZpbHAtPmZfbWFwcGluZyA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKIAlmaWxwLT5mX21vZGUgPSBGTU9ERV9SRUFEOwogCWZpbHAtPmZfZmxhZ3MgPSBPX1JET05MWTsKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBkZXY7CmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCA0Yjc2NjBiLi5mZjYxNzcyIDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChmaWxwLT5mX29wLT5pb2N0bCkgewogCQlsb2NrX2tlcm5lbCgpOwotCQllcnJvciA9IGZpbHAtPmZfb3AtPmlvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLAorCQllcnJvciA9IGZpbHAtPmZfb3AtPmlvY3RsKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsCiAJCQkJCSAgZmlscCwgY21kLCBhcmcpOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJfQpAQCAtNDUsNyArNDUsNyBAQAogewogCWludCBlcnJvcjsKIAlpbnQgYmxvY2s7Ci0Jc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOwogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTEzNywxNyArMTM3LDE3IEBACiAJCQlicmVhazsKIAogCQljYXNlIEZJT1FTSVpFOgotCQkJaWYgKFNfSVNESVIoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgfHwKLQkJCSAgICBTX0lTUkVHKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpIHx8Ci0JCQkgICAgU19JU0xOSyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgewotCQkJCWxvZmZfdCByZXMgPSBpbm9kZV9nZXRfYnl0ZXMoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQkJaWYgKFNfSVNESVIoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSB8fAorCQkJICAgIFNfSVNSRUcoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSB8fAorCQkJICAgIFNfSVNMTksoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCQkJCWxvZmZfdCByZXMgPSBpbm9kZV9nZXRfYnl0ZXMoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJCQkJZXJyb3IgPSBjb3B5X3RvX3VzZXIoKGxvZmZfdCBfX3VzZXIgKilhcmcsICZyZXMsIHNpemVvZihyZXMpKSA/IC1FRkFVTFQgOiAwOwogCQkJfQogCQkJZWxzZQogCQkJCWVycm9yID0gLUVOT1RUWTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJaWYgKFNfSVNSRUcoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCQlpZiAoU19JU1JFRyhmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQkJCWVycm9yID0gZmlsZV9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CiAJCQllbHNlCiAJCQkJZXJyb3IgPSBkb19pb2N0bChmaWxwLCBjbWQsIGFyZyk7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9jb21wcmVzcy5jIGIvZnMvaXNvZnMvY29tcHJlc3MuYwppbmRleCA3MzE4MTYzLi42YmJiZGI1IDEwMDY0NAotLS0gYS9mcy9pc29mcy9jb21wcmVzcy5jCisrKyBiL2ZzL2lzb2ZzL2NvbXByZXNzLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogc3RhdGljIGludCB6aXNvZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAJdW5zaWduZWQgaW50IG1heHBhZ2UsIHhwYWdlLCBmcGFnZSwgYmxvY2tpbmRleDsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2Rpci5jIGIvZnMvaXNvZnMvZGlyLmMKaW5kZXggMjdlMjc2OS4uNGFmMjU0OCAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvZGlyLmMKKysrIGIvZnMvaXNvZnMvZGlyLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAJCS8qIEhhbmRsZSB0aGUgY2FzZSBvZiB0aGUgJy4uJyBkaXJlY3RvcnkgKi8KIAkJaWYgKGRlLT5uYW1lX2xlblswXSA9PSAxICYmIGRlLT5uYW1lWzBdID09IDEpIHsKLQkJCWlub2RlX251bWJlciA9IHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpOworCQkJaW5vZGVfbnVtYmVyID0gcGFyZW50X2lubyhmaWxwLT5mX3BhdGguZGVudHJ5KTsKIAkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZmlscC0+Zl9wb3MsIGlub2RlX251bWJlciwgRFRfRElSKSA8IDApCiAJCQkJYnJlYWs7CiAJCQlmaWxwLT5mX3BvcyArPSBkZV9sZW47CkBAIC0yNTUsOCArMjU1LDcgQEAKIAlpbnQgcmVzdWx0OwogCWNoYXIgKiB0bXBuYW1lOwogCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIHRtcGRlOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQorCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJdG1wbmFtZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICh0bXBuYW1lID09IE5VTEwpCmRpZmYgLS1naXQgYS9mcy9pc29mcy9pbm9kZS5jIGIvZnMvaXNvZnMvaW5vZGUuYwppbmRleCBjMzRiODYyLi5lYTU1YjZjIDEwMDY0NAotLS0gYS9mcy9pc29mcy9pbm9kZS5jCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTU3LDEyICs1NywxMiBAQAogc3RhdGljIHZvaWQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBzdGF0aWMgaW50IGlzb2ZzX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqaXNvZnNfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppc29mc19pbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmlzb2ZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaTsKLQllaSA9IGttZW1fY2FjaGVfYWxsb2MoaXNvZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZWkgPSBrbWVtX2NhY2hlX2FsbG9jKGlzb2ZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwpAQCAtNzMsNyArNzMsNyBAQAogCWttZW1fY2FjaGVfZnJlZShpc29mc19pbm9kZV9jYWNoZXAsIElTT0ZTX0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaSA9IGZvbzsKIApkaWZmIC0tZ2l0IGEvZnMvamJkL2pvdXJuYWwuYyBiL2ZzL2piZC9qb3VybmFsLmMKaW5kZXggYjg1YzY4Ni4uMTBmZmY5NCAxMDA2NDQKLS0tIGEvZnMvamJkL2pvdXJuYWwuYworKysgYi9mcy9qYmQvam91cm5hbC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcG9pc29uLmg+CkBAIC0xNjMwLDcgKzE2MzAsNyBAQAogI2RlZmluZSBKQkRfTUFYX1NMQUJTIDUKICNkZWZpbmUgSkJEX1NMQUJfSU5ERVgoc2l6ZSkgIChzaXplID4+IDExKQogCi1zdGF0aWMga21lbV9jYWNoZV90ICpqYmRfc2xhYltKQkRfTUFYX1NMQUJTXTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqamJkX3NsYWJbSkJEX01BWF9TTEFCU107CiBzdGF0aWMgY29uc3QgY2hhciAqamJkX3NsYWJfbmFtZXNbSkJEX01BWF9TTEFCU10gPSB7CiAJImpiZF8xayIsICJqYmRfMmsiLCAiamJkXzRrIiwgTlVMTCwgImpiZF84ayIKIH07CkBAIC0xNjkzLDcgKzE2OTMsNyBAQAogLyoKICAqIEpvdXJuYWxfaGVhZCBzdG9yYWdlIG1hbmFnZW1lbnQKICAqLwotc3RhdGljIGttZW1fY2FjaGVfdCAqam91cm5hbF9oZWFkX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpqb3VybmFsX2hlYWRfY2FjaGU7CiAjaWZkZWYgQ09ORklHX0pCRF9ERUJVRwogc3RhdGljIGF0b21pY190IG5yX2pvdXJuYWxfaGVhZHMgPSBBVE9NSUNfSU5JVCgwKTsKICNlbmRpZgpAQCAtMTk5Niw3ICsxOTk2LDcgQEAKIAogI2VuZGlmCiAKLWttZW1fY2FjaGVfdCAqamJkX2hhbmRsZV9jYWNoZTsKK3N0cnVjdCBrbWVtX2NhY2hlICpqYmRfaGFuZGxlX2NhY2hlOwogCiBzdGF0aWMgaW50IF9faW5pdCBqb3VybmFsX2luaXRfaGFuZGxlX2NhY2hlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9mcy9qYmQvcmV2b2tlLmMgYi9mcy9qYmQvcmV2b2tlLmMKaW5kZXggYzUzMjQyOS4uZDIwNGFiMyAxMDA2NDQKLS0tIGEvZnMvamJkL3Jldm9rZS5jCisrKyBiL2ZzL2piZC9yZXZva2UuYwpAQCAtNzAsOCArNzAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNlbmRpZgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpyZXZva2VfcmVjb3JkX2NhY2hlOwotc3RhdGljIGttZW1fY2FjaGVfdCAqcmV2b2tlX3RhYmxlX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpyZXZva2VfcmVjb3JkX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpyZXZva2VfdGFibGVfY2FjaGU7CiAKIC8qIEVhY2ggcmV2b2tlIHJlY29yZCByZXByZXNlbnRzIG9uZSBzaW5nbGUgcmV2b2tlZCBibG9jay4gIER1cmluZwogICAgam91cm5hbCByZXBsYXksIHRoaXMgaW52b2x2ZXMgcmVjb3JkaW5nIHRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUKZGlmZiAtLWdpdCBhL2ZzL2piZC90cmFuc2FjdGlvbi5jIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKaW5kZXggZTFiM2M4YS4uY2NlYWY1NyAxMDA2NDQKLS0tIGEvZnMvamJkL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KIAorc3RhdGljIHZvaWQgX19qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCk7CisKIC8qCiAgKiBnZXRfdHJhbnNhY3Rpb246IG9idGFpbiBhIG5ldyB0cmFuc2FjdGlvbl90IG9iamVjdC4KICAqCkBAIC01Myw3ICs1NSw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKIAogCS8qIFNldCB1cCB0aGUgY29tbWl0IHRpbWVyIGZvciB0aGUgbmV3IHRyYW5zYWN0aW9uLiAqLwotCWpvdXJuYWwtPmpfY29tbWl0X3RpbWVyLmV4cGlyZXMgPSB0cmFuc2FjdGlvbi0+dF9leHBpcmVzOworCWpvdXJuYWwtPmpfY29tbWl0X3RpbWVyLmV4cGlyZXMgPSByb3VuZF9qaWZmaWVzKHRyYW5zYWN0aW9uLT50X2V4cGlyZXMpOwogCWFkZF90aW1lcigmam91cm5hbC0+al9jb21taXRfdGltZXIpOwogCiAJSl9BU1NFUlQoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uID09IE5VTEwpOwpAQCAtOTY3LDYgKzk2OSwxMyBAQAogCSAqLwogCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIAlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCS8qIE5vdyB0aGF0IHdlIGhhdmUgYmhfc3RhdGUgbG9ja2VkLCBhcmUgd2UgcmVhbGx5IHN0aWxsIG1hcHBlZD8gKi8KKwlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJ1bm1hcHBlZCBidWZmZXIsIGJhaWxpbmcgb3V0Iik7CisJCWdvdG8gbm9fam91cm5hbDsKKwl9CisKIAlpZiAoamgtPmJfdHJhbnNhY3Rpb24pIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgImhhcyB0cmFuc2FjdGlvbiIpOwogCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uKSB7CkBAIC0xMDI4LDYgKzEwMzcsMTEgQEAKIAkJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CiAJCQkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOwogCQkJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJCS8qIFNpbmNlIHdlIGRyb3BwZWQgdGhlIGxvY2suLi4gKi8KKwkJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJidWZmZXIgZ290IHVubWFwcGVkIik7CisJCQkJCWdvdG8gbm9fam91cm5hbDsKKwkJCQl9CiAJCQkJLyogVGhlIGJ1ZmZlciBtYXkgYmVjb21lIGxvY2tlZCBhZ2FpbiBhdCBhbnkKIAkJCQkgICB0aW1lIGlmIGl0IGlzIHJlZGlydGllZCAqLwogCQkJfQpAQCAtMTMxNCwxMyArMTMyOCwxNCBAQAogCWludCBvbGRfaGFuZGxlX2NvdW50LCBlcnI7CiAJcGlkX3QgcGlkOwogCi0JSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfdXBkYXRlcyA+IDApOwogCUpfQVNTRVJUKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBoYW5kbGUpOwogCiAJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCiAJCWVyciA9IC1FSU87Ci0JZWxzZQorCWVsc2UgeworCQlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF91cGRhdGVzID4gMCk7CiAJCWVyciA9IDA7CisJfQogCiAJaWYgKC0taGFuZGxlLT5oX3JlZiA+IDApIHsKIAkJamJkX2RlYnVnKDQsICJoX3JlZiAlZCAtPiAlZFxuIiwgaGFuZGxlLT5oX3JlZiArIDEsCkBAIC0xNDg2LDcgKzE1MDEsNyBAQAogICoKICAqIENhbGxlZCB1bmRlciBqX2xpc3RfbG9jay4gIFRoZSBqb3VybmFsIG1heSBub3QgYmUgbG9ja2VkLgogICovCi12b2lkIF9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCitzdGF0aWMgdm9pZCBfX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQogewogCXN0cnVjdCBqb3VybmFsX2hlYWQgKipsaXN0ID0gTlVMTDsKIAl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKQEAgLTE4MjMsNiArMTgzOCw3IEBACiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKHRyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAib24gY29tbWl0dGluZyB0cmFuc2FjdGlvbiIpOwogCQlpZiAoamgtPmJfamxpc3QgPT0gQkpfTG9ja2VkKSB7CiAJCQkvKgogCQkJICogVGhlIGJ1ZmZlciBpcyBvbiB0aGUgY29tbWl0dGluZyB0cmFuc2FjdGlvbidzIGxvY2tlZApAQCAtMTgzNyw3ICsxODUzLDYgQEAKIAkJICogY2FuIHJlbW92ZSBpdCdzIG5leHRfdHJhbnNhY3Rpb24gcG9pbnRlciBmcm9tIHRoZQogCQkgKiBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIHRoYXQgaXMgc2V0LCBidXQgbm90aGluZwogCQkgKiBlbHNlLiAqLwotCQlKQlVGRkVSX1RSQUNFKGpoLCAib24gY29tbWl0dGluZyB0cmFuc2FjdGlvbiIpOwogCQlzZXRfYnVmZmVyX2ZyZWVkKGJoKTsKIAkJaWYgKGpoLT5iX25leHRfdHJhbnNhY3Rpb24pIHsKIAkJCUpfQVNTRVJUKGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0KQEAgLTE4NTcsNiArMTg3Miw3IEBACiAJCSAqIGlfc2l6ZSBhbHJlYWR5IGZvciB0aGlzIHRydW5jYXRlIHNvIHJlY292ZXJ5IHdpbGwgbm90CiAJCSAqIGV4cG9zZSB0aGUgZGlzayBibG9ja3Mgd2UgYXJlIGRpc2NhcmRpbmcgaGVyZS4pICovCiAJCUpfQVNTRVJUX0pIKGpoLCB0cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pOworCQlKQlVGRkVSX1RSQUNFKGpoLCAib24gcnVubmluZyB0cmFuc2FjdGlvbiIpOwogCQltYXlfZnJlZSA9IF9fZGlzcG9zZV9idWZmZXIoamgsIHRyYW5zYWN0aW9uKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2piZDIvY29tbWl0LmMgYi9mcy9qYmQyL2NvbW1pdC5jCmluZGV4IDcwYjJhZTEuLjZiZDgwMDUgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY29tbWl0LmMKKysrIGIvZnMvamJkMi9jb21taXQuYwpAQCAtMjQ4LDggKzI0OCwxMiBAQAogCQkJCWJ1ZnMgPSAwOwogCQkJCWdvdG8gd3JpdGVfb3V0X2RhdGE7CiAJCQl9Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSBpZiAoIWxvY2tlZCAmJiBidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJX19qYmQyX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIGNvbW1pdF90cmFuc2FjdGlvbiwKKwkJCQkJCUJKX0xvY2tlZCk7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCXB1dF9iaChiaCk7CisJCX0gZWxzZSB7CiAJCQlCVUZGRVJfVFJBQ0UoYmgsICJ3cml0ZW91dCBjb21wbGV0ZTogdW5maWxlIik7CiAJCQlfX2piZDJfam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKIAkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwpkaWZmIC0tZ2l0IGEvZnMvamJkMi9qb3VybmFsLmMgYi9mcy9qYmQyL2pvdXJuYWwuYwppbmRleCAxMGRiOTJjLi40NGZjMzJiIDEwMDY0NAotLS0gYS9mcy9qYmQyL2pvdXJuYWwuYworKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvaXNvbi5oPgpAQCAtNzI1LDYgKzcyNSw3IEBACiAJCQlfX0ZVTkNUSU9OX18pOwogCQlrZnJlZShqb3VybmFsKTsKIAkJam91cm5hbCA9IE5VTEw7CisJCWdvdG8gb3V0OwogCX0KIAlqb3VybmFsLT5qX2RldiA9IGJkZXY7CiAJam91cm5hbC0+al9mc19kZXYgPSBmc19kZXY7CkBAIC03MzUsNyArNzM2LDcgQEAKIAlKX0FTU0VSVChiaCAhPSBOVUxMKTsKIAlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOwogCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7Ci0KK291dDoKIAlyZXR1cm4gam91cm5hbDsKIH0KIApAQCAtMTY0MCw3ICsxNjQxLDcgQEAKICNkZWZpbmUgSkJEX01BWF9TTEFCUyA1CiAjZGVmaW5lIEpCRF9TTEFCX0lOREVYKHNpemUpICAoc2l6ZSA+PiAxMSkKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqamJkX3NsYWJbSkJEX01BWF9TTEFCU107CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmpiZF9zbGFiW0pCRF9NQVhfU0xBQlNdOwogc3RhdGljIGNvbnN0IGNoYXIgKmpiZF9zbGFiX25hbWVzW0pCRF9NQVhfU0xBQlNdID0gewogCSJqYmQyXzFrIiwgImpiZDJfMmsiLCAiamJkMl80ayIsIE5VTEwsICJqYmQyXzhrIgogfTsKQEAgLTE3MDMsNyArMTcwNCw3IEBACiAvKgogICogSm91cm5hbF9oZWFkIHN0b3JhZ2UgbWFuYWdlbWVudAogICovCi1zdGF0aWMga21lbV9jYWNoZV90ICpqYmQyX2pvdXJuYWxfaGVhZF9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9qb3VybmFsX2hlYWRfY2FjaGU7CiAjaWZkZWYgQ09ORklHX0pCRF9ERUJVRwogc3RhdGljIGF0b21pY190IG5yX2pvdXJuYWxfaGVhZHMgPSBBVE9NSUNfSU5JVCgwKTsKICNlbmRpZgpAQCAtMjAwNiw3ICsyMDA3LDcgQEAKIAogI2VuZGlmCiAKLWttZW1fY2FjaGVfdCAqamJkMl9oYW5kbGVfY2FjaGU7CitzdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9oYW5kbGVfY2FjaGU7CiAKIHN0YXRpYyBpbnQgX19pbml0IGpvdXJuYWxfaW5pdF9oYW5kbGVfY2FjaGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvcmV2b2tlLmMgYi9mcy9qYmQyL3Jldm9rZS5jCmluZGV4IDM4MGQxOTkuLmY1MDY2NDYgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvcmV2b2tlLmMKKysrIGIvZnMvamJkMi9yZXZva2UuYwpAQCAtNzAsOCArNzAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNlbmRpZgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpqYmQyX3Jldm9rZV9yZWNvcmRfY2FjaGU7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpqYmQyX3Jldm9rZV90YWJsZV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9yZXZva2VfcmVjb3JkX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpqYmQyX3Jldm9rZV90YWJsZV9jYWNoZTsKIAogLyogRWFjaCByZXZva2UgcmVjb3JkIHJlcHJlc2VudHMgb25lIHNpbmdsZSByZXZva2VkIGJsb2NrLiAgRHVyaW5nCiAgICBqb3VybmFsIHJlcGxheSwgdGhpcyBpbnZvbHZlcyByZWNvcmRpbmcgdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZQpkaWZmIC0tZ2l0IGEvZnMvamJkMi90cmFuc2FjdGlvbi5jIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCmluZGV4IDE0OTk1N2IuLjNhODcwMDEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYworKysgYi9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KIAorc3RhdGljIHZvaWQgX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKKwogLyoKICAqIGpiZDJfZ2V0X3RyYW5zYWN0aW9uOiBvYnRhaW4gYSBuZXcgdHJhbnNhY3Rpb25fdCBvYmplY3QuCiAgKgpAQCAtOTY3LDYgKzk2OSwxMyBAQAogCSAqLwogCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIAlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCS8qIE5vdyB0aGF0IHdlIGhhdmUgYmhfc3RhdGUgbG9ja2VkLCBhcmUgd2UgcmVhbGx5IHN0aWxsIG1hcHBlZD8gKi8KKwlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJ1bm1hcHBlZCBidWZmZXIsIGJhaWxpbmcgb3V0Iik7CisJCWdvdG8gbm9fam91cm5hbDsKKwl9CisKIAlpZiAoamgtPmJfdHJhbnNhY3Rpb24pIHsKIAkJSkJVRkZFUl9UUkFDRShqaCwgImhhcyB0cmFuc2FjdGlvbiIpOwogCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uKSB7CkBAIC0xMDI4LDYgKzEwMzcsMTEgQEAKIAkJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CiAJCQkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOwogCQkJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJCS8qIFNpbmNlIHdlIGRyb3BwZWQgdGhlIGxvY2suLi4gKi8KKwkJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJidWZmZXIgZ290IHVubWFwcGVkIik7CisJCQkJCWdvdG8gbm9fam91cm5hbDsKKwkJCQl9CiAJCQkJLyogVGhlIGJ1ZmZlciBtYXkgYmVjb21lIGxvY2tlZCBhZ2FpbiBhdCBhbnkKIAkJCQkgICB0aW1lIGlmIGl0IGlzIHJlZGlydGllZCAqLwogCQkJfQpAQCAtMTMxNCwxMyArMTMyOCwxNCBAQAogCWludCBvbGRfaGFuZGxlX2NvdW50LCBlcnI7CiAJcGlkX3QgcGlkOwogCi0JSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfdXBkYXRlcyA+IDApOwogCUpfQVNTRVJUKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBoYW5kbGUpOwogCiAJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCiAJCWVyciA9IC1FSU87Ci0JZWxzZQorCWVsc2UgeworCQlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF91cGRhdGVzID4gMCk7CiAJCWVyciA9IDA7CisJfQogCiAJaWYgKC0taGFuZGxlLT5oX3JlZiA+IDApIHsKIAkJamJkX2RlYnVnKDQsICJoX3JlZiAlZCAtPiAlZFxuIiwgaGFuZGxlLT5oX3JlZiArIDEsCkBAIC0xODIzLDYgKzE4MzgsNyBAQAogCQkJfQogCQl9CiAJfSBlbHNlIGlmICh0cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24iKTsKIAkJaWYgKGpoLT5iX2psaXN0ID09IEJKX0xvY2tlZCkgewogCQkJLyoKIAkJCSAqIFRoZSBidWZmZXIgaXMgb24gdGhlIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24ncyBsb2NrZWQKQEAgLTE4MzcsNyArMTg1Myw2IEBACiAJCSAqIGNhbiByZW1vdmUgaXQncyBuZXh0X3RyYW5zYWN0aW9uIHBvaW50ZXIgZnJvbSB0aGUKIAkJICogcnVubmluZyB0cmFuc2FjdGlvbiBpZiB0aGF0IGlzIHNldCwgYnV0IG5vdGhpbmcKIAkJICogZWxzZS4gKi8KLQkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24iKTsKIAkJc2V0X2J1ZmZlcl9mcmVlZChiaCk7CiAJCWlmIChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uKSB7CiAJCQlKX0FTU0VSVChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09CkBAIC0xODU3LDYgKzE4NzIsNyBAQAogCQkgKiBpX3NpemUgYWxyZWFkeSBmb3IgdGhpcyB0cnVuY2F0ZSBzbyByZWNvdmVyeSB3aWxsIG5vdAogCQkgKiBleHBvc2UgdGhlIGRpc2sgYmxvY2tzIHdlIGFyZSBkaXNjYXJkaW5nIGhlcmUuKSAqLwogCQlKX0FTU0VSVF9KSChqaCwgdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHJ1bm5pbmcgdHJhbnNhY3Rpb24iKTsKIAkJbWF5X2ZyZWUgPSBfX2Rpc3Bvc2VfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbik7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9qZmZzL2lub2RlLXYyMy5jIGIvZnMvamZmcy9pbm9kZS12MjMuYwppbmRleCAzZjc4OTllLi40M2JhYTFhIDEwMDY0NAotLS0gYS9mcy9qZmZzL2lub2RlLXYyMy5jCisrKyBiL2ZzL2pmZnMvaW5vZGUtdjIzLmMKQEAgLTYxLDggKzYxLDggQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgamZmc19hZGRyZXNzX29wZXJhdGlvbnM7CiAKLWttZW1fY2FjaGVfdCAgICAgKm5vZGVfY2FjaGUgPSBOVUxMOwota21lbV9jYWNoZV90ICAgICAqZm1fY2FjaGUgPSBOVUxMOworc3RydWN0IGttZW1fY2FjaGUgICAgICpub2RlX2NhY2hlID0gTlVMTDsKK3N0cnVjdCBrbWVtX2NhY2hlICAgICAqZm1fY2FjaGUgPSBOVUxMOwogCiAvKiBDYWxsZWQgYnkgdGhlIFZGUyBhdCBtb3VudCB0aW1lIHRvIGluaXRpYWxpemUgdGhlIHdob2xlIGZpbGUgc3lzdGVtLiAgKi8KIHN0YXRpYyBpbnQgamZmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCkBAIC01NjYsNyArNTY2LDcgQEAKIGpmZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzdHJ1Y3QgamZmc19maWxlICpmOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKilpbm9kZS0+aV9zYi0+c19mc19pbmZvOwogCWludCBqOwpAQCAtODE4LDcgKzgxOCw3IEBACiAKIAlEMSh7CiAJICAgICAgICBpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOwotCQljaGFyICpfbmFtZSA9IChjaGFyICopIGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWNoYXIgKl9uYW1lID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJbWVtY3B5KF9uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOwogCQlfbmFtZVtsZW5dID0gJ1wwJzsKIAkJcHJpbnRrKCIqKipqZmZzX21rZGlyKCk6IGRpciA9IDB4JXAsIG5hbWUgPSBcIiVzXCIsICIKQEAgLTk2NCw3ICs5NjQsNyBAQAogCUQxKHsKIAkJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKIAkJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JCWNoYXIgKl9uYW1lID0gKGNoYXIgKikga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJY2hhciAqX25hbWUgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCQltZW1jcHkoX25hbWUsIG5hbWUsIGxlbik7CiAJCV9uYW1lW2xlbl0gPSAnXDAnOwogCQlwcmludGsoIioqKmpmZnNfcmVtb3ZlKCk6IGZpbGUgPSBcIiVzXCIsIGlubyA9ICVsZFxuIiwgX25hbWUsIGRlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOwpAQCAtMTM3Miw3ICsxMzcyLDcgQEAKIAlzdHJ1Y3QgamZmc19jb250cm9sICpjOwogCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CiAJc3RydWN0IGpmZnNfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJaW50IHJlY292ZXJhYmxlID0gMDsKIAlzaXplX3Qgd3JpdHRlbiA9IDA7CkBAIC0xMzgwLDcgKzEzODAsNyBAQAogCWxvZmZfdCBwb3MgPSAqcHBvczsKIAlpbnQgZXJyOwogCi0JaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAlEMihwcmludGsoIioqKmpmZnNfZmlsZV93cml0ZSgpOiBpbm9kZTogMHglcCAoaW5vOiAlbHUpLCAiCiAJCSAgImZpbHA6IDB4JXAsIGJ1ZjogMHglcCwgY291bnQ6ICVkXG4iLApkaWZmIC0tZ2l0IGEvZnMvamZmcy9pbnRyZXAuYyBiL2ZzL2pmZnMvaW50cmVwLmMKaW5kZXggNGE1NDNlMS4uNmRkMTg5MSAxMDA2NDQKLS0tIGEvZnMvamZmcy9pbnRyZXAuYworKysgYi9mcy9qZmZzL2ludHJlcC5jCkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlICJpbnRyZXAuaCIKICNpbmNsdWRlICJqZmZzX2ZtLmgiCkBAIC00MzUsNyArNDM2LDcgQEAKIAlpbnQgaSwgbGVuZ3RoOwogCiAJLyogQWxsb2NhdGUgcmVhZCBidWZmZXIgKi8KLQlyZWFkX2J1ZiA9IChfX3U4ICopIGttYWxsb2MgKHNpemVvZihfX3U4KSAqIDQwOTYsIEdGUF9LRVJORUwpOworCXJlYWRfYnVmID0ga21hbGxvYyhzaXplb2YoX191OCkgKiA0MDk2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlYWRfYnVmKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAia21hbGxvYyBmYWlsZWQgaW4gamZmc19jaGVja3N1bV9mbGFzaCgpXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01OTEsNyArNTkyLDcgQEAKIAlEMihwcmludGsoImpmZnNfYWRkX3ZpcnR1YWxfcm9vdCgpOiAiCiAJCSAgIkNyZWF0aW5nIGEgdmlydHVhbCByb290IGRpcmVjdG9yeS5cbiIpKTsKIAotCWlmICghKHJvb3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgamZmc19maWxlKSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEocm9vdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBqZmZzX2ZpbGUpLCBHRlBfS0VSTkVMKSkpIHsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW5vX2pmZnNfZmlsZSsrOwpAQCAtNjAzLDcgKzYwNCw2IEBACiAJREpNKG5vX2pmZnNfbm9kZSsrKTsKIAltZW1zZXQobm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBqZmZzX25vZGUpKTsKIAlub2RlLT5pbm8gPSBKRkZTX01JTl9JTk87Ci0JbWVtc2V0KHJvb3QsIDAsIHNpemVvZihzdHJ1Y3QgamZmc19maWxlKSk7CiAJcm9vdC0+aW5vID0gSkZGU19NSU5fSU5POwogCXJvb3QtPm1vZGUgPSBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJHUlAKIAkJICAgICB8IFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USDsKQEAgLTc0NCwxMSArNzQ0LDExIEBACiAKIAogCS8qIEFsbG9jYXRlIHJlYWQgYnVmZmVycyAqLwotCXJlYWRfYnVmMSA9IChfX3U4ICopIGttYWxsb2MgKHNpemVvZihfX3U4KSAqIFJFQURfQUhFQURfQllURVMsIEdGUF9LRVJORUwpOworCXJlYWRfYnVmMSA9IGttYWxsb2Moc2l6ZW9mKF9fdTgpICogUkVBRF9BSEVBRF9CWVRFUywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZWFkX2J1ZjEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmVhZF9idWYyID0gKF9fdTggKikga21hbGxvYyAoc2l6ZW9mKF9fdTgpICogUkVBRF9BSEVBRF9CWVRFUywgR0ZQX0tFUk5FTCk7CisJcmVhZF9idWYyID0ga21hbGxvYyhzaXplb2YoX191OCkgKiBSRUFEX0FIRUFEX0JZVEVTLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlYWRfYnVmMikgewogCQlrZnJlZShyZWFkX2J1ZjEpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTg3Niw3ICs4NzYsNyBAQAogCX0KIAogCS8qIEFsbG9jYXRlIHJlYWQgYnVmZmVyICovCi0JcmVhZF9idWYgPSAoX191OCAqKSBrbWFsbG9jIChzaXplb2YoX191OCkgKiA0MDk2LCBHRlBfS0VSTkVMKTsKKwlyZWFkX2J1ZiA9IGttYWxsb2Moc2l6ZW9mKF9fdTgpICogNDA5NiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZWFkX2J1ZikgewogCQlmbGFzaF9zYWZlX3JlbGVhc2UoZm1jLT5tdGQpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE0NjMsNyArMTQ2Myw3IEBACiAJCQlrZnJlZShmLT5uYW1lKTsKIAkJCURKTShub19uYW1lLS0pOwogCQl9Ci0JCWlmICghKGYtPm5hbWUgPSAoY2hhciAqKSBrbWFsbG9jKHJhd19pbm9kZS0+bnNpemUgKyAxLAorCQlpZiAoIShmLT5uYW1lID0ga21hbGxvYyhyYXdfaW5vZGUtPm5zaXplICsgMSwKIAkJCQkJCSBHRlBfS0VSTkVMKSkpIHsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xNzM3LDcgKzE3MzcsNyBAQAogCQlwcmludGsoImpmZnNfZmluZF9jaGlsZCgpOiBGb3VuZCBcIiVzXCIuXG4iLCBmLT5uYW1lKTsKIAl9CiAJZWxzZSB7Ci0JCWNoYXIgKmNvcHkgPSAoY2hhciAqKSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQljaGFyICpjb3B5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGNvcHkpIHsKIAkJCW1lbWNweShjb3B5LCBuYW1lLCBsZW4pOwogCQkJY29weVtsZW5dID0gJ1wwJzsKQEAgLTI2MjcsNyArMjYyNyw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIShzcGFjZSA9IChjaGFyICopIGttYWxsb2MoaW5kZW50ICsgMSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoc3BhY2UgPSBrbWFsbG9jKGluZGVudCArIDEsIEdGUF9LRVJORUwpKSkgewogCQlwcmludGsoImpmZnNfcHJpbnRfdHJlZSgpOiBPdXQgb2YgbWVtb3J5IVxuIik7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9mcy9qZmZzL2pmZnNfZm0uYyBiL2ZzL2pmZnMvamZmc19mbS5jCmluZGV4IDI5YjY4ZDkuLjA3NzI1OGIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMvamZmc19mbS5jCisrKyBiL2ZzL2pmZnMvamZmc19mbS5jCkBAIC0yOSw4ICsyOSw4IEBACiBzdGF0aWMgc3RydWN0IGpmZnNfZm0gKmpmZnNfYWxsb2NfZm0odm9pZCk7CiBzdGF0aWMgdm9pZCBqZmZzX2ZyZWVfZm0oc3RydWN0IGpmZnNfZm0gKm4pOwogCi1leHRlcm4ga21lbV9jYWNoZV90ICAgICAqZm1fY2FjaGU7Ci1leHRlcm4ga21lbV9jYWNoZV90ICAgICAqbm9kZV9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAgICAgKmZtX2NhY2hlOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICAgICAqbm9kZV9jYWNoZTsKIAogI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAwCiB2b2lkCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9hY2wuYyBiL2ZzL2pmZnMyL2FjbC5jCmluZGV4IDBhZTNjZDEuLjczZjBkNjAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2FjbC5jCisrKyBiL2ZzL2pmZnMyL2FjbC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvYmFja2dyb3VuZC5jIGIvZnMvamZmczIvYmFja2dyb3VuZC5jCmluZGV4IGZmMmE4NzIuLjZlYjNkYWUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2JhY2tncm91bmQuYworKysgYi9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgIm5vZGVsaXN0LmgiCiAKIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvZGlyLmMgYi9mcy9qZmZzMi9kaXIuYwppbmRleCA5ZGVmNmFkLi5kYTYwMzRkIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9kaXIuYworKysgYi9mcy9qZmZzMi9kaXIuYwpAQCAtMTIzLDExICsxMjMsMTEgQEAKIHsKIAlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZjsKIAlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgY3Vyb2ZzOwogCi0JRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRkaXIoKSBmb3IgZGlyX2kgIyVsdVxuIiwgZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfaW5vKSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRkaXIoKSBmb3IgZGlyX2kgIyVsdVxuIiwgZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pKTsKIAogCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKIAljID0gSkZGUzJfU0JfSU5GTyhpbm9kZS0+aV9zYik7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkJb2Zmc2V0Kys7CiAJfQogCWlmIChvZmZzZXQgPT0gMSkgewotCQl1bnNpZ25lZCBsb25nIHBpbm8gPSBwYXJlbnRfaW5vKGZpbHAtPmZfZGVudHJ5KTsKKwkJdW5zaWduZWQgbG9uZyBwaW5vID0gcGFyZW50X2lubyhmaWxwLT5mX3BhdGguZGVudHJ5KTsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkRpcmVudCAxOiBcIi4uXCIsIGlubyAjJWx1XG4iLCBwaW5vKSk7CiAJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgMSwgcGlubywgRFRfRElSKSA8IDApCiAJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL21hbGxvYy5jIGIvZnMvamZmczIvbWFsbG9jLmMKaW5kZXggMzNmMjkxMC4uODNmOTg4MSAxMDA2NDQKLS0tIGEvZnMvamZmczIvbWFsbG9jLmMKKysrIGIvZnMvamZmczIvbWFsbG9jLmMKQEAgLTE5LDE2ICsxOSwxNiBAQAogCiAvKiBUaGVzZSBhcmUgaW5pdGlhbGlzZWQgdG8gTlVMTCBpbiB0aGUga2VybmVsIHN0YXJ0dXAgY29kZS4KICAgIElmIHlvdSdyZSBwb3J0aW5nIHRvIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLCBiZXdhcmUgKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmZ1bGxfZG5vZGVfc2xhYjsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnJhd19kaXJlbnRfc2xhYjsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnJhd19pbm9kZV9zbGFiOwotc3RhdGljIGttZW1fY2FjaGVfdCAqdG1wX2Rub2RlX2luZm9fc2xhYjsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnJhd19ub2RlX3JlZl9zbGFiOwotc3RhdGljIGttZW1fY2FjaGVfdCAqbm9kZV9mcmFnX3NsYWI7Ci1zdGF0aWMga21lbV9jYWNoZV90ICppbm9kZV9jYWNoZV9zbGFiOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmdWxsX2Rub2RlX3NsYWI7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJhd19kaXJlbnRfc2xhYjsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcmF3X2lub2RlX3NsYWI7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnRtcF9kbm9kZV9pbmZvX3NsYWI7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJhd19ub2RlX3JlZl9zbGFiOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpub2RlX2ZyYWdfc2xhYjsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW5vZGVfY2FjaGVfc2xhYjsKICNpZmRlZiBDT05GSUdfSkZGUzJfRlNfWEFUVFIKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnhhdHRyX2RhdHVtX2NhY2hlOwotc3RhdGljIGttZW1fY2FjaGVfdCAqeGF0dHJfcmVmX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp4YXR0cl9kYXR1bV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqeGF0dHJfcmVmX2NhY2hlOwogI2VuZGlmCiAKIGludCBfX2luaXQgamZmczJfY3JlYXRlX3NsYWJfY2FjaGVzKHZvaWQpCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zdXBlci5jIGIvZnMvamZmczIvc3VwZXIuYwppbmRleCBiYzRiODEwLi43ZGViNzgyIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9zdXBlci5jCisrKyBiL2ZzL2pmZnMyL3N1cGVyLmMKQEAgLTI4LDEyICsyOCwxMiBAQAogCiBzdGF0aWMgdm9pZCBqZmZzMl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICpqZmZzMl9pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmpmZnMyX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqamZmczJfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGpmZnMyX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVpID0gKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhqZmZzMl9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAmZWktPnZmc19pbm9kZTsKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoamZmczJfaW5vZGVfY2FjaGVwLCBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGpmZnMyX2lfaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGpmZnMyX2lfaW5pdF9vbmNlKHZvaWQgKiBmb28sIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqKSBmb287CiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3didWYuYyBiL2ZzL2pmZnMyL3didWYuYwppbmRleCBiOWI3MDA3Li43MDcwNzMwIDEwMDY0NAotLS0gYS9mcy9qZmZzMi93YnVmLmMKKysrIGIvZnMvamZmczIvd2J1Zi5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAibm9kZWxpc3QuaCIKIApkaWZmIC0tZ2l0IGEvZnMvamZzL2ZpbGUuYyBiL2ZzL2pmcy9maWxlLmMKaW5kZXggMzQxODFiOC4uYWE5MTMyZCAxMDA2NDQKLS0tIGEvZnMvamZzL2ZpbGUuYworKysgYi9mcy9qZnMvZmlsZS5jCkBAIC0xMDksNiArMTA5LDggQEAKIAkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKIAkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2Vfd3JpdGUJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAogCS5mc3luYwkJPSBqZnNfZnN5bmMsCiAJLnJlbGVhc2UJPSBqZnNfcmVsZWFzZSwKIAkuaW9jdGwJCT0gamZzX2lvY3RsLApkaWZmIC0tZ2l0IGEvZnMvamZzL2lvY3RsLmMgYi9mcy9qZnMvaW9jdGwuYwppbmRleCAzN2RiNTI0Li5lZDgxNGIxIDEwMDY0NAotLS0gYS9mcy9qZnMvaW9jdGwuYworKysgYi9mcy9qZnMvaW9jdGwuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZHRyZWUuYyBiL2ZzL2pmcy9qZnNfZHRyZWUuYwppbmRleCBlY2IyMjE2Li42ZDYyZjMyIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2R0cmVlLmMKKysrIGIvZnMvamZzL2pmc19kdHJlZS5jCkBAIC0zMDA5LDcgKzMwMDksNyBAQAogICovCiBpbnQgamZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0Jc3RydWN0IGlub2RlICppcCA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaXAgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlID0gSkZTX1NCSShpcC0+aV9zYiktPm5sc190YWI7CiAJaW50IHJjID0gMDsKIAlsb2ZmX3QgZHRwb3M7CS8qIGxlZ2FjeSBPUy8yIHN0eWxlIHBvc2l0aW9uICovCkBAIC0zNzc3LDEyICszNzc3LDEyIEBACiAJc3RydWN0IGNvbXBvbmVudF9uYW1lIGxrZXk7CiAJc3RydWN0IGNvbXBvbmVudF9uYW1lIHJrZXk7CiAKLQlsa2V5Lm5hbWUgPSAod2NoYXJfdCAqKSBrbWFsbG9jKChKRlNfTkFNRV9NQVggKyAxKSAqIHNpemVvZih3Y2hhcl90KSwKKwlsa2V5Lm5hbWUgPSBrbWFsbG9jKChKRlNfTkFNRV9NQVggKyAxKSAqIHNpemVvZih3Y2hhcl90KSwKIAkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKGxrZXkubmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJrZXkubmFtZSA9ICh3Y2hhcl90ICopIGttYWxsb2MoKEpGU19OQU1FX01BWCArIDEpICogc2l6ZW9mKHdjaGFyX3QpLAorCXJrZXkubmFtZSA9IGttYWxsb2MoKEpGU19OQU1FX01BWCArIDEpICogc2l6ZW9mKHdjaGFyX3QpLAogCQkJCQlHRlBfS0VSTkVMKTsKIAlpZiAocmtleS5uYW1lID09IE5VTEwpIHsKIAkJa2ZyZWUobGtleS5uYW1lKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZmlsc3lzLmggYi9mcy9qZnMvamZzX2ZpbHN5cy5oCmluZGV4IDk5MDE5MjguLjM4ZjcwYWMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfZmlsc3lzLmgKKysrIGIvZnMvamZzL2pmc19maWxzeXMuaApAQCAtMjksMzEgKzI5LDIxIEBACiAvKgogICoJIGZpbGUgc3lzdGVtIG9wdGlvbiAoc3VwZXJibG9jayBmbGFnKQogICovCi0vKiBtb3VudCB0aW1lIGZsYWcgdG8gZGlzYWJsZSBqb3VybmFsaW5nIHRvIGRpc2sgKi8KLSNkZWZpbmUgSkZTX05PSU5URUdSSVRZIDB4MDAwMDAwMTAKKworLyogZGlyZWN0b3J5IG9wdGlvbiAqLworI2RlZmluZSBKRlNfVU5JQ09ERQkweDAwMDAwMDAxCS8qIHVuaWNvZGUgbmFtZSAqLwogCiAvKiBtb3VudCB0aW1lIGZsYWdzIGZvciBlcnJvciBoYW5kbGluZyAqLwogI2RlZmluZSBKRlNfRVJSX1JFTU9VTlRfUk8gMHgwMDAwMDAwMiAgIC8qIHJlbW91bnQgcmVhZC1vbmx5ICovCiAjZGVmaW5lIEpGU19FUlJfQ09OVElOVUUgICAweDAwMDAwMDA0ICAgLyogY29udGludWUgKi8KICNkZWZpbmUgSkZTX0VSUl9QQU5JQyAgICAgIDB4MDAwMDAwMDggICAvKiBwYW5pYyAqLwogCisvKiBRdW90YSBzdXBwb3J0ICovCiAjZGVmaW5lCUpGU19VU1JRVU9UQQkweDAwMDAwMDEwCiAjZGVmaW5lCUpGU19HUlBRVU9UQQkweDAwMDAwMDIwCiAKLS8qIHBsYXRmb3JtIG9wdGlvbiAoY29uZGl0aW9uYWwgY29tcGlsYXRpb24pICovCi0jZGVmaW5lIEpGU19BSVgJCTB4ODAwMDAwMDAJLyogQUlYIHN1cHBvcnQgKi8KLS8qCVBPU0lYIG5hbWUvZGlyZWN0b3J5ICBzdXBwb3J0ICovCi0KLSNkZWZpbmUgSkZTX09TMgkJMHg0MDAwMDAwMAkvKiBPUy8yIHN1cHBvcnQgKi8KLS8qCWNhc2UtaW5zZW5zaXRpdmUgbmFtZS9kaXJlY3Rvcnkgc3VwcG9ydCAqLwotCi0jZGVmaW5lIEpGU19ERlMJCTB4MjAwMDAwMDAJLyogRENFIERGUyBMRlMgc3VwcG9ydCAqLwotCi0jZGVmaW5lIEpGU19MSU5VWAkweDEwMDAwMDAwCS8qIExpbnV4IHN1cHBvcnQgKi8KLS8qCWNhc2Utc2Vuc2l0aXZlIG5hbWUvZGlyZWN0b3J5IHN1cHBvcnQgKi8KLQotLyogZGlyZWN0b3J5IG9wdGlvbiAqLwotI2RlZmluZSBKRlNfVU5JQ09ERQkweDAwMDAwMDAxCS8qIHVuaWNvZGUgbmFtZSAqLworLyogbW91bnQgdGltZSBmbGFnIHRvIGRpc2FibGUgam91cm5hbGluZyB0byBkaXNrICovCisjZGVmaW5lIEpGU19OT0lOVEVHUklUWSAweDAwMDAwMDQwCiAKIC8qIGNvbW1pdCBvcHRpb24gKi8KICNkZWZpbmUJSkZTX0NPTU1JVAkweDAwMDAwZjAwCS8qIGNvbW1pdCBvcHRpb24gbWFzayAqLwpAQCAtNjEsNiArNTEsNyBAQAogI2RlZmluZQlKRlNfTEFaWUNPTU1JVAkweDAwMDAwMjAwCS8qIGxhenkgY29tbWl0ICovCiAjZGVmaW5lCUpGU19UTVBGUwkweDAwMDAwNDAwCS8qIHRlbXBvcmFyeSBmaWxlIHN5c3RlbSAtCiAJCQkJCSAqIGRvIG5vdCBsb2cvY29tbWl0OgorCQkJCQkgKiBOZXZlciBpbXBsZW1lbnRlZAogCQkJCQkgKi8KIAogLyogbG9nIGxvZ2ljYWwgdm9sdW1lIG9wdGlvbiAqLwpAQCAtNzQsMTYgKzY1LDI1IEBACiAjZGVmaW5lIEpGU19TUEFSU0UJMHgwMDAyMDAwMAkvKiBzcGFyc2UgcmVndWxhciBmaWxlICovCiAKIC8qIERBU0QgTGltaXRzCQlGMjI2OTQxICovCi0jZGVmaW5lIEpGU19EQVNEX0VOQUJMRUQJMHgwMDA0MDAwMAkvKiBEQVNEIGxpbWl0cyBlbmFibGVkICovCi0jZGVmaW5lCUpGU19EQVNEX1BSSU1FCQkweDAwMDgwMDAwCS8qIFByaW1lIERBU0QgdXNhZ2Ugb24gYm9vdCAqLworI2RlZmluZSBKRlNfREFTRF9FTkFCTEVEIDB4MDAwNDAwMDAJLyogREFTRCBsaW1pdHMgZW5hYmxlZCAqLworI2RlZmluZQlKRlNfREFTRF9QUklNRQkweDAwMDgwMDAwCS8qIFByaW1lIERBU0QgdXNhZ2Ugb24gYm9vdCAqLwogCiAvKiBiaWcgZW5kaWFuIGZsYWcgKi8KLSNkZWZpbmUJSkZTX1NXQVBfQllURVMJCTB4MDAxMDAwMDAJLyogcnVubmluZyBvbiBiaWcgZW5kaWFuIGNvbXB1dGVyICovCisjZGVmaW5lCUpGU19TV0FQX0JZVEVTCTB4MDAxMDAwMDAJLyogcnVubmluZyBvbiBiaWcgZW5kaWFuIGNvbXB1dGVyICovCiAKIC8qIERpcmVjdG9yeSBpbmRleCAqLwotI2RlZmluZSBKRlNfRElSX0lOREVYCQkweDAwMjAwMDAwCS8qIFBlcnNpc3RhbnQgaW5kZXggZm9yICovCi0JCQkJCQkvKiBkaXJlY3RvcnkgZW50cmllcyAgICAqLworI2RlZmluZSBKRlNfRElSX0lOREVYCTB4MDAyMDAwMDAJLyogUGVyc2lzdGVudCBpbmRleCBmb3IgKi8KIAorLyogcGxhdGZvcm0gb3B0aW9ucyAqLworI2RlZmluZSBKRlNfTElOVVgJMHgxMDAwMDAwMAkvKiBMaW51eCBzdXBwb3J0ICovCisjZGVmaW5lIEpGU19ERlMJCTB4MjAwMDAwMDAJLyogRENFIERGUyBMRlMgc3VwcG9ydCAqLworLyoJTmV2ZXIgaW1wbGVtZW50ZWQgKi8KKworI2RlZmluZSBKRlNfT1MyCQkweDQwMDAwMDAwCS8qIE9TLzIgc3VwcG9ydCAqLworLyoJY2FzZS1pbnNlbnNpdGl2ZSBuYW1lL2RpcmVjdG9yeSBzdXBwb3J0ICovCisKKyNkZWZpbmUgSkZTX0FJWAkJMHg4MDAwMDAwMAkvKiBBSVggc3VwcG9ydCAqLworLyoJUE9TSVggbmFtZS9kaXJlY3RvcnkgIHN1cHBvcnQgLSBOZXZlciBpbXBsZW1lbnRlZCovCiAKIC8qCiAgKglidWZmZXIgY2FjaGUgY29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbWFwLmMgYi9mcy9qZnMvamZzX2ltYXAuYwppbmRleCA0ODlhM2Q2Li41M2Y2M2I0IDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2ltYXAuYworKysgYi9mcy9qZnMvamZzX2ltYXAuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJICogYWxsb2NhdGUvaW5pdGlhbGl6ZSB0aGUgaW4tbWVtb3J5IGlub2RlIG1hcCBjb250cm9sIHN0cnVjdHVyZQogCSAqLwogCS8qIGFsbG9jYXRlIHRoZSBpbi1tZW1vcnkgaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLiAqLwotCWltYXAgPSAoc3RydWN0IGlub21hcCAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5vbWFwKSwgR0ZQX0tFUk5FTCk7CisJaW1hcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbm9tYXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoaW1hcCA9PSBOVUxMKSB7CiAJCWpmc19lcnIoImRpTW91bnQ6IGttYWxsb2MgcmV0dXJuZWQgTlVMTCEiKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zMTgsNyArMzE4LDcgQEAKIAlzdHJ1Y3QgaW5vbWFwICppbWFwOwogCWludCBibG9ja19vZmZzZXQ7CiAJaW50IGlub2Rlc19sZWZ0OwotCXVpbnQgcGFnZW5vOworCXVuc2lnbmVkIGxvbmcgcGFnZW5vOwogCWludCByZWxfaW5vZGU7CiAKIAlqZnNfaW5mbygiZGlSZWFkOiBpbm8gPSAlbGQiLCBpcC0+aV9pbm8pOwpAQCAtNjA2LDcgKzYwNiw3IEBACiAJaW50IGJsb2NrX29mZnNldDsKIAlpbnQgaW5vZGVzX2xlZnQ7CiAJc3RydWN0IG1ldGFwYWdlICptcDsKLQl1aW50IHBhZ2VubzsKKwl1bnNpZ25lZCBsb25nIHBhZ2VubzsKIAlpbnQgcmVsX2lub2RlOwogCWludCBkaW9mZnNldDsKIAlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMgYi9mcy9qZnMvamZzX2xvZ21nci5jCmluZGV4IGI4OWM5YWIuLjUwNjViYWEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtNjcsNyArNjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkJLyogZm9yIHN5bmNfYmxvY2tkZXYoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuYyBiL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuYwppbmRleCAwY2NjZDFjLi5iMWExYzcyIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX21ldGFwYWdlLmMKKysrIGIvZnMvamZzL2pmc19tZXRhcGFnZS5jCkBAIC03NCw3ICs3NCw3IEBACiB9CiAKICNkZWZpbmUgTUVUQVBPT0xfTUlOX1BBR0VTIDMyCi1zdGF0aWMga21lbV9jYWNoZV90ICptZXRhcGFnZV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbWV0YXBhZ2VfY2FjaGU7CiBzdGF0aWMgbWVtcG9vbF90ICptZXRhcGFnZV9tZW1wb29sOwogCiAjZGVmaW5lIE1QU19QRVJfUEFHRSAoUEFHRV9DQUNIRV9TSVpFID4+IEwyUFNJWkUpCkBAIC0xODAsNyArMTgwLDcgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgbWV0YXBhZ2UgKm1wID0gKHN0cnVjdCBtZXRhcGFnZSAqKWZvbzsKIApkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc190eG5tZ3IuYyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKaW5kZXggODFmNmYwNC4uZDU1OGU1MSAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc190eG5tZ3IuYworKysgYi9mcy9qZnMvamZzX3R4bm1nci5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDljMWM2ZTAuLjg0NmFjOGYgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC00NCw3ICs0NCw3IEBACiBNT0RVTEVfQVVUSE9SKCJTdGV2ZSBCZXN0L0RhdmUgS2xlaWthbXAvQmFycnkgQXJuZHQsIElCTSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICogamZzX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIGpmc19pbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBqZnNfc3VwZXJfb3BlcmF0aW9uczsKIHN0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgamZzX2V4cG9ydF9vcGVyYXRpb25zOwpAQCAtOTMsNyArOTMsNyBAQAogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZ1bmN0aW9uKTsKLQl2c3ByaW50ZihlcnJvcl9idWYsIGZ1bmN0aW9uLCBhcmdzKTsKKwl2c25wcmludGYoZXJyb3JfYnVmLCBzaXplb2YoZXJyb3JfYnVmKSwgZnVuY3Rpb24sIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIAogCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IChkZXZpY2UgJXMpOiAlc1xuIiwgc2ItPnNfaWQsIGVycm9yX2J1Zik7CkBAIC03NDgsNyArNzQ4LDcgQEAKIAkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCiB9OwogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcCA9IChzdHJ1Y3QgamZzX2lub2RlX2luZm8gKikgZm9vOwogCmRpZmYgLS1naXQgYS9mcy9qZnMveGF0dHIuYyBiL2ZzL2pmcy94YXR0ci5jCmluZGV4IDRjNzk4NWUuLmI3NTNiYTIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy94YXR0ci5jCisrKyBiL2ZzL2pmcy94YXR0ci5jCkBAIC03NTYsNiArNzU2LDExIEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCisvKgorICogTW9zdCBvZiB0aGUgcGVybWlzc2lvbiBjaGVja2luZyBpcyBkb25lIGJ5IHhhdHRyX3Blcm1pc3Npb24gaW4gdGhlIHZmcy4KKyAqIFRoZSBsb2NhbCBmaWxlIHN5c3RlbSBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIHN5c3RlbS4qIG5hbWVzcGFjZS4KKyAqIFdlIGFsc28gbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgbmFtZXNwYWNlIHRoYXQgd2UgcmVjb2duaXplLgorICovCiBzdGF0aWMgaW50IGNhbl9zZXRfeGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbikKIHsKQEAgLTc3MSwxMCArNzc2LDYgQEAKIAkgICAgc3RybmNtcChuYW1lLCBYQVRUUl9PUzJfUFJFRklYLCBYQVRUUl9PUzJfUFJFRklYX0xFTikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgotCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmU19JU1ZUWCkpCi0JCXJldHVybiAtRVBFUk07Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbGliZnMuYyBiL2ZzL2xpYmZzLmMKaW5kZXggYmQwOGUwZS4uNTAzODk4ZCAxMDA2NDQKLS0tIGEvZnMvbGliZnMuYworKysgYi9mcy9saWJmcy5jCkBAIC02Myw3ICs2Myw3IEBACiB7CiAJc3RhdGljIHN0cnVjdCBxc3RyIGN1cnNvcl9uYW1lID0gey5sZW4gPSAxLCAubmFtZSA9ICIuIn07CiAKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkX2FsbG9jKGZpbGUtPmZfZGVudHJ5LCAmY3Vyc29yX25hbWUpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRfYWxsb2MoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgJmN1cnNvcl9uYW1lKTsKIAogCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGEgPyAwIDogLUVOT01FTTsKIH0KQEAgLTc2LDcgKzc2LDcgQEAKIAogbG9mZl90IGRjYWNoZV9kaXJfbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCiB7Ci0JbXV0ZXhfbG9jaygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X2xvY2soJmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXN3aXRjaCAob3JpZ2luKSB7CiAJCWNhc2UgMToKIAkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKQEAgLTg0LDcgKzg0LDcgQEAKIAkJCWlmIChvZmZzZXQgPj0gMCkKIAkJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCW11dGV4X3VubG9jaygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CkBAIC05Niw4ICs5Niw4IEBACiAKIAkJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCQkJbGlzdF9kZWwoJmN1cnNvci0+ZF91LmRfY2hpbGQpOwotCQkJcCA9IGZpbGUtPmZfZGVudHJ5LT5kX3N1YmRpcnMubmV4dDsKLQkJCXdoaWxlIChuICYmIHAgIT0gJmZpbGUtPmZfZGVudHJ5LT5kX3N1YmRpcnMpIHsKKwkJCXAgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3N1YmRpcnMubmV4dDsKKwkJCXdoaWxlIChuICYmIHAgIT0gJmZpbGUtPmZfcGF0aC5kZW50cnktPmRfc3ViZGlycykgewogCQkJCXN0cnVjdCBkZW50cnkgKm5leHQ7CiAJCQkJbmV4dCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwogCQkJCWlmICghZF91bmhhc2hlZChuZXh0KSAmJiBuZXh0LT5kX2lub2RlKQpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogCQl9CiAJfQotCW11dGV4X3VubG9jaygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJcmV0dXJuIG9mZnNldDsKIH0KIApAQCAtMTI2LDcgKzEyNiw3IEBACiAKIGludCBkY2FjaGVfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGRlbnRyeSAqY3Vyc29yID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpxID0gJmN1cnNvci0+ZF91LmRfY2hpbGQ7CiAJaW5vX3QgaW5vOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudGxvY2suYyBiL2ZzL2xvY2tkL2NsbnRsb2NrLmMKaW5kZXggZThjNzc2NS4uMDYyNzA3NyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudGxvY2suYworKysgYi9mcy9sb2NrZC9jbG50bG9jay5jCkBAIC0zNiw3ICszNiw3IEBACiAJc3RydWN0IG5sbV9ob3N0ICoJYl9ob3N0OwogCXN0cnVjdCBmaWxlX2xvY2sgKgliX2xvY2s7CQkvKiBsb2NhbCBmaWxlIGxvY2sgKi8KIAl1bnNpZ25lZCBzaG9ydAkJYl9yZWNsYWltOwkvKiBnb3QgdG8gcmVjbGFpbSBsb2NrICovCi0JdTMyCQkJYl9zdGF0dXM7CS8qIGdyYW50IGNhbGxiYWNrIHN0YXR1cyAqLworCV9fYmUzMgkJCWJfc3RhdHVzOwkvKiBncmFudCBjYWxsYmFjayBzdGF0dXMgKi8KIH07CiAKIHN0YXRpYyBMSVNUX0hFQUQobmxtX2Jsb2NrZWQpOwpAQCAtNTMsNyArNTMsNyBAQAogCQlibG9jay0+Yl9ob3N0ID0gaG9zdDsKIAkJYmxvY2stPmJfbG9jayA9IGZsOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZibG9jay0+Yl93YWl0KTsKLQkJYmxvY2stPmJfc3RhdHVzID0gTkxNX0xDS19CTE9DS0VEOworCQlibG9jay0+Yl9zdGF0dXMgPSBubG1fbGNrX2Jsb2NrZWQ7CiAJCWxpc3RfYWRkKCZibG9jay0+Yl9saXN0LCAmbmxtX2Jsb2NrZWQpOwogCX0KIAlyZXR1cm4gYmxvY2s7CkBAIC04OSw3ICs4OSw3IEBACiAJICogbmxtY2xudF9sb2NrIGZvciBhbiBleHBsYW5hdGlvbi4KIAkgKi8KIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChibG9jay0+Yl93YWl0LAotCQkJYmxvY2stPmJfc3RhdHVzICE9IE5MTV9MQ0tfQkxPQ0tFRCwKKwkJCWJsb2NrLT5iX3N0YXR1cyAhPSBubG1fbGNrX2Jsb2NrZWQsCiAJCQl0aW1lb3V0KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKQEAgLTEwMCwxMiArMTAwLDEyIEBACiAvKgogICogVGhlIHNlcnZlciBsb2NrZCBoYXMgY2FsbGVkIHVzIGJhY2sgdG8gdGVsbCB1cyB0aGUgbG9jayB3YXMgZ3JhbnRlZAogICovCi11MzIgbmxtY2xudF9ncmFudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jaykKK19fYmUzMiBubG1jbG50X2dyYW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciwgY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrKQogewogCWNvbnN0IHN0cnVjdCBmaWxlX2xvY2sgKmZsID0gJmxvY2stPmZsOwogCWNvbnN0IHN0cnVjdCBuZnNfZmggKmZoID0gJmxvY2stPmZoOwogCXN0cnVjdCBubG1fd2FpdAkqYmxvY2s7Ci0JdTMyIHJlcyA9IG5sbV9sY2tfZGVuaWVkOworCV9fYmUzMiByZXMgPSBubG1fbGNrX2RlbmllZDsKIAogCS8qCiAJICogTG9vayB1cCBibG9ja2VkIHJlcXVlc3QgYmFzZWQgb24gYXJndW1lbnRzLiAKQEAgLTEyNiwxMiArMTI2LDEyIEBACiAJCQljb250aW51ZTsKIAkJaWYgKCFubG1fY21wX2FkZHIoJmJsb2NrLT5iX2hvc3QtPmhfYWRkciwgYWRkcikpCiAJCQljb250aW51ZTsKLQkJaWYgKG5mc19jb21wYXJlX2ZoKE5GU19GSChmbF9ibG9ja2VkLT5mbF9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgLGZoKSAhPSAwKQorCQlpZiAobmZzX2NvbXBhcmVfZmgoTkZTX0ZIKGZsX2Jsb2NrZWQtPmZsX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpICxmaCkgIT0gMCkKIAkJCWNvbnRpbnVlOwogCQkvKiBBbHJpZ2h0LCB3ZSBmb3VuZCBhIGxvY2suIFNldCB0aGUgcmV0dXJuIHN0YXR1cwogCQkgKiBhbmQgd2FrZSB1cCB0aGUgY2FsbGVyCiAJCSAqLwotCQlibG9jay0+Yl9zdGF0dXMgPSBOTE1fTENLX0dSQU5URUQ7CisJCWJsb2NrLT5iX3N0YXR1cyA9IG5sbV9ncmFudGVkOwogCQl3YWtlX3VwKCZibG9jay0+Yl93YWl0KTsKIAkJcmVzID0gbmxtX2dyYW50ZWQ7CiAJfQpAQCAtMjExLDcgKzIxMSw3IEBACiAJLyogTm93LCB3YWtlIHVwIGFsbCBwcm9jZXNzZXMgdGhhdCBzbGVlcCBvbiBhIGJsb2NrZWQgbG9jayAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssICZubG1fYmxvY2tlZCwgYl9saXN0KSB7CiAJCWlmIChibG9jay0+Yl9ob3N0ID09IGhvc3QpIHsKLQkJCWJsb2NrLT5iX3N0YXR1cyA9IE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRDsKKwkJCWJsb2NrLT5iX3N0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKIAkJCXdha2VfdXAoJmJsb2NrLT5iX3dhaXQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKaW5kZXggM2Q4NGY2MC4uMGI0YWNjMSAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudHByb2MuYworKysgYi9mcy9sb2NrZC9jbG50cHJvYy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CkBAIC0yNiw3ICsyNyw3IEBACiBzdGF0aWMgaW50CW5sbWNsbnRfdGVzdChzdHJ1Y3QgbmxtX3Jxc3QgKiwgc3RydWN0IGZpbGVfbG9jayAqKTsKIHN0YXRpYyBpbnQJbmxtY2xudF9sb2NrKHN0cnVjdCBubG1fcnFzdCAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOwogc3RhdGljIGludAlubG1jbG50X3VubG9jayhzdHJ1Y3QgbmxtX3Jxc3QgKiwgc3RydWN0IGZpbGVfbG9jayAqKTsKLXN0YXRpYyBpbnQJbmxtX3N0YXRfdG9fZXJybm8odTMyIHN0YXQpOworc3RhdGljIGludAlubG1fc3RhdF90b19lcnJubyhfX2JlMzIgc3RhdCk7CiBzdGF0aWMgdm9pZAlubG1jbG50X2xvY2tzX2luaXRfcHJpdmF0ZShzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgc3RydWN0IG5sbV9ob3N0ICpob3N0KTsKIHN0YXRpYyBpbnQJbmxtY2xudF9jYW5jZWwoc3RydWN0IG5sbV9ob3N0ICosIGludCAsIHN0cnVjdCBmaWxlX2xvY2sgKik7CiAKQEAgLTEyOCw3ICsxMjksNyBAQAogCiAJbmxtY2xudF9uZXh0X2Nvb2tpZSgmYXJncC0+Y29va2llKTsKIAlhcmdwLT5zdGF0ZSAgID0gbnNtX2xvY2FsX3N0YXRlOwotCW1lbWNweSgmbG9jay0+ZmgsIE5GU19GSChmbC0+ZmxfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLCBzaXplb2Yoc3RydWN0IG5mc19maCkpOworCW1lbWNweSgmbG9jay0+ZmgsIE5GU19GSChmbC0+ZmxfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSksIHNpemVvZihzdHJ1Y3QgbmZzX2ZoKSk7CiAJbG9jay0+Y2FsbGVyICA9IHV0c25hbWUoKS0+bm9kZW5hbWU7CiAJbG9jay0+b2guZGF0YSA9IHJlcS0+YV9vd25lcjsKIAlsb2NrLT5vaC5sZW4gID0gc25wcmludGYocmVxLT5hX293bmVyLCBzaXplb2YocmVxLT5hX293bmVyKSwgIiV1QCVzIiwKQEAgLTMyNCw3ICszMjUsNyBAQAogCQkJfQogCQkJYnJlYWs7CiAJCX0gZWxzZQotCQlpZiAocmVzcC0+c3RhdHVzID09IE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRCkgeworCQlpZiAocmVzcC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZCkgewogCQkJZHByaW50aygibG9ja2Q6IHNlcnZlciBpbiBncmFjZSBwZXJpb2RcbiIpOwogCQkJaWYgKGFyZ3AtPnJlY2xhaW0pIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HCkBAIC00MTAsMTAgKzQxMSwxMCBAQAogCQlnb3RvIG91dDsKIAogCXN3aXRjaCAocmVxLT5hX3Jlcy5zdGF0dXMpIHsKLQkJY2FzZSBOTE1fTENLX0dSQU5URUQ6CisJCWNhc2UgbmxtX2dyYW50ZWQ6CiAJCQlmbC0+ZmxfdHlwZSA9IEZfVU5MQ0s7CiAJCQlicmVhazsKLQkJY2FzZSBOTE1fTENLX0RFTklFRDoKKwkJY2FzZSBubG1fbGNrX2RlbmllZDoKIAkJCS8qCiAJCQkgKiBSZXBvcnQgdGhlIGNvbmZsaWN0aW5nIGxvY2sgYmFjayB0byB0aGUgYXBwbGljYXRpb24uCiAJCQkgKi8KQEAgLTUyMyw5ICs1MjQsOSBAQAogCQlpZiAoIXJlcS0+YV9hcmdzLmJsb2NrKQogCQkJYnJlYWs7CiAJCS8qIERpZCBhIHJlY2xhaW1lciB0aHJlYWQgbm90aWZ5IHVzIG9mIGEgc2VydmVyIHJlYm9vdD8gKi8KLQkJaWYgKHJlc3AtPnN0YXR1cyA9PSAgTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKQorCQlpZiAocmVzcC0+c3RhdHVzID09ICBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2QpCiAJCQljb250aW51ZTsKLQkJaWYgKHJlc3AtPnN0YXR1cyAhPSBOTE1fTENLX0JMT0NLRUQpCisJCWlmIChyZXNwLT5zdGF0dXMgIT0gbmxtX2xja19ibG9ja2VkKQogCQkJYnJlYWs7CiAJCS8qIFdhaXQgb24gYW4gTkxNIGJsb2NraW5nIGxvY2sgKi8KIAkJc3RhdHVzID0gbmxtY2xudF9ibG9jayhibG9jaywgcmVxLCBOTE1DTE5UX1BPTExfVElNRU9VVCk7CkBAIC01MzQsMTEgKzUzNSwxMSBAQAogCQkgKi8KIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlnb3RvIG91dF91bmJsb2NrOwotCQlpZiAocmVzcC0+c3RhdHVzICE9IE5MTV9MQ0tfQkxPQ0tFRCkKKwkJaWYgKHJlc3AtPnN0YXR1cyAhPSBubG1fbGNrX2Jsb2NrZWQpCiAJCQlicmVhazsKIAl9CiAKLQlpZiAocmVzcC0+c3RhdHVzID09IE5MTV9MQ0tfR1JBTlRFRCkgeworCWlmIChyZXNwLT5zdGF0dXMgPT0gbmxtX2dyYW50ZWQpIHsKIAkJZG93bl9yZWFkKCZob3N0LT5oX3J3c2VtKTsKIAkJLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIHNlcnZlciBoYXMgcmVib290ZWQgKi8KIAkJaWYgKGZsLT5mbF91Lm5mc19mbC5zdGF0ZSAhPSBob3N0LT5oX3N0YXRlKSB7CkBAIC01NTUsNyArNTU2LDcgQEAKIG91dF91bmJsb2NrOgogCW5sbWNsbnRfZmluaXNoX2Jsb2NrKGJsb2NrKTsKIAkvKiBDYW5jZWwgdGhlIGJsb2NrZWQgcmVxdWVzdCBpZiBpdCBpcyBzdGlsbCBwZW5kaW5nICovCi0JaWYgKHJlc3AtPnN0YXR1cyA9PSBOTE1fTENLX0JMT0NLRUQpCisJaWYgKHJlc3AtPnN0YXR1cyA9PSBubG1fbGNrX2Jsb2NrZWQpCiAJCW5sbWNsbnRfY2FuY2VsKGhvc3QsIHJlcS0+YV9hcmdzLmJsb2NrLCBmbCk7CiBvdXQ6CiAJbmxtX3JlbGVhc2VfY2FsbChyZXEpOwpAQCAtNTg0LDEyICs1ODUsMTIgQEAKIAlyZXEtPmFfYXJncy5yZWNsYWltID0gMTsKIAogCWlmICgoc3RhdHVzID0gbmxtY2xudF9jYWxsKHJlcSwgTkxNUFJPQ19MT0NLKSkgPj0gMAotCSAmJiByZXEtPmFfcmVzLnN0YXR1cyA9PSBOTE1fTENLX0dSQU5URUQpCisJICYmIHJlcS0+YV9yZXMuc3RhdHVzID09IG5sbV9ncmFudGVkKQogCQlyZXR1cm4gMDsKIAogCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiBmYWlsZWQgdG8gcmVjbGFpbSBsb2NrIGZvciBwaWQgJWQgIgogCQkJCSIoZXJybm8gJWQsIHN0YXR1cyAlZClcbiIsIGZsLT5mbF9waWQsCi0JCQkJc3RhdHVzLCByZXEtPmFfcmVzLnN0YXR1cyk7CisJCQkJc3RhdHVzLCBudG9obChyZXEtPmFfcmVzLnN0YXR1cykpOwogCiAJLyoKIAkgKiBGSVhNRTogVGhpcyBpcyBhIHNlcmlvdXMgZmFpbHVyZS4gV2UgY2FuCkBAIC02MzYsMTAgKzYzNywxMCBAQAogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIG91dDsKIAotCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKQorCWlmIChyZXNwLT5zdGF0dXMgPT0gbmxtX2dyYW50ZWQpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHJlc3AtPnN0YXR1cyAhPSBOTE1fTENLX0RFTklFRF9OT0xPQ0tTKQorCWlmIChyZXNwLT5zdGF0dXMgIT0gbmxtX2xja19kZW5pZWRfbm9sb2NrcykKIAkJcHJpbnRrKCJsb2NrZDogdW5leHBlY3RlZCB1bmxvY2sgc3RhdHVzOiAlZFxuIiwgcmVzcC0+c3RhdHVzKTsKIAkvKiBXaGF0IHRvIGRvIG5vdz8gSSdtIG91dCBvZiBteSBkZXB0aC4uLiAqLwogCXN0YXR1cyA9IC1FTk9MQ0s7CkBAIC02NTEsNyArNjUyLDcgQEAKIHN0YXRpYyB2b2lkIG5sbWNsbnRfdW5sb2NrX2NhbGxiYWNrKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbmxtX3Jxc3QJKnJlcSA9IGRhdGE7Ci0JaW50CQlzdGF0dXMgPSByZXEtPmFfcmVzLnN0YXR1czsKKwl1MzIgc3RhdHVzID0gbnRvaGwocmVxLT5hX3Jlcy5zdGF0dXMpOwogCiAJaWYgKFJQQ19BU1NBU1NJTkFURUQodGFzaykpCiAJCWdvdG8gZGllOwpAQCAtNzE5LDYgKzcyMCw3IEBACiBzdGF0aWMgdm9pZCBubG1jbG50X2NhbmNlbF9jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5sbV9ycXN0CSpyZXEgPSBkYXRhOworCXUzMiBzdGF0dXMgPSBudG9obChyZXEtPmFfcmVzLnN0YXR1cyk7CiAKIAlpZiAoUlBDX0FTU0FTU0lOQVRFRCh0YXNrKSkKIAkJZ290byBkaWU7CkBAIC03MjksMTAgKzczMSwxMCBAQAogCQlnb3RvIHJldHJ5X2NhbmNlbDsKIAl9CiAKLQlkcHJpbnRrKCJsb2NrZDogY2FuY2VsIHN0YXR1cyAlZCAodGFzayAlZClcbiIsCi0JCQlyZXEtPmFfcmVzLnN0YXR1cywgdGFzay0+dGtfcGlkKTsKKwlkcHJpbnRrKCJsb2NrZDogY2FuY2VsIHN0YXR1cyAldSAodGFzayAldSlcbiIsCisJCQlzdGF0dXMsIHRhc2stPnRrX3BpZCk7CiAKLQlzd2l0Y2ggKHJlcS0+YV9yZXMuc3RhdHVzKSB7CisJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIE5MTV9MQ0tfR1JBTlRFRDoKIAljYXNlIE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRDoKIAljYXNlIE5MTV9MQ0tfREVOSUVEOgpAQCAtNzQzLDcgKzc0NSw3IEBACiAJCWdvdG8gcmV0cnlfY2FuY2VsOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IHdlaXJkIHJldHVybiAlZCBmb3IgQ0FOQ0VMIGNhbGxcbiIsCi0JCQlyZXEtPmFfcmVzLnN0YXR1cyk7CisJCQlzdGF0dXMpOwogCX0KIAogZGllOgpAQCAtNzY3LDkgKzc2OSw5IEBACiAgKiBDb252ZXJ0IGFuIE5MTSBzdGF0dXMgY29kZSB0byBhIGdlbmVyaWMga2VybmVsIGVycm5vCiAgKi8KIHN0YXRpYyBpbnQKLW5sbV9zdGF0X3RvX2Vycm5vKHUzMiBzdGF0dXMpCitubG1fc3RhdF90b19lcnJubyhfX2JlMzIgc3RhdHVzKQogewotCXN3aXRjaChzdGF0dXMpIHsKKwlzd2l0Y2gobnRvaGwoc3RhdHVzKSkgewogCWNhc2UgTkxNX0xDS19HUkFOVEVEOgogCQlyZXR1cm4gMDsKIAljYXNlIE5MTV9MQ0tfREVOSUVEOgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvaG9zdC5jIGIvZnMvbG9ja2QvaG9zdC5jCmluZGV4IGZiMjRhOTcuLjNkNDYxMGMgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2hvc3QuYworKysgYi9mcy9sb2NrZC9ob3N0LmMKQEAgLTM2LDM0ICszNiwxNCBAQAogc3RhdGljIHZvaWQJCQlubG1fZ2NfaG9zdHModm9pZCk7CiBzdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKglfX25zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqLAogCQkJCQljb25zdCBjaGFyICosIGludCwgaW50KTsKLQotLyoKLSAqIEZpbmQgYW4gTkxNIHNlcnZlciBoYW5kbGUgaW4gdGhlIGNhY2hlLiBJZiB0aGVyZSBpcyBub25lLCBjcmVhdGUgaXQuCi0gKi8KLXN0cnVjdCBubG1faG9zdCAqCi1ubG1jbG50X2xvb2t1cF9ob3N0KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBpbnQgcHJvdG8sIGludCB2ZXJzaW9uLAotCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsIGludCBob3N0bmFtZV9sZW4pCi17Ci0JcmV0dXJuIG5sbV9sb29rdXBfaG9zdCgwLCBzaW4sIHByb3RvLCB2ZXJzaW9uLAotCQkJICAgICAgIGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pOwotfQotCi0vKgotICogRmluZCBhbiBOTE0gY2xpZW50IGhhbmRsZSBpbiB0aGUgY2FjaGUuIElmIHRoZXJlIGlzIG5vbmUsIGNyZWF0ZSBpdC4KLSAqLwotc3RydWN0IG5sbV9ob3N0ICoKLW5sbXN2Y19sb29rdXBfaG9zdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAotCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsIGludCBob3N0bmFtZV9sZW4pCi17Ci0JcmV0dXJuIG5sbV9sb29rdXBfaG9zdCgxLCAmcnFzdHAtPnJxX2FkZHIsCi0JCQkgICAgICAgcnFzdHAtPnJxX3Byb3QsIHJxc3RwLT5ycV92ZXJzLAotCQkJICAgICAgIGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pOwotfQorc3RhdGljIHN0cnVjdCBuc21faGFuZGxlICoJbnNtX2ZpbmQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCisJCQkJCSBjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkJIGludCBob3N0bmFtZV9sZW4pOwogCiAvKgogICogQ29tbW9uIGhvc3QgbG9va3VwIHJvdXRpbmUgZm9yIHNlcnZlciAmIGNsaWVudAogICovCi1zdHJ1Y3QgbmxtX2hvc3QgKgorc3RhdGljIHN0cnVjdCBubG1faG9zdCAqCiBubG1fbG9va3VwX2hvc3QoaW50IHNlcnZlciwgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCiAJCQkJCWludCBwcm90bywgaW50IHZlcnNpb24sCiAJCQkJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLApAQCAtMTk1LDYgKzE3NSwyOSBAQAogfQogCiAvKgorICogRmluZCBhbiBOTE0gc2VydmVyIGhhbmRsZSBpbiB0aGUgY2FjaGUuIElmIHRoZXJlIGlzIG5vbmUsIGNyZWF0ZSBpdC4KKyAqLworc3RydWN0IG5sbV9ob3N0ICoKK25sbWNsbnRfbG9va3VwX2hvc3QoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sIGludCBwcm90bywgaW50IHZlcnNpb24sCisJCQljb25zdCBjaGFyICpob3N0bmFtZSwgaW50IGhvc3RuYW1lX2xlbikKK3sKKwlyZXR1cm4gbmxtX2xvb2t1cF9ob3N0KDAsIHNpbiwgcHJvdG8sIHZlcnNpb24sCisJCQkgICAgICAgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbik7Cit9CisKKy8qCisgKiBGaW5kIGFuIE5MTSBjbGllbnQgaGFuZGxlIGluIHRoZSBjYWNoZS4gSWYgdGhlcmUgaXMgbm9uZSwgY3JlYXRlIGl0LgorICovCitzdHJ1Y3QgbmxtX2hvc3QgKgorbmxtc3ZjX2xvb2t1cF9ob3N0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCQljb25zdCBjaGFyICpob3N0bmFtZSwgaW50IGhvc3RuYW1lX2xlbikKK3sKKwlyZXR1cm4gbmxtX2xvb2t1cF9ob3N0KDEsICZycXN0cC0+cnFfYWRkciwKKwkJCSAgICAgICBycXN0cC0+cnFfcHJvdCwgcnFzdHAtPnJxX3ZlcnMsCisJCQkgICAgICAgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbik7Cit9CisKKy8qCiAgKiBDcmVhdGUgdGhlIE5MTSBSUEMgY2xpZW50IGZvciBhbiBOTE0gcGVlcgogICovCiBzdHJ1Y3QgcnBjX2NsbnQgKgpAQCAtNDk1LDcgKzQ5OCw3IEBACiAJcmV0dXJuIG5zbTsKIH0KIAotc3RydWN0IG5zbV9oYW5kbGUgKgorc3RhdGljIHN0cnVjdCBuc21faGFuZGxlICoKIG5zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBjb25zdCBjaGFyICpob3N0bmFtZSwgaW50IGhvc3RuYW1lX2xlbikKIHsKIAlyZXR1cm4gX19uc21fZmluZChzaW4sIGhvc3RuYW1lLCBob3N0bmFtZV9sZW4sIDEpOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvbW9uLmMgYi9mcy9sb2NrZC9tb24uYwppbmRleCBlMDE3OWY4Li5lYjI0M2VkIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9tb24uYworKysgYi9mcy9sb2NrZC9tb24uYwpAQCAtMTQ4LDggKzE0OCw4IEBACiAgKiBYRFIgZnVuY3Rpb25zIGZvciBOU00uCiAgKi8KIAotc3RhdGljIHUzMiAqCi14ZHJfZW5jb2RlX2NvbW1vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3N0YXRpYyBfX2JlMzIgKgoreGRyX2VuY29kZV9jb21tb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCiB7CiAJY2hhcglidWZmZXJbMjBdLCAqbmFtZTsKIApAQCAtMTc2LDcgKzE3Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXhkcl9lbmNvZGVfbW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQoreGRyX2VuY29kZV9tb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCiB7CiAJcCA9IHhkcl9lbmNvZGVfY29tbW9uKHJxc3RwLCBwLCBhcmdwKTsKIAlpZiAoSVNfRVJSKHApKQpAQCAtMTkyLDcgKzE5Miw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXhkcl9lbmNvZGVfdW5tb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCit4ZHJfZW5jb2RlX3VubW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQogewogCXAgPSB4ZHJfZW5jb2RlX2NvbW1vbihycXN0cCwgcCwgYXJncCk7CiAJaWYgKElTX0VSUihwKSkKQEAgLTIwMiw3ICsyMDIsNyBAQAogfQogCiBzdGF0aWMgaW50Ci14ZHJfZGVjb2RlX3N0YXRfcmVzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5zbV9yZXMgKnJlc3ApCit4ZHJfZGVjb2RlX3N0YXRfcmVzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5zbV9yZXMgKnJlc3ApCiB7CiAJcmVzcC0+c3RhdHVzID0gbnRvaGwoKnArKyk7CiAJcmVzcC0+c3RhdGUgPSBudG9obCgqcCsrKTsKQEAgLTIxMiw3ICsyMTIsNyBAQAogfQogCiBzdGF0aWMgaW50Ci14ZHJfZGVjb2RlX3N0YXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3hkcl9kZWNvZGVfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuc21fcmVzICpyZXNwKQogewogCXJlc3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmMuYyBiL2ZzL2xvY2tkL3N2Yy5jCmluZGV4IDYzNDEzOTIuLjhjYTE4MDggMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Yy5jCisrKyBiL2ZzL2xvY2tkL3N2Yy5jCkBAIC0zNTMsOSArMzUzLDYgQEAKICAqIFN5c2N0bCBwYXJhbWV0ZXJzIChzYW1lIGFzIG1vZHVsZSBwYXJhbWV0ZXJzLCBkaWZmZXJlbnQgaW50ZXJmYWNlKS4KICAqLwogCi0vKiBTb21ldGhpbmcgdGhhdCBpc24ndCBDVExfQU5ZLCBDVExfTk9ORSBvciBhIHZhbHVlIHRoYXQgbWF5IGNsYXNoLiAqLwotI2RlZmluZSBDVExfVU5OVU1CRVJFRAkJLTIKLQogc3RhdGljIGN0bF90YWJsZSBubG1fc3lzY3Rsc1tdID0gewogCXsKIAkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmM0cHJvYy5jIGIvZnMvbG9ja2Qvc3ZjNHByb2MuYwppbmRleCBmYTM3MGY2Li5mNjcxNDZhIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmM0cHJvYy5jCisrKyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKQEAgLTI0LDE0ICsyNCwxNCBAQAogLyoKICAqIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgZnJvbSBhcmd1bWVudHMKICAqLwotc3RhdGljIHUzMgorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCXN0cnVjdCBubG1faG9zdCAqKmhvc3RwLCBzdHJ1Y3QgbmxtX2ZpbGUgKipmaWxwKQogewogCXN0cnVjdCBubG1faG9zdAkJKmhvc3QgPSBOVUxMOwogCXN0cnVjdCBubG1fZmlsZQkJKmZpbGUgPSBOVUxMOwogCXN0cnVjdCBubG1fbG9jawkJKmxvY2sgPSAmYXJncC0+bG9jazsKLQl1MzIJCQllcnJvciA9IDA7CisJX19iZTMyCQkJZXJyb3IgPSAwOwogCiAJLyogbmZzZCBjYWxsYmFja3MgbXVzdCBoYXZlIGJlZW4gaW5zdGFsbGVkIGZvciB0aGlzIHByb2NlZHVyZSAqLwogCWlmICghbmxtc3ZjX29wcykKQEAgLTY4LDcgKzY4LDcgQEAKIC8qCiAgKiBOVUxMOiBUZXN0IGZvciBwcmVzZW5jZSBvZiBzZXJ2aWNlCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbTRzdmNfcHJvY19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCiB7CiAJZHByaW50aygibG9ja2Q6IE5VTEwgICAgICAgICAgY2FsbGVkXG4iKTsKQEAgLTc4LDcgKzc4LDcgQEAKIC8qCiAgKiBURVNUOiBDaGVjayBmb3IgY29uZmxpY3RpbmcgbG9jawogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG00c3ZjX3Byb2NfdGVzdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtOTYsNyArOTYsNyBAQAogCiAJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLwogCWlmICgocmVzcC0+c3RhdHVzID0gbmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKLQkJcmV0dXJuIHJwY19zdWNjZXNzOworCQlyZXR1cm4gcmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5ID8gcnBjX2Ryb3BfcmVwbHkgOnJwY19zdWNjZXNzOwogCiAJLyogTm93IGNoZWNrIGZvciBjb25mbGljdGluZyBsb2NrcyAqLwogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y190ZXN0bG9jayhmaWxlLCAmYXJncC0+bG9jaywgJnJlc3AtPmxvY2spOwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJcmV0dXJuIHJwY19zdWNjZXNzOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG00c3ZjX3Byb2NfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMTI2LDcgKzEyNiw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKICNpZiAwCiAJLyogSWYgc3VwcGxpZWQgc3RhdGUgZG9lc24ndCBtYXRjaCBjdXJyZW50IHN0YXRlLCB3ZSBhc3N1bWUgaXQncwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJcmV0dXJuIHJwY19zdWNjZXNzOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG00c3ZjX3Byb2NfY2FuY2VsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKIHsKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLwogCWlmICgocmVzcC0+c3RhdHVzID0gbmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKLQkJcmV0dXJuIHJwY19zdWNjZXNzOworCQlyZXR1cm4gcmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5ID8gcnBjX2Ryb3BfcmVwbHkgOnJwY19zdWNjZXNzOwogCiAJLyogVHJ5IHRvIGNhbmNlbCByZXF1ZXN0LiAqLwogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y19jYW5jZWxfYmxvY2tlZChmaWxlLCAmYXJncC0+bG9jayk7CkBAIC0xODMsNyArMTgzLDcgQEAKIC8qCiAgKiBVTkxPQ0s6IHJlbGVhc2UgYSBsb2NrCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbTRzdmNfcHJvY191bmxvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCSAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMjAyLDcgKzIwMiw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKIAkvKiBOb3cgdHJ5IHRvIHJlbW92ZSB0aGUgbG9jayAqLwogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y191bmxvY2soZmlsZSwgJmFyZ3AtPmxvY2spOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgKiBHUkFOVEVEOiBBIHNlcnZlciBjYWxscyB1cyB0byB0ZWxsIHRoYXQgYSBwcm9jZXNzJyBsb2NrIHJlcXVlc3QKICAqIHdhcyBncmFudGVkCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbTRzdmNfcHJvY19ncmFudGVkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0yMzQsNyArMjM0LDcgQEAKICAqLwogc3RhdGljIHZvaWQgbmxtNHN2Y19jYWxsYmFja19leGl0KHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqZGF0YSkKIHsKLQlkcHJpbnRrKCJsb2NrZDogJTRkIGNhbGxiYWNrIHJldHVybmVkICVkXG4iLCB0YXNrLT50a19waWQsCisJZHByaW50aygibG9ja2Q6ICU1dSBjYWxsYmFjayByZXR1cm5lZCAlZFxuIiwgdGFzay0+dGtfcGlkLAogCQkJLXRhc2stPnRrX3N0YXR1cyk7CiB9CiAKQEAgLTI1MywxMiArMjUzLDEyIEBACiAgKiBiZWNhdXNlIHdlIHNlbmQgdGhlIGNhbGxiYWNrIGJlZm9yZSB0aGUgcmVwbHkgcHJvcGVyLiBJIGhvcGUgdGhpcwogICogZG9lc24ndCBicmVhayBhbnkgY2xpZW50cy4KICAqLwotc3RhdGljIGludCBubG00c3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiBwcm9jLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCi0JCWludCAoKmZ1bmMpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKiwgc3RydWN0IG5sbV9yZXMgICopKQorc3RhdGljIF9fYmUzMiBubG00c3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiBwcm9jLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCV9fYmUzMiAoKmZ1bmMpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKiwgc3RydWN0IG5sbV9yZXMgICopKQogewogCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKIAlzdHJ1Y3QgbmxtX3Jxc3QJKmNhbGw7Ci0JaW50IHN0YXQ7CisJX19iZTMyIHN0YXQ7CiAKIAlob3N0ID0gbmxtc3ZjX2xvb2t1cF9ob3N0KHJxc3RwLAogCQkJCSAgYXJncC0+bG9jay5jYWxsZXIsCkBAIC0yODIsMzUgKzI4MiwzNSBAQAogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIAotc3RhdGljIGludCBubG00c3ZjX3Byb2NfdGVzdF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorc3RhdGljIF9fYmUzMiBubG00c3ZjX3Byb2NfdGVzdF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCQkgICAgIHZvaWQJICAgICAqcmVzcCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogVEVTVF9NU0cgICAgICBjYWxsZWRcbiIpOwogCXJldHVybiBubG00c3ZjX2NhbGxiYWNrKHJxc3RwLCBOTE1QUk9DX1RFU1RfUkVTLCBhcmdwLCBubG00c3ZjX3Byb2NfdGVzdCk7CiB9CiAKLXN0YXRpYyBpbnQgbmxtNHN2Y19wcm9jX2xvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtNHN2Y19wcm9jX2xvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkJICAgICB2b2lkCSAgICAgKnJlc3ApCiB7CiAJZHByaW50aygibG9ja2Q6IExPQ0tfTVNHICAgICAgY2FsbGVkXG4iKTsKIAlyZXR1cm4gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19MT0NLX1JFUywgYXJncCwgbmxtNHN2Y19wcm9jX2xvY2spOwogfQogCi1zdGF0aWMgaW50IG5sbTRzdmNfcHJvY19jYW5jZWxfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtNHN2Y19wcm9jX2NhbmNlbF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCQkgICAgICAgdm9pZAkgICAgICAgKnJlc3ApCiB7CiAJZHByaW50aygibG9ja2Q6IENBTkNFTF9NU0cgICAgY2FsbGVkXG4iKTsKIAlyZXR1cm4gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19DQU5DRUxfUkVTLCBhcmdwLCBubG00c3ZjX3Byb2NfY2FuY2VsKTsKIH0KIAotc3RhdGljIGludCBubG00c3ZjX3Byb2NfdW5sb2NrX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCitzdGF0aWMgX19iZTMyIG5sbTRzdmNfcHJvY191bmxvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQogewogCWRwcmludGsoImxvY2tkOiBVTkxPQ0tfTVNHICAgIGNhbGxlZFxuIik7CiAJcmV0dXJuIG5sbTRzdmNfY2FsbGJhY2socnFzdHAsIE5MTVBST0NfVU5MT0NLX1JFUywgYXJncCwgbmxtNHN2Y19wcm9jX3VubG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgbmxtNHN2Y19wcm9jX2dyYW50ZWRfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtNHN2Y19wcm9jX2dyYW50ZWRfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRF9NU0cgICBjYWxsZWRcbiIpOwpAQCAtMzIwLDcgKzMyMCw3IEBACiAvKgogICogU0hBUkU6IGNyZWF0ZSBhIERPUyBzaGFyZSBvciBhbHRlciBleGlzdGluZyBzaGFyZS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX3NoYXJlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMzM5LDcgKzMzOSw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKIAkvKiBOb3cgdHJ5IHRvIGNyZWF0ZSB0aGUgc2hhcmUgKi8KIAlyZXNwLT5zdGF0dXMgPSBubG1zdmNfc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKTsKQEAgLTM1Myw3ICszNTMsNyBAQAogLyoKICAqIFVOU0hBUkU6IFJlbGVhc2UgYSBET1Mgc2hhcmUuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbTRzdmNfcHJvY191bnNoYXJlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0zNzIsNyArMzcyLDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbTRzdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCi0JCXJldHVybiBycGNfc3VjY2VzczsKKwkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKIAogCS8qIE5vdyB0cnkgdG8gbG9jayB0aGUgZmlsZSAqLwogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y191bnNoYXJlX2ZpbGUoaG9zdCwgZmlsZSwgYXJncCk7CkBAIC0zODYsNyArMzg2LDcgQEAKIC8qCiAgKiBOTV9MT0NLOiBDcmVhdGUgYW4gdW5tb25pdG9yZWQgbG9jawogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG00c3ZjX3Byb2Nfbm1fbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMzk5LDcgKzM5OSw3IEBACiAvKgogICogRlJFRV9BTEw6IFJlbGVhc2UgYWxsIGxvY2tzIGFuZCBzaGFyZXMgaGVsZCBieSBjbGllbnQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX2ZyZWVfYWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkJICAgICB2b2lkICAgICAgICAgICAgKnJlc3ApCiB7CkBAIC00MTcsNyArNDE3LDcgQEAKIC8qCiAgKiBTTV9OT1RJRlk6IHByaXZhdGUgY2FsbGJhY2sgZnJvbSBzdGF0ZCAobm90IHBhcnQgb2Ygb2ZmaWNpYWwgTkxNIHByb3RvKQogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG00c3ZjX3Byb2Nfc21fbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVib290ICphcmdwLAogCQkJCQkgICAgICB2b2lkCSAgICAgICAgKnJlc3ApCiB7CkBAIC00NDYsNyArNDQ2LDcgQEAKIC8qCiAgKiBjbGllbnQgc2VudCBhIEdSQU5URURfUkVTLCBsZXQncyByZW1vdmUgdGhlIGFzc29jaWF0ZWQgYmxvY2sKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtNHN2Y19wcm9jX2dyYW50ZWRfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVzICAqYXJncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y2xvY2suYyBiL2ZzL2xvY2tkL3N2Y2xvY2suYwppbmRleCA4MTRjNjA2Li5jN2RiMGE1IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNsb2NrLmMKKysrIGIvZnMvbG9ja2Qvc3ZjbG9jay5jCkBAIC0zMzQsMTcgKzMzNCwxNyBAQAogICogQXR0ZW1wdCB0byBlc3RhYmxpc2ggYSBsb2NrLCBhbmQgaWYgaXQgY2FuJ3QgYmUgZ3JhbnRlZCwgYmxvY2sgaXQKICAqIGlmIHJlcXVpcmVkLgogICovCi11MzIKK19fYmUzMgogbmxtc3ZjX2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAogCQkJc3RydWN0IG5sbV9sb2NrICpsb2NrLCBpbnQgd2FpdCwgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKIHsKIAlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jaywgKm5ld2Jsb2NrID0gTlVMTDsKIAlpbnQJCQllcnJvcjsKLQl1MzIJCQlyZXQ7CisJX19iZTMyCQkJcmV0OwogCiAJZHByaW50aygibG9ja2Q6IG5sbXN2Y19sb2NrKCVzLyVsZCwgdHk9JWQsIHBpPSVkLCAlTGQtJUxkLCBibD0lZClcbiIsCi0JCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKLQkJCQlmaWxlLT5mX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubywKKwkJCQlmaWxlLT5mX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2lubywKIAkJCQlsb2NrLT5mbC5mbF90eXBlLCBsb2NrLT5mbC5mbF9waWQsCiAJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9zdGFydCwKIAkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX2VuZCwKQEAgLTQxNSwxMyArNDE1LDEzIEBACiAvKgogICogVGVzdCBmb3IgcHJlc2VuY2Ugb2YgYSBjb25mbGljdGluZyBsb2NrLgogICovCi11MzIKK19fYmUzMgogbmxtc3ZjX3Rlc3Rsb2NrKHN0cnVjdCBubG1fZmlsZSAqZmlsZSwgc3RydWN0IG5sbV9sb2NrICpsb2NrLAogCQkJCSAgICAgICBzdHJ1Y3QgbmxtX2xvY2sgKmNvbmZsb2NrKQogewogCWRwcmludGsoImxvY2tkOiBubG1zdmNfdGVzdGxvY2soJXMvJWxkLCB0eT0lZCwgJUxkLSVMZClcbiIsCi0JCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKLQkJCQlmaWxlLT5mX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubywKKwkJCQlmaWxlLT5mX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2lubywKIAkJCQlsb2NrLT5mbC5mbF90eXBlLAogCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfc3RhcnQsCiAJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9lbmQpOwpAQCAtNDQ4LDE0ICs0NDgsMTQgQEAKICAqIGFmdGVyd2FyZHMuIEluIHRoaXMgY2FzZSB0aGUgYmxvY2sgd2lsbCBzdGlsbCBiZSB0aGVyZSwgYW5kIGhlbmNlCiAgKiBtdXN0IGJlIHJlbW92ZWQuCiAgKi8KLXUzMgorX19iZTMyCiBubG1zdmNfdW5sb2NrKHN0cnVjdCBubG1fZmlsZSAqZmlsZSwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQogewogCWludAllcnJvcjsKIAogCWRwcmludGsoImxvY2tkOiBubG1zdmNfdW5sb2NrKCVzLyVsZCwgcGk9JWQsICVMZC0lTGQpXG4iLAotCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCi0JCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sCisJCQkJZmlsZS0+Zl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sCiAJCQkJbG9jay0+ZmwuZmxfcGlkLAogCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfc3RhcnQsCiAJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9lbmQpOwpAQCAtNDc2LDE1ICs0NzYsMTUgQEAKICAqIGJlIGluIHByb2dyZXNzLgogICogVGhlIGNhbGxpbmcgcHJvY2VkdXJlIG11c3QgY2hlY2sgd2hldGhlciB0aGUgZmlsZSBjYW4gYmUgY2xvc2VkLgogICovCi11MzIKK19fYmUzMgogbmxtc3ZjX2NhbmNlbF9ibG9ja2VkKHN0cnVjdCBubG1fZmlsZSAqZmlsZSwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQogewogCXN0cnVjdCBubG1fYmxvY2sJKmJsb2NrOwogCWludCBzdGF0dXMgPSAwOwogCiAJZHByaW50aygibG9ja2Q6IG5sbXN2Y19jYW5jZWwoJXMvJWxkLCBwaT0lZCwgJUxkLSVMZClcbiIsCi0JCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKLQkJCQlmaWxlLT5mX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubywKKwkJCQlmaWxlLT5mX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2lubywKIAkJCQlsb2NrLT5mbC5mbF9waWQsCiAJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9zdGFydCwKIAkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX2VuZCk7CkBAIC02NDUsNyArNjQ1LDcgQEAKICAqIGJsb2NrLgogICovCiB2b2lkCi1ubG1zdmNfZ3JhbnRfcmVwbHkoc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSwgdTMyIHN0YXR1cykKK25sbXN2Y19ncmFudF9yZXBseShzdHJ1Y3QgbmxtX2Nvb2tpZSAqY29va2llLCBfX2JlMzIgc3RhdHVzKQogewogCXN0cnVjdCBubG1fYmxvY2sJKmJsb2NrOwogCkBAIC02NTUsNyArNjU1LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGJsb2NrKSB7Ci0JCWlmIChzdGF0dXMgPT0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKSB7CisJCWlmIChzdGF0dXMgPT0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kKSB7CiAJCQkvKiBUcnkgYWdhaW4gaW4gYSBjb3VwbGUgb2Ygc2Vjb25kcyAqLwogCQkJbmxtc3ZjX2luc2VydF9ibG9jayhibG9jaywgMTAgKiBIWik7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmNwcm9jLmMgYi9mcy9sb2NrZC9zdmNwcm9jLmMKaW5kZXggNzViMmM4MS4uMzcwN2MzYSAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjcHJvYy5jCisrKyBiL2ZzL2xvY2tkL3N2Y3Byb2MuYwpAQCAtMjIsOCArMjIsOCBAQAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19DTElFTlQKIAogI2lmZGVmIENPTkZJR19MT0NLRF9WNAotc3RhdGljIHUzMgotY2FzdF90b19ubG0odTMyIHN0YXR1cywgdTMyIHZlcnMpCitzdGF0aWMgX19iZTMyCitjYXN0X3RvX25sbShfX2JlMzIgc3RhdHVzLCB1MzIgdmVycykKIHsKIAkvKiBOb3RlOiBzdGF0dXMgaXMgYXNzdW1lZCB0byBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgISEhICovCiAJaWYgKHZlcnMgIT0gNCl7CkBAIC01MiwxNCArNTIsMTQgQEAKIC8qCiAgKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlIGZyb20gYXJndW1lbnRzCiAgKi8KLXN0YXRpYyB1MzIKK3N0YXRpYyBfX2JlMzIKIG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCXN0cnVjdCBubG1faG9zdCAqKmhvc3RwLCBzdHJ1Y3QgbmxtX2ZpbGUgKipmaWxwKQogewogCXN0cnVjdCBubG1faG9zdAkJKmhvc3QgPSBOVUxMOwogCXN0cnVjdCBubG1fZmlsZQkJKmZpbGUgPSBOVUxMOwogCXN0cnVjdCBubG1fbG9jawkJKmxvY2sgPSAmYXJncC0+bG9jazsKLQl1MzIJCQllcnJvcjsKKwlfX2JlMzIJCQllcnJvciA9IDA7CiAKIAkvKiBuZnNkIGNhbGxiYWNrcyBtdXN0IGhhdmUgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcHJvY2VkdXJlICovCiAJaWYgKCFubG1zdmNfb3BzKQpAQCAtODgsMTMgKzg4LDE1IEBACiBub19sb2NrczoKIAlpZiAoaG9zdCkKIAkJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAlyZXR1cm4gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKIH0KIAogLyoKICAqIE5VTEw6IFRlc3QgZm9yIHByZXNlbmNlIG9mIHNlcnZpY2UKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQogewogCWRwcmludGsoImxvY2tkOiBOVUxMICAgICAgICAgIGNhbGxlZFxuIik7CkBAIC0xMDQsNyArMTA2LDcgQEAKIC8qCiAgKiBURVNUOiBDaGVjayBmb3IgY29uZmxpY3RpbmcgbG9jawogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY190ZXN0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0xMjIsNyArMTI0LDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKLQkJcmV0dXJuIHJwY19zdWNjZXNzOworCQlyZXR1cm4gcmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5ID8gcnBjX2Ryb3BfcmVwbHkgOnJwY19zdWNjZXNzOwogCiAJLyogTm93IGNoZWNrIGZvciBjb25mbGljdGluZyBsb2NrcyAqLwogCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y190ZXN0bG9jayhmaWxlLCAmYXJncC0+bG9jaywgJnJlc3AtPmxvY2spKTsKQEAgLTEzNCw3ICsxMzYsNyBAQAogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMTUzLDcgKzE1NSw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG1zdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCi0JCXJldHVybiBycGNfc3VjY2VzczsKKwkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKIAogI2lmIDAKIAkvKiBJZiBzdXBwbGllZCBzdGF0ZSBkb2Vzbid0IG1hdGNoIGN1cnJlbnQgc3RhdGUsIHdlIGFzc3VtZSBpdCdzCkBAIC0xNzcsNyArMTc5LDcgQEAKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbXN2Y19wcm9jX2NhbmNlbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC0xOTYsNyArMTk4LDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKLQkJcmV0dXJuIHJwY19zdWNjZXNzOworCQlyZXR1cm4gcmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5ID8gcnBjX2Ryb3BfcmVwbHkgOnJwY19zdWNjZXNzOwogCiAJLyogVHJ5IHRvIGNhbmNlbCByZXF1ZXN0LiAqLwogCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y19jYW5jZWxfYmxvY2tlZChmaWxlLCAmYXJncC0+bG9jaykpOwpAQCAtMjEwLDcgKzIxMiw3IEBACiAvKgogICogVU5MT0NLOiByZWxlYXNlIGEgbG9jawogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY191bmxvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCSAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQogewpAQCAtMjI5LDcgKzIzMSw3IEBACiAKIAkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCiAJaWYgKChyZXNwLT5zdGF0dXMgPSBubG1zdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCi0JCXJldHVybiBycGNfc3VjY2VzczsKKwkJcmV0dXJuIHJlc3AtPnN0YXR1cyA9PSBubG1fZHJvcF9yZXBseSA/IHJwY19kcm9wX3JlcGx5IDpycGNfc3VjY2VzczsKIAogCS8qIE5vdyB0cnkgdG8gcmVtb3ZlIHRoZSBsb2NrICovCiAJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3VubG9jayhmaWxlLCAmYXJncC0+bG9jaykpOwpAQCAtMjQ0LDcgKzI0Niw3IEBACiAgKiBHUkFOVEVEOiBBIHNlcnZlciBjYWxscyB1cyB0byB0ZWxsIHRoYXQgYSBwcm9jZXNzJyBsb2NrIHJlcXVlc3QKICAqIHdhcyBncmFudGVkCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5sbXN2Y19wcm9jX2dyYW50ZWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCSAgICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKIHsKQEAgLTI2MSw3ICsyNjMsNyBAQAogICovCiBzdGF0aWMgdm9pZCBubG1zdmNfY2FsbGJhY2tfZXhpdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHZvaWQgKmRhdGEpCiB7Ci0JZHByaW50aygibG9ja2Q6ICU0ZCBjYWxsYmFjayByZXR1cm5lZCAlZFxuIiwgdGFzay0+dGtfcGlkLAorCWRwcmludGsoImxvY2tkOiAlNXUgY2FsbGJhY2sgcmV0dXJuZWQgJWRcbiIsIHRhc2stPnRrX3BpZCwKIAkJCS10YXNrLT50a19zdGF0dXMpOwogfQogCkBAIC0yODAsMTIgKzI4MiwxMiBAQAogICogYmVjYXVzZSB3ZSBzZW5kIHRoZSBjYWxsYmFjayBiZWZvcmUgdGhlIHJlcGx5IHByb3Blci4gSSBob3BlIHRoaXMKICAqIGRvZXNuJ3QgYnJlYWsgYW55IGNsaWVudHMuCiAgKi8KLXN0YXRpYyBpbnQgbmxtc3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiBwcm9jLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCi0JCWludCAoKmZ1bmMpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKiwgc3RydWN0IG5sbV9yZXMgICopKQorc3RhdGljIF9fYmUzMiBubG1zdmNfY2FsbGJhY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyIHByb2MsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJX19iZTMyICgqZnVuYykoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBubG1fYXJncyAqLCBzdHJ1Y3QgbmxtX3JlcyAgKikpCiB7CiAJc3RydWN0IG5sbV9ob3N0CSpob3N0OwogCXN0cnVjdCBubG1fcnFzdAkqY2FsbDsKLQlpbnQgc3RhdDsKKwlfX2JlMzIgc3RhdDsKIAogCWhvc3QgPSBubG1zdmNfbG9va3VwX2hvc3QocnFzdHAsCiAJCQkJICBhcmdwLT5sb2NrLmNhbGxlciwKQEAgLTMwOSwyOCArMzExLDI4IEBACiAJcmV0dXJuIHJwY19zdWNjZXNzOwogfQogCi1zdGF0aWMgaW50IG5sbXN2Y19wcm9jX3Rlc3RfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtc3ZjX3Byb2NfdGVzdF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCQkgICAgIHZvaWQJICAgICAqcmVzcCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogVEVTVF9NU0cgICAgICBjYWxsZWRcbiIpOwogCXJldHVybiBubG1zdmNfY2FsbGJhY2socnFzdHAsIE5MTVBST0NfVEVTVF9SRVMsIGFyZ3AsIG5sbXN2Y19wcm9jX3Rlc3QpOwogfQogCi1zdGF0aWMgaW50IG5sbXN2Y19wcm9jX2xvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKK3N0YXRpYyBfX2JlMzIgbmxtc3ZjX3Byb2NfbG9ja19tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAogCQkJCQkgICAgIHZvaWQJICAgICAqcmVzcCkKIHsKIAlkcHJpbnRrKCJsb2NrZDogTE9DS19NU0cgICAgICBjYWxsZWRcbiIpOwogCXJldHVybiBubG1zdmNfY2FsbGJhY2socnFzdHAsIE5MTVBST0NfTE9DS19SRVMsIGFyZ3AsIG5sbXN2Y19wcm9jX2xvY2spOwogfQogCi1zdGF0aWMgaW50IG5sbXN2Y19wcm9jX2NhbmNlbF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorc3RhdGljIF9fYmUzMiBubG1zdmNfcHJvY19jYW5jZWxfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkJICAgICAgIHZvaWQJICAgICAgICpyZXNwKQogewogCWRwcmludGsoImxvY2tkOiBDQU5DRUxfTVNHICAgIGNhbGxlZFxuIik7CiAJcmV0dXJuIG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19DQU5DRUxfUkVTLCBhcmdwLCBubG1zdmNfcHJvY19jYW5jZWwpOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY191bmxvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQogewpAQCAtMzM4LDcgKzM0MCw3IEBACiAJcmV0dXJuIG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19VTkxPQ0tfUkVTLCBhcmdwLCBubG1zdmNfcHJvY191bmxvY2spOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY19ncmFudGVkX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnJlc3ApCiB7CkBAIC0zNDksNyArMzUxLDcgQEAKIC8qCiAgKiBTSEFSRTogY3JlYXRlIGEgRE9TIHNoYXJlIG9yIGFsdGVyIGV4aXN0aW5nIHNoYXJlLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY19zaGFyZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKIHsKQEAgLTM2OCw3ICszNzAsNyBAQAogCiAJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLwogCWlmICgocmVzcC0+c3RhdHVzID0gbmxtc3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQotCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJCXJldHVybiByZXNwLT5zdGF0dXMgPT0gbmxtX2Ryb3BfcmVwbHkgPyBycGNfZHJvcF9yZXBseSA6cnBjX3N1Y2Nlc3M7CiAKIAkvKiBOb3cgdHJ5IHRvIGNyZWF0ZSB0aGUgc2hhcmUgKi8KIAlyZXNwLT5zdGF0dXMgPSBjYXN0X3N0YXR1cyhubG1zdmNfc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKSk7CkBAIC0zODIsNyArMzg0LDcgQEAKIC8qCiAgKiBVTlNIQVJFOiBSZWxlYXNlIGEgRE9TIHNoYXJlLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY191bnNoYXJlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC00MDEsNyArNDAzLDcgQEAKIAogCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KIAlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKLQkJcmV0dXJuIHJwY19zdWNjZXNzOworCQlyZXR1cm4gcmVzcC0+c3RhdHVzID09IG5sbV9kcm9wX3JlcGx5ID8gcnBjX2Ryb3BfcmVwbHkgOnJwY19zdWNjZXNzOwogCiAJLyogTm93IHRyeSB0byB1bnNoYXJlIHRoZSBmaWxlICovCiAJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3Vuc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKSk7CkBAIC00MTUsNyArNDE3LDcgQEAKIC8qCiAgKiBOTV9MT0NLOiBDcmVhdGUgYW4gdW5tb25pdG9yZWQgbG9jawogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY19ubV9sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKIAkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCiB7CkBAIC00MjgsNyArNDMwLDcgQEAKIC8qCiAgKiBGUkVFX0FMTDogUmVsZWFzZSBhbGwgbG9ja3MgYW5kIHNoYXJlcyBoZWxkIGJ5IGNsaWVudAogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBubG1zdmNfcHJvY19mcmVlX2FsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCiAJCQkJCSAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQogewpAQCAtNDQ2LDcgKzQ0OCw3IEBACiAvKgogICogU01fTk9USUZZOiBwcml2YXRlIGNhbGxiYWNrIGZyb20gc3RhdGQgKG5vdCBwYXJ0IG9mIG9mZmljaWFsIE5MTSBwcm90bykKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2Nfc21fbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVib290ICphcmdwLAogCQkJCQkgICAgICB2b2lkCSAgICAgICAgKnJlc3ApCiB7CkBAIC00NzUsNyArNDc3LDcgQEAKIC8qCiAgKiBjbGllbnQgc2VudCBhIEdSQU5URURfUkVTLCBsZXQncyByZW1vdmUgdGhlIGFzc29jaWF0ZWQgYmxvY2sKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmxtc3ZjX3Byb2NfZ3JhbnRlZF9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9yZXMgICphcmdwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQogewpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3Zjc2hhcmUuYyBiL2ZzL2xvY2tkL3N2Y3NoYXJlLmMKaW5kZXggYjk5MjZjZS4uMDY4ODg2ZCAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3Zjc2hhcmUuYworKysgYi9mcy9sb2NrZC9zdmNzaGFyZS5jCkBAIC0yMyw3ICsyMyw3IEBACiAJICAgICYmICFtZW1jbXAoc2hhcmUtPnNfb3duZXIuZGF0YSwgb2gtPmRhdGEsIG9oLT5sZW4pOwogfQogCi11MzIKK19fYmUzMgogbmxtc3ZjX3NoYXJlX2ZpbGUoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsCiAJCQlzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3ApCiB7CkBAIC0zOSw3ICszOSw3IEBACiAJCQlyZXR1cm4gbmxtX2xja19kZW5pZWQ7CiAJfQogCi0Jc2hhcmUgPSAoc3RydWN0IG5sbV9zaGFyZSAqKSBrbWFsbG9jKHNpemVvZigqc2hhcmUpICsgb2gtPmxlbiwKKwlzaGFyZSA9IGttYWxsb2Moc2l6ZW9mKCpzaGFyZSkgKyBvaC0+bGVuLAogCQkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKHNoYXJlID09IE5VTEwpCiAJCXJldHVybiBubG1fbGNrX2RlbmllZF9ub2xvY2tzOwpAQCAtNjQsNyArNjQsNyBAQAogLyoKICAqIERlbGV0ZSBhIHNoYXJlLgogICovCi11MzIKK19fYmUzMgogbmxtc3ZjX3Vuc2hhcmVfZmlsZShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBubG1fZmlsZSAqZmlsZSwKIAkJCXN0cnVjdCBubG1fYXJncyAqYXJncCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3N1YnMuYyBiL2ZzL2xvY2tkL3N2Y3N1YnMuYwppbmRleCA1MTRmNWYyLi5jMGRmMDBjIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNzdWJzLmMKKysrIGIvZnMvbG9ja2Qvc3Zjc3Vicy5jCkBAIC00Myw3ICs0Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBubG1fZGVidWdfcHJpbnRfZmlsZShjaGFyICptc2csIHN0cnVjdCBubG1fZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJZHByaW50aygibG9ja2Q6ICVzICVzLyVsZFxuIiwKIAkJbXNnLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKQEAgLTc4LDE0ICs3OCwxNCBAQAogICogVGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBmb3Igbm93LCB3ZSBhc3N1bWUgdGhlIGNsaWVudCBwZXJmb3JtcwogICogdGhlIHByb3BlciBSL1cgY2hlY2tpbmcuCiAgKi8KLXUzMgorX19iZTMyCiBubG1fbG9va3VwX2ZpbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9maWxlICoqcmVzdWx0LAogCQkJCQlzdHJ1Y3QgbmZzX2ZoICpmKQogewogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CiAJc3RydWN0IG5sbV9maWxlCSpmaWxlOwogCXVuc2lnbmVkIGludAloYXNoOwotCXUzMgkJbmZzZXJyOworCV9fYmUzMgkJbmZzZXJyOwogCiAJbmxtX2RlYnVnX3ByaW50X2ZoKCJubG1fZmlsZV9sb29rdXAiLCBmKTsKIApAQCAtMTM1LDEyICsxMzUsNiBAQAogCiBvdXRfZnJlZToKIAlrZnJlZShmaWxlKTsKLSNpZmRlZiBDT05GSUdfTE9DS0RfVjQKLQlpZiAobmZzZXJyID09IDEpCi0JCW5mc2VyciA9IG5sbTRfc3RhbGVfZmg7Ci0JZWxzZQotI2VuZGlmCi0JbmZzZXJyID0gbmxtX2xja19kZW5pZWQ7CiAJZ290byBvdXRfdW5sb2NrOwogfQogCkBAIC0zMjQsNyArMzE4LDE2IEBACiBzdGF0aWMgaW50CiBubG1zdmNfaXNfY2xpZW50KHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IG5sbV9ob3N0ICpkdW1teSkKIHsKLQlyZXR1cm4gaG9zdC0+aF9zZXJ2ZXI7CisJaWYgKGhvc3QtPmhfc2VydmVyKSB7CisJCS8qIHdlIGFyZSBkZXN0cm95aW5nIGxvY2tzIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQKKwkJICogaGFzbid0IGFza2VkIHVzIHRvbywgc28gZG9uJ3QgdW5tb25pdG9yIHRoZQorCQkgKiBjbGllbnQKKwkJICovCisJCWlmIChob3N0LT5oX25zbWhhbmRsZSkKKwkJCWhvc3QtPmhfbnNtaGFuZGxlLT5zbV9zdGlja3kgPSAxOworCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9sb2NrZC94ZHIuYyBiL2ZzL2xvY2tkL3hkci5jCmluZGV4IDYxYzQ2ZmEuLjM0ZGFlNWQgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3hkci5jCisrKyBiL2ZzL2xvY2tkL3hkci5jCkBAIC00Myw3ICs0Myw3IEBACiAvKgogICogWERSIGZ1bmN0aW9ucyBmb3IgYmFzaWMgTkxNIHR5cGVzCiAgKi8KLXN0YXRpYyB1MzIgKm5sbV9kZWNvZGVfY29va2llKHUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCitzdGF0aWMgX19iZTMyICpubG1fZGVjb2RlX2Nvb2tpZShfX2JlMzIgKnAsIHN0cnVjdCBubG1fY29va2llICpjKQogewogCXVuc2lnbmVkIGludAlsZW47CiAKQEAgLTY5LDggKzY5LDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotbmxtX2VuY29kZV9jb29raWUodTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK25sbV9lbmNvZGVfY29va2llKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCiB7CiAJKnArKyA9IGh0b25sKGMtPmxlbik7CiAJbWVtY3B5KHAsIGMtPmRhdGEsIGMtPmxlbik7CkBAIC03OCw4ICs3OCw4IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyB1MzIgKgotbmxtX2RlY29kZV9maCh1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmYpCitzdGF0aWMgX19iZTMyICoKK25sbV9kZWNvZGVfZmgoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQogewogCXVuc2lnbmVkIGludAlsZW47CiAKQEAgLTk1LDggKzk1LDggQEAKIAlyZXR1cm4gcCArIFhEUl9RVUFETEVOKE5GUzJfRkhTSVpFKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotbmxtX2VuY29kZV9maCh1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmYpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCitubG1fZW5jb2RlX2ZoKF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKIHsKIAkqcCsrID0gaHRvbmwoTkZTMl9GSFNJWkUpOwogCW1lbWNweShwLCBmLT5kYXRhLCBORlMyX0ZIU0laRSk7CkBAIC0xMDYsMjAgKzEwNiwyMCBAQAogLyoKICAqIEVuY29kZSBhbmQgZGVjb2RlIG93bmVyIGhhbmRsZQogICovCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1ubG1fZGVjb2RlX29oKHUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgorbmxtX2RlY29kZV9vaChfX2JlMzIgKnAsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKIHsKIAlyZXR1cm4geGRyX2RlY29kZV9uZXRvYmoocCwgb2gpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1ubG1fZW5jb2RlX29oKHUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgorbmxtX2VuY29kZV9vaChfX2JlMzIgKnAsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKIHsKIAlyZXR1cm4geGRyX2VuY29kZV9uZXRvYmoocCwgb2gpOwogfQogCi1zdGF0aWMgdTMyICoKLW5sbV9kZWNvZGVfbG9jayh1MzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3N0YXRpYyBfX2JlMzIgKgorbmxtX2RlY29kZV9sb2NrKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQogewogCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOwogCXMzMgkJCXN0YXJ0LCBsZW4sIGVuZDsKQEAgLTE1Myw4ICsxNTMsOCBAQAogLyoKICAqIEVuY29kZSBhIGxvY2sgYXMgcGFydCBvZiBhbiBOTE0gY2FsbAogICovCi1zdGF0aWMgdTMyICoKLW5sbV9lbmNvZGVfbG9jayh1MzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3N0YXRpYyBfX2JlMzIgKgorbmxtX2VuY29kZV9sb2NrKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQogewogCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOwogCV9fczMyCQkJc3RhcnQsIGxlbjsKQEAgLTE4NCw4ICsxODQsOCBAQAogLyoKICAqIEVuY29kZSByZXN1bHQgb2YgYSBURVNUL1RFU1RfTVNHIGNhbGwKICAqLwotc3RhdGljIHUzMiAqCi1ubG1fZW5jb2RlX3Rlc3RyZXModTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3N0YXRpYyBfX2JlMzIgKgorbmxtX2VuY29kZV90ZXN0cmVzKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJczMyCQlzdGFydCwgbGVuOwogCkBAIC0yMjEsNyArMjIxLDcgQEAKICAqIEZpcnN0LCB0aGUgc2VydmVyIHNpZGUgWERSIGZ1bmN0aW9ucwogICovCiBpbnQKLW5sbXN2Y19kZWNvZGVfdGVzdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbXN2Y19kZWNvZGVfdGVzdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAl1MzIJZXhjbHVzaXZlOwogCkBAIC0yMzgsNyArMjM4LDcgQEAKIH0KIAogaW50Ci1ubG1zdmNfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK25sbXN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG1fZW5jb2RlX3Rlc3RyZXMocCwgcmVzcCkpKQogCQlyZXR1cm4gMDsKQEAgLTI0Niw3ICsyNDYsNyBAQAogfQogCiBpbnQKLW5sbXN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbXN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAl1MzIJZXhjbHVzaXZlOwogCkBAIC0yNjYsNyArMjY2LDcgQEAKIH0KIAogaW50Ci1ubG1zdmNfZGVjb2RlX2NhbmNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG1zdmNfZGVjb2RlX2NhbmNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJdTMyCWV4Y2x1c2l2ZTsKIApAQCAtMjgyLDcgKzI4Miw3IEBACiB9CiAKIGludAotbmxtc3ZjX2RlY29kZV91bmxvY2thcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG1zdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpCiAJIHx8ICEocCA9IG5sbV9kZWNvZGVfbG9jayhwLCAmYXJncC0+bG9jaykpKQpAQCAtMjkyLDcgKzI5Miw3IEBACiB9CiAKIGludAotbmxtc3ZjX2RlY29kZV9zaGFyZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbXN2Y19kZWNvZGVfc2hhcmVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CiAKQEAgLTMxMyw3ICszMTMsNyBAQAogfQogCiBpbnQKLW5sbXN2Y19lbmNvZGVfc2hhcmVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK25sbXN2Y19lbmNvZGVfc2hhcmVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gMDsKQEAgLTMyMyw3ICszMjMsNyBAQAogfQogCiBpbnQKLW5sbXN2Y19lbmNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG1zdmNfZW5jb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAwOwpAQCAtMzMyLDcgKzMzMiw3IEBACiB9CiAKIGludAotbmxtc3ZjX2RlY29kZV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3ApCitubG1zdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKIApAQCAtMzQ0LDcgKzM0NCw3IEBACiB9CiAKIGludAotbmxtc3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCkKK25sbXN2Y19kZWNvZGVfcmVib290KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZWJvb3QgKmFyZ3ApCiB7CiAJaWYgKCEocCA9IHhkcl9kZWNvZGVfc3RyaW5nX2lucGxhY2UocCwgJmFyZ3AtPm1vbiwgJmFyZ3AtPmxlbiwgU01fTUFYU1RSTEVOKSkpCiAJCXJldHVybiAwOwpAQCAtMzU3LDIyICszNTcsMjIgQEAKIH0KIAogaW50Ci1ubG1zdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtc3ZjX2RlY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gMDsKLQlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKKwlyZXNwLT5zdGF0dXMgPSAqcCsrOwogCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9CiAKIGludAotbmxtc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCitubG1zdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCiBpbnQKLW5sbXN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQorbmxtc3ZjX2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCiB7CiAJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KQEAgLTM4OSw3ICszODksNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfdGVzdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG1jbHRfZW5jb2RlX3Rlc3RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwogCkBAIC00MDMsMTIgKzQwMywxMiBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG1jbHRfZGVjb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG1jbHRfZGVjb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKIAkJcmV0dXJuIC1FSU87Ci0JcmVzcC0+c3RhdHVzID0gbnRvaGwoKnArKyk7Ci0JaWYgKHJlc3AtPnN0YXR1cyA9PSBOTE1fTENLX0RFTklFRCkgeworCXJlc3AtPnN0YXR1cyA9ICpwKys7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkgewogCQlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZyZXNwLT5sb2NrLmZsOwogCQl1MzIJCQlleGNsOwogCQlzMzIJCQlzdGFydCwgbGVuLCBlbmQ7CkBAIC00MzgsNyArNDM4LDcgQEAKIAogCiBzdGF0aWMgaW50Ci1ubG1jbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtY2x0X2VuY29kZV9sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKIApAQCAtNDU1LDcgKzQ1NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfY2FuY2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG1jbHRfZW5jb2RlX2NhbmNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwogCkBAIC00NzAsNyArNDcwLDcgQEAKIH0KIAogc3RhdGljIGludAotbmxtY2x0X2VuY29kZV91bmxvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtY2x0X2VuY29kZV91bmxvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwogCkBAIC00ODMsNyArNDgzLDcgQEAKIH0KIAogc3RhdGljIGludAotbmxtY2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG1jbHRfZW5jb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTQ5Myw3ICs0OTMsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG1jbHRfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG1jbHRfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbV9lbmNvZGVfdGVzdHJlcyhwLCByZXNwKSkpCiAJCXJldHVybiAtRUlPOwpAQCAtNTAyLDExICs1MDIsMTEgQEAKIH0KIAogc3RhdGljIGludAotbmxtY2x0X2RlY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG1jbHRfZGVjb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gLUVJTzsKLQlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKKwlyZXNwLT5zdGF0dXMgPSAqcCsrOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC94ZHI0LmMgYi9mcy9sb2NrZC94ZHI0LmMKaW5kZXggMzZlYjE3NS4uYTc4MjQwNSAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyNC5jCisrKyBiL2ZzL2xvY2tkL3hkcjQuYwpAQCAtNDQsOCArNDQsOCBAQAogLyoKICAqIFhEUiBmdW5jdGlvbnMgZm9yIGJhc2ljIE5MTSB0eXBlcwogICovCi1zdGF0aWMgdTMyICoKLW5sbTRfZGVjb2RlX2Nvb2tpZSh1MzIgKnAsIHN0cnVjdCBubG1fY29va2llICpjKQorc3RhdGljIF9fYmUzMiAqCitubG00X2RlY29kZV9jb29raWUoX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKIHsKIAl1bnNpZ25lZCBpbnQJbGVuOwogCkBAIC03MSw4ICs3MSw4IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyB1MzIgKgotbmxtNF9lbmNvZGVfY29va2llKHUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCitzdGF0aWMgX19iZTMyICoKK25sbTRfZW5jb2RlX2Nvb2tpZShfX2JlMzIgKnAsIHN0cnVjdCBubG1fY29va2llICpjKQogewogCSpwKysgPSBodG9ubChjLT5sZW4pOwogCW1lbWNweShwLCBjLT5kYXRhLCBjLT5sZW4pOwpAQCAtODAsOCArODAsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdTMyICoKLW5sbTRfZGVjb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKK3N0YXRpYyBfX2JlMzIgKgorbmxtNF9kZWNvZGVfZmgoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQogewogCW1lbXNldChmLT5kYXRhLCAwLCBzaXplb2YoZi0+ZGF0YSkpOwogCWYtPnNpemUgPSBudG9obCgqcCsrKTsKQEAgLTk1LDggKzk1LDggQEAKIAlyZXR1cm4gcCArIFhEUl9RVUFETEVOKGYtPnNpemUpOwogfQogCi1zdGF0aWMgdTMyICoKLW5sbTRfZW5jb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKK3N0YXRpYyBfX2JlMzIgKgorbmxtNF9lbmNvZGVfZmgoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQogewogCSpwKysgPSBodG9ubChmLT5zaXplKTsKIAlpZiAoZi0+c2l6ZSkgcFtYRFJfUVVBRExFTihmLT5zaXplKS0xXSA9IDA7IC8qIGRvbid0IGxlYWsgYW55dGhpbmcgKi8KQEAgLTEwNywyMCArMTA3LDIwIEBACiAvKgogICogRW5jb2RlIGFuZCBkZWNvZGUgb3duZXIgaGFuZGxlCiAgKi8KLXN0YXRpYyB1MzIgKgotbmxtNF9kZWNvZGVfb2godTMyICpwLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2gpCitzdGF0aWMgX19iZTMyICoKK25sbTRfZGVjb2RlX29oKF9fYmUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQogewogCXJldHVybiB4ZHJfZGVjb2RlX25ldG9iaihwLCBvaCk7CiB9CiAKLXN0YXRpYyB1MzIgKgotbmxtNF9lbmNvZGVfb2godTMyICpwLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2gpCitzdGF0aWMgX19iZTMyICoKK25sbTRfZW5jb2RlX29oKF9fYmUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQogewogCXJldHVybiB4ZHJfZW5jb2RlX25ldG9iaihwLCBvaCk7CiB9CiAKLXN0YXRpYyB1MzIgKgotbmxtNF9kZWNvZGVfbG9jayh1MzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3N0YXRpYyBfX2JlMzIgKgorbmxtNF9kZWNvZGVfbG9jayhfX2JlMzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKIHsKIAlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZsb2NrLT5mbDsKIAlfX3M2NAkJCWxlbiwgc3RhcnQsIGVuZDsKQEAgLTE1Myw4ICsxNTMsOCBAQAogLyoKICAqIEVuY29kZSBhIGxvY2sgYXMgcGFydCBvZiBhbiBOTE0gY2FsbAogICovCi1zdGF0aWMgdTMyICoKLW5sbTRfZW5jb2RlX2xvY2sodTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCitzdGF0aWMgX19iZTMyICoKK25sbTRfZW5jb2RlX2xvY2soX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmbG9jay0+Zmw7CiAJX19zNjQJCQlzdGFydCwgbGVuOwpAQCAtMTg1LDggKzE4NSw4IEBACiAvKgogICogRW5jb2RlIHJlc3VsdCBvZiBhIFRFU1QvVEVTVF9NU0cgY2FsbAogICovCi1zdGF0aWMgdTMyICoKLW5sbTRfZW5jb2RlX3Rlc3RyZXModTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3N0YXRpYyBfX2JlMzIgKgorbmxtNF9lbmNvZGVfdGVzdHJlcyhfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCXM2NAkJc3RhcnQsIGxlbjsKIApAQCAtMjI3LDcgKzIyNyw3IEBACiAgKiBGaXJzdCwgdGhlIHNlcnZlciBzaWRlIFhEUiBmdW5jdGlvbnMKICAqLwogaW50Ci1ubG00c3ZjX2RlY29kZV90ZXN0YXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtNHN2Y19kZWNvZGVfdGVzdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAl1MzIJZXhjbHVzaXZlOwogCkBAIC0yNDQsNyArMjQ0LDcgQEAKIH0KIAogaW50Ci1ubG00c3ZjX2VuY29kZV90ZXN0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00c3ZjX2VuY29kZV90ZXN0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbTRfZW5jb2RlX3Rlc3RyZXMocCwgcmVzcCkpKQogCQlyZXR1cm4gMDsKQEAgLTI1Miw3ICsyNTIsNyBAQAogfQogCiBpbnQKLW5sbTRzdmNfZGVjb2RlX2xvY2thcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG00c3ZjX2RlY29kZV9sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXUzMglleGNsdXNpdmU7CiAKQEAgLTI3Miw3ICsyNzIsNyBAQAogfQogCiBpbnQKLW5sbTRzdmNfZGVjb2RlX2NhbmNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCitubG00c3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXUzMglleGNsdXNpdmU7CiAKQEAgLTI4OCw3ICsyODgsNyBAQAogfQogCiBpbnQKLW5sbTRzdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbTRzdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKIHsKIAlpZiAoIShwID0gbmxtNF9kZWNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKQogCSB8fCAhKHAgPSBubG00X2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCkBAIC0yOTgsNyArMjk4LDcgQEAKIH0KIAogaW50Ci1ubG00c3ZjX2RlY29kZV9zaGFyZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbTRzdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwogCkBAIC0zMTksNyArMzE5LDcgQEAKIH0KIAogaW50Ci1ubG00c3ZjX2VuY29kZV9zaGFyZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtNHN2Y19lbmNvZGVfc2hhcmVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKIHsKIAlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKIAkJcmV0dXJuIDA7CkBAIC0zMjksNyArMzI5LDcgQEAKIH0KIAogaW50Ci1ubG00c3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK25sbTRzdmNfZW5jb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gMDsKQEAgLTMzOCw3ICszMzgsNyBAQAogfQogCiBpbnQKLW5sbTRzdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fYXJncyAqYXJncCkKK25sbTRzdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKIApAQCAtMzUwLDcgKzM1MCw3IEBACiB9CiAKIGludAotbmxtNHN2Y19kZWNvZGVfcmVib290KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZWJvb3QgKmFyZ3ApCitubG00c3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCkKIHsKIAlpZiAoIShwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCAmYXJncC0+bW9uLCAmYXJncC0+bGVuLCBTTV9NQVhTVFJMRU4pKSkKIAkJcmV0dXJuIDA7CkBAIC0zNjMsMjIgKzM2MywyMiBAQAogfQogCiBpbnQKLW5sbTRzdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQorbmxtNHN2Y19kZWNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAwOwotCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOworCXJlc3AtPnN0YXR1cyA9ICpwKys7CiAJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KIAogaW50Ci1ubG00c3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCitubG00c3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCiB7CiAJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KIAogaW50Ci1ubG00c3ZjX2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCitubG00c3ZjX2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCiB7CiAJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KQEAgLTM4OCwxNCArMzg4LDE0IEBACiAgKi8KICNpZmRlZiBOTE1DTE5UX1NVUFBPUlRfU0hBUkVTCiBzdGF0aWMgaW50Ci1ubG00Y2x0X2RlY29kZV92b2lkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHZvaWQgKnB0cikKK25sbTRjbHRfZGVjb2RlX3ZvaWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgdm9pZCAqcHRyKQogewogCXJldHVybiAwOwogfQogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3Rlc3RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtNGNsdF9lbmNvZGVfdGVzdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CiAKQEAgLTQwOSwxMiArNDA5LDEyIEBACiB9CiAKIHN0YXRpYyBpbnQKLW5sbTRjbHRfZGVjb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00Y2x0X2RlY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQogCQlyZXR1cm4gLUVJTzsKLQlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKLQlpZiAocmVzcC0+c3RhdHVzID09IE5MTV9MQ0tfREVOSUVEKSB7CisJcmVzcC0+c3RhdHVzID0gKnArKzsKKwlpZiAocmVzcC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKSB7CiAJCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJnJlc3AtPmxvY2suZmw7CiAJCXUzMgkJCWV4Y2w7CiAJCXM2NAkJCXN0YXJ0LCBlbmQsIGxlbjsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCiAKIHN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQorbmxtNGNsdF9lbmNvZGVfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CiAKQEAgLTQ2MSw3ICs0NjEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG00Y2x0X2VuY29kZV9jYW5jYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbTRjbHRfZW5jb2RlX2NhbmNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQogewogCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwogCkBAIC00NzYsNyArNDc2LDcgQEAKIH0KIAogc3RhdGljIGludAotbmxtNGNsdF9lbmNvZGVfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK25sbTRjbHRfZW5jb2RlX3VubG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCiB7CiAJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CiAKQEAgLTQ4OSw3ICs0ODksNyBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG00Y2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00Y2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAtRUlPOwpAQCAtNDk5LDcgKzQ5OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00Y2x0X2VuY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQogewogCWlmICghKHAgPSBubG00X2VuY29kZV90ZXN0cmVzKHAsIHJlc3ApKSkKIAkJcmV0dXJuIC1FSU87CkBAIC01MDgsMTEgKzUwOCwxMSBAQAogfQogCiBzdGF0aWMgaW50Ci1ubG00Y2x0X2RlY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCitubG00Y2x0X2RlY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCiB7CiAJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCiAJCXJldHVybiAtRUlPOwotCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOworCXJlc3AtPnN0YXR1cyA9ICpwKys7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IGUwYjZhODAuLjUyYTgxMDAgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKKysrIGIvZnMvbG9ja3MuYwpAQCAtMTQyLDEyICsxNDIsMTIgQEAKIHN0YXRpYyBMSVNUX0hFQUQoZmlsZV9sb2NrX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChibG9ja2VkX2xpc3QpOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICpmaWxlbG9ja19jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmaWxlbG9ja19jYWNoZSBfX3JlYWRfbW9zdGx5OwogCiAvKiBBbGxvY2F0ZSBhbiBlbXB0eSBsb2NrIHN0cnVjdHVyZS4gKi8KIHN0YXRpYyBzdHJ1Y3QgZmlsZV9sb2NrICpsb2Nrc19hbGxvY19sb2NrKHZvaWQpCiB7Ci0JcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoZmlsZWxvY2tfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhmaWxlbG9ja19jYWNoZSwgR0ZQX0tFUk5FTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGxvY2tzX3JlbGVhc2VfcHJpdmF0ZShzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKQEAgLTE5OSw3ICsxOTksNyBAQAogICogSW5pdGlhbGlzZXMgdGhlIGZpZWxkcyBvZiB0aGUgZmlsZSBsb2NrIHdoaWNoIGFyZSBpbnZhcmlhbnQgZm9yCiAgKiBmcmVlIGZpbGVfbG9ja3MuCiAgKi8KLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGZpbGVfbG9jayAqbG9jayA9IChzdHJ1Y3QgZmlsZV9sb2NrICopIGZvbzsKIApAQCAtMzIxLDcgKzMyMSw3IEBACiAJCXN0YXJ0ID0gZmlscC0+Zl9wb3M7CiAJCWJyZWFrOwogCWNhc2UgU0VFS19FTkQ6Ci0JCXN0YXJ0ID0gaV9zaXplX3JlYWQoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQlzdGFydCA9IGlfc2l6ZV9yZWFkKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3MSw3ICszNzEsNyBAQAogCQlzdGFydCA9IGZpbHAtPmZfcG9zOwogCQlicmVhazsKIAljYXNlIFNFRUtfRU5EOgotCQlzdGFydCA9IGlfc2l6ZV9yZWFkKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJc3RhcnQgPSBpX3NpemVfcmVhZChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NzIsNyArNjcyLDcgQEAKIAlzdHJ1Y3QgZmlsZV9sb2NrICpjZmw7CiAKIAlsb2NrX2tlcm5lbCgpOwotCWZvciAoY2ZsID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfZmxvY2s7IGNmbDsgY2ZsID0gY2ZsLT5mbF9uZXh0KSB7CisJZm9yIChjZmwgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2Zsb2NrOyBjZmw7IGNmbCA9IGNmbC0+ZmxfbmV4dCkgewogCQlpZiAoIUlTX1BPU0lYKGNmbCkpCiAJCQljb250aW51ZTsKIAkJaWYgKHBvc2l4X2xvY2tzX2NvbmZsaWN0KGNmbCwgZmwpKQpAQCAtNzM0LDcgKzczNCw3IEBACiB7CiAJc3RydWN0IGZpbGVfbG9jayAqbmV3X2ZsID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOwotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBlcnJvciA9IDA7CiAJaW50IGZvdW5kID0gMDsKIApAQCAtMTAxOCw3ICsxMDE4LDcgQEAKICAqLwogaW50IHBvc2l4X2xvY2tfZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7Ci0JcmV0dXJuIF9fcG9zaXhfbG9ja19maWxlX2NvbmYoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGZsLCBOVUxMKTsKKwlyZXR1cm4gX19wb3NpeF9sb2NrX2ZpbGVfY29uZihmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBmbCwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKHBvc2l4X2xvY2tfZmlsZSk7CiAKQEAgLTEwMzMsNyArMTAzMyw3IEBACiBpbnQgcG9zaXhfbG9ja19maWxlX2NvbmYoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBmaWxlX2xvY2sgKmZsLAogCQkJc3RydWN0IGZpbGVfbG9jayAqY29uZmxvY2spCiB7Ci0JcmV0dXJuIF9fcG9zaXhfbG9ja19maWxlX2NvbmYoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGZsLCBjb25mbG9jayk7CisJcmV0dXJuIF9fcG9zaXhfbG9ja19maWxlX2NvbmYoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmwsIGNvbmZsb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0wocG9zaXhfbG9ja19maWxlX2NvbmYpOwogCkBAIC0xMzMzLDggKzEzMzMsOCBAQAogCWludCB0eXBlID0gRl9VTkxDSzsKIAogCWxvY2tfa2VybmVsKCk7Ci0JdGltZV9vdXRfbGVhc2VzKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQlmb3IgKGZsID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfZmxvY2s7IGZsICYmIElTX0xFQVNFKGZsKTsKKwl0aW1lX291dF9sZWFzZXMoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJZm9yIChmbCA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfZmxvY2s7IGZsICYmIElTX0xFQVNFKGZsKTsKIAkJCWZsID0gZmwtPmZsX25leHQpIHsKIAkJaWYgKGZsLT5mbF9maWxlID09IGZpbHApIHsKIAkJCXR5cGUgPSBmbC0+ZmxfdHlwZSAmIH5GX0lOUFJPR1JFU1M7CkBAIC0xMzU5LDcgKzEzNTksNyBAQAogc3RhdGljIGludCBfX3NldGxlYXNlKHN0cnVjdCBmaWxlICpmaWxwLCBsb25nIGFyZywgc3RydWN0IGZpbGVfbG9jayAqKmZscCkKIHsKIAlzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgKipiZWZvcmUsICoqbXlfYmVmb3JlID0gTlVMTCwgKmxlYXNlOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyb3IsIHJkbGVhc2VfY291bnQgPSAwLCB3cmxlYXNlX2NvdW50ID0gMDsKIApAQCAtMTQ0OCw3ICsxNDQ4LDcgQEAKIAogaW50IHNldGxlYXNlKHN0cnVjdCBmaWxlICpmaWxwLCBsb25nIGFyZywgc3RydWN0IGZpbGVfbG9jayAqKmxlYXNlKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyb3I7CiAKQEAgLTE0ODIsNyArMTQ4Miw3IEBACiBpbnQgZmNudGxfc2V0bGVhc2UodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGZpbGVfbG9jayBmbCwgKmZscCA9ICZmbDsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJaW50IGVycm9yOwogCkBAIC0xNjkyLDcgKzE2OTIsNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmZmxvY2ssIGwsIHNpemVvZihmbG9jaykpKQogCQlnb3RvIG91dDsKIAotCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJLyogRG9uJ3QgYWxsb3cgbWFuZGF0b3J5IGxvY2tzIG9uIGZpbGVzIHRoYXQgbWF5IGJlIG1lbW9yeSBtYXBwZWQKIAkgKiBhbmQgc2hhcmVkLgpAQCAtMTgzNSw3ICsxODM1LDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmZsb2NrLCBsLCBzaXplb2YoZmxvY2spKSkKIAkJZ290byBvdXQ7CiAKLQlpbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCS8qIERvbid0IGFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiBmaWxlcyB0aGF0IG1heSBiZSBtZW1vcnkgbWFwcGVkCiAJICogYW5kIHNoYXJlZC4KQEAgLTE5MjIsNyArMTkyMiw3IEBACiAJICogcG9zaXhfbG9ja19maWxlKCkuICBBbm90aGVyIHByb2Nlc3MgY291bGQgYmUgc2V0dGluZyBhIGxvY2sgb24gdGhpcwogCSAqIGZpbGUgYXQgdGhlIHNhbWUgdGltZSwgYnV0IHdlIHdvdWxkbid0IHJlbW92ZSB0aGF0IGxvY2sgYW55d2F5LgogCSAqLwotCWlmICghZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfZmxvY2spCisJaWYgKCFmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2Zsb2NrKQogCQlyZXR1cm47CiAKIAlsb2NrLmZsX3R5cGUgPSBGX1VOTENLOwpAQCAtMTk1MSw3ICsxOTUxLDcgQEAKICAqLwogdm9pZCBsb2Nrc19yZW1vdmVfZmxvY2soc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsgCisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBmaWxlX2xvY2sgKmZsOwogCXN0cnVjdCBmaWxlX2xvY2sgKipiZWZvcmU7CiAKQEAgLTIwMjAsNyArMjAyMCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAKIAlpZiAoZmwtPmZsX2ZpbGUgIT0gTlVMTCkKLQkJaW5vZGUgPSBmbC0+ZmxfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCWlub2RlID0gZmwtPmZsX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAlvdXQgKz0gc3ByaW50ZihvdXQsICIlZDolcyAiLCBpZCwgcGZ4KTsKIAlpZiAoSVNfUE9TSVgoZmwpKSB7CmRpZmYgLS1naXQgYS9mcy9tYmNhY2hlLmMgYi9mcy9tYmNhY2hlLmMKaW5kZXggMGZmNzEyNS4uZGVlYjlkYyAxMDA2NDQKLS0tIGEvZnMvbWJjYWNoZS5jCisrKyBiL2ZzL21iY2FjaGUuYwpAQCAtODUsNyArODUsNyBAQAogI2lmbmRlZiBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UCiAJaW50CQkJCWNfaW5kZXhlc19jb3VudDsKICNlbmRpZgotCWttZW1fY2FjaGVfdAkJCSpjX2VudHJ5X2NhY2hlOworCXN0cnVjdCBrbWVtX2NhY2hlCQkJKmNfZW50cnlfY2FjaGU7CiAJc3RydWN0IGxpc3RfaGVhZAkJKmNfYmxvY2tfaGFzaDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkqY19pbmRleGVzX2hhc2hbMF07CiB9OwpkaWZmIC0tZ2l0IGEvZnMvbWluaXgvZGlyLmMgYi9mcy9taW5peC9kaXIuYwppbmRleCAyYjBhMzg5Li5hYjc4MmM0IDEwMDY0NAotLS0gYS9mcy9taW5peC9kaXIuYworKysgYi9mcy9taW5peC9kaXIuYwpAQCAtODIsNyArODIsNyBAQAogc3RhdGljIGludCBtaW5peF9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3MgPSBmaWxwLT5mX3BvczsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCXVuc2lnbmVkIG9mZnNldCA9IHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJdW5zaWduZWQgbG9uZyBuID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CmRpZmYgLS1naXQgYS9mcy9taW5peC9pbm9kZS5jIGIvZnMvbWluaXgvaW5vZGUuYwppbmRleCAxZTM2YmFlLi42MjllMDliIDEwMDY0NAotLS0gYS9mcy9taW5peC9pbm9kZS5jCisrKyBiL2ZzL21pbml4L2lub2RlLmMKQEAgLTUxLDEyICs1MSwxMiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIG1pbml4X2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIG1pbml4X2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqbWluaXhfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IG1pbml4X2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKG1pbml4X2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVpID0gKHN0cnVjdCBtaW5peF9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhtaW5peF9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAmZWktPnZmc19pbm9kZTsKQEAgLTY3LDcgKzY3LDcgQEAKIAlrbWVtX2NhY2hlX2ZyZWUobWluaXhfaW5vZGVfY2FjaGVwLCBtaW5peF9pKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IG1pbml4X2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBtaW5peF9pbm9kZV9pbmZvICopIGZvbzsKIApkaWZmIC0tZ2l0IGEvZnMvbXNkb3MvbmFtZWkuYyBiL2ZzL21zZG9zL25hbWVpLmMKaW5kZXggYjBmMDFiMy4uNDUyNDYxOSAxMDA2NDQKLS0tIGEvZnMvbXNkb3MvbmFtZWkuYworKysgYi9mcy9tc2Rvcy9uYW1laS5jCkBAIC02NTQsNiArNjU0LDcgQEAKIAkucm1kaXIJCT0gbXNkb3Nfcm1kaXIsCiAJLnJlbmFtZQkJPSBtc2Rvc19yZW5hbWUsCiAJLnNldGF0dHIJPSBmYXRfbm90aWZ5X2NoYW5nZSwKKwkuZ2V0YXR0cgk9IGZhdF9nZXRhdHRyLAogfTsKIAogc3RhdGljIGludCBtc2Rvc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCAyOGQ0OWIzLi5lNGYxMDhmIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTI0OSw5ICsyNDksMTEgQEAKIAogCS8qCiAJICogTUFZX0VYRUMgb24gcmVndWxhciBmaWxlcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nOiBXZSBvdmVycmlkZQotCSAqIGZpbGVzeXN0ZW0gZXhlY3V0ZSBwZXJtaXNzaW9ucyBpZiB0aGUgbW9kZSBiaXRzIGFyZW4ndCBzZXQuCisJICogZmlsZXN5c3RlbSBleGVjdXRlIHBlcm1pc3Npb25zIGlmIHRoZSBtb2RlIGJpdHMgYXJlbid0IHNldCBvcgorCSAqIHRoZSBmcyBpcyBtb3VudGVkIHdpdGggdGhlICJub2V4ZWMiIGZsYWcuCiAJICovCi0JaWYgKChtYXNrICYgTUFZX0VYRUMpICYmIFNfSVNSRUcobW9kZSkgJiYgIShtb2RlICYgU19JWFVHTykpCisJaWYgKChtYXNrICYgTUFZX0VYRUMpICYmIFNfSVNSRUcobW9kZSkgJiYgKCEobW9kZSAmIFNfSVhVR08pIHx8CisJCQkobmQgJiYgbmQtPm1udCAmJiAobmQtPm1udC0+bW50X2ZsYWdzICYgTU5UX05PRVhFQykpKSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKIAkvKiBPcmRpbmFyeSBwZXJtaXNzaW9uIHJvdXRpbmVzIGRvIG5vdCB1bmRlcnN0YW5kIE1BWV9BUFBFTkQuICovCkBAIC0yOTUsNyArMjk3LDcgQEAKICAqLwogaW50IGZpbGVfcGVybWlzc2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1hc2spCiB7Ci0JcmV0dXJuIHBlcm1pc3Npb24oZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIG1hc2ssIE5VTEwpOworCXJldHVybiBwZXJtaXNzaW9uKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIG1hc2ssIE5VTEwpOwogfQogCiAvKgpAQCAtMzMxLDcgKzMzMyw3IEBACiAKIGludCBkZW55X3dyaXRlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqIGZpbGUpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMCkgewpAQCAtMzY2LDcgKzM2OCw3IEBACiAgKi8KIHZvaWQgcmVsZWFzZV9vcGVuX2ludGVudChzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlpZiAobmQtPmludGVudC5vcGVuLmZpbGUtPmZfZGVudHJ5ID09IE5VTEwpCisJaWYgKG5kLT5pbnRlbnQub3Blbi5maWxlLT5mX3BhdGguZGVudHJ5ID09IE5VTEwpCiAJCXB1dF9maWxwKG5kLT5pbnRlbnQub3Blbi5maWxlKTsKIAllbHNlCiAJCWZwdXQobmQtPmludGVudC5vcGVuLmZpbGUpOwpAQCAtNTcwLDExICs1NzIsNiBAQAogCXJldHVybiBQVFJfRVJSKGxpbmspOwogfQogCi1zdHJ1Y3QgcGF0aCB7Ci0Jc3RydWN0IHZmc21vdW50ICptbnQ7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotfTsKLQogc3RhdGljIGlubGluZSB2b2lkIGRwdXRfcGF0aChzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJZHB1dChwYXRoLT5kZW50cnkpOwpAQCAtMTE0MSw3ICsxMTM4LDcgQEAKIAkJaWYgKCFmaWxlKQogCQkJZ290byBvdXRfZmFpbDsKIAotCQlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwkJZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAogCQlyZXR2YWwgPSAtRU5PVERJUjsKIAkJaWYgKCFTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKQEAgLTExNTEsNyArMTE0OCw3IEBACiAJCWlmIChyZXR2YWwpCiAJCQlnb3RvIGZwdXRfZmFpbDsKIAotCQluZC0+bW50ID0gbW50Z2V0KGZpbGUtPmZfdmZzbW50KTsKKwkJbmQtPm1udCA9IG1udGdldChmaWxlLT5mX3BhdGgubW50KTsKIAkJbmQtPmRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKIAogCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKQEAgLTE5OTYsOCArMTk5Myw3IEBACiB2b2lkIGRlbnRyeV91bmhhc2goc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWRnZXQoZGVudHJ5KTsKLQlpZiAoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpCi0JCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoZGVudHJ5KTsKIAlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKIAlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAlpZiAoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkgPT0gMikKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggNTU0NDJhNi4uNWVmMzM2YyAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgpAQCAtMzYsNyArMzYsNyBAQAogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqbW91bnRfaGFzaHRhYmxlIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgaW50IGhhc2hfbWFzayBfX3JlYWRfbW9zdGx5LCBoYXNoX2JpdHMgX19yZWFkX21vc3RseTsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKm1udF9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptbnRfY2FjaGUgX19yZWFkX21vc3RseTsKIHN0YXRpYyBzdHJ1Y3Qgcndfc2VtYXBob3JlIG5hbWVzcGFjZV9zZW07CiAKIC8qIC9zeXMvZnMgKi8KQEAgLTEzMywxMCArMTMzLDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX21udChzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gbW50LT5tbnRfbmFtZXNwYWNlID09IGN1cnJlbnQtPm5zcHJveHktPm5hbWVzcGFjZTsKKwlyZXR1cm4gbW50LT5tbnRfbnMgPT0gY3VycmVudC0+bnNwcm94eS0+bW50X25zOwogfQogCi1zdGF0aWMgdm9pZCB0b3VjaF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbnMpCitzdGF0aWMgdm9pZCB0b3VjaF9tbnRfbmFtZXNwYWNlKHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucykKIHsKIAlpZiAobnMpIHsKIAkJbnMtPmV2ZW50ID0gKytldmVudDsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX190b3VjaF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbnMpCitzdGF0aWMgdm9pZCBfX3RvdWNoX21udF9uYW1lc3BhY2Uoc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zKQogewogCWlmIChucyAmJiBucy0+ZXZlbnQgIT0gZXZlbnQpIHsKIAkJbnMtPmV2ZW50ID0gZXZlbnQ7CkBAIC0xODcsMTkgKzE4NywxOSBAQAogCXN0cnVjdCB2ZnNtb3VudCAqcGFyZW50ID0gbW50LT5tbnRfcGFyZW50OwogCXN0cnVjdCB2ZnNtb3VudCAqbTsKIAlMSVNUX0hFQUQoaGVhZCk7Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbiA9IHBhcmVudC0+bW50X25hbWVzcGFjZTsKKwlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbiA9IHBhcmVudC0+bW50X25zOwogCiAJQlVHX09OKHBhcmVudCA9PSBtbnQpOwogCiAJbGlzdF9hZGRfdGFpbCgmaGVhZCwgJm1udC0+bW50X2xpc3QpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJmhlYWQsIG1udF9saXN0KQotCQltLT5tbnRfbmFtZXNwYWNlID0gbjsKKwkJbS0+bW50X25zID0gbjsKIAlsaXN0X3NwbGljZSgmaGVhZCwgbi0+bGlzdC5wcmV2KTsKIAogCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2hhc2gsIG1vdW50X2hhc2h0YWJsZSArCiAJCQkJaGFzaChwYXJlbnQsIG1udC0+bW50X21vdW50cG9pbnQpKTsKIAlsaXN0X2FkZF90YWlsKCZtbnQtPm1udF9jaGlsZCwgJnBhcmVudC0+bW50X21vdW50cyk7Ci0JdG91Y2hfbmFtZXNwYWNlKG4pOworCXRvdWNoX21udF9uYW1lc3BhY2Uobik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKm5leHRfbW50KHN0cnVjdCB2ZnNtb3VudCAqcCwgc3RydWN0IHZmc21vdW50ICpyb290KQpAQCAtMzIwLDcgKzMyMCw3IEBACiAvKiBpdGVyYXRvciAqLwogc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbmFtZXNwYWNlICpuID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlsb2ZmX3QgbCA9ICpwb3M7CiAKQEAgLTMzMyw3ICszMzMsNyBAQAogCiBzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm4gPSBtLT5wcml2YXRlOwogCXN0cnVjdCBsaXN0X2hlYWQgKnAgPSAoKHN0cnVjdCB2ZnNtb3VudCAqKXYpLT5tbnRfbGlzdC5uZXh0OwogCSgqcG9zKSsrOwogCXJldHVybiBwID09ICZuLT5saXN0ID8gTlVMTCA6IGxpc3RfZW50cnkocCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CkBAIC0zNjgsNiArMzY4LDcgQEAKIAkJeyBNTlRfTk9FWEVDLCAiLG5vZXhlYyIgfSwKIAkJeyBNTlRfTk9BVElNRSwgIixub2F0aW1lIiB9LAogCQl7IE1OVF9OT0RJUkFUSU1FLCAiLG5vZGlyYXRpbWUiIH0sCisJCXsgTU5UX1JFTEFUSU1FLCAiLHJlbGF0aW1lIiB9LAogCQl7IDAsIE5VTEwgfQogCX07CiAJc3RydWN0IHByb2NfZnNfaW5mbyAqZnNfaW5mb3A7CkBAIC01MjYsOCArNTI3LDggQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGtpbGwsIG1udF9oYXNoKSB7CiAJCWxpc3RfZGVsX2luaXQoJnAtPm1udF9leHBpcmUpOwogCQlsaXN0X2RlbF9pbml0KCZwLT5tbnRfbGlzdCk7Ci0JCV9fdG91Y2hfbmFtZXNwYWNlKHAtPm1udF9uYW1lc3BhY2UpOwotCQlwLT5tbnRfbmFtZXNwYWNlID0gTlVMTDsKKwkJX190b3VjaF9tbnRfbmFtZXNwYWNlKHAtPm1udF9ucyk7CisJCXAtPm1udF9ucyA9IE5VTEw7CiAJCWxpc3RfZGVsX2luaXQoJnAtPm1udF9jaGlsZCk7CiAJCWlmIChwLT5tbnRfcGFyZW50ICE9IHApCiAJCQlwLT5tbnRfbW91bnRwb2ludC0+ZF9tb3VudGVkLS07CkBAIC04MzAsNyArODMxLDcgQEAKIAlpZiAocGFyZW50X25kKSB7CiAJCWRldGFjaF9tbnQoc291cmNlX21udCwgcGFyZW50X25kKTsKIAkJYXR0YWNoX21udChzb3VyY2VfbW50LCBuZCk7Ci0JCXRvdWNoX25hbWVzcGFjZShjdXJyZW50LT5uc3Byb3h5LT5uYW1lc3BhY2UpOworCQl0b3VjaF9tbnRfbmFtZXNwYWNlKGN1cnJlbnQtPm5zcHJveHktPm1udF9ucyk7CiAJfSBlbHNlIHsKIAkJbW50X3NldF9tb3VudHBvaW50KGRlc3RfbW50LCBkZXN0X2RlbnRyeSwgc291cmNlX21udCk7CiAJCWNvbW1pdF90cmVlKHNvdXJjZV9tbnQpOwpAQCAtMTE0NSw5ICsxMTQ2LDkgQEAKIAkgKi8KIAlpZiAoIXByb3BhZ2F0ZV9tb3VudF9idXN5KG1udCwgMikpIHsKIAkJLyogZGVsZXRlIGZyb20gdGhlIG5hbWVzcGFjZSAqLwotCQl0b3VjaF9uYW1lc3BhY2UobW50LT5tbnRfbmFtZXNwYWNlKTsKKwkJdG91Y2hfbW50X25hbWVzcGFjZShtbnQtPm1udF9ucyk7CiAJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOwotCQltbnQtPm1udF9uYW1lc3BhY2UgPSBOVUxMOworCQltbnQtPm1udF9ucyA9IE5VTEw7CiAJCXVtb3VudF90cmVlKG1udCwgMSwgdW1vdW50cyk7CiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAl9IGVsc2UgewpAQCAtMTE2OCw3ICsxMTY5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZXhwaXJlX21vdW50X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqZ3JhdmV5YXJkLCBzdHJ1Y3QgbGlzdF9oZWFkICptb3VudHMpCiB7Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlOworCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuczsKIAlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKIAogCXdoaWxlICghbGlzdF9lbXB0eShncmF2ZXlhcmQpKSB7CkBAIC0xMTc4LDEwICsxMTc5LDEwIEBACiAKIAkJLyogZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIG5hbWVzcGFjZSBpcyBkZWFkIC0gYWxsIHRoZQogCQkgKiB2ZnNtb3VudHMgZnJvbSBpdCBhcmUgZ29pbmcgYXdheSBhbnl3YXkgKi8KLQkJbmFtZXNwYWNlID0gbW50LT5tbnRfbmFtZXNwYWNlOwotCQlpZiAoIW5hbWVzcGFjZSB8fCAhbmFtZXNwYWNlLT5yb290KQorCQlucyA9IG1udC0+bW50X25zOworCQlpZiAoIW5zIHx8ICFucy0+cm9vdCkKIAkJCWNvbnRpbnVlOwotCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisJCWdldF9tbnRfbnMobnMpOwogCiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAkJZG93bl93cml0ZSgmbmFtZXNwYWNlX3NlbSk7CkBAIC0xMTg5LDcgKzExOTAsNyBAQAogCQl1cF93cml0ZSgmbmFtZXNwYWNlX3NlbSk7CiAJCXJlbGVhc2VfbW91bnRzKCZ1bW91bnRzKTsKIAkJbW50cHV0KG1udCk7Ci0JCXB1dF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKKwkJcHV0X21udF9ucyhucyk7CiAJCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CiAJfQogfQpAQCAtMTQwNSw5ICsxNDA2LDExIEBACiAJCW1udF9mbGFncyB8PSBNTlRfTk9BVElNRTsKIAlpZiAoZmxhZ3MgJiBNU19OT0RJUkFUSU1FKQogCQltbnRfZmxhZ3MgfD0gTU5UX05PRElSQVRJTUU7CisJaWYgKGZsYWdzICYgTVNfUkVMQVRJTUUpCisJCW1udF9mbGFncyB8PSBNTlRfUkVMQVRJTUU7CiAKIAlmbGFncyAmPSB+KE1TX05PU1VJRCB8IE1TX05PRVhFQyB8IE1TX05PREVWIHwgTVNfQUNUSVZFIHwKLQkJICAgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUUpOworCQkgICBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRSB8IE1TX1JFTEFUSU1FKTsKIAogCS8qIC4uLiBhbmQgZ2V0IHRoZSBtb3VudHBvaW50ICovCiAJcmV0dmFsID0gcGF0aF9sb29rdXAoZGlyX25hbWUsIExPT0tVUF9GT0xMT1csICZuZCk7CkBAIC0xNDM5LDE0ICsxNDQyLDE1IEBACiAgKiBBbGxvY2F0ZSBhIG5ldyBuYW1lc3BhY2Ugc3RydWN0dXJlIGFuZCBwb3B1bGF0ZSBpdCB3aXRoIGNvbnRlbnRzCiAgKiBjb3BpZWQgZnJvbSB0aGUgbmFtZXNwYWNlIG9mIHRoZSBwYXNzZWQgaW4gdGFzayBzdHJ1Y3R1cmUuCiAgKi8KLXN0cnVjdCBuYW1lc3BhY2UgKmR1cF9uYW1lc3BhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBmc19zdHJ1Y3QgKmZzKQorc3RydWN0IG1udF9uYW1lc3BhY2UgKmR1cF9tbnRfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCXN0cnVjdCBmc19zdHJ1Y3QgKmZzKQogewotCXN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZSA9IHRzay0+bnNwcm94eS0+bmFtZXNwYWNlOwotCXN0cnVjdCBuYW1lc3BhY2UgKm5ld19uczsKKwlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbW50X25zID0gdHNrLT5uc3Byb3h5LT5tbnRfbnM7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5ld19uczsKIAlzdHJ1Y3QgdmZzbW91bnQgKnJvb3RtbnQgPSBOVUxMLCAqcHdkbW50ID0gTlVMTCwgKmFsdHJvb3RtbnQgPSBOVUxMOwogCXN0cnVjdCB2ZnNtb3VudCAqcCwgKnE7CiAKLQluZXdfbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmFtZXNwYWNlKSwgR0ZQX0tFUk5FTCk7CisJbmV3X25zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1udF9uYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19ucykKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE0NTcsNyArMTQ2MSw3IEBACiAKIAlkb3duX3dyaXRlKCZuYW1lc3BhY2Vfc2VtKTsKIAkvKiBGaXJzdCBwYXNzOiBjb3B5IHRoZSB0cmVlIHRvcG9sb2d5ICovCi0JbmV3X25zLT5yb290ID0gY29weV90cmVlKG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCwKKwluZXdfbnMtPnJvb3QgPSBjb3B5X3RyZWUobW50X25zLT5yb290LCBtbnRfbnMtPnJvb3QtPm1udF9yb290LAogCQkJCQlDTF9DT1BZX0FMTCB8IENMX0VYUElSRSk7CiAJaWYgKCFuZXdfbnMtPnJvb3QpIHsKIAkJdXBfd3JpdGUoJm5hbWVzcGFjZV9zZW0pOwpAQCAtMTQ3MywxMCArMTQ3NywxMCBAQAogCSAqIGFzIGJlbG9uZ2luZyB0byBuZXcgbmFtZXNwYWNlLiAgV2UgaGF2ZSBhbHJlYWR5IGFjcXVpcmVkIGEgcHJpdmF0ZQogCSAqIGZzX3N0cnVjdCwgc28gdHNrLT5mcy0+bG9jayBpcyBub3QgbmVlZGVkLgogCSAqLwotCXAgPSBuYW1lc3BhY2UtPnJvb3Q7CisJcCA9IG1udF9ucy0+cm9vdDsKIAlxID0gbmV3X25zLT5yb290OwogCXdoaWxlIChwKSB7Ci0JCXEtPm1udF9uYW1lc3BhY2UgPSBuZXdfbnM7CisJCXEtPm1udF9ucyA9IG5ld19uczsKIAkJaWYgKGZzKSB7CiAJCQlpZiAocCA9PSBmcy0+cm9vdG1udCkgewogCQkJCXJvb3RtbnQgPSBwOwpAQCAtMTQ5MSw3ICsxNDk1LDcgQEAKIAkJCQlmcy0+YWx0cm9vdG1udCA9IG1udGdldChxKTsKIAkJCX0KIAkJfQotCQlwID0gbmV4dF9tbnQocCwgbmFtZXNwYWNlLT5yb290KTsKKwkJcCA9IG5leHRfbW50KHAsIG1udF9ucy0+cm9vdCk7CiAJCXEgPSBuZXh0X21udChxLCBuZXdfbnMtPnJvb3QpOwogCX0KIAl1cF93cml0ZSgmbmFtZXNwYWNlX3NlbSk7CkBAIC0xNTA2LDE2ICsxNTEwLDE2IEBACiAJcmV0dXJuIG5ld19uczsKIH0KIAotaW50IGNvcHlfbmFtZXNwYWNlKGludCBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitpbnQgY29weV9tbnRfbnMoaW50IGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2UgPSB0c2stPm5zcHJveHktPm5hbWVzcGFjZTsKLQlzdHJ1Y3QgbmFtZXNwYWNlICpuZXdfbnM7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zID0gdHNrLT5uc3Byb3h5LT5tbnRfbnM7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5ld19uczsKIAlpbnQgZXJyID0gMDsKIAotCWlmICghbmFtZXNwYWNlKQorCWlmICghbnMpCiAJCXJldHVybiAwOwogCi0JZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCWdldF9tbnRfbnMobnMpOwogCiAJaWYgKCEoZmxhZ3MgJiBDTE9ORV9ORVdOUykpCiAJCXJldHVybiAwOwpAQCAtMTUyNSwxNiArMTUyOSwxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQluZXdfbnMgPSBkdXBfbmFtZXNwYWNlKHRzaywgdHNrLT5mcyk7CisJbmV3X25zID0gZHVwX21udF9ucyh0c2ssIHRzay0+ZnMpOwogCWlmICghbmV3X25zKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAotCXRzay0+bnNwcm94eS0+bmFtZXNwYWNlID0gbmV3X25zOworCXRzay0+bnNwcm94eS0+bW50X25zID0gbmV3X25zOwogCiBvdXQ6Ci0JcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCXB1dF9tbnRfbnMobnMpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3NTQsNyArMTc1OCw3IEBACiAJZGV0YWNoX21udCh1c2VyX25kLm1udCwgJnJvb3RfcGFyZW50KTsKIAlhdHRhY2hfbW50KHVzZXJfbmQubW50LCAmb2xkX25kKTsgICAgIC8qIG1vdW50IG9sZCByb290IG9uIHB1dF9vbGQgKi8KIAlhdHRhY2hfbW50KG5ld19uZC5tbnQsICZyb290X3BhcmVudCk7IC8qIG1vdW50IG5ld19yb290IG9uIC8gKi8KLQl0b3VjaF9uYW1lc3BhY2UoY3VycmVudC0+bnNwcm94eS0+bmFtZXNwYWNlKTsKKwl0b3VjaF9tbnRfbmFtZXNwYWNlKGN1cnJlbnQtPm5zcHJveHktPm1udF9ucyk7CiAJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCWNocm9vdF9mc19yZWZzKCZ1c2VyX25kLCAmbmV3X25kKTsKIAlzZWN1cml0eV9zYl9wb3N0X3Bpdm90cm9vdCgmdXNlcl9uZCwgJm5ld19uZCk7CkBAIC0xNzc5LDI3ICsxNzgzLDI3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9tb3VudF90cmVlKHZvaWQpCiB7CiAJc3RydWN0IHZmc21vdW50ICptbnQ7Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlOworCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuczsKIAogCW1udCA9IGRvX2tlcm5fbW91bnQoInJvb3RmcyIsIDAsICJyb290ZnMiLCBOVUxMKTsKIAlpZiAoSVNfRVJSKG1udCkpCiAJCXBhbmljKCJDYW4ndCBjcmVhdGUgcm9vdGZzIik7Ci0JbmFtZXNwYWNlID0ga21hbGxvYyhzaXplb2YoKm5hbWVzcGFjZSksIEdGUF9LRVJORUwpOwotCWlmICghbmFtZXNwYWNlKQorCW5zID0ga21hbGxvYyhzaXplb2YoKm5zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFucykKIAkJcGFuaWMoIkNhbid0IGFsbG9jYXRlIGluaXRpYWwgbmFtZXNwYWNlIik7Ci0JYXRvbWljX3NldCgmbmFtZXNwYWNlLT5jb3VudCwgMSk7Ci0JSU5JVF9MSVNUX0hFQUQoJm5hbWVzcGFjZS0+bGlzdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbmFtZXNwYWNlLT5wb2xsKTsKLQluYW1lc3BhY2UtPmV2ZW50ID0gMDsKLQlsaXN0X2FkZCgmbW50LT5tbnRfbGlzdCwgJm5hbWVzcGFjZS0+bGlzdCk7Ci0JbmFtZXNwYWNlLT5yb290ID0gbW50OwotCW1udC0+bW50X25hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKwlhdG9taWNfc2V0KCZucy0+Y291bnQsIDEpOworCUlOSVRfTElTVF9IRUFEKCZucy0+bGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbnMtPnBvbGwpOworCW5zLT5ldmVudCA9IDA7CisJbGlzdF9hZGQoJm1udC0+bW50X2xpc3QsICZucy0+bGlzdCk7CisJbnMtPnJvb3QgPSBtbnQ7CisJbW50LT5tbnRfbnMgPSBuczsKIAotCWluaXRfdGFzay5uc3Byb3h5LT5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCWluaXRfdGFzay5uc3Byb3h5LT5tbnRfbnMgPSBuczsKKwlnZXRfbW50X25zKG5zKTsKIAotCXNldF9mc19wd2QoY3VycmVudC0+ZnMsIG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCk7Ci0Jc2V0X2ZzX3Jvb3QoY3VycmVudC0+ZnMsIG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCk7CisJc2V0X2ZzX3B3ZChjdXJyZW50LT5mcywgbnMtPnJvb3QsIG5zLT5yb290LT5tbnRfcm9vdCk7CisJc2V0X2ZzX3Jvb3QoY3VycmVudC0+ZnMsIG5zLT5yb290LCBucy0+cm9vdC0+bW50X3Jvb3QpOwogfQogCiB2b2lkIF9faW5pdCBtbnRfaW5pdCh1bnNpZ25lZCBsb25nIG1lbXBhZ2VzKQpAQCAtMTg2MCwxMSArMTg2NCwxMSBAQAogCWluaXRfbW91bnRfdHJlZSgpOwogfQogCi12b2lkIF9fcHV0X25hbWVzcGFjZShzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2UpCit2b2lkIF9fcHV0X21udF9ucyhzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMpCiB7Ci0Jc3RydWN0IHZmc21vdW50ICpyb290ID0gbmFtZXNwYWNlLT5yb290OworCXN0cnVjdCB2ZnNtb3VudCAqcm9vdCA9IG5zLT5yb290OwogCUxJU1RfSEVBRCh1bW91bnRfbGlzdCk7Ci0JbmFtZXNwYWNlLT5yb290ID0gTlVMTDsKKwlucy0+cm9vdCA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCWRvd25fd3JpdGUoJm5hbWVzcGFjZV9zZW0pOwogCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CkBAIC0xODcyLDUgKzE4NzYsNSBAQAogCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAl1cF93cml0ZSgmbmFtZXNwYWNlX3NlbSk7CiAJcmVsZWFzZV9tb3VudHMoJnVtb3VudF9saXN0KTsKLQlrZnJlZShuYW1lc3BhY2UpOworCWtmcmVlKG5zKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2Rpci5jIGIvZnMvbmNwZnMvZGlyLmMKaW5kZXggNDU4YjNiNy4uNzM3NDc3NyAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZGlyLmMKKysrIGIvZnMvbmNwZnMvZGlyLmMKQEAgLTQwMiw3ICs0MDIsNyBAQAogCiBzdGF0aWMgaW50IG5jcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoaW5vZGUpOwpAQCAtNTU0LDcgKzU1NCw3IEBACiBuY3BfZmlsbF9jYWNoZShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpciwKIAkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICpjdHJsLCBzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gKmVudHJ5KQogewotCXN0cnVjdCBkZW50cnkgKm5ld2RlbnQsICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpuZXdkZW50LCAqZGVudHJ5ID0gZmlscC0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKm5ld2lubywgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuY3BfY2FjaGVfY29udHJvbCBjdGwgPSAqY3RybDsKIAlzdHJ1Y3QgcXN0ciBxbmFtZTsKQEAgLTY0OSw3ICs2NDksNyBAQAogbmNwX3JlYWRfdm9sdW1lX2xpc3Qoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCiAJCQlzdHJ1Y3QgbmNwX2NhY2hlX2NvbnRyb2wgKmN0bCkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoaW5vZGUpOwogCXN0cnVjdCBuY3Bfdm9sdW1lX2luZm8gaW5mbzsKQEAgLTY4NSw3ICs2ODUsNyBAQAogbmNwX2RvX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCiAJCQkJCQlzdHJ1Y3QgbmNwX2NhY2hlX2NvbnRyb2wgKmN0bCkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKGRpcik7CiAJc3RydWN0IG53X3NlYXJjaF9zZXF1ZW5jZSBzZXE7CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9maWxlLmMgYi9mcy9uY3Bmcy9maWxlLmMKaW5kZXggZGYzNzUyNC4uYjkxZmVhMCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZmlsZS5jCisrKyBiL2ZzL25jcGZzL2ZpbGUuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiBzdGF0aWMgc3NpemVfdAogbmNwX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXNpemVfdCBhbHJlYWR5X3JlYWQgPSAwOwogCW9mZl90IHBvczsKQEAgLTE4Miw3ICsxODIsNyBAQAogc3RhdGljIHNzaXplX3QKIG5jcF9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc2l6ZV90IGFscmVhZHlfd3JpdHRlbiA9IDA7CiAJb2ZmX3QgcG9zOwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW5vZGUuYyBiL2ZzL25jcGZzL2lub2RlLmMKaW5kZXggNDJlM2JlZi4uNjdhOTBiZiAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW5vZGUuYworKysgYi9mcy9uY3Bmcy9pbm9kZS5jCkBAIC00MCwxMiArNDAsMTIgQEAKIHN0YXRpYyB2b2lkIG5jcF9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogc3RhdGljIGludCAgbmNwX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICogbmNwX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIG5jcF9pbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKm5jcF9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBuY3BfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IG5jcF9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhuY3BfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZWkgPSAoc3RydWN0IG5jcF9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhuY3BfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7CkBAIC01Niw3ICs1Niw3IEBACiAJa21lbV9jYWNoZV9mcmVlKG5jcF9pbm9kZV9jYWNoZXAsIE5DUF9GSU5GTyhpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBuY3BfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IG5jcF9pbm9kZV9pbmZvICopIGZvbzsKIApAQCAtMzI3LDExICszMjcsMTIgQEAKIAljaGFyICpvcHRhcmc7CiAJdW5zaWduZWQgbG9uZyBvcHRpbnQ7CiAJaW50IHZlcnNpb24gPSAwOworCWludCByZXQ7CiAKIAlkYXRhLT5mbGFncyA9IDA7CiAJZGF0YS0+aW50X2ZsYWdzID0gMDsKIAlkYXRhLT5tb3VudGVkX3VpZCA9IDA7Ci0JZGF0YS0+d2RvZ19waWQgPSAtMTsKKwlkYXRhLT53ZG9nX3BpZCA9IE5VTEw7CiAJZGF0YS0+bmNwX2ZkID0gfjA7CiAJZGF0YS0+dGltZV9vdXQgPSAxMDsKIAlkYXRhLT5yZXRyeV9jb3VudCA9IDIwOwpAQCAtMzQzLDggKzM0NCw5IEBACiAJZGF0YS0+bW91bnRlZF92b2xbMF0gPSAwOwogCQogCXdoaWxlICgob3B0dmFsID0gbmNwX2dldG9wdCgibmNwZnMiLCAmb3B0aW9ucywgbmNwX29wdHMsIE5VTEwsICZvcHRhcmcsICZvcHRpbnQpKSAhPSAwKSB7Ci0JCWlmIChvcHR2YWwgPCAwKQotCQkJcmV0dXJuIG9wdHZhbDsKKwkJcmV0ID0gb3B0dmFsOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOwogCQlzd2l0Y2ggKG9wdHZhbCkgewogCQkJY2FzZSAndSc6CiAJCQkJZGF0YS0+dWlkID0gb3B0aW50OwpAQCAtMzcxLDcgKzM3Myw3IEBACiAJCQkJZGF0YS0+ZmxhZ3MgPSBvcHRpbnQ7CiAJCQkJYnJlYWs7CiAJCQljYXNlICd3JzoKLQkJCQlkYXRhLT53ZG9nX3BpZCA9IG9wdGludDsKKwkJCQlkYXRhLT53ZG9nX3BpZCA9IGZpbmRfZ2V0X3BpZChvcHRpbnQpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAnbic6CiAJCQkJZGF0YS0+bmNwX2ZkID0gb3B0aW50OwpAQCAtMzgwLDE4ICszODIsMjEgQEAKIAkJCQlkYXRhLT5pbmZvX2ZkID0gb3B0aW50OwogCQkJCWJyZWFrOwogCQkJY2FzZSAndic6Ci0JCQkJaWYgKG9wdGludCA8IE5DUF9NT1VOVF9WRVJTSU9OX1Y0KSB7Ci0JCQkJCXJldHVybiAtRUNIUk5HOwotCQkJCX0KLQkJCQlpZiAob3B0aW50ID4gTkNQX01PVU5UX1ZFUlNJT05fVjUpIHsKLQkJCQkJcmV0dXJuIC1FQ0hSTkc7Ci0JCQkJfQorCQkJCXJldCA9IC1FQ0hSTkc7CisJCQkJaWYgKG9wdGludCA8IE5DUF9NT1VOVF9WRVJTSU9OX1Y0KQorCQkJCQlnb3RvIGVycjsKKwkJCQlpZiAob3B0aW50ID4gTkNQX01PVU5UX1ZFUlNJT05fVjUpCisJCQkJCWdvdG8gZXJyOwogCQkJCXZlcnNpb24gPSBvcHRpbnQ7CiAJCQkJYnJlYWs7CiAJCQkKIAkJfQogCX0KIAlyZXR1cm4gMDsKK2VycjoKKwlwdXRfcGlkKGRhdGEtPndkb2dfcGlkKTsKKwlkYXRhLT53ZG9nX3BpZCA9IE5VTEw7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBuY3BfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpyYXdfZGF0YSwgaW50IHNpbGVudCkKQEAgLTQwOSw2ICs0MTQsNyBAQAogI2VuZGlmCiAJc3RydWN0IG5jcF9lbnRyeV9pbmZvIGZpbmZvOwogCisJZGF0YS53ZG9nX3BpZCA9IE5VTEw7CiAJc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5jcF9zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNlcnZlcikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00MjUsNyArNDMxLDcgQEAKIAkJCQlkYXRhLmZsYWdzID0gbWQtPmZsYWdzOwogCQkJCWRhdGEuaW50X2ZsYWdzID0gTkNQX0lNT1VOVF9MT0dHRURJTl9QT1NTSUJMRTsKIAkJCQlkYXRhLm1vdW50ZWRfdWlkID0gbWQtPm1vdW50ZWRfdWlkOwotCQkJCWRhdGEud2RvZ19waWQgPSBtZC0+d2RvZ19waWQ7CisJCQkJZGF0YS53ZG9nX3BpZCA9IGZpbmRfZ2V0X3BpZChtZC0+d2RvZ19waWQpOwogCQkJCWRhdGEubmNwX2ZkID0gbWQtPm5jcF9mZDsKIAkJCQlkYXRhLnRpbWVfb3V0ID0gbWQtPnRpbWVfb3V0OwogCQkJCWRhdGEucmV0cnlfY291bnQgPSBtZC0+cmV0cnlfY291bnQ7CkBAIC00NDUsNyArNDUxLDcgQEAKIAkJCQlkYXRhLmZsYWdzID0gbWQtPmZsYWdzOwogCQkJCWRhdGEuaW50X2ZsYWdzID0gMDsKIAkJCQlkYXRhLm1vdW50ZWRfdWlkID0gbWQtPm1vdW50ZWRfdWlkOwotCQkJCWRhdGEud2RvZ19waWQgPSBtZC0+d2RvZ19waWQ7CisJCQkJZGF0YS53ZG9nX3BpZCA9IGZpbmRfZ2V0X3BpZChtZC0+d2RvZ19waWQpOwogCQkJCWRhdGEubmNwX2ZkID0gbWQtPm5jcF9mZDsKIAkJCQlkYXRhLnRpbWVfb3V0ID0gbWQtPnRpbWVfb3V0OwogCQkJCWRhdGEucmV0cnlfY291bnQgPSBtZC0+cmV0cnlfY291bnQ7CkBAIC00NzEsNyArNDc3LDcgQEAKIAlpZiAoIW5jcF9maWxwKQogCQlnb3RvIG91dDsKIAllcnJvciA9IC1FTk9UU09DSzsKLQlzb2NrX2lub2RlID0gbmNwX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXNvY2tfaW5vZGUgPSBuY3BfZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoIVNfSVNTT0NLKHNvY2tfaW5vZGUtPmlfbW9kZSkpCiAJCWdvdG8gb3V0X2ZwdXQ7CiAJc29jayA9IFNPQ0tFVF9JKHNvY2tfaW5vZGUpOwpAQCAtNTA0LDcgKzUxMCw3IEBACiAJCWlmICghc2VydmVyLT5pbmZvX2ZpbHApCiAJCQlnb3RvIG91dF9mcHV0OwogCQllcnJvciA9IC1FTk9UU09DSzsKLQkJc29ja19pbm9kZSA9IHNlcnZlci0+aW5mb19maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJc29ja19pbm9kZSA9IHNlcnZlci0+aW5mb19maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCQlpZiAoIVNfSVNTT0NLKHNvY2tfaW5vZGUtPmlfbW9kZSkpCiAJCQlnb3RvIG91dF9mcHV0MjsKIAkJaW5mb19zb2NrID0gU09DS0VUX0koc29ja19pbm9kZSk7CkBAIC01NzcsMTIgKzU4MywxMiBAQAogCQlzZXJ2ZXItPnJjdi5wdHIgPSAodW5zaWduZWQgY2hhciopJnNlcnZlci0+cmN2LmJ1ZjsKIAkJc2VydmVyLT5yY3YubGVuID0gMTA7CiAJCXNlcnZlci0+cmN2LnN0YXRlID0gMDsKLQkJSU5JVF9XT1JLKCZzZXJ2ZXItPnJjdi50cSwgbmNwX3RjcF9yY3ZfcHJvYywgc2VydmVyKTsKLQkJSU5JVF9XT1JLKCZzZXJ2ZXItPnR4LnRxLCBuY3BfdGNwX3R4X3Byb2MsIHNlcnZlcik7CisJCUlOSVRfV09SSygmc2VydmVyLT5yY3YudHEsIG5jcF90Y3BfcmN2X3Byb2MpOworCQlJTklUX1dPUksoJnNlcnZlci0+dHgudHEsIG5jcF90Y3BfdHhfcHJvYyk7CiAJCXNvY2stPnNrLT5za193cml0ZV9zcGFjZSA9IG5jcF90Y3Bfd3JpdGVfc3BhY2U7CiAJfSBlbHNlIHsKLQkJSU5JVF9XT1JLKCZzZXJ2ZXItPnJjdi50cSwgbmNwZGdyYW1fcmN2X3Byb2MsIHNlcnZlcik7Ci0JCUlOSVRfV09SSygmc2VydmVyLT50aW1lb3V0X3RxLCBuY3BkZ3JhbV90aW1lb3V0X3Byb2MsIHNlcnZlcik7CisJCUlOSVRfV09SSygmc2VydmVyLT5yY3YudHEsIG5jcGRncmFtX3Jjdl9wcm9jKTsKKwkJSU5JVF9XT1JLKCZzZXJ2ZXItPnRpbWVvdXRfdHEsIG5jcGRncmFtX3RpbWVvdXRfcHJvYyk7CiAJCXNlcnZlci0+dGltZW91dF90bS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2VydmVyOwogCQlzZXJ2ZXItPnRpbWVvdXRfdG0uZnVuY3Rpb24gPSBuY3BkZ3JhbV90aW1lb3V0X2NhbGw7CiAJfQpAQCAtNjc5LDYgKzY4NSw3IEBACiAJICovCiAJZnB1dChuY3BfZmlscCk7CiBvdXQ6CisJcHV0X3BpZChkYXRhLndkb2dfcGlkKTsKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKIAlrZnJlZShzZXJ2ZXIpOwogCXJldHVybiBlcnJvcjsKQEAgLTcxMSw3ICs3MTgsOCBAQAogCWlmIChzZXJ2ZXItPmluZm9fZmlscCkKIAkJZnB1dChzZXJ2ZXItPmluZm9fZmlscCk7CiAJZnB1dChzZXJ2ZXItPm5jcF9maWxwKTsKLQlraWxsX3Byb2Moc2VydmVyLT5tLndkb2dfcGlkLCBTSUdURVJNLCAxKTsKKwlraWxsX3BpZChzZXJ2ZXItPm0ud2RvZ19waWQsIFNJR1RFUk0sIDEpOworCXB1dF9waWQoc2VydmVyLT5tLndkb2dfcGlkKTsKIAogCWtmcmVlKHNlcnZlci0+cHJpdi5kYXRhKTsKIAlrZnJlZShzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWUpOwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW9jdGwuYyBiL2ZzL25jcGZzL2lvY3RsLmMKaW5kZXggNTg5ZDFlYS4uODg0M2E4MyAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW9jdGwuYworKysgYi9mcy9uY3Bmcy9pb2N0bC5jCkBAIC0zNSw3ICszNSw3IEBACiBuY3BfZ2V0X2ZzX2luZm8oc3RydWN0IG5jcF9zZXJ2ZXIgKiBzZXJ2ZXIsIHN0cnVjdCBmaWxlICpmaWxlLAogCQlzdHJ1Y3QgbmNwX2ZzX2luZm8gX191c2VyICphcmcpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuY3BfZnNfaW5mbyBpbmZvOwogCiAJaWYgKChmaWxlX3Blcm1pc3Npb24oZmlsZSwgTUFZX1dSSVRFKSAhPSAwKQpAQCAtNjUsNyArNjUsNyBAQAogbmNwX2dldF9mc19pbmZvX3YyKHN0cnVjdCBuY3Bfc2VydmVyICogc2VydmVyLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgc3RydWN0IG5jcF9mc19pbmZvX3YyIF9fdXNlciAqIGFyZykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IG5jcF9mc19pbmZvX3YyIGluZm8yOwogCiAJaWYgKChmaWxlX3Blcm1pc3Npb24oZmlsZSwgTUFZX1dSSVRFKSAhPSAwKQpAQCAtMTM2LDcgKzEzNiw3IEBACiBuY3BfZ2V0X2NvbXBhdF9mc19pbmZvX3YyKHN0cnVjdCBuY3Bfc2VydmVyICogc2VydmVyLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgc3RydWN0IGNvbXBhdF9uY3BfZnNfaW5mb192MiBfX3VzZXIgKiBhcmcpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBjb21wYXRfbmNwX2ZzX2luZm9fdjIgaW5mbzI7CiAKIAlpZiAoKGZpbGVfcGVybWlzc2lvbihmaWxlLCBNQVlfV1JJVEUpICE9IDApCkBAIC04MjQsNyArODI0LDcgQEAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBsb25nIG5jcF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0OwogCiAJbG9ja19rZXJuZWwoKTsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL21tYXAuYyBiL2ZzL25jcGZzL21tYXAuYwppbmRleCBlN2Q1YTMwLi43MGE2OTExIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9tbWFwLmMKKysrIGIvZnMvbmNwZnMvbW1hcC5jCkBAIC0yOSw3ICsyOSw3IEBACiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCAqdHlwZSkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGFyZWEtPnZtX2ZpbGU7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBwYWdlKiBwYWdlOwogCWNoYXIgKnBnX2FkZHI7CkBAIC0xMDYsNyArMTA2LDcgQEAKIC8qIFRoaXMgaXMgdXNlZCBmb3IgYSBnZW5lcmFsIG1tYXAgb2YgYSBuY3AgZmlsZSAqLwogaW50IG5jcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJCiAJRFBSSU5USygibmNwX21tYXA6IGNhbGxlZFxuIik7CiAKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL3NvY2suYyBiL2ZzL25jcGZzL3NvY2suYwppbmRleCAxMWMyYjI1Li5lNDk2ZDhiIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9zb2NrLmMKKysrIGIvZnMvbmNwZnMvc29jay5jCkBAIC0zNTAsOSArMzUwLDEwIEBACiAJfQogfQogCi12b2lkIG5jcGRncmFtX3Jjdl9wcm9jKHZvaWQgKnMpCit2b2lkIG5jcGRncmFtX3Jjdl9wcm9jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gczsKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuY3Bfc2VydmVyLCByY3YudHEpOwogCXN0cnVjdCBzb2NrZXQqIHNvY2s7CiAJCiAJc29jayA9IHNlcnZlci0+bmNwX3NvY2s7CkBAIC00NjgsOSArNDY5LDEwIEBACiAJfQogfQogCi12b2lkIG5jcGRncmFtX3RpbWVvdXRfcHJvYyh2b2lkICpzKQordm9pZCBuY3BkZ3JhbV90aW1lb3V0X3Byb2Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBzOworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG5jcF9zZXJ2ZXIsIHRpbWVvdXRfdHEpOwogCW11dGV4X2xvY2soJnNlcnZlci0+cmN2LmNyZXFfbXV0ZXgpOwogCV9fbmNwZGdyYW1fdGltZW91dF9wcm9jKHNlcnZlcik7CiAJbXV0ZXhfdW5sb2NrKCZzZXJ2ZXItPnJjdi5jcmVxX211dGV4KTsKQEAgLTY1MiwxOCArNjU0LDIwIEBACiAJfQogfQogCi12b2lkIG5jcF90Y3BfcmN2X3Byb2Modm9pZCAqcykKK3ZvaWQgbmNwX3RjcF9yY3ZfcHJvYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IHM7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmNwX3NlcnZlciwgcmN2LnRxKTsKIAogCW11dGV4X2xvY2soJnNlcnZlci0+cmN2LmNyZXFfbXV0ZXgpOwogCV9fbmNwdGNwX3Jjdl9wcm9jKHNlcnZlcik7CiAJbXV0ZXhfdW5sb2NrKCZzZXJ2ZXItPnJjdi5jcmVxX211dGV4KTsKIH0KIAotdm9pZCBuY3BfdGNwX3R4X3Byb2Modm9pZCAqcykKK3ZvaWQgbmNwX3RjcF90eF9wcm9jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gczsKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuY3Bfc2VydmVyLCB0eC50cSk7CiAJCiAJbXV0ZXhfbG9jaygmc2VydmVyLT5yY3YuY3JlcV9tdXRleCk7CiAJX19uY3B0Y3BfdHJ5X3NlbmQoc2VydmVyKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFjay5oIGIvZnMvbmZzL2NhbGxiYWNrLmgKaW5kZXggNTY3NjE2M2QuLmRiM2Q3OTEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFjay5oCisrKyBiL2ZzL25mcy9jYWxsYmFjay5oCkBAIC0zMSwxMCArMzEsMTAgQEAKIH07CiAKIHN0cnVjdCBjYl9jb21wb3VuZF9oZHJfcmVzIHsKLQl1aW50MzJfdCAqc3RhdHVzOworCV9fYmUzMiAqc3RhdHVzOwogCWludCB0YWdsZW47CiAJY29uc3QgY2hhciAqdGFnOwotCXVpbnQzMl90ICpub3BzOworCV9fYmUzMiAqbm9wczsKIH07CiAKIHN0cnVjdCBjYl9nZXRhdHRyYXJncyB7CkBAIC00NCw3ICs0NCw3IEBACiB9OwogCiBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyB7Ci0JdWludDMyX3Qgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAJdWludDMyX3QgYml0bWFwWzJdOwogCXVpbnQ2NF90IHNpemU7CiAJdWludDY0X3QgY2hhbmdlX2F0dHI7CkBAIC01OSw4ICs1OSw4IEBACiAJdWludDMyX3QgdHJ1bmNhdGU7CiB9OwogCi1leHRlcm4gdW5zaWduZWQgbmZzNF9jYWxsYmFja19nZXRhdHRyKHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncywgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcyk7Ci1leHRlcm4gdW5zaWduZWQgbmZzNF9jYWxsYmFja19yZWNhbGwoc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KTsKK2V4dGVybiBfX2JlMzIgbmZzNF9jYWxsYmFja19nZXRhdHRyKHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncywgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcyk7CitleHRlcm4gX19iZTMyIG5mczRfY2FsbGJhY2tfcmVjYWxsKHN0cnVjdCBjYl9yZWNhbGxhcmdzICphcmdzLCB2b2lkICpkdW1teSk7CiAKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiBleHRlcm4gaW50IG5mc19jYWxsYmFja191cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFja19wcm9jLmMgYi9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCmluZGV4IDk3Y2Y4ZjcuLjcyZTU1ZDggMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYwpAQCAtMTQsNyArMTQsNyBAQAogCiAjZGVmaW5lIE5GU0RCR19GQUNJTElUWSBORlNEQkdfQ0FMTEJBQ0sKICAKLXVuc2lnbmVkIG5mczRfY2FsbGJhY2tfZ2V0YXR0cihzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MsIHN0cnVjdCBjYl9nZXRhdHRycmVzICpyZXMpCitfX2JlMzIgbmZzNF9jYWxsYmFja19nZXRhdHRyKHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncywgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcykKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKQEAgLTU1LDExICs1NSwxMSBAQAogCXJldHVybiByZXMtPnN0YXR1czsKIH0KIAotdW5zaWduZWQgbmZzNF9jYWxsYmFja19yZWNhbGwoc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KQorX19iZTMyIG5mczRfY2FsbGJhY2tfcmVjYWxsKHN0cnVjdCBjYl9yZWNhbGxhcmdzICphcmdzLCB2b2lkICpkdW1teSkKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0JdW5zaWduZWQgcmVzOworCV9fYmUzMiByZXM7CiAJCiAJcmVzID0gaHRvbmwoTkZTNEVSUl9CQURIQU5ETEUpOwogCWNscCA9IG5mc19maW5kX2NsaWVudChhcmdzLT5hZGRyLCA0KTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFja194ZHIuYyBiL2ZzL25mcy9jYWxsYmFja194ZHIuYwppbmRleCAyOWY5MzIxLi5mOGVhMWY1IDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrX3hkci5jCkBAIC0yMiw5ICsyMiw5IEBACiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZIE5GU0RCR19DQUxMQkFDSwogCi10eXBlZGVmIHVuc2lnbmVkICgqY2FsbGJhY2tfcHJvY2Vzc19vcF90KSh2b2lkICosIHZvaWQgKik7Ci10eXBlZGVmIHVuc2lnbmVkICgqY2FsbGJhY2tfZGVjb2RlX2FyZ190KShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHhkcl9zdHJlYW0gKiwgdm9pZCAqKTsKLXR5cGVkZWYgdW5zaWduZWQgKCpjYWxsYmFja19lbmNvZGVfcmVzX3QpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqLCB2b2lkICopOwordHlwZWRlZiBfX2JlMzIgKCpjYWxsYmFja19wcm9jZXNzX29wX3QpKHZvaWQgKiwgdm9pZCAqKTsKK3R5cGVkZWYgX19iZTMyICgqY2FsbGJhY2tfZGVjb2RlX2FyZ190KShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHhkcl9zdHJlYW0gKiwgdm9pZCAqKTsKK3R5cGVkZWYgX19iZTMyICgqY2FsbGJhY2tfZW5jb2RlX3Jlc190KShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHhkcl9zdHJlYW0gKiwgdm9pZCAqKTsKIAogCiBzdHJ1Y3QgY2FsbGJhY2tfb3AgewpAQCAtMzYsMjQgKzM2LDI0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2FsbGJhY2tfb3AgY2FsbGJhY2tfb3BzW107CiAKLXN0YXRpYyBpbnQgbmZzNF9jYWxsYmFja19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCitzdGF0aWMgX19iZTMyIG5mczRfY2FsbGJhY2tfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQogewogCXJldHVybiBodG9ubChORlM0X09LKTsKIH0KIAotc3RhdGljIGludCBuZnM0X2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCB2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgbmZzNF9kZWNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9CiAKLXN0YXRpYyBpbnQgbmZzNF9lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgdm9pZCAqZHVtbXkpCitzdGF0aWMgaW50IG5mczRfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCi1zdGF0aWMgdWludDMyX3QgKnJlYWRfYnVmKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGludCBuYnl0ZXMpCitzdGF0aWMgX19iZTMyICpyZWFkX2J1ZihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBpbnQgbmJ5dGVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIG5ieXRlcyk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCkBAIC02MSw5ICs2MSw5IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBkZWNvZGVfc3RyaW5nKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCAqbGVuLCBjb25zdCBjaGFyICoqc3RyKQorc3RhdGljIF9fYmUzMiBkZWNvZGVfc3RyaW5nKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCAqbGVuLCBjb25zdCBjaGFyICoqc3RyKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCXAgPSByZWFkX2J1Zih4ZHIsIDQpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQpAQCAtODEsOSArODEsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZGVjb2RlX2ZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmggKmZoKQorc3RhdGljIF9fYmUzMiBkZWNvZGVfZmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19maCAqZmgpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJcCA9IHJlYWRfYnVmKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCkBAIC05OSw5ICs5OSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBkZWNvZGVfYml0bWFwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXApCitzdGF0aWMgX19iZTMyIGRlY29kZV9iaXRtYXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdW5zaWduZWQgaW50IGF0dHJsZW47CiAKIAlwID0gcmVhZF9idWYoeGRyLCA0KTsKQEAgLTExOCw5ICsxMTgsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZGVjb2RlX3N0YXRlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQorc3RhdGljIF9fYmUzMiBkZWNvZGVfc3RhdGVpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJcCA9IHJlYWRfYnVmKHhkciwgMTYpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQpAQCAtMTI5LDExICsxMjksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGRlY29kZV9jb21wb3VuZF9oZHJfYXJnKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9jb21wb3VuZF9oZHJfYXJnICpoZHIpCitzdGF0aWMgX19iZTMyIGRlY29kZV9jb21wb3VuZF9oZHJfYXJnKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9jb21wb3VuZF9oZHJfYXJnICpoZHIpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCXVuc2lnbmVkIGludCBtaW5vcl92ZXJzaW9uOwotCXVuc2lnbmVkIHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJc3RhdHVzID0gZGVjb2RlX3N0cmluZyh4ZHIsICZoZHItPnRhZ2xlbiwgJmhkci0+dGFnKTsKIAlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQpAQCAtMTU5LDkgKzE1OSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBkZWNvZGVfb3BfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCAqb3ApCitzdGF0aWMgX19iZTMyIGRlY29kZV9vcF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50ICpvcCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJcCA9IHJlYWRfYnVmKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKQEAgLTE2OSw5ICsxNjksOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZGVjb2RlX2dldGF0dHJfYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MpCitzdGF0aWMgX19iZTMyIGRlY29kZV9nZXRhdHRyX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzKQogewotCXVuc2lnbmVkIHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJc3RhdHVzID0gZGVjb2RlX2ZoKHhkciwgJmFyZ3MtPmZoKTsKIAlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQpAQCAtMTgzLDEwICsxODMsMTAgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZGVjb2RlX3JlY2FsbF9hcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9yZWNhbGxhcmdzICphcmdzKQorc3RhdGljIF9fYmUzMiBkZWNvZGVfcmVjYWxsX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MpCiB7Ci0JdWludDMyX3QgKnA7Ci0JdW5zaWduZWQgc3RhdHVzOworCV9fYmUzMiAqcDsKKwlfX2JlMzIgc3RhdHVzOwogCiAJYXJncy0+YWRkciA9ICZycXN0cC0+cnFfYWRkcjsKIAlzdGF0dXMgPSBkZWNvZGVfc3RhdGVpZCh4ZHIsICZhcmdzLT5zdGF0ZWlkKTsKQEAgLTIwNCw5ICsyMDQsOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVfc3RyaW5nKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0cikKK3N0YXRpYyBfX2JlMzIgZW5jb2RlX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIGxlbik7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCkBAIC0yMTcsMTAgKzIxNywxMCBAQAogCiAjZGVmaW5lIENCX1NVUFBPUlRFRF9BVFRSMCAoRkFUVFI0X1dPUkQwX0NIQU5HRXxGQVRUUjRfV09SRDBfU0laRSkKICNkZWZpbmUgQ0JfU1VQUE9SVEVEX0FUVFIxIChGQVRUUjRfV09SRDFfVElNRV9NRVRBREFUQXxGQVRUUjRfV09SRDFfVElNRV9NT0RJRlkpCi1zdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfYml0bWFwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICoqc2F2ZXApCitzdGF0aWMgX19iZTMyIGVuY29kZV9hdHRyX2JpdG1hcChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCBfX2JlMzIgKipzYXZlcCkKIHsKLQl1aW50MzJfdCBibVsyXTsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgYm1bMl07CisJX19iZTMyICpwOwogCiAJYm1bMF0gPSBodG9ubChiaXRtYXBbMF0gJiBDQl9TVVBQT1JURURfQVRUUjApOwogCWJtWzFdID0gaHRvbmwoYml0bWFwWzFdICYgQ0JfU1VQUE9SVEVEX0FUVFIxKTsKQEAgLTI0Nyw5ICsyNDcsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfY2hhbmdlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90IGNoYW5nZSkKK3N0YXRpYyBfX2JlMzIgZW5jb2RlX2F0dHJfY2hhbmdlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90IGNoYW5nZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlpZiAoIShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfQ0hBTkdFKSkKIAkJcmV0dXJuIDA7CkBAIC0yNjAsOSArMjYwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGVuY29kZV9hdHRyX3NpemUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3Qgc2l6ZSkKK3N0YXRpYyBfX2JlMzIgZW5jb2RlX2F0dHJfc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCBzaXplKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCWlmICghKGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9TSVpFKSkKIAkJcmV0dXJuIDA7CkBAIC0yNzMsOSArMjczLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGVuY29kZV9hdHRyX3RpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lKQorc3RhdGljIF9fYmUzMiBlbmNvZGVfYXR0cl90aW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCAxMik7CiAJaWYgKHVubGlrZWx5KHAgPT0gMCkpCkBAIC0yODUsMjMgKzI4NSwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfY3RpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdWludDMyX3QgKmJpdG1hcCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lKQorc3RhdGljIF9fYmUzMiBlbmNvZGVfYXR0cl9jdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCiB7CiAJaWYgKCEoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfTUVUQURBVEEpKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gZW5jb2RlX2F0dHJfdGltZSh4ZHIsdGltZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVfYXR0cl9tdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCitzdGF0aWMgX19iZTMyIGVuY29kZV9hdHRyX210aW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHVpbnQzMl90ICpiaXRtYXAsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKIHsKIAlpZiAoIShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfVElNRV9NT0RJRlkpKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gZW5jb2RlX2F0dHJfdGltZSh4ZHIsdGltZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVfY29tcG91bmRfaGRyX3JlcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX3JlcyAqaGRyKQorc3RhdGljIF9fYmUzMiBlbmNvZGVfY29tcG91bmRfaGRyX3JlcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX3JlcyAqaGRyKQogewotCXVuc2lnbmVkIHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJaGRyLT5zdGF0dXMgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOwogCWlmICh1bmxpa2VseShoZHItPnN0YXR1cyA9PSBOVUxMKSkKQEAgLTMxNSw5ICszMTUsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZW5jb2RlX29wX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCBvcCwgdWludDMyX3QgcmVzKQorc3RhdGljIF9fYmUzMiBlbmNvZGVfb3BfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90IG9wLCBfX2JlMzIgcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAkKIAlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4KTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKQEAgLTMyNywxMCArMzI3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBlbmNvZGVfZ2V0YXR0cl9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcykKK3N0YXRpYyBfX2JlMzIgZW5jb2RlX2dldGF0dHJfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBjYl9nZXRhdHRycmVzICpyZXMpCiB7Ci0JdWludDMyX3QgKnNhdmVwID0gTlVMTDsKLQl1bnNpZ25lZCBzdGF0dXMgPSByZXMtPnN0YXR1czsKKwlfX2JlMzIgKnNhdmVwID0gTlVMTDsKKwlfX2JlMzIgc3RhdHVzID0gcmVzLT5zdGF0dXM7CiAJCiAJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKIAkJZ290byBvdXQ7CkBAIC0zNTMsMTUgKzM1MywxNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBwcm9jZXNzX29wKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCitzdGF0aWMgX19iZTMyIHByb2Nlc3Nfb3Aoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJc3RydWN0IHhkcl9zdHJlYW0gKnhkcl9pbiwgdm9pZCAqYXJncCwKIAkJc3RydWN0IHhkcl9zdHJlYW0gKnhkcl9vdXQsIHZvaWQgKnJlc3ApCiB7CiAJc3RydWN0IGNhbGxiYWNrX29wICpvcCA9ICZjYWxsYmFja19vcHNbMF07CiAJdW5zaWduZWQgaW50IG9wX25yID0gT1BfQ0JfSUxMRUdBTDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gMDsKKwlfX2JlMzIgc3RhdHVzID0gMDsKIAlsb25nIG1heGxlbjsKLQl1bnNpZ25lZCByZXM7CisJX19iZTMyIHJlczsKIAogCWRwcmludGsoIiVzOiBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKIAlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkcl9pbiwgJm9wX25yKTsKQEAgLTM5OSwyMCArMzk5LDIwIEBACiAvKgogICogRGVjb2RlLCBwcm9jZXNzIGFuZCBlbmNvZGUgYSBDT01QT1VORAogICovCi1zdGF0aWMgaW50IG5mczRfY2FsbGJhY2tfY29tcG91bmQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKK3N0YXRpYyBfX2JlMzIgbmZzNF9jYWxsYmFja19jb21wb3VuZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQogewogCXN0cnVjdCBjYl9jb21wb3VuZF9oZHJfYXJnIGhkcl9hcmc7CiAJc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9yZXMgaGRyX3JlczsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHJfaW4sIHhkcl9vdXQ7Ci0JdWludDMyX3QgKnA7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKKwlfX2JlMzIgKnA7CisJX19iZTMyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgbm9wcyA9IDE7CiAKIAlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAl4ZHJfaW5pdF9kZWNvZGUoJnhkcl9pbiwgJnJxc3RwLT5ycV9hcmcsIHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfYmFzZSk7CiAKLQlwID0gKHVpbnQzMl90KikoKGNoYXIgKilycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2Jhc2UgKyBycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2xlbik7CisJcCA9IChfX2JlMzIqKSgoY2hhciAqKXJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfYmFzZSArIHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuKTsKIAl4ZHJfaW5pdF9lbmNvZGUoJnhkcl9vdXQsICZycXN0cC0+cnFfcmVzLCBwKTsKIAogCWRlY29kZV9jb21wb3VuZF9oZHJfYXJnKCZ4ZHJfaW4sICZoZHJfYXJnKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9jbGllbnQuYyBiL2ZzL25mcy9jbGllbnQuYwppbmRleCAzNGMzOTk2Li4yM2FiMTQ1IDEwMDY0NAotLS0gYS9mcy9uZnMvY2xpZW50LmMKKysrIGIvZnMvbmZzL2NsaWVudC5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOwogCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX3VudXNlZCk7CiAJc3Bpbl9sb2NrX2luaXQoJmNscC0+Y2xfbG9jayk7Ci0JSU5JVF9XT1JLKCZjbHAtPmNsX3JlbmV3ZCwgbmZzNF9yZW5ld19zdGF0ZSwgY2xwKTsKKwlJTklUX0RFTEFZRURfV09SSygmY2xwLT5jbF9yZW5ld2QsIG5mczRfcmVuZXdfc3RhdGUpOwogCXJwY19pbml0X3dhaXRfcXVldWUoJmNscC0+Y2xfcnBjd2FpdHEsICJORlMgY2xpZW50Iik7CiAJY2xwLT5jbF9ib290X3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJY2xwLT5jbF9zdGF0ZSA9IDEgPDwgTkZTNENMTlRfTEVBU0VfRVhQSVJFRDsKQEAgLTIzMiwxMSArMjMyLDE1IEBACiAgKiBGaW5kIGEgY2xpZW50IGJ5IGFkZHJlc3MKICAqIC0gY2FsbGVyIG11c3QgaG9sZCBuZnNfY2xpZW50X2xvY2sKICAqLwotc3RhdGljIHN0cnVjdCBuZnNfY2xpZW50ICpfX25mc19maW5kX2NsaWVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGludCBuZnN2ZXJzaW9uKQorc3RhdGljIHN0cnVjdCBuZnNfY2xpZW50ICpfX25mc19maW5kX2NsaWVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGludCBuZnN2ZXJzaW9uLCBpbnQgbWF0Y2hfcG9ydCkKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZuZnNfY2xpZW50X2xpc3QsIGNsX3NoYXJlX2xpbmspIHsKKwkJLyogRG9uJ3QgbWF0Y2ggY2xpZW50cyB0aGF0IGZhaWxlZCB0byBpbml0aWFsaXNlIHByb3Blcmx5ICovCisJCWlmIChjbHAtPmNsX2NvbnNfc3RhdGUgPCAwKQorCQkJY29udGludWU7CisKIAkJLyogRGlmZmVyZW50IE5GUyB2ZXJzaW9ucyBjYW5ub3Qgc2hhcmUgdGhlIHNhbWUgbmZzX2NsaWVudCAqLwogCQlpZiAoY2xwLT5jbF9uZnN2ZXJzaW9uICE9IG5mc3ZlcnNpb24pCiAJCQljb250aW51ZTsKQEAgLTI0NSw3ICsyNDksNyBAQAogCQkJICAgc2l6ZW9mKGNscC0+Y2xfYWRkci5zaW5fYWRkcikpICE9IDApCiAJCQljb250aW51ZTsKIAotCQlpZiAoY2xwLT5jbF9hZGRyLnNpbl9wb3J0ID09IGFkZHItPnNpbl9wb3J0KQorCQlpZiAoIW1hdGNoX3BvcnQgfHwgY2xwLT5jbF9hZGRyLnNpbl9wb3J0ID09IGFkZHItPnNpbl9wb3J0KQogCQkJZ290byBmb3VuZDsKIAl9CiAKQEAgLTI2NSwxMSArMjY5LDEyIEBACiAJc3RydWN0IG5mc19jbGllbnQgKmNscDsKIAogCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQljbHAgPSBfX25mc19maW5kX2NsaWVudChhZGRyLCBuZnN2ZXJzaW9uKTsKKwljbHAgPSBfX25mc19maW5kX2NsaWVudChhZGRyLCBuZnN2ZXJzaW9uLCAwKTsKIAlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQotCUJVR19PTihjbHAgJiYgY2xwLT5jbF9jb25zX3N0YXRlID09IDApOwotCisJaWYgKGNscCAhPSBOVUxMICYmIGNscC0+Y2xfY29uc19zdGF0ZSAhPSBORlNfQ1NfUkVBRFkpIHsKKwkJbmZzX3B1dF9jbGllbnQoY2xwKTsKKwkJY2xwID0gTlVMTDsKKwl9CiAJcmV0dXJuIGNscDsKIH0KIApAQCAtMjkyLDcgKzI5Nyw3IEBACiAJZG8gewogCQlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7CiAKLQkJY2xwID0gX19uZnNfZmluZF9jbGllbnQoYWRkciwgbmZzdmVyc2lvbik7CisJCWNscCA9IF9fbmZzX2ZpbmRfY2xpZW50KGFkZHIsIG5mc3ZlcnNpb24sIDEpOwogCQlpZiAoY2xwKQogCQkJZ290byBmb3VuZF9jbGllbnQ7CiAJCWlmIChuZXcpCkBAIC04NDksNiArODU0LDcgQEAKICAqLwogc3RhdGljIGludCBuZnM0X2luaXRfY2xpZW50KHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCiAJCWludCBwcm90bywgaW50IHRpbWVvLCBpbnQgcmV0cmFucywKKwkJY29uc3QgY2hhciAqaXBfYWRkciwKIAkJcnBjX2F1dGhmbGF2b3JfdCBhdXRoZmxhdm91cikKIHsKIAlpbnQgZXJyb3I7CkBAIC04NjUsNiArODcxLDcgQEAKIAllcnJvciA9IG5mc19jcmVhdGVfcnBjX2NsaWVudChjbHAsIHByb3RvLCB0aW1lbywgcmV0cmFucywgYXV0aGZsYXZvdXIpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gZXJyb3I7CisJbWVtY3B5KGNscC0+Y2xfaXBhZGRyLCBpcF9hZGRyLCBzaXplb2YoY2xwLT5jbF9pcGFkZHIpKTsKIAogCWVycm9yID0gbmZzX2lkbWFwX25ldyhjbHApOwogCWlmIChlcnJvciA8IDApIHsKQEAgLTg4OCw2ICs4OTUsNyBAQAogICovCiBzdGF0aWMgaW50IG5mczRfc2V0X2NsaWVudChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAogCQljb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyLAorCQljb25zdCBjaGFyICppcF9hZGRyLAogCQlycGNfYXV0aGZsYXZvcl90IGF1dGhmbGF2b3VyLAogCQlpbnQgcHJvdG8sIGludCB0aW1lbywgaW50IHJldHJhbnMpCiB7CkBAIC05MDIsNyArOTEwLDcgQEAKIAkJZXJyb3IgPSBQVFJfRVJSKGNscCk7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWVycm9yID0gbmZzNF9pbml0X2NsaWVudChjbHAsIHByb3RvLCB0aW1lbywgcmV0cmFucywgYXV0aGZsYXZvdXIpOworCWVycm9yID0gbmZzNF9pbml0X2NsaWVudChjbHAsIHByb3RvLCB0aW1lbywgcmV0cmFucywgaXBfYWRkciwgYXV0aGZsYXZvdXIpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gZXJyb3JfcHV0OwogCkBAIC05NzEsNyArOTc5LDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAkvKiBHZXQgYSBjbGllbnQgcmVjb3JkICovCi0JZXJyb3IgPSBuZnM0X3NldF9jbGllbnQoc2VydmVyLCBob3N0bmFtZSwgYWRkciwgYXV0aGZsYXZvdXIsCisJZXJyb3IgPSBuZnM0X3NldF9jbGllbnQoc2VydmVyLCBob3N0bmFtZSwgYWRkciwgaXBfYWRkciwgYXV0aGZsYXZvdXIsCiAJCQlkYXRhLT5wcm90bywgZGF0YS0+dGltZW8sIGRhdGEtPnJldHJhbnMpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gZXJyb3I7CkBAIC0xMDQxLDYgKzEwNDksNyBAQAogCS8qIEdldCBhIGNsaWVudCByZXByZXNlbnRhdGlvbi4KIAkgKiBOb3RlOiBORlN2NCBhbHdheXMgdXNlcyBUQ1AsICovCiAJZXJyb3IgPSBuZnM0X3NldF9jbGllbnQoc2VydmVyLCBkYXRhLT5ob3N0bmFtZSwgZGF0YS0+YWRkciwKKwkJCXBhcmVudF9jbGllbnQtPmNsX2lwYWRkciwKIAkJCWRhdGEtPmF1dGhmbGF2b3IsCiAJCQlwYXJlbnRfc2VydmVyLT5jbGllbnQtPmNsX3hwcnQtPnByb3QsCiAJCQlwYXJlbnRfY2xpZW50LT5yZXRyYW5zX3RpbWVvLApkaWZmIC0tZ2l0IGEvZnMvbmZzL2Rpci5jIGIvZnMvbmZzL2Rpci5jCmluZGV4IDQ4MWY4ODkuLmRlZTNkNmMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXIuYworKysgYi9mcy9uZnMvZGlyLmMKQEAgLTE0MiwxMiArMTQyLDEyIEBACiAJcmV0dXJuIHJlczsKIH0KIAotdHlwZWRlZiB1MzIgKiAoKmRlY29kZV9kaXJlbnRfdCkodTMyICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKK3R5cGVkZWYgX19iZTMyICogKCpkZWNvZGVfZGlyZW50X3QpKF9fYmUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CiB0eXBlZGVmIHN0cnVjdCB7CiAJc3RydWN0IGZpbGUJKmZpbGU7CiAJc3RydWN0IHBhZ2UJKnBhZ2U7CiAJdW5zaWduZWQgbG9uZwlwYWdlX2luZGV4OwotCXUzMgkJKnB0cjsKKwlfX2JlMzIJCSpwdHI7CiAJdTY0CQkqZGlyX2Nvb2tpZTsKIAlsb2ZmX3QJCWN1cnJlbnRfaW5kZXg7CiAJc3RydWN0IG5mc19lbnRyeSAqZW50cnk7CkBAIC0xNzIsNyArMTcyLDcgQEAKIGludCBuZnNfcmVhZGRpcl9maWxsZXIobmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzdHJ1Y3QgZmlsZQkqZmlsZSA9IGRlc2MtPmZpbGU7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBycGNfY3JlZAkqY3JlZCA9IG5mc19maWxlX2NyZWQoZmlsZSk7CiAJdW5zaWduZWQgbG9uZwl0aW1lc3RhbXA7CiAJaW50CQllcnJvcjsKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAgYWdhaW46CiAJdGltZXN0YW1wID0gamlmZmllczsKLQllcnJvciA9IE5GU19QUk9UTyhpbm9kZSktPnJlYWRkaXIoZmlsZS0+Zl9kZW50cnksIGNyZWQsIGRlc2MtPmVudHJ5LT5jb29raWUsIHBhZ2UsCisJZXJyb3IgPSBORlNfUFJPVE8oaW5vZGUpLT5yZWFkZGlyKGZpbGUtPmZfcGF0aC5kZW50cnksIGNyZWQsIGRlc2MtPmVudHJ5LT5jb29raWUsIHBhZ2UsCiAJCQkJCSAgTkZTX1NFUlZFUihpbm9kZSktPmR0c2l6ZSwgZGVzYy0+cGx1cyk7CiAJaWYgKGVycm9yIDwgMCkgewogCQkvKiBXZSByZXF1ZXN0ZWQgUkVBRERJUlBMVVMsIGJ1dCB0aGUgc2VydmVyIGRvZXNuJ3QgZ3JvayBpdCAqLwpAQCAtMjAzLDggKzIwMywxMCBAQAogCSAqIE5vdGU6IGFzc3VtZXMgd2UgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoaXMgbWFwcGluZyBlaXRoZXIKIAkgKgkgdGhyb3VnaCBpbm9kZS0+aV9tdXRleCBvciBzb21lIG90aGVyIG1lY2hhbmlzbS4KIAkgKi8KLQlpZiAocGFnZS0+aW5kZXggPT0gMCkKLQkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgUEFHRV9DQUNIRV9TSVpFLCAtMSk7CisJaWYgKHBhZ2UtPmluZGV4ID09IDAgJiYgaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgUEFHRV9DQUNIRV9TSVpFLCAtMSkgPCAwKSB7CisJCS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJbmZzX3phcF9tYXBwaW5nKGlub2RlLCBpbm9kZS0+aV9tYXBwaW5nKTsKKwl9CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJcmV0dXJuIDA7CiAgZXJyb3I6CkBAIC0yMTgsNyArMjIwLDcgQEAKIHN0YXRpYyBpbmxpbmUKIGludCBkaXJfZGVjb2RlKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYykKIHsKLQl1MzIJKnAgPSBkZXNjLT5wdHI7CisJX19iZTMyCSpwID0gZGVzYy0+cHRyOwogCXAgPSBkZXNjLT5kZWNvZGUocCwgZGVzYy0+ZW50cnksIGRlc2MtPnBsdXMpOwogCWlmIChJU19FUlIocCkpCiAJCXJldHVybiBQVFJfRVJSKHApOwpAQCAtMzA2LDcgKzMwOCw3IEBACiBzdGF0aWMgaW5saW5lCiBpbnQgZmluZF9kaXJlbnRfcGFnZShuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MpCiB7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGRlc2MtPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZXNjLT5maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBwYWdlCSpwYWdlOwogCWludAkJc3RhdHVzOwogCkBAIC00NjIsNyArNDY0LDcgQEAKIAkJICAgICBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzdHJ1Y3QgZmlsZQkqZmlsZSA9IGRlc2MtPmZpbGU7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBycGNfY3JlZAkqY3JlZCA9IG5mc19maWxlX2NyZWQoZmlsZSk7CiAJc3RydWN0IHBhZ2UJKnBhZ2UgPSBOVUxMOwogCWludAkJc3RhdHVzOwpAQCAtNDc1LDcgKzQ3Nyw3IEBACiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KLQlkZXNjLT5lcnJvciA9IE5GU19QUk9UTyhpbm9kZSktPnJlYWRkaXIoZmlsZS0+Zl9kZW50cnksIGNyZWQsICpkZXNjLT5kaXJfY29va2llLAorCWRlc2MtPmVycm9yID0gTkZTX1BST1RPKGlub2RlKS0+cmVhZGRpcihmaWxlLT5mX3BhdGguZGVudHJ5LCBjcmVkLCAqZGVzYy0+ZGlyX2Nvb2tpZSwKIAkJCQkJCXBhZ2UsCiAJCQkJCQlORlNfU0VSVkVSKGlub2RlKS0+ZHRzaXplLAogCQkJCQkJZGVzYy0+cGx1cyk7CkBAIC01MTQsNyArNTE2LDcgQEAKICAqLwogc3RhdGljIGludCBuZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJbmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90IG15X2Rlc2MsCiAJCQkqZGVzYyA9ICZteV9kZXNjOwpAQCAtNTk3LDcgKzU5OSw3IEBACiAKIGxvZmZfdCBuZnNfbGxzZWVrX2RpcihzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKIHsKLQltdXRleF9sb2NrKCZmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfbG9jaygmZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoIChvcmlnaW4pIHsKIAkJY2FzZSAxOgogCQkJb2Zmc2V0ICs9IGZpbHAtPmZfcG9zOwpAQCAtNjEzLDcgKzYxNSw3IEBACiAJCSgoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxwLT5wcml2YXRlX2RhdGEpLT5kaXJfY29va2llID0gMDsKIAl9CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gb2Zmc2V0OwogfQogCkBAIC05MzMsOCArOTM1LDE3IEBACiAKIG5vX2VudHJ5OgogCXJlcyA9IGRfbWF0ZXJpYWxpc2VfdW5pcXVlKGRlbnRyeSwgaW5vZGUpOwotCWlmIChyZXMgIT0gTlVMTCkKKwlpZiAocmVzICE9IE5VTEwpIHsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCQlpZiAoSVNfRVJSKHJlcykpCisJCQlnb3RvIG91dF91bmxvY2s7CisJCS8qIFdhcyBhIGRpcmVjdG9yeSByZW5hbWVkISAqLworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChyZXMpOworCQlpZiAoIUlTX1JPT1QocGFyZW50KSkKKwkJCW5mc19tYXJrX2Zvcl9yZXZhbGlkYXRlKHBhcmVudC0+ZF9pbm9kZSk7CisJCWRwdXQocGFyZW50KTsKIAkJZGVudHJ5ID0gcmVzOworCX0KIAluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKIAluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKIG91dF91bmxvY2s6CkBAIC0xMDkxLDcgKzExMDIsNyBAQAogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbmZzX3JlYWRkaXJfbG9va3VwKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYykKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZXNjLT5maWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZXNjLT5maWxlLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFyZW50LT5kX2lub2RlOwogCXN0cnVjdCBuZnNfZW50cnkgKmVudHJ5ID0gZGVzYy0+ZW50cnk7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqYWxpYXM7CkBAIC0xMTMwLDYgKzExNDEsOCBAQAogCWFsaWFzID0gZF9tYXRlcmlhbGlzZV91bmlxdWUoZGVudHJ5LCBpbm9kZSk7CiAJaWYgKGFsaWFzICE9IE5VTEwpIHsKIAkJZHB1dChkZW50cnkpOworCQlpZiAoSVNfRVJSKGFsaWFzKSkKKwkJCXJldHVybiBOVUxMOwogCQlkZW50cnkgPSBhbGlhczsKIAl9CiAKQEAgLTE1MTcsOCArMTUzMCw4IEBACiAJcGFnZXZlY19pbml0KCZscnVfcHZlYywgMCk7CiAJaWYgKCFhZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBkZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZywgMCwKIAkJCQkJCQlHRlBfS0VSTkVMKSkgewotCQlpZiAoIXBhZ2V2ZWNfYWRkKCZscnVfcHZlYywgcGFnZSkpCi0JCQlfX3BhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOworCQlwYWdldmVjX2FkZCgmbHJ1X3B2ZWMsIHBhZ2UpOworCQlwYWdldmVjX2xydV9hZGQoJmxydV9wdmVjKTsKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2ZzL25mcy9kaXJlY3QuYyBiL2ZzL25mcy9kaXJlY3QuYwppbmRleCA5ZjdmOGI5Li5iZDIxZDdmIDEwMDY0NAotLS0gYS9mcy9uZnMvZGlyZWN0LmMKKysrIGIvZnMvbmZzL2RpcmVjdC5jCkBAIC01OCw3ICs1OCw3IEBACiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfVkZTCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKm5mc19kaXJlY3RfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpuZnNfZGlyZWN0X2NhY2hlcDsKIAogLyoKICAqIFRoaXMgcmVwcmVzZW50cyBhIHNldCBvZiBhc3luY2hyb25vdXMgcmVxdWVzdHMgdGhhdCB3ZSdyZSB3YWl0aW5nIG9uCkBAIC0xMTYsNyArMTE2LDcgQEAKIHNzaXplX3QgbmZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKIHsKIAlkcHJpbnRrKCJORlM6IG5mc19kaXJlY3RfSU8gKCVzKSBvZmYvbm8oJUxkLyVsdSkgRUlOVkFMXG4iLAotCQkJaW9jYi0+a2lfZmlscC0+Zl9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJaW9jYi0+a2lfZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkobG9uZyBsb25nKSBwb3MsIG5yX3NlZ3MpOwogCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDMsNyArMTQzLDcgQEAKIHsKIAlzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEgKmRyZXE7CiAKLQlkcmVxID0ga21lbV9jYWNoZV9hbGxvYyhuZnNfZGlyZWN0X2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWRyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKG5mc19kaXJlY3RfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRyZXEpCiAJCXJldHVybiBOVUxMOwogCkBAIC0zMDcsOSArMzA3LDcgQEAKIAogCQlkYXRhLT50YXNrLnRrX2Nvb2tpZSA9ICh1bnNpZ25lZCBsb25nKSBpbm9kZTsKIAotCQlsb2NrX2tlcm5lbCgpOwogCQlycGNfZXhlY3V0ZSgmZGF0YS0+dGFzayk7Ci0JCXVubG9ja19rZXJuZWwoKTsKIAogCQlkZnByaW50ayhWRlMsICJORlM6ICU1dSBpbml0aWF0ZWQgZGlyZWN0IHJlYWQgY2FsbCAocmVxICVzLyVMZCwgJXp1IGJ5dGVzIEAgb2Zmc2V0ICVMdSlcbiIsCiAJCQkJZGF0YS0+dGFzay50a19waWQsCkBAIC00NzUsOSArNDczLDcgQEAKIAogCWRwcmludGsoIk5GUzogJTV1IGluaXRpYXRlZCBjb21taXQgY2FsbFxuIiwgZGF0YS0+dGFzay50a19waWQpOwogCi0JbG9ja19rZXJuZWwoKTsKIAlycGNfZXhlY3V0ZSgmZGF0YS0+dGFzayk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogfQogCiBzdGF0aWMgdm9pZCBuZnNfZGlyZWN0X3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqZHJlcSwgc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTQ5Nyw2ICs0OTMsNyBAQAogCQkJaWYgKGRyZXEtPmNvbW1pdF9kYXRhICE9IE5VTEwpCiAJCQkJbmZzX2NvbW1pdF9mcmVlKGRyZXEtPmNvbW1pdF9kYXRhKTsKIAkJCW5mc19kaXJlY3RfZnJlZV93cml0ZWRhdGEoZHJlcSk7CisJCQluZnNfemFwX21hcHBpbmcoaW5vZGUsIGlub2RlLT5pX21hcHBpbmcpOwogCQkJbmZzX2RpcmVjdF9jb21wbGV0ZShkcmVxKTsKIAl9CiB9CkBAIC01MTcsNiArNTE0LDcgQEAKIHsKIAluZnNfZW5kX2RhdGFfdXBkYXRlKGlub2RlKTsKIAluZnNfZGlyZWN0X2ZyZWVfd3JpdGVkYXRhKGRyZXEpOworCW5mc196YXBfbWFwcGluZyhpbm9kZSwgaW5vZGUtPmlfbWFwcGluZyk7CiAJbmZzX2RpcmVjdF9jb21wbGV0ZShkcmVxKTsKIH0KICNlbmRpZgpAQCAtNTMyLDEwICs1MzAsMTIgQEAKIAogCXNwaW5fbG9jaygmZHJlcS0+bG9jayk7CiAKLQlpZiAobGlrZWx5KHN0YXR1cyA+PSAwKSkKLQkJZHJlcS0+Y291bnQgKz0gZGF0YS0+cmVzLmNvdW50OwotCWVsc2UKLQkJZHJlcS0+ZXJyb3IgPSB0YXNrLT50a19zdGF0dXM7CisJaWYgKHVubGlrZWx5KHN0YXR1cyA8IDApKSB7CisJCWRyZXEtPmVycm9yID0gc3RhdHVzOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZHJlcS0+Y291bnQgKz0gZGF0YS0+cmVzLmNvdW50OwogCiAJaWYgKGRhdGEtPnJlcy52ZXJmLT5jb21taXR0ZWQgIT0gTkZTX0ZJTEVfU1lOQykgewogCQlzd2l0Y2ggKGRyZXEtPmZsYWdzKSB7CkBAIC01NTAsNyArNTUwLDcgQEAKIAkJCQl9CiAJCX0KIAl9Ci0KK291dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmRyZXEtPmxvY2spOwogfQogCkBAIC02MzcsOSArNjM3LDcgQEAKIAkJZGF0YS0+dGFzay50a19wcmlvcml0eSA9IFJQQ19QUklPUklUWV9OT1JNQUw7CiAJCWRhdGEtPnRhc2sudGtfY29va2llID0gKHVuc2lnbmVkIGxvbmcpIGlub2RlOwogCi0JCWxvY2tfa2VybmVsKCk7CiAJCXJwY19leGVjdXRlKCZkYXRhLT50YXNrKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCiAJCWRmcHJpbnRrKFZGUywgIk5GUzogJTV1IGluaXRpYXRlZCBkaXJlY3Qgd3JpdGUgY2FsbCAocmVxICVzLyVMZCwgJXp1IGJ5dGVzIEAgb2Zmc2V0ICVMdSlcbiIsCiAJCQkJZGF0YS0+dGFzay50a19waWQsCkBAIC03MzYsOCArNzM0LDggQEAKIAlzaXplX3QgY291bnQgPSBpb3ZbMF0uaW92X2xlbjsKIAogCWRwcmludGsoIm5mczogZGlyZWN0IHJlYWQoJXMvJXMsICVsdUAlTGQpXG4iLAotCQlmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAotCQlmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKKwkJZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCSh1bnNpZ25lZCBsb25nKSBjb3VudCwgKGxvbmcgbG9uZykgcG9zKTsKIAogCWlmIChucl9zZWdzICE9IDEpCkBAIC04MDAsOCArNzk4LDggQEAKIAlzaXplX3QgY291bnQgPSBpb3ZbMF0uaW92X2xlbjsKIAogCWRmcHJpbnRrKFZGUywgIm5mczogZGlyZWN0IHdyaXRlKCVzLyVzLCAlbHVAJUxkKVxuIiwKLQkJZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKLQkJZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lLAorCQlmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsCisJCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAogCQkodW5zaWduZWQgbG9uZykgY291bnQsIChsb25nIGxvbmcpIHBvcyk7CiAKIAlpZiAobnJfc2VncyAhPSAxKQpAQCAtODI4LDE3ICs4MjYsNiBAQAogCiAJcmV0dmFsID0gbmZzX2RpcmVjdF93cml0ZShpb2NiLCAodW5zaWduZWQgbG9uZykgYnVmLCBjb3VudCwgcG9zKTsKIAotCS8qCi0JICogWFhYOiBuZnNfZW5kX2RhdGFfdXBkYXRlKCkgYWxyZWFkeSBlbnN1cmVzIHRoaXMgZmlsZSdzCi0JICogICAgICBjYWNoZWQgZGF0YSBpcyBzdWJzZXF1ZW50bHkgaW52YWxpZGF0ZWQuICBEbyB3ZSByZWFsbHkKLQkgKiAgICAgIG5lZWQgdG8gY2FsbCBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMigpIGFnYWluIGhlcmU/Ci0JICoKLQkgKiAgICAgIEZvciBhaW8gd3JpdGVzLCB0aGlzIGludmFsaWRhdGlvbiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKLQkgKiAgICAgIG9jY3VyIGJlZm9yZSB0aGUgd3JpdGVzIGNvbXBsZXRlLiAgS2luZCBvZiByYWNleS4KLQkgKi8KLQlpZiAobWFwcGluZy0+bnJwYWdlcykKLQkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIobWFwcGluZyk7Ci0KIAlpZiAocmV0dmFsID4gMCkKIAkJaW9jYi0+a2lfcG9zID0gcG9zICsgcmV0dmFsOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvZmlsZS5jIGIvZnMvbmZzL2ZpbGUuYwppbmRleCBjYzkzODY1Li4wZGQ2YmUzIDEwMDY0NAotLS0gYS9mcy9uZnMvZmlsZS5jCisrKyBiL2ZzL25mcy9maWxlLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogbmZzX2ZpbGVfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCiB7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50CQlzdGF0dXM7CiAKIAlkZnByaW50ayhWRlMsICJuZnM6IGZsdXNoKCVzLyVsZClcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOwpAQCAtMjAxLDcgKzIwMSw3IEBACiBuZnNfZmlsZV9yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCiAJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKIHsKLQlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gaW9jYi0+a2lfZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGlvY2ItPmtpX2ZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICogaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc3NpemVfdCByZXN1bHQ7CiAJc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwpAQCAtMjI2LDcgKzIyNiw3IEBACiBuZnNfZmlsZV9zZW5kZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90ICpwcG9zLCBzaXplX3QgY291bnQsCiAJCXJlYWRfYWN0b3JfdCBhY3Rvciwgdm9pZCAqdGFyZ2V0KQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzc2l6ZV90IHJlczsKIApAQCAtMjQzLDcgKzI0Myw3IEBACiBzdGF0aWMgaW50CiBuZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQJc3RhdHVzOwogCkBAIC0zMDcsMjggKzMwNywyOCBAQAogCiBzdGF0aWMgdm9pZCBuZnNfaW52YWxpZGF0ZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQorCWlmIChvZmZzZXQgIT0gMCkKKwkJcmV0dXJuOwogCS8qIENhbmNlbCBhbnkgdW5zdGFydGVkIHdyaXRlcyBvbiB0aGlzIHBhZ2UgKi8KLQlpZiAob2Zmc2V0ID09IDApCi0JCW5mc19zeW5jX2lub2RlX3dhaXQoaW5vZGUsIHBhZ2UtPmluZGV4LCAxLCBGTFVTSF9JTlZBTElEQVRFKTsKKwluZnNfd2JfcGFnZV9wcmlvcml0eShwYWdlLT5tYXBwaW5nLT5ob3N0LCBwYWdlLCBGTFVTSF9JTlZBTElEQVRFKTsKIH0KIAogc3RhdGljIGludCBuZnNfcmVsZWFzZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnApCiB7Ci0JaWYgKGdmcCAmIF9fR0ZQX0ZTKQotCQlyZXR1cm4gIW5mc193Yl9wYWdlKHBhZ2UtPm1hcHBpbmctPmhvc3QsIHBhZ2UpOwotCWVsc2UKLQkJLyoKLQkJICogQXZvaWQgZGVhZGxvY2sgb24gbmZzX3dhaXRfb25fcmVxdWVzdCgpLgotCQkgKi8KKwkvKgorCSAqIEF2b2lkIGRlYWRsb2NrIG9uIG5mc193YWl0X29uX3JlcXVlc3QoKS4KKwkgKi8KKwlpZiAoIShnZnAgJiBfX0dGUF9GUykpCiAJCXJldHVybiAwOworCS8qIEhhY2suLi4gRm9yY2UgbmZzX3diX3BhZ2UoKSB0byB3cml0ZSBvdXQgdGhlIHBhZ2UgKi8KKwlTZXRQYWdlRGlydHkocGFnZSk7CisJcmV0dXJuICFuZnNfd2JfcGFnZShwYWdlLT5tYXBwaW5nLT5ob3N0LCBwYWdlKTsKIH0KIAogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBuZnNfZmlsZV9hb3BzID0gewogCS5yZWFkcGFnZSA9IG5mc19yZWFkcGFnZSwKIAkucmVhZHBhZ2VzID0gbmZzX3JlYWRwYWdlcywKLQkuc2V0X3BhZ2VfZGlydHkgPSBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycywKKwkuc2V0X3BhZ2VfZGlydHkgPSBuZnNfc2V0X3BhZ2VfZGlydHksCiAJLndyaXRlcGFnZSA9IG5mc193cml0ZXBhZ2UsCiAJLndyaXRlcGFnZXMgPSBuZnNfd3JpdGVwYWdlcywKIAkucHJlcGFyZV93cml0ZSA9IG5mc19wcmVwYXJlX3dyaXRlLApAQCAtMzQzLDcgKzM0Myw3IEBACiBzdGF0aWMgc3NpemVfdCBuZnNfZmlsZV93cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAogCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKIHsKLQlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gaW9jYi0+a2lfZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGlvY2ItPmtpX2ZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICogaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc3NpemVfdCByZXN1bHQ7CiAJc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwpAQCAtMzc1LDYgKzM3NSwxMiBAQAogCiAJbmZzX2FkZF9zdGF0cyhpbm9kZSwgTkZTSU9TX05PUk1BTFdSSVRURU5CWVRFUywgY291bnQpOwogCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOworCS8qIFJldHVybiBlcnJvciB2YWx1ZXMgZm9yIE9fU1lOQyBhbmQgSVNfU1lOQygpICovCisJaWYgKHJlc3VsdCA+PSAwICYmIChJU19TWU5DKGlub2RlKSB8fCAoaW9jYi0+a2lfZmlscC0+Zl9mbGFncyAmIE9fU1lOQykpKSB7CisJCWludCBlcnIgPSBuZnNfZnN5bmMoaW9jYi0+a2lfZmlscCwgZGVudHJ5LCAxKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXN1bHQgPSBlcnI7CisJfQogb3V0OgogCXJldHVybiByZXN1bHQ7CiAKQEAgLTUyOSw4ICs1MzUsOCBAQAogc3RhdGljIGludCBuZnNfZmxvY2soc3RydWN0IGZpbGUgKmZpbHAsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQogewogCWRwcmludGsoIk5GUzogbmZzX2Zsb2NrKGY9JXMvJWxkLCB0PSV4LCBmbD0leClcbiIsCi0JCQlmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKLQkJCWZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubywKKwkJCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQlmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2lubywKIAkJCWZsLT5mbF90eXBlLCBmbC0+ZmxfZmxhZ3MpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL25mcy9nZXRyb290LmMgYi9mcy9uZnMvZ2V0cm9vdC5jCmluZGV4IDIwYzZmMzkuLjgzOTFiZDcgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9nZXRyb290LmMKKysrIGIvZnMvbmZzL2dldHJvb3QuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25mc19pZG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0jaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CmRpZmYgLS1naXQgYS9mcy9uZnMvaWRtYXAuYyBiL2ZzL25mcy9pZG1hcC5jCmluZGV4IDgyYWQ3MTEuLjlkNGE2YjIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pZG1hcC5jCisrKyBiL2ZzL25mcy9pZG1hcC5jCkBAIC0zNzcsNyArMzc3LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBpZG1hcF9waXBlX2Rvd25jYWxsKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBzaXplX3QgbWxlbikKIHsKLSAgICAgICAgc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKyAgICAgICAgc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBpZG1hcCAqaWRtYXAgPSAoc3RydWN0IGlkbWFwICopcnBjaS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgaWRtYXBfbXNnIGltX2luLCAqaW0gPSAmaWRtYXAtPmlkbWFwX2ltOwogCXN0cnVjdCBpZG1hcF9oYXNodGFibGUgKmg7CmRpZmYgLS1naXQgYS9mcy9uZnMvaW5vZGUuYyBiL2ZzL25mcy9pbm9kZS5jCmluZGV4IGJjOTM3NmMuLjYzZTQ3MDIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbm9kZS5jCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC01NSw3ICs1NSw3IEBACiAKIHN0YXRpYyB2b2lkIG5mc196YXBfYWNsX2NhY2hlKHN0cnVjdCBpbm9kZSAqKTsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIG5mc19pbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKiBuZnNfaW5vZGVfY2FjaGVwOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIG5mc19mYXR0cl90b19pbm9fdChzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKQEAgLTEzMSw2ICsxMzEsMTUgQEAKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiB9CiAKK3ZvaWQgbmZzX3phcF9tYXBwaW5nKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQoreworCWlmIChtYXBwaW5nLT5ucnBhZ2VzICE9IDApIHsKKwkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJTkZTX0koaW5vZGUpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfREFUQTsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCX0KK30KKwogc3RhdGljIHZvaWQgbmZzX3phcF9hY2xfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAl2b2lkICgqY2xlYXJfYWNsX2NhY2hlKShzdHJ1Y3QgaW5vZGUgKik7CkBAIC00MTMsNyArNDIyLDcgQEAKIAlpbnQgZXJyOwogCiAJLyogRmx1c2ggb3V0IHdyaXRlcyB0byB0aGUgc2VydmVyIGluIG9yZGVyIHRvIHVwZGF0ZSBjL210aW1lICovCi0JbmZzX3N5bmNfaW5vZGVfd2FpdChpbm9kZSwgMCwgMCwgRkxVU0hfTk9DT01NSVQpOworCW5mc19zeW5jX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgMCwgMCwgRkxVU0hfTk9DT01NSVQpOwogCiAJLyoKIAkgKiBXZSBtYXkgZm9yY2UgYSBnZXRhdHRyIGlmIHRoZSB1c2VyIGNhcmVzIGFib3V0IGF0aW1lLgpAQCAtNDg3LDcgKzQ5Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIG5mc19maWxlX3NldF9vcGVuX2NvbnRleHQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBnZXRfbmZzX29wZW5fY29udGV4dChjdHgpOwpAQCAtNTE5LDcgKzUyOCw3IEBACiAKIHN0YXRpYyB2b2lkIG5mc19maWxlX2NsZWFyX29wZW5fY29udGV4dChzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKIAogCWlmIChjdHgpIHsKQEAgLTU0Miw3ICs1NTEsNyBAQAogCWNyZWQgPSBycGNhdXRoX2xvb2t1cGNyZWQoTkZTX0NMSUVOVChpbm9kZSktPmNsX2F1dGgsIDApOwogCWlmIChJU19FUlIoY3JlZCkpCiAJCXJldHVybiBQVFJfRVJSKGNyZWQpOwotCWN0eCA9IGFsbG9jX25mc19vcGVuX2NvbnRleHQoZmlscC0+Zl92ZnNtbnQsIGZpbHAtPmZfZGVudHJ5LCBjcmVkKTsKKwljdHggPSBhbGxvY19uZnNfb3Blbl9jb250ZXh0KGZpbHAtPmZfcGF0aC5tbnQsIGZpbHAtPmZfcGF0aC5kZW50cnksIGNyZWQpOwogCXB1dF9ycGNjcmVkKGNyZWQpOwogCWlmIChjdHggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NzQsNyArNTgzLDcgQEAKIAogCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19JTk9ERVJFVkFMSURBVEUpOwogCWxvY2tfa2VybmVsKCk7Ci0JaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKQorCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQogIAkJZ290byBvdXRfbm93YWl0OwogCWlmIChORlNfU1RBTEUoaW5vZGUpKQogIAkJZ290byBvdXRfbm93YWl0OwpAQCAtNjcxLDEzICs2ODAsMjAgQEAKIAlpZiAoKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgTkZTX0lOT19SRVZBTF9QQUdFQ0FDSEUpCiAJCQl8fCBuZnNfYXR0cmlidXRlX3RpbWVvdXQoaW5vZGUpKQogCQlyZXQgPSBfX25mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OwogCiAJaWYgKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgTkZTX0lOT19JTlZBTElEX0RBVEEpIHsKLQkJbmZzX2luY19zdGF0cyhpbm9kZSwgTkZTSU9TX0RBVEFJTlZBTElEQVRFKTsKLQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCi0JCQluZnNfc3luY19tYXBwaW5nKG1hcHBpbmcpOwotCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMihtYXBwaW5nKTsKLQorCQlpZiAobWFwcGluZy0+bnJwYWdlcyAhPSAwKSB7CisJCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQkJCXJldCA9IG5mc19zeW5jX21hcHBpbmcobWFwcGluZyk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmV0ID0gaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIobWFwcGluZyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQogCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCQluZnNpLT5jYWNoZV92YWxpZGl0eSAmPSB+TkZTX0lOT19JTlZBTElEX0RBVEE7CiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CkBAIC02ODcsMTAgKzcwMywxMiBAQAogCQl9CiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAorCQluZnNfaW5jX3N0YXRzKGlub2RlLCBORlNJT1NfREFUQUlOVkFMSURBVEUpOwogCQlkZnByaW50ayhQQUdFQ0FDSEUsICJORlM6ICglcy8lTGQpIGRhdGEgY2FjaGUgaW52YWxpZGF0ZWRcbiIsCiAJCQkJaW5vZGUtPmlfc2ItPnNfaWQsCiAJCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSk7CiAJfQorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwNjIsNyArMTA4MCw3IEBACiBzdHJ1Y3QgaW5vZGUgKm5mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2k7Ci0JbmZzaSA9IChzdHJ1Y3QgbmZzX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhuZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJbmZzaSA9IChzdHJ1Y3QgbmZzX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhuZnNfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5mc2kpCiAJCXJldHVybiBOVUxMOwogCW5mc2ktPmZsYWdzID0gMFVMOwpAQCAtMTA5Myw3ICsxMTExLDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSAoc3RydWN0IG5mc19pbm9kZSAqKSBmb287CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9pbnRlcm5hbC5oIGIvZnMvbmZzL2ludGVybmFsLmgKaW5kZXggYmVhMGIwMS4uYTI4ZjZjZSAxMDA2NDQKLS0tIGEvZnMvbmZzL2ludGVybmFsLmgKKysrIGIvZnMvbmZzL2ludGVybmFsLmgKQEAgLTkzLDE1ICs5MywxNSBAQAogLyogbmZzMnhkci5jICovCiBleHRlcm4gaW50IG5mc19zdGF0X3RvX2Vycm5vKGludCk7CiBleHRlcm4gc3RydWN0IHJwY19wcm9jaW5mbyBuZnNfcHJvY2VkdXJlc1tdOwotZXh0ZXJuIHUzMiAqIG5mc19kZWNvZGVfZGlyZW50KHUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CitleHRlcm4gX19iZTMyICogbmZzX2RlY29kZV9kaXJlbnQoX19iZTMyICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKIAogLyogbmZzM3hkci5jICovCiBleHRlcm4gc3RydWN0IHJwY19wcm9jaW5mbyBuZnMzX3Byb2NlZHVyZXNbXTsKLWV4dGVybiB1MzIgKm5mczNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOworZXh0ZXJuIF9fYmUzMiAqbmZzM19kZWNvZGVfZGlyZW50KF9fYmUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CiAKIC8qIG5mczR4ZHIuYyAqLwogI2lmZGVmIENPTkZJR19ORlNfVjQKLWV4dGVybiB1MzIgKm5mczRfZGVjb2RlX2RpcmVudCh1MzIgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cyk7CitleHRlcm4gX19iZTMyICpuZnM0X2RlY29kZV9kaXJlbnQoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpOwogI2VuZGlmCiAKIC8qIG5mczRwcm9jLmMgKi8KQEAgLTIxNywzICsyMTcsMjEgQEAKIAlpZiAoc2ItPnNfbWF4Ynl0ZXMgPiBNQVhfTEZTX0ZJTEVTSVpFIHx8IHNiLT5zX21heGJ5dGVzIDw9IDApCiAJCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKIH0KKworLyoKKyAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdGhlIHBhZ2UgY29udGFpbnMKKyAqLworc3RhdGljIGlubGluZQordW5zaWduZWQgaW50IG5mc19wYWdlX2xlbmd0aChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlsb2ZmX3QgaV9zaXplID0gaV9zaXplX3JlYWQocGFnZS0+bWFwcGluZy0+aG9zdCk7CisKKwlpZiAoaV9zaXplID4gMCkgeworCQlwZ29mZl90IGVuZF9pbmRleCA9IChpX3NpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlpZiAocGFnZS0+aW5kZXggPCBlbmRfaW5kZXgpCisJCQlyZXR1cm4gUEFHRV9DQUNIRV9TSVpFOworCQlpZiAocGFnZS0+aW5kZXggPT0gZW5kX2luZGV4KQorCQkJcmV0dXJuICgoaV9zaXplIC0gMSkgJiB+UEFHRV9DQUNIRV9NQVNLKSArIDE7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL21vdW50X2NsbnQuYyBiL2ZzL25mcy9tb3VudF9jbG50LmMKaW5kZXggZDUwN2IwMi4uZjc1ZmU3MiAxMDA2NDQKLS0tIGEvZnMvbmZzL21vdW50X2NsbnQuYworKysgYi9mcy9uZnMvbW91bnRfY2xudC5jCkBAIC05NSw3ICs5NSw3IEBACiAgKiBYRFIgZW5jb2RlL2RlY29kZSBmdW5jdGlvbnMgZm9yIE1PVU5UCiAgKi8KIHN0YXRpYyBpbnQKLXhkcl9lbmNvZGVfZGlycGF0aChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBjb25zdCBjaGFyICpwYXRoKQoreGRyX2VuY29kZV9kaXJwYXRoKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAJcCA9IHhkcl9lbmNvZGVfc3RyaW5nKHAsIHBhdGgpOwogCkBAIC0xMDQsNyArMTA0LDcgQEAKIH0KIAogc3RhdGljIGludAoteGRyX2RlY29kZV9maHN0YXR1cyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbW50X2Zoc3RhdHVzICpyZXMpCit4ZHJfZGVjb2RlX2Zoc3RhdHVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBtbnRfZmhzdGF0dXMgKnJlcykKIHsKIAlzdHJ1Y3QgbmZzX2ZoICpmaCA9IHJlcy0+Zmg7CiAKQEAgLTExNiw3ICsxMTYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci14ZHJfZGVjb2RlX2Zoc3RhdHVzMyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbW50X2Zoc3RhdHVzICpyZXMpCit4ZHJfZGVjb2RlX2Zoc3RhdHVzMyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbW50X2Zoc3RhdHVzICpyZXMpCiB7CiAJc3RydWN0IG5mc19maCAqZmggPSByZXMtPmZoOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvbmFtZXNwYWNlLmMgYi9mcy9uZnMvbmFtZXNwYWNlLmMKaW5kZXggZWMxMTE0Yi4uMzcxYjgwNCAxMDA2NDQKLS0tIGEvZnMvbmZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25mcy9uYW1lc3BhY2UuYwpAQCAtMTgsMTAgKzE4LDEwIEBACiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfVkZTCiAKLXN0YXRpYyB2b2lkIG5mc19leHBpcmVfYXV0b21vdW50cyh2b2lkICpsaXN0KTsKK3N0YXRpYyB2b2lkIG5mc19leHBpcmVfYXV0b21vdW50cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBMSVNUX0hFQUQobmZzX2F1dG9tb3VudF9saXN0KTsKLXN0YXRpYyBERUNMQVJFX1dPUksobmZzX2F1dG9tb3VudF90YXNrLCBuZnNfZXhwaXJlX2F1dG9tb3VudHMsICZuZnNfYXV0b21vdW50X2xpc3QpOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKG5mc19hdXRvbW91bnRfdGFzaywgbmZzX2V4cGlyZV9hdXRvbW91bnRzKTsKIGludCBuZnNfbW91bnRwb2ludF9leHBpcnlfdGltZW91dCA9IDUwMCAqIEhaOwogCiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpuZnNfZG9fc3VibW91bnQoY29uc3Qgc3RydWN0IHZmc21vdW50ICptbnRfcGFyZW50LApAQCAtMTY0LDkgKzE2NCw5IEBACiAJLmZvbGxvd19saW5rCT0gbmZzX2ZvbGxvd19tb3VudHBvaW50LAogfTsKIAotc3RhdGljIHZvaWQgbmZzX2V4cGlyZV9hdXRvbW91bnRzKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBuZnNfZXhwaXJlX2F1dG9tb3VudHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9ICZuZnNfYXV0b21vdW50X2xpc3Q7CiAKIAltYXJrX21vdW50c19mb3JfZXhwaXJ5KGxpc3QpOwogCWlmICghbGlzdF9lbXB0eShsaXN0KSkKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMyeGRyLmMgYi9mcy9uZnMvbmZzMnhkci5jCmluZGV4IGI0OTUwMWYuLjNiZTRlNzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMyeGRyLmMKKysrIGIvZnMvbmZzL25mczJ4ZHIuYwpAQCAtNjYsMTUgKzY2LDE1IEBACiAvKgogICogQ29tbW9uIE5GUyBYRFIgZnVuY3Rpb25zIGFzIGlubGluZXMKICAqLwotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2VuY29kZV9maGFuZGxlKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9lbmNvZGVfZmhhbmRsZShfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJbWVtY3B5KHAsIGZoYW5kbGUtPmRhdGEsIE5GUzJfRkhTSVpFKTsKIAlyZXR1cm4gcCArIFhEUl9RVUFETEVOKE5GUzJfRkhTSVpFKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2RlY29kZV9maGFuZGxlKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9kZWNvZGVfZmhhbmRsZShfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJLyogTkZTdjIgaGFuZGxlcyBoYXZlIGEgZml4ZWQgbGVuZ3RoICovCiAJZmhhbmRsZS0+c2l6ZSA9IE5GUzJfRkhTSVpFOwpAQCAtODIsOCArODIsOCBAQAogCXJldHVybiBwICsgWERSX1FVQURMRU4oTkZTMl9GSFNJWkUpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMioKLXhkcl9lbmNvZGVfdGltZSh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCitzdGF0aWMgaW5saW5lIF9fYmUzMioKK3hkcl9lbmNvZGVfdGltZShfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCiB7CiAJKnArKyA9IGh0b25sKHRpbWVwLT50dl9zZWMpOwogCS8qIENvbnZlcnQgbmFub3NlY29uZHMgaW50byBtaWNyb3NlY29uZHMgKi8KQEAgLTkxLDggKzkxLDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIqCi14ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUodTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQorc3RhdGljIGlubGluZSBfX2JlMzIqCit4ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQogewogCS8qCiAJICogUGFzc2luZyB0aGUgaW52YWxpZCB2YWx1ZSB1c2Vjb25kcz0xMDAwMDAwIGlzIGEKQEAgLTEwOCw4ICsxMDgsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMioKLXhkcl9kZWNvZGVfdGltZSh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCitzdGF0aWMgaW5saW5lIF9fYmUzMioKK3hkcl9kZWNvZGVfdGltZShfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCiB7CiAJdGltZXAtPnR2X3NlYyA9IG50b2hsKCpwKyspOwogCS8qIENvbnZlcnQgbWljcm9zZWNvbmRzIGludG8gbmFub3NlY29uZHMgKi8KQEAgLTExNyw4ICsxMTcsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdTMyICoKLXhkcl9kZWNvZGVfZmF0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBfX2JlMzIgKgoreGRyX2RlY29kZV9mYXR0cihfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCXUzMiByZGV2OwogCWZhdHRyLT50eXBlID0gKGVudW0gbmZzX2Z0eXBlKSBudG9obCgqcCsrKTsKQEAgLTE0NiwxMCArMTQ2LDEwIEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLXhkcl9lbmNvZGVfc2F0dHIodTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCit4ZHJfZW5jb2RlX3NhdHRyKF9fYmUzMiAqcCwgc3RydWN0IGlhdHRyICphdHRyKQogewotCWNvbnN0IHUzMiBub3Rfc2V0ID0gX19jb25zdGFudF9odG9ubCgweEZGRkZGRkZGKTsKKwljb25zdCBfX2JlMzIgbm90X3NldCA9IF9fY29uc3RhbnRfaHRvbmwoMHhGRkZGRkZGRik7CiAKIAkqcCsrID0gKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSA/IGh0b25sKGF0dHItPmlhX21vZGUpIDogbm90X3NldDsKIAkqcCsrID0gKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpID8gaHRvbmwoYXR0ci0+aWFfdWlkKSA6IG5vdF9zZXQ7CkBAIC0xODQsNyArMTg0LDcgQEAKICAqIEdFVEFUVFIsIFJFQURMSU5LLCBTVEFURlMKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9maGFuZGxlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQorbmZzX3hkcl9maGFuZGxlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgZmgpOwogCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKQEAgLTE5NSw3ICsxOTUsNyBAQAogICogRW5jb2RlIFNFVEFUVFIgYXJndW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfc2F0dHJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfc2F0dHJhcmdzICphcmdzKQorbmZzX3hkcl9zYXR0cmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zYXR0cmFyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CiAJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAgKiBMT09LVVAsIFJFTU9WRSwgUk1ESVIKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9kaXJvcGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19kaXJvcGFyZ3MgKmFyZ3MpCituZnNfeGRyX2Rpcm9wYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Rpcm9wYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAgKiBleGFjdGx5IHRvIHRoZSBwYWdlIHdlIHdhbnQgdG8gZmV0Y2guCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK25mc194ZHJfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CiAJdW5zaWduZWQgaW50IHJlcGxlbjsKQEAgLTI0Niw3ICsyNDYsNyBAQAogICogRGVjb2RlIFJFQUQgcmVwbHkKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQorbmZzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQogewogCXN0cnVjdCBrdmVjICppb3YgPSByZXEtPnJxX3Jjdl9idWYuaGVhZDsKIAlpbnQJc3RhdHVzLCBjb3VudCwgcmVjdmQsIGhkcmxlbjsKQEAgLTI4Niw3ICsyODYsNyBAQAogICogV3JpdGUgYXJndW1lbnRzLiBTcGxpY2UgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIGludG8gdGhlIGlvdmVjLgogICovCiBzdGF0aWMgaW50Ci1uZnNfeGRyX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK25mc194ZHJfd3JpdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOwogCXUzMiBvZmZzZXQgPSAodTMyKWFyZ3MtPm9mZnNldDsKQEAgLTMwOSw3ICszMDksNyBAQAogICogQ1JFQVRFLCBNS0RJUgogICovCiBzdGF0aWMgaW50Ci1uZnNfeGRyX2NyZWF0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19jcmVhdGVhcmdzICphcmdzKQorbmZzX3hkcl9jcmVhdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY3JlYXRlYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwpAQCAtMzIyLDcgKzMyMiw3IEBACiAgKiBFbmNvZGUgUkVOQU1FIGFyZ3VtZW50cwogICovCiBzdGF0aWMgaW50Ci1uZnNfeGRyX3JlbmFtZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZW5hbWVhcmdzICphcmdzKQorbmZzX3hkcl9yZW5hbWVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZyb21maCk7CiAJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+ZnJvbW5hbWUsIGFyZ3MtPmZyb21sZW4pOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAgKiBFbmNvZGUgTElOSyBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2xpbmthcmdzICphcmdzKQorbmZzX3hkcl9saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xpbmthcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPnRvZmgpOwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAgKiBFbmNvZGUgU1lNTElOSyBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3N5bWxpbmthcmdzICphcmdzKQorbmZzX3hkcl9zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3N5bWxpbmthcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOwogCXNpemVfdCBwYWQ7CkBAIC0zNzgsNyArMzc4LDcgQEAKICAqIEVuY29kZSBhcmd1bWVudHMgdG8gcmVhZGRpciBjYWxsCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGRpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkZGlyYXJncyAqYXJncykKK25mc194ZHJfcmVhZGRpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkZGlyYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2sgPSByZXEtPnJxX3Rhc2s7CiAJc3RydWN0IHJwY19hdXRoCSphdXRoID0gdGFzay0+dGtfYXV0aDsKQEAgLTQwNCw3ICs0MDQsNyBAQAogICogZnJvbSBuZnNfcmVhZGRpciBmb3IgZWFjaCBlbnRyeS4KICAqLwogc3RhdGljIGludAotbmZzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHZvaWQgKmR1bW15KQorbmZzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwogCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CkBAIC00MTIsNyArNDEyLDcgQEAKIAlpbnQgaGRybGVuLCByZWN2ZDsKIAlpbnQgc3RhdHVzLCBucjsKIAl1bnNpZ25lZCBpbnQgbGVuLCBwZ2xlbjsKLQl1MzIgKmVuZCwgKmVudHJ5LCAqa2FkZHI7CisJX19iZTMyICplbmQsICplbnRyeSwgKmthZGRyOwogCiAJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCiAJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKQEAgLTQzMiw4ICs0MzIsOCBAQAogCWlmIChwZ2xlbiA+IHJlY3ZkKQogCQlwZ2xlbiA9IHJlY3ZkOwogCXBhZ2UgPSByY3ZidWYtPnBhZ2VzOwotCWthZGRyID0gcCA9ICh1MzIgKilrbWFwX2F0b21pYygqcGFnZSwgS01fVVNFUjApOwotCWVuZCA9ICh1MzIgKikoKGNoYXIgKilwICsgcGdsZW4pOworCWthZGRyID0gcCA9IGttYXBfYXRvbWljKCpwYWdlLCBLTV9VU0VSMCk7CisJZW5kID0gKF9fYmUzMiAqKSgoY2hhciAqKXAgKyBwZ2xlbik7CiAJZW50cnkgPSBwOwogCWZvciAobnIgPSAwOyAqcCsrOyBucisrKSB7CiAJCWlmIChwICsgMiA+IGVuZCkKQEAgLTQ2OCw4ICs0NjgsOCBAQAogCWdvdG8gb3V0OwogfQogCi11MzIgKgotbmZzX2RlY29kZV9kaXJlbnQodTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpCitfX2JlMzIgKgorbmZzX2RlY29kZV9kaXJlbnQoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpCiB7CiAJaWYgKCEqcCsrKSB7CiAJCWlmICghKnApCkBAIC00OTYsNyArNDk2LDcgQEAKICAqIERlY29kZSBzaW1wbGUgc3RhdHVzIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB2b2lkICpkdW1teSkKK25mc194ZHJfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlpbnQJc3RhdHVzOwogCkBAIC01MTAsNyArNTEwLDcgQEAKICAqIEdFVEFUVFIsIFNFVEFUVFIsIFdSSVRFCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfYXR0cnN0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCituZnNfeGRyX2F0dHJzdGF0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCWludAlzdGF0dXM7CiAKQEAgLTUyNSw3ICs1MjUsNyBAQAogICogTE9PS1VQLCBDUkVBVEUsIE1LRElSCiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfZGlyb3ByZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19kaXJvcG9rICpyZXMpCituZnNfeGRyX2Rpcm9wcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZGlyb3BvayAqcmVzKQogewogCWludAlzdGF0dXM7CiAKQEAgLTU0MCw3ICs1NDAsNyBAQAogICogRW5jb2RlIFJFQURMSU5LIGFyZ3MKICAqLwogc3RhdGljIGludAotbmZzX3hkcl9yZWFkbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkbGlua2FyZ3MgKmFyZ3MpCituZnNfeGRyX3JlYWRsaW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRsaW5rYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CiAJdW5zaWduZWQgaW50IHJlcGxlbjsKQEAgLTU1OCw3ICs1NTgsNyBAQAogICogRGVjb2RlIFJFQURMSU5LIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGxpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCituZnNfeGRyX3JlYWRsaW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwogCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CkBAIC02MDEsNyArNjAxLDcgQEAKICAqIERlY29kZSBXUklURSByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnNfeGRyX3dyaXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK25mc194ZHJfd3JpdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQogewogCXJlcy0+dmVyZi0+Y29tbWl0dGVkID0gTkZTX0ZJTEVfU1lOQzsKIAlyZXR1cm4gbmZzX3hkcl9hdHRyc3RhdChyZXEsIHAsIHJlcy0+ZmF0dHIpOwpAQCAtNjExLDcgKzYxMSw3IEBACiAgKiBEZWNvZGUgU1RBVEZTIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mc194ZHJfc3RhdGZzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMyX2Zzc3RhdCAqcmVzKQorbmZzX3hkcl9zdGF0ZnNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczJfZnNzdGF0ICpyZXMpCiB7CiAJaW50CXN0YXR1czsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczNwcm9jLmMgYi9mcy9uZnMvbmZzM3Byb2MuYwppbmRleCAzYjIzNGQ0Li5hY2Q4ZmU5IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM3Byb2MuYworKysgYi9mcy9uZnMvbmZzM3Byb2MuYwpAQCAtMjc2LDUxICsyNzYsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgbmZzM19wcm9jX3dyaXRlKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEpCi17Ci0JaW50CQkJcnBjZmxhZ3MgPSB3ZGF0YS0+ZmxhZ3M7Ci0Jc3RydWN0IGlub2RlICoJCWlub2RlID0gd2RhdGEtPmlub2RlOwotCXN0cnVjdCBuZnNfZmF0dHIgKglmYXR0ciA9IHdkYXRhLT5yZXMuZmF0dHI7Ci0Jc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKLQkJLnJwY19wcm9jCT0gJm5mczNfcHJvY2VkdXJlc1tORlMzUFJPQ19XUklURV0sCi0JCS5ycGNfYXJncAk9ICZ3ZGF0YS0+YXJncywKLQkJLnJwY19yZXNwCT0gJndkYXRhLT5yZXMsCi0JCS5ycGNfY3JlZAk9IHdkYXRhLT5jcmVkLAotCX07Ci0JaW50CQkJc3RhdHVzOwotCi0JZHByaW50aygiTkZTIGNhbGwgIHdyaXRlICVkIEAgJUxkXG4iLCB3ZGF0YS0+YXJncy5jb3VudCwKLQkJCShsb25nIGxvbmcpIHdkYXRhLT5hcmdzLm9mZnNldCk7Ci0JbmZzX2ZhdHRyX2luaXQoZmF0dHIpOwotCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChpbm9kZSksICZtc2csIHJwY2ZsYWdzKTsKLQlpZiAoc3RhdHVzID49IDApCi0JCW5mc19wb3N0X29wX3VwZGF0ZV9pbm9kZShpbm9kZSwgZmF0dHIpOwotCWRwcmludGsoIk5GUyByZXBseSB3cml0ZTogJWRcbiIsIHN0YXR1cyk7Ci0JcmV0dXJuIHN0YXR1cyA8IDA/IHN0YXR1cyA6IHdkYXRhLT5yZXMuY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgbmZzM19wcm9jX2NvbW1pdChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmNkYXRhKQotewotCXN0cnVjdCBpbm9kZSAqCQlpbm9kZSA9IGNkYXRhLT5pbm9kZTsKLQlzdHJ1Y3QgbmZzX2ZhdHRyICoJZmF0dHIgPSBjZGF0YS0+cmVzLmZhdHRyOwotCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7Ci0JCS5ycGNfcHJvYwk9ICZuZnMzX3Byb2NlZHVyZXNbTkZTM1BST0NfQ09NTUlUXSwKLQkJLnJwY19hcmdwCT0gJmNkYXRhLT5hcmdzLAotCQkucnBjX3Jlc3AJPSAmY2RhdGEtPnJlcywKLQkJLnJwY19jcmVkCT0gY2RhdGEtPmNyZWQsCi0JfTsKLQlpbnQJCQlzdGF0dXM7Ci0KLQlkcHJpbnRrKCJORlMgY2FsbCAgY29tbWl0ICVkIEAgJUxkXG4iLCBjZGF0YS0+YXJncy5jb3VudCwKLQkJCShsb25nIGxvbmcpIGNkYXRhLT5hcmdzLm9mZnNldCk7Ci0JbmZzX2ZhdHRyX2luaXQoZmF0dHIpOwotCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChpbm9kZSksICZtc2csIDApOwotCWlmIChzdGF0dXMgPj0gMCkKLQkJbmZzX3Bvc3Rfb3BfdXBkYXRlX2lub2RlKGlub2RlLCBmYXR0cik7Ci0JZHByaW50aygiTkZTIHJlcGx5IGNvbW1pdDogJWRcbiIsIHN0YXR1cyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQogLyoKICAqIENyZWF0ZSBhIHJlZ3VsYXIgZmlsZS4KICAqIEZvciBub3csIHdlIGRvbid0IGltcGxlbWVudCBPX0VYQ0wuCkBAIC0zNjksNyArMzI0LDcgQEAKIAogCS8qIElmIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBleGNsdXNpdmUgY3JlYXRpb24gc2VtYW50aWNzLAogCSAqIHRyeSBhZ2FpbiB3aXRoIHNpbXBsZSAnZ3VhcmRlZCcgbW9kZS4gKi8KLQlpZiAoc3RhdHVzID09IE5GU0VSUl9OT1RTVVBQKSB7CisJaWYgKHN0YXR1cyA9PSAtRU5PVFNVUFApIHsKIAkJc3dpdGNoIChhcmcuY3JlYXRlbW9kZSkgewogCQkJY2FzZSBORlMzX0NSRUFURV9FWENMVVNJVkU6CiAJCQkJYXJnLmNyZWF0ZW1vZGUgPSBORlMzX0NSRUFURV9HVUFSREVEOwpAQCAtNjY4LDcgKzYyMyw3IEBACiB7CiAJc3RydWN0IGlub2RlCQkqZGlyID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuZnNfZmF0dHIJZGlyX2F0dHI7Ci0JdTMyCQkJKnZlcmYgPSBORlNfQ09PS0lFVkVSRihkaXIpOworCV9fYmUzMgkJCSp2ZXJmID0gTkZTX0NPT0tJRVZFUkYoZGlyKTsKIAlzdHJ1Y3QgbmZzM19yZWFkZGlyYXJncwlhcmcgPSB7CiAJCS5maAkJPSBORlNfRkgoZGlyKSwKIAkJLmNvb2tpZQkJPSBjb29raWUsCkBAIC02OTAsOCArNjQ1LDYgQEAKIAl9OwogCWludAkJCXN0YXR1czsKIAotCWxvY2tfa2VybmVsKCk7Ci0KIAlpZiAocGx1cykKIAkJbXNnLnJwY19wcm9jID0gJm5mczNfcHJvY2VkdXJlc1tORlMzUFJPQ19SRUFERElSUExVU107CiAKQEAgLTcwMiw3ICs2NTUsNiBAQAogCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKIAluZnNfcmVmcmVzaF9pbm9kZShkaXIsICZkaXJfYXR0cik7CiAJZHByaW50aygiTkZTIHJlcGx5IHJlYWRkaXI6ICVkXG4iLCBzdGF0dXMpOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC04ODksNyArODQxLDcgQEAKIHN0YXRpYyBpbnQKIG5mczNfcHJvY19sb2NrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKLQlyZXR1cm4gbmxtY2xudF9wcm9jKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBjbWQsIGZsKTsKKwlyZXR1cm4gbmxtY2xudF9wcm9jKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsIGNtZCwgZmwpOwogfQogCiBjb25zdCBzdHJ1Y3QgbmZzX3JwY19vcHMgbmZzX3YzX2NsaWVudG9wcyA9IHsKQEAgLTkwNCw4ICs4NTYsNiBAQAogCS5hY2Nlc3MJCT0gbmZzM19wcm9jX2FjY2VzcywKIAkucmVhZGxpbmsJPSBuZnMzX3Byb2NfcmVhZGxpbmssCiAJLnJlYWQJCT0gbmZzM19wcm9jX3JlYWQsCi0JLndyaXRlCQk9IG5mczNfcHJvY193cml0ZSwKLQkuY29tbWl0CQk9IG5mczNfcHJvY19jb21taXQsCiAJLmNyZWF0ZQkJPSBuZnMzX3Byb2NfY3JlYXRlLAogCS5yZW1vdmUJCT0gbmZzM19wcm9jX3JlbW92ZSwKIAkudW5saW5rX3NldHVwCT0gbmZzM19wcm9jX3VubGlua19zZXR1cCwKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzeGRyLmMgYi9mcy9uZnMvbmZzM3hkci5jCmluZGV4IDE2NTU2ZmEuLjBhY2UwOTIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMzeGRyLmMKKysrIGIvZnMvbmZzL25mczN4ZHIuYwpAQCAtMTA1LDE0ICsxMDUsMTQgQEAKIC8qCiAgKiBDb21tb24gTkZTIFhEUiBmdW5jdGlvbnMgYXMgaW5saW5lcwogICovCi1zdGF0aWMgaW5saW5lIHUzMiAqCi14ZHJfZW5jb2RlX2ZoYW5kbGUodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9lbmNvZGVfZmhhbmRsZShfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQogewogCXJldHVybiB4ZHJfZW5jb2RlX2FycmF5KHAsIGZoLT5kYXRhLCBmaC0+c2l6ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLXhkcl9kZWNvZGVfZmhhbmRsZSh1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgoreGRyX2RlY29kZV9maGFuZGxlKF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCiB7CiAJaWYgKChmaC0+c2l6ZSA9IG50b2hsKCpwKyspKSA8PSBORlMzX0ZIU0laRSkgewogCQltZW1jcHkoZmgtPmRhdGEsIHAsIGZoLT5zaXplKTsKQEAgLTEyNCwyNCArMTI0LDI0IEBACiAvKgogICogRW5jb2RlL2RlY29kZSB0aW1lLgogICovCi1zdGF0aWMgaW5saW5lIHUzMiAqCi14ZHJfZW5jb2RlX3RpbWUzKHUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9lbmNvZGVfdGltZTMoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQogewogCSpwKysgPSBodG9ubCh0aW1lcC0+dHZfc2VjKTsKIAkqcCsrID0gaHRvbmwodGltZXAtPnR2X25zZWMpOwogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi14ZHJfZGVjb2RlX3RpbWUzKHUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9kZWNvZGVfdGltZTMoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQogewogCXRpbWVwLT50dl9zZWMgPSBudG9obCgqcCsrKTsKIAl0aW1lcC0+dHZfbnNlYyA9IG50b2hsKCpwKyspOwogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdTMyICoKLXhkcl9kZWNvZGVfZmF0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBfX2JlMzIgKgoreGRyX2RlY29kZV9mYXR0cihfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCXVuc2lnbmVkIGludAl0eXBlLCBtYWpvciwgbWlub3I7CiAJaW50CQlmbW9kZTsKQEAgLTE3Nyw4ICsxNzcsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi14ZHJfZW5jb2RlX3NhdHRyKHUzMiAqcCwgc3RydWN0IGlhdHRyICphdHRyKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgoreGRyX2VuY29kZV9zYXR0cihfX2JlMzIgKnAsIHN0cnVjdCBpYXR0ciAqYXR0cikKIHsKIAlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKIAkJKnArKyA9IHhkcl9vbmU7CkBAIC0yMjMsOCArMjIzLDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2RlY29kZV93Y2NfYXR0cih1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgoreGRyX2RlY29kZV93Y2NfYXR0cihfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+cHJlX3NpemUpOwogCXAgPSB4ZHJfZGVjb2RlX3RpbWUzKHAsICZmYXR0ci0+cHJlX210aW1lKTsKQEAgLTIzMywxNiArMjMzLDE2IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLXhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCitzdGF0aWMgaW5saW5lIF9fYmUzMiAqCit4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCWlmICgqcCsrKQogCQlwID0geGRyX2RlY29kZV9mYXR0cihwLCBmYXR0cik7CiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLXhkcl9kZWNvZGVfcHJlX29wX2F0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl9kZWNvZGVfcHJlX29wX2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAlpZiAoKnArKykKIAkJcmV0dXJuIHhkcl9kZWNvZGVfd2NjX2F0dHIocCwgZmF0dHIpOwpAQCAtMjUwLDggKzI1MCw4IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB1MzIgKgoteGRyX2RlY29kZV93Y2NfZGF0YSh1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorc3RhdGljIGlubGluZSBfX2JlMzIgKgoreGRyX2RlY29kZV93Y2NfZGF0YShfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCXAgPSB4ZHJfZGVjb2RlX3ByZV9vcF9hdHRyKHAsIGZhdHRyKTsKIAlyZXR1cm4geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgZmF0dHIpOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAgKiBFbmNvZGUgZmlsZSBoYW5kbGUgYXJndW1lbnQKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfZmhhbmRsZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK25mczNfeGRyX2ZoYW5kbGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBmaCk7CiAJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwpAQCAtMjc2LDcgKzI3Niw3IEBACiAgKiBFbmNvZGUgU0VUQVRUUiBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfc2F0dHJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3NhdHRyYXJncyAqYXJncykKK25mczNfeGRyX3NhdHRyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19zYXR0cmFyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CiAJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAgKiBFbmNvZGUgZGlyZWN0b3J5IG9wcyBhcmd1bWVudAogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9kaXJvcGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfZGlyb3BhcmdzICphcmdzKQorbmZzM194ZHJfZGlyb3BhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX2Rpcm9wYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwpAQCAtMzAzLDcgKzMwMyw3IEBACiAgKiBFbmNvZGUgYWNjZXNzKCkgYXJndW1lbnQKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfYWNjZXNzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19hY2Nlc3NhcmdzICphcmdzKQorbmZzM194ZHJfYWNjZXNzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19hY2Nlc3NhcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwogCSpwKysgPSBodG9ubChhcmdzLT5hY2Nlc3MpOwpAQCAtMzE3LDcgKzMxNyw3IEBACiAgKiBleGFjdGx5IHRvIHRoZSBwYWdlIHdlIHdhbnQgdG8gZmV0Y2guCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCituZnMzX3hkcl9yZWFkYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQogewogCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKIAl1bnNpZ25lZCBpbnQgcmVwbGVuOwpAQCAtMzM5LDcgKzMzOSw3IEBACiAgKiBXcml0ZSBhcmd1bWVudHMuIFNwbGljZSB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgaW92ZWMuCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK25mczNfeGRyX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX2J1ZiAqc25kYnVmID0gJnJlcS0+cnFfc25kX2J1ZjsKIAl1MzIgY291bnQgPSBhcmdzLT5jb3VudDsKQEAgLTM2MCw3ICszNjAsNyBAQAogICogRW5jb2RlIENSRUFURSBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfY3JlYXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19jcmVhdGVhcmdzICphcmdzKQorbmZzM194ZHJfY3JlYXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19jcmVhdGVhcmdzICphcmdzKQogewogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwogCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7CkBAIC0zODAsNyArMzgwLDcgQEAKICAqIEVuY29kZSBNS0RJUiBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfbWtkaXJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX21rZGlyYXJncyAqYXJncykKK25mczNfeGRyX21rZGlyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19ta2RpcmFyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CiAJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKQEAgLTM5Myw3ICszOTMsNyBAQAogICogRW5jb2RlIFNZTUxJTksgYXJndW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3N5bWxpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3N5bWxpbmthcmdzICphcmdzKQorbmZzM194ZHJfc3ltbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfc3ltbGlua2FyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOwogCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKQEAgLTQxMCw3ICs0MTAsNyBAQAogICogRW5jb2RlIE1LTk9EIGFyZ3VtZW50cwogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9ta25vZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfbWtub2RhcmdzICphcmdzKQorbmZzM194ZHJfbWtub2RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX21rbm9kYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwpAQCAtNDI5LDcgKzQyOSw3IEBACiAgKiBFbmNvZGUgUkVOQU1FIGFyZ3VtZW50cwogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9yZW5hbWVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3JlbmFtZWFyZ3MgKmFyZ3MpCituZnMzX3hkcl9yZW5hbWVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX3JlbmFtZWFyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOwogCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKQEAgLTQ0Myw3ICs0NDMsNyBAQAogICogRW5jb2RlIExJTksgYXJndW1lbnRzCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2xpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2xpbmthcmdzICphcmdzKQorbmZzM194ZHJfbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfbGlua2FyZ3MgKmFyZ3MpCiB7CiAJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOwogCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+dG9maCk7CkBAIC00NTYsNyArNDU2LDcgQEAKICAqIEVuY29kZSBhcmd1bWVudHMgdG8gcmVhZGRpciBjYWxsCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRkaXJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3JlYWRkaXJhcmdzICphcmdzKQorbmZzM194ZHJfcmVhZGRpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfcmVhZGRpcmFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOwogCXVuc2lnbmVkIGludCByZXBsZW47CkBAIC00ODUsNyArNDg1LDcgQEAKICAqIFdlIGp1c3QgY2hlY2sgZm9yIHN5bnRhY3RpY2FsIGNvcnJlY3RuZXNzLgogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3JlYWRkaXJyZXMgKnJlcykKK25mczNfeGRyX3JlYWRkaXJyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfcmVhZGRpcnJlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwogCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CkBAIC00OTMsNyArNDkzLDcgQEAKIAlpbnQgaGRybGVuLCByZWN2ZDsKIAlpbnQgc3RhdHVzLCBucjsKIAl1bnNpZ25lZCBpbnQgbGVuLCBwZ2xlbjsKLQl1MzIgKmVudHJ5LCAqZW5kLCAqa2FkZHI7CisJX19iZTMyICplbnRyeSwgKmVuZCwgKmthZGRyOwogCiAJc3RhdHVzID0gbnRvaGwoKnArKyk7CiAJLyogRGVjb2RlIHBvc3Rfb3BfYXR0cnMgKi8KQEAgLTUyMyw4ICs1MjMsOCBAQAogCWlmIChwZ2xlbiA+IHJlY3ZkKQogCQlwZ2xlbiA9IHJlY3ZkOwogCXBhZ2UgPSByY3ZidWYtPnBhZ2VzOwotCWthZGRyID0gcCA9ICh1MzIgKilrbWFwX2F0b21pYygqcGFnZSwgS01fVVNFUjApOwotCWVuZCA9ICh1MzIgKikoKGNoYXIgKilwICsgcGdsZW4pOworCWthZGRyID0gcCA9IGttYXBfYXRvbWljKCpwYWdlLCBLTV9VU0VSMCk7CisJZW5kID0gKF9fYmUzMiAqKSgoY2hhciAqKXAgKyBwZ2xlbik7CiAJZW50cnkgPSBwOwogCWZvciAobnIgPSAwOyAqcCsrOyBucisrKSB7CiAJCWlmIChwICsgMyA+IGVuZCkKQEAgLTU4Myw4ICs1ODMsOCBAQAogCWdvdG8gb3V0OwogfQogCi11MzIgKgotbmZzM19kZWNvZGVfZGlyZW50KHUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKQorX19iZTMyICoKK25mczNfZGVjb2RlX2RpcmVudChfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cykKIHsKIAlzdHJ1Y3QgbmZzX2VudHJ5IG9sZCA9ICplbnRyeTsKIApAQCAtNjI2LDcgKzYyNiw3IEBACiAgKiBFbmNvZGUgQ09NTUlUIGFyZ3VtZW50cwogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9jb21taXRhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQorbmZzM194ZHJfY29tbWl0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKIHsKIAlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKIAlwID0geGRyX2VuY29kZV9oeXBlcihwLCBhcmdzLT5vZmZzZXQpOwpAQCAtNjQwLDcgKzY0MCw3IEBACiAgKiBFbmNvZGUgR0VUQUNMIGFyZ3VtZW50cwogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9nZXRhY2xhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsCituZnMzX3hkcl9nZXRhY2xhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCiAJCSAgICBzdHJ1Y3QgbmZzM19nZXRhY2xhcmdzICphcmdzKQogewogCXN0cnVjdCBycGNfYXV0aCAqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKQEAgLTY2NCw3ICs2NjQsNyBAQAogICogRW5jb2RlIFNFVEFDTCBhcmd1bWVudHMKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfc2V0YWNsYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLAorbmZzM194ZHJfc2V0YWNsYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZnMzX3NldGFjbGFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9idWYgKmJ1ZiA9ICZyZXEtPnJxX3NuZF9idWY7CkBAIC03MTEsNyArNzExLDcgQEAKICAqIERlY29kZSBhdHRyc3RhdCByZXBseS4KICAqLwogc3RhdGljIGludAotbmZzM194ZHJfYXR0cnN0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCituZnMzX3hkcl9hdHRyc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAlpbnQJc3RhdHVzOwogCkBAIC03MjYsNyArNzI2LDcgQEAKICAqIFNBVFRSLCBSRU1PVkUsIFJNRElSCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3djY3N0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCituZnMzX3hkcl93Y2NzdGF0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCWludAlzdGF0dXM7CiAKQEAgLTc0MCw3ICs3NDAsNyBAQAogICogRGVjb2RlIExPT0tVUCByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9sb29rdXByZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfZGlyb3ByZXMgKnJlcykKK25mczNfeGRyX2xvb2t1cHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19kaXJvcHJlcyAqcmVzKQogewogCWludAlzdGF0dXM7CiAKQEAgLTc1OSw3ICs3NTksNyBAQAogICogRGVjb2RlIEFDQ0VTUyByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9hY2Nlc3NyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfYWNjZXNzcmVzICpyZXMpCituZnMzX3hkcl9hY2Nlc3NyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfYWNjZXNzcmVzICpyZXMpCiB7CiAJaW50CXN0YXR1cyA9IG50b2hsKCpwKyspOwogCkBAIC03NzEsNyArNzcxLDcgQEAKIH0KIAogc3RhdGljIGludAotbmZzM194ZHJfcmVhZGxpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3JlYWRsaW5rYXJncyAqYXJncykKK25mczNfeGRyX3JlYWRsaW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19yZWFkbGlua2FyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOwogCXVuc2lnbmVkIGludCByZXBsZW47CkBAIC03ODksNyArNzg5LDcgQEAKICAqIERlY29kZSBSRUFETElOSyByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9yZWFkbGlua3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK25mczNfeGRyX3JlYWRsaW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwogCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CkBAIC04MzcsNyArODM3LDcgQEAKICAqIERlY29kZSBSRUFEIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkcmVzICpyZXMpCituZnMzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQogewogCXN0cnVjdCBrdmVjICppb3YgPSByZXEtPnJxX3Jjdl9idWYuaGVhZDsKIAlpbnQJc3RhdHVzLCBjb3VudCwgb2NvdW50LCByZWN2ZCwgaGRybGVuOwpAQCAtODg4LDcgKzg4OCw3IEBACiAgKiBEZWNvZGUgV1JJVEUgcmVzcG9uc2UKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfd3JpdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQorbmZzM194ZHJfd3JpdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQogewogCWludAlzdGF0dXM7CiAKQEAgLTkxMCw3ICs5MTAsNyBAQAogICogRGVjb2RlIGEgQ1JFQVRFIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2NyZWF0ZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19kaXJvcHJlcyAqcmVzKQorbmZzM194ZHJfY3JlYXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX2Rpcm9wcmVzICpyZXMpCiB7CiAJaW50CXN0YXR1czsKIApAQCAtOTM3LDcgKzkzNyw3IEBACiAgKiBEZWNvZGUgUkVOQU1FIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3JlbmFtZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19yZW5hbWVyZXMgKnJlcykKK25mczNfeGRyX3JlbmFtZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19yZW5hbWVyZXMgKnJlcykKIHsKIAlpbnQJc3RhdHVzOwogCkBAIC05NTIsNyArOTUyLDcgQEAKICAqIERlY29kZSBMSU5LIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2xpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfbGlua3JlcyAqcmVzKQorbmZzM194ZHJfbGlua3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19saW5rcmVzICpyZXMpCiB7CiAJaW50CXN0YXR1czsKIApAQCAtOTY3LDcgKzk2Nyw3IEBACiAgKiBEZWNvZGUgRlNTVEFUIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2Zzc3RhdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqcmVzKQorbmZzM194ZHJfZnNzdGF0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZnNzdGF0ICpyZXMpCiB7CiAJaW50CQlzdGF0dXM7CiAKQEAgLTk5Miw3ICs5OTIsNyBAQAogICogRGVjb2RlIEZTSU5GTyByZXBseQogICovCiBzdGF0aWMgaW50Ci1uZnMzX3hkcl9mc2luZm9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mc2luZm8gKnJlcykKK25mczNfeGRyX2ZzaW5mb3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqcmVzKQogewogCWludAkJc3RhdHVzOwogCkBAIC0xMDIwLDcgKzEwMjAsNyBAQAogICogRGVjb2RlIFBBVEhDT05GIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3BhdGhjb25mcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcGF0aGNvbmYgKnJlcykKK25mczNfeGRyX3BhdGhjb25mcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcGF0aGNvbmYgKnJlcykKIHsKIAlpbnQJCXN0YXR1czsKIApAQCAtMTA0MCw3ICsxMDQwLDcgQEAKICAqIERlY29kZSBDT01NSVQgcmVwbHkKICAqLwogc3RhdGljIGludAotbmZzM194ZHJfY29tbWl0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK25mczNfeGRyX2NvbW1pdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCiB7CiAJaW50CQlzdGF0dXM7CiAKQEAgLTEwNTksNyArMTA1OSw3IEBACiAgKiBEZWNvZGUgR0VUQUNMIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX2dldGFjbHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLAorbmZzM194ZHJfZ2V0YWNscmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCiAJCSAgIHN0cnVjdCBuZnMzX2dldGFjbHJlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfYnVmICpidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwpAQCAtMTA5MSw3ICsxMDkxLDcgQEAKICAqIERlY29kZSBzZXRhY2wgcmVwbHkuCiAgKi8KIHN0YXRpYyBpbnQKLW5mczNfeGRyX3NldGFjbHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK25mczNfeGRyX3NldGFjbHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKIAlpbnQgc3RhdHVzID0gbnRvaGwoKnArKyk7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0X2ZzLmggYi9mcy9uZnMvbmZzNF9mcy5oCmluZGV4IDYxMDk1ZmUuLmMyNmNkOTcgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0X2ZzLmgKKysrIGIvZnMvbmZzL25mczRfZnMuaApAQCAtMTg1LDcgKzE4NSw3IEBACiBleHRlcm4gdm9pZCBuZnM0X3NjaGVkdWxlX3N0YXRlX3JlbmV3YWwoc3RydWN0IG5mc19jbGllbnQgKik7CiBleHRlcm4gdm9pZCBuZnM0X3JlbmV3ZF9wcmVwYXJlX3NodXRkb3duKHN0cnVjdCBuZnNfc2VydmVyICopOwogZXh0ZXJuIHZvaWQgbmZzNF9raWxsX3JlbmV3ZChzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKLWV4dGVybiB2b2lkIG5mczRfcmVuZXdfc3RhdGUodm9pZCAqKTsKK2V4dGVybiB2b2lkIG5mczRfcmVuZXdfc3RhdGUoc3RydWN0IHdvcmtfc3RydWN0ICopOwogCiAvKiBuZnM0c3RhdGUuYyAqLwogc3RydWN0IHJwY19jcmVkICpuZnM0X2dldF9yZW5ld19jcmVkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwpAQCAtMjEyLDcgKzIxMiw3IEBACiBleHRlcm4gY29uc3QgbmZzNF9zdGF0ZWlkIHplcm9fc3RhdGVpZDsKIAogLyogbmZzNHhkci5jICovCi1leHRlcm4gdWludDMyX3QgKm5mczRfZGVjb2RlX2RpcmVudCh1aW50MzJfdCAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKTsKK2V4dGVybiBfX2JlMzIgKm5mczRfZGVjb2RlX2RpcmVudChfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cyk7CiBleHRlcm4gc3RydWN0IHJwY19wcm9jaW5mbyBuZnM0X3Byb2NlZHVyZXNbXTsKIAogc3RydWN0IG5mczRfbW91bnRfZGF0YTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggNDdjN2U2ZS4uYjNmZDI5YiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTEzOCwxMCArMTM4LDEwIEBACiAJfCBGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQKIH07CiAKLXN0YXRpYyB2b2lkIG5mczRfc2V0dXBfcmVhZGRpcih1NjQgY29va2llLCB1MzIgKnZlcmlmaWVyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCitzdGF0aWMgdm9pZCBuZnM0X3NldHVwX3JlYWRkaXIodTY0IGNvb2tpZSwgX19iZTMyICp2ZXJpZmllciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQlzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqcmVhZGRpcikKIHsKLQl1MzIgKnN0YXJ0LCAqcDsKKwlfX2JlMzIgKnN0YXJ0LCAqcDsKIAogCUJVR19PTihyZWFkZGlyLT5jb3VudCA8IDgwKTsKIAlpZiAoY29va2llID4gMikgewpAQCAtMTYyLDcgKzE2Miw3IEBACiAJICogd2hlbiB0YWxraW5nIHRvIHRoZSBzZXJ2ZXIsIHdlIGFsd2F5cyBzZW5kIGNvb2tpZSAwCiAJICogaW5zdGVhZCBvZiAxIG9yIDIuCiAJICovCi0Jc3RhcnQgPSBwID0gKHUzMiAqKWttYXBfYXRvbWljKCpyZWFkZGlyLT5wYWdlcywgS01fVVNFUjApOworCXN0YXJ0ID0gcCA9IGttYXBfYXRvbWljKCpyZWFkZGlyLT5wYWdlcywgS01fVVNFUjApOwogCQogCWlmIChjb29raWUgPT0gMCkgewogCQkqcCsrID0geGRyX29uZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCAqLwpAQCAtNjM2LDcgKzYzNiw3IEBACiAJCXNtcF93bWIoKTsKIAl9IGVsc2UKIAkJc3RhdHVzID0gZGF0YS0+cnBjX3N0YXR1czsKLQlycGNfcmVsZWFzZV90YXNrKHRhc2spOworCXJwY19wdXRfdGFzayh0YXNrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC03NDIsNyArNzQyLDcgQEAKIAkJc21wX3dtYigpOwogCX0gZWxzZQogCQlzdGF0dXMgPSBkYXRhLT5ycGNfc3RhdHVzOwotCXJwY19yZWxlYXNlX3Rhc2sodGFzayk7CisJcnBjX3B1dF90YXNrKHRhc2spOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJcmV0dXJuIHN0YXR1czsKIApAQCAtMTMxNCwxMSArMTMxNCw5IEBACiAJCQljYXNlIC1FUk9GUzoKIAkJCQlsb29rdXBfaW5zdGFudGlhdGVfZmlscChuZCwgKHN0cnVjdCBkZW50cnkgKilzdGF0ZSwgTlVMTCk7CiAJCQkJcmV0dXJuIDE7Ci0JCQljYXNlIC1FTk9FTlQ6Ci0JCQkJaWYgKGRlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMKQotCQkJCQlyZXR1cm4gMTsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBvdXRfZHJvcDsKIAkJfQotCQlnb3RvIG91dF9kcm9wOwogCX0KIAlpZiAoc3RhdGUtPmlub2RlID09IGRlbnRyeS0+ZF9pbm9kZSkgewogCQluZnM0X2ludGVudF9zZXRfZmlsZShuZCwgZGVudHJ5LCBzdGF0ZSk7CkBAIC0xNzc3LDg5ICsxNzc1LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9uZnM0X3Byb2Nfd3JpdGUoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSkKLXsKLQlpbnQgcnBjZmxhZ3MgPSB3ZGF0YS0+ZmxhZ3M7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHdkYXRhLT5pbm9kZTsKLQlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciA9IHdkYXRhLT5yZXMuZmF0dHI7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOwotCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7Ci0JCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9XUklURV0sCi0JCS5ycGNfYXJncAk9ICZ3ZGF0YS0+YXJncywKLQkJLnJwY19yZXNwCT0gJndkYXRhLT5yZXMsCi0JCS5ycGNfY3JlZAk9IHdkYXRhLT5jcmVkLAotCX07Ci0JaW50IHN0YXR1czsKLQotCWRwcmludGsoIk5GUyBjYWxsICB3cml0ZSAlZCBAICVMZFxuIiwgd2RhdGEtPmFyZ3MuY291bnQsCi0JCQkobG9uZyBsb25nKSB3ZGF0YS0+YXJncy5vZmZzZXQpOwotCi0Jd2RhdGEtPmFyZ3MuYml0bWFzayA9IHNlcnZlci0+YXR0cl9iaXRtYXNrOwotCXdkYXRhLT5yZXMuc2VydmVyID0gc2VydmVyOwotCXdkYXRhLT50aW1lc3RhbXAgPSBqaWZmaWVzOwotCW5mc19mYXR0cl9pbml0KGZhdHRyKTsKLQlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCBycGNmbGFncyk7Ci0JZHByaW50aygiTkZTIHJlcGx5IHdyaXRlOiAlZFxuIiwgc3RhdHVzKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQlyZW5ld19sZWFzZShzZXJ2ZXIsIHdkYXRhLT50aW1lc3RhbXApOwotCW5mc19wb3N0X29wX3VwZGF0ZV9pbm9kZShpbm9kZSwgZmF0dHIpOwotCXJldHVybiB3ZGF0YS0+cmVzLmNvdW50OwotfQotCi1zdGF0aWMgaW50IG5mczRfcHJvY193cml0ZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhKQotewotCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07Ci0JaW50IGVycjsKLQlkbyB7Ci0JCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKHdkYXRhLT5pbm9kZSksCi0JCQkJX25mczRfcHJvY193cml0ZSh3ZGF0YSksCi0JCQkJJmV4Y2VwdGlvbik7Ci0JfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IF9uZnM0X3Byb2NfY29tbWl0KHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqY2RhdGEpCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGNkYXRhLT5pbm9kZTsKLQlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciA9IGNkYXRhLT5yZXMuZmF0dHI7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOwotCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7Ci0JCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DT01NSVRdLAotCQkucnBjX2FyZ3AJPSAmY2RhdGEtPmFyZ3MsCi0JCS5ycGNfcmVzcAk9ICZjZGF0YS0+cmVzLAotCQkucnBjX2NyZWQJPSBjZGF0YS0+Y3JlZCwKLQl9OwotCWludCBzdGF0dXM7Ci0KLQlkcHJpbnRrKCJORlMgY2FsbCAgY29tbWl0ICVkIEAgJUxkXG4iLCBjZGF0YS0+YXJncy5jb3VudCwKLQkJCShsb25nIGxvbmcpIGNkYXRhLT5hcmdzLm9mZnNldCk7Ci0KLQljZGF0YS0+YXJncy5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2s7Ci0JY2RhdGEtPnJlcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JY2RhdGEtPnRpbWVzdGFtcCA9IGppZmZpZXM7Ci0JbmZzX2ZhdHRyX2luaXQoZmF0dHIpOwotCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIDApOwotCWlmIChzdGF0dXMgPj0gMCkKLQkJcmVuZXdfbGVhc2Uoc2VydmVyLCBjZGF0YS0+dGltZXN0YW1wKTsKLQlkcHJpbnRrKCJORlMgcmVwbHkgY29tbWl0OiAlZFxuIiwgc3RhdHVzKTsKLQlpZiAoc3RhdHVzID49IDApCi0JCW5mc19wb3N0X29wX3VwZGF0ZV9pbm9kZShpbm9kZSwgZmF0dHIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgbmZzNF9wcm9jX2NvbW1pdChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmNkYXRhKQotewotCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07Ci0JaW50IGVycjsKLQlkbyB7Ci0JCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGNkYXRhLT5pbm9kZSksCi0JCQkJX25mczRfcHJvY19jb21taXQoY2RhdGEpLAotCQkJCSZleGNlcHRpb24pOwotCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7Ci0JcmV0dXJuIGVycjsKLX0KLQogLyoKICAqIEdvdCByYWNlPwogICogV2Ugd2lsbCBuZWVkIHRvIGFycmFuZ2UgZm9yIHRoZSBWRlMgbGF5ZXIgdG8gcHJvdmlkZSBhbiBhdG9taWMgb3Blbi4KQEAgLTE5NjIsNyArMTg3Nyw3IEBACiAJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGlyLT5kX2lub2RlKTsKIAlzdHJ1Y3QgdW5saW5rX2Rlc2MgKnVwOwogCi0JdXAgPSAoc3RydWN0IHVubGlua19kZXNjICopIGttYWxsb2Moc2l6ZW9mKCp1cCksIEdGUF9LRVJORUwpOworCXVwID0ga21hbGxvYyhzaXplb2YoKnVwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1cCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJCkBAIC0yMjI1LDEzICsyMTQwLDExIEBACiAJCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKIAkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKWNvb2tpZSk7Ci0JbG9ja19rZXJuZWwoKTsKIAluZnM0X3NldHVwX3JlYWRkaXIoY29va2llLCBORlNfQ09PS0lFVkVSRihkaXIpLCBkZW50cnksICZhcmdzKTsKIAlyZXMucGdiYXNlID0gYXJncy5wZ2Jhc2U7CiAJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOwogCWlmIChzdGF0dXMgPT0gMCkKIAkJbWVtY3B5KE5GU19DT09LSUVWRVJGKGRpciksIHJlcy52ZXJpZmllci5kYXRhLCBORlM0X1ZFUklGSUVSX1NJWkUpOwotCXVubG9ja19rZXJuZWwoKTsKIAlkcHJpbnRrKCIlczogcmV0dXJucyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yOTE3LDExICsyODMwLDExIEBACiAJCS5ycGNfcmVzcCA9IGNscCwKIAkJLnJwY19jcmVkID0gY3JlZCwKIAl9OwotCXUzMiAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IGxvb3AgPSAwOwogCWludCBzdGF0dXM7CiAKLQlwID0gKHUzMiopc2NfdmVyaWZpZXIuZGF0YTsKKwlwID0gKF9fYmUzMiopc2NfdmVyaWZpZXIuZGF0YTsKIAkqcCsrID0gaHRvbmwoKHUzMiljbHAtPmNsX2Jvb3RfdGltZS50dl9zZWMpOwogCSpwID0gaHRvbmwoKHUzMiljbHAtPmNsX2Jvb3RfdGltZS50dl9uc2VjKTsKIApAQCAtMzA2OSw3ICsyOTgyLDcgQEAKIAkJaWYgKHN0YXR1cyA9PSAwKQogCQkJbmZzX3Bvc3Rfb3BfdXBkYXRlX2lub2RlKGlub2RlLCAmZGF0YS0+ZmF0dHIpOwogCX0KLQlycGNfcmVsZWFzZV90YXNrKHRhc2spOworCXJwY19wdXRfdGFzayh0YXNrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zMzE2LDcgKzMyMjksNyBAQAogCWlmIChJU19FUlIodGFzaykpCiAJCWdvdG8gb3V0OwogCXN0YXR1cyA9IG5mczRfd2FpdF9mb3JfY29tcGxldGlvbl9ycGNfdGFzayh0YXNrKTsKLQlycGNfcmVsZWFzZV90YXNrKHRhc2spOworCXJwY19wdXRfdGFzayh0YXNrKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMzQzMiw3ICszMzQ1LDcgQEAKIAkJdGFzayA9IG5mczRfZG9fdW5sY2soJmRhdGEtPmZsLCBkYXRhLT5jdHgsIGRhdGEtPmxzcCwKIAkJCQlkYXRhLT5hcmcubG9ja19zZXFpZCk7CiAJCWlmICghSVNfRVJSKHRhc2spKQotCQkJcnBjX3JlbGVhc2VfdGFzayh0YXNrKTsKKwkJCXJwY19wdXRfdGFzayh0YXNrKTsKIAkJZHByaW50aygiJXM6IGNhbmNlbGxpbmcgbG9jayFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJfSBlbHNlCiAJCW5mc19mcmVlX3NlcWlkKGRhdGEtPmFyZy5sb2NrX3NlcWlkKTsKQEAgLTM0NzQsNyArMzM4Nyw3IEBACiAJCQlyZXQgPSAtRUFHQUlOOwogCX0gZWxzZQogCQlkYXRhLT5jYW5jZWxsZWQgPSAxOwotCXJwY19yZWxlYXNlX3Rhc2sodGFzayk7CisJcnBjX3B1dF90YXNrKHRhc2spOwogCWRwcmludGsoIiVzOiBkb25lLCByZXQgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzczNCw4ICszNjQ3LDYgQEAKIAkuYWNjZXNzCQk9IG5mczRfcHJvY19hY2Nlc3MsCiAJLnJlYWRsaW5rCT0gbmZzNF9wcm9jX3JlYWRsaW5rLAogCS5yZWFkCQk9IG5mczRfcHJvY19yZWFkLAotCS53cml0ZQkJPSBuZnM0X3Byb2Nfd3JpdGUsCi0JLmNvbW1pdAkJPSBuZnM0X3Byb2NfY29tbWl0LAogCS5jcmVhdGUJCT0gbmZzNF9wcm9jX2NyZWF0ZSwKIAkucmVtb3ZlCQk9IG5mczRfcHJvY19yZW1vdmUsCiAJLnVubGlua19zZXR1cAk9IG5mczRfcHJvY191bmxpbmtfc2V0dXAsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHJlbmV3ZC5jIGIvZnMvbmZzL25mczRyZW5ld2QuYwppbmRleCA3YjZkZjE4Li44MjMyOTg1IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHJlbmV3ZC5jCisrKyBiL2ZzL25mcy9uZnM0cmVuZXdkLmMKQEAgLTU5LDkgKzU5LDEwIEBACiAjZGVmaW5lIE5GU0RCR19GQUNJTElUWQlORlNEQkdfUFJPQwogCiB2b2lkCi1uZnM0X3JlbmV3X3N0YXRlKHZvaWQgKmRhdGEpCituZnM0X3JlbmV3X3N0YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gKHN0cnVjdCBuZnNfY2xpZW50ICopZGF0YTsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZnNfY2xpZW50LCBjbF9yZW5ld2Qud29yayk7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkOwogCWxvbmcgbGVhc2UsIHRpbWVvdXQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0LCBub3c7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwppbmRleCAzZGQ0MTNmLi4wY2YzZmEzIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHhkci5jCisrKyBiL2ZzL25mcy9uZnM0eGRyLmMKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCiBzdGF0aWMgdm9pZCBlbmNvZGVfc3RyaW5nKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4sIGNvbnN0IGNoYXIgKnN0cikKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuKTsKIAlCVUdfT04ocCA9PSBOVUxMKTsKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9jb21wb3VuZF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCWRwcmludGsoImVuY29kZV9jb21wb3VuZDogdGFnPSUuKnNcbiIsIChpbnQpaGRyLT50YWdsZW4sIGhkci0+dGFnKTsKIAlCVUdfT04oaGRyLT50YWdsZW4gPiBORlM0X01BWFRBR0xFTik7CkBAIC00OTQsNyArNDk0LDcgQEAKIAogc3RhdGljIHZvaWQgZW5jb2RlX25mczRfdmVyaWZpZXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgbmZzNF92ZXJpZmllciAqdmVyZikKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBORlM0X1ZFUklGSUVSX1NJWkUpOwogCUJVR19PTihwID09IE5VTEwpOwpAQCAtNTA3LDggKzUwNyw4IEBACiAJY2hhciBvd25lcl9ncm91cFtJRE1BUF9OQU1FU1pdOwogCWludCBvd25lcl9uYW1lbGVuID0gMDsKIAlpbnQgb3duZXJfZ3JvdXBsZW4gPSAwOwotCXVpbnQzMl90ICpwOwotCXVpbnQzMl90ICpxOworCV9fYmUzMiAqcDsKKwlfX2JlMzIgKnE7CiAJaW50IGxlbjsKIAl1aW50MzJfdCBibXZhbDAgPSAwOwogCXVpbnQzMl90IGJtdmFsMSA9IDA7CkBAIC02MzAsNyArNjMwLDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfYWNjZXNzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHUzMiBhY2Nlc3MpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg4KTsKIAlXUklURTMyKE9QX0FDQ0VTUyk7CkBAIC02NDEsNyArNjQxLDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfY2xvc2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDgrc2l6ZW9mKGFyZy0+c3RhdGVpZC0+ZGF0YSkpOwogCVdSSVRFMzIoT1BfQ0xPU0UpOwpAQCAtNjUzLDcgKzY1Myw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2NvbW1pdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAgICAgICAgIAogICAgICAgICBSRVNFUlZFX1NQQUNFKDE2KTsKICAgICAgICAgV1JJVEUzMihPUF9DT01NSVQpOwpAQCAtNjY1LDcgKzY2NSw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2NyZWF0ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzNF9jcmVhdGVfYXJnICpjcmVhdGUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCQogCVJFU0VSVkVfU1BBQ0UoOCk7CiAJV1JJVEUzMihPUF9DUkVBVEUpOwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2dldGF0dHJfb25lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90IGJpdG1hcCkKIHsKLSAgICAgICAgdWludDMyX3QgKnA7CisgICAgICAgIF9fYmUzMiAqcDsKIAogICAgICAgICBSRVNFUlZFX1NQQUNFKDEyKTsKICAgICAgICAgV1JJVEUzMihPUF9HRVRBVFRSKTsKQEAgLTcwOCw3ICs3MDgsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9nZXRhdHRyX3R3byhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCBibTAsIHVpbnQzMl90IGJtMSkKIHsKLSAgICAgICAgdWludDMyX3QgKnA7CisgICAgICAgIF9fYmUzMiAqcDsKIAogICAgICAgICBSRVNFUlZFX1NQQUNFKDE2KTsKICAgICAgICAgV1JJVEUzMihPUF9HRVRBVFRSKTsKQEAgLTc0MCw3ICs3NDAsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9nZXRmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihPUF9HRVRGSCk7CkBAIC03NTAsNyArNzUwLDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfbGluayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDggKyBuYW1lLT5sZW4pOwogCVdSSVRFMzIoT1BfTElOSyk7CkBAIC03ODAsNyArNzgwLDcgQEAKICAqLwogc3RhdGljIGludCBlbmNvZGVfbG9jayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2xvY2tfYXJncyAqYXJncykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDMyKTsKIAlXUklURTMyKE9QX0xPQ0spOwpAQCAtODA5LDcgKzgwOSw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX2xvY2t0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfbG9ja3RfYXJncyAqYXJncykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDQwKTsKIAlXUklURTMyKE9QX0xPQ0tUKTsKQEAgLTgyNSw3ICs4MjUsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9sb2NrdShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2xvY2t1X2FyZ3MgKmFyZ3MpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0NCk7CiAJV1JJVEUzMihPUF9MT0NLVSk7CkBAIC04NDEsNyArODQxLDcgQEAKIHN0YXRpYyBpbnQgZW5jb2RlX2xvb2t1cChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSkKIHsKIAlpbnQgbGVuID0gbmFtZS0+bGVuOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoOCArIGxlbik7CiAJV1JJVEUzMihPUF9MT09LVVApOwpAQCAtODUzLDcgKzg1Myw3IEBACiAKIHN0YXRpYyB2b2lkIGVuY29kZV9zaGFyZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgaW50IG9wZW5fZmxhZ3MpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg4KTsKIAlzd2l0Y2ggKG9wZW5fZmxhZ3MgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpIHsKQEAgLTg3NCw3ICs4NzQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX29wZW5oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuYXJncyAqYXJnKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKICAvKgogICogb3Bjb2RlIDQsIHNlcWlkIDQsIHNoYXJlX2FjY2VzcyA0LCBzaGFyZV9kZW55IDQsIGNsaWVudGlkIDgsIG93bmVybGVuIDQsCiAgKiBvd25lciA0ID0gMzIKQEAgLTg5MSw3ICs4OTEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2NyZWF0ZW1vZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuYXJncyAqYXJnKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJc3dpdGNoKGFyZy0+b3Blbl9mbGFncyAmIE9fRVhDTCkgewpAQCAtOTA3LDcgKzkwNyw3IEBACiAKIHN0YXRpYyB2b2lkIGVuY29kZV9vcGVudHlwZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmcpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlzd2l0Y2ggKGFyZy0+b3Blbl9mbGFncyAmIE9fQ1JFQVQpIHsKQEAgLTkyMyw3ICs5MjMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2RlbGVnYXRpb25fdHlwZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBpbnQgZGVsZWdhdGlvbl90eXBlKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJc3dpdGNoIChkZWxlZ2F0aW9uX3R5cGUpIHsKQEAgLTk0Myw3ICs5NDMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2NsYWltX251bGwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKE5GUzRfT1BFTl9DTEFJTV9OVUxMKTsKQEAgLTk1Miw3ICs5NTIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2NsYWltX3ByZXZpb3VzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGludCB0eXBlKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpOwpAQCAtOTYxLDcgKzk2MSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfY2xhaW1fZGVsZWdhdGVfY3VyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0K3NpemVvZihzdGF0ZWlkLT5kYXRhKSk7CiAJV1JJVEUzMihORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSKTsKQEAgLTk5MSw3ICs5OTEsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzICphcmcpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg4K3NpemVvZihhcmctPnN0YXRlaWQtPmRhdGEpKTsKIAlXUklURTMyKE9QX09QRU5fQ09ORklSTSk7CkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2Nsb3NlYXJncyAqYXJnKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoOCtzaXplb2YoYXJnLT5zdGF0ZWlkLT5kYXRhKSk7CiAJV1JJVEUzMihPUF9PUEVOX0RPV05HUkFERSk7CkBAIC0xMDE3LDcgKzEwMTcsNyBAQAogZW5jb2RlX3B1dGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQogewogCWludCBsZW4gPSBmaC0+c2l6ZTsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDggKyBsZW4pOwogCVdSSVRFMzIoT1BfUFVURkgpOwpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfcHV0cm9vdGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0gICAgICAgIHVpbnQzMl90ICpwOworICAgICAgICBfX2JlMzIgKnA7CiAgICAgICAgIAogICAgICAgICBSRVNFUlZFX1NQQUNFKDQpOwogICAgICAgICBXUklURTMyKE9QX1BVVFJPT1RGSCk7CkBAIC0xMDQwLDcgKzEwNDAsNyBAQAogc3RhdGljIHZvaWQgZW5jb2RlX3N0YXRlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCkKIHsKIAluZnM0X3N0YXRlaWQgc3RhdGVpZDsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDE2KTsKIAlpZiAoY3R4LT5zdGF0ZSAhPSBOVUxMKSB7CkBAIC0xMDUyLDcgKzEwNTIsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9yZWFkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKE9QX1JFQUQpOwpAQCAtMTA3NCw3ICsxMDc0LDcgQEAKIAkJRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlELAogCX07CiAJaW50IHJlcGxlbjsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDMyK3NpemVvZihuZnM0X3ZlcmlmaWVyKSk7CiAJV1JJVEUzMihPUF9SRUFERElSKTsKQEAgLTExMTYsNyArMTExNiw3IEBACiB7CiAJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOwogCXVuc2lnbmVkIGludCByZXBsZW47Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0KTsKIAlXUklURTMyKE9QX1JFQURMSU5LKTsKQEAgLTExMzQsNyArMTEzNCw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX3JlbW92ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAlSRVNFUlZFX1NQQUNFKDggKyBuYW1lLT5sZW4pOwogCVdSSVRFMzIoT1BfUkVNT1ZFKTsKQEAgLTExNDYsNyArMTE0Niw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX3JlbmFtZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqb2xkbmFtZSwgY29uc3Qgc3RydWN0IHFzdHIgKm5ld25hbWUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg4ICsgb2xkbmFtZS0+bGVuKTsKIAlXUklURTMyKE9QX1JFTkFNRSk7CkBAIC0xMTYyLDcgKzExNjIsNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9yZW5ldyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xpZW50X3N0YXRlaWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSgxMik7CiAJV1JJVEUzMihPUF9SRU5FVyk7CkBAIC0xMTc0LDcgKzExNzQsNyBAQAogc3RhdGljIGludAogZW5jb2RlX3Jlc3RvcmVmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihPUF9SRVNUT1JFRkgpOwpAQCAtMTE4NSw3ICsxMTg1LDcgQEAKIHN0YXRpYyBpbnQKIGVuY29kZV9zZXRhY2woc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19zZXRhY2xhcmdzICphcmcpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0K3NpemVvZih6ZXJvX3N0YXRlaWQuZGF0YSkpOwogCVdSSVRFMzIoT1BfU0VUQVRUUik7CkBAIC0xMjA0LDcgKzEyMDQsNyBAQAogc3RhdGljIGludAogZW5jb2RlX3NhdmVmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihPUF9TQVZFRkgpOwpAQCAtMTIxNSw3ICsxMjE1LDcgQEAKIHN0YXRpYyBpbnQgZW5jb2RlX3NldGF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJnLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQogewogCWludCBzdGF0dXM7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCQogICAgICAgICBSRVNFUlZFX1NQQUNFKDQrc2l6ZW9mKGFyZy0+c3RhdGVpZC5kYXRhKSk7CiAgICAgICAgIFdSSVRFMzIoT1BfU0VUQVRUUik7CkBAIC0xMjI5LDcgKzEyMjksNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9zZXRjbGllbnRpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZCAqc2V0Y2xpZW50aWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSg0ICsgc2l6ZW9mKHNldGNsaWVudGlkLT5zY192ZXJpZmllci0+ZGF0YSkpOwogCVdSSVRFMzIoT1BfU0VUQ0xJRU5USUQpOwpAQCAtMTI0OCw3ICsxMjQ4LDcgQEAKIAogc3RhdGljIGludCBlbmNvZGVfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xpZW50X3N0YXRlKQogewotICAgICAgICB1aW50MzJfdCAqcDsKKyAgICAgICAgX19iZTMyICpwOwogCiAgICAgICAgIFJFU0VSVkVfU1BBQ0UoMTIgKyBzaXplb2YoY2xpZW50X3N0YXRlLT5jbF9jb25maXJtLmRhdGEpKTsKICAgICAgICAgV1JJVEUzMihPUF9TRVRDTElFTlRJRF9DT05GSVJNKTsKQEAgLTEyNjAsNyArMTI2MCw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX3dyaXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFU0VSVkVfU1BBQ0UoNCk7CiAJV1JJVEUzMihPUF9XUklURSk7CkBAIC0xMjc5LDcgKzEyNzksNyBAQAogCiBzdGF0aWMgaW50IGVuY29kZV9kZWxlZ3JldHVybihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVTRVJWRV9TUEFDRSgyMCk7CiAKQEAgLTEyOTUsNyArMTI5NSw3IEBACiAvKgogICogRW5jb2RlIGFuIEFDQ0VTUyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2FjY2Vzc2FyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19hY2Nlc3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfYWNjZXNzYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xMzEzLDcgKzEzMTMsNyBAQAogLyoKICAqIEVuY29kZSBMT09LVVAgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9sb29rdXBfYXJnICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9va3VwKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xvb2t1cF9hcmcgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTMzNyw3ICsxMzM3LDcgQEAKIC8qCiAgKiBFbmNvZGUgTE9PS1VQX1JPT1QgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb29rdXBfcm9vdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xvb2t1cF9yb290X2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvb2t1cF9yb290KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xvb2t1cF9yb290X2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xMzU4LDcgKzEzNTgsNyBAQAogLyoKICAqIEVuY29kZSBSRU1PVkUgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZW1vdmUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZW1vdmVfYXJnICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlbW92ZV9hcmcgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTM4MCw3ICsxMzgwLDcgQEAKIC8qCiAgKiBFbmNvZGUgUkVOQU1FIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVuYW1lKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfcmVuYW1lX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbmFtZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZW5hbWVfYXJnICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE0MTAsNyArMTQxMCw3IEBACiAvKgogICogRW5jb2RlIExJTksgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19saW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfbGlua19hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19saW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xpbmtfYXJnICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE0NDAsNyArMTQ0MCw3IEBACiAvKgogICogRW5jb2RlIENSRUFURSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2NyZWF0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19jcmVhdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xNDcwLDcgKzE0NzAsNyBAQAogLyoKICAqIEVuY29kZSBTWU1MSU5LIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc3ltbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19zeW1saW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgKmFyZ3MpCiB7CiAJcmV0dXJuIG5mczRfeGRyX2VuY19jcmVhdGUocmVxLCBwLCBhcmdzKTsKIH0KQEAgLTE0NzgsNyArMTQ3OCw3IEBACiAvKgogICogRW5jb2RlIEdFVEFUVFIgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19nZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19nZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2dldGF0dHJfYXJnICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE0OTYsNyArMTQ5Niw3IEBACiAvKgogICogRW5jb2RlIGEgQ0xPU0UgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19jbG9zZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfY2xvc2Uoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZ3MpCiB7CiAgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKICAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xNTIwLDcgKzE1MjAsNyBAQAogLyoKICAqIEVuY29kZSBhbiBPUEVOIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3BlbihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTU1Niw3ICsxNTU2LDcgQEAKIC8qCiAgKiBFbmNvZGUgYW4gT1BFTl9DT05GSVJNIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xNTc3LDcgKzE1NzcsNyBAQAogLyoKICAqIEVuY29kZSBhbiBPUEVOIHJlcXVlc3Qgd2l0aCBubyBhdHRyaWJ1dGVzLgogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE2MDEsNyArMTYwMSw3IEBACiAvKgogICogRW5jb2RlIGFuIE9QRU5fRE9XTkdSQURFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX29wZW5fZG93bmdyYWRlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE2MjUsNyArMTYyNSw3IEBACiAvKgogICogRW5jb2RlIGEgTE9DSyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2soc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2tfYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2soc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19sb2NrX2FyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTY0Niw3ICsxNjQ2LDcgQEAKIC8qCiAgKiBFbmNvZGUgYSBMT0NLVCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2t0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrdF9hcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9ja3Qoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19sb2NrdF9hcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE2NjcsNyArMTY2Nyw3IEBACiAvKgogICogRW5jb2RlIGEgTE9DS1UgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb2NrdShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfbG9ja3VfYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja3VfYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xNjg4LDcgKzE2ODgsNyBAQAogLyoKICAqIEVuY29kZSBhIFJFQURMSU5LIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZGxpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkbGluayAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRsaW5rICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE3MDksNyArMTcwOSw3IEBACiAvKgogICogRW5jb2RlIGEgUkVBRERJUiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWRkaXIoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWRkaXIoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfcmVhZGRpcl9hcmcgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTczMCw3ICsxNzMwLDcgQEAKIC8qCiAgKiBFbmNvZGUgYSBSRUFEIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZWFkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOwogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKQEAgLTE3NjIsNyArMTc2Miw3IEBACiAvKgogICogRW5jb2RlIGFuIFNFVEFUVFIgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NldGF0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJncykKIAogewogICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CkBAIC0xNzg4LDcgKzE3ODgsNyBAQAogICogRW5jb2RlIGEgR0VUQUNMIHJlcXVlc3QKICAqLwogc3RhdGljIGludAotbmZzNF94ZHJfZW5jX2dldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCituZnM0X3hkcl9lbmNfZ2V0YWNsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNfZ2V0YWNsYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CkBAIC0xODE1LDcgKzE4MTUsNyBAQAogLyoKICAqIEVuY29kZSBhIFdSSVRFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfd3JpdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3dyaXRlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE4MzksNyArMTgzOSw3IEBACiAvKgogICogIGEgQ09NTUlUIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfY29tbWl0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTg2Myw3ICsxODYzLDcgQEAKIC8qCiAgKiBGU0lORk8gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19mc2luZm8oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9mc2luZm9fYXJnICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2ZzaW5mb19hcmcgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTg4Miw3ICsxODgyLDcgQEAKIC8qCiAgKiBhIFBBVEhDT05GIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcGF0aGNvbmYoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9wYXRoY29uZl9hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9wYXRoY29uZl9hcmcgKmFyZ3MpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTkwMiw3ICsxOTAyLDcgQEAKIC8qCiAgKiBhIFNUQVRGUyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3N0YXRmcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3N0YXRmc19hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfc3RhdGZzX2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xOTIzLDcgKzE5MjMsNyBAQAogLyoKICAqIEdFVEFUVFJfQklUTUFQIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2VydmVyX2NhcHMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2VydmVyX2NhcHMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0xOTQ1LDcgKzE5NDUsNyBAQAogLyoKICAqIGEgUkVORVcgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE5NjAsNyArMTk2MCw3IEBACiAvKgogICogYSBTRVRDTElFTlRJRCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWQgKnNjKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWQgKnNjKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTE5NzUsNyArMTk3NSw3IEBACiAvKgogICogYSBTRVRDTElFTlRJRF9DT05GSVJNIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMTk5Nyw3ICsxOTk3LDcgQEAKIC8qCiAgKiBERUxFR1JFVFVSTiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2RlbGVncmV0dXJuKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5hcmdzICphcmdzKQorc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZGVsZWdyZXR1cm4oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5hcmdzICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKQEAgLTIwMjEsNyArMjAyMSw3IEBACiAvKgogICogRW5jb2RlIEZTX0xPQ0FUSU9OUyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uc19hcmcgKmFyZ3MpCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19mc19sb2NhdGlvbnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zX2FyZyAqYXJncykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0yMDg2LDcgKzIwODYsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9vcGFxdWVfaW5saW5lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCAqbGVuLCBjaGFyICoqc3RyaW5nKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFQURfQlVGKDQpOwogCVJFQUQzMigqbGVuKTsKQEAgLTIwOTcsNyArMjA5Nyw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJUkVBRF9CVUYoOCk7CiAJUkVBRDMyKGhkci0+c3RhdHVzKTsKQEAgLTIxMTIsNyArMjExMiw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX29wX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBlbnVtIG5mc19vcG51bTQgZXhwZWN0ZWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCXVpbnQzMl90IG9wbnVtOwogCWludDMyX3QgbmZzZXJyOwogCkBAIC0yMTM0LDcgKzIxMzQsNyBAQAogLyogRHVtbXkgcm91dGluZSAqLwogc3RhdGljIGludCBkZWNvZGVfYWNlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKmFjZSwgc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdW5zaWduZWQgaW50IHN0cmxlbjsKIAljaGFyICpzdHI7CiAKQEAgLTIxNDQsNyArMjE0NCw4IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfYml0bWFwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXApCiB7Ci0JdWludDMyX3QgYm1sZW4sICpwOworCXVpbnQzMl90IGJtbGVuOworCV9fYmUzMiAqcDsKIAogCVJFQURfQlVGKDQpOwogCVJFQUQzMihibWxlbik7CkBAIC0yMTU5LDkgKzIxNjAsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkZWNvZGVfYXR0cl9sZW5ndGgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmF0dHJsZW4sIHVpbnQzMl90ICoqc2F2ZXApCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfYXR0cl9sZW5ndGgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmF0dHJsZW4sIF9fYmUzMiAqKnNhdmVwKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFQURfQlVGKDQpOwogCVJFQUQzMigqYXR0cmxlbik7CkBAIC0yMTgyLDcgKzIxODMsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX3R5cGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKnR5cGUpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKnR5cGUgPSAwOwogCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX1RZUEUgLSAxVSkpKQpAQCAtMjIwMiw3ICsyMjAzLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9jaGFuZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKmNoYW5nZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAkqY2hhbmdlID0gMDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9DSEFOR0UgLSAxVSkpKQpAQCAtMjIxOSw3ICsyMjIwLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9zaXplKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpzaXplKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCSpzaXplID0gMDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9TSVpFIC0gMVUpKSkKQEAgLTIyMzUsNyArMjIzNiw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbGlua19zdXBwb3J0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKnJlcyA9IDA7CiAJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfTElOS19TVVBQT1JUIC0gMVUpKSkKQEAgLTIyNTEsNyArMjI1Miw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfc3ltbGlua19zdXBwb3J0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKnJlcyA9IDA7CiAJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfU1lNTElOS19TVVBQT1JUIC0gMVUpKSkKQEAgLTIyNjcsNyArMjI2OCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZnNpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgbmZzX2ZzaWQgKmZzaWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJZnNpZC0+bWFqb3IgPSAwOwogCWZzaWQtPm1pbm9yID0gMDsKQEAgLTIyODcsNyArMjI4OCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbGVhc2VfdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCSpyZXMgPSA2MDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FIC0gMVUpKSkKQEAgLTIzMDMsNyArMjMwNCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfYWNsc3VwcG9ydChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCSpyZXMgPSBBQ0w0X1NVUFBPUlRfQUxMT1dfQUNMfEFDTDRfU1VQUE9SVF9ERU5ZX0FDTDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9BQ0xTVVBQT1JUIC0gMVUpKSkKQEAgLTIzMTksNyArMjMyMCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZmlsZWlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpmaWxlaWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKmZpbGVpZCA9IDA7CiAJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfRklMRUlEIC0gMVUpKSkKQEAgLTIzMzUsNyArMjMzNiw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbW91bnRlZF9vbl9maWxlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKmZpbGVpZCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAKIAkqZmlsZWlkID0gMDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRCAtIDFVKSkpCkBAIC0yMzUxLDcgKzIzNTIsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX2ZpbGVzX2F2YWlsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKnJlcyA9IDA7CkBAIC0yMzY4LDcgKzIzNjksNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX2ZpbGVzX2ZyZWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAkqcmVzID0gMDsKQEAgLTIzODUsNyArMjM4Niw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZmlsZXNfdG90YWwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAkqcmVzID0gMDsKQEAgLTI0MDMsNyArMjQwNCw3IEBACiBzdGF0aWMgaW50IGRlY29kZV9wYXRobmFtZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9wYXRobmFtZSAqcGF0aCkKIHsKIAlpbnQgbjsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAlSRUFEX0JVRig0KTsKQEAgLTI0NDgsNyArMjQ0OSw3IEBACiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMgKnJlcykKIHsKIAlpbnQgbjsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1cyA9IC1FSU87CiAKIAlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9GU19MT0NBVElPTlMgLTFVKSkpCkBAIC0yNTEyLDcgKzI1MTMsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX21heGZpbGVzaXplKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKnJlcyA9IDA7CkBAIC0yNTI5LDcgKzI1MzAsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX21heGxpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKm1heGxpbmspCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKm1heGxpbmsgPSAxOwpAQCAtMjU0Niw3ICsyNTQ3LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9tYXhuYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICptYXhuYW1lKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCSptYXhuYW1lID0gMTAyNDsKQEAgLTI1NjMsNyArMjU2NCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbWF4cmVhZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCSpyZXMgPSAxMDI0OwpAQCAtMjU4NCw3ICsyNTg1LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9tYXh3cml0ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCSpyZXMgPSAxMDI0OwpAQCAtMjYwNSw3ICsyNjA2LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9tb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICptb2RlKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCSptb2RlID0gMDsKIAlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9NT0RFIC0gMVUpKSkKQEAgLTI2MjIsNyArMjYyMyw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbmxpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKm5saW5rKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCSpubGluayA9IDE7CiAJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfTlVNTElOS1MgLSAxVSkpKQpAQCAtMjYzOCw3ICsyNjM5LDggQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9vd25lcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBpbnQzMl90ICp1aWQpCiB7Ci0JdWludDMyX3QgbGVuLCAqcDsKKwl1aW50MzJfdCBsZW47CisJX19iZTMyICpwOwogCiAJKnVpZCA9IC0yOwogCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX09XTkVSIC0gMVUpKSkKQEAgLTI2NjIsNyArMjY2NCw4IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZ3JvdXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgc3RydWN0IG5mc19jbGllbnQgKmNscCwgaW50MzJfdCAqZ2lkKQogewotCXVpbnQzMl90IGxlbiwgKnA7CisJdWludDMyX3QgbGVuOworCV9fYmUzMiAqcDsKIAogCSpnaWQgPSAtMjsKIAlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9PV05FUl9HUk9VUCAtIDFVKSkpCkBAIC0yNjg2LDcgKzI2ODksOCBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX3JkZXYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgZGV2X3QgKnJkZXYpCiB7Ci0JdWludDMyX3QgbWFqb3IgPSAwLCBtaW5vciA9IDAsICpwOworCXVpbnQzMl90IG1ham9yID0gMCwgbWlub3IgPSAwOworCV9fYmUzMiAqcDsKIAogCSpyZGV2ID0gTUtERVYoMCwwKTsKIAlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9SQVdERVYgLSAxVSkpKQpAQCAtMjcwOCw3ICsyNzEyLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9zcGFjZV9hdmFpbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAlpbnQgc3RhdHVzID0gMDsKIAogCSpyZXMgPSAwOwpAQCAtMjcyNSw3ICsyNzI5LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl9zcGFjZV9mcmVlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKnJlcyA9IDA7CkBAIC0yNzQyLDcgKzI3NDYsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX3NwYWNlX3RvdGFsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXMgPSAwOwogCiAJKnJlcyA9IDA7CkBAIC0yNzU5LDcgKzI3NjMsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX3NwYWNlX3VzZWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnVzZWQpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCiAJKnVzZWQgPSAwOwogCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX1NQQUNFX1VTRUQgLSAxVSkpKQpAQCAtMjc3Niw3ICsyNzgwLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfYXR0cl90aW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdWludDY0X3Qgc2VjOwogCXVpbnQzMl90IG5zZWM7CiAKQEAgLTI4MzYsNyArMjg0MCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCB2ZXJpZnlfYXR0cl9sZW4oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKnNhdmVwLCB1aW50MzJfdCBhdHRybGVuKQorc3RhdGljIGludCB2ZXJpZnlfYXR0cl9sZW4oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgX19iZTMyICpzYXZlcCwgdWludDMyX3QgYXR0cmxlbikKIHsKIAl1bnNpZ25lZCBpbnQgYXR0cndvcmRzID0gWERSX1FVQURMRU4oYXR0cmxlbik7CiAJdW5zaWduZWQgaW50IG53b3JkcyA9IHhkci0+cCAtIHNhdmVwOwpAQCAtMjg1NCw3ICsyODU4LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfY2hhbmdlX2luZm8oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAogCVJFQURfQlVGKDIwKTsKIAlSRUFEMzIoY2luZm8tPmF0b21pYyk7CkBAIC0yODY1LDcgKzI4NjksNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfYWNjZXNzcmVzICphY2Nlc3MpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCXVpbnQzMl90IHN1cHAsIGFjYzsKIAlpbnQgc3RhdHVzOwogCkBAIC0yODgyLDcgKzI4ODYsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9jbG9zZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXM7CiAKIAlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfQ0xPU0UpOwpAQCAtMjg5NSw3ICsyODk5LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfY29tbWl0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9DT01NSVQpOwpAQCAtMjkwOCw3ICsyOTEyLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfY3JlYXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NoYW5nZV9pbmZvICpjaW5mbykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdWludDMyX3QgYm1sZW47CiAJaW50IHN0YXR1czsKIApAQCAtMjkyNSw3ICsyOTI5LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfc2VydmVyX2NhcHMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfc2VydmVyX2NhcHNfcmVzICpyZXMpCiB7Ci0JdWludDMyX3QgKnNhdmVwOworCV9fYmUzMiAqc2F2ZXA7CiAJdWludDMyX3QgYXR0cmxlbiwgCiAJCSBiaXRtYXBbMl0gPSB7MH07CiAJaW50IHN0YXR1czsKQEAgLTI5NTIsNyArMjk1Niw3IEBACiAJCiBzdGF0aWMgaW50IGRlY29kZV9zdGF0ZnMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mc3N0YXQgKmZzc3RhdCkKIHsKLQl1aW50MzJfdCAqc2F2ZXA7CisJX19iZTMyICpzYXZlcDsKIAl1aW50MzJfdCBhdHRybGVuLCAKIAkJIGJpdG1hcFsyXSA9IHswfTsKIAlpbnQgc3RhdHVzOwpAQCAtMjk4NSw3ICsyOTg5LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfcGF0aGNvbmYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCiB7Ci0JdWludDMyX3QgKnNhdmVwOworCV9fYmUzMiAqc2F2ZXA7CiAJdWludDMyX3QgYXR0cmxlbiwgCiAJCSBiaXRtYXBbMl0gPSB7MH07CiAJaW50IHN0YXR1czsKQEAgLTMwMTAsNyArMzAxNCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2dldGZhdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQogewotCXVpbnQzMl90ICpzYXZlcDsKKwlfX2JlMzIgKnNhdmVwOwogCXVpbnQzMl90IGF0dHJsZW4sCiAJCSBiaXRtYXBbMl0gPSB7MH0sCiAJCSB0eXBlOwpAQCAtMzA3OSw3ICszMDgzLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfZnNpbmZvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCiB7Ci0JdWludDMyX3QgKnNhdmVwOworCV9fYmUzMiAqc2F2ZXA7CiAJdWludDMyX3QgYXR0cmxlbiwgYml0bWFwWzJdOwogCWludCBzdGF0dXM7CiAKQEAgLTMxMTEsNyArMzExNSw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2dldGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmggKmZoKQogewotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAl1aW50MzJfdCBsZW47CiAJaW50IHN0YXR1czsKIApAQCAtMzE0Nyw3ICszMTUxLDcgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX2xvY2tfZGVuaWVkIChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKIAl1aW50NjRfdCBvZmZzZXQsIGxlbmd0aCwgY2xpZW50aWQ7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCXVpbnQzMl90IG5hbWVsZW4sIHR5cGU7CiAKIAlSRUFEX0JVRigzMik7CkBAIC0zMTcyLDcgKzMxNzYsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9sb2NrKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfbG9ja19yZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9MT0NLKTsKQEAgLTMxOTUsNyArMzE5OSw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2xvY2t1KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfbG9ja3VfcmVzICpyZXMpCiB7Ci0JdWludDMyX3QgKnA7CisJX19iZTMyICpwOwogCWludCBzdGF0dXM7CiAKIAlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfTE9DS1UpOwpAQCAtMzIxNCw3ICszMjE4LDcgQEAKIC8qIFRoaXMgaXMgdG9vIHNpY2shICovCiBzdGF0aWMgaW50IGRlY29kZV9zcGFjZV9saW1pdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1NjQgKm1heHNpemUpCiB7Ci0gICAgICAgIHVpbnQzMl90ICpwOworICAgICAgICBfX2JlMzIgKnA7CiAJdWludDMyX3QgbGltaXRfdHlwZSwgbmJsb2NrcywgYmxvY2tzaXplOwogCiAJUkVBRF9CVUYoMTIpOwpAQCAtMzIzMyw3ICszMjM3LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfZGVsZWdhdGlvbihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKIHsKLSAgICAgICAgdWludDMyX3QgKnA7CisgICAgICAgIF9fYmUzMiAqcDsKICAgICAgICAgdWludDMyX3QgZGVsZWdhdGlvbl90eXBlOwogCiAJUkVBRF9CVUYoNCk7CkBAIC0zMjU5LDcgKzMyNjMsNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9vcGVuKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewotICAgICAgICB1aW50MzJfdCAqcDsKKyAgICAgICAgX19iZTMyICpwOwogICAgICAgICB1aW50MzJfdCBibWxlbjsKICAgICAgICAgaW50IHN0YXR1czsKIApAQCAtMzI4Nyw3ICszMjkxLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfb3Blbl9jb25maXJtKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtcmVzICpyZXMpCiB7Ci0gICAgICAgIHVpbnQzMl90ICpwOworICAgICAgICBfX2JlMzIgKnA7CiAJaW50IHN0YXR1czsKIAogICAgICAgICBzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfT1BFTl9DT05GSVJNKTsKQEAgLTMzMDAsNyArMzMwNCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX29wZW5fZG93bmdyYWRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9PUEVOX0RPV05HUkFERSk7CkBAIC0zMzI0LDcgKzMzMjgsNyBAQAogc3RhdGljIGludCBkZWNvZGVfcmVhZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IG5mc19yZWFkcmVzICpyZXMpCiB7CiAJc3RydWN0IGt2ZWMgKmlvdiA9IHJlcS0+cnFfcmN2X2J1Zi5oZWFkOwotCXVpbnQzMl90ICpwOworCV9fYmUzMiAqcDsKIAl1aW50MzJfdCBjb3VudCwgZW9mLCByZWN2ZCwgaGRybGVuOwogCWludCBzdGF0dXM7CiAKQEAgLTMzNTQsNyArMzM1OCw3IEBACiAJc3RydWN0IHBhZ2UJKnBhZ2UgPSAqcmN2YnVmLT5wYWdlczsKIAlzdHJ1Y3Qga3ZlYwkqaW92ID0gcmN2YnVmLT5oZWFkOwogCXVuc2lnbmVkIGludAluciwgcGdsZW4gPSByY3ZidWYtPnBhZ2VfbGVuOwotCXVpbnQzMl90CSplbmQsICplbnRyeSwgKnAsICprYWRkcjsKKwlfX2JlMzIJCSplbmQsICplbnRyeSwgKnAsICprYWRkcjsKIAl1aW50MzJfdAlsZW4sIGF0dHJsZW4sIHhsZW47CiAJaW50IAkJaGRybGVuLCByZWN2ZCwgc3RhdHVzOwogCkBAIC0zMzc2LDcgKzMzODAsNyBAQAogCXhkcl9yZWFkX3BhZ2VzKHhkciwgcGdsZW4pOwogCiAJQlVHX09OKHBnbGVuICsgcmVhZGRpci0+cGdiYXNlID4gUEFHRV9DQUNIRV9TSVpFKTsKLQlrYWRkciA9IHAgPSAodWludDMyX3QgKikga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCWthZGRyID0gcCA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKIAllbmQgPSBwICsgKChwZ2xlbiArIHJlYWRkaXItPnBnYmFzZSkgPj4gMik7CiAJZW50cnkgPSBwOwogCWZvciAobnIgPSAwOyAqcCsrOyBucisrKSB7CkBAIC0zNDI4LDcgKzM0MzIsNyBAQAogCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwogCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CiAJaW50IGhkcmxlbiwgbGVuLCByZWN2ZDsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJY2hhciAqa2FkZHI7CiAJaW50IHN0YXR1czsKIApAQCAtMzUwNSw3ICszNTA5LDcgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX2dldGFjbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKIAkJc2l6ZV90ICphY2xfbGVuKQogewotCXVpbnQzMl90ICpzYXZlcDsKKwlfX2JlMzIgKnNhdmVwOwogCXVpbnQzMl90IGF0dHJsZW4sCiAJCSBiaXRtYXBbMl0gPSB7MH07CiAJc3RydWN0IGt2ZWMgKmlvdiA9IHJlcS0+cnFfcmN2X2J1Zi5oZWFkOwpAQCAtMzU1MSw3ICszNTU1LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfc2V0YXR0cihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX3NldGF0dHJyZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdWludDMyX3QgYm1sZW47CiAJaW50IHN0YXR1czsKIApAQCAtMzU2Nyw3ICszNTcxLDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfc2V0Y2xpZW50aWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJdWludDMyX3Qgb3BudW07CiAJaW50MzJfdCBuZnNlcnI7CiAKQEAgLTM2MTAsNyArMzYxNCw3IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX3dyaXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKIHsKLQl1aW50MzJfdCAqcDsKKwlfX2JlMzIgKnA7CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9XUklURSk7CkBAIC0zNjMyLDcgKzM2MzYsNyBAQAogLyoKICAqIERlY29kZSBPUEVOX0RPV05HUkFERSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCiB7CiAgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKICAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zNjYwLDcgKzM2NjQsNyBAQAogLyoKICAqIERlY29kZSBBQ0NFU1MgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfYWNjZXNzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9hY2Nlc3NyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2FjY2Vzc3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTM2NzgsNyArMzY4Miw3IEBACiAvKgogICogRGVjb2RlIExPT0tVUCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2xvb2t1cF9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvb2t1cChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2xvb2t1cF9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zNzAxLDcgKzM3MDUsNyBAQAogLyoKICAqIERlY29kZSBMT09LVVBfUk9PVCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXBfcm9vdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9va3VwX3Jvb3Qoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzcyMSw3ICszNzI1LDcgQEAKIC8qCiAgKiBEZWNvZGUgUkVNT1ZFIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbW92ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfcmVtb3ZlX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfcmVtb3ZlX3JlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTM3NDIsNyArMzc0Niw3IEBACiAvKgogICogRGVjb2RlIFJFTkFNRSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5hbWUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X3JlbmFtZV9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbmFtZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X3JlbmFtZV9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zNzcyLDcgKzM3NzYsNyBAQAogLyoKICAqIERlY29kZSBMSU5LIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2xpbmtfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19saW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfbGlua19yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC0zODA1LDcgKzM4MDksNyBAQAogLyoKICAqIERlY29kZSBDUkVBVEUgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY3JlYXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jcmVhdGUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzgzNCw3ICszODM4LDcgQEAKIC8qCiAgKiBEZWNvZGUgU1lNTElOSyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zeW1saW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zeW1saW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfY3JlYXRlX3JlcyAqcmVzKQogewogCXJldHVybiBuZnM0X3hkcl9kZWNfY3JlYXRlKHJxc3RwLCBwLCByZXMpOwogfQpAQCAtMzg0Miw3ICszODQ2LDcgQEAKIC8qCiAgKiBEZWNvZGUgR0VUQVRUUiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19nZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9nZXRhdHRyX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2dldGF0dHJfcmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzg2NSw3ICszODY5LDcgQEAKICAqIEVuY29kZSBhbiBTRVRBQ0wgcmVxdWVzdAogICovCiBzdGF0aWMgaW50Ci1uZnM0X3hkcl9lbmNfc2V0YWNsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19zZXRhY2xhcmdzICphcmdzKQorbmZzNF94ZHJfZW5jX3NldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3NldGFjbGFyZ3MgKmFyZ3MpCiB7CiAgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKICAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CkBAIC0zODg2LDcgKzM4OTAsNyBAQAogICogRGVjb2RlIFNFVEFDTCByZXNwb25zZQogICovCiBzdGF0aWMgaW50Ci1uZnM0X3hkcl9kZWNfc2V0YWNsKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCB2b2lkICpyZXMpCituZnM0X3hkcl9kZWNfc2V0YWNsKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTM5MDgsNyArMzkxMiw3IEBACiAgKiBEZWNvZGUgR0VUQUNMIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19nZXRhY2woc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHNpemVfdCAqYWNsX2xlbikKK25mczRfeGRyX2RlY19nZXRhY2woc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzaXplX3QgKmFjbF9sZW4pCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzkzMCw3ICszOTM0LDcgQEAKIC8qCiAgKiBEZWNvZGUgQ0xPU0UgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY2xvc2Uoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQogewogICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtMzk2MCw3ICszOTY0LDcgQEAKIC8qCiAgKiBEZWNvZGUgT1BFTiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW4oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKIHsKICAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOwogICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTM5OTQsNyArMzk5OCw3IEBACiAvKgogICogRGVjb2RlIE9QRU5fQ09ORklSTSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX29wZW5fY29uZmlybXJlcyAqcmVzKQogewogICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDAxNSw3ICs0MDE5LDcgQEAKIC8qCiAgKiBEZWNvZGUgT1BFTiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewogICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDAzOSw3ICs0MDQzLDcgQEAKIC8qCiAgKiBEZWNvZGUgU0VUQVRUUiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3NldGF0dHJyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGF0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3NldGF0dHJyZXMgKnJlcykKIHsKICAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOwogICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQwNjUsNyArNDA2OSw3IEBACiAvKgogICogRGVjb2RlIExPQ0sgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9jayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9jayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja19yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MDg2LDcgKzQwOTAsNyBAQAogLyoKICAqIERlY29kZSBMT0NLVCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrdF9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19sb2NrdF9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MTA3LDcgKzQxMTEsNyBAQAogLyoKICAqIERlY29kZSBMT0NLVSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrdShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrdV9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19sb2NrdV9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MTI4LDcgKzQxMzIsNyBAQAogLyoKICAqIERlY29kZSBSRUFETElOSyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWFkbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgdm9pZCAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZGxpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDE0OSw3ICs0MTUzLDcgQEAKIC8qCiAgKiBEZWNvZGUgUkVBRERJUiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWFkZGlyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZGRpcihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X3JlYWRkaXJfcmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDE3MCw3ICs0MTc0LDcgQEAKIC8qCiAgKiBEZWNvZGUgUmVhZCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWFkKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MTkzLDcgKzQxOTcsNyBAQAogLyoKICAqIERlY29kZSBXUklURSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY193cml0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfd3JpdGUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDIxOSw3ICs0MjIzLDcgQEAKIC8qCiAgKiBEZWNvZGUgQ09NTUlUIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2NvbW1pdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY29tbWl0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQyNDMsNyArNDI0Nyw3IEBACiAvKgogICogRlNJTkZPIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2ZzaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQyNjMsNyArNDI2Nyw3IEBACiAvKgogICogUEFUSENPTkYgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfcGF0aGNvbmYgKnBhdGhjb25mKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcGF0aGNvbmYoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDI4MSw3ICs0Mjg1LDcgQEAKIC8qCiAgKiBTVEFURlMgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqZnNzdGF0KQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc3RhdGZzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZnNzdGF0ICpmc3N0YXQpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDI5OSw3ICs0MzAzLDcgQEAKIC8qCiAgKiBHRVRBVFRSX0JJVE1BUCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfc2VydmVyX2NhcHNfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXJ2ZXJfY2FwcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00MzE4LDcgKzQzMjIsNyBAQAogLyoKICAqIERlY29kZSBSRU5FVyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgdm9pZCAqZHVtbXkpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKQEAgLTQzMzQsNyArNDMzOCw3IEBACiAvKgogICogYSBTRVRDTElFTlRJRCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwpAQCAtNDM1Myw3ICs0MzU3LDcgQEAKIC8qCiAgKiBhIFNFVENMSUVOVElEX0NPTkZJUk0gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00Mzc1LDcgKzQzNzksNyBAQAogLyoKICAqIERFTEVHUkVUVVJOIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZGVsZWdyZXR1cm4oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2RlbGVncmV0dXJucmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19kZWxlZ3JldHVybihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2RlbGVncmV0dXJucmVzICpyZXMpCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwpAQCAtNDM5Nyw3ICs0NDAxLDcgQEAKIC8qCiAgKiBGU19MT0NBVElPTlMgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19mc19sb2NhdGlvbnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMgKnJlcykKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CkBAIC00NDE3LDcgKzQ0MjEsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXVpbnQzMl90ICpuZnM0X2RlY29kZV9kaXJlbnQodWludDMyX3QgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cykKK19fYmUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KF9fYmUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKQogewogCXVpbnQzMl90IGJpdG1hcFsyXSA9IHswfTsKIAl1aW50MzJfdCBsZW47CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzcm9vdC5jIGIvZnMvbmZzL25mc3Jvb3QuYwppbmRleCA4ZGZlZmU0Li43NWY4MTlkIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzcm9vdC5jCisrKyBiL2ZzL25mcy9uZnNyb290LmMKQEAgLTk4LDcgKzk4LDcgQEAKIHN0YXRpYyBjaGFyIG5mc19yb290X25hbWVbMjU2XSBfX2luaXRkYXRhID0gIiI7CiAKIC8qIEFkZHJlc3Mgb2YgTkZTIHNlcnZlciAqLwotc3RhdGljIF9fdTMyIHNlcnZhZGRyIF9faW5pdGRhdGEgPSAwOworc3RhdGljIF9fYmUzMiBzZXJ2YWRkciBfX2luaXRkYXRhID0gMDsKIAogLyogTmFtZSBvZiBkaXJlY3RvcnkgdG8gbW91bnQgKi8KIHN0YXRpYyBjaGFyIG5mc19wYXRoW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhID0geyAwLCB9OwpAQCAtMzI3LDcgKzMyNyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2FkZHIodm9pZCkKIHsKLQlpZiAoKHNlcnZhZGRyID0gcm9vdF9zZXJ2ZXJfYWRkcikgPT0gSU5BRERSX05PTkUpIHsKKwlpZiAoKHNlcnZhZGRyID0gcm9vdF9zZXJ2ZXJfYWRkcikgPT0gaHRvbmwoSU5BRERSX05PTkUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IE5vIE5GUyBzZXJ2ZXIgYXZhaWxhYmxlLCBnaXZpbmcgdXAuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTQxMSw3ICs0MTEsNyBAQAogICogIENvbnN0cnVjdCBzb2NrYWRkcl9pbiBmcm9tIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLXNldF9zb2NrYWRkcihzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwgX191MzIgYWRkciwgX191MTYgcG9ydCkKK3NldF9zb2NrYWRkcihzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwgX19iZTMyIGFkZHIsIF9fYmUxNiBwb3J0KQogewogCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CiAJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOwpAQCAtNDY4LDE0ICs0NjgsMTMgQEAKIAkJZHByaW50aygiUm9vdC1ORlM6IFBvcnRtYXBwZXIgb24gc2VydmVyIHJldHVybmVkICVkICIKIAkJCSJhcyBuZnNkIHBvcnRcbiIsIHBvcnQpOwogCX0KLQluZnNfcG9ydCA9IGh0b25zKG5mc19wb3J0KTsKIAogCWlmICgocG9ydCA9IHJvb3RfbmZzX2dldHBvcnQoTkZTX01OVF9QUk9HUkFNLCBtb3VudGRfdmVyLCBwcm90bykpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBVbmFibGUgdG8gZ2V0IG1vdW50ZCBwb3J0ICIKIAkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKIAkJcG9ydCA9IG1vdW50ZF9wb3J0OwogCX0KLQltb3VudF9wb3J0ID0gaHRvbnMocG9ydCk7CisJbW91bnRfcG9ydCA9IHBvcnQ7CiAJZHByaW50aygiUm9vdC1ORlM6IG1vdW50ZCBwb3J0IGlzICVkXG4iLCBwb3J0KTsKIAogCXJldHVybiAwOwpAQCAtNDk2LDcgKzQ5NSw3IEBACiAJaW50IHZlcnNpb24gPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgPwogCQkJCQlORlNfTU5UM19WRVJTSU9OIDogTkZTX01OVF9WRVJTSU9OOwogCi0Jc2V0X3NvY2thZGRyKCZzaW4sIHNlcnZhZGRyLCBtb3VudF9wb3J0KTsKKwlzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIGh0b25zKG1vdW50X3BvcnQpKTsKIAlzdGF0dXMgPSBuZnNyb290X21vdW50KCZzaW4sIG5mc19wYXRoLCAmZmgsIHZlcnNpb24sIHByb3RvY29sKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogU2VydmVyIHJldHVybmVkIGVycm9yICVkICIKQEAgLTUxOSw2ICs1MTgsNiBAQAogCSB8fCByb290X25mc19wb3J0cygpIDwgMAogCSB8fCByb290X25mc19nZXRfaGFuZGxlKCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmbmZzX2RhdGEuYWRkciwgc2VydmFkZHIsIG5mc19wb3J0KTsKKwlzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmbmZzX2RhdGEuYWRkciwgc2VydmFkZHIsIGh0b25zKG5mc19wb3J0KSk7CiAJcmV0dXJuICh2b2lkKikmbmZzX2RhdGE7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvcGFnZWxpc3QuYyBiL2ZzL25mcy9wYWdlbGlzdC5jCmluZGV4IDgyOWFmMzIuLmNhNGIxZDQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wYWdlbGlzdC5jCisrKyBiL2ZzL25mcy9wYWdlbGlzdC5jCkBAIC0xNywxNiArMTcsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogCiAjZGVmaW5lIE5GU19QQVJBTk9JQSAxCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKm5mc19wYWdlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbmZzX3BhZ2VfY2FjaGVwOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnNfcGFnZSAqCiBuZnNfcGFnZV9hbGxvYyh2b2lkKQogewogCXN0cnVjdCBuZnNfcGFnZQkqcDsKLQlwID0ga21lbV9jYWNoZV9hbGxvYyhuZnNfcGFnZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlwID0ga21lbV9jYWNoZV9hbGxvYyhuZnNfcGFnZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmIChwKSB7CiAJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnAtPndiX2xpc3QpOwpAQCAtMjY4LDExICsyNjksMTAgQEAKIAogI2RlZmluZSBORlNfU0NBTl9NQVhFTlRSSUVTIDE2CiAvKioKLSAqIG5mc19zY2FuX2xvY2tfZGlydHkgLSBTY2FuIHRoZSByYWRpeCB0cmVlIGZvciBkaXJ0eSByZXF1ZXN0cwotICogQG5mc2k6IE5GUyBpbm9kZQorICogbmZzX3NjYW5fZGlydHkgLSBTY2FuIHRoZSByYWRpeCB0cmVlIGZvciBkaXJ0eSByZXF1ZXN0cworICogQG1hcHBpbmc6IHBvaW50ZXIgdG8gYWRkcmVzcyBzcGFjZQorICogQHdiYzogd3JpdGViYWNrX2NvbnRyb2wgc3RydWN0dXJlCiAgKiBAZHN0OiBEZXN0aW5hdGlvbiBsaXN0Ci0gKiBAaWR4X3N0YXJ0OiBsb3dlciBib3VuZCBvZiBwYWdlLT5pbmRleCB0byBzY2FuCi0gKiBAbnBhZ2VzOiBpZHhfc3RhcnQgKyBucGFnZXMgc2V0cyB0aGUgdXBwZXIgYm91bmQgdG8gc2Nhbi4KICAqCiAgKiBNb3ZlcyBlbGVtZW50cyBmcm9tIG9uZSBvZiB0aGUgaW5vZGUgcmVxdWVzdCBsaXN0cy4KICAqIElmIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgaXMgc2V0IHRvIDAsIHRoZSBlbnRpcmUgYWRkcmVzc19zcGFjZQpAQCAtMjgwLDQ2ICsyODAsNjMgQEAKICAqIFRoZSByZXF1ZXN0cyBhcmUgKm5vdCogY2hlY2tlZCB0byBlbnN1cmUgdGhhdCB0aGV5IGZvcm0gYSBjb250aWd1b3VzIHNldC4KICAqIFlvdSBtdXN0IGJlIGhvbGRpbmcgdGhlIGlub2RlJ3MgcmVxX2xvY2sgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KICAqLwotaW50Ci1uZnNfc2Nhbl9sb2NrX2RpcnR5KHN0cnVjdCBuZnNfaW5vZGUgKm5mc2ksIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKLQkgICAgICB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwgdW5zaWduZWQgaW50IG5wYWdlcykKK2xvbmcgbmZzX3NjYW5fZGlydHkoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCkKIHsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0kobWFwcGluZy0+aG9zdCk7CiAJc3RydWN0IG5mc19wYWdlICpwZ3ZlY1tORlNfU0NBTl9NQVhFTlRSSUVTXTsKIAlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcTsKLQl1bnNpZ25lZCBsb25nIGlkeF9lbmQ7CisJcGdvZmZfdCBpZHhfc3RhcnQsIGlkeF9lbmQ7CisJbG9uZyByZXMgPSAwOwogCWludCBmb3VuZCwgaTsKLQlpbnQgcmVzOwogCi0JcmVzID0gMDsKLQlpZiAobnBhZ2VzID09IDApCi0JCWlkeF9lbmQgPSB+MDsKLQllbHNlCi0JCWlkeF9lbmQgPSBpZHhfc3RhcnQgKyBucGFnZXMgLSAxOworCWlmIChuZnNpLT5uZGlydHkgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHdiYy0+cmFuZ2VfY3ljbGljKSB7CisJCWlkeF9zdGFydCA9IDA7CisJCWlkeF9lbmQgPSBVTE9OR19NQVg7CisJfSBlbHNlIGlmICh3YmMtPnJhbmdlX2VuZCA9PSAwKSB7CisJCWlkeF9zdGFydCA9IHdiYy0+cmFuZ2Vfc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJaWR4X2VuZCA9IFVMT05HX01BWDsKKwl9IGVsc2UgeworCQlpZHhfc3RhcnQgPSB3YmMtPnJhbmdlX3N0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWlkeF9lbmQgPSB3YmMtPnJhbmdlX2VuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCX0KIAogCWZvciAoOzspIHsKKwkJdW5zaWduZWQgaW50IHRvc2NhbiA9IE5GU19TQ0FOX01BWEVOVFJJRVM7CisKIAkJZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3RhZygmbmZzaS0+bmZzX3BhZ2VfdHJlZSwKLQkJCQkodm9pZCAqKikmcGd2ZWNbMF0sIGlkeF9zdGFydCwgTkZTX1NDQU5fTUFYRU5UUklFUywKKwkJCQkodm9pZCAqKikmcGd2ZWNbMF0sIGlkeF9zdGFydCwgdG9zY2FuLAogCQkJCU5GU19QQUdFX1RBR19ESVJUWSk7CisKKwkJLyogRGlkIHdlIG1ha2UgcHJvZ3Jlc3M/ICovCiAJCWlmIChmb3VuZCA8PSAwKQogCQkJYnJlYWs7CisKIAkJZm9yIChpID0gMDsgaSA8IGZvdW5kOyBpKyspIHsKIAkJCXJlcSA9IHBndmVjW2ldOwotCQkJaWYgKHJlcS0+d2JfaW5kZXggPiBpZHhfZW5kKQorCQkJaWYgKCF3YmMtPnJhbmdlX2N5Y2xpYyAmJiByZXEtPndiX2luZGV4ID4gaWR4X2VuZCkKIAkJCQlnb3RvIG91dDsKIAorCQkJLyogVHJ5IHRvIGxvY2sgcmVxdWVzdCBhbmQgbWFyayBpdCBmb3Igd3JpdGViYWNrICovCisJCQlpZiAoIW5mc19zZXRfcGFnZV93cml0ZWJhY2tfbG9ja2VkKHJlcSkpCisJCQkJZ290byBuZXh0OworCQkJcmFkaXhfdHJlZV90YWdfY2xlYXIoJm5mc2ktPm5mc19wYWdlX3RyZWUsCisJCQkJCXJlcS0+d2JfaW5kZXgsIE5GU19QQUdFX1RBR19ESVJUWSk7CisJCQluZnNpLT5uZGlydHktLTsKKwkJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCQluZnNfbGlzdF9hZGRfcmVxdWVzdChyZXEsIGRzdCk7CisJCQlyZXMrKzsKKwkJCWlmIChyZXMgPT0gTE9OR19NQVgpCisJCQkJZ290byBvdXQ7CituZXh0OgogCQkJaWR4X3N0YXJ0ID0gcmVxLT53Yl9pbmRleCArIDE7Ci0KLQkJCWlmIChuZnNfc2V0X3BhZ2Vfd3JpdGViYWNrX2xvY2tlZChyZXEpKSB7Ci0JCQkJcmFkaXhfdHJlZV90YWdfY2xlYXIoJm5mc2ktPm5mc19wYWdlX3RyZWUsCi0JCQkJCQlyZXEtPndiX2luZGV4LCBORlNfUEFHRV9UQUdfRElSVFkpOwotCQkJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7Ci0JCQkJbmZzX2xpc3RfYWRkX3JlcXVlc3QocmVxLCBkc3QpOwotCQkJCWRlY196b25lX3BhZ2Vfc3RhdGUocmVxLT53Yl9wYWdlLCBOUl9GSUxFX0RJUlRZKTsKLQkJCQlyZXMrKzsKLQkJCX0KIAkJfQogCX0KIG91dDoKKwlXQVJOX09OICgobmZzaS0+bmRpcnR5ID09IDApICE9IGxpc3RfZW1wdHkoJm5mc2ktPmRpcnR5KSk7CiAJcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmZzL3Byb2MuYyBiL2ZzL25mcy9wcm9jLmMKaW5kZXggNDUyOWNjNC4uNTYwNTM2YSAxMDA2NDQKLS0tIGEvZnMvbmZzL3Byb2MuYworKysgYi9mcy9uZnMvcHJvYy5jCkBAIC0yMTUsMzIgKzIxNSw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBuZnNfcHJvY193cml0ZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhKQotewotCWludAkJCWZsYWdzID0gd2RhdGEtPmZsYWdzOwotCXN0cnVjdCBpbm9kZSAqCQlpbm9kZSA9IHdkYXRhLT5pbm9kZTsKLQlzdHJ1Y3QgbmZzX2ZhdHRyICoJZmF0dHIgPSB3ZGF0YS0+cmVzLmZhdHRyOwotCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7Ci0JCS5ycGNfcHJvYwk9ICZuZnNfcHJvY2VkdXJlc1tORlNQUk9DX1dSSVRFXSwKLQkJLnJwY19hcmdwCT0gJndkYXRhLT5hcmdzLAotCQkucnBjX3Jlc3AJPSAmd2RhdGEtPnJlcywKLQkJLnJwY19jcmVkCT0gd2RhdGEtPmNyZWQsCi0JfTsKLQlpbnQJCQlzdGF0dXM7Ci0KLQlkcHJpbnRrKCJORlMgY2FsbCAgd3JpdGUgJWQgQCAlTGRcbiIsIHdkYXRhLT5hcmdzLmNvdW50LAotCQkJKGxvbmcgbG9uZykgd2RhdGEtPmFyZ3Mub2Zmc2V0KTsKLQluZnNfZmF0dHJfaW5pdChmYXR0cik7Ci0Jc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGlub2RlKSwgJm1zZywgZmxhZ3MpOwotCWlmIChzdGF0dXMgPj0gMCkgewotCQluZnNfcG9zdF9vcF91cGRhdGVfaW5vZGUoaW5vZGUsIGZhdHRyKTsKLQkJd2RhdGEtPnJlcy5jb3VudCA9IHdkYXRhLT5hcmdzLmNvdW50OwotCQl3ZGF0YS0+dmVyZi5jb21taXR0ZWQgPSBORlNfRklMRV9TWU5DOwotCX0KLQlkcHJpbnRrKCJORlMgcmVwbHkgd3JpdGU6ICVkXG4iLCBzdGF0dXMpOwotCXJldHVybiBzdGF0dXMgPCAwPyBzdGF0dXMgOiB3ZGF0YS0+cmVzLmNvdW50OwotfQotCiBzdGF0aWMgaW50CiBuZnNfcHJvY19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICpzYXR0ciwKIAkJaW50IGZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKQEAgLTU0NSwxMyArNTE5LDEwIEBACiAJfTsKIAlpbnQJCQlzdGF0dXM7CiAKLQlsb2NrX2tlcm5lbCgpOwotCiAJZHByaW50aygiTkZTIGNhbGwgIHJlYWRkaXIgJWRcbiIsICh1bnNpZ25lZCBpbnQpY29va2llKTsKIAlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoZGlyKSwgJm1zZywgMCk7CiAKIAlkcHJpbnRrKCJORlMgcmVwbHkgcmVhZGRpcjogJWRcbiIsIHN0YXR1cyk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTY4MCw3ICs2NTEsNyBAQAogc3RhdGljIGludAogbmZzX3Byb2NfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7Ci0JcmV0dXJuIG5sbWNsbnRfcHJvYyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgY21kLCBmbCk7CisJcmV0dXJuIG5sbWNsbnRfcHJvYyhmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBjbWQsIGZsKTsKIH0KIAogCkBAIC02OTYsOCArNjY3LDYgQEAKIAkuYWNjZXNzCQk9IE5VTEwsCQkgICAgICAgLyogYWNjZXNzICovCiAJLnJlYWRsaW5rCT0gbmZzX3Byb2NfcmVhZGxpbmssCiAJLnJlYWQJCT0gbmZzX3Byb2NfcmVhZCwKLQkud3JpdGUJCT0gbmZzX3Byb2Nfd3JpdGUsCi0JLmNvbW1pdAkJPSBOVUxMLAkJICAgICAgIC8qIGNvbW1pdCAqLwogCS5jcmVhdGUJCT0gbmZzX3Byb2NfY3JlYXRlLAogCS5yZW1vdmUJCT0gbmZzX3Byb2NfcmVtb3ZlLAogCS51bmxpbmtfc2V0dXAJPSBuZnNfcHJvY191bmxpbmtfc2V0dXAsCmRpZmYgLS1naXQgYS9mcy9uZnMvcmVhZC5jIGIvZnMvbmZzL3JlYWQuYwppbmRleCBjMmU0OWMzLi5hOWMyNjUyIDEwMDY0NAotLS0gYS9mcy9uZnMvcmVhZC5jCisrKyBiL2ZzL25mcy9yZWFkLmMKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAorI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiaW9zdGF0LmgiCiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfUEFHRUNBQ0hFCkBAIC0zOCw3ICszOSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyBuZnNfcmVhZF9wYXJ0aWFsX29wczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX2NhbGxfb3BzIG5mc19yZWFkX2Z1bGxfb3BzOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICpuZnNfcmRhdGFfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpuZnNfcmRhdGFfY2FjaGVwOwogc3RhdGljIG1lbXBvb2xfdCAqbmZzX3JkYXRhX21lbXBvb2w7CiAKICNkZWZpbmUgTUlOX1BPT0xfUkVBRAkoMzIpCkBAIC00Niw3ICs0Nyw3IEBACiBzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqbmZzX3JlYWRkYXRhX2FsbG9jKHNpemVfdCBsZW4pCiB7CiAJdW5zaWduZWQgaW50IHBhZ2Vjb3VudCA9IChsZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpwID0gbWVtcG9vbF9hbGxvYyhuZnNfcmRhdGFfbWVtcG9vbCwgU0xBQl9OT0ZTKTsKKwlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcCA9IG1lbXBvb2xfYWxsb2MobmZzX3JkYXRhX21lbXBvb2wsIEdGUF9OT0ZTKTsKIAogCWlmIChwKSB7CiAJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKQEAgLTY1LDM1ICs2NiwyNSBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdm9pZCBuZnNfcmVhZGRhdGFfZnJlZShzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcCkKK3N0YXRpYyB2b2lkIG5mc19yZWFkZGF0YV9yY3VfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CisJc3RydWN0IG5mc19yZWFkX2RhdGEgKnAgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG5mc19yZWFkX2RhdGEsIHRhc2sudS50a19yY3UpOwogCWlmIChwICYmIChwLT5wYWdldmVjICE9ICZwLT5wYWdlX2FycmF5WzBdKSkKIAkJa2ZyZWUocC0+cGFnZXZlYyk7CiAJbWVtcG9vbF9mcmVlKHAsIG5mc19yZGF0YV9tZW1wb29sKTsKIH0KIAorc3RhdGljIHZvaWQgbmZzX3JlYWRkYXRhX2ZyZWUoc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhKQoreworCWNhbGxfcmN1X2JoKCZyZGF0YS0+dGFzay51LnRrX3JjdSwgbmZzX3JlYWRkYXRhX3JjdV9mcmVlKTsKK30KKwogdm9pZCBuZnNfcmVhZGRhdGFfcmVsZWFzZSh2b2lkICpkYXRhKQogewogICAgICAgICBuZnNfcmVhZGRhdGFfZnJlZShkYXRhKTsKIH0KIAogc3RhdGljCi11bnNpZ25lZCBpbnQgbmZzX3BhZ2VfbGVuZ3RoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlKQotewotCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JdW5zaWduZWQgbG9uZyBpZHg7Ci0KLQlpZiAoaV9zaXplIDw9IDApCi0JCXJldHVybiAwOwotCWlkeCA9IChpX3NpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCWlmIChwYWdlLT5pbmRleCA+IGlkeCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHBhZ2UtPmluZGV4ICE9IGlkeCkKLQkJcmV0dXJuIFBBR0VfQ0FDSEVfU0laRTsKLQlyZXR1cm4gMSArICgoaV9zaXplIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwotfQotCi1zdGF0aWMKIGludCBuZnNfcmV0dXJuX2VtcHR5X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKQEAgLTEzOSwxMiArMTMwLDEyIEBACiB7CiAJdW5zaWduZWQgaW50CXJzaXplID0gTkZTX1NFUlZFUihpbm9kZSktPnJzaXplOwogCXVuc2lnbmVkIGludAljb3VudCA9IFBBR0VfQ0FDSEVfU0laRTsKLQlpbnQJCXJlc3VsdDsKKwlpbnQgcmVzdWx0ID0gLUVOT01FTTsKIAlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGE7CiAKIAlyZGF0YSA9IG5mc19yZWFkZGF0YV9hbGxvYyhjb3VudCk7CiAJaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0X3VubG9jazsKIAogCW1lbXNldChyZGF0YSwgMCwgc2l6ZW9mKCpyZGF0YSkpOwogCXJkYXRhLT5mbGFncyA9IChJU19TV0FQRklMRShpbm9kZSk/IE5GU19SUENfU1dBUEZMQUdTIDogMCk7CkBAIC0yMTIsOCArMjAzLDkgQEAKIAlyZXN1bHQgPSAwOwogCiBpb19lcnJvcjoKLQl1bmxvY2tfcGFnZShwYWdlKTsKIAluZnNfcmVhZGRhdGFfZnJlZShyZGF0YSk7CitvdXRfdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIyNCw3ICsyMTYsNyBAQAogCXN0cnVjdCBuZnNfcGFnZQkqbmV3OwogCXVuc2lnbmVkIGludCBsZW47CiAKLQlsZW4gPSBuZnNfcGFnZV9sZW5ndGgoaW5vZGUsIHBhZ2UpOworCWxlbiA9IG5mc19wYWdlX2xlbmd0aChwYWdlKTsKIAlpZiAobGVuID09IDApCiAJCXJldHVybiBuZnNfcmV0dXJuX2VtcHR5X3BhZ2UocGFnZSk7CiAJbmV3ID0gbmZzX2NyZWF0ZV9yZXF1ZXN0KGN0eCwgaW5vZGUsIHBhZ2UsIDAsIGxlbik7CkBAIC0zMTYsOSArMzA4LDcgQEAKIAlzaWdzZXRfdCBvbGRzZXQ7CiAKIAlycGNfY2xudF9zaWdtYXNrKGNsbnQsICZvbGRzZXQpOwotCWxvY2tfa2VybmVsKCk7CiAJcnBjX2V4ZWN1dGUoJmRhdGEtPnRhc2spOwotCXVubG9ja19rZXJuZWwoKTsKIAlycGNfY2xudF9zaWd1bm1hc2soY2xudCwgJm9sZHNldCk7CiB9CiAKQEAgLTQ1NSw2ICs0NDUsNTUgQEAKIH0KIAogLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZyb20gUlBDIHRlbGxpbmcgdXMgd2hldGhlciBhIHJlcGx5IHdhcworICogcmVjZWl2ZWQgb3Igc29tZSBlcnJvciBvY2N1cnJlZCAodGltZW91dCBvciBzb2NrZXQgc2h1dGRvd24pLgorICovCitpbnQgbmZzX3JlYWRwYWdlX3Jlc3VsdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQoreworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCIlczogJTRkLCAoc3RhdHVzICVkKVxuIiwgX19GVU5DVElPTl9fLCB0YXNrLT50a19waWQsCisJCQl0YXNrLT50a19zdGF0dXMpOworCisJc3RhdHVzID0gTkZTX1BST1RPKGRhdGEtPmlub2RlKS0+cmVhZF9kb25lKHRhc2ssIGRhdGEpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCW5mc19hZGRfc3RhdHMoZGF0YS0+aW5vZGUsIE5GU0lPU19TRVJWRVJSRUFEQllURVMsIGRhdGEtPnJlcy5jb3VudCk7CisKKwlpZiAodGFzay0+dGtfc3RhdHVzID09IC1FU1RBTEUpIHsKKwkJc2V0X2JpdChORlNfSU5PX1NUQUxFLCAmTkZTX0ZMQUdTKGRhdGEtPmlub2RlKSk7CisJCW5mc19tYXJrX2Zvcl9yZXZhbGlkYXRlKGRhdGEtPmlub2RlKTsKKwl9CisJc3Bpbl9sb2NrKCZkYXRhLT5pbm9kZS0+aV9sb2NrKTsKKwlORlNfSShkYXRhLT5pbm9kZSktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVElNRTsKKwlzcGluX3VubG9jaygmZGF0YS0+aW5vZGUtPmlfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3JlYWRwYWdlX3JldHJ5KHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IG5mc19yZWFkYXJncyAqYXJncCA9ICZkYXRhLT5hcmdzOworCXN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzcCA9ICZkYXRhLT5yZXM7CisKKwlpZiAocmVzcC0+ZW9mIHx8IHJlc3AtPmNvdW50ID09IGFyZ3AtPmNvdW50KQorCQlyZXR1cm4gMDsKKworCS8qIFRoaXMgaXMgYSBzaG9ydCByZWFkISAqLworCW5mc19pbmNfc3RhdHMoZGF0YS0+aW5vZGUsIE5GU0lPU19TSE9SVFJFQUQpOworCS8qIEhhcyB0aGUgc2VydmVyIGF0IGxlYXN0IG1hZGUgc29tZSBwcm9ncmVzcz8gKi8KKwlpZiAocmVzcC0+Y291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBZZXMsIHNvIHJldHJ5IHRoZSByZWFkIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgKi8KKwlhcmdwLT5vZmZzZXQgKz0gcmVzcC0+Y291bnQ7CisJYXJncC0+cGdiYXNlICs9IHJlc3AtPmNvdW50OworCWFyZ3AtPmNvdW50IC09IHJlc3AtPmNvdW50OworCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qCiAgKiBIYW5kbGUgYSByZWFkIHJlcGx5IHRoYXQgZmlsbHMgcGFydCBvZiBhIHBhZ2UuCiAgKi8KIHN0YXRpYyB2b2lkIG5mc19yZWFkcGFnZV9yZXN1bHRfcGFydGlhbChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHZvaWQgKmNhbGxkYXRhKQpAQCAtNDYzLDEyICs1MDIsMTYgQEAKIAlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSA9IGRhdGEtPnJlcTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+d2JfcGFnZTsKICAKLQlpZiAobGlrZWx5KHRhc2stPnRrX3N0YXR1cyA+PSAwKSkKLQkJbmZzX3JlYWRwYWdlX3RydW5jYXRlX3VuaW5pdGlhbGlzZWRfcGFnZShkYXRhKTsKLQllbHNlCi0JCVNldFBhZ2VFcnJvcihwYWdlKTsKIAlpZiAobmZzX3JlYWRwYWdlX3Jlc3VsdCh0YXNrLCBkYXRhKSAhPSAwKQogCQlyZXR1cm47CisKKwlpZiAobGlrZWx5KHRhc2stPnRrX3N0YXR1cyA+PSAwKSkgeworCQluZnNfcmVhZHBhZ2VfdHJ1bmNhdGVfdW5pbml0aWFsaXNlZF9wYWdlKGRhdGEpOworCQlpZiAobmZzX3JlYWRwYWdlX3JldHJ5KHRhc2ssIGRhdGEpICE9IDApCisJCQlyZXR1cm47CisJfQorCWlmICh1bmxpa2VseSh0YXNrLT50a19zdGF0dXMgPCAwKSkKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPndiX2NvbXBsZXRlKSkgewogCQlpZiAoIVBhZ2VFcnJvcihwYWdlKSkKIAkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKQEAgLTQ5NiwyNSArNTM5LDEzIEBACiAJY291bnQgKz0gYmFzZTsKIAlmb3IgKDtjb3VudCA+PSBQQUdFX0NBQ0hFX1NJWkU7IGNvdW50IC09IFBBR0VfQ0FDSEVfU0laRSwgcGFnZXMrKykKIAkJU2V0UGFnZVVwdG9kYXRlKCpwYWdlcyk7Ci0JaWYgKGNvdW50ICE9IDApCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybjsKKwkvKiBXYXMgdGhpcyBhIHNob3J0IHJlYWQ/ICovCisJaWYgKGRhdGEtPnJlcy5lb2YgfHwgZGF0YS0+cmVzLmNvdW50ID09IGRhdGEtPmFyZ3MuY291bnQpCiAJCVNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpOwogfQogCi1zdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX2Vycm9yKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQotewotCXVuc2lnbmVkIGludCBjb3VudCA9IGRhdGEtPmFyZ3MuY291bnQ7Ci0JdW5zaWduZWQgaW50IGJhc2UgPSBkYXRhLT5hcmdzLnBnYmFzZTsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwotCi0JcGFnZXMgPSAmZGF0YS0+YXJncy5wYWdlc1tiYXNlID4+IFBBR0VfQ0FDSEVfU0hJRlRdOwotCWJhc2UgJj0gflBBR0VfQ0FDSEVfTUFTSzsKLQljb3VudCArPSBiYXNlOwotCWZvciAoO2NvdW50ID49IFBBR0VfQ0FDSEVfU0laRTsgY291bnQgLT0gUEFHRV9DQUNIRV9TSVpFLCBwYWdlcysrKQotCQlTZXRQYWdlRXJyb3IoKnBhZ2VzKTsKLQlpZiAoY291bnQgIT0gMCkKLQkJU2V0UGFnZUVycm9yKCpwYWdlcyk7Ci19Ci0KIC8qCiAgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmcm9tIFJQQyB0ZWxsaW5nIHVzIHdoZXRoZXIgYSByZXBseSB3YXMKICAqIHJlY2VpdmVkIG9yIHNvbWUgZXJyb3Igb2NjdXJyZWQgKHRpbWVvdXQgb3Igc29ja2V0IHNodXRkb3duKS4KQEAgLTUyMywxOSArNTU0LDIwIEBACiB7CiAJc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEgPSBjYWxsZGF0YTsKIAorCWlmIChuZnNfcmVhZHBhZ2VfcmVzdWx0KHRhc2ssIGRhdGEpICE9IDApCisJCXJldHVybjsKIAkvKgotCSAqIE5vdGU6IG5mc19yZWFkcGFnZV9yZXN1bHQgbWF5IGNoYW5nZSB0aGUgdmFsdWVzIG9mCisJICogTm90ZTogbmZzX3JlYWRwYWdlX3JldHJ5IG1heSBjaGFuZ2UgdGhlIHZhbHVlcyBvZgogCSAqIGRhdGEtPmFyZ3MuIEluIHRoZSBtdWx0aS1wYWdlIGNhc2UsIHdlIHRoZXJlZm9yZSBuZWVkCi0JICogdG8gZW5zdXJlIHRoYXQgd2UgY2FsbCB0aGUgbmV4dCBuZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VfdXB0b2RhdGUoKQotCSAqIGZpcnN0IGluIHRoZSBtdWx0aS1wYWdlIGNhc2UuCisJICogdG8gZW5zdXJlIHRoYXQgd2UgY2FsbCBuZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX3VwdG9kYXRlKCkKKwkgKiBmaXJzdC4KIAkgKi8KIAlpZiAobGlrZWx5KHRhc2stPnRrX3N0YXR1cyA+PSAwKSkgewogCQluZnNfcmVhZHBhZ2VfdHJ1bmNhdGVfdW5pbml0aWFsaXNlZF9wYWdlKGRhdGEpOwogCQluZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX3VwdG9kYXRlKGRhdGEpOwotCX0gZWxzZQotCQluZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX2Vycm9yKGRhdGEpOwotCWlmIChuZnNfcmVhZHBhZ2VfcmVzdWx0KHRhc2ssIGRhdGEpICE9IDApCi0JCXJldHVybjsKKwkJaWYgKG5mc19yZWFkcGFnZV9yZXRyeSh0YXNrLCBkYXRhKSAhPSAwKQorCQkJcmV0dXJuOworCX0KIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmRhdGEtPnBhZ2VzKSkgewogCQlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSA9IG5mc19saXN0X2VudHJ5KGRhdGEtPnBhZ2VzLm5leHQpOwogCkBAIC01NTAsNTAgKzU4Miw2IEBACiB9OwogCiAvKgotICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnJvbSBSUEMgdGVsbGluZyB1cyB3aGV0aGVyIGEgcmVwbHkgd2FzCi0gKiByZWNlaXZlZCBvciBzb21lIGVycm9yIG9jY3VycmVkICh0aW1lb3V0IG9yIHNvY2tldCBzaHV0ZG93bikuCi0gKi8KLWludCBuZnNfcmVhZHBhZ2VfcmVzdWx0KHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IG5mc19yZWFkYXJncyAqYXJncCA9ICZkYXRhLT5hcmdzOwotCXN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzcCA9ICZkYXRhLT5yZXM7Ci0JaW50IHN0YXR1czsKLQotCWRwcmludGsoIk5GUzogJTRkIG5mc19yZWFkcGFnZV9yZXN1bHQsIChzdGF0dXMgJWQpXG4iLAotCQl0YXNrLT50a19waWQsIHRhc2stPnRrX3N0YXR1cyk7Ci0KLQlzdGF0dXMgPSBORlNfUFJPVE8oZGF0YS0+aW5vZGUpLT5yZWFkX2RvbmUodGFzaywgZGF0YSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JbmZzX2FkZF9zdGF0cyhkYXRhLT5pbm9kZSwgTkZTSU9TX1NFUlZFUlJFQURCWVRFUywgcmVzcC0+Y291bnQpOwotCi0JaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKLQkJaWYgKHRhc2stPnRrX3N0YXR1cyA9PSAtRVNUQUxFKSB7Ci0JCQlzZXRfYml0KE5GU19JTk9fU1RBTEUsICZORlNfRkxBR1MoZGF0YS0+aW5vZGUpKTsKLQkJCW5mc19tYXJrX2Zvcl9yZXZhbGlkYXRlKGRhdGEtPmlub2RlKTsKLQkJfQotCX0gZWxzZSBpZiAocmVzcC0+Y291bnQgPCBhcmdwLT5jb3VudCAmJiAhcmVzcC0+ZW9mKSB7Ci0JCS8qIFRoaXMgaXMgYSBzaG9ydCByZWFkISAqLwotCQluZnNfaW5jX3N0YXRzKGRhdGEtPmlub2RlLCBORlNJT1NfU0hPUlRSRUFEKTsKLQkJLyogSGFzIHRoZSBzZXJ2ZXIgYXQgbGVhc3QgbWFkZSBzb21lIHByb2dyZXNzPyAqLwotCQlpZiAocmVzcC0+Y291bnQgIT0gMCkgewotCQkJLyogWWVzLCBzbyByZXRyeSB0aGUgcmVhZCBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhICovCi0JCQlhcmdwLT5vZmZzZXQgKz0gcmVzcC0+Y291bnQ7Ci0JCQlhcmdwLT5wZ2Jhc2UgKz0gcmVzcC0+Y291bnQ7Ci0JCQlhcmdwLT5jb3VudCAtPSByZXNwLT5jb3VudDsKLQkJCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCQl0YXNrLT50a19zdGF0dXMgPSAtRUlPOwotCX0KLQlzcGluX2xvY2soJmRhdGEtPmlub2RlLT5pX2xvY2spOwotCU5GU19JKGRhdGEtPmlub2RlKS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0FUSU1FOwotCXNwaW5fdW5sb2NrKCZkYXRhLT5pbm9kZS0+aV9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIFJlYWQgYSBwYWdlIG92ZXIgTkZTLgogICogV2UgcmVhZCB0aGUgcGFnZSBzeW5jaHJvbm91c2x5IGluIHRoZSBmb2xsb3dpbmcgY2FzZToKICAqICAtCVRoZSBlcnJvciBmbGFnIGlzIHNldCBmb3IgdGhpcyBwYWdlLiBUaGlzIGhhcHBlbnMgb25seSB3aGVuIGEKQEAgLTYyNiw5ICs2MTQsMTAgQEAKIAkJZ290byBvdXRfZXJyb3I7CiAKIAlpZiAoZmlsZSA9PSBOVUxMKSB7CisJCWVycm9yID0gLUVCQURGOwogCQljdHggPSBuZnNfZmluZF9vcGVuX2NvbnRleHQoaW5vZGUsIE5VTEwsIEZNT0RFX1JFQUQpOwogCQlpZiAoY3R4ID09IE5VTEwpCi0JCQlyZXR1cm4gLUVCQURGOworCQkJZ290byBvdXRfZXJyb3I7CiAJfSBlbHNlCiAJCWN0eCA9IGdldF9uZnNfb3Blbl9jb250ZXh0KChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKQogCQkJCWZpbGUtPnByaXZhdGVfZGF0YSk7CkBAIC02NjMsNyArNjUyLDcgQEAKIAl1bnNpZ25lZCBpbnQgbGVuOwogCiAJbmZzX3diX3BhZ2UoaW5vZGUsIHBhZ2UpOwotCWxlbiA9IG5mc19wYWdlX2xlbmd0aChpbm9kZSwgcGFnZSk7CisJbGVuID0gbmZzX3BhZ2VfbGVuZ3RoKHBhZ2UpOwogCWlmIChsZW4gPT0gMCkKIAkJcmV0dXJuIG5mc19yZXR1cm5fZW1wdHlfcGFnZShwYWdlKTsKIAluZXcgPSBuZnNfY3JlYXRlX3JlcXVlc3QoZGVzYy0+Y3R4LCBpbm9kZSwgcGFnZSwgMCwgbGVuKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBlci5jIGIvZnMvbmZzL3N1cGVyLmMKaW5kZXggMjg2NTlhOS4uMjgxMDhjOCAxMDA2NDQKLS0tIGEvZnMvbmZzL3N1cGVyLmMKKysrIGIvZnMvbmZzL3N1cGVyLmMKQEAgLTgzNCw3ICs4MzQsNyBAQAogCX0KIAkvKiBSRkMzNTMwOiBUaGUgZGVmYXVsdCBwb3J0IGZvciBORlMgaXMgMjA0OSAqLwogCWlmIChhZGRyLnNpbl9wb3J0ID09IDApCi0JCWFkZHIuc2luX3BvcnQgPSBORlNfUE9SVDsKKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKE5GU19QT1JUKTsKIAogCS8qIEdyYWIgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgKi8KIAlhdXRoZmxhdm91ciA9IFJQQ19BVVRIX1VOSVg7CmRpZmYgLS1naXQgYS9mcy9uZnMvc3ltbGluay5jIGIvZnMvbmZzL3N5bWxpbmsuYwppbmRleCA2MDBiYmU2Li42YzY4NjExIDEwMDY0NAotLS0gYS9mcy9uZnMvc3ltbGluay5jCisrKyBiL2ZzL25mcy9zeW1saW5rLmMKQEAgLTMzLDkgKzMzLDcgQEAKIHsKIAlpbnQgZXJyb3I7CiAKLQlsb2NrX2tlcm5lbCgpOwogCWVycm9yID0gTkZTX1BST1RPKGlub2RlKS0+cmVhZGxpbmsoaW5vZGUsIHBhZ2UsIDAsIFBBR0VfU0laRSk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gZXJyb3I7CiAJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL3N5c2N0bC5jIGIvZnMvbmZzL3N5c2N0bC5jCmluZGV4IDJmZTM0MDMuLjNlYTUwYWMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9zeXNjdGwuYworKysgYi9mcy9uZnMvc3lzY3RsLmMKQEAgLTE4LDExICsxOCw2IEBACiBzdGF0aWMgY29uc3QgaW50IG5mc19zZXRfcG9ydF9taW4gPSAwOwogc3RhdGljIGNvbnN0IGludCBuZnNfc2V0X3BvcnRfbWF4ID0gNjU1MzU7CiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKm5mc19jYWxsYmFja19zeXNjdGxfdGFibGU7Ci0vKgotICogU29tZXRoaW5nIHRoYXQgaXNuJ3QgQ1RMX0FOWSwgQ1RMX05PTkUgb3IgYSB2YWx1ZSB0aGF0IG1heSBjbGFzaC4KLSAqIFVzZSB0aGUgc2FtZSB2YWx1ZXMgYXMgZnMvbG9ja2Qvc3ZjLmMKLSAqLwotI2RlZmluZSBDVExfVU5OVU1CRVJFRCAtMgogCiBzdGF0aWMgY3RsX3RhYmxlIG5mc19jYl9zeXNjdGxzW10gPSB7CiAjaWZkZWYgQ09ORklHX05GU19WNApkaWZmIC0tZ2l0IGEvZnMvbmZzL3dyaXRlLmMgYi9mcy9uZnMvd3JpdGUuYwppbmRleCBmNjY3NWQyLi4zNDU0OTJlIDEwMDY0NAotLS0gYS9mcy9uZnMvd3JpdGUuYworKysgYi9mcy9uZnMvd3JpdGUuYwpAQCAtNTcsMTAgKzU3LDEzIEBACiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogCiAjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiaW9zdGF0LmgiCiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfUEFHRUNBQ0hFCkBAIC03MiwxOCArNzUsMTcgQEAKICAqIExvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwogICovCiBzdGF0aWMgc3RydWN0IG5mc19wYWdlICogbmZzX3VwZGF0ZV9yZXF1ZXN0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0KiwKLQkJCQkJICAgIHN0cnVjdCBpbm9kZSAqLAogCQkJCQkgICAgc3RydWN0IHBhZ2UgKiwKIAkJCQkJICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIG5mc19tYXJrX3JlcXVlc3RfZGlydHkoc3RydWN0IG5mc19wYWdlICpyZXEpOwogc3RhdGljIGludCBuZnNfd2FpdF9vbl93cml0ZV9jb25nZXN0aW9uKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIGludCk7CiBzdGF0aWMgaW50IG5mc193YWl0X29uX3JlcXVlc3RzKHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIGludCBuZnNfZmx1c2hfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsCi0JCQkgICB1bnNpZ25lZCBpbnQgbnBhZ2VzLCBpbnQgaG93KTsKK3N0YXRpYyBsb25nIG5mc19mbHVzaF9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywgaW50IGhvdyk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyBuZnNfd3JpdGVfcGFydGlhbF9vcHM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyBuZnNfd3JpdGVfZnVsbF9vcHM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyBuZnNfY29tbWl0X29wczsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqbmZzX3dkYXRhX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbmZzX3dkYXRhX2NhY2hlcDsKIHN0YXRpYyBtZW1wb29sX3QgKm5mc193ZGF0YV9tZW1wb29sOwogc3RhdGljIG1lbXBvb2xfdCAqbmZzX2NvbW1pdF9tZW1wb29sOwogCkBAIC05MSw3ICs5Myw3IEBACiAKIHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqbmZzX2NvbW1pdF9hbGxvYyh2b2lkKQogewotCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqcCA9IG1lbXBvb2xfYWxsb2MobmZzX2NvbW1pdF9tZW1wb29sLCBTTEFCX05PRlMpOworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqcCA9IG1lbXBvb2xfYWxsb2MobmZzX2NvbW1pdF9tZW1wb29sLCBHRlBfTk9GUyk7CiAKIAlpZiAocCkgewogCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CkBAIC0xMDAsMTcgKzEwMiwyMyBAQAogCXJldHVybiBwOwogfQogCi12b2lkIG5mc19jb21taXRfZnJlZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKnApCit2b2lkIG5mc19jb21taXRfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogeworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqcCA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEsIHRhc2sudS50a19yY3UpOwogCWlmIChwICYmIChwLT5wYWdldmVjICE9ICZwLT5wYWdlX2FycmF5WzBdKSkKIAkJa2ZyZWUocC0+cGFnZXZlYyk7CiAJbWVtcG9vbF9mcmVlKHAsIG5mc19jb21taXRfbWVtcG9vbCk7CiB9CiAKK3ZvaWQgbmZzX2NvbW1pdF9mcmVlKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEpCit7CisJY2FsbF9yY3VfYmgoJndkYXRhLT50YXNrLnUudGtfcmN1LCBuZnNfY29tbWl0X3JjdV9mcmVlKTsKK30KKwogc3RydWN0IG5mc193cml0ZV9kYXRhICpuZnNfd3JpdGVkYXRhX2FsbG9jKHNpemVfdCBsZW4pCiB7CiAJdW5zaWduZWQgaW50IHBhZ2Vjb3VudCA9IChsZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqcCA9IG1lbXBvb2xfYWxsb2MobmZzX3dkYXRhX21lbXBvb2wsIFNMQUJfTk9GUyk7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICpwID0gbWVtcG9vbF9hbGxvYyhuZnNfd2RhdGFfbWVtcG9vbCwgR0ZQX05PRlMpOwogCiAJaWYgKHApIHsKIAkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOwpAQCAtMTI5LDE4ICsxMzcsNDcgQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHZvaWQgbmZzX3dyaXRlZGF0YV9mcmVlKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqcCkKK3N0YXRpYyB2b2lkIG5mc193cml0ZWRhdGFfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogeworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqcCA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEsIHRhc2sudS50a19yY3UpOwogCWlmIChwICYmIChwLT5wYWdldmVjICE9ICZwLT5wYWdlX2FycmF5WzBdKSkKIAkJa2ZyZWUocC0+cGFnZXZlYyk7CiAJbWVtcG9vbF9mcmVlKHAsIG5mc193ZGF0YV9tZW1wb29sKTsKIH0KIAorc3RhdGljIHZvaWQgbmZzX3dyaXRlZGF0YV9mcmVlKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEpCit7CisJY2FsbF9yY3VfYmgoJndkYXRhLT50YXNrLnUudGtfcmN1LCBuZnNfd3JpdGVkYXRhX3JjdV9mcmVlKTsKK30KKwogdm9pZCBuZnNfd3JpdGVkYXRhX3JlbGVhc2Uodm9pZCAqd2RhdGEpCiB7CiAJbmZzX3dyaXRlZGF0YV9mcmVlKHdkYXRhKTsKIH0KIAorc3RhdGljIHN0cnVjdCBuZnNfcGFnZSAqbmZzX3BhZ2VfZmluZF9yZXF1ZXN0X2xvY2tlZChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSA9IE5VTEw7CisKKwlpZiAoUGFnZVByaXZhdGUocGFnZSkpIHsKKwkJcmVxID0gKHN0cnVjdCBuZnNfcGFnZSAqKXBhZ2VfcHJpdmF0ZShwYWdlKTsKKwkJaWYgKHJlcSAhPSBOVUxMKQorCQkJYXRvbWljX2luYygmcmVxLT53Yl9jb3VudCk7CisJfQorCXJldHVybiByZXE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzX3BhZ2UgKm5mc19wYWdlX2ZpbmRfcmVxdWVzdChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSA9IE5VTEw7CisJc3BpbmxvY2tfdCAqcmVxX2xvY2sgPSAmTkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPnJlcV9sb2NrOworCisJc3Bpbl9sb2NrKHJlcV9sb2NrKTsKKwlyZXEgPSBuZnNfcGFnZV9maW5kX3JlcXVlc3RfbG9ja2VkKHBhZ2UpOworCXNwaW5fdW5sb2NrKHJlcV9sb2NrKTsKKwlyZXR1cm4gcmVxOworfQorCiAvKiBBZGp1c3QgdGhlIGZpbGUgbGVuZ3RoIGlmIHdlJ3JlIHdyaXRpbmcgYmV5b25kIHRoZSBlbmQgKi8KIHN0YXRpYyB2b2lkIG5mc19ncm93X2ZpbGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKQEAgLTE2MiwxMTMgKzE5OSwzNCBAQAogICovCiBzdGF0aWMgdm9pZCBuZnNfbWFya191cHRvZGF0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKLQlsb2ZmX3QgZW5kX29mZnM7Ci0KIAlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKQogCQlyZXR1cm47CiAJaWYgKGJhc2UgIT0gMCkKIAkJcmV0dXJuOwotCWlmIChjb3VudCA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKLQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWlmIChjb3VudCAhPSBuZnNfcGFnZV9sZW5ndGgocGFnZSkpCiAJCXJldHVybjsKLQl9Ci0KLQllbmRfb2ZmcyA9IGlfc2l6ZV9yZWFkKHBhZ2UtPm1hcHBpbmctPmhvc3QpIC0gMTsKLQlpZiAoZW5kX29mZnMgPCAwKQotCQlyZXR1cm47Ci0JLyogSXMgdGhpcyB0aGUgbGFzdCBwYWdlPyAqLwotCWlmIChwYWdlLT5pbmRleCAhPSAodW5zaWduZWQgbG9uZykoZW5kX29mZnMgPj4gUEFHRV9DQUNIRV9TSElGVCkpCi0JCXJldHVybjsKLQkvKiBUaGlzIGlzIHRoZSBsYXN0IHBhZ2U6IHNldCBQR191cHRvZGF0ZSBpZiB3ZSBjb3ZlciB0aGUgZW50aXJlCi0JICogZXh0ZW50IG9mIHRoZSBkYXRhLCB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIHBhZ2UuCi0JICovCi0JaWYgKGNvdW50ID09ICh1bnNpZ25lZCBpbnQpKGVuZF9vZmZzICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIDEpIHsKKwlpZiAoY291bnQgIT0gUEFHRV9DQUNIRV9TSVpFKQogCQltZW1jbGVhcl9oaWdocGFnZV9mbHVzaChwYWdlLCBjb3VudCwgUEFHRV9DQUNIRV9TSVpFIC0gY291bnQpOwotCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JfQorCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIH0KIAotLyoKLSAqIFdyaXRlIGEgcGFnZSBzeW5jaHJvbm91c2x5LgotICogT2Zmc2V0IGlzIHRoZSBkYXRhIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UuCi0gKi8KLXN0YXRpYyBpbnQgbmZzX3dyaXRlcGFnZV9zeW5jKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgY291bnQsCi0JCWludCBob3cpCi17Ci0JdW5zaWduZWQgaW50CXdzaXplID0gTkZTX1NFUlZFUihpbm9kZSktPndzaXplOwotCWludAkJcmVzdWx0LCB3cml0dGVuID0gMDsKLQlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhOwotCi0Jd2RhdGEgPSBuZnNfd3JpdGVkYXRhX2FsbG9jKHdzaXplKTsKLQlpZiAoIXdkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXdkYXRhLT5mbGFncyA9IGhvdzsKLQl3ZGF0YS0+Y3JlZCA9IGN0eC0+Y3JlZDsKLQl3ZGF0YS0+aW5vZGUgPSBpbm9kZTsKLQl3ZGF0YS0+YXJncy5maCA9IE5GU19GSChpbm9kZSk7Ci0Jd2RhdGEtPmFyZ3MuY29udGV4dCA9IGN0eDsKLQl3ZGF0YS0+YXJncy5wYWdlcyA9ICZwYWdlOwotCXdkYXRhLT5hcmdzLnN0YWJsZSA9IE5GU19GSUxFX1NZTkM7Ci0Jd2RhdGEtPmFyZ3MucGdiYXNlID0gb2Zmc2V0OwotCXdkYXRhLT5hcmdzLmNvdW50ID0gd3NpemU7Ci0Jd2RhdGEtPnJlcy5mYXR0ciA9ICZ3ZGF0YS0+ZmF0dHI7Ci0Jd2RhdGEtPnJlcy52ZXJmID0gJndkYXRhLT52ZXJmOwotCi0JZHByaW50aygiTkZTOiAgICAgIG5mc193cml0ZXBhZ2Vfc3luYyglcy8lTGQgJWRAJUxkKVxuIiwKLQkJaW5vZGUtPmlfc2ItPnNfaWQsCi0JCShsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSksCi0JCWNvdW50LCAobG9uZyBsb25nKShwYWdlX29mZnNldChwYWdlKSArIG9mZnNldCkpOwotCi0Jc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShpbm9kZSk7Ci0JZG8gewotCQlpZiAoY291bnQgPCB3c2l6ZSkKLQkJCXdkYXRhLT5hcmdzLmNvdW50ID0gY291bnQ7Ci0JCXdkYXRhLT5hcmdzLm9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpICsgd2RhdGEtPmFyZ3MucGdiYXNlOwotCi0JCXJlc3VsdCA9IE5GU19QUk9UTyhpbm9kZSktPndyaXRlKHdkYXRhKTsKLQotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJLyogTXVzdCBtYXJrIHRoZSBwYWdlIGludmFsaWQgYWZ0ZXIgSS9PIGVycm9yICovCi0JCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLQkJCWdvdG8gaW9fZXJyb3I7Ci0JCX0KLQkJaWYgKHJlc3VsdCA8IHdkYXRhLT5hcmdzLmNvdW50KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBzaG9ydCB3cml0ZSwgY291bnQ9JXUsIHJlc3VsdD0lZFxuIiwKLQkJCQkJd2RhdGEtPmFyZ3MuY291bnQsIHJlc3VsdCk7Ci0KLQkJd2RhdGEtPmFyZ3Mub2Zmc2V0ICs9IHJlc3VsdDsKLQkgICAgICAgIHdkYXRhLT5hcmdzLnBnYmFzZSArPSByZXN1bHQ7Ci0JCXdyaXR0ZW4gKz0gcmVzdWx0OwotCQljb3VudCAtPSByZXN1bHQ7Ci0JCW5mc19hZGRfc3RhdHMoaW5vZGUsIE5GU0lPU19TRVJWRVJXUklUVEVOQllURVMsIHJlc3VsdCk7Ci0JfSB3aGlsZSAoY291bnQpOwotCS8qIFVwZGF0ZSBmaWxlIGxlbmd0aCAqLwotCW5mc19ncm93X2ZpbGUocGFnZSwgb2Zmc2V0LCB3cml0dGVuKTsKLQkvKiBTZXQgdGhlIFBHX3VwdG9kYXRlIGZsYWc/ICovCi0JbmZzX21hcmtfdXB0b2RhdGUocGFnZSwgb2Zmc2V0LCB3cml0dGVuKTsKLQotCWlmIChQYWdlRXJyb3IocGFnZSkpCi0JCUNsZWFyUGFnZUVycm9yKHBhZ2UpOwotCi1pb19lcnJvcjoKLQluZnNfZW5kX2RhdGFfdXBkYXRlKGlub2RlKTsKLQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JbmZzX3dyaXRlZGF0YV9mcmVlKHdkYXRhKTsKLQlyZXR1cm4gd3JpdHRlbiA/IHdyaXR0ZW4gOiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgbmZzX3dyaXRlcGFnZV9hc3luYyhzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LAotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKK3N0YXRpYyBpbnQgbmZzX3dyaXRlcGFnZV9zZXR1cChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCBuZnNfcGFnZQkqcmVxOworCWludCByZXQ7CiAKLQlyZXEgPSBuZnNfdXBkYXRlX3JlcXVlc3QoY3R4LCBpbm9kZSwgcGFnZSwgb2Zmc2V0LCBjb3VudCk7Ci0JaWYgKElTX0VSUihyZXEpKQotCQlyZXR1cm4gUFRSX0VSUihyZXEpOworCWZvciAoOzspIHsKKwkJcmVxID0gbmZzX3VwZGF0ZV9yZXF1ZXN0KGN0eCwgcGFnZSwgb2Zmc2V0LCBjb3VudCk7CisJCWlmICghSVNfRVJSKHJlcSkpCisJCQlicmVhazsKKwkJcmV0ID0gUFRSX0VSUihyZXEpOworCQlpZiAocmV0ICE9IC1FQlVTWSkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IG5mc193Yl9wYWdlKHBhZ2UtPm1hcHBpbmctPmhvc3QsIHBhZ2UpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCX0KIAkvKiBVcGRhdGUgZmlsZSBsZW5ndGggKi8KIAluZnNfZ3Jvd19maWxlKHBhZ2UsIG9mZnNldCwgY291bnQpOwogCS8qIFNldCB0aGUgUEdfdXB0b2RhdGUgZmxhZz8gKi8KQEAgLTI4Nyw3MyArMjQ1LDk0IEBACiB9CiAKIC8qCisgKiBGaW5kIGFuIGFzc29jaWF0ZWQgbmZzIHdyaXRlIHJlcXVlc3QsIGFuZCBwcmVwYXJlIHRvIGZsdXNoIGl0IG91dAorICogUmV0dXJucyAxIGlmIHRoZXJlIHdhcyBubyB3cml0ZSByZXF1ZXN0LCBvciBpZiB0aGUgcmVxdWVzdCB3YXMKKyAqIGFscmVhZHkgdGFnZ2VkIGJ5IG5mc19zZXRfcGFnZV9kaXJ0eS5SZXR1cm5zIDAgaWYgdGhlIHJlcXVlc3QKKyAqIHdhcyBub3QgdGFnZ2VkLgorICogTWF5IGFsc28gcmV0dXJuIGFuIGVycm9yIGlmIHRoZSB1c2VyIHNpZ25hbGxlZCBuZnNfd2FpdF9vbl9yZXF1ZXN0KCkuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3BhZ2VfbWFya19mbHVzaChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcTsKKwlzcGlubG9ja190ICpyZXFfbG9jayA9ICZORlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+cmVxX2xvY2s7CisJaW50IHJldDsKKworCXNwaW5fbG9jayhyZXFfbG9jayk7CisJZm9yKDs7KSB7CisJCXJlcSA9IG5mc19wYWdlX2ZpbmRfcmVxdWVzdF9sb2NrZWQocGFnZSk7CisJCWlmIChyZXEgPT0gTlVMTCkgeworCQkJc3Bpbl91bmxvY2socmVxX2xvY2spOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKG5mc19sb2NrX3JlcXVlc3RfZG9udGdldChyZXEpKQorCQkJYnJlYWs7CisJCS8qIE5vdGU6IElmIHdlIGhvbGQgdGhlIHBhZ2UgbG9jaywgYXMgaXMgdGhlIGNhc2UgaW4gbmZzX3dyaXRlcGFnZSwKKwkJICoJIHRoZW4gdGhlIGNhbGwgdG8gbmZzX2xvY2tfcmVxdWVzdF9kb250Z2V0KCkgd2lsbCBhbHdheXMKKwkJICoJIHN1Y2NlZWQgcHJvdmlkZWQgdGhhdCBzb21lb25lIGhhc24ndCBhbHJlYWR5IG1hcmtlZCB0aGUKKwkJICoJIHJlcXVlc3QgYXMgZGlydHkgKGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgY2FyZSkuCisJCSAqLworCQlzcGluX3VubG9jayhyZXFfbG9jayk7CisJCXJldCA9IG5mc193YWl0X29uX3JlcXVlc3QocmVxKTsKKwkJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCQlzcGluX2xvY2socmVxX2xvY2spOworCX0KKwlzcGluX3VubG9jayhyZXFfbG9jayk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoUEdfRkxVU0hJTkcsICZyZXEtPndiX2ZsYWdzKSA9PSAwKSB7CisJCW5mc19tYXJrX3JlcXVlc3RfZGlydHkocmVxKTsKKwkJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCX0KKwlyZXQgPSB0ZXN0X2JpdChQR19ORUVEX0ZMVVNILCAmcmVxLT53Yl9mbGFncyk7CisJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIFdyaXRlIGFuIG1tYXBwZWQgcGFnZSB0byB0aGUgc2VydmVyLgogICovCi1pbnQgbmZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCitzdGF0aWMgaW50IG5mc193cml0ZXBhZ2VfbG9ja2VkKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKIAlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwotCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4OwotCXVuc2lnbmVkIG9mZnNldCA9IFBBR0VfQ0FDSEVfU0laRTsKLQlsb2ZmX3QgaV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCWludCBpbm9kZV9yZWZlcmVuY2VkID0gMDsKLQlpbnQgcHJpb3JpdHkgPSB3Yl9wcmlvcml0eSh3YmMpOworCXVuc2lnbmVkIG9mZnNldDsKIAlpbnQgZXJyOwogCiAJbmZzX2luY19zdGF0cyhpbm9kZSwgTkZTSU9TX1ZGU1dSSVRFUEFHRSk7CiAJbmZzX2FkZF9zdGF0cyhpbm9kZSwgTkZTSU9TX1dSSVRFUEFHRVMsIDEpOwogCi0JLyoKLQkgKiBOb3RlOiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlCi0JICogICAgICAgaWYgd2UgYXJlIHRvIGRvIGFzeW5jaHJvbm91cyB3cml0ZXMuIElmIG5vdCwgd2FpdGluZwotCSAqICAgICAgIGluIG5mc193YWl0X29uX3JlcXVlc3QoKSBtYXkgZGVhZGxvY2sgd2l0aCBjbGVhcl9pbm9kZSgpLgotCSAqCi0JICogICAgICAgSWYgaWdyYWIoKSBmYWlscyBoZXJlLCB0aGVuIGl0IGlzIGluIGFueSBjYXNlIHNhZmUgdG8KLQkgKiAgICAgICBjYWxsIG5mc193Yl9wYWdlKCksIHNpbmNlIHRoZXJlIHdpbGwgYmUgbm8gcGVuZGluZyB3cml0ZXMuCi0JICovCi0JaWYgKGlncmFiKGlub2RlKSAhPSAwKQotCQlpbm9kZV9yZWZlcmVuY2VkID0gMTsKLQllbmRfaW5kZXggPSBpX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQotCS8qIEVuc3VyZSB3ZSd2ZSBmbHVzaGVkIG91dCBhbnkgcHJldmlvdXMgd3JpdGVzICovCi0JbmZzX3diX3BhZ2VfcHJpb3JpdHkoaW5vZGUsIHBhZ2UsIHByaW9yaXR5KTsKLQotCS8qIGVhc3kgY2FzZSAqLwotCWlmIChwYWdlLT5pbmRleCA8IGVuZF9pbmRleCkKLQkJZ290byBkb19pdDsKLQkvKiB0aGluZ3MgZ290IGNvbXBsaWNhdGVkLi4uICovCi0Jb2Zmc2V0ID0gaV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKLQotCS8qIE9LLCBhcmUgd2UgY29tcGxldGVseSBvdXQ/ICovCi0JZXJyID0gMDsgLyogcG90ZW50aWFsIHJhY2Ugd2l0aCB0cnVuY2F0ZSAtIGlnbm9yZSAqLwotCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgrMSB8fCAhb2Zmc2V0KQorCWVyciA9IG5mc19wYWdlX21hcmtfZmx1c2gocGFnZSk7CisJaWYgKGVyciA8PSAwKQogCQlnb3RvIG91dDsKLWRvX2l0OgorCWVyciA9IDA7CisJb2Zmc2V0ID0gbmZzX3BhZ2VfbGVuZ3RoKHBhZ2UpOworCWlmICghb2Zmc2V0KQorCQlnb3RvIG91dDsKKwogCWN0eCA9IG5mc19maW5kX29wZW5fY29udGV4dChpbm9kZSwgTlVMTCwgRk1PREVfV1JJVEUpOwogCWlmIChjdHggPT0gTlVMTCkgewogCQllcnIgPSAtRUJBREY7CiAJCWdvdG8gb3V0OwogCX0KLQlsb2NrX2tlcm5lbCgpOwotCWlmICghSVNfU1lOQyhpbm9kZSkgJiYgaW5vZGVfcmVmZXJlbmNlZCkgewotCQllcnIgPSBuZnNfd3JpdGVwYWdlX2FzeW5jKGN0eCwgaW5vZGUsIHBhZ2UsIDAsIG9mZnNldCk7Ci0JCWlmICghd2JjLT5mb3Jfd3JpdGVwYWdlcykKLQkJCW5mc19mbHVzaF9pbm9kZShpbm9kZSwgMCwgMCwgd2JfcHJpb3JpdHkod2JjKSk7Ci0JfSBlbHNlIHsKLQkJZXJyID0gbmZzX3dyaXRlcGFnZV9zeW5jKGN0eCwgaW5vZGUsIHBhZ2UsIDAsCi0JCQkJCQlvZmZzZXQsIHByaW9yaXR5KTsKLQkJaWYgKGVyciA+PSAwKSB7Ci0JCQlpZiAoZXJyICE9IG9mZnNldCkKLQkJCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOwotCQkJZXJyID0gMDsKLQkJfQotCX0KLQl1bmxvY2tfa2VybmVsKCk7CisJZXJyID0gbmZzX3dyaXRlcGFnZV9zZXR1cChjdHgsIHBhZ2UsIDAsIG9mZnNldCk7CiAJcHV0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKKwlpZiAoZXJyICE9IDApCisJCWdvdG8gb3V0OworCWVyciA9IG5mc19wYWdlX21hcmtfZmx1c2gocGFnZSk7CisJaWYgKGVyciA+IDApCisJCWVyciA9IDA7CiBvdXQ6CisJaWYgKCF3YmMtPmZvcl93cml0ZXBhZ2VzKQorCQluZnNfZmx1c2hfbWFwcGluZyhwYWdlLT5tYXBwaW5nLCB3YmMsIHdiX3ByaW9yaXR5KHdiYykpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBuZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbmZzX3dyaXRlcGFnZV9sb2NrZWQocGFnZSwgd2JjKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKLQlpZiAoaW5vZGVfcmVmZXJlbmNlZCkKLQkJaXB1dChpbm9kZSk7CiAJcmV0dXJuIGVycjsgCiB9CiAKQEAgLTM3NywyNSArMzU2LDIyIEBACiAJCQlyZXR1cm4gMDsKIAkJbmZzX3dhaXRfb25fd3JpdGVfY29uZ2VzdGlvbihtYXBwaW5nLCAwKTsKIAl9Ci0JZXJyID0gbmZzX2ZsdXNoX2lub2RlKGlub2RlLCAwLCAwLCB3Yl9wcmlvcml0eSh3YmMpKTsKKwllcnIgPSBuZnNfZmx1c2hfbWFwcGluZyhtYXBwaW5nLCB3YmMsIHdiX3ByaW9yaXR5KHdiYykpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAluZnNfYWRkX3N0YXRzKGlub2RlLCBORlNJT1NfV1JJVEVQQUdFUywgZXJyKTsKLQl3YmMtPm5yX3RvX3dyaXRlIC09IGVycjsKIAlpZiAoIXdiYy0+bm9uYmxvY2tpbmcgJiYgd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwpIHsKIAkJZXJyID0gbmZzX3dhaXRfb25fcmVxdWVzdHMoaW5vZGUsIDAsIDApOwogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KIAllcnIgPSBuZnNfY29tbWl0X2lub2RlKGlub2RlLCB3Yl9wcmlvcml0eSh3YmMpKTsKLQlpZiAoZXJyID4gMCkgewotCQl3YmMtPm5yX3RvX3dyaXRlIC09IGVycjsKKwlpZiAoZXJyID4gMCkKIAkJZXJyID0gMDsKLQl9CiBvdXQ6CiAJY2xlYXJfYml0KEJESV93cml0ZV9jb25nZXN0ZWQsICZiZGktPnN0YXRlKTsKIAl3YWtlX3VwX2FsbCgmbmZzX3dyaXRlX2Nvbmdlc3Rpb24pOwotCXdyaXRlYmFja19jb25nZXN0aW9uX2VuZCgpOworCWNvbmdlc3Rpb25fZW5kKFdSSVRFKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00MTgsNiArMzk0LDcgQEAKIAkJCW5mc2ktPmNoYW5nZV9hdHRyKys7CiAJfQogCVNldFBhZ2VQcml2YXRlKHJlcS0+d2JfcGFnZSk7CisJc2V0X3BhZ2VfcHJpdmF0ZShyZXEtPndiX3BhZ2UsICh1bnNpZ25lZCBsb25nKXJlcSk7CiAJbmZzaS0+bnBhZ2VzKys7CiAJYXRvbWljX2luYygmcmVxLT53Yl9jb3VudCk7CiAJcmV0dXJuIDA7CkBAIC00MzQsNiArNDExLDcgQEAKIAlCVUdfT04gKCFORlNfV0JBQ0tfQlVTWShyZXEpKTsKIAogCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCXNldF9wYWdlX3ByaXZhdGUocmVxLT53Yl9wYWdlLCAwKTsKIAlDbGVhclBhZ2VQcml2YXRlKHJlcS0+d2JfcGFnZSk7CiAJcmFkaXhfdHJlZV9kZWxldGUoJm5mc2ktPm5mc19wYWdlX3RyZWUsIHJlcS0+d2JfaW5kZXgpOwogCW5mc2ktPm5wYWdlcy0tOwpAQCAtNDQ4LDMzICs0MjYsNiBAQAogfQogCiAvKgotICogRmluZCBhIHJlcXVlc3QKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZzX3BhZ2UgKgotX25mc19maW5kX3JlcXVlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpbmRleCkKLXsKLQlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwotCXN0cnVjdCBuZnNfcGFnZSAqcmVxOwotCi0JcmVxID0gKHN0cnVjdCBuZnNfcGFnZSopcmFkaXhfdHJlZV9sb29rdXAoJm5mc2ktPm5mc19wYWdlX3RyZWUsIGluZGV4KTsKLQlpZiAocmVxKQotCQlhdG9taWNfaW5jKCZyZXEtPndiX2NvdW50KTsKLQlyZXR1cm4gcmVxOwotfQotCi1zdGF0aWMgc3RydWN0IG5mc19wYWdlICoKLW5mc19maW5kX3JlcXVlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpbmRleCkKLXsKLQlzdHJ1Y3QgbmZzX3BhZ2UJCSpyZXE7Ci0Jc3RydWN0IG5mc19pbm9kZQkqbmZzaSA9IE5GU19JKGlub2RlKTsKLQotCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOwotCXJlcSA9IF9uZnNfZmluZF9yZXF1ZXN0KGlub2RlLCBpbmRleCk7Ci0Jc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKLQlyZXR1cm4gcmVxOwotfQotCi0vKgogICogQWRkIGEgcmVxdWVzdCB0byB0aGUgaW5vZGUncyBkaXJ0eSBsaXN0LgogICovCiBzdGF0aWMgdm9pZApAQCAtNDg5LDggKzQ0MCwxNCBAQAogCW5mc19saXN0X2FkZF9yZXF1ZXN0KHJlcSwgJm5mc2ktPmRpcnR5KTsKIAluZnNpLT5uZGlydHkrKzsKIAlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOwotCWluY196b25lX3BhZ2Vfc3RhdGUocmVxLT53Yl9wYWdlLCBOUl9GSUxFX0RJUlRZKTsKLQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlfX21hcmtfaW5vZGVfZGlydHkoaW5vZGUsIElfRElSVFlfUEFHRVMpOworfQorCitzdGF0aWMgdm9pZAorbmZzX3JlZGlydHlfcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK3sKKwljbGVhcl9iaXQoUEdfRkxVU0hJTkcsICZyZXEtPndiX2ZsYWdzKTsKKwlfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhyZXEtPndiX3BhZ2UpOwogfQogCiAvKgpAQCAtNDk5LDggKzQ1Niw3IEBACiBzdGF0aWMgaW5saW5lIGludAogbmZzX2RpcnR5X3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICpyZXEpCiB7Ci0Jc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlKTsKLQlyZXR1cm4gIWxpc3RfZW1wdHkoJnJlcS0+d2JfbGlzdCkgJiYgcmVxLT53Yl9saXN0X2hlYWQgPT0gJm5mc2ktPmRpcnR5OworCXJldHVybiB0ZXN0X2JpdChQR19GTFVTSElORywgJnJlcS0+d2JfZmxhZ3MpID09IDA7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjMpIHx8IGRlZmluZWQoQ09ORklHX05GU19WNCkKQEAgLTUxOCw3ICs0NzQsNyBAQAogCW5mc2ktPm5jb21taXQrKzsKIAlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOwogCWluY196b25lX3BhZ2Vfc3RhdGUocmVxLT53Yl9wYWdlLCBOUl9VTlNUQUJMRV9ORlMpOwotCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCV9fbWFya19pbm9kZV9kaXJ0eShpbm9kZSwgSV9ESVJUWV9EQVRBU1lOQyk7CiB9CiAjZW5kaWYKIApAQCAtNTg4LDM4ICs1NDQsMTMgQEAKIAogCXdoaWxlKCFsaXN0X2VtcHR5KGhlYWQpKSB7CiAJCXJlcSA9IG5mc19saXN0X2VudHJ5KGhlYWQtPm5leHQpOworCQlkZWNfem9uZV9wYWdlX3N0YXRlKHJlcS0+d2JfcGFnZSwgTlJfVU5TVEFCTEVfTkZTKTsKIAkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKIAkJbmZzX2lub2RlX3JlbW92ZV9yZXF1ZXN0KHJlcSk7Ci0JCWRlY196b25lX3BhZ2Vfc3RhdGUocmVxLT53Yl9wYWdlLCBOUl9VTlNUQUJMRV9ORlMpOwotCQluZnNfY2xlYXJfcGFnZV93cml0ZWJhY2socmVxKTsKKwkJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7CiAJfQogfQogCi0vKgotICogbmZzX3NjYW5fZGlydHkgLSBTY2FuIGFuIGlub2RlIGZvciBkaXJ0eSByZXF1ZXN0cwotICogQGlub2RlOiBORlMgaW5vZGUgdG8gc2NhbgotICogQGRzdDogZGVzdGluYXRpb24gbGlzdAotICogQGlkeF9zdGFydDogbG93ZXIgYm91bmQgb2YgcGFnZS0+aW5kZXggdG8gc2Nhbi4KLSAqIEBucGFnZXM6IGlkeF9zdGFydCArIG5wYWdlcyBzZXRzIHRoZSB1cHBlciBib3VuZCB0byBzY2FuLgotICoKLSAqIE1vdmVzIHJlcXVlc3RzIGZyb20gdGhlIGlub2RlJ3MgZGlydHkgcGFnZSBsaXN0LgotICogVGhlIHJlcXVlc3RzIGFyZSAqbm90KiBjaGVja2VkIHRvIGVuc3VyZSB0aGF0IHRoZXkgZm9ybSBhIGNvbnRpZ3VvdXMgc2V0LgotICovCi1zdGF0aWMgaW50Ci1uZnNfc2Nhbl9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnBhZ2VzKQotewotCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7Ci0JaW50IHJlcyA9IDA7Ci0KLQlpZiAobmZzaS0+bmRpcnR5ICE9IDApIHsKLQkJcmVzID0gbmZzX3NjYW5fbG9ja19kaXJ0eShuZnNpLCBkc3QsIGlkeF9zdGFydCwgbnBhZ2VzKTsKLQkJbmZzaS0+bmRpcnR5IC09IHJlczsKLQkJaWYgKChuZnNpLT5uZGlydHkgPT0gMCkgIT0gbGlzdF9lbXB0eSgmbmZzaS0+ZGlydHkpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJORlM6IGRlc3luY2hyb25pemVkIHZhbHVlIG9mIG5mc19pLm5kaXJ0eS5cbiIpOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCiAvKgogICogbmZzX3NjYW5fY29tbWl0IC0gU2NhbiBhbiBpbm9kZSBmb3IgY29tbWl0IHJlcXVlc3RzCkBAIC02OTYsMjcgKzYyNywyNyBAQAogICogTm90ZTogU2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUgUGFnZSBMb2NrIGhlbGQhCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbmZzX3BhZ2UgKiBuZnNfdXBkYXRlX3JlcXVlc3Qoc3RydWN0IG5mc19vcGVuX2NvbnRleHQqIGN0eCwKLQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCXVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBieXRlcykKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBieXRlcykKIHsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIAlzdHJ1Y3QgbmZzX3BhZ2UJCSpyZXEsICpuZXcgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcJCXJxZW5kLCBlbmQ7CiAKIAllbmQgPSBvZmZzZXQgKyBieXRlczsKIAotCWlmIChuZnNfd2FpdF9vbl93cml0ZV9jb25nZXN0aW9uKHBhZ2UtPm1hcHBpbmcsIHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikpCisJaWYgKG5mc193YWl0X29uX3dyaXRlX2Nvbmdlc3Rpb24ocGFnZS0+bWFwcGluZywgTkZTX1NFUlZFUihpbm9kZSktPmZsYWdzICYgTkZTX01PVU5UX0lOVFIpKQogCQlyZXR1cm4gRVJSX1BUUigtRVJFU1RBUlRTWVMpOwogCWZvciAoOzspIHsKIAkJLyogTG9vcCBvdmVyIGFsbCBpbm9kZSBlbnRyaWVzIGFuZCBzZWUgaWYgd2UgZmluZAogCQkgKiBBIHJlcXVlc3QgZm9yIHRoZSBwYWdlIHdlIHdpc2ggdG8gdXBkYXRlCiAJCSAqLwogCQlzcGluX2xvY2soJm5mc2ktPnJlcV9sb2NrKTsKLQkJcmVxID0gX25mc19maW5kX3JlcXVlc3QoaW5vZGUsIHBhZ2UtPmluZGV4KTsKKwkJcmVxID0gbmZzX3BhZ2VfZmluZF9yZXF1ZXN0X2xvY2tlZChwYWdlKTsKIAkJaWYgKHJlcSkgewogCQkJaWYgKCFuZnNfbG9ja19yZXF1ZXN0X2RvbnRnZXQocmVxKSkgewogCQkJCWludCBlcnJvcjsKKwogCQkJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CiAJCQkJZXJyb3IgPSBuZnNfd2FpdF9vbl9yZXF1ZXN0KHJlcSk7CiAJCQkJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOwpAQCAtNzQzLDcgKzY3NCw2IEBACiAJCQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogCQkJfQogCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKLQkJCW5mc19tYXJrX3JlcXVlc3RfZGlydHkobmV3KTsKIAkJCXJldHVybiBuZXc7CiAJCX0KIAkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKQEAgLTc4NCw5ICs3MTQsOCBAQAogaW50IG5mc19mbHVzaF9pbmNvbXBhdGlibGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQogewogCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHggPSAoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IG5mc19wYWdlCSpyZXE7Ci0JaW50CQlzdGF0dXMgPSAwOworCWludCBkb19mbHVzaCwgc3RhdHVzOwogCS8qCiAJICogTG9vayBmb3IgYSByZXF1ZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYWdlLiBJZiB0aGVyZQogCSAqIGlzIG9uZSwgYW5kIGl0IGJlbG9uZ3MgdG8gYW5vdGhlciBmaWxlLCB3ZSBmbHVzaCBpdCBvdXQKQEAgLTc5NSwxMyArNzI0LDE4IEBACiAJICogQWxzbyBkbyB0aGUgc2FtZSBpZiB3ZSBmaW5kIGEgcmVxdWVzdCBmcm9tIGFuIGV4aXN0aW5nCiAJICogZHJvcHBlZCBwYWdlLgogCSAqLwotCXJlcSA9IG5mc19maW5kX3JlcXVlc3QoaW5vZGUsIHBhZ2UtPmluZGV4KTsKLQlpZiAocmVxKSB7Ci0JCWlmIChyZXEtPndiX3BhZ2UgIT0gcGFnZSB8fCBjdHggIT0gcmVxLT53Yl9jb250ZXh0KQotCQkJc3RhdHVzID0gbmZzX3diX3BhZ2UoaW5vZGUsIHBhZ2UpOworCWRvIHsKKwkJcmVxID0gbmZzX3BhZ2VfZmluZF9yZXF1ZXN0KHBhZ2UpOworCQlpZiAocmVxID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJZG9fZmx1c2ggPSByZXEtPndiX3BhZ2UgIT0gcGFnZSB8fCByZXEtPndiX2NvbnRleHQgIT0gY3R4CisJCQl8fCAhbmZzX2RpcnR5X3JlcXVlc3QocmVxKTsKIAkJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOwotCX0KLQlyZXR1cm4gKHN0YXR1cyA8IDApID8gc3RhdHVzIDogMDsKKwkJaWYgKCFkb19mbHVzaCkKKwkJCXJldHVybiAwOworCQlzdGF0dXMgPSBuZnNfd2JfcGFnZShwYWdlLT5tYXBwaW5nLT5ob3N0LCBwYWdlKTsKKwl9IHdoaWxlIChzdGF0dXMgPT0gMCk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKQEAgLTgxNSw3MiArNzQ5LDI3IEBACiB7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3QgbmZzX3BhZ2UJKnJlcTsKIAlpbnQJCXN0YXR1cyA9IDA7CiAKIAluZnNfaW5jX3N0YXRzKGlub2RlLCBORlNJT1NfVkZTVVBEQVRFUEFHRSk7CiAKIAlkcHJpbnRrKCJORlM6ICAgICAgbmZzX3VwZGF0ZXBhZ2UoJXMvJXMgJWRAJUxkKVxuIiwKLQkJZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKLQkJZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lLCBjb3VudCwKKwkJZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAorCQlmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSwgY291bnQsCiAJCShsb25nIGxvbmcpKHBhZ2Vfb2Zmc2V0KHBhZ2UpICtvZmZzZXQpKTsKIAotCWlmIChJU19TWU5DKGlub2RlKSkgewotCQlzdGF0dXMgPSBuZnNfd3JpdGVwYWdlX3N5bmMoY3R4LCBpbm9kZSwgcGFnZSwgb2Zmc2V0LCBjb3VudCwgMCk7Ci0JCWlmIChzdGF0dXMgPiAwKSB7Ci0JCQlpZiAob2Zmc2V0ID09IDAgJiYgc3RhdHVzID09IFBBR0VfQ0FDSEVfU0laRSkKLQkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQogCS8qIElmIHdlJ3JlIG5vdCB1c2luZyBieXRlIHJhbmdlIGxvY2tzLCBhbmQgd2Uga25vdyB0aGUgcGFnZQogCSAqIGlzIGVudGlyZWx5IGluIGNhY2hlLCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gYXZvaWQKIAkgKiBmcmFnbWVudGluZyB3cml0ZSByZXF1ZXN0cy4KIAkgKi8KIAlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpICYmIGlub2RlLT5pX2Zsb2NrID09IE5VTEwgJiYgIShmaWxlLT5mX21vZGUgJiBPX1NZTkMpKSB7Ci0JCWxvZmZfdCBlbmRfb2ZmcyA9IGlfc2l6ZV9yZWFkKGlub2RlKSAtIDE7Ci0JCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4ID0gZW5kX29mZnMgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQotCQljb3VudCArPSBvZmZzZXQ7CisJCWNvdW50ID0gbWF4KGNvdW50ICsgb2Zmc2V0LCBuZnNfcGFnZV9sZW5ndGgocGFnZSkpOwogCQlvZmZzZXQgPSAwOwotCQlpZiAodW5saWtlbHkoZW5kX29mZnMgPCAwKSkgewotCQkJLyogRG8gbm90aGluZyAqLwotCQl9IGVsc2UgaWYgKHBhZ2UtPmluZGV4ID09IGVuZF9pbmRleCkgewotCQkJdW5zaWduZWQgaW50IHBnbGVuOwotCQkJcGdsZW4gPSAodW5zaWduZWQgaW50KShlbmRfb2ZmcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpICsgMTsKLQkJCWlmIChjb3VudCA8IHBnbGVuKQotCQkJCWNvdW50ID0gcGdsZW47Ci0JCX0gZWxzZSBpZiAocGFnZS0+aW5kZXggPCBlbmRfaW5kZXgpCi0JCQljb3VudCA9IFBBR0VfQ0FDSEVfU0laRTsKIAl9CiAKLQkvKgotCSAqIFRyeSB0byBmaW5kIGFuIE5GUyByZXF1ZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYWdlCi0JICogYW5kIHVwZGF0ZSBpdC4KLQkgKiBJZiB0aGUgZXhpc3RpbmcgcmVxdWVzdCBjYW5ub3QgYmUgdXBkYXRlZCwgd2UgbXVzdCBmbHVzaAotCSAqIGl0IG91dCBub3cuCi0JICovCi0JZG8gewotCQlyZXEgPSBuZnNfdXBkYXRlX3JlcXVlc3QoY3R4LCBpbm9kZSwgcGFnZSwgb2Zmc2V0LCBjb3VudCk7Ci0JCXN0YXR1cyA9IChJU19FUlIocmVxKSkgPyBQVFJfRVJSKHJlcSkgOiAwOwotCQlpZiAoc3RhdHVzICE9IC1FQlVTWSkKLQkJCWJyZWFrOwotCQkvKiBSZXF1ZXN0IGNvdWxkIG5vdCBiZSB1cGRhdGVkLiBGbHVzaCBpdCBvdXQgYW5kIHRyeSBhZ2FpbiAqLwotCQlzdGF0dXMgPSBuZnNfd2JfcGFnZShpbm9kZSwgcGFnZSk7Ci0JfSB3aGlsZSAoc3RhdHVzID49IDApOwotCWlmIChzdGF0dXMgPCAwKQotCQlnb3RvIGRvbmU7CisJc3RhdHVzID0gbmZzX3dyaXRlcGFnZV9zZXR1cChjdHgsIHBhZ2UsIG9mZnNldCwgY291bnQpOworCV9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKHBhZ2UpOwogCi0Jc3RhdHVzID0gMDsKLQotCS8qIFVwZGF0ZSBmaWxlIGxlbmd0aCAqLwotCW5mc19ncm93X2ZpbGUocGFnZSwgb2Zmc2V0LCBjb3VudCk7Ci0JLyogU2V0IHRoZSBQR191cHRvZGF0ZSBmbGFnPyAqLwotCW5mc19tYXJrX3VwdG9kYXRlKHBhZ2UsIHJlcS0+d2JfcGdiYXNlLCByZXEtPndiX2J5dGVzKTsKLQluZnNfdW5sb2NrX3JlcXVlc3QocmVxKTsKLWRvbmU6CiAgICAgICAgIGRwcmludGsoIk5GUzogICAgICBuZnNfdXBkYXRlcGFnZSByZXR1cm5zICVkIChpc2l6ZSAlTGQpXG4iLAogCQkJc3RhdHVzLCAobG9uZyBsb25nKWlfc2l6ZV9yZWFkKGlub2RlKSk7CiAJaWYgKHN0YXR1cyA8IDApCkBAIC04OTUsNyArNzg0LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjMpIHx8IGRlZmluZWQoQ09ORklHX05GU19WNCkKIAlpZiAoIVBhZ2VFcnJvcihyZXEtPndiX3BhZ2UpKSB7CiAJCWlmIChORlNfTkVFRF9SRVNDSEVEKHJlcSkpIHsKLQkJCW5mc19tYXJrX3JlcXVlc3RfZGlydHkocmVxKTsKKwkJCW5mc19yZWRpcnR5X3JlcXVlc3QocmVxKTsKIAkJCWdvdG8gb3V0OwogCQl9IGVsc2UgaWYgKE5GU19ORUVEX0NPTU1JVChyZXEpKSB7CiAJCQluZnNfbWFya19yZXF1ZXN0X2NvbW1pdChyZXEpOwpAQCAtOTc3LDkgKzg2Niw3IEBACiAJc2lnc2V0X3Qgb2xkc2V0OwogCiAJcnBjX2NsbnRfc2lnbWFzayhjbG50LCAmb2xkc2V0KTsKLQlsb2NrX2tlcm5lbCgpOwogCXJwY19leGVjdXRlKCZkYXRhLT50YXNrKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOwogfQogCkBAIC0xMDEzLDcgKzkwMCw2IEBACiAJYXRvbWljX3NldCgmcmVxLT53Yl9jb21wbGV0ZSwgcmVxdWVzdHMpOwogCiAJQ2xlYXJQYWdlRXJyb3IocGFnZSk7Ci0Jc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCW9mZnNldCA9IDA7CiAJbmJ5dGVzID0gcmVxLT53Yl9ieXRlczsKIAlkbyB7CkBAIC0xMDQxLDkgKzkyNyw5IEBACiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsaXN0KSkgewogCQlkYXRhID0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBuZnNfd3JpdGVfZGF0YSwgcGFnZXMpOwogCQlsaXN0X2RlbCgmZGF0YS0+cGFnZXMpOwotCQluZnNfd3JpdGVkYXRhX2ZyZWUoZGF0YSk7CisJCW5mc193cml0ZWRhdGFfcmVsZWFzZShkYXRhKTsKIAl9Ci0JbmZzX21hcmtfcmVxdWVzdF9kaXJ0eShyZXEpOworCW5mc19yZWRpcnR5X3JlcXVlc3QocmVxKTsKIAluZnNfY2xlYXJfcGFnZV93cml0ZWJhY2socmVxKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KQEAgLTEwNzQsNyArOTYwLDYgQEAKIAkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKIAkJbmZzX2xpc3RfYWRkX3JlcXVlc3QocmVxLCAmZGF0YS0+cGFnZXMpOwogCQlDbGVhclBhZ2VFcnJvcihyZXEtPndiX3BhZ2UpOwotCQlzZXRfcGFnZV93cml0ZWJhY2socmVxLT53Yl9wYWdlKTsKIAkJKnBhZ2VzKysgPSByZXEtPndiX3BhZ2U7CiAJCWNvdW50ICs9IHJlcS0+d2JfYnl0ZXM7CiAJfQpAQCAtMTA4OSw3ICs5NzQsNyBAQAogCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgewogCQlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSA9IG5mc19saXN0X2VudHJ5KGhlYWQtPm5leHQpOwogCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOwotCQluZnNfbWFya19yZXF1ZXN0X2RpcnR5KHJlcSk7CisJCW5mc19yZWRpcnR5X3JlcXVlc3QocmVxKTsKIAkJbmZzX2NsZWFyX3BhZ2Vfd3JpdGViYWNrKHJlcSk7CiAJfQogCXJldHVybiAtRU5PTUVNOwpAQCAtMTEyNCw3ICsxMDA5LDcgQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKIAkJcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CiAJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7Ci0JCW5mc19tYXJrX3JlcXVlc3RfZGlydHkocmVxKTsKKwkJbmZzX3JlZGlydHlfcmVxdWVzdChyZXEpOwogCQluZnNfY2xlYXJfcGFnZV93cml0ZWJhY2socmVxKTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMTQ0MCw3ICsxMzI1LDcgQEAKIAkJfQogCQkvKiBXZSBoYXZlIGEgbWlzbWF0Y2guIFdyaXRlIHRoZSBwYWdlIGFnYWluICovCiAJCWRwcmludGsoIiBtaXNtYXRjaFxuIik7Ci0JCW5mc19tYXJrX3JlcXVlc3RfZGlydHkocmVxKTsKKwkJbmZzX3JlZGlydHlfcmVxdWVzdChyZXEpOwogCW5leHQ6CiAJCW5mc19jbGVhcl9wYWdlX3dyaXRlYmFjayhyZXEpOwogCX0KQEAgLTE0NTcsMTggKzEzNDIsMTcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IG5mc19mbHVzaF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwKLQkJCSAgIHVuc2lnbmVkIGludCBucGFnZXMsIGludCBob3cpCitzdGF0aWMgbG9uZyBuZnNfZmx1c2hfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsIGludCBob3cpCiB7Ci0Jc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0kobWFwcGluZy0+aG9zdCk7CiAJTElTVF9IRUFEKGhlYWQpOwotCWludCByZXM7CisJbG9uZyByZXM7CiAKIAlzcGluX2xvY2soJm5mc2ktPnJlcV9sb2NrKTsKLQlyZXMgPSBuZnNfc2Nhbl9kaXJ0eShpbm9kZSwgJmhlYWQsIGlkeF9zdGFydCwgbnBhZ2VzKTsKKwlyZXMgPSBuZnNfc2Nhbl9kaXJ0eShtYXBwaW5nLCB3YmMsICZoZWFkKTsKIAlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOwogCWlmIChyZXMpIHsKLQkJaW50IGVycm9yID0gbmZzX2ZsdXNoX2xpc3QoaW5vZGUsICZoZWFkLCByZXMsIGhvdyk7CisJCWludCBlcnJvciA9IG5mc19mbHVzaF9saXN0KG1hcHBpbmctPmhvc3QsICZoZWFkLCByZXMsIGhvdyk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7CiAJfQpAQCAtMTQ5NCwzOCArMTM3OCw2MiBAQAogfQogI2VuZGlmCiAKLWludCBuZnNfc3luY19pbm9kZV93YWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LAotCQl1bnNpZ25lZCBpbnQgbnBhZ2VzLCBpbnQgaG93KQorbG9uZyBuZnNfc3luY19tYXBwaW5nX3dhaXQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLCBpbnQgaG93KQogeworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsIGlkeF9lbmQ7CisJdW5zaWduZWQgaW50IG5wYWdlcyA9IDA7CiAJTElTVF9IRUFEKGhlYWQpOwogCWludCBub2NvbW1pdCA9IGhvdyAmIEZMVVNIX05PQ09NTUlUOwotCWludCBwYWdlcywgcmV0OworCWxvbmcgcGFnZXMsIHJldDsKIAorCS8qIEZJWE1FICovCisJaWYgKHdiYy0+cmFuZ2VfY3ljbGljKQorCQlpZHhfc3RhcnQgPSAwOworCWVsc2UgeworCQlpZHhfc3RhcnQgPSB3YmMtPnJhbmdlX3N0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWlkeF9lbmQgPSB3YmMtPnJhbmdlX2VuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlpZiAoaWR4X2VuZCA+IGlkeF9zdGFydCkgeworCQkJdW5zaWduZWQgbG9uZyBsX25wYWdlcyA9IDEgKyBpZHhfZW5kIC0gaWR4X3N0YXJ0OworCQkJbnBhZ2VzID0gbF9ucGFnZXM7CisJCQlpZiAoc2l6ZW9mKG5wYWdlcykgIT0gc2l6ZW9mKGxfbnBhZ2VzKSAmJgorCQkJCQkodW5zaWduZWQgbG9uZylucGFnZXMgIT0gbF9ucGFnZXMpCisJCQkJbnBhZ2VzID0gMDsKKwkJfQorCX0KIAlob3cgJj0gfkZMVVNIX05PQ09NTUlUOwogCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOwogCWRvIHsKKwkJd2JjLT5wYWdlc19za2lwcGVkID0gMDsKIAkJcmV0ID0gbmZzX3dhaXRfb25fcmVxdWVzdHNfbG9ja2VkKGlub2RlLCBpZHhfc3RhcnQsIG5wYWdlcyk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWNvbnRpbnVlOwotCQlwYWdlcyA9IG5mc19zY2FuX2RpcnR5KGlub2RlLCAmaGVhZCwgaWR4X3N0YXJ0LCBucGFnZXMpOworCQlwYWdlcyA9IG5mc19zY2FuX2RpcnR5KG1hcHBpbmcsIHdiYywgJmhlYWQpOwogCQlpZiAocGFnZXMgIT0gMCkgewogCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKLQkJCWlmIChob3cgJiBGTFVTSF9JTlZBTElEQVRFKQorCQkJaWYgKGhvdyAmIEZMVVNIX0lOVkFMSURBVEUpIHsKIAkJCQluZnNfY2FuY2VsX2RpcnR5X2xpc3QoJmhlYWQpOwotCQkJZWxzZQorCQkJCXJldCA9IHBhZ2VzOworCQkJfSBlbHNlCiAJCQkJcmV0ID0gbmZzX2ZsdXNoX2xpc3QoaW5vZGUsICZoZWFkLCBwYWdlcywgaG93KTsKIAkJCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOwogCQkJY29udGludWU7CiAJCX0KKwkJaWYgKHdiYy0+cGFnZXNfc2tpcHBlZCAhPSAwKQorCQkJY29udGludWU7CiAJCWlmIChub2NvbW1pdCkKIAkJCWJyZWFrOwogCQlwYWdlcyA9IG5mc19zY2FuX2NvbW1pdChpbm9kZSwgJmhlYWQsIGlkeF9zdGFydCwgbnBhZ2VzKTsKLQkJaWYgKHBhZ2VzID09IDApCisJCWlmIChwYWdlcyA9PSAwKSB7CisJCQlpZiAod2JjLT5wYWdlc19za2lwcGVkICE9IDApCisJCQkJY29udGludWU7CiAJCQlicmVhazsKKwkJfQogCQlpZiAoaG93ICYgRkxVU0hfSU5WQUxJREFURSkgewogCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKIAkJCW5mc19jYW5jZWxfY29tbWl0X2xpc3QoJmhlYWQpOworCQkJcmV0ID0gcGFnZXM7CiAJCQlzcGluX2xvY2soJm5mc2ktPnJlcV9sb2NrKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xNTM4LDYgKzE0NDYsMTA2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIGZsdXNoIHRoZSBpbm9kZSB0byBkaXNrLgorICovCitpbnQgbmZzX3diX2FsbChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkuYmRpID0gbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbywKKwkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfQUxMLAorCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKKwkJLmZvcl93cml0ZXBhZ2VzID0gMSwKKwkJLnJhbmdlX2N5Y2xpYyA9IDEsCisJfTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2VuZXJpY193cml0ZXBhZ2VzKG1hcHBpbmcsICZ3YmMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBuZnNfc3luY19tYXBwaW5nX3dhaXQobWFwcGluZywgJndiYywgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKK291dDoKKwlfX21hcmtfaW5vZGVfZGlydHkobWFwcGluZy0+aG9zdCwgSV9ESVJUWV9QQUdFUyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG5mc19zeW5jX21hcHBpbmdfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCByYW5nZV9zdGFydCwgbG9mZl90IHJhbmdlX2VuZCwgaW50IGhvdykKK3sKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkuYmRpID0gbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbywKKwkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfQUxMLAorCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKKwkJLnJhbmdlX3N0YXJ0ID0gcmFuZ2Vfc3RhcnQsCisJCS5yYW5nZV9lbmQgPSByYW5nZV9lbmQsCisJCS5mb3Jfd3JpdGVwYWdlcyA9IDEsCisJfTsKKwlpbnQgcmV0OworCisJaWYgKCEoaG93ICYgRkxVU0hfTk9XUklURVBBR0UpKSB7CisJCXJldCA9IGdlbmVyaWNfd3JpdGVwYWdlcyhtYXBwaW5nLCAmd2JjKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gbmZzX3N5bmNfbWFwcGluZ193YWl0KG1hcHBpbmcsICZ3YmMsIGhvdyk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKK291dDoKKwlfX21hcmtfaW5vZGVfZGlydHkobWFwcGluZy0+aG9zdCwgSV9ESVJUWV9QQUdFUyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG5mc193Yl9wYWdlX3ByaW9yaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgaG93KQoreworCWxvZmZfdCByYW5nZV9zdGFydCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOworCWxvZmZfdCByYW5nZV9lbmQgPSByYW5nZV9zdGFydCArIChsb2ZmX3QpKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7CisJCS5iZGkgPSBwYWdlLT5tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvLAorCQkuc3luY19tb2RlID0gV0JfU1lOQ19BTEwsCisJCS5ucl90b193cml0ZSA9IExPTkdfTUFYLAorCQkucmFuZ2Vfc3RhcnQgPSByYW5nZV9zdGFydCwKKwkJLnJhbmdlX2VuZCA9IHJhbmdlX2VuZCwKKwl9OworCWludCByZXQ7CisKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCWlmICghKGhvdyAmIEZMVVNIX05PV1JJVEVQQUdFKSAmJiBjbGVhcl9wYWdlX2RpcnR5X2Zvcl9pbyhwYWdlKSkgeworCQlyZXQgPSBuZnNfd3JpdGVwYWdlX2xvY2tlZChwYWdlLCAmd2JjKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gbmZzX3N5bmNfbWFwcGluZ193YWl0KHBhZ2UtPm1hcHBpbmcsICZ3YmMsIGhvdyk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKK291dDoKKwlfX21hcmtfaW5vZGVfZGlydHkoaW5vZGUsIElfRElSVFlfUEFHRVMpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcml0ZSBiYWNrIGFsbCByZXF1ZXN0cyBvbiBvbmUgcGFnZSAtIHdlIGRvIHRoaXMgYmVmb3JlIHJlYWRpbmcgaXQuCisgKi8KK2ludCBuZnNfd2JfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSogcGFnZSkKK3sKKwlyZXR1cm4gbmZzX3diX3BhZ2VfcHJpb3JpdHkoaW5vZGUsIHBhZ2UsIEZMVVNIX1NUQUJMRSk7Cit9CisKK2ludCBuZnNfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IG5mc19wYWdlICpyZXE7CisKKwlyZXEgPSBuZnNfcGFnZV9maW5kX3JlcXVlc3QocGFnZSk7CisJaWYgKHJlcSAhPSBOVUxMKSB7CisJCS8qIE1hcmsgYW55IGV4aXN0aW5nIHdyaXRlIHJlcXVlc3RzIGZvciBmbHVzaGluZyAqLworCQlzZXRfYml0KFBHX05FRURfRkxVU0gsICZyZXEtPndiX2ZsYWdzKTsKKwkJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOworCX0KKwlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMocGFnZSk7Cit9CisKKwogaW50IF9faW5pdCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKQogewogCW5mc193ZGF0YV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX3dyaXRlX2RhdGEiLApkaWZmIC0tZ2l0IGEvZnMvbmZzX2NvbW1vbi9uZnNhY2wuYyBiL2ZzL25mc19jb21tb24vbmZzYWNsLmMKaW5kZXggMGMyYmU4Yy4uYzExZjUzNyAxMDA2NDQKLS0tIGEvZnMvbmZzX2NvbW1vbi9uZnNhY2wuYworKysgYi9mcy9uZnNfY29tbW9uL25mc2FjbC5jCkBAIC00Niw3ICs0Niw3IEBACiB7CiAJc3RydWN0IG5mc2FjbF9lbmNvZGVfZGVzYyAqbmZzYWNsX2Rlc2MgPQogCQkoc3RydWN0IG5mc2FjbF9lbmNvZGVfZGVzYyAqKSBkZXNjOwotCXUzMiAqcCA9ICh1MzIgKikgZWxlbTsKKwlfX2JlMzIgKnAgPSBlbGVtOwogCiAJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqZW50cnkgPQogCQkmbmZzYWNsX2Rlc2MtPmFjbC0+YV9lbnRyaWVzW25mc2FjbF9kZXNjLT5jb3VudCsrXTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogewogCXN0cnVjdCBuZnNhY2xfZGVjb2RlX2Rlc2MgKm5mc2FjbF9kZXNjID0KIAkJKHN0cnVjdCBuZnNhY2xfZGVjb2RlX2Rlc2MgKikgZGVzYzsKLQl1MzIgKnAgPSAodTMyICopIGVsZW07CisJX19iZTMyICpwID0gZWxlbTsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICplbnRyeTsKIAogCWlmICghbmZzYWNsX2Rlc2MtPmFjbCkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9leHBvcnQuYyBiL2ZzL25mc2QvZXhwb3J0LmMKaW5kZXggZTEzZmEyMy4uMjQ4ZGQ5MiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9leHBvcnQuYworKysgYi9mcy9uZnNkL2V4cG9ydC5jCkBAIC03ODcsMTUgKzc4NywyMCBAQAogCWtleS5leF9kZW50cnkgPSBkZW50cnk7CiAKIAlleHAgPSBzdmNfZXhwb3J0X2xvb2t1cCgma2V5KTsKLQlpZiAoZXhwICE9IE5VTEwpIAotCQlzd2l0Y2ggKGNhY2hlX2NoZWNrKCZzdmNfZXhwb3J0X2NhY2hlLCAmZXhwLT5oLCByZXFwKSkgeworCWlmIChleHAgIT0gTlVMTCkgIHsKKwkJaW50IGVycjsKKworCQllcnIgPSBjYWNoZV9jaGVjaygmc3ZjX2V4cG9ydF9jYWNoZSwgJmV4cC0+aCwgcmVxcCk7CisJCXN3aXRjaCAoZXJyKSB7CiAJCWNhc2UgMDogYnJlYWs7CiAJCWNhc2UgLUVBR0FJTjoKLQkJCWV4cCA9IEVSUl9QVFIoLUVBR0FJTik7CisJCWNhc2UgLUVUSU1FRE9VVDoKKwkJCWV4cCA9IEVSUl9QVFIoZXJyKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZXhwID0gTlVMTDsKIAkJfQorCX0KIAogCXJldHVybiBleHA7CiB9CkBAIC05NTAsNiArOTU1LDggQEAKIAogCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShjbHAsIG5kLm1udCwgbmQuZGVudHJ5LCBOVUxMKTsKIAorCW1lbXNldCgmbmV3LCAwLCBzaXplb2YobmV3KSk7CisKIAkvKiBtdXN0IG1ha2Ugc3VyZSB0aGVyZSB3b24ndCBiZSBhbiBleF9mc2lkIGNsYXNoICovCiAJaWYgKChueHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpICYmCiAJICAgIChmc2lkX2tleSA9IGV4cF9nZXRfZnNpZF9rZXkoY2xwLCBueHAtPmV4X2RldikpICYmCkBAIC05ODAsNiArOTg3LDkgQEAKIAogCW5ldy5oLmV4cGlyeV90aW1lID0gTkVWRVI7CiAJbmV3LmguZmxhZ3MgPSAwOworCW5ldy5leF9wYXRoID0ga3N0cmR1cChueHAtPmV4X3BhdGgsIEdGUF9LRVJORUwpOworCWlmICghbmV3LmV4X3BhdGgpCisJCWdvdG8gZmluaXNoOwogCW5ldy5leF9jbGllbnQgPSBjbHA7CiAJbmV3LmV4X21udCA9IG5kLm1udDsKIAluZXcuZXhfZGVudHJ5ID0gbmQuZGVudHJ5OwpAQCAtMTAwMCwxMCArMTAxMCwxMSBAQAogCQkvKiBmYWlsZWQgdG8gY3JlYXRlIGF0IGxlYXN0IG9uZSBpbmRleCAqLwogCQlleHBfZG9fdW5leHBvcnQoZXhwKTsKIAkJY2FjaGVfZmx1c2goKTsKLQkJZXJyID0gLUVOT01FTTsKLQl9Ci0KKwl9IGVsc2UKKwkJZXJyID0gMDsKIGZpbmlzaDoKKwlpZiAobmV3LmV4X3BhdGgpCisJCWtmcmVlKG5ldy5leF9wYXRoKTsKIAlpZiAoZXhwKQogCQlleHBfcHV0KGV4cCk7CiAJaWYgKGZzaWRfa2V5ICYmICFJU19FUlIoZnNpZF9rZXkpKQpAQCAtMTEwNCw2ICsxMTE1LDEwIEBACiAJCSBwYXRoLCBuZC5kZW50cnksIGNscC0+bmFtZSwKIAkJIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOwogCWV4cCA9IGV4cF9wYXJlbnQoY2xwLCBuZC5tbnQsIG5kLmRlbnRyeSwgTlVMTCk7CisJaWYgKElTX0VSUihleHApKSB7CisJCWVyciA9IFBUUl9FUlIoZXhwKTsKKwkJZ290byBvdXQ7CisJfQogCWlmICghZXhwKSB7CiAJCWRwcmludGsoIm5mc2Q6IGV4cF9yb290ZmggZXhwb3J0IG5vdCBmb3VuZC5cbiIpOwogCQlnb3RvIG91dDsKQEAgLTExNDgsMjMgKzExNjMsMjEgQEAKICAqIGZvciBhIGdpdmVuIE5GU3Y0IGNsaWVudC4gICBUaGUgcm9vdCBpcyBkZWZpbmVkIHRvIGJlIHRoZQogICogZXhwb3J0IHBvaW50IHdpdGggZnNpZD09MAogICovCi1pbnQKK19fYmUzMgogZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IGF1dGhfZG9tYWluICpjbHAsIHN0cnVjdCBzdmNfZmggKmZocCwKIAkgICAgICAgc3RydWN0IGNhY2hlX3JlcSAqY3JlcSkKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwOwotCWludCBydjsKKwlfX2JlMzIgcnY7CiAJdTMyIGZzaWR2WzJdOwogCiAJbWtfZnNpZF92MShmc2lkdiwgMCk7CiAKIAlleHAgPSBleHBfZmluZChjbHAsIDEsIGZzaWR2LCBjcmVxKTsKLQlpZiAoSVNfRVJSKGV4cCkgJiYgUFRSX0VSUihleHApID09IC1FQUdBSU4pCi0JCXJldHVybiBuZnNlcnJfZHJvcGl0OworCWlmIChJU19FUlIoZXhwKSkKKwkJcmV0dXJuIG5mc2Vycm5vKFBUUl9FUlIoZXhwKSk7CiAJaWYgKGV4cCA9PSBOVUxMKQogCQlyZXR1cm4gbmZzZXJyX3Blcm07Ci0JZWxzZSBpZiAoSVNfRVJSKGV4cCkpCi0JCXJldHVybiBuZnNlcnJubyhQVFJfRVJSKGV4cCkpOwogCXJ2ID0gZmhfY29tcG9zZShmaHAsIGV4cCwgZXhwLT5leF9kZW50cnksIE5VTEwpOwogCWV4cF9wdXQoZXhwKTsKIAlyZXR1cm4gcnY7CmRpZmYgLS1naXQgYS9mcy9uZnNkL2xvY2tkLmMgYi9mcy9uZnNkL2xvY2tkLmMKaW5kZXggN2I4ODlmZi4uMjIxYWNkMSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9sb2NrZC5jCisrKyBiL2ZzL25mc2QvbG9ja2QuYwpAQCAtMjIsMTAgKzIyLDEwIEBACiAvKgogICogTm90ZTogd2UgaG9sZCB0aGUgZGVudHJ5IHVzZSBjb3VudCB3aGlsZSB0aGUgZmlsZSBpcyBvcGVuLgogICovCi1zdGF0aWMgdTMyCitzdGF0aWMgX19iZTMyCiBubG1fZm9wZW4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc19maCAqZiwgc3RydWN0IGZpbGUgKipmaWxwKQogewotCXUzMgkJbmZzZXJyOworCV9fYmUzMgkJbmZzZXJyOwogCXN0cnVjdCBzdmNfZmgJZmg7CiAKIAkvKiBtdXN0IGluaXRpYWxpemUgYmVmb3JlIHVzaW5nISBidXQgbWF4c2l6ZSBkb2Vzbid0IG1hdHRlciAqLwpAQCAtMzksMTggKzM5LDIwIEBACiAJZmhfcHV0KCZmaCk7CiAJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CiAJZXhwX3JlYWR1bmxvY2soKTsKLSAJLyogbmxtIGFuZCBuZnNkIGRvbid0IHNoYXJlIGVycm9yIGNvZGVzLgotCSAqIHdlIGludmVudDogMCA9IG5vIGVycm9yCi0JICogICAgICAgICAgICAxID0gc3RhbGUgZmlsZSBoYW5kbGUKLQkgKgkgICAgICAyID0gb3RoZXIgZXJyb3IKKyAJLyogV2UgcmV0dXJuIG5sbSBlcnJvciBjb2RlcyBhcyBubG0gZG9lc24ndCBrbm93CisJICogYWJvdXQgbmZzZCwgYnV0IG5mc2QgZG9lcyBrbm93IGFib3V0IG5sbS4uCiAJICovCiAJc3dpdGNoIChuZnNlcnIpIHsKIAljYXNlIG5mc19vazoKIAkJcmV0dXJuIDA7CisJY2FzZSBuZnNlcnJfZHJvcGl0OgorCQlyZXR1cm4gbmxtX2Ryb3BfcmVwbHk7CisjaWZkZWYgQ09ORklHX0xPQ0tEX1Y0CiAJY2FzZSBuZnNlcnJfc3RhbGU6Ci0JCXJldHVybiAxOworCQlyZXR1cm4gbmxtNF9zdGFsZV9maDsKKyNlbmRpZgogCWRlZmF1bHQ6Ci0JCXJldHVybiAyOworCQlyZXR1cm4gbmxtX2xja19kZW5pZWQ7CiAJfQogfQogCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczJhY2wuYyBiL2ZzL25mc2QvbmZzMmFjbC5jCmluZGV4IDkxODc3NTUuLmVkZGU1ZGMgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzMmFjbC5jCisrKyBiL2ZzL25mc2QvbmZzMmFjbC5jCkBAIC0yMSw3ICsyMSw3IEBACiAvKgogICogTlVMTCBjYWxsLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNhY2xkX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQogewogCXJldHVybiBuZnNfb2s7CkBAIC0zMCwxMiArMzAsMTIgQEAKIC8qCiAgKiBHZXQgdGhlIEFjY2VzcyBhbmQvb3IgRGVmYXVsdCBBQ0wgb2YgYSBmaWxlLgogICovCi1zdGF0aWMgaW50IG5mc2FjbGRfcHJvY19nZXRhY2woc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsCitzdGF0aWMgX19iZTMyIG5mc2FjbGRfcHJvY19nZXRhY2woc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsCiAJCXN0cnVjdCBuZnNkM19nZXRhY2xhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDNfZ2V0YWNscmVzICpyZXNwKQogewogCXN2Y19maCAqZmg7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwotCWludCBuZnNlcnIgPSAwOworCV9fYmUzMiBuZnNlcnIgPSAwOwogCiAJZHByaW50aygibmZzZDogR0VUQUNMKDJhY2wpICAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIApAQCAtOTcsMTIgKzk3LDEyIEBACiAvKgogICogU2V0IHRoZSBBY2Nlc3MgYW5kL29yIERlZmF1bHQgQUNMIG9mIGEgZmlsZS4KICAqLwotc3RhdGljIGludCBuZnNhY2xkX3Byb2Nfc2V0YWNsKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLAorc3RhdGljIF9fYmUzMiBuZnNhY2xkX3Byb2Nfc2V0YWNsKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLAogCQlzdHJ1Y3QgbmZzZDNfc2V0YWNsYXJncyAqYXJncCwKIAkJc3RydWN0IG5mc2RfYXR0cnN0YXQgKnJlc3ApCiB7CiAJc3ZjX2ZoICpmaDsKLQlpbnQgbmZzZXJyID0gMDsKKwlfX2JlMzIgbmZzZXJyID0gMDsKIAogCWRwcmludGsoIm5mc2Q6IFNFVEFDTCgyYWNsKSAgICVzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogLyoKICAqIENoZWNrIGZpbGUgYXR0cmlidXRlcwogICovCi1zdGF0aWMgaW50IG5mc2FjbGRfcHJvY19nZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLAorc3RhdGljIF9fYmUzMiBuZnNhY2xkX3Byb2NfZ2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwKIAkJc3RydWN0IG5mc2RfZmhhbmRsZSAqYXJncCwgc3RydWN0IG5mc2RfYXR0cnN0YXQgKnJlc3ApCiB7CiAJZHByaW50aygibmZzZDogR0VUQVRUUiAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKQEAgLTE0MCwxMCArMTQwLDEwIEBACiAvKgogICogQ2hlY2sgZmlsZSBhY2Nlc3MKICAqLwotc3RhdGljIGludCBuZnNhY2xkX3Byb2NfYWNjZXNzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19hY2Nlc3NhcmdzICphcmdwLAorc3RhdGljIF9fYmUzMiBuZnNhY2xkX3Byb2NfYWNjZXNzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19hY2Nlc3NhcmdzICphcmdwLAogCQlzdHJ1Y3QgbmZzZDNfYWNjZXNzcmVzICpyZXNwKQogewotCWludCBuZnNlcnI7CisJX19iZTMyIG5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IEFDQ0VTUygyYWNsKSAgICVzIDB4JXhcbiIsCiAJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKQEAgLTE1OCw3ICsxNTgsNyBAQAogLyoKICAqIFhEUiBkZWNvZGUgZnVuY3Rpb25zCiAgKi8KLXN0YXRpYyBpbnQgbmZzYWNsc3ZjX2RlY29kZV9nZXRhY2xhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzYWNsc3ZjX2RlY29kZV9nZXRhY2xhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2QzX2dldGFjbGFyZ3MgKmFyZ3ApCiB7CiAJaWYgKCEocCA9IG5mczJzdmNfZGVjb2RlX2ZoKHAsICZhcmdwLT5maCkpKQpAQCAtMTY5LDcgKzE2OSw3IEBACiB9CiAKIAotc3RhdGljIGludCBuZnNhY2xzdmNfZGVjb2RlX3NldGFjbGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnNhY2xzdmNfZGVjb2RlX3NldGFjbGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfc2V0YWNsYXJncyAqYXJncCkKIHsKIAlzdHJ1Y3Qga3ZlYyAqaGVhZCA9IHJxc3RwLT5ycV9hcmcuaGVhZDsKQEAgLTE5NCw3ICsxOTQsNyBAQAogCXJldHVybiAobiA+IDApOwogfQogCi1zdGF0aWMgaW50IG5mc2FjbHN2Y19kZWNvZGVfZmhhbmRsZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnNhY2xzdmNfZGVjb2RlX2ZoYW5kbGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2RfZmhhbmRsZSAqYXJncCkKIHsKIAlpZiAoIShwID0gbmZzMnN2Y19kZWNvZGVfZmgocCwgJmFyZ3AtPmZoKSkpCkBAIC0yMDIsNyArMjAyLDcgQEAKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCi1zdGF0aWMgaW50IG5mc2FjbHN2Y19kZWNvZGVfYWNjZXNzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mc2FjbHN2Y19kZWNvZGVfYWNjZXNzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNkM19hY2Nlc3NhcmdzICphcmdwKQogewogCWlmICghKHAgPSBuZnMyc3ZjX2RlY29kZV9maChwLCAmYXJncC0+ZmgpKSkKQEAgLTIxNywxNyArMjE3LDE1IEBACiAgKi8KIAogLyogR0VUQUNMICovCi1zdGF0aWMgaW50IG5mc2FjbHN2Y19lbmNvZGVfZ2V0YWNscmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzYWNsc3ZjX2VuY29kZV9nZXRhY2xyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfZ2V0YWNscmVzICpyZXNwKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHJlc3AtPmZoLmZoX2RlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCWludCB3ID0gbmZzYWNsX3NpemUoCi0JCShyZXNwLT5tYXNrICYgTkZTX0FDTCkgICA/IHJlc3AtPmFjbF9hY2Nlc3MgIDogTlVMTCwKLQkJKHJlc3AtPm1hc2sgJiBORlNfREZBQ0wpID8gcmVzcC0+YWNsX2RlZmF1bHQgOiBOVUxMKTsKIAlzdHJ1Y3Qga3ZlYyAqaGVhZCA9IHJxc3RwLT5ycV9yZXMuaGVhZDsKIAl1bnNpZ25lZCBpbnQgYmFzZTsKIAlpbnQgbjsKKwlpbnQgdzsKIAogCWlmIChkZW50cnkgPT0gTlVMTCB8fCBkZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CkBAIC0yMzksNyArMjM3LDkgQEAKIAkJcmV0dXJuIDA7CiAJYmFzZSA9IChjaGFyICopcCAtIChjaGFyICopaGVhZC0+aW92X2Jhc2U7CiAKLQlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gdzsKKwlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gdyA9IG5mc2FjbF9zaXplKAorCQkocmVzcC0+bWFzayAmIE5GU19BQ0wpICAgPyByZXNwLT5hY2xfYWNjZXNzICA6IE5VTEwsCisJCShyZXNwLT5tYXNrICYgTkZTX0RGQUNMKSA/IHJlc3AtPmFjbF9kZWZhdWx0IDogTlVMTCk7CiAJd2hpbGUgKHcgPiAwKSB7CiAJCWlmICghcnFzdHAtPnJxX3Jlc3BhZ2VzW3Jxc3RwLT5ycV9yZXN1c2VkKytdKQogCQkJcmV0dXJuIDA7CkBAIC0yNTksNyArMjU5LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBuZnNhY2xzdmNfZW5jb2RlX2F0dHJzdGF0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzYWNsc3ZjX2VuY29kZV9hdHRyc3RhdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNkX2F0dHJzdGF0ICpyZXNwKQogewogCXAgPSBuZnMyc3ZjX2VuY29kZV9mYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogfQogCiAvKiBBQ0NFU1MgKi8KLXN0YXRpYyBpbnQgbmZzYWNsc3ZjX2VuY29kZV9hY2Nlc3NyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnNhY2xzdmNfZW5jb2RlX2FjY2Vzc3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNkM19hY2Nlc3NyZXMgKnJlc3ApCiB7CiAJcCA9IG5mczJzdmNfZW5jb2RlX2ZhdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOwpAQCAtMjc4LDcgKzI3OCw3IEBACiAvKgogICogWERSIHJlbGVhc2UgZnVuY3Rpb25zCiAgKi8KLXN0YXRpYyBpbnQgbmZzYWNsc3ZjX3JlbGVhc2VfZ2V0YWNsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzYWNsc3ZjX3JlbGVhc2VfZ2V0YWNsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2QzX2dldGFjbHJlcyAqcmVzcCkKIHsKIAlmaF9wdXQoJnJlc3AtPmZoKTsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IG5mc2FjbHN2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnNhY2xzdmNfcmVsZWFzZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJc3RydWN0IG5mc2RfZmhhbmRsZSAqcmVzcCkKIHsKIAlmaF9wdXQoJnJlc3AtPmZoKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzM2FjbC5jIGIvZnMvbmZzZC9uZnMzYWNsLmMKaW5kZXggZDRiZGMwMC4uM2UzZjJkZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnMzYWNsLmMKKysrIGIvZnMvbmZzZC9uZnMzYWNsLmMKQEAgLTE5LDcgKzE5LDcgQEAKIC8qCiAgKiBOVUxMIGNhbGwuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQogewogCXJldHVybiBuZnNfb2s7CkBAIC0yOCwxMiArMjgsMTIgQEAKIC8qCiAgKiBHZXQgdGhlIEFjY2VzcyBhbmQvb3IgRGVmYXVsdCBBQ0wgb2YgYSBmaWxlLgogICovCi1zdGF0aWMgaW50IG5mc2QzX3Byb2NfZ2V0YWNsKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLAorc3RhdGljIF9fYmUzMiBuZnNkM19wcm9jX2dldGFjbChzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwKIAkJc3RydWN0IG5mc2QzX2dldGFjbGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkM19nZXRhY2xyZXMgKnJlc3ApCiB7CiAJc3ZjX2ZoICpmaDsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0JaW50IG5mc2VyciA9IDA7CisJX19iZTMyIG5mc2VyciA9IDA7CiAKIAlmaCA9IGZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOwogCWlmICgobmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmcmVzcC0+ZmgsIDAsIE1BWV9OT1ApKSkKQEAgLTkzLDEyICs5MywxMiBAQAogLyoKICAqIFNldCB0aGUgQWNjZXNzIGFuZC9vciBEZWZhdWx0IEFDTCBvZiBhIGZpbGUuCiAgKi8KLXN0YXRpYyBpbnQgbmZzZDNfcHJvY19zZXRhY2woc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsCitzdGF0aWMgX19iZTMyIG5mc2QzX3Byb2Nfc2V0YWNsKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLAogCQlzdHJ1Y3QgbmZzZDNfc2V0YWNsYXJncyAqYXJncCwKIAkJc3RydWN0IG5mc2QzX2F0dHJzdGF0ICpyZXNwKQogewogCXN2Y19maCAqZmg7Ci0JaW50IG5mc2VyciA9IDA7CisJX19iZTMyIG5mc2VyciA9IDA7CiAKIAlmaCA9IGZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOwogCW5mc2VyciA9IGZoX3ZlcmlmeShycXN0cCwgJnJlc3AtPmZoLCAwLCBNQVlfU0FUVFIpOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAvKgogICogWERSIGRlY29kZSBmdW5jdGlvbnMKICAqLwotc3RhdGljIGludCBuZnMzc3ZjX2RlY29kZV9nZXRhY2xhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzM3N2Y19kZWNvZGVfZ2V0YWNsYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNkM19nZXRhY2xhcmdzICphcmdzKQogewogCWlmICghKHAgPSBuZnMzc3ZjX2RlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKQEAgLTEzMyw3ICsxMzMsNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgbmZzM3N2Y19kZWNvZGVfc2V0YWNsYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mczNzdmNfZGVjb2RlX3NldGFjbGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfc2V0YWNsYXJncyAqYXJncykKIHsKIAlzdHJ1Y3Qga3ZlYyAqaGVhZCA9IHJxc3RwLT5ycV9hcmcuaGVhZDsKQEAgLTE2Myw3ICsxNjMsNyBAQAogICovCiAKIC8qIEdFVEFDTCAqLwotc3RhdGljIGludCBuZnMzc3ZjX2VuY29kZV9nZXRhY2xyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorc3RhdGljIGludCBuZnMzc3ZjX2VuY29kZV9nZXRhY2xyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfZ2V0YWNscmVzICpyZXNwKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHJlc3AtPmZoLmZoX2RlbnRyeTsKQEAgLTE3MSwxOSArMTcxLDE5IEBACiAJcCA9IG5mczNzdmNfZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKIAlpZiAocmVzcC0+c3RhdHVzID09IDAgJiYgZGVudHJ5ICYmIGRlbnRyeS0+ZF9pbm9kZSkgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCQlpbnQgdyA9IG5mc2FjbF9zaXplKAotCQkJKHJlc3AtPm1hc2sgJiBORlNfQUNMKSAgID8gcmVzcC0+YWNsX2FjY2VzcyAgOiBOVUxMLAotCQkJKHJlc3AtPm1hc2sgJiBORlNfREZBQ0wpID8gcmVzcC0+YWNsX2RlZmF1bHQgOiBOVUxMKTsKIAkJc3RydWN0IGt2ZWMgKmhlYWQgPSBycXN0cC0+cnFfcmVzLmhlYWQ7CiAJCXVuc2lnbmVkIGludCBiYXNlOwogCQlpbnQgbjsKKwkJaW50IHc7CiAKIAkJKnArKyA9IGh0b25sKHJlc3AtPm1hc2spOwogCQlpZiAoIXhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKSkKIAkJCXJldHVybiAwOwogCQliYXNlID0gKGNoYXIgKilwIC0gKGNoYXIgKiloZWFkLT5pb3ZfYmFzZTsKIAotCQlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gdzsKKwkJcnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiA9IHcgPSBuZnNhY2xfc2l6ZSgKKwkJCShyZXNwLT5tYXNrICYgTkZTX0FDTCkgICA/IHJlc3AtPmFjbF9hY2Nlc3MgIDogTlVMTCwKKwkJCShyZXNwLT5tYXNrICYgTkZTX0RGQUNMKSA/IHJlc3AtPmFjbF9kZWZhdWx0IDogTlVMTCk7CiAJCXdoaWxlICh3ID4gMCkgewogCQkJaWYgKCFycXN0cC0+cnFfcmVzcGFnZXNbcnFzdHAtPnJxX3Jlc3VzZWQrK10pCiAJCQkJcmV0dXJuIDA7CkBAIC0yMDgsNyArMjA4LDcgQEAKIH0KIAogLyogU0VUQUNMICovCi1zdGF0aWMgaW50IG5mczNzdmNfZW5jb2RlX3NldGFjbHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mczNzdmNfZW5jb2RlX3NldGFjbHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqcmVzcCkKIHsKIAlwID0gbmZzM3N2Y19lbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOwpAQCAtMjE5LDcgKzIxOSw3IEBACiAvKgogICogWERSIHJlbGVhc2UgZnVuY3Rpb25zCiAgKi8KLXN0YXRpYyBpbnQgbmZzM3N2Y19yZWxlYXNlX2dldGFjbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCitzdGF0aWMgaW50IG5mczNzdmNfcmVsZWFzZV9nZXRhY2woc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQlzdHJ1Y3QgbmZzZDNfZ2V0YWNscmVzICpyZXNwKQogewogCWZoX3B1dCgmcmVzcC0+ZmgpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnMzcHJvYy5jIGIvZnMvbmZzZC9uZnMzcHJvYy5jCmluZGV4IGE1ZWJjN2QuLjdmNWJhZDAgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzM3Byb2MuYworKysgYi9mcy9uZnNkL25mczNwcm9jLmMKQEAgLTQzLDcgKzQzLDcgQEAKIC8qCiAgKiBOVUxMIGNhbGwuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQogewogCXJldHVybiBuZnNfb2s7CkBAIC01MiwxMSArNTIsMTIgQEAKIC8qCiAgKiBHZXQgYSBmaWxlJ3MgYXR0cmlidXRlcwogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX2dldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgKmFyZ3AsCiAJCQkJCSAgIHN0cnVjdCBuZnNkM19hdHRyc3RhdCAqcmVzcCkKIHsKLQlpbnQJZXJyLCBuZnNlcnI7CisJaW50CWVycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogR0VUQVRUUigzKSAgJXNcbiIsCiAJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKQEAgLTc2LDExICs3NywxMSBAQAogLyoKICAqIFNldCBhIGZpbGUncyBhdHRyaWJ1dGVzCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2Nfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfc2F0dHJhcmdzICphcmdwLAogCQkJCQkgICBzdHJ1Y3QgbmZzZDNfYXR0cnN0YXQgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IFNFVEFUVFIoMykgICVzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKQEAgLTk0LDExICs5NSwxMSBAQAogLyoKICAqIExvb2sgdXAgYSBwYXRoIG5hbWUgY29tcG9uZW50CiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19kaXJvcGFyZ3MgKmFyZ3AsCiAJCQkJCSAgc3RydWN0IG5mc2QzX2Rpcm9wcmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBMT09LVVAoMykgICAlcyAlLipzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMTE4LDExICsxMTksMTEgQEAKIC8qCiAgKiBDaGVjayBmaWxlIGFjY2VzcwogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX2FjY2VzcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfYWNjZXNzYXJncyAqYXJncCwKIAkJCQkJICBzdHJ1Y3QgbmZzZDNfYWNjZXNzcmVzICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IEFDQ0VTUygzKSAgICVzIDB4JXhcbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCkBAIC0xMzcsMTEgKzEzOCwxMSBAQAogLyoKICAqIFJlYWQgYSBzeW1saW5rLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX3JlYWRsaW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZWFkbGlua2FyZ3MgKmFyZ3AsCiAJCQkJCSAgIHN0cnVjdCBuZnNkM19yZWFkbGlua3JlcyAqcmVzcCkKIHsKLQlpbnQgbmZzZXJyOworCV9fYmUzMiBuZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBSRUFETElOSygzKSAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOwogCkBAIC0xNTUsMTEgKzE1NiwxMSBAQAogLyoKICAqIFJlYWQgYSBwb3J0aW9uIG9mIGEgZmlsZS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZWFkYXJncyAqYXJncCwKIAkJCQkgICAgICAgIHN0cnVjdCBuZnNkM19yZWFkcmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAJdTMyCW1heF9ibG9ja3NpemUgPSBzdmNfbWF4X3BheWxvYWQocnFzdHApOwogCiAJZHByaW50aygibmZzZDogUkVBRCgzKSAlcyAlbHUgYnl0ZXMgYXQgJWx1XG4iLApAQCAtMTk1LDExICsxOTYsMTEgQEAKIC8qCiAgKiBXcml0ZSBkYXRhIHRvIGEgZmlsZQogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM193cml0ZWFyZ3MgKmFyZ3AsCiAJCQkJCSBzdHJ1Y3QgbmZzZDNfd3JpdGVyZXMgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IFdSSVRFKDMpICAgICVzICVkIGJ5dGVzIGF0ICVsZCVzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMjIzLDEzICsyMjQsMTMgQEAKICAqIEF0IGxlYXN0IGluIHRoZW9yeTsgd2UnbGwgc2VlIGhvdyBpdCBmYXJlcyBpbiBwcmFjdGljZSB3aGVuIHRoZQogICogZmlyc3QgcmVwb3J0cyBhYm91dCBTdW5PUyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHN0YXJ0IHRvIHBvdXIgaW4uLi4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19jcmVhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2NyZWF0ZWFyZ3MgKmFyZ3AsCiAJCQkJCSAgc3RydWN0IG5mc2QzX2Rpcm9wcmVzICAgKnJlc3ApCiB7CiAJc3ZjX2ZoCQkqZGlyZmhwLCAqbmV3ZmhwID0gTlVMTDsKIAlzdHJ1Y3QgaWF0dHIJKmF0dHI7Ci0JdTMyCQluZnNlcnI7CisJX19iZTMyCQluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBDUkVBVEUoMykgICAlcyAlLipzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMjU3LDcgKzI1OCw3IEBACiAJLyogTm93IGNyZWF0ZSB0aGUgZmlsZSBhbmQgc2V0IGF0dHJpYnV0ZXMgKi8KIAluZnNlcnIgPSBuZnNkX2NyZWF0ZV92MyhycXN0cCwgZGlyZmhwLCBhcmdwLT5uYW1lLCBhcmdwLT5sZW4sCiAJCQkJYXR0ciwgbmV3ZmhwLAotCQkJCWFyZ3AtPmNyZWF0ZW1vZGUsIGFyZ3AtPnZlcmYsIE5VTEwpOworCQkJCWFyZ3AtPmNyZWF0ZW1vZGUsIGFyZ3AtPnZlcmYsIE5VTEwsIE5VTEwpOwogCiAJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOwogfQpAQCAtMjY1LDExICsyNjYsMTEgQEAKIC8qCiAgKiBNYWtlIGRpcmVjdG9yeS4gVGhpcyBvcGVyYXRpb24gaXMgbm90IGlkZW1wb3RlbnQuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfbWtkaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX2NyZWF0ZWFyZ3MgKmFyZ3AsCiAJCQkJCSBzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBNS0RJUigzKSAgICAlcyAlLipzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMjg1LDExICsyODYsMTEgQEAKIAlSRVRVUk5fU1RBVFVTKG5mc2Vycik7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2Nfc3ltbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfc3ltbGlua2FyZ3MgKmFyZ3AsCiAJCQkJCSAgIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBTWU1MSU5LKDMpICAlcyAlLipzIC0+ICUuKnNcbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpLApAQCAtMzA3LDExICszMDgsMTIgQEAKIC8qCiAgKiBNYWtlIHNvY2tldC9maWZvL2RldmljZS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19ta25vZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfbWtub2RhcmdzICphcmdwLAogCQkJCQkgc3RydWN0IG5mc2QzX2Rpcm9wcmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyLCB0eXBlOworCV9fYmUzMgluZnNlcnI7CisJaW50IHR5cGU7CiAJZGV2X3QJcmRldiA9IDA7CiAKIAlkcHJpbnRrKCJuZnNkOiBNS05PRCgzKSAgICAlcyAlLipzXG4iLApAQCAtMzQzLDExICszNDUsMTEgQEAKIC8qCiAgKiBSZW1vdmUgZmlsZS9maWZvL3NvY2tldCBldGMuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfcmVtb3ZlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19kaXJvcGFyZ3MgKmFyZ3AsCiAJCQkJCSAgc3RydWN0IG5mc2QzX2F0dHJzdGF0ICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBSRU1PVkUoMykgICAlcyAlLipzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMzYzLDExICszNjUsMTEgQEAKIC8qCiAgKiBSZW1vdmUgYSBkaXJlY3RvcnkKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19ybWRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICphcmdwLAogCQkJCQkgc3RydWN0IG5mc2QzX2F0dHJzdGF0ICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBSTURJUigzKSAgICAlcyAlLipzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLApAQCAtMzc5LDExICszODEsMTEgQEAKIAlSRVRVUk5fU1RBVFVTKG5mc2Vycik7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfcmVuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZW5hbWVhcmdzICphcmdwLAogCQkJCQkgIHN0cnVjdCBuZnNkM19yZW5hbWVyZXMgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IFJFTkFNRSgzKSAgICVzICUuKnMgLT5cbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpLApAQCAtNDAxLDExICs0MDMsMTEgQEAKIAlSRVRVUk5fU1RBVFVTKG5mc2Vycik7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2QzX3Byb2NfbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfbGlua2FyZ3MgKmFyZ3AsCiAJCQkJCXN0cnVjdCBuZnNkM19saW5rcmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBMSU5LKDMpICAgICAlcyAtPlxuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZmaCkpOwpAQCAtNDI0LDExICs0MjYsMTIgQEAKIC8qCiAgKiBSZWFkIGEgcG9ydGlvbiBvZiBhIGRpcmVjdG9yeS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19yZWFkZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncCwKIAkJCQkJICAgc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgICpyZXNwKQogewotCWludAkJbmZzZXJyLCBjb3VudDsKKwlfX2JlMzIJCW5mc2VycjsKKwlpbnQJCWNvdW50OwogCiAJZHByaW50aygibmZzZDogUkVBRERJUigzKSAgJXMgJWQgYnl0ZXMgYXQgJWRcbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCkBAIC00NTksMTEgKzQ2MiwxMiBAQAogICogUmVhZCBhIHBvcnRpb24gb2YgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBmaWxlIGhhbmRsZXMgYW5kIGF0dHJzLgogICogRm9yIG5vdywgd2UgY2hvb3NlIHRvIGlnbm9yZSB0aGUgZGlyY291bnQgcGFyYW1ldGVyLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX3JlYWRkaXJwbHVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncCwKIAkJCQkJICAgICAgIHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyLCBjb3VudCA9IDA7CisJX19iZTMyCW5mc2VycjsKKwlpbnQJY291bnQgPSAwOwogCWxvZmZfdAlvZmZzZXQ7CiAJaW50CWk7CiAJY2FkZHJfdAlwYWdlX2FkZHIgPSBOVUxMOwpAQCAtNTE3LDExICs1MjEsMTEgQEAKIC8qCiAgKiBHZXQgZmlsZSBzeXN0ZW0gc3RhdHMKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19mc3N0YXQoc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgICAgKmFyZ3AsCiAJCQkJCSAgIHN0cnVjdCBuZnNkM19mc3N0YXRyZXMgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogRlNTVEFUKDMpICAgJXNcbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCkpOwpAQCAtNTM0LDExICs1MzgsMTEgQEAKIC8qCiAgKiBHZXQgZmlsZSBzeXN0ZW0gaW5mbwogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkM19wcm9jX2ZzaW5mbyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgICAqYXJncCwKIAkJCQkJICAgc3RydWN0IG5mc2QzX2ZzaW5mb3JlcyAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAJdTMyCW1heF9ibG9ja3NpemUgPSBzdmNfbWF4X3BheWxvYWQocnFzdHApOwogCiAJZHByaW50aygibmZzZDogRlNJTkZPKDMpICAgJXNcbiIsCkBAIC01NzYsMTEgKzU4MCwxMSBAQAogLyoKICAqIEdldCBwYXRoY29uZiBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19wYXRoY29uZihzdHJ1Y3Qgc3ZjX3Jxc3QgKiBycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgICAgICphcmdwLAogCQkJCQkgICAgIHN0cnVjdCBuZnNkM19wYXRoY29uZnJlcyAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBQQVRIQ09ORigzKSAlc1xuIiwKIAkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CkBAIC02MTksMTEgKzYyMywxMSBAQAogLyoKICAqIENvbW1pdCBhIGZpbGUgKHJhbmdlKSB0byBzdGFibGUgc3RvcmFnZS4KICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDNfcHJvY19jb21taXQoc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsIHN0cnVjdCBuZnNkM19jb21taXRhcmdzICphcmdwLAogCQkJCQkgICBzdHJ1Y3QgbmZzZDNfY29tbWl0cmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBDT01NSVQoMykgICAlcyAldUAlTHVcbiIsCiAJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczN4ZHIuYyBiL2ZzL25mc2QvbmZzM3hkci5jCmluZGV4IDI0N2Q1MTguLjI3N2RmNDAgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzM3hkci5jCisrKyBiL2ZzL25mc2QvbmZzM3hkci5jCkBAIC0yNCwxMCArMjQsNiBAQAogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfWERSCiAKLSNpZmRlZiBORlNEX09QVElNSVpFX1NQQUNFCi0jIGRlZmluZSBpbmxpbmUKLSNlbmRpZgotCiAKIC8qCiAgKiBNYXBwaW5nIG9mIFNfSUYqIHR5cGVzIHRvIE5GUyBmaWxlIHR5cGVzCkBAIC00MiwyMyArMzgsMjMgQEAKIC8qCiAgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBORlMgdHlwZXMKICAqLwotc3RhdGljIGlubGluZSB1MzIgKgotZW5jb2RlX3RpbWUzKHUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lKQorc3RhdGljIF9fYmUzMiAqCitlbmNvZGVfdGltZTMoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCiB7CiAJKnArKyA9IGh0b25sKCh1MzIpIHRpbWUtPnR2X3NlYyk7ICpwKysgPSBodG9ubCh0aW1lLT50dl9uc2VjKTsKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotZGVjb2RlX3RpbWUzKHUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lKQorc3RhdGljIF9fYmUzMiAqCitkZWNvZGVfdGltZTMoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCiB7CiAJdGltZS0+dHZfc2VjID0gbnRvaGwoKnArKyk7CiAJdGltZS0+dHZfbnNlYyA9IG50b2hsKCpwKyspOwogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCitzdGF0aWMgX19iZTMyICoKK2RlY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAlmaF9pbml0KGZocCwgTkZTM19GSFNJWkUpOwpAQCAtNzIsMTMgKzY4LDEzIEBACiB9CiAKIC8qIEhlbHBlciBmdW5jdGlvbiBmb3IgTkZTdjMgQUNMIGNvZGUgKi8KLXUzMiAqbmZzM3N2Y19kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCitfX2JlMzIgKm5mczNzdmNfZGVjb2RlX2ZoKF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCXJldHVybiBkZWNvZGVfZmgocCwgZmhwKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotZW5jb2RlX2ZoKHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQorc3RhdGljIF9fYmUzMiAqCitlbmNvZGVfZmgoX19iZTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJdW5zaWduZWQgaW50IHNpemUgPSBmaHAtPmZoX2hhbmRsZS5maF9zaXplOwogCSpwKysgPSBodG9ubChzaXplKTsKQEAgLTkxLDggKzg3LDggQEAKICAqIERlY29kZSBhIGZpbGUgbmFtZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHBhdGggY29udGFpbnMKICAqIG5vIHNsYXNoZXMgb3IgbnVsbCBieXRlcy4KICAqLwotc3RhdGljIGlubGluZSB1MzIgKgotZGVjb2RlX2ZpbGVuYW1lKHUzMiAqcCwgY2hhciAqKm5hbXAsIGludCAqbGVucCkKK3N0YXRpYyBfX2JlMzIgKgorZGVjb2RlX2ZpbGVuYW1lKF9fYmUzMiAqcCwgY2hhciAqKm5hbXAsIGludCAqbGVucCkKIHsKIAljaGFyCQkqbmFtZTsKIAlpbnQJCWk7CkBAIC0xMDcsOCArMTAzLDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotZGVjb2RlX3NhdHRyMyh1MzIgKnAsIHN0cnVjdCBpYXR0ciAqaWFwKQorc3RhdGljIF9fYmUzMiAqCitkZWNvZGVfc2F0dHIzKF9fYmUzMiAqcCwgc3RydWN0IGlhdHRyICppYXApCiB7CiAJdTMyCXRtcDsKIApAQCAtMTUzLDggKzE0OSw4IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLWVuY29kZV9mYXR0cjMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCitzdGF0aWMgX19iZTMyICoKK2VuY29kZV9mYXR0cjMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCiAJICAgICAgc3RydWN0IGtzdGF0ICpzdGF0KQogewogCXN0cnVjdCBkZW50cnkJKmRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OwpAQCAtMTg2LDggKzE4Miw4IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLWVuY29kZV9zYXZlZF9wb3N0X2F0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCitzdGF0aWMgX19iZTMyICoKK2VuY29kZV9zYXZlZF9wb3N0X2F0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJc3RydWN0IGlub2RlCSppbm9kZSA9IGZocC0+ZmhfZGVudHJ5LT5kX2lub2RlOwogCkBAIC0yMjQsOCArMjIwLDggQEAKICAqIFRoZSBpbm9kZSBtYXkgYmUgTlVMTCBpZiB0aGUgY2FsbCBmYWlsZWQgYmVjYXVzZSBvZiBhIHN0YWxlIGZpbGUKICAqIGhhbmRsZS4gSW4gdGhpcyBjYXNlLCBubyBhdHRyaWJ1dGVzIGFyZSByZXR1cm5lZC4KICAqLwotc3RhdGljIHUzMiAqCi1lbmNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQorc3RhdGljIF9fYmUzMiAqCitlbmNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OwogCWlmIChkZW50cnkgJiYgZGVudHJ5LT5kX2lub2RlICE9IE5VTEwpIHsKQEAgLTI0Myw4ICsyMzksOCBAQAogfQogCiAvKiBIZWxwZXIgZm9yIE5GU3YzIEFDTHMgKi8KLXUzMiAqCi1uZnMzc3ZjX2VuY29kZV9wb3N0X29wX2F0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCitfX2JlMzIgKgorbmZzM3N2Y19lbmNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCXJldHVybiBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCBmaHApOwogfQpAQCAtMjUyLDggKzI0OCw4IEBACiAvKgogICogRW5vY2RlIHdlYWsgY2FjaGUgY29uc2lzdGVuY3kgZGF0YQogICovCi1zdGF0aWMgdTMyICoKLWVuY29kZV93Y2NfZGF0YShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3N0YXRpYyBfX2JlMzIgKgorZW5jb2RlX3djY19kYXRhKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCXN0cnVjdCBkZW50cnkJKmRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OwogCkBAIC0yNzgsNyArMjc0LDcgQEAKICAqIFhEUiBkZWNvZGUgZnVuY3Rpb25zCiAgKi8KIGludAotbmZzM3N2Y19kZWNvZGVfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgKmFyZ3MpCituZnMzc3ZjX2RlY29kZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc2RfZmhhbmRsZSAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQogCQlyZXR1cm4gMDsKQEAgLTI4Niw3ICsyODIsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX3NhdHRyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9zYXR0cmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfc2F0dHJhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKQEAgLTMwMyw3ICsyOTksNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX2Rpcm9wYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9kaXJvcGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKQEAgLTMxNCw3ICszMTAsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX2FjY2Vzc2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19kZWNvZGVfYWNjZXNzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19hY2Nlc3NhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCkBAIC0zMjUsNyArMzIxLDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19yZWFkYXJncyAqYXJncykKIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwpAQCAtMzU1LDcgKzM1MSw3IEBACiB9CiAKIGludAotbmZzM3N2Y19kZWNvZGVfd3JpdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3dyaXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM193cml0ZWFyZ3MgKmFyZ3MpCiB7CiAJdW5zaWduZWQgaW50IGxlbiwgdiwgaGRyOwpAQCAtMzkzLDcgKzM4OSw3IEBACiB9CiAKIGludAotbmZzM3N2Y19kZWNvZGVfY3JlYXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9jcmVhdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2NyZWF0ZWFyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQpAQCAtNDE3LDcgKzQxMyw3IEBACiAJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KIGludAotbmZzM3N2Y19kZWNvZGVfbWtkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX21rZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19jcmVhdGVhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKQEAgLTQyOSw3ICs0MjUsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX3N5bWxpbmthcmdzICphcmdzKQogewogCXVuc2lnbmVkIGludCBsZW47CkBAIC00ODEsNyArNDc3LDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX2RlY29kZV9ta25vZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19kZWNvZGVfbWtub2RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX21rbm9kYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpCkBAIC01MDUsNyArNTAxLDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3JlbmFtZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVuYW1lYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQpAQCAtNTE4LDcgKzUxNCw3IEBACiB9CiAKIGludAotbmZzM3N2Y19kZWNvZGVfcmVhZGxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3JlYWRsaW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19yZWFkbGlua2FyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKQEAgLTUzMCw3ICs1MjYsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2xpbmthcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZmaCkpCkBAIC01NDIsNyArNTM4LDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQpAQCAtNTYyLDcgKzU1OCw3IEBACiB9CiAKIGludAotbmZzM3N2Y19kZWNvZGVfcmVhZGRpcnBsdXNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZGVjb2RlX3JlYWRkaXJwbHVzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncykKIHsKIAlpbnQgbGVuLCBwbjsKQEAgLTU5MCw3ICs1ODYsNyBAQAogfQogCiBpbnQKLW5mczNzdmNfZGVjb2RlX2NvbW1pdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19kZWNvZGVfY29tbWl0YXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19jb21taXRhcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCkBAIC02MDksMTQgKzYwNSwxNCBAQAogICogd2lsbCB3b3JrIHByb3Blcmx5LgogICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK25mczNzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCiAvKiBHRVRBVFRSICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2F0dHJzdGF0ICpyZXNwKQogewogCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkKQEAgLTYyNiw3ICs2MjIsNyBAQAogCiAvKiBTRVRBVFRSLCBSRU1PVkUsIFJNRElSICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX3djY3N0YXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19lbmNvZGVfd2Njc3RhdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOwpAQCAtNjM1LDcgKzYzMSw3IEBACiAKIC8qIExPT0tVUCAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19kaXJvcHJlcyAqcmVzcCkKIHsKIAlpZiAocmVzcC0+c3RhdHVzID09IDApIHsKQEAgLTY0OCw3ICs2NDQsNyBAQAogCiAvKiBBQ0NFU1MgKi8KIGludAotbmZzM3N2Y19lbmNvZGVfYWNjZXNzcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZW5jb2RlX2FjY2Vzc3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM19hY2Nlc3NyZXMgKnJlc3ApCiB7CiAJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CkBAIC02NTksNyArNjU1LDcgQEAKIAogLyogUkVBRExJTksgKi8KIGludAotbmZzM3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGxpbmtyZXMgKnJlc3ApCiB7CiAJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CkBAIC02ODAsNyArNjc2LDcgQEAKIAogLyogUkVBRCAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9yZWFkcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZW5jb2RlX3JlYWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZHJlcyAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKQEAgLTcwNCw3ICs3MDAsNyBAQAogCiAvKiBXUklURSAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV93cml0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV93cml0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkM193cml0ZXJlcyAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOwpAQCAtNzE5LDcgKzcxNSw3IEBACiAKIC8qIENSRUFURSwgTUtESVIsIFNZTUxJTkssIE1LTk9EICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX2NyZWF0ZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9jcmVhdGVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgKnJlc3ApCiB7CiAJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CkBAIC03MzMsNyArNzI5LDcgQEAKIAogLyogUkVOQU1FICovCiBpbnQKLW5mczNzdmNfZW5jb2RlX3JlbmFtZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9yZW5hbWVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVuYW1lcmVzICpyZXNwKQogewogCXAgPSBlbmNvZGVfd2NjX2RhdGEocnFzdHAsIHAsICZyZXNwLT5mZmgpOwpAQCAtNzQzLDcgKzczOSw3IEBACiAKIC8qIExJTksgKi8KIGludAotbmZzM3N2Y19lbmNvZGVfbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnMzc3ZjX2VuY29kZV9saW5rcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2xpbmtyZXMgKnJlc3ApCiB7CiAJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CkBAIC03NTMsNyArNzQ5LDcgQEAKIAogLyogUkVBRERJUiAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9yZWFkZGlycmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfZW5jb2RlX3JlYWRkaXJyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKQEAgLTc3Niw4ICs3NzIsOCBAQAogCQlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1lbmNvZGVfZW50cnlfYmFnZ2FnZShzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqY2QsIHUzMiAqcCwgY29uc3QgY2hhciAqbmFtZSwKK3N0YXRpYyBfX2JlMzIgKgorZW5jb2RlX2VudHJ5X2JhZ2dhZ2Uoc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgKmNkLCBfX2JlMzIgKnAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJICAgICBpbnQgbmFtbGVuLCBpbm9fdCBpbm8pCiB7CiAJKnArKyA9IHhkcl9vbmU7CQkJCSAvKiBtYXJrIGVudHJ5IHByZXNlbnQgKi8KQEAgLTc5MCw4ICs3ODYsOCBAQAogCXJldHVybiBwOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1lbmNvZGVfZW50cnlwbHVzX2JhZ2dhZ2Uoc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgKmNkLCB1MzIgKnAsCitzdGF0aWMgX19iZTMyICoKK2VuY29kZV9lbnRyeXBsdXNfYmFnZ2FnZShzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqY2QsIF9fYmUzMiAqcCwKIAkJc3RydWN0IHN2Y19maCAqZmhwKQogewogCQlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihjZC0+cnFzdHAsIHAsIGZocCk7CkBAIC04NTMsNyArODQ5LDcgQEAKIHsKIAlzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqY2QgPSBjb250YWluZXJfb2YoY2NkLCBzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcywKIAkJICAgICAgIAkJCQkJY29tbW9uKTsKLQl1MzIJCSpwID0gY2QtPmJ1ZmZlcjsKKwlfX2JlMzIJCSpwID0gY2QtPmJ1ZmZlcjsKIAljYWRkcl90CQljdXJyX3BhZ2VfYWRkciA9IE5VTEw7CiAJaW50CQlwbjsJCS8qIGN1cnJlbnQgcGFnZSBudW1iZXIgKi8KIAlpbnQJCXNsZW47CQkvKiBzdHJpbmcgKG5hbWUpIGxlbmd0aCAqLwpAQCAtOTE5LDcgKzkxNSw3IEBACiAJfSBlbHNlIGlmIChjZC0+cnFzdHAtPnJxX3Jlc3BhZ2VzW3BuKzFdICE9IE5VTEwpIHsKIAkJLyogdGVtcG9yYXJpbHkgZW5jb2RlIGVudHJ5IGludG8gbmV4dCBwYWdlLCB0aGVuIG1vdmUgYmFjayB0bwogCQkgKiBjdXJyZW50IGFuZCBuZXh0IHBhZ2UgaW4gcnFfcmVzcGFnZXNbXSAqLwotCQl1MzIgKnAxLCAqdG1wOworCQlfX2JlMzIgKnAxLCAqdG1wOwogCQlpbnQgbGVuMSwgbGVuMjsKIAogCQkvKiBncmFiIG5leHQgcGFnZSBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2Ugb2YgZW50cnkgKi8KQEAgLTEwMDksNyArMTAwNSw3IEBACiAKIC8qIEZTU1RBVCAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9mc3N0YXRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19lbmNvZGVfZnNzdGF0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2Zzc3RhdHJlcyAqcmVzcCkKIHsKIAlzdHJ1Y3Qga3N0YXRmcwkqcyA9ICZyZXNwLT5zdGF0czsKQEAgLTEwMzEsNyArMTAyNyw3IEBACiAKIC8qIEZTSU5GTyAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9mc2luZm9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19lbmNvZGVfZnNpbmZvcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2ZzaW5mb3JlcyAqcmVzcCkKIHsKIAkqcCsrID0geGRyX3plcm87CS8qIG5vIHBvc3Rfb3BfYXR0ciAqLwpAQCAtMTA1NSw3ICsxMDUxLDcgQEAKIAogLyogUEFUSENPTkYgKi8KIGludAotbmZzM3N2Y19lbmNvZGVfcGF0aGNvbmZyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19lbmNvZGVfcGF0aGNvbmZyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZDNfcGF0aGNvbmZyZXMgKnJlc3ApCiB7CiAJKnArKyA9IHhkcl96ZXJvOwkvKiBubyBwb3N0X29wX2F0dHIgKi8KQEAgLTEwNzQsNyArMTA3MCw3IEBACiAKIC8qIENPTU1JVCAqLwogaW50Ci1uZnMzc3ZjX2VuY29kZV9jb21taXRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19lbmNvZGVfY29tbWl0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2NvbW1pdHJlcyAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOwpAQCAtMTA5MCw3ICsxMDg2LDcgQEAKICAqIFhEUiByZWxlYXNlIGZ1bmN0aW9ucwogICovCiBpbnQKLW5mczNzdmNfcmVsZWFzZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mczNzdmNfcmVsZWFzZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2F0dHJzdGF0ICpyZXNwKQogewogCWZoX3B1dCgmcmVzcC0+ZmgpOwpAQCAtMTA5OCw3ICsxMDk0LDcgQEAKIH0KIAogaW50Ci1uZnMzc3ZjX3JlbGVhc2VfZmhhbmRsZTIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzM3N2Y19yZWxlYXNlX2ZoYW5kbGUyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2QzX2ZoYW5kbGVfcGFpciAqcmVzcCkKIHsKIAlmaF9wdXQoJnJlc3AtPmZoMSk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCBmNmNhOWZiLi5mNTc2NTVhIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTg1LDggKzg1LDggQEAKIC8qCiAqIEdlbmVyaWMgZW5jb2RlIHJvdXRpbmVzIGZyb20gZnMvbmZzL25mczR4ZHIuYwogKi8KLXN0YXRpYyBpbmxpbmUgdTMyICoKLXhkcl93cml0ZW1lbSh1MzIgKnAsIGNvbnN0IHZvaWQgKnB0ciwgaW50IG5ieXRlcykKK3N0YXRpYyBpbmxpbmUgX19iZTMyICoKK3hkcl93cml0ZW1lbShfX2JlMzIgKnAsIGNvbnN0IHZvaWQgKnB0ciwgaW50IG5ieXRlcykKIHsKIAlpbnQgdG1wID0gWERSX1FVQURMRU4obmJ5dGVzKTsKIAlpZiAoIXRtcCkKQEAgLTIwNSw3ICsyMDUsNyBAQAogc3RhdGljIGludAogZW5jb2RlX2NiX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcikKIHsKLQl1MzIgKiBwOworCV9fYmUzMiAqIHA7CiAKIAlSRVNFUlZFX1NQQUNFKDE2KTsKIAlXUklURTMyKDApOyAgICAgICAgICAgIC8qIHRhZyBsZW5ndGggaXMgYWx3YXlzIDAgKi8KQEAgLTIxOCw3ICsyMTgsNyBAQAogc3RhdGljIGludAogZW5jb2RlX2NiX3JlY2FsbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jYl9yZWNhbGwgKmNiX3JlYykKIHsKLQl1MzIgKnA7CisJX19iZTMyICpwOwogCWludCBsZW4gPSBjYl9yZWMtPmNicl9maGxlbjsKIAogCVJFU0VSVkVfU1BBQ0UoMTIrc2l6ZW9mKGNiX3JlYy0+Y2JyX3N0YXRlaWQpICsgbGVuKTsKQEAgLTIzMSw3ICsyMzEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1uZnM0X3hkcl9lbmNfY2JfbnVsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwKQorbmZzNF94ZHJfZW5jX2NiX251bGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCkKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHJzLCAqeGRyID0gJnhkcnM7CiAKQEAgLTI0MSw3ICsyNDEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1uZnM0X3hkcl9lbmNfY2JfcmVjYWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnM0X2NiX3JlY2FsbCAqYXJncykKK25mczRfeGRyX2VuY19jYl9yZWNhbGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfY2JfcmVjYWxsICphcmdzKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgaGRyID0gewpAQCAtMjU3LDcgKzI1Nyw3IEBACiAKIHN0YXRpYyBpbnQKIGRlY29kZV9jYl9jb21wb3VuZF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyICpoZHIpewotICAgICAgICB1MzIgKnA7CisgICAgICAgIF9fYmUzMiAqcDsKIAogICAgICAgICBSRUFEX0JVRig4KTsKICAgICAgICAgUkVBRDMyKGhkci0+c3RhdHVzKTsKQEAgLTI3Miw3ICsyNzIsNyBAQAogc3RhdGljIGludAogZGVjb2RlX2NiX29wX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBlbnVtIG5mc19vcG51bTQgZXhwZWN0ZWQpCiB7Ci0JdTMyICpwOworCV9fYmUzMiAqcDsKIAl1MzIgb3A7CiAJaW50MzJfdCBuZnNlcnI7CiAKQEAgLTI5MSwxMyArMjkxLDEzIEBACiB9CiAKIHN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19jYl9udWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnApCituZnM0X3hkcl9kZWNfY2JfbnVsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwKQogewogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1uZnM0X3hkcl9kZWNfY2JfcmVjYWxsKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCkKK25mczRfeGRyX2RlY19jYl9yZWNhbGwoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwKQogewogCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgaGRyOwpAQCAtNDIxLDcgKzQyMSw3IEBACiAKIAkvKiBDcmVhdGUgUlBDIGNsaWVudCAqLwogCWNiLT5jYl9jbGllbnQgPSBycGNfY3JlYXRlKCZhcmdzKTsKLQlpZiAoIWNiLT5jYl9jbGllbnQpIHsKKwlpZiAoSVNfRVJSKGNiLT5jYl9jbGllbnQpKSB7CiAJCWRwcmludGsoIk5GU0Q6IGNvdWxkbid0IGNyZWF0ZSBjYWxsYmFjayBjbGllbnRcbiIpOwogCQlnb3RvIG91dF9lcnI7CiAJfQpAQCAtNDQ4LDEwICs0NDgsMTAgQEAKIG91dF9ycGNpb2Q6CiAJYXRvbWljX2RlYygmY2xwLT5jbF9jb3VudCk7CiAJcnBjaW9kX2Rvd24oKTsKLQljYi0+Y2JfY2xpZW50ID0gTlVMTDsKIG91dF9jbG50OgogCXJwY19zaHV0ZG93bl9jbGllbnQoY2ItPmNiX2NsaWVudCk7CiBvdXRfZXJyOgorCWNiLT5jYl9jbGllbnQgPSBOVUxMOwogCWRwcmludGsoIk5GU0Q6IHdhcm5pbmc6IG5vIGNhbGxiYWNrIHBhdGggdG8gY2xpZW50ICUuKnNcbiIsCiAJCShpbnQpY2xwLT5jbF9uYW1lLmxlbiwgY2xwLT5jbF9uYW1lLmRhdGEpOwogfQpAQCAtNDYxLDcgKzQ2MSw3IEBACiB7CiAJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSAoc3RydWN0IG5mczRfY2xpZW50ICopdGFzay0+dGtfbXNnLnJwY19hcmdwOwogCXN0cnVjdCBuZnM0X2NhbGxiYWNrICpjYiA9ICZjbHAtPmNsX2NhbGxiYWNrOwotCXUzMiBhZGRyID0gaHRvbmwoY2ItPmNiX2FkZHIpOworCV9fYmUzMiBhZGRyID0gaHRvbmwoY2ItPmNiX2FkZHIpOwogCiAJZHByaW50aygiTkZTRDogbmZzNF9jYl9udWxsIHRhc2stPnRrX3N0YXR1cyAlZFxuIiwgdGFzay0+dGtfc3RhdHVzKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cHJvYy5jIGIvZnMvbmZzZC9uZnM0cHJvYy5jCmluZGV4IDgzMzNkYjEuLjg1MjI3MjkgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHByb2MuYworKysgYi9mcy9uZnNkL25mczRwcm9jLmMKQEAgLTMzLDEzICszMyw2IEBACiAgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKICAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiBOb3RlOiBzb21lIHJvdXRpbmVzIGluIHRoaXMgZmlsZSBhcmUganVzdCB0cml2aWFsIHdyYXBwZXJzCi0gKiAoZS5nLiBuZnNkNF9sb29rdXAoKSkgZGVmaW5lZCBzb2xlbHkgZm9yIHRoZSBzYWtlIG9mIGNvbnNpc3RlbnQKLSAqIG5hbWluZy4gIFNpbmNlIGFsbCBzdWNoIHJvdXRpbmVzIGhhdmUgYmVlbiBkZWNsYXJlZCAiaW5saW5lIiwKLSAqIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgYXNzb2NpYXRlZCBvdmVyaGVhZC4gIEF0IHNvbWUgcG9pbnQgaW4KLSAqIHRoZSBmdXR1cmUsIEkgbWlnaHQgaW5saW5lIHRoZXNlICJieSBoYW5kIiB0byBjbGVhbiB1cCBhCi0gKiBsaXR0bGUuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CkBAIC02NywzMiArNjAsMzMgQEAKIAkqZHN0ID0gKnNyYzsKIH0KIAotc3RhdGljIGludAotZG9fb3Blbl9wZXJtaXNzaW9uKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQorc3RhdGljIF9fYmUzMgorZG9fb3Blbl9wZXJtaXNzaW9uKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuLCBpbnQgYWNjbW9kZSkKIHsKLQlpbnQgYWNjbW9kZSwgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlpZiAob3Blbi0+b3BfdHJ1bmNhdGUgJiYKIAkJIShvcGVuLT5vcF9zaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkpCiAJCXJldHVybiBuZnNlcnJfaW52YWw7CiAKLQlhY2Ntb2RlID0gTUFZX05PUDsKIAlpZiAob3Blbi0+b3Bfc2hhcmVfYWNjZXNzICYgTkZTNF9TSEFSRV9BQ0NFU1NfUkVBRCkKLQkJYWNjbW9kZSA9IE1BWV9SRUFEOwotCWlmIChvcGVuLT5vcF9zaGFyZV9kZW55ICYgTkZTNF9TSEFSRV9BQ0NFU1NfV1JJVEUpCisJCWFjY21vZGUgfD0gTUFZX1JFQUQ7CisJaWYgKG9wZW4tPm9wX3NoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKQogCQlhY2Ntb2RlIHw9IChNQVlfV1JJVEUgfCBNQVlfVFJVTkMpOwotCWFjY21vZGUgfD0gTUFZX09XTkVSX09WRVJSSURFOworCWlmIChvcGVuLT5vcF9zaGFyZV9kZW55ICYgTkZTNF9TSEFSRV9ERU5ZX1dSSVRFKQorCQlhY2Ntb2RlIHw9IE1BWV9XUklURTsKIAogCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgU19JRlJFRywgYWNjbW9kZSk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBkb19vcGVuX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKIHsKIAlzdHJ1Y3Qgc3ZjX2ZoIHJlc2ZoOwotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKKwlpbnQgY3JlYXRlZCA9IDA7CiAKIAlmaF9pbml0KCZyZXNmaCwgTkZTNF9GSFNJWkUpOwogCW9wZW4tPm9wX3RydW5jYXRlID0gMDsKQEAgLTEwNSwzNiArOTksMzUgQEAKIAkJc3RhdHVzID0gbmZzZF9jcmVhdGVfdjMocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4tPm9wX2ZuYW1lLmRhdGEsCiAJCQkJCW9wZW4tPm9wX2ZuYW1lLmxlbiwgJm9wZW4tPm9wX2lhdHRyLAogCQkJCQkmcmVzZmgsIG9wZW4tPm9wX2NyZWF0ZW1vZGUsCi0JCQkJCSh1MzIgKilvcGVuLT5vcF92ZXJmLmRhdGEsICZvcGVuLT5vcF90cnVuY2F0ZSk7Ci0JfQotCWVsc2UgeworCQkJCQkodTMyICopb3Blbi0+b3BfdmVyZi5kYXRhLCAmb3Blbi0+b3BfdHJ1bmNhdGUsICZjcmVhdGVkKTsKKwl9IGVsc2UgewogCQlzdGF0dXMgPSBuZnNkX2xvb2t1cChycXN0cCwgY3VycmVudF9maCwKIAkJCQkgICAgIG9wZW4tPm9wX2ZuYW1lLmRhdGEsIG9wZW4tPm9wX2ZuYW1lLmxlbiwgJnJlc2ZoKTsKIAkJZmhfdW5sb2NrKGN1cnJlbnRfZmgpOwogCX0KKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKIAotCWlmICghc3RhdHVzKSB7Ci0JCXNldF9jaGFuZ2VfaW5mbygmb3Blbi0+b3BfY2luZm8sIGN1cnJlbnRfZmgpOworCXNldF9jaGFuZ2VfaW5mbygmb3Blbi0+b3BfY2luZm8sIGN1cnJlbnRfZmgpOwogCi0JCS8qIHNldCByZXBseSBjYWNoZSAqLwotCQlmaF9kdXAyKGN1cnJlbnRfZmgsICZyZXNmaCk7Ci0JCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheS5ycF9vcGVuZmhfbGVuID0KLQkJCXJlc2ZoLmZoX2hhbmRsZS5maF9zaXplOwotCQltZW1jcHkob3Blbi0+b3Bfc3RhdGVvd25lci0+c29fcmVwbGF5LnJwX29wZW5maCwKLQkJCQkmcmVzZmguZmhfaGFuZGxlLmZoX2Jhc2UsCi0JCQkJcmVzZmguZmhfaGFuZGxlLmZoX3NpemUpOworCS8qIHNldCByZXBseSBjYWNoZSAqLworCWZoX2R1cDIoY3VycmVudF9maCwgJnJlc2ZoKTsKKwlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfb3BlbmZoX2xlbiA9IHJlc2ZoLmZoX2hhbmRsZS5maF9zaXplOworCW1lbWNweShvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfb3BlbmZoLAorCQkJJnJlc2ZoLmZoX2hhbmRsZS5maF9iYXNlLCByZXNmaC5maF9oYW5kbGUuZmhfc2l6ZSk7CiAKLQkJc3RhdHVzID0gZG9fb3Blbl9wZXJtaXNzaW9uKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuKTsKLQl9CisJaWYgKCFjcmVhdGVkKQorCQlzdGF0dXMgPSBkb19vcGVuX3Blcm1pc3Npb24ocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4sIE1BWV9OT1ApOwogCitvdXQ6CiAJZmhfcHV0KCZyZXNmaCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogZG9fb3Blbl9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCS8qIE9ubHkgcmVjbGFpbXMgZnJvbSBwcmV2aW91c2x5IGNvbmZpcm1lZCBjbGllbnRzIGFyZSB2YWxpZCAqLwogCWlmICgoc3RhdHVzID0gbmZzNF9jaGVja19vcGVuX3JlY2xhaW0oJm9wZW4tPm9wX2NsaWVudGlkKSkpCkBAIC0xNTUsMTYgKzE0OCwxNyBAQAogCW9wZW4tPm9wX3RydW5jYXRlID0gKG9wZW4tPm9wX2lhdHRyLmlhX3ZhbGlkICYgQVRUUl9TSVpFKSAmJgogCQkob3Blbi0+b3BfaWF0dHIuaWFfc2l6ZSA9PSAwKTsKIAotCXN0YXR1cyA9IGRvX29wZW5fcGVybWlzc2lvbihycXN0cCwgY3VycmVudF9maCwgb3Blbik7CisJc3RhdHVzID0gZG9fb3Blbl9wZXJtaXNzaW9uKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuLCBNQVlfT1dORVJfT1ZFUlJJREUpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludAotbmZzZDRfb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3Blbiwgc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnJlcGxheV9vd25lcikKK3N0YXRpYyBfX2JlMzIKK25mc2Q0X29wZW4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCisJICAgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCWRwcmludGsoIk5GU0Q6IG5mc2Q0X29wZW4gZmlsZW5hbWUgJS4qcyBvcF9zdGF0ZW93bmVyICVwXG4iLAogCQkoaW50KW9wZW4tPm9wX2ZuYW1lLmxlbiwgb3Blbi0+b3BfZm5hbWUuZGF0YSwKIAkJb3Blbi0+b3Bfc3RhdGVvd25lcik7CkBAIC0xNzcsMTggKzE3MSwxOCBAQAogCiAJLyogY2hlY2sgc2VxaWQgZm9yIHJlcGxheS4gc2V0IG5mczRfb3duZXIgKi8KIAlzdGF0dXMgPSBuZnNkNF9wcm9jZXNzX29wZW4xKG9wZW4pOwotCWlmIChzdGF0dXMgPT0gTkZTRVJSX1JFUExBWV9NRSkgeworCWlmIChzdGF0dXMgPT0gbmZzZXJyX3JlcGxheV9tZSkgewogCQlzdHJ1Y3QgbmZzNF9yZXBsYXkgKnJwID0gJm9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheTsKLQkJZmhfcHV0KGN1cnJlbnRfZmgpOwotCQljdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfc2l6ZSA9IHJwLT5ycF9vcGVuZmhfbGVuOwotCQltZW1jcHkoJmN1cnJlbnRfZmgtPmZoX2hhbmRsZS5maF9iYXNlLCBycC0+cnBfb3BlbmZoLAorCQlmaF9wdXQoJmNzdGF0ZS0+Y3VycmVudF9maCk7CisJCWNzdGF0ZS0+Y3VycmVudF9maC5maF9oYW5kbGUuZmhfc2l6ZSA9IHJwLT5ycF9vcGVuZmhfbGVuOworCQltZW1jcHkoJmNzdGF0ZS0+Y3VycmVudF9maC5maF9oYW5kbGUuZmhfYmFzZSwgcnAtPnJwX29wZW5maCwKIAkJCQlycC0+cnBfb3BlbmZoX2xlbik7Ci0JCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgMCwgTUFZX05PUCk7CisJCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwgMCwgTUFZX05PUCk7CiAJCWlmIChzdGF0dXMpCiAJCQlkcHJpbnRrKCJuZnNkNF9vcGVuOiByZXBsYXkgZmFpbGVkIgogCQkJCSIgcmVzdG9yaW5nIHByZXZpb3VzIGZpbGVoYW5kbGVcbiIpOwogCQllbHNlCi0JCQlzdGF0dXMgPSBORlNFUlJfUkVQTEFZX01FOworCQkJc3RhdHVzID0gbmZzZXJyX3JlcGxheV9tZTsKIAl9CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7CkBAIC0yMTUsNyArMjA5LDggQEAKIAkJCSAqICgzKSBzZXQgb3Blbi0+b3BfdHJ1bmNhdGUgaWYgdGhlIGZpbGUgaXMgdG8gYmUKIAkJCSAqIHRydW5jYXRlZCBhZnRlciBvcGVuaW5nLCAoNCkgZG8gcGVybWlzc2lvbiBjaGVja2luZy4KIAkJCSAqLwotCQkJc3RhdHVzID0gZG9fb3Blbl9sb29rdXAocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4pOworCQkJc3RhdHVzID0gZG9fb3Blbl9sb29rdXAocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsCisJCQkJCQlvcGVuKTsKIAkJCWlmIChzdGF0dXMpCiAJCQkJZ290byBvdXQ7CiAJCQlicmVhazsKQEAgLTIyNyw3ICsyMjIsOCBAQAogCQkJICogb3Blbi0+b3BfdHJ1bmNhdGUgaWYgdGhlIGZpbGUgaXMgdG8gYmUgdHJ1bmNhdGVkCiAJCQkgKiBhZnRlciBvcGVuaW5nLCAoMykgZG8gcGVybWlzc2lvbiBjaGVja2luZy4KIAkJCSovCi0JCQlzdGF0dXMgPSBkb19vcGVuX2ZoYW5kbGUocnFzdHAsIGN1cnJlbnRfZmgsIG9wZW4pOworCQkJc3RhdHVzID0gZG9fb3Blbl9maGFuZGxlKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLAorCQkJCQkJIG9wZW4pOwogCQkJaWYgKHN0YXR1cykKIAkJCQlnb3RvIG91dDsKIAkJCWJyZWFrOwpAQCAtMjQ4LDExICsyNDQsMTEgQEAKIAkgKiBzdWNjZXNzZnVsLCBpdCAoMSkgdHJ1bmNhdGVzIHRoZSBmaWxlIGlmIG9wZW4tPm9wX3RydW5jYXRlIHdhcwogCSAqIHNldCwgKDIpIHNldHMgb3Blbi0+b3Bfc3RhdGVpZCwgKDMpIHNldHMgb3Blbi0+b3BfZGVsZWdhdGlvbi4KIAkgKi8KLQlzdGF0dXMgPSBuZnNkNF9wcm9jZXNzX29wZW4yKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuKTsKKwlzdGF0dXMgPSBuZnNkNF9wcm9jZXNzX29wZW4yKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLCBvcGVuKTsKIG91dDoKIAlpZiAob3Blbi0+b3Bfc3RhdGVvd25lcikgewogCQluZnM0X2dldF9zdGF0ZW93bmVyKG9wZW4tPm9wX3N0YXRlb3duZXIpOwotCQkqcmVwbGF5X293bmVyID0gb3Blbi0+b3Bfc3RhdGVvd25lcjsKKwkJY3N0YXRlLT5yZXBsYXlfb3duZXIgPSBvcGVuLT5vcF9zdGF0ZW93bmVyOwogCX0KIAluZnM0X3VubG9ja19zdGF0ZSgpOwogCXJldHVybiBzdGF0dXM7CkBAIC0yNjEsOTQgKzI1NywxMDUgQEAKIC8qCiAgKiBmaWxlaGFuZGxlLW1hbmlwdWxhdGluZyBvcHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1uZnNkNF9nZXRmaChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3Qgc3ZjX2ZoICoqZ2V0ZmgpCitzdGF0aWMgX19iZTMyCituZnNkNF9nZXRmaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgc3RydWN0IHN2Y19maCAqKmdldGZoKQogewotCWlmICghY3VycmVudF9maC0+ZmhfZGVudHJ5KQorCWlmICghY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeSkKIAkJcmV0dXJuIG5mc2Vycl9ub2ZpbGVoYW5kbGU7CiAKLQkqZ2V0ZmggPSBjdXJyZW50X2ZoOworCSpnZXRmaCA9ICZjc3RhdGUtPmN1cnJlbnRfZmg7CiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X3B1dGZoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9wdXRmaCAqcHV0ZmgpCitzdGF0aWMgX19iZTMyCituZnNkNF9wdXRmaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgc3RydWN0IG5mc2Q0X3B1dGZoICpwdXRmaCkKIHsKLQlmaF9wdXQoY3VycmVudF9maCk7Ci0JY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX3NpemUgPSBwdXRmaC0+cGZfZmhsZW47Ci0JbWVtY3B5KCZjdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfYmFzZSwgcHV0ZmgtPnBmX2ZodmFsLCBwdXRmaC0+cGZfZmhsZW4pOwotCXJldHVybiBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIDAsIE1BWV9OT1ApOworCWZoX3B1dCgmY3N0YXRlLT5jdXJyZW50X2ZoKTsKKwljc3RhdGUtPmN1cnJlbnRfZmguZmhfaGFuZGxlLmZoX3NpemUgPSBwdXRmaC0+cGZfZmhsZW47CisJbWVtY3B5KCZjc3RhdGUtPmN1cnJlbnRfZmguZmhfaGFuZGxlLmZoX2Jhc2UsIHB1dGZoLT5wZl9maHZhbCwKKwkgICAgICAgcHV0ZmgtPnBmX2ZobGVuKTsKKwlyZXR1cm4gZmhfdmVyaWZ5KHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLCAwLCBNQVlfTk9QKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X3B1dHJvb3RmaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoKQorc3RhdGljIF9fYmUzMgorbmZzZDRfcHV0cm9vdGZoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCQl2b2lkICphcmcpCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCi0JZmhfcHV0KGN1cnJlbnRfZmgpOwotCXN0YXR1cyA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLT5ycV9jbGllbnQsIGN1cnJlbnRfZmgsCisJZmhfcHV0KCZjc3RhdGUtPmN1cnJlbnRfZmgpOworCXN0YXR1cyA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLT5ycV9jbGllbnQsICZjc3RhdGUtPmN1cnJlbnRfZmgsCiAJCQkgICAgICAmcnFzdHAtPnJxX2NoYW5kbGUpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1uZnNkNF9yZXN0b3JlZmgoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IHN2Y19maCAqc2F2ZV9maCkKK3N0YXRpYyBfX2JlMzIKK25mc2Q0X3Jlc3RvcmVmaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkJdm9pZCAqYXJnKQogewotCWlmICghc2F2ZV9maC0+ZmhfZGVudHJ5KQorCWlmICghY3N0YXRlLT5zYXZlX2ZoLmZoX2RlbnRyeSkKIAkJcmV0dXJuIG5mc2Vycl9yZXN0b3JlZmg7CiAKLQlmaF9kdXAyKGN1cnJlbnRfZmgsIHNhdmVfZmgpOworCWZoX2R1cDIoJmNzdGF0ZS0+Y3VycmVudF9maCwgJmNzdGF0ZS0+c2F2ZV9maCk7CiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X3NhdmVmaChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3Qgc3ZjX2ZoICpzYXZlX2ZoKQorc3RhdGljIF9fYmUzMgorbmZzZDRfc2F2ZWZoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgdm9pZCAqYXJnKQogewotCWlmICghY3VycmVudF9maC0+ZmhfZGVudHJ5KQorCWlmICghY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeSkKIAkJcmV0dXJuIG5mc2Vycl9ub2ZpbGVoYW5kbGU7CiAKLQlmaF9kdXAyKHNhdmVfZmgsIGN1cnJlbnRfZmgpOworCWZoX2R1cDIoJmNzdGF0ZS0+c2F2ZV9maCwgJmNzdGF0ZS0+Y3VycmVudF9maCk7CiAJcmV0dXJuIG5mc19vazsKIH0KIAogLyoKICAqIG1pc2MgbmZzdjQgb3BzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1uZnNkNF9hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2FjY2VzcyAqYWNjZXNzKQorc3RhdGljIF9fYmUzMgorbmZzZDRfYWNjZXNzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgc3RydWN0IG5mc2Q0X2FjY2VzcyAqYWNjZXNzKQogewogCWlmIChhY2Nlc3MtPmFjX3JlcV9hY2Nlc3MgJiB+TkZTM19BQ0NFU1NfRlVMTCkKIAkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKIAogCWFjY2Vzcy0+YWNfcmVzcF9hY2Nlc3MgPSBhY2Nlc3MtPmFjX3JlcV9hY2Nlc3M7Ci0JcmV0dXJuIG5mc2RfYWNjZXNzKHJxc3RwLCBjdXJyZW50X2ZoLCAmYWNjZXNzLT5hY19yZXNwX2FjY2VzcywgJmFjY2Vzcy0+YWNfc3VwcG9ydGVkKTsKKwlyZXR1cm4gbmZzZF9hY2Nlc3MocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsICZhY2Nlc3MtPmFjX3Jlc3BfYWNjZXNzLAorCQkJICAgJmFjY2Vzcy0+YWNfc3VwcG9ydGVkKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X2NvbW1pdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfY29tbWl0ICpjb21taXQpCitzdGF0aWMgX19iZTMyCituZnNkNF9jb21taXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCisJICAgICBzdHJ1Y3QgbmZzZDRfY29tbWl0ICpjb21taXQpCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJdTMyICpwID0gKHUzMiAqKWNvbW1pdC0+Y29fdmVyZi5kYXRhOwogCSpwKysgPSBuZnNzdmNfYm9vdC50dl9zZWM7CiAJKnArKyA9IG5mc3N2Y19ib290LnR2X3VzZWM7CiAKLQlzdGF0dXMgPSBuZnNkX2NvbW1pdChycXN0cCwgY3VycmVudF9maCwgY29tbWl0LT5jb19vZmZzZXQsIGNvbW1pdC0+Y29fY291bnQpOworCXN0YXR1cyA9IG5mc2RfY29tbWl0KHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLCBjb21taXQtPmNvX29mZnNldCwKKwkJCSAgICAgY29tbWl0LT5jb19jb3VudCk7CiAJaWYgKHN0YXR1cyA9PSBuZnNlcnJfc3ltbGluaykKIAkJc3RhdHVzID0gbmZzZXJyX2ludmFsOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQKLW5mc2Q0X2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfY3JlYXRlICpjcmVhdGUpCitzdGF0aWMgX19iZTMyCituZnNkNF9jcmVhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCisJICAgICBzdHJ1Y3QgbmZzZDRfY3JlYXRlICpjcmVhdGUpCiB7CiAJc3RydWN0IHN2Y19maCByZXNmaDsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAJZGV2X3QgcmRldjsKIAogCWZoX2luaXQoJnJlc2ZoLCBORlM0X0ZIU0laRSk7CiAKLQlzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZESVIsIE1BWV9DUkVBVEUpOworCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwgU19JRkRJUiwgTUFZX0NSRUFURSk7CiAJaWYgKHN0YXR1cyA9PSBuZnNlcnJfc3ltbGluaykKIAkJc3RhdHVzID0gbmZzZXJyX25vdGRpcjsKIAlpZiAoc3RhdHVzKQpAQCAtMzY1LDkgKzM3MiwxMCBAQAogCQkgKi8KIAkJY3JlYXRlLT5jcl9saW5rbmFtZVtjcmVhdGUtPmNyX2xpbmtsZW5dID0gMDsKIAotCQlzdGF0dXMgPSBuZnNkX3N5bWxpbmsocnFzdHAsIGN1cnJlbnRfZmgsIGNyZWF0ZS0+Y3JfbmFtZSwKLQkJCQkgICAgICBjcmVhdGUtPmNyX25hbWVsZW4sIGNyZWF0ZS0+Y3JfbGlua25hbWUsCi0JCQkJICAgICAgY3JlYXRlLT5jcl9saW5rbGVuLCAmcmVzZmgsICZjcmVhdGUtPmNyX2lhdHRyKTsKKwkJc3RhdHVzID0gbmZzZF9zeW1saW5rKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLAorCQkJCSAgICAgIGNyZWF0ZS0+Y3JfbmFtZSwgY3JlYXRlLT5jcl9uYW1lbGVuLAorCQkJCSAgICAgIGNyZWF0ZS0+Y3JfbGlua25hbWUsIGNyZWF0ZS0+Y3JfbGlua2xlbiwKKwkJCQkgICAgICAmcmVzZmgsICZjcmVhdGUtPmNyX2lhdHRyKTsKIAkJYnJlYWs7CiAKIAljYXNlIE5GNEJMSzoKQEAgLTM3NSw5ICszODMsOSBAQAogCQlpZiAoTUFKT1IocmRldikgIT0gY3JlYXRlLT5jcl9zcGVjZGF0YTEgfHwKIAkJICAgIE1JTk9SKHJkZXYpICE9IGNyZWF0ZS0+Y3Jfc3BlY2RhdGEyKQogCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKLQkJc3RhdHVzID0gbmZzZF9jcmVhdGUocnFzdHAsIGN1cnJlbnRfZmgsIGNyZWF0ZS0+Y3JfbmFtZSwKLQkJCQkgICAgIGNyZWF0ZS0+Y3JfbmFtZWxlbiwgJmNyZWF0ZS0+Y3JfaWF0dHIsCi0JCQkJICAgICBTX0lGQkxLLCByZGV2LCAmcmVzZmgpOworCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZShycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCQkgICAgIGNyZWF0ZS0+Y3JfbmFtZSwgY3JlYXRlLT5jcl9uYW1lbGVuLAorCQkJCSAgICAgJmNyZWF0ZS0+Y3JfaWF0dHIsIFNfSUZCTEssIHJkZXYsICZyZXNmaCk7CiAJCWJyZWFrOwogCiAJY2FzZSBORjRDSFI6CkBAIC0zODUsMjggKzM5MywyOCBAQAogCQlpZiAoTUFKT1IocmRldikgIT0gY3JlYXRlLT5jcl9zcGVjZGF0YTEgfHwKIAkJICAgIE1JTk9SKHJkZXYpICE9IGNyZWF0ZS0+Y3Jfc3BlY2RhdGEyKQogCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKLQkJc3RhdHVzID0gbmZzZF9jcmVhdGUocnFzdHAsIGN1cnJlbnRfZmgsIGNyZWF0ZS0+Y3JfbmFtZSwKLQkJCQkgICAgIGNyZWF0ZS0+Y3JfbmFtZWxlbiwgJmNyZWF0ZS0+Y3JfaWF0dHIsCi0JCQkJICAgICBTX0lGQ0hSLCByZGV2LCAmcmVzZmgpOworCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZShycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCQkgICAgIGNyZWF0ZS0+Y3JfbmFtZSwgY3JlYXRlLT5jcl9uYW1lbGVuLAorCQkJCSAgICAgJmNyZWF0ZS0+Y3JfaWF0dHIsU19JRkNIUiwgcmRldiwgJnJlc2ZoKTsKIAkJYnJlYWs7CiAKIAljYXNlIE5GNFNPQ0s6Ci0JCXN0YXR1cyA9IG5mc2RfY3JlYXRlKHJxc3RwLCBjdXJyZW50X2ZoLCBjcmVhdGUtPmNyX25hbWUsCi0JCQkJICAgICBjcmVhdGUtPmNyX25hbWVsZW4sICZjcmVhdGUtPmNyX2lhdHRyLAotCQkJCSAgICAgU19JRlNPQ0ssIDAsICZyZXNmaCk7CisJCXN0YXR1cyA9IG5mc2RfY3JlYXRlKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLAorCQkJCSAgICAgY3JlYXRlLT5jcl9uYW1lLCBjcmVhdGUtPmNyX25hbWVsZW4sCisJCQkJICAgICAmY3JlYXRlLT5jcl9pYXR0ciwgU19JRlNPQ0ssIDAsICZyZXNmaCk7CiAJCWJyZWFrOwogCiAJY2FzZSBORjRGSUZPOgotCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZShycXN0cCwgY3VycmVudF9maCwgY3JlYXRlLT5jcl9uYW1lLAotCQkJCSAgICAgY3JlYXRlLT5jcl9uYW1lbGVuLCAmY3JlYXRlLT5jcl9pYXR0ciwKLQkJCQkgICAgIFNfSUZJRk8sIDAsICZyZXNmaCk7CisJCXN0YXR1cyA9IG5mc2RfY3JlYXRlKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLAorCQkJCSAgICAgY3JlYXRlLT5jcl9uYW1lLCBjcmVhdGUtPmNyX25hbWVsZW4sCisJCQkJICAgICAmY3JlYXRlLT5jcl9pYXR0ciwgU19JRklGTywgMCwgJnJlc2ZoKTsKIAkJYnJlYWs7CiAKIAljYXNlIE5GNERJUjoKIAkJY3JlYXRlLT5jcl9pYXR0ci5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOwotCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZShycXN0cCwgY3VycmVudF9maCwgY3JlYXRlLT5jcl9uYW1lLAotCQkJCSAgICAgY3JlYXRlLT5jcl9uYW1lbGVuLCAmY3JlYXRlLT5jcl9pYXR0ciwKLQkJCQkgICAgIFNfSUZESVIsIDAsICZyZXNmaCk7CisJCXN0YXR1cyA9IG5mc2RfY3JlYXRlKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLAorCQkJCSAgICAgY3JlYXRlLT5jcl9uYW1lLCBjcmVhdGUtPmNyX25hbWVsZW4sCisJCQkJICAgICAmY3JlYXRlLT5jcl9pYXR0ciwgU19JRkRJUiwgMCwgJnJlc2ZoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNDE0LDIxICs0MjIsMjIgQEAKIAl9CiAKIAlpZiAoIXN0YXR1cykgewotCQlmaF91bmxvY2soY3VycmVudF9maCk7Ci0JCXNldF9jaGFuZ2VfaW5mbygmY3JlYXRlLT5jcl9jaW5mbywgY3VycmVudF9maCk7Ci0JCWZoX2R1cDIoY3VycmVudF9maCwgJnJlc2ZoKTsKKwkJZmhfdW5sb2NrKCZjc3RhdGUtPmN1cnJlbnRfZmgpOworCQlzZXRfY2hhbmdlX2luZm8oJmNyZWF0ZS0+Y3JfY2luZm8sICZjc3RhdGUtPmN1cnJlbnRfZmgpOworCQlmaF9kdXAyKCZjc3RhdGUtPmN1cnJlbnRfZmgsICZyZXNmaCk7CiAJfQogCiAJZmhfcHV0KCZyZXNmaCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X2dldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2dldGF0dHIgKmdldGF0dHIpCitzdGF0aWMgX19iZTMyCituZnNkNF9nZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgIHN0cnVjdCBuZnNkNF9nZXRhdHRyICpnZXRhdHRyKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAotCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgMCwgTUFZX05PUCk7CisJc3RhdHVzID0gZmhfdmVyaWZ5KHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLCAwLCBNQVlfTk9QKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCkBAIC00MzgsNTIgKzQ0Nyw1OSBAQAogCWdldGF0dHItPmdhX2JtdmFsWzBdICY9IE5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQwOwogCWdldGF0dHItPmdhX2JtdmFsWzFdICY9IE5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQxOwogCi0JZ2V0YXR0ci0+Z2FfZmhwID0gY3VycmVudF9maDsKKwlnZXRhdHRyLT5nYV9maHAgPSAmY3N0YXRlLT5jdXJyZW50X2ZoOwogCXJldHVybiBuZnNfb2s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1uZnNkNF9saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsCi0JICAgc3RydWN0IHN2Y19maCAqc2F2ZV9maCwgc3RydWN0IG5mc2Q0X2xpbmsgKmxpbmspCitzdGF0aWMgX19iZTMyCituZnNkNF9saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgIHN0cnVjdCBuZnNkNF9saW5rICpsaW5rKQogewotCWludCBzdGF0dXMgPSBuZnNlcnJfbm9maWxlaGFuZGxlOworCV9fYmUzMiBzdGF0dXMgPSBuZnNlcnJfbm9maWxlaGFuZGxlOwogCi0JaWYgKCFzYXZlX2ZoLT5maF9kZW50cnkpCisJaWYgKCFjc3RhdGUtPnNhdmVfZmguZmhfZGVudHJ5KQogCQlyZXR1cm4gc3RhdHVzOwotCXN0YXR1cyA9IG5mc2RfbGluayhycXN0cCwgY3VycmVudF9maCwgbGluay0+bGlfbmFtZSwgbGluay0+bGlfbmFtZWxlbiwgc2F2ZV9maCk7CisJc3RhdHVzID0gbmZzZF9saW5rKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLAorCQkJICAgbGluay0+bGlfbmFtZSwgbGluay0+bGlfbmFtZWxlbiwgJmNzdGF0ZS0+c2F2ZV9maCk7CiAJaWYgKCFzdGF0dXMpCi0JCXNldF9jaGFuZ2VfaW5mbygmbGluay0+bGlfY2luZm8sIGN1cnJlbnRfZmgpOworCQlzZXRfY2hhbmdlX2luZm8oJmxpbmstPmxpX2NpbmZvLCAmY3N0YXRlLT5jdXJyZW50X2ZoKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50Ci1uZnNkNF9sb29rdXBwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgpCitzdGF0aWMgX19iZTMyCituZnNkNF9sb29rdXBwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3Qgc3ZjX2ZoIHRtcF9maDsKLQlpbnQgcmV0OworCV9fYmUzMiByZXQ7CiAKIAlmaF9pbml0KCZ0bXBfZmgsIE5GUzRfRkhTSVpFKTsKIAlpZigocmV0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgJnRtcF9maCwKIAkJCSAgICAgICZycXN0cC0+cnFfY2hhbmRsZSkpICE9IDApCiAJCXJldHVybiByZXQ7Ci0JaWYgKHRtcF9maC5maF9kZW50cnkgPT0gY3VycmVudF9maC0+ZmhfZGVudHJ5KSB7CisJaWYgKHRtcF9maC5maF9kZW50cnkgPT0gY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeSkgewogCQlmaF9wdXQoJnRtcF9maCk7CiAJCXJldHVybiBuZnNlcnJfbm9lbnQ7CiAJfQogCWZoX3B1dCgmdG1wX2ZoKTsKLQlyZXR1cm4gbmZzZF9sb29rdXAocnFzdHAsIGN1cnJlbnRfZmgsICIuLiIsIDIsIGN1cnJlbnRfZmgpOworCXJldHVybiBuZnNkX2xvb2t1cChycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCSAgICIuLiIsIDIsICZjc3RhdGUtPmN1cnJlbnRfZmgpOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotbmZzZDRfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9sb29rdXAgKmxvb2t1cCkKK3N0YXRpYyBfX2JlMzIKK25mc2Q0X2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgIHN0cnVjdCBuZnNkNF9sb29rdXAgKmxvb2t1cCkKIHsKLQlyZXR1cm4gbmZzZF9sb29rdXAocnFzdHAsIGN1cnJlbnRfZmgsIGxvb2t1cC0+bG9fbmFtZSwgbG9va3VwLT5sb19sZW4sIGN1cnJlbnRfZmgpOworCXJldHVybiBuZnNkX2xvb2t1cChycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCSAgIGxvb2t1cC0+bG9fbmFtZSwgbG9va3VwLT5sb19sZW4sCisJCQkgICAmY3N0YXRlLT5jdXJyZW50X2ZoKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X3JlYWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3JlYWQgKnJlYWQpCitzdGF0aWMgX19iZTMyCituZnNkNF9yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgIHN0cnVjdCBuZnNkNF9yZWFkICpyZWFkKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCS8qIG5vIG5lZWQgdG8gY2hlY2sgcGVybWlzc2lvbiAtIHRoaXMgd2lsbCBiZSBkb25lIGluIG5mc2RfcmVhZCgpICovCiAKQEAgLTQ5Myw3ICs1MDksOCBAQAogCiAJbmZzNF9sb2NrX3N0YXRlKCk7CiAJLyogY2hlY2sgc3RhdGVpZCAqLwotCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoY3VycmVudF9maCwgJnJlYWQtPnJkX3N0YXRlaWQsCisJaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc3RhdGVpZF9vcCgmY3N0YXRlLT5jdXJyZW50X2ZoLAorCQkJCSZyZWFkLT5yZF9zdGF0ZWlkLAogCQkJCUNIRUNLX0ZIIHwgUkRfU1RBVEUsICZyZWFkLT5yZF9maWxwKSkpIHsKIAkJZHByaW50aygiTkZTRDogbmZzZDRfcmVhZDogY291bGRuJ3QgcHJvY2VzcyBzdGF0ZWlkIVxuIik7CiAJCWdvdG8gb3V0OwpAQCAtNTA0LDEyICs1MjEsMTMgQEAKIG91dDoKIAluZnM0X3VubG9ja19zdGF0ZSgpOwogCXJlYWQtPnJkX3Jxc3RwID0gcnFzdHA7Ci0JcmVhZC0+cmRfZmhwID0gY3VycmVudF9maDsKKwlyZWFkLT5yZF9maHAgPSAmY3N0YXRlLT5jdXJyZW50X2ZoOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1uZnNkNF9yZWFkZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9yZWFkZGlyICpyZWFkZGlyKQorc3RhdGljIF9fYmUzMgorbmZzZDRfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgICBzdHJ1Y3QgbmZzZDRfcmVhZGRpciAqcmVhZGRpcikKIHsKIAl1NjQgY29va2llID0gcmVhZGRpci0+cmRfY29va2llOwogCXN0YXRpYyBjb25zdCBuZnM0X3ZlcmlmaWVyIHplcm92ZXJmOwpAQCAtNTI3LDQ4ICs1NDUsNTEgQEAKIAkJcmV0dXJuIG5mc2Vycl9iYWRfY29va2llOwogCiAJcmVhZGRpci0+cmRfcnFzdHAgPSBycXN0cDsKLQlyZWFkZGlyLT5yZF9maHAgPSBjdXJyZW50X2ZoOworCXJlYWRkaXItPnJkX2ZocCA9ICZjc3RhdGUtPmN1cnJlbnRfZmg7CiAJcmV0dXJuIG5mc19vazsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X3JlYWRsaW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9yZWFkbGluayAqcmVhZGxpbmspCitzdGF0aWMgX19iZTMyCituZnNkNF9yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgICAgc3RydWN0IG5mc2Q0X3JlYWRsaW5rICpyZWFkbGluaykKIHsKIAlyZWFkbGluay0+cmxfcnFzdHAgPSBycXN0cDsKLQlyZWFkbGluay0+cmxfZmhwID0gY3VycmVudF9maDsKKwlyZWFkbGluay0+cmxfZmhwID0gJmNzdGF0ZS0+Y3VycmVudF9maDsKIAlyZXR1cm4gbmZzX29rOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotbmZzZDRfcmVtb3ZlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9yZW1vdmUgKnJlbW92ZSkKK3N0YXRpYyBfX2JlMzIKK25mc2Q0X3JlbW92ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgIHN0cnVjdCBuZnNkNF9yZW1vdmUgKnJlbW92ZSkKIHsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlpZiAobmZzNF9pbl9ncmFjZSgpKQogCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwotCXN0YXR1cyA9IG5mc2RfdW5saW5rKHJxc3RwLCBjdXJyZW50X2ZoLCAwLCByZW1vdmUtPnJtX25hbWUsIHJlbW92ZS0+cm1fbmFtZWxlbik7CisJc3RhdHVzID0gbmZzZF91bmxpbmsocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsIDAsCisJCQkgICAgIHJlbW92ZS0+cm1fbmFtZSwgcmVtb3ZlLT5ybV9uYW1lbGVuKTsKIAlpZiAoc3RhdHVzID09IG5mc2Vycl9zeW1saW5rKQogCQlyZXR1cm4gbmZzZXJyX25vdGRpcjsKIAlpZiAoIXN0YXR1cykgewotCQlmaF91bmxvY2soY3VycmVudF9maCk7Ci0JCXNldF9jaGFuZ2VfaW5mbygmcmVtb3ZlLT5ybV9jaW5mbywgY3VycmVudF9maCk7CisJCWZoX3VubG9jaygmY3N0YXRlLT5jdXJyZW50X2ZoKTsKKwkJc2V0X2NoYW5nZV9pbmZvKCZyZW1vdmUtPnJtX2NpbmZvLCAmY3N0YXRlLT5jdXJyZW50X2ZoKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X3JlbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLAotCSAgICAgc3RydWN0IHN2Y19maCAqc2F2ZV9maCwgc3RydWN0IG5mc2Q0X3JlbmFtZSAqcmVuYW1lKQorc3RhdGljIF9fYmUzMgorbmZzZDRfcmVuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgc3RydWN0IG5mc2Q0X3JlbmFtZSAqcmVuYW1lKQogewotCWludCBzdGF0dXMgPSBuZnNlcnJfbm9maWxlaGFuZGxlOworCV9fYmUzMiBzdGF0dXMgPSBuZnNlcnJfbm9maWxlaGFuZGxlOwogCi0JaWYgKCFzYXZlX2ZoLT5maF9kZW50cnkpCisJaWYgKCFjc3RhdGUtPnNhdmVfZmguZmhfZGVudHJ5KQogCQlyZXR1cm4gc3RhdHVzOwotCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgIShzYXZlX2ZoLT5maF9leHBvcnQtPmV4X2ZsYWdzCisJaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiAhKGNzdGF0ZS0+c2F2ZV9maC5maF9leHBvcnQtPmV4X2ZsYWdzCiAJCQkJCSYgTkZTRVhQX05PU1VCVFJFRUNIRUNLKSkKIAkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKLQlzdGF0dXMgPSBuZnNkX3JlbmFtZShycXN0cCwgc2F2ZV9maCwgcmVuYW1lLT5ybl9zbmFtZSwKLQkJCSAgICAgcmVuYW1lLT5ybl9zbmFtZWxlbiwgY3VycmVudF9maCwKKwlzdGF0dXMgPSBuZnNkX3JlbmFtZShycXN0cCwgJmNzdGF0ZS0+c2F2ZV9maCwgcmVuYW1lLT5ybl9zbmFtZSwKKwkJCSAgICAgcmVuYW1lLT5ybl9zbmFtZWxlbiwgJmNzdGF0ZS0+Y3VycmVudF9maCwKIAkJCSAgICAgcmVuYW1lLT5ybl90bmFtZSwgcmVuYW1lLT5ybl90bmFtZWxlbik7CiAKIAkvKiB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIHJldHVybnMgZGlmZmVyZW50IGVycm9yJ3MgdGhhbiByZXF1aXJlZApAQCAtNTc2LDI3ICs1OTcsMjggQEAKIAlpZiAoc3RhdHVzID09IG5mc2Vycl9pc2RpcikKIAkJc3RhdHVzID0gbmZzZXJyX2V4aXN0OwogCWVsc2UgaWYgKChzdGF0dXMgPT0gbmZzZXJyX25vdGRpcikgJiYKLSAgICAgICAgICAgICAgICAgIChTX0lTRElSKHNhdmVfZmgtPmZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJgotICAgICAgICAgICAgICAgICAgIFNfSVNESVIoY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSkKKyAgICAgICAgICAgICAgICAgIChTX0lTRElSKGNzdGF0ZS0+c2F2ZV9maC5maF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgJiYKKyAgICAgICAgICAgICAgICAgICBTX0lTRElSKGNzdGF0ZS0+Y3VycmVudF9maC5maF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpKQogCQlzdGF0dXMgPSBuZnNlcnJfZXhpc3Q7CiAJZWxzZSBpZiAoc3RhdHVzID09IG5mc2Vycl9zeW1saW5rKQogCQlzdGF0dXMgPSBuZnNlcnJfbm90ZGlyOwogCiAJaWYgKCFzdGF0dXMpIHsKLQkJc2V0X2NoYW5nZV9pbmZvKCZyZW5hbWUtPnJuX3NpbmZvLCBjdXJyZW50X2ZoKTsKLQkJc2V0X2NoYW5nZV9pbmZvKCZyZW5hbWUtPnJuX3RpbmZvLCBzYXZlX2ZoKTsKKwkJc2V0X2NoYW5nZV9pbmZvKCZyZW5hbWUtPnJuX3NpbmZvLCAmY3N0YXRlLT5jdXJyZW50X2ZoKTsKKwkJc2V0X2NoYW5nZV9pbmZvKCZyZW5hbWUtPnJuX3RpbmZvLCAmY3N0YXRlLT5zYXZlX2ZoKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc2Q0X3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3NldGF0dHIgKnNldGF0dHIpCitzdGF0aWMgX19iZTMyCituZnNkNF9zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQogewotCWludCBzdGF0dXMgPSBuZnNfb2s7CisJX19iZTMyIHN0YXR1cyA9IG5mc19vazsKIAogCWlmIChzZXRhdHRyLT5zYV9pYXR0ci5pYV92YWxpZCAmIEFUVFJfU0laRSkgewogCQluZnM0X2xvY2tfc3RhdGUoKTsKLQkJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoY3VycmVudF9maCwKKwkJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoJmNzdGF0ZS0+Y3VycmVudF9maCwKIAkJCSZzZXRhdHRyLT5zYV9zdGF0ZWlkLCBDSEVDS19GSCB8IFdSX1NUQVRFLCBOVUxMKTsKIAkJbmZzNF91bmxvY2tfc3RhdGUoKTsKIAkJaWYgKHN0YXR1cykgewpAQCAtNjA2LDIxICs2MjgsMjMgQEAKIAl9CiAJc3RhdHVzID0gbmZzX29rOwogCWlmIChzZXRhdHRyLT5zYV9hY2wgIT0gTlVMTCkKLQkJc3RhdHVzID0gbmZzZDRfc2V0X25mczRfYWNsKHJxc3RwLCBjdXJyZW50X2ZoLCBzZXRhdHRyLT5zYV9hY2wpOworCQlzdGF0dXMgPSBuZnNkNF9zZXRfbmZzNF9hY2wocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsCisJCQkJCSAgICBzZXRhdHRyLT5zYV9hY2wpOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7Ci0Jc3RhdHVzID0gbmZzZF9zZXRhdHRyKHJxc3RwLCBjdXJyZW50X2ZoLCAmc2V0YXR0ci0+c2FfaWF0dHIsCisJc3RhdHVzID0gbmZzZF9zZXRhdHRyKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLCAmc2V0YXR0ci0+c2FfaWF0dHIsCiAJCQkJMCwgKHRpbWVfdCkwKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotbmZzZDRfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3dyaXRlICp3cml0ZSkKK3N0YXRpYyBfX2JlMzIKK25mc2Q0X3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICBzdHJ1Y3QgbmZzZDRfd3JpdGUgKndyaXRlKQogewogCXN0YXRlaWRfdCAqc3RhdGVpZCA9ICZ3cml0ZS0+d3Jfc3RhdGVpZDsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IE5VTEw7CiAJdTMyICpwOwotCWludCBzdGF0dXMgPSBuZnNfb2s7CisJX19iZTMyIHN0YXR1cyA9IG5mc19vazsKIAogCS8qIG5vIG5lZWQgdG8gY2hlY2sgcGVybWlzc2lvbiAtIHRoaXMgd2lsbCBiZSBkb25lIGluIG5mc2Rfd3JpdGUoKSAqLwogCkBAIC02MjgsNyArNjUyLDcgQEAKIAkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKIAogCW5mczRfbG9ja19zdGF0ZSgpOwotCXN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKGN1cnJlbnRfZmgsIHN0YXRlaWQsCisJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoJmNzdGF0ZS0+Y3VycmVudF9maCwgc3RhdGVpZCwKIAkJCQkJQ0hFQ0tfRkggfCBXUl9TVEFURSwgJmZpbHApOwogCWlmIChmaWxwKQogCQlnZXRfZmlsZShmaWxwKTsKQEAgLTY0NSw5ICs2NjksOSBAQAogCSpwKysgPSBuZnNzdmNfYm9vdC50dl9zZWM7CiAJKnArKyA9IG5mc3N2Y19ib290LnR2X3VzZWM7CiAKLQlzdGF0dXMgPSAgbmZzZF93cml0ZShycXN0cCwgY3VycmVudF9maCwgZmlscCwgd3JpdGUtPndyX29mZnNldCwKLQkJCXJxc3RwLT5ycV92ZWMsIHdyaXRlLT53cl92bGVuLCB3cml0ZS0+d3JfYnVmbGVuLAotCQkJJndyaXRlLT53cl9ob3dfd3JpdHRlbik7CisJc3RhdHVzID0gIG5mc2Rfd3JpdGUocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsIGZpbHAsCisJCQkgICAgIHdyaXRlLT53cl9vZmZzZXQsIHJxc3RwLT5ycV92ZWMsIHdyaXRlLT53cl92bGVuLAorCQkJICAgICB3cml0ZS0+d3JfYnVmbGVuLCAmd3JpdGUtPndyX2hvd193cml0dGVuKTsKIAlpZiAoZmlscCkKIAkJZnB1dChmaWxwKTsKIApAQCAtNjYxLDE0ICs2ODUsMTUgQEAKICAqIGF0dHJpYnV0ZXMgbWF0Y2hlZC4gIFZFUklGWSBpcyBpbXBsZW1lbnRlZCBieSBtYXBwaW5nIE5GU0VSUl9TQU1FCiAgKiB0byBORlNfT0sgYWZ0ZXIgdGhlIGNhbGw7IE5WRVJJRlkgYnkgbWFwcGluZyBORlNFUlJfTk9UX1NBTUUgdG8gTkZTX09LLgogICovCi1zdGF0aWMgaW50Ci1uZnNkNF92ZXJpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3ZlcmlmeSAqdmVyaWZ5KQorc3RhdGljIF9fYmUzMgorX25mc2Q0X3ZlcmlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgIHN0cnVjdCBuZnNkNF92ZXJpZnkgKnZlcmlmeSkKIHsKLQl1MzIgKmJ1ZiwgKnA7CisJX19iZTMyICpidWYsICpwOwogCWludCBjb3VudDsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKLQlzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIDAsIE1BWV9OT1ApOworCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwgMCwgTUFZX05PUCk7CiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIApAQCAtNjg5LDggKzcxNCw5IEBACiAJaWYgKCFidWYpCiAJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CiAKLQlzdGF0dXMgPSBuZnNkNF9lbmNvZGVfZmF0dHIoY3VycmVudF9maCwgY3VycmVudF9maC0+ZmhfZXhwb3J0LAotCQkJCSAgICBjdXJyZW50X2ZoLT5maF9kZW50cnksIGJ1ZiwKKwlzdGF0dXMgPSBuZnNkNF9lbmNvZGVfZmF0dHIoJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCQkgICAgY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2V4cG9ydCwKKwkJCQkgICAgY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeSwgYnVmLAogCQkJCSAgICAmY291bnQsIHZlcmlmeS0+dmVfYm12YWwsCiAJCQkJICAgIHJxc3RwKTsKIApAQCAtNzEyLDEwICs3MzgsMzAgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgX19iZTMyCituZnNkNF9udmVyaWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgIHN0cnVjdCBuZnNkNF92ZXJpZnkgKnZlcmlmeSkKK3sKKwlfX2JlMzIgc3RhdHVzOworCisJc3RhdHVzID0gX25mc2Q0X3ZlcmlmeShycXN0cCwgY3N0YXRlLCB2ZXJpZnkpOworCXJldHVybiBzdGF0dXMgPT0gbmZzZXJyX25vdF9zYW1lID8gbmZzX29rIDogc3RhdHVzOworfQorCitzdGF0aWMgX19iZTMyCituZnNkNF92ZXJpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCisJICAgICBzdHJ1Y3QgbmZzZDRfdmVyaWZ5ICp2ZXJpZnkpCit7CisJX19iZTMyIHN0YXR1czsKKworCXN0YXR1cyA9IF9uZnNkNF92ZXJpZnkocnFzdHAsIGNzdGF0ZSwgdmVyaWZ5KTsKKwlyZXR1cm4gc3RhdHVzID09IG5mc2Vycl9zYW1lID8gbmZzX29rIDogc3RhdHVzOworfQorCiAvKgogICogTlVMTCBjYWxsLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9wcm9jX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKIHsKIAlyZXR1cm4gbmZzX29rOwpAQCAtNzI3LDMxICs3NzMsNjEgQEAKIAkJbmZzZHN0YXRzLm5mczRfb3Bjb3VudFtvcG51bV0rKzsKIH0KIAorc3RhdGljIHZvaWQgY3N0YXRlX2ZyZWUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUpCit7CisJaWYgKGNzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm47CisJZmhfcHV0KCZjc3RhdGUtPmN1cnJlbnRfZmgpOworCWZoX3B1dCgmY3N0YXRlLT5zYXZlX2ZoKTsKKwlCVUdfT04oY3N0YXRlLT5yZXBsYXlfb3duZXIpOworCWtmcmVlKGNzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlOworCisJY3N0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlmaF9pbml0KCZjc3RhdGUtPmN1cnJlbnRfZmgsIE5GUzRfRkhTSVpFKTsKKwlmaF9pbml0KCZjc3RhdGUtPnNhdmVfZmgsIE5GUzRfRkhTSVpFKTsKKwljc3RhdGUtPnJlcGxheV9vd25lciA9IE5VTEw7CisJcmV0dXJuIGNzdGF0ZTsKK30KKwordHlwZWRlZiBfX2JlMzIoKm5mc2Q0b3BfZnVuYykoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqLAorCQkJICAgICAgdm9pZCAqKTsKKworc3RydWN0IG5mc2Q0X29wZXJhdGlvbiB7CisJbmZzZDRvcF9mdW5jIG9wX2Z1bmM7CisJdTMyIG9wX2ZsYWdzOworLyogTW9zdCBvcHMgcmVxdWlyZSBhIHZhbGlkIGN1cnJlbnQgZmlsZWhhbmRsZTsgYSBmZXcgZG9uJ3Q6ICovCisjZGVmaW5lIEFMTE9XRURfV0lUSE9VVF9GSCAxCisvKiBHRVRBVFRSIGFuZCBvcHMgbm90IGxpc3RlZCBhcyByZXR1cm5pbmcgTkZTNEVSUl9NT1ZFRDogKi8KKyNkZWZpbmUgQUxMT1dFRF9PTl9BQlNFTlRfRlMgMgorfTsKKworc3RhdGljIHN0cnVjdCBuZnNkNF9vcGVyYXRpb24gbmZzZDRfb3BzW107CiAKIC8qCiAgKiBDT01QT1VORCBjYWxsLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9wcm9jX2NvbXBvdW5kKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCSAgICBzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdzLAogCQkgICAgc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwKQogewogCXN0cnVjdCBuZnNkNF9vcAkqb3A7Ci0Jc3RydWN0IHN2Y19maAkqY3VycmVudF9maCA9IE5VTEw7Ci0Jc3RydWN0IHN2Y19maAkqc2F2ZV9maCA9IE5VTEw7Ci0Jc3RydWN0IG5mczRfc3RhdGVvd25lciAqcmVwbGF5X293bmVyID0gTlVMTDsKLQlpbnQJCXNsYWNrX3NwYWNlOyAgICAvKiBpbiB3b3Jkcywgbm90IGJ5dGVzISAqLwotCWludAkJc3RhdHVzOworCXN0cnVjdCBuZnNkNF9vcGVyYXRpb24gKm9wZGVzYzsKKwlzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSA9IE5VTEw7CisJaW50CQlzbGFja19ieXRlczsKKwlfX2JlMzIJCXN0YXR1czsKIAogCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKLQljdXJyZW50X2ZoID0ga21hbGxvYyhzaXplb2YoKmN1cnJlbnRfZmgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY3VycmVudF9maCA9PSBOVUxMKQorCWNzdGF0ZSA9IGNzdGF0ZV9hbGxvYygpOworCWlmIChjc3RhdGUgPT0gTlVMTCkKIAkJZ290byBvdXQ7Ci0JZmhfaW5pdChjdXJyZW50X2ZoLCBORlM0X0ZIU0laRSk7Ci0Jc2F2ZV9maCA9IGttYWxsb2Moc2l6ZW9mKCpzYXZlX2ZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNhdmVfZmggPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0JZmhfaW5pdChzYXZlX2ZoLCBORlM0X0ZIU0laRSk7CiAKIAlyZXNwLT54YnVmID0gJnJxc3RwLT5ycV9yZXM7CiAJcmVzcC0+cCA9IHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfYmFzZSArIHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuOwpAQCAtNzkwLDE2NCArODY2LDQ0IEBACiAJCSAqIGZhaWxlZCByZXNwb25zZSB0byB0aGUgbmV4dCBvcGVyYXRpb24uICBJZiB3ZSBkb24ndAogCQkgKiBoYXZlIGVub3VnaCByb29tLCBmYWlsIHdpdGggRVJSX1JFU09VUkNFLgogCQkgKi8KLS8qIEZJWE1FIC0gaXMgc2xhY2tfc3BhY2UgKnJlYWxseSogd29yZHMsIG9yIGJ5dGVzPz8/IC0gbmVpbGIgKi8KLQkJc2xhY2tfc3BhY2UgPSAoY2hhciAqKXJlc3AtPmVuZCAtIChjaGFyICopcmVzcC0+cDsKLQkJaWYgKHNsYWNrX3NwYWNlIDwgQ09NUE9VTkRfU0xBQ0tfU1BBQ0UgKyBDT01QT1VORF9FUlJfU0xBQ0tfU1BBQ0UpIHsKLQkJCUJVR19PTihzbGFja19zcGFjZSA8IENPTVBPVU5EX0VSUl9TTEFDS19TUEFDRSk7CisJCXNsYWNrX2J5dGVzID0gKGNoYXIgKilyZXNwLT5lbmQgLSAoY2hhciAqKXJlc3AtPnA7CisJCWlmIChzbGFja19ieXRlcyA8IENPTVBPVU5EX1NMQUNLX1NQQUNFCisJCQkJKyBDT01QT1VORF9FUlJfU0xBQ0tfU1BBQ0UpIHsKKwkJCUJVR19PTihzbGFja19ieXRlcyA8IENPTVBPVU5EX0VSUl9TTEFDS19TUEFDRSk7CiAJCQlvcC0+c3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOwogCQkJZ290byBlbmNvZGVfb3A7CiAJCX0KIAotCQkvKiBBbGwgb3BlcmF0aW9ucyBleGNlcHQgUkVORVcsIFNFVENMSUVOVElELCBSRVNUT1JFRkgKLQkJKiBTRVRDTElFTlRJRF9DT05GSVJNLCBQVVRGSCBhbmQgUFVUUk9PVEZICi0JCSogcmVxdWlyZSBhIHZhbGlkIGN1cnJlbnQgZmlsZWhhbmRsZQotCQkqLwotCQlpZiAoIWN1cnJlbnRfZmgtPmZoX2RlbnRyeSkgewotCQkJaWYgKCEoKG9wLT5vcG51bSA9PSBPUF9QVVRGSCkgfHwKLQkJCSAgICAgIChvcC0+b3BudW0gPT0gT1BfUFVUUk9PVEZIKSB8fAotCQkJICAgICAgKG9wLT5vcG51bSA9PSBPUF9TRVRDTElFTlRJRCkgfHwKLQkJCSAgICAgIChvcC0+b3BudW0gPT0gT1BfU0VUQ0xJRU5USURfQ09ORklSTSkgfHwKLQkJCSAgICAgIChvcC0+b3BudW0gPT0gT1BfUkVORVcpIHx8Ci0JCQkgICAgICAob3AtPm9wbnVtID09IE9QX1JFU1RPUkVGSCkgfHwKLQkJCSAgICAgIChvcC0+b3BudW0gPT0gT1BfUkVMRUFTRV9MT0NLT1dORVIpKSkgeworCQlvcGRlc2MgPSAmbmZzZDRfb3BzW29wLT5vcG51bV07CisKKwkJaWYgKCFjc3RhdGUtPmN1cnJlbnRfZmguZmhfZGVudHJ5KSB7CisJCQlpZiAoIShvcGRlc2MtPm9wX2ZsYWdzICYgQUxMT1dFRF9XSVRIT1VUX0ZIKSkgewogCQkJCW9wLT5zdGF0dXMgPSBuZnNlcnJfbm9maWxlaGFuZGxlOwogCQkJCWdvdG8gZW5jb2RlX29wOwogCQkJfQotCQl9Ci0JCS8qIENoZWNrIG11c3QgYmUgZG9uZSBhdCBzdGFydCBvZiBlYWNoIG9wZXJhdGlvbiwgZXhjZXB0Ci0JCSAqIGZvciBHRVRBVFRSIGFuZCBvcHMgbm90IGxpc3RlZCBhcyByZXR1cm5pbmcgTkZTNEVSUl9NT1ZFRAotCQkgKi8KLQkJZWxzZSBpZiAoY3VycmVudF9maC0+ZmhfZXhwb3J0LT5leF9mc2xvY3MubWlncmF0ZWQgJiYKLQkJCSAhKChvcC0+b3BudW0gPT0gT1BfR0VUQVRUUikgfHwKLQkJCSAgIChvcC0+b3BudW0gPT0gT1BfUFVUUk9PVEZIKSB8fAotCQkJICAgKG9wLT5vcG51bSA9PSBPUF9QVVRQVUJGSCkgfHwKLQkJCSAgIChvcC0+b3BudW0gPT0gT1BfUkVORVcpIHx8Ci0JCQkgICAob3AtPm9wbnVtID09IE9QX1NFVENMSUVOVElEKSB8fAotCQkJICAgKG9wLT5vcG51bSA9PSBPUF9SRUxFQVNFX0xPQ0tPV05FUikpKSB7CisJCX0gZWxzZSBpZiAoY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2V4cG9ydC0+ZXhfZnNsb2NzLm1pZ3JhdGVkICYmCisJCQkgICEob3BkZXNjLT5vcF9mbGFncyAmIEFMTE9XRURfT05fQUJTRU5UX0ZTKSkgewogCQkJb3AtPnN0YXR1cyA9IG5mc2Vycl9tb3ZlZDsKIAkJCWdvdG8gZW5jb2RlX29wOwogCQl9Ci0JCXN3aXRjaCAob3AtPm9wbnVtKSB7Ci0JCWNhc2UgT1BfQUNDRVNTOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2FjY2VzcyhycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmFjY2Vzcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9DTE9TRToKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9jbG9zZShycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmNsb3NlLCAmcmVwbGF5X293bmVyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0NPTU1JVDoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9jb21taXQocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5jb21taXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfQ1JFQVRFOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2NyZWF0ZShycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmNyZWF0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9ERUxFR1JFVFVSTjoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWxlZ3JldHVybihycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmRlbGVncmV0dXJuKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0dFVEFUVFI6Ci0JCQlvcC0+c3RhdHVzID0gbmZzZDRfZ2V0YXR0cihycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmdldGF0dHIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfR0VURkg6Ci0JCQlvcC0+c3RhdHVzID0gbmZzZDRfZ2V0ZmgoY3VycmVudF9maCwgJm9wLT51LmdldGZoKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0xJTks6Ci0JCQlvcC0+c3RhdHVzID0gbmZzZDRfbGluayhycXN0cCwgY3VycmVudF9maCwgc2F2ZV9maCwgJm9wLT51LmxpbmspOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfTE9DSzoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9sb2NrKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUubG9jaywgJnJlcGxheV9vd25lcik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9MT0NLVDoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9sb2NrdChycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmxvY2t0KTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX0xPQ0tVOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2xvY2t1KHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUubG9ja3UsICZyZXBsYXlfb3duZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfTE9PS1VQOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2xvb2t1cChycXN0cCwgY3VycmVudF9maCwgJm9wLT51Lmxvb2t1cCk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9MT09LVVBQOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2xvb2t1cHAocnFzdHAsIGN1cnJlbnRfZmgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfTlZFUklGWToKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5udmVyaWZ5KTsKLQkJCWlmIChvcC0+c3RhdHVzID09IG5mc2Vycl9ub3Rfc2FtZSkKLQkJCQlvcC0+c3RhdHVzID0gbmZzX29rOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfT1BFTjoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9vcGVuKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUub3BlbiwgJnJlcGxheV9vd25lcik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9PUEVOX0NPTkZJUk06Ci0JCQlvcC0+c3RhdHVzID0gbmZzZDRfb3Blbl9jb25maXJtKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUub3Blbl9jb25maXJtLCAmcmVwbGF5X293bmVyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX09QRU5fRE9XTkdSQURFOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X29wZW5fZG93bmdyYWRlKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUub3Blbl9kb3duZ3JhZGUsICZyZXBsYXlfb3duZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUFVURkg6Ci0JCQlvcC0+c3RhdHVzID0gbmZzZDRfcHV0ZmgocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5wdXRmaCk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9QVVRST09URkg6Ci0JCQlvcC0+c3RhdHVzID0gbmZzZDRfcHV0cm9vdGZoKHJxc3RwLCBjdXJyZW50X2ZoKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1JFQUQ6Ci0JCQlvcC0+c3RhdHVzID0gbmZzZDRfcmVhZChycXN0cCwgY3VycmVudF9maCwgJm9wLT51LnJlYWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUkVBRERJUjoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9yZWFkZGlyKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUucmVhZGRpcik7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9SRUFETElOSzoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9yZWFkbGluayhycXN0cCwgY3VycmVudF9maCwgJm9wLT51LnJlYWRsaW5rKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1JFTU9WRToKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9yZW1vdmUocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5yZW1vdmUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUkVOQU1FOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3JlbmFtZShycXN0cCwgY3VycmVudF9maCwgc2F2ZV9maCwgJm9wLT51LnJlbmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9SRU5FVzoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9yZW5ldygmb3AtPnUucmVuZXcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfUkVTVE9SRUZIOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3Jlc3RvcmVmaChjdXJyZW50X2ZoLCBzYXZlX2ZoKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1NBVkVGSDoKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9zYXZlZmgoY3VycmVudF9maCwgc2F2ZV9maCk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9TRVRBVFRSOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3NldGF0dHIocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5zZXRhdHRyKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1NFVENMSUVOVElEOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3NldGNsaWVudGlkKHJxc3RwLCAmb3AtPnUuc2V0Y2xpZW50aWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT1BfU0VUQ0xJRU5USURfQ09ORklSTToKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtKHJxc3RwLCAmb3AtPnUuc2V0Y2xpZW50aWRfY29uZmlybSk7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9WRVJJRlk6Ci0JCQlvcC0+c3RhdHVzID0gbmZzZDRfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUudmVyaWZ5KTsKLQkJCWlmIChvcC0+c3RhdHVzID09IG5mc2Vycl9zYW1lKQotCQkJCW9wLT5zdGF0dXMgPSBuZnNfb2s7Ci0JCQlicmVhazsKLQkJY2FzZSBPUF9XUklURToKLQkJCW9wLT5zdGF0dXMgPSBuZnNkNF93cml0ZShycXN0cCwgY3VycmVudF9maCwgJm9wLT51LndyaXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIE9QX1JFTEVBU0VfTE9DS09XTkVSOgotCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3JlbGVhc2VfbG9ja293bmVyKHJxc3RwLCAmb3AtPnUucmVsZWFzZV9sb2Nrb3duZXIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CisKKwkJaWYgKG9wZGVzYy0+b3BfZnVuYykKKwkJCW9wLT5zdGF0dXMgPSBvcGRlc2MtPm9wX2Z1bmMocnFzdHAsIGNzdGF0ZSwgJm9wLT51KTsKKwkJZWxzZQogCQkJQlVHX09OKG9wLT5zdGF0dXMgPT0gbmZzX29rKTsKLQkJCWJyZWFrOwotCQl9CiAKIGVuY29kZV9vcDoKLQkJaWYgKG9wLT5zdGF0dXMgPT0gTkZTRVJSX1JFUExBWV9NRSkgewotCQkJb3AtPnJlcGxheSA9ICZyZXBsYXlfb3duZXItPnNvX3JlcGxheTsKKwkJaWYgKG9wLT5zdGF0dXMgPT0gbmZzZXJyX3JlcGxheV9tZSkgeworCQkJb3AtPnJlcGxheSA9ICZjc3RhdGUtPnJlcGxheV9vd25lci0+c29fcmVwbGF5OwogCQkJbmZzZDRfZW5jb2RlX3JlcGxheShyZXNwLCBvcCk7CiAJCQlzdGF0dXMgPSBvcC0+c3RhdHVzID0gb3AtPnJlcGxheS0+cnBfc3RhdHVzOwogCQl9IGVsc2UgewogCQkJbmZzZDRfZW5jb2RlX29wZXJhdGlvbihyZXNwLCBvcCk7CiAJCQlzdGF0dXMgPSBvcC0+c3RhdHVzOwogCQl9Ci0JCWlmIChyZXBsYXlfb3duZXIgJiYgKHJlcGxheV9vd25lciAhPSAodm9pZCAqKSgtMSkpKSB7Ci0JCQluZnM0X3B1dF9zdGF0ZW93bmVyKHJlcGxheV9vd25lcik7Ci0JCQlyZXBsYXlfb3duZXIgPSBOVUxMOworCQlpZiAoY3N0YXRlLT5yZXBsYXlfb3duZXIpIHsKKwkJCW5mczRfcHV0X3N0YXRlb3duZXIoY3N0YXRlLT5yZXBsYXlfb3duZXIpOworCQkJY3N0YXRlLT5yZXBsYXlfb3duZXIgPSBOVUxMOwogCQl9CiAJCS8qIFhYWCBVZ2gsIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0aGlzIGtpbmQgb2Ygc3BlY2lhbCBjYXNlOiAqLwogCQlpZiAob3AtPm9wbnVtID09IE9QX1JFQUQgJiYgb3AtPnUucmVhZC5yZF9maWxwKQpAQCAtOTU4LDE1ICs5MTQsMTI0IEBACiAKIG91dDoKIAluZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyhhcmdzKTsKLQlpZiAoY3VycmVudF9maCkKLQkJZmhfcHV0KGN1cnJlbnRfZmgpOwotCWtmcmVlKGN1cnJlbnRfZmgpOwotCWlmIChzYXZlX2ZoKQotCQlmaF9wdXQoc2F2ZV9maCk7Ci0Ja2ZyZWUoc2F2ZV9maCk7CisJY3N0YXRlX2ZyZWUoY3N0YXRlKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgc3RydWN0IG5mc2Q0X29wZXJhdGlvbiBuZnNkNF9vcHNbT1BfUkVMRUFTRV9MT0NLT1dORVIrMV0gPSB7CisJW09QX0FDQ0VTU10gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9hY2Nlc3MsCisJfSwKKwlbT1BfQ0xPU0VdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfY2xvc2UsCisJfSwKKwlbT1BfQ09NTUlUXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X2NvbW1pdCwKKwl9LAorCVtPUF9DUkVBVEVdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfY3JlYXRlLAorCX0sCisJW09QX0RFTEVHUkVUVVJOXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X2RlbGVncmV0dXJuLAorCX0sCisJW09QX0dFVEFUVFJdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfZ2V0YXR0ciwKKwkJLm9wX2ZsYWdzID0gQUxMT1dFRF9PTl9BQlNFTlRfRlMsCisJfSwKKwlbT1BfR0VURkhdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfZ2V0ZmgsCisJfSwKKwlbT1BfTElOS10gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9saW5rLAorCX0sCisJW09QX0xPQ0tdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfbG9jaywKKwl9LAorCVtPUF9MT0NLVF0gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9sb2NrdCwKKwl9LAorCVtPUF9MT0NLVV0gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9sb2NrdSwKKwl9LAorCVtPUF9MT09LVVBdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfbG9va3VwLAorCX0sCisJW09QX0xPT0tVUFBdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfbG9va3VwcCwKKwl9LAorCVtPUF9OVkVSSUZZXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X252ZXJpZnksCisJfSwKKwlbT1BfT1BFTl0gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9vcGVuLAorCX0sCisJW09QX09QRU5fQ09ORklSTV0gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9vcGVuX2NvbmZpcm0sCisJfSwKKwlbT1BfT1BFTl9ET1dOR1JBREVdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfb3Blbl9kb3duZ3JhZGUsCisJfSwKKwlbT1BfUFVURkhdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcHV0ZmgsCisJCS5vcF9mbGFncyA9IEFMTE9XRURfV0lUSE9VVF9GSCB8IEFMTE9XRURfT05fQUJTRU5UX0ZTLAorCX0sCisJW09QX1BVVFBVQkZIXSA9IHsKKwkJLyogdW5zdXBwb3J0ZWQ7IGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2U6ICovCisJCS5vcF9mbGFncyA9IEFMTE9XRURfV0lUSE9VVF9GSCB8IEFMTE9XRURfT05fQUJTRU5UX0ZTLAorCX0sCisJW09QX1BVVFJPT1RGSF0gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9wdXRyb290ZmgsCisJCS5vcF9mbGFncyA9IEFMTE9XRURfV0lUSE9VVF9GSCB8IEFMTE9XRURfT05fQUJTRU5UX0ZTLAorCX0sCisJW09QX1JFQURdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcmVhZCwKKwl9LAorCVtPUF9SRUFERElSXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3JlYWRkaXIsCisJfSwKKwlbT1BfUkVBRExJTktdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcmVhZGxpbmssCisJfSwKKwlbT1BfUkVNT1ZFXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3JlbW92ZSwKKwl9LAorCVtPUF9SRU5BTUVdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcmVuYW1lLAorCX0sCisJW09QX1JFTkVXXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3JlbmV3LAorCQkub3BfZmxhZ3MgPSBBTExPV0VEX1dJVEhPVVRfRkggfCBBTExPV0VEX09OX0FCU0VOVF9GUywKKwl9LAorCVtPUF9SRVNUT1JFRkhdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfcmVzdG9yZWZoLAorCQkub3BfZmxhZ3MgPSBBTExPV0VEX1dJVEhPVVRfRkggfCBBTExPV0VEX09OX0FCU0VOVF9GUywKKwl9LAorCVtPUF9TQVZFRkhdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2F2ZWZoLAorCX0sCisJW09QX1NFVEFUVFJdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2V0YXR0ciwKKwl9LAorCVtPUF9TRVRDTElFTlRJRF0gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9zZXRjbGllbnRpZCwKKwkJLm9wX2ZsYWdzID0gQUxMT1dFRF9XSVRIT1VUX0ZIIHwgQUxMT1dFRF9PTl9BQlNFTlRfRlMsCisJfSwKKwlbT1BfU0VUQ0xJRU5USURfQ09ORklSTV0gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9zZXRjbGllbnRpZF9jb25maXJtLAorCQkub3BfZmxhZ3MgPSBBTExPV0VEX1dJVEhPVVRfRkggfCBBTExPV0VEX09OX0FCU0VOVF9GUywKKwl9LAorCVtPUF9WRVJJRlldID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfdmVyaWZ5LAorCX0sCisJW09QX1dSSVRFXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3dyaXRlLAorCX0sCisJW09QX1JFTEVBU0VfTE9DS09XTkVSXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X3JlbGVhc2VfbG9ja293bmVyLAorCQkub3BfZmxhZ3MgPSBBTExPV0VEX1dJVEhPVVRfRkggfCBBTExPV0VEX09OX0FCU0VOVF9GUywKKwl9LAorfTsKKwogI2RlZmluZSBuZnM0c3ZjX2RlY29kZV92b2lkYXJncwkJTlVMTAogI2RlZmluZSBuZnM0c3ZjX3JlbGVhc2Vfdm9pZAkJTlVMTAogI2RlZmluZSBuZnNkNF92b2lkcmVzCQkJbmZzZDRfdm9pZGFyZ3MKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHJlY292ZXIuYyBiL2ZzL25mc2QvbmZzNHJlY292ZXIuYwppbmRleCAxY2JkMmU0Li5jNzc3NGUzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRyZWNvdmVyLmMKKysrIGIvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCkBAIC04MywxMyArODMsMTMgQEAKIAkqb3V0ID0gJ1wwJzsKIH0KIAotaW50CitfX2JlMzIKIG5mczRfbWFrZV9yZWNfY2xpZG5hbWUoY2hhciAqZG5hbWUsIHN0cnVjdCB4ZHJfbmV0b2JqICpjbG5hbWUpCiB7CiAJc3RydWN0IHhkcl9uZXRvYmogY2tzdW07CiAJc3RydWN0IGhhc2hfZGVzYyBkZXNjOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsKLQlpbnQgc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOworCV9fYmUzMiBzdGF0dXMgPSBuZnNlcnJfcmVzb3VyY2U7CiAKIAlkcHJpbnRrKCJORlNEOiBuZnM0X21ha2VfcmVjX2NsaWRuYW1lIGZvciAlLipzXG4iLAogCQkJY2xuYW1lLT5sZW4sIGNsbmFtZS0+ZGF0YSk7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlzdHJ1Y3QgZGVudHJ5X2xpc3QgKmNoaWxkOwogCiAJaWYgKG5hbWUgJiYgaXNkb3RlbnQobmFtZSwgbmFtbGVuKSkKLQkJcmV0dXJuIG5mc19vazsKKwkJcmV0dXJuIDA7CiAJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBuYW1sZW4pOwogCWlmIChJU19FUlIoZGVudHJ5KSkKIAkJcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKQEAgLTI1OSw3ICsyNTksNyBAQAogCQlwcmludGsoIm5mc2Q0OiBub24tZmlsZSBmb3VuZCBpbiBjbGllbnQgcmVjb3ZlcnkgZGlyZWN0b3J5XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCW11dGV4X2xvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJmRpci0+ZF9pbm9kZS0+aV9tdXRleCwgSV9NVVRFWF9QQVJFTlQpOwogCXN0YXR1cyA9IHZmc191bmxpbmsoZGlyLT5kX2lub2RlLCBkZW50cnkpOwogCW11dGV4X3VubG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMjc0LDcgKzI3NCw3IEBACiAJICogYW55IHJlZ3VsYXIgZmlsZXMgYW55d2F5LCBqdXN0IGluIGNhc2UgdGhlIGRpcmVjdG9yeSB3YXMgY3JlYXRlZCBieQogCSAqIGEga2VybmVsIGZyb20gdGhlIGZ1dHVyZS4uLi4gKi8KIAluZnNkNF9saXN0X3JlY19kaXIoZGVudHJ5LCBuZnNkNF9yZW1vdmVfY2xpZF9maWxlKTsKLQltdXRleF9sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X2xvY2tfbmVzdGVkKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKIAlzdGF0dXMgPSB2ZnNfcm1kaXIoZGlyLT5kX2lub2RlLCBkZW50cnkpOwogCW11dGV4X3VubG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMzMzLDE0ICszMzMsMTQgQEAKIAlpbnQgc3RhdHVzOwogCiAJaWYgKG5mczRfaGFzX3JlY2xhaW1lZF9zdGF0ZShjaGlsZC0+ZF9uYW1lLm5hbWUpKQotCQlyZXR1cm4gbmZzX29rOworCQlyZXR1cm4gMDsKIAogCXN0YXR1cyA9IG5mc2Q0X2NsZWFyX2NsaWRfZGlyKHBhcmVudCwgY2hpbGQpOwogCWlmIChzdGF0dXMpCiAJCXByaW50aygiZmFpbGVkIHRvIHJlbW92ZSBjbGllbnQgcmVjb3ZlcnkgZGlyZWN0b3J5ICVzXG4iLAogCQkJCWNoaWxkLT5kX25hbWUubmFtZSk7CiAJLyogS2VlcCB0cnlpbmcsIHN1Y2Nlc3Mgb3IgZmFpbHVyZTogKi8KLQlyZXR1cm4gbmZzX29rOworCXJldHVybiAwOwogfQogCiB2b2lkCkBAIC0zNjUsMTAgKzM2NSwxMCBAQAogCQlwcmludGsoIm5mc2Q0OiBpbGxlZ2FsIG5hbWUgJXMgaW4gcmVjb3ZlcnkgZGlyZWN0b3J5XG4iLAogCQkJCWNoaWxkLT5kX25hbWUubmFtZSk7CiAJCS8qIEtlZXAgdHJ5aW5nOyBtYXliZSB0aGUgb3RoZXJzIGFyZSBPSzogKi8KLQkJcmV0dXJuIG5mc19vazsKKwkJcmV0dXJuIDA7CiAJfQogCW5mczRfY2xpZW50X3RvX3JlY2xhaW0oY2hpbGQtPmRfbmFtZS5uYW1lKTsKLQlyZXR1cm4gbmZzX29rOworCXJldHVybiAwOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHN0YXRlLmMgYi9mcy9uZnNkL25mczRzdGF0ZS5jCmluZGV4IGViY2YyMjYuLjlkZTg5ZGYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwpAQCAtODQsMTAgKzg0LDEwIEBACiAgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgoY2xpZW50X211dGV4KTsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqc3RhdGVvd25lcl9zbGFiID0gTlVMTDsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmZpbGVfc2xhYiA9IE5VTEw7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpzdGF0ZWlkX3NsYWIgPSBOVUxMOwotc3RhdGljIGttZW1fY2FjaGVfdCAqZGVsZWdfc2xhYiA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnN0YXRlb3duZXJfc2xhYiA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZpbGVfc2xhYiA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnN0YXRlaWRfc2xhYiA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmRlbGVnX3NsYWIgPSBOVUxMOwogCiB2b2lkCiBuZnM0X2xvY2tfc3RhdGUodm9pZCkKQEAgLTcxMCwxMCArNzEwLDExIEBACiAgKgkJYXMgZGVzY3JpYmVkIGFib3ZlLgogICoKICAqLwotaW50Ci1uZnNkNF9zZXRjbGllbnRpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNldGNsaWQpCitfX2JlMzIKK25mc2Q0X3NldGNsaWVudGlkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCQkgIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZCAqc2V0Y2xpZCkKIHsKLQl1MzIgCQkJaXBfYWRkciA9IHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwlfX2JlMzIgCQkJaXBfYWRkciA9IHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKIAlzdHJ1Y3QgeGRyX25ldG9iaiAJY2xuYW1lID0geyAKIAkJLmxlbiA9IHNldGNsaWQtPnNlX25hbWVsZW4sCiAJCS5kYXRhID0gc2V0Y2xpZC0+c2VfbmFtZSwKQEAgLTcyMSw3ICs3MjIsNyBAQAogCW5mczRfdmVyaWZpZXIJCWNsdmVyaWZpZXIgPSBzZXRjbGlkLT5zZV92ZXJmOwogCXVuc2lnbmVkIGludCAJCXN0cmhhc2h2YWw7CiAJc3RydWN0IG5mczRfY2xpZW50CSpjb25mLCAqdW5jb25mLCAqbmV3OwotCWludCAJCQlzdGF0dXM7CisJX19iZTMyIAkJCXN0YXR1czsKIAljaGFyICAgICAgICAgICAgICAgICAgICBkbmFtZVtIRVhESVJfTEVOXTsKIAkKIAlpZiAoIWNoZWNrX25hbWUoY2xuYW1lKSkKQEAgLTg3NSwxNCArODc2LDE2IEBACiAgKgogICogTk9URTogY2FsbGJhY2sgaW5mb3JtYXRpb24gd2lsbCBiZSBwcm9jZXNzZWQgaGVyZSBpbiBhIGZ1dHVyZSBwYXRjaAogICovCi1pbnQKLW5mc2Q0X3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkX2NvbmZpcm0gKnNldGNsaWVudGlkX2NvbmZpcm0pCitfX2JlMzIKK25mc2Q0X3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJCSBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkJCSBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybSAqc2V0Y2xpZW50aWRfY29uZmlybSkKIHsKLQl1MzIgaXBfYWRkciA9IHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwlfX2JlMzIgaXBfYWRkciA9IHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKIAlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNvbmYsICp1bmNvbmY7CiAJbmZzNF92ZXJpZmllciBjb25maXJtID0gc2V0Y2xpZW50aWRfY29uZmlybS0+c2NfY29uZmlybTsgCiAJY2xpZW50aWRfdCAqIGNsaWQgPSAmc2V0Y2xpZW50aWRfY29uZmlybS0+c2NfY2xpZW50aWQ7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJaWYgKFNUQUxFX0NMSUVOVElEKGNsaWQpKQogCQlyZXR1cm4gbmZzZXJyX3N0YWxlX2NsaWVudGlkOwpAQCAtMTAwMyw3ICsxMDA2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2ZyZWVfc2xhYihrbWVtX2NhY2hlX3QgKipzbGFiKQorbmZzZDRfZnJlZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICoqc2xhYikKIHsKIAlpZiAoKnNsYWIgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTI4MCwxMyArMTI4MywxMyBAQAogICogQ2FsbGVkIHRvIGNoZWNrIGRlbnkgd2hlbiBSRUFEIHdpdGggYWxsIHplcm8gc3RhdGVpZCBvcgogICogV1JJVEUgd2l0aCBhbGwgemVybyBvciBhbGwgb25lIHN0YXRlaWQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzNF9zaGFyZV9jb25mbGljdChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1bnNpZ25lZCBpbnQgZGVueV90eXBlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vID0gY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOwogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKLQlpbnQgcmV0OworCV9fYmUzMiByZXQ7CiAKIAlkcHJpbnRrKCJORlNEOiBuZnM0X3NoYXJlX2NvbmZsaWN0XG4iKTsKIApAQCAtMTMxMCw3ICsxMzEzLDcgQEAKIG5mczRfZmlsZV9kb3duZ3JhZGUoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBzaGFyZV9hY2Nlc3MpCiB7CiAJaWYgKHNoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKSB7Ci0JCXB1dF93cml0ZV9hY2Nlc3MoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQlwdXRfd3JpdGVfYWNjZXNzKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCQlmaWxwLT5mX21vZGUgPSAoZmlscC0+Zl9tb2RlIHwgRk1PREVfUkVBRCkgJiB+Rk1PREVfV1JJVEU7CiAJfQogfQpAQCAtMTQ0NCw3ICsxNDQ3LDcgQEAKIH07CiAKIAotaW50CitfX2JlMzIKIG5mc2Q0X3Byb2Nlc3Nfb3BlbjEoc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCiB7CiAJY2xpZW50aWRfdCAqY2xpZW50aWQgPSAmb3Blbi0+b3BfY2xpZW50aWQ7CkBAIC0xNDc3LDcgKzE0ODAsNyBAQAogCX0KIAlpZiAob3Blbi0+b3Bfc2VxaWQgPT0gc29wLT5zb19zZXFpZCAtIDEpIHsKIAkJaWYgKHNvcC0+c29fcmVwbGF5LnJwX2J1ZmxlbikKLQkJCXJldHVybiBORlNFUlJfUkVQTEFZX01FOworCQkJcmV0dXJuIG5mc2Vycl9yZXBsYXlfbWU7CiAJCS8qIFRoZSBvcmlnaW5hbCBPUEVOIGZhaWxlZCBzbyBzcGVjdGFjdWxhcmx5CiAJCSAqIHRoYXQgd2UgZG9uJ3QgZXZlbiBoYXZlIHJlcGxheSBkYXRhIHNhdmVkIQogCQkgKiBUaGVyZWZvcmUsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBjb250aW51ZQpAQCAtMTUwMSw3ICsxNTA0LDcgQEAKIAlyZXR1cm4gbmZzX29rOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mczRfY2hlY2tfZGVsZWdtb2RlKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwLCBpbnQgZmxhZ3MpCiB7CiAJaWYgKChmbGFncyAmIFdSX1NUQVRFKSAmJiAoZHAtPmRsX3R5cGUgPT0gTkZTNF9PUEVOX0RFTEVHQVRFX1JFQUQpKQpAQCAtMTUyMiwxMiArMTUyNSwxMiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnM0X2NoZWNrX2RlbGVnKHN0cnVjdCBuZnM0X2ZpbGUgKmZwLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbiwKIAkJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqKmRwKQogewogCWludCBmbGFnczsKLQlpbnQgc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOworCV9fYmUzMiBzdGF0dXMgPSBuZnNlcnJfYmFkX3N0YXRlaWQ7CiAKIAkqZHAgPSBmaW5kX2RlbGVnYXRpb25fZmlsZShmcCwgJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQpOwogCWlmICgqZHAgPT0gTlVMTCkKQEAgLTE1NDYsMTEgKzE1NDksMTEgQEAKIAlyZXR1cm4gbmZzX29rOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnM0X2NoZWNrX29wZW4oc3RydWN0IG5mczRfZmlsZSAqZnAsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoqc3RwcCkKIHsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpsb2NhbDsKLQlpbnQgc3RhdHVzID0gbmZzZXJyX3NoYXJlX2RlbmllZDsKKwlfX2JlMzIgc3RhdHVzID0gbmZzZXJyX3NoYXJlX2RlbmllZDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBvcGVuLT5vcF9zdGF0ZW93bmVyOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmZwLT5maV9zdGF0ZWlkcywgc3RfcGVyZmlsZSkgewpAQCAtMTU3NSw3ICsxNTc4LDcgQEAKIAlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhzdGF0ZWlkX3NsYWIsIEdGUF9LRVJORUwpOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnM0X25ld19vcGVuKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKipzdHBwLAogCQlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCwKIAkJc3RydWN0IHN2Y19maCAqY3VyX2ZoLCBpbnQgZmxhZ3MpCkBAIC0xNTkwLDcgKzE1OTMsNyBAQAogCQlnZXRfZmlsZShkcC0+ZGxfdmZzX2ZpbGUpOwogCQlzdHAtPnN0X3Zmc19maWxlID0gZHAtPmRsX3Zmc19maWxlOwogCX0gZWxzZSB7Ci0JCWludCBzdGF0dXM7CisJCV9fYmUzMiBzdGF0dXM7CiAJCXN0YXR1cyA9IG5mc2Rfb3BlbihycXN0cCwgY3VyX2ZoLCBTX0lGUkVHLCBmbGFncywKIAkJCQkmc3RwLT5zdF92ZnNfZmlsZSk7CiAJCWlmIChzdGF0dXMpIHsKQEAgLTE2MDQsNyArMTYwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfdHJ1bmNhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmgsCiAJCXN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQogewpAQCAtMTYxOSwyMiArMTYyMiwyMiBAQAogCXJldHVybiBuZnNkX3NldGF0dHIocnFzdHAsIGZoLCAmaWF0dHIsIDAsICh0aW1lX3QpMCk7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mczRfdXBncmFkZV9vcGVuKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cl9maCwgc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IHN0cC0+c3RfdmZzX2ZpbGU7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXVuc2lnbmVkIGludCBzaGFyZV9hY2Nlc3MsIG5ld193cml0ZXI7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJc2V0X2FjY2Vzcygmc2hhcmVfYWNjZXNzLCBzdHAtPnN0X2FjY2Vzc19ibWFwKTsKIAluZXdfd3JpdGVyID0gKH5zaGFyZV9hY2Nlc3MpICYgb3Blbi0+b3Bfc2hhcmVfYWNjZXNzCiAJCQkmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFOwogCiAJaWYgKG5ld193cml0ZXIpIHsKLQkJc3RhdHVzID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7Ci0JCWlmIChzdGF0dXMpCi0JCQlyZXR1cm4gbmZzZXJybm8oc3RhdHVzKTsKKwkJaW50IGVyciA9IGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIG5mc2Vycm5vKGVycik7CiAJfQogCXN0YXR1cyA9IG5mc2Q0X3RydW5jYXRlKHJxc3RwLCBjdXJfZmgsIG9wZW4pOwogCWlmIChzdGF0dXMpIHsKQEAgLTE3MzgsMTQgKzE3NDEsMTQgQEAKIC8qCiAgKiBjYWxsZWQgd2l0aCBuZnM0X2xvY2tfc3RhdGUoKSBoZWxkLgogICovCi1pbnQKK19fYmUzMgogbmZzZDRfcHJvY2Vzc19vcGVuMihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKIHsKIAlzdHJ1Y3QgbmZzNF9maWxlICpmcCA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm8gPSBjdXJyZW50X2ZoLT5maF9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwID0gTlVMTDsKIAlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IE5VTEw7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJc3RhdHVzID0gbmZzZXJyX2ludmFsOwogCWlmICghYWNjZXNzX3ZhbGlkKG9wZW4tPm9wX3NoYXJlX2FjY2VzcykKQEAgLTE4MjksMTUgKzE4MzIsMTUgQEAKIH0KIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpsYXVuZHJ5X3dxOwotc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBsYXVuZHJvbWF0X3dvcms7Ci1zdGF0aWMgdm9pZCBsYXVuZHJvbWF0X21haW4odm9pZCAqKTsKLXN0YXRpYyBERUNMQVJFX1dPUksobGF1bmRyb21hdF93b3JrLCBsYXVuZHJvbWF0X21haW4sIE5VTEwpOworc3RhdGljIHZvaWQgbGF1bmRyb21hdF9tYWluKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhsYXVuZHJvbWF0X3dvcmssIGxhdW5kcm9tYXRfbWFpbik7CiAKLWludCAKLW5mc2Q0X3JlbmV3KGNsaWVudGlkX3QgKmNsaWQpCitfX2JlMzIKK25mc2Q0X3JlbmV3KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICBjbGllbnRpZF90ICpjbGlkKQogewogCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOwotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCW5mczRfbG9ja19zdGF0ZSgpOwogCWRwcmludGsoInByb2Nlc3NfcmVuZXcoJTA4eC8lMDh4KTogc3RhcnRpbmdcbiIsIApAQCAtMTk0MCw3ICsxOTQzLDcgQEAKIH0KIAogdm9pZAotbGF1bmRyb21hdF9tYWluKHZvaWQgKm5vdF91c2VkKQorbGF1bmRyb21hdF9tYWluKHN0cnVjdCB3b3JrX3N0cnVjdCAqbm90X3VzZWQpCiB7CiAJdGltZV90IHQ7CiAKQEAgLTE5NjYsNyArMTk2OSw3IEBACiBzdGF0aWMgaW5saW5lIGludAogbmZzNF9jaGVja19maChzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCkKIHsKLQlyZXR1cm4gZmhwLT5maF9kZW50cnktPmRfaW5vZGUgIT0gc3RwLT5zdF92ZnNfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJcmV0dXJuIGZocC0+ZmhfZGVudHJ5LT5kX2lub2RlICE9IHN0cC0+c3RfdmZzX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE5OTYsOSArMTk5OSw5IEBACiB9CiAKIHN0YXRpYwotaW50IG5mczRfY2hlY2tfb3Blbm1vZGUoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBpbnQgZmxhZ3MpCitfX2JlMzIgbmZzNF9jaGVja19vcGVubW9kZShzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIGludCBmbGFncykKIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IG5mc2Vycl9vcGVubW9kZTsKKyAgICAgICAgX19iZTMyIHN0YXR1cyA9IG5mc2Vycl9vcGVubW9kZTsKIAogCWlmICgoZmxhZ3MgJiBXUl9TVEFURSkgJiYgKCFhY2Nlc3NfcGVybWl0X3dyaXRlKHN0cC0+c3RfYWNjZXNzX2JtYXApKSkKICAgICAgICAgICAgICAgICBnb3RvIG91dDsKQEAgLTIwMDksNyArMjAxMiw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBjaGVja19zcGVjaWFsX3N0YXRlaWRzKHN2Y19maCAqY3VycmVudF9maCwgc3RhdGVpZF90ICpzdGF0ZWlkLCBpbnQgZmxhZ3MpCiB7CiAJLyogVHJ5aW5nIHRvIGNhbGwgZGVsZWdyZXR1cm4gd2l0aCBhIHNwZWNpYWwgc3RhdGVpZD8gWXVjaDogKi8KQEAgLTIwNDMsMTQgKzIwNDYsMTQgQEAKIC8qCiAqIENoZWNrcyBmb3Igc3RhdGVpZCBvcGVyYXRpb25zCiAqLwotaW50CitfX2JlMzIKIG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzLCBzdHJ1Y3QgZmlsZSAqKmZpbHBwKQogewogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCA9IE5VTEw7CiAJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBOVUxMOwogCXN0YXRlaWRfdCAqc3RpZHA7CiAJc3RydWN0IGlub2RlICppbm8gPSBjdXJyZW50X2ZoLT5maF9kZW50cnktPmRfaW5vZGU7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJZHByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zdGF0ZWlkX29wOiBzdGF0ZWlkID0gKCUwOHgvJTA4eC8lMDh4LyUwOHgpXG4iLAogCQlzdGF0ZWlkLT5zaV9ib290LCBzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQsIApAQCAtMjEyNSw3ICsyMTI4LDcgQEAKIC8qIAogICogQ2hlY2tzIGZvciBzZXF1ZW5jZSBpZCBtdXRhdGluZyBvcGVyYXRpb25zLiAKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHUzMiBzZXFpZCwgc3RhdGVpZF90ICpzdGF0ZWlkLCBpbnQgZmxhZ3MsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKipzb3BwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoqc3RwcCwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spCiB7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOwpAQCAtMjE2OSw3ICsyMTcyLDcgQEAKIAkJY2xpZW50aWRfdCAqbG9ja2NsaWQgPSAmbG9jay0+di5uZXcuY2xpZW50aWQ7CiAJCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc29wLT5zb19jbGllbnQ7CiAJCWludCBsa2ZsZyA9IDA7Ci0JCWludCBzdGF0dXM7CisJCV9fYmUzMiBzdGF0dXM7CiAKIAkJbGtmbGcgPSBzZXRsa2ZsZyhsb2NrLT5sa190eXBlKTsKIApAQCAtMjIzMyw3ICsyMjM2LDcgQEAKIAlpZiAoc2VxaWQgPT0gc29wLT5zb19zZXFpZCAtIDEpIHsKIAkJZHByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogcmV0cmFuc21pc3Npb24/XG4iKTsKIAkJLyogaW5kaWNhdGUgcmVwbGF5IHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KLQkJcmV0dXJuIE5GU0VSUl9SRVBMQVlfTUU7CisJCXJldHVybiBuZnNlcnJfcmVwbGF5X21lOwogCX0KIAlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGJhZCBzZXFpZCAoZXhwZWN0ZWQgJWQsIGdvdCAlZClcbiIsCiAJCQlzb3AtPnNvX3NlcWlkLCBzZXFpZCk7CkBAIC0yMjQxLDI1ICsyMjQ0LDI2IEBACiAJcmV0dXJuIG5mc2Vycl9iYWRfc2VxaWQ7CiB9CiAKLWludAotbmZzZDRfb3Blbl9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9jLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqcmVwbGF5X293bmVyKQorX19iZTMyCituZnNkNF9vcGVuX2NvbmZpcm0oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCisJCSAgIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9jKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOwogCiAJZHByaW50aygiTkZTRDogbmZzZDRfb3Blbl9jb25maXJtIG9uIGZpbGUgJS4qc1xuIiwKLQkJCShpbnQpY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX25hbWUubGVuLAotCQkJY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQkoaW50KWNzdGF0ZS0+Y3VycmVudF9maC5maF9kZW50cnktPmRfbmFtZS5sZW4sCisJCQljc3RhdGUtPmN1cnJlbnRfZmguZmhfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKLQlzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZSRUcsIDApOworCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwgU19JRlJFRywgMCk7CiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAogCW5mczRfbG9ja19zdGF0ZSgpOwogCi0JaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoY3VycmVudF9maCwgb2MtPm9jX3NlcWlkLAotCQkJCQkmb2MtPm9jX3JlcV9zdGF0ZWlkLAorCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKCZjc3RhdGUtPmN1cnJlbnRfZmgsCisJCQkJCW9jLT5vY19zZXFpZCwgJm9jLT5vY19yZXFfc3RhdGVpZCwKIAkJCQkJQ0hFQ0tfRkggfCBDT05GSVJNIHwgT1BFTl9TVEFURSwKIAkJCQkJJm9jLT5vY19zdGF0ZW93bmVyLCAmc3RwLCBOVUxMKSkpCiAJCWdvdG8gb3V0OyAKQEAgLTIyNzksNyArMjI4Myw3IEBACiBvdXQ6CiAJaWYgKG9jLT5vY19zdGF0ZW93bmVyKSB7CiAJCW5mczRfZ2V0X3N0YXRlb3duZXIob2MtPm9jX3N0YXRlb3duZXIpOwotCQkqcmVwbGF5X293bmVyID0gb2MtPm9jX3N0YXRlb3duZXI7CisJCWNzdGF0ZS0+cmVwbGF5X293bmVyID0gb2MtPm9jX3N0YXRlb3duZXI7CiAJfQogCW5mczRfdW5sb2NrX3N0YXRlKCk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTIzMTAsMjMgKzIzMTQsMjYgQEAKIAl9CiB9CiAKLWludAotbmZzZDRfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW5fZG93bmdyYWRlICpvZCwgc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnJlcGxheV9vd25lcikKK19fYmUzMgorbmZzZDRfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJICAgICBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkJICAgICBzdHJ1Y3QgbmZzZDRfb3Blbl9kb3duZ3JhZGUgKm9kKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CiAJdW5zaWduZWQgaW50IHNoYXJlX2FjY2VzczsKIAogCWRwcmludGsoIk5GU0Q6IG5mc2Q0X29wZW5fZG93bmdyYWRlIG9uIGZpbGUgJS4qc1xuIiwgCi0JCQkoaW50KWN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCWN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkJKGludCljc3RhdGUtPmN1cnJlbnRfZmguZmhfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCiAJaWYgKCFhY2Nlc3NfdmFsaWQob2QtPm9kX3NoYXJlX2FjY2VzcykKIAkJCXx8ICFkZW55X3ZhbGlkKG9kLT5vZF9zaGFyZV9kZW55KSkKIAkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKIAogCW5mczRfbG9ja19zdGF0ZSgpOwotCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKGN1cnJlbnRfZmgsIG9kLT5vZF9zZXFpZCwgCisJaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCQkJb2QtPm9kX3NlcWlkLAogCQkJCQkmb2QtPm9kX3N0YXRlaWQsIAogCQkJCQlDSEVDS19GSCB8IE9QRU5fU1RBVEUsIAogCQkJCQkmb2QtPm9kX3N0YXRlb3duZXIsICZzdHAsIE5VTEwpKSkKQEAgLTIzNTYsNyArMjM2Myw3IEBACiBvdXQ6CiAJaWYgKG9kLT5vZF9zdGF0ZW93bmVyKSB7CiAJCW5mczRfZ2V0X3N0YXRlb3duZXIob2QtPm9kX3N0YXRlb3duZXIpOwotCQkqcmVwbGF5X293bmVyID0gb2QtPm9kX3N0YXRlb3duZXI7CisJCWNzdGF0ZS0+cmVwbGF5X293bmVyID0gb2QtPm9kX3N0YXRlb3duZXI7CiAJfQogCW5mczRfdW5sb2NrX3N0YXRlKCk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTIzNjUsMTkgKzIzNzIsMjEgQEAKIC8qCiAgKiBuZnM0X3VubG9ja19zdGF0ZSgpIGNhbGxlZCBhZnRlciBlbmNvZGUKICAqLwotaW50Ci1uZnNkNF9jbG9zZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfY2xvc2UgKmNsb3NlLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqcmVwbGF5X293bmVyKQorX19iZTMyCituZnNkNF9jbG9zZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgc3RydWN0IG5mc2Q0X2Nsb3NlICpjbG9zZSkKIHsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOwogCiAJZHByaW50aygiTkZTRDogbmZzZDRfY2xvc2Ugb24gZmlsZSAlLipzXG4iLCAKLQkJCShpbnQpY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX25hbWUubGVuLAotCQkJY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQkoaW50KWNzdGF0ZS0+Y3VycmVudF9maC5maF9kZW50cnktPmRfbmFtZS5sZW4sCisJCQljc3RhdGUtPmN1cnJlbnRfZmguZmhfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAluZnM0X2xvY2tfc3RhdGUoKTsKIAkvKiBjaGVjayBjbG9zZV9scnUgZm9yIHJlcGxheSAqLwotCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKGN1cnJlbnRfZmgsIGNsb3NlLT5jbF9zZXFpZCwgCisJaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCQkJY2xvc2UtPmNsX3NlcWlkLAogCQkJCQkmY2xvc2UtPmNsX3N0YXRlaWQsIAogCQkJCQlDSEVDS19GSCB8IE9QRU5fU1RBVEUgfCBDTE9TRV9TVEFURSwKIAkJCQkJJmNsb3NlLT5jbF9zdGF0ZW93bmVyLCAmc3RwLCBOVUxMKSkpCkBAIC0yMzk4LDIyICsyNDA3LDI0IEBACiBvdXQ6CiAJaWYgKGNsb3NlLT5jbF9zdGF0ZW93bmVyKSB7CiAJCW5mczRfZ2V0X3N0YXRlb3duZXIoY2xvc2UtPmNsX3N0YXRlb3duZXIpOwotCQkqcmVwbGF5X293bmVyID0gY2xvc2UtPmNsX3N0YXRlb3duZXI7CisJCWNzdGF0ZS0+cmVwbGF5X293bmVyID0gY2xvc2UtPmNsX3N0YXRlb3duZXI7CiAJfQogCW5mczRfdW5sb2NrX3N0YXRlKCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50Ci1uZnNkNF9kZWxlZ3JldHVybihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfZGVsZWdyZXR1cm4gKmRyKQorX19iZTMyCituZnNkNF9kZWxlZ3JldHVybihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkJICBzdHJ1Y3QgbmZzZDRfZGVsZWdyZXR1cm4gKmRyKQogewotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAotCWlmICgoc3RhdHVzID0gZmhfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCBTX0lGUkVHLCAwKSkpCisJaWYgKChzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsIFNfSUZSRUcsIDApKSkKIAkJZ290byBvdXQ7CiAKIAluZnM0X2xvY2tfc3RhdGUoKTsKLQlzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc3RhdGVpZF9vcChjdXJyZW50X2ZoLCAmZHItPmRyX3N0YXRlaWQsIERFTEVHX1JFVCwgTlVMTCk7CisJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCQkJICAgICZkci0+ZHJfc3RhdGVpZCwgREVMRUdfUkVULCBOVUxMKTsKIAluZnM0X3VubG9ja19zdGF0ZSgpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC0yNjM1LDggKzI2NDYsOSBAQAogLyoKICAqICBMT0NLIG9wZXJhdGlvbiAKICAqLwotaW50Ci1uZnNkNF9sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqcmVwbGF5X293bmVyKQorX19iZTMyCituZnNkNF9sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKQogewogCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKm9wZW5fc29wID0gTlVMTDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpsb2NrX3NvcCA9IE5VTEw7CkBAIC0yNjQ0LDggKzI2NTYsOSBAQAogCXN0cnVjdCBmaWxlICpmaWxwOwogCXN0cnVjdCBmaWxlX2xvY2sgZmlsZV9sb2NrOwogCXN0cnVjdCBmaWxlX2xvY2sgY29uZmxvY2s7Ci0JaW50IHN0YXR1cyA9IDA7CisJX19iZTMyIHN0YXR1cyA9IDA7CiAJdW5zaWduZWQgaW50IHN0cmhhc2h2YWw7CisJaW50IGVycjsKIAogCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IHN0YXJ0PSVMZCBsZW5ndGg9JUxkXG4iLAogCQkobG9uZyBsb25nKSBsb2NrLT5sa19vZmZzZXQsCkBAIC0yNjU0LDcgKzI2NjcsOCBAQAogCWlmIChjaGVja19sb2NrX2xlbmd0aChsb2NrLT5sa19vZmZzZXQsIGxvY2stPmxrX2xlbmd0aCkpCiAJCSByZXR1cm4gbmZzZXJyX2ludmFsOwogCi0JaWYgKChzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZSRUcsIE1BWV9MT0NLKSkpIHsKKwlpZiAoKHN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCQlTX0lGUkVHLCBNQVlfTE9DSykpKSB7CiAJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IHBlcm1pc3Npb24gZGVuaWVkIVxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQpAQCAtMjY3NSw3ICsyNjg5LDcgQEAKIAkJCWdvdG8gb3V0OwogCiAJCS8qIHZhbGlkYXRlIGFuZCB1cGRhdGUgb3BlbiBzdGF0ZWlkIGFuZCBvcGVuIHNlcWlkICovCi0JCXN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChjdXJyZW50X2ZoLCAKKwkJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKCZjc3RhdGUtPmN1cnJlbnRfZmgsCiAJCQkJICAgICAgICBsb2NrLT5sa19uZXdfb3Blbl9zZXFpZCwKIAkJICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2stPmxrX25ld19vcGVuX3N0YXRlaWQsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0ZIIHwgT1BFTl9TVEFURSwKQEAgLTI3MDIsNyArMjcxNiw3IEBACiAJCQlnb3RvIG91dDsKIAl9IGVsc2UgewogCQkvKiBsb2NrIChsb2NrIG93bmVyICsgbG9jayBzdGF0ZWlkKSBhbHJlYWR5IGV4aXN0cyAqLwotCQlzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoY3VycmVudF9maCwKKwkJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKCZjc3RhdGUtPmN1cnJlbnRfZmgsCiAJCQkJICAgICAgIGxvY2stPmxrX29sZF9sb2NrX3NlcWlkLCAKIAkJCQkgICAgICAgJmxvY2stPmxrX29sZF9sb2NrX3N0YXRlaWQsIAogCQkJCSAgICAgICBDSEVDS19GSCB8IExPQ0tfU1RBVEUsIApAQCAtMjc1OCwxMyArMjc3MiwxMyBAQAogCSAqIGxvY2tzX2NvcHlfbG9jazogKi8KIAljb25mbG9jay5mbF9vcHMgPSBOVUxMOwogCWNvbmZsb2NrLmZsX2xtb3BzID0gTlVMTDsKLQlzdGF0dXMgPSBwb3NpeF9sb2NrX2ZpbGVfY29uZihmaWxwLCAmZmlsZV9sb2NrLCAmY29uZmxvY2spOwotCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IHBvc2l4X2xvY2tfZmlsZV9jb25mIHN0YXR1cyAlZFxuIixzdGF0dXMpOwotCXN3aXRjaCAoLXN0YXR1cykgeworCWVyciA9IHBvc2l4X2xvY2tfZmlsZV9jb25mKGZpbHAsICZmaWxlX2xvY2ssICZjb25mbG9jayk7CisJc3dpdGNoICgtZXJyKSB7CiAJY2FzZSAwOiAvKiBzdWNjZXNzISAqLwogCQl1cGRhdGVfc3RhdGVpZCgmbG9ja19zdHAtPnN0X3N0YXRlaWQpOwogCQltZW1jcHkoJmxvY2stPmxrX3Jlc3Bfc3RhdGVpZCwgJmxvY2tfc3RwLT5zdF9zdGF0ZWlkLCAKIAkJCQlzaXplb2Yoc3RhdGVpZF90KSk7CisJCXN0YXR1cyA9IDA7CiAJCWJyZWFrOwogCWNhc2UgKEVBR0FJTik6CQkvKiBjb25mbG9jayBob2xkcyBjb25mbGljdGluZyBsb2NrICovCiAJCXN0YXR1cyA9IG5mc2Vycl9kZW5pZWQ7CkBAIC0yNzc1LDcgKzI3ODksNyBAQAogCQlzdGF0dXMgPSBuZnNlcnJfZGVhZGxvY2s7CiAJCWJyZWFrOwogCWRlZmF1bHQ6ICAgICAgICAKLQkJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogcG9zaXhfbG9ja19maWxlX2NvbmYoKSBmYWlsZWQhIHN0YXR1cyAlZFxuIixzdGF0dXMpOworCQlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBwb3NpeF9sb2NrX2ZpbGVfY29uZigpIGZhaWxlZCEgc3RhdHVzICVkXG4iLGVycik7CiAJCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKIAkJYnJlYWs7CiAJfQpAQCAtMjc4NCw3ICsyNzk4LDcgQEAKIAkJcmVsZWFzZV9zdGF0ZW93bmVyKGxvY2tfc29wKTsKIAlpZiAobG9jay0+bGtfcmVwbGF5X293bmVyKSB7CiAJCW5mczRfZ2V0X3N0YXRlb3duZXIobG9jay0+bGtfcmVwbGF5X293bmVyKTsKLQkJKnJlcGxheV9vd25lciA9IGxvY2stPmxrX3JlcGxheV9vd25lcjsKKwkJY3N0YXRlLT5yZXBsYXlfb3duZXIgPSBsb2NrLT5sa19yZXBsYXlfb3duZXI7CiAJfQogCW5mczRfdW5sb2NrX3N0YXRlKCk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTI3OTMsMTQgKzI4MDcsMTUgQEAKIC8qCiAgKiBMT0NLVCBvcGVyYXRpb24KICAqLwotaW50Ci1uZnNkNF9sb2NrdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfbG9ja3QgKmxvY2t0KQorX19iZTMyCituZnNkNF9sb2NrdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmaWxlIGZpbGU7CiAJc3RydWN0IGZpbGVfbG9jayBmaWxlX2xvY2s7CiAJc3RydWN0IGZpbGVfbG9jayBjb25mbG9jazsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CiAKIAlpZiAobmZzNF9pbl9ncmFjZSgpKQogCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwpAQCAtMjgxNSwxNCArMjgzMCwxNCBAQAogCWlmIChTVEFMRV9DTElFTlRJRCgmbG9ja3QtPmx0X2NsaWVudGlkKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoKHN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgU19JRlJFRywgMCkpKSB7CisJaWYgKChzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsIFNfSUZSRUcsIDApKSkgewogCQlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrdDogZmhfdmVyaWZ5KCkgZmFpbGVkIVxuIik7CiAJCWlmIChzdGF0dXMgPT0gbmZzZXJyX3N5bWxpbmspCiAJCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlub2RlID0gY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeS0+ZF9pbm9kZTsKIAlsb2Nrc19pbml0X2xvY2soJmZpbGVfbG9jayk7CiAJc3dpdGNoIChsb2NrdC0+bHRfdHlwZSkgewogCQljYXNlIE5GUzRfUkVBRF9MVDoKQEAgLTI4NjEsNyArMjg3Niw3IEBACiAJICogb25seSB0aGUgZGVudHJ5Omlub2RlIHNldC4KIAkgKi8KIAltZW1zZXQoJmZpbGUsIDAsIHNpemVvZiAoc3RydWN0IGZpbGUpKTsKLQlmaWxlLmZfZGVudHJ5ID0gY3VycmVudF9maC0+ZmhfZGVudHJ5OworCWZpbGUuZl9wYXRoLmRlbnRyeSA9IGNzdGF0ZS0+Y3VycmVudF9maC5maF9kZW50cnk7CiAKIAlzdGF0dXMgPSBuZnNfb2s7CiAJaWYgKHBvc2l4X3Rlc3RfbG9jaygmZmlsZSwgJmZpbGVfbG9jaywgJmNvbmZsb2NrKSkgewpAQCAtMjg3MywxMyArMjg4OCwxNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludAotbmZzZDRfbG9ja3Uoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2xvY2t1ICpsb2NrdSwgc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnJlcGxheV9vd25lcikKK19fYmUzMgorbmZzZDRfbG9ja3Uoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICpjc3RhdGUsCisJICAgIHN0cnVjdCBuZnNkNF9sb2NrdSAqbG9ja3UpCiB7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOwogCXN0cnVjdCBmaWxlICpmaWxwID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZV9sb2NrIGZpbGVfbG9jazsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiBzdGF0dXM7CisJaW50IGVycjsKIAkJCQkJCSAgICAgICAgCiAJZHByaW50aygiTkZTRDogbmZzZDRfbG9ja3U6IHN0YXJ0PSVMZCBsZW5ndGg9JUxkXG4iLAogCQkobG9uZyBsb25nKSBsb2NrdS0+bHVfb2Zmc2V0LApAQCAtMjg5MCw3ICsyOTA3LDcgQEAKIAogCW5mczRfbG9ja19zdGF0ZSgpOwogCQkJCQkJCQkJICAgICAgICAKLQlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChjdXJyZW50X2ZoLCAKKwlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcCgmY3N0YXRlLT5jdXJyZW50X2ZoLAogCQkJCQlsb2NrdS0+bHVfc2VxaWQsIAogCQkJCQkmbG9ja3UtPmx1X3N0YXRlaWQsIAogCQkJCQlDSEVDS19GSCB8IExPQ0tfU1RBVEUsIApAQCAtMjkxNyw4ICsyOTM0LDggQEAKIAkvKgogCSogIFRyeSB0byB1bmxvY2sgdGhlIGZpbGUgaW4gdGhlIFZGUy4KIAkqLwotCXN0YXR1cyA9IHBvc2l4X2xvY2tfZmlsZShmaWxwLCAmZmlsZV9sb2NrKTsgCi0JaWYgKHN0YXR1cykgeworCWVyciA9IHBvc2l4X2xvY2tfZmlsZShmaWxwLCAmZmlsZV9sb2NrKTsKKwlpZiAoZXJyKSB7CiAJCWRwcmludGsoIk5GU0Q6IG5mczRfbG9ja3U6IHBvc2l4X2xvY2tfZmlsZSBmYWlsZWQhXG4iKTsKIAkJZ290byBvdXRfbmZzZXJyOwogCX0KQEAgLTI5MzEsMTMgKzI5NDgsMTMgQEAKIG91dDoKIAlpZiAobG9ja3UtPmx1X3N0YXRlb3duZXIpIHsKIAkJbmZzNF9nZXRfc3RhdGVvd25lcihsb2NrdS0+bHVfc3RhdGVvd25lcik7Ci0JCSpyZXBsYXlfb3duZXIgPSBsb2NrdS0+bHVfc3RhdGVvd25lcjsKKwkJY3N0YXRlLT5yZXBsYXlfb3duZXIgPSBsb2NrdS0+bHVfc3RhdGVvd25lcjsKIAl9CiAJbmZzNF91bmxvY2tfc3RhdGUoKTsKIAlyZXR1cm4gc3RhdHVzOwogCiBvdXRfbmZzZXJyOgotCXN0YXR1cyA9IG5mc2Vycm5vKHN0YXR1cyk7CisJc3RhdHVzID0gbmZzZXJybm8oZXJyKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtMjk1MCw3ICsyOTY3LDcgQEAKIGNoZWNrX2Zvcl9sb2NrcyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG93bmVyKQogewogCXN0cnVjdCBmaWxlX2xvY2sgKipmbHBwOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgc3RhdHVzID0gMDsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC0yOTY1LDggKzI5ODIsMTAgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQKLW5mc2Q0X3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciAqcmxvY2tvd25lcikKK19fYmUzMgorbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJCXN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCQkJc3RydWN0IG5mc2Q0X3JlbGVhc2VfbG9ja293bmVyICpybG9ja293bmVyKQogewogCWNsaWVudGlkX3QgKmNsaWQgPSAmcmxvY2tvd25lci0+cmxfY2xpZW50aWQ7CiAJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wOwpAQCAtMjk3NCw3ICsyOTkzLDcgQEAKIAlzdHJ1Y3QgeGRyX25ldG9iaiAqb3duZXIgPSAmcmxvY2tvd25lci0+cmxfb3duZXI7CiAJc3RydWN0IGxpc3RfaGVhZCBtYXRjaGVzOwogCWludCBpOwotCWludCBzdGF0dXM7CisJX19iZTMyIHN0YXR1czsKIAogCWRwcmludGsoIm5mc2Q0X3JlbGVhc2VfbG9ja293bmVyIGNsaWVudGlkOiAoJTA4eC8lMDh4KTpcbiIsCiAJCWNsaWQtPmNsX2Jvb3QsIGNsaWQtPmNsX2lkKTsKQEAgLTMxMTEsNyArMzEzMCw3IEBACiAvKgogKiBDYWxsZWQgZnJvbSBPUEVOLiBMb29rIGZvciBjbGllbnRpZCBpbiByZWNsYWltIGxpc3QuCiAqLwotaW50CitfX2JlMzIKIG5mczRfY2hlY2tfb3Blbl9yZWNsYWltKGNsaWVudGlkX3QgKmNsaWQpCiB7CiAJcmV0dXJuIG5mczRfZmluZF9yZWNsYWltX2NsaWVudChjbGlkKSA/IG5mc19vayA6IG5mc2Vycl9yZWNsYWltX2JhZDsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggNDFmYzI0MS4uZmVhNDYzNiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTY4LDggKzY4LDggQEAKICNkZWZpbmUgTkZTNF9SRUZFUlJBTF9GU0lEX01BSk9SCTB4ODAwMDAwMFVMTAogI2RlZmluZSBORlM0X1JFRkVSUkFMX0ZTSURfTUlOT1IJMHg4MDAwMDAwVUxMCiAKLXN0YXRpYyBpbnQKLWNoZWNrX2ZpbGVuYW1lKGNoYXIgKnN0ciwgaW50IGxlbiwgaW50IGVycikKK3N0YXRpYyBfX2JlMzIKK2NoZWNrX2ZpbGVuYW1lKGNoYXIgKnN0ciwgaW50IGxlbiwgX19iZTMyIGVycikKIHsKIAlpbnQgaTsKIApAQCAtOTQsOCArOTQsOCBAQAogICogY29uc2lzdGVudCB3aXRoIHRoZSBzdHlsZSB1c2VkIGluIE5GU3YyL3YzLi4uCiAgKi8KICNkZWZpbmUgREVDT0RFX0hFQUQJCQkJXAotCXUzMiAqcDsJCQkJCVwKLQlpbnQgc3RhdHVzCisJX19iZTMyICpwOwkJCQlcCisJX19iZTMyIHN0YXR1cwogI2RlZmluZSBERUNPREVfVEFJTAkJCQlcCiAJc3RhdHVzID0gMDsJCQkJXAogb3V0OgkJCQkJCVwKQEAgLTE0NCwxMyArMTQ0LDEzIEBACiAJfQkJCQkJXAogfSB3aGlsZSAoMCkKIAotc3RhdGljIHUzMiAqcmVhZF9idWYoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgaW50IG5ieXRlcykKK3N0YXRpYyBfX2JlMzIgKnJlYWRfYnVmKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIGludCBuYnl0ZXMpCiB7CiAJLyogV2Ugd2FudCBtb3JlIGJ5dGVzIHRoYW4gc2VlbSB0byBiZSBhdmFpbGFibGUuCiAJICogTWF5YmUgd2UgbmVlZCBhIG5ldyBwYWdlLCBtYXliZSB3ZSBoYXZlIGp1c3QgcnVuIG91dAogCSAqLwogCWludCBhdmFpbCA9IChjaGFyKilhcmdwLT5lbmQgLSAoY2hhciopYXJncC0+cDsKLQl1MzIgKnA7CisJX19iZTMyICpwOwogCWlmIChhdmFpbCArIGFyZ3AtPnBhZ2VsZW4gPCBuYnl0ZXMpCiAJCXJldHVybiBOVUxMOwogCWlmIChhdmFpbCArIFBBR0VfU0laRSA8IG5ieXRlcykgLyogbmVlZCBtb3JlIHRoYW4gYSBwYWdlICEhICovCkBAIC0xOTcsNyArMTk3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNoYXIgKnNhdmVtZW0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgdTMyICpwLCBpbnQgbmJ5dGVzKQorc3RhdGljIGNoYXIgKnNhdmVtZW0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgX19iZTMyICpwLCBpbnQgbmJ5dGVzKQogewogCXZvaWQgKm5ldyA9IE5VTEw7CiAJaWYgKHAgPT0gYXJncC0+dG1wKSB7CkBAIC0yMTcsNyArMjE3LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfYml0bWFwKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHUzMiAqYm12YWwpCiB7CiAJdTMyIGJtbGVuOwpAQCAtMjQwLDEzICsyNDAsMTQgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2ZhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHUzMiAqYm12YWwsIHN0cnVjdCBpYXR0ciAqaWF0dHIsCiAgICAgc3RydWN0IG5mczRfYWNsICoqYWNsKQogewogCWludCBleHBlY3RlZF9sZW4sIGxlbiA9IDA7CiAJdTMyIGR1bW15MzI7CiAJY2hhciAqYnVmOworCWludCBob3N0X2VycjsKIAogCURFQ09ERV9IRUFEOwogCWlhdHRyLT5pYV92YWxpZCA9IDA7CkBAIC0yODAsNyArMjgxLDcgQEAKIAogCQkqYWNsID0gbmZzNF9hY2xfbmV3KCk7CiAJCWlmICgqYWNsID09IE5VTEwpIHsKLQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlob3N0X2VyciA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF9uZnNlcnI7CiAJCX0KIAkJZGVmZXJfZnJlZShhcmdwLCAodm9pZCAoKikoY29uc3Qgdm9pZCAqKSluZnM0X2FjbF9mcmVlLCAqYWNsKTsKQEAgLTI5NSwyMCArMjk2LDIwIEBACiAJCQlsZW4gKz0gWERSX1FVQURMRU4oZHVtbXkzMikgPDwgMjsKIAkJCVJFQURNRU0oYnVmLCBkdW1teTMyKTsKIAkJCWFjZS53aG90eXBlID0gbmZzNF9hY2xfZ2V0X3dob3R5cGUoYnVmLCBkdW1teTMyKTsKLQkJCXN0YXR1cyA9IDA7CisJCQlob3N0X2VyciA9IDA7CiAJCQlpZiAoYWNlLndob3R5cGUgIT0gTkZTNF9BQ0xfV0hPX05BTUVEKQogCQkJCWFjZS53aG8gPSAwOwogCQkJZWxzZSBpZiAoYWNlLmZsYWcgJiBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQKQotCQkJCXN0YXR1cyA9IG5mc2RfbWFwX25hbWVfdG9fZ2lkKGFyZ3AtPnJxc3RwLAorCQkJCWhvc3RfZXJyID0gbmZzZF9tYXBfbmFtZV90b19naWQoYXJncC0+cnFzdHAsCiAJCQkJCQlidWYsIGR1bW15MzIsICZhY2Uud2hvKTsKIAkJCWVsc2UKLQkJCQlzdGF0dXMgPSBuZnNkX21hcF9uYW1lX3RvX3VpZChhcmdwLT5ycXN0cCwKKwkJCQlob3N0X2VyciA9IG5mc2RfbWFwX25hbWVfdG9fdWlkKGFyZ3AtPnJxc3RwLAogCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLndobyk7Ci0JCQlpZiAoc3RhdHVzKQorCQkJaWYgKGhvc3RfZXJyKQogCQkJCWdvdG8gb3V0X25mc2VycjsKLQkJCXN0YXR1cyA9IG5mczRfYWNsX2FkZF9hY2UoKmFjbCwgYWNlLnR5cGUsIGFjZS5mbGFnLAorCQkJaG9zdF9lcnIgPSBuZnM0X2FjbF9hZGRfYWNlKCphY2wsIGFjZS50eXBlLCBhY2UuZmxhZywKIAkJCQkgYWNlLmFjY2Vzc19tYXNrLCBhY2Uud2hvdHlwZSwgYWNlLndobyk7Ci0JCQlpZiAoc3RhdHVzKQorCQkJaWYgKGhvc3RfZXJyKQogCQkJCWdvdG8gb3V0X25mc2VycjsKIAkJfQogCX0gZWxzZQpAQCAtMzI3LDcgKzMyOCw3IEBACiAJCVJFQURfQlVGKGR1bW15MzIpOwogCQlsZW4gKz0gKFhEUl9RVUFETEVOKGR1bW15MzIpIDw8IDIpOwogCQlSRUFETUVNKGJ1ZiwgZHVtbXkzMik7Ci0JCWlmICgoc3RhdHVzID0gbmZzZF9tYXBfbmFtZV90b191aWQoYXJncC0+cnFzdHAsIGJ1ZiwgZHVtbXkzMiwgJmlhdHRyLT5pYV91aWQpKSkKKwkJaWYgKChob3N0X2VyciA9IG5mc2RfbWFwX25hbWVfdG9fdWlkKGFyZ3AtPnJxc3RwLCBidWYsIGR1bW15MzIsICZpYXR0ci0+aWFfdWlkKSkpCiAJCQlnb3RvIG91dF9uZnNlcnI7CiAJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX1VJRDsKIAl9CkBAIC0zMzgsNyArMzM5LDcgQEAKIAkJUkVBRF9CVUYoZHVtbXkzMik7CiAJCWxlbiArPSAoWERSX1FVQURMRU4oZHVtbXkzMikgPDwgMik7CiAJCVJFQURNRU0oYnVmLCBkdW1teTMyKTsKLQkJaWYgKChzdGF0dXMgPSBuZnNkX21hcF9uYW1lX3RvX2dpZChhcmdwLT5ycXN0cCwgYnVmLCBkdW1teTMyLCAmaWF0dHItPmlhX2dpZCkpKQorCQlpZiAoKGhvc3RfZXJyID0gbmZzZF9tYXBfbmFtZV90b19naWQoYXJncC0+cnFzdHAsIGJ1ZiwgZHVtbXkzMiwgJmlhdHRyLT5pYV9naWQpKSkKIAkJCWdvdG8gb3V0X25mc2VycjsKIAkJaWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfR0lEOwogCX0KQEAgLTQxNCwxMSArNDE1LDExIEBACiAJREVDT0RFX1RBSUw7CiAKIG91dF9uZnNlcnI6Ci0Jc3RhdHVzID0gbmZzZXJybm8oc3RhdHVzKTsKKwlzdGF0dXMgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9hY2Nlc3Moc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2FjY2VzcyAqYWNjZXNzKQogewogCURFQ09ERV9IRUFEOwpAQCAtNDI5LDcgKzQzMCw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9jbG9zZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfY2xvc2UgKmNsb3NlKQogewogCURFQ09ERV9IRUFEOwpAQCAtNDQ0LDcgKzQ0NSw3IEBACiB9CiAKIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2NvbW1pdChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfY29tbWl0ICpjb21taXQpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC00NTYsNyArNDU3LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2NyZWF0ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfY3JlYXRlICpjcmVhdGUpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC00OTYsNyArNDk3LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkNF9kZWNvZGVfZGVsZWdyZXR1cm4oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2RlbGVncmV0dXJuICpkcikKIHsKIAlERUNPREVfSEVBRDsKQEAgLTUwOCwxMyArNTA5LDEzIEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIF9fYmUzMgogbmZzZDRfZGVjb2RlX2dldGF0dHIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2dldGF0dHIgKmdldGF0dHIpCiB7CiAJcmV0dXJuIG5mc2Q0X2RlY29kZV9iaXRtYXAoYXJncCwgZ2V0YXR0ci0+Z2FfYm12YWwpOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfbGluayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfbGluayAqbGluaykKIHsKIAlERUNPREVfSEVBRDsKQEAgLTUyOSw3ICs1MzAsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfbG9jayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfbG9jayAqbG9jaykKIHsKIAlERUNPREVfSEVBRDsKQEAgLTU2OCw3ICs1NjksNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfbG9ja3Qoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKIHsKIAlERUNPREVfSEVBRDsKQEAgLTU4Nyw3ICs1ODgsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfbG9ja3Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2xvY2t1ICpsb2NrdSkKIHsKIAlERUNPREVfSEVBRDsKQEAgLTYwNiw3ICs2MDcsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfbG9va3VwKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9sb29rdXAgKmxvb2t1cCkKIHsKIAlERUNPREVfSEVBRDsKQEAgLTYyMSw3ICs2MjIsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfb3BlbihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKIHsKIAlERUNPREVfSEVBRDsKQEAgLTY5OSw3ICs3MDAsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfb3Blbl9jb25maXJtKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9wZW5fY29uZikKIHsKIAlERUNPREVfSEVBRDsKQEAgLTcxMyw3ICs3MTQsNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X29wZW5fZG93bmdyYWRlICpvcGVuX2Rvd24pCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC03MjksNyArNzMwLDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3B1dGZoKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9wdXRmaCAqcHV0ZmgpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC03NDQsNyArNzQ1LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3JlYWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3JlYWQgKnJlYWQpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC03NTgsNyArNzU5LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3JlYWRkaXIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3JlYWRkaXIgKnJlYWRkaXIpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC03NzQsNyArNzc1LDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3JlbW92ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfcmVtb3ZlICpyZW1vdmUpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC03ODksNyArNzkwLDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3JlbmFtZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfcmVuYW1lICpyZW5hbWUpCiB7CiAJREVDT0RFX0hFQUQ7CkBAIC04MDksNyArODEwLDcgQEAKIAlERUNPREVfVEFJTDsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX3JlbmV3KHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIGNsaWVudGlkX3QgKmNsaWVudGlkKQogewogCURFQ09ERV9IRUFEOwpAQCAtODIwLDcgKzgyMSw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9zZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQogewogCURFQ09ERV9IRUFEOwpAQCAtODM0LDcgKzgzNSw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9zZXRjbGllbnRpZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNldGNsaWVudGlkKQogewogCURFQ09ERV9IRUFEOwpAQCAtODU5LDcgKzg2MCw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtICpzY2RfYykKIHsKIAlERUNPREVfSEVBRDsKQEAgLTg3Miw3ICs4NzMsNyBAQAogfQogCiAvKiBBbHNvIHVzZWQgZm9yIE5WRVJJRlkgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV92ZXJpZnkoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3ZlcmlmeSAqdmVyaWZ5KQogewogI2lmIDAKQEAgLTkwOCw3ICs5MDksNyBAQAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfd3JpdGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3dyaXRlICp3cml0ZSkKIHsKIAlpbnQgYXZhaWw7CkBAIC05NTEsMTUgKzk1MiwxNSBAQAogCQkJYXJncC0+cGFnZWxlbiAtPSBsZW47CiAJCX0KIAl9Ci0JYXJncC0+ZW5kID0gKHUzMiopIChhcmdwLT5ycXN0cC0+cnFfdmVjW3ZdLmlvdl9iYXNlICsgYXJncC0+cnFzdHAtPnJxX3ZlY1t2XS5pb3ZfbGVuKTsKLQlhcmdwLT5wID0gKHUzMiopICAoYXJncC0+cnFzdHAtPnJxX3ZlY1t2XS5pb3ZfYmFzZSArIChYRFJfUVVBRExFTihsZW4pIDw8IDIpKTsKKwlhcmdwLT5lbmQgPSAoX19iZTMyKikgKGFyZ3AtPnJxc3RwLT5ycV92ZWNbdl0uaW92X2Jhc2UgKyBhcmdwLT5ycXN0cC0+cnFfdmVjW3ZdLmlvdl9sZW4pOworCWFyZ3AtPnAgPSAoX19iZTMyKikgIChhcmdwLT5ycXN0cC0+cnFfdmVjW3ZdLmlvdl9iYXNlICsgKFhEUl9RVUFETEVOKGxlbikgPDwgMikpOwogCWFyZ3AtPnJxc3RwLT5ycV92ZWNbdl0uaW92X2xlbiA9IGxlbjsKIAl3cml0ZS0+d3JfdmxlbiA9IHYrMTsKIAogCURFQ09ERV9UQUlMOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfcmVsZWFzZV9sb2Nrb3duZXIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3JlbGVhc2VfbG9ja293bmVyICpybG9ja293bmVyKQogewogCURFQ09ERV9IRUFEOwpAQCAtOTczLDcgKzk3NCw3IEBACiAJREVDT0RFX1RBSUw7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9jb21wb3VuZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwKQogewogCURFQ09ERV9IRUFEOwpAQCAtMTE3OSw3ICsxMTgwLDcgQEAKICAqIHRhc2sgdG8gdHJhbnNsYXRlIHRoZW0gaW50byBMaW51eC1zcGVjaWZpYyB2ZXJzaW9ucyB3aGljaCBhcmUgbW9yZQogICogY29uc2lzdGVudCB3aXRoIHRoZSBzdHlsZSB1c2VkIGluIE5GU3YyL3YzLi4uCiAgKi8KLSNkZWZpbmUgRU5DT0RFX0hFQUQgICAgICAgICAgICAgIHUzMiAqcAorI2RlZmluZSBFTkNPREVfSEVBRCAgICAgICAgICAgICAgX19iZTMyICpwCiAKICNkZWZpbmUgV1JJVEUzMihuKSAgICAgICAgICAgICAgICpwKysgPSBodG9ubChuKQogI2RlZmluZSBXUklURTY0KG4pICAgICAgICAgICAgICAgZG8gewkJCQlcCkBAIC0xMjA5LDggKzEyMTAsOCBAQAogICogSGVhZGVyIHJvdXRpbmUgdG8gc2V0dXAgc2VxaWQgb3BlcmF0aW9uIHJlcGxheSBjYWNoZQogICovCiAjZGVmaW5lIEVOQ09ERV9TRVFJRF9PUF9IRUFECQkJCQlcCi0JdTMyICpwOwkJCQkJCQlcCi0JdTMyICpzYXZlOwkJCQkJCVwKKwlfX2JlMzIgKnA7CQkJCQkJXAorCV9fYmUzMiAqc2F2ZTsJCQkJCQlcCiAJCQkJCQkJCVwKIAlzYXZlID0gcmVzcC0+cDsKIApAQCAtMTIzNCwxMSArMTIzNSwxMSBAQAogLyogRW5jb2RlIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhlIHN0cmluZyBnaXZlbiB3aXRoIGNvbXBvbmVudHMKICAqIHNlcGVyYXRlZCBAc2VwLgogICovCi1zdGF0aWMgaW50IG5mc2Q0X2VuY29kZV9jb21wb25lbnRzKGNoYXIgc2VwLCBjaGFyICpjb21wb25lbnRzLAotCQkJCSAgIHUzMiAqKnBwLCBpbnQgKmJ1ZmxlbikKK3N0YXRpYyBfX2JlMzIgbmZzZDRfZW5jb2RlX2NvbXBvbmVudHMoY2hhciBzZXAsIGNoYXIgKmNvbXBvbmVudHMsCisJCQkJICAgX19iZTMyICoqcHAsIGludCAqYnVmbGVuKQogewotCXUzMiAqcCA9ICpwcDsKLQl1MzIgKmNvdW50cCA9IHA7CisJX19iZTMyICpwID0gKnBwOworCV9fYmUzMiAqY291bnRwID0gcDsKIAlpbnQgc3RybGVuLCBjb3VudD0wOwogCWNoYXIgKnN0ciwgKmVuZDsKIApAQCAtMTI3MSwxMSArMTI3MiwxMSBAQAogLyoKICAqIGVuY29kZSBhIGxvY2F0aW9uIGVsZW1lbnQgb2YgYSBmc19sb2NhdGlvbnMgc3RydWN0dXJlCiAgKi8KLXN0YXRpYyBpbnQgbmZzZDRfZW5jb2RlX2ZzX2xvY2F0aW9uNChzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb24gKmxvY2F0aW9uLAotCQkJCSAgICB1MzIgKipwcCwgaW50ICpidWZsZW4pCitzdGF0aWMgX19iZTMyIG5mc2Q0X2VuY29kZV9mc19sb2NhdGlvbjQoc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9uICpsb2NhdGlvbiwKKwkJCQkgICAgX19iZTMyICoqcHAsIGludCAqYnVmbGVuKQogewotCWludCBzdGF0dXM7Ci0JdTMyICpwID0gKnBwOworCV9fYmUzMiBzdGF0dXM7CisJX19iZTMyICpwID0gKnBwOwogCiAJc3RhdHVzID0gbmZzZDRfZW5jb2RlX2NvbXBvbmVudHMoJzonLCBsb2NhdGlvbi0+aG9zdHMsICZwLCBidWZsZW4pOwogCWlmIChzdGF0dXMpCkBAIC0xMjkyLDE2ICsxMjkzLDE1IEBACiAgKiBSZXR1cm5lZCBzdHJpbmcgaXMgc2FmZSB0byB1c2UgYXMgbG9uZyBhcyB0aGUgY2FsbGVyIGhvbGRzIGEgcmVmZXJlbmNlCiAgKiB0byBAZXhwLgogICovCi1zdGF0aWMgY2hhciAqbmZzZDRfcGF0aChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQorc3RhdGljIGNoYXIgKm5mc2Q0X3BhdGgoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgX19iZTMyICpzdGF0KQogewogCXN0cnVjdCBzdmNfZmggdG1wX2ZoOwogCWNoYXIgKnBhdGgsICpyb290cGF0aDsKLQlpbnQgc3RhdDsKIAogCWZoX2luaXQoJnRtcF9maCwgTkZTNF9GSFNJWkUpOwotCXN0YXQgPSBleHBfcHNldWRvcm9vdChycXN0cC0+cnFfY2xpZW50LCAmdG1wX2ZoLCAmcnFzdHAtPnJxX2NoYW5kbGUpOwotCWlmIChzdGF0KQotCQlyZXR1cm4gRVJSX1BUUihzdGF0KTsKKwkqc3RhdCA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLT5ycV9jbGllbnQsICZ0bXBfZmgsICZycXN0cC0+cnFfY2hhbmRsZSk7CisJaWYgKCpzdGF0KQorCQlyZXR1cm4gTlVMTDsKIAlyb290cGF0aCA9IHRtcF9maC5maF9leHBvcnQtPmV4X3BhdGg7CiAKIAlwYXRoID0gZXhwLT5leF9wYXRoOwpAQCAtMTMwOSw3ICsxMzA5LDggQEAKIAlpZiAoc3RybmNtcChwYXRoLCByb290cGF0aCwgc3RybGVuKHJvb3RwYXRoKSkpIHsKIAkJcHJpbnRrKCJuZnNkOiBmc19sb2NhdGlvbnMgZmFpbGVkOyIKIAkJCSIlcyBpcyBub3QgY29udGFpbmVkIGluICVzXG4iLCBwYXRoLCByb290cGF0aCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKKwkJKnN0YXQgPSBuZnNlcnJfbm90c3VwcDsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcmV0dXJuIHBhdGggKyBzdHJsZW4ocm9vdHBhdGgpOwpAQCAtMTMxOCwxNyArMTMxOSwxOCBAQAogLyoKICAqICBlbmNvZGUgYSBmc19sb2NhdGlvbnMgc3RydWN0dXJlCiAgKi8KLXN0YXRpYyBpbnQgbmZzZDRfZW5jb2RlX2ZzX2xvY2F0aW9ucyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorc3RhdGljIF9fYmUzMiBuZnNkNF9lbmNvZGVfZnNfbG9jYXRpb25zKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCQkJICAgICBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAotCQkJCSAgICAgdTMyICoqcHAsIGludCAqYnVmbGVuKQorCQkJCSAgICAgX19iZTMyICoqcHAsIGludCAqYnVmbGVuKQogewotCWludCBzdGF0dXMsIGk7Ci0JdTMyICpwID0gKnBwOworCV9fYmUzMiBzdGF0dXM7CisJaW50IGk7CisJX19iZTMyICpwID0gKnBwOwogCXN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgKmZzbG9jcyA9ICZleHAtPmV4X2ZzbG9jczsKLQljaGFyICpyb290ID0gbmZzZDRfcGF0aChycXN0cCwgZXhwKTsKKwljaGFyICpyb290ID0gbmZzZDRfcGF0aChycXN0cCwgZXhwLCAmc3RhdHVzKTsKIAotCWlmIChJU19FUlIocm9vdCkpCi0JCXJldHVybiBQVFJfRVJSKHJvb3QpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CiAJc3RhdHVzID0gbmZzZDRfZW5jb2RlX2NvbXBvbmVudHMoJy8nLCByb290LCAmcCwgYnVmbGVuKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMTM1Miw5ICsxMzU0LDkgQEAKICAgICAgICAgTkY0U09DSywgTkY0QkFELCAgTkY0TE5LLCBORjRCQUQsCiB9OwogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9lbmNvZGVfbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgd2hvdHlwZSwgdWlkX3QgaWQsIGludCBncm91cCwKLQkJCXUzMiAqKnAsIGludCAqYnVmbGVuKQorCQkJX19iZTMyICoqcCwgaW50ICpidWZsZW4pCiB7CiAJaW50IHN0YXR1czsKIApAQCAtMTM3NCwyMSArMTM3NiwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotbmZzZDRfZW5jb2RlX3VzZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdWlkX3QgdWlkLCB1MzIgKipwLCBpbnQgKmJ1ZmxlbikKK3N0YXRpYyBpbmxpbmUgX19iZTMyCituZnNkNF9lbmNvZGVfdXNlcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1aWRfdCB1aWQsIF9fYmUzMiAqKnAsIGludCAqYnVmbGVuKQogewogCXJldHVybiBuZnNkNF9lbmNvZGVfbmFtZShycXN0cCwgTkZTNF9BQ0xfV0hPX05BTUVELCB1aWQsIDAsIHAsIGJ1Zmxlbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1uZnNkNF9lbmNvZGVfZ3JvdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdWlkX3QgZ2lkLCB1MzIgKipwLCBpbnQgKmJ1ZmxlbikKK3N0YXRpYyBpbmxpbmUgX19iZTMyCituZnNkNF9lbmNvZGVfZ3JvdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdWlkX3QgZ2lkLCBfX2JlMzIgKipwLCBpbnQgKmJ1ZmxlbikKIHsKIAlyZXR1cm4gbmZzZDRfZW5jb2RlX25hbWUocnFzdHAsIE5GUzRfQUNMX1dIT19OQU1FRCwgZ2lkLCAxLCBwLCBidWZsZW4pOwogfQogCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBfX2JlMzIKIG5mc2Q0X2VuY29kZV9hY2xuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB3aG90eXBlLCB1aWRfdCBpZCwgaW50IGdyb3VwLAotCQl1MzIgKipwLCBpbnQgKmJ1ZmxlbikKKwkJX19iZTMyICoqcCwgaW50ICpidWZsZW4pCiB7CiAJcmV0dXJuIG5mc2Q0X2VuY29kZV9uYW1lKHJxc3RwLCB3aG90eXBlLCBpZCwgZ3JvdXAsIHAsIGJ1Zmxlbik7CiB9CkBAIC0xMzk3LDcgKzEzOTksNyBAQAogCQkJICAgICAgRkFUVFI0X1dPUkQwX1JEQVRUUl9FUlJPUikKICNkZWZpbmUgV09SRDFfQUJTRU5UX0ZTX0FUVFJTIEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRAogCi1zdGF0aWMgaW50IGZhdHRyX2hhbmRsZV9hYnNlbnRfZnModTMyICpibXZhbDAsIHUzMiAqYm12YWwxLCB1MzIgKnJkYXR0cl9lcnIpCitzdGF0aWMgX19iZTMyIGZhdHRyX2hhbmRsZV9hYnNlbnRfZnModTMyICpibXZhbDAsIHUzMiAqYm12YWwxLCB1MzIgKnJkYXR0cl9lcnIpCiB7CiAJLyogQXMgcGVyIHJlZmVycmFsIGRyYWZ0OiAgKi8KIAlpZiAoKmJtdmFsMCAmIH5XT1JEMF9BQlNFTlRfRlNfQVRUUlMgfHwKQEAgLTE0MjAsOSArMTQyMiw5IEBACiAgKiBAY291bnRwIGlzIHRoZSBidWZmZXIgc2l6ZSBpbiBfd29yZHNfOyB1cG9uIHN1Y2Nlc3NmdWwgcmV0dXJuIHRoaXMgYmVjb21lcwogICogcmVwbGFjZWQgd2l0aCB0aGUgbnVtYmVyIG9mIHdvcmRzIHdyaXR0ZW4uCiAgKi8KLWludAorX19iZTMyCiBuZnNkNF9lbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAotCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHUzMiAqYnVmZmVyLCBpbnQgKmNvdW50cCwgdTMyICpibXZhbCwKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX2JlMzIgKmJ1ZmZlciwgaW50ICpjb3VudHAsIHUzMiAqYm12YWwsCiAJCXN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCiB7CiAJdTMyIGJtdmFsMCA9IGJtdmFsWzBdOwpAQCAtMTQzMSwxMiArMTQzMywxMyBAQAogCXN0cnVjdCBzdmNfZmggdGVtcGZoOwogCXN0cnVjdCBrc3RhdGZzIHN0YXRmczsKIAlpbnQgYnVmbGVuID0gKmNvdW50cCA8PCAyOwotCXUzMiAqYXR0cmxlbnA7CisJX19iZTMyICphdHRybGVucDsKIAl1MzIgZHVtbXk7CiAJdTY0IGR1bW15NjQ7CiAJdTMyIHJkYXR0cl9lcnIgPSAwOwotCXUzMiAqcCA9IGJ1ZmZlcjsKLQlpbnQgc3RhdHVzOworCV9fYmUzMiAqcCA9IGJ1ZmZlcjsKKwlfX2JlMzIgc3RhdHVzOworCWludCBlcnI7CiAJaW50IGFjbHN1cHBvcnQgPSAwOwogCXN0cnVjdCBuZnM0X2FjbCAqYWNsID0gTlVMTDsKIApAQCAtMTQ1MCwxNCArMTQ1MywxNCBAQAogCQkJZ290byBvdXQ7CiAJfQogCi0Jc3RhdHVzID0gdmZzX2dldGF0dHIoZXhwLT5leF9tbnQsIGRlbnRyeSwgJnN0YXQpOwotCWlmIChzdGF0dXMpCisJZXJyID0gdmZzX2dldGF0dHIoZXhwLT5leF9tbnQsIGRlbnRyeSwgJnN0YXQpOworCWlmIChlcnIpCiAJCWdvdG8gb3V0X25mc2VycjsKIAlpZiAoKGJtdmFsMCAmIChGQVRUUjRfV09SRDBfRklMRVNfRlJFRSB8IEZBVFRSNF9XT1JEMF9GSUxFU19UT1RBTCkpIHx8CiAJICAgIChibXZhbDEgJiAoRkFUVFI0X1dPUkQxX1NQQUNFX0FWQUlMIHwgRkFUVFI0X1dPUkQxX1NQQUNFX0ZSRUUgfAogCQkgICAgICAgRkFUVFI0X1dPUkQxX1NQQUNFX1RPVEFMKSkpIHsKLQkJc3RhdHVzID0gdmZzX3N0YXRmcyhkZW50cnksICZzdGF0ZnMpOwotCQlpZiAoc3RhdHVzKQorCQllcnIgPSB2ZnNfc3RhdGZzKGRlbnRyeSwgJnN0YXRmcyk7CisJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9uZnNlcnI7CiAJfQogCWlmICgoYm12YWwwICYgKEZBVFRSNF9XT1JEMF9GSUxFSEFORExFIHwgRkFUVFI0X1dPUkQwX0ZTSUQpKSAmJiAhZmhwKSB7CkBAIC0xNDY5LDE1ICsxNDcyLDE1IEBACiAJfQogCWlmIChibXZhbDAgJiAoRkFUVFI0X1dPUkQwX0FDTCB8IEZBVFRSNF9XT1JEMF9BQ0xTVVBQT1JUCiAJCQl8IEZBVFRSNF9XT1JEMF9TVVBQT1JURURfQVRUUlMpKSB7Ci0JCXN0YXR1cyA9IG5mc2Q0X2dldF9uZnM0X2FjbChycXN0cCwgZGVudHJ5LCAmYWNsKTsKLQkJYWNsc3VwcG9ydCA9IChzdGF0dXMgPT0gMCk7CisJCWVyciA9IG5mc2Q0X2dldF9uZnM0X2FjbChycXN0cCwgZGVudHJ5LCAmYWNsKTsKKwkJYWNsc3VwcG9ydCA9IChlcnIgPT0gMCk7CiAJCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfQUNMKSB7Ci0JCQlpZiAoc3RhdHVzID09IC1FT1BOT1RTVVBQKQorCQkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKIAkJCQlibXZhbDAgJj0gfkZBVFRSNF9XT1JEMF9BQ0w7Ci0JCQllbHNlIGlmIChzdGF0dXMgPT0gLUVJTlZBTCkgeworCQkJZWxzZSBpZiAoZXJyID09IC1FSU5WQUwpIHsKIAkJCQlzdGF0dXMgPSBuZnNlcnJfYXR0cm5vdHN1cHA7CiAJCQkJZ290byBvdXQ7Ci0JCQl9IGVsc2UgaWYgKHN0YXR1cyAhPSAwKQorCQkJfSBlbHNlIGlmIChlcnIgIT0gMCkKIAkJCQlnb3RvIG91dF9uZnNlcnI7CiAJCX0KIAl9CkBAIC0xODE3LDcgKzE4MjAsNyBAQAogCQlmaF9wdXQoJnRlbXBmaCk7CiAJcmV0dXJuIHN0YXR1czsKIG91dF9uZnNlcnI6Ci0Jc3RhdHVzID0gbmZzZXJybm8oc3RhdHVzKTsKKwlzdGF0dXMgPSBuZnNlcnJubyhlcnIpOwogCWdvdG8gb3V0Owogb3V0X3Jlc291cmNlOgogCSpjb3VudHAgPSAwOwpAQCAtMTgyOCwxMyArMTgzMSwxMyBAQAogCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkNF9lbmNvZGVfZGlyZW50X2ZhdHRyKHN0cnVjdCBuZnNkNF9yZWFkZGlyICpjZCwKLQkJY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbiwgdTMyICpwLCBpbnQgKmJ1ZmxlbikKKwkJY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbiwgX19iZTMyICpwLCBpbnQgKmJ1ZmxlbikKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwID0gY2QtPnJkX2ZocC0+ZmhfZXhwb3J0OwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLQlpbnQgbmZzZXJyOworCV9fYmUzMiBuZnNlcnI7CiAKIAlkZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLCBjZC0+cmRfZmhwLT5maF9kZW50cnksIG5hbWxlbik7CiAJaWYgKElTX0VSUihkZW50cnkpKQpAQCAtMTg0MiwxNSArMTg0NSwxMSBAQAogCiAJZXhwX2dldChleHApOwogCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgewotCQlpZiAobmZzZF9jcm9zc19tbnQoY2QtPnJkX3Jxc3RwLCAmZGVudHJ5LCAmZXhwKSkgewotCQkvKgotCQkgKiAtRUFHQUlOIGlzIHRoZSBvbmx5IGVycm9yIHJldHVybmVkIGZyb20KLQkJICogbmZzZF9jcm9zc19tbnQoKSBhbmQgaXQgaW5kaWNhdGVzIHRoYXQgYW4KLQkJICogdXAtY2FsbCBoYXMgIGJlZW4gaW5pdGlhdGVkIHRvIGZpbGwgaW4gdGhlIGV4cG9ydAotCQkgKiBvcHRpb25zIG9uIGV4cC4gIFdoZW4gdGhlIGFuc3dlciBjb21lcyBiYWNrLAotCQkgKiB0aGlzIGNhbGwgd2lsbCBiZSByZXRyaWVkLgotCQkgKi8KLQkJCW5mc2VyciA9IG5mc2Vycl9kcm9waXQ7CisJCWludCBlcnI7CisKKwkJZXJyID0gbmZzZF9jcm9zc19tbnQoY2QtPnJkX3Jxc3RwLCAmZGVudHJ5LCAmZXhwKTsKKwkJaWYgKGVycikgeworCQkJbmZzZXJyID0gbmZzZXJybm8oZXJyKTsKIAkJCWdvdG8gb3V0X3B1dDsKIAkJfQogCkBAIC0xODYzLDEwICsxODYyLDEwIEBACiAJcmV0dXJuIG5mc2VycjsKIH0KIAotc3RhdGljIHUzMiAqCi1uZnNkNF9lbmNvZGVfcmRhdHRyX2Vycm9yKHUzMiAqcCwgaW50IGJ1ZmxlbiwgaW50IG5mc2VycikKK3N0YXRpYyBfX2JlMzIgKgorbmZzZDRfZW5jb2RlX3JkYXR0cl9lcnJvcihfX2JlMzIgKnAsIGludCBidWZsZW4sIF9fYmUzMiBuZnNlcnIpCiB7Ci0JdTMyICphdHRybGVucDsKKwlfX2JlMzIgKmF0dHJsZW5wOwogCiAJaWYgKGJ1ZmxlbiA8IDYpCiAJCXJldHVybiBOVUxMOwpAQCAtMTg4Niw4ICsxODg1LDggQEAKIHsKIAlzdHJ1Y3QgbmZzZDRfcmVhZGRpciAqY2QgPSBjb250YWluZXJfb2YoY2NkLCBzdHJ1Y3QgbmZzZDRfcmVhZGRpciwgY29tbW9uKTsKIAlpbnQgYnVmbGVuOwotCXUzMiAqcCA9IGNkLT5idWZmZXI7Ci0JaW50IG5mc2VyciA9IG5mc2Vycl90b29zbWFsbDsKKwlfX2JlMzIgKnAgPSBjZC0+YnVmZmVyOworCV9fYmUzMiBuZnNlcnIgPSBuZnNlcnJfdG9vc21hbGw7CiAKIAkvKiBJbiBuZnN2NCwgIi4iIGFuZCAiLi4iIG5ldmVyIG1ha2UgaXQgb250byB0aGUgd2lyZS4uICovCiAJaWYgKG5hbWUgJiYgaXNkb3RlbnQobmFtZSwgbmFtbGVuKSkgewpAQCAtMTk0Myw3ICsxOTQyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9hY2Nlc3Moc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfYWNjZXNzICphY2Nlc3MpCituZnNkNF9lbmNvZGVfYWNjZXNzKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X2FjY2VzcyAqYWNjZXNzKQogewogCUVOQ09ERV9IRUFEOwogCkBAIC0xOTU2LDcgKzE5NTUsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX2Nsb3NlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2Nsb3NlICpjbG9zZSkKK25mc2Q0X2VuY29kZV9jbG9zZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9jbG9zZSAqY2xvc2UpCiB7CiAJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CiAKQEAgLTE5NzEsNyArMTk3MCw3IEBACiAKIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9jb21taXQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfY29tbWl0ICpjb21taXQpCituZnNkNF9lbmNvZGVfY29tbWl0KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X2NvbW1pdCAqY29tbWl0KQogewogCUVOQ09ERV9IRUFEOwogCkBAIC0xOTgzLDcgKzE5ODIsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX2NyZWF0ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9jcmVhdGUgKmNyZWF0ZSkKK25mc2Q0X2VuY29kZV9jcmVhdGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfY3JlYXRlICpjcmVhdGUpCiB7CiAJRU5DT0RFX0hFQUQ7CiAKQEAgLTE5OTcsOCArMTk5Niw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50Ci1uZnNkNF9lbmNvZGVfZ2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9nZXRhdHRyICpnZXRhdHRyKQorc3RhdGljIF9fYmUzMgorbmZzZDRfZW5jb2RlX2dldGF0dHIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfZ2V0YXR0ciAqZ2V0YXR0cikKIHsKIAlzdHJ1Y3Qgc3ZjX2ZoICpmaHAgPSBnZXRhdHRyLT5nYV9maHA7CiAJaW50IGJ1ZmxlbjsKQEAgLTIwMTYsNyArMjAxNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfZ2V0Zmgoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCituZnNkNF9lbmNvZGVfZ2V0Zmgoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCiB7CiAJdW5zaWduZWQgaW50IGxlbjsKIAlFTkNPREVfSEVBRDsKQEAgLTIwNTYsNyArMjA1NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfbG9jayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKQorbmZzZDRfZW5jb2RlX2xvY2soc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfbG9jayAqbG9jaykKIHsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKIApAQCAtMjA3MiwxNCArMjA3MSwxNCBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX2xvY2t0KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKK25mc2Q0X2VuY29kZV9sb2NrdChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9sb2NrdCAqbG9ja3QpCiB7CiAJaWYgKG5mc2VyciA9PSBuZnNlcnJfZGVuaWVkKQogCQluZnNkNF9lbmNvZGVfbG9ja19kZW5pZWQocmVzcCwgJmxvY2t0LT5sdF9kZW5pZWQpOwogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX2xvY2t1KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xvY2t1ICpsb2NrdSkKK25mc2Q0X2VuY29kZV9sb2NrdShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9sb2NrdSAqbG9ja3UpCiB7CiAJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CiAKQEAgLTIwOTUsNyArMjA5NCw3IEBACiAKIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9saW5rKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xpbmsgKmxpbmspCituZnNkNF9lbmNvZGVfbGluayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9saW5rICpsaW5rKQogewogCUVOQ09ERV9IRUFEOwogCkBAIC0yMTA4LDcgKzIxMDcsNyBAQAogCiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfb3BlbihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQorbmZzZDRfZW5jb2RlX29wZW4oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKIHsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKIApAQCAtMjE3Myw3ICsyMTcyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3Blbl9jb25maXJtICpvYykKK25mc2Q0X2VuY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3Blbl9jb25maXJtICpvYykKIHsKIAlFTkNPREVfU0VRSURfT1BfSEVBRDsKIAkJCQkgICAgICAgIApAQCAtMjE4OCw3ICsyMTg3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuX2Rvd25ncmFkZSAqb2QpCituZnNkNF9lbmNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3Blbl9kb3duZ3JhZGUgKm9kKQogewogCUVOQ09ERV9TRVFJRF9PUF9IRUFEOwogCQkJCSAgICAgICAgCkBAIC0yMjAyLDggKzIyMDEsOCBAQAogCUVOQ09ERV9TRVFJRF9PUF9UQUlMKG9kLT5vZF9zdGF0ZW93bmVyKTsKIH0KIAotc3RhdGljIGludAotbmZzZDRfZW5jb2RlX3JlYWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLAorc3RhdGljIF9fYmUzMgorbmZzZDRfZW5jb2RlX3JlYWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLAogCQkgIHN0cnVjdCBuZnNkNF9yZWFkICpyZWFkKQogewogCXUzMiBlb2Y7CkBAIC0yMjY3LDggKzIyNjYsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1uZnNkNF9lbmNvZGVfcmVhZGxpbmsoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVhZGxpbmsgKnJlYWRsaW5rKQorc3RhdGljIF9fYmUzMgorbmZzZDRfZW5jb2RlX3JlYWRsaW5rKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlYWRsaW5rICpyZWFkbGluaykKIHsKIAlpbnQgbWF4Y291bnQ7CiAJY2hhciAqcGFnZTsKQEAgLTIzMTUsMTIgKzIzMTQsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotbmZzZDRfZW5jb2RlX3JlYWRkaXIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVhZGRpciAqcmVhZGRpcikKK3N0YXRpYyBfX2JlMzIKK25mc2Q0X2VuY29kZV9yZWFkZGlyKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlYWRkaXIgKnJlYWRkaXIpCiB7CiAJaW50IG1heGNvdW50OwogCWxvZmZfdCBvZmZzZXQ7Ci0JdTMyICpwYWdlLCAqc2F2ZXAsICp0YWlsYmFzZTsKKwlfX2JlMzIgKnBhZ2UsICpzYXZlcCwgKnRhaWxiYXNlOwogCUVOQ09ERV9IRUFEOwogCiAJaWYgKG5mc2VycikKQEAgLTIzOTUsNyArMjM5NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfcmVtb3ZlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlbW92ZSAqcmVtb3ZlKQorbmZzZDRfZW5jb2RlX3JlbW92ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9yZW1vdmUgKnJlbW92ZSkKIHsKIAlFTkNPREVfSEVBRDsKIApAQCAtMjQwNyw3ICsyNDA2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5mc2Q0X2VuY29kZV9yZW5hbWUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVuYW1lICpyZW5hbWUpCituZnNkNF9lbmNvZGVfcmVuYW1lKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlbmFtZSAqcmVuYW1lKQogewogCUVOQ09ERV9IRUFEOwogCkBAIC0yNDI0LDcgKzI0MjMsNyBAQAogICogcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3Igc3RhdHVzLgogICovCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX3NldGF0dHIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKK25mc2Q0X2VuY29kZV9zZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgX19iZTMyIG5mc2Vyciwgc3RydWN0IG5mc2Q0X3NldGF0dHIgKnNldGF0dHIpCiB7CiAJRU5DT0RFX0hFQUQ7CiAKQEAgLTI0NDMsNyArMjQ0Miw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uZnNkNF9lbmNvZGVfc2V0Y2xpZW50aWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNjZCkKK25mc2Q0X2VuY29kZV9zZXRjbGllbnRpZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZCAqc2NkKQogewogCUVOQ09ERV9IRUFEOwogCkBAIC0yNDYyLDcgKzI0NjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbmZzZDRfZW5jb2RlX3dyaXRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3dyaXRlICp3cml0ZSkKK25mc2Q0X2VuY29kZV93cml0ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF93cml0ZSAqd3JpdGUpCiB7CiAJRU5DT0RFX0hFQUQ7CiAKQEAgLTI0NzgsNyArMjQ3Nyw3IEBACiB2b2lkCiBuZnNkNF9lbmNvZGVfb3BlcmF0aW9uKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgc3RydWN0IG5mc2Q0X29wICpvcCkKIHsKLQl1MzIgKnN0YXRwOworCV9fYmUzMiAqc3RhdHA7CiAJRU5DT0RFX0hFQUQ7CiAKIAlSRVNFUlZFX1NQQUNFKDgpOwpAQCAtMjYxNiw3ICsyNjE1LDcgQEAKICAqLwogCiBpbnQKLW5mczRzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK25mczRzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKICAgICAgICAgcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KQEAgLTI2MzgsOSArMjYzNyw5IEBACiB9CiAKIGludAotbmZzNHN2Y19kZWNvZGVfY29tcG91bmRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncykKK25mczRzdmNfZGVjb2RlX2NvbXBvdW5kYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3MpCiB7Ci0JaW50IHN0YXR1czsKKwlfX2JlMzIgc3RhdHVzOwogCiAJYXJncy0+cCA9IHA7CiAJYXJncy0+ZW5kID0gcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlICsgcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9sZW47CkBAIC0yNjU5LDcgKzI2NTgsNyBAQAogfQogCiBpbnQKLW5mczRzdmNfZW5jb2RlX2NvbXBvdW5kcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwKQorbmZzNHN2Y19lbmNvZGVfY29tcG91bmRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3ApCiB7CiAJLyoKIAkgKiBBbGwgdGhhdCByZW1haW5zIGlzIHRvIHdyaXRlIHRoZSB0YWcgYW5kIG9wZXJhdGlvbiBjb3VudC4uLgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjYWNoZS5jIGIvZnMvbmZzZC9uZnNjYWNoZS5jCmluZGV4IGZkZjdjZjMuLmY5MGQ3MDQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY2FjaGUuYworKysgYi9mcy9uZnNkL25mc2NhY2hlLmMKQEAgLTI5LDcgKzI5LDcgQEAKICAqLwogI2RlZmluZSBDQUNIRVNJWkUJCTEwMjQKICNkZWZpbmUgSEFTSFNJWkUJCTY0Ci0jZGVmaW5lIFJFUUhBU0goeGlkKQkJKCgoKHhpZCkgPj4gMjQpIF4gKHhpZCkpICYgKEhBU0hTSVpFLTEpKQorI2RlZmluZSBSRVFIQVNIKHhpZCkJCSgoKCgoX19mb3JjZSBfX3UzMil4aWQpID4+IDI0KSBeICgoX19mb3JjZSBfX3UzMil4aWQpKSAmIChIQVNIU0laRS0xKSkKIAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICoJaGFzaF9saXN0Owogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgCWxydV9oZWFkOwpAQCAtNjYsMTQgKzY2LDEzIEBACiAJCXByaW50ayAoS0VSTl9FUlIgIm5mc2Q6IGNhbm5vdCBhbGxvY2F0ZSBhbGwgJWQgY2FjaGUgZW50cmllcywgb25seSBnb3QgJWRcbiIsCiAJCQlDQUNIRVNJWkUsIENBQ0hFU0laRS1pKTsKIAotCWhhc2hfbGlzdCA9IGttYWxsb2MgKEhBU0hTSVpFICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaGFzaF9saXN0ID0ga2NhbGxvYyAoSEFTSFNJWkUsIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOwogCWlmICghaGFzaF9saXN0KSB7CiAJCW5mc2RfY2FjaGVfc2h1dGRvd24oKTsKIAkJcHJpbnRrIChLRVJOX0VSUiAibmZzZDogY2Fubm90IGFsbG9jYXRlICVaZCBieXRlcyBmb3IgaGFzaCBsaXN0XG4iLAogCQkJSEFTSFNJWkUgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKIAkJcmV0dXJuOwogCX0KLQltZW1zZXQoaGFzaF9saXN0LCAwLCBIQVNIU0laRSAqIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkpOwogCiAJY2FjaGVfZGlzYWJsZWQgPSAwOwogfQpAQCAtMTI3LDggKzEyNiw4IEBACiAJc3RydWN0IGhsaXN0X25vZGUJKmhuOwogCXN0cnVjdCBobGlzdF9oZWFkIAkqcmg7CiAJc3RydWN0IHN2Y19jYWNoZXJlcAkqcnA7Ci0JdTMyCQkJeGlkID0gcnFzdHAtPnJxX3hpZCwKLQkJCQlwcm90byA9ICBycXN0cC0+cnFfcHJvdCwKKwlfX2JlMzIJCQl4aWQgPSBycXN0cC0+cnFfeGlkOworCXUzMgkJCXByb3RvID0gIHJxc3RwLT5ycV9wcm90LAogCQkJCXZlcnMgPSBycXN0cC0+cnFfdmVycywKIAkJCQlwcm9jID0gcnFzdHAtPnJxX3Byb2M7CiAJdW5zaWduZWQgbG9uZwkJYWdlOwpAQCAtMjU4LDcgKzI1Nyw3IEBACiAgKiBJbiB0aGlzIGNhc2UsIG5mc2RfY2FjaGVfdXBkYXRlIGlzIGNhbGxlZCB3aXRoIHN0YXRwID09IE5VTEwuCiAgKi8KIHZvaWQKLW5mc2RfY2FjaGVfdXBkYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCBjYWNoZXR5cGUsIHUzMiAqc3RhdHApCituZnNkX2NhY2hlX3VwZGF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgY2FjaGV0eXBlLCBfX2JlMzIgKnN0YXRwKQogewogCXN0cnVjdCBzdmNfY2FjaGVyZXAgKnJwOwogCXN0cnVjdCBrdmVjCSpyZXN2ID0gJnJxc3RwLT5ycV9yZXMuaGVhZFswXSwgKmNhY2h2OwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKaW5kZXggMzlhZWQ5MC4uZWVkZjJlMyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjdGwuYworKysgYi9mcy9uZnNkL25mc2N0bC5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAogc3RhdGljIHNzaXplX3QgbmZzY3RsX3RyYW5zYWN0aW9uX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCiB7Ci0JaW5vX3QgaW5vID0gIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubzsKKwlpbm9fdCBpbm8gPSAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CiAJY2hhciAqZGF0YTsKIAlzc2l6ZV90IHJ2OwogCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2ZoLmMgYi9mcy9uZnNkL25mc2ZoLmMKaW5kZXggNTAxZDgzOC4uYjA2YmY5ZiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNmaC5jCisrKyBiL2ZzL25mc2QvbmZzZmguYwpAQCAtNzYsNyArNzYsNyBAQAogICogY29tbWVudCBpbiB0aGUgTkZTdjMgc3BlYyBzYXlzIHRoaXMgaXMgaW5jb3JyZWN0IChpbXBsZW1lbnRhdGlvbiBub3RlcyBmb3IKICAqIHRoZSB3cml0ZSBjYWxsKS4KICAqLwotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgX19iZTMyCiBuZnNkX21vZGVfY2hlY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdW1vZGVfdCBtb2RlLCBpbnQgdHlwZSkKIHsKIAkvKiBUeXBlIGNhbiBiZSBuZWdhdGl2ZSB3aGVuIGNyZWF0aW5nIGhhcmRsaW5rcyAtIG5vdCB0byBhIGRpciAqLwpAQCAtMTEwLDEzICsxMTAsMTMgQEAKICAqIFRoaXMgaXMgb25seSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGFuIG5mc3Byb2MgY2FsbCwgc28gZmhwIHBvaW50cyB0bwogICogYSBzdmNfZmggd2hpY2ggaXMgYWxsIDAgZXhjZXB0IGZvciB0aGUgb3Zlci10aGUtd2lyZSBmaWxlIGhhbmRsZS4KICAqLwotdTMyCitfX2JlMzIKIGZoX3ZlcmlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGludCB0eXBlLCBpbnQgYWNjZXNzKQogewogCXN0cnVjdCBrbmZzZF9maAkqZmggPSAmZmhwLT5maF9oYW5kbGU7CiAJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA9IE5VTEw7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5OwotCXUzMgkJZXJyb3IgPSAwOworCV9fYmUzMgkJZXJyb3IgPSAwOwogCiAJZHByaW50aygibmZzZDogZmhfdmVyaWZ5KCVzKVxuIiwgU1ZDRkhfZm10KGZocCkpOwogCkBAIC0xNjksOSArMTY5LDExIEBACiAJCQlleHAgPSBleHBfZmluZChycXN0cC0+cnFfY2xpZW50LCAwLCB0ZmgsICZycXN0cC0+cnFfY2hhbmRsZSk7CiAJCX0KIAotCQllcnJvciA9IG5mc2Vycl9kcm9waXQ7Ci0JCWlmIChJU19FUlIoZXhwKSAmJiBQVFJfRVJSKGV4cCkgPT0gLUVBR0FJTikKKwkJaWYgKElTX0VSUihleHApICYmIChQVFJfRVJSKGV4cCkgPT0gLUVBR0FJTgorCQkJCXx8IFBUUl9FUlIoZXhwKSA9PSAtRVRJTUVET1VUKSkgeworCQkJZXJyb3IgPSBuZnNlcnJubyhQVFJfRVJSKGV4cCkpOwogCQkJZ290byBvdXQ7CisJCX0KIAogCQllcnJvciA9IG5mc2Vycl9zdGFsZTsgCiAJCWlmICghZXhwIHx8IElTX0VSUihleHApKQpAQCAtMzE1LDcgKzMxNyw3IEBACiAJCWZoLT5vZmhfZGlyaW5vID0gMDsKIH0KIAotaW50CitfX2JlMzIKIGZoX2NvbXBvc2Uoc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBzdmNfZmggKnJlZl9maCkKIHsKIAkvKiByZWZfZmggaXMgYSByZWZlcmVuY2UgZmlsZSBoYW5kbGUuCkBAIC00NTEsNyArNDUzLDcgQEAKICAqIFVwZGF0ZSBmaWxlIGhhbmRsZSBpbmZvcm1hdGlvbiBhZnRlciBjaGFuZ2luZyBhIGRlbnRyeS4KICAqIFRoaXMgaXMgb25seSBjYWxsZWQgYnkgbmZzZF9jcmVhdGUsIG5mc2RfY3JlYXRlX3YzIGFuZCBuZnNkX3Byb2NfY3JlYXRlCiAgKi8KLWludAorX19iZTMyCiBmaF91cGRhdGUoc3RydWN0IHN2Y19maCAqZmhwKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzcHJvYy5jIGIvZnMvbmZzZC9uZnNwcm9jLmMKaW5kZXggOWVlMWRhYi4uZWM5ODNiNyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnNwcm9jLmMKQEAgLTMwLDIyICszMCwyMiBAQAogI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1BST0MKIAogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQogewogCXJldHVybiBuZnNfb2s7CiB9CiAKLXN0YXRpYyBpbnQKLW5mc2RfcmV0dXJuX2F0dHJzKGludCBlcnIsIHN0cnVjdCBuZnNkX2F0dHJzdGF0ICpyZXNwKQorc3RhdGljIF9fYmUzMgorbmZzZF9yZXR1cm5fYXR0cnMoX19iZTMyIGVyciwgc3RydWN0IG5mc2RfYXR0cnN0YXQgKnJlc3ApCiB7CiAJaWYgKGVycikgcmV0dXJuIGVycjsKIAlyZXR1cm4gbmZzZXJybm8odmZzX2dldGF0dHIocmVzcC0+ZmguZmhfZXhwb3J0LT5leF9tbnQsCiAJCQkJICAgIHJlc3AtPmZoLmZoX2RlbnRyeSwKIAkJCQkgICAgJnJlc3AtPnN0YXQpKTsKIH0KLXN0YXRpYyBpbnQKLW5mc2RfcmV0dXJuX2Rpcm9wKGludCBlcnIsIHN0cnVjdCBuZnNkX2Rpcm9wcmVzICpyZXNwKQorc3RhdGljIF9fYmUzMgorbmZzZF9yZXR1cm5fZGlyb3AoX19iZTMyIGVyciwgc3RydWN0IG5mc2RfZGlyb3ByZXMgKnJlc3ApCiB7CiAJaWYgKGVycikgcmV0dXJuIGVycjsKIAlyZXR1cm4gbmZzZXJybm8odmZzX2dldGF0dHIocmVzcC0+ZmguZmhfZXhwb3J0LT5leF9tbnQsCkBAIC01NiwxMSArNTYsMTEgQEAKICAqIEdldCBhIGZpbGUncyBhdHRyaWJ1dGVzCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCByZXNwLT5maCBuZWVkcyBhbiBmaF9wdXQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX2dldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfZmhhbmRsZSAgKmFyZ3AsCiAJCQkJCSAgc3RydWN0IG5mc2RfYXR0cnN0YXQgKnJlc3ApCiB7Ci0JaW50IG5mc2VycjsKKwlfX2JlMzIgbmZzZXJyOwogCWRwcmludGsoIm5mc2Q6IEdFVEFUVFIgICVzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CiAKIAlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKQEAgLTcyLDExICs3MiwxMSBAQAogICogU2V0IGEgZmlsZSdzIGF0dHJpYnV0ZXMKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIHJlc3AtPmZoIG5lZWRzIGFuIGZoX3B1dAogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2Nfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9zYXR0cmFyZ3MgKmFyZ3AsCiAJCQkJCSAgc3RydWN0IG5mc2RfYXR0cnN0YXQgICpyZXNwKQogewotCWludCBuZnNlcnI7CisJX19iZTMyIG5mc2VycjsKIAlkcHJpbnRrKCJuZnNkOiBTRVRBVFRSICAlcywgdmFsaWQ9JXgsIHNpemU9JWxkXG4iLAogCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKIAkJYXJncC0+YXR0cnMuaWFfdmFsaWQsIChsb25nKSBhcmdwLT5hdHRycy5pYV9zaXplKTsKQEAgLTkyLDExICs5MiwxMSBAQAogICogZG9lc24ndCBleGlzdCB5ZXQuCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCByZXNwLT5maCBuZWVkcyBhbiBmaF9wdXQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9kaXJvcGFyZ3MgKmFyZ3AsCiAJCQkJCSBzdHJ1Y3QgbmZzZF9kaXJvcHJlcyAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogTE9PS1VQICAgJXMgJS4qc1xuIiwKIAkJU1ZDRkhfZm10KCZhcmdwLT5maCksIGFyZ3AtPmxlbiwgYXJncC0+bmFtZSk7CkBAIC0xMTIsMTEgKzExMiwxMSBAQAogLyoKICAqIFJlYWQgYSBzeW1saW5rLgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2NfcmVhZGxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfcmVhZGxpbmthcmdzICphcmdwLAogCQkJCQkgICBzdHJ1Y3QgbmZzZF9yZWFkbGlua3JlcyAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBSRUFETElOSyAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOwogCkBAIC0xMzIsMTEgKzEzMiwxMSBAQAogICogUmVhZCBhIHBvcnRpb24gb2YgYSBmaWxlLgogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3JlYWRhcmdzICphcmdwLAogCQkJCSAgICAgICBzdHJ1Y3QgbmZzZF9yZWFkcmVzICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBSRUFEICAgICVzICVkIGJ5dGVzIGF0ICVkXG4iLAogCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKQEAgLTE3MiwxMSArMTcyLDExIEBACiAgKiBXcml0ZSBkYXRhIHRvIGEgZmlsZQogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY193cml0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF93cml0ZWFyZ3MgKmFyZ3AsCiAJCQkJCXN0cnVjdCBuZnNkX2F0dHJzdGF0ICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAJaW50CXN0YWJsZSA9IDE7CiAKIAlkcHJpbnRrKCJuZnNkOiBXUklURSAgICAlcyAlZCBieXRlcyBhdCAlZFxuIiwKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICogYW5kIHRoZSBhY3R1YWwgY3JlYXRlKCkgY2FsbCBpbiBjb21wbGlhbmNlIHdpdGggVkZTIHByb3RvY29scy4KICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBhcmdwLT5maCBhbmQgcmVzcC0+ZmggbmVlZCBhbiBmaF9wdXQKICAqLwotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9jcmVhdGVhcmdzICphcmdwLAogCQkJCQkgc3RydWN0IG5mc2RfZGlyb3ByZXMgICAqcmVzcCkKIHsKQEAgLTIwNiw3ICsyMDYsOCBAQAogCXN0cnVjdCBpYXR0cgkqYXR0ciA9ICZhcmdwLT5hdHRyczsKIAlzdHJ1Y3QgaW5vZGUJKmlub2RlOwogCXN0cnVjdCBkZW50cnkJKmRjaGlsZDsKLQlpbnQJCW5mc2VyciwgdHlwZSwgbW9kZTsKKwlpbnQJCXR5cGUsIG1vZGU7CisJX19iZTMyCQluZnNlcnI7CiAJZGV2X3QJCXJkZXYgPSAwLCB3YW50ZWQgPSBuZXdfZGVjb2RlX2RldihhdHRyLT5pYV9zaXplKTsKIAogCWRwcmludGsoIm5mc2Q6IENSRUFURSAgICVzICUuKnNcbiIsCkBAIC0zNDgsMTEgKzM0OSwxMSBAQAogCXJldHVybiBuZnNkX3JldHVybl9kaXJvcChuZnNlcnIsIHJlc3ApOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2NfcmVtb3ZlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2Rpcm9wYXJncyAqYXJncCwKIAkJCQkJIHZvaWQJCSAgICAgICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBSRU1PVkUgICAlcyAlLipzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKIAkJYXJncC0+bGVuLCBhcmdwLT5uYW1lKTsKQEAgLTM2MywxMSArMzY0LDExIEBACiAJcmV0dXJuIG5mc2VycjsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX3JlbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9yZW5hbWVhcmdzICphcmdwLAogCQkJCSAgCSB2b2lkCQkgICAgICAgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IFJFTkFNRSAgICVzICUuKnMgLT4gXG4iLAogCQlTVkNGSF9mbXQoJmFyZ3AtPmZmaCksIGFyZ3AtPmZsZW4sIGFyZ3AtPmZuYW1lKTsKQEAgLTM4MSwxMSArMzgyLDExIEBACiAJcmV0dXJuIG5mc2VycjsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX2xpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfbGlua2FyZ3MgKmFyZ3AsCiAJCQkJdm9pZAkJCSAgICAqcmVzcCkKIHsKLQlpbnQJbmZzZXJyOworCV9fYmUzMgluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBMSU5LICAgICAlcyAtPlxuIiwKIAkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpKTsKQEAgLTQwMSwxMiArNDAyLDEyIEBACiAJcmV0dXJuIG5mc2VycjsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF9wcm9jX3N5bWxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Rfc3ltbGlua2FyZ3MgKmFyZ3AsCiAJCQkJICAgICAgICAgIHZvaWQJCQkgICpyZXNwKQogewogCXN0cnVjdCBzdmNfZmgJbmV3Zmg7Ci0JaW50CQluZnNlcnI7CisJX19iZTMyCQluZnNlcnI7CiAKIAlkcHJpbnRrKCJuZnNkOiBTWU1MSU5LICAlcyAlLipzIC0+ICUuKnNcbiIsCiAJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmZoKSwgYXJncC0+ZmxlbiwgYXJncC0+Zm5hbWUsCkBAIC00MzAsMTEgKzQzMSwxMSBAQAogICogTWFrZSBkaXJlY3RvcnkuIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBpZGVtcG90ZW50LgogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19ta2RpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9jcmVhdGVhcmdzICphcmdwLAogCQkJCQlzdHJ1Y3QgbmZzZF9kaXJvcHJlcyAgICpyZXNwKQogewotCWludAluZnNlcnI7CisJX19iZTMyCW5mc2VycjsKIAogCWRwcmludGsoIm5mc2Q6IE1LRElSICAgICVzICUuKnNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLCBhcmdwLT5sZW4sIGFyZ3AtPm5hbWUpOwogCkBAIC00NTQsMTEgKzQ1NSwxMSBAQAogLyoKICAqIFJlbW92ZSBhIGRpcmVjdG9yeQogICovCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Byb2Nfcm1kaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfZGlyb3BhcmdzICphcmdwLAogCQkJCSAJdm9pZAkJICAgICAgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogUk1ESVIgICAgJXMgJS4qc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCksIGFyZ3AtPmxlbiwgYXJncC0+bmFtZSk7CiAKQEAgLTQ3MCwxMSArNDcxLDEyIEBACiAvKgogICogUmVhZCBhIHBvcnRpb24gb2YgYSBkaXJlY3RvcnkuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19yZWFkZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3JlYWRkaXJhcmdzICphcmdwLAogCQkJCQkgIHN0cnVjdCBuZnNkX3JlYWRkaXJyZXMgICpyZXNwKQogewotCWludAkJbmZzZXJyLCBjb3VudDsKKwlpbnQJCWNvdW50OworCV9fYmUzMgkJbmZzZXJyOwogCWxvZmZfdAkJb2Zmc2V0OwogCiAJZHByaW50aygibmZzZDogUkVBRERJUiAgJXMgJWQgYnl0ZXMgYXQgJWRcbiIsCkBAIC01MDksMTEgKzUxMSwxMSBAQAogLyoKICAqIEdldCBmaWxlIHN5c3RlbSBpbmZvCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyBfX2JlMzIKIG5mc2RfcHJvY19zdGF0ZnMoc3RydWN0IHN2Y19ycXN0ICogcnFzdHAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgICAqYXJncCwKIAkJCQkJICBzdHJ1Y3QgbmZzZF9zdGF0ZnNyZXMgKnJlc3ApCiB7Ci0JaW50CW5mc2VycjsKKwlfX2JlMzIJbmZzZXJyOwogCiAJZHByaW50aygibmZzZDogU1RBVEZTICAgJXNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKIApAQCAtNTc5LDExICs1ODEsMTEgQEAKIC8qCiAgKiBNYXAgZXJybm9zIHRvIE5GUyBlcnJub3MuCiAgKi8KLWludAorX19iZTMyCiBuZnNlcnJubyAoaW50IGVycm5vKQogewogCXN0YXRpYyBzdHJ1Y3QgewotCQlpbnQJbmZzZXJyOworCQlfX2JlMzIJbmZzZXJyOwogCQlpbnQJc3lzZXJyOwogCX0gbmZzX2VycnRibFtdID0gewogCQl7IG5mc19vaywgMCB9LApAQCAtNjE1LDExICs2MTcsMTAgQEAKIAkJeyBuZnNlcnJfYmFkbmFtZSwgLUVTUkNIIH0sCiAJCXsgbmZzZXJyX2lvLCAtRVRYVEJTWSB9LAogCQl7IG5mc2Vycl9ub3RzdXBwLCAtRU9QTk9UU1VQUCB9LAotCQl7IC0xLCAtRUlPIH0KIAl9OwogCWludAlpOwogCi0JZm9yIChpID0gMDsgbmZzX2VycnRibFtpXS5uZnNlcnIgIT0gLTE7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5mc19lcnJ0YmwpOyBpKyspIHsKIAkJaWYgKG5mc19lcnJ0YmxbaV0uc3lzZXJyID09IGVycm5vKQogCQkJcmV0dXJuIG5mc19lcnJ0YmxbaV0ubmZzZXJyOwogCX0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzc3ZjLmMgYi9mcy9uZnNkL25mc3N2Yy5jCmluZGV4IDAxM2IzODkuLjBhYWNjYjAgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzc3ZjLmMKKysrIGIvZnMvbmZzZC9uZnNzdmMuYwpAQCAtNDkxLDEyICs0OTEsMTIgQEAKIH0KIAogaW50Ci1uZnNkX2Rpc3BhdGNoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqc3RhdHApCituZnNkX2Rpc3BhdGNoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqc3RhdHApCiB7CiAJc3RydWN0IHN2Y19wcm9jZWR1cmUJKnByb2M7CiAJa3hkcnByb2NfdAkJeGRyOwotCXUzMgkJCW5mc2VycjsKLQl1MzIJCQkqbmZzZXJycDsKKwlfX2JlMzIJCQluZnNlcnI7CisJX19iZTMyCQkJKm5mc2VycnA7CiAKIAlkcHJpbnRrKCJuZnNkX2Rpc3BhdGNoOiB2ZXJzICVkIHByb2MgJWRcbiIsCiAJCQkJcnFzdHAtPnJxX3ZlcnMsIHJxc3RwLT5ycV9wcm9jKTsKQEAgLTUxNSw3ICs1MTUsNyBAQAogCiAJLyogRGVjb2RlIGFyZ3VtZW50cyAqLwogCXhkciA9IHByb2MtPnBjX2RlY29kZTsKLQlpZiAoeGRyICYmICF4ZHIocnFzdHAsICh1MzIqKXJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfYmFzZSwKKwlpZiAoeGRyICYmICF4ZHIocnFzdHAsIChfX2JlMzIqKXJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfYmFzZSwKIAkJCXJxc3RwLT5ycV9hcmdwKSkgewogCQlkcHJpbnRrKCJuZnNkOiBmYWlsZWQgdG8gZGVjb2RlIGFyZ3VtZW50cyFcbiIpOwogCQluZnNkX2NhY2hlX3VwZGF0ZShycXN0cCwgUkNfTk9DQUNIRSwgTlVMTCk7CkBAIC01MjgsNyArNTI4LDcgQEAKIAkgKi8KIAluZnNlcnJwID0gcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9iYXNlCiAJCSsgcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW47Ci0JcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW4gKz0gc2l6ZW9mKHUzMik7CisJcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW4gKz0gc2l6ZW9mKF9fYmUzMik7CiAKIAkvKiBOb3cgY2FsbCB0aGUgcHJvY2VkdXJlIGhhbmRsZXIsIGFuZCBlbmNvZGUgTkZTIHN0YXR1cy4gKi8KIAluZnNlcnIgPSBwcm9jLT5wY19mdW5jKHJxc3RwLCBycXN0cC0+cnFfYXJncCwgcnFzdHAtPnJxX3Jlc3ApOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnN4ZHIuYyBiL2ZzL25mc2QvbmZzeGRyLmMKaW5kZXggMTEzNWMwZC4uZjUyNDNmOSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnN4ZHIuYworKysgYi9mcy9uZnNkL25mc3hkci5jCkBAIC0xOCwxMSArMTgsNiBAQAogCiAjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfWERSCiAKLQotI2lmZGVmIE5GU0RfT1BUSU1JWkVfU1BBQ0UKLSMgZGVmaW5lIGlubGluZQotI2VuZGlmCi0KIC8qCiAgKiBNYXBwaW5nIG9mIFNfSUYqIHR5cGVzIHRvIE5GUyBmaWxlIHR5cGVzCiAgKi8KQEAgLTM3LDggKzMyLDggQEAKIC8qCiAgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBORlMgdHlwZXMKICAqLwotc3RhdGljIHUzMiAqCi1kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCitzdGF0aWMgX19iZTMyICoKK2RlY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAlmaF9pbml0KGZocCwgTkZTX0ZIU0laRSk7CiAJbWVtY3B5KCZmaHAtPmZoX2hhbmRsZS5maF9iYXNlLCBwLCBORlNfRkhTSVpFKTsKQEAgLTUwLDEzICs0NSwxMyBAQAogfQogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIE5GU3YyIEFDTCBjb2RlICovCi11MzIgKm5mczJzdmNfZGVjb2RlX2ZoKHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQorX19iZTMyICpuZnMyc3ZjX2RlY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAlyZXR1cm4gZGVjb2RlX2ZoKHAsIGZocCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLWVuY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3N0YXRpYyBfX2JlMzIgKgorZW5jb2RlX2ZoKF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQogewogCW1lbWNweShwLCAmZmhwLT5maF9oYW5kbGUuZmhfYmFzZSwgTkZTX0ZIU0laRSk7CiAJcmV0dXJuIHAgKyAoTkZTX0ZIU0laRT4+IDIpOwpAQCAtNjYsOCArNjEsOCBAQAogICogRGVjb2RlIGEgZmlsZSBuYW1lIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgcGF0aCBjb250YWlucwogICogbm8gc2xhc2hlcyBvciBudWxsIGJ5dGVzLgogICovCi1zdGF0aWMgaW5saW5lIHUzMiAqCi1kZWNvZGVfZmlsZW5hbWUodTMyICpwLCBjaGFyICoqbmFtcCwgaW50ICpsZW5wKQorc3RhdGljIF9fYmUzMiAqCitkZWNvZGVfZmlsZW5hbWUoX19iZTMyICpwLCBjaGFyICoqbmFtcCwgaW50ICpsZW5wKQogewogCWNoYXIJCSpuYW1lOwogCWludAkJaTsKQEAgLTgyLDggKzc3LDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgKgotZGVjb2RlX3BhdGhuYW1lKHUzMiAqcCwgY2hhciAqKm5hbXAsIGludCAqbGVucCkKK3N0YXRpYyBfX2JlMzIgKgorZGVjb2RlX3BhdGhuYW1lKF9fYmUzMiAqcCwgY2hhciAqKm5hbXAsIGludCAqbGVucCkKIHsKIAljaGFyCQkqbmFtZTsKIAlpbnQJCWk7CkBAIC05OCw4ICs5Myw4IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyICoKLWRlY29kZV9zYXR0cih1MzIgKnAsIHN0cnVjdCBpYXR0ciAqaWFwKQorc3RhdGljIF9fYmUzMiAqCitkZWNvZGVfc2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmlhcCkKIHsKIAl1MzIJdG1wLCB0bXAxOwogCkBAIC0xNTEsOCArMTQ2LDggQEAKIAlyZXR1cm4gcDsKIH0KIAotc3RhdGljIHUzMiAqCi1lbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCitzdGF0aWMgX19iZTMyICoKK2VuY29kZV9mYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCwKIAkgICAgIHN0cnVjdCBrc3RhdCAqc3RhdCkKIHsKIAlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKQEAgLTE5NSw3ICsxOTAsNyBAQAogfQogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIE5GU3YyIEFDTCBjb2RlICovCi11MzIgKm5mczJzdmNfZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQorX19iZTMyICpuZnMyc3ZjX2VuY29kZV9mYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKIAl2ZnNfZ2V0YXR0cihmaHAtPmZoX2V4cG9ydC0+ZXhfbW50LCBmaHAtPmZoX2RlbnRyeSwgJnN0YXQpOwpAQCAtMjA2LDEzICsyMDEsMTMgQEAKICAqIFhEUiBkZWNvZGUgZnVuY3Rpb25zCiAgKi8KIGludAotbmZzc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCituZnNzdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKIHsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCiBpbnQKLW5mc3N2Y19kZWNvZGVfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgKmFyZ3MpCituZnNzdmNfZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCiAJCXJldHVybiAwOwpAQCAtMjIwLDcgKzIxNSw3IEBACiB9CiAKIGludAotbmZzc3ZjX2RlY29kZV9zYXR0cmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2RlY29kZV9zYXR0cmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9zYXR0cmFyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQpAQCAtMjMxLDcgKzIyNiw3IEBACiB9CiAKIGludAotbmZzc3ZjX2RlY29kZV9kaXJvcGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2RlY29kZV9kaXJvcGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9kaXJvcGFyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQpAQCAtMjQyLDcgKzIzNyw3IEBACiB9CiAKIGludAotbmZzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnNzdmNfZGVjb2RlX3JlYWRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2RfcmVhZGFyZ3MgKmFyZ3MpCiB7CiAJdW5zaWduZWQgaW50IGxlbjsKQEAgLTI3Myw3ICsyNjgsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19kZWNvZGVfd3JpdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19kZWNvZGVfd3JpdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2Rfd3JpdGVhcmdzICphcmdzKQogewogCXVuc2lnbmVkIGludCBsZW47CkBAIC0zMDMsNyArMjk4LDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZGVjb2RlX2NyZWF0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2RlY29kZV9jcmVhdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2RfY3JlYXRlYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpCkBAIC0zMTUsNyArMzEwLDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZGVjb2RlX3JlbmFtZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2RfcmVuYW1lYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQpAQCAtMzI4LDcgKzMyMyw3IEBACiB9CiAKIGludAotbmZzc3ZjX2RlY29kZV9yZWFkbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmZzZF9yZWFkbGlua2FyZ3MgKmFyZ3MpCituZnNzdmNfZGVjb2RlX3JlYWRsaW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNkX3JlYWRsaW5rYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQogCQlyZXR1cm4gMDsKQEAgLTMzOCw3ICszMzMsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19kZWNvZGVfbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2RlY29kZV9saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX2xpbmthcmdzICphcmdzKQogewogCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZmaCkpCkBAIC0zNTAsNyArMzQ1LDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19kZWNvZGVfc3ltbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9zeW1saW5rYXJncyAqYXJncykKIHsKIAlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQpAQCAtMzYzLDcgKzM1OCw3IEBACiB9CiAKIGludAotbmZzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnNzdmNfZGVjb2RlX3JlYWRkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2RfcmVhZGRpcmFyZ3MgKmFyZ3MpCiB7CiAJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKQEAgLTM4MiwxMyArMzc3LDEzIEBACiAgKiBYRFIgZW5jb2RlIGZ1bmN0aW9ucwogICovCiBpbnQKLW5mc3N2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQorbmZzc3ZjX2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCiB7CiAJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KIAogaW50Ci1uZnNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19lbmNvZGVfYXR0cnN0YXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpwLAogCQkJCQlzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqcmVzcCkKIHsKIAlwID0gZW5jb2RlX2ZhdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgsICZyZXNwLT5zdGF0KTsKQEAgLTM5Niw3ICszOTEsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19lbmNvZGVfZGlyb3ByZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX2Rpcm9wcmVzICpyZXNwKQogewogCXAgPSBlbmNvZGVfZmgocCwgJnJlc3AtPmZoKTsKQEAgLTQwNSw3ICs0MDAsNyBAQAogfQogCiBpbnQKLW5mc3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2VuY29kZV9yZWFkbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX3JlYWRsaW5rcmVzICpyZXNwKQogewogCSpwKysgPSBodG9ubChyZXNwLT5sZW4pOwpAQCAtNDIxLDcgKzQxNiw3IEBACiB9CiAKIGludAotbmZzc3ZjX2VuY29kZV9yZWFkcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK25mc3N2Y19lbmNvZGVfcmVhZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX3JlYWRyZXMgKnJlc3ApCiB7CiAJcCA9IGVuY29kZV9mYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoLCAmcmVzcC0+c3RhdCk7CkBAIC00NDAsNyArNDM1LDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZW5jb2RlX3JlYWRkaXJyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX2VuY29kZV9yZWFkZGlycmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQkJc3RydWN0IG5mc2RfcmVhZGRpcnJlcyAqcmVzcCkKIHsKIAl4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CkBAIC00NTMsNyArNDQ4LDcgQEAKIH0KIAogaW50Ci1uZnNzdmNfZW5jb2RlX3N0YXRmc3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCituZnNzdmNfZW5jb2RlX3N0YXRmc3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX3N0YXRmc3JlcyAqcmVzcCkKIHsKIAlzdHJ1Y3Qga3N0YXRmcwkqc3RhdCA9ICZyZXNwLT5zdGF0czsKQEAgLTQ3MSw3ICs0NjYsNyBAQAogCQkgICAgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQogewogCXN0cnVjdCBuZnNkX3JlYWRkaXJyZXMgKmNkID0gY29udGFpbmVyX29mKGNjZCwgc3RydWN0IG5mc2RfcmVhZGRpcnJlcywgY29tbW9uKTsKLQl1MzIJKnAgPSBjZC0+YnVmZmVyOworCV9fYmUzMgkqcCA9IGNkLT5idWZmZXI7CiAJaW50CWJ1Zmxlbiwgc2xlbjsKIAogCS8qCkBAIC00OTcsNyArNDkyLDcgQEAKIAkqcCsrID0gaHRvbmwoKHUzMikgaW5vKTsJCS8qIGZpbGUgaWQgKi8KIAlwICAgID0geGRyX2VuY29kZV9hcnJheShwLCBuYW1lLCBuYW1sZW4pOy8qIG5hbWUgbGVuZ3RoICYgbmFtZSAqLwogCWNkLT5vZmZzZXQgPSBwOwkJCS8qIHJlbWVtYmVyIHBvaW50ZXIgKi8KLQkqcCsrID0gfih1MzIpIDA7CQkvKiBvZmZzZXQgb2YgbmV4dCBlbnRyeSAqLworCSpwKysgPSBodG9ubCh+MFUpOwkJLyogb2Zmc2V0IG9mIG5leHQgZW50cnkgKi8KIAogCWNkLT5idWZsZW4gPSBidWZsZW47CiAJY2QtPmJ1ZmZlciA9IHA7CkBAIC01MDksNyArNTA0LDcgQEAKICAqIFhEUiByZWxlYXNlIGZ1bmN0aW9ucwogICovCiBpbnQKLW5mc3N2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorbmZzc3ZjX3JlbGVhc2VfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCiAJCQkJCXN0cnVjdCBuZnNkX2ZoYW5kbGUgKnJlc3ApCiB7CiAJZmhfcHV0KCZyZXNwLT5maCk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwppbmRleCAxMTQxYmQyLi43YTc5YzIzIDEwMDY0NAotLS0gYS9mcy9uZnNkL3Zmcy5jCisrKyBiL2ZzL25mc2QvdmZzLmMKQEAgLTk5LDcgKzk5LDcgQEAKIC8qIAogICogQ2FsbGVkIGZyb20gbmZzZF9sb29rdXAgYW5kIGVuY29kZV9kaXJlbnQuIENoZWNrIGlmIHdlIGhhdmUgY3Jvc3NlZCAKICAqIGEgbW91bnQgcG9pbnQuCi0gKiBSZXR1cm5zIC1FQUdBSU4gbGVhdmluZyAqZHBwIGFuZCAqZXhwcCB1bmNoYW5nZWQsIAorICogUmV0dXJucyAtRUFHQUlOIG9yIC1FVElNRURPVVQgbGVhdmluZyAqZHBwIGFuZCAqZXhwcCB1bmNoYW5nZWQsCiAgKiAgb3IgbmZzX29rIGhhdmluZyBwb3NzaWJseSBjaGFuZ2VkICpkcHAgYW5kICpleHBwCiAgKi8KIGludApAQCAtMTEwLDcgKzExMCw3IEBACiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gKmRwcDsKIAlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IG1udGdldChleHAtPmV4X21udCk7CiAJc3RydWN0IGRlbnRyeSAqbW91bnRzID0gZGdldChkZW50cnkpOwotCWludCBlcnIgPSBuZnNfb2s7CisJaW50IGVyciA9IDA7CiAKIAl3aGlsZSAoZm9sbG93X2Rvd24oJm1udCwmbW91bnRzKSYmZF9tb3VudHBvaW50KG1vdW50cykpOwogCkBAIC0xNDgsMTQgKzE0OCwxNSBAQAogICogICBjbGllbnRzIGFuZCBpcyBleHBsaWNpdGx5IGRpc2FsbG93ZWQgZm9yIE5GU3YzCiAgKiAgICAgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgogICovCi1pbnQKK19fYmUzMgogbmZzZF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBjb25zdCBjaGFyICpuYW1lLAogCQkJCQlpbnQgbGVuLCBzdHJ1Y3Qgc3ZjX2ZoICpyZXNmaCkKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydAkqZXhwOwogCXN0cnVjdCBkZW50cnkJCSpkcGFyZW50OwogCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7Ci0JaW50CQkJZXJyOworCV9fYmUzMgkJCWVycjsKKwlpbnQJCQlob3N0X2VycjsKIAogCWRwcmludGsoIm5mc2Q6IG5mc2RfbG9va3VwKGZoICVzLCAlLipzKVxuIiwgU1ZDRkhfZm10KGZocCksIGxlbixuYW1lKTsKIApAQCAtMTkzLDcgKzE5NCw3IEBACiAJCQlleHAyID0gZXhwX3BhcmVudChleHAtPmV4X2NsaWVudCwgbW50LCBkZW50cnksCiAJCQkJCSAgJnJxc3RwLT5ycV9jaGFuZGxlKTsKIAkJCWlmIChJU19FUlIoZXhwMikpIHsKLQkJCQllcnIgPSBQVFJfRVJSKGV4cDIpOworCQkJCWhvc3RfZXJyID0gUFRSX0VSUihleHAyKTsKIAkJCQlkcHV0KGRlbnRyeSk7CiAJCQkJbW50cHV0KG1udCk7CiAJCQkJZ290byBvdXRfbmZzZXJyOwpAQCAtMjEwLDE0ICsyMTEsMTQgQEAKIAl9IGVsc2UgewogCQlmaF9sb2NrKGZocCk7CiAJCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIGRwYXJlbnQsIGxlbik7Ci0JCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKKwkJaG9zdF9lcnIgPSBQVFJfRVJSKGRlbnRyeSk7CiAJCWlmIChJU19FUlIoZGVudHJ5KSkKIAkJCWdvdG8gb3V0X25mc2VycjsKIAkJLyoKIAkJICogY2hlY2sgaWYgd2UgaGF2ZSBjcm9zc2VkIGEgbW91bnQgcG9pbnQgLi4uCiAJCSAqLwogCQlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpIHsKLQkJCWlmICgoZXJyID0gbmZzZF9jcm9zc19tbnQocnFzdHAsICZkZW50cnksICZleHApKSkgeworCQkJaWYgKChob3N0X2VyciA9IG5mc2RfY3Jvc3NfbW50KHJxc3RwLCAmZGVudHJ5LCAmZXhwKSkpIHsKIAkJCQlkcHV0KGRlbnRyeSk7CiAJCQkJZ290byBvdXRfbmZzZXJyOwogCQkJfQpAQCAtMjM2LDcgKzIzNyw3IEBACiAJcmV0dXJuIGVycjsKIAogb3V0X25mc2VycjoKLQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtMjQ0LDcgKzI0NSw3IEBACiAgKiBTZXQgdmFyaW91cyBmaWxlIGF0dHJpYnV0ZXMuCiAgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBmaHAgbmVlZHMgYW4gZmhfcHV0CiAgKi8KLWludAorX19iZTMyCiBuZnNkX3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgaWF0dHIgKmlhcCwKIAkgICAgIGludCBjaGVja19ndWFyZCwgdGltZV90IGd1YXJkdGltZSkKIHsKQEAgLTI1Myw3ICsyNTQsOCBAQAogCWludAkJYWNjbW9kZSA9IE1BWV9TQVRUUjsKIAlpbnQJCWZ0eXBlID0gMDsKIAlpbnQJCWltb2RlOwotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAJaW50CQlzaXplX2NoYW5nZSA9IDA7CiAKIAlpZiAoaWFwLT5pYV92YWxpZCAmIChBVFRSX0FUSU1FIHwgQVRUUl9NVElNRSB8IEFUVFJfU0laRSkpCkBAIC0zMTksMTkgKzMyMSwxOSBAQAogCQkgKiBJZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIHNpemUgb2YgdGhlIGZpbGUsIHRoZW4KIAkJICogd2UgbmVlZCB0byBicmVhayBhbGwgbGVhc2VzLgogCQkgKi8KLQkJZXJyID0gYnJlYWtfbGVhc2UoaW5vZGUsIEZNT0RFX1dSSVRFIHwgT19OT05CTE9DSyk7Ci0JCWlmIChlcnIgPT0gLUVXT1VMREJMT0NLKQotCQkJZXJyID0gLUVUSU1FRE9VVDsKLQkJaWYgKGVycikgLyogRU5PTUVNIG9yIEVXT1VMREJMT0NLICovCisJCWhvc3RfZXJyID0gYnJlYWtfbGVhc2UoaW5vZGUsIEZNT0RFX1dSSVRFIHwgT19OT05CTE9DSyk7CisJCWlmIChob3N0X2VyciA9PSAtRVdPVUxEQkxPQ0spCisJCQlob3N0X2VyciA9IC1FVElNRURPVVQ7CisJCWlmIChob3N0X2VycikgLyogRU5PTUVNIG9yIEVXT1VMREJMT0NLICovCiAJCQlnb3RvIG91dF9uZnNlcnI7CiAKLQkJZXJyID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7Ci0JCWlmIChlcnIpCisJCWhvc3RfZXJyID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJCWlmIChob3N0X2VycikKIAkJCWdvdG8gb3V0X25mc2VycjsKIAogCQlzaXplX2NoYW5nZSA9IDE7Ci0JCWVyciA9IGxvY2tzX3ZlcmlmeV90cnVuY2F0ZShpbm9kZSwgTlVMTCwgaWFwLT5pYV9zaXplKTsKLQkJaWYgKGVycikgeworCQlob3N0X2VyciA9IGxvY2tzX3ZlcmlmeV90cnVuY2F0ZShpbm9kZSwgTlVMTCwgaWFwLT5pYV9zaXplKTsKKwkJaWYgKGhvc3RfZXJyKSB7CiAJCQlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKIAkJCWdvdG8gb3V0X25mc2VycjsKIAkJfQpAQCAtMzU3LDggKzM1OSw4IEBACiAJZXJyID0gbmZzZXJyX25vdHN5bmM7CiAJaWYgKCFjaGVja19ndWFyZCB8fCBndWFyZHRpbWUgPT0gaW5vZGUtPmlfY3RpbWUudHZfc2VjKSB7CiAJCWZoX2xvY2soZmhwKTsKLQkJZXJyID0gbm90aWZ5X2NoYW5nZShkZW50cnksIGlhcCk7Ci0JCWVyciA9IG5mc2Vycm5vKGVycik7CisJCWhvc3RfZXJyID0gbm90aWZ5X2NoYW5nZShkZW50cnksIGlhcCk7CisJCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAkJZmhfdW5sb2NrKGZocCk7CiAJfQogCWlmIChzaXplX2NoYW5nZSkKQEAgLTM3MCw3ICszNzIsNyBAQAogCXJldHVybiBlcnI7CiAKIG91dF9uZnNlcnI6Ci0JZXJyID0gbmZzZXJybm8oZXJyKTsKKwllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTQyMCwxMSArNDIyLDEyIEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1pbnQKK19fYmUzMgogbmZzZDRfc2V0X25mczRfYWNsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKICAgICBzdHJ1Y3QgbmZzNF9hY2wgKmFjbCkKIHsKLQlpbnQgZXJyb3I7CisJX19iZTMyIGVycm9yOworCWludCBob3N0X2Vycm9yOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wgPSBOVUxMLCAqZHBhY2wgPSBOVUxMOwpAQCAtNDQwLDIwICs0NDMsMjAgQEAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKIAkJZmxhZ3MgPSBORlM0X0FDTF9ESVI7CiAKLQllcnJvciA9IG5mczRfYWNsX25mc3Y0X3RvX3Bvc2l4KGFjbCwgJnBhY2wsICZkcGFjbCwgZmxhZ3MpOwotCWlmIChlcnJvciA9PSAtRUlOVkFMKSB7CisJaG9zdF9lcnJvciA9IG5mczRfYWNsX25mc3Y0X3RvX3Bvc2l4KGFjbCwgJnBhY2wsICZkcGFjbCwgZmxhZ3MpOworCWlmIChob3N0X2Vycm9yID09IC1FSU5WQUwpIHsKIAkJZXJyb3IgPSBuZnNlcnJfYXR0cm5vdHN1cHA7CiAJCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoZXJyb3IgPCAwKQorCX0gZWxzZSBpZiAoaG9zdF9lcnJvciA8IDApCiAJCWdvdG8gb3V0X25mc2VycjsKIAotCWVycm9yID0gc2V0X25mc3Y0X2FjbF9vbmUoZGVudHJ5LCBwYWNsLCBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKTsKLQlpZiAoZXJyb3IgPCAwKQorCWhvc3RfZXJyb3IgPSBzZXRfbmZzdjRfYWNsX29uZShkZW50cnksIHBhY2wsIFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpOworCWlmIChob3N0X2Vycm9yIDwgMCkKIAkJZ290byBvdXRfbmZzZXJyOwogCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJZXJyb3IgPSBzZXRfbmZzdjRfYWNsX29uZShkZW50cnksIGRwYWNsLCBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCk7Ci0JCWlmIChlcnJvciA8IDApCisJCWhvc3RfZXJyb3IgPSBzZXRfbmZzdjRfYWNsX29uZShkZW50cnksIGRwYWNsLCBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCk7CisJCWlmIChob3N0X2Vycm9yIDwgMCkKIAkJCWdvdG8gb3V0X25mc2VycjsKIAl9CiAKQEAgLTQ2NCw3ICs0NjcsNyBAQAogCXBvc2l4X2FjbF9yZWxlYXNlKGRwYWNsKTsKIAlyZXR1cm4gKGVycm9yKTsKIG91dF9uZnNlcnI6Ci0JZXJyb3IgPSBuZnNlcnJubyhlcnJvcik7CisJZXJyb3IgPSBuZnNlcnJubyhob3N0X2Vycm9yKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtNTcxLDE0ICs1NzQsMTQgQEAKICAgICB7CTAsCQkJMAkJCQl9CiB9OwogCi1pbnQKK19fYmUzMgogbmZzZF9hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCB1MzIgKmFjY2VzcywgdTMyICpzdXBwb3J0ZWQpCiB7CiAJc3RydWN0IGFjY2Vzc21hcAkqbWFwOwogCXN0cnVjdCBzdmNfZXhwb3J0CSpleHBvcnQ7CiAJc3RydWN0IGRlbnRyeQkJKmRlbnRyeTsKIAl1MzIJCQlxdWVyeSwgcmVzdWx0ID0gMCwgc3Jlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50CQllcnJvcjsKKwlfX2JlMzIJCQllcnJvcjsKIAogCWVycm9yID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAsIE1BWV9OT1ApOwogCWlmIChlcnJvcikKQEAgLTU5OCw3ICs2MDEsNyBAQAogCXF1ZXJ5ID0gKmFjY2VzczsKIAlmb3IgICg7IG1hcC0+YWNjZXNzOyBtYXArKykgewogCQlpZiAobWFwLT5hY2Nlc3MgJiBxdWVyeSkgewotCQkJdW5zaWduZWQgaW50IGVycjI7CisJCQlfX2JlMzIgZXJyMjsKIAogCQkJc3Jlc3VsdCB8PSBtYXAtPmFjY2VzczsKIApAQCAtNjM3LDEzICs2NDAsMTUgQEAKICAqIFRoZSBhY2Nlc3MgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIG9wZW4gKHJlYWQvd3JpdGUvbG9jaykKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2Rfb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGludCB0eXBlLAogCQkJaW50IGFjY2Vzcywgc3RydWN0IGZpbGUgKipmaWxwKQogewogCXN0cnVjdCBkZW50cnkJKmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUJKmlub2RlOwotCWludAkJZmxhZ3MgPSBPX1JET05MWXxPX0xBUkdFRklMRSwgZXJyOworCWludAkJZmxhZ3MgPSBPX1JET05MWXxPX0xBUkdFRklMRTsKKwlfX2JlMzIJCWVycjsKKwlpbnQJCWhvc3RfZXJyOwogCiAJLyoKIAkgKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IGRvbmUgYW4gIm9wZW4iLApAQCAtNjczLDEwICs2NzgsMTAgQEAKIAkgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBsZWFzZXMgb24gdGhpcyBmaWxlLgogCSAqIFRoaXMgbWF5IGJsb2NrIHdoaWxlIGxlYXNlcyBhcmUgYnJva2VuLgogCSAqLwotCWVyciA9IGJyZWFrX2xlYXNlKGlub2RlLCBPX05PTkJMT0NLIHwgKChhY2Nlc3MgJiBNQVlfV1JJVEUpID8gRk1PREVfV1JJVEUgOiAwKSk7Ci0JaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spCi0JCWVyciA9IC1FVElNRURPVVQ7Ci0JaWYgKGVycikgLyogTk9NRU0gb3IgV09VTERCTE9DSyAqLworCWhvc3RfZXJyID0gYnJlYWtfbGVhc2UoaW5vZGUsIE9fTk9OQkxPQ0sgfCAoKGFjY2VzcyAmIE1BWV9XUklURSkgPyBGTU9ERV9XUklURSA6IDApKTsKKwlpZiAoaG9zdF9lcnIgPT0gLUVXT1VMREJMT0NLKQorCQlob3N0X2VyciA9IC1FVElNRURPVVQ7CisJaWYgKGhvc3RfZXJyKSAvKiBOT01FTSBvciBXT1VMREJMT0NLICovCiAJCWdvdG8gb3V0X25mc2VycjsKIAogCWlmIChhY2Nlc3MgJiBNQVlfV1JJVEUpIHsKQEAgLTY4OSwxMCArNjk0LDkgQEAKIAl9CiAJKmZpbHAgPSBkZW50cnlfb3BlbihkZ2V0KGRlbnRyeSksIG1udGdldChmaHAtPmZoX2V4cG9ydC0+ZXhfbW50KSwgZmxhZ3MpOwogCWlmIChJU19FUlIoKmZpbHApKQotCQllcnIgPSBQVFJfRVJSKCpmaWxwKTsKKwkJaG9zdF9lcnIgPSBQVFJfRVJSKCpmaWxwKTsKIG91dF9uZnNlcnI6Ci0JaWYgKGVycikKLQkJZXJyID0gbmZzZXJybm8oZXJyKTsKKwllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTczMiwxMCArNzM2LDEwIEBACiBuZnNkX3N5bmMoc3RydWN0IGZpbGUgKmZpbHApCiB7CiAgICAgICAgIGludCBlcnI7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwotCWRwcmludGsoIm5mc2Q6IHN5bmMgZmlsZSAlc1xuIiwgZmlscC0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlkcHJpbnRrKCJuZnNkOiBzeW5jIGZpbGUgJXNcbiIsIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JZXJyPW5mc2RfZG9zeW5jKGZpbHAsIGZpbHAtPmZfZGVudHJ5LCBmaWxwLT5mX29wKTsKKwllcnI9bmZzZF9kb3N5bmMoZmlscCwgZmlscC0+Zl9wYXRoLmRlbnRyeSwgZmlscC0+Zl9vcCk7CiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtODMwLDE3ICs4MzQsMTggQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogbmZzZF92ZnNfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBmaWxlICpmaWxlLAogICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3Qga3ZlYyAqdmVjLCBpbnQgdmxlbiwgdW5zaWduZWQgbG9uZyAqY291bnQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgcmFwYXJtcwkqcmE7CiAJbW1fc2VnbWVudF90CW9sZGZzOwotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAKIAllcnIgPSBuZnNlcnJfcGVybTsKLQlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKICNpZmRlZiBNU05GUwogCWlmICgoZmhwLT5maF9leHBvcnQtPmV4X2ZsYWdzICYgTkZTRVhQX01TTkZTKSAmJgogCQkoIWxvY2tfbWF5X3JlYWQoaW5vZGUsIG9mZnNldCwgKmNvdW50KSkpCkBAIC04NTUsMTIgKzg2MCwxMiBAQAogCiAJaWYgKGZpbGUtPmZfb3AtPnNlbmRmaWxlICYmIHJxc3RwLT5ycV9zZW5kZmlsZV9vaykgewogCQlycXN0cC0+cnFfcmVzdXNlZCA9IDE7Ci0JCWVyciA9IGZpbGUtPmZfb3AtPnNlbmRmaWxlKGZpbGUsICZvZmZzZXQsICpjb3VudCwKKwkJaG9zdF9lcnIgPSBmaWxlLT5mX29wLT5zZW5kZmlsZShmaWxlLCAmb2Zmc2V0LCAqY291bnQsCiAJCQkJCQkgbmZzZF9yZWFkX2FjdG9yLCBycXN0cCk7CiAJfSBlbHNlIHsKIAkJb2xkZnMgPSBnZXRfZnMoKTsKIAkJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JCWVyciA9IHZmc19yZWFkdihmaWxlLCAoc3RydWN0IGlvdmVjIF9fdXNlciAqKXZlYywgdmxlbiwgJm9mZnNldCk7CisJCWhvc3RfZXJyID0gdmZzX3JlYWR2KGZpbGUsIChzdHJ1Y3QgaW92ZWMgX191c2VyICopdmVjLCB2bGVuLCAmb2Zmc2V0KTsKIAkJc2V0X2ZzKG9sZGZzKTsKIAl9CiAKQEAgLTg3NCwxMyArODc5LDEzIEBACiAJCXNwaW5fdW5sb2NrKCZyYWItPnBiX2xvY2spOwogCX0KIAotCWlmIChlcnIgPj0gMCkgewotCQluZnNkc3RhdHMuaW9fcmVhZCArPSBlcnI7Ci0JCSpjb3VudCA9IGVycjsKKwlpZiAoaG9zdF9lcnIgPj0gMCkgeworCQluZnNkc3RhdHMuaW9fcmVhZCArPSBob3N0X2VycjsKKwkJKmNvdW50ID0gaG9zdF9lcnI7CiAJCWVyciA9IDA7Ci0JCWZzbm90aWZ5X2FjY2VzcyhmaWxlLT5mX2RlbnRyeSk7CisJCWZzbm90aWZ5X2FjY2VzcyhmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAl9IGVsc2UgCi0JCWVyciA9IG5mc2Vycm5vKGVycik7CisJCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtODk1LDcgKzkwMCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgX19iZTMyCiBuZnNkX3Zmc193cml0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCWxvZmZfdCBvZmZzZXQsIHN0cnVjdCBrdmVjICp2ZWMsIGludCB2bGVuLAogCSAgIAkJCXVuc2lnbmVkIGxvbmcgY250LCBpbnQgKnN0YWJsZXApCkBAIC05MDQsMTggKzkwOSwxOSBAQAogCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CiAJc3RydWN0IGlub2RlCQkqaW5vZGU7CiAJbW1fc2VnbWVudF90CQlvbGRmczsKLQlpbnQJCQllcnIgPSAwOworCV9fYmUzMgkJCWVyciA9IDA7CisJaW50CQkJaG9zdF9lcnI7CiAJaW50CQkJc3RhYmxlID0gKnN0YWJsZXA7CiAKICNpZmRlZiBNU05GUwogCWVyciA9IG5mc2Vycl9wZXJtOwogCiAJaWYgKChmaHAtPmZoX2V4cG9ydC0+ZXhfZmxhZ3MgJiBORlNFWFBfTVNORlMpICYmCi0JCSghbG9ja19tYXlfd3JpdGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIG9mZnNldCwgY250KSkpCisJCSghbG9ja19tYXlfd3JpdGUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgb2Zmc2V0LCBjbnQpKSkKIAkJZ290byBvdXQ7CiAjZW5kaWYKIAotCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCWRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJZXhwICAgPSBmaHAtPmZoX2V4cG9ydDsKIApAQCAtOTQwLDE4ICs5NDYsMTggQEAKIAogCS8qIFdyaXRlIHRoZSBkYXRhLiAqLwogCW9sZGZzID0gZ2V0X2ZzKCk7IHNldF9mcyhLRVJORUxfRFMpOwotCWVyciA9IHZmc193cml0ZXYoZmlsZSwgKHN0cnVjdCBpb3ZlYyBfX3VzZXIgKil2ZWMsIHZsZW4sICZvZmZzZXQpOworCWhvc3RfZXJyID0gdmZzX3dyaXRldihmaWxlLCAoc3RydWN0IGlvdmVjIF9fdXNlciAqKXZlYywgdmxlbiwgJm9mZnNldCk7CiAJc2V0X2ZzKG9sZGZzKTsKLQlpZiAoZXJyID49IDApIHsKKwlpZiAoaG9zdF9lcnIgPj0gMCkgewogCQluZnNkc3RhdHMuaW9fd3JpdGUgKz0gY250OwotCQlmc25vdGlmeV9tb2RpZnkoZmlsZS0+Zl9kZW50cnkpOworCQlmc25vdGlmeV9tb2RpZnkoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJfQogCiAJLyogY2xlYXIgc2V0dWlkL3NldGdpZCBmbGFnIGFmdGVyIHdyaXRlICovCi0JaWYgKGVyciA+PSAwICYmIChpbm9kZS0+aV9tb2RlICYgKFNfSVNVSUQgfCBTX0lTR0lEKSkpCisJaWYgKGhvc3RfZXJyID49IDAgJiYgKGlub2RlLT5pX21vZGUgJiAoU19JU1VJRCB8IFNfSVNHSUQpKSkKIAkJa2lsbF9zdWlkKGRlbnRyeSk7CiAKLQlpZiAoZXJyID49IDAgJiYgc3RhYmxlKSB7CisJaWYgKGhvc3RfZXJyID49IDAgJiYgc3RhYmxlKSB7CiAJCXN0YXRpYyBpbm9fdAlsYXN0X2lubzsKIAkJc3RhdGljIGRldl90CWxhc3RfZGV2OwogCkBAIC05NzcsNyArOTgzLDcgQEAKIAogCQkJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgewogCQkJCWRwcmludGsoIm5mc2Q6IHdyaXRlIHN5bmMgJWRcbiIsIGN1cnJlbnQtPnBpZCk7Ci0JCQkJZXJyPW5mc2Rfc3luYyhmaWxlKTsKKwkJCQlob3N0X2Vycj1uZnNkX3N5bmMoZmlsZSk7CiAJCQl9CiAjaWYgMAogCQkJd2FrZV91cCgmaW5vZGUtPmlfd2FpdCk7CkBAIC05ODcsMTEgKzk5MywxMSBAQAogCQlsYXN0X2RldiA9IGlub2RlLT5pX3NiLT5zX2RldjsKIAl9CiAKLQlkcHJpbnRrKCJuZnNkOiB3cml0ZSBjb21wbGV0ZSBlcnI9JWRcbiIsIGVycik7Ci0JaWYgKGVyciA+PSAwKQorCWRwcmludGsoIm5mc2Q6IHdyaXRlIGNvbXBsZXRlIGhvc3RfZXJyPSVkXG4iLCBob3N0X2Vycik7CisJaWYgKGhvc3RfZXJyID49IDApCiAJCWVyciA9IDA7CiAJZWxzZSAKLQkJZXJyID0gbmZzZXJybm8oZXJyKTsKKwkJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xMDAxLDEyICsxMDA3LDEyIEBACiAgKiBvbiBlbnRyeS4gT24gcmV0dXJuLCAqY291bnQgY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLgogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAogICovCi1pbnQKK19fYmUzMgogbmZzZF9yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCWxvZmZfdCBvZmZzZXQsIHN0cnVjdCBrdmVjICp2ZWMsIGludCB2bGVuLAogCQl1bnNpZ25lZCBsb25nICpjb3VudCkKIHsKLQlpbnQJCWVycjsKKwlfX2JlMzIJCWVycjsKIAogCWlmIChmaWxlKSB7CiAJCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCkBAIC0xMDMwLDEyICsxMDM2LDEyIEBACiAgKiBUaGUgc3RhYmxlIGZsYWcgcmVxdWVzdHMgc3luY2hyb25vdXMgd3JpdGVzLgogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAogICovCi1pbnQKK19fYmUzMgogbmZzZF93cml0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBmaWxlICpmaWxlLAogCQlsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3Qga3ZlYyAqdmVjLCBpbnQgdmxlbiwgdW5zaWduZWQgbG9uZyBjbnQsCiAJCWludCAqc3RhYmxlcCkKIHsKLQlpbnQJCQllcnIgPSAwOworCV9fYmUzMgkJCWVyciA9IDA7CiAKIAlpZiAoZmlsZSkgewogCQllcnIgPSBuZnNkX3Blcm1pc3Npb24oZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LApAQCAtMTA2NywxMiArMTA3MywxMiBAQAogICogVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgbG9jayB0aGUgZmlsZSB0byBtYWtlIHN1cmUgd2UgcmV0dXJuIGZ1bGwgV0NDCiAgKiBkYXRhIHRvIHRoZSBjbGllbnQsIGFzIGxvY2tpbmcgaGFwcGVucyBsb3dlciBkb3duIGluIHRoZSBmaWxlc3lzdGVtLgogICovCi1pbnQKK19fYmUzMgogbmZzZF9jb21taXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLAogICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlzdHJ1Y3QgZmlsZQkqZmlsZTsKLQlpbnQJCWVycjsKKwlfX2JlMzIJCWVycjsKIAogCWlmICgodTY0KWNvdW50ID4gfih1NjQpb2Zmc2V0KQogCQlyZXR1cm4gbmZzZXJyX2ludmFsOwpAQCAtMTEwMCwxNCArMTEwNiwxNSBAQAogICoKICAqIE4uQi4gRXZlcnkgY2FsbCB0byBuZnNkX2NyZWF0ZSBuZWVkcyBhbiBmaF9wdXQgZm9yIF9ib3RoXyBmaHAgYW5kIHJlc2ZocAogICovCi1pbnQKK19fYmUzMgogbmZzZF9jcmVhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLAogCQljaGFyICpmbmFtZSwgaW50IGZsZW4sIHN0cnVjdCBpYXR0ciAqaWFwLAogCQlpbnQgdHlwZSwgZGV2X3QgcmRldiwgc3RydWN0IHN2Y19maCAqcmVzZmhwKQogewogCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwgKmRjaGlsZCA9IE5VTEw7CiAJc3RydWN0IGlub2RlCSpkaXJwOwotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAKIAllcnIgPSBuZnNlcnJfcGVybTsKIAlpZiAoIWZsZW4pCkBAIC0xMTM0LDcgKzExNDEsNyBAQAogCQkvKiBjYWxsZWQgZnJvbSBuZnNkX3Byb2NfbWtkaXIsIG9yIHBvc3NpYmx5IG5mc2QzX3Byb2NfY3JlYXRlICovCiAJCWZoX2xvY2tfbmVzdGVkKGZocCwgSV9NVVRFWF9QQVJFTlQpOwogCQlkY2hpbGQgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZGVudHJ5LCBmbGVuKTsKLQkJZXJyID0gUFRSX0VSUihkY2hpbGQpOworCQlob3N0X2VyciA9IFBUUl9FUlIoZGNoaWxkKTsKIAkJaWYgKElTX0VSUihkY2hpbGQpKQogCQkJZ290byBvdXRfbmZzZXJyOwogCQllcnIgPSBmaF9jb21wb3NlKHJlc2ZocCwgZmhwLT5maF9leHBvcnQsIGRjaGlsZCwgZmhwKTsKQEAgLTExNzAsMjUgKzExNzcsMjUgQEAKIAkvKgogCSAqIEdldCB0aGUgZGlyIG9wIGZ1bmN0aW9uIHBvaW50ZXIuCiAJICovCi0JZXJyID0gbmZzZXJyX3Blcm07CisJZXJyID0gMDsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFNfSUZSRUc6Ci0JCWVyciA9IHZmc19jcmVhdGUoZGlycCwgZGNoaWxkLCBpYXAtPmlhX21vZGUsIE5VTEwpOworCQlob3N0X2VyciA9IHZmc19jcmVhdGUoZGlycCwgZGNoaWxkLCBpYXAtPmlhX21vZGUsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIFNfSUZESVI6Ci0JCWVyciA9IHZmc19ta2RpcihkaXJwLCBkY2hpbGQsIGlhcC0+aWFfbW9kZSk7CisJCWhvc3RfZXJyID0gdmZzX21rZGlyKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlKTsKIAkJYnJlYWs7CiAJY2FzZSBTX0lGQ0hSOgogCWNhc2UgU19JRkJMSzoKIAljYXNlIFNfSUZJRk86CiAJY2FzZSBTX0lGU09DSzoKLQkJZXJyID0gdmZzX21rbm9kKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlLCByZGV2KTsKKwkJaG9zdF9lcnIgPSB2ZnNfbWtub2QoZGlycCwgZGNoaWxkLCBpYXAtPmlhX21vZGUsIHJkZXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCSAgICAgICAgcHJpbnRrKCJuZnNkOiBiYWQgZmlsZSB0eXBlICVvIGluIG5mc2RfY3JlYXRlXG4iLCB0eXBlKTsKLQkJZXJyID0gLUVJTlZBTDsKKwkJaG9zdF9lcnIgPSAtRUlOVkFMOwogCX0KLQlpZiAoZXJyIDwgMCkKKwlpZiAoaG9zdF9lcnIgPCAwKQogCQlnb3RvIG91dF9uZnNlcnI7CiAKIAlpZiAoRVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkgewpAQCAtMTIwMyw3ICsxMjEwLDcgQEAKIAkgKiBkaXJlY3RvcmllcyB2aWEgTkZTLgogCSAqLwogCWlmICgoaWFwLT5pYV92YWxpZCAmPSB+KEFUVFJfVUlEfEFUVFJfR0lEfEFUVFJfTU9ERSkpICE9IDApIHsKLQkJaW50IGVycjIgPSBuZnNkX3NldGF0dHIocnFzdHAsIHJlc2ZocCwgaWFwLCAwLCAodGltZV90KTApOworCQlfX2JlMzIgZXJyMiA9IG5mc2Rfc2V0YXR0cihycXN0cCwgcmVzZmhwLCBpYXAsIDAsICh0aW1lX3QpMCk7CiAJCWlmIChlcnIyKQogCQkJZXJyID0gZXJyMjsKIAl9CkBAIC0xMjE4LDcgKzEyMjUsNyBAQAogCXJldHVybiBlcnI7CiAKIG91dF9uZnNlcnI6Ci0JZXJyID0gbmZzZXJybm8oZXJyKTsKKwllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTEyMjYsMTUgKzEyMzMsMTYgQEAKIC8qCiAgKiBORlN2MyB2ZXJzaW9uIG9mIG5mc2RfY3JlYXRlCiAgKi8KLWludAorX19iZTMyCiBuZnNkX2NyZWF0ZV92MyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCiAJCWNoYXIgKmZuYW1lLCBpbnQgZmxlbiwgc3RydWN0IGlhdHRyICppYXAsCiAJCXN0cnVjdCBzdmNfZmggKnJlc2ZocCwgaW50IGNyZWF0ZW1vZGUsIHUzMiAqdmVyaWZpZXIsCi0JICAgICAgICBpbnQgKnRydW5jcCkKKwkgICAgICAgIGludCAqdHJ1bmNwLCBpbnQgKmNyZWF0ZWQpCiB7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5LCAqZGNoaWxkID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUJKmRpcnA7Ci0JaW50CQllcnI7CisJX19iZTMyCQllcnI7CisJaW50CQlob3N0X2VycjsKIAlfX3UzMgkJdl9tdGltZT0wLCB2X2F0aW1lPTA7CiAJaW50CQl2X21vZGU9MDsKIApAQCAtMTI2NCw3ICsxMjcyLDcgQEAKIAkgKiBDb21wb3NlIHRoZSByZXNwb25zZSBmaWxlIGhhbmRsZS4KIAkgKi8KIAlkY2hpbGQgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZGVudHJ5LCBmbGVuKTsKLQllcnIgPSBQVFJfRVJSKGRjaGlsZCk7CisJaG9zdF9lcnIgPSBQVFJfRVJSKGRjaGlsZCk7CiAJaWYgKElTX0VSUihkY2hpbGQpKQogCQlnb3RvIG91dF9uZnNlcnI7CiAKQEAgLTEzMjAsOSArMTMyOCwxMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQllcnIgPSB2ZnNfY3JlYXRlKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlLCBOVUxMKTsKLQlpZiAoZXJyIDwgMCkKKwlob3N0X2VyciA9IHZmc19jcmVhdGUoZGlycCwgZGNoaWxkLCBpYXAtPmlhX21vZGUsIE5VTEwpOworCWlmIChob3N0X2VyciA8IDApCiAJCWdvdG8gb3V0X25mc2VycjsKKwlpZiAoY3JlYXRlZCkKKwkJKmNyZWF0ZWQgPSAxOwogCiAJaWYgKEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpIHsKIAkJZXJyID0gbmZzZXJybm8obmZzZF9zeW5jX2RpcihkZW50cnkpKTsKQEAgLTEzNTAsNyArMTM2MCw3IEBACiAJICovCiAgc2V0X2F0dHI6CiAJaWYgKChpYXAtPmlhX3ZhbGlkICY9IH4oQVRUUl9VSUR8QVRUUl9HSUQpKSAhPSAwKSB7Ci0gCQlpbnQgZXJyMiA9IG5mc2Rfc2V0YXR0cihycXN0cCwgcmVzZmhwLCBpYXAsIDAsICh0aW1lX3QpMCk7CisgCQlfX2JlMzIgZXJyMiA9IG5mc2Rfc2V0YXR0cihycXN0cCwgcmVzZmhwLCBpYXAsIDAsICh0aW1lX3QpMCk7CiAJCWlmIChlcnIyKQogCQkJZXJyID0gZXJyMjsKIAl9CkBAIC0xMzY4LDcgKzEzNzgsNyBAQAogIAlyZXR1cm4gZXJyOwogIAogIG91dF9uZnNlcnI6Ci0JZXJyID0gbmZzZXJybm8oZXJyKTsKKwllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiAJZ290byBvdXQ7CiB9CiAjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KQEAgLTEzNzgsMTMgKzEzODgsMTQgQEAKICAqIGZpdHMgaW50byB0aGUgYnVmZmVyLiBPbiByZXR1cm4sIGl0IGNvbnRhaW5zIHRoZSB0cnVlIGxlbmd0aC4KICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2RfcmVhZGxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBjaGFyICpidWYsIGludCAqbGVucCkKIHsKIAlzdHJ1Y3QgZGVudHJ5CSpkZW50cnk7CiAJc3RydWN0IGlub2RlCSppbm9kZTsKIAltbV9zZWdtZW50X3QJb2xkZnM7Ci0JaW50CQllcnI7CisJX19iZTMyCQllcnI7CisJaW50CQlob3N0X2VycjsKIAogCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCBTX0lGTE5LLCBNQVlfTk9QKTsKIAlpZiAoZXJyKQpAQCAtMTQwMywxOCArMTQxNCwxOCBAQAogCSAqLwogCiAJb2xkZnMgPSBnZXRfZnMoKTsgc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JZXJyID0gaW5vZGUtPmlfb3AtPnJlYWRsaW5rKGRlbnRyeSwgYnVmLCAqbGVucCk7CisJaG9zdF9lcnIgPSBpbm9kZS0+aV9vcC0+cmVhZGxpbmsoZGVudHJ5LCBidWYsICpsZW5wKTsKIAlzZXRfZnMob2xkZnMpOwogCi0JaWYgKGVyciA8IDApCisJaWYgKGhvc3RfZXJyIDwgMCkKIAkJZ290byBvdXRfbmZzZXJyOwotCSpsZW5wID0gZXJyOworCSpsZW5wID0gaG9zdF9lcnI7CiAJZXJyID0gMDsKIG91dDoKIAlyZXR1cm4gZXJyOwogCiBvdXRfbmZzZXJyOgotCWVyciA9IG5mc2Vycm5vKGVycik7CisJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCWdvdG8gb3V0OwogfQogCkBAIC0xNDIyLDcgKzE0MzMsNyBAQAogICogQ3JlYXRlIGEgc3ltbGluayBhbmQgbG9vayB1cCBpdHMgaW5vZGUKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmaHAgYW5kIHJlc2ZocCBuZWVkIGFuIGZoX3B1dAogICovCi1pbnQKK19fYmUzMgogbmZzZF9zeW1saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKIAkJCQljaGFyICpmbmFtZSwgaW50IGZsZW4sCiAJCQkJY2hhciAqcGF0aCwgIGludCBwbGVuLApAQCAtMTQzMCw3ICsxNDQxLDggQEAKIAkJCQlzdHJ1Y3QgaWF0dHIgKmlhcCkKIHsKIAlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksICpkbmV3OwotCWludAkJZXJyLCBjZXJyOworCV9fYmUzMgkJZXJyLCBjZXJyOworCWludAkJaG9zdF9lcnI7CiAJdW1vZGVfdAkJbW9kZTsKIAogCWVyciA9IG5mc2Vycl9ub2VudDsKQEAgLTE0NDYsNyArMTQ1OCw3IEBACiAJZmhfbG9jayhmaHApOwogCWRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OwogCWRuZXcgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZGVudHJ5LCBmbGVuKTsKLQllcnIgPSBQVFJfRVJSKGRuZXcpOworCWhvc3RfZXJyID0gUFRSX0VSUihkbmV3KTsKIAlpZiAoSVNfRVJSKGRuZXcpKQogCQlnb3RvIG91dF9uZnNlcnI7CiAKQEAgLTE0NTgsMjEgKzE0NzAsMjEgQEAKIAlpZiAodW5saWtlbHkocGF0aFtwbGVuXSAhPSAwKSkgewogCQljaGFyICpwYXRoX2FsbG9jZWQgPSBrbWFsbG9jKHBsZW4rMSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChwYXRoX2FsbG9jZWQgPT0gTlVMTCkKLQkJCWVyciA9IC1FTk9NRU07CisJCQlob3N0X2VyciA9IC1FTk9NRU07CiAJCWVsc2UgewogCQkJc3RybmNweShwYXRoX2FsbG9jZWQsIHBhdGgsIHBsZW4pOwogCQkJcGF0aF9hbGxvY2VkW3BsZW5dID0gMDsKLQkJCWVyciA9IHZmc19zeW1saW5rKGRlbnRyeS0+ZF9pbm9kZSwgZG5ldywgcGF0aF9hbGxvY2VkLCBtb2RlKTsKKwkJCWhvc3RfZXJyID0gdmZzX3N5bWxpbmsoZGVudHJ5LT5kX2lub2RlLCBkbmV3LCBwYXRoX2FsbG9jZWQsIG1vZGUpOwogCQkJa2ZyZWUocGF0aF9hbGxvY2VkKTsKIAkJfQogCX0gZWxzZQotCQllcnIgPSB2ZnNfc3ltbGluayhkZW50cnktPmRfaW5vZGUsIGRuZXcsIHBhdGgsIG1vZGUpOworCQlob3N0X2VyciA9IHZmc19zeW1saW5rKGRlbnRyeS0+ZF9pbm9kZSwgZG5ldywgcGF0aCwgbW9kZSk7CiAKLQlpZiAoIWVycikKKwlpZiAoIWhvc3RfZXJyKSB7CiAJCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKQotCQkJZXJyID0gbmZzZF9zeW5jX2RpcihkZW50cnkpOwotCWlmIChlcnIpCi0JCWVyciA9IG5mc2Vycm5vKGVycik7CisJCQlob3N0X2VyciA9IG5mc2Rfc3luY19kaXIoZGVudHJ5KTsKKwl9CisJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCWZoX3VubG9jayhmaHApOwogCiAJY2VyciA9IGZoX2NvbXBvc2UocmVzZmhwLCBmaHAtPmZoX2V4cG9ydCwgZG5ldywgZmhwKTsKQEAgLTE0ODIsNyArMTQ5NCw3IEBACiAJcmV0dXJuIGVycjsKIAogb3V0X25mc2VycjoKLQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtMTQ5MCwxMyArMTUwMiwxNCBAQAogICogQ3JlYXRlIGEgaGFyZGxpbmsKICAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmZmhwIGFuZCB0ZmhwIG5lZWQgYW4gZmhfcHV0CiAgKi8KLWludAorX19iZTMyCiBuZnNkX2xpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmZocCwKIAkJCQljaGFyICpuYW1lLCBpbnQgbGVuLCBzdHJ1Y3Qgc3ZjX2ZoICp0ZmhwKQogewogCXN0cnVjdCBkZW50cnkJKmRkaXIsICpkbmV3LCAqZG9sZDsKIAlzdHJ1Y3QgaW5vZGUJKmRpcnAsICpkZXN0OwotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludAkJaG9zdF9lcnI7CiAKIAllcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZmaHAsIFNfSUZESVIsIE1BWV9DUkVBVEUpOwogCWlmIChlcnIpCkBAIC0xNTE3LDI0ICsxNTMwLDI1IEBACiAJZGlycCA9IGRkaXItPmRfaW5vZGU7CiAKIAlkbmV3ID0gbG9va3VwX29uZV9sZW4obmFtZSwgZGRpciwgbGVuKTsKLQllcnIgPSBQVFJfRVJSKGRuZXcpOworCWhvc3RfZXJyID0gUFRSX0VSUihkbmV3KTsKIAlpZiAoSVNfRVJSKGRuZXcpKQogCQlnb3RvIG91dF9uZnNlcnI7CiAKIAlkb2xkID0gdGZocC0+ZmhfZGVudHJ5OwogCWRlc3QgPSBkb2xkLT5kX2lub2RlOwogCi0JZXJyID0gdmZzX2xpbmsoZG9sZCwgZGlycCwgZG5ldyk7Ci0JaWYgKCFlcnIpIHsKKwlob3N0X2VyciA9IHZmc19saW5rKGRvbGQsIGRpcnAsIGRuZXcpOworCWlmICghaG9zdF9lcnIpIHsKIAkJaWYgKEVYX0lTU1lOQyhmZmhwLT5maF9leHBvcnQpKSB7CiAJCQllcnIgPSBuZnNlcnJubyhuZnNkX3N5bmNfZGlyKGRkaXIpKTsKIAkJCXdyaXRlX2lub2RlX25vdyhkZXN0LCAxKTsKIAkJfQorCQllcnIgPSAwOwogCX0gZWxzZSB7Ci0JCWlmIChlcnIgPT0gLUVYREVWICYmIHJxc3RwLT5ycV92ZXJzID09IDIpCisJCWlmIChob3N0X2VyciA9PSAtRVhERVYgJiYgcnFzdHAtPnJxX3ZlcnMgPT0gMikKIAkJCWVyciA9IG5mc2Vycl9hY2NlczsKIAkJZWxzZQotCQkJZXJyID0gbmZzZXJybm8oZXJyKTsKKwkJCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAl9CiAKIAlkcHV0KGRuZXcpOwpAQCAtMTU0NCw3ICsxNTU4LDcgQEAKIAlyZXR1cm4gZXJyOwogCiBvdXRfbmZzZXJyOgotCWVyciA9IG5mc2Vycm5vKGVycik7CisJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCWdvdG8gb3V0X3VubG9jazsKIH0KIApAQCAtMTU1MiwxMyArMTU2NiwxNCBAQAogICogUmVuYW1lIGEgZmlsZQogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgX2JvdGhfIGZmaHAgYW5kIHRmaHAgbmVlZCBhbiBmaF9wdXQKICAqLwotaW50CitfX2JlMzIKIG5mc2RfcmVuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZmaHAsIGNoYXIgKmZuYW1lLCBpbnQgZmxlbiwKIAkJCSAgICBzdHJ1Y3Qgc3ZjX2ZoICp0ZmhwLCBjaGFyICp0bmFtZSwgaW50IHRsZW4pCiB7CiAJc3RydWN0IGRlbnRyeQkqZmRlbnRyeSwgKnRkZW50cnksICpvZGVudHJ5LCAqbmRlbnRyeSwgKnRyYXA7CiAJc3RydWN0IGlub2RlCSpmZGlyLCAqdGRpcjsKLQlpbnQJCWVycjsKKwlfX2JlMzIJCWVycjsKKwlpbnQJCWhvc3RfZXJyOwogCiAJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmZmhwLCBTX0lGRElSLCBNQVlfUkVNT1ZFKTsKIAlpZiAoZXJyKQpAQCAtMTU4OSwyMiArMTYwNCwyMiBAQAogCWZpbGxfcHJlX3djYyh0ZmhwKTsKIAogCW9kZW50cnkgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZmRlbnRyeSwgZmxlbik7Ci0JZXJyID0gUFRSX0VSUihvZGVudHJ5KTsKKwlob3N0X2VyciA9IFBUUl9FUlIob2RlbnRyeSk7CiAJaWYgKElTX0VSUihvZGVudHJ5KSkKIAkJZ290byBvdXRfbmZzZXJyOwogCi0JZXJyID0gLUVOT0VOVDsKKwlob3N0X2VyciA9IC1FTk9FTlQ7CiAJaWYgKCFvZGVudHJ5LT5kX2lub2RlKQogCQlnb3RvIG91dF9kcHV0X29sZDsKLQllcnIgPSAtRUlOVkFMOworCWhvc3RfZXJyID0gLUVJTlZBTDsKIAlpZiAob2RlbnRyeSA9PSB0cmFwKQogCQlnb3RvIG91dF9kcHV0X29sZDsKIAogCW5kZW50cnkgPSBsb29rdXBfb25lX2xlbih0bmFtZSwgdGRlbnRyeSwgdGxlbik7Ci0JZXJyID0gUFRSX0VSUihuZGVudHJ5KTsKKwlob3N0X2VyciA9IFBUUl9FUlIobmRlbnRyeSk7CiAJaWYgKElTX0VSUihuZGVudHJ5KSkKIAkJZ290byBvdXRfZHB1dF9vbGQ7Ci0JZXJyID0gLUVOT1RFTVBUWTsKKwlob3N0X2VyciA9IC1FTk9URU1QVFk7CiAJaWYgKG5kZW50cnkgPT0gdHJhcCkKIAkJZ290byBvdXRfZHB1dF9uZXc7CiAKQEAgLTE2MTIsMTQgKzE2MjcsMTQgQEAKIAlpZiAoKGZmaHAtPmZoX2V4cG9ydC0+ZXhfZmxhZ3MgJiBORlNFWFBfTVNORlMpICYmCiAJCSgoYXRvbWljX3JlYWQoJm9kZW50cnktPmRfY291bnQpID4gMSkKIAkJIHx8IChhdG9taWNfcmVhZCgmbmRlbnRyeS0+ZF9jb3VudCkgPiAxKSkpIHsKLQkJCWVyciA9IC1FUEVSTTsKKwkJCWhvc3RfZXJyID0gLUVQRVJNOwogCX0gZWxzZQogI2VuZGlmCi0JZXJyID0gdmZzX3JlbmFtZShmZGlyLCBvZGVudHJ5LCB0ZGlyLCBuZGVudHJ5KTsKLQlpZiAoIWVyciAmJiBFWF9JU1NZTkModGZocC0+ZmhfZXhwb3J0KSkgewotCQllcnIgPSBuZnNkX3N5bmNfZGlyKHRkZW50cnkpOwotCQlpZiAoIWVycikKLQkJCWVyciA9IG5mc2Rfc3luY19kaXIoZmRlbnRyeSk7CisJaG9zdF9lcnIgPSB2ZnNfcmVuYW1lKGZkaXIsIG9kZW50cnksIHRkaXIsIG5kZW50cnkpOworCWlmICghaG9zdF9lcnIgJiYgRVhfSVNTWU5DKHRmaHAtPmZoX2V4cG9ydCkpIHsKKwkJaG9zdF9lcnIgPSBuZnNkX3N5bmNfZGlyKHRkZW50cnkpOworCQlpZiAoIWhvc3RfZXJyKQorCQkJaG9zdF9lcnIgPSBuZnNkX3N5bmNfZGlyKGZkZW50cnkpOwogCX0KIAogIG91dF9kcHV0X25ldzoKQEAgLTE2MjcsOCArMTY0Miw3IEBACiAgb3V0X2RwdXRfb2xkOgogCWRwdXQob2RlbnRyeSk7CiAgb3V0X25mc2VycjoKLQlpZiAoZXJyKQotCQllcnIgPSBuZnNlcnJubyhlcnIpOworCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAogCS8qIHdlIGNhbm5vdCByZXBseSBvbiBmaF91bmxvY2sgb24gdGhlIHR3byBmaWxlaGFuZGxlcywKIAkgKiBhcyB0aGF0IHdvdWxkIGRvIHRoZSB3cm9uZyB0aGluZyBpZiB0aGUgdHdvIGRpcmVjdG9yaWVzCkBAIC0xNjQ3LDEzICsxNjYxLDE0IEBACiAgKiBVbmxpbmsgYSBmaWxlIG9yIGRpcmVjdG9yeQogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAogICovCi1pbnQKK19fYmUzMgogbmZzZF91bmxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBpbnQgdHlwZSwKIAkJCQljaGFyICpmbmFtZSwgaW50IGZsZW4pCiB7CiAJc3RydWN0IGRlbnRyeQkqZGVudHJ5LCAqcmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUJKmRpcnA7Ci0JaW50CQllcnI7CisJX19iZTMyCQllcnI7CisJaW50CQlob3N0X2VycjsKIAogCWVyciA9IG5mc2Vycl9hY2NlczsKIAlpZiAoIWZsZW4gfHwgaXNkb3RlbnQoZm5hbWUsIGZsZW4pKQpAQCAtMTY2Nyw3ICsxNjgyLDcgQEAKIAlkaXJwID0gZGVudHJ5LT5kX2lub2RlOwogCiAJcmRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGZuYW1lLCBkZW50cnksIGZsZW4pOwotCWVyciA9IFBUUl9FUlIocmRlbnRyeSk7CisJaG9zdF9lcnIgPSBQVFJfRVJSKHJkZW50cnkpOwogCWlmIChJU19FUlIocmRlbnRyeSkpCiAJCWdvdG8gb3V0X25mc2VycjsKIApAQCAtMTY4NCwyMiArMTY5OSwyMyBAQAogI2lmZGVmIE1TTkZTCiAJCWlmICgoZmhwLT5maF9leHBvcnQtPmV4X2ZsYWdzICYgTkZTRVhQX01TTkZTKSAmJgogCQkJKGF0b21pY19yZWFkKCZyZGVudHJ5LT5kX2NvdW50KSA+IDEpKSB7Ci0JCQllcnIgPSAtRVBFUk07CisJCQlob3N0X2VyciA9IC1FUEVSTTsKIAkJfSBlbHNlCiAjZW5kaWYKLQkJZXJyID0gdmZzX3VubGluayhkaXJwLCByZGVudHJ5KTsKKwkJaG9zdF9lcnIgPSB2ZnNfdW5saW5rKGRpcnAsIHJkZW50cnkpOwogCX0gZWxzZSB7IC8qIEl0J3MgUk1ESVIgKi8KLQkJZXJyID0gdmZzX3JtZGlyKGRpcnAsIHJkZW50cnkpOworCQlob3N0X2VyciA9IHZmc19ybWRpcihkaXJwLCByZGVudHJ5KTsKIAl9CiAKIAlkcHV0KHJkZW50cnkpOwogCi0JaWYgKGVyciA9PSAwICYmCi0JICAgIEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpCi0JCQllcnIgPSBuZnNkX3N5bmNfZGlyKGRlbnRyeSk7CisJaWYgKGhvc3RfZXJyKQorCQlnb3RvIG91dF9uZnNlcnI7CisJaWYgKEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpCisJCWhvc3RfZXJyID0gbmZzZF9zeW5jX2RpcihkZW50cnkpOwogCiBvdXRfbmZzZXJyOgotCWVyciA9IG5mc2Vycm5vKGVycik7CisJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xNzA4LDExICsxNzI0LDEyIEBACiAgKiBSZWFkIGVudHJpZXMgZnJvbSBhIGRpcmVjdG9yeS4KICAqIFRoZSAgTkZTdjMvNCB2ZXJpZmllciB3ZSBpZ25vcmUgZm9yIG5vdy4KICAqLwotaW50CitfX2JlMzIKIG5mc2RfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGxvZmZfdCAqb2Zmc2V0cCwgCiAJICAgICBzdHJ1Y3QgcmVhZGRpcl9jZCAqY2RwLCBlbmNvZGVfZGVudF9mbiBmdW5jKQogewotCWludAkJZXJyOworCV9fYmUzMgkJZXJyOworCWludCAJCWhvc3RfZXJyOwogCXN0cnVjdCBmaWxlCSpmaWxlOwogCWxvZmZfdAkJb2Zmc2V0ID0gKm9mZnNldHA7CiAKQEAgLTE3MzQsMTAgKzE3NTEsMTAgQEAKIAogCWRvIHsKIAkJY2RwLT5lcnIgPSBuZnNlcnJfZW9mOyAvKiB3aWxsIGJlIGNsZWFyZWQgb24gc3VjY2Vzc2Z1bCByZWFkICovCi0JCWVyciA9IHZmc19yZWFkZGlyKGZpbGUsIChmaWxsZGlyX3QpIGZ1bmMsIGNkcCk7Ci0JfSB3aGlsZSAoZXJyID49MCAmJiBjZHAtPmVyciA9PSBuZnNfb2spOwotCWlmIChlcnIpCi0JCWVyciA9IG5mc2Vycm5vKGVycik7CisJCWhvc3RfZXJyID0gdmZzX3JlYWRkaXIoZmlsZSwgKGZpbGxkaXJfdCkgZnVuYywgY2RwKTsKKwl9IHdoaWxlIChob3N0X2VyciA+PTAgJiYgY2RwLT5lcnIgPT0gbmZzX29rKTsKKwlpZiAoaG9zdF9lcnIpCisJCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAllbHNlCiAJCWVyciA9IGNkcC0+ZXJyOwogCSpvZmZzZXRwID0gdmZzX2xsc2VlayhmaWxlLCAwLCAxKTsKQEAgLTE3NTQsMTAgKzE3NzEsMTAgQEAKICAqIEdldCBmaWxlIHN5c3RlbSBzdGF0cwogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAogICovCi1pbnQKK19fYmUzMgogbmZzZF9zdGF0ZnMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qga3N0YXRmcyAqc3RhdCkKIHsKLQlpbnQgZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAsIE1BWV9OT1ApOworCV9fYmUzMiBlcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgMCwgTUFZX05PUCk7CiAJaWYgKCFlcnIgJiYgdmZzX3N0YXRmcyhmaHAtPmZoX2RlbnRyeSxzdGF0KSkKIAkJZXJyID0gbmZzZXJyX2lvOwogCXJldHVybiBlcnI7CkBAIC0xNzY2LDcgKzE3ODMsNyBAQAogLyoKICAqIENoZWNrIGZvciBhIHVzZXIncyBhY2Nlc3MgcGVybWlzc2lvbnMgdG8gdGhpcyBpbm9kZS4KICAqLwotaW50CitfX2JlMzIKIG5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBhY2MpCiB7CiAJc3RydWN0IGlub2RlCSppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKQEAgLTE4NjgsMjggKzE4ODUsMjcgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKGNhY2hlX3NpemUgPCAyKlJBUEFSTV9IQVNIX1NJWkUpCiAJCWNhY2hlX3NpemUgPSAyKlJBUEFSTV9IQVNIX1NJWkU7Ci0JcmFwYXJtbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByYXBhcm1zKSAqIGNhY2hlX3NpemUsIEdGUF9LRVJORUwpOworCXJhcGFybWwgPSBrY2FsbG9jKGNhY2hlX3NpemUsIHNpemVvZihzdHJ1Y3QgcmFwYXJtcyksIEdGUF9LRVJORUwpOwogCi0JaWYgKHJhcGFybWwgIT0gTlVMTCkgewotCQlkcHJpbnRrKCJuZnNkOiBhbGxvY2F0aW5nICVkIHJlYWRhaGVhZCBidWZmZXJzLlxuIiwKLQkJCWNhY2hlX3NpemUpOwotCQlmb3IgKGkgPSAwIDsgaSA8IFJBUEFSTV9IQVNIX1NJWkUgOyBpKyspIHsKLQkJCXJhcGFybV9oYXNoW2ldLnBiX2hlYWQgPSBOVUxMOwotCQkJc3Bpbl9sb2NrX2luaXQoJnJhcGFybV9oYXNoW2ldLnBiX2xvY2spOwotCQl9Ci0JCW5wZXJidWNrZXQgPSBjYWNoZV9zaXplID4+IFJBUEFSTV9IQVNIX0JJVFM7Ci0JCW1lbXNldChyYXBhcm1sLCAwLCBzaXplb2Yoc3RydWN0IHJhcGFybXMpICogY2FjaGVfc2l6ZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBjYWNoZV9zaXplIC0gMTsgaSsrKSB7Ci0JCQlpZiAoaSAlIG5wZXJidWNrZXQgPT0gMCkKLQkJCQlyYXBhcm1faGFzaFtqKytdLnBiX2hlYWQgPSByYXBhcm1sICsgaTsKLQkJCWlmIChpICUgbnBlcmJ1Y2tldCA8IG5wZXJidWNrZXQtMSkKLQkJCQlyYXBhcm1sW2ldLnBfbmV4dCA9IHJhcGFybWwgKyBpICsgMTsKLQkJfQotCX0gZWxzZSB7CisJaWYgKCFyYXBhcm1sKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJuZnNkOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IHJlYWQtYWhlYWQgY2FjaGUuXG4iKTsKKwkJCSJuZnNkOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IHJlYWQtYWhlYWQgY2FjaGUuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCisJZHByaW50aygibmZzZDogYWxsb2NhdGluZyAlZCByZWFkYWhlYWQgYnVmZmVycy5cbiIsIGNhY2hlX3NpemUpOworCWZvciAoaSA9IDAgOyBpIDwgUkFQQVJNX0hBU0hfU0laRSA7IGkrKykgeworCQlyYXBhcm1faGFzaFtpXS5wYl9oZWFkID0gTlVMTDsKKwkJc3Bpbl9sb2NrX2luaXQoJnJhcGFybV9oYXNoW2ldLnBiX2xvY2spOworCX0KKwlucGVyYnVja2V0ID0gY2FjaGVfc2l6ZSA+PiBSQVBBUk1fSEFTSF9CSVRTOworCWZvciAoaSA9IDA7IGkgPCBjYWNoZV9zaXplIC0gMTsgaSsrKSB7CisJCWlmIChpICUgbnBlcmJ1Y2tldCA9PSAwKQorCQkJcmFwYXJtX2hhc2hbaisrXS5wYl9oZWFkID0gcmFwYXJtbCArIGk7CisJCWlmIChpICUgbnBlcmJ1Y2tldCA8IG5wZXJidWNrZXQtMSkKKwkJCXJhcGFybWxbaV0ucF9uZXh0ID0gcmFwYXJtbCArIGkgKyAxOworCX0KKwogCW5mc2RzdGF0cy5yYV9zaXplID0gY2FjaGVfc2l6ZTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A5MzYuYyBiL2ZzL25scy9ubHNfY3A5MzYuYwppbmRleCAwNDZmZGU4Li42NWU2NDBjIDEwMDY0NAotLS0gYS9mcy9ubHMvbmxzX2NwOTM2LmMKKysrIGIvZnMvbmxzL25sc19jcDkzNi5jCkBAIC00NDIxLDYgKzQ0MjEsNzMgQEAKIAljMnVfRjgsIGMydV9GOSwgYzJ1X0ZBLCBjMnVfRkIsIGMydV9GQywgYzJ1X0ZELCBjMnVfRkUsIE5VTEwsICAgCiB9OwogCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDBbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEExLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEVDLCAvKiAweEE0LTB4QTcgKi8KKwkweEExLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEExLCAweEUzLCAweEExLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEE0LCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEMxLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEE4LCAweEE0LCAweEE4LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEE4LCAweEE4LCAweEE4LCAweEE2LCAweEE4LCAweEJBLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEE4LCAweEFDLCAweEE4LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEIwLCAweEE4LCAweEFFLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEMyLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweEI0LCAweEE4LCAweEIyLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEE4LCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wMVs1MTJdID0gewogCTB4QTgsIDB4QTEsIDB4QTgsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLwpAQCAtMTA4MjUsNyArMTA4OTIsNyBAQAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKLQlOVUxMLCAgIHUyY18wMSwgdTJjXzAyLCB1MmNfMDMsIHUyY18wNCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJdTJjXzAwLCB1MmNfMDEsIHUyY18wMiwgdTJjXzAzLCB1MmNfMDQsIE5VTEwsICAgTlVMTCwgICBOVUxMLAogCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKIAlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCiAJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIApAQCAtMTA5MzYsMTEgKzExMDAzLDM0IEBACiAJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CiAJdW5zaWduZWQgY2hhciBjbCA9IHVuaSYweEZGOwogCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pPj44KSYweEZGOwotCWludCBuOworCXVuc2lnbmVkIGNoYXIgb3V0MCxvdXQxOwogCiAJaWYgKGJvdW5kbGVuIDw9IDApCiAJCXJldHVybiAtRU5BTUVUT09MT05HOwogCisJaWYgKHVuaSA9PSAweDIwYWMpIHsvKiBFdXJvIHN5bWJvbC5UaGUgb25seSBleGNlcHRpb24gd2l0aCBhIG5vbi1hc2NpaSB1bmljb2RlICovCisJCW91dFswXSA9IDB4ODA7CisJCXJldHVybiAxOworCX0KKworCWlmIChjaCA9PSAwKSB7IC8qIGhhbmRsZSB0aGUgVTAwIHBsYW5lKi8KKwkJLyogaWYgKGNsID09IDApIHJldHVybiAtRUlOVkFMOyovIC8qVTAwMDAgaXMgbGVnYWwgaW4gY3A5MzYqLworCQlvdXQwID0gdTJjXzAwW2NsKjJdOworCQlvdXQxID0gdTJjXzAwW2NsKjIrMV07CisJCWlmIChvdXQwID09IDB4MDAgJiYgb3V0MSA9PSAweDAwKSB7CisJCQlpZiAoY2w8MHg4MCkgeworCQkJCW91dFswXSA9IGNsOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQlpZiAoYm91bmRsZW4gPD0gMSkKKwkJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkJCW91dFswXSA9IG91dDA7CisJCQlvdXRbMV0gPSBvdXQxOworCQkJcmV0dXJuIDI7CisJCX0KKwl9CiAKIAl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOwogCWlmICh1bmkyY2hhcnNldCkgewpAQCAtMTA5NTAsMTUgKzExMDQwLDEwIEBACiAJCW91dFsxXSA9IHVuaTJjaGFyc2V0W2NsKjIrMV07CiAJCWlmIChvdXRbMF0gPT0gMHgwMCAmJiBvdXRbMV0gPT0gMHgwMCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQluID0gMjsKLQl9IGVsc2UgaWYgKGNoPT0wICYmIGNsKSB7Ci0JCW91dFswXSA9IGNsOwotCQluID0gMTsKKwkJcmV0dXJuIDI7CiAJfQogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gbjsKIH0KIAogc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwKQEAgLTEwOTcyLDcgKzExMDU3LDExIEBACiAJCXJldHVybiAtRU5BTUVUT09MT05HOwogCiAJaWYgKGJvdW5kbGVuID09IDEpIHsKLQkJKnVuaSA9IHJhd3N0cmluZ1swXTsKKwkJaWYgKHJhd3N0cmluZ1swXT09MHg4MCkgeyAvKiBFdXJvIHN5bWJvbC5UaGUgb25seSBleGNlcHRpb24gd2l0aCBhIG5vbi1hc2NpaSB1bmljb2RlICovCisJCQkqdW5pID0gMHgyMGFjOworCQl9IGVsc2UgeworCQkJKnVuaSA9IHJhd3N0cmluZ1swXTsKKwkJfQogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTEwOTg2LDcgKzExMDc1LDExIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbiA9IDI7CiAJfSBlbHNlewotCQkqdW5pID0gY2g7CisJCWlmIChjaD09MHg4MCkgey8qIEV1cm8gc3ltYm9sLlRoZSBvbmx5IGV4Y2VwdGlvbiB3aXRoIGEgbm9uLWFzY2lpIHVuaWNvZGUgKi8KKwkJCSp1bmkgPSAweDIwYWM7CisJCX0gZWxzZSB7CisJCQkqdW5pID0gY2g7CisJCX0KIAkJbiA9IDE7CiAJfQogCXJldHVybiBuOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hdHRyaWIuYyBiL2ZzL250ZnMvYXR0cmliLmMKaW5kZXggOWYwOGU4NS4uYzU3N2Q4ZSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9hdHRyaWIuYworKysgYi9mcy9udGZzL2F0dHJpYi5jCkBAIC0xMjcyLDcgKzEyNzIsNyBAQAogewogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CiAKLQljdHggPSBrbWVtX2NhY2hlX2FsbG9jKG50ZnNfYXR0cl9jdHhfY2FjaGUsIFNMQUJfTk9GUyk7CisJY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2F0dHJfY3R4X2NhY2hlLCBHRlBfTk9GUyk7CiAJaWYgKGN0eCkKIAkJbnRmc19hdHRyX2luaXRfc2VhcmNoX2N0eChjdHgsIG5pLCBtcmVjKTsKIAlyZXR1cm4gY3R4OwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kaXIuYyBiL2ZzL250ZnMvZGlyLmMKaW5kZXggODVjMzZiOC4uODI5NmMyOSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9kaXIuYworKysgYi9mcy9udGZzL2Rpci5jCkBAIC0xMTAxLDcgKzExMDEsNyBAQAogewogCXM2NCBpYV9wb3MsIGlhX3N0YXJ0LCBwcmV2X2lhX3BvcywgYm1wX3BvczsKIAlsb2ZmX3QgZnBvcywgaV9zaXplOwotCXN0cnVjdCBpbm9kZSAqYm1wX3ZpLCAqdmRpciA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqYm1wX3ZpLCAqdmRpciA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZkaXItPmlfc2I7CiAJbnRmc19pbm9kZSAqbmRpciA9IE5URlNfSSh2ZGlyKTsKIAludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihzYik7CkBAIC0xMTM2LDkgKzExMzYsOSBAQAogCWlmIChmcG9zID09IDEpIHsKIAkJbnRmc19kZWJ1ZygiQ2FsbGluZyBmaWxsZGlyIGZvciAuLiB3aXRoIGxlbiAyLCBmcG9zIDB4MSwgIgogCQkJCSJpbm9kZSAweCVseCwgRFRfRElSLiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpcGFyZW50X2lubyhmaWxwLT5mX2RlbnRyeSkpOworCQkJCSh1bnNpZ25lZCBsb25nKXBhcmVudF9pbm8oZmlscC0+Zl9wYXRoLmRlbnRyeSkpOwogCQlyYyA9IGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCBmcG9zLAotCQkJCXBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpLCBEVF9ESVIpOworCQkJCXBhcmVudF9pbm8oZmlscC0+Zl9wYXRoLmRlbnRyeSksIERUX0RJUik7CiAJCWlmIChyYykKIAkJCWdvdG8gZG9uZTsKIAkJZnBvcysrOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9maWxlLmMgYi9mcy9udGZzL2ZpbGUuYwppbmRleCBhZTJmZTAwLi4wNzZjOTQyIDEwMDY0NAotLS0gYS9mcy9udGZzL2ZpbGUuYworKysgYi9mcy9udGZzL2ZpbGUuYwpAQCAtMjE2Miw3ICsyMTYyLDcgQEAKIAkJZ290byBvdXQ7CiAJaWYgKCFjb3VudCkKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOworCWVyciA9IHJlbW92ZV9zdWlkKGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CmRpZmYgLS1naXQgYS9mcy9udGZzL2luZGV4LmMgYi9mcy9udGZzL2luZGV4LmMKaW5kZXggZTMyY2RlNC4uMjE5NGVmZiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9pbmRleC5jCisrKyBiL2ZzL250ZnMvaW5kZXguYwpAQCAtMzgsNyArMzgsNyBAQAogewogCW50ZnNfaW5kZXhfY29udGV4dCAqaWN0eDsKIAotCWljdHggPSBrbWVtX2NhY2hlX2FsbG9jKG50ZnNfaW5kZXhfY3R4X2NhY2hlLCBTTEFCX05PRlMpOworCWljdHggPSBrbWVtX2NhY2hlX2FsbG9jKG50ZnNfaW5kZXhfY3R4X2NhY2hlLCBHRlBfTk9GUyk7CiAJaWYgKGljdHgpCiAJCSppY3R4ID0gKG50ZnNfaW5kZXhfY29udGV4dCl7IC5pZHhfbmkgPSBpZHhfbmkgfTsKIAlyZXR1cm4gaWN0eDsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvaW5vZGUuYyBiL2ZzL250ZnMvaW5vZGUuYwppbmRleCAyZDNkZTljLi4yNDc5ODk4IDEwMDY0NAotLS0gYS9mcy9udGZzL2lub2RlLmMKKysrIGIvZnMvbnRmcy9pbm9kZS5jCkBAIC0zMjQsNyArMzI0LDcgQEAKIAludGZzX2lub2RlICpuaTsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwotCW5pID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2JpZ19pbm9kZV9jYWNoZSwgU0xBQl9OT0ZTKTsKKwluaSA9IGttZW1fY2FjaGVfYWxsb2MobnRmc19iaWdfaW5vZGVfY2FjaGUsIEdGUF9OT0ZTKTsKIAlpZiAobGlrZWx5KG5pICE9IE5VTEwpKSB7CiAJCW5pLT5zdGF0ZSA9IDA7CiAJCXJldHVybiBWRlNfSShuaSk7CkBAIC0zNDksNyArMzQ5LDcgQEAKIAludGZzX2lub2RlICpuaTsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwotCW5pID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2lub2RlX2NhY2hlLCBTTEFCX05PRlMpOworCW5pID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2lub2RlX2NhY2hlLCBHRlBfTk9GUyk7CiAJaWYgKGxpa2VseShuaSAhPSBOVUxMKSkgewogCQluaS0+c3RhdGUgPSAwOwogCQlyZXR1cm4gbmk7CmRpZmYgLS1naXQgYS9mcy9udGZzL3VuaXN0ci5jIGIvZnMvbnRmcy91bmlzdHIuYwppbmRleCA2YTQ5NWY3Li4wMDVjYTRiIDEwMDY0NAotLS0gYS9mcy9udGZzL3VuaXN0ci5jCisrKyBiL2ZzL250ZnMvdW5pc3RyLmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogCiAJLyogV2UgZG8gbm90IHRydXN0IG91dHNpZGUgc291cmNlcy4gKi8KIAlpZiAobGlrZWx5KGlucykpIHsKLQkJdWNzID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX25hbWVfY2FjaGUsIFNMQUJfTk9GUyk7CisJCXVjcyA9IGttZW1fY2FjaGVfYWxsb2MobnRmc19uYW1lX2NhY2hlLCBHRlBfTk9GUyk7CiAJCWlmIChsaWtlbHkodWNzKSkgewogCQkJZm9yIChpID0gbyA9IDA7IGkgPCBpbnNfbGVuOyBpICs9IHdjX2xlbikgewogCQkJCXdjX2xlbiA9IG5scy0+Y2hhcjJ1bmkoaW5zICsgaSwgaW5zX2xlbiAtIGksCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5jIGIvZnMvb2NmczIvYWxsb2MuYwppbmRleCBmNDNiYzVmLi5mMjdlNTM3OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuYworKysgYi9mcy9vY2ZzMi9hbGxvYy5jCkBAIC01MiwxNCArNTIsMTQgQEAKIAkJCSAgICAgICB1NjQgYmxrbm8pOwogCiBzdGF0aWMgaW50IG9jZnMyX2NyZWF0ZV9uZXdfbWV0YV9iaHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgaW50IHdhbnRlZCwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSk7CiAKIHN0YXRpYyBpbnQgb2NmczJfYWRkX2JyYW5jaChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoLApAQCAtNjcsMTQgKzY3LDE0IEBACiAJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpOwogCiBzdGF0aWMgaW50IG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGgoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcmV0X25ld19lYl9iaCk7CiAKIHN0YXRpYyBpbnQgb2NmczJfZG9faW5zZXJ0X2V4dGVudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJCSAgdTY0IGJsa25vLApAQCAtMTUyLDcgKzE1Miw3IEBACiAgKiBsX2NvdW50IGZvciB5b3UKICAqLwogc3RhdGljIGludCBvY2ZzMl9jcmVhdGVfbmV3X21ldGFfYmhzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIGludCB3YW50ZWQsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKQEAgLTI1Myw3ICsyNTMsNyBAQAogICogY29udGFpbiBhIHNpbmdsZSByZWNvcmQgd2l0aCBlX2NsdXN0ZXJzID09IDAuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfYWRkX2JyYW5jaChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoLApAQCAtNDE4LDcgKzQxOCw3IEBACiAgKiBhZnRlciB0aGlzIGNhbGwuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfc2hpZnRfdHJlZV9kZXB0aChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCkBAIC01MjAsNyArNTIwLDcgQEAKICAqIGRvd24uCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfZG9faW5zZXJ0X2V4dGVudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJCSAgdTY0IHN0YXJ0X2JsaywKQEAgLTgwOSw3ICs4MDksNyBAQAogCiAvKiB0aGUgY2FsbGVyIG5lZWRzIHRvIHVwZGF0ZSBmZS0+aV9jbHVzdGVycyAqLwogaW50IG9jZnMyX2luc2VydF9leHRlbnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCWhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCXU2NCBzdGFydF9ibGssCkBAIC05NTEsNyArOTUxLDcgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgdTY0IHN0YXJ0X2JsaywKIAkJCQkgICAgIHVuc2lnbmVkIGludCBudW1fY2x1c3RlcnMpCiB7CkBAIC0xMDM0LDcgKzEwMzQsNyBAQAogfQogCiBzdGF0aWMgaW50IG9jZnMyX3JlcGxheV90cnVuY2F0ZV9yZWNvcmRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQkgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJCSBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgc3RydWN0IGlub2RlICpkYXRhX2FsbG9jX2lub2RlLAogCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2FsbG9jX2JoKQogewpAQCAtMTExMyw3ICsxMTEzLDcgQEAKIHsKIAlpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBudW1fdG9fZmx1c2g7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOwogCXN0cnVjdCBpbm9kZSAqZGF0YV9hbGxvY19pbm9kZSA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bF9iaCA9IG9zYi0+b3NiX3RsX2JoOwpAQCAtMTEzMCw3ICsxMTMwLDcgQEAKIAlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKIAkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUob3NiLT5zYiwgZGkpOwogCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0OwogCX0KIAogCW51bV90b19mbHVzaCA9IGxlMTZfdG9fY3B1KHRsLT50bF91c2VkKTsKQEAgLTExMzgsMTQgKzExMzgsNyBAQAogCSAgICAgbnVtX3RvX2ZsdXNoLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0kodGxfaW5vZGUpLT5pcF9ibGtubyk7CiAJaWYgKCFudW1fdG9fZmx1c2gpIHsKIAkJc3RhdHVzID0gMDsKLQkJZ290byBiYWlsOwotCX0KLQotCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmICghaGFuZGxlKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dDsKIAl9CiAKIAlkYXRhX2FsbG9jX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKQEAgLTExNTQsNDEgKzExNDcsNDAgQEAKIAlpZiAoIWRhdGFfYWxsb2NfaW5vZGUpIHsKIAkJc3RhdHVzID0gLUVJTlZBTDsKIAkJbWxvZyhNTF9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgYml0bWFwIGlub2RlIVxuIik7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAJfQogCi0Jb2NmczJfaGFuZGxlX2FkZF9pbm9kZShoYW5kbGUsIGRhdGFfYWxsb2NfaW5vZGUpOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkYXRhX2FsbG9jX2lub2RlLCBoYW5kbGUsICZkYXRhX2FsbG9jX2JoLCAxKTsKKwltdXRleF9sb2NrKCZkYXRhX2FsbG9jX2lub2RlLT5pX211dGV4KTsKKworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkYXRhX2FsbG9jX2lub2RlLCAmZGF0YV9hbGxvY19iaCwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X211dGV4OwogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCWhhbmRsZSA9IE5VTEw7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJc3RhdHVzID0gb2NmczJfcmVwbGF5X3RydW5jYXRlX3JlY29yZHMob3NiLCBoYW5kbGUsIGRhdGFfYWxsb2NfaW5vZGUsCiAJCQkJCSAgICAgICBkYXRhX2FsbG9jX2JoKTsKLQlpZiAoc3RhdHVzIDwgMCkgeworCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9CiAKLWJhaWw6Ci0JaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAotCWlmIChkYXRhX2FsbG9jX2lub2RlKQotCQlpcHV0KGRhdGFfYWxsb2NfaW5vZGUpOworb3V0X3VubG9jazoKKwlicmVsc2UoZGF0YV9hbGxvY19iaCk7CisJb2NmczJfbWV0YV91bmxvY2soZGF0YV9hbGxvY19pbm9kZSwgMSk7CiAKLQlpZiAoZGF0YV9hbGxvY19iaCkKLQkJYnJlbHNlKGRhdGFfYWxsb2NfYmgpOworb3V0X211dGV4OgorCW11dGV4X3VubG9jaygmZGF0YV9hbGxvY19pbm9kZS0+aV9tdXRleCk7CisJaXB1dChkYXRhX2FsbG9jX2lub2RlKTsKIAorb3V0OgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMjA1LDEwICsxMTk3LDEyIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHZvaWQgb2NmczJfdHJ1bmNhdGVfbG9nX3dvcmtlcih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgb2NmczJfdHJ1bmNhdGVfbG9nX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJaW50IHN0YXR1czsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IGRhdGE7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG9jZnMyX3N1cGVyLAorCQkJICAgICBvc2JfdHJ1bmNhdGVfbG9nX3dxLndvcmspOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTEzNDcsNyArMTM0MSw3IEBACiAJaW50IGk7CiAJdW5zaWduZWQgaW50IGNsdXN0ZXJzLCBudW1fcmVjcywgc3RhcnRfY2x1c3RlcjsKIAl1NjQgc3RhcnRfYmxrOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlOworCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOwogCXN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9sb2cgKnRsOwogCkBAIC0xMzczLDggKzEzNjcsNyBAQAogCQkJfQogCQl9CiAKLQkJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBOVUxMLAotCQkJCQkgICBPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFKTsKKwkJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFKTsKIAkJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xMzg3LDcgKzEzODAsNyBAQAogCiAJCXN0YXR1cyA9IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQob3NiLCBoYW5kbGUsCiAJCQkJCQkgICBzdGFydF9ibGssIGNsdXN0ZXJzKTsKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWxfdXA7CkBAIC0xNDQxLDcgKzE0MzQsOCBAQAogCS8qIG9jZnMyX3RydW5jYXRlX2xvZ19zaHV0ZG93biBrZXlzIG9uIHRoZSBleGlzdGVuY2Ugb2YKIAkgKiBvc2ItPm9zYl90bF9pbm9kZSBzbyB3ZSBkb24ndCBzZXQgYW55IG9mIHRoZSBvc2IgdmFyaWFibGVzCiAJICogdW50aWwgd2UncmUgc3VyZSBhbGwgaXMgd2VsbC4gKi8KLQlJTklUX1dPUksoJm9zYi0+b3NiX3RydW5jYXRlX2xvZ193cSwgb2NmczJfdHJ1bmNhdGVfbG9nX3dvcmtlciwgb3NiKTsKKwlJTklUX0RFTEFZRURfV09SSygmb3NiLT5vc2JfdHJ1bmNhdGVfbG9nX3dxLAorCQkJICBvY2ZzMl90cnVuY2F0ZV9sb2dfd29ya2VyKTsKIAlvc2ItPm9zYl90bF9iaCAgICA9IHRsX2JoOwogCW9zYi0+b3NiX3RsX2lub2RlID0gdGxfaW5vZGU7CiAKQEAgLTE1NDMsNyArMTUzNyw3IEBACiAJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2xhc3RfZWJfYmgsCi0JCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICBzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqdGMpCiB7CiAJaW50IHN0YXR1cywgaSwgZGVwdGg7CkBAIC0xNzgyLDcgKzE3NzYsNyBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKQEAgLTE4NjgsNyArMTg2Miw3IEBACiAKIAljcmVkaXRzID0gb2NmczJfY2FsY190cmVlX3RydW5jX2NyZWRpdHMob3NiLT5zYiwgY2x1c3RlcnNfdG9fZGVsLAogCQkJCQkJZmUsIGVsKTsKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE5VTEwsIGNyZWRpdHMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTE4OTEsNyArMTg4NSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CiAJdGxfc2VtID0gMDsKIAotCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAJaGFuZGxlID0gTlVMTDsKIAogCUJVR19PTihsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycykgPCB0YXJnZXRfaV9jbHVzdGVycyk7CkBAIC0xOTA2LDcgKzE5MDAsNyBAQAogCQltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKIAogCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiAJaWYgKGxhc3RfZWJfYmgpCiAJCWJyZWxzZShsYXN0X2ViX2JoKTsKQEAgLTE5NjUsNyArMTk1OSw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQkqdGMgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCksIEdGUF9LRVJORUwpOworCSp0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEoKnRjKSkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0yMDExLDEwICsyMDA1LDcgQEAKIAkJbXV0ZXhfbG9jaygmZXh0X2FsbG9jX2lub2RlLT5pX211dGV4KTsKIAkJKCp0YyktPnRjX2V4dF9hbGxvY19pbm9kZSA9IGV4dF9hbGxvY19pbm9kZTsKIAotCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZXh0X2FsbG9jX2lub2RlLAotCQkJCQkgTlVMTCwKLQkJCQkJICZleHRfYWxsb2NfYmgsCi0JCQkJCSAxKTsKKwkJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGV4dF9hbGxvY19pbm9kZSwgJmV4dF9hbGxvY19iaCwgMSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5oIGIvZnMvb2NmczIvYWxsb2MuaAppbmRleCAxMmJhODk3Li4wYjgyZTgwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5oCisrKyBiL2ZzL29jZnMyL2FsbG9jLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQ7CiBpbnQgb2NmczJfaW5zZXJ0X2V4dGVudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJdTY0IGJsa25vLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYW9wcy5jIGIvZnMvb2NmczIvYW9wcy5jCmluZGV4IDNkN2MwODIuLmVmNmNkMzAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FvcHMuYworKysgYi9mcy9vY2ZzMi9hb3BzLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCiAJbWxvZ19lbnRyeSgiKDB4JXAsICVsdSlcbiIsIGZpbGUsIChwYWdlID8gcGFnZS0+aW5kZXggOiAwKSk7CiAKLQlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfd2l0aF9wYWdlKGlub2RlLCBOVUxMLCBOVUxMLCAwLCBwYWdlKTsKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfd2l0aF9wYWdlKGlub2RlLCBOVUxMLCAwLCBwYWdlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJaWYgKHJldCA9PSBBT1BfVFJVTkNBVEVEX1BBR0UpCiAJCQl1bmxvY2sgPSAwOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAKIAltbG9nX2VudHJ5KCIoMHglcCwgMHglcCwgJXUsICV1KVxuIiwgZmlsZSwgcGFnZSwgZnJvbSwgdG8pOwogCi0JcmV0ID0gb2NmczJfbWV0YV9sb2NrX3dpdGhfcGFnZShpbm9kZSwgTlVMTCwgTlVMTCwgMCwgcGFnZSk7CisJcmV0ID0gb2NmczJfbWV0YV9sb2NrX3dpdGhfcGFnZShpbm9kZSwgTlVMTCwgMCwgcGFnZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zNTUsMTYgKzM1NSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqb2NmczJfc3RhcnRfd2Fsa19wYWdlX3RyYW5zKHN0cnVjdCBpbm9kZSAqaW5vZGUsCitoYW5kbGVfdCAqb2NmczJfc3RhcnRfd2Fsa19wYWdlX3RyYW5zKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCQkJIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCQkJCSB1bnNpZ25lZCBmcm9tLAogCQkJCQkJCSB1bnNpZ25lZCB0bykKIHsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE5VTEwsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKIAlpZiAoIWhhbmRsZSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0zNzIsNyArMzcyLDcgQEAKIAl9CiAKIAlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7Ci0JCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZS0+a19oYW5kbGUsCisJCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwKIAkJCQkJcGFnZV9idWZmZXJzKHBhZ2UpLAogCQkJCQlmcm9tLCB0bywgTlVMTCwKIAkJCQkJb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKQEAgLTM4Miw3ICszODIsNyBAQAogb3V0OgogCWlmIChyZXQpIHsKIAkJaWYgKGhhbmRsZSkKLQkJCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAkJaGFuZGxlID0gRVJSX1BUUihyZXQpOwogCX0KIAlyZXR1cm4gaGFuZGxlOwpAQCAtMzk0LDcgKzM5NCw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAKIAltbG9nX2VudHJ5KCIoMHglcCwgMHglcCwgJXUsICV1KVxuIiwgZmlsZSwgcGFnZSwgZnJvbSwgdG8pOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJICogICAgc3RhbGUgaW5vZGUgYWxsb2NhdGlvbiBpbWFnZSAoaV9zaXplLCBpX2NsdXN0ZXJzLCBldGMpLgogCSAqLwogCi0JcmV0ID0gb2NmczJfbWV0YV9sb2NrX3dpdGhfcGFnZShpbm9kZSwgTlVMTCwgJmRpX2JoLCAxLCBwYWdlKTsKKwlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfd2l0aF9wYWdlKGlub2RlLCAmZGlfYmgsIDEsIHBhZ2UpOwogCWlmIChyZXQgIT0gMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJfQogCiBvdXRfY29tbWl0OgotCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CiBvdXRfdW5sb2NrX2RhdGE6CiAJb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOwogb3V0X3VubG9ja19tZXRhOgpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJICogYWNjZXNzZWQgY29uY3VycmVudGx5IGZyb20gbXVsdGlwbGUgbm9kZXMuCiAJICovCiAJaWYgKCFJTk9ERV9KT1VSTkFMKGlub2RlKSkgewotCQllcnIgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIE5VTEwsIDApOworCQllcnIgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOwogCQlpZiAoZXJyKSB7CiAJCQlpZiAoZXJyICE9IC1FTk9FTlQpCiAJCQkJbWxvZ19lcnJubyhlcnIpOwpAQCAtNTk1LDcgKzU5NSw3IEBACiAJCQkgICAgIHNzaXplX3QgYnl0ZXMsCiAJCQkgICAgIHZvaWQgKnByaXZhdGUpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJLyogdGhpcyBpbydzIHN1Ym1pdHRlciBzaG91bGQgbm90IGhhdmUgdW5sb2NrZWQgdGhpcyBiZWZvcmUgd2UgY291bGQgKi8KIAlCVUdfT04oIW9jZnMyX2lvY2JfaXNfcndfbG9ja2VkKGlvY2IpKTsKQEAgLTYxMSw3ICs2MTEsNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmctPmhvc3Q7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZy0+aG9zdDsKIAlpbnQgcmV0OwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmggYi9mcy9vY2ZzMi9hb3BzLmgKaW5kZXggZTg4YzNmMC4uZjQ0NmExNSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5oCisrKyBiL2ZzL29jZnMyL2FvcHMuaApAQCAtMjUsNyArMjUsNyBAQAogaW50IG9jZnMyX3ByZXBhcmVfd3JpdGVfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKTsKIAotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpvY2ZzMl9zdGFydF93YWxrX3BhZ2VfdHJhbnMoc3RydWN0IGlub2RlICppbm9kZSwKK2hhbmRsZV90ICpvY2ZzMl9zdGFydF93YWxrX3BhZ2VfdHJhbnMoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJCQkJIHVuc2lnbmVkIGZyb20sCiAJCQkJCQkJIHVuc2lnbmVkIHRvKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDMwNWNiYTMuLmEyNWVmNWEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJICogcmVjb2duaXplcyBhIG5vZGUgZ29pbmcgdXAgYW5kIGRvd24gaW4gb25lIGl0ZXJhdGlvbiAqLwogCXU2NAkJCWhyX2dlbmVyYXRpb247CiAKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJaHJfd3JpdGVfdGltZW91dF93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsJaHJfd3JpdGVfdGltZW91dF93b3JrOwogCXVuc2lnbmVkIGxvbmcJCWhyX2xhc3RfdGltZW91dF9zdGFydDsKIAogCS8qIFVzZWQgZHVyaW5nIG8yaGJfY2hlY2tfc2xvdCB0byBob2xkIGEgY29weSBvZiB0aGUgYmxvY2sKQEAgLTE1Niw5ICsxNTYsMTEgQEAKIAlpbnQgICAgICAgICAgICAgICB3Y19lcnJvcjsKIH07CiAKLXN0YXRpYyB2b2lkIG8yaGJfd3JpdGVfdGltZW91dCh2b2lkICphcmcpCitzdGF0aWMgdm9pZCBvMmhiX3dyaXRlX3RpbWVvdXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBvMmhiX3JlZ2lvbiAqcmVnID0gYXJnOworCXN0cnVjdCBvMmhiX3JlZ2lvbiAqcmVnID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvMmhiX3JlZ2lvbiwKKwkJCSAgICAgaHJfd3JpdGVfdGltZW91dF93b3JrLndvcmspOwogCiAJbWxvZyhNTF9FUlJPUiwgIkhlYXJ0YmVhdCB3cml0ZSB0aW1lb3V0IHRvIGRldmljZSAlcyBhZnRlciAldSAiCiAJICAgICAibWlsbGlzZWNvbmRzXG4iLCByZWctPmhyX2Rldl9uYW1lLApAQCAtMTQwNCw3ICsxNDA2LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JSU5JVF9XT1JLKCZyZWctPmhyX3dyaXRlX3RpbWVvdXRfd29yaywgbzJoYl93cml0ZV90aW1lb3V0LCByZWcpOworCUlOSVRfREVMQVlFRF9XT1JLKCZyZWctPmhyX3dyaXRlX3RpbWVvdXRfd29yaywgbzJoYl93cml0ZV90aW1lb3V0KTsKIAogCS8qCiAJICogQSBub2RlIGlzIGNvbnNpZGVyZWQgbGl2ZSBhZnRlciBpdCBoYXMgYmVhdCBMSVZFX1RIUkVTSE9MRApAQCAtMTU1MSw3ICsxNTUzLDcgQEAKIAlzdHJ1Y3QgbzJoYl9yZWdpb24gKnJlZyA9IE5VTEw7CiAJc3RydWN0IGNvbmZpZ19pdGVtICpyZXQgPSBOVUxMOwogCi0JcmVnID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG8yaGJfcmVnaW9uKSwgR0ZQX0tFUk5FTCk7CisJcmVnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG8yaGJfcmVnaW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlZyA9PSBOVUxMKQogCQlnb3RvIG91dDsgLyogRU5PTUVNICovCiAKQEAgLTE2NzcsNyArMTY3OSw3IEBACiAJc3RydWN0IG8yaGJfaGVhcnRiZWF0X2dyb3VwICpocyA9IE5VTEw7CiAJc3RydWN0IGNvbmZpZ19ncm91cCAqcmV0ID0gTlVMTDsKIAotCWhzID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG8yaGJfaGVhcnRiZWF0X2dyb3VwKSwgR0ZQX0tFUk5FTCk7CisJaHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbzJoYl9oZWFydGJlYXRfZ3JvdXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoaHMgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYwppbmRleCBlMWZjZWI4Li5iMTczMzNhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jCkBAIC0zNSw3ICszNSw3IEBACiAvKiBmb3Igbm93IHdlIG9wZXJhdGUgdW5kZXIgdGhlIGFzc2VydGlvbiB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZQogICogY2x1c3RlciBhY3RpdmUgYXQgYSB0aW1lLiAgQ2hhbmdpbmcgdGhpcyB3aWxsIHJlcXVpcmUgdHJpY2tsaW5nCiAgKiBjbHVzdGVyIHJlZmVyZW5jZXMgdGhyb3VnaG91dCB3aGVyZSBub2RlcyBhcmUgbG9va2VkIHVwICovCi1zdGF0aWMgc3RydWN0IG8ybm1fY2x1c3RlciAqbzJubV9zaW5nbGVfY2x1c3RlciA9IE5VTEw7CitzdHJ1Y3QgbzJubV9jbHVzdGVyICpvMm5tX3NpbmdsZV9jbHVzdGVyID0gTlVMTDsKIAogI2RlZmluZSBPQ0ZTMl9NQVhfSEJfQ1RMX1BBVEggMjU2CiBzdGF0aWMgY2hhciBvY2ZzMl9oYl9jdGxfcGF0aFtPQ0ZTMl9NQVhfSEJfQ1RMX1BBVEhdID0gIi9zYmluL29jZnMyX2hiX2N0bCI7CkBAIC05NywxNyArOTcsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobzJubV9nZXRfaGJfY3RsX3BhdGgpOwogCi1zdHJ1Y3QgbzJubV9jbHVzdGVyIHsKLQlzdHJ1Y3QgY29uZmlnX2dyb3VwCWNsX2dyb3VwOwotCXVuc2lnbmVkCQljbF9oYXNfbG9jYWw6MTsKLQl1OAkJCWNsX2xvY2FsX25vZGU7Ci0Jcndsb2NrX3QJCWNsX25vZGVzX2xvY2s7Ci0Jc3RydWN0IG8ybm1fbm9kZSAgCSpjbF9ub2Rlc1tPMk5NX01BWF9OT0RFU107Ci0Jc3RydWN0IHJiX3Jvb3QJCWNsX25vZGVfaXBfdHJlZTsKLQkvKiB0aGlzIGJpdG1hcCBpcyBwYXJ0IG9mIGEgaGFjayBmb3IgZGlzayBiaXRtYXAuLiB3aWxsIGdvIGV2ZW50dWFsbHkuIC0gemFiICovCi0JdW5zaWduZWQgbG9uZwljbF9ub2Rlc19iaXRtYXBbQklUU19UT19MT05HUyhPMk5NX01BWF9OT0RFUyldOwotfTsKLQogc3RydWN0IG8ybm1fbm9kZSAqbzJubV9nZXRfbm9kZV9ieV9udW0odTggbm9kZV9udW0pCiB7CiAJc3RydWN0IG8ybm1fbm9kZSAqbm9kZSA9IE5VTEw7CkBAIC0xNTIsMTQgKzE0MSwxNiBAQAogCXN0cnVjdCBvMm5tX25vZGUgKm5vZGUsICpyZXQgPSBOVUxMOwogCiAJd2hpbGUgKCpwKSB7CisJCWludCBjbXA7CisKIAkJcGFyZW50ID0gKnA7CiAJCW5vZGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBvMm5tX25vZGUsIG5kX2lwX25vZGUpOwogCi0JCWlmIChtZW1jbXAoJmlwX25lZWRsZSwgJm5vZGUtPm5kX2lwdjRfYWRkcmVzcywKLQkJICAgICAgICAgICBzaXplb2YoaXBfbmVlZGxlKSkgPCAwKQorCQljbXAgPSBtZW1jbXAoJmlwX25lZWRsZSwgJm5vZGUtPm5kX2lwdjRfYWRkcmVzcywKKwkJCQlzaXplb2YoaXBfbmVlZGxlKSk7CisJCWlmIChjbXAgPCAwKQogCQkJcCA9ICYoKnApLT5yYl9sZWZ0OwotCQllbHNlIGlmIChtZW1jbXAoJmlwX25lZWRsZSwgJm5vZGUtPm5kX2lwdjRfYWRkcmVzcywKLQkJCSAgICAgICAgc2l6ZW9mKGlwX25lZWRsZSkpID4gMCkKKwkJZWxzZSBpZiAoY21wID4gMCkKIAkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CiAJCWVsc2UgewogCQkJcmV0ID0gbm9kZTsKQEAgLTU0MSw2ICs1MzIsMTc5IEBACiB9CiAjZW5kaWYKIAorc3RydWN0IG8ybm1fY2x1c3Rlcl9hdHRyaWJ1dGUgeworCXN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IG8ybm1fY2x1c3RlciAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IG8ybm1fY2x1c3RlciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Cit9OworCitzdGF0aWMgc3NpemVfdCBvMm5tX2NsdXN0ZXJfYXR0cl93cml0ZShjb25zdCBjaGFyICpwYWdlLCBzc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp2YWwpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJY2hhciAqcCA9IChjaGFyICopcGFnZTsKKworCXRtcCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAwKTsKKwlpZiAoIXAgfHwgKCpwICYmICgqcCAhPSAnXG4nKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRtcCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodG1wID49ICh1MzIpLTEpCisJCXJldHVybiAtRVJBTkdFOworCisJKnZhbCA9IHRtcDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgbzJubV9jbHVzdGVyX2F0dHJfaWRsZV90aW1lb3V0X21zX3JlYWQoCisJc3RydWN0IG8ybm1fY2x1c3RlciAqY2x1c3RlciwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXVcbiIsIGNsdXN0ZXItPmNsX2lkbGVfdGltZW91dF9tcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG8ybm1fY2x1c3Rlcl9hdHRyX2lkbGVfdGltZW91dF9tc193cml0ZSgKKwlzdHJ1Y3QgbzJubV9jbHVzdGVyICpjbHVzdGVyLCBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXJldCA9ICBvMm5tX2NsdXN0ZXJfYXR0cl93cml0ZShwYWdlLCBjb3VudCwgJnZhbCk7CisKKwlpZiAocmV0ID4gMCkgeworCQlpZiAoY2x1c3Rlci0+Y2xfaWRsZV90aW1lb3V0X21zICE9IHZhbAorCQkJJiYgbzJuZXRfbnVtX2Nvbm5lY3RlZF9wZWVycygpKSB7CisJCQltbG9nKE1MX05PVElDRSwKKwkJCSAgICAgIm8ybmV0OiBjYW5ub3QgY2hhbmdlIGlkbGUgdGltZW91dCBhZnRlciAiCisJCQkgICAgICJ0aGUgZmlyc3QgcGVlciBoYXMgYWdyZWVkIHRvIGl0LiIKKwkJCSAgICAgIiAgJWQgY29ubmVjdGVkIHBlZXJzXG4iLAorCQkJICAgICBvMm5ldF9udW1fY29ubmVjdGVkX3BlZXJzKCkpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfSBlbHNlIGlmICh2YWwgPD0gY2x1c3Rlci0+Y2xfa2VlcGFsaXZlX2RlbGF5X21zKSB7CisJCQltbG9nKE1MX05PVElDRSwgIm8ybmV0OiBpZGxlIHRpbWVvdXQgbXVzdCBiZSBsYXJnZXIgIgorCQkJICAgICAidGhhbiBrZWVwYWxpdmUgZGVsYXlcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCWNsdXN0ZXItPmNsX2lkbGVfdGltZW91dF9tcyA9IHZhbDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG8ybm1fY2x1c3Rlcl9hdHRyX2tlZXBhbGl2ZV9kZWxheV9tc19yZWFkKAorCXN0cnVjdCBvMm5tX2NsdXN0ZXIgKmNsdXN0ZXIsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiV1XG4iLCBjbHVzdGVyLT5jbF9rZWVwYWxpdmVfZGVsYXlfbXMpOworfQorCitzdGF0aWMgc3NpemVfdCBvMm5tX2NsdXN0ZXJfYXR0cl9rZWVwYWxpdmVfZGVsYXlfbXNfd3JpdGUoCisJc3RydWN0IG8ybm1fY2x1c3RlciAqY2x1c3RlciwgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CisKKwlyZXQgPSAgbzJubV9jbHVzdGVyX2F0dHJfd3JpdGUocGFnZSwgY291bnQsICZ2YWwpOworCisJaWYgKHJldCA+IDApIHsKKwkJaWYgKGNsdXN0ZXItPmNsX2tlZXBhbGl2ZV9kZWxheV9tcyAhPSB2YWwKKwkJICAgICYmIG8ybmV0X251bV9jb25uZWN0ZWRfcGVlcnMoKSkgeworCQkJbWxvZyhNTF9OT1RJQ0UsCisJCQkgICAgICJvMm5ldDogY2Fubm90IGNoYW5nZSBrZWVwYWxpdmUgZGVsYXkgYWZ0ZXIiCisJCQkgICAgICIgdGhlIGZpcnN0IHBlZXIgaGFzIGFncmVlZCB0byBpdC4iCisJCQkgICAgICIgICVkIGNvbm5lY3RlZCBwZWVyc1xuIiwKKwkJCSAgICAgbzJuZXRfbnVtX2Nvbm5lY3RlZF9wZWVycygpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZSBpZiAodmFsID49IGNsdXN0ZXItPmNsX2lkbGVfdGltZW91dF9tcykgeworCQkJbWxvZyhNTF9OT1RJQ0UsICJvMm5ldDoga2VlcGFsaXZlIGRlbGF5IG11c3QgYmUgIgorCQkJICAgICAic21hbGxlciB0aGFuIGlkbGUgdGltZW91dFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJY2x1c3Rlci0+Y2xfa2VlcGFsaXZlX2RlbGF5X21zID0gdmFsOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgbzJubV9jbHVzdGVyX2F0dHJfcmVjb25uZWN0X2RlbGF5X21zX3JlYWQoCisJc3RydWN0IG8ybm1fY2x1c3RlciAqY2x1c3RlciwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXVcbiIsIGNsdXN0ZXItPmNsX3JlY29ubmVjdF9kZWxheV9tcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG8ybm1fY2x1c3Rlcl9hdHRyX3JlY29ubmVjdF9kZWxheV9tc193cml0ZSgKKwlzdHJ1Y3QgbzJubV9jbHVzdGVyICpjbHVzdGVyLCBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIG8ybm1fY2x1c3Rlcl9hdHRyX3dyaXRlKHBhZ2UsIGNvdW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2x1c3Rlci0+Y2xfcmVjb25uZWN0X2RlbGF5X21zKTsKK30KK3N0YXRpYyBzdHJ1Y3QgbzJubV9jbHVzdGVyX2F0dHJpYnV0ZSBvMm5tX2NsdXN0ZXJfYXR0cl9pZGxlX3RpbWVvdXRfbXMgPSB7CisJLmF0dHIJPSB7IC5jYV9vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAgLmNhX25hbWUgPSAiaWRsZV90aW1lb3V0X21zIiwKKwkJICAgIC5jYV9tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc2hvdwk9IG8ybm1fY2x1c3Rlcl9hdHRyX2lkbGVfdGltZW91dF9tc19yZWFkLAorCS5zdG9yZQk9IG8ybm1fY2x1c3Rlcl9hdHRyX2lkbGVfdGltZW91dF9tc193cml0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbzJubV9jbHVzdGVyX2F0dHJpYnV0ZSBvMm5tX2NsdXN0ZXJfYXR0cl9rZWVwYWxpdmVfZGVsYXlfbXMgPSB7CisJLmF0dHIJPSB7IC5jYV9vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAgLmNhX25hbWUgPSAia2VlcGFsaXZlX2RlbGF5X21zIiwKKwkJICAgIC5jYV9tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc2hvdwk9IG8ybm1fY2x1c3Rlcl9hdHRyX2tlZXBhbGl2ZV9kZWxheV9tc19yZWFkLAorCS5zdG9yZQk9IG8ybm1fY2x1c3Rlcl9hdHRyX2tlZXBhbGl2ZV9kZWxheV9tc193cml0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbzJubV9jbHVzdGVyX2F0dHJpYnV0ZSBvMm5tX2NsdXN0ZXJfYXR0cl9yZWNvbm5lY3RfZGVsYXlfbXMgPSB7CisJLmF0dHIJPSB7IC5jYV9vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAgLmNhX25hbWUgPSAicmVjb25uZWN0X2RlbGF5X21zIiwKKwkJICAgIC5jYV9tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc2hvdwk9IG8ybm1fY2x1c3Rlcl9hdHRyX3JlY29ubmVjdF9kZWxheV9tc19yZWFkLAorCS5zdG9yZQk9IG8ybm1fY2x1c3Rlcl9hdHRyX3JlY29ubmVjdF9kZWxheV9tc193cml0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlICpvMm5tX2NsdXN0ZXJfYXR0cnNbXSA9IHsKKwkmbzJubV9jbHVzdGVyX2F0dHJfaWRsZV90aW1lb3V0X21zLmF0dHIsCisJJm8ybm1fY2x1c3Rlcl9hdHRyX2tlZXBhbGl2ZV9kZWxheV9tcy5hdHRyLAorCSZvMm5tX2NsdXN0ZXJfYXR0cl9yZWNvbm5lY3RfZGVsYXlfbXMuYXR0ciwKKwlOVUxMLAorfTsKK3N0YXRpYyBzc2l6ZV90IG8ybm1fY2x1c3Rlcl9zaG93KHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwYWdlKQoreworCXN0cnVjdCBvMm5tX2NsdXN0ZXIgKmNsdXN0ZXIgPSB0b19vMm5tX2NsdXN0ZXIoaXRlbSk7CisJc3RydWN0IG8ybm1fY2x1c3Rlcl9hdHRyaWJ1dGUgKm8ybm1fY2x1c3Rlcl9hdHRyID0KKwkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBvMm5tX2NsdXN0ZXJfYXR0cmlidXRlLCBhdHRyKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlpZiAobzJubV9jbHVzdGVyX2F0dHItPnNob3cpCisJCXJldCA9IG8ybm1fY2x1c3Rlcl9hdHRyLT5zaG93KGNsdXN0ZXIsIHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG8ybm1fY2x1c3Rlcl9zdG9yZShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG8ybm1fY2x1c3RlciAqY2x1c3RlciA9IHRvX28ybm1fY2x1c3RlcihpdGVtKTsKKwlzdHJ1Y3QgbzJubV9jbHVzdGVyX2F0dHJpYnV0ZSAqbzJubV9jbHVzdGVyX2F0dHIgPQorCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG8ybm1fY2x1c3Rlcl9hdHRyaWJ1dGUsIGF0dHIpOworCXNzaXplX3QgcmV0OworCisJaWYgKG8ybm1fY2x1c3Rlcl9hdHRyLT5zdG9yZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG8ybm1fY2x1c3Rlcl9hdHRyLT5zdG9yZShjbHVzdGVyLCBwYWdlLCBjb3VudCk7CisJaWYgKHJldCA8IGNvdW50KQorCQlnb3RvIG91dDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IGNvbmZpZ19pdGVtICpvMm5tX25vZGVfZ3JvdXBfbWFrZV9pdGVtKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLAogCQkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtNTUwLDcgKzcxNCw3IEBACiAJaWYgKHN0cmxlbihuYW1lKSA+IE8yTk1fTUFYX05BTUVfTEVOKQogCQlnb3RvIG91dDsgLyogRU5BTUVUT09MT05HICovCiAKLQlub2RlID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG8ybm1fbm9kZSksIEdGUF9LRVJORUwpOworCW5vZGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbzJubV9ub2RlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5vZGUgPT0gTlVMTCkKIAkJZ290byBvdXQ7IC8qIEVOT01FTSAqLwogCkBAIC02MjIsMTAgKzc4NiwxMyBAQAogCiBzdGF0aWMgc3RydWN0IGNvbmZpZ2ZzX2l0ZW1fb3BlcmF0aW9ucyBvMm5tX2NsdXN0ZXJfaXRlbV9vcHMgPSB7CiAJLnJlbGVhc2UJPSBvMm5tX2NsdXN0ZXJfcmVsZWFzZSwKKwkuc2hvd19hdHRyaWJ1dGUJCT0gbzJubV9jbHVzdGVyX3Nob3csCisJLnN0b3JlX2F0dHJpYnV0ZQk9IG8ybm1fY2x1c3Rlcl9zdG9yZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY29uZmlnX2l0ZW1fdHlwZSBvMm5tX2NsdXN0ZXJfdHlwZSA9IHsKIAkuY3RfaXRlbV9vcHMJPSAmbzJubV9jbHVzdGVyX2l0ZW1fb3BzLAorCS5jdF9hdHRycwk9IG8ybm1fY2x1c3Rlcl9hdHRycywKIAkuY3Rfb3duZXIJPSBUSElTX01PRFVMRSwKIH07CiAKQEAgLTY1OCw4ICs4MjUsOCBAQAogCWlmIChvMm5tX3NpbmdsZV9jbHVzdGVyKQogCQlnb3RvIG91dDsgLyogRU5PU1BDICovCiAKLQljbHVzdGVyID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG8ybm1fY2x1c3RlciksIEdGUF9LRVJORUwpOwotCW5zID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG8ybm1fbm9kZV9ncm91cCksIEdGUF9LRVJORUwpOworCWNsdXN0ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbzJubV9jbHVzdGVyKSwgR0ZQX0tFUk5FTCk7CisJbnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbzJubV9ub2RlX2dyb3VwKSwgR0ZQX0tFUk5FTCk7CiAJZGVmcyA9IGtjYWxsb2MoMywgc2l6ZW9mKHN0cnVjdCBjb25maWdfZ3JvdXAgKiksIEdGUF9LRVJORUwpOwogCW8yaGJfZ3JvdXAgPSBvMmhiX2FsbG9jX2hiX3NldCgpOwogCWlmIChjbHVzdGVyID09IE5VTEwgfHwgbnMgPT0gTlVMTCB8fCBvMmhiX2dyb3VwID09IE5VTEwgfHwgZGVmcyA9PSBOVUxMKQpAQCAtNjc2LDYgKzg0Myw5IEBACiAJY2x1c3Rlci0+Y2xfZ3JvdXAuZGVmYXVsdF9ncm91cHNbMl0gPSBOVUxMOwogCXJ3bG9ja19pbml0KCZjbHVzdGVyLT5jbF9ub2Rlc19sb2NrKTsKIAljbHVzdGVyLT5jbF9ub2RlX2lwX3RyZWUgPSBSQl9ST09UOworCWNsdXN0ZXItPmNsX3JlY29ubmVjdF9kZWxheV9tcyA9IE8yTkVUX1JFQ09OTkVDVF9ERUxBWV9NU19ERUZBVUxUOworCWNsdXN0ZXItPmNsX2lkbGVfdGltZW91dF9tcyAgICA9IE8yTkVUX0lETEVfVElNRU9VVF9NU19ERUZBVUxUOworCWNsdXN0ZXItPmNsX2tlZXBhbGl2ZV9kZWxheV9tcyA9IE8yTkVUX0tFRVBBTElWRV9ERUxBWV9NU19ERUZBVUxUOwogCiAJcmV0ID0gJmNsdXN0ZXItPmNsX2dyb3VwOwogCW8ybm1fc2luZ2xlX2NsdXN0ZXIgPSBjbHVzdGVyOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5oIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5oCmluZGV4IGZjZTgwMzMuLjhmYjIzY2EgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmgKQEAgLTUzLDYgKzUzLDIzIEBACiAJdW5zaWduZWQgbG9uZwkJbmRfc2V0X2F0dHJpYnV0ZXM7CiB9OwogCitzdHJ1Y3QgbzJubV9jbHVzdGVyIHsKKwlzdHJ1Y3QgY29uZmlnX2dyb3VwCWNsX2dyb3VwOworCXVuc2lnbmVkCQljbF9oYXNfbG9jYWw6MTsKKwl1OAkJCWNsX2xvY2FsX25vZGU7CisJcndsb2NrX3QJCWNsX25vZGVzX2xvY2s7CisJc3RydWN0IG8ybm1fbm9kZSAgCSpjbF9ub2Rlc1tPMk5NX01BWF9OT0RFU107CisJc3RydWN0IHJiX3Jvb3QJCWNsX25vZGVfaXBfdHJlZTsKKwl1bnNpZ25lZCBpbnQJCWNsX2lkbGVfdGltZW91dF9tczsKKwl1bnNpZ25lZCBpbnQJCWNsX2tlZXBhbGl2ZV9kZWxheV9tczsKKwl1bnNpZ25lZCBpbnQJCWNsX3JlY29ubmVjdF9kZWxheV9tczsKKworCS8qIHRoaXMgYml0bWFwIGlzIHBhcnQgb2YgYSBoYWNrIGZvciBkaXNrIGJpdG1hcC4uIHdpbGwgZ28gZXZlbnR1YWxseS4gLSB6YWIgKi8KKwl1bnNpZ25lZCBsb25nCWNsX25vZGVzX2JpdG1hcFtCSVRTX1RPX0xPTkdTKE8yTk1fTUFYX05PREVTKV07Cit9OworCitleHRlcm4gc3RydWN0IG8ybm1fY2x1c3RlciAqbzJubV9zaW5nbGVfY2x1c3RlcjsKKwogdTggbzJubV90aGlzX25vZGUodm9pZCk7CiAKIGludCBvMm5tX2NvbmZpZ3VyZWRfbm9kZV9tYXAodW5zaWduZWQgbG9uZyAqbWFwLCB1bnNpZ25lZCBieXRlcyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL3F1b3J1bS5jIGIvZnMvb2NmczIvY2x1c3Rlci9xdW9ydW0uYwppbmRleCA3YmJhOThmLi40NzA1ZDY1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL3F1b3J1bS5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvcXVvcnVtLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlvMnF1b19mZW5jZV9zZWxmKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG8ycXVvX21ha2VfZGVjaXNpb24odm9pZCAqYXJnKQorc3RhdGljIHZvaWQgbzJxdW9fbWFrZV9kZWNpc2lvbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJaW50IHF1b3J1bTsKIAlpbnQgbG93ZXN0X2hiLCBsb3dlc3RfcmVhY2hhYmxlID0gMCwgZmVuY2UgPSAwOwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJc3RydWN0IG8ycXVvX3N0YXRlICpxcyA9ICZvMnF1b19zdGF0ZTsKIAogCXNwaW5fbG9ja19pbml0KCZxcy0+cXNfbG9jayk7Ci0JSU5JVF9XT1JLKCZxcy0+cXNfd29yaywgbzJxdW9fbWFrZV9kZWNpc2lvbiwgTlVMTCk7CisJSU5JVF9XT1JLKCZxcy0+cXNfd29yaywgbzJxdW9fbWFrZV9kZWNpc2lvbik7CiB9CiAKIHZvaWQgbzJxdW9fZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKaW5kZXggYjY1MGVmYS4uYWU0ZmY0YSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCkBAIC0xNDAsMTMgKzE0MCwzNSBAQAogCQkgW08yTkVUX0VSUl9ESUVEXQk9IC1FSE9TVERPV04sfTsKIAogLyogY2FuJ3QgcXVpdGUgYXZvaWQgKmFsbCogaW50ZXJuYWwgZGVjbGFyYXRpb25zIDovICovCi1zdGF0aWMgdm9pZCBvMm5ldF9zY19jb25uZWN0X2NvbXBsZXRlZCh2b2lkICphcmcpOwotc3RhdGljIHZvaWQgbzJuZXRfcnhfdW50aWxfZW1wdHkodm9pZCAqYXJnKTsKLXN0YXRpYyB2b2lkIG8ybmV0X3NodXRkb3duX3NjKHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZCBvMm5ldF9zY19jb25uZWN0X2NvbXBsZXRlZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgbzJuZXRfcnhfdW50aWxfZW1wdHkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIG8ybmV0X3NodXRkb3duX3NjKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgdm9pZCBvMm5ldF9saXN0ZW5fZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqc2ssIGludCBieXRlcyk7Ci1zdGF0aWMgdm9pZCBvMm5ldF9zY19zZW5kX2tlZXBfcmVxKHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZCBvMm5ldF9zY19zZW5kX2tlZXBfcmVxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgdm9pZCBvMm5ldF9pZGxlX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBzdGF0aWMgdm9pZCBvMm5ldF9zY19wb3N0cG9uZV9pZGxlKHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MpOworc3RhdGljIHZvaWQgbzJuZXRfc2NfcmVzZXRfaWRsZV90aW1lcihzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKTsKKworLyoKKyAqIEZJWE1FOiBUaGVzZSBzaG91bGQgdXNlIHRvX28ybm1fY2x1c3Rlcl9mcm9tX25vZGUoKSwgYnV0IHdlIGVuZCB1cAorICogbG9zaW5nIG91ciBwYXJlbnQgbGluayB0byB0aGUgY2x1c3RlciBkdXJpbmcgc2h1dGRvd24uIFRoaXMgY2FuIGJlCisgKiBzb2x2ZWQgYnkgYWRkaW5nIGEgcHJlLXJlbW92YWwgY2FsbGJhY2sgdG8gY29uZmlnZnMsIG9yIHBhc3NpbmcKKyAqIGFyb3VuZCB0aGUgY2x1c3RlciB3aXRoIHRoZSBub2RlLiAtamVmZm0KKyAqLworc3RhdGljIGlubGluZSBpbnQgbzJuZXRfcmVjb25uZWN0X2RlbGF5KHN0cnVjdCBvMm5tX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIG8ybm1fc2luZ2xlX2NsdXN0ZXItPmNsX3JlY29ubmVjdF9kZWxheV9tczsKK30KKworc3RhdGljIGlubGluZSBpbnQgbzJuZXRfa2VlcGFsaXZlX2RlbGF5KHN0cnVjdCBvMm5tX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIG8ybm1fc2luZ2xlX2NsdXN0ZXItPmNsX2tlZXBhbGl2ZV9kZWxheV9tczsKK30KKworc3RhdGljIGlubGluZSBpbnQgbzJuZXRfaWRsZV90aW1lb3V0KHN0cnVjdCBvMm5tX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIG8ybm1fc2luZ2xlX2NsdXN0ZXItPmNsX2lkbGVfdGltZW91dF9tczsKK30KIAogc3RhdGljIGlubGluZSBpbnQgbzJuZXRfc3lzX2Vycl90b19lcnJubyhlbnVtIG8ybmV0X3N5c3RlbV9lcnJvciBlcnIpCiB7CkBAIC0yNzEsNiArMjkzLDggQEAKIHsKIAlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjID0gY29udGFpbmVyX29mKGtyZWYsCiAJCQkJCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciwgc2Nfa3JlZik7CisJQlVHX09OKHRpbWVyX3BlbmRpbmcoJnNjLT5zY19pZGxlX3RpbWVvdXQpKTsKKwogCXNjbG9nKHNjLCAicmVsZWFzaW5nXG4iKTsKIAogCWlmIChzYy0+c2Nfc29jaykgewpAQCAtMzAwLDcgKzMyNCw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMpOwotCXNjID0ga2NhbGxvYygxLCBzaXplb2YoKnNjKSwgR0ZQX05PRlMpOworCXNjID0ga3phbGxvYyhzaXplb2YoKnNjKSwgR0ZQX05PRlMpOwogCWlmIChzYyA9PSBOVUxMIHx8IHBhZ2UgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKQEAgLTMwOCwxMCArMzMyLDEwIEBACiAJbzJubV9ub2RlX2dldChub2RlKTsKIAlzYy0+c2Nfbm9kZSA9IG5vZGU7CiAKLQlJTklUX1dPUksoJnNjLT5zY19jb25uZWN0X3dvcmssIG8ybmV0X3NjX2Nvbm5lY3RfY29tcGxldGVkLCBzYyk7Ci0JSU5JVF9XT1JLKCZzYy0+c2Nfcnhfd29yaywgbzJuZXRfcnhfdW50aWxfZW1wdHksIHNjKTsKLQlJTklUX1dPUksoJnNjLT5zY19zaHV0ZG93bl93b3JrLCBvMm5ldF9zaHV0ZG93bl9zYywgc2MpOwotCUlOSVRfV09SSygmc2MtPnNjX2tlZXBhbGl2ZV93b3JrLCBvMm5ldF9zY19zZW5kX2tlZXBfcmVxLCBzYyk7CisJSU5JVF9XT1JLKCZzYy0+c2NfY29ubmVjdF93b3JrLCBvMm5ldF9zY19jb25uZWN0X2NvbXBsZXRlZCk7CisJSU5JVF9XT1JLKCZzYy0+c2Nfcnhfd29yaywgbzJuZXRfcnhfdW50aWxfZW1wdHkpOworCUlOSVRfV09SSygmc2MtPnNjX3NodXRkb3duX3dvcmssIG8ybmV0X3NodXRkb3duX3NjKTsKKwlJTklUX0RFTEFZRURfV09SSygmc2MtPnNjX2tlZXBhbGl2ZV93b3JrLCBvMm5ldF9zY19zZW5kX2tlZXBfcmVxKTsKIAogCWluaXRfdGltZXIoJnNjLT5zY19pZGxlX3RpbWVvdXQpOwogCXNjLT5zY19pZGxlX3RpbWVvdXQuZnVuY3Rpb24gPSBvMm5ldF9pZGxlX3RpbWVyOwpAQCAtMzQyLDcgKzM2Niw3IEBACiAJCXNjX3B1dChzYyk7CiB9CiBzdGF0aWMgdm9pZCBvMm5ldF9zY19xdWV1ZV9kZWxheWVkX3dvcmsoc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYywKLQkJCQkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLAorCQkJCQlzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrLAogCQkJCQlpbnQgZGVsYXkpCiB7CiAJc2NfZ2V0KHNjKTsKQEAgLTM1MCwxMiArMzc0LDE5IEBACiAJCXNjX3B1dChzYyk7CiB9CiBzdGF0aWMgdm9pZCBvMm5ldF9zY19jYW5jZWxfZGVsYXllZF93b3JrKHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MsCi0JCQkJCSBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCisJCQkJCSBzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKQogewogCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKHdvcmspKQogCQlzY19wdXQoc2MpOwogfQogCitzdGF0aWMgYXRvbWljX3QgbzJuZXRfY29ubmVjdGVkX3BlZXJzID0gQVRPTUlDX0lOSVQoMCk7CisKK2ludCBvMm5ldF9udW1fY29ubmVjdGVkX3BlZXJzKHZvaWQpCit7CisJcmV0dXJuIGF0b21pY19yZWFkKCZvMm5ldF9jb25uZWN0ZWRfcGVlcnMpOworfQorCiBzdGF0aWMgdm9pZCBvMm5ldF9zZXRfbm5fc3RhdGUoc3RydWN0IG8ybmV0X25vZGUgKm5uLAogCQkJICAgICAgIHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MsCiAJCQkgICAgICAgdW5zaWduZWQgdmFsaWQsIGludCBlcnIpCkBAIC0zNjYsNiArMzk3LDExIEBACiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJm5uLT5ubl9sb2NrKTsKIAorCWlmIChvbGRfc2MgJiYgIXNjKQorCQlhdG9taWNfZGVjKCZvMm5ldF9jb25uZWN0ZWRfcGVlcnMpOworCWVsc2UgaWYgKCFvbGRfc2MgJiYgc2MpCisJCWF0b21pY19pbmMoJm8ybmV0X2Nvbm5lY3RlZF9wZWVycyk7CisKIAkvKiB0aGUgbm9kZSBudW0gY29tcGFyaXNvbiBhbmQgc2luZ2xlIGNvbm5lY3QvYWNjZXB0IHBhdGggc2hvdWxkIHN0b3AKIAkgKiBhbiBub24tbnVsbCBzYyBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggYW5vdGhlciAqLwogCUJVR19PTihzYyAmJiBubi0+bm5fc2MgJiYgbm4tPm5uX3NjICE9IHNjKTsKQEAgLTQyNCw5ICs0NjAsOSBAQAogCQkvKiBkZWxheSBpZiB3ZSdyZSB3aXRoaW5nIGEgUkVDT05ORUNUX0RFTEFZIG9mIHRoZQogCQkgKiBsYXN0IGF0dGVtcHQgKi8KIAkJZGVsYXkgPSAobm4tPm5uX2xhc3RfY29ubmVjdF9hdHRlbXB0ICsKLQkJCSBtc2Vjc190b19qaWZmaWVzKE8yTkVUX1JFQ09OTkVDVF9ERUxBWV9NUykpCisJCQkgbXNlY3NfdG9famlmZmllcyhvMm5ldF9yZWNvbm5lY3RfZGVsYXkoc2MtPnNjX25vZGUpKSkKIAkJCS0gamlmZmllczsKLQkJaWYgKGRlbGF5ID4gbXNlY3NfdG9famlmZmllcyhPMk5FVF9SRUNPTk5FQ1RfREVMQVlfTVMpKQorCQlpZiAoZGVsYXkgPiBtc2Vjc190b19qaWZmaWVzKG8ybmV0X3JlY29ubmVjdF9kZWxheShzYy0+c2Nfbm9kZSkpKQogCQkJZGVsYXkgPSAwOwogCQltbG9nKE1MX0NPTk4sICJxdWV1ZWluZyBjb25uIGF0dGVtcHQgaW4gJWx1IGppZmZpZXNcbiIsIGRlbGF5KTsKIAkJcXVldWVfZGVsYXllZF93b3JrKG8ybmV0X3dxLCAmbm4tPm5uX2Nvbm5lY3Rfd29yaywgZGVsYXkpOwpAQCAtNTY0LDkgKzYwMCwxMSBAQAogICogb3Vyc2VsdmVzIGFzIHN0YXRlX2NoYW5nZSBjb3VsZG4ndCBnZXQgdGhlIG5uX2xvY2sgYW5kIGNhbGwgc2V0X25uX3N0YXRlCiAgKiBpdHNlbGYuCiAgKi8KLXN0YXRpYyB2b2lkIG8ybmV0X3NodXRkb3duX3NjKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIG8ybmV0X3NodXRkb3duX3NjKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjID0gYXJnOworCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyLAorCQkJICAgICBzY19zaHV0ZG93bl93b3JrKTsKIAlzdHJ1Y3QgbzJuZXRfbm9kZSAqbm4gPSBvMm5ldF9ubl9mcm9tX251bShzYy0+c2Nfbm9kZS0+bmRfbnVtKTsKIAogCXNjbG9nKHNjLCAic2h1dHRpbmcgZG93blxuIik7CkBAIC02NzYsNyArNzE0LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0gICAgICAgCW5taCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBvMm5ldF9tc2dfaGFuZGxlciksIEdGUF9OT0ZTKTsKKyAgICAgICAJbm1oID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG8ybmV0X21zZ19oYW5kbGVyKSwgR0ZQX05PRlMpOwogCWlmIChubWggPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTEwOTcsMTMgKzExMzUsNTEgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCS8qCisJICogRW5zdXJlIHRpbWVvdXRzIGFyZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgbm9kZXMsIG90aGVyd2lzZQorCSAqIHdlIGNhbiBlbmQgdXAgd2l0aCBvbmUgbm9kZSB0aGlua2luZyB0aGF0IHRoZSBvdGhlciBtdXN0IGJlIGRvd24sCisJICogYnV0IGlzbid0LiBUaGlzIGNhbiB1bHRpbWF0ZWx5IGNhdXNlIGNvcnJ1cHRpb24uCisJICovCisJaWYgKGJlMzJfdG9fY3B1KGhhbmQtPm8ybmV0X2lkbGVfdGltZW91dF9tcykgIT0KKwkJCQlvMm5ldF9pZGxlX3RpbWVvdXQoc2MtPnNjX25vZGUpKSB7CisJCW1sb2coTUxfTk9USUNFLCBTQ19OT0RFRl9GTVQgIiB1c2VzIGEgbmV0d29yayBpZGxlIHRpbWVvdXQgb2YgIgorCQkgICAgICIldSBtcywgYnV0IHdlIHVzZSAldSBtcyBsb2NhbGx5LiAgZGlzY29ubmVjdGluZ1xuIiwKKwkJICAgICBTQ19OT0RFRl9BUkdTKHNjKSwKKwkJICAgICBiZTMyX3RvX2NwdShoYW5kLT5vMm5ldF9pZGxlX3RpbWVvdXRfbXMpLAorCQkgICAgIG8ybmV0X2lkbGVfdGltZW91dChzYy0+c2Nfbm9kZSkpOworCQlvMm5ldF9lbnN1cmVfc2h1dGRvd24obm4sIHNjLCAtRU5PVENPTk4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGJlMzJfdG9fY3B1KGhhbmQtPm8ybmV0X2tlZXBhbGl2ZV9kZWxheV9tcykgIT0KKwkJCW8ybmV0X2tlZXBhbGl2ZV9kZWxheShzYy0+c2Nfbm9kZSkpIHsKKwkJbWxvZyhNTF9OT1RJQ0UsIFNDX05PREVGX0ZNVCAiIHVzZXMgYSBrZWVwYWxpdmUgZGVsYXkgb2YgIgorCQkgICAgICIldSBtcywgYnV0IHdlIHVzZSAldSBtcyBsb2NhbGx5LiAgZGlzY29ubmVjdGluZ1xuIiwKKwkJICAgICBTQ19OT0RFRl9BUkdTKHNjKSwKKwkJICAgICBiZTMyX3RvX2NwdShoYW5kLT5vMm5ldF9rZWVwYWxpdmVfZGVsYXlfbXMpLAorCQkgICAgIG8ybmV0X2tlZXBhbGl2ZV9kZWxheShzYy0+c2Nfbm9kZSkpOworCQlvMm5ldF9lbnN1cmVfc2h1dGRvd24obm4sIHNjLCAtRU5PVENPTk4pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGJlMzJfdG9fY3B1KGhhbmQtPm8yaGJfaGVhcnRiZWF0X3RpbWVvdXRfbXMpICE9CisJCQlPMkhCX01BWF9XUklURV9USU1FT1VUX01TKSB7CisJCW1sb2coTUxfTk9USUNFLCBTQ19OT0RFRl9GTVQgIiB1c2VzIGEgaGVhcnRiZWF0IHRpbWVvdXQgb2YgIgorCQkgICAgICIldSBtcywgYnV0IHdlIHVzZSAldSBtcyBsb2NhbGx5LiAgZGlzY29ubmVjdGluZ1xuIiwKKwkJICAgICBTQ19OT0RFRl9BUkdTKHNjKSwKKwkJICAgICBiZTMyX3RvX2NwdShoYW5kLT5vMmhiX2hlYXJ0YmVhdF90aW1lb3V0X21zKSwKKwkJICAgICBPMkhCX01BWF9XUklURV9USU1FT1VUX01TKTsKKwkJbzJuZXRfZW5zdXJlX3NodXRkb3duKG5uLCBzYywgLUVOT1RDT05OKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCXNjLT5zY19oYW5kc2hha2Vfb2sgPSAxOwogCiAJc3Bpbl9sb2NrKCZubi0+bm5fbG9jayk7CiAJLyogc2V0IHZhbGlkIGFuZCBxdWV1ZSB0aGUgaWRsZSB0aW1lcnMgb25seSBpZiBpdCBoYXNuJ3QgYmVlbgogCSAqIHNodXQgZG93biBhbHJlYWR5ICovCiAJaWYgKG5uLT5ubl9zYyA9PSBzYykgewotCQlvMm5ldF9zY19wb3N0cG9uZV9pZGxlKHNjKTsKKwkJbzJuZXRfc2NfcmVzZXRfaWRsZV90aW1lcihzYyk7CiAJCW8ybmV0X3NldF9ubl9zdGF0ZShubiwgc2MsIDEsIDApOwogCX0KIAlzcGluX3VubG9jaygmbm4tPm5uX2xvY2spOwpAQCAtMTEyOSw2ICsxMjA1LDIzIEBACiAJc2Nsb2coc2MsICJyZWNlaXZpbmdcbiIpOwogCWRvX2dldHRpbWVvZmRheSgmc2MtPnNjX3R2X2FkdmFuY2Vfc3RhcnQpOwogCisJaWYgKHVubGlrZWx5KHNjLT5zY19oYW5kc2hha2Vfb2sgPT0gMCkpIHsKKwkJaWYoc2MtPnNjX3BhZ2Vfb2ZmIDwgc2l6ZW9mKHN0cnVjdCBvMm5ldF9oYW5kc2hha2UpKSB7CisJCQlkYXRhID0gcGFnZV9hZGRyZXNzKHNjLT5zY19wYWdlKSArIHNjLT5zY19wYWdlX29mZjsKKwkJCWRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IG8ybmV0X2hhbmRzaGFrZSkgLSBzYy0+c2NfcGFnZV9vZmY7CisJCQlyZXQgPSBvMm5ldF9yZWN2X3RjcF9tc2coc2MtPnNjX3NvY2ssIGRhdGEsIGRhdGFsZW4pOworCQkJaWYgKHJldCA+IDApCisJCQkJc2MtPnNjX3BhZ2Vfb2ZmICs9IHJldDsKKwkJfQorCisJCWlmIChzYy0+c2NfcGFnZV9vZmYgPT0gc2l6ZW9mKHN0cnVjdCBvMm5ldF9oYW5kc2hha2UpKSB7CisJCQlvMm5ldF9jaGVja19oYW5kc2hha2Uoc2MpOworCQkJaWYgKHVubGlrZWx5KHNjLT5zY19oYW5kc2hha2Vfb2sgPT0gMCkpCisJCQkJcmV0ID0gLUVQUk9UTzsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKIAkvKiBkbyB3ZSBuZWVkIG1vcmUgaGVhZGVyPyAqLwogCWlmIChzYy0+c2NfcGFnZV9vZmYgPCBzaXplb2Yoc3RydWN0IG8ybmV0X21zZykpIHsKIAkJZGF0YSA9IHBhZ2VfYWRkcmVzcyhzYy0+c2NfcGFnZSkgKyBzYy0+c2NfcGFnZV9vZmY7CkBAIC0xMTM2LDE1ICsxMjI5LDYgQEAKIAkJcmV0ID0gbzJuZXRfcmVjdl90Y3BfbXNnKHNjLT5zY19zb2NrLCBkYXRhLCBkYXRhbGVuKTsKIAkJaWYgKHJldCA+IDApIHsKIAkJCXNjLT5zY19wYWdlX29mZiArPSByZXQ7Ci0KLQkJCS8qIHRoaXMgd29ya2luZyByZWxpZXMgb24gdGhlIGhhbmRzaGFrZSBiZWluZwotCQkJICogc21hbGxlciB0aGFuIHRoZSBub3JtYWwgbWVzc2FnZSBoZWFkZXIgKi8KLQkJCWlmIChzYy0+c2NfcGFnZV9vZmYgPj0gc2l6ZW9mKHN0cnVjdCBvMm5ldF9oYW5kc2hha2UpJiYKLQkJCSAgICAhc2MtPnNjX2hhbmRzaGFrZV9vayAmJiBvMm5ldF9jaGVja19oYW5kc2hha2Uoc2MpKSB7Ci0JCQkJcmV0ID0gLUVQUk9UTzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQogCQkJLyogb25seSBzd2FiIGluY29taW5nIGhlcmUuLiB3ZSBjYW4KIAkJCSAqIG9ubHkgZ2V0IGhlcmUgb25jZSBhcyB3ZSBjcm9zcyBmcm9tCiAJCQkgKiBiZWluZyB1bmRlciB0byBvdmVyICovCkBAIC0xMjAxLDkgKzEyODUsMTAgQEAKIC8qIHRoaXMgd29yayBmdW5jIGlzIHRyaWdnZXJkIGJ5IGRhdGEgcmVhZHkuICBpdCByZWFkcyB1bnRpbCBpdCBjYW4gcmVhZCBubwogICogbW9yZS4gIGl0IGludGVycHJldHMgMCwgZW9mLCBhcyBmYXRhbC4gIGlmIGRhdGFfcmVhZHkgaGl0cyB3aGlsZSB3ZSdyZSBkb2luZwogICogb3VyIHdvcmsgdGhlIHdvcmsgc3RydWN0IHdpbGwgYmUgbWFya2VkIGFuZCB3ZSdsbCBiZSBjYWxsZWQgYWdhaW4uICovCi1zdGF0aWMgdm9pZCBvMm5ldF9yeF91bnRpbF9lbXB0eSh2b2lkICphcmcpCitzdGF0aWMgdm9pZCBvMm5ldF9yeF91bnRpbF9lbXB0eShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYyA9IGFyZzsKKwlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciwgc2Nfcnhfd29yayk7CiAJaW50IHJldDsKIAogCWRvIHsKQEAgLTEyNDUsMjYgKzEzMzAsNDMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBvMm5ldF9pbml0aWFsaXplX2hhbmRzaGFrZSh2b2lkKQoreworCW8ybmV0X2hhbmQtPm8yaGJfaGVhcnRiZWF0X3RpbWVvdXRfbXMgPSBjcHVfdG9fYmUzMigKKwkJTzJIQl9NQVhfV1JJVEVfVElNRU9VVF9NUyk7CisJbzJuZXRfaGFuZC0+bzJuZXRfaWRsZV90aW1lb3V0X21zID0gY3B1X3RvX2JlMzIoCisJCW8ybmV0X2lkbGVfdGltZW91dChOVUxMKSk7CisJbzJuZXRfaGFuZC0+bzJuZXRfa2VlcGFsaXZlX2RlbGF5X21zID0gY3B1X3RvX2JlMzIoCisJCW8ybmV0X2tlZXBhbGl2ZV9kZWxheShOVUxMKSk7CisJbzJuZXRfaGFuZC0+bzJuZXRfcmVjb25uZWN0X2RlbGF5X21zID0gY3B1X3RvX2JlMzIoCisJCW8ybmV0X3JlY29ubmVjdF9kZWxheShOVUxMKSk7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBjYWxsZWQgd2hlbiBhIGNvbm5lY3QgY29tcGxldGVzIGFuZCBhZnRlciBhIHNvY2sgaXMgYWNjZXB0ZWQuICB0aGUKICAqIHJ4IHBhdGggd2lsbCBzZWUgdGhlIHJlc3BvbnNlIGFuZCBtYXJrIHRoZSBzYyB2YWxpZCAqLwotc3RhdGljIHZvaWQgbzJuZXRfc2NfY29ubmVjdF9jb21wbGV0ZWQodm9pZCAqYXJnKQorc3RhdGljIHZvaWQgbzJuZXRfc2NfY29ubmVjdF9jb21wbGV0ZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MgPSBhcmc7CisJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIsCisJCQkgICAgIHNjX2Nvbm5lY3Rfd29yayk7CiAKIAltbG9nKE1MX01TRywgInNjIHNlbmRpbmcgaGFuZHNoYWtlIHdpdGggdmVyICVsbHUgaWQgJWxseFxuIiwKICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPMk5FVF9QUk9UT0NPTF9WRVJTSU9OLAogCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmU2NF90b19jcHUobzJuZXRfaGFuZC0+Y29ubmVjdG9yX2lkKSk7CiAKKwlvMm5ldF9pbml0aWFsaXplX2hhbmRzaGFrZSgpOwogCW8ybmV0X3NlbmRwYWdlKHNjLCBvMm5ldF9oYW5kLCBzaXplb2YoKm8ybmV0X2hhbmQpKTsKIAlzY19wdXQoc2MpOwogfQogCiAvKiB0aGlzIGlzIGNhbGxlZCBhcyBhIHdvcmtfc3RydWN0IGZ1bmMuICovCi1zdGF0aWMgdm9pZCBvMm5ldF9zY19zZW5kX2tlZXBfcmVxKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIG8ybmV0X3NjX3NlbmRfa2VlcF9yZXEoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MgPSBhcmc7CisJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIsCisJCQkgICAgIHNjX2tlZXBhbGl2ZV93b3JrLndvcmspOwogCiAJbzJuZXRfc2VuZHBhZ2Uoc2MsIG8ybmV0X2tlZXBfcmVxLCBzaXplb2YoKm8ybmV0X2tlZXBfcmVxKSk7CiAJc2NfcHV0KHNjKTsKQEAgLTEyODAsOCArMTM4MiwxMCBAQAogCiAJZG9fZ2V0dGltZW9mZGF5KCZub3cpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAibzJuZXQ6IGNvbm5lY3Rpb24gdG8gIiBTQ19OT0RFRl9GTVQgIiBoYXMgYmVlbiBpZGxlIGZvciAxMCAiCi0JICAgICAic2Vjb25kcywgc2h1dHRpbmcgaXQgZG93bi5cbiIsIFNDX05PREVGX0FSR1Moc2MpKTsKKwlwcmludGsoS0VSTl9JTkZPICJvMm5ldDogY29ubmVjdGlvbiB0byAiIFNDX05PREVGX0ZNVCAiIGhhcyBiZWVuIGlkbGUgZm9yICV1LiV1ICIKKwkgICAgICJzZWNvbmRzLCBzaHV0dGluZyBpdCBkb3duLlxuIiwgU0NfTk9ERUZfQVJHUyhzYyksCisJCSAgICAgbzJuZXRfaWRsZV90aW1lb3V0KHNjLT5zY19ub2RlKSAvIDEwMDAsCisJCSAgICAgbzJuZXRfaWRsZV90aW1lb3V0KHNjLT5zY19ub2RlKSAlIDEwMDApOwogCW1sb2coTUxfTk9USUNFLCAiaGVyZSBhcmUgc29tZSB0aW1lcyB0aGF0IG1pZ2h0IGhlbHAgZGVidWcgdGhlICIKIAkgICAgICJzaXR1YXRpb246ICh0bXIgJWxkLiVsZCBub3cgJWxkLiVsZCBkciAlbGQuJWxkIGFkdiAiCiAJICAgICAiJWxkLiVsZDolbGQuJWxkIGZ1bmMgKCUwOHg6JXUpICVsZC4lbGQ6JWxkLiVsZClcbiIsCkBAIC0xMjk5LDE0ICsxNDAzLDIxIEBACiAJbzJuZXRfc2NfcXVldWVfd29yayhzYywgJnNjLT5zY19zaHV0ZG93bl93b3JrKTsKIH0KIAotc3RhdGljIHZvaWQgbzJuZXRfc2NfcG9zdHBvbmVfaWRsZShzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQorc3RhdGljIHZvaWQgbzJuZXRfc2NfcmVzZXRfaWRsZV90aW1lcihzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQogewogCW8ybmV0X3NjX2NhbmNlbF9kZWxheWVkX3dvcmsoc2MsICZzYy0+c2Nfa2VlcGFsaXZlX3dvcmspOwogCW8ybmV0X3NjX3F1ZXVlX2RlbGF5ZWRfd29yayhzYywgJnNjLT5zY19rZWVwYWxpdmVfd29yaywKLQkJCQkgICAgTzJORVRfS0VFUEFMSVZFX0RFTEFZX1NFQ1MgKiBIWik7CisJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMobzJuZXRfa2VlcGFsaXZlX2RlbGF5KHNjLT5zY19ub2RlKSkpOwogCWRvX2dldHRpbWVvZmRheSgmc2MtPnNjX3R2X3RpbWVyKTsKIAltb2RfdGltZXIoJnNjLT5zY19pZGxlX3RpbWVvdXQsCi0JCSAgamlmZmllcyArIChPMk5FVF9JRExFX1RJTUVPVVRfU0VDUyAqIEhaKSk7CisJICAgICAgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG8ybmV0X2lkbGVfdGltZW91dChzYy0+c2Nfbm9kZSkpKTsKK30KKworc3RhdGljIHZvaWQgbzJuZXRfc2NfcG9zdHBvbmVfaWRsZShzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCS8qIE9ubHkgcHVzaCBvdXQgYW4gZXhpc3RpbmcgdGltZXIgKi8KKwlpZiAodGltZXJfcGVuZGluZygmc2MtPnNjX2lkbGVfdGltZW91dCkpCisJCW8ybmV0X3NjX3Jlc2V0X2lkbGVfdGltZXIoc2MpOwogfQogCiAvKiB0aGlzIHdvcmsgZnVuYyBpcyBraWNrZWQgd2hlbmV2ZXIgYSBwYXRoIHNldHMgdGhlIG5uIHN0YXRlIHdoaWNoIGRvZXNuJ3QKQEAgLTEzMTQsMTQgKzE0MjUsMTUgQEAKICAqIGhhdmluZyBhIGNvbm5lY3QgYXR0ZW1wdCBmYWlsLCBldGMuIFRoaXMgY2VudHJhbGl6ZXMgdGhlIGxvZ2ljIHdoaWNoIGRlY2lkZXMKICAqIGlmIGEgY29ubmVjdCBhdHRlbXB0IHNob3VsZCBiZSBtYWRlIG9yIGlmIHdlIHNob3VsZCBnaXZlIHVwIGFuZCBhbGwgZnV0dXJlCiAgKiB0cmFuc21pdCBhdHRlbXB0cyBzaG91bGQgZmFpbCAqLwotc3RhdGljIHZvaWQgbzJuZXRfc3RhcnRfY29ubmVjdCh2b2lkICphcmcpCitzdGF0aWMgdm9pZCBvMm5ldF9zdGFydF9jb25uZWN0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbzJuZXRfbm9kZSAqbm4gPSBhcmc7CisJc3RydWN0IG8ybmV0X25vZGUgKm5uID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvMm5ldF9ub2RlLCBubl9jb25uZWN0X3dvcmsud29yayk7CiAJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYyA9IE5VTEw7CiAJc3RydWN0IG8ybm1fbm9kZSAqbm9kZSA9IE5VTEwsICpteW5vZGUgPSBOVUxMOwogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOwogCXN0cnVjdCBzb2NrYWRkcl9pbiBteWFkZHIgPSB7MCwgfSwgcmVtb3RlYWRkciA9IHswLCB9OwotCWludCByZXQgPSAwOworCWludCByZXQgPSAwLCBzdG9wOwogCiAJLyogaWYgd2UncmUgZ3JlYXRlciB3ZSBpbml0aWF0ZSB0eCwgb3RoZXJ3aXNlIHdlIGFjY2VwdCAqLwogCWlmIChvMm5tX3RoaXNfbm9kZSgpIDw9IG8ybmV0X251bV9mcm9tX25uKG5uKSkKQEAgLTEzNDIsMTAgKzE0NTQsOSBAQAogCiAJc3Bpbl9sb2NrKCZubi0+bm5fbG9jayk7CiAJLyogc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmUgcGVuZGluZyBvciBoYXZlIGdpdmVuIHVwICovCi0JaWYgKG5uLT5ubl9zYyB8fCBubi0+bm5fcGVyc2lzdGVudF9lcnJvcikKLQkJYXJnID0gTlVMTDsKKwlzdG9wID0gKG5uLT5ubl9zYyB8fCBubi0+bm5fcGVyc2lzdGVudF9lcnJvcik7CiAJc3Bpbl91bmxvY2soJm5uLT5ubl9sb2NrKTsKLQlpZiAoYXJnID09IE5VTEwpIC8qICpzaHJ1ZyosIG5lZWRlZCBzb21lIGluZGljYXRvciAqLworCWlmIChzdG9wKQogCQlnb3RvIG91dDsKIAogCW5uLT5ubl9sYXN0X2Nvbm5lY3RfYXR0ZW1wdCA9IGppZmZpZXM7CkBAIC0xNDIxLDI0ICsxNTMyLDI5IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBvMm5ldF9jb25uZWN0X2V4cGlyZWQodm9pZCAqYXJnKQorc3RhdGljIHZvaWQgbzJuZXRfY29ubmVjdF9leHBpcmVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbzJuZXRfbm9kZSAqbm4gPSBhcmc7CisJc3RydWN0IG8ybmV0X25vZGUgKm5uID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvMm5ldF9ub2RlLCBubl9jb25uZWN0X2V4cGlyZWQud29yayk7CiAKIAlzcGluX2xvY2soJm5uLT5ubl9sb2NrKTsKIAlpZiAoIW5uLT5ubl9zY192YWxpZCkgeworCQlzdHJ1Y3QgbzJubV9ub2RlICpub2RlID0gbm4tPm5uX3NjLT5zY19ub2RlOwogCQltbG9nKE1MX0VSUk9SLCAibm8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCB3aXRoIG5vZGUgJXUgYWZ0ZXIgIgotCQkgICAgICIldSBzZWNvbmRzLCBnaXZpbmcgdXAgYW5kIHJldHVybmluZyBlcnJvcnMuXG4iLAotCQkgICAgIG8ybmV0X251bV9mcm9tX25uKG5uKSwgTzJORVRfSURMRV9USU1FT1VUX1NFQ1MpOworCQkgICAgICIldS4ldSBzZWNvbmRzLCBnaXZpbmcgdXAgYW5kIHJldHVybmluZyBlcnJvcnMuXG4iLAorCQkgICAgIG8ybmV0X251bV9mcm9tX25uKG5uKSwKKwkJICAgICBvMm5ldF9pZGxlX3RpbWVvdXQobm9kZSkgLyAxMDAwLAorCQkgICAgIG8ybmV0X2lkbGVfdGltZW91dChub2RlKSAlIDEwMDApOwogCiAJCW8ybmV0X3NldF9ubl9zdGF0ZShubiwgTlVMTCwgMCwgLUVOT1RDT05OKTsKIAl9CiAJc3Bpbl91bmxvY2soJm5uLT5ubl9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgbzJuZXRfc3RpbGxfdXAodm9pZCAqYXJnKQorc3RhdGljIHZvaWQgbzJuZXRfc3RpbGxfdXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBvMm5ldF9ub2RlICpubiA9IGFyZzsKKwlzdHJ1Y3QgbzJuZXRfbm9kZSAqbm4gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG8ybmV0X25vZGUsIG5uX3N0aWxsX3VwLndvcmspOwogCiAJbzJxdW9faGJfc3RpbGxfdXAobzJuZXRfbnVtX2Zyb21fbm4obm4pKTsKIH0KQEAgLTE0NjksNiArMTU4NSw4IEBACiAKIAlpZiAobm9kZV9udW0gIT0gbzJubV90aGlzX25vZGUoKSkKIAkJbzJuZXRfZGlzY29ubmVjdF9ub2RlKG5vZGUpOworCisJQlVHX09OKGF0b21pY19yZWFkKCZvMm5ldF9jb25uZWN0ZWRfcGVlcnMpIDwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIG8ybmV0X2hiX25vZGVfdXBfY2Ioc3RydWN0IG8ybm1fbm9kZSAqbm9kZSwgaW50IG5vZGVfbnVtLApAQCAtMTQ4MCwxNCArMTU5OCwxNCBAQAogCiAJLyogZW5zdXJlIGFuIGltbWVkaWF0ZSBjb25uZWN0IGF0dGVtcHQgKi8KIAlubi0+bm5fbGFzdF9jb25uZWN0X2F0dGVtcHQgPSBqaWZmaWVzIC0KLQkJKG1zZWNzX3RvX2ppZmZpZXMoTzJORVRfUkVDT05ORUNUX0RFTEFZX01TKSArIDEpOworCQkobXNlY3NfdG9famlmZmllcyhvMm5ldF9yZWNvbm5lY3RfZGVsYXkobm9kZSkpICsgMSk7CiAKIAlpZiAobm9kZV9udW0gIT0gbzJubV90aGlzX25vZGUoKSkgewogCQkvKiBoZWFydGJlYXQgZG9lc24ndCB3b3JrIHVubGVzcyBhIGxvY2FsIG5vZGUgbnVtYmVyIGlzCiAJCSAqIGNvbmZpZ3VyZWQgYW5kIGRvaW5nIHNvIGJyaW5ncyB1cCB0aGUgbzJuZXRfd3EsIHNvIHdlIGNhbgogCQkgKiB1c2UgaXQuLiAqLwogCQlxdWV1ZV9kZWxheWVkX3dvcmsobzJuZXRfd3EsICZubi0+bm5fY29ubmVjdF9leHBpcmVkLAotCQkJCSAgIE8yTkVUX0lETEVfVElNRU9VVF9TRUNTICogSFopOworCQkgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyhvMm5ldF9pZGxlX3RpbWVvdXQobm9kZSkpKTsKIAogCQkvKiBiZWxpZXZlIGl0IG9yIG5vdCwgYWNjZXB0IGFuZCBub2RlIGhlYXJiZWF0aW5nIHRlc3RpbmcKIAkJICogY2FuIHN1Y2NlZWQgZm9yIHRoaXMgbm9kZSBiZWZvcmUgd2UgZ290IGhlcmUuLiBzbwpAQCAtMTYzMiw2ICsxNzUwLDcgQEAKIAlvMm5ldF9yZWdpc3Rlcl9jYWxsYmFja3Moc2MtPnNjX3NvY2stPnNrLCBzYyk7CiAJbzJuZXRfc2NfcXVldWVfd29yayhzYywgJnNjLT5zY19yeF93b3JrKTsKIAorCW8ybmV0X2luaXRpYWxpemVfaGFuZHNoYWtlKCk7CiAJbzJuZXRfc2VuZHBhZ2Uoc2MsIG8ybmV0X2hhbmQsIHNpemVvZigqbzJuZXRfaGFuZCkpOwogCiBvdXQ6CkBAIC0xNjQ0LDkgKzE3NjMsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG8ybmV0X2FjY2VwdF9tYW55KHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIG8ybmV0X2FjY2VwdF9tYW55KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gYXJnOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBvMm5ldF9saXN0ZW5fc29jazsKIAl3aGlsZSAobzJuZXRfYWNjZXB0X29uZShzb2NrKSA9PSAwKQogCQljb25kX3Jlc2NoZWQoKTsKIH0KQEAgLTE3MDAsNyArMTgxOSw3IEBACiAJd3JpdGVfdW5sb2NrX2JoKCZzb2NrLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKIAlvMm5ldF9saXN0ZW5fc29jayA9IHNvY2s7Ci0JSU5JVF9XT1JLKCZvMm5ldF9saXN0ZW5fd29yaywgbzJuZXRfYWNjZXB0X21hbnksIHNvY2spOworCUlOSVRfV09SSygmbzJuZXRfbGlzdGVuX3dvcmssIG8ybmV0X2FjY2VwdF9tYW55KTsKIAogCXNvY2stPnNrLT5za19yZXVzZSA9IDE7CiAJcmV0ID0gc29jay0+b3BzLT5iaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSk7CkBAIC0xNzk5LDkgKzE5MTgsOSBAQAogCiAJbzJxdW9faW5pdCgpOwogCi0JbzJuZXRfaGFuZCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBvMm5ldF9oYW5kc2hha2UpLCBHRlBfS0VSTkVMKTsKLQlvMm5ldF9rZWVwX3JlcSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBvMm5ldF9tc2cpLCBHRlBfS0VSTkVMKTsKLQlvMm5ldF9rZWVwX3Jlc3AgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbzJuZXRfbXNnKSwgR0ZQX0tFUk5FTCk7CisJbzJuZXRfaGFuZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvMm5ldF9oYW5kc2hha2UpLCBHRlBfS0VSTkVMKTsKKwlvMm5ldF9rZWVwX3JlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvMm5ldF9tc2cpLCBHRlBfS0VSTkVMKTsKKwlvMm5ldF9rZWVwX3Jlc3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbzJuZXRfbXNnKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvMm5ldF9oYW5kIHx8ICFvMm5ldF9rZWVwX3JlcSB8fCAhbzJuZXRfa2VlcF9yZXNwKSB7CiAJCWtmcmVlKG8ybmV0X2hhbmQpOwogCQlrZnJlZShvMm5ldF9rZWVwX3JlcSk7CkBAIC0xODE5LDkgKzE5MzgsMTAgQEAKIAkJc3RydWN0IG8ybmV0X25vZGUgKm5uID0gbzJuZXRfbm5fZnJvbV9udW0oaSk7CiAKIAkJc3Bpbl9sb2NrX2luaXQoJm5uLT5ubl9sb2NrKTsKLQkJSU5JVF9XT1JLKCZubi0+bm5fY29ubmVjdF93b3JrLCBvMm5ldF9zdGFydF9jb25uZWN0LCBubik7Ci0JCUlOSVRfV09SSygmbm4tPm5uX2Nvbm5lY3RfZXhwaXJlZCwgbzJuZXRfY29ubmVjdF9leHBpcmVkLCBubik7Ci0JCUlOSVRfV09SSygmbm4tPm5uX3N0aWxsX3VwLCBvMm5ldF9zdGlsbF91cCwgbm4pOworCQlJTklUX0RFTEFZRURfV09SSygmbm4tPm5uX2Nvbm5lY3Rfd29yaywgbzJuZXRfc3RhcnRfY29ubmVjdCk7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZubi0+bm5fY29ubmVjdF9leHBpcmVkLAorCQkJCSAgbzJuZXRfY29ubmVjdF9leHBpcmVkKTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJm5uLT5ubl9zdGlsbF91cCwgbzJuZXRfc3RpbGxfdXApOwogCQkvKiB1bnRpbCB3ZSBzZWUgaGIgZnJvbSBhIG5vZGUgd2UnbGwgcmV0dXJuIGVpbnZhbCAqLwogCQlubi0+bm5fcGVyc2lzdGVudF9lcnJvciA9IC1FTk9UQ09OTjsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmbm4tPm5uX3NjX3dxKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmggYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5oCmluZGV4IDYxNmZmMmIuLjIxYTRlNDMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci90Y3AuaApAQCAtNTQsNiArNTQsMTMgQEAKIAogI2RlZmluZSBPMk5FVF9NQVhfUEFZTE9BRF9CWVRFUyAgKDQwOTYgLSBzaXplb2Yoc3RydWN0IG8ybmV0X21zZykpCiAKKy8qIHNhbWUgYXMgaGIgZGVsYXksIHdlJ3JlIHdhaXRpbmcgZm9yIGFub3RoZXIgbm9kZSB0byByZWNvZ25pemUgb3VyIGhiICovCisjZGVmaW5lIE8yTkVUX1JFQ09OTkVDVF9ERUxBWV9NU19ERUZBVUxUCTIwMDAKKworI2RlZmluZSBPMk5FVF9LRUVQQUxJVkVfREVMQVlfTVNfREVGQVVMVAk1MDAwCisjZGVmaW5lIE8yTkVUX0lETEVfVElNRU9VVF9NU19ERUZBVUxUCQkxMDAwMAorCisKIC8qIFRPRE86IGZpZ3VyZSB0aGlzIG91dC4uLi4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IG8ybmV0X2xpbmtfZG93bihpbnQgZXJyLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewpAQCAtMTAxLDYgKzEwOCw3IEBACiBpbnQgbzJuZXRfc3RhcnRfbGlzdGVuaW5nKHN0cnVjdCBvMm5tX25vZGUgKm5vZGUpOwogdm9pZCBvMm5ldF9zdG9wX2xpc3RlbmluZyhzdHJ1Y3QgbzJubV9ub2RlICpub2RlKTsKIHZvaWQgbzJuZXRfZGlzY29ubmVjdF9ub2RlKHN0cnVjdCBvMm5tX25vZGUgKm5vZGUpOworaW50IG8ybmV0X251bV9jb25uZWN0ZWRfcGVlcnModm9pZCk7CiAKIGludCBvMm5ldF9pbml0KHZvaWQpOwogdm9pZCBvMm5ldF9leGl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmgKaW5kZXggNGI0NmFhYy4uYjcwMGRjOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oCkBAIC0yNywyMyArMjcsMjAgQEAKICNkZWZpbmUgTzJORVRfTVNHX0tFRVBfUkVRX01BR0lDICAoKHUxNikweGZhNTcpCiAjZGVmaW5lIE8yTkVUX01TR19LRUVQX1JFU1BfTUFHSUMgKCh1MTYpMHhmYTU4KQogCi0vKiBzYW1lIGFzIGhiIGRlbGF5LCB3ZSdyZSB3YWl0aW5nIGZvciBhbm90aGVyIG5vZGUgdG8gcmVjb2duaXplIG91ciBoYiAqLwotI2RlZmluZSBPMk5FVF9SRUNPTk5FQ1RfREVMQVlfTVMJTzJIQl9SRUdJT05fVElNRU9VVF9NUwotCiAvKiB3ZSdyZSBkZWxheWluZyBvdXIgcXVvcnVtIGRlY2lzaW9uIHNvIHRoYXQgaGVhcnRiZWF0IHdpbGwgaGF2ZSB0aW1lZAogICogb3V0IHRydWx5IGRlYWQgbm9kZXMgYnkgdGhlIHRpbWUgd2UgY29tZSBhcm91bmQgdG8gbWFraW5nIGRlY2lzaW9ucwogICogb24gdGhlaXIgbnVtYmVyICovCiAjZGVmaW5lIE8yTkVUX1FVT1JVTV9ERUxBWV9NUwkoKG8yaGJfZGVhZF90aHJlc2hvbGQgKyAyKSAqIE8ySEJfUkVHSU9OX1RJTUVPVVRfTVMpCiAKLSNkZWZpbmUgTzJORVRfS0VFUEFMSVZFX0RFTEFZX1NFQ1MJNQotI2RlZmluZSBPMk5FVF9JRExFX1RJTUVPVVRfU0VDUwkJMTAKLQogLyogCiAgKiBUaGlzIHZlcnNpb24gbnVtYmVyIHJlcHJlc2VudHMgcXVpdGUgYSBsb3QsIHVuZm9ydHVuYXRlbHkuICBJdCBub3QKICAqIG9ubHkgcmVwcmVzZW50cyB0aGUgcmF3IG5ldHdvcmsgbWVzc2FnZSBwcm90b2NvbCBvbiB0aGUgd2lyZSBidXQgYWxzbwogICogbG9ja2luZyBzZW1hbnRpY3Mgb2YgdGhlIGZpbGUgc3lzdGVtIHVzaW5nIHRoZSBwcm90b2NvbC4gIEl0IHNob3VsZCAKICAqIGJlIHNvbWV3aGVyZSBlbHNlLCBJJ20gc3VyZSwgYnV0IHJpZ2h0IG5vdyBpdCBpc24ndC4KICAqCisgKiBOZXcgaW4gdmVyc2lvbiA1OgorICogCS0gTmV0d29yayB0aW1lb3V0IGNoZWNraW5nIHByb3RvY29sCisgKgogICogTmV3IGluIHZlcnNpb24gNDoKICAqIAktIFJlbW92ZSBpX2dlbmVyYXRpb24gZnJvbSBsb2NrIG5hbWVzIGZvciBiZXR0ZXIgc3RhdCBwZXJmb3JtYW5jZS4KICAqCkBAIC01NCwxMCArNTEsMTQgQEAKICAqIAktIGZ1bGwgNjQgYml0IGlfc2l6ZSBpbiB0aGUgbWV0YWRhdGEgbG9jayBsdmJzCiAgKiAJLSBpbnRyb2R1Y3Rpb24gb2YgInJ3IiBsb2NrIGFuZCBwdXNoaW5nIG1ldGEvZGF0YSBsb2NraW5nIGRvd24KICAqLwotI2RlZmluZSBPMk5FVF9QUk9UT0NPTF9WRVJTSU9OIDRVTEwKKyNkZWZpbmUgTzJORVRfUFJPVE9DT0xfVkVSU0lPTiA1VUxMCiBzdHJ1Y3QgbzJuZXRfaGFuZHNoYWtlIHsKIAlfX2JlNjQJcHJvdG9jb2xfdmVyc2lvbjsKIAlfX2JlNjQJY29ubmVjdG9yX2lkOworCV9fYmUzMiAgbzJoYl9oZWFydGJlYXRfdGltZW91dF9tczsKKwlfX2JlMzIgIG8ybmV0X2lkbGVfdGltZW91dF9tczsKKwlfX2JlMzIgIG8ybmV0X2tlZXBhbGl2ZV9kZWxheV9tczsKKwlfX2JlMzIgIG8ybmV0X3JlY29ubmVjdF9kZWxheV9tczsKIH07CiAKIHN0cnVjdCBvMm5ldF9ub2RlIHsKQEAgLTg2LDE4ICs4NywxOCBAQAogCSAqIGNvbm5lY3QgYXR0ZW1wdCBmYWlscyBhbmQgc28gY2FuIGJlIHNlbGYtYXJtaW5nLiAgc2h1dGRvd24gaXMKIAkgKiBjYXJlZnVsIHRvIGZpcnN0IG1hcmsgdGhlIG5uIHN1Y2ggdGhhdCBubyBjb25uZWN0cyB3aWxsIGJlIGF0dGVtcHRlZAogCSAqIGJlZm9yZSBjYW5jZWxpbmcgZGVsYXllZCBjb25uZWN0IHdvcmsgYW5kIGZsdXNoaW5nIHRoZSBxdWV1ZS4gKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCW5uX2Nvbm5lY3Rfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQlubl9jb25uZWN0X3dvcms7CiAJdW5zaWduZWQgbG9uZwkJCW5uX2xhc3RfY29ubmVjdF9hdHRlbXB0OwogCiAJLyogdGhpcyBpcyBxdWV1ZWQgYXMgbm9kZXMgY29tZSB1cCBhbmQgaXMgY2FuY2VsZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMKIAkgKiBlc3RhYmxpc2hlZC4gIHRoaXMgZXhwaXJpbmcgZ2l2ZXMgdXAgb24gdGhlIG5vZGUgYW5kIGVycm9ycyBvdXQKIAkgKiB0cmFuc21pdHMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCW5uX2Nvbm5lY3RfZXhwaXJlZDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQlubl9jb25uZWN0X2V4cGlyZWQ7CiAKIAkvKiBhZnRlciB3ZSBnaXZlIHVwIG9uIGEgc29ja2V0IHdlIHdhaXQgYSB3aGlsZSBiZWZvcmUgZGVjaWRpbmcKIAkgKiB0aGF0IGl0IGlzIHN0aWxsIGhlYXJ0YmVhdGluZyBhbmQgdGhhdCB3ZSBzaG91bGQgZG8gc29tZQogCSAqIHF1b3J1bSB3b3JrICovCi0Jc3RydWN0IHdvcmtfc3RydWN0CQlubl9zdGlsbF91cDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQlubl9zdGlsbF91cDsKIH07CiAKIHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciB7CkBAIC0xMjksNyArMTMwLDcgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJc2Nfc2h1dGRvd25fd29yazsKIAogCXN0cnVjdCB0aW1lcl9saXN0CXNjX2lkbGVfdGltZW91dDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJc2Nfa2VlcGFsaXZlX3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yawlzY19rZWVwYWxpdmVfd29yazsKIAogCXVuc2lnbmVkCQlzY19oYW5kc2hha2Vfb2s6MTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmMgYi9mcy9vY2ZzMi9kaXIuYwppbmRleCAwNGUwMTkxLi42NjgyMWUxIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuYworKysgYi9mcy9vY2ZzMi9kaXIuYwpAQCAtNzksOSArNzksMTAgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgKiB0bXA7CiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqIGRlOwogCWludCBlcnI7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CiAJdW5zaWduZWQgaW50IHJhX3NlY3RvcnMgPSAxNjsKKwlpbnQgbG9ja19sZXZlbCA9IDA7CiAKIAltbG9nX2VudHJ5KCJkaXJpbm89JWxsdVxuIiwKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwpAQCAtODksNyArOTAsMTUgQEAKIAlzdG9yZWQgPSAwOwogCWJoID0gTlVMTDsKIAotCWVycm9yID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCBOVUxMLCAwKTsKKwllcnJvciA9IG9jZnMyX21ldGFfbG9ja19hdGltZShpbm9kZSwgZmlscC0+Zl92ZnNtbnQsICZsb2NrX2xldmVsKTsKKwlpZiAobG9ja19sZXZlbCAmJiBlcnJvciA+PSAwKSB7CisJCS8qIFdlIHJlbGVhc2UgRVggbG9jayB3aGljaCB1c2VkIHRvIHVwZGF0ZSBhdGltZQorCQkgKiBhbmQgZ2V0IFBSIGxvY2sgYWdhaW4gdG8gcmVkdWNlIGNvbnRlbnRpb24KKwkJICogb24gY29tbW9ubHkgYWNjZXNzZWQgZGlyZWN0b3JpZXMuICovCisJCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKwkJbG9ja19sZXZlbCA9IDA7CisJCWVycm9yID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAwKTsKKwl9CiAJaWYgKGVycm9yIDwgMCkgewogCQlpZiAoZXJyb3IgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oZXJyb3IpOwpAQCAtMTk4LDcgKzIwNyw3IEBACiAKIAlzdG9yZWQgPSAwOwogYmFpbDoKLQlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMCk7CisJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIGxvY2tfbGV2ZWwpOwogCiBiYWlsX25vbG9jazoKIAltbG9nX2V4aXQoc3RvcmVkKTsKQEAgLTM0MCw3ICszNDksNyBAQAogCiAvKiByZXR1cm5zIGEgYmggb2YgdGhlIDFzdCBuZXcgYmxvY2sgaW4gdGhlIGFsbG9jYXRpb24uICovCiBpbnQgb2NmczJfZG9fZXh0ZW5kX2RpcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQloYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGlub2RlICpkaXIsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9mZV9iaCwKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLApAQCAtMzk4LDcgKzQwNyw3IEBACiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBwYXJlbnRfZmVfYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqIGRlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBvc2ItPnNiOwpAQCAtNDA5LDEzICs0MTgsNiBAQAogCW1sb2coMCwgImV4dGVuZGluZyBkaXIgJWxsdSAoaV9zaXplID0gJWxsZClcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koZGlyKS0+aXBfYmxrbm8sIGRpcl9pX3NpemUpOwogCi0JaGFuZGxlID0gb2NmczJfYWxsb2NfaGFuZGxlKG9zYik7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLQogCS8qIGRpci0+aV9zaXplIGlzIGFsd2F5cyBibG9jayBhbGlnbmVkLiAqLwogCXNwaW5fbG9jaygmT0NGUzJfSShkaXIpLT5pcF9sb2NrKTsKIAlpZiAoZGlyX2lfc2l6ZSA9PSBvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhzYiwgT0NGUzJfSShkaXIpLT5pcF9jbHVzdGVycykpIHsKQEAgLTQyOCw4ICs0MzAsNyBAQAogCQl9CiAKIAkJaWYgKCFudW1fZnJlZV9leHRlbnRzKSB7Ci0JCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGhhbmRsZSwKLQkJCQkJCQkgICAgZmUsICZtZXRhX2FjKTsKKwkJCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgZmUsICZtZXRhX2FjKTsKIAkJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC00MzcsNyArNDM4LDcgQEAKIAkJCX0KIAkJfQogCi0JCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCBoYW5kbGUsIDEsICZkYXRhX2FjKTsKKwkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIDEsICZkYXRhX2FjKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC00NTAsNyArNDUxLDcgQEAKIAkJY3JlZGl0cyA9IE9DRlMyX1NJTVBMRV9ESVJfRVhURU5EX0NSRURJVFM7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBoYW5kbGUsIGNyZWRpdHMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTQ5Niw3ICs0OTcsNyBAQAogCWdldF9iaCgqbmV3X2RlX2JoKTsKIGJhaWw6CiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKIAlpZiAoZGF0YV9hYykKIAkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmggYi9mcy9vY2ZzMi9kaXIuaAppbmRleCA1ZjYxNGVjLi4zZjY3ZTE0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuaAorKysgYi9mcy9vY2ZzMi9kaXIuaApAQCAtNDUsNyArNDUsNyBAQAogCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZXRfZGVfYmgpOwogc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQ7CiBpbnQgb2NmczJfZG9fZXh0ZW5kX2RpcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQloYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGlub2RlICpkaXIsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9mZV9iaCwKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oIGIvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oCmluZGV4IGZhOTY4MTguLjZiNmZmNzYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1jb21tb24uaAorKysgYi9mcy9vY2ZzMi9kbG0vZGxtY29tbW9uLmgKQEAgLTE1Myw3ICsxNTMsNyBAQAogICogY2FsbGVkIGZ1bmN0aW9ucyB0aGF0IGNhbm5vdCBiZSBkaXJlY3RseSBjYWxsZWQgZnJvbSB0aGUKICAqIG5ldCBtZXNzYWdlIGhhbmRsZXJzIGZvciBzb21lIHJlYXNvbiwgdXN1YWxseSBiZWNhdXNlCiAgKiB0aGV5IG5lZWQgdG8gc2VuZCBuZXQgbWVzc2FnZXMgb2YgdGhlaXIgb3duLiAqLwotdm9pZCBkbG1fZGlzcGF0Y2hfd29yayh2b2lkICpkYXRhKTsKK3ZvaWQgZGxtX2Rpc3BhdGNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlOwogc3RydWN0IGRsbV93b3JrX2l0ZW07CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKaW5kZXggOGQxMDY1Zi4uZjBiMjVmMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwpAQCAtNjgsNyArNjgsOCBAQAogCQkJZ290byBvdXRfZnJlZTsKIAogCW1sb2coMCwgIkFsbG9jYXRlZCBETE0gaGFzaCBwYWdldmVjOyAlZCBwYWdlcyAoJWx1IGV4cGVjdGVkKSwgJWx1IGJ1Y2tldHMgcGVyIHBhZ2VcbiIsCi0JICAgICBwYWdlcywgRExNX0hBU0hfUEFHRVMsICh1bnNpZ25lZCBsb25nKURMTV9CVUNLRVRTX1BFUl9QQUdFKTsKKwkgICAgIHBhZ2VzLCAodW5zaWduZWQgbG9uZylETE1fSEFTSF9QQUdFUywKKwkgICAgICh1bnNpZ25lZCBsb25nKURMTV9CVUNLRVRTX1BFUl9QQUdFKTsKIAlyZXR1cm4gdmVjOwogb3V0X2ZyZWU6CiAJZGxtX2ZyZWVfcGFnZXZlYyh2ZWMsIGkpOwpAQCAtOTE5LDcgKzkyMCw3IEBACiAKIAltbG9nX2VudHJ5KCIlcCIsIGRsbSk7CiAKLQljdHh0ID0ga2NhbGxvYygxLCBzaXplb2YoKmN0eHQpLCBHRlBfS0VSTkVMKTsKKwljdHh0ID0ga3phbGxvYyhzaXplb2YoKmN0eHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWN0eHQpIHsKIAkJc3RhdHVzID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTIyMiw3ICsxMjIzLDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbSA9IE5VTEw7CiAKLQlkbG0gPSBrY2FsbG9jKDEsIHNpemVvZigqZGxtKSwgR0ZQX0tFUk5FTCk7CisJZGxtID0ga3phbGxvYyhzaXplb2YoKmRsbSksIEdGUF9LRVJORUwpOwogCWlmICghZGxtKSB7CiAJCW1sb2dfZXJybm8oLUVOT01FTSk7CiAJCWdvdG8gbGVhdmU7CkBAIC0xMjk2LDcgKzEyOTcsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJmRsbS0+d29ya19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZGxtLT53b3JrX2xpc3QpOwotCUlOSVRfV09SSygmZGxtLT5kaXNwYXRjaGVkX3dvcmssIGRsbV9kaXNwYXRjaF93b3JrLCBkbG0pOworCUlOSVRfV09SSygmZGxtLT5kaXNwYXRjaGVkX3dvcmssIGRsbV9kaXNwYXRjaF93b3JrKTsKIAogCWtyZWZfaW5pdCgmZGxtLT5kbG1fcmVmcyk7CiAJZGxtLT5kbG1fc3RhdGUgPSBETE1fQ1RYVF9ORVc7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZnMuYyBiL2ZzL29jZnMyL2RsbS9kbG1mcy5jCmluZGV4IDE2YjhkMWIuLmI3ZjBiYTkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1mcy5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1mcy5jCkBAIC02Niw3ICs2Niw3IEBACiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGxtZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CiBzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGxtZnNfcm9vdF9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGRsbWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmRsbWZzX2lub2RlX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkbG1mc19pbm9kZV9jYWNoZTsKIAogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnVzZXJfZGxtX3dvcmtlcjsKIApAQCAtMTc2LDcgKzE3Niw3IEBACiAJaW50IGJ5dGVzX2xlZnQ7CiAJc3NpemVfdCByZWFkbGVuOwogCWNoYXIgKmx2Yl9idWY7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJbWxvZygwLCAiaW5vZGUgJWx1LCBjb3VudCA9ICV6dSwgKnBwb3MgPSAlbGx1XG4iLAogCQlpbm9kZS0+aV9pbm8sIGNvdW50LCAqcHBvcyk7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAlpbnQgYnl0ZXNfbGVmdDsKIAlzc2l6ZV90IHdyaXRlbGVuOwogCWNoYXIgKmx2Yl9idWY7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJbWxvZygwLCAiaW5vZGUgJWx1LCBjb3VudCA9ICV6dSwgKnBwb3MgPSAlbGx1XG4iLAogCQlpbm9kZS0+aV9pbm8sIGNvdW50LCAqcHBvcyk7CkBAIC0yNTcsNyArMjU3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZGxtZnNfaW5pdF9vbmNlKHZvaWQgKmZvbywKLQkJCSAgICBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKKwkJCSAgICBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGRsbWZzX2lub2RlX3ByaXZhdGUgKmlwID0KQEAgLTI3Niw3ICsyNzYsNyBAQAogewogCXN0cnVjdCBkbG1mc19pbm9kZV9wcml2YXRlICppcDsKIAotCWlwID0ga21lbV9jYWNoZV9hbGxvYyhkbG1mc19pbm9kZV9jYWNoZSwgU0xBQl9OT0ZTKTsKKwlpcCA9IGttZW1fY2FjaGVfYWxsb2MoZGxtZnNfaW5vZGVfY2FjaGUsIEdGUF9OT0ZTKTsKIAlpZiAoIWlwKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWxvY2suYyBiL2ZzL29jZnMyL2RsbS9kbG1sb2NrLmMKaW5kZXggNDJhMWI5MS4uZTVjYTNkYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWxvY2suYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtbG9jay5jCkBAIC00MDgsMTMgKzQwOCwxMyBAQAogCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKIAlpbnQga2VybmVsX2FsbG9jYXRlZCA9IDA7CiAKLQlsb2NrID0ga2NhbGxvYygxLCBzaXplb2YoKmxvY2spLCBHRlBfTk9GUyk7CisJbG9jayA9IGt6YWxsb2Moc2l6ZW9mKCpsb2NrKSwgR0ZQX05PRlMpOwogCWlmICghbG9jaykKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoIWxrc2IpIHsKIAkJLyogemVybyBtZW1vcnkgb25seSBpZiBrZXJuZWwtYWxsb2NhdGVkICovCi0JCWxrc2IgPSBrY2FsbG9jKDEsIHNpemVvZigqbGtzYiksIEdGUF9OT0ZTKTsKKwkJbGtzYiA9IGt6YWxsb2Moc2l6ZW9mKCpsa3NiKSwgR0ZQX05PRlMpOwogCQlpZiAoIWxrc2IpIHsKIAkJCWtmcmVlKGxvY2spOwogCQkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMgYi9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKaW5kZXggZjc4NDE3Ny4uMGFkODcyMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAjZW5kaWYgIC8qICAwICAqLwogCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmRsbV9tbGVfY2FjaGUgPSBOVUxMOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkbG1fbWxlX2NhY2hlID0gTlVMTDsKIAogCiBzdGF0aWMgdm9pZCBkbG1fbWxlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpOwpAQCAtMTkzOSw3ICsxOTM5LDcgQEAKIAkJCSAgICAgICBpbnQgaWdub3JlX2hpZ2hlciwgdTggcmVxdWVzdF9mcm9tLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGRsbV93b3JrX2l0ZW0gKml0ZW07Ci0JaXRlbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCppdGVtKSwgR0ZQX05PRlMpOworCWl0ZW0gPSBremFsbG9jKHNpemVvZigqaXRlbSksIEdGUF9OT0ZTKTsKIAlpZiAoIWl0ZW0pCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtcmVjb3ZlcnkuYyBiL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCmluZGV4IDlkOTUwZDcuLjM2N2ExMWUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jCkBAIC0xNTMsOSArMTUzLDEwIEBACiB9CiAKIC8qIFdvcmtlciBmdW5jdGlvbiB1c2VkIGR1cmluZyByZWNvdmVyeS4gKi8KLXZvaWQgZGxtX2Rpc3BhdGNoX3dvcmsodm9pZCAqZGF0YSkKK3ZvaWQgZGxtX2Rpc3BhdGNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gKHN0cnVjdCBkbG1fY3R4dCAqKWRhdGE7CisJc3RydWN0IGRsbV9jdHh0ICpkbG0gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRsbV9jdHh0LCBkaXNwYXRjaGVkX3dvcmspOwogCUxJU1RfSEVBRCh0bXBfbGlzdCk7CiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwogCXN0cnVjdCBkbG1fd29ya19pdGVtICppdGVtOwpAQCAtNzU2LDcgKzc1Nyw3IEBACiAJCX0KIAkJQlVHX09OKG51bSA9PSBkZWFkX25vZGUpOwogCi0JCW5kYXRhID0ga2NhbGxvYygxLCBzaXplb2YoKm5kYXRhKSwgR0ZQX05PRlMpOworCQluZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpuZGF0YSksIEdGUF9OT0ZTKTsKIAkJaWYgKCFuZGF0YSkgewogCQkJZGxtX2Rlc3Ryb3lfcmVjb3ZlcnlfYXJlYShkbG0sIGRlYWRfbm9kZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTg0MSw3ICs4NDIsNyBAQAogCX0KIAlCVUdfT04obHItPmRlYWRfbm9kZSAhPSBkbG0tPnJlY28uZGVhZF9ub2RlKTsKIAotCWl0ZW0gPSBrY2FsbG9jKDEsIHNpemVvZigqaXRlbSksIEdGUF9OT0ZTKTsKKwlpdGVtID0ga3phbGxvYyhzaXplb2YoKml0ZW0pLCBHRlBfTk9GUyk7CiAJaWYgKCFpdGVtKSB7CiAJCWRsbV9wdXQoZGxtKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMzIyLDcgKzEzMjMsNyBAQAogCiAJcmV0ID0gLUVOT01FTTsKIAlidWYgPSBrbWFsbG9jKGJlMTZfdG9fY3B1KG1zZy0+ZGF0YV9sZW4pLCBHRlBfTk9GUyk7Ci0JaXRlbSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCppdGVtKSwgR0ZQX05PRlMpOworCWl0ZW0gPSBremFsbG9jKHNpemVvZigqaXRlbSksIEdGUF9OT0ZTKTsKIAlpZiAoIWJ1ZiB8fCAhaXRlbSkKIAkJZ290byBsZWF2ZTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL3VzZXJkbG0uYyBiL2ZzL29jZnMyL2RsbS91c2VyZGxtLmMKaW5kZXggZWVhZDQ4Yi4uN2QyZjU3OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL3VzZXJkbG0uYworKysgYi9mcy9vY2ZzMi9kbG0vdXNlcmRsbS5jCkBAIC0xNzEsMTUgKzE3MSwxNCBAQAogCQlCVUcoKTsKIH0KIAotc3RhdGljIHZvaWQgdXNlcl9kbG1fdW5ibG9ja19sb2NrKHZvaWQgKm9wYXF1ZSk7CitzdGF0aWMgdm9pZCB1c2VyX2RsbV91bmJsb2NrX2xvY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RhdGljIHZvaWQgX191c2VyX2RsbV9xdWV1ZV9sb2NrcmVzKHN0cnVjdCB1c2VyX2xvY2tfcmVzICpsb2NrcmVzKQogewogCWlmICghKGxvY2tyZXMtPmxfZmxhZ3MgJiBVU0VSX0xPQ0tfUVVFVUVEKSkgewogCQl1c2VyX2RsbV9ncmFiX2lub2RlX3JlZihsb2NrcmVzKTsKIAotCQlJTklUX1dPUksoJmxvY2tyZXMtPmxfd29yaywgdXNlcl9kbG1fdW5ibG9ja19sb2NrLAotCQkJICBsb2NrcmVzKTsKKwkJSU5JVF9XT1JLKCZsb2NrcmVzLT5sX3dvcmssIHVzZXJfZGxtX3VuYmxvY2tfbG9jayk7CiAKIAkJcXVldWVfd29yayh1c2VyX2RsbV93b3JrZXIsICZsb2NrcmVzLT5sX3dvcmspOwogCQlsb2NrcmVzLT5sX2ZsYWdzIHw9IFVTRVJfTE9DS19RVUVVRUQ7CkBAIC0yNzksMTAgKzI3OCwxMSBAQAogCWlwdXQoaW5vZGUpOwogfQogCi1zdGF0aWMgdm9pZCB1c2VyX2RsbV91bmJsb2NrX2xvY2sodm9pZCAqb3BhcXVlKQorc3RhdGljIHZvaWQgdXNlcl9kbG1fdW5ibG9ja19sb2NrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpbnQgbmV3X2xldmVsLCBzdGF0dXM7Ci0Jc3RydWN0IHVzZXJfbG9ja19yZXMgKmxvY2tyZXMgPSAoc3RydWN0IHVzZXJfbG9ja19yZXMgKikgb3BhcXVlOworCXN0cnVjdCB1c2VyX2xvY2tfcmVzICpsb2NrcmVzID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2VyX2xvY2tfcmVzLCBsX3dvcmspOwogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gZGxtX2N0eHRfZnJvbV91c2VyX2xvY2tyZXMobG9ja3Jlcyk7CiAKIAltbG9nKDAsICJwcm9jZXNzaW5nIGxvY2tyZXMgJS4qc1xuIiwgbG9ja3Jlcy0+bF9uYW1lbGVuLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IDg4MDFlNDEuLmU2MjIwMTMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlICJkY2FjaGUuaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgorI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJoZWFydGJlYXQuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgImpvdXJuYWwuaCIKQEAgLTc2OSw3ICs3NzAsNyBAQAogCQkJICAgICBpbnQgZGxtX2ZsYWdzKQogewogCWludCByZXQgPSAwOwotCWVudW0gZGxtX3N0YXR1cyBzdGF0dXM7CisJZW51bSBkbG1fc3RhdHVzIHN0YXR1cyA9IERMTV9OT1JNQUw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwpAQCAtMTA2MywxMCArMTA2NCwxMCBAQAogCW1sb2dfZXhpdF92b2lkKCk7CiB9CiAKLWludCBvY2ZzMl9jcmVhdGVfbmV3X2xvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgIHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcywKLQkJCSAgaW50IGV4LAotCQkJICBpbnQgbG9jYWwpCitzdGF0aWMgaW50IG9jZnMyX2NyZWF0ZV9uZXdfbG9jayhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkgc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzLAorCQkJCSBpbnQgZXgsCisJCQkJIGludCBsb2NhbCkKIHsKIAlpbnQgbGV2ZWwgPSAgZXggPyBMS01fRVhNT0RFIDogTEtNX1BSTU9ERTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTEzNyw2ICsxMTM4LDcgQEAKIHsKIAlpbnQgc3RhdHVzLCBsZXZlbDsKIAlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXM7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAKIAlCVUdfT04oIWlub2RlKTsKIApAQCAtMTE0Niw2ICsxMTQ4LDkgQEAKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCSAgICAgd3JpdGUgPyAiRVhNT0RFIiA6ICJQUk1PREUiKTsKIAorCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlyZXR1cm4gMDsKKwogCWxvY2tyZXMgPSAmT0NGUzJfSShpbm9kZSktPmlwX3J3X2xvY2tyZXM7CiAKIAlsZXZlbCA9IHdyaXRlID8gTEtNX0VYTU9ERSA6IExLTV9QUk1PREU7CkBAIC0xMTYzLDYgKzExNjgsNyBAQAogewogCWludCBsZXZlbCA9IHdyaXRlID8gTEtNX0VYTU9ERSA6IExLTV9QUk1PREU7CiAJc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzID0gJk9DRlMyX0koaW5vZGUpLT5pcF9yd19sb2NrcmVzOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTExNzAsNyArMTE3Niw4IEBACiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKIAkgICAgIHdyaXRlID8gIkVYTU9ERSIgOiAiUFJNT0RFIik7CiAKLQlvY2ZzMl9jbHVzdGVyX3VubG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGxvY2tyZXMsIGxldmVsKTsKKwlpZiAoIW9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCW9jZnMyX2NsdXN0ZXJfdW5sb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgbG9ja3JlcywgbGV2ZWwpOwogCiAJbWxvZ19leGl0X3ZvaWQoKTsKIH0KQEAgLTExODEsNiArMTE4OCw3IEBACiB7CiAJaW50IHN0YXR1cyA9IDAsIGxldmVsOwogCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlczsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAogCUJVR19PTighaW5vZGUpOwogCkBAIC0xMjAwLDYgKzEyMDgsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJZ290byBvdXQ7CisKIAlsb2NrcmVzID0gJk9DRlMyX0koaW5vZGUpLT5pcF9kYXRhX2xvY2tyZXM7CiAKIAlsZXZlbCA9IHdyaXRlID8gTEtNX0VYTU9ERSA6IExLTV9QUk1PREU7CkBAIC0xMjY4LDYgKzEyNzksNyBAQAogewogCWludCBsZXZlbCA9IHdyaXRlID8gTEtNX0VYTU9ERSA6IExLTV9QUk1PREU7CiAJc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzID0gJk9DRlMyX0koaW5vZGUpLT5pcF9kYXRhX2xvY2tyZXM7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIApAQCAtMTI3NSw3ICsxMjg3LDggQEAKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCSAgICAgd3JpdGUgPyAiRVhNT0RFIiA6ICJQUk1PREUiKTsKIAotCWlmICghb2NmczJfaXNfaGFyZF9yZWFkb25seShPQ0ZTMl9TQihpbm9kZS0+aV9zYikpKQorCWlmICghb2NmczJfaXNfaGFyZF9yZWFkb25seShPQ0ZTMl9TQihpbm9kZS0+aV9zYikpICYmCisJICAgICFvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQogCQlvY2ZzMl9jbHVzdGVyX3VubG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGxvY2tyZXMsIGxldmVsKTsKIAogCW1sb2dfZXhpdF92b2lkKCk7CkBAIC0xNDY2LDggKzE0NzksOSBAQAogewogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwotCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlczsKKwlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTE0ODIsMTAgKzE0OTYsMTIgQEAKIAl9CiAJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKIAotCWxvY2tyZXMgPSAmb2ktPmlwX21ldGFfbG9ja3JlczsKKwlpZiAoIW9jZnMyX21vdW50X2xvY2FsKG9zYikpIHsKKwkJbG9ja3JlcyA9ICZvaS0+aXBfbWV0YV9sb2NrcmVzOwogCi0JaWYgKCFvY2ZzMl9zaG91bGRfcmVmcmVzaF9sb2NrX3Jlcyhsb2NrcmVzKSkKLQkJZ290byBiYWlsOworCQlpZiAoIW9jZnMyX3Nob3VsZF9yZWZyZXNoX2xvY2tfcmVzKGxvY2tyZXMpKQorCQkJZ290byBiYWlsOworCX0KIAogCS8qIFRoaXMgd2lsbCBkaXNjYXJkIGFueSBjYWNoaW5nIGluZm9ybWF0aW9uIHdlIG1pZ2h0IGhhdmUgaGFkCiAJICogZm9yIHRoZSBpbm9kZSBtZXRhZGF0YS4gKi8KQEAgLTE0OTUsNyArMTUxMSw3IEBACiAJICogbWFwIChkaXJlY3RvcmllcywgYml0bWFwIGZpbGVzLCBldGMpICovCiAJb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CiAKLQlpZiAob2NmczJfbWV0YV9sdmJfaXNfdHJ1c3RhYmxlKGlub2RlLCBsb2NrcmVzKSkgeworCWlmIChsb2NrcmVzICYmIG9jZnMyX21ldGFfbHZiX2lzX3RydXN0YWJsZShpbm9kZSwgbG9ja3JlcykpIHsKIAkJbWxvZygwLCAiVHJ1c3RpbmcgTFZCIG9uIGlub2RlICVsbHVcbiIsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8pOwogCQlvY2ZzMl9yZWZyZXNoX2lub2RlX2Zyb21fbHZiKGlub2RlKTsKQEAgLTE1NDIsNyArMTU1OCw4IEBACiAKIAlzdGF0dXMgPSAwOwogYmFpbF9yZWZyZXNoOgotCW9jZnMyX2NvbXBsZXRlX2xvY2tfcmVzX3JlZnJlc2gobG9ja3Jlcywgc3RhdHVzKTsKKwlpZiAobG9ja3JlcykKKwkJb2NmczJfY29tcGxldGVfbG9ja19yZXNfcmVmcmVzaChsb2NrcmVzLCBzdGF0dXMpOwogYmFpbDoKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTU3OSwxMyArMTU5NiwxMiBAQAogICogdGhlIHJlc3VsdCBvZiB0aGUgbG9jayB3aWxsIGJlIGNvbW11bmljYXRlZCB2aWEgdGhlIGNhbGxiYWNrLgogICovCiBpbnQgb2NmczJfbWV0YV9sb2NrX2Z1bGwoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKIAkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZXRfYmgsCiAJCQkgaW50IGV4LAogCQkJIGludCBhcmdfZmxhZ3MpCiB7CiAJaW50IHN0YXR1cywgbGV2ZWwsIGRsbV9mbGFncywgYWNxdWlyZWQ7Ci0Jc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzOworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsb2NhbF9iaCA9IE5VTEw7CiAKQEAgLTE2MDcsNiArMTYyMyw5IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJZ290byBsb2NhbDsKKwogCWlmICghKGFyZ19mbGFncyAmIE9DRlMyX01FVEFfTE9DS19SRUNPVkVSWSkpCiAJCXdhaXRfZXZlbnQob3NiLT5yZWNvdmVyeV9ldmVudCwKIAkJCSAgIG9jZnMyX25vZGVfbWFwX2lzX2VtcHR5KG9zYiwgJm9zYi0+cmVjb3ZlcnlfbWFwKSk7CkBAIC0xNjM2LDYgKzE2NTUsNyBAQAogCQl3YWl0X2V2ZW50KG9zYi0+cmVjb3ZlcnlfZXZlbnQsCiAJCQkgICBvY2ZzMl9ub2RlX21hcF9pc19lbXB0eShvc2IsICZvc2ItPnJlY292ZXJ5X21hcCkpOwogCitsb2NhbDoKIAkvKgogCSAqIFdlIG9ubHkgc2VlIHRoaXMgZmxhZyBpZiB3ZSdyZSBiZWluZyBjYWxsZWQgZnJvbQogCSAqIG9jZnMyX3JlYWRfbG9ja2VkX2lub2RlKCkuIEl0IG1lYW5zIHdlJ3JlIGxvY2tpbmcgYW4gaW5vZGUKQEAgLTE2NDQsNyArMTY2NCw4IEBACiAJICovCiAJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKIAkJc3RhdHVzID0gMDsKLQkJb2NmczJfY29tcGxldGVfbG9ja19yZXNfcmVmcmVzaChsb2NrcmVzLCAwKTsKKwkJaWYgKGxvY2tyZXMpCisJCQlvY2ZzMl9jb21wbGV0ZV9sb2NrX3Jlc19yZWZyZXNoKGxvY2tyZXMsIDApOwogCQlnb3RvIGJhaWw7CiAJfQogCkBAIC0xNjY4LDEyICsxNjg5LDYgQEAKIAkJfQogCX0KIAotCWlmIChoYW5kbGUpIHsKLQkJc3RhdHVzID0gb2NmczJfaGFuZGxlX2FkZF9sb2NrKGhhbmRsZSwgaW5vZGUpOwotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQl9Ci0KIGJhaWw6CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHJldF9iaCAmJiAoKnJldF9iaCkpIHsKQEAgLTE3MTMsMTggKzE3MjgsMTYgQEAKICAqIHRoZSBsb2NrIGludmVyc2lvbiBzaW1wbHkuCiAgKi8KIGludCBvY2ZzMl9tZXRhX2xvY2tfd2l0aF9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJldF9iaCwKIAkJCSAgICAgIGludCBleCwKIAkJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlKQogewogCWludCByZXQ7CiAKLQlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfZnVsbChpbm9kZSwgaGFuZGxlLCByZXRfYmgsIGV4LAotCQkJCSAgIE9DRlMyX0xPQ0tfTk9OQkxPQ0spOworCXJldCA9IG9jZnMyX21ldGFfbG9ja19mdWxsKGlub2RlLCByZXRfYmgsIGV4LCBPQ0ZTMl9MT0NLX05PTkJMT0NLKTsKIAlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCWlmIChvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIGhhbmRsZSwgcmV0X2JoLCBleCkgPT0gMCkKKwkJaWYgKG9jZnMyX21ldGFfbG9jayhpbm9kZSwgcmV0X2JoLCBleCkgPT0gMCkKIAkJCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCBleCk7CiAJCXJldCA9IEFPUF9UUlVOQ0FURURfUEFHRTsKIAl9CkBAIC0xNzMyLDExICsxNzQ1LDUwIEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IG9jZnMyX21ldGFfbG9ja19hdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICBzdHJ1Y3QgdmZzbW91bnQgKnZmc21udCwKKwkJCSAgaW50ICpsZXZlbCkKK3sKKwlpbnQgcmV0OworCisJbWxvZ19lbnRyeV92b2lkKCk7CisJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBzaG91bGQgdXBkYXRlIGF0aW1lLCB3ZSB3aWxsIGdldCBFWCBsb2NrLAorCSAqIG90aGVyd2lzZSB3ZSBqdXN0IGdldCBQUiBsb2NrLgorCSAqLworCWlmIChvY2ZzMl9zaG91bGRfdXBkYXRlX2F0aW1lKGlub2RlLCB2ZnNtbnQpKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAwKTsKKwkJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmYmgsIDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkqbGV2ZWwgPSAxOworCQlpZiAob2NmczJfc2hvdWxkX3VwZGF0ZV9hdGltZShpbm9kZSwgdmZzbW50KSkKKwkJCW9jZnMyX3VwZGF0ZV9pbm9kZV9hdGltZShpbm9kZSwgYmgpOworCQlpZiAoYmgpCisJCQlicmVsc2UoYmgpOworCX0gZWxzZQorCQkqbGV2ZWwgPSAwOworCisJbWxvZ19leGl0KHJldCk7CisJcmV0dXJuIHJldDsKK30KKwogdm9pZCBvY2ZzMl9tZXRhX3VubG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkgICAgICAgaW50IGV4KQogewogCWludCBsZXZlbCA9IGV4ID8gTEtNX0VYTU9ERSA6IExLTV9QUk1PREU7CiAJc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzID0gJk9DRlMyX0koaW5vZGUpLT5pcF9tZXRhX2xvY2tyZXM7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIApAQCAtMTc0NCw3ICsxNzk2LDggQEAKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCSAgICAgZXggPyAiRVhNT0RFIiA6ICJQUk1PREUiKTsKIAotCWlmICghb2NmczJfaXNfaGFyZF9yZWFkb25seShPQ0ZTMl9TQihpbm9kZS0+aV9zYikpKQorCWlmICghb2NmczJfaXNfaGFyZF9yZWFkb25seShPQ0ZTMl9TQihpbm9kZS0+aV9zYikpICYmCisJICAgICFvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQogCQlvY2ZzMl9jbHVzdGVyX3VubG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGxvY2tyZXMsIGxldmVsKTsKIAogCW1sb2dfZXhpdF92b2lkKCk7CkBAIC0xNzUzLDcgKzE4MDYsNyBAQAogaW50IG9jZnMyX3N1cGVyX2xvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCSAgICAgaW50IGV4KQogewotCWludCBzdGF0dXM7CisJaW50IHN0YXR1cyA9IDA7CiAJaW50IGxldmVsID0gZXggPyBMS01fRVhNT0RFIDogTEtNX1BSTU9ERTsKIAlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMgPSAmb3NiLT5vc2Jfc3VwZXJfbG9ja3JlczsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwpAQCAtMTc2NCw2ICsxODE3LDkgQEAKIAlpZiAob2NmczJfaXNfaGFyZF9yZWFkb25seShvc2IpKQogCQlyZXR1cm4gLUVST0ZTOwogCisJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCWdvdG8gYmFpbDsKKwogCXN0YXR1cyA9IG9jZnMyX2NsdXN0ZXJfbG9jayhvc2IsIGxvY2tyZXMsIGxldmVsLCAwLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xODAyLDcgKzE4NTgsOCBAQAogCWludCBsZXZlbCA9IGV4ID8gTEtNX0VYTU9ERSA6IExLTV9QUk1PREU7CiAJc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzID0gJm9zYi0+b3NiX3N1cGVyX2xvY2tyZXM7CiAKLQlvY2ZzMl9jbHVzdGVyX3VubG9jayhvc2IsIGxvY2tyZXMsIGxldmVsKTsKKwlpZiAoIW9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCW9jZnMyX2NsdXN0ZXJfdW5sb2NrKG9zYiwgbG9ja3JlcywgbGV2ZWwpOwogfQogCiBpbnQgb2NmczJfcmVuYW1lX2xvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCkBAIC0xODEzLDYgKzE4NzAsOSBAQAogCWlmIChvY2ZzMl9pc19oYXJkX3JlYWRvbmx5KG9zYikpCiAJCXJldHVybiAtRVJPRlM7CiAKKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJcmV0dXJuIDA7CisKIAlzdGF0dXMgPSBvY2ZzMl9jbHVzdGVyX2xvY2sob3NiLCBsb2NrcmVzLCBMS01fRVhNT0RFLCAwLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTgyNCw3ICsxODg0LDggQEAKIHsKIAlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMgPSAmb3NiLT5vc2JfcmVuYW1lX2xvY2tyZXM7CiAKLQlvY2ZzMl9jbHVzdGVyX3VubG9jayhvc2IsIGxvY2tyZXMsIExLTV9FWE1PREUpOworCWlmICghb2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJb2NmczJfY2x1c3Rlcl91bmxvY2sob3NiLCBsb2NrcmVzLCBMS01fRVhNT0RFKTsKIH0KIAogaW50IG9jZnMyX2RlbnRyeV9sb2NrKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGV4KQpAQCAtMTgzOSw2ICsxOTAwLDkgQEAKIAlpZiAob2NmczJfaXNfaGFyZF9yZWFkb25seShvc2IpKQogCQlyZXR1cm4gLUVST0ZTOwogCisJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCXJldHVybiAwOworCiAJcmV0ID0gb2NmczJfY2x1c3Rlcl9sb2NrKG9zYiwgJmRsLT5kbF9sb2NrcmVzLCBsZXZlbCwgMCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTE4NTIsNyArMTkxNiw4IEBACiAJc3RydWN0IG9jZnMyX2RlbnRyeV9sb2NrICpkbCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihkZW50cnktPmRfc2IpOwogCi0Jb2NmczJfY2x1c3Rlcl91bmxvY2sob3NiLCAmZGwtPmRsX2xvY2tyZXMsIGxldmVsKTsKKwlpZiAoIW9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCW9jZnMyX2NsdXN0ZXJfdW5sb2NrKG9zYiwgJmRsLT5kbF9sb2NrcmVzLCBsZXZlbCk7CiB9CiAKIC8qIFJlZmVyZW5jZSBjb3VudGluZyBvZiB0aGUgZGxtIGRlYnVnIHN0cnVjdHVyZS4gV2Ugd2FudCB0aGlzIGJlY2F1c2UKQEAgLTIxMTUsMTIgKzIxODAsMTUgQEAKIAogaW50IG9jZnMyX2RsbV9pbml0KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQogewotCWludCBzdGF0dXM7CisJaW50IHN0YXR1cyA9IDA7CiAJdTMyIGRsbV9rZXk7Ci0Jc3RydWN0IGRsbV9jdHh0ICpkbG07CisJc3RydWN0IGRsbV9jdHh0ICpkbG0gPSBOVUxMOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJZ290byBsb2NhbDsKKwogCXN0YXR1cyA9IG9jZnMyX2RsbV9pbml0X2RlYnVnKG9zYik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMjE0OCwxMSArMjIxNiwxMiBAQAogCQlnb3RvIGJhaWw7CiAJfQogCisJZGxtX3JlZ2lzdGVyX2V2aWN0aW9uX2NiKGRsbSwgJm9zYi0+b3NiX2V2aWN0aW9uX2NiKTsKKworbG9jYWw6CiAJb2NmczJfc3VwZXJfbG9ja19yZXNfaW5pdCgmb3NiLT5vc2Jfc3VwZXJfbG9ja3Jlcywgb3NiKTsKIAlvY2ZzMl9yZW5hbWVfbG9ja19yZXNfaW5pdCgmb3NiLT5vc2JfcmVuYW1lX2xvY2tyZXMsIG9zYik7CiAKLQlkbG1fcmVnaXN0ZXJfZXZpY3Rpb25fY2IoZGxtLCAmb3NiLT5vc2JfZXZpY3Rpb25fY2IpOwotCiAJb3NiLT5kbG0gPSBkbG07CiAKIAlzdGF0dXMgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5oIGIvZnMvb2NmczIvZGxtZ2x1ZS5oCmluZGV4IDRhMjc2OTMuLmMzNDNmY2EgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuaAorKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmgKQEAgLTY4LDggKzY4LDYgQEAKIAkJCQl1NjQgcGFyZW50LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHZvaWQgb2NmczJfbG9ja19yZXNfZnJlZShzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKnJlcyk7CiBpbnQgb2NmczJfY3JlYXRlX25ld19pbm9kZV9sb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLWludCBvY2ZzMl9jcmVhdGVfbmV3X2xvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgIHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcywgaW50IGV4LCBpbnQgbG9jYWwpOwogaW50IG9jZnMyX2Ryb3BfaW5vZGVfbG9ja3Moc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgb2NmczJfZGF0YV9sb2NrX2Z1bGwoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSBpbnQgd3JpdGUsCkBAIC04MiwxOSArODAsMjAgQEAKIAkJICAgICAgIGludCB3cml0ZSk7CiBpbnQgb2NmczJfcndfbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd3JpdGUpOwogdm9pZCBvY2ZzMl9yd191bmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdyaXRlKTsKK2ludCBvY2ZzMl9tZXRhX2xvY2tfYXRpbWUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQsCisJCQkgIGludCAqbGV2ZWwpOwogaW50IG9jZnMyX21ldGFfbG9ja19mdWxsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcmV0X2JoLAogCQkJIGludCBleCwKIAkJCSBpbnQgYXJnX2ZsYWdzKTsKIGludCBvY2ZzMl9tZXRhX2xvY2tfd2l0aF9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJldF9iaCwKIAkJCSAgICAgIGludCBleCwKIAkJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlKTsKIC8qIDk5JSBvZiB0aGUgdGltZSB3ZSBkb24ndCB3YW50IHRvIHN1cHBseSBhbnkgYWRkaXRpb25hbCBmbGFncyAtLQogICogdGhvc2UgYXJlIGZvciB2ZXJ5IHNwZWNpZmljIGNhc2VzIG9ubHkuICovCi0jZGVmaW5lIG9jZnMyX21ldGFfbG9jayhpLCBoLCBiLCBlKSBvY2ZzMl9tZXRhX2xvY2tfZnVsbChpLCBoLCBiLCBlLCAwKQorI2RlZmluZSBvY2ZzMl9tZXRhX2xvY2soaSwgYiwgZSkgb2NmczJfbWV0YV9sb2NrX2Z1bGwoaSwgYiwgZSwgMCkKIHZvaWQgb2NmczJfbWV0YV91bmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKIAkJICAgICAgIGludCBleCk7CiBpbnQgb2NmczJfc3VwZXJfbG9jayhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4cG9ydC5jIGIvZnMvb2NmczIvZXhwb3J0LmMKaW5kZXggZmI5MTA4OS4uMDZiZTZlNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXhwb3J0LmMKKysrIGIvZnMvb2NmczIvZXhwb3J0LmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCW1sb2coMCwgImZpbmQgcGFyZW50IG9mIGRpcmVjdG9yeSAlbGx1XG4iLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGRpciktPmlwX2Jsa25vKTsKIAotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkaXIsIE5VTEwsIE5VTEwsIDApOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkaXIsIE5VTEwsIDApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwppbmRleCBmY2Q0NDc1Li44MGFjNjlmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKKysrIGIvZnMvb2NmczIvZXh0ZW50X21hcC5jCkBAIC02MSw3ICs2MSw3IEBACiAJc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKnJpZ2h0X2VudDsKIH07CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKm9jZnMyX2VtX2VudF9jYWNoZXAgPSBOVUxMOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpvY2ZzMl9lbV9lbnRfY2FjaGVwID0gTlVMTDsKIAogCiBzdGF0aWMgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIvZmlsZS5jCmluZGV4IGQ5YmEwYTkuLjlmZDU5MGIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTMwLDYgKzMwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGlwZV9mc19pLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0lOT0RFCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC02NSw3ICs2OCw3IEBACiAJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CiAKIAltbG9nX2VudHJ5KCIoMHglcCwgMHglcCwgJyUuKnMnKVxuIiwgaW5vZGUsIGZpbGUsCi0JCSAgIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubGVuLCBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubGVuLCBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAlzcGluX2xvY2soJm9pLT5pcF9sb2NrKTsKIApAQCAtOTUsOCArOTgsOCBAQAogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsIDB4JXAsICclLipzJylcbiIsIGlub2RlLCBmaWxlLAotCQkgICAgICAgZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5sZW4sCi0JCSAgICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkgICAgICAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJICAgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCXNwaW5fbG9jaygmb2ktPmlwX2xvY2spOwogCWlmICghLS1vaS0+aXBfb3Blbl9jb3VudCkKQEAgLTEzMyw3ICsxMzYsNjYgQEAKIAlyZXR1cm4gKGVyciA8IDApID8gLUVJTyA6IDA7CiB9CiAKLWludCBvY2ZzMl9zZXRfaW5vZGVfc2l6ZShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9zaG91bGRfdXBkYXRlX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3QgdmZzbW91bnQgKnZmc21udCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgbm93OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJaWYgKG9jZnMyX2lzX2hhcmRfcmVhZG9ubHkob3NiKSB8fCBvY2ZzMl9pc19zb2Z0X3JlYWRvbmx5KG9zYikpCisJCXJldHVybiAwOworCisJaWYgKChpbm9kZS0+aV9mbGFncyAmIFNfTk9BVElNRSkgfHwKKwkgICAgKChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX05PRElSQVRJTUUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm4gMDsKKworCWlmICgodmZzbW50LT5tbnRfZmxhZ3MgJiBNTlRfTk9BVElNRSkgfHwKKwkgICAgKCh2ZnNtbnQtPm1udF9mbGFncyAmIE1OVF9OT0RJUkFUSU1FKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodmZzbW50LT5tbnRfZmxhZ3MgJiBNTlRfUkVMQVRJTUUpIHsKKwkJaWYgKCh0aW1lc3BlY19jb21wYXJlKCZpbm9kZS0+aV9hdGltZSwgJmlub2RlLT5pX210aW1lKSA8PSAwKSB8fAorCQkgICAgKHRpbWVzcGVjX2NvbXBhcmUoJmlub2RlLT5pX2F0aW1lLCAmaW5vZGUtPmlfY3RpbWUpIDw9IDApKQorCQkJcmV0dXJuIDE7CisKKwkJcmV0dXJuIDA7CisJfQorCisJbm93ID0gQ1VSUkVOVF9USU1FOworCWlmICgobm93LnR2X3NlYyAtIGlub2RlLT5pX2F0aW1lLnR2X3NlYyA8PSBvc2ItPnNfYXRpbWVfcXVhbnR1bSkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK2ludCBvY2ZzMl91cGRhdGVfaW5vZGVfYXRpbWUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCWhhbmRsZV90ICpoYW5kbGU7CisKKwltbG9nX2VudHJ5X3ZvaWQoKTsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWlmIChoYW5kbGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlub2RlLT5pX2F0aW1lID0gQ1VSUkVOVF9USU1FOworCXJldCA9IG9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSwgYmgpOworCWlmIChyZXQgPCAwKQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOworb3V0OgorCW1sb2dfZXhpdChyZXQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl9zZXRfaW5vZGVfc2l6ZShoYW5kbGVfdCAqaGFuZGxlLAogCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSB1NjQgbmV3X2lfc2l6ZSkKQEAgLTE2MiwxMCArMjI0LDkgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgTlVMTCwKLQkJCQkgICBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTE3Nyw3ICsyMzgsNyBAQAogCWlmIChyZXQgPCAwKQogCQltbG9nX2Vycm5vKHJldCk7CiAKLQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xODgsMTQgKzI0OSwxNCBAQAogCQkJCSAgICAgdTY0IG5ld19pX3NpemUpCiB7CiAJaW50IHN0YXR1czsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZTsKKwloYW5kbGVfdCAqaGFuZGxlOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKIAkvKiBUT0RPOiBUaGlzIG5lZWRzIHRvIGFjdHVhbGx5IG9ycGhhbiB0aGUgaW5vZGUgaW4gdGhpcwogCSAqIHRyYW5zYWN0aW9uLiAqLwogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBOVUxMLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMjA2LDcgKzI2Nyw3IEBACiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAotCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiBvdXQ6CiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTMyNyw3ICszODgsNyBAQAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCiAJCQkgICAgICAgZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgKnJlYXNvbl9yZXQpCkBAIC00MzIsNyArNDkzLDcgQEAKIAl1MzIgcHJldl9jbHVzdGVyczsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CiAJZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgd2h5OwpAQCAtNDYyLDEzICs1MjMsNiBAQAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGlfc2l6ZV9yZWFkKGlub2RlKSwKIAkgICAgIGZlLT5pX2NsdXN0ZXJzLCBjbHVzdGVyc190b19hZGQpOwogCi0JaGFuZGxlID0gb2NmczJfYWxsb2NfaGFuZGxlKG9zYik7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KIAludW1fZnJlZV9leHRlbnRzID0gb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhvc2IsCiAJCQkJCQkgIGlub2RlLAogCQkJCQkJICBmZSk7CkBAIC00NzksMTAgKzUzMyw3IEBACiAJfQogCiAJaWYgKCFudW1fZnJlZV9leHRlbnRzKSB7Ci0JCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwKLQkJCQkJCSAgICBoYW5kbGUsCi0JCQkJCQkgICAgZmUsCi0JCQkJCQkgICAgJm1ldGFfYWMpOworCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGZlLCAmbWV0YV9hYyk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNDkwLDEwICs1NDEsNyBAQAogCQl9CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsCi0JCQkJCWhhbmRsZSwKLQkJCQkJY2x1c3RlcnNfdG9fYWRkLAotCQkJCQkmZGF0YV9hYyk7CisJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIGNsdXN0ZXJzX3RvX2FkZCwgJmRhdGFfYWMpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTUwOCw3ICs1NTYsNyBAQAogCWRyb3BfYWxsb2Nfc2VtID0gMTsKIAogCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKG9zYi0+c2IsIGZlLCBjbHVzdGVyc190b19hZGQpOwotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBjcmVkaXRzKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC01ODgsNyArNjM2LDcgQEAKIAkJZHJvcF9hbGxvY19zZW0gPSAwOwogCX0KIAlpZiAoaGFuZGxlKSB7Ci0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwogCX0KIAlpZiAoZGF0YV9hYykgewpAQCAtNjIzLDcgKzY3MSw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBpbmRleDsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJb2Zmc2V0ID0gKHNpemUgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKTsgLyogV2l0aGluIHBhZ2UgKi8KQEAgLTY2Nyw3ICs3MTUsNyBAQAogCQlyZXQgPSAwOwogCiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CiBvdXRfdW5sb2NrOgogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKQEAgLTY5MSw2ICs3MzksMTIgQEAKIAkJfQogCiAJCXN0YXJ0X29mZiArPSBzYi0+c19ibG9ja3NpemU7CisKKwkJLyoKKwkJICogVmVyeSBsYXJnZSBleHRlbmRzIGhhdmUgdGhlIHBvdGVudGlhbCB0byBsb2NrIHVwCisJCSAqIHRoZSBjcHUgZm9yIGV4dGVuZGVkIHBlcmlvZHMgb2YgdGltZS4KKwkJICovCisJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAogb3V0OgpAQCAtNzI4LDMxICs3ODIsMzYgQEAKIAljbHVzdGVyc190b19hZGQgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsIG5ld19pX3NpemUpIC0gCiAJCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVyczsKIAotCWlmIChjbHVzdGVyc190b19hZGQpIHsKLQkJLyogCi0JCSAqIHByb3RlY3QgdGhlIHBhZ2VzIHRoYXQgb2NmczJfemVyb19leHRlbmQgaXMgZ29pbmcgdG8KLQkJICogYmUgcHVsbGluZyBpbnRvIHRoZSBwYWdlIGNhY2hlLi4gd2UgZG8gdGhpcyBiZWZvcmUgdGhlCi0JCSAqIG1ldGFkYXRhIGV4dGVuZCBzbyB0aGF0IHdlIGRvbid0IGdldCBpbnRvIHRoZSBzaXR1YXRpb24KLQkJICogd2hlcmUgd2UndmUgZXh0ZW5kZWQgdGhlIG1ldGFkYXRhIGJ1dCBjYW4ndCBnZXQgdGhlIGRhdGEKLQkJICogbG9jayB0byB6ZXJvLgotCQkgKi8KLQkJcmV0ID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAxKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9CisJLyogCisJICogcHJvdGVjdCB0aGUgcGFnZXMgdGhhdCBvY2ZzMl96ZXJvX2V4dGVuZCBpcyBnb2luZyB0byBiZQorCSAqIHB1bGxpbmcgaW50byB0aGUgcGFnZSBjYWNoZS4uIHdlIGRvIHRoaXMgYmVmb3JlIHRoZQorCSAqIG1ldGFkYXRhIGV4dGVuZCBzbyB0aGF0IHdlIGRvbid0IGdldCBpbnRvIHRoZSBzaXR1YXRpb24KKwkgKiB3aGVyZSB3ZSd2ZSBleHRlbmRlZCB0aGUgbWV0YWRhdGEgYnV0IGNhbid0IGdldCB0aGUgZGF0YQorCSAqIGxvY2sgdG8gemVyby4KKwkgKi8KKwlyZXQgPSBvY2ZzMl9kYXRhX2xvY2soaW5vZGUsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQogCisJaWYgKGNsdXN0ZXJzX3RvX2FkZCkgewogCQlyZXQgPSBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihpbm9kZSwgY2x1c3RlcnNfdG9fYWRkKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQorCX0KIAotCQlyZXQgPSBvY2ZzMl96ZXJvX2V4dGVuZChpbm9kZSwgKHU2NCluZXdfaV9zaXplIC0gdGFpbF90b19za2lwKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X3VubG9jazsKLQkJfQorCS8qCisJICogQ2FsbCB0aGlzIGV2ZW4gaWYgd2UgZG9uJ3QgYWRkIGFueSBjbHVzdGVycyB0byB0aGUgdHJlZS4gV2UKKwkgKiBzdGlsbCBuZWVkIHRvIHplcm8gdGhlIGFyZWEgYmV0d2VlbiB0aGUgb2xkIGlfc2l6ZSBhbmQgdGhlCisJICogbmV3IGlfc2l6ZS4KKwkgKi8KKwlyZXQgPSBvY2ZzMl96ZXJvX2V4dGVuZChpbm9kZSwgKHU2NCluZXdfaV9zaXplIC0gdGFpbF90b19za2lwKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKIAlpZiAoIXRhaWxfdG9fc2tpcCkgewpAQCAtNzY0LDggKzgyMyw3IEBACiAJfQogCiBvdXRfdW5sb2NrOgotCWlmIChjbHVzdGVyc190b19hZGQpIC8qIHRoaXMgaXMgdGhlIG9ubHkgY2FzZSBpbiB3aGljaCB3ZSBsb2NrICovCi0JCW9jZnMyX2RhdGFfdW5sb2NrKGlub2RlLCAxKTsKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CiAKIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtNzc4LDcgKzgzNiw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0Ioc2IpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAogCW1sb2dfZW50cnkoIigweCVwLCAnJS4qcycpXG4iLCBkZW50cnksCiAJICAgICAgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwpAQCAtODE0LDcgKzg3Miw3IEBACiAJCX0KIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsICZiaCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTgzNCw3ICs4OTIsNyBAQAogCQl9CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBOVUxMLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtODUyLDcgKzkxMCw3IEBACiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAogYmFpbF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIGJhaWxfdW5sb2NrOgogCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKIGJhaWxfdW5sb2NrX3J3OgpAQCAtODk1LDE5ICs5NTMsNDEgQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgb2NmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldDsKKworCW1sb2dfZW50cnlfdm9pZCgpOworCisJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAwKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMCk7CitvdXQ6CisJbWxvZ19leGl0KHJldCk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBvY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWludCByZXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGU7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAogCW1sb2dfZW50cnkoIihJbm9kZSAlbGx1LCBtb2RlIDAlbylcbiIsCiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2ktPmlwX2Jsa25vLCBpbm9kZS0+aV9tb2RlKTsKIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgTlVMTCwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpOwogCWlmIChoYW5kbGUgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC05NDAsNzUgKzEwMjAsMjkgQEAKIG91dF9iaDoKIAlicmVsc2UoYmgpOwogb3V0X3RyYW5zOgotCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiBvdXQ6CiAJbWxvZ19leGl0KHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgb2NmczJfd3JpdGVfc2hvdWxkX3JlbW92ZV9zdWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfaW5vZGVfZm9yX3dyaXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkJIGxvZmZfdCAqcHBvcywKKwkJCQkJIHNpemVfdCBjb3VudCwKKwkJCQkJIGludCBhcHBlbmRpbmcpCiB7Ci0JbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCi0JaWYgKCFjYXBhYmxlKENBUF9GU0VUSUQpKSB7Ci0JCWlmICh1bmxpa2VseShtb2RlICYgU19JU1VJRCkpCi0JCQlyZXR1cm4gMTsKLQotCQlpZiAodW5saWtlbHkoKG1vZGUgJiBTX0lTR0lEKSAmJiAobW9kZSAmIFNfSVhHUlApKSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3Qgb2NmczJfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLAotCQkJCSAgICBsb2ZmX3QgcG9zKQotewotCWludCByZXQsIHJ3X2xldmVsID0gLTEsIG1ldGFfbGV2ZWwgPSAtMSwgaGF2ZV9hbGxvY19zZW0gPSAwOworCWludCByZXQgPSAwLCBtZXRhX2xldmVsID0gYXBwZW5kaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJdTMyIGNsdXN0ZXJzOwotCXN0cnVjdCBmaWxlICpmaWxwID0gaW9jYi0+a2lfZmlscDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CiAJbG9mZl90IG5ld3NpemUsIHNhdmVkX3BvczsKIAotCW1sb2dfZW50cnkoIigweCVwLCAldSwgJyUuKnMnKVxuIiwgZmlscCwKLQkJICAgKHVuc2lnbmVkIGludClucl9zZWdzLAotCQkgICBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJICAgZmlscC0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKLQotCS8qIGhhcHB5IHdyaXRlIG9mIHplcm8gYnl0ZXMgKi8KLQlpZiAoaW9jYi0+a2lfbGVmdCA9PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmICghaW5vZGUpIHsKLQkJbWxvZygwLCAiYmFkIGlub2RlXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCS8qIHRvIG1hdGNoIHNldGF0dHIncyBpX211dGV4IC0+IGlfYWxsb2Nfc2VtIC0+IHJ3X2xvY2sgb3JkZXJpbmcgKi8KLQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKSB7Ci0JCWhhdmVfYWxsb2Nfc2VtID0gMTsKLQkJZG93bl9yZWFkKCZpbm9kZS0+aV9hbGxvY19zZW0pOwotCX0KLQotCS8qIGNvbmN1cnJlbnQgT19ESVJFQ1Qgd3JpdGVzIGFyZSBhbGxvd2VkICovCi0JcndfbGV2ZWwgPSAoZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKSA/IDAgOiAxOwotCXJldCA9IG9jZnMyX3J3X2xvY2soaW5vZGUsIHJ3X2xldmVsKTsKLQlpZiAocmV0IDwgMCkgewotCQlyd19sZXZlbCA9IC0xOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCS8qIAogCSAqIFdlIHNhbXBsZSBpX3NpemUgdW5kZXIgYSByZWFkIGxldmVsIG1ldGEgbG9jayB0byBzZWUgaWYgb3VyIHdyaXRlCiAJICogaXMgZXh0ZW5kaW5nIHRoZSBmaWxlLCBpZiBpdCBpcyB3ZSBiYWNrIG9mZiBhbmQgZ2V0IGEgd3JpdGUgbGV2ZWwKIAkgKiBtZXRhIGxvY2suCiAJICovCi0JbWV0YV9sZXZlbCA9IChmaWxwLT5mX2ZsYWdzICYgT19BUFBFTkQpID8gMSA6IDA7CiAJZm9yKDs7KSB7Ci0JCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgTlVMTCwgbWV0YV9sZXZlbCk7CisJCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgbWV0YV9sZXZlbCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltZXRhX2xldmVsID0gLTE7CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC0xMDI0LDcgKzEwNTgsNyBAQAogCQkgKiBpbm9kZS4gVGhlcmUncyBhbHNvIHRoZSBkaW5vZGUgaV9zaXplIHN0YXRlIHdoaWNoCiAJCSAqIGNhbiBiZSBsb3N0IHZpYSBzZXRhdHRyIGR1cmluZyBleHRlbmRpbmcgd3JpdGVzICh3ZQogCQkgKiBzZXQgaW5vZGUtPmlfc2l6ZSBhdCB0aGUgZW5kIG9mIGEgd3JpdGUuICovCi0JCWlmIChvY2ZzMl93cml0ZV9zaG91bGRfcmVtb3ZlX3N1aWQoaW5vZGUpKSB7CisJCWlmIChzaG91bGRfcmVtb3ZlX3N1aWQoZGVudHJ5KSkgewogCQkJaWYgKG1ldGFfbGV2ZWwgPT0gMCkgewogCQkJCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCBtZXRhX2xldmVsKTsKIAkJCQltZXRhX2xldmVsID0gMTsKQEAgLTEwMzQsMTkgKzEwNjgsMTkgQEAKIAkJCXJldCA9IG9jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKGlub2RlKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gb3V0X3VubG9jazsKIAkJCX0KIAkJfQogCiAJCS8qIHdvcmsgb24gYSBjb3B5IG9mIHBwb3MgdW50aWwgd2UncmUgc3VyZSB0aGF0IHdlIHdvbid0IGhhdmUKIAkJICogdG8gcmVjYWxjdWxhdGUgaXQgZHVlIHRvIHJlbG9ja2luZy4gKi8KLQkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0FQUEVORCkgeworCQlpZiAoYXBwZW5kaW5nKSB7CiAJCQlzYXZlZF9wb3MgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJCQltbG9nKDAsICJPX0FQUEVORDogaW5vZGUtPmlfc2l6ZT0lbGx1XG4iLCBzYXZlZF9wb3MpOwogCQl9IGVsc2UgewotCQkJc2F2ZWRfcG9zID0gaW9jYi0+a2lfcG9zOworCQkJc2F2ZWRfcG9zID0gKnBwb3M7CiAJCX0KLQkJbmV3c2l6ZSA9IGlvY2ItPmtpX2xlZnQgKyBzYXZlZF9wb3M7CisJCW5ld3NpemUgPSBjb3VudCArIHNhdmVkX3BvczsKIAogCQltbG9nKDAsICJwb3M9JWxsZCBuZXdzaXplPSVsbGQgY3Vyc2l6ZT0lbGxkXG4iLAogCQkgICAgIChsb25nIGxvbmcpIHNhdmVkX3BvcywgKGxvbmcgbG9uZykgbmV3c2l6ZSwKQEAgLTEwNzksMTkgKzExMTMsNjYgQEAKIAkJaWYgKCFjbHVzdGVycykKIAkJCWJyZWFrOwogCi0JCXJldCA9IG9jZnMyX2V4dGVuZF9maWxlKGlub2RlLCBOVUxMLCBuZXdzaXplLCBpb2NiLT5raV9sZWZ0KTsKKwkJcmV0ID0gb2NmczJfZXh0ZW5kX2ZpbGUoaW5vZGUsIE5VTEwsIG5ld3NpemUsIGNvdW50KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVOT1NQQykKIAkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQogCQlicmVhazsKIAl9CiAKLQkvKiBvaywgd2UncmUgZG9uZSB3aXRoIGlfc2l6ZSBhbmQgYWxsb2Mgd29yayAqLwotCWlvY2ItPmtpX3BvcyA9IHNhdmVkX3BvczsKKwlpZiAoYXBwZW5kaW5nKQorCQkqcHBvcyA9IHNhdmVkX3BvczsKKworb3V0X3VubG9jazoKIAlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgbWV0YV9sZXZlbCk7Ci0JbWV0YV9sZXZlbCA9IC0xOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgb2NmczJfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLAorCQkJCSAgICBsb2ZmX3QgcG9zKQoreworCWludCByZXQsIHJ3X2xldmVsLCBoYXZlX2FsbG9jX3NlbSA9IDA7CisJc3RydWN0IGZpbGUgKmZpbHAgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCWludCBhcHBlbmRpbmcgPSBmaWxwLT5mX2ZsYWdzICYgT19BUFBFTkQgPyAxIDogMDsKKworCW1sb2dfZW50cnkoIigweCVwLCAldSwgJyUuKnMnKVxuIiwgZmlscCwKKwkJICAgKHVuc2lnbmVkIGludClucl9zZWdzLAorCQkgICBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubGVuLAorCQkgICBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKiBoYXBweSB3cml0ZSBvZiB6ZXJvIGJ5dGVzICovCisJaWYgKGlvY2ItPmtpX2xlZnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJLyogdG8gbWF0Y2ggc2V0YXR0cidzIGlfbXV0ZXggLT4gaV9hbGxvY19zZW0gLT4gcndfbG9jayBvcmRlcmluZyAqLworCWlmIChmaWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsKKwkJaGF2ZV9hbGxvY19zZW0gPSAxOworCQlkb3duX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7CisJfQorCisJLyogY29uY3VycmVudCBPX0RJUkVDVCB3cml0ZXMgYXJlIGFsbG93ZWQgKi8KKwlyd19sZXZlbCA9IChmaWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpID8gMCA6IDE7CisJcmV0ID0gb2NmczJfcndfbG9jayhpbm9kZSwgcndfbGV2ZWwpOworCWlmIChyZXQgPCAwKSB7CisJCXJ3X2xldmVsID0gLTE7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUoZmlscC0+Zl9wYXRoLmRlbnRyeSwgJmlvY2ItPmtpX3BvcywKKwkJCQkJICAgIGlvY2ItPmtpX2xlZnQsIGFwcGVuZGluZyk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CiAKIAkvKiBjb21tdW5pY2F0ZSB3aXRoIG9jZnMyX2Rpb19lbmRfaW8gKi8KIAlvY2ZzMl9pb2NiX3NldF9yd19sb2NrZWQoaW9jYik7CkBAIC0xMTE3LDggKzExOTgsNiBAQAogCX0KIAogb3V0OgotCWlmIChtZXRhX2xldmVsICE9IC0xKQotCQlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgbWV0YV9sZXZlbCk7CiAJaWYgKGhhdmVfYWxsb2Nfc2VtKQogCQl1cF9yZWFkKCZpbm9kZS0+aV9hbGxvY19zZW0pOwogCWlmIChyd19sZXZlbCAhPSAtMSkgCkBAIC0xMTI5LDE5ICsxMjA4LDkwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHNzaXplX3Qgb2NmczJfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKm91dCwKKwkJCQkgICAgICAgbG9mZl90ICpwcG9zLAorCQkJCSAgICAgICBzaXplX3QgbGVuLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb3V0LT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCisJbWxvZ19lbnRyeSgiKDB4JXAsIDB4JXAsICV1LCAnJS4qcycpXG4iLCBvdXQsIHBpcGUsCisJCSAgICh1bnNpZ25lZCBpbnQpbGVuLAorCQkgICBvdXQtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5sZW4sCisJCSAgIG91dC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaW5vZGVfZG91YmxlX2xvY2soaW5vZGUsIHBpcGUtPmlub2RlKTsKKworCXJldCA9IG9jZnMyX3J3X2xvY2soaW5vZGUsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUob3V0LT5mX3BhdGguZGVudHJ5LCBwcG9zLCBsZW4sIDApOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIG9rLCB3ZSdyZSBkb25lIHdpdGggaV9zaXplIGFuZCBhbGxvYyB3b3JrICovCisJcmV0ID0gZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZV9ub2xvY2socGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzKTsKKworb3V0X3VubG9jazoKKwlvY2ZzMl9yd191bmxvY2soaW5vZGUsIDEpOworb3V0OgorCWlub2RlX2RvdWJsZV91bmxvY2soaW5vZGUsIHBpcGUtPmlub2RlKTsKKworCW1sb2dfZXhpdChyZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9jZnMyX2ZpbGVfc3BsaWNlX3JlYWQoc3RydWN0IGZpbGUgKmluLAorCQkJCSAgICAgIGxvZmZfdCAqcHBvcywKKwkJCQkgICAgICBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAorCQkJCSAgICAgIHNpemVfdCBsZW4sCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpbi0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKworCW1sb2dfZW50cnkoIigweCVwLCAweCVwLCAldSwgJyUuKnMnKVxuIiwgaW4sIHBpcGUsCisJCSAgICh1bnNpZ25lZCBpbnQpbGVuLAorCQkgICBpbi0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJICAgaW4tPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qCisJICogU2VlIHRoZSBjb21tZW50IGluIG9jZnMyX2ZpbGVfYWlvX3JlYWQoKQorCSAqLworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIGJhaWw7CisJfQorCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAwKTsKKworCXJldCA9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZChpbiwgcHBvcywgcGlwZSwgbGVuLCBmbGFncyk7CisKK2JhaWw6CisJbWxvZ19leGl0KHJldCk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHNzaXplX3Qgb2NmczJfZmlsZV9haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsCiAJCQkJICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCiAJCQkJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLAogCQkJCSAgIGxvZmZfdCBwb3MpCiB7Ci0JaW50IHJldCA9IDAsIHJ3X2xldmVsID0gLTEsIGhhdmVfYWxsb2Nfc2VtID0gMDsKKwlpbnQgcmV0ID0gMCwgcndfbGV2ZWwgPSAtMSwgaGF2ZV9hbGxvY19zZW0gPSAwLCBsb2NrX2xldmVsID0gMDsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsICV1LCAnJS4qcycpXG4iLCBmaWxwLAogCQkgICAodW5zaWduZWQgaW50KW5yX3NlZ3MsCi0JCSAgIGZpbHAtPmZfZGVudHJ5LT5kX25hbWUubGVuLAotCQkgICBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkgICBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubGVuLAorCQkgICBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAlpZiAoIWlub2RlKSB7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0xMTc2LDEyICsxMzI2LDEyIEBACiAJICogbGlrZSBpX3NpemUuIFRoaXMgYWxsb3dzIHRoZSBjaGVja3MgZG93biBiZWxvdwogCSAqIGdlbmVyaWNfZmlsZV9haW9fcmVhZCgpIGEgY2hhbmNlIG9mIGFjdHVhbGx5IHdvcmtpbmcuIAogCSAqLwotCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgTlVMTCwgMCk7CisJcmV0ID0gb2NmczJfbWV0YV9sb2NrX2F0aW1lKGlub2RlLCBmaWxwLT5mX3Zmc21udCwgJmxvY2tfbGV2ZWwpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBiYWlsOwogCX0KLQlvY2ZzMl9tZXRhX3VubG9jayhpbm9kZSwgMCk7CisJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIGxvY2tfbGV2ZWwpOwogCiAJcmV0ID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkKGlvY2IsIGlvdiwgbnJfc2VncywgaW9jYi0+a2lfcG9zKTsKIAlpZiAocmV0ID09IC1FSU5WQUwpCkBAIC0xMjA5LDExICsxMzU5LDEzIEBACiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBvY2ZzMl9maWxlX2lvcHMgPSB7CiAJLnNldGF0dHIJPSBvY2ZzMl9zZXRhdHRyLAogCS5nZXRhdHRyCT0gb2NmczJfZ2V0YXR0ciwKKwkucGVybWlzc2lvbgk9IG9jZnMyX3Blcm1pc3Npb24sCiB9OwogCiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBvY2ZzMl9zcGVjaWFsX2ZpbGVfaW9wcyA9IHsKIAkuc2V0YXR0cgk9IG9jZnMyX3NldGF0dHIsCiAJLmdldGF0dHIJPSBvY2ZzMl9nZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gb2NmczJfcGVybWlzc2lvbiwKIH07CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZm9wcyA9IHsKQEAgLTEyMjcsNiArMTM3OSw4IEBACiAJLmFpb19yZWFkCT0gb2NmczJfZmlsZV9haW9fcmVhZCwKIAkuYWlvX3dyaXRlCT0gb2NmczJfZmlsZV9haW9fd3JpdGUsCiAJLmlvY3RsCQk9IG9jZnMyX2lvY3RsLAorCS5zcGxpY2VfcmVhZAk9IG9jZnMyX2ZpbGVfc3BsaWNlX3JlYWQsCisJLnNwbGljZV93cml0ZQk9IG9jZnMyX2ZpbGVfc3BsaWNlX3dyaXRlLAogfTsKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvY2ZzMl9kb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5oIGIvZnMvb2NmczIvZmlsZS5oCmluZGV4IDc0MGM5ZTcuLjYwMWE0NTMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuaAorKysgYi9mcy9vY2ZzMi9maWxlLmgKQEAgLTQxLDE3ICs0MSwyNCBAQAogCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCiAJCQkgICAgICAgZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgKnJlYXNvbik7CiBpbnQgb2NmczJfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBpbnQgb2NmczJfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkgIHN0cnVjdCBrc3RhdCAqc3RhdCk7CitpbnQgb2NmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywKKwkJICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CiAKLWludCBvY2ZzMl9zZXRfaW5vZGVfc2l6ZShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9zZXRfaW5vZGVfc2l6ZShoYW5kbGVfdCAqaGFuZGxlLAogCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSB1NjQgbmV3X2lfc2l6ZSk7CiAKK2ludCBvY2ZzMl9zaG91bGRfdXBkYXRlX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3QgdmZzbW91bnQgKnZmc21udCk7CitpbnQgb2NmczJfdXBkYXRlX2lub2RlX2F0aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworCiAjZW5kaWYgLyogT0NGUzJfRklMRV9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9oZWFydGJlYXQuYyBiL2ZzL29jZnMyL2hlYXJ0YmVhdC5jCmluZGV4IGNiZmQ0NWEuLjhmYzUyZDYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2hlYXJ0YmVhdC5jCisrKyBiL2ZzL29jZnMyL2hlYXJ0YmVhdC5jCkBAIC0xNTQsNiArMTU0LDkgQEAKIHsKIAlpbnQgc3RhdHVzOwogCisJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCXJldHVybiAwOworCiAJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjaygmb3NiLT5vc2JfaGJfZG93bik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTcyLDYgKzE3NSw5IEBACiB7CiAJaW50IHN0YXR1czsKIAorCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlyZXR1cm47CisKIAlzdGF0dXMgPSBvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJm9zYi0+b3NiX2hiX2Rvd24pOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xODYsNiArMTkyLDkgQEAKIAlpbnQgcmV0OwogCWNoYXIgKmFyZ3ZbNV0sICplbnZwWzNdOwogCisJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCXJldHVybjsKKwogCWlmICghb3NiLT51dWlkX3N0cikgewogCQkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgZG9uJ3QgZ2V0IGZhciBlbm91Z2ggaW4gbW91bnQuLi4gKi8KIAkJbWxvZygwLCAiTm8gVVVJRCB3aXRoIHdoaWNoIHRvIHN0b3AgaGVhcnRiZWF0IVxuXG4iKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2lub2RlLmMgYi9mcy9vY2ZzMi9pbm9kZS5jCmluZGV4IDE2ZThlNzQuLmU0ZDkxNDkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2lub2RlLmMKKysrIGIvZnMvb2NmczIvaW5vZGUuYwpAQCAtMzYwLDcgKzM2MCw2IEBACiAJCQkJICBpbm9kZSk7CiAKIAlvY2ZzMl9zZXRfaW5vZGVfZmxhZ3MoaW5vZGUpOwotCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKIAogCXN0YXR1cyA9IDA7CiBiYWlsOgpAQCAtNDI0LDcgKzQyMyw4IEBACiAJICogY2x1c3RlciBsb2NrIGJlZm9yZSB0cnVzdGluZyBhbnl0aGluZyBhbnl3YXkuCiAJICovCiAJY2FuX2xvY2sgPSAhKGFyZ3MtPmZpX2ZsYWdzICYgT0NGUzJfRklfRkxBR19TWVNGSUxFKQotCQkmJiAhKGFyZ3MtPmZpX2ZsYWdzICYgT0NGUzJfRklfRkxBR19OT0xPQ0spOworCQkmJiAhKGFyZ3MtPmZpX2ZsYWdzICYgT0NGUzJfRklfRkxBR19OT0xPQ0spCisJCSYmICFvY2ZzMl9tb3VudF9sb2NhbChvc2IpOwogCiAJLyoKIAkgKiBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mCkBAIC00NDEsNyArNDQxLDcgQEAKIAkJCQkgIGdlbmVyYXRpb24sIGlub2RlKTsKIAogCWlmIChjYW5fbG9jaykgewotCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIE5VTEwsIDApOworCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOwogCQlpZiAoc3RhdHVzKSB7CiAJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01MTIsNyArNTEyLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgpCiB7CiAJaW50IHN0YXR1cyA9IDA7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0YyA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7CiAKQEAgLTUyNCw3ICs1MjQsNyBAQAogCWlmICghZmUtPmlfY2x1c3RlcnMpCiAJCWdvdG8gYmFpbDsKIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTUzOCw3ICs1MzgsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAloYW5kbGUgPSBOVUxMOwogCiAJc3RhdHVzID0gb2NmczJfcHJlcGFyZV90cnVuY2F0ZShvc2IsIGlub2RlLCBmZV9iaCwgJnRjKTsKQEAgLTU1NCw3ICs1NTQsNyBAQAogCX0KIGJhaWw6CiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTY4LDcgKzU2OCw3IEBACiAJaW50IHN0YXR1czsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlX2FsbG9jX2lub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2FsbG9jX2JoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZTsKKwloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZGlfYmgtPmJfZGF0YTsKIApAQCAtNTgyLDcgKzU4Miw3IEBACiAJfQogCiAJbXV0ZXhfbG9jaygmaW5vZGVfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZV9hbGxvY19pbm9kZSwgTlVMTCwgJmlub2RlX2FsbG9jX2JoLCAxKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGVfYWxsb2NfaW5vZGUsICZpbm9kZV9hbGxvY19iaCwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZpbm9kZV9hbGxvY19pbm9kZS0+aV9tdXRleCk7CiAKQEAgLTU5MCw3ICs1OTAsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBOVUxMLCBPQ0ZTMl9ERUxFVEVfSU5PREVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9ERUxFVEVfSU5PREVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAogYmFpbF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIGJhaWxfdW5sb2NrOgogCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlX2FsbG9jX2lub2RlLCAxKTsKIAltdXRleF91bmxvY2soJmlub2RlX2FsbG9jX2lub2RlLT5pX211dGV4KTsKQEAgLTcwNSw3ICs3MDUsNyBAQAogCSAqIGRlbGV0ZV9pbm9kZSBvcGVyYXRpb24uIFdlIGRvIHRoaXMgbm93IHRvIGF2b2lkIHJhY2VzIHdpdGgKIAkgKiByZWNvdmVyeSBjb21wbGV0aW9uIG9uIG90aGVyIG5vZGVzLiAqLwogCW11dGV4X2xvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhvcnBoYW5fZGlyX2lub2RlLCBOVUxMLCAmb3JwaGFuX2Rpcl9iaCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9ycGhhbl9kaXJfaW5vZGUsICZvcnBoYW5fZGlyX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltdXRleF91bmxvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOwogCkBAIC05MzMsNyArOTMzLDcgQEAKIAkgKiBhbGxvY2F0aW9uIGxvY2sgaGVyZSBhcyBpdCB3b24ndCBiZSBuZWVkZWQgLSBub2JvZHkgd2lsbAogCSAqIGhhdmUgdGhlIGZpbGUgb3Blbi4KIAkgKi8KLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsICZkaV9iaCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTEwNjcsMTIgKzEwNjcsNiBAQAogCW1sb2dfYnVnX29uX21zZyhvaS0+aXBfb3Blbl9jb3VudCwKIAkJCSJDbGVhciBpbm9kZSBvZiAlbGx1IGhhcyBvcGVuIGNvdW50ICVkXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8sIG9pLT5pcF9vcGVuX2NvdW50KTsKLQltbG9nX2J1Z19vbl9tc2coIWxpc3RfZW1wdHkoJm9pLT5pcF9oYW5kbGVfbGlzdCksCi0JCQkiQ2xlYXIgaW5vZGUgb2YgJWxsdSBoYXMgbm9uIGVtcHR5IGhhbmRsZSBsaXN0XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8pOwotCW1sb2dfYnVnX29uX21zZyhvaS0+aXBfaGFuZGxlLAotCQkJIkNsZWFyIGlub2RlIG9mICVsbHUgaGFzIG5vbiBlbXB0eSBoYW5kbGUgcG9pbnRlclxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpb2ktPmlwX2Jsa25vKTsKIAogCS8qIENsZWFyIGFsbCBvdGhlciBmbGFncy4gKi8KIAlvaS0+aXBfZmxhZ3MgPSBPQ0ZTMl9JTk9ERV9DQUNIRV9JTkxJTkU7CkBAIC0xMTg2LDcgKzExODAsNyBAQAogCiAJLyogTGV0IG9jZnMyX21ldGFfbG9jayBkbyB0aGUgd29yayBvZiB1cGRhdGluZyBvdXIgc3RydWN0CiAJICogaW5vZGUgZm9yIHVzLiAqLwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgTlVMTCwgMCk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xMjA0LDcgKzExOTgsNyBAQAogICogc3RydWN0IGlub2RlLgogICogT25seSB0YWtlcyBpcF9sb2NrLgogICovCi1pbnQgb2NmczJfbWFya19pbm9kZV9kaXJ0eShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2lub2RlLmggYi9mcy9vY2ZzMi9pbm9kZS5oCmluZGV4IDk5NTc4MTAuLjFhN2RkMjkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2lub2RlLmgKKysrIGIvZnMvb2NmczIvaW5vZGUuaApAQCAtNDgsMTMgKzQ4LDYgQEAKIAogCXN0cnVjdCBtdXRleAkJCWlwX2lvX211dGV4OwogCi0JLyogVXNlZCBieSB0aGUgam91cm5hbGxpbmcgY29kZSB0byBhdHRhY2ggYW4gaW5vZGUgdG8gYQotCSAqIGhhbmRsZS4gIFRoZXNlIGFyZSBwcm90ZWN0ZWQgYnkgaXBfaW9fbXV0ZXggaW4gb3JkZXIgdG8gbG9jawotCSAqIG91dCBvdGhlciBJL08gdG8gdGhlIGlub2RlIHVudGlsIHdlIGVpdGhlciBjb21taXQgb3IKLQkgKiBhYm9ydC4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCQlpcF9oYW5kbGVfbGlzdDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUJKmlwX2hhbmRsZTsKLQogCXUzMgkJCQlpcF9mbGFnczsgLyogc2VlIGJlbG93ICovCiAJdTMyCQkJCWlwX2F0dHI7IC8qIGlub2RlIGF0dHJpYnV0ZXMgKi8KIApAQCAtMTEzLDcgKzEwNiw3IEBACiAjZGVmaW5lIElOT0RFX0pPVVJOQUwoaSkgKE9DRlMyX0koaSktPmlwX2ZsYWdzICYgT0NGUzJfSU5PREVfSk9VUk5BTCkKICNkZWZpbmUgU0VUX0lOT0RFX0pPVVJOQUwoaSkgKE9DRlMyX0koaSktPmlwX2ZsYWdzIHw9IE9DRlMyX0lOT0RFX0pPVVJOQUwpCiAKLWV4dGVybiBrbWVtX2NhY2hlX3QgKm9jZnMyX2lub2RlX2NhY2hlOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpvY2ZzMl9pbm9kZV9jYWNoZTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgb2NmczJfYW9wczsKIApAQCAtMTQzLDcgKzEzNiw3IEBACiB2b2lkIG9jZnMyX3N5bmNfYmxvY2tkZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiB2b2lkIG9jZnMyX3JlZnJlc2hfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSk7Ci1pbnQgb2NmczJfbWFya19pbm9kZV9kaXJ0eShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiBpbnQgb2NmczJfYWlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBraW9jYiAqcmVxLCBzdHJ1Y3QgaW9jYiAqaW9jYik7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pb2N0bC5jIGIvZnMvb2NmczIvaW9jdGwuYwppbmRleCAzNjYzY2VmLi40NzY4YmU1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pb2N0bC5jCisrKyBiL2ZzL29jZnMyL2lvY3RsLmMKQEAgLTI2LDcgKzI2LDcgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCBOVUxMLCAwKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTQzLDE0ICs0MywxNCBAQAogewogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvY2ZzMl9pbm9kZSA9IE9DRlMyX0koaW5vZGUpOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAl1bnNpZ25lZCBvbGRmbGFnczsKIAlpbnQgc3RhdHVzOwogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAmYmgsIDEpOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmJoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTY3LDcgKzY3LDcgQEAKIAlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCWZsYWdzICY9IH5PQ0ZTMl9ESVJTWU5DX0ZMOwogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBOVUxMLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtOTYsNyArOTYsNyBAQAogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKLQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogYmFpbF91bmxvY2s6CiAJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOwogYmFpbDoKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuYyBiL2ZzL29jZnMyL2pvdXJuYWwuYwppbmRleCBmZDk3MzRkLi44MjVjYjBhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmMKKysrIGIvZnMvb2NmczIvam91cm5hbC5jCkBAIC01Nyw5ICs1Nyw2IEBACiBzdGF0aWMgaW50IF9fb2NmczJfcmVjb3ZlcnlfdGhyZWFkKHZvaWQgKmFyZyk7CiBzdGF0aWMgaW50IG9jZnMyX2NvbW1pdF9jYWNoZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CiBzdGF0aWMgaW50IG9jZnMyX3dhaXRfb25fbW91bnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwotc3RhdGljIHZvaWQgb2NmczJfaGFuZGxlX2NsZWFudXBfbG9ja3Moc3RydWN0IG9jZnMyX2pvdXJuYWwgKmpvdXJuYWwsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKTsKLXN0YXRpYyB2b2lkIG9jZnMyX2NvbW1pdF91bnN0YXJ0ZWRfaGFuZGxlKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlKTsKIHN0YXRpYyBpbnQgb2NmczJfam91cm5hbF90b2dnbGVfZGlydHkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgICAgaW50IGRpcnR5KTsKIHN0YXRpYyBpbnQgb2NmczJfdHJ5bG9ja19qb3VybmFsKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLApAQCAtMTEzLDQ2ICsxMTAsMTggQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKm9jZnMyX2FsbG9jX2hhbmRsZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKLXsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKnJldHZhbCA9IE5VTEw7Ci0KLQlyZXR2YWwgPSBrY2FsbG9jKDEsIHNpemVvZigqcmV0dmFsKSwgR0ZQX05PRlMpOwotCWlmICghcmV0dmFsKSB7Ci0JCW1sb2coTUxfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBqb3VybmFsICIKLQkJICAgICAiaGFuZGxlIVxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHZhbC0+bWF4X2J1ZmZzID0gMDsKLQlyZXR2YWwtPm51bV9sb2NrcyA9IDA7Ci0JcmV0dmFsLT5rX2hhbmRsZSA9IE5VTEw7Ci0KLQlJTklUX0xJU1RfSEVBRCgmcmV0dmFsLT5sb2Nrcyk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJldHZhbC0+aW5vZGVfbGlzdCk7Ci0JcmV0dmFsLT5qb3VybmFsID0gb3NiLT5qb3VybmFsOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQogLyogcGFzcyBpdCBOVUxMIGFuZCBpdCB3aWxsIGFsbG9jYXRlIGEgbmV3IGhhbmRsZSBvYmplY3QgZm9yIHlvdS4gIElmCiAgKiB5b3UgcGFzcyBpdCBhIGhhbmRsZSBob3dldmVyLCBpdCBtYXkgc3RpbGwgcmV0dXJuIGVycm9yLCBpbiB3aGljaAogICogY2FzZSBpdCBoYXMgZnJlZSdkIHRoZSBwYXNzZWQgaGFuZGxlIGZvciB5b3UuICovCi1zdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKm9jZnMyX3N0YXJ0X3RyYW5zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCi0JCQkJCSAgICAgICBpbnQgbWF4X2J1ZmZzKQoraGFuZGxlX3QgKm9jZnMyX3N0YXJ0X3RyYW5zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBpbnQgbWF4X2J1ZmZzKQogewotCWludCByZXQ7CiAJam91cm5hbF90ICpqb3VybmFsID0gb3NiLT5qb3VybmFsLT5qX2pvdXJuYWw7Ci0KLQltbG9nX2VudHJ5KCIobWF4X2J1ZmZzID0gJWQpXG4iLCBtYXhfYnVmZnMpOworCWhhbmRsZV90ICpoYW5kbGU7CiAKIAlCVUdfT04oIW9zYiB8fCAhb3NiLT5qb3VybmFsLT5qX2pvdXJuYWwpOwogCi0JaWYgKG9jZnMyX2lzX2hhcmRfcmVhZG9ubHkob3NiKSkgewotCQlyZXQgPSAtRVJPRlM7Ci0JCWdvdG8gZG9uZV9mcmVlOwotCX0KKwlpZiAob2NmczJfaXNfaGFyZF9yZWFkb25seShvc2IpKQorCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOwogCiAJQlVHX09OKG9zYi0+am91cm5hbC0+al9zdGF0ZSA9PSBPQ0ZTMl9KT1VSTkFMX0ZSRUUpOwogCUJVR19PTihtYXhfYnVmZnMgPD0gMCk7CkBAIC0xNjMsMTU0ICsxMzIsNDEgQEAKIAkJQlVHKCk7CiAJfQogCi0JaWYgKCFoYW5kbGUpCi0JCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmICghaGFuZGxlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCW1sb2coTUxfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBqb3VybmFsICIKLQkJICAgICAiaGFuZGxlIVxuIik7Ci0JCWdvdG8gZG9uZV9mcmVlOwotCX0KLQotCWhhbmRsZS0+bWF4X2J1ZmZzID0gbWF4X2J1ZmZzOwotCiAJZG93bl9yZWFkKCZvc2ItPmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CiAKLQkvKiBhY3R1YWxseSBzdGFydCB0aGUgdHJhbnNhY3Rpb24gbm93ICovCi0JaGFuZGxlLT5rX2hhbmRsZSA9IGpvdXJuYWxfc3RhcnQoam91cm5hbCwgbWF4X2J1ZmZzKTsKLQlpZiAoSVNfRVJSKGhhbmRsZS0+a19oYW5kbGUpKSB7CisJaGFuZGxlID0gam91cm5hbF9zdGFydChqb3VybmFsLCBtYXhfYnVmZnMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQl1cF9yZWFkKCZvc2ItPmpvdXJuYWwtPmpfdHJhbnNfYmFycmllcik7CiAKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUtPmtfaGFuZGxlKTsKLQkJaGFuZGxlLT5rX2hhbmRsZSA9IE5VTEw7Ci0JCW1sb2dfZXJybm8ocmV0KTsKKwkJbWxvZ19lcnJubyhQVFJfRVJSKGhhbmRsZSkpOwogCiAJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKIAkJCW9jZnMyX2Fib3J0KG9zYi0+c2IsICJEZXRlY3RlZCBhYm9ydGVkIGpvdXJuYWwiKTsKLQkJCXJldCA9IC1FUk9GUzsKKwkJCWhhbmRsZSA9IEVSUl9QVFIoLUVST0ZTKTsKIAkJfQotCQlnb3RvIGRvbmVfZnJlZTsKKwl9IGVsc2UgeworCQlpZiAoIW9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCQlhdG9taWNfaW5jKCYob3NiLT5qb3VybmFsLT5qX251bV90cmFucykpOwogCX0KIAotCWF0b21pY19pbmMoJihvc2ItPmpvdXJuYWwtPmpfbnVtX3RyYW5zKSk7Ci0JaGFuZGxlLT5mbGFncyB8PSBPQ0ZTMl9IQU5ETEVfU1RBUlRFRDsKLQotCW1sb2dfZXhpdF9wdHIoaGFuZGxlKTsKIAlyZXR1cm4gaGFuZGxlOwotCi1kb25lX2ZyZWU6Ci0JaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3Vuc3RhcnRlZF9oYW5kbGUoaGFuZGxlKTsgLyogd2lsbCBrZnJlZSBoYW5kbGUgKi8KLQotCW1sb2dfZXhpdChyZXQpOwotCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKLXZvaWQgb2NmczJfaGFuZGxlX2FkZF9pbm9kZShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoraW50IG9jZnMyX2NvbW1pdF90cmFucyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUpCiB7Ci0JQlVHX09OKCFoYW5kbGUpOwotCUJVR19PTighaW5vZGUpOwotCi0JYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOwotCi0JLyogd2UncmUgb2J2aW91c2x5IGNoYW5naW5nIGl0Li4uICovCi0JbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JQlVHX09OKE9DRlMyX0koaW5vZGUpLT5pcF9oYW5kbGUpOwotCUJVR19PTighbGlzdF9lbXB0eSgmT0NGUzJfSShpbm9kZSktPmlwX2hhbmRsZV9saXN0KSk7Ci0KLQlPQ0ZTMl9JKGlub2RlKS0+aXBfaGFuZGxlID0gaGFuZGxlOwotCWxpc3RfbW92ZV90YWlsKCYoT0NGUzJfSShpbm9kZSktPmlwX2hhbmRsZV9saXN0KSwgJihoYW5kbGUtPmlub2RlX2xpc3QpKTsKLX0KLQotc3RhdGljIHZvaWQgb2NmczJfaGFuZGxlX3VubG9ja19pbm9kZXMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2k7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmhhbmRsZS0+aW5vZGVfbGlzdCkgewotCQlvaSA9IGxpc3RfZW50cnkocCwgc3RydWN0IG9jZnMyX2lub2RlX2luZm8sCi0JCQkJaXBfaGFuZGxlX2xpc3QpOwotCQlpbm9kZSA9ICZvaS0+dmZzX2lub2RlOwotCi0JCU9DRlMyX0koaW5vZGUpLT5pcF9oYW5kbGUgPSBOVUxMOwotCQlsaXN0X2RlbF9pbml0KCZPQ0ZTMl9JKGlub2RlKS0+aXBfaGFuZGxlX2xpc3QpOwotCi0JCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQlpcHV0KGlub2RlKTsKLQl9Ci19Ci0KLS8qIFRoaXMgaXMgdHJpdmlhbCBzbyB3ZSBkbyBpdCBvdXQgb2YgdGhlIG1haW4gY29tbWl0Ci0gKiBwYXRocy4gQmV3YXJlLCBpdCBjYW4gYmUgY2FsbGVkIGZyb20gc3RhcnRfdHJhbnMgdG9vISAqLwotc3RhdGljIHZvaWQgb2NmczJfY29tbWl0X3Vuc3RhcnRlZF9oYW5kbGUoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUpCi17Ci0JbWxvZ19lbnRyeV92b2lkKCk7Ci0KLQlCVUdfT04oaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TVEFSVEVEKTsKLQotCW9jZnMyX2hhbmRsZV91bmxvY2tfaW5vZGVzKGhhbmRsZSk7Ci0JLyogWW91IGFyZSBhbGxvd2VkIHRvIGFkZCBqb3VybmFsIGxvY2tzIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24KLQkgKiBoYXMgc3RhcnRlZC4gKi8KLQlvY2ZzMl9oYW5kbGVfY2xlYW51cF9sb2NrcyhoYW5kbGUtPmpvdXJuYWwsIGhhbmRsZSk7Ci0KLQlrZnJlZShoYW5kbGUpOwotCi0JbWxvZ19leGl0X3ZvaWQoKTsKLX0KLQotdm9pZCBvY2ZzMl9jb21taXRfdHJhbnMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUpCi17Ci0JaGFuZGxlX3QgKmpiZF9oYW5kbGU7Ci0JaW50IHJldHZhbDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbCAqam91cm5hbCA9IGhhbmRsZS0+am91cm5hbDsKLQotCW1sb2dfZW50cnlfdm9pZCgpOworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX2pvdXJuYWwgKmpvdXJuYWwgPSBvc2ItPmpvdXJuYWw7CiAKIAlCVUdfT04oIWhhbmRsZSk7CiAKLQlpZiAoIShoYW5kbGUtPmZsYWdzICYgT0NGUzJfSEFORExFX1NUQVJURUQpKSB7Ci0JCW9jZnMyX2NvbW1pdF91bnN0YXJ0ZWRfaGFuZGxlKGhhbmRsZSk7Ci0JCW1sb2dfZXhpdF92b2lkKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiByZWxlYXNlIGlub2RlIHNlbWFwaG9yZXMgd2UgdG9vayBkdXJpbmcgdGhpcyB0cmFuc2FjdGlvbiAqLwotCW9jZnMyX2hhbmRsZV91bmxvY2tfaW5vZGVzKGhhbmRsZSk7Ci0KLQkvKiBvY2ZzMl9leHRlbmRfdHJhbnMgbWF5IGhhdmUgaGFkIHRvIGNhbGwgam91cm5hbF9yZXN0YXJ0Ci0JICogd2hpY2ggd2lsbCBhbHdheXMgY29tbWl0IHRoZSB0cmFuc2FjdGlvbiwgYnV0IG1heSByZXR1cm4KLQkgKiBlcnJvciBmb3IgYW55IG51bWJlciBvZiByZWFzb25zLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZQotCSAqIGNsZWFyIGtfaGFuZGxlIGFzIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlLiAqLwotCWlmIChoYW5kbGUtPmtfaGFuZGxlKSB7Ci0JCWpiZF9oYW5kbGUgPSBoYW5kbGUtPmtfaGFuZGxlOwotCi0JCWlmIChoYW5kbGUtPmZsYWdzICYgT0NGUzJfSEFORExFX1NZTkMpCi0JCQlqYmRfaGFuZGxlLT5oX3N5bmMgPSAxOwotCQllbHNlCi0JCQlqYmRfaGFuZGxlLT5oX3N5bmMgPSAwOwotCi0JCS8qIGFjdHVhbGx5IHN0b3AgdGhlIHRyYW5zYWN0aW9uLiBpZiB3ZSd2ZSBzZXQgaF9zeW5jLAotCQkgKiBpdCdsbCBoYXZlIGJlZW4gY29tbWl0dGVkIHdoZW4gd2UgcmV0dXJuICovCi0JCXJldHZhbCA9IGpvdXJuYWxfc3RvcChqYmRfaGFuZGxlKTsKLQkJaWYgKHJldHZhbCA8IDApIHsKLQkJCW1sb2dfZXJybm8ocmV0dmFsKTsKLQkJCW1sb2coTUxfRVJST1IsICJDb3VsZCBub3QgY29tbWl0IHRyYW5zYWN0aW9uXG4iKTsKLQkJCUJVRygpOwotCQl9Ci0KLQkJaGFuZGxlLT5rX2hhbmRsZSA9IE5VTEw7IC8qIGl0J3MgYmVlbiBmcmVlJ2QgaW4gam91cm5hbF9zdG9wICovCi0JfQotCi0Jb2NmczJfaGFuZGxlX2NsZWFudXBfbG9ja3Moam91cm5hbCwgaGFuZGxlKTsKKwlyZXQgPSBqb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJbWxvZ19lcnJubyhyZXQpOwogCiAJdXBfcmVhZCgmam91cm5hbC0+al90cmFuc19iYXJyaWVyKTsKIAotCWtmcmVlKGhhbmRsZSk7Ci0JbWxvZ19leGl0X3ZvaWQoKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMzI2LDIwICsxODIsMTggQEAKICAqIGdvb2QgYmVjYXVzZSB0cmFuc2FjdGlvbiBpZHMgaGF2ZW4ndCB5ZXQgYmVlbiByZWNvcmRlZCBvbiB0aGUKICAqIGNsdXN0ZXIgbG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlLgogICovCi1pbnQgb2NmczJfZXh0ZW5kX3RyYW5zKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAotCQkgICAgICAgaW50IG5ibG9ja3MpCitpbnQgb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZV90ICpoYW5kbGUsIGludCBuYmxvY2tzKQogewogCWludCBzdGF0dXM7CiAKIAlCVUdfT04oIWhhbmRsZSk7Ci0JQlVHX09OKCEoaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TVEFSVEVEKSk7CiAJQlVHX09OKCFuYmxvY2tzKTsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCiAJbWxvZygwLCAiVHJ5aW5nIHRvIGV4dGVuZCB0cmFuc2FjdGlvbiBieSAlZCBibG9ja3NcbiIsIG5ibG9ja3MpOwogCi0Jc3RhdHVzID0gam91cm5hbF9leHRlbmQoaGFuZGxlLT5rX2hhbmRsZSwgbmJsb2Nrcyk7CisJc3RhdHVzID0gam91cm5hbF9leHRlbmQoaGFuZGxlLCBuYmxvY2tzKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTM0NywxNSArMjAxLDEyIEBACiAKIAlpZiAoc3RhdHVzID4gMCkgewogCQltbG9nKDAsICJqb3VybmFsX2V4dGVuZCBmYWlsZWQsIHRyeWluZyBqb3VybmFsX3Jlc3RhcnRcbiIpOwotCQlzdGF0dXMgPSBqb3VybmFsX3Jlc3RhcnQoaGFuZGxlLT5rX2hhbmRsZSwgbmJsb2Nrcyk7CisJCXN0YXR1cyA9IGpvdXJuYWxfcmVzdGFydChoYW5kbGUsIG5ibG9ja3MpOwogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJaGFuZGxlLT5rX2hhbmRsZSA9IE5VTEw7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KLQkJaGFuZGxlLT5tYXhfYnVmZnMgPSBuYmxvY2tzOwotCX0gZWxzZQotCQloYW5kbGUtPm1heF9idWZmcyArPSBuYmxvY2tzOworCX0KIAogCXN0YXR1cyA9IDA7CiBiYWlsOgpAQCAtMzY0LDcgKzIxNSw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJIGludCB0eXBlKQpAQCAtMzc0LDcgKzIyNSw2IEBACiAJQlVHX09OKCFpbm9kZSk7CiAJQlVHX09OKCFoYW5kbGUpOwogCUJVR19PTighYmgpOwotCUJVR19PTighKGhhbmRsZS0+ZmxhZ3MgJiBPQ0ZTMl9IQU5ETEVfU1RBUlRFRCkpOwogCiAJbWxvZ19lbnRyeSgiYmgtPmJfYmxvY2tucj0lbGx1LCB0eXBlPSVkIChcIiVzXCIpLCBiaC0+Yl9zaXplID0gJXp1XG4iLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIHR5cGUsCkBAIC00MDMsMTEgKzI1MywxMSBAQAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFOgogCWNhc2UgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEU6Ci0JCXN0YXR1cyA9IGpvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUtPmtfaGFuZGxlLCBiaCk7CisJCXN0YXR1cyA9IGpvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKIAkJYnJlYWs7CiAKIAljYXNlIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1VORE86Ci0JCXN0YXR1cyA9IGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZS0+a19oYW5kbGUsIGJoKTsKKwkJc3RhdHVzID0gam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTQyNCwxNyArMjc0LDE1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IG9jZnMyX2pvdXJuYWxfZGlydHkoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitpbnQgb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlpbnQgc3RhdHVzOwogCi0JQlVHX09OKCEoaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TVEFSVEVEKSk7Ci0KIAltbG9nX2VudHJ5KCIoYmgtPmJfYmxvY2tucj0lbGx1KVxuIiwKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKIAotCXN0YXR1cyA9IGpvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLT5rX2hhbmRsZSwgYmgpOworCXN0YXR1cyA9IGpvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2coTUxfRVJST1IsICJDb3VsZCBub3QgZGlydHkgbWV0YWRhdGEgYnVmZmVyLiAiCiAJCSAgICAgIihiaC0+Yl9ibG9ja25yPSVsbHUpXG4iLApAQCAtNDU2LDU5ICszMDQsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIFdlIGFsd2F5cyBhc3N1bWUgeW91J3JlIGFkZGluZyBhIG1ldGFkYXRhIGxvY2sgYXQgbGV2ZWwgJ2V4JyAqLwotaW50IG9jZnMyX2hhbmRsZV9hZGRfbG9jayhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKLQkJCSAgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2xvY2sgKmxvY2s7Ci0KLQlCVUdfT04oIWlub2RlKTsKLQotCWxvY2sgPSBrbWVtX2NhY2hlX2FsbG9jKG9jZnMyX2xvY2tfY2FjaGUsIEdGUF9OT0ZTKTsKLQlpZiAoIWxvY2spIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubygtRU5PTUVNKTsKLQkJZ290byBiYWlsOwotCX0KLQotCWlmICghaWdyYWIoaW5vZGUpKQotCQlCVUcoKTsKLQlsb2NrLT5qbF9pbm9kZSA9IGlub2RlOwotCi0JbGlzdF9hZGRfdGFpbCgmKGxvY2stPmpsX2xvY2tfbGlzdCksICYoaGFuZGxlLT5sb2NrcykpOwotCWhhbmRsZS0+bnVtX2xvY2tzKys7Ci0KLQlzdGF0dXMgPSAwOwotYmFpbDoKLQltbG9nX2V4aXQoc3RhdHVzKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBvY2ZzMl9oYW5kbGVfY2xlYW51cF9sb2NrcyhzdHJ1Y3Qgb2NmczJfam91cm5hbCAqam91cm5hbCwKLQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfbG9jayAqbG9jazsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICYoaGFuZGxlLT5sb2NrcykpIHsKLQkJbG9jayA9IGxpc3RfZW50cnkocCwgc3RydWN0IG9jZnMyX2pvdXJuYWxfbG9jaywKLQkJCQkgIGpsX2xvY2tfbGlzdCk7Ci0JCWxpc3RfZGVsKCZsb2NrLT5qbF9sb2NrX2xpc3QpOwotCQloYW5kbGUtPm51bV9sb2Nrcy0tOwotCi0JCWlub2RlID0gbG9jay0+amxfaW5vZGU7Ci0JCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKLQkJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPT0gMSkKLQkJCW1sb2coTUxfRVJST1IsCi0JCQkgICAgICJJbm9kZSAlbGx1LCBJJ20gZG9pbmcgYSBsYXN0IGlwdXQgZm9yISIsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQkJaXB1dChpbm9kZSk7Ci0JCWttZW1fY2FjaGVfZnJlZShvY2ZzMl9sb2NrX2NhY2hlLCBsb2NrKTsKLQl9Ci19Ci0KICNkZWZpbmUgT0NGUzJfREVGQVVMVF9DT01NSVRfSU5URVJWQUwgCShIWiAqIDUpCiAKIHZvaWQgb2NmczJfc2V0X2pvdXJuYWxfcGFyYW1zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQpAQCAtNTYyLDggKzM1Nyw3IEBACiAJLyogU2tpcCByZWNvdmVyeSB3YWl0cyBoZXJlIC0gam91cm5hbCBpbm9kZSBtZXRhZGF0YSBuZXZlcgogCSAqIGNoYW5nZXMgaW4gYSBsaXZlIGNsdXN0ZXIgc28gaXQgY2FuIGJlIGNvbnNpZGVyZWQgYW4KIAkgKiBleGNlcHRpb24gdG8gdGhlIHJ1bGUuICovCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrX2Z1bGwoaW5vZGUsIE5VTEwsICZiaCwgMSwKLQkJCQkgICAgICBPQ0ZTMl9NRVRBX0xPQ0tfUkVDT1ZFUlkpOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9ja19mdWxsKGlub2RlLCAmYmgsIDEsIE9DRlMyX01FVEFfTE9DS19SRUNPVkVSWSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyAhPSAtRVJFU1RBUlRTWVMpCiAJCQltbG9nKE1MX0VSUk9SLCAiQ291bGQgbm90IGdldCBsb2NrIG9uIGpvdXJuYWwhXG4iKTsKQEAgLTcxNSw5ICs1MDksMjMgQEAKIAogCUJVR19PTihhdG9taWNfcmVhZCgmKG9zYi0+am91cm5hbC0+al9udW1fdHJhbnMpKSAhPSAwKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfdG9nZ2xlX2RpcnR5KG9zYiwgMCk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCW1sb2dfZXJybm8oc3RhdHVzKTsKKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkgeworCQlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsLT5qX2pvdXJuYWwpOworCQlzdGF0dXMgPSBqb3VybmFsX2ZsdXNoKGpvdXJuYWwtPmpfam91cm5hbCk7CisJCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbC0+al9qb3VybmFsKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCS8qCisJCSAqIERvIG5vdCB0b2dnbGUgaWYgZmx1c2ggd2FzIHVuc3VjY2Vzc2Z1bCBvdGhlcndpc2UKKwkJICogd2lsbCBsZWF2ZSBkaXJ0eSBtZXRhZGF0YSBpbiBhICJjbGVhbiIgam91cm5hbAorCQkgKi8KKwkJc3RhdHVzID0gb2NmczJfam91cm5hbF90b2dnbGVfZGlydHkob3NiLCAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJfQogCiAJLyogU2h1dGRvd24gdGhlIGtlcm5lbCBqb3VybmFsIHN5c3RlbSAqLwogCWpvdXJuYWxfZGVzdHJveShqb3VybmFsLT5qX2pvdXJuYWwpOwpAQCAtNzU3LDcgKzU2NSw3IEBACiAJfQogfQogCi1pbnQgb2NmczJfam91cm5hbF9sb2FkKHN0cnVjdCBvY2ZzMl9qb3VybmFsICpqb3VybmFsKQoraW50IG9jZnMyX2pvdXJuYWxfbG9hZChzdHJ1Y3Qgb2NmczJfam91cm5hbCAqam91cm5hbCwgaW50IGxvY2FsKQogewogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiOwpAQCAtNzg0LDE0ICs1OTIsMTggQEAKIAl9CiAKIAkvKiBMYXVuY2ggdGhlIGNvbW1pdCB0aHJlYWQgKi8KLQlvc2ItPmNvbW1pdF90YXNrID0ga3RocmVhZF9ydW4ob2NmczJfY29tbWl0X3RocmVhZCwgb3NiLCAib2NmczJjbXQiKTsKLQlpZiAoSVNfRVJSKG9zYi0+Y29tbWl0X3Rhc2spKSB7Ci0JCXN0YXR1cyA9IFBUUl9FUlIob3NiLT5jb21taXRfdGFzayk7CisJaWYgKCFsb2NhbCkgeworCQlvc2ItPmNvbW1pdF90YXNrID0ga3RocmVhZF9ydW4ob2NmczJfY29tbWl0X3RocmVhZCwgb3NiLAorCQkJCQkgICAgICAgIm9jZnMyY210Iik7CisJCWlmIChJU19FUlIob3NiLT5jb21taXRfdGFzaykpIHsKKwkJCXN0YXR1cyA9IFBUUl9FUlIob3NiLT5jb21taXRfdGFzayk7CisJCQlvc2ItPmNvbW1pdF90YXNrID0gTlVMTDsKKwkJCW1sb2coTUxfRVJST1IsICJ1bmFibGUgdG8gbGF1bmNoIG9jZnMyY29tbWl0IHRocmVhZCwgIgorCQkJICAgICAiZXJyb3I9JWQiLCBzdGF0dXMpOworCQkJZ290byBkb25lOworCQl9CisJfSBlbHNlCiAJCW9zYi0+Y29tbWl0X3Rhc2sgPSBOVUxMOwotCQltbG9nKE1MX0VSUk9SLCAidW5hYmxlIHRvIGxhdW5jaCBvY2ZzMmNvbW1pdCB0aHJlYWQsIGVycm9yPSVkIiwKLQkJICAgICBzdGF0dXMpOwotCQlnb3RvIGRvbmU7Ci0JfQogCiBkb25lOgogCW1sb2dfZXhpdChzdGF0dXMpOwpAQCAtOTExLDExICs3MjMsMTIgQEAKICAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gY2FuIGFuZCB3aWxsIHNsZWVwIG9uIHJlY292ZXJ5IG9mIG90aGVyIG5vZGVzCiAgKiBkdXJpbmcgY2x1c3RlciBsb2NraW5nLCBqdXN0IGxpa2UgYW55IG90aGVyIG9jZnMyIHByb2Nlc3MuCiAgKi8KLXZvaWQgb2NmczJfY29tcGxldGVfcmVjb3Zlcnkodm9pZCAqZGF0YSkKK3ZvaWQgb2NmczJfY29tcGxldGVfcmVjb3Zlcnkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCByZXQ7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBkYXRhOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsICpqb3VybmFsID0gb3NiLT5qb3VybmFsOworCXN0cnVjdCBvY2ZzMl9qb3VybmFsICpqb3VybmFsID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvY2ZzMl9qb3VybmFsLCBqX3JlY292ZXJ5X3dvcmspOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gam91cm5hbC0+al9vc2I7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqbGFfZGlub2RlLCAqdGxfZGlub2RlOwogCXN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtICppdGVtOwogCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOwpAQCAtMTE2MCw4ICs5NzMsNyBAQAogCX0KIAlTRVRfSU5PREVfSk9VUk5BTChpbm9kZSk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2tfZnVsbChpbm9kZSwgTlVMTCwgJmJoLCAxLAotCQkJCSAgICAgIE9DRlMyX01FVEFfTE9DS19SRUNPVkVSWSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrX2Z1bGwoaW5vZGUsICZiaCwgMSwgT0NGUzJfTUVUQV9MT0NLX1JFQ09WRVJZKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nKDAsICJzdGF0dXMgcmV0dXJuZWQgZnJvbSBvY2ZzMl9tZXRhX2xvY2s9JWRcbiIsIHN0YXR1cyk7CiAJCWlmIChzdGF0dXMgIT0gLUVSRVNUQVJUU1lTKQpAQCAtMTM1MCw3ICsxMTYyLDcgQEAKIAlTRVRfSU5PREVfSk9VUk5BTChpbm9kZSk7CiAKIAlmbGFncyA9IE9DRlMyX01FVEFfTE9DS19SRUNPVkVSWSB8IE9DRlMyX01FVEFfTE9DS19OT1FVRVVFOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9ja19mdWxsKGlub2RlLCBOVUxMLCBOVUxMLCAxLCBmbGFncyk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrX2Z1bGwoaW5vZGUsIE5VTEwsIDEsIGZsYWdzKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FQUdBSU4pCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xNDMzLDcgKzEyNDUsNyBAQAogCX0JCiAKIAltdXRleF9sb2NrKCZvcnBoYW5fZGlyX2lub2RlLT5pX211dGV4KTsKLQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2sob3JwaGFuX2Rpcl9pbm9kZSwgTlVMTCwgTlVMTCwgMCk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9ycGhhbl9kaXJfaW5vZGUsIE5VTEwsIDApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9qb3VybmFsLmggYi9mcy9vY2ZzMi9qb3VybmFsLmgKaW5kZXggMmYzYTZhYy4uZTEyMTYzNiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvam91cm5hbC5oCisrKyBiL2ZzL29jZnMyL2pvdXJuYWwuaApAQCAtMzcsNyArMzcsNiBAQAogCiBzdHJ1Y3Qgb2NmczJfc3VwZXI7CiBzdHJ1Y3Qgb2NmczJfZGlub2RlOwotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlOwogCiBzdHJ1Y3Qgb2NmczJfam91cm5hbCB7CiAJZW51bSBvY2ZzMl9qb3VybmFsX3N0YXRlICAgal9zdGF0ZTsgICAgLyogSm91cm5hbHMgY3VycmVudCBzdGF0ZSAgICovCkBAIC0xMzMsNDYgKzEzMiw4IEBACiAJc3Bpbl91bmxvY2soJnRyYW5zX2luY19sb2NrKTsKIH0KIAotZXh0ZXJuIGttZW1fY2FjaGVfdCAqb2NmczJfbG9ja19jYWNoZTsKLQotc3RydWN0IG9jZnMyX2pvdXJuYWxfbG9jayB7Ci0Jc3RydWN0IGlub2RlICAgICAqamxfaW5vZGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgamxfbG9ja19saXN0OwotfTsKLQotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlIHsKLQloYW5kbGVfdCAgICAgICAgICAgICprX2hhbmRsZTsgLyoga2VybmVsIGhhbmRsZS4gICAgICAgICAgICAgICAgKi8KLQlzdHJ1Y3Qgb2NmczJfam91cm5hbCAgICAgICAgKmpvdXJuYWw7Ci0JdTMyICAgICAgICAgICAgICAgICBmbGFnczsgICAgIC8qIHNlZSBmbGFncyBiZWxvdy4gICAgICAgICAgICAgICovCi0JaW50ICAgICAgICAgICAgICAgICBtYXhfYnVmZnM7IC8qIEJ1ZmZzIHJlc2VydmVkIGJ5IHRoaXMgaGFuZGxlICovCi0KLQkvKiBUaGUgZm9sbG93aW5nIHR3byBmaWVsZHMgYXJlIGZvciBvY2ZzMl9oYW5kbGVfYWRkX2xvY2sgKi8KLQlpbnQgICAgICAgICAgICAgICAgIG51bV9sb2NrczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgIGxvY2tzOyAgICAgLyogQSBidW5jaCBvZiBsb2NrcyB0bwotCQkJCQkqIHJlbGVhc2Ugb24gY29tbWl0LiBUaGlzCi0JCQkJCSogc2hvdWxkIGJlIGEgbGlzdF9oZWFkICovCi0KLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICBpbm9kZV9saXN0OwotfTsKLQotI2RlZmluZSBPQ0ZTMl9IQU5ETEVfU1RBUlRFRAkJCTEKLS8qIHNob3VsZCB3ZSBzeW5jLWNvbW1pdCB0aGlzIGhhbmRsZT8gKi8KLSNkZWZpbmUgT0NGUzJfSEFORExFX1NZTkMJCQkyCi1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9oYW5kbGVfc3RhcnRlZChzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSkKLXsKLQlyZXR1cm4gaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TVEFSVEVEOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfaGFuZGxlX3NldF9zeW5jKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLCBpbnQgc3luYykKLXsKLQlpZiAoc3luYykKLQkJaGFuZGxlLT5mbGFncyB8PSBPQ0ZTMl9IQU5ETEVfU1lOQzsKLQllbHNlCi0JCWhhbmRsZS0+ZmxhZ3MgJj0gfk9DRlMyX0hBTkRMRV9TWU5DOwotfQotCiAvKiBFeHBvcnRlZCBvbmx5IGZvciB0aGUgam91cm5hbCBzdHJ1Y3QgaW5pdCBjb2RlIGluIHN1cGVyLmMuIERvIG5vdCBjYWxsLiAqLwotdm9pZCBvY2ZzMl9jb21wbGV0ZV9yZWNvdmVyeSh2b2lkICpkYXRhKTsKK3ZvaWQgb2NmczJfY29tcGxldGVfcmVjb3Zlcnkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyoKICAqICBKb3VybmFsIENvbnRyb2w6CkBAIC0xOTYsNyArMTU3LDcgQEAKIHZvaWQgICBvY2ZzMl9qb3VybmFsX3NodXRkb3duKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKTsKIGludCAgICBvY2ZzMl9qb3VybmFsX3dpcGUoc3RydWN0IG9jZnMyX2pvdXJuYWwgKmpvdXJuYWwsCiAJCQkgIGludCBmdWxsKTsKLWludCAgICBvY2ZzMl9qb3VybmFsX2xvYWQoc3RydWN0IG9jZnMyX2pvdXJuYWwgKmpvdXJuYWwpOworaW50ICAgIG9jZnMyX2pvdXJuYWxfbG9hZChzdHJ1Y3Qgb2NmczJfam91cm5hbCAqam91cm5hbCwgaW50IGxvY2FsKTsKIGludCAgICBvY2ZzMl9jaGVja19qb3VybmFsc19ub2xvY2tzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKTsKIHZvaWQgICBvY2ZzMl9yZWNvdmVyeV90aHJlYWQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICAgIGludCBub2RlX251bSk7CkBAIC0yMTMsNiArMTc0LDkgQEAKIHsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAorCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlyZXR1cm47CisKIAlpZiAoIW9jZnMyX2lub2RlX2Z1bGx5X2NoZWNrcG9pbnRlZChpbm9kZSkpIHsKIAkJLyogV0FSTklORzogVGhpcyBvbmx5IGtpY2tzIG9mZiBhIHNpbmdsZQogCQkgKiBjaGVja3BvaW50LiBJZiBzb21lb25lIHJhY2VzIHlvdSBhbmQgYWRkcyBtb3JlCkBAIC0yMzEsMTUgKzE5NSwxNCBAQAogICogIFRyYW5zYWN0aW9uIEhhbmRsaW5nOgogICogIE1hbmFnZSB0aGUgbGlmZXRpbWUgb2YgYSB0cmFuc2FjdGlvbiBoYW5kbGUuCiAgKgotICogIG9jZnMyX2FsbG9jX2hhbmRsZSAgICAgLSBPbmx5IGFsbG9jYXRlIGEgaGFuZGxlIHNvIHdlIGNhbiBzdGFydCBwdXR0aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciBsb2NrcyBvbiBpdC4gVG8gYWN0dWFsbHkgY2hhbmdlIGJsb2NrcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIG9jZnMyX3N0YXJ0X3RyYW5zIHdpdGggdGhlIGhhbmRsZSByZXR1cm5lZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhpcyBmdW5jdGlvbi4gWW91IG1heSBjYWxsIG9jZnMyX2NvbW1pdF90cmFucwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhdCBhbnkgdGltZSBpbiB0aGUgbGlmZXRpbWUgb2YgYSBoYW5kbGUuCiAgKiAgb2NmczJfc3RhcnRfdHJhbnMgICAgICAtIEJlZ2luIGEgdHJhbnNhY3Rpb24uIEdpdmUgaXQgYW4gdXBwZXIgZXN0aW1hdGUgb2YKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHdpbGwgYmUgY2hhbmdlZCBkdXJpbmcKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGhhbmRsZS4KLSAqICBvY2ZzMl9jb21taXRfdHJhbnMgICAgIC0gQ29tcGxldGUgYSBoYW5kbGUuCisgKiAgb2NmczJfY29tbWl0X3RyYW5zIC0gQ29tcGxldGUgYSBoYW5kbGUuIEl0IG1pZ2h0IHJldHVybiAtRUlPIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGpvdXJuYWwgd2FzIGFib3J0ZWQuIFRoZSBtYWpvcml0eSBvZiBwYXRocyBkb24ndAorICogICAgICAgICAgICAgICAgICAgICAgIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYXMgYW4gZXJyb3IgdGhlcmUgY29tZXMgdG9vCisgKiAgICAgICAgICAgICAgICAgICAgICAgbGF0ZSB0byBkbyBhbnl0aGluZyAoYW5kIHdpbGwgYmUgcGlja2VkIHVwIGluIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICBsYXRlciB0cmFuc2FjdGlvbikuCiAgKiAgb2NmczJfZXh0ZW5kX3RyYW5zICAgICAtIEV4dGVuZCBhIGhhbmRsZSBieSBuYmxvY2tzIGNyZWRpdHMuIFRoaXMgbWF5CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0IHRoZSBoYW5kbGUgdG8gZGlzayBpbiB0aGUgcHJvY2VzcywgYnV0IHdpbGwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcmVsZWFzZSBhbnkgbG9ja3MgdGFrZW4gZHVyaW5nIHRoZSB0cmFuc2FjdGlvbi4KQEAgLTI0OSwyNCArMjEyLDE2IEBACiAgKiAgb2NmczJfam91cm5hbF9kaXJ0eSAgICAtIE1hcmsgYSBqb3VybmFsbGVkIGJ1ZmZlciBhcyBoYXZpbmcgZGlydHkgZGF0YS4KICAqICBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEgLSBJbmRpY2F0ZSB0aGF0IGEgZGF0YSBidWZmZXIgc2hvdWxkIGdvIG91dCBiZWZvcmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBoYW5kbGUgY29tbWl0cy4KLSAqICBvY2ZzMl9oYW5kbGVfYWRkX2xvY2sgIC0gU29tZXRpbWVzIHdlIG5lZWQgdG8gZGVsYXkgbG9jayByZWxlYXNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuIFVzZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9jZnMyX2hhbmRsZV9hZGRfbG9jayB0byBpbmRpY2F0ZSB0aGF0IGEgbG9jayBuZWVkcwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbGVhc2VkIGF0IHRoZSBlbmQgb2YgdGhhdCBoYW5kbGUuIExvY2tzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZWxlYXNlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSBhZGRlZC4KLSAqICBvY2ZzMl9oYW5kbGVfYWRkX2lub2RlIC0gQWRkIGEgbG9ja2VkIGlub2RlIHRvIGEgdHJhbnNhY3Rpb24uCiAgKi8KIAogLyogWW91IG11c3QgYWx3YXlzIHN0YXJ0X3RyYW5zIHdpdGggYSBudW1iZXIgb2YgYnVmZnMgPiAwLCBidXQgaXQncwogICogcGVyZmVjdGx5IGxlZ2FsIHRvIGdvIHRocm91Z2ggYW4gZW50aXJlIHRyYW5zYWN0aW9uIHdpdGhvdXQgaGF2aW5nCiAgKiBkaXJ0aWVkIGFueSBidWZmZXJzLiAqLwotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpvY2ZzMl9hbGxvY19oYW5kbGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwotc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpvY2ZzMl9zdGFydF90cmFucyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraGFuZGxlX3QJCSAgICAqb2NmczJfc3RhcnRfdHJhbnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCSAgICAgICBpbnQgbWF4X2J1ZmZzKTsKLXZvaWQJCQkgICAgIG9jZnMyX2NvbW1pdF90cmFucyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSk7Ci1pbnQJCQkgICAgIG9jZnMyX2V4dGVuZF90cmFucyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKLQkJCQkJCWludCBuYmxvY2tzKTsKK2ludAkJCSAgICAgb2NmczJfY29tbWl0X3RyYW5zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCQkJaGFuZGxlX3QgKmhhbmRsZSk7CitpbnQJCQkgICAgIG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGVfdCAqaGFuZGxlLCBpbnQgbmJsb2Nrcyk7CiAKIC8qCiAgKiBDcmVhdGUgYWNjZXNzIGlzIGZvciB3aGVuIHdlIGdldCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIGFuZCB3ZSdyZQpAQCAtMjgzLDcgKzIzOCw3IEBACiAjZGVmaW5lIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFICAxCiAjZGVmaW5lIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1VORE8gICAyCiAKLWludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfYWNjZXNzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50ICAgICAgICAgICAgICAgICAgb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkJCSAgaW50IHR5cGUpOwpAQCAtMzA2LDE4ICsyNjEsMTAgQEAKICAqCTxtb2RpZnkgdGhlIGJoPgogICogCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CiAgKi8KLWludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfZGlydHkoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitpbnQgICAgICAgICAgICAgICAgICBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIGludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YShoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKLWludCAgICAgICAgICAgICAgICAgIG9jZnMyX2hhbmRsZV9hZGRfbG9jayhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKLQkJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSk7Ci0vKgotICogVXNlIHRoaXMgdG8gcHJvdGVjdCBmcm9tIG90aGVyIHByb2Nlc3NlcyByZWFkaW5nIGJ1ZmZlciBzdGF0ZSB3aGlsZQotICogaXQncyBpbiBmbGlnaHQuCi0gKi8KLXZvaWQgICAgICAgICAgICAgICAgIG9jZnMyX2hhbmRsZV9hZGRfaW5vZGUoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCi0JCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogLyoKICAqICBDcmVkaXQgTWFjcm9zOgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbG9jYWxhbGxvYy5jIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5jCmluZGV4IDFmMTdhNGQuLjRkZWRkOTcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuYworKysgYi9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKQEAgLTU4LDE5ICs1OCwxOCBAQAogc3RhdGljIHZvaWQgb2NmczJfY2xlYXJfbG9jYWxfYWxsb2Moc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2MpOwogCiBzdGF0aWMgaW50IG9jZnMyX3N5bmNfbG9jYWxfdG9fbWFpbihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmFsbG9jLAogCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKm1haW5fYm1faW5vZGUsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbWFpbl9ibV9iaCk7CiAKIHN0YXRpYyBpbnQgb2NmczJfbG9jYWxfYWxsb2NfcmVzZXJ2ZV9mb3Jfd2luZG93KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQkJc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCiAJCQkJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjLAogCQkJCQkJc3RydWN0IGlub2RlICoqYml0bWFwX2lub2RlLAogCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYml0bWFwX2JoKTsKIAogc3RhdGljIGludCBvY2ZzMl9sb2NhbF9hbGxvY19uZXdfd2luZG93KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKTsKIAogc3RhdGljIGludCBvY2ZzMl9sb2NhbF9hbGxvY19zbGlkZV93aW5kb3coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCkBAIC0xOTYsNyArMTk1LDcgQEAKIHZvaWQgb2NmczJfc2h1dGRvd25fbG9jYWxfYWxsb2Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJaW50IHN0YXR1czsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKmxvY2FsX2FsbG9jX2lub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1haW5fYm1fYmggPSBOVUxMOwpAQCAtMjA3LDcgKzIwNiw3IEBACiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKIAlpZiAob3NiLT5sb2NhbF9hbGxvY19zdGF0ZSA9PSBPQ0ZTMl9MQV9VTlVTRUQpCi0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAKIAlsb2NhbF9hbGxvY19pbm9kZSA9CiAJCW9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCkBAIC0yMTYsNDAgKzIxNSwzNCBAQAogCWlmICghbG9jYWxfYWxsb2NfaW5vZGUpIHsKIAkJc3RhdHVzID0gLUVOT0VOVDsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0OwogCX0KIAogCW9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgPSBPQ0ZTMl9MQV9ESVNBQkxFRDsKIAotCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmICghaGFuZGxlKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLQogCW1haW5fYm1faW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLAogCQkJCQkJICAgIEdMT0JBTF9CSVRNQVBfU1lTVEVNX0lOT0RFLAogCQkJCQkJICAgIE9DRlMyX0lOVkFMSURfU0xPVCk7CiAJaWYgKCFtYWluX2JtX2lub2RlKSB7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dDsKIAl9CiAKLQlvY2ZzMl9oYW5kbGVfYWRkX2lub2RlKGhhbmRsZSwgbWFpbl9ibV9pbm9kZSk7Ci0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG1haW5fYm1faW5vZGUsIGhhbmRsZSwgJm1haW5fYm1fYmgsIDEpOworCW11dGV4X2xvY2soJm1haW5fYm1faW5vZGUtPmlfbXV0ZXgpOworCisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG1haW5fYm1faW5vZGUsICZtYWluX2JtX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfbXV0ZXg7CiAJfQogCiAJLyogV0lORE9XX01PVkVfQ1JFRElUUyBpcyBhIGJpdCBoZWF2eS4uLiAqLwotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9XSU5ET1dfTU9WRV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1dJTkRPV19NT1ZFX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQltbG9nX2Vycm5vKFBUUl9FUlIoaGFuZGxlKSk7CiAJCWhhbmRsZSA9IE5VTEw7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWJoID0gb3NiLT5sb2NhbF9hbGxvY19iaDsKQEAgLTI1OCw3ICsyNTEsNyBAQAogCWFsbG9jX2NvcHkgPSBrbWFsbG9jKGJoLT5iX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghYWxsb2NfY29weSkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X2NvbW1pdDsKIAl9CiAJbWVtY3B5KGFsbG9jX2NvcHksIGFsbG9jLCBiaC0+Yl9zaXplKTsKIApAQCAtMjY2LDcgKzI1OSw3IEBACiAJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF9jb21taXQ7CiAJfQogCiAJb2NmczJfY2xlYXJfbG9jYWxfYWxsb2MoYWxsb2MpOwpAQCAtMjc0LDcgKzI2Nyw3IEBACiAJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXRfY29tbWl0OwogCX0KIAogCWJyZWxzZShiaCk7CkBAIC0yODYsMTYgKzI3OSwyMCBAQAogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKLWJhaWw6Ci0JaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKK291dF91bmxvY2s6CiAJaWYgKG1haW5fYm1fYmgpCiAJCWJyZWxzZShtYWluX2JtX2JoKTsKIAotCWlmIChtYWluX2JtX2lub2RlKQotCQlpcHV0KG1haW5fYm1faW5vZGUpOworCW9jZnMyX21ldGFfdW5sb2NrKG1haW5fYm1faW5vZGUsIDEpOwogCitvdXRfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZtYWluX2JtX2lub2RlLT5pX211dGV4KTsKKwlpcHV0KG1haW5fYm1faW5vZGUpOworCitvdXQ6CiAJaWYgKGxvY2FsX2FsbG9jX2lub2RlKQogCQlpcHV0KGxvY2FsX2FsbG9jX2lub2RlKTsKIApAQCAtMzg1LDYxICszODIsNTkgQEAKIAkJCQkJc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2MpCiB7CiAJaW50IHN0YXR1czsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1haW5fYm1fYmggPSBOVUxMOwotCXN0cnVjdCBpbm9kZSAqbWFpbl9ibV9pbm9kZSA9IE5VTEw7CisJc3RydWN0IGlub2RlICptYWluX2JtX2lub2RlOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoIWhhbmRsZSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KIAltYWluX2JtX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKIAkJCQkJCSAgICBHTE9CQUxfQklUTUFQX1NZU1RFTV9JTk9ERSwKIAkJCQkJCSAgICBPQ0ZTMl9JTlZBTElEX1NMT1QpOwogCWlmICghbWFpbl9ibV9pbm9kZSkgewogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAJfQogCi0Jb2NmczJfaGFuZGxlX2FkZF9pbm9kZShoYW5kbGUsIG1haW5fYm1faW5vZGUpOwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhtYWluX2JtX2lub2RlLCBoYW5kbGUsICZtYWluX2JtX2JoLCAxKTsKKwltdXRleF9sb2NrKCZtYWluX2JtX2lub2RlLT5pX211dGV4KTsKKworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhtYWluX2JtX2lub2RlLCAmbWFpbl9ibV9iaCwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X211dGV4OwogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9XSU5ET1dfTU9WRV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1dJTkRPV19NT1ZFX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJLyogd2Ugd2FudCB0aGUgYml0bWFwIGNoYW5nZSB0byBiZSByZWNvcmRlZCBvbiBkaXNrIGFzYXAgKi8KLQlvY2ZzMl9oYW5kbGVfc2V0X3N5bmMoaGFuZGxlLCAxKTsKKwloYW5kbGUtPmhfc3luYyA9IDE7CiAKIAlzdGF0dXMgPSBvY2ZzMl9zeW5jX2xvY2FsX3RvX21haW4ob3NiLCBoYW5kbGUsIGFsbG9jLAogCQkJCQkgIG1haW5fYm1faW5vZGUsIG1haW5fYm1fYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKLWJhaWw6Ci0JaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKworb3V0X3VubG9jazoKKwlvY2ZzMl9tZXRhX3VubG9jayhtYWluX2JtX2lub2RlLCAxKTsKKworb3V0X211dGV4OgorCW11dGV4X3VubG9jaygmbWFpbl9ibV9pbm9kZS0+aV9tdXRleCk7CiAKIAlpZiAobWFpbl9ibV9iaCkKIAkJYnJlbHNlKG1haW5fYm1fYmgpOwogCi0JaWYgKG1haW5fYm1faW5vZGUpCi0JCWlwdXQobWFpbl9ibV9pbm9kZSk7CisJaXB1dChtYWluX2JtX2lub2RlKTsKIAorb3V0OgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00NTIsNyArNDQ3LDYgQEAKICAqIG91ciBvd24gaW4gb3JkZXIgdG8gc2hpZnQgd2luZG93cy4KICAqLwogaW50IG9jZnMyX3Jlc2VydmVfbG9jYWxfYWxsb2NfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKnBhc3NlZF9oYW5kbGUsCiAJCQkJICAgdTMyIGJpdHNfd2FudGVkLAogCQkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYykKIHsKQEAgLTQ2Myw5ICs0NTcsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlCVUdfT04oIXBhc3NlZF9oYW5kbGUpOwogCUJVR19PTighYWMpOwotCUJVR19PTihwYXNzZWRfaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TVEFSVEVEKTsKIAogCWxvY2FsX2FsbG9jX2lub2RlID0KIAkJb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKQEAgLTQ3Niw3ICs0NjgsMTEgQEAKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQotCW9jZnMyX2hhbmRsZV9hZGRfaW5vZGUocGFzc2VkX2hhbmRsZSwgbG9jYWxfYWxsb2NfaW5vZGUpOworCisJbXV0ZXhfbG9jaygmbG9jYWxfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOworCisJYWMtPmFjX2lub2RlID0gbG9jYWxfYWxsb2NfaW5vZGU7CisJYWMtPmFjX3doaWNoID0gT0NGUzJfQUNfVVNFX0xPQ0FMOwogCiAJaWYgKG9zYi0+bG9jYWxfYWxsb2Nfc3RhdGUgIT0gT0NGUzJfTEFfRU5BQkxFRCkgewogCQlzdGF0dXMgPSAtRU5PU1BDOwpAQCAtNTE1LDIxICs1MTEsMTcgQEAKIAkJfQogCX0KIAotCWFjLT5hY19pbm9kZSA9IGlncmFiKGxvY2FsX2FsbG9jX2lub2RlKTsKIAlnZXRfYmgob3NiLT5sb2NhbF9hbGxvY19iaCk7CiAJYWMtPmFjX2JoID0gb3NiLT5sb2NhbF9hbGxvY19iaDsKLQlhYy0+YWNfd2hpY2ggPSBPQ0ZTMl9BQ19VU0VfTE9DQUw7CiAJc3RhdHVzID0gMDsKIGJhaWw6Ci0JaWYgKGxvY2FsX2FsbG9jX2lub2RlKQotCQlpcHV0KGxvY2FsX2FsbG9jX2lub2RlKTsKIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIGludCBvY2ZzMl9jbGFpbV9sb2NhbF9hbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAogCQkJCSB1MzIgbWluX2JpdHMsCiAJCQkJIHUzMiAqYml0X29mZiwKQEAgLTcwNyw3ICs2OTksNyBAQAogICogcGFzc2VkIGlzIHVzZWQgZm9yIGNhY2hpbmcuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfc3luY19sb2NhbF90b19tYWluKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqYWxsb2MsCiAJCQkJICAgIHN0cnVjdCBpbm9kZSAqbWFpbl9ibV9pbm9kZSwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICptYWluX2JtX2JoKQpAQCAtNzc4LDIxICs3NzAsMTkgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9sb2NhbF9hbGxvY19yZXNlcnZlX2Zvcl93aW5kb3coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJCQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKIAkJCQkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMsCiAJCQkJCQlzdHJ1Y3QgaW5vZGUgKipiaXRtYXBfaW5vZGUsCiAJCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaXRtYXBfYmgpCiB7CiAJaW50IHN0YXR1czsKIAotCSphYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJKmFjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISgqYWMpKSB7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KIAotCSgqYWMpLT5hY19oYW5kbGUgPSBoYW5kbGU7CiAJKCphYyktPmFjX2JpdHNfd2FudGVkID0gb2NmczJfbG9jYWxfYWxsb2Nfd2luZG93X2JpdHMob3NiKTsKIAogCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3Rlcl9iaXRtYXBfYml0cyhvc2IsICphYyk7CkBAIC04MjEsNyArODExLDcgQEAKICAqIHBhc3MgaXQgdGhlIGJpdG1hcCBsb2NrIGluIGxvY2tfYmggaWYgeW91IGhhdmUgaXQuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfbG9jYWxfYWxsb2NfbmV3X3dpbmRvdyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkJc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkJCWhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYykKIHsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTg4OCwyMyArODc4LDE1IEBACiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICptYWluX2JtX2JoID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKm1haW5fYm1faW5vZGUgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICphbGxvYzsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICphbGxvY19jb3B5ID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMgPSBOVUxMOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoIWhhbmRsZSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KIAkvKiBUaGlzIHdpbGwgbG9jayB0aGUgbWFpbiBiaXRtYXAgZm9yIHVzLiAqLwogCXN0YXR1cyA9IG9jZnMyX2xvY2FsX2FsbG9jX3Jlc2VydmVfZm9yX3dpbmRvdyhvc2IsCi0JCQkJCQkgICAgICBoYW5kbGUsCiAJCQkJCQkgICAgICAmYWMsCiAJCQkJCQkgICAgICAmbWFpbl9ibV9pbm9kZSwKIAkJCQkJCSAgICAgICZtYWluX2JtX2JoKTsKQEAgLTkxNCw3ICs4OTYsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBoYW5kbGUsIE9DRlMyX1dJTkRPV19NT1ZFX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfV0lORE9XX01PVkVfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTk3Miw3ICs5NTQsNyBAQAogCXN0YXR1cyA9IDA7CiBiYWlsOgogCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiAJaWYgKG1haW5fYm1fYmgpCiAJCWJyZWxzZShtYWluX2JtX2JoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuaCBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuaAppbmRleCAzMGY4OGNlLi4zODVhMTAxIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmgKKysrIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5oCkBAIC00MiwxMiArNDIsMTEgQEAKIAogc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQ7CiBpbnQgb2NmczJfcmVzZXJ2ZV9sb2NhbF9hbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqcGFzc2VkX2hhbmRsZSwKIAkJCQkgICB1MzIgYml0c193YW50ZWQsCiAJCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKTsKIAogaW50IG9jZnMyX2NsYWltX2xvY2FsX2FsbG9jX2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCiAJCQkJIHUzMiBtaW5fYml0cywKIAkJCQkgdTMyICpiaXRfb2ZmLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbW1hcC5jIGIvZnMvb2NmczIvbW1hcC5jCmluZGV4IDgzOTM0ZTMuLjUxYjAyMDQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL21tYXAuYworKysgYi9mcy9vY2ZzMi9tbWFwLmMKQEAgLTgyLDE2ICs4MiwyNyBAQAogCiBpbnQgb2NmczJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CisJaW50IHJldCA9IDAsIGxvY2tfbGV2ZWwgPSAwOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IpOworCiAJLyogV2UgZG9uJ3Qgd2FudCB0byBzdXBwb3J0IHNoYXJlZCB3cml0YWJsZSBtYXBwaW5ncyB5ZXQuICovCi0JaWYgKCgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkpCi0JICAgICYmICgodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVdSSVRFKSkpIHsKKwlpZiAoIW9jZnMyX21vdW50X2xvY2FsKG9zYikgJiYKKwkgICAgKCh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSkgJiYKKwkgICAgKCh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHx8ICh2bWEtPnZtX2ZsYWdzICYgVk1fTUFZV1JJVEUpKSkgewogCQltbG9nKDAsICJkaXNhbGxvdyBzaGFyZWQgd3JpdGFibGUgbW1hcHMgJWx4XG4iLCB2bWEtPnZtX2ZsYWdzKTsKIAkJLyogVGhpcyBpcyAtRUlOVkFMIGJlY2F1c2UgZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAKIAkJICogcmV0dXJucyBpdCBpbiBhIHNpbWlsYXIgc2l0dWF0aW9uLiAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlmaWxlX2FjY2Vzc2VkKGZpbGUpOworCXJldCA9IG9jZnMyX21ldGFfbG9ja19hdGltZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkgICAgZmlsZS0+Zl92ZnNtbnQsICZsb2NrX2xldmVsKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlvY2ZzMl9tZXRhX3VubG9jayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgbG9ja19sZXZlbCk7CitvdXQ6CiAJdm1hLT52bV9vcHMgPSAmb2NmczJfZmlsZV92bV9vcHM7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5jIGIvZnMvb2NmczIvbmFtZWkuYwppbmRleCAyNTkxNTVmLi45NjM3MDM5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9uYW1laS5jCisrKyBiL2ZzL29jZnMyL25hbWVpLmMKQEAgLTc1LDEyICs3NSwxMiBAQAogCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQkJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqKnJlc19kaXIpOwogCi1zdGF0aWMgaW50IG9jZnMyX2RlbGV0ZV9lbnRyeShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbnQgb2NmczJfZGVsZXRlX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKmRlX2RlbCwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCi1zdGF0aWMgaW50IF9fb2NmczJfYWRkX2VudHJ5KHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGludCBfX29jZnMyX2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCiAJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBibGtubywKQEAgLTkzLDQzICs5MywzNyBAQAogCQkJICAgICAgZGV2X3QgZGV2LAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbmV3X2ZlX2JoLAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwYXJlbnRfZmVfYmgsCi0JCQkgICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKipyZXRfaW5vZGUsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqaW5vZGVfYWMpOwogCiBzdGF0aWMgaW50IG9jZnMyX2ZpbGxfbmV3X2RpcihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgIHN0cnVjdCBpbm9kZSAqcGFyZW50LAogCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyk7CiAKLXN0YXRpYyBpbnQgb2NmczJfZG91YmxlX2xvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaDEsCi0JCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUxLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaDIsCi0JCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUyKTsKLQogc3RhdGljIGludCBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKipyZXRfb3JwaGFuX2RpciwKIAkJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgY2hhciAqbmFtZSwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZGVfYmgpOwogCiBzdGF0aWMgaW50IG9jZnMyX29ycGhhbl9hZGQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAogCQkJICAgIGNoYXIgKm5hbWUsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkZV9iaCk7CisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkZV9iaCwKKwkJCSAgICBzdHJ1Y3QgaW5vZGUgKm9ycGhhbl9kaXJfaW5vZGUpOwogCiBzdGF0aWMgaW50IG9jZnMyX2NyZWF0ZV9zeW1saW5rX2RhdGEoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgY29uc3QgY2hhciAqc3ltbmFtZSk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2FkZF9lbnRyeShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGJsa25vLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwYXJlbnRfZmVfYmgsCkBAIC0xNjUsNyArMTU5LDcgQEAKIAltbG9nKDAsICJmaW5kIG5hbWUgJS4qcyBpbiBkaXJlY3RvcnkgJWxsdVxuIiwgZGVudHJ5LT5kX25hbWUubGVuLAogCSAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGRpciktPmlwX2Jsa25vKTsKIAotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkaXIsIE5VTEwsIE5VTEwsIDApOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkaXIsIE5VTEwsIDApOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTI0Miw3ICsyMzYsNyBAQAogfQogCiBzdGF0aWMgaW50IG9jZnMyX2ZpbGxfbmV3X2RpcihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgIHN0cnVjdCBpbm9kZSAqcGFyZW50LAogCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCkBAIC0zMTcsNyArMzExLDcgQEAKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9mZV9iaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpcmZlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2ZlX2JoID0gTlVMTDsKQEAgLTMzMywxOCArMzI3LDExIEBACiAJLyogZ2V0IG91ciBzdXBlciBibG9jayAqLwogCW9zYiA9IE9DRlMyX1NCKGRpci0+aV9zYik7CiAKLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoaGFuZGxlID09IE5VTEwpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOwotCX0KLQotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkaXIsIGhhbmRsZSwgJnBhcmVudF9mZV9iaCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGRpciwgJnBhcmVudF9mZV9iaCwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyAhPSAtRU5PRU5UKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOworCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCWlmIChTX0lTRElSKG1vZGUpICYmIChkaXItPmlfbmxpbmsgPj0gT0NGUzJfTElOS19NQVgpKSB7CkBAIC0zNzQsNyArMzYxLDcgQEAKIAl9CiAKIAkvKiByZXNlcnZlIGFuIGlub2RlIHNwb3QgKi8KLQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX25ld19pbm9kZShvc2IsIGhhbmRsZSwgJmlub2RlX2FjKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX25ld19pbm9kZShvc2IsICZpbm9kZV9hYyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMzg0LDcgKzM3MSw3IEBACiAJLyogYXJlIHdlIG1ha2luZyBhIGRpcmVjdG9yeT8gSWYgc28sIHJlc2VydmUgYSBjbHVzdGVyIGZvciBoaXMKIAkgKiAxc3QgZXh0ZW50LiAqLwogCWlmIChTX0lTRElSKG1vZGUpKSB7Ci0JCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCBoYW5kbGUsIDEsICZkYXRhX2FjKTsKKwkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIDEsICZkYXRhX2FjKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0zOTIsNyArMzc5LDcgQEAKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgaGFuZGxlLCBPQ0ZTMl9NS05PRF9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX01LTk9EX0NSRURJVFMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC00NTMsNyArNDQwLDkgQEAKIAlzdGF0dXMgPSAwOwogbGVhdmU6CiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKKwlvY2ZzMl9tZXRhX3VubG9jayhkaXIsIDEpOwogCiAJaWYgKHN0YXR1cyA9PSAtRU5PU1BDKQogCQltbG9nKDAsICJEaXNrIGlzIGZ1bGxcbiIpOwpAQCAtNDg3LDcgKzQ3Niw3IEBACiAJCQkgICAgICBkZXZfdCBkZXYsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipuZXdfZmVfYmgsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9mZV9iaCwKLQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgIHN0cnVjdCBpbm9kZSAqKnJldF9pbm9kZSwKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICppbm9kZV9hYykKIHsKQEAgLTU5OCw5ICs1ODcsMTEgQEAKIAl9CiAKIAlvY2ZzMl9pbm9kZV9zZXRfbmV3KG9zYiwgaW5vZGUpOwotCXN0YXR1cyA9IG9jZnMyX2NyZWF0ZV9uZXdfaW5vZGVfbG9ja3MoaW5vZGUpOwotCWlmIChzdGF0dXMgPCAwKQotCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJaWYgKCFvY2ZzMl9tb3VudF9sb2NhbChvc2IpKSB7CisJCXN0YXR1cyA9IG9jZnMyX2NyZWF0ZV9uZXdfaW5vZGVfbG9ja3MoaW5vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwl9CiAKIAlzdGF0dXMgPSAwOyAvKiBlcnJvciBpbiBvY2ZzMl9jcmVhdGVfbmV3X2lub2RlX2xvY2tzIGlzIG5vdAogCQkgICAgICogY3JpdGljYWwgKi8KQEAgLTY1Myw3ICs2NDQsNyBAQAogCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOwogCWludCBlcnI7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCA9IE5VTEw7CkBAIC02NjYsNjggKzY1Nyw2MCBAQAogCQkgICBvbGRfZGVudHJ5LT5kX25hbWUubGVuLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJICAgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAotCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCWVyciA9IC1FUEVSTTsKLQkJZ290byBiYWlsOwotCX0KKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGJhaWw7Ci0JfQotCi0JZXJyID0gb2NmczJfbWV0YV9sb2NrKGRpciwgaGFuZGxlLCAmcGFyZW50X2ZlX2JoLCAxKTsKKwllcnIgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCAmcGFyZW50X2ZlX2JoLCAxKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpZiAoZXJyICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKGVycik7Ci0JCWdvdG8gYmFpbDsKKwkJcmV0dXJuIGVycjsKIAl9CiAKIAlpZiAoIWRpci0+aV9ubGluaykgewogCQllcnIgPSAtRU5PRU5UOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0OwogCX0KIAogCWVyciA9IG9jZnMyX2NoZWNrX2Rpcl9mb3JfZW50cnkoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCQlkZW50cnktPmRfbmFtZS5sZW4pOwogCWlmIChlcnIpCi0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAKIAllcnIgPSBvY2ZzMl9wcmVwYXJlX2Rpcl9mb3JfaW5zZXJ0KG9zYiwgZGlyLCBwYXJlbnRfZmVfYmgsCiAJCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgJmRlX2JoKTsKIAlpZiAoZXJyIDwgMCkgewogCQltbG9nX2Vycm5vKGVycik7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBvdXQ7CiAJfQogCi0JZXJyID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBoYW5kbGUsICZmZV9iaCwgMSk7CisJZXJyID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZmVfYmgsIDEpOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmIChlcnIgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oZXJyKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dDsKIAl9CiAKIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGZlX2JoLT5iX2RhdGE7CiAJaWYgKGxlMTZfdG9fY3B1KGZlLT5pX2xpbmtzX2NvdW50KSA+PSBPQ0ZTMl9MSU5LX01BWCkgewogCQllcnIgPSAtRU1MSU5LOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X3VubG9ja19pbm9kZTsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGhhbmRsZSwgT0NGUzJfTElOS19DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0xJTktfQ1JFRElUUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCWVyciA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKIAkJbWxvZ19lcnJubyhlcnIpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X3VubG9ja19pbm9kZTsKIAl9CiAKIAllcnIgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmZV9iaCwKIAkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKGVyciA8IDApIHsKIAkJbWxvZ19lcnJubyhlcnIpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X2NvbW1pdDsKIAl9CiAKIAlpbmNfbmxpbmsoaW5vZGUpOwpAQCAtNzQxLDcgKzcyNCw3IEBACiAJCWxlMTZfYWRkX2NwdSgmZmUtPmlfbGlua3NfY291bnQsIC0xKTsKIAkJZHJvcF9ubGluayhpbm9kZSk7CiAJCW1sb2dfZXJybm8oZXJyKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF9jb21taXQ7CiAJfQogCiAJZXJyID0gb2NmczJfYWRkX2VudHJ5KGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwKQEAgLTc1MSwyMSArNzM0LDI3IEBACiAJCWxlMTZfYWRkX2NwdSgmZmUtPmlfbGlua3NfY291bnQsIC0xKTsKIAkJZHJvcF9ubGluayhpbm9kZSk7CiAJCW1sb2dfZXJybm8oZXJyKTsKLQkJZ290byBiYWlsOworCQlnb3RvIG91dF9jb21taXQ7CiAJfQogCiAJZXJyID0gb2NmczJfZGVudHJ5X2F0dGFjaF9sb2NrKGRlbnRyeSwgaW5vZGUsIE9DRlMyX0koZGlyKS0+aXBfYmxrbm8pOwogCWlmIChlcnIpIHsKIAkJbWxvZ19lcnJubyhlcnIpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gb3V0X2NvbW1pdDsKIAl9CiAKIAlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CiAJZGVudHJ5LT5kX29wID0gJm9jZnMyX2RlbnRyeV9vcHM7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLWJhaWw6Ci0JaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dF91bmxvY2tfaW5vZGU6CisJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOworCitvdXQ6CisJb2NmczJfbWV0YV91bmxvY2soZGlyLCAxKTsKKwogCWlmIChkZV9iaCkKIAkJYnJlbHNlKGRlX2JoKTsKIAlpZiAoZmVfYmgpCkBAIC04MTIsMTMgKzgwMSwxNSBAQAogCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWludCBzdGF0dXM7CisJaW50IGNoaWxkX2xvY2tlZCA9IDA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm9ycGhhbl9kaXIgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZGlyLT5pX3NiKTsKIAl1NjQgYmxrbm87CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X25vZGVfYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpkaXJlbnQgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlyZW50X2JoID0gTlVMTDsKIAljaGFyIG9ycGhhbl9uYW1lW09DRlMyX09SUEhBTl9OQU1FTEVOICsgMV07CkBAIC04MzMsMjIgKzgyNCwxNCBAQAogCiAJaWYgKGlub2RlID09IG9zYi0+cm9vdF9pbm9kZSkgewogCQltbG9nKDAsICJDYW5ub3QgZGVsZXRlIHRoZSByb290IGRpcmVjdG9yeVxuIik7Ci0JCXN0YXR1cyA9IC1FUEVSTTsKLQkJZ290byBsZWF2ZTsKKwkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9hbGxvY19oYW5kbGUob3NiKTsKLQlpZiAoaGFuZGxlID09IE5VTEwpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOwotCX0KLQotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhkaXIsIGhhbmRsZSwgJnBhcmVudF9ub2RlX2JoLCAxKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCAmcGFyZW50X25vZGVfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAKIAlzdGF0dXMgPSBvY2ZzMl9maW5kX2ZpbGVzX29uX2Rpc2soZGVudHJ5LT5kX25hbWUubmFtZSwKQEAgLTg2OSwxMiArODUyLDEzIEBACiAJCWdvdG8gbGVhdmU7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBoYW5kbGUsICZmZV9iaCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZmVfYmgsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKIAl9CisJY2hpbGRfbG9ja2VkID0gMTsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJICAgICAgIAlpZiAoIW9jZnMyX2VtcHR5X2Rpcihpbm9kZSkpIHsKQEAgLTg5NSw3ICs4NzksNyBAQAogCX0KIAogCWlmIChpbm9kZV9pc191bmxpbmthYmxlKGlub2RlKSkgewotCQlzdGF0dXMgPSBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIob3NiLCBoYW5kbGUsIGlub2RlLAorCQlzdGF0dXMgPSBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIob3NiLCAmb3JwaGFuX2RpciwgaW5vZGUsCiAJCQkJCQkgIG9ycGhhbl9uYW1lLAogCQkJCQkJICAmb3JwaGFuX2VudHJ5X2JoKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTkwNCw3ICs4ODgsNyBAQAogCQl9CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBoYW5kbGUsIE9DRlMyX1VOTElOS19DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1VOTElOS19DUkVESVRTKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtOTIzLDcgKzkwNyw3IEBACiAKIAlpZiAoaW5vZGVfaXNfdW5saW5rYWJsZShpbm9kZSkpIHsKIAkJc3RhdHVzID0gb2NmczJfb3JwaGFuX2FkZChvc2IsIGhhbmRsZSwgaW5vZGUsIGZlLCBvcnBoYW5fbmFtZSwKLQkJCQkJICBvcnBoYW5fZW50cnlfYmgpOworCQkJCQkgIG9ycGhhbl9lbnRyeV9iaCwgb3JwaGFuX2Rpcik7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGxlYXZlOwpAQCAtOTYwLDcgKzk0NCwxOSBAQAogCiBsZWF2ZToKIAlpZiAoaGFuZGxlKQotCQlvY2ZzMl9jb21taXRfdHJhbnMoaGFuZGxlKTsKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKworCWlmIChjaGlsZF9sb2NrZWQpCisJCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKworCW9jZnMyX21ldGFfdW5sb2NrKGRpciwgMSk7CisKKwlpZiAob3JwaGFuX2RpcikgeworCQkvKiBUaGlzIHdhcyBsb2NrZWQgZm9yIHVzIGluIG9jZnMyX3ByZXBhcmVfb3JwaGFuX2RpcigpICovCisJCW9jZnMyX21ldGFfdW5sb2NrKG9ycGhhbl9kaXIsIDEpOworCQltdXRleF91bmxvY2soJm9ycGhhbl9kaXItPmlfbXV0ZXgpOworCQlpcHV0KG9ycGhhbl9kaXIpOworCX0KIAogCWlmIChmZV9iaCkKIAkJYnJlbHNlKGZlX2JoKTsKQEAgLTk4NCw3ICs5ODAsNiBAQAogICogaWYgdGhleSBoYXZlIHRoZSBzYW1lIGlkLCB0aGVuIHRoZSAxc3Qgb25lIGlzIHRoZSBvbmx5IG9uZSBsb2NrZWQuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfZG91YmxlX2xvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaDEsCiAJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUxLAogCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaDIsCkBAIC0xMDAwLDggKzk5NSw2IEBACiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2kxLT5pcF9ibGtubywKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvaTItPmlwX2Jsa25vKTsKIAotCUJVR19PTighaGFuZGxlKTsKLQogCWlmICgqYmgxKQogCQkqYmgxID0gTlVMTDsKIAlpZiAoKmJoMikKQEAgLTEwMjEsMjUgKzEwMTQsNDEgQEAKIAkJCWlub2RlMSA9IHRtcGlub2RlOwogCQl9CiAJCS8qIGxvY2sgaWQyICovCi0JCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZTIsIGhhbmRsZSwgYmgyLCAxKTsKKwkJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlMiwgYmgyLCAxKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KIAl9CisKIAkvKiBsb2NrIGlkMSAqLwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZTEsIGhhbmRsZSwgYmgxLCAxKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUxLCBiaDEsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CisJCS8qCisJCSAqIEFuIGVycm9yIHJldHVybiBtdXN0IG1lYW4gdGhhdCBubyBjbHVzdGVyIGxvY2tzCisJCSAqIHdlcmUgaGVsZCBvbiBmdW5jdGlvbiBleGl0LgorCQkgKi8KKwkJaWYgKG9pMS0+aXBfYmxrbm8gIT0gb2kyLT5pcF9ibGtubykKKwkJCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlMiwgMSk7CisKIAkJaWYgKHN0YXR1cyAhPSAtRU5PRU5UKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CiAJfQorCiBiYWlsOgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyB2b2lkIG9jZnMyX2RvdWJsZV91bmxvY2soc3RydWN0IGlub2RlICppbm9kZTEsIHN0cnVjdCBpbm9kZSAqaW5vZGUyKQoreworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlMSwgMSk7CisKKwlpZiAoaW5vZGUxICE9IGlub2RlMikKKwkJb2NmczJfbWV0YV91bmxvY2soaW5vZGUyLCAxKTsKK30KKwogI2RlZmluZSBQQVJFTlRfSU5PKGJ1ZmZlcikgXAogCSgoc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqKSBcCiAJICgoY2hhciAqKWJ1ZmZlciArIFwKQEAgLTEwNTAsOSArMTA1OSwxMSBAQAogCQkJc3RydWN0IGlub2RlICpuZXdfZGlyLAogCQkJc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKIHsKLQlpbnQgc3RhdHVzID0gMCwgcmVuYW1lX2xvY2sgPSAwOworCWludCBzdGF0dXMgPSAwLCByZW5hbWVfbG9jayA9IDAsIHBhcmVudHNfbG9ja2VkID0gMDsKKwlpbnQgb2xkX2NoaWxkX2xvY2tlZCA9IDAsIG5ld19jaGlsZF9sb2NrZWQgPSAwOwogCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICpvcnBoYW5fZGlyID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpuZXdmZSA9IE5VTEw7CiAJY2hhciBvcnBoYW5fbmFtZVtPQ0ZTMl9PUlBIQU5fTkFNRUxFTiArIDFdOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqb3JwaGFuX2VudHJ5X2JoID0gTlVMTDsKQEAgLTEwNjAsNyArMTA3MSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICppbnNlcnRfZW50cnlfYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gTlVMTDsKIAl1NjQgbmV3ZmVfYmxrbm87Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2Rpcl9iaCA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfZGlyX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpvbGRfZGUgPSBOVUxMLCAqbmV3X2RlID0gTlVMTDsgLy8gZGlyZW50IGZvciBvbGRfZGVudHJ5CkBAIC0xMDg1LDE0ICsxMDk2LDYgQEAKIAkJCUJVRygpOwogCX0KIAotCWlmIChhdG9taWNfcmVhZCgmb2xkX2RlbnRyeS0+ZF9jb3VudCkgPiAyKSB7Ci0JCXNocmlua19kY2FjaGVfcGFyZW50KG9sZF9kZW50cnkpOwotCQlpZiAoYXRvbWljX3JlYWQoJm9sZF9kZW50cnktPmRfY291bnQpID4gMikgewotCQkJc3RhdHVzID0gLUVCVVNZOwotCQkJZ290byBiYWlsOwotCQl9Ci0JfQotCiAJLyogQXNzdW1lIGEgZGlyZWN0b3J5IGhlaXJhcmNoeSB0aHVzbHk6CiAJICogYS9iL2MKIAkgKiBhL2QKQEAgLTExMTMsMjEgKzExMTYsMTQgQEAKIAkJcmVuYW1lX2xvY2sgPSAxOwogCX0KIAotCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KIAkvKiBpZiBvbGQgYW5kIG5ldyBhcmUgdGhlIHNhbWUsIHRoaXMnbGwganVzdCBkbyBvbmUgbG9jay4gKi8KLQlzdGF0dXMgPSBvY2ZzMl9kb3VibGVfbG9jayhvc2IsIGhhbmRsZSwKLQkJCQkgICZvbGRfZGlyX2JoLCBvbGRfZGlyLAotCQkJCSAgJm5ld19kaXJfYmgsIG5ld19kaXIpOworCXN0YXR1cyA9IG9jZnMyX2RvdWJsZV9sb2NrKG9zYiwgJm9sZF9kaXJfYmgsIG9sZF9kaXIsCisJCQkJICAgJm5ld19kaXJfYmgsIG5ld19kaXIpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KKwlwYXJlbnRzX2xvY2tlZCA9IDE7CiAKIAkvKiBtYWtlIHN1cmUgYm90aCBkaXJzIGhhdmUgYmhzCiAJICogZ2V0IGFuIGV4dHJhIHJlZiBvbiBvbGRfZGlyX2JoIGlmIG9sZD09bmV3ICovCkBAIC0xMTQ4LDEyICsxMTQ0LDEzIEBACiAJICogdGhlIHZvdGUgdGhyZWFkIG9uIG90aGVyIG5vZGVzIHdvbid0IGhhdmUgdG8gY29uY3VycmVudGx5CiAJICogZG93bmNvbnZlcnQgdGhlIGlub2RlIGFuZCB0aGUgZGVudHJ5IGxvY2tzLgogCSAqLwotCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhvbGRfaW5vZGUsIGhhbmRsZSwgTlVMTCwgMSk7CisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9sZF9pbm9kZSwgTlVMTCwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyAhPSAtRU5PRU5UKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQorCW9sZF9jaGlsZF9sb2NrZWQgPSAxOwogCiAJc3RhdHVzID0gb2NmczJfcmVtb3RlX2RlbnRyeV9kZWxldGUob2xkX2RlbnRyeSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTEyMzksMTIgKzEyMzYsMTMgQEAKIAkJCWdvdG8gYmFpbDsKIAkJfQogCi0JCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhuZXdfaW5vZGUsIGhhbmRsZSwgJm5ld2ZlX2JoLCAxKTsKKwkJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG5ld19pbm9kZSwgJm5ld2ZlX2JoLCAxKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KKwkJbmV3X2NoaWxkX2xvY2tlZCA9IDE7CiAKIAkJc3RhdHVzID0gb2NmczJfcmVtb3RlX2RlbnRyeV9kZWxldGUobmV3X2RlbnRyeSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CkBAIC0xMjYwLDcgKzEyNTgsNyBAQAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3ZmVfYmgtPmJfYmxvY2tuciA6IDBVTEwpOwogCiAJCWlmIChTX0lTRElSKG5ld19pbm9kZS0+aV9tb2RlKSB8fCAobmV3X2lub2RlLT5pX25saW5rID09IDEpKSB7Ci0JCQlzdGF0dXMgPSBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIob3NiLCBoYW5kbGUsCisJCQlzdGF0dXMgPSBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIob3NiLCAmb3JwaGFuX2RpciwKIAkJCQkJCQkgIG5ld19pbm9kZSwKIAkJCQkJCQkgIG9ycGhhbl9uYW1lLAogCQkJCQkJCSAgJm9ycGhhbl9lbnRyeV9iaCk7CkBAIC0xMjg4LDcgKzEyODYsNyBAQAogCQl9CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBoYW5kbGUsIE9DRlMyX1JFTkFNRV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTkFNRV9DUkVESVRTKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtMTMxNSw3ICsxMzEzLDcgQEAKIAkJICAgIChuZXdmZS0+aV9saW5rc19jb3VudCA9PSBjcHVfdG9fbGUxNigxKSkpewogCQkJc3RhdHVzID0gb2NmczJfb3JwaGFuX2FkZChvc2IsIGhhbmRsZSwgbmV3X2lub2RlLAogCQkJCQkJICBuZXdmZSwgb3JwaGFuX25hbWUsCi0JCQkJCQkgIG9ycGhhbl9lbnRyeV9iaCk7CisJCQkJCQkgIG9ycGhhbl9lbnRyeV9iaCwgb3JwaGFuX2Rpcik7CiAJCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCQlnb3RvIGJhaWw7CkBAIC0xNDMyLDcgKzE0MzAsMjMgQEAKIAkJb2NmczJfcmVuYW1lX3VubG9jayhvc2IpOwogCiAJaWYgKGhhbmRsZSkKLQkJb2NmczJfY29tbWl0X3RyYW5zKGhhbmRsZSk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKKwlpZiAocGFyZW50c19sb2NrZWQpCisJCW9jZnMyX2RvdWJsZV91bmxvY2sob2xkX2RpciwgbmV3X2Rpcik7CisKKwlpZiAob2xkX2NoaWxkX2xvY2tlZCkKKwkJb2NmczJfbWV0YV91bmxvY2sob2xkX2lub2RlLCAxKTsKKworCWlmIChuZXdfY2hpbGRfbG9ja2VkKQorCQlvY2ZzMl9tZXRhX3VubG9jayhuZXdfaW5vZGUsIDEpOworCisJaWYgKG9ycGhhbl9kaXIpIHsKKwkJLyogVGhpcyB3YXMgbG9ja2VkIGZvciB1cyBpbiBvY2ZzMl9wcmVwYXJlX29ycGhhbl9kaXIoKSAqLworCQlvY2ZzMl9tZXRhX3VubG9jayhvcnBoYW5fZGlyLCAxKTsKKwkJbXV0ZXhfdW5sb2NrKCZvcnBoYW5fZGlyLT5pX211dGV4KTsKKwkJaXB1dChvcnBoYW5fZGlyKTsKKwl9CiAKIAlpZiAobmV3X2lub2RlKQogCQlzeW5jX21hcHBpbmdfYnVmZmVycyhvbGRfaW5vZGUtPmlfbWFwcGluZyk7CkBAIC0xNDY2LDcgKzE0ODAsNyBAQAogICogZGF0YSwgaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfY3JlYXRlX3N5bWxpbmtfZGF0YShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICBjb25zdCBjaGFyICpzeW1uYW1lKQogewpAQCAtMTU4MSw3ICsxNTk1LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9mZV9iaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpcmZlOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqaW5vZGVfYWMgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKIApAQCAtMTU5NSwxOSArMTYwOSwxMiBAQAogCiAJY3JlZGl0cyA9IG9jZnMyX2NhbGNfc3ltbGlua19jcmVkaXRzKHNiKTsKIAotCWhhbmRsZSA9IG9jZnMyX2FsbG9jX2hhbmRsZShvc2IpOwotCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KIAkvKiBsb2NrIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICovCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGRpciwgaGFuZGxlLCAmcGFyZW50X2ZlX2JoLCAxKTsKKwlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZGlyLCAmcGFyZW50X2ZlX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9FTlQpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAKIAlkaXJmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIHBhcmVudF9mZV9iaC0+Yl9kYXRhOwpAQCAtMTYzMCw3ICsxNjM3LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbmV3X2lub2RlKG9zYiwgaGFuZGxlLCAmaW5vZGVfYWMpOworCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbmV3X2lub2RlKG9zYiwgJmlub2RlX2FjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xNjM5LDcgKzE2NDYsNyBAQAogCiAJLyogZG9uJ3QgcmVzZXJ2ZSBiaXRtYXAgc3BhY2UgZm9yIGZhc3Qgc3ltbGlua3MuICovCiAJaWYgKGwgPiBvY2ZzMl9mYXN0X3N5bWxpbmtfY2hhcnMoc2IpKSB7Ci0JCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCBoYW5kbGUsIDEsICZkYXRhX2FjKTsKKwkJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIDEsICZkYXRhX2FjKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xNjQ3LDcgKzE2NTQsNyBAQAogCQl9CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBoYW5kbGUsIGNyZWRpdHMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTE3MjUsNyArMTczMiwxMCBAQAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiBiYWlsOgogCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCisJb2NmczJfbWV0YV91bmxvY2soZGlyLCAxKTsKKwogCWlmIChuZXdfZmVfYmgpCiAJCWJyZWxzZShuZXdfZmVfYmgpOwogCWlmIChwYXJlbnRfZmVfYmgpCkBAIC0xNzc2LDcgKzE3ODYsNyBAQAogICogSWYgeW91IHBhc3MgbWUgaW5zZXJ0X2JoLCBJJ2xsIHNraXAgdGhlIHNlYXJjaCBvZiB0aGUgb3RoZXIgZGlyCiAgKiBibG9ja3MgYW5kIHB1dCB0aGUgcmVjb3JkIGluIHRoZXJlLgogICovCi1zdGF0aWMgaW50IF9fb2NmczJfYWRkX2VudHJ5KHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGludCBfX29jZnMyX2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCiAJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBibGtubywKQEAgLTE4NjIsNyArMTg3Miw3IEBACiAgKiBvY2ZzMl9kZWxldGVfZW50cnkgZGVsZXRlcyBhIGRpcmVjdG9yeSBlbnRyeSBieSBtZXJnaW5nIGl0IHdpdGggdGhlCiAgKiBwcmV2aW91cyBlbnRyeQogICovCi1zdGF0aWMgaW50IG9jZnMyX2RlbGV0ZV9lbnRyeShzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbnQgb2NmczJfZGVsZXRlX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCSAgICAgIHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKmRlX2RlbCwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCkBAIC0yMDkzLDE5ICsyMTAzLDE5IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfcHJlcGFyZV9vcnBoYW5fZGlyKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICAgc3RydWN0IGlub2RlICoqcmV0X29ycGhhbl9kaXIsCiAJCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgIGNoYXIgKm5hbWUsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmRlX2JoKQogewotCXN0cnVjdCBpbm9kZSAqb3JwaGFuX2Rpcl9pbm9kZSA9IE5VTEw7CisJc3RydWN0IGlub2RlICpvcnBoYW5fZGlyX2lub2RlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqb3JwaGFuX2Rpcl9iaCA9IE5VTEw7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAlzdGF0dXMgPSBvY2ZzMl9ibGtub19zdHJpbmdpZnkoT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBuYW1lKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7CisJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJb3JwaGFuX2Rpcl9pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCkBAIC0yMTE0LDExICsyMTI0LDEyIEBACiAJaWYgKCFvcnBoYW5fZGlyX2lub2RlKSB7CiAJCXN0YXR1cyA9IC1FTk9FTlQ7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKKwkJcmV0dXJuIHN0YXR1czsKIAl9CiAKLQlvY2ZzMl9oYW5kbGVfYWRkX2lub2RlKGhhbmRsZSwgb3JwaGFuX2Rpcl9pbm9kZSk7Ci0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9ycGhhbl9kaXJfaW5vZGUsIGhhbmRsZSwgJm9ycGhhbl9kaXJfYmgsIDEpOworCW11dGV4X2xvY2soJm9ycGhhbl9kaXJfaW5vZGUtPmlfbXV0ZXgpOworCisJc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKG9ycGhhbl9kaXJfaW5vZGUsICZvcnBoYW5fZGlyX2JoLCAxKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC0yMTI4LDEzICsyMTM5LDE5IEBACiAJCQkJCSAgICAgIG9ycGhhbl9kaXJfYmgsIG5hbWUsCiAJCQkJCSAgICAgIE9DRlMyX09SUEhBTl9OQU1FTEVOLCBkZV9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKKwkJb2NmczJfbWV0YV91bmxvY2sob3JwaGFuX2Rpcl9pbm9kZSwgMSk7CisKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwogCX0KIAorCSpyZXRfb3JwaGFuX2RpciA9IG9ycGhhbl9kaXJfaW5vZGU7CisKIGxlYXZlOgotCWlmIChvcnBoYW5fZGlyX2lub2RlKQorCWlmIChzdGF0dXMpIHsKKwkJbXV0ZXhfdW5sb2NrKCZvcnBoYW5fZGlyX2lub2RlLT5pX211dGV4KTsKIAkJaXB1dChvcnBoYW5fZGlyX2lub2RlKTsKKwl9CiAKIAlpZiAob3JwaGFuX2Rpcl9iaCkKIAkJYnJlbHNlKG9ycGhhbl9kaXJfYmgpOwpAQCAtMjE0NCwyOCArMjE2MSwxOSBAQAogfQogCiBzdGF0aWMgaW50IG9jZnMyX29ycGhhbl9hZGQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICAgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAogCQkJICAgIGNoYXIgKm5hbWUsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkZV9iaCkKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlX2JoLAorCQkJICAgIHN0cnVjdCBpbm9kZSAqb3JwaGFuX2Rpcl9pbm9kZSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKm9ycGhhbl9kaXJfaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqb3JwaGFuX2Rpcl9iaCA9IE5VTEw7CiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqb3JwaGFuX2ZlOwogCiAJbWxvZ19lbnRyeSgiKGlub2RlLT5pX2lubyA9ICVsdSlcbiIsIGlub2RlLT5pX2lubyk7CiAKLQlvcnBoYW5fZGlyX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKLQkJCQkJCSAgICAgICBPUlBIQU5fRElSX1NZU1RFTV9JTk9ERSwKLQkJCQkJCSAgICAgICBvc2ItPnNsb3RfbnVtKTsKLQlpZiAoIW9ycGhhbl9kaXJfaW5vZGUpIHsKLQkJc3RhdHVzID0gLUVOT0VOVDsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOwotCX0KLQogCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLAogCQkJCSAgT0NGUzJfSShvcnBoYW5fZGlyX2lub2RlKS0+aXBfYmxrbm8sCiAJCQkJICAmb3JwaGFuX2Rpcl9iaCwgT0NGUzJfQkhfQ0FDSEVELApAQCAtMjIxNyw5ICsyMjI1LDYgQEAKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBvc2ItPnNsb3RfbnVtKTsKIAogbGVhdmU6Ci0JaWYgKG9ycGhhbl9kaXJfaW5vZGUpCi0JCWlwdXQob3JwaGFuX2Rpcl9pbm9kZSk7Ci0KIAlpZiAob3JwaGFuX2Rpcl9iaCkKIAkJYnJlbHNlKG9ycGhhbl9kaXJfYmgpOwogCkBAIC0yMjI5LDcgKzIyMzQsNyBAQAogCiAvKiB1bmxpa2Ugb3JwaGFuX2FkZCwgd2UgZXhwZWN0IHRoZSBvcnBoYW4gZGlyIHRvIGFscmVhZHkgYmUgbG9ja2VkIGhlcmUuICovCiBpbnQgb2NmczJfb3JwaGFuX2RlbChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJICAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgIHN0cnVjdCBpbm9kZSAqb3JwaGFuX2Rpcl9pbm9kZSwKIAkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqb3JwaGFuX2Rpcl9iaCkKQEAgLTIzMDgsNCArMjMxMyw1IEBACiAJLnJlbmFtZQkJPSBvY2ZzMl9yZW5hbWUsCiAJLnNldGF0dHIJPSBvY2ZzMl9zZXRhdHRyLAogCS5nZXRhdHRyCT0gb2NmczJfZ2V0YXR0ciwKKwkucGVybWlzc2lvbgk9IG9jZnMyX3Blcm1pc3Npb24sCiB9OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuaCBiL2ZzL29jZnMyL25hbWVpLmgKaW5kZXggZGVhYWE5Ny4uODQyNTk0NCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuaAorKysgYi9mcy9vY2ZzMi9uYW1laS5oCkBAIC0zOSw3ICszOSw3IEBACiAJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKipyZXNfZGlyKTsKIGludCBvY2ZzMl9vcnBoYW5fZGVsKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCSAgICAgc3RydWN0IGlub2RlICpvcnBoYW5fZGlyX2lub2RlLAogCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpvcnBoYW5fZGlyX2JoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyLmggYi9mcy9vY2ZzMi9vY2ZzMi5oCmluZGV4IDA0NjJhN2YuLmRiOGU3N2MgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyLmgKKysrIGIvZnMvb2NmczIvb2NmczIuaApAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgogCiAjaW5jbHVkZSAiY2x1c3Rlci9ub2RlbWFuYWdlci5oIgogI2luY2x1ZGUgImNsdXN0ZXIvaGVhcnRiZWF0LmgiCkBAIC0xNzksOSArMTgwLDkgQEAKICNkZWZpbmUgT0NGUzJfT1NCX1NPRlRfUk8JMHgwMDAxCiAjZGVmaW5lIE9DRlMyX09TQl9IQVJEX1JPCTB4MDAwMgogI2RlZmluZSBPQ0ZTMl9PU0JfRVJST1JfRlMJMHgwMDA0CisjZGVmaW5lIE9DRlMyX0RFRkFVTFRfQVRJTUVfUVVBTlRVTQk2MAogCiBzdHJ1Y3Qgb2NmczJfam91cm5hbDsKLXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZTsKIHN0cnVjdCBvY2ZzMl9zdXBlcgogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY29tbWl0X3Rhc2s7CkBAIC0yMTgsNiArMjE5LDcgQEAKIAl1bnNpZ25lZCBsb25nIG9zYl9mbGFnczsKIAogCXVuc2lnbmVkIGxvbmcgc19tb3VudF9vcHQ7CisJdW5zaWduZWQgaW50IHNfYXRpbWVfcXVhbnR1bTsKIAogCXUxNiBtYXhfc2xvdHM7CiAJczE2IG5vZGVfbnVtOwpAQCAtMjgzLDcgKzI4NSw3IEBACiAJLyogVHJ1bmNhdGUgbG9nIGluZm8gKi8KIAlzdHJ1Y3QgaW5vZGUJCQkqb3NiX3RsX2lub2RlOwogCXN0cnVjdCBidWZmZXJfaGVhZAkJKm9zYl90bF9iaDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCW9zYl90cnVuY2F0ZV9sb2dfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yawkJb3NiX3RydW5jYXRlX2xvZ193cTsKIAogCXN0cnVjdCBvY2ZzMl9ub2RlX21hcAkJb3NiX3JlY292ZXJpbmdfb3JwaGFuX2RpcnM7CiAJdW5zaWduZWQgaW50CQkJKm9zYl9vcnBoYW5fd2lwZXM7CkBAIC0zNDcsNiArMzQ5LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfbW91bnRfbG9jYWwoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJcmV0dXJuIChvc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfTE9DQUxfTU9VTlQpOworfQorCiAjZGVmaW5lIE9DRlMyX0lTX1ZBTElEX0RJTk9ERShwdHIpCQkJCQlcCiAJKCFzdHJjbXAoKHB0ciktPmlfc2lnbmF0dXJlLCBPQ0ZTMl9JTk9ERV9TSUdOQVRVUkUpKQogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oIGIvZnMvb2NmczIvb2NmczJfZnMuaAppbmRleCAzMzMwYTVkLi5iNWM2ODU2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oCisrKyBiL2ZzL29jZnMyL29jZnMyX2ZzLmgKQEAgLTg2LDcgKzg2LDcgQEAKIAlPQ0ZTMl9TQihzYiktPnNfZmVhdHVyZV9pbmNvbXBhdCAmPSB+KG1hc2spCiAKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9DT01QQVRfU1VQUAkwCi0jZGVmaW5lIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAkwCisjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAlPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0xPQ0FMX01PVU5UCiAjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJMAogCiAvKgpAQCAtOTYsNiArOTYsMTggQEAKICAqLwogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX0hFQVJUQkVBVF9ERVYJMHgwMDAyCiAKKy8qCisgKiB0dW5lZnMgc2V0cyB0aGlzIGluY29tcGF0IGZsYWcgYmVmb3JlIHN0YXJ0aW5nIHRoZSByZXNpemUgYW5kIGNsZWFycyBpdAorICogYXQgdGhlIGVuZC4gVGhpcyBmbGFnIHByb3RlY3RzIHVzZXJzIGZyb20gaW5hZHZlcnRlbnRseSBtb3VudGluZyB0aGUgZnMKKyAqIGFmdGVyIGFuIGFib3J0ZWQgcnVuIHdpdGhvdXQgZnNjay1pbmcuCisgKi8KKyNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9SRVNJWkVfSU5QUk9HICAgIDB4MDAwNAorCisvKiBVc2VkIHRvIGRlbm90ZSBhIG5vbi1jbHVzdGVyZWQgdm9sdW1lICovCisjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfTE9DQUxfTU9VTlQJMHgwMDA4CisKKy8qIFN1cHBvcnQgZm9yIHNwYXJzZSBhbGxvY2F0aW9uIGluIGItdHJlZXMgKi8KKyNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9TUEFSU0VfQUxMT0MJMHgwMDEwCiAKIC8qCiAgKiBGbGFncyBvbiBvY2ZzMl9kaW5vZGUuaV9mbGFncwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc2xvdF9tYXAuYyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKaW5kZXggYWE2ZjVhYS4uMmQzYWMzMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc2xvdF9tYXAuYworKysgYi9mcy9vY2ZzMi9zbG90X21hcC5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfc2xvdF9pbmZvICpzaTsKIAotCXNpID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG9jZnMyX3Nsb3RfaW5mbyksIEdGUF9LRVJORUwpOworCXNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX3Nsb3RfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghc2kpIHsKIAkJc3RhdHVzID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggOWQ5MWU2Ni4uNmRiYjExNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC00OSw3ICs0OSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfZGVidWdfYmcoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl9kZWJ1Z19zdWJhbGxvY19pbm9kZShzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSk7CiBzdGF0aWMgaW5saW5lIHUxNiBvY2ZzMl9maW5kX3ZpY3RpbV9jaGFpbihzdHJ1Y3Qgb2NmczJfY2hhaW5fbGlzdCAqY2wpOwotc3RhdGljIGludCBvY2ZzMl9ibG9ja19ncm91cF9maWxsKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGludCBvY2ZzMl9ibG9ja19ncm91cF9maWxsKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiZ19iaCwKIAkJCQkgIHU2NCBncm91cF9ibGtubywKQEAgLTU5LDkgKzU5LDYgQEAKIAkJCQkgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCi1zdGF0aWMgaW50IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjKTsKLQogc3RhdGljIGludCBvY2ZzMl9jbHVzdGVyX2dyb3VwX3NlYXJjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmgsCiAJCQkJICAgICAgdTMyIGJpdHNfd2FudGVkLCB1MzIgbWluX2JpdHMsCkBAIC03Miw2ICs2OSw3IEBACiAJCQkJICAgIHUxNiAqYml0X29mZiwgdTE2ICpiaXRzX2ZvdW5kKTsKIHN0YXRpYyBpbnQgb2NmczJfY2xhaW1fc3ViYWxsb2NfYml0cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYywKKwkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgICB1MzIgYml0c193YW50ZWQsCiAJCQkJICAgICB1MzIgbWluX2JpdHMsCiAJCQkJICAgICB1MTYgKmJpdF9vZmYsCkBAIC03OSwyMCArNzcsMjAgQEAKIAkJCQkgICAgIHU2NCAqYmdfYmxrbm8pOwogc3RhdGljIGludCBvY2ZzMl90ZXN0X2JnX2JpdF9hbGxvY2F0YWJsZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJnX2JoLAogCQkJCQkgaW50IG5yKTsKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX3NldF9iaXRzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfc2V0X2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpiZywKIAkJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoLAogCQkJCQkgICAgIHVuc2lnbmVkIGludCBiaXRfb2ZmLAogCQkJCQkgICAgIHVuc2lnbmVkIGludCBudW1fYml0cyk7Ci1zdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ibG9ja19ncm91cF9jbGVhcl9iaXRzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfY2xlYXJfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgICAgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKIAkJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpiZywKIAkJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmgsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYml0X29mZiwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGludCBudW1fYml0cyk7CiAKLXN0YXRpYyBpbnQgb2NmczJfcmVsaW5rX2Jsb2NrX2dyb3VwKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGludCBvY2ZzMl9yZWxpbmtfYmxvY2tfZ3JvdXAoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiZ19iaCwKQEAgLTEwMCw3ICs5OCw3IEBACiAJCQkJICAgIHUxNiBjaGFpbik7CiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ibG9ja19ncm91cF9yZWFzb25hYmx5X2VtcHR5KHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpiZywKIAkJCQkJCSAgICAgdTMyIHdhbnRlZCk7Ci1zdGF0aWMgaW50IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCiAJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCiAJCQkJICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCkBAIC0xMjAsOCArMTE4LDE2IEBACiAKIHZvaWQgb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYykKIHsKLQlpZiAoYWMtPmFjX2lub2RlKQotCQlpcHV0KGFjLT5hY19pbm9kZSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGFjLT5hY19pbm9kZTsKKworCWlmIChpbm9kZSkgeworCQlpZiAoYWMtPmFjX3doaWNoICE9IE9DRlMyX0FDX1VTRV9MT0NBTCkKKwkJCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKKworCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKworCQlpcHV0KGlub2RlKTsKKwl9CiAJaWYgKGFjLT5hY19iaCkKIAkJYnJlbHNlKGFjLT5hY19iaCk7CiAJa2ZyZWUoYWMpOwpAQCAtMTkwLDcgKzE5Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfZmlsbChzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK3N0YXRpYyBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfZmlsbChoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKIAkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmdfYmgsCiAJCQkJICB1NjQgZ3JvdXBfYmxrbm8sCkBAIC0yNzMsNyArMjc5LDcgQEAKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGJoLT5iX2RhdGE7CiAJc3RydWN0IG9jZnMyX2NoYWluX2xpc3QgKmNsOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYyA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUgPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCXUzMiBiaXRfb2ZmLCBudW1fYml0czsKIAl1MTYgYWxsb2NfcmVjOwogCXU2NCBiZ19ibGtubzsKQEAgLTI4NCwxNiArMjkwLDggQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0JaGFuZGxlID0gb2NmczJfYWxsb2NfaGFuZGxlKG9zYik7Ci0JaWYgKCFoYW5kbGUpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7Ci0JfQotCiAJY2wgPSAmZmUtPmlkMi5pX2NoYWluOwogCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLAotCQkJCQloYW5kbGUsCiAJCQkJCWxlMTZfdG9fY3B1KGNsLT5jbF9jcGcpLAogCQkJCQkmYWMpOwogCWlmIChzdGF0dXMgPCAwKSB7CkBAIC0zMDQsNyArMzAyLDcgQEAKIAogCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2dyb3VwX2FsbG9jX2NyZWRpdHMob3NiLT5zYiwKIAkJCQkJCSBsZTE2X3RvX2NwdShjbC0+Y2xfY3BnKSk7Ci0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBoYW5kbGUsIGNyZWRpdHMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTM4OSw3ICszODcsNyBAQAogCXN0YXR1cyA9IDA7CiBiYWlsOgogCWlmIChoYW5kbGUpCi0JCW9jZnMyX2NvbW1pdF90cmFucyhoYW5kbGUpOworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiAJaWYgKGFjKQogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoYWMpOwpAQCAtNDAyLDI3ICs0MDAsMzggQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9yZXNlcnZlX3N1YmFsbG9jX2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYykKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAorCQkJCSAgICAgICBpbnQgdHlwZSwKKwkJCQkgICAgICAgdTMyIHNsb3QpCiB7CiAJaW50IHN0YXR1czsKIAl1MzIgYml0c193YW50ZWQgPSBhYy0+YWNfYml0c193YW50ZWQ7Ci0Jc3RydWN0IGlub2RlICphbGxvY19pbm9kZSA9IGFjLT5hY19pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gYWMtPmFjX2hhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKIAl1MzIgZnJlZV9iaXRzOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlCVUdfT04oaGFuZGxlLT5mbGFncyAmIE9DRlMyX0hBTkRMRV9TVEFSVEVEKTsKLQotCW9jZnMyX2hhbmRsZV9hZGRfaW5vZGUoaGFuZGxlLCBhbGxvY19pbm9kZSk7Ci0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGFsbG9jX2lub2RlLCBoYW5kbGUsICZiaCwgMSk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CisJYWxsb2NfaW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLCB0eXBlLCBzbG90KTsKKwlpZiAoIWFsbG9jX2lub2RlKSB7CisJCW1sb2dfZXJybm8oLUVJTlZBTCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCW11dGV4X2xvY2soJmFsbG9jX2lub2RlLT5pX211dGV4KTsKKworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhhbGxvY19pbm9kZSwgJmJoLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltdXRleF91bmxvY2soJmFsbG9jX2lub2RlLT5pX211dGV4KTsKKwkJaXB1dChhbGxvY19pbm9kZSk7CisKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWFjLT5hY19pbm9kZSA9IGFsbG9jX2lub2RlOworCiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBiaC0+Yl9kYXRhOwogCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewogCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERShhbGxvY19pbm9kZS0+aV9zYiwgZmUpOwpAQCAtNDczLDE0ICs0ODIsMTMgQEAKIH0KIAogaW50IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMpCiB7CiAJaW50IHN0YXR1czsKLQlzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlID0gTlVMTDsKKwl1MzIgc2xvdDsKIAotCSphYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJKmFjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISgqYWMpKSB7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTQ4OCwyOCArNDk2LDE4IEBACiAJfQogCiAJKCphYyktPmFjX2JpdHNfd2FudGVkID0gb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKGZlKTsKLQkoKmFjKS0+YWNfaGFuZGxlID0gaGFuZGxlOwogCSgqYWMpLT5hY193aGljaCA9IE9DRlMyX0FDX1VTRV9NRVRBOwogCiAjaWZuZGVmIE9DRlMyX1VTRV9BTExfTUVUQURBVEFfU1VCQUxMT0NBVE9SUwotCWFsbG9jX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKLQkJCQkJCSAgRVhURU5UX0FMTE9DX1NZU1RFTV9JTk9ERSwKLQkJCQkJCSAgMCk7CisJc2xvdCA9IDA7CiAjZWxzZQotCWFsbG9jX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwKLQkJCQkJCSAgRVhURU5UX0FMTE9DX1NZU1RFTV9JTk9ERSwKLQkJCQkJCSAgb3NiLT5zbG90X251bSk7CisJc2xvdCA9IG9zYi0+c2xvdF9udW07CiAjZW5kaWYKLQlpZiAoIWFsbG9jX2lub2RlKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KIAotCSgqYWMpLT5hY19pbm9kZSA9IGlncmFiKGFsbG9jX2lub2RlKTsKIAkoKmFjKS0+YWNfZ3JvdXBfc2VhcmNoID0gb2NmczJfYmxvY2tfZ3JvdXBfc2VhcmNoOwogCi0Jc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKG9zYiwgKCphYykpOworCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhvc2IsICgqYWMpLAorCQkJCQkgICAgIEVYVEVOVF9BTExPQ19TWVNURU1fSU5PREUsIHNsb3QpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTUyMywyMSArNTIxLDE2IEBACiAJCSphYyA9IE5VTEw7CiAJfQogCi0JaWYgKGFsbG9jX2lub2RlKQotCQlpcHV0KGFsbG9jX2lub2RlKTsKLQogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIGludCBvY2ZzMl9yZXNlcnZlX25ld19pbm9kZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmFjKQogewogCWludCBzdGF0dXM7Ci0Jc3RydWN0IGlub2RlICphbGxvY19pbm9kZSA9IE5VTEw7CiAKLQkqYWMgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCksIEdGUF9LRVJORUwpOworCSphYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEoKmFjKSkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01NDUsMjIgKzUzOCwxMyBAQAogCX0KIAogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IDE7Ci0JKCphYyktPmFjX2hhbmRsZSA9IGhhbmRsZTsKIAkoKmFjKS0+YWNfd2hpY2ggPSBPQ0ZTMl9BQ19VU0VfSU5PREU7CiAKLQlhbGxvY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCi0JCQkJCQkgIElOT0RFX0FMTE9DX1NZU1RFTV9JTk9ERSwKLQkJCQkJCSAgb3NiLT5zbG90X251bSk7Ci0JaWYgKCFhbGxvY19pbm9kZSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQkoKmFjKS0+YWNfaW5vZGUgPSBpZ3JhYihhbGxvY19pbm9kZSk7CiAJKCphYyktPmFjX2dyb3VwX3NlYXJjaCA9IG9jZnMyX2Jsb2NrX2dyb3VwX3NlYXJjaDsKIAotCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhvc2IsICphYyk7CisJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKG9zYiwgKmFjLAorCQkJCQkgICAgIElOT0RFX0FMTE9DX1NZU1RFTV9JTk9ERSwKKwkJCQkJICAgICBvc2ItPnNsb3RfbnVtKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01NzQsOSArNTU4LDYgQEAKIAkJKmFjID0gTlVMTDsKIAl9CiAKLQlpZiAoYWxsb2NfaW5vZGUpCi0JCWlwdXQoYWxsb2NfaW5vZGUpOwotCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTU4OCwyMCArNTY5LDE3IEBACiB7CiAJaW50IHN0YXR1czsKIAotCWFjLT5hY19pbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsCi0JCQkJCQkgICBHTE9CQUxfQklUTUFQX1NZU1RFTV9JTk9ERSwKLQkJCQkJCSAgIE9DRlMyX0lOVkFMSURfU0xPVCk7Ci0JaWYgKCFhYy0+YWNfaW5vZGUpIHsKLQkJc3RhdHVzID0gLUVJTlZBTDsKLQkJbWxvZyhNTF9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgYml0bWFwIGlub2RlIVxuIik7Ci0JCWdvdG8gYmFpbDsKLQl9CiAJYWMtPmFjX3doaWNoID0gT0NGUzJfQUNfVVNFX01BSU47CiAJYWMtPmFjX2dyb3VwX3NlYXJjaCA9IG9jZnMyX2NsdXN0ZXJfZ3JvdXBfc2VhcmNoOwogCi0Jc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9zdWJhbGxvY19iaXRzKG9zYiwgYWMpOwotCWlmIChzdGF0dXMgPCAwICYmIHN0YXR1cyAhPSAtRU5PU1BDKQorCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfc3ViYWxsb2NfYml0cyhvc2IsIGFjLAorCQkJCQkgICAgIEdMT0JBTF9CSVRNQVBfU1lTVEVNX0lOT0RFLAorCQkJCQkgICAgIE9DRlMyX0lOVkFMSURfU0xPVCk7CisJaWYgKHN0YXR1cyA8IDAgJiYgc3RhdHVzICE9IC1FTk9TUEMpIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGJhaWw7CisJfQorCiBiYWlsOgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC02MTAsNyArNTg4LDYgQEAKICAqIHVzZSBzbyB3ZSBmaWd1cmUgaXQgb3V0IGZvciB0aGVtLCBidXQgdW5mb3J0dW5hdGVseSB0aGlzIGNsdXR0ZXJzCiAgKiB0aGluZ3MgYSBiaXQuICovCiBpbnQgb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJICAgdTMyIGJpdHNfd2FudGVkLAogCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiphYykKIHsKQEAgLTYxOCw5ICs1OTUsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlCVUdfT04oIWhhbmRsZSk7Ci0KLQkqYWMgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCksIEdGUF9LRVJORUwpOworCSphYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEoKmFjKSkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC02MjgsMTIgKzYwMywxMCBAQAogCX0KIAogCSgqYWMpLT5hY19iaXRzX3dhbnRlZCA9IGJpdHNfd2FudGVkOwotCSgqYWMpLT5hY19oYW5kbGUgPSBoYW5kbGU7CiAKIAlzdGF0dXMgPSAtRU5PU1BDOwogCWlmIChvY2ZzMl9hbGxvY19zaG91bGRfdXNlX2xvY2FsKG9zYiwgYml0c193YW50ZWQpKSB7CiAJCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbG9jYWxfYWxsb2NfYml0cyhvc2IsCi0JCQkJCQkJaGFuZGxlLAogCQkJCQkJCWJpdHNfd2FudGVkLAogCQkJCQkJCSphYyk7CiAJCWlmICgoc3RhdHVzIDwgMCkgJiYgKHN0YXR1cyAhPSAtRU5PU1BDKSkgewpAQCAtNzc0LDcgKzc0Nyw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgb2NmczJfYmxvY2tfZ3JvdXBfc2V0X2JpdHMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ibG9ja19ncm91cF9zZXRfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCiAJCQkJCSAgICAgc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnLAogCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmgsCkBAIC04NDUsNyArODE4LDcgQEAKIAlyZXR1cm4gYmVzdDsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9yZWxpbmtfYmxvY2tfZ3JvdXAoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW50IG9jZnMyX3JlbGlua19ibG9ja19ncm91cChoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJnX2JoLApAQCAtMTAyNSw3ICs5OTgsNyBAQAogfQogCiBzdGF0aWMgaW50IG9jZnMyX2FsbG9jX2Rpbm9kZV91cGRhdGVfY291bnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAogCQkJCSAgICAgICB1MzIgbnVtX2JpdHMsCiAJCQkJICAgICAgIHUxNiBjaGFpbikKQEAgLTEwNTUsNiArMTAyOCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfc2VhcmNoX29uZV9ncm91cChzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCisJCQkJICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgdTMyIGJpdHNfd2FudGVkLAogCQkJCSAgdTMyIG1pbl9iaXRzLAogCQkJCSAgdTE2ICpiaXRfb2ZmLApAQCAtMTA2Nyw3ICsxMDQxLDYgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqZ2Q7CiAJc3RydWN0IGlub2RlICphbGxvY19pbm9kZSA9IGFjLT5hY19pbm9kZTsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSA9IGFjLT5hY19oYW5kbGU7CiAKIAlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGFsbG9jX2lub2RlLT5pX3NiKSwgZ2RfYmxrbm8sCiAJCQkgICAgICAgJmdyb3VwX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGFsbG9jX2lub2RlKTsKQEAgLTExMTUsNiArMTA4OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfc2VhcmNoX2NoYWluKHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYywKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICB1MzIgYml0c193YW50ZWQsCiAJCQkgICAgICB1MzIgbWluX2JpdHMsCiAJCQkgICAgICB1MTYgKmJpdF9vZmYsCkBAIC0xMTI2LDcgKzExMDAsNiBAQAogCXUxNiBjaGFpbiwgdG1wX2JpdHM7CiAJdTMyIHRtcF91c2VkOwogCXU2NCBuZXh0X2dyb3VwOwotCXN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlID0gYWMtPmFjX2hhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlID0gYWMtPmFjX2lub2RlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqcHJldl9ncm91cF9iaCA9IE5VTEw7CkBAIC0xMjcyLDYgKzEyNDUsNyBAQAogLyogd2lsbCBnaXZlIG91dCB1cCB0byBiaXRzX3dhbnRlZCBjb250aWd1b3VzIGJpdHMuICovCiBzdGF0aWMgaW50IG9jZnMyX2NsYWltX3N1YmFsbG9jX2JpdHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgdTMyIGJpdHNfd2FudGVkLAogCQkJCSAgICAgdTMyIG1pbl9iaXRzLAogCQkJCSAgICAgdTE2ICpiaXRfb2ZmLApAQCAtMTMxMyw4ICsxMjg3LDggQEAKIAkJICogYnkganVtcGluZyBzdHJhaWdodCB0byB0aGUgbW9zdCByZWNlbnRseSB1c2VkCiAJCSAqIGFsbG9jYXRpb24gZ3JvdXAuIFRoaXMgaGVscHMgdXMgbWFudGFpbiBzb21lCiAJCSAqIGNvbnRpZ3VvdXNuZXNzIGFjcm9zcyBhbGxvY2F0aW9ucy4gKi8KLQkJc3RhdHVzID0gb2NmczJfc2VhcmNoX29uZV9ncm91cChhYywgYml0c193YW50ZWQsIG1pbl9iaXRzLAotCQkJCQkJYml0X29mZiwgbnVtX2JpdHMsCisJCXN0YXR1cyA9IG9jZnMyX3NlYXJjaF9vbmVfZ3JvdXAoYWMsIGhhbmRsZSwgYml0c193YW50ZWQsCisJCQkJCQltaW5fYml0cywgYml0X29mZiwgbnVtX2JpdHMsCiAJCQkJCQloaW50X2Jsa25vLCAmYml0c19sZWZ0KTsKIAkJaWYgKCFzdGF0dXMpIHsKIAkJCS8qIEJlIGNhcmVmdWwgdG8gdXBkYXRlICpiZ19ibGtubyBoZXJlIGFzIHRoZQpAQCAtMTMzNiw3ICsxMzEwLDcgQEAKIAlhYy0+YWNfY2hhaW4gPSB2aWN0aW07CiAJYWMtPmFjX2FsbG93X2NoYWluX3JlbGluayA9IDE7CiAKLQlzdGF0dXMgPSBvY2ZzMl9zZWFyY2hfY2hhaW4oYWMsIGJpdHNfd2FudGVkLCBtaW5fYml0cywgYml0X29mZiwKKwlzdGF0dXMgPSBvY2ZzMl9zZWFyY2hfY2hhaW4oYWMsIGhhbmRsZSwgYml0c193YW50ZWQsIG1pbl9iaXRzLCBiaXRfb2ZmLAogCQkJCSAgICBudW1fYml0cywgYmdfYmxrbm8sICZiaXRzX2xlZnQpOwogCWlmICghc3RhdHVzKQogCQlnb3RvIHNldF9oaW50OwpAQCAtMTM2MCw3ICsxMzM0LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWFjLT5hY19jaGFpbiA9IGk7Ci0JCXN0YXR1cyA9IG9jZnMyX3NlYXJjaF9jaGFpbihhYywgYml0c193YW50ZWQsIG1pbl9iaXRzLAorCQlzdGF0dXMgPSBvY2ZzMl9zZWFyY2hfY2hhaW4oYWMsIGhhbmRsZSwgYml0c193YW50ZWQsIG1pbl9iaXRzLAogCQkJCQkgICAgYml0X29mZiwgbnVtX2JpdHMsIGJnX2Jsa25vLAogCQkJCQkgICAgJmJpdHNfbGVmdCk7CiAJCWlmICghc3RhdHVzKQpAQCAtMTM4OCw3ICsxMzYyLDcgQEAKIH0KIAogaW50IG9jZnMyX2NsYWltX21ldGFkYXRhKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorCQkJIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAogCQkJIHUzMiBiaXRzX3dhbnRlZCwKIAkJCSB1MTYgKnN1YmFsbG9jX2JpdF9zdGFydCwKQEAgLTE0MDEsMTAgKzEzNzUsMTAgQEAKIAlCVUdfT04oIWFjKTsKIAlCVUdfT04oYWMtPmFjX2JpdHNfd2FudGVkIDwgKGFjLT5hY19iaXRzX2dpdmVuICsgYml0c193YW50ZWQpKTsKIAlCVUdfT04oYWMtPmFjX3doaWNoICE9IE9DRlMyX0FDX1VTRV9NRVRBKTsKLQlCVUdfT04oYWMtPmFjX2hhbmRsZSAhPSBoYW5kbGUpOwogCiAJc3RhdHVzID0gb2NmczJfY2xhaW1fc3ViYWxsb2NfYml0cyhvc2IsCiAJCQkJCSAgIGFjLAorCQkJCQkgICBoYW5kbGUsCiAJCQkJCSAgIGJpdHNfd2FudGVkLAogCQkJCQkgICAxLAogCQkJCQkgICBzdWJhbGxvY19iaXRfc3RhcnQsCkBAIC0xNDI1LDcgKzEzOTksNyBAQAogfQogCiBpbnQgb2NmczJfY2xhaW1fbmV3X2lub2RlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAogCQkJICB1MTYgKnN1YmFsbG9jX2JpdCwKIAkJCSAgdTY0ICpmZV9ibGtubykKQEAgLTE0NDAsMTAgKzE0MTQsMTAgQEAKIAlCVUdfT04oYWMtPmFjX2JpdHNfZ2l2ZW4gIT0gMCk7CiAJQlVHX09OKGFjLT5hY19iaXRzX3dhbnRlZCAhPSAxKTsKIAlCVUdfT04oYWMtPmFjX3doaWNoICE9IE9DRlMyX0FDX1VTRV9JTk9ERSk7Ci0JQlVHX09OKGFjLT5hY19oYW5kbGUgIT0gaGFuZGxlKTsKIAogCXN0YXR1cyA9IG9jZnMyX2NsYWltX3N1YmFsbG9jX2JpdHMob3NiLAogCQkJCQkgICBhYywKKwkJCQkJICAgaGFuZGxlLAogCQkJCQkgICAxLAogCQkJCQkgICAxLAogCQkJCQkgICBzdWJhbGxvY19iaXQsCkBAIC0xNTI4LDcgKzE1MDIsNyBAQAogICogb2YgYW55IHNpemUuCiAgKi8KIGludCBvY2ZzMl9jbGFpbV9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSBoYW5kbGVfdCAqaGFuZGxlLAogCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICphYywKIAkJCSB1MzIgbWluX2NsdXN0ZXJzLAogCQkJIHUzMiAqY2x1c3Rlcl9zdGFydCwKQEAgLTE1NDYsNyArMTUyMCw2IEBACiAKIAlCVUdfT04oYWMtPmFjX3doaWNoICE9IE9DRlMyX0FDX1VTRV9MT0NBTAogCSAgICAgICAmJiBhYy0+YWNfd2hpY2ggIT0gT0NGUzJfQUNfVVNFX01BSU4pOwotCUJVR19PTihhYy0+YWNfaGFuZGxlICE9IGhhbmRsZSk7CiAKIAlpZiAoYWMtPmFjX3doaWNoID09IE9DRlMyX0FDX1VTRV9MT0NBTCkgewogCQlzdGF0dXMgPSBvY2ZzMl9jbGFpbV9sb2NhbF9hbGxvY19iaXRzKG9zYiwKQEAgLTE1NzIsNiArMTU0NSw3IEBACiAKIAkJc3RhdHVzID0gb2NmczJfY2xhaW1fc3ViYWxsb2NfYml0cyhvc2IsCiAJCQkJCQkgICBhYywKKwkJCQkJCSAgIGhhbmRsZSwKIAkJCQkJCSAgIGJpdHNfd2FudGVkLAogCQkJCQkJICAgbWluX2NsdXN0ZXJzLAogCQkJCQkJICAgJmJnX2JpdF9vZmYsCkBAIC0xNTk4LDcgKzE1NzIsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2Jsb2NrX2dyb3VwX2NsZWFyX2JpdHMoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ibG9ja19ncm91cF9jbGVhcl9iaXRzKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnLAogCQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9iaCwKQEAgLTE2NTMsNyArMTYyNyw3IEBACiAvKgogICogZXhwZWN0cyB0aGUgc3ViYWxsb2MgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAorc3RhdGljIGludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKIAkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19iaCwKIAkJCQkgICAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCwKQEAgLTE3MzcsNyArMTcxMSw3IEBACiAJcmV0dXJuIGdyb3VwOwogfQogCi1pbnQgb2NmczJfZnJlZV9kaW5vZGUoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitpbnQgb2NmczJfZnJlZV9kaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwKIAkJICAgICAgc3RydWN0IGlub2RlICppbm9kZV9hbGxvY19pbm9kZSwKIAkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9hbGxvY19iaCwKIAkJICAgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkpCkBAIC0xNzUwLDcgKzE3MjQsNyBAQAogCQkJCQlpbm9kZV9hbGxvY19iaCwgYml0LCBiZ19ibGtubywgMSk7CiB9CiAKLWludCBvY2ZzMl9mcmVlX2V4dGVudF9ibG9jayhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9mcmVlX2V4dGVudF9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJICAgIHN0cnVjdCBpbm9kZSAqZWJfYWxsb2NfaW5vZGUsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9hbGxvY19iaCwKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYikKQEAgLTE3NjMsNyArMTczNyw3IEBACiAJCQkJCWJpdCwgYmdfYmxrbm8sIDEpOwogfQogCi1pbnQgb2NmczJfZnJlZV9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKK2ludCBvY2ZzMl9mcmVlX2NsdXN0ZXJzKGhhbmRsZV90ICpoYW5kbGUsCiAJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmJpdG1hcF9pbm9kZSwKIAkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLAogCQkgICAgICAgdTY0IHN0YXJ0X2JsaywKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1YmFsbG9jLmggYi9mcy9vY2ZzMi9zdWJhbGxvYy5oCmluZGV4IGM3ODc4MzguLjFhM2M5NGMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1YmFsbG9jLmgKKysrIGIvZnMvb2NmczIvc3ViYWxsb2MuaApAQCAtNDMsNyArNDMsNiBAQAogI2RlZmluZSBPQ0ZTMl9BQ19VU0VfSU5PREUgMwogI2RlZmluZSBPQ0ZTMl9BQ19VU0VfTUVUQSAgNAogCXUzMiAgICBhY193aGljaDsKLQlzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmFjX2hhbmRsZTsKIAogCS8qIHRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBjaGFpbiBzZWFyY2ggKi8KIAl1MTYgICAgYWNfY2hhaW47CkBAIC02MCw0NSArNTksNDIgQEAKIH0KIAogaW50IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMpOwogaW50IG9jZnMyX3Jlc2VydmVfbmV3X2lub2RlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgIHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAogCQkJICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMpOwogaW50IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKIAkJCSAgIHUzMiBiaXRzX3dhbnRlZCwKIAkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqYWMpOwogCiBpbnQgb2NmczJfY2xhaW1fbWV0YWRhdGEoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCiAJCQkgdTMyIGJpdHNfd2FudGVkLAogCQkJIHUxNiAqc3ViYWxsb2NfYml0X3N0YXJ0LAogCQkJIHUzMiAqbnVtX2JpdHMsCiAJCQkgdTY0ICpibGtub19zdGFydCk7CiBpbnQgb2NmczJfY2xhaW1fbmV3X2lub2RlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICBzdHJ1Y3Qgb2NmczJfam91cm5hbF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmFjLAogCQkJICB1MTYgKnN1YmFsbG9jX2JpdCwKIAkJCSAgdTY0ICpmZV9ibGtubyk7CiBpbnQgb2NmczJfY2xhaW1fY2x1c3RlcnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCisJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqYWMsCiAJCQkgdTMyIG1pbl9jbHVzdGVycywKIAkJCSB1MzIgKmNsdXN0ZXJfc3RhcnQsCiAJCQkgdTMyICpudW1fY2x1c3RlcnMpOwogCi1pbnQgb2NmczJfZnJlZV9kaW5vZGUoc3RydWN0IG9jZnMyX2pvdXJuYWxfaGFuZGxlICpoYW5kbGUsCitpbnQgb2NmczJfZnJlZV9kaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwKIAkJICAgICAgc3RydWN0IGlub2RlICppbm9kZV9hbGxvY19pbm9kZSwKIAkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9hbGxvY19iaCwKIAkJICAgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkpOwotaW50IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50IG9jZnMyX2ZyZWVfZXh0ZW50X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgc3RydWN0IGlub2RlICplYl9hbGxvY19pbm9kZSwKIAkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2FsbG9jX2JoLAogCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViKTsKLWludCBvY2ZzMl9mcmVlX2NsdXN0ZXJzKHN0cnVjdCBvY2ZzMl9qb3VybmFsX2hhbmRsZSAqaGFuZGxlLAoraW50IG9jZnMyX2ZyZWVfY2x1c3RlcnMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBpbm9kZSAqYml0bWFwX2lub2RlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCiAJCQl1NjQgc3RhcnRfYmxrLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggNzZiNDZlYi4uNmUzMDBhOCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC02OCw5ICs2OCw3IEBACiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpvY2ZzMl9pbm9kZV9jYWNoZXAgPSBOVUxMOwotCi1rbWVtX2NhY2hlX3QgKm9jZnMyX2xvY2tfY2FjaGUgPSBOVUxMOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpvY2ZzMl9pbm9kZV9jYWNoZXAgPSBOVUxMOwogCiAvKiBPQ0ZTMiBuZWVkcyB0byBzY2hlZHVsZSBzZXZlcmFsIGRpZmZlcm50IHR5cGVzIG9mIHdvcmsgd2hpY2gKICAqIHJlcXVpcmUgY2x1c3RlciBsb2NraW5nLCBkaXNrIEkvTywgcmVjb3Zlcnkgd2FpdHMsIGV0Yy4gU2luY2UgdGhlc2UKQEAgLTE0MSw2ICsxMzksNyBAQAogCU9wdF9oYl9sb2NhbCwKIAlPcHRfZGF0YV9vcmRlcmVkLAogCU9wdF9kYXRhX3dyaXRlYmFjaywKKwlPcHRfYXRpbWVfcXVhbnR1bSwKIAlPcHRfZXJyLAogfTsKIApAQCAtMTU0LDYgKzE1Myw3IEBACiAJe09wdF9oYl9sb2NhbCwgT0NGUzJfSEJfTE9DQUx9LAogCXtPcHRfZGF0YV9vcmRlcmVkLCAiZGF0YT1vcmRlcmVkIn0sCiAJe09wdF9kYXRhX3dyaXRlYmFjaywgImRhdGE9d3JpdGViYWNrIn0sCisJe09wdF9hdGltZV9xdWFudHVtLCAiYXRpbWVfcXVhbnR1bT0ldSJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKIApAQCAtMzAzLDcgKzMwMyw3IEBACiB7CiAJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pOwogCi0Jb2kgPSBrbWVtX2NhY2hlX2FsbG9jKG9jZnMyX2lub2RlX2NhY2hlcCwgU0xBQl9OT0ZTKTsKKwlvaSA9IGttZW1fY2FjaGVfYWxsb2Mob2NmczJfaW5vZGVfY2FjaGVwLCBHRlBfTk9GUyk7CiAJaWYgKCFvaSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTUwOCw2ICs1MDgsMjcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgaW50IG9jZnMyX3ZlcmlmeV9oZWFydGJlYXQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpIHsKKwkJaWYgKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9IQl9MT0NBTCkgeworCQkJbWxvZyhNTF9FUlJPUiwgIkNhbm5vdCBoZWFydGJlYXQgb24gYSBsb2NhbGx5ICIKKwkJCSAgICAgIm1vdW50ZWQgZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmICghKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9IQl9MT0NBTCkpIHsKKwkJaWYgKCFvY2ZzMl9tb3VudF9sb2NhbChvc2IpICYmICFvY2ZzMl9pc19oYXJkX3JlYWRvbmx5KG9zYikpIHsKKwkJCW1sb2coTUxfRVJST1IsICJIZWFydGJlYXQgaGFzIHRvIGJlIHN0YXJ0ZWQgdG8gbW91bnQgIgorCQkJICAgICAiYSByZWFkLXdyaXRlIGNsdXN0ZXJlZCBkZXZpY2UuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgb2NmczJfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQogewogCXN0cnVjdCBkZW50cnkgKnJvb3Q7CkBAIC01MTYsMTYgKzUzNywyNCBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwljaGFyIG5vZGVzdHJbOF07CiAKIAltbG9nX2VudHJ5KCIlcCwgJXAsICVpIiwgc2IsIGRhdGEsIHNpbGVudCk7CiAKLQkvKiBmb3Igbm93IHdlIG9ubHkgaGF2ZSBvbmUgY2x1c3Rlci9ub2RlLCBtYWtlIHN1cmUgd2Ugc2VlIGl0Ci0JICogaW4gdGhlIGhlYXJ0YmVhdCB1bml2ZXJzZSAqLwotCWlmICghbzJoYl9jaGVja19sb2NhbF9ub2RlX2hlYXJ0YmVhdGluZygpKSB7CisJaWYgKCFvY2ZzMl9wYXJzZV9vcHRpb25zKHNiLCBkYXRhLCAmcGFyc2VkX29wdCwgMCkpIHsKIAkJc3RhdHVzID0gLUVJTlZBTDsKIAkJZ290byByZWFkX3N1cGVyX2Vycm9yOwogCX0KIAorCS8qIGZvciBub3cgd2Ugb25seSBoYXZlIG9uZSBjbHVzdGVyL25vZGUsIG1ha2Ugc3VyZSB3ZSBzZWUgaXQKKwkgKiBpbiB0aGUgaGVhcnRiZWF0IHVuaXZlcnNlICovCisJaWYgKHBhcnNlZF9vcHQgJiBPQ0ZTMl9NT1VOVF9IQl9MT0NBTCkgeworCQlpZiAoIW8yaGJfY2hlY2tfbG9jYWxfbm9kZV9oZWFydGJlYXRpbmcoKSkgeworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCWdvdG8gcmVhZF9zdXBlcl9lcnJvcjsKKwkJfQorCX0KKwogCS8qIHByb2JlIGZvciBzdXBlcmJsb2NrICovCiAJc3RhdHVzID0gb2NmczJfc2JfcHJvYmUoc2IsICZiaCwgJnNlY3Rvcl9zaXplKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtNTQxLDExICs1NzAsNiBAQAogCX0KIAlicmVsc2UoYmgpOwogCWJoID0gTlVMTDsKLQotCWlmICghb2NmczJfcGFyc2Vfb3B0aW9ucyhzYiwgZGF0YSwgJnBhcnNlZF9vcHQsIDApKSB7Ci0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCWdvdG8gcmVhZF9zdXBlcl9lcnJvcjsKLQl9CiAJb3NiLT5zX21vdW50X29wdCA9IHBhcnNlZF9vcHQ7CiAKIAlzYi0+c19tYWdpYyA9IE9DRlMyX1NVUEVSX01BR0lDOwpAQCAtNTg4LDIxICs2MTIsMTYgQEAKIAl9CiAKIAlpZiAoIW9jZnMyX2lzX2hhcmRfcmVhZG9ubHkob3NiKSkgewotCQkvKiBJZiB0aGlzIGlzbid0IGEgaGFyZCByZWFkb25seSBtb3VudCwgdGhlbiB3ZSBuZWVkCi0JCSAqIHRvIG1ha2Ugc3VyZSB0aGF0IGhlYXJ0YmVhdCBpcyBpbiBhIHZhbGlkIHN0YXRlLAotCQkgKiBhbmQgdGhhdCB3ZSBtYXJrIG91cnNlbHZlcyBzb2Z0IHJlYWRvbmx5IGlzIC1vcm8KLQkJICogd2FzIHNwZWNpZmllZC4gKi8KLQkJaWYgKCEob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX0hCX0xPQ0FMKSkgewotCQkJbWxvZyhNTF9FUlJPUiwgIk5vIGhlYXJ0YmVhdCBmb3IgZGV2aWNlICglcylcbiIsCi0JCQkgICAgIHNiLT5zX2lkKTsKLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHJlYWRfc3VwZXJfZXJyb3I7Ci0JCX0KLQogCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCiAJCQlvY2ZzMl9zZXRfcm9fZmxhZyhvc2IsIDApOwogCX0KIAorCXN0YXR1cyA9IG9jZnMyX3ZlcmlmeV9oZWFydGJlYXQob3NiKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gcmVhZF9zdXBlcl9lcnJvcjsKKwl9CisKIAlvc2ItPm9zYl9kZWJ1Z19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKG9zYi0+dXVpZF9zdHIsCiAJCQkJCQkgb2NmczJfZGVidWdmc19yb290KTsKIAlpZiAoIW9zYi0+b3NiX2RlYnVnX3Jvb3QpIHsKQEAgLTYzNSw5ICs2NTQsMTQgQEAKIAogCW9jZnMyX2NvbXBsZXRlX21vdW50X3JlY292ZXJ5KG9zYik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJvY2ZzMjogTW91bnRpbmcgZGV2aWNlICglcykgb24gKG5vZGUgJWQsIHNsb3QgJWQpICIKKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJc25wcmludGYobm9kZXN0ciwgc2l6ZW9mKG5vZGVzdHIpLCAibG9jYWwiKTsKKwllbHNlCisJCXNucHJpbnRmKG5vZGVzdHIsIHNpemVvZihub2Rlc3RyKSwgIiVkIiwgb3NiLT5ub2RlX251bSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJvY2ZzMjogTW91bnRpbmcgZGV2aWNlICglcykgb24gKG5vZGUgJXMsIHNsb3QgJWQpICIKIAkgICAgICAgIndpdGggJXMgZGF0YSBtb2RlLlxuIiwKLQkgICAgICAgb3NiLT5kZXZfc3RyLCBvc2ItPm5vZGVfbnVtLCBvc2ItPnNsb3RfbnVtLAorCSAgICAgICBvc2ItPmRldl9zdHIsIG5vZGVzdHIsIG9zYi0+c2xvdF9udW0sCiAJICAgICAgIG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9EQVRBX1dSSVRFQkFDSyA/ICJ3cml0ZWJhY2siIDoKIAkgICAgICAgIm9yZGVyZWQiKTsKIApAQCAtNzA3LDYgKzczMSw3IEBACiAJd2hpbGUgKChwID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CiAJCWludCB0b2tlbiwgb3B0aW9uOwogCQlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJCXN0cnVjdCBvY2ZzMl9zdXBlciAqIG9zYiA9IE9DRlMyX1NCKHNiKTsKIAogCQlpZiAoISpwKQogCQkJY29udGludWU7CkBAIC03NDcsNiArNzcyLDE2IEBACiAJCWNhc2UgT3B0X2RhdGFfd3JpdGViYWNrOgogCQkJKm1vdW50X29wdCB8PSBPQ0ZTMl9NT1VOVF9EQVRBX1dSSVRFQkFDSzsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9hdGltZV9xdWFudHVtOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpIHsKKwkJCQlzdGF0dXMgPSAwOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChvcHRpb24gPj0gMCkKKwkJCQlvc2ItPnNfYXRpbWVfcXVhbnR1bSA9IG9wdGlvbjsKKwkJCWVsc2UKKwkJCQlvc2ItPnNfYXRpbWVfcXVhbnR1bSA9IE9DRlMyX0RFRkFVTFRfQVRJTUVfUVVBTlRVTTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJbWxvZyhNTF9FUlJPUiwKIAkJCSAgICAgIlVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKQEAgLTg2Nyw3ICs5MDIsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCBOVUxMLCAmYmgsIDApOworCXN0YXR1cyA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmJoLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTkwMyw3ICs5MzgsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBvY2ZzMl9pbm9kZV9pbml0X29uY2Uodm9pZCAqZGF0YSwKLQkJCQkgIGttZW1fY2FjaGVfdCAqY2FjaGVwLAorCQkJCSAgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gZGF0YTsKQEAgLTkxNCw5ICs5NDksNyBAQAogCQlvaS0+aXBfb3Blbl9jb3VudCA9IDA7CiAJCXNwaW5fbG9ja19pbml0KCZvaS0+aXBfbG9jayk7CiAJCW9jZnMyX2V4dGVudF9tYXBfaW5pdCgmb2ktPnZmc19pbm9kZSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZvaS0+aXBfaGFuZGxlX2xpc3QpOwogCQlJTklUX0xJU1RfSEVBRCgmb2ktPmlwX2lvX21hcmtlcnMpOwotCQlvaS0+aXBfaGFuZGxlID0gTlVMTDsKIAkJb2ktPmlwX2NyZWF0ZWRfdHJhbnMgPSAwOwogCQlvaS0+aXBfbGFzdF90cmFucyA9IDA7CiAJCW9pLT5pcF9kaXJfc3RhcnRfbG9va3VwID0gMDsKQEAgLTk0OCwxNCArOTgxLDYgQEAKIAlpZiAoIW9jZnMyX2lub2RlX2NhY2hlcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlvY2ZzMl9sb2NrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoIm9jZnMyX2xvY2siLAotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfam91cm5hbF9sb2NrKSwKLQkJCQkJICAgICAwLAotCQkJCQkgICAgIFNMQUJfSFdDQUNIRV9BTElHTiwKLQkJCQkJICAgICBOVUxMLCBOVUxMKTsKLQlpZiAoIW9jZnMyX2xvY2tfY2FjaGUpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk2MywxMSArOTg4LDggQEAKIHsKIAlpZiAob2NmczJfaW5vZGVfY2FjaGVwKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kob2NmczJfaW5vZGVfY2FjaGVwKTsKLQlpZiAob2NmczJfbG9ja19jYWNoZSkKLQkJa21lbV9jYWNoZV9kZXN0cm95KG9jZnMyX2xvY2tfY2FjaGUpOwogCiAJb2NmczJfaW5vZGVfY2FjaGVwID0gTlVMTDsKLQlvY2ZzMl9sb2NrX2NhY2hlID0gTlVMTDsKIH0KIAogc3RhdGljIGludCBvY2ZzMl9nZXRfc2VjdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0xMDAxLDcgKzEwMjMsMTEgQEAKIAogCS8qIFhYWCBob2xkIGEgcmVmIG9uIHRoZSBub2RlIHdoaWxlIG1vdW50ZT8gIGVhc3kgZW5vdWdoLCBpZgogCSAqIGRlc2lyYWJsZS4gKi8KLQlvc2ItPm5vZGVfbnVtID0gbzJubV90aGlzX25vZGUoKTsKKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJb3NiLT5ub2RlX251bSA9IDA7CisJZWxzZQorCQlvc2ItPm5vZGVfbnVtID0gbzJubV90aGlzX25vZGUoKTsKKwogCWlmIChvc2ItPm5vZGVfbnVtID09IE8yTk1fTUFYX05PREVTKSB7CiAJCW1sb2coTUxfRVJST1IsICJjb3VsZCBub3QgZmluZCB0aGlzIGhvc3QncyBub2RlIG51bWJlclxuIik7CiAJCXN0YXR1cyA9IC1FTk9FTlQ7CkBAIC0xMDg2LDYgKzExMTIsOSBAQAogCQlnb3RvIGxlYXZlOwogCX0KIAorCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlnb3RvIGxlYXZlOworCiAJLyogVGhpcyBzaG91bGQgYmUgc2VudCAqYWZ0ZXIqIHdlIHJlY292ZXJlZCBvdXIgam91cm5hbCBhcyBpdAogCSAqIHdpbGwgY2F1c2Ugb3RoZXIgbm9kZXMgdG8gdW5tYXJrIHVzIGFzIG5lZWRpbmcKIAkgKiByZWNvdmVyeS4gSG93ZXZlciwgd2UgbmVlZCB0byBzZW5kIGl0ICpiZWZvcmUqIGRyb3BwaW5nIHRoZQpAQCAtMTExNiw2ICsxMTQ1LDcgQEAKIHsKIAlpbnQgdG1wOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gTlVMTDsKKwljaGFyIG5vZGVzdHJbOF07CiAKIAltbG9nX2VudHJ5KCIoMHglcClcbiIsIHNiKTsKIApAQCAtMTE3OSw4ICsxMjA5LDEzIEBACiAKIAlhdG9taWNfc2V0KCZvc2ItPnZvbF9zdGF0ZSwgVk9MVU1FX0RJU01PVU5URUQpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAib2NmczI6IFVubW91bnRpbmcgZGV2aWNlICglcykgb24gKG5vZGUgJWQpXG4iLAotCSAgICAgICBvc2ItPmRldl9zdHIsIG9zYi0+bm9kZV9udW0pOworCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlzbnByaW50Zihub2Rlc3RyLCBzaXplb2Yobm9kZXN0ciksICJsb2NhbCIpOworCWVsc2UKKwkJc25wcmludGYobm9kZXN0ciwgc2l6ZW9mKG5vZGVzdHIpLCAiJWQiLCBvc2ItPm5vZGVfbnVtKTsKKworCXByaW50ayhLRVJOX0lORk8gIm9jZnMyOiBVbm1vdW50aW5nIGRldmljZSAoJXMpIG9uIChub2RlICVzKVxuIiwKKwkgICAgICAgb3NiLT5kZXZfc3RyLCBub2Rlc3RyKTsKIAogCW9jZnMyX2RlbGV0ZV9vc2Iob3NiKTsKIAlrZnJlZShvc2IpOwpAQCAtMTE5Niw3ICsxMjMxLDcgQEAKIAogCUJVR19PTih1dWlkX2J5dGVzICE9IE9DRlMyX1ZPTF9VVUlEX0xFTik7CiAKLQlvc2ItPnV1aWRfc3RyID0ga2NhbGxvYygxLCBPQ0ZTMl9WT0xfVVVJRF9MRU4gKiAyICsgMSwgR0ZQX0tFUk5FTCk7CisJb3NiLT51dWlkX3N0ciA9IGt6YWxsb2MoT0NGUzJfVk9MX1VVSURfTEVOICogMiArIDEsIEdGUF9LRVJORUwpOwogCWlmIChvc2ItPnV1aWRfc3RyID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMjI3LDcgKzEyNjIsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlvc2IgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgb2NmczJfc3VwZXIpLCBHRlBfS0VSTkVMKTsKKwlvc2IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb2NmczJfc3VwZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW9zYikgewogCQlzdGF0dXMgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xMjgwLDYgKzEzMTUsOCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9zYi0+Y2hlY2twb2ludF9ldmVudCk7CiAJYXRvbWljX3NldCgmb3NiLT5uZWVkc19jaGVja3BvaW50LCAwKTsKIAorCW9zYi0+c19hdGltZV9xdWFudHVtID0gT0NGUzJfREVGQVVMVF9BVElNRV9RVUFOVFVNOworCiAJb3NiLT5ub2RlX251bSA9IE8yTk1fSU5WQUxJRF9OT0RFX05VTTsKIAlvc2ItPnNsb3RfbnVtID0gT0NGUzJfSU5WQUxJRF9TTE9UOwogCkBAIC0xMzUwLDcgKzEzODcsNyBAQAogCSAqLwogCS8qIGluaXRpYWxpemUgb3VyIGpvdXJuYWwgc3RydWN0dXJlICovCiAKLQlqb3VybmFsID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IG9jZnMyX2pvdXJuYWwpLCBHRlBfS0VSTkVMKTsKKwlqb3VybmFsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX2pvdXJuYWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWpvdXJuYWwpIHsKIAkJbWxvZyhNTF9FUlJPUiwgInVuYWJsZSB0byBhbGxvYyBqb3VybmFsXG4iKTsKIAkJc3RhdHVzID0gLUVOT01FTTsKQEAgLTEzNjUsNyArMTQwMiw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfbG9jayk7CiAJam91cm5hbC0+al90cmFuc19pZCA9ICh1bnNpZ25lZCBsb25nKSAxOwogCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX2xhX2NsZWFudXBzKTsKLQlJTklUX1dPUksoJmpvdXJuYWwtPmpfcmVjb3Zlcnlfd29yaywgb2NmczJfY29tcGxldGVfcmVjb3ZlcnksIG9zYik7CisJSU5JVF9XT1JLKCZqb3VybmFsLT5qX3JlY292ZXJ5X3dvcmssIG9jZnMyX2NvbXBsZXRlX3JlY292ZXJ5KTsKIAlqb3VybmFsLT5qX3N0YXRlID0gT0NGUzJfSk9VUk5BTF9GUkVFOwogCiAJLyogZ2V0IHNvbWUgcHNldWRvIGNvbnN0YW50cyBmb3IgY2x1c3RlcnNpemUgYml0cyAqLwpAQCAtMTUzNiw2ICsxNTczLDcgQEAKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgZGlydHk7CisJaW50IGxvY2FsOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmxvY2FsX2FsbG9jID0gTlVMTDsgLyogb25seSB1c2VkIGlmIHdlCiAJCQkJCQkgICogcmVjb3ZlcgogCQkJCQkJICAqIG91cnNlbHZlcy4gKi8KQEAgLTE1NjMsOCArMTYwMSwxMCBAQAogCQkgICAgICJyZWNvdmVyaW5nIHZvbHVtZS5cbiIpOwogCX0KIAorCWxvY2FsID0gb2NmczJfbW91bnRfbG9jYWwob3NiKTsKKwogCS8qIHdpbGwgcGxheSBiYWNrIGFueXRoaW5nIGxlZnQgaW4gdGhlIGpvdXJuYWwuICovCi0Jb2NmczJfam91cm5hbF9sb2FkKG9zYi0+am91cm5hbCk7CisJb2NmczJfam91cm5hbF9sb2FkKG9zYi0+am91cm5hbCwgbG9jYWwpOwogCiAJaWYgKGRpcnR5KSB7CiAJCS8qIHJlY292ZXIgbXkgbG9jYWwgYWxsb2MgaWYgd2UgZGlkbid0IHVubW91bnQgY2xlYW5seS4gKi8KQEAgLTE2NzQsNyArMTcxNCw3IEBACiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c3ByaW50ZihlcnJvcl9idWYsIGZtdCwgYXJncyk7CisJdnNucHJpbnRmKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwogCiAJLyogTm90IHVzaW5nIG1sb2cgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gc2hvdyB0aGUgYWN0dWFsCkBAIC0xNjk1LDcgKzE3MzUsNyBAQAogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNwcmludGYoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZzbnByaW50ZihlcnJvcl9idWYsIHNpemVvZihlcnJvcl9idWYpLCBmbXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIAogCXByaW50ayhLRVJOX0NSSVQgIk9DRlMyOiBhYm9ydCAoZGV2aWNlICVzKTogJXM6ICVzXG4iLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ltbGluay5jIGIvZnMvb2NmczIvc3ltbGluay5jCmluZGV4IGMwZjY4YWEuLjk1N2Q2ODcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N5bWxpbmsuYworKysgYi9mcy9vY2ZzMi9zeW1saW5rLmMKQEAgLTEyNiw2ICsxMjYsMTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyoKKwkgKiBXaXRob3V0IHZmc21vdW50IHdlIGNhbid0IHVwZGF0ZSBhdGltZSBub3csCisJICogYnV0IHdlIHdpbGwgdXBkYXRlIGF0aW1lIGhlcmUgdWx0aW1hdGVseS4KKwkgKi8KIAlyZXQgPSB2ZnNfcmVhZGxpbmsoZGVudHJ5LCBidWZmZXIsIGJ1ZmxlbiwgbGluayk7CiAKIAlicmVsc2UoYmgpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvdXB0b2RhdGUuYyBiL2ZzL29jZnMyL3VwdG9kYXRlLmMKaW5kZXggOTcwN2VkNy4uMzk4MTRiOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvdXB0b2RhdGUuYworKysgYi9mcy9vY2ZzMi91cHRvZGF0ZS5jCkBAIC02OSw3ICs2OSw3IEBACiAJc2VjdG9yX3QJY19ibG9jazsKIH07CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKm9jZnMyX3VwdG9kYXRlX2NhY2hlcCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm9jZnMyX3VwdG9kYXRlX2NhY2hlcCA9IE5VTEw7CiAKIHZvaWQgb2NmczJfbWV0YWRhdGFfY2FjaGVfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvdm90ZS5jIGIvZnMvb2NmczIvdm90ZS5jCmluZGV4IDViNGRjYTcuLjBhZmQ4YjkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3ZvdGUuYworKysgYi9mcy9vY2ZzMi92b3RlLmMKQEAgLTQ3OSw3ICs0NzksNyBAQAogewogCXN0cnVjdCBvY2ZzMl9uZXRfd2FpdF9jdHh0ICp3OwogCi0JdyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCp3KSwgR0ZQX05PRlMpOworCXcgPSBremFsbG9jKHNpemVvZigqdyksIEdGUF9OT0ZTKTsKIAlpZiAoIXcpIHsKIAkJbWxvZ19lcnJubygtRU5PTUVNKTsKIAkJZ290byBiYWlsOwpAQCAtNjQyLDcgKzY0Miw3IEBACiAKIAlCVUdfT04oIW9jZnMyX2lzX3ZhbGlkX3ZvdGVfcmVxdWVzdCh0eXBlKSk7CiAKLQlyZXF1ZXN0ID0ga2NhbGxvYygxLCBzaXplb2YoKnJlcXVlc3QpLCBHRlBfTk9GUyk7CisJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX05PRlMpOwogCWlmICghcmVxdWVzdCkgewogCQltbG9nX2Vycm5vKC1FTk9NRU0pOwogCX0gZWxzZSB7CkBAIC0xMDAwLDYgKzEwMDAsOSBAQAogewogCWludCBzdGF0dXMgPSAwOwogCisJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCXJldHVybiAwOworCiAJc3RhdHVzID0gbzJuZXRfcmVnaXN0ZXJfaGFuZGxlcihPQ0ZTMl9NRVNTQUdFX1RZUEVfUkVTUE9OU0UsCiAJCQkJCW9zYi0+bmV0X2tleSwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBvY2ZzMl9yZXNwb25zZV9tc2cpLApkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDg5ZTBjMjMuLmM5ODlmYjQgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCWZpbGUgPSBmZ2V0KGZkKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0OwotCWVycm9yID0gdmZzX3N0YXRmc19uYXRpdmUoZmlsZS0+Zl9kZW50cnksICZ0bXApOworCWVycm9yID0gdmZzX3N0YXRmc19uYXRpdmUoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgJnRtcCk7CiAJaWYgKCFlcnJvciAmJiBjb3B5X3RvX3VzZXIoYnVmLCAmdG1wLCBzaXplb2YodG1wKSkpCiAJCWVycm9yID0gLUVGQVVMVDsKIAlmcHV0KGZpbGUpOwpAQCAtMTg2LDcgKzE4Niw3IEBACiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmICghZmlsZSkKIAkJZ290byBvdXQ7Ci0JZXJyb3IgPSB2ZnNfc3RhdGZzNjQoZmlsZS0+Zl9kZW50cnksICZ0bXApOworCWVycm9yID0gdmZzX3N0YXRmczY0KGZpbGUtPmZfcGF0aC5kZW50cnksICZ0bXApOwogCWlmICghZXJyb3IgJiYgY29weV90b191c2VyKGJ1ZiwgJnRtcCwgc2l6ZW9mKHRtcCkpKQogCQllcnJvciA9IC1FRkFVTFQ7CiAJZnB1dChmaWxlKTsKQEAgLTMwMiw3ICszMDIsNyBAQAogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19MQVJHRUZJTEUpCiAJCXNtYWxsID0gMDsKIAotCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCWRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCAhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKQEAgLTQ0OCw4ICs0NDgsOCBAQAogCWlmICghZmlsZSkKIAkJZ290byBvdXQ7CiAKLQlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKLQltbnQgPSBmaWxlLT5mX3Zmc21udDsKKwlkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCW1udCA9IGZpbGUtPmZfcGF0aC5tbnQ7CiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKIAllcnJvciA9IC1FTk9URElSOwpAQCAtNTAzLDcgKzUwMyw3IEBACiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dDsKIAotCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCWRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKIAlhdWRpdF9pbm9kZShOVUxMLCBpbm9kZSk7CkBAIC02NjIsNyArNjYyLDcgQEAKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0OwogCi0JZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlhdWRpdF9pbm9kZShOVUxMLCBkZW50cnktPmRfaW5vZGUpOwogCWVycm9yID0gY2hvd25fY29tbW9uKGRlbnRyeSwgdXNlciwgZ3JvdXApOwogCWZwdXQoZmlsZSk7CkBAIC02ODgsOCArNjg4LDggQEAKIAl9CiAKIAlmLT5mX21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCWYtPmZfZGVudHJ5ID0gZGVudHJ5OwotCWYtPmZfdmZzbW50ID0gbW50OworCWYtPmZfcGF0aC5kZW50cnkgPSBkZW50cnk7CisJZi0+Zl9wYXRoLm1udCA9IG1udDsKIAlmLT5mX3BvcyA9IDA7CiAJZi0+Zl9vcCA9IGZvcHNfZ2V0KGlub2RlLT5pX2ZvcCk7CiAJZmlsZV9tb3ZlKGYsICZpbm9kZS0+aV9zYi0+c19maWxlcyk7CkBAIC03MjMsOCArNzIzLDggQEAKIAlpZiAoZi0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCiAJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOwogCWZpbGVfa2lsbChmKTsKLQlmLT5mX2RlbnRyeSA9IE5VTEw7Ci0JZi0+Zl92ZnNtbnQgPSBOVUxMOworCWYtPmZfcGF0aC5kZW50cnkgPSBOVUxMOworCWYtPmZfcGF0aC5tbnQgPSBOVUxMOwogY2xlYW51cF9maWxlOgogCXB1dF9maWxwKGYpOwogCWRwdXQoZGVudHJ5KTsKQEAgLTgyMiw3ICs4MjIsNyBAQAogCS8qIFBpY2sgdXAgdGhlIGZpbHAgZnJvbSB0aGUgb3BlbiBpbnRlbnQgKi8KIAlmaWxwID0gbmQtPmludGVudC5vcGVuLmZpbGU7CiAJLyogSGFzIHRoZSBmaWxlc3lzdGVtIGluaXRpYWxpc2VkIHRoZSBmaWxlIGZvciB1cz8gKi8KLQlpZiAoZmlscC0+Zl9kZW50cnkgPT0gTlVMTCkKKwlpZiAoZmlscC0+Zl9wYXRoLmRlbnRyeSA9PSBOVUxMKQogCQlmaWxwID0gX19kZW50cnlfb3BlbihuZC0+ZGVudHJ5LCBuZC0+bW50LCBmbGFncywgZmlscCwgTlVMTCk7CiAJZWxzZQogCQlwYXRoX3JlbGVhc2UobmQpOwpAQCAtODY0LDggKzg2NCw3IEBACiAKIHJlcGVhdDoKIAlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKLSAJZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHMsCi0JCQkJZmR0LT5tYXhfZmRzZXQsCisJZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIGZkdC0+bWF4X2ZkcywKIAkJCQlmaWxlcy0+bmV4dF9mZCk7CiAKIAkvKgpAQCAtOTY1LDcgKzk2NCw3IEBACiAJCQkJcHV0X3VudXNlZF9mZChmZCk7CiAJCQkJZmQgPSBQVFJfRVJSKGYpOwogCQkJfSBlbHNlIHsKLQkJCQlmc25vdGlmeV9vcGVuKGYtPmZfZGVudHJ5KTsKKwkJCQlmc25vdGlmeV9vcGVuKGYtPmZfcGF0aC5kZW50cnkpOwogCQkJCWZkX2luc3RhbGwoZmQsIGYpOwogCQkJfQogCQl9CkBAIC0xMDg3LDYgKzEwODYsNyBAQAogYXNtbGlua2FnZSBsb25nIHN5c192aGFuZ3VwKHZvaWQpCiB7CiAJaWYgKGNhcGFibGUoQ0FQX1NZU19UVFlfQ09ORklHKSkgeworCQkvKiBYWFg6IHRoaXMgbmVlZHMgbG9ja2luZyAqLwogCQl0dHlfdmhhbmd1cChjdXJyZW50LT5zaWduYWwtPnR0eSk7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYyBiL2ZzL29wZW5wcm9tZnMvaW5vZGUuYwppbmRleCA1OTJhNjQwLi45OWMwYmMzIDEwMDY0NAotLS0gYS9mcy9vcGVucHJvbWZzL2lub2RlLmMKKysrIGIvZnMvb3BlbnByb21mcy9pbm9kZS5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAogc3RhdGljIGludCBvcGVucHJvbWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IG9wX2lub2RlX2luZm8gKm9pID0gT1BfSShpbm9kZSk7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9pLT51Lm5vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKQEAgLTMzMCwxMyArMzMwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKm9wX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqb3BfaW5vZGVfY2FjaGVwOwogCiBzdGF0aWMgc3RydWN0IGlub2RlICpvcGVucHJvbV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBvcF9pbm9kZV9pbmZvICpvaTsKIAotCW9pID0ga21lbV9jYWNoZV9hbGxvYyhvcF9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlvaSA9IGttZW1fY2FjaGVfYWxsb2Mob3BfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW9pKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNDE1LDcgKzQxNSw3IEBACiAJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCiB9OwogCi1zdGF0aWMgdm9pZCBvcF9pbm9kZV9pbml0X29uY2Uodm9pZCAqZGF0YSwga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgb3BfaW5vZGVfaW5pdF9vbmNlKHZvaWQgKmRhdGEsIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBvcF9pbm9kZV9pbmZvICpvaSA9IChzdHJ1Y3Qgb3BfaW5vZGVfaW5mbyAqKSBkYXRhOwogCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL0tjb25maWcgYi9mcy9wYXJ0aXRpb25zL0tjb25maWcKaW5kZXggZTQ3OGYxOS4uNzQ1NTJjNiAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9LY29uZmlnCisrKyBiL2ZzL3BhcnRpdGlvbnMvS2NvbmZpZwpAQCAtMTk0LDcgKzE5NCw3IEBACiAKIGNvbmZpZyBTR0lfUEFSVElUSU9OCiAJYm9vbCAiU0dJIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQKLQlkZWZhdWx0IHkgaWYgKFNHSV9JUDIyIHx8IFNHSV9JUDI3IHx8ICgoTUFDSF9KQVpaIHx8IFNOSV9STTIwMF9QQ0kpICYmICFDUFVfTElUVExFX0VORElBTikpCisJZGVmYXVsdCB5IGlmIChTR0lfSVAyMiB8fCBTR0lfSVAyNyB8fCAoKE1BQ0hfSkFaWiB8fCBTTklfUk0pICYmICFDUFVfTElUVExFX0VORElBTikpCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHJlYWQgdGhlIGhhcmQgZGlzawogCSAgcGFydGl0aW9uIHRhYmxlIGZvcm1hdCB1c2VkIGJ5IFNHSSBtYWNoaW5lcy4KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvYW1pZ2EuYyBiL2ZzL3BhcnRpdGlvbnMvYW1pZ2EuYwppbmRleCAzMDY4NTI4Li45OTE3YThjIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2FtaWdhLmMKKysrIGIvZnMvcGFydGl0aW9ucy9hbWlnYS5jCkBAIC00Myw2ICs0Myw3IEBACiAJCQlpZiAod2Fybl9ub19wYXJ0KQogCQkJCXByaW50aygiRGV2ICVzOiB1bmFibGUgdG8gcmVhZCBSREIgYmxvY2sgJWRcbiIsCiAJCQkJICAgICAgIGJkZXZuYW1lKGJkZXYsIGIpLCBibGspOworCQkJcmVzID0gLTE7CiAJCQlnb3RvIHJkYl9kb25lOwogCQl9CiAJCWlmICgqKF9fYmUzMiAqKWRhdGEgIT0gY3B1X3RvX2JlMzIoSUROQU1FX1JJR0lERElTSykpCkBAIC03OSw2ICs4MCw3IEBACiAJCQlpZiAod2Fybl9ub19wYXJ0KQogCQkJCXByaW50aygiRGV2ICVzOiB1bmFibGUgdG8gcmVhZCBwYXJ0aXRpb24gYmxvY2sgJWRcbiIsCiAJCQkJICAgICAgIGJkZXZuYW1lKGJkZXYsIGIpLCBibGspOworCQkJcmVzID0gLTE7CiAJCQlnb3RvIHJkYl9kb25lOwogCQl9CiAJCXBiICA9IChzdHJ1Y3QgUGFydGl0aW9uQmxvY2sgKilkYXRhOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9hdGFyaS5jIGIvZnMvcGFydGl0aW9ucy9hdGFyaS5jCmluZGV4IDE5MmE2YWQuLjFmMzU3MmQgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvYXRhcmkuYworKysgYi9mcy9wYXJ0aXRpb25zL2F0YXJpLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAkJCWlmICgheHJzKSB7CiAJCQkJcHJpbnRrICgiIGJsb2NrICVsZCByZWFkIGZhaWxlZFxuIiwgcGFydHNlY3QpOwogCQkJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOwotCQkJCXJldHVybiAwOworCQkJCXJldHVybiAtMTsKIAkJCX0KIAogCQkJLyogKytyb21hbjogc2FuaXR5IGNoZWNrOiBiaXQgMCBvZiBmbGcgZmllbGQgbXVzdCBiZSBzZXQgKi8KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwppbmRleCA1MWM2YTc0Li4zZDczZDk0IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIGNoZWNrX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqaGQsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZTsKLQlpbnQgaSwgcmVzOworCWludCBpLCByZXMsIGVycjsKIAogCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzdGF0ZSkKQEAgLTE2NSwxOSArMTY1LDMwIEBACiAJCXNwcmludGYoc3RhdGUtPm5hbWUsICJwIik7CiAKIAlzdGF0ZS0+bGltaXQgPSBoZC0+bWlub3JzOwotCWkgPSByZXMgPSAwOworCWkgPSByZXMgPSBlcnIgPSAwOwogCXdoaWxlICghcmVzICYmIGNoZWNrX3BhcnRbaV0pIHsKIAkJbWVtc2V0KCZzdGF0ZS0+cGFydHMsIDAsIHNpemVvZihzdGF0ZS0+cGFydHMpKTsKIAkJcmVzID0gY2hlY2tfcGFydFtpKytdKHN0YXRlLCBiZGV2KTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCS8qIFdlIGhhdmUgaGl0IGFuIEkvTyBlcnJvciB3aGljaCB3ZSBkb24ndCByZXBvcnQgbm93LgorCQkgCSogQnV0IHJlY29yZCBpdCwgYW5kIGxldCB0aGUgb3RoZXJzIGRvIHRoZWlyIGpvYi4KKwkJIAkqLworCQkJZXJyID0gcmVzOworCQkJcmVzID0gMDsKKwkJfQorCiAJfQogCWlmIChyZXMgPiAwKQogCQlyZXR1cm4gc3RhdGU7CisJaWYgKCFlcnIpCisJLyogVGhlIHBhcnRpdGlvbiBpcyB1bnJlY29nbml6ZWQuIFNvIHJlcG9ydCBJL08gZXJyb3JzIGlmIHRoZXJlIHdlcmUgYW55ICovCisJCXJlcyA9IGVycjsKIAlpZiAoIXJlcykKIAkJcHJpbnRrKCIgdW5rbm93biBwYXJ0aXRpb24gdGFibGVcbiIpOwogCWVsc2UgaWYgKHdhcm5fbm9fcGFydCkKIAkJcHJpbnRrKCIgdW5hYmxlIHRvIHJlYWQgcGFydGl0aW9uIHRhYmxlXG4iKTsKIAlrZnJlZShzdGF0ZSk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIEVSUl9QVFIocmVzKTsKIH0KIAogLyoKQEAgLTI2NSwxMiArMjc2LDM5IEBACiAJLnNob3cJPSBwYXJ0X3N0YXRfcmVhZAogfTsKIAorI2lmZGVmIENPTkZJR19GQUlMX01BS0VfUkVRVUVTVAorCitzdGF0aWMgc3NpemVfdCBwYXJ0X2ZhaWxfc3RvcmUoc3RydWN0IGhkX3N0cnVjdCAqIHAsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGk7CisKKwlpZiAoY291bnQgPiAwICYmIHNzY2FuZihidWYsICIlZCIsICZpKSA+IDApCisJCXAtPm1ha2VfaXRfZmFpbCA9IChpID09IDApID8gMCA6IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBwYXJ0X2ZhaWxfcmVhZChzdHJ1Y3QgaGRfc3RydWN0ICogcCwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWRcbiIsIHAtPm1ha2VfaXRfZmFpbCk7Cit9CitzdGF0aWMgc3RydWN0IHBhcnRfYXR0cmlidXRlIHBhcnRfYXR0cl9mYWlsID0geworCS5hdHRyID0gey5uYW1lID0gIm1ha2UtaXQtZmFpbCIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc3RvcmUJPSBwYXJ0X2ZhaWxfc3RvcmUsCisJLnNob3cJPSBwYXJ0X2ZhaWxfcmVhZAorfTsKKworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICogZGVmYXVsdF9hdHRyc1tdID0gewogCSZwYXJ0X2F0dHJfdWV2ZW50LmF0dHIsCiAJJnBhcnRfYXR0cl9kZXYuYXR0ciwKIAkmcGFydF9hdHRyX3N0YXJ0LmF0dHIsCiAJJnBhcnRfYXR0cl9zaXplLmF0dHIsCiAJJnBhcnRfYXR0cl9zdGF0LmF0dHIsCisjaWZkZWYgQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUCisJJnBhcnRfYXR0cl9mYWlsLmF0dHIsCisjZW5kaWYKIAlOVUxMLAogfTsKIApAQCAtMzc2LDE4ICs0MTQsNDggQEAKIAlyZXR1cm4gbmFtZTsKIH0KIAotc3RhdGljIHZvaWQgZGlza19zeXNmc19zeW1saW5rcyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3N0YXRpYyBpbnQgZGlza19zeXNmc19zeW1saW5rcyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKIAlzdHJ1Y3QgZGV2aWNlICp0YXJnZXQgPSBnZXRfZGV2aWNlKGRpc2stPmRyaXZlcmZzX2Rldik7CisJaW50IGVycjsKKwljaGFyICpkaXNrX25hbWUgPSBOVUxMOworCiAJaWYgKHRhcmdldCkgewotCQljaGFyICpkaXNrX25hbWUgPSBtYWtlX2Jsb2NrX25hbWUoZGlzayk7Ci0JCXN5c2ZzX2NyZWF0ZV9saW5rKCZkaXNrLT5rb2JqLCZ0YXJnZXQtPmtvYmosImRldmljZSIpOwotCQlpZiAoZGlza19uYW1lKSB7Ci0JCQlzeXNmc19jcmVhdGVfbGluaygmdGFyZ2V0LT5rb2JqLCZkaXNrLT5rb2JqLGRpc2tfbmFtZSk7Ci0JCQlrZnJlZShkaXNrX25hbWUpOworCQlkaXNrX25hbWUgPSBtYWtlX2Jsb2NrX25hbWUoZGlzayk7CisJCWlmICghZGlza19uYW1lKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBlcnJfb3V0OwogCQl9CisKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRpc2stPmtvYmosICZ0YXJnZXQtPmtvYmosICJkZXZpY2UiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dF9kaXNrX25hbWU7CisKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnRhcmdldC0+a29iaiwgJmRpc2stPmtvYmosIGRpc2tfbmFtZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXRfZGV2X2xpbms7CiAJfQotCXN5c2ZzX2NyZWF0ZV9saW5rKCZkaXNrLT5rb2JqLCAmYmxvY2tfc3Vic3lzLmtzZXQua29iaiwgInN1YnN5c3RlbSIpOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRpc2stPmtvYmosICZibG9ja19zdWJzeXMua3NldC5rb2JqLAorCQkJCSJzdWJzeXN0ZW0iKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZGlza19uYW1lX2xuazsKKworCWtmcmVlKGRpc2tfbmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9kaXNrX25hbWVfbG5rOgorCWlmICh0YXJnZXQpIHsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnRhcmdldC0+a29iaiwgZGlza19uYW1lKTsKK2Vycl9vdXRfZGV2X2xpbms6CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkaXNrLT5rb2JqLCAiZGV2aWNlIik7CitlcnJfb3V0X2Rpc2tfbmFtZToKKwkJa2ZyZWUoZGlza19uYW1lKTsKK2Vycl9vdXQ6CisJCXB1dF9kZXZpY2UodGFyZ2V0KTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogLyogTm90IGV4cG9ydGVkLCBoZWxwZXIgdG8gYWRkX2Rpc2soKS4gKi8KQEAgLTQwNiw3ICs0NzQsMTEgQEAKIAkJKnMgPSAnISc7CiAJaWYgKChlcnIgPSBrb2JqZWN0X2FkZCgmZGlzay0+a29iaikpKQogCQlyZXR1cm47Ci0JZGlza19zeXNmc19zeW1saW5rcyhkaXNrKTsKKwllcnIgPSBkaXNrX3N5c2ZzX3N5bWxpbmtzKGRpc2spOworCWlmIChlcnIpIHsKKwkJa29iamVjdF9kZWwoJmRpc2stPmtvYmopOworCQlyZXR1cm47CisJfQogIAlkaXNrX3N5c2ZzX2FkZF9zdWJkaXJzKGRpc2spOwogCiAJLyogTm8gbWlub3JzIHRvIHVzZSBmb3IgcGFydGl0aW9ucyAqLwpAQCAtNDYwLDYgKzUzMiw4IEBACiAJCWRpc2stPmZvcHMtPnJldmFsaWRhdGVfZGlzayhkaXNrKTsKIAlpZiAoIWdldF9jYXBhY2l0eShkaXNrKSB8fCAhKHN0YXRlID0gY2hlY2tfcGFydGl0aW9uKGRpc2ssIGJkZXYpKSkKIAkJcmV0dXJuIDA7CisJaWYgKElTX0VSUihzdGF0ZSkpCS8qIEkvTyBlcnJvciByZWFkaW5nIHRoZSBwYXJ0aXRpb24gdGFibGUgKi8KKwkJcmV0dXJuIFBUUl9FUlIoc3RhdGUpOwogCWZvciAocCA9IDE7IHAgPCBzdGF0ZS0+bGltaXQ7IHArKykgewogCQlzZWN0b3JfdCBzaXplID0gc3RhdGUtPnBhcnRzW3BdLnNpemU7CiAJCXNlY3Rvcl90IGZyb20gPSBzdGF0ZS0+cGFydHNbcF0uZnJvbTsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvaWJtLmMgYi9mcy9wYXJ0aXRpb25zL2libS5jCmluZGV4IGQzNTJhNzMuLjlmN2FkNDIgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvaWJtLmMKKysrIGIvZnMvcGFydGl0aW9ucy9pYm0uYwpAQCAtNDMsNyArNDMsNyBAQAogaW50CiBpYm1fcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7Ci0JaW50IGJsb2Nrc2l6ZSwgb2Zmc2V0LCBzaXplOworCWludCBibG9ja3NpemUsIG9mZnNldCwgc2l6ZSxyZXM7CiAJbG9mZl90IGlfc2l6ZTsKIAlkYXNkX2luZm9ybWF0aW9uX3QgKmluZm87CiAJc3RydWN0IGhkX2dlb21ldHJ5ICpnZW87CkBAIC01NiwxNSArNTYsMTYgQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCVNlY3RvciBzZWN0OwogCisJcmVzID0gMDsKIAlibG9ja3NpemUgPSBiZGV2X2hhcmRzZWN0X3NpemUoYmRldik7CiAJaWYgKGJsb2Nrc2l6ZSA8PSAwKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXRfZXhpdDsKIAlpX3NpemUgPSBpX3NpemVfcmVhZChiZGV2LT5iZF9pbm9kZSk7CiAJaWYgKGlfc2l6ZSA9PSAwKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXRfZXhpdDsKIAogCWlmICgoaW5mbyA9IGttYWxsb2Moc2l6ZW9mKGRhc2RfaW5mb3JtYXRpb25fdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlnb3RvIG91dF9ub2luZm87CisJCWdvdG8gb3V0X2V4aXQ7CiAJaWYgKChnZW8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGRfZ2VvbWV0cnkpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKIAkJZ290byBvdXRfbm9nZW87CiAJaWYgKChsYWJlbCA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIGxhYmVsX3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKQEAgLTcyLDcgKzczLDcgQEAKIAogCWlmIChpb2N0bF9ieV9iZGV2KGJkZXYsIEJJT0RBU0RJTkZPLCAodW5zaWduZWQgbG9uZylpbmZvKSAhPSAwIHx8CiAJICAgIGlvY3RsX2J5X2JkZXYoYmRldiwgSERJT19HRVRHRU8sICh1bnNpZ25lZCBsb25nKWdlbykgIT0gMCkKLQkJZ290byBvdXRfbm9pb2N0bDsKKwkJZ290byBvdXRfZnJlZWFsbDsKIAogCS8qCiAJICogR2V0IHZvbHVtZSBsYWJlbCwgZXh0cmFjdCBuYW1lIGFuZCB0eXBlLgpAQCAtOTIsNiArOTMsOCBAQAogCUVCQ0FTQyh0eXBlLCA0KTsKIAlFQkNBU0MobmFtZSwgNik7CiAKKwlyZXMgPSAxOworCiAJLyoKIAkgKiBUaHJlZSBkaWZmZXJlbnQgdHlwZXM6IENNUzEsIFZPTDEgYW5kIExOWDEvdW5sYWJlbGVkCiAJICovCkBAIC0xNTYsNiArMTU5LDkgQEAKIAkJCWNvdW50ZXIrKzsKIAkJCWJsaysrOwogCQl9CisJCWlmICghZGF0YSkKKwkJLyogQXJlIHdlIG5vdCBzdXBwb3NlZCB0byByZXBvcnQgdGhpcyA/ICovCisJCQlnb3RvIG91dF9yZWFkZXJyOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIE9sZCBzdHlsZSBMTlgxIG9yIHVubGFiZWxlZCBkaXNrCkBAIC0xNzEsMTggKzE3NywxNyBAQAogCX0KIAogCXByaW50aygiXG4iKTsKLQlrZnJlZShsYWJlbCk7Ci0Ja2ZyZWUoZ2VvKTsKLQlrZnJlZShpbmZvKTsKLQlyZXR1cm4gMTsKKwlnb3RvIG91dF9mcmVlYWxsOworCiAKIG91dF9yZWFkZXJyOgotb3V0X25vaW9jdGw6CisJcmVzID0gLTE7CitvdXRfZnJlZWFsbDoKIAlrZnJlZShsYWJlbCk7CiBvdXRfbm9sYWI6CiAJa2ZyZWUoZ2VvKTsKIG91dF9ub2dlbzoKIAlrZnJlZShpbmZvKTsKLW91dF9ub2luZm86Ci0JcmV0dXJuIDA7CitvdXRfZXhpdDoKKwlyZXR1cm4gcmVzOwogfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9tYWMuYyBiL2ZzL3BhcnRpdGlvbnMvbWFjLmMKaW5kZXggYzA4NzEwMC4uZDRhMGZhZCAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9tYWMuYworKysgYi9mcy9wYXJ0aXRpb25zL21hYy5jCkBAIC03NCw2ICs3NCw4IEBACiAJCQliZTMyX3RvX2NwdShwYXJ0LT5zdGFydF9ibG9jaykgKiAoc2Vjc2l6ZS81MTIpLAogCQkJYmUzMl90b19jcHUocGFydC0+YmxvY2tfY291bnQpICogKHNlY3NpemUvNTEyKSk7CiAKKwkJaWYgKCFzdHJuaWNtcChwYXJ0LT50eXBlLCAiTGludXhfUkFJRCIsIDEwKSkKKwkJCXN0YXRlLT5wYXJ0c1tzbG90XS5mbGFncyA9IDE7CiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCiAJCS8qCiAJCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IGJvb3RhYmxlIHBhcnRpdGlvbiwgdGVsbCB0aGUKZGlmZiAtLWdpdCBhL2ZzL3BpcGUuYyBiL2ZzL3BpcGUuYwppbmRleCBiMTYyNmYyLi45YTA2ZThlIDEwMDY0NAotLS0gYS9mcy9waXBlLmMKKysrIGIvZnMvcGlwZS5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zIGFub25fcGlwZV9idWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zIGFub25fcGlwZV9idWZfb3BzID0gewogCS5jYW5fbWVyZ2UgPSAxLAogCS5tYXAgPSBnZW5lcmljX3BpcGVfYnVmX21hcCwKIAkudW5tYXAgPSBnZW5lcmljX3BpcGVfYnVmX3VubWFwLApAQCAtMjIyLDcgKzIyMiw3IEBACiAJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBmaWxlICpmaWxwID0gaW9jYi0+a2lfZmlscDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZTsKIAlpbnQgZG9fd2FrZXVwOwogCXNzaXplX3QgcmV0OwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJCWlmIChidWZzKSB7CiAJCQlpbnQgY3VyYnVmID0gcGlwZS0+Y3VyYnVmOwogCQkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBwaXBlLT5idWZzICsgY3VyYnVmOwotCQkJc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wcyA9IGJ1Zi0+b3BzOworCQkJY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wcyA9IGJ1Zi0+b3BzOwogCQkJdm9pZCAqYWRkcjsKIAkJCXNpemVfdCBjaGFycyA9IGJ1Zi0+bGVuOwogCQkJaW50IGVycm9yLCBhdG9taWM7CkBAIC0zMzUsNyArMzM1LDcgQEAKIAkgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcHBvcykKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGU7CiAJc3NpemVfdCByZXQ7CiAJaW50IGRvX3dha2V1cDsKQEAgLTM2NSw3ICszNjUsNyBAQAogCQlpbnQgbGFzdGJ1ZiA9IChwaXBlLT5jdXJidWYgKyBwaXBlLT5ucmJ1ZnMgLSAxKSAmCiAJCQkJCQkJKFBJUEVfQlVGRkVSUy0xKTsKIAkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBwaXBlLT5idWZzICsgbGFzdGJ1ZjsKLQkJc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wcyA9IGJ1Zi0+b3BzOworCQljb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyAqb3BzID0gYnVmLT5vcHM7CiAJCWludCBvZmZzZXQgPSBidWYtPm9mZnNldCArIGJ1Zi0+bGVuOwogCiAJCWlmIChvcHMtPmNhbl9tZXJnZSAmJiBvZmZzZXQgKyBjaGFycyA8PSBQQUdFX1NJWkUpIHsKQEAgLTUyMCw3ICs1MjAsNyBAQAogcGlwZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKnBpbm8sIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlOwogCWludCBjb3VudCwgYnVmLCBucmJ1ZnM7CiAKQEAgLTU0OCw3ICs1NDgsNyBAQAogcGlwZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXVuc2lnbmVkIGludCBtYXNrOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaW5vZGUtPmlfcGlwZTsKIAlpbnQgbnJidWZzOwogCkBAIC02MDEsNyArNjAxLDcgQEAKIHN0YXRpYyBpbnQKIHBpcGVfcmVhZF9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0dmFsOwogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwpAQCAtNjE4LDcgKzYxOCw3IEBACiBzdGF0aWMgaW50CiBwaXBlX3dyaXRlX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCByZXR2YWw7CiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CkBAIC02MzUsNyArNjM1LDcgQEAKIHN0YXRpYyBpbnQKIHBpcGVfcmR3cl9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaW5vZGUtPmlfcGlwZTsKIAlpbnQgcmV0dmFsOwogCkBAIC03NTYsNyArNzU2LDcgQEAKIAkuZmFzeW5jCQk9IHBpcGVfcmR3cl9mYXN5bmMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWFkX3BpcGVfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlYWRfcGlwZV9mb3BzID0gewogCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKIAkuYWlvX3JlYWQJPSBwaXBlX3JlYWQsCkBAIC03NjgsNyArNzY4LDcgQEAKIAkuZmFzeW5jCQk9IHBpcGVfcmVhZF9mYXN5bmMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3cml0ZV9waXBlX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3cml0ZV9waXBlX2ZvcHMgPSB7CiAJLmxsc2VlawkJPSBub19sbHNlZWssCiAJLnJlYWQJCT0gYmFkX3BpcGVfciwKIAkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKQEAgLTc4MCw3ICs3ODAsNyBAQAogCS5mYXN5bmMJCT0gcGlwZV93cml0ZV9mYXN5bmMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZHdyX3BpcGVfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJkd3JfcGlwZV9mb3BzID0gewogCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKIAkuYWlvX3JlYWQJPSBwaXBlX3JlYWQsCkBAIC04MzAsNyArODMwLDE0IEBACiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpwaXBlX21udCBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGludCBwaXBlZnNfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0JcmV0dXJuIDE7CisJLyoKKwkgKiBBdCBjcmVhdGlvbiB0aW1lLCB3ZSBwcmV0ZW5kZWQgdGhpcyBkZW50cnkgd2FzIGhhc2hlZAorCSAqIChieSBjbGVhcmluZyBEQ0FDSEVfVU5IQVNIRUQgYml0IGluIGRfZmxhZ3MpCisJICogQXQgZGVsZXRlIHRpbWUsIHdlIHJlc3RvcmUgdGhlIHRydXRoIDogbm90IGhhc2hlZC4KKwkgKiAoc28gdGhhdCBkcHV0KCkgY2FuIHByb2NlZWQgY29ycmVjdGx5KQorCSAqLworCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfVU5IQVNIRUQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgcGlwZWZzX2RlbnRyeV9vcGVyYXRpb25zID0gewpAQCAtODkxLDE5ICs4OTgsMjQgQEAKIAlpZiAoIWlub2RlKQogCQlnb3RvIGVycl9maWxlOwogCi0Jc3ByaW50ZihuYW1lLCAiWyVsdV0iLCBpbm9kZS0+aV9pbm8pOworCXRoaXMubGVuID0gc3ByaW50ZihuYW1lLCAiWyVsdV0iLCBpbm9kZS0+aV9pbm8pOwogCXRoaXMubmFtZSA9IG5hbWU7Ci0JdGhpcy5sZW4gPSBzdHJsZW4obmFtZSk7Ci0JdGhpcy5oYXNoID0gaW5vZGUtPmlfaW5vOyAvKiB3aWxsIGdvICovCisJdGhpcy5oYXNoID0gMDsKIAllcnIgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2MocGlwZV9tbnQtPm1udF9zYi0+c19yb290LCAmdGhpcyk7CiAJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyX2lub2RlOwogCiAJZGVudHJ5LT5kX29wID0gJnBpcGVmc19kZW50cnlfb3BlcmF0aW9uczsKLQlkX2FkZChkZW50cnksIGlub2RlKTsKLQlmLT5mX3Zmc21udCA9IG1udGdldChwaXBlX21udCk7Ci0JZi0+Zl9kZW50cnkgPSBkZW50cnk7CisJLyoKKwkgKiBXZSBkb250IHdhbnQgdG8gcHVibGlzaCB0aGlzIGRlbnRyeSBpbnRvIGdsb2JhbCBkZW50cnkgaGFzaCB0YWJsZS4KKwkgKiBXZSBwcmV0ZW5kIGRlbnRyeSBpcyBhbHJlYWR5IGhhc2hlZCwgYnkgdW5zZXR0aW5nIERDQUNIRV9VTkhBU0hFRAorCSAqIFRoaXMgcGVybWl0cyBhIHdvcmtpbmcgL3Byb2MvJHBpZC9mZC9YWFggb24gcGlwZXMKKwkgKi8KKwlkZW50cnktPmRfZmxhZ3MgJj0gfkRDQUNIRV9VTkhBU0hFRDsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWYtPmZfcGF0aC5tbnQgPSBtbnRnZXQocGlwZV9tbnQpOworCWYtPmZfcGF0aC5kZW50cnkgPSBkZW50cnk7CiAJZi0+Zl9tYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAogCWYtPmZfZmxhZ3MgPSBPX1dST05MWTsKQEAgLTkyMyw4ICs5MzUsOCBAQAogCiB2b2lkIGZyZWVfd3JpdGVfcGlwZShzdHJ1Y3QgZmlsZSAqZikKIHsKLQltbnRwdXQoZi0+Zl92ZnNtbnQpOwotCWRwdXQoZi0+Zl9kZW50cnkpOworCW1udHB1dChmLT5mX3BhdGgubW50KTsKKwlkcHV0KGYtPmZfcGF0aC5kZW50cnkpOwogCXB1dF9maWxwKGYpOwogfQogCkBAIC05MzUsOSArOTQ3LDkgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVORklMRSk7CiAKIAkvKiBHcmFiIHBpcGUgZnJvbSB0aGUgd3JpdGVyICovCi0JZi0+Zl92ZnNtbnQgPSBtbnRnZXQod3JmLT5mX3Zmc21udCk7Ci0JZi0+Zl9kZW50cnkgPSBkZ2V0KHdyZi0+Zl9kZW50cnkpOwotCWYtPmZfbWFwcGluZyA9IHdyZi0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKwlmLT5mX3BhdGgubW50ID0gbW50Z2V0KHdyZi0+Zl9wYXRoLm1udCk7CisJZi0+Zl9wYXRoLmRlbnRyeSA9IGRnZXQod3JmLT5mX3BhdGguZGVudHJ5KTsKKwlmLT5mX21hcHBpbmcgPSB3cmYtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKIAogCWYtPmZfcG9zID0gMDsKIAlmLT5mX2ZsYWdzID0gT19SRE9OTFk7CmRpZmYgLS1naXQgYS9mcy9wbm9kZS5jIGIvZnMvcG5vZGUuYwppbmRleCBkYTQyZWU2Li41NmFhY2VhIDEwMDY0NAotLS0gYS9mcy9wbm9kZS5jCisrKyBiL2ZzL3Bub2RlLmMKQEAgLTYsNyArNiw3IEBACiAgKglBdXRob3IgOiBSYW0gUGFpIChsaW51eHJhbUB1cy5pYm0uY29tKQogICoKICAqLwotI2luY2x1ZGUgPGxpbnV4L25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSAicG5vZGUuaCIKZGlmZiAtLWdpdCBhL2ZzL3Bub2RlLmggYi9mcy9wbm9kZS5oCmluZGV4IDAyMGUxYmIuLmQ0NWJkOGUgMTAwNjQ0Ci0tLSBhL2ZzL3Bub2RlLmgKKysrIGIvZnMvcG5vZGUuaApAQCAtMTMsNyArMTMsNyBAQAogCiAjZGVmaW5lIElTX01OVF9TSEFSRUQobW50KSAobW50LT5tbnRfZmxhZ3MgJiBNTlRfU0hBUkVEKQogI2RlZmluZSBJU19NTlRfU0xBVkUobW50KSAobW50LT5tbnRfbWFzdGVyKQotI2RlZmluZSBJU19NTlRfTkVXKG1udCkgICghbW50LT5tbnRfbmFtZXNwYWNlKQorI2RlZmluZSBJU19NTlRfTkVXKG1udCkgICghbW50LT5tbnRfbnMpCiAjZGVmaW5lIENMRUFSX01OVF9TSEFSRUQobW50KSAobW50LT5tbnRfZmxhZ3MgJj0gfk1OVF9TSEFSRUQpCiAjZGVmaW5lIElTX01OVF9VTkJJTkRBQkxFKG1udCkgKG1udC0+bW50X2ZsYWdzICYgTU5UX1VOQklOREFCTEUpCiAKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvTWFrZWZpbGUgYi9mcy9wcm9jL01ha2VmaWxlCmluZGV4IDc0MzFkN2IuLmY2Yzc3NjIgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvTWFrZWZpbGUKKysrIGIvZnMvcHJvYy9NYWtlZmlsZQpAQCAtOCw4ICs4LDkgQEAKIHByb2MtJChDT05GSUdfTU1VKQk6PSBtbXUubyB0YXNrX21tdS5vCiAKIHByb2MteSAgICAgICArPSBpbm9kZS5vIHJvb3QubyBiYXNlLm8gZ2VuZXJpYy5vIGFycmF5Lm8gXAotCQlrbXNnLm8gcHJvY190dHkubyBwcm9jX21pc2MubworCQlwcm9jX3R0eS5vIHByb2NfbWlzYy5vCiAKIHByb2MtJChDT05GSUdfUFJPQ19LQ09SRSkJKz0ga2NvcmUubwogcHJvYy0kKENPTkZJR19QUk9DX1ZNQ09SRSkJKz0gdm1jb3JlLm8KIHByb2MtJChDT05GSUdfUFJPQ19ERVZJQ0VUUkVFKQkrPSBwcm9jX2RldnRyZWUubworcHJvYy0kKENPTkZJR19QUklOVEspCSs9IGttc2cubwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9hcnJheS5jIGIvZnMvcHJvYy9hcnJheS5jCmluZGV4IDI1ZTkxN2YuLjcwZTRmYWIxIDEwMDY0NAotLS0gYS9mcy9wcm9jL2FycmF5LmMKKysrIGIvZnMvcHJvYy9hcnJheS5jCkBAIC0zNDYsMjAgKzM0NiwxMyBAQAogCXNpZ2VtcHR5c2V0KCZzaWdjYXRjaCk7CiAJY3V0aW1lID0gY3N0aW1lID0gdXRpbWUgPSBzdGltZSA9IGNwdXRpbWVfemVybzsKIAotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChsb2NrX3Rhc2tfc2lnaGFuZCh0YXNrLCAmZmxhZ3MpKSB7CiAJCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcgPSB0YXNrLT5zaWduYWw7Ci0JCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBzaWctPnR0eTsKIAotCQlpZiAodHR5KSB7Ci0JCQkvKgotCQkJICogc2lnLT50dHkgaXMgbm90IHN0YWJsZSwgYnV0IHR0eV9tdXRleAotCQkJICogcHJvdGVjdHMgdXMgZnJvbSByZWxlYXNlX2Rldih0dHkpCi0JCQkgKi8KLQkJCWJhcnJpZXIoKTsKLQkJCXR0eV9wZ3JwID0gdHR5LT5wZ3JwOwotCQkJdHR5X25yID0gbmV3X2VuY29kZV9kZXYodHR5X2Rldm51bSh0dHkpKTsKKwkJaWYgKHNpZy0+dHR5KSB7CisJCQl0dHlfcGdycCA9IHNpZy0+dHR5LT5wZ3JwOworCQkJdHR5X25yID0gbmV3X2VuY29kZV9kZXYodHR5X2Rldm51bShzaWctPnR0eSkpOwogCQl9CiAKIAkJbnVtX3RocmVhZHMgPSBhdG9taWNfcmVhZCgmc2lnLT5jb3VudCk7CkBAIC0zODgsMTQgKzM4MSwxMyBAQAogCQkJc3RpbWUgPSBjcHV0aW1lX2FkZChzdGltZSwgc2lnLT5zdGltZSk7CiAJCX0KIAotCQlzaWQgPSBzaWctPnNlc3Npb247CisJCXNpZCA9IHNpZ25hbF9zZXNzaW9uKHNpZyk7CiAJCXBnaWQgPSBwcm9jZXNzX2dyb3VwKHRhc2spOwogCQlwcGlkID0gcmN1X2RlcmVmZXJlbmNlKHRhc2stPnJlYWxfcGFyZW50KS0+dGdpZDsKIAogCQl1bmxvY2tfdGFza19zaWdoYW5kKHRhc2ssICZmbGFncyk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIAogCWlmICghd2hvbGUgfHwgbnVtX3RocmVhZHM8MikKIAkJd2NoYW4gPSBnZXRfd2NoYW4odGFzayk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IDgyZGE1NWIuLjc3YTU3YjUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC01OSw3ICs1OSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgotI2luY2x1ZGUgPGxpbnV4L25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KQEAgLTcyLDYgKzcyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvb29tLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyogTk9URToKQEAgLTg2LDcgKzg3LDcgQEAKIAogCiAvKiBXb3JzdCBjYXNlIGJ1ZmZlciBzaXplIG5lZWRlZCBmb3IgaG9sZGluZyBhbiBpbnRlZ2VyLiAqLwotI2RlZmluZSBQUk9DX05VTUJVRiAxMAorI2RlZmluZSBQUk9DX05VTUJVRiAxMwogCiBzdHJ1Y3QgcGlkX2VudHJ5IHsKIAlpbnQgbGVuOwpAQCAtMzY0LDMzICszNjUsMzMgQEAKIHN0YXRpYyBpbnQgbW91bnRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhpbm9kZSk7Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlID0gTlVMTDsKKwlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMgPSBOVUxMOwogCXN0cnVjdCBwcm9jX21vdW50cyAqcDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWlmICh0YXNrKSB7CiAJCXRhc2tfbG9jayh0YXNrKTsKLQkJbmFtZXNwYWNlID0gdGFzay0+bnNwcm94eS0+bmFtZXNwYWNlOwotCQlpZiAobmFtZXNwYWNlKQotCQkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCQlucyA9IHRhc2stPm5zcHJveHktPm1udF9uczsKKwkJaWYgKG5zKQorCQkJZ2V0X21udF9ucyhucyk7CiAJCXRhc2tfdW5sb2NrKHRhc2spOwogCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7CiAJfQogCi0JaWYgKG5hbWVzcGFjZSkgeworCWlmIChucykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfbW91bnRzKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChwKSB7CiAJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAmcC0+bTsKIAkJCXJldCA9IHNlcV9vcGVuKGZpbGUsICZtb3VudHNfb3ApOwogCQkJaWYgKCFyZXQpIHsKLQkJCQlwLT5tLnByaXZhdGUgPSBuYW1lc3BhY2U7Ci0JCQkJcC0+ZXZlbnQgPSBuYW1lc3BhY2UtPmV2ZW50OworCQkJCXAtPm0ucHJpdmF0ZSA9IG5zOworCQkJCXAtPmV2ZW50ID0gbnMtPmV2ZW50OwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJa2ZyZWUocCk7CiAJCX0KLQkJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCQlwdXRfbW50X25zKG5zKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTM5OCwxNSArMzk5LDE1IEBACiBzdGF0aWMgaW50IG1vdW50c19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2UgPSBtLT5wcml2YXRlOwotCXB1dF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKKwlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMgPSBtLT5wcml2YXRlOworCXB1dF9tbnRfbnMobnMpOwogCXJldHVybiBzZXFfcmVsZWFzZShpbm9kZSwgZmlsZSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBtb3VudHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKIAlzdHJ1Y3QgcHJvY19tb3VudHMgKnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbnMgPSBwLT5tLnByaXZhdGU7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zID0gcC0+bS5wcml2YXRlOwogCXVuc2lnbmVkIHJlcyA9IDA7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJm5zLT5wb2xsLCB3YWl0KTsKQEAgLTQzNiwyMCArNDM3LDIxIEBACiAKIAlpZiAoIXJldCkgewogCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCXN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZSA9IE5VTEw7CisJCXN0cnVjdCBtbnRfbmFtZXNwYWNlICptbnRfbnMgPSBOVUxMOwogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKIAogCQlpZiAodGFzaykgewogCQkJdGFza19sb2NrKHRhc2spOwotCQkJbmFtZXNwYWNlID0gdGFzay0+bnNwcm94eS0+bmFtZXNwYWNlOwotCQkJaWYgKG5hbWVzcGFjZSkKLQkJCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisJCQlpZiAodGFzay0+bnNwcm94eSkKKwkJCQltbnRfbnMgPSB0YXNrLT5uc3Byb3h5LT5tbnRfbnM7CisJCQlpZiAobW50X25zKQorCQkJCWdldF9tbnRfbnMobW50X25zKTsKIAkJCXRhc2tfdW5sb2NrKHRhc2spOwogCQkJcHV0X3Rhc2tfc3RydWN0KHRhc2spOwogCQl9CiAKLQkJaWYgKG5hbWVzcGFjZSkKLQkJCW0tPnByaXZhdGUgPSBuYW1lc3BhY2U7CisJCWlmIChtbnRfbnMpCisJCQltLT5wcml2YXRlID0gbW50X25zOwogCQllbHNlIHsKIAkJCXNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKIAkJCXJldCA9IC1FSU5WQUw7CkBAIC00NzAsNyArNDcyLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHByb2NfaW5mb19yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCiAJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAlzc2l6ZV90IGxlbmd0aDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKQEAgLTUxMCw3ICs1MTIsNyBAQAogc3RhdGljIHNzaXplX3QgbWVtX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKIAkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGdldF9wcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGdldF9wcm9jX3Rhc2soZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJY2hhciAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIHNyYyA9ICpwcG9zOwogCWludCByZXQgPSAtRVNSQ0g7CkBAIC01ODIsNyArNTg0LDcgQEAKIHsKIAlpbnQgY29waWVkOwogCWNoYXIgKnBhZ2U7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAl1bnNpZ25lZCBsb25nIGRzdCA9ICpwcG9zOwogCiAJY29waWVkID0gLUVTUkNIOwpAQCAtNjUyLDcgKzY1NCw3IEBACiBzdGF0aWMgc3NpemVfdCBvb21fYWRqdXN0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gZ2V0X3Byb2NfdGFzayhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAljaGFyIGJ1ZmZlcltQUk9DX05VTUJVRl07CiAJc2l6ZV90IGxlbjsKIAlpbnQgb29tX2FkanVzdDsKQEAgLTY4MSwyMSArNjgzLDI0IEBACiAJY2hhciBidWZmZXJbUFJPQ19OVU1CVUZdLCAqZW5kOwogCWludCBvb21fYWRqdXN0OwogCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQotCQlyZXR1cm4gLUVQRVJNOwogCW1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKIAlpZiAoY291bnQgPiBzaXplb2YoYnVmZmVyKSAtIDEpCiAJCWNvdW50ID0gc2l6ZW9mKGJ1ZmZlcikgLSAxOwogCWlmIChjb3B5X2Zyb21fdXNlcihidWZmZXIsIGJ1ZiwgY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlvb21fYWRqdXN0ID0gc2ltcGxlX3N0cnRvbChidWZmZXIsICZlbmQsIDApOwotCWlmICgob29tX2FkanVzdCA8IC0xNiB8fCBvb21fYWRqdXN0ID4gMTUpICYmIG9vbV9hZGp1c3QgIT0gT09NX0RJU0FCTEUpCisJaWYgKChvb21fYWRqdXN0IDwgT09NX0FESlVTVF9NSU4gfHwgb29tX2FkanVzdCA+IE9PTV9BREpVU1RfTUFYKSAmJgorCSAgICAgb29tX2FkanVzdCAhPSBPT01fRElTQUJMRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCplbmQgPT0gJ1xuJykKIAkJZW5kKys7Ci0JdGFzayA9IGdldF9wcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXRhc2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWlmICghdGFzaykKIAkJcmV0dXJuIC1FU1JDSDsKKwlpZiAob29tX2FkanVzdCA8IHRhc2stPm9vbWtpbGxhZGogJiYgIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpIHsKKwkJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CiAJdGFzay0+b29ta2lsbGFkaiA9IG9vbV9hZGp1c3Q7CiAJcHV0X3Rhc2tfc3RydWN0KHRhc2spOwogCWlmIChlbmQgLSBidWZmZXIgPT0gMCkKQEAgLTcxMyw3ICs3MTgsNyBAQAogc3RhdGljIHNzaXplX3QgcHJvY19sb2dpbnVpZF9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCiAJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKIAlzc2l6ZV90IGxlbmd0aDsKIAljaGFyIHRtcGJ1ZltUTVBCVUZMRU5dOwpAQCAtNzI5LDcgKzczNCw3IEBACiBzdGF0aWMgc3NpemVfdCBwcm9jX2xvZ2ludWlkX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCiAJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJY2hhciAqcGFnZSwgKnRtcDsKIAlzc2l6ZV90IGxlbmd0aDsKIAl1aWRfdCBsb2dpbnVpZDsKQEAgLTg0OCw2ICs4NTMsNjUgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1NFQ0NPTVAgKi8KIAorI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT04KK3N0YXRpYyBzc2l6ZV90IHByb2NfZmF1bHRfaW5qZWN0X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyIGJ1ZmZlcltQUk9DX05VTUJVRl07CisJc2l6ZV90IGxlbjsKKwlpbnQgbWFrZV9pdF9mYWlsOworCWxvZmZfdCBfX3Bwb3MgPSAqcHBvczsKKworCWlmICghdGFzaykKKwkJcmV0dXJuIC1FU1JDSDsKKwltYWtlX2l0X2ZhaWwgPSB0YXNrLT5tYWtlX2l0X2ZhaWw7CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCisJbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVpXG4iLCBtYWtlX2l0X2ZhaWwpOworCWlmIChfX3Bwb3MgPj0gbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPiBsZW4tX19wcG9zKQorCQljb3VudCA9IGxlbi1fX3Bwb3M7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGJ1ZmZlciArIF9fcHBvcywgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkqcHBvcyA9IF9fcHBvcyArIGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19mYXVsdF9pbmplY3Rfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLAorCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwljaGFyIGJ1ZmZlcltQUk9DX05VTUJVRl0sICplbmQ7CisJaW50IG1ha2VfaXRfZmFpbDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisJaWYgKGNvdW50ID4gc2l6ZW9mKGJ1ZmZlcikgLSAxKQorCQljb3VudCA9IHNpemVvZihidWZmZXIpIC0gMTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyLCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbWFrZV9pdF9mYWlsID0gc2ltcGxlX3N0cnRvbChidWZmZXIsICZlbmQsIDApOworCWlmICgqZW5kID09ICdcbicpCisJCWVuZCsrOworCXRhc2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAoIXRhc2spCisJCXJldHVybiAtRVNSQ0g7CisJdGFzay0+bWFrZV9pdF9mYWlsID0gbWFrZV9pdF9mYWlsOworCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKwlpZiAoZW5kIC0gYnVmZmVyID09IDApCisJCXJldHVybiAtRUlPOworCXJldHVybiBlbmQgLSBidWZmZXI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZmF1bHRfaW5qZWN0X29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gcHJvY19mYXVsdF9pbmplY3RfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19mYXVsdF9pbmplY3Rfd3JpdGUsCit9OworI2VuZGlmCisKIHN0YXRpYyB2b2lkICpwcm9jX3BpZF9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CkBAIC0xMDczLDcgKzExMzcsNyBAQAogCWNoYXIgKm5hbWUsIGludCBsZW4sCiAJaW5zdGFudGlhdGVfdCBpbnN0YW50aWF0ZSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB2b2lkICpwdHIpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqY2hpbGQsICpkaXIgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCwgKmRpciA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgcXN0ciBxbmFtZTsKIAlpbm9fdCBpbm8gPSAwOwpAQCAtMTE1Miw4ICsxMjE2LDggQEAKIAkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKIAkJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOwogCQlpZiAoZmlsZSkgewotCQkJKm1udCA9IG1udGdldChmaWxlLT5mX3Zmc21udCk7Ci0JCQkqZGVudHJ5ID0gZGdldChmaWxlLT5mX2RlbnRyeSk7CisJCQkqbW50ID0gbW50Z2V0KGZpbGUtPmZfcGF0aC5tbnQpOworCQkJKmRlbnRyeSA9IGRnZXQoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiAJCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKIAkJCXJldHVybiAwOwpAQCAtMTI4OCw3ICsxMzUyLDcgQEAKIAogc3RhdGljIGludCBwcm9jX3JlYWRmZChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKIAl1bnNpZ25lZCBpbnQgZmQsIHRpZCwgaW5vOwpAQCAtMTQzNSw3ICsxNDk5LDcgQEAKIHsKIAlpbnQgaTsKIAlpbnQgcGlkOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKIAlzdHJ1Y3QgcGlkX2VudHJ5ICpwLCAqbGFzdDsKQEAgLTE0OTEsNyArMTU1NSw3IEBACiBzdGF0aWMgc3NpemVfdCBwcm9jX3BpZF9hdHRyX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKIAkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXVuc2lnbmVkIGxvbmcgcGFnZTsKIAlzc2l6ZV90IGxlbmd0aDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKQEAgLTE1MDcsNyArMTU3MSw3IEBACiAJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfZ2V0cHJvY2F0dHIodGFzaywKLQkJCQkgICAgICAoY2hhciopZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICAgIChjaGFyKilmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCQkgICAgICAodm9pZCopcGFnZSwgY291bnQpOwogCWlmIChsZW5ndGggPj0gMCkKIAkJbGVuZ3RoID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgKGNoYXIgKilwYWdlLCBsZW5ndGgpOwpAQCAtMTUyMSw3ICsxNTg1LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHByb2NfcGlkX2F0dHJfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKIAkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAljaGFyICpwYWdlOwogCXNzaXplX3QgbGVuZ3RoOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOwpAQCAtMTU0Nyw3ICsxNjExLDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X3NldHByb2NhdHRyKHRhc2ssCi0JCQkJICAgICAgKGNoYXIqKWZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICAoY2hhciopZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJICAgICAgKHZvaWQqKXBhZ2UsIGNvdW50KTsKIG91dF9mcmVlOgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CkBAIC0xNzQwLDYgKzE4MDQsMjcgQEAKIAkJCQlwcm9jX2Jhc2VfaW5zdGFudGlhdGUsIHRhc2ssIHApOwogfQogCisjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORworc3RhdGljIGludCBwcm9jX3BpZF9pb19hY2NvdW50aW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwKKwkJCSJyY2hhcjogJWxsdVxuIgorCQkJIndjaGFyOiAlbGx1XG4iCisJCQkic3lzY3I6ICVsbHVcbiIKKwkJCSJzeXNjdzogJWxsdVxuIgorCQkJInJlYWRfYnl0ZXM6ICVsbHVcbiIKKwkJCSJ3cml0ZV9ieXRlczogJWxsdVxuIgorCQkJImNhbmNlbGxlZF93cml0ZV9ieXRlczogJWxsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+cmNoYXIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXRhc2stPndjaGFyLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0YXNrLT5zeXNjciwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+c3lzY3csCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXRhc2stPmlvYWMucmVhZF9ieXRlcywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+aW9hYy53cml0ZV9ieXRlcywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+aW9hYy5jYW5jZWxsZWRfd3JpdGVfYnl0ZXMpOworfQorI2VuZGlmCisKIC8qCiAgKiBUaHJlYWQgZ3JvdXBzCiAgKi8KQEAgLTE3ODgsNiArMTg3MywxMiBAQAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKIAlSRUcoImxvZ2ludWlkIiwgICBTX0lXVVNSfFNfSVJVR08sIGxvZ2ludWlkKSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT04KKwlSRUcoIm1ha2UtaXQtZmFpbCIsIFNfSVJVR098U19JV1VTUiwgZmF1bHRfaW5qZWN0KSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkcKKwlJTkYoImlvIiwJU19JUlVHTywgcGlkX2lvX2FjY291bnRpbmcpLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IHByb2NfdGdpZF9iYXNlX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLApAQCAtMTg4MCw4ICsxOTcxLDkgQEAKIAlyZXR1cm47CiB9CiAKLXN0cnVjdCBkZW50cnkgKnByb2NfcGlkX2luc3RhbnRpYXRlKHN0cnVjdCBpbm9kZSAqZGlyLAotCXN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdm9pZCAqcHRyKQorc3RhdGljIHN0cnVjdCBkZW50cnkgKnByb2NfcGlkX2luc3RhbnRpYXRlKHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCQkgICBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LAorCQkJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3QgZGVudHJ5ICplcnJvciA9IEVSUl9QVFIoLUVOT0VOVCk7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTE5ODgsNyArMjA4MCw3IEBACiBpbnQgcHJvY19waWRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewogCXVuc2lnbmVkIGludCBuciA9IGZpbHAtPmZfcG9zIC0gRklSU1RfUFJPQ0VTU19FTlRSWTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJlYXBlciA9IGdldF9wcm9jX3Rhc2soZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcmVhcGVyID0gZ2V0X3Byb2NfdGFzayhmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAJaW50IHRnaWQ7CiAKQEAgLTIwNjIsNiArMjE1NCw5IEBACiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAogCVJFRygibG9naW51aWQiLCAgU19JV1VTUnxTX0lSVUdPLCBsb2dpbnVpZCksCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OCisJUkVHKCJtYWtlLWl0LWZhaWwiLCBTX0lSVUdPfFNfSVdVU1IsIGZhdWx0X2luamVjdCksCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgcHJvY190aWRfYmFzZV9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKQEAgLTIyMjksNyArMjMyNCw3IEBACiAvKiBmb3IgdGhlIC9wcm9jL1RHSUQvdGFzay8gZGlyZWN0b3JpZXMgKi8KIHN0YXRpYyBpbnQgcHJvY190YXNrX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXIgPSBnZXRfcHJvY190YXNrKGlub2RlKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2dlbmVyaWMuYyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCmluZGV4IDRiYTAzMDAuLjg1M2NiODcgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvZ2VuZXJpYy5jCisrKyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCkBAIC01Miw3ICs1Miw3IEBACiBwcm9jX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKIAkgICAgICAgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWNoYXIgCSpwYWdlOwogCXNzaXplX3QJcmV0dmFsPTA7CiAJaW50CWVvZj0wOwpAQCAtMjAzLDcgKzIwMyw3IEBACiBwcm9jX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBkcDsKIAkKIAlkcCA9IFBERShpbm9kZSk7CkBAIC00MzIsNyArNDMyLDcgQEAKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBkZTsKIAl1bnNpZ25lZCBpbnQgaW5vOwogCWludCBpOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0ID0gMDsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC00NTMsNyArNDUzLDcgQEAKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIDE6CiAJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksCi0JCQkJICAgIHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpLAorCQkJCSAgICBwYXJlbnRfaW5vKGZpbHAtPmZfcGF0aC5kZW50cnkpLAogCQkJCSAgICBEVF9ESVIpIDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJCWkrKzsKQEAgLTU1OCw3ICs1NTgsNyBAQAogCWZpbGVfbGlzdF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaChwLCAmc2ItPnNfZmlsZXMpIHsKIAkJc3RydWN0IGZpbGUgKiBmaWxwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZmlsZSwgZl91LmZ1X2xpc3QpOwotCQlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwogCQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKIAkJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wczsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS5jIGIvZnMvcHJvYy9pbm9kZS5jCmluZGV4IDQ5ZGZiMmEuLmUyNjk0NWIgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW5vZGUuYworKysgYi9mcy9wcm9jL2lub2RlLmMKQEAgLTgxLDE0ICs4MSwxNCBAQAogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIH0KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIHByb2NfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICogcHJvY19pbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnByb2NfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcHJvY19pbm9kZSAqZWk7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAotCWVpID0gKHN0cnVjdCBwcm9jX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhwcm9jX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVpID0gKHN0cnVjdCBwcm9jX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhwcm9jX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJZWktPnBpZCA9IE5VTEw7CkBAIC0xMDUsNyArMTA1LDcgQEAKIAlrbWVtX2NhY2hlX2ZyZWUocHJvY19pbm9kZV9jYWNoZXAsIFBST0NfSShpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBwcm9jX2lub2RlICplaSA9IChzdHJ1Y3QgcHJvY19pbm9kZSAqKSBmb287CiAKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mva2NvcmUuYyBiL2ZzL3Byb2Mva2NvcmUuYwppbmRleCAxMjk0ZWRhLi4xYmU3MzA4IDEwMDY0NAotLS0gYS9mcy9wcm9jL2tjb3JlLmMKKysrIGIvZnMvcHJvYy9rY29yZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAorI2RlZmluZSBDT1JFX1NUUiAiQ09SRSIKIAogc3RhdGljIGludCBvcGVuX2tjb3JlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7CkBAIC04MiwxMCArODMsMTEgQEAKIAl9CiAJKmVsZl9idWZsZW4gPQlzaXplb2Yoc3RydWN0IGVsZmhkcikgKyAKIAkJCSgqbnBoZHIgKyAyKSpzaXplb2Yoc3RydWN0IGVsZl9waGRyKSArIAotCQkJMyAqIChzaXplb2Yoc3RydWN0IGVsZl9ub3RlKSArIDQpICsKLQkJCXNpemVvZihzdHJ1Y3QgZWxmX3Byc3RhdHVzKSArCi0JCQlzaXplb2Yoc3RydWN0IGVsZl9wcnBzaW5mbykgKwotCQkJc2l6ZW9mKHN0cnVjdCB0YXNrX3N0cnVjdCk7CisJCQkzICogKChzaXplb2Yoc3RydWN0IGVsZl9ub3RlKSkgKworCQkJICAgICByb3VuZHVwKHNpemVvZihDT1JFX1NUUiksIDQpKSArCisJCQlyb3VuZHVwKHNpemVvZihzdHJ1Y3QgZWxmX3Byc3RhdHVzKSwgNCkgKworCQkJcm91bmR1cChzaXplb2Yoc3RydWN0IGVsZl9wcnBzaW5mbyksIDQpICsKKwkJCXJvdW5kdXAoc2l6ZW9mKHN0cnVjdCB0YXNrX3N0cnVjdCksIDQpOwogCSplbGZfYnVmbGVuID0gUEFHRV9BTElHTigqZWxmX2J1Zmxlbik7CiAJcmV0dXJuIHNpemUgKyAqZWxmX2J1ZmxlbjsKIH0KQEAgLTIxMCw3ICsyMTIsNyBAQAogCW5oZHItPnBfb2Zmc2V0CT0gb2Zmc2V0OwogCiAJLyogc2V0IHVwIHRoZSBwcm9jZXNzIHN0YXR1cyAqLwotCW5vdGVzWzBdLm5hbWUgPSAiQ09SRSI7CisJbm90ZXNbMF0ubmFtZSA9IENPUkVfU1RSOwogCW5vdGVzWzBdLnR5cGUgPSBOVF9QUlNUQVRVUzsKIAlub3Rlc1swXS5kYXRhc3ogPSBzaXplb2Yoc3RydWN0IGVsZl9wcnN0YXR1cyk7CiAJbm90ZXNbMF0uZGF0YSA9ICZwcnN0YXR1czsKQEAgLTIyMSw3ICsyMjMsNyBAQAogCWJ1ZnAgPSBzdG9yZW5vdGUoJm5vdGVzWzBdLCBidWZwKTsKIAogCS8qIHNldCB1cCB0aGUgcHJvY2VzcyBpbmZvICovCi0Jbm90ZXNbMV0ubmFtZQk9ICJDT1JFIjsKKwlub3Rlc1sxXS5uYW1lCT0gQ09SRV9TVFI7CiAJbm90ZXNbMV0udHlwZQk9IE5UX1BSUFNJTkZPOwogCW5vdGVzWzFdLmRhdGFzegk9IHNpemVvZihzdHJ1Y3QgZWxmX3BycHNpbmZvKTsKIAlub3Rlc1sxXS5kYXRhCT0gJnBycHNpbmZvOwpAQCAtMjM4LDcgKzI0MCw3IEBACiAJYnVmcCA9IHN0b3Jlbm90ZSgmbm90ZXNbMV0sIGJ1ZnApOwogCiAJLyogc2V0IHVwIHRoZSB0YXNrIHN0cnVjdHVyZSAqLwotCW5vdGVzWzJdLm5hbWUJPSAiQ09SRSI7CisJbm90ZXNbMl0ubmFtZQk9IENPUkVfU1RSOwogCW5vdGVzWzJdLnR5cGUJPSBOVF9UQVNLU1RSVUNUOwogCW5vdGVzWzJdLmRhdGFzegk9IHNpemVvZihzdHJ1Y3QgdGFza19zdHJ1Y3QpOwogCW5vdGVzWzJdLmRhdGEJPSBjdXJyZW50OwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9ub21tdS5jIGIvZnMvcHJvYy9ub21tdS5jCmluZGV4IGQ3ZGJkZjkuLjVlYzY3MjUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2Mvbm9tbXUuYworKysgYi9mcy9wcm9jL25vbW11LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlmaWxlID0gdm1hLT52bV9maWxlOwogCiAJaWYgKGZpbGUpIHsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJCWRldiA9IGlub2RlLT5pX3NiLT5zX2RldjsKIAkJaW5vID0gaW5vZGUtPmlfaW5vOwogCX0KQEAgLTY3LDcgKzY3LDcgQEAKIAkJaWYgKGxlbiA8IDEpCiAJCQlsZW4gPSAxOwogCQlzZXFfcHJpbnRmKG0sICIlKmMiLCBsZW4sICcgJyk7Ci0JCXNlcV9wYXRoKG0sIGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSwgIiIpOworCQlzZXFfcGF0aChtLCBmaWxlLT5mX3BhdGgubW50LCBmaWxlLT5mX3BhdGguZGVudHJ5LCAiIik7CiAJfQogCiAJc2VxX3B1dGMobSwgJ1xuJyk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfbWlzYy5jIGIvZnMvcHJvYy9wcm9jX21pc2MuYwppbmRleCA5M2M0M2I2Li45MmVhNzc0IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfbWlzYy5jCisrKyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKQEAgLTM5LDEzICszOSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3BzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtOTIsNyArOTQsNyBAQAogCQlMT0FEX0lOVChhKSwgTE9BRF9GUkFDKGEpLAogCQlMT0FEX0lOVChiKSwgTE9BRF9GUkFDKGIpLAogCQlMT0FEX0lOVChjKSwgTE9BRF9GUkFDKGMpLAotCQlucl9ydW5uaW5nKCksIG5yX3RocmVhZHMsIGluaXRfcHNwYWNlLmxhc3RfcGlkKTsKKwkJbnJfcnVubmluZygpLCBucl90aHJlYWRzLCBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnMtPmxhc3RfcGlkKTsKIAlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKIH0KIApAQCAtMjUyLDggKzI1NCwxNSBAQAogewogCWludCBsZW47CiAKLQlzdHJjcHkocGFnZSwgbGludXhfYmFubmVyKTsKLQlsZW4gPSBzdHJsZW4ocGFnZSk7CisJLyogRklYRUQgU1RSSU5HISBEb24ndCB0b3VjaCEgKi8KKwlsZW4gPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsCisJCSIlcyB2ZXJzaW9uICVzIgorCQkiICgiIExJTlVYX0NPTVBJTEVfQlkgIkAiIExJTlVYX0NPTVBJTEVfSE9TVCAiKSIKKwkJIiAoIiBMSU5VWF9DT01QSUxFUiAiKSIKKwkJIiAlc1xuIiwKKwkJdXRzbmFtZSgpLT5zeXNuYW1lLAorCQl1dHNuYW1lKCktPnJlbGVhc2UsCisJCXV0c25hbWUoKS0+dmVyc2lvbik7CiAJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7CiB9CiAKQEAgLTY5Niw5ICs3MDUsMTEgQEAKIAlwcm9jX3N5bWxpbmsoIm1vdW50cyIsIE5VTEwsICJzZWxmL21vdW50cyIpOwogCiAJLyogQW5kIG5vdyBmb3IgdHJpY2tpZXIgb25lcyAqLworI2lmZGVmIENPTkZJR19QUklOVEsKIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJrbXNnIiwgU19JUlVTUiwgJnByb2Nfcm9vdCk7CiAJaWYgKGVudHJ5KQogCQllbnRyeS0+cHJvY19mb3BzID0gJnByb2Nfa21zZ19vcGVyYXRpb25zOworI2VuZGlmCiAJY3JlYXRlX3NlcV9lbnRyeSgiZGV2aWNlcyIsIDAsICZwcm9jX2RldmluZm9fb3BlcmF0aW9ucyk7CiAJY3JlYXRlX3NlcV9lbnRyeSgiY3B1aW5mbyIsIDAsICZwcm9jX2NwdWluZm9fb3BlcmF0aW9ucyk7CiAjaWZkZWYgQ09ORklHX0JMT0NLCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Jvb3QuYyBiL2ZzL3Byb2Mvcm9vdC5jCmluZGV4IGZmZTY2YzMuLjY0ZDI0MmI2IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Jvb3QuYworKysgYi9mcy9wcm9jL3Jvb3QuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19tbXUuYyBiL2ZzL3Byb2MvdGFza19tbXUuYwppbmRleCA2Yjc2OWFmLi41NWFkZTBkIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Rhc2tfbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX21tdS5jCkBAIC05NCw4ICs5NCw4IEBACiAJfQogCiAJaWYgKHZtYSkgewotCQkqbW50ID0gbW50Z2V0KHZtYS0+dm1fZmlsZS0+Zl92ZnNtbnQpOwotCQkqZGVudHJ5ID0gZGdldCh2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5KTsKKwkJKm1udCA9IG1udGdldCh2bWEtPnZtX2ZpbGUtPmZfcGF0aC5tbnQpOworCQkqZGVudHJ5ID0gZGdldCh2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnkpOwogCQlyZXN1bHQgPSAwOwogCX0KIApAQCAtMTM1LDcgKzEzNSw3IEBACiAJaW50IGxlbjsKIAogCWlmIChmaWxlKSB7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCQlkZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7CiAJCWlubyA9IGlub2RlLT5pX2lubzsKIAl9CkBAIC0xNTYsNyArMTU2LDcgQEAKIAkgKi8KIAlpZiAoZmlsZSkgewogCQlwYWRfbGVuX3NwYWNlcyhtLCBsZW4pOwotCQlzZXFfcGF0aChtLCBmaWxlLT5mX3Zmc21udCwgZmlsZS0+Zl9kZW50cnksICJcbiIpOworCQlzZXFfcGF0aChtLCBmaWxlLT5mX3BhdGgubW50LCBmaWxlLT5mX3BhdGguZGVudHJ5LCAiXG4iKTsKIAl9IGVsc2UgewogCQljb25zdCBjaGFyICpuYW1lID0gYXJjaF92bWFfbmFtZSh2bWEpOwogCQlpZiAoIW5hbWUpIHsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19ub21tdS5jIGIvZnMvcHJvYy90YXNrX25vbW11LmMKaW5kZXggMDkxYWE4ZS4uZmNjNWNhZiAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX25vbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX25vbW11LmMKQEAgLTEyNiw4ICsxMjYsOCBAQAogCX0KIAogCWlmICh2bWEpIHsKLQkJKm1udCA9IG1udGdldCh2bWEtPnZtX2ZpbGUtPmZfdmZzbW50KTsKLQkJKmRlbnRyeSA9IGRnZXQodm1hLT52bV9maWxlLT5mX2RlbnRyeSk7CisJCSptbnQgPSBtbnRnZXQodm1hLT52bV9maWxlLT5mX3BhdGgubW50KTsKKwkJKmRlbnRyeSA9IGRnZXQodm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5KTsKIAkJcmVzdWx0ID0gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL3FueDQvZGlyLmMgYi9mcy9xbng0L2Rpci5jCmluZGV4IDBkNzEwM2YuLmM5NGRiMWQgMTAwNjQ0Ci0tLSBhL2ZzL3FueDQvZGlyLmMKKysrIGIvZnMvcW54NC9kaXIuYwpAQCAtMjIsNyArMjIsNyBAQAogCiBzdGF0aWMgaW50IHFueDRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpkZTsKZGlmZiAtLWdpdCBhL2ZzL3FueDQvaW5vZGUuYyBiL2ZzL3FueDQvaW5vZGUuYwppbmRleCA1YTQxZGIyLi5jMDQ3ZGM2IDEwMDY0NAotLS0gYS9mcy9xbng0L2lub2RlLmMKKysrIGIvZnMvcW54NC9pbm9kZS5jCkBAIC01MTUsMTIgKzUxNSwxMiBAQAogCWJyZWxzZShiaCk7CiB9CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnFueDRfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpxbng0X2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqcW54NF9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBxbng0X2lub2RlX2luZm8gKmVpOwotCWVpID0ga21lbV9jYWNoZV9hbGxvYyhxbng0X2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVpID0ga21lbV9jYWNoZV9hbGxvYyhxbng0X2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwpAQCAtNTMxLDcgKzUzMSw3IEBACiAJa21lbV9jYWNoZV9mcmVlKHFueDRfaW5vZGVfY2FjaGVwLCBxbng0X2koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLAorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHFueDRfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHFueDRfaW5vZGVfaW5mbyAqKSBmb287CmRpZmYgLS1naXQgYS9mcy9yYW1mcy9maWxlLW5vbW11LmMgYi9mcy9yYW1mcy9maWxlLW5vbW11LmMKaW5kZXggYmZlNWRiZi4uNjFjYmUxZSAxMDA2NDQKLS0tIGEvZnMvcmFtZnMvZmlsZS1ub21tdS5jCisrKyBiL2ZzL3JhbWZzL2ZpbGUtbm9tbXUuYwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgbWF4cGFnZXMsIGxwYWdlcywgbnIsIGxvb3AsIHJldDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEwsICoqcHRyLCAqcGFnZTsKIAlsb2ZmX3QgaXNpemU7CiAKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCBmNzkyMDAwLi43MDdhYzIxIDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC02NCwxMyArNjQsMTMgQEAKIAlsb2NrX2tlcm5lbCgpOwogCXN3aXRjaCAob3JpZ2luKSB7CiAJCWNhc2UgMjoKLQkJCW9mZnNldCArPSBpX3NpemVfcmVhZChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCQlvZmZzZXQgKz0gaV9zaXplX3JlYWQoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgogCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOwogCX0KIAlyZXR2YWwgPSAtRUlOVkFMOwotCWlmIChvZmZzZXQ+PTAgJiYgb2Zmc2V0PD1maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19tYXhieXRlcykgeworCWlmIChvZmZzZXQ+PTAgJiYgb2Zmc2V0PD1maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7CiAJCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKIAkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OwogCQkJZmlsZS0+Zl92ZXJzaW9uID0gMDsKQEAgLTk1LDcgKzk1LDcgQEAKIAlsb2NrX2tlcm5lbCgpOwogCXN3aXRjaCAob3JpZ2luKSB7CiAJCWNhc2UgMjoKLQkJCW9mZnNldCArPSBpX3NpemVfcmVhZChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCQlvZmZzZXQgKz0gaV9zaXplX3JlYWQoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgogCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJaWYgKHVubGlrZWx5KChwb3MgPCAwKSB8fCAobG9mZl90KSAocG9zICsgY291bnQpIDwgMCkpCiAJCWdvdG8gRWludmFsOwogCi0JaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKHVubGlrZWx5KGlub2RlLT5pX2Zsb2NrICYmIE1BTkRBVE9SWV9MT0NLKGlub2RlKSkpIHsKIAkJaW50IHJldHZhbCA9IGxvY2tzX21hbmRhdG9yeV9hcmVhKAogCQkJcmVhZF93cml0ZSA9PSBSRUFEID8gRkxPQ0tfVkVSSUZZX1JFQUQgOiBGTE9DS19WRVJJRllfV1JJVEUsCkBAIC0yNzMsNyArMjczLDcgQEAKIAkJCWVsc2UKIAkJCQlyZXQgPSBkb19zeW5jX3JlYWQoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsKIAkJCWlmIChyZXQgPiAwKSB7Ci0JCQkJZnNub3RpZnlfYWNjZXNzKGZpbGUtPmZfZGVudHJ5KTsKKwkJCQlmc25vdGlmeV9hY2Nlc3MoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJCQkJY3VycmVudC0+cmNoYXIgKz0gcmV0OwogCQkJfQogCQkJY3VycmVudC0+c3lzY3IrKzsKQEAgLTMzMSw3ICszMzEsNyBAQAogCQkJZWxzZQogCQkJCXJldCA9IGRvX3N5bmNfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsKIAkJCWlmIChyZXQgPiAwKSB7Ci0JCQkJZnNub3RpZnlfbW9kaWZ5KGZpbGUtPmZfZGVudHJ5KTsKKwkJCQlmc25vdGlmeV9tb2RpZnkoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJCQkJY3VycmVudC0+d2NoYXIgKz0gcmV0OwogCQkJfQogCQkJY3VycmVudC0+c3lzY3crKzsKQEAgLTQ1MCw4ICs0NTAsNiBAQAogCXJldHVybiBzZWc7CiB9CiAKLUVYUE9SVF9VTlVTRURfU1lNQk9MKGlvdl9zaG9ydGVuKTsgIC8qICBKdW5lIDIwMDYgICovCi0KIHNzaXplX3QgZG9fc3luY19yZWFkdl93cml0ZXYoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAogCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcywgaW92X2ZuX3QgZm4pCiB7CkBAIC02MjgsOSArNjI2LDkgQEAKIAkJa2ZyZWUoaW92KTsKIAlpZiAoKHJldCArICh0eXBlID09IFJFQUQpKSA+IDApIHsKIAkJaWYgKHR5cGUgPT0gUkVBRCkKLQkJCWZzbm90aWZ5X2FjY2VzcyhmaWxlLT5mX2RlbnRyeSk7CisJCQlmc25vdGlmeV9hY2Nlc3MoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJCWVsc2UKLQkJCWZzbm90aWZ5X21vZGlmeShmaWxlLT5mX2RlbnRyeSk7CisJCQlmc25vdGlmeV9tb2RpZnkoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC03MjIsNyArNzIwLDcgQEAKIAlpZiAoIShpbl9maWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKIAkJZ290byBmcHV0X2luOwogCXJldHZhbCA9IC1FSU5WQUw7Ci0JaW5faW5vZGUgPSBpbl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbl9pbm9kZSA9IGluX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKCFpbl9pbm9kZSkKIAkJZ290byBmcHV0X2luOwogCWlmICghaW5fZmlsZS0+Zl9vcCB8fCAhaW5fZmlsZS0+Zl9vcC0+c2VuZGZpbGUpCkBAIC03NTQsNyArNzUyLDcgQEAKIAlyZXR2YWwgPSAtRUlOVkFMOwogCWlmICghb3V0X2ZpbGUtPmZfb3AgfHwgIW91dF9maWxlLT5mX29wLT5zZW5kcGFnZSkKIAkJZ290byBmcHV0X291dDsKLQlvdXRfaW5vZGUgPSBvdXRfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJb3V0X2lub2RlID0gb3V0X2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJcmV0dmFsID0gcndfdmVyaWZ5X2FyZWEoV1JJVEUsIG91dF9maWxlLCAmb3V0X2ZpbGUtPmZfcG9zLCBjb3VudCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gZnB1dF9vdXQ7CmRpZmYgLS1naXQgYS9mcy9yZWFkZGlyLmMgYi9mcy9yZWFkZGlyLmMKaW5kZXggYmZmM2VlNS4uZjM5ZjViMyAxMDA2NDQKLS0tIGEvZnMvcmVhZGRpci5jCisrKyBiL2ZzL3JlYWRkaXIuYwpAQCAtMjEsNyArMjEsNyBAQAogCiBpbnQgdmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIGZpbGxkaXJfdCBmaWxsZXIsIHZvaWQgKmJ1ZikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IHJlcyA9IC1FTk9URElSOwogCWlmICghZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+cmVhZGRpcikKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9iaXRtYXAuYyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCmluZGV4IGUzZDQ2NmEuLmIyODZjY2IgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCisrKyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCkBAIC03MDgsNyArNzA4LDcgQEAKICAqLwogc3RhdGljIGludCBnZXRfbGVmdF9uZWlnaGJvcihyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCiB7Ci0Jc3RydWN0IHBhdGggKnBhdGg7CisJc3RydWN0IHRyZWVwYXRoICpwYXRoOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAJaW50IHBvc19pbl9pdGVtOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZGlyLmMgYi9mcy9yZWlzZXJmcy9kaXIuYwppbmRleCA2NTcwNTBhLi45NmEyZjg4IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9kaXIuYworKysgYi9mcy9yZWlzZXJmcy9kaXIuYwpAQCAtNDUsNyArNDUsNyBAQAogLy8KIHN0YXRpYyBpbnQgcmVpc2VyZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGNwdV9rZXkgcG9zX2tleTsJLyoga2V5IG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeSAoa2V5IG9mIGRpcmVjdG9yeSBlbnRyeSkgKi8KIAlJTklUSUFMSVpFX1BBVEgocGF0aF90b19lbnRyeSk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKQEAgLTEzNSw3ICsxMzUsNyBAQAogCQkJCS8qIElnbm9yZSB0aGUgLnJlaXNlcmZzX3ByaXYgZW50cnkgKi8KIAkJCQlpZiAocmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSAmJgogCQkJCSAgICAhb2xkX2Zvcm1hdF9vbmx5KGlub2RlLT5pX3NiKSAmJgotCQkJCSAgICBmaWxwLT5mX2RlbnRyeSA9PSBpbm9kZS0+aV9zYi0+c19yb290ICYmCisJCQkJICAgIGZpbHAtPmZfcGF0aC5kZW50cnkgPT0gaW5vZGUtPmlfc2ItPnNfcm9vdCAmJgogCQkJCSAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdCAmJgogCQkJCSAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZQogCQkJCSAgICAmJiBkZWhfb2JqZWN0aWQoZGVoKSA9PQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZmlsZS5jIGIvZnMvcmVpc2VyZnMvZmlsZS5jCmluZGV4IGI2N2NlOTM1Li45OWI2ZjMyIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maWxlLmMKKysrIGIvZnMvcmVpc2VyZnMvZmlsZS5jCkBAIC03NCw3ICs3NCw4IEBACiAJCQlpZ3JhYihpbm9kZSk7CiAJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAogCQkJCQkgInBpbm5pbmcgaW5vZGUgJWx1IGJlY2F1c2UgdGhlICIKLQkJCQkJICJwcmVhbGxvY2F0aW9uIGNhbid0IGJlIGZyZWVkIik7CisJCQkJCSAicHJlYWxsb2NhdGlvbiBjYW4ndCBiZSBmcmVlZCIsCisJCQkJCSBpbm9kZS0+aV9pbm8pOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC0zMTYsMTIgKzMxNywxMSBAQAogCQkJLyogYXJlYSBmaWxsZWQgd2l0aCB6ZXJvZXMsIHRvIHN1cHBseSBhcyBsaXN0IG9mIHplcm8gYmxvY2tudW1iZXJzCiAJCQkgICBXZSBhbGxvY2F0ZSBpdCBvdXRzaWRlIG9mIGxvb3AganVzdCBpbiBjYXNlIGxvb3Agd291bGQgc3BpbiBmb3IKIAkJCSAgIHNldmVyYWwgaXRlcmF0aW9ucy4gKi8KLQkJCWNoYXIgKnplcm9zID0ga21hbGxvYyh0b19wYXN0ZSAqIFVORk1fUF9TSVpFLCBHRlBfQVRPTUlDKTsJLy8gV2UgY2Fubm90IGluc2VydCBtb3JlIHRoYW4gTUFYX0lURU1fTEVOIGJ5dGVzIGFueXdheS4KKwkJCWNoYXIgKnplcm9zID0ga3phbGxvYyh0b19wYXN0ZSAqIFVORk1fUF9TSVpFLCBHRlBfQVRPTUlDKTsJLy8gV2UgY2Fubm90IGluc2VydCBtb3JlIHRoYW4gTUFYX0lURU1fTEVOIGJ5dGVzIGFueXdheS4KIAkJCWlmICghemVyb3MpIHsKIAkJCQlyZXMgPSAtRU5PTUVNOwogCQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKIAkJCX0KLQkJCW1lbXNldCh6ZXJvcywgMCwgdG9fcGFzdGUgKiBVTkZNX1BfU0laRSk7CiAJCQlkbyB7CiAJCQkJdG9fcGFzdGUgPQogCQkJCSAgICBtaW5fdChfX3U2NCwgaG9sZV9zaXplLApAQCAtNDA2LDYgKzQwNiw4IEBACiAJCQkJICAgd2UgcmVzdGFydCBpdC4gVGhpcyB3aWxsIGFsc28gZnJlZSB0aGUgcGF0aC4gKi8KIAkJCQlpZiAoam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kCiAJCQkJICAgICh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKKwkJCQkJaW5vZGUtPmlfc2l6ZSA9IGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKworCQkJCQkJKHRvX3Bhc3RlIDw8IGlub2RlLT5pX2Jsa2JpdHMpOwogCQkJCQlyZXMgPQogCQkJCQkgICAgcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsCiAJCQkJCQkJCSZwYXRoKTsKQEAgLTEwNDQsNiArMTA0Niw3IEBACiAJCQljaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzWzBdLCBLTV9VU0VSMCk7CiAJCQltZW1zZXQoa2FkZHIsIDAsIGZyb20pOwogCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocHJlcGFyZWRfcGFnZXNbMF0pOwogCQl9CiAJCWlmICh0byAhPSBQQUdFX0NBQ0hFX1NJWkUpIHsJLyogTGFzdCBwYWdlIG5lZWRzIHRvIGJlIHBhcnRpYWxseSB6ZXJvZWQgKi8KIAkJCWNoYXIgKmthZGRyID0KQEAgLTEwNTEsNiArMTA1NCw3IEBACiAJCQkJCUtNX1VTRVIwKTsKIAkJCW1lbXNldChrYWRkciArIHRvLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSB0byk7CiAJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMgLSAxXSk7CiAJCX0KIAogCQkvKiBTaW5jZSBhbGwgYmxvY2tzIGFyZSBuZXcgLSB1c2UgYWxyZWFkeSBjYWxjdWxhdGVkIHZhbHVlICovCkBAIC0xMTg0LDYgKzExODgsNyBAQAogCQkJCQltZW1zZXQoa2FkZHIgKyBibG9ja19zdGFydCwgMCwKIAkJCQkJICAgICAgIGZyb20gLSBibG9ja19zdGFydCk7CiAJCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocHJlcGFyZWRfcGFnZXNbMF0pOwogCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCQl9CiAJCQl9CkBAIC0xMjIxLDYgKzEyMjYsNyBAQAogCQkJCQkJCUtNX1VTRVIwKTsKIAkJCQkJbWVtc2V0KGthZGRyICsgdG8sIDAsIGJsb2NrX2VuZCAtIHRvKTsKIAkJCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJCQlmbHVzaF9kY2FjaGVfcGFnZShwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMgLSAxXSk7CiAJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJCX0KIAkJCX0KQEAgLTEyODIsNyArMTI4OCw3IEBACiAJbG9mZl90IHBvczsJCS8vIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiAJc3NpemVfdCByZXM7CQkvLyByZXR1cm4gdmFsdWUgb2YgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCB3ZSBjYWxsLgogCWludCBlcnIgPSAwOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsJLy8gSW5vZGUgb2YgdGhlIGZpbGUgdGhhdCB3ZSBhcmUgd3JpdGluZyB0by4KKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsJLy8gSW5vZGUgb2YgdGhlIGZpbGUgdGhhdCB3ZSBhcmUgd3JpdGluZyB0by4KIAkvKiBUbyBzaW1wbGlmeSBjb2RpbmcgYXQgdGhpcyB0aW1lLCB3ZSBzdG9yZQogCSAgIGxvY2tlZCBwYWdlcyBpbiBhcnJheSBmb3Igbm93ICovCiAJc3RydWN0IHBhZ2UgKnByZXBhcmVkX3BhZ2VzW1JFSVNFUkZTX1dSSVRFX1BBR0VTX0FUX0FfVElNRV07CkBAIC0xMzA2LDU2ICsxMzEyLDggQEAKIAkJCWNvdW50ID0gTUFYX05PTl9MRlMgLSAodW5zaWduZWQgbG9uZykqcHBvczsKIAl9CiAKLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSB7CS8vIERpcmVjdCBJTyBuZWVkcyB0cmVhdG1lbnQKLQkJc3NpemVfdCByZXN1bHQsIGFmdGVyX2ZpbGVfZW5kID0gMDsKLQkJaWYgKCgqcHBvcyArIGNvdW50ID49IGlub2RlLT5pX3NpemUpCi0JCSAgICB8fCAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSkgewotCQkJLyogSWYgd2UgYXJlIGFwcGVuZGluZyBhIGZpbGUsIHdlIG5lZWQgdG8gcHV0IHRoaXMgc2F2ZWxpbmsgaW4gaGVyZS4KLQkJCSAgIElmIHdlIHdpbGwgY3Jhc2ggd2hpbGUgZG9pbmcgZGlyZWN0IGlvLCBmaW5pc2hfdW5maW5pc2hlZCB3aWxsCi0JCQkgICBjdXQgdGhlIGdhcmJhZ2UgZnJvbSB0aGUgZmlsZSBlbmQuICovCi0JCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkJCWVyciA9Ci0JCQkgICAgam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLAotCQkJCQkgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCQkJCXJldHVybiBlcnI7Ci0JCQl9Ci0JCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwotCQkJYWRkX3NhdmVfbGluaygmdGgsIGlub2RlLCAxIC8qIFRydW5jYXRlICovICk7Ci0JCQlhZnRlcl9maWxlX2VuZCA9IDE7Ci0JCQllcnIgPQotCQkJICAgIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsCi0JCQkJCUpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKLQkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCX0KLQkJcmVzdWx0ID0gZG9fc3luY193cml0ZShmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKLQotCQlpZiAoYWZ0ZXJfZmlsZV9lbmQpIHsJLyogTm93IHVwZGF0ZSBpX3NpemUgYW5kIHJlbW92ZSB0aGUgc2F2ZWxpbmsgKi8KLQkJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0JCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkJCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKLQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCQkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMSk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQkJZXJyID0gcmVtb3ZlX3NhdmVfbGluayhpbm9kZSwgMSAvKiB0cnVuY2F0ZSAqLyApOwotCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQorCWlmIChmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpCisJCXJldHVybiBkb19zeW5jX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOwogCiAJaWYgKHVubGlrZWx5KChzc2l6ZV90KSBjb3VudCA8IDApKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzNzcsNyArMTMzNSw3IEBACiAJaWYgKGNvdW50ID09IDApCiAJCWdvdG8gb3V0OwogCi0JcmVzID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOworCXJlcyA9IHJlbW92ZV9zdWlkKGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCWlmIChyZXMpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maXhfbm9kZS5jIGIvZnMvcmVpc2VyZnMvZml4X25vZGUuYwppbmRleCA2ZDBlNTU0Li4wZWUzNWM2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9maXhfbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2ZpeF9ub2RlLmMKQEAgLTk1Nyw3ICs5NTcsNyBAQAogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX3BhcmVudDsKIAlJTklUSUFMSVpFX1BBVEgoc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7Ci0Jc3RydWN0IHBhdGggKnBfc19wYXRoID0gcF9zX3RiLT50Yl9wYXRoOworCXN0cnVjdCB0cmVlcGF0aCAqcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7CiAJc3RydWN0IGNwdV9rZXkgc19scl9mYXRoZXJfa2V5OwogCWludCBuX2NvdW50ZXIsCiAJICAgIG5fcG9zaXRpb24gPSBJTlRfTUFYLApAQCAtMTA3NCw3ICsxMDc0LDcgQEAKICAqLwogc3RhdGljIGludCBnZXRfcGFyZW50cyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIsIGludCBuX2gpCiB7Ci0Jc3RydWN0IHBhdGggKnBfc19wYXRoID0gcF9zX3RiLT50Yl9wYXRoOworCXN0cnVjdCB0cmVlcGF0aCAqcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7CiAJaW50IG5fcG9zaXRpb24sCiAJICAgIG5fcmV0X3ZhbHVlLAogCSAgICBuX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKQEAgLTE4ODUsNyArMTg4NSw3IEBACiBzdGF0aWMgaW50IGdldF9kaXJlY3RfcGFyZW50KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaDsKLQlzdHJ1Y3QgcGF0aCAqcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7CisJc3RydWN0IHRyZWVwYXRoICpwX3NfcGF0aCA9IHBfc190Yi0+dGJfcGF0aDsKIAlpbnQgbl9wb3NpdGlvbiwKIAkgICAgbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCk7CiAKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lub2RlLmMgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCmluZGV4IDljNjliY2EuLmYzZDFjNGEgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2lub2RlLmMKKysrIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiB9CiAKIC8qc3RhdGljKi8gaW50IHJlc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpCisJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHRyZWVwYXRoICpwYXRoKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOwogCWludCBsZW4gPSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkOwpAQCAtMjE2LDExICsyMTYsMTIgQEAKIAlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKIAorCXBhdGhyZWxzZShwYXRoKTsKKwogCS8qIHdlIGNhbm5vdCByZXN0YXJ0IHdoaWxlIG5lc3RlZCAqLwogCWlmICh0aC0+dF9yZWZjb3VudCA+IDEpIHsKIAkJcmV0dXJuIDA7CiAJfQotCXBhdGhyZWxzZShwYXRoKTsKIAlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKIAllcnIgPSBqb3VybmFsX2VuZCh0aCwgcywgbGVuKTsKIAlpZiAoIWVycikgewpAQCAtNTY5LDcgKzU3MCw3IEBACiAJCQkJICBsb25nIGJsb2NrLAogCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgIGJfYmxvY2tucl90ICogYWxsb2NhdGVkX2Jsb2NrX25yLAotCQkJCSAgc3RydWN0IHBhdGggKnBhdGgsIGludCBmbGFncykKKwkJCQkgIHN0cnVjdCB0cmVlcGF0aCAqcGF0aCwgaW50IGZsYWdzKQogewogCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCkBAIC05MjgsMTUgKzkyOSwxMiBAQAogCQkJaWYgKGJsb2Nrc19uZWVkZWQgPT0gMSkgewogCQkJCXVuID0gJnVuZl9zaW5nbGU7CiAJCQl9IGVsc2UgewotCQkJCXVuID0ga21hbGxvYyhtaW4oYmxvY2tzX25lZWRlZCwgbWF4X3RvX2luc2VydCkgKiBVTkZNX1BfU0laRSwgR0ZQX0FUT01JQyk7CS8vIFdlIG5lZWQgdG8gYXZvaWQgc2NoZWR1bGluZy4KKwkJCQl1biA9IGt6YWxsb2MobWluKGJsb2Nrc19uZWVkZWQsIG1heF90b19pbnNlcnQpICogVU5GTV9QX1NJWkUsIEdGUF9BVE9NSUMpOwkvLyBXZSBuZWVkIHRvIGF2b2lkIHNjaGVkdWxpbmcuCiAJCQkJaWYgKCF1bikgewogCQkJCQl1biA9ICZ1bmZfc2luZ2xlOwogCQkJCQlibG9ja3NfbmVlZGVkID0gMTsKIAkJCQkJbWF4X3RvX2luc2VydCA9IDA7Ci0JCQkJfSBlbHNlCi0JCQkJCW1lbXNldCh1biwgMCwKLQkJCQkJICAgICAgIFVORk1fUF9TSVpFICogbWluKGJsb2Nrc19uZWVkZWQsCi0JCQkJCQkJCSBtYXhfdG9faW5zZXJ0KSk7CisJCQkJfQogCQkJfQogCQkJaWYgKGJsb2Nrc19uZWVkZWQgPD0gbWF4X3RvX2luc2VydCkgewogCQkJCS8qIHdlIGFyZSBnb2luZyB0byBhZGQgdGFyZ2V0IGJsb2NrIHRvIHRoZSBmaWxlLiBVc2UgYWxsb2NhdGVkCkBAIC0xMTA5LDcgKzExMDcsNyBAQAogLy8KIAogLy8gY2FsbGVkIGJ5IHJlYWRfbG9ja2VkX2lub2RlCi1zdGF0aWMgdm9pZCBpbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKQorc3RhdGljIHZvaWQgaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgdHJlZXBhdGggKnBhdGgpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKQEAgLTEyODYsNyArMTI4NCw3IEBACiAvKiBOT1RFLCB5b3UgbXVzdCBwcmVwYXJlIHRoZSBidWZmZXIgaGVhZCBiZWZvcmUgc2VuZGluZyBpdCBoZXJlLAogKiogYW5kIHRoZW4gbG9nIGl0IGFmdGVyIHRoZSBjYWxsCiAqLwotc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRfZGF0YShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IGlub2RlICppbm9kZSwKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0X2RhdGEoc3RydWN0IHRyZWVwYXRoICpwYXRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICBsb2ZmX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwpAQCAtMTY1NSw3ICsxNjUzLDcgQEAKICAgIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJpZXMgKi8KIHN0YXRpYyBpbnQgcmVpc2VyZnNfbmV3X2RpcmVjdG9yeShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKIAkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICppaCwgc3RydWN0IHBhdGggKnBhdGgsCisJCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICppaCwgc3RydWN0IHRyZWVwYXRoICpwYXRoLAogCQkJCSAgc3RydWN0IGlub2RlICpkaXIpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHRoLT50X3N1cGVyOwpAQCAtMTcxNCw3ICsxNzEyLDcgQEAKICAgIGNvbnRhaW5pbmcgdGhlIGJvZHkgb2Ygc3ltbGluayAqLwogc3RhdGljIGludCByZWlzZXJmc19uZXdfc3ltbGluayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwJLyogSW5vZGUgb2Ygc3ltbGluayAqLwogCQkJCXN0cnVjdCBpdGVtX2hlYWQgKmloLAotCQkJCXN0cnVjdCBwYXRoICpwYXRoLCBjb25zdCBjaGFyICpzeW1uYW1lLAorCQkJCXN0cnVjdCB0cmVlcGF0aCAqcGF0aCwgY29uc3QgY2hhciAqc3ltbmFtZSwKIAkJCQlpbnQgaXRlbV9sZW4pCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHRoLT50X3N1cGVyOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW9jdGwuYyBiL2ZzL3JlaXNlcmZzL2lvY3RsLmMKaW5kZXggOWM1NzU3OC4uYjQ4NGQyOSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW9jdGwuYworKysgYi9mcy9yZWlzZXJmcy9pb2N0bC5jCkBAIC05OSw3ICs5OSw3IEBACiBsb25nIHJlaXNlcmZzX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IHJldDsKIAogCS8qIFRoZXNlIGFyZSBqdXN0IG1pc25hbWVkLCB0aGV5IGFjdHVhbGx5IGdldC9wdXQgZnJvbS90byB1c2VyIGFuIGludCAqLwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvam91cm5hbC5jIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCmluZGV4IGFkOGNiYzQuLjcyODBhMjMgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYworKysgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogCiAvKiBnZXRzIGEgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqIGZyb20gYSBsaXN0IGhlYWQgKi8KICNkZWZpbmUgSk9VUk5BTF9MSVNUX0VOVFJZKGgpIChsaXN0X2VudHJ5KChoKSwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCwgXApAQCAtMTAzLDcgKzEwNCw3IEBACiAJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwpOwogc3RhdGljIGludCBkaXJ0eV9vbmVfdHJhbnNhY3Rpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzLAogCQkJCSBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCk7Ci1zdGF0aWMgdm9pZCBmbHVzaF9hc3luY19jb21taXRzKHZvaWQgKnApOworc3RhdGljIHZvaWQgZmx1c2hfYXN5bmNfY29tbWl0cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgcXVldWVfbG9nX3dyaXRlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwogCiAvKiB2YWx1ZXMgZm9yIGpvaW4gaW4gZG9fam91cm5hbF9iZWdpbl9yICovCkBAIC05NzAsNyArOTcxLDcgQEAKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwocyk7CiAJaWYgKGF0b21pY19yZWFkKCZqLT5qX2FzeW5jX3Rocm90dGxlKSkKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFogLyAxMCk7CisJCWNvbmdlc3Rpb25fd2FpdChXUklURSwgSFogLyAxMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NjMsNyArMTQ2NCw3IEBACiAJCX0KIAogCQkvKiBpZiBzb21lb25lIGhhcyB0aGlzIGJsb2NrIGluIGEgbmV3ZXIgdHJhbnNhY3Rpb24sIGp1c3QgbWFrZQotCQkgKiogc3VyZSB0aGV5IGFyZSBjb21taXRlZCwgYW5kIGRvbid0IHRyeSB3cml0aW5nIGl0IHRvIGRpc2sKKwkJICoqIHN1cmUgdGhleSBhcmUgY29tbWl0dGVkLCBhbmQgZG9uJ3QgdHJ5IHdyaXRpbmcgaXQgdG8gZGlzawogCQkgKi8KIAkJaWYgKHBqbCkgewogCQkJaWYgKGF0b21pY19yZWFkKCZwamwtPmpfY29tbWl0X2xlZnQpKQpAQCAtMjgzNSw3ICsyODM2LDggQEAKIAlpZiAocmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCA8PSAxKQogCQljb21taXRfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJyZWlzZXJmcyIpOwogCi0JSU5JVF9XT1JLKCZqb3VybmFsLT5qX3dvcmssIGZsdXNoX2FzeW5jX2NvbW1pdHMsIHBfc19zYik7CisJSU5JVF9ERUxBWUVEX1dPUksoJmpvdXJuYWwtPmpfd29yaywgZmx1c2hfYXN5bmNfY29tbWl0cyk7CisJam91cm5hbC0+al93b3JrX3NiID0gcF9zX3NiOwogCXJldHVybiAwOwogICAgICAgZnJlZV9hbmRfcmV0dXJuOgogCWZyZWVfam91cm5hbF9yYW0ocF9zX3NiKTsKQEAgLTMzODMsNyArMzM4NSw3IEBACiAKIC8qCiAqKiBmb3IgYW55IGNub2RlIGluIGEgam91cm5hbCBsaXN0LCBpdCBjYW4gb25seSBiZSBkaXJ0aWVkIG9mIGFsbCB0aGUKLSoqIHRyYW5zYWN0aW9ucyB0aGF0IGluY2x1ZGUgaXQgYXJlIGNvbW1pdGVkIHRvIGRpc2suCisqKiB0cmFuc2FjdGlvbnMgdGhhdCBpbmNsdWRlIGl0IGFyZSBjb21taXR0ZWQgdG8gZGlzay4KICoqIHRoaXMgY2hlY2tzIHRocm91Z2ggZWFjaCB0cmFuc2FjdGlvbiwgYW5kIHJldHVybnMgMSBpZiB5b3UgYXJlIGFsbG93ZWQgdG8gZGlydHksCiAqKiBhbmQgMCBpZiB5b3UgYXJlbid0CiAqKgpAQCAtMzQyNSw3ICszNDI3LDcgQEAKIH0KIAogLyogc3luY3MgdGhlIGNvbW1pdCBibG9ja3MsIGJ1dCBkb2VzIG5vdCBmb3JjZSB0aGUgcmVhbCBidWZmZXJzIHRvIGRpc2sKLSoqIHdpbGwgd2FpdCB1bnRpbCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBkb25lL2NvbW1pdGVkIGJlZm9yZSByZXR1cm5pbmcgCisqKiB3aWxsIHdhaXQgdW50aWwgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgZG9uZS9jb21taXR0ZWQgYmVmb3JlIHJldHVybmluZyAKICovCiBpbnQgam91cm5hbF9lbmRfc3luYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKIAkJICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKQpAQCAtMzQ0NiwxMCArMzQ0OCwxMSBAQAogLyoKICoqIHdyaXRlYmFjayB0aGUgcGVuZGluZyBhc3luYyBjb21taXRzIHRvIGRpc2sKICovCi1zdGF0aWMgdm9pZCBmbHVzaF9hc3luY19jb21taXRzKHZvaWQgKnApCitzdGF0aWMgdm9pZCBmbHVzaF9hc3luY19jb21taXRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHA7Ci0Jc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwsIGpfd29yay53b3JrKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IGpvdXJuYWwtPmpfd29ya19zYjsKIAlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKIApkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbmFtZWkuYyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKaW5kZXggYWJkZTFlZC4uMjNmNWNkNSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvbmFtZWkuYworKysgYi9mcy9yZWlzZXJmcy9uYW1laS5jCkBAIC01NCw3ICs1NCw3IEBACiAKIC8vIGNvbW1lbnQ/ICBtYXliZSBzb21ldGhpbmcgbGlrZSBzZXQgZGUgdG8gcG9pbnQgdG8gd2hhdCB0aGUgcGF0aCBwb2ludHMgdG8/CiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlX2l0ZW1fbG9jYXRpb24oc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUsCi0JCQkJCXN0cnVjdCBwYXRoICpwYXRoKQorCQkJCQlzdHJ1Y3QgdHJlZXBhdGggKnBhdGgpCiB7CiAJZGUtPmRlX2JoID0gZ2V0X2xhc3RfYmgocGF0aCk7CiAJZGUtPmRlX2loID0gZ2V0X2loKHBhdGgpOwpAQCAtMTEzLDcgKzExMyw3IEBACiAKIC8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KIGludCBzZWFyY2hfYnlfZW50cnlfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCi0JCQlzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpCisJCQlzdHJ1Y3QgdHJlZXBhdGggKnBhdGgsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKQogewogCWludCByZXR2YWw7CiAKQEAgLTI4Miw3ICsyODIsNyBAQAogLy8gbWF5IHJldHVybiBOQU1FX0ZPVU5ELCBOQU1FX0ZPVU5EX0lOVklTSUJMRSwgTkFNRV9OT1RfRk9VTkQKIC8vIEZJWE1FOiBzaG91bGQgYWRkIHNvbWV0aGluZyBsaWtlIElPRVJST1IKIHN0YXRpYyBpbnQgcmVpc2VyZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCi0JCQkgICAgICAgc3RydWN0IHBhdGggKnBhdGhfdG9fZW50cnksCisJCQkgICAgICAgc3RydWN0IHRyZWVwYXRoICpwYXRoX3RvX2VudHJ5LAogCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKQogewogCXN0cnVjdCBjcHVfa2V5IGtleV90b19zZWFyY2g7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcm9jZnMuYyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCmluZGV4IGM1MzNlYzEuLmVjYzk5NDMgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCisrKyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAl9CiAjaWYgZGVmaW5lZCggUkVJU0VSRlNfVVNFX09JRE1BUEYgKQogCWlmIChzYl9pbmZvLT5vaWRtYXAudXNlX2ZpbGUgJiYgKHNiX2luZm8tPm9pZG1hcC5tYXBmICE9IE5VTEwpKSB7Ci0JCWxvZmZfdCBzaXplID0gc2JfaW5mby0+b2lkbWFwLm1hcGYtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7CisJCWxvZmZfdCBzaXplID0gc2JfaW5mby0+b2lkbWFwLm1hcGYtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2l6ZTsKIAkJdG90YWxfdXNlZCArPSBzaXplIC8gc2l6ZW9mKHJlaXNlcmZzX29pZGludGVydmFsX2RfdCk7CiAJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdHJlZS5jIGIvZnMvcmVpc2VyZnMvc3RyZWUuYwppbmRleCA1MjQwYWJlLi40N2U3MDI3IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdHJlZS5jCisrKyBiL2ZzL3JlaXNlcmZzL3N0cmVlLmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogICAgb2YgdGhlIHBhdGgsIGFuZCBnb2luZyB1cHdhcmRzLiAgV2UgbXVzdCBjaGVjayB0aGUgcGF0aCdzIHZhbGlkaXR5IGF0IGVhY2ggc3RlcC4gIElmIHRoZSBrZXkgaXMgbm90IGluCiAgICB0aGUgcGF0aCwgdGhlcmUgaXMgbm8gZGVsaW1pdGluZyBrZXkgaW4gdGhlIHRyZWUgKGJ1ZmZlciBpcyBmaXJzdCBvciBsYXN0IGJ1ZmZlciBpbiB0cmVlKSwgYW5kIGluIHRoaXMKICAgIGNhc2Ugd2UgcmV0dXJuIGEgc3BlY2lhbCBrZXksIGVpdGhlciBNSU5fS0VZIG9yIE1BWF9LRVkuICovCi1zdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9sa2V5KGNvbnN0IHN0cnVjdCBwYXRoCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9sa2V5KGNvbnN0IHN0cnVjdCB0cmVlcGF0aAogCQkJCQkJICAqcF9zX2Noa19wYXRoLAogCQkJCQkJICBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sKIAkJCQkJCSAgKnBfc19zYikKQEAgLTI5MCw3ICsyOTAsNyBAQAogfQogCiAvKiBHZXQgZGVsaW1pdGluZyBrZXkgb2YgdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aCBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yLiAqLwotaW5saW5lIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9ya2V5KGNvbnN0IHN0cnVjdCBwYXRoICpwX3NfY2hrX3BhdGgsCitpbmxpbmUgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZ2V0X3JrZXkoY29uc3Qgc3RydWN0IHRyZWVwYXRoICpwX3NfY2hrX3BhdGgsCiAJCQkJCSAgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQogewogCWludCBuX3Bvc2l0aW9uLCBuX3BhdGhfb2Zmc2V0ID0gcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aDsKQEAgLTMzNyw3ICszMzcsNyBAQAogICAgdGhlIHBhdGguICBUaGVzZSBkZWxpbWl0aW5nIGtleXMgYXJlIHN0b3JlZCBhdCBsZWFzdCBvbmUgbGV2ZWwgYWJvdmUgdGhhdCBidWZmZXIgaW4gdGhlIHRyZWUuIElmIHRoZQogICAgYnVmZmVyIGlzIHRoZSBmaXJzdCBvciBsYXN0IG5vZGUgaW4gdGhlIHRyZWUgb3JkZXIgdGhlbiBvbmUgb2YgdGhlIGRlbGltaXRpbmcga2V5cyBtYXkgYmUgYWJzZW50LCBhbmQgaW4KICAgIHRoaXMgY2FzZSBnZXRfbGtleSBhbmQgZ2V0X3JrZXkgcmV0dXJuIGEgc3BlY2lhbCBrZXkgd2hpY2ggaXMgTUlOX0tFWSBvciBNQVhfS0VZLiAqLwotc3RhdGljIGlubGluZSBpbnQga2V5X2luX2J1ZmZlcihzdHJ1Y3QgcGF0aCAqcF9zX2Noa19wYXRoLAkvKiBQYXRoIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGtleV9pbl9idWZmZXIoc3RydWN0IHRyZWVwYXRoICpwX3NfY2hrX3BhdGgsCS8qIFBhdGggd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAqLwogCQkJCWNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3Nfa2V5LAkvKiBLZXkgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAgKi8KIAkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYgkvKiBTdXBlciBibG9jayBwb2ludGVyLiAgICAgICAgICAgKi8KICAgICApCkBAIC0zNzQsNyArMzc0LDcgQEAKIH0KIAogLyogRGVjcmVtZW50IGJfY291bnQgZmllbGQgb2YgdGhlIGFsbCBidWZmZXJzIGluIHRoZSBwYXRoLiAqLwotdm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKQordm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChzdHJ1Y3QgdHJlZXBhdGggKnBfc19zZWFyY2hfcGF0aCkKIHsKIAlpbnQgbl9wYXRoX29mZnNldCA9IHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGg7CiAKQEAgLTM5MSw3ICszOTEsNyBAQAogCXBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7CiB9CiAKLWludCByZWlzZXJmc19jaGVja19wYXRoKHN0cnVjdCBwYXRoICpwKQoraW50IHJlaXNlcmZzX2NoZWNrX3BhdGgoc3RydWN0IHRyZWVwYXRoICpwKQogewogCVJGQUxTRShwLT5wYXRoX2xlbmd0aCAhPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQsCiAJICAgICAgICJwYXRoIG5vdCBwcm9wZXJseSByZWxzZWQiKTsKQEAgLTQwMyw3ICs0MDMsNyBAQAogKioKICoqIG9ubHkgY2FsbGVkIGZyb20gZml4X25vZGVzKCkKICovCi12b2lkIHBhdGhyZWxzZV9hbmRfcmVzdG9yZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgpCit2b2lkIHBhdGhyZWxzZV9hbmRfcmVzdG9yZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCB0cmVlcGF0aCAqcF9zX3NlYXJjaF9wYXRoKQogewogCWludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKIApAQCAtNDIxLDcgKzQyMSw3IEBACiB9CiAKIC8qIFJlbGVhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIHBhdGguICovCi12b2lkIHBhdGhyZWxzZShzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKQordm9pZCBwYXRocmVsc2Uoc3RydWN0IHRyZWVwYXRoICpwX3Nfc2VhcmNoX3BhdGgpCiB7CiAJaW50IG5fcGF0aF9vZmZzZXQgPSBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoOwogCkBAIC02MDIsNyArNjAyLDcgQEAKICAgIGNvcnJlY3RuZXNzIG9mIHRoZSBib3R0b20gb2YgdGhlIHBhdGggKi8KIC8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KIGludCBzZWFyY2hfYnlfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqcF9zX2tleSwJLyogS2V5IHRvIHNlYXJjaC4gKi8KLQkJICBzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoLAkvKiBUaGlzIHN0cnVjdHVyZSB3YXMKKwkJICBzdHJ1Y3QgdHJlZXBhdGggKnBfc19zZWFyY2hfcGF0aCwvKiBUaGlzIHN0cnVjdHVyZSB3YXMKIAkJCQkJCSAgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKIAkJCQkJCSAgIGJ5IHRoZSBjYWxsaW5nCiAJCQkJCQkgICBmdW5jdGlvbi4gSXQgaXMgZmlsbGVkIHVwCkBAIC04MTMsNyArODEzLDcgQEAKIC8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KIGludCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2suICAgICAgICAgICovCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfY3B1X2tleSwJLyogS2V5IHRvIHNlYXJjaCAoY3B1IHZhcmlhYmxlKSAgICAgICAgICovCi0JCQkgICAgICAgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aAkvKiBGaWxsZWQgdXAgYnkgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgKi8KKwkJCSAgICAgICBzdHJ1Y3QgdHJlZXBhdGggKnBfc19zZWFyY2hfcGF0aAkvKiBGaWxsZWQgdXAgYnkgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgKi8KICAgICApCiB7CiAJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paDsJLyogcG9pbnRlciB0byBvbi1kaXNrIHN0cnVjdHVyZSAqLwpAQCAtODg0LDcgKzg4NCw3IEBACiB9CiAKIC8qIENvbXBhcmUgZ2l2ZW4gaXRlbSBhbmQgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZSBwYXRoLiAqLwotaW50IGNvbXBfaXRlbXMoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgpCitpbnQgY29tcF9pdGVtcyhjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICpzdG9yZWRfaWgsIGNvbnN0IHN0cnVjdCB0cmVlcGF0aCAqcF9zX3BhdGgpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmg7CiAJc3RydWN0IGl0ZW1faGVhZCAqaWg7CkBAIC05MTEsNyArOTExLDcgQEAKICNkZWZpbmUgYmxvY2tfaW5fdXNlKGJoKSAoYnVmZmVyX2xvY2tlZChiaCkgfHwgKGhlbGRfYnlfb3RoZXJzKGJoKSkpCiAKIC8vIHByZXBhcmUgZm9yIGRlbGV0ZSBvciBjdXQgb2YgZGlyZWN0IGl0ZW0KLXN0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtKHN0cnVjdCBwYXRoICpwYXRoLAorc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZWN0X2l0ZW0oc3RydWN0IHRyZWVwYXRoICpwYXRoLAogCQkJCQkgIHN0cnVjdCBpdGVtX2hlYWQgKmxlX2loLAogCQkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSAgbG9mZl90IG5ld19maWxlX2xlbmd0aCwgaW50ICpjdXRfc2l6ZSkKQEAgLTk1Miw3ICs5NTIsNyBAQAogCXJldHVybiBNX0NVVDsJCS8qIEN1dCBmcm9tIHRoaXMgaXRlbS4gKi8KIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbShzdHJ1Y3QgcGF0aCAqcGF0aCwKK3N0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfZm9yX2RpcmVudHJ5X2l0ZW0oc3RydWN0IHRyZWVwYXRoICpwYXRoLAogCQkJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqbGVfaWgsCiAJCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgbG9mZl90IG5ld19maWxlX2xlbmd0aCwKQEAgLTk4Nyw3ICs5ODcsNyBAQAogICAgIEluIGNhc2Ugb2YgZmlsZSB0cnVuY2F0ZSBjYWxjdWxhdGUgd2hldGhlciB0aGlzIGl0ZW0gbXVzdCBiZSBkZWxldGVkL3RydW5jYXRlZCBvciBsYXN0CiAgICAgdW5mb3JtYXR0ZWQgbm9kZSBvZiB0aGlzIGl0ZW0gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBkaXJlY3QgaXRlbS4KICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBkZXRlcm1pbmF0aW9uIG9mIHdoYXQgYmFsYW5jZSBtb2RlIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHNob3VsZCBlbXBsb3kuICovCi1zdGF0aWMgY2hhciBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksIGludCAqcF9uX3JlbW92ZWQsCS8qIE51bWJlciBvZiB1bmZvcm1hdHRlZCBub2RlcyB3aGljaCB3ZXJlIHJlbW92ZWQKK3N0YXRpYyBjaGFyIHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB0cmVlcGF0aCAqcF9zX3BhdGgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksIGludCAqcF9uX3JlbW92ZWQsCS8qIE51bWJlciBvZiB1bmZvcm1hdHRlZCBub2RlcyB3aGljaCB3ZXJlIHJlbW92ZWQKIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBmcm9tIGVuZCBvZiB0aGUgZmlsZS4gKi8KIAkJCQkgICAgICBpbnQgKnBfbl9jdXRfc2l6ZSwgdW5zaWduZWQgbG9uZyBsb25nIG5fbmV3X2ZpbGVfbGVuZ3RoCS8qIE1BWF9LRVlfT0ZGU0VUIGluIGNhc2Ugb2YgZGVsZXRlLiAqLwogICAgICkKQEAgLTExMjUsNyArMTEyNSw3IEBACiBzdGF0aWMgdm9pZCBpbml0X3RiX3N0cnVjdChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKIAkJCSAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwKIAkJCSAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotCQkJICAgc3RydWN0IHBhdGggKnBfc19wYXRoLCBpbnQgbl9zaXplKQorCQkJICAgc3RydWN0IHRyZWVwYXRoICpwX3NfcGF0aCwgaW50IG5fc2l6ZSkKIHsKIAogCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwpAQCAtMTE3Niw3ICsxMTc2LDcgQEAKICNlbmRpZgogCiAvKiBEZWxldGUgb2JqZWN0IGl0ZW0uICovCi1pbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwJLyogUGF0aCB0byB0aGUgZGVsZXRlZCBpdGVtLiAqLworaW50IHJlaXNlcmZzX2RlbGV0ZV9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgdHJlZXBhdGggKnBfc19wYXRoLAkvKiBQYXRoIHRvIHRoZSBkZWxldGVkIGl0ZW0uICovCiAJCQkgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19pdGVtX2tleSwJLyogS2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRlbGV0ZWQgaXRlbS4gICovCiAJCQkgc3RydWN0IGlub2RlICpwX3NfaW5vZGUsCS8qIGlub2RlIGlzIGhlcmUganVzdCB0byB1cGRhdGUgaV9ibG9ja3MgYW5kIHF1b3RhcyAqLwogCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX3VuX2JoKQpAQCAtMTQ2OCw3ICsxNDY4LDcgQEAKIHN0YXRpYyBpbnQgbWF5YmVfaW5kaXJlY3RfdG9fZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAogCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwKIAkJCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJICAgIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwKKwkJCQkgICAgc3RydWN0IHRyZWVwYXRoICpwX3NfcGF0aCwKIAkJCQkgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19pdGVtX2tleSwKIAkJCQkgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSwgY2hhciAqcF9jX21vZGUpCiB7CkBAIC0xNTAzLDcgKzE1MDMsNyBAQAogICAgcG9pbnRlciBiZWluZyBjb252ZXJ0ZWQuIFRoZXJlZm9yZSB3ZSBoYXZlIHRvIGRlbGV0ZSBpbnNlcnRlZAogICAgZGlyZWN0IGl0ZW0ocykgKi8KIHN0YXRpYyB2b2lkIGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aCkKKwkJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB0cmVlcGF0aCAqcGF0aCkKIHsKIAlzdHJ1Y3QgY3B1X2tleSB0YWlsX2tleTsKIAlpbnQgdGFpbF9sZW47CkBAIC0xNTQ1LDcgKzE1NDUsNyBAQAogCiAvKiAoVHJ1bmNhdGUgb3IgY3V0IGVudHJ5KSBvciBkZWxldGUgb2JqZWN0IGl0ZW0uIFJldHVybnMgPCAwIG9uIGZhaWx1cmUgKi8KIGludCByZWlzZXJmc19jdXRfZnJvbV9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgc3RydWN0IHBhdGggKnBfc19wYXRoLAorCQkJICAgc3RydWN0IHRyZWVwYXRoICpwX3NfcGF0aCwKIAkJCSAgIHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwKIAkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCBsb2ZmX3Qgbl9uZXdfZmlsZV9zaXplKQpAQCAtMTkyMCw3ICsxOTIwLDcgQEAKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwogLy8gdGhpcyBtYWtlcyBzdXJlLCB0aGF0IHdlIF9fYXBwZW5kX18sIG5vdCBvdmVyd3JpdGUgb3IgYWRkIGhvbGVzCi1zdGF0aWMgdm9pZCBjaGVja19yZXNlYXJjaF9mb3JfcGFzdGUoc3RydWN0IHBhdGggKnBhdGgsCitzdGF0aWMgdm9pZCBjaGVja19yZXNlYXJjaF9mb3JfcGFzdGUoc3RydWN0IHRyZWVwYXRoICpwYXRoLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19rZXkpCiB7CiAJc3RydWN0IGl0ZW1faGVhZCAqZm91bmRfaWggPSBnZXRfaWgocGF0aCk7CkBAIC0xOTU0LDcgKzE5NTQsNyBAQAogI2VuZGlmCQkJCS8qIGNvbmZpZyByZWlzZXJmcyBjaGVjayAqLwogCiAvKiBQYXN0ZSBieXRlcyB0byB0aGUgZXhpc3RpbmcgaXRlbS4gUmV0dXJucyBieXRlcyBudW1iZXIgcGFzdGVkIGludG8gdGhlIGl0ZW0uICovCi1pbnQgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoLAkvKiBQYXRoIHRvIHRoZSBwYXN0ZWQgaXRlbS4gICAgICAgICAgKi8KK2ludCByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCB0cmVlcGF0aCAqcF9zX3NlYXJjaF9wYXRoLAkvKiBQYXRoIHRvIHRoZSBwYXN0ZWQgaXRlbS4gICAgICAgICAgKi8KIAkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19rZXksCS8qIEtleSB0byBzZWFyY2ggZm9yIHRoZSBuZWVkZWQgaXRlbS4gKi8KIAkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwJLyogSW5vZGUgaXRlbSBiZWxvbmdzIHRvICovCiAJCQkgICAgIGNvbnN0IGNoYXIgKnBfY19ib2R5LAkvKiBQb2ludGVyIHRvIHRoZSBieXRlcyB0byBwYXN0ZS4gICAgKi8KQEAgLTIwMzYsNyArMjAzNiw3IEBACiB9CiAKIC8qIEluc2VydCBuZXcgaXRlbSBpbnRvIHRoZSBidWZmZXIgYXQgdGhlIHBhdGguICovCi1pbnQgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwJLyogUGF0aCB0byB0aGUgaW5zZXJ0ZWRlZCBpdGVtLiAgICAgICAgICovCitpbnQgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCB0cmVlcGF0aCAqcF9zX3BhdGgsCS8qIFBhdGggdG8gdGhlIGluc2VydGVkZWQgaXRlbS4gICAgICAgICAqLwogCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksIHN0cnVjdCBpdGVtX2hlYWQgKnBfc19paCwJLyogUG9pbnRlciB0byB0aGUgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiAqLwogCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBfY19ib2R5KQogewkJCQkvKiBQb2ludGVyIHRvIHRoZSBieXRlcyB0byBpbnNlcnQuICAgICAgKi8KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IDkwNDE4MDIuLjU4YWQ0NTUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgpAQCAtNDkwLDEzICs0OTAsMTMgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnJlaXNlcmZzX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcmVpc2VyZnNfaW5vZGVfY2FjaGVwOwogCiBzdGF0aWMgc3RydWN0IGlub2RlICpyZWlzZXJmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaTsKIAllaSA9IChzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqKQotCSAgICBrbWVtX2NhY2hlX2FsbG9jKHJlaXNlcmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCSAgICBrbWVtX2NhY2hlX2FsbG9jKHJlaXNlcmZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwpAQCAtNTA3LDcgKzUwNyw3IEBACiAJa21lbV9jYWNoZV9mcmVlKHJlaXNlcmZzX2lub2RlX2NhY2hlcCwgUkVJU0VSRlNfSShpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKilmb287CiAKQEAgLTE1NDksMTMgKzE1NDksMTIgQEAKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JpOwogCWludCBlcnJ2YWwgPSAtRUlOVkFMOwogCi0Jc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlzYmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKSB7CiAJCWVycnZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQogCXMtPnNfZnNfaW5mbyA9IHNiaTsKLQltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3NiX2luZm8pKTsKIAkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbnM6IG5vbi1hZ2dyZXNzaXZlIHRhaWxzLCBSTyBvbiBlcnJvcnMgKi8KIAlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKTsKIAlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfRVJST1JfUk8pOwpAQCAtMTYxOSw2ICsxNjE4LDcgQEAKIAkJICAgICAgImptYWNkLTg6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byByZWFkIGJpdG1hcCIpOwogCQlnb3RvIGVycm9yOwogCX0KKwllcnJ2YWwgPSAtRUlOVkFMOwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwogCVNXQVJOKHNpbGVudCwgcywgIkNPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBzZXQgT04iKTsKIAlTV0FSTihzaWxlbnQsIHMsICItIGl0IGlzIHNsb3cgbW9kZSBmb3IgZGVidWdnaW5nLiIpOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvdGFpbF9jb252ZXJzaW9uLmMgYi9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYwppbmRleCAzNmYxMDhmLi5mODEyMWExIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYworKysgYi9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYwpAQCAtMTUsNyArMTUsNyBAQAogLyogcGF0aCBwb2ludHMgdG8gZmlyc3QgZGlyZWN0IGl0ZW0gb2YgdGhlIGZpbGUgcmVnYXJsZXNzIG9mIGhvdyBtYW55IG9mCiAgICB0aGVtIGFyZSB0aGVyZSAqLwogaW50IGRpcmVjdDJpbmRpcmVjdChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJICAgIHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVuYmgsCisJCSAgICBzdHJ1Y3QgdHJlZXBhdGggKnBhdGgsIHN0cnVjdCBidWZmZXJfaGVhZCAqdW5iaCwKIAkJICAgIGxvZmZfdCB0YWlsX29mZnNldCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CkBAIC0xNzEsNyArMTcxLDcgQEAKICAgIHdoYXQgd2UgZXhwZWN0IGZyb20gaXQgKG51bWJlciBvZiBjdXQgYnl0ZXMpLiBCdXQgd2hlbiB0YWlsIHJlbWFpbnMKICAgIGluIHRoZSB1bmZvcm1hdHRlZCBub2RlLCB3ZSBzZXQgbW9kZSB0byBTS0lQX0JBTEFOQ0lORyBhbmQgdW5sb2NrCiAgICBpbm9kZSAqLwotaW50IGluZGlyZWN0MmRpcmVjdChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICpwX3NfaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsCS8qIHBhdGggdG8gdGhlIGluZGlyZWN0IGl0ZW0uICovCitpbnQgaW5kaXJlY3QyZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB0cmVlcGF0aCAqcF9zX3BhdGgsCS8qIHBhdGggdG8gdGhlIGluZGlyZWN0IGl0ZW0uICovCiAJCSAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqcF9zX2l0ZW1fa2V5LAkvKiBLZXkgdG8gbG9vayBmb3IgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIHRvIGJlIGN1dC4gKi8KIAkJICAgIGxvZmZfdCBuX25ld19maWxlX3NpemUsCS8qIE5ldyBmaWxlIHNpemUuICovCiAJCSAgICBjaGFyICpwX2NfbW9kZSkKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCmluZGV4IDdiZGIwZWQuLmYwMTM4OWYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHIuYwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CkBAIC0yNzQsNyArMjc0LDcgQEAKICAqLwogc3RhdGljIGludCBfX3hhdHRyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBjcHVfa2V5IHBvc19rZXk7CS8qIGtleSBvZiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkaXJlY3RvcnkgKGtleSBvZiBkaXJlY3RvcnkgZW50cnkpICovCiAJSU5JVElBTElaRV9QQVRIKHBhdGhfdG9fZW50cnkpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CkBAIC00MjAsNyArNDIwLDcgQEAKIHN0YXRpYwogaW50IHhhdHRyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIGZpbGxkaXJfdCBmaWxsZXIsIHZvaWQgKmJ1ZikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IHJlcyA9IC1FTk9URElSOwogCWlmICghZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+cmVhZGRpcikKIAkJZ290byBvdXQ7CkBAIC01MDgsNyArNTA4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JeGlub2RlID0gZnAtPmZfZGVudHJ5LT5kX2lub2RlOworCXhpbm9kZSA9IGZwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaGFzX3hhdHRyX2RpcjsKIAogCS8qIHdlIG5lZWQgdG8gY29weSBpdCBvZmYuLiAqLwpAQCAtNTI3LDcgKzUyNyw3IEBACiAJbmV3YXR0cnMuaWFfc2l6ZSA9IGJ1ZmZlcl9zaXplOwogCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9TSVpFIHwgQVRUUl9DVElNRTsKIAltdXRleF9sb2NrKCZ4aW5vZGUtPmlfbXV0ZXgpOwotCWVyciA9IG5vdGlmeV9jaGFuZ2UoZnAtPmZfZGVudHJ5LCAmbmV3YXR0cnMpOworCWVyciA9IG5vdGlmeV9jaGFuZ2UoZnAtPmZfcGF0aC5kZW50cnksICZuZXdhdHRycyk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfZmlscDsKIApAQCAtNjI2LDcgKzYyNiw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl4aW5vZGUgPSBmcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpc2l6ZSA9IHhpbm9kZS0+aV9zaXplOwogCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaGFzX3hhdHRyX2RpcjsKIApkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMgYi9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYwppbmRleCA5N2FlMWI5Li41Mjk2YTI5IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYworKysgYi9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJaW50IG47CiAKIAkqc2l6ZSA9IHJlaXNlcmZzX2FjbF9zaXplKGFjbC0+YV9jb3VudCk7Ci0JZXh0X2FjbCA9IChyZWlzZXJmc19hY2xfaGVhZGVyICopIGttYWxsb2Moc2l6ZW9mKHJlaXNlcmZzX2FjbF9oZWFkZXIpICsKKwlleHRfYWNsID0ga21hbGxvYyhzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikgKwogCQkJCQkJICBhY2wtPmFfY291bnQgKgogCQkJCQkJICBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KSwKIAkJCQkJCSAgR0ZQX05PRlMpOwpkaWZmIC0tZ2l0IGEvZnMvcm9tZnMvaW5vZGUuYyBiL2ZzL3JvbWZzL2lub2RlLmMKaW5kZXggZGRjZDllMS4uZDNlMjQzYSAxMDA2NDQKLS0tIGEvZnMvcm9tZnMvaW5vZGUuYworKysgYi9mcy9yb21mcy9pbm9kZS5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIHN0YXRpYyBpbnQKIHJvbWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7Ci0Jc3RydWN0IGlub2RlICppID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3Qgcm9tZnNfaW5vZGUgcmk7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIG1heG9mZjsKIAlpbnQgaiwgaW5vLCBuZXh0Zmg7CkBAIC01NTAsMTIgKzU1MCwxMiBAQAogCX0KIH0KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIHJvbWZzX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIHJvbWZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqcm9tZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3Qgcm9tZnNfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IHJvbWZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHJvbWZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVpID0gKHN0cnVjdCByb21mc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhyb21mc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAmZWktPnZmc19pbm9kZTsKQEAgLTU2Niw3ICs1NjYsNyBAQAogCWttZW1fY2FjaGVfZnJlZShyb21mc19pbm9kZV9jYWNoZXAsIFJPTUZTX0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qgcm9tZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHJvbWZzX2lub2RlX2luZm8gKikgZm9vOwogCmRpZmYgLS1naXQgYS9mcy9zZWxlY3QuYyBiL2ZzL3NlbGVjdC5jCmluZGV4IGRjYmMxMTEuLmZlMDg5M2EgMTAwNjQ0Ci0tLSBhL2ZzL3NlbGVjdC5jCisrKyBiL2ZzL3NlbGVjdC5jCkBAIC0zMTEsNyArMzExLDcgQEAKIHsKIAlmZF9zZXRfYml0cyBmZHM7CiAJdm9pZCAqYml0czsKLQlpbnQgcmV0LCBtYXhfZmRzZXQ7CisJaW50IHJldCwgbWF4X2ZkczsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCS8qIEFsbG9jYXRlIHNtYWxsIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sgdG8gc2F2ZSBtZW1vcnkgYW5kIGJlIGZhc3RlciAqLwpAQCAtMzIxLDEzICszMjEsMTMgQEAKIAlpZiAobiA8IDApCiAJCWdvdG8gb3V0X25vZmRzOwogCi0JLyogbWF4X2Zkc2V0IGNhbiBpbmNyZWFzZSwgc28gZ3JhYiBpdCBvbmNlIHRvIGF2b2lkIHJhY2UgKi8KKwkvKiBtYXhfZmRzIGNhbiBpbmNyZWFzZSwgc28gZ3JhYiBpdCBvbmNlIHRvIGF2b2lkIHJhY2UgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7Ci0JbWF4X2Zkc2V0ID0gZmR0LT5tYXhfZmRzZXQ7CisJbWF4X2ZkcyA9IGZkdC0+bWF4X2ZkczsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlpZiAobiA+IG1heF9mZHNldCkKLQkJbiA9IG1heF9mZHNldDsKKwlpZiAobiA+IG1heF9mZHMpCisJCW4gPSBtYXhfZmRzOwogCiAJLyoKIAkgKiBXZSBuZWVkIDYgYml0bWFwcyAoaW4vb3V0L2V4IGZvciBib3RoIGluY29taW5nIGFuZCBvdXRnb2luZyksCmRpZmYgLS1naXQgYS9mcy9zZXFfZmlsZS5jIGIvZnMvc2VxX2ZpbGUuYwppbmRleCA1NTViOWFjLi4wYWMyMmFmIDEwMDY0NAotLS0gYS9mcy9zZXFfZmlsZS5jCisrKyBiL2ZzL3NlcV9maWxlLmMKQEAgLTI2LDcgKzI2LDcgQEAKICAqCUVSUl9QVFIoZXJyb3IpLiAgSW4gdGhlIGVuZCBvZiBzZXF1ZW5jZSB0aGV5IHJldHVybiAlTlVMTC4gLT5zaG93KCkKICAqCXJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIG51bWJlciBpbiBjYXNlIG9mIGVycm9yLgogICovCi1pbnQgc2VxX29wZW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3ApCitpbnQgc2VxX29wZW4oc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3ApCiB7CiAJc3RydWN0IHNlcV9maWxlICpwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCkBAIC0yNjksNyArMjY5LDcgQEAKIC8qKgogICoJc2VxX3JlbGVhc2UgLQlmcmVlIHRoZSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBzZXF1ZW50aWFsIGZpbGUuCiAgKglAZmlsZTogZmlsZSBpbiBxdWVzdGlvbgotICoJQGlub2RlOiBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZQorICoJQGlub2RlOiBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlCiAgKgogICoJRnJlZXMgdGhlIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHNlcXVlbnRpYWwgZmlsZTsgY2FuIGJlIHVzZWQKICAqCWFzIC0+Zl9vcC0+cmVsZWFzZSgpIGlmIHlvdSBkb24ndCBoYXZlIHByaXZhdGUgZGF0YSB0byBkZXN0cm95LgpAQCAtNDA4LDcgKzQwOCw3IEBACiAKIGludCBzaW5nbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgKm9wID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGEpLT5vcDsKKwljb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgKm9wID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGEpLT5vcDsKIAlpbnQgcmVzID0gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOwogCWtmcmVlKG9wKTsKIAlyZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvY2FjaGUuYyBiL2ZzL3NtYmZzL2NhY2hlLmMKaW5kZXggNzRiODZkOS4uODE4MmYwNSAxMDA2NDQKLS0tIGEvZnMvc21iZnMvY2FjaGUuYworKysgYi9mcy9zbWJmcy9jYWNoZS5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkgICAgICAgc3RydWN0IHNtYl9jYWNoZV9jb250cm9sICpjdHJsLCBzdHJ1Y3QgcXN0ciAqcW5hbWUsCiAJICAgICAgIHN0cnVjdCBzbWJfZmF0dHIgKmVudHJ5KQogewotCXN0cnVjdCBkZW50cnkgKm5ld2RlbnQsICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpuZXdkZW50LCAqZGVudHJ5ID0gZmlscC0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKm5ld2lubywgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzbWJfY2FjaGVfY29udHJvbCBjdGwgPSAqY3RybDsKIAlpbnQgdmFsaWQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvZGlyLmMgYi9mcy9zbWJmcy9kaXIuYwppbmRleCA3MGQ5YzVhLi5iMWU1OGQxIDEwMDY0NAotLS0gYS9mcy9zbWJmcy9kaXIuYworKysgYi9mcy9zbWJmcy9kaXIuYwpAQCAtNzgsNyArNzgsNyBAQAogc3RhdGljIGludCAKIHNtYl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKIAl1bmlvbiAgc21iX2Rpcl9jYWNoZSAqY2FjaGUgPSBOVUxMOwpAQCAtMjM4LDEyICsyMzgsMTIgQEAKIHN0YXRpYyBpbnQKIHNtYl9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCiAJVkVSQk9TRSgiKCVzLyVzKVxuIiwgZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsCi0JCWZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCS8qCiAJICogRGlyZWN0b3J5IHRpbWVzdGFtcHMgaW4gdGhlIGNvcmUgcHJvdG9jb2wgYXJlbid0IHVwZGF0ZWQKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL2ZpbGUuYyBiL2ZzL3NtYmZzL2ZpbGUuYwppbmRleCA1MDc4NGQxLi5lNTA1MzNhIDEwMDY0NAotLS0gYS9mcy9zbWJmcy9maWxlLmMKKysrIGIvZnMvc21iZnMvZmlsZS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIHNtYl9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaW50CQllcnJvcjsKLQlzdHJ1Y3QgZGVudHJ5ICAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAKIAlwYWdlX2NhY2hlX2dldChwYWdlKTsKIAllcnJvciA9IHNtYl9yZWFkcGFnZV9zeW5jKGRlbnRyeSwgcGFnZSk7CkBAIC0yMDUsNyArMjA1LDcgQEAKIHNtYl91cGRhdGVwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJICAgICAgIHVuc2lnbmVkIGludCBjb3VudCkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCiAJREVCVUcxKCIoJXMvJXMgJWRAJWxsZClcbiIsIERFTlRSWV9QQVRIKGRlbnRyeSksIGNvdW50LAogCQkoKHVuc2lnbmVkIGxvbmcgbG9uZylwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIG9mZnNldCk7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBpb2NiLT5raV9maWxwOwotCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzc2l6ZV90CXN0YXR1czsKIAogCVZFUkJPU0UoImZpbGUgJXMvJXMsIGNvdW50PSVsdUAlbHVcbiIsIERFTlRSWV9QQVRIKGRlbnRyeSksCkBAIC0yNDMsNyArMjQzLDcgQEAKIHN0YXRpYyBpbnQKIHNtYl9maWxlX21tYXAoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCWludAlzdGF0dXM7CiAKIAlWRVJCT1NFKCJmaWxlICVzLyVzLCBhZGRyZXNzICVsdSAtICVsdVxuIiwKQEAgLTI2NCw3ICsyNjQsNyBAQAogc21iX2ZpbGVfc2VuZGZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCAqcHBvcywKIAkJICBzaXplX3QgY291bnQsIHJlYWRfYWN0b3JfdCBhY3Rvciwgdm9pZCAqdGFyZ2V0KQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJc3NpemVfdCBzdGF0dXM7CiAKIAlWRVJCT1NFKCJmaWxlICVzLyVzLCBwb3M9JUxkLCBjb3VudD0lZFxuIiwKQEAgLTMyMyw3ICszMjMsNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGUgPSBpb2NiLT5raV9maWxwOwotCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzc2l6ZV90CXJlc3VsdDsKIAogCVZFUkJPU0UoImZpbGUgJXMvJXMsIGNvdW50PSVsdUAlbHVcbiIsCkBAIC0zNTUsNyArMzU1LDcgQEAKIHNtYl9maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQogewogCWludCByZXN1bHQ7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlpbnQgc21iX21vZGUgPSAoZmlsZS0+Zl9tb2RlICYgT19BQ0NNT0RFKSAtIDE7CiAKIAlsb2NrX2tlcm5lbCgpOwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvaW5vZGUuYyBiL2ZzL3NtYmZzL2lub2RlLmMKaW5kZXggMmMxMjJlZS4uODRkZmUzZiAxMDA2NDQKLS0tIGEvZnMvc21iZnMvaW5vZGUuYworKysgYi9mcy9zbWJmcy9pbm9kZS5jCkBAIC01MCwxMiArNTAsMTIgQEAKIHN0YXRpYyBpbnQgIHNtYl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIHN0YXRpYyBpbnQgIHNtYl9zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqc21iX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc21iX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqc21iX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHNtYl9pbm9kZV9pbmZvICplaTsKLQllaSA9IChzdHJ1Y3Qgc21iX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHNtYl9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwllaSA9IChzdHJ1Y3Qgc21iX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHNtYl9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAmZWktPnZmc19pbm9kZTsKQEAgLTY2LDcgKzY2LDcgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoc21iX2lub2RlX2NhY2hlcCwgU01CX0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qgc21iX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBzbWJfaW5vZGVfaW5mbyAqKSBmb287CiAJdW5zaWduZWQgbG9uZyBmbGFnbWFzayA9IFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SOwpAQCAtNDgyLDEyICs0ODIsMTMgQEAKIAlzbWJfY2xvc2Vfc29ja2V0KHNlcnZlcik7CiAKIAlpZiAoc2VydmVyLT5jb25uX3BpZCkKLQkJa2lsbF9wcm9jKHNlcnZlci0+Y29ubl9waWQsIFNJR1RFUk0sIDEpOworCQlraWxsX3BpZChzZXJ2ZXItPmNvbm5fcGlkLCBTSUdURVJNLCAxKTsKIAogCWtmcmVlKHNlcnZlci0+b3BzKTsKIAlzbWJfdW5sb2FkX25scyhzZXJ2ZXIpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCXNtYl91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcHV0X3BpZChzZXJ2ZXItPmNvbm5fcGlkKTsKIAlrZnJlZShzZXJ2ZXIpOwogfQogCkBAIC01MzAsNyArNTMxLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT54bWl0cSk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+cmVjdnEpOwogCXNlcnZlci0+Y29ubl9lcnJvciA9IDA7Ci0Jc2VydmVyLT5jb25uX3BpZCA9IDA7CisJc2VydmVyLT5jb25uX3BpZCA9IE5VTEw7CiAJc2VydmVyLT5zdGF0ZSA9IENPTk5fSU5WQUxJRDsgLyogbm8gY29ubmVjdGlvbiB5ZXQgKi8KIAlzZXJ2ZXItPmdlbmVyYXRpb24gPSAwOwogCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9wcm9jLmMgYi9mcy9zbWJmcy9wcm9jLmMKaW5kZXggNDBlMTc0ZC4uZmVhYzQ2MCAxMDA2NDQKLS0tIGEvZnMvc21iZnMvcHJvYy5jCisrKyBiL2ZzL3NtYmZzL3Byb2MuYwpAQCAtODczLDExICs4NzMsMTEgQEAKIAlmaWxwID0gZmdldChvcHQtPmZkKTsKIAlpZiAoIWZpbHApCiAJCWdvdG8gb3V0OwotCWlmICghc21iX3ZhbGlkX3NvY2tldChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSkpCisJaWYgKCFzbWJfdmFsaWRfc29ja2V0KGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKQogCQlnb3RvIG91dF9wdXRmOwogCiAJc2VydmVyLT5zb2NrX2ZpbGUgPSBmaWxwOwotCXNlcnZlci0+Y29ubl9waWQgPSBjdXJyZW50LT5waWQ7CisJc2VydmVyLT5jb25uX3BpZCA9IGdldF9waWQodGFza19waWQoY3VycmVudCkpOwogCXNlcnZlci0+b3B0ID0gKm9wdDsKIAlzZXJ2ZXItPmdlbmVyYXRpb24gKz0gMTsKIAlzZXJ2ZXItPnN0YXRlID0gQ09OTl9WQUxJRDsKQEAgLTg5OCw3ICs4OTgsNyBAQAogCS8qCiAJICogU3RvcmUgdGhlIHNlcnZlciBpbiBzb2NrIHVzZXJfZGF0YSAoT25seSB1c2VkIGJ5IHN1bnJwYykKIAkgKi8KLQlzayA9IFNPQ0tFVF9JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKS0+c2s7CisJc2sgPSBTT0NLRVRfSShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+c2s7CiAJc2stPnNrX3VzZXJfZGF0YSA9IHNlcnZlcjsKIAogCS8qIGNoYWluIGludG8gdGhlIGRhdGFfcmVhZHkgY2FsbGJhY2sgKi8KQEAgLTk3MSw4ICs5NzEsOCBAQAogCX0KIAogCVZFUkJPU0UoInByb3RvY29sPSVkLCBtYXhfeG1pdD0lZCwgcGlkPSVkIGNhcGFiaWxpdGllcz0weCV4XG4iLAotCQlzZXJ2ZXItPm9wdC5wcm90b2NvbCwgc2VydmVyLT5vcHQubWF4X3htaXQsIHNlcnZlci0+Y29ubl9waWQsCi0JCXNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyk7CisJCXNlcnZlci0+b3B0LnByb3RvY29sLCBzZXJ2ZXItPm9wdC5tYXhfeG1pdCwKKwkJcGlkX25yKHNlcnZlci0+Y29ubl9waWQpLCBzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMpOwogCiAJLyogRklYTUU6IHRoaXMgcmVhbGx5IHNob3VsZCBiZSBkb25lIGJ5IHNtYm1vdW50LiAqLwogCWlmIChzZXJ2ZXItPm9wdC5tYXhfeG1pdCA+IFNNQl9NQVhfUEFDS0VUX1NJWkUpIHsKQEAgLTE5MzksNyArMTkzOSw3IEBACiBzbWJfcHJvY19yZWFkZGlyX3Nob3J0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAogCQkgICAgICAgc3RydWN0IHNtYl9jYWNoZV9jb250cm9sICpjdGwpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGlyID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGlyID0gZmlscC0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkaXIpOwogCXN0cnVjdCBxc3RyIHFuYW1lOwogCXN0cnVjdCBzbWJfZmF0dHIgZmF0dHI7CkBAIC0yMjkxLDcgKzIyOTEsNyBAQAogc21iX3Byb2NfcmVhZGRpcl9sb25nKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAogCQkgICAgICBzdHJ1Y3Qgc21iX2NhY2hlX2NvbnRyb2wgKmN0bCkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkaXIgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXIgPSBmaWxwLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRpcik7CiAJc3RydWN0IHFzdHIgcW5hbWU7CiAJc3RydWN0IHNtYl9mYXR0ciBmYXR0cjsKQEAgLTI4NTksNyArMjg1OSw3IEBACiBzbWJfcHJvY19yZWFkZGlyX251bGwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCiAJCSAgICAgIHN0cnVjdCBzbWJfY2FjaGVfY29udHJvbCAqY3RsKQogewotCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGZpbHAtPmZfZGVudHJ5KTsKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShmaWxwLT5mX3BhdGguZGVudHJ5KTsKIAogCWlmIChzbWJfcHJvY19vcHNfd2FpdChzZXJ2ZXIpIDwgMCkKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9yZXF1ZXN0LmMgYi9mcy9zbWJmcy9yZXF1ZXN0LmMKaW5kZXggMGZiNzQ2OS4uYTRiY2FlOCAxMDA2NDQKLS0tIGEvZnMvc21iZnMvcmVxdWVzdC5jCisrKyBiL2ZzL3NtYmZzL3JlcXVlc3QuYwpAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBST1VORF9VUCh4KSAoKCh4KSszKSAmIH4zKQogCiAvKiBjYWNoZSBmb3IgcmVxdWVzdCBzdHJ1Y3R1cmVzICovCi1zdGF0aWMga21lbV9jYWNoZV90ICpyZXFfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpyZXFfY2FjaGVwOwogCiBzdGF0aWMgaW50IHNtYl9yZXF1ZXN0X3NlbmRfcmVxKHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKTsKIApAQCAtNjEsNyArNjEsNyBAQAogCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CiAKLQlyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKHJlcV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKHJlcV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCVZFUkJPU0UoImFsbG9jYXRpbmcgcmVxdWVzdDogJXBcbiIsIHJlcSk7CiAJaWYgKCFyZXEpCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvc21iaW9kLmMgYi9mcy9zbWJmcy9zbWJpb2QuYwppbmRleCBlNjc1NDA0Li44OWVhZjMxIDEwMDY0NAotLS0gYS9mcy9zbWJmcy9zbWJpb2QuYworKysgYi9mcy9zbWJmcy9zbWJpb2QuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKLQlwaWRfdCBwaWQgPSBzZXJ2ZXItPmNvbm5fcGlkOworCXN0cnVjdCBwaWQgKnBpZCA9IGdldF9waWQoc2VydmVyLT5jb25uX3BpZCk7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlWRVJCT1NFKCJzdGF0ZTogJWRcbiIsIHNlcnZlci0+c3RhdGUpOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJLyoKIAkgKiBOb3RlOiB1c2UgdGhlICJwcml2IiBmbGFnLCBhcyBhIHVzZXIgcHJvY2VzcyBtYXkgbmVlZCB0byByZWNvbm5lY3QuCiAJICovCi0JcmVzdWx0ID0ga2lsbF9wcm9jKHBpZCwgU0lHVVNSMSwgMSk7CisJcmVzdWx0ID0ga2lsbF9waWQocGlkLCBTSUdVU1IxLCAxKTsKIAlpZiAocmVzdWx0KSB7CiAJCS8qIEZJWE1FOiB0aGlzIGlzIG1vc3QgbGlrZWx5IGZhdGFsLCB1bW91bnQ/ICovCiAJCXByaW50ayhLRVJOX0VSUiAic21iX3JldHJ5OiBzaWduYWwgZmFpbGVkIFslZF1cbiIsIHJlc3VsdCk7CkBAIC0yMzMsNiArMjMzLDcgQEAKIAkvKiBGSVhNRTogVGhlIHJldHJpZWQgcmVxdWVzdHMgc2hvdWxkIHBlcmhhcHMgZ2V0IGEgInRpbWUgYm9vc3QiLiAqLwogCiBvdXQ6CisJcHV0X3BpZChwaWQpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3NvY2suYyBiL2ZzL3NtYmZzL3NvY2suYwppbmRleCA2ODE1YjFiLi45MmVhNmIyIDEwMDY0NAotLS0gYS9mcy9zbWJmcy9zb2NrLmMKKysrIGIvZnMvc21iZnMvc29jay5jCkBAIC04MiwxMCArODIsMTAgQEAKIAlpZiAoc2VydmVyICYmIChmaWxlID0gc2VydmVyLT5zb2NrX2ZpbGUpKQogCXsKICNpZmRlZiBTTUJGU19QQVJBTk9JQQotCQlpZiAoIXNtYl92YWxpZF9zb2NrZXQoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKQorCQlpZiAoIXNtYl92YWxpZF9zb2NrZXQoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpCiAJCQlQQVJBTk9JQSgiYmFkIHNvY2tldCFcbiIpOwogI2VuZGlmCi0JCXJldHVybiBTT0NLRVRfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCXJldHVybiBTT0NLRVRfSShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IGE1NjcwMTAuLjJmY2E2ZWIgMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC00Miw3ICs0Miw3IEBACiAJc3RydWN0IHBhcnRpYWxfcGFnZSAqcGFydGlhbDsJLyogcGFnZXNbXSBtYXkgbm90IGJlIGNvbnRpZyAqLwogCWludCBucl9wYWdlczsJCQkvKiBudW1iZXIgb2YgcGFnZXMgaW4gbWFwICovCiAJdW5zaWduZWQgaW50IGZsYWdzOwkJLyogc3BsaWNlIGZsYWdzICovCi0Jc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wczsvKiBvcHMgYXNzb2NpYXRlZCB3aXRoIG91dHB1dCBwaXBlICovCisJY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wczsvKiBvcHMgYXNzb2NpYXRlZCB3aXRoIG91dHB1dCBwaXBlICovCiB9OwogCiAvKgpAQCAtNzQsNyArNzQsNyBAQAogCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCiAJCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkKLQkJCXRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7CisJCQl0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIEdGUF9LRVJORUwpOwogCiAJCS8qCiAJCSAqIElmIHdlIHN1Y2NlZWRlZCBpbiByZW1vdmluZyB0aGUgbWFwcGluZywgc2V0IExSVSBmbGFnCkBAIC0xMzksNyArMTM5LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgcGFnZV9jYWNoZV9waXBlX2J1Zl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgcGFnZV9jYWNoZV9waXBlX2J1Zl9vcHMgPSB7CiAJLmNhbl9tZXJnZSA9IDAsCiAJLm1hcCA9IGdlbmVyaWNfcGlwZV9idWZfbWFwLAogCS51bm1hcCA9IGdlbmVyaWNfcGlwZV9idWZfdW5tYXAsCkBAIC0xNTksNyArMTU5LDcgQEAKIAlyZXR1cm4gZ2VuZXJpY19waXBlX2J1Zl9zdGVhbChwaXBlLCBidWYpOwogfQogCi1zdGF0aWMgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgdXNlcl9wYWdlX3BpcGVfYnVmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyB1c2VyX3BhZ2VfcGlwZV9idWZfb3BzID0gewogCS5jYW5fbWVyZ2UgPSAwLAogCS5tYXAgPSBnZW5lcmljX3BpcGVfYnVmX21hcCwKIAkudW5tYXAgPSBnZW5lcmljX3BpcGVfYnVmX3VubWFwLApAQCAtMzMzLDcgKzMzMyw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWVycm9yID0gYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIG1hcHBpbmcsIGluZGV4LAotCQkJCQkgICAgICBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTsKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7CiAJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJCWlmIChlcnJvciA9PSAtRUVYSVNUKQpAQCAtNTU3LDcgKzU1Nyw2IEBACiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBzZC0+ZmlsZTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKLQlnZnBfdCBnZnBfbWFzayA9IG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZyk7CiAJdW5zaWduZWQgaW50IG9mZnNldCwgdGhpc19sZW47CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJcGdvZmZfdCBpbmRleDsKQEAgLTU5MSw3ICs1OTAsNyBAQAogCQkJZ290byBmaW5kX3BhZ2U7CiAKIAkJcGFnZSA9IGJ1Zi0+cGFnZTsKLQkJaWYgKGFkZF90b19wYWdlX2NhY2hlKHBhZ2UsIG1hcHBpbmcsIGluZGV4LCBnZnBfbWFzaykpIHsKKwkJaWYgKGFkZF90b19wYWdlX2NhY2hlKHBhZ2UsIG1hcHBpbmcsIGluZGV4LCBHRlBfS0VSTkVMKSkgewogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQlnb3RvIGZpbmRfcGFnZTsKIAkJfQpAQCAtNjEzLDcgKzYxMiw3IEBACiAJCQkgKiBUaGlzIHdpbGwgYWxzbyBsb2NrIHRoZSBwYWdlCiAJCQkgKi8KIAkJCXJldCA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwKLQkJCQkJCSAgICBnZnBfbWFzayk7CisJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAodW5saWtlbHkocmV0KSkKIAkJCQlnb3RvIG91dDsKIAkJfQpAQCAtNzA3LDkgKzcwNiw5IEBACiAgKiBrZXkgaGVyZSBpcyB0aGUgJ2FjdG9yJyB3b3JrZXIgcGFzc2VkIGluIHRoYXQgYWN0dWFsbHkgbW92ZXMgdGhlIGRhdGEKICAqIHRvIHRoZSB3YW50ZWQgZGVzdGluYXRpb24uIFNlZSBwaXBlX3RvX2ZpbGUvcGlwZV90b19zZW5kcGFnZSBhYm92ZS4KICAqLwotc3NpemVfdCBzcGxpY2VfZnJvbV9waXBlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHN0cnVjdCBmaWxlICpvdXQsCi0JCQkgbG9mZl90ICpwcG9zLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JCQkgc3BsaWNlX2FjdG9yICphY3RvcikKK3N0YXRpYyBzc2l6ZV90IF9fc3BsaWNlX2Zyb21fcGlwZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAorCQkJCSAgc3RydWN0IGZpbGUgKm91dCwgbG9mZl90ICpwcG9zLCBzaXplX3QgbGVuLAorCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLCBzcGxpY2VfYWN0b3IgKmFjdG9yKQogewogCWludCByZXQsIGRvX3dha2V1cCwgZXJyOwogCXN0cnVjdCBzcGxpY2VfZGVzYyBzZDsKQEAgLTcyMiwxMyArNzIxLDEwIEBACiAJc2QuZmlsZSA9IG91dDsKIAlzZC5wb3MgPSAqcHBvczsKIAotCWlmIChwaXBlLT5pbm9kZSkKLQkJbXV0ZXhfbG9jaygmcGlwZS0+aW5vZGUtPmlfbXV0ZXgpOwotCiAJZm9yICg7OykgewogCQlpZiAocGlwZS0+bnJidWZzKSB7CiAJCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IHBpcGUtPmJ1ZnMgKyBwaXBlLT5jdXJidWY7Ci0JCQlzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyAqb3BzID0gYnVmLT5vcHM7CisJCQljb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyAqb3BzID0gYnVmLT5vcHM7CiAKIAkJCXNkLmxlbiA9IGJ1Zi0+bGVuOwogCQkJaWYgKHNkLmxlbiA+IHNkLnRvdGFsX2xlbikKQEAgLTc5Nyw5ICs3OTMsNiBAQAogCQlwaXBlX3dhaXQocGlwZSk7CiAJfQogCi0JaWYgKHBpcGUtPmlub2RlKQotCQltdXRleF91bmxvY2soJnBpcGUtPmlub2RlLT5pX211dGV4KTsKLQogCWlmIChkb193YWtldXApIHsKIAkJc21wX21iKCk7CiAJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZwaXBlLT53YWl0KSkKQEAgLTgxMCw2ICs4MDMsNzMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzc2l6ZV90IHNwbGljZV9mcm9tX3BpcGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IGZpbGUgKm91dCwKKwkJCSBsb2ZmX3QgKnBwb3MsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncywKKwkJCSBzcGxpY2VfYWN0b3IgKmFjdG9yKQoreworCXNzaXplX3QgcmV0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvdXQtPmZfbWFwcGluZy0+aG9zdDsKKworCS8qCisJICogVGhlIGFjdG9yIHdvcmtlciBtaWdodCBiZSBjYWxsaW5nIC0+cHJlcGFyZV93cml0ZSBhbmQKKwkgKiAtPmNvbW1pdF93cml0ZS4gTW9zdCBvZiB0aGUgdGltZSwgdGhlc2UgZXhwZWN0IGlfbXV0ZXggdG8KKwkgKiBiZSBoZWxkLiBTaW5jZSB0aGlzIG1heSByZXN1bHQgaW4gYW4gQUJCQSBkZWFkbG9jayB3aXRoCisJICogcGlwZS0+aW5vZGUsIHdlIGhhdmUgdG8gb3JkZXIgbG9jayBhY3F1aXJ5IGhlcmUuCisJICovCisJaW5vZGVfZG91YmxlX2xvY2soaW5vZGUsIHBpcGUtPmlub2RlKTsKKwlyZXQgPSBfX3NwbGljZV9mcm9tX3BpcGUocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzLCBhY3Rvcik7CisJaW5vZGVfZG91YmxlX3VubG9jayhpbm9kZSwgcGlwZS0+aW5vZGUpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlX25vbG9jayAtIGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUgd2l0aG91dCBtdXRleGVzCisgKiBAcGlwZToJcGlwZSBpbmZvCisgKiBAb3V0OglmaWxlIHRvIHdyaXRlIHRvCisgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gc3BsaWNlCisgKiBAZmxhZ3M6CXNwbGljZSBtb2RpZmllciBmbGFncworICoKKyAqIFdpbGwgZWl0aGVyIG1vdmUgb3IgY29weSBwYWdlcyAoZGV0ZXJtaW5lZCBieSBAZmxhZ3Mgb3B0aW9ucykgZnJvbQorICogdGhlIGdpdmVuIHBpcGUgaW5vZGUgdG8gdGhlIGdpdmVuIGZpbGUuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKyAqIGZvciBhY3F1aXJpbmcgaV9tdXRleCBvbiBib3RoIGlub2Rlcy4KKyAqCisgKi8KK3NzaXplX3QKK2dlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGVfbm9sb2NrKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHN0cnVjdCBmaWxlICpvdXQsCisJCQkJIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gb3V0LT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3NpemVfdCByZXQ7CisJaW50IGVycjsKKworCWVyciA9IHJlbW92ZV9zdWlkKG91dC0+Zl9wYXRoLmRlbnRyeSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXJldHVybiBlcnI7CisKKwlyZXQgPSBfX3NwbGljZV9mcm9tX3BpcGUocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzLCBwaXBlX3RvX2ZpbGUpOworCWlmIChyZXQgPiAwKSB7CisJCSpwcG9zICs9IHJldDsKKworCQkvKgorCQkgKiBJZiBmaWxlIG9yIGlub2RlIGlzIFNZTkMgYW5kIHdlIGFjdHVhbGx5IHdyb3RlIHNvbWUgZGF0YSwKKwkJICogc3luYyBpdC4KKwkJICovCisJCWlmICh1bmxpa2VseSgob3V0LT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkpIHsKKwkJCWVyciA9IGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIG1hcHBpbmcsCisJCQkJCQkgIE9TWU5DX01FVEFEQVRBfE9TWU5DX0RBVEEpOworCisJCQlpZiAoZXJyKQorCQkJCXJldCA9IGVycjsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZV9ub2xvY2spOworCiAvKioKICAqIGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUgLSBzcGxpY2UgZGF0YSBmcm9tIGEgcGlwZSB0byBhIGZpbGUKICAqIEBwaXBlOglwaXBlIGluZm8KQEAgLTgyNiwxMiArODg2LDIxIEBACiAJCQkgIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gb3V0LT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJc3NpemVfdCByZXQ7CisJaW50IGVycjsKKworCWVyciA9IHNob3VsZF9yZW1vdmVfc3VpZChvdXQtPmZfcGF0aC5kZW50cnkpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwkJZXJyID0gX19yZW1vdmVfc3VpZChvdXQtPmZfcGF0aC5kZW50cnksIGVycik7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CiAKIAlyZXQgPSBzcGxpY2VfZnJvbV9waXBlKHBpcGUsIG91dCwgcHBvcywgbGVuLCBmbGFncywgcGlwZV90b19maWxlKTsKIAlpZiAocmV0ID4gMCkgewotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKLQogCQkqcHBvcyArPSByZXQ7CiAKIAkJLyoKQEAgLTgzOSw4ICs5MDgsNiBAQAogCQkgKiBzeW5jIGl0LgogCQkgKi8KIAkJaWYgKHVubGlrZWx5KChvdXQtPmZfZmxhZ3MgJiBPX1NZTkMpIHx8IElTX1NZTkMoaW5vZGUpKSkgewotCQkJaW50IGVycjsKLQogCQkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkJZXJyID0gZ2VuZXJpY19vc3luY19pbm9kZShpbm9kZSwgbWFwcGluZywKIAkJCQkJCSAgT1NZTkNfTUVUQURBVEF8T1NZTkNfREFUQSk7CkBAIC05NDEsNyArMTAwOCw3IEBACiAJICogcmFuZG9tbHkgZHJvcCBkYXRhIGZvciBlZyBzb2NrZXQgLT4gc29ja2V0IHNwbGljaW5nLiBVc2UgdGhlCiAJICogcGlwZWQgc3BsaWNpbmcgZm9yIHRoYXQhCiAJICovCi0JaV9tb2RlID0gaW4tPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGU7CisJaV9tb2RlID0gaW4tPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZTsKIAlpZiAodW5saWtlbHkoIVNfSVNSRUcoaV9tb2RlKSAmJiAhU19JU0JMSyhpX21vZGUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEwNDIsNiArMTEwOSwxOSBAQAogRVhQT1JUX1NZTUJPTChkb19zcGxpY2VfZGlyZWN0KTsKIAogLyoKKyAqIEFmdGVyIHRoZSBpbm9kZSBzbGltbWluZyBwYXRjaCwgaV9waXBlL2lfYmRldi9pX2NkZXYgc2hhcmUgdGhlIHNhbWUKKyAqIGxvY2F0aW9uLCBzbyBjaGVja2luZyAtPmlfcGlwZSBpcyBub3QgZW5vdWdoIHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYQorICogcGlwZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlX2luZm8oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiBpbm9kZS0+aV9waXBlOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCiAgKiBEZXRlcm1pbmUgd2hlcmUgdG8gc3BsaWNlIHRvL2Zyb20uCiAgKi8KIHN0YXRpYyBsb25nIGRvX3NwbGljZShzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCBfX3VzZXIgKm9mZl9pbiwKQEAgLTEwNTIsNyArMTEzMiw3IEBACiAJbG9mZl90IG9mZnNldCwgKm9mZjsKIAlsb25nIHJldDsKIAotCXBpcGUgPSBpbi0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcGlwZTsKKwlwaXBlID0gcGlwZV9pbmZvKGluLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAocGlwZSkgewogCQlpZiAob2ZmX2luKQogCQkJcmV0dXJuIC1FU1BJUEU7CkBAIC0xMDczLDcgKzExNTMsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXBpcGUgPSBvdXQtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3BpcGU7CisJcGlwZSA9IHBpcGVfaW5mbyhvdXQtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWlmIChwaXBlKSB7CiAJCWlmIChvZmZfb3V0KQogCQkJcmV0dXJuIC1FU1BJUEU7CkBAIC0xMjMxLDcgKzEzMTEsNyBAQAogc3RhdGljIGxvbmcgZG9fdm1zcGxpY2Uoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKmlvdiwKIAkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncywgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9waXBlOworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2VzW1BJUEVfQlVGRkVSU107CiAJc3RydWN0IHBhcnRpYWxfcGFnZSBwYXJ0aWFsW1BJUEVfQlVGRkVSU107CiAJc3RydWN0IHNwbGljZV9waXBlX2Rlc2Mgc3BkID0gewpAQCAtMTI0MSw3ICsxMzIxLDggQEAKIAkJLm9wcyA9ICZ1c2VyX3BhZ2VfcGlwZV9idWZfb3BzLAogCX07CiAKLQlpZiAodW5saWtlbHkoIXBpcGUpKQorCXBpcGUgPSBwaXBlX2luZm8oZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKCFwaXBlKQogCQlyZXR1cm4gLUVCQURGOwogCWlmICh1bmxpa2VseShucl9zZWdzID4gVUlPX01BWElPVikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQwMCwxMyArMTQ4MSw3IEBACiAJICogZ3JhYmJpbmcgYnkgaW5vZGUgYWRkcmVzcy4gT3RoZXJ3aXNlIHR3byBkaWZmZXJlbnQgcHJvY2Vzc2VzCiAJICogY291bGQgZGVhZGxvY2sgKG9uZSBkb2luZyB0ZWUgZnJvbSBBIC0+IEIsIHRoZSBvdGhlciBmcm9tIEIgLT4gQSkuCiAJICovCi0JaWYgKGlwaXBlLT5pbm9kZSA8IG9waXBlLT5pbm9kZSkgewotCQltdXRleF9sb2NrX25lc3RlZCgmaXBpcGUtPmlub2RlLT5pX211dGV4LCBJX01VVEVYX1BBUkVOVCk7Ci0JCW11dGV4X2xvY2tfbmVzdGVkKCZvcGlwZS0+aW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfQ0hJTEQpOwotCX0gZWxzZSB7Ci0JCW11dGV4X2xvY2tfbmVzdGVkKCZvcGlwZS0+aW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKLQkJbXV0ZXhfbG9ja19uZXN0ZWQoJmlwaXBlLT5pbm9kZS0+aV9tdXRleCwgSV9NVVRFWF9DSElMRCk7Ci0JfQorCWlub2RlX2RvdWJsZV9sb2NrKGlwaXBlLT5pbm9kZSwgb3BpcGUtPmlub2RlKTsKIAogCWRvIHsKIAkJaWYgKCFvcGlwZS0+cmVhZGVycykgewpAQCAtMTQ1MCw4ICsxNTI1LDcgQEAKIAkJaSsrOwogCX0gd2hpbGUgKGxlbik7CiAKLQltdXRleF91bmxvY2soJmlwaXBlLT5pbm9kZS0+aV9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZvcGlwZS0+aW5vZGUtPmlfbXV0ZXgpOworCWlub2RlX2RvdWJsZV91bmxvY2soaXBpcGUtPmlub2RlLCBvcGlwZS0+aW5vZGUpOwogCiAJLyoKIAkgKiBJZiB3ZSBwdXQgZGF0YSBpbiB0aGUgb3V0cHV0IHBpcGUsIHdha2V1cCBhbnkgcG90ZW50aWFsIHJlYWRlcnMuCkBAIC0xNDc1LDggKzE1NDksOCBAQAogc3RhdGljIGxvbmcgZG9fdGVlKHN0cnVjdCBmaWxlICppbiwgc3RydWN0IGZpbGUgKm91dCwgc2l6ZV90IGxlbiwKIAkJICAgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKmlwaXBlID0gaW4tPmZfZGVudHJ5LT5kX2lub2RlLT5pX3BpcGU7Ci0Jc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqb3BpcGUgPSBvdXQtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3BpcGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaXBpcGUgPSBwaXBlX2luZm8oaW4tPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKm9waXBlID0gcGlwZV9pbmZvKG91dC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZnMvc3RhY2suYyBiL2ZzL3N0YWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkYmMzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N0YWNrLmMKQEAgLTAsMCArMSw0MCBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnNfc3RhY2suaD4KKworLyogZG9lcyBfTk9UXyByZXF1aXJlIGlfbXV0ZXggdG8gYmUgaGVsZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbmxpbmVkIHNpbmNlIGlfc2l6ZV97cmVhZCx3cml0ZX0gaXMgcmF0aGVyCisgKiBoZWF2eS13ZWlnaHQgb24gMzItYml0IHN5c3RlbXMKKyAqLwordm9pZCBmc3N0YWNrX2NvcHlfaW5vZGVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmRzdCwgY29uc3Qgc3RydWN0IGlub2RlICpzcmMpCit7CisJaV9zaXplX3dyaXRlKGRzdCwgaV9zaXplX3JlYWQoKHN0cnVjdCBpbm9kZSAqKXNyYykpOworCWRzdC0+aV9ibG9ja3MgPSBzcmMtPmlfYmxvY2tzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNzdGFja19jb3B5X2lub2RlX3NpemUpOworCisvKiBjb3B5IGFsbCBhdHRyaWJ1dGVzOyBnZXRfbmxpbmtzIGlzIG9wdGlvbmFsIHdheSB0byBvdmVycmlkZSB0aGUgaV9ubGluaworICogY29weWluZworICovCit2b2lkIGZzc3RhY2tfY29weV9hdHRyX2FsbChzdHJ1Y3QgaW5vZGUgKmRlc3QsIGNvbnN0IHN0cnVjdCBpbm9kZSAqc3JjLAorCQkJCWludCAoKmdldF9ubGlua3MpKHN0cnVjdCBpbm9kZSAqKSkKK3sKKwlpZiAoIWdldF9ubGlua3MpCisJCWRlc3QtPmlfbmxpbmsgPSBzcmMtPmlfbmxpbms7CisJZWxzZQorCQlkZXN0LT5pX25saW5rID0gKCpnZXRfbmxpbmtzKShkZXN0KTsKKworCWRlc3QtPmlfbW9kZSA9IHNyYy0+aV9tb2RlOworCWRlc3QtPmlfdWlkID0gc3JjLT5pX3VpZDsKKwlkZXN0LT5pX2dpZCA9IHNyYy0+aV9naWQ7CisJZGVzdC0+aV9yZGV2ID0gc3JjLT5pX3JkZXY7CisJZGVzdC0+aV9hdGltZSA9IHNyYy0+aV9hdGltZTsKKwlkZXN0LT5pX210aW1lID0gc3JjLT5pX210aW1lOworCWRlc3QtPmlfY3RpbWUgPSBzcmMtPmlfY3RpbWU7CisJZGVzdC0+aV9ibGtiaXRzID0gc3JjLT5pX2Jsa2JpdHM7CisJZGVzdC0+aV9mbGFncyA9IHNyYy0+aV9mbGFnczsKKworCWZzc3RhY2tfY29weV9pbm9kZV9zaXplKGRlc3QsIHNyYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc3N0YWNrX2NvcHlfYXR0cl9hbGwpOwpkaWZmIC0tZ2l0IGEvZnMvc3RhdC5jIGIvZnMvc3RhdC5jCmluZGV4IGJjYTA3ZWIuLjM4YThjYjIgMTAwNjQ0Ci0tLSBhL2ZzL3N0YXQuYworKysgYi9mcy9zdGF0LmMKQEAgLTUxLDEzICs1MSw2IEBACiAJCXJldHVybiBpbm9kZS0+aV9vcC0+Z2V0YXR0cihtbnQsIGRlbnRyeSwgc3RhdCk7CiAKIAlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKLQlpZiAoIXN0YXQtPmJsa3NpemUpIHsKLQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaW5vZGUtPmlfc2I7Ci0JCXVuc2lnbmVkIGJsb2NrczsKLQkJYmxvY2tzID0gKHN0YXQtPnNpemUrcy0+c19ibG9ja3NpemUtMSkgPj4gcy0+c19ibG9ja3NpemVfYml0czsKLQkJc3RhdC0+YmxvY2tzID0gKHMtPnNfYmxvY2tzaXplIC8gNTEyKSAqIGJsb2NrczsKLQkJc3RhdC0+Ymxrc2l6ZSA9IHMtPnNfYmxvY2tzaXplOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5LDcgKzEwMiw3IEBACiAJaW50IGVycm9yID0gLUVCQURGOwogCiAJaWYgKGYpIHsKLQkJZXJyb3IgPSB2ZnNfZ2V0YXR0cihmLT5mX3Zmc21udCwgZi0+Zl9kZW50cnksIHN0YXQpOworCQllcnJvciA9IHZmc19nZXRhdHRyKGYtPmZfcGF0aC5tbnQsIGYtPmZfcGF0aC5kZW50cnksIHN0YXQpOwogCQlmcHV0KGYpOwogCX0KIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCA0N2U1NTRjLi5mOTYxZTAzIDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTIyMSw2ICsyMjEsMjQgQEAKIH0KIAogLyoKKyAqIFN1cGVyYmxvY2sgbG9ja2luZy4gIFdlIHJlYWxseSBvdWdodCB0byBnZXQgcmlkIG9mIHRoZXNlIHR3by4KKyAqLwordm9pZCBsb2NrX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCWdldF9mc19leGNsKCk7CisJbXV0ZXhfbG9jaygmc2ItPnNfbG9jayk7Cit9CisKK3ZvaWQgdW5sb2NrX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXB1dF9mc19leGNsKCk7CisJbXV0ZXhfdW5sb2NrKCZzYi0+c19sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChsb2NrX3N1cGVyKTsKK0VYUE9SVF9TWU1CT0wodW5sb2NrX3N1cGVyKTsKKworLyoKICAqIFdyaXRlIG91dCBhbmQgd2FpdCB1cG9uIGFsbCBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzCiAgKiBzdXBlcmJsb2NrLiAgRmlsZXN5c3RlbSBkYXRhIGFzIHdlbGwgYXMgdGhlIHVuZGVybHlpbmcgYmxvY2sKICAqIGRldmljZS4gIFRha2VzIHRoZSBzdXBlcmJsb2NrIGxvY2suICBSZXF1aXJlcyBhIHNlY29uZCBibGtkZXYKQEAgLTU1Miw3ICs1NzAsNyBAQAogCiAJZmlsZV9saXN0X2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZzYi0+c19maWxlcywgZl91LmZ1X2xpc3QpIHsKLQkJaWYgKFNfSVNSRUcoZi0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgJiYgZmlsZV9jb3VudChmKSkKKwkJaWYgKFNfSVNSRUcoZi0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJiBmaWxlX2NvdW50KGYpKQogCQkJZi0+Zl9tb2RlICY9IH5GTU9ERV9XUklURTsKIAl9CiAJZmlsZV9saXN0X3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvZnMvc3luYy5jIGIvZnMvc3luYy5jCmluZGV4IDFkZTc0N2IuLmQwZmVmZjYgMTAwNjQ0Ci0tLSBhL2ZzL3N5bmMuYworKysgYi9mcy9zeW5jLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KQEAgLTkzLDcgKzk0LDcgQEAKIAkgKiBsaXZlbG9ja3MgaW4gZnN5bmNfYnVmZmVyc19saXN0KCkuCiAJICovCiAJbXV0ZXhfbG9jaygmbWFwcGluZy0+aG9zdC0+aV9tdXRleCk7Ci0JZXJyID0gZmlsZS0+Zl9vcC0+ZnN5bmMoZmlsZSwgZmlsZS0+Zl9kZW50cnksIGRhdGFzeW5jKTsKKwllcnIgPSBmaWxlLT5mX29wLT5mc3luYyhmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5LCBkYXRhc3luYyk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IGVycjsKIAltdXRleF91bmxvY2soJm1hcHBpbmctPmhvc3QtPmlfbXV0ZXgpOwpAQCAtMjIyLDcgKzIyMyw3IEBACiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dDsKIAotCWlfbW9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGU7CisJaV9tb2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlOwogCXJldCA9IC1FU1BJUEU7CiAJaWYgKCFTX0lTUkVHKGlfbW9kZSkgJiYgIVNfSVNCTEsoaV9tb2RlKSAmJiAhU19JU0RJUihpX21vZGUpICYmCiAJCQkhU19JU0xOSyhpX21vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvYmluLmMgYi9mcy9zeXNmcy9iaW4uYwppbmRleCA5ODAyMmU0Li5lOGY1NDBkIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9iaW4uYworKysgYi9mcy9zeXNmcy9iaW4uYwpAQCAtMzUsNyArMzUsNyBAQAogcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogdXNlcmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBvZmYpCiB7CiAJY2hhciAqYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJaW50IHNpemUgPSBkZW50cnktPmRfaW5vZGUtPmlfc2l6ZTsKIAlsb2ZmX3Qgb2ZmcyA9ICpvZmY7CiAJaW50IHJldDsKQEAgLTgxLDcgKzgxLDcgQEAKIAkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIG9mZikKIHsKIAljaGFyICpidWZmZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlpbnQgc2l6ZSA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplOwogCWxvZmZfdCBvZmZzID0gKm9mZjsKIApAQCAtMTA1LDcgKzEwNSw3IEBACiAKIHN0YXRpYyBpbnQgbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX2Jpbl9hdHRyKGRlbnRyeSk7CiAJc3RydWN0IGtvYmplY3QgKmtvYmogPSB0b19rb2JqKGRlbnRyeS0+ZF9wYXJlbnQpOwogCkBAIC0xMTcsOCArMTE3LDggQEAKIAogc3RhdGljIGludCBvcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCiB7Ci0Jc3RydWN0IGtvYmplY3QgKmtvYmogPSBzeXNmc19nZXRfa29iamVjdChmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQpOwotCXN0cnVjdCBiaW5fYXR0cmlidXRlICogYXR0ciA9IHRvX2Jpbl9hdHRyKGZpbGUtPmZfZGVudHJ5KTsKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiA9IHN5c2ZzX2dldF9rb2JqZWN0KGZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIgPSB0b19iaW5fYXR0cihmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOwogCiAJaWYgKCFrb2JqIHx8ICFhdHRyKQpAQCAtMTUzLDggKzE1Myw4IEBACiAKIHN0YXRpYyBpbnQgcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQogewotCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IHRvX2tvYmooZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKLQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIgPSB0b19iaW5fYXR0cihmaWxlLT5mX2RlbnRyeSk7CisJc3RydWN0IGtvYmplY3QgKiBrb2JqID0gdG9fa29iaihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudCk7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiBhdHRyID0gdG9fYmluX2F0dHIoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJdTggKiBidWZmZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoa29iaikgCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCmluZGV4IDNhYTM0MzQuLjUxMWVkZWYgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2Rpci5jCisrKyBiL2ZzL3N5c2ZzL2Rpci5jCkBAIC0zNzIsOSArMzcyLDU0IEBACiAJcmV0dXJuIGVycm9yOwogfQogCitpbnQgc3lzZnNfbW92ZV9kaXIoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqZWN0ICpuZXdfcGFyZW50KQoreworCXN0cnVjdCBkZW50cnkgKm9sZF9wYXJlbnRfZGVudHJ5LCAqbmV3X3BhcmVudF9kZW50cnksICpuZXdfZGVudHJ5OworCXN0cnVjdCBzeXNmc19kaXJlbnQgKm5ld19wYXJlbnRfc2QsICpzZDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIW5ld19wYXJlbnQpCisJCXJldHVybiAtRUlOVkFMOworCisJb2xkX3BhcmVudF9kZW50cnkgPSBrb2JqLT5wYXJlbnQgPworCQlrb2JqLT5wYXJlbnQtPmRlbnRyeSA6IHN5c2ZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKKwluZXdfcGFyZW50X2RlbnRyeSA9IG5ld19wYXJlbnQtPmRlbnRyeTsKKworYWdhaW46CisJbXV0ZXhfbG9jaygmb2xkX3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCWlmICghbXV0ZXhfdHJ5bG9jaygmbmV3X3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpKSB7CisJCW11dGV4X3VubG9jaygmb2xkX3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCQlnb3RvIGFnYWluOworCX0KKworCW5ld19wYXJlbnRfc2QgPSBuZXdfcGFyZW50X2RlbnRyeS0+ZF9mc2RhdGE7CisJc2QgPSBrb2JqLT5kZW50cnktPmRfZnNkYXRhOworCisJbmV3X2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGtvYmotPm5hbWUsIG5ld19wYXJlbnRfZGVudHJ5LAorCQkJCSAgICBzdHJsZW4oa29iai0+bmFtZSkpOworCWlmIChJU19FUlIobmV3X2RlbnRyeSkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKG5ld19kZW50cnkpOworCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJZXJyb3IgPSAwOworCWRfYWRkKG5ld19kZW50cnksIE5VTEwpOworCWRfbW92ZShrb2JqLT5kZW50cnksIG5ld19kZW50cnkpOworCWRwdXQobmV3X2RlbnRyeSk7CisKKwkvKiBSZW1vdmUgZnJvbSBvbGQgcGFyZW50J3MgbGlzdCBhbmQgaW5zZXJ0IGludG8gbmV3IHBhcmVudCdzIGxpc3QuICovCisJbGlzdF9kZWxfaW5pdCgmc2QtPnNfc2libGluZyk7CisJbGlzdF9hZGQoJnNkLT5zX3NpYmxpbmcsICZuZXdfcGFyZW50X3NkLT5zX2NoaWxkcmVuKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmbmV3X3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCW11dGV4X3VubG9jaygmb2xkX3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgaW50IHN5c2ZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkID0gZGVudHJ5LT5kX2ZzZGF0YTsKIAogCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CkBAIC0zODcsNyArNDMyLDcgQEAKIAogc3RhdGljIGludCBzeXNmc19kaXJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBjdXJzb3IgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwpAQCAtNDA3LDcgKzQ1Miw3IEBACiAKIHN0YXRpYyBpbnQgc3lzZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHBhcmVudF9zZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqY3Vyc29yID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpxID0gJmN1cnNvci0+c19zaWJsaW5nOwpAQCAtNDY0LDcgKzUwOSw3IEBACiAKIHN0YXRpYyBsb2ZmX3Qgc3lzZnNfZGlyX2xzZWVrKHN0cnVjdCBmaWxlICogZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKIHsKLQlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAKIAltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXN3aXRjaCAob3JpZ2luKSB7CkBAIC00NzQsNyArNTE5LDcgQEAKIAkJCWlmIChvZmZzZXQgPj0gMCkKIAkJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCW11dGV4X3VubG9jaygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9maWxlLmMgYi9mcy9zeXNmcy9maWxlLmMKaW5kZXggMTQ2ZjFkZS4uOWNmZTUzZSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZmlsZS5jCisrKyBiL2ZzL3N5c2ZzL2ZpbGUuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAKIAlkb3duKCZidWZmZXItPnNlbSk7CiAJaWYgKGJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsKSB7Ci0JCWlmICgocmV0dmFsID0gZmlsbF9yZWFkX2J1ZmZlcihmaWxlLT5mX2RlbnRyeSxidWZmZXIpKSkKKwkJaWYgKChyZXR2YWwgPSBmaWxsX3JlYWRfYnVmZmVyKGZpbGUtPmZfcGF0aC5kZW50cnksYnVmZmVyKSkpCiAJCQlnb3RvIG91dDsKIAl9CiAJcHJfZGVidWcoIiVzOiBjb3VudCA9ICV6ZCwgcHBvcyA9ICVsbGQsIGJ1ZiA9ICVzXG4iLApAQCAtMTkwLDYgKzE5MCw5IEBACiAJCWNvdW50ID0gUEFHRV9TSVpFIC0gMTsKIAllcnJvciA9IGNvcHlfZnJvbV91c2VyKGJ1ZmZlci0+cGFnZSxidWYsY291bnQpOwogCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMTsKKwkvKiBpZiBidWYgaXMgYXNzdW1lZCB0byBjb250YWluIGEgc3RyaW5nLCB0ZXJtaW5hdGUgaXQgYnkgXDAsCisJICAgc28gZS5nLiBzc2NhbmYoKSBjYW4gc2NhbiB0aGUgc3RyaW5nIGVhc2lseSAqLworCWJ1ZmZlci0+cGFnZVtjb3VudF0gPSAwOwogCXJldHVybiBlcnJvciA/IC1FRkFVTFQgOiBjb3VudDsKIH0KIApAQCAtMjQyLDcgKzI0NSw3IEBACiAJZG93bigmYnVmZmVyLT5zZW0pOwogCWxlbiA9IGZpbGxfd3JpdGVfYnVmZmVyKGJ1ZmZlciwgYnVmLCBjb3VudCk7CiAJaWYgKGxlbiA+IDApCi0JCWxlbiA9IGZsdXNoX3dyaXRlX2J1ZmZlcihmaWxlLT5mX2RlbnRyeSwgYnVmZmVyLCBsZW4pOworCQlsZW4gPSBmbHVzaF93cml0ZV9idWZmZXIoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgYnVmZmVyLCBsZW4pOwogCWlmIChsZW4gPiAwKQogCQkqcHBvcyArPSBsZW47CiAJdXAoJmJ1ZmZlci0+c2VtKTsKQEAgLTI1MSw4ICsyNTQsOCBAQAogCiBzdGF0aWMgaW50IGNoZWNrX3Blcm0oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKIHsKLQlzdHJ1Y3Qga29iamVjdCAqa29iaiA9IHN5c2ZzX2dldF9rb2JqZWN0KGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudCk7Ci0Jc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIgPSB0b19hdHRyKGZpbGUtPmZfZGVudHJ5KTsKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiA9IHN5c2ZzX2dldF9rb2JqZWN0KGZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciA9IHRvX2F0dHIoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJc3RydWN0IHN5c2ZzX2J1ZmZlciAqIGJ1ZmZlcjsKIAlzdHJ1Y3Qgc3lzZnNfb3BzICogb3BzID0gTlVMTDsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtMzM0LDggKzMzNyw4IEBACiAKIHN0YXRpYyBpbnQgc3lzZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQogewotCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IHRvX2tvYmooZmlscC0+Zl9kZW50cnktPmRfcGFyZW50KTsKLQlzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciA9IHRvX2F0dHIoZmlscC0+Zl9kZW50cnkpOworCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IHRvX2tvYmooZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQpOworCXN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyID0gdG9fYXR0cihmaWxwLT5mX3BhdGguZGVudHJ5KTsKIAlzdHJ1Y3QgbW9kdWxlICogb3duZXIgPSBhdHRyLT5vd25lcjsKIAlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCkBAIC0zNjksOCArMzcyLDggQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3lzZnNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKIHsKIAlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IHRvX2tvYmooZmlscC0+Zl9kZW50cnktPmRfcGFyZW50KTsKLQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QgPSBmaWxwLT5mX2RlbnRyeS0+ZF9mc2RhdGE7CisJc3RydWN0IGtvYmplY3QgKiBrb2JqID0gdG9fa29iaihmaWxwLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudCk7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9mc2RhdGE7CiAJaW50IHJlcyA9IDA7CiAKIAlwb2xsX3dhaXQoZmlscCwgJmtvYmotPnBvbGwsIHdhaXQpOwpAQCAtNDgzLDE3ICs0ODYsMTIgQEAKIAkJICAgICh2aWN0aW0tPmRfcGFyZW50LT5kX2lub2RlID09IGRpci0+ZF9pbm9kZSkpIHsKIAkJCXZpY3RpbS0+ZF9pbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAkJCWZzbm90aWZ5X21vZGlmeSh2aWN0aW0pOwotCi0JCQkvKioKLQkJCSAqIERyb3AgcmVmZXJlbmNlIGZyb20gaW5pdGlhbCBzeXNmc19nZXRfZGVudHJ5KCkuCi0JCQkgKi8KLQkJCWRwdXQodmljdGltKTsKIAkJCXJlcyA9IDA7CiAJCX0gZWxzZQogCQkJZF9kcm9wKHZpY3RpbSk7CiAJCQogCQkvKioKLQkJICogRHJvcCB0aGUgcmVmZXJlbmNlIGFjcXVpcmVkIGZyb20gc3lzZnNfZ2V0X2RlbnRyeSgpIGFib3ZlLgorCQkgKiBEcm9wIHRoZSByZWZlcmVuY2UgYWNxdWlyZWQgZnJvbSBsb29rdXBfb25lX2xlbigpIGFib3ZlLgogCQkgKi8KIAkJZHB1dCh2aWN0aW0pOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL21vdW50LmMgYi9mcy9zeXNmcy9tb3VudC5jCmluZGV4IDIwNTUxYTEuLmU1MDNmODUgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL21vdW50LmMKKysrIGIvZnMvc3lzZnMvbW91bnQuYwpAQCAtMTYsNyArMTYsNyBAQAogCiBzdHJ1Y3QgdmZzbW91bnQgKnN5c2ZzX21vdW50Owogc3RydWN0IHN1cGVyX2Jsb2NrICogc3lzZnNfc2IgPSBOVUxMOwota21lbV9jYWNoZV90ICpzeXNmc19kaXJfY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUgKnN5c2ZzX2Rpcl9jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBzeXNmc19vcHMgPSB7CiAJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLApkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvc3lzZnMuaCBiL2ZzL3N5c2ZzL3N5c2ZzLmgKaW5kZXggNmYzZDZiZC4uYmQ3Y2VjMiAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvc3lzZnMuaAorKysgYi9mcy9zeXNmcy9zeXNmcy5oCkBAIC0xLDYgKzEsNiBAQAogCiBleHRlcm4gc3RydWN0IHZmc21vdW50ICogc3lzZnNfbW91bnQ7Ci1leHRlcm4ga21lbV9jYWNoZV90ICpzeXNmc19kaXJfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpzeXNmc19kaXJfY2FjaGVwOwogCiBleHRlcm4gc3RydWN0IGlub2RlICogc3lzZnNfbmV3X2lub2RlKG1vZGVfdCBtb2RlLCBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICopOwogZXh0ZXJuIGludCBzeXNmc19jcmVhdGUoc3RydWN0IGRlbnRyeSAqLCBpbnQgbW9kZSwgaW50ICgqaW5pdCkoc3RydWN0IGlub2RlICopKTsKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvQ0hBTkdFUyBiL2ZzL3N5c3YvQ0hBTkdFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlYTZlOS4uMDAwMDAwMAotLS0gYS9mcy9zeXN2L0NIQU5HRVMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1Nb24sIDE1IERlYyAxOTk3CSAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kgPGtnYkBtYW5qYWsua25tLm9yZy5wbD4KLQkqICAgIG5hbWVpLmM6IHN0cnVjdCBzeXN2X2Rpcl9pbm9kZV9vcGVyYXRpb25zIHVwZGF0ZWQgdG8gdXNlIGRlbnRyaWVzLgotCi1GcmksIDIzIEphbiAxOTk4ICAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kgPGtnYkBtYW5qYWsua25tLm9yZy5wbD4KLQkqICAgIGlub2RlLmM6IGNvcnJlY3RlZCAxIHRyYWNrIG9mZnNldCBzZXR0aW5nIChpbiBzYi0+c3ZfYmxvY2tfYmFzZSkuCi0JCSAgICAgIE9yaWdpbmFsbHkgaXQgd2FzIG92ZXJyaWRkZW4gKGJ5IHNldHRpbmcgdG8gemVybykKLQkJICAgICAgaW4gZGV0ZWN0ZWRfW3hlbml4LHN5c3Y0LHN5c3YyLGNvaGVyZW50XS4gVGhhbmtzCi0JCSAgICAgIHRvIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3ogPGFua3J5QG1pZi5wZy5nZGEucGw+Ci0JCSAgICAgIGZvciBpZGVudGlmeWluZyB0aGUgcHJvYmxlbS4KLQotVHVlLCAyNyBKYW4gMTk5OCAgIEtyenlzenRvZiBHLiBCYXJhbm93c2tpIDxrZ2JAbWFuamFrLmtubS5vcmcucGw+Ci0gICAgICAgICogICAgaW5vZGUuYzogYWRkZWQgMjA0OC1ieXRlIGJsb2NrIHN1cHBvcnQgdG8gU3lzdGVtViBGUy4KLQkJICAgICAgTWVyZ2VkIGRldGVjdGVkX2JzWzUxMiwxMDI0LDIwNDhdKCkgaW50byBvbmUgZnVuY3Rpb246Ci0JCSAgICAgIHZvaWQgZGV0ZWN0ZWRfYnMgKHVfY2hhciB0eXBlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKS4KLQkJICAgICAgVGhhbmtzIHRvIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3ogPGFua3J5QG1pZi5wZy5nZGEucGw+Ci0JCSAgICAgIGZvciB0aGUgcGF0Y2guCi0KLVdlZCwgNCBGZWIgMTk5OCAgIEtyenlzenRvZiBHLiBCYXJhbm93c2tpIDxrZ2JAbWFuamFrLmtubS5vcmcucGw+Ci0JKiAgICBuYW1laS5jOiByZW1vdmVkIHN0YXRpYyBzdWJkaXIoKTsgaXNfc3ViZGlyKCkgZnJvbSBkY2FjaGUuYwotCQkgICAgICBpcyB1c2VkIGluc3RlYWQuIENvc21ldGljIGNoYW5nZXMuCi0KLVRodSwgMyBEZWMgMTk5OCAgIEFsIFZpcm8gKHZpcm9AcGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrKQotCSogICAgbmFtZWkuYyAoc3lzdl9ybWRpcik6Ci0JCSAgICAgIEJ1Z2VjdG9teTogb2xkIGNoZWNrIGZvciB2aWN0aW0gYmVpbmcgYnVzeQotCQkgICAgICAoaW5vZGUtPmlfY291bnQpIHdhc24ndCByZXBsYWNlZCAod2l0aCBjaGVja2luZwotCQkgICAgICBkZW50cnktPmRfY291bnQpIGFuZCBlc2NhcGVkIExpbnVzIGluIHRoZSBsYXN0IHJvdW5kCi0JCSAgICAgIG9mIGNoYW5nZXMuIFNob3QgYW5kIGJ1cmllZC4KLQotV2VkLCA5IERlYyAxOTk4ICAgQVYKLQkqICAgIG5hbWVpLmMgKGRvX3N5c3ZfcmVuYW1lKToKLQkJICAgICAgIEZpeGVkIGluY29ycmVjdCBjaGVjayBmb3Igb3RoZXIgb3duZXJzICsgcmFjZS4KLQkJICAgICAgIFJlbW92ZWQgY2hlY2tzIHRoYXQgd2VudCB0byBWRlMuCi0JKiAgICBuYW1laS5jIChzeXN2X3VubGluayk6Ci0JCSAgICAgICBSZW1vdmVkIGNoZWNrcyB0aGF0IHdlbnQgdG8gVkZTLgotCi1UaHUsIDEwIERlYyAxOTk4ICAgQVYKLQkqICAgIG5hbWVpLmMgKGRvX21rbm9kKToKLQkJCVJlbW92ZWQgZGVhZCBjb2RlIC0gbWtub2QgaXMgbmV2ZXIgYXNrZWQgdG8KLQkJCWNyZWF0ZSBhIHN5bWxpbmsgb3IgZGlyZWN0b3J5LiBJbmNpZGVudGlhbGx5LAotCQkJaXQgd291bGRuJ3QgZG8gaXQgcmlnaHQgaWYgaXQgd291bGQgYmUgY2FsbGVkLgotCi1TYXQsIDI2IERlYyAxOTk4ICAgS0dCCi0JKiAgICBpbm9kZS5jIChkZXRlY3Rfc3lzdjQpOgotCQkJQWRkZWQgZGV0ZWN0aW9uIG9mIGV4cGFuZGVkIHNfdHlwZSBmaWVsZCAoMHgxMCwKLQkJCTB4MjAgYW5kIDB4MzApLiAgRm9yY2VkIHJlYWQtb25seSBhY2Nlc3MgaW4gdGhpcyBjYXNlLgotCi1TdW4sIDIxIE1hciAxOTk5ICAgQVYKLQkqICAgIG5hbWVpLmMgKHN5c3ZfbGluayk6Ci0JCQlGaXhlZCBpX2NvdW50IHVzYWdlIHRoYXQgcmVzdWx0ZWQgaW4gZGNhY2hlIGNvcnJ1cHRpb24uCi0JKiAgICBpbm9kZS5jOgotCQkJRmlsbGVkIC0+ZGVsZXRlX2lub2RlKCkgbWV0aG9kIHdpdGggc3lzdl9kZWxldGVfaW5vZGUoKS4KLQkJCXN5c3ZfcHV0X2lub2RlKCkgaXMgZ29uZSwgYXMgaXQgdHJpZWQgdG8gZG8gLT5kZWxldGVfCi0JCQlfaW5vZGUoKSdzIGpvYi4KLQkqICAgIGlhbGxvYy5jOiAoc3lzdl9mcmVlX2lub2RlKToKLQkJCUZpeGVkIHJhY2UuCi0KLVN1biwgMzAgQXByIDE5OTkgICBBVgotCSogICAgbmFtZWkuYyAoc3lzdl9ta25vZCk6Ci0JCQlSZW1vdmVkIGRlYWQgY29kZSAoU19JRlJFRyBjYXNlIGlzIG5vdyBwYXNzZWQgdG8KLQkJCS0+Y3JlYXRlKCkgYnkgVkZTKS4KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvQ2hhbmdlTG9nIGIvZnMvc3lzdi9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDNmOGIuLjAwMDAwMDAKLS0tIGEvZnMvc3lzdi9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotVGh1IEZlYiAxNCAyMDAyICBBbmRyZXcgTW9ydG9uICA8YWtwbUB6aXAuY29tLmF1PgotCi0JKiBkaXJfY29tbWl0X2NodW5rKCk6IGNhbGwgd3JpdGVvdXRfb25lX3BhZ2UoKSBhcyB3ZWxsIGFzCi0JICB3YWl0Zm9yX29uZV9wYWdlKCkgZm9yIElTX1NZTkMgZGlyZWN0b3JpZXMsIHNvIHRoYXQgd2UKLQkgIGFjdHVhbGx5IGRvIHN5bmMgdGhlIGRpcmVjdG9yeS4gKGZvcndhcmQtcG9ydCBmcm9tIDIuNCkuCi0KLVRodSBGZWIgIDcgMjAwMiAgQWxleGFuZGVyIFZpcm8gIDx2aXJvQHBhcmNlbGZhcmNlLmxpbnV4LnRoZXBsYW5ldC5jby51az4KLQotCSogc3VwZXIuYzogc3dpdGNoZWQgdG8gLT5nZXRfc2IoKQotCSogQ2hhbmdlTG9nOiBmaXhlZCBkYXRlcyA7LSkKLQotMjAwMi0wMS0yNCAgRGF2aWQgUy4gTWlsbGVyICA8ZGF2ZW1AcmVkaGF0LmNvbT4KLQotCSogaW5vZGUuYzogSW5jbHVkZSBsaW51eC9pbml0LmgKLQotTW9uIEphbiAyMSAyMDAyICBBbGV4YW5kZXIgVmlybyAgPHZpcm9AcGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrPgotCSogaWFsbG9jLmMgKHN5c3ZfbmV3X2lub2RlKTogemVybyBTWVNWX0koaW5vZGUpLT5pX2RhdGEgb3V0LgotCSogaV92bm9kZSByZW5hbWVkIHRvIHZmc19pbm9kZS4gIFNvcnJ5LCBidXQgbGV0J3Mga2VlcCB0aGF0Ci0JICBjb25zaXN0ZW50LgotCi1TYXQgSmFuIDE5IDIwMDIgIENocmlzdG9waCBIZWxsd2lnICA8aGNoQGluZnJhZGVhZC5vcmc+Ci0KLQkqIGluY2x1ZGUvbGludXgvc3lzdl9mcy5oIChTWVNWX0kpOiBHZXQgZnMtcHJpdmF0ZSBpbm9kZSBkYXRhIHVzaW5nCi0JCWxpc3RfZW50cnkoKSBpbnN0ZWFkIG9mIGlub2RlLT51LgotCSogaW5jbHVkZS9saW51eC9zeXN2X2ZzX2kuaDogQWRkICdzdHJ1Y3QgaW5vZGUgIGlfdm5vZGUnIGZpZWxkIHRvCi0JCXN5c3ZfaW5vZGVfaW5mbyBzdHJ1Y3R1cmUuCi0JKiBpbm9kZS5jOiBJbmNsdWRlIDxsaW51eC9zbGFiLmg+LCBpbXBsZW1lbnQgYWxsb2NfaW5vZGUvZGVzdHJveV9pbm9kZQotCQlzb3AgbWV0aG9kcywgYWRkIGluZnJhc3RydWN0dXJlIGZvciBwZXItZnMgaW5vZGUgc2xhYiBjYWNoZS4KLQkqIHN1cGVyLmMgKGluaXRfc3lzdl9mcyk6IEluaXRpYWxpemUgaW5vZGUgY2FjaGUsIHJlY292ZXIgcHJvcGVybHkKLQkJaW4gdGhlIGNhc2Ugb2YgZmFpbGVkIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0gZm9yIFY3LgotCShleGl0X3N5c3ZfZnMpOiBEZXN0cm95IGlub2RlIGNhY2hlLgotCi1TYXQgSmFuIDE5IDIwMDIgIENocmlzdG9waCBIZWxsd2lnICA8aGNoQGluZnJhZGVhZC5vcmc+Ci0KLQkqIGluY2x1ZGUvbGludXgvc3lzdl9mcy5oOiBJbmNsdWRlIDxsaW51eC9zeXN2X2ZzX2kuaD4sIGRlY2xhcmUgU1lTVl9JKCkuCi0JKiBkaXIuYyAoc3lzdl9maW5kX2VudHJ5KTogVXNlIFNZU1ZfSSgpIGluc3RlYWQgb2YgLT51LnN5c3ZfaSB0bwotCQlhY2Nlc3MgZnMtcHJpdmF0ZSBpbm9kZSBkYXRhLgotCSogaWFsbG9jLmMgKHN5c3ZfbmV3X2lub2RlKTogTGlrZXdpc2UuCi0JKiBpbm9kZS5jIChzeXN2X3JlYWRfaW5vZGUpOiBMaWtld2lzZS4KLQkoc3lzdl91cGRhdGVfaW5vZGUpOiBMaWtld2lzZS4KLQkqIGl0cmVlLmMgKGdldF9icmFuY2gpOiBMaWtld2lzZS4KLQkoc3lzdl90cnVuY2F0ZSk6IExpa2V3aXNlLgotCSogc3ltbGluay5jIChzeXN2X3JlYWRsaW5rKTogTGlrZXdpc2UuCi0JKHN5c3ZfZm9sbG93X2xpbmspOiBMaWtld2lzZS4KLQotRnJpIEphbiAgNCAyMDAyICBBbGV4YW5kZXIgVmlybyAgPHZpcm9AcGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrPgotCi0JKiBpYWxsb2MuYyAoc3lzdl9mcmVlX2lub2RlKTogVXNlIHNiLT5zX2lkIGluc3RlYWQgb2YgYmRldm5hbWUoKS4KLQkqIGlub2RlLmMgKHN5c3ZfcmVhZF9pbm9kZSk6IExpa2V3aXNlLgotCSAgKHN5c3ZfdXBkYXRlX2lub2RlKTogTGlrZXdpc2UuCi0JICAoc3lzdl9zeW5jX2lub2RlKTogTGlrZXdpc2UuCi0JKiBzdXBlci5jIChkZXRlY3Rfc3lzdik6IExpa2V3aXNlLgotCSAgKGNvbXBsZXRlX3JlYWRfc3VwZXIpOiBMaWtld2lzZS4KLQkgIChzeXN2X3JlYWRfc3VwZXIpOiBMaWtld2lzZS4KLQkgICh2N19yZWFkX3N1cGVyKTogTGlrZXdpc2UuCi0KLVN1biBEZWMgMzAgMjAwMSAgTWFuZnJlZCBTcHJhdWwgIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+Ci0KLQkqIGRpci5jIChkaXJfY29tbWl0X2NodW5rKTogRG8gbm90IHNldCBkaXItPmlfdmVyc2lvbi4KLQkoc3lzdl9yZWFkZGlyKTogTGlrZXdpc2UuCi0KLVRodSBEZWMgMjcgMjAwMSAgQWxleGFuZGVyIFZpcm8gIDx2aXJvQHBhcmNlbGZhcmNlLmxpbnV4LnRoZXBsYW5ldC5jby51az4KLQotCSogaXRyZWUuYyAoZ2V0X2Jsb2NrKTogVXNlIG1hcF9iaCgpIHRvIGZpbGwgb3V0IGJoX3Jlc3VsdC4KLQotVHVlIERlYyAyNSAyMDAxICBBbGV4YW5kZXIgVmlybyAgPHZpcm9AcGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrPgotCi0JKiBzdXBlci5jIChzeXN2X3JlYWRfc3VwZXIpOiBVc2Ugc2Jfc2V0X2Jsb2Nrc2l6ZSgpIHRvIHNldCBibG9ja3NpemUuCi0JICAodjdfcmVhZF9zdXBlcik6IExpa2V3aXNlLgotCi1UdWUgTm92IDI3IDIwMDEgIEFsZXhhbmRlciBWaXJvICA8dmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWs+Ci0KLQkqIGl0cmVlLmMgKGdldF9ibG9jayk6IENoYW5nZSB0eXBlIGZvciBpYmxvY2sgYXJndW1lbnQgdG8gc2VjdG9yX3QuCi0JKiBzdXBlci5jIChzeXN2X3JlYWRfc3VwZXIpOiBTZXQgc19ibG9ja3NpemUgZWFybHkuCi0JICAodjdfcmVhZF9zdXBlcik6IExpa2V3aXNlLgotCSogYmFsbG9jLmMgKHN5c3ZfbmV3X2Jsb2NrKTogVXNlIHNiX2JyZWFkKCkuIGluc3RlYWQgb2YgYnJlYWQoKS4KLQkgIChzeXN2X2NvdW50X2ZyZWVfYmxvY2tzKTogTGlrZXdpc2UuCi0JKiBpYWxsb2MuYyAoc3lzdl9yYXdfaW5vZGUpOiBMaWtld2lzZS4KLQkqIGl0cmVlLmMgKGdldF9icmFuY2gpOiBMaWtld2lzZS4KLQkgIChmcmVlX2JyYW5jaGVzKTogTGlrZXdpc2UuCi0JKiBzdXBlci5jIChzeXN2X3JlYWRfc3VwZXIpOiBMaWtld2lzZS4KLQkgICh2N19yZWFkX3N1cGVyKTogTGlrZXdpc2UuCi0KLVNhdCBEZWMgMTUgMjAwMSAgQ2hyaXN0b3BoIEhlbGx3aWcgIDxoY2hAaW5mcmFkZWFkLm9yZz4KLQotCSogaW5vZGUuYyAoc3lzdl9yZWFkX2lub2RlKTogTWFyayBpbm9kZSBhcyBiYWQgaW4gY2FzZSBvZiBmYWlsdXJlLgotCSogc3VwZXIuYyAoY29tcGxldGVfcmVhZF9zdXBlcik6IENoZWNrIGZvciBiYWQgcm9vdCBpbm9kZS4KLQotV2VkIE5vdiAyMSAyMDAxICBBbmRyZXcgTW9ydG9uICA8YW5kcmV3bUB1b3cuZWR1LmF1PgotCi0JKiBmaWxlLmMgKHN5c3Zfc3luY19maWxlKTogQ2FsbCBmc3luY19pbm9kZV9kYXRhX2J1ZmZlcnMuCi0KLUZyaSBPY3QgMjYgMjAwMSAgQ2hyaXN0b3BoIEhlbGx3aWcgIDxoY2hAaW5mcmFkZWFkLm9yZz4KLQotCSogZGlyLmMsIGlhbGxvYy5jLCBuYW1laS5jLCBpbmNsdWRlL2xpbnV4L3N5c3ZfZnNfaS5oOgotCUltcGxlbWVudCBwZXItSW5vZGUgbG9va3VwIG9mZnNldCBjYWNoZS4KLQlNb2RlbGxlZCBhZnRlciBUZWQncyBleHQyIHBhdGNoLgotCi1GcmkgT2N0IDI2IDIwMDEgIENocmlzdG9waCBIZWxsd2lnICA8aGNoQGluZnJhZGVhZC5vcmc+Ci0KLQkqIGlub2RlLmMsIHN1cGVyLmMsIGluY2x1ZGUvbGludXgvc3lzdl9mcy5oLAotCSAgaW5jbHVkZS9saW51eC9zeXN2X2ZzX3NiLmg6Ci0JUmVtb3ZlIHN5bWxpbmsgZmFraW5nLglOb29uZSByZWFsbHkgd2FudHMgdG8gdXNlIHRoZXNlIGFzCi0JbGludXggZmlsZXN5c3RlbXMgYW5kIG5hdGl2ZSBPU2VzIGRvbid0IHN1cHBvcnQgaXQgYW55d2F5LgotCi0KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvSU5UUk8gYi9mcy9zeXN2L0lOVFJPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTRlNGQxLi4wMDAwMDAwCi0tLSBhL2ZzL3N5c3YvSU5UUk8KKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFN5c3RlbVYvQ29oZXJlbnQgZmlsZXN5c3RlbSBmb3IgTGludXguCi1JdCBncmV3IG91dCBvZiBzZXBhcmF0ZSBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9ucwotCi0gICAgWGVuaXggRlMgICAgICBEb3VnIEV2YW5zIDxkamVAY3lnbnVzLmNvbT4gIEp1bmUgMTk5MgotICAgIFN5c3RlbVYgRlMgICAgUGF1bCBCLiBNb25kYXkgPHBtb25kYXlAZWVjcy53c3UuZWR1PiBNYXJjaC1KdW5lIDE5OTMKLSAgICBDb2hlcmVudCBGUyAgIEIuIEhhaWJsZSA8aGFpYmxlQG1hMnMyLm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZT4gSnVuZSAxOTkzCi0KLWFuZCB3YXMgbWVyZ2VkIHRvZ2V0aGVyIGluIEp1bHkgMTk5My4KLQotVGhlc2UgZmlsZXN5c3RlbXMgYXJlIHJhdGhlciBzaW1pbGFyLiBIZXJlIGlzIGEgY29tcGFyaXNvbiB3aXRoIE1pbml4IEZTOgotCi0qIExpbnV4IGZkaXNrIHJlcG9ydHMgb24gcGFydGl0aW9ucwotICAtIE1pbml4IEZTICAgICAweDgxIExpbnV4L01pbml4Ci0gIC0gWGVuaXggRlMgICAgID8/Ci0gIC0gU3lzdGVtViBGUyAgID8/Ci0gIC0gQ29oZXJlbnQgRlMgIDB4MDggQUlYIGJvb3RhYmxlCi0KLSogU2l6ZSBvZiBhIGJsb2NrIG9yIHpvbmUgKGRhdGEgYWxsb2NhdGlvbiB1bml0IG9uIGRpc2spCi0gIC0gTWluaXggRlMgICAgIDEwMjQKLSAgLSBYZW5peCBGUyAgICAgMTAyNCAoYWxzbyA1MTIgPz8pCi0gIC0gU3lzdGVtViBGUyAgIDEwMjQgKGFsc28gNTEyIGFuZCAyMDQ4KQotICAtIENvaGVyZW50IEZTICAgNTEyCi0KLSogR2VuZXJhbCBsYXlvdXQ6IGFsbCBoYXZlIG9uZSBib290IGJsb2NrLCBvbmUgc3VwZXIgYmxvY2sgYW5kCi0gIHNlcGFyYXRlIGFyZWFzIGZvciBpbm9kZXMgYW5kIGZvciBkaXJlY3Rvcmllcy9kYXRhLgotICBPbiBTeXN0ZW1WIFJlbGVhc2UgMiBGUyAoZS5nLiBNaWNyb3BvcnQpIHRoZSBmaXJzdCB0cmFjayBpcyByZXNlcnZlZCBhbmQKLSAgYWxsIHRoZSBibG9jayBudW1iZXJzIChpbmNsdWRpbmcgdGhlIHN1cGVyIGJsb2NrKSBhcmUgb2Zmc2V0IGJ5IG9uZSB0cmFjay4KLQotKiBCeXRlIG9yZGVyaW5nIG9mICJzaG9ydCIgKDE2IGJpdCBlbnRpdGllcykgb24gZGlzazoKLSAgLSBNaW5peCBGUyAgICAgbGl0dGxlIGVuZGlhbiAgMCAxCi0gIC0gWGVuaXggRlMgICAgIGxpdHRsZSBlbmRpYW4gIDAgMQotICAtIFN5c3RlbVYgRlMgICBsaXR0bGUgZW5kaWFuICAwIDEKLSAgLSBDb2hlcmVudCBGUyAgbGl0dGxlIGVuZGlhbiAgMCAxCi0gIE9mIGNvdXJzZSwgdGhpcyBhZmZlY3RzIG9ubHkgdGhlIGZpbGUgc3lzdGVtLCBub3QgdGhlIGRhdGEgb2YgZmlsZXMgb24gaXQhCi0KLSogQnl0ZSBvcmRlcmluZyBvZiAibG9uZyIgKDMyIGJpdCBlbnRpdGllcykgb24gZGlzazoKLSAgLSBNaW5peCBGUyAgICAgbGl0dGxlIGVuZGlhbiAgMCAxIDIgMwotICAtIFhlbml4IEZTICAgICBsaXR0bGUgZW5kaWFuICAwIDEgMiAzCi0gIC0gU3lzdGVtViBGUyAgIGxpdHRsZSBlbmRpYW4gIDAgMSAyIDMKLSAgLSBDb2hlcmVudCBGUyAgUERQLTExICAgICAgICAgMiAzIDAgMQotICBPZiBjb3Vyc2UsIHRoaXMgYWZmZWN0cyBvbmx5IHRoZSBmaWxlIHN5c3RlbSwgbm90IHRoZSBkYXRhIG9mIGZpbGVzIG9uIGl0IQotCi0qIElub2RlIG9uIGRpc2s6ICJzaG9ydCIsIDAgbWVhbnMgbm9uLWV4aXN0ZW50LCB0aGUgcm9vdCBkaXIgaW5vIGlzOgotICAtIE1pbml4IEZTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMgICAyCi0KLSogTWF4aW11bSBudW1iZXIgb2YgaGFyZCBsaW5rcyB0byBhIGZpbGU6Ci0gIC0gTWluaXggRlMgICAgIDI1MAotICAtIFhlbml4IEZTICAgICA/PwotICAtIFN5c3RlbVYgRlMgICA/PwotICAtIENvaGVyZW50IEZTICA+PTEwMDAwCi0KLSogRnJlZSBpbm9kZSBtYW5hZ2VtZW50OgotICAtIE1pbml4IEZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJpdG1hcAotICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUwotICAgICAgVGhlcmUgaXMgYSBjYWNoZSBvZiBhIGNlcnRhaW4gbnVtYmVyIG9mIGZyZWUgaW5vZGVzIGluIHRoZSBzdXBlci1ibG9jay4KLSAgICAgIFdoZW4gaXQgaXMgZXhoYXVzdGVkLCBuZXcgZnJlZSBpbm9kZXMgYXJlIGZvdW5kIHVzaW5nIGEgbGluZWFyIHNlYXJjaC4KLQotKiBGcmVlIGJsb2NrIG1hbmFnZW1lbnQ6Ci0gIC0gTWluaXggRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgYml0bWFwCi0gIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCi0gICAgICBGcmVlIGJsb2NrcyBhcmUgb3JnYW5pemVkIGluIGEgImZyZWUgbGlzdCIuIE1heWJlIGEgbWlzbGVhZGluZyB0ZXJtLAotICAgICAgc2luY2UgaXQgaXMgbm90IHRydWUgdGhhdCBldmVyeSBmcmVlIGJsb2NrIGNvbnRhaW5zIGEgcG9pbnRlciB0bwotICAgICAgdGhlIG5leHQgZnJlZSBibG9jay4gUmF0aGVyLCB0aGUgZnJlZSBibG9ja3MgYXJlIG9yZ2FuaXplZCBpbiBjaHVua3MKLSAgICAgIG9mIGxpbWl0ZWQgc2l6ZSwgYW5kIGV2ZXJ5IG5vdyBhbmQgdGhlbiBhIGZyZWUgYmxvY2sgY29udGFpbnMgcG9pbnRlcnMKLSAgICAgIHRvIHRoZSBmcmVlIGJsb2NrcyBwZXJ0YWluaW5nIHRvIHRoZSBuZXh0IGNodW5rOyB0aGUgZmlyc3Qgb2YgdGhlc2UKLSAgICAgIGNvbnRhaW5zIHBvaW50ZXJzIGFuZCBzbyBvbi4gVGhlIGxpc3QgdGVybWluYXRlcyB3aXRoIGEgImJsb2NrIG51bWJlciIKLSAgICAgIDAgb24gWGVuaXggRlMgYW5kIFN5c3RlbVYgRlMsIHdpdGggYSBibG9jayB6ZXJvZWQgb3V0IG9uIENvaGVyZW50IEZTLgotCi0qIFN1cGVyLWJsb2NrIGxvY2F0aW9uOgotICAtIE1pbml4IEZTICAgICBibG9jayAxID0gYnl0ZXMgMTAyNC4uMjA0NwotICAtIFhlbml4IEZTICAgICBibG9jayAxID0gYnl0ZXMgMTAyNC4uMjA0NwotICAtIFN5c3RlbVYgRlMgICBieXRlcyA1MTIuLjEwMjMKLSAgLSBDb2hlcmVudCBGUyAgYmxvY2sgMSA9IGJ5dGVzIDUxMi4uMTAyMwotCi0qIFN1cGVyLWJsb2NrIGxheW91dDoKLSAgLSBNaW5peCBGUwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX25pbm9kZXM7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfbnpvbmVzOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2ltYXBfYmxvY2tzOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX3ptYXBfYmxvY2tzOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2ZpcnN0ZGF0YXpvbmU7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfbG9nX3pvbmVfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzX21heF9zaXplOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX21hZ2ljOwotICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2ZpcnN0ZGF0YXpvbmU7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIHNfbnpvbmVzOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2Z6b25lX2NvdW50OwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBzX2Z6b25lc1tOSUNGUkVFXTsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19maW5vZGVfY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZmlub2Rlc1tOSUNJTk9EXTsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgc19mbG9jazsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgc19pbG9jazsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgc19tb2RpZmllZDsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgc19yZG9ubHk7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIHNfdGltZTsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgICAgICAgICAgc19kaW5mb1s0XTsgLS0gU3lzdGVtViBGUyBvbmx5Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIHNfZnJlZV96b25lczsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19mcmVlX2lub2RlczsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgICAgICAgICAgc19kaW5mb1s0XTsgLS0gWGVuaXggRlMgb25seQotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2ludGVybGVhdmVfbSxzX2ludGVybGVhdmVfbjsgLS0gQ29oZXJlbnQgRlMgb25seQotICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX2ZuYW1lWzZdOwotICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX2ZwYWNrWzZdOwotICAgIHRoZW4gdGhleSBkaWZmZXIgY29uc2lkZXJhYmx5OgotICAgICAgICBYZW5peCBGUwotICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX2NsZWFuOwotICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICBzX2ZpbGxbMzcxXTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc19tYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgc190eXBlOwotICAgICAgICBTeXN0ZW1WIEZTCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHNfZmlsbFsxMiBvciAxNF07Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHNfc3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHNfbWFnaWM7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHNfdHlwZTsKLSAgICAgICAgQ29oZXJlbnQgRlMKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgc191bmlxdWU7Ci0gICAgTm90ZSB0aGF0IENvaGVyZW50IEZTIGhhcyBubyBtYWdpYy4KLQotKiBJbm9kZSBsYXlvdXQ6Ci0gIC0gTWluaXggRlMKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaV9tb2RlOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX3VpZDsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV9zaXplOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBpX3RpbWU7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgIGlfZ2lkOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICBpX25saW5rczsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaV96b25lWzcrMSsxXTsKLSAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaV9tb2RlOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX25saW5rOwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpX3VpZDsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaV9naWQ7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGlfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgaV96b25lWzMqKDEwKzErMSsxKV07Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGlfYXRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGlfbXRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGlfY3RpbWU7Ci0KLSogUmVndWxhciBmaWxlIGRhdGEgYmxvY2tzIGFyZSBvcmdhbml6ZWQgYXMKLSAgLSBNaW5peCBGUwotICAgICAgICAgICAgICAgNyBkaXJlY3QgYmxvY2tzCi0gICAgICAgICAgICAgICAxIGluZGlyZWN0IGJsb2NrIChwb2ludGVycyB0byBibG9ja3MpCi0gICAgICAgICAgICAgICAxIGRvdWJsZS1pbmRpcmVjdCBibG9jayAocG9pbnRlciB0byBwb2ludGVycyB0byBibG9ja3MpCi0gIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCi0gICAgICAgICAgICAgIDEwIGRpcmVjdCBibG9ja3MKLSAgICAgICAgICAgICAgIDEgaW5kaXJlY3QgYmxvY2sgKHBvaW50ZXJzIHRvIGJsb2NrcykKLSAgICAgICAgICAgICAgIDEgZG91YmxlLWluZGlyZWN0IGJsb2NrIChwb2ludGVyIHRvIHBvaW50ZXJzIHRvIGJsb2NrcykKLSAgICAgICAgICAgICAgIDEgdHJpcGxlLWluZGlyZWN0IGJsb2NrIChwb2ludGVyIHRvIHBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvIGJsb2NrcykKLQotKiBJbm9kZSBzaXplLCBpbm9kZXMgcGVyIGJsb2NrCi0gIC0gTWluaXggRlMgICAgICAgIDMyICAgMzIKLSAgLSBYZW5peCBGUyAgICAgICAgNjQgICAxNgotICAtIFN5c3RlbVYgRlMgICAgICA2NCAgIDE2Ci0gIC0gQ29oZXJlbnQgRlMgICAgIDY0ICAgIDgKLQotKiBEaXJlY3RvcnkgZW50cnkgb24gZGlzawotICAtIE1pbml4IEZTCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlub2RlOwotICAgICAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMTQvMzBdOwotICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUwotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBuYW1lWzE0XTsKLQotKiBEaXIgZW50cnkgc2l6ZSwgZGlyIGVudHJpZXMgcGVyIGJsb2NrCi0gIC0gTWluaXggRlMgICAgIDE2LzMyICAgIDY0LzMyCi0gIC0gWGVuaXggRlMgICAgIDE2ICAgICAgIDY0Ci0gIC0gU3lzdGVtViBGUyAgIDE2ICAgICAgIDY0Ci0gIC0gQ29oZXJlbnQgRlMgIDE2ICAgICAgIDMyCi0KLSogSG93IHRvIGltcGxlbWVudCBzeW1ib2xpYyBsaW5rcyBzdWNoIHRoYXQgdGhlIGhvc3QgZnNjayBkb2Vzbid0IHNjcmVhbToKLSAgLSBNaW5peCBGUyAgICAgbm9ybWFsCi0gIC0gWGVuaXggRlMgICAgIGtsdWRnZTogYXMgcmVndWxhciBmaWxlcyB3aXRoICBjaG1vZCAxMDAwCi0gIC0gU3lzdGVtViBGUyAgID8/Ci0gIC0gQ29oZXJlbnQgRlMgIGtsdWRnZTogYXMgcmVndWxhciBmaWxlcyB3aXRoICBjaG1vZCAxMDAwCi0KLQotTm90YXRpb246IFdlIG9mdGVuIHNwZWFrIG9mIGEgImJsb2NrIiBidXQgbWVhbiBhIHpvbmUgKHRoZSBhbGxvY2F0aW9uIHVuaXQpCi1hbmQgbm90IHRoZSBkaXNrIGRyaXZlcidzIG5vdGlvbiBvZiAiYmxvY2siLgotCi0KLUJydW5vIEhhaWJsZSAgPGhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+CmRpZmYgLS1naXQgYS9mcy9zeXN2L2Rpci5jIGIvZnMvc3lzdi9kaXIuYwppbmRleCBmMmJlZjk2Li5lYmY3MDA3IDEwMDY0NAotLS0gYS9mcy9zeXN2L2Rpci5jCisrKyBiL2ZzL3N5c3YvZGlyLmMKQEAgLTcwLDcgKzcwLDcgQEAKIHN0YXRpYyBpbnQgc3lzdl9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJdW5zaWduZWQgbG9uZyBwb3MgPSBmaWxwLT5mX3BvczsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCXVuc2lnbmVkIG9mZnNldCA9IHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJdW5zaWduZWQgbG9uZyBuID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CmRpZmYgLS1naXQgYS9mcy9zeXN2L2lub2RlLmMgYi9mcy9zeXN2L2lub2RlLmMKaW5kZXggZDYzYzVlNC4uZWFkOTg2NCAxMDA2NDQKLS0tIGEvZnMvc3lzdi9pbm9kZS5jCisrKyBiL2ZzL3N5c3YvaW5vZGUuYwpAQCAtMzAxLDEzICszMDEsMTMgQEAKIAl1bmxvY2tfa2VybmVsKCk7CiB9CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnN5c3ZfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzeXN2X2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqc3lzdl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBzeXN2X2lub2RlX2luZm8gKnNpOwogCi0Jc2kgPSBrbWVtX2NhY2hlX2FsbG9jKHN5c3ZfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJc2kgPSBrbWVtX2NhY2hlX2FsbG9jKHN5c3ZfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gJnNpLT52ZnNfaW5vZGU7CkBAIC0zMTgsNyArMzE4LDcgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoc3lzdl9pbm9kZV9jYWNoZXAsIFNZU1ZfSShpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqcCwga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqcCwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvICpzaSA9IChzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvICopcDsKIApkaWZmIC0tZ2l0IGEvZnMvdWRmL2Rpci5jIGIvZnMvdWRmL2Rpci5jCmluZGV4IDhjMjhlZmEuLjIzOTFjOTEgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9kaXIuYworKysgYi9mcy91ZGYvZGlyLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAogaW50IHVkZl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewotCXN0cnVjdCBpbm9kZSAqZGlyID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICpkaXIgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCByZXN1bHQ7CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtMjI1LDcgKzIyNSw3IEBACiAKIAkJaWYgKCBjZmkuZmlsZUNoYXJhY3RlcmlzdGljcyAmIEZJRF9GSUxFX0NIQVJfUEFSRU5UICkKIAkJewotCQkJaWJsb2NrID0gcGFyZW50X2lubyhmaWxwLT5mX2RlbnRyeSk7CisJCQlpYmxvY2sgPSBwYXJlbnRfaW5vKGZpbHAtPmZfcGF0aC5kZW50cnkpOwogCQkJZmxlbiA9IDI7CiAJCQltZW1jcHkoZm5hbWUsICIuLiIsIGZsZW4pOwogCQkJZHRfdHlwZSA9IERUX0RJUjsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9maWxlLmMgYi9mcy91ZGYvZmlsZS5jCmluZGV4IDdhZWRkNTUuLmQ4MWYyZGIgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9maWxlLmMKKysrIGIvZnMvdWRmL2ZpbGUuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiB7CiAJc3NpemVfdCByZXR2YWw7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyLCBwb3M7CiAJc2l6ZV90IGNvdW50ID0gaW9jYi0+a2lfbGVmdDsKIApkaWZmIC0tZ2l0IGEvZnMvdWRmL3N1cGVyLmMgYi9mcy91ZGYvc3VwZXIuYwppbmRleCAxYWVhNmE0Li4xZGJjMjk1IDEwMDY0NAotLS0gYS9mcy91ZGYvc3VwZXIuYworKysgYi9mcy91ZGYvc3VwZXIuYwpAQCAtMTA3LDEyICsxMDcsMTIgQEAKIAkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCiB9OwogCi1zdGF0aWMga21lbV9jYWNoZV90ICogdWRmX2lub2RlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIHVkZl9pbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnVkZl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqZWk7Ci0JZWkgPSAoc3RydWN0IHVkZl9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyh1ZGZfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZWkgPSAoc3RydWN0IHVkZl9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyh1ZGZfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVpKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTMwLDcgKzEzMCw3IEBACiAJa21lbV9jYWNoZV9mcmVlKHVkZl9pbm9kZV9jYWNoZXAsIFVERl9JKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHVkZl9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKikgZm9vOwogCkBAIC0xNzA5LDcgKzE3MDksNyBAQAogCQlzYi0+c19kaXJ0ID0gMTsKIAl9CiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c3ByaW50ZihlcnJvcl9idWYsIGZtdCwgYXJncyk7CisJdnNucHJpbnRmKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwogCXByaW50ayAoS0VSTl9DUklUICJVREYtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKIAkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOwpAQCAtMTcyMSw3ICsxNzIxLDcgQEAKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydCAoYXJncywgZm10KTsKLQl2c3ByaW50ZihlcnJvcl9idWYsIGZtdCwgYXJncyk7CisJdnNucHJpbnRmKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwogCXByaW50ayhLRVJOX1dBUk5JTkcgIlVERi1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCiAJCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyb3JfYnVmKTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9kaXIuYyBiL2ZzL3Vmcy9kaXIuYwppbmRleCA3ZjBhMGFhLi40MzNiNmY2IDEwMDY0NAotLS0gYS9mcy91ZnMvZGlyLmMKKysrIGIvZnMvdWZzL2Rpci5jCkBAIC00MjYsNyArNDI2LDcgQEAKIHVmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQogewogCWxvZmZfdCBwb3MgPSBmaWxwLT5mX3BvczsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSBwb3MgJiB+UEFHRV9DQUNIRV9NQVNLOwogCXVuc2lnbmVkIGxvbmcgbiA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3N1cGVyLmMgYi9mcy91ZnMvc3VwZXIuYwppbmRleCBlYzc5ZTMwLi44YThlOTM4IDEwMDY0NAotLS0gYS9mcy91ZnMvc3VwZXIuYworKysgYi9mcy91ZnMvc3VwZXIuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9CiAJdmFfc3RhcnQgKGFyZ3MsIGZtdCk7Ci0JdnNwcmludGYgKGVycm9yX2J1ZiwgZm10LCBhcmdzKTsKKwl2c25wcmludGYgKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CiAJdmFfZW5kIChhcmdzKTsKIAlzd2l0Y2ggKFVGU19TQihzYiktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX09ORVJST1IpIHsKIAljYXNlIFVGU19NT1VOVF9PTkVSUk9SX1BBTklDOgpAQCAtMjU1LDcgKzI1NSw3IEBACiAJCXNiLT5zX2RpcnQgPSAxOwogCX0KIAl2YV9zdGFydCAoYXJncywgZm10KTsKLQl2c3ByaW50ZiAoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZzbnByaW50ZiAoZXJyb3JfYnVmLCBzaXplb2YoZXJyb3JfYnVmKSwgZm10LCBhcmdzKTsKIAl2YV9lbmQgKGFyZ3MpOwogCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAlwcmludGsgKEtFUk5fQ1JJVCAiVUZTLWZzIHBhbmljIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCkBAIC0yNjgsNyArMjY4LDcgQEAKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydCAoYXJncywgZm10KTsKLQl2c3ByaW50ZiAoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZzbnByaW50ZiAoZXJyb3JfYnVmLCBzaXplb2YoZXJyb3JfYnVmKSwgZm10LCBhcmdzKTsKIAl2YV9lbmQgKGFyZ3MpOwogCXByaW50ayAoS0VSTl9XQVJOSU5HICJVRlMtZnMgd2FybmluZyAoZGV2aWNlICVzKTogJXM6ICVzXG4iLAogCQlzYi0+c19pZCwgZnVuY3Rpb24sIGVycm9yX2J1Zik7CkBAIC0xMjA0LDEyICsxMjA0LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKiB1ZnNfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICogdWZzX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqdWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHVmc19pbm9kZV9pbmZvICplaTsKLQllaSA9IChzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHVmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwllaSA9IChzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHVmc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCWVpLT52ZnNfaW5vZGUuaV92ZXJzaW9uID0gMTsKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAJa21lbV9jYWNoZV9mcmVlKHVmc19pbm9kZV9jYWNoZXAsIFVGU19JKGlub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHVmc19pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKikgZm9vOwogCmRpZmYgLS1naXQgYS9mcy91ZnMvdXRpbC5oIGIvZnMvdWZzL3V0aWwuaAppbmRleCAyOGZjZTZjLi43ZGQxMmJiIDEwMDY0NAotLS0gYS9mcy91ZnMvdXRpbC5oCisrKyBiL2ZzL3Vmcy91dGlsLmgKQEAgLTI5OSw3ICsyOTksNyBAQAogCiAjZGVmaW5lIHViaF9nZXRfYWRkcjE2KHViaCxiZWdpbikgXAogCSgoKF9fZnMxNiopKCh1YmgpLT5iaFsoYmVnaW4pID4+ICh1c3BpLT5zX2ZzaGlmdC0xKV0tPmJfZGF0YSkpICsgXAotCSgoYmVnaW4pICYgKHVzcGktPmZzaXplPj4xKSAtIDEpKSkKKwkoKGJlZ2luKSAmICgodXNwaS0+ZnNpemU+PjEpIC0gMSkpKQogCiAjZGVmaW5lIHViaF9nZXRfYWRkcjMyKHViaCxiZWdpbikgXAogCSgoKF9fZnMzMiopKCh1YmgpLT5iaFsoYmVnaW4pID4+ICh1c3BpLT5zX2ZzaGlmdC0yKV0tPmJfZGF0YSkpICsgXApkaWZmIC0tZ2l0IGEvZnMvdXRpbWVzLmMgYi9mcy91dGltZXMuYwppbmRleCAxYmNkODUyZi4uOTljZjJjYiAxMDA2NDQKLS0tIGEvZnMvdXRpbWVzLmMKKysrIGIvZnMvdXRpbWVzLmMKQEAgLTIsNiArMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3V0aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CmRpZmYgLS1naXQgYS9mcy92ZmF0L25hbWVpLmMgYi9mcy92ZmF0L25hbWVpLmMKaW5kZXggZWRiNzExZi4uMGFmZDc0NSAxMDA2NDQKLS0tIGEvZnMvdmZhdC9uYW1laS5jCisrKyBiL2ZzL3ZmYXQvbmFtZWkuYwpAQCAtMTAwNCw2ICsxMDA0LDcgQEAKIAkucm1kaXIJCT0gdmZhdF9ybWRpciwKIAkucmVuYW1lCQk9IHZmYXRfcmVuYW1lLAogCS5zZXRhdHRyCT0gZmF0X25vdGlmeV9jaGFuZ2UsCisJLmdldGF0dHIJPSBmYXRfZ2V0YXR0ciwKIH07CiAKIHN0YXRpYyBpbnQgdmZhdF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCmRpZmYgLS1naXQgYS9mcy94YXR0ci5jIGIvZnMveGF0dHIuYwppbmRleCAzOTU2MzUxLi4zODY0NjEzIDEwMDY0NAotLS0gYS9mcy94YXR0ci5jCisrKyBiL2ZzL3hhdHRyLmMKQEAgLTQ4LDE0ICs0OCwyMSBAQAogCQlyZXR1cm4gMDsKIAogCS8qCi0JICogVGhlIHRydXN0ZWQuKiBuYW1lc3BhY2UgY2FuIG9ubHkgYWNjZXNzZWQgYnkgYSBwcml2aWxlZ3VlZCB1c2VyLgorCSAqIFRoZSB0cnVzdGVkLiogbmFtZXNwYWNlIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5IGEgcHJpdmlsZWdlZCB1c2VyLgogCSAqLwogCWlmICghc3RybmNtcChuYW1lLCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSkKIAkJcmV0dXJuIChjYXBhYmxlKENBUF9TWVNfQURNSU4pID8gMCA6IC1FUEVSTSk7CiAKKwkvKiBJbiB1c2VyLiogbmFtZXNwYWNlLCBvbmx5IHJlZ3VsYXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGNhbiBoYXZlCisJICogZXh0ZW5kZWQgYXR0cmlidXRlcy4gRm9yIHN0aWNreSBkaXJlY3Rvcmllcywgb25seSB0aGUgb3duZXIgYW5kCisJICogcHJpdmlsZWdlZCB1c2VyIGNhbiB3cml0ZSBhdHRyaWJ1dGVzLgorCSAqLwogCWlmICghc3RybmNtcChuYW1lLCBYQVRUUl9VU0VSX1BSRUZJWCwgWEFUVFJfVVNFUl9QUkVGSVhfTEVOKSkgewotCQlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKLQkJICAgICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkpCisJCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIChpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkgJiYKKwkJICAgIChtYXNrICYgTUFZX1dSSVRFKSAmJiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJgorCQkgICAgIWNhcGFibGUoQ0FQX0ZPV05FUikpCiAJCQlyZXR1cm4gLUVQRVJNOwogCX0KIApAQCAtMjYxLDcgKzI2OCw3IEBACiAJZiA9IGZnZXQoZmQpOwogCWlmICghZikKIAkJcmV0dXJuIGVycm9yOwotCWRlbnRyeSA9IGYtPmZfZGVudHJ5OworCWRlbnRyeSA9IGYtPmZfcGF0aC5kZW50cnk7CiAJYXVkaXRfaW5vZGUoTlVMTCwgZGVudHJ5LT5kX2lub2RlKTsKIAllcnJvciA9IHNldHhhdHRyKGRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKIAlmcHV0KGYpOwpAQCAtMzQ0LDcgKzM1MSw3IEBACiAJZiA9IGZnZXQoZmQpOwogCWlmICghZikKIAkJcmV0dXJuIGVycm9yOwotCWVycm9yID0gZ2V0eGF0dHIoZi0+Zl9kZW50cnksIG5hbWUsIHZhbHVlLCBzaXplKTsKKwllcnJvciA9IGdldHhhdHRyKGYtPmZfcGF0aC5kZW50cnksIG5hbWUsIHZhbHVlLCBzaXplKTsKIAlmcHV0KGYpOwogCXJldHVybiBlcnJvcjsKIH0KQEAgLTQxNiw3ICs0MjMsNyBAQAogCWYgPSBmZ2V0KGZkKTsKIAlpZiAoIWYpCiAJCXJldHVybiBlcnJvcjsKLQllcnJvciA9IGxpc3R4YXR0cihmLT5mX2RlbnRyeSwgbGlzdCwgc2l6ZSk7CisJZXJyb3IgPSBsaXN0eGF0dHIoZi0+Zl9wYXRoLmRlbnRyeSwgbGlzdCwgc2l6ZSk7CiAJZnB1dChmKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC00NzcsNyArNDg0LDcgQEAKIAlmID0gZmdldChmZCk7CiAJaWYgKCFmKQogCQlyZXR1cm4gZXJyb3I7Ci0JZGVudHJ5ID0gZi0+Zl9kZW50cnk7CisJZGVudHJ5ID0gZi0+Zl9wYXRoLmRlbnRyeTsKIAlhdWRpdF9pbm9kZShOVUxMLCBkZW50cnktPmRfaW5vZGUpOwogCWVycm9yID0gcmVtb3ZleGF0dHIoZGVudHJ5LCBuYW1lKTsKIAlmcHV0KGYpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNiBiL2ZzL3hmcy9NYWtlZmlsZS1saW51eC0yLjYKaW5kZXggMjkxOTQ4ZC4uYjQ5OTg5YiAxMDA2NDQKLS0tIGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNgorKysgYi9mcy94ZnMvTWFrZWZpbGUtbGludXgtMi42CkBAIC0yMSwyMiArMjEsNyBAQAogWEZTX0xJTlVYIDo9IGxpbnV4LTIuNgogCiBpZmVxICgkKENPTkZJR19YRlNfREVCVUcpLHkpCi0JRVhUUkFfQ0ZMQUdTICs9IC1nIC1EU1RBVElDPSIiIC1EREVCVUcKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQlVGX0xPQ0tfVFJBQ0tJTkcKLWVuZGlmCi1pZmVxICgkKENPTkZJR19YRlNfVFJBQ0UpLHkpCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FMTE9DX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FUVFJfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQkxJX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JNQVBfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQk1CVF9UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19ESVIyX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0RRVU9UX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0lMT0NLX1RSQUNFCi0JRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0xPR19UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19SV19UUkFDRQotCUVYVFJBX0NGTEFHUyArPSAtRFhGU19CVUZfVFJBQ0UKLQlFWFRSQV9DRkxBR1MgKz0gLURYRlNfVk5PREVfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLWcKIGVuZGlmCiAKIG9iai0kKENPTkZJR19YRlNfRlMpCQkrPSB4ZnMubwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmMgYi9mcy94ZnMvbGludXgtMi42L2ttZW0uYwppbmRleCBkNTk3Mzc1Li4wMDRiYWY2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L2ttZW0uYworKysgYi9mcy94ZnMvbGludXgtMi42L2ttZW0uYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlICJ0aW1lLmgiCiAjaW5jbHVkZSAia21lbS5oIgogCkBAIC01Myw3ICs1NCw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIlhGUzogcG9zc2libGUgbWVtb3J5IGFsbG9jYXRpb24gIgogCQkJCQkiZGVhZGxvY2sgaW4gJXMgKG1vZGU6MHgleClcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgbGZsYWdzKTsKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAl9IHdoaWxlICgxKTsKIH0KIApAQCAtMTMxLDcgKzEzMiw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIlhGUzogcG9zc2libGUgbWVtb3J5IGFsbG9jYXRpb24gIgogCQkJCQkiZGVhZGxvY2sgaW4gJXMgKG1vZGU6MHgleClcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgbGZsYWdzKTsKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAl9IHdoaWxlICgxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCmluZGV4IDA5MzYwY2YuLmI1NmViNzUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKQEAgLTE0OSw5ICsxNDksMTAgQEAKICAqLwogU1RBVElDIHZvaWQKIHhmc19lbmRfYmlvX2RlbGFsbG9jKAotCXZvaWQJCQkqZGF0YSkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJKndvcmspCiB7Ci0JeGZzX2lvZW5kX3QJCSppb2VuZCA9IGRhdGE7CisJeGZzX2lvZW5kX3QJCSppb2VuZCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCB4ZnNfaW9lbmRfdCwgaW9fd29yayk7CiAKIAl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CiB9CkBAIC0xNjEsOSArMTYyLDEwIEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfZW5kX2Jpb193cml0dGVuKAotCXZvaWQJCQkqZGF0YSkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJKndvcmspCiB7Ci0JeGZzX2lvZW5kX3QJCSppb2VuZCA9IGRhdGE7CisJeGZzX2lvZW5kX3QJCSppb2VuZCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCB4ZnNfaW9lbmRfdCwgaW9fd29yayk7CiAKIAl4ZnNfZGVzdHJveV9pb2VuZChpb2VuZCk7CiB9CkBAIC0xNzYsOSArMTc4LDEwIEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfZW5kX2Jpb191bndyaXR0ZW4oCi0Jdm9pZAkJCSpkYXRhKQorCXN0cnVjdCB3b3JrX3N0cnVjdAkqd29yaykKIHsKLQl4ZnNfaW9lbmRfdAkJKmlvZW5kID0gZGF0YTsKKwl4ZnNfaW9lbmRfdAkJKmlvZW5kID0KKwkJY29udGFpbmVyX29mKHdvcmssIHhmc19pb2VuZF90LCBpb193b3JrKTsKIAliaHZfdm5vZGVfdAkJKnZwID0gaW9lbmQtPmlvX3Zub2RlOwogCXhmc19vZmZfdAkJb2Zmc2V0ID0gaW9lbmQtPmlvX29mZnNldDsKIAlzaXplX3QJCQlzaXplID0gaW9lbmQtPmlvX3NpemU7CkBAIC0yMjAsMTEgKzIyMywxMSBAQAogCWlvZW5kLT5pb19zaXplID0gMDsKIAogCWlmICh0eXBlID09IElPTUFQX1VOV1JJVFRFTikKLQkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fdW53cml0dGVuLCBpb2VuZCk7CisJCUlOSVRfV09SSygmaW9lbmQtPmlvX3dvcmssIHhmc19lbmRfYmlvX3Vud3JpdHRlbik7CiAJZWxzZSBpZiAodHlwZSA9PSBJT01BUF9ERUxBWSkKLQkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fZGVsYWxsb2MsIGlvZW5kKTsKKwkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fZGVsYWxsb2MpOwogCWVsc2UKLQkJSU5JVF9XT1JLKCZpb2VuZC0+aW9fd29yaywgeGZzX2VuZF9iaW9fd3JpdHRlbiwgaW9lbmQpOworCQlJTklUX1dPUksoJmlvZW5kLT5pb193b3JrLCB4ZnNfZW5kX2Jpb193cml0dGVuKTsKIAogCXJldHVybiBpb2VuZDsKIH0KQEAgLTE0MDMsNyArMTQwNiw3IEBACiAJCQl4ZnNfZW5kX2lvX2RpcmVjdCk7CiAJfQogCi0JaWYgKHVubGlrZWx5KHJldCA8PSAwICYmIGlvY2ItPnByaXZhdGUpKQorCWlmICh1bmxpa2VseShyZXQgIT0gLUVJT0NCUVVFVUVEICYmIGlvY2ItPnByaXZhdGUpKQogCQl4ZnNfZGVzdHJveV9pb2VuZChpb2NiLT5wcml2YXRlKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCA5YmJhZGFmLi40ZmIwMWZmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMTUsNiArMTUsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCisjaW5jbHVkZSAieGZzLmgiCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zMCw3ICszMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+Ci0jaW5jbHVkZSAieGZzX2xpbnV4LmgiCisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKIFNUQVRJQyBrbWVtX3pvbmVfdCAqeGZzX2J1Zl96b25lOwogU1RBVElDIGttZW1fc2hha2VyX3QgeGZzX2J1Zl9zaGFrZTsKQEAgLTM5NSw3ICszOTcsNyBAQAogCiAJCQlYRlNfU1RBVFNfSU5DKHhiX3BhZ2VfcmV0cmllcyk7CiAJCQl4ZnNidWZkX3dha2V1cCgwLCBnZnBfbWFzayk7Ci0JCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CisJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KIApAQCAtOTkzLDkgKzk5NSwxMCBAQAogCiBTVEFUSUMgdm9pZAogeGZzX2J1Zl9pb2RvbmVfd29yaygKLQl2b2lkCQkJKnYpCisJc3RydWN0IHdvcmtfc3RydWN0CSp3b3JrKQogewotCXhmc19idWZfdAkJKmJwID0gKHhmc19idWZfdCAqKXY7CisJeGZzX2J1Zl90CQkqYnAgPQorCQljb250YWluZXJfb2Yod29yaywgeGZzX2J1Zl90LCBiX2lvZG9uZV93b3JrKTsKIAogCWlmIChicC0+Yl9pb2RvbmUpCiAJCSgqKGJwLT5iX2lvZG9uZSkpKGJwKTsKQEAgLTEwMTYsMTAgKzEwMTksMTAgQEAKIAogCWlmICgoYnAtPmJfaW9kb25lKSB8fCAoYnAtPmJfZmxhZ3MgJiBYQkZfQVNZTkMpKSB7CiAJCWlmIChzY2hlZHVsZSkgewotCQkJSU5JVF9XT1JLKCZicC0+Yl9pb2RvbmVfd29yaywgeGZzX2J1Zl9pb2RvbmVfd29yaywgYnApOworCQkJSU5JVF9XT1JLKCZicC0+Yl9pb2RvbmVfd29yaywgeGZzX2J1Zl9pb2RvbmVfd29yayk7CiAJCQlxdWV1ZV93b3JrKHhmc2xvZ2Rfd29ya3F1ZXVlLCAmYnAtPmJfaW9kb25lX3dvcmspOwogCQl9IGVsc2UgewotCQkJeGZzX2J1Zl9pb2RvbmVfd29yayhicCk7CisJCQl4ZnNfYnVmX2lvZG9uZV93b3JrKCZicC0+Yl9pb2RvbmVfd29yayk7CiAJCX0KIAl9IGVsc2UgewogCQl1cCgmYnAtPmJfaW9kb25lc2VtYSk7CkBAIC0xNDA1LDcgKzE0MDgsNyBAQAogCWJ0cC0+YnRfaGFzaHNoaWZ0ID0gZXh0ZXJuYWwgPyAzIDogODsJLyogOCBvciAyNTYgYnVja2V0cyAqLwogCWJ0cC0+YnRfaGFzaG1hc2sgPSAoMSA8PCBidHAtPmJ0X2hhc2hzaGlmdCkgLSAxOwogCWJ0cC0+YnRfaGFzaCA9IGttZW1femFsbG9jKCgxIDw8IGJ0cC0+YnRfaGFzaHNoaWZ0KSAqCi0JCQkJCXNpemVvZih4ZnNfYnVmaGFzaF90KSwgS01fU0xFRVApOworCQkJCQlzaXplb2YoeGZzX2J1Zmhhc2hfdCksIEtNX1NMRUVQIHwgS01fTEFSR0UpOwogCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBidHAtPmJ0X2hhc2hzaGlmdCk7IGkrKykgewogCQlzcGluX2xvY2tfaW5pdCgmYnRwLT5idF9oYXNoW2ldLmJoX2xvY2spOwogCQlJTklUX0xJU1RfSEVBRCgmYnRwLT5idF9oYXNoW2ldLmJoX2xpc3QpOwpAQCAtMTgyNCwxMSArMTgyNywxMSBAQAogCWlmICgheGZzX2J1Zl96b25lKQogCQlnb3RvIG91dF9mcmVlX3RyYWNlX2J1ZjsKIAotCXhmc2xvZ2Rfd29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgieGZzbG9nZCIpOworCXhmc2xvZ2Rfd29ya3F1ZXVlID0gY3JlYXRlX2ZyZWV6ZWFibGVfd29ya3F1ZXVlKCJ4ZnNsb2dkIik7CiAJaWYgKCF4ZnNsb2dkX3dvcmtxdWV1ZSkKIAkJZ290byBvdXRfZnJlZV9idWZfem9uZTsKIAotCXhmc2RhdGFkX3dvcmtxdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoInhmc2RhdGFkIik7CisJeGZzZGF0YWRfd29ya3F1ZXVlID0gY3JlYXRlX2ZyZWV6ZWFibGVfd29ya3F1ZXVlKCJ4ZnNkYXRhZCIpOwogCWlmICgheGZzZGF0YWRfd29ya3F1ZXVlKQogCQlnb3RvIG91dF9kZXN0cm95X3hmc2xvZ2Rfd29ya3F1ZXVlOwogCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19kbWFwaV9wcml2LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19kbWFwaV9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiMGIxNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2RtYXBpX3ByaXYuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2lmbmRlZiBfX1hGU19ETUFQSV9QUklWX0hfXworI2RlZmluZSBfX1hGU19ETUFQSV9QUklWX0hfXworCisvKgorICoJQmFzZWQgb24gSU9fSVNESVJFQ1QsIGRlY2lkZSB3aGljaCBpXyBmbGFnIGlzIHNldC4KKyAqLworI2RlZmluZSBETV9TRU1fRkxBR19SRChpb2ZsYWdzKSAoKChpb2ZsYWdzKSAmIElPX0lTRElSRUNUKSA/IFwKKwkJCSAgICAgIERNX0ZMQUdTX0lNVVggOiAwKQorI2RlZmluZSBETV9TRU1fRkxBR19XUgkoRE1fRkxBR1NfSUFMTE9DU0VNX1dSIHwgRE1fRkxBR1NfSU1VWCkKKworI2VuZGlmIC8qX19YRlNfRE1BUElfUFJJVl9IX18qLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCmluZGV4IGQ5M2Q4ZGQuLmQyNmY1Y2QgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAlsb2ZmX3QJCQlwb3MpCiB7CiAJc3RydWN0IGZpbGUJCSpmaWxlID0gaW9jYi0+a2lfZmlscDsKLQliaHZfdm5vZGVfdAkJKnZwID0gdm5fZnJvbV9pbm9kZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJYmh2X3Zub2RlX3QJCSp2cCA9IHZuX2Zyb21faW5vZGUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAKIAlCVUdfT04oaW9jYi0+a2lfcG9zICE9IHBvcyk7CiAJaWYgKHVubGlrZWx5KGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpCkBAIC0xMzEsNyArMTMxLDcgQEAKIAlyZWFkX2FjdG9yX3QJCWFjdG9yLAogCXZvaWQJCQkqdGFyZ2V0KQogewotCXJldHVybiBiaHZfdm9wX3NlbmRmaWxlKHZuX2Zyb21faW5vZGUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLAorCXJldHVybiBiaHZfdm9wX3NlbmRmaWxlKHZuX2Zyb21faW5vZGUoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSksCiAJCQkJZmlscCwgcG9zLCAwLCBjb3VudCwgYWN0b3IsIHRhcmdldCwgTlVMTCk7CiB9CiAKQEAgLTE0Myw3ICsxNDMsNyBAQAogCXJlYWRfYWN0b3JfdAkJYWN0b3IsCiAJdm9pZAkJCSp0YXJnZXQpCiB7Ci0JcmV0dXJuIGJodl92b3Bfc2VuZGZpbGUodm5fZnJvbV9pbm9kZShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSksCisJcmV0dXJuIGJodl92b3Bfc2VuZGZpbGUodm5fZnJvbV9pbm9kZShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSwKIAkJCQlmaWxwLCBwb3MsIElPX0lOVklTLCBjb3VudCwgYWN0b3IsIHRhcmdldCwgTlVMTCk7CiB9CiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogCXNpemVfdAkJCWxlbiwKIAl1bnNpZ25lZCBpbnQJCWZsYWdzKQogewotCXJldHVybiBiaHZfdm9wX3NwbGljZV9yZWFkKHZuX2Zyb21faW5vZGUoaW5maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSksCisJcmV0dXJuIGJodl92b3Bfc3BsaWNlX3JlYWQodm5fZnJvbV9pbm9kZShpbmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLAogCQkJCSAgIGluZmlscCwgcHBvcywgcGlwZSwgbGVuLCBmbGFncywgMCwgTlVMTCk7CiB9CiAKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCXNpemVfdAkJCWxlbiwKIAl1bnNpZ25lZCBpbnQJCWZsYWdzKQogewotCXJldHVybiBiaHZfdm9wX3NwbGljZV9yZWFkKHZuX2Zyb21faW5vZGUoaW5maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSksCisJcmV0dXJuIGJodl92b3Bfc3BsaWNlX3JlYWQodm5fZnJvbV9pbm9kZShpbmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLAogCQkJCSAgIGluZmlscCwgcHBvcywgcGlwZSwgbGVuLCBmbGFncywgSU9fSU5WSVMsCiAJCQkJICAgTlVMTCk7CiB9CkBAIC0xODAsNyArMTgwLDcgQEAKIAlzaXplX3QJCQlsZW4sCiAJdW5zaWduZWQgaW50CQlmbGFncykKIHsKLQlyZXR1cm4gYmh2X3ZvcF9zcGxpY2Vfd3JpdGUodm5fZnJvbV9pbm9kZShvdXRmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSksCisJcmV0dXJuIGJodl92b3Bfc3BsaWNlX3dyaXRlKHZuX2Zyb21faW5vZGUob3V0ZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSksCiAJCQkJICAgIHBpcGUsIG91dGZpbHAsIHBwb3MsIGxlbiwgZmxhZ3MsIDAsIE5VTEwpOwogfQogCkBAIC0xOTIsNyArMTkyLDcgQEAKIAlzaXplX3QJCQlsZW4sCiAJdW5zaWduZWQgaW50CQlmbGFncykKIHsKLQlyZXR1cm4gYmh2X3ZvcF9zcGxpY2Vfd3JpdGUodm5fZnJvbV9pbm9kZShvdXRmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSksCisJcmV0dXJuIGJodl92b3Bfc3BsaWNlX3dyaXRlKHZuX2Zyb21faW5vZGUob3V0ZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSksCiAJCQkJICAgIHBpcGUsIG91dGZpbHAsIHBwb3MsIGxlbiwgZmxhZ3MsIElPX0lOVklTLAogCQkJCSAgICBOVUxMKTsKIH0KQEAgLTIxMiw3ICsyMTIsNyBAQAogCXN0cnVjdCBmaWxlCSpmaWxwLAogCWZsX293bmVyX3QJaWQpCiB7Ci0JcmV0dXJuIC1iaHZfdm9wX2Nsb3NlKHZuX2Zyb21faW5vZGUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLCAwLAorCXJldHVybiAtYmh2X3ZvcF9jbG9zZSh2bl9mcm9tX2lub2RlKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLCAwLAogCQkJCWZpbGVfY291bnQoZmlscCkgPiAxID8gTF9GQUxTRSA6IExfVFJVRSwgTlVMTCk7CiB9CiAKQEAgLTI1MSw3ICsyNTEsNyBAQAogCXVuc2lnbmVkIGxvbmcJCWFkZHJlc3MsCiAJaW50CQkJKnR5cGUpCiB7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGFyZWEtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBhcmVhLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWJodl92bm9kZV90CSp2cCA9IHZuX2Zyb21faW5vZGUoaW5vZGUpOwogCiAJQVNTRVJUX0FMV0FZUyh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19ETUkpOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJZmlsbGRpcl90CWZpbGxkaXIpCiB7CiAJaW50CQllcnJvciA9IDA7Ci0JYmh2X3Zub2RlX3QJKnZwID0gdm5fZnJvbV9pbm9kZShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJYmh2X3Zub2RlX3QJKnZwID0gdm5fZnJvbV9pbm9kZShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAl1aW9fdAkJdWlvOwogCWlvdmVjX3QJCWlvdjsKIAlpbnQJCWVvZiA9IDA7CkBAIC0zNDUsNyArMzQ1LDcgQEAKIAl2bWEtPnZtX29wcyA9ICZ4ZnNfZmlsZV92bV9vcHM7CiAKICNpZmRlZiBDT05GSUdfWEZTX0RNQVBJCi0JaWYgKHZuX2Zyb21faW5vZGUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX0RNSSkKKwlpZiAodm5fZnJvbV9pbm9kZShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19ETUkpCiAJCXZtYS0+dm1fb3BzID0gJnhmc19kbWFwaV9maWxlX3ZtX29wczsKICNlbmRpZiAvKiBDT05GSUdfWEZTX0RNQVBJICovCiAKQEAgLTM2MCw3ICszNjAsNyBAQAogCXVuc2lnbmVkIGxvbmcJcCkKIHsKIAlpbnQJCWVycm9yOwotCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAliaHZfdm5vZGVfdAkqdnAgPSB2bl9mcm9tX2lub2RlKGlub2RlKTsKIAogCWVycm9yID0gYmh2X3ZvcF9pb2N0bCh2cCwgaW5vZGUsIGZpbHAsIDAsIGNtZCwgKHZvaWQgX191c2VyICopcCk7CkBAIC0zODIsNyArMzgyLDcgQEAKIAl1bnNpZ25lZCBsb25nCXApCiB7CiAJaW50CQllcnJvcjsKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJYmh2X3Zub2RlX3QJKnZwID0gdm5fZnJvbV9pbm9kZShpbm9kZSk7CiAKIAllcnJvciA9IGJodl92b3BfaW9jdGwodnAsIGlub2RlLCBmaWxwLCBJT19JTlZJUywgY21kLCAodm9pZCBfX3VzZXIgKilwKTsKQEAgLTQwNCw3ICs0MDQsNyBAQAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCXVuc2lnbmVkIGludAluZXdmbGFncykKIHsKLQliaHZfdm5vZGVfdAkqdnAgPSB2bl9mcm9tX2lub2RlKHZtYS0+dm1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWJodl92bm9kZV90CSp2cCA9IHZuX2Zyb21faW5vZGUodm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQJCWVycm9yID0gMDsKIAogCWlmICh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19ETUkpIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCmluZGV4IGE3NGY4NTQuLmYwMTFjOWMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYwpAQCAtMTA3LDkgKzEwNyw5IEBACiAJCWlmICghZmlsZSkKIAkJICAgIHJldHVybiAtRUJBREY7CiAKLQkJQVNTRVJUKGZpbGUtPmZfZGVudHJ5KTsKLQkJQVNTRVJUKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQkJaW5vZGUgPSBpZ3JhYihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCUFTU0VSVChmaWxlLT5mX3BhdGguZGVudHJ5KTsKKwkJQVNTRVJUKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCQlpbm9kZSA9IGlncmFiKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCQlmcHV0KGZpbGUpOwogCQlicmVhazsKIAl9CkBAIC0zMzMsMTYgKzMzMywxOSBAQAogCX0KIAogCS8qIEVuc3VyZSB1bW91bnQgcmV0dXJucyBFQlVTWSBvbiB1bW91bnRzIHdoaWxlIHRoaXMgZmlsZSBpcyBvcGVuLiAqLwotCW1udGdldChwYXJmaWxwLT5mX3Zmc21udCk7CisJbW50Z2V0KHBhcmZpbHAtPmZfcGF0aC5tbnQpOwogCiAJLyogQ3JlYXRlIGZpbGUgcG9pbnRlci4gKi8KLQlmaWxwID0gZGVudHJ5X29wZW4oZGVudHJ5LCBwYXJmaWxwLT5mX3Zmc21udCwgaHJlcS5vZmxhZ3MpOworCWZpbHAgPSBkZW50cnlfb3BlbihkZW50cnksIHBhcmZpbHAtPmZfcGF0aC5tbnQsIGhyZXEub2ZsYWdzKTsKIAlpZiAoSVNfRVJSKGZpbHApKSB7CiAJCXB1dF91bnVzZWRfZmQobmV3X2ZkKTsKIAkJcmV0dXJuIC1YRlNfRVJST1IoLVBUUl9FUlIoZmlscCkpOwogCX0KLQlpZiAoaW5vZGUtPmlfbW9kZSAmIFNfSUZSRUcpCisJaWYgKGlub2RlLT5pX21vZGUgJiBTX0lGUkVHKSB7CisJCS8qIGludmlzaWJsZSBvcGVyYXRpb24gc2hvdWxkIG5vdCBjaGFuZ2UgYXRpbWUgKi8KKwkJZmlscC0+Zl9mbGFncyB8PSBPX05PQVRJTUU7CiAJCWZpbHAtPmZfb3AgPSAmeGZzX2ludmlzX2ZpbGVfb3BlcmF0aW9uczsKKwl9CiAKIAlmZF9pbnN0YWxsKG5ld19mZCwgZmlscCk7CiAJcmV0dXJuIG5ld19mZDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYwppbmRleCAyNzBkYjBmLi5iODNjZWJjIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAl1bnNpZ25lZAljbWQsCiAJdW5zaWduZWQgbG9uZwlhcmcpCiB7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWJodl92bm9kZV90CSp2cCA9IHZuX2Zyb21faW5vZGUoaW5vZGUpOwogCWludAkJZXJyb3I7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKaW5kZXggZmE4NDJmMS4uNjVlNzliNCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKQEAgLTgwNSw3ICs4MDUsNyBAQAogCSAgICAgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpIHsKIAkJZXJyb3IgPSB4ZnNfd3JpdGVfY2xlYXJfc2V0dWlkKHhpcCk7CiAJCWlmIChsaWtlbHkoIWVycm9yKSkKLQkJCWVycm9yID0gLXJlbW92ZV9zdWlkKGZpbGUtPmZfZGVudHJ5KTsKKwkJCWVycm9yID0gLXJlbW92ZV9zdWlkKGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7CiAJCQl4ZnNfaXVubG9jayh4aXAsIGlvbG9jayk7CiAJCQlnb3RvIG91dF91bmxvY2tfbXV0ZXg7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAzOGM0ZDEyLi5iOTMyNjViIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogU1RBVElDIHN0cnVjdCBxdW90YWN0bF9vcHMgeGZzX3F1b3RhY3RsX29wZXJhdGlvbnM7CiBTVEFUSUMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgeGZzX3N1cGVyX29wZXJhdGlvbnM7CkBAIC0yMjcsOSArMjI4LDcgQEAKIAkJeGZzX3JldmFsaWRhdGVfaW5vZGUoWEZTX0JIVlRPTShiZHApLCB2cCwgaXApOwogCQl4ZnNfc2V0X2lub2Rlb3BzKGlub2RlKTsKIAotCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQlpcC0+aV9mbGFncyAmPSB+WEZTX0lORVc7Ci0JCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwkJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lORVcpOwogCQliYXJyaWVyKCk7CiAKIAkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwppbmRleCBjNzVmNjgzLi40MzYzNTEyIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKQEAgLTE1LDExICsxNSw5IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KKyNpbmNsdWRlIDx4ZnMuaD4KICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInNwaW4uaCIKLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKIHN0YXRpYyBjaGFyCQltZXNzYWdlWzI1Nl07CS8qIGtlZXAgaXQgb2ZmIHRoZSBzdGFjayAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyh4ZnNfZXJyX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3N1cHBvcnQvbW92ZS5jIGIvZnMveGZzL3N1cHBvcnQvbW92ZS5jCmluZGV4IGNhZWZhMTcuLmFjODYxN2MgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L21vdmUuYworKysgYi9mcy94ZnMvc3VwcG9ydC9tb3ZlLmMKQEAgLTIyLDcgKzIyLDcgQEAKICAqIGFzIHdlIGdvLgogICovCiBpbnQKLXVpb19yZWFkKGNhZGRyX3Qgc3JjLCBzaXplX3QgbGVuLCBzdHJ1Y3QgdWlvICp1aW8pCit4ZnNfdWlvX3JlYWQoY2FkZHJfdCBzcmMsIHNpemVfdCBsZW4sIHN0cnVjdCB1aW8gKnVpbykKIHsKIAlzaXplX3QJY291bnQ7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L21vdmUuaCBiL2ZzL3hmcy9zdXBwb3J0L21vdmUuaAppbmRleCA5N2EyNDk4Li45Nzc4NzljIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9tb3ZlLmgKKysrIGIvZnMveGZzL3N1cHBvcnQvbW92ZS5oCkBAIC02NSw2ICs2NSw2IEBACiB0eXBlZGVmIHN0cnVjdCB1aW8gdWlvX3Q7CiB0eXBlZGVmIHN0cnVjdCBpb3ZlYyBpb3ZlY190OwogCi1leHRlcm4gaW50CXVpb19yZWFkIChjYWRkcl90LCBzaXplX3QsIHVpb190ICopOworZXh0ZXJuIGludAl4ZnNfdWlvX3JlYWQgKGNhZGRyX3QsIHNpemVfdCwgdWlvX3QgKik7CiAKICNlbmRpZiAgLyogX19YRlNfU1VQUE9SVF9NT1ZFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmcy5oIGIvZnMveGZzL3hmcy5oCmluZGV4IDFhNDhkYmIuLmJmMGExMjAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnMuaAorKysgYi9mcy94ZnMveGZzLmgKQEAgLTE3LDUgKzE3LDI4IEBACiAgKi8KICNpZm5kZWYgX19YRlNfSF9fCiAjZGVmaW5lIF9fWEZTX0hfXworCisjaWZkZWYgQ09ORklHX1hGU19ERUJVRworI2RlZmluZSBTVEFUSUMKKyNkZWZpbmUgREVCVUcgMQorI2RlZmluZSBYRlNfQlVGX0xPQ0tfVFJBQ0tJTkcgMQorLyogI2RlZmluZSBRVU9UQURFQlVHIDEgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hGU19UUkFDRQorI2RlZmluZSBYRlNfQUxMT0NfVFJBQ0UgMQorI2RlZmluZSBYRlNfQVRUUl9UUkFDRSAxCisjZGVmaW5lIFhGU19CTElfVFJBQ0UgMQorI2RlZmluZSBYRlNfQk1BUF9UUkFDRSAxCisjZGVmaW5lIFhGU19CTUJUX1RSQUNFIDEKKyNkZWZpbmUgWEZTX0RJUjJfVFJBQ0UgMQorI2RlZmluZSBYRlNfRFFVT1RfVFJBQ0UgMQorI2RlZmluZSBYRlNfSUxPQ0tfVFJBQ0UgMQorI2RlZmluZSBYRlNfTE9HX1RSQUNFIDEKKyNkZWZpbmUgWEZTX1JXX1RSQUNFIDEKKyNkZWZpbmUgWEZTX0JVRl9UUkFDRSAxCisjZGVmaW5lIFhGU19WTk9ERV9UUkFDRSAxCisjZW5kaWYKKwogI2luY2x1ZGUgPGxpbnV4LTIuNi94ZnNfbGludXguaD4KICNlbmRpZgkvKiBfX1hGU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5jIGIvZnMveGZzL3hmc19ibWFwLmMKaW5kZXggNWIwNTBjMC4uNDk4YWQ1MGQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcC5jCisrKyBiL2ZzL3hmcy94ZnNfYm1hcC5jCkBAIC0xMTcxLDYgKzExNzEsOCBAQAogCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiMCIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOwogCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CiAJCXJbMF0gPSAqbmV3OworCQlyWzFdLmJyX3N0YXRlID0gUFJFVi5icl9zdGF0ZTsKKwkJclsxXS5icl9zdGFydGJsb2NrID0gMDsKIAkJclsxXS5icl9zdGFydG9mZiA9IG5ld19lbmRvZmY7CiAJCXRlbXAyID0gUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ld19lbmRvZmY7CiAJCXJbMV0uYnJfYmxvY2tjb3VudCA9IHRlbXAyOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kZnJhZy5jIGIvZnMveGZzL3hmc19kZnJhZy5jCmluZGV4IDgwNTYyYjYuLjUwZDBmYWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGZyYWcuYworKysgYi9mcy94ZnMveGZzX2RmcmFnLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAogCS8qIFB1bGwgaW5mb3JtYXRpb24gZm9yIHRoZSB0YXJnZXQgZmQgKi8KIAlpZiAoKChmcCA9IGZnZXQoKGludClzeHAtPnN4X2ZkdGFyZ2V0KSkgPT0gTlVMTCkgfHwKLQkgICAgKCh2cCA9IHZuX2Zyb21faW5vZGUoZnAtPmZfZGVudHJ5LT5kX2lub2RlKSkgPT0gTlVMTCkpICB7CisJICAgICgodnAgPSB2bl9mcm9tX2lub2RlKGZwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSkgPT0gTlVMTCkpICB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCWdvdG8gZXJyb3IwOwogCX0KQEAgLTgzLDcgKzgzLDcgQEAKIAl9CiAKIAlpZiAoKCh0ZnAgPSBmZ2V0KChpbnQpc3hwLT5zeF9mZHRtcCkpID09IE5VTEwpIHx8Ci0JICAgICgodHZwID0gdm5fZnJvbV9pbm9kZSh0ZnAtPmZfZGVudHJ5LT5kX2lub2RlKSkgPT0gTlVMTCkpIHsKKwkgICAgKCh0dnAgPSB2bl9mcm9tX2lub2RlKHRmcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpID09IE5VTEwpKSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCWdvdG8gZXJyb3IwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMi5jIGIvZnMveGZzL3hmc19kaXIyLmMKaW5kZXggOGVkYmUxYS4uOGU4ZTUyNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyLmMKKysrIGIvZnMveGZzL3hmc19kaXIyLmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogCWlkYnAtPmRfb2ZmID0gcGEtPmNvb2s7CiAJaWRicC0+ZF9uYW1lW25hbWVsZW5dID0gJ1wwJzsKIAltZW1jcHkoaWRicC0+ZF9uYW1lLCBwYS0+bmFtZSwgbmFtZWxlbik7Ci0JcnZhbCA9IHVpb19yZWFkKChjYWRkcl90KWlkYnAsIHJlY2xlbiwgdWlvKTsKKwlydmFsID0geGZzX3Vpb19yZWFkKChjYWRkcl90KWlkYnAsIHJlY2xlbiwgdWlvKTsKIAlwYS0+ZG9uZSA9IChydmFsID09IDApOwogCXJldHVybiBydmFsOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kbWFwaS5oIGIvZnMveGZzL3hmc19kbWFwaS5oCmluZGV4IDRlNzg2NWEuLmFkYzNkMjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZG1hcGkuaAorKysgYi9mcy94ZnMveGZzX2RtYXBpLmgKQEAgLTE1NywyNyArMTU3LDkgQEAKICNkZWZpbmUgRE1fRkxBR1NfSUFMTE9DU0VNX1dSCTB4MDIwCS8qIHRocmVhZCBob2xkcyBpX2FsbG9jX3NlbSB3ciAqLwogCiAvKgotICoJQmFzZWQgb24gSU9fSVNESVJFQ1QsIGRlY2lkZSB3aGljaCBpXyBmbGFnIGlzIHNldC4KKyAqCVB1bGwgaW4gcGxhdGZvcm0gc3BlY2lmaWMgZXZlbnQgZmxhZ3MgZGVmaW5lcwogICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDApCi0jZGVmaW5lIERNX1NFTV9GTEFHX1JEKGlvZmxhZ3MpICgoKGlvZmxhZ3MpICYgSU9fSVNESVJFQ1QpID8gXAotCQkJICAgICAgRE1fRkxBR1NfSU1VWCA6IDApCi0jZGVmaW5lIERNX1NFTV9GTEFHX1dSCShETV9GTEFHU19JQUxMT0NTRU1fV1IgfCBETV9GTEFHU19JTVVYKQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKSAmJiBcCi0gICAgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMjIpKQotI2RlZmluZSBETV9TRU1fRkxBR19SRChpb2ZsYWdzKSAoKChpb2ZsYWdzKSAmIElPX0lTRElSRUNUKSA/IFwKLQkJCSAgICAgIERNX0ZMQUdTX0lBTExPQ1NFTV9SRCA6IERNX0ZMQUdTX0lNVVgpCi0jZGVmaW5lIERNX1NFTV9GTEFHX1dSCShETV9GTEFHU19JQUxMT0NTRU1fV1IgfCBETV9GTEFHU19JTVVYKQotI2VuZGlmCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw0LDIxKQotI2RlZmluZSBETV9TRU1fRkxBR19SRChpb2ZsYWdzKSAoKChpb2ZsYWdzKSAmIElPX0lTRElSRUNUKSA/IFwKLQkJCSAgICAgIDAgOiBETV9GTEFHU19JTVVYKQotI2RlZmluZSBETV9TRU1fRkxBR19XUgkoRE1fRkxBR1NfSU1VWCkKLSNlbmRpZgotCisjaW5jbHVkZSAieGZzX2RtYXBpX3ByaXYuaCIKIAogLyoKICAqCU1hY3JvcyB0byB0dXJuIGNhbGxlciBzcGVjaWZpZWQgZGVsYXkvYmxvY2sgZmxhZ3MgaW50bwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pZ2V0LmMgYi9mcy94ZnMveGZzX2lnZXQuYwppbmRleCBiNzNkMjE2Li5jMWM4OWRhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lnZXQuYworKysgYi9mcy94ZnMveGZzX2lnZXQuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJCQkgKiBJZiBJTkVXIGlzIHNldCB0aGlzIGlub2RlIGlzIGJlaW5nIHNldCB1cAogCQkJICogd2UgbmVlZCB0byBwYXVzZSBhbmQgdHJ5IGFnYWluLgogCQkJICovCi0JCQlpZiAoaXAtPmlfZmxhZ3MgJiBYRlNfSU5FVykgeworCQkJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lORVcpKSB7CiAJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKIAkJCQlkZWxheSgxKTsKIAkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKQEAgLTIzMCwyMiArMjMwLDUwIEBACiAJCQkJICogb24gaXRzIHdheSBvdXQgb2YgdGhlIHN5c3RlbSwKIAkJCQkgKiB3ZSBuZWVkIHRvIHBhdXNlIGFuZCB0cnkgYWdhaW4uCiAJCQkJICovCi0JCQkJaWYgKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNKSB7CisJCQkJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNKSkgewogCQkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOwogCQkJCQlkZWxheSgxKTsKIAkJCQkJWEZTX1NUQVRTX0lOQyh4c19pZ19mcmVjeWNsZSk7CiAKIAkJCQkJZ290byBhZ2FpbjsKIAkJCQl9CisJCQkJQVNTRVJUKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNQUJMRSkpOworCisJCQkJLyoKKwkJCQkgKiBJZiBsb29rdXAgaXMgcmFjaW5nIHdpdGggdW5saW5rLCB0aGVuIHdlCisJCQkJICogc2hvdWxkIHJldHVybiBhbiBlcnJvciBpbW1lZGlhdGVseSBzbyB3ZQorCQkJCSAqIGRvbid0IHJlbW92ZSBpdCBmcm9tIHRoZSByZWNsYWltIGxpc3QgYW5kCisJCQkJICogcG90ZW50aWFsbHkgbGVhayB0aGUgaW5vZGUuCisJCQkJICovCisJCQkJaWYgKChpcC0+aV9kLmRpX21vZGUgPT0gMCkgJiYKKwkJCQkgICAgIShmbGFncyAmIFhGU19JR0VUX0NSRUFURSkpIHsKKwkJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKwkJCQkJcmV0dXJuIEVOT0VOVDsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFRoZXJlIG1heSBiZSB0cmFuc2FjdGlvbnMgc2l0dGluZyBpbiB0aGUKKwkJCQkgKiBpbmNvcmUgbG9nIGJ1ZmZlcnMgb3IgYmVpbmcgZmx1c2hlZCB0byBkaXNrCisJCQkJICogYXQgdGhpcyB0aW1lLiAgV2UgY2FuJ3QgY2xlYXIgdGhlCisJCQkJICogWEZTX0lSRUNMQUlNQUJMRSBmbGFnIHVudGlsIHRoZXNlCisJCQkJICogdHJhbnNhY3Rpb25zIGhhdmUgaGl0IHRoZSBkaXNrLCBvdGhlcndpc2Ugd2UKKwkJCQkgKiB3aWxsIHZvaWQgdGhlIGd1YXJhbnRlZSB0aGUgZmxhZyBwcm92aWRlcworCQkJCSAqIHhmc19pdW5waW4oKQorCQkJCSAqLworCQkJCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkgeworCQkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOworCQkJCQl4ZnNfbG9nX2ZvcmNlKG1wLCAwLAorCQkJCQkJWEZTX0xPR19GT1JDRXxYRlNfTE9HX1NZTkMpOworCQkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKKwkJCQkJZ290byBhZ2FpbjsKKwkJCQl9CiAKIAkJCQl2bl90cmFjZV9leGl0KHZwLCAieGZzX2lnZXQuYWxsb2MiLAogCQkJCQkoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CiAKIAkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKIAotCQkJCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JCQkJaXAtPmlfZmxhZ3MgJj0gflhGU19JUkVDTEFJTUFCTEU7Ci0JCQkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCQkJCXhmc19pZmxhZ3NfY2xlYXIoaXAsIFhGU19JUkVDTEFJTUFCTEUpOwogCQkJCXZlcnNpb24gPSBpaC0+aWhfdmVyc2lvbjsKIAkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOwogCQkJCXhmc19paGFzaF9wcm9tb3RlKGloLCBpcCwgdmVyc2lvbik7CkBAIC0yOTksMTAgKzMyNyw3IEBACiAJCQlpZiAobG9ja19mbGFncyAhPSAwKQogCQkJCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7CiAKLQkJCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JCQlpcC0+aV9mbGFncyAmPSB+WEZTX0lTVEFMRTsKLQkJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQorCQkJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lTVEFMRSk7CiAJCQl2bl90cmFjZV9leGl0KHZwLCAieGZzX2lnZXQuZm91bmQiLAogCQkJCQkJKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwogCQkJZ290byByZXR1cm5faXA7CkBAIC0zNzEsMTAgKzM5Niw3IEBACiAJaWgtPmloX25leHQgPSBpcDsKIAlpcC0+aV91ZHF1b3QgPSBpcC0+aV9nZHF1b3QgPSBOVUxMOwogCWloLT5paF92ZXJzaW9uKys7Ci0Jc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQlpcC0+aV9mbGFncyB8PSBYRlNfSU5FVzsKLQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0KKwl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lORVcpOwogCXdyaXRlX3VubG9jaygmaWgtPmloX2xvY2spOwogCiAJLyoKQEAgLTYyNSw3ICs2NDcsNyBAQAogCXZuX3RyYWNlX2VudHJ5KHZwLCAieGZzX2lwdXRfbmV3IiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwogCiAJaWYgKChpcC0+aV9kLmRpX21vZGUgPT0gMCkpIHsKLQkJQVNTRVJUKCEoaXAtPmlfZmxhZ3MgJiBYRlNfSVJFQ0xBSU1BQkxFKSk7CisJCUFTU0VSVCgheGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKSk7CiAJCXZuX21hcmtfYmFkKHZwKTsKIAl9CiAJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpCkBAIC02ODMsNiArNzA1LDcgQEAKIAkvKgogCSAqIEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGlub2RlLgogCSAqLworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CiAJeGZzX2lkZXN0cm95KGlwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5jIGIvZnMveGZzL3hmc19pbm9kZS5jCmluZGV4IGMyN2Q3ZDQ5Li40NGRmYWM1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZS5jCkBAIC0yMTkzLDcgKzIxOTMsNyBAQAogCQkJLyogSW5vZGUgbm90IGluIG1lbW9yeSBvciB3ZSBmb3VuZCBpdCBhbHJlYWR5LAogCQkJICogbm90aGluZyB0byBkbwogCQkJICovCi0JCQlpZiAoIWlwIHx8IChpcC0+aV9mbGFncyAmIFhGU19JU1RBTEUpKSB7CisJCQlpZiAoIWlwIHx8IHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lTVEFMRSkpIHsKIAkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtMjIxNSwxMCArMjIxNSw3IEBACiAKIAkJCWlmIChpcCA9PSBmcmVlX2lwKSB7CiAJCQkJaWYgKHhmc19pZmxvY2tfbm93YWl0KGlwKSkgewotCQkJCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQkJCQlpcC0+aV9mbGFncyB8PSBYRlNfSVNUQUxFOwotCQkJCQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0KKwkJCQkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JU1RBTEUpOwogCQkJCQlpZiAoeGZzX2lub2RlX2NsZWFuKGlwKSkgewogCQkJCQkJeGZzX2lmdW5sb2NrKGlwKTsKIAkJCQkJfSBlbHNlIHsKQEAgLTIyMzEsOSArMjIyOCw3IEBACiAKIAkJCWlmICh4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkpIHsKIAkJCQlpZiAoeGZzX2lmbG9ja19ub3dhaXQoaXApKSB7Ci0JCQkJCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JCQkJCWlwLT5pX2ZsYWdzIHw9IFhGU19JU1RBTEU7Ci0JCQkJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwkJCQkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JU1RBTEUpOwogCiAJCQkJCWlmICh4ZnNfaW5vZGVfY2xlYW4oaXApKSB7CiAJCQkJCQl4ZnNfaWZ1bmxvY2soaXApOwpAQCAtMjI2Myw5ICsyMjU4LDcgQEAKIAkJCQlBSUxfTE9DSyhtcCxzKTsKIAkJCQlpaXAtPmlsaV9mbHVzaF9sc24gPSBpaXAtPmlsaV9pdGVtLmxpX2xzbjsKIAkJCQlBSUxfVU5MT0NLKG1wLCBzKTsKLQkJCQlzcGluX2xvY2soJmlpcC0+aWxpX2lub2RlLT5pX2ZsYWdzX2xvY2spOwotCQkJCWlpcC0+aWxpX2lub2RlLT5pX2ZsYWdzIHw9IFhGU19JU1RBTEU7Ci0JCQkJc3Bpbl91bmxvY2soJmlpcC0+aWxpX2lub2RlLT5pX2ZsYWdzX2xvY2spOworCQkJCXhmc19pZmxhZ3Nfc2V0KGlpcC0+aWxpX2lub2RlLCBYRlNfSVNUQUxFKTsKIAkJCQlwcmVfZmx1c2hlZCsrOwogCQkJfQogCQkJbGlwID0gbGlwLT5saV9iaW9fbGlzdDsKQEAgLTI3NDgsNDIgKzI3NDEsMzkgQEAKIHsKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmlwLT5pX3BpbmNvdW50KSA+IDApOwogCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlwLT5pX3BpbmNvdW50KSkgewotCQkvKgotCQkgKiBJZiB0aGUgaW5vZGUgaXMgY3VycmVudGx5IGJlaW5nIHJlY2xhaW1lZCwgdGhlCi0JCSAqIGxpbnV4IGlub2RlIF9hbmRfIHRoZSB4ZnMgdm5vZGUgbWF5IGhhdmUgYmVlbgotCQkgKiBmcmVlZCBzbyB3ZSBjYW5ub3QgcmVmZXJlbmNlIGVpdGhlciBvZiB0aGVtIHNhZmVseS4KLQkJICogSGVuY2Ugd2Ugc2hvdWxkIG5vdCB0cnkgdG8gZG8gYW55dGhpbmcgdG8gdGhlbQotCQkgKiBpZiB0aGUgeGZzIGlub2RlIGlzIGN1cnJlbnRseSBpbiB0aGUgcmVjbGFpbQotCQkgKiBwYXRoLgotCQkgKgotCQkgKiBIb3dldmVyLCB3ZSBzdGlsbCBuZWVkIHRvIGlzc3VlIHRoZSB1bnBpbiB3YWtldXAKLQkJICogY2FsbCBhcyB0aGUgaW5vZGUgcmVjbGFpbSBtYXkgYmUgYmxvY2tlZCB3YWl0aW5nIGZvcgotCQkgKiB0aGUgaW5vZGUgdG8gYmVjb21lIHVucGlubmVkLgotCQkgKi8KLQkJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJmlwLT5pX3BpbmNvdW50LCAmaXAtPmlfZmxhZ3NfbG9jaykpIHsKIAotCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQlpZiAoIShpcC0+aV9mbGFncyAmIChYRlNfSVJFQ0xBSU18WEZTX0lSRUNMQUlNQUJMRSkpKSB7CisJCS8qCisJCSAqIElmIHRoZSBpbm9kZSBpcyBjdXJyZW50bHkgYmVpbmcgcmVjbGFpbWVkLCB0aGUgbGluayBiZXR3ZWVuCisJCSAqIHRoZSBiaHZfdm5vZGUgYW5kIHRoZSB4ZnNfaW5vZGUgd2lsbCBiZSBicm9rZW4gYWZ0ZXIgdGhlCisJCSAqIFhGU19JUkVDTEFJTSogZmxhZyBpcyBzZXQuIEhlbmNlLCBpZiB0aGVzZSBmbGFncyBhcmUgbm90CisJCSAqIHNldCwgdGhlbiB3ZSBjYW4gbW92ZSBmb3J3YXJkIGFuZCBtYXJrIHRoZSBsaW51eCBpbm9kZSBkaXJ0eQorCQkgKiBrbm93aW5nIHRoYXQgaXQgaXMgc3RpbGwgdmFsaWQgYXMgaXQgd29uJ3QgZnJlZWQgdW50aWwgYWZ0ZXIKKwkJICogdGhlIGJodl92bm9kZTwtPnhmc19pbm9kZSBsaW5rIGlzIGJyb2tlbiBpbiB4ZnNfcmVjbGFpbS4gVGhlCisJCSAqIGlfZmxhZ3NfbG9jayBpcyB1c2VkIHRvIHN5bmNocm9uaXNlIHRoZSBzZXR0aW5nIG9mIHRoZQorCQkgKiBYRlNfSVJFQ0xBSU0qIGZsYWdzIGFuZCB0aGUgYnJlYWtpbmcgb2YgdGhlIGxpbmssIGFuZCBzbyB3ZQorCQkgKiBjYW4gZXhlY3V0ZSBhdG9taWNhbGx5IHcuci50IHRvIHJlY2xhaW0gYnkgaG9sZGluZyB0aGlzIGxvY2sKKwkJICogaGVyZS4KKwkJICoKKwkJICogSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBpc3N1ZSB0aGUgdW5waW4gd2FrZXVwIGNhbGwgYXMgdGhlCisJCSAqIGlub2RlIHJlY2xhaW0gbWF5IGJlIGJsb2NrZWQgd2FpdGluZyBmb3IgdGhlIGlub2RlIHRvIGJlY29tZQorCQkgKiB1bnBpbm5lZC4KKwkJICovCisKKwkJaWYgKCFfX3hmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNfFhGU19JUkVDTEFJTUFCTEUpKSB7CiAJCQliaHZfdm5vZGVfdAkqdnAgPSBYRlNfSVRPVl9OVUxMKGlwKTsKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisJCQlCVUdfT04odnAgPT0gTlVMTCk7CisJCQlpbm9kZSA9IHZuX3RvX2lub2RlKHZwKTsKKwkJCUJVR19PTihpbm9kZS0+aV9zdGF0ZSAmIElfQ0xFQVIpOwogCiAJCQkvKiBtYWtlIHN5bmMgY29tZSBiYWNrIGFuZCBmbHVzaCB0aGlzIGlub2RlICovCi0JCQlpZiAodnApIHsKLQkJCQlpbm9kZSA9IHZuX3RvX2lub2RlKHZwKTsKLQotCQkJCWlmICghKGlub2RlLT5pX3N0YXRlICYKLQkJCQkJCShJX05FV3xJX0ZSRUVJTkd8SV9DTEVBUikpKSB7Ci0JCQkJCWlub2RlID0gaWdyYWIoaW5vZGUpOwotCQkJCQlpZiAoaW5vZGUpCi0JCQkJCQltYXJrX2lub2RlX2RpcnR5X3N5bmMoaW5vZGUpOwotCQkJCX0gZWxzZQotCQkJCQlpbm9kZSA9IE5VTEw7Ci0JCQl9CisJCQlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIChJX05FV3xJX0ZSRUVJTkcpKSkKKwkJCQltYXJrX2lub2RlX2RpcnR5X3N5bmMoaW5vZGUpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAkJd2FrZV91cCgmaXAtPmlfaXBpbl93YWl0KTsKLQkJaWYgKGlub2RlKQotCQkJaXB1dChpbm9kZSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggZTk2ZWIwOC4uYmM4MjM3MiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtMzA1LDYgKzMwNSw0NyBAQAogI2VuZGlmCiB9IHhmc19pbm9kZV90OwogCisKKy8qCisgKiBpX2ZsYWdzIGhlbHBlciBmdW5jdGlvbnMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX3hmc19pZmxhZ3Nfc2V0KHhmc19pbm9kZV90ICppcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MpCit7CisJaXAtPmlfZmxhZ3MgfD0gZmxhZ3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX2lmbGFnc19zZXQoeGZzX2lub2RlX3QgKmlwLCB1bnNpZ25lZCBzaG9ydCBmbGFncykKK3sKKwlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCV9feGZzX2lmbGFnc19zZXQoaXAsIGZsYWdzKTsKKwlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX2lmbGFnc19jbGVhcih4ZnNfaW5vZGVfdCAqaXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzKQoreworCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJaXAtPmlfZmxhZ3MgJj0gfmZsYWdzOworCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19feGZzX2lmbGFnc190ZXN0KHhmc19pbm9kZV90ICppcCwgdW5zaWduZWQgc2hvcnQgZmxhZ3MpCit7CisJcmV0dXJuIChpcC0+aV9mbGFncyAmIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3hmc19pZmxhZ3NfdGVzdCh4ZnNfaW5vZGVfdCAqaXAsIHVuc2lnbmVkIHNob3J0IGZsYWdzKQoreworCWludCByZXQ7CisJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlyZXQgPSBfX3hmc19pZmxhZ3NfdGVzdChpcCwgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKaW5kZXggMDYxZTJmZi4uYmRhNzc0YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKIAlwYXRobGVuID0gKGludClpcC0+aV9kLmRpX3NpemU7CiAKIAlpZiAoaXAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpIHsKLQkJZXJyb3IgPSB1aW9fcmVhZChpcC0+aV9kZi5pZl91MS5pZl9kYXRhLCBwYXRobGVuLCB1aW9wKTsKKwkJZXJyb3IgPSB4ZnNfdWlvX3JlYWQoaXAtPmlfZGYuaWZfdTEuaWZfZGF0YSwgcGF0aGxlbiwgdWlvcCk7CiAJfQogCWVsc2UgewogCQkvKgpAQCAtMTA0NCw3ICsxMDQ0LDcgQEAKIAkJCQlieXRlX2NudCA9IHBhdGhsZW47CiAJCQlwYXRobGVuIC09IGJ5dGVfY250OwogCi0JCQllcnJvciA9IHVpb19yZWFkKFhGU19CVUZfUFRSKGJwKSwgYnl0ZV9jbnQsIHVpb3ApOworCQkJZXJyb3IgPSB4ZnNfdWlvX3JlYWQoWEZTX0JVRl9QVFIoYnApLCBieXRlX2NudCwgdWlvcCk7CiAJCQl4ZnNfYnVmX3JlbHNlIChicCk7CiAJCX0KIApAQCAtMzgyNywxMSArMzgyNywxNiBAQAogCSAqLwogCXhmc19zeW5jaHJvbml6ZV9hdGltZShpcCk7CiAKLQkvKiBJZiB3ZSBoYXZlIG5vdGhpbmcgdG8gZmx1c2ggd2l0aCB0aGlzIGlub2RlIHRoZW4gY29tcGxldGUgdGhlCi0JICogdGVhcmRvd24gbm93LCBvdGhlcndpc2UgYnJlYWsgdGhlIGxpbmsgYmV0d2VlbiB0aGUgeGZzIGlub2RlCi0JICogYW5kIHRoZSBsaW51eCBpbm9kZSBhbmQgY2xlYW4gdXAgdGhlIHhmcyBpbm9kZSBsYXRlci4gVGhpcwotCSAqIGF2b2lkcyBmbHVzaGluZyB0aGUgaW5vZGUgdG8gZGlzayBkdXJpbmcgdGhlIGRlbGV0ZSBvcGVyYXRpb24KLQkgKiBpdHNlbGYuCisJLyoKKwkgKiBJZiB3ZSBoYXZlIG5vdGhpbmcgdG8gZmx1c2ggd2l0aCB0aGlzIGlub2RlIHRoZW4gY29tcGxldGUgdGhlCisJICogdGVhcmRvd24gbm93LCBvdGhlcndpc2UgYnJlYWsgdGhlIGxpbmsgYmV0d2VlbiB0aGUgeGZzIGlub2RlIGFuZCB0aGUKKwkgKiBsaW51eCBpbm9kZSBhbmQgY2xlYW4gdXAgdGhlIHhmcyBpbm9kZSBsYXRlci4gVGhpcyBhdm9pZHMgZmx1c2hpbmcKKwkgKiB0aGUgaW5vZGUgdG8gZGlzayBkdXJpbmcgdGhlIGRlbGV0ZSBvcGVyYXRpb24gaXRzZWxmLgorCSAqCisJICogV2hlbiBicmVha2luZyB0aGUgbGluaywgd2UgbmVlZCB0byBzZXQgdGhlIFhGU19JUkVDTEFJTUFCTEUgZmxhZworCSAqIGZpcnN0IHRvIGVuc3VyZSB0aGF0IHhmc19pdW5waW4oKSB3aWxsIG5ldmVyIHNlZSBhbiB4ZnMgaW5vZGUKKwkgKiB0aGF0IGhhcyBhIGxpbnV4IGlub2RlIGJlaW5nIHJlY2xhaW1lZC4gU3luY2hyb25pc2F0aW9uIGlzIHByb3ZpZGVkCisJICogYnkgdGhlIGlfZmxhZ3NfbG9jay4KIAkgKi8KIAlpZiAoIWlwLT5pX3VwZGF0ZV9jb3JlICYmIChpcC0+aV9pdGVtcCA9PSBOVUxMKSkgewogCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKQEAgLTM4NDAsMTMgKzM4NDUsMTMgQEAKIAl9IGVsc2UgewogCQl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKIAotCQkvKiBQcm90ZWN0IHN5bmMgZnJvbSB1cyAqLworCQkvKiBQcm90ZWN0IHN5bmMgYW5kIHVucGluIGZyb20gdXMgKi8KIAkJWEZTX01PVU5UX0lMT0NLKG1wKTsKLQkJdm5fYmh2X3JlbW92ZShWTl9CSFZfSEVBRCh2cCksIFhGU19JVE9CSFYoaXApKTsKLQkJbGlzdF9hZGRfdGFpbCgmaXAtPmlfcmVjbGFpbSwgJm1wLT5tX2RlbF9pbm9kZXMpOwogCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQlpcC0+aV9mbGFncyB8PSBYRlNfSVJFQ0xBSU1BQkxFOworCQlfX3hmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKTsKKwkJdm5fYmh2X3JlbW92ZShWTl9CSFZfSEVBRCh2cCksIFhGU19JVE9CSFYoaXApKTsKIAkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZpcC0+aV9yZWNsYWltLCAmbXAtPm1fZGVsX2lub2Rlcyk7CiAJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zODcyLDggKzM4NzcsOCBAQAogCSAqLwogCXdyaXRlX2xvY2soJmloLT5paF9sb2NrKTsKIAlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCWlmICgoaXAtPmlfZmxhZ3MgJiBYRlNfSVJFQ0xBSU0pIHx8Ci0JICAgICghKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNQUJMRSkgJiYgdnAgPT0gTlVMTCkpIHsKKwlpZiAoX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTSkgfHwKKwkgICAgKCFfX3hmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNQUJMRSkgJiYgdnAgPT0gTlVMTCkpIHsKIAkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwogCQl3cml0ZV91bmxvY2soJmloLT5paF9sb2NrKTsKIAkJaWYgKGxvY2tlZCkgewpAQCAtMzg4Miw3ICszODg3LDcgQEAKIAkJfQogCQlyZXR1cm4gMTsKIAl9Ci0JaXAtPmlfZmxhZ3MgfD0gWEZTX0lSRUNMQUlNOworCV9feGZzX2lmbGFnc19zZXQoaXAsIFhGU19JUkVDTEFJTSk7CiAJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwogCXdyaXRlX3VubG9jaygmaWgtPmloX2xvY2spOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCmluZGV4IGYzMzhlNDAuLmZkZDEwOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCkBAIC0zNTcsNyArMzU3LDcgQEAKIC8qIGhlbHBlciAqLwogYWNwaV9oYW5kbGUgYWNwaV9nZXRfY2hpbGQoYWNwaV9oYW5kbGUsIGFjcGlfaW50ZWdlcik7CiBhY3BpX2hhbmRsZSBhY3BpX2dldF9wY2lfcm9vdGJyaWRnZV9oYW5kbGUodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotI2RlZmluZSBERVZJQ0VfQUNQSV9IQU5ETEUoZGV2KSAoKGFjcGlfaGFuZGxlKSgoZGV2KS0+ZmlybXdhcmVfZGF0YSkpCisjZGVmaW5lIERFVklDRV9BQ1BJX0hBTkRMRShkZXYpICgoYWNwaV9oYW5kbGUpKChkZXYpLT5hcmNoZGF0YS5hY3BpX2hhbmRsZSkpCiAKICNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmggYi9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKaW5kZXggYzU0NzJiZS4uZTcyYmZkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oCisrKyBiL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBBQ1BJX1BEQ19TTVBfQ19TV0NPT1JECQkoMHgwMDQwKQogI2RlZmluZSBBQ1BJX1BEQ19TTVBfVF9TV0NPT1JECQkoMHgwMDgwKQogI2RlZmluZSBBQ1BJX1BEQ19DX0MxX0ZGSAkJKDB4MDEwMCkKKyNkZWZpbmUgQUNQSV9QRENfQ19DMkMzX0ZGSAkJKDB4MDIwMCkKIAogI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVAJKEFDUElfUERDX1NNUF9DMVBUIHwgXAogCQkJCQkgQUNQSV9QRENfQ19DMV9IQUxUIHwgXApAQCAtMjMsOCArMjQsMTAgQEAKIAkJCQkJIEFDUElfUERDX1NNUF9QX1NXQ09PUkQgfCBcCiAJCQkJCSBBQ1BJX1BEQ19QX0ZGSCkKIAotI2RlZmluZSBBQ1BJX1BEQ19DX0NBUEFCSUxJVFlfU01QCShBQ1BJX1BEQ19TTVBfQzJDMyB8IFwKLQkJCQkJIEFDUElfUERDX1NNUF9DMVBUIHwgXAotCQkJCQkgQUNQSV9QRENfQ19DMV9IQUxUKQorI2RlZmluZSBBQ1BJX1BEQ19DX0NBUEFCSUxJVFlfU01QCShBQ1BJX1BEQ19TTVBfQzJDMyAgfCBcCisJCQkJCSBBQ1BJX1BEQ19TTVBfQzFQVCAgfCBcCisJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQgfCBcCisJCQkJCSBBQ1BJX1BEQ19DX0MxX0ZGSCAgfCBcCisJCQkJCSBBQ1BJX1BEQ19DX0MyQzNfRkZIKQogCiAjZW5kaWYJCQkJLyogX19QRENfSU5URUxfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAppbmRleCA0N2ZhZjI3Li43ZjFlOTI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKQEAgLTY0LDcgKzY0LDcgQEAKIC8qIEhvc3QtZGVwZW5kZW50IHR5cGVzIGFuZCBkZWZpbmVzICovCiAKICNkZWZpbmUgQUNQSV9NQUNISU5FX1dJRFRIICAgICAgICAgIEJJVFNfUEVSX0xPTkcKLSNkZWZpbmUgYWNwaV9jYWNoZV90ICAgICAgICAgICAgICAgICAgICAgICAga21lbV9jYWNoZV90CisjZGVmaW5lIGFjcGlfY2FjaGVfdCAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrbWVtX2NhY2hlCiAjZGVmaW5lIGFjcGlfc3BpbmxvY2sgICAgICAgICAgICAgICAgICAgc3BpbmxvY2tfdCAqCiAjZGVmaW5lIEFDUElfRVhQT1JUX1NZTUJPTChzeW1ib2wpICBFWFBPUlRfU1lNQk9MKHN5bWJvbCk7CiAjZGVmaW5lIHN0cnRvdWwgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfc3RydG91bApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IDlkZDViNzUuLjc3OThkMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTI5LDYgKzI5LDkgQEAKICNkZWZpbmUgRE9NQUlOX0NPT1JEX1RZUEVfU1dfQU5ZCTB4ZmQKICNkZWZpbmUgRE9NQUlOX0NPT1JEX1RZUEVfSFdfQUxMCTB4ZmUKIAorI2RlZmluZSBBQ1BJX0NTVEFURV9TWVNURU1JTwkoMCkKKyNkZWZpbmUgQUNQSV9DU1RBVEVfRkZICQkoMSkKKwogLyogUG93ZXIgTWFuYWdlbWVudCAqLwogCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3g7CkBAIC01OCw2ICs2MSw4IEBACiAJdTggdmFsaWQ7CiAJdTggdHlwZTsKIAl1MzIgYWRkcmVzczsKKwl1OCBzcGFjZV9pZDsKKwl1OCBpbmRleDsKIAl1MzIgbGF0ZW5jeTsKIAl1MzIgbGF0ZW5jeV90aWNrczsKIAl1MzIgcG93ZXI7CkBAIC0yMDYsNiArMjExLDkgQEAKICNpZmRlZiBBUkNIX0hBU19QT1dFUl9JTklUCiB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywKIAkJCQkJdW5zaWduZWQgaW50IGNwdSk7CitpbnQgYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZSh1bnNpZ25lZCBpbnQgY3B1LAorCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4LCBzdHJ1Y3QgYWNwaV9wb3dlcl9yZWdpc3RlciAqcmVnKTsKK3ZvaWQgYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9lbnRlcihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmNzdGF0ZSk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soc3RydWN0CiAJCQkJCQkgICAgICBhY3BpX3Byb2Nlc3Nvcl9mbGFncwpAQCAtMjE0LDYgKzIyMiwxNiBAQAogCWZsYWdzLT5ibV9jaGVjayA9IDE7CiAJcmV0dXJuOwogfQorc3RhdGljIGlubGluZSBpbnQgYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZSh1bnNpZ25lZCBpbnQgY3B1LAorCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4LCBzdHJ1Y3QgYWNwaV9wb3dlcl9yZWdpc3RlciAqcmVnKQoreworCXJldHVybiAtMTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX2VudGVyKAorCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmNzdGF0ZSkKK3sKKwlyZXR1cm47Cit9CiAjZW5kaWYKIAogLyogaW4gcHJvY2Vzc29yX3BlcmZsaWIuYyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tYWxwaGEvY2FjaGVmbHVzaC5oCmluZGV4IDgwNTY0MGIuLmI2ODZjYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9jYWNoZWZsdXNoLmgKQEAgLTYsNiArNiw3IEBACiAvKiBDYWNoZXMgYXJlbid0IGJyYWluLWRlYWQgb24gdGhlIEFscGhhLiAqLwogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLWFscGhhL2NoZWNrc3VtLmgKaW5kZXggYTVjOWYwOC4uZDM4NTRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9jaGVja3N1bS5oCkBAIC03LDIxICs3LDIwIEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsIHVuc2lnbmVkIGludCBpaGwpOworZXh0ZXJuIF9fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCk7CiAKIC8qCiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorZXh0ZXJuIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pOworCQkJCQkgICBfX3dzdW0gc3VtKTsKIAotdW5zaWduZWQgaW50IGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLAorX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQl1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCXVuc2lnbmVkIGludCBzdW0pOworCQkJCV9fd3N1bSBzdW0pOwogCiAvKgogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIGEgbWVtb3J5IGJsb2NrIGF0IGJ1ZmYsIGxlbmd0aCBsZW4sCkBAIC0zNSw3ICszNCw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0CkBAIC00NCw5ICs0Myw5IEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycnApOworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJycCk7CiAKLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogCiAvKgpAQCAtNTQsMjQgKzUzLDIzIEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKTsKK2V4dGVybiBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKTsKIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIHdpdGhvdXQgYWRkaW5nIHBzZXVkbyBoZWFkZXJzCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBjc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIGNzdW0pCiB7CisJdTMyIHN1bSA9IChfX2ZvcmNlIHUzMiljc3VtOwogCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7CiAJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKLQlyZXR1cm4gfnN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaW50IGNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1bSk7Ci0KK2V4dGVybiBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkgICAgICAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCSAgICAgICBfX3dzdW0gc3VtKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2RtYS1tYXBwaW5nLmgKaW5kZXggYjlmZjRkOC4uNTdlMDlmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9kbWEtbWFwcGluZy5oCkBAIC01MSw3ICs1MSw3IEBACiAKICNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpCWRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQogI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKQlkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkZXYpCQkJKDEpCisjZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQsIGgpCQkJKDEpCiAKIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CiAKQEAgLTYwLDcgKzYwLDcgQEAKICNkZWZpbmUgZG1hX3N5bmNfc2luZ2xlX3JhbmdlKGRldiwgYWRkciwgb2ZmLCBzaXplLCBkaXIpICBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGRtYV9zeW5jX3NnX2Zvcl9jcHUoZGV2LCBzZywgbmVudHMsIGRpcikJICBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2UoZGV2LCBzZywgbmVudHMsIGRpcikJICBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGRtYV9jYWNoZV9zeW5jKHZhLCBzaXplLCBkaXIpCQkJICBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRtYV9jYWNoZV9zeW5jKGRldiwgdmEsIHNpemUsIGRpcikJCSAgZG8geyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KCkJCQkgIEwxX0NBQ0hFX0JZVEVTCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtYml0cy5oCmluZGV4IDU1NDExMDEuLmFkODU0YTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvdGVybWJpdHMuaApAQCAtMjUsNiArMjUsMTkgQEAKIAlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCiB9OwogCisvKiBBbHBoYSBoYXMgbWF0Y2hpbmcgdGVybWlvcyBhbmQga3Rlcm1pb3MgKi8KKworc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAoPT0gY19jY1sxOV0pICovCisJc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisJc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworfTsKKwogLyogY19jYyBjaGFyYWN0ZXJzICovCiAjZGVmaW5lIFZFT0YgMAogI2RlZmluZSBWRU9MIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tYWxwaGEvdW5pc3RkLmgKaW5kZXggMmNhYmJkNC4uODQzMTNkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvdW5pc3RkLmgKQEAgLTM4NywxODggKzM4Nyw2IEBACiAKICNkZWZpbmUgTlJfU1lTQ0FMTFMJCQk0NDcKIAotI2lmIGRlZmluZWQoX19HTlVDX18pCi0KLSNkZWZpbmUgX3N5c2NhbGxfcmV0dXJuKHR5cGUpCQkJCQkJXAotCXJldHVybiAoX3NjX2VyciA/IGVycm5vID0gX3NjX3JldCwgX3NjX3JldCA9IC0xTCA6IDApLCAodHlwZSkgX3NjX3JldAotCi0jZGVmaW5lIF9zeXNjYWxsX2Nsb2JiZXJzCQkJCQkJXAotCSIkMSIsICIkMiIsICIkMyIsICIkNCIsICIkNSIsICIkNiIsICIkNyIsICIkOCIsCQkJXAotCSIkMjIiLCAiJDIzIiwgIiQyNCIsICIkMjUiLCAiJDI3IiwgIiQyOCIgCQkJXAotCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLCBuYW1lKQkJCQkJCVwKLXR5cGUgbmFtZSh2b2lkKQkJCQkJCQkJXAotewkJCQkJCQkJCVwKLQlsb25nIF9zY19yZXQsIF9zY19lcnI7CQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMCBfX2FzbV9fKCIkMCIpOwkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMTkgX19hc21fXygiJDE5Iik7CQkJXAotCQkJCQkJCQkJXAotCQlfc2NfMCA9IF9fTlJfIyNuYW1lOwkJCQkJXAotCQlfX2FzbV9fKCJjYWxsc3lzICMgJTAgJTEgJTIiCQkJCVwKLQkJCTogIj1yIihfc2NfMCksICI9ciIoX3NjXzE5KQkJCVwKLQkJCTogIjAiKF9zY18wKQkJCQkJXAotCQkJOiBfc3lzY2FsbF9jbG9iYmVycyk7CQkJCVwKLQkJX3NjX3JldCA9IF9zY18wLCBfc2NfZXJyID0gX3NjXzE5OwkJCVwKLQl9CQkJCQkJCQlcCi0JX3N5c2NhbGxfcmV0dXJuKHR5cGUpOwkJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUxLGFyZzEpCQkJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSkJCQkJCQkJXAotewkJCQkJCQkJCVwKLQlsb25nIF9zY19yZXQsIF9zY19lcnI7CQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMCBfX2FzbV9fKCIkMCIpOwkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMTYgX19hc21fXygiJDE2Iik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18xOSBfX2FzbV9fKCIkMTkiKTsJCQlcCi0JCQkJCQkJCQlcCi0JCV9zY18wID0gX19OUl8jI25hbWU7CQkJCQlcCi0JCV9zY18xNiA9IChsb25nKSAoYXJnMSk7CQkJCQlcCi0JCV9fYXNtX18oImNhbGxzeXMgIyAlMCAlMSAlMiAlMyIJCQkJXAotCQkJOiAiPXIiKF9zY18wKSwgIj1yIihfc2NfMTkpCQkJXAotCQkJOiAiMCIoX3NjXzApLCAiciIoX3NjXzE2KQkJCVwKLQkJCTogX3N5c2NhbGxfY2xvYmJlcnMpOwkJCQlcCi0JCV9zY19yZXQgPSBfc2NfMCwgX3NjX2VyciA9IF9zY18xOTsJCQlcCi0JfQkJCQkJCQkJXAotCV9zeXNjYWxsX3JldHVybih0eXBlKTsJCQkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwyKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIpCQkJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMikJCQkJCVwKLXsJCQkJCQkJCQlcCi0JbG9uZyBfc2NfcmV0LCBfc2NfZXJyOwkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzAgX19hc21fXygiJDAiKTsJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzE2IF9fYXNtX18oIiQxNiIpOwkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMTcgX19hc21fXygiJDE3Iik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18xOSBfX2FzbV9fKCIkMTkiKTsJCQlcCi0JCQkJCQkJCQlcCi0JCV9zY18wID0gX19OUl8jI25hbWU7CQkJCQlcCi0JCV9zY18xNiA9IChsb25nKSAoYXJnMSk7CQkJCQlcCi0JCV9zY18xNyA9IChsb25nKSAoYXJnMik7CQkJCQlcCi0JCV9fYXNtX18oImNhbGxzeXMgIyAlMCAlMSAlMiAlMyAlNCIJCQlcCi0JCQk6ICI9ciIoX3NjXzApLCAiPXIiKF9zY18xOSkJCQlcCi0JCQk6ICIwIihfc2NfMCksICJyIihfc2NfMTYpLCAiciIoX3NjXzE3KQkJXAotCQkJOiBfc3lzY2FsbF9jbG9iYmVycyk7CQkJCVwKLQkJX3NjX3JldCA9IF9zY18wLCBfc2NfZXJyID0gX3NjXzE5OwkJCVwKLQl9CQkJCQkJCQlcCi0JX3N5c2NhbGxfcmV0dXJuKHR5cGUpOwkJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDModHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczKQkJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczKQkJCQlcCi17CQkJCQkJCQkJXAotCWxvbmcgX3NjX3JldCwgX3NjX2VycjsJCQkJCQlcCi0JewkJCQkJCQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18wIF9fYXNtX18oIiQwIik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18xNiBfX2FzbV9fKCIkMTYiKTsJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzE3IF9fYXNtX18oIiQxNyIpOwkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMTggX19hc21fXygiJDE4Iik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18xOSBfX2FzbV9fKCIkMTkiKTsJCQlcCi0JCQkJCQkJCQlcCi0JCV9zY18wID0gX19OUl8jI25hbWU7CQkJCQlcCi0JCV9zY18xNiA9IChsb25nKSAoYXJnMSk7CQkJCQlcCi0JCV9zY18xNyA9IChsb25nKSAoYXJnMik7CQkJCQlcCi0JCV9zY18xOCA9IChsb25nKSAoYXJnMyk7CQkJCQlcCi0JCV9fYXNtX18oImNhbGxzeXMgIyAlMCAlMSAlMiAlMyAlNCAlNSIJCQlcCi0JCQk6ICI9ciIoX3NjXzApLCAiPXIiKF9zY18xOSkJCQlcCi0JCQk6ICIwIihfc2NfMCksICJyIihfc2NfMTYpLCAiciIoX3NjXzE3KSwJCVwKLQkJCSAgInIiKF9zY18xOCkJCQkJCVwKLQkJCTogX3N5c2NhbGxfY2xvYmJlcnMpOwkJCQlcCi0JCV9zY19yZXQgPSBfc2NfMCwgX3NjX2VyciA9IF9zY18xOTsJCQlcCi0JfQkJCQkJCQkJXAotCV9zeXNjYWxsX3JldHVybih0eXBlKTsJCQkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0KSBcCi10eXBlIG5hbWUgKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQpCQkgXAotewkJCQkJCQkJCSBcCi0JbG9uZyBfc2NfcmV0LCBfc2NfZXJyOwkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzAgX19hc21fXygiJDAiKTsJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzE2IF9fYXNtX18oIiQxNiIpOwkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMTcgX19hc21fXygiJDE3Iik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18xOCBfX2FzbV9fKCIkMTgiKTsJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzE5IF9fYXNtX18oIiQxOSIpOwkJCVwKLQkJCQkJCQkJCVwKLQkJX3NjXzAgPSBfX05SXyMjbmFtZTsJCQkJCVwKLQkJX3NjXzE2ID0gKGxvbmcpIChhcmcxKTsJCQkJCVwKLQkJX3NjXzE3ID0gKGxvbmcpIChhcmcyKTsJCQkJCVwKLQkJX3NjXzE4ID0gKGxvbmcpIChhcmczKTsJCQkJCVwKLQkJX3NjXzE5ID0gKGxvbmcpIChhcmc0KTsJCQkJCVwKLQkJX19hc21fXygiY2FsbHN5cyAjICUwICUxICUyICUzICU0ICU1ICU2IgkJXAotCQkJOiAiPXIiKF9zY18wKSwgIj1yIihfc2NfMTkpCQkJXAotCQkJOiAiMCIoX3NjXzApLCAiciIoX3NjXzE2KSwgInIiKF9zY18xNyksCQlcCi0JCQkgICJyIihfc2NfMTgpLCAiMSIoX3NjXzE5KQkJCVwKLQkJCTogX3N5c2NhbGxfY2xvYmJlcnMpOwkJCQlcCi0JCV9zY19yZXQgPSBfc2NfMCwgX3NjX2VyciA9IF9zY18xOTsJCQlcCi0JfQkJCQkJCQkJXAotCV9zeXNjYWxsX3JldHVybih0eXBlKTsJCQkJCQlcCi19IAotCi0jZGVmaW5lIF9zeXNjYWxsNSh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCwgXAotCSAgdHlwZTUsYXJnNSkJCQkJCQkJIFwKLXR5cGUgbmFtZSAodHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMsdHlwZTQgYXJnNCx0eXBlNSBhcmc1KQlcCi17CQkJCQkJCQkJXAotCWxvbmcgX3NjX3JldCwgX3NjX2VycjsJCQkJCQlcCi0JewkJCQkJCQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18wIF9fYXNtX18oIiQwIik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18xNiBfX2FzbV9fKCIkMTYiKTsJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzE3IF9fYXNtX18oIiQxNyIpOwkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMTggX19hc21fXygiJDE4Iik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18xOSBfX2FzbV9fKCIkMTkiKTsJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzIwIF9fYXNtX18oIiQyMCIpOwkJCVwKLQkJCQkJCQkJCVwKLQkJX3NjXzAgPSBfX05SXyMjbmFtZTsJCQkJCVwKLQkJX3NjXzE2ID0gKGxvbmcpIChhcmcxKTsJCQkJCVwKLQkJX3NjXzE3ID0gKGxvbmcpIChhcmcyKTsJCQkJCVwKLQkJX3NjXzE4ID0gKGxvbmcpIChhcmczKTsJCQkJCVwKLQkJX3NjXzE5ID0gKGxvbmcpIChhcmc0KTsJCQkJCVwKLQkJX3NjXzIwID0gKGxvbmcpIChhcmc1KTsJCQkJCVwKLQkJX19hc21fXygiY2FsbHN5cyAjICUwICUxICUyICUzICU0ICU1ICU2ICU3IgkJXAotCQkJOiAiPXIiKF9zY18wKSwgIj1yIihfc2NfMTkpCQkJXAotCQkJOiAiMCIoX3NjXzApLCAiciIoX3NjXzE2KSwgInIiKF9zY18xNyksCQlcCi0JCQkgICJyIihfc2NfMTgpLCAiMSIoX3NjXzE5KSwgInIiKF9zY18yMCkJCVwKLQkJCTogX3N5c2NhbGxfY2xvYmJlcnMpOwkJCQlcCi0JCV9zY19yZXQgPSBfc2NfMCwgX3NjX2VyciA9IF9zY18xOTsJCQlcCi0JfQkJCQkJCQkJXAotCV9zeXNjYWxsX3JldHVybih0eXBlKTsJCQkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw2KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LCBcCi0JICB0eXBlNSxhcmc1LHR5cGU2LGFyZzYpCQkJCQkgXAotdHlwZSBuYW1lICh0eXBlMSBhcmcxLHR5cGUyIGFyZzIsdHlwZTMgYXJnMyx0eXBlNCBhcmc0LHR5cGU1IGFyZzUsIHR5cGU2IGFyZzYpXAotewkJCQkJCQkJCVwKLQlsb25nIF9zY19yZXQsIF9zY19lcnI7CQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMCBfX2FzbV9fKCIkMCIpOwkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMTYgX19hc21fXygiJDE2Iik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18xNyBfX2FzbV9fKCIkMTciKTsJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzE4IF9fYXNtX18oIiQxOCIpOwkJCVwKLQkJcmVnaXN0ZXIgbG9uZyBfc2NfMTkgX19hc21fXygiJDE5Iik7CQkJXAotCQlyZWdpc3RlciBsb25nIF9zY18yMCBfX2FzbV9fKCIkMjAiKTsJCQlcCi0JCXJlZ2lzdGVyIGxvbmcgX3NjXzIxIF9fYXNtX18oIiQyMSIpOwkJCVwKLQkJCQkJCQkJCVwKLQkJX3NjXzAgPSBfX05SXyMjbmFtZTsJCQkJCVwKLQkJX3NjXzE2ID0gKGxvbmcpIChhcmcxKTsJCQkJCVwKLQkJX3NjXzE3ID0gKGxvbmcpIChhcmcyKTsJCQkJCVwKLQkJX3NjXzE4ID0gKGxvbmcpIChhcmczKTsJCQkJCVwKLQkJX3NjXzE5ID0gKGxvbmcpIChhcmc0KTsJCQkJCVwKLQkJX3NjXzIwID0gKGxvbmcpIChhcmc1KTsJCQkJCVwKLQkJX3NjXzIxID0gKGxvbmcpIChhcmc2KTsJCQkJCVwKLQkJX19hc21fXygiY2FsbHN5cyAjICUwICUxICUyICUzICU0ICU1ICU2ICU3ICU4IgkJXAotCQkJOiAiPXIiKF9zY18wKSwgIj1yIihfc2NfMTkpCQkJXAotCQkJOiAiMCIoX3NjXzApLCAiciIoX3NjXzE2KSwgInIiKF9zY18xNyksCQlcCi0JCQkgICJyIihfc2NfMTgpLCAiMSIoX3NjXzE5KSwgInIiKF9zY18yMCksICJyIihfc2NfMjEpIFwKLQkJCTogX3N5c2NhbGxfY2xvYmJlcnMpOwkJCQlcCi0JCV9zY19yZXQgPSBfc2NfMCwgX3NjX2VyciA9IF9zY18xOTsJCQlcCi0JfQkJCQkJCQkJXAotCV9zeXNjYWxsX3JldHVybih0eXBlKTsJCQkJCQlcCi19Ci0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NUQVQ2NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYWFlYzIwMDAvbWVtb3J5LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hYWVjMjAwMC9tZW1vcnkuaAppbmRleCAyNGI1MWNjLi45ZWNlYjQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hYWVjMjAwMC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hYWVjMjAwMC9tZW1vcnkuaApAQCAtMTcsOCArMTcsNiBAQAogI2RlZmluZSBfX3ZpcnRfdG9fYnVzKHgpCV9fdmlydF90b19waHlzKHgpCiAjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJX19waHlzX3RvX3ZpcnQoeCkKIAotI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KLQogLyoKICAqIFRoZSBub2RlcyBhcmUgdGhlIGZvbGxvd2luZ3M6CiAgKgpAQCAtMjcsNDIgKzI1LDYgQEAKICAqICAgbm9kZSAyOiAweGY4MDAuMDAwMCAtIDB4ZmJmZi5mZmZmCiAgKiAgIG5vZGUgMzogMHhmYzAwLjAwMDAgLSAweGZmZmYuZmZmZgogICovCi0KLS8qCi0gKiBHaXZlbiBhIGtlcm5lbCBhZGRyZXNzLCBmaW5kIHRoZSBob21lIG5vZGUgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5LgotICovCi0jZGVmaW5lIEtWQUREUl9UT19OSUQoYWRkcikgXAotCSgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpIC0gUEFHRV9PRkZTRVQpID4+IE5PREVfTUFYX01FTV9TSElGVCkKLQotLyoKLSAqIEdpdmVuIGEgcGFnZSBmcmFtZSBudW1iZXIsIGNvbnZlcnQgaXQgdG8gYSBub2RlIGlkLgotICovCi0jZGVmaW5lIFBGTl9UT19OSUQocGZuKSBcCi0JKCgocGZuKSAtIFBIWVNfUEZOX09GRlNFVCkgPj4gKE5PREVfTUFYX01FTV9TSElGVCAtIFBBR0VfU0hJRlQpKQotCi0vKgotICogR2l2ZW4gYSBrYWRkciwgQUREUl9UT19NQVBCQVNFIGZpbmRzIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJuIHRoZSBtZW1fbWFwIG9mIHRoYXQgbm9kZS4KLSAqLwotI2RlZmluZSBBRERSX1RPX01BUEJBU0Uoa2FkZHIpICBOT0RFX01FTV9NQVAoS1ZBRERSX1RPX05JRChrYWRkcikpCi0KLS8qCi0gKiBHaXZlbiBhIHBhZ2UgZnJhbWUgbnVtYmVyLCBmaW5kIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJuIHRoZSBtZW1fbWFwIG9mIHRoYXQgbm9kZS4KLSAqLwotI2RlZmluZSBQRk5fVE9fTUFQQkFTRShwZm4pICAgICBOT0RFX01FTV9NQVAoUEZOX1RPX05JRChwZm4pKQotCi0vKgotICogIEdpdmVuIGEga2FkZHIsIExPQ0FMX01FTV9NQVAgZmluZHMgdGhlIG93bmluZyBub2RlIG9mIHRoZSBtZW1vcnkKLSAqICBhbmQgcmV0dXJucyB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgYXBwcm9wcmlhdGUgcGFnZSBpbiB0aGUKLSAqICBub2RlJ3MgbWVtX21hcC4KLSAqLwotI2RlZmluZSBMT0NBTF9NQVBfTlIoYWRkcikgXAotICAgICAgICAoKCh1bnNpZ25lZCBsb25nKShhZGRyKSAmIChOT0RFX01BWF9NRU1fU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUKQotCi0jZGVmaW5lIE5PREVfTUFYX01FTV9TSElGVAkyNgotI2RlZmluZSBOT0RFX01BWF9NRU1fU0laRQkoMSA8PCBOT0RFX01BWF9NRU1fU0hJRlQpCi0KLSNlbmRpZiAvKiBDT05GSUdfRElTQ09OVElHTUVNICovCisjZGVmaW5lIE5PREVfTUVNX1NJWkVfQklUUwkyNgogCiAjZW5kaWYgLyogX19BU01fQVJDSF9NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX2FpYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX2FpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2N2U2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfYWljLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9haWMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKKyAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQorICoKKyAqIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChBSUMpIC0gU3lzdGVtIHBlcmlwaGVyYWxzIHJlZ2lzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFSTTkyMDAgZGF0YXNoZWV0IHJldmlzaW9uIEUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFfQUlDX0gKKyNkZWZpbmUgQVQ5MV9BSUNfSAorCisjZGVmaW5lIEFUOTFfQUlDX1NNUihuKQkJKEFUOTFfQUlDICsgKChuKSAqIDQpKQkvKiBTb3VyY2UgTW9kZSBSZWdpc3RlcnMgMC0zMSAqLworI2RlZmluZQkJQVQ5MV9BSUNfUFJJT1IJCSg3IDw8IDApCQkvKiBQcmlvcml0eSBMZXZlbCAqLworI2RlZmluZQkJQVQ5MV9BSUNfU1JDVFlQRQkoMyA8PCA1KQkJLyogSW50ZXJydXB0IFNvdXJjZSBUeXBlICovCisjZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9MT1cJCSgwIDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9GQUxMSU5HCSgxIDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9ISUdICQkoMiA8PCA1KQorI2RlZmluZQkJCUFUOTFfQUlDX1NSQ1RZUEVfUklTSU5HCQkoMyA8PCA1KQorCisjZGVmaW5lIEFUOTFfQUlDX1NWUihuKQkJKEFUOTFfQUlDICsgMHg4MCArICgobikgKiA0KSkJLyogU291cmNlIFZlY3RvciBSZWdpc3RlcnMgMC0zMSAqLworI2RlZmluZSBBVDkxX0FJQ19JVlIJCShBVDkxX0FJQyArIDB4MTAwKQkvKiBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfQUlDX0ZWUgkJKEFUOTFfQUlDICsgMHgxMDQpCS8qIEZhc3QgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0FJQ19JU1IJCShBVDkxX0FJQyArIDB4MTA4KQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0FJQ19JUlFJRAkJKDB4MWYgPDwgMCkJCS8qIEN1cnJlbnQgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKworI2RlZmluZSBBVDkxX0FJQ19JUFIJCShBVDkxX0FJQyArIDB4MTBjKQkvKiBJbnRlcnJ1cHQgUGVuZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0FJQ19JTVIJCShBVDkxX0FJQyArIDB4MTEwKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0FJQ19DSVNSCQkoQVQ5MV9BSUMgKyAweDExNCkJLyogQ29yZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0FJQ19ORklRCQkoMSA8PCAwKQkJLyogbkZJUSBTdGF0dXMgKi8KKyNkZWZpbmUJCUFUOTFfQUlDX05JUlEJCSgxIDw8IDEpCQkvKiBuSVJRIFN0YXR1cyAqLworCisjZGVmaW5lIEFUOTFfQUlDX0lFQ1IJCShBVDkxX0FJQyArIDB4MTIwKQkvKiBJbnRlcnJ1cHQgRW5hYmxlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9BSUNfSURDUgkJKEFUOTFfQUlDICsgMHgxMjQpCS8qIEludGVycnVwdCBEaXNhYmxlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9BSUNfSUNDUgkJKEFUOTFfQUlDICsgMHgxMjgpCS8qIEludGVycnVwdCBDbGVhciBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfQUlDX0lTQ1IJCShBVDkxX0FJQyArIDB4MTJjKQkvKiBJbnRlcnJ1cHQgU2V0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9BSUNfRU9JQ1IJCShBVDkxX0FJQyArIDB4MTMwKQkvKiBFbmQgb2YgSW50ZXJydXB0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9BSUNfU1BVCQkoQVQ5MV9BSUMgKyAweDEzNCkJLyogU3B1cmlvdXMgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0FJQ19EQ1IJCShBVDkxX0FJQyArIDB4MTM4KQkvKiBEZWJ1ZyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0FJQ19EQ1JfUFJPVAkoMSA8PCAwKQkJLyogUHJvdGVjdGlvbiBNb2RlICovCisjZGVmaW5lCQlBVDkxX0FJQ19EQ1JfR01TSwkoMSA8PCAxKQkJLyogR2VuZXJhbCBNYXNrICovCisKKyNkZWZpbmUgQVQ5MV9BSUNfRkZFUgkJKEFUOTFfQUlDICsgMHgxNDApCS8qIEZhc3QgRm9yY2luZyBFbmFibGUgUmVnaXN0ZXIgW1NBTTkgb25seV0gKi8KKyNkZWZpbmUgQVQ5MV9BSUNfRkZEUgkJKEFUOTFfQUlDICsgMHgxNDQpCS8qIEZhc3QgRm9yY2luZyBEaXNhYmxlIFJlZ2lzdGVyIFtTQU05IG9ubHldICovCisjZGVmaW5lIEFUOTFfQUlDX0ZGU1IJCShBVDkxX0FJQyArIDB4MTQ4KQkvKiBGYXN0IEZvcmNpbmcgU3RhdHVzIFJlZ2lzdGVyIFtTQU05IG9ubHldICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX2RiZ3UuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9kYmd1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiOGIyNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9kYmd1LmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9kYmd1LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSXZhbiBLb2tzaGF5c2t5CisgKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKKyAqCisgKiBEZWJ1ZyBVbml0IChEQkdVKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdpc3RlcnMuCisgKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX0RCR1VfSAorI2RlZmluZSBBVDkxX0RCR1VfSAorCisjZGVmaW5lIEFUOTFfREJHVV9DUgkJKEFUOTFfREJHVSArIDB4MDApCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX01SCQkoQVQ5MV9EQkdVICsgMHgwNCkJLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfSUVSCQkoQVQ5MV9EQkdVICsgMHgwOCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9EQkdVX1RYUkRZCQkoMSA8PCAxKQkJLyogVHJhbnNtaXR0ZXIgUmVhZHkgKi8KKyNkZWZpbmUJCUFUOTFfREJHVV9UWEVNUFRZCSgxIDw8IDkpCQkvKiBUcmFuc21pdHRlciBFbXB0eSAqLworI2RlZmluZSBBVDkxX0RCR1VfSURSCQkoQVQ5MV9EQkdVICsgMHgwYykJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0lNUgkJKEFUOTFfREJHVSArIDB4MTApCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9TUgkJKEFUOTFfREJHVSArIDB4MTQpCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfUkhSCQkoQVQ5MV9EQkdVICsgMHgxOCkJLyogUmVjZWl2ZXIgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfVEhSCQkoQVQ5MV9EQkdVICsgMHgxYykJLyogVHJhbnNtaXR0ZXIgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfQlJHUgkJKEFUOTFfREJHVSArIDB4MjApCS8qIEJhdWQgUmF0ZSBHZW5lcmF0b3IgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBBVDkxX0RCR1VfQ0lEUgkJKEFUOTFfREJHVSArIDB4NDApCS8qIENoaXAgSUQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0VYSUQJCShBVDkxX0RCR1UgKyAweDQ0KQkvKiBDaGlwIElEIEV4dGVuc2lvbiBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9DSURSX1ZFUlNJT04JKDB4MWYgPDwgMCkJCS8qIFZlcnNpb24gb2YgdGhlIERldmljZSAqLworI2RlZmluZQkJQVQ5MV9DSURSX0VQUk9DCQkoNyAgICA8PCA1KQkJLyogRW1iZWRkZWQgUHJvY2Vzc29yICovCisjZGVmaW5lCQlBVDkxX0NJRFJfTlZQU0laCSgweGYgIDw8IDgpCQkvKiBOb252b2xhdGlsZSBQcm9ncmFtIE1lbW9yeSBTaXplICovCisjZGVmaW5lCQlBVDkxX0NJRFJfTlZQU0laMgkoMHhmICA8PCAxMikJCS8qIFNlY29uZCBOb252b2xhdGlsZSBQcm9ncmFtIE1lbW9yeSBTaXplICovCisjZGVmaW5lCQlBVDkxX0NJRFJfU1JBTVNJWgkoMHhmICA8PCAxNikJCS8qIEludGVybmFsIFNSQU0gU2l6ZSAqLworI2RlZmluZQkJQVQ5MV9DSURSX0FSQ0gJCSgweGZmIDw8IDIwKQkJLyogQXJjaGl0ZWN0dXJlIElkZW50aWZpZXIgKi8KKyNkZWZpbmUJCUFUOTFfQ0lEUl9OVlBUWVAJKDcgICAgPDwgMjgpCQkvKiBOb252b2xhdGlsZSBQcm9ncmFtIE1lbW9yeSBUeXBlICovCisjZGVmaW5lCQlBVDkxX0NJRFJfRVhUCQkoMSAgICA8PCAzMSkJCS8qIEV4dGVuc2lvbiBGbGFnICovCisKKyNkZWZpbmUgQVQ5MV9EQkdVX0ZOUgkJKEFUOTFfREJHVSArIDB4NDgpCS8qIEZvcmNlIE5UUlNUIFJlZ2lzdGVyIFtTQU05IG9ubHldICovCisjZGVmaW5lCQlBVDkxX0RCR1VfRk5UUlNUCSgxIDw8IDApCQkvKiBGb3JjZSBOVFJTVCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9lY2MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9lY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRmMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX2VjYy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfZWNjLmgKKyAqCisgKiBFcnJvciBDb3JyZWN0ZWQgQ29kZSBDb250cm9sbGVyIChFQ0MpIC0gU3lzdGVtIHBlcmlwaGVyYWxzIHJlZ3N0ZXJzLgorICogQmFzZWQgb24gQVQ5MVNBTTkyNjAgZGF0YXNoZWV0IHJldmlzaW9uIEIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFfRUNDX0gKKyNkZWZpbmUgQVQ5MV9FQ0NfSAorCisjZGVmaW5lIEFUOTFfRUNDX0NSCQkoQVQ5MV9FQ0MgKyAweDAwKQkvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0VDQ19SU1QJCSgxIDw8IDApIAkJLyogUmVzZXQgcGFyaXR5ICovCisKKyNkZWZpbmUgQVQ5MV9FQ0NfTVIJCShBVDkxX0VDQyArIDB4MDQpCS8qIE1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRUNDX1BBR0VTSVpFCSgzIDw8IDApCQkvKiBQYWdlIFNpemUgKi8KKyNkZWZpbmUJCQlBVDkxX0VDQ19QQUdFU0laRV81MjgJCSgwKQorI2RlZmluZQkJCUFUOTFfRUNDX1BBR0VTSVpFXzEwNTYJCSgxKQorI2RlZmluZQkJCUFUOTFfRUNDX1BBR0VTSVpFXzIxMTIJCSgyKQorI2RlZmluZQkJCUFUOTFfRUNDX1BBR0VTSVpFXzQyMjQJCSgzKQorCisjZGVmaW5lIEFUOTFfRUNDX1NSCQkoQVQ5MV9FQ0MgKyAweDA4KSAJLyogU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0VDQ19SRUNFUlIJCSgxIDw8IDApCQkvKiBSZWNvdmVyYWJsZSBFcnJvciAqLworI2RlZmluZQkJQVQ5MV9FQ0NfRUNDRVJSCQkoMSA8PCAxKQkJLyogRUNDIFNpbmdsZSBCaXQgRXJyb3IgKi8KKyNkZWZpbmUJCUFUOTFfRUNDX01VTEVSUgkJKDEgPDwgMikJCS8qIE11bHRpcGxlIEVycm9ycyAqLworCisjZGVmaW5lIEFUOTFfRUNDX1BSCQkoQVQ5MV9FQ0MgKyAweDBjKSAJLyogUGFyaXR5IHJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0VDQ19CSVRBRERSCSgweGYgPDwgMCkJCS8qIEJpdCBFcnJvciBBZGRyZXNzICovCisjZGVmaW5lCQlBVDkxX0VDQ19XT1JEQUREUgkoMHhmZmYgPDwgNCkJCS8qIFdvcmQgRXJyb3IgQWRkcmVzcyAqLworCisjZGVmaW5lIEFUOTFfRUNDX05QUgkJKEFUOTFfRUNDICsgMHgxMCkgCS8qIE5QYXJpdHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRUNDX05QQVJJVFkJKDB4ZmZmZiA8PCAwKQkJLyogTlBhcml0eSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9sY2RjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfbGNkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmZjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfbGNkYy5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX2xjZGMuaAorICoKKyAqIExDRCBDb250cm9sbGVyIChMQ0RDKS4KKyAqIEJhc2VkIG9uIEFUOTFTQU05MjYxIGRhdGFzaGVldCByZXZpc2lvbiBFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX0xDRENfSAorI2RlZmluZSBBVDkxX0xDRENfSAorCisjZGVmaW5lIEFUOTFfTENEQ19ETUFCQUREUjEJMHgwMAkJLyogRE1BIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAxICovCisjZGVmaW5lIEFUOTFfTENEQ19ETUFCQUREUjIJMHgwNAkJLyogRE1BIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAyICovCisjZGVmaW5lIEFUOTFfTENEQ19ETUFGUk1QVDEJMHgwOAkJLyogRE1BIEZyYW1lIFBvaW50ZXIgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBBVDkxX0xDRENfRE1BRlJNUFQyCTB4MGMJCS8qIERNQSBGcmFtZSBQb2ludGVyIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgQVQ5MV9MQ0RDX0RNQUZSTUFERDEJMHgxMAkJLyogRE1BIEZyYW1lIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBBVDkxX0xDRENfRE1BRlJNQUREMgkweDE0CQkvKiBETUEgRnJhbWUgQWRkcmVzcyBSZWdpc3RlciAyICovCisKKyNkZWZpbmUgQVQ5MV9MQ0RDX0RNQUZSTUNGRwkweDE4CQkvKiBETUEgRnJhbWUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX0ZSU0laRQkoMHg3ZmZmZmYgPDwgIDApCS8qIEZyYW1lIFNpemUgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19CTEVOR1RICSgweDdmICAgICA8PCAyNCkJLyogQnVyc3QgTGVuZ3RoICovCisKKyNkZWZpbmUgQVQ5MV9MQ0RDX0RNQUNPTgkweDFjCQkvKiBETUEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX0RNQUVOCQkoMHgxIDw8IDApCS8qIERNQSBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19ETUFSU1QJKDB4MSA8PCAxKQkvKiBETUEgUmVzZXQgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19ETUFCVVNZCSgweDEgPDwgMikJLyogRE1BIEJ1c3kgKi8KKworI2RlZmluZSBBVDkxX0xDRENfTENEQ09OMQkweDA4MDAJCS8qIExDRCBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19CWVBBU1MJKDEgICAgIDw8ICAwKQkvKiBCeXBhc3MgbGNkX2RvdGNrIGRpdmlkZXIgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19DTEtWQUwJKDB4MWZmIDw8IDEyKQkvKiBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCQlBVDkxX0xDRENfTElOQ05UCSgweDdmZiA8PCAyMSkJLyogTGluZSBDb3VudGVyICovCisKKyNkZWZpbmUgQVQ5MV9MQ0RDX0xDRENPTjIJMHgwODA0CQkvKiBMQ0QgQ29udHJvbCBSZWdpc3RlciAyICovCisjZGVmaW5lCQlBVDkxX0xDRENfRElTVFlQRQkoMyA8PCAwKQkvKiBEaXNwbGF5IFR5cGUgKi8KKyNkZWZpbmUJCQlBVDkxX0xDRENfRElTVFlQRV9TVE5NT05PCSgwIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX0RJU1RZUEVfU1ROQ09MT1IJKDEgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX0xDRENfRElTVFlQRV9URlQJCSgyIDw8IDApCisjZGVmaW5lCQlBVDkxX0xDRENfU0NBTk1PRAkoMSA8PCAyKQkvKiBTY2FuIE1vZGUgKi8KKyNkZWZpbmUJCQlBVDkxX0xDRENfU0NBTk1PRF9TSU5HTEUJKDAgPDwgMikKKyNkZWZpbmUJCQlBVDkxX0xDRENfU0NBTk1PRF9EVUFMCQkoMSA8PCAyKQorI2RlZmluZQkJQVQ5MV9MQ0RDX0lGV0lEVEgJKDMgPDwgMykJLypJbnRlcmZhY2UgV2lkdGggKi8KKyNkZWZpbmUJCQlBVDkxX0xDRENfSUZXSURUSF80CQkoMCA8PCAzKQorI2RlZmluZQkJCUFUOTFfTENEQ19JRldJRFRIXzgJCSgxIDw8IDMpCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX0lGV0lEVEhfMTYJCSgyIDw8IDMpCisjZGVmaW5lCQlBVDkxX0xDRENfUElYRUxTSVpFCSg3IDw8IDUpCS8qIEJpdHMgcGVyIHBpeGVsICovCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX1BJWEVMU0laRV8xCQkoMCA8PCA1KQorI2RlZmluZQkJCUFUOTFfTENEQ19QSVhFTFNJWkVfMgkJKDEgPDwgNSkKKyNkZWZpbmUJCQlBVDkxX0xDRENfUElYRUxTSVpFXzQJCSgyIDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX1BJWEVMU0laRV84CQkoMyA8PCA1KQorI2RlZmluZQkJCUFUOTFfTENEQ19QSVhFTFNJWkVfMTYJCSg0IDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX1BJWEVMU0laRV8yNAkJKDUgPDwgNSkKKyNkZWZpbmUJCUFUOTFfTENEQ19JTlZWRAkJKDEgPDwgOCkJLyogTENEIERhdGEgcG9sYXJpdHkgKi8KKyNkZWZpbmUJCQlBVDkxX0xDRENfSU5WVkRfTk9STUFMCQkoMCA8PCA4KQorI2RlZmluZQkJCUFUOTFfTENEQ19JTlZWRF9JTlZFUlRFRAkoMSA8PCA4KQorI2RlZmluZQkJQVQ5MV9MQ0RDX0lOVkZSQU1FCSgxIDw8IDkgKQkvKiBMQ0QgVlN5bmMgcG9sYXJpdHkgKi8KKyNkZWZpbmUJCQlBVDkxX0xDRENfSU5WRlJBTUVfTk9STUFMCSgwIDw8IDkpCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX0lOVkZSQU1FX0lOVkVSVEVECSgxIDw8IDkpCisjZGVmaW5lCQlBVDkxX0xDRENfSU5WTElORQkoMSA8PCAxMCkJLyogTENEIEhTeW5jIHBvbGFyaXR5ICovCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX0lOVkxJTkVfTk9STUFMCSgwIDw8IDEwKQorI2RlZmluZQkJCUFUOTFfTENEQ19JTlZMSU5FX0lOVkVSVEVECSgxIDw8IDEwKQorI2RlZmluZQkJQVQ5MV9MQ0RDX0lOVkNMSwkoMSA8PCAxMSkJLyogTENEIGRvdGNsayBwb2xhcml0eSAqLworI2RlZmluZQkJCUFUOTFfTENEQ19JTlZDTEtfTk9STUFMCQkoMCA8PCAxMSkKKyNkZWZpbmUJCQlBVDkxX0xDRENfSU5WQ0xLX0lOVkVSVEVECSgxIDw8IDExKQorI2RlZmluZQkJQVQ5MV9MQ0RDX0lOVkRWQUwJKDEgPDwgMTIpCS8qIExDRCBkdmFsIHBvbGFyaXR5ICovCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX0lOVkRWQUxfTk9STUFMCSgwIDw8IDEyKQorI2RlZmluZQkJCUFUOTFfTENEQ19JTlZEVkFMX0lOVkVSVEVECSgxIDw8IDEyKQorI2RlZmluZQkJQVQ5MV9MQ0RDX0NMS01PRAkoMSA8PCAxNSkJLyogTENEIGRvdGNsayBtb2RlICovCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX0NMS01PRF9BQ1RJVkVESVNQTEFZCSgwIDw8IDE1KQorI2RlZmluZQkJCUFUOTFfTENEQ19DTEtNT0RfQUxXQVlTQUNUSVZFCSgxIDw8IDE1KQorI2RlZmluZQkJQVQ5MV9MQ0RDX01FTU9SCQkoMSA8PCAzMSkJLyogTWVtb3J5IE9yZGVyaW5nIEZvcm1hdCAqLworI2RlZmluZQkJCUFUOTFfTENEQ19NRU1PUl9CSUcJCSgwIDw8IDMxKQorI2RlZmluZQkJCUFUOTFfTENEQ19NRU1PUl9MSVRUTEUJCSgxIDw8IDMxKQorCisjZGVmaW5lIEFUOTFfTENEQ19USU0xCQkweDA4MDgJCS8qIExDRCBUaW1pbmcgUmVnaXN0ZXIgMSAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX1ZGUAkJKDB4ZmYgPDwgIDApCS8qIFZlcnRpY2FsIEZyb250IFBvcmNoICovCisjZGVmaW5lCQlBVDkxX0xDRENfVkJQCQkoMHhmZiA8PCAgOCkJLyogVmVydGljYWwgQmFjayBQb3JjaCAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX1ZQVwkJKDB4M2YgPDwgMTYpCS8qIFZlcnRpY2FsIFN5bmNocm9uaXphdGlvbiBQdWxzZSBXaWR0aCAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX1ZIRExZCQkoMHhmICA8PCAyNCkJLyogVmVydGljYWwgdG8gSG9yaXpvbnRhbCBEZWxheSAqLworCisjZGVmaW5lIEFUOTFfTENEQ19USU0yCQkweDA4MGMJCS8qIExDRCBUaW1pbmcgUmVnaXN0ZXIgMiAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX0hCUAkJKDB4ZmYgIDw8ICAwKQkvKiBIb3Jpem9udGFsIEJhY2sgUG9yY2ggKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19IUFcJCSgweDNmICA8PCAgOCkJLyogSG9yaXpvbnRhbCBTeW5jaHJvbml6YXRpb24gUHVsc2UgV2lkdGggKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19IRlAJCSgweDdmZiA8PCAyMSkJLyogSG9yaXpvbnRhbCBGcm9udCBQb3JjaCAqLworCisjZGVmaW5lIEFUOTFfTENEQ19MQ0RGUk1DRkcJMHgwODEwCQkvKiBMQ0QgRnJhbWUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX0xJTkVWQUwJKDB4N2ZmIDw8ICAwKQkvKiBWZXJ0aWNhbCBTaXplIG9mIExDRCBNb2R1bGUgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19IT1pWQUwJKDB4N2ZmIDw8IDIxKQkvKiBIb3Jpem9udGFsIFNpemUgb2YgTENEIE1vZHVsZSAqLworCisjZGVmaW5lIEFUOTFfTENEQ19GSUZPCQkweDA4MTQJCS8qIExDRCBGSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0xDRENfRklGT1RICSgweGZmZmYpCS8qIEZJRk8gVGhyZXNob2xkICovCisKKyNkZWZpbmUgQVQ5MV9MQ0RDX0RQMV8yCQkweDA4MWMJCS8qIERpdGhlcmluZyBQYXR0ZXJuIERQMV8yIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfTENEQ19EUDRfNwkJMHgwODIwCQkvKiBEaXRoZXJpbmcgUGF0dGVybiBEUDRfNyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0xDRENfRFAzXzUJCTB4MDgyNAkJLyogRGl0aGVyaW5nIFBhdHRlcm4gRFAzXzUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9MQ0RDX0RQMl8zCQkweDA4MjgJCS8qIERpdGhlcmluZyBQYXR0ZXJuIERQMl8zIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfTENEQ19EUDVfNwkJMHgwODJjCQkvKiBEaXRoZXJpbmcgUGF0dGVybiBEUDVfNyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0xDRENfRFAzXzQJCTB4MDgzMAkJLyogRGl0aGVyaW5nIFBhdHRlcm4gRFAzXzQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9MQ0RDX0RQNF81CQkweDA4MzQJCS8qIERpdGhlcmluZyBQYXR0ZXJuIERQNF81IFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfTENEQ19EUDZfNwkJMHgwODM4CQkvKiBEaXRoZXJpbmcgUGF0dGVybiBEUDZfNyBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX0RQMV8yX1ZBTAkoMHhmZikKKyNkZWZpbmUJCUFUOTFfTENEQ19EUDRfN19WQUwJKDB4ZmZmZmZmZikKKyNkZWZpbmUJCUFUOTFfTENEQ19EUDNfNV9WQUwJKDB4ZmZmZmYpCisjZGVmaW5lCQlBVDkxX0xDRENfRFAyXzNfVkFMCSgweGZmZikKKyNkZWZpbmUJCUFUOTFfTENEQ19EUDVfN19WQUwJKDB4ZmZmZmZmZikKKyNkZWZpbmUJCUFUOTFfTENEQ19EUDNfNF9WQUwJKDB4ZmZmZikKKyNkZWZpbmUJCUFUOTFfTENEQ19EUDRfNV9WQUwJKDB4ZmZmZmYpCisjZGVmaW5lCQlBVDkxX0xDRENfRFA2XzdfVkFMCSgweGZmZmZmZmYpCisKKyNkZWZpbmUgQVQ5MV9MQ0RDX1BXUkNPTgkweDA4M2MJCS8qIFBvd2VyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19QV1IJCSgxICAgIDw8ICAwKQkvKiBMQ0QgTW9kdWxlIFBvd2VyIENvbnRyb2wgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19HVUFSRFQJKDB4N2YgPDwgIDEpCS8qIERlbGF5IGluIEZyYW1lIFBlcmlvZCAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX0JVU1kJCSgxICAgIDw8IDMxKQkvKiBMQ0QgQnVzeSAqLworCisjZGVmaW5lIEFUOTFfTENEQ19DT05UUkFTVF9DVFIJMHgwODQwCQkvKiBDb250cmFzdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX0xDRENfUFMJCSgzIDw8IDApCS8qIENvbnRyYXN0IENvdW50ZXIgUHJlc2NhbGVyICovCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX1BTX0RJVjEJCSgwIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX1BTX0RJVjIJCSgxIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX1BTX0RJVjQJCSgyIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9MQ0RDX1BTX0RJVjgJCSgzIDw8IDApCisjZGVmaW5lCQlBVDkxX0xDRENfUE9MCQkoMSA8PCAyKQkvKiBQb2xhcml0eSBvZiBvdXRwdXQgUHVsc2UgKi8KKyNkZWZpbmUJCQlBVDkxX0xDRENfUE9MX05FR0FUSVZFCQkoMCA8PCAyKQorI2RlZmluZQkJCUFUOTFfTENEQ19QT0xfUE9TSVRJVkUJCSgxIDw8IDIpCisjZGVmaW5lCQlBVDkxX0xDRENfRU5BCQkoMSA8PCAzKQkvKiBQV00gZ2VuZXJhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUJCQlBVDkxX0xDRENfRU5BX1BXTURJU0FCTEUJKDAgPDwgMykKKyNkZWZpbmUJCQlBVDkxX0xDRENfRU5BX1BXTUVOQUJMRQkJKDEgPDwgMykKKworI2RlZmluZSBBVDkxX0xDRENfQ09OVFJBU1RfVkFMCTB4MDg0NAkJLyogQ29udHJhc3QgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19DVkFMCQkoMHhmZikJCS8qIFBXTSBjb21wYXJlIHZhbHVlICovCisKKyNkZWZpbmUgQVQ5MV9MQ0RDX0lFUgkJMHgwODQ4CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfTENEQ19JRFIJCTB4MDg0YwkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9MQ0RDX0lNUgkJMHgwODUwCQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0xDRENfSVNSCQkweDA4NTQJCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9MQ0RDX0lDUgkJMHgwODU4CQkvKiBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19MTkkJCSgxIDw8IDApCS8qIExpbmUgSW50ZXJydXB0ICovCisjZGVmaW5lCQlBVDkxX0xDRENfTFNUTE5JCSgxIDw8IDEpCS8qIExhc3QgTGluZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19FT0ZJCQkoMSA8PCAyKQkvKiBETUEgRW5kIE9mIEZyYW1lIEludGVycnVwdCAqLworI2RlZmluZQkJQVQ5MV9MQ0RDX1VGTFdJCQkoMSA8PCA0KQkvKiBGSUZPIFVuZGVyZmxvdyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19PV1JJCQkoMSA8PCA1KQkvKiBGSUZPIE92ZXJ3cml0ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUFUOTFfTENEQ19NRVJJCQkoMSA8PCA2KQkvKiBETUEgTWVtb3J5IEVycm9yIEludGVycnVwdCAqLworCisjZGVmaW5lIEFUOTFfTENEQ19MVVRfKG4pCSgweDBjMDAgKyAoKG4pKjQpKQkvKiBQYWxldHRlIEVudHJ5IDAuLjI1NSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9tY2kuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9tY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTU1MmNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX21jaS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX21jaS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogTXVsdGlNZWRpYSBDYXJkIEludGVyZmFjZSAoTUNJKSByZWdpc3RlcnMuCisgKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBGLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX01DSV9ICisjZGVmaW5lIEFUOTFfTUNJX0gKKworI2RlZmluZSBBVDkxX01DSV9DUgkJMHgwMAkJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfTUNJRU4JCSgxIDw8ICAwKQkvKiBNdWx0aS1NZWRpYSBJbnRlcmZhY2UgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX01DSV9NQ0lESVMJCSgxIDw8ICAxKQkvKiBNdWx0aS1NZWRpYSBJbnRlcmZhY2UgRGlzYWJsZSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUFdTRU4JCSgxIDw8ICAyKQkvKiBQb3dlciBTYXZlIE1vZGUgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX01DSV9QV1NESVMJCSgxIDw8ICAzKQkvKiBQb3dlciBTYXZlIE1vZGUgRGlzYWJsZSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfU1dSU1QJCSgxIDw8ICA3KQkvKiBTb2Z0d2FyZSBSZXNldCAqLworCisjZGVmaW5lIEFUOTFfTUNJX01SCQkweDA0CQkvKiBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX01DSV9DTEtESVYJCSgweGZmICA8PCAgMCkJLyogQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUFdTRElWCQkoNyAgICAgPDwgIDgpCS8qIFBvd2VyIFNhdmluZyBEaXZpZGVyICovCisjZGVmaW5lCQlBVDkxX01DSV9QRENQQURWCSgxICAgICA8PCAxNCkJLyogUERDIFBhZGRpbmcgVmFsdWUgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1BEQ01PREUJKDEgICAgIDw8IDE1KQkvKiBQREMtb3JpZW50YXRlZCBNb2RlICovCisjZGVmaW5lCQlBVDkxX01DSV9CTEtMRU4JCSgweGZmZiA8PCAxOCkJLyogRGF0YSBCbG9jayBMZW5ndGggKi8KKworI2RlZmluZSBBVDkxX01DSV9EVE9SCQkweDA4CQkvKiBEYXRhIFRpbWVvdXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX0RUT0NZQwkJKDB4ZiA8PCAwKQkvKiBEYXRhIFRpbWVvdXQgQ3ljbGUgTnVtYmVyICovCisjZGVmaW5lCQlBVDkxX01DSV9EVE9NVUwJCSg3ICAgPDwgNCkJLyogRGF0YSBUaW1lb3V0IE11bHRpcGxpZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8xCQkoMCA8PCAgNCkKKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8xNgkJKDEgPDwgIDQpCisjZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfMTI4CQkoMiA8PCAgNCkKKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8yNTYJCSgzIDw8ICA0KQorI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzFLCQkoNCA8PCAgNCkKKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF80SwkJKDUgPDwgIDQpCisjZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfNjRLCQkoNiA8PCAgNCkKKyNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8xTQkJKDcgPDwgIDQpCisKKyNkZWZpbmUgQVQ5MV9NQ0lfU0RDUgkJMHgwYwkJLyogU0QgQ2FyZCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfU0RDU0VMCQkoMyA8PCAwKQkvKiBTRCBDYXJkIFNlbGVjdG9yICovCisjZGVmaW5lCQlBVDkxX01DSV9TRENCVVMJCSgxIDw8IDcpCS8qIDEtYml0IG9yIDQtYml0IGJ1cyAqLworCisjZGVmaW5lIEFUOTFfTUNJX0FSR1IJCTB4MTAJCS8qIEFyZ3VtZW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9NQ0lfQ01EUgkJMHgxNAkJLyogQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfQ01ETkIJCSgweDNmIDw8IDApCS8qIENvbW1hbmQgTnVtYmVyICovCisjZGVmaW5lCQlBVDkxX01DSV9SU1BUWVAJCSgzICAgIDw8IDYpCS8qIFJlc3BvbnNlIFR5cGUgKi8KKyNkZWZpbmUJCQlBVDkxX01DSV9SU1BUWVBfTk9ORQkoMCA8PCAgNikKKyNkZWZpbmUJCQlBVDkxX01DSV9SU1BUWVBfNDgJKDEgPDwgIDYpCisjZGVmaW5lCQkJQVQ5MV9NQ0lfUlNQVFlQXzEzNgkoMiA8PCAgNikKKyNkZWZpbmUJCUFUOTFfTUNJX1NQQ01ECQkoNyAgICA8PCA4KQkvKiBTcGVjaWFsIENvbW1hbmQgKi8KKyNkZWZpbmUJCQlBVDkxX01DSV9TUENNRF9OT05FCSgwIDw8ICA4KQorI2RlZmluZQkJCUFUOTFfTUNJX1NQQ01EX0lOSVQJKDEgPDwgIDgpCisjZGVmaW5lCQkJQVQ5MV9NQ0lfU1BDTURfU1lOQwkoMiA8PCAgOCkKKyNkZWZpbmUJCQlBVDkxX01DSV9TUENNRF9JQ01ECSg0IDw8ICA4KQorI2RlZmluZQkJCUFUOTFfTUNJX1NQQ01EX0lSRVNQCSg1IDw8ICA4KQorI2RlZmluZQkJQVQ5MV9NQ0lfT1BEQ01ECQkoMSA8PCAxMSkJLyogT3BlbiBEcmFpbiBDb21tYW5kICovCisjZGVmaW5lCQlBVDkxX01DSV9NQVhMQVQJCSgxIDw8IDEyKQkvKiBNYXggTGF0ZW5jeSBmb3IgQ29tbWFuZCB0byBSZXNwb25zZSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfVFJDTUQJCSgzIDw8IDE2KQkvKiBUcmFuc2ZlciBDb21tYW5kICovCisjZGVmaW5lCQkJQVQ5MV9NQ0lfVFJDTURfTk9ORQkoMCA8PCAxNikKKyNkZWZpbmUJCQlBVDkxX01DSV9UUkNNRF9TVEFSVAkoMSA8PCAxNikKKyNkZWZpbmUJCQlBVDkxX01DSV9UUkNNRF9TVE9QCSgyIDw8IDE2KQorI2RlZmluZQkJQVQ5MV9NQ0lfVFJESVIJCSgxIDw8IDE4KQkvKiBUcmFuc2ZlciBEaXJlY3Rpb24gKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1RSVFlQCQkoMyA8PCAxOSkJLyogVHJhbnNmZXIgVHlwZSAqLworI2RlZmluZQkJCUFUOTFfTUNJX1RSVFlQX0JMT0NLCSgwIDw8IDE5KQorI2RlZmluZQkJCUFUOTFfTUNJX1RSVFlQX01VTFRJUExFCSgxIDw8IDE5KQorI2RlZmluZQkJCUFUOTFfTUNJX1RSVFlQX1NUUkVBTQkoMiA8PCAxOSkKKworI2RlZmluZSBBVDkxX01DSV9SU1BSKG4pCSgweDIwICsgKChuKSAqIDQpKQkvKiBSZXNwb25zZSBSZWdpc3RlcnMgMC0zICovCisjZGVmaW5lIEFUOTFfTUNSX1JEUgkJMHgzMAkJLyogUmVjZWl2ZSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfTUNSX1REUgkJMHgzNAkJLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLworCisjZGVmaW5lIEFUOTFfTUNJX1NSCQkweDQwCQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX0NNRFJEWQkJKDEgPDwgIDApCS8qIENvbW1hbmQgUmVhZHkgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1JYUkRZCQkoMSA8PCAgMSkJLyogUmVjZWl2ZXIgUmVhZHkgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1RYUkRZCQkoMSA8PCAgMikJLyogVHJhbnNtaXQgUmVhZHkgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX0JMS0UJCSgxIDw8ICAzKQkvKiBEYXRhIEJsb2NrIEVuZGVkICovCisjZGVmaW5lCQlBVDkxX01DSV9EVElQCQkoMSA8PCAgNCkJLyogRGF0YSBUcmFuc2ZlciBpbiBQcm9ncmVzcyAqLworI2RlZmluZQkJQVQ5MV9NQ0lfTk9UQlVTWQkoMSA8PCAgNSkJLyogRGF0YSBOb3QgQnVzeSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfRU5EUlgJCSgxIDw8ICA2KQkvKiBFbmQgb2YgUlggQnVmZmVyICovCisjZGVmaW5lCQlBVDkxX01DSV9FTkRUWAkJKDEgPDwgIDcpCS8qIEVuZCBmbyBUWCBCdWZmZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1NESU9JUlFBCSgxIDw8ICA4KQkvKiBTRElPIEludGVycnVwdCBmb3IgU2xvdCBBICovCisjZGVmaW5lCQlBdDkxX01DSV9TRElPSVJRQgkoMSA8PCAgOSkJLyogU0RJTyBJbnRlcnJ1cHQgZm9yIFNsb3QgQiBbQVQ5MVJNOTIwMCBvbmx5XSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUlhCVUZGCQkoMSA8PCAxNCkJLyogUlggQnVmZmVyIEZ1bGwgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1RYQlVGRQkJKDEgPDwgMTUpCS8qIFRYIEJ1ZmZlciBFbXB0eSAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUklOREUJCSgxIDw8IDE2KQkvKiBSZXNwb25zZSBJbmRleCBFcnJvciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfUkRJUkUJCSgxIDw8IDE3KQkvKiBSZXNwb25zZSBEaXJlY3Rpb24gRXJyb3IgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1JDUkNFCQkoMSA8PCAxOCkJLyogUmVzcG9uc2UgQ1JDIEVycm9yICovCisjZGVmaW5lCQlBVDkxX01DSV9SRU5ERQkJKDEgPDwgMTkpCS8qIFJlc3BvbnNlIEVuZCBCaXQgRXJyb3IgKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1JUT0UJCSgxIDw8IDIwKQkvKiBSZXBvbnNlIFRpbWUtb3V0IEVycm9yICovCisjZGVmaW5lCQlBVDkxX01DSV9EQ1JDRQkJKDEgPDwgMjEpCS8qIERhdGEgQ1JDIEVycm9yICovCisjZGVmaW5lCQlBVDkxX01DSV9EVE9FCQkoMSA8PCAyMikJLyogRGF0YSBUaW1lLW91dCBFcnJvciAqLworI2RlZmluZQkJQVQ5MV9NQ0lfT1ZSRQkJKDEgPDwgMzApCS8qIE92ZXJydW4gKi8KKyNkZWZpbmUJCUFUOTFfTUNJX1VOUkUJCSgxIDw8IDMxKQkvKiBVbmRlcnJ1biAqLworCisjZGVmaW5lIEFUOTFfTUNJX0lFUgkJMHg0NAkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX01DSV9JRFIJCTB4NDgJCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfTUNJX0lNUgkJMHg0YwkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcGRjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcGRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkNmUwMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9wZGMuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3BkYy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogUGVyaXBoZXJhbCBEYXRhIENvbnRyb2xsZXIgKFBEQykgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MV9QRENfSAorI2RlZmluZSBBVDkxX1BEQ19ICisKKyNkZWZpbmUgQVQ5MV9QRENfUlBSCQkweDEwMAkvKiBSZWNlaXZlIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfUkNSCQkweDEwNAkvKiBSZWNlaXZlIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfVFBSCQkweDEwOAkvKiBUcmFuc21pdCBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfUERDX1RDUgkJMHgxMGMJLyogVHJhbnNtaXQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19STlBSCQkweDExMAkvKiBSZWNlaXZlIE5leHQgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19STkNSCQkweDExNAkvKiBSZWNlaXZlIE5leHQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19UTlBSCQkweDExOAkvKiBUcmFuc21pdCBOZXh0IFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfVE5DUgkJMHgxMWMJLyogVHJhbnNtaXQgTmV4dCBDb3VudGVyIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9QRENfUFRDUgkJMHgxMjAJLyogVHJhbnNmZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9QRENfUlhURU4JCSgxIDw8IDApCS8qIFJlY2VpdmVyIFRyYW5zZmVyIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9QRENfUlhURElTCQkoMSA8PCAxKQkvKiBSZWNlaXZlciBUcmFuc2ZlciBEaXNhYmxlICovCisjZGVmaW5lCQlBVDkxX1BEQ19UWFRFTgkJKDEgPDwgOCkJLyogVHJhbnNtaXR0ZXIgVHJhbnNmZXIgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1BEQ19UWFRESVMJCSgxIDw8IDkpCS8qIFRyYW5zbWl0dGVyIFRyYW5zZmVyIERpc2FibGUgKi8KKworI2RlZmluZSBBVDkxX1BEQ19QVFNSCQkweDEyNAkvKiBUcmFuc2ZlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcGlvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwZWFhMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9waW8uaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3Bpby5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogUGFyYWxsZWwgSS9PIENvbnRyb2xsZXIgKFBJTykgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MV9QSU9fSAorI2RlZmluZSBBVDkxX1BJT19ICisKKyNkZWZpbmUgUElPX1BFUgkJMHgwMAkvKiBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX1BEUgkJMHgwNAkvKiBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19QU1IJCTB4MDgJLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19PRVIJCTB4MTAJLyogT3V0cHV0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fT0RSCQkweDE0CS8qIE91dHB1dCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19PU1IJCTB4MTgJLyogT3V0cHV0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fSUZFUgkweDIwCS8qIEdsaXRjaCBJbnB1dCBGaWx0ZXIgRW5hYmxlICovCisjZGVmaW5lIFBJT19JRkRSCTB4MjQJLyogR2xpdGNoIElucHV0IEZpbHRlciBEaXNhYmxlICovCisjZGVmaW5lIFBJT19JRlNSCTB4MjgJLyogR2xpdGNoIElucHV0IEZpbHRlciBTdGF0dXMgKi8KKyNkZWZpbmUgUElPX1NPRFIJMHgzMAkvKiBTZXQgT3V0cHV0IERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX0NPRFIJMHgzNAkvKiBDbGVhciBPdXRwdXQgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fT0RTUgkweDM4CS8qIE91dHB1dCBEYXRhIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fUERTUgkweDNjCS8qIFBpbiBEYXRhIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fSUVSCQkweDQwCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX0lEUgkJMHg0NAkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fSU1SCQkweDQ4CS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19JU1IJCTB4NGMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fTURFUgkweDUwCS8qIE11bHRpLWRyaXZlciBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX01ERFIJMHg1NAkvKiBNdWx0aS1kcml2ZXIgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fTURTUgkweDU4CS8qIE11bHRpLWRyaXZlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX1BVRFIJMHg2MAkvKiBQdWxsLXVwIERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX1BVRVIJMHg2NAkvKiBQdWxsLXVwIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fUFVTUgkweDY4CS8qIFB1bGwtdXAgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19BU1IJCTB4NzAJLyogUGVyaXBoZXJhbCBBIFNlbGVjdCBSZWdpc3RlciAqLworI2RlZmluZSBQSU9fQlNSCQkweDc0CS8qIFBlcmlwaGVyYWwgQiBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX0FCU1IJMHg3OAkvKiBBQiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX09XRVIJMHhhMAkvKiBPdXRwdXQgV3JpdGUgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT19PV0RSCTB4YTQJLyogT3V0cHV0IFdyaXRlIERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElPX09XU1IJMHhhOAkvKiBPdXRwdXQgV3JpdGUgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3BpdC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3BpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzBkMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3BpdC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcGl0LmgKKyAqCisgKiBQZXJpb2RpYyBJbnRlcnZhbCBUaW1lciAoUElUKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFTQU05MjYxIGRhdGFzaGVldCByZXZpc2lvbiBELgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX1BJVF9ICisjZGVmaW5lIEFUOTFfUElUX0gKKworI2RlZmluZSBBVDkxX1BJVF9NUgkJKEFUOTFfUElUICsgMHgwMCkJLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9QSVRfUElUSUVOCQkoMSA8PCAyNSkJCS8qIFRpbWVyIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfUElUX1BJVEVOCQkoMSA8PCAyNCkJCS8qIFRpbWVyIEVuYWJsZWQgKi8KKyNkZWZpbmUJCUFUOTFfUElUX1BJVgkJKDB4ZmZmZmYpCQkvKiBQZXJpb2RpYyBJbnRlcnZhbCBWYWx1ZSAqLworCisjZGVmaW5lIEFUOTFfUElUX1NSCQkoQVQ5MV9QSVQgKyAweDA0KQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUElUX1BJVFMJCSgxIDw8IDApCQkvKiBUaW1lciBTdGF0dXMgKi8KKworI2RlZmluZSBBVDkxX1BJVF9QSVZSCQkoQVQ5MV9QSVQgKyAweDA4KQkvKiBQZXJpb2RpYyBJbnRlcnZhbCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BJVF9QSUlSCQkoQVQ5MV9QSVQgKyAweDBjKQkvKiBQZXJpb2RpYyBJbnRlcnZhbCBJbWFnZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9QSVRfUElDTlQJCSgweGZmZiA8PCAyMCkJCS8qIEludGVydmFsIENvdW50ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUElUX0NQSVYJCSgweGZmZmZmKQkJLyogSW52ZXJ2YWwgVmFsdWUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcG1jLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcG1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4YzNkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9wbWMuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3BtYy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sbGVyIChQTUMpIC0gU3lzdGVtIHBlcmlwaGVyYWxzIHJlZ2lzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFSTTkyMDAgZGF0YXNoZWV0IHJldmlzaW9uIEUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFfUE1DX0gKKyNkZWZpbmUgQVQ5MV9QTUNfSAorCisjZGVmaW5lCUFUOTFfUE1DX1NDRVIJCShBVDkxX1BNQyArIDB4MDApCS8qIFN5c3RlbSBDbG9jayBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9QTUNfU0NEUgkJKEFUOTFfUE1DICsgMHgwNCkJLyogU3lzdGVtIENsb2NrIERpc2FibGUgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlBVDkxX1BNQ19TQ1NSCQkoQVQ5MV9QTUMgKyAweDA4KQkvKiBTeXN0ZW0gQ2xvY2sgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0sJCSgxIDw8ICAwKQkJLyogUHJvY2Vzc29yIENsb2NrICovCisjZGVmaW5lCQlBVDkxUk05MjAwX1BNQ19VRFAJKDEgPDwgIDEpCQkvKiBVU0IgRGV2Y2ljZSBQb3J0IENsb2NrIFtBVDkxUk05MjAwIG9ubHldICovCisjZGVmaW5lCQlBVDkxUk05MjAwX1BNQ19NQ0tVRFAJKDEgPDwgIDIpCQkvKiBVU0IgRGV2aWNlIFBvcnQgTWFzdGVyIENsb2NrIEF1dG9tYXRpYyBEaXNhYmxlIG9uIFN1c3BlbmQgW0FUOTFSTTkyMDAgb25seV0gKi8KKyNkZWZpbmUJCUFUOTFSTTkyMDBfUE1DX1VIUAkoMSA8PCAgNCkJCS8qIFVTQiBIb3N0IFBvcnQgQ2xvY2sgW0FUOTFSTTkyMDAgb25seV0gKi8KKyNkZWZpbmUJCUFUOTFTQU05MjZ4X1BNQ19VSFAJKDEgPDwgIDYpCQkvKiBVU0IgSG9zdCBQb3J0IENsb2NrIFtBVDkxU0FNOTI2eCBvbmx5XSAqLworI2RlZmluZQkJQVQ5MVNBTTkyNnhfUE1DX1VEUAkoMSA8PCAgNykJCS8qIFVTQiBEZXZjaWNlIFBvcnQgQ2xvY2sgW0FUOTFTQU05MjZ4IG9ubHldICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0swCQkoMSA8PCAgOCkJCS8qIFByb2dyYW1tYWJsZSBDbG9jayAwICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0sxCQkoMSA8PCAgOSkJCS8qIFByb2dyYW1tYWJsZSBDbG9jayAxICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0syCQkoMSA8PCAxMCkJCS8qIFByb2dyYW1tYWJsZSBDbG9jayAyICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0szCQkoMSA8PCAxMSkJCS8qIFByb2dyYW1tYWJsZSBDbG9jayAzICovCisjZGVmaW5lCQlBVDkxX1BNQ19IQ0swCQkoMSA8PCAxNikJCS8qIEFIQiBDbG9jayAoVVNCIGhvc3QpIFtBVDkxU0FNOTI2MSBvbmx5XSAqLworI2RlZmluZQkJQVQ5MV9QTUNfSENLMQkJKDEgPDwgMTcpCQkvKiBBSEIgQ2xvY2sgKExDRCkgW0FUOTFTQU05MjYxIG9ubHldICovCisKKyNkZWZpbmUJQVQ5MV9QTUNfUENFUgkJKEFUOTFfUE1DICsgMHgxMCkJLyogUGVyaXBoZXJhbCBDbG9jayBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9QTUNfUENEUgkJKEFUOTFfUE1DICsgMHgxNCkJLyogUGVyaXBoZXJhbCBDbG9jayBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFUOTFfUE1DX1BDU1IJCShBVDkxX1BNQyArIDB4MTgpCS8qIFBlcmlwaGVyYWwgQ2xvY2sgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQVQ5MV9DS0dSX01PUgkJKEFUOTFfUE1DICsgMHgyMCkJLyogTWFpbiBPc2NpbGxhdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1BNQ19NT1NDRU4JCSgxICAgIDw8IDApCQkvKiBNYWluIE9zY2lsbGF0b3IgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1BNQ19PU0NCWVBBU1MJKDEgICAgPDwgMSkJCS8qIE9zY2lsbGF0b3IgQnlwYXNzIFtBVDkxU0FNOTI2eCBvbmx5XSAqLworI2RlZmluZQkJQVQ5MV9QTUNfT1NDT1VOVAkoMHhmZiA8PCA4KQkJLyogTWFpbiBPc2NpbGxhdG9yIFN0YXJ0LXVwIFRpbWUgKi8KKworI2RlZmluZQlBVDkxX0NLR1JfTUNGUgkJKEFUOTFfUE1DICsgMHgyNCkJLyogTWFpbiBDbG9jayBGcmVxdWVuY3kgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX01BSU5GCQkoMHhmZmZmIDw8ICAwKQkJLyogTWFpbiBDbG9jayBGcmVxdWVuY3kgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX01BSU5SRFkJKDEJPDwgMTYpCQkvKiBNYWluIENsb2NrIFJlYWR5ICovCisKKyNkZWZpbmUJQVQ5MV9DS0dSX1BMTEFSCQkoQVQ5MV9QTUMgKyAweDI4KQkvKiBQTEwgQSBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX0NLR1JfUExMQlIJCShBVDkxX1BNQyArIDB4MmMpCS8qIFBMTCBCIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1BNQ19ESVYJCSgweGZmICA8PCAgMCkJCS8qIERpdmlkZXIgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BMTENPVU5UCSgweDNmICA8PCAgOCkJCS8qIFBMTCBDb3VudGVyICovCisjZGVmaW5lCQlBVDkxX1BNQ19PVVQJCSgzICAgICA8PCAxNCkJCS8qIFBMTCBDbG9jayBGcmVxdWVuY3kgUmFuZ2UgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX01VTAkJKDB4N2ZmIDw8IDE2KQkJLyogUExMIE11bHRpcGxpZXIgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1VTQjk2TQkJKDEgICAgIDw8IDI4KQkJLyogRGl2aWRlciBieSAyIEVuYWJsZSAoUExMQiBvbmx5KSAqLworCisjZGVmaW5lCUFUOTFfUE1DX01DS1IJCShBVDkxX1BNQyArIDB4MzApCS8qIE1hc3RlciBDbG9jayBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9QTUNfQ1NTCQkoMyA8PCAgMCkJCS8qIE1hc3RlciBDbG9jayBTZWxlY3Rpb24gKi8KKyNkZWZpbmUJCQlBVDkxX1BNQ19DU1NfU0xPVwkJKDAgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1BNQ19DU1NfTUFJTgkJKDEgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1BNQ19DU1NfUExMQQkJKDIgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1BNQ19DU1NfUExMQgkJKDMgPDwgMCkKKyNkZWZpbmUJCUFUOTFfUE1DX1BSRVMJCSg3IDw8ICAyKQkJLyogTWFzdGVyIENsb2NrIFByZXNjYWxlciAqLworI2RlZmluZSAJCUFUOTFfUE1DX1BSRVNfMQkJCSgwIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9QTUNfUFJFU18yCQkJKDEgPDwgMikKKyNkZWZpbmUJCQlBVDkxX1BNQ19QUkVTXzQJCQkoMiA8PCAyKQorI2RlZmluZQkJCUFUOTFfUE1DX1BSRVNfOAkJCSgzIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9QTUNfUFJFU18xNgkJKDQgPDwgMikKKyNkZWZpbmUJCQlBVDkxX1BNQ19QUkVTXzMyCQkoNSA8PCAyKQorI2RlZmluZQkJCUFUOTFfUE1DX1BSRVNfNjQJCSg2IDw8IDIpCisjZGVmaW5lCQlBVDkxX1BNQ19NRElWCQkoMyA8PCAgOCkJCS8qIE1hc3RlciBDbG9jayBEaXZpc2lvbiAqLworI2RlZmluZQkJCUFUOTFfUE1DX01ESVZfMQkJCSgwIDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9QTUNfTURJVl8yCQkJKDEgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX1BNQ19NRElWXzMJCQkoMiA8PCA4KQorI2RlZmluZQkJCUFUOTFfUE1DX01ESVZfNAkJCSgzIDw8IDgpCisKKyNkZWZpbmUJQVQ5MV9QTUNfUENLUihuKQkoQVQ5MV9QTUMgKyAweDQwICsgKChuKSAqIDQpKQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMC0zIFJlZ2lzdGVycyAqLworCisjZGVmaW5lCUFUOTFfUE1DX0lFUgkJKEFUOTFfUE1DICsgMHg2MCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX1BNQ19JRFIJCShBVDkxX1BNQyArIDB4NjQpCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFUOTFfUE1DX1NSCQkoQVQ5MV9QTUMgKyAweDY4KQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX01PU0NTCQkoMSA8PCAgMCkJCS8qIE1PU0NTIEZsYWcgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX0xPQ0tBCQkoMSA8PCAgMSkJCS8qIFBMTEEgTG9jayAqLworI2RlZmluZQkJQVQ5MV9QTUNfTE9DS0IJCSgxIDw8ICAyKQkJLyogUExMQiBMb2NrICovCisjZGVmaW5lCQlBVDkxX1BNQ19NQ0tSRFkJCSgxIDw8ICAzKQkJLyogTWFzdGVyIENsb2NrICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0swUkRZCSgxIDw8ICA4KQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDAgKi8KKyNkZWZpbmUJCUFUOTFfUE1DX1BDSzFSRFkJKDEgPDwgIDkpCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMSAqLworI2RlZmluZQkJQVQ5MV9QTUNfUENLMlJEWQkoMSA8PCAxMCkJCS8qIFByb2dyYW1tYWJsZSBDbG9jayAyICovCisjZGVmaW5lCQlBVDkxX1BNQ19QQ0szUkRZCSgxIDw8IDExKQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDMgKi8KKyNkZWZpbmUJQVQ5MV9QTUNfSU1SCQkoQVQ5MV9QTUMgKyAweDZjKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9yc3RjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcnN0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGM1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcnN0Yy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcnN0Yy5oCisgKgorICogUmVzZXQgQ29udHJvbGxlciAoUlNUQykgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnc3RlcnMuCisgKiBCYXNlZCBvbiBBVDkxU0FNOTI2MSBkYXRhc2hlZXQgcmV2aXNpb24gRC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MV9SU1RDX0gKKyNkZWZpbmUgQVQ5MV9SU1RDX0gKKworI2RlZmluZSBBVDkxX1JTVENfQ1IJCShBVDkxX1JTVEMgKyAweDAwKQkvKiBSZXNldCBDb250cm9sbGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlNUQ19QUk9DUlNUCSgxIDw8IDApCQkvKiBQcm9jZXNzb3IgUmVzZXQgKi8KKyNkZWZpbmUJCUFUOTFfUlNUQ19QRVJSU1QJKDEgPDwgMikJCS8qIFBlcmlwaGVyYWwgUmVzZXQgKi8KKyNkZWZpbmUJCUFUOTFfUlNUQ19FWFRSU1QJKDEgPDwgMykJCS8qIEV4dGVybmFsIFJlc2V0ICovCisjZGVmaW5lCQlBVDAxX1JTVENfS0VZCQkoMHhmZiA8PCAyNCkJCS8qIEtFWSBQYXNzd29yZCAqLworCisjZGVmaW5lIEFUOTFfUlNUQ19TUgkJKEFUOTFfUlNUQyArIDB4MDQpCS8qIFJlc2V0IENvbnRyb2xsZXIgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JTVENfVVJTVFMJCSgxIDw8IDApCQkvKiBVc2VyIFJlc2V0IFN0YXR1cyAqLworI2RlZmluZQkJQVQ5MV9SU1RDX1JTVFRZUAkoNyA8PCA4KQkJLyogUmVzZXQgVHlwZSAqLworI2RlZmluZQkJCUFUOTFfUlNUQ19SU1RUWVBfR0VORVJBTAkoMCA8PCA4KQorI2RlZmluZQkJCUFUOTFfUlNUQ19SU1RUWVBfV0FLRVVQCQkoMSA8PCA4KQorI2RlZmluZQkJCUFUOTFfUlNUQ19SU1RUWVBfV0FUQ0hET0cJKDIgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX1JTVENfUlNUVFlQX1NPRlRXQVJFCSgzIDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9SU1RDX1JTVFRZUF9VU0VSCSg0IDw8IDgpCisjZGVmaW5lCQlBVDkxX1JTVENfTlJTVEwJCSgxIDw8IDE2KQkJLyogTlJTVCBQaW4gTGV2ZWwgKi8KKyNkZWZpbmUJCUFUOTFfUlNUQ19TUkNNUAkJKDEgPDwgMTcpCQkvKiBTb2Z0d2FyZSBSZXNldCBDb21tYW5kIGluIFByb2dyZXNzICovCisKKyNkZWZpbmUgQVQ5MV9SU1RDX01SCQkoQVQ5MV9SU1RDICsgMHgwOCkJLyogUmVzZXQgQ29udHJvbGxlciBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JTVENfVVJTVEVOCSgxIDw8IDApCQkvKiBVc2VyIFJlc2V0IEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9SU1RDX1VSU1RJRU4JKDEgPDwgNCkJCS8qIFVzZXIgUmVzZXQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9SU1RDX0VSU1RMCQkoMHhmIDw8IDgpCQkvKiBFeHRlcm5hbCBSZXNldCBMZW5ndGggKi8KKyNkZWZpbmUJCUFUOTFfUlNUQ19LRVkJCSgweGZmIDw8IDI0KQkJLyogS0VZIFBhc3N3b3JkICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3J0Yy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTA2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcnRjLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9ydGMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKKyAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQorICoKKyAqIFJlYWwgVGltZSBDbG9jayAoUlRDKSAtIFN5c3RlbSBwZXJpcGhlcmFsIHJlZ2lzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFSTTkyMDAgZGF0YXNoZWV0IHJldmlzaW9uIEUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFfUlRDX0gKKyNkZWZpbmUgQVQ5MV9SVENfSAorCisjZGVmaW5lCUFUOTFfUlRDX0NSCQkoQVQ5MV9SVEMgKyAweDAwKQkvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JUQ19VUERUSU0JCSgxIDw8ICAwKQkJLyogVXBkYXRlIFJlcXVlc3QgVGltZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9SVENfVVBEQ0FMCQkoMSA8PCAgMSkJCS8qIFVwZGF0ZSBSZXF1ZXN0IENhbGVuZGFyIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JUQ19USU1FVlNFTAkoMyA8PCAgOCkJCS8qIFRpbWUgRXZlbnQgU2VsZWN0aW9uICovCisjZGVmaW5lCQkJQVQ5MV9SVENfVElNRVZTRUxfTUlOVVRFCSgwIDw8IDgpCisjZGVmaW5lIAkJQVQ5MV9SVENfVElNRVZTRUxfSE9VUgkJKDEgPDwgOCkKKyNkZWZpbmUgCQlBVDkxX1JUQ19USU1FVlNFTF9EQVkyNAkJKDIgPDwgOCkKKyNkZWZpbmUgCQlBVDkxX1JUQ19USU1FVlNFTF9EQVkxMgkJKDMgPDwgOCkKKyNkZWZpbmUJCUFUOTFfUlRDX0NBTEVWU0VMCSgzIDw8IDE2KQkJLyogQ2FsZW5kYXIgRXZlbnQgU2VsZWN0aW9uICovCisjZGVmaW5lIAkJQVQ5MV9SVENfQ0FMRVZTRUxfV0VFSwkJKDAgPDwgMTYpCisjZGVmaW5lIAkJQVQ5MV9SVENfQ0FMRVZTRUxfTU9OVEgJCSgxIDw8IDE2KQorI2RlZmluZSAJCUFUOTFfUlRDX0NBTEVWU0VMX1lFQVIJCSgyIDw8IDE2KQorCisjZGVmaW5lCUFUOTFfUlRDX01SCQkoQVQ5MV9SVEMgKyAweDA0KQkvKiBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIAlBVDkxX1JUQ19IUk1PRAkJKDEgPDwgIDApCQkvKiAxMi8yNCBIb3VyIE1vZGUgKi8KKworI2RlZmluZQlBVDkxX1JUQ19USU1SCQkoQVQ5MV9SVEMgKyAweDA4KQkvKiBUaW1lIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JUQ19TRUMJCSgweDdmIDw8ICAwKQkJLyogQ3VycmVudCBTZWNvbmQgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX01JTgkJKDB4N2YgPDwgIDgpCQkvKiBDdXJyZW50IE1pbnV0ZSAqLworI2RlZmluZQkJQVQ5MV9SVENfSE9VUiAJCSgweDNmIDw8IDE2KQkJLyogQ3VycmVudCBIb3VyICovCisjZGVmaW5lCQlBVDkxX1JUQ19BTVBNCQkoMSAgICA8PCAyMikJCS8qIEFudGUgTWVyaWRpZW0gUG9zdCBNZXJpZGllbSBJbmRpY2F0b3IgKi8KKworI2RlZmluZQlBVDkxX1JUQ19DQUxSCQkoQVQ5MV9SVEMgKyAweDBjKQkvKiBDYWxlbmRhciBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9SVENfQ0VOVAkJKDB4N2YgPDwgIDApCQkvKiBDdXJyZW50IENlbnR1cnkgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX1lFQVIJCSgweGZmIDw8ICA4KQkJLyogQ3VycmVudCBZZWFyICovCisjZGVmaW5lCQlBVDkxX1JUQ19NT05USAkJKDB4MWYgPDwgMTYpCQkvKiBDdXJyZW50IE1vbnRoICovCisjZGVmaW5lCQlBVDkxX1JUQ19EQVkJCSg3ICAgIDw8IDIxKQkJLyogQ3VycmVudCBEYXkgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX0RBVEUJCSgweDNmIDw8IDI0KQkJLyogQ3VycmVudCBEYXRlICovCisKKyNkZWZpbmUJQVQ5MV9SVENfVElNQUxSCQkoQVQ5MV9SVEMgKyAweDEwKQkvKiBUaW1lIEFsYXJtIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JUQ19TRUNFTgkJKDEgPDwgIDcpCQkvKiBTZWNvbmQgQWxhcm0gRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1JUQ19NSU5FTgkJKDEgPDwgMTUpCQkvKiBNaW51dGUgQWxhcm0gRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1JUQ19IT1VSRU4JCSgxIDw8IDIzKQkJLyogSG91ciBBbGFybSBFbmFibGUgKi8KKworI2RlZmluZQlBVDkxX1JUQ19DQUxBTFIJCShBVDkxX1JUQyArIDB4MTQpCS8qIENhbGVuZGFyIEFsYXJtIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1JUQ19NVEhFTgkJKDEgPDwgMjMpCQkvKiBNb250aCBBbGFybSBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX0RBVEVFTgkJKDEgPDwgMzEpCQkvKiBEYXRlIEFsYXJtIEVuYWJsZSAqLworCisjZGVmaW5lCUFUOTFfUlRDX1NSCQkoQVQ5MV9SVEMgKyAweDE4KQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX0FDS1VQRAkJKDEgPDwgIDApCQkvKiBBY2tub3dsZWRnZSBmb3IgVXBkYXRlICovCisjZGVmaW5lCQlBVDkxX1JUQ19BTEFSTQkJKDEgPDwgIDEpCQkvKiBBbGFybSBGbGFnICovCisjZGVmaW5lCQlBVDkxX1JUQ19TRUNFVgkJKDEgPDwgIDIpCQkvKiBTZWNvbmQgRXZlbnQgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX1RJTUVWCQkoMSA8PCAgMykJCS8qIFRpbWUgRXZlbnQgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX0NBTEVWCQkoMSA8PCAgNCkJCS8qIENhbGVuZGFyIEV2ZW50ICovCisKKyNkZWZpbmUJQVQ5MV9SVENfU0NDUgkJKEFUOTFfUlRDICsgMHgxYykJLyogU3RhdHVzIENsZWFyIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9SVENfSUVSCQkoQVQ5MV9SVEMgKyAweDIwKQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFUOTFfUlRDX0lEUgkJKEFUOTFfUlRDICsgMHgyNCkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9SVENfSU1SCQkoQVQ5MV9SVEMgKyAweDI4KQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCisjZGVmaW5lCUFUOTFfUlRDX1ZFUgkJKEFUOTFfUlRDICsgMHgyYykJLyogVmFsaWQgRW50cnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX05WVElNCQkoMSA8PCAgMCkJCS8qIE5vbiB2YWxpZCBUaW1lICovCisjZGVmaW5lCQlBVDkxX1JUQ19OVkNBTAkJKDEgPDwgIDEpCQkvKiBOb24gdmFsaWQgQ2FsZW5kYXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRDX05WVElNQUxSCSgxIDw8ICAyKQkJLyogTm9uIHZhbGlkIFRpbWUgQWxhcm0gKi8KKyNkZWZpbmUJCUFUOTFfUlRDX05WQ0FMQUxSCSgxIDw8ICAzKQkJLyogTm9uIHZhbGlkIENhbGVuZGFyIEFsYXJtICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3J0dC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3J0dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzUxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfcnR0LmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9ydHQuaAorICoKKyAqIFJlYWwtdGltZSBUaW1lciAoUlRUKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFTQU05MjYxIGRhdGFzaGVldCByZXZpc2lvbiBELgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX1JUVF9ICisjZGVmaW5lIEFUOTFfUlRUX0gKKworI2RlZmluZSBBVDkxX1JUVF9NUgkJKEFUOTFfUlRUICsgMHgwMCkJLyogUmVhbC10aW1lIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRUX1JUUFJFUwkJKDB4ZmZmZiA8PCAwKQkJLyogUmVhbC10aW1lIFRpbWVyIFByZXNjYWxlciBWYWx1ZSAqLworI2RlZmluZQkJQVQ5MV9SVFRfQUxNSUVOCQkoMSA8PCAxNikJCS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfUlRUX1JUVElOQ0lFTgkoMSA8PCAxNykJCS8qIFJlYWwgVGltZSBUaW1lciBJbmNyZW1lbnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9SVFRfUlRUUlNUCQkoMSA8PCAxOCkJCS8qIFJlYWwgVGltZSBUaW1lciBSZXN0YXJ0ICovCisKKyNkZWZpbmUgQVQ5MV9SVFRfQVIJCShBVDkxX1JUVCArIDB4MDQpCS8qIFJlYWwtdGltZSBBbGFybSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9SVFRfQUxNVgkJKDB4ZmZmZmZmZmYpCQkvKiBBbGFybSBWYWx1ZSAqLworCisjZGVmaW5lIEFUOTFfUlRUX1ZSCQkoQVQ5MV9SVFQgKyAweDA4KQkvKiBSZWFsLXRpbWUgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfUlRUX0NSVFYJCSgweGZmZmZmZmZmKQkJLyogQ3VycmVudCBSZWFsLXRpbWUgVmFsdWUgKi8KKworI2RlZmluZSBBVDkxX1JUVF9TUgkJKEFUOTFfUlRUICsgMHgwYykJLyogUmVhbC10aW1lIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9SVFRfQUxNUwkJKDEgPDwgMCkJCS8qIFJlYWwtdGltZSBBbGFybSBTdGF0dXMgKi8KKyNkZWZpbmUJCUFUOTFfUlRUX1JUVElOQwkJKDEgPDwgMSkJCS8qIFJlYWwtdGltZSBUaW1lciBJbmNyZW1lbnQgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfc2hkd2MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9zaGR3Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzkyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfc2hkd2MuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3NoZHdjLmgKKyAqCisgKiBTaHV0ZG93biBDb250cm9sbGVyIChTSERXQykgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnc3RlcnMuCisgKiBCYXNlZCBvbiBBVDkxU0FNOTI2MSBkYXRhc2hlZXQgcmV2aXNpb24gRC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MV9TSERXQ19ICisjZGVmaW5lIEFUOTFfU0hEV0NfSAorCisjZGVmaW5lIEFUOTFfU0hEV19DUgkJKEFUOTFfU0hEV0MgKyAweDAwKQkvKiBTaHV0IERvd24gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9TSERXX1NIRFcJCSgxICAgIDw8IDApCQkvKiBQcm9jZXNzb3IgUmVzZXQgKi8KKyNkZWZpbmUJCUFUOTFfU0hEV19LRVkJCSgweGZmIDw8IDI0KQkJLyogS0VZIFBhc3N3b3JkICovCisKKyNkZWZpbmUgQVQ5MV9TSERXX01SCQkoQVQ5MV9TSERXQyArIDB4MDQpCS8qIFNodXQgRG93biBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NIRFdfV0tNT0RFMAkoMyA8PCAwKQkJLyogV2FrZS11cCAwIE1vZGUgU2VsZWN0aW9uICovCisjZGVmaW5lCQkJQVQ5MV9TSERXX1dLTU9ERTBfTk9ORQkJMAorI2RlZmluZQkJCUFUOTFfU0hEV19XS01PREUwX0hJR0gJCTEKKyNkZWZpbmUJCQlBVDkxX1NIRFdfV0tNT0RFMF9MT1cJCTIKKyNkZWZpbmUJCQlBVDkxX1NIRFdfV0tNT0RFMF9BTllMRVZFTAkzCisjZGVmaW5lCQlBVDkxX1NIRFdfQ1BUV0swCSgweGYgPDwgNCkJCS8qIENvdW50ZXIgT24gV2FrZSBVcCAwICovCisjZGVmaW5lCQlBVDkxX1NIRFdfUlRUV0tFTgkoMSAgIDw8IDE2KQkJLyogUmVhbCBUaW1lIFRpbWVyIFdha2UtdXAgRW5hYmxlICovCisKKyNkZWZpbmUgQVQ5MV9TSERXX1NSCQkoQVQ5MV9TSERXQyArIDB4MDgpCS8qIFNodXQgRG93biBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU0hEV19XQUtFVVAwCSgxIDw8ICAwKQkJLyogV2FrZS11cCAwIFN0YXR1cyAqLworI2RlZmluZQkJQVQ5MV9TSERXX1JUVFdLCQkoMSA8PCAxNikJCS8qIFJlYWwtdGltZSBUaW1lciBXYWtlLXVwICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3NwaS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzQ4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfc3BpLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9zcGkuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKKyAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQorICoKKyAqIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSByZWdpc3RlcnMuCisgKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX1NQSV9ICisjZGVmaW5lIEFUOTFfU1BJX0gKKworI2RlZmluZSBBVDkxX1NQSV9DUgkJCTB4MDAJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX1NQSUVOCQkoMSA8PCAgMCkJCS8qIFNQSSBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX1NQSURJUwkJKDEgPDwgIDEpCQkvKiBTUEkgRGlzYWJsZSAqLworI2RlZmluZQkJQVQ5MV9TUElfU1dSU1QJCSgxIDw8ICA3KQkJLyogU1BJIFNvZnR3YXJlIFJlc2V0ICovCisjZGVmaW5lCQlBVDkxX1NQSV9MQVNUWEZFUgkoMSA8PCAyNCkJCS8qIExhc3QgVHJhbnNmZXIgW1NBTTkyNjEgb25seV0gKi8KKworI2RlZmluZSBBVDkxX1NQSV9NUgkJCTB4MDQJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX01TVFIJCSgxICAgIDw8ICAwKQkJLyogTWFzdGVyL1NsYXZlIE1vZGUgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX1BTCQkoMSAgICA8PCAgMSkJCS8qIFBlcmlwaGVyYWwgU2VsZWN0ICovCisjZGVmaW5lCQkJQVQ5MV9TUElfUFNfRklYRUQJKDAgPDwgMSkKKyNkZWZpbmUJCQlBVDkxX1NQSV9QU19WQVJJQUJMRQkoMSA8PCAxKQorI2RlZmluZQkJQVQ5MV9TUElfUENTREVDCQkoMSAgICA8PCAgMikJCS8qIENoaXAgU2VsZWN0IERlY29kZSAqLworI2RlZmluZQkJQVQ5MV9TUElfRElWMzIJCSgxICAgIDw8ICAzKQkJLyogQ2xvY2sgU2VsZWN0aW9uIFtBVDkxUk05MjAwIG9ubHldICovCisjZGVmaW5lCQlBVDkxX1NQSV9NT0RGRElTCSgxICAgIDw8ICA0KQkJLyogTW9kZSBGYXVsdCBEZXRlY3Rpb24gKi8KKyNkZWZpbmUJCUFUOTFfU1BJX0xMQgkJKDEgICAgPDwgIDcpCQkvKiBMb2NhbCBMb29wYmFjayBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX1BDUwkJKDB4ZiAgPDwgMTYpCQkvKiBQZXJpcGhlcmFsIENoaXAgU2VsZWN0ICovCisjZGVmaW5lCQlBVDkxX1NQSV9ETFlCQ1MJCSgweGZmIDw8IDI0KQkJLyogRGVsYXkgQmV0d2VlbiBDaGlwIFNlbGVjdHMgKi8KKworI2RlZmluZSBBVDkxX1NQSV9SRFIJCTB4MDgJCQkvKiBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX1JECQkoMHhmZmZmIDw8ICAwKQkJLyogUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lCQlBVDkxX1NQSV9QQ1MJCSgweGYJPDwgMTYpCQkvKiBQZXJpcGhlcmFsIENoaXAgU2VsZWN0ICovCisKKyNkZWZpbmUgQVQ5MV9TUElfVERSCQkweDBjCQkJLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9TUElfVEQJCSgweGZmZmYgPDwgIDApCQkvKiBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lCQlBVDkxX1NQSV9QQ1MJCSgweGYJPDwgMTYpCQkvKiBQZXJpcGhlcmFsIENoaXAgU2VsZWN0ICovCisjZGVmaW5lCQlBVDkxX1NQSV9MQVNUWEZFUgkoMQk8PCAyNCkJCS8qIExhc3QgVHJhbnNmZXIgW1NBTTkyNjEgb25seV0gKi8KKworI2RlZmluZSBBVDkxX1NQSV9TUgkJMHgxMAkJCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9TUElfUkRSRgkJKDEgPDwgIDApCQkvKiBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgRnVsbCAqLworI2RlZmluZQkJQVQ5MV9TUElfVERSRQkJKDEgPDwgIDEpCQkvKiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEZ1bGwgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX01PREYJCSgxIDw8ICAyKQkJLyogTW9kZSBGYXVsdCBFcnJvciAqLworI2RlZmluZQkJQVQ5MV9TUElfT1ZSRVMJCSgxIDw8ICAzKQkJLyogT3ZlcnJ1biBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX0VORFJYCQkoMSA8PCAgNCkJCS8qIEVuZCBvZiBSWCBidWZmZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX0VORFRYCQkoMSA8PCAgNSkJCS8qIEVuZCBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX1JYQlVGRgkJKDEgPDwgIDYpCQkvKiBSWCBCdWZmZXIgRnVsbCAqLworI2RlZmluZQkJQVQ5MV9TUElfVFhCVUZFCQkoMSA8PCAgNykJCS8qIFRYIEJ1ZmZlciBFbXB0eSAqLworI2RlZmluZQkJQVQ5MV9TUElfTlNTUgkJKDEgPDwgIDgpCQkvKiBOU1MgUmlzaW5nIFtTQU05MjYxIG9ubHldICovCisjZGVmaW5lCQlBVDkxX1NQSV9UWEVNUFRZCSgxIDw8ICA5KQkJLyogVHJhbnNtaXNzaW9uIFJlZ2lzdGVyIEVtcHR5IFtTQU05MjYxIG9ubHldICovCisjZGVmaW5lCQlBVDkxX1NQSV9TUElFTlMJCSgxIDw8IDE2KQkJLyogU1BJIEVuYWJsZSBTdGF0dXMgKi8KKworI2RlZmluZSBBVDkxX1NQSV9JRVIJCTB4MTQJCQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfU1BJX0lEUgkJMHgxOAkJCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfU1BJX0lNUgkJMHgxYwkJCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9TUElfQ1NSKG4pCQkoMHgzMCArICgobikgKiA0KSkJLyogQ2hpcCBTZWxlY3QgUmVnaXN0ZXJzIDAtMyAqLworI2RlZmluZQkJQVQ5MV9TUElfQ1BPTAkJKDEgICAgPDwgIDApCQkvKiBDbG9jayBQb2xhcml0eSAqLworI2RlZmluZQkJQVQ5MV9TUElfTkNQSEEJCSgxICAgIDw8ICAxKQkJLyogQ2xvY2sgUGhhc2UgKi8KKyNkZWZpbmUJCUFUOTFfU1BJX0NTQUFUCQkoMSAgICA8PCAgMykJCS8qIENoaXAgU2VsZWN0IEFjdGl2ZSBBZnRlciBUcmFuc2ZlciBbU0FNOTI2MSBvbmx5XSAqLworI2RlZmluZQkJQVQ5MV9TUElfQklUUwkJKDB4ZiAgPDwgIDQpCQkvKiBCaXRzIFBlciBUcmFuc2ZlciAqLworI2RlZmluZQkJCUFUOTFfU1BJX0JJVFNfOAkJKDAgPDwgNCkKKyNkZWZpbmUJCQlBVDkxX1NQSV9CSVRTXzkJCSgxIDw8IDQpCisjZGVmaW5lCQkJQVQ5MV9TUElfQklUU18xMAkoMiA8PCA0KQorI2RlZmluZQkJCUFUOTFfU1BJX0JJVFNfMTEJKDMgPDwgNCkKKyNkZWZpbmUJCQlBVDkxX1NQSV9CSVRTXzEyCSg0IDw8IDQpCisjZGVmaW5lCQkJQVQ5MV9TUElfQklUU18xMwkoNSA8PCA0KQorI2RlZmluZQkJCUFUOTFfU1BJX0JJVFNfMTQJKDYgPDwgNCkKKyNkZWZpbmUJCQlBVDkxX1NQSV9CSVRTXzE1CSg3IDw8IDQpCisjZGVmaW5lCQkJQVQ5MV9TUElfQklUU18xNgkoOCA8PCA0KQorI2RlZmluZQkJQVQ5MV9TUElfU0NCUgkJKDB4ZmYgPDwgIDgpCQkvKiBTZXJpYWwgQ2xvY2sgQmF1ZCBSYXRlICovCisjZGVmaW5lCQlBVDkxX1NQSV9ETFlCUwkJKDB4ZmYgPDwgMTYpCQkvKiBEZWxheSBiZWZvcmUgU1BDSyAqLworI2RlZmluZQkJQVQ5MV9TUElfRExZQkNUCQkoMHhmZiA8PCAyNCkJCS8qIERlbGF5IGJldHdlZW4gQ29uc2VjdXRpdmUgVHJhbnNmZXJzICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3NzYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3NzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NGJjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfc3NjLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfc3NjLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKKyAqCisgKiBTZXJpYWwgU3luY2hyb25vdXMgQ29udHJvbGxlciAoU1NDKSByZWdpc3RlcnMuCisgKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX1NTQ19ICisjZGVmaW5lIEFUOTFfU1NDX0gKKworI2RlZmluZSBBVDkxX1NTQ19DUgkJMHgwMAkvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NTQ19SWEVOCQkoMSA8PCAgMCkJLyogUmVjZWl2ZSBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfU1NDX1JYRElTCQkoMSA8PCAgMSkJLyogUmVjZWl2ZSBEaXNhYmxlICovCisjZGVmaW5lCQlBVDkxX1NTQ19UWEVOCQkoMSA8PCAgOCkJLyogVHJhbnNtaXQgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1NTQ19UWERJUwkJKDEgPDwgIDkpCS8qIFRyYW5zbWl0IERpc2FibGUgKi8KKyNkZWZpbmUJCUFUOTFfU1NDX1NXUlNUCQkoMSA8PCAxNSkJLyogU29mdHdhcmUgUmVzZXQgKi8KKworI2RlZmluZSBBVDkxX1NTQ19DTVIJCTB4MDQJLyogQ2xvY2sgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9TU0NfQ01SX0RJVgkoMHhmZmYgPDwgMCkJLyogQ2xvY2sgRGl2aWRlciAqLworCisjZGVmaW5lIEFUOTFfU1NDX1JDTVIJCTB4MTAJLyogUmVjZWl2ZSBDbG9jayBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NTQ19DS1MJCSgzICAgIDw8ICAwKQkvKiBDbG9jayBTZWxlY3Rpb24gKi8KKyNkZWZpbmUJCQlBVDkxX1NTQ19DS1NfRElWCQkoMCA8PCAwKQorI2RlZmluZQkJCUFUOTFfU1NDX0NLU19DTE9DSwkJKDEgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1NTQ19DS1NfUElOCQkoMiA8PCAwKQorI2RlZmluZQkJQVQ5MV9TU0NfQ0tPCQkoNyAgICA8PCAgMikJLyogQ2xvY2sgT3V0cHV0IE1vZGUgU2VsZWN0aW9uICovCisjZGVmaW5lCQkJQVQ5MV9TU0NfQ0tPX05PTkUJCSgwIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9TU0NfQ0tPX0NPTlRJTlVPVVMJCSgxIDw8IDIpCisjZGVmaW5lCQlBVDkxX1NTQ19DS0kJCSgxICAgIDw8ICA1KQkvKiBDbG9jayBJbnZlcnNpb24gKi8KKyNkZWZpbmUJCQlBVDkxX1NTQ19DS0lfRkFMTElORwkJKDAgPDwgNSkKKyNkZWZpbmUJCQlBVDkxX1NTQ19DS19SSVNJTkcJCSgxIDw8IDUpCisjZGVmaW5lCQlBVDkxX1NTQ19DS0cJCSgxICAgIDw8ICA2KQkvKiBSZWNlaXZlIENsb2NrIEdhdGluZyBTZWxlY3Rpb24gW0FUOTFTQU05MjYxIG9ubHldICovCisjZGVmaW5lCQkJQVQ5MV9TU0NfQ0tHX05PTkUJCSgwIDw8IDYpCisjZGVmaW5lCQkJQVQ5MV9TU0NfQ0tHX1JGTE9XCQkoMSA8PCA2KQorI2RlZmluZQkJCUFUOTFfU1NDX0NLR19SRkhJR0gJCSgyIDw8IDYpCisjZGVmaW5lCQlBVDkxX1NTQ19TVEFSVAkJKDB4ZiAgPDwgIDgpCS8qIFN0YXJ0IFNlbGVjdGlvbiAqLworI2RlZmluZQkJCUFUOTFfU1NDX1NUQVJUX0NPTlRJTlVPVVMJKDAgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX1NTQ19TVEFSVF9UWF9SWAkJKDEgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX1NTQ19TVEFSVF9MT1dfUkYJCSgyIDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9TU0NfU1RBUlRfSElHSF9SRgkJKDMgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX1NTQ19TVEFSVF9GQUxMSU5HX1JGCSg0IDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9TU0NfU1RBUlRfUklTSU5HX1JGCSg1IDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9TU0NfU1RBUlRfTEVWRUxfUkYJCSg2IDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9TU0NfU1RBUlRfRURHRV9SRgkJKDcgPDwgOCkKKyNkZWZpbmUJCUFUOTFfU1NDX1NUT1AJCSgxICAgIDw8IDEyKQkvKiBSZWNlaXZlIFN0b3AgU2VsZWN0aW9uIFtBVDkxU0FNOTI2MSBvbmx5XSAqLworI2RlZmluZQkJQVQ5MV9TU0NfU1RURExZCQkoMHhmZiA8PCAxNikJLyogU3RhcnQgRGVsYXkgKi8KKyNkZWZpbmUJCUFUOTFfU1NDX1BFUklPRAkJKDB4ZmYgPDwgMjQpCS8qIFBlcmlvZCBEaXZpZGVyIFNlbGVjdGlvbiAqLworCisjZGVmaW5lIEFUOTFfU1NDX1JGTVIJCTB4MTQJLyogUmVjZWl2ZSBGcmFtZSBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NTQ19EQVRBTEVOCSgweDFmIDw8ICAwKQkvKiBEYXRhIExlbmd0aCAqLworI2RlZmluZQkJQVQ5MV9TU0NfTE9PUAkJKDEgICAgPDwgIDUpCS8qIExvb3AgTW9kZSAqLworI2RlZmluZQkJQVQ5MV9TU0NfTVNCRgkJKDEgICAgPDwgIDcpCS8qIE1vc3QgU2lnbmlmaWNhbnQgQml0IEZpcnN0ICovCisjZGVmaW5lCQlBVDkxX1NTQ19EQVROQgkJKDB4ZiAgPDwgIDgpCS8qIERhdGEgTnVtYmVyIHBlciBGcmFtZSAqLworI2RlZmluZQkJQVQ5MV9TU0NfRlNMRU4JCSgweGYgIDw8IDE2KQkvKiBGcmFtZSBTeW5jIExlbmd0aCAqLworI2RlZmluZQkJQVQ5MV9TU0NfRlNPUwkJKDcgICAgPDwgMjApCS8qIEZyYW1lIFN5bmMgT3V0cHV0IFNlbGVjdGlvbiAqLworI2RlZmluZQkJCUFUOTFfU1NDX0ZTT1NfTk9ORQkJKDAgPDwgMjApCisjZGVmaW5lCQkJQVQ5MV9TU0NfRlNPU19ORUdBVElWRQkJKDEgPDwgMjApCisjZGVmaW5lCQkJQVQ5MV9TU0NfRlNPU19QT1NJVElWRQkJKDIgPDwgMjApCisjZGVmaW5lCQkJQVQ5MV9TU0NfRlNPU19MT1cJCSgzIDw8IDIwKQorI2RlZmluZQkJCUFUOTFfU1NDX0ZTT1NfSElHSAkJKDQgPDwgMjApCisjZGVmaW5lCQkJQVQ5MV9TU0NfRlNPU19UT0dHTEUJCSg1IDw8IDIwKQorI2RlZmluZQkJQVQ5MV9TU0NfRlNFREdFCQkoMSAgICA8PCAyNCkJLyogRnJhbWUgU3luYyBFZGdlIERldGVjdGlvbiAqLworI2RlZmluZQkJCUFUOTFfU1NDX0ZTRURHRV9QT1NJVElWRQkoMCA8PCAyNCkKKyNkZWZpbmUJCQlBVDkxX1NTQ19GU0VER0VfTkVHQVRJVkUJKDEgPDwgMjQpCisKKyNkZWZpbmUgQVQ5MV9TU0NfVENNUgkJMHgxOAkvKiBUcmFuc21pdCBDbG9jayBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfU1NDX1RGTVIJCTB4MWMJLyogVHJhbnNtaXQgRnJhbSBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NTQ19EQVRERUYJCSgxIDw8ICA1KQkvKiBEYXRhIERlZmF1bHQgVmFsdWUgKi8KKyNkZWZpbmUJCUFUOTFfU1NDX0ZTREVOCQkoMSA8PCAyMykJLyogRnJhbWUgU3luYyBEYXRhIEVuYWJsZSAqLworCisjZGVmaW5lIEFUOTFfU1NDX1JIUgkJMHgyMAkvKiBSZWNlaXZlIEhvbGRpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TU0NfVEhSCQkweDI0CS8qIFRyYW5zbWl0IEhvbGRpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TU0NfUlNIUgkJMHgzMAkvKiBSZWNlaXZlIFN5bmMgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NTQ19UU0hSCQkweDM0CS8qIFRyYW5zbWl0IFN5bmMgSG9sZGluZyBSZWdpc3RlciAqLworCisjZGVmaW5lIEFUOTFfU1NDX1JDMFIJCTB4MzgJLyogUmVjZWl2ZSBDb21wYXJlIDAgUmVnaXN0ZXIgW0FUOTFTQU05MjYxIG9ubHldICovCisjZGVmaW5lIEFUOTFfU1NDX1JDMVIJCTB4M2MJLyogUmVjZWl2ZSBDb21wYXJlIDEgUmVnaXN0ZXIgW0FUOTFTQU05MjYxIG9ubHldICovCisKKyNkZWZpbmUgQVQ5MV9TU0NfU1IJCTB4NDAJLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NTQ19UWFJEWQkJKDEgPDwgIDApCS8qIFRyYW5zbWl0IFJlYWR5ICovCisjZGVmaW5lCQlBVDkxX1NTQ19UWEVNUFRZCSgxIDw8ICAxKQkvKiBUcmFuc21pdCBFbXB0eSAqLworI2RlZmluZQkJQVQ5MV9TU0NfRU5EVFgJCSgxIDw8ICAyKQkvKiBFbmQgb2YgVHJhbnNtaXNzaW9uICovCisjZGVmaW5lCQlBVDkxX1NTQ19UWEJVRkUJCSgxIDw8ICAzKQkvKiBUcmFuc21pdCBCdWZmZXIgRW1wdHkgKi8KKyNkZWZpbmUJCUFUOTFfU1NDX1JYUkRZCQkoMSA8PCAgNCkJLyogUmVjZWl2ZSBSZWFkeSAqLworI2RlZmluZQkJQVQ5MV9TU0NfT1ZSVU4JCSgxIDw8ICA1KQkvKiBSZWNlaXZlIE92ZXJydW4gKi8KKyNkZWZpbmUJCUFUOTFfU1NDX0VORFJYCQkoMSA8PCAgNikJLyogRW5kIG9mIFJlY2VwdGlvbiAqLworI2RlZmluZQkJQVQ5MV9TU0NfUlhCVUZGCQkoMSA8PCAgNykJLyogUmVjZWl2ZSBCdWZmZXIgRnVsbCAqLworI2RlZmluZQkJQVQ5MV9TU0NfQ1AwCQkoMSA8PCAgOCkJLyogQ29tcGFyZSAwIFtBVDkxU0FNOTI2MSBvbmx5XSAqLworI2RlZmluZQkJQVQ5MV9TU0NfQ1AxCQkoMSA8PCAgOSkJLyogQ29tcGFyZSAxIFtBVDkxU0FNOTI2MSBvbmx5XSAqLworI2RlZmluZQkJQVQ5MV9TU0NfVFhTWU4JCSgxIDw8IDEwKQkvKiBUcmFuc21pdCBTeW5jICovCisjZGVmaW5lCQlBVDkxX1NTQ19SWFNZTgkJKDEgPDwgMTEpCS8qIFJlY2VpdmUgU3luYyAqLworI2RlZmluZQkJQVQ5MV9TU0NfVFhFTkEJCSgxIDw8IDE2KQkvKiBUcmFuc21pdCBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfU1NDX1JYRU5BCQkoMSA8PCAxNykJLyogUmVjZWl2ZSBFbmFibGUgKi8KKworI2RlZmluZSBBVDkxX1NTQ19JRVIJCTB4NDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NTQ19JRFIJCTB4NDgJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TU0NfSU1SCQkweDRjCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3N0LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDMyZGRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3N0LmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV9zdC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogU3lzdGVtIFRpbWVyIChTVCkgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MV9TVF9ICisjZGVmaW5lIEFUOTFfU1RfSAorCisjZGVmaW5lCUFUOTFfU1RfQ1IJCShBVDkxX1NUICsgMHgwMCkJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAJQVQ5MV9TVF9XRFJTVAkJKDEgPDwgMCkJCS8qIFdhdGNoZG9nIFRpbWVyIFJlc3RhcnQgKi8KKworI2RlZmluZQlBVDkxX1NUX1BJTVIJCShBVDkxX1NUICsgMHgwNCkJLyogUGVyaW9kIEludGVydmFsIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1RfUElWCQkoMHhmZmZmIDw8ICAwKQkJLyogUGVyaW9kIEludGVydmFsIFZhbHVlICovCisKKyNkZWZpbmUJQVQ5MV9TVF9XRE1SCQkoQVQ5MV9TVCArIDB4MDgpCS8qIFdhdGNoZG9nIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1RfV0RWCQkoMHhmZmZmIDw8ICAwKQkJLyogV2F0Y2hkb2cgQ291bnRlciBWYWx1ZSAqLworI2RlZmluZQkJQVQ5MV9TVF9SU1RFTgkJKDEJPDwgMTYpCQkvKiBSZXNldCBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfU1RfRVhURU4JCSgxCTw8IDE3KQkJLyogRXh0ZXJuYWwgU2lnbmFsIEFzc2VydGlvbiBFbmFibGUgKi8KKworI2RlZmluZQlBVDkxX1NUX1JUTVIJCShBVDkxX1NUICsgMHgwYykJLyogUmVhbC10aW1lIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1RfUlRQUkVTCQkoMHhmZmZmIDw8ICAwKQkJLyogUmVhbC10aW1lIFByZXNjYWxhciBWYWx1ZSAqLworCisjZGVmaW5lCUFUOTFfU1RfU1IJCShBVDkxX1NUICsgMHgxMCkJLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NUX1BJVFMJCSgxIDw8IDApCQkvKiBQZXJpb2QgSW50ZXJ2YWwgVGltZXIgU3RhdHVzICovCisjZGVmaW5lCQlBVDkxX1NUX1dET1ZGCQkoMSA8PCAxKSAJCS8qIFdhdGNoZG9nIE92ZXJmbG93ICovCisjZGVmaW5lCQlBVDkxX1NUX1JUVElOQwkJKDEgPDwgMikgCQkvKiBSZWFsLXRpbWUgVGltZXIgSW5jcmVtZW50ICovCisjZGVmaW5lCQlBVDkxX1NUX0FMTVMJCSgxIDw8IDMpIAkJLyogQWxhcm0gU3RhdHVzICovCisKKyNkZWZpbmUJQVQ5MV9TVF9JRVIJCShBVDkxX1NUICsgMHgxNCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX1NUX0lEUgkJKEFUOTFfU1QgKyAweDE4KQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX1NUX0lNUgkJKEFUOTFfU1QgKyAweDFjKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCisjZGVmaW5lCUFUOTFfU1RfUlRBUgkJKEFUOTFfU1QgKyAweDIwKQkvKiBSZWFsLXRpbWUgQWxhcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU1RfQUxNVgkJKDB4ZmZmZmYgPDwgMCkJCS8qIEFsYXJtIFZhbHVlICovCisKKyNkZWZpbmUJQVQ5MV9TVF9DUlRSCQkoQVQ5MV9TVCArIDB4MjQpCS8qIEN1cnJlbnQgUmVhbC10aW1lIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NUX0NSVFYJCSgweGZmZmZmIDw8IDApCQkvKiBDdXJyZW50IFJlYWwtVGltZSBWYWx1ZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV90Yy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3RjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwNmViMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV90Yy5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3RjLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKKyAqCisgKiBUaW1lci9Db3VudGVyIFVuaXQgKFRDKSByZWdpc3RlcnMuCisgKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX1RDX0gKKyNkZWZpbmUgQVQ5MV9UQ19ICisKKyNkZWZpbmUgQVQ5MV9UQ19CQ1IJCTB4YzAJCS8qIFRDIEJsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfVENfU1lOQwkJKDEgPDwgMCkJLyogU3luY2hybyBDb21tYW5kICovCisKKyNkZWZpbmUgQVQ5MV9UQ19CTVIJCTB4YzQJCS8qIFRDIEJsb2NrIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfVENfVEMwWEMwUwkJKDMgPDwgMCkJLyogRXh0ZXJuYWwgQ2xvY2sgU2lnbmFsIDAgU2VsZWN0aW9uICovCisjZGVmaW5lCQkJQVQ5MV9UQ19UQzBYQzBTX1RDTEswCQkoMCA8PCAwKQorI2RlZmluZQkJCUFUOTFfVENfVEMwWEMwU19OT05FCQkoMSA8PCAwKQorI2RlZmluZQkJCUFUOTFfVENfVEMwWEMwU19USU9BMQkJKDIgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1RDX1RDMFhDMFNfVElPQTIJCSgzIDw8IDApCisjZGVmaW5lCQlBVDkxX1RDX1RDMVhDMVMJCSgzIDw8IDIpCS8qIEV4dGVybmFsIENsb2NrIFNpZ25hbCAxIFNlbGVjdGlvbiAqLworI2RlZmluZQkJCUFUOTFfVENfVEMxWEMxU19UQ0xLMQkJKDAgPDwgMikKKyNkZWZpbmUJCQlBVDkxX1RDX1RDMVhDMVNfTk9ORQkJKDEgPDwgMikKKyNkZWZpbmUJCQlBVDkxX1RDX1RDMVhDMVNfVElPQTAJCSgyIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9UQ19UQzFYQzFTX1RJT0EyCQkoMyA8PCAyKQorI2RlZmluZQkJQVQ5MV9UQ19UQzJYQzJTCQkoMyA8PCA0KQkvKiBFeHRlcm5hbCBDbG9jayBTaWduYWwgMiBTZWxlY3Rpb24gKi8KKyNkZWZpbmUJCQlBVDkxX1RDX1RDMlhDMlNfVENMSzIJCSgwIDw8IDQpCisjZGVmaW5lCQkJQVQ5MV9UQ19UQzJYQzJTX05PTkUJCSgxIDw8IDQpCisjZGVmaW5lCQkJQVQ5MV9UQ19UQzJYQzJTX1RJT0EwCQkoMiA8PCA0KQorI2RlZmluZQkJCUFUOTFfVENfVEMyWEMyU19USU9BMQkJKDMgPDwgNCkKKworCisjZGVmaW5lIEFUOTFfVENfQ0NSCQkweDAwCQkvKiBDaGFubmVsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfVENfQ0xLRU4JCSgxIDw8IDApCS8qIENvdW50ZXIgQ2xvY2sgRW5hYmxlIENvbW1hbmQgKi8KKyNkZWZpbmUJCUFUOTFfVENfQ0xLRElTCQkoMSA8PCAxKQkvKiBDb3VudGVyIENMb2NrIERpc2FibGUgQ29tbWFuZCAqLworI2RlZmluZQkJQVQ5MV9UQ19TV1RSRwkJKDEgPDwgMikJLyogU29mdHdhcmUgVHJpZ2dlciBDb21tYW5kICovCisKKyNkZWZpbmUgQVQ5MV9UQ19DTVIJCTB4MDQJCS8qIENoYW5uZWwgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9UQ19UQ0NMS1MJCSg3IDw8IDApCS8qIENhcHR1cmUvV2F2ZWZvcm0gTW9kZTogQ2xvY2sgU2VsZWN0aW9uICovCisjZGVmaW5lCQkJQVQ5MV9UQ19USU1FUl9DTE9DSzEJCSgwIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9UQ19USU1FUl9DTE9DSzIJCSgxIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9UQ19USU1FUl9DTE9DSzMJCSgyIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9UQ19USU1FUl9DTE9DSzQJCSgzIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9UQ19USU1FUl9DTE9DSzUJCSg0IDw8IDApCisjZGVmaW5lCQkJQVQ5MV9UQ19YQzAJCQkoNSA8PCAwKQorI2RlZmluZQkJCUFUOTFfVENfWEMxCQkJKDYgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1RDX1hDMgkJCSg3IDw8IDApCisjZGVmaW5lCQlBVDkxX1RDX0NMS0kJCSgxIDw8IDMpCS8qIENhcHR1cmUvV2F2ZWZvcm0gTW9kZTogQ2xvY2sgSW52ZXJ0ICovCisjZGVmaW5lCQlBVDkxX1RDX0JVUlNUCQkoMyA8PCA0KQkvKiBDYXB0dXJlL1dhdmVmb3JtIE1vZGU6IEJ1cnN0IFNpZ25hbCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUJCUFUOTFfVENfTERCU1RPUAkJKDEgPDwgNikJLyogQ2FwdHVyZSBNb2RlOiBDb3VudGVyIENsb2NrIFN0b3BwZWQgd2l0aCBUQiBMb2FkaW5nICovCisjZGVmaW5lCQlBVDkxX1RDX0xEQkRJUwkJKDEgPDwgNykJLyogQ2FwdHVyZSBNb2RlOiBDb3VudGVyIENsb2NrIERpc2FibGUgd2l0aCBSQiBMb2FkaW5nICovCisjZGVmaW5lCQlBVDkxX1RDX0VUUkdFREcJCSgzIDw8IDgpCS8qIENhcHR1cmUgTW9kZTogRXh0ZXJuYWwgVHJpZ2dlciBFZGdlIFNlbGVjdGlvbiAqLworI2RlZmluZQkJQVQ5MV9UQ19BQkVUUkcJCSgxIDw8IDEwKQkvKiBDYXB0dXJlIE1vZGU6IFRJT0Egb3IgVElPQiBFeHRlcm5hbCBUcmlnZ2VyIFNlbGVjdGlvbiAqLworI2RlZmluZQkJQVQ5MV9UQ19DUENUUkcJCSgxIDw8IDE0KQkvKiBDYXB0dXJlIE1vZGU6IFJDIENvbXBhcmUgVHJpZ2dlciBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfVENfV0FWRQkJKDEgPDwgMTUpCS8qIENhcHR1cmUvV2F2ZWZvcm0gbW9kZSAqLworI2RlZmluZQkJQVQ5MV9UQ19MRFJBCQkoMyA8PCAxNikJLyogQ2FwdHVyZSBNb2RlOiBSQSBMb2FkaW5nIFNlbGVjdGlvbiAqLworI2RlZmluZQkJQVQ5MV9UQ19MRFJCCQkoMyA8PCAxOCkJLyogQ2FwdHVyZSBNb2RlOiBSQiBMb2FkaW5nIFNlbGVjdGlvbiAqLworCisjZGVmaW5lCQlBVDkxX1RDX0NQQ1NUT1AJCSgxIDw8ICA2KQkvKiBXYXZlZm9ybSBNb2RlOiBDb3VudGVyIENsb2NrIFN0b3BwZWQgd2l0aCBSQyBDb21wYXJlICovCisjZGVmaW5lCQlBVDkxX1RDX0NQQ0RJUwkJKDEgPDwgIDcpCS8qIFdhdmVmb3JtIE1vZGU6IENvdW50ZXIgQ2xvY2sgRGlzYWJsZSB3aXRoIFJDIENvbXBhcmUgKi8KKyNkZWZpbmUJCUFUOTFfVENfRUVWVEVERwkJKDMgPDwgIDgpCS8qIFdhdmVmb3JtIE1vZGU6IEV4dGVybmFsIEV2ZW50IEVkZ2UgU2VsZWN0aW9uICovCisjZGVmaW5lCQkJQVQ5MV9UQ19FRVZURURHX05PTkUJCSgwIDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9UQ19FRVZURURHX1JJU0lORwkJKDEgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX1RDX0VFVlRFREdfRkFMTElORwkJKDIgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX1RDX0VFVlRFREdfQk9USAkJKDMgPDwgOCkKKyNkZWZpbmUJCUFUOTFfVENfRUVWVAkJKDMgPDwgMTApCS8qIFdhdmVmb3JtIE1vZGU6IEV4dGVybmFsIEV2ZW50IFNlbGVjdGlvbiAqLworI2RlZmluZQkJCUFUOTFfVENfRUVWVF9USU9CCQkoMCA8PCAxMCkKKyNkZWZpbmUJCQlBVDkxX1RDX0VFVlRfWEMwCQkoMSA8PCAxMCkKKyNkZWZpbmUJCQlBVDkxX1RDX0VFVlRfWEMxCQkoMiA8PCAxMCkKKyNkZWZpbmUJCQlBVDkxX1RDX0VFVlRfWEMyCQkoMyA8PCAxMCkKKyNkZWZpbmUJCUFUOTFfVENfRU5FVFJHCQkoMSA8PCAxMikJLyogV2F2ZWZvcm0gTW9kZTogRXh0ZXJuYWwgRXZlbnQgVHJpZ2dlciBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfVENfV0FWRVNFTAkJKDMgPDwgMTMpCS8qIFdhdmVmb3JtIE1vZGU6IFdhdmVmb3JtIFNlbGVjdGlvbiAqLworI2RlZmluZQkJCUFUOTFfVENfV0FWRVNFTF9VUAkJKDAgPDwgMTMpCisjZGVmaW5lCQkJQVQ5MV9UQ19XQVZFU0VMX1VQX0FVVE8JCSgyIDw8IDEzKQorI2RlZmluZQkJCUFUOTFfVENfV0FWRVNFTF9VUERPV04JCSgxIDw8IDEzKQorI2RlZmluZQkJCUFUOTFfVENfV0FWRVNFTF9VUERPV05fQVVUTwkoMyA8PCAxMykKKyNkZWZpbmUJCUFUOTFfVENfQUNQQQkJKDMgPDwgMTYpCS8qIFdhdmVmb3JtIE1vZGU6IFJBIENvbXBhcmUgRWZmZWN0IG9uIFRJT0EgKi8KKyNkZWZpbmUJCQlBVDkxX1RDX0FDUEFfTk9ORQkJKDAgPDwgMTYpCisjZGVmaW5lCQkJQVQ5MV9UQ19BQ1BBX1NFVAkJKDEgPDwgMTYpCisjZGVmaW5lCQkJQVQ5MV9UQ19BQ1BBX0NMRUFSCQkoMiA8PCAxNikKKyNkZWZpbmUJCQlBVDkxX1RDX0FDUEFfVE9HR0xFCQkoMyA8PCAxNikKKyNkZWZpbmUJCUFUOTFfVENfQUNQQwkJKDMgPDwgMTgpCS8qIFdhdmVmb3JtIE1vZGU6IFJDIENvbXByZSBFZmZlY3Qgb24gVElPQSAqLworI2RlZmluZQkJCUFUOTFfVENfQUNQQ19OT05FCQkoMCA8PCAxOCkKKyNkZWZpbmUJCQlBVDkxX1RDX0FDUENfU0VUCQkoMSA8PCAxOCkKKyNkZWZpbmUJCQlBVDkxX1RDX0FDUENfQ0xFQVIJCSgyIDw8IDE4KQorI2RlZmluZQkJCUFUOTFfVENfQUNQQ19UT0dHTEUJCSgzIDw8IDE4KQorI2RlZmluZQkJQVQ5MV9UQ19BRUVWVAkJKDMgPDwgMjApCS8qIFdhdmVmb3JtIE1vZGU6IEV4dGVybmFsIEV2ZW50IEVmZmVjdCBvbiBUSU9BICovCisjZGVmaW5lCQkJQVQ5MV9UQ19BRUVWVF9OT05FCQkoMCA8PCAyMCkKKyNkZWZpbmUJCQlBVDkxX1RDX0FFRVZUX1NFVAkJKDEgPDwgMjApCisjZGVmaW5lCQkJQVQ5MV9UQ19BRUVWVF9DTEVBUgkJKDIgPDwgMjApCisjZGVmaW5lCQkJQVQ5MV9UQ19BRUVWVF9UT0dHTEUJCSgzIDw8IDIwKQorI2RlZmluZQkJQVQ5MV9UQ19BU1dUUkcJCSgzIDw8IDIyKQkvKiBXYXZlZm9ybSBNb2RlOiBTb2Z0d2FyZSBUcmlnZ2VyIEVmZmVjdCBvbiBUSU9BICovCisjZGVmaW5lCQkJQVQ5MV9UQ19BU1dUUkdfTk9ORQkJKDAgPDwgMjIpCisjZGVmaW5lCQkJQVQ5MV9UQ19BU1dUUkdfU0VUCQkoMSA8PCAyMikKKyNkZWZpbmUJCQlBVDkxX1RDX0FTV1RSR19DTEVBUgkJKDIgPDwgMjIpCisjZGVmaW5lCQkJQVQ5MV9UQ19BU1dUUkdfVE9HR0xFCQkoMyA8PCAyMikKKyNkZWZpbmUJCUFUOTFfVENfQkNQQgkJKDMgPDwgMjQpCS8qIFdhdmVmb3JtIE1vZGU6IFJCIENvbXBhcmUgRWZmZWN0IG9uIFRJT0IgKi8KKyNkZWZpbmUJCQlBVDkxX1RDX0JDUEJfTk9ORQkJKDAgPDwgMjQpCisjZGVmaW5lCQkJQVQ5MV9UQ19CQ1BCX1NFVAkJKDEgPDwgMjQpCisjZGVmaW5lCQkJQVQ5MV9UQ19CQ1BCX0NMRUFSCQkoMiA8PCAyNCkKKyNkZWZpbmUJCQlBVDkxX1RDX0JDUEJfVE9HR0xFCQkoMyA8PCAyNCkKKyNkZWZpbmUJCUFUOTFfVENfQkNQQwkJKDMgPDwgMjYpCS8qIFdhdmVmb3JtIE1vZGU6IFJDIENvbXBhcmUgRWZmZWN0IG9uIFRJT0IgKi8KKyNkZWZpbmUJCQlBVDkxX1RDX0JDUENfTk9ORQkJKDAgPDwgMjYpCisjZGVmaW5lCQkJQVQ5MV9UQ19CQ1BDX1NFVAkJKDEgPDwgMjYpCisjZGVmaW5lCQkJQVQ5MV9UQ19CQ1BDX0NMRUFSCQkoMiA8PCAyNikKKyNkZWZpbmUJCQlBVDkxX1RDX0JDUENfVE9HR0xFCQkoMyA8PCAyNikKKyNkZWZpbmUJCUFUOTFfVENfQkVFVlQJCSgzIDw8IDI4KQkvKiBXYXZlZm9ybSBNb2RlOiBFeHRlcm5hbCBFdmVudCBFZmZlY3Qgb24gVElPQiAqLworI2RlZmluZQkJCUFUOTFfVENfQkVFVlRfTk9ORQkJKDAgPDwgMjgpCisjZGVmaW5lCQkJQVQ5MV9UQ19CRUVWVF9TRVQJCSgxIDw8IDI4KQorI2RlZmluZQkJCUFUOTFfVENfQkVFVlRfQ0xFQVIJCSgyIDw8IDI4KQorI2RlZmluZQkJCUFUOTFfVENfQkVFVlRfVE9HR0xFCQkoMyA8PCAyOCkKKyNkZWZpbmUJCUFUOTFfVENfQlNXVFJHCQkoMyA8PCAzMCkJLyogV2F2ZWZvcm0gTW9kZTogU29mdHdhcmUgVHJpZ2dlciBFZmZlY3Qgb24gVElPQiAqLworI2RlZmluZQkJCUFUOTFfVENfQlNXVFJHX05PTkUJCSgwIDw8IDMwKQorI2RlZmluZQkJCUFUOTFfVENfQlNXVFJHX1NFVAkJKDEgPDwgMzApCisjZGVmaW5lCQkJQVQ5MV9UQ19CU1dUUkdfQ0xFQVIJCSgyIDw8IDMwKQorI2RlZmluZQkJCUFUOTFfVENfQlNXVFJHX1RPR0dMRQkJKDMgPDwgMzApCisKKyNkZWZpbmUgQVQ5MV9UQ19DVgkJMHgxMAkJLyogQ291bnRlciBWYWx1ZSAqLworI2RlZmluZSBBVDkxX1RDX1JBCQkweDE0CQkvKiBSZWdpc3RlciBBICovCisjZGVmaW5lIEFUOTFfVENfUkIJCTB4MTgJCS8qIFJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgQVQ5MV9UQ19SQwkJMHgxYwkJLyogUmVnaXN0ZXIgQyAqLworCisjZGVmaW5lIEFUOTFfVENfU1IJCTB4MjAJCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9UQ19DT1ZGUwkJKDEgPDwgIDApCS8qIENvdW50ZXIgT3ZlcmZsb3cgU3RhdHVzICovCisjZGVmaW5lCQlBVDkxX1RDX0xPVlJTCQkoMSA8PCAgMSkJLyogTG9hZCBPdmVycnVuIFN0YXR1cyAqLworI2RlZmluZQkJQVQ5MV9UQ19DUEFTCQkoMSA8PCAgMikJLyogUkEgQ29tcGFyZSBTdGF0dXMgKi8KKyNkZWZpbmUJCUFUOTFfVENfQ1BCUwkJKDEgPDwgIDMpCS8qIFJCIENvbXBhcmUgU3RhdHVzICovCisjZGVmaW5lCQlBVDkxX1RDX0NQQ1MJCSgxIDw8ICA0KQkvKiBSQyBDb21wYXJlIFN0YXR1cyAqLworI2RlZmluZQkJQVQ5MV9UQ19MRFJBUwkJKDEgPDwgIDUpCS8qIFJBIExvYWRpbmcgU3RhdHVzICovCisjZGVmaW5lCQlBVDkxX1RDX0xEUkJTCQkoMSA8PCAgNikJLyogUkIgTG9hZGluZyBTdGF0dXMgKi8KKyNkZWZpbmUJCUFUOTFfVENfRVRSR1MJCSgxIDw8ICA3KQkvKiBFeHRlcm5hbCBUcmlnZ2VyIFN0YXR1cyAqLworI2RlZmluZQkJQVQ5MV9UQ19DTEtTVEEJCSgxIDw8IDE2KQkvKiBDbG9jayBFbmFibGluZyBTdGF0dXMgKi8KKyNkZWZpbmUJCUFUOTFfVENfTVRJT0EJCSgxIDw8IDE3KQkvKiBUSU9BIE1pcnJvciAqLworI2RlZmluZQkJQVQ5MV9UQ19NVElPQgkJKDEgPDwgMTgpCS8qIFRJT0IgTWlycm9yICovCisKKyNkZWZpbmUgQVQ5MV9UQ19JRVIJCTB4MjQJCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9UQ19JRFIJCTB4MjgJCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfVENfSU1SCQkweDJjCQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV90d2kuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV90d2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGE5MTRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3R3aS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfdHdpLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSXZhbiBLb2tzaGF5c2t5CisgKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKKyAqCisgKiBUd28td2lyZSBJbnRlcmZhY2UgKFRXSSkgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MV9UV0lfSAorI2RlZmluZSBBVDkxX1RXSV9ICisKKyNkZWZpbmUJQVQ5MV9UV0lfQ1IJCTB4MDAJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfVFdJX1NUQVJUCQkoMSA8PCAgMCkJLyogU2VuZCBhIFN0YXJ0IENvbmRpdGlvbiAqLworI2RlZmluZQkJQVQ5MV9UV0lfU1RPUAkJKDEgPDwgIDEpCS8qIFNlbmQgYSBTdG9wIENvbmRpdGlvbiAqLworI2RlZmluZQkJQVQ5MV9UV0lfTVNFTgkJKDEgPDwgIDIpCS8qIE1hc3RlciBUcmFuc2ZlciBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfVFdJX01TRElTCQkoMSA8PCAgMykJLyogTWFzdGVyIFRyYW5zZmVyIERpc2FibGUgKi8KKyNkZWZpbmUJCUFUOTFfVFdJX1NXUlNUCQkoMSA8PCAgNykJLyogU29mdHdhcmUgUmVzZXQgKi8KKworI2RlZmluZQlBVDkxX1RXSV9NTVIJCTB4MDQJCS8qIE1hc3RlciBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1RXSV9JQURSU1oJCSgzICAgIDw8ICA4KQkvKiBJbnRlcm5hbCBEZXZpY2UgQWRkcmVzcyBTaXplICovCisjZGVmaW5lCQkJQVQ5MV9UV0lfSUFEUlNaX05PCQkoMCA8PCA4KQorI2RlZmluZQkJCUFUOTFfVFdJX0lBRFJTWl8xCQkoMSA8PCA4KQorI2RlZmluZQkJCUFUOTFfVFdJX0lBRFJTWl8yCQkoMiA8PCA4KQorI2RlZmluZQkJCUFUOTFfVFdJX0lBRFJTWl8zCQkoMyA8PCA4KQorI2RlZmluZQkJQVQ5MV9UV0lfTVJFQUQJCSgxICAgIDw8IDEyKQkvKiBNYXN0ZXIgUmVhZCBEaXJlY3Rpb24gKi8KKyNkZWZpbmUJCUFUOTFfVFdJX0RBRFIJCSgweDdmIDw8IDE2KQkvKiBEZXZpY2UgQWRkcmVzcyAqLworCisjZGVmaW5lCUFUOTFfVFdJX0lBRFIJCTB4MGMJCS8qIEludGVybmFsIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlBVDkxX1RXSV9DV0dSCQkweDEwCQkvKiBDbG9jayBXYXZlZm9ybSBHZW5lcmF0b3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfVFdJX0NMRElWCQkoMHhmZiA8PCAgMCkJLyogQ2xvY2sgTG93IERpdmlzb3IgKi8KKyNkZWZpbmUJCUFUOTFfVFdJX0NIRElWCQkoMHhmZiA8PCAgOCkJLyogQ2xvY2sgSGlnaCBEaXZpc29yICovCisjZGVmaW5lCQlBVDkxX1RXSV9DS0RJVgkJKDcgICAgPDwgMTYpCS8qIENsb2NrIERpdmlkZXIgKi8KKworI2RlZmluZQlBVDkxX1RXSV9TUgkJMHgyMAkJLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1RXSV9UWENPTVAJCSgxIDw8ICAwKQkvKiBUcmFuc21pc3Npb24gQ29tcGxldGUgKi8KKyNkZWZpbmUJCUFUOTFfVFdJX1JYUkRZCQkoMSA8PCAgMSkJLyogUmVjZWl2ZSBIb2xkaW5nIFJlZ2lzdGVyIFJlYWR5ICovCisjZGVmaW5lCQlBVDkxX1RXSV9UWFJEWQkJKDEgPDwgIDIpCS8qIFRyYW5zbWl0IEhvbGRpbmcgUmVnaXN0ZXIgUmVhZHkgKi8KKyNkZWZpbmUJCUFUOTFfVFdJX09WUkUJCSgxIDw8ICA2KQkvKiBPdmVycnVuIEVycm9yIFtBVDkxUk05MjAwIG9ubHldICovCisjZGVmaW5lCQlBVDkxX1RXSV9VTlJFCQkoMSA8PCAgNykJLyogVW5kZXJydW4gRXJyb3IgW0FUOTFSTTkyMDAgb25seV0gKi8KKyNkZWZpbmUJCUFUOTFfVFdJX05BQ0sJCSgxIDw8ICA4KQkvKiBOb3QgQWNrbm93bGVkZ2VkICovCisKKyNkZWZpbmUJQVQ5MV9UV0lfSUVSCQkweDI0CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFUOTFfVFdJX0lEUgkJMHgyOAkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVQ5MV9UV0lfSU1SCQkweDJjCQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX1RXSV9SSFIJCTB4MzAJCS8qIFJlY2VpdmUgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZQlBVDkxX1RXSV9USFIJCTB4MzQJCS8qIFRyYW5zbWl0IEhvbGRpbmcgUmVnaXN0ZXIgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV93ZHQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MV93ZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzYzZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3dkdC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFfd2R0LmgKKyAqCisgKiBXYXRjaGRvZyBUaW1lciAoV0RUKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFTQU05MjYxIGRhdGFzaGVldCByZXZpc2lvbiBELgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBVDkxX1dEVF9ICisjZGVmaW5lIEFUOTFfV0RUX0gKKworI2RlZmluZSBBVDkxX1dEVF9DUgkJKEFUOTFfV0RUICsgMHgwMCkJLyogV2F0Y2hkb2cgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9XRFRfV0RSU1RUCQkoMSAgICA8PCAwKQkJLyogUmVzdGFydCAqLworI2RlZmluZQkJQVQ5MV9XRFRfS0VZCQkoMHhmZiA8PCAyNCkJCS8qIEtFWSBQYXNzd29yZCAqLworCisjZGVmaW5lIEFUOTFfV0RUX01SCQkoQVQ5MV9XRFQgKyAweDA0KQkvKiBXYXRjaGRvZyBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1dEVF9XRFYJCSgweGZmZiA8PCAwKQkJLyogQ291bnRlciBWYWx1ZSAqLworI2RlZmluZQkJQVQ5MV9XRFRfV0RGSUVOCQkoMSAgICAgPDwgMTIpCQkvKiBGYXVsdCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1dEVF9XRFJTVEVOCSgxICAgICA8PCAxMykJCS8qIFJlc2V0IFByb2Nlc3NvciAqLworI2RlZmluZQkJQVQ5MV9XRFRfV0RSUFJPQwkoMSAgICAgPDwgMTQpCQkvKiBUaW1lciBSZXN0YXJ0ICovCisjZGVmaW5lCQlBVDkxX1dEVF9XRERJUwkJKDEgICAgIDw8IDE1KQkJLyogV2F0Y2hkb2cgRGlzYWJsZSAqLworI2RlZmluZQkJQVQ5MV9XRFRfV0RECQkoMHhmZmYgPDwgMTYpCQkvKiBEZWx0YSBWYWx1ZSAqLworI2RlZmluZQkJQVQ5MV9XRFRfV0REQkdITFQJKDEgICAgIDw8IDI4KQkJLyogRGVidWcgSGFsdCAqLworI2RlZmluZQkJQVQ5MV9XRFRfV0RJRExFSExUCSgxICAgICA8PCAyOSkJCS8qIElkbGUgSGFsdCAqLworCisjZGVmaW5lIEFUOTFfV0RUX1NSCQkoQVQ5MV9XRFQgKyAweDA4KQkvKiBXYXRjaGRvZyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfV0RUX1dEVU5GCQkoMSA8PCAwKQkJLyogV2F0Y2hkb2cgVW5kZXJmbG93ICovCisjZGVmaW5lCQlBVDkxX1dEVF9XREVSUgkJKDEgPDwgMSkJCS8qIFdhdGNoZG9nIEVycm9yICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDAuaAppbmRleCBhNWE4NmIxLi40ZDUxMTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDAuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDAuaApAQCAtODAsNiArODAsMjIgQEAKIAogCiAvKgorICogU3lzdGVtIFBlcmlwaGVyYWxzIChvZmZzZXQgZnJvbSBBVDkxX0JBU0VfU1lTKQorICovCisjZGVmaW5lIEFUOTFfQUlDCSgweGZmZmZmMDAwIC0gQVQ5MV9CQVNFX1NZUykJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVCSgweGZmZmZmMjAwIC0gQVQ5MV9CQVNFX1NZUykJLyogRGVidWcgVW5pdCAqLworI2RlZmluZSBBVDkxX1BJT0EJKDB4ZmZmZmY0MDAgLSBBVDkxX0JBU0VfU1lTKQkvKiBQSU8gQ29udHJvbGxlciBBICovCisjZGVmaW5lIEFUOTFfUElPQgkoMHhmZmZmZjYwMCAtIEFUOTFfQkFTRV9TWVMpCS8qIFBJTyBDb250cm9sbGVyIEIgKi8KKyNkZWZpbmUgQVQ5MV9QSU9DCSgweGZmZmZmODAwIC0gQVQ5MV9CQVNFX1NZUykJLyogUElPIENvbnRyb2xsZXIgQyAqLworI2RlZmluZSBBVDkxX1BJT0QJKDB4ZmZmZmZhMDAgLSBBVDkxX0JBU0VfU1lTKQkvKiBQSU8gQ29udHJvbGxlciBEICovCisjZGVmaW5lIEFUOTFfUE1DCSgweGZmZmZmYzAwIC0gQVQ5MV9CQVNFX1NZUykJLyogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sbGVyICovCisjZGVmaW5lIEFUOTFfU1QJCSgweGZmZmZmZDAwIC0gQVQ5MV9CQVNFX1NZUykJLyogU3lzdGVtIFRpbWVyICovCisjZGVmaW5lIEFUOTFfUlRDCSgweGZmZmZmZTAwIC0gQVQ5MV9CQVNFX1NZUykJLyogUmVhbC1UaW1lIENsb2NrICovCisjZGVmaW5lIEFUOTFfTUMJCSgweGZmZmZmZjAwIC0gQVQ5MV9CQVNFX1NZUykJLyogTWVtb3J5IENvbnRyb2xsZXJzICovCisKKyNkZWZpbmUgQVQ5MV9NQVRSSVgJMAkvKiBub3Qgc3VwcG9ydGVkICovCisKKy8qCiAgKiBJbnRlcm5hbCBNZW1vcnkuCiAgKi8KICNkZWZpbmUgQVQ5MVJNOTIwMF9ST01fQkFTRQkweDAwMTAwMDAwCS8qIEludGVybmFsIFJPTSBiYXNlIGFkZHJlc3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9tYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX21jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwZDgxNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9tYy5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX21jLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSXZhbiBLb2tzaGF5c2t5CisgKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKKyAqCisgKiBNZW1vcnkgQ29udHJvbGxlcnMgKE1DLCBFQkksIFNNQywgU0RSQU1DLCBCRkMpIC0gU3lzdGVtIHBlcmlwaGVyYWxzIHJlZ2lzdGVycy4KKyAqIEJhc2VkIG9uIEFUOTFSTTkyMDAgZGF0YXNoZWV0IHJldmlzaW9uIEUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFSTTkyMDBfTUNfSAorI2RlZmluZSBBVDkxUk05MjAwX01DX0gKKworLyogTWVtb3J5IENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgQVQ5MV9NQ19SQ1IJCShBVDkxX01DICsgMHgwMCkJLyogTUMgUmVtYXAgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQ19SQ0IJCSgxIDw8ICAwKQkJLyogUmVtYXAgQ29tbWFuZCBCaXQgKi8KKworI2RlZmluZSBBVDkxX01DX0FTUgkJKEFUOTFfTUMgKyAweDA0KQkvKiBNQyBBYm9ydCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUNfVU5BREQJCSgxIDw8ICAwKQkJLyogVW5kZWZpbmVkIEFkZHJlc3MgQWJvcnQgU3RhdHVzICovCisjZGVmaW5lCQlBVDkxX01DX01JU0FERAkJKDEgPDwgIDEpCQkvKiBNaXNhbGlnbmVkIEFkZHJlc3MgQWJvcnQgU3RhdHVzICovCisjZGVmaW5lCQlBVDkxX01DX0FCVFNaCQkoMyA8PCAgOCkJCS8qIEFib3J0IFNpemUgU3RhdHVzICovCisjZGVmaW5lCQkJQVQ5MV9NQ19BQlRTWl9CWVRFCQkoMCA8PCA4KQorI2RlZmluZQkJCUFUOTFfTUNfQUJUU1pfSEFMRldPUkQJCSgxIDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9NQ19BQlRTWl9XT1JECQkoMiA8PCA4KQorI2RlZmluZQkJQVQ5MV9NQ19BQlRUWVAJCSgzIDw8IDEwKQkJLyogQWJvcnQgVHlwZSBTdGF0dXMgKi8KKyNkZWZpbmUJCQlBVDkxX01DX0FCVFRZUF9EQVRBUkVBRAkJKDAgPDwgMTApCisjZGVmaW5lCQkJQVQ5MV9NQ19BQlRUWVBfREFUQVdSSVRFCSgxIDw8IDEwKQorI2RlZmluZQkJCUFUOTFfTUNfQUJUVFlQX0ZFVENICQkoMiA8PCAxMCkKKyNkZWZpbmUJCUFUOTFfTUNfTVNUMAkJKDEgPDwgMTYpCQkvKiBBUk05MjBUIEFib3J0IFNvdXJjZSAqLworI2RlZmluZQkJQVQ5MV9NQ19NU1QxCQkoMSA8PCAxNykJCS8qIFBEQyBBYm9ydCBTb3VyY2UgKi8KKyNkZWZpbmUJCUFUOTFfTUNfTVNUMgkJKDEgPDwgMTgpCQkvKiBVSFAgQWJvcnQgU291cmNlICovCisjZGVmaW5lCQlBVDkxX01DX01TVDMJCSgxIDw8IDE5KQkJLyogRU1BQyBBYm9ydCBTb3VyY2UgKi8KKyNkZWZpbmUJCUFUOTFfTUNfU1ZNU1QwCQkoMSA8PCAyNCkJCS8qIFNhdmVkIEFSTTkyMFQgQWJvcnQgU291cmNlICovCisjZGVmaW5lCQlBVDkxX01DX1NWTVNUMQkJKDEgPDwgMjUpCQkvKiBTYXZlZCBQREMgQWJvcnQgU291cmNlICovCisjZGVmaW5lCQlBVDkxX01DX1NWTVNUMgkJKDEgPDwgMjYpCQkvKiBTYXZlZCBVSFAgQWJvcnQgU291cmNlICovCisjZGVmaW5lCQlBVDkxX01DX1NWTVNUMwkJKDEgPDwgMjcpCQkvKiBTYXZlZCBFTUFDIEFib3J0IFNvdXJjZSAqLworCisjZGVmaW5lIEFUOTFfTUNfQUFTUgkJKEFUOTFfTUMgKyAweDA4KQkvKiBNQyBBYm9ydCBBZGRyZXNzIFN0YXR1cyBSZWdpc3RlciAqLworCisjZGVmaW5lIEFUOTFfTUNfTVBSCQkoQVQ5MV9NQyArIDB4MGMpCS8qIE1DIE1hc3RlciBQcmlvcml0eSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NUFJfTVNUUDAJCSg3IDw8ICAwKQkJLyogQVJNOTIwVCBQcmlvcml0eSAqLworI2RlZmluZQkJQVQ5MV9NUFJfTVNUUDEJCSg3IDw8ICA0KQkJLyogUERDIFByaW9yaXR5ICovCisjZGVmaW5lCQlBVDkxX01QUl9NU1RQMgkJKDcgPDwgIDgpCQkvKiBVSFAgUHJpb3JpdHkgKi8KKyNkZWZpbmUJCUFUOTFfTVBSX01TVFAzCQkoNyA8PCAxMikJCS8qIEVNQUMgUHJpb3JpdHkgKi8KKworLyogRXh0ZXJuYWwgQnVzIEludGVyZmFjZSAoRUJJKSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVQ5MV9FQklfQ1NBCQkoQVQ5MV9NQyArIDB4NjApCS8qIENoaXAgU2VsZWN0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfRUJJX0NTMEEJCSgxIDw8IDApCQkvKiBDaGlwIFNlbGVjdCAwIEFzc2lnbm1lbnQgKi8KKyNkZWZpbmUJCQlBVDkxX0VCSV9DUzBBX1NNQwkJKDAgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX0VCSV9DUzBBX0JGQwkJKDEgPDwgMCkKKyNkZWZpbmUJCUFUOTFfRUJJX0NTMUEJCSgxIDw8IDEpCQkvKiBDaGlwIFNlbGVjdCAxIEFzc2lnbm1lbnQgKi8KKyNkZWZpbmUJCQlBVDkxX0VCSV9DUzFBX1NNQwkJKDAgPDwgMSkKKyNkZWZpbmUJCQlBVDkxX0VCSV9DUzFBX1NEUkFNQwkJKDEgPDwgMSkKKyNkZWZpbmUJCUFUOTFfRUJJX0NTM0EJCSgxIDw8IDMpCQkvKiBDaGlwIFNlbGVjdCAyIEFzc2lnbm1lbnQgKi8KKyNkZWZpbmUJCQlBVDkxX0VCSV9DUzNBX1NNQwkJKDAgPDwgMykKKyNkZWZpbmUJCQlBVDkxX0VCSV9DUzNBX1NNQ19TTUFSVE1FRElBCSgxIDw8IDMpCisjZGVmaW5lCQlBVDkxX0VCSV9DUzRBCQkoMSA8PCA0KQkJLyogQ2hpcCBTZWxlY3QgMyBBc3NpZ25tZW50ICovCisjZGVmaW5lCQkJQVQ5MV9FQklfQ1M0QV9TTUMJCSgwIDw8IDQpCisjZGVmaW5lCQkJQVQ5MV9FQklfQ1M0QV9TTUNfQ09NUEFDVEZMQVNICSgxIDw8IDQpCisjZGVmaW5lIEFUOTFfRUJJX0NGR1IJCShBVDkxX01DICsgMHg2NCkJLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9FQklfREJQVUMJCSgxIDw8IDApCQkvKiBEYXRhIEJ1cyBQdWxsLVVwIENvbmZpZ3VyYXRpb24gKi8KKworLyogU3RhdGljIE1lbW9yeSBDb250cm9sbGVyIChTTUMpIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVDkxX1NNQ19DU1IobikJCShBVDkxX01DICsgMHg3MCArICgobikgKiA0KSkvKiBTTUMgQ2hpcCBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU01DX05XUwkJKDB4N2YgPDwgIDApCQkvKiBOdW1iZXIgb2YgV2FpdCBTdGF0ZXMgKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19OV1NfKHgpCSgoeCkgPDwgMCkKKyNkZWZpbmUJCUFUOTFfU01DX1dTRU4JCSgxICAgIDw8ICA3KQkJLyogV2FpdCBTdGF0ZSBFbmFibGUgKi8KKyNkZWZpbmUJCUFUOTFfU01DX1RERgkJKDB4ZiAgPDwgIDgpCQkvKiBEYXRhIEZsb2F0IFRpbWUgKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19UREZfKHgpCSgoeCkgPDwgOCkKKyNkZWZpbmUJCUFUOTFfU01DX0JBVAkJKDEgICAgPDwgMTIpCQkvKiBCeXRlIEFjY2VzcyBUeXBlICovCisjZGVmaW5lCQlBVDkxX1NNQ19EQlcJCSgzICAgIDw8IDEzKQkJLyogRGF0YSBCdXMgV2lkdGggKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19EQldfMTYJCSgxIDw8IDEzKQorI2RlZmluZQkJCUFUOTFfU01DX0RCV184CQkoMiA8PCAxMykKKyNkZWZpbmUJCUFUOTFfU01DX0RQUgkJKDEgPDwgMTUpCQkvKiBEYXRhIFJlYWQgUHJvdG9jb2wgKi8KKyNkZWZpbmUJCUFUOTFfU01DX0FDU1MJCSgzIDw8IDE2KQkJLyogQWRkcmVzcyB0byBDaGlwIFNlbGVjdCBTZXR1cCAqLworI2RlZmluZQkJCUFUOTFfU01DX0FDU1NfU1RECSgwIDw8IDE2KQorI2RlZmluZQkJCUFUOTFfU01DX0FDU1NfMQkJKDEgPDwgMTYpCisjZGVmaW5lCQkJQVQ5MV9TTUNfQUNTU18yCQkoMiA8PCAxNikKKyNkZWZpbmUJCQlBVDkxX1NNQ19BQ1NTXzMJCSgzIDw8IDE2KQorI2RlZmluZQkJQVQ5MV9TTUNfUldTRVRVUAkoNyA8PCAyNCkJCS8qIFJlYWQgJiBXcml0ZSBTaWduYWwgVGltZSBTZXR1cCAqLworI2RlZmluZQkJCUFUOTFfU01DX1JXU0VUVVBfKHgpCSgoeCkgPDwgMjQpCisjZGVmaW5lCQlBVDkxX1NNQ19SV0hPTEQJCSg3IDw8IDI4KQkJLyogUmVhZCAmIFdyaXRlIFNpZ25hbCBIb2xkIFRpbWUgKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19SV0hPTERfKHgpCSgoeCkgPDwgMjgpCisKKy8qIFNEUkFNIENvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFUOTFfU0RSQU1DX01SCQkoQVQ5MV9NQyArIDB4OTApCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX01PREUJKDB4ZiA8PCAwKQkJLyogQ29tbWFuZCBNb2RlICovCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTU9ERV9OT1JNQUwJCSgwIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTU9ERV9OT1AJCSgxIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTU9ERV9QUkVDSEFSR0UJKDIgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX0xNUgkJKDMgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX1JFRlJFU0gJKDQgPDwgMCkKKyNkZWZpbmUJCUFUOTFfU0RSQU1DX0RCVwkJKDEgICA8PCA0KQkJLyogRGF0YSBCdXMgV2lkdGggKi8KKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19EQldfMzIJKDAgPDwgNCkKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19EQldfMTYJKDEgPDwgNCkKKworI2RlZmluZSBBVDkxX1NEUkFNQ19UUgkJKEFUOTFfTUMgKyAweDk0KQkvKiBSZWZyZXNoIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19DT1VOVAkoMHhmZmYgPDwgMCkJCS8qIFJlZnJlc2ggVGltZXIgQ291bnQgKi8KKworI2RlZmluZSBBVDkxX1NEUkFNQ19DUgkJKEFUOTFfTUMgKyAweDk4KQkvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19OQwkJKDMgICA8PCAgMCkJCS8qIE51bWJlciBvZiBDb2x1bW4gQml0cyAqLworI2RlZmluZQkJCUFUOTFfU0RSQU1DX05DXzgJKDAgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OQ185CSgxIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTkNfMTAJKDIgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OQ18xMQkoMyA8PCAwKQorI2RlZmluZQkJQVQ5MV9TRFJBTUNfTlIJCSgzICAgPDwgIDIpCQkvKiBOdW1iZXIgb2YgUm93IEJpdHMgKi8KKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OUl8xMQkoMCA8PCAyKQorI2RlZmluZQkJCUFUOTFfU0RSQU1DX05SXzEyCSgxIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTlJfMTMJKDIgPDwgMikKKyNkZWZpbmUJCUFUOTFfU0RSQU1DX05CCQkoMSAgIDw8ICA0KQkJLyogTnVtYmVyIG9mIEJhbmtzICovCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTkJfMgkoMCA8PCA0KQorI2RlZmluZQkJCUFUOTFfU0RSQU1DX05CXzQJKDEgPDwgNCkKKyNkZWZpbmUJCUFUOTFfU0RSQU1DX0NBUwkJKDMgICA8PCAgNSkJCS8qIENBUyBMYXRlbmN5ICovCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfQ0FTXzIJKDIgPDwgNSkKKyNkZWZpbmUJCUFUOTFfU0RSQU1DX1RXUgkJKDB4ZiA8PCAgNykJCS8qIFdyaXRlIFJlY292ZXJ5IERlbGF5ICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19UUkMJCSgweGYgPDwgMTEpCQkvKiBSb3cgQ3ljbGUgRGVsYXkgKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX1RSUAkJKDB4ZiA8PCAxNSkJCS8qIFJvdyBQcmVjaGFyZ2UgRGVsYXkgKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX1RSQ0QJKDB4ZiA8PCAxOSkJCS8qIFJvdyB0byBDb2x1bW4gRGVsYXkgKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX1RSQVMJKDB4ZiA8PCAyMykJCS8qIEFjdGl2ZSB0byBQcmVjaGFyZ2UgRGVsYXkgKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX1RYU1IJKDB4ZiA8PCAyNykJCS8qIEV4aXQgU2VsZiBSZWZyZXNoIHRvIEFjdGl2ZSBEZWxheSAqLworCisjZGVmaW5lIEFUOTFfU0RSQU1DX1NSUgkJKEFUOTFfTUMgKyAweDljKQkvKiBTZWxmIFJlZnJlc2ggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TRFJBTUNfTFBSCQkoQVQ5MV9NQyArIDB4YTApCS8qIExvdyBQb3dlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NEUkFNQ19JRVIJCShBVDkxX01DICsgMHhhNCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NEUkFNQ19JRFIJCShBVDkxX01DICsgMHhhOCkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TRFJBTUNfSU1SCQkoQVQ5MV9NQyArIDB4YWMpCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfU0RSQU1DX0lTUgkJKEFUOTFfTUMgKyAweGIwKQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKy8qIEJ1cnN0IEZsYXNoIENvbnRyb2xsZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9CRkNfTVIJCShBVDkxX01DICsgMHhjMCkJLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9CRkNfQkZDT00JCSgzICAgPDwgIDApCQkvKiBCdXJzdCBGbGFzaCBDb250cm9sbGVyIE9wZXJhdGluZyBNb2RlICovCisjZGVmaW5lCQkJQVQ5MV9CRkNfQkZDT01fRElTQUJMRUQJKDAgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX0JGQ19CRkNPTV9BU1lOQwkoMSA8PCAwKQorI2RlZmluZQkJCUFUOTFfQkZDX0JGQ09NX0JVUlNUCSgyIDw8IDApCisjZGVmaW5lCQlBVDkxX0JGQ19CRkNDCQkoMyAgIDw8ICAyKQkJLyogQnVyc3QgRmxhc2ggQ29udHJvbGxlciBDbG9jayAqLworI2RlZmluZQkJCUFUOTFfQkZDX0JGQ0NfTUNLCSgxIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9CRkNfQkZDQ19ESVYyCSgyIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9CRkNfQkZDQ19ESVY0CSgzIDw8IDIpCisjZGVmaW5lCQlBVDkxX0JGQ19BVkwJCSgweGYgPDwgIDQpCQkvKiBBZGRyZXNzIFZhbGlkIExhdGVuY3kgKi8KKyNkZWZpbmUJCUFUOTFfQkZDX1BBR0VTCQkoNyAgIDw8ICA4KQkJLyogUGFnZSBTaXplICovCisjZGVmaW5lCQkJQVQ5MV9CRkNfUEFHRVNfTk9fUEFHRQkoMCA8PCA4KQorI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzE2CSgxIDw8IDgpCisjZGVmaW5lCQkJQVQ5MV9CRkNfUEFHRVNfMzIJKDIgPDwgOCkKKyNkZWZpbmUJCQlBVDkxX0JGQ19QQUdFU182NAkoMyA8PCA4KQorI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzEyOAkoNCA8PCA4KQorI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzI1NgkoNSA8PCA4KQorI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzUxMgkoNiA8PCA4KQorI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzEwMjQJKDcgPDwgOCkKKyNkZWZpbmUJCUFUOTFfQkZDX09FTAkJKDMgICA8PCAxMikJCS8qIE91dHB1dCBFbmFibGUgTGF0ZW5jeSAqLworI2RlZmluZQkJQVQ5MV9CRkNfQkFBRU4JCSgxICAgPDwgMTYpCQkvKiBCdXJzdCBBZGRyZXNzIEFkdmFuY2UgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX0JGQ19CRk9FSAkJKDEgICA8PCAxNykJCS8qIEJ1cnN0IEZsYXNoIE91dHB1dCBFbmFibGUgSGFuZGxpbmcgKi8KKyNkZWZpbmUJCUFUOTFfQkZDX01VWEVOCQkoMSAgIDw8IDE4KQkJLyogTXVsdGlwbGV4ZWQgQnVzIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9CRkNfUkRZRU4JCSgxICAgPDwgMTkpCQkvKiBSZWFkeSBFbmFibGUgTW9kZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9tY2kuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9tY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4NjM2ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfbWNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9tY2kuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKLSAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQotICoKLSAqIE11bHRpTWVkaWEgQ2FyZCBJbnRlcmZhY2UgKE1DSSkgcmVnaXN0ZXJzLgotICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgQVQ5MVJNOTIwMF9NQ0lfSAotI2RlZmluZSBBVDkxUk05MjAwX01DSV9ICi0KLSNkZWZpbmUgQVQ5MV9NQ0lfQ1IJCTB4MDAJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX01DSUVOCQkoMSA8PCAgMCkJLyogTXVsdGktTWVkaWEgSW50ZXJmYWNlIEVuYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfTUNJRElTCQkoMSA8PCAgMSkJLyogTXVsdGktTWVkaWEgSW50ZXJmYWNlIERpc2FibGUgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1BXU0VOCQkoMSA8PCAgMikJLyogUG93ZXIgU2F2ZSBNb2RlIEVuYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUFdTRElTCQkoMSA8PCAgMykJLyogUG93ZXIgU2F2ZSBNb2RlIERpc2FibGUgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1NXUlNUCQkoMSA8PCAgNykJLyogU29mdHdhcmUgUmVzZXQgKi8KLQotI2RlZmluZSBBVDkxX01DSV9NUgkJMHgwNAkJLyogTW9kZSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfQ0xLRElWCQkoMHhmZiAgPDwgIDApCS8qIENsb2NrIERpdmlkZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1BXU0RJVgkJKDMgICAgIDw8ICA4KQkvKiBQb3dlciBTYXZpbmcgRGl2aWRlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUERDUEFEVgkoMSAgICAgPDwgMTQpCS8qIFBEQyBQYWRkaW5nIFZhbHVlICovCi0jZGVmaW5lCQlBVDkxX01DSV9QRENNT0RFCSgxICAgICA8PCAxNSkJLyogUERDLW9yaWVudGF0ZWQgTW9kZSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfQkxLTEVOIAkoMHhmZmYgPDwgMTgpCS8qIERhdGEgQmxvY2sgTGVuZ3RoICovCi0KLSNkZWZpbmUgQVQ5MV9NQ0lfRFRPUgkJMHgwOAkJLyogRGF0YSBUaW1lb3V0IFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9DWUMJCSgweGYgPDwgMCkJLyogRGF0YSBUaW1lb3V0IEN5Y2xlIE51bWJlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMCQkoNyAgIDw8IDQpCS8qIERhdGEgVGltZW91dCBNdWx0aXBsaWVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfMQkJKDAgPDwgIDQpCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfMTYJCSgxIDw8ICA0KQotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzEyOAkJKDIgPDwgIDQpCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfMjU2CQkoMyA8PCAgNCkKLSNkZWZpbmUJCUFUOTFfTUNJX0RUT01VTF8xSwkJKDQgPDwgIDQpCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfNEsJCSg1IDw8ICA0KQotI2RlZmluZQkJQVQ5MV9NQ0lfRFRPTVVMXzY0SwkJKDYgPDwgIDQpCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9NVUxfMU0JCSg3IDw8ICA0KQotCi0jZGVmaW5lIEFUOTFfTUNJX1NEQ1IJCTB4MGMJCS8qIFNEIENhcmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1NEQ1NFTAkJKDB4ZiA8PCAwKQkvKiBTRCBDYXJkIFNlbGVjdG9yICovCi0jZGVmaW5lCQlBVDkxX01DSV9TRENCVVMJCSgxICAgPDwgNykJLyogMS1iaXQgb3IgNC1iaXQgYnVzICovCi0KLSNkZWZpbmUgQVQ5MV9NQ0lfQVJHUgkJMHgxMAkJLyogQXJndW1lbnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBBVDkxX01DSV9DTURSCQkweDE0CQkvKiBDb21tYW5kIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9DTUROQgkJKDB4M2YgPDwgMCkJLyogQ29tbWFuZCBOdW1iZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1JTUFRZUAkJKDMgICAgPDwgNikJLyogUmVzcG9uc2UgVHlwZSAqLwotI2RlZmluZQkJCUFUOTFfTUNJX1JTUFRZUF9OT05FCSgwIDw8ICA2KQotI2RlZmluZQkJCUFUOTFfTUNJX1JTUFRZUF80OAkoMSA8PCAgNikKLSNkZWZpbmUJCQlBVDkxX01DSV9SU1BUWVBfMTM2CSgyIDw8ICA2KQotI2RlZmluZQkJQVQ5MV9NQ0lfU1BDTUQJCSg3ICAgIDw8IDgpCS8qIFNwZWNpYWwgQ29tbWFuZCAqLwotI2RlZmluZQkJCUFUOTFfTUNJX1NQQ01EX05PTkUJKDAgPDwgIDgpCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfU1BDTURfSU5JVAkoMSA8PCAgOCkKLSNkZWZpbmUJCQlBVDkxX01DSV9TUENNRF9TWU5DCSgyIDw8ICA4KQotI2RlZmluZQkJCUFUOTFfTUNJX1NQQ01EX0lDTUQJKDQgPDwgIDgpCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfU1BDTURfSVJFU1AJKDUgPDwgIDgpCi0jZGVmaW5lCQlBVDkxX01DSV9PUERDTUQJCSgxIDw8IDExKQkvKiBPcGVuIERyYWluIENvbW1hbmQgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX01BWExBVAkJKDEgPDwgMTIpCS8qIE1heCBMYXRlbmN5IGZvciBDb21tYW5kIHRvIFJlc3BvbnNlICovCi0jZGVmaW5lCQlBVDkxX01DSV9UUkNNRAkJKDMgPDwgMTYpCS8qIFRyYW5zZmVyIENvbW1hbmQgKi8KLSNkZWZpbmUJCQlBVDkxX01DSV9UUkNNRF9OT05FCSgwIDw8IDE2KQotI2RlZmluZQkJCUFUOTFfTUNJX1RSQ01EX1NUQVJUCSgxIDw8IDE2KQotI2RlZmluZQkJCUFUOTFfTUNJX1RSQ01EX1NUT1AJKDIgPDwgMTYpCi0jZGVmaW5lCQlBVDkxX01DSV9UUkRJUgkJKDEgPDwgMTgpCS8qIFRyYW5zZmVyIERpcmVjdGlvbiAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfVFJUWVAJCSgzIDw8IDE5KQkvKiBUcmFuc2ZlciBUeXBlICovCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfVFJUWVBfQkxPQ0sJKDAgPDwgMTkpCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfVFJUWVBfTVVMVElQTEUJKDEgPDwgMTkpCi0jZGVmaW5lCQkJQVQ5MV9NQ0lfVFJUWVBfU1RSRUFNCSgyIDw8IDE5KQotCi0jZGVmaW5lIEFUOTFfTUNJX1JTUFIobikJKDB4MjAgKyAoKG4pICogNCkpCS8qIFJlc3BvbnNlIFJlZ2lzdGVycyAwLTMgKi8KLSNkZWZpbmUgQVQ5MV9NQ1JfUkRSCQkweDMwCQkvKiBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9NQ1JfVERSCQkweDM0CQkvKiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgQVQ5MV9NQ0lfU1IJCTB4NDAJCS8qIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfQ01EUkRZCQkoMSA8PCAgMCkJLyogQ29tbWFuZCBSZWFkeSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUlhSRFkJCSgxIDw8ICAxKSAJLyogUmVjZWl2ZXIgUmVhZHkgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1RYUkRZCQkoMSA8PCAgMikJLyogVHJhbnNtaXQgUmVhZHkgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX0JMS0UJCSgxIDw8ICAzKQkvKiBEYXRhIEJsb2NrIEVuZGVkICovCi0jZGVmaW5lCQlBVDkxX01DSV9EVElQCQkoMSA8PCAgNCkJLyogRGF0YSBUcmFuc2ZlciBpbiBQcm9ncmVzcyAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfTk9UQlVTWQkoMSA8PCAgNSkJLyogRGF0YSBOb3QgQnVzeSAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfRU5EUlgJCSgxIDw8ICA2KQkvKiBFbmQgb2YgUlggQnVmZmVyICovCi0jZGVmaW5lCQlBVDkxX01DSV9FTkRUWAkJKDEgPDwgIDcpCS8qIEVuZCBmbyBUWCBCdWZmZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1JYQlVGRgkJKDEgPDwgMTQpCS8qIFJYIEJ1ZmZlciBGdWxsICovCi0jZGVmaW5lCQlBVDkxX01DSV9UWEJVRkUJCSgxIDw8IDE1KQkvKiBUWCBCdWZmZXIgRW1wdHkgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1JJTkRFCQkoMSA8PCAxNikgIAkvKiBSZXNwb25zZSBJbmRleCBFcnJvciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfUkRJUkUJCSgxIDw8IDE3KQkvKiBSZXNwb25zZSBEaXJlY3Rpb24gRXJyb3IgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1JDUkNFCQkoMSA8PCAxOCkgICAJLyogUmVzcG9uc2UgQ1JDIEVycm9yICovCi0jZGVmaW5lCQlBVDkxX01DSV9SRU5ERQkJKDEgPDwgMTkpCS8qIFJlc3BvbnNlIEVuZCBCaXQgRXJyb3IgKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1JUT0UJCSgxIDw8IDIwKQkvKiBSZXBvbnNlIFRpbWUtb3V0IEVycm9yICovCi0jZGVmaW5lCQlBVDkxX01DSV9EQ1JDRQkJKDEgPDwgMjEpCS8qIERhdGEgQ1JDIEVycm9yICovCi0jZGVmaW5lCQlBVDkxX01DSV9EVE9FCQkoMSA8PCAyMikJLyogRGF0YSBUaW1lLW91dCBFcnJvciAqLwotI2RlZmluZQkJQVQ5MV9NQ0lfT1ZSRQkJKDEgPDwgMzApCS8qIE92ZXJydW4gKi8KLSNkZWZpbmUJCUFUOTFfTUNJX1VOUkUJCSgxIDw8IDMxKQkvKiBVbmRlcnJ1biAqLwotCi0jZGVmaW5lIEFUOTFfTUNJX0lFUgkJMHg0NAkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX01DSV9JRFIJCTB4NDgJCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfTUNJX0lNUgkJMHg0YwkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfcGRjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfcGRjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTE1MGQ0NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfcGRjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3BkYy5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQotICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCi0gKgotICogUGVyaXBoZXJhbCBEYXRhIENvbnRyb2xsZXIgKFBEQykgcmVnaXN0ZXJzLgotICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgQVQ5MVJNOTIwMF9QRENfSAotI2RlZmluZSBBVDkxUk05MjAwX1BEQ19ICi0KLSNkZWZpbmUgQVQ5MV9QRENfUlBSCQkweDEwMAkvKiBSZWNlaXZlIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9QRENfUkNSCQkweDEwNAkvKiBSZWNlaXZlIENvdW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9QRENfVFBSCQkweDEwOAkvKiBUcmFuc21pdCBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfUERDX1RDUgkJMHgxMGMJLyogVHJhbnNtaXQgQ291bnRlciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1BEQ19STlBSCQkweDExMAkvKiBSZWNlaXZlIE5leHQgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1BEQ19STkNSCQkweDExNAkvKiBSZWNlaXZlIE5leHQgQ291bnRlciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1BEQ19UTlBSCQkweDExOAkvKiBUcmFuc21pdCBOZXh0IFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9QRENfVE5DUgkJMHgxMWMJLyogVHJhbnNtaXQgTmV4dCBDb3VudGVyIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgQVQ5MV9QRENfUFRDUgkJMHgxMjAJLyogVHJhbnNmZXIgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9QRENfUlhURU4JCSgxIDw8IDApCS8qIFJlY2VpdmVyIFRyYW5zZmVyIEVuYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9QRENfUlhURElTCQkoMSA8PCAxKQkvKiBSZWNlaXZlciBUcmFuc2ZlciBEaXNhYmxlICovCi0jZGVmaW5lCQlBVDkxX1BEQ19UWFRFTgkJKDEgPDwgOCkJLyogVHJhbnNtaXR0ZXIgVHJhbnNmZXIgRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX1BEQ19UWFRESVMJCSgxIDw8IDkpCS8qIFRyYW5zbWl0dGVyIFRyYW5zZmVyIERpc2FibGUgKi8KLQotI2RlZmluZSBBVDkxX1BEQ19QVFNSCQkweDEyNAkvKiBUcmFuc2ZlciBTdGF0dXMgUmVnaXN0ZXIgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfc3BpLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfc3BpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjVlYTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3NwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9zcGkuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKLSAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQotICoKLSAqIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSByZWdpc3RlcnMuCi0gKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBFLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBBVDkxUk05MjAwX1NQSV9ICi0jZGVmaW5lIEFUOTFSTTkyMDBfU1BJX0gKLQotI2RlZmluZSBBVDkxX1NQSV9DUgkJCTB4MDAJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX1NQSUVOCQkoMSA8PCAgMCkJCS8qIFNQSSBFbmFibGUgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX1NQSURJUwkJKDEgPDwgIDEpCQkvKiBTUEkgRGlzYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9TUElfU1dSU1QJCSgxIDw8ICA3KQkJLyogU1BJIFNvZnR3YXJlIFJlc2V0ICovCi0jZGVmaW5lCQlBVDkxX1NQSV9MQVNUWEZFUgkoMSA8PCAyNCkJCS8qIExhc3QgVHJhbnNmZXIgW1NBTTkyNjEgb25seV0gKi8KLQotI2RlZmluZSBBVDkxX1NQSV9NUgkJCTB4MDQJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX01TVFIJCSgxICAgIDw8ICAwKQkJLyogTWFzdGVyL1NsYXZlIE1vZGUgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX1BTCQkoMSAgICA8PCAgMSkJCS8qIFBlcmlwaGVyYWwgU2VsZWN0ICovCi0jZGVmaW5lCQkJQVQ5MV9TUElfUFNfRklYRUQJKDAgPDwgMSkKLSNkZWZpbmUJCQlBVDkxX1NQSV9QU19WQVJJQUJMRQkoMSA8PCAxKQotI2RlZmluZQkJQVQ5MV9TUElfUENTREVDCQkoMSAgICA8PCAgMikJCS8qIENoaXAgU2VsZWN0IERlY29kZSAqLwotI2RlZmluZQkJQVQ5MV9TUElfRElWMzIJCSgxICAgIDw8ICAzKQkJLyogQ2xvY2sgU2VsZWN0aW9uICovCi0jZGVmaW5lCQlBVDkxX1NQSV9NT0RGRElTCSgxICAgIDw8ICA0KQkJLyogTW9kZSBGYXVsdCBEZXRlY3Rpb24gKi8KLSNkZWZpbmUJCUFUOTFfU1BJX0xMQgkJKDEgICAgPDwgIDcpCQkvKiBMb2NhbCBMb29wYmFjayBFbmFibGUgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX1BDUwkJKDB4ZiAgPDwgMTYpCQkvKiBQZXJpcGhlcmFsIENoaXAgU2VsZWN0ICovCi0jZGVmaW5lCQlBVDkxX1NQSV9ETFlCQ1MJCSgweGZmIDw8IDI0KQkJLyogRGVsYXkgQmV0d2VlbiBDaGlwIFNlbGVjdHMgKi8KLQotI2RlZmluZSBBVDkxX1NQSV9SRFIJCTB4MDgJCQkvKiBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX1JECQkoMHhmZmZmIDw8ICAwKQkJLyogUmVjZWl2ZSBEYXRhICovCi0jZGVmaW5lCQlBVDkxX1NQSV9QQ1MJCSgweGYJPDwgMTYpCQkvKiBQZXJpcGhlcmFsIENoaXAgU2VsZWN0ICovCi0KLSNkZWZpbmUgQVQ5MV9TUElfVERSCQkweDBjCQkJLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9TUElfVEQJCSgweGZmZmYgPDwgIDApCQkvKiBUcmFuc21pdCBEYXRhICovCi0jZGVmaW5lCQlBVDkxX1NQSV9QQ1MJCSgweGYJPDwgMTYpCQkvKiBQZXJpcGhlcmFsIENoaXAgU2VsZWN0ICovCi0jZGVmaW5lCQlBVDkxX1NQSV9MQVNUWEZFUgkoMQk8PCAyNCkJCS8qIExhc3QgVHJhbnNmZXIgW1NBTTkyNjEgb25seV0gKi8KLQotI2RlZmluZSBBVDkxX1NQSV9TUgkJMHgxMAkJCS8qIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9TUElfUkRSRgkJKDEgPDwgIDApCQkvKiBSZWNlaXZlIERhdGEgUmVnaXN0ZXIgRnVsbCAqLwotI2RlZmluZQkJQVQ5MV9TUElfVERSRQkJKDEgPDwgIDEpCQkvKiBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEZ1bGwgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX01PREYJCSgxIDw8ICAyKQkJLyogTW9kZSBGYXVsdCBFcnJvciAqLwotI2RlZmluZQkJQVQ5MV9TUElfT1ZSRVMJCSgxIDw8ICAzKQkJLyogT3ZlcnJ1biBFcnJvciBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX0VORFJYCQkoMSA8PCAgNCkJCS8qIEVuZCBvZiBSWCBidWZmZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX0VORFRYCQkoMSA8PCAgNSkJCS8qIEVuZCBvZiBUWCBidWZmZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX1JYQlVGRgkJKDEgPDwgIDYpCQkvKiBSWCBCdWZmZXIgRnVsbCAqLwotI2RlZmluZQkJQVQ5MV9TUElfVFhCVUZFCQkoMSA8PCAgNykJCS8qIFRYIEJ1ZmZlciBFbXB0eSAqLwotI2RlZmluZQkJQVQ5MV9TUElfTlNTUgkJKDEgPDwgIDgpCQkvKiBOU1MgUmlzaW5nIFtTQU05MjYxIG9ubHldICovCi0jZGVmaW5lCQlBVDkxX1NQSV9UWEVNUFRZCSgxIDw8ICA5KQkJLyogVHJhbnNtaXNzaW9uIFJlZ2lzdGVyIEVtcHR5IFtTQU05MjYxIG9ubHldICovCi0jZGVmaW5lCQlBVDkxX1NQSV9TUElFTlMJCSgxIDw8IDE2KQkJLyogU1BJIEVuYWJsZSBTdGF0dXMgKi8KLQotI2RlZmluZSBBVDkxX1NQSV9JRVIJCTB4MTQJCQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfU1BJX0lEUgkJMHgxOAkJCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfU1BJX0lNUgkJMHgxYwkJCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgQVQ5MV9TUElfQ1NSKG4pCQkoMHgzMCArICgobikgKiA0KSkJLyogQ2hpcCBTZWxlY3QgUmVnaXN0ZXJzIDAtMyAqLwotI2RlZmluZQkJQVQ5MV9TUElfQ1BPTAkJKDEgICAgPDwgIDApCQkvKiBDbG9jayBQb2xhcml0eSAqLwotI2RlZmluZQkJQVQ5MV9TUElfTkNQSEEJCSgxICAgIDw8ICAxKQkJLyogQ2xvY2sgUGhhc2UgKi8KLSNkZWZpbmUJCUFUOTFfU1BJX0NTQUFUCQkoMSAgICA8PCAgMykJCS8qIENoaXAgU2VsZWN0IEFjdGl2ZSBBZnRlciBUcmFuc2ZlciBbU0FNOTI2MSBvbmx5XSAqLwotI2RlZmluZQkJQVQ5MV9TUElfQklUUwkJKDB4ZiAgPDwgIDQpCQkvKiBCaXRzIFBlciBUcmFuc2ZlciAqLwotI2RlZmluZQkJCUFUOTFfU1BJX0JJVFNfOAkJKDAgPDwgNCkKLSNkZWZpbmUJCQlBVDkxX1NQSV9CSVRTXzkJCSgxIDw8IDQpCi0jZGVmaW5lCQkJQVQ5MV9TUElfQklUU18xMAkoMiA8PCA0KQotI2RlZmluZQkJCUFUOTFfU1BJX0JJVFNfMTEJKDMgPDwgNCkKLSNkZWZpbmUJCQlBVDkxX1NQSV9CSVRTXzEyCSg0IDw8IDQpCi0jZGVmaW5lCQkJQVQ5MV9TUElfQklUU18xMwkoNSA8PCA0KQotI2RlZmluZQkJCUFUOTFfU1BJX0JJVFNfMTQJKDYgPDwgNCkKLSNkZWZpbmUJCQlBVDkxX1NQSV9CSVRTXzE1CSg3IDw8IDQpCi0jZGVmaW5lCQkJQVQ5MV9TUElfQklUU18xNgkoOCA8PCA0KQotI2RlZmluZQkJQVQ5MV9TUElfU0NCUgkJKDB4ZmYgPDwgIDgpCQkvKiBTZXJpYWwgQ2xvY2sgQmF1ZCBSYXRlICovCi0jZGVmaW5lCQlBVDkxX1NQSV9ETFlCUwkJKDB4ZmYgPDwgMTYpCQkvKiBEZWxheSBiZWZvcmUgU1BDSyAqLwotI2RlZmluZQkJQVQ5MV9TUElfRExZQkNUCQkoMHhmZiA8PCAyNCkJCS8qIERlbGF5IGJldHdlZW4gQ29uc2VjdXRpdmUgVHJhbnNmZXJzICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3NzYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3NzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzg4MDIyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF9zc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfc3NjLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKLSAqCi0gKiBTZXJpYWwgU3luY2hyb25vdXMgQ29udHJvbGxlciAoU1NDKSByZWdpc3RlcnMuCi0gKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBFLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBBVDkxUk05MjAwX1NTQ19ICi0jZGVmaW5lIEFUOTFSTTkyMDBfU1NDX0gKLQotI2RlZmluZSBBVDkxX1NTQ19DUgkJMHgwMAkvKiBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1NTQ19SWEVOCQkoMSA8PCAgMCkJLyogUmVjZWl2ZSBFbmFibGUgKi8KLSNkZWZpbmUJCUFUOTFfU1NDX1JYRElTCQkoMSA8PCAgMSkJLyogUmVjZWl2ZSBEaXNhYmxlICovCi0jZGVmaW5lCQlBVDkxX1NTQ19UWEVOCQkoMSA8PCAgOCkJLyogVHJhbnNtaXQgRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX1NTQ19UWERJUwkJKDEgPDwgIDkpCS8qIFRyYW5zbWl0IERpc2FibGUgKi8KLSNkZWZpbmUJCUFUOTFfU1NDX1NXUlNUCQkoMSA8PCAxNSkJLyogU29mdHdhcmUgUmVzZXQgKi8KLQotI2RlZmluZSBBVDkxX1NTQ19DTVIJCTB4MDQJLyogQ2xvY2sgTW9kZSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9TU0NfQ01SX0RJVgkoMHhmZmYgPDwgMCkJLyogQ2xvY2sgRGl2aWRlciAqLwotCi0jZGVmaW5lIEFUOTFfU1NDX1JDTVIJCTB4MTAJLyogUmVjZWl2ZSBDbG9jayBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1NTQ19DS1MJCSgzICAgIDw8ICAwKQkvKiBDbG9jayBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCQlBVDkxX1NTQ19DS1NfRElWCQkoMCA8PCAwKQotI2RlZmluZQkJCUFUOTFfU1NDX0NLU19DTE9DSwkJKDEgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1NTQ19DS1NfUElOCQkoMiA8PCAwKQotI2RlZmluZQkJQVQ5MV9TU0NfQ0tPCQkoNyAgICA8PCAgMikJLyogQ2xvY2sgT3V0cHV0IE1vZGUgU2VsZWN0aW9uICovCi0jZGVmaW5lCQkJQVQ5MV9TU0NfQ0tPX05PTkUJCSgwIDw8IDIpCi0jZGVmaW5lCQkJQVQ5MV9TU0NfQ0tPX0NPTlRJTlVPVVMJCSgxIDw8IDIpCi0jZGVmaW5lCQlBVDkxX1NTQ19DS0kJCSgxICAgIDw8ICA1KQkvKiBDbG9jayBJbnZlcnNpb24gKi8KLSNkZWZpbmUJCQlBVDkxX1NTQ19DS0lfRkFMTElORwkJKDAgPDwgNSkKLSNkZWZpbmUJCQlBVDkxX1NTQ19DS19SSVNJTkcJCSgxIDw8IDUpCi0jZGVmaW5lCQlBVDkxX1NTQ19TVEFSVAkJKDB4ZiAgPDwgIDgpCS8qIFN0YXJ0IFNlbGVjdGlvbiAqLwotI2RlZmluZQkJCUFUOTFfU1NDX1NUQVJUX0NPTlRJTlVPVVMJKDAgPDwgOCkKLSNkZWZpbmUJCQlBVDkxX1NTQ19TVEFSVF9UWF9SWAkJKDEgPDwgOCkKLSNkZWZpbmUJCQlBVDkxX1NTQ19TVEFSVF9MT1dfUkYJCSgyIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9TU0NfU1RBUlRfSElHSF9SRgkJKDMgPDwgOCkKLSNkZWZpbmUJCQlBVDkxX1NTQ19TVEFSVF9GQUxMSU5HX1JGCSg0IDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9TU0NfU1RBUlRfUklTSU5HX1JGCSg1IDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9TU0NfU1RBUlRfTEVWRUxfUkYJCSg2IDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9TU0NfU1RBUlRfRURHRV9SRgkJKDcgPDwgOCkKLSNkZWZpbmUJCUFUOTFfU1NDX1NUVERMWQkJKDB4ZmYgPDwgMTYpCS8qIFN0YXJ0IERlbGF5ICovCi0jZGVmaW5lCQlBVDkxX1NTQ19QRVJJT0QJCSgweGZmIDw8IDI0KQkvKiBQZXJpb2QgRGl2aWRlciBTZWxlY3Rpb24gKi8KLQotI2RlZmluZSBBVDkxX1NTQ19SRk1SCQkweDE0CS8qIFJlY2VpdmUgRnJhbWUgTW9kZSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9TU0NfREFUQUxFTgkoMHgxZiA8PCAgMCkJLyogRGF0YSBMZW5ndGggKi8KLSNkZWZpbmUJCUFUOTFfU1NDX0xPT1AJCSgxICAgIDw8ICA1KQkvKiBMb29wIE1vZGUgKi8KLSNkZWZpbmUJCUFUOTFfU1NDX01TQkYJCSgxICAgIDw8ICA3KQkvKiBNb3N0IFNpZ25pZmljYW50IEJpdCBGaXJzdCAqLwotI2RlZmluZQkJQVQ5MV9TU0NfREFUTkIJCSgweGYgIDw8ICA4KQkvKiBEYXRhIE51bWJlciBwZXIgRnJhbWUgKi8KLSNkZWZpbmUJCUFUOTFfU1NDX0ZTTEVOCQkoMHhmICA8PCAxNikJLyogRnJhbWUgU3luYyBMZW5ndGggKi8KLSNkZWZpbmUJCUFUOTFfU1NDX0ZTT1MJCSg3ICAgIDw8IDIwKQkvKiBGcmFtZSBTeW5jIE91dHB1dCBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCQlBVDkxX1NTQ19GU09TX05PTkUJCSgwIDw8IDIwKQotI2RlZmluZQkJCUFUOTFfU1NDX0ZTT1NfTkVHQVRJVkUJCSgxIDw8IDIwKQotI2RlZmluZQkJCUFUOTFfU1NDX0ZTT1NfUE9TSVRJVkUJCSgyIDw8IDIwKQotI2RlZmluZQkJCUFUOTFfU1NDX0ZTT1NfTE9XCQkoMyA8PCAyMCkKLSNkZWZpbmUJCQlBVDkxX1NTQ19GU09TX0hJR0gJCSg0IDw8IDIwKQotI2RlZmluZQkJCUFUOTFfU1NDX0ZTT1NfVE9HR0xFCQkoNSA8PCAyMCkKLSNkZWZpbmUJCUFUOTFfU1NDX0ZTRURHRQkJKDEgICAgPDwgMjQpCS8qIEZyYW1lIFN5bmMgRWRnZSBEZXRlY3Rpb24gKi8KLSNkZWZpbmUJCQlBVDkxX1NTQ19GU0VER0VfUE9TSVRJVkUJKDAgPDwgMjQpCi0jZGVmaW5lCQkJQVQ5MV9TU0NfRlNFREdFX05FR0FUSVZFCSgxIDw8IDI0KQotCi0jZGVmaW5lIEFUOTFfU1NDX1RDTVIJCTB4MTgJLyogVHJhbnNtaXQgQ2xvY2sgTW9kZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1NTQ19URk1SCQkweDFjCS8qIFRyYW5zbWl0IEZyYW0gTW9kZSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9TU0NfREFUREVGCQkoMSA8PCAgNSkJLyogRGF0YSBEZWZhdWx0IFZhbHVlICovCi0jZGVmaW5lCQlBVDkxX1NTQ19GU0RFTgkJKDEgPDwgMjMpCS8qIEZyYW1lIFN5bmMgRGF0YSBFbmFibGUgKi8KLQotI2RlZmluZSBBVDkxX1NTQ19SSFIJCTB4MjAJLyogUmVjZWl2ZSBIb2xkaW5nIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfU1NDX1RIUgkJMHgyNAkvKiBUcmFuc21pdCBIb2xkaW5nIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfU1NDX1JTSFIJCTB4MzAJLyogUmVjZWl2ZSBTeW5jIEhvbGRpbmcgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9TU0NfVFNIUgkJMHgzNAkvKiBUcmFuc21pdCBTeW5jIEhvbGRpbmcgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBBVDkxX1NTQ19TUgkJMHg0MAkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1NDX1RYUkRZCQkoMSA8PCAgMCkJLyogVHJhbnNtaXQgUmVhZHkgKi8KLSNkZWZpbmUJCUFUOTFfU1NDX1RYRU1QVFkJKDEgPDwgIDEpCS8qIFRyYW5zbWl0IEVtcHR5ICovCi0jZGVmaW5lCQlBVDkxX1NTQ19FTkRUWAkJKDEgPDwgIDIpCS8qIEVuZCBvZiBUcmFuc21pc3Npb24gKi8KLSNkZWZpbmUJCUFUOTFfU1NDX1RYQlVGRQkJKDEgPDwgIDMpCS8qIFRyYW5zbWl0IEJ1ZmZlciBFbXB0eSAqLwotI2RlZmluZQkJQVQ5MV9TU0NfUlhSRFkJCSgxIDw8ICA0KQkvKiBSZWNlaXZlIFJlYWR5ICovCi0jZGVmaW5lCQlBVDkxX1NTQ19PVlJVTgkJKDEgPDwgIDUpCS8qIFJlY2VpdmUgT3ZlcnJ1biAqLwotI2RlZmluZQkJQVQ5MV9TU0NfRU5EUlgJCSgxIDw8ICA2KQkvKiBFbmQgb2YgUmVjZXB0aW9uICovCi0jZGVmaW5lCQlBVDkxX1NTQ19SWEJVRkYJCSgxIDw8ICA3KQkvKiBSZWNlaXZlIEJ1ZmZlciBGdWxsICovCi0jZGVmaW5lCQlBVDkxX1NTQ19UWFNZTgkJKDEgPDwgMTApCS8qIFRyYW5zbWl0IFN5bmMgKi8KLSNkZWZpbmUJCUFUOTFfU1NDX1JYU1lOCQkoMSA8PCAxMSkJLyogUmVjZWl2ZSBTeW5jICovCi0jZGVmaW5lCQlBVDkxX1NTQ19UWEVOQQkJKDEgPDwgMTYpCS8qIFRyYW5zbWl0IEVuYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9TU0NfUlhFTkEJCSgxIDw8IDE3KQkvKiBSZWNlaXZlIEVuYWJsZSAqLwotCi0jZGVmaW5lIEFUOTFfU1NDX0lFUgkJMHg0NAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfU1NDX0lEUgkJMHg0OAkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1NTQ19JTVIJCTB4NGMJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfc3lzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfc3lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjkzZmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3N5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfc3lzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgSXZhbiBLb2tzaGF5c2t5Ci0gKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKLSAqCi0gKiBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgotICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgQVQ5MVJNOTIwMF9TWVNfSAotI2RlZmluZSBBVDkxUk05MjAwX1NZU19ICi0KLS8qCi0gKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlci4KLSAqLwotI2RlZmluZSBBVDkxX0FJQwkweDAwMAotCi0jZGVmaW5lIEFUOTFfQUlDX1NNUihuKQkJKEFUOTFfQUlDICsgKChuKSAqIDQpKQkvKiBTb3VyY2UgTW9kZSBSZWdpc3RlcnMgMC0zMSAqLwotI2RlZmluZQkJQVQ5MV9BSUNfUFJJT1IJCSg3IDw8IDApCQkvKiBQcmlvcml0eSBMZXZlbCAqLwotI2RlZmluZQkJQVQ5MV9BSUNfU1JDVFlQRQkoMyA8PCA1KQkJLyogSW50ZXJydXB0IFNvdXJjZSBUeXBlICovCi0jZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9MT1cJCSgwIDw8IDUpCi0jZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9GQUxMSU5HCSgxIDw8IDUpCi0jZGVmaW5lCQkJQVQ5MV9BSUNfU1JDVFlQRV9ISUdICQkoMiA8PCA1KQotI2RlZmluZQkJCUFUOTFfQUlDX1NSQ1RZUEVfUklTSU5HCQkoMyA8PCA1KQotCi0jZGVmaW5lIEFUOTFfQUlDX1NWUihuKQkJKEFUOTFfQUlDICsgMHg4MCArICgobikgKiA0KSkJLyogU291cmNlIFZlY3RvciBSZWdpc3RlcnMgMC0zMSAqLwotI2RlZmluZSBBVDkxX0FJQ19JVlIJCShBVDkxX0FJQyArIDB4MTAwKQkvKiBJbnRlcnJ1cHQgVmVjdG9yIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfQUlDX0ZWUgkJKEFUOTFfQUlDICsgMHgxMDQpCS8qIEZhc3QgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0FJQ19JU1IJCShBVDkxX0FJQyArIDB4MTA4KQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX0FJQ19JUlFJRAkJKDB4MWYgPDwgMCkJCS8qIEN1cnJlbnQgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KLQotI2RlZmluZSBBVDkxX0FJQ19JUFIJCShBVDkxX0FJQyArIDB4MTBjKQkvKiBJbnRlcnJ1cHQgUGVuZGluZyBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0FJQ19JTVIJCShBVDkxX0FJQyArIDB4MTEwKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0FJQ19DSVNSCQkoQVQ5MV9BSUMgKyAweDExNCkJLyogQ29yZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX0FJQ19ORklRCQkoMSA8PCAwKQkJLyogbkZJUSBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfQUlDX05JUlEJCSgxIDw8IDEpCQkvKiBuSVJRIFN0YXR1cyAqLwotCi0jZGVmaW5lIEFUOTFfQUlDX0lFQ1IJCShBVDkxX0FJQyArIDB4MTIwKQkvKiBJbnRlcnJ1cHQgRW5hYmxlIENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9BSUNfSURDUgkJKEFUOTFfQUlDICsgMHgxMjQpCS8qIEludGVycnVwdCBEaXNhYmxlIENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9BSUNfSUNDUgkJKEFUOTFfQUlDICsgMHgxMjgpCS8qIEludGVycnVwdCBDbGVhciBDb21tYW5kIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfQUlDX0lTQ1IJCShBVDkxX0FJQyArIDB4MTJjKQkvKiBJbnRlcnJ1cHQgU2V0IENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9BSUNfRU9JQ1IJCShBVDkxX0FJQyArIDB4MTMwKQkvKiBFbmQgb2YgSW50ZXJydXB0IENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9BSUNfU1BVCQkoQVQ5MV9BSUMgKyAweDEzNCkJLyogU3B1cmlvdXMgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0FJQ19EQ1IJCShBVDkxX0FJQyArIDB4MTM4KQkvKiBEZWJ1ZyBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX0FJQ19EQ1JfUFJPVAkoMSA8PCAwKQkJLyogUHJvdGVjdGlvbiBNb2RlICovCi0jZGVmaW5lCQlBVDkxX0FJQ19EQ1JfR01TSwkoMSA8PCAxKQkJLyogR2VuZXJhbCBNYXNrICovCi0KLQotLyoKLSAqIERlYnVnIFVuaXQuCi0gKi8KLSNkZWZpbmUgQVQ5MV9EQkdVCTB4MjAwCi0KLSNkZWZpbmUgQVQ5MV9EQkdVX0NSCQkoQVQ5MV9EQkdVICsgMHgwMCkJLyogQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfTVIJCShBVDkxX0RCR1UgKyAweDA0KQkvKiBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9JRVIJCShBVDkxX0RCR1UgKyAweDA4KQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX0RCR1VfVFhSRFkJCSgxIDw8IDEpCQkvKiBUcmFuc21pdHRlciBSZWFkeSAqLwotI2RlZmluZQkJQVQ5MV9EQkdVX1RYRU1QVFkJKDEgPDwgOSkJCS8qIFRyYW5zbWl0dGVyIEVtcHR5ICovCi0jZGVmaW5lIEFUOTFfREJHVV9JRFIJCShBVDkxX0RCR1UgKyAweDBjKQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfSU1SCQkoQVQ5MV9EQkdVICsgMHgxMCkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX1NSCQkoQVQ5MV9EQkdVICsgMHgxNCkJLyogU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9SSFIJCShBVDkxX0RCR1UgKyAweDE4KQkvKiBSZWNlaXZlciBIb2xkaW5nIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9USFIJCShBVDkxX0RCR1UgKyAweDFjKQkvKiBUcmFuc21pdHRlciBIb2xkaW5nIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9CUkdSCQkoQVQ5MV9EQkdVICsgMHgyMCkJLyogQmF1ZCBSYXRlIEdlbmVyYXRvciBSZWdpc3RlciAqLwotCi0jZGVmaW5lIEFUOTFfREJHVV9DSURSCQkoQVQ5MV9EQkdVICsgMHg0MCkJLyogQ2hpcCBJRCBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfRVhJRAkJKEFUOTFfREJHVSArIDB4NDQpCS8qIENoaXAgSUQgRXh0ZW5zaW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX0NJRFJfVkVSU0lPTgkoMHgxZiA8PCAwKQkJLyogVmVyc2lvbiBvZiB0aGUgRGV2aWNlICovCi0jZGVmaW5lCQlBVDkxX0NJRFJfRVBST0MJCSg3ICAgIDw8IDUpCQkvKiBFbWJlZGRlZCBQcm9jZXNzb3IgKi8KLSNkZWZpbmUJCUFUOTFfQ0lEUl9OVlBTSVoJKDB4ZiAgPDwgOCkJCS8qIE5vbnZvbGF0aWxlIFByb2dyYW0gTWVtb3J5IFNpemUgKi8KLSNkZWZpbmUJCUFUOTFfQ0lEUl9OVlBTSVoyCSgweGYgIDw8IDEyKQkJLyogU2Vjb25kIE5vbnZvbGF0aWxlIFByb2dyYW0gTWVtb3J5IFNpemUgKi8KLSNkZWZpbmUJCUFUOTFfQ0lEUl9TUkFNU0laCSgweGYgIDw8IDE2KQkJLyogSW50ZXJuYWwgU1JBTSBTaXplICovCi0jZGVmaW5lCQlBVDkxX0NJRFJfQVJDSAkJKDB4ZmYgPDwgMjApCQkvKiBBcmNoaXRlY3R1cmUgSWRlbnRpZmllciAqLwotI2RlZmluZQkJQVQ5MV9DSURSX05WUFRZUAkoNyAgICA8PCAyOCkJCS8qIE5vbnZvbGF0aWxlIFByb2dyYW0gTWVtb3J5IFR5cGUgKi8KLSNkZWZpbmUJCUFUOTFfQ0lEUl9FWFQJCSgxICAgIDw8IDMxKQkJLyogRXh0ZW5zaW9uIEZsYWcgKi8KLQotI2RlZmluZSBBVDkxX0FJQ19GRkVSCQkoQVQ5MV9BSUMgKyAweDE0MCkJLyogRmFzdCBGb3JjaW5nIEVuYWJsZSBSZWdpc3RlciBbU0FNOSBvbmx5XSAqLwotI2RlZmluZSBBVDkxX0FJQ19GRkRSCQkoQVQ5MV9BSUMgKyAweDE0NCkJLyogRmFzdCBGb3JjaW5nIERpc2FibGUgUmVnaXN0ZXIgW1NBTTkgb25seV0gKi8KLSNkZWZpbmUgQVQ5MV9BSUNfRkZTUgkJKEFUOTFfQUlDICsgMHgxNDgpCS8qIEZhc3QgRm9yY2luZyBTdGF0dXMgUmVnaXN0ZXIgW1NBTTkgb25seV0gKi8KLQotLyoKLSAqIFBJTyBDb250cm9sbGVycy4KLSAqLwotI2RlZmluZSBBVDkxX1BJT0EJMHg0MDAKLSNkZWZpbmUgQVQ5MV9QSU9CCTB4NjAwCi0jZGVmaW5lIEFUOTFfUElPQwkweDgwMAotI2RlZmluZSBBVDkxX1BJT0QJMHhhMDAKLQotI2RlZmluZSBQSU9fUEVSCQkweDAwCS8qIEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fUERSCQkweDA0CS8qIERpc2FibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUElPX1BTUgkJMHgwOAkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUElPX09FUgkJMHgxMAkvKiBPdXRwdXQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19PRFIJCTB4MTQJLyogT3V0cHV0IERpc2FibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUElPX09TUgkJMHgxOAkvKiBPdXRwdXQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19JRkVSCTB4MjAJLyogR2xpdGNoIElucHV0IEZpbHRlciBFbmFibGUgKi8KLSNkZWZpbmUgUElPX0lGRFIJMHgyNAkvKiBHbGl0Y2ggSW5wdXQgRmlsdGVyIERpc2FibGUgKi8KLSNkZWZpbmUgUElPX0lGU1IJMHgyOAkvKiBHbGl0Y2ggSW5wdXQgRmlsdGVyIFN0YXR1cyAqLwotI2RlZmluZSBQSU9fU09EUgkweDMwCS8qIFNldCBPdXRwdXQgRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fQ09EUgkweDM0CS8qIENsZWFyIE91dHB1dCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19PRFNSCTB4MzgJLyogT3V0cHV0IERhdGEgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19QRFNSCTB4M2MJLyogUGluIERhdGEgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19JRVIJCTB4NDAJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fSURSCQkweDQ0CS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19JTVIJCTB4NDgJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUElPX0lTUgkJMHg0YwkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19NREVSCTB4NTAJLyogTXVsdGktZHJpdmVyIEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fTUREUgkweDU0CS8qIE11bHRpLWRyaXZlciBEaXNhYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19NRFNSCTB4NTgJLyogTXVsdGktZHJpdmVyIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fUFVEUgkweDYwCS8qIFB1bGwtdXAgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fUFVFUgkweDY0CS8qIFB1bGwtdXAgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19QVVNSCTB4NjgJLyogUHVsbC11cCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUElPX0FTUgkJMHg3MAkvKiBQZXJpcGhlcmFsIEEgU2VsZWN0IFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJT19CU1IJCTB4NzQJLyogUGVyaXBoZXJhbCBCIFNlbGVjdCBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fQUJTUgkweDc4CS8qIEFCIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fT1dFUgkweGEwCS8qIE91dHB1dCBXcml0ZSBFbmFibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUElPX09XRFIJMHhhNAkvKiBPdXRwdXQgV3JpdGUgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBQSU9fT1dTUgkweGE4CS8qIE91dHB1dCBXcml0ZSBTdGF0dXMgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBBVDkxX1BJT19QKG4pCSgxIDw8IChuKSkKLQotCi0vKgotICogUG93ZXIgTWFuYWdlbWVudCBDb250cm9sbGVyLgotICovCi0jZGVmaW5lCUFUOTFfUE1DCTB4YzAwCi0KLSNkZWZpbmUJQVQ5MV9QTUNfU0NFUgkJKEFUOTFfUE1DICsgMHgwMCkJLyogU3lzdGVtIENsb2NrIEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlBVDkxX1BNQ19TQ0RSCQkoQVQ5MV9QTUMgKyAweDA0KQkvKiBTeXN0ZW0gQ2xvY2sgRGlzYWJsZSBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUFUOTFfUE1DX1NDU1IJCShBVDkxX1BNQyArIDB4MDgpCS8qIFN5c3RlbSBDbG9jayBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX1BDSwkJKDEgPDwgIDApCQkvKiBQcm9jZXNzb3IgQ2xvY2sgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX1VEUAkJKDEgPDwgIDEpCQkvKiBVU0IgRGV2Y2ljZSBQb3J0IENsb2NrICovCi0jZGVmaW5lCQlBVDkxX1BNQ19NQ0tVRFAJCSgxIDw8ICAyKQkJLyogVVNCIERldmljZSBQb3J0IE1hc3RlciBDbG9jayBBdXRvbWF0aWMgRGlzYWJsZSBvbiBTdXNwZW5kICovCi0jZGVmaW5lCQlBVDkxX1BNQ19VSFAJCSgxIDw8ICA0KQkJLyogVVNCIEhvc3QgUG9ydCBDbG9jayAqLwotI2RlZmluZQkJQVQ5MV9QTUNfUENLMAkJKDEgPDwgIDgpCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMCAqLwotI2RlZmluZQkJQVQ5MV9QTUNfUENLMQkJKDEgPDwgIDkpCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMSAqLwotI2RlZmluZQkJQVQ5MV9QTUNfUENLMgkJKDEgPDwgMTApCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMiAqLwotI2RlZmluZQkJQVQ5MV9QTUNfUENLMwkJKDEgPDwgMTEpCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMyAqLwotCi0jZGVmaW5lCUFUOTFfUE1DX1BDRVIJCShBVDkxX1BNQyArIDB4MTApCS8qIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUFUOTFfUE1DX1BDRFIJCShBVDkxX1BNQyArIDB4MTQpCS8qIFBlcmlwaGVyYWwgQ2xvY2sgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlBVDkxX1BNQ19QQ1NSCQkoQVQ5MV9QTUMgKyAweDE4KQkvKiBQZXJpcGhlcmFsIENsb2NrIFN0YXR1cyBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUFUOTFfQ0tHUl9NT1IJCShBVDkxX1BNQyArIDB4MjApCS8qIE1haW4gT3NjaWxsYXRvciBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9QTUNfTU9TQ0VOCQkoMSAgICA8PCAwKQkJLyogTWFpbiBPc2NpbGxhdG9yIEVuYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9QTUNfT1NDT1VOVAkoMHhmZiA8PCA4KQkJLyogTWFpbiBPc2NpbGxhdG9yIFN0YXJ0LXVwIFRpbWUgKi8KLQotI2RlZmluZQlBVDkxX0NLR1JfTUNGUgkJKEFUOTFfUE1DICsgMHgyNCkJLyogTWFpbiBDbG9jayBGcmVxdWVuY3kgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX01BSU5GCQkoMHhmZmZmIDw8ICAwKQkJLyogTWFpbiBDbG9jayBGcmVxdWVuY3kgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX01BSU5SRFkJKDEJPDwgMTYpCQkvKiBNYWluIENsb2NrIFJlYWR5ICovCi0KLSNkZWZpbmUJQVQ5MV9DS0dSX1BMTEFSCQkoQVQ5MV9QTUMgKyAweDI4KQkvKiBQTEwgQSBSZWdpc3RlciAqLwotI2RlZmluZQlBVDkxX0NLR1JfUExMQlIJCShBVDkxX1BNQyArIDB4MmMpCS8qIFBMTCBCIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1BNQ19ESVYJCSgweGZmICA8PCAgMCkJCS8qIERpdmlkZXIgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX1BMTENPVU5UCSgweDNmICA8PCAgOCkJCS8qIFBMTCBDb3VudGVyICovCi0jZGVmaW5lCQlBVDkxX1BNQ19PVVQJCSgzICAgICA8PCAxNCkJCS8qIFBMTCBDbG9jayBGcmVxdWVuY3kgUmFuZ2UgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX01VTAkJKDB4N2ZmIDw8IDE2KQkJLyogUExMIE11bHRpcGxpZXIgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX1VTQjk2TQkJKDEgICAgIDw8IDI4KQkJLyogRGl2aWRlciBieSAyIEVuYWJsZSAoUExMQiBvbmx5KSAqLwotCi0jZGVmaW5lCUFUOTFfUE1DX01DS1IJCShBVDkxX1BNQyArIDB4MzApCS8qIE1hc3RlciBDbG9jayBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9QTUNfQ1NTCQkoMyA8PCAgMCkJCS8qIE1hc3RlciBDbG9jayBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCQlBVDkxX1BNQ19DU1NfU0xPVwkJKDAgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1BNQ19DU1NfTUFJTgkJKDEgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1BNQ19DU1NfUExMQQkJKDIgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1BNQ19DU1NfUExMQgkJKDMgPDwgMCkKLSNkZWZpbmUJCUFUOTFfUE1DX1BSRVMJCSg3IDw8ICAyKQkJLyogTWFzdGVyIENsb2NrIFByZXNjYWxlciAqLwotI2RlZmluZSAJCUFUOTFfUE1DX1BSRVNfMQkJCSgwIDw8IDIpCi0jZGVmaW5lCQkJQVQ5MV9QTUNfUFJFU18yCQkJKDEgPDwgMikKLSNkZWZpbmUJCQlBVDkxX1BNQ19QUkVTXzQJCQkoMiA8PCAyKQotI2RlZmluZQkJCUFUOTFfUE1DX1BSRVNfOAkJCSgzIDw8IDIpCi0jZGVmaW5lCQkJQVQ5MV9QTUNfUFJFU18xNgkJKDQgPDwgMikKLSNkZWZpbmUJCQlBVDkxX1BNQ19QUkVTXzMyCQkoNSA8PCAyKQotI2RlZmluZQkJCUFUOTFfUE1DX1BSRVNfNjQJCSg2IDw8IDIpCi0jZGVmaW5lCQlBVDkxX1BNQ19NRElWCQkoMyA8PCAgOCkJCS8qIE1hc3RlciBDbG9jayBEaXZpc2lvbiAqLwotI2RlZmluZQkJCUFUOTFfUE1DX01ESVZfMQkJCSgwIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9QTUNfTURJVl8yCQkJKDEgPDwgOCkKLSNkZWZpbmUJCQlBVDkxX1BNQ19NRElWXzMJCQkoMiA8PCA4KQotI2RlZmluZQkJCUFUOTFfUE1DX01ESVZfNAkJCSgzIDw8IDgpCi0KLSNkZWZpbmUJQVQ5MV9QTUNfUENLUihuKQkoQVQ5MV9QTUMgKyAweDQwICsgKChuKSAqIDQpKQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMC0zIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lCUFUOTFfUE1DX0lFUgkJKEFUOTFfUE1DICsgMHg2MCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlBVDkxX1BNQ19JRFIJCShBVDkxX1BNQyArIDB4NjQpCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUFUOTFfUE1DX1NSCQkoQVQ5MV9QTUMgKyAweDY4KQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX01PU0NTCQkoMSA8PCAgMCkJCS8qIE1PU0NTIEZsYWcgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX0xPQ0tBCQkoMSA8PCAgMSkJCS8qIFBMTEEgTG9jayAqLwotI2RlZmluZQkJQVQ5MV9QTUNfTE9DS0IJCSgxIDw8ICAyKQkJLyogUExMQiBMb2NrICovCi0jZGVmaW5lCQlBVDkxX1BNQ19NQ0tSRFkJCSgxIDw8ICAzKQkJLyogTWFzdGVyIENsb2NrICovCi0jZGVmaW5lCQlBVDkxX1BNQ19QQ0swUkRZCSgxIDw8ICA4KQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDAgKi8KLSNkZWZpbmUJCUFUOTFfUE1DX1BDSzFSRFkJKDEgPDwgIDkpCQkvKiBQcm9ncmFtbWFibGUgQ2xvY2sgMSAqLwotI2RlZmluZQkJQVQ5MV9QTUNfUENLMlJEWQkoMSA8PCAxMCkJCS8qIFByb2dyYW1tYWJsZSBDbG9jayAyICovCi0jZGVmaW5lCQlBVDkxX1BNQ19QQ0szUkRZCSgxIDw8IDExKQkJLyogUHJvZ3JhbW1hYmxlIENsb2NrIDMgKi8KLSNkZWZpbmUJQVQ5MV9QTUNfSU1SCQkoQVQ5MV9QTUMgKyAweDZjKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotCi0KLS8qCi0gKiBTeXN0ZW0gVGltZXIuCi0gKi8KLSNkZWZpbmUJQVQ5MV9TVAkJMHhkMDAKLQotI2RlZmluZQlBVDkxX1NUX0NSCQkoQVQ5MV9TVCArIDB4MDApCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgCUFUOTFfU1RfV0RSU1QJCSgxIDw8IDApCQkvKiBXYXRjaGRvZyBUaW1lciBSZXN0YXJ0ICovCi0jZGVmaW5lCUFUOTFfU1RfUElNUgkJKEFUOTFfU1QgKyAweDA0KQkvKiBQZXJpb2QgSW50ZXJ2YWwgTW9kZSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9TVF9QSVYJCSgweGZmZmYgPDwgIDApCQkvKiBQZXJpb2QgSW50ZXJ2YWwgVmFsdWUgKi8KLSNkZWZpbmUJQVQ5MV9TVF9XRE1SCQkoQVQ5MV9TVCArIDB4MDgpCS8qIFdhdGNoZG9nIE1vZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1RfV0RWCQkoMHhmZmZmIDw8ICAwKQkJLyogV2F0Y2hkb2cgQ291bnRlciBWYWx1ZSAqLwotI2RlZmluZQkJQVQ5MV9TVF9SU1RFTgkJKDEJPDwgMTYpCQkvKiBSZXNldCBFbmFibGUgKi8KLSNkZWZpbmUJCUFUOTFfU1RfRVhURU4JCSgxCTw8IDE3KQkJLyogRXh0ZXJuYWwgU2lnbmFsIEFzc2VydGlvbiBFbmFibGUgKi8KLSNkZWZpbmUJQVQ5MV9TVF9SVE1SCQkoQVQ5MV9TVCArIDB4MGMpCS8qIFJlYWwtdGltZSBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1NUX1JUUFJFUwkJKDB4ZmZmZiA8PCAgMCkJCS8qIFJlYWwtdGltZSBQcmVzY2FsYXIgVmFsdWUgKi8KLSNkZWZpbmUJQVQ5MV9TVF9TUgkJKEFUOTFfU1QgKyAweDEwKQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1RfUElUUwkJKDEgPDwgMCkJCS8qIFBlcmlvZCBJbnRlcnZhbCBUaW1lciBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfU1RfV0RPVkYJCSgxIDw8IDEpIAkJLyogV2F0Y2hkb2cgT3ZlcmZsb3cgKi8KLSNkZWZpbmUJCUFUOTFfU1RfUlRUSU5DCQkoMSA8PCAyKSAJCS8qIFJlYWwtdGltZSBUaW1lciBJbmNyZW1lbnQgKi8KLSNkZWZpbmUJCUFUOTFfU1RfQUxNUwkJKDEgPDwgMykgCQkvKiBBbGFybSBTdGF0dXMgKi8KLSNkZWZpbmUJQVQ5MV9TVF9JRVIJCShBVDkxX1NUICsgMHgxNCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlBVDkxX1NUX0lEUgkJKEFUOTFfU1QgKyAweDE4KQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlBVDkxX1NUX0lNUgkJKEFUOTFfU1QgKyAweDFjKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZQlBVDkxX1NUX1JUQVIJCShBVDkxX1NUICsgMHgyMCkJLyogUmVhbC10aW1lIEFsYXJtIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1NUX0FMTVYJCSgweGZmZmZmIDw8IDApCQkvKiBBbGFybSBWYWx1ZSAqLwotI2RlZmluZQlBVDkxX1NUX0NSVFIJCShBVDkxX1NUICsgMHgyNCkJLyogQ3VycmVudCBSZWFsLXRpbWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU1RfQ1JUVgkJKDB4ZmZmZmYgPDwgMCkJCS8qIEN1cnJlbnQgUmVhbC1UaW1lIFZhbHVlICovCi0KLQotLyoKLSAqIFJlYWwtdGltZSBDbG9jay4KLSAqLwotI2RlZmluZQlBVDkxX1JUQwkweGUwMAotCi0jZGVmaW5lCUFUOTFfUlRDX0NSCQkoQVQ5MV9SVEMgKyAweDAwKQkvKiBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1JUQ19VUERUSU0JCSgxIDw8ICAwKQkJLyogVXBkYXRlIFJlcXVlc3QgVGltZSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9SVENfVVBEQ0FMCQkoMSA8PCAgMSkJCS8qIFVwZGF0ZSBSZXF1ZXN0IENhbGVuZGFyIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1JUQ19USU1FVlNFTAkoMyA8PCAgOCkJCS8qIFRpbWUgRXZlbnQgU2VsZWN0aW9uICovCi0jZGVmaW5lCQkJQVQ5MV9SVENfVElNRVZTRUxfTUlOVVRFCSgwIDw8IDgpCi0jZGVmaW5lIAkJQVQ5MV9SVENfVElNRVZTRUxfSE9VUgkJKDEgPDwgOCkKLSNkZWZpbmUgCQlBVDkxX1JUQ19USU1FVlNFTF9EQVkyNAkJKDIgPDwgOCkKLSNkZWZpbmUgCQlBVDkxX1JUQ19USU1FVlNFTF9EQVkxMgkJKDMgPDwgOCkKLSNkZWZpbmUJCUFUOTFfUlRDX0NBTEVWU0VMCSgzIDw8IDE2KQkJLyogQ2FsZW5kYXIgRXZlbnQgU2VsZWN0aW9uICovCi0jZGVmaW5lIAkJQVQ5MV9SVENfQ0FMRVZTRUxfV0VFSwkJKDAgPDwgMTYpCi0jZGVmaW5lIAkJQVQ5MV9SVENfQ0FMRVZTRUxfTU9OVEgJCSgxIDw8IDE2KQotI2RlZmluZSAJCUFUOTFfUlRDX0NBTEVWU0VMX1lFQVIJCSgyIDw8IDE2KQotCi0jZGVmaW5lCUFUOTFfUlRDX01SCQkoQVQ5MV9SVEMgKyAweDA0KQkvKiBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lIAlBVDkxX1JUQ19IUk1PRAkJKDEgPDwgIDApCQkvKiAxMi8yNCBIb3VyIE1vZGUgKi8KLQotI2RlZmluZQlBVDkxX1JUQ19USU1SCQkoQVQ5MV9SVEMgKyAweDA4KQkvKiBUaW1lIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1JUQ19TRUMJCSgweDdmIDw8ICAwKQkJLyogQ3VycmVudCBTZWNvbmQgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX01JTgkJKDB4N2YgPDwgIDgpCQkvKiBDdXJyZW50IE1pbnV0ZSAqLwotI2RlZmluZQkJQVQ5MV9SVENfSE9VUiAJCSgweDNmIDw8IDE2KQkJLyogQ3VycmVudCBIb3VyICovCi0jZGVmaW5lCQlBVDkxX1JUQ19BTVBNCQkoMSAgICA8PCAyMikJCS8qIEFudGUgTWVyaWRpZW0gUG9zdCBNZXJpZGllbSBJbmRpY2F0b3IgKi8KLQotI2RlZmluZQlBVDkxX1JUQ19DQUxSCQkoQVQ5MV9SVEMgKyAweDBjKQkvKiBDYWxlbmRhciBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9SVENfQ0VOVAkJKDB4N2YgPDwgIDApCQkvKiBDdXJyZW50IENlbnR1cnkgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX1lFQVIJCSgweGZmIDw8ICA4KQkJLyogQ3VycmVudCBZZWFyICovCi0jZGVmaW5lCQlBVDkxX1JUQ19NT05USAkJKDB4MWYgPDwgMTYpCQkvKiBDdXJyZW50IE1vbnRoICovCi0jZGVmaW5lCQlBVDkxX1JUQ19EQVkJCSg3ICAgIDw8IDIxKQkJLyogQ3VycmVudCBEYXkgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX0RBVEUJCSgweDNmIDw8IDI0KQkJLyogQ3VycmVudCBEYXRlICovCi0KLSNkZWZpbmUJQVQ5MV9SVENfVElNQUxSCQkoQVQ5MV9SVEMgKyAweDEwKQkvKiBUaW1lIEFsYXJtIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1JUQ19TRUNFTgkJKDEgPDwgIDcpCQkvKiBTZWNvbmQgQWxhcm0gRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX1JUQ19NSU5FTgkJKDEgPDwgMTUpCQkvKiBNaW51dGUgQWxhcm0gRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX1JUQ19IT1VSRU4JCSgxIDw8IDIzKQkJLyogSG91ciBBbGFybSBFbmFibGUgKi8KLQotI2RlZmluZQlBVDkxX1JUQ19DQUxBTFIJCShBVDkxX1JUQyArIDB4MTQpCS8qIENhbGVuZGFyIEFsYXJtIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1JUQ19NVEhFTgkJKDEgPDwgMjMpCQkvKiBNb250aCBBbGFybSBFbmFibGUgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX0RBVEVFTgkJKDEgPDwgMzEpCQkvKiBEYXRlIEFsYXJtIEVuYWJsZSAqLwotCi0jZGVmaW5lCUFUOTFfUlRDX1NSCQkoQVQ5MV9SVEMgKyAweDE4KQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX0FDS1VQRAkJKDEgPDwgIDApCQkvKiBBY2tub3dsZWRnZSBmb3IgVXBkYXRlICovCi0jZGVmaW5lCQlBVDkxX1JUQ19BTEFSTQkJKDEgPDwgIDEpCQkvKiBBbGFybSBGbGFnICovCi0jZGVmaW5lCQlBVDkxX1JUQ19TRUNFVgkJKDEgPDwgIDIpCQkvKiBTZWNvbmQgRXZlbnQgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX1RJTUVWCQkoMSA8PCAgMykJCS8qIFRpbWUgRXZlbnQgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX0NBTEVWCQkoMSA8PCAgNCkJCS8qIENhbGVuZGFyIEV2ZW50ICovCi0KLSNkZWZpbmUJQVQ5MV9SVENfU0NDUgkJKEFUOTFfUlRDICsgMHgxYykJLyogU3RhdHVzIENsZWFyIENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQVQ5MV9SVENfSUVSCQkoQVQ5MV9SVEMgKyAweDIwKQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUFUOTFfUlRDX0lEUgkJKEFUOTFfUlRDICsgMHgyNCkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQVQ5MV9SVENfSU1SCQkoQVQ5MV9SVEMgKyAweDI4KQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUFUOTFfUlRDX1ZFUgkJKEFUOTFfUlRDICsgMHgyYykJLyogVmFsaWQgRW50cnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX05WVElNCQkoMSA8PCAgMCkJCS8qIE5vbiB2YWxpZCBUaW1lICovCi0jZGVmaW5lCQlBVDkxX1JUQ19OVkNBTAkJKDEgPDwgIDEpCQkvKiBOb24gdmFsaWQgQ2FsZW5kYXIgKi8KLSNkZWZpbmUJCUFUOTFfUlRDX05WVElNQUxSCSgxIDw8ICAyKQkJLyogTm9uIHZhbGlkIFRpbWUgQWxhcm0gKi8KLSNkZWZpbmUJCUFUOTFfUlRDX05WQ0FMQUxSCSgxIDw8ICAzKQkJLyogTm9uIHZhbGlkIENhbGVuZGFyIEFsYXJtICovCi0KLQotLyoKLSAqIE1lbW9yeSBDb250cm9sbGVyLgotICovCi0jZGVmaW5lIEFUOTFfTUMJCTB4ZjAwCi0KLSNkZWZpbmUgQVQ5MV9NQ19SQ1IJCShBVDkxX01DICsgMHgwMCkJLyogTUMgUmVtYXAgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9NQ19SQ0IJCSgxIDw8ICAwKQkJLyogUmVtYXAgQ29tbWFuZCBCaXQgKi8KLQotI2RlZmluZSBBVDkxX01DX0FTUgkJKEFUOTFfTUMgKyAweDA0KQkvKiBNQyBBYm9ydCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfTUNfVU5BREQJCSgxIDw8ICAwKQkJLyogVW5kZWZpbmVkIEFkZHJlc3MgQWJvcnQgU3RhdHVzICovCi0jZGVmaW5lCQlBVDkxX01DX01JU0FERAkJKDEgPDwgIDEpCQkvKiBNaXNhbGlnbmVkIEFkZHJlc3MgQWJvcnQgU3RhdHVzICovCi0jZGVmaW5lCQlBVDkxX01DX0FCVFNaCQkoMyA8PCAgOCkJCS8qIEFib3J0IFNpemUgU3RhdHVzICovCi0jZGVmaW5lCQkJQVQ5MV9NQ19BQlRTWl9CWVRFCQkoMCA8PCA4KQotI2RlZmluZQkJCUFUOTFfTUNfQUJUU1pfSEFMRldPUkQJCSgxIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9NQ19BQlRTWl9XT1JECQkoMiA8PCA4KQotI2RlZmluZQkJQVQ5MV9NQ19BQlRUWVAJCSgzIDw8IDEwKQkJLyogQWJvcnQgVHlwZSBTdGF0dXMgKi8KLSNkZWZpbmUJCQlBVDkxX01DX0FCVFRZUF9EQVRBUkVBRAkJKDAgPDwgMTApCi0jZGVmaW5lCQkJQVQ5MV9NQ19BQlRUWVBfREFUQVdSSVRFCSgxIDw8IDEwKQotI2RlZmluZQkJCUFUOTFfTUNfQUJUVFlQX0ZFVENICQkoMiA8PCAxMCkKLSNkZWZpbmUJCUFUOTFfTUNfTVNUMAkJKDEgPDwgMTYpCQkvKiBBUk05MjBUIEFib3J0IFNvdXJjZSAqLwotI2RlZmluZQkJQVQ5MV9NQ19NU1QxCQkoMSA8PCAxNykJCS8qIFBEQyBBYm9ydCBTb3VyY2UgKi8KLSNkZWZpbmUJCUFUOTFfTUNfTVNUMgkJKDEgPDwgMTgpCQkvKiBVSFAgQWJvcnQgU291cmNlICovCi0jZGVmaW5lCQlBVDkxX01DX01TVDMJCSgxIDw8IDE5KQkJLyogRU1BQyBBYm9ydCBTb3VyY2UgKi8KLSNkZWZpbmUJCUFUOTFfTUNfU1ZNU1QwCQkoMSA8PCAyNCkJCS8qIFNhdmVkIEFSTTkyMFQgQWJvcnQgU291cmNlICovCi0jZGVmaW5lCQlBVDkxX01DX1NWTVNUMQkJKDEgPDwgMjUpCQkvKiBTYXZlZCBQREMgQWJvcnQgU291cmNlICovCi0jZGVmaW5lCQlBVDkxX01DX1NWTVNUMgkJKDEgPDwgMjYpCQkvKiBTYXZlZCBVSFAgQWJvcnQgU291cmNlICovCi0jZGVmaW5lCQlBVDkxX01DX1NWTVNUMwkJKDEgPDwgMjcpCQkvKiBTYXZlZCBFTUFDIEFib3J0IFNvdXJjZSAqLwotCi0jZGVmaW5lIEFUOTFfTUNfQUFTUgkJKEFUOTFfTUMgKyAweDA4KQkvKiBNQyBBYm9ydCBBZGRyZXNzIFN0YXR1cyBSZWdpc3RlciAqLwotCi0jZGVmaW5lIEFUOTFfTUNfTVBSCQkoQVQ5MV9NQyArIDB4MGMpCS8qIE1DIE1hc3RlciBQcmlvcml0eSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9NUFJfTVNUUDAJCSg3IDw8ICAwKQkJLyogQVJNOTIwVCBQcmlvcml0eSAqLwotI2RlZmluZQkJQVQ5MV9NUFJfTVNUUDEJCSg3IDw8ICA0KQkJLyogUERDIFByaW9yaXR5ICovCi0jZGVmaW5lCQlBVDkxX01QUl9NU1RQMgkJKDcgPDwgIDgpCQkvKiBVSFAgUHJpb3JpdHkgKi8KLSNkZWZpbmUJCUFUOTFfTVBSX01TVFAzCQkoNyA8PCAxMikJCS8qIEVNQUMgUHJpb3JpdHkgKi8KLQotLyogRXh0ZXJuYWwgQnVzIEludGVyZmFjZSAoRUJJKSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQVQ5MV9FQklfQ1NBCQkoQVQ5MV9NQyArIDB4NjApCS8qIENoaXAgU2VsZWN0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfRUJJX0NTMEEJCSgxIDw8IDApCQkvKiBDaGlwIFNlbGVjdCAwIEFzc2lnbm1lbnQgKi8KLSNkZWZpbmUJCQlBVDkxX0VCSV9DUzBBX1NNQwkJKDAgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX0VCSV9DUzBBX0JGQwkJKDEgPDwgMCkKLSNkZWZpbmUJCUFUOTFfRUJJX0NTMUEJCSgxIDw8IDEpCQkvKiBDaGlwIFNlbGVjdCAxIEFzc2lnbm1lbnQgKi8KLSNkZWZpbmUJCQlBVDkxX0VCSV9DUzFBX1NNQwkJKDAgPDwgMSkKLSNkZWZpbmUJCQlBVDkxX0VCSV9DUzFBX1NEUkFNQwkJKDEgPDwgMSkKLSNkZWZpbmUJCUFUOTFfRUJJX0NTM0EJCSgxIDw8IDMpCQkvKiBDaGlwIFNlbGVjdCAyIEFzc2lnbm1lbnQgKi8KLSNkZWZpbmUJCQlBVDkxX0VCSV9DUzNBX1NNQwkJKDAgPDwgMykKLSNkZWZpbmUJCQlBVDkxX0VCSV9DUzNBX1NNQ19TTUFSVE1FRElBCSgxIDw8IDMpCi0jZGVmaW5lCQlBVDkxX0VCSV9DUzRBCQkoMSA8PCA0KQkJLyogQ2hpcCBTZWxlY3QgMyBBc3NpZ25tZW50ICovCi0jZGVmaW5lCQkJQVQ5MV9FQklfQ1M0QV9TTUMJCSgwIDw8IDQpCi0jZGVmaW5lCQkJQVQ5MV9FQklfQ1M0QV9TTUNfQ09NUEFDVEZMQVNICSgxIDw8IDQpCi0jZGVmaW5lIEFUOTFfRUJJX0NGR1IJCShBVDkxX01DICsgMHg2NCkJLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9FQklfREJQVUMJCSgxIDw8IDApCQkvKiBEYXRhIEJ1cyBQdWxsLVVwIENvbmZpZ3VyYXRpb24gKi8KLQotLyogU3RhdGljIE1lbW9yeSBDb250cm9sbGVyIChTTUMpIHJlZ2lzdGVycyAqLwotI2RlZmluZQlBVDkxX1NNQ19DU1IobikJCShBVDkxX01DICsgMHg3MCArICgobikgKiA0KSkvKiBTTUMgQ2hpcCBTZWxlY3QgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU01DX05XUwkJKDB4N2YgPDwgIDApCQkvKiBOdW1iZXIgb2YgV2FpdCBTdGF0ZXMgKi8KLSNkZWZpbmUJCQlBVDkxX1NNQ19OV1NfKHgpCSgoeCkgPDwgMCkKLSNkZWZpbmUJCUFUOTFfU01DX1dTRU4JCSgxICAgIDw8ICA3KQkJLyogV2FpdCBTdGF0ZSBFbmFibGUgKi8KLSNkZWZpbmUJCUFUOTFfU01DX1RERgkJKDB4ZiAgPDwgIDgpCQkvKiBEYXRhIEZsb2F0IFRpbWUgKi8KLSNkZWZpbmUJCQlBVDkxX1NNQ19UREZfKHgpCSgoeCkgPDwgOCkKLSNkZWZpbmUJCUFUOTFfU01DX0JBVAkJKDEgICAgPDwgMTIpCQkvKiBCeXRlIEFjY2VzcyBUeXBlICovCi0jZGVmaW5lCQlBVDkxX1NNQ19EQlcJCSgzICAgIDw8IDEzKQkJLyogRGF0YSBCdXMgV2lkdGggKi8KLSNkZWZpbmUJCQlBVDkxX1NNQ19EQldfMTYJCSgxIDw8IDEzKQotI2RlZmluZQkJCUFUOTFfU01DX0RCV184CQkoMiA8PCAxMykKLSNkZWZpbmUJCUFUOTFfU01DX0RQUgkJKDEgPDwgMTUpCQkvKiBEYXRhIFJlYWQgUHJvdG9jb2wgKi8KLSNkZWZpbmUJCUFUOTFfU01DX0FDU1MJCSgzIDw8IDE2KQkJLyogQWRkcmVzcyB0byBDaGlwIFNlbGVjdCBTZXR1cCAqLwotI2RlZmluZQkJCUFUOTFfU01DX0FDU1NfU1RECSgwIDw8IDE2KQotI2RlZmluZQkJCUFUOTFfU01DX0FDU1NfMQkJKDEgPDwgMTYpCi0jZGVmaW5lCQkJQVQ5MV9TTUNfQUNTU18yCQkoMiA8PCAxNikKLSNkZWZpbmUJCQlBVDkxX1NNQ19BQ1NTXzMJCSgzIDw8IDE2KQotI2RlZmluZQkJQVQ5MV9TTUNfUldTRVRVUAkoNyA8PCAyNCkJCS8qIFJlYWQgJiBXcml0ZSBTaWduYWwgVGltZSBTZXR1cCAqLwotI2RlZmluZQkJCUFUOTFfU01DX1JXU0VUVVBfKHgpCSgoeCkgPDwgMjQpCi0jZGVmaW5lCQlBVDkxX1NNQ19SV0hPTEQJCSg3IDw8IDI4KQkJLyogUmVhZCAmIFdyaXRlIFNpZ25hbCBIb2xkIFRpbWUgKi8KLSNkZWZpbmUJCQlBVDkxX1NNQ19SV0hPTERfKHgpCSgoeCkgPDwgMjgpCi0KLS8qIFNEUkFNIENvbnRyb2xsZXIgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEFUOTFfU0RSQU1DX01SCQkoQVQ5MV9NQyArIDB4OTApCS8qIE1vZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfU0RSQU1DX01PREUJKDB4ZiA8PCAwKQkJLyogQ29tbWFuZCBNb2RlICovCi0jZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTU9ERV9OT1JNQUwJCSgwIDw8IDApCi0jZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTU9ERV9OT1AJCSgxIDw8IDApCi0jZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTU9ERV9QUkVDSEFSR0UJKDIgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX0xNUgkJKDMgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX1JFRlJFU0gJKDQgPDwgMCkKLSNkZWZpbmUJCUFUOTFfU0RSQU1DX0RCVwkJKDEgICA8PCA0KQkJLyogRGF0YSBCdXMgV2lkdGggKi8KLSNkZWZpbmUJCQlBVDkxX1NEUkFNQ19EQldfMzIJKDAgPDwgNCkKLSNkZWZpbmUJCQlBVDkxX1NEUkFNQ19EQldfMTYJKDEgPDwgNCkKLQotI2RlZmluZSBBVDkxX1NEUkFNQ19UUgkJKEFUOTFfTUMgKyAweDk0KQkvKiBSZWZyZXNoIFRpbWVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1NEUkFNQ19DT1VOVAkoMHhmZmYgPDwgMCkJCS8qIFJlZnJlc2ggVGltZXIgQ291bnQgKi8KLQotI2RlZmluZSBBVDkxX1NEUkFNQ19DUgkJKEFUOTFfTUMgKyAweDk4KQkvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1NEUkFNQ19OQwkJKDMgICA8PCAgMCkJCS8qIE51bWJlciBvZiBDb2x1bW4gQml0cyAqLwotI2RlZmluZQkJCUFUOTFfU0RSQU1DX05DXzgJKDAgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OQ185CSgxIDw8IDApCi0jZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTkNfMTAJKDIgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OQ18xMQkoMyA8PCAwKQotI2RlZmluZQkJQVQ5MV9TRFJBTUNfTlIJCSgzICAgPDwgIDIpCQkvKiBOdW1iZXIgb2YgUm93IEJpdHMgKi8KLSNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OUl8xMQkoMCA8PCAyKQotI2RlZmluZQkJCUFUOTFfU0RSQU1DX05SXzEyCSgxIDw8IDIpCi0jZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTlJfMTMJKDIgPDwgMikKLSNkZWZpbmUJCUFUOTFfU0RSQU1DX05CCQkoMSAgIDw8ICA0KQkJLyogTnVtYmVyIG9mIEJhbmtzICovCi0jZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTkJfMgkoMCA8PCA0KQotI2RlZmluZQkJCUFUOTFfU0RSQU1DX05CXzQJKDEgPDwgNCkKLSNkZWZpbmUJCUFUOTFfU0RSQU1DX0NBUwkJKDMgICA8PCAgNSkJCS8qIENBUyBMYXRlbmN5ICovCi0jZGVmaW5lCQkJQVQ5MV9TRFJBTUNfQ0FTXzIJKDIgPDwgNSkKLSNkZWZpbmUJCUFUOTFfU0RSQU1DX1RXUgkJKDB4ZiA8PCAgNykJCS8qIFdyaXRlIFJlY292ZXJ5IERlbGF5ICovCi0jZGVmaW5lCQlBVDkxX1NEUkFNQ19UUkMJCSgweGYgPDwgMTEpCQkvKiBSb3cgQ3ljbGUgRGVsYXkgKi8KLSNkZWZpbmUJCUFUOTFfU0RSQU1DX1RSUAkJKDB4ZiA8PCAxNSkJCS8qIFJvdyBQcmVjaGFyZ2UgRGVsYXkgKi8KLSNkZWZpbmUJCUFUOTFfU0RSQU1DX1RSQ0QJKDB4ZiA8PCAxOSkJCS8qIFJvdyB0byBDb2x1bW4gRGVsYXkgKi8KLSNkZWZpbmUJCUFUOTFfU0RSQU1DX1RSQVMJKDB4ZiA8PCAyMykJCS8qIEFjdGl2ZSB0byBQcmVjaGFyZ2UgRGVsYXkgKi8KLSNkZWZpbmUJCUFUOTFfU0RSQU1DX1RYU1IJKDB4ZiA8PCAyNykJCS8qIEV4aXQgU2VsZiBSZWZyZXNoIHRvIEFjdGl2ZSBEZWxheSAqLwotCi0jZGVmaW5lIEFUOTFfU0RSQU1DX1NSUgkJKEFUOTFfTUMgKyAweDljKQkvKiBTZWxmIFJlZnJlc2ggUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9TRFJBTUNfTFBSCQkoQVQ5MV9NQyArIDB4YTApCS8qIExvdyBQb3dlciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1NEUkFNQ19JRVIJCShBVDkxX01DICsgMHhhNCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1NEUkFNQ19JRFIJCShBVDkxX01DICsgMHhhOCkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9TRFJBTUNfSU1SCQkoQVQ5MV9NQyArIDB4YWMpCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfU0RSQU1DX0lTUgkJKEFUOTFfTUMgKyAweGIwKQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCi0KLS8qIEJ1cnN0IEZsYXNoIENvbnRyb2xsZXIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9CRkNfTVIJCShBVDkxX01DICsgMHhjMCkJLyogTW9kZSBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9CRkNfQkZDT00JCSgzICAgPDwgIDApCQkvKiBCdXJzdCBGbGFzaCBDb250cm9sbGVyIE9wZXJhdGluZyBNb2RlICovCi0jZGVmaW5lCQkJQVQ5MV9CRkNfQkZDT01fRElTQUJMRUQJKDAgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX0JGQ19CRkNPTV9BU1lOQwkoMSA8PCAwKQotI2RlZmluZQkJCUFUOTFfQkZDX0JGQ09NX0JVUlNUCSgyIDw8IDApCi0jZGVmaW5lCQlBVDkxX0JGQ19CRkNDCQkoMyAgIDw8ICAyKQkJLyogQnVyc3QgRmxhc2ggQ29udHJvbGxlciBDbG9jayAqLwotI2RlZmluZQkJCUFUOTFfQkZDX0JGQ0NfTUNLCSgxIDw8IDIpCi0jZGVmaW5lCQkJQVQ5MV9CRkNfQkZDQ19ESVYyCSgyIDw8IDIpCi0jZGVmaW5lCQkJQVQ5MV9CRkNfQkZDQ19ESVY0CSgzIDw8IDIpCi0jZGVmaW5lCQlBVDkxX0JGQ19BVkwJCSgweGYgPDwgIDQpCQkvKiBBZGRyZXNzIFZhbGlkIExhdGVuY3kgKi8KLSNkZWZpbmUJCUFUOTFfQkZDX1BBR0VTCQkoNyAgIDw8ICA4KQkJLyogUGFnZSBTaXplICovCi0jZGVmaW5lCQkJQVQ5MV9CRkNfUEFHRVNfTk9fUEFHRQkoMCA8PCA4KQotI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzE2CSgxIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9CRkNfUEFHRVNfMzIJKDIgPDwgOCkKLSNkZWZpbmUJCQlBVDkxX0JGQ19QQUdFU182NAkoMyA8PCA4KQotI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzEyOAkoNCA8PCA4KQotI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzI1NgkoNSA8PCA4KQotI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzUxMgkoNiA8PCA4KQotI2RlZmluZQkJCUFUOTFfQkZDX1BBR0VTXzEwMjQJKDcgPDwgOCkKLSNkZWZpbmUJCUFUOTFfQkZDX09FTAkJKDMgICA8PCAxMikJCS8qIE91dHB1dCBFbmFibGUgTGF0ZW5jeSAqLwotI2RlZmluZQkJQVQ5MV9CRkNfQkFBRU4JCSgxICAgPDwgMTYpCQkvKiBCdXJzdCBBZGRyZXNzIEFkdmFuY2UgRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX0JGQ19CRk9FSAkJKDEgICA8PCAxNykJCS8qIEJ1cnN0IEZsYXNoIE91dHB1dCBFbmFibGUgSGFuZGxpbmcgKi8KLSNkZWZpbmUJCUFUOTFfQkZDX01VWEVOCQkoMSAgIDw8IDE4KQkJLyogTXVsdGlwbGV4ZWQgQnVzIEVuYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9CRkNfUkRZRU4JCSgxICAgPDwgMTkpCQkvKiBSZWFkeSBFbmFibGUgTW9kZSAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF90Yy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3RjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZGE3NTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3RjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF90Yy5oCi0gKgotICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCi0gKgotICogVGltZXIvQ291bnRlciBVbml0IChUQykgcmVnaXN0ZXJzLgotICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgQVQ5MVJNOTIwMF9UQ19ICi0jZGVmaW5lIEFUOTFSTTkyMDBfVENfSAotCi0jZGVmaW5lIEFUOTFfVENfQkNSCQkweGMwCQkvKiBUQyBCbG9jayBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1RDX1NZTkMJCSgxIDw8IDApCS8qIFN5bmNocm8gQ29tbWFuZCAqLwotCi0jZGVmaW5lIEFUOTFfVENfQk1SCQkweGM0CQkvKiBUQyBCbG9jayBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1RDX1RDMFhDMFMJCSgzIDw8IDApCS8qIEV4dGVybmFsIENsb2NrIFNpZ25hbCAwIFNlbGVjdGlvbiAqLwotI2RlZmluZQkJCUFUOTFfVENfVEMwWEMwU19UQ0xLMAkJKDAgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1RDX1RDMFhDMFNfTk9ORQkJKDEgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1RDX1RDMFhDMFNfVElPQTEJCSgyIDw8IDApCi0jZGVmaW5lCQkJQVQ5MV9UQ19UQzBYQzBTX1RJT0EyCQkoMyA8PCAwKQotI2RlZmluZQkJQVQ5MV9UQ19UQzFYQzFTCQkoMyA8PCAyKQkvKiBFeHRlcm5hbCBDbG9jayBTaWduYWwgMSBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCQlBVDkxX1RDX1RDMVhDMVNfVENMSzEJCSgwIDw8IDIpCi0jZGVmaW5lCQkJQVQ5MV9UQ19UQzFYQzFTX05PTkUJCSgxIDw8IDIpCi0jZGVmaW5lCQkJQVQ5MV9UQ19UQzFYQzFTX1RJT0EwCQkoMiA8PCAyKQotI2RlZmluZQkJCUFUOTFfVENfVEMxWEMxU19USU9BMgkJKDMgPDwgMikKLSNkZWZpbmUJCUFUOTFfVENfVEMyWEMyUwkJKDMgPDwgNCkJLyogRXh0ZXJuYWwgQ2xvY2sgU2lnbmFsIDIgU2VsZWN0aW9uICovCi0jZGVmaW5lCQkJQVQ5MV9UQ19UQzJYQzJTX1RDTEsyCQkoMCA8PCA0KQotI2RlZmluZQkJCUFUOTFfVENfVEMyWEMyU19OT05FCQkoMSA8PCA0KQotI2RlZmluZQkJCUFUOTFfVENfVEMyWEMyU19USU9BMAkJKDIgPDwgNCkKLSNkZWZpbmUJCQlBVDkxX1RDX1RDMlhDMlNfVElPQTEJCSgzIDw8IDQpCi0KLQotI2RlZmluZSBBVDkxX1RDX0NDUgkJMHgwMAkJLyogQ2hhbm5lbCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1RDX0NMS0VOCQkoMSA8PCAwKQkvKiBDb3VudGVyIENsb2NrIEVuYWJsZSBDb21tYW5kICovCi0jZGVmaW5lCQlBVDkxX1RDX0NMS0RJUwkJKDEgPDwgMSkJLyogQ291bnRlciBDTG9jayBEaXNhYmxlIENvbW1hbmQgKi8KLSNkZWZpbmUJCUFUOTFfVENfU1dUUkcJCSgxIDw8IDIpCS8qIFNvZnR3YXJlIFRyaWdnZXIgQ29tbWFuZCAqLwotCi0jZGVmaW5lIEFUOTFfVENfQ01SCQkweDA0CQkvKiBDaGFubmVsIE1vZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfVENfVENDTEtTCQkoNyA8PCAwKQkvKiBDYXB0dXJlL1dhdmVmb3JtIE1vZGU6IENsb2NrIFNlbGVjdGlvbiAqLwotI2RlZmluZQkJCUFUOTFfVENfVElNRVJfQ0xPQ0sxCQkoMCA8PCAwKQotI2RlZmluZQkJCUFUOTFfVENfVElNRVJfQ0xPQ0syCQkoMSA8PCAwKQotI2RlZmluZQkJCUFUOTFfVENfVElNRVJfQ0xPQ0szCQkoMiA8PCAwKQotI2RlZmluZQkJCUFUOTFfVENfVElNRVJfQ0xPQ0s0CQkoMyA8PCAwKQotI2RlZmluZQkJCUFUOTFfVENfVElNRVJfQ0xPQ0s1CQkoNCA8PCAwKQotI2RlZmluZQkJCUFUOTFfVENfWEMwCQkJKDUgPDwgMCkKLSNkZWZpbmUJCQlBVDkxX1RDX1hDMQkJCSg2IDw8IDApCi0jZGVmaW5lCQkJQVQ5MV9UQ19YQzIJCQkoNyA8PCAwKQotI2RlZmluZQkJQVQ5MV9UQ19DTEtJCQkoMSA8PCAzKQkvKiBDYXB0dXJlL1dhdmVmb3JtIE1vZGU6IENsb2NrIEludmVydCAqLwotI2RlZmluZQkJQVQ5MV9UQ19CVVJTVAkJKDMgPDwgNCkJLyogQ2FwdHVyZS9XYXZlZm9ybSBNb2RlOiBCdXJzdCBTaWduYWwgU2VsZWN0aW9uICovCi0jZGVmaW5lCQlBVDkxX1RDX0xEQlNUT1AJCSgxIDw8IDYpCS8qIENhcHR1cmUgTW9kZTogQ291bnRlciBDbG9jayBTdG9wcGVkIHdpdGggVEIgTG9hZGluZyAqLwotI2RlZmluZQkJQVQ5MV9UQ19MREJESVMJCSgxIDw8IDcpCS8qIENhcHR1cmUgTW9kZTogQ291bnRlciBDbG9jayBEaXNhYmxlIHdpdGggUkIgTG9hZGluZyAqLwotI2RlZmluZQkJQVQ5MV9UQ19FVFJHRURHCQkoMyA8PCA4KQkvKiBDYXB0dXJlIE1vZGU6IEV4dGVybmFsIFRyaWdnZXIgRWRnZSBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCUFUOTFfVENfQUJFVFJHCQkoMSA8PCAxMCkJLyogQ2FwdHVyZSBNb2RlOiBUSU9BIG9yIFRJT0IgRXh0ZXJuYWwgVHJpZ2dlciBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCUFUOTFfVENfQ1BDVFJHCQkoMSA8PCAxNCkJLyogQ2FwdHVyZSBNb2RlOiBSQyBDb21wYXJlIFRyaWdnZXIgRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX1RDX1dBVkUJCSgxIDw8IDE1KQkvKiBDYXB0dXJlL1dhdmVmb3JtIG1vZGUgKi8KLSNkZWZpbmUJCUFUOTFfVENfTERSQQkJKDMgPDwgMTYpCS8qIENhcHR1cmUgTW9kZTogUkEgTG9hZGluZyBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCUFUOTFfVENfTERSQgkJKDMgPDwgMTgpCS8qIENhcHR1cmUgTW9kZTogUkIgTG9hZGluZyBTZWxlY3Rpb24gKi8KLQotI2RlZmluZQkJQVQ5MV9UQ19DUENTVE9QCQkoMSA8PCAgNikJLyogV2F2ZWZvcm0gTW9kZTogQ291bnRlciBDbG9jayBTdG9wcGVkIHdpdGggUkMgQ29tcGFyZSAqLwotI2RlZmluZQkJQVQ5MV9UQ19DUENESVMJCSgxIDw8ICA3KQkvKiBXYXZlZm9ybSBNb2RlOiBDb3VudGVyIENsb2NrIERpc2FibGUgd2l0aCBSQyBDb21wYXJlICovCi0jZGVmaW5lCQlBVDkxX1RDX0VFVlRFREcJCSgzIDw8ICA4KQkvKiBXYXZlZm9ybSBNb2RlOiBFeHRlcm5hbCBFdmVudCBFZGdlIFNlbGVjdGlvbiAqLwotI2RlZmluZQkJCUFUOTFfVENfRUVWVEVER19OT05FCQkoMCA8PCA4KQotI2RlZmluZQkJCUFUOTFfVENfRUVWVEVER19SSVNJTkcJCSgxIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9UQ19FRVZURURHX0ZBTExJTkcJCSgyIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9UQ19FRVZURURHX0JPVEgJCSgzIDw8IDgpCi0jZGVmaW5lCQlBVDkxX1RDX0VFVlQJCSgzIDw8IDEwKQkvKiBXYXZlZm9ybSBNb2RlOiBFeHRlcm5hbCBFdmVudCBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCQlBVDkxX1RDX0VFVlRfVElPQgkJKDAgPDwgMTApCi0jZGVmaW5lCQkJQVQ5MV9UQ19FRVZUX1hDMAkJKDEgPDwgMTApCi0jZGVmaW5lCQkJQVQ5MV9UQ19FRVZUX1hDMQkJKDIgPDwgMTApCi0jZGVmaW5lCQkJQVQ5MV9UQ19FRVZUX1hDMgkJKDMgPDwgMTApCi0jZGVmaW5lCQlBVDkxX1RDX0VORVRSRwkJKDEgPDwgMTIpCS8qIFdhdmVmb3JtIE1vZGU6IEV4dGVybmFsIEV2ZW50IFRyaWdnZXIgRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX1RDX1dBVkVTRUwJCSgzIDw8IDEzKQkvKiBXYXZlZm9ybSBNb2RlOiBXYXZlZm9ybSBTZWxlY3Rpb24gKi8KLSNkZWZpbmUJCQlBVDkxX1RDX1dBVkVTRUxfVVAJCSgwIDw8IDEzKQotI2RlZmluZQkJCUFUOTFfVENfV0FWRVNFTF9VUF9BVVRPCQkoMiA8PCAxMykKLSNkZWZpbmUJCQlBVDkxX1RDX1dBVkVTRUxfVVBET1dOCQkoMSA8PCAxMykKLSNkZWZpbmUJCQlBVDkxX1RDX1dBVkVTRUxfVVBET1dOX0FVVE8JKDMgPDwgMTMpCi0jZGVmaW5lCQlBVDkxX1RDX0FDUEEJCSgzIDw8IDE2KQkvKiBXYXZlZm9ybSBNb2RlOiBSQSBDb21wYXJlIEVmZmVjdCBvbiBUSU9BICovCi0jZGVmaW5lCQkJQVQ5MV9UQ19BQ1BBX05PTkUJCSgwIDw8IDE2KQotI2RlZmluZQkJCUFUOTFfVENfQUNQQV9TRVQJCSgxIDw8IDE2KQotI2RlZmluZQkJCUFUOTFfVENfQUNQQV9DTEVBUgkJKDIgPDwgMTYpCi0jZGVmaW5lCQkJQVQ5MV9UQ19BQ1BBX1RPR0dMRQkJKDMgPDwgMTYpCi0jZGVmaW5lCQlBVDkxX1RDX0FDUEMJCSgzIDw8IDE4KQkvKiBXYXZlZm9ybSBNb2RlOiBSQyBDb21wcmUgRWZmZWN0IG9uIFRJT0EgKi8KLSNkZWZpbmUJCQlBVDkxX1RDX0FDUENfTk9ORQkJKDAgPDwgMTgpCi0jZGVmaW5lCQkJQVQ5MV9UQ19BQ1BDX1NFVAkJKDEgPDwgMTgpCi0jZGVmaW5lCQkJQVQ5MV9UQ19BQ1BDX0NMRUFSCQkoMiA8PCAxOCkKLSNkZWZpbmUJCQlBVDkxX1RDX0FDUENfVE9HR0xFCQkoMyA8PCAxOCkKLSNkZWZpbmUJCUFUOTFfVENfQUVFVlQJCSgzIDw8IDIwKQkvKiBXYXZlZm9ybSBNb2RlOiBFeHRlcm5hbCBFdmVudCBFZmZlY3Qgb24gVElPQSAqLwotI2RlZmluZQkJCUFUOTFfVENfQUVFVlRfTk9ORQkJKDAgPDwgMjApCi0jZGVmaW5lCQkJQVQ5MV9UQ19BRUVWVF9TRVQJCSgxIDw8IDIwKQotI2RlZmluZQkJCUFUOTFfVENfQUVFVlRfQ0xFQVIJCSgyIDw8IDIwKQotI2RlZmluZQkJCUFUOTFfVENfQUVFVlRfVE9HR0xFCQkoMyA8PCAyMCkKLSNkZWZpbmUJCUFUOTFfVENfQVNXVFJHCQkoMyA8PCAyMikJLyogV2F2ZWZvcm0gTW9kZTogU29mdHdhcmUgVHJpZ2dlciBFZmZlY3Qgb24gVElPQSAqLwotI2RlZmluZQkJCUFUOTFfVENfQVNXVFJHX05PTkUJCSgwIDw8IDIyKQotI2RlZmluZQkJCUFUOTFfVENfQVNXVFJHX1NFVAkJKDEgPDwgMjIpCi0jZGVmaW5lCQkJQVQ5MV9UQ19BU1dUUkdfQ0xFQVIJCSgyIDw8IDIyKQotI2RlZmluZQkJCUFUOTFfVENfQVNXVFJHX1RPR0dMRQkJKDMgPDwgMjIpCi0jZGVmaW5lCQlBVDkxX1RDX0JDUEIJCSgzIDw8IDI0KQkvKiBXYXZlZm9ybSBNb2RlOiBSQiBDb21wYXJlIEVmZmVjdCBvbiBUSU9CICovCi0jZGVmaW5lCQkJQVQ5MV9UQ19CQ1BCX05PTkUJCSgwIDw8IDI0KQotI2RlZmluZQkJCUFUOTFfVENfQkNQQl9TRVQJCSgxIDw8IDI0KQotI2RlZmluZQkJCUFUOTFfVENfQkNQQl9DTEVBUgkJKDIgPDwgMjQpCi0jZGVmaW5lCQkJQVQ5MV9UQ19CQ1BCX1RPR0dMRQkJKDMgPDwgMjQpCi0jZGVmaW5lCQlBVDkxX1RDX0JDUEMJCSgzIDw8IDI2KQkvKiBXYXZlZm9ybSBNb2RlOiBSQyBDb21wYXJlIEVmZmVjdCBvbiBUSU9CICovCi0jZGVmaW5lCQkJQVQ5MV9UQ19CQ1BDX05PTkUJCSgwIDw8IDI2KQotI2RlZmluZQkJCUFUOTFfVENfQkNQQ19TRVQJCSgxIDw8IDI2KQotI2RlZmluZQkJCUFUOTFfVENfQkNQQ19DTEVBUgkJKDIgPDwgMjYpCi0jZGVmaW5lCQkJQVQ5MV9UQ19CQ1BDX1RPR0dMRQkJKDMgPDwgMjYpCi0jZGVmaW5lCQlBVDkxX1RDX0JFRVZUCQkoMyA8PCAyOCkJLyogV2F2ZWZvcm0gTW9kZTogRXh0ZXJuYWwgRXZlbnQgRWZmZWN0IG9uIFRJT0IgKi8KLSNkZWZpbmUJCQlBVDkxX1RDX0JFRVZUX05PTkUJCSgwIDw8IDI4KQotI2RlZmluZQkJCUFUOTFfVENfQkVFVlRfU0VUCQkoMSA8PCAyOCkKLSNkZWZpbmUJCQlBVDkxX1RDX0JFRVZUX0NMRUFSCQkoMiA8PCAyOCkKLSNkZWZpbmUJCQlBVDkxX1RDX0JFRVZUX1RPR0dMRQkJKDMgPDwgMjgpCi0jZGVmaW5lCQlBVDkxX1RDX0JTV1RSRwkJKDMgPDwgMzApCS8qIFdhdmVmb3JtIE1vZGU6IFNvZnR3YXJlIFRyaWdnZXIgRWZmZWN0IG9uIFRJT0IgKi8KLSNkZWZpbmUJCQlBVDkxX1RDX0JTV1RSR19OT05FCQkoMCA8PCAzMCkKLSNkZWZpbmUJCQlBVDkxX1RDX0JTV1RSR19TRVQJCSgxIDw8IDMwKQotI2RlZmluZQkJCUFUOTFfVENfQlNXVFJHX0NMRUFSCQkoMiA8PCAzMCkKLSNkZWZpbmUJCQlBVDkxX1RDX0JTV1RSR19UT0dHTEUJCSgzIDw8IDMwKQotCi0jZGVmaW5lIEFUOTFfVENfQ1YJCTB4MTAJCS8qIENvdW50ZXIgVmFsdWUgKi8KLSNkZWZpbmUgQVQ5MV9UQ19SQQkJMHgxNAkJLyogUmVnaXN0ZXIgQSAqLwotI2RlZmluZSBBVDkxX1RDX1JCCQkweDE4CQkvKiBSZWdpc3RlciBCICovCi0jZGVmaW5lIEFUOTFfVENfUkMJCTB4MWMJCS8qIFJlZ2lzdGVyIEMgKi8KLQotI2RlZmluZSBBVDkxX1RDX1NSCQkweDIwCQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfVENfQ09WRlMJCSgxIDw8ICAwKQkvKiBDb3VudGVyIE92ZXJmbG93IFN0YXR1cyAqLwotI2RlZmluZQkJQVQ5MV9UQ19MT1ZSUwkJKDEgPDwgIDEpCS8qIExvYWQgT3ZlcnJ1biBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfVENfQ1BBUwkJKDEgPDwgIDIpCS8qIFJBIENvbXBhcmUgU3RhdHVzICovCi0jZGVmaW5lCQlBVDkxX1RDX0NQQlMJCSgxIDw8ICAzKQkvKiBSQiBDb21wYXJlIFN0YXR1cyAqLwotI2RlZmluZQkJQVQ5MV9UQ19DUENTCQkoMSA8PCAgNCkJLyogUkMgQ29tcGFyZSBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfVENfTERSQVMJCSgxIDw8ICA1KQkvKiBSQSBMb2FkaW5nIFN0YXR1cyAqLwotI2RlZmluZQkJQVQ5MV9UQ19MRFJCUwkJKDEgPDwgIDYpCS8qIFJCIExvYWRpbmcgU3RhdHVzICovCi0jZGVmaW5lCQlBVDkxX1RDX0VUUkdTCQkoMSA8PCAgNykJLyogRXh0ZXJuYWwgVHJpZ2dlciBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfVENfQ0xLU1RBCQkoMSA8PCAxNikJLyogQ2xvY2sgRW5hYmxpbmcgU3RhdHVzICovCi0jZGVmaW5lCQlBVDkxX1RDX01USU9BCQkoMSA8PCAxNykJLyogVElPQSBNaXJyb3IgKi8KLSNkZWZpbmUJCUFUOTFfVENfTVRJT0IJCSgxIDw8IDE4KQkvKiBUSU9CIE1pcnJvciAqLwotCi0jZGVmaW5lIEFUOTFfVENfSUVSCQkweDI0CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfVENfSURSCQkweDI4CQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1RDX0lNUgkJMHgyYwkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfdHdpLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfdHdpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTQ3ZDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3R3aS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF90d2kuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBJdmFuIEtva3NoYXlza3kKLSAqIENvcHlyaWdodCAoQykgU0FOIFBlb3BsZQotICoKLSAqIFR3by13aXJlIEludGVyZmFjZSAoVFdJKSByZWdpc3RlcnMuCi0gKiBCYXNlZCBvbiBBVDkxUk05MjAwIGRhdGFzaGVldCByZXZpc2lvbiBFLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBBVDkxUk05MjAwX1RXSV9ICi0jZGVmaW5lIEFUOTFSTTkyMDBfVFdJX0gKLQotI2RlZmluZQlBVDkxX1RXSV9DUgkJMHgwMAkJLyogQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9UV0lfU1RBUlQJCSgxIDw8ICAwKQkvKiBTZW5kIGEgU3RhcnQgQ29uZGl0aW9uICovCi0jZGVmaW5lCQlBVDkxX1RXSV9TVE9QCQkoMSA8PCAgMSkJLyogU2VuZCBhIFN0b3AgQ29uZGl0aW9uICovCi0jZGVmaW5lCQlBVDkxX1RXSV9NU0VOCQkoMSA8PCAgMikJLyogTWFzdGVyIFRyYW5zZmVyIEVuYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9UV0lfTVNESVMJCSgxIDw8ICAzKQkvKiBNYXN0ZXIgVHJhbnNmZXIgRGlzYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9UV0lfU1dSU1QJCSgxIDw8ICA3KQkvKiBTb2Z0d2FyZSBSZXNldCAqLwotCi0jZGVmaW5lCUFUOTFfVFdJX01NUgkJMHgwNAkJLyogTWFzdGVyIE1vZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfVFdJX0lBRFJTWgkJKDMgICAgPDwgIDgpCS8qIEludGVybmFsIERldmljZSBBZGRyZXNzIFNpemUgKi8KLSNkZWZpbmUJCQlBVDkxX1RXSV9JQURSU1pfTk8JCSgwIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9UV0lfSUFEUlNaXzEJCSgxIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9UV0lfSUFEUlNaXzIJCSgyIDw8IDgpCi0jZGVmaW5lCQkJQVQ5MV9UV0lfSUFEUlNaXzMJCSgzIDw8IDgpCi0jZGVmaW5lCQlBVDkxX1RXSV9NUkVBRAkJKDEgICAgPDwgMTIpCS8qIE1hc3RlciBSZWFkIERpcmVjdGlvbiAqLwotI2RlZmluZQkJQVQ5MV9UV0lfREFEUgkJKDB4N2YgPDwgMTYpCS8qIERldmljZSBBZGRyZXNzICovCi0KLSNkZWZpbmUJQVQ5MV9UV0lfSUFEUgkJMHgwYwkJLyogSW50ZXJuYWwgQWRkcmVzcyBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUFUOTFfVFdJX0NXR1IJCTB4MTAJCS8qIENsb2NrIFdhdmVmb3JtIEdlbmVyYXRvciBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9UV0lfQ0xESVYJCSgweGZmIDw8ICAwKQkvKiBDbG9jayBMb3cgRGl2aXNvciAqLwotI2RlZmluZQkJQVQ5MV9UV0lfQ0hESVYJCSgweGZmIDw8ICA4KQkvKiBDbG9jayBIaWdoIERpdmlzb3IgKi8KLSNkZWZpbmUJCUFUOTFfVFdJX0NLRElWCQkoNyAgICA8PCAxNikJLyogQ2xvY2sgRGl2aWRlciAqLwotCi0jZGVmaW5lCUFUOTFfVFdJX1NSCQkweDIwCQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfVFdJX1RYQ09NUAkJKDEgPDwgIDApCS8qIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSAqLwotI2RlZmluZQkJQVQ5MV9UV0lfUlhSRFkJCSgxIDw8ICAxKQkvKiBSZWNlaXZlIEhvbGRpbmcgUmVnaXN0ZXIgUmVhZHkgKi8KLSNkZWZpbmUJCUFUOTFfVFdJX1RYUkRZCQkoMSA8PCAgMikJLyogVHJhbnNtaXQgSG9sZGluZyBSZWdpc3RlciBSZWFkeSAqLwotI2RlZmluZQkJQVQ5MV9UV0lfT1ZSRQkJKDEgPDwgIDYpCS8qIE92ZXJydW4gRXJyb3IgKi8KLSNkZWZpbmUJCUFUOTFfVFdJX1VOUkUJCSgxIDw8ICA3KQkvKiBVbmRlcnJ1biBFcnJvciAqLwotI2RlZmluZQkJQVQ5MV9UV0lfTkFDSwkJKDEgPDwgIDgpCS8qIE5vdCBBY2tub3dsZWRnZWQgKi8KLQotI2RlZmluZQlBVDkxX1RXSV9JRVIJCTB4MjQJCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQVQ5MV9UV0lfSURSCQkweDI4CQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlBVDkxX1RXSV9JTVIJCTB4MmMJCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lCUFUOTFfVFdJX1JIUgkJMHgzMAkJLyogUmVjZWl2ZSBIb2xkaW5nIFJlZ2lzdGVyICovCi0jZGVmaW5lCUFUOTFfVFdJX1RIUgkJMHgzNAkJLyogVHJhbnNtaXQgSG9sZGluZyBSZWdpc3RlciAqLwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3VkcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3VkcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTFlM2Y2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXJtOTIwMF91ZHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFybTkyMDBfdWRwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgSXZhbiBLb2tzaGF5c2t5Ci0gKiBDb3B5cmlnaHQgKEMpIFNBTiBQZW9wbGUKLSAqCi0gKiBVU0IgRGV2aWNlIFBvcnQgKFVEUCkgcmVnaXN0ZXJzLgotICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgQVQ5MVJNOTIwMF9VRFBfSAotI2RlZmluZSBBVDkxUk05MjAwX1VEUF9ICi0KLSNkZWZpbmUgQVQ5MV9VRFBfRlJNX05VTQkweDAwCQkvKiBGcmFtZSBOdW1iZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfVURQX05VTQkJKDB4N2ZmIDw8ICAwKQkJLyogRnJhbWUgTnVtYmVyICovCi0jZGVmaW5lCQlBVDkxX1VEUF9GUk1fRVJSCSgxICAgICA8PCAxNikJCS8qIEZyYW1lIEVycm9yICovCi0jZGVmaW5lCQlBVDkxX1VEUF9GUk1fT0sJCSgxICAgICA8PCAxNykJCS8qIEZyYW1lIE9LICovCi0KLSNkZWZpbmUgQVQ5MV9VRFBfR0xCX1NUQVQJMHgwNAkJLyogR2xvYmFsIFN0YXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1VEUF9GQURERU4JCSgxIDw8ICAwKQkJLyogRnVuY3Rpb24gQWRkcmVzcyBFbmFibGUgKi8KLSNkZWZpbmUJCUFUOTFfVURQX0NPTkZHCQkoMSA8PCAgMSkJCS8qIENvbmZpZ3VyZWQgKi8KLSNkZWZpbmUJCUFUOTFfVURQX0VTUgkJKDEgPDwgIDIpCQkvKiBFbmFibGUgU2VuZCBSZXN1bWUgKi8KLSNkZWZpbmUJCUFUOTFfVURQX1JTTUlOUFIJKDEgPDwgIDMpCQkvKiBSZXN1bWUgaGFzIGJlZW4gc2VudCAqLwotI2RlZmluZQkJQVQ5MV9VRFBfUk1XVVBFCQkoMSA8PCAgNCkJCS8qIFJlbW90ZSBXYWtlIFVwIEVuYWJsZSAqLwotCi0jZGVmaW5lIEFUOTFfVURQX0ZBRERSCQkweDA4CQkvKiBGdW5jdGlvbiBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCQlBVDkxX1VEUF9GQURECQkoMHg3ZiA8PCAwKQkJLyogRnVuY3Rpb24gQWRkcmVzcyBWYWx1ZSAqLwotI2RlZmluZQkJQVQ5MV9VRFBfRkVOCQkoMSAgICA8PCA4KQkJLyogRnVuY3Rpb24gRW5hYmxlICovCi0KLSNkZWZpbmUgQVQ5MV9VRFBfSUVSCQkweDEwCQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfVURQX0lEUgkJMHgxNAkJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9VRFBfSU1SCQkweDE4CQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotCi0jZGVmaW5lIEFUOTFfVURQX0lTUgkJMHgxYwkJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9VRFBfRVAobikJCSgxIDw8IChuKSkJCS8qIEVuZHBvaW50IEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfVURQX1JYU1VTUAkJKDEgPDwgIDgpCQkvKiBVU0IgU3VzcGVuZCBJbnRlcnJ1cHQgU3RhdHVzICovCi0jZGVmaW5lCQlBVDkxX1VEUF9SWFJTTQkJKDEgPDwgIDkpCQkvKiBVU0IgUmVzdW1lIEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfVURQX0VYVFJTTQkJKDEgPDwgMTApCQkvKiBFeHRlcm5hbCBSZXN1bWUgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZQkJQVQ5MV9VRFBfU09GSU5UCQkoMSA8PCAxMSkJCS8qIFN0YXJ0IG9mIEZyYW1lIEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUJCUFUOTFfVURQX0VOREJVU1JFUwkoMSA8PCAxMikJCS8qIEVuZCBvZiBCdXMgUmVzZXQgSW50ZXJycHQgU3RhdHVzICovCi0jZGVmaW5lCQlBVDkxX1VEUF9XQUtFVVAJCSgxIDw8IDEzKQkJLyogVVNCIFdha2V1cCBJbnRlcnJ1cHQgU3RhdHVzICovCi0KLSNkZWZpbmUgQVQ5MV9VRFBfSUNSCQkweDIwCQkvKiBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9VRFBfUlNUX0VQCQkweDI4CQkvKiBSZXNldCBFbmRwb2ludCBSZWdpc3RlciAqLwotCi0jZGVmaW5lIEFUOTFfVURQX0NTUihuKQkJKDB4MzAgKyAoKG4pICogNCkpCS8qIEVuZHBvaW50IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVycyAwLTcgKi8KLSNkZWZpbmUJCUFUOTFfVURQX1RYQ09NUAkJKDEgPDwgIDApCQkvKiBHZW5lcmF0ZXMgSU4gcGFja2V0IHdpdGggZGF0YSBwcmV2aW91c2x5IHdyaXR0ZW4gaW4gRFBSICovCi0jZGVmaW5lCQlBVDkxX1VEUF9SWF9EQVRBX0JLMAkoMSA8PCAgMSkJCS8qIFJlY2VpdmUgRGF0YSBCYW5rIDAgKi8KLSNkZWZpbmUJCUFUOTFfVURQX1JYU0VUVVAJKDEgPDwgIDIpCQkvKiBTZW5kIFNUQUxMIHRvIHRoZSBob3N0ICovCi0jZGVmaW5lCQlBVDkxX1VEUF9TVEFMTFNFTlQJKDEgPDwgIDMpCQkvKiBTdGFsbCBTZW50IC8gSXNvY2hyb25vdXMgZXJyb3IgKElzb2Nocm9ub3VzIGVuZHBvaW50cykgKi8KLSNkZWZpbmUJCUFUOTFfVURQX1RYUEtUUkRZCSgxIDw8ICA0KQkJLyogVHJhbnNtaXQgUGFja2V0IFJlYWR5ICovCi0jZGVmaW5lCQlBVDkxX1VEUF9GT1JDRVNUQUxMCSgxIDw8ICA1KQkJLyogRm9yY2UgU3RhbGwgKi8KLSNkZWZpbmUJCUFUOTFfVURQX1JYX0RBVEFfQksxCSgxIDw8ICA2KQkJLyogUmVjZWl2ZSBEYXRhIEJhbmsgMSAqLwotI2RlZmluZQkJQVQ5MV9VRFBfRElSCQkoMSA8PCAgNykJCS8qIFRyYW5zZmVyIERpcmVjdGlvbiAqLwotI2RlZmluZQkJQVQ5MV9VRFBfRVBUWVBFCQkoNyA8PCAgOCkJCS8qIEVuZHBvaW50IFR5cGUgKi8KLSNkZWZpbmUJCQlBVDkxX1VEUF9FUFRZUEVfQ1RSTAkJKDAgPDwgIDgpCi0jZGVmaW5lCQkJQVQ5MV9VRFBfRVBUWVBFX0lTT19PVVQJCSgxIDw8ICA4KQotI2RlZmluZQkJCUFUOTFfVURQX0VQVFlQRV9CVUxLX09VVAkoMiA8PCAgOCkKLSNkZWZpbmUJCQlBVDkxX1VEUF9FUFRZUEVfSU5UX09VVAkJKDMgPDwgIDgpCi0jZGVmaW5lCQkJQVQ5MV9VRFBfRVBUWVBFX0lTT19JTgkJKDUgPDwgIDgpCi0jZGVmaW5lCQkJQVQ5MV9VRFBfRVBUWVBFX0JVTEtfSU4JCSg2IDw8ICA4KQotI2RlZmluZQkJCUFUOTFfVURQX0VQVFlQRV9JTlRfSU4JCSg3IDw8ICA4KQotI2RlZmluZQkJQVQ5MV9VRFBfRFRHTEUJCSgxIDw8IDExKQkJLyogRGF0YSBUb2dnbGUgKi8KLSNkZWZpbmUJCUFUOTFfVURQX0VQRURTCQkoMSA8PCAxNSkJCS8qIEVuZHBvaW50IEVuYWJsZS9EaXNhYmxlICovCi0jZGVmaW5lCQlBVDkxX1VEUF9SWEJZVEVDTlQJKDB4N2ZmIDw8IDE2KQkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIEZJRk8gKi8KLQotI2RlZmluZSBBVDkxX1VEUF9GRFIobikJCSgweDUwICsgKChuKSAqIDQpKQkvKiBFbmRwb2ludCBGSUZPIERhdGEgUmVnaXN0ZXJzIDAtNyAqLwotCi0jZGVmaW5lIEFUOTFfVURQX1RYVkMJCTB4NzQJCS8qIFRyYW5zY2VpdmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJCUFUOTFfVURQX1RYVkNfVFhWRElTCSgxIDw8IDgpCQkvKiBUcmFuc2NlaXZlciBEaXNhYmxlICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjRkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYwLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYwLmgKKyAqCisgKiAoQykgMjAwNiBBbmRyZXcgVmljdG9yCisgKgorICogQ29tbW9uIGRlZmluaXRpb25zLgorICogQmFzZWQgb24gQVQ5MVNBTTkyNjAgZGF0YXNoZWV0IHJldmlzaW9uIEEgKFByZWxpbWluYXJ5KS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MVNBTTkyNjBfSAorI2RlZmluZSBBVDkxU0FNOTI2MF9ICisKKy8qCisgKiBQZXJpcGhlcmFsIGlkZW50aWZpZXJzL2ludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgQVQ5MV9JRF9GSVEJCTAJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKEZJUSkgKi8KKyNkZWZpbmUgQVQ5MV9JRF9TWVMJCTEJLyogU3lzdGVtIFBlcmlwaGVyYWxzICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX1BJT0EJMgkvKiBQYXJhbGxlbCBJTyBDb250cm9sbGVyIEEgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfUElPQgkzCS8qIFBhcmFsbGVsIElPIENvbnRyb2xsZXIgQiAqLworI2RlZmluZSBBVDkxU0FNOTI2MF9JRF9QSU9DCTQJLyogUGFyYWxsZWwgSU8gQ29udHJvbGxlciBDICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX0FEQwk1CS8qIEFuYWxvZy10by1EaWdpdGFsIENvbnZlcnRlciAqLworI2RlZmluZSBBVDkxU0FNOTI2MF9JRF9VUzAJNgkvKiBVU0FSVCAwICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX1VTMQk3CS8qIFVTQVJUIDEgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfVVMyCTgJLyogVVNBUlQgMiAqLworI2RlZmluZSBBVDkxU0FNOTI2MF9JRF9NQ0kJOQkvKiBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX1VEUAkxMAkvKiBVU0IgRGV2aWNlIFBvcnQgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfVFdJCTExCS8qIFR3by1XaXJlIEludGVyZmFjZSAqLworI2RlZmluZSBBVDkxU0FNOTI2MF9JRF9TUEkwCTEyCS8qIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAwICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX1NQSTEJMTMJLyogU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIDEgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfU1NDCTE0CS8qIFNlcmlhbCBTeW5jaHJvbm91cyBDb250cm9sbGVyICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX1RDMAkxNwkvKiBUaW1lciBDb3VudGVyIDAgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfVEMxCTE4CS8qIFRpbWVyIENvdW50ZXIgMSAqLworI2RlZmluZSBBVDkxU0FNOTI2MF9JRF9UQzIJMTkJLyogVGltZXIgQ291bnRlciAyICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX1VIUAkyMAkvKiBVU0IgSG9zdCBwb3J0ICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX0VNQUMJMjEJLyogRXRoZXJuZXQgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfSVNJCTIyCS8qIEltYWdlIFNlbnNvciBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfVVMzCTIzCS8qIFVTQVJUIDMgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfVVM0CTI0CS8qIFVTQVJUIDQgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfVVM1CTI1CS8qIFVTQVJUIDUgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfVEMzCTI2CS8qIFRpbWVyIENvdW50ZXIgMyAqLworI2RlZmluZSBBVDkxU0FNOTI2MF9JRF9UQzQJMjcJLyogVGltZXIgQ291bnRlciA0ICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0lEX1RDNQkyOAkvKiBUaW1lciBDb3VudGVyIDUgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfSVJRMAkyOQkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAoSVJRMCkgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfSVJRMQkzMAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAoSVJRMSkgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjBfSURfSVJRMgkzMQkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAoSVJRMikgKi8KKworCisvKgorICogVXNlciBQZXJpcGhlcmFsIHBoeXNpY2FsIGJhc2UgYWRkcmVzc2VzLgorICovCisjZGVmaW5lIEFUOTFTQU05MjYwX0JBU0VfVENCMAkJMHhmZmZhMDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1RDMAkJMHhmZmZhMDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1RDMQkJMHhmZmZhMDA0MAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1RDMgkJMHhmZmZhMDA4MAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1VEUAkJMHhmZmZhNDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX01DSQkJMHhmZmZhODAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1RXSQkJMHhmZmZhYzAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1VTMAkJMHhmZmZiMDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1VTMQkJMHhmZmZiNDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1VTMgkJMHhmZmZiODAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1NTQwkJMHhmZmZiYzAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX0lTSQkJMHhmZmZjMDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX0VNQUMJCTB4ZmZmYzQwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjBfQkFTRV9TUEkwCQkweGZmZmM4MDAwCisjZGVmaW5lIEFUOTFTQU05MjYwX0JBU0VfU1BJMQkJMHhmZmZjYzAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1VTMwkJMHhmZmZkMDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1VTNAkJMHhmZmZkNDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1VTNQkJMHhmZmZkODAwMAorI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1RDQjEJCTB4ZmZmZGMwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjBfQkFTRV9UQzMJCTB4ZmZmZGMwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjBfQkFTRV9UQzQJCTB4ZmZmZGMwNDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjBfQkFTRV9UQzUJCTB4ZmZmZGMwODAKKyNkZWZpbmUgQVQ5MVNBTTkyNjBfQkFTRV9BREMJCTB4ZmZmZTAwMDAKKyNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkJCTB4ZmZmZmU4MDAKKworLyoKKyAqIFN5c3RlbSBQZXJpcGhlcmFscyAob2Zmc2V0IGZyb20gQVQ5MV9CQVNFX1NZUykKKyAqLworI2RlZmluZSBBVDkxX0VDQwkoMHhmZmZmZTgwMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfU0RSQU1DCSgweGZmZmZlYTAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9TTUMJKDB4ZmZmZmVjMDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX01BVFJJWAkoMHhmZmZmZWUwMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfQ0NGRwkoMHhmZmZmZWYxMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfQUlDCSgweGZmZmZmMDAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9EQkdVCSgweGZmZmZmMjAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9QSU9BCSgweGZmZmZmNDAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9QSU9CCSgweGZmZmZmNjAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9QSU9DCSgweGZmZmZmODAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9QTUMJKDB4ZmZmZmZjMDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1JTVEMJKDB4ZmZmZmZkMDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1NIRFdDCSgweGZmZmZmZDEwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9SVFQJKDB4ZmZmZmZkMjAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1BJVAkoMHhmZmZmZmQzMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfV0RUCSgweGZmZmZmZDQwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9HUEJSCSgweGZmZmZmZDUwIC0gQVQ5MV9CQVNFX1NZUykKKworCisvKgorICogSW50ZXJuYWwgTWVtb3J5LgorICovCisjZGVmaW5lIEFUOTFTQU05MjYwX1JPTV9CQVNFCTB4MDAxMDAwMDAJLyogSW50ZXJuYWwgUk9NIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBBVDkxU0FNOTI2MF9ST01fU0laRQlTWl8zMksJCS8qIEludGVybmFsIFJPTSBzaXplICgzMktiKSAqLworCisjZGVmaW5lIEFUOTFTQU05MjYwX1NSQU0wX0JBU0UJMHgwMDIwMDAwMAkvKiBJbnRlcm5hbCBTUkFNIDAgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEFUOTFTQU05MjYwX1NSQU0wX1NJWkUJU1pfNEsJCS8qIEludGVybmFsIFNSQU0gMCBzaXplICg0S2IpICovCisjZGVmaW5lIEFUOTFTQU05MjYwX1NSQU0xX0JBU0UJMHgwMDMwMDAwMAkvKiBJbnRlcm5hbCBTUkFNIDEgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEFUOTFTQU05MjYwX1NSQU0xX1NJWkUJU1pfNEsJCS8qIEludGVybmFsIFNSQU0gMSBzaXplICg0S2IpICovCisKKyNkZWZpbmUgQVQ5MVNBTTkyNjBfVUhQX0JBU0UJMHgwMDUwMDAwMAkvKiBVU0IgSG9zdCBjb250cm9sbGVyICovCisKKyNpZiAwCisvKgorICogUElPIHBpbiBkZWZpbml0aW9ucyAocGVyaXBoZXJhbCBBL0IgbXVsdGlwbGV4aW5nKS4KKyAqLworCisvLyBUT0RPOiBBZGQKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MF9tYXRyaXguaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjBfbWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2ZDk3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYwX21hdHJpeC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYwX21hdHJpeC5oCisgKgorICogTWVtb3J5IENvbnRyb2xsZXJzIChNQVRSSVgsIEVCSSkgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVNBTTkyNjAgZGF0YXNoZWV0IHJldmlzaW9uIEIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFTQU05MjYwX01BVFJJWF9ICisjZGVmaW5lIEFUOTFTQU05MjYwX01BVFJJWF9ICisKKyNkZWZpbmUgQVQ5MV9NQVRSSVhfTUNGRzAJKEFUOTFfTUFUUklYICsgMHgwMCkJLyogTWFzdGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAqLworI2RlZmluZSBBVDkxX01BVFJJWF9NQ0ZHMQkoQVQ5MV9NQVRSSVggKyAweDA0KQkvKiBNYXN0ZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIEFUOTFfTUFUUklYX01DRkcyCShBVDkxX01BVFJJWCArIDB4MDgpCS8qIE1hc3RlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgQVQ5MV9NQVRSSVhfTUNGRzMJKEFUOTFfTUFUUklYICsgMHgwQykJLyogTWFzdGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMyAqLworI2RlZmluZSBBVDkxX01BVFJJWF9NQ0ZHNAkoQVQ5MV9NQVRSSVggKyAweDEwKQkvKiBNYXN0ZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA0ICovCisjZGVmaW5lIEFUOTFfTUFUUklYX01DRkc1CShBVDkxX01BVFJJWCArIDB4MDQpCS8qIE1hc3RlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUJCUFUOTFfTUFUUklYX1VMQlQJCSg3IDw8IDApCS8qIFVuZGVmaW5lZCBMZW5ndGggQnVyc3QgVHlwZSAqLworI2RlZmluZQkJCUFUOTFfTUFUUklYX1VMQlRfSU5GSU5JVEUJKDAgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9VTEJUX1NJTkdMRQkJKDEgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9VTEJUX0ZPVVIJCSgyIDw8IDApCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfVUxCVF9FSUdIVAkJKDMgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9VTEJUX1NJWFRFRU4JKDQgPDwgMCkKKworI2RlZmluZSBBVDkxX01BVFJJWF9TQ0ZHMAkoQVQ5MV9NQVRSSVggKyAweDQwKQkvKiBTbGF2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgQVQ5MV9NQVRSSVhfU0NGRzEJKEFUOTFfTUFUUklYICsgMHg0NCkJLyogU2xhdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIEFUOTFfTUFUUklYX1NDRkcyCShBVDkxX01BVFJJWCArIDB4NDgpCS8qIFNsYXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBBVDkxX01BVFJJWF9TQ0ZHMwkoQVQ5MV9NQVRSSVggKyAweDRDKQkvKiBTbGF2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgQVQ5MV9NQVRSSVhfU0NGRzQJKEFUOTFfTUFUUklYICsgMHg1MCkJLyogU2xhdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA0ICovCisjZGVmaW5lCQlBVDkxX01BVFJJWF9TTE9UX0NZQ0xFCQkoMHhmZiA8PCAgMCkJLyogTWF4aW11bSBOdW1iZXIgb2YgQWxsb3dlZCBDeWNsZXMgZm9yIGEgQnVyc3QgKi8KKyNkZWZpbmUJCUFUOTFfTUFUUklYX0RFRk1TVFJfVFlQRQkoMyAgICA8PCAxNikJLyogRGVmYXVsdCBNYXN0ZXIgVHlwZSAqLworI2RlZmluZQkJCUFUOTFfTUFUUklYX0RFRk1TVFJfVFlQRV9OT05FCSgwIDw8IDE2KQorI2RlZmluZQkJCUFUOTFfTUFUUklYX0RFRk1TVFJfVFlQRV9MQVNUCSgxIDw8IDE2KQorI2RlZmluZQkJCUFUOTFfTUFUUklYX0RFRk1TVFJfVFlQRV9GSVhFRAkoMiA8PCAxNikKKyNkZWZpbmUJCUFUOTFfTUFUUklYX0ZJWEVEX0RFRk1TVFIJKDcgICAgPDwgMTgpCS8qIEZpeGVkIEluZGV4IG9mIERlZmF1bHQgTWFzdGVyICovCisjZGVmaW5lCQlBVDkxX01BVFJJWF9BUkJUCQkoMyAgICA8PCAyNCkJLyogQXJiaXRyYXRpb24gVHlwZSAqLworI2RlZmluZQkJCUFUOTFfTUFUUklYX0FSQlRfUk9VTkRfUk9CSU4JKDAgPDwgMjQpCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfQVJCVF9GSVhFRF9QUklPUklUWQkoMSA8PCAyNCkKKworI2RlZmluZSBBVDkxX01BVFJJWF9QUkFTMAkoQVQ5MV9NQVRSSVggKyAweDgwKQkvKiBQcmlvcml0eSBSZWdpc3RlciBBIGZvciBTbGF2ZSAwICovCisjZGVmaW5lIEFUOTFfTUFUUklYX1BSQVMxCShBVDkxX01BVFJJWCArIDB4ODgpCS8qIFByaW9yaXR5IFJlZ2lzdGVyIEEgZm9yIFNsYXZlIDEgKi8KKyNkZWZpbmUgQVQ5MV9NQVRSSVhfUFJBUzIJKEFUOTFfTUFUUklYICsgMHg5MCkJLyogUHJpb3JpdHkgUmVnaXN0ZXIgQSBmb3IgU2xhdmUgMiAqLworI2RlZmluZSBBVDkxX01BVFJJWF9QUkFTMwkoQVQ5MV9NQVRSSVggKyAweDk4KQkvKiBQcmlvcml0eSBSZWdpc3RlciBBIGZvciBTbGF2ZSAzICovCisjZGVmaW5lIEFUOTFfTUFUUklYX1BSQVM0CShBVDkxX01BVFJJWCArIDB4QTApCS8qIFByaW9yaXR5IFJlZ2lzdGVyIEEgZm9yIFNsYXZlIDQgKi8KKyNkZWZpbmUJCUFUOTFfTUFUUklYX00wUFIJCSgzIDw8IDApCS8qIE1hc3RlciAwIFByaW9yaXR5ICovCisjZGVmaW5lCQlBVDkxX01BVFJJWF9NMVBSCQkoMyA8PCA0KQkvKiBNYXN0ZXIgMSBQcmlvcml0eSAqLworI2RlZmluZQkJQVQ5MV9NQVRSSVhfTTJQUgkJKDMgPDwgOCkJLyogTWFzdGVyIDIgUHJpb3JpdHkgKi8KKyNkZWZpbmUJCUFUOTFfTUFUUklYX00zUFIJCSgzIDw8IDEyKQkvKiBNYXN0ZXIgMyBQcmlvcml0eSAqLworI2RlZmluZQkJQVQ5MV9NQVRSSVhfTTRQUgkJKDMgPDwgMTYpCS8qIE1hc3RlciA0IFByaW9yaXR5ICovCisjZGVmaW5lCQlBVDkxX01BVFJJWF9NNVBSCQkoMyA8PCAyMCkJLyogTWFzdGVyIDUgUHJpb3JpdHkgKi8KKworI2RlZmluZSBBVDkxX01BVFJJWF9NUkNSCShBVDkxX01BVFJJWCArIDB4MTAwKQkvKiBNYXN0ZXIgUmVtYXAgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQVRSSVhfUkNCMAkJKDEgPDwgMCkJLyogUmVtYXAgQ29tbWFuZCBmb3IgQUhCIE1hc3RlciAwIChBUk05MjZFSi1TIEluc3RydWN0aW9uIE1hc3RlcikgKi8KKyNkZWZpbmUJCUFUOTFfTUFUUklYX1JDQjEJCSgxIDw8IDEpCS8qIFJlbWFwIENvbW1hbmQgZm9yIEFIQiBNYXN0ZXIgMSAoQVJNOTI2RUotUyBEYXRhIE1hc3RlcikgKi8KKworI2RlZmluZSBBVDkxX01BVFJJWF9FQklDU0EJKEFUOTFfTUFUUklYICsgMHgxMUMpCS8qIEVCSSBDaGlwIFNlbGVjdCBBc3NpZ25tZW50IFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX01BVFJJWF9DUzFBCQkoMSA8PCAxKQkgLyogQ2hpcCBTZWxlY3QgMSBBc3NpZ25tZW50ICovCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfQ1MxQV9TTUMJCSgwIDw8IDEpCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfQ1MxQV9TRFJBTUMJCSgxIDw8IDEpCisjZGVmaW5lCQlBVDkxX01BVFJJWF9DUzNBCQkoMSA8PCAzKQkvKiBDaGlwIFNlbGVjdCAzIEFzc2lnbm1lbnQgKi8KKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9DUzNBX1NNQwkJKDAgPDwgMykKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9DUzNBX1NNQ19TTUFSVE1FRElBCSgxIDw8IDMpCisjZGVmaW5lCQlBVDkxX01BVFJJWF9DUzRBCQkoMSA8PCA0KQkvKiBDaGlwIFNlbGVjdCA0IEFzc2lnbm1lbnQgKi8KKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9DUzRBX1NNQwkJKDAgPDwgNCkKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9DUzRBX1NNQ19DRjEJKDEgPDwgNCkKKyNkZWZpbmUJCUFUOTFfTUFUUklYX0NTNUEJCSgxIDw8IDUgKQkvKiBDaGlwIFNlbGVjdCA1IEFzc2lnbm1lbnQgKi8KKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9DUzVBX1NNQwkJKDAgPDwgNSkKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9DUzVBX1NNQ19DRjIJKDEgPDwgNSkKKyNkZWZpbmUJCUFUOTFfTUFUUklYX0RCUFVDCQkoMSA8PCA4KQkvKiBEYXRhIEJ1cyBQdWxsLXVwIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUJCUFUOTFfTUFUUklYX1ZERElPTVNFTAkJKDEgPDwgMTYpCS8qIE1lbW9yeSB2b2x0YWdlIHNlbGVjdGlvbiAqLworI2RlZmluZQkJCUFUOTFfTUFUUklYX1ZERElPTVNFTF8xXzhWCSgwIDw8IDE2KQorI2RlZmluZQkJCUFUOTFfTUFUUklYX1ZERElPTVNFTF8zXzNWCSgxIDw8IDE2KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDM5NjcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MS5oCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2MS5oCisgKgorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogQ29tbW9uIGRlZmluaXRpb25zLgorICogQmFzZWQgb24gQVQ5MVNBTTkyNjEgZGF0YXNoZWV0IHJldmlzaW9uIEUuIChQcmVsaW1pbmFyeSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MVNBTTkyNjFfSAorI2RlZmluZSBBVDkxU0FNOTI2MV9ICisKKy8qCisgKiBQZXJpcGhlcmFsIGlkZW50aWZpZXJzL2ludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgQVQ5MV9JRF9GSVEJCTAJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKEZJUSkgKi8KKyNkZWZpbmUgQVQ5MV9JRF9TWVMJCTEJLyogU3lzdGVtIFBlcmlwaGVyYWxzICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX1BJT0EJMgkvKiBQYXJhbGxlbCBJTyBDb250cm9sbGVyIEEgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfSURfUElPQgkzCS8qIFBhcmFsbGVsIElPIENvbnRyb2xsZXIgQiAqLworI2RlZmluZSBBVDkxU0FNOTI2MV9JRF9QSU9DCTQJLyogUGFyYWxsZWwgSU8gQ29udHJvbGxlciBDICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX1VTMAk2CS8qIFVTQVJUIDAgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfSURfVVMxCTcJLyogVVNBUlQgMSAqLworI2RlZmluZSBBVDkxU0FNOTI2MV9JRF9VUzIJOAkvKiBVU0FSVCAyICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX01DSQk5CS8qIE11bHRpbWVkaWEgQ2FyZCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfSURfVURQCTEwCS8qIFVTQiBEZXZpY2UgUG9ydCAqLworI2RlZmluZSBBVDkxU0FNOTI2MV9JRF9UV0kJMTEJLyogVHdvLVdpcmUgSW50ZXJmYWNlICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX1NQSTAJMTIJLyogU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIDAgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfSURfU1BJMQkxMwkvKiBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgMSAqLworI2RlZmluZSBBVDkxU0FNOTI2MV9JRF9TU0MwCTE0CS8qIFNlcmlhbCBTeW5jaHJvbm91cyBDb250cm9sbGVyIDAgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfSURfU1NDMQkxNQkvKiBTZXJpYWwgU3luY2hyb25vdXMgQ29udHJvbGxlciAxICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX1NTQzIJMTYJLyogU2VyaWFsIFN5bmNocm9ub3VzIENvbnRyb2xsZXIgMiAqLworI2RlZmluZSBBVDkxU0FNOTI2MV9JRF9UQzAJMTcJLyogVGltZXIgQ291bnRlciAwICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX1RDMQkxOAkvKiBUaW1lciBDb3VudGVyIDEgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfSURfVEMyCTE5CS8qIFRpbWVyIENvdW50ZXIgMiAqLworI2RlZmluZSBBVDkxU0FNOTI2MV9JRF9VSFAJMjAJLyogVVNCIEhvc3QgcG9ydCAqLworI2RlZmluZSBBVDkxU0FNOTI2MV9JRF9MQ0RDCTIxCS8qIExEQyBDb250cm9sbGVyICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX0lSUTAJMjkJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTApICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX0lSUTEJMzAJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTEpICovCisjZGVmaW5lIEFUOTFTQU05MjYxX0lEX0lSUTIJMzEJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTIpICovCisKKworLyoKKyAqIFVzZXIgUGVyaXBoZXJhbCBwaHlzaWNhbCBiYXNlIGFkZHJlc3Nlcy4KKyAqLworI2RlZmluZSBBVDkxU0FNOTI2MV9CQVNFX1RDQjAJCTB4ZmZmYTAwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9UQzAJCTB4ZmZmYTAwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9UQzEJCTB4ZmZmYTAwNDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9UQzIJCTB4ZmZmYTAwODAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9VRFAJCTB4ZmZmYTQwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9NQ0kJCTB4ZmZmYTgwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9UV0kJCTB4ZmZmYWMwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9VUzAJCTB4ZmZmYjAwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9VUzEJCTB4ZmZmYjQwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9VUzIJCTB4ZmZmYjgwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9TU0MwCQkweGZmZmJjMDAwCisjZGVmaW5lIEFUOTFTQU05MjYxX0JBU0VfU1NDMQkJMHhmZmZjMDAwMAorI2RlZmluZSBBVDkxU0FNOTI2MV9CQVNFX1NTQzIJCTB4ZmZmYzQwMDAKKyNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9TUEkwCQkweGZmZmM4MDAwCisjZGVmaW5lIEFUOTFTQU05MjYxX0JBU0VfU1BJMQkJMHhmZmZjYzAwMAorI2RlZmluZSBBVDkxX0JBU0VfU1lTCQkJMHhmZmZmZWEwMAorCisKKy8qCisgKiBTeXN0ZW0gUGVyaXBoZXJhbHMgKG9mZnNldCBmcm9tIEFUOTFfQkFTRV9TWVMpCisgKi8KKyNkZWZpbmUgQVQ5MV9TRFJBTUMJKDB4ZmZmZmVhMDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1NNQwkoMHhmZmZmZWMwMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfTUFUUklYCSgweGZmZmZlZTAwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9BSUMJKDB4ZmZmZmYwMDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX0RCR1UJKDB4ZmZmZmYyMDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1BJT0EJKDB4ZmZmZmY0MDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1BJT0IJKDB4ZmZmZmY2MDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1BJT0MJKDB4ZmZmZmY4MDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1BNQwkoMHhmZmZmZmMwMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfUlNUQwkoMHhmZmZmZmQwMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfU0hEV0MJKDB4ZmZmZmZkMTAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX1JUVAkoMHhmZmZmZmQyMCAtIEFUOTFfQkFTRV9TWVMpCisjZGVmaW5lIEFUOTFfUElUCSgweGZmZmZmZDMwIC0gQVQ5MV9CQVNFX1NZUykKKyNkZWZpbmUgQVQ5MV9XRFQJKDB4ZmZmZmZkNDAgLSBBVDkxX0JBU0VfU1lTKQorI2RlZmluZSBBVDkxX0dQQlIJKDB4ZmZmZmZkNTAgLSBBVDkxX0JBU0VfU1lTKQorCisKKy8qCisgKiBJbnRlcm5hbCBNZW1vcnkuCisgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfU1JBTV9CQVNFCTB4MDAzMDAwMDAJLyogSW50ZXJuYWwgU1JBTSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfU1JBTV9TSVpFCTB4MDAwMjgwMDAJLyogSW50ZXJuYWwgU1JBTSBzaXplICgxNjBLYikgKi8KKworI2RlZmluZSBBVDkxU0FNOTI2MV9ST01fQkFTRQkweDAwNDAwMDAwCS8qIEludGVybmFsIFJPTSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfUk9NX1NJWkUJU1pfMzJLCQkvKiBJbnRlcm5hbCBST00gc2l6ZSAoMzJLYikgKi8KKworI2RlZmluZSBBVDkxU0FNOTI2MV9VSFBfQkFTRQkweDAwNTAwMDAwCS8qIFVTQiBIb3N0IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgQVQ5MVNBTTkyNjFfTENEQ19CQVNFCTB4MDA2MDAwMDAJLyogTERDIGNvbnRyb2xsZXIgKi8KKworCisjaWYgMAorLyoKKyAqIFBJTyBwaW4gZGVmaW5pdGlvbnMgKHBlcmlwaGVyYWwgQS9CIG11bHRpcGxleGluZykuCisgKi8KKyNkZWZpbmUgQVQ5MV9QQTBfU1BJMF9NSVNPCSgxIDw8ICAwKQkvKiBBOiBTUEkwIE1hc3RlciBJbiBTbGF2ZSAqLworI2RlZmluZSBBVDkxX1BBMF9NQ0RBMAkJKDEgPDwgIDApCS8qIEI6IE11bHRpbWVkaWEgQ2FyZCBBIERhdGEgMCAqLworI2RlZmluZSBBVDkxX1BBMV9TUEkwX01PU0kJKDEgPDwgIDEpCS8qIEE6IFNQSTAgTWFzdGVyIE91dCBTbGF2ZSAqLworI2RlZmluZSBBVDkxX1BBMV9NQ0NEQQkJKDEgPDwgIDEpCS8qIEI6IE11bHRpbWVkaWEgQ2FyZCBBIENvbW1hbmQgKi8KKyNkZWZpbmUgQVQ5MV9QQTJfU1BJMF9TUENLCSgxIDw8ICAyKQkvKiBBOiBTUEkwIFNlcmlhbCBDbG9jayAqLworI2RlZmluZSBBVDkxX1BBMl9NQ0NLCQkoMSA8PCAgMikJLyogQjogTXVsdGltZWRpYSBDYXJkIENsb2NrICovCisjZGVmaW5lIEFUOTFfUEEzX1NQSTBfTlBDUzAJKDEgPDwgIDMpCS8qIEE6IFNQSTAgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAwICovCisjZGVmaW5lIEFUOTFfUEE0X1NQSTBfTlBDUzEJKDEgPDwgIDQpCS8qIEE6IFNQSTAgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAxICovCisjZGVmaW5lIEFUOTFfUEE0X01DREExCQkoMSA8PCAgNCkJLyogQjogTXVsdGltZWRpYSBDYXJkIEEgRGF0YSAxICovCisjZGVmaW5lIEFUOTFfUEE1X1NQSTBfTlBDUzIJKDEgPDwgIDUpCS8qIEE6IFNQSTAgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAyICovCisjZGVmaW5lIEFUOTFfUEE1X01DREEyCQkoMSA8PCAgNSkJLyogQjogTXVsdGltZWRpYSBDYXJkIEEgRGF0YSAyICovCisjZGVmaW5lIEFUOTFfUEE2X1NQSTBfTlBDUzMJKDEgPDwgIDYpCS8qIEE6IFNQSTAgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAzICovCisjZGVmaW5lIEFUOTFfUEE2X01DREEzCQkoMSA8PCAgNikJLyogQjogTXVsdGltZWRpYSBDYXJkIEEgRGF0YSAzICovCisjZGVmaW5lIEFUOTFfUEE3X1RXRAkJKDEgPDwgIDcpCS8qIEE6IFRXSSBUd28td2lyZSBTZXJpYWwgRGF0YSAqLworI2RlZmluZSBBVDkxX1BBN19QQ0swCQkoMSA8PCAgNykJLyogQjogUE1DIFByb2dyYW1tYWJsZSBjbG9jayBPdXRwdXQgMCAqLworI2RlZmluZSBBVDkxX1BBOF9UV0NLCQkoMSA8PCAgOCkJLyogQTogVFdJIFR3by13aXJlIFNlcmlhbCBDbG9jayAqLworI2RlZmluZSBBVDkxX1BBOF9QQ0sxCQkoMSA8PCAgOCkJLyogQjogUE1DIFByb2dyYW1tYWJsZSBjbG9jayBPdXRwdXQgMSAqLworI2RlZmluZSBBVDkxX1BBOV9EUlhECQkoMSA8PCAgOSkJLyogQTogREJHVSBEZWJ1ZyBSZWNlaXZlIERhdGEgKi8KKyNkZWZpbmUgQVQ5MV9QQTlfUENLMgkJKDEgPDwgIDkpCS8qIEI6IFBNQyBQcm9ncmFtbWFibGUgY2xvY2sgT3V0cHV0IDIgKi8KKyNkZWZpbmUgQVQ5MV9QQTEwX0RUWEQJCSgxIDw8IDEwKQkvKiBBOiBEQkdVIERlYnVnIFRyYW5zbWl0IERhdGEgKi8KKyNkZWZpbmUgQVQ5MV9QQTEwX1BDSzMJCSgxIDw8IDEwKQkvKiBCOiBQTUMgUHJvZ3JhbW1hYmxlIGNsb2NrIE91dHB1dCAzICovCisjZGVmaW5lIEFUOTFfUEExMV9UU1lOQwkJKDEgPDwgMTEpCS8qIEE6IFRyYWNlIFN5bmNocm9uaXphdGlvbiBTaWduYWwgKi8KKyNkZWZpbmUgQVQ5MV9QQTExX1NDSzEJCSgxIDw8IDExKQkvKiBCOiBVU0FSVDEgU2VyaWFsIENsb2NrICovCisjZGVmaW5lIEFUOTFfUEExMl9UQ0xLCQkoMSA8PCAxMikJLyogQTogVHJhY2UgQ2xvY2sgKi8KKyNkZWZpbmUgQVQ5MV9QQTEyX1JUUzEJCSgxIDw8IDEyKQkvKiBCOiBVU0FSVDEgUmVhZHkgVG8gU2VuZCAqLworI2RlZmluZSBBVDkxX1BBMTNfVFBTMAkJKDEgPDwgMTMpCS8qIEE6IFRyYWNlIEFSTSBQaXBlbGluZSBTdGF0dXMgMCAqLworI2RlZmluZSBBVDkxX1BBMTNfQ1RTMQkJKDEgPDwgMTMpCS8qIEI6IFVTQVJUMSBDbGVhciBUbyBTZW5kICovCisjZGVmaW5lIEFUOTFfUEExNF9UUFMxCQkoMSA8PCAxNCkJLyogQTogVHJhY2UgQVJNIFBpcGVsaW5lIFN0YXR1cyAxICovCisjZGVmaW5lIEFUOTFfUEExNF9TQ0syCQkoMSA8PCAxNCkJLyogQjogVVNBUlQyIFNlcmlhbCBDbG9jayAqLworI2RlZmluZSBBVDkxX1BBMTVfVFBTMgkJKDEgPDwgMTUpCS8qIEE6IFRyYWNlIEFSTSBQaXBlbGluZSBTdGF0dXMgMiAqLworI2RlZmluZSBBVDkxX1BBMTVfUlRTMgkJKDEgPDwgMTUpCS8qIEI6IFVTQVJUMiBSZWFkeSBUbyBTZW5kICovCisjZGVmaW5lIEFUOTFfUEExNl9UUEswCQkoMSA8PCAxNikJLyogQTogVHJhY2UgUGFja2V0IFBvcnQgMCAqLworI2RlZmluZSBBVDkxX1BBMTZfQ1RTMgkJKDEgPDwgMTYpCS8qIEI6IFVTQVJUMiBDbGVhciBUbyBTZW5kICovCisjZGVmaW5lIEFUOTFfUEExN19UUEsxCQkoMSA8PCAxNykJLyogQTogVHJhY2UgUGFja2V0IFBvcnQgMSAqLworI2RlZmluZSBBVDkxX1BBMTdfVEYxCQkoMSA8PCAxNykJLyogQjogU1NDMSBUcmFuc21pdCBGcmFtZSBTeW5jICovCisjZGVmaW5lIEFUOTFfUEExOF9UUEsyCQkoMSA8PCAxOCkJLyogQTogVHJhY2UgUGFja2V0IFBvcnQgMiAqLworI2RlZmluZSBBVDkxX1BBMThfVEsxCQkoMSA8PCAxOCkJLyogQjogU1NDMSBUcmFuc21pdCBDbG9jayAqLworI2RlZmluZSBBVDkxX1BBMTlfVFBLMwkJKDEgPDwgMTkpCS8qIEE6IFRyYWNlIFBhY2tldCBQb3J0IDMgKi8KKyNkZWZpbmUgQVQ5MV9QQTE5X1REMQkJKDEgPDwgMTkpCS8qIEI6IFNTQzEgVHJhbnNtaXQgRGF0YSAqLworI2RlZmluZSBBVDkxX1BBMjBfVFBLNAkJKDEgPDwgMjApCS8qIEE6IFRyYWNlIFBhY2tldCBQb3J0IDQgKi8KKyNkZWZpbmUgQVQ5MV9QQTIwX1JEMQkJKDEgPDwgMjApCS8qIEI6IFNTQzEgUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lIEFUOTFfUEEyMV9UUEs1CQkoMSA8PCAyMSkJLyogQTogVHJhY2UgUGFja2V0IFBvcnQgNSAqLworI2RlZmluZSBBVDkxX1BBMjFfUksxCQkoMSA8PCAyMSkJLyogQjogU1NDMSBSZWNlaXZlIENsb2NrICovCisjZGVmaW5lIEFUOTFfUEEyMl9UUEs2CQkoMSA8PCAyMikJLyogQTogVHJhY2UgUGFja2V0IFBvcnQgNiAqLworI2RlZmluZSBBVDkxX1BBMjJfUkYxCQkoMSA8PCAyMikJLyogQjogU1NDMSBSZWNlaXZlIEZyYW1lIFN5bmMgKi8KKyNkZWZpbmUgQVQ5MV9QQTIzX1RQSzcJCSgxIDw8IDIzKQkvKiBBOiBUcmFjZSBQYWNrZXQgUG9ydCA3ICovCisjZGVmaW5lIEFUOTFfUEEyM19SVFMwCQkoMSA8PCAyMykJLyogQjogVVNBUlQwIFJlYWR5IFRvIFNlbmQgKi8KKyNkZWZpbmUgQVQ5MV9QQTI0X1RQSzgJCSgxIDw8IDI0KQkvKiBBOiBUcmFjZSBQYWNrZXQgUG9ydCA4ICovCisjZGVmaW5lIEFUOTFfUEEyNF9TUEkxX05QQ1MxCSgxIDw8IDI0KQkvKiBCOiBTUEkxIFBlcmlwaGVyYWwgQ2hpcCBTZWxlY3QgMSAqLworI2RlZmluZSBBVDkxX1BBMjVfVFBLOQkJKDEgPDwgMjUpCS8qIEE6IFRyYWNlIFBhY2tldCBQb3J0IDkgKi8KKyNkZWZpbmUgQVQ5MV9QQTI1X1NQSTFfTlBDUzIJKDEgPDwgMjUpCS8qIEI6IFNQSTEgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAyICovCisjZGVmaW5lIEFUOTFfUEEyNl9UUEsxMAkJKDEgPDwgMjYpCS8qIEE6IFRyYWNlIFBhY2tldCBQb3J0IDEwICovCisjZGVmaW5lIEFUOTFfUEEyNl9TUEkxX05QQ1MzCSgxIDw8IDI2KQkvKiBCOiBTUEkxIFBlcmlwaGVyYWwgQ2hpcCBTZWxlY3QgMyAqLworI2RlZmluZSBBVDkxX1BBMjdfVFBLMTEJCSgxIDw8IDI3KQkvKiBBOiBUcmFjZSBQYWNrZXQgUG9ydCAxMSAqLworI2RlZmluZSBBVDkxX1BBMjdfU1BJMF9OUENTMQkoMSA8PCAyNykJLyogQjogU1BJMCBQZXJpcGhlcmFsIENoaXAgU2VsZWN0IDEgKi8KKyNkZWZpbmUgQVQ5MV9QQTI4X1RQSzEyCQkoMSA8PCAyOCkJLyogQTogVHJhY2UgUGFja2V0IFBvcnQgMTIgKi8KKyNkZWZpbmUgQVQ5MV9QQTI4X1NQSTBfTlBDUzIJKDEgPDwgMjgpCS8qIEI6IFNQSTAgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAyICovCisjZGVmaW5lIEFUOTFfUEEyOV9UUEsxMwkJKDEgPDwgMjkpCS8qIEE6IFRyYWNlIFBhY2tldCBQb3J0IDEzICovCisjZGVmaW5lIEFUOTFfUEEyOV9TUEkwX05QQ1MzCSgxIDw8IDI5KQkvKiBCOiBTUEkwIFBlcmlwaGVyYWwgQ2hpcCBTZWxlY3QgMyAqLworI2RlZmluZSBBVDkxX1BBMzBfVFBLMTQJCSgxIDw8IDMwKQkvKiBBOiBUcmFjZSBQYWNrZXQgUG9ydCAxNCAqLworI2RlZmluZSBBVDkxX1BBMzBfQTIzCQkoMSA8PCAzMCkJLyogQjogQWRkcmVzcyBCdXMgYml0IDIzICovCisjZGVmaW5lIEFUOTFfUEEzMV9UUEsxNQkJKDEgPDwgMzEpCS8qIEE6IFRyYWNlIFBhY2tldCBQb3J0IDE1ICovCisjZGVmaW5lIEFUOTFfUEEzMV9BMjQJCSgxIDw8IDMxKQkvKiBCOiBBZGRyZXNzIEJ1cyBiaXQgMjQgKi8KKworI2RlZmluZSBBVDkxX1BCMF9MQ0RWU1lOQwkoMSA8PCAgMCkJLyogQTogTENEIFZlcnRpY2FsIFN5bmNocm9uaXphdGlvbiAqLworI2RlZmluZSBBVDkxX1BCMV9MQ0RIU1lOQwkoMSA8PCAgMSkJLyogQTogTENEIEhvcml6b250YWwgU3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIEFUOTFfUEIyX0xDRERPVENLCSgxIDw8ICAyKQkvKiBBOiBMQ0QgRG90IENsb2NrICovCisjZGVmaW5lIEFUOTFfUEIyX1BDSzAJCSgxIDw8ICAyKQkvKiBCOiBQTUMgUHJvZ3JhbW1hYmxlIGNsb2NrIE91dHB1dCAwICovCisjZGVmaW5lIEFUOTFfUEIzX0xDRERFTgkJKDEgPDwgIDMpCS8qIEE6IExDRCBEYXRhIEVuYWJsZSAqLworI2RlZmluZSBBVDkxX1BCNF9MQ0RDQwkJKDEgPDwgIDQpCS8qIEE6IExDRCBDb250cmFzdCBDb250cm9sICovCisjZGVmaW5lIEFUOTFfUEI0X0xDREQyCQkoMSA8PCAgNCkJLyogQjogTENEIERhdGEgQnVzIEJpdCAyICovCisjZGVmaW5lIEFUOTFfUEI1X0xDREQwCQkoMSA8PCAgNSkJLyogQTogTENEIERhdGEgQnVzIEJpdCAwICovCisjZGVmaW5lIEFUOTFfUEI1X0xDREQzCQkoMSA8PCAgNSkJLyogQjogTENEIERhdGEgQnVzIEJpdCAzICovCisjZGVmaW5lIEFUOTFfUEI2X0xDREQxCQkoMSA8PCAgNikJLyogQTogTENEIERhdGEgQnVzIEJpdCAxICovCisjZGVmaW5lIEFUOTFfUEI2X0xDREQ0CQkoMSA8PCAgNikJLyogQjogTENEIERhdGEgQnVzIEJpdCA0ICovCisjZGVmaW5lIEFUOTFfUEI3X0xDREQyCQkoMSA8PCAgNykJLyogQTogTENEIERhdGEgQnVzIEJpdCAyICovCisjZGVmaW5lIEFUOTFfUEI3X0xDREQ1CQkoMSA8PCAgNykJLyogQjogTENEIERhdGEgQnVzIEJpdCA1ICovCisjZGVmaW5lIEFUOTFfUEI4X0xDREQzCQkoMSA8PCAgOCkJLyogQTogTENEIERhdGEgQnVzIEJpdCAzICovCisjZGVmaW5lIEFUOTFfUEI4X0xDREQ2CQkoMSA8PCAgOCkJLyogQjogTENEIERhdGEgQnVzIEJpdCA2ICovCisjZGVmaW5lIEFUOTFfUEI5X0xDREQ0CQkoMSA8PCAgOSkJLyogQTogTENEIERhdGEgQnVzIEJpdCA0ICovCisjZGVmaW5lIEFUOTFfUEI5X0xDREQ3CQkoMSA8PCAgOSkJLyogQjogTENEIERhdGEgQnVzIEJpdCA3ICovCisjZGVmaW5lIEFUOTFfUEIxMF9MQ0RENQkJKDEgPDwgMTApCS8qIEE6IExDRCBEYXRhIEJ1cyBCaXQgNSAqLworI2RlZmluZSBBVDkxX1BCMTBfTENERDEwCSgxIDw8IDEwKQkvKiBCOiBMQ0QgRGF0YSBCdXMgQml0IDEwICovCisjZGVmaW5lIEFUOTFfUEIxMV9MQ0RENgkJKDEgPDwgMTEpCS8qIEE6IExDRCBEYXRhIEJ1cyBCaXQgNiAqLworI2RlZmluZSBBVDkxX1BCMTFfTENERDExCSgxIDw8IDExKQkvKiBCOiBMQ0QgRGF0YSBCdXMgQml0IDExICovCisjZGVmaW5lIEFUOTFfUEIxMl9MQ0RENwkJKDEgPDwgMTIpCS8qIEE6IExDRCBEYXRhIEJ1cyBCaXQgNyAqLworI2RlZmluZSBBVDkxX1BCMTJfTENERDEyCSgxIDw8IDEyKQkvKiBCOiBMQ0QgRGF0YSBCdXMgQml0IDEyICovCisjZGVmaW5lIEFUOTFfUEIxM19MQ0REOAkJKDEgPDwgMTMpCS8qIEE6IExDRCBEYXRhIEJ1cyBCaXQgOCAqLworI2RlZmluZSBBVDkxX1BCMTNfTENERDEzCSgxIDw8IDEzKQkvKiBCOiBMQ0QgRGF0YSBCdXMgQml0IDEzICovCisjZGVmaW5lIEFUOTFfUEIxNF9MQ0REOQkJKDEgPDwgMTQpCS8qIEE6IExDRCBEYXRhIEJ1cyBCaXQgOSAqLworI2RlZmluZSBBVDkxX1BCMTRfTENERDE0CSgxIDw8IDE0KQkvKiBCOiBMQ0QgRGF0YSBCdXMgQml0IDE0ICovCisjZGVmaW5lIEFUOTFfUEIxNV9MQ0REMTAJKDEgPDwgMTUpCS8qIEE6IExDRCBEYXRhIEJ1cyBCaXQgMTAgKi8KKyNkZWZpbmUgQVQ5MV9QQjE1X0xDREQxNQkoMSA8PCAxNSkJLyogQjogTENEIERhdGEgQnVzIEJpdCAxNSAqLworI2RlZmluZSBBVDkxX1BCMTZfTENERDExCSgxIDw8IDE2KQkvKiBBOiBMQ0QgRGF0YSBCdXMgQml0IDExICovCisjZGVmaW5lIEFUOTFfUEIxNl9MQ0REMTkJKDEgPDwgMTYpCS8qIEI6IExDRCBEYXRhIEJ1cyBCaXQgMTkgKi8KKyNkZWZpbmUgQVQ5MV9QQjE3X0xDREQxMgkoMSA8PCAxNykJLyogQTogTENEIERhdGEgQnVzIEJpdCAxMiAqLworI2RlZmluZSBBVDkxX1BCMTdfTENERDIwCSgxIDw8IDE3KQkvKiBCOiBMQ0QgRGF0YSBCdXMgQml0IDIwICovCisjZGVmaW5lIEFUOTFfUEIxOF9MQ0REMTMJKDEgPDwgMTgpCS8qIEE6IExDRCBEYXRhIEJ1cyBCaXQgMTMgKi8KKyNkZWZpbmUgQVQ5MV9QQjE4X0xDREQyMQkoMSA8PCAxOCkJLyogQjogTENEIERhdGEgQnVzIEJpdCAyMSAqLworI2RlZmluZSBBVDkxX1BCMTlfTENERDE0CSgxIDw8IDE5KQkvKiBBOiBMQ0QgRGF0YSBCdXMgQml0IDE0ICovCisjZGVmaW5lIEFUOTFfUEIxOV9MQ0REMjIJKDEgPDwgMTkpCS8qIEI6IExDRCBEYXRhIEJ1cyBCaXQgMjIgKi8KKyNkZWZpbmUgQVQ5MV9QQjIwX0xDREQxNQkoMSA8PCAyMCkJLyogQTogTENEIERhdGEgQnVzIEJpdCAxNSAqLworI2RlZmluZSBBVDkxX1BCMjBfTENERDIzCSgxIDw8IDIwKQkvKiBCOiBMQ0QgRGF0YSBCdXMgQml0IDIzICovCisjZGVmaW5lIEFUOTFfUEIyMV9URjAJCSgxIDw8IDIxKQkvKiBBOiBTU0MwIFRyYW5zbWl0IEZyYW1lIFN5bmMgKi8KKyNkZWZpbmUgQVQ5MV9QQjIxX0xDREQxNgkoMSA8PCAyMSkJLyogQjogTENEIERhdGEgQnVzIEJpdCAxNiAqLworI2RlZmluZSBBVDkxX1BCMjJfVEswCQkoMSA8PCAyMikJLyogQTogU1NDMCBUcmFuc21pdCBDbG9jayAqLworI2RlZmluZSBBVDkxX1BCMjJfTENERDE3CSgxIDw8IDIyKQkvKiBCOiBMQ0QgRGF0YSBCdXMgQml0IDE3ICovCisjZGVmaW5lIEFUOTFfUEIyM19URDAJCSgxIDw8IDIzKQkvKiBBOiBTU0MwIFRyYW5zbWl0IERhdGEgKi8KKyNkZWZpbmUgQVQ5MV9QQjIzX0xDREQxOAkoMSA8PCAyMykJLyogQjogTENEIERhdGEgQnVzIEJpdCAxOCAqLworI2RlZmluZSBBVDkxX1BCMjRfUkQwCQkoMSA8PCAyNCkJLyogQTogU1NDMCBSZWNlaXZlIERhdGEgKi8KKyNkZWZpbmUgQVQ5MV9QQjI0X0xDREQxOQkoMSA8PCAyNCkJLyogQjogTENEIERhdGEgQnVzIEJpdCAxOSAqLworI2RlZmluZSBBVDkxX1BCMjVfUkswCQkoMSA8PCAyNSkJLyogQTogU1NDMCBSZWNlaXZlIENsb2NrICovCisjZGVmaW5lIEFUOTFfUEIyNV9MQ0REMjAJKDEgPDwgMjUpCS8qIEI6IExDRCBEYXRhIEJ1cyBCaXQgMjAgKi8KKyNkZWZpbmUgQVQ5MV9QQjI2X1JGMAkJKDEgPDwgMjYpCS8qIEE6IFNTQzAgUmVjZWl2ZSBGcmFtZSBTeW5jICovCisjZGVmaW5lIEFUOTFfUEIyNl9MQ0REMjEJKDEgPDwgMjYpCS8qIEI6IExDRCBEYXRhIEJ1cyBCaXQgMjEgKi8KKyNkZWZpbmUgQVQ5MV9QQjI3X1NQSTFfTlBDUzEJKDEgPDwgMjcpCS8qIEE6IFNQSTEgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAxICovCisjZGVmaW5lIEFUOTFfUEIyN19MQ0REMjIJKDEgPDwgMjcpCS8qIEI6IExDRCBEYXRhIEJ1cyBCaXQgMjIgKi8KKyNkZWZpbmUgQVQ5MV9QQjI4X1NQSTFfTlBDUzAJKDEgPDwgMjgpCS8qIEE6IFNQSTEgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAwICovCisjZGVmaW5lIEFUOTFfUEIyOF9MQ0REMjMJKDEgPDwgMjgpCS8qIEI6IExDRCBEYXRhIEJ1cyBCaXQgMjMgKi8KKyNkZWZpbmUgQVQ5MV9QQjI5X1NQSTFfU1BDSwkoMSA8PCAyOSkJLyogQTogU1BJMSBTZXJpYWwgQ2xvY2sgKi8KKyNkZWZpbmUgQVQ5MV9QQjI5X0lSUTIJCSgxIDw8IDI5KQkvKiBCOiBJbnRlcnJ1cHQgaW5wdXQgMiAqLworI2RlZmluZSBBVDkxX1BCMzBfU1BJMV9NSVNPCSgxIDw8IDMwKQkvKiBBOiBTUEkxIE1hc3RlciBJbiBTbGF2ZSAqLworI2RlZmluZSBBVDkxX1BCMzBfSVJRMQkJKDEgPDwgMzApCS8qIEI6IEludGVycnVwdCBpbnB1dCAxICovCisjZGVmaW5lIEFUOTFfUEIzMV9TUEkxX01PU0kJKDEgPDwgMzEpCS8qIEE6IFNQSTEgTWFzdGVyIE91dCBTbGF2ZSAqLworI2RlZmluZSBBVDkxX1BCMzFfUENLMgkJKDEgPDwgMzEpCS8qIEI6IFBNQyBQcm9ncmFtbWFibGUgY2xvY2sgT3V0cHV0IDIgKi8KKworI2RlZmluZSBBVDkxX1BDMF9TTU9FCQkoMSA8PCAwKQkvKiBBOiBTbWFydE1lZGlhIE91dHB1dCBFbmFibGUgKi8KKyNkZWZpbmUgQVQ5MV9QQzBfTkNTNgkJKDEgPDwgMCkJLyogQjogQ2hpcCBTZWxlY3QgNiAqLworI2RlZmluZSBBVDkxX1BDMV9TTVdFCQkoMSA8PCAxKQkvKiBBOiBTbWFydE1lZGlhIFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBBVDkxX1BDMV9OQ1M3CQkoMSA8PCAxKQkvKiBCOiBDaGlwIFNlbGVjdCA3ICovCisjZGVmaW5lIEFUOTFfUEMyX05XQUlUCQkoMSA8PCAyKQkvKiBBOiBOV0FJVCAqLworI2RlZmluZSBBVDkxX1BDMl9JUlEwCQkoMSA8PCAyKQkvKiBCOiBJbnRlcnJ1cHQgaW5wdXQgMCAqLworI2RlZmluZSBBVDkxX1BDM19BMjVfQ0ZSTlcJKDEgPDwgMykJLyogQTogQWRkcmVzcyBCdXNbMjVdIC8gQ29tcGFjdCBGbGFzaCBSZWFkIE5vdCBXcml0ZSAqLworI2RlZmluZSBBVDkxX1BDNF9OQ1M0X0NGQ1MwCSgxIDw8IDQpCS8qIEE6IENoaXAgU2VsZWN0IDQgLyBDb21wYWN0Rmxhc2ggQ2hpcCBTZWxlY3QgMCAqLworI2RlZmluZSBBVDkxX1BDNV9OQ1M1X0NGQ1MxCSgxIDw8IDUpCS8qIEE6IENoaXAgU2VsZWN0IDUgLyBDb21wYWN0Rmxhc2ggQ2hpcCBTZWxlY3QgMSAqLworI2RlZmluZSBBVDkxX1BDNl9DRkNFMQkJKDEgPDwgNikJLyogQTogQ29tcGFjdEZsYXNoIENoaXAgRW5hYmxlIDEgKi8KKyNkZWZpbmUgQVQ5MV9QQzdfQ0ZDRTIJCSgxIDw8IDcpCS8qIEE6IENvbXBhY3RGbGFzaCBDaGlwIEVuYWJsZSAyICovCisjZGVmaW5lIEFUOTFfUEM4X1RYRDAJCSgxIDw8IDgpCS8qIEE6IFVTQVJUMCBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIEFUOTFfUEM4X1BDSzIJCSgxIDw8IDgpCS8qIEI6IFBNQyBQcm9ncmFtbWFibGUgY2xvY2sgT3V0cHV0IDIgKi8KKyNkZWZpbmUgQVQ5MV9QQzlfUlhEMAkJKDEgPDwgOSkJLyogQTogVVNBUlQwIFJlY2VpdmUgRGF0YSAqLworI2RlZmluZSBBVDkxX1BDOV9QQ0szCQkoMSA8PCA5KQkvKiBCOiBQTUMgUHJvZ3JhbW1hYmxlIGNsb2NrIE91dHB1dCAzICovCisjZGVmaW5lIEFUOTFfUEMxMF9SVFMwCQkoMSA8PCAxMCkJLyogQTogVVNBUlQwIFJlYWR5IFRvIFNlbmQgKi8KKyNkZWZpbmUgQVQ5MV9QQzEwX1NDSzAJCSgxIDw8IDEwKQkvKiBCOiBVU0FSVDAgU2VyaWFsIENsb2NrICovCisjZGVmaW5lIEFUOTFfUEMxMV9DVFMwCQkoMSA8PCAxMSkJLyogQTogVVNBUlQwIENsZWFyIFRvIFNlbmQgKi8KKyNkZWZpbmUgQVQ5MV9QQzExX0ZJUQkJKDEgPDwgMTEpCS8qIEI6IEFJQyBGYXN0IEludGVycnVwdCBJbnB1dCAqLworI2RlZmluZSBBVDkxX1BDMTJfVFhEMQkJKDEgPDwgMTIpCS8qIEE6IFVTQVJUMSBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIEFUOTFfUEMxMl9OQ1M2CQkoMSA8PCAxMikJLyogQjogQ2hpcCBTZWxlY3QgNiAqLworI2RlZmluZSBBVDkxX1BDMTNfUlhEMQkJKDEgPDwgMTMpCS8qIEE6IFVTQVJUMSBSZWNlaXZlIERhdGEgKi8KKyNkZWZpbmUgQVQ5MV9QQzEzX05DUzcJCSgxIDw8IDEzKQkvKiBCOiBDaGlwIFNlbGVjdCA3ICovCisjZGVmaW5lIEFUOTFfUEMxNF9UWEQyCQkoMSA8PCAxNCkJLyogQTogVVNBUlQyIFRyYW5zbWl0IERhdGEgKi8KKyNkZWZpbmUgQVQ5MV9QQzE0X1NQSTFfTlBDUzIJKDEgPDwgMTQpCS8qIEI6IFNQSTEgUGVyaXBoZXJhbCBDaGlwIFNlbGVjdCAyICovCisjZGVmaW5lIEFUOTFfUEMxNV9SWEQyCQkoMSA8PCAxNSkJLyogQTogVVNBUlQyIFJlY2VpdmUgRGF0YSAqLworI2RlZmluZSBBVDkxX1BDMTVfU1BJMV9OUENTMwkoMSA8PCAxNSkJLyogQjogU1BJMSBQZXJpcGhlcmFsIENoaXAgU2VsZWN0IDMgKi8KKyNkZWZpbmUgQVQ5MV9QQzE2X0QxNgkJKDEgPDwgMTYpCS8qIEE6IERhdGEgQnVzIFsxNl0gKi8KKyNkZWZpbmUgQVQ5MV9QQzE2X1RDTEswCQkoMSA8PCAxNikJLyogQjogVGltZXIgQ291bnRlciAwIGV4dGVybmFsIGNsb2NrIGlucHV0ICovCisjZGVmaW5lIEFUOTFfUEMxN19EMTcJCSgxIDw8IDE3KQkvKiBBOiBEYXRhIEJ1cyBbMTddICovCisjZGVmaW5lIEFUOTFfUEMxN19UQ0xLMQkJKDEgPDwgMTcpCS8qIEI6IFRpbWVyIENvdW50ZXIgMSBleHRlcm5hbCBjbG9jayBpbnB1dCAqLworI2RlZmluZSBBVDkxX1BDMThfRDE4CQkoMSA8PCAxOCkJLyogQTogRGF0YSBCdXMgWzE4XSAqLworI2RlZmluZSBBVDkxX1BDMThfVENMSzIJCSgxIDw8IDE4KQkvKiBCOiBUaW1lciBDb3VudGVyIDIgZXh0ZXJuYWwgY2xvY2sgaW5wdXQgKi8KKyNkZWZpbmUgQVQ5MV9QQzE5X0QxOQkJKDEgPDwgMTkpCS8qIEE6IERhdGEgQnVzIFsxOV0gKi8KKyNkZWZpbmUgQVQ5MV9QQzE5X1RJT0EwCQkoMSA8PCAxOSkJLyogQjogVGltZXIgQ291bnRlciAwIE11bHRpcHVycG9zZSBUaW1lciBJL08gUGluIEEgKi8KKyNkZWZpbmUgQVQ5MV9QQzIwX0QyMAkJKDEgPDwgMjApCS8qIEE6IERhdGEgQnVzIFsyMF0gKi8KKyNkZWZpbmUgQVQ5MV9QQzIwX1RJT0IwCQkoMSA8PCAyMCkJLyogQjogVGltZXIgQ291bnRlciAwIE11bHRpcHVycG9zZSBUaW1lciBJL08gUGluIEIgKi8KKyNkZWZpbmUgQVQ5MV9QQzIxX0QyMQkJKDEgPDwgMjEpCS8qIEE6IERhdGEgQnVzIFsyMV0gKi8KKyNkZWZpbmUgQVQ5MV9QQzIxX1RJT0ExCQkoMSA8PCAyMSkJLyogQjogVGltZXIgQ291bnRlciAxIE11bHRpcHVycG9zZSBUaW1lciBJL08gUGluIEEgKi8KKyNkZWZpbmUgQVQ5MV9QQzIyX0QyMgkJKDEgPDwgMjIpCS8qIEE6IERhdGEgQnVzIFsyMl0gKi8KKyNkZWZpbmUgQVQ5MV9QQzIyX1RJT0IxCQkoMSA8PCAyMikJLyogQjogVGltZXIgQ291bnRlciAxIE11bHRpcHVycG9zZSBUaW1lciBJL08gUGluIEIgKi8KKyNkZWZpbmUgQVQ5MV9QQzIzX0QyMwkJKDEgPDwgMjMpCS8qIEE6IERhdGEgQnVzIFsyM10gKi8KKyNkZWZpbmUgQVQ5MV9QQzIzX1RJT0EyCQkoMSA8PCAyMykJLyogQjogVGltZXIgQ291bnRlciAyIE11bHRpcHVycG9zZSBUaW1lciBJL08gUGluIEEgKi8KKyNkZWZpbmUgQVQ5MV9QQzI0X0QyNAkJKDEgPDwgMjQpCS8qIEE6IERhdGEgQnVzIFsyNF0gKi8KKyNkZWZpbmUgQVQ5MV9QQzI0X1RJT0IyCQkoMSA8PCAyNCkJLyogQjogVGltZXIgQ291bnRlciAyIE11bHRpcHVycG9zZSBUaW1lciBJL08gUGluIEIgKi8KKyNkZWZpbmUgQVQ5MV9QQzI1X0QyNQkJKDEgPDwgMjUpCS8qIEE6IERhdGEgQnVzIFsyNV0gKi8KKyNkZWZpbmUgQVQ5MV9QQzI1X1RGMgkJKDEgPDwgMjUpCS8qIEI6IFNTQzIgVHJhbnNtaXQgRnJhbWUgU3luYyAqLworI2RlZmluZSBBVDkxX1BDMjZfRDI2CQkoMSA8PCAyNikJLyogQTogRGF0YSBCdXMgWzI2XSAqLworI2RlZmluZSBBVDkxX1BDMjZfVEsyCQkoMSA8PCAyNikJLyogQjogU1NDMiBUcmFuc21pdCBDbG9jayAqLworI2RlZmluZSBBVDkxX1BDMjdfRDI3CQkoMSA8PCAyNykJLyogQTogRGF0YSBCdXMgWzI3XSAqLworI2RlZmluZSBBVDkxX1BDMjdfVEQyCQkoMSA8PCAyNykJLyogQjogU1NDMiBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIEFUOTFfUEMyOF9EMjgJCSgxIDw8IDI4KQkvKiBBOiBEYXRhIEJ1cyBbMjhdICovCisjZGVmaW5lIEFUOTFfUEMyOF9SRDIJCSgxIDw8IDI4KQkvKiBCOiBTU0MyIFJlY2VpdmUgRGF0YSAqLworI2RlZmluZSBBVDkxX1BDMjlfRDI5CQkoMSA8PCAyOSkJLyogQTogRGF0YSBCdXMgWzI5XSAqLworI2RlZmluZSBBVDkxX1BDMjlfUksyCQkoMSA8PCAyOSkJLyogQjogU1NDMiBSZWNlaXZlIENsb2NrICovCisjZGVmaW5lIEFUOTFfUEMzMF9EMzAJCSgxIDw8IDMwKQkvKiBBOiBEYXRhIEJ1cyBbMzBdICovCisjZGVmaW5lIEFUOTFfUEMzMF9SRjIJCSgxIDw8IDMwKQkvKiBCOiBTU0MyIFJlY2VpdmUgRnJhbWUgU3luYyAqLworI2RlZmluZSBBVDkxX1BDMzFfRDMxCQkoMSA8PCAzMSkJLyogQTogRGF0YSBCdXMgWzMxXSAqLworI2RlZmluZSBBVDkxX1BDMzFfUENLMQkJKDEgPDwgMzEpCS8qIEI6IFBNQyBQcm9ncmFtbWFibGUgY2xvY2sgT3V0cHV0IDEgKi8KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYXQ5MXNhbTkyNjFfbWF0cml4LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYxX21hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MGE1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYxX21hdHJpeC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjYxX21hdHJpeC5oCisgKgorICogTWVtb3J5IENvbnRyb2xsZXJzIChNQVRSSVgsIEVCSSkgLSBTeXN0ZW0gcGVyaXBoZXJhbHMgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVNBTTkyNjEgZGF0YXNoZWV0IHJldmlzaW9uIEQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFUOTFTQU05MjYxX01BVFJJWF9ICisjZGVmaW5lIEFUOTFTQU05MjYxX01BVFJJWF9ICisKKyNkZWZpbmUgQVQ5MV9NQVRSSVhfTUNGRwkoQVQ5MV9NQVRSSVggKyAweDAwKQkvKiBNYXN0ZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9NQVRSSVhfUkNCMAkoMSA8PCAwKQkJLyogUmVtYXAgQ29tbWFuZCBmb3IgQUhCIE1hc3RlciAwIChBUk05MjZFSi1TIEluc3RydWN0aW9uIE1hc3RlcikgKi8KKyNkZWZpbmUJCUFUMDFfTUFUUklYX1JDQjEJKDEgPDwgMSkJCS8qIFJlbWFwIENvbW1hbmQgZm9yIEFIQiBNYXN0ZXIgMSAoQVJNOTI2RUotUyBEYXRhIE1hc3RlcikgKi8KKworI2RlZmluZSBBVDkxX01BVFJJWF9TQ0ZHMAkoQVQ5MV9NQVRSSVggKyAweDA0KQkvKiBTbGF2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgQVQ5MV9NQVRSSVhfU0NGRzEJKEFUOTFfTUFUUklYICsgMHgwOCkJLyogU2xhdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lIEFUOTFfTUFUUklYX1NDRkcyCShBVDkxX01BVFJJWCArIDB4MEMpCS8qIFNsYXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBBVDkxX01BVFJJWF9TQ0ZHMwkoQVQ5MV9NQVRSSVggKyAweDEwKQkvKiBTbGF2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgQVQ5MV9NQVRSSVhfU0NGRzQJKEFUOTFfTUFUUklYICsgMHgxNCkJLyogU2xhdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciA0ICovCisjZGVmaW5lCQlBVDkxX01BVFJJWF9TTE9UX0NZQ0xFCQkoMHhmZiA8PCAwKQkvKiBNYXhpbXVtIE51bWJlciBvZiBBbGxvd2VkIEN5Y2xlcyBmb3IgYSBCdXJzdCAqLworI2RlZmluZQkJQVQ5MV9NQVRSSVhfREVGTVNUUl9UWVBFCSgzICAgIDw8IDE2KQkvKiBEZWZhdWx0IE1hc3RlciBUeXBlICovCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfREVGTVNUUl9UWVBFX05PTkUJKDAgPDwgMTYpCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfREVGTVNUUl9UWVBFX0xBU1QJKDEgPDwgMTYpCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfREVGTVNUUl9UWVBFX0ZJWEVECSgyIDw8IDE2KQorI2RlZmluZQkJQVQ5MV9NQVRSSVhfRklYRURfREVGTVNUUgkoNyAgICA8PCAxOCkJLyogRml4ZWQgSW5kZXggb2YgRGVmYXVsdCBNYXN0ZXIgKi8KKworI2RlZmluZSBBVDkxX01BVFJJWF9UQ1IJCShBVDkxX01BVFJJWCArIDB4MjQpCS8qIFRDTSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX01BVFJJWF9JVENNX1NJWkUJCSgweGYgPDwgMCkJLyogU2l6ZSBvZiBJVENNIGVuYWJsZWQgbWVtb3J5IGJsb2NrICovCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfSVRDTV8wCQkoMCA8PCAwKQorI2RlZmluZQkJCUFUOTFfTUFUUklYX0lUQ01fMTYJCSg1IDw8IDApCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfSVRDTV8zMgkJKDYgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9JVENNXzY0CQkoNyA8PCAwKQorI2RlZmluZQkJQVQ5MV9NQVRSSVhfRFRDTV9TSVpFCQkoMHhmIDw8IDQpCS8qIFNpemUgb2YgRFRDTSBlbmFibGVkIG1lbW9yeSBibG9jayAqLworI2RlZmluZQkJCUFUOTFfTUFUUklYX0RUQ01fMAkJKDAgPDwgNCkKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9EVENNXzE2CQkoNSA8PCA0KQorI2RlZmluZQkJCUFUOTFfTUFUUklYX0RUQ01fMzIJCSg2IDw8IDQpCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfRFRDTV82NAkJKDcgPDwgNCkKKworI2RlZmluZSBBVDkxX01BVFJJWF9FQklDU0EJKEFUOTFfTUFUUklYICsgMHgzMCkJLyogRUJJIENoaXAgU2VsZWN0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfTUFUUklYX0NTMUEJCSgxIDw8IDEpCS8qIENoaXAgU2VsZWN0IDEgQXNzaWdubWVudCAqLworI2RlZmluZSAJCUFUOTFfTUFUUklYX0NTMUFfU01DCQkoMCA8PCAxKQorI2RlZmluZSAJCUFUOTFfTUFUUklYX0NTMUFfU0RSQU1DCQkoMSA8PCAxKQorI2RlZmluZQkJQVQ5MV9NQVRSSVhfQ1MzQQkJKDEgPDwgMykJLyogQ2hpcCBTZWxlY3QgMyBBc3NpZ25tZW50ICovCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfQ1MzQV9TTUMJCSgwIDw8IDMpCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfQ1MzQV9TTUNfU01BUlRNRURJQQkoMSA8PCAzKQorI2RlZmluZQkJQVQ5MV9NQVRSSVhfQ1M0QQkJKDEgPDwgNCkJLyogQ2hpcCBTZWxlY3QgNCBBc3NpZ25tZW50ICovCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfQ1M0QV9TTUMJCSgwIDw8IDQpCisjZGVmaW5lCQkJQVQ5MV9NQVRSSVhfQ1M0QV9TTUNfQ0YxCSgxIDw8IDQpCisjZGVmaW5lCQlBVDkxX01BVFJJWF9DUzVBCQkoMSA8PCA1KQkvKiBDaGlwIFNlbGVjdCA1IEFzc2lnbm1lbnQgKi8KKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9DUzVBX1NNQwkJKDAgPDwgNSkKKyNkZWZpbmUJCQlBVDkxX01BVFJJWF9DUzVBX1NNQ19DRjIJKDEgPDwgNSkKKyNkZWZpbmUJCUFUOTFfTUFUUklYX0RCUFVDCQkoMSA8PCA4KQkvKiBEYXRhIEJ1cyBQdWxsLXVwIENvbmZpZ3VyYXRpb24gKi8KKworI2RlZmluZSBBVDkxX01BVFJJWF9VU0JQVUNSCShBVDkxX01BVFJJWCArIDB4MzQpCS8qIFVTQiBQYWQgUHVsbC1VcCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX01BVFJJWF9VU0JQVUNSX1BVT04JKDEgPDwgMzApCS8qIFVTQiBEZXZpY2UgUEFEIFB1bGwtdXAgRW5hYmxlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2eF9tYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxc2FtOTI2eF9tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTQ5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjZ4X21jLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2F0OTFzYW05MjZ4X21jLmgKKyAqCisgKiBNZW1vcnkgQ29udHJvbGxlcnMgKFNNQywgU0RSQU1DKSAtIFN5c3RlbSBwZXJpcGhlcmFscyByZWdpc3RlcnMuCisgKiBCYXNlZCBvbiBBVDkxU0FNOTI2MSBkYXRhc2hlZXQgcmV2aXNpb24gRC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MVNBTTkyNnhfTUNfSAorI2RlZmluZSBBVDkxU0FNOTI2eF9NQ19ICisKKy8qIFNEUkFNIENvbnRyb2xsZXIgKFNEUkFNQykgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFUOTFfU0RSQU1DX01SCQkoQVQ5MV9TRFJBTUMgKyAweDAwKQkvKiBTRFJBTSBDb250cm9sbGVyIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX01PREUJKDB4ZiA8PCAwKQkJLyogQ29tbWFuZCBNb2RlICovCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTU9ERV9OT1JNQUwJCTAKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX05PUAkJMQorI2RlZmluZQkJCUFUOTFfU0RSQU1DX01PREVfUFJFQ0hBUkdFCTIKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX0xNUgkJMworI2RlZmluZQkJCUFUOTFfU0RSQU1DX01PREVfUkVGUkVTSAk0CisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTU9ERV9FWFRfTE1SCTUKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NT0RFX0RFRVAJCTYKKworI2RlZmluZSBBVDkxX1NEUkFNQ19UUgkJKEFUOTFfU0RSQU1DICsgMHgwNCkJLyogU0RSQU0gQ29udHJvbGxlciBSZWZyZXNoIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19DT1VOVAkoMHhmZmYgPDwgMCkJCS8qIFJlZnJlc2ggVGltZXIgQ291bnRlciAqLworCisjZGVmaW5lIEFUOTFfU0RSQU1DX0NSCQkoQVQ5MV9TRFJBTUMgKyAweDA4KQkvKiBTRFJBTSBDb250cm9sbGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX05DCQkoMyA8PCAwKQkJLyogTnVtYmVyIG9mIENvbHVtbiBCaXRzICovCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTkNfOAkoMCA8PCAwKQorI2RlZmluZQkJCUFUOTFfU0RSQU1DX05DXzkJKDEgPDwgMCkKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OQ18xMAkoMiA8PCAwKQorI2RlZmluZQkJCUFUOTFfU0RSQU1DX05DXzExCSgzIDw8IDApCisjZGVmaW5lIAlBVDkxX1NEUkFNQ19OUgkJKDMgPDwgMikJCS8qIE51bWJlciBvZiBSb3cgQml0cyAqLworI2RlZmluZQkJCUFUOTFfU0RSQU1DX05SXzExCSgwIDw8IDIpCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTlJfMTIJKDEgPDwgMikKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OUl8xMwkoMiA8PCAyKQorI2RlZmluZSAJQVQ5MV9TRFJBTUNfTkIJCSgxIDw8IDQpCQkvKiBOdW1iZXIgb2YgQmFua3MgKi8KKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19OQl8yCSgwIDw8IDQpCisjZGVmaW5lIAkJQVQ5MV9TRFJBTUNfTkJfNAkoMSA8PCA0KQorI2RlZmluZSAJQVQ5MV9TRFJBTUNfQ0FTCQkoMyA8PCA1KQkJLyogQ0FTIExhdGVuY3kgKi8KKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19DQVNfMQkoMSA8PCA1KQorI2RlZmluZQkJCUFUOTFfU0RSQU1DX0NBU18yCSgyIDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfQ0FTXzMJKDMgPDwgNSkKKyNkZWZpbmUJCUFUOTFfU0RSQU1DX0RCVwkJKDEgPDwgNykJCS8qIERhdGEgQnVzIFdpZHRoICovCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfREJXXzMyCSgwIDw8IDcpCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfREJXXzE2CSgxIDw8IDcpCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19UV1IJCSgweGYgPDwgIDgpCQkvKiBXcml0ZSBSZWNvdmVyeSBEZWxheSAqLworI2RlZmluZQkJQVQ5MV9TRFJBTUNfVFJDCQkoMHhmIDw8IDEyKQkJLyogUm93IEN5Y2xlIERlbGF5ICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19UUlAJCSgweGYgPDwgMTYpCQkvKiBSb3cgUHJlY2hhcmdlIERlbGF5ICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19UUkNECSgweGYgPDwgMjApCQkvKiBSb3cgdG8gQ29sdW1uIERlbGF5ICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19UUkFTCSgweGYgPDwgMjQpCQkvKiBBY3RpdmUgdG8gUHJlY2hhcmdlIERlbGF5ICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19UWFNSCSgweGYgPDwgMjgpCQkvKiBFeGl0IFNlbGYgUmVmcmVzaCB0byBBY3RpdmUgRGVsYXkgKi8KKworI2RlZmluZSBBVDkxX1NEUkFNQ19MUFIJCShBVDkxX1NEUkFNQyArIDB4MTApCS8qIFNEUkFNIENvbnRyb2xsZXIgTG93IFBvd2VyIFJlZ2lzdGVyICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19MUENCCQkoMyA8PCAwKQkvKiBMb3ctcG93ZXIgQ29uZmlndXJhdGlvbnMgKi8KKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19MUENCX0RJU0FCTEUJCTAKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19MUENCX1NFTEZfUkVGUkVTSAkJMQorI2RlZmluZQkJCUFUOTFfU0RSQU1DX0xQQ0JfUE9XRVJfRE9XTgkJMgorI2RlZmluZQkJCUFUOTFfU0RSQU1DX0xQQ0JfREVFUF9QT1dFUl9ET1dOCTMKKyNkZWZpbmUJCUFUOTFfU0RSQU1DX1BBU1IJCSg3IDw8IDQpCS8qIFBhcnRpYWwgQXJyYXkgU2VsZiBSZWZyZXNoICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19UQ1NSCQkoMyA8PCA4KQkvKiBUZW1wZXJhdHVyZSBDb21wZW5zYXRlZCBTZWxmIFJlZnJlc2ggKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX0RTCQkJKDMgPDwgMTApCS8qIERyaXZlIFN0cmVuZ2h0ICovCisjZGVmaW5lCQlBVDkxX1NEUkFNQ19USU1FT1VUCQkoMyA8PCAxMikJLyogVGltZSB0byBkZWZpbmUgd2hlbiBMb3cgUG93ZXIgTW9kZSBpcyBlbmFibGVkICovCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfVElNRU9VVF8wX0NMS19DWUNMRVMJKDAgPDwgMTIpCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfVElNRU9VVF82NF9DTEtfQ1lDTEVTCSgxIDw8IDEyKQorI2RlZmluZQkJCUFUOTFfU0RSQU1DX1RJTUVPVVRfMTI4X0NMS19DWUNMRVMJKDIgPDwgMTIpCisKKyNkZWZpbmUgQVQ5MV9TRFJBTUNfSUVSCQkoQVQ5MV9TRFJBTUMgKyAweDE0KQkvKiBTRFJBTSBDb250cm9sbGVyIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TRFJBTUNfSURSCQkoQVQ5MV9TRFJBTUMgKyAweDE4KQkvKiBTRFJBTSBDb250cm9sbGVyIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfU0RSQU1DX0lNUgkJKEFUOTFfU0RSQU1DICsgMHgxQykJLyogU0RSQU0gQ29udHJvbGxlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NEUkFNQ19JU1IJCShBVDkxX1NEUkFNQyArIDB4MjApCS8qIFNEUkFNIENvbnRyb2xsZXIgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9TRFJBTUNfUkVTCQkoMSA8PCAwKQkJLyogUmVmcmVzaCBFcnJvciBTdGF0dXMgKi8KKworI2RlZmluZSBBVDkxX1NEUkFNQ19NRFIJCShBVDkxX1NEUkFNQyArIDB4MjQpCS8qIFNEUkFNIE1lbW9yeSBEZXZpY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUFUOTFfU0RSQU1DX01ECQkoMyA8PCAwKQkJLyogTWVtb3J5IERldmljZSBUeXBlICovCisjZGVmaW5lCQkJQVQ5MV9TRFJBTUNfTURfU0RSQU0JCTAKKyNkZWZpbmUJCQlBVDkxX1NEUkFNQ19NRF9MT1dfUE9XRVJfU0RSQU0JMQorCisKKy8qIFN0YXRpYyBNZW1vcnkgQ29udHJvbGxlciAoU01DKSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVQ5MV9TTUNfU0VUVVAobikJKEFUOTFfU01DICsgMHgwMCArICgobikqMHgxMCkpCS8qIFNldHVwIFJlZ2lzdGVyIGZvciBDUyBuICovCisjZGVmaW5lCQlBVDkxX1NNQ19OV0VTRVRVUAkoMHgzZiA8PCAwKQkJCS8qIE5XRSBTZXR1cCBMZW5ndGggKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19OV0VTRVRVUF8oeCkJKCh4KSA8PCAwKQorI2RlZmluZQkJQVQ5MV9TTUNfTkNTX1dSU0VUVVAJKDB4M2YgPDwgOCkJCQkvKiBOQ1MgU2V0dXAgTGVuZ3RoIGluIFdyaXRlIEFjY2VzcyAqLworI2RlZmluZQkJCUFUOTFfU01DX05DU19XUlNFVFVQXyh4KQkoKHgpIDw8IDgpCisjZGVmaW5lCQlBVDkxX1NNQ19OUkRTRVRVUAkoMHgzZiA8PCAxNikJCQkvKiBOUkQgU2V0dXAgTGVuZ3RoICovCisjZGVmaW5lCQkJQVQ5MV9TTUNfTlJEU0VUVVBfKHgpCSgoeCkgPDwgMTYpCisjZGVmaW5lCQlBVDkxX1NNQ19OQ1NfUkRTRVRVUAkoMHgzZiA8PCAyNCkJCQkvKiBOQ1MgU2V0dXAgTGVuZ3RoIGluIFJlYWQgQWNjZXNzICovCisjZGVmaW5lCQkJQVQ5MV9TTUNfTkNTX1JEU0VUVVBfKHgpCSgoeCkgPDwgMjQpCisKKyNkZWZpbmUgQVQ5MV9TTUNfUFVMU0UobikJKEFUOTFfU01DICsgMHgwNCArICgobikqMHgxMCkpCS8qIFB1bHNlIFJlZ2lzdGVyIGZvciBDUyBuICovCisjZGVmaW5lCQlBVDkxX1NNQ19OV0VQVUxTRQkoMHg3ZiA8PCAgMCkJCQkvKiBOV0UgUHVsc2UgTGVuZ3RoICovCisjZGVmaW5lCQkJQVQ5MV9TTUNfTldFUFVMU0VfKHgpCSgoeCkgPDwgMCkKKyNkZWZpbmUJCUFUOTFfU01DX05DU19XUlBVTFNFCSgweDdmIDw8ICA4KQkJCS8qIE5DUyBQdWxzZSBMZW5ndGggaW4gV3JpdGUgQWNjZXNzICovCisjZGVmaW5lCQkJQVQ5MV9TTUNfTkNTX1dSUFVMU0VfKHgpKCh4KSA8PCA4KQorI2RlZmluZQkJQVQ5MV9TTUNfTlJEUFVMU0UJKDB4N2YgPDwgMTYpCQkJLyogTlJEIFB1bHNlIExlbmd0aCAqLworI2RlZmluZQkJCUFUOTFfU01DX05SRFBVTFNFXyh4KQkoKHgpIDw8IDE2KQorI2RlZmluZQkJQVQ5MV9TTUNfTkNTX1JEUFVMU0UJKDB4N2YgPDwgMjQpCQkJLyogTkNTIFB1bHNlIExlbmd0aCBpbiBSZWFkIEFjY2VzcyAqLworI2RlZmluZQkJCUFUOTFfU01DX05DU19SRFBVTFNFXyh4KSgoeCkgPDwgMjQpCisKKyNkZWZpbmUgQVQ5MV9TTUNfQ1lDTEUobikJKEFUOTFfU01DICsgMHgwOCArICgobikqMHgxMCkpCS8qIEN5Y2xlIFJlZ2lzdGVyIGZvciBDUyBuICovCisjZGVmaW5lCQlBVDkxX1NNQ19OV0VDWUNMRQkoMHgxZmYgPDwgMCApCQkJLyogVG90YWwgV3JpdGUgQ3ljbGUgTGVuZ3RoICovCisjZGVmaW5lCQkJQVQ5MV9TTUNfTldFQ1lDTEVfKHgpCSgoeCkgPDwgMCkKKyNkZWZpbmUJCUFUOTFfU01DX05SRENZQ0xFCSgweDFmZiA8PCAxNikJCQkvKiBUb3RhbCBSZWFkIEN5Y2xlIExlbmd0aCAqLworI2RlZmluZQkJCUFUOTFfU01DX05SRENZQ0xFXyh4KQkoKHgpIDw8IDE2KQorCisjZGVmaW5lIEFUOTFfU01DX01PREUobikJKEFUOTFfU01DICsgMHgwYyArICgobikqMHgxMCkpCS8qIE1vZGUgUmVnaXN0ZXIgZm9yIENTIG4gKi8KKyNkZWZpbmUJCUFUOTFfU01DX1JFQURNT0RFCSgxIDw8ICAwKQkJCS8qIFJlYWQgTW9kZSAqLworI2RlZmluZQkJQVQ5MV9TTUNfV1JJVEVNT0RFCSgxIDw8ICAxKQkJCS8qIFdyaXRlIE1vZGUgKi8KKyNkZWZpbmUJCUFUOTFfU01DX0VYTldNT0RFCSgzIDw8ICA1KQkJCS8qIE5XQUlUIE1vZGUgKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19FWE5XTU9ERV9ESVNBQkxFCSgwIDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9TTUNfRVhOV01PREVfRlJPWkVOCSgyIDw8IDUpCisjZGVmaW5lCQkJQVQ5MV9TTUNfRVhOV01PREVfUkVBRFkJCSgzIDw8IDUpCisjZGVmaW5lCQlBVDkxX1NNQ19CQVQJCSgxIDw8ICA4KQkJCS8qIEJ5dGUgQWNjZXNzIFR5cGUgKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19CQVRfU0VMRUNUCQkoMCA8PCA4KQorI2RlZmluZQkJCUFUOTFfU01DX0JBVF9XUklURQkJKDEgPDwgOCkKKyNkZWZpbmUJCUFUOTFfU01DX0RCVwkJKDMgPDwgMTIpCQkJLyogRGF0YSBCdXMgV2lkdGggKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19EQldfOAkJCSgwIDw8IDEyKQorI2RlZmluZQkJCUFUOTFfU01DX0RCV18xNgkJCSgxIDw8IDEyKQorI2RlZmluZQkJCUFUOTFfU01DX0RCV18zMgkJCSgyIDw8IDEyKQorI2RlZmluZQkJQVQ5MV9TTUNfVERGCQkoMHhmIDw8IDE2KQkJCS8qIERhdGEgRmxvYXQgVGltZS4gKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19UREZfKHgpCQkoKHgpIDw8IDE2KQorI2RlZmluZQkJQVQ5MV9TTUNfVERGTU9ERQkoMSA8PCAyMCkJCQkvKiBUREYgT3B0aW1pemF0aW9uIC0gRW5hYmxlZCAqLworI2RlZmluZQkJQVQ5MV9TTUNfUE1FTgkJKDEgPDwgMjQpCQkJLyogUGFnZSBNb2RlIEVuYWJsZWQgKi8KKyNkZWZpbmUJCUFUOTFfU01DX1BTCQkoMyA8PCAyOCkJCQkvKiBQYWdlIFNpemUgKi8KKyNkZWZpbmUJCQlBVDkxX1NNQ19QU180CQkJKDAgPDwgMjgpCisjZGVmaW5lCQkJQVQ5MV9TTUNfUFNfOAkJCSgxIDw8IDI4KQorI2RlZmluZQkJCUFUOTFfU01DX1BTXzE2CQkJKDIgPDwgMjgpCisjZGVmaW5lCQkJQVQ5MV9TTUNfUFNfMzIJCQkoMyA8PCAyOCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2JvYXJkLmgKaW5kZXggM2NjOWFlYy4uNzY4ZTBmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvYm9hcmQuaApAQCAtNDgsMTMgKzQ4LDE0IEBACiAJdTgJZGV0X3BpbjsJCS8qIENhcmQgZGV0ZWN0ICovCiAJdTgJdmNjX3BpbjsJCS8qIHBvd2VyIHN3aXRjaGluZyAqLwogCXU4CXJzdF9waW47CQkvKiBjYXJkIHJlc2V0ICovCisJdTgJY2hpcHNlbGVjdDsJCS8qIEVCSSBDaGlwIFNlbGVjdCBudW1iZXIgKi8KIH07CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX2NmKHN0cnVjdCBhdDkxX2NmX2RhdGEgKmRhdGEpOwogCiAgLyogTU1DIC8gU0QgKi8KIHN0cnVjdCBhdDkxX21tY19kYXRhIHsKIAl1OAkJZGV0X3BpbjsJLyogY2FyZCBkZXRlY3QgSVJRICovCi0JdW5zaWduZWQJaXNfYjoxOwkJLyogdXNlcyBCIHNpZGUgKHZzIEEpICovCisJdW5zaWduZWQJc2xvdF9iOjE7CS8qIHVzZXMgU2xvdCBCICovCiAJdW5zaWduZWQJd2lyZTQ6MTsJLyogKFNEKSBzdXBwb3J0cyBEQVQwLi5EQVQzICovCiAJdTgJCXdwX3BpbjsJCS8qIChTRCkgd3JpdGVwcm90ZWN0IGRldGVjdCAqLwogCXU4CQl2Y2NfcGluOwkvKiBwb3dlciBzd2l0Y2hpbmcgKGhpZ2ggPT0gb24pICovCkBAIC04MSw3ICs4Miw4IEBACiAJdTgJCXJkeV9waW47CS8qIHJlYWR5L2J1c3kgKi8KIAl1OAkJYWxlOwkJLyogYWRkcmVzcyBsaW5lIG51bWJlciBjb25uZWN0ZWQgdG8gQUxFICovCiAJdTgJCWNsZTsJCS8qIGFkZHJlc3MgbGluZSBudW1iZXIgY29ubmVjdGVkIHRvIENMRSAqLwotICAgICAgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiogKCpwYXJ0aXRpb25faW5mbykoaW50LCBpbnQqKTsKKwl1OAkJYnVzX3dpZHRoXzE2OwkvKiBidXN3aWR0aCBpcyAxNiBiaXQgKi8KKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiogKCpwYXJ0aXRpb25faW5mbykoaW50LCBpbnQqKTsKIH07CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9hZGRfZGV2aWNlX25hbmQoc3RydWN0IGF0OTFfbmFuZF9kYXRhICpkYXRhKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9jcHUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4ZDA5YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvY3B1LmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvY3B1LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNBTiBQZW9wbGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfQ1BVX0gKKyNkZWZpbmUgX19BU01fQVJDSF9DUFVfSAorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9kYmd1Lmg+CisKKworI2RlZmluZSBBUkNIX0lEX0FUOTFSTTkyMDAJMHgwOTI5MDc4MAorI2RlZmluZSBBUkNIX0lEX0FUOTFTQU05MjYwCTB4MDE5ODAzYTAKKyNkZWZpbmUgQVJDSF9JRF9BVDkxU0FNOTI2MQkweDAxOTcwM2EwCisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGF0OTFfY3B1X2lkZW50aWZ5KHZvaWQpCit7CisJcmV0dXJuIChhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKSAmIH5BVDkxX0NJRFJfVkVSU0lPTik7Cit9CisKKworI2lmZGVmIENPTkZJR19BUkNIX0FUOTFSTTkyMDAKKyNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDAoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFSTTkyMDApCisjZWxzZQorI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMCgpCSgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOTI2MAorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjAoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05MjYwKQorI2Vsc2UKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYwKCkJKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05MjYxCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MSgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTkyNjEpCisjZWxzZQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjEoKQkoMCkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvZGVidWctbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvZGVidWctbWFjcm8uUwppbmRleCBmNDk2YjU0Li44NWNkYWRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2RlYnVnLW1hY3JvLlMKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9kZWJ1Zy1tYWNyby5TCkBAIC0xMiw2ICsxMiw3IEBACiAqLwogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9kYmd1Lmg+CiAKIAkubWFjcm8JYWRkcnVhcnQscngKIAltcmMJcDE1LCAwLCBccngsIGMxLCBjMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9lbnRyeS1tYWNyby5TCmluZGV4IDYxYTMyNmUuLjU3MjQ4YTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvZW50cnktbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2VudHJ5LW1hY3JvLlMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9haWMuaD4KIAogCS5tYWNybwlkaXNhYmxlX2ZpcQogCS5lbmRtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2hhcmR3YXJlLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2hhcmR3YXJlLmgKaW5kZXggOWNhNGNjOS4uOWVhNWJmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9oYXJkd2FyZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvaGFyZHdhcmUuaApAQCAtMTYsOCArMTYsMTYgQEAKIAogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxUk05MjAwKQogI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFybTkyMDAuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9hdDkxcm05MjAwX3N5cy5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MCkKKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxc2FtOTI2MC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MSkKKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxc2FtOTI2MS5oPgorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgQVQ5MSBwcm9jZXNzb3IiCisjZW5kaWYKKwogCiAvKgogICogUmVtYXAgdGhlIHBlcmlwaGVyYWxzIGZyb20gYWRkcmVzcyAweEZGRkEwMDAwIC4uIDB4RkZGRkZGRkYKQEAgLTM0LDI5ICs0MiwyNyBAQAogICogVmlydHVhbCB0byBQaHlzaWNhbCBBZGRyZXNzIG1hcHBpbmcgZm9yIElPIGRldmljZXMuCiAgKi8KICNkZWZpbmUgQVQ5MV9WQV9CQVNFX1NZUwlBVDkxX0lPX1AyVihBVDkxX0JBU0VfU1lTKQotI2RlZmluZSBBVDkxX1ZBX0JBU0VfU1BJCUFUOTFfSU9fUDJWKEFUOTFSTTkyMDBfQkFTRV9TUEkpCiAjZGVmaW5lIEFUOTFfVkFfQkFTRV9FTUFDCUFUOTFfSU9fUDJWKEFUOTFSTTkyMDBfQkFTRV9FTUFDKQotI2RlZmluZSBBVDkxX1ZBX0JBU0VfVFdJCUFUOTFfSU9fUDJWKEFUOTFSTTkyMDBfQkFTRV9UV0kpCi0jZGVmaW5lIEFUOTFfVkFfQkFTRV9NQ0kJQVQ5MV9JT19QMlYoQVQ5MVJNOTIwMF9CQVNFX01DSSkKLSNkZWZpbmUgQVQ5MV9WQV9CQVNFX1VEUAlBVDkxX0lPX1AyVihBVDkxUk05MjAwX0JBU0VfVURQKQogCiAgLyogSW50ZXJuYWwgU1JBTSBpcyBtYXBwZWQgYmVsb3cgdGhlIElPIGRldmljZXMgKi8KLSNkZWZpbmUgQVQ5MV9TUkFNX1ZJUlRfQkFTRQkoQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxUk05MjAwX1NSQU1fU0laRSkKKyNkZWZpbmUgQVQ5MV9TUkFNX01BWAkJU1pfMU0KKyNkZWZpbmUgQVQ5MV9WSVJUX0JBU0UJCShBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFfU1JBTV9NQVgpCiAKIC8qIFNlcmlhbCBwb3J0cyAqLwotI2RlZmluZSBBVE1FTF9NQVhfVUFSVAkJNQkJLyogNCBVU0FSVDMncyBhbmQgb25lIERCR1UgcG9ydCAqLworI2RlZmluZSBBVE1FTF9NQVhfVUFSVAkJNwkJLyogNiBVU0FSVDMncyBhbmQgb25lIERCR1UgcG9ydCAoU0FNOTI2MCkgKi8KIAotLyogRkxBU0ggKi8KLSNkZWZpbmUgQVQ5MV9GTEFTSF9CQVNFCQkweDEwMDAwMDAwCS8qIE5DUzA6IEZsYXNoIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLworLyogRXh0ZXJuYWwgTWVtb3J5IE1hcCAqLworI2RlZmluZSBBVDkxX0NISVBTRUxFQ1RfMAkweDEwMDAwMDAwCisjZGVmaW5lIEFUOTFfQ0hJUFNFTEVDVF8xCTB4MjAwMDAwMDAKKyNkZWZpbmUgQVQ5MV9DSElQU0VMRUNUXzIJMHgzMDAwMDAwMAorI2RlZmluZSBBVDkxX0NISVBTRUxFQ1RfMwkweDQwMDAwMDAwCisjZGVmaW5lIEFUOTFfQ0hJUFNFTEVDVF80CTB4NTAwMDAwMDAKKyNkZWZpbmUgQVQ5MV9DSElQU0VMRUNUXzUJMHg2MDAwMDAwMAorI2RlZmluZSBBVDkxX0NISVBTRUxFQ1RfNgkweDcwMDAwMDAwCisjZGVmaW5lIEFUOTFfQ0hJUFNFTEVDVF83CTB4ODAwMDAwMDAKIAogLyogU0RSQU0gKi8KLSNkZWZpbmUgQVQ5MV9TRFJBTV9CQVNFCQkweDIwMDAwMDAwCS8qIE5DUzE6IFNEUkFNIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLwotCi0vKiBTbWFydE1lZGlhICovCi0jZGVmaW5lIEFUOTFfU01BUlRNRURJQV9CQVNFCTB4NDAwMDAwMDAJLyogTkNTMzogU21hcnRtZWRpYSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KLQotLyogQ29tcGFjdCBGbGFzaCAqLwotI2RlZmluZSBBVDkxX0NGX0JBU0UJCTB4NTAwMDAwMDAJLyogTkNTNC1OQ1M2OiBDb21wYWN0IEZsYXNoIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBBVDkxX1NEUkFNX0JBU0UJCUFUOTFfQ0hJUFNFTEVDVF8xCiAKIC8qIENsb2NrcyAqLwogI2RlZmluZSBBVDkxX1NMT1dfQ0xPQ0sJCTMyNzY4CQkvKiBzbG93IGNsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL2lycXMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvaXJxcy5oCmluZGV4IDc2M2NiOTYuLmMwNjc5ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvaXJxcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvaXJxcy5oCkBAIC0yMSw2ICsyMSw4IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19ICiAKKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxX2FpYy5oPgorCiAjZGVmaW5lIE5SX0FJQ19JUlFTIDMyCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvc3lzdGVtLmgKaW5kZXggOGEyZmY0Ny4uOWM2NzEzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3N5c3RlbS5oCkBAIC0yMiw2ICsyMiw4IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1lTVEVNX0gKIAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfc3QuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxX2RiZ3UuaD4KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQogewpAQCAtMzksMjEgKzQxLDEzIEBACiAJY3B1X2RvX2lkbGUoKTsKIH0KIAordm9pZCAoKmF0OTFfYXJjaF9yZXNldCkodm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSkKIHsKLQkvKgotCSAqIFBlcmZvcm0gYSBoYXJkd2FyZSByZXNldCB3aXRoIHRoZSB1c2Ugb2YgdGhlIFdhdGNoZG9nIHRpbWVyLgotCSAqLwotCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfV0RNUiwgQVQ5MV9TVF9SU1RFTiB8IEFUOTFfU1RfRVhURU4gfCAxKTsKLQlhdDkxX3N5c193cml0ZShBVDkxX1NUX0NSLCBBVDkxX1NUX1dEUlNUKTsKLX0KLQotI2RlZmluZSBBUkNIX0lEX0FUOTFSTTkyMDAJMHgwOTIwMDA4MAotI2RlZmluZSBBUkNIX0lEX0FUOTFTQU05MjYxCTB4MDE5MDAwYTAKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfaWRlbnRpZnkodm9pZCkKLXsKLQlyZXR1cm4gYXQ5MV9zeXNfcmVhZChBVDkxX0RCR1VfQ0lEUikgJiAoQVQ5MV9DSURSX0VQUk9DIHwgQVQ5MV9DSURSX0FSQ0gpOworCS8qIGNhbGwgdGhlIENQVS1zcGVjaWZpYyByZXNldCBmdW5jdGlvbiAqLworCWlmIChhdDkxX2FyY2hfcmVzZXQpCisJCShhdDkxX2FyY2hfcmVzZXQpKCk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC90aW1leC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC90aW1leC5oCmluZGV4IDg4Njg3Y2UuLmZhZWNhNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3RpbWV4LmgKQEAgLTIzLDYgKzIzLDE1IEBACiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCkKKwogI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCShBVDkxX1NMT1dfQ0xPQ0spCiAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjEpCisKKyNkZWZpbmUgQVQ5MVNBTTlfTUFTVEVSX0NMT0NLCTk5MzAwMDAwCisjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQkJKEFUOTFTQU05X01BU1RFUl9DTE9DSy8xNikKKworI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC91bmNvbXByZXNzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3VuY29tcHJlc3MuaAppbmRleCBlYzc4MTFhLi4zNGI0YjkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3VuY29tcHJlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3VuY29tcHJlc3MuaApAQCAtMjIsMTEgKzIyLDExIEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19ICiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdDkxX2RiZ3UuaD4KIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgY29kZSBhc3N1bWVzIHRoZSBzZXJpYWwgcG9ydCBoYXMgYWxyZWFkeSBiZWVuCi0gKiBpbml0aWFsaXplZCBieSB0aGUgYm9vdGxvYWRlci4gIFdlIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGVuYWJsZWQKLSAqIHBvcnQgaW4gdGhlIG1vc3QgcHJvYmFibGUgb3JkZXIuICBJZiB5b3UgZGlkbid0IHNldHVwIGEgcG9ydCBpbgorICogaW5pdGlhbGl6ZWQgYnkgdGhlIGJvb3Rsb2FkZXIuICBJZiB5b3UgZGlkbid0IHNldHVwIGEgcG9ydCBpbgogICogeW91ciBib290bG9hZGVyIHRoZW4gbm90aGluZyB3aWxsIGFwcGVhciAod2hpY2ggbWlnaHQgYmUgZGVzaXJlZCkuCiAgKgogICogVGhpcyBkb2VzIG5vdCBhcHBlbmQgYSBuZXdsaW5lCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxcm05MjAwL3ZtYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvdm1hbGxvYy5oCmluZGV4IDRjMzY3ZWIuLjBhMjNiOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTFybTkyMDAvdm1hbGxvYy5oCkBAIC0yMSw2ICsyMSw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfVk1BTExPQ19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfVk1BTExPQ19ICiAKLSNkZWZpbmUgVk1BTExPQ19FTkQJCShBVDkxX1NSQU1fVklSVF9CQVNFICYgUEdESVJfTUFTSykKKyNkZWZpbmUgVk1BTExPQ19FTkQJCShBVDkxX1ZJUlRfQkFTRSAmIFBHRElSX01BU0spCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2xwczcxMXgvbWVtb3J5LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9tZW1vcnkuaAppbmRleCBjNmU4ZGNmLi40Mjc2OGNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9tZW1vcnkuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9tZW1vcnkuaApAQCAtNjIsNyArNjIsMTUgQEAKICAqIG1lbW9yeSBiYW5rLiAgRm9yIHRob3NlIHN5c3RlbXMsIHNpbXBseSB1bmRlZmluZSBDT05GSUdfRElTQ09OVElHTUVNLgogICovCiAKLSNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisvKgorICogVGhlIFBTNzIxMSBhbGxvd3MgdXAgdG8gMjU2TUIgbWF4IHBlciBEUkFNIGJhbmssIGJ1dCB0aGUgRURCNzIxMQorICogdXNlcyBvbmx5IG9uZSBvZiB0aGUgdHdvIGJhbmtzIChiYW5rICMxKS4gIEhvd2V2ZXIsIGV2ZW4gd2l0aGluCisgKiBiYW5rICMxLCBtZW1vcnkgaXMgZGlzY29udGlndW91cy4KKyAqCisgKiBUaGUgRURCNzIxMSBoYXMgdHdvIDhNQiBEUkFNIGFyZWFzIHdpdGggOE1CIG9mIGVtcHR5IHNwYWNlIGJldHdlZW4KKyAqIHRoZW0sIHNvIHdlIHVzZSAyNCBmb3IgdGhlIG5vZGUgbWF4IHNoaWZ0IHRvIGdldCAxNk1CIG5vZGUgc2l6ZXMuCisgKi8KKwogLyoKICAqIEJlY2F1c2Ugb2YgdGhlIHdpZGUgbWVtb3J5IGFkZHJlc3Mgc3BhY2UgYmV0d2VlbiBwaHlzaWNhbCBSQU0gYmFua3Mgb24gdGhlIAogICogU0ExMTAwLCBpdCdzIG11Y2ggbW9yZSBjb252ZW5pZW50IHRvIHVzZSBMaW51eCdzIE5VTUEgc3VwcG9ydCB0byBpbXBsZW1lbnQKQEAgLTgwLDQ4ICs4OCw3IEBACiAgKiAJbm9kZSAyOiAgMHhkMDAwMDAwMCAtIDB4ZDdmZmZmZmYKICAqIAlub2RlIDM6ICAweGQ4MDAwMDAwIC0gMHhkZmZmZmZmZgogICovCi0KLS8qCi0gKiBHaXZlbiBhIGtlcm5lbCBhZGRyZXNzLCBmaW5kIHRoZSBob21lIG5vZGUgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5LgotICovCi0jZGVmaW5lIEtWQUREUl9UT19OSUQoYWRkcikgXAotCQkoKCh1bnNpZ25lZCBsb25nKShhZGRyKSAtIFBBR0VfT0ZGU0VUKSA+PiBOT0RFX01BWF9NRU1fU0hJRlQpCi0KLS8qCi0gKiBHaXZlbiBhIHBhZ2UgZnJhbWUgbnVtYmVyLCBjb252ZXJ0IGl0IHRvIGEgbm9kZSBpZC4KLSAqLwotI2RlZmluZSBQRk5fVE9fTklEKHBmbikgXAotCSgoKHBmbikgLSBQSFlTX1BGTl9PRkZTRVQpID4+IChOT0RFX01BWF9NRU1fU0hJRlQgLSBQQUdFX1NISUZUKSkKLQotLyoKLSAqIEdpdmVuIGEga2FkZHIsIEFERFJfVE9fTUFQQkFTRSBmaW5kcyB0aGUgb3duaW5nIG5vZGUgb2YgdGhlIG1lbW9yeQotICogYW5kIHJldHVybnMgdGhlIG1lbV9tYXAgb2YgdGhhdCBub2RlLgotICovCi0jZGVmaW5lIEFERFJfVE9fTUFQQkFTRShrYWRkcikgXAotCQkJTk9ERV9NRU1fTUFQKEtWQUREUl9UT19OSUQoKHVuc2lnbmVkIGxvbmcpKGthZGRyKSkpCi0KLSNkZWZpbmUgUEZOX1RPX01BUEJBU0UocGZuKQlOT0RFX01FTV9NQVAoUEZOX1RPX05JRChwZm4pKQotCi0vKgotICogR2l2ZW4gYSBrYWRkciwgTE9DQUxfTUFSX05SIGZpbmRzIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJucyB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGUgYXBwcm9wcmlhdGUgcGFnZSBpbiB0aGUKLSAqIG5vZGUncyBtZW1fbWFwLgotICovCi0jZGVmaW5lIExPQ0FMX01BUF9OUihhZGRyKSBcCi0JKCgodW5zaWduZWQgbG9uZykoYWRkcikgJiAoTk9ERV9NQVhfTUVNX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVCkKLQotLyoKLSAqIFRoZSBQUzcyMTEgYWxsb3dzIHVwIHRvIDI1Nk1CIG1heCBwZXIgRFJBTSBiYW5rLCBidXQgdGhlIEVEQjcyMTEKLSAqIHVzZXMgb25seSBvbmUgb2YgdGhlIHR3byBiYW5rcyAoYmFuayAjMSkuICBIb3dldmVyLCBldmVuIHdpdGhpbgotICogYmFuayAjMSwgbWVtb3J5IGlzIGRpc2NvbnRpZ3VvdXMuCi0gKgotICogVGhlIEVEQjcyMTEgaGFzIHR3byA4TUIgRFJBTSBhcmVhcyB3aXRoIDhNQiBvZiBlbXB0eSBzcGFjZSBiZXR3ZWVuCi0gKiB0aGVtLCBzbyB3ZSB1c2UgMjQgZm9yIHRoZSBub2RlIG1heCBzaGlmdCB0byBnZXQgMTZNQiBub2RlIHNpemVzLgotICovCi0jZGVmaW5lIE5PREVfTUFYX01FTV9TSElGVAkyNAotI2RlZmluZSBOT0RFX01BWF9NRU1fU0laRQkoMTw8Tk9ERV9NQVhfTUVNX1NISUZUKQotCi0jZW5kaWYgLyogQ09ORklHX0RJU0NPTlRJR01FTSAqLworI2RlZmluZSBOT0RFX01FTV9TSVpFX0JJVFMJMjQKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVic2ExMTAvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVic2ExMTAvaW8uaAppbmRleCBhZTA0ODQ0Li43MjJjNWUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMTEwL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTExMC9pby5oCkBAIC0yNyw5ICsyNyw5IEBACiB1MzIgX19pbmwodW5zaWduZWQgaW50IHBvcnQpOwogdm9pZCBfX291dGwodTMyIHZhbCwgdW5zaWduZWQgaW50IHBvcnQpOwogCi11OCAgX19yZWFkYih2b2lkIF9faW9tZW0gKmFkZHIpOwotdTE2IF9fcmVhZHcodm9pZCBfX2lvbWVtICphZGRyKTsKLXUzMiBfX3JlYWRsKHZvaWQgX19pb21lbSAqYWRkcik7Cit1OCAgX19yZWFkYihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOwordTE2IF9fcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKK3UzMiBfX3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiAKIHZvaWQgX193cml0ZWIodTggIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKTsKIHZvaWQgX193cml0ZXcodTE2IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKTsKQEAgLTY0LDggKzY0LDE0IEBACiAjZGVmaW5lIHdyaXRldyh2LGIpCQlfX3dyaXRldyh2LGIpCiAjZGVmaW5lIHdyaXRlbCh2LGIpCQlfX3dyaXRlbCh2LGIpCiAKLSNkZWZpbmUgX19hcmNoX2lvcmVtYXAoY29va2llLHN6LGMpCSgodm9pZCBfX2lvbWVtICopKGNvb2tpZSkpCi0jZGVmaW5lIF9fYXJjaF9pb3VubWFwKGNvb2tpZSkJCWRvIHsgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX2FyY2hfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGNvb2tpZSwgc2l6ZV90IHNpemUsCisJCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKWNvb2tpZTsKK30KKworI2RlZmluZSBfX2FyY2hfaW9yZW1hcAkJX19hcmNoX2lvcmVtYXAKKyNkZWZpbmUgX19hcmNoX2lvdW5tYXAoY29va2llKQlkbyB7IH0gd2hpbGUgKDApCiAKIGV4dGVybiB2b2lkIGluc2IodW5zaWduZWQgaW50IHBvcnQsIHZvaWQgKmJ1ZiwgaW50IHN6KTsKIGV4dGVybiB2b2lkIGluc3codW5zaWduZWQgaW50IHBvcnQsIHZvaWQgKmJ1ZiwgaW50IHN6KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9pbXgtcmVncy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2lteC1yZWdzLmgKaW5kZXggYTY5MTJiMy4uZTU2YTRlMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2lteC1yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2lteC1yZWdzLmgKQEAgLTQxLDcgKzQxLDEzIEBACiAKIC8qIFBMTCByZWdpc3RlcnMgKi8KICNkZWZpbmUgQ1NDUiAgIF9fUkVHKElNWF9QTExfQkFTRSkgICAgICAgIC8qIENsb2NrIFNvdXJjZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIENTQ1JfU1lTVEVNX1NFTCAoMTw8MTYpCisjZGVmaW5lIENTQ1JfU1BMTF9SRVNUQVJUCSgxPDwyMikKKyNkZWZpbmUgQ1NDUl9NUExMX1JFU1RBUlQJKDE8PDIxKQorI2RlZmluZSBDU0NSX1NZU1RFTV9TRUwJCSgxPDwxNikKKyNkZWZpbmUgQ1NDUl9CQ0xLX0RJVgkJKDB4Zjw8MTApCisjZGVmaW5lIENTQ1JfTVBVX1BSRVNDCQkoMTw8MTUpCisjZGVmaW5lIENTQ1JfU1BFTgkJKDE8PDEpCisjZGVmaW5lIENTQ1JfTVBFTgkJKDE8PDApCiAKICNkZWZpbmUgTVBDVEwwIF9fUkVHKElNWF9QTExfQkFTRSArIDB4NCkgIC8qIE1DVSBQTEwgQ29udHJvbCBSZWdpc3RlciAwICovCiAjZGVmaW5lIE1QQ1RMMSBfX1JFRyhJTVhfUExMX0JBU0UgKyAweDgpICAvKiBNQ1UgUExMIGFuZCBTeXN0ZW0gQ2xvY2sgUmVnaXN0ZXIgMSAqLwpAQCAtNDksOCArNTUsNiBAQAogI2RlZmluZSBTUENUTDEgX19SRUcoSU1YX1BMTF9CQVNFICsgMHgxMCkgLyogU3lzdGVtIFBMTCBDb250cm9sIFJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgUENEUiAgIF9fUkVHKElNWF9QTExfQkFTRSArIDB4MjApIC8qIFBlcmlwaGVyYWwgQ2xvY2sgRGl2aWRlciBSZWdpc3RlciAqLwogCi0jZGVmaW5lIENTQ1JfTVBMTF9SRVNUQVJUICgxPDwyMSkKLQogLyoKICAqICBHUElPIE1vZHVsZSBhbmQgSS9PIE11bHRpcGxleGVyCiAgKiAgeCA9IDAuLjMgZm9yIHJlZ19BLCByZWdfQiwgcmVnX0MsIHJlZ19ECmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbXgvdGltZXguaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC90aW1leC5oCmluZGV4IDhjOTE2NzQuLmUyMmJhNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC90aW1leC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC90aW1leC5oCkBAIC0yMSw3ICsyMSw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfVElNRVhfSAogI2RlZmluZSBfX0FTTV9BUkNIX1RJTUVYX0gKIAotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCShDTEszMikKKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCQkoMTYwMDAwMDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9kZWJ1Zy1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9kZWJ1Zy1tYWNyby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OGI0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L2RlYnVnLW1hY3JvLlMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvZGVidWctbWFjcm8uUworICoKKyAqIERlYnVnZ2luZyBtYWNybyBpbmNsdWRlIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk5IFJ1c3NlbGwgS2luZworICogTW92ZWQgZnJvbSBsaW51eC9hcmNoL2FybS9rZXJuZWwvZGVidWcuUyBieSBCZW4gRG9va3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKwkubWFjcm8JYWRkcnVhcnQsIHJ4CisJbXJjCXAxNSwgMCwgXHJ4LCBjMSwgYzAKKwl0c3QJXHJ4LCAjMQkJCUAgbW11IGVuYWJsZWQ/CisJbW92ZXEJXHJ4LCAjMHhmZjAwMDAwMAlAIHBoeXNpY2FsCisJb3JyZXEJXHJ4LCBccngsICMweDAwZDgwMDAwCisJbW92bmUJXHJ4LCAjMHhmZTAwMDAwMAlAIHZpcnR1YWwKKwlvcnJuZQlccngsIFxyeCwgIzB4MDBlODAwMDAKKwlvcnIJXHJ4LCBccngsICMweDAwMDAyMzAwCisJb3JyCVxyeCwgXHJ4LCAjMHgwMDAwMDA0MAorCS5lbmRtCisKKyNkZWZpbmUgVUFSVF9TSElGVAkyCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYnVnLTgyNTAuUz4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvZG1hLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTVkYTUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9kbWEuaApAQCAtMCwwICsxLDMgQEAKKyNpZm5kZWYgX0lPUDEzWFhfRE1BX0gKKyNkZWZpbmUgX0lPUDEzWFhfRE1BX0hfCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvZW50cnktbWFjcm8uUyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvZW50cnktbWFjcm8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGM1MDI4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9lbnRyeS1tYWNyby5TCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBpb3AxM3h4IGxvdyBsZXZlbCBpcnEgbWFjcm9zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqLworCS5tYWNybyAgZGlzYWJsZV9maXEKKwkuZW5kbQorCisJLyoKKwkgKiBOb3RlOiBhIDEtY3ljbGUgd2luZG93IGV4aXN0cyB3aGVyZSBpaW50dmVjIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZQorCSAqIG9mIGlpbnRiYXNlLCBzbyB3ZSBleHBsaWNpdGx5IGNoZWNrIGZvciAiYmFkIHplcm9zIgorCSAqLworCS5tYWNybyAgZ2V0X2lycW5yX2FuZF9iYXNlLCBpcnFuciwgaXJxc3RhdCwgYmFzZSwgdG1wCisJbXJjCXAxNSwgMCwgXHRtcCwgYzE1LCBjMSwgMAorCW9ycglcdG1wLCBcdG1wLCAjKDEgPDwgNikKKwltY3IJcDE1LCAwLCBcdG1wLCBjMTUsIGMxLCAwCUAgRW5hYmxlIGNwNiBhY2Nlc3MKKworCW1yYwlwNiwgMCwgXGlycW5yLCBjMywgYzIsIDAgIAlAIFJlYWQgSUlOVFZFQworCWNtcAlcaXJxbnIsICMwCisJbXJjZXEJcDYsIDAsIFxpcnFuciwgYzMsIGMyLCAwICAJQCBSZS1yZWFkIG9uIHBvdGVudGlhbGx5IGJhZCB6ZXJvCisJYWRkcwlcaXJxc3RhdCwgXGlycW5yLCAjMQkgIAlAIENoZWNrIGZvciAweGZmZmZmZmZmCisJbW92bmUJXGlycW5yLCBcaXJxbnIsIGxzciAjMgkgIAlAIENvbnZlcnQgdG8gaXJxbnIKKworCWJpY2VxCVx0bXAsIFx0bXAsICMoMSA8PCA2KQorCW1jcmVxCXAxNSwgMCwgXHRtcCwgYzE1LCBjMSwgMAlAIERpc2FibGUgY3A2IGFjY2VzcyBpZiBubyBtb3JlIGludGVycnVwdHMKKwkuZW5kbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9oYXJkd2FyZS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMWQ1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L2hhcmR3YXJlLmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKKyNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNkZWZpbmUgcGNpYmlvc19hc3NpZ25fYWxsX2J1c3NlcygpIDEKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGlvcDEzeHhfcGNpYmlvc19taW5faW87CitleHRlcm4gdW5zaWduZWQgbG9uZyBpb3AxM3h4X3BjaWJpb3NfbWluX21lbTsKK2V4dGVybiB1MTYgaW9wMTN4eF9kZXZfaWQodm9pZCk7CitleHRlcm4gdm9pZCBpb3AxM3h4X3NldF9hdHVfbW1yX2Jhc2VzKHZvaWQpOworI2VuZGlmCisKKyNkZWZpbmUgUENJQklPU19NSU5fSU8gICAgICAoaW9wMTN4eF9wY2liaW9zX21pbl9pbykKKyNkZWZpbmUgUENJQklPU19NSU5fTUVNICAgICAoaW9wMTN4eF9wY2liaW9zX21pbl9tZW0pCisKKy8qCisgKiBHZW5lcmljIGNoaXBzZXQgYml0cworICoKKyAqLworI2luY2x1ZGUgImlvcDEzeHguaCIKKworLyoKKyAqIEJvYXJkIHNwZWNpZmljIGJpdHMKKyAqLworI2luY2x1ZGUgImlxODEzNDAuaCIKKworI2VuZGlmICAvKiBfQVNNX0FSQ0hfSEFSRFdBUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNmRlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L2lvLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIGlvcDEzeHggY3VzdG9tIGlvcmVtYXAgaW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQorICogUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICovCisjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX0lPX0gKKyNkZWZpbmUgX19BU01fQVJNX0FSQ0hfSU9fSAorCisjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKKworI2RlZmluZSBfX2lvKGEpICAgICAgKGEpCisjZGVmaW5lIF9fbWVtX3BjaShhKSAoYSkKKyNkZWZpbmUgX19tZW1faXNhKGEpIChhKQorCitleHRlcm4gdm9pZCBfX2lvbWVtICogX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBfX2lvbWVtICpfX2lvcDEzeHhfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGNvb2tpZSwgc2l6ZV90IHNpemUsCisJdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gdm9pZCBfX2lvcDEzeHhfaW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpOworCitleHRlcm4gdTMyIGlvcDEzeHhfYXR1ZV9tZW1fYmFzZTsKK2V4dGVybiB1MzIgaW9wMTN4eF9hdHV4X21lbV9iYXNlOworZXh0ZXJuIHNpemVfdCBpb3AxM3h4X2F0dWVfbWVtX3NpemU7CitleHRlcm4gc2l6ZV90IGlvcDEzeHhfYXR1eF9tZW1fc2l6ZTsKKworI2RlZmluZSBfX2FyY2hfaW9yZW1hcChhLCBzLCBmKSBfX2lvcDEzeHhfaW9yZW1hcChhLCBzLCBmKQorI2RlZmluZSBfX2FyY2hfaW91bm1hcChhKQkgX19pb3AxM3h4X2lvdW5tYXAoYSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L2lvcDEzeHguaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvaW9wMTN4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODUyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L2lvcDEzeHguaApAQCAtMCwwICsxLDQ5MiBAQAorI2lmbmRlZiBfSU9QMTNYWF9IV19IXworI2RlZmluZSBfSU9QMTNYWF9IV19IXworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyogVGhlIEFUVSBvZmZzZXRzIGNhbiBjaGFuZ2UgYmFzZWQgb24gdGhlIHN0cmFwcGluZyAqLworZXh0ZXJuIHUzMiBpb3AxM3h4X2F0dXhfcG1tcl9vZmZzZXQ7CitleHRlcm4gdTMyIGlvcDEzeHhfYXR1ZV9wbW1yX29mZnNldDsKK3ZvaWQgaW9wMTN4eF9pbml0X2lycSh2b2lkKTsKK3ZvaWQgaW9wMTN4eF9tYXBfaW8odm9pZCk7Cit2b2lkIGlvcDEzeHhfcGxhdGZvcm1faW5pdCh2b2lkKTsKK3ZvaWQgaW9wMTN4eF9pbml0X2lycSh2b2lkKTsKK3ZvaWQgaW9wMTN4eF9pbml0X3RpbWUodW5zaWduZWQgbG9uZyB0aWNrcmF0ZSk7Cit1bnNpZ25lZCBsb25nIGlvcDEzeHhfZ2V0dGltZW9mZnNldCh2b2lkKTsKKworLyogaGFuZGxlIGNwNiBhY2Nlc3MKKyAqIHRvIGRvOiBoYW5kbGUgYWNjZXNzIGluIGVudHJ5LWFybXY1LlMgYW5kIHVuaWZ5IHdpdGgKKyAqIHRoZSBpb3AzeHggaW1wbGVtZW50YXRpb24KKyAqIG5vdGU6IHVzZSBpb3AxM3h4X2NwNl9lbmFibGVfaXJxX3NhdmUgYW5kIGlvcDEzeHhfY3A2X2lycV9yZXN0b3JlIChpcnEuaCkKKyAqIHdoZW4gaW50ZXJydXB0cyBhcmUgZW5hYmxlZAorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaW9wMTN4eF9jcDZfc2F2ZSh2b2lkKQoreworCXUzMiB0ZW1wLCBjcF9mbGFnczsKKworCWFzbSB2b2xhdGlsZSAoCisJCSJtcmMJcDE1LCAwLCAlMSwgYzE1LCBjMSwgMFxuXHQiCisJCSJvcnIJJTAsICUxLCAjKDEgPDwgNilcblx0IgorCQkibWNyCXAxNSwgMCwgJTAsIGMxNSwgYzEsIDBcblx0IgorCQk6ICI9ciIgKHRlbXApLCAiPXIiKGNwX2ZsYWdzKSk7CisKKwlyZXR1cm4gY3BfZmxhZ3M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3AxM3h4X2NwNl9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgY3BfZmxhZ3MpCit7CisJYXNtIHZvbGF0aWxlICgKKwkJIm1jcglwMTUsIDAsICUwLCBjMTUsIGMxLCAwXG5cdCIKKwkJOiA6ICJyIiAoY3BfZmxhZ3MpICk7Cit9CisKKy8qIENQVUlEIENQNiBSMCBQYWdlIDAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlvcDEzeHhfY3B1X2lkKHZvaWQpCit7CisJaW50IGlkOworCWFzbSB2b2xhdGlsZSgibXJjIHA2LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChpZCkpOworCXJldHVybiBpZDsKK30KKworI2VuZGlmCisKKy8qCisgKiBJT1AxM1hYIEkvTyBhbmQgTWVtIHNwYWNlIHJlZ2lvbnMgZm9yIFBDSSBhdXRvY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIElPUDEzWFhfTUFYX1JBTV9TSVpFICAgIDB4ODAwMDAwMDBVTCAgLyogMkdCICovCisjZGVmaW5lIElPUDEzWFhfUENJX09GRlNFVAkgSU9QMTNYWF9NQVhfUkFNX1NJWkUKKworLyogUENJIE1BUAorICogMHgwMDAwLjAwMDAgLSAweDgwMDAuMDAwMCAgICAgICAgICAgMToxIG1hcHBpbmcgd2l0aCBQaHlzaWNhbCBSQU0KKyAqIDB4ODAwMC4wMDAwIC0gMHg4ODAwLjAwMDAgICAgICAgICAgIFBDSVgvUENJRSBtZW1vcnkgd2luZG93ICgxMjhNQikKKyovCisjZGVmaW5lIElPUDEzWFhfUENJWF9JT19XSU5ET1dfU0laRSAgIDB4MTAwMDBVTAorI2RlZmluZSBJT1AxM1hYX1BDSVhfTE9XRVJfSU9fUEEgICAgICAweGZmZmIwMDAwVUwKKyNkZWZpbmUgSU9QMTNYWF9QQ0lYX0xPV0VSX0lPX1ZBICAgICAgMHhmZWM2MDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUENJWF9MT1dFUl9JT19CQSAgICAgIDB4MGZmZjAwMDBVTAorI2RlZmluZSBJT1AxM1hYX1BDSVhfVVBQRVJfSU9fUEEgICAgICAoSU9QMTNYWF9QQ0lYX0xPV0VSX0lPX1BBICtcCisJCQkJICAgICAgIElPUDEzWFhfUENJWF9JT19XSU5ET1dfU0laRSAtIDEpCisjZGVmaW5lIElPUDEzWFhfUENJWF9VUFBFUl9JT19WQSAgICAgIChJT1AxM1hYX1BDSVhfTE9XRVJfSU9fVkEgK1wKKwkJCQkgICAgICAgSU9QMTNYWF9QQ0lYX0lPX1dJTkRPV19TSVpFIC0gMSkKKyNkZWZpbmUgSU9QMTNYWF9QQ0lYX0lPX09GRlNFVCAgICAgICAgKElPUDEzWFhfUENJWF9MT1dFUl9JT19WQSAtXAorCQkJCSAgICAgICBJT1AxM1hYX1BDSVhfTE9XRVJfSU9fQkEpCisjZGVmaW5lIElPUDEzWFhfUENJWF9JT19QSFlTX1RPX1ZJUlQoYWRkcikgKHUzMikgKCh1MzIpIGFkZHIgLVwKKwkJCQkJICAgKElPUDEzWFhfUENJWF9MT1dFUl9JT19QQVwKKwkJCQkJICAgLSBJT1AxM1hYX1BDSVhfTE9XRVJfSU9fVkEpKQorCisjZGVmaW5lIElPUDEzWFhfUENJWF9NRU1fUEhZU19PRkZTRVQgIDB4MTAwMDAwMDAwVUxMCisjZGVmaW5lIElPUDEzWFhfUENJWF9NRU1fV0lORE9XX1NJWkUgIDB4M2EwMDAwMDBVTAorI2RlZmluZSBJT1AxM1hYX1BDSVhfTE9XRVJfTUVNX0JBICAgICAoUEhZU19PRkZTRVQgKyBJT1AxM1hYX1BDSV9PRkZTRVQpCisjZGVmaW5lIElPUDEzWFhfUENJWF9MT1dFUl9NRU1fUEEgICAgIChJT1AxM1hYX1BDSVhfTUVNX1BIWVNfT0ZGU0VUICtcCisJCQkJICAgICAgIElPUDEzWFhfUENJWF9MT1dFUl9NRU1fQkEpCisjZGVmaW5lIElPUDEzWFhfUENJWF9VUFBFUl9NRU1fUEEgICAgIChJT1AxM1hYX1BDSVhfTE9XRVJfTUVNX1BBICtcCisJCQkJICAgICAgIElPUDEzWFhfUENJWF9NRU1fV0lORE9XX1NJWkUgLSAxKQorI2RlZmluZSBJT1AxM1hYX1BDSVhfVVBQRVJfTUVNX0JBICAgICAoSU9QMTNYWF9QQ0lYX0xPV0VSX01FTV9CQSArXAorCQkJCSAgICAgICBJT1AxM1hYX1BDSVhfTUVNX1dJTkRPV19TSVpFIC0gMSkKKworI2RlZmluZSBJT1AxM1hYX1BDSVhfTUVNX0NPT0tJRSAgICAgICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUENJWF9MT1dFUl9NRU1fUkEgICAgICBJT1AxM1hYX1BDSVhfTUVNX0NPT0tJRQorI2RlZmluZSBJT1AxM1hYX1BDSVhfVVBQRVJfTUVNX1JBICAgICAgKElPUDEzWFhfUENJWF9MT1dFUl9NRU1fUkEgK1wKKwkJCQkJSU9QMTNYWF9QQ0lYX01FTV9XSU5ET1dfU0laRSAtIDEpCisjZGVmaW5lIElPUDEzWFhfUENJWF9NRU1fT0ZGU0VUICAgICAgICAoSU9QMTNYWF9QQ0lYX01FTV9DT09LSUUgLVwKKwkJCQkJSU9QMTNYWF9QQ0lYX0xPV0VSX01FTV9CQSkKKworLyogUENJLUUgcmFuZ2VzICovCisjZGVmaW5lIElPUDEzWFhfUENJRV9JT19XSU5ET1dfU0laRSAgIAkgMHgxMDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUENJRV9MT1dFUl9JT19QQSAgICAgIAkgMHhmZmZkMDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUENJRV9MT1dFUl9JT19WQSAgICAgIAkgMHhmZWQ3MDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUENJRV9MT1dFUl9JT19CQSAgICAgIAkgMHgwZmZmMDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUENJRV9VUFBFUl9JT19QQSAgICAgIAkgKElPUDEzWFhfUENJRV9MT1dFUl9JT19QQSArXAorCQkJCQkgSU9QMTNYWF9QQ0lFX0lPX1dJTkRPV19TSVpFIC0gMSkKKyNkZWZpbmUgSU9QMTNYWF9QQ0lFX1VQUEVSX0lPX1ZBICAgICAgCSAoSU9QMTNYWF9QQ0lFX0xPV0VSX0lPX1ZBICtcCisJCQkJCSBJT1AxM1hYX1BDSUVfSU9fV0lORE9XX1NJWkUgLSAxKQorI2RlZmluZSBJT1AxM1hYX1BDSUVfVVBQRVJfSU9fQkEgICAgICAJIChJT1AxM1hYX1BDSUVfTE9XRVJfSU9fQkEgK1wKKwkJCQkJIElPUDEzWFhfUENJRV9JT19XSU5ET1dfU0laRSAtIDEpCisjZGVmaW5lIElPUDEzWFhfUENJRV9JT19PRkZTRVQgICAgICAgIAkgKElPUDEzWFhfUENJRV9MT1dFUl9JT19WQSAtXAorCQkJCQkgSU9QMTNYWF9QQ0lFX0xPV0VSX0lPX0JBKQorI2RlZmluZSBJT1AxM1hYX1BDSUVfSU9fUEhZU19UT19WSVJUKGFkZHIpICh1MzIpICgodTMyKSBhZGRyIC1cCisJCQkJCSAgIChJT1AxM1hYX1BDSUVfTE9XRVJfSU9fUEFcCisJCQkJCSAgIC0gSU9QMTNYWF9QQ0lFX0xPV0VSX0lPX1ZBKSkKKworI2RlZmluZSBJT1AxM1hYX1BDSUVfTUVNX1BIWVNfT0ZGU0VUICAJIDB4MjAwMDAwMDAwVUxMCisjZGVmaW5lIElPUDEzWFhfUENJRV9NRU1fV0lORE9XX1NJWkUgIAkgMHgzYTAwMDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUENJRV9MT1dFUl9NRU1fQkEgICAgIAkgKFBIWVNfT0ZGU0VUICsgSU9QMTNYWF9QQ0lfT0ZGU0VUKQorI2RlZmluZSBJT1AxM1hYX1BDSUVfTE9XRVJfTUVNX1BBICAgICAJIChJT1AxM1hYX1BDSUVfTUVNX1BIWVNfT0ZGU0VUICtcCisJCQkJCSBJT1AxM1hYX1BDSUVfTE9XRVJfTUVNX0JBKQorI2RlZmluZSBJT1AxM1hYX1BDSUVfVVBQRVJfTUVNX1BBICAgICAJIChJT1AxM1hYX1BDSUVfTE9XRVJfTUVNX1BBICtcCisJCQkJCSBJT1AxM1hYX1BDSUVfTUVNX1dJTkRPV19TSVpFIC0gMSkKKyNkZWZpbmUgSU9QMTNYWF9QQ0lFX1VQUEVSX01FTV9CQSAgICAgCSAoSU9QMTNYWF9QQ0lFX0xPV0VSX01FTV9CQSArXAorCQkJCQkgSU9QMTNYWF9QQ0lFX01FTV9XSU5ET1dfU0laRSAtIDEpCisKKy8qIEFsbCAweGMwMDAuMDAwMCAtIDB4ZmRmZi5mZmZmIGFkZHJlc3NlcyBiZWxvbmcgdG8gUENJZSAqLworI2RlZmluZSBJT1AxM1hYX1BDSUVfTUVNX0NPT0tJRSAgICAgICAJIDB4YzAwMDAwMDBVTAorI2RlZmluZSBJT1AxM1hYX1BDSUVfTE9XRVJfTUVNX1JBICAgICAJIElPUDEzWFhfUENJRV9NRU1fQ09PS0lFCisjZGVmaW5lIElPUDEzWFhfUENJRV9VUFBFUl9NRU1fUkEgICAgIAkgKElPUDEzWFhfUENJRV9MT1dFUl9NRU1fUkEgK1wKKwkJCQkJIElPUDEzWFhfUENJRV9NRU1fV0lORE9XX1NJWkUgLSAxKQorI2RlZmluZSBJT1AxM1hYX1BDSUVfTUVNX09GRlNFVCAgICAgICAJIChJT1AxM1hYX1BDSUVfTUVNX0NPT0tJRSAtXAorCQkJCQkgSU9QMTNYWF9QQ0lFX0xPV0VSX01FTV9CQSkKKworLyogUEJJIFJhbmdlcyAqLworI2RlZmluZSBJT1AxM1hYX1BCSV9MT1dFUl9NRU1fUEEJICAweGYwMDAwMDAwVUwKKyNkZWZpbmUgSU9QMTNYWF9QQklfTUVNX1dJTkRPV19TSVpFCSAgMHgwNDAwMDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUEJJX01FTV9DT09LSUUJCSAgMHhmYTAwMDAwMFVMCisjZGVmaW5lIElPUDEzWFhfUEJJX0xPV0VSX01FTV9SQQkgIElPUDEzWFhfUEJJX01FTV9DT09LSUUKKyNkZWZpbmUgSU9QMTNYWF9QQklfVVBQRVJfTUVNX1JBCSAgKElPUDEzWFhfUEJJX0xPV0VSX01FTV9SQSArXAorCQkJCQkgIElPUDEzWFhfUEJJX01FTV9XSU5ET1dfU0laRSAtIDEpCisKKy8qCisgKiBJT1AxM1hYIGNoaXBzZXQgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UJICAgMHhmZmQ4MDAwMFVMICAvKiBQTU1SIHBoeXMuIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU9QMTNYWF9QTU1SX1ZJUlRfTUVNX0JBU0UJICAgMHhmZWU4MDAwMFVMICAvKiBQTU1SIHBoeXMuIGFkZHJlc3MgKi8KKyNkZWZpbmUgSU9QMTNYWF9QTU1SX01FTV9XSU5ET1dfU0laRQkgICAweDgwMDAwCisjZGVmaW5lIElPUDEzWFhfUE1NUl9VUFBFUl9NRU1fVkEJICAgKElPUDEzWFhfUE1NUl9WSVJUX01FTV9CQVNFICtcCisJCQkJCSAgIElPUDEzWFhfUE1NUl9NRU1fV0lORE9XX1NJWkUgLSAxKQorI2RlZmluZSBJT1AxM1hYX1BNTVJfVVBQRVJfTUVNX1BBCSAgIChJT1AxM1hYX1BNTVJfUEhZU19NRU1fQkFTRSArXAorCQkJCQkgICBJT1AxM1hYX1BNTVJfTUVNX1dJTkRPV19TSVpFIC0gMSkKKyNkZWZpbmUgSU9QMTNYWF9QTU1SX1ZJUlRfVE9fUEhZUyhhZGRyKSAgICh1MzIpICgodTMyKSBhZGRyICtcCisJCQkJCSAgIChJT1AxM1hYX1BNTVJfUEhZU19NRU1fQkFTRVwKKwkJCQkJICAgLSBJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSkpCisjZGVmaW5lIElPUDEzWFhfUE1NUl9QSFlTX1RPX1ZJUlQoYWRkcikgICAodTMyKSAoKHUzMikgYWRkciAtXAorCQkJCQkgICAoSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0VcCisJCQkJCSAgIC0gSU9QMTNYWF9QTU1SX1ZJUlRfTUVNX0JBU0UpKQorI2RlZmluZSBJT1AxM1hYX1JFR19BRERSMzIocmVnKSAgICAgCSAgIChJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSArIChyZWcpKQorI2RlZmluZSBJT1AxM1hYX1JFR19BRERSMTYocmVnKSAgICAgCSAgIChJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSArIChyZWcpKQorI2RlZmluZSBJT1AxM1hYX1JFR19BRERSOChyZWcpICAgICAgCSAgIChJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSArIChyZWcpKQorI2RlZmluZSBJT1AxM1hYX1JFR19BRERSMzJfUEhZUyhyZWcpICAgICAgKElPUDEzWFhfUE1NUl9QSFlTX01FTV9CQVNFICsgKHJlZykpCisjZGVmaW5lIElPUDEzWFhfUkVHX0FERFIxNl9QSFlTKHJlZykgICAgICAoSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UgKyAocmVnKSkKKyNkZWZpbmUgSU9QMTNYWF9SRUdfQUREUjhfUEhZUyhyZWcpICAgICAgIChJT1AxM1hYX1BNTVJfUEhZU19NRU1fQkFTRSArIChyZWcpKQorI2RlZmluZSBJT1AxM1hYX1BNTVJfU0laRQkJICAgMHgwMDA4MDAwMAorCisvKj09PT09PT09PT09PT09PT09PT0gRGVmaW5lcyBmb3IgUGxhdGZvcm0gRGV2aWNlcyA9PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBJT1AxM1hYX1VBUlQwX1BIWVMgIChJT1AxM1hYX1BNTVJfUEhZU19NRU1fQkFTRSB8IDB4MDAwMDIzMDApCisjZGVmaW5lIElPUDEzWFhfVUFSVDFfUEhZUyAgKElPUDEzWFhfUE1NUl9QSFlTX01FTV9CQVNFIHwgMHgwMDAwMjM0MCkKKyNkZWZpbmUgSU9QMTNYWF9VQVJUMF9WSVJUICAoSU9QMTNYWF9QTU1SX1ZJUlRfTUVNX0JBU0UgfCAweDAwMDAyMzAwKQorI2RlZmluZSBJT1AxM1hYX1VBUlQxX1ZJUlQgIChJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSB8IDB4MDAwMDIzNDApCisKKyNkZWZpbmUgSU9QMTNYWF9JMkMwX1BIWVMgICAoSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UgfCAweDAwMDAyNTAwKQorI2RlZmluZSBJT1AxM1hYX0kyQzFfUEhZUyAgIChJT1AxM1hYX1BNTVJfUEhZU19NRU1fQkFTRSB8IDB4MDAwMDI1MjApCisjZGVmaW5lIElPUDEzWFhfSTJDMl9QSFlTICAgKElPUDEzWFhfUE1NUl9QSFlTX01FTV9CQVNFIHwgMHgwMDAwMjU0MCkKKyNkZWZpbmUgSU9QMTNYWF9JMkMwX1ZJUlQgICAoSU9QMTNYWF9QTU1SX1ZJUlRfTUVNX0JBU0UgfCAweDAwMDAyNTAwKQorI2RlZmluZSBJT1AxM1hYX0kyQzFfVklSVCAgIChJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSB8IDB4MDAwMDI1MjApCisjZGVmaW5lIElPUDEzWFhfSTJDMl9WSVJUICAgKElPUDEzWFhfUE1NUl9WSVJUX01FTV9CQVNFIHwgMHgwMDAwMjU0MCkKKworLyogQVRVIHNlbGVjdGlvbiBmbGFncyAqLworLyogSU9QMTNYWF9JTklUX0FUVV9ERUZBVUxUID0gUmVseSBvbiBDT05GSUdfSU9QMTNYWF9BVFUqICovCisjZGVmaW5lIElPUDEzWFhfSU5JVF9BVFVfREVGQVVMVCAgICAgKDApCisjZGVmaW5lIElPUDEzWFhfSU5JVF9BVFVfQVRVWAkgICAgICAoMSA8PCAwKQorI2RlZmluZSBJT1AxM1hYX0lOSVRfQVRVX0FUVUUJICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgSU9QMTNYWF9JTklUX0FUVV9OT05FCSAgICAgICgxIDw8IDIpCisKKy8qIFVBUlQgc2VsZWN0aW9uIGZsYWdzICovCisvKiBJT1AxM1hYX0lOSVRfVUFSVF9ERUZBVUxUID0gUmVseSBvbiBDT05GSUdfSU9QMTNYWF9VQVJUKiAqLworI2RlZmluZSBJT1AxM1hYX0lOSVRfVUFSVF9ERUZBVUxUICAgICgwKQorI2RlZmluZSBJT1AxM1hYX0lOSVRfVUFSVF8wCSAgICAgICgxIDw8IDApCisjZGVmaW5lIElPUDEzWFhfSU5JVF9VQVJUXzEJICAgICAgKDEgPDwgMSkKKworLyogSTJDIHNlbGVjdGlvbiBmbGFncyAqLworLyogSU9QMTNYWF9JTklUX0kyQ19ERUZBVUxUID0gUmVseSBvbiBDT05GSUdfSU9QMTNYWF9JMkMqICovCisjZGVmaW5lIElPUDEzWFhfSU5JVF9JMkNfREVGQVVMVCAgICAgKDApCisjZGVmaW5lIElPUDEzWFhfSU5JVF9JMkNfMAkgICAgICAoMSA8PCAwKQorI2RlZmluZSBJT1AxM1hYX0lOSVRfSTJDXzEJICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgSU9QMTNYWF9JTklUX0kyQ18yCSAgICAgICgxIDw8IDIpCisKKyNkZWZpbmUgSVE4MTM0MF9OVU1fVUFSVCAgICAgMgorI2RlZmluZSBJUTgxMzQwX05VTV9JMkMgICAgICAzCisjZGVmaW5lIElRODEzNDBfTlVNX1BIWVNfTUFQX0ZMQVNIIDEKKyNkZWZpbmUgSVE4MTM0MF9NQVhfUExBVF9ERVZJQ0VTIChJUTgxMzQwX05VTV9VQVJUICtcCisJCQkJSVE4MTM0MF9OVU1fSTJDICtcCisJCQkJSVE4MTM0MF9OVU1fUEhZU19NQVBfRkxBU0gpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT0gUE1NUiBvZmZzZXRzIGZvciBrZXkgcmVnaXN0ZXJzID09PT09PT09PT09PSovCisjZGVmaW5lIElPUDEzWFhfQVRVMF9QTU1SX09GRlNFVCAgIAkweDAwMDQ4MDAwCisjZGVmaW5lIElPUDEzWFhfQVRVMV9QTU1SX09GRlNFVCAgIAkweDAwMDRjMDAwCisjZGVmaW5lIElPUDEzWFhfQVRVMl9QTU1SX09GRlNFVCAgIAkweDAwMDRkMDAwCisjZGVmaW5lIElPUDEzWFhfQURNQTBfUE1NUl9PRkZTRVQgIAkweDAwMDAwMDAwCisjZGVmaW5lIElPUDEzWFhfQURNQTFfUE1NUl9PRkZTRVQgIAkweDAwMDAwMjAwCisjZGVmaW5lIElPUDEzWFhfQURNQTJfUE1NUl9PRkZTRVQgIAkweDAwMDAwNDAwCisjZGVmaW5lIElPUDEzWFhfUEJJX1BNTVJfT0ZGU0VUICAgIAkweDAwMDAxNTgwCisjZGVmaW5lIElPUDEzWFhfRVNTUjBfUE1NUl9PRkZTRVQgIAkweDAwMDAyMTg4CisjZGVmaW5lIElPUDEzWFhfRVNTUjAJCQlJT1AxM1hYX1JFR19BRERSMzIoMHgwMDAwMjE4OCkKKworI2RlZmluZSBJT1AxM1hYX0VTU1IwX0lGQUNFX01BU0sgICAJMHgwMDAwNDAwMCAgLyogSW50ZXJmYWNlIFBDSS1YIC8gUENJLUUgKi8KKyNkZWZpbmUgSU9QMTNYWF9DT05UUk9MTEVSX09OTFkgICAgCSgxIDw8IDE0KQorI2RlZmluZSBJT1AxM1hYX0lOVEVSRkFDRV9TRUxfUENJWCAJKDEgPDwgMTUpCisKKyNkZWZpbmUgSU9QMTNYWF9QTU9OX1BNTVJfT0ZGU0VUCTB4MDAwMUEwMDAKKyNkZWZpbmUgSU9QMTNYWF9QTU9OX0JBU0UJCShJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSArXAorCQkJCQlJT1AxM1hYX1BNT05fUE1NUl9PRkZTRVQpCisjZGVmaW5lIElPUDEzWFhfUE1PTl9QSFlTQkFTRQkJKElPUDEzWFhfUE1NUl9QSFlTX01FTV9CQVNFICtcCisJCQkJCUlPUDEzWFhfUE1PTl9QTU1SX09GRlNFVCkKKworI2RlZmluZSBJT1AxM1hYX1BNT05fQ01EMAkJKElPUDEzWFhfUE1PTl9CQVNFICsgMHgwKQorI2RlZmluZSBJT1AxM1hYX1BNT05fRVZSMAkJKElPUDEzWFhfUE1PTl9CQVNFICsgMHg0KQorI2RlZmluZSBJT1AxM1hYX1BNT05fU1RTMAkJKElPUDEzWFhfUE1PTl9CQVNFICsgMHg4KQorI2RlZmluZSBJT1AxM1hYX1BNT05fREFUQTAJCShJT1AxM1hYX1BNT05fQkFTRSArIDB4QykKKworI2RlZmluZSBJT1AxM1hYX1BNT05fQ01EMwkJKElPUDEzWFhfUE1PTl9CQVNFICsgMHgzMCkKKyNkZWZpbmUgSU9QMTNYWF9QTU9OX0VWUjMJCShJT1AxM1hYX1BNT05fQkFTRSArIDB4MzQpCisjZGVmaW5lIElPUDEzWFhfUE1PTl9TVFMzCQkoSU9QMTNYWF9QTU9OX0JBU0UgKyAweDM4KQorI2RlZmluZSBJT1AxM1hYX1BNT05fREFUQTMJCShJT1AxM1hYX1BNT05fQkFTRSArIDB4M0MpCisKKyNkZWZpbmUgSU9QMTNYWF9QTU9OX0NNRDcJCShJT1AxM1hYX1BNT05fQkFTRSArIDB4NzApCisjZGVmaW5lIElPUDEzWFhfUE1PTl9FVlI3CQkoSU9QMTNYWF9QTU9OX0JBU0UgKyAweDc0KQorI2RlZmluZSBJT1AxM1hYX1BNT05fU1RTNwkJKElPUDEzWFhfUE1PTl9CQVNFICsgMHg3OCkKKyNkZWZpbmUgSU9QMTNYWF9QTU9OX0RBVEE3CQkoSU9QMTNYWF9QTU9OX0JBU0UgKyAweDdDKQorCisjZGVmaW5lIElPUDEzWFhfUE1PTkVOCQkJKElPUDEzWFhfUE1NUl9WSVJUX01FTV9CQVNFICsgMHg0RTA0MCkKKyNkZWZpbmUgSU9QMTNYWF9QTU9OU1RBVAkJKElPUDEzWFhfUE1NUl9WSVJUX01FTV9CQVNFICsgMHg0RTA0NCkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUFUVT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgSU9QMTNYWF9BVFVYX09GRlNFVChvZnMpCUlPUDEzWFhfUkVHX0FERFIzMihcCisJCQkJCWlvcDEzeHhfYXR1eF9wbW1yX29mZnNldCArIChvZnMpKQorCisjZGVmaW5lIElPUDEzWFhfQVRVWF9ESUQJCUlPUDEzWFhfUkVHX0FERFIxNihcCisJCQkJCWlvcDEzeHhfYXR1eF9wbW1yX29mZnNldCArIDB4MikKKworI2RlZmluZSBJT1AxM1hYX0FUVVhfQVRVQ01ECQlJT1AxM1hYX1JFR19BRERSMTYoXAorCQkJCQlpb3AxM3h4X2F0dXhfcG1tcl9vZmZzZXQgKyAweDQpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9BVFVTUgkJSU9QMTNYWF9SRUdfQUREUjE2KFwKKwkJCQkJaW9wMTN4eF9hdHV4X3BtbXJfb2Zmc2V0ICsgMHg2KQorCisjZGVmaW5lIElPUDEzWFhfQVRVWF9JQUJBUjAgICAJCUlPUDEzWFhfQVRVWF9PRkZTRVQoMHgxMCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBVUJBUjAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDE0KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfSUFCQVIxICAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MTgpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9JQVVCQVIxICAJCUlPUDEzWFhfQVRVWF9PRkZTRVQoMHgxYykKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBQkFSMiAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDIwKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfSUFVQkFSMiAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MjQpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9JQUxSMCAgICAJCUlPUDEzWFhfQVRVWF9PRkZTRVQoMHg0MCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBVFZSMCAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDQ0KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfSUFVVFZSMCAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4NDgpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9JQUxSMSAgICAJCUlPUDEzWFhfQVRVWF9PRkZTRVQoMHg0YykKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBVFZSMSAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDUwKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfSUFVVFZSMSAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4NTQpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9JQUxSMiAgICAJCUlPUDEzWFhfQVRVWF9PRkZTRVQoMHg1OCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBVFZSMiAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDVjKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfSUFVVFZSMiAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4NjApCisjZGVmaW5lIElPUDEzWFhfQVRVWF9BVFVDUiAgICAJCUlPUDEzWFhfQVRVWF9PRkZTRVQoMHg3MCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1BDU1IgICAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDc0KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfQVRVSVNSICAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4NzgpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9QQ0lYU1IgICAJCUlPUDEzWFhfQVRVWF9PRkZTRVQoMHhENCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBQkFSMyAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDIwMCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBVUJBUjMgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDIwNCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBTFIzICAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDIwOCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBVFZSMyAgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDIwYykKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX0lBVVRWUjMgIAkJSU9QMTNYWF9BVFVYX09GRlNFVCgweDIxMCkKKworI2RlZmluZSBJT1AxM1hYX0FUVVhfT0lPQkFSICAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzAwKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT0lPV1RWUiAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzA0KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNQkFSMCAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzA4KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNV1RWUjAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzBjKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNQkFSMSAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzEwKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNV1RWUjEgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzE0KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNQkFSMiAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzE4KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNV1RWUjIgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzFjKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNQkFSMyAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzIwKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNV1RWUjMgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzI0KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VETUFCQVIgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzI4KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNU0lCQVIgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzJjKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT0NDQVIgICAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzMwKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT0NDRFIgICAgCQlJT1AxM1hYX0FUVVhfT0ZGU0VUKDB4MzM0KQorCisjZGVmaW5lIElPUDEzWFhfQVRVWF9BVFVDUl9PVVRfRU4JCSgxIDw8IDEpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9QQ1NSX0NFTlRSQUxfUkVTCQkoMSA8PCAyNSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1BDU1JfUF9SU1RPVVQJCSgxIDw8IDIxKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfUENTUl9PVVRfUV9CVVNZCQkoMSA8PCAxNSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1BDU1JfSU5fUV9CVVNZCQkoMSA8PCAxNCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1BDU1JfRlJFUV9PRkZTRVQJCSgxNikKKworI2RlZmluZSBJT1AxM1hYX0FUVVhfU1RBVF9QQ0lfSUZBQ0VfRVJSCSgxIDw8IDE4KQorI2RlZmluZSBJT1AxM1hYX0FUVVhfU1RBVF9WUERfQUREUgkJKDEgPDwgMTcpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9TVEFUX0lOVF9QQVJfRVJSCQkoMSA8PCAxNikKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1NUQVRfQ0ZHX1dSSVRFCQkoMSA8PCAxNSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1NUQVRfRVJSX0NPUgkJKDEgPDwgMTQpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9TVEFUX1RYX1NDRU0JCSgxIDw8IDEzKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfU1RBVF9SRUNfU0NFTQkJKDEgPDwgMTIpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9TVEFUX1BPV0VSX1RSQU4JIAkoMSA8PCAxMSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1NUQVRfVFhfU0VSUgkJKDEgPDwgMTApCisjZGVmaW5lIElPUDEzWFhfQVRVWF9TVEFUX0RFVF9QQVJfRVJSCSAJKDEgPDwgOQkpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9TVEFUX0JJU1QJCQkoMSA8PCA4CSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1NUQVRfSU5UX1JFQ19NQUJPUlQgCSgxIDw8IDcJKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfU1RBVF9SRUNfU0VSUgkJKDEgPDwgNAkpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9TVEFUX0VYVF9SRUNfTUFCT1JUIAkoMSA8PCAzCSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1NUQVRfRVhUX1JFQ19UQUJPUlQgCSgxIDw8IDIJKQorI2RlZmluZSBJT1AxM1hYX0FUVVhfU1RBVF9FWFRfU0lHX1RBQk9SVCAJKDEgPDwgMQkpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9TVEFUX01BU1RFUl9EQVRBX1BBUgkoMSA8PCAwCSkKKworI2RlZmluZSBJT1AxM1hYX0FUVVhfUENJWFNSX0JVU19OVU0JKDgpCisjZGVmaW5lIElPUDEzWFhfQVRVWF9QQ0lYU1JfREVWX05VTQkoMykKKyNkZWZpbmUgSU9QMTNYWF9BVFVYX1BDSVhTUl9GVU5DX05VTQkoMCkKKworI2RlZmluZSBJT1AxM1hYX0FUVVhfSUFMUl9ESVNBQkxFICAJMHgwMDAwMDAwMQorI2RlZmluZSBJT1AxM1hYX0FUVVhfT1VNQkFSX0VOQUJMRSAJMHg4MDAwMDAwMAorCisjZGVmaW5lIElPUDEzWFhfQVRVRV9PRkZTRVQob2ZzKQlJT1AxM1hYX1JFR19BRERSMzIoXAorCQkJCQlpb3AxM3h4X2F0dWVfcG1tcl9vZmZzZXQgKyAob2ZzKSkKKworI2RlZmluZSBJT1AxM1hYX0FUVUVfRElECQlJT1AxM1hYX1JFR19BRERSMTYoXAorCQkJCQlpb3AxM3h4X2F0dWVfcG1tcl9vZmZzZXQgKyAweDIpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9BVFVDTUQJCUlPUDEzWFhfUkVHX0FERFIxNihcCisJCQkJCWlvcDEzeHhfYXR1ZV9wbW1yX29mZnNldCArIDB4NCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0FUVVNSCQlJT1AxM1hYX1JFR19BRERSMTYoXAorCQkJCQlpb3AxM3h4X2F0dWVfcG1tcl9vZmZzZXQgKyAweDYpCisKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBQkFSMAkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDEwKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfSUFVQkFSMAkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDE0KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfSUFCQVIxCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4MTgpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9JQVVCQVIxCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4MWMpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9JQUJBUjIJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHgyMCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBVUJBUjIJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHgyNCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBTFIwCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4NDApCisjZGVmaW5lIElPUDEzWFhfQVRVRV9JQVRWUjAJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHg0NCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBVVRWUjAJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHg0OCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBTFIxCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4NGMpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9JQVRWUjEJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHg1MCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBVVRWUjEJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHg1NCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBTFIyCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4NTgpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9JQVRWUjIJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHg1YykKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBVVRWUjIJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHg2MCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1BFX0xTVFMJCUlPUDEzWFhfUkVHX0FERFIxNihcCisJCQkJCWlvcDEzeHhfYXR1ZV9wbW1yX29mZnNldCArIDB4ZTIpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9PSU9XVFZSCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4MzA0KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfT1VNQkFSMAkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDMwOCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX09VTVdUVlIwCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4MzBjKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfT1VNQkFSMQkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDMxMCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX09VTVdUVlIxCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4MzE0KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfT1VNQkFSMgkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDMxOCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX09VTVdUVlIyCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4MzFjKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfT1VNQkFSMwkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDMyMCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX09VTVdUVlIzCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4MzI0KQorCisjZGVmaW5lIElPUDEzWFhfQVRVRV9BVFVDUgkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDcwKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfUENTUgkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDc0KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfQVRVSVNSCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4NzgpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9PSU9CQVIJCUlPUDEzWFhfQVRVRV9PRkZTRVQoMHgzMDApCisjZGVmaW5lIElPUDEzWFhfQVRVRV9PQ0NBUgkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDMyYykKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX09DQ0RSCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4MzMwKQorCisjZGVmaW5lIElPUDEzWFhfQVRVRV9QSUVfU1RTCQlJT1AxM1hYX0FUVUVfT0ZGU0VUKDB4Mzg0KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfUElFX01TSwkJSU9QMTNYWF9BVFVFX09GRlNFVCgweDM4OCkKKworI2RlZmluZSBJT1AxM1hYX0FUVUVfQVRVQ1JfSVZNCQkoMSA8PCA2KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfQVRVQ1JfT1VUX0VOCSgxIDw8IDEpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9PQ0NBUl9CVVNfTlVNCSgyNCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX09DQ0FSX0RFVl9OVU0JKDE5KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfT0NDQVJfRlVOQ19OVU0JKDE2KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfT0NDQVJfRVhUX1JFRwkoOCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX09DQ0FSX1JFRwkJKDIpCisKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1BDU1JfQlVTX05VTQkoMjQpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9QQ1NSX0RFVl9OVU0JKDE5KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfUENTUl9GVU5DX05VTQkoMTYpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9QQ1NSX09VVF9RX0JVU1kJKDEgPDwgMTUpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9QQ1NSX0lOX1FfQlVTWQkoMSA8PCAxNCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1BDU1JfRU5EX1BPSU5UCSgxIDw8IDEzKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfUENTUl9MTFJCX0JVU1kJKDEgPDwgMTIpCisKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1BDU1JfQlVTX05VTV9NQVNLCQkoMHhmZikKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1BDU1JfREVWX05VTV9NQVNLCQkoMHgxZikKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1BDU1JfRlVOQ19OVU1fTUFTSwkoMHg3KQorCisjZGVmaW5lIElPUDEzWFhfQVRVRV9QQ1NSX0NPUkVfUkVTRVQJCSg4KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfUENTUl9GVU5DX05VTQkJKDE2KQorCisjZGVmaW5lIElPUDEzWFhfQVRVRV9MU1RTX1RSQUlOSU5HCQkoMSA8PCAxMSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1NUQVRfU0xPVF9QV1JfTVNHCQkoMSA8PCAyOCkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1NUQVRfUE1FCQkJKDEgPDwgMjcpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX0hPVF9QTFVHX01TRwkJKDEgPDwgMjYpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX0lWTQkJCSgxIDw8IDI1KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfU1RBVF9CSVNUCQkJKDEgPDwgMjQpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX0NGR19XUklURQkJKDEgPDwgMTgpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX1ZQRF9BRERSCQkoMSA8PCAxNykKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1NUQVRfUE9XRVJfVFJBTgkJKDEgPDwgMTYpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX0hBTFRfT05fRVJST1IJKDEgPDwgMTMpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX1JPT1RfU1lTX0VSUgkJKDEgPDwgMTIpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX1JPT1RfRVJSX01TRwkJKDEgPDwgMTEpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX1BDSV9JRkFDRV9FUlIJKDEgPDwgMTApCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX0VSUl9DT1IJCSgxIDw8IDkJKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfU1RBVF9FUlJfVU5DT1IJCSgxIDw8IDgJKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfU1RBVF9DUlMJCQkoMSA8PCA3CSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1NUQVRfTE5LX0RXTgkJKDEgPDwgNgkpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX0lOVF9SRUNfTUFCT1JUCSgxIDw8IDUJKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfU1RBVF9ERVRfUEFSX0VSUgkJKDEgPDwgNAkpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX0VYVF9SRUNfTUFCT1JUCSgxIDw8IDMJKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfU1RBVF9TSUdfVEFCT1JUCQkoMSA8PCAyCSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX1NUQVRfRVhUX1JFQ19UQUJPUlQJKDEgPDwgMQkpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9TVEFUX01BU1RFUl9EQVRBX1BBUgkoMSA8PCAwCSkKKworI2RlZmluZSBJT1AxM1hYX0FUVUVfRVNUQVRfUkVDX1VOU1VQUE9SVEVEX0NPTVBfUkVRCSgxIDw8IDMxKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfRVNUQVRfUkVDX0NPTVBMRVRFUl9BQk9SVAkJKDEgPDwgMzApCisjZGVmaW5lIElPUDEzWFhfQVRVRV9FU1RBVF9UWF9QT0lTT05FRF9UTFAJCSgxIDw8IDI5KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfRVNUQVRfVFhfUEFSX0VSUgkJCSgxIDw8IDI4KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfRVNUQVRfUkVDX1VOU1VQUE9SVEVEX1JFUQkJKDEgPDwgMjApCisjZGVmaW5lIElPUDEzWFhfQVRVRV9FU1RBVF9SRUNfRUNSQ19FUlIJCSgxIDw8IDE5KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfRVNUQVRfUkVDX01BTEZPUk1FRF9UTFAJCSgxIDw8IDE4KQorI2RlZmluZSBJT1AxM1hYX0FUVUVfRVNUQVRfVFhfUkVDRUlWRVJfT1ZFUkZMT1cJKDEgPDwgMTcpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9FU1RBVF9SRUNfVU5FWFBFQ1RFRF9DT01QCQkoMSA8PCAxNikKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0VTVEFUX0lOVF9DT01QX0FCT1JUCQkoMSA8PCAxNSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0VTVEFUX0NPTVBfVElNRU9VVAkJKDEgPDwgMTQpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9FU1RBVF9GTE9XX0NPTlRST0xfRVJSCQkoMSA8PCAxMykKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0VTVEFUX1JFQ19QT0lTT05FRF9UTFAJCSgxIDw8IDEyKQorI2RlZmluZSBJT1AxM1hYX0FUVUVfRVNUQVRfREFUQV9MTktfRVJSCQkoMSA8PCA0CSkKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0VTVEFUX1RSQUlOSU5HX0VSUgkJKDEgPDwgMAkpCisKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0lBTFJfRElTQUJMRSAgIAkJKDB4MDAwMDAwMDEpCisjZGVmaW5lIElPUDEzWFhfQVRVRV9PVU1CQVJfRU5BQkxFICAJCSgweDgwMDAwMDAwKQorI2RlZmluZSBJT1AxM1hYX0FUVV9PVU1CQVJfRlVOQ19OVU0gIAkJKDI4KQorI2RlZmluZSBJT1AxM1hYX0FUVV9PVU1CQVJfRlVOQ19OVU1fTUFTSyAgCSgweDcpCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1BRE1BIFVOSVRTPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIElPUDEzWFhfQURNQV9QSFlTX0JBU0UoY2hhbikJSU9QMTNYWF9SRUdfQUREUjMyX1BIWVMoKGNoYW4gPDwgOSkpCisjZGVmaW5lIElPUDEzWFhfQURNQV9VUFBFUl9QQShjaGFuKQkoSU9QMTNYWF9BRE1BX1BIWVNfQkFTRShjaGFuKSArIDB4YzApCisjZGVmaW5lIElPUDEzWFhfQURNQV9PRkZTRVQoY2hhbiwgb2ZzKQlJT1AxM1hYX1JFR19BRERSMzIoKGNoYW4gPDwgOSkgKyAob2ZzKSkKKworI2RlZmluZSBJT1AxM1hYX0FETUFfQUNDUihjaGFuKSAgICAgIElPUDEzWFhfQURNQV9PRkZTRVQoY2hhbiwgMHgwKQorI2RlZmluZSBJT1AxM1hYX0FETUFfQUNTUihjaGFuKSAgICAgIElPUDEzWFhfQURNQV9PRkZTRVQoY2hhbiwgMHg0KQorI2RlZmluZSBJT1AxM1hYX0FETUFfQURBUihjaGFuKSAgICAgIElPUDEzWFhfQURNQV9PRkZTRVQoY2hhbiwgMHg4KQorI2RlZmluZSBJT1AxM1hYX0FETUFfSUlQQ1IoY2hhbikgICAgIElPUDEzWFhfQURNQV9PRkZTRVQoY2hhbiwgMHgxOCkKKyNkZWZpbmUgSU9QMTNYWF9BRE1BX0lJUEFSKGNoYW4pICAgICBJT1AxM1hYX0FETUFfT0ZGU0VUKGNoYW4sIDB4MWMpCisjZGVmaW5lIElPUDEzWFhfQURNQV9JSVBVQVIoY2hhbikgICAgSU9QMTNYWF9BRE1BX09GRlNFVChjaGFuLCAweDIwKQorI2RlZmluZSBJT1AxM1hYX0FETUFfQU5EQVIoY2hhbikgICAgIElPUDEzWFhfQURNQV9PRkZTRVQoY2hhbiwgMHgyNCkKKyNkZWZpbmUgSU9QMTNYWF9BRE1BX0FEQ1IoY2hhbikgICAgICBJT1AxM1hYX0FETUFfT0ZGU0VUKGNoYW4sIDB4MjgpCisjZGVmaW5lIElPUDEzWFhfQURNQV9DQVJNRChjaGFuKSAgICAgSU9QMTNYWF9BRE1BX09GRlNFVChjaGFuLCAweDJjKQorI2RlZmluZSBJT1AxM1hYX0FETUFfQUJDUihjaGFuKSAgICAgIElPUDEzWFhfQURNQV9PRkZTRVQoY2hhbiwgMHgzMCkKKyNkZWZpbmUgSU9QMTNYWF9BRE1BX0RMQURSKGNoYW4pICAgICBJT1AxM1hYX0FETUFfT0ZGU0VUKGNoYW4sIDB4MzQpCisjZGVmaW5lIElPUDEzWFhfQURNQV9EVUFEUihjaGFuKSAgICAgSU9QMTNYWF9BRE1BX09GRlNFVChjaGFuLCAweDM4KQorI2RlZmluZSBJT1AxM1hYX0FETUFfU0xBUihzcmMsIGNoYW4pIElPUDEzWFhfQURNQV9PRkZTRVQoY2hhbiwgMHgzYyArIChzcmMgPDwzKSkKKyNkZWZpbmUgSU9QMTNYWF9BRE1BX1NVQVIoc3JjLCBjaGFuKSBJT1AxM1hYX0FETUFfT0ZGU0VUKGNoYW4sIDB4NDAgKyAoc3JjIDw8MykpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09WFNJIEJSSURHRT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBJT1AxM1hYX1hCR19CRUNTUgkJSU9QMTNYWF9SRUdfQUREUjMyKDB4MTc4YykKKyNkZWZpbmUgSU9QMTNYWF9YQkdfQkVSQVIJCUlPUDEzWFhfUkVHX0FERFIzMigweDE3OTApCisjZGVmaW5lIElPUDEzWFhfWEJHX0JFUlVBUgkJSU9QMTNYWF9SRUdfQUREUjMyKDB4MTc5NCkKKyNkZWZpbmUgaXNfYXR1ZV9vY2Nkcl9lcnJvcih4KSAJKChfX3Jhd19yZWFkbChJT1AxM1hYX1hCR19CRVJBUikgPT0gXAorCQkJCQlJT1AxM1hYX1BNTVJfVklSVF9UT19QSFlTKFwKKwkJCQkJSU9QMTNYWF9BVFVFX09DQ0RSKSlcCisJCQkJCSYmIChfX3Jhd19yZWFkbChJT1AxM1hYX1hCR19CRUNTUikgJiAxKSkKKyNkZWZpbmUgaXNfYXR1eF9vY2Nkcl9lcnJvcih4KSAJKChfX3Jhd19yZWFkbChJT1AxM1hYX1hCR19CRVJBUikgPT0gXAorCQkJCQlJT1AxM1hYX1BNTVJfVklSVF9UT19QSFlTKFwKKwkJCQkJSU9QMTNYWF9BVFVYX09DQ0RSKSlcCisJCQkJCSYmIChfX3Jhd19yZWFkbChJT1AxM1hYX1hCR19CRUNTUikgJiAxKSkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIElPUDEzWFhfUEJJX09GRlNFVChvZnMpIElPUDEzWFhfUkVHX0FERFIzMihJT1AxM1hYX1BCSV9QTU1SX09GRlNFVCArXAorCQkJCQkJCShvZnMpKQorCisjZGVmaW5lIElPUDEzWFhfUEJJX0NSCSAgICAgICAJCUlPUDEzWFhfUEJJX09GRlNFVCgweDApCisjZGVmaW5lIElPUDEzWFhfUEJJX1NSCSAgICAgICAJCUlPUDEzWFhfUEJJX09GRlNFVCgweDQpCisjZGVmaW5lIElPUDEzWFhfUEJJX0JBUjAgICAgICAJCUlPUDEzWFhfUEJJX09GRlNFVCgweDgpCisjZGVmaW5lIElPUDEzWFhfUEJJX0xSMCAgICAgICAJCUlPUDEzWFhfUEJJX09GRlNFVCgweGMpCisjZGVmaW5lIElPUDEzWFhfUEJJX0JBUjEgICAgICAJCUlPUDEzWFhfUEJJX09GRlNFVCgweDEwKQorI2RlZmluZSBJT1AxM1hYX1BCSV9MUjEgICAgICAgCQlJT1AxM1hYX1BCSV9PRkZTRVQoMHgxNCkKKworI2RlZmluZSBJT1AxM1hYX1RNUl9UQwkJCTB4MDEKKyNkZWZpbmUgSU9QMTNYWF9UTVJfRU4JCQkweDAyCisjZGVmaW5lIElPUDEzWFhfVE1SX1JFTE9BRAkJMHgwNAorI2RlZmluZSBJT1AxM1hYX1RNUl9QUklWSUxFR0VECQkweDA4CisKKyNkZWZpbmUgSU9QMTNYWF9UTVJfUkFUSU9fMV8xCQkweDAwCisjZGVmaW5lIElPUDEzWFhfVE1SX1JBVElPXzRfMQkJMHgxMAorI2RlZmluZSBJT1AxM1hYX1RNUl9SQVRJT184XzEJCTB4MjAKKyNkZWZpbmUgSU9QMTNYWF9UTVJfUkFUSU9fMTZfMQkJMHgzMAorCisjZW5kaWYgLyogX0lPUDEzWFhfSFdfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvaXE4MTM0MC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9pcTgxMzQwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4ZjhmMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvaXE4MTM0MC5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX0lRODEzNDBfSF8KKyNkZWZpbmUgX0lRODEzNDBfSF8KKworI2RlZmluZSBJUTgxMzQwX1BDRV9CQVIwICAgIElPUDEzWFhfUEJJX0xPV0VSX01FTV9SQQorI2RlZmluZSBJUTgxMzQwX1BDRV9CQVIxICAgIChJUTgxMzQwX1BDRV9CQVIwICsgMHgwMjAwMDAwMCkKKworI2RlZmluZSBJUTgxMzQwX0ZMQVNIQkFTRSAgIElRODEzNDBfUENFX0JBUjAJLyogRmxhc2ggKi8KKworI2RlZmluZSBJUTgxMzQwX1BDRV9CQVIxX09GRlNFVChhKSAoSVE4MTM0MF9QQ0VfQkFSMSArIChhKSkKKworI2RlZmluZSBJUTgxMzQwX1BSRF9DT0RFICAgIElRODEzNDBfUENFX0JBUjFfT0ZGU0VUKDApCisjZGVmaW5lIElRODEzNDBfQlJEX1NURVAgICAgSVE4MTM0MF9QQ0VfQkFSMV9PRkZTRVQoMHgxMDAwMCkKKyNkZWZpbmUgSVE4MTM0MF9DUExEX1JFViAgICBJUTgxMzQwX1BDRV9CQVIxX09GRlNFVCgweDIwMDAwKQorI2RlZmluZSBJUTgxMzQwX0xFRAkgICAgIElRODEzNDBfUENFX0JBUjFfT0ZGU0VUKDB4MzAwMDApCisjZGVmaW5lIElRODEzNDBfTEhFWAkgICAgIElRODEzNDBfUENFX0JBUjFfT0ZGU0VUKDB4NDAwMDApCisjZGVmaW5lIElRODEzNDBfUkhFWAkgICAgIElRODEzNDBfUENFX0JBUjFfT0ZGU0VUKDB4NTAwMDApCisjZGVmaW5lIElRODEzNDBfQlVaWkVSCSAgICAgSVE4MTM0MF9QQ0VfQkFSMV9PRkZTRVQoMHg2MDAwMCkKKyNkZWZpbmUgSVE4MTM0MF8zMktfTlZSQU0gICBJUTgxMzQwX1BDRV9CQVIxX09GRlNFVCgweDcwMDAwKQorI2RlZmluZSBJUTgxMzQwXzI1NktfTlZSQU0gIElRODEzNDBfUENFX0JBUjFfT0ZGU0VUKDB4ODAwMDApCisjZGVmaW5lIElRODEzNDBfUk9UQVJZX1NXICAgSVE4MTM0MF9QQ0VfQkFSMV9PRkZTRVQoMHhkMDAwMCkKKyNkZWZpbmUgSVE4MTM0MF9CQVRUX1NUQVQgICBJUTgxMzQwX1BDRV9CQVIxX09GRlNFVCgweGYwMDAwKQorI2RlZmluZSBJUTgxMzQwX0NNUF9GTFNIICAgIElRODEzNDBfUENFX0JBUjFfT0ZGU0VUKDB4MTAwMDAwMCkgLyogMTZNQiAqLworCisjZGVmaW5lIFBCSV9DRl9JREVfQkFTRSAgICAgKElRODEzNDBfQ01QX0ZMU0gpCisjZGVmaW5lIFBCSV9DRl9CQVJfQUREUiAgICAgKElPUDEzWFhfUEJJX0JBUjEpCisKKy8qIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlIE1hY2hpbmUgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgUEhZU19JTyAgICAgICAgIDB4ZmVmZmZmMDAKKyNkZWZpbmUgSU9fUEdfT0ZGU0VUICAgIDB4ZmZmZmZmMDAKKyNkZWZpbmUgQk9PVF9QQVJBTV9PRkZTRVQgIDB4MDAwMDAxMDAKKyNlbmRpZgkvKiBfSVE4MTM0MF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9pcnFzLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDJlMzVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9pcnFzLmgKQEAgLTAsMCArMSwyMDcgQEAKKyNpZm5kZWYgX0lPUDEzWFhfSVJRU19IXworI2RlZmluZSBfSU9QMTNYWF9JUlFTX0hfCisKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPiAvKiBsb2NhbF9pcnFfc2F2ZSAqLworI2luY2x1ZGUgPGFzbS9hcmNoL2lvcDEzeHguaD4gLyogaW9wMTN4eF9jcDZfKiAqLworCisvKiBJTlRQTkQwIENQNiBSMCBQYWdlIDMKKyAqLworc3RhdGljIGlubGluZSB1MzIgcmVhZF9pbnRwbmRfMCh2b2lkKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjMCwgYzMsIDAiOiI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CisKKy8qIElOVFBORDEgQ1A2IFIxIFBhZ2UgMworICovCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX2ludHBuZF8xKHZvaWQpCit7CisJdTMyIHZhbDsKKwlhc20gdm9sYXRpbGUoIm1yYyBwNiwgMCwgJTAsIGMxLCBjMywgMCI6Ij1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKworLyogSU5UUE5EMiBDUDYgUjIgUGFnZSAzCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfaW50cG5kXzIodm9pZCkKK3sKKwl1MzIgdmFsOworCWFzbSB2b2xhdGlsZSgibXJjIHA2LCAwLCAlMCwgYzIsIGMzLCAwIjoiPXIiICh2YWwpKTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBJTlRQTkQzIENQNiBSMyBQYWdlIDMKKyAqLworc3RhdGljIGlubGluZSB1MzIgcmVhZF9pbnRwbmRfMyh2b2lkKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjMywgYzMsIDAiOiI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW9wMTN4eF9jcDZfZW5hYmxlX2lycV9zYXZlKHVuc2lnbmVkIGxvbmcgKmNwX2ZsYWdzLCB1bnNpZ25lZCBsb25nICppcnFfZmxhZ3MpCit7CisJbG9jYWxfaXJxX3NhdmUoKmlycV9mbGFncyk7CisJKmNwX2ZsYWdzID0gaW9wMTN4eF9jcDZfc2F2ZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lvcDEzeHhfY3A2X2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgKmNwX2ZsYWdzLAorCXVuc2lnbmVkIGxvbmcgKmlycV9mbGFncykKK3sKKwlpb3AxM3h4X2NwNl9yZXN0b3JlKCpjcF9mbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoKmlycV9mbGFncyk7Cit9CisjZW5kaWYKKworI2RlZmluZSBJTlRCQVNFIDAKKyNkZWZpbmUgSU5UU0laRV80IDEKKworLyoKKyAqIGlvcDM0eCBjaGlwc2V0IGludGVycnVwdHMKKyAqLworI2RlZmluZSBJT1AxM1hYX0lSUSh4KQkJKElPUDEzWFhfSVJRX09GUyArICh4KSkKKworLyoKKyAqIE9uIElSUSBvciBGSVEgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9BRE1BMF9FT1QJKDApCisjZGVmaW5lIElSUV9JT1AxM1hYX0FETUEwX0VPQwkoMSkKKyNkZWZpbmUgSVJRX0lPUDEzWFhfQURNQTFfRU9UCSgyKQorI2RlZmluZSBJUlFfSU9QMTNYWF9BRE1BMV9FT0MJKDMpCisjZGVmaW5lIElSUV9JT1AxM1hYX0FETUEyX0VPVAkoNCkKKyNkZWZpbmUgSVJRX0lPUDEzWFhfQURNQTJfRU9DCSg1KQorI2RlZmluZSBJUlFfSU9QMTM0X1dBVENIRE9HCSg2KQorI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzcJKDcpCisjZGVmaW5lIElSUV9JT1AxM1hYX1RJTUVSMAkoOCkKKyNkZWZpbmUgSVJRX0lPUDEzWFhfVElNRVIxCSg5KQorI2RlZmluZSBJUlFfSU9QMTNYWF9JMkNfMAkoMTApCisjZGVmaW5lIElSUV9JT1AxM1hYX0kyQ18xCSgxMSkKKyNkZWZpbmUgSVJRX0lPUDEzWFhfTVNHCSgxMikKKyNkZWZpbmUgSVJRX0lPUDEzWFhfTVNHSUJRCSgxMykKKyNkZWZpbmUgSVJRX0lPUDEzWFhfQVRVX0lNCSgxNCkKKyNkZWZpbmUgSVJRX0lPUDEzWFhfQVRVX0JJU1QJKDE1KQorI2RlZmluZSBJUlFfSU9QMTNYWF9QUE1VCSgxNikKKyNkZWZpbmUgSVJRX0lPUDEzWFhfQ09SRVBNVQkoMTcpCisjZGVmaW5lIElSUV9JT1AxM1hYX0NPUkVDQUNIRQkoMTgpCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfMTkJKDE5KQorI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzIwCSgyMCkKKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF8yMQkoMjEpCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfMjIJKDIyKQorI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzIzCSgyMykKKyNkZWZpbmUgSVJRX0lPUDEzWFhfWElOVDAJKDI0KQorI2RlZmluZSBJUlFfSU9QMTNYWF9YSU5UMQkoMjUpCisjZGVmaW5lIElSUV9JT1AxM1hYX1hJTlQyCSgyNikKKyNkZWZpbmUgSVJRX0lPUDEzWFhfWElOVDMJKDI3KQorI2RlZmluZSBJUlFfSU9QMTNYWF9YSU5UNAkoMjgpCisjZGVmaW5lIElSUV9JT1AxM1hYX1hJTlQ1CSgyOSkKKyNkZWZpbmUgSVJRX0lPUDEzWFhfWElOVDYJKDMwKQorI2RlZmluZSBJUlFfSU9QMTNYWF9YSU5UNwkoMzEpCisJCQkJICAgICAgLyogSUlOVFNSQzEgYml0ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1hJTlQ4CSgzMikgIC8qIDAgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1hJTlQ5CSgzMykgIC8qIDEgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1hJTlQxMAkoMzQpICAvKiAyICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9YSU5UMTEJKDM1KSAgLyogMyAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfWElOVDEyCSgzNikgIC8qIDQgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1hJTlQxMwkoMzcpICAvKiA1ICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9YSU5UMTQJKDM4KSAgLyogNiAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfWElOVDE1CSgzOSkgIC8qIDcgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNDAJKDQwKSAgLyogOCAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF80MQkoNDEpICAvKiA5ICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzQyCSg0MikgIC8qIDEwICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNDMJKDQzKSAgLyogMTEgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF80NAkoNDQpICAvKiAxMiAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzQ1CSg0NSkgIC8qIDEzICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNDYJKDQ2KSAgLyogMTQgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF80NwkoNDcpICAvKiAxNSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzQ4CSg0OCkgIC8qIDE2ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNDkJKDQ5KSAgLyogMTcgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF81MAkoNTApICAvKiAxOCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9VQVJUMAkoNTEpICAvKiAxOSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9VQVJUMQkoNTIpICAvKiAyMCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9QQklFCSg1MykgIC8qIDIxICovCisjZGVmaW5lIElSUV9JT1AxM1hYX0FUVV9DUlcJKDU0KSAgLyogMjIgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfQVRVX0VSUgkoNTUpICAvKiAyMyAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9NQ1VfRVJSCSg1NikgIC8qIDI0ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX0FETUEwX0VSUgkoNTcpICAvKiAyNSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9BRE1BMV9FUlIJKDU4KSAgLyogMjYgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfQURNQTJfRVJSCSg1OSkgIC8qIDI3ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNjAJKDYwKSAgLyogMjggKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF82MQkoNjEpICAvKiAyOSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9NU0dfRVJSCSg2MikgIC8qIDMwICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNjMJKDYzKSAgLyogMzEgKi8KKwkJCQkgICAgICAvKiBJSU5UU1JDMiBiaXQgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfSU5URVJQUk9DCSg2NCkgIC8qIDAgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNjUJKDY1KSAgLyogMSAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF82NgkoNjYpICAvKiAyICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzY3CSg2NykgIC8qIDMgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNjgJKDY4KSAgLyogNCAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF82OQkoNjkpICAvKiA1ICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzcwCSg3MCkgIC8qIDYgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNzEJKDcxKSAgLyogNyAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF83MgkoNzIpICAvKiA4ICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzczCSg3MykgIC8qIDkgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNzQJKDc0KSAgLyogMTAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF83NQkoNzUpICAvKiAxMSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzc2CSg3NikgIC8qIDEyICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfNzcJKDc3KSAgLyogMTMgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF83OAkoNzgpICAvKiAxNCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzc5CSg3OSkgIC8qIDE1ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfODAJKDgwKSAgLyogMTYgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF84MQkoODEpICAvKiAxNyAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzgyCSg4MikgIC8qIDE4ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfODMJKDgzKSAgLyogMTkgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF84NAkoODQpICAvKiAyMCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzg1CSg4NSkgIC8qIDIxICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfODYJKDg2KSAgLyogMjIgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF84NwkoODcpICAvKiAyMyAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzg4CSg4OCkgIC8qIDI0ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfODkJKDg5KSAgLyogMjUgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF85MAkoOTApICAvKiAyNiAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzkxCSg5MSkgIC8qIDI3ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1JTVkRfOTIJKDkyKSAgLyogMjggKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF85MwkoOTMpICAvKiAyOSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9TSUJfRVJSCSg5NCkgIC8qIDMwICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1NSQU1fRVJSCSg5NSkgIC8qIDMxICovCisJCQkJICAgICAgLyogSUlOVFNSQzMgYml0ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX0kyQ18yCSg5NikgIC8qIDAgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX0FUVUVfQklTVAkoOTcpICAvKiAxICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9BVFVFX0NSVwkoOTgpICAvKiAyICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9BVFVFX0VSUgkoOTkpICAvKiAzICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9JTVUJKDEwMCkgLyogNCAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF8xMDEJKDEwMSkgLyogNSAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfUlNWRF8xMDIJKDEwMikgLyogNiAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfVFBNSTBfT1VUCSgxMDMpIC8qIDcgICovCisjZGVmaW5lIElSUV9JT1AxM1hYX1RQTUkxX09VVAkoMTA0KSAvKiA4ICAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9UUE1JMl9PVVQJKDEwNSkgLyogOSAgKi8KKyNkZWZpbmUgSVJRX0lPUDEzWFhfVFBNSTNfT1VUCSgxMDYpIC8qIDEwICovCisjZGVmaW5lIElSUV9JT1AxM1hYX0FUVUVfSU1BCSgxMDcpIC8qIDExICovCisjZGVmaW5lIElSUV9JT1AxM1hYX0FUVUVfSU1CCSgxMDgpIC8qIDEyICovCisjZGVmaW5lIElSUV9JT1AxM1hYX0FUVUVfSU1DCSgxMDkpIC8qIDEzICovCisjZGVmaW5lIElSUV9JT1AxM1hYX0FUVUVfSU1ECSgxMTApIC8qIDE0ICovCisjZGVmaW5lIElSUV9JT1AxM1hYX01VX01TSV9UQgkoMTExKSAvKiAxNSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzExMgkoMTEyKSAvKiAxNiAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzExMwkoMTEzKSAvKiAxNyAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzExNAkoMTE0KSAvKiAxOCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzExNQkoMTE1KSAvKiAxOSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzExNgkoMTE2KSAvKiAyMCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzExNwkoMTE3KSAvKiAyMSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzExOAkoMTE4KSAvKiAyMiAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzExOQkoMTE5KSAvKiAyMyAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzEyMAkoMTIwKSAvKiAyNCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzEyMQkoMTIxKSAvKiAyNSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzEyMgkoMTIyKSAvKiAyNiAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzEyMwkoMTIzKSAvKiAyNyAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzEyNAkoMTI0KSAvKiAyOCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzEyNQkoMTI1KSAvKiAyOSAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9SU1ZEXzEyNgkoMTI2KSAvKiAzMCAqLworI2RlZmluZSBJUlFfSU9QMTNYWF9IUEkJKDEyNykgLyogMzEgKi8KKworI2RlZmluZSBOUl9JT1AxM1hYX0lSUVMJKElSUV9JT1AxM1hYX0hQSSArIDEpCisjZGVmaW5lIE5SX0lSUVMJCU5SX0lPUDEzWFhfSVJRUworCisjZW5kaWYgLyogX0lPUDEzWFhfSVJRX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L21lbW9yeS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFhMGZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9tZW1vcnkuaApAQCAtMCwwICsxLDY0IEBACisjaWZuZGVmIF9fQVNNX0FSQ0hfTUVNT1JZX0gKKyNkZWZpbmUgX19BU01fQVJDSF9NRU1PUllfSAorCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKworLyoKKyAqIFBoeXNpY2FsIERSQU0gb2Zmc2V0LgorICovCisjZGVmaW5lIFBIWVNfT0ZGU0VUCVVMKDB4MDAwMDAwMDApCisjZGVmaW5lIFRBU0tfU0laRSAgCVVMKDB4M2YwMDAwMDApCisjZGVmaW5lIFBBR0VfT0ZGU0VUCVVMKDB4NDAwMDAwMDApCisjZGVmaW5lIFRBU0tfVU5NQVBQRURfQkFTRSAoKFRBU0tfU0laRSArIDB4MDEwMDAwMDApIC8gMykKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSU9QMTNYWCkKKyNkZWZpbmUgSU9QMTNYWF9QTU1SX1ZfU1RBUlQgKElPUDEzWFhfUE1NUl9WSVJUX01FTV9CQVNFKQorI2RlZmluZSBJT1AxM1hYX1BNTVJfVl9FTkQgICAoSU9QMTNYWF9QTU1SX1ZJUlRfTUVNX0JBU0UgKyBJT1AxM1hYX1BNTVJfU0laRSkKKyNkZWZpbmUgSU9QMTNYWF9QTU1SX1BfU1RBUlQgKElPUDEzWFhfUE1NUl9QSFlTX01FTV9CQVNFKQorI2RlZmluZSBJT1AxM1hYX1BNTVJfUF9FTkQgICAoSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UgKyBJT1AxM1hYX1BNTVJfU0laRSkKKworLyoKKyAqIFZpcnR1YWwgdmlldyA8LT4gUENJIERNQSB2aWV3IG1lbW9yeSBhZGRyZXNzIHRyYW5zbGF0aW9ucworICogdmlydF90b19idXM6IFVzZWQgdG8gdHJhbnNsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYW4KKyAqCQlhZGRyZXNzIHN1aXRhYmxlIHRvIGJlIHBhc3NlZCB0byBzZXRfZG1hX2FkZHIKKyAqIGJ1c190b192aXJ0OiBVc2VkIHRvIGNvbnZlcnQgYW4gYWRkcmVzcyBmb3IgRE1BIG9wZXJhdGlvbnMKKyAqCQl0byBhbiBhZGRyZXNzIHRoYXQgdGhlIGtlcm5lbCBjYW4gdXNlLgorICovCisKKy8qIFJBTSBoYXMgMToxIG1hcHBpbmcgb24gdGhlIFBDSWUveCBCdXNzZXMgKi8KKyNkZWZpbmUgX192aXJ0X3RvX2J1cyh4KQkoX192aXJ0X3RvX3BoeXMoeCkpCisjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkgICAgKF9fcGh5c190b192aXJ0KHgpKQorCisjZGVmaW5lIHZpcnRfdG9fbGJ1cyh4KSAJCQkJCSAgIFwKKygoICgodm9pZCopKHgpID49ICh2b2lkKilJT1AxM1hYX1BNTVJfVl9TVEFSVCkgJiYJCSAgIFwKKygodm9pZCopKHgpIDwgKHZvaWQqKUlPUDEzWFhfUE1NUl9WX0VORCkgKSA/IAkJCSAgIFwKKygoeCkgLSBJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSArIElPUDEzWFhfUE1NUl9QSFlTX01FTV9CQVNFKSA6IFwKKygoeCkgLSBQQUdFX09GRlNFVCArIFBIWVNfT0ZGU0VUKSkKKworI2RlZmluZSBsYnVzX3RvX3ZpcnQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKygoICgoeCkgPj0gSU9QMTNYWF9QTU1SX1BfU1RBUlQpICYmICgoeCkgPCBJT1AxM1hYX1BNTVJfUF9FTkQpICkgPyBcCisoKHgpIC0gSU9QMTNYWF9QTU1SX1BIWVNfTUVNX0JBU0UgKyBJT1AxM1hYX1BNTVJfVklSVF9NRU1fQkFTRSApIDogXAorKCh4KSAtIFBIWVNfT0ZGU0VUICsgUEFHRV9PRkZTRVQpKQorCisvKiBEZXZpY2UgaXMgYW4gbGJ1cyBkZXZpY2UgaWYgaXQgaXMgb24gdGhlIHBsYXRmb3JtIGJ1cyBvZiB0aGUgSU9QMTNYWCAqLworI2RlZmluZSBpc19sYnVzX2RldmljZShkZXYpIChkZXYgJiZcCisJCQkgICAgIChzdHJuY21wKGRldi0+YnVzLT5uYW1lLCAicGxhdGZvcm0iLCA4KSA9PSAwKSkKKworI2RlZmluZSBfX2FyY2hfcGFnZV90b19kbWEoZGV2LCBwYWdlKQkJCQkJXAorKHtpc19sYnVzX2RldmljZShkZXYpID8gKGRtYV9hZGRyX3QpdmlydF90b19sYnVzKHBhZ2VfYWRkcmVzcyhwYWdlKSkgOiBcCisoZG1hX2FkZHJfdClfX3ZpcnRfdG9fYnVzKHBhZ2VfYWRkcmVzcyhwYWdlKSk7fSkKKworI2RlZmluZSBfX2FyY2hfZG1hX3RvX3ZpcnQoZGV2LCBhZGRyKSBcCisoe2lzX2xidXNfZGV2aWNlKGRldikgPyBsYnVzX3RvX3ZpcnQoYWRkcikgOiBfX2J1c190b192aXJ0KGFkZHIpO30pCisKKyNkZWZpbmUgX19hcmNoX3ZpcnRfdG9fZG1hKGRldiwgYWRkcikgXAorKHtpc19sYnVzX2RldmljZShkZXYpID8gdmlydF90b19sYnVzKGFkZHIpIDogX192aXJ0X3RvX2J1cyhhZGRyKTt9KQorCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfSU9QMTNYWCAqLworI2VuZGlmIC8qICFBU1NFTUJMWSAqLworCisjZGVmaW5lIFBGTl9UT19OSUQoYWRkcikJKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9wY2kuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0MWYzMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvcGNpLmgKQEAgLTAsMCArMSw1NyBAQAorI2lmbmRlZiBfSU9QMTNYWF9QQ0lfSF8KKyNkZWZpbmUgX0lPUDEzWFhfUENJX0hfCisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdHJ1Y3QgcGNpX3N5c19kYXRhOworc3RydWN0IGh3X3BjaTsKK2ludCBpb3AxM3h4X3BjaV9zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CitzdHJ1Y3QgcGNpX2J1cyAqaW9wMTN4eF9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKik7Cit2b2lkIGlvcDEzeHhfYXR1X3NlbGVjdChzdHJ1Y3QgaHdfcGNpICpwbGF0X3BjaSk7Cit2b2lkIGlvcDEzeHhfcGNpX2luaXQodm9pZCk7Cit2b2lkIGlvcDEzeHhfbWFwX3BjaV9tZW1vcnkodm9pZCk7CisKKyNkZWZpbmUgSU9QX1BDSV9TVEFUVVNfRVJST1IgKFBDSV9TVEFUVVNfUEFSSVRZIHwJICAgICBcCisJCQkgICAgICAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUIHwgXAorCQkJICAgICAgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCB8IFwKKwkJCSAgICAgICBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQgfCBcCisJCQkgICAgICAgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIHwgXAorCQkJICAgICAgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiB8IFwKKwkgCQkgICAgICAgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkpCisKKyNkZWZpbmUgSU9QMTNYWF9BVFVFX0FUVUlTUl9FUlJPUiAoSU9QMTNYWF9BVFVFX1NUQVRfSEFMVF9PTl9FUlJPUiB8ICBcCisJCQkJICAgIElPUDEzWFhfQVRVRV9TVEFUX1JPT1RfU1lTX0VSUiB8ICAgXAorCQkJCSAgICBJT1AxM1hYX0FUVUVfU1RBVF9QQ0lfSUZBQ0VfRVJSIHwgIFwKKwkJCQkgICAgSU9QMTNYWF9BVFVFX1NUQVRfRVJSX0NPUiB8CSAgICAgICBcCisJCQkJICAgIElPUDEzWFhfQVRVRV9TVEFUX0VSUl9VTkNPUiB8ICAgICAgXAorCQkJCSAgICBJT1AxM1hYX0FUVUVfU1RBVF9DUlMgfAkgICAgICAgXAorCQkJCSAgICBJT1AxM1hYX0FUVUVfU1RBVF9ERVRfUEFSX0VSUiB8ICAgIFwKKwkJCQkgICAgSU9QMTNYWF9BVFVFX1NUQVRfRVhUX1JFQ19NQUJPUlQgfCBcCisJCQkJICAgIElPUDEzWFhfQVRVRV9TVEFUX1NJR19UQUJPUlQgfCAgICAgXAorCQkJCSAgICBJT1AxM1hYX0FUVUVfU1RBVF9FWFRfUkVDX1RBQk9SVCB8IFwKKwkJCQkgICAgSU9QMTNYWF9BVFVFX1NUQVRfTUFTVEVSX0RBVEFfUEFSKQorCisjZGVmaW5lIElPUDEzWFhfQVRVWF9BVFVJU1JfRVJST1IgKElPUDEzWFhfQVRVWF9TVEFUX1RYX1NDRU0gfCAgICAgICAgXAorCQkJCSAgICBJT1AxM1hYX0FUVVhfU1RBVF9SRUNfU0NFTSB8ICAgICAgIFwKKwkJCQkgICAgSU9QMTNYWF9BVFVYX1NUQVRfVFhfU0VSUiB8CSAgICAgICBcCisJCQkJICAgIElPUDEzWFhfQVRVWF9TVEFUX0RFVF9QQVJfRVJSIHwgICAgXAorCQkJCSAgICBJT1AxM1hYX0FUVVhfU1RBVF9JTlRfUkVDX01BQk9SVCB8IFwKKwkJCQkgICAgSU9QMTNYWF9BVFVYX1NUQVRfUkVDX1NFUlIgfCAgICAgICBcCisJCQkJICAgIElPUDEzWFhfQVRVWF9TVEFUX0VYVF9SRUNfTUFCT1JUIHwgXAorCQkJCSAgICBJT1AxM1hYX0FUVVhfU1RBVF9FWFRfUkVDX1RBQk9SVCB8IFwKKwkJCQkgICAgSU9QMTNYWF9BVFVYX1NUQVRfRVhUX1NJR19UQUJPUlQgfCBcCisJCQkJICAgIElPUDEzWFhfQVRVWF9TVEFUX01BU1RFUl9EQVRBX1BBUikKKworLyogUENJIGludGVycnVwdHMKKyAqLworI2RlZmluZSBBVFVYX0lOVEEgSVJRX0lPUDEzWFhfWElOVDAKKyNkZWZpbmUgQVRVWF9JTlRCIElSUV9JT1AxM1hYX1hJTlQxCisjZGVmaW5lIEFUVVhfSU5UQyBJUlFfSU9QMTNYWF9YSU5UMgorI2RlZmluZSBBVFVYX0lOVEQgSVJRX0lPUDEzWFhfWElOVDMKKworI2RlZmluZSBBVFVFX0lOVEEgSVJRX0lPUDEzWFhfQVRVRV9JTUEKKyNkZWZpbmUgQVRVRV9JTlRCIElSUV9JT1AxM1hYX0FUVUVfSU1CCisjZGVmaW5lIEFUVUVfSU5UQyBJUlFfSU9QMTNYWF9BVFVFX0lNQworI2RlZmluZSBBVFVFX0lOVEQgSVJRX0lPUDEzWFhfQVRVRV9JTUQKKworI2VuZGlmIC8qIF9JT1AxM1hYX1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzYTYyNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvc3lzdGVtLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvc3lzdGVtLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGFzbS9hcmNoL2lvcDEzeHguaD4KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2lkbGUodm9pZCkKK3sKKwljcHVfZG9faWRsZSgpOworfQorCisvKiBXRFRDUiBDUDYgUjcgUGFnZSA5ICovCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX3dkdGNyKHZvaWQpCit7CisJdTMyIHZhbDsKKwlhc20gdm9sYXRpbGUoIm1yYyBwNiwgMCwgJTAsIGM3LCBjOSwgMCI6Ij1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93ZHRjcih1MzIgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibWNyIHA2LCAwLCAlMCwgYzcsIGM5LCAwIjo6InIiICh2YWwpKTsKK30KKworLyogV0RUU1IgQ1A2IFI4IFBhZ2UgOSAqLworc3RhdGljIGlubGluZSB1MzIgcmVhZF93ZHRzcih2b2lkKQoreworCXUzMiB2YWw7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDYsIDAsICUwLCBjOCwgYzksIDAiOiI9ciIgKHZhbCkpOworCXJldHVybiB2YWw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfd2R0c3IodTMyIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1jciBwNiwgMCwgJTAsIGM4LCBjOSwgMCI6OiJyIiAodmFsKSk7Cit9CisKKyNkZWZpbmUgSU9QMTNYWF9XRFRDUl9FTl9BUk0JMHgxZTFlMWUxZQorI2RlZmluZSBJT1AxM1hYX1dEVENSX0VOCTB4ZTFlMWUxZTEKKyNkZWZpbmUgSU9QMTNYWF9XRFRDUl9ESVNfQVJNCTB4MWYxZjFmMWYKKyNkZWZpbmUgSU9QMTNYWF9XRFRDUl9ESVMJMHhmMWYxZjFmMQorI2RlZmluZSBJT1AxM1hYX1dEVFNSX1dSSVRFX0VOCSgxIDw8IDMxKQorI2RlZmluZSBJT1AxM1hYX1dEVENSX0lCX1JFU0VUCSgxIDw8IDApCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZXNldChjaGFyIG1vZGUpCit7CisJLyoKKwkgKiBSZXNldCB0aGUgaW50ZXJuYWwgYnVzICh3YXJuaW5nIGJvdGggY29yZXMgYXJlIHJlc2V0KQorCSAqLworCXUzMiBjcF9mbGFncyA9IGlvcDEzeHhfY3A2X3NhdmUoKTsKKwl3cml0ZV93ZHRjcihJT1AxM1hYX1dEVENSX0VOX0FSTSk7CisJd3JpdGVfd2R0Y3IoSU9QMTNYWF9XRFRDUl9FTik7CisJd3JpdGVfd2R0c3IoSU9QMTNYWF9XRFRTUl9XUklURV9FTiB8IElPUDEzWFhfV0RUQ1JfSUJfUkVTRVQpOworCXdyaXRlX3dkdGNyKDB4MTAwMCk7CisJaW9wMTN4eF9jcDZfcmVzdG9yZShjcF9mbGFncyk7CisKKwlmb3IoOzspOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC90aW1leC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzUxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L3RpbWV4LmgKQEAgLTAsMCArMSwzIEBACisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFICgxMDAgKiBIWikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvdW5jb21wcmVzcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC91bmNvbXByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1MjVkNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDEzeHgvdW5jb21wcmVzcy5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjZGVmaW5lIFVBUlRfQkFTRSAoKHZvbGF0aWxlIHUzMiAqKUlPUDEzWFhfVUFSVDFfUEhZUykKKyNkZWZpbmUgVFhfRE9ORSAoVUFSVF9MU1JfVEVNVCB8IFVBUlRfTFNSX1RIUkUpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRjKGNoYXIgYykKK3sKKwl3aGlsZSAoKFVBUlRfQkFTRVtVQVJUX0xTUl0gJiBUWF9ET05FKSAhPSBUWF9ET05FKQorCQljcHVfcmVsYXgoKTsKKwlVQVJUX0JBU0VbVUFSVF9UWF0gPSBjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2godm9pZCkKK3sKK30KKworLyoKKyAqIG5vdGhpbmcgdG8gZG8KKyAqLworI2RlZmluZSBhcmNoX2RlY29tcF9zZXR1cCgpCisjZGVmaW5lIGFyY2hfZGVjb21wX3dkb2coKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC92bWFsbG9jLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pb3AxM3h4L3ZtYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTM0NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wMTN4eC92bWFsbG9jLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9WTUFMTE9DX0hfCisjZGVmaW5lIF9WTUFMTE9DX0hfCisjZGVmaW5lIFZNQUxMT0NfRU5EIAkweGZhMDAwMDAwVUwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L25zbHUyLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvbnNsdTIuaAppbmRleCA0MjgxODM4Li42YjQzN2Y3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvbnNsdTIuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvbnNsdTIuaApAQCAtNzYsNiArNzYsNyBAQAogCiAjZGVmaW5lIE5TTFUyX0dQSU9fQlVaWgkJNAogI2RlZmluZSBOU0xVMl9CWl9CTQkJKDFMIDw8IE5TTFUyX0dQSU9fQlVaWikKKwogLyogTEVEcyAqLwogCiAjZGVmaW5lIE5TTFUyX0xFRF9SRUQJCU5TTFUyX0dQSU8wCkBAIC04NCw4ICs4NSw4IEBACiAjZGVmaW5lIE5TTFUyX0xFRF9SRURfQk0JKDFMIDw8IE5TTFUyX0xFRF9SRUQpCiAjZGVmaW5lIE5TTFUyX0xFRF9HUk5fQk0JKDFMIDw8IE5TTFUyX0xFRF9HUk4pCiAKLSNkZWZpbmUgTlNMVTJfTEVEX0RJU0sxCQlOU0xVMl9HUElPMgotI2RlZmluZSBOU0xVMl9MRURfRElTSzIJCU5TTFUyX0dQSU8zCisjZGVmaW5lIE5TTFUyX0xFRF9ESVNLMQkJTlNMVTJfR1BJTzMKKyNkZWZpbmUgTlNMVTJfTEVEX0RJU0syCQlOU0xVMl9HUElPMgogCiAjZGVmaW5lIE5TTFUyX0xFRF9ESVNLMV9CTQkoMUwgPDwgTlNMVTJfR1BJTzIpCiAjZGVmaW5lIE5TTFUyX0xFRF9ESVNLMl9CTQkoMUwgPDwgTlNMVTJfR1BJTzMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvcGxhdGZvcm0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9wbGF0Zm9ybS5oCmluZGV4IDhkMTBhOTEuLmFiMTk0ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9wbGF0Zm9ybS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9wbGF0Zm9ybS5oCkBAIC04Niw2ICs4NiwxOSBAQAogCXVuc2lnbmVkIGxvbmcgc2NsX3BpbjsKIH07CiAKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlIGEgbWVhbnMgZm9yIHRoZSBib2FyZCBzZXR1cCBjb2RlCisgKiB0byBnaXZlIGluZm9ybWF0aW9uIHRvIHRoIHBhdGFfaXhwNHh4IGRyaXZlci4gSXQgaXMKKyAqIHBhc3NlZCBhcyBwbGF0Zm9ybV9kYXRhLgorICovCitzdHJ1Y3QgaXhwNHh4X3BhdGFfZGF0YSB7CisJdm9sYXRpbGUgdTMyCSpjczBfY2ZnOworCXZvbGF0aWxlIHUzMgkqY3MxX2NmZzsKKwl1bnNpZ25lZCBsb25nCWNzMF9iaXRzOworCXVuc2lnbmVkIGxvbmcJY3MxX2JpdHM7CisJdm9pZCBfX2lvbWVtCSpjczA7CisJdm9pZCBfX2lvbWVtCSpjczE7Cit9OwogCiBzdHJ1Y3Qgc3lzX3RpbWVyOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvdWRjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvdWRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkZWMzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvdWRjLmgKQEAgLTAsMCArMSw4IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L3VkYy5oCisgKgorICovCisjaW5jbHVkZSA8YXNtL21hY2gvdWRjX3B4YTJ4eC5oPgorCitleHRlcm4gdm9pZCBpeHA0eHhfc2V0X3VkY19pbmZvKHN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbyAqaW5mbyk7CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWw3MjAwL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1sNzIwMC9pby5oCmluZGV4IGQ3NDRkOTcuLjY0NWRiZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWw3MjAwL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbDcyMDAvaW8uaApAQCAtMTcsNTkgKzE3LDExIEBACiAvKgogICogVGhlcmUgYXJlIG5vdCByZWFsIElTQSBub3IgUENJIGJ1c2VzLCBzbyB3ZSBmYWtlIGl0LgogICovCi0jZGVmaW5lIF9faW9fcGNpKGEpCQkoKHZvaWQgX19pb21lbSAqKShQQ0lPX0JBU0UgKyAoYSkpKQorc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKl9faW8odW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopYWRkcjsKK30KKyNkZWZpbmUgX19pbyhhKQlfX2lvKGEpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCiAKLSNkZWZpbmUgX19pb2FkZHIocCkgICAgICAgICAgICAgX19pb19wY2kocCkKLQotLyoKLSAqIEdlbmVyaWMgdmlydHVhbCByZWFkL3dyaXRlCi0gKi8KLSNkZWZpbmUgX19hcmNoX2dldGIoYSkgICAgICAgICAgKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShhKSkKLSNkZWZpbmUgX19hcmNoX2dldGwoYSkgICAgICAgICAgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICAqKShhKSkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19hcmNoX2dldHcodW5zaWduZWQgbG9uZyBhKQotewotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGRyaCAgICAlMCwgWyUxLCAjMF0gICAgQCBnZXR3IgotCQk6ICI9JnIiICh2YWx1ZSkKLQkJOiAiciIgKGEpIDogImNjIik7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi0jZGVmaW5lIF9fYXJjaF9wdXRiKHYsYSkgICAgICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoYSkgPSAodikpCi0jZGVmaW5lIF9fYXJjaF9wdXRsKHYsYSkgICAgICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAgKikoYSkgPSAodikpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfcHV0dyh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgYSkKLXsKLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN0cmggICAgJTAsIFslMSwgIzBdICAgIEAgcHV0dyIKLSAgICAgICAgICAgICAgICA6IDogInIiICh2YWx1ZSksICJyIiAoYSkgOiAiY2MiKTsKLX0KLQotLyoKLSAqIFRyYW5zbGF0ZWQgYWRkcmVzcyBJTyBmdW5jdGlvbnMKLSAqCi0gKiBJTyBhZGRyZXNzIGhhcyBhbHJlYWR5IGJlZW4gdHJhbnNsYXRlZCB0byBhIHZpcnR1YWwgYWRkcmVzcwotICovCi0jZGVmaW5lIG91dGJfdCh2LHApCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHApID0gKHYpKQotI2RlZmluZSBpbmJfdChwKQkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwKSkKLSNkZWZpbmUgb3V0d190KHYscCkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShwKSA9ICh2KSkKLSNkZWZpbmUgaW53X3QocCkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShwKSkKLSNkZWZpbmUgb3V0bF90KHYscCkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikocCkgPSAodikpCi0jZGVmaW5lIGlubF90KHApCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKHApKQotCi0vKgotICogRklYTUUgLSBUaGVzZSBhcmUgdG8gYWxsb3cgZm9yIGxpbmtpbmcuIE9uIGFsbCB0aGUgb3RoZXIKLSAqICAgICAgICAgQVJNIHBsYXRmb3JtcywgdGhlIGVudGlyZSBJTyBzcGFjZSBpcyBjb250aWd1b3VzLgotICogICAgICAgICBUaGUgNzIwMCBoYXMgdGhyZWUgc2VwYXJhdGUgSU8gc3BhY2VzLiBUaGUgYmVsb3cKLSAqICAgICAgICAgbWFjcm9zIHdpbGwgZXZlbnR1YWxseSBiZWNvbWUgbW9yZSBpbnZvbHZlZC4gVXNlCi0gKiAgICAgICAgIHdpdGggY2F1dGlvbiBhbmQgZG9uJ3QgYmUgc3VycHJpc2VkIGJ5IGtlcm5lbCBvb3BzZXMhISEKLSAqLwotI2RlZmluZSBpbmIocCkJCSAJaW5iX3QocCkKLSNkZWZpbmUgaW53KHApCSAJCWlud190KHApCi0jZGVmaW5lIGlubChwKQkgCQlpbmxfdChwKQotI2RlZmluZSBvdXRiKHYscCkJCW91dGJfdCh2LHApCi0jZGVmaW5lIG91dHcodixwKQkJb3V0d190KHYscCkKLSNkZWZpbmUgb3V0bCh2LHApCQlvdXRsX3QodixwKQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWxoN2E0MHgvbWVtb3J5LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1saDdhNDB4L21lbW9yeS5oCmluZGV4IDlmMWE1OGMuLjliMGM4MDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWxoN2E0MHgvbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbGg3YTQweC9tZW1vcnkuaApAQCAtNTgsMTggKzU4LDYgQEAKICNlbmRpZgogCiAvKgotICogR2l2ZW4gYSBrYWRkciwgQUREUl9UT19NQVBCQVNFIGZpbmRzIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJuIHRoZSBtZW1fbWFwIG9mIHRoYXQgbm9kZS4KLSAqLwotIyBkZWZpbmUgQUREUl9UT19NQVBCQVNFKGthZGRyKQlOT0RFX01FTV9NQVAoS1ZBRERSX1RPX05JRChrYWRkcikpCi0KLS8qCi0gKiBHaXZlbiBhIHBhZ2UgZnJhbWUgbnVtYmVyLCBmaW5kIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJuIHRoZSBtZW1fbWFwIG9mIHRoYXQgbm9kZS4KLSAqLwotIyBkZWZpbmUgUEZOX1RPX01BUEJBU0UocGZuKQlOT0RFX01FTV9NQVAoUEZOX1RPX05JRChwZm4pKQotCi0vKgogICogR2l2ZW4gYSBrYWRkciwgTE9DQUxfTUVNX01BUCBmaW5kcyB0aGUgb3duaW5nIG5vZGUgb2YgdGhlIG1lbW9yeQogICogYW5kIHJldHVybnMgdGhlIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHBhZ2UgaW4gdGhlCiAgKiBub2RlJ3MgbWVtX21hcC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJkYS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcmRhLmgKaW5kZXggODA1YWUzNS4uMzQ1YTY0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcmRhLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcmRhLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAkvKiBWZXJ5IHNwZWNpZmljIHRvIHRoZSBuZWVkcyBvZiBzb21lIHBsYXRmb3JtcyAoaDMsaDQpCiAJICogaGF2aW5nIGNhbGxzIHdoaWNoIGNhbiBzbGVlcCBpbiBpcmRhX3NldF9zcGVlZC4KIAkgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZ3Bpb19leHBhOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZ3Bpb19leHBhOwogCWludCByeF9jaGFubmVsOwogCWludCB0eF9jaGFubmVsOwogCXVuc2lnbmVkIGxvbmcgZGVzdF9zdGFydDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXBueDQwMDgvaTJjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1wbng0MDA4L2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZThkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1wbng0MDA4L2kyYy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBQTlg0MDA4LXNwZWNpZmljIHR3ZWFrcyBmb3IgSTJDIElQMzIwNCBibG9jaworICoKKyAqIEF1dGhvcjogVml0YWx5IFdvb2wgPHZ3b29sQHJ1Lm12aXN0YS5jb20+CisgKgorICogMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfSTJDX0hfXworI2RlZmluZSBfX0FTTV9BUkNIX0kyQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK2VudW0geworCW1zdGF0dXNfdGRpID0gMHgwMDAwMDAwMSwKKwltc3RhdHVzX2FmaSA9IDB4MDAwMDAwMDIsCisJbXN0YXR1c19uYWkgPSAweDAwMDAwMDA0LAorCW1zdGF0dXNfZHJtaSA9IDB4MDAwMDAwMDgsCisJbXN0YXR1c19hY3RpdmUgPSAweDAwMDAwMDIwLAorCW1zdGF0dXNfc2NsID0gMHgwMDAwMDA0MCwKKwltc3RhdHVzX3NkYSA9IDB4MDAwMDAwODAsCisJbXN0YXR1c19yZmYgPSAweDAwMDAwMTAwLAorCW1zdGF0dXNfcmZlID0gMHgwMDAwMDIwMCwKKwltc3RhdHVzX3RmZiA9IDB4MDAwMDA0MDAsCisJbXN0YXR1c190ZmUgPSAweDAwMDAwODAwLAorfTsKKworZW51bSB7CisJbWNudHJsX3RkaWUgPSAweDAwMDAwMDAxLAorCW1jbnRybF9hZmllID0gMHgwMDAwMDAwMiwKKwltY250cmxfbmFpZSA9IDB4MDAwMDAwMDQsCisJbWNudHJsX2RybWllID0gMHgwMDAwMDAwOCwKKwltY250cmxfZGFpZSA9IDB4MDAwMDAwMjAsCisJbWNudHJsX3JmZmllID0gMHgwMDAwMDA0MCwKKwltY250cmxfdGZmaWUgPSAweDAwMDAwMDgwLAorCW1jbnRybF9yZXNldCA9IDB4MDAwMDAxMDAsCisJbWNudHJsX2NkYm1vZGUgPSAweDAwMDAwNDAwLAorfTsKKworZW51bSB7CisJcndfYml0ID0gMSA8PCAwLAorCXN0YXJ0X2JpdCA9IDEgPDwgOCwKKwlzdG9wX2JpdCA9IDEgPDwgOSwKK307CisKKyNkZWZpbmUgSTJDX1JFR19SWChhKQkoKGEpLT5pb2FkZHIpCQkvKiBSeCBGSUZPIHJlZyAoUk8pICovCisjZGVmaW5lIEkyQ19SRUdfVFgoYSkJKChhKS0+aW9hZGRyKQkJLyogVHggRklGTyByZWcgKFdPKSAqLworI2RlZmluZSBJMkNfUkVHX1NUUyhhKQkoKGEpLT5pb2FkZHIgKyAweDA0KQkvKiBTdGF0dXMgcmVnIChSTykgKi8KKyNkZWZpbmUgSTJDX1JFR19DVEwoYSkJKChhKS0+aW9hZGRyICsgMHgwOCkJLyogQ3RsIHJlZyAqLworI2RlZmluZSBJMkNfUkVHX0NLTChhKQkoKGEpLT5pb2FkZHIgKyAweDBjKQkvKiBDbG9jayBkaXZpZGVyIGxvdyAqLworI2RlZmluZSBJMkNfUkVHX0NLSChhKQkoKGEpLT5pb2FkZHIgKyAweDEwKQkvKiBDbG9jayBkaXZpZGVyIGhpZ2ggKi8KKyNkZWZpbmUgSTJDX1JFR19BRFIoYSkJKChhKS0+aW9hZGRyICsgMHgxNCkJLyogSTJDIGFkZHJlc3MgKi8KKyNkZWZpbmUgSTJDX1JFR19SRkwoYSkJKChhKS0+aW9hZGRyICsgMHgxOCkJLyogUnggRklGTyBsZXZlbCAoUk8pICovCisjZGVmaW5lIEkyQ19SRUdfVEZMKGEpCSgoYSktPmlvYWRkciArIDB4MWMpCS8qIFR4IEZJRk8gbGV2ZWwgKFJPKSAqLworI2RlZmluZSBJMkNfUkVHX1JYQihhKQkoKGEpLT5pb2FkZHIgKyAweDIwKQkvKiBOdW0gb2YgYnl0ZXMgUngtZWQgKFJPKSAqLworI2RlZmluZSBJMkNfUkVHX1RYQihhKQkoKGEpLT5pb2FkZHIgKyAweDI0KQkvKiBOdW0gb2YgYnl0ZXMgVHgtZWQgKFJPKSAqLworI2RlZmluZSBJMkNfUkVHX1RYUyhhKQkoKGEpLT5pb2FkZHIgKyAweDI4KQkvKiBUeCBzbGF2ZSBGSUZPIChSTykgKi8KKyNkZWZpbmUgSTJDX1JFR19TVEZMKGEpCSgoYSktPmlvYWRkciArIDB4MmMpCS8qIFR4IHNsYXZlIEZJRk8gbGV2ZWwgKFJPKSAqLworCisjZGVmaW5lIEhDTEtfTUhaCQkxMworI2RlZmluZSBJMkNfQ0hJUF9OQU1FCQkiUE5YNDAwOC1JMkMiCisKKyNlbmRpZgkJCQkvKiBfX0FTTV9BUkNIX0kyQ19IX19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaXJxcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2lycXMuaAppbmRleCBmM2JjNzBlLi42N2VkNDM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaXJxcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9pcnFzLmgKQEAgLTczLDcgKzczLDcgQEAKICNkZWZpbmUgSVJRX1RPX0dQSU8oaSkJKCgoaSkgPCBJUlFfR1BJTygyKSkgPyAoKGkpIC0gSVJRX0dQSU8wKSA6IElSUV9UT19HUElPXzJfeChpKSkKIAogI2lmIGRlZmluZWQoQ09ORklHX1BYQTI1eCkKLSNkZWZpbmUgUFhBX0xBU1RfR1BJTwk4MAorI2RlZmluZSBQWEFfTEFTVF9HUElPCTg0CiAjZWxpZiBkZWZpbmVkKENPTkZJR19QWEEyN3gpCiAjZGVmaW5lIFBYQV9MQVNUX0dQSU8JMTI3CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tZW1vcnkuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9tZW1vcnkuaAppbmRleCBlYWY2ZDQzLi5lMTdmOTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL21lbW9yeS5oCkBAIC0yNyw3ICsyNyw2IEBACiAjZGVmaW5lIF9fdmlydF90b19idXMoeCkJIF9fdmlydF90b19waHlzKHgpCiAjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJIF9fcGh5c190b192aXJ0KHgpCiAKLSNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCiAvKgogICogVGhlIG5vZGVzIGFyZSBtYXRjaGVkIHdpdGggdGhlIHBoeXNpY2FsIFNEUkFNIGJhbmtzIGFzIGZvbGxvd3M6CiAgKgpAQCAtMzUsMzggKzM0LDkgQEAKICAqIAlub2RlIDE6ICAweGE0MDAwMDAwLTB4YTdmZmZmZmYJLS0+ICAweGM0MDAwMDAwLTB4YzdmZmZmZmYKICAqIAlub2RlIDI6ICAweGE4MDAwMDAwLTB4YWJmZmZmZmYJLS0+ICAweGM4MDAwMDAwLTB4Y2JmZmZmZmYKICAqIAlub2RlIDM6ICAweGFjMDAwMDAwLTB4YWZmZmZmZmYJLS0+ICAweGNjMDAwMDAwLTB4Y2ZmZmZmZmYKKyAqCisgKiBUaGlzIG5lZWRzIGEgbm9kZSBtZW0gc2l6ZSBvZiAyNiBiaXRzLgogICovCi0KLS8qCi0gKiBHaXZlbiBhIGtlcm5lbCBhZGRyZXNzLCBmaW5kIHRoZSBob21lIG5vZGUgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5LgotICovCi0jZGVmaW5lIEtWQUREUl9UT19OSUQoYWRkcikgKCgodW5zaWduZWQgbG9uZykoYWRkcikgLSBQQUdFX09GRlNFVCkgPj4gMjYpCi0KLS8qCi0gKiBHaXZlbiBhIHBhZ2UgZnJhbWUgbnVtYmVyLCBjb252ZXJ0IGl0IHRvIGEgbm9kZSBpZC4KLSAqLwotI2RlZmluZSBQRk5fVE9fTklEKHBmbikJCSgoKHBmbikgLSBQSFlTX1BGTl9PRkZTRVQpID4+ICgyNiAtIFBBR0VfU0hJRlQpKQotCi0vKgotICogR2l2ZW4gYSBrYWRkciwgQUREUl9UT19NQVBCQVNFIGZpbmRzIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJucyB0aGUgbWVtX21hcCBvZiB0aGF0IG5vZGUuCi0gKi8KLSNkZWZpbmUgQUREUl9UT19NQVBCQVNFKGthZGRyKQlOT0RFX01FTV9NQVAoS1ZBRERSX1RPX05JRChrYWRkcikpCi0KLS8qCi0gKiBHaXZlbiBhIHBhZ2UgZnJhbWUgbnVtYmVyLCBmaW5kIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5Ci0gKiBhbmQgcmV0dXJucyB0aGUgbWVtX21hcCBvZiB0aGF0IG5vZGUuCi0gKi8KLSNkZWZpbmUgUEZOX1RPX01BUEJBU0UocGZuKQlOT0RFX01FTV9NQVAoUEZOX1RPX05JRChwZm4pKQotCi0vKgotICogR2l2ZW4gYSBrYWRkciwgTE9DQUxfTUVNX01BUCBmaW5kcyB0aGUgb3duaW5nIG5vZGUgb2YgdGhlIG1lbW9yeQotICogYW5kIHJldHVybnMgdGhlIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHBhZ2UgaW4gdGhlCi0gKiBub2RlJ3MgbWVtX21hcC4KLSAqLwotI2RlZmluZSBMT0NBTF9NQVBfTlIoYWRkcikgXAotCSgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICYgMHgwM2ZmZmZmZikgPj4gUEFHRV9TSElGVCkKLQotI2VuZGlmCisjZGVmaW5lIE5PREVfTUVNX1NJWkVfQklUUwkyNgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgKaW5kZXggZjVjYzY1ZC4uMDgzZTAzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgKQEAgLTk5LDcgKzk5LDcgQEAKICNkZWZpbmUgRENTUl9TRVRDTVBTVAkoMSA8PCAyNSkgICAgICAgLyogU2V0IERlc2NyaXB0b3IgQ29tcGFyZSBTdGF0dXMgKi8KICNkZWZpbmUgRENTUl9DTFJDTVBTVAkoMSA8PCAyNCkgICAgICAgLyogQ2xlYXIgRGVzY3JpcHRvciBDb21wYXJlIFN0YXR1cyAqLwogI2RlZmluZSBEQ1NSX0NNUFNUCSgxIDw8IDEwKSAgICAgICAvKiBUaGUgRGVzY3JpcHRvciBDb21wYXJlIFN0YXR1cyAqLwotI2RlZmluZSBEQ1NSX0VOUklOVFIJKDEgPDwgOSkgICAgICAgIC8qIFRoZSBlbmQgb2YgUmVjZWl2ZSAqLworI2RlZmluZSBEQ1NSX0VPUklOVFIJKDEgPDwgOSkgICAgICAgIC8qIFRoZSBlbmQgb2YgUmVjZWl2ZSAqLwogI2VuZGlmCiAjZGVmaW5lIERDU1JfUkVRUEVORAkoMSA8PCA4KQkvKiBSZXF1ZXN0IFBlbmRpbmcgKHJlYWQtb25seSkgKi8KICNkZWZpbmUgRENTUl9TVE9QU1RBVEUJKDEgPDwgMykJLyogU3RvcCBTdGF0ZSAocmVhZC1vbmx5KSAqLwpAQCAtODAzLDEyICs4MDMsMTEgQEAKICNkZWZpbmUgVURDSVNSMCAgICAgICAgIF9fUkVHKDB4NDA2MDAwMEMpIC8qIFVEQyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDAgKi8KICNkZWZpbmUgVURDSVNSMSAgICAgICAgIF9fUkVHKDB4NDA2MDAwMTApIC8qIFVEQyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgVURDSVNSX0lOVChuLGludHIpICgoKGludHIpICYgMHgwMykgPDwgKCgobikgJiAweDBGKSAqIDIpKQotI2RlZmluZSBVRENJU1IxX0lFQ0MJKDEgPDwgMzEpCS8qIEludEVuIC0gQ29uZmlndXJhdGlvbiBDaGFuZ2UgKi8KLSNkZWZpbmUgVURDSVNSMV9JRVNPRgkoMSA8PCAzMCkJLyogSW50RW4gLSBTdGFydCBvZiBGcmFtZSAqLwotI2RlZmluZSBVRENJU1IxX0lFUlUJKDEgPDwgMjkpCS8qIEludEVuIC0gUmVzdW1lICovCi0jZGVmaW5lIFVEQ0lTUjFfSUVTVQkoMSA8PCAyOCkJLyogSW50RW4gLSBTdXNwZW5kICovCi0jZGVmaW5lIFVEQ0lTUjFfSUVSUwkoMSA8PCAyNykJLyogSW50RW4gLSBSZXNldCAqLwotCisjZGVmaW5lIFVEQ0lTUjFfSVJDQwkoMSA8PCAzMSkJLyogSW50UmVxIC0gQ29uZmlndXJhdGlvbiBDaGFuZ2UgKi8KKyNkZWZpbmUgVURDSVNSMV9JUlNPRgkoMSA8PCAzMCkJLyogSW50UmVxIC0gU3RhcnQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgVURDSVNSMV9JUlJVCSgxIDw8IDI5KQkvKiBJbnRSZXEgLSBSZXN1bWUgKi8KKyNkZWZpbmUgVURDSVNSMV9JUlNVCSgxIDw8IDI4KQkvKiBJbnRSZXEgLSBTdXNwZW5kICovCisjZGVmaW5lIFVEQ0lTUjFfSVJSUwkoMSA8PCAyNykJLyogSW50UmVxIC0gUmVzZXQgKi8KIAogI2RlZmluZSBVRENGTlIgICAgICAgICAgX19SRUcoMHg0MDYwMDAxNCkgLyogVURDIEZyYW1lIE51bWJlciBSZWdpc3RlciAqLwogI2RlZmluZSBVRENPVEdJQ1IJX19SRUcoMHg0MDYwMDAxOCkgLyogVURDIE9uLVRoZS1HbyBpbnRlcnJ1cHQgY29udHJvbCAqLwpAQCAtMTY4MSw2ICsxNjgwLDcgQEAKICNkZWZpbmUgU1NTUl9USU5UCQkoMSA8PCAxOSkJLyogUmVjZWl2ZXIgVGltZS1vdXQgSW50ZXJydXB0ICovCiAjZGVmaW5lIFNTU1JfUElOVAkJKDEgPDwgMTgpCS8qIFBlcmlwaGVyYWwgVHJhaWxpbmcgQnl0ZSBJbnRlcnJ1cHQgKi8KIAorI2RlZmluZSBTU1BTUF9GU1JUCQkoMSA8PCAyNSkJLyogRnJhbWUgU3luYyBSZWxhdGl2ZSBUaW1pbmcgKi8KICNkZWZpbmUgU1NQU1BfRE1ZU1RPUCh4KQkoeCA8PCAyMykJLyogRHVtbXkgU3RvcCAqLwogI2RlZmluZSBTU1BTUF9TRlJNV0RUSCh4KQkoeCA8PCAxNikJLyogU2VyaWFsIEZyYW1lIFdpZHRoICovCiAjZGVmaW5lIFNTUFNQX1NGUk1ETFkoeCkJKHggPDwgOSkJLyogU2VyaWFsIEZyYW1lIERlbGF5ICovCkBAIC0yMjQxLDcgKzIyNDEsNyBAQAogCiAjZGVmaW5lIENJQ1IxX1RCSVQJKDEgPDwgMzEpCS8qIFRyYW5zcGFyZW5jeSBiaXQgKi8KICNkZWZpbmUgQ0lDUjFfUkdCVF9DT05WCSgweDMgPDwgMzApCS8qIFJHQlQgY29udmVyc2lvbiBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1BQTAkoMHgzZiA8PCAxNSkJLyogUGl4ZWxzIHBlciBsaW5lIG1hc2sgKi8KKyNkZWZpbmUgQ0lDUjFfUFBMCSgweDdmZiA8PCAxNSkJLyogUGl4ZWxzIHBlciBsaW5lIG1hc2sgKi8KICNkZWZpbmUgQ0lDUjFfUkdCX0NPTlYJKDB4NyA8PCAxMikJLyogUkdCIGNvbnZlcnNpb24gbWFzayAqLwogI2RlZmluZSBDSUNSMV9SR0JfRgkoMSA8PCAxMSkJLyogUkdCIGZvcm1hdCAqLwogI2RlZmluZSBDSUNSMV9ZQ0JDUl9GCSgxIDw8IDEwKQkvKiBZQ2JDciBmb3JtYXQgKi8KQEAgLTIyNjcsNyArMjI2Nyw3IEBACiAjZGVmaW5lIENJQ1IzX1ZTVwkoMHgzZiA8PCAxMCkJLyogVmVydGljYWwgc3luYyBwdWxzZSB3aWR0aCBtYXNrICovCiAjZGVmaW5lIENJQ1IzX0JGUFcJKDB4M2YgPDwgMykJLyogQmVnaW5uaW5nLW9mLWZyYW1lIHBpeGVsIGNsb2NrCiAJCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSM19MUEYJKDB4M2ZmIDw8IDApCS8qIExpbmVzIHBlciBmcmFtZSBtYXNrICovCisjZGVmaW5lIENJQ1IzX0xQRgkoMHg3ZmYgPDwgMCkJLyogTGluZXMgcGVyIGZyYW1lIG1hc2sgKi8KIAogI2RlZmluZSBDSUNSNF9NQ0xLX0RMWQkoMHgzIDw8IDI0KQkvKiBNQ0xLIERhdGEgQ2FwdHVyZSBEZWxheSBtYXNrICovCiAjZGVmaW5lIENJQ1I0X1BDTEtfRU4JKDEgPDwgMjMpCS8qIFBpeGVsIGNsb2NrIGVuYWJsZSAqLwpAQCAtMjI4OCw4ICsyMjg4LDggQEAKICNkZWZpbmUgQ0lTUl9FT0wJKDEgPDwgOCkJLyogRW5kIG9mIGxpbmUgKi8KICNkZWZpbmUgQ0lTUl9QQVJfRVJSCSgxIDw8IDcpCS8qIFBhcml0eSBlcnJvciAqLwogI2RlZmluZSBDSVNSX0NRRAkoMSA8PCA2KQkvKiBDYW1lcmEgaW50ZXJmYWNlIHF1aWNrIGRpc2FibGUgKi8KLSNkZWZpbmUgQ0lTUl9TT0YJKDEgPDwgNSkJLyogU3RhcnQgb2YgZnJhbWUgKi8KLSNkZWZpbmUgQ0lTUl9DREQJKDEgPDwgNCkJLyogQ2FtZXJhIGludGVyZmFjZSBkaXNhYmxlIGRvbmUgKi8KKyNkZWZpbmUgQ0lTUl9DREQJKDEgPDwgNSkJLyogQ2FtZXJhIGludGVyZmFjZSBkaXNhYmxlIGRvbmUgKi8KKyNkZWZpbmUgQ0lTUl9TT0YJKDEgPDwgNCkJLyogU3RhcnQgb2YgZnJhbWUgKi8KICNkZWZpbmUgQ0lTUl9FT0YJKDEgPDwgMykJLyogRW5kIG9mIGZyYW1lICovCiAjZGVmaW5lIENJU1JfSUZPXzIJKDEgPDwgMikJLyogRklGTyBvdmVycnVuIGZvciBDaGFubmVsIDIgKi8KICNkZWZpbmUgQ0lTUl9JRk9fMQkoMSA8PCAxKQkvKiBGSUZPIG92ZXJydW4gZm9yIENoYW5uZWwgMSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YTJ4eF9zcGkuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEyeHhfc3BpLmgKaW5kZXggOTE1NTkwYzMuLmFjYzdlYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEyeHhfc3BpLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YTJ4eF9zcGkuaApAQCAtMjcsMTYgKzI3LDEzIEBACiAjZGVmaW5lIFNTUDFfU2VyQ2xrRGl2KHgpICgoKENMT0NLX1NQRUVEX0haLzIvKHgrMSkpPDw4KSYweDAwMDBmZjAwKQogI2RlZmluZSBTU1AyX1NlckNsa0Rpdih4KSAoKChDTE9DS19TUEVFRF9IWi8oeCsxKSk8PDgpJjB4MDAwZmZmMDApCiAjZGVmaW5lIFNTUDNfU2VyQ2xrRGl2KHgpICgoKENMT0NLX1NQRUVEX0haLyh4KzEpKTw8OCkmMHgwMDBmZmYwMCkKLSNkZWZpbmUgU1NQX1RJTUVPVVRfU0NBTEUgKDI3MTIpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19QWEEyN3gpCiAjZGVmaW5lIENMT0NLX1NQRUVEX0haIDEzMDAwMDAwCiAjZGVmaW5lIFNTUDFfU2VyQ2xrRGl2KHgpICgoKENMT0NLX1NQRUVEX0haLyh4KzEpKTw8OCkmMHgwMDBmZmYwMCkKICNkZWZpbmUgU1NQMl9TZXJDbGtEaXYoeCkgKCgoQ0xPQ0tfU1BFRURfSFovKHgrMSkpPDw4KSYweDAwMGZmZjAwKQogI2RlZmluZSBTU1AzX1NlckNsa0Rpdih4KSAoKChDTE9DS19TUEVFRF9IWi8oeCsxKSk8PDgpJjB4MDAwZmZmMDApCi0jZGVmaW5lIFNTUF9USU1FT1VUX1NDQUxFICg3NjkpCiAjZW5kaWYKIAotI2RlZmluZSBTU1BfVElNRU9VVCh4KSAoKHgqMTAwMDApL1NTUF9USU1FT1VUX1NDQUxFKQogI2RlZmluZSBTU1AxX1ZJUlQgKCh2b2lkICopKGlvX3AydihfX1BSRUcoU1NDUjBfUCgxKSkpKSkKICNkZWZpbmUgU1NQMl9WSVJUICgodm9pZCAqKShpb19wMnYoX19QUkVHKFNTQ1IwX1AoMikpKSkpCiAjZGVmaW5lIFNTUDNfVklSVCAoKHZvaWQgKikoaW9fcDJ2KF9fUFJFRyhTU0NSMF9QKDMpKSkpKQpAQCAtNjMsNyArNjAsNyBAQAogCXU4IHR4X3RocmVzaG9sZDsKIAl1OCByeF90aHJlc2hvbGQ7CiAJdTggZG1hX2J1cnN0X3NpemU7Ci0JdTMyIHRpbWVvdXRfbWljcm9zZWNzOworCXUzMiB0aW1lb3V0OwogCXU4IGVuYWJsZV9sb29wYmFjazsKIAl2b2lkICgqY3NfY29udHJvbCkodTMyIGNvbW1hbmQpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS91ZGMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS91ZGMuaAppbmRleCAxMjFjZDI0Li42NDY0ODBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvdWRjLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3VkYy5oCkBAIC00LDIzICs0LDggQEAKICAqIFRoaXMgc3VwcG9ydHMgbWFjaGluZS1zcGVjaWZpYyBkaWZmZXJlbmNlcyBpbiBob3cgdGhlIFBYQTJ4eAogICogVVNCIERldmljZSBDb250cm9sbGVyIChVREMpIGlzIHdpcmVkLgogICoKLSAqIEl0IGlzIHNldCBpbiBsaW51eC9hcmNoL2FybS9tYWNoLXB4YS88bWFjaGluZT4uYyBhbmQgdXNlZCBpbgotICogdGhlIHByb2JlIHJvdXRpbmUgb2YgbGludXgvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYwogICovCi1zdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gewotICAgICAgICBpbnQgICgqdWRjX2lzX2Nvbm5lY3RlZCkodm9pZCk7CQkvKiBkbyB3ZSBzZWUgaG9zdD8gKi8KLSAgICAgICAgdm9pZCAoKnVkY19jb21tYW5kKShpbnQgY21kKTsKLSNkZWZpbmUJUFhBMlhYX1VEQ19DTURfQ09OTkVDVAkJMAkvKiBsZXQgaG9zdCBzZWUgdXMgKi8KLSNkZWZpbmUJUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVAkxCS8qIHNvIGhvc3Qgd29uJ3Qgc2VlIHVzICovCi0KLQkvKiBCb2FyZHMgZm9sbG93aW5nIHRoZSBkZXNpZ24gZ3VpZGVsaW5lcyBpbiB0aGUgZGV2ZWxvcGVyJ3MgbWFudWFsLAotCSAqIHdpdGggb24tY2hpcCBHUElPcyBub3QgTHViYm9jaydzIHdpZXJkIGhhcmR3YXJlLCBjYW4gaGF2ZSBhIHNhbmUKLQkgKiBWQlVTIElSUSBhbmQgb21pdCB0aGUgbWV0aG9kcyBhYm92ZS4gIFN0b3JlIHRoZSBHUElPIG51bWJlcgotCSAqIGhlcmU7IGZvciBHUElPIDAsIGFsc28gbWFzayBpbiBvbmUgb2YgdGhlIHB4YV9ncGlvX21vZGUoKSBiaXRzLgotCSAqLwotCXUxNglncGlvX3ZidXM7CQkJLyogaGlnaCA9PSB2YnVzIHByZXNlbnQgKi8KLQl1MTYJZ3Bpb19wdWxsdXA7CQkJLyogaGlnaCA9PSBwdWxsdXAgYWN0aXZhdGVkICovCi19OworI2luY2x1ZGUgPGFzbS9tYWNoL3VkY19weGEyeHguaD4KIAogZXh0ZXJuIHZvaWQgcHhhX3NldF91ZGNfaW5mbyhzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8gKmluZm8pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2ZiLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2ZiLmgKaW5kZXggOTA4OTQyMS4uOTNhNThlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9mYi5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZmIuaApAQCAtMzEsNiArMzEsOSBAQAogc3RydWN0IHMzYzI0MTBmYl9tYWNoX2luZm8gewogCXVuc2lnbmVkIGNoYXIJZml4ZWRfc3luY3M7CS8qIGRvIG5vdCB1cGRhdGUgc3luYy9ib3JkZXIgKi8KIAorCS8qIExDRCB0eXBlcyAqLworCWludAkJdHlwZTsKKwogCS8qIFNjcmVlbiBzaXplICovCiAJaW50CQl3aWR0aDsKIAlpbnQJCWhlaWdodDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaDE5NDAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaDE5NDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTM1NTkyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9oMTk0MC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvaDE5NDAuaAorICoKKyAqIENvcHlyaWdodCAyMDA2IEJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KKyAqCisgKiBIMTk0MCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfSDE5NDBfSAorI2RlZmluZSBfX0FTTV9BUkNIX0gxOTQwX0gKKworI2RlZmluZSBIMTk0MF9TVVNQRU5EX0NIRUNLU1VNCQkoMHgzMDAwM2ZmOCkKKyNkZWZpbmUgSDE5NDBfU1VTUEVORF9SRVNVTUVBVAkJKDB4MzAwODEwMDApCisjZGVmaW5lIEgxOTQwX1NVU1BFTkRfQ0hFQ0sJCSgweDMwMDgwMDAwKQorCitleHRlcm4gdm9pZCBoMTk0MF9wbV9yZXR1cm4odm9pZCk7CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0gxOTQwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy11ZGMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy11ZGMuaAppbmRleCA0ODc4NjFkLi4zYzgzNTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtdWRjLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXVkYy5oCkBAIC0xMSw4ICsxMSw3IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfUkVHU19VRENfSAogI2RlZmluZSBfX0FTTV9BUkNIX1JFR1NfVURDX0gKIAotCi0jZGVmaW5lIFMzQzI0MTBfVVNCRFJFRyh4KSAoKHgpICsgUzNDMjRYWF9WQV9VU0JERVYpCisjZGVmaW5lIFMzQzI0MTBfVVNCRFJFRyh4KSAoeCkKIAogI2RlZmluZSBTM0MyNDEwX1VEQ19GVU5DX0FERFJfUkVHCVMzQzI0MTBfVVNCRFJFRygweDAxNDApCiAjZGVmaW5lIFMzQzI0MTBfVURDX1BXUl9SRUcJCVMzQzI0MTBfVVNCRFJFRygweDAxNDQpCkBAIC0xMzYsOCArMTM1LDggQEAKICNkZWZpbmUgUzNDMjQxMF9VRENfT0NTUjJfSVNPCQkoMTw8NikgLy8gUi9XCiAjZGVmaW5lIFMzQzI0MTBfVURDX09DU1IyX0RNQUlFTgkoMTw8NSkgLy8gUi9XCiAKLSNkZWZpbmUgUzNDMjQxMF9VRENfU0VUSVgoeCkJICAgIFwKLQlfX3Jhd193cml0ZWwoUzNDMjQxMF9VRENfSU5ERVhfICMjIHgsIFMzQzI0MTBfVURDX0lOREVYX1JFRyk7CisjZGVmaW5lIFMzQzI0MTBfVURDX1NFVElYKGJhc2UseCkJICAgIFwKKwl3cml0ZWwoUzNDMjQxMF9VRENfSU5ERVhfICMjIHgsIGJhc2UrUzNDMjQxMF9VRENfSU5ERVhfUkVHKTsKIAogCiAjZGVmaW5lIFMzQzI0MTBfVURDX0VQMF9DU1JfT1BLUkRZCSgxPDwwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvc3lzdGVtLmgKaW5kZXggNzE4MjQ2ZC4uNGY3MmE4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3N5c3RlbS5oCkBAIC03MSw3ICs3MSw3IEBACiAKIAkvKiBzZXQgdGhlIHdhdGNoZG9nIHRvIGdvIGFuZCByZXNldC4uLiAqLwogCV9fcmF3X3dyaXRlbChTM0MyNDEwX1dUQ09OX0VOQUJMRXxTM0MyNDEwX1dUQ09OX0RJVjE2fFMzQzI0MTBfV1RDT05fUlNURU4gfAotCQkgICAgIFMzQzI0MTBfV1RDT05fUFJFU0NBTEUoMHg4MCksIFMzQzI0MTBfV1RDT04pOworCQkgICAgIFMzQzI0MTBfV1RDT05fUFJFU0NBTEUoMHgyMCksIFMzQzI0MTBfV1RDT04pOwogCiAJLyogd2FpdCBmb3IgcmVzZXQgdG8gYXNzZXJ0Li4uICovCiAJbWRlbGF5KDUwMDApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2pvcm5hZGE3MjAuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9qb3JuYWRhNzIwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGU4YTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL2pvcm5hZGE3MjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvam9ybmFkYTcyMC5oCi0gKgotICogQ3JlYXRlZCAyMDAwLzExLzI5IGJ5IEpvaG4gQW5rY29ybiA8amNhQGxjcy5taXQuZWR1PgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIEhQIEpvcm5hZGEgNzIwCi0gKgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICi0jZXJyb3IgImluY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPiBpbnN0ZWFkIgotI2VuZGlmCi0KLSNkZWZpbmUgU0ExMTExX0JBU0UgICAgICAgICAgICAgKDB4NDAwMDAwMDApCi0KLSNkZWZpbmUgR1BJT19KT1JOQURBNzIwX0tFWUJPQVJECUdQSU9fR1BJTygwKQotI2RlZmluZSBHUElPX0pPUk5BREE3MjBfTU9VU0UJCUdQSU9fR1BJTyg5KQotCi0jZGVmaW5lIEdQSU9fSk9STkFEQTcyMF9LRVlCT0FSRF9JUlEJSVJRX0dQSU8wCi0jZGVmaW5lIEdQSU9fSk9STkFEQTcyMF9NT1VTRV9JUlEJCUlSUV9HUElPOQotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi12b2lkIGpvcm5hZGE3MjBfbWN1X2luaXQodm9pZCk7Ci12b2lkIGpvcm5hZGFfY29udHJhc3QoaW50IGFyZ19jb250cmFzdCk7Ci12b2lkIGpvcm5hZGE3MjBfYmF0dGVyeSh2b2lkKTsKLWludCBqb3JuYWRhNzIwX2dldGtleSh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9tZW1vcnkuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9tZW1vcnkuaAppbmRleCAxZmYxNzJkLi4wZTkwN2ZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL21lbW9yeS5oCkBAIC0zOSw3ICszOSw2IEBACiAjZGVmaW5lIF9fdmlydF90b19idXMoeCkJIF9fdmlydF90b19waHlzKHgpCiAjZGVmaW5lIF9fYnVzX3RvX3ZpcnQoeCkJIF9fcGh5c190b192aXJ0KHgpCiAKLSNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCiAvKgogICogQmVjYXVzZSBvZiB0aGUgd2lkZSBtZW1vcnkgYWRkcmVzcyBzcGFjZSBiZXR3ZWVuIHBoeXNpY2FsIFJBTSBiYW5rcyBvbiB0aGUgCiAgKiBTQTExMDAsIGl0J3MgbXVjaCBjb252ZW5pZW50IHRvIHVzZSBMaW51eCdzIE5VTUEgc3VwcG9ydCB0byBpbXBsZW1lbnQgb3VyIApAQCAtNTcsMzggKzU2LDcgQEAKICAqIAlub2RlIDI6ICAweGQwMDAwMDAwIC0gMHhkN2ZmZmZmZgogICogCW5vZGUgMzogIDB4ZDgwMDAwMDAgLSAweGRmZmZmZmZmCiAgKi8KLQotLyoKLSAqIEdpdmVuIGEga2VybmVsIGFkZHJlc3MsIGZpbmQgdGhlIGhvbWUgbm9kZSBvZiB0aGUgdW5kZXJseWluZyBtZW1vcnkuCi0gKi8KLSNkZWZpbmUgS1ZBRERSX1RPX05JRChhZGRyKSAoKCh1bnNpZ25lZCBsb25nKShhZGRyKSAtIFBBR0VfT0ZGU0VUKSA+PiAyNykKLQotLyoKLSAqIEdpdmVuIGEgcGFnZSBmcmFtZSBudW1iZXIsIGNvbnZlcnQgaXQgdG8gYSBub2RlIGlkLgotICovCi0jZGVmaW5lIFBGTl9UT19OSUQocGZuKQkJKCgocGZuKSAtIFBIWVNfUEZOX09GRlNFVCkgPj4gKDI3IC0gUEFHRV9TSElGVCkpCi0KLS8qCi0gKiBHaXZlbiBhIGthZGRyLCBBRERSX1RPX01BUEJBU0UgZmluZHMgdGhlIG93bmluZyBub2RlIG9mIHRoZSBtZW1vcnkKLSAqIGFuZCByZXR1cm4gdGhlIG1lbV9tYXAgb2YgdGhhdCBub2RlLgotICovCi0jZGVmaW5lIEFERFJfVE9fTUFQQkFTRShrYWRkcikJTk9ERV9NRU1fTUFQKEtWQUREUl9UT19OSUQoa2FkZHIpKQotCi0vKgotICogR2l2ZW4gYSBwYWdlIGZyYW1lIG51bWJlciwgZmluZCB0aGUgb3duaW5nIG5vZGUgb2YgdGhlIG1lbW9yeQotICogYW5kIHJldHVybiB0aGUgbWVtX21hcCBvZiB0aGF0IG5vZGUuCi0gKi8KLSNkZWZpbmUgUEZOX1RPX01BUEJBU0UocGZuKQlOT0RFX01FTV9NQVAoUEZOX1RPX05JRChwZm4pKQotCi0vKgotICogR2l2ZW4gYSBrYWRkciwgTE9DQUxfTUVNX01BUCBmaW5kcyB0aGUgb3duaW5nIG5vZGUgb2YgdGhlIG1lbW9yeQotICogYW5kIHJldHVybnMgdGhlIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHBhZ2UgaW4gdGhlCi0gKiBub2RlJ3MgbWVtX21hcC4KLSAqLwotI2RlZmluZSBMT0NBTF9NQVBfTlIoYWRkcikgXAotCSgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICYgMHgwN2ZmZmZmZikgPj4gUEFHRV9TSElGVCkKLQotI2VuZGlmCisjZGVmaW5lIE5PREVfTUVNX1NJWkVfQklUUwkyNwogCiAvKgogICogQ2FjaGUgZmx1c2hpbmcgYXJlYSAtIFNBMTEwMCB6ZXJvIGJhbmsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9idWcuaCBiL2luY2x1ZGUvYXNtLWFybS9idWcuaAppbmRleCAwZTM2ZmQ1Li43YjYyMzUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2J1Zy5oCkBAIC00LDEwICs0LDEwIEBACiAKICNpZmRlZiBDT05GSUdfQlVHCiAjaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKLWV4dGVybiB2b2lkIF9fYnVnKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkICpkYXRhKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworZXh0ZXJuIHZvaWQgX19idWcoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CiAKIC8qIGdpdmUgZmlsZS9saW5lIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEJVRygpCQlfX2J1ZyhfX0ZJTEVfXywgX19MSU5FX18sIE5VTEwpCisjZGVmaW5lIEJVRygpCQlfX2J1ZyhfX0ZJTEVfXywgX19MSU5FX18pCiAKICNlbHNlCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1hcm0vY2FjaGVmbHVzaC5oCmluZGV4IGYwODQ1NjQuLjM3OGEzYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2NhY2hlZmx1c2guaApAQCAtMzE5LDYgKzMxOSw4IEBACiAJCQkJdW5zaWduZWQgbG9uZyBsZW4sIGludCB3cml0ZSk7CiAjZW5kaWYKIAorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pIGZsdXNoX2NhY2hlX21tKG1tKQorCiAvKgogICogZmx1c2hfY2FjaGVfdXNlcl9yYW5nZSBpcyB1c2VkIHdoZW4gd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUKICAqIEhhcnZhcmQgY2FjaGVzIGFyZSBzeW5jaHJvbmlzZWQgZm9yIHRoZSB1c2VyIHNwYWNlIGFkZHJlc3MgcmFuZ2UuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLWFybS9jaGVja3N1bS5oCmluZGV4IDc0N2JkZDMuLjhjMGJiNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9jaGVja3N1bS5oCkBAIC0yMyw3ICsyMyw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMzMsMjYgKzMzLDE4IEBACiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSk7CitfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCi11bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cik7Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBvbGQgKGFuZCB1bnNhZmUpIHdheSBvZiBkb2luZyBjaGVja3N1bXMsIGEgd2FybmluZyBtZXNzYWdlIHdpbGwKLSAqIGJlIHByaW50ZWQgaWYgaXQgaXMgdXNlZCBhbmQgYW4gZXhjZXB0aW9uIG9jY3Vycy4KLSAqCi0gKiB0aGlzIGZ1bmN0aW9ucyBzaG91bGQgZ28gYXdheSBhZnRlciBzb21lIHRpbWUuCi0gKi8KLSNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHkoc3JjLGRzdCxsZW4sc3VtKQljc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYyxkc3QsbGVuLHN1bSkKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKTsKIAogLyoKICAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKLWlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2CitpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXVuc2lnbmVkIGludCBzdW0sIHRtcDE7CiAKQEAgLTc4LDE0ICs3MCwxMyBAQAogCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKSwgIj1yIiAodG1wMSkKIAk6ICIxIiAoaXBoKSwgIjIiIChpaGwpCiAJOiAiY2MiLCAibWVtb3J5Iik7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qCiAgKiAJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0gd2l0aG91dCBhZGRpbmcgcHNldWRvIGhlYWRlcnMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJImFkZHMJJTAsICUxLCAlMSwgbHNsICMxNglAIGNzdW1fZm9sZAkJXG5cCkBAIC05MywyMSArODQsMjUgQEAKIAk6ICI9ciIgKHN1bSkKIAk6ICJyIiAoc3VtKQogCTogImNjIik7Ci0JcmV0dXJuICh+c3VtKSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICAgdW5zaWduZWQgaW50IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSJhZGRzCSUwLCAlMSwgJTIJCUAgY3N1bV90Y3B1ZHBfbm9mb2xkCVxuXAotCWFkY3MJJTAsICUwLCAlMwkJCQkJXG5cCi0JYWRjcwklMCwgJTAsICU0CQkJCQlcblwKLQlhZGNzCSUwLCAlMCwgJTUJCQkJCVxuXAorCWFkY3MJJTAsICUwLCAlMwkJCQkJXG4iCisjaWZkZWYgX19BUk1FQl9fCisJImFkY3MJJTAsICUwLCAlNAkJCQkJXG4iCisjZWxzZQorCSJhZGNzCSUwLCAlMCwgJTQsIGxzbCAjOAkJCQlcbiIKKyNlbmRpZgorCSJhZGNzCSUwLCAlMCwgJTUJCQkJCVxuXAogCWFkYwklMCwgJTAsICMwIgogCTogIj0mciIoc3VtKQotCTogInIiIChzdW0pLCAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICJyIiAobnRvaHMobGVuKSksICJJciIgKG50b2hzKHByb3RvKSkKKwk6ICJyIiAoc3VtKSwgInIiIChkYWRkciksICJyIiAoc2FkZHIpLCAiciIgKGxlbiksICJJciIgKGh0b25zKHByb3RvKSkKIAk6ICJjYyIpOwogCXJldHVybiBzdW07CiB9CQpAQCAtMTE1LDIzICsxMTAsMjcgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIGludCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSJhZGRzCSUwLCAlMSwgJTIJCUAgY3N1bV90Y3B1ZHBfbWFnaWMJXG5cCi0JYWRjcwklMCwgJTAsICUzCQkJCQlcblwKLQlhZGNzCSUwLCAlMCwgJTQJCQkJCVxuXAotCWFkY3MJJTAsICUwLCAlNQkJCQkJXG5cCisJYWRjcwklMCwgJTAsICUzCQkJCQlcbiIKKyNpZmRlZiBfX0FSTUVCX18KKwkiYWRjcwklMCwgJTAsICU0CQkJCQlcbiIKKyNlbHNlCisJImFkY3MJJTAsICUwLCAlNCwgbHNsICM4CQkJCVxuIgorI2VuZGlmCisJImFkY3MJJTAsICUwLCAlNQkJCQkJXG5cCiAJYWRjCSUwLCAlMCwgIzAJCQkJCVxuXAogCWFkZHMJJTAsICUwLCAlMCwgbHNsICMxNgkJCQlcblwKIAlhZGRjcwklMCwgJTAsICMweDEwMDAwCQkJCVxuXAogCW12bgklMCwgJTAiCiAJOiAiPSZyIihzdW0pCi0JOiAiciIgKHN1bSksICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgInIiIChudG9ocyhsZW4pKSwgIklyIiAobnRvaHMocHJvdG8pKQorCTogInIiIChzdW0pLCAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICJyIiAobGVuKSwgIklyIiAoaHRvbnMocHJvdG8pKQogCTogImNjIik7Ci0JcmV0dXJuIHN1bSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikoKF9fZm9yY2UgdTMyKXN1bSA+PiAxNik7CiB9CiAKIApAQCAtMTM5LDIwICsxMzgsMjAgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0Ci1pcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2lwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCi1leHRlcm4gdW5zaWduZWQgbG9uZwotX19jc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX191MzIgbGVuLAotCQlfX3UzMiBwcm90bywgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtCitfX2NzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBfX2JlMzIgbGVuLAorCQlfX2JlMzIgcHJvdG8sIF9fd3N1bSBzdW0pOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIF9fdTMyIGxlbiwKLQkJdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBfX3UzMiBsZW4sCisJCXVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoX19jc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBodG9ubChsZW4pLAogCQkJCQkgICBodG9ubChwcm90byksIHN1bSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2NudDMyX3RvXzYzLmggYi9pbmNsdWRlL2FzbS1hcm0vY250MzJfdG9fNjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBjODczCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2NudDMyX3RvXzYzLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqICBpbmNsdWRlL2FzbS9jbnQzMl90b182My5oIC0tIGV4dGVuZCBhIDMyLWJpdCBjb3VudGVyIHRvIDYzIGJpdHMKKyAqCisgKiAgQXV0aG9yOglOaWNvbGFzIFBpdHJlCisgKiAgQ3JlYXRlZDoJRGVjZW1iZXIgMywgMjAwNgorICogIENvcHlyaWdodDoJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0lOQ0xVREVfQ05UMzJfVE9fNjNfSF9fCisjZGVmaW5lIF9fSU5DTFVERV9DTlQzMl9UT182M19IX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICogUHJvdG90eXBlOiB1NjQgY250MzJfdG9fNjModTMyIGNudCkKKyAqIE1hbnkgaGFyZHdhcmUgY2xvY2sgY291bnRlcnMgYXJlIG9ubHkgMzIgYml0cyB3aWRlIGFuZCB0aGVyZWZvcmUgaGF2ZQorICogYSByZWxhdGl2ZWx5IHNob3J0IHBlcmlvZCBtYWtpbmcgd3JhcC1hcm91bmRzIHJhdGhlciBmcmVxdWVudC4gIFRoaXMKKyAqIGlzIGEgcHJvYmxlbSB3aGVuIGltcGxlbWVudGluZyBzY2hlZF9jbG9jaygpIGZvciBleGFtcGxlLCB3aGVyZSBhIDY0LWJpdAorICogbm9uLXdyYXBwaW5nIG1vbm90b25pYyB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSByZXR1cm5lZC4KKyAqCisgKiBUbyBvdmVyY29tZSB0aGF0IGxpbWl0YXRpb24sIGxldCdzIGV4dGVuZCBhIDMyLWJpdCBjb3VudGVyIHRvIDYzIGJpdHMKKyAqIGluIGEgY29tcGxldGVseSBsb2NrIGZyZWUgZmFzaGlvbi4gQml0cyAwIHRvIDMxIG9mIHRoZSBjbG9jayBhcmUgcHJvdmlkZWQKKyAqIGJ5IHRoZSBoYXJkd2FyZSB3aGlsZSBiaXRzIDMyIHRvIDYyIGFyZSBzdG9yZWQgaW4gbWVtb3J5LiAgVGhlIHRvcCBiaXQgaW4KKyAqIG1lbW9yeSBpcyB1c2VkIHRvIHN5bmNocm9uaXplIHdpdGggdGhlIGhhcmR3YXJlIGNsb2NrIGhhbGYtcGVyaW9kLiAgV2hlbgorICogdGhlIHRvcCBiaXQgb2YgYm90aCBjb3VudGVycyAoaGFyZHdhcmUgYW5kIGluIG1lbW9yeSkgZGlmZmVyIHRoZW4gdGhlCisgKiBtZW1vcnkgaXMgdXBkYXRlZCB3aXRoIGEgbmV3IHZhbHVlLCBpbmNyZW1lbnRpbmcgaXQgd2hlbiB0aGUgaGFyZHdhcmUKKyAqIGNvdW50ZXIgd3JhcHMgYXJvdW5kLgorICoKKyAqIEJlY2F1c2UgYSB3b3JkIHN0b3JlIGluIG1lbW9yeSBpcyBhdG9taWMgdGhlbiB0aGUgaW5jcmVtZW50ZWQgdmFsdWUgd2lsbAorICogYWx3YXlzIGJlIGluIHN5bmNoIHdpdGggdGhlIHRvcCBiaXQgaW5kaWNhdGluZyB0byBhbnkgcG90ZW50aWFsIGNvbmN1cnJlbnQKKyAqIHJlYWRlciBpZiB0aGUgdmFsdWUgaW4gbWVtb3J5IGlzIHVwIHRvIGRhdGUgb3Igbm90IHdpdGggcmVnYXJkcyB0byB0aGUKKyAqIG5lZWRlZCBpbmNyZW1lbnQuICBBbmQgYW55IHJhY2UgaW4gdXBkYXRpbmcgdGhlIHZhbHVlIGluIG1lbW9yeSBpcyBoYXJtbGVzcworICogYXMgdGhlIHNhbWUgdmFsdWUgd291bGQgc2ltcGx5IGJlIHN0b3JlZCBtb3JlIHRoYW4gb25jZS4KKyAqCisgKiBUaGUgb25seSByZXN0cmljdGlvbiBmb3IgdGhlIGFsZ29yaXRobSB0byB3b3JrIHByb3Blcmx5IGlzIHRoYXQgdGhpcworICogY29kZSBtdXN0IGJlIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2UgcGVyIGVhY2ggaGFsZiBwZXJpb2Qgb2YgdGhlIDMyLWJpdAorICogY291bnRlciB0byBwcm9wZXJseSB1cGRhdGUgdGhlIHN0YXRlIGJpdCBpbiBtZW1vcnkuIFRoaXMgaXMgdXN1YWxseSBub3QgYQorICogcHJvYmxlbSBpbiBwcmFjdGljZSwgYnV0IGlmIGl0IGlzIHRoZW4gYSBrZXJuZWwgdGltZXIgY291bGQgYmUgc2NoZWR1bGVkCisgKiB0byBtYW5hZ2UgZm9yIHRoaXMgY29kZSB0byBiZSBleGVjdXRlZCBvZnRlbiBlbm91Z2guCisgKgorICogTm90ZSB0aGF0IHRoZSB0b3AgYml0IChiaXQgNjMpIGluIHRoZSByZXR1cm5lZCB2YWx1ZSBzaG91bGQgYmUgY29uc2lkZXJlZAorICogYXMgZ2FyYmFnZS4gIEl0IGlzIG5vdCBjbGVhcmVkIGhlcmUgYmVjYXVzZSBjYWxsZXJzIGFyZSBsaWtlbHkgdG8gdXNlIGEKKyAqIG11bHRpcGxpZXIgb24gdGhlIHJldHVybmVkIHZhbHVlIHdoaWNoIGNhbiBnZXQgcmlkIG9mIHRoZSB0b3AgYml0CisgKiBpbXBsaWNpdGx5IGJ5IG1ha2luZyB0aGUgbXVsdGlwbGllciBldmVuLCB0aGVyZWZvcmUgc2F2aW5nIG9uIGEgcnVudGltZQorICogY2xlYXItYml0IGluc3RydWN0aW9uLiBPdGhlcndpc2UgY2FsbGVyIG11c3QgcmVtZW1iZXIgdG8gY2xlYXIgdGhlIHRvcAorICogYml0IGV4cGxpY2l0bHkuCisgKi8KKworLyogdGhpcyBpcyB1c2VkIG9ubHkgdG8gZ2l2ZSBnY2MgYSBjbHVlIGFib3V0IGdvb2QgY29kZSBnZW5lcmF0aW9uICovCit0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCQl1MzIgbG8sIGhpOworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJCXUzMiBoaSwgbG87CisjZW5kaWYKKwl9OworCXU2NCB2YWw7Cit9IGNudDMyX3RvXzYzX3Q7CisKKyNkZWZpbmUgY250MzJfdG9fNjMoY250X2xvKSBcCisoeyBcCisJc3RhdGljIHZvbGF0aWxlIHUzMiBfX21fY250X2hpID0gMDsgXAorCWNudDMyX3RvXzYzX3QgX194OyBcCisJX194LmhpID0gX19tX2NudF9oaTsgXAorCV9feC5sbyA9IChjbnRfbG8pOyBcCisgCWlmICh1bmxpa2VseSgoczMyKShfX3guaGkgXiBfX3gubG8pIDwgMCkpIFwKKwkJX19tX2NudF9oaSA9IF9feC5oaSA9IChfX3guaGkgXiAweDgwMDAwMDAwKSArIChfX3guaGkgPj4gMzEpOyBcCisJX194LnZhbDsgXAorfSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vY3B1LW11bHRpMzIuaCBiL2luY2x1ZGUvYXNtLWFybS9jcHUtbXVsdGkzMi5oCmluZGV4IDQ2NzlmNjMuLjcxNWUxOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9jcHUtbXVsdGkzMi5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9jcHUtbXVsdGkzMi5oCkBAIC01MCw5ICs1MCwxMCBAQAogCSAqLwogCXZvaWQgKCpzd2l0Y2hfbW0pKHVuc2lnbmVkIGxvbmcgcGdkX3BoeXMsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIAkvKgotCSAqIFNldCBhIFBURQorCSAqIFNldCBhIHBvc3NpYmx5IGV4dGVuZGVkIFBURS4gIE5vbi1leHRlbmRlZCBQVEVzIHNob3VsZAorCSAqIGlnbm9yZSAnZXh0Jy4KIAkgKi8KLQl2b2lkICgqc2V0X3B0ZSkocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSk7CisJdm9pZCAoKnNldF9wdGVfZXh0KShwdGVfdCAqcHRlcCwgcHRlX3QgcHRlLCB1bnNpZ25lZCBpbnQgZXh0KTsKIH0gcHJvY2Vzc29yOwogCiAjZGVmaW5lIGNwdV9wcm9jX2luaXQoKQkJCXByb2Nlc3Nvci5fcHJvY19pbml0KCkKQEAgLTYwLDUgKzYxLDUgQEAKICNkZWZpbmUgY3B1X3Jlc2V0KGFkZHIpCQkJcHJvY2Vzc29yLnJlc2V0KGFkZHIpCiAjZGVmaW5lIGNwdV9kb19pZGxlKCkJCQlwcm9jZXNzb3IuX2RvX2lkbGUoKQogI2RlZmluZSBjcHVfZGNhY2hlX2NsZWFuX2FyZWEoYWRkcixzeikJcHJvY2Vzc29yLmRjYWNoZV9jbGVhbl9hcmVhKGFkZHIsc3opCi0jZGVmaW5lIGNwdV9zZXRfcHRlKHB0ZXAsIHB0ZSkJCXByb2Nlc3Nvci5zZXRfcHRlKHB0ZXAsIHB0ZSkKKyNkZWZpbmUgY3B1X3NldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkJcHJvY2Vzc29yLnNldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkKICNkZWZpbmUgY3B1X2RvX3N3aXRjaF9tbShwZ2QsbW0pCXByb2Nlc3Nvci5zd2l0Y2hfbW0ocGdkLG1tKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2NwdS1zaW5nbGUuaCBiL2luY2x1ZGUvYXNtLWFybS9jcHUtc2luZ2xlLmgKaW5kZXggNjcyM2U2Ny4uMGIxMjBlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2NwdS1zaW5nbGUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vY3B1LXNpbmdsZS5oCkBAIC0yOCw3ICsyOCw3IEBACiAjZGVmaW5lIGNwdV9kb19pZGxlCQkJX19jcHVfZm4oQ1BVX05BTUUsX2RvX2lkbGUpCiAjZGVmaW5lIGNwdV9kY2FjaGVfY2xlYW5fYXJlYQkJX19jcHVfZm4oQ1BVX05BTUUsX2RjYWNoZV9jbGVhbl9hcmVhKQogI2RlZmluZSBjcHVfZG9fc3dpdGNoX21tCQlfX2NwdV9mbihDUFVfTkFNRSxfc3dpdGNoX21tKQotI2RlZmluZSBjcHVfc2V0X3B0ZQkJCV9fY3B1X2ZuKENQVV9OQU1FLF9zZXRfcHRlKQorI2RlZmluZSBjcHVfc2V0X3B0ZV9leHQJCQlfX2NwdV9mbihDUFVfTkFNRSxfc2V0X3B0ZV9leHQpCiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCkBAIC00MCw1ICs0MCw1IEBACiBleHRlcm4gaW50IGNwdV9kb19pZGxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgY3B1X2RjYWNoZV9jbGVhbl9hcmVhKHZvaWQgKiwgaW50KTsKIGV4dGVybiB2b2lkIGNwdV9kb19zd2l0Y2hfbW0odW5zaWduZWQgbG9uZyBwZ2RfcGh5cywgc3RydWN0IG1tX3N0cnVjdCAqbW0pOwotZXh0ZXJuIHZvaWQgY3B1X3NldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSk7CitleHRlcm4gdm9pZCBjcHVfc2V0X3B0ZV9leHQocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGV4dCk7CiBleHRlcm4gdm9pZCBjcHVfcmVzZXQodW5zaWduZWQgbG9uZyBhZGRyKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2RldmljZS5oIGIvaW5jbHVkZS9hc20tYXJtL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2RpdjY0LmggYi9pbmNsdWRlL2FzbS1hcm0vZGl2NjQuaAppbmRleCAzNjgyNjE2Li4zN2UwYTk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vZGl2NjQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZGl2NjQuaApAQCAtMjcsNyArMjcsNyBAQAogI2RlZmluZSBfX3hoICJyMSIKICNlbmRpZgogCi0jZGVmaW5lIGRvX2RpdihuLGJhc2UpCQkJCQkJXAorI2RlZmluZSBfX2RvX2Rpdl9hc20obiwgYmFzZSkJCQkJCVwKICh7CQkJCQkJCQlcCiAJcmVnaXN0ZXIgdW5zaWduZWQgaW50IF9fYmFzZSAgICAgIGFzbSgicjQiKSA9IGJhc2U7CVwKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGxvbmcgX19uICAgYXNtKCJyMCIpID0gbjsJXApAQCAtNDUsNCArNDUsMTgyIEBACiAJX19yZW07CQkJCQkJCVwKIH0pCiAKKyNpZiBfX0dOVUNfXyA8IDQKKworLyoKKyAqIGdjYyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gNC4wIGFyZSBzaW1wbHkgdG9vIHByb2JsZW1hdGljIGZvciB0aGUKKyAqIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBiZWxvdy4gRmlyc3QgdGhlcmUgaXMgZ2NjIFBSIDE1MDg5IHRoYXQKKyAqIHRlbmQgdG8gdHJpZyBvbiBtb3JlIGNvbXBsZXggY29uc3RydWN0cywgc3B1cmlvdXMgLmdsb2JhbCBfX3VkaXZzaTMKKyAqIGFyZSBpbnNlcnRlZCBldmVuIGlmIG5vbmUgb2YgdGhvc2Ugc3ltYm9scyBhcmUgcmVmZXJlbmNlZCBpbiB0aGUKKyAqIGdlbmVyYXRlZCBjb2RlLCBhbmQgdGhvc2UgZ2NjIHZlcnNpb25zIGFyZSBub3QgYWJsZSB0byBkbyBjb25zdGFudAorICogcHJvcGFnYXRpb24gb24gbG9uZyBsb25nIHZhbHVlcyBhbnl3YXkuCisgKi8KKyNkZWZpbmUgZG9fZGl2KG4sIGJhc2UpIF9fZG9fZGl2X2FzbShuLCBiYXNlKQorCisjZWxpZiBfX0dOVUNfXyA+PSA0CisKKyNpbmNsdWRlIDxhc20vYnVnLmg+CisKKy8qCisgKiBJZiB0aGUgZGl2aXNvciBoYXBwZW5zIHRvIGJlIGNvbnN0YW50LCB3ZSBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlCisgKiBpbnZlcnNlIGF0IGNvbXBpbGUgdGltZSB0byB0dXJuIHRoZSBkaXZpc2lvbiBpbnRvIGEgZmV3IGlubGluZQorICogbXVsdGlwbGljYXRpb25zIGluc3RlYWQgd2hpY2ggaXMgbXVjaCBmYXN0ZXIuIEFuZCB5ZXQgb25seSBpZiBjb21waWxpbmcKKyAqIGZvciBBUk12NCBvciBoaWdoZXIgKHdlIG5lZWQgdW11bGwvdW1sYWwpIGFuZCBpZiB0aGUgZ2NjIHZlcnNpb24gaXMKKyAqIHN1ZmZpY2llbnRseSByZWNlbnQgdG8gcGVyZm9ybSBwcm9wZXIgbG9uZyBsb25nIGNvbnN0YW50IHByb3BhZ2F0aW9uLgorICogKEl0IGlzIHVuZm9ydHVuYXRlIHRoYXQgZ2NjIGRvZXNuJ3QgcGVyZm9ybSBhbGwgdGhpcyBpbnRlcm5hbGx5LikKKyAqLworI2RlZmluZSBkb19kaXYobiwgYmFzZSkJCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdW5zaWduZWQgaW50IF9fciwgX19iID0gKGJhc2UpOwkJCQkJXAorCWlmICghX19idWlsdGluX2NvbnN0YW50X3AoX19iKSB8fCBfX2IgPT0gMCB8fAkJCVwKKwkgICAgKF9fTElOVVhfQVJNX0FSQ0hfXyA8IDQgJiYgKF9fYiAmIChfX2IgLSAxKSkgIT0gMCkpIHsJXAorCQkvKiBub24tY29uc3RhbnQgZGl2aXNvciAob3IgemVybyk6IHNsb3cgcGF0aCAqLwkJXAorCQlfX3IgPSBfX2RvX2Rpdl9hc20obiwgX19iKTsJCQkJXAorCX0gZWxzZSBpZiAoKF9fYiAmIChfX2IgLSAxKSkgPT0gMCkgewkJCQlcCisJCS8qIFRyaXZpYWw6IF9fYiBpcyBjb25zdGFudCBhbmQgYSBwb3dlciBvZiAyICovCQlcCisJCS8qIGdjYyBkb2VzIHRoZSByaWdodCB0aGluZyB3aXRoIHRoaXMgY29kZS4gICovCQlcCisJCV9fciA9IG47CQkJCQkJXAorCQlfX3IgJj0gKF9fYiAtIDEpOwkJCQkJXAorCQluIC89IF9fYjsJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQkvKiBNdWx0aXBseSBieSBpbnZlcnNlIG9mIF9fYjogbi9iID0gbioocC9iKS9wICAgICAgICovCVwKKwkJLyogV2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IG1vc3Qgb2YgdGhpcyBjb2RlIGdldHMgICAqLwlcCisJCS8qIG9wdGltaXplZCBhd2F5IGF0IGNvbXBpbGUgdGltZSBkdWUgdG8gY29uc3RhbnQgICAgKi8JXAorCQkvKiBwcm9wYWdhdGlvbiBhbmQgb25seSBhIGNvdXBsZSBpbmxpbmUgYXNzZW1ibHkgICAgICovCVwKKwkJLyogaW5zdHJ1Y3Rpb25zIHNob3VsZCByZW1haW4uIEJldHRlciBhdm9pZCBhbnkgICAgICAqLwlcCisJCS8qIGNvZGUgY29uc3RydWN0IHRoYXQgbWlnaHQgcHJldmVudCB0aGF0LiAgICAgICAgICAgKi8JXAorCQl1bnNpZ25lZCBsb25nIGxvbmcgX19yZXMsIF9feCwgX190LCBfX20sIF9fbiA9IG47CVwKKwkJdW5zaWduZWQgaW50IF9fYywgX19wLCBfX3ogPSAwOwkJCQlcCisJCS8qIHByZXNlcnZlIGxvdyBwYXJ0IG9mIG4gZm9yIHJlbWluZGVyIGNvbXB1dGF0aW9uICovCVwKKwkJX19yID0gX19uOwkJCQkJCVwKKwkJLyogZGV0ZXJtaW5lIG51bWJlciBvZiBiaXRzIHRvIHJlcHJlc2VudCBfX2IgKi8JCVwKKwkJX19wID0gMSA8PCBfX2RpdjY0X2ZscyhfX2IpOwkJCQlcCisJCS8qIGNvbXB1dGUgX19tID0gKChfX3AgPDwgNjQpICsgX19iIC0gMSkgLyBfX2IgKi8JXAorCQlfX20gPSAofjBVTEwgLyBfX2IpICogX19wOwkJCQlcCisJCV9fbSArPSAoKCh+MFVMTCAlIF9fYiArIDEpICogX19wKSArIF9fYiAtIDEpIC8gX19iOwlcCisJCS8qIGNvbXB1dGUgX19yZXMgPSBfX20qKH4wVUxML19fYipfX2ItMSkvKF9fcCA8PCA2NCkgKi8JXAorCQlfX3ggPSB+MFVMTCAvIF9fYiAqIF9fYiAtIDE7CQkJCVwKKwkJX19yZXMgPSAoX19tICYgMHhmZmZmZmZmZikgKiAoX194ICYgMHhmZmZmZmZmZik7CVwKKwkJX19yZXMgPj49IDMyOwkJCQkJCVwKKwkJX19yZXMgKz0gKF9fbSAmIDB4ZmZmZmZmZmYpICogKF9feCA+PiAzMik7CQlcCisJCV9fdCA9IF9fcmVzOwkJCQkJCVwKKwkJX19yZXMgKz0gKF9feCAmIDB4ZmZmZmZmZmYpICogKF9fbSA+PiAzMik7CQlcCisJCV9fdCA9IChfX3JlcyA8IF9fdCkgPyAoMVVMTCA8PCAzMikgOiAwOwkJCVwKKwkJX19yZXMgPSAoX19yZXMgPj4gMzIpICsgX190OwkJCQlcCisJCV9fcmVzICs9IChfX20gPj4gMzIpICogKF9feCA+PiAzMik7CQkJXAorCQlfX3JlcyAvPSBfX3A7CQkJCQkJXAorCQkvKiBOb3cgc2FuaXRpemUgYW5kIG9wdGltaXplIHdoYXQgd2UndmUgZ290LiAqLwkJXAorCQlpZiAofjBVTEwgJSAoX19iIC8gKF9fYiAmIC1fX2IpKSA9PSAwKSB7CQlcCisJCQkvKiB0aG9zZSBjYXNlcyBjYW4gYmUgc2ltcGxpZmllZCB3aXRoOiAqLwlcCisJCQlfX24gLz0gKF9fYiAmIC1fX2IpOwkJCQlcCisJCQlfX20gPSB+MFVMTCAvIChfX2IgLyAoX19iICYgLV9fYikpOwkJXAorCQkJX19wID0gMTsJCQkJCVwKKwkJCV9fYyA9IDE7CQkJCQlcCisJCX0gZWxzZSBpZiAoX19yZXMgIT0gX194IC8gX19iKSB7CQkJXAorCQkJLyogV2UgY2FuJ3QgZ2V0IGF3YXkgd2l0aG91dCBhIGNvcnJlY3Rpb24gICAgKi8JXAorCQkJLyogdG8gY29tcGVuc2F0ZSBmb3IgYml0IHRydW5jYXRpb24gZXJyb3JzLiAgKi8JXAorCQkJLyogVG8gYXZvaWQgaXQgd2UnZCBuZWVkIGFuIGFkZGl0aW9uYWwgYml0ICAgKi8JXAorCQkJLyogdG8gcmVwcmVzZW50IF9fbSB3aGljaCB3b3VsZCBvdmVyZmxvdyBpdC4gKi8JXAorCQkJLyogSW5zdGVhZCB3ZSBkbyBtPXAvYiBhbmQgbi9iPShuKm0rbSkvcC4gICAgKi8JXAorCQkJX19jID0gMTsJCQkJCVwKKwkJCS8qIENvbXB1dGUgX19tID0gKF9fcCA8PCA2NCkgLyBfX2IgKi8JCVwKKwkJCV9fbSA9ICh+MFVMTCAvIF9fYikgKiBfX3A7CQkJXAorCQkJX19tICs9ICgofjBVTEwgJSBfX2IgKyAxKSAqIF9fcCkgLyBfX2I7CQlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJLyogUmVkdWNlIF9fbS9fX3AsIGFuZCB0cnkgdG8gY2xlYXIgYml0IDMxICAgKi8JXAorCQkJLyogb2YgX19tIHdoZW4gcG9zc2libGUgb3RoZXJ3aXNlIHRoYXQnbGwgICAgKi8JXAorCQkJLyogbmVlZCBleHRyYSBvdmVyZmxvdyBoYW5kbGluZyBsYXRlci4gICAgICAgKi8JXAorCQkJdW5zaWduZWQgaW50IF9fYml0cyA9IC0oX19tICYgLV9fbSk7CQlcCisJCQlfX2JpdHMgfD0gX19tID4+IDMyOwkJCQlcCisJCQlfX2JpdHMgPSAofl9fYml0cykgPDwgMTsJCQlcCisJCQkvKiBJZiBfX2JpdHMgPT0gMCB0aGVuIHNldHRpbmcgYml0IDMxIGlzICAgICAqLwlcCisJCQkvKiB1bmF2b2lkYWJsZS4gIFNpbXBseSBhcHBseSB0aGUgbWF4aW11bSAgICAqLwlcCisJCQkvKiBwb3NzaWJsZSByZWR1Y3Rpb24gaW4gdGhhdCBjYXNlLiAgICAgICAgICAqLwlcCisJCQkvKiBPdGhlcndpc2UgdGhlIE1TQiBvZiBfX2JpdHMgaW5kaWNhdGVzIHRoZSAqLwlcCisJCQkvKiBiZXN0IHJlZHVjdGlvbiB3ZSBzaG91bGQgYXBwbHkuICAgICAgICAgICAqLwlcCisJCQlpZiAoIV9fYml0cykgewkJCQkJXAorCQkJCV9fcCAvPSAoX19tICYgLV9fbSk7CQkJXAorCQkJCV9fbSAvPSAoX19tICYgLV9fbSk7CQkJXAorCQkJfSBlbHNlIHsJCQkJCVwKKwkJCQlfX3AgPj49IF9fZGl2NjRfZmxzKF9fYml0cyk7CQlcCisJCQkJX19tID4+PSBfX2RpdjY0X2ZscyhfX2JpdHMpOwkJXAorCQkJfQkJCQkJCVwKKwkJCS8qIE5vIGNvcnJlY3Rpb24gbmVlZGVkLiAqLwkJCVwKKwkJCV9fYyA9IDA7CQkJCQlcCisJCX0JCQkJCQkJXAorCQkvKiBOb3cgd2UgaGF2ZSBhIGNvbWJpbmF0aW9uIG9mIDIgY29uZGl0aW9uczogICAgICAgICovCVwKKwkJLyogMSkgd2hldGhlciBvciBub3Qgd2UgbmVlZCBhIGNvcnJlY3Rpb24gKF9fYyksIGFuZCAqLwlcCisJCS8qIDIpIHdoZXRoZXIgb3Igbm90IHRoZXJlIG1pZ2h0IGJlIGFuIG92ZXJmbG93IGluICAgKi8JXAorCQkvKiAgICB0aGUgY3Jvc3MgcHJvZHVjdCAoX19tICYgKCgxPDw2MykgfCAoMTw8MzEpKSkgICovCVwKKwkJLyogU2VsZWN0IHRoZSBiZXN0IGluc24gY29tYmluYXRpb24gdG8gcGVyZm9ybSB0aGUgICAqLwlcCisJCS8qIGFjdHVhbCBfX20gKiBfX24gLyAoX19wIDw8IDY0KSBvcGVyYXRpb24uICAgICAgICAgKi8JXAorCQlpZiAoIV9fYykgewkJCQkJCVwKKwkJCWFzbSAoCSJ1bXVsbAklUTAsICVSMCwgJTEsICVRMlxuXHQiCQlcCisJCQkJIm1vdgklUTAsICMwIgkJCVwKKwkJCQk6ICI9JnIiIChfX3JlcykJCQkJXAorCQkJCTogInIiIChfX20pLCAiciIgKF9fbikJCQlcCisJCQkJOiAiY2MiICk7CQkJCVwKKwkJfSBlbHNlIGlmICghKF9fbSAmICgoMVVMTCA8PCA2MykgfCAoMVVMTCA8PCAzMSkpKSkgewlcCisJCQlfX3JlcyA9IF9fbTsJCQkJCVwKKwkJCWFzbSAoCSJ1bWxhbAklUTAsICVSMCwgJVExLCAlUTJcblx0IgkJXAorCQkJCSJtb3YJJVEwLCAjMCIJCQlcCisJCQkJOiAiK3IiIChfX3JlcykJCQkJXAorCQkJCTogInIiIChfX20pLCAiciIgKF9fbikJCQlcCisJCQkJOiAiY2MiICk7CQkJCVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlhc20gKAkidW11bGwJJVEwLCAlUjAsICVRMSwgJVEyXG5cdCIJCVwKKwkJCQkiY21uCSVRMCwgJVExXG5cdCIJCQlcCisJCQkJImFkY3MJJVIwLCAlUjAsICVSMVxuXHQiCQlcCisJCQkJImFkYwklUTAsICUzLCAjMCIJCQlcCisJCQkJOiAiPSZyIiAoX19yZXMpCQkJCVwKKwkJCQk6ICJyIiAoX19tKSwgInIiIChfX24pLCAiciIgKF9feikJXAorCQkJCTogImNjIiApOwkJCQlcCisJCX0JCQkJCQkJXAorCQlpZiAoIShfX20gJiAoKDFVTEwgPDwgNjMpIHwgKDFVTEwgPDwgMzEpKSkpIHsJCVwKKwkJCWFzbSAoCSJ1bWxhbAklUjAsICVRMCwgJVIxLCAlUTJcblx0IgkJXAorCQkJCSJ1bWxhbAklUjAsICVRMCwgJVExLCAlUjJcblx0IgkJXAorCQkJCSJtb3YJJVIwLCAjMFxuXHQiCQkJXAorCQkJCSJ1bWxhbAklUTAsICVSMCwgJVIxLCAlUjIiCQlcCisJCQkJOiAiK3IiIChfX3JlcykJCQkJXAorCQkJCTogInIiIChfX20pLCAiciIgKF9fbikJCQlcCisJCQkJOiAiY2MiICk7CQkJCVwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlhc20gKAkidW1sYWwJJVIwLCAlUTAsICVSMiwgJVEzXG5cdCIJCVwKKwkJCQkidW1sYWwJJVIwLCAlMSwgJVEyLCAlUjNcblx0IgkJXAorCQkJCSJtb3YJJVIwLCAjMFxuXHQiCQkJXAorCQkJCSJhZGRzCSVRMCwgJTEsICVRMFxuXHQiCQlcCisJCQkJImFkYwklUjAsICVSMCwgIzBcblx0IgkJXAorCQkJCSJ1bWxhbAklUTAsICVSMCwgJVIyLCAlUjMiCQlcCisJCQkJOiAiK3IiIChfX3JlcyksICIrciIgKF9feikJCVwKKwkJCQk6ICJyIiAoX19tKSwgInIiIChfX24pCQkJXAorCQkJCTogImNjIiApOwkJCQlcCisJCX0JCQkJCQkJXAorCQlfX3JlcyAvPSBfX3A7CQkJCQkJXAorCQkvKiBUaGUgcmVtaW5kZXIgY2FuIGJlIGNvbXB1dGVkIHdpdGggMzItYml0IHJlZ3MgICAgICovCVwKKwkJLyogb25seSwgYW5kIGdjYyBpcyBnb29kIGF0IHRoYXQuICAgICAgICAgICAgICAgICAgICAqLwlcCisJCXsJCQkJCQkJXAorCQkJdW5zaWduZWQgaW50IF9fcmVzMCA9IF9fcmVzOwkJCVwKKwkJCXVuc2lnbmVkIGludCBfX2IwID0gX19iOwkJCVwKKwkJCV9fciAtPSBfX3JlczAgKiBfX2IwOwkJCQlcCisJCX0JCQkJCQkJXAorCQkvKiBCVUdfT04oX19yID49IF9fYiB8fCBfX3JlcyAqIF9fYiArIF9fciAhPSBuKTsgKi8JXAorCQluID0gX19yZXM7CQkJCQkJXAorCX0JCQkJCQkJCVwKKwlfX3I7CQkJCQkJCQlcCit9KQorCisvKiBvdXIgb3duIGZscyBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIHN1cmUgY29uc3RhbnQgcHJvcGFnYXRpb24gaXMgZmluZSAqLworI2RlZmluZSBfX2RpdjY0X2ZscyhiaXRzKQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBfX2xlZnQgPSAoYml0cyksIF9fbnIgPSAwOwkJCQlcCisJaWYgKF9fbGVmdCAmIDB4ZmZmZjAwMDApIF9fbnIgKz0gMTYsIF9fbGVmdCA+Pj0gMTY7CQlcCisJaWYgKF9fbGVmdCAmIDB4MDAwMGZmMDApIF9fbnIgKz0gIDgsIF9fbGVmdCA+Pj0gIDg7CQlcCisJaWYgKF9fbGVmdCAmIDB4MDAwMDAwZjApIF9fbnIgKz0gIDQsIF9fbGVmdCA+Pj0gIDQ7CQlcCisJaWYgKF9fbGVmdCAmIDB4MDAwMDAwMGMpIF9fbnIgKz0gIDIsIF9fbGVmdCA+Pj0gIDI7CQlcCisJaWYgKF9fbGVmdCAmIDB4MDAwMDAwMDIpIF9fbnIgKz0gIDE7CQkJCVwKKwlfX25yOwkJCQkJCQkJXAorfSkKKworI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1hcm0vZG1hLW1hcHBpbmcuaAppbmRleCA1NWViNGRjLi45YmM0NmI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vZG1hLW1hcHBpbmcuaApAQCAtMTIsNiArMTIsMTAgQEAKICAqIHVuY2FjaGVkLCB1bndyaXRlLWJ1ZmZlcmVkIG1hcHBlZCBtZW1vcnkgc3BhY2UgZm9yIHVzZSB3aXRoIERNQQogICogZGV2aWNlcy4gIFRoaXMgaXMgdGhlICJnZW5lcmljIiB2ZXJzaW9uLiAgVGhlIFBDSSBzcGVjaWZpYyB2ZXJzaW9uCiAgKiBpcyBpbiBwY2kuaAorICoKKyAqIE5vdGU6IERyaXZlcnMgc2hvdWxkIE5PVCB1c2UgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSwgYXMgaXQgd2lsbCBicmVhaworICogcGxhdGZvcm1zIHdpdGggQ09ORklHX0RNQUJPVU5DRS4KKyAqIFVzZSB0aGUgZHJpdmVyIERNQSBzdXBwb3J0IC0gc2VlIGRtYS1tYXBwaW5nLmggKGRtYV9zeW5jXyopCiAgKi8KIGV4dGVybiB2b2lkIGNvbnNpc3RlbnRfc3luYyh2b2lkICprYWRkciwgc2l6ZV90IHNpemUsIGludCBydyk7CiAKQEAgLTQ0LDcgKzQ4LDcgQEAKIAlyZXR1cm4gMzI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRtYV9pc19jb25zaXN0ZW50KGRtYV9hZGRyX3QgaGFuZGxlKQorc3RhdGljIGlubGluZSBpbnQgZG1hX2lzX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGhhbmRsZSkKIHsKIAlyZXR1cm4gISFhcmNoX2lzX2NvaGVyZW50KCk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vZWxmLmggYi9pbmNsdWRlL2FzbS1hcm0vZWxmLmgKaW5kZXggMTdmMGM2NS4uNjQyMzgyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9lbGYuaApAQCAtMSwxNyArMSwyMiBAQAogI2lmbmRlZiBfX0FTTUFSTV9FTEZfSAogI2RlZmluZSBfX0FTTUFSTV9FTEZfSAogCi0KKyNpZm5kZWYgX19BU1NFTUJMWV9fCiAvKgogICogRUxGIHJlZ2lzdGVyIGRlZmluaXRpb25zLi4KICAqLwotCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS91c2VyLmg+CiAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZ3JlZ190OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9mcmVnX3RbM107CiAKKyNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YgKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZihlbGZfZ3JlZ190KSkKK3R5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107CisKK3R5cGVkZWYgc3RydWN0IHVzZXJfZnAgZWxmX2ZwcmVnc2V0X3Q7CisjZW5kaWYKKwogI2RlZmluZSBFTV9BUk0JNDAKICNkZWZpbmUgRUZfQVJNX0FQQ1MyNiAweDA4CiAjZGVmaW5lIEVGX0FSTV9TT0ZUX0ZMT0FUIDB4MjAwCkBAIC0yMywxMSArMjgsNiBAQAogI2RlZmluZSBSX0FSTV9DQUxMCTI4CiAjZGVmaW5lIFJfQVJNX0pVTVAyNAkyOQogCi0jZGVmaW5lIEVMRl9OR1JFRyAoc2l6ZW9mIChzdHJ1Y3QgcHRfcmVncykgLyBzaXplb2YoZWxmX2dyZWdfdCkpCi10eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOwotCi10eXBlZGVmIHN0cnVjdCB1c2VyX2ZwIGVsZl9mcHJlZ3NldF90OwotCiAvKgogICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCiAgKi8KQEAgLTM5LDEzICszOSw2NSBAQAogI2VuZGlmCiAjZGVmaW5lIEVMRl9BUkNICUVNX0FSTQogCisvKgorICogSFdDQVAgZmxhZ3MgLSBmb3IgZWxmX2h3Y2FwIChpbiBrZXJuZWwpIGFuZCBBVF9IV0NBUAorICovCisjZGVmaW5lIEhXQ0FQX1NXUAkxCisjZGVmaW5lIEhXQ0FQX0hBTEYJMgorI2RlZmluZSBIV0NBUF9USFVNQgk0CisjZGVmaW5lIEhXQ0FQXzI2QklUCTgJLyogUGxheSBpdCBzYWZlICovCisjZGVmaW5lIEhXQ0FQX0ZBU1RfTVVMVAkxNgorI2RlZmluZSBIV0NBUF9GUEEJMzIKKyNkZWZpbmUgSFdDQVBfVkZQCTY0CisjZGVmaW5lIEhXQ0FQX0VEU1AJMTI4CisjZGVmaW5lIEhXQ0FQX0pBVkEJMjU2CisjZGVmaW5lIEhXQ0FQX0lXTU1YVAk1MTIKKwogI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogVGhpcyB5aWVsZHMgYSBtYXNrIHRoYXQgdXNlciBwcm9ncmFtcyBjYW4gdXNlIHRvIGZpZ3VyZSBvdXQgd2hhdAorICogaW5zdHJ1Y3Rpb24gc2V0IHRoaXMgY3B1IHN1cHBvcnRzLgorICovCisjZGVmaW5lIEVMRl9IV0NBUAkoZWxmX2h3Y2FwKQorZXh0ZXJuIHVuc2lnbmVkIGludCBlbGZfaHdjYXA7CisKKy8qCisgKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KKyAqIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCisgKiBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4KKyAqCisgKiBGb3Igbm93IHdlIGp1c3QgcHJvdmlkZSBhIGZhaXJseSBnZW5lcmFsIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUKKyAqIHByb2Nlc3NvciBmYW1pbHkuICBUaGlzIGNvdWxkIGJlIG1hZGUgbW9yZSBzcGVjaWZpYyBsYXRlciBpZiBzb21lb25lCisgKiBpbXBsZW1lbnRlZCBvcHRpbWlzYXRpb25zIHRoYXQgcmVxdWlyZSBpdC4gIDI2LWJpdCBDUFVzIGdpdmUgeW91CisgKiAidjFsIiBmb3IgQVJNMiAobm8gU1dQKSBhbmQgInYybCIgZm9yIGFueXRoaW5nIGVsc2UgKEFSTTEgaXNuJ3QKKyAqIHN1cHBvcnRlZCkuICAzMi1iaXQgQ1BVcyBnaXZlIHlvdSAidjNbbGJdIiBmb3IgYW55dGhpbmcgYmFzZWQgb24gYW4KKyAqIEFSTTYgb3IgQVJNNyBjb3JlIGFuZCAiYXJtdjRbbGJdIiBmb3IgYW55dGhpbmcgYmFzZWQgb24gYSBTdHJvbmdBUk0tMQorICogY29yZS4KKyAqLworI2RlZmluZSBFTEZfUExBVEZPUk1fU0laRSA4CisjZGVmaW5lIEVMRl9QTEFURk9STQkoZWxmX3BsYXRmb3JtKQorCitleHRlcm4gY2hhciBlbGZfcGxhdGZvcm1bXTsKKyNlbmRpZgogCiAvKgogICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KICAqLwotI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KSAoICgoeCktPmVfbWFjaGluZSA9PSBFTV9BUk0pICYmIChFTEZfUFJPQ19PSygoeCkpKSApCisjZGVmaW5lIGVsZl9jaGVja19hcmNoKHgpICgoeCktPmVfbWFjaGluZSA9PSBFTV9BUk0gJiYgRUxGX1BST0NfT0soeCkpCisKKy8qCisgKiAzMi1iaXQgY29kZSBpcyBhbHdheXMgT0suICBTb21lIGNwdXMgY2FuIGRvIDI2LWJpdCwgc29tZSBjYW4ndC4KKyAqLworI2RlZmluZSBFTEZfUFJPQ19PSyh4KQkoRUxGX1RIVU1CX09LKHgpICYmIEVMRl8yNkJJVF9PSyh4KSkKKworI2RlZmluZSBFTEZfVEhVTUJfT0soeCkgXAorCSgoZWxmX2h3Y2FwICYgSFdDQVBfVEhVTUIgJiYgKCh4KS0+ZV9lbnRyeSAmIDEpID09IDEpIHx8IFwKKwkgKCh4KS0+ZV9lbnRyeSAmIDMpID09IDApCisKKyNkZWZpbmUgRUxGXzI2QklUX09LKHgpIFwKKwkoKGVsZl9od2NhcCAmIEhXQ0FQXzI2QklUICYmICh4KS0+ZV9mbGFncyAmIEVGX0FSTV9BUENTMjYpIHx8IFwKKwkgICgoeCktPmVfZmxhZ3MgJiBFRl9BUk1fQVBDUzI2KSA9PSAwKQogCiAjZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCiAjZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCTQwOTYKQEAgLTYyLDc0ICsxMTQsMjQgQEAKICAgIGhhdmUgbm8gc3VjaCBoYW5kbGVyLiAgKi8KICNkZWZpbmUgRUxGX1BMQVRfSU5JVChfciwgbG9hZF9hZGRyKQkoX3IpLT5BUk1fcjAgPSAwCiAKLS8qIFRoaXMgeWllbGRzIGEgbWFzayB0aGF0IHVzZXIgcHJvZ3JhbXMgY2FuIHVzZSB0byBmaWd1cmUgb3V0IHdoYXQKLSAgIGluc3RydWN0aW9uIHNldCB0aGlzIGNwdSBzdXBwb3J0cy4gKi8KLQotI2RlZmluZSBFTEZfSFdDQVAJKGVsZl9od2NhcCkKLQotLyogVGhpcyB5aWVsZHMgYSBzdHJpbmcgdGhhdCBsZC5zbyB3aWxsIHVzZSB0byBsb2FkIGltcGxlbWVudGF0aW9uCi0gICBzcGVjaWZpYyBsaWJyYXJpZXMgZm9yIG9wdGltaXphdGlvbi4gIFRoaXMgaXMgbW9yZSBzcGVjaWZpYyBpbgotICAgaW50ZW50IHRoYW4gcG9raW5nIGF0IHVuYW1lIG9yIC9wcm9jL2NwdWluZm8uICovCi0KLS8qIEZvciBub3cgd2UganVzdCBwcm92aWRlIGEgZmFpcmx5IGdlbmVyYWwgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZQotICAgcHJvY2Vzc29yIGZhbWlseS4gIFRoaXMgY291bGQgYmUgbWFkZSBtb3JlIHNwZWNpZmljIGxhdGVyIGlmIHNvbWVvbmUKLSAgIGltcGxlbWVudGVkIG9wdGltaXNhdGlvbnMgdGhhdCByZXF1aXJlIGl0LiAgMjYtYml0IENQVXMgZ2l2ZSB5b3UKLSAgICJ2MWwiIGZvciBBUk0yIChubyBTV1ApIGFuZCAidjJsIiBmb3IgYW55dGhpbmcgZWxzZSAoQVJNMSBpc24ndAotICAgc3VwcG9ydGVkKS4gIDMyLWJpdCBDUFVzIGdpdmUgeW91ICJ2M1tsYl0iIGZvciBhbnl0aGluZyBiYXNlZCBvbiBhbgotICAgQVJNNiBvciBBUk03IGNvcmUgYW5kICJhcm12NFtsYl0iIGZvciBhbnl0aGluZyBiYXNlZCBvbiBhIFN0cm9uZ0FSTS0xCi0gICBjb3JlLiAgKi8KLQotI2RlZmluZSBFTEZfUExBVEZPUk1fU0laRSA4Ci1leHRlcm4gY2hhciBlbGZfcGxhdGZvcm1bXTsKLSNkZWZpbmUgRUxGX1BMQVRGT1JNCShlbGZfcGxhdGZvcm0pCi0KIC8qCi0gKiAzMi1iaXQgY29kZSBpcyBhbHdheXMgT0suICBTb21lIGNwdXMgY2FuIGRvIDI2LWJpdCwgc29tZSBjYW4ndC4KKyAqIFNpbmNlIHRoZSBGUEEgY29wcm9jZXNzb3IgdXNlcyBDUDEgYW5kIENQMiwgYW5kIGlXTU1YdCB1c2VzIENQMAorICogYW5kIENQMSwgd2Ugb25seSBlbmFibGUgYWNjZXNzIHRvIHRoZSBpV01NWHQgY29wcm9jZXNzb3IgaWYgdGhlCisgKiBiaW5hcnkgaXMgRUFCSSBvciBzb2Z0ZmxvYXQgKGFuZCB0aHVzLCBndWFyYW50ZWVkIG5vdCB0byB1c2UKKyAqIEZQQSBpbnN0cnVjdGlvbnMuKQogICovCi0jZGVmaW5lIEVMRl9QUk9DX09LKHgpCShFTEZfVEhVTUJfT0soeCkgJiYgRUxGXzI2QklUX09LKHgpKQotCi0jZGVmaW5lIEVMRl9USFVNQl9PSyh4KSBcCi0JKCggKGVsZl9od2NhcCAmIEhXQ0FQX1RIVU1CKSAmJiAoKHgpLT5lX2VudHJ5ICYgMSkgPT0gMSkgfHwgXAotCSAoKHgpLT5lX2VudHJ5ICYgMykgPT0gMCkKLQotI2RlZmluZSBFTEZfMjZCSVRfT0soeCkgXAotCSgoIChlbGZfaHdjYXAgJiBIV0NBUF8yNkJJVCkgJiYgKHgpLT5lX2ZsYWdzICYgRUZfQVJNX0FQQ1MyNikgfHwgXAotCSAgKCh4KS0+ZV9mbGFncyAmIEVGX0FSTV9BUENTMjYpID09IDApCi0KLSNpZm5kZWYgQ09ORklHX0lXTU1YVAotCi0vKiBPbGQgTmV0V2luZGVyIGJpbmFyaWVzIHdlcmUgY29tcGlsZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBpQkNTCi0gICBoZXVyaXN0aWMgYWx3YXlzIHRyaXBzIG9uIHRoZW0uICBVbnRpbCB0aGVzZSBiaW5hcmllcyBiZWNvbWUgdW5jb21tb24KLSAgIGVub3VnaCBub3QgdG8gY2FyZSwgZG9uJ3QgdHJ1c3QgdGhlIGBpYmNzJyBmbGFnIGhlcmUuICBJbiBhbnkgY2FzZQotICAgdGhlcmUgaXMgbm8gb3RoZXIgRUxGIHN5c3RlbSBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IGlCQ1MuCi0gICBAQCBDb3VsZCBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSB0byBlbmNvdXJhZ2UgdXNlcnMgdG8gdXBncmFkZS4gICovCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCxpYmNzMikgXAotCXNldF9wZXJzb25hbGl0eSgoKGV4KS5lX2ZsYWdzJkVGX0FSTV9BUENTMjYgP1BFUl9MSU5VWCA6UEVSX0xJTlVYXzMyQklUKSkKLQotI2Vsc2UKLQotLyoKLSAqIEFsbCBpV01NWHQgY2FwYWJsZSBDUFVzIGRvbid0IHN1cHBvcnQgMjYtYml0IG1vZGUuICBZZXQgdGhleSBjYW4gcnVuCi0gKiBsZWdhY3kgYmluYXJpZXMgd2hpY2ggdXNlZCB0byBjb250YWluIEZQQTExIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucwotICogdGhhdCBoYXZlIGFsd2F5cyBiZWVuIGVtdWxhdGVkIGJ5IHRoZSBrZXJuZWwuICBQRkExMSBhbmQgaVdNTVh0IG92ZXJsYXAKLSAqIG9uIGNvcHJvY2Vzc29yIDEgc3BhY2UgdGhvdWdoLiAgV2UgdGhlcmVmb3JlIG11c3QgZGVjaWRlIGlmIGdpdmVuIHRhc2sKLSAqIGlzIGFsbG93ZWQgdG8gdXNlIENQIDAgYW5kIDEgZm9yIGlXTU1YdCwgb3IgaWYgdGhleSBzaG91bGQgYmUgYmxvY2tlZAotICogYXQgYWxsIHRpbWVzIGZvciB0aGUgcHJlZmV0Y2ggZXhjZXB0aW9uIGhhbmRsZXIgdG8gY2F0Y2ggRlBBMTEgb3Bjb2RlcwotICogYW5kIGVtdWxhdGUgdGhlbS4gIFRoZSBiZXN0IGluZGljYXRpb24gdG8gZGlzY3JpbWluYXRlIHRob3NlIHR3byBjYXNlcwotICogaXMgdGhlIFNPRlRfRkxPQVQgZmxhZyBpbiB0aGUgRUxGIGhlYWRlci4KLSAqLwotCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCxpYmNzMikgXAotZG8geyBcCi0Jc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWF8zMkJJVCk7IFwKLQlpZiAoKChleCkuZV9mbGFncyAmIEVGX0FSTV9FQUJJX01BU0spIHx8IFwKLQkgICAgKChleCkuZV9mbGFncyAmIEVGX0FSTV9TT0ZUX0ZMT0FUKSkgXAotCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1VTSU5HX0lXTU1YVCk7IFwKLQllbHNlIFwKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1VTSU5HX0lXTU1YVCk7IFwKLX0gd2hpbGUgKDApCi0KLSNlbmRpZgorI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKChleCkuZV9mbGFncyAmIEVGX0FSTV9BUENTMjYpIHsJCQlcCisJCQlzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKTsJCQlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWF8zMkJJVCk7CQlcCisJCQlpZiAoZWxmX2h3Y2FwICYgSFdDQVBfSVdNTVhUICYmIChleCkuZV9mbGFncyAmIChFRl9BUk1fRUFCSV9NQVNLIHwgRUZfQVJNX1NPRlRfRkxPQVQpKSBcCisJCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9VU0lOR19JV01NWFQpOwlcCisJCQllbHNlCQkJCQkJXAorCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9VU0lOR19JV01NWFQpOwlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9pby5oCmluZGV4IGFlOTk5ZmQuLjI4OGY3NmIxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2lvLmgKQEAgLTc1LDE0ICs3NSw2IEBACiAgKi8KICNpbmNsdWRlIDxhc20vYXJjaC9pby5oPgogCi0jaWZkZWYgX19pb19wY2kKLSN3YXJuaW5nIG1hY2hpbmUgY2xhc3MgdXNlcyBidWdneSBfX2lvX3BjaQotI2VuZGlmCi0jaWYgZGVmaW5lZChfX2FyY2hfcHV0YikgfHwgZGVmaW5lZChfX2FyY2hfcHV0dykgfHwgZGVmaW5lZChfX2FyY2hfcHV0bCkgfHwgXAotICAgIGRlZmluZWQoX19hcmNoX2dldGIpIHx8IGRlZmluZWQoX19hcmNoX2dldHcpIHx8IGRlZmluZWQoX19hcmNoX2dldGwpCi0jd2FybmluZyBtYWNoaW5lIGNsYXNzIHVzZXMgb2xkIF9fYXJjaF9wdXR3IG9yIF9fYXJjaF9nZXR3Ci0jZW5kaWYKLQogLyoKICAqICBJTyBwb3J0IGFjY2VzcyBwcmltaXRpdmVzCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL21hY2gvaXJxLmggYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9pcnEuaAppbmRleCAwZTAxN2VjLi5lYjBiZmJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9pcnEuaApAQCAtMjIsMTIgKzIyLDYgQEAKIGV4dGVybiBpbnQgc2hvd19maXFfbGlzdChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKIAogLyoKLSAqIEZ1bmN0aW9uIHdyYXBwZXJzCi0gKi8KLSNkZWZpbmUgc2V0X2lycV9jaGlwZGF0YShpcnEsIGQpCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgZCkKLSNkZWZpbmUgZ2V0X2lycV9jaGlwZGF0YShpcnEpCQlnZXRfaXJxX2NoaXBfZGF0YShpcnEpCi0KLS8qCiAgKiBPYnNvbGV0ZSBpbmxpbmUgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaXJxIGRlc2NyaXB0b3IgaGFuZGxlcnMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXNjX2hhbmRsZV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQpAQCAtNDQsMTIgKzM4LDYgQEAKIC8qCiAgKiBUaGlzIGlzIGZvciBlYXN5IG1pZ3JhdGlvbiwgYnV0IHNob3VsZCBiZSBjaGFuZ2VkIGluIHRoZSBzb3VyY2UKICAqLwotI2RlZmluZSBkb19sZXZlbF9JUlEJaGFuZGxlX2xldmVsX2lycQotI2RlZmluZSBkb19lZGdlX0lSUQloYW5kbGVfZWRnZV9pcnEKLSNkZWZpbmUgZG9fc2ltcGxlX0lSUQloYW5kbGVfc2ltcGxlX2lycQotI2RlZmluZSBpcnFkZXNjCQlpcnFfZGVzYwotI2RlZmluZSBpcnFjaGlwCQlpcnFfY2hpcAotCiAjZGVmaW5lIGRvX2JhZF9JUlEoaXJxLGRlc2MpCQkJCVwKIGRvIHsJCQkJCQkJXAogCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tYWNoL3VkY19weGEyeHguaCBiL2luY2x1ZGUvYXNtLWFybS9tYWNoL3VkY19weGEyeHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjBhOTU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL21hY2gvdWRjX3B4YTJ4eC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2FzbS1hcm0vbWFjaC91ZGNfcHhhMnh4LmgKKyAqCisgKiBUaGlzIHN1cHBvcnRzIG1hY2hpbmUtc3BlY2lmaWMgZGlmZmVyZW5jZXMgaW4gaG93IHRoZSBQWEEyeHgKKyAqIFVTQiBEZXZpY2UgQ29udHJvbGxlciAoVURDKSBpcyB3aXJlZC4KKyAqCisgKiBJdCBpcyBzZXQgaW4gbGludXgvYXJjaC9hcm0vbWFjaC1weGEvPG1hY2hpbmU+LmMgb3IgaW4KKyAqIGxpbnV4L2FyY2gvbWFjaC1peHA0eHgvPG1hY2hpbmU+LmMgYW5kIHVzZWQgaW4KKyAqIHRoZSBwcm9iZSByb3V0aW5lIG9mIGxpbnV4L2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKKyAqLworCitzdHJ1Y3QgcHhhMnh4X3VkY19tYWNoX2luZm8geworICAgICAgICBpbnQgICgqdWRjX2lzX2Nvbm5lY3RlZCkodm9pZCk7CQkvKiBkbyB3ZSBzZWUgaG9zdD8gKi8KKyAgICAgICAgdm9pZCAoKnVkY19jb21tYW5kKShpbnQgY21kKTsKKyNkZWZpbmUJUFhBMlhYX1VEQ19DTURfQ09OTkVDVAkJMAkvKiBsZXQgaG9zdCBzZWUgdXMgKi8KKyNkZWZpbmUJUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVAkxCS8qIHNvIGhvc3Qgd29uJ3Qgc2VlIHVzICovCisKKwkvKiBCb2FyZHMgZm9sbG93aW5nIHRoZSBkZXNpZ24gZ3VpZGVsaW5lcyBpbiB0aGUgZGV2ZWxvcGVyJ3MgbWFudWFsLAorCSAqIHdpdGggb24tY2hpcCBHUElPcyBub3QgTHViYm9jaydzIHdpZXJkIGhhcmR3YXJlLCBjYW4gaGF2ZSBhIHNhbmUKKwkgKiBWQlVTIElSUSBhbmQgb21pdCB0aGUgbWV0aG9kcyBhYm92ZS4gIFN0b3JlIHRoZSBHUElPIG51bWJlcgorCSAqIGhlcmU7IGZvciBHUElPIDAsIGFsc28gbWFzayBpbiBvbmUgb2YgdGhlIHB4YV9ncGlvX21vZGUoKSBiaXRzLgorCSAqLworCXUxNglncGlvX3ZidXM7CQkJLyogaGlnaCA9PSB2YnVzIHByZXNlbnQgKi8KKwl1MTYJZ3Bpb19wdWxsdXA7CQkJLyogaGlnaCA9PSBwdWxsdXAgYWN0aXZhdGVkICovCit9OworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vbWVtb3J5LmggYi9pbmNsdWRlL2FzbS1hcm0vbWVtb3J5LmgKaW5kZXggOTFkNTM2Yy4uZDliZmIzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL21lbW9yeS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9tZW1vcnkuaApAQCAtMjE1LDYgKzIxNSw3IEBACiAgKiAgdmlydF9hZGRyX3ZhbGlkKGspCWluZGljYXRlcyB3aGV0aGVyIGEgdmlydHVhbCBhZGRyZXNzIGlzIHZhbGlkCiAgKi8KICNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQorCiAjZGVmaW5lIEFSQ0hfUEZOX09GRlNFVAkJUEhZU19QRk5fT0ZGU0VUCiAjZGVmaW5lIHBmbl92YWxpZChwZm4pCQkoKHBmbikgPj0gUEhZU19QRk5fT0ZGU0VUICYmIChwZm4pIDwgKFBIWVNfUEZOX09GRlNFVCArIG1heF9tYXBucikpCiAKQEAgLTIzMCw2ICsyMzEsNyBAQAogICogYXJvdW5kIGluIG1lbW9yeS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KKwogI2RlZmluZSBhcmNoX3Bmbl90b19uaWQocGZuKQlQRk5fVE9fTklEKHBmbikKICNkZWZpbmUgYXJjaF9sb2NhbF9wYWdlX29mZnNldChwZm4sIG5pZCkgTE9DQUxfTUFQX05SKChwZm4pIDw8IFBBR0VfU0hJRlQpCiAKQEAgLTI1Niw2ICsyNTgsNDMgQEAKICAqLwogI2RlZmluZSBQSFlTX1RPX05JRChhZGRyKQlQRk5fVE9fTklEKChhZGRyKSA+PiBQQUdFX1NISUZUKQogCisvKgorICogR2l2ZW4gYSBrYWRkciwgQUREUl9UT19NQVBCQVNFIGZpbmRzIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5CisgKiBhbmQgcmV0dXJucyB0aGUgbWVtX21hcCBvZiB0aGF0IG5vZGUuCisgKi8KKyNkZWZpbmUgQUREUl9UT19NQVBCQVNFKGthZGRyKQlOT0RFX01FTV9NQVAoS1ZBRERSX1RPX05JRChrYWRkcikpCisKKy8qCisgKiBHaXZlbiBhIHBhZ2UgZnJhbWUgbnVtYmVyLCBmaW5kIHRoZSBvd25pbmcgbm9kZSBvZiB0aGUgbWVtb3J5CisgKiBhbmQgcmV0dXJucyB0aGUgbWVtX21hcCBvZiB0aGF0IG5vZGUuCisgKi8KKyNkZWZpbmUgUEZOX1RPX01BUEJBU0UocGZuKQlOT0RFX01FTV9NQVAoUEZOX1RPX05JRChwZm4pKQorCisjaWZkZWYgTk9ERV9NRU1fU0laRV9CSVRTCisjZGVmaW5lIE5PREVfTUVNX1NJWkVfTUFTSwkoKDEgPDwgTk9ERV9NRU1fU0laRV9CSVRTKSAtIDEpCisKKy8qCisgKiBHaXZlbiBhIGtlcm5lbCBhZGRyZXNzLCBmaW5kIHRoZSBob21lIG5vZGUgb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5LgorICovCisjZGVmaW5lIEtWQUREUl9UT19OSUQoYWRkcikgXAorCSgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpIC0gUEFHRV9PRkZTRVQpID4+IE5PREVfTUVNX1NJWkVfQklUUykKKworLyoKKyAqIEdpdmVuIGEgcGFnZSBmcmFtZSBudW1iZXIsIGNvbnZlcnQgaXQgdG8gYSBub2RlIGlkLgorICovCisjZGVmaW5lIFBGTl9UT19OSUQocGZuKSBcCisJKCgocGZuKSAtIFBIWVNfUEZOX09GRlNFVCkgPj4gKE5PREVfTUVNX1NJWkVfQklUUyAtIFBBR0VfU0hJRlQpKQorCisvKgorICogR2l2ZW4gYSBrYWRkciwgTE9DQUxfTUVNX01BUCBmaW5kcyB0aGUgb3duaW5nIG5vZGUgb2YgdGhlIG1lbW9yeQorICogYW5kIHJldHVybnMgdGhlIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIHBhZ2UgaW4gdGhlCisgKiBub2RlJ3MgbWVtX21hcC4KKyAqLworI2RlZmluZSBMT0NBTF9NQVBfTlIoYWRkcikgXAorCSgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICYgTk9ERV9NRU1fU0laRV9NQVNLKSA+PiBQQUdFX1NISUZUKQorCisjZW5kaWYgLyogTk9ERV9NRU1fU0laRV9CSVRTICovCisKICNlbmRpZiAvKiAhQ09ORklHX0RJU0NPTlRJR01FTSAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BndGFibGUtbm9tbXUuaCBiL2luY2x1ZGUvYXNtLWFybS9wZ3RhYmxlLW5vbW11LmgKaW5kZXggYzFiMjY0ZC4uN2IxYzlhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3BndGFibGUtbm9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS1ub21tdS5oCkBAIC00NCw3ICs0NCw2IEBACiAjZGVmaW5lIFBBR0VfUkVBRE9OTFkJX19wZ3Byb3QoMCkKICNkZWZpbmUgUEFHRV9LRVJORUwJX19wZ3Byb3QoMCkKIAotLy9leHRlcm4gdm9pZCBwYWdpbmdfaW5pdChzdHJ1Y3QgbWVtaW5mbyAqLCBzdHJ1Y3QgbWFjaGluZV9kZXNjICopOwogI2RlZmluZSBzd2FwcGVyX3BnX2RpciAoKHBnZF90ICopIDApCiAKICNkZWZpbmUgX19zd3BfdHlwZSh4KQkJKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tYXJtL3BndGFibGUuaAppbmRleCBlZDhjYjU5Li5iOGNmMmQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wZ3RhYmxlLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vYXJjaC92bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KIAogLyoKICAqIEp1c3QgYW55IGFyYml0cmFyeSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB2bWFsbG9jIFZNIGFyZWE6IHRoZQpAQCAtMTY5LDkgKzE3MCw3IEBACiAjZGVmaW5lIExfUFRFX1dSSVRFCQkoMSA8PCA1KQogI2RlZmluZSBMX1BURV9FWEVDCQkoMSA8PCA2KQogI2RlZmluZSBMX1BURV9ESVJUWQkJKDEgPDwgNykKLSNkZWZpbmUgTF9QVEVfQ09IRVJFTlQJCSgxIDw8IDkpCS8qIEkvTyBjb2hlcmVudCAoeHNjMykgKi8KLSNkZWZpbmUgTF9QVEVfU0hBUkVECQkoMSA8PCAxMCkJLyogc2hhcmVkIGJldHdlZW4gQ1BVcyAodjYpICovCi0jZGVmaW5lIExfUFRFX0FTSUQJCSgxIDw8IDExKQkvKiBub24tZ2xvYmFsICh1c2UgQVNJRCwgdjYpICovCisjZGVmaW5lIExfUFRFX1NIQVJFRAkJKDEgPDwgMTApCS8qIHNoYXJlZCh2NiksIGNvaGVyZW50KHhzYzMpICovCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTIyOSw3ICsyMjgsNyBAQAogI2RlZmluZSBwZm5fcHRlKHBmbixwcm90KQkoX19wdGUoKChwZm4pIDw8IFBBR0VfU0hJRlQpIHwgcGdwcm90X3ZhbChwcm90KSkpCiAKICNkZWZpbmUgcHRlX25vbmUocHRlKQkJKCFwdGVfdmFsKHB0ZSkpCi0jZGVmaW5lIHB0ZV9jbGVhcihtbSxhZGRyLHB0ZXApCXNldF9wdGVfYXQoKG1tKSwoYWRkciksKHB0ZXApLCBfX3B0ZSgwKSkKKyNkZWZpbmUgcHRlX2NsZWFyKG1tLGFkZHIscHRlcCkJc2V0X3B0ZV9leHQocHRlcCwgX19wdGUoMCksIDApCiAjZGVmaW5lIHB0ZV9wYWdlKHB0ZSkJCShwZm5fdG9fcGFnZShwdGVfcGZuKHB0ZSkpKQogI2RlZmluZSBwdGVfb2Zmc2V0X2tlcm5lbChkaXIsYWRkcikJKHBtZF9wYWdlX3ZhZGRyKCooZGlyKSkgKyBfX3B0ZV9pbmRleChhZGRyKSkKICNkZWZpbmUgcHRlX29mZnNldF9tYXAoZGlyLGFkZHIpCShwbWRfcGFnZV92YWRkcigqKGRpcikpICsgX19wdGVfaW5kZXgoYWRkcikpCkBAIC0yMzcsOCArMjM2LDExIEBACiAjZGVmaW5lIHB0ZV91bm1hcChwdGUpCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHB0ZV91bm1hcF9uZXN0ZWQocHRlKQlkbyB7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgc2V0X3B0ZShwdGVwLCBwdGUpCWNwdV9zZXRfcHRlKHB0ZXAscHRlKQotI2RlZmluZSBzZXRfcHRlX2F0KG1tLGFkZHIscHRlcCxwdGV2YWwpIHNldF9wdGUocHRlcCxwdGV2YWwpCisjZGVmaW5lIHNldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkgY3B1X3NldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkKKworI2RlZmluZSBzZXRfcHRlX2F0KG1tLGFkZHIscHRlcCxwdGV2YWwpIGRvIHsgXAorCXNldF9wdGVfZXh0KHB0ZXAsIHB0ZXZhbCwgKGFkZHIpID49IFBBR0VfT0ZGU0VUID8gMCA6IFBURV9FWFRfTkcpOyBcCisgfSB3aGlsZSAoMCkKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWFybS9wcm9jZXNzb3IuaAppbmRleCAwNGY0ZDM0Li4xYmJmMTYxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wcm9jZXNzb3IuaApAQCAtMjAsNyArMjAsNiBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2luZm8uaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogdW5pb24gZGVidWdfaW5zbiB7CkBAIC0xMDQsMTQgKzEwMywxNCBAQAogI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CiAKICNkZWZpbmUgQVJDSF9IQVNfUFJFRkVUQ0gKLSNkZWZpbmUgcHJlZmV0Y2gocHRyKQkJCQlcCi0JKHsJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQlcCi0JCSJwbGRcdCUwIgkJCVwKLQkJOgkJCQlcCi0JCTogIm8iICgqKGNoYXIgKikocHRyKSkJCVwKLQkJOiAiY2MiKTsJCQlcCi0JfSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaChjb25zdCB2b2lkICpwdHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJwbGRcdCUwIgorCQk6CisJCTogIm8iICgqKGNoYXIgKilwdHIpCisJCTogImNjIik7Cit9CiAKICNkZWZpbmUgQVJDSF9IQVNfUFJFRkVUQ0hXCiAjZGVmaW5lIHByZWZldGNodyhwdHIpCXByZWZldGNoKHB0cikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wcm9jaW5mby5oIGIvaW5jbHVkZS9hc20tYXJtL3Byb2NpbmZvLmgKaW5kZXggOTFhMzFhZC4uNGQzYzY4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3Byb2NpbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3Byb2NpbmZvLmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpZm5kZWYgX19BU01fUFJPQ0lORk9fSAogI2RlZmluZSBfX0FTTV9QUk9DSU5GT19ICiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCisjaWZkZWYgX19LRVJORUxfXwogCiBzdHJ1Y3QgY3B1X3RsYl9mbnM7CiBzdHJ1Y3QgY3B1X3VzZXJfZm5zOwpAQCAtNDIsMTkgKzQyLDggQEAKIAlzdHJ1Y3QgY3B1X2NhY2hlX2ZucwkqY2FjaGU7CiB9OwogCi1leHRlcm4gdW5zaWduZWQgaW50IGVsZl9od2NhcDsKLQotI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwotCi0jZGVmaW5lIEhXQ0FQX1NXUAkxCi0jZGVmaW5lIEhXQ0FQX0hBTEYJMgotI2RlZmluZSBIV0NBUF9USFVNQgk0Ci0jZGVmaW5lIEhXQ0FQXzI2QklUCTgJLyogUGxheSBpdCBzYWZlICovCi0jZGVmaW5lIEhXQ0FQX0ZBU1RfTVVMVAkxNgotI2RlZmluZSBIV0NBUF9GUEEJMzIKLSNkZWZpbmUgSFdDQVBfVkZQCTY0Ci0jZGVmaW5lIEhXQ0FQX0VEU1AJMTI4Ci0jZGVmaW5lIEhXQ0FQX0pBVkEJMjU2Ci0jZGVmaW5lIEhXQ0FQX0lXTU1YVAk1MTIKLQorI2Vsc2UJLyogX19LRVJORUxfXyAqLworI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyN3YXJuaW5nICJQbGVhc2UgaW5jbHVkZSBhc20vZWxmLmggaW5zdGVhZCIKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9zZXR1cC5oIGIvaW5jbHVkZS9hc20tYXJtL3NldHVwLmgKaW5kZXggYWE0YjU3OC4uZTU0MDczOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3NldHVwLmgKQEAgLTE0LDU1ICsxNCw1NyBAQAogI2lmbmRlZiBfX0FTTUFSTV9TRVRVUF9ICiAjZGVmaW5lIF9fQVNNQVJNX1NFVFVQX0gKIAorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCiAjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDEwMjQKIAogLyogVGhlIGxpc3QgZW5kcyB3aXRoIGFuIEFUQUdfTk9ORSBub2RlLiAqLwogI2RlZmluZSBBVEFHX05PTkUJMHgwMDAwMDAwMAogCiBzdHJ1Y3QgdGFnX2hlYWRlciB7Ci0JdTMyIHNpemU7Ci0JdTMyIHRhZzsKKwlfX3UzMiBzaXplOworCV9fdTMyIHRhZzsKIH07CiAKIC8qIFRoZSBsaXN0IG11c3Qgc3RhcnQgd2l0aCBhbiBBVEFHX0NPUkUgbm9kZSAqLwogI2RlZmluZSBBVEFHX0NPUkUJMHg1NDQxMDAwMQogCiBzdHJ1Y3QgdGFnX2NvcmUgewotCXUzMiBmbGFnczsJCS8qIGJpdCAwID0gcmVhZC1vbmx5ICovCi0JdTMyIHBhZ2VzaXplOwotCXUzMiByb290ZGV2OworCV9fdTMyIGZsYWdzOwkJLyogYml0IDAgPSByZWFkLW9ubHkgKi8KKwlfX3UzMiBwYWdlc2l6ZTsKKwlfX3UzMiByb290ZGV2OwogfTsKIAogLyogaXQgaXMgYWxsb3dlZCB0byBoYXZlIG11bHRpcGxlIEFUQUdfTUVNIG5vZGVzICovCiAjZGVmaW5lIEFUQUdfTUVNCTB4NTQ0MTAwMDIKIAogc3RydWN0IHRhZ19tZW0zMiB7Ci0JdTMyCXNpemU7Ci0JdTMyCXN0YXJ0OwkvKiBwaHlzaWNhbCBzdGFydCBhZGRyZXNzICovCisJX191MzIJc2l6ZTsKKwlfX3UzMglzdGFydDsJLyogcGh5c2ljYWwgc3RhcnQgYWRkcmVzcyAqLwogfTsKIAogLyogVkdBIHRleHQgdHlwZSBkaXNwbGF5cyAqLwogI2RlZmluZSBBVEFHX1ZJREVPVEVYVAkweDU0NDEwMDAzCiAKIHN0cnVjdCB0YWdfdmlkZW90ZXh0IHsKLQl1OAkJeDsKLQl1OAkJeTsKLQl1MTYJCXZpZGVvX3BhZ2U7Ci0JdTgJCXZpZGVvX21vZGU7Ci0JdTgJCXZpZGVvX2NvbHM7Ci0JdTE2CQl2aWRlb19lZ2FfYng7Ci0JdTgJCXZpZGVvX2xpbmVzOwotCXU4CQl2aWRlb19pc3ZnYTsKLQl1MTYJCXZpZGVvX3BvaW50czsKKwlfX3U4CQl4OworCV9fdTgJCXk7CisJX191MTYJCXZpZGVvX3BhZ2U7CisJX191OAkJdmlkZW9fbW9kZTsKKwlfX3U4CQl2aWRlb19jb2xzOworCV9fdTE2CQl2aWRlb19lZ2FfYng7CisJX191OAkJdmlkZW9fbGluZXM7CisJX191OAkJdmlkZW9faXN2Z2E7CisJX191MTYJCXZpZGVvX3BvaW50czsKIH07CiAKIC8qIGRlc2NyaWJlcyBob3cgdGhlIHJhbWRpc2sgd2lsbCBiZSB1c2VkIGluIGtlcm5lbCAqLwogI2RlZmluZSBBVEFHX1JBTURJU0sJMHg1NDQxMDAwNAogCiBzdHJ1Y3QgdGFnX3JhbWRpc2sgewotCXUzMiBmbGFnczsJLyogYml0IDAgPSBsb2FkLCBiaXQgMSA9IHByb21wdCAqLwotCXUzMiBzaXplOwkvKiBkZWNvbXByZXNzZWQgcmFtZGlzayBzaXplIGluIF9raWxvXyBieXRlcyAqLwotCXUzMiBzdGFydDsJLyogc3RhcnRpbmcgYmxvY2sgb2YgZmxvcHB5LWJhc2VkIFJBTSBkaXNrIGltYWdlICovCisJX191MzIgZmxhZ3M7CS8qIGJpdCAwID0gbG9hZCwgYml0IDEgPSBwcm9tcHQgKi8KKwlfX3UzMiBzaXplOwkvKiBkZWNvbXByZXNzZWQgcmFtZGlzayBzaXplIGluIF9raWxvXyBieXRlcyAqLworCV9fdTMyIHN0YXJ0OwkvKiBzdGFydGluZyBibG9jayBvZiBmbG9wcHktYmFzZWQgUkFNIGRpc2sgaW1hZ2UgKi8KIH07CiAKIC8qIGRlc2NyaWJlcyB3aGVyZSB0aGUgY29tcHJlc3NlZCByYW1kaXNrIGltYWdlIGxpdmVzICh2aXJ0dWFsIGFkZHJlc3MpICovCkBAIC03NiwyMyArNzgsMjMgQEAKICNkZWZpbmUgQVRBR19JTklUUkQyCTB4NTQ0MjAwMDUKIAogc3RydWN0IHRhZ19pbml0cmQgewotCXUzMiBzdGFydDsJLyogcGh5c2ljYWwgc3RhcnQgYWRkcmVzcyAqLwotCXUzMiBzaXplOwkvKiBzaXplIG9mIGNvbXByZXNzZWQgcmFtZGlzayBpbWFnZSBpbiBieXRlcyAqLworCV9fdTMyIHN0YXJ0OwkvKiBwaHlzaWNhbCBzdGFydCBhZGRyZXNzICovCisJX191MzIgc2l6ZTsJLyogc2l6ZSBvZiBjb21wcmVzc2VkIHJhbWRpc2sgaW1hZ2UgaW4gYnl0ZXMgKi8KIH07CiAKIC8qIGJvYXJkIHNlcmlhbCBudW1iZXIuICI2NCBiaXRzIHNob3VsZCBiZSBlbm91Z2ggZm9yIGV2ZXJ5Ym9keSIgKi8KICNkZWZpbmUgQVRBR19TRVJJQUwJMHg1NDQxMDAwNgogCiBzdHJ1Y3QgdGFnX3NlcmlhbG5yIHsKLQl1MzIgbG93OwotCXUzMiBoaWdoOworCV9fdTMyIGxvdzsKKwlfX3UzMiBoaWdoOwogfTsKIAogLyogYm9hcmQgcmV2aXNpb24gKi8KICNkZWZpbmUgQVRBR19SRVZJU0lPTgkweDU0NDEwMDA3CiAKIHN0cnVjdCB0YWdfcmV2aXNpb24gewotCXUzMiByZXY7CisJX191MzIgcmV2OwogfTsKIAogLyogaW5pdGlhbCB2YWx1ZXMgZm9yIHZlc2FmYi10eXBlIGZyYW1lYnVmZmVycy4gc2VlIHN0cnVjdCBzY3JlZW5faW5mbwpAQCAtMTAxLDIwICsxMDMsMjAgQEAKICNkZWZpbmUgQVRBR19WSURFT0xGQgkweDU0NDEwMDA4CiAKIHN0cnVjdCB0YWdfdmlkZW9sZmIgewotCXUxNgkJbGZiX3dpZHRoOwotCXUxNgkJbGZiX2hlaWdodDsKLQl1MTYJCWxmYl9kZXB0aDsKLQl1MTYJCWxmYl9saW5lbGVuZ3RoOwotCXUzMgkJbGZiX2Jhc2U7Ci0JdTMyCQlsZmJfc2l6ZTsKLQl1OAkJcmVkX3NpemU7Ci0JdTgJCXJlZF9wb3M7Ci0JdTgJCWdyZWVuX3NpemU7Ci0JdTgJCWdyZWVuX3BvczsKLQl1OAkJYmx1ZV9zaXplOwotCXU4CQlibHVlX3BvczsKLQl1OAkJcnN2ZF9zaXplOwotCXU4CQlyc3ZkX3BvczsKKwlfX3UxNgkJbGZiX3dpZHRoOworCV9fdTE2CQlsZmJfaGVpZ2h0OworCV9fdTE2CQlsZmJfZGVwdGg7CisJX191MTYJCWxmYl9saW5lbGVuZ3RoOworCV9fdTMyCQlsZmJfYmFzZTsKKwlfX3UzMgkJbGZiX3NpemU7CisJX191OAkJcmVkX3NpemU7CisJX191OAkJcmVkX3BvczsKKwlfX3U4CQlncmVlbl9zaXplOworCV9fdTgJCWdyZWVuX3BvczsKKwlfX3U4CQlibHVlX3NpemU7CisJX191OAkJYmx1ZV9wb3M7CisJX191OAkJcnN2ZF9zaXplOworCV9fdTgJCXJzdmRfcG9zOwogfTsKIAogLyogY29tbWFuZCBsaW5lOiBcMCB0ZXJtaW5hdGVkIHN0cmluZyAqLwpAQCAtMTI4LDE3ICsxMzAsMTcgQEAKICNkZWZpbmUgQVRBR19BQ09STgkweDQxMDAwMTAxCiAKIHN0cnVjdCB0YWdfYWNvcm4gewotCXUzMiBtZW1jX2NvbnRyb2xfcmVnOwotCXUzMiB2cmFtX3BhZ2VzOwotCXU4IHNvdW5kZGVmYXVsdDsKLQl1OCBhZGZzZHJpdmVzOworCV9fdTMyIG1lbWNfY29udHJvbF9yZWc7CisJX191MzIgdnJhbV9wYWdlczsKKwlfX3U4IHNvdW5kZGVmYXVsdDsKKwlfX3U4IGFkZnNkcml2ZXM7CiB9OwogCiAvKiBmb290YnJpZGdlIG1lbW9yeSBjbG9jaywgc2VlIGFyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9hcmNoLmMgKi8KICNkZWZpbmUgQVRBR19NRU1DTEsJMHg0MTAwMDQwMgogCiBzdHJ1Y3QgdGFnX21lbWNsayB7Ci0JdTMyIGZtZW1jbGs7CisJX191MzIgZm1lbWNsazsKIH07CiAKIHN0cnVjdCB0YWcgewpAQCAtMTY3LDI0ICsxNjksMjYgQEAKIH07CiAKIHN0cnVjdCB0YWd0YWJsZSB7Ci0JdTMyIHRhZzsKKwlfX3UzMiB0YWc7CiAJaW50ICgqcGFyc2UpKGNvbnN0IHN0cnVjdCB0YWcgKik7CiB9OwogCi0jZGVmaW5lIF9fdGFnIF9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLnRhZ2xpc3QuaW5pdCIpKSkKLSNkZWZpbmUgX190YWd0YWJsZSh0YWcsIGZuKSBcCi1zdGF0aWMgc3RydWN0IHRhZ3RhYmxlIF9fdGFndGFibGVfIyNmbiBfX3RhZyA9IHsgdGFnLCBmbiB9Ci0KICNkZWZpbmUgdGFnX21lbWJlcl9wcmVzZW50KHRhZyxtZW1iZXIpCQkJCVwKIAkoKHVuc2lnbmVkIGxvbmcpKCYoKHN0cnVjdCB0YWcgKikwTCktPm1lbWJlciArIDEpCVwKIAkJPD0gKHRhZyktPmhkci5zaXplICogNCkKIAotI2RlZmluZSB0YWdfbmV4dCh0KQkoKHN0cnVjdCB0YWcgKikoKHUzMiAqKSh0KSArICh0KS0+aGRyLnNpemUpKQorI2RlZmluZSB0YWdfbmV4dCh0KQkoKHN0cnVjdCB0YWcgKikoKF9fdTMyICopKHQpICsgKHQpLT5oZHIuc2l6ZSkpCiAjZGVmaW5lIHRhZ19zaXplKHR5cGUpCSgoc2l6ZW9mKHN0cnVjdCB0YWdfaGVhZGVyKSArIHNpemVvZihzdHJ1Y3QgdHlwZSkpID4+IDIpCiAKICNkZWZpbmUgZm9yX2VhY2hfdGFnKHQsYmFzZSkJCVwKIAlmb3IgKHQgPSBiYXNlOyB0LT5oZHIuc2l6ZTsgdCA9IHRhZ19uZXh0KHQpKQogCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIF9fdGFnIF9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLnRhZ2xpc3QuaW5pdCIpKSkKKyNkZWZpbmUgX190YWd0YWJsZSh0YWcsIGZuKSBcCitzdGF0aWMgc3RydWN0IHRhZ3RhYmxlIF9fdGFndGFibGVfIyNmbiBfX3RhZyA9IHsgdGFnLCBmbiB9CisKIC8qCiAgKiBNZW1vcnkgbWFwIGRlc2NyaXB0aW9uCiAgKi8KQEAgLTIxNyw0ICsyMjEsNiBAQAogc3RhdGljIHN0cnVjdCBlYXJseV9wYXJhbXMgX19lYXJseV8jI2ZuIF9fYXR0cmlidXRlX3VzZWRfXwlcCiBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmVhcmx5X3BhcmFtLmluaXQiKSkpID0geyBuYW1lLCBmbiB9CiAKKyNlbmRpZiAgLyogIF9fS0VSTkVMX18gICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tYXJtL3N5c3RlbS5oCmluZGV4IGYwNWZiZTMuLmUxNjBhZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc3lzdGVtLmgKQEAgLTEzOSwyMyArMTM5LDYwIEBACiAjZGVmaW5lCWNwdV9pc194c2NhbGUoKQkxCiAjZW5kaWYKIAotI2RlZmluZSBzZXRfY3IoeCkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJXAotCSJtY3IJcDE1LCAwLCAlMCwgYzEsIGMwLCAwCUAgc2V0IENSIglcCi0JOiA6ICJyIiAoeCkgOiAiY2MiKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2NyKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlhc20oIm1yYyBwMTUsIDAsICUwLCBjMSwgYzAsIDAJQCBnZXQgQ1IiIDogIj1yIiAodmFsKSA6IDogImNjIik7CisJcmV0dXJuIHZhbDsKK30KIAotI2RlZmluZSBnZXRfY3IoKQkJCQkJXAotCSh7CQkJCQkJXAotCXVuc2lnbmVkIGludCBfX3ZhbDsJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQlcCi0JIm1yYwlwMTUsIDAsICUwLCBjMSwgYzAsIDAJQCBnZXQgQ1IiCVwKLQk6ICI9ciIgKF9fdmFsKSA6IDogImNjIik7CQkJXAotCV9fdmFsOwkJCQkJCVwKLQl9KQorc3RhdGljIGlubGluZSB2b2lkIHNldF9jcih1bnNpZ25lZCBpbnQgdmFsKQoreworCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGMxLCBjMCwgMAlAIHNldCBDUiIKKwkgIDogOiAiciIgKHZhbCkgOiAiY2MiKTsKK30KKworI2RlZmluZSBDUEFDQ19GVUxMKG4pCQkoMyA8PCAobiAqIDIpKQorI2RlZmluZSBDUEFDQ19TVkMobikJCSgxIDw8IChuICogMikpCisjZGVmaW5lIENQQUNDX0RJU0FCTEUobikJKDAgPDwgKG4gKiAyKSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2NvcHJvX2FjY2Vzcyh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJYXNtKCJtcmMgcDE1LCAwLCAlMCwgYzEsIGMwLCAyIEAgZ2V0IGNvcHJvIGFjY2VzcyIKKwkgIDogIj1yIiAodmFsKSA6IDogImNjIik7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9jb3Byb19hY2Nlc3ModW5zaWduZWQgaW50IHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjMSwgYzAsIDIgQCBzZXQgY29wcm8gYWNjZXNzIgorCSAgOiA6ICJyIiAodmFsKSA6ICJjYyIpOworfQogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBjcl9ub19hbGlnbm1lbnQ7CS8qIGRlZmluZWQgaW4gZW50cnktYXJtdi5TICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBjcl9hbGlnbm1lbnQ7CS8qIGRlZmluZWQgaW4gZW50cnktYXJtdi5TICovCiAKKyNpZm5kZWYgQ09ORklHX1NNUAorc3RhdGljIGlubGluZSB2b2lkIGFkanVzdF9jcih1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgc2V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNyOworCisJbWFzayAmPSB+Q1JfQTsKKworCXNldCAmPSBtYXNrOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJY3Jfbm9fYWxpZ25tZW50ID0gKGNyX25vX2FsaWdubWVudCAmIH5tYXNrKSB8IHNldDsKKwljcl9hbGlnbm1lbnQgPSAoY3JfYWxpZ25tZW50ICYgfm1hc2spIHwgc2V0OworCisJc2V0X2NyKChnZXRfY3IoKSAmIH5tYXNrKSB8IHNldCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisjZW5kaWYKKwogI2RlZmluZSBVREJHX1VOREVGSU5FRAkoMSA8PCAwKQogI2RlZmluZSBVREJHX1NZU0NBTEwJKDEgPDwgMSkKICNkZWZpbmUgVURCR19CQURBQk9SVAkoMSA8PCAyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1hcm0vdGVybWJpdHMuaAppbmRleCBiYmM2ZTFkLi5hM2Y0ZmUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vdGVybWJpdHMuaApAQCAtMTUsNiArMTUsMTggQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCisKIC8qIGNfY2MgY2hhcmFjdGVycyAqLwogI2RlZmluZSBWSU5UUiAwCiAjZGVmaW5lIFZRVUlUIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tYXJtL3RocmVhZF9pbmZvLmgKaW5kZXggZjI4YjIzNi4uNTAxNDc5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3RocmVhZF9pbmZvLmgKQEAgLTk0LDggKzk0LDE4IEBACiAJcmV0dXJuIChzdHJ1Y3QgdGhyZWFkX2luZm8gKikoc3AgJiB+KFRIUkVBRF9TSVpFIC0gMSkpOwogfQogCi1leHRlcm4gc3RydWN0IHRocmVhZF9pbmZvICphbGxvY190aHJlYWRfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwotZXh0ZXJuIHZvaWQgZnJlZV90aHJlYWRfaW5mbyhzdHJ1Y3QgdGhyZWFkX2luZm8gKik7CisvKiB0aHJlYWQgaW5mb3JtYXRpb24gYWxsb2NhdGlvbiAqLworI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS19VU0FHRQorI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2spIFwKKwkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIFwKKwkJVEhSRUFEX1NJWkVfT1JERVIpKQorI2Vsc2UKKyNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSBcCisJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFRIUkVBRF9TSVpFX09SREVSKSkKKyNlbmRpZgorCisjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8oaW5mbykgXAorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW5mbywgVEhSRUFEX1NJWkVfT1JERVIpOwogCiAjZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0c2spCVwKIAkoKHVuc2lnbmVkIGxvbmcpKHBjX3BvaW50ZXIodGFza190aHJlYWRfaW5mbyh0c2spLT5jcHVfY29udGV4dC5wYykpKQpAQCAtMTM3LDYgKzE0Nyw3IEBACiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNgogI2RlZmluZSBUSUZfVVNJTkdfSVdNTVhUCTE3CiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE4CisjZGVmaW5lIFRJRl9GUkVFWkUJCTE5CiAKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxIDw8IFRJRl9OT1RJRllfUkVTVU1FKQogI2RlZmluZSBfVElGX1NJR1BFTkRJTkcJCSgxIDw8IFRJRl9TSUdQRU5ESU5HKQpAQCAtMTQ0LDYgKzE1NSw3IEBACiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMSA8PCBUSUZfU1lTQ0FMTF9UUkFDRSkKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMSA8PCBUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfVVNJTkdfSVdNTVhUCSgxIDw8IFRJRl9VU0lOR19JV01NWFQpCisjZGVmaW5lIF9USUZfRlJFRVpFCQkoMSA8PCBUSUZfRlJFRVpFKQogCiAvKgogICogQ2hhbmdlIHRoZXNlIGFuZCB5b3UgYnJlYWsgQVNNIGNvZGUgaW4gZW50cnktY29tbW9uLlMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1hcm0vdWFjY2Vzcy5oCmluZGV4IDA5YWQwY2EuLjVmNDIwYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3VhY2Nlc3MuaApAQCAtMzgzLDE5ICszODMsMTkgQEAKIAogCiAjaWZkZWYgQ09ORklHX01NVQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBfX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqYWRkciwgdW5zaWduZWQgbG9uZyBuKTsKICNlbHNlCiAjZGVmaW5lIF9fY29weV9mcm9tX3VzZXIodG8sZnJvbSxuKQkobWVtY3B5KHRvLCAodm9pZCBfX2ZvcmNlICopZnJvbSwgbiksIDApCiAjZGVmaW5lIF9fY29weV90b191c2VyKHRvLGZyb20sbikJKG1lbWNweSgodm9pZCBfX2ZvcmNlICopdG8sIGZyb20sIG4pLCAwKQogI2RlZmluZSBfX2NsZWFyX3VzZXIoYWRkcixuKQkJKG1lbXNldCgodm9pZCBfX2ZvcmNlICopYWRkciwgMCwgbiksIDApCiAjZW5kaWYKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICp0bywgY29uc3QgY2hhciBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMsIGxvbmcgbik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICp0bywgY29uc3QgY2hhciBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzLCBsb25nIG4pOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQogCQluID0gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CkBAIC00MDQsNyArNDA0LDcgQEAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCiAJCW4gPSBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbik7CkBAIC00MTQsMTQgKzQxNCwxNCBAQAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkKIAkJbiA9IF9fY2xlYXJfdXNlcih0bywgbik7CiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCitzdGF0aWMgaW5saW5lIGxvbmcgX19tdXN0X2NoZWNrIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCkKIHsKIAlsb25nIHJlcyA9IC1FRkFVTFQ7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCAxKSkKQEAgLTQzMSw3ICs0MzEsNyBAQAogCiAjZGVmaW5lIHN0cmxlbl91c2VyKHMpCXN0cm5sZW5fdXNlcihzLCB+MFVMID4+IDEpCiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMsIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX211c3RfY2hlY2sgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzLCBsb25nIG4pCiB7CiAJdW5zaWduZWQgbG9uZyByZXMgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmgKaW5kZXggMTRhODdlZS4uMzJiMDZlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS91bmlzdGQuaApAQCAtMzQ3LDYgKzM0NywxOSBAQAogI2RlZmluZSBfX05SX21iaW5kCQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMxOSkKICNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CQkoX19OUl9TWVNDQUxMX0JBU0UrMzIwKQogI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJCShfX05SX1NZU0NBTExfQkFTRSszMjEpCisjZGVmaW5lIF9fTlJfb3BlbmF0CQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMyMikKKyNkZWZpbmUgX19OUl9ta2RpcmF0CQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMyMykKKyNkZWZpbmUgX19OUl9ta25vZGF0CQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMyNCkKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJCShfX05SX1NZU0NBTExfQkFTRSszMjUpCisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMyNikKKyNkZWZpbmUgX19OUl9mc3RhdGF0NjQJCQkoX19OUl9TWVNDQUxMX0JBU0UrMzI3KQorI2RlZmluZSBfX05SX3VubGlua2F0CQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMyOCkKKyNkZWZpbmUgX19OUl9yZW5hbWVhdAkJCShfX05SX1NZU0NBTExfQkFTRSszMjkpCisjZGVmaW5lIF9fTlJfbGlua2F0CQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMzMCkKKyNkZWZpbmUgX19OUl9zeW1saW5rYXQJCQkoX19OUl9TWVNDQUxMX0JBU0UrMzMxKQorI2RlZmluZSBfX05SX3JlYWRsaW5rYXQJCQkoX19OUl9TWVNDQUxMX0JBU0UrMzMyKQorI2RlZmluZSBfX05SX2ZjaG1vZGF0CQkJKF9fTlJfU1lTQ0FMTF9CQVNFKzMzMykKKyNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCQkoX19OUl9TWVNDQUxMX0JBU0UrMzM0KQogCiAvKgogICogVGhlIGZvbGxvd2luZyBTV0lzIGFyZSBBUk0gcHJpdmF0ZS4KQEAgLTM3NywxNTYgKzM5MCw2IEBACiAjZW5kaWYKIAogI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0KLSNkZWZpbmUgX19zeXMyKHgpICN4Ci0jZGVmaW5lIF9fc3lzMSh4KSBfX3N5czIoeCkKLQotI2lmbmRlZiBfX3N5c2NhbGwKLSNpZiBkZWZpbmVkKF9fdGh1bWJfXykgfHwgZGVmaW5lZChfX0FSTV9FQUJJX18pCi0jZGVmaW5lIF9fU1lTX1JFRyhuYW1lKSByZWdpc3RlciBsb25nIF9fc3lzcmVnIF9fYXNtX18oInI3IikgPSBfX05SXyMjbmFtZTsKLSNkZWZpbmUgX19TWVNfUkVHX0xJU1QocmVncy4uLikgInIiIChfX3N5c3JlZykgLCAjI3JlZ3MKLSNkZWZpbmUgX19zeXNjYWxsKG5hbWUpICJzd2lcdDAiCi0jZWxzZQotI2RlZmluZSBfX1NZU19SRUcobmFtZSkKLSNkZWZpbmUgX19TWVNfUkVHX0xJU1QocmVncy4uLikgcmVncwotI2RlZmluZSBfX3N5c2NhbGwobmFtZSkgInN3aVx0IiBfX3N5czEoX19OUl8jI25hbWUpICIiCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgcmVzKQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC1NQVhfRVJSTk8pKSB7CVwKLQkJZXJybm8gPSAtKHJlcyk7CQkJCQkJXAotCQlyZXMgPSAtMTsJCQkJCQlcCi0JfQkJCQkJCQkJXAotCXJldHVybiAodHlwZSkgKHJlcyk7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfc3lzY2FsbDAodHlwZSxuYW1lKQkJCQkJCVwKLXR5cGUgbmFtZSh2b2lkKSB7CQkJCQkJCVwKLSAgX19TWVNfUkVHKG5hbWUpCQkJCQkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3Jlc19yMCBfX2FzbV9fKCJyMCIpOwkJCQkJXAotICBsb25nIF9fcmVzOwkJCQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQkJXAotICBfX3N5c2NhbGwobmFtZSkJCQkJCQkJXAotCTogIj1yIiAoX19yZXNfcjApCQkJCQkJXAotCTogX19TWVNfUkVHX0xJU1QoKQkJCQkJCVwKLQk6ICJtZW1vcnkiICk7CQkJCQkJCVwKLSAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAotICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUxLGFyZzEpIAkJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSkgeyAJCQkJCQlcCi0gIF9fU1lTX1JFRyhuYW1lKQkJCQkJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMCBfX2FzbV9fKCJyMCIpID0gKGxvbmcpYXJnMTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yZXNfcjAgX19hc21fXygicjAiKTsJCQkJCVwKLSAgbG9uZyBfX3JlczsJCQkJCQkJCVwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCVwKLSAgX19zeXNjYWxsKG5hbWUpCQkJCQkJCVwKLQk6ICI9ciIgKF9fcmVzX3IwKQkJCQkJCVwKLQk6IF9fU1lTX1JFR19MSVNUKCAiMCIgKF9fcjApICkJCQkJCVwKLQk6ICJtZW1vcnkiICk7CQkJCQkJCVwKLSAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAotICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMikJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyKSB7CQkJCQlcCi0gIF9fU1lTX1JFRyhuYW1lKQkJCQkJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMCBfX2FzbV9fKCJyMCIpID0gKGxvbmcpYXJnMTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMSBfX2FzbV9fKCJyMSIpID0gKGxvbmcpYXJnMjsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yZXNfcjAgX19hc21fXygicjAiKTsJCQkJCVwKLSAgbG9uZyBfX3JlczsJCQkJCQkJCVwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCVwKLSAgX19zeXNjYWxsKG5hbWUpCQkJCQkJCVwKLQk6ICI9ciIgKF9fcmVzX3IwKQkJCQkJCVwKLQk6IF9fU1lTX1JFR19MSVNUKCAiMCIgKF9fcjApLCAiciIgKF9fcjEpICkJCQlcCi0JOiAibWVtb3J5IiApOwkJCQkJCQlcCi0gIF9fcmVzID0gX19yZXNfcjA7CQkJCQkJCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsJCQkJCQlcCi19Ci0KLQotI2RlZmluZSBfc3lzY2FsbDModHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczKQkJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczKSB7CQkJCVwKLSAgX19TWVNfUkVHKG5hbWUpCQkJCQkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IwIF9fYXNtX18oInIwIikgPSAobG9uZylhcmcxOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IxIF9fYXNtX18oInIxIikgPSAobG9uZylhcmcyOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IyIF9fYXNtX18oInIyIikgPSAobG9uZylhcmczOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3Jlc19yMCBfX2FzbV9fKCJyMCIpOwkJCQkJXAotICBsb25nIF9fcmVzOwkJCQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQkJXAotICBfX3N5c2NhbGwobmFtZSkJCQkJCQkJXAotCTogIj1yIiAoX19yZXNfcjApCQkJCQkJXAotCTogX19TWVNfUkVHX0xJU1QoICIwIiAoX19yMCksICJyIiAoX19yMSksICJyIiAoX19yMikgKQkJXAotCTogIm1lbW9yeSIgKTsJCQkJCQkJXAotICBfX3JlcyA9IF9fcmVzX3IwOwkJCQkJCQlcCi0gIF9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7CQkJCQkJXAotfQotCi0KLSNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0KVwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0KSB7CQlcCi0gIF9fU1lTX1JFRyhuYW1lKQkJCQkJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMCBfX2FzbV9fKCJyMCIpID0gKGxvbmcpYXJnMTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMSBfX2FzbV9fKCJyMSIpID0gKGxvbmcpYXJnMjsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMiBfX2FzbV9fKCJyMiIpID0gKGxvbmcpYXJnMzsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMyBfX2FzbV9fKCJyMyIpID0gKGxvbmcpYXJnNDsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yZXNfcjAgX19hc21fXygicjAiKTsJCQkJCVwKLSAgbG9uZyBfX3JlczsJCQkJCQkJCVwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCVwKLSAgX19zeXNjYWxsKG5hbWUpCQkJCQkJCVwKLQk6ICI9ciIgKF9fcmVzX3IwKQkJCQkJCVwKLQk6IF9fU1lTX1JFR19MSVNUKCAiMCIgKF9fcjApLCAiciIgKF9fcjEpLCAiciIgKF9fcjIpLCAiciIgKF9fcjMpICkgXAotCTogIm1lbW9yeSIgKTsJCQkJCQkJXAotICBfX3JlcyA9IF9fcmVzX3IwOwkJCQkJCQlcCi0gIF9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7CQkJCQkJXAotfQotICAKLQotI2RlZmluZSBfc3lzY2FsbDUodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsdHlwZTUsYXJnNSkJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQsIHR5cGU1IGFyZzUpIHsJXAotICBfX1NZU19SRUcobmFtZSkJCQkJCQkJXAotICByZWdpc3RlciBsb25nIF9fcjAgX19hc21fXygicjAiKSA9IChsb25nKWFyZzE7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjEgX19hc21fXygicjEiKSA9IChsb25nKWFyZzI7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjIgX19hc21fXygicjIiKSA9IChsb25nKWFyZzM7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjMgX19hc21fXygicjMiKSA9IChsb25nKWFyZzQ7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjQgX19hc21fXygicjQiKSA9IChsb25nKWFyZzU7CQkJXAotICByZWdpc3RlciBsb25nIF9fcmVzX3IwIF9fYXNtX18oInIwIik7CQkJCQlcCi0gIGxvbmcgX19yZXM7CQkJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQlcCi0gIF9fc3lzY2FsbChuYW1lKQkJCQkJCQlcCi0JOiAiPXIiIChfX3Jlc19yMCkJCQkJCQlcCi0JOiBfX1NZU19SRUdfTElTVCggIjAiIChfX3IwKSwgInIiIChfX3IxKSwgInIiIChfX3IyKSwJCVwKLQkJCSAgInIiIChfX3IzKSwgInIiIChfX3I0KSApCQkJXAotCTogIm1lbW9yeSIgKTsJCQkJCQkJXAotICBfX3JlcyA9IF9fcmVzX3IwOwkJCQkJCQlcCi0gIF9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7CQkJCQkJXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCx0eXBlNSxhcmc1LHR5cGU2LGFyZzYpCVwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0LCB0eXBlNSBhcmc1LCB0eXBlNiBhcmc2KSB7CVwKLSAgX19TWVNfUkVHKG5hbWUpCQkJCQkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IwIF9fYXNtX18oInIwIikgPSAobG9uZylhcmcxOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IxIF9fYXNtX18oInIxIikgPSAobG9uZylhcmcyOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IyIF9fYXNtX18oInIyIikgPSAobG9uZylhcmczOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IzIF9fYXNtX18oInIzIikgPSAobG9uZylhcmc0OwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3I0IF9fYXNtX18oInI0IikgPSAobG9uZylhcmc1OwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3I1IF9fYXNtX18oInI1IikgPSAobG9uZylhcmc2OwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3Jlc19yMCBfX2FzbV9fKCJyMCIpOwkJCQkJXAotICBsb25nIF9fcmVzOwkJCQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQkJXAotICBfX3N5c2NhbGwobmFtZSkJCQkJCQkJXAotCTogIj1yIiAoX19yZXNfcjApCQkJCQkJXAotCTogX19TWVNfUkVHX0xJU1QoICIwIiAoX19yMCksICJyIiAoX19yMSksICJyIiAoX19yMiksCQlcCi0JCQkgICJyIiAoX19yMyksICJyIiAoX19yNCksICJyIiAoX19yNSkgKQkJXAotCTogIm1lbW9yeSIgKTsJCQkJCQkJXAotICBfX3JlcyA9IF9fcmVzX3IwOwkJCQkJCQlcCi0gIF9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7CQkJCQkJXAotfQogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NUQVQ2NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tYXJtMjYvY2FjaGVmbHVzaC5oCmluZGV4IDljMWI5YzcuLjE0YWUxNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9jYWNoZWZsdXNoLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKSAgICAgICAgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9tbShtbSkgICAgICAgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pICAgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsc3RhcnQsZW5kKSAgICAgICAgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9wYWdlKHZtYSx2bWFkZHIscGZuKSAgICAgICAgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpCQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvY2hlY2tzdW0uaAppbmRleCBkNDI1NmQ1Li5mMmI0YjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2NoZWNrc3VtLmgKQEAgLTIzLDcgKzIzLDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0CkBAIC0zMywyNiArMzMsMTggQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtKTsKK19fd3N1bQorY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKLXVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSwgaW50ICplcnJfcHRyKTsKLQotLyoKLSAqIFRoaXMgaXMgdGhlIG9sZCAoYW5kIHVuc2FmZSkgd2F5IG9mIGRvaW5nIGNoZWNrc3VtcywgYSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbAotICogYmUgcHJpbnRlZCBpZiBpdCBpcyB1c2VkIGFuZCBhbiBleGNlcHRpb24gb2NjdXJzLgotICoKLSAqIHRoaXMgZnVuY3Rpb25zIHNob3VsZCBnbyBhd2F5IGFmdGVyIHNvbWUgdGltZS4KLSAqLwotI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weShzcmMsZHN0LGxlbixzdW0pCWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soc3JjLGRzdCxsZW4sc3VtKQorX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpOwogCiAvKgogICoJVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLAogICoJd2hpY2ggYWx3YXlzIGNoZWNrc3VtIG9uIDQgb2N0ZXQgYm91bmRhcmllcy4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsIHVuc2lnbmVkIGludCBpaGwpCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2lwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bSwgdG1wMTsKIApAQCAtNzgsMTQgKzcwLDEzIEBACiAJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpLCAiPXIiICh0bXAxKQogCTogIjEiIChpcGgpLCAiMiIgKGlobCkKIAk6ICJjYyIpOwotCXJldHVybiBzdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpc3VtOwogfQogCiAvKgogICogCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIHdpdGhvdXQgYWRkaW5nIHBzZXVkbyBoZWFkZXJzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSJhZGRzCSUwLCAlMSwgJTEsIGxzbCAjMTYJQCBjc3VtX2ZvbGQJCVxuXApAQCAtOTMsMTIgKzg0LDEyIEBACiAJOiAiPXIiIChzdW0pCiAJOiAiciIgKHN1bSkKIAk6ICJjYyIpOwotCXJldHVybiAofnN1bSkgPj4gMTY7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpKH4oX19mb3JjZSB1MzIpc3VtID4+IDE2KTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgIHVuc2lnbmVkIGludCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkiYWRkcwklMCwgJTEsICUyCQlAIGNzdW1fdGNwdWRwX25vZm9sZAlcblwKQEAgLTEwNyw3ICs5OCw3IEBACiAJYWRjcwklMCwgJTAsICU1CQkJCQlcblwKIAlhZGMJJTAsICUwLCAjMCIKIAk6ICI9JnIiKHN1bSkKLQk6ICJyIiAoc3VtKSwgInIiIChkYWRkciksICJyIiAoc2FkZHIpLCAiciIgKG50b2hzKGxlbikpLCAiSXIiIChudG9ocyhwcm90bykpCisJOiAiciIgKHN1bSksICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgInIiIChodG9ucyhsZW4pKSwgIklyIiAoaHRvbnMocHJvdG8pKQogCTogImNjIik7CiAJcmV0dXJuIHN1bTsKIH0JCkBAIC0xMTUsOSArMTA2LDkgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIGludCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSJhZGRzCSUwLCAlMSwgJTIJCUAgY3N1bV90Y3B1ZHBfbWFnaWMJXG5cCkBAIC0xMjksOSArMTIwLDkgQEAKIAlhZGRjcwklMCwgJTAsICMweDEwMDAwCQkJCVxuXAogCW12bgklMCwgJTAiCiAJOiAiPSZyIihzdW0pCi0JOiAiciIgKHN1bSksICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgInIiIChudG9ocyhsZW4pKSwgIklyIiAobnRvaHMocHJvdG8pKQorCTogInIiIChzdW0pLCAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICJyIiAoaHRvbnMobGVuKSksICJJciIgKGh0b25zKHByb3RvKSkKIAk6ICJjYyIpOwotCXJldHVybiBzdW0gPj4gMTY7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpKChfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwogfQogCiAKQEAgLTEzOSwyMCArMTMwLDIwIEBACiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3N1bTE2CitpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcKLV9fY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIF9fdTMyIGxlbiwKLQkJX191MzIgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bQorX19jc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX19iZTMyIGxlbiwKKwkJX19iZTMyIHByb3RvLCBfX3dzdW0gc3VtKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQKLWNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBfX3UzMiBsZW4sCi0JCXVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2Citjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX191MzIgbGVuLAorCQl1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKF9fY3N1bV9pcHY2X21hZ2ljKHNhZGRyLCBkYWRkciwgaHRvbmwobGVuKSwKIAkJCQkJICAgaHRvbmwocHJvdG8pLCBzdW0pKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2RldmljZS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3BnYWxsb2MuaAppbmRleCA2NDM3MTY3Li43NzI1YWYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvcGdhbGxvYy5oCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi1leHRlcm4ga21lbV9jYWNoZV90ICpwdGVfY2FjaGU7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnB0ZV9jYWNoZTsKIAogc3RhdGljIGlubGluZSBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcil7CiAJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MocHRlX2NhY2hlLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3NldHVwLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9zZXR1cC5oCmluZGV4IDYzNDg5MzEuLjFhODY3YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvc2V0dXAuaApAQCAtMTYsNiArMTYsOCBAQAogCiAjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDEwMjQKIAorI2lmZGVmIF9fS0VSTkVMX18KKwogLyogVGhlIGxpc3QgZW5kcyB3aXRoIGFuIEFUQUdfTk9ORSBub2RlLiAqLwogI2RlZmluZSBBVEFHX05PTkUJMHgwMDAwMDAwMAogCkBAIC0yMDIsNCArMjA0LDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBtZW1pbmZvIG1lbWluZm87CiAKKyNlbmRpZiAgLyogIF9fS0VSTkVMX18gICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1iaXRzLmgKaW5kZXggYmJjNmUxZC4uYTNmNGZlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtYml0cy5oCkBAIC0xNSw2ICsxNSwxOCBAQAogCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwogfTsKIAorc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKKwogLyogY19jYyBjaGFyYWN0ZXJzICovCiAjZGVmaW5lIFZJTlRSIDAKICNkZWZpbmUgVlFVSVQgMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1hcm0yNi91bmlzdGQuaAppbmRleCAyNWE1ZWVhLi40YzNiOTE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi91bmlzdGQuaApAQCAtMzExLDEzOSArMzExLDYgQEAKICNkZWZpbmUgX19BUk1fTlJfdXNyMjYJCQkoX19BUk1fTlJfQkFTRSszKQogCiAjaWZkZWYgX19LRVJORUxfXwotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLQotI2RlZmluZSBfX3N5czIoeCkgI3gKLSNkZWZpbmUgX19zeXMxKHgpIF9fc3lzMih4KQotCi0jaWZuZGVmIF9fc3lzY2FsbAotI2RlZmluZSBfX3N5c2NhbGwobmFtZSkgInN3aVx0IiBfX3N5czEoX19OUl8jI25hbWUpICIiCi0jZW5kaWYKLQotI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKS1NQVhfRVJSTk8pIHsJXAotCQllcnJubyA9IC0ocmVzKTsJCQkJCQlcCi0JCXJlcyA9IC0xOwkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JcmV0dXJuICh0eXBlKSAocmVzKTsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLG5hbWUpCQkJCQkJXAotdHlwZSBuYW1lKHZvaWQpIHsJCQkJCQkJXAotICByZWdpc3RlciBsb25nIF9fcmVzX3IwIF9fYXNtX18oInIwIik7CQkJCQlcCi0gIGxvbmcgX19yZXM7CQkJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQlcCi0gIF9fc3lzY2FsbChuYW1lKQkJCQkJCQlcCi0JOiAiPXIiIChfX3Jlc19yMCkJCQkJCQlcCi0JOgkJCQkJCQkJXAotCTogImxyIik7CQkJCQkJCVwKLSAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAotICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUxLGFyZzEpIAkJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSkgeyAJCQkJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMCBfX2FzbV9fKCJyMCIpID0gKGxvbmcpYXJnMTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yZXNfcjAgX19hc21fXygicjAiKTsJCQkJCVwKLSAgbG9uZyBfX3JlczsJCQkJCQkJCVwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCVwKLSAgX19zeXNjYWxsKG5hbWUpCQkJCQkJCVwKLQk6ICI9ciIgKF9fcmVzX3IwKQkJCQkJCVwKLQk6ICJyIiAoX19yMCkJCQkJCQkJXAotCTogImxyIik7CQkJCQkJCVwKLSAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAotICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMikJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyKSB7CQkJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMCBfX2FzbV9fKCJyMCIpID0gKGxvbmcpYXJnMTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yMSBfX2FzbV9fKCJyMSIpID0gKGxvbmcpYXJnMjsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yZXNfcjAgX19hc21fXygicjAiKTsJCQkJCVwKLSAgbG9uZyBfX3JlczsJCQkJCQkJCVwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQkJCVwKLSAgX19zeXNjYWxsKG5hbWUpCQkJCQkJCVwKLQk6ICI9ciIgKF9fcmVzX3IwKQkJCQkJCVwKLQk6ICJyIiAoX19yMCksInIiIChfX3IxKSAJCQkJCVwKLQk6ICJsciIpOwkJCQkJCQlcCi0gIF9fcmVzID0gX19yZXNfcjA7CQkJCQkJCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsJCQkJCQlcCi19Ci0KLQotI2RlZmluZSBfc3lzY2FsbDModHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczKQkJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczKSB7CQkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IwIF9fYXNtX18oInIwIikgPSAobG9uZylhcmcxOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IxIF9fYXNtX18oInIxIikgPSAobG9uZylhcmcyOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IyIF9fYXNtX18oInIyIikgPSAobG9uZylhcmczOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3Jlc19yMCBfX2FzbV9fKCJyMCIpOwkJCQkJXAotICBsb25nIF9fcmVzOwkJCQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQkJXAotICBfX3N5c2NhbGwobmFtZSkJCQkJCQkJXAotCTogIj1yIiAoX19yZXNfcjApCQkJCQkJXAotCTogInIiIChfX3IwKSwiciIgKF9fcjEpLCJyIiAoX19yMikJCQkJXAotCTogImxyIik7CQkJCQkJCVwKLSAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAotICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKLX0KLQotCi0jZGVmaW5lIF9zeXNjYWxsNCh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNClcCi10eXBlIG5hbWUodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCkgewkJXAotICByZWdpc3RlciBsb25nIF9fcjAgX19hc21fXygicjAiKSA9IChsb25nKWFyZzE7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjEgX19hc21fXygicjEiKSA9IChsb25nKWFyZzI7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjIgX19hc21fXygicjIiKSA9IChsb25nKWFyZzM7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjMgX19hc21fXygicjMiKSA9IChsb25nKWFyZzQ7CQkJXAotICByZWdpc3RlciBsb25nIF9fcmVzX3IwIF9fYXNtX18oInIwIik7CQkJCQlcCi0gIGxvbmcgX19yZXM7CQkJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQlcCi0gIF9fc3lzY2FsbChuYW1lKQkJCQkJCQlcCi0JOiAiPXIiIChfX3Jlc19yMCkJCQkJCQlcCi0JOiAiciIgKF9fcjApLCJyIiAoX19yMSksInIiIChfX3IyKSwiciIgKF9fcjMpCQkJXAotCTogImxyIik7CQkJCQkJCVwKLSAgX19yZXMgPSBfX3Jlc19yMDsJCQkJCQkJXAotICBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQkJCVwKLX0KLSAgCi0KLSNkZWZpbmUgX3N5c2NhbGw1KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LHR5cGU1LGFyZzUpCVwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0LCB0eXBlNSBhcmc1KSB7CVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IwIF9fYXNtX18oInIwIikgPSAobG9uZylhcmcxOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IxIF9fYXNtX18oInIxIikgPSAobG9uZylhcmcyOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IyIF9fYXNtX18oInIyIikgPSAobG9uZylhcmczOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3IzIF9fYXNtX18oInIzIikgPSAobG9uZylhcmc0OwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3I0IF9fYXNtX18oInI0IikgPSAobG9uZylhcmc1OwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3Jlc19yMCBfX2FzbV9fKCJyMCIpOwkJCQkJXAotICBsb25nIF9fcmVzOwkJCQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCQkJXAotICBfX3N5c2NhbGwobmFtZSkJCQkJCQkJXAotCTogIj1yIiAoX19yZXNfcjApCQkJCQkJXAotCTogInIiIChfX3IwKSwiciIgKF9fcjEpLCJyIiAoX19yMiksInIiIChfX3IzKSwiciIgKF9fcjQpCVwKLQk6ICJsciIpOwkJCQkJCQlcCi0gIF9fcmVzID0gX19yZXNfcjA7CQkJCQkJCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsJCQkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw2KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LHR5cGU1LGFyZzUsdHlwZTYsYXJnNikJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQsIHR5cGU1IGFyZzUsIHR5cGU2IGFyZzYpIHsJXAotICByZWdpc3RlciBsb25nIF9fcjAgX19hc21fXygicjAiKSA9IChsb25nKWFyZzE7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjEgX19hc21fXygicjEiKSA9IChsb25nKWFyZzI7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjIgX19hc21fXygicjIiKSA9IChsb25nKWFyZzM7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjMgX19hc21fXygicjMiKSA9IChsb25nKWFyZzQ7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjQgX19hc21fXygicjQiKSA9IChsb25nKWFyZzU7CQkJXAotICByZWdpc3RlciBsb25nIF9fcjUgX19hc21fXygicjUiKSA9IChsb25nKWFyZzY7CQkJXAotICByZWdpc3RlciBsb25nIF9fcmVzX3IwIF9fYXNtX18oInIwIik7CQkJCQlcCi0gIGxvbmcgX19yZXM7CQkJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJCQlcCi0gIF9fc3lzY2FsbChuYW1lKQkJCQkJCQlcCi0JOiAiPXIiIChfX3Jlc19yMCkJCQkJCQlcCi0JOiAiciIgKF9fcjApLCJyIiAoX19yMSksInIiIChfX3IyKSwiciIgKF9fcjMpLCAiciIgKF9fcjQpLCJyIiAoX19yNSkJCVwKLQk6ICJsciIpOwkJCQkJCQlcCi0gIF9fcmVzID0gX19yZXNfcjA7CQkJCQkJCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsJCQkJCQlcCi19CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2F0MzJhcDcwMDAuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2F0MzJhcDcwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTg1ZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYXQzMmFwNzAwMC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBQaW4gZGVmaW5pdGlvbnMgZm9yIEFUMzJBUDcwMDAuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfX0FTTV9BUkNIX0FUMzJBUDcwMDBfSF9fCisjZGVmaW5lIF9fQVNNX0FSQ0hfQVQzMkFQNzAwMF9IX18KKworI2RlZmluZSBHUElPX1BFUklQSF9BCTAKKyNkZWZpbmUgR1BJT19QRVJJUEhfQgkxCisKKyNkZWZpbmUgTlJfR1BJT19DT05UUk9MTEVSUwk0CisKKy8qCisgKiBQaW4gbnVtYmVycyBpZGVudGlmeWluZyBzcGVjaWZpYyBHUElPIHBpbnMgb24gdGhlIGNoaXAuIFRoZXkgY2FuCisgKiBhbHNvIGJlIGNvbnZlcnRlZCB0byBJUlEgbnVtYmVycyBieSBwYXNzaW5nIHRoZW0gdGhyb3VnaAorICogZ3Bpb190b19pcnEoKS4KKyAqLworI2RlZmluZSBHUElPX1BJT0FfQkFTRQkoMCkKKyNkZWZpbmUgR1BJT19QSU9CX0JBU0UJKEdQSU9fUElPQV9CQVNFICsgMzIpCisjZGVmaW5lIEdQSU9fUElPQ19CQVNFCShHUElPX1BJT0JfQkFTRSArIDMyKQorI2RlZmluZSBHUElPX1BJT0RfQkFTRQkoR1BJT19QSU9DX0JBU0UgKyAzMikKKworI2RlZmluZSBHUElPX1BJTl9QQShOKQkoR1BJT19QSU9BX0JBU0UgKyAoTikpCisjZGVmaW5lIEdQSU9fUElOX1BCKE4pCShHUElPX1BJT0JfQkFTRSArIChOKSkKKyNkZWZpbmUgR1BJT19QSU5fUEMoTikJKEdQSU9fUElPQ19CQVNFICsgKE4pKQorI2RlZmluZSBHUElPX1BJTl9QRChOKQkoR1BJT19QSU9EX0JBU0UgKyAoTikpCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0FUMzJBUDcwMDBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9hdDkxX3BkYy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYXQ5MV9wZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQ2ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYXQ5MV9wZGMuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxX3BkYy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQorICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCisgKgorICogUGVyaXBoZXJhbCBEYXRhIENvbnRyb2xsZXIgKFBEQykgcmVnaXN0ZXJzLgorICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQVQ5MV9QRENfSAorI2RlZmluZSBBVDkxX1BEQ19ICisKKyNkZWZpbmUgQVQ5MV9QRENfUlBSCQkweDEwMAkvKiBSZWNlaXZlIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfUkNSCQkweDEwNAkvKiBSZWNlaXZlIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfVFBSCQkweDEwOAkvKiBUcmFuc21pdCBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfUERDX1RDUgkJMHgxMGMJLyogVHJhbnNtaXQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19STlBSCQkweDExMAkvKiBSZWNlaXZlIE5leHQgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19STkNSCQkweDExNAkvKiBSZWNlaXZlIE5leHQgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1BEQ19UTlBSCQkweDExOAkvKiBUcmFuc21pdCBOZXh0IFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9QRENfVE5DUgkJMHgxMWMJLyogVHJhbnNtaXQgTmV4dCBDb3VudGVyIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVQ5MV9QRENfUFRDUgkJMHgxMjAJLyogVHJhbnNmZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQkJQVQ5MV9QRENfUlhURU4JCSgxIDw8IDApCS8qIFJlY2VpdmVyIFRyYW5zZmVyIEVuYWJsZSAqLworI2RlZmluZQkJQVQ5MV9QRENfUlhURElTCQkoMSA8PCAxKQkvKiBSZWNlaXZlciBUcmFuc2ZlciBEaXNhYmxlICovCisjZGVmaW5lCQlBVDkxX1BEQ19UWFRFTgkJKDEgPDwgOCkJLyogVHJhbnNtaXR0ZXIgVHJhbnNmZXIgRW5hYmxlICovCisjZGVmaW5lCQlBVDkxX1BEQ19UWFRESVMJCSgxIDw8IDkpCS8qIFRyYW5zbWl0dGVyIFRyYW5zZmVyIERpc2FibGUgKi8KKworI2RlZmluZSBBVDkxX1BEQ19QVFNSCQkweDEyNAkvKiBUcmFuc2ZlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9hdDkxcm05MjAwX3BkYy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYXQ5MXJtOTIwMF9wZGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxMTUwZDQ0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2F0OTFybTkyMDBfcGRjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MXJtOTIwMC9hdDkxcm05MjAwX3BkYy5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IEl2YW4gS29rc2hheXNreQotICogQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlCi0gKgotICogUGVyaXBoZXJhbCBEYXRhIENvbnRyb2xsZXIgKFBEQykgcmVnaXN0ZXJzLgotICogQmFzZWQgb24gQVQ5MVJNOTIwMCBkYXRhc2hlZXQgcmV2aXNpb24gRS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgQVQ5MVJNOTIwMF9QRENfSAotI2RlZmluZSBBVDkxUk05MjAwX1BEQ19ICi0KLSNkZWZpbmUgQVQ5MV9QRENfUlBSCQkweDEwMAkvKiBSZWNlaXZlIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9QRENfUkNSCQkweDEwNAkvKiBSZWNlaXZlIENvdW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9QRENfVFBSCQkweDEwOAkvKiBUcmFuc21pdCBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfUERDX1RDUgkJMHgxMGMJLyogVHJhbnNtaXQgQ291bnRlciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1BEQ19STlBSCQkweDExMAkvKiBSZWNlaXZlIE5leHQgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1BEQ19STkNSCQkweDExNAkvKiBSZWNlaXZlIE5leHQgQ291bnRlciBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX1BEQ19UTlBSCQkweDExOAkvKiBUcmFuc21pdCBOZXh0IFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9QRENfVE5DUgkJMHgxMWMJLyogVHJhbnNtaXQgTmV4dCBDb3VudGVyIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgQVQ5MV9QRENfUFRDUgkJMHgxMjAJLyogVHJhbnNmZXIgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQkJQVQ5MV9QRENfUlhURU4JCSgxIDw8IDApCS8qIFJlY2VpdmVyIFRyYW5zZmVyIEVuYWJsZSAqLwotI2RlZmluZQkJQVQ5MV9QRENfUlhURElTCQkoMSA8PCAxKQkvKiBSZWNlaXZlciBUcmFuc2ZlciBEaXNhYmxlICovCi0jZGVmaW5lCQlBVDkxX1BEQ19UWFRFTgkJKDEgPDwgOCkJLyogVHJhbnNtaXR0ZXIgVHJhbnNmZXIgRW5hYmxlICovCi0jZGVmaW5lCQlBVDkxX1BEQ19UWFRESVMJCSgxIDw8IDkpCS8qIFRyYW5zbWl0dGVyIFRyYW5zZmVyIERpc2FibGUgKi8KLQotI2RlZmluZSBBVDkxX1BEQ19QVFNSCQkweDEyNAkvKiBUcmFuc2ZlciBTdGF0dXMgUmVnaXN0ZXIgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaAppbmRleCBhMzliM2U5Li5iMTIwZWUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKQEAgLTIxLDEwICsyMSw3IEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDMyX2FkZF9kZXZpY2VfdXNhcnQodW5zaWduZWQgaW50IGlkKTsKIAogc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIHsKLQl1OAl2YWxpZDsKLQl1OAltaWlfcGh5X2FkZHI7CiAJdTgJaXNfcm1paTsKLQl1OAlod19hZGRyWzZdOwogfTsKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKgogYXQzMl9hZGRfZGV2aWNlX2V0aCh1bnNpZ25lZCBpbnQgaWQsIHN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqZGF0YSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9wb3J0bXV4LmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9wb3J0bXV4LmgKaW5kZXggNGQ1MDQyMS4uODNjNjkwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvcG9ydG11eC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL3BvcnRtdXguaApAQCAtNywxMCArNywyMCBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0jaWZuZGVmIF9fQVNNX0FWUjMyX0FUMzJfUE9SVE1VWF9IX18KLSNkZWZpbmUgX19BU01fQVZSMzJfQVQzMl9QT1JUTVVYX0hfXworI2lmbmRlZiBfX0FTTV9BUkNIX1BPUlRNVVhfSF9fCisjZGVmaW5lIF9fQVNNX0FSQ0hfUE9SVE1VWF9IX18KIAotdm9pZCBwb3J0bXV4X3NldF9mdW5jKHVuc2lnbmVkIGludCBwb3J0bXV4X2lkLCB1bnNpZ25lZCBpbnQgcGluX2lkLAotCQkgICAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb25faWQpOworLyoKKyAqIFNldCB1cCBwaW4gbXVsdGlwbGV4aW5nLCBjYWxsZWQgZnJvbSBib2FyZCBpbml0IG9ubHkuCisgKgorICogVGhlIGZvbGxvd2luZyBmbGFncyBkZXRlcm1pbmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIHBpbi4KKyAqLworI2RlZmluZSBBVDMyX0dQSU9GX1BVTExVUAkweDAwMDAwMDAxCS8qIEVuYWJsZSBwdWxsLXVwICovCisjZGVmaW5lIEFUMzJfR1BJT0ZfT1VUUFVUCTB4MDAwMDAwMDIJLyogRW5hYmxlIG91dHB1dCBkcml2ZXIgKi8KKyNkZWZpbmUgQVQzMl9HUElPRl9ISUdICQkweDAwMDAwMDA0CS8qIFNldCBvdXRwdXQgaGlnaCAqLwogCi0jZW5kaWYgLyogX19BU01fQVZSMzJfQVQzMl9QT1JUTVVYX0hfXyAqLwordm9pZCBhdDMyX3NlbGVjdF9wZXJpcGgodW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgaW50IHBlcmlwaCwKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordm9pZCBhdDMyX3NlbGVjdF9ncGlvKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisjZW5kaWYgLyogX19BU01fQVJDSF9QT1JUTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hdG9taWMuaAppbmRleCBlMGI5YzQ0Li5jNDBiNjAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hdG9taWMuaApAQCAtNDEsNyArNDEsNyBAQAogCQkiCXN0Y29uZAklMSwgJTBcbiIKIAkJIglicm5lCTFiIgogCQk6ICI9JnIiKHJlc3VsdCksICI9byIodi0+Y291bnRlcikKLQkJOiAibSIodi0+Y291bnRlciksICJpciIoaSkKKwkJOiAibSIodi0+Y291bnRlciksICJyS3MyMSIoaSkKIAkJOiAiY2MiKTsKIAogCXJldHVybiByZXN1bHQ7CkBAIC01OCw3ICs1OCw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChpKSkKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoaSkgJiYgKGkgPj0gLTEwNDg1NzUpICYmIChpIDw9IDEwNDg1NzYpKQogCQlyZXN1bHQgPSBhdG9taWNfc3ViX3JldHVybigtaSwgdik7CiAJZWxzZQogCQlhc20gdm9sYXRpbGUoCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJIgltb3YJJTEsIDFcbiIKIAkJIjE6IgogCQk6ICI9JnIiKHRtcCksICI9JnIiKHJlc3VsdCksICI9byIodi0+Y291bnRlcikKLQkJOiAibSIodi0+Y291bnRlciksICJpciIoYSksICJpciIodSkKKwkJOiAibSIodi0+Y291bnRlciksICJyS3MyMSIoYSksICJyS3MyMSIodSkKIAkJOiAiY2MiLCAibWVtb3J5Iik7CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTIxLDcgKzEyMSw3IEBACiB7CiAJaW50IHRtcCwgcmVzdWx0OwogCi0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKGEpKQorCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChhKSAmJiAoYSA+PSAtMTA0ODU3NSkgJiYgKGEgPD0gMTA0ODU3NikpCiAJCXJlc3VsdCA9IGF0b21pY19zdWJfdW5sZXNzKHYsIC1hLCB1KTsKIAllbHNlIHsKIAkJcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2NhY2hlZmx1c2guaAppbmRleCBmMWJmMTcwLi5kZmFhYTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvY2FjaGVmbHVzaC5oCkBAIC04Nyw2ICs4Nyw3IEBACiAgKi8KICNkZWZpbmUgZmx1c2hfY2FjaGVfYWxsKCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIHBmbikJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpCQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tYXZyMzIvY2hlY2tzdW0uaAppbmRleCA0MWI3YWYwLi5hZjlkNTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2NoZWNrc3VtLmgKQEAgLTIwLDggKzIwLDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwKLQkJCSAgdW5zaWduZWQgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0CkBAIC0zMCw4ICsyOSw4IEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJCSAgICAgICBpbnQgc3VtLCBpbnQgKnNyY19lcnJfcHRyLAorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sCisJCQkJICAgICAgIF9fd3N1bSBzdW0sIGludCAqc3JjX2Vycl9wdHIsCiAJCQkJICAgICAgIGludCAqZHN0X2Vycl9wdHIpOwogCiAvKgpAQCAtNDIsMTcgKzQxLDE3IEBACiAgKgl2ZXJpZnlfYXJlYSgpLgogICovCiBzdGF0aWMgaW5saW5lCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKLQkJCQkgICAgICAgaW50IGxlbiwgaW50IHN1bSkKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwKLQkJCQkJICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkJICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKGNvbnN0IGNoYXIgX19mb3JjZSAqKXNyYywgZHN0LCBsZW4sCisJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKGNvbnN0IHZvaWQgX19mb3JjZSAqKXNyYywgZHN0LCBsZW4sCiAJCQkJCSBzdW0sIGVycl9wdHIsIE5VTEwpOwogfQogCkBAIC02MCw4ICs1OSw3IEBACiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICppcGgsCi0JCQkJCSAgdW5zaWduZWQgaW50IGlobCkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXVuc2lnbmVkIGludCBzdW0sIHRtcDsKIApAQCAtOTAsMTQgKzg4LDE0IEBACiAJCTogIj1yIihzdW0pLCAiPXIiKGlwaCksICI9ciIoaWhsKSwgIj1yIih0bXApCiAJCTogIjEiKGlwaCksICIyIihpaGwpCiAJCTogIm1lbW9yeSIsICJjYyIpOwotCXJldHVybiBzdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpc3VtOwogfQogCiAvKgogICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0KICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCkBAIC0xMDksMjEgKzEwNywyMCBAQAogCSAgICA6ICI9JnIiKHN1bSksICI9JnIiKHRtcCkKIAkgICAgOiAiMCIoc3VtKSk7CiAKLQlyZXR1cm4gfnN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkgICAgICAgX193c3VtIHN1bSkKIHsKIAlhc20oIglhZGQJJTAsICUxXG4iCiAJICAgICIJYWRjCSUwLCAlMCwgJTJcbiIKIAkgICAgIglhZGMJJTAsICUwLCAlM1xuIgogCSAgICAiCWFjcgklMCIKIAkgICAgOiAiPXIiKHN1bSkKLQkgICAgOiAiciIoZGFkZHIpLCAiciIoc2FkZHIpLCAiciIobnRvaHMobGVuKSB8IChwcm90byA8PCAxNikpLAorCSAgICA6ICJyIihkYWRkciksICJyIihzYWRkciksICJyIihsZW4gKyBwcm90byksCiAJICAgICAgIjAiKHN1bSkKIAkgICAgOiAiY2MiKTsKIApAQCAtMTM0LDExICsxMzEsMTAgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgdW5zaWduZWQgaW50IHN1bSkKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTQ4LDcgKzE0NCw3IEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKICAgICByZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2RldmljZS5oIGIvaW5jbHVkZS9hc20tYXZyMzIvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9kbWEtbWFwcGluZy5oCmluZGV4IDRjNDBjYjQuLjVjMDFlMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvZG1hLW1hcHBpbmcuaApAQCAtOCw3ICs4LDggQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1leHRlcm4gdm9pZCBkbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOworZXh0ZXJuIHZvaWQgZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJaW50IGRpcmVjdGlvbik7CiAKIC8qCiAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gZGV2aWNlIERNQSBhZGRyZXNzIG1hc2sgY2FuIGJlIHN1cHBvcnRlZApAQCAtMTA4LDcgKzEwOSw3IEBACiBkbWFfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmNwdV9hZGRyLCBzaXplX3Qgc2l6ZSwKIAkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCWRtYV9jYWNoZV9zeW5jKGNwdV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCWRtYV9jYWNoZV9zeW5jKGRldiwgY3B1X2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CiAJcmV0dXJuIHZpcnRfdG9fYnVzKGNwdV9hZGRyKTsKIH0KIApAQCAtMjEwLDcgKzIxMSw3IEBACiAKIAkJc2dbaV0uZG1hX2FkZHJlc3MgPSBwYWdlX3RvX2J1cyhzZ1tpXS5wYWdlKSArIHNnW2ldLm9mZnNldDsKIAkJdmlydCA9IHBhZ2VfYWRkcmVzcyhzZ1tpXS5wYWdlKSArIHNnW2ldLm9mZnNldDsKLQkJZG1hX2NhY2hlX3N5bmModmlydCwgc2dbaV0ubGVuZ3RoLCBkaXJlY3Rpb24pOworCQlkbWFfY2FjaGVfc3luYyhkZXYsIHZpcnQsIHNnW2ldLmxlbmd0aCwgZGlyZWN0aW9uKTsKIAl9CiAKIAlyZXR1cm4gbmVudHM7CkBAIC0yNTUsMTQgKzI1NiwxNCBAQAogZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCiAJCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCWRtYV9jYWNoZV9zeW5jKGJ1c190b192aXJ0KGRtYV9oYW5kbGUpLCBzaXplLCBkaXJlY3Rpb24pOworCWRtYV9jYWNoZV9zeW5jKGRldiwgYnVzX3RvX3ZpcnQoZG1hX2hhbmRsZSksIHNpemUsIGRpcmVjdGlvbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCiAJCQkgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCWRtYV9jYWNoZV9zeW5jKGJ1c190b192aXJ0KGRtYV9oYW5kbGUpLCBzaXplLCBkaXJlY3Rpb24pOworCWRtYV9jYWNoZV9zeW5jKGRldiwgYnVzX3RvX3ZpcnQoZG1hX2hhbmRsZSksIHNpemUsIGRpcmVjdGlvbik7CiB9CiAKIC8qKgpAQCAtMjg1LDcgKzI4Niw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKykgewotCQlkbWFfY2FjaGVfc3luYyhwYWdlX2FkZHJlc3Moc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQsCisJCWRtYV9jYWNoZV9zeW5jKGRldiwgcGFnZV9hZGRyZXNzKHNnW2ldLnBhZ2UpICsgc2dbaV0ub2Zmc2V0LAogCQkJICAgICAgIHNnW2ldLmxlbmd0aCwgZGlyZWN0aW9uKTsKIAl9CiB9CkBAIC0yOTcsNyArMjk4LDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrKSB7Ci0JCWRtYV9jYWNoZV9zeW5jKHBhZ2VfYWRkcmVzcyhzZ1tpXS5wYWdlKSArIHNnW2ldLm9mZnNldCwKKwkJZG1hX2NhY2hlX3N5bmMoZGV2LCBwYWdlX2FkZHJlc3Moc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQsCiAJCQkgICAgICAgc2dbaV0ubGVuZ3RoLCBkaXJlY3Rpb24pOwogCX0KIH0KQEAgLTMwNyw3ICszMDgsNyBAQAogI2RlZmluZSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoZCwgcywgaCwgZikgZG1hX2FsbG9jX2NvaGVyZW50KGQsIHMsIGgsIGYpCiAjZGVmaW5lIGRtYV9mcmVlX25vbmNvaGVyZW50KGQsIHMsIHYsIGgpIGRtYV9mcmVlX2NvaGVyZW50KGQsIHMsIHYsIGgpCiAKLXN0YXRpYyBpbmxpbmUgaW50IGRtYV9pc19jb25zaXN0ZW50KGRtYV9hZGRyX3QgZG1hX2FkZHIpCitzdGF0aWMgaW5saW5lIGludCBkbWFfaXNfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9pby5oIGIvaW5jbHVkZS9hc20tYXZyMzIvaW8uaAppbmRleCAyZmM4ZjExLi5lZWM0NzUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2lvLmgKQEAgLTc2LDYgKzc2LDM5IEBACiAjZGVmaW5lIHJlYWRzdyhwLCBkLCBsKQkJX19yYXdfcmVhZHN3KCh1bnNpZ25lZCBpbnQpcCwgZCwgbCkKICNkZWZpbmUgcmVhZHNsKHAsIGQsIGwpCQlfX3Jhd19yZWFkc2woKHVuc2lnbmVkIGludClwLCBkLCBsKQogCisKKy8qCisgKiBpb3tyZWFkLHdyaXRlfXs4LDE2LDMyfSBtYWNyb3MgaW4gYm90aCBsZSAoZm9yIFBDSSBzdHlsZSBjb25zdW1lcnMpIGFuZCBuYXRpdmUgYmUKKyAqLworI2lmbmRlZiBpb3JlYWQ4CisKKyNkZWZpbmUgaW9yZWFkOChwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gX19yYXdfcmVhZGIocCk7IF9fdjsgfSkKKworI2RlZmluZSBpb3JlYWQxNihwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUxNl90b19jcHUoX19yYXdfcmVhZHcocCkpOyBfX3Y7IH0pCisjZGVmaW5lIGlvcmVhZDE2YmUocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGJlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KHApKTsgX192OyB9KQorCisjZGVmaW5lIGlvcmVhZDMyKHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTMyX3RvX2NwdShfX3Jhd19yZWFkbChwKSk7IF9fdjsgfSkKKyNkZWZpbmUgaW9yZWFkMzJiZShwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gYmUzMl90b19jcHUoX19yYXdfcmVhZGwocCkpOyBfX3Y7IH0pCisKKyNkZWZpbmUgaW93cml0ZTgodixwKQlfX3Jhd193cml0ZWIodiwgcCkKKworI2RlZmluZSBpb3dyaXRlMTYodixwKQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodiksIHApCisjZGVmaW5lIGlvd3JpdGUxNmJlKHYscCkJX19yYXdfd3JpdGV3KGNwdV90b19iZTE2KHYpLCBwKQorCisjZGVmaW5lIGlvd3JpdGUzMih2LHApCV9fcmF3X3dyaXRlbChjcHVfdG9fbGUzMih2KSwgcCkKKyNkZWZpbmUgaW93cml0ZTMyYmUodixwKQlfX3Jhd193cml0ZWwoY3B1X3RvX2JlMzIodiksIHApCisKKyNkZWZpbmUgaW9yZWFkOF9yZXAocCxkLGMpCV9fcmF3X3JlYWRzYihwLGQsYykKKyNkZWZpbmUgaW9yZWFkMTZfcmVwKHAsZCxjKQlfX3Jhd19yZWFkc3cocCxkLGMpCisjZGVmaW5lIGlvcmVhZDMyX3JlcChwLGQsYykJX19yYXdfcmVhZHNsKHAsZCxjKQorCisjZGVmaW5lIGlvd3JpdGU4X3JlcChwLHMsYykJX19yYXdfd3JpdGVzYihwLHMsYykKKyNkZWZpbmUgaW93cml0ZTE2X3JlcChwLHMsYykJX19yYXdfd3JpdGVzdyhwLHMsYykKKyNkZWZpbmUgaW93cml0ZTMyX3JlcChwLHMsYykJX19yYXdfd3JpdGVzbChwLHMsYykKKworI2VuZGlmCisKKwogLyoKICAqIFRoZXNlIHR3byBhcmUgb25seSBoZXJlIGJlY2F1c2UgQUxTQSBfdGhpbmtzXyBpdCBuZWVkcyB0aGVtLi4uCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3BnYWxsb2MuaAppbmRleCA3NDkyY2ZiLi5iYjgyZTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvcGdhbGxvYy5oCkBAIC0yOCw3ICsyOCw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCXVuc2lnbmVkIGludCBwZ2Rfc2l6ZSA9IChVU0VSX1BUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCkpOwotCXBnZF90ICpwZ2QgPSAocGdkX3QgKilrbWFsbG9jKHBnZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlwZ2RfdCAqcGdkID0ga21hbGxvYyhwZ2Rfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAocGdkKQogCQltZW1zZXQocGdkLCAwLCBwZ2Rfc2l6ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9zZXR1cC5oIGIvaW5jbHVkZS9hc20tYXZyMzIvc2V0dXAuaAppbmRleCAxMDE5M2RhLi4wYTUyMjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3NldHVwLmgKQEAgLTEzLDYgKzEzLDggQEAKIAogI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRSAyNTYKIAorI2lmZGVmIF9fS0VSTkVMX18KKwogLyogTWFnaWMgbnVtYmVyIGluZGljYXRpbmcgdGhhdCBhIHRhZyB0YWJsZSBpcyBwcmVzZW50ICovCiAjZGVmaW5lIEFUQUdfTUFHSUMJMHhhMmEyNTQ0MQogCkBAIC0xMzgsNCArMTQwLDYgQEAKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAorI2VuZGlmICAvKiAgX19LRVJORUxfXyAgKi8KKwogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX1NFVFVQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3Rlcm1iaXRzLmgKaW5kZXggOWRjNmVhYy4uYzIxNWZhZmRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3Rlcm1iaXRzLmgKQEAgLTE3LDYgKzE3LDE3IEBACiAJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCiB9OwogCitzdHJ1Y3Qga3Rlcm1pb3MgeworCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCisJc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisJc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworfTsKKwogLyogY19jYyBjaGFyYWN0ZXJzICovCiAjZGVmaW5lIFZJTlRSIDAKICNkZWZpbmUgVlFVSVQgMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3R5cGVzLmgKaW5kZXggM2Y0N2RiOS4uMmJmZjE1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi90eXBlcy5oCkBAIC01NywxMSArNTcsNiBAQAogCiB0eXBlZGVmIHUzMiBkbWFfYWRkcl90OwogCi0jaWZkZWYgQ09ORklHX0xCRAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0jZGVmaW5lIEhBVkVfU0VDVE9SX1QKLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3VuaXN0ZC5oCmluZGV4IGE1MGU1MDAuLjU2ZWQxZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3VuaXN0ZC5oCkBAIC0yODAsOSArMjgwLDEwIEBACiAjZGVmaW5lIF9fTlJfc3luY19maWxlX3JhbmdlCTI2MgogI2RlZmluZSBfX05SX3RlZQkJMjYzCiAjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCTI2NAorI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CTI2NQogCiAjaWZkZWYgX19LRVJORUxfXwotI2RlZmluZSBOUl9zeXNjYWxscwkJMjY1CisjZGVmaW5lIE5SX3N5c2NhbGxzCQkyNjYKIAogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2JpdG9wcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9iaXRvcHMuaAppbmRleCBiNzNmNTM5Li5iZTg1ZjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2JpdG9wcy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MTAvYml0b3BzLmgKQEAgLTEwLDcgKzEwLDcgQEAKICAqIG51bWJlci4gIFRoZXkgZGlmZmVyIGluIHRoYXQgdGhlIGZpcnN0IGZ1bmN0aW9uIGFsc28gaW52ZXJ0cyBhbGwgYml0cwogICogaW4gdGhlIGlucHV0LgogICovCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgY3Jpc19zd2Fwbndicmx6KHVuc2lnbmVkIGxvbmcgdykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjcmlzX3N3YXBud2JybHoodW5zaWduZWQgbG9uZyB3KQogewogCS8qIExldCdzIGp1c3Qgc2F5IHdlIHJldHVybiB0aGUgcmVzdWx0IGluIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIHRoZQogCSAgIGlucHV0LiAgU2F5aW5nIHdlIGNsb2JiZXIgdGhlIGlucHV0IGJ1dCBjYW4gcmV0dXJuIHRoZSByZXN1bHQKQEAgLTI2LDcgKzI2LDcgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgY3Jpc19zd2Fwd2JybHoodW5zaWduZWQgbG9uZyB3KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNyaXNfc3dhcHdicmx6KHVuc2lnbmVkIGxvbmcgdykKIHsKIAl1bnNpZ25lZCByZXM7CiAJX19hc21fXyAoInN3YXB3YnIgJTAgXG5cdCIKQEAgLTQwLDcgKzQwLDcgQEAKICAqIGZmeiA9IEZpbmQgRmlyc3QgWmVybyBpbiB3b3JkLiBVbmRlZmluZWQgaWYgbm8gemVybyBleGlzdHMsCiAgKiBzbyBjb2RlIHNob3VsZCBjaGVjayBhZ2FpbnN0IH4wVUwgZmlyc3QuLgogICovCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgZmZ6KHVuc2lnbmVkIGxvbmcgdykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmZnoodW5zaWduZWQgbG9uZyB3KQogewogCXJldHVybiBjcmlzX3N3YXBud2JybHoodyk7CiB9CkBAIC01MSw3ICs1MSw3IEBACiAgKgogICogVW5kZWZpbmVkIGlmIG5vIGJpdCBleGlzdHMsIHNvIGNvZGUgc2hvdWxkIGNoZWNrIGFnYWluc3QgMCBmaXJzdC4KICAqLwotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZmZzKHVuc2lnbmVkIGxvbmcgd29yZCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2Zmcyh1bnNpZ25lZCBsb25nIHdvcmQpCiB7CiAJcmV0dXJuIGNyaXNfc3dhcG53YnJseih+d29yZCk7CiB9CkBAIC02NSw3ICs2NSw3IEBACiAgKiBkaWZmZXJzIGluIHNwaXJpdCBmcm9tIHRoZSBhYm92ZSBmZnogKG1hbiBmZnMpLgogICovCiAKLWV4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyBrZXJuZWxfZmZzKHVuc2lnbmVkIGxvbmcgdykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrZXJuZWxfZmZzKHVuc2lnbmVkIGxvbmcgdykKIHsKIAlyZXR1cm4gdyA/IGNyaXNfc3dhcHdicmx6ICh3KSArIDEgOiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9jaGVja3N1bS5oCmluZGV4IDYzM2YyMzQuLmI4MDAwYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MTAvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2NoZWNrc3VtLmgKQEAgLTgsMTEgKzgsMTEgQEAKICAqIHRvIHNwbGl0IGFsbCBvZiB0aG9zZSBpbnRvIDE2LWJpdCBjb21wb25lbnRzLCB0aGVuIGFkZC4KICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fd3N1bQorY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewotCWludCByZXM7CisJX193c3VtIHJlczsKIAlfX2FzbV9fICgiYWRkLmQgJTIsICUwXG5cdCIKIAkJICJheFxuXHQiCiAJCSAiYWRkLmQgJTMsICUwXG5cdCIKQEAgLTIxLDcgKzIxLDcgQEAKIAkJICJheFxuXHQiCiAJCSAiYWRkcSAwLCAlMFxuIgogCTogIj1yIiAocmVzKQotCTogIjAiIChzdW0pLCAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICJyIiAoKG50b2hzKGxlbikgPDwgMTYpICsgKHByb3RvIDw8IDgpKSk7CisJOiAiMCIgKHN1bSksICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgInIiICgobGVuICsgcHJvdG8pIDw8IDgpKTsKIAogCXJldHVybiByZXM7CiB9CQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9jaGVja3N1bS5oCmluZGV4IDk3ZWY4OWUuLmU1ZGNmY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2NoZWNrc3VtLmgKQEAgLTksMTEgKzksMTEgQEAKICAqIGNoZWNrc3VtLiBXaGljaCBtZWFucyBpdCB3b3VsZCBiZSBuZWNlc3NhcnkgdG8gc3BsaXQgYWxsIHRob3NlIGludG8KICAqIDE2LWJpdCBjb21wb25lbnRzIGFuZCB0aGVuIGFkZC4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLAotCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJICAgdW5zaWduZWQgc2hvcnQgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKLQlpbnQgcmVzOworCV9fd3N1bSByZXM7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImFkZC5kICUyLCAlMFxuXHQiCiAJCQkgICAgICAiYWRkYyAlMywgJTBcblx0IgpAQCAtMjEsNyArMjEsNyBAQAogCQkJICAgICAgImFkZGMgMCwgJTBcblx0IgogCQkJICAgICAgOiAiPXIiIChyZXMpCiAJCQkgICAgICA6ICIwIiAoc3VtKSwgInIiIChkYWRkciksICJyIiAoc2FkZHIpLCBcCi0JCQkgICAgICAiciIgKChudG9ocyhsZW4pIDw8IDE2KSArIChwcm90byA8PCA4KSkpOworCQkJICAgICAgInIiICgobGVuICsgcHJvdG8pIDw8IDgpKTsKIAogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLWNyaXMvY2FjaGVmbHVzaC5oCmluZGV4IDcyY2M3MWQuLjAxYWYyZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvY2FjaGVmbHVzaC5oCkBAIC05LDYgKzksNyBAQAogICovCiAjZGVmaW5lIGZsdXNoX2NhY2hlX2FsbCgpCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9tbShtbSkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2NhY2hlX2R1cF9tbShtbSkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9wYWdlKHZtYSwgdm1hZGRyLCBwZm4pCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2NoZWNrc3VtLmgKaW5kZXggMjZhNzcxOS4uMTgwZGJmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvY2hlY2tzdW0uaApAQCAtMTcsNyArMTcsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKQEAgLTI3LDI2ICsyNywyMyBAQAogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwogCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKLQkJCQkgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkgICAgICAgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bSBpbnRvIGEgd29yZAogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gY3N1bSkKIHsKLQkvKiB0aGUgd2hpbGUgbG9vcCBpcyB1bm5lY2Vzc2FyeSByZWFsbHksIGl0J3MgYWx3YXlzIGVub3VnaCB3aXRoIHR3bwotCSAgIGl0ZXJhdGlvbnMgKi8KLQkKLQl3aGlsZShzdW0gPj4gMTYpCi0JCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7IC8qIGFkZCBpbiBlbmQtYXJvdW5kIGNhcnJ5ICovCi0JCi0JcmV0dXJuIH5zdW07CisJdTMyIHN1bSA9IChfX2ZvcmNlIHUzMiljc3VtOworCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7IC8qIGFkZCBpbiBlbmQtYXJvdW5kIGNhcnJ5ICovCisJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsgLyogYWRkIGluIGVuZC1hcm91bmQgY2FycnkgKi8KKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKLQkJCQkJCWludCBsZW4sIHVuc2lnbmVkIGludCBzdW0sIAorZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkJaW50IGxlbiwgX193c3VtIHN1bSwKIAkJCQkJCWludCAqZXJycHRyKTsKIAogLyoKQEAgLTU1LDggKzUyLDcgQEAKICAqCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoaXBoLCBpaGwgKiA0LCAwKSk7CiB9CkBAIC02NiwxMSArNjIsMTAgQEAKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaW50IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC04MCw3ICs3NSw4IEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikgeworc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQorewogCXJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLWNyaXMvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9kbWEtbWFwcGluZy5oCmluZGV4IGNiZjFhOTguLjY2MmNlYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2RtYS1tYXBwaW5nLmgKQEAgLTE1NiwxMCArMTU2LDEwIEBACiAJcmV0dXJuICgxIDw8IElOVEVSTk9ERV9DQUNIRV9TSElGVCk7CiB9CiAKLSNkZWZpbmUgZG1hX2lzX2NvbnNpc3RlbnQoZCkJKDEpCisjZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQsIGgpCSgxKQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9jYWNoZV9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKK2RtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3NlbWFwaG9yZS1oZWxwZXIuaCBiL2luY2x1ZGUvYXNtLWNyaXMvc2VtYXBob3JlLWhlbHBlci5oCmluZGV4IGRiZDBmMzAuLmE4ZTFlNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvc2VtYXBob3JlLWhlbHBlci5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvc2VtYXBob3JlLWhlbHBlci5oCkBAIC0yMCwxMiArMjAsMTIgQEAKIC8qCiAgKiBUaGVzZSB0d28gX211c3RfIGV4ZWN1dGUgYXRvbWljYWxseSB3cnQgZWFjaCBvdGhlci4KICAqLwotZXh0ZXJuIGlubGluZSB2b2lkIHdha2Vfb25lX21vcmUoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWtlX29uZV9tb3JlKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCiB7CiAJYXRvbWljX2luYygmc2VtLT53YWtpbmcpOwogfQogCi1leHRlcm4gaW5saW5lIGludCB3YWtpbmdfbm9uX3plcm8oc3RydWN0IHNlbWFwaG9yZSAqc2VtKQorc3RhdGljIGlubGluZSBpbnQgd2FraW5nX25vbl96ZXJvKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAwOwpAQCAtNDAsNyArNDAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWV4dGVybiBpbmxpbmUgaW50IHdha2luZ19ub25femVyb19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSwKK3N0YXRpYyBpbmxpbmUgaW50IHdha2luZ19ub25femVyb19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSwKIAkJCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCWludCByZXQgPSAwOwpAQCAtNTksNyArNTksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWV4dGVybiBpbmxpbmUgaW50IHdha2luZ19ub25femVyb190cnlsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3N0YXRpYyBpbmxpbmUgaW50IHdha2luZ19ub25femVyb190cnlsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKIHsKICAgICAgICAgaW50IHJldCA9IDE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWJpdHMuaAppbmRleCBiZTA4MzZkLi44ZDhjZWMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy90ZXJtYml0cy5oCkBAIC0xOSw2ICsxOSwxNyBAQAogCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwogfTsKIAorc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKIC8qIGNfY2MgY2hhcmFjdGVycyAqLwogI2RlZmluZSBWSU5UUiAwCiAjZGVmaW5lIFZRVUlUIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLWZydi9iaXRvcHMuaAppbmRleCAxZjcwZDQ3Li5mODU2MGVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2JpdG9wcy5oCkBAIC0yNTYsNiArMjU2LDUwIEBACiAJcmV0dXJuIDMxIC0gYml0OwogfQogCisvKgorICogc3BlY2lhbCBzbGltbGluZSB2ZXJzaW9uIG9mIGZscygpIGZvciBjYWxjdWxhdGluZyBpbG9nMl91MzIoKQorICogLSBub3RlOiBubyBwcm90ZWN0aW9uIGFnYWluc3QgbiA9PSAwCisgKi8KKyNkZWZpbmUgQVJDSF9IQVNfSUxPRzJfVTMyCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK2ludCBfX2lsb2cyX3UzMih1MzIgbikKK3sKKwlpbnQgYml0OworCWFzbSgic2NhbiAlMSxncjAsJTAiIDogIj1yIihiaXQpIDogInIiKG4pKTsKKwlyZXR1cm4gMzEgLSBiaXQ7Cit9CisKKy8qCisgKiBzcGVjaWFsIHNsaW1saW5lIHZlcnNpb24gb2YgZmxzNjQoKSBmb3IgY2FsY3VsYXRpbmcgaWxvZzJfdTY0KCkKKyAqIC0gbm90ZTogbm8gcHJvdGVjdGlvbiBhZ2FpbnN0IG4gPT0gMAorICovCisjZGVmaW5lIEFSQ0hfSEFTX0lMT0cyX1U2NAorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitpbnQgX19pbG9nMl91NjQodTY0IG4pCit7CisJdW5pb24geworCQl1NjQgbGw7CisJCXN0cnVjdCB7IHUzMiBoLCBsOyB9OworCX0gXzsKKwlpbnQgYml0LCB4LCB5OworCisJXy5sbCA9IG47CisKKwlhc20oIglzdWJjYwkJJTMsZ3IwLGdyMCxpY2MwCQlcbiIKKwkgICAgIglja2VxCQlpY2MwLGNjNAkJXG4iCisJICAgICIJY3NjYW4ucAkJJTMsZ3IwLCUwCSxjYzQsMAlcbiIKKwkgICAgIiAgIHNldGxvcwkJIzYzLCUxCQkJXG4iCisJICAgICIJY3NjYW4ucAkJJTQsZ3IwLCUwCSxjYzQsMQlcbiIKKwkgICAgIiAgIHNldGxvcwkJIzMxLCUyCQkJXG4iCisJICAgICIJY3N1Yi5wCQklMSwlMCwlMAksY2M0LDAJXG4iCisJICAgICIJY3N1YgkJJTIsJTAsJTAJLGNjNCwxCVxuIgorCSAgICA6ICI9JnIiKGJpdCksICI9ciIoeCksICI9ciIoeSkKKwkgICAgOiAiMHIiKF8uaCksICJyIihfLmwpCisJICAgIDogImljYzAiLCAiY2M0IgorCSAgICApOworCXJldHVybiBiaXQ7Cit9CisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvaHdlaWdodC5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tZnJ2L2NhY2hlZmx1c2guaAppbmRleCBlYWE1ODI2Li4wMjUwMDQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9jYWNoZWZsdXNoLmgKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHt9IHdoaWxlKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCWRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGZsdXNoX2NhY2hlX2R1cF9tbShtbSkJCQlkbyB7fSB3aGlsZSgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZShtbSwgc3RhcnQsIGVuZCkJZG8ge30gd2hpbGUoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7fSB3aGlsZSgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpCQlkbyB7fSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1mcnYvY2hlY2tzdW0uaAppbmRleCA0MmJmMGRiLi45YjE2ODk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvY2hlY2tzdW0uaApAQCAtMjYsNyArMjYsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKQEAgLTM1LDcgKzM1LDcgQEAKICAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5KGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtKTsKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbF9jb3B5LCBidXQgY29waWVzIGZyb20gdXNlciBzcGFjZS4KQEAgLTQzLDExICs0Myw4IEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGNoYXIgKmRzdCwKLQkJCQkJCWludCBsZW4sIGludCBzdW0sIGludCAqY3N1bV9lcnIpOwotCi0jZGVmaW5lIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soc3JjLCBkc3QsIGxlbiwgc3VtKQlcCi0JY3N1bV9wYXJ0aWFsX2NvcHkoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSkpCitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmNzdW1fZXJyKTsKIAogLyoKICAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKQEAgLTU1LDcgKzUyLDcgQEAKICAqCiAgKi8KIHN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICppcGgsIHVuc2lnbmVkIGludCBpaGwpCitfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHRtcCwgaW5jLCBzdW0gPSAwOwogCkBAIC04MSwxMyArNzgsMTMgQEAKIAkgICAgOiAiaWNjMCIsICJpY2MxIgogCSAgICApOwogCi0JcmV0dXJuIH5zdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfnN1bTsKIH0KIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCB0bXA7CiAKQEAgLTEwMCwxNiArOTcsMTYgQEAKIAkgICAgOiAiMCIoc3VtKQogCSAgICApOwogCi0JcmV0dXJuIH5zdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfnN1bTsKIH0KIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlhc20oIglhZGRjYwkJJTEsJTAsJTAsaWNjMAlcbiIKIAkgICAgIglhZGR4Y2MJCSUyLCUwLCUwLGljYzAJXG4iCkBAIC0xMjIsOSArMTE5LDkgQEAKIAlyZXR1cm4gc3VtOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2Citjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KQEAgLTEzMywxMiArMTMwLDEyIEBACiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbik7CitleHRlcm4gX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbik7CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV9pcHY2X21hZ2ljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCV9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgbG9uZyB0bXAsIHRtcDI7CiAKQEAgLTE3Nyw3ICsxNzQsNyBAQAogCSAgICA6ICJpY2MwIgogCSAgICApOwogCi0JcmV0dXJuIH5zdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfnN1bTsKIH0KIAogI2VuZGlmIC8qIF9BU01fQ0hFQ0tTVU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2RldmljZS5oIGIvaW5jbHVkZS9hc20tZnJ2L2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1mcnYvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1mcnYvZG1hLW1hcHBpbmcuaAppbmRleCBlOWZjMWQ0Li5iY2IyZGY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvZG1hLW1hcHBpbmcuaApAQCAtMTcyLDEwICsxNzIsMTAgQEAKIAlyZXR1cm4gMSA8PCBMMV9DQUNIRV9TSElGVDsKIH0KIAotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkKQkoMSkKKyNkZWZpbmUgZG1hX2lzX2NvbnNpc3RlbnQoZCwgaCkJKDEpCiAKIHN0YXRpYyBpbmxpbmUKLXZvaWQgZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAordm9pZCBkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKIAkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlmbHVzaF93cml0ZV9idWZmZXJzKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvaGlnaG1lbS5oIGIvaW5jbHVkZS9hc20tZnJ2L2hpZ2htZW0uaAppbmRleCBlMjI0N2MyLi5mZjRkNmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvaGlnaG1lbS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9oaWdobWVtLmgKQEAgLTgyLDExICs4MiwxMSBAQAogCWRhbXByID0gcGFkZHIgfCB4QU1QUnhfTCB8IHhBTVBSeF9NIHwgeEFNUFJ4X1MgfCB4QU1QUnhfU1NfMTZLYiB8IHhBTVBSeF9WOwkJXAogCQkJCQkJCQkJCQkJXAogCWlmICh0eXBlICE9IF9fS01fQ0FDSEUpCQkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoIm1vdmdzICUwLGRhbXByIiNhbXByIDo6ICJyIihkYW1wcikpOwkJCQlcCisJCWFzbSB2b2xhdGlsZSgibW92Z3MgJTAsZGFtcHIiI2FtcHIgOjogInIiKGRhbXByKSA6ICJtZW1vcnkiKTsJCQlcCiAJZWxzZQkJCQkJCQkJCQkJXAogCQlhc20gdm9sYXRpbGUoIm1vdmdzICUwLGlhbXByIiNhbXByIlxuIgkJCQkJCVwKIAkJCSAgICAgIm1vdmdzICUwLGRhbXByIiNhbXByIlxuIgkJCQkJCVwKLQkJCSAgICAgOjogInIiKGRhbXByKQkJCQkJCQlcCisJCQkgICAgIDo6ICJyIihkYW1wcikgOiAibWVtb3J5IgkJCQkJCVwKIAkJCSAgICAgKTsJCQkJCQkJCQlcCiAJCQkJCQkJCQkJCQlcCiAJYXNtKCJtb3ZzZyBkYW1sciIjYW1wciIsJTAiIDogIj1yIihkYW1scikpOwkJCQkJCVwKQEAgLTEwNCw3ICsxMDQsNyBAQAogCWFzbSB2b2xhdGlsZSgibW92Z3MgJTAsdHBsciBcbiIJCQkJCQkJCSAgXAogCQkgICAgICJtb3ZncyAlMSx0cHByIFxuIgkJCQkJCQkJICBcCiAJCSAgICAgInRsYnByICUwLGdyMCwjMiwjMSIJCQkJCQkJICBcCi0JCSAgICAgOiA6ICJyIihkYW1sciksICJyIihkYW1wcikpOwkJCQkJCSAgXAorCQkgICAgIDogOiAiciIoZGFtbHIpLCAiciIoZGFtcHIpIDogIm1lbW9yeSIpOwkJCQkJICBcCiAJCQkJCQkJCQkJCQkgIFwKIAkvKnByaW50aygiVExCOiBTRUNOIHNsPSVkIEw9JTA4bHggUD0lMDhseFxuIiwgc2xvdCwgZGFtbHIsIGRhbXByKTsqLwkJCSAgXAogCQkJCQkJCQkJCQkJICBcCkBAIC0xMTUsNyArMTE1LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHBhZGRyOwogCi0JcHJlZW1wdF9kaXNhYmxlKCk7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKIAlwYWRkciA9IHBhZ2VfdG9fcGh5cyhwYWdlKTsKIAogCXN3aXRjaCAodHlwZSkgewpAQCAtMTM4LDE2ICsxMzgsMTYgQEAKIAl9CiB9CiAKLSNkZWZpbmUgX19rdW5tYXBfYXRvbWljX3ByaW1hcnkodHlwZSwgYW1wcikJCQlcCi1kbyB7CQkJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKCJtb3ZncyBncjAsZGFtcHIiI2FtcHIiXG4iKTsJCVwKLQlpZiAodHlwZSA9PSBfX0tNX0NBQ0hFKQkJCQkJXAotCQlhc20gdm9sYXRpbGUoIm1vdmdzIGdyMCxpYW1wciIjYW1wciJcbiIpOwlcCisjZGVmaW5lIF9fa3VubWFwX2F0b21pY19wcmltYXJ5KHR5cGUsIGFtcHIpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJYXNtIHZvbGF0aWxlKCJtb3ZncyBncjAsZGFtcHIiI2FtcHIiXG4iIDo6OiAibWVtb3J5Iik7CQlcCisJaWYgKHR5cGUgPT0gX19LTV9DQUNIRSkJCQkJCQlcCisJCWFzbSB2b2xhdGlsZSgibW92Z3MgZ3IwLGlhbXByIiNhbXByIlxuIiA6OjogIm1lbW9yeSIpOwlcCiB9IHdoaWxlKDApCiAKLSNkZWZpbmUgX19rdW5tYXBfYXRvbWljX3NlY29uZGFyeShzbG90LCB2YWRkcikJCQlcCi1kbyB7CQkJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKCJ0bGJwciAlMCxncjAsIzQsIzEiIDogOiAiciIodmFkZHIpKTsJXAorI2RlZmluZSBfX2t1bm1hcF9hdG9taWNfc2Vjb25kYXJ5KHNsb3QsIHZhZGRyKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgidGxicHIgJTAsZ3IwLCM0LCMxIiA6IDogInIiKHZhZGRyKSA6ICJtZW1vcnkiKTsJXAogfSB3aGlsZSgwKQogCiBzdGF0aWMgaW5saW5lIHZvaWQga3VubWFwX2F0b21pYyh2b2lkICprdmFkZHIsIGVudW0ga21fdHlwZSB0eXBlKQpAQCAtMTcwLDcgKzE3MCw3IEBACiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQotCXByZWVtcHRfZW5hYmxlKCk7CisJcGFnZWZhdWx0X2VuYWJsZSgpOwogfQogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3BhcmFtLmggYi9pbmNsdWRlL2FzbS1mcnYvcGFyYW0uaAppbmRleCAxNjgzODFlLi4zNjU2NTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvcGFyYW0uaApAQCAtMTgsNiArMTgsNSBAQAogI2VuZGlmCiAKICNkZWZpbmUgTUFYSE9TVE5BTUVMRU4JCTY0CS8qIG1heCBsZW5ndGggb2YgaG9zdG5hbWUgKi8KLSNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUJNTEyCiAKICNlbmRpZiAvKiBfQVNNX1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9zZXR1cC5oIGIvaW5jbHVkZS9hc20tZnJ2L3NldHVwLmgKaW5kZXggMGQyOTNiOS4uYWZkNzg3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3NldHVwLmgKQEAgLTEyLDYgKzEyLDEwIEBACiAjaWZuZGVmIF9BU01fU0VUVVBfSAogI2RlZmluZSBfQVNNX1NFVFVQX0gKIAorI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRSAgICAgICA1MTIKKworI2lmZGVmIF9fS0VSTkVMX18KKwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KQEAgLTIyLDQgKzI2LDYgQEAKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAorI2VuZGlmICAvKiAgX19LRVJORUxfXyAgKi8KKwogI2VuZGlmIC8qIF9BU01fU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1mcnYvdGVybWJpdHMuaAppbmRleCA3NGYyMGQ2Li4yZDZkMzg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvdGVybWJpdHMuaApAQCAtMTcsNiArMTcsMTcgQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIgMAogI2RlZmluZSBWUVVJVCAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWZydi90aHJlYWRfaW5mby5oCmluZGV4IGQ2NmM0OGUuLmQ4ODFmNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi90aHJlYWRfaW5mby5oCkBAIC0xMTYsNiArMTE2LDcgQEAKICNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk2CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTE2CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZyBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE3CS8qIE9PTSBraWxsZXIga2lsbGVkIHByb2Nlc3MgKi8KKyNkZWZpbmUgVElGX0ZSRUVaRQkJMTgJLyogZnJlZXppbmcgZm9yIHN1c3BlbmQgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMSA8PCBUSUZfTk9USUZZX1JFU1VNRSkKQEAgLTEyNSw2ICsxMjYsNyBAQAogI2RlZmluZSBfVElGX0lSRVQJCSgxIDw8IFRJRl9JUkVUKQogI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMSA8PCBUSUZfUkVTVE9SRV9TSUdNQVNLKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxIDw8IFRJRl9QT0xMSU5HX05SRkxBRykKKyNkZWZpbmUgX1RJRl9GUkVFWkUJCSgxIDw8IFRJRl9GUkVFWkUpCiAKICNkZWZpbmUgX1RJRl9XT1JLX01BU0sJCTB4MDAwMEZGRkUJLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAqLwogI2RlZmluZSBfVElGX0FMTFdPUktfTUFTSwkweDAwMDBGRkZGCS8qIHdvcmsgdG8gZG8gb24gYW55IHJldHVybiB0byB1LXNwYWNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKaW5kZXggNzI1ZTg1NC4uNTg0YzA0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaApAQCAtMzIwLDEyNSArMzIwLDYgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgTlJfc3lzY2FsbHMgMzEwCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLS8qCi0gKiBwcm9jZXNzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBzeXNjYWxsLCBjb25zaWduaW5nIGl0IHRvIG9uZSBvZiB0d28gcG9zc2libGUgZmF0ZXMKLSAqIC0gdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC00MDk1OiBzZWUgPGFzbS1mcnYvZXJybm8uaD4KLSAqLwotI3VuZGVmIF9fc3lzY2FsbF9yZXR1cm4KLSNkZWZpbmUgX19zeXNjYWxsX3JldHVybih0eXBlLCByZXMpCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotICAgICAgICB1bnNpZ25lZCBsb25nIF9fc3IyID0gKHJlcyk7CQkJCQlcCi0JaWYgKF9fYnVpbHRpbl9leHBlY3QoX19zcjIgPj0gKHVuc2lnbmVkIGxvbmcpKC1NQVhfRVJSTk8pLCAwKSkgeyBcCi0JCWVycm5vID0gKC1fX3NyMik7CQkJCQlcCi0JCV9fc3IyID0gfjBVTDsJCQkJCQlcCi0JfQkJCQkJCQkJXAotCXJldHVybiAodHlwZSkgX19zcjI7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotLyogWFhYIC0gX2ZvbyBuZWVkcyB0byBiZSBfX2Zvbywgd2hpbGUgX19OUl9iYXIgY291bGQgYmUgX05SX2Jhci4gKi8KLQotI3VuZGVmIF9zeXNjYWxsMAotI2RlZmluZSBfc3lzY2FsbDAodHlwZSxuYW1lKQkJCQkJCVwKLXR5cGUgbmFtZSh2b2lkKQkJCQkJCQkJXAotewkJCQkJCQkJCVwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2NudW0gX19hc21fXyAoImdyNyIpID0gKF9fTlJfIyNuYW1lKTsJXAotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzAgX19hc21fXyAoImdyOCIpOwkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRpcmEgZ3IwLCMwIgkJCQlcCi0JCQkgICAgICA6ICI9ciIgKF9fc2MwKQkJCQlcCi0JCQkgICAgICA6ICJyIiAoX19zY251bSkpOwkJCQlcCi0JX19zeXNjYWxsX3JldHVybih0eXBlLCBfX3NjMCk7CQkJCQlcCi19Ci0KLSN1bmRlZiBfc3lzY2FsbDEKLSNkZWZpbmUgX3N5c2NhbGwxKHR5cGUsbmFtZSx0eXBlMSxhcmcxKQkJCQkJCVwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxKQkJCQkJCQkJXAotewkJCQkJCQkJCQlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjbnVtIF9fYXNtX18gKCJncjciKSA9IChfX05SXyMjbmFtZSk7CQlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMCBfX2FzbV9fICgiZ3I4IikgPSAodW5zaWduZWQgbG9uZykgYXJnMTsJXAotCV9fYXNtX18gX192b2xhdGlsZV9fICgidGlyYSBncjAsIzAiCQkJCQlcCi0JCQkgICAgICA6ICIrciIgKF9fc2MwKQkJCQkJXAotCQkJICAgICAgOiAiciIgKF9fc2NudW0pKTsJCQkJCVwKLQlfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIF9fc2MwKTsJCQkJCQlcCi19Ci0KLSN1bmRlZiBfc3lzY2FsbDIKLSNkZWZpbmUgX3N5c2NhbGwyKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIpCQkJCVwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxLHR5cGUyIGFyZzIpCQkJCQkJXAotewkJCQkJCQkJCQlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjbnVtIF9fYXNtX18gKCJncjciKSA9IChfX05SXyMjbmFtZSk7CQlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMCBfX2FzbV9fICgiZ3I4IikgPSAodW5zaWduZWQgbG9uZykgYXJnMTsJXAotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzEgX19hc21fXyAoImdyOSIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzI7CVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRpcmEgZ3IwLCMwIgkJCQkJXAotCQkJICAgICAgOiAiK3IiIChfX3NjMCkJCQkJCVwKLQkJCSAgICAgIDogInIiIChfX3NjbnVtKSwgInIiIChfX3NjMSkpOwkJCVwKLQlfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIF9fc2MwKTsJCQkJCQlcCi19Ci0KLSN1bmRlZiBfc3lzY2FsbDMKLSNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMykJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMpCQkJCQlcCi17CQkJCQkJCQkJCVwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2NudW0gX19hc21fXyAoImdyNyIpID0gKF9fTlJfIyNuYW1lKTsJCVwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MwIF9fYXNtX18gKCJncjgiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmcxOwlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMSBfX2FzbV9fICgiZ3I5IikgPSAodW5zaWduZWQgbG9uZykgYXJnMjsJXAotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzIgX19hc21fXyAoImdyMTAiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmczOwlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0aXJhIGdyMCwjMCIJCQkJCVwKLQkJCSAgICAgIDogIityIiAoX19zYzApCQkJCQlcCi0JCQkgICAgICA6ICJyIiAoX19zY251bSksICJyIiAoX19zYzEpLCAiciIgKF9fc2MyKSk7CVwKLQlfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIF9fc2MwKTsJCQkJCQlcCi19Ci0KLSN1bmRlZiBfc3lzY2FsbDQKLSNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0KQkJXAotdHlwZSBuYW1lICh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0KQkJCQlcCi17CQkJCQkJCQkJCQlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjbnVtIF9fYXNtX18gKCJncjciKSA9IChfX05SXyMjbmFtZSk7CQkJXAotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzAgX19hc21fXyAoImdyOCIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzE7CQlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMSBfX2FzbV9fICgiZ3I5IikgPSAodW5zaWduZWQgbG9uZykgYXJnMjsJCVwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MyIF9fYXNtX18gKCJncjEwIikgPSAodW5zaWduZWQgbG9uZykgYXJnMzsJCVwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MzIF9fYXNtX18gKCJncjExIikgPSAodW5zaWduZWQgbG9uZykgYXJnNDsJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRpcmEgZ3IwLCMwIgkJCQkJCVwKLQkJCSAgICAgIDogIityIiAoX19zYzApCQkJCQkJXAotCQkJICAgICAgOiAiciIgKF9fc2NudW0pLCAiciIgKF9fc2MxKSwgInIiIChfX3NjMiksICJyIiAoX19zYzMpKTsJXAotCV9fc3lzY2FsbF9yZXR1cm4odHlwZSwgX19zYzApOwkJCQkJCQlcCi19Ci0KLSN1bmRlZiBfc3lzY2FsbDUKLSNkZWZpbmUgX3N5c2NhbGw1KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LHR5cGU1LGFyZzUpCVwKLXR5cGUgbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCwgdHlwZTUgYXJnNSkJCQlcCi17CQkJCQkJCQkJCQlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjbnVtIF9fYXNtX18gKCJncjciKSA9IChfX05SXyMjbmFtZSk7CQkJXAotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzAgX19hc21fXyAoImdyOCIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzE7CQlcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMSBfX2FzbV9fICgiZ3I5IikgPSAodW5zaWduZWQgbG9uZykgYXJnMjsJCVwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MyIF9fYXNtX18gKCJncjEwIikgPSAodW5zaWduZWQgbG9uZykgYXJnMzsJCVwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MzIF9fYXNtX18gKCJncjExIikgPSAodW5zaWduZWQgbG9uZykgYXJnNDsJCVwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2M0IF9fYXNtX18gKCJncjEyIikgPSAodW5zaWduZWQgbG9uZykgYXJnNTsJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRpcmEgZ3IwLCMwIgkJCQkJCVwKLQkJCSAgICAgIDogIityIiAoX19zYzApCQkJCQkJXAotCQkJICAgICAgOiAiciIgKF9fc2NudW0pLCAiciIgKF9fc2MxKSwgInIiIChfX3NjMiksCQlcCi0JCQkgICAgICAiciIgKF9fc2MzKSwgInIiIChfX3NjNCkpOwkJCQlcCi0JX19zeXNjYWxsX3JldHVybih0eXBlLCBfX3NjMCk7CQkJCQkJCVwKLX0KLQotI3VuZGVmIF9zeXNjYWxsNgotI2RlZmluZSBfc3lzY2FsbDYodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsdHlwZTUsYXJnNSwgdHlwZTYsIGFyZzYpIFwKLXR5cGUgbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCwgdHlwZTUgYXJnNSwgdHlwZTYgYXJnNikJCSBcCi17CQkJCQkJCQkJCQkJIFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2NudW0gX19hc21fXyAoImdyNyIpID0gKF9fTlJfIyNuYW1lKTsJCQkJIFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MwIF9fYXNtX18gKCJncjgiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmcxOwkJCSBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMSBfX2FzbV9fICgiZ3I5IikgPSAodW5zaWduZWQgbG9uZykgYXJnMjsJCQkgXAotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzIgX19hc21fXyAoImdyMTAiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmczOwkJCSBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMyBfX2FzbV9fICgiZ3IxMSIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzQ7CQkJIFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2M0IF9fYXNtX18gKCJncjEyIikgPSAodW5zaWduZWQgbG9uZykgYXJnNTsJCQkgXAotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzUgX19hc21fXyAoImdyMTMiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmc2OwkJCSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0aXJhIGdyMCwjMCIJCQkJCQkJIFwKLQkJCSAgICAgIDogIityIiAoX19zYzApCQkJCQkJCSBcCi0JCQkgICAgICA6ICJyIiAoX19zY251bSksICJyIiAoX19zYzEpLCAiciIgKF9fc2MyKSwJCQkgXAotCQkJICAgICAgInIiIChfX3NjMyksICJyIiAoX19zYzQpLCAiciIgKF9fc2M1KSk7CQkJCSBcCi0JX19zeXNjYWxsX3JldHVybih0eXBlLCBfX3NjMCk7CQkJCQkJCQkgXAotfQogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAvKiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkCmluZGV4IDNjMDZiZTMuLmZhMTRmOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkCkBAIC0xLDQgKzEsMyBAQAotaGVhZGVyLXkgKz0gYXRvbWljLmgKIGhlYWRlci15ICs9IGVycm5vLWJhc2UuaAogaGVhZGVyLXkgKz0gZXJybm8uaAogaGVhZGVyLXkgKz0gZmNudGwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCmluZGV4IGE4NGMzZDguLmEzN2U5NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KQEAgLTE0LDYgKzE0LDcgQEAKIHVuaWZkZWYteSArPSBwdHJhY2UuaAogdW5pZmRlZi15ICs9IHJlc291cmNlLmgKIHVuaWZkZWYteSArPSBzZW1idWYuaAordW5pZmRlZi15ICs9IHNldHVwLmgKIHVuaWZkZWYteSArPSBzaG1idWYuaAogdW5pZmRlZi15ICs9IHNpZ2NvbnRleHQuaAogdW5pZmRlZi15ICs9IHNpZ2luZm8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYXRvbWljLmgKaW5kZXggNDJhOTVkOS4uYjdlNGEwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2F0b21pYy5oCkBAIC02Niw3ICs2Niw3IEBACiAJYXRvbWljNjRfc3ViKGksIHYpOwogfQogCi0jZWxzZQorI2Vsc2UgIC8qICBCSVRTX1BFUl9MT05HID09IDY0ICAqLwogCiB0eXBlZGVmIGF0b21pY190IGF0b21pY19sb25nX3Q7CiAKQEAgLTExMyw1ICsxMTMsNiBAQAogCWF0b21pY19zdWIoaSwgdik7CiB9CiAKLSNlbmRpZgotI2VuZGlmCisjZW5kaWYgIC8qICBCSVRTX1BFUl9MT05HID09IDY0ICAqLworCisjZW5kaWYgIC8qICBfQVNNX0dFTkVSSUNfQVRPTUlDX0ggICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAppbmRleCAxZDk1NzNjZi4uYTA2ZWVjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCkBAIC00LDYgKzQsMjIgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCiAjaWZkZWYgQ09ORklHX0JVRworCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQlVHCisjaWZuZGVmIF9fQVNTRU1CTFlfXworc3RydWN0IGJ1Z19lbnRyeSB7CisJdW5zaWduZWQgbG9uZwlidWdfYWRkcjsKKyNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQorCWNvbnN0IGNoYXIJKmZpbGU7CisJdW5zaWduZWQgc2hvcnQJbGluZTsKKyNlbmRpZgorCXVuc2lnbmVkIHNob3J0CWZsYWdzOworfTsKKyNlbmRpZgkJLyogX19BU1NFTUJMWV9fICovCisKKyNkZWZpbmUgQlVHRkxBR19XQVJOSU5HCSgxPDwwKQorI2VuZGlmCS8qIENPTkZJR19HRU5FUklDX0JVRyAqLworCiAjaWZuZGVmIEhBVkVfQVJDSF9CVUcKICNkZWZpbmUgQlVHKCkgZG8geyBcCiAJcHJpbnRrKCJCVUc6IGZhaWx1cmUgYXQgJXM6JWQvJXMoKSFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgXApAQCAtMTksNyArMzUsNyBAQAogI2RlZmluZSBXQVJOX09OKGNvbmRpdGlvbikgKHsJCQkJCQlcCiAJdHlwZW9mKGNvbmRpdGlvbikgX19yZXRfd2Fybl9vbiA9IChjb25kaXRpb24pOwkJCVwKIAlpZiAodW5saWtlbHkoX19yZXRfd2Fybl9vbikpIHsJCQkJCVwKLQkJcHJpbnRrKCJCVUc6IHdhcm5pbmcgYXQgJXM6JWQvJXMoKVxuIiwgX19GSUxFX18sCVwKKwkJcHJpbnRrKCJXQVJOSU5HIGF0ICVzOiVkICVzKClcbiIsIF9fRklMRV9fLAlcCiAJCQlfX0xJTkVfXywgX19GVU5DVElPTl9fKTsJCQlcCiAJCWR1bXBfc3RhY2soKTsJCQkJCQlcCiAJfQkJCQkJCQkJXApAQCAtMzcsNyArNTMsMTAgQEAKICNlbmRpZgogCiAjaWZuZGVmIEhBVkVfQVJDSF9XQVJOX09OCi0jZGVmaW5lIFdBUk5fT04oY29uZGl0aW9uKSB1bmxpa2VseSgoY29uZGl0aW9uKSkKKyNkZWZpbmUgV0FSTl9PTihjb25kaXRpb24pICh7CQkJCQkJXAorCXR5cGVvZihjb25kaXRpb24pIF9fcmV0X3dhcm5fb24gPSAoY29uZGl0aW9uKTsJCQlcCisJdW5saWtlbHkoX19yZXRfd2Fybl9vbik7CQkJCQlcCit9KQogI2VuZGlmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3Yzk2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZGV2aWNlLmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaWZuZGVmIF9BU01fR0VORVJJQ19ERVZJQ0VfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfREVWSUNFX0gKKworc3RydWN0IGRldl9hcmNoZGF0YSB7Cit9OworCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLmgKaW5kZXggYjU0MWU0OC4uNzgzYWI5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmcuaApAQCAtMjY2LDcgKzI2Niw3IEBACiAKICNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQogI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkKQkoMSkKKyNkZWZpbmUgZG1hX2lzX2NvbnNpc3RlbnQoZCwgaCkJKDEpCiAKIHN0YXRpYyBpbmxpbmUgaW50CiBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKQpAQCAtMjk1LDcgKzI5NSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAorZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCiAJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAkvKiBjb3VsZCBkZWZpbmUgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgZG1hX2NhY2hlIC4uLiBvcGVyYXRpb25zLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9mdXRleC5oCmluZGV4IGRmODkzYzEuLmY0MjJkZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2Z1dGV4LmgKQEAgLTIxLDcgKzIxLDcgQEAKIAlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpbmNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBGVVRFWF9PUF9TRVQ6CkBAIC0zMyw3ICszMyw3IEBACiAJCXJldCA9IC1FTk9TWVM7CiAJfQogCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlpZiAoIXJldCkgewogCQlzd2l0Y2ggKGNtcCkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wYWdlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BhZ2UuaAppbmRleCBhOTZiNWQ5Li5iNTUwNTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BhZ2UuaApAQCAtNCwyMSArNCw1MSBAQAogI2lmZGVmIF9fS0VSTkVMX18KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gaW50IGdldF9vcmRlcih1bnNpZ25lZCBsb25nIHNpemUpCisvKgorICogbm9uLWNvbnN0IHB1cmUgMl5uIHZlcnNpb24gb2YgZ2V0X29yZGVyCisgKiAtIHRoZSBhcmNoIG1heSBvdmVycmlkZSB0aGVzZSBpbiBhc20vYml0b3BzLmggaWYgdGhleSBjYW4gYmUgaW1wbGVtZW50ZWQKKyAqICAgbW9yZSBlZmZpY2llbnRseSB0aGFuIHVzaW5nIHRoZSBhcmNoIGxvZzIgcm91dGluZXMKKyAqIC0gd2UgdXNlIHRoZSBub24tY29uc3QgbG9nMigpIGluc3RlYWQgaWYgdGhlIGFyY2ggaGFzIGRlZmluZWQgb25lIHN1aXRhYmxlCisgKi8KKyNpZm5kZWYgQVJDSF9IQVNfR0VUX09SREVSCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK2ludCBfX2dldF9vcmRlcih1bnNpZ25lZCBsb25nIHNpemUsIGludCBwYWdlX3NoaWZ0KQogeworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIgJiYgZGVmaW5lZChBUkNIX0hBU19JTE9HMl9VMzIpCisJaW50IG9yZGVyID0gX19pbG9nMl91MzIoc2l6ZSkgLSBwYWdlX3NoaWZ0OworCXJldHVybiBvcmRlciA+PSAwID8gb3JkZXIgOiAwOworI2VsaWYgQklUU19QRVJfTE9ORyA9PSA2NCAmJiBkZWZpbmVkKEFSQ0hfSEFTX0lMT0cyX1U2NCkKKwlpbnQgb3JkZXIgPSBfX2lsb2cyX3U2NChzaXplKSAtIHBhZ2Vfc2hpZnQ7CisJcmV0dXJuIG9yZGVyID49IDAgPyBvcmRlciA6IDA7CisjZWxzZQogCWludCBvcmRlcjsKIAotCXNpemUgPSAoc2l6ZSAtIDEpID4+IChQQUdFX1NISUZUIC0gMSk7CisJc2l6ZSA9IChzaXplIC0gMSkgPj4gKHBhZ2Vfc2hpZnQgLSAxKTsKIAlvcmRlciA9IC0xOwogCWRvIHsKIAkJc2l6ZSA+Pj0gMTsKIAkJb3JkZXIrKzsKIAl9IHdoaWxlIChzaXplKTsKIAlyZXR1cm4gb3JkZXI7CisjZW5kaWYKIH0KKyNlbmRpZgorCisvKioKKyAqIGdldF9vcmRlciAtIGNhbGN1bGF0ZSBsb2cyKHBhZ2VzKSB0byBob2xkIGEgYmxvY2sgb2YgdGhlIHNwZWNpZmllZCBzaXplCisgKiBAbiAtIHNpemUKKyAqCisgKiBjYWxjdWxhdGUgYWxsb2NhdGlvbiBvcmRlciBiYXNlZCBvbiB0aGUgY3VycmVudCBwYWdlIHNpemUKKyAqIC0gdGhpcyBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXNlIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBjb25zdGFudCBkYXRhCisgKi8KKyNkZWZpbmUgZ2V0X29yZGVyKG4pCQkJCQkJCVwKKygJCQkJCQkJCQlcCisJX19idWlsdGluX2NvbnN0YW50X3AobikgPwkJCQkJXAorCSgobiA8ICgxVUwgPDwgUEFHRV9TSElGVCkpID8gMCA6IGlsb2cyKG4pIC0gUEFHRV9TSElGVCkgOglcCisJX19nZXRfb3JkZXIobiwgUEFHRV9TSElGVCkJCQkJCVwKKyApCiAKICNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdGVybWlvcy5oCmluZGV4IDFlNThjYTMuLjM3NjllNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdGVybWlvcy5oCkBAIC0xMSw3ICsxMSw3IEBACiAvKgogICogVHJhbnNsYXRlIGEgInRlcm1pbyIgc3RydWN0dXJlIGludG8gYSAidGVybWlvcyIuIFVnaC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgdXNlcl90ZXJtaW9fdG9fa2VybmVsX3Rlcm1pb3Moc3RydWN0IHRlcm1pb3MgKnRlcm1pb3MsCitzdGF0aWMgaW5saW5lIGludCB1c2VyX3Rlcm1pb190b19rZXJuZWxfdGVybWlvcyhzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCiAJCQkJCQlzdHJ1Y3QgdGVybWlvIF9fdXNlciAqdGVybWlvKQogewogCXVuc2lnbmVkIHNob3J0IHRtcDsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAqIFRyYW5zbGF0ZSBhICJ0ZXJtaW9zIiBzdHJ1Y3R1cmUgaW50byBhICJ0ZXJtaW8iLiBVZ2guCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvKHN0cnVjdCB0ZXJtaW8gX191c2VyICp0ZXJtaW8sCi0JCQkJCQlzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcykKKwkJCQkJCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvcykKIHsKIAlpZiAocHV0X3VzZXIodGVybWlvcy0+Y19pZmxhZywgJnRlcm1pby0+Y19pZmxhZykgPCAwIHx8CiAJICAgIHB1dF91c2VyKHRlcm1pb3MtPmNfb2ZsYWcsICZ0ZXJtaW8tPmNfb2ZsYWcpIDwgMCB8fApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCmluZGV4IDY5MjQwYjUuLjc0MzdjY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKQEAgLTExLDggKzExLDggQEAKIAogI2RlZmluZSBST0RBVEEJCQkJCQkJCVwKIAkuID0gQUxJR04oNDA5Nik7CQkJCQkJXAotCV9fc3RhcnRfcm9kYXRhID0gLjsJCQkJCQlcCiAJLnJvZGF0YSAgICAgICAgICAgOiBBVChBRERSKC5yb2RhdGEpIC0gTE9BRF9PRkZTRVQpIHsJCVwKKwkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9yb2RhdGEpID0gLjsJCQlcCiAJCSooLnJvZGF0YSkgKigucm9kYXRhLiopCQkJCQlcCiAJCSooX192ZXJtYWdpYykJCS8qIEtlcm5lbCB2ZXJzaW9uIG1hZ2ljICovCVwKIAl9CQkJCQkJCQlcCkBAIC0xMTksMTMgKzExOSwxNiBAQAogCQkqKF9fa3N5bXRhYl9zdHJpbmdzKQkJCQkJXAogCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKKwlFSF9GUkFNRQkJCQkJCQlcCisJCQkJCQkJCQlcCiAJLyogQnVpbHQtaW4gbW9kdWxlIHBhcmFtZXRlcnMuICovCQkJCVwKIAlfX3BhcmFtIDogQVQoQUREUihfX3BhcmFtKSAtIExPQURfT0ZGU0VUKSB7CQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X19fcGFyYW0pID0gLjsJCQlcCiAJCSooX19wYXJhbSkJCQkJCQlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc3RvcF9fX3BhcmFtKSA9IC47CQkJXAorCQlWTUxJTlVYX1NZTUJPTChfX2VuZF9yb2RhdGEpID0gLjsJCQlcCiAJfQkJCQkJCQkJXAotCV9fZW5kX3JvZGF0YSA9IC47CQkJCQkJXAorCQkJCQkJCQkJXAogCS4gPSBBTElHTig0MDk2KTsKIAogI2RlZmluZSBTRUNVUklUWV9JTklUCQkJCQkJCVwKQEAgLTE1Nyw2ICsxNjAsMjYgQEAKIAkJKigua3Byb2Jlcy50ZXh0KQkJCQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX2twcm9iZXNfdGV4dF9lbmQpID0gLjsKIAorI2lmZGVmIENPTkZJR19TVEFDS19VTldJTkQKKyNkZWZpbmUgRUhfRlJBTUUJCQkJCQkJXAorCQkvKiBVbndpbmQgZGF0YSBiaW5hcnkgc2VhcmNoIHRhYmxlICovCQkJXAorCQkuID0gQUxJR04oOCk7CQkJCQkJXAorICAgICAgICAJLmVoX2ZyYW1lX2hkciA6IEFUKEFERFIoLmVoX2ZyYW1lX2hkcikgLSBMT0FEX09GRlNFVCkgewlcCisJCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X3Vud2luZF9oZHIpID0gLjsJCVwKKwkJCSooLmVoX2ZyYW1lX2hkcikJCQkJXAorCQkJVk1MSU5VWF9TWU1CT0woX19lbmRfdW53aW5kX2hkcikgPSAuOwkJXAorCQl9CQkJCQkJCVwKKwkJLyogVW53aW5kIGRhdGEgKi8JCQkJCVwKKwkJLiA9IEFMSUdOKDgpOwkJCQkJCVwKKwkJLmVoX2ZyYW1lIDogQVQoQUREUiguZWhfZnJhbWUpIC0gTE9BRF9PRkZTRVQpIHsJCVwKKwkJCVZNTElOVVhfU1lNQk9MKF9fc3RhcnRfdW53aW5kKSA9IC47CQlcCisJCSAgCSooLmVoX2ZyYW1lKQkJCQkJXAorCQkJVk1MSU5VWF9TWU1CT0woX19lbmRfdW53aW5kKSA9IC47CQlcCisJCX0KKyNlbHNlCisjZGVmaW5lIEVIX0ZSQU1FCisjZW5kaWYKKwogCQkvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KIAkJU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0bwogCQl0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCkBAIC0xOTUsNSArMjE4LDMzIEBACiAJCS5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0JCVwKIAkJLmNvbW1lbnQgMCA6IHsgKiguY29tbWVudCkgfQogCisjZGVmaW5lIEJVR19UQUJMRQkJCQkJCQlcCisJLiA9IEFMSUdOKDgpOwkJCQkJCQlcCisJX19idWdfdGFibGUgOiBBVChBRERSKF9fYnVnX3RhYmxlKSAtIExPQURfT0ZGU0VUKSB7CQlcCisJCV9fc3RhcnRfX19idWdfdGFibGUgPSAuOwkJCQlcCisJCSooX19idWdfdGFibGUpCQkJCQkJXAorCQlfX3N0b3BfX19idWdfdGFibGUgPSAuOwkJCQkJXAorCX0KKwogI2RlZmluZSBOT1RFUwkJCQkJCQkJXAogCQkubm90ZXMgOiB7ICooLm5vdGUuKikgfSA6bm90ZQorCisjZGVmaW5lIElOSVRDQUxMUwkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDAuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDBzLmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGwxLmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGwxcy5pbml0KQkJCQkJCVwKKyAgCSooLmluaXRjYWxsMi5pbml0KQkJCQkJCVwKKyAgCSooLmluaXRjYWxsMnMuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDMuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDNzLmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGw0LmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGw0cy5pbml0KQkJCQkJCVwKKyAgCSooLmluaXRjYWxsNS5pbml0KQkJCQkJCVwKKyAgCSooLmluaXRjYWxsNXMuaW5pdCkJCQkJCQlcCisJKiguaW5pdGNhbGxyb290ZnMuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDYuaW5pdCkJCQkJCQlcCisgIAkqKC5pbml0Y2FsbDZzLmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGw3LmluaXQpCQkJCQkJXAorICAJKiguaW5pdGNhbGw3cy5pbml0KQorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1oODMwMC9jYWNoZWZsdXNoLmgKaW5kZXggMWU0ZDk1Yi4uNzEyMTBkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL2NhY2hlZmx1c2guaApAQCAtMTIsNiArMTIsNyBAQAogCiAjZGVmaW5lIGZsdXNoX2NhY2hlX2FsbCgpCiAjZGVmaW5lCWZsdXNoX2NhY2hlX21tKG1tKQorI2RlZmluZQlmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lCWZsdXNoX2NhY2hlX3JhbmdlKHZtYSxhLGIpCiAjZGVmaW5lCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLHAscGZuKQogI2RlZmluZQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2NoZWNrc3VtLmgKaW5kZXggMzA1MTkzMS4uOTg3MjRlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9jaGVja3N1bS5oCkBAIC0xMyw3ICsxMyw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMjMsNyArMjMsNyBAQAogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwogCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAKIC8qCkBAIC0zMywyMCArMzMsMTcgQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsCi0JCQkJCQlpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmNzdW1fZXJyKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqY3N1bV9lcnIpOwogCi0jZGVmaW5lIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soc3JjLCBkc3QsIGxlbiwgc3VtKQlcCi0JY3N1bV9wYXJ0aWFsX2NvcHkoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSkpCi0KLXVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICppcGgsIHVuc2lnbmVkIGludCBpaGwpOworX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKIAogCiAvKgogICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0KICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKCJtb3YubCAlMCxlcjBcblx0IgogCQkiYWRkLncgZTAscjBcblx0IgpAQCAtNTgsNyArNTUsNyBAQAogCQk6ICI9ciIoc3VtKQogCQk6ICIwIihzdW0pCiAJCTogImVyMCIpOwotCXJldHVybiB+c3VtOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5zdW07CiB9CiAKIApAQCAtNjcsOSArNjQsOSBAQAogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fICgic3ViLmwgZXIwLGVyMFxuXHQiCiAJCSAiYWRkLmwgJTIsJTBcblx0IgpAQCAtODgsOSArODUsOSBAQAogCXJldHVybiBzdW07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTAwLDYgKzk3LDYgQEAKICAqIGluIGljbXAuYwogICovCiAKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pOworZXh0ZXJuIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pOwogCiAjZW5kaWYgLyogX0g4MzAwX0NIRUNLU1VNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2RlbGF5LmggYi9pbmNsdWRlL2FzbS1oODMwMC9kZWxheS5oCmluZGV4IGNiY2NiYmQuLjc0M2JlYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvZGVsYXkuaApAQCAtOSw3ICs5LDcgQEAKICAqIERlbGF5IHJvdXRpbmVzLCB1c2luZyBhIHByZS1jb21wdXRlZCAibG9vcHNfcGVyX3NlY29uZCIgdmFsdWUuCiAgKi8KIAotZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fICgiMTpcblx0IgogCQkJICAgICAgImRlYy5sICMxLCUwXG5cdCIKQEAgLTI3LDcgKzI3LDcgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwogCi1leHRlcm4gX19pbmxpbmVfXyB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQorc3RhdGljIGlubGluZSB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKQogewogCXVzZWNzICo9IDQyOTU7CQkvKiAyKiozMiAvIDEwMDAwMDAgKi8KIAl1c2VjcyAvPSAobG9vcHNfcGVyX2ppZmZ5KkhaKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2RldmljZS5oIGIvaW5jbHVkZS9hc20taDgzMDAvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1oODMwMC9tbXVfY29udGV4dC5oCmluZGV4IDg1NTcyMWEuLjVjMTY1ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvbW11X2NvbnRleHQuaApAQCAtOSw3ICs5LDcgQEAKIHsKIH0KIAotZXh0ZXJuIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAkvLyBtbS0+Y29udGV4dCA9IHZpcnRfdG9fcGh5cyhtbS0+cGdkKTsKQEAgLTIzLDcgKzIzLDcgQEAKIHsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIGFjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXZfbW0sCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldl9tbSwKIAkJCSAgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0X21tKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvcGNpLmggYi9pbmNsdWRlL2FzbS1oODMwMC9wY2kuaAppbmRleCA1ZWRhZDViLi4wYzc3MWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9wY2kuaApAQCAtMTAsMTIgKzEwLDEyIEBACiAjZGVmaW5lIHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKQkwCiAjZGVmaW5lIHBjaWJpb3Nfc2Nhbl9hbGxfZm5zKGEsIGIpCTAKIAotZXh0ZXJuIGlubGluZSB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1oODMwMC90ZXJtYml0cy5oCmluZGV4IGZhNjlhZTAuLjZhMWY0ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWJpdHMuaApAQCAtMTcsNiArMTcsMTcgQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIgMAogI2RlZmluZSBWUVVJVCAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20taDgzMDAvdGxiZmx1c2guaAppbmRleCBiYmRmZmJlZS4uOWEyYzVjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdGxiZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC90bGJmbHVzaC5oCkBAIC00NywxMiArNDcsMTIgQEAKIAlCVUcoKTsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlCVUcoKTsKIH0KIAotZXh0ZXJuIGlubGluZSB2b2lkIGZsdXNoX3RsYl9wZ3RhYmxlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfcGd0YWJsZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJQlVHKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC90eXBlcy5oIGIvaW5jbHVkZS9hc20taDgzMDAvdHlwZXMuaAppbmRleCBkYTI0MDJiLi4yYThiMWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3R5cGVzLmgKQEAgLTU1LDEyICs1NSw2IEBACiAKIHR5cGVkZWYgdTMyIGRtYV9hZGRyX3Q7CiAKLSNkZWZpbmUgSEFWRV9TRUNUT1JfVAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0KLSNkZWZpbmUgSEFWRV9CTEtDTlRfVAotdHlwZWRlZiB1NjQgYmxrY250X3Q7Ci0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20taDgzMDAvdW5pc3RkLmgKaW5kZXggNzQ3Nzg4ZC4uN2RkZDQxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdW5pc3RkLmgKQEAgLTI5NSwxNzIgKzI5NSw2IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIE5SX3N5c2NhbGxzIDI4OQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0vKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLU1BWF9FUlJOTzogc2VlCi0gICA8YXNtLW02OGsvZXJybm8uaD4gKi8KLQotI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAotZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCi0JLyogYXZvaWQgdXNpbmcgcmVzIHdoaWNoIGlzIGRlY2xhcmVkIHRvIGJlIGluIHJlZ2lzdGVyIGQwOyBcCi0JICAgZXJybm8gbWlnaHQgZXhwYW5kIHRvIGEgZnVuY3Rpb24gY2FsbCBhbmQgY2xvYmJlciBpdC4gICovIFwKLQkJaW50IF9fZXJyID0gLShyZXMpOyBcCi0JCWVycm5vID0gX19lcnI7IFwKLQkJcmVzID0gLTE7IFwKLQl9IFwKLQlyZXR1cm4gKHR5cGUpIChyZXMpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLCBuYW1lKQkJCQlcCi10eXBlIG5hbWUodm9pZCkJCQkJCQlcCi17CQkJCQkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fKCJlcjAiKTsJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92LmwgJTEsZXIwXG5cdCIJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFwYQkjMFxuXHQiCQkJXAotCQkJOiAiPXIiIChfX3JlcykJCQlcCi0JCQk6ICJnIiAoX19OUl8jI25hbWUpCQlcCi0JCQk6ICJjYyIsICJtZW1vcnkiKTsJCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLCBfX3Jlcyk7CQkJXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMSh0eXBlLCBuYW1lLCBhdHlwZSwgYSkJCQlcCi10eXBlIG5hbWUoYXR5cGUgYSkJCQkJCVwKLXsJCQkJCQkJXAotICByZWdpc3RlciBsb25nIF9fcmVzIF9fYXNtX18oImVyMCIpOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfYSBfX2FzbV9fKCJlcjEiKTsJCQlcCi0gIF9hID0gKGxvbmcpYTsJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92LmwgJTEsZXIwXG5cdCIJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFwYQkjMFxuXHQiCQkJXAotCQkJOiAiPXIiIChfX3JlcykJCQlcCi0JCQk6ICJnIiAoX19OUl8jI25hbWUpLAkJXAotCQkJICAiZyIgKF9hKQkJCVwKLQkJCTogImNjIiwgIm1lbW9yeSIpOwkgCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLCBfX3Jlcyk7CQkJXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMih0eXBlLCBuYW1lLCBhdHlwZSwgYSwgYnR5cGUsIGIpCVwKLXR5cGUgbmFtZShhdHlwZSBhLCBidHlwZSBiKQkJCQlcCi17CQkJCQkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fKCJlcjAiKTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX2EgX19hc21fXygiZXIxIik7CQkJXAotICByZWdpc3RlciBsb25nIF9iIF9fYXNtX18oImVyMiIpOwkJCVwKLSAgX2EgPSAobG9uZylhOwkJCQkJCVwKLSAgX2IgPSAobG9uZyliOwkJCQkJCVwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3YubCAlMSxlcjBcblx0IgkJXAotICAgICAgICAgICAgICAgICAgICAgICAgInRyYXBhCSMwXG5cdCIJCQlcCi0JCQk6ICI9ciIgKF9fcmVzKQkJCVwKLQkJCTogImciIChfX05SXyMjbmFtZSksCQlcCi0JCQkgICJnIiAoX2EpLAkJCVwKLQkJCSAgImciIChfYikJCQlcCi0JCQk6ICJjYyIsICJtZW1vcnkiKTsJIAlcCi0gIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgX19yZXMpOwkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDModHlwZSwgbmFtZSwgYXR5cGUsIGEsIGJ0eXBlLCBiLCBjdHlwZSwgYykJXAotdHlwZSBuYW1lKGF0eXBlIGEsIGJ0eXBlIGIsIGN0eXBlIGMpCQkJXAotewkJCQkJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yZXMgX19hc21fXygiZXIwIik7CQkJXAotICByZWdpc3RlciBsb25nIF9hIF9fYXNtX18oImVyMSIpOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfYiBfX2FzbV9fKCJlcjIiKTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX2MgX19hc21fXygiZXIzIik7CQkJXAotICBfYSA9IChsb25nKWE7CQkJCQkJXAotICBfYiA9IChsb25nKWI7CQkJCQkJXAotICBfYyA9IChsb25nKWM7CQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdi5sICUxLGVyMFxuXHQiCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAidHJhcGEJIzBcblx0IgkJCVwKLQkJCTogIj1yIiAoX19yZXMpCQkJXAotCQkJOiAiZyIgKF9fTlJfIyNuYW1lKSwJCVwKLQkJCSAgImciIChfYSksCQkJXAotCQkJICAiZyIgKF9iKSwJCQlcCi0JCQkgICJnIiAoX2MpCQkJXAotCQkJOiAiY2MiLCAibWVtb3J5Iik7CQlcCi0gIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgX19yZXMpOwkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDQodHlwZSwgbmFtZSwgYXR5cGUsIGEsIGJ0eXBlLCBiLAlcCi0gICAgICAgICAgICAgICAgICBjdHlwZSwgYywgZHR5cGUsIGQpCQkJXAotdHlwZSBuYW1lKGF0eXBlIGEsIGJ0eXBlIGIsIGN0eXBlIGMsIGR0eXBlIGQpCQlcCi17CQkJCQkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fKCJlcjAiKTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX2EgX19hc21fXygiZXIxIik7CQkJXAotICByZWdpc3RlciBsb25nIF9iIF9fYXNtX18oImVyMiIpOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfYyBfX2FzbV9fKCJlcjMiKTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX2QgX19hc21fXygiZXI0Iik7CQkJXAotICBfYSA9IChsb25nKWE7CQkJCQkJXAotICBfYiA9IChsb25nKWI7CQkJCQkJXAotICBfYyA9IChsb25nKWM7CQkJCQkJXAotICBfZCA9IChsb25nKWQ7CQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdi5sCSUxLGVyMFxuXHQiCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAidHJhcGEJIzBcblx0IgkJCVwKLQkJCTogIj1yIiAoX19yZXMpCQkJXAotCQkJOiAiZyIgKF9fTlJfIyNuYW1lKSwJCVwKLQkJCSAgImciIChfYSksCQkJXAotCQkJICAiZyIgKF9iKSwJCQlcCi0JCQkgICJnIiAoX2MpLAkJCVwKLQkJCSAgImciIChfZCkJCQlcCi0JCQk6ICJjYyIsICJtZW1vcnkiKTsJCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLCBfX3Jlcyk7CQkJXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNSh0eXBlLCBuYW1lLCBhdHlwZSwgYSwgYnR5cGUsIGIsCVwKLSAgICAgICAgICAgICAgICAgIGN0eXBlLCBjLCBkdHlwZSwgZCwgZXR5cGUsIGUpCQlcCi10eXBlIG5hbWUoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCwgZXR5cGUgZSkJXAotewkJCQkJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yZXMgX19hc21fXygiZXIwIik7CQkJXAotICByZWdpc3RlciBsb25nIF9hIF9fYXNtX18oImVyMSIpOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfYiBfX2FzbV9fKCJlcjIiKTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX2MgX19hc21fXygiZXIzIik7CQkJXAotICByZWdpc3RlciBsb25nIF9kIF9fYXNtX18oImVyNCIpOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfZSBfX2FzbV9fKCJlcjUiKTsJCQlcCi0gIF9hID0gKGxvbmcpYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICBfYiA9IChsb25nKWI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgX2MgPSAobG9uZyljOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0gIF9kID0gKGxvbmcpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICBfZSA9IChsb25nKWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3YubAklMSxlcjBcblx0IgkJXAotICAgICAgICAgICAgICAgICAgICAgICAgInRyYXBhCSMwXG5cdCIJCQlcCi0JCQk6ICI9ciIgKF9fcmVzKQkJCVwKLQkJCTogImciIChfX05SXyMjbmFtZSksCQlcCi0JCQkgICJnIiAoX2EpLAkJCVwKLQkJCSAgImciIChfYiksCQkJXAotCQkJICAiZyIgKF9jKSwJCQlcCi0JCQkgICJnIiAoX2QpLAkJCVwKLQkJCSAgImciIChfZSkJCQlcCi0JCQk6ICJjYyIsICJtZW1vcnkiKTsJCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLCBfX3Jlcyk7CQkJXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNih0eXBlLCBuYW1lLCBhdHlwZSwgYSwgYnR5cGUsIGIsCVwKLSAgICAgICAgICAgICAgICAgIGN0eXBlLCBjLCBkdHlwZSwgZCwgZXR5cGUsIGUsIGZ0eXBlLCBmKQlcCi10eXBlIG5hbWUoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCwgZXR5cGUgZSwgZnR5cGUgZikJXAotewkJCQkJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX19yZXMgX19hc21fXygiZXIwIik7CQkJXAotICByZWdpc3RlciBsb25nIF9hIF9fYXNtX18oImVyMSIpOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfYiBfX2FzbV9fKCJlcjIiKTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX2MgX19hc21fXygiZXIzIik7CQkJXAotICByZWdpc3RlciBsb25nIF9kIF9fYXNtX18oImVyNCIpOwkJCVwKLSAgcmVnaXN0ZXIgbG9uZyBfZSBfX2FzbV9fKCJlcjUiKTsJCQlcCi0gIHJlZ2lzdGVyIGxvbmcgX2YgX19hc21fXygiZXI2Iik7CQkJXAotICBfYSA9IChsb25nKWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgX2IgPSAobG9uZyliOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0gIF9jID0gKGxvbmcpYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICBfZCA9IChsb25nKWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgX2UgPSAobG9uZyllOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0gIF9mID0gKGxvbmcpZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdi5sCSUxLGVyMFxuXHQiCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAidHJhcGEJIzBcblx0IgkJCVwKLQkJCTogIj1yIiAoX19yZXMpCQkJXAotCQkJOiAiZyIgKF9fTlJfIyNuYW1lKSwJCVwKLQkJCSAgImciIChfYSksCQkJXAotCQkJICAiZyIgKF9iKSwJCQlcCi0JCQkgICJnIiAoX2MpLAkJCVwKLQkJCSAgImciIChfZCksCQkJXAotCQkJICAiZyIgKF9lKQkJCVwKLQkJCSAgImciIChfZikJCQlcCi0JCQk6ICJjYyIsICJtZW1vcnkiKTsJCVwKLSAgX19zeXNjYWxsX3JldHVybih0eXBlLCBfX3Jlcyk7CQkJXAotfQogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L0tidWlsZCBiL2luY2x1ZGUvYXNtLWkzODYvS2J1aWxkCmluZGV4IDE0N2U0YWMuLjVhZTkzYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvS2J1aWxkCkBAIC03LDUgKzcsNCBAQAogaGVhZGVyLXkgKz0gdWNvbnRleHQuaAogCiB1bmlmZGVmLXkgKz0gbXRyci5oCi11bmlmZGVmLXkgKz0gc2V0dXAuaAogdW5pZmRlZi15ICs9IHZtODYuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAppbmRleCA2MDE2NjMyLi43Y2ZhZDkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaApAQCAtNTYsMzAgKzU2LDggQEAKICNkZWZpbmUgQUNQSV9FTkFCTEVfSVJRUygpICBsb2NhbF9pcnFfZW5hYmxlKCkKICNkZWZpbmUgQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKQl3YmludmQoKQogCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2FjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayAodW5zaWduZWQgaW50ICpsb2NrKQotewotCXVuc2lnbmVkIGludCBvbGQsIG5ldywgdmFsOwotCWRvIHsKLQkJb2xkID0gKmxvY2s7Ci0JCW5ldyA9ICgoKG9sZCAmIH4weDMpICsgMikgKyAoKG9sZCA+PiAxKSAmIDB4MSkpOwotCQl2YWwgPSBjbXB4Y2hnKGxvY2ssIG9sZCwgbmV3KTsKLQl9IHdoaWxlICh1bmxpa2VseSAodmFsICE9IG9sZCkpOwotCXJldHVybiAobmV3IDwgMykgPyAtMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2FjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayAodW5zaWduZWQgaW50ICpsb2NrKQotewotCXVuc2lnbmVkIGludCBvbGQsIG5ldywgdmFsOwotCWRvIHsKLQkJb2xkID0gKmxvY2s7Ci0JCW5ldyA9IG9sZCAmIH4weDM7Ci0JCXZhbCA9IGNtcHhjaGcobG9jaywgb2xkLCBuZXcpOwotCX0gd2hpbGUgKHVubGlrZWx5ICh2YWwgIT0gb2xkKSk7Ci0JcmV0dXJuIG9sZCAmIDB4MTsKLX0KK2ludCBfX2FjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayh1bnNpZ25lZCBpbnQgKmxvY2spOworaW50IF9fYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKHVuc2lnbmVkIGludCAqbG9jayk7CiAKICNkZWZpbmUgQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKEdMcHRyLCBBY3EpIFwKIAkoKEFjcSkgPSBfX2FjcGlfYWNxdWlyZV9nbG9iYWxfbG9jaygodW5zaWduZWQgaW50ICopIEdMcHRyKSkKQEAgLTEzMiw2ICsxMTAsNyBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiBleHRlcm4gaW50IGFjcGlfc2tpcF90aW1lcl9vdmVycmlkZTsKK2V4dGVybiBpbnQgYWNwaV91c2VfdGltZXJfb3ZlcnJpZGU7CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfbm9pcnFfc2V0KHZvaWQpIHsgYWNwaV9ub2lycSA9IDE7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYWx0ZXJuYXRpdmUuaCBiL2luY2x1ZGUvYXNtLWkzODYvYWx0ZXJuYXRpdmUuaAppbmRleCBiMDFhN2VjLi5iOGZhOTU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FsdGVybmF0aXZlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hbHRlcm5hdGl2ZS5oCkBAIC00LDcgKzQsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RydWN0IGFsdF9pbnN0ciB7CkBAIC0xMTgsNCArMTE4LDE1IEBACiAjZGVmaW5lIExPQ0tfUFJFRklYICIiCiAjZW5kaWYKIAorc3RydWN0IHBhcmF2aXJ0X3BhdGNoOworI2lmZGVmIENPTkZJR19QQVJBVklSVAordm9pZCBhcHBseV9wYXJhdmlydChzdHJ1Y3QgcGFyYXZpcnRfcGF0Y2ggKnN0YXJ0LCBzdHJ1Y3QgcGFyYXZpcnRfcGF0Y2ggKmVuZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCithcHBseV9wYXJhdmlydChzdHJ1Y3QgcGFyYXZpcnRfcGF0Y2ggKnN0YXJ0LCBzdHJ1Y3QgcGFyYXZpcnRfcGF0Y2ggKmVuZCkKK3t9CisjZGVmaW5lIF9fc3RhcnRfcGFyYWluc3RydWN0aW9ucyBOVUxMCisjZGVmaW5lIF9fc3RvcF9wYXJhaW5zdHJ1Y3Rpb25zIE5VTEwKKyNlbmRpZgorCiAjZW5kaWYgLyogX0kzODZfQUxURVJOQVRJVkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaAppbmRleCBiOTUyOTU3Li40MWE0NDMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaApAQCAtMzcsMTggKzM3LDI3IEBACiAvKgogICogQmFzaWMgZnVuY3Rpb25zIGFjY2Vzc2luZyBBUElDcy4KICAqLworI2lmZGVmIENPTkZJR19QQVJBVklSVAorI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgorI2Vsc2UKKyNkZWZpbmUgYXBpY193cml0ZSBuYXRpdmVfYXBpY193cml0ZQorI2RlZmluZSBhcGljX3dyaXRlX2F0b21pYyBuYXRpdmVfYXBpY193cml0ZV9hdG9taWMKKyNkZWZpbmUgYXBpY19yZWFkIG5hdGl2ZV9hcGljX3JlYWQKKyNlbmRpZgogCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBhcGljX3dyaXRlKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBsb25nIHYpCitzdGF0aWMgX19pbmxpbmUgZmFzdGNhbGwgdm9pZCBuYXRpdmVfYXBpY193cml0ZSh1bnNpZ25lZCBsb25nIHJlZywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgdikKIHsKIAkqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEFQSUNfQkFTRStyZWcpKSA9IHY7CiB9CiAKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFwaWNfd3JpdGVfYXRvbWljKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBsb25nIHYpCitzdGF0aWMgX19pbmxpbmUgZmFzdGNhbGwgdm9pZCBuYXRpdmVfYXBpY193cml0ZV9hdG9taWModW5zaWduZWQgbG9uZyByZWcsCisJCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2KQogewogCXhjaGcoKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoQVBJQ19CQVNFK3JlZyksIHYpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgbG9uZyBhcGljX3JlYWQodW5zaWduZWQgbG9uZyByZWcpCitzdGF0aWMgX19pbmxpbmUgZmFzdGNhbGwgdW5zaWduZWQgbG9uZyBuYXRpdmVfYXBpY19yZWFkKHVuc2lnbmVkIGxvbmcgcmVnKQogewogCXJldHVybiAqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKEFQSUNfQkFTRStyZWcpKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2F0b21pYy5oCmluZGV4IDUxYTE2NjIuLmM1NzQ0MWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hdG9taWMuaApAQCAtMTQsNyArMTQsNyBAQAogICogb24gdXMuIFdlIG5lZWQgdG8gdXNlIF9leGFjdGx5XyB0aGUgYWRkcmVzcyB0aGUgdXNlciBnYXZlIHVzLAogICogbm90IHNvbWUgYWxpYXMgdGhhdCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKK3R5cGVkZWYgc3RydWN0IHsgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CiAKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCkBAIC0xODcsOSArMTg3LDkgQEAKIAkvKiBNb2Rlcm4gNDg2KyBwcm9jZXNzb3IgKi8KIAlfX2kgPSBpOwogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlMT0NLX1BSRUZJWCAieGFkZGwgJTAsICUxOyIKLQkJOiI9ciIoaSkKLQkJOiJtIih2LT5jb3VudGVyKSwgIjAiKGkpKTsKKwkJTE9DS19QUkVGSVggInhhZGRsICUwLCAlMSIKKwkJOiIrciIgKGkpLCAiK20iICh2LT5jb3VudGVyKQorCQk6IDogIm1lbW9yeSIpOwogCXJldHVybiBpICsgX19pOwogCiAjaWZkZWYgQ09ORklHX00zODYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYm9vdC5oIGIvaW5jbHVkZS9hc20taTM4Ni9ib290LmgKaW5kZXggOTZiMjI4ZS4uOGNlNzlhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9ib290LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9ib290LmgKQEAgLTEyLDQgKzEyLDggQEAKICNkZWZpbmUgRVhURU5ERURfVkdBCTB4ZmZmZQkJLyogODB4NTAgbW9kZSAqLwogI2RlZmluZSBBU0tfVkdBCQkweGZmZmQJCS8qIGFzayBmb3IgaXQgYXQgYm9vdHVwICovCiAKLSNlbmRpZgorLyogUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSBrZW5yZWwgc2hvdWxkIGJlIGxvYWRlZC4gKi8KKyNkZWZpbmUgTE9BRF9QSFlTSUNBTF9BRERSICgoMHgxMDAwMDAgKyBDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSBcCisJCQkJJiB+KENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKQorCisjZW5kaWYgLyogX0xJTlVYX0JPT1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9idWcuaCBiL2luY2x1ZGUvYXNtLWkzODYvYnVnLmgKaW5kZXggODA2MmNkYi4uYjBmZDc4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2J1Zy5oCkBAIC00LDIwICs0LDMyIEBACiAKIC8qCiAgKiBUZWxsIHRoZSB1c2VyIHRoZXJlIGlzIHNvbWUgcHJvYmxlbS4KLSAqIFRoZSBvZmZlbmRpbmcgZmlsZSBhbmQgbGluZSBhcmUgZW5jb2RlZCBhZnRlciB0aGUgIm9mZmljaWFsbHkKLSAqIHVuZGVmaW5lZCIgb3Bjb2RlIGZvciBwYXJzaW5nIGluIHRoZSB0cmFwIGhhbmRsZXIuCisgKiBUaGUgb2ZmZW5kaW5nIGZpbGUgYW5kIGxpbmUgYXJlIGVuY29kZWQgZW5jb2RlZCBpbiB0aGUgX19idWdfdGFibGUgc2VjdGlvbi4KICAqLwogCiAjaWZkZWYgQ09ORklHX0JVRwogI2RlZmluZSBIQVZFX0FSQ0hfQlVHCisKICNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQotI2RlZmluZSBCVUcoKQkJCQlcCi0gX19hc21fXyBfX3ZvbGF0aWxlX18oCSJ1ZDJcbiIJCVwKLQkJCSJcdC53b3JkICVjMFxuIglcCi0JCQkiXHQubG9uZyAlYzFcbiIJXAotCQkJIDogOiAiaSIgKF9fTElORV9fKSwgImkiIChfX0ZJTEVfXykpCisjZGVmaW5lIEJVRygpCQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlhc20gdm9sYXRpbGUoIjE6XHR1ZDJcbiIJCQkJXAorCQkJICAgICAiLnB1c2hzZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQlcCisJCQkgICAgICIyOlx0LmxvbmcgMWIsICVjMFxuIgkJCVwKKwkJCSAgICAgIlx0LndvcmQgJWMxLCAwXG4iCQkJCVwKKwkJCSAgICAgIlx0Lm9yZyAyYislYzJcbiIJCQkJXAorCQkJICAgICAiLnBvcHNlY3Rpb24iCQkJCVwKKwkJCSAgICAgOiA6ICJpIiAoX19GSUxFX18pLCAiaSIgKF9fTElORV9fKSwJXAorCQkJICAgICAiaSIgKHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KSkpOwkJXAorCQlmb3IoOzspIDsJCQkJCQlcCisJfSB3aGlsZSgwKQorCiAjZWxzZQotI2RlZmluZSBCVUcoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygidWQyXG4iKQorI2RlZmluZSBCVUcoKQkJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJYXNtIHZvbGF0aWxlKCJ1ZDIiKTsJCQkJCVwKKwkJZm9yKDs7KSA7CQkJCQkJXAorCX0gd2hpbGUoMCkKICNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYnVncy5oIGIvaW5jbHVkZS9hc20taTM4Ni9idWdzLmgKaW5kZXggNTkyZmZlZS4uMzhmMWFlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9idWdzLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9idWdzLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAKIHN0YXRpYyBpbnQgX19pbml0IG5vX2hhbHQoY2hhciAqcykKIHsKQEAgLTkxLDYgKzkyLDkgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2hsdCh2b2lkKQogeworCWlmIChwYXJhdmlydF9lbmFibGVkKCkpCisJCXJldHVybjsKKwogCXByaW50ayhLRVJOX0lORk8gIkNoZWNraW5nICdobHQnIGluc3RydWN0aW9uLi4uICIpOwogCWlmICghYm9vdF9jcHVfZGF0YS5obHRfd29ya3Nfb2spIHsKIAkJcHJpbnRrKCJkaXNhYmxlZFxuIik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLWkzODYvY2FjaGVmbHVzaC5oCmluZGV4IDcxOTlmN2IuLjc0ZTAzYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvY2FjaGVmbHVzaC5oCkBAIC03LDYgKzcsNyBAQAogLyogQ2FjaGVzIGFyZW4ndCBicmFpbi1kZWFkIG9uIHRoZSBpbnRlbC4gKi8KICNkZWZpbmUgZmx1c2hfY2FjaGVfYWxsKCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIHBmbikJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKQkJCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLWkzODYvY2hlY2tzdW0uaAppbmRleCA2N2QzNjMwLi43NTE5NGFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9jaGVja3N1bS5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWFzbWxpbmthZ2UgdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKQEAgLTI3LDggKzI3LDggQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkJCSAgaW50IGxlbiwgaW50IHN1bSwgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkJICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKnNyY19lcnJfcHRyLCBpbnQgKmRzdF9lcnJfcHRyKTsKIAogLyoKICAqCU5vdGU6IHdoZW4geW91IGdldCBhIE5VTEwgcG9pbnRlciBleGNlcHRpb24gaGVyZSB0aGlzIG1lYW5zIHNvbWVvbmUKQEAgLTM4LDE4ICszOCwxOCBAQAogICoJYWNjZXNzX29rKCkuCiAgKi8KIHN0YXRpYyBfX2lubGluZV9fCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCWludCBsZW4sIGludCBzdW0pCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayAoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMgKCBzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIE5VTEwpOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCQlpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKIAltaWdodF9zbGVlcCgpOwotCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKChfX2ZvcmNlIHVuc2lnbmVkIGNoYXIgKilzcmMsIGRzdCwKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSB2b2lkICopc3JjLCBkc3QsCiAJCQkJCWxlbiwgc3VtLCBlcnJfcHRyLCBOVUxMKTsKIH0KIApAQCAtNjAsOCArNjAsNyBAQAogICoJQnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkIGZvciBsaW51eCBieQogICoJQXJudCBHdWxicmFuZHNlbi4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqIGlwaCwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bTsKIApAQCAtODksMjkgKzg4LDI5IEBACiAJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpCiAJOiAiMSIgKGlwaCksICIyIiAoaWhsKQogCTogIm1lbW9yeSIpOwotCXJldHVybihzdW0pOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkJImFkZGwgJTEsICUwCQk7XG4iCiAJCSJhZGNsICQweGZmZmYsICUwCTtcbiIKIAkJOiAiPXIiIChzdW0pCi0JCTogInIiIChzdW0gPDwgMTYpLCAiMCIgKHN1bSAmIDB4ZmZmZjAwMDApCisJCTogInIiICgoX19mb3JjZSB1MzIpc3VtIDw8IDE2KSwKKwkJICAiMCIgKChfX2ZvcmNlIHUzMilzdW0gJiAweGZmZmYwMDAwKQogCSk7Ci0JcmV0dXJuICh+c3VtKSA+PiAxNjsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofihfX2ZvcmNlIHUzMilzdW0gPj4gMTYpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkgICBfX3dzdW0gc3VtKQogewogICAgIF9fYXNtX18oCiAJImFkZGwgJTEsICUwCTtcbiIKQEAgLTExOSw3ICsxMTgsNyBAQAogCSJhZGNsICUzLCAlMAk7XG4iCiAJImFkY2wgJDAsICUwCTtcbiIKIAk6ICI9ciIgKHN1bSkKLQk6ICJnIiAoZGFkZHIpLCAiZyIoc2FkZHIpLCAiZyIoKG50b2hzKGxlbik8PDE2KStwcm90byoyNTYpLCAiMCIoc3VtKSk7CisJOiAiZyIgKGRhZGRyKSwgImciKHNhZGRyKSwgImciKChsZW4gKyBwcm90bykgPDwgOCksICIwIihzdW0pKTsKICAgICByZXR1cm4gc3VtOwogfQogCkBAIC0xMjcsMTEgKzEyNiwxMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xNDEsMTcgKzEzOSwxNiBAQAogICogaW4gaWNtcC5jCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAgICAgcmV0dXJuIGNzdW1fZm9sZCAoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgICAgIF9fdTMyIGxlbiwKLQkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJCSAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJICBfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJCSJhZGRsIDAoJTEpLCAlMAkJO1xuIgpAQCAtMTc2LDE5ICsxNzMsMTkgQEAKICAqCUNvcHkgYW5kIGNoZWNrc3VtIHRvIHVzZXIKICAqLwogI2RlZmluZSBIQVZFX0NTVU1fQ09QWV9VU0VSCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJCSAgICAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmRzdCwKLQkJCQkJCSAgICAgaW50IGxlbiwgaW50IHN1bSwgCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywKKwkJCQkJCSAgICAgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCQkJCSAgICAgaW50IGxlbiwgX193c3VtIHN1bSwKIAkJCQkJCSAgICAgaW50ICplcnJfcHRyKQogewogCW1pZ2h0X3NsZWVwKCk7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkKLQkJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCAoX19mb3JjZSB1bnNpZ25lZCBjaGFyICopZHN0LCBsZW4sIHN1bSwgTlVMTCwgZXJyX3B0cik7CisJCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgKF9fZm9yY2Ugdm9pZCAqKWRzdCwgbGVuLCBzdW0sIE5VTEwsIGVycl9wdHIpOwogCiAJaWYgKGxlbikKIAkJKmVycl9wdHIgPSAtRUZBVUxUOwogCi0JcmV0dXJuIC0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvY3B1LmggYi9pbmNsdWRlL2FzbS1pMzg2L2NwdS5oCmluZGV4IGIxYmM3YjEuLjlkOTE0ZTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2NwdS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvY3B1LmgKQEAgLTEzLDYgKzEzLDkgQEAKIGV4dGVybiBpbnQgYXJjaF9yZWdpc3Rlcl9jcHUoaW50IG51bSk7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBleHRlcm4gdm9pZCBhcmNoX3VucmVnaXN0ZXJfY3B1KGludCk7CitleHRlcm4gaW50IGVuYWJsZV9jcHVfaG90cGx1ZzsKKyNlbHNlCisjZGVmaW5lIGVuYWJsZV9jcHVfaG90cGx1ZwkwCiAjZW5kaWYKIAogREVDTEFSRV9QRVJfQ1BVKGludCwgY3B1X3N0YXRlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvY3B1ZmVhdHVyZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9jcHVmZWF0dXJlLmgKaW5kZXggZDMxNGViYi4uM2Y5MmI5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9jcHVmZWF0dXJlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9jcHVmZWF0dXJlLmgKQEAgLTMxLDcgKzMxLDcgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfUFNFMzYJKDAqMzIrMTcpIC8qIDM2LWJpdCBQU0VzICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BOCQkoMCozMisxOCkgLyogUHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0xGTFNICSgwKjMyKzE5KSAvKiBTdXBwb3J0cyB0aGUgQ0xGTFVTSCBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9EVEVTCSgwKjMyKzIxKSAvKiBEZWJ1ZyBUcmFjZSBTdG9yZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9EUwkJKDAqMzIrMjEpIC8qIERlYnVnIFN0b3JlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDUEkJKDAqMzIrMjIpIC8qIEFDUEkgdmlhIE1TUiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9NTVgJCSgwKjMyKzIzKSAvKiBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfRlhTUgkoMCozMisyNCkgLyogRlhTQVZFIGFuZCBGWFJTVE9SIGluc3RydWN0aW9ucyAoZmFzdCBzYXZlIGFuZCByZXN0b3JlICovCkBAIC03Myw2ICs3Myw4IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1VQCQkoMyozMisgOSkgLyogc21wIGtlcm5lbCBydW5uaW5nIG9uIHVwICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZYU0FWRV9MRUFLICgzKjMyKzEwKSAvKiBGWFNBVkUgbGVha3MgRk9QL0ZJUC9GT1AgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OICgzKjMyKzExKSAvKiBJbnRlbCBBcmNoaXRlY3R1cmFsIFBlcmZNb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEVCUwkoMyozMisxMikgIC8qIFByZWNpc2UtRXZlbnQgQmFzZWQgU2FtcGxpbmcgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQlRTCQkoMyozMisxMykgIC8qIEJyYW5jaCBUcmFjZSBTdG9yZSAqLwogCiAvKiBJbnRlbC1kZWZpbmVkIENQVSBmZWF0dXJlcywgQ1BVSUQgbGV2ZWwgMHgwMDAwMDAwMSAoZWN4KSwgd29yZCA0ICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTMJKDQqMzIrIDApIC8qIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMtMyAqLwpAQCAtMTM0LDYgKzEzNiwxMCBAQAogI2RlZmluZSBjcHVfaGFzX3BoZV9lbmFibGVkCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QSEVfRU4pCiAjZGVmaW5lIGNwdV9oYXNfcG1tCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfUE1NKQogI2RlZmluZSBjcHVfaGFzX3BtbV9lbmFibGVkCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QTU1fRU4pCisjZGVmaW5lIGNwdV9oYXNfZHMJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9EUykKKyNkZWZpbmUgY3B1X2hhc19wZWJzIAkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1BFQlMpCisjZGVmaW5lIGNwdV9oYXNfY2xmbHVzaAkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxTSCkKKyNkZWZpbmUgY3B1X2hhc19idHMgCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQlRTKQogCiAjZW5kaWYgLyogX19BU01fSTM4Nl9DUFVGRUFUVVJFX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9jdXJyZW50LmggYi9pbmNsdWRlL2FzbS1pMzg2L2N1cnJlbnQuaAppbmRleCAzY2JiZWNkLi41MjUyZWUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2N1cnJlbnQuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2N1cnJlbnQuaApAQCAtMSwxMyArMSwxNCBAQAogI2lmbmRlZiBfSTM4Nl9DVVJSRU5UX0gKICNkZWZpbmUgX0kzODZfQ1VSUkVOVF9ICiAKLSNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICogZ2V0X2N1cnJlbnQodm9pZCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpnZXRfY3VycmVudCh2b2lkKQogewotCXJldHVybiBjdXJyZW50X3RocmVhZF9pbmZvKCktPnRhc2s7CisJcmV0dXJuIHJlYWRfcGRhKHBjdXJyZW50KTsKIH0KICAKICNkZWZpbmUgY3VycmVudCBnZXRfY3VycmVudCgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2RlbGF5LmggYi9pbmNsdWRlL2FzbS1pMzg2L2RlbGF5LmgKaW5kZXggYjFjNzY1MC4uMzJkNjY3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9kZWxheS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZGVsYXkuaApAQCAtNyw2ICs3LDcgQEAKICAqIERlbGF5IHJvdXRpbmVzIGNhbGxpbmcgZnVuY3Rpb25zIGluIGFyY2gvaTM4Ni9saWIvZGVsYXkuYwogICovCiAgCisvKiBVbmRlZmluZWQgZnVuY3Rpb25zIHRvIGdldCBjb21waWxlLXRpbWUgZXJyb3JzICovCiBleHRlcm4gdm9pZCBfX2JhZF91ZGVsYXkodm9pZCk7CiBleHRlcm4gdm9pZCBfX2JhZF9uZGVsYXkodm9pZCk7CiAKQEAgLTE1LDEzICsxNiwyMyBAQAogZXh0ZXJuIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CiBleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOwogCisjaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlQpICYmICFkZWZpbmVkKFVTRV9SRUFMX1RJTUVfREVMQVkpCisjZGVmaW5lIHVkZWxheShuKSBwYXJhdmlydF9vcHMuY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjN3VsKQorCisjZGVmaW5lIG5kZWxheShuKSBwYXJhdmlydF9vcHMuY29uc3RfdWRlbGF5KChuKSAqIDV1bCkKKworI2Vsc2UgLyogIVBBUkFWSVJUIHx8IFVTRV9SRUFMX1RJTUVfREVMQVkgKi8KKworLyogMHgxMGM3IGlzIDIqKjMyIC8gMTAwMDAwMCAocm91bmRlZCB1cCkgKi8KICNkZWZpbmUgdWRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKIAkoKG4pID4gMjAwMDAgPyBfX2JhZF91ZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjN3VsKSkgOiBcCiAJX191ZGVsYXkobikpCi0JCisKKy8qIDB4NSBpcyAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCiAjZGVmaW5lIG5kZWxheShuKSAoX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCiAJKChuKSA+IDIwMDAwID8gX19iYWRfbmRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpKSA6IFwKIAlfX25kZWxheShuKSkKKyNlbmRpZgogCiB2b2lkIHVzZV90c2NfZGVsYXkodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZGVzYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKaW5kZXggNTg3NGVmMS4uZjM5OGNjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKQEAgLTQsOCArNCw2IEBACiAjaW5jbHVkZSA8YXNtL2xkdC5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAKLSNkZWZpbmUgQ1BVXzE2QklUX1NUQUNLX1NJWkUgMTAyNAotCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgpAQCAtMTYsOCArMTQsNiBAQAogCiBleHRlcm4gc3RydWN0IGRlc2Nfc3RydWN0IGNwdV9nZHRfdGFibGVbR0RUX0VOVFJJRVNdOwogCi1ERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgY2hhciwgY3B1XzE2Yml0X3N0YWNrW0NQVV8xNkJJVF9TVEFDS19TSVpFXSk7Ci0KIHN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgewogCXVuc2lnbmVkIHNob3J0IHNpemU7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpAQCAtMzMsMTEgKzI5LDYgQEAKIAlyZXR1cm4gKHN0cnVjdCBkZXNjX3N0cnVjdCAqKXBlcl9jcHUoY3B1X2dkdF9kZXNjciwgY3B1KS5hZGRyZXNzOwogfQogCi0vKgotICogVGhpcyBpcyB0aGUgbGR0IHRoYXQgZXZlcnkgcHJvY2VzcyB3aWxsIGdldCB1bmxlc3Mgd2UgbmVlZAotICogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhpcy4KLSAqLwotZXh0ZXJuIHN0cnVjdCBkZXNjX3N0cnVjdCBkZWZhdWx0X2xkdFtdOwogZXh0ZXJuIHN0cnVjdCBkZXNjX3N0cnVjdCBpZHRfdGFibGVbXTsKIGV4dGVybiB2b2lkIHNldF9pbnRyX2dhdGUodW5zaWduZWQgaW50IGlycSwgdm9pZCAqIGFkZHIpOwogCkBAIC02NCw4ICs1NSwxMCBAQAogI2RlZmluZSBERVNDVFlQRV9EUEwzCTB4NjAJLyogRFBMLTMgKi8KICNkZWZpbmUgREVTQ1RZUEVfUwkweDEwCS8qICFzeXN0ZW0gKi8KIAorI2lmZGVmIENPTkZJR19QQVJBVklSVAorI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgorI2Vsc2UKICNkZWZpbmUgbG9hZF9UUl9kZXNjKCkgX19hc21fXyBfX3ZvbGF0aWxlX18oImx0ciAldzAiOjoicSIgKEdEVF9FTlRSWV9UU1MqOCkpCi0jZGVmaW5lIGxvYWRfTERUX2Rlc2MoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGxkdCAldzAiOjoicSIgKEdEVF9FTlRSWV9MRFQqOCkpCiAKICNkZWZpbmUgbG9hZF9nZHQoZHRyKSBfX2FzbV9fIF9fdm9sYXRpbGUoImxnZHQgJTAiOjoibSIgKCpkdHIpKQogI2RlZmluZSBsb2FkX2lkdChkdHIpIF9fYXNtX18gX192b2xhdGlsZSgibGlkdCAlMCI6OiJtIiAoKmR0cikpCkBAIC04OCw2ICs4MSwxMCBAQAogI3VuZGVmIEMKIH0KIAorI2RlZmluZSB3cml0ZV9sZHRfZW50cnkoZHQsIGVudHJ5LCBhLCBiKSB3cml0ZV9kdF9lbnRyeShkdCwgZW50cnksIGEsIGIpCisjZGVmaW5lIHdyaXRlX2dkdF9lbnRyeShkdCwgZW50cnksIGEsIGIpIHdyaXRlX2R0X2VudHJ5KGR0LCBlbnRyeSwgYSwgYikKKyNkZWZpbmUgd3JpdGVfaWR0X2VudHJ5KGR0LCBlbnRyeSwgYSwgYikgd3JpdGVfZHRfZW50cnkoZHQsIGVudHJ5LCBhLCBiKQorCiBzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZHRfZW50cnkodm9pZCAqZHQsIGludCBlbnRyeSwgX191MzIgZW50cnlfYSwgX191MzIgZW50cnlfYikKIHsKIAlfX3UzMiAqbHAgPSAoX191MzIgKikoKGNoYXIgKilkdCArIGVudHJ5KjgpOwpAQCAtOTUsOSArOTIsMjUgQEAKIAkqKGxwKzEpID0gZW50cnlfYjsKIH0KIAotI2RlZmluZSB3cml0ZV9sZHRfZW50cnkoZHQsIGVudHJ5LCBhLCBiKSB3cml0ZV9kdF9lbnRyeShkdCwgZW50cnksIGEsIGIpCi0jZGVmaW5lIHdyaXRlX2dkdF9lbnRyeShkdCwgZW50cnksIGEsIGIpIHdyaXRlX2R0X2VudHJ5KGR0LCBlbnRyeSwgYSwgYikKLSNkZWZpbmUgd3JpdGVfaWR0X2VudHJ5KGR0LCBlbnRyeSwgYSwgYikgd3JpdGVfZHRfZW50cnkoZHQsIGVudHJ5LCBhLCBiKQorI2RlZmluZSBzZXRfbGR0IG5hdGl2ZV9zZXRfbGR0CisjZW5kaWYgLyogQ09ORklHX1BBUkFWSVJUICovCisKK3N0YXRpYyBpbmxpbmUgZmFzdGNhbGwgdm9pZCBuYXRpdmVfc2V0X2xkdChjb25zdCB2b2lkICphZGRyLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgZW50cmllcykKK3sKKwlpZiAobGlrZWx5KGVudHJpZXMgPT0gMCkpCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJsbGR0ICV3MCI6OiJxIiAoMCkpOworCWVsc2UgeworCQl1bnNpZ25lZCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCV9fdTMyIGEsIGI7CisKKwkJcGFja19kZXNjcmlwdG9yKCZhLCAmYiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJCQllbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCkgLSAxLAorCQkJCURFU0NUWVBFX0xEVCwgMCk7CisJCXdyaXRlX2dkdF9lbnRyeShnZXRfY3B1X2dkdF90YWJsZShjcHUpLCBHRFRfRU5UUllfTERULCBhLCBiKTsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oImxsZHQgJXcwIjo6InEiIChHRFRfRU5UUllfTERUKjgpKTsKKwl9Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfc2V0X2dhdGUoaW50IGdhdGUsIHVuc2lnbmVkIGludCB0eXBlLCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBzZWcpCiB7CkBAIC0xMTUsMTQgKzEyOCw2IEBACiAJd3JpdGVfZ2R0X2VudHJ5KGdldF9jcHVfZ2R0X3RhYmxlKGNwdSksIGVudHJ5LCBhLCBiKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9sZHRfZGVzYyh1bnNpZ25lZCBpbnQgY3B1LCB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgZW50cmllcykKLXsKLQlfX3UzMiBhLCBiOwotCXBhY2tfZGVzY3JpcHRvcigmYSwgJmIsICh1bnNpZ25lZCBsb25nKWFkZHIsCi0JCQllbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCkgLSAxLAotCQkJREVTQ1RZUEVfTERULCAwKTsKLQl3cml0ZV9nZHRfZW50cnkoZ2V0X2NwdV9nZHRfdGFibGUoY3B1KSwgR0RUX0VOVFJZX0xEVCwgYSwgYik7Ci19CiAKICNkZWZpbmUgc2V0X3Rzc19kZXNjKGNwdSxhZGRyKSBfX3NldF90c3NfZGVzYyhjcHUsIEdEVF9FTlRSWV9UU1MsIGFkZHIpCiAKQEAgLTE1MywzNSArMTU4LDIyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9MRFQodm9pZCkKIHsKLQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCi0Jc2V0X2xkdF9kZXNjKGNwdSwgJmRlZmF1bHRfbGR0WzBdLCA1KTsKLQlsb2FkX0xEVF9kZXNjKCk7Ci0JcHV0X2NwdSgpOworCXNldF9sZHQoTlVMTCwgMCk7CiB9CiAKIC8qCiAgKiBsb2FkIG9uZSBwYXJ0aWN1bGFyIExEVCBpbnRvIHRoZSBjdXJyZW50IENQVQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9MRFRfbm9sb2NrKG1tX2NvbnRleHRfdCAqcGMsIGludCBjcHUpCitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9MRFRfbm9sb2NrKG1tX2NvbnRleHRfdCAqcGMpCiB7Ci0Jdm9pZCAqc2VnbWVudHMgPSBwYy0+bGR0OwotCWludCBjb3VudCA9IHBjLT5zaXplOwotCi0JaWYgKGxpa2VseSghY291bnQpKSB7Ci0JCXNlZ21lbnRzID0gJmRlZmF1bHRfbGR0WzBdOwotCQljb3VudCA9IDU7Ci0JfQotCQkKLQlzZXRfbGR0X2Rlc2MoY3B1LCBzZWdtZW50cywgY291bnQpOwotCWxvYWRfTERUX2Rlc2MoKTsKKwlzZXRfbGR0KHBjLT5sZHQsIHBjLT5zaXplKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGxvYWRfTERUKG1tX2NvbnRleHRfdCAqcGMpCiB7Ci0JaW50IGNwdSA9IGdldF9jcHUoKTsKLQlsb2FkX0xEVF9ub2xvY2socGMsIGNwdSk7Ci0JcHV0X2NwdSgpOworCXByZWVtcHRfZGlzYWJsZSgpOworCWxvYWRfTERUX25vbG9jayhwYyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9kZXNjX2Jhc2UodW5zaWduZWQgbG9uZyAqZGVzYykKQEAgLTE5Myw2ICsxODUsMjkgQEAKIAlyZXR1cm4gYmFzZTsKIH0KIAorI2Vsc2UgLyogX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBHRVRfREVTQ19CQVNFIHJlYWRzIHRoZSBkZXNjcmlwdG9yIGJhc2Ugb2YgdGhlIHNwZWNpZmllZCBzZWdtZW50LgorICoKKyAqIEFyZ3M6CisgKiAgICBpZHggLSBkZXNjcmlwdG9yIGluZGV4CisgKiAgICBnZHQgLSBHRFQgcG9pbnRlcgorICogICAgYmFzZSAtIDMyYml0IHJlZ2lzdGVyIHRvIHdoaWNoIHRoZSBiYXNlIHdpbGwgYmUgd3JpdHRlbgorICogICAgbG9fdyAtIGxvIHdvcmQgb2YgdGhlICJiYXNlIiByZWdpc3RlcgorICogICAgbG9fYiAtIGxvIGJ5dGUgb2YgdGhlICJiYXNlIiByZWdpc3RlcgorICogICAgaGlfYiAtIGhpIGJ5dGUgb2YgdGhlIGxvdyB3b3JkIG9mIHRoZSAiYmFzZSIgcmVnaXN0ZXIKKyAqCisgKiBFeGFtcGxlOgorICogICAgR0VUX0RFU0NfQkFTRShHRFRfRU5UUllfRVNQRklYX1NTLCAlZWJ4LCAlZWF4LCAlYXgsICVhbCwgJWFoKQorICogICAgV2lsbCByZWFkIHRoZSBiYXNlIGFkZHJlc3Mgb2YgR0RUX0VOVFJZX0VTUEZJWF9TUyBhbmQgcHV0IGl0IGludG8gJWVheC4KKyAqLworI2RlZmluZSBHRVRfREVTQ19CQVNFKGlkeCwgZ2R0LCBiYXNlLCBsb193LCBsb19iLCBoaV9iKSBcCisJbW92YiBpZHgqOCs0KGdkdCksIGxvX2I7IFwKKwltb3ZiIGlkeCo4KzcoZ2R0KSwgaGlfYjsgXAorCXNobGwgJDE2LCBiYXNlOyBcCisJbW92dyBpZHgqOCsyKGdkdCksIGxvX3c7CisKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLWkzODYvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5NjA0YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZGV2aWNlLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaWZuZGVmIF9BU01fSTM4Nl9ERVZJQ0VfSAorI2RlZmluZSBfQVNNX0kzODZfREVWSUNFX0gKKworc3RydWN0IGRldl9hcmNoZGF0YSB7CisjaWZkZWYgQ09ORklHX0FDUEkKKwl2b2lkCSphY3BpX2hhbmRsZTsKKyNlbmRpZgorfTsKKworI2VuZGlmIC8qIF9BU01fSTM4Nl9ERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20taTM4Ni9kbWEtbWFwcGluZy5oCmluZGV4IDgxOTk5YTMuLjE4M2VlYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2RtYS1tYXBwaW5nLmgKQEAgLTE1NiwxMCArMTU2LDEwIEBACiAJcmV0dXJuICgxIDw8IElOVEVSTk9ERV9DQUNIRV9TSElGVCk7CiB9CiAKLSNkZWZpbmUgZG1hX2lzX2NvbnNpc3RlbnQoZCkJKDEpCisjZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQsIGgpCSgxKQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLWRtYV9jYWNoZV9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKK2RtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJZmx1c2hfd3JpdGVfYnVmZmVycygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9lODIwLmggYi9pbmNsdWRlL2FzbS1pMzg2L2U4MjAuaAppbmRleCBmNzUxNGZiLi4zOTUwNzdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2U4MjAuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2U4MjAuaApAQCAtMzgsNiArMzgsMTEgQEAKIAogZXh0ZXJuIGludCBlODIwX2FsbF9tYXBwZWQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCiAJCQkgICB1bnNpZ25lZCB0eXBlKTsKK2V4dGVybiB2b2lkIGZpbmRfbWF4X3Bmbih2b2lkKTsKK2V4dGVybiB2b2lkIHJlZ2lzdGVyX2Jvb3RtZW1fbG93X3BhZ2VzKHVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm4pOworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfbWVtb3J5KHZvaWQpOworZXh0ZXJuIHZvaWQgbGltaXRfcmVnaW9ucyh1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSk7CitleHRlcm4gdm9pZCBwcmludF9tZW1vcnlfbWFwKGNoYXIgKndobyk7CiAKICNlbmRpZi8qIV9fQVNTRU1CTFlfXyovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZWxmLmggYi9pbmNsdWRlL2FzbS1pMzg2L2VsZi5oCmluZGV4IDNhMDU0MzYuLjQ1ZDIxYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9lbGYuaApAQCAtOTEsNyArOTEsNyBAQAogCXByX3JlZ1s3XSA9IHJlZ3MtPnhkczsJCQkJXAogCXByX3JlZ1s4XSA9IHJlZ3MtPnhlczsJCQkJXAogCXNhdmVzZWdtZW50KGZzLHByX3JlZ1s5XSk7CQkJXAotCXNhdmVzZWdtZW50KGdzLHByX3JlZ1sxMF0pOwkJCVwKKwlwcl9yZWdbMTBdID0gcmVncy0+eGdzOwkJCQlcCiAJcHJfcmVnWzExXSA9IHJlZ3MtPm9yaWdfZWF4OwkJCVwKIAlwcl9yZWdbMTJdID0gcmVncy0+ZWlwOwkJCQlcCiAJcHJfcmVnWzEzXSA9IHJlZ3MtPnhjczsJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9mdXRleC5oIGIvaW5jbHVkZS9hc20taTM4Ni9mdXRleC5oCmluZGV4IDk0NmQ5N2MuLjQzOGVmMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2Z1dGV4LmgKQEAgLTU2LDcgKzU2LDcgQEAKIAlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpbmNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAKIAlpZiAob3AgPT0gRlVURVhfT1BfU0VUKQogCQlfX2Z1dGV4X2F0b21pY19vcDEoInhjaGdsICUwLCAlMiIsIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpOwpAQCAtODgsNyArODgsNyBAQAogCQl9CiAJfQogCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlpZiAoIXJldCkgewogCQlzd2l0Y2ggKGNtcCkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9nZW5hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2dlbmFwaWMuaAppbmRleCA4ZmZiYjBmLi5mZDJiZTU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2dlbmFwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2dlbmFwaWMuaApAQCAtMTIyLDYgKzEyMiw2IEBACiAJQVBJQ0ZVTkMocGh5c19wa2dfaWQpIFwKIAl9CiAKLWV4dGVybiBzdHJ1Y3QgZ2VuYXBpYyAqZ2VuYXBpYzsKK2V4dGVybiBzdHJ1Y3QgZ2VuYXBpYyAqZ2VuYXBpYywgYXBpY19kZWZhdWx0OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaTM4Ny5oIGIvaW5jbHVkZS9hc20taTM4Ni9pMzg3LmgKaW5kZXggYmMxZDZlZC4uNDM0OTM2YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaTM4Ny5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaTM4Ny5oCkBAIC03Niw3ICs3Niw5IEBACiAKICNkZWZpbmUgX191bmxhenlfZnB1KCB0c2sgKSBkbyB7IFwKIAlpZiAodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19VU0VERlBVKSBcCi0JCXNhdmVfaW5pdF9mcHUoIHRzayApOyBcCisJCXNhdmVfaW5pdF9mcHUoIHRzayApOyAJCQlcCisJZWxzZQkJCQkJCVwKKwkJdHNrLT5mcHVfY291bnRlciA9IDA7CQkJXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBfX2NsZWFyX2ZwdSggdHNrICkJCQkJCVwKQEAgLTExOCw2ICsxMjAsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGdldF9mcHVfY3dkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApOwogZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGdldF9mcHVfc3dkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApOwogZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGdldF9mcHVfbXhjc3IoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIG1hdGhfc3RhdGVfcmVzdG9yZSh2b2lkKTsKIAogLyoKICAqIFNpZ25hbCBmcmFtZSBoYW5kbGVycy4uLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaCBiL2luY2x1ZGUvYXNtLWkzODYvaWRlLmgKaW5kZXggNzM0NjVkMi4uMGZjMjQwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pZGUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oCkBAIC00MCwxMyArNDAsMTQgQEAKIAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBpZGVfZGVmYXVsdF9pb19iYXNlKGludCBpbmRleCkKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAkvKgogCSAqCUlmIFBDSSBpcyBwcmVzZW50IHRoZW4gaXQgaXMgbm90IHNhZmUgdG8gcG9rZSBhcm91bmQKIAkgKgl0aGUgb3RoZXIgbGVnYWN5IElERSBwb3J0cy4gT25seSAweDFmMCBhbmQgMHgxNzAgYXJlCiAJICoJZGVmaW5lZCBjb21wYXRpYmlsaXR5IG1vZGUgcG9ydHMgZm9yIFBDSS4gQSB1c2VyIGNhbiAKIAkgKglvdmVycmlkZSB0aGlzIHVzaW5nIGlkZT0gYnV0IHdlIG11c3QgZGVmYXVsdCBzYWZlLgogCSAqLwotCWlmIChwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCkgPT0gTlVMTCkgeworCWlmICgocGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIE5VTEwpKSA9PSBOVUxMKSB7CiAJCXN3aXRjaChpbmRleCkgewogCQkJY2FzZSAyOiByZXR1cm4gMHgxZTg7CiAJCQljYXNlIDM6IHJldHVybiAweDE2ODsKQEAgLTU0LDYgKzU1LDcgQEAKIAkJCWNhc2UgNTogcmV0dXJuIDB4MTYwOwogCQl9CiAJfQorCXBjaV9kZXZfcHV0KHBkZXYpOwogCXN3aXRjaCAoaW5kZXgpIHsKIAkJY2FzZSAwOglyZXR1cm4gMHgxZjA7CiAJCWNhc2UgMToJcmV0dXJuIDB4MTcwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pby5oIGIvaW5jbHVkZS9hc20taTM4Ni9pby5oCmluZGV4IDY4ZGYwZGMzLi44NmZmNWU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pby5oCkBAIC0yNTYsMTEgKzI1NiwxMSBAQAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCi0jaWZkZWYgU0xPV19JT19CWV9KVU1QSU5HCi0jZGVmaW5lIF9fU0xPV19ET1dOX0lPICJqbXAgMWY7IDE6IGptcCAxZjsgMToiCisjaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlQpCisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAjZWxzZQorCiAjZGVmaW5lIF9fU0xPV19ET1dOX0lPICJvdXRiICUlYWwsJDB4ODA7IgotI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbG93X2Rvd25faW8odm9pZCkgewogCV9fYXNtX18gX192b2xhdGlsZV9fKApAQCAtMjcxLDYgKzI3MSw4IEBACiAJCTogOiApOwogfQogCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19YODZfTlVNQVEKIGV4dGVybiB2b2lkICp4cXVhZF9wb3J0aW87ICAgIC8qIFdoZXJlIHRoZSBJTyBhcmVhIHdhcyBtYXBwZWQgKi8KICNkZWZpbmUgWFFVQURfUE9SVF9BRERSKHBvcnQsIHF1YWQpICh4cXVhZF9wb3J0aW8gKyAoWFFVQURfUE9SVElPX1FVQUQqcXVhZCkgKyBwb3J0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pb19hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaAppbmRleCAyNzZlYTdlLi4wNTlhOWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaApAQCAtMTIsMTAgKzEyLDYgQEAKIAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCi0jZGVmaW5lIElPX0FQSUNfQkFTRShpZHgpIFwKLQkJKCh2b2xhdGlsZSBpbnQgKikoX19maXhfdG9fdmlydChGSVhfSU9fQVBJQ19CQVNFXzAgKyBpZHgpIFwKLQkJKyAobXBfaW9hcGljc1tpZHhdLm1wY19hcGljYWRkciAmIH5QQUdFX01BU0spKSkKLQogLyoKICAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIElPLUFQSUM6CiAgKi8KQEAgLTExOSwzMSArMTE1LDggQEAKIC8qIG5vbi0wIGlmIGRlZmF1bHQgKHRhYmxlLWxlc3MpIE1QIGNvbmZpZ3VyYXRpb24gKi8KIGV4dGVybiBpbnQgbXBjX2RlZmF1bHRfdHlwZTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW9fYXBpY19yZWFkKHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgcmVnKQotewotCSpJT19BUElDX0JBU0UoYXBpYykgPSByZWc7Ci0JcmV0dXJuICooSU9fQVBJQ19CQVNFKGFwaWMpKzQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY193cml0ZSh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQotewotCSpJT19BUElDX0JBU0UoYXBpYykgPSByZWc7Ci0JKihJT19BUElDX0JBU0UoYXBpYykrNCkgPSB2YWx1ZTsKLX0KLQotLyoKLSAqIFJlLXdyaXRlIGEgdmFsdWU6IHRvIGJlIHVzZWQgZm9yIHJlYWQtbW9kaWZ5LXdyaXRlCi0gKiBjeWNsZXMgd2hlcmUgdGhlIHJlYWQgYWxyZWFkeSBzZXQgdXAgdGhlIGluZGV4IHJlZ2lzdGVyLgotICoKLSAqIE9sZGVyIFNpUyBBUElDIHJlcXVpcmVzIHdlIHJld3JpdGUgdGhlIGluZGV4IHJlZ2lzZXIKLSAqLworLyogT2xkZXIgU2lTIEFQSUMgcmVxdWlyZXMgd2UgcmV3cml0ZSB0aGUgaW5kZXggcmVnaXN0ZXIgKi8KIGV4dGVybiBpbnQgc2lzX2FwaWNfYnVnOwotc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfbW9kaWZ5KHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JaWYgKHNpc19hcGljX2J1ZykKLQkJKklPX0FQSUNfQkFTRShhcGljKSA9IHJlZzsKLQkqKElPX0FQSUNfQkFTRShhcGljKSs0KSA9IHZhbHVlOwotfQogCiAvKiAxIGlmICJub2FwaWMiIGJvb3Qgb3B0aW9uIHBhc3NlZCAqLwogZXh0ZXJuIGludCBza2lwX2lvYXBpY19zZXR1cDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaXJxLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lycS5oCmluZGV4IDMzMTcyNmIuLjExNzYxY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pcnEuaApAQCAtMzcsOCArMzcsMTMgQEAKIGV4dGVybiBpbnQgaXJxYmFsYW5jZV9kaXNhYmxlKGNoYXIgKnN0cik7CiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSh2b2lkKTsKKwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogZXh0ZXJuIHZvaWQgZml4dXBfaXJxcyhjcHVtYXNrX3QgbWFwKTsKICNlbmRpZgogCit2b2lkIGluaXRfSVJRKHZvaWQpOwordm9pZCBfX2luaXQgbmF0aXZlX2luaXRfSVJRKHZvaWQpOworCiAjZW5kaWYgLyogX0FTTV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pcnFfcmVncy5oIGIvaW5jbHVkZS9hc20taTM4Ni9pcnFfcmVncy5oCmluZGV4IDNkZDljMGIuLmExYjNmN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaXJxX3JlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lycV9yZWdzLmgKQEAgLTEgKzEsMjcgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnFfcmVncy5oPgorLyoKKyAqIFBlci1jcHUgY3VycmVudCBmcmFtZSBwb2ludGVyIC0gdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IGV4Y2VwdGlvbiBmcmFtZSBvbgorICogdGhlIHN0YWNrLCBzdG9yZWQgaW4gdGhlIFBEQS4KKyAqCisgKiBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAZ29vcC5vcmc+CisgKi8KKyNpZm5kZWYgX0FTTV9JMzg2X0lSUV9SRUdTX0gKKyNkZWZpbmUgX0FTTV9JMzg2X0lSUV9SRUdTX0gKKworI2luY2x1ZGUgPGFzbS9wZGEuaD4KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHRfcmVncyAqZ2V0X2lycV9yZWdzKHZvaWQpCit7CisJcmV0dXJuIHJlYWRfcGRhKGlycV9yZWdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHRfcmVncyAqc2V0X2lycV9yZWdzKHN0cnVjdCBwdF9yZWdzICpuZXdfcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7CisKKwlvbGRfcmVncyA9IHJlYWRfcGRhKGlycV9yZWdzKTsKKwl3cml0ZV9wZGEoaXJxX3JlZ3MsIG5ld19yZWdzKTsKKworCXJldHVybiBvbGRfcmVnczsKK30KKworI2VuZGlmIC8qIF9BU01fSTM4Nl9JUlFfUkVHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lycWZsYWdzLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lycWZsYWdzLmgKaW5kZXggZTFiZGI5Ny4uMTdiMThjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pcnFmbGFncy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaXJxZmxhZ3MuaApAQCAtMTAsNiArMTAsOSBAQAogI2lmbmRlZiBfQVNNX0lSUUZMQUdTX0gKICNkZWZpbmUgX0FTTV9JUlFGTEFHU19ICiAKKyNpZmRlZiBDT05GSUdfUEFSQVZJUlQKKyNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KKyNlbHNlCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yYXdfbG9jYWxfc2F2ZV9mbGFncyh2b2lkKQpAQCAtMjUsOSArMjgsNiBAQAogCXJldHVybiBmbGFnczsKIH0KIAotI2RlZmluZSByYXdfbG9jYWxfc2F2ZV9mbGFncyhmbGFncykgXAotCQlkbyB7IChmbGFncykgPSBfX3Jhd19sb2NhbF9zYXZlX2ZsYWdzKCk7IH0gd2hpbGUgKDApCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKQEAgLTY2LDE4ICs2Niw2IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImhsdCI6IDogOiJtZW1vcnkiKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlyZXR1cm4gIShmbGFncyAmICgxIDw8IDkpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmF3X2lycXNfZGlzYWJsZWQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gX19yYXdfbG9jYWxfc2F2ZV9mbGFncygpOwotCi0JcmV0dXJuIHJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKTsKLX0KLQogLyoKICAqIEZvciBzcGlubG9ja3MsIGV0YzoKICAqLwpAQCAtOTAsOSArNzgsMzMgQEAKIAlyZXR1cm4gZmxhZ3M7CiB9CiAKKyNlbHNlCisjZGVmaW5lIERJU0FCTEVfSU5URVJSVVBUUyhjbG9iYmVycykJY2xpCisjZGVmaW5lIEVOQUJMRV9JTlRFUlJVUFRTKGNsb2JiZXJzKQlzdGkKKyNkZWZpbmUgRU5BQkxFX0lOVEVSUlVQVFNfU1lTRVhJVAlzdGk7IHN5c2V4aXQKKyNkZWZpbmUgSU5URVJSVVBUX1JFVFVSTgkJaXJldAorI2RlZmluZSBHRVRfQ1IwX0lOVE9fRUFYCQltb3ZsICVjcjAsICVlYXgKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBDT05GSUdfUEFSQVZJUlQgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUgcmF3X2xvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpIFwKKwkJZG8geyAoZmxhZ3MpID0gX19yYXdfbG9jYWxfc2F2ZV9mbGFncygpOyB9IHdoaWxlICgwKQorCiAjZGVmaW5lIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncykgXAogCQlkbyB7IChmbGFncykgPSBfX3Jhd19sb2NhbF9pcnFfc2F2ZSgpOyB9IHdoaWxlICgwKQogCitzdGF0aWMgaW5saW5lIGludCByYXdfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiAhKGZsYWdzICYgKDEgPDwgOSkpOworfQorCitzdGF0aWMgaW5saW5lIGludCByYXdfaXJxc19kaXNhYmxlZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBfX3Jhd19sb2NhbF9zYXZlX2ZsYWdzKCk7CisKKwlyZXR1cm4gcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpOworfQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaC5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaC5oCmluZGV4IGZiNDIwOTllLi42MDVlM2NjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9zZXR1cF9hcmNoLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaC5oCkBAIC0yLDQgKzIsNiBAQAogCiAvKiBubyBhY3Rpb24gZm9yIGdlbmVyaWMgKi8KIAorI2lmbmRlZiBBUkNIX1NFVFVQCiAjZGVmaW5lIEFSQ0hfU0VUVVAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXN1bW1pdC9tYWNoX2FwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1zdW1taXQvbWFjaF9hcGljLmgKaW5kZXggZWYwNjcxZS4uNDNlNWJkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXN1bW1pdC9tYWNoX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtc3VtbWl0L21hY2hfYXBpYy5oCkBAIC04OCw3ICs4OCwxMSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhcGljaWRfdG9fbm9kZShpbnQgbG9naWNhbF9hcGljaWQpCiB7CisjaWZkZWYgQ09ORklHX1NNUAogCXJldHVybiBhcGljaWRfMl9ub2RlW2hhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKIH0KIAogLyogTWFwcGluZyBmcm9tIGNwdSBudW1iZXIgdG8gbG9naWNhbCBhcGljaWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9kb190aW1lci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZpc3dzL2RvX3RpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2Q2OTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZpc3dzL2RvX3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBkZWZpbmVzIGZvciBpbmxpbmUgYXJjaCBzZXR1cCBmdW5jdGlvbnMgKi8KLQotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vaTgyNTkuaD4KLSNpbmNsdWRlICJjb2JhbHQuaCIKLQotc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdF9ob29rKHZvaWQpCi17Ci0JLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLwotCWNvX2NwdV93cml0ZShDT19DUFVfU1RBVCxjb19jcHVfcmVhZChDT19DUFVfU1RBVCkgJiB+Q09fU1RBVF9USU1FSU5UUik7Ci0KLQlkb190aW1lcigxKTsKLSNpZm5kZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZV92bShpcnFfcmVncykpOwotI2VuZGlmCi0vKgotICogSW4gdGhlIFNNUCBjYXNlIHdlIHVzZSB0aGUgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQgdG8gZG8gdGhlCi0gKiBwcm9maWxpbmcsIGV4Y2VwdCB3aGVuIHdlIHNpbXVsYXRlIFNNUCBtb2RlIG9uIGEgdW5pcHJvY2Vzc29yCi0gKiBzeXN0ZW0sIGluIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGNhbGwgdGhlIGxvY2FsIGludGVycnVwdCBoYW5kbGVyLgotICovCi0jaWZuZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKLSNlbHNlCi0JaWYgKCF1c2luZ19hcGljX3RpbWVyKQotCQlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZG9fdGltZXJfb3ZlcmZsb3coaW50IGNvdW50KQotewotCWludCBpOwotCi0Jc3Bpbl9sb2NrKCZpODI1OUFfbG9jayk7Ci0JLyoKLQkgKiBUaGlzIGlzIHRyaWNreSB3aGVuIEkvTyBBUElDcyBhcmUgdXNlZDsKLQkgKiBzZWUgZG9fdGltZXJfaW50ZXJydXB0KCkuCi0JICovCi0JaSA9IGluYigweDIwKTsKLQlzcGluX3VubG9jaygmaTgyNTlBX2xvY2spOwotCQotCS8qIGFzc3VtcHRpb24gYWJvdXQgdGltZXIgYmVpbmcgSVJRMCAqLwotCWlmIChpICYgMHgwMSkgewotCQkvKgotCQkgKiBXZSBjYW5ub3QgZGV0ZWN0IGxvc3QgdGltZXIgaW50ZXJydXB0cyAuLi4gCi0JCSAqIHdlbGwsIHRoYXQncyB3aHkgd2UgY2FsbCB0aGVtIGxvc3QsIGRvbid0IHdlPyA6KQotCQkgKiBbaG1tLCBvbiB0aGUgUGVudGl1bSBhbmQgQWxwaGEgd2UgY2FuIC4uLiBzb3J0IG9mXQotCQkgKi8KLQkJY291bnQgLT0gTEFUQ0g7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKCJkb19zbG93X2dldHRpbWVvZmZzZXQoKTogaGFyZHdhcmUgdGltZXIgcHJvYmxlbT9cbiIpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3MvbWFjaF9hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3MvbWFjaF9hcGljLmgKaW5kZXggZGU0MzhjNzEuLjE4YWZlNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9tYWNoX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3MvbWFjaF9hcGljLmgKQEAgLTUxLDYgKzUxLDExIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGFwaWNpZF90b19ub2RlKGludCBsb2dpY2FsX2FwaWNpZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogLyogTWFwcGluZyBmcm9tIGNwdSBudW1iZXIgdG8gbG9naWNhbCBhcGljaWQgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGNwdV90b19sb2dpY2FsX2FwaWNpZChpbnQgY3B1KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYXRoX2VtdS5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYXRoX2VtdS5oCmluZGV4IDY5NzY3M2IuLmE0YjBhYTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWF0aF9lbXUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hdGhfZW11LmgKQEAgLTIxLDYgKzIxLDcgQEAKIAlsb25nIF9fX2VheDsKIAlsb25nIF9fX2RzOwogCWxvbmcgX19fZXM7CisJbG9uZyBfX19mczsKIAlsb25nIF9fX29yaWdfZWF4OwogCWxvbmcgX19fZWlwOwogCWxvbmcgX19fY3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1pMzg2L21tdV9jb250ZXh0LmgKaW5kZXggNjJiN2JmMS4uNjhmZjEwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbW11X2NvbnRleHQuaApAQCAtNDQsNyArNDQsNyBAQAogCQkgKiBsb2FkIHRoZSBMRFQsIGlmIHRoZSBMRFQgaXMgZGlmZmVyZW50OgogCQkgKi8KIAkJaWYgKHVubGlrZWx5KHByZXYtPmNvbnRleHQubGR0ICE9IG5leHQtPmNvbnRleHQubGR0KSkKLQkJCWxvYWRfTERUX25vbG9jaygmbmV4dC0+Y29udGV4dCwgY3B1KTsKKwkJCWxvYWRfTERUX25vbG9jaygmbmV4dC0+Y29udGV4dCk7CiAJfQogI2lmZGVmIENPTkZJR19TTVAKIAllbHNlIHsKQEAgLTU2LDE0ICs1NiwxNCBAQAogCQkJICogdGxiIGZsdXNoIElQSSBkZWxpdmVyeS4gV2UgbXVzdCByZWxvYWQgJWNyMy4KIAkJCSAqLwogCQkJbG9hZF9jcjMobmV4dC0+cGdkKTsKLQkJCWxvYWRfTERUX25vbG9jaygmbmV4dC0+Y29udGV4dCwgY3B1KTsKKwkJCWxvYWRfTERUX25vbG9jaygmbmV4dC0+Y29udGV4dCk7CiAJCX0KIAl9CiAjZW5kaWYKIH0KIAotI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzaywgbW0pIFwKLQlhc20oIm1vdmwgJTAsJSVmcyA7IG1vdmwgJTAsJSVncyI6IDoiciIgKDApKQorI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzaywgbW0pCQkJXAorCWFzbSgibW92bCAlMCwlJWZzIjogOiJyIiAoMCkpOwogCiAjZGVmaW5lIGFjdGl2YXRlX21tKHByZXYsIG5leHQpIFwKIAlzd2l0Y2hfbW0oKHByZXYpLChuZXh0KSxOVUxMKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tbXpvbmUuaCBiL2luY2x1ZGUvYXNtLWkzODYvbW16b25lLmgKaW5kZXggNjFiMDczMy4uMzUwM2FkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oCkBAIC0xMjAsMTMgKzEyMCwyNiBAQAogCV9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgKHgpLCBQQUdFX1NJWkUsIF9fcGEoTUFYX0RNQV9BRERSRVNTKSkKICNkZWZpbmUgYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoeCkgXAogCV9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgKHgpLCBQQUdFX1NJWkUsIDApCi0jZGVmaW5lIGFsbG9jX2Jvb3RtZW1fbm9kZShpZ25vcmUsIHgpIFwKLQlfX2FsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksICh4KSwgU01QX0NBQ0hFX0JZVEVTLCBfX3BhKE1BWF9ETUFfQUREUkVTUykpCi0jZGVmaW5lIGFsbG9jX2Jvb3RtZW1fcGFnZXNfbm9kZShpZ25vcmUsIHgpIFwKLQlfX2FsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksICh4KSwgUEFHRV9TSVpFLCBfX3BhKE1BWF9ETUFfQUREUkVTUykpCi0jZGVmaW5lIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzX25vZGUoaWdub3JlLCB4KSBcCi0JX19hbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCAoeCksIFBBR0VfU0laRSwgMCkKLQorI2RlZmluZSBhbGxvY19ib290bWVtX25vZGUocGdkYXQsIHgpCQkJCQlcCisoewkJCQkJCQkJCVwKKwlzdHJ1Y3QgcGdsaXN0X2RhdGEgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQkJCVwKKwkJCQkqX19hbGxvY19ib290bWVtX25vZGVfX3BnZGF0ID0gKHBnZGF0KTsJXAorCV9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgKHgpLCBTTVBfQ0FDSEVfQllURVMsCVwKKwkJCQkJCV9fcGEoTUFYX0RNQV9BRERSRVNTKSk7CVwKK30pCisjZGVmaW5lIGFsbG9jX2Jvb3RtZW1fcGFnZXNfbm9kZShwZ2RhdCwgeCkJCQkJXAorKHsJCQkJCQkJCQlcCisJc3RydWN0IHBnbGlzdF9kYXRhICBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkJCQlcCisJCQkJKl9fYWxsb2NfYm9vdG1lbV9ub2RlX19wZ2RhdCA9IChwZ2RhdCk7CVwKKwlfX2FsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksICh4KSwgUEFHRV9TSVpFLAkJXAorCQkJCQkJX19wYShNQVhfRE1BX0FERFJFU1MpKQlcCit9KQorI2RlZmluZSBhbGxvY19ib290bWVtX2xvd19wYWdlc19ub2RlKHBnZGF0LCB4KQkJCQlcCisoewkJCQkJCQkJCVwKKwlzdHJ1Y3QgcGdsaXN0X2RhdGEgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQkJCVwKKwkJCQkqX19hbGxvY19ib290bWVtX25vZGVfX3BnZGF0ID0gKHBnZGF0KTsJXAorCV9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgKHgpLCBQQUdFX1NJWkUsIDApOwkJXAorfSkKICNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLwogCiAjZW5kaWYgLyogX0FTTV9NTVpPTkVfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbW9kdWxlLmggYi9pbmNsdWRlL2FzbS1pMzg2L21vZHVsZS5oCmluZGV4IDQyNDY2MWQuLjAyZjhmNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tb2R1bGUuaApAQCAtMjAsNiArMjAsOCBAQAogI2RlZmluZSBNT0RVTEVfUFJPQ19GQU1JTFkgIjU4NlRTQyAiCiAjZWxpZiBkZWZpbmVkIENPTkZJR19NNTg2TU1YCiAjZGVmaW5lIE1PRFVMRV9QUk9DX0ZBTUlMWSAiNTg2TU1YICIKKyNlbGlmIGRlZmluZWQgQ09ORklHX01DT1JFMgorI2RlZmluZSBNT0RVTEVfUFJPQ19GQU1JTFkgIkNPUkUyICIKICNlbGlmIGRlZmluZWQgQ09ORklHX002ODYKICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICI2ODYgIgogI2VsaWYgZGVmaW5lZCBDT05GSUdfTVBFTlRJVU1JSQpAQCAtNjAsMTggKzYyLDEyIEBACiAjZXJyb3IgdW5rbm93biBwcm9jZXNzb3IgZmFtaWx5CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19SRUdQQVJNCi0jZGVmaW5lIE1PRFVMRV9SRUdQQVJNICJSRUdQQVJNICIKLSNlbHNlCi0jZGVmaW5lIE1PRFVMRV9SRUdQQVJNICIiCi0jZW5kaWYKLQogI2lmZGVmIENPTkZJR180S1NUQUNLUwogI2RlZmluZSBNT0RVTEVfU1RBQ0tTSVpFICI0S1NUQUNLUyAiCiAjZWxzZQogI2RlZmluZSBNT0RVTEVfU1RBQ0tTSVpFICIiCiAjZW5kaWYKIAotI2RlZmluZSBNT0RVTEVfQVJDSF9WRVJNQUdJQyBNT0RVTEVfUFJPQ19GQU1JTFkgTU9EVUxFX1JFR1BBUk0gTU9EVUxFX1NUQUNLU0laRQorI2RlZmluZSBNT0RVTEVfQVJDSF9WRVJNQUdJQyBNT0RVTEVfUFJPQ19GQU1JTFkgTU9EVUxFX1NUQUNLU0laRQogCiAjZW5kaWYgLyogX0FTTV9JMzg2X01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21wc3BlY19kZWYuaCBiL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjX2RlZi5oCmluZGV4IDc2ZmVlZGYuLjEzYmFmYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjX2RlZi5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjX2RlZi5oCkBAIC05Nyw3ICs5Nyw2IEBACiAjZGVmaW5lIEJVU1RZUEVfVEMJIlRDIgogI2RlZmluZSBCVVNUWVBFX1ZNRQkiVk1FIgogI2RlZmluZSBCVVNUWVBFX1hQUkVTUwkiWFBSRVNTIgotI2RlZmluZSBCVVNUWVBFX05FQzk4CSJORUM5OCIKIAogc3RydWN0IG1wY19jb25maWdfaW9hcGljCiB7CkBAIC0xODIsNyArMTgxLDYgQEAKIAlNUF9CVVNfRUlTQSwKIAlNUF9CVVNfUENJLAogCU1QX0JVU19NQ0EsCi0JTVBfQlVTX05FQzk4CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbXNyLmggYi9pbmNsdWRlL2FzbS1pMzg2L21zci5oCmluZGV4IDYyYjc2Y2QuLjYwOWEzODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbXNyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tc3IuaApAQCAtMSw2ICsxLDEwIEBACiAjaWZuZGVmIF9fQVNNX01TUl9ICiAjZGVmaW5lIF9fQVNNX01TUl9ICiAKKyNpZmRlZiBDT05GSUdfUEFSQVZJUlQKKyNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KKyNlbHNlCisKIC8qCiAgKiBBY2Nlc3MgdG8gbWFjaGluZS1zcGVjaWZpYyByZWdpc3RlcnMgKGF2YWlsYWJsZSBvbiA1ODYgYW5kIGJldHRlciBvbmx5KQogICogTm90ZTogdGhlIHJkKiBvcGVyYXRpb25zIG1vZGlmeSB0aGUgcGFyYW1ldGVycyBkaXJlY3RseSAod2l0aG91dCB1c2luZwpAQCAtNzcsNiArODEsNyBAQAogICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicmRwbWMiIFwKIAkJCSAgOiAiPWEiIChsb3cpLCAiPWQiIChoaWdoKSBcCiAJCQkgIDogImMiIChjb3VudGVyKSkKKyNlbmRpZgkvKiAhQ09ORklHX1BBUkFWSVJUICovCiAKIC8qIHN5bWJvbGljIG5hbWVzIGZvciBzb21lIGludGVyZXN0aW5nIE1TUnMgKi8KIC8qIEludGVsIGRlZmluZWQgTVNScy4gKi8KQEAgLTk1LDYgKzEwMCw4IEBACiAKICNkZWZpbmUgTVNSX1A2X1BFUkZDVFIwCQkweGMxCiAjZGVmaW5lIE1TUl9QNl9QRVJGQ1RSMQkJMHhjMgorI2RlZmluZSBNU1JfRlNCX0ZSRVEJCTB4Y2QKKwogCiAjZGVmaW5lIE1TUl9JQTMyX0JCTF9DUl9DVEwJCTB4MTE5CiAKQEAgLTEyNSw2ICsxMzIsOSBAQAogI2RlZmluZSBNU1JfSUEzMl9QRVJGX1NUQVRVUwkJMHgxOTgKICNkZWZpbmUgTVNSX0lBMzJfUEVSRl9DVEwJCTB4MTk5CiAKKyNkZWZpbmUgTVNSX0lBMzJfTVBFUkYJCQkweEU3CisjZGVmaW5lIE1TUl9JQTMyX0FQRVJGCQkJMHhFOAorCiAjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX0NPTlRST0wJCTB4MTlhCiAjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVAkweDE5YgogI2RlZmluZSBNU1JfSUEzMl9USEVSTV9TVEFUVVMJCTB4MTljCkBAIC0xNDEsNiArMTUxLDEwIEBACiAjZGVmaW5lIE1TUl9JQTMyX01DMF9BRERSCQkweDQwMgogI2RlZmluZSBNU1JfSUEzMl9NQzBfTUlTQwkJMHg0MDMKIAorI2RlZmluZSBNU1JfSUEzMl9QRUJTX0VOQUJMRQkJMHgzZjEKKyNkZWZpbmUgTVNSX0lBMzJfRFNfQVJFQQkJMHg2MDAKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9DQVBBQklMSVRJRVMJMHgzNDUKKwogLyogUGVudGl1bSBJViBwZXJmb3JtYW5jZSBjb3VudGVyIE1TUnMgKi8KICNkZWZpbmUgTVNSX1A0X0JQVV9QRVJGQ1RSMCAJCTB4MzAwCiAjZGVmaW5lIE1TUl9QNF9CUFVfUEVSRkNUUjEgCQkweDMwMQpAQCAtMjg0LDQgKzI5OCwxMyBAQAogI2RlZmluZSBNU1JfVE1UQV9MUlRJX1JFQURPVVQJCTB4ODA4NjgwMTgKICNkZWZpbmUgTVNSX1RNVEFfTFJUSV9WT0xUX01IWgkJMHg4MDg2ODAxYQogCisvKiBJbnRlbCBDb3JlLWJhc2VkIENQVSBwZXJmb3JtYW5jZSBjb3VudGVycyAqLworI2RlZmluZSBNU1JfQ09SRV9QRVJGX0ZJWEVEX0NUUjAJMHgzMDkKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIxCTB4MzBhCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMgkweDMwYgorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0ZJWEVEX0NUUl9DVFJMCTB4MzhkCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX1NUQVRVUwkweDM4ZQorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9DVFJMCTB4MzhmCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX09WRl9DVFJMCTB4MzkwCisKICNlbmRpZiAvKiBfX0FTTV9NU1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9ubWkuaCBiL2luY2x1ZGUvYXNtLWkzODYvbm1pLmgKaW5kZXggMjY5ZDMxNS4uYjA0MzMzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9ubWkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L25taS5oCkBAIC01LDYgKzUsOSBAQAogI2RlZmluZSBBU01fTk1JX0gKIAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaWZkZWYgQVJDSF9IQVNfTk1JX1dBVENIRE9HCiAKIC8qKgogICogZG9fbm1pX2NhbGxiYWNrCkBAIC00Miw0ICs0NSw5IEBACiAJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogZXh0ZXJuIGludCB1bmtub3duX25taV9wYW5pYzsKIAordm9pZCBfX3RyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2Uodm9pZCk7CisjZGVmaW5lIHRyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2UoKSBfX3RyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2UoKQorCisjZW5kaWYKKwogI2VuZGlmIC8qIEFTTV9OTUlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAppbmRleCBmNWJmNTQ0Li5mZDNmNjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaApAQCAtNTIsNiArNTIsNyBAQAogI2RlZmluZSBwdGVfdmFsKHgpCSgoeCkucHRlX2xvdyB8ICgodW5zaWduZWQgbG9uZyBsb25nKSh4KS5wdGVfaGlnaCA8PCAzMikpCiAjZGVmaW5lIF9fcG1kKHgpICgocG1kX3QpIHsgKHgpIH0gKQogI2RlZmluZSBIUEFHRV9TSElGVAkyMQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUtbm9wdWQuaD4KICNlbHNlCiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlX2xvdzsgfSBwdGVfdDsKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ2Q7IH0gcGdkX3Q7CkBAIC01OSw2ICs2MCw3IEBACiAjZGVmaW5lIGJvb3RfcHRlX3QgcHRlX3QgLyogb3Igd291bGQgeW91IHJhdGhlciBoYXZlIGEgdHlwZWRlZiAqLwogI2RlZmluZSBwdGVfdmFsKHgpCSgoeCkucHRlX2xvdykKICNkZWZpbmUgSFBBR0VfU0hJRlQJMjIKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLW5vcG1kLmg+CiAjZW5kaWYKICNkZWZpbmUgUFRFX01BU0sJUEFHRV9NQVNLCiAKQEAgLTExMiwxOCArMTE0LDE4IEBACiAKICNpZmRlZiBfX0FTU0VNQkxZX18KICNkZWZpbmUgX19QQUdFX09GRlNFVAkJQ09ORklHX1BBR0VfT0ZGU0VUCi0jZGVmaW5lIF9fUEhZU0lDQUxfU1RBUlQJQ09ORklHX1BIWVNJQ0FMX1NUQVJUCiAjZWxzZQogI2RlZmluZSBfX1BBR0VfT0ZGU0VUCQkoKHVuc2lnbmVkIGxvbmcpQ09ORklHX1BBR0VfT0ZGU0VUKQotI2RlZmluZSBfX1BIWVNJQ0FMX1NUQVJUCSgodW5zaWduZWQgbG9uZylDT05GSUdfUEhZU0lDQUxfU1RBUlQpCiAjZW5kaWYKLSNkZWZpbmUgX19LRVJORUxfU1RBUlQJCShfX1BBR0VfT0ZGU0VUICsgX19QSFlTSUNBTF9TVEFSVCkKIAogCiAjZGVmaW5lIFBBR0VfT0ZGU0VUCQkoKHVuc2lnbmVkIGxvbmcpX19QQUdFX09GRlNFVCkKICNkZWZpbmUgVk1BTExPQ19SRVNFUlZFCQkoKHVuc2lnbmVkIGxvbmcpX19WTUFMTE9DX1JFU0VSVkUpCiAjZGVmaW5lIE1BWE1FTQkJCSgtX19QQUdFX09GRlNFVC1fX1ZNQUxMT0NfUkVTRVJWRSkKICNkZWZpbmUgX19wYSh4KQkJCSgodW5zaWduZWQgbG9uZykoeCktUEFHRV9PRkZTRVQpCisvKiBfX3BhX3N5bWJvbCBzaG91bGQgYmUgdXNlZCBmb3IgQyB2aXNpYmxlIHN5bWJvbHMuCisgICBUaGlzIHNlZW1zIHRvIGJlIHRoZSBvZmZpY2lhbCBnY2MgYmxlc3NlZCB3YXkgdG8gZG8gc3VjaCBhcml0aG1ldGljLiAqLworI2RlZmluZSBfX3BhX3N5bWJvbCh4KSAgICAgICAgICBfX3BhKFJFTE9DX0hJREUoKHVuc2lnbmVkIGxvbmcpKHgpLDApKQogI2RlZmluZSBfX3ZhKHgpCQkJKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh4KStQQUdFX09GRlNFVCkpCiAjZGVmaW5lIHBmbl90b19rYWRkcihwZm4pICAgICAgX192YSgocGZuKSA8PCBQQUdFX1NISUZUKQogI2lmZGVmIENPTkZJR19GTEFUTUVNCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BhcmFtLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BhcmFtLmgKaW5kZXggNzQ1ZGM1Yi4uMjFiMzI0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wYXJhbS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGFyYW0uaApAQCAtMTgsNiArMTgsNSBAQAogI2VuZGlmCiAKICNkZWZpbmUgTUFYSE9TVE5BTUVMRU4JNjQJLyogbWF4IGxlbmd0aCBvZiBob3N0bmFtZSAqLwotI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRSAyNTYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BhcmF2aXJ0LmggYi9pbmNsdWRlL2FzbS1pMzg2L3BhcmF2aXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwNjI2NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGFyYXZpcnQuaApAQCAtMCwwICsxLDUwNSBAQAorI2lmbmRlZiBfX0FTTV9QQVJBVklSVF9ICisjZGVmaW5lIF9fQVNNX1BBUkFWSVJUX0gKKy8qIFZhcmlvdXMgaW5zdHJ1Y3Rpb25zIG9uIHg4NiBuZWVkIHRvIGJlIHJlcGxhY2VkIGZvcgorICogcGFyYS12aXJ0dWFsaXphdGlvbjogdGhvc2UgaG9va3MgYXJlIGRlZmluZWQgaGVyZS4gKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2lmZGVmIENPTkZJR19QQVJBVklSVAorLyogVGhlc2UgYXJlIHRoZSBtb3N0IHBlcmZvcm1hbmNlIGNyaXRpY2FsIG9wcywgc28gd2Ugd2FudCB0byBiZSBhYmxlIHRvIHBhdGNoCisgKiBjYWxsZXJzICovCisjZGVmaW5lIFBBUkFWSVJUX0lSUV9ESVNBQkxFIDAKKyNkZWZpbmUgUEFSQVZJUlRfSVJRX0VOQUJMRSAxCisjZGVmaW5lIFBBUkFWSVJUX1JFU1RPUkVfRkxBR1MgMgorI2RlZmluZSBQQVJBVklSVF9TQVZFX0ZMQUdTIDMKKyNkZWZpbmUgUEFSQVZJUlRfU0FWRV9GTEFHU19JUlFfRElTQUJMRSA0CisjZGVmaW5lIFBBUkFWSVJUX0lOVEVSUlVQVF9SRVRVUk4gNQorI2RlZmluZSBQQVJBVklSVF9TVElfU1lTRVhJVCA2CisKKy8qIEJpdG1hc2sgb2Ygd2hhdCBjYW4gYmUgY2xvYmJlcmVkOiB1c3VhbGx5IGF0IGxlYXN0IGVheC4gKi8KKyNkZWZpbmUgQ0xCUl9OT05FIDB4MAorI2RlZmluZSBDTEJSX0VBWCAweDEKKyNkZWZpbmUgQ0xCUl9FQ1ggMHgyCisjZGVmaW5lIENMQlJfRURYIDB4NAorI2RlZmluZSBDTEJSX0FOWSAweDcKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3N0cnVjdCB0aHJlYWRfc3RydWN0Oworc3RydWN0IFhndF9kZXNjX3N0cnVjdDsKK3N0cnVjdCB0c3Nfc3RydWN0Oworc3RydWN0IG1tX3N0cnVjdDsKK3N0cnVjdCBwYXJhdmlydF9vcHMKK3sKKwl1bnNpZ25lZCBpbnQga2VybmVsX3JwbDsKKyAJaW50IHBhcmF2aXJ0X2VuYWJsZWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qCisJICogUGF0Y2ggbWF5IHJlcGxhY2Ugb25lIG9mIHRoZSBkZWZpbmVkIGNvZGUgc2VxdWVuY2VzIHdpdGggYXJiaXRyYXJ5CisJICogY29kZSwgc3ViamVjdCB0byB0aGUgc2FtZSByZWdpc3RlciBjb25zdHJhaW50cy4gIFRoaXMgZ2VuZXJhbGx5CisJICogbWVhbnMgdGhlIGNvZGUgaXMgbm90IGZyZWUgdG8gY2xvYmJlciBhbnkgcmVnaXN0ZXJzIG90aGVyIHRoYW4gRUFYLgorCSAqIFRoZSBwYXRjaCBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgY29kZQorCSAqIGdlbmVyYXRlZCwgYXMgd2Ugbm9wIHBhZCB0aGUgcmVzdCBpbiBnZW5lcmljIGNvZGUuCisJICovCisJdW5zaWduZWQgKCpwYXRjaCkodTggdHlwZSwgdTE2IGNsb2JiZXIsIHZvaWQgKmZpcnN0aW5zbiwgdW5zaWduZWQgbGVuKTsKKworCXZvaWQgKCphcmNoX3NldHVwKSh2b2lkKTsKKwljaGFyICooKm1lbW9yeV9zZXR1cCkodm9pZCk7CisJdm9pZCAoKmluaXRfSVJRKSh2b2lkKTsKKworCXZvaWQgKCpiYW5uZXIpKHZvaWQpOworCisJdW5zaWduZWQgbG9uZyAoKmdldF93YWxsY2xvY2spKHZvaWQpOworCWludCAoKnNldF93YWxsY2xvY2spKHVuc2lnbmVkIGxvbmcpOworCXZvaWQgKCp0aW1lX2luaXQpKHZvaWQpOworCisJLyogQWxsIHRoZSBmdW5jdGlvbiBwb2ludGVycyBoZXJlIGFyZSBkZWNsYXJlZCBhcyAiZmFzdGNhbGwiCisJICAgc28gdGhhdCB3ZSBnZXQgYSBzcGVjaWZpYyByZWdpc3Rlci1iYXNlZCBjYWxsaW5nCisJICAgY29udmVudGlvbi4gIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGltcGxlbWVudCBpbmxpbmUKKwkgICBhc3NlbWJsZXIgcmVwbGFjZW1lbnRzLiAqLworCisJdm9pZCAoZmFzdGNhbGwgKmNwdWlkKSh1bnNpZ25lZCBpbnQgKmVheCwgdW5zaWduZWQgaW50ICplYngsCisJCSAgICAgIHVuc2lnbmVkIGludCAqZWN4LCB1bnNpZ25lZCBpbnQgKmVkeCk7CisKKwl1bnNpZ25lZCBsb25nIChmYXN0Y2FsbCAqZ2V0X2RlYnVncmVnKShpbnQgcmVnbm8pOworCXZvaWQgKGZhc3RjYWxsICpzZXRfZGVidWdyZWcpKGludCByZWdubywgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CisKKwl2b2lkIChmYXN0Y2FsbCAqY2x0cykodm9pZCk7CisKKwl1bnNpZ25lZCBsb25nIChmYXN0Y2FsbCAqcmVhZF9jcjApKHZvaWQpOworCXZvaWQgKGZhc3RjYWxsICp3cml0ZV9jcjApKHVuc2lnbmVkIGxvbmcpOworCisJdW5zaWduZWQgbG9uZyAoZmFzdGNhbGwgKnJlYWRfY3IyKSh2b2lkKTsKKwl2b2lkIChmYXN0Y2FsbCAqd3JpdGVfY3IyKSh1bnNpZ25lZCBsb25nKTsKKworCXVuc2lnbmVkIGxvbmcgKGZhc3RjYWxsICpyZWFkX2NyMykodm9pZCk7CisJdm9pZCAoZmFzdGNhbGwgKndyaXRlX2NyMykodW5zaWduZWQgbG9uZyk7CisKKwl1bnNpZ25lZCBsb25nIChmYXN0Y2FsbCAqcmVhZF9jcjRfc2FmZSkodm9pZCk7CisJdW5zaWduZWQgbG9uZyAoZmFzdGNhbGwgKnJlYWRfY3I0KSh2b2lkKTsKKwl2b2lkIChmYXN0Y2FsbCAqd3JpdGVfY3I0KSh1bnNpZ25lZCBsb25nKTsKKworCXVuc2lnbmVkIGxvbmcgKGZhc3RjYWxsICpzYXZlX2ZsKSh2b2lkKTsKKwl2b2lkIChmYXN0Y2FsbCAqcmVzdG9yZV9mbCkodW5zaWduZWQgbG9uZyk7CisJdm9pZCAoZmFzdGNhbGwgKmlycV9kaXNhYmxlKSh2b2lkKTsKKwl2b2lkIChmYXN0Y2FsbCAqaXJxX2VuYWJsZSkodm9pZCk7CisJdm9pZCAoZmFzdGNhbGwgKnNhZmVfaGFsdCkodm9pZCk7CisJdm9pZCAoZmFzdGNhbGwgKmhhbHQpKHZvaWQpOworCXZvaWQgKGZhc3RjYWxsICp3YmludmQpKHZvaWQpOworCisJLyogZXJyID0gMC8tRUZBVUxULiAgd3Jtc3IgcmV0dXJucyAwLy1FRkFVTFQuICovCisJdTY0IChmYXN0Y2FsbCAqcmVhZF9tc3IpKHVuc2lnbmVkIGludCBtc3IsIGludCAqZXJyKTsKKwlpbnQgKGZhc3RjYWxsICp3cml0ZV9tc3IpKHVuc2lnbmVkIGludCBtc3IsIHU2NCB2YWwpOworCisJdTY0IChmYXN0Y2FsbCAqcmVhZF90c2MpKHZvaWQpOworCXU2NCAoZmFzdGNhbGwgKnJlYWRfcG1jKSh2b2lkKTsKKworCXZvaWQgKGZhc3RjYWxsICpsb2FkX3RyX2Rlc2MpKHZvaWQpOworCXZvaWQgKGZhc3RjYWxsICpsb2FkX2dkdCkoY29uc3Qgc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqKTsKKwl2b2lkIChmYXN0Y2FsbCAqbG9hZF9pZHQpKGNvbnN0IHN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgKik7CisJdm9pZCAoZmFzdGNhbGwgKnN0b3JlX2dkdCkoc3RydWN0IFhndF9kZXNjX3N0cnVjdCAqKTsKKwl2b2lkIChmYXN0Y2FsbCAqc3RvcmVfaWR0KShzdHJ1Y3QgWGd0X2Rlc2Nfc3RydWN0ICopOworCXZvaWQgKGZhc3RjYWxsICpzZXRfbGR0KShjb25zdCB2b2lkICpkZXNjLCB1bnNpZ25lZCBlbnRyaWVzKTsKKwl1bnNpZ25lZCBsb25nIChmYXN0Y2FsbCAqc3RvcmVfdHIpKHZvaWQpOworCXZvaWQgKGZhc3RjYWxsICpsb2FkX3Rscykoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQsIHVuc2lnbmVkIGludCBjcHUpOworCXZvaWQgKGZhc3RjYWxsICp3cml0ZV9sZHRfZW50cnkpKHZvaWQgKmR0LCBpbnQgZW50cnludW0sCisJCQkJCSB1MzIgbG93LCB1MzIgaGlnaCk7CisJdm9pZCAoZmFzdGNhbGwgKndyaXRlX2dkdF9lbnRyeSkodm9pZCAqZHQsIGludCBlbnRyeW51bSwKKwkJCQkJIHUzMiBsb3csIHUzMiBoaWdoKTsKKwl2b2lkIChmYXN0Y2FsbCAqd3JpdGVfaWR0X2VudHJ5KSh2b2lkICpkdCwgaW50IGVudHJ5bnVtLAorCQkJCQkgdTMyIGxvdywgdTMyIGhpZ2gpOworCXZvaWQgKGZhc3RjYWxsICpsb2FkX2VzcDApKHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MsCisJCQkJICAgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCk7CisKKwl2b2lkIChmYXN0Y2FsbCAqc2V0X2lvcGxfbWFzaykodW5zaWduZWQgbWFzayk7CisKKwl2b2lkIChmYXN0Y2FsbCAqaW9fZGVsYXkpKHZvaWQpOworCXZvaWQgKCpjb25zdF91ZGVsYXkpKHVuc2lnbmVkIGxvbmcgbG9vcHMpOworCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJdm9pZCAoZmFzdGNhbGwgKmFwaWNfd3JpdGUpKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBsb25nIHYpOworCXZvaWQgKGZhc3RjYWxsICphcGljX3dyaXRlX2F0b21pYykodW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGxvbmcgdik7CisJdW5zaWduZWQgbG9uZyAoZmFzdGNhbGwgKmFwaWNfcmVhZCkodW5zaWduZWQgbG9uZyByZWcpOworI2VuZGlmCisKKwl2b2lkIChmYXN0Y2FsbCAqZmx1c2hfdGxiX3VzZXIpKHZvaWQpOworCXZvaWQgKGZhc3RjYWxsICpmbHVzaF90bGJfa2VybmVsKSh2b2lkKTsKKwl2b2lkIChmYXN0Y2FsbCAqZmx1c2hfdGxiX3NpbmdsZSkodTMyIGFkZHIpOworCisJdm9pZCAoZmFzdGNhbGwgKnNldF9wdGUpKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpOworCXZvaWQgKGZhc3RjYWxsICpzZXRfcHRlX2F0KShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIGFkZHIsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpOworCXZvaWQgKGZhc3RjYWxsICpzZXRfcG1kKShwbWRfdCAqcG1kcCwgcG1kX3QgcG1kdmFsKTsKKwl2b2lkIChmYXN0Y2FsbCAqcHRlX3VwZGF0ZSkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBhZGRyLCBwdGVfdCAqcHRlcCk7CisJdm9pZCAoZmFzdGNhbGwgKnB0ZV91cGRhdGVfZGVmZXIpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgYWRkciwgcHRlX3QgKnB0ZXApOworI2lmZGVmIENPTkZJR19YODZfUEFFCisJdm9pZCAoZmFzdGNhbGwgKnNldF9wdGVfYXRvbWljKShwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKTsKKwl2b2lkIChmYXN0Y2FsbCAqc2V0X3B0ZV9wcmVzZW50KShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCwgcHRlX3QgcHRlKTsKKwl2b2lkIChmYXN0Y2FsbCAqc2V0X3B1ZCkocHVkX3QgKnB1ZHAsIHB1ZF90IHB1ZHZhbCk7CisJdm9pZCAoZmFzdGNhbGwgKnB0ZV9jbGVhcikoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApOworCXZvaWQgKGZhc3RjYWxsICpwbWRfY2xlYXIpKHBtZF90ICpwbWRwKTsKKyNlbmRpZgorCisJLyogVGhlc2UgdHdvIGFyZSBqbXAgdG8sIG5vdCBhY3R1YWxseSBjYWxsZWQuICovCisJdm9pZCAoZmFzdGNhbGwgKmlycV9lbmFibGVfc3lzZXhpdCkodm9pZCk7CisJdm9pZCAoZmFzdGNhbGwgKmlyZXQpKHZvaWQpOworfTsKKworLyogTWFyayBhIHBhcmF2aXJ0IHByb2JlIGZ1bmN0aW9uLiAqLworI2RlZmluZSBwYXJhdmlydF9wcm9iZShmbikJCQkJCQlcCisgc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCAoKl9fcGFyYXZpcnRwcm9iZV8jI2ZuKSh2b2lkKSBfX2F0dHJpYnV0ZV91c2VkX18gXAorCQlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLnBhcmF2aXJ0cHJvYmUiKSkpID0gZm4KKworZXh0ZXJuIHN0cnVjdCBwYXJhdmlydF9vcHMgcGFyYXZpcnRfb3BzOworCisjZGVmaW5lIHBhcmF2aXJ0X2VuYWJsZWQoKSAocGFyYXZpcnRfb3BzLnBhcmF2aXJ0X2VuYWJsZWQpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX2VzcDAoc3RydWN0IHRzc19zdHJ1Y3QgKnRzcywKKwkJCSAgICAgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCkKK3sKKwlwYXJhdmlydF9vcHMubG9hZF9lc3AwKHRzcywgdGhyZWFkKTsKK30KKworI2RlZmluZSBBUkNIX1NFVFVQCQkJcGFyYXZpcnRfb3BzLmFyY2hfc2V0dXAoKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfd2FsbGNsb2NrKHZvaWQpCit7CisJcmV0dXJuIHBhcmF2aXJ0X29wcy5nZXRfd2FsbGNsb2NrKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNldF93YWxsY2xvY2sodW5zaWduZWQgbG9uZyBub3d0aW1lKQoreworCXJldHVybiBwYXJhdmlydF9vcHMuc2V0X3dhbGxjbG9jayhub3d0aW1lKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVfaW5pdCh2b2lkKQoreworCXJldHVybiBwYXJhdmlydF9vcHMudGltZV9pbml0KCk7Cit9CisKKy8qIFRoZSBwYXJhdmlydHVhbGl6ZWQgQ1BVSUQgaW5zdHJ1Y3Rpb24uICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcHVpZCh1bnNpZ25lZCBpbnQgKmVheCwgdW5zaWduZWQgaW50ICplYngsCisJCQkgICB1bnNpZ25lZCBpbnQgKmVjeCwgdW5zaWduZWQgaW50ICplZHgpCit7CisJcGFyYXZpcnRfb3BzLmNwdWlkKGVheCwgZWJ4LCBlY3gsIGVkeCk7Cit9CisKKy8qCisgKiBUaGVzZSBzcGVjaWFsIG1hY3JvcyBjYW4gYmUgdXNlZCB0byBnZXQgb3Igc2V0IGEgZGVidWdnaW5nIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgZ2V0X2RlYnVncmVnKHZhciwgcmVnKSB2YXIgPSBwYXJhdmlydF9vcHMuZ2V0X2RlYnVncmVnKHJlZykKKyNkZWZpbmUgc2V0X2RlYnVncmVnKHZhbCwgcmVnKSBwYXJhdmlydF9vcHMuc2V0X2RlYnVncmVnKHJlZywgdmFsKQorCisjZGVmaW5lIGNsdHMoKSBwYXJhdmlydF9vcHMuY2x0cygpCisKKyNkZWZpbmUgcmVhZF9jcjAoKSBwYXJhdmlydF9vcHMucmVhZF9jcjAoKQorI2RlZmluZSB3cml0ZV9jcjAoeCkgcGFyYXZpcnRfb3BzLndyaXRlX2NyMCh4KQorCisjZGVmaW5lIHJlYWRfY3IyKCkgcGFyYXZpcnRfb3BzLnJlYWRfY3IyKCkKKyNkZWZpbmUgd3JpdGVfY3IyKHgpIHBhcmF2aXJ0X29wcy53cml0ZV9jcjIoeCkKKworI2RlZmluZSByZWFkX2NyMygpIHBhcmF2aXJ0X29wcy5yZWFkX2NyMygpCisjZGVmaW5lIHdyaXRlX2NyMyh4KSBwYXJhdmlydF9vcHMud3JpdGVfY3IzKHgpCisKKyNkZWZpbmUgcmVhZF9jcjQoKSBwYXJhdmlydF9vcHMucmVhZF9jcjQoKQorI2RlZmluZSByZWFkX2NyNF9zYWZlKHgpIHBhcmF2aXJ0X29wcy5yZWFkX2NyNF9zYWZlKCkKKyNkZWZpbmUgd3JpdGVfY3I0KHgpIHBhcmF2aXJ0X29wcy53cml0ZV9jcjQoeCkKKworc3RhdGljIGlubGluZSB2b2lkIHJhd19zYWZlX2hhbHQodm9pZCkKK3sKKwlwYXJhdmlydF9vcHMuc2FmZV9oYWx0KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYWx0KHZvaWQpCit7CisJcGFyYXZpcnRfb3BzLnNhZmVfaGFsdCgpOworfQorI2RlZmluZSB3YmludmQoKSBwYXJhdmlydF9vcHMud2JpbnZkKCkKKworI2RlZmluZSBnZXRfa2VybmVsX3JwbCgpICAocGFyYXZpcnRfb3BzLmtlcm5lbF9ycGwpCisKKyNkZWZpbmUgcmRtc3IobXNyLHZhbDEsdmFsMikgZG8gewkJCQlcCisJaW50IF9lcnI7CQkJCQkJXAorCXU2NCBfbCA9IHBhcmF2aXJ0X29wcy5yZWFkX21zcihtc3IsJl9lcnIpOwkJXAorCXZhbDEgPSAodTMyKV9sOwkJCQkJCVwKKwl2YWwyID0gX2wgPj4gMzI7CQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgd3Jtc3IobXNyLHZhbDEsdmFsMikgZG8gewkJCQlcCisJdTY0IF9sID0gKCh1NjQpKHZhbDIpIDw8IDMyKSB8ICh2YWwxKTsJCQlcCisJcGFyYXZpcnRfb3BzLndyaXRlX21zcigobXNyKSwgX2wpOwkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSByZG1zcmwobXNyLHZhbCkgZG8gewkJCQkJXAorCWludCBfZXJyOwkJCQkJCVwKKwl2YWwgPSBwYXJhdmlydF9vcHMucmVhZF9tc3IoKG1zciksJl9lcnIpOwkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIHdybXNybChtc3IsdmFsKSAocGFyYXZpcnRfb3BzLndyaXRlX21zcigobXNyKSwodmFsKSkpCisjZGVmaW5lIHdybXNyX3NhZmUobXNyLGEsYikgKHsJCQkJCVwKKwl1NjQgX2wgPSAoKHU2NCkoYikgPDwgMzIpIHwgKGEpOwkJCVwKKwlwYXJhdmlydF9vcHMud3JpdGVfbXNyKChtc3IpLF9sKTsJCQlcCit9KQorCisvKiByZG1zciB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZyAqLworI2RlZmluZSByZG1zcl9zYWZlKG1zcixhLGIpICh7CQkJCQlcCisJaW50IF9lcnI7CQkJCQkJXAorCXU2NCBfbCA9IHBhcmF2aXJ0X29wcy5yZWFkX21zcihtc3IsJl9lcnIpOwkJXAorCSgqYSkgPSAodTMyKV9sOwkJCQkJCVwKKwkoKmIpID0gX2wgPj4gMzI7CQkJCQlcCisJX2VycjsgfSkKKworI2RlZmluZSByZHRzYyhsb3csaGlnaCkgZG8gewkJCQkJXAorCXU2NCBfbCA9IHBhcmF2aXJ0X29wcy5yZWFkX3RzYygpOwkJCVwKKwlsb3cgPSAodTMyKV9sOwkJCQkJCVwKKwloaWdoID0gX2wgPj4gMzI7CQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgcmR0c2NsKGxvdykgZG8gewkJCQkJXAorCXU2NCBfbCA9IHBhcmF2aXJ0X29wcy5yZWFkX3RzYygpOwkJCVwKKwlsb3cgPSAoaW50KV9sOwkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSByZHRzY2xsKHZhbCkgKHZhbCA9IHBhcmF2aXJ0X29wcy5yZWFkX3RzYygpKQorCisjZGVmaW5lIHdyaXRlX3RzYyh2YWwxLHZhbDIpIHdybXNyKDB4MTAsIHZhbDEsIHZhbDIpCisKKyNkZWZpbmUgcmRwbWMoY291bnRlcixsb3csaGlnaCkgZG8gewkJCQlcCisJdTY0IF9sID0gcGFyYXZpcnRfb3BzLnJlYWRfcG1jKCk7CQkJXAorCWxvdyA9ICh1MzIpX2w7CQkJCQkJXAorCWhpZ2ggPSBfbCA+PiAzMjsJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBsb2FkX1RSX2Rlc2MoKSAocGFyYXZpcnRfb3BzLmxvYWRfdHJfZGVzYygpKQorI2RlZmluZSBsb2FkX2dkdChkdHIpIChwYXJhdmlydF9vcHMubG9hZF9nZHQoZHRyKSkKKyNkZWZpbmUgbG9hZF9pZHQoZHRyKSAocGFyYXZpcnRfb3BzLmxvYWRfaWR0KGR0cikpCisjZGVmaW5lIHNldF9sZHQoYWRkciwgZW50cmllcykgKHBhcmF2aXJ0X29wcy5zZXRfbGR0KChhZGRyKSwgKGVudHJpZXMpKSkKKyNkZWZpbmUgc3RvcmVfZ2R0KGR0cikgKHBhcmF2aXJ0X29wcy5zdG9yZV9nZHQoZHRyKSkKKyNkZWZpbmUgc3RvcmVfaWR0KGR0cikgKHBhcmF2aXJ0X29wcy5zdG9yZV9pZHQoZHRyKSkKKyNkZWZpbmUgc3RvcmVfdHIodHIpICgodHIpID0gcGFyYXZpcnRfb3BzLnN0b3JlX3RyKCkpCisjZGVmaW5lIGxvYWRfVExTKHQsY3B1KSAocGFyYXZpcnRfb3BzLmxvYWRfdGxzKCh0KSwoY3B1KSkpCisjZGVmaW5lIHdyaXRlX2xkdF9lbnRyeShkdCwgZW50cnksIGxvdywgaGlnaCkJCQkJXAorCShwYXJhdmlydF9vcHMud3JpdGVfbGR0X2VudHJ5KChkdCksIChlbnRyeSksIChsb3cpLCAoaGlnaCkpKQorI2RlZmluZSB3cml0ZV9nZHRfZW50cnkoZHQsIGVudHJ5LCBsb3csIGhpZ2gpCQkJCVwKKwkocGFyYXZpcnRfb3BzLndyaXRlX2dkdF9lbnRyeSgoZHQpLCAoZW50cnkpLCAobG93KSwgKGhpZ2gpKSkKKyNkZWZpbmUgd3JpdGVfaWR0X2VudHJ5KGR0LCBlbnRyeSwgbG93LCBoaWdoKQkJCQlcCisJKHBhcmF2aXJ0X29wcy53cml0ZV9pZHRfZW50cnkoKGR0KSwgKGVudHJ5KSwgKGxvdyksIChoaWdoKSkpCisjZGVmaW5lIHNldF9pb3BsX21hc2sobWFzaykgKHBhcmF2aXJ0X29wcy5zZXRfaW9wbF9tYXNrKG1hc2spKQorCisvKiBUaGUgcGFyYXZpcnR1YWxpemVkIEkvTyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbG93X2Rvd25faW8odm9pZCkgeworCXBhcmF2aXJ0X29wcy5pb19kZWxheSgpOworI2lmZGVmIFJFQUxMWV9TTE9XX0lPCisJcGFyYXZpcnRfb3BzLmlvX2RlbGF5KCk7CisJcGFyYXZpcnRfb3BzLmlvX2RlbGF5KCk7CisJcGFyYXZpcnRfb3BzLmlvX2RlbGF5KCk7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworLyoKKyAqIEJhc2ljIGZ1bmN0aW9ucyBhY2Nlc3NpbmcgQVBJQ3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcGljX3dyaXRlKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBsb25nIHYpCit7CisJcGFyYXZpcnRfb3BzLmFwaWNfd3JpdGUocmVnLHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXBpY193cml0ZV9hdG9taWModW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGxvbmcgdikKK3sKKwlwYXJhdmlydF9vcHMuYXBpY193cml0ZV9hdG9taWMocmVnLHYpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXBpY19yZWFkKHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXJldHVybiBwYXJhdmlydF9vcHMuYXBpY19yZWFkKHJlZyk7Cit9CisjZW5kaWYKKworCisjZGVmaW5lIF9fZmx1c2hfdGxiKCkgcGFyYXZpcnRfb3BzLmZsdXNoX3RsYl91c2VyKCkKKyNkZWZpbmUgX19mbHVzaF90bGJfZ2xvYmFsKCkgcGFyYXZpcnRfb3BzLmZsdXNoX3RsYl9rZXJuZWwoKQorI2RlZmluZSBfX2ZsdXNoX3RsYl9zaW5nbGUoYWRkcikgcGFyYXZpcnRfb3BzLmZsdXNoX3RsYl9zaW5nbGUoYWRkcikKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKK3sKKwlwYXJhdmlydF9vcHMuc2V0X3B0ZShwdGVwLCBwdGV2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdTMyIGFkZHIsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7CisJcGFyYXZpcnRfb3BzLnNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZXAsIHB0ZXZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG1kKHBtZF90ICpwbWRwLCBwbWRfdCBwbWR2YWwpCit7CisJcGFyYXZpcnRfb3BzLnNldF9wbWQocG1kcCwgcG1kdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB0ZV91cGRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHUzMiBhZGRyLCBwdGVfdCAqcHRlcCkKK3sKKwlwYXJhdmlydF9vcHMucHRlX3VwZGF0ZShtbSwgYWRkciwgcHRlcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfdXBkYXRlX2RlZmVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1MzIgYWRkciwgcHRlX3QgKnB0ZXApCit7CisJcGFyYXZpcnRfb3BzLnB0ZV91cGRhdGVfZGVmZXIobW0sIGFkZHIsIHB0ZXApOworfQorCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcHRlX2F0b21pYyhwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQoreworCXBhcmF2aXJ0X29wcy5zZXRfcHRlX2F0b21pYyhwdGVwLCBwdGV2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3B0ZV9wcmVzZW50KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCit7CisJcGFyYXZpcnRfb3BzLnNldF9wdGVfcHJlc2VudChtbSwgYWRkciwgcHRlcCwgcHRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wdWQocHVkX3QgKnB1ZHAsIHB1ZF90IHB1ZHZhbCkKK3sKKwlwYXJhdmlydF9vcHMuc2V0X3B1ZChwdWRwLCBwdWR2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQoreworCXBhcmF2aXJ0X29wcy5wdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX2NsZWFyKHBtZF90ICpwbWRwKQoreworCXBhcmF2aXJ0X29wcy5wbWRfY2xlYXIocG1kcCk7Cit9CisjZW5kaWYKKworLyogVGhlc2UgYWxsIHNpdCBpbiB0aGUgLnBhcmFpbnN0cnVjdGlvbnMgc2VjdGlvbiB0byB0ZWxsIHVzIHdoYXQgdG8gcGF0Y2guICovCitzdHJ1Y3QgcGFyYXZpcnRfcGF0Y2ggeworCXU4ICppbnN0cjsgCQkvKiBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgKi8KKwl1OCBpbnN0cnR5cGU7CQkvKiB0eXBlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KKwl1OCBsZW47CQkJLyogbGVuZ3RoIG9mIG9yaWdpbmFsIGluc3RydWN0aW9uICovCisJdTE2IGNsb2JiZXJzOwkJLyogd2hhdCByZWdpc3RlcnMgeW91IG1heSBjbG9iYmVyICovCit9OworCisjZGVmaW5lIHBhcmF2aXJ0X2FsdChpbnNuX3N0cmluZywgdHlwZW51bSwgY2xvYmJlcikJXAorCSI3NzE6XG5cdCIgaW5zbl9zdHJpbmcgIlxuIiAiNzcyOlxuIgkJXAorCSIucHVzaHNlY3Rpb24gLnBhcmFpbnN0cnVjdGlvbnMsXCJhXCJcbiIJXAorCSIgIC5sb25nIDc3MWJcbiIJCQkJXAorCSIgIC5ieXRlICIgX19zdHJpbmdpZnkodHlwZW51bSkgIlxuIgkJXAorCSIgIC5ieXRlIDc3MmItNzcxYlxuIgkJCQlcCisJIiAgLnNob3J0ICIgX19zdHJpbmdpZnkoY2xvYmJlcikgIlxuIgkJXAorCSIucG9wc2VjdGlvbiIKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGY7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyhwYXJhdmlydF9hbHQoICJwdXNobCAlJWVjeDsgcHVzaGwgJSVlZHg7IgorCQkJCQkgICAiY2FsbCAqJTE7IgorCQkJCQkgICAicG9wbCAlJWVkeDsgcG9wbCAlJWVjeCIsCisJCQkJCSAgUEFSQVZJUlRfU0FWRV9GTEFHUywgQ0xCUl9OT05FKQorCQkJICAgICA6ICI9YSIoZik6ICJtIihwYXJhdmlydF9vcHMuc2F2ZV9mbCkKKwkJCSAgICAgOiAibWVtb3J5IiwgImNjIik7CisJcmV0dXJuIGY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyBmKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKHBhcmF2aXJ0X2FsdCggInB1c2hsICUlZWN4OyBwdXNobCAlJWVkeDsiCisJCQkJCSAgICJjYWxsIColMTsiCisJCQkJCSAgICJwb3BsICUlZWR4OyBwb3BsICUlZWN4IiwKKwkJCQkJICBQQVJBVklSVF9SRVNUT1JFX0ZMQUdTLCBDTEJSX0VBWCkKKwkJCSAgICAgOiAiPWEiKGYpIDogIm0iIChwYXJhdmlydF9vcHMucmVzdG9yZV9mbCksICIwIihmKQorCQkJICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJhd19sb2NhbF9pcnFfZGlzYWJsZSh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKHBhcmF2aXJ0X2FsdCggInB1c2hsICUlZWN4OyBwdXNobCAlJWVkeDsiCisJCQkJCSAgICJjYWxsIColMDsiCisJCQkJCSAgICJwb3BsICUlZWR4OyBwb3BsICUlZWN4IiwKKwkJCQkJICBQQVJBVklSVF9JUlFfRElTQUJMRSwgQ0xCUl9FQVgpCisJCQkgICAgIDogOiAibSIgKHBhcmF2aXJ0X29wcy5pcnFfZGlzYWJsZSkKKwkJCSAgICAgOiAibWVtb3J5IiwgImVheCIsICJjYyIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9lbmFibGUodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyhwYXJhdmlydF9hbHQoICJwdXNobCAlJWVjeDsgcHVzaGwgJSVlZHg7IgorCQkJCQkgICAiY2FsbCAqJTA7IgorCQkJCQkgICAicG9wbCAlJWVkeDsgcG9wbCAlJWVjeCIsCisJCQkJCSAgUEFSQVZJUlRfSVJRX0VOQUJMRSwgQ0xCUl9FQVgpCisJCQkgICAgIDogOiAibSIgKHBhcmF2aXJ0X29wcy5pcnFfZW5hYmxlKQorCQkJICAgICA6ICJtZW1vcnkiLCAiZWF4IiwgImNjIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3Jhd19sb2NhbF9pcnFfc2F2ZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKHBhcmF2aXJ0X2FsdCggInB1c2hsICUlZWN4OyBwdXNobCAlJWVkeDsiCisJCQkJCSAgICJjYWxsIColMTsgcHVzaGwgJSVlYXg7IgorCQkJCQkgICAiY2FsbCAqJTI7IHBvcGwgJSVlYXg7IgorCQkJCQkgICAicG9wbCAlJWVkeDsgcG9wbCAlJWVjeCIsCisJCQkJCSAgUEFSQVZJUlRfU0FWRV9GTEFHU19JUlFfRElTQUJMRSwKKwkJCQkJICBDTEJSX05PTkUpCisJCQkgICAgIDogIj1hIihmKQorCQkJICAgICA6ICJtIiAocGFyYXZpcnRfb3BzLnNhdmVfZmwpLAorCQkJICAgICAgICJtIiAocGFyYXZpcnRfb3BzLmlycV9kaXNhYmxlKQorCQkJICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKwlyZXR1cm4gZjsKK30KKworI2RlZmluZSBDTElfU1RSSU5HIHBhcmF2aXJ0X2FsdCgicHVzaGwgJSVlY3g7IHB1c2hsICUlZWR4OyIJCVwKKwkJICAgICAiY2FsbCAqcGFyYXZpcnRfb3BzKyVjW2lycV9kaXNhYmxlXTsiCQlcCisJCSAgICAgInBvcGwgJSVlZHg7IHBvcGwgJSVlY3giLAkJCQlcCisJCSAgICAgUEFSQVZJUlRfSVJRX0RJU0FCTEUsIENMQlJfRUFYKQorCisjZGVmaW5lIFNUSV9TVFJJTkcgcGFyYXZpcnRfYWx0KCJwdXNobCAlJWVjeDsgcHVzaGwgJSVlZHg7IgkJXAorCQkgICAgICJjYWxsICpwYXJhdmlydF9vcHMrJWNbaXJxX2VuYWJsZV07IgkJXAorCQkgICAgICJwb3BsICUlZWR4OyBwb3BsICUlZWN4IiwJCQkJXAorCQkgICAgIFBBUkFWSVJUX0lSUV9FTkFCTEUsIENMQlJfRUFYKQorI2RlZmluZSBDTElfU1RJX0NMT0JCRVJTICwgIiVlYXgiCisjZGVmaW5lIENMSV9TVElfSU5QVVRfQVJHUyBcCisJLAkJCQkJCQkJXAorCVtpcnFfZGlzYWJsZV0gImkiIChvZmZzZXRvZihzdHJ1Y3QgcGFyYXZpcnRfb3BzLCBpcnFfZGlzYWJsZSkpLAlcCisJW2lycV9lbmFibGVdICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhcmF2aXJ0X29wcywgaXJxX2VuYWJsZSkpCisKKyNlbHNlICAvKiBfX0FTU0VNQkxZX18gKi8KKworI2RlZmluZSBQQVJBX1BBVENIKHB0eXBlLCBjbG9iYmVycywgb3BzKQlcCis3NzE6OwkJCQkJCVwKKwlvcHM7CQkJCQlcCis3NzI6OwkJCQkJCVwKKwkucHVzaHNlY3Rpb24gLnBhcmFpbnN0cnVjdGlvbnMsImEiOwlcCisJIC5sb25nIDc3MWI7CQkJCVwKKwkgLmJ5dGUgcHR5cGU7CQkJCVwKKwkgLmJ5dGUgNzcyYi03NzFiOwkJCVwKKwkgLnNob3J0IGNsb2JiZXJzOwkJCVwKKwkucG9wc2VjdGlvbgorCisjZGVmaW5lIElOVEVSUlVQVF9SRVRVUk4JCQkJXAorCVBBUkFfUEFUQ0goUEFSQVZJUlRfSU5URVJSVVBUX1JFVFVSTiwgQ0xCUl9BTlksCVwKKwlqbXAgKiVjczpwYXJhdmlydF9vcHMrUEFSQVZJUlRfaXJldCkKKworI2RlZmluZSBESVNBQkxFX0lOVEVSUlVQVFMoY2xvYmJlcnMpCQkJXAorCVBBUkFfUEFUQ0goUEFSQVZJUlRfSVJRX0RJU0FCTEUsIGNsb2JiZXJzLAlcCisJcHVzaGwgJWVjeDsgcHVzaGwgJWVkeDsJCQkJXAorCWNhbGwgKnBhcmF2aXJ0X29wcytQQVJBVklSVF9pcnFfZGlzYWJsZTsJXAorCXBvcGwgJWVkeDsgcG9wbCAlZWN4KQkJCQlcCisKKyNkZWZpbmUgRU5BQkxFX0lOVEVSUlVQVFMoY2xvYmJlcnMpCQkJXAorCVBBUkFfUEFUQ0goUEFSQVZJUlRfSVJRX0VOQUJMRSwgY2xvYmJlcnMsCVwKKwlwdXNobCAlZWN4OyBwdXNobCAlZWR4OwkJCQlcCisJY2FsbCAqJWNzOnBhcmF2aXJ0X29wcytQQVJBVklSVF9pcnFfZW5hYmxlOwlcCisJcG9wbCAlZWR4OyBwb3BsICVlY3gpCisKKyNkZWZpbmUgRU5BQkxFX0lOVEVSUlVQVFNfU1lTRVhJVAkJCVwKKwlQQVJBX1BBVENIKFBBUkFWSVJUX1NUSV9TWVNFWElULCBDTEJSX0FOWSwJXAorCWptcCAqJWNzOnBhcmF2aXJ0X29wcytQQVJBVklSVF9pcnFfZW5hYmxlX3N5c2V4aXQpCisKKyNkZWZpbmUgR0VUX0NSMF9JTlRPX0VBWAkJCVwKKwljYWxsICpwYXJhdmlydF9vcHMrUEFSQVZJUlRfcmVhZF9jcjAKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIENPTkZJR19QQVJBVklSVCAqLworI2VuZGlmCS8qIF9fQVNNX1BBUkFWSVJUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGRhLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTI3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BkYS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICAgUGVyLXByb2Nlc3NvciBEYXRhIEFyZWFzCisgICBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAZ29vcC5vcmc+IDIwMDYKKyAgIEJhc2VkIG9uIGFzbS14ODZfNjQvcGRhLmggYnkgQW5kaSBLbGVlbi4KKyAqLworI2lmbmRlZiBfSTM4Nl9QREFfSAorI2RlZmluZSBfSTM4Nl9QREFfSAorCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGkzODZfcGRhCit7CisJc3RydWN0IGkzODZfcGRhICpfcGRhOwkJLyogcG9pbnRlciB0byBzZWxmICovCisKKwlpbnQgY3B1X251bWJlcjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBjdXJyZW50OwkvKiBjdXJyZW50IHByb2Nlc3MgKi8KKwlzdHJ1Y3QgcHRfcmVncyAqaXJxX3JlZ3M7Cit9OworCitleHRlcm4gc3RydWN0IGkzODZfcGRhICpfY3B1X3BkYVtdOworCisjZGVmaW5lIGNwdV9wZGEoaSkJKF9jcHVfcGRhW2ldKQorCisjZGVmaW5lIHBkYV9vZmZzZXQoZmllbGQpIG9mZnNldG9mKHN0cnVjdCBpMzg2X3BkYSwgZmllbGQpCisKK2V4dGVybiB2b2lkIF9fYmFkX3BkYV9maWVsZCh2b2lkKTsKKworLyogVGhpcyB2YXJpYWJsZSBpcyBuZXZlciBpbnN0YW50aWF0ZWQuICBJdCBpcyBvbmx5IHVzZWQgYXMgYSBzdGFuZC1pbgorICAgZm9yIHRoZSByZWFsIHBlci1jcHUgUERBIG1lbW9yeSwgc28gdGhhdCBnY2MgY2FuIHVuZGVyc3RhbmQgd2hhdAorICAgbWVtb3J5IG9wZXJhdGlvbnMgdGhlIGlubGluZSBhc21zKCkgYmVsb3cgYXJlIHBlcmZvcm1pbmcuICBUaGlzCisgICBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIG1ha2UgdGhlIGFzbXMgdm9sYXRpbGUgb3IgaGF2ZSBtZW1vcnkKKyAgIGNsb2JiZXJzLCBzbyBnY2MgY2FuIHJlYWRpbHkgYW5hbHlzZSB0aGVtLiAqLworZXh0ZXJuIHN0cnVjdCBpMzg2X3BkYSBfcHJveHlfcGRhOworCisjZGVmaW5lIHBkYV90b19vcChvcCxmaWVsZCx2YWwpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdHlwZWRlZiB0eXBlb2YoX3Byb3h5X3BkYS5maWVsZCkgVF9fOwkJCVwKKwkJaWYgKDApIHsgVF9fIHRtcF9fOyB0bXBfXyA9ICh2YWwpOyB9CQkJXAorCQlzd2l0Y2ggKHNpemVvZihfcHJveHlfcGRhLmZpZWxkKSkgewkJCVwKKwkJY2FzZSAxOgkJCQkJCQlcCisJCQlhc20ob3AgImIgJTEsJSVnczolYzIiCQkJCVwKKwkJCSAgICA6ICIrbSIgKF9wcm94eV9wZGEuZmllbGQpCQkJXAorCQkJICAgIDoicmkiICgoVF9fKXZhbCksCQkJCVwKKwkJCSAgICAgImkiKHBkYV9vZmZzZXQoZmllbGQpKSk7CQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIDI6CQkJCQkJCVwKKwkJCWFzbShvcCAidyAlMSwlJWdzOiVjMiIJCQkJXAorCQkJICAgIDogIittIiAoX3Byb3h5X3BkYS5maWVsZCkJCQlcCisJCQkgICAgOiJyaSIgKChUX18pdmFsKSwJCQkJXAorCQkJICAgICAiaSIocGRhX29mZnNldChmaWVsZCkpKTsJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgNDoJCQkJCQkJXAorCQkJYXNtKG9wICJsICUxLCUlZ3M6JWMyIgkJCQlcCisJCQkgICAgOiAiK20iIChfcHJveHlfcGRhLmZpZWxkKQkJCVwKKwkJCSAgICA6InJpIiAoKFRfXyl2YWwpLAkJCQlcCisJCQkgICAgICJpIihwZGFfb2Zmc2V0KGZpZWxkKSkpOwkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJZGVmYXVsdDogX19iYWRfcGRhX2ZpZWxkKCk7CQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBwZGFfZnJvbV9vcChvcCxmaWVsZCkJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJdHlwZW9mKF9wcm94eV9wZGEuZmllbGQpIHJldF9fOwkJCQlcCisJCXN3aXRjaCAoc2l6ZW9mKF9wcm94eV9wZGEuZmllbGQpKSB7CQkJXAorCQljYXNlIDE6CQkJCQkJCVwKKwkJCWFzbShvcCAiYiAlJWdzOiVjMSwlMCIJCQkJXAorCQkJICAgIDogIj1yIiAocmV0X18pCQkJCVwKKwkJCSAgICA6ICJpIiAocGRhX29mZnNldChmaWVsZCkpLAkJCVwKKwkJCSAgICAgICJtIiAoX3Byb3h5X3BkYS5maWVsZCkpOwkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJY2FzZSAyOgkJCQkJCQlcCisJCQlhc20ob3AgIncgJSVnczolYzEsJTAiCQkJCVwKKwkJCSAgICA6ICI9ciIgKHJldF9fKQkJCQlcCisJCQkgICAgOiAiaSIgKHBkYV9vZmZzZXQoZmllbGQpKSwJCQlcCisJCQkgICAgICAibSIgKF9wcm94eV9wZGEuZmllbGQpKTsJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgNDoJCQkJCQkJXAorCQkJYXNtKG9wICJsICUlZ3M6JWMxLCUwIgkJCQlcCisJCQkgICAgOiAiPXIiIChyZXRfXykJCQkJXAorCQkJICAgIDogImkiIChwZGFfb2Zmc2V0KGZpZWxkKSksCQkJXAorCQkJICAgICAgIm0iIChfcHJveHlfcGRhLmZpZWxkKSk7CQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQlkZWZhdWx0OiBfX2JhZF9wZGFfZmllbGQoKTsJCQkJXAorCQl9CQkJCQkJCVwKKwkJcmV0X187IH0pCisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBwZGEgZmllbGQgKi8KKyNkZWZpbmUgcGRhX2FkZHIoZmllbGQpCQkJCQkJCVwKKwkoKHR5cGVvZihfcHJveHlfcGRhLmZpZWxkKSAqKSgodW5zaWduZWQgY2hhciAqKXJlYWRfcGRhKF9wZGEpICsgXAorCQkJCSAgICAgIHBkYV9vZmZzZXQoZmllbGQpKSkKKworI2RlZmluZSByZWFkX3BkYShmaWVsZCkgcGRhX2Zyb21fb3AoIm1vdiIsZmllbGQpCisjZGVmaW5lIHdyaXRlX3BkYShmaWVsZCx2YWwpIHBkYV90b19vcCgibW92IixmaWVsZCx2YWwpCisjZGVmaW5lIGFkZF9wZGEoZmllbGQsdmFsKSBwZGFfdG9fb3AoImFkZCIsZmllbGQsdmFsKQorI2RlZmluZSBzdWJfcGRhKGZpZWxkLHZhbCkgcGRhX3RvX29wKCJzdWIiLGZpZWxkLHZhbCkKKyNkZWZpbmUgb3JfcGRhKGZpZWxkLHZhbCkgcGRhX3RvX29wKCJvciIsZmllbGQsdmFsKQorCisjZW5kaWYJLyogX0kzODZfUERBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS1pMzg2L3BlcmNwdS5oCmluZGV4IDU3NjRhZmEuLjUxMGFlMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGVyY3B1LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZXJjcHUuaApAQCAtMSw2ICsxLDMxIEBACiAjaWZuZGVmIF9fQVJDSF9JMzg2X1BFUkNQVV9fCiAjZGVmaW5lIF9fQVJDSF9JMzg2X1BFUkNQVV9fCiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGVyY3B1Lmg+CisjZWxzZQorCisvKgorICogUEVSX0NQVSBmaW5kcyBhbiBhZGRyZXNzIG9mIGEgcGVyLWNwdSB2YXJpYWJsZS4KKyAqCisgKiBBcmdzOgorICogICAgdmFyIC0gdmFyaWFibGUgbmFtZQorICogICAgY3B1IC0gMzJiaXQgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgY3VycmVudCBDUFUgbnVtYmVyCisgKgorICogVGhlIHJlc3VsdGluZyBhZGRyZXNzIGlzIHN0b3JlZCBpbiB0aGUgImNwdSIgYXJndW1lbnQuCisgKgorICogRXhhbXBsZToKKyAqICAgIFBFUl9DUFUoY3B1X2dkdF9kZXNjciwgJWVieCkKKyAqLworI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgUEVSX0NQVSh2YXIsIGNwdSkgXAorCW1vdmwgX19wZXJfY3B1X29mZnNldCgsY3B1LDQpLCBjcHU7CVwKKwlhZGRsICRwZXJfY3B1X18vKiovdmFyLCBjcHU7CisjZWxzZSAvKiAhIFNNUCAqLworI2RlZmluZSBQRVJfQ1BVKHZhciwgY3B1KSBcCisJbW92bCAkcGVyX2NwdV9fLyoqL3ZhciwgY3B1OworI2VuZGlmCS8qIFNNUCAqLworCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19BUkNIX0kzODZfUEVSQ1BVX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0ybGV2ZWwuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0ybGV2ZWwuaAppbmRleCA4ZDhkM2I5Li4zOGMzZmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTJsZXZlbC5oCkBAIC0xLDggKzEsNiBAQAogI2lmbmRlZiBfSTM4Nl9QR1RBQkxFXzJMRVZFTF9ICiAjZGVmaW5lIF9JMzg2X1BHVEFCTEVfMkxFVkVMX0gKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUtbm9wbWQuaD4KLQogI2RlZmluZSBwdGVfRVJST1IoZSkgXAogCXByaW50aygiJXM6JWQ6IGJhZCBwdGUgJTA4bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIChlKS5wdGVfbG93KQogI2RlZmluZSBwZ2RfRVJST1IoZSkgXApAQCAtMTMsMTcgKzExLDE5IEBACiAgKiB3aXRoaW4gYSBwYWdlIHRhYmxlIGFyZSBkaXJlY3RseSBtb2RpZmllZC4gIFRodXMsIHRoZSBmb2xsb3dpbmcKICAqIGhvb2sgaXMgbWFkZSBhdmFpbGFibGUuCiAgKi8KKyNpZm5kZWYgQ09ORklHX1BBUkFWSVJUCiAjZGVmaW5lIHNldF9wdGUocHRlcHRyLCBwdGV2YWwpICgqKHB0ZXB0cikgPSBwdGV2YWwpCiAjZGVmaW5lIHNldF9wdGVfYXQobW0sYWRkcixwdGVwLHB0ZXZhbCkgc2V0X3B0ZShwdGVwLHB0ZXZhbCkKKyNkZWZpbmUgc2V0X3BtZChwbWRwdHIsIHBtZHZhbCkgKCoocG1kcHRyKSA9IChwbWR2YWwpKQorI2VuZGlmCisKICNkZWZpbmUgc2V0X3B0ZV9hdG9taWMocHRlcHRyLCBwdGV2YWwpIHNldF9wdGUocHRlcHRyLHB0ZXZhbCkKICNkZWZpbmUgc2V0X3B0ZV9wcmVzZW50KG1tLGFkZHIscHRlcCxwdGV2YWwpIHNldF9wdGVfYXQobW0sYWRkcixwdGVwLHB0ZXZhbCkKLSNkZWZpbmUgc2V0X3BtZChwbWRwdHIsIHBtZHZhbCkgKCoocG1kcHRyKSA9IChwbWR2YWwpKQogCiAjZGVmaW5lIHB0ZV9jbGVhcihtbSxhZGRyLHhwKQlkbyB7IHNldF9wdGVfYXQobW0sIGFkZHIsIHhwLCBfX3B0ZSgwKSk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHBtZF9jbGVhcih4cCkJZG8geyBzZXRfcG1kKHhwLCBfX3BtZCgwKSk7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCi0jZGVmaW5lIHB0ZXBfZ2V0X2FuZF9jbGVhcihtbSxhZGRyLHhwKQlfX3B0ZSh4Y2hnKCYoeHApLT5wdGVfbG93LCAwKSkKKyNkZWZpbmUgcmF3X3B0ZXBfZ2V0X2FuZF9jbGVhcih4cCkJX19wdGUoeGNoZygmKHhwKS0+cHRlX2xvdywgMCkpCiAKICNkZWZpbmUgcHRlX3BhZ2UoeCkJCXBmbl90b19wYWdlKHB0ZV9wZm4oeCkpCiAjZGVmaW5lIHB0ZV9ub25lKHgpCQkoISh4KS5wdGVfbG93KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oCmluZGV4IGMyZDcwMWUuLjdhMjMxOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtM2xldmVsLmgKQEAgLTEsOCArMSw2IEBACiAjaWZuZGVmIF9JMzg2X1BHVEFCTEVfM0xFVkVMX0gKICNkZWZpbmUgX0kzODZfUEdUQUJMRV8zTEVWRUxfSAogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3B1ZC5oPgotCiAvKgogICogSW50ZWwgUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb24gKFBBRSkgTW9kZSAtIHRocmVlLWxldmVsIHBhZ2UKICAqIHRhYmxlcyBvbiBQUHJvKyBDUFVzLgpAQCAtNDQsNiArNDIsNyBAQAogCXJldHVybiBwdGVfeChwdGUpOwogfQogCisjaWZuZGVmIENPTkZJR19QQVJBVklSVAogLyogUnVsZXMgZm9yIHVzaW5nIHNldF9wdGU6IHRoZSBwdGUgYmVpbmcgYXNzaWduZWQgKm11c3QqIGJlCiAgKiBlaXRoZXIgbm90IHByZXNlbnQgb3IgaW4gYSBzdGF0ZSB3aGVyZSB0aGUgaGFyZHdhcmUgd2lsbAogICogbm90IGF0dGVtcHQgdG8gdXBkYXRlIHRoZSBwdGUuICBJbiBwbGFjZXMgd2hlcmUgdGhpcyBpcwpAQCAtODEsMjUgKzgwLDYgQEAKIAkJKCoocHVkcHRyKSA9IChwdWR2YWwpKQogCiAvKgotICogUGVudGl1bS1JSSBlcnJhdHVtIEExMzogaW4gUEFFIG1vZGUgd2UgZXhwbGljaXRseSBoYXZlIHRvIGZsdXNoCi0gKiB0aGUgVExCIHZpYSBjcjMgaWYgdGhlIHRvcC1sZXZlbCBwZ2QgaXMgY2hhbmdlZC4uLgotICogV2UgZG8gbm90IGxldCB0aGUgZ2VuZXJpYyBjb2RlIGZyZWUgYW5kIGNsZWFyIHBnZCBlbnRyaWVzIGR1ZSB0bwotICogdGhpcyBlcnJhdHVtLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHVkX2NsZWFyIChwdWRfdCAqIHB1ZCkgeyB9Ci0KLSNkZWZpbmUgcHVkX3BhZ2UocHVkKSBcCi0oKHN0cnVjdCBwYWdlICopIF9fdmEocHVkX3ZhbChwdWQpICYgUEFHRV9NQVNLKSkKLQotI2RlZmluZSBwdWRfcGFnZV92YWRkcihwdWQpIFwKLSgodW5zaWduZWQgbG9uZykgX192YShwdWRfdmFsKHB1ZCkgJiBQQUdFX01BU0spKQotCi0KLS8qIEZpbmQgYW4gZW50cnkgaW4gdGhlIHNlY29uZC1sZXZlbCBwYWdlIHRhYmxlLi4gKi8KLSNkZWZpbmUgcG1kX29mZnNldChwdWQsIGFkZHJlc3MpICgocG1kX3QgKikgcHVkX3BhZ2UoKihwdWQpKSArIFwKLQkJCXBtZF9pbmRleChhZGRyZXNzKSkKLQotLyoKICAqIEZvciBQVEVzIGFuZCBQREVzLCB3ZSBtdXN0IGNsZWFyIHRoZSBQLWJpdCBmaXJzdCB3aGVuIGNsZWFyaW5nIGEgcGFnZSB0YWJsZQogICogZW50cnksIHNvIGNsZWFyIHRoZSBib3R0b20gaGFsZiBmaXJzdCBhbmQgZW5mb3JjZSBvcmRlcmluZyB3aXRoIGEgY29tcGlsZXIKICAqIGJhcnJpZXIuCkBAIC0xMTgsOSArOTgsMjggQEAKIAlzbXBfd21iKCk7CiAJKih0bXAgKyAxKSA9IDA7CiB9CisjZW5kaWYKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQorLyoKKyAqIFBlbnRpdW0tSUkgZXJyYXR1bSBBMTM6IGluIFBBRSBtb2RlIHdlIGV4cGxpY2l0bHkgaGF2ZSB0byBmbHVzaAorICogdGhlIFRMQiB2aWEgY3IzIGlmIHRoZSB0b3AtbGV2ZWwgcGdkIGlzIGNoYW5nZWQuLi4KKyAqIFdlIGRvIG5vdCBsZXQgdGhlIGdlbmVyaWMgY29kZSBmcmVlIGFuZCBjbGVhciBwZ2QgZW50cmllcyBkdWUgdG8KKyAqIHRoaXMgZXJyYXR1bS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHB1ZF9jbGVhciAocHVkX3QgKiBwdWQpIHsgfQorCisjZGVmaW5lIHB1ZF9wYWdlKHB1ZCkgXAorKChzdHJ1Y3QgcGFnZSAqKSBfX3ZhKHB1ZF92YWwocHVkKSAmIFBBR0VfTUFTSykpCisKKyNkZWZpbmUgcHVkX3BhZ2VfdmFkZHIocHVkKSBcCisoKHVuc2lnbmVkIGxvbmcpIF9fdmEocHVkX3ZhbChwdWQpICYgUEFHRV9NQVNLKSkKKworCisvKiBGaW5kIGFuIGVudHJ5IGluIHRoZSBzZWNvbmQtbGV2ZWwgcGFnZSB0YWJsZS4uICovCisjZGVmaW5lIHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKSAoKHBtZF90ICopIHB1ZF9wYWdlKCoocHVkKSkgKyBcCisJCQlwbWRfaW5kZXgoYWRkcmVzcykpCisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcmF3X3B0ZXBfZ2V0X2FuZF9jbGVhcihwdGVfdCAqcHRlcCkKIHsKIAlwdGVfdCByZXM7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKaW5kZXggN2QzOThmNC4uZTZhNDcyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KIAogI2lmbmRlZiBfSTM4Nl9CSVRPUFNfSAogI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KQEAgLTM0LDE0ICszNSwxNCBAQAogI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpICh2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlKSkKIGV4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVsxMDI0XTsKIGV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpclsxMDI0XTsKLWV4dGVybiBrbWVtX2NhY2hlX3QgKnBnZF9jYWNoZTsKLWV4dGVybiBrbWVtX2NhY2hlX3QgKnBtZF9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqcGdkX2NhY2hlOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpwbWRfY2FjaGU7CiBleHRlcm4gc3BpbmxvY2tfdCBwZ2RfbG9jazsKIGV4dGVybiBzdHJ1Y3QgcGFnZSAqcGdkX2xpc3Q7CiAKLXZvaWQgcG1kX2N0b3Iodm9pZCAqLCBrbWVtX2NhY2hlX3QgKiwgdW5zaWduZWQgbG9uZyk7Ci12b2lkIHBnZF9jdG9yKHZvaWQgKiwga21lbV9jYWNoZV90ICosIHVuc2lnbmVkIGxvbmcpOwotdm9pZCBwZ2RfZHRvcih2b2lkICosIGttZW1fY2FjaGVfdCAqLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgcG1kX2N0b3Iodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgcGdkX2N0b3Iodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgcGdkX2R0b3Iodm9pZCAqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKTsKIHZvaWQgcGd0YWJsZV9jYWNoZV9pbml0KHZvaWQpOwogdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKIApAQCAtMjQ2LDYgKzI0Nyw3IEBACiAjIGluY2x1ZGUgPGFzbS9wZ3RhYmxlLTJsZXZlbC5oPgogI2VuZGlmCiAKKyNpZm5kZWYgQ09ORklHX1BBUkFWSVJUCiAvKgogICogUnVsZXMgZm9yIHVzaW5nIHB0ZV91cGRhdGUgLSBpdCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhbnkgUFRFIHVwZGF0ZSB3aGljaAogICogaGFzIG5vdCBiZWVuIGRvbmUgdXNpbmcgdGhlIHNldF9wdGUgLyBjbGVhcl9wdGUgaW50ZXJmYWNlcy4gIEl0IGlzIHVzZWQgYnkKQEAgLTI2MSw3ICsyNjMsNyBAQAogICovCiAjZGVmaW5lIHB0ZV91cGRhdGUobW0sIGFkZHIsIHB0ZXApCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHB0ZV91cGRhdGVfZGVmZXIobW0sIGFkZHIsIHB0ZXApCWRvIHsgfSB3aGlsZSAoMCkKLQorI2VuZGlmCiAKIC8qCiAgKiBXZSBvbmx5IHVwZGF0ZSB0aGUgZGlydHkvYWNjZXNzZWQgc3RhdGUgaWYgd2Ugc2V0CkBAIC0yNzUsNyArMjc3LDcgQEAKIGRvIHsJCQkJCQkJCQlcCiAJaWYgKGRpcnR5KSB7CQkJCQkJCVwKIAkJKHB0ZXApLT5wdGVfbG93ID0gKGVudHJ5KS5wdGVfbG93OwkJCVwKLQkJcHRlX3VwZGF0ZV9kZWZlcigodm1hKS0+dm1fbW0sIChhZGRyKSwgKHB0ZXApKTsJCVwKKwkJcHRlX3VwZGF0ZV9kZWZlcigodm1hKS0+dm1fbW0sIChhZGRyZXNzKSwgKHB0ZXApKTsJXAogCQlmbHVzaF90bGJfcGFnZSh2bWEsIGFkZHJlc3MpOwkJCQlcCiAJfQkJCQkJCQkJXAogfSB3aGlsZSAoMCkKQEAgLTMwNSw3ICszMDcsNyBAQAogCV9fZGlydHkgPSBwdGVfZGlydHkoKihwdGVwKSk7CQkJCQlcCiAJaWYgKF9fZGlydHkpIHsJCQkJCQkJXAogCQljbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCAmKHB0ZXApLT5wdGVfbG93KTsJCVwKLQkJcHRlX3VwZGF0ZV9kZWZlcigodm1hKS0+dm1fbW0sIChhZGRyKSwgKHB0ZXApKTsJCVwKKwkJcHRlX3VwZGF0ZV9kZWZlcigodm1hKS0+dm1fbW0sIChhZGRyZXNzKSwgKHB0ZXApKTsJXAogCQlmbHVzaF90bGJfcGFnZSh2bWEsIGFkZHJlc3MpOwkJCQlcCiAJfQkJCQkJCQkJXAogCV9fZGlydHk7CQkJCQkJCVwKQEAgLTMxOCwxMiArMzIwLDIwIEBACiAJX195b3VuZyA9IHB0ZV95b3VuZygqKHB0ZXApKTsJCQkJCVwKIAlpZiAoX195b3VuZykgewkJCQkJCQlcCiAJCWNsZWFyX2JpdChfUEFHRV9CSVRfQUNDRVNTRUQsICYocHRlcCktPnB0ZV9sb3cpOwlcCi0JCXB0ZV91cGRhdGVfZGVmZXIoKHZtYSktPnZtX21tLCAoYWRkciksIChwdGVwKSk7CQlcCisJCXB0ZV91cGRhdGVfZGVmZXIoKHZtYSktPnZtX21tLCAoYWRkcmVzcyksIChwdGVwKSk7CVwKIAkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsJCQkJXAogCX0JCQkJCQkJCVwKIAlfX3lvdW5nOwkJCQkJCQlcCiB9KQogCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgorc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCit7CisJcHRlX3QgcHRlID0gcmF3X3B0ZXBfZ2V0X2FuZF9jbGVhcihwdGVwKTsKKwlwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwKTsKKwlyZXR1cm4gcHRlOworfQorCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUl9GVUxMCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcl9mdWxsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLCBpbnQgZnVsbCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCmluZGV4IDIyNzcxMjcuLmE1MmQ2NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogLyogZmxhZyBmb3IgZGlzYWJsaW5nIHRoZSB0c2MgKi8KIGV4dGVybiBpbnQgdHNjX2Rpc2FibGU7CkBAIC03Miw2ICs3Myw3IEBACiAjZW5kaWYKIAl1bnNpZ25lZCBjaGFyIHg4Nl9tYXhfY29yZXM7CS8qIGNwdWlkIHJldHVybmVkIG1heCBjb3JlcyB2YWx1ZSAqLwogCXVuc2lnbmVkIGNoYXIgYXBpY2lkOworCXVuc2lnbmVkIHNob3J0IHg4Nl9jbGZsdXNoX3NpemU7CiAjaWZkZWYgQ09ORklHX1NNUAogCXVuc2lnbmVkIGNoYXIgYm9vdGVkX2NvcmVzOwkvKiBudW1iZXIgb2YgY29yZXMgYXMgc2VlbiBieSBPUyAqLwogCV9fdTggcGh5c19wcm9jX2lkOyAJCS8qIFBoeXNpY2FsIHByb2Nlc3NvciBpZC4gKi8KQEAgLTExMSw2ICsxMTMsOCBAQAogZXh0ZXJuCWludCBjcHVfbGxjX2lkW05SX0NQVVNdOwogZXh0ZXJuIGNoYXIgaWdub3JlX2ZwdV9pcnE7CiAKK3ZvaWQgX19pbml0IGNwdV9kZXRlY3Qoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKKwogZXh0ZXJuIHZvaWQgaWRlbnRpZnlfY3B1KHN0cnVjdCBjcHVpbmZvX3g4NiAqKTsKIGV4dGVybiB2b2lkIHByaW50X2NwdV9pbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgaW5pdF9pbnRlbF9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKTsKQEAgLTE0Myw4ICsxNDcsOCBAQAogI2RlZmluZSBYODZfRUZMQUdTX1ZJUAkweDAwMTAwMDAwIC8qIFZpcnR1YWwgSW50ZXJydXB0IFBlbmRpbmcgKi8KICNkZWZpbmUgWDg2X0VGTEFHU19JRAkweDAwMjAwMDAwIC8qIENQVUlEIGRldGVjdGlvbiBmbGFnICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdWlkKHVuc2lnbmVkIGludCAqZWF4LCB1bnNpZ25lZCBpbnQgKmVieCwKLQkJCSAgIHVuc2lnbmVkIGludCAqZWN4LCB1bnNpZ25lZCBpbnQgKmVkeCkKK3N0YXRpYyBpbmxpbmUgZmFzdGNhbGwgdm9pZCBuYXRpdmVfY3B1aWQodW5zaWduZWQgaW50ICplYXgsIHVuc2lnbmVkIGludCAqZWJ4LAorCQkJCQkgdW5zaWduZWQgaW50ICplY3gsIHVuc2lnbmVkIGludCAqZWR4KQogewogCS8qIGVjeCBpcyBvZnRlbiBhbiBpbnB1dCBhcyB3ZWxsIGFzIGFuIG91dHB1dC4gKi8KIAlfX2FzbV9fKCJjcHVpZCIKQEAgLTE1NSw1OSArMTU5LDYgQEAKIAkJOiAiMCIgKCplYXgpLCAiMiIgKCplY3gpKTsKIH0KIAotLyoKLSAqIEdlbmVyaWMgQ1BVSUQgZnVuY3Rpb24KLSAqIGNsZWFyICVlY3ggc2luY2Ugc29tZSBjcHVzIChDeXJpeCBNSUkpIGRvIG5vdCBzZXQgb3IgY2xlYXIgJWVjeAotICogcmVzdWx0aW5nIGluIHN0YWxlIHJlZ2lzdGVyIGNvbnRlbnRzIGJlaW5nIHJldHVybmVkLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1aWQodW5zaWduZWQgaW50IG9wLCB1bnNpZ25lZCBpbnQgKmVheCwgdW5zaWduZWQgaW50ICplYngsIHVuc2lnbmVkIGludCAqZWN4LCB1bnNpZ25lZCBpbnQgKmVkeCkKLXsKLQkqZWF4ID0gb3A7Ci0JKmVjeCA9IDA7Ci0JX19jcHVpZChlYXgsIGVieCwgZWN4LCBlZHgpOwotfQotCi0vKiBTb21lIENQVUlEIGNhbGxzIHdhbnQgJ2NvdW50JyB0byBiZSBwbGFjZWQgaW4gZWN4ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1aWRfY291bnQoaW50IG9wLCBpbnQgY291bnQsIGludCAqZWF4LCBpbnQgKmVieCwgaW50ICplY3gsCi0JCQkgICAgICAgaW50ICplZHgpCi17Ci0JKmVheCA9IG9wOwotCSplY3ggPSBjb3VudDsKLQlfX2NwdWlkKGVheCwgZWJ4LCBlY3gsIGVkeCk7Ci19Ci0KLS8qCi0gKiBDUFVJRCBmdW5jdGlvbnMgcmV0dXJuaW5nIGEgc2luZ2xlIGRhdHVtCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VheCh1bnNpZ25lZCBpbnQgb3ApCi17Ci0JdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsKLQotCWNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKLQlyZXR1cm4gZWF4OwotfQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3B1aWRfZWJ4KHVuc2lnbmVkIGludCBvcCkKLXsKLQl1bnNpZ25lZCBpbnQgZWF4LCBlYngsIGVjeCwgZWR4OwotCi0JY3B1aWQob3AsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwotCXJldHVybiBlYng7Ci19Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lY3godW5zaWduZWQgaW50IG9wKQotewotCXVuc2lnbmVkIGludCBlYXgsIGVieCwgZWN4LCBlZHg7Ci0KLQljcHVpZChvcCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7Ci0JcmV0dXJuIGVjeDsKLX0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VkeCh1bnNpZ25lZCBpbnQgb3ApCi17Ci0JdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsKLQotCWNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKLQlyZXR1cm4gZWR4OwotfQotCiAjZGVmaW5lIGxvYWRfY3IzKHBnZGlyKSB3cml0ZV9jcjMoX19wYShwZ2RpcikpCiAKIC8qCkBAIC0zMDYsNiArMjU3LDggQEAKIAkJOiA6ImEiIChlYXgpLCAiYyIgKGVjeCkpOwogfQogCitleHRlcm4gdm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBlYXgsIHVuc2lnbmVkIGxvbmcgZWN4KTsKKwogLyogZnJvbSBzeXN0ZW0gZGVzY3JpcHRpb24gdGFibGUgaW4gQklPUy4gIE1vc3RseSBmb3IgTUNBIHVzZSwgYnV0CiBvdGhlcnMgbWF5IGZpbmQgaXQgdXNlZnVsLiAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCBtYWNoaW5lX2lkOwpAQCAtNDcxLDYgKzQyNCw3IEBACiAJLnZtODZfaW5mbyA9IE5VTEwsCQkJCQkJXAogCS5zeXNlbnRlcl9jcyA9IF9fS0VSTkVMX0NTLAkJCQkJXAogCS5pb19iaXRtYXBfcHRyID0gTlVMTCwJCQkJCQlcCisJLmdzID0gX19LRVJORUxfUERBLAkJCQkJCVwKIH0KIAogLyoKQEAgLTQ4NywxOCArNDQxLDkgQEAKIAkuaW9fYml0bWFwCT0geyBbIDAgLi4uIElPX0JJVE1BUF9MT05HU10gPSB+MCB9LAkJXAogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9lc3AwKHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MsIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpCi17Ci0JdHNzLT5lc3AwID0gdGhyZWFkLT5lc3AwOwotCS8qIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gU0VQIGlzIGVuYWJsZWQsIG5vIG5lZWQgdG8gdGVzdCAiU0VQImFyYXRlbHkgKi8KLQlpZiAodW5saWtlbHkodHNzLT5zczEgIT0gdGhyZWFkLT5zeXNlbnRlcl9jcykpIHsKLQkJdHNzLT5zczEgPSB0aHJlYWQtPnN5c2VudGVyX2NzOwotCQl3cm1zcihNU1JfSUEzMl9TWVNFTlRFUl9DUywgdGhyZWFkLT5zeXNlbnRlcl9jcywgMCk7Ci0JfQotfQotCiAjZGVmaW5lIHN0YXJ0X3RocmVhZChyZWdzLCBuZXdfZWlwLCBuZXdfZXNwKSBkbyB7CQlcCi0JX19hc21fXygibW92bCAlMCwlJWZzIDsgbW92bCAlMCwlJWdzIjogOiJyIiAoMCkpOwlcCisJX19hc21fXygibW92bCAlMCwlJWZzIjogOiJyIiAoMCkpOwkJCVwKKwlyZWdzLT54Z3MgPSAwOwkJCQkJCVwKIAlzZXRfZnMoVVNFUl9EUyk7CQkJCQlcCiAJcmVncy0+eGRzID0gX19VU0VSX0RTOwkJCQkJXAogCXJlZ3MtPnhlcyA9IF9fVVNFUl9EUzsJCQkJCVwKQEAgLTUwOCwzMyArNDUzLDYgQEAKIAlyZWdzLT5lc3AgPSBuZXdfZXNwOwkJCQkJXAogfSB3aGlsZSAoMCkKIAotLyoKLSAqIFRoZXNlIHNwZWNpYWwgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGdldCBvciBzZXQgYSBkZWJ1Z2dpbmcgcmVnaXN0ZXIKLSAqLwotI2RlZmluZSBnZXRfZGVidWdyZWcodmFyLCByZWdpc3RlcikJCQkJXAotCQlfX2FzbV9fKCJtb3ZsICUlZGIiICNyZWdpc3RlciAiLCAlMCIJCVwKLQkJCToiPXIiICh2YXIpKQotI2RlZmluZSBzZXRfZGVidWdyZWcodmFsdWUsIHJlZ2lzdGVyKQkJCVwKLQkJX19hc21fXygibW92bCAlMCwlJWRiIiAjcmVnaXN0ZXIJCVwKLQkJCTogLyogbm8gb3V0cHV0ICovCQkJXAotCQkJOiJyIiAodmFsdWUpKQotCi0vKgotICogU2V0IElPUEwgYml0cyBpbiBFRkxBR1MgZnJvbSBnaXZlbiBtYXNrCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaW9wbF9tYXNrKHVuc2lnbmVkIG1hc2spCi17Ci0JdW5zaWduZWQgaW50IHJlZzsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInB1c2hmbDsiCi0JCQkgICAgICAicG9wbCAlMDsiCi0JCQkgICAgICAiYW5kbCAlMSwgJTA7IgotCQkJICAgICAgIm9ybCAlMiwgJTA7IgotCQkJICAgICAgInB1c2hsICUwOyIKLQkJCSAgICAgICJwb3BmbCIKLQkJCQk6ICI9JnIiIChyZWcpCi0JCQkJOiAiaSIgKH5YODZfRUZMQUdTX0lPUEwpLCAiciIgKG1hc2spKTsKLX0KLQogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiwgYSBzdHJhbmdlIEMgdGhpbmcgKi8KIHN0cnVjdCB0YXNrX3N0cnVjdDsKIHN0cnVjdCBtbV9zdHJ1Y3Q7CkBAIC02MjYsNiArNTQ0LDEwNSBAQAogCiAjZGVmaW5lIGNwdV9yZWxheCgpCXJlcF9ub3AoKQogCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjZWxzZQorI2RlZmluZSBwYXJhdmlydF9lbmFibGVkKCkgMAorI2RlZmluZSBfX2NwdWlkIG5hdGl2ZV9jcHVpZAorCitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9lc3AwKHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MsIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpCit7CisJdHNzLT5lc3AwID0gdGhyZWFkLT5lc3AwOworCS8qIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gU0VQIGlzIGVuYWJsZWQsIG5vIG5lZWQgdG8gdGVzdCAiU0VQImFyYXRlbHkgKi8KKwlpZiAodW5saWtlbHkodHNzLT5zczEgIT0gdGhyZWFkLT5zeXNlbnRlcl9jcykpIHsKKwkJdHNzLT5zczEgPSB0aHJlYWQtPnN5c2VudGVyX2NzOworCQl3cm1zcihNU1JfSUEzMl9TWVNFTlRFUl9DUywgdGhyZWFkLT5zeXNlbnRlcl9jcywgMCk7CisJfQorfQorCisvKgorICogVGhlc2Ugc3BlY2lhbCBtYWNyb3MgY2FuIGJlIHVzZWQgdG8gZ2V0IG9yIHNldCBhIGRlYnVnZ2luZyByZWdpc3RlcgorICovCisjZGVmaW5lIGdldF9kZWJ1Z3JlZyh2YXIsIHJlZ2lzdGVyKQkJCQlcCisJCV9fYXNtX18oIm1vdmwgJSVkYiIgI3JlZ2lzdGVyICIsICUwIgkJXAorCQkJOiI9ciIgKHZhcikpCisjZGVmaW5lIHNldF9kZWJ1Z3JlZyh2YWx1ZSwgcmVnaXN0ZXIpCQkJXAorCQlfX2FzbV9fKCJtb3ZsICUwLCUlZGIiICNyZWdpc3RlcgkJXAorCQkJOiAvKiBubyBvdXRwdXQgKi8JCQlcCisJCQk6InIiICh2YWx1ZSkpCisKKyNkZWZpbmUgc2V0X2lvcGxfbWFzayBuYXRpdmVfc2V0X2lvcGxfbWFzaworI2VuZGlmIC8qIENPTkZJR19QQVJBVklSVCAqLworCisvKgorICogU2V0IElPUEwgYml0cyBpbiBFRkxBR1MgZnJvbSBnaXZlbiBtYXNrCisgKi8KK3N0YXRpYyBmYXN0Y2FsbCBpbmxpbmUgdm9pZCBuYXRpdmVfc2V0X2lvcGxfbWFzayh1bnNpZ25lZCBtYXNrKQoreworCXVuc2lnbmVkIGludCByZWc7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwdXNoZmw7IgorCQkJICAgICAgInBvcGwgJTA7IgorCQkJICAgICAgImFuZGwgJTEsICUwOyIKKwkJCSAgICAgICJvcmwgJTIsICUwOyIKKwkJCSAgICAgICJwdXNobCAlMDsiCisJCQkgICAgICAicG9wZmwiCisJCQkJOiAiPSZyIiAocmVnKQorCQkJCTogImkiICh+WDg2X0VGTEFHU19JT1BMKSwgInIiIChtYXNrKSk7Cit9CisKKy8qCisgKiBHZW5lcmljIENQVUlEIGZ1bmN0aW9uCisgKiBjbGVhciAlZWN4IHNpbmNlIHNvbWUgY3B1cyAoQ3lyaXggTUlJKSBkbyBub3Qgc2V0IG9yIGNsZWFyICVlY3gKKyAqIHJlc3VsdGluZyBpbiBzdGFsZSByZWdpc3RlciBjb250ZW50cyBiZWluZyByZXR1cm5lZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNwdWlkKHVuc2lnbmVkIGludCBvcCwgdW5zaWduZWQgaW50ICplYXgsIHVuc2lnbmVkIGludCAqZWJ4LCB1bnNpZ25lZCBpbnQgKmVjeCwgdW5zaWduZWQgaW50ICplZHgpCit7CisJKmVheCA9IG9wOworCSplY3ggPSAwOworCV9fY3B1aWQoZWF4LCBlYngsIGVjeCwgZWR4KTsKK30KKworLyogU29tZSBDUFVJRCBjYWxscyB3YW50ICdjb3VudCcgdG8gYmUgcGxhY2VkIGluIGVjeCAqLworc3RhdGljIGlubGluZSB2b2lkIGNwdWlkX2NvdW50KGludCBvcCwgaW50IGNvdW50LCBpbnQgKmVheCwgaW50ICplYngsIGludCAqZWN4LAorCQkJICAgICAgIGludCAqZWR4KQoreworCSplYXggPSBvcDsKKwkqZWN4ID0gY291bnQ7CisJX19jcHVpZChlYXgsIGVieCwgZWN4LCBlZHgpOworfQorCisvKgorICogQ1BVSUQgZnVuY3Rpb25zIHJldHVybmluZyBhIHNpbmdsZSBkYXR1bQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lYXgodW5zaWduZWQgaW50IG9wKQoreworCXVuc2lnbmVkIGludCBlYXgsIGVieCwgZWN4LCBlZHg7CisKKwljcHVpZChvcCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJcmV0dXJuIGVheDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VieCh1bnNpZ25lZCBpbnQgb3ApCit7CisJdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsKKworCWNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlyZXR1cm4gZWJ4OworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3B1aWRfZWN4KHVuc2lnbmVkIGludCBvcCkKK3sKKwl1bnNpZ25lZCBpbnQgZWF4LCBlYngsIGVjeCwgZWR4OworCisJY3B1aWQob3AsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCXJldHVybiBlY3g7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lZHgodW5zaWduZWQgaW50IG9wKQoreworCXVuc2lnbmVkIGludCBlYXgsIGVieCwgZWN4LCBlZHg7CisKKwljcHVpZChvcCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJcmV0dXJuIGVkeDsKK30KKwogLyogZ2VuZXJpYyB2ZXJzaW9ucyBmcm9tIGdhcyAqLwogI2RlZmluZSBHRU5FUklDX05PUDEJIi5ieXRlIDB4OTBcbiIKICNkZWZpbmUgR0VORVJJQ19OT1AyICAgIAkiLmJ5dGUgMHg4OSwweGY2XG4iCkBAIC03MjUsNCArNzQyLDcgQEAKIGV4dGVybiB2b2lkIGVuYWJsZV9zZXBfY3B1KHZvaWQpOwogZXh0ZXJuIGludCBzeXNlbnRlcl9zZXR1cCh2b2lkKTsKIAorZXh0ZXJuIGludCBpbml0X2dkdChpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpOworZXh0ZXJuIHZvaWQgc2Vjb25kYXJ5X2NwdV9pbml0KHZvaWQpOworCiAjZW5kaWYgLyogX19BU01fSTM4Nl9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLWkzODYvcHRyYWNlLmgKaW5kZXggZDUwNWY1MC4uYmRiYzg5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3B0cmFjZS5oCkBAIC0xNiw2ICsxNiw4IEBACiAJbG9uZyBlYXg7CiAJaW50ICB4ZHM7CiAJaW50ICB4ZXM7CisJLyogaW50ICB4ZnM7ICovCisJaW50ICB4Z3M7CiAJbG9uZyBvcmlnX2VheDsKIAlsb25nIGVpcDsKIAlpbnQgIHhjczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcndzZW0uaCBiL2luY2x1ZGUvYXNtLWkzODYvcndzZW0uaAppbmRleCBiYzU5OGQ2Li4wNDE5MDZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3J3c2VtLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9yd3NlbS5oCkBAIC03NSw4ICs3NSw4IEBACiAKIAogI2RlZmluZSBfX1JXU0VNX0lOSVRJQUxJWkVSKG5hbWUpIFwKLXsgUldTRU1fVU5MT0NLRURfVkFMVUUsIFNQSU5fTE9DS19VTkxPQ0tFRCwgTElTVF9IRUFEX0lOSVQoKG5hbWUpLndhaXRfbGlzdCkgXAotCV9fUldTRU1fREVQX01BUF9JTklUKG5hbWUpIH0KK3sgUldTRU1fVU5MT0NLRURfVkFMVUUsIF9fU1BJTl9MT0NLX1VOTE9DS0VEKChuYW1lKS53YWl0X2xvY2spLCBcCisgIExJU1RfSEVBRF9JTklUKChuYW1lKS53YWl0X2xpc3QpIF9fUldTRU1fREVQX01BUF9JTklUKG5hbWUpIH0KIAogI2RlZmluZSBERUNMQVJFX1JXU0VNKG5hbWUpIFwKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIG5hbWUgPSBfX1JXU0VNX0lOSVRJQUxJWkVSKG5hbWUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NlZ21lbnQuaCBiL2luY2x1ZGUvYXNtLWkzODYvc2VnbWVudC5oCmluZGV4IGI3YWI1OTYuLjNjNzk2YWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc2VnbWVudC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc2VnbWVudC5oCkBAIC0zOSw3ICszOSw3IEBACiAgKiAgMjUgLSBBUE0gQklPUyBzdXBwb3J0IAogICoKICAqICAyNiAtIEVTUEZJWCBzbWFsbCBTUwotICogIDI3IC0gdW51c2VkCisgKiAgMjcgLSBQREEJCQkJWyBwZXItY3B1IHByaXZhdGUgZGF0YSBhcmVhIF0KICAqICAyOCAtIHVudXNlZAogICogIDI5IC0gdW51c2VkCiAgKiAgMzAgLSB1bnVzZWQKQEAgLTc0LDYgKzc0LDkgQEAKICNkZWZpbmUgR0RUX0VOVFJZX0VTUEZJWF9TUwkJKEdEVF9FTlRSWV9LRVJORUxfQkFTRSArIDE0KQogI2RlZmluZSBfX0VTUEZJWF9TUyAoR0RUX0VOVFJZX0VTUEZJWF9TUyAqIDgpCiAKKyNkZWZpbmUgR0RUX0VOVFJZX1BEQQkJCShHRFRfRU5UUllfS0VSTkVMX0JBU0UgKyAxNSkKKyNkZWZpbmUgX19LRVJORUxfUERBIChHRFRfRU5UUllfUERBICogOCkKKwogI2RlZmluZSBHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTCTMxCiAKIC8qCkBAIC0xMjgsNSArMTMxLDcgQEAKICNkZWZpbmUgU0VHTUVOVF9MRFQJCTB4NAogI2RlZmluZSBTRUdNRU5UX0dEVAkJMHgwCiAKKyNpZm5kZWYgQ09ORklHX1BBUkFWSVJUCiAjZGVmaW5lIGdldF9rZXJuZWxfcnBsKCkgIDAKICNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NldHVwLmggYi9pbmNsdWRlL2FzbS1pMzg2L3NldHVwLmgKaW5kZXggMjczNDkwOS4uNjc2NTlkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc2V0dXAuaApAQCAtNiw2ICs2LDggQEAKICNpZm5kZWYgX2kzODZfU0VUVVBfSAogI2RlZmluZSBfaTM4Nl9TRVRVUF9ICiAKKyNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUgMjU2CisKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAKQEAgLTE0LDEwICsxNiw4IEBACiAgKi8KICNkZWZpbmUgTUFYTUVNX1BGTglQRk5fRE9XTihNQVhNRU0pCiAjZGVmaW5lIE1BWF9OT05QQUVfUEZOCSgxIDw8IDIwKQotI2VuZGlmCiAKICNkZWZpbmUgUEFSQU1fU0laRSA0MDk2Ci0jZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDI1NgogCiAjZGVmaW5lIE9MRF9DTF9NQUdJQ19BRERSCTB4OTAwMjAKICNkZWZpbmUgT0xEX0NMX01BR0lDCQkweEEzM0YKQEAgLTcwLDYgKzcwLDcgQEAKIHN0cnVjdCBlODIwZW50cnk7CiAKIGNoYXIgKiBfX2luaXQgbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCk7CitjaGFyICptZW1vcnlfc2V0dXAodm9pZCk7CiAKIGludCBfX2luaXQgY29weV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgaW50IG5yX21hcCk7CiBpbnQgX19pbml0IHNhbml0aXplX2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBjaGFyICogcG5yX21hcCk7CkBAIC03OCw0ICs3OSw2IEBACiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAorI2VuZGlmICAvKiAgX19LRVJORUxfXyAgKi8KKwogI2VuZGlmIC8qIF9pMzg2X1NFVFVQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc21wLmggYi9pbmNsdWRlL2FzbS1pMzg2L3NtcC5oCmluZGV4IGJkNTljMTUuLjY0ZmU2MjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc21wLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zbXAuaApAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCkBAIC01Niw3ICs1Nyw3IEBACiAgKiBmcm9tIHRoZSBpbml0aWFsIHN0YXJ0dXAuIFdlIG1hcCBBUElDX0JBU0UgdmVyeSBlYXJseSBpbiBwYWdlX3NldHVwKCksCiAgKiBzbyB0aGlzIGlzIGNvcnJlY3QgaW4gdGhlIHg4NiBjYXNlLgogICovCi0jZGVmaW5lIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1KQorI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpIChyZWFkX3BkYShjcHVfbnVtYmVyKSkKIAogZXh0ZXJuIGNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CiBleHRlcm4gY3B1bWFza190IGNwdV9jYWxsaW5fbWFwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9jay5oCmluZGV4IGMxOGI3MWYuLmQzYmNlYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrLmgKQEAgLTcsOCArNywxNCBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjZWxzZQogI2RlZmluZSBDTElfU1RSSU5HCSJjbGkiCiAjZGVmaW5lIFNUSV9TVFJJTkcJInN0aSIKKyNkZWZpbmUgQ0xJX1NUSV9DTE9CQkVSUworI2RlZmluZSBDTElfU1RJX0lOUFVUX0FSR1MKKyNlbmRpZiAvKiBDT05GSUdfUEFSQVZJUlQgKi8KIAogLyoKICAqIFlvdXIgYmFzaWMgU01QIHNwaW5sb2NrcywgYWxsb3dpbmcgb25seSBhIHNpbmdsZSBDUFUgYW55d2hlcmUKQEAgLTUzLDI1ICs1OSwyOCBAQAogewogCWFzbSB2b2xhdGlsZSgKIAkJIlxuMTpcdCIKLQkJTE9DS19QUkVGSVggIiA7IGRlY2IgJTBcblx0IgorCQlMT0NLX1BSRUZJWCAiIDsgZGVjYiAlW3Nsb2NrXVxuXHQiCiAJCSJqbnMgNWZcbiIKIAkJIjI6XHQiCi0JCSJ0ZXN0bCAkMHgyMDAsICUxXG5cdCIKKwkJInRlc3RsICQweDIwMCwgJVtmbGFnc11cblx0IgogCQkianogNGZcblx0IgogCQlTVElfU1RSSU5HICJcbiIKIAkJIjM6XHQiCiAJCSJyZXA7bm9wXG5cdCIKLQkJImNtcGIgJDAsICUwXG5cdCIKKwkJImNtcGIgJDAsICVbc2xvY2tdXG5cdCIKIAkJImpsZSAzYlxuXHQiCiAJCUNMSV9TVFJJTkcgIlxuXHQiCiAJCSJqbXAgMWJcbiIKIAkJIjQ6XHQiCiAJCSJyZXA7bm9wXG5cdCIKLQkJImNtcGIgJDAsICUwXG5cdCIKKwkJImNtcGIgJDAsICVbc2xvY2tdXG5cdCIKIAkJImpnIDFiXG5cdCIKIAkJImptcCA0YlxuIgogCQkiNTpcblx0IgotCQk6ICIrbSIgKGxvY2stPnNsb2NrKSA6ICJyIiAoZmxhZ3MpIDogIm1lbW9yeSIpOworCQk6IFtzbG9ja10gIittIiAobG9jay0+c2xvY2spCisJCTogW2ZsYWdzXSAiciIgKGZsYWdzKQorCSAJICBDTElfU1RJX0lOUFVUX0FSR1MKKwkJOiAibWVtb3J5IiBDTElfU1RJX0NMT0JCRVJTKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrX3R5cGVzLmgKaW5kZXggNTllZmU4NC4uNGRhOTM0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9ja190eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc3BpbmxvY2tfdHlwZXMuaApAQCAtNiwxMyArNiwxMyBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2xvY2s7CisJdW5zaWduZWQgaW50IHNsb2NrOwogfSByYXdfc3BpbmxvY2tfdDsKIAogI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAxIH0KIAogdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworCXVuc2lnbmVkIGludCBsb2NrOwogfSByYXdfcndsb2NrX3Q7CiAKICNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyBSV19MT0NLX0JJQVMgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zdXNwZW5kLmggYi9pbmNsdWRlL2FzbS1pMzg2L3N1c3BlbmQuaAppbmRleCAwOGJlMWU1Li44ZGJhYWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3N1c3BlbmQuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3N1c3BlbmQuaApAQCAtNiwyOSArNiwxNCBAQAogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KIAotc3RhdGljIGlubGluZSBpbnQKLWFyY2hfcHJlcGFyZV9zdXNwZW5kKHZvaWQpCi17Ci0JLyogSWYgeW91IHdhbnQgdG8gbWFrZSBub24tUFNFIG1hY2hpbmUgd29yaywgdHVybiBvZmYgcGFnaW5nCi0gICAgICAgICAgIGluIHN3c3VzcF9hcmNoX3N1c3BlbmQuIHN3c3VzcF9wZ19kaXIgc2hvdWxkIGhhdmUgaWRlbnRpdHkgbWFwcGluZywgc28KLSAgICAgICAgICAgaXQgY291bGQgd29yay4uLiAgKi8KLQlpZiAoIWNwdV9oYXNfcHNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUFNFIGlzIHJlcXVpcmVkIGZvciBzd3N1c3AuXG4iKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JcmV0dXJuIDA7Ci19CitzdGF0aWMgaW5saW5lIGludCBhcmNoX3ByZXBhcmVfc3VzcGVuZCh2b2lkKSB7IHJldHVybiAwOyB9CiAKIC8qIGltYWdlIG9mIHRoZSBzYXZlZCBwcm9jZXNzb3Igc3RhdGUgKi8KIHN0cnVjdCBzYXZlZF9jb250ZXh0IHsKICAgCXUxNiBlcywgZnMsIGdzLCBzczsKIAl1bnNpZ25lZCBsb25nIGNyMCwgY3IyLCBjcjMsIGNyNDsKLQl1MTYgZ2R0X3BhZDsKLQl1MTYgZ2R0X2xpbWl0OwotCXVuc2lnbmVkIGxvbmcgZ2R0X2Jhc2U7Ci0JdTE2IGlkdF9wYWQ7Ci0JdTE2IGlkdF9saW1pdDsKLQl1bnNpZ25lZCBsb25nIGlkdF9iYXNlOworCXN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgZ2R0OworCXN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgaWR0OwogCXUxNiBsZHQ7CiAJdTE2IHRzczsKIAl1bnNpZ25lZCBsb25nIHRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWkzODYvc3lzdGVtLmgKaW5kZXggYTZkYWJiYy4uYTZkMjBkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3N5c3RlbS5oCkBAIC04OCw2ICs4OCw5IEBACiAjZGVmaW5lIHNhdmVzZWdtZW50KHNlZywgdmFsdWUpIFwKIAlhc20gdm9sYXRpbGUoIm1vdiAlJSIgI3NlZyAiLCUwIjoiPXJtIiAodmFsdWUpKQogCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjZWxzZQogI2RlZmluZSByZWFkX2NyMCgpICh7IFwKIAl1bnNpZ25lZCBpbnQgX19kdW1teTsgXAogCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCkBAIC0xMzksMTcgKzE0MiwxOCBAQAogI2RlZmluZSB3cml0ZV9jcjQoeCkgXAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUwLCUlY3I0IjogOiJyIiAoeCkpCiAKLS8qCi0gKiBDbGVhciBhbmQgc2V0ICdUUycgYml0IHJlc3BlY3RpdmVseQotICovCisjZGVmaW5lIHdiaW52ZCgpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndiaW52ZCI6IDogOiJtZW1vcnkiKQorCisvKiBDbGVhciB0aGUgJ1RTJyBiaXQgKi8KICNkZWZpbmUgY2x0cygpIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2x0cyIpCisjZW5kaWYvKiBDT05GSUdfUEFSQVZJUlQgKi8KKworLyogU2V0IHRoZSAnVFMnIGJpdCAqLwogI2RlZmluZSBzdHRzKCkgd3JpdGVfY3IwKDggfCByZWFkX2NyMCgpKQogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCi0jZGVmaW5lIHdiaW52ZCgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndiaW52ZCI6IDogOiJtZW1vcnkiKQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2xpbWl0KHVuc2lnbmVkIGxvbmcgc2VnbWVudCkKIHsKIAl1bnNpZ25lZCBsb25nIF9fbGltaXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Rlcm1iaXRzLmgKaW5kZXggNzJjMTBlMy4uMTJiYWYxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdGVybWJpdHMuaApAQCAtMTcsNiArMTcsMTcgQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIgMAogI2RlZmluZSBWUVVJVCAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKaW5kZXggNTRkNmQ3YS4uNGIxODdiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaApAQCAtOTUsMTUgKzk1LDcgQEAKIAogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KICNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKLSNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKQkJCQkJXAotCSh7CQkJCQkJCVwKLQkJc3RydWN0IHRocmVhZF9pbmZvICpyZXQ7CQkJXAotCQkJCQkJCQlcCi0JCXJldCA9IGttYWxsb2MoVEhSRUFEX1NJWkUsIEdGUF9LRVJORUwpOwkJXAotCQlpZiAocmV0KQkJCQkJXAotCQkJbWVtc2V0KHJldCwgMCwgVEhSRUFEX1NJWkUpOwkJXAotCQlyZXQ7CQkJCQkJXAotCX0pCisjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykga3phbGxvYyhUSFJFQURfU0laRSwgR0ZQX0tFUk5FTCkKICNlbHNlCiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykga21hbGxvYyhUSFJFQURfU0laRSwgR0ZQX0tFUk5FTCkKICNlbmRpZgpAQCAtMTQyLDYgKzEzNCw3IEBACiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE2CiAjZGVmaW5lIFRJRl9ERUJVRwkJMTcJLyogdXNlcyBkZWJ1ZyByZWdpc3RlcnMgKi8KICNkZWZpbmUgVElGX0lPX0JJVE1BUAkJMTgJLyogdXNlcyBJL08gYml0bWFwICovCisjZGVmaW5lIFRJRl9GUkVFWkUJCTE5CS8qIGlzIGZyZWV6aW5nIGZvciBzdXNwZW5kICovCiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxPDxUSUZfTk9USUZZX1JFU1VNRSkKQEAgLTE1NSw2ICsxNDgsNyBAQAogI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMTw8VElGX1JFU1RPUkVfU0lHTUFTSykKICNkZWZpbmUgX1RJRl9ERUJVRwkJKDE8PFRJRl9ERUJVRykKICNkZWZpbmUgX1RJRl9JT19CSVRNQVAJCSgxPDxUSUZfSU9fQklUTUFQKQorI2RlZmluZSBfVElGX0ZSRUVaRQkJKDE8PFRJRl9GUkVFWkUpCiAKIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KICNkZWZpbmUgX1RJRl9XT1JLX01BU0sgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90aW1lLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTgwNjVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90aW1lLmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBfQVNNaTM4Nl9USU1FX0gKKyNkZWZpbmUgX0FTTWkzODZfVElNRV9ICisKKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlICJtYWNoX3RpbWUuaCIKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5hdGl2ZV9nZXRfd2FsbGNsb2NrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByZXR2YWw7CisKKwlpZiAoZWZpX2VuYWJsZWQpCisJCXJldHZhbCA9IGVmaV9nZXRfdGltZSgpOworCWVsc2UKKwkJcmV0dmFsID0gbWFjaF9nZXRfY21vc190aW1lKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBuYXRpdmVfc2V0X3dhbGxjbG9jayh1bnNpZ25lZCBsb25nIG5vd3RpbWUpCit7CisJaW50IHJldHZhbDsKKworCWlmIChlZmlfZW5hYmxlZCkKKwkJcmV0dmFsID0gZWZpX3NldF9ydGNfbW1zcyhub3d0aW1lKTsKKwllbHNlCisJCXJldHZhbCA9IG1hY2hfc2V0X3J0Y19tbXNzKG5vd3RpbWUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmZGVmIENPTkZJR19QQVJBVklSVAorI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgorI2Vsc2UgLyogIUNPTkZJR19QQVJBVklSVCAqLworCisjZGVmaW5lIGdldF93YWxsY2xvY2soKSBuYXRpdmVfZ2V0X3dhbGxjbG9jaygpCisjZGVmaW5lIHNldF93YWxsY2xvY2soeCkgbmF0aXZlX3NldF93YWxsY2xvY2soeCkKKyNkZWZpbmUgZG9fdGltZV9pbml0KCkgdGltZV9pbml0X2hvb2soKQorCisjZW5kaWYgLyogQ09ORklHX1BBUkFWSVJUICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20taTM4Ni90bGJmbHVzaC5oCmluZGV4IDM2MDY0OGIuLjRkZDgyODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdGxiZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RsYmZsdXNoLmgKQEAgLTQsNyArNCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi0jZGVmaW5lIF9fZmx1c2hfdGxiKCkJCQkJCQkJXAorI2lmZGVmIENPTkZJR19QQVJBVklSVAorI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgorI2Vsc2UKKyNkZWZpbmUgX19mbHVzaF90bGIoKSBfX25hdGl2ZV9mbHVzaF90bGIoKQorI2RlZmluZSBfX2ZsdXNoX3RsYl9nbG9iYWwoKSBfX25hdGl2ZV9mbHVzaF90bGJfZ2xvYmFsKCkKKyNkZWZpbmUgX19mbHVzaF90bGJfc2luZ2xlKGFkZHIpIF9fbmF0aXZlX2ZsdXNoX3RsYl9zaW5nbGUoYWRkcikKKyNlbmRpZgorCisjZGVmaW5lIF9fbmF0aXZlX2ZsdXNoX3RsYigpCQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJdW5zaWduZWQgaW50IHRtcHJlZzsJCQkJCVwKIAkJCQkJCQkJCVwKQEAgLTE5LDcgKzI3LDcgQEAKICAqIEdsb2JhbCBwYWdlcyBoYXZlIHRvIGJlIGZsdXNoZWQgYSBiaXQgZGlmZmVyZW50bHkuIE5vdCBhIHJlYWwKICAqIHBlcmZvcm1hbmNlIHByb2JsZW0gYmVjYXVzZSB0aGlzIGRvZXMgbm90IGhhcHBlbiBvZnRlbi4KICAqLwotI2RlZmluZSBfX2ZsdXNoX3RsYl9nbG9iYWwoKQkJCQkJCVwKKyNkZWZpbmUgX19uYXRpdmVfZmx1c2hfdGxiX2dsb2JhbCgpCQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQl1bnNpZ25lZCBpbnQgdG1wcmVnLCBjcjQsIGNyNF9vcmlnOwkJCVwKIAkJCQkJCQkJCVwKQEAgLTM2LDYgKzQ0LDkgQEAKIAkJCTogIm1lbW9yeSIpOwkJCQkJXAogCX0gd2hpbGUgKDApCiAKKyNkZWZpbmUgX19uYXRpdmVfZmx1c2hfdGxiX3NpbmdsZShhZGRyKSAJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCJpbnZscGcgKCUwKSIgOjoiciIgKGFkZHIpIDogIm1lbW9yeSIpCisKICMgZGVmaW5lIF9fZmx1c2hfdGxiX2FsbCgpCQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJaWYgKGNwdV9oYXNfcGdlKQkJCQkJXApAQCAtNDYsOSArNTcsNiBAQAogCiAjZGVmaW5lIGNwdV9oYXNfaW52bHBnCShib290X2NwdV9kYXRhLng4NiA+IDMpCiAKLSNkZWZpbmUgX19mbHVzaF90bGJfc2luZ2xlKGFkZHIpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW52bHBnICglMCkiIDo6InIiIChhZGRyKSA6ICJtZW1vcnkiKQotCiAjaWZkZWYgQ09ORklHX1g4Nl9JTlZMUEcKICMgZGVmaW5lIF9fZmx1c2hfdGxiX29uZShhZGRyKSBfX2ZsdXNoX3RsYl9zaW5nbGUoYWRkcikKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1pMzg2L3RvcG9sb2d5LmgKaW5kZXggOTc4ZDA5NS4uYWM1ODU4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdG9wb2xvZ3kuaApAQCAtODksNiArODksNyBAQAogCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKIAkJCQl8IFNEX0JBTEFOQ0VfRVhFQwlcCiAJCQkJfCBTRF9CQUxBTkNFX0ZPUksJXAorCQkJCXwgU0RfU0VSSUFMSVpFCQlcCiAJCQkJfCBTRF9XQUtFX0JBTEFOQ0UsCVwKIAkubGFzdF9iYWxhbmNlCQk9IGppZmZpZXMsCQlcCiAJLmJhbGFuY2VfaW50ZXJ2YWwJPSAxLAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWkzODYvdHlwZXMuaAppbmRleCA0YjRiMjk1Li5hZDBhNTViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90eXBlcy5oCkBAIC01NywxNiArNTcsNiBAQAogI2VuZGlmCiB0eXBlZGVmIHU2NCBkbWE2NF9hZGRyX3Q7CiAKLSNpZmRlZiBDT05GSUdfTEJECi10eXBlZGVmIHU2NCBzZWN0b3JfdDsKLSNkZWZpbmUgSEFWRV9TRUNUT1JfVAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTFNGCi10eXBlZGVmIHU2NCBibGtjbnRfdDsKLSNkZWZpbmUgSEFWRV9CTEtDTlRfVAotI2VuZGlmCi0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCmluZGV4IGJlZWVhZjYuLjgzM2ZhMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaApAQCAtMzI5LDEwNCArMzI5LDYgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgTlJfc3lzY2FsbHMgMzIwCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLS8qCi0gKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLU1BWF9FUlJOTzogc2VlCi0gKiA8YXNtLWkzODYvZXJybm8uaD4KLSAqLwotI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAotZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCi0JCWVycm5vID0gLShyZXMpOyBcCi0JCXJlcyA9IC0xOyBcCi0JfSBcCi0JcmV0dXJuICh0eXBlKSAocmVzKTsgXAotfSB3aGlsZSAoMCkKLQotLyogWFhYIC0gX2ZvbyBuZWVkcyB0byBiZSBfX2Zvbywgd2hpbGUgX19OUl9iYXIgY291bGQgYmUgX05SX2Jhci4gKi8KLSNkZWZpbmUgX3N5c2NhbGwwKHR5cGUsbmFtZSkgXAotdHlwZSBuYW1lKHZvaWQpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotX19hc21fXyB2b2xhdGlsZSAoImludCAkMHg4MCIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICIwIiAoX19OUl8jI25hbWUpKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMSh0eXBlLG5hbWUsdHlwZTEsYXJnMSkgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotX19hc21fXyB2b2xhdGlsZSAoInB1c2ggJSVlYnggOyBtb3ZsICUyLCUlZWJ4IDsgaW50ICQweDgwIDsgcG9wICUlZWJ4IiBcCi0JOiAiPWEiIChfX3JlcykgXAotCTogIjAiIChfX05SXyMjbmFtZSksInJpIiAoKGxvbmcpKGFyZzEpKSA6ICJtZW1vcnkiKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyKSBcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gdm9sYXRpbGUgKCJwdXNoICUlZWJ4IDsgbW92bCAlMiwlJWVieCA7IGludCAkMHg4MCA7IHBvcCAlJWVieCIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICIwIiAoX19OUl8jI25hbWUpLCJyaSIgKChsb25nKShhcmcxKSksImMiICgobG9uZykoYXJnMikpIFwKLQk6ICJtZW1vcnkiKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMyh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMpIFwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxLHR5cGUyIGFyZzIsdHlwZTMgYXJnMykgXAoteyBcCi1sb25nIF9fcmVzOyBcCi1fX2FzbV9fIHZvbGF0aWxlICgicHVzaCAlJWVieCA7IG1vdmwgJTIsJSVlYnggOyBpbnQgJDB4ODAgOyBwb3AgJSVlYngiIFwKLQk6ICI9YSIgKF9fcmVzKSBcCi0JOiAiMCIgKF9fTlJfIyNuYW1lKSwicmkiICgobG9uZykoYXJnMSkpLCJjIiAoKGxvbmcpKGFyZzIpKSwgXAotCQkgICJkIiAoKGxvbmcpKGFyZzMpKSA6ICJtZW1vcnkiKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNCh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCkgXAotdHlwZSBuYW1lICh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0KSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gdm9sYXRpbGUgKCJwdXNoICUlZWJ4IDsgbW92bCAlMiwlJWVieCA7IGludCAkMHg4MCA7IHBvcCAlJWVieCIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICIwIiAoX19OUl8jI25hbWUpLCJyaSIgKChsb25nKShhcmcxKSksImMiICgobG9uZykoYXJnMikpLCBcCi0JICAiZCIgKChsb25nKShhcmczKSksIlMiICgobG9uZykoYXJnNCkpIDogIm1lbW9yeSIpOyBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCi19IAotCi0jZGVmaW5lIF9zeXNjYWxsNSh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCwgXAotCSAgdHlwZTUsYXJnNSkgXAotdHlwZSBuYW1lICh0eXBlMSBhcmcxLHR5cGUyIGFyZzIsdHlwZTMgYXJnMyx0eXBlNCBhcmc0LHR5cGU1IGFyZzUpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotX19hc21fXyB2b2xhdGlsZSAoInB1c2ggJSVlYnggOyBtb3ZsICUyLCUlZWJ4IDsgbW92bCAlMSwlJWVheCA7ICIgXAotICAgICAgICAgICAgICAgICAgImludCAkMHg4MCA7IHBvcCAlJWVieCIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICJpIiAoX19OUl8jI25hbWUpLCJyaSIgKChsb25nKShhcmcxKSksImMiICgobG9uZykoYXJnMikpLCBcCi0JICAiZCIgKChsb25nKShhcmczKSksIlMiICgobG9uZykoYXJnNCkpLCJEIiAoKGxvbmcpKGFyZzUpKSBcCi0JOiAibWVtb3J5Iik7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDYodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsIFwKLQkgIHR5cGU1LGFyZzUsdHlwZTYsYXJnNikgXAotdHlwZSBuYW1lICh0eXBlMSBhcmcxLHR5cGUyIGFyZzIsdHlwZTMgYXJnMyx0eXBlNCBhcmc0LHR5cGU1IGFyZzUsdHlwZTYgYXJnNikgXAoteyBcCi1sb25nIF9fcmVzOyBcCi0gIHN0cnVjdCB7IGxvbmcgX19hMTsgbG9uZyBfX2E2OyB9IF9fcyA9IHsgKGxvbmcpYXJnMSwgKGxvbmcpYXJnNiB9OyBcCi1fX2FzbV9fIHZvbGF0aWxlICgicHVzaCAlJWVicCA7IHB1c2ggJSVlYnggOyBtb3ZsIDQoJTIpLCUlZWJwIDsgIiBcCi0gICAgICAgICAgICAgICAgICAibW92bCAwKCUyKSwlJWVieCA7IG1vdmwgJTEsJSVlYXggOyBpbnQgJDB4ODAgOyAiIFwKLSAgICAgICAgICAgICAgICAgICJwb3AgJSVlYnggOyAgcG9wICUlZWJwIiBcCi0JOiAiPWEiIChfX3JlcykgXAotCTogImkiIChfX05SXyMjbmFtZSksIjAiICgobG9uZykoJl9fcykpLCJjIiAoKGxvbmcpKGFyZzIpKSwgXAotCSAgImQiICgobG9uZykoYXJnMykpLCJTIiAoKGxvbmcpKGFyZzQpKSwiRCIgKChsb25nKShhcmc1KSkgXAotCTogIm1lbW9yeSIpOyBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCi19CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdW53aW5kLmggYi9pbmNsdWRlL2FzbS1pMzg2L3Vud2luZC5oCmluZGV4IDUwMzFkNjkuLmFhMmM5MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdW53aW5kLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni91bndpbmQuaApAQCAtNzEsNiArNzEsNyBAQAogCWluZm8tPnJlZ3MueHNzID0gX19LRVJORUxfRFM7CiAJaW5mby0+cmVncy54ZHMgPSBfX1VTRVJfRFM7CiAJaW5mby0+cmVncy54ZXMgPSBfX1VTRVJfRFM7CisJaW5mby0+cmVncy54Z3MgPSBfX0tFUk5FTF9QREE7CiB9CiAKIGV4dGVybiBhc21saW5rYWdlIGludCBhcmNoX3Vud2luZF9pbml0X3J1bm5pbmcoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICosCkBAIC03OCwxNyArNzksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKTsKIAotc3RhdGljIGlubGluZSBpbnQgYXJjaF91bndfdXNlcl9tb2RlKGNvbnN0IHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbykKK3N0YXRpYyBpbmxpbmUgaW50IGFyY2hfdW53X3VzZXJfbW9kZSgvKmNvbnN0Ki8gc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvKQogewotI2lmIDAgLyogVGhpcyBjYW4gb25seSB3b3JrIHdoZW4gc2VsZWN0b3IgcmVnaXN0ZXIgYW5kIEVGTEFHUyBzYXZlcy9yZXN0b3JlcwotICAgICAgICAgYXJlIHByb3Blcmx5IGFubm90YXRlZCAoYW5kIHRyYWNrZWQgaW4gVU5XX1JFR0lTVEVSX0lORk8pLiAqLwotCXJldHVybiB1c2VyX21vZGVfdm0oJmluZm8tPnJlZ3MpOwotI2Vsc2UKLQlyZXR1cm4gaW5mby0+cmVncy5laXAgPCBQQUdFX09GRlNFVAorCXJldHVybiB1c2VyX21vZGVfdm0oJmluZm8tPnJlZ3MpCisJICAgICAgIHx8IGluZm8tPnJlZ3MuZWlwIDwgUEFHRV9PRkZTRVQKIAkgICAgICAgfHwgKGluZm8tPnJlZ3MuZWlwID49IF9fZml4X3RvX3ZpcnQoRklYX1ZEU08pCi0JICAgICAgICAgICAgJiYgaW5mby0+cmVncy5laXAgPCBfX2ZpeF90b192aXJ0KEZJWF9WRFNPKSArIFBBR0VfU0laRSkKKwkgICAgICAgICAgICYmIGluZm8tPnJlZ3MuZWlwIDwgX19maXhfdG9fdmlydChGSVhfVkRTTykgKyBQQUdFX1NJWkUpCiAJICAgICAgIHx8IGluZm8tPnJlZ3MuZXNwIDwgUEFHRV9PRkZTRVQ7Ci0jZW5kaWYKIH0KIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdm04Ni5oIGIvaW5jbHVkZS9hc20taTM4Ni92bTg2LmgKaW5kZXggOTUyZmQ2OS4uYTVlZGY1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni92bTg2LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni92bTg2LmgKQEAgLTE0NSwyNiArMTQ1LDEzIEBACiAgKiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUuIExvb2sgYXQgcHRyYWNlLmggdG8gc2VlIHRoZSAibm9ybWFsIgogICogc2V0dXAuIEZvciB1c2VyIHNwYWNlIGxheW91dCBzZWUgJ3N0cnVjdCB2bTg2X3JlZ3MnIGFib3ZlLgogICovCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiBzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyB7CiAvKgogICogbm9ybWFsIHJlZ3MsIHdpdGggc3BlY2lhbCBtZWFuaW5nIGZvciB0aGUgc2VnbWVudCBkZXNjcmlwdG9ycy4uCiAgKi8KLQlsb25nIGVieDsKLQlsb25nIGVjeDsKLQlsb25nIGVkeDsKLQlsb25nIGVzaTsKLQlsb25nIGVkaTsKLQlsb25nIGVicDsKLQlsb25nIGVheDsKLQlsb25nIF9fbnVsbF9kczsKLQlsb25nIF9fbnVsbF9lczsKLQlsb25nIG9yaWdfZWF4OwotCWxvbmcgZWlwOwotCXVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKLQlsb25nIGVmbGFnczsKLQlsb25nIGVzcDsKLQl1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisJc3RydWN0IHB0X3JlZ3MgcHQ7CiAvKgogICogdGhlc2UgYXJlIHNwZWNpZmljIHRvIHY4NiBtb2RlOgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L0tidWlsZCBiL2luY2x1ZGUvYXNtLWlhNjQvS2J1aWxkCmluZGV4IDE1ODE4YTEuLjRhMWU0OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvS2J1aWxkCkBAIC0xMCw3ICsxMCw2IEBACiBoZWFkZXIteSArPSBwZXJmbW9uX2RlZmF1bHRfc21wbC5oCiBoZWFkZXIteSArPSBwdHJhY2Vfb2Zmc2V0cy5oCiBoZWFkZXIteSArPSByc2UuaAotaGVhZGVyLXkgKz0gc2V0dXAuaAogaGVhZGVyLXkgKz0gdWNvbnRleHQuaAogCiB1bmlmZGVmLXkgKz0gcGVyZm1vbi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2JyZWFrLmggYi9pbmNsdWRlL2FzbS1pYTY0L2JyZWFrLmgKaW5kZXggODE2NzgyOC4uZjAzNDAyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9icmVhay5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvYnJlYWsuaApAQCAtMTIsOCArMTIsOCBAQAogICogT1Mtc3BlY2lmaWMgZGVidWcgYnJlYWsgbnVtYmVyczoKICAqLwogI2RlZmluZSBfX0lBNjRfQlJFQUtfS0RCCQkweDgwMTAwCi0jZGVmaW5lIF9fSUE2NF9CUkVBS19LUFJPQkUJCTB4ODAyMDAKLSNkZWZpbmUgX19JQTY0X0JSRUFLX0pQUk9CRQkJMHg4MDMwMAorI2RlZmluZSBfX0lBNjRfQlJFQUtfS1BST0JFCQkweDgxMDAwIC8qIC4uIDB4ODFmZmYgKi8KKyNkZWZpbmUgX19JQTY0X0JSRUFLX0pQUk9CRQkJMHg4MjAwMAogCiAvKgogICogT1Mtc3BlY2lmaWMgYnJlYWsgbnVtYmVyczoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20taWE2NC9jYWNoZWZsdXNoLmgKaW5kZXggZjJkYWNiNC4uNDkwNjkxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9jYWNoZWZsdXNoLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2ljYWNoZV9wYWdlKHZtYSxwYWdlKQkJZG8geyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20taWE2NC9jaGVja3N1bS5oCmluZGV4IDFmMjMwZmYuLjJiNzg1ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2NoZWNrc3VtLmgKQEAgLTEwLDIzICsxMCwyMSBAQAogICogVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLAogICogd2hpY2ggYWx3YXlzIGNoZWNrc3VtIG9uIDQgb2N0ZXQgYm91bmRhcmllcy4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSAodW5zaWduZWQgY2hhciAqIGlwaCwgdW5zaWduZWQgaW50IGlobCk7CitleHRlcm4gX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKIAogLyoKICAqIENvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyIHJldHVybnMgYSAxNi1iaXQKICAqIGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljICh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitleHRlcm4gX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyAoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pOworCQkJCQkgICAgIF9fd3N1bSBzdW0pOwogCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fdGNwdWRwX25vZm9sZCAodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJdW5zaWduZWQgbG9uZyBkYWRkciwKK2V4dGVybiBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkIChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQl1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJdW5zaWduZWQgaW50IHN1bSk7CisJCQkJCV9fd3N1bSBzdW0pOwogCiAvKgogICogQ29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIGEgbWVtb3J5IGJsb2NrIGF0IGJ1ZmYsIGxlbmd0aCBsZW4sCkBAIC00MCw4ICszOCw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsIChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwKLQkJCQkgIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiBTYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdCBjaGVja3N1bXMuCkBAIC00OSwyOCArNDYsMzQgQEAKICAqIEhlcmUgaXQgaXMgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IKICAqIGV2ZW4gYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkuCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKLQkJCQkJCSBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLAorZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkJIGludCBsZW4sIF9fd3N1bSBzdW0sCiAJCQkJCQkgaW50ICplcnJwKTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrIChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKLQkJCQkJICAgICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgICAgICAgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5IGluCiAgKiBpY21wLmMKICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSAodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGxlbik7CitleHRlcm4gX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbik7CiAKIC8qCiAgKiBGb2xkIGEgcGFydGlhbCBjaGVja3N1bSB3aXRob3V0IGFkZGluZyBwc2V1ZG8gaGVhZGVycy4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotY3N1bV9mb2xkICh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gY3N1bSkKIHsKKwl1MzIgc3VtID0gKF9fZm9yY2UgdTMyKWNzdW07CiAJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKIAlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOwotCXJldHVybiB+c3VtOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5zdW07CiB9CiAKKyNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0JMQorc3RydWN0IGluNl9hZGRyOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwlzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCXVuc2lnbmVkIGludCBjc3VtKTsKKwogI2VuZGlmIC8qIF9BU01fSUE2NF9DSEVDS1NVTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2RldmljZS5oIGIvaW5jbHVkZS9hc20taWE2NC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGI2ZGFmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9kZXZpY2UuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpZm5kZWYgX0FTTV9JQTY0X0RFVklDRV9ICisjZGVmaW5lIF9BU01fSUE2NF9ERVZJQ0VfSAorCitzdHJ1Y3QgZGV2X2FyY2hkYXRhIHsKKyNpZmRlZiBDT05GSUdfQUNQSQorCXZvaWQJKmFjcGlfaGFuZGxlOworI2VuZGlmCit9OworCisjZW5kaWYgLyogX0FTTV9JQTY0X0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1pYTY0L2RtYS1tYXBwaW5nLmgKaW5kZXggOTlhOGY4ZS4uZWJkNTg4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvZG1hLW1hcHBpbmcuaApAQCAtNTAsNyArNTAsOCBAQAogZXh0ZXJuIGludCBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1kbWFfY2FjaGVfc3luYyAodm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCitkbWFfY2FjaGVfc3luYyAoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewogCS8qCiAJICogSUEtNjQgaXMgY2FjaGUtY29oZXJlbnQsIHNvIHRoaXMgaXMgbW9zdGx5IGEgbm8tb3AuICBIb3dldmVyLCB3ZSBkbyBuZWVkIHRvCkBAIC01OSw2ICs2MCw2IEBACiAJbWIoKTsKIH0KIAotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkbWFfaGFuZGxlKQkoMSkJLyogYWxsIHdlIGRvIGlzIGNvaGVyZW50IG1lbW9yeS4uLiAqLworI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkLCBoKQkoMSkJLyogYWxsIHdlIGRvIGlzIGNvaGVyZW50IG1lbW9yeS4uLiAqLwogCiAjZW5kaWYgLyogX0FTTV9JQTY0X0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWlhNjQvZnV0ZXguaAppbmRleCAwN2Q3N2YzLi44YTk4YTI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9mdXRleC5oCkBAIC01OSw3ICs1OSw3IEBACiAJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCiAJc3dpdGNoIChvcCkgewogCWNhc2UgRlVURVhfT1BfU0VUOgpAQCAtODMsNyArODMsNyBAQAogCQlyZXQgPSAtRU5PU1lTOwogCX0KIAotCWRlY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2VuYWJsZSgpOwogCiAJaWYgKCFyZXQpIHsKIAkJc3dpdGNoIChjbXApIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW8uaCBiL2luY2x1ZGUvYXNtLWlhNjQvaW8uaAppbmRleCA0M2JmZmY2Li42MzExZTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pby5oCkBAIC0zMiw3ICszMiw3IEBACiAgKi8KICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQJCTB4ZmZmZmZmZmZmZmZmZmZmZlVMCiAKLSNkZWZpbmUgTUFYX0lPX1NQQUNFU19CSVRTCQk0CisjZGVmaW5lIE1BWF9JT19TUEFDRVNfQklUUwkJOAogI2RlZmluZSBNQVhfSU9fU1BBQ0VTCQkJKDFVTCA8PCBNQVhfSU9fU1BBQ0VTX0JJVFMpCiAjZGVmaW5lIElPX1NQQUNFX0JJVFMJCQkyNAogI2RlZmluZSBJT19TUEFDRV9TSVpFCQkJKDFVTCA8PCBJT19TUEFDRV9CSVRTKQpAQCAtNDE3LDYgKzQxNyw4IEBACiAjIGRlZmluZSBvdXRsX3AJCW91dGwKICNlbmRpZgogCisjIGlmZGVmIF9fS0VSTkVMX18KKwogZXh0ZXJuIHZvaWQgX19pb21lbSAqIGlvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBfX2lvbWVtICogaW9yZW1hcF9ub2NhY2hlICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKIApAQCAtNDMwLDggKzQzMiw2IEBACiAjZGVmaW5lIGRtaV9pb3VubWFwKHgsbCkgaW91bm1hcCh4KQogI2RlZmluZSBkbWlfYWxsb2MobCkga21hbGxvYyhsLCBHRlBfQVRPTUlDKQogCi0jIGlmZGVmIF9fS0VSTkVMX18KLQogLyoKICAqIFN0cmluZyB2ZXJzaW9uIG9mIElPIG1lbW9yeSBhY2Nlc3Mgb3BzOgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2tleGVjLmggYi9pbmNsdWRlL2FzbS1pYTY0L2tleGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjMzZiMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQva2V4ZWMuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9BU01fSUE2NF9LRVhFQ19ICisjZGVmaW5lIF9BU01fSUE2NF9LRVhFQ19ICisKKworLyogTWF4aW11bSBwaHlzaWNhbCBhZGRyZXNzIHdlIGNhbiB1c2UgcGFnZXMgZnJvbSAqLworI2RlZmluZSBLRVhFQ19TT1VSQ0VfTUVNT1JZX0xJTUlUICgtMVVMKQorLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiByZWFjaCBpbiBwaHlzaWNhbCBhZGRyZXNzIG1vZGUgKi8KKyNkZWZpbmUgS0VYRUNfREVTVElOQVRJT05fTUVNT1JZX0xJTUlUICgtMVVMKQorLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiB1c2UgZm9yIHRoZSBjb250cm9sIGNvZGUgYnVmZmVyICovCisjZGVmaW5lIEtFWEVDX0NPTlRST0xfTUVNT1JZX0xJTUlUIFRBU0tfU0laRQorCisjZGVmaW5lIEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFICg4MTkyICsgODE5MiArIDQwOTYpCisKKy8qIFRoZSBuYXRpdmUgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEtFWEVDX0FSQ0ggS0VYRUNfQVJDSF9JQV82NAorCisjZGVmaW5lIE1BWF9OT1RFX0JZVEVTIDEwMjQKKworI2RlZmluZSBrZXhlY19mbHVzaF9pY2FjaGVfcGFnZShwYWdlKSBkbyB7IFwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBhZ2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTsgXAorICAgICAgICAgICAgICAgIGZsdXNoX2ljYWNoZV9yYW5nZShwYWdlX2FkZHIsIHBhZ2VfYWRkciArIFBBR0VfU0laRSk7IFwKKyAgICAgICAgfSB3aGlsZSgwKQorCitleHRlcm4gc3RydWN0IGtpbWFnZSAqaWE2NF9raW1hZ2U7CitERUNMQVJFX1BFUl9DUFUodTY0LCBpYTY0X21jYV9wYWxfYmFzZSk7Citjb25zdCBleHRlcm4gdW5zaWduZWQgaW50IHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZTsKK2V4dGVybiB2b2lkIHJlbG9jYXRlX25ld19rZXJuZWwodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKKwkJc3RydWN0IGlhNjRfYm9vdF9wYXJhbSAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3Jhc2hfc2V0dXBfcmVncyhzdHJ1Y3QgcHRfcmVncyAqbmV3cmVncywgc3RydWN0IHB0X3JlZ3MgKm9sZHJlZ3MpCit7Cit9CitleHRlcm4gc3RydWN0IHJlc291cmNlIGVmaV9tZW1tYXBfcmVzOworZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBib290X3BhcmFtX3JlczsKK2V4dGVybiB2b2lkIGtkdW1wX3NtcF9zZW5kX3N0b3Aodm9pZCk7CitleHRlcm4gdm9pZCBrZHVtcF9zbXBfc2VuZF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQga2V4ZWNfZGlzYWJsZV9pb3NhcGljKHZvaWQpOworZXh0ZXJuIHZvaWQgY3Jhc2hfc2F2ZV90aGlzX2NwdSh2b2lkKTsKK3N0cnVjdCByc3ZkX3JlZ2lvbjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGtkdW1wX2ZpbmRfcnN2ZF9yZWdpb24odW5zaWduZWQgbG9uZyBzaXplLAorCQlzdHJ1Y3QgcnN2ZF9yZWdpb24gKnJzdmRfcmVnaW9ucywgaW50IG4pOworZXh0ZXJuIHZvaWQga2R1bXBfY3B1X2ZyZWV6ZShzdHJ1Y3QgdW53X2ZyYW1lX2luZm8gKmluZm8sIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IGtkdW1wX3N0YXR1c1tdOworZXh0ZXJuIGF0b21pY190IGtkdW1wX2NwdV9mcmVlemVkOworZXh0ZXJuIGF0b21pY190IGtkdW1wX2luX3Byb2dyZXNzOworCisjZW5kaWYgLyogX0FTTV9JQTY0X0tFWEVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKaW5kZXggMWI0NWI3MS4uODI4YWUwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKQEAgLTExNSw2ICsxMTUsNyBAQAogICNkZWZpbmUgSU5TVF9GTEFHX0JSRUFLX0lOU1QJCQk0CiAgCXVuc2lnbmVkIGxvbmcgaW5zdF9mbGFnOwogIAl1bnNpZ25lZCBzaG9ydCB0YXJnZXRfYnJfcmVnOworCXVuc2lnbmVkIHNob3J0IHNsb3Q7CiB9OwogCiBleHRlcm4gaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvbWFjaHZlYy5oCmluZGV4IDdmZmJkZGYuLmEzODkxZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvbWFjaHZlYy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvbWFjaHZlYy5oCkBAIC0zNiw2ICszNiw4IEBACiB0eXBlZGVmIGludCBpYTY0X212X3BjaV9sZWdhY3lfd3JpdGVfdCAoc3RydWN0IHBjaV9idXMgKiwgdTE2IHBvcnQsIHUzMiB2YWwsCiAJCQkJCXU4IHNpemUpOwogdHlwZWRlZiB2b2lkIGlhNjRfbXZfbWlncmF0ZV90KHN0cnVjdCB0YXNrX3N0cnVjdCAqIHRhc2spOwordHlwZWRlZiB2b2lkIGlhNjRfbXZfcGNpX2ZpeHVwX2J1c190IChzdHJ1Y3QgcGNpX2J1cyAqKTsKK3R5cGVkZWYgdm9pZCBpYTY0X212X2tlcm5lbF9sYXVuY2hfZXZlbnRfdCh2b2lkKTsKIAogLyogRE1BLW1hcHBpbmcgaW50ZXJmYWNlOiAqLwogdHlwZWRlZiB2b2lkIGlhNjRfbXZfZG1hX2luaXQgKHZvaWQpOwpAQCAtOTUsNiArOTcsMTEgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkCittYWNodmVjX25vb3BfYnVzIChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworfQorCiBleHRlcm4gdm9pZCBtYWNodmVjX3NldHVwIChjaGFyICoqKTsKIGV4dGVybiB2b2lkIG1hY2h2ZWNfdGltZXJfaW50ZXJydXB0IChpbnQsIHZvaWQgKik7CiBleHRlcm4gdm9pZCBtYWNodmVjX2RtYV9zeW5jX3NpbmdsZSAoc3RydWN0IGRldmljZSAqLCBkbWFfYWRkcl90LCBzaXplX3QsIGludCk7CkBAIC0xNTksNiArMTY2LDcgQEAKICMgIGRlZmluZSBwbGF0Zm9ybV9taWdyYXRlCQlpYTY0X212Lm1pZ3JhdGUKICMgIGRlZmluZSBwbGF0Zm9ybV9zZXR1cF9tc2lfaXJxCWlhNjRfbXYuc2V0dXBfbXNpX2lycQogIyAgZGVmaW5lIHBsYXRmb3JtX3RlYXJkb3duX21zaV9pcnEJaWE2NF9tdi50ZWFyZG93bl9tc2lfaXJxCisjICBkZWZpbmUgcGxhdGZvcm1fcGNpX2ZpeHVwX2J1cwlpYTY0X212LnBjaV9maXh1cF9idXMKICMgZW5kaWYKIAogLyogX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oMTYpKSkgaXMgcmVxdWlyZWQgdG8gbWFrZSBzaXplIG9mIHRoZQpAQCAtMjEwLDYgKzIxOCw4IEBACiAJaWE2NF9tdl9taWdyYXRlX3QgKm1pZ3JhdGU7CiAJaWE2NF9tdl9zZXR1cF9tc2lfaXJxX3QgKnNldHVwX21zaV9pcnE7CiAJaWE2NF9tdl90ZWFyZG93bl9tc2lfaXJxX3QgKnRlYXJkb3duX21zaV9pcnE7CisJaWE2NF9tdl9wY2lfZml4dXBfYnVzX3QgKnBjaV9maXh1cF9idXM7CisJaWE2NF9tdl9rZXJuZWxfbGF1bmNoX2V2ZW50X3QgKmtlcm5lbF9sYXVuY2hfZXZlbnQ7CiB9IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDE2KSkpOyAvKiBhbGlnbiBhdHRyaWI/IHNlZSBhYm92ZSBjb21tZW50ICovCiAKICNkZWZpbmUgTUFDSFZFQ19JTklUKG5hbWUpCQkJXApAQCAtMjU3LDYgKzI2Nyw3IEBACiAJcGxhdGZvcm1fbWlncmF0ZSwJCQlcCiAJcGxhdGZvcm1fc2V0dXBfbXNpX2lycSwJCQlcCiAJcGxhdGZvcm1fdGVhcmRvd25fbXNpX2lycSwJCVwKKwlwbGF0Zm9ybV9wY2lfZml4dXBfYnVzLAkJCVwKIH0KIAogZXh0ZXJuIHN0cnVjdCBpYTY0X21hY2hpbmVfdmVjdG9yIGlhNjRfbXY7CkBAIC0zMDksNiArMzIwLDkgQEAKICNpZm5kZWYgcGxhdGZvcm1fdGxiX21pZ3JhdGVfZmluaXNoCiAjIGRlZmluZSBwbGF0Zm9ybV90bGJfbWlncmF0ZV9maW5pc2gJbWFjaHZlY19ub29wX21tCiAjZW5kaWYKKyNpZm5kZWYgcGxhdGZvcm1fa2VybmVsX2xhdW5jaF9ldmVudAorIyBkZWZpbmUgcGxhdGZvcm1fa2VybmVsX2xhdW5jaF9ldmVudAltYWNodmVjX25vb3AKKyNlbmRpZgogI2lmbmRlZiBwbGF0Zm9ybV9kbWFfaW5pdAogIyBkZWZpbmUgcGxhdGZvcm1fZG1hX2luaXQJCXN3aW90bGJfaW5pdAogI2VuZGlmCkBAIC00MTYsNSArNDMwLDggQEAKICNpZm5kZWYgcGxhdGZvcm1fdGVhcmRvd25fbXNpX2lycQogIyBkZWZpbmUgcGxhdGZvcm1fdGVhcmRvd25fbXNpX2lycQkoKGlhNjRfbXZfdGVhcmRvd25fbXNpX2lycV90KilOVUxMKQogI2VuZGlmCisjaWZuZGVmIHBsYXRmb3JtX3BjaV9maXh1cF9idXMKKyMgZGVmaW5lIHBsYXRmb3JtX3BjaV9maXh1cF9idXMJbWFjaHZlY19ub29wX2J1cworI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfTUFDSFZFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWNfc24yLmggYi9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWNfc24yLmgKaW5kZXggYzU0YjE2NS4uZWFhMmZjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjX3NuMi5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvbWFjaHZlY19zbjIuaApAQCAtNjcsOCArNjcsMTAgQEAKIGV4dGVybiBpYTY0X212X2RtYV9tYXBwaW5nX2Vycm9yCXNuX2RtYV9tYXBwaW5nX2Vycm9yOwogZXh0ZXJuIGlhNjRfbXZfZG1hX3N1cHBvcnRlZAkJc25fZG1hX3N1cHBvcnRlZDsKIGV4dGVybiBpYTY0X212X21pZ3JhdGVfdAkJc25fbWlncmF0ZTsKK2V4dGVybiBpYTY0X212X2tlcm5lbF9sYXVuY2hfZXZlbnRfdAlzbl9rZXJuZWxfbGF1bmNoX2V2ZW50OwogZXh0ZXJuIGlhNjRfbXZfc2V0dXBfbXNpX2lycV90CQlzbl9zZXR1cF9tc2lfaXJxOwogZXh0ZXJuIGlhNjRfbXZfdGVhcmRvd25fbXNpX2lycV90CXNuX3RlYXJkb3duX21zaV9pcnE7CitleHRlcm4gaWE2NF9tdl9wY2lfZml4dXBfYnVzX3QJCXNuX3BjaV9maXh1cF9idXM7CiAKIAogLyoKQEAgLTEyMCw2ICsxMjIsNyBAQAogI2RlZmluZSBwbGF0Zm9ybV9kbWFfbWFwcGluZ19lcnJvcgkJc25fZG1hX21hcHBpbmdfZXJyb3IKICNkZWZpbmUgcGxhdGZvcm1fZG1hX3N1cHBvcnRlZAkJc25fZG1hX3N1cHBvcnRlZAogI2RlZmluZSBwbGF0Zm9ybV9taWdyYXRlCQlzbl9taWdyYXRlCisjZGVmaW5lIHBsYXRmb3JtX2tlcm5lbF9sYXVuY2hfZXZlbnQgICAgc25fa2VybmVsX2xhdW5jaF9ldmVudAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAjZGVmaW5lIHBsYXRmb3JtX3NldHVwX21zaV9pcnEJCXNuX3NldHVwX21zaV9pcnEKICNkZWZpbmUgcGxhdGZvcm1fdGVhcmRvd25fbXNpX2lycQlzbl90ZWFyZG93bl9tc2lfaXJxCkBAIC0xMjcsNiArMTMwLDcgQEAKICNkZWZpbmUgcGxhdGZvcm1fc2V0dXBfbXNpX2lycQkJKChpYTY0X212X3NldHVwX21zaV9pcnFfdCopTlVMTCkKICNkZWZpbmUgcGxhdGZvcm1fdGVhcmRvd25fbXNpX2lycQkoKGlhNjRfbXZfdGVhcmRvd25fbXNpX2lycV90KilOVUxMKQogI2VuZGlmCisjZGVmaW5lIHBsYXRmb3JtX3BjaV9maXh1cF9idXMJCXNuX3BjaV9maXh1cF9idXMKIAogI2luY2x1ZGUgPGFzbS9zbi9pby5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L21lbWluaXQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvbWVtaW5pdC5oCmluZGV4IGMzYjFmODYuLmM4ZGY3NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvbWVtaW5pdC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvbWVtaW5pdC5oCkBAIC0xNSwxMSArMTUsMTIgQEAKICAqIAktIGluaXRyZCAob3B0aW9uYWwpCiAgKiAJLSBjb21tYW5kIGxpbmUgc3RyaW5nCiAgKiAJLSBrZXJuZWwgY29kZSAmIGRhdGEKKyAqIAktIGNyYXNoIGR1bXBpbmcgY29kZSByZXNlcnZlZCByZWdpb24KICAqIAktIEtlcm5lbCBtZW1vcnkgbWFwIGJ1aWx0IGZyb20gRUZJIG1lbW9yeSBtYXAKICAqCiAgKiBNb3JlIGNvdWxkIGJlIGFkZGVkIGlmIG5lY2Vzc2FyeQogICovCi0jZGVmaW5lIElBNjRfTUFYX1JTVkRfUkVHSU9OUyA2CisjZGVmaW5lIElBNjRfTUFYX1JTVkRfUkVHSU9OUyA3CiAKIHN0cnVjdCByc3ZkX3JlZ2lvbiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBlbGVtZW50ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oCmluZGV4IDk0N2NiNzIuLjQ4NTc1OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oCkBAIC0xMDEsNyArMTAxLDcgQEAKIAogI2lmZGVmIENPTkZJR19WSVJUVUFMX01FTV9NQVAKIGV4dGVybiBpbnQgaWE2NF9wZm5fdmFsaWQgKHVuc2lnbmVkIGxvbmcgcGZuKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX0ZMQVRNRU0pCisjZWxzZQogIyBkZWZpbmUgaWE2NF9wZm5fdmFsaWQocGZuKSAxCiAjZW5kaWYKIApAQCAtMTEwLDEyICsxMTAsMTEgQEAKICNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCiAjIGRlZmluZSBwYWdlX3RvX3BmbihwYWdlKQkoKHVuc2lnbmVkIGxvbmcpIChwYWdlIC0gdm1lbV9tYXApKQogIyBkZWZpbmUgcGZuX3RvX3BhZ2UocGZuKQkodm1lbV9tYXAgKyAocGZuKSkKKyNlbHNlCisjIGluY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgogI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0ZMQVRNRU0pIHx8IGRlZmluZWQoQ09ORklHX1NQQVJTRU1FTSkKLS8qIEZMQVRNRU0gYWx3YXlzIGNvbmZpZ3VyZXMgbWVtX21hcCAobWVtX21hcCA9IHZtZW1fbWFwIGlmIG5lY2Vzc2FyeSkgKi8KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRkxBVE1FTQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGFsLmgKaW5kZXggMmM4ZmQ5Mi4uYmM3NjgxNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BhbC5oCkBAIC0yMCw2ICsyMCw4IEBACiAgKiAwMC8wNS8yNCAgICAgZXJhbmlhbiBVcGRhdGVkIHRvIGxhdGVzdCBQQUwgc3BlYywgZml4IHN0cnVjdHVyZXMgYnVncywgYWRkZWQKICAqIDAwLzA1LzI1CWVyYW5pYW4gU3VwcG9ydCBmb3Igc3RhY2sgY2FsbHMsIGFuZCBzdGF0aWMgcGh5c2ljYWwgY2FsbHMKICAqIDAwLzA2LzE4CWVyYW5pYW4gU3VwcG9ydCBmb3Igc3RhY2tlZCBwaHlzaWNhbCBjYWxscworICogMDYvMTAvMjYJcmphCVN1cHBvcnQgZm9yIEludGVsIEl0YW5pdW0gQXJjaGl0ZWN0dXJlIFNvZnR3YXJlIERldmVsb3BlcidzCisgKgkJCU1hbnVhbCBSZXYgMi4yIChKYW4gMjAwNikKICAqLwogCiAvKgpAQCAtNjksNiArNzEsOCBAQAogI2RlZmluZSBQQUxfUFJFRkVUQ0hfVklTSUJJTElUWQk0MQkvKiBNYWtlIFByb2Nlc3NvciBQcmVmZXRjaGVzIFZpc2libGUgKi8KICNkZWZpbmUgUEFMX0xPR0lDQUxfVE9fUEhZU0lDQUwgNDIJLyogcmV0dXJucyBpbmZvcm1hdGlvbiBvbiBsb2dpY2FsIHRvIHBoeXNpY2FsIHByb2Nlc3NvciBtYXBwaW5nICovCiAjZGVmaW5lIFBBTF9DQUNIRV9TSEFSRURfSU5GTwk0MwkvKiByZXR1cm5zIGluZm9ybWF0aW9uIG9uIGNhY2hlcyBzaGFyZWQgYnkgbG9naWNhbCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgUEFMX0dFVF9IV19QT0xJQ1kJNDgJLyogR2V0IGN1cnJlbnQgaGFyZHdhcmUgcmVzb3VyY2Ugc2hhcmluZyBwb2xpY3kgKi8KKyNkZWZpbmUgUEFMX1NFVF9IV19QT0xJQ1kJNDkJLyogU2V0IGN1cnJlbnQgaGFyZHdhcmUgcmVzb3VyY2Ugc2hhcmluZyBwb2xpY3kgKi8KIAogI2RlZmluZSBQQUxfQ09QWV9QQUwJCTI1NgkvKiByZWxvY2F0ZSBQQUwgcHJvY2VkdXJlcyBhbmQgUEFMIFBNSSAqLwogI2RlZmluZSBQQUxfSEFMVF9JTkZPCQkyNTcJLyogcmV0dXJuIHRoZSBsb3cgcG93ZXIgY2FwYWJpbGl0aWVzIG9mIHByb2Nlc3NvciAqLwpAQCAtODAsNiArODQsMTEgQEAKICNkZWZpbmUgUEFMX1NFVF9QU1RBVEUJCTI2MwkvKiBzZXQgdGhlIFAtc3RhdGUgKi8KICNkZWZpbmUgUEFMX0JSQU5EX0lORk8JCTI3NAkvKiBQcm9jZXNzb3IgYnJhbmRpbmcgaW5mb3JtYXRpb24gKi8KIAorI2RlZmluZSBQQUxfR0VUX1BTVEFURV9UWVBFX0xBU1RTRVQJMAorI2RlZmluZSBQQUxfR0VUX1BTVEFURV9UWVBFX0FWR0FORFJFU0VUCTEKKyNkZWZpbmUgUEFMX0dFVF9QU1RBVEVfVFlQRV9BVkdOT1JFU0VUCTIKKyNkZWZpbmUgUEFMX0dFVF9QU1RBVEVfVFlQRV9JTlNUQU5UCTMKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xMDIsNiArMTExLDcgQEAKIAkJCQkJCSAqIGNhY2hlIHdpdGhvdXQgc2lkZWVmZmVjdHMKIAkJCQkJCSAqIGFuZCAicmVzdHJpY3QiIHdhcyAxCiAJCQkJCQkgKi8KKyNkZWZpbmUgUEFMX1NUQVRVU19SRVFVSVJFU19NRU1PUlkJKC05KQkvKiBDYWxsIHJlcXVpcmVzIFBBTCBtZW1vcnkgYnVmZmVyICovCiAKIC8qIFByb2Nlc3NvciBjYWNoZSBsZXZlbCBpbiB0aGUgaGVpcmFyY2h5ICovCiB0eXBlZGVmIHU2NAkJCQlwYWxfY2FjaGVfbGV2ZWxfdDsKQEAgLTQ1Niw3ICs0NjYsOSBAQAogCQkJCQkJICogYnkgdGhlIHByb2Nlc3NvcgogCQkJCQkJICovCiAKLQkJCXJlc2VydmVkMgk6IDExLAorCQkJc2UJCTogMSwJLyogU2hhcmVkIGVycm9yLiAgTUNBIGluIGEKKwkJCQkJCSAgIHNoYXJlZCBzdHJ1Y3R1cmUgKi8KKwkJCXJlc2VydmVkMgk6IDEwLAogCQkJY2MJCTogMSwJLyogQ2FjaGUgY2hlY2sgKi8KIAkJCXRjCQk6IDEsCS8qIFRMQiBjaGVjayAqLwogCQkJYmMJCTogMSwJLyogQnVzIGNoZWNrICovCkBAIC00ODcsMTAgKzQ5OSwxMiBAQAogCQkJCQkJICogZXJyb3Igb2NjdXJyZWQKIAkJCQkJCSAqLwogCQkJd2l2CQk6IDEsCS8qIFdheSBmaWVsZCB2YWxpZCAqLwotCQkJcmVzZXJ2ZWQyCTogMTAsCisJCQlyZXNlcnZlZDIJOiAxLAorCQkJZHAJCTogMSwJLyogRGF0YSBwb2lzb25lZCBvbiBNQkUgKi8KKwkJCXJlc2VydmVkMwk6IDgsCiAKIAkJCWluZGV4CQk6IDIwLAkvKiBDYWNoZSBsaW5lIGluZGV4ICovCi0JCQlyZXNlcnZlZDMJOiAyLAorCQkJcmVzZXJ2ZWQ0CTogMiwKIAogCQkJaXMJCTogMSwJLyogaW5zdHJ1Y3Rpb24gc2V0ICgxID09IGlhMzIpICovCiAJCQlpdgkJOiAxLAkvKiBpbnN0cnVjdGlvbiBzZXQgZmllbGQgdmFsaWQgKi8KQEAgLTU1Nyw3ICs1NzEsNyBAQAogCQkJdHlwZQkJOiA4LAkvKiBCdXMgeGFjdGlvbiB0eXBlKi8KIAkJCXNldgkJOiA1LAkvKiBCdXMgZXJyb3Igc2V2ZXJpdHkqLwogCQkJaGllcgkJOiAyLAkvKiBCdXMgaGllcmFyY2h5IGxldmVsICovCi0JCQlyZXNlcnZlZDEJOiAxLAorCQkJZHAJCTogMSwJLyogRGF0YSBwb2lzb25lZCBvbiBNQkUgKi8KIAkJCWJzaQkJOiA4LAkvKiBCdXMgZXJyb3Igc3RhdHVzCiAJCQkJCQkgKiBpbmZvCiAJCQkJCQkgKi8KQEAgLTc2NCw3ICs3NzgsNyBAQAogICogKGdlbmVyYWxseSAwKSBNVVNUIGJlIHBhc3NlZC4gIFJlc2VydmVkIHBhcmFtZXRlcnMgYXJlIG5vdCBvcHRpb25hbAogICogcGFyYW1ldGVycy4KICAqLwotZXh0ZXJuIHN0cnVjdCBpYTY0X3BhbF9yZXR2YWwgaWE2NF9wYWxfY2FsbF9zdGF0aWMgKHU2NCwgdTY0LCB1NjQsIHU2NCwgdTY0KTsKK2V4dGVybiBzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsIGlhNjRfcGFsX2NhbGxfc3RhdGljICh1NjQsIHU2NCwgdTY0LCB1NjQpOwogZXh0ZXJuIHN0cnVjdCBpYTY0X3BhbF9yZXR2YWwgaWE2NF9wYWxfY2FsbF9zdGFja2VkICh1NjQsIHU2NCwgdTY0LCB1NjQpOwogZXh0ZXJuIHN0cnVjdCBpYTY0X3BhbF9yZXR2YWwgaWE2NF9wYWxfY2FsbF9waHlzX3N0YXRpYyAodTY0LCB1NjQsIHU2NCwgdTY0KTsKIGV4dGVybiBzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsIGlhNjRfcGFsX2NhbGxfcGh5c19zdGFja2VkICh1NjQsIHU2NCwgdTY0LCB1NjQpOwpAQCAtNzc0LDE0ICs3ODgsNyBAQAogI2RlZmluZSBQQUxfQ0FMTChpcHJ2LGEwLGExLGEyLGEzKSBkbyB7CQkJXAogCXN0cnVjdCBpYTY0X2ZwcmVnIGZyWzZdOwkJCVwKIAlpYTY0X3NhdmVfc2NyYXRjaF9mcHJlZ3MoZnIpOwkJCVwKLQlpcHJ2ID0gaWE2NF9wYWxfY2FsbF9zdGF0aWMoYTAsIGExLCBhMiwgYTMsIDApOwlcCi0JaWE2NF9sb2FkX3NjcmF0Y2hfZnByZWdzKGZyKTsJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFBBTF9DQUxMX0lDX09GRihpcHJ2LGEwLGExLGEyLGEzKSBkbyB7CQlcCi0Jc3RydWN0IGlhNjRfZnByZWcgZnJbNl07CQkJXAotCWlhNjRfc2F2ZV9zY3JhdGNoX2ZwcmVncyhmcik7CQkJXAotCWlwcnYgPSBpYTY0X3BhbF9jYWxsX3N0YXRpYyhhMCwgYTEsIGEyLCBhMywgMSk7CVwKKwlpcHJ2ID0gaWE2NF9wYWxfY2FsbF9zdGF0aWMoYTAsIGExLCBhMiwgYTMpOwlcCiAJaWE2NF9sb2FkX3NjcmF0Y2hfZnByZWdzKGZyKTsJCQlcCiB9IHdoaWxlICgwKQogCkBAIC04NDEsNyArODQ4LDkgQEAKIAkJdTY0CXBiZl9yZXFfYnVzX3BhcmtpbmcJCQk6CTE7CiAJCXU2NAlwYmZfYnVzX2xvY2tfbWFzawkJCToJMTsKIAkJdTY0CXBiZl9lbmFibGVfaGFsZl94ZmVyX3JhdGUJCToJMTsKLQkJdTY0CXBiZl9yZXNlcnZlZDIJCQkJOgkyMjsKKwkJdTY0CXBiZl9yZXNlcnZlZDIJCQkJOgkyMDsKKwkJdTY0CXBiZl9lbmFibGVfc2hhcmVkX2xpbmVfcmVwbGFjZQkJOgkxOworCQl1NjQJcGJmX2VuYWJsZV9leGNsdXNpdmVfbGluZV9yZXBsYWNlCToJMTsKIAkJdTY0CXBiZl9kaXNhYmxlX3hhY3Rpb25fcXVldWVpbmcJCToJMTsKIAkJdTY0CXBiZl9kaXNhYmxlX3Jlc3BfZXJyX2NoZWNrCQk6CTE7CiAJCXU2NAlwYmZfZGlzYWJsZV9iZXJyX2NoZWNrCQkJOgkxOwpAQCAtMTA4NCw2ICsxMDkzLDI0IEBACiAJcmV0dXJuIGlwcnYuc3RhdHVzOwogfQogCisvKgorICogR2V0IHRoZSBjdXJyZW50IGhhcmR3YXJlIHJlc291cmNlIHNoYXJpbmcgcG9saWN5IG9mIHRoZSBwcm9jZXNzb3IKKyAqLworc3RhdGljIGlubGluZSBzNjQKK2lhNjRfcGFsX2dldF9od19wb2xpY3kgKHU2NCBwcm9jX251bSwgdTY0ICpjdXJfcG9saWN5LCB1NjQgKm51bV9pbXBhY3RlZCwKKwkJCXU2NCAqbGEpCit7CisJc3RydWN0IGlhNjRfcGFsX3JldHZhbCBpcHJ2OworCVBBTF9DQUxMKGlwcnYsIFBBTF9HRVRfSFdfUE9MSUNZLCBwcm9jX251bSwgMCwgMCk7CisJaWYgKGN1cl9wb2xpY3kpCisJCSpjdXJfcG9saWN5ID0gaXBydi52MDsKKwlpZiAobnVtX2ltcGFjdGVkKQorCQkqbnVtX2ltcGFjdGVkID0gaXBydi52MTsKKwlpZiAobGEpCisJCSpsYSA9IGlwcnYudjI7CisJcmV0dXJuIGlwcnYuc3RhdHVzOworfQorCiAvKiBNYWtlIHRoZSBwcm9jZXNzb3IgZW50ZXIgSEFMVCBvciBvbmUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCBsb3cKICAqIHBvd2VyIHN0YXRlcyB3aGVyZSBwcmVmZXRjaGluZyBhbmQgZXhlY3V0aW9uIGFyZSBzdXNwZW5kZWQgYW5kIGNhY2hlIGFuZAogICogVExCIGNvaGVyZW5jeSBpcyBub3QgbWFpbnRhaW5lZC4KQEAgLTExMTksMTAgKzExNDYsMTAgQEAKIAogLyogR2V0IHRoZSBjdXJyZW50IFAtc3RhdGUgaW5mb3JtYXRpb24gKi8KIHN0YXRpYyBpbmxpbmUgczY0Ci1pYTY0X3BhbF9nZXRfcHN0YXRlICh1NjQgKnBzdGF0ZV9pbmRleCkKK2lhNjRfcGFsX2dldF9wc3RhdGUgKHU2NCAqcHN0YXRlX2luZGV4LCB1bnNpZ25lZCBsb25nIHR5cGUpCiB7CiAJc3RydWN0IGlhNjRfcGFsX3JldHZhbCBpcHJ2OwotCVBBTF9DQUxMX1NUSyhpcHJ2LCBQQUxfR0VUX1BTVEFURSwgMCwgMCwgMCk7CisJUEFMX0NBTExfU1RLKGlwcnYsIFBBTF9HRVRfUFNUQVRFLCB0eXBlLCAwLCAwKTsKIAkqcHN0YXRlX2luZGV4ID0gaXBydi52MDsKIAlyZXR1cm4gaXBydi5zdGF0dXM7CiB9CkBAIC0xNDA4LDYgKzE0MzUsMTcgQEAKIAlyZXR1cm4gaXBydi5zdGF0dXM7CiB9CiAKKy8qCisgKiBTZXQgdGhlIGN1cnJlbnQgaGFyZHdhcmUgcmVzb3VyY2Ugc2hhcmluZyBwb2xpY3kgb2YgdGhlIHByb2Nlc3NvcgorICovCitzdGF0aWMgaW5saW5lIHM2NAoraWE2NF9wYWxfc2V0X2h3X3BvbGljeSAodTY0IHBvbGljeSkKK3sKKwlzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsIGlwcnY7CisJUEFMX0NBTEwoaXBydiwgUEFMX1NFVF9IV19QT0xJQ1ksIHBvbGljeSwgMCwgMCk7CisJcmV0dXJuIGlwcnYuc3RhdHVzOworfQorCiAvKiBDYXVzZSB0aGUgcHJvY2Vzc29yIHRvIGVudGVyCVNIVVRET1dOIHN0YXRlLCB3aGVyZSBwcmVmZXRjaGluZyBhbmQgZXhlY3V0aW9uIGFyZQogICogc3VzcGVuZGVkLCBidXQgY2F1c2UgY2FjaGUgYW5kIFRMQiBjb2hlcmVuY3kgdG8gYmUgbWFpbnRhaW5lZC4KICAqIFRoaXMgaXMgdXN1YWxseSBjYWxsZWQgaW4gSUEtMzIgbW9kZS4KQEAgLTE1MzEsMTIgKzE1NjksMTUgQEAKIAl9IHBhbF92bV9pbmZvXzFfczsKIH0gcGFsX3ZtX2luZm9fMV91X3Q7CiAKKyNkZWZpbmUgUEFMX01BWF9QVVJHRVMJCTB4RkZGRgkJLyogYWxsIG9uZXMgaXMgbWVhbnMgdW5saW1pdGVkICovCisKIHR5cGVkZWYgdW5pb24gcGFsX3ZtX2luZm9fMl91IHsKIAl1NjQJCQlwdmkyX3ZhbDsKIAlzdHJ1Y3QgewogCQl1NjQJCWltcGxfdmFfbXNiCTogOCwKIAkJCQlyaWRfc2l6ZQk6IDgsCi0JCQkJcmVzZXJ2ZWQJOiA0ODsKKwkJCQltYXhfcHVyZ2VzCTogMTYsCisJCQkJcmVzZXJ2ZWQJOiAzMjsKIAl9IHBhbF92bV9pbmZvXzJfczsKIH0gcGFsX3ZtX2luZm9fMl91X3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oCmluZGV4IGVmNjE2ZmQuLjU1NmY1M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wY2kuaApAQCAtMjYsMTYgKzI2LDE4IEBACiBzdHJ1Y3QgcGNpX2RldjsKIAogLyoKLSAqIFBDSV9ETUFfQlVTX0lTX1BIWVMgc2hvdWxkIGJlIHNldCB0byAxIGlmIHRoZXJlIGlzIF9uZWNlc3NhcmlseV8gYSBkaXJlY3QgY29ycmVzcG9uZGVuY2UKLSAqIGJldHdlZW4gZGV2aWNlIGJ1cyBhZGRyZXNzZXMgYW5kIENQVSBwaHlzaWNhbCBhZGRyZXNzZXMuICBQbGF0Zm9ybXMgd2l0aCBhIGhhcmR3YXJlIEkvTwotICogTU1VIF9tdXN0XyB0dXJuIHRoaXMgb2ZmIHRvIHN1cHByZXNzIHRoZSBib3VuY2UgYnVmZmVyIGhhbmRsaW5nIGNvZGUgaW4gdGhlIGJsb2NrIGFuZAotICogbmV0d29yayBkZXZpY2UgbGF5ZXJzLiAgUGxhdGZvcm1zIHdpdGggc2VwYXJhdGUgYnVzIGFkZHJlc3Mgc3BhY2VzIF9tdXN0XyB0dXJuIHRoaXMgb2ZmCi0gKiBhbmQgcHJvdmlkZSBhIGRldmljZSBETUEgbWFwcGluZyBpbXBsZW1lbnRhdGlvbiB0aGF0IHRha2VzIGNhcmUgb2YgdGhlIG5lY2Vzc2FyeQorICogUENJX0RNQV9CVVNfSVNfUEhZUyBzaG91bGQgYmUgc2V0IHRvIDEgaWYgdGhlcmUgaXMgX25lY2Vzc2FyaWx5XyBhIGRpcmVjdAorICogY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBkZXZpY2UgYnVzIGFkZHJlc3NlcyBhbmQgQ1BVIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqIFBsYXRmb3JtcyB3aXRoIGEgaGFyZHdhcmUgSS9PIE1NVSBfbXVzdF8gdHVybiB0aGlzIG9mZiB0byBzdXBwcmVzcyB0aGUKKyAqIGJvdW5jZSBidWZmZXIgaGFuZGxpbmcgY29kZSBpbiB0aGUgYmxvY2sgYW5kIG5ldHdvcmsgZGV2aWNlIGxheWVycy4KKyAqIFBsYXRmb3JtcyB3aXRoIHNlcGFyYXRlIGJ1cyBhZGRyZXNzIHNwYWNlcyBfbXVzdF8gdHVybiB0aGlzIG9mZiBhbmQgcHJvdmlkZQorICogYSBkZXZpY2UgRE1BIG1hcHBpbmcgaW1wbGVtZW50YXRpb24gdGhhdCB0YWtlcyBjYXJlIG9mIHRoZSBuZWNlc3NhcnkKICAqIGFkZHJlc3MgdHJhbnNsYXRpb24uCiAgKgotICogRm9yIG5vdywgdGhlIGlhNjQgcGxhdGZvcm1zIHdoaWNoIG1heSBoYXZlIHNlcGFyYXRlL211bHRpcGxlIGJ1cyBhZGRyZXNzIHNwYWNlcyBhbGwKLSAqIGhhdmUgSS9PIE1NVXMgd2hpY2ggc3VwcG9ydCB0aGUgbWVyZ2luZyBvZiBwaHlzaWNhbGx5IGRpc2NvbnRpZ3VvdXMgYnVmZmVycywgc28gd2UgY2FuCi0gKiB1c2UgdGhhdCBhcyB0aGUgc29sZSBmYWN0b3IgdG8gZGV0ZXJtaW5lIHRoZSBzZXR0aW5nIG9mIFBDSV9ETUFfQlVTX0lTX1BIWVMuCisgKiBGb3Igbm93LCB0aGUgaWE2NCBwbGF0Zm9ybXMgd2hpY2ggbWF5IGhhdmUgc2VwYXJhdGUvbXVsdGlwbGUgYnVzIGFkZHJlc3MKKyAqIHNwYWNlcyBhbGwgaGF2ZSBJL08gTU1VcyB3aGljaCBzdXBwb3J0IHRoZSBtZXJnaW5nIG9mIHBoeXNpY2FsbHkKKyAqIGRpc2NvbnRpZ3VvdXMgYnVmZmVycywgc28gd2UgY2FuIHVzZSB0aGF0IGFzIHRoZSBzb2xlIGZhY3RvciB0byBkZXRlcm1pbmUKKyAqIHRoZSBzZXR0aW5nIG9mIFBDSV9ETUFfQlVTX0lTX1BIWVMuCiAgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIGlhNjRfbWF4X2lvbW11X21lcmdlX21hc2s7CiAjZGVmaW5lIFBDSV9ETUFfQlVTX0lTX1BIWVMJKGlhNjRfbWF4X2lvbW11X21lcmdlX21hc2sgPT0gfjBVTCkKQEAgLTUyLDkgKzU0LDYgQEAKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQogCi0jZGVmaW5lIEhBVkVfQVJDSF9QQ0lfTVdJIDEKLWV4dGVybiBpbnQgcGNpYmlvc19wcmVwX213aSAoc3RydWN0IHBjaV9kZXYgKik7Ci0KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wY2ktZG1hLWNvbXBhdC5oPgogCiAvKiBwY2lfdW5tYXBfe3NpbmdsZSxwYWdlfSBpcyBub3QgYSBub3AsIHRodXMuLi4gKi8KQEAgLTc5LDkgKzc4LDYgQEAKICNkZWZpbmUgcGNpX2RhY19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsZG1hX2FkZHIsbGVuLGRpcikJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBwY2lfZGFjX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldixkbWFfYWRkcixsZW4sZGlyKQlkbyB7IG1iKCk7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgc2dfZG1hX2xlbihzZykJCSgoc2cpLT5kbWFfbGVuZ3RoKQotI2RlZmluZSBzZ19kbWFfYWRkcmVzcyhzZykJKChzZyktPmRtYV9hZGRyZXNzKQotCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wZ2FsbG9jLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BnYWxsb2MuaAppbmRleCA5Y2I2OGU5Li4zOTNlMDRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BnYWxsb2MuaApAQCAtNjAsNyArNjAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHBndGFibGVfcXVpY2tsaXN0X2ZyZWUodm9pZCAqcGd0YWJsZV9lbnRyeSkKIHsKICNpZmRlZiBDT05GSUdfTlVNQQotCXVuc2lnbmVkIGxvbmcgbmlkID0gcGFnZV90b19uaWQodmlydF90b19wYWdlKHBndGFibGVfZW50cnkpKTsKKwlpbnQgbmlkID0gcGFnZV90b19uaWQodmlydF90b19wYWdlKHBndGFibGVfZW50cnkpKTsKIAogCWlmICh1bmxpa2VseShuaWQgIT0gbnVtYV9ub2RlX2lkKCkpKSB7CiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwZ3RhYmxlX2VudHJ5KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc2FsLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NhbC5oCmluZGV4IDBiMjEwYWIuLmQwMDA2ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc2FsLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zYWwuaApAQCAtNjU5LDYgKzY1OSw3IEBACiB9CiAKIGV4dGVybiBzNjQgaWE2NF9zYWxfY2FjaGVfZmx1c2ggKHU2NCBjYWNoZV90eXBlKTsKK2V4dGVybiB2b2lkIF9faW5pdCBjaGVja19zYWxfY2FjaGVfZmx1c2ggKHZvaWQpOwogCiAvKiBJbml0aWFsaXplIGFsbCB0aGUgcHJvY2Vzc29yIGFuZCBwbGF0Zm9ybSBsZXZlbCBpbnN0cnVjdGlvbiBhbmQgZGF0YSBjYWNoZXMgKi8KIHN0YXRpYyBpbmxpbmUgczY0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NjYXR0ZXJsaXN0LmggYi9pbmNsdWRlL2FzbS1pYTY0L3NjYXR0ZXJsaXN0LmgKaW5kZXggODM0YTE4OS4uOWRiZWE4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zY2F0dGVybGlzdC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc2NhdHRlcmxpc3QuaApAQCAtMjUsNCArMjUsNyBAQAogICovCiAjZGVmaW5lIElTQV9ETUFfVEhSRVNIT0xECTB4ZmZmZmZmZmYKIAorI2RlZmluZSBzZ19kbWFfbGVuKHNnKQkJKChzZyktPmRtYV9sZW5ndGgpCisjZGVmaW5lIHNnX2RtYV9hZGRyZXNzKHNnKQkoKHNnKS0+ZG1hX2FkZHJlc3MpCisKICNlbmRpZiAvKiBfQVNNX0lBNjRfU0NBVFRFUkxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9hY3BpLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FjcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODUwYTdlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hY3BpLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfQVNNX0lBNjRfU05fQUNQSV9ICisjZGVmaW5lIF9BU01fSUE2NF9TTl9BQ1BJX0gKKworI2luY2x1ZGUgImFjcGkvYWNnbG9iYWwuaCIKKworI2RlZmluZSBTTl9BQ1BJX0JBU0VfU1VQUE9SVCgpICAgKGFjcGlfZ2JsX0RTRFQtPm9lbV9yZXZpc2lvbiA+PSAweDIwMTAxKQorCisjZW5kaWYgLyogX0FTTV9JQTY0X1NOX0FDUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9hZGRycy5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hZGRycy5oCmluZGV4IDFkOWVmZTUuLmU3MTVjNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vYWRkcnMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FkZHJzLmgKQEAgLTEzNiw5ICsxMzYsMTMgQEAKICAqLwogI2RlZmluZSBUT19QSFlTKHgpCQkoVE9fUEhZU19NQVNLICYgKHgpKQogI2RlZmluZSBUT19DQUMoeCkJCShDQUNfQkFTRSAgICAgfCBUT19QSFlTKHgpKQorI2lmZGVmIENPTkZJR19TR0lfU04KICNkZWZpbmUgVE9fQU1PKHgpCQkoQU1PX0JBU0UgICAgIHwgVE9fUEhZUyh4KSkKICNkZWZpbmUgVE9fR0VUKHgpCQkoR0VUX0JBU0UgICAgIHwgVE9fUEhZUyh4KSkKLQorI2Vsc2UKKyNkZWZpbmUgVE9fQU1PKHgpCQkoeyBCVUcoKTsgeDsgfSkKKyNkZWZpbmUgVE9fR0VUKHgpCQkoeyBCVUcoKTsgeDsgfSkKKyNlbmRpZgogCiAvKgogICogQ292ZXJ0IGZyb20gcHJvY2Vzc29yIHBoeXNpY2FsIGFkZHJlc3MgdG8gSUkvVElPIHBoeXNpY2FsIGFkZHJlc3M6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaAppbmRleCBlYWMzNTYxLi45ZmU4OWE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmgKQEAgLTMsNyArMyw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5MiAtIDE5OTcsIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgLSAxOTk3LCAyMDAwLTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAjaWZuZGVmIF9BU01fSUE2NF9TTl9QQ0lfUENJREVWX0gKICNkZWZpbmUgX0FTTV9JQTY0X1NOX1BDSV9QQ0lERVZfSApAQCAtMTIsMzEgKzEyLDI5IEBACiAKIC8qCiAgKiBJbiBpYTY0LCBwY2lfZGV2LT5zeXNkYXRhIG11c3QgYmUgYSAqcGNpX2NvbnRyb2xsZXIuIFRvIHByb3ZpZGUgYWNjZXNzIHRvCi0gKiB0aGUgcGNpZGV2X2luZm8gc3RydWN0cyBmb3IgYWxsIGRldmljZXMgdW5kZXIgYSBjb250cm9sbGVyLCB3ZSBleHRlbmQgdGhlCi0gKiBkZWZpbml0aW9uIG9mIHBjaV9jb250cm9sbGVyLCB2aWEgc25fcGNpX2NvbnRyb2xsZXIsIHRvIGluY2x1ZGUgYSBsaXN0Ci0gKiBvZiBwY2lkZXZfaW5mby4KKyAqIHRoZSBwY2lkZXZfaW5mbyBzdHJ1Y3RzIGZvciBhbGwgZGV2aWNlcyB1bmRlciBhIGNvbnRyb2xsZXIsIHdlIGtlZXAgYQorICogbGlzdCBvZiBwY2lkZXZfaW5mbyB1bmRlciBwY2lfY29udHJvbGxlci0+cGxhdGZvcm1fZGF0YS4KICAqLwotc3RydWN0IHNuX3BjaV9jb250cm9sbGVyIHsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpX2NvbnRyb2xsZXI7CitzdHJ1Y3Qgc25fcGxhdGZvcm1fZGF0YSB7CisJdm9pZCAqcHJvdmlkZXJfc29mdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBjaWRldl9pbmZvOwogfTsKIAotI2RlZmluZSBTTl9QQ0lfQ09OVFJPTExFUihkZXYpICgoc3RydWN0IHNuX3BjaV9jb250cm9sbGVyICopIGRldi0+c3lzZGF0YSkKKyNkZWZpbmUgU05fUExBVEZPUk1fREFUQShidXNkZXYpIFwKKwkoKHN0cnVjdCBzbl9wbGF0Zm9ybV9kYXRhICopKFBDSV9DT05UUk9MTEVSKGJ1c2RldiktPnBsYXRmb3JtX2RhdGEpKQogCiAjZGVmaW5lIFNOX1BDSURFVl9JTkZPKGRldikJc25fcGNpZGV2X2luZm9fZ2V0KGRldikKIAotI2RlZmluZSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpIFwKLQkoc3RydWN0IHBjaWJ1c19pbmZvICopKChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKikoUENJX0NPTlRST0xMRVIoKHBjaV9idXMpKS0+cGxhdGZvcm1fZGF0YSkpCiAvKgogICogR2l2ZW4gYSBwY2lfYnVzLCByZXR1cm4gdGhlIHNuIHBjaWJ1c19idXNzb2Z0IHN0cnVjdC4gIE5vdGUgdGhhdAogICogdGhpcyBvbmx5IHdvcmtzIGZvciByb290IGJ1c3Nlcywgbm90IGZvciBidXNzZXMgcmVwcmVzZW50ZWQgYnkgUFBCJ3MuCiAgKi8KIAogI2RlZmluZSBTTl9QQ0lCVVNfQlVTU09GVChwY2lfYnVzKSBcCi0gICAgICAgICgoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopKFBDSV9DT05UUk9MTEVSKChwY2lfYnVzKSktPnBsYXRmb3JtX2RhdGEpKQorCSgoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopKFNOX1BMQVRGT1JNX0RBVEEocGNpX2J1cyktPnByb3ZpZGVyX3NvZnQpKQogCiAjZGVmaW5lIFNOX1BDSUJVU19CVVNTT0ZUX0lORk8ocGNpX2J1cykgXAotCShzdHJ1Y3QgcGNpYnVzX2luZm8gKikoKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKShQQ0lfQ09OVFJPTExFUigocGNpX2J1cykpLT5wbGF0Zm9ybV9kYXRhKSkKKwkoKHN0cnVjdCBwY2lidXNfaW5mbyAqKShTTl9QTEFURk9STV9EQVRBKHBjaV9idXMpLT5wcm92aWRlcl9zb2Z0KSkKIC8qCiAgKiBHaXZlbiBhIHN0cnVjdCBwY2lfZGV2LCByZXR1cm4gdGhlIHNuIHBjaWJ1c19idXNzb2Z0IHN0cnVjdC4gIE5vdGUKICAqIHRoYXQgdGhpcyBpcyBub3QgZXF1aXZhbGVudCB0byBTTl9QQ0lCVVNfQlVTU09GVChwY2lfZGV2LT5idXMpIGR1ZQpAQCAtNzIsOCArNzAsNiBAQAogCQkJIHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pOwogZXh0ZXJuIHZvaWQgc25faXJxX3VuZml4dXAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOwogZXh0ZXJuIHN0cnVjdCBwY2lkZXZfaW5mbyAqIHNuX3BjaWRldl9pbmZvX2dldChzdHJ1Y3QgcGNpX2RldiAqKTsKLWV4dGVybiB2b2lkIHNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKGludCBzZWdtZW50LCBpbnQgYnVzbnVtLAotIAkJCQkgICAgc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBleHRlcm4gdm9pZCBzbl9idXNfc3RvcmVfc3lzZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHNuX2J1c19mcmVlX3N5c2RhdGEodm9pZCk7CiBleHRlcm4gdm9pZCBzbl9nZW5lcmF0ZV9wYXRoKHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzLCBjaGFyICphZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fZmVhdHVyZV9zZXRzLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX2ZlYXR1cmVfc2V0cy5oCmluZGV4IDMwZGNmYTQuLmJmZGMzNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fZmVhdHVyZV9zZXRzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9mZWF0dXJlX3NldHMuaApAQCAtNDQsOCArNDQsMTQgQEAKICAqIE9uY2UgZW5hYmxlZCwgYSBmZWF0dXJlIGNhbm5vdCBiZSBkaXNhYmxlZC4KICAqCiAgKiBCeSBkZWZhdWx0LCBmZWF0dXJlcyBhcmUgZGlzYWJsZWQgdW5sZXNzIGV4cGxpY2l0bHkgZW5hYmxlZC4KKyAqCisgKiBUaGVzZSBkZWZpbmVzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKyAqIFBST00gZGVmaW5pdGlvbnMgaW4gZmVhdHVyZV9zZXRzLmguCiAgKi8KICNkZWZpbmUgIE9TRl9NQ0FfU0xWX1RPX09TX0lOSVRfU0xWCTAKICNkZWZpbmUgIE9TRl9GRUFUX0xPR19TQkVTCQkxCisjZGVmaW5lICBPU0ZfQUNQSV9FTkFCTEUJCTIKKyNkZWZpbmUgIE9TRl9QQ0lTRUdNRU5UX0VOQUJMRQkJMworCiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfU05fRkVBVFVSRV9TRVRTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCmluZGV4IGJhODI2YjMuLjJjNDAwNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaApAQCAtNzcsNiArNzcsNyBAQAogI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX1dJREdFVF9ETUFGTFVTSF9MSVNUCSAgIDB4MDIwMDAwNTgJLy8gZGVwcmVjYXRlZAogI2RlZmluZSAgU05fU0FMX0lPSUZfR0VUX0RFVklDRV9ETUFGTFVTSF9MSVNUCSAgIDB4MDIwMDAwNWEKIAorI2RlZmluZSBTTl9TQUxfSU9JRl9JTklUCQkJICAgMHgwMjAwMDA1ZgogI2RlZmluZSBTTl9TQUxfSFVCX0VSUk9SX0lOVEVSUlVQVAkJICAgMHgwMjAwMDA2MAogI2RlZmluZSBTTl9TQUxfQlRFX1JFQ09WRVIJCQkgICAweDAyMDAwMDYxCiAjZGVmaW5lIFNOX1NBTF9SRVNFUlZFRF9ET19OT1RfVVNFCQkgICAweDAyMDAwMDYyCkBAIC04Nyw2ICs4OCw4IEBACiAjZGVmaW5lICBTTl9TQUxfSU5KRUNUX0VSUk9SCQkJICAgMHgwMjAwMDA2NwogI2RlZmluZSAgU05fU0FMX1NFVF9DUFVfTlVNQkVSCQkJICAgMHgwMjAwMDA2OAogCisjZGVmaW5lICBTTl9TQUxfS0VSTkVMX0xBVU5DSF9FVkVOVAkJICAgMHgwMjAwMDA2OQorCiAvKgogICogU2VydmljZS1zcGVjaWZpYyBjb25zdGFudHMKICAqLwpAQCAtMTE1NCw0ICsxMTU3LDExIEBACiAJU0FMX0NBTExfTk9MT0NLKHJ2LCBTTl9TQUxfU0VUX0NQVV9OVU1CRVIsIGNwdSwgMCwgMCwgMCwgMCwgMCwgMCk7CiAJcmV0dXJuIHJ2LnN0YXR1czsKIH0KK3N0YXRpYyBpbmxpbmUgaW50CitpYTY0X3NuX2tlcm5lbF9sYXVuY2hfZXZlbnQodm9pZCkKK3sKKyAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCBydjsKKwlTQUxfQ0FMTF9OT0xPQ0socnYsIFNOX1NBTF9LRVJORUxfTEFVTkNIX0VWRU5ULCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKwlyZXR1cm4gcnYuc3RhdHVzOworfQogI2VuZGlmIC8qIF9BU01fSUE2NF9TTl9TTl9TQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi94cGMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24veHBjLmgKaW5kZXggMWQ0NWUxNS4uZTUyYjg1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi94cGMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwYy5oCkBAIC02NzMsNyArNjczLDcgQEAKIGV4dGVybiB2b2lkIHhwY19kcm9wcGVkX0lQSV9jaGVjayhzdHJ1Y3QgeHBjX3BhcnRpdGlvbiAqKTsKIGV4dGVybiB2b2lkIHhwY19hY3RpdmF0ZV9wYXJ0aXRpb24oc3RydWN0IHhwY19wYXJ0aXRpb24gKik7CiBleHRlcm4gdm9pZCB4cGNfYWN0aXZhdGVfa3RocmVhZHMoc3RydWN0IHhwY19jaGFubmVsICosIGludCk7Ci1leHRlcm4gdm9pZCB4cGNfY3JlYXRlX2t0aHJlYWRzKHN0cnVjdCB4cGNfY2hhbm5lbCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgeHBjX2NyZWF0ZV9rdGhyZWFkcyhzdHJ1Y3QgeHBjX2NoYW5uZWwgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHZvaWQgeHBjX2Rpc2Nvbm5lY3Rfd2FpdChpbnQpOwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWJpdHMuaAppbmRleCBiOWU4NDNmLi40NTMxYTUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oCkBAIC0yNiw2ICsyNiwxNyBAQAogCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwogfTsKIAorc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKIC8qIGNfY2MgY2hhcmFjdGVycyAqLwogI2RlZmluZSBWSU5UUiAwCiAjZGVmaW5lIFZRVUlUIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaAppbmRleCA4YWRjZGUwLi45YjUwNWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oCkBAIC04OCw2ICs4OCw3IEBACiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE3CiAjZGVmaW5lIFRJRl9NQ0FfSU5JVAkJMTgJLyogdGhpcyB0YXNrIGlzIHByb2Nlc3NpbmcgTUNBIG9yIElOSVQgKi8KICNkZWZpbmUgVElGX0RCX0RJU0FCTEVECQkxOQkvKiBkZWJ1ZyB0cmFwIGRpc2FibGVkIGZvciBmc3lzY2FsbCAqLworI2RlZmluZSBUSUZfRlJFRVpFCQkyMAkvKiBpcyBmcmVlemluZyBmb3Igc3VzcGVuZCAqLwogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMSA8PCBUSUZfU1lTQ0FMTF9UUkFDRSkKICNkZWZpbmUgX1RJRl9TWVNDQUxMX0FVRElUCSgxIDw8IFRJRl9TWVNDQUxMX0FVRElUKQpAQCAtOTgsNiArOTksNyBAQAogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxIDw8IFRJRl9QT0xMSU5HX05SRkxBRykKICNkZWZpbmUgX1RJRl9NQ0FfSU5JVAkJKDEgPDwgVElGX01DQV9JTklUKQogI2RlZmluZSBfVElGX0RCX0RJU0FCTEVECSgxIDw8IFRJRl9EQl9ESVNBQkxFRCkKKyNkZWZpbmUgX1RJRl9GUkVFWkUJCSgxIDw8IFRJRl9GUkVFWkUpCiAKIC8qICJ3b3JrIHRvIGRvIG9uIHVzZXItcmV0dXJuIiBiaXRzICovCiAjZGVmaW5lIFRJRl9BTExXT1JLX01BU0sJKF9USUZfTk9USUZZX1JFU1VNRXxfVElGX1NJR1BFTkRJTkd8X1RJRl9ORUVEX1JFU0NIRUR8X1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU1lTQ0FMTF9BVURJVCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaAppbmRleCBhNmUzODU2Li4yMmVkNjc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oCkBAIC0xMDEsNiArMTAxLDcgQEAKIAkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRQlcCiAJCQkJfCBTRF9CQUxBTkNFX0VYRUMJXAogCQkJCXwgU0RfQkFMQU5DRV9GT1JLCVwKKwkJCQl8IFNEX1NFUklBTElaRQkJXAogCQkJCXwgU0RfV0FLRV9CQUxBTkNFLAlcCiAJLmxhc3RfYmFsYW5jZQkJPSBqaWZmaWVzLAkJXAogCS5iYWxhbmNlX2ludGVydmFsCT0gNjQsCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1pYTY0L3VhY2Nlc3MuaAppbmRleCA5YWRiNTEyLi40NDljOGMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3VhY2Nlc3MuaApAQCAtMzg5LDcgKzM4OSw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJY2hhciAqIHB0cjsKIAotCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcCA+PiBQQUdFX1NISUZUKTsKKwlwYWdlID0gdmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKXApOwogCWlmIChQYWdlVW5jYWNoZWQocGFnZSkpCiAJCXB0ciA9IChjaGFyICopX19wYShwKSArIF9fSUE2NF9VTkNBQ0hFRF9PRkZTRVQ7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1tMzJyL2NhY2hlZmx1c2guaAppbmRleCA4YjI2MWI0Li41Njk2MWE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2NhY2hlZmx1c2guaApAQCAtOSw2ICs5LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19DSElQX00zMjcwMCkgfHwgZGVmaW5lZChDT05GSUdfQ0hJUF9PUFNQKSB8fCBkZWZpbmVkKENPTkZJR19DSElQX00zMjEwNCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfYWxsKCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIHBmbikJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKQkJCWRvIHsgfSB3aGlsZSAoMCkKQEAgLTI5LDYgKzMwLDcgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX0NISVBfTTMyMTAyKQogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQpAQCAtNDEsNiArNDMsNyBAQAogI2Vsc2UKICNkZWZpbmUgZmx1c2hfY2FjaGVfYWxsKCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIHBmbikJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKQkJCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLW0zMnIvY2hlY2tzdW0uaAppbmRleCA4NzdlYmY0Li5hN2E3YzRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9jaGVja3N1bS5oCkBAIC0zMSw4ICszMSw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWFzbWxpbmthZ2UgdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLAotCQkJCSAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qCiAgKiBUaGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQgY2hlY2tzdW1zLgpAQCAtNDAsMjQgKzM5LDIyIEBACiAgKiBIZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIFRoaXMgaXMgYSBuZXcgdmVyc2lvbiBvZiB0aGUgYWJvdmUgdGhhdCByZWNvcmRzIGVycm9ycyBpdCBmaW5kcyBpbiAqZXJycCwKICAqIGJ1dCBjb250aW51ZXMgYW5kIHplcm9zIHRocmUgcmVzdCBvZiB0aGUgYnVmZmVyLgogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVycl9wdHIpOwogCiAvKgogICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0KICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBsb25nIHRtcHJlZzsKIAlfX2FzbV9fKApAQCAtNzIsMTYgKzY5LDE3IEBACiAJCTogIjAiICAoc3VtKQogCQk6ICJjYml0IgogCSk7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qCiAgKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKiB3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLAotCQkJCQkgIHVuc2lnbmVkIGludCBpaGwpIHsKLQl1bnNpZ25lZCBsb25nIHN1bSwgdG1wcmVnMCwgdG1wcmVnMTsKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQoreworCXVuc2lnbmVkIGxvbmcgdG1wcmVnMCwgdG1wcmVnMTsKKwlfX3dzdW0gc3VtOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIJbGQJJTAsIEAlMSsgXG4iCkBAIC0xMTUsMTYgKzExMywxNSBAQAogCXJldHVybiBjc3VtX2ZvbGQoc3VtKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHN1bSkKKwkJCQkJICAgICAgIF9fd3N1bSBzdW0pCiB7CiAjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0JdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSAobnRvaHMobGVuKTw8MTYpK3Byb3RvKjI1NjsKKwl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChwcm90byArIGxlbikgPDwgODsKICNlbHNlCi0JdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSAocHJvdG88PDE2KStsZW47CisJdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSBwcm90byArIGxlbjsKICNlbmRpZgogCXVuc2lnbmVkIGxvbmcgdG1wcmVnOwogCkBAIC0xNDcsMTEgKzE0NCwxMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xNjEsMTYgKzE1NywxNiBAQAogICogaW4gaWNtcC5jCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pIHsKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKK3sKIAlyZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkJIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgX191MTYgbGVuLAotCQkJCQkJIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9pcHY2X21hZ2ljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCQkgICAgICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCSAgICAgIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgbG9uZyB0bXByZWcwLCB0bXByZWcxLCB0bXByZWcyLCB0bXByZWczOwogCV9fYXNtX18oCkBAIC0xOTcsNyArMTkzLDcgQEAKIAkJOiAiPSZyIiAoc3VtKSwgIj0mciIgKHRtcHJlZzApLCAiPSZyIiAodG1wcmVnMSksCiAJCSAgIj0mciIgKHRtcHJlZzIpLCAiPSZyIiAodG1wcmVnMykKIAkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCi0JCSAgInIiIChodG9ubCgoX191MzIpIChsZW4pKSksICJyIiAoaHRvbmwocHJvdG8pKSwgIjAiIChzdW0pCisJCSAgInIiIChodG9ubChsZW4pKSwgInIiIChodG9ubChwcm90bykpLCAiMCIgKHN1bSkKIAkJOiAiY2JpdCIKIAkpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2RldmljZS5oIGIvaW5jbHVkZS9hc20tbTMyci9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTMyci9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2lkZS5oIGIvaW5jbHVkZS9hc20tbTMyci9pZGUuaAppbmRleCAyMTlhMGY3Li5jODJlYmU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2lkZS5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvaWRlLmgKQEAgLTMyLDcgKzMyLDggQEAKIHN0YXRpYyBfX2lubGluZV9fIGludCBpZGVfZGVmYXVsdF9pcnEodW5zaWduZWQgbG9uZyBiYXNlKQogewogCXN3aXRjaCAoYmFzZSkgewotI2lmIGRlZmluZWQoQ09ORklHX1BMQVRfTTMyNzAwVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkyKQorI2lmIGRlZmluZWQoQ09ORklHX1BMQVRfTTMyNzAwVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkyKSBcCisJfHwgZGVmaW5lZChDT05GSUdfUExBVF9PUFNQVVQpCiAJCWNhc2UgMHgxZjA6IHJldHVybiBQTERfSVJRX0NGSVJFUTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9tMzIxMDIuaCBiL2luY2x1ZGUvYXNtLW0zMnIvbTMyMTAyLmgKaW5kZXggYTFmMGQxZi4uNTI4MDdmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9tMzIxMDIuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL20zMjEwMi5oCkBAIC0xMDQsNyArMTA0LDggQEAKICNkZWZpbmUgTTMyUl9NRlQ1UkxEX1BPUlRMICAgICAoMHgwQytNMzJSX01GVDVfT0ZGU0VUKSAgLyogTUZUNCByZWxvYWQgKi8KICNkZWZpbmUgTTMyUl9NRlQ1Q01QUkxEX1BPUlRMICAoMHgxMCtNMzJSX01GVDVfT0ZGU0VUKSAgLyogTUZUNCBjb21wYXJlIHJlbG9hZCAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfQ0hJUF9NMzI3MDApIHx8IGRlZmluZWQoQ09ORklHX0NISVBfTTMyMTA0KQorI2lmIChkZWZpbmVkKENPTkZJR19DSElQX00zMjcwMCkgJiYgIWRlZmluZWQoQ09ORklHX1BMQVRfTUFQUEkyKSkgXAorCXx8IGRlZmluZWQoQ09ORklHX0NISVBfTTMyMTA0KQogI2RlZmluZSBNMzJSX01GVENSX01GVDBNU0sgICgxVUw8PDMxKSAgLyogYjAgKi8KICNkZWZpbmUgTTMyUl9NRlRDUl9NRlQxTVNLICAoMVVMPDwzMCkgIC8qIGIxICovCiAjZGVmaW5lIE0zMlJfTUZUQ1JfTUZUMk1TSyAgKDFVTDw8MjkpICAvKiBiMiAqLwpAQCAtMTE3LDcgKzExOCw3IEBACiAjZGVmaW5lIE0zMlJfTUZUQ1JfTUZUM0VOICAgKDFVTDw8MjApICAvKiBiMTEgKi8KICNkZWZpbmUgTTMyUl9NRlRDUl9NRlQ0RU4gICAoMVVMPDwxOSkgIC8qIGIxMiAqLwogI2RlZmluZSBNMzJSX01GVENSX01GVDVFTiAgICgxVUw8PDE4KSAgLyogYjEzICovCi0jZWxzZQkvKiBub3QgQ09ORklHX0NISVBfTTMyNzAwICYmIG5vdCBDT05GSUdfQ0hJUF9NMzIxMDQgKi8KKyNlbHNlCiAjZGVmaW5lIE0zMlJfTUZUQ1JfTUZUME1TSyAgKDFVTDw8MTUpICAvKiBiMTYgKi8KICNkZWZpbmUgTTMyUl9NRlRDUl9NRlQxTVNLICAoMVVMPDwxNCkgIC8qIGIxNyAqLwogI2RlZmluZSBNMzJSX01GVENSX01GVDJNU0sgICgxVUw8PDEzKSAgLyogYjE4ICovCkBAIC0xMzAsNyArMTMxLDcgQEAKICNkZWZpbmUgTTMyUl9NRlRDUl9NRlQzRU4gICAoMVVMPDw0KSAgIC8qIGIyNyAqLwogI2RlZmluZSBNMzJSX01GVENSX01GVDRFTiAgICgxVUw8PDMpICAgLyogYjI4ICovCiAjZGVmaW5lIE0zMlJfTUZUQ1JfTUZUNUVOICAgKDFVTDw8MikgICAvKiBiMjkgKi8KLSNlbmRpZgkvKiBub3QgQ09ORklHX0NISVBfTTMyNzAwICYmIG5vdCBDT05GSUdfQ0hJUF9NMzIxMDQgKi8KKyNlbmRpZgogCiAjZGVmaW5lIE0zMlJfTUZUTU9EX0NDX01BU0sgICAgKDFVTDw8MTUpICAvKiBiMTYgKi8KICNkZWZpbmUgTTMyUl9NRlRNT0RfVENDUiAgICAgICAoMVVMPDwxMykgIC8qIGIxOCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLW0zMnIvcHRyYWNlLmgKaW5kZXggMmQyYTZjOS4uNjMyYjRjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3B0cmFjZS5oCkBAIC0zMywyMSArMzMsMTAgQEAKICNkZWZpbmUgUFRfUjE1CQlQVF9TUAogCiAvKiBwcm9jZXNzb3Igc3RhdHVzIGFuZCBtaXNjZWxsYW5lb3VzIGNvbnRleHQgcmVnaXN0ZXJzLiAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19JU0FfTTMyUjIpICYmIGRlZmluZWQoQ09ORklHX0lTQV9EU1BfTEVWRUwyKQogI2RlZmluZSBQVF9BQ0MwSAkxNQogI2RlZmluZSBQVF9BQ0MwTAkxNgotI2RlZmluZSBQVF9BQ0MxSAkxNwotI2RlZmluZSBQVF9BQ0MxTAkxOAotI2RlZmluZSBQVF9BQ0NICQlQVF9BQ0MwSAotI2RlZmluZSBQVF9BQ0NMCQlQVF9BQ0MwTAotI2VsaWYgZGVmaW5lZChDT05GSUdfSVNBX00zMlIyKSB8fCBkZWZpbmVkKENPTkZJR19JU0FfTTMyUikKLSNkZWZpbmUgUFRfQUNDSAkJMTUKLSNkZWZpbmUgUFRfQUNDTAkJMTYKLSNkZWZpbmUgUFRfRFVNTVlfQUNDMUgJMTcKLSNkZWZpbmUgUFRfRFVNTVlfQUNDMUwJMTgKLSNlbHNlCi0jZXJyb3IgdW5rbm93biBpc2EgY29uaWZpZ3VyYXRpb24KLSNlbmRpZgorI2RlZmluZSBQVF9BQ0MxSAkxNwkvKiBJU0FfRFNQX0xFVkVMMiBvbmx5ICovCisjZGVmaW5lIFBUX0FDQzFMCTE4CS8qIElTQV9EU1BfTEVWRUwyIG9ubHkgKi8KICNkZWZpbmUgUFRfUFNXCQkxOQogI2RlZmluZSBQVF9CUEMJCTIwCiAjZGVmaW5lIFBUX0JCUFNXCTIxCkBAIC0xMDMsMTkgKzkyLDEwIEBACiAJbG9uZyBzeXNjYWxsX25yOwogCiAJLyogU2F2ZWQgbWFpbiBwcm9jZXNzb3Igc3RhdHVzIGFuZCBtaXNjZWxsYW5lb3VzIGNvbnRleHQgcmVnaXN0ZXJzLiAqLwotI2lmIGRlZmluZWQoQ09ORklHX0lTQV9NMzJSMikgJiYgZGVmaW5lZChDT05GSUdfSVNBX0RTUF9MRVZFTDIpCiAJdW5zaWduZWQgbG9uZyBhY2MwaDsKIAl1bnNpZ25lZCBsb25nIGFjYzBsOwotCXVuc2lnbmVkIGxvbmcgYWNjMWg7Ci0JdW5zaWduZWQgbG9uZyBhY2MxbDsKLSNlbGlmIGRlZmluZWQoQ09ORklHX0lTQV9NMzJSMikgfHwgZGVmaW5lZChDT05GSUdfSVNBX00zMlIpCi0JdW5zaWduZWQgbG9uZyBhY2NoOwotCXVuc2lnbmVkIGxvbmcgYWNjbDsKLQl1bnNpZ25lZCBsb25nIGR1bW15X2FjYzFoOwotCXVuc2lnbmVkIGxvbmcgZHVtbXlfYWNjMWw7Ci0jZWxzZQotI2Vycm9yIHVua25vd24gaXNhIGNvbmZpZ3VyYXRpb24KLSNlbmRpZgorCXVuc2lnbmVkIGxvbmcgYWNjMWg7CS8qIElTQV9EU1BfTEVWRUwyIG9ubHkgKi8KKwl1bnNpZ25lZCBsb25nIGFjYzFsOwkvKiBJU0FfRFNQX0xFVkVMMiBvbmx5ICovCiAJdW5zaWduZWQgbG9uZyBwc3c7CiAJdW5zaWduZWQgbG9uZyBicGM7CQkvKiBzYXZlZCBQQyBmb3IgVFJBUCBzeXNjYWxscyAqLwogCXVuc2lnbmVkIGxvbmcgYmJwc3c7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3NldHVwLmggYi9pbmNsdWRlL2FzbS1tMzJyL3NldHVwLmgKaW5kZXggNTJmNGZhMi4uNmEwYjMyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvc2V0dXAuaApAQCAtMSw2ICsxLDExIEBACiAvKgogICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCiAgKi8KKworI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRSAgICAgICA1MTIKKworI2lmZGVmIF9fS0VSTkVMX18KKwogI2RlZmluZSBQQVJBTQkJCSgodW5zaWduZWQgY2hhciAqKWVtcHR5X3plcm9fcGFnZSkKIAogI2RlZmluZSBNT1VOVF9ST09UX1JET05MWQkoKih1bnNpZ25lZCBsb25nICopIChQQVJBTSsweDAwMCkpCkBAIC0xOCw4ICsyMyw2IEBACiAKICNkZWZpbmUgU0NSRUVOX0lORk8JCSgqKHN0cnVjdCBzY3JlZW5faW5mbyAqKSAoUEFSQU0rMHgyMDApKQogCi0jZGVmaW5lIENPTU1BTkRfTElORV9TSVpFCSg1MTIpCi0KICNkZWZpbmUgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLCSgweDA3RkYpCiAjZGVmaW5lIFJBTURJU0tfUFJPTVBUX0ZMQUcJCSgweDgwMDApCiAjZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHCQkoMHg0MDAwKQpAQCAtMjcsMyArMzAsNSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3N0YXJ0OwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtb3J5X2VuZDsKIAorI2VuZGlmICAvKiAgX19LRVJORUxfXyAgKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zaWdjb250ZXh0LmggYi9pbmNsdWRlL2FzbS1tMzJyL3NpZ2NvbnRleHQuaAppbmRleCA3MzAyNWMwLi42MjUzN2RjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3NpZ2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3NpZ2NvbnRleHQuaApAQCAtMjMsMTkgKzIzLDEwIEBACiAJdW5zaWduZWQgbG9uZyBzY19yMTI7CiAKIAkvKiBTYXZlZCBtYWluIHByb2Nlc3NvciBzdGF0dXMgYW5kIG1pc2NlbGxhbmVvdXMgY29udGV4dCByZWdpc3RlcnMuICovCi0jaWYgZGVmaW5lZChDT05GSUdfSVNBX00zMlIyKSAmJiBkZWZpbmVkKENPTkZJR19JU0FfRFNQX0xFVkVMMikKIAl1bnNpZ25lZCBsb25nIHNjX2FjYzBoOwogCXVuc2lnbmVkIGxvbmcgc2NfYWNjMGw7Ci0JdW5zaWduZWQgbG9uZyBzY19hY2MxaDsKLQl1bnNpZ25lZCBsb25nIHNjX2FjYzFsOwotI2VsaWYgZGVmaW5lZChDT05GSUdfSVNBX00zMlIyKSB8fCBkZWZpbmVkKENPTkZJR19JU0FfTTMyUikKLQl1bnNpZ25lZCBsb25nIHNjX2FjY2g7Ci0JdW5zaWduZWQgbG9uZyBzY19hY2NsOwotCXVuc2lnbmVkIGxvbmcgc2NfZHVtbXlfYWNjMWg7Ci0JdW5zaWduZWQgbG9uZyBzY19kdW1teV9hY2MxbDsKLSNlbHNlCi0jZXJyb3IgdW5rbm93biBpc2EgY29uZmlndXJhdGlvbgotI2VuZGlmCisJdW5zaWduZWQgbG9uZyBzY19hY2MxaDsJLyogSVNBX0RTUF9MRVZFTDIgb25seSAqLworCXVuc2lnbmVkIGxvbmcgc2NfYWNjMWw7CS8qIElTQV9EU1BfTEVWRUwyIG9ubHkgKi8KIAl1bnNpZ25lZCBsb25nIHNjX3BzdzsKIAl1bnNpZ25lZCBsb25nIHNjX2JwYzsJCS8qIHNhdmVkIFBDIGZvciBUUkFQIHN5c2NhbGxzICovCiAJdW5zaWduZWQgbG9uZyBzY19iYnBzdzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaAppbmRleCA1YWNlMzcwLi5mYWYyYmQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtYml0cy5oCkBAIC0xOSw2ICsxOSwxNyBAQAogCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwogfTsKIAorc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKIC8qIGNfY2MgY2hhcmFjdGVycyAqLwogI2RlZmluZSBWSU5UUiAwCiAjZGVmaW5lIFZRVUlUIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1tMzJyL3VuaXN0ZC5oCmluZGV4IDk1YWEzNDIuLjViNjZiZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci91bmlzdGQuaApAQCAtMjk2LDExNyArMjk2LDYgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgTlJfc3lzY2FsbHMgMjg1Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLS8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtTUFYX0VSUk5POiBzZWUKLSAqIDxhc20tbTMyci9lcnJuby5oPgotICovCi0KLSNpbmNsdWRlIDxhc20vc3lzY2FsbC5oPgkvKiBTWVNDQUxMXyogKi8KLQotI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAotZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCi0JLyogQXZvaWQgdXNpbmcgInJlcyIgd2hpY2ggaXMgZGVjbGFyZWQgdG8gYmUgaW4gcmVnaXN0ZXIgcjA7IFwKLQkgICBlcnJubyBtaWdodCBleHBhbmQgdG8gYSBmdW5jdGlvbiBjYWxsIGFuZCBjbG9iYmVyIGl0LiAgKi8gXAotCQlpbnQgX19lcnIgPSAtKHJlcyk7IFwKLQkJZXJybm8gPSBfX2VycjsgXAotCQlyZXMgPSAtMTsgXAotCX0gXAotCXJldHVybiAodHlwZSkgKHJlcyk7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3N5c2NhbGwwKHR5cGUsbmFtZSkgXAotdHlwZSBuYW1lKHZvaWQpIFwKLXsgXAotcmVnaXN0ZXIgbG9uZyBfX3Njbm8gX19hc21fXyAoInI3IikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fKCJyMCIpOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoXAotCSJ0cmFwICMiIFNZU0NBTExfVkVDVE9SICJ8fCBub3AiXAotCTogIj1yIiAoX19yZXMpIFwKLQk6ICJyIiAoX19zY25vKSBcCi0JOiAibWVtb3J5Iik7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUxLGFyZzEpIFwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxKSBcCi17IFwKLXJlZ2lzdGVyIGxvbmcgX19zY25vIF9fYXNtX18gKCJyNyIpID0gX19OUl8jI25hbWU7IFwKLXJlZ2lzdGVyIGxvbmcgX19yZXMgX19hc21fXyAoInIwIikgPSAobG9uZykoYXJnMSk7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fIChcCi0JInRyYXAgIyIgU1lTQ0FMTF9WRUNUT1IgInx8IG5vcCJcCi0JOiAiPXIiIChfX3JlcykgXAotCTogInIiIChfX3Njbm8pLCAiMCIgKF9fcmVzKSBcCi0JOiAibWVtb3J5Iik7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMikgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMikgXAoteyBcCi1yZWdpc3RlciBsb25nIF9fc2NubyBfX2FzbV9fICgicjciKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fYXJnMiBfX2FzbV9fICgicjEiKSA9IChsb25nKShhcmcyKTsgXAotcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fICgicjAiKSA9IChsb25nKShhcmcxKTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKFwKLQkidHJhcCAjIiBTWVNDQUxMX1ZFQ1RPUiAifHwgbm9wIlwKLQk6ICI9ciIgKF9fcmVzKSBcCi0JOiAiciIgKF9fc2NubyksICIwIiAoX19yZXMpLCAiciIgKF9fYXJnMikgXAotCTogIm1lbW9yeSIpOyBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMykgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczKSBcCi17IFwKLXJlZ2lzdGVyIGxvbmcgX19zY25vIF9fYXNtX18gKCJyNyIpID0gX19OUl8jI25hbWU7IFwKLXJlZ2lzdGVyIGxvbmcgX19hcmczIF9fYXNtX18gKCJyMiIpID0gKGxvbmcpKGFyZzMpOyBcCi1yZWdpc3RlciBsb25nIF9fYXJnMiBfX2FzbV9fICgicjEiKSA9IChsb25nKShhcmcyKTsgXAotcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fICgicjAiKSA9IChsb25nKShhcmcxKTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKFwKLQkidHJhcCAjIiBTWVNDQUxMX1ZFQ1RPUiAifHwgbm9wIlwKLQk6ICI9ciIgKF9fcmVzKSBcCi0JOiAiciIgKF9fc2NubyksICIwIiAoX19yZXMpLCAiciIgKF9fYXJnMiksIFwKLQkJInIiIChfX2FyZzMpIFwKLQk6ICJtZW1vcnkiKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNCh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCkgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczLHR5cGU0IGFyZzQpIFwKLXsgXAotcmVnaXN0ZXIgbG9uZyBfX3Njbm8gX19hc21fXyAoInI3IikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX2FyZzQgX19hc21fXyAoInIzIikgPSAobG9uZykoYXJnNCk7IFwKLXJlZ2lzdGVyIGxvbmcgX19hcmczIF9fYXNtX18gKCJyMiIpID0gKGxvbmcpKGFyZzMpOyBcCi1yZWdpc3RlciBsb25nIF9fYXJnMiBfX2FzbV9fICgicjEiKSA9IChsb25nKShhcmcyKTsgXAotcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fICgicjAiKSA9IChsb25nKShhcmcxKTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKFwKLQkidHJhcCAjIiBTWVNDQUxMX1ZFQ1RPUiAifHwgbm9wIlwKLQk6ICI9ciIgKF9fcmVzKSBcCi0JOiAiciIgKF9fc2NubyksICIwIiAoX19yZXMpLCAiciIgKF9fYXJnMiksIFwKLQkJInIiIChfX2FyZzMpLCAiciIgKF9fYXJnNCkgXAotCTogIm1lbW9yeSIpOyBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw1KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LCBcCi0JdHlwZTUsYXJnNSkgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczLHR5cGU0IGFyZzQsdHlwZTUgYXJnNSkgXAoteyBcCi1yZWdpc3RlciBsb25nIF9fc2NubyBfX2FzbV9fICgicjciKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fYXJnNSBfX2FzbV9fICgicjQiKSA9IChsb25nKShhcmc1KTsgXAotcmVnaXN0ZXIgbG9uZyBfX2FyZzQgX19hc21fXyAoInIzIikgPSAobG9uZykoYXJnNCk7IFwKLXJlZ2lzdGVyIGxvbmcgX19hcmczIF9fYXNtX18gKCJyMiIpID0gKGxvbmcpKGFyZzMpOyBcCi1yZWdpc3RlciBsb25nIF9fYXJnMiBfX2FzbV9fICgicjEiKSA9IChsb25nKShhcmcyKTsgXAotcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fICgicjAiKSA9IChsb25nKShhcmcxKTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKFwKLQkidHJhcCAjIiBTWVNDQUxMX1ZFQ1RPUiAifHwgbm9wIlwKLQk6ICI9ciIgKF9fcmVzKSBcCi0JOiAiciIgKF9fc2NubyksICIwIiAoX19yZXMpLCAiciIgKF9fYXJnMiksIFwKLQkJInIiIChfX2FyZzMpLCAiciIgKF9fYXJnNCksICJyIiAoX19hcmc1KSBcCi0JOiAibWVtb3J5Iik7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KIAogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9TVEFUNjQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKaW5kZXggMjRkM2ZmNC4uMTZiZjM3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKQEAgLTg5LDYgKzg5LDggQEAKIAkJX19mbHVzaF9jYWNoZV8wMzAoKTsKIH0KIAorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQkJZmx1c2hfY2FjaGVfbW0obW0pCisKIC8qIGZsdXNoX2NhY2hlX3JhbmdlL2ZsdXNoX2NhY2hlX3BhZ2UgbXVzdCBiZSBtYWNyb3MgdG8gYXZvaWQKICAgIGEgZGVwZW5kZW5jeSBvbiBsaW51eC9tbS5oLCB3aGljaCBpbmNsdWRlcyB0aGlzIGZpbGUuLi4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLW02OGsvY2hlY2tzdW0uaAppbmRleCAxNzI4MGVmLi40OTRmOWFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9jaGVja3N1bS5oCkBAIC0xNSw3ICsxNSw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMjUsMjIgKzI1LDIxIEBACiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJCQlpbnQgbGVuLCBpbnQgc3VtLAorZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKwkJCQkJCXZvaWQgKmRzdCwKKwkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sCiAJCQkJCQlpbnQgKmNzdW1fZXJyKTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJCQkgICAgICBpbnQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsCisJCQkJCSAgICAgIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCQkJICAgICAgX193c3VtIHN1bSk7CiAKIC8qCiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgogICoKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewogCXVuc2lnbmVkIGludCBzdW0gPSAwOwogCXVuc2lnbmVkIGxvbmcgdG1wOwpAQCAtNTgsMjkgKzU3LDI5IEBACiAJCSA6ICI9ZCIgKHN1bSksICI9JmEiIChpcGgpLCAiPSZkIiAoaWhsKSwgIj0mZCIgKHRtcCkKIAkJIDogIjAiIChzdW0pLCAiMSIgKGlwaCksICIyIiAoaWhsKQogCQkgOiAibWVtb3J5Iik7Ci0JcmV0dXJuIH5zdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfnN1bTsKIH0KIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7Ci0JdW5zaWduZWQgaW50IHRtcCA9IHN1bTsKKwl1bnNpZ25lZCBpbnQgdG1wID0gKF9fZm9yY2UgdTMyKXN1bTsKIAlfX2FzbV9fKCJzd2FwICUxXG5cdCIKIAkJImFkZHcgJTEsICUwXG5cdCIKIAkJImNscncgJTFcblx0IgogCQkiYWRkeHcgJTEsICUwIgogCQk6ICI9JmQiIChzdW0pLCAiPSZkIiAodG1wKQogCQk6ICIwIiAoc3VtKSwgIjEiICh0bXApKTsKLQlyZXR1cm4gfnN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+c3VtOwogfQogCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gKCJhZGRsICAlMiwlMFxuXHQiCiAJCSAiYWRkeGwgJTMsJTBcblx0IgpAQCAtOTgsOSArOTcsOSBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTEwLDE2ICsxMDksMTUgQEAKICAqIGluIGljbXAuYwogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKLWlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKIAlyZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCV9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2Citjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRtcDsKIAlfX2FzbV9fKCJhZGRsICUyQCwlMFxuXHQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2RldmljZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1tNjhrL2RtYS1tYXBwaW5nLmgKaW5kZXggZDkwZDg0MS4uMDAyNTllZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvZG1hLW1hcHBpbmcuaApAQCAtMjEsNyArMjEsNyBAQAogCXJldHVybiAxIDw8IEwxX0NBQ0hFX1NISUZUOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkbWFfaXNfY29uc2lzdGVudChkbWFfYWRkcl90IGRtYV9hZGRyKQorc3RhdGljIGlubGluZSBpbnQgZG1hX2lzX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogCXJldHVybiAwOwogfQpAQCAtNDEsNyArNDEsNyBAQAogewogCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgc2l6ZSwgYWRkciwgaGFuZGxlKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCiAJCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJLyogd2UgdXNlIGNvaGVyZW50IGFsbG9jYXRpb24sIHNvIG5vdCBtdWNoIHRvIGRvIGhlcmUuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3NldHVwLmggYi9pbmNsdWRlL2FzbS1tNjhrL3NldHVwLmgKaW5kZXggN2ZhY2M5YS4uMmE4ODUzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc2V0dXAuaApAQCAtNDEsOCArNDEsMTIgQEAKICNkZWZpbmUgTUFDSF9RNDAgICAgIDEwCiAjZGVmaW5lIE1BQ0hfU1VOM1ggICAxMQogCisjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDI1NgorCiAjaWZkZWYgX19LRVJORUxfXwogCisjZGVmaW5lIENMX1NJWkUgQ09NTUFORF9MSU5FX1NJWkUKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIGV4dGVybiB1bnNpZ25lZCBsb25nIG02OGtfbWFjaHR5cGU7CiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpAQCAtMzU1LDggKzM1OSw2IEBACiAgICAgICovCiAKICNkZWZpbmUgTlVNX01FTUlORk8JNAotI2RlZmluZSBDTF9TSVpFCQkyNTYKLSNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUJQ0xfU0laRQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogc3RydWN0IG1lbV9pbmZvIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3VuMy1oZWFkLmggYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjMtaGVhZC5oCmluZGV4IGY3OTlkOTUuLmU3NGYzODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3VuMy1oZWFkLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zLWhlYWQuaApAQCAtNCw3ICs0LDYgQEAKIAogI2RlZmluZSBLRVJOQkFTRSAgICAgICAgMHhFMDAwMDAwICAvKiBGaXJzdCBhZGRyZXNzIHRoZSBrZXJuZWwgd2lsbCBldmVudHVhbGx5IGJlICovCiAjZGVmaW5lIExPQURfQUREUiAgICAgICAweDQwMDAgICAgICAvKiBwcm9tIGp1bXBzIHRvIHVzIGhlcmUgdW5sZXNzIHRoaXMgaXMgZWxmIC9ib290ICovCi0jZGVmaW5lIEJJX1NUQVJUIChLRVJOQkFTRSArIDB4MzAwMCkgLyogYmVnaW5uaW5nIG9mIHRoZSBib290aW5mbyByZWNvcmRzICovCiAjZGVmaW5lIEZDX0NPTlRST0wgIDMKICNkZWZpbmUgRkNfU1VQRVJEICAgIDUKICNkZWZpbmUgRkNfQ1BVICAgICAgNwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zaW50cy5oIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zaW50cy5oCmluZGV4IGRlOTFmYTAuLjMwOWQ2ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM2ludHMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNpbnRzLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vaW50ZXJzaWwuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNkZWZpbmUgU1VOM19JTlRfVkVDUyAxOTIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zbW11LmggYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNtbXUuaAppbmRleCA2YzhjMTdkLi5kOGYxN2EwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNtbXUuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNtbXUuaApAQCAtNCw2ICs0LDcgQEAKICNpZm5kZWYgX19TVU4zX01NVV9IX18KICNkZWZpbmUgX19TVU4zX01NVV9IX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21vdnMuaD4KICNpbmNsdWRlIDxhc20vc3VuMy1oZWFkLmg+CiAKQEAgLTE2MCw3ICsxNjEsNyBAQAogCXJldHVybjsKIH0KIAotZXh0ZXJuIHZvaWQgKnN1bjNfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKK2V4dGVybiB2b2lkIF9faW9tZW0gKnN1bjNfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCSAgdW5zaWduZWQgbG9uZyB0eXBlKTsKIAogZXh0ZXJuIGludCBzdW4zX21hcF90ZXN0KHVuc2lnbmVkIGxvbmcgYWRkciwgY2hhciAqdmFsKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3dpbV9pb3AuaCBiL2luY2x1ZGUvYXNtLW02OGsvc3dpbV9pb3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5YjY3OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N3aW1faW9wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqIFNXSU0gYWNjZXNzIHRocm91Z2ggdGhlIElPUAotICogV3JpdHRlbiBieSBKb3NodWEgTS4gVGhvbXBzb24KLSAqLwotCi0vKiBJT1AgbnVtYmVyIGFuZCBjaGFubmVsIG51bWJlciBmb3IgdGhlIFNXSU0gKi8KLQotI2RlZmluZSBTV0lNX0lPUAlJT1BfTlVNX0lTTQotI2RlZmluZSBTV0lNX0NIQU4JMQotCi0vKiBDb21tYW5kIGNvZGU6ICovCi0KLSNkZWZpbmUgQ01EX0lOSVQJCTB4MDEJLyogSW5pdGlhbGl6ZSAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENNRF9TSFVURE9XTgkJMHgwMgkvKiBTaHV0ZG93biAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ01EX1NUQVJUX1BPTEwJCTB4MDMJLyogU3RhcnQgaW5zZXJ0L2VqZWN0IHBvbGxpbmcgICovCi0jZGVmaW5lIENNRF9TVE9QX1BPTEwJCTB4MDQJLyogU3RvcCBpbnNlcnQvZWplY3QgcG9sbGluZyAgICovCi0jZGVmaW5lIENNRF9TRVRIRlNUQUcJCTB4MDUJLyogU2V0IEhGUyB0YWcgYnVmZmVyIGFkZHJlc3MgICovCi0jZGVmaW5lIENNRF9TVEFUVVMJCTB4MDYJLyogU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENNRF9FSkVDVAkJMHgwNwkvKiBFamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ01EX0ZPUk1BVAkJMHgwOAkvKiBGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ01EX0ZPUk1BVF9WRVJJRlkJMHgwOQkvKiBGb3JtYXQgYW5kIFZlcmlmeSAgICAgICAgICAgKi8KLSNkZWZpbmUgQ01EX1dSSVRFCQkweDBBCS8qIFdyaXRlICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDTURfUkVBRAkJMHgwQgkvKiBSZWFkICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ01EX1JFQURfVkVSSUZZCQkweDBDCS8qIFJlYWQgYW5kIFZlcmlmeSAgICAgICAgICAgICAqLwotI2RlZmluZSBDTURfQ0FDSEVfQ1RSTAkJMHgwRAkvKiBDYWNoZSBjb250cm9sICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ01EX1RBR0JVRkZfQ1RSTAkweDBFCS8qIFRhZyBidWZmZXIgY29udHJvbCAgICAgICAgICAqLwotI2RlZmluZSBDTURfR0VUX0lDT04JCTB4MEYJLyogR2V0IEljb24gICAgICAgICAgICAgICAgICAgICovCi0KLS8qIERyaXZlIHR5cGVzOiAqLwotCi0vKiBub3RlOiBhcHBsZSBzZXogRFJWX0ZESEQgaXMgNCwgYnV0IEkgZ2V0IGJhY2sgYSB0eXBlICovCi0vKiAgICAgICBvZiA1IHdoZW4gSSBkbyBhIGRyaXZlIHN0YXR1cyBjaGVjayBvbiBteSBGREhEICovCi0KLSNkZWZpbmUJRFJWX05PTkUJMAkvKiBObyBkcml2ZSAgICAgICAgICAgICAqLwotI2RlZmluZQlEUlZfVU5LTk9XTgkxCS8qIFVuc3BlY2lmaWVkIGRyaXZlICAgICovCi0jZGVmaW5lCURSVl80MDBLCTIJLyogNDAwSyAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUJRFJWXzgwMEsJMwkvKiA0MDBLLzgwMEsgICAgICAgICAgICAqLwotI2RlZmluZQlEUlZfRkRIRAk1CS8qIDQwMEsvODAwSy83MjBLLzE0NDBLICovCi0jZGVmaW5lCURSVl9IRDIwCTcJLyogQXBwbGUgSEQyMCAgICAgICAgICAgKi8KLQotLyogRm9ybWF0IHR5cGVzOiAqLwotCi0jZGVmaW5lCUZNVF9IRDIwCTB4MDAwMQkvKiAgQXBwbGUgSEQyMCAqLwotI2RlZmluZQlGTVRfNDAwSwkweDAwMDIJLyogIDQwMEsgKEdDUikgKi8KLSNkZWZpbmUJRk1UXzgwMEsJMHgwMDA0CS8qICA4MDBLIChHQ1IpICovCi0jZGVmaW5lCUZNVF83MjBLCTB4MDAwOAkvKiAgNzIwSyAoTUZNKSAqLwotI2RlZmluZQlGTVRfMTQ0MEsJMHgwMDEwCS8qIDEuNDRNIChNRk0pICovCi0KLSNkZWZpbmUJRk1EX0tJTkRfNDAwSwkxCi0jZGVmaW5lCUZNRF9LSU5EXzgwMEsJMgotI2RlZmluZQlGTURfS0lORF83MjBLCTMKLSNkZWZpbmUJRk1EX0tJTkRfMTQ0MEsJMQotCi0vKiBJY29uIEZsYWdzOiAqLwotCi0jZGVmaW5lCUlDT05fTUVESUEJMHgwMQkvKiBIYXZlIElPUCBzdXBwbHkgbWVkaWEgaWNvbiAqLwotI2RlZmluZQlJQ09OX0RSSVZFCTB4MDEJLyogSGF2ZSBJT1Agc3VwcGx5IGRyaXZlIGljb24gKi8KLQotLyogRXJyb3IgY29kZXM6ICovCi0KLSNkZWZpbmUJZ2NyT25NRk1FcnIJLTQwMAkvKiBHQ1IgKDQwMC84MDBLKSBvbiBIRCBtZWRpYSAqLwotI2RlZmluZQl2ZXJFcnIJCS04NAkvKiB2ZXJpZnkgZmFpbGVkICovCi0jZGVmaW5lCWZtdDJFcnIJCS04MwkvKiBjYW4ndCBnZXQgZW5vdWdoIHN5bmMgZHVyaW5nIGZvcm1hdCAqLwotI2RlZmluZQlmbXQxRXJyCQktODIJLyogY2FuJ3QgZmluZCBzZWN0b3IgMCBhZnRlciB0cmFjayBmb3JtYXQgKi8KLSNkZWZpbmUJc2VjdE5GRXJyCS04MQkvKiBjYW4ndCBmaW5kIHNlY3RvciAqLwotI2RlZmluZQlzZWVrRXJyCQktODAJLyogZHJpdmUgZXJyb3IgZHVyaW5nIHNlZWsgKi8KLSNkZWZpbmUJc3BkQWRqRXJyCS03OQkvKiBjYW4ndCBzZXQgZHJpdmUgc3BlZWQgKi8KLSNkZWZpbmUJdHdvU2lkZUVycgktNzgJLyogZHJpdmUgaXMgc2luZ2xlLXNpZGVkICovCi0jZGVmaW5lCWluaXRJV01FcnIJLTc3CS8qIGVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwotI2RlZmluZQl0azBiYWRFcnIJLTc2CS8qIHRyYWNrIHplcm8gaXMgYmFkICovCi0jZGVmaW5lCWNhbnRTdGVwRXJyCS03NQkvKiBkcml2ZSBlcnJvciBkdXJpbmcgc3RlcCAqLwotI2RlZmluZQl3clVuZGVycnVuCS03NAkvKiB3cml0ZSB1bmRlcnJ1biBvY2N1cnJlZCAqLwotI2RlZmluZQliYWREQnRTbHAJLTczCS8qIGJhZCBkYXRhIGJpdHNsaXAgbWFya3MgKi8KLSNkZWZpbmUJYmFkRENrc3VtCS03MgkvKiBiYWQgZGF0YSBjaGVja3N1bSAqLwotI2RlZmluZQlub0R0YU1rRXJyCS03MQkvKiBjYW4ndCBmaW5kIGRhdGEgbWFyayAqLwotI2RlZmluZQliYWRCdFNscEVycgktNzAJLyogYmFkIGFkZHJlc3MgYml0c2xpcCBtYXJrcyAqLwotI2RlZmluZQliYWRDa3NtRXJyCS02OQkvKiBiYWQgYWRkcmVzcy1tYXJrIGNoZWNrc3VtICovCi0jZGVmaW5lCWRhdGFWZXJFcnIJLTY4CS8qIHJlYWQtdmVyaWZ5IGZhaWxlZCAqLwotI2RlZmluZQlub0Fkck1rRXJyCS02NwkvKiBjYW4ndCBmaW5kIGFuIGFkZHJlc3MgbWFyayAqLwotI2RlZmluZQlub055YkVycgktNjYJLyogbm8gbnliYmxlcz8gZGlzayBpcyBwcm9iYWJseSBkZWdhdXNzZWQgKi8KLSNkZWZpbmUJb2ZmTGluRXJyCS02NQkvKiBubyBkaXNrIGluIGRyaXZlICovCi0jZGVmaW5lCW5vRHJpdmVFcnIJLTY0CS8qIGRyaXZlIGlzbid0IGNvbm5lY3RlZCAqLwotI2RlZmluZQluc0RydkVycgktNTYJLyogbm8gc3VjaCBkcml2ZSAqLwotI2RlZmluZQlwYXJhbUVycgktNTAJLyogYmFkIHBvc2l0aW9uaW5nIGluZm9ybWF0aW9uICovCi0jZGVmaW5lCXdQckVycgkJLTQ0CS8qIHdyaXRlIHByb3RlY3RlZCAqLwotI2RlZmluZQlvcGVuRXJyCQktMjMJLyogYWxyZWFkeSBpbml0aWFsaXplZCAqLwotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi1zdHJ1Y3Qgc3dpbV9kcnZzdGF0dXMgewotCV9fdTE2CWN1cnJfdHJhY2s7CS8qIEN1cnJlbnQgdHJhY2sgbnVtYmVyICAgICAgICAgICAgICAgICAgICovCi0JX191OAl3cml0ZV9wcm90OwkvKiAweDgwIGlmIGRpc2sgaXMgd3JpdGUgcHJvdGVjdGVkICAgICAgICAqLwotCV9fdTgJZGlza19pbl9kcml2ZTsJLyogMHgwMSBvciAweDAyIGlmIGEgZGlzayBpcyBpbiB0aGUgZHJpdmUgKi8KLQlfX3U4CWluc3RhbGxlZDsJLyogMHgwMSBpZiBkcml2ZSBpbnN0YWxsZWQsIDB4RkYgaWYgbm90ICAgKi8KLQlfX3U4CW51bV9zaWRlczsJLyogMHg4MCBpZiB0d28tc2lkZWQgZm9ybWF0IHN1cHBvcnRlZCAgICAgKi8KLQlfX3U4CXR3b19zaWRlZDsJLyogMHhmZiBpZiB0d28tc2lkZWQgZm9ybWF0IGRpc2tldHRlICAgICAgKi8KLQlfX3U4CW5ld19pbnRlcmZhY2U7CS8qIDB4MDAgaWYgb2xkIDQwMEsgZHJpdmUsIDB4RkYgaWYgbmV3ZXIgICovCi0JX191MTYJZXJyb3JzOwkJLyogRGlzayBlcnJvciBjb3VudCAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlzdHJ1Y3QgewkJLyogMzIgYml0cyAqLwotCQlfX3UxNglyZXNlcnZlZDsKLQkJX191MTYJOjQ7Ci0JCV9fdTE2CWV4dGVybmFsOjE7CS8qIERyaXZlIGlzIGV4dGVybmFsICAgICAgICAqLwotCQlfX3UxNglzY3NpOjE7CQkvKiBEcml2ZSBpcyBhIFNDU0kgZHJpdmUgICAgKi8KLQkJX191MTYJZml4ZWQ6MTsJLyogRHJpdmUgaGFzIGZpeGVkIG1lZGlhICAgICovCi0JCV9fdTE2CXNlY29uZGFyeToxOwkvKiBEcml2ZSBpcyBzZWNvbmRhcnkgZHJpdmUgKi8KLQkJX191OAl0eXBlOwkJLyogRHJpdmUgdHlwZSAgICAgICAgICAgICAgICovCi0JfSBpbmZvOwotCV9fdTgJbWZtX2RyaXZlOwkvKiAweEZGIGlmIHRoaXMgaXMgYW4gRkRIRCBkcml2ZSAgICAqLwotCV9fdTgJbWZtX2Rpc2s7CS8qIDB4RkYgaWYgNzIwSy8xNDQwSyAoTUZNKSBkaXNrICAgICovCi0JX191OAltZm1fZm9ybWF0OwkvKiAweDAwIGlmIDcyMEssIDB4RkYgaWYgMTQ0MEsgICAgICAqLwotCV9fdTgJY3Rscl90eXBlOwkvKiAweDAwIGlmIElXTSwgMHhGRiBpZiBTV0lNICAgICAgICAqLwotCV9fdTE2CWN1cnJfZm9ybWF0OwkvKiBDdXJyZW50IGZvcm1hdCB0eXBlICAgICAgICAgICAgICAqLwotCV9fdTE2CWFsbG93ZWRfZm10OwkvKiBBbGxvd2VkIGZvcm1hdCB0eXBlcyAgICAgICAgICAgICAqLwotCV9fdTMyCW51bV9ibG9ja3M7CS8qIE51bWJlciBvZiBibG9ja3Mgb24gZGlzayAgICAgICAgICovCi0JX191OAlpY29uX2ZsYWdzOwkvKiBJY29uIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAqLwotCV9fdTgJdW51c3VlZDsKLX07Ci0KLS8qIENvbW1hbmRzIGlzc3VlZCBmcm9tIHRoZSBob3N0IHRvIHRoZSBJT1A6ICovCi0KLXN0cnVjdCBzd2ltY21kX2luaXQgewotCV9fdTgJY29kZTsJCS8qIENNRF9JTklUICovCi0JX191OAl1bnVzdWVkOwotCV9fdTE2CWVycm9yOwotCV9fdTgJZHJpdmVzWzI4XTsJLyogZHJpdmUgdHlwZSBsaXN0ICovCi19OwotCi1zdHJ1Y3Qgc3dpbWNtZF9zdGFydHBvbGwgewotCV9fdTgJY29kZTsJCS8qIENNRF9TVEFSVF9QT0xMICovCi0JX191OAl1bnVzdWVkOwotCV9fdTE2CWVycm9yOwotfTsKLQotc3RydWN0IHN3aW1jbWRfc2V0aGZzdGFnIHsKLQlfX3U4CWNvZGU7CQkvKiBDTURfU0VUSEZTVEFHICovCi0JX191OAl1bnVzdWVkOwotCV9fdTE2CWVycm9yOwotCWNhZGRyX3QJdGFnYnVmOwkJLyogSEZTIHRhZyBidWZmZXIgYWRkcmVzcyAqLwotfTsKLQotc3RydWN0IHN3aW1jbWRfc3RhdHVzIHsKLQlfX3U4CWNvZGU7CQkvKiBDTURfU1RBVFVTICovCi0JX191OAlkcml2ZV9udW07Ci0JX191MTYJZXJyb3I7Ci0Jc3RydWN0IHN3aW1fZHJ2c3RhdHVzIHN0YXR1czsKLX07Ci0KLXN0cnVjdCBzd2ltY21kX2VqZWN0IHsKLQlfX3U4CWNvZGU7CQkvKiBDTURfRUpFQ1QgKi8KLQlfX3U4CWRyaXZlX251bTsKLQlfX3UxNgllcnJvcjsKLQlzdHJ1Y3Qgc3dpbV9kcnZzdGF0dXMgc3RhdHVzOwotfTsKLQotc3RydWN0IHN3aW1jbWRfZm9ybWF0IHsKLQlfX3U4CWNvZGU7CQkvKiBDTURfRk9STUFUICovCi0JX191OAlkcml2ZV9udW07Ci0JX191MTYJZXJyb3I7Ci0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJX191MTYgZm10OwkgICAvKiBmb3JtYXQga2luZCAgICAgICAgICAgICAgICAgICovCi0JCQlfX3U4ICBoZHJieXRlOwkgICAvKiBmbXQgYnl0ZSBmb3IgaGRyICgwPWRlZmF1bHQpICovCi0JCQlfX3U4ICBpbnRlcmxlYXZlOyAgLyogaW50ZXJsZWF2ZSAoMCA9IGRlZmF1bHQpICAgICAqLwotCQkJY2FkZHJfdAlkYXRhYnVmOyAgIC8qIHNlY3RvciBkYXRhIGJ1ZmYgKDA9ZGVmYXVsdCAgKi8KLQkJCWNhZGRyX3QJdGFnYnVmOwkgICAvKiB0YWcgZGF0YSBidWZmZXIgKDA9ZGVmYXVsdCkgICovCi0JCX0gZjsKLQkJc3RydWN0IHN3aW1fZHJ2c3RhdHVzIHN0YXR1czsKLQl9IHA7Ci19OwotCi1zdHJ1Y3Qgc3dpbWNtZF9mbXR2ZXJpZnkgewotCV9fdTgJY29kZTsJCS8qIENNRF9GT1JNQVRfVkVSSUZZICovCi0JX191OAlkcml2ZV9udW07Ci0JX191MTYJZXJyb3I7Ci19OwotCi1zdHJ1Y3Qgc3dpbWNtZF9ydyB7Ci0JX191OAljb2RlOwkJLyogQ01EX1JFQUQsIENNRF9XUklURSBvciBDTURfUkVBRF9WRVJJRlkgKi8KLQlfX3U4CWRyaXZlX251bTsKLQlfX3UxNgllcnJvcjsKLQljYWRkcl90CWJ1ZmZlcjsJCS8qIFIvVyBidWZmZXIgYWRkcmVzcyAqLwotCV9fdTMyCWZpcnN0X2Jsb2NrOwkvKiBTdGFydGluZyBibG9jayAgICAgKi8KLQlfX3UzMgludW1fYmxvY2tzOwkvKiBOdW1iZXIgb2YgYmxvY2tzICAgKi8KLQlfX3U4CXRhZ1sxMl07CS8qIHRhZyBkYXRhICAgICAgICAgICAqLwotfTsKLQotc3RydWN0IHN3aW1jbWRfY2FjaGVjdGwgewotCV9fdTgJY29kZTsJCS8qIENNRF9DQUNIRV9DVFJMICovCi0JX191OAl1bnVzZWQ7Ci0JX191MTYJZXJyb3I7Ci0JX191OAllbmFibGU7CQkvKiBOb256ZXJvIHRvIGVuYWJsZSBjYWNoZSAgICAgICAgICAgICAgICAqLwotCV9fdTgJaW5zdGFsbDsJLyogKzEgPSBpbnN0YWxsLCAtMSA9IHJlbW92ZSwgMCA9IG5laXRoZXIgKi8KLX07Ci0KLXN0cnVjdCBzd2ltY21kX3RhZ2J1ZmN0bCB7Ci0JX191OAljb2RlOwkJLyogQ01EX1RBR0JVRkZfQ1RSTCAqLwotCV9fdTgJdW51c2VkOwotCV9fdTE2CWVycm9yOwotCWNhZGRyX3QJYnVmOwkJLyogYnVmZmVyIGFkZHJlc3Mgb3IgMCB0byBkaXNhYmxlICovCi19OwotCi1zdHJ1Y3Qgc3dpbWNtZF9nZXRpY29uIHsKLQlfX3U4CWNvZGU7CQkvKiBDTURfR0VUX0lDT04gKi8KLQlfX3U4CWRyaXZlX251bTsKLQlfX3UxNgllcnJvcjsKLQljYWRkcl90CWJ1ZmZlcjsJCS8qIE51ZmZlciBhZGRyZXNzICovCi0JX191MTYJa2luZDsJCS8qIDAgPSBtZWRpYSBpY29uLCAxID0gZHJpdmUgaWNvbiAqLwotCV9fdTE2CXVudXNlZDsKLQlfX3UxNgltYXhfYnl0ZXM7CS8qIG1heGltdW0gIGJ5dGUgY291bnQgKi8KLX07Ci0KLS8qIE1lc3NhZ2VzIGZyb20gdGhlIFNXSU0gSU9QIHRvIHRoZSBob3N0IENQVTogKi8KLQotc3RydWN0IHN3aW1tc2dfc3RhdHVzIHsKLQlfX3U4CWNvZGU7CQkvKiAxID0gaW5zZXJ0LCAyID0gZWplY3QsIDMgPSBzdGF0dXMgY2hhbmdlZCAqLwotCV9fdTgJZHJpdmVfbnVtOwotCV9fdTE2CWVycm9yOwotCXN0cnVjdCBzd2ltX2RydnN0YXR1cyBzdGF0dXM7Ci19OwotCi0jZW5kaWYgLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1tNjhrL3Rlcm1iaXRzLmgKaW5kZXggZTllZWMzZS4uYTE5NDA5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvdGVybWJpdHMuaApAQCAtMTcsNiArMTcsMTcgQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIgMAogI2RlZmluZSBWUVVJVCAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tbTY4ay91bmlzdGQuaAppbmRleCBhZDQzNDgwLi5mZGJiNjBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvdW5pc3RkLmgKQEAgLTMxNywxMDMgKzMxNyw2IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIE5SX3N5c2NhbGxzCQkzMTEKLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC1NQVhfRVJSTk86IHNlZQotICAgPGFzbS1tNjhrL2Vycm5vLmg+ICovCi0KLSNkZWZpbmUgX19zeXNjYWxsX3JldHVybih0eXBlLCByZXMpIFwKLWRvIHsgXAotCWlmICgodW5zaWduZWQgbG9uZykocmVzKSA+PSAodW5zaWduZWQgbG9uZykoLU1BWF9FUlJOTykpIHsgXAotCS8qIGF2b2lkIHVzaW5nIHJlcyB3aGljaCBpcyBkZWNsYXJlZCB0byBiZSBpbiByZWdpc3RlciBkMDsgXAotCSAgIGVycm5vIG1pZ2h0IGV4cGFuZCB0byBhIGZ1bmN0aW9uIGNhbGwgYW5kIGNsb2JiZXIgaXQuICAqLyBcCi0JCWludCBfX2VyciA9IC0ocmVzKTsgXAotCQllcnJubyA9IF9fZXJyOyBcCi0JCXJlcyA9IC0xOyBcCi0JfSBcCi0JcmV0dXJuICh0eXBlKSAocmVzKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfc3lzY2FsbDAodHlwZSxuYW1lKSBcCi10eXBlIG5hbWUodm9pZCkgXAoteyBcCi1yZWdpc3RlciBsb25nIF9fcmVzIF9fYXNtX18gKCIlZDAiKSA9IF9fTlJfIyNuYW1lOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXAgICMwIiBcCi0gICAgICAgICAgICAgICAgICAgICAgOiAiK2QiIChfX3JlcykgKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMSh0eXBlLG5hbWUsYXR5cGUsYSkgXAotdHlwZSBuYW1lKGF0eXBlIGEpIFwKLXsgXAotcmVnaXN0ZXIgbG9uZyBfX3JlcyBfX2FzbV9fICgiJWQwIikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX2EgX19hc21fXyAoIiVkMSIpID0gKGxvbmcpKGEpOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXAgICMwIiBcCi0JCSAgICAgIDogIitkIiAoX19yZXMpIFwKLQkJICAgICAgOiAiZCIgKF9fYSkgICk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLGF0eXBlLGEsYnR5cGUsYikgXAotdHlwZSBuYW1lKGF0eXBlIGEsYnR5cGUgYikgXAoteyBcCi1yZWdpc3RlciBsb25nIF9fcmVzIF9fYXNtX18gKCIlZDAiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fYSBfX2FzbV9fICgiJWQxIikgPSAobG9uZykoYSk7IFwKLXJlZ2lzdGVyIGxvbmcgX19iIF9fYXNtX18gKCIlZDIiKSA9IChsb25nKShiKTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0cmFwICAjMCIgXAotCQkgICAgICA6ICIrZCIgKF9fcmVzKSBcCi0gICAgICAgICAgICAgICAgICAgICAgOiAiZCIgKF9fYSksICJkIiAoX19iKSBcCi0JCSAgICAgKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMyh0eXBlLG5hbWUsYXR5cGUsYSxidHlwZSxiLGN0eXBlLGMpIFwKLXR5cGUgbmFtZShhdHlwZSBhLGJ0eXBlIGIsY3R5cGUgYykgXAoteyBcCi1yZWdpc3RlciBsb25nIF9fcmVzIF9fYXNtX18gKCIlZDAiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fYSBfX2FzbV9fICgiJWQxIikgPSAobG9uZykoYSk7IFwKLXJlZ2lzdGVyIGxvbmcgX19iIF9fYXNtX18gKCIlZDIiKSA9IChsb25nKShiKTsgXAotcmVnaXN0ZXIgbG9uZyBfX2MgX19hc21fXyAoIiVkMyIpID0gKGxvbmcpKGMpOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXAgICMwIiBcCi0JCSAgICAgIDogIitkIiAoX19yZXMpIFwKLSAgICAgICAgICAgICAgICAgICAgICA6ICJkIiAoX19hKSwgImQiIChfX2IpLCBcCi0JCQkiZCIgKF9fYykgXAotCQkgICAgICk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDQodHlwZSxuYW1lLGF0eXBlLGEsYnR5cGUsYixjdHlwZSxjLGR0eXBlLGQpIFwKLXR5cGUgbmFtZSAoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCkgXAoteyBcCi1yZWdpc3RlciBsb25nIF9fcmVzIF9fYXNtX18gKCIlZDAiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fYSBfX2FzbV9fICgiJWQxIikgPSAobG9uZykoYSk7IFwKLXJlZ2lzdGVyIGxvbmcgX19iIF9fYXNtX18gKCIlZDIiKSA9IChsb25nKShiKTsgXAotcmVnaXN0ZXIgbG9uZyBfX2MgX19hc21fXyAoIiVkMyIpID0gKGxvbmcpKGMpOyBcCi1yZWdpc3RlciBsb25nIF9fZCBfX2FzbV9fICgiJWQ0IikgPSAobG9uZykoZCk7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcCAgIzAiIFwKLSAgICAgICAgICAgICAgICAgICAgICA6ICIrZCIgKF9fcmVzKSBcCi0gICAgICAgICAgICAgICAgICAgICAgOiAiZCIgKF9fYSksICJkIiAoX19iKSwgXAotCQkJImQiIChfX2MpLCAiZCIgKF9fZCkgIFwKLQkJICAgICApOyBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw1KHR5cGUsbmFtZSxhdHlwZSxhLGJ0eXBlLGIsY3R5cGUsYyxkdHlwZSxkLGV0eXBlLGUpIFwKLXR5cGUgbmFtZSAoYXR5cGUgYSxidHlwZSBiLGN0eXBlIGMsZHR5cGUgZCxldHlwZSBlKSBcCi17IFwKLXJlZ2lzdGVyIGxvbmcgX19yZXMgX19hc21fXyAoIiVkMCIpID0gX19OUl8jI25hbWU7IFwKLXJlZ2lzdGVyIGxvbmcgX19hIF9fYXNtX18gKCIlZDEiKSA9IChsb25nKShhKTsgXAotcmVnaXN0ZXIgbG9uZyBfX2IgX19hc21fXyAoIiVkMiIpID0gKGxvbmcpKGIpOyBcCi1yZWdpc3RlciBsb25nIF9fYyBfX2FzbV9fICgiJWQzIikgPSAobG9uZykoYyk7IFwKLXJlZ2lzdGVyIGxvbmcgX19kIF9fYXNtX18gKCIlZDQiKSA9IChsb25nKShkKTsgXAotcmVnaXN0ZXIgbG9uZyBfX2UgX19hc21fXyAoIiVkNSIpID0gKGxvbmcpKGUpOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXAgICMwIiBcCi0JCSAgICAgIDogIitkIiAoX19yZXMpIFwKLQkJICAgICAgOiAiZCIgKF9fYSksICJkIiAoX19iKSwgXAotCQkJImQiIChfX2MpLCAiZCIgKF9fZCksICJkIiAoX19lKSAgXAotICAgICAgICAgICAgICAgICAgICAgKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2NhY2hlZmx1c2guaAppbmRleCBjM2FhZGYzLi4xNjNkY2IxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9jYWNoZWZsdXNoLmgKQEAgLTgsNiArOCw3IEBACiAKICNkZWZpbmUgZmx1c2hfY2FjaGVfYWxsKCkJCQlfX2ZsdXNoX2NhY2hlX2FsbCgpCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKQlfX2ZsdXNoX2NhY2hlX2FsbCgpCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIpCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydCxsZW4pCQlfX2ZsdXNoX2NhY2hlX2FsbCgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9jaGVja3N1bS5oCmluZGV4IDI5NGVjNzUuLjgxODgzNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9jaGVja3N1bS5oCkBAIC0xNSw3ICsxNSw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMjUsOCArMjUsOCBAQAogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwogCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JaW50IGxlbiwgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwlpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogCiAvKgpAQCAtMzYsMzMgKzM2LDMxIEBACiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQl1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sIGludCBzdW0sIGludCAqY3N1bV9lcnIpOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKwl2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqY3N1bV9lcnIpOwogCi0jZGVmaW5lIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soc3JjLCBkc3QsIGxlbiwgc3VtKQlcCi0JY3N1bV9wYXJ0aWFsX2NvcHkoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSkpCi0KLXVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICppcGgsIHVuc2lnbmVkIGludCBpaGwpOworX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CisJdW5zaWduZWQgaW50IHRtcCA9IChfX2ZvcmNlIHUzMilzdW07CiAjaWZkZWYgQ09ORklHX0NPTERGSVJFCi0Jc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKLQlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOworCXRtcCA9ICh0bXAgJiAweGZmZmYpICsgKHRtcCA+PiAxNik7CisJdG1wID0gKHRtcCAmIDB4ZmZmZikgKyAodG1wID4+IDE2KTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+dG1wOwogI2Vsc2UKLQl1bnNpZ25lZCBpbnQgdG1wID0gc3VtOwogCV9fYXNtX18oInN3YXAgJTFcblx0IgogCQkiYWRkdyAlMSwgJTBcblx0IgogCQkiY2xydyAlMVxuXHQiCiAJCSJhZGR4dyAlMSwgJTAiCiAJCTogIj0mZCIgKHN1bSksICI9JmQiICh0bXApCiAJCTogIjAiIChzdW0pLCAiMSIgKHN1bSkpOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5zdW07CiAjZW5kaWYKLQlyZXR1cm4gfnN1bTsKIH0KIAogCkBAIC03MSw5ICs2OSw5IEBACiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gKCJhZGRsICAlMSwlMFxuXHQiCiAJCSAiYWRkeGwgJTQsJTBcblx0IgpAQCAtODYsOSArODQsOSBAQAogCXJldHVybiBzdW07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYKK2NzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCSAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtOTgsMTIgKzk2LDEyIEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKTsKK2V4dGVybiBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKTsKIAogI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW50Ci1jc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgdW5zaWduZWQgaW50IHN1bSkgCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2Citjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRtcDsKIAlfX2FzbV9fKCJhZGRsICUyQCwlMFxuXHQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9kbWEtbWFwcGluZy5oCmluZGV4IDU2MjJiODUuLjZhZWFiMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9kbWEtbWFwcGluZy5oCkBAIC0xLDkgKzEsMTAgQEAKICNpZm5kZWYgX002OEtOT01NVV9ETUFfTUFQUElOR19ICiAjZGVmaW5lIF9NNjhLTk9NTVVfRE1BX01BUFBJTkdfSAogCi0KICNpZmRlZiBDT05GSUdfUENJCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+CiAjZW5kaWYKIAogI2VuZGlmICAvKiBfTTY4S05PTU1VX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnEuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnEuaAppbmRleCA0NWU3YTJmZC4uN2I4Zjg3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnEuaApAQCAtODYsNSArODYsNiBAQAogI2RlZmluZSBlbmFibGVfaXJxKHgpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZGlzYWJsZV9pcnEoeCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBkaXNhYmxlX2lycV9ub3N5bmMoeCkJZGlzYWJsZV9pcnEoeCkKKyNkZWZpbmUgaXJxX2Nhbm9uaWNhbGl6ZShpcnEpCShpcnEpCiAKICNlbmRpZiAvKiBfTTY4S19JUlFfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnFfcmVncy5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycV9yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkOWMwYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnFfcmVncy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnFfcmVncy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycW5vZGUuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnFub2RlLmgKaW5kZXggYTI1MDNkZi4uNjEzMmE5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycW5vZGUuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaXJxbm9kZS5oCkBAIC04LDcgKzgsNyBAQAogICogaW50ZXJydXB0IHNvdXJjZSAoaWYgaXQgc3VwcG9ydHMgY2hhaW5pbmcpLgogICovCiB0eXBlZGVmIHN0cnVjdCBpcnFfbm9kZSB7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisJaXJxX2hhbmRsZXJfdAloYW5kbGVyOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJdm9pZAkJKmRldl9pZDsKIAljb25zdCBjaGFyCSpkZXZuYW1lOwpAQCAtMTgsMTIgKzE4LDEyIEBACiAvKgogICogVGhpcyBzdHJ1Y3R1cmUgaGFzIG9ubHkgNCBlbGVtZW50cyBmb3Igc3BlZWQgcmVhc29ucwogICovCi10eXBlZGVmIHN0cnVjdCBpcnFfaGFuZGxlciB7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdHJ1Y3QgaXJxX2VudHJ5IHsKKwlpcnFfaGFuZGxlcl90CWhhbmRsZXI7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAl2b2lkCQkqZGV2X2lkOwogCWNvbnN0IGNoYXIJKmRldm5hbWU7Ci19IGlycV9oYW5kbGVyX3Q7Cit9OwogCiAvKiBjb3VudCBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCiBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgaW50IG51bV9zcHVyaW91czsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9tNTIweHNpbS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjB4c2ltLmgKaW5kZXggMWRhYzIyZS4uNDlkMDE2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjB4c2ltLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L201MjB4c2ltLmgKQEAgLTMxLDYgKzMxLDE2IEBACiAjZGVmaW5lIE1DRklOVF9RU1BJICAgICAgICAgMzEgICAgICAgICAgLyogSW50ZXJydXB0IG51bWJlciBmb3IgUVNQSSAqLwogI2RlZmluZSBNQ0ZJTlRfUElUMSAgICAgICAgIDQgICAgICAgICAgIC8qIEludGVycnVwdCBudW1iZXIgZm9yIFBJVDEgKFBJVDAgaW4gcHJvY2Vzc29yKSAqLwogCisvKgorICogIFNEUkFNIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIE1DRlNJTV9TRE1SICAgICAgICAgMHgwMDBhODAwMAkvKiBTRFJBTSBNb2RlL0V4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNGU0lNX1NEQ1IgICAgICAgICAweDAwMGE4MDA0CS8qIFNEUkFNIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNGU0lNX1NEQ0ZHMSAgICAgICAweDAwMGE4MDA4CS8qIFNEUkFNIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZSBNQ0ZTSU1fU0RDRkcyICAgICAgIDB4MDAwYTgwMGMJLyogU0RSQU0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lIE1DRlNJTV9TRENTMCAgICAgICAgMHgwMDBhODExMAkvKiBTRFJBTSBDaGlwIFNlbGVjdCAwIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTUNGU0lNX1NEQ1MxICAgICAgICAweDAwMGE4MTE0CS8qIFNEUkFNIENoaXAgU2VsZWN0IDEgQ29uZmlndXJhdGlvbiAqLworCiAKICNkZWZpbmUgTUNGX0dQSU9fUEFSX1VBUlQgICAgICAgICAgICAgICAgICAgKDB4QTQwMzYpCiAjZGVmaW5lIE1DRl9HUElPX1BBUl9GRUNJMkMgICAgICAgICAgICAgICAgICgweEE0MDMzKQpAQCAtNDcsNyArNTcsNyBAQAogCiAjZGVmaW5lIElDUl9JTlRSQ09ORgkJMHgwNQogI2RlZmluZSBNQ0ZQSVRfSU1SCQlNQ0ZJTlRDX0lNUkwKLSNkZWZpbmUgTUNGUElUX0lNUl9JQklUCSgxIDw8IE1DRklOVF9QSVQxKQorI2RlZmluZSBNQ0ZQSVRfSU1SX0lCSVQJCSgxIDw8IE1DRklOVF9QSVQxKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNlbmRpZiAgLyogbTUyMHhzaW1faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tYWNoZGVwLmgKaW5kZXggMjdjOTBhZi4uNmNlMjhmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21hY2hkZXAuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWFjaGRlcC5oCkBAIC0xOCw3ICsxOCw3IEBACiBleHRlcm4gdm9pZCAoKm1hY2hfa2JkX2xlZHMpICh1bnNpZ25lZCBpbnQpOwogLyogbWFjaGluZSBkZXBlbmRlbnQgaXJxIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHZvaWQgKCptYWNoX2luaXRfSVJRKSAodm9pZCk7Ci1leHRlcm4gaXJxcmV0dXJuX3QgKCooKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIGlycV9oYW5kbGVyX3QgbWFjaF9kZWZhdWx0X2hhbmRsZXI7CiBleHRlcm4gaW50ICgqbWFjaF9yZXF1ZXN0X2lycSkgKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7CiBleHRlcm4gdm9pZCAoKm1hY2hfZnJlZV9pcnEpICh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZm1idXMuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9tY2ZtYnVzLmgKaW5kZXggMTNkZjlkNC4uMzE5ODk5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L21jZm1idXMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvbWNmbWJ1cy5oCkBAIC0zNyw3ICszNyw3IEBACiAjZGVmaW5lIE1DRk1CVVNfTUZEUl9NQkMoYSkJKChhKSYweDNGKQkgICAvKk0tQnVzIENsb2NrKi8KIAogLyoKLSoJRGVmaW5lIGJpdCBmbGFncyBpbiBDb250cm9sbCBSZWdpc3RlcgorKglEZWZpbmUgYml0IGZsYWdzIGluIENvbnRyb2wgUmVnaXN0ZXIKICovCiAKICNkZWZpbmUgTUNGTUJVU19NQkNSX01FTiAgICAgICAgICAgKDB4ODApICAvKiBNLUJ1cyBFbmFibGUgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcnRjLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmMThlYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9ydGMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLW02OGsvcnRjLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvc2NhdHRlcmxpc3QuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9zY2F0dGVybGlzdC5oCmluZGV4IDEyMzA5YjEuLjIwODVkNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9zY2F0dGVybGlzdC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9zY2F0dGVybGlzdC5oCkBAIC0xMCw3ICsxMCw3IEBACiAJdW5zaWduZWQgaW50CWxlbmd0aDsKIH07CiAKLSNkZWZpbmUgc2dfYWRkcmVzcyhzZykgKHBhZ2VfYWRkcmVzcygoc2cpLT5wYWdlKSArIChzZyktPm9mZnNldAorI2RlZmluZSBzZ19hZGRyZXNzKHNnKQkJKHBhZ2VfYWRkcmVzcygoc2cpLT5wYWdlKSArIChzZyktPm9mZnNldCkKICNkZWZpbmUgc2dfZG1hX2FkZHJlc3Moc2cpICAgICAgKChzZyktPmRtYV9hZGRyZXNzKQogI2RlZmluZSBzZ19kbWFfbGVuKHNnKSAgICAgICAgICAoKHNnKS0+bGVuZ3RoKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9zZXR1cC5oCmluZGV4IGQyYjBmY2MuLmZiODZiYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9zZXR1cC5oCkBAIC0xLDUgKzEsMTAgQEAKKyNpZmRlZiBfX0tFUk5FTF9fCisKICNpbmNsdWRlIDxhc20tbTY4ay9zZXR1cC5oPgogCiAvKiBXZSBoYXZlIGEgYmlnZ2VyIGNvbW1hbmQgbGluZSBidWZmZXIuICovCiAjdW5kZWYgQ09NTUFORF9MSU5FX1NJWkUKKworI2VuZGlmICAvKiAgX19LRVJORUxfXyAgKi8KKwogI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRQk1MTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS91Y29udGV4dC5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3Vjb250ZXh0LmgKaW5kZXggNWQ1NzBjZS4uNzEzYTI3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3Vjb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3Vjb250ZXh0LmgKQEAgLTUsMjEgKzUsMTcgQEAKICNkZWZpbmUgTkdSRUcgMTgKIHR5cGVkZWYgZ3JlZ190IGdyZWdzZXRfdFtOR1JFR107CiAKLSNpZmRlZiBDT05GSUdfRlBVCiB0eXBlZGVmIHN0cnVjdCBmcHJlZ3NldCB7CiAJaW50IGZfcGNyOwogCWludCBmX3BzcjsKIAlpbnQgZl9mcGlhZGRyOwogCWludCBmX2ZwcmVnc1s4XVszXTsKIH0gZnByZWdzZXRfdDsKLSNlbmRpZgogCiBzdHJ1Y3QgbWNvbnRleHQgewogCWludCB2ZXJzaW9uOwogCWdyZWdzZXRfdCBncmVnczsKLSNpZmRlZiBDT05GSUdfRlBVCiAJZnByZWdzZXRfdCBmcHJlZ3M7Ci0jZW5kaWYKIH07CiAKICNkZWZpbmUgTUNPTlRFWFRfVkVSU0lPTiAyCkBAIC0yOSw5ICsyNSw3IEBACiAJc3RydWN0IHVjb250ZXh0ICAqdWNfbGluazsKIAlzdGFja190CQkgIHVjX3N0YWNrOwogCXN0cnVjdCBtY29udGV4dAkgIHVjX21jb250ZXh0OwotI2lmZGVmIENPTkZJR19GUFUKIAl1bnNpZ25lZCBsb25nCSAgdWNfZmlsbGVyWzgwXTsKLSNlbmRpZgogCXNpZ3NldF90CSAgdWNfc2lnbWFzazsJLyogbWFzayBsYXN0IGZvciBleHRlbnNpYmlsaXR5ICovCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdW5pc3RkLmgKaW5kZXggZWJhZjAzMS4uODJlMDMxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS91bmlzdGQuaApAQCAtMzE4LDE1NiArMzE4LDYgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgTlJfc3lzY2FsbHMJCTMxMQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0vKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLU1BWF9FUlJOTzogc2VlCi0gICA8YXNtLW02OGsvZXJybm8uaD4gKi8KLQotI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAotZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCi0JLyogYXZvaWQgdXNpbmcgcmVzIHdoaWNoIGlzIGRlY2xhcmVkIHRvIGJlIGluIHJlZ2lzdGVyIGQwOyBcCi0JICAgZXJybm8gbWlnaHQgZXhwYW5kIHRvIGEgZnVuY3Rpb24gY2FsbCBhbmQgY2xvYmJlciBpdC4gICovIFwKLQkJaW50IF9fZXJyID0gLShyZXMpOyBcCi0JCWVycm5vID0gX19lcnI7IFwKLQkJcmVzID0gLTE7IFwKLQl9IFwKLQlyZXR1cm4gKHR5cGUpIChyZXMpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLCBuYW1lKQkJCQkJCQlcCi10eXBlIG5hbWUodm9pZCkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCVwKLSAgbG9uZyBfX3JlczsJCQkJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZWwJJTEsICUlZDBcblx0IgkJCQkJXAotICAJCQkidHJhcAkjMFxuXHQiCQkJCQkJXAotICAJCQkibW92ZWwJJSVkMCwgJTAiCQkJCQlcCi0JCQk6ICI9ZyIgKF9fcmVzKQkJCQkJCVwKLQkJCTogImkiIChfX05SXyMjbmFtZSkJCQkJCVwKLQkJCTogImNjIiwgIiVkMCIpOwkJCQkJCVwKLSAgaWYgKCh1bnNpZ25lZCBsb25nKShfX3JlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC0xMjUpKSB7CQkJCVwKLSAgICBlcnJubyA9IC1fX3JlczsJCQkJCQkJCVwKLSAgICBfX3JlcyA9IC0xOwkJCQkJCQkJCVwKLSAgfQkJCQkJCQkJCQlcCi0gIHJldHVybiAodHlwZSlfX3JlczsJCQkJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSwgbmFtZSwgYXR5cGUsIGEpCQkJCQkJXAotdHlwZSBuYW1lKGF0eXBlIGEpCQkJCQkJCQlcCi17CQkJCQkJCQkJCVwKLSAgbG9uZyBfX3JlczsJCQkJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZWwJJTIsICUlZDFcblx0IgkJCQkJXAotICAJCQkibW92ZWwJJTEsICUlZDBcblx0IgkJCQkJXAotICAJCQkidHJhcAkjMFxuXHQiCQkJCQkJXAotICAJCQkibW92ZWwJJSVkMCwgJTAiCQkJCQlcCi0JCQk6ICI9ZyIgKF9fcmVzKQkJCQkJCVwKLQkJCTogImkiIChfX05SXyMjbmFtZSksCQkJCQlcCi0JCQkgICJnIiAoKGxvbmcpYSkJCQkJCQlcCi0JCQk6ICJjYyIsICIlZDAiLCAiJWQxIik7CQkJCQlcCi0gIGlmICgodW5zaWduZWQgbG9uZykoX19yZXMpID49ICh1bnNpZ25lZCBsb25nKSgtMTI1KSkgewkJCQlcCi0gICAgZXJybm8gPSAtX19yZXM7CQkJCQkJCQlcCi0gICAgX19yZXMgPSAtMTsJCQkJCQkJCQlcCi0gIH0JCQkJCQkJCQkJXAotICByZXR1cm4gKHR5cGUpX19yZXM7CQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwyKHR5cGUsIG5hbWUsIGF0eXBlLCBhLCBidHlwZSwgYikJCQkJXAotdHlwZSBuYW1lKGF0eXBlIGEsIGJ0eXBlIGIpCQkJCQkJCVwKLXsJCQkJCQkJCQkJXAotICBsb25nIF9fcmVzOwkJCQkJCQkJCVwKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlbAklMywgJSVkMlxuXHQiCQkJCQlcCi0gIAkJCSJtb3ZlbAklMiwgJSVkMVxuXHQiCQkJCQlcCi0JCQkibW92ZWwJJTEsICUlZDBcblx0IgkJCQkJXAotICAJCQkidHJhcAkjMFxuXHQiCQkJCQkJXAotICAJCQkibW92ZWwJJSVkMCwgJTAiCQkJCQlcCi0JCQk6ICI9ZyIgKF9fcmVzKQkJCQkJCVwKLQkJCTogImkiIChfX05SXyMjbmFtZSksCQkJCQlcCi0JCQkgICJhIiAoKGxvbmcpYSksCQkJCQlcCi0JCQkgICJnIiAoKGxvbmcpYikJCQkJCQlcCi0JCQk6ICJjYyIsICIlZDAiLCAiJWQxIiwgIiVkMiIpOwkJCQlcCi0gIGlmICgodW5zaWduZWQgbG9uZykoX19yZXMpID49ICh1bnNpZ25lZCBsb25nKSgtMTI1KSkgewkJCQlcCi0gICAgZXJybm8gPSAtX19yZXM7CQkJCQkJCQlcCi0gICAgX19yZXMgPSAtMTsJCQkJCQkJCQlcCi0gIH0JCQkJCQkJCQkJXAotICByZXR1cm4gKHR5cGUpX19yZXM7CQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsIG5hbWUsIGF0eXBlLCBhLCBidHlwZSwgYiwgY3R5cGUsIGMpCQkJXAotdHlwZSBuYW1lKGF0eXBlIGEsIGJ0eXBlIGIsIGN0eXBlIGMpCQkJCQkJXAotewkJCQkJCQkJCQlcCi0gIGxvbmcgX19yZXM7CQkJCQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmVsCSU0LCAlJWQzXG5cdCIJCQkJCVwKLQkJCSJtb3ZlbAklMywgJSVkMlxuXHQiCQkJCQlcCi0gIAkJCSJtb3ZlbAklMiwgJSVkMVxuXHQiCQkJCQlcCi0JCQkibW92ZWwJJTEsICUlZDBcblx0IgkJCQkJXAotICAJCQkidHJhcAkjMFxuXHQiCQkJCQkJXAotICAJCQkibW92ZWwJJSVkMCwgJTAiCQkJCQlcCi0JCQk6ICI9ZyIgKF9fcmVzKQkJCQkJCVwKLQkJCTogImkiIChfX05SXyMjbmFtZSksCQkJCQlcCi0JCQkgICJhIiAoKGxvbmcpYSksCQkJCQlcCi0JCQkgICJhIiAoKGxvbmcpYiksCQkJCQlcCi0JCQkgICJnIiAoKGxvbmcpYykJCQkJCQlcCi0JCQk6ICJjYyIsICIlZDAiLCAiJWQxIiwgIiVkMiIsICIlZDMiKTsJCQlcCi0gIGlmICgodW5zaWduZWQgbG9uZykoX19yZXMpID49ICh1bnNpZ25lZCBsb25nKSgtMTI1KSkgewkJCQlcCi0gICAgZXJybm8gPSAtX19yZXM7CQkJCQkJCQlcCi0gICAgX19yZXMgPSAtMTsJCQkJCQkJCQlcCi0gIH0JCQkJCQkJCQkJXAotICByZXR1cm4gKHR5cGUpX19yZXM7CQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsIG5hbWUsIGF0eXBlLCBhLCBidHlwZSwgYiwgY3R5cGUsIGMsIGR0eXBlLCBkKQkJXAotdHlwZSBuYW1lKGF0eXBlIGEsIGJ0eXBlIGIsIGN0eXBlIGMsIGR0eXBlIGQpCQkJCQlcCi17CQkJCQkJCQkJCVwKLSAgbG9uZyBfX3JlczsJCQkJCQkJCQlcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZWwJJTUsICUlZDRcblx0IgkJCQkJXAotCQkJIm1vdmVsCSU0LCAlJWQzXG5cdCIJCQkJCVwKLQkJCSJtb3ZlbAklMywgJSVkMlxuXHQiCQkJCQlcCi0gIAkJCSJtb3ZlbAklMiwgJSVkMVxuXHQiCQkJCQlcCi0JCQkibW92ZWwJJTEsICUlZDBcblx0IgkJCQkJXAotICAJCQkidHJhcAkjMFxuXHQiCQkJCQkJXAotICAJCQkibW92ZWwJJSVkMCwgJTAiCQkJCQlcCi0JCQk6ICI9ZyIgKF9fcmVzKQkJCQkJCVwKLQkJCTogImkiIChfX05SXyMjbmFtZSksCQkJCQlcCi0JCQkgICJhIiAoKGxvbmcpYSksCQkJCQlcCi0JCQkgICJhIiAoKGxvbmcpYiksCQkJCQlcCi0JCQkgICJhIiAoKGxvbmcpYyksCQkJCQlcCi0JCQkgICJnIiAoKGxvbmcpZCkJCQkJCQlcCi0JCQk6ICJjYyIsICIlZDAiLCAiJWQxIiwgIiVkMiIsICIlZDMiLAkJCVwKLQkJCSAgIiVkNCIpOwkJCQkJCVwKLSAgaWYgKCh1bnNpZ25lZCBsb25nKShfX3JlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC0xMjUpKSB7CQkJCVwKLSAgICBlcnJubyA9IC1fX3JlczsJCQkJCQkJCVwKLSAgICBfX3JlcyA9IC0xOwkJCQkJCQkJCVwKLSAgfQkJCQkJCQkJCQlcCi0gIHJldHVybiAodHlwZSlfX3JlczsJCQkJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDUodHlwZSwgbmFtZSwgYXR5cGUsIGEsIGJ0eXBlLCBiLCBjdHlwZSwgYywgZHR5cGUsIGQsIGV0eXBlLCBlKQlcCi10eXBlIG5hbWUoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCwgZXR5cGUgZSkJCQkJXAotewkJCQkJCQkJCQlcCi0gIGxvbmcgX19yZXM7CQkJCQkJCQkJXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmVsCSU2LCAlJWQ1XG5cdCIJCQkJCVwKLQkJCSJtb3ZlbAklNSwgJSVkNFxuXHQiCQkJCQlcCi0JCQkibW92ZWwJJTQsICUlZDNcblx0IgkJCQkJXAotCQkJIm1vdmVsCSUzLCAlJWQyXG5cdCIJCQkJCVwKLSAgCQkJIm1vdmVsCSUyLCAlJWQxXG5cdCIJCQkJCVwKLQkJCSJtb3ZlbAklMSwgJSVkMFxuXHQiCQkJCQlcCi0gIAkJCSJ0cmFwCSMwXG5cdCIJCQkJCQlcCi0gIAkJCSJtb3ZlbAklJWQwLCAlMCIJCQkJCVwKLQkJCTogIj1nIiAoX19yZXMpCQkJCQkJXAotCQkJOiAiaSIgKF9fTlJfIyNuYW1lKSwJCQkJCVwKLQkJCSAgImEiICgobG9uZylhKSwJCQkJCVwKLQkJCSAgImEiICgobG9uZyliKSwJCQkJCVwKLQkJCSAgImEiICgobG9uZyljKSwJCQkJCVwKLQkJCSAgImEiICgobG9uZylkKSwJCQkJCVwKLQkJCSAgImciICgobG9uZyllKQkJCQkJCVwKLQkJCTogImNjIiwgIiVkMCIsICIlZDEiLCAiJWQyIiwgIiVkMyIsCQkJXAotCQkJICAiJWQ0IiwgIiVkNSIpOwkJCQkJXAotICBpZiAoKHVuc2lnbmVkIGxvbmcpKF9fcmVzKSA+PSAodW5zaWduZWQgbG9uZykoLTEyNSkpIHsJCQkJXAotICAgIGVycm5vID0gLV9fcmVzOwkJCQkJCQkJXAotICAgIF9fcmVzID0gLTE7CQkJCQkJCQkJXAotICB9CQkJCQkJCQkJCVwKLSAgcmV0dXJuICh0eXBlKV9fcmVzOwkJCQkJCQkJXAotfQogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2FkZHJzcGFjZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9hZGRyc3BhY2UuaAppbmRleCA0NWM3MDZlLi5jNjI3NTA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2FkZHJzcGFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYWRkcnNwYWNlLmgKQEAgLTE5LDEyICsxOSwxNiBAQAogI2RlZmluZSBfQVRZUEVfCiAjZGVmaW5lIF9BVFlQRTMyXwogI2RlZmluZSBfQVRZUEU2NF8KLSNkZWZpbmUgX0xMQ09OU1RfKHgpCXgKKyNkZWZpbmUgX0NPTlNUNjRfKHgpCXgKICNlbHNlCiAjZGVmaW5lIF9BVFlQRV8JCV9fUFRSRElGRl9UWVBFX18KICNkZWZpbmUgX0FUWVBFMzJfCWludAotI2RlZmluZSBfQVRZUEU2NF8JbG9uZyBsb25nCi0jZGVmaW5lIF9MTENPTlNUXyh4KQl4ICMjIExMCisjZGVmaW5lIF9BVFlQRTY0XwlfX3M2NAorI2lmZGVmIENPTkZJR182NEJJVAorI2RlZmluZSBfQ09OU1Q2NF8oeCkJeCAjIyBMCisjZWxzZQorI2RlZmluZSBfQ09OU1Q2NF8oeCkJeCAjIyBMTAorI2VuZGlmCiAjZW5kaWYKIAogLyoKQEAgLTQ4LDcgKzUyLDcgQEAKICAqLwogI2RlZmluZSBDUEhZU0FERFIoYSkJCSgoX0FDQVNUMzJfKGEpKSAmIDB4MWZmZmZmZmYpCiAjZGVmaW5lIFhQSFlTQUREUihhKSAgICAgICAgICAgICgoX0FDQVNUNjRfKGEpKSAmCQkJXAotCQkJCSBfTExDT05TVF8oMHgwMDAwMDBmZmZmZmZmZmZmKSkKKwkJCQkgX0NPTlNUNjRfKDB4MDAwMDAwZmZmZmZmZmZmZikpCiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIApAQCAtNTcsMTQgKzYxLDE0IEBACiAgKiBUaGUgY29tcGF0aWJpbGl0eSBzZWdtZW50cyB1c2UgdGhlIGZ1bGwgNjQtYml0IHNpZ24gZXh0ZW5kZWQgdmFsdWUuICBOb3RlCiAgKiB0aGUgUjgwMDAgZG9lc24ndCBoYXZlIHRoZW0gc28gZG9uJ3QgcmVmZXJlbmNlIHRoZXNlIGluIGdlbmVyaWMgTUlQUyBjb2RlLgogICovCi0jZGVmaW5lIFhLVVNFRwkJCV9MTENPTlNUXygweDAwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lIFhLU1NFRwkJCV9MTENPTlNUXygweDQwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lIFhLUEhZUwkJCV9MTENPTlNUXygweDgwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lIFhLU0VHCQkJX0xMQ09OU1RfKDB4YzAwMDAwMDAwMDAwMDAwMCkKLSNkZWZpbmUgQ0tTRUcwCQkJX0xMQ09OU1RfKDB4ZmZmZmZmZmY4MDAwMDAwMCkKLSNkZWZpbmUgQ0tTRUcxCQkJX0xMQ09OU1RfKDB4ZmZmZmZmZmZhMDAwMDAwMCkKLSNkZWZpbmUgQ0tTU0VHCQkJX0xMQ09OU1RfKDB4ZmZmZmZmZmZjMDAwMDAwMCkKLSNkZWZpbmUgQ0tTRUczCQkJX0xMQ09OU1RfKDB4ZmZmZmZmZmZlMDAwMDAwMCkKKyNkZWZpbmUgWEtVU0VHCQkJX0NPTlNUNjRfKDB4MDAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgWEtTU0VHCQkJX0NPTlNUNjRfKDB4NDAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgWEtQSFlTCQkJX0NPTlNUNjRfKDB4ODAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgWEtTRUcJCQlfQ09OU1Q2NF8oMHhjMDAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBDS1NFRzAJCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZjgwMDAwMDAwKQorI2RlZmluZSBDS1NFRzEJCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZmEwMDAwMDAwKQorI2RlZmluZSBDS1NTRUcJCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZmMwMDAwMDAwKQorI2RlZmluZSBDS1NFRzMJCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZmUwMDAwMDAwKQogCiAjZGVmaW5lIENLU0VHMEFERFIoYSkJCShDUEhZU0FERFIoYSkgfCBDS1NFRzApCiAjZGVmaW5lIENLU0VHMUFERFIoYSkJCShDUEhZU0FERFIoYSkgfCBDS1NFRzEpCkBAIC0xMjIsNyArMTI2LDcgQEAKICNkZWZpbmUgUEhZU19UT19YS1NFR19VTkNBQ0hFRChwKQlQSFlTX1RPX1hLUEhZUyhLX0NBTEdfVU5DQUNIRUQsKHApKQogI2RlZmluZSBQSFlTX1RPX1hLU0VHX0NBQ0hFRChwKQkJUEhZU19UT19YS1BIWVMoS19DQUxHX0NPSF9TSEFSRUFCTEUsKHApKQogI2RlZmluZSBYS1BIWVNfVE9fUEhZUyhwKQkJKChwKSAmIFRPX1BIWVNfTUFTSykKLSNkZWZpbmUgUEhZU19UT19YS1BIWVMoY20sYSkJCShfTExDT05TVF8oMHg4MDAwMDAwMDAwMDAwMDAwKSB8IFwKKyNkZWZpbmUgUEhZU19UT19YS1BIWVMoY20sYSkJCShfQ09OU1Q2NF8oMHg4MDAwMDAwMDAwMDAwMDAwKSB8IFwKIAkJCQkJICgoY20pPDw1OSkgfCAoYSkpCiAKICNpZiBkZWZpbmVkIChDT05GSUdfQ1BVX1I0MzAwKQkJCQkJCVwKQEAgLTEzMiwyMCArMTM2LDIwIEBACiAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9ORVZBREEpCQkJCQlcCiAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9UWDQ5WFgpCQkJCQlcCiAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9NSVBTNjQpCi0jZGVmaW5lIFRPX1BIWVNfTUFTSwlfTExDT05TVF8oMHgwMDAwMDAwZmZmZmZmZmZmKQkvKiAyXl4zNiAtIDEgKi8KKyNkZWZpbmUgVE9fUEhZU19NQVNLCV9DT05TVDY0XygweDAwMDAwMDBmZmZmZmZmZmYpCS8qIDJeXjM2IC0gMSAqLwogI2VuZGlmCiAKICNpZiBkZWZpbmVkIChDT05GSUdfQ1BVX1I4MDAwKQogLyogV2Uga2VlcCBLVVNJWkUgY29uc2lzdGVudCB3aXRoIFI0MDAwIGZvciBub3cgKDJeXjQwKSBpbnN0ZWFkIG9mICgyXl40OCkgKi8KLSNkZWZpbmUgVE9fUEhZU19NQVNLCV9MTENPTlNUXygweDAwMDAwMGZmZmZmZmZmZmYpCS8qIDJeXjQwIC0gMSAqLworI2RlZmluZSBUT19QSFlTX01BU0sJX0NPTlNUNjRfKDB4MDAwMDAwZmZmZmZmZmZmZikJLyogMl5eNDAgLSAxICovCiAjZW5kaWYKIAogI2lmIGRlZmluZWQgKENPTkZJR19DUFVfUjEwMDAwKQotI2RlZmluZSBUT19QSFlTX01BU0sJX0xMQ09OU1RfKDB4MDAwMDAwZmZmZmZmZmZmZikJLyogMl5eNDAgLSAxICovCisjZGVmaW5lIFRPX1BIWVNfTUFTSwlfQ09OU1Q2NF8oMHgwMDAwMDBmZmZmZmZmZmZmKQkvKiAyXl40MCAtIDEgKi8KICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NCMSkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NCMUEpCi0jZGVmaW5lIFRPX1BIWVNfTUFTSwlfTExDT05TVF8oMHgwMDAwMGZmZmZmZmZmZmZmKQkvKiAyXl40NCAtIDEgKi8KKyNkZWZpbmUgVE9fUEhZU19NQVNLCV9DT05TVDY0XygweDAwMDAwZmZmZmZmZmZmZmYpCS8qIDJeXjQ0IC0gMSAqLwogI2VuZGlmCiAKICNpZm5kZWYgQ09ORklHX0NQVV9SODAwMApAQCAtMTU1LDcgKzE1OSw3IEBACiAgKiBpbiBvcmRlciB0byBjYXRjaCBidWdzIGluIHRoZSBzb3VyY2UgY29kZS4KICAqLwogCi0jZGVmaW5lIENPTVBBVF9LMUJBU0UzMgkJX0xMQ09OU1RfKDB4ZmZmZmZmZmZhMDAwMDAwMCkKKyNkZWZpbmUgQ09NUEFUX0sxQkFTRTMyCQlfQ09OU1Q2NF8oMHhmZmZmZmZmZmEwMDAwMDAwKQogI2RlZmluZSBQSFlTX1RPX0NPTVBBVEsxKHgpCSgoeCkgfCBDT01QQVRfSzFCQVNFMzIpIC8qIDMyLWJpdCBjb21wYXQgazEgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2FzbS5oIGIvaW5jbHVkZS9hc20tbWlwcy9hc20uaAppbmRleCBlMzAzOGE0Li44MzhlYjMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2FzbS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYXNtLmgKQEAgLTM0NCw2ICszNDQsNyBAQAogI2RlZmluZSBQVFJfTAkJbHcKICNkZWZpbmUgUFRSX1MJCXN3CiAjZGVmaW5lIFBUUl9MQQkJbGEKKyNkZWZpbmUgUFRSX0xJCQlsaQogI2RlZmluZSBQVFJfU0xMCQlzbGwKICNkZWZpbmUgUFRSX1NMTFYJc2xsdgogI2RlZmluZSBQVFJfU1JMCQlzcmwKQEAgLTM2OCw2ICszNjksNyBAQAogI2RlZmluZSBQVFJfTAkJbGQKICNkZWZpbmUgUFRSX1MJCXNkCiAjZGVmaW5lIFBUUl9MQQkJZGxhCisjZGVmaW5lIFBUUl9MSQkJZGxpCiAjZGVmaW5lIFBUUl9TTEwJCWRzbGwKICNkZWZpbmUgUFRSX1NMTFYJZHNsbHYKICNkZWZpbmUgUFRSX1NSTAkJZHNybApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvYXRvbWljLmgKaW5kZXggZTY0YWJjMC4uYzFhMjQwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2F0b21pYy5oCkBAIC05LDIwICs5LDEzIEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgOTcsIDk5LCAyMDAwLCAwMywgMDQgYnkgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDk3LCA5OSwgMjAwMCwgMDMsIDA0LCAwNiBieSBSYWxmIEJhZWNobGUKICAqLwotCi0vKgotICogQXMgd29ya2Fyb3VuZCBmb3IgdGhlIEFUT01JQ19ERUNfQU5EX0xPQ0sgLyBhdG9taWNfZGVjX2FuZF9sb2NrIG1lc3MgaW4KLSAqIDxsaW51eC9zcGlubG9jay5oPiB3ZSBoYXZlIHRvIGluY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+IG91dHNpZGUgdGhlCi0gKiBtYWluIGJpZyB3cmFwcGVyIC4uLgotICovCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQogI2lmbmRlZiBfQVNNX0FUT01JQ19ICiAjZGVmaW5lIF9BU01fQVRPTUlDX0gKIAogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KICNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgogCkBAIC0xMzgsNiArMTMxLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAorCXNtcF9tYigpOworCiAJaWYgKGNwdV9oYXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCkBAIC0xNDgsNyArMTQzLDYgQEAKIAkJIglzYwklMCwgJTIJCQkJCVxuIgogCQkiCWJlcXpsCSUwLCAxYgkJCQkJXG4iCiAJCSIJYWRkdQklMCwgJTEsICUzCQkJCVxuIgotCQkiCXN5bmMJCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQogCQk6ICJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpCkBAIC0xNjMsNyArMTU3LDYgQEAKIAkJIglzYwklMCwgJTIJCQkJCVxuIgogCQkiCWJlcXoJJTAsIDFiCQkJCQlcbiIKIAkJIglhZGR1CSUwLCAlMSwgJTMJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCiAJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikKQEAgLTE3OCw2ICsxNzEsOCBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogCisJc21wX21iKCk7CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xODUsNiArMTgwLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAorCXNtcF9tYigpOworCiAJaWYgKGNwdV9oYXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCkBAIC0xOTUsNyArMTkyLDYgQEAKIAkJIglzYwklMCwgJTIJCQkJCVxuIgogCQkiCWJlcXpsCSUwLCAxYgkJCQkJXG4iCiAJCSIJc3VidQklMCwgJTEsICUzCQkJCVxuIgotCQkiCXN5bmMJCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQogCQk6ICJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpCkBAIC0yMTAsNyArMjA2LDYgQEAKIAkJIglzYwklMCwgJTIJCQkJCVxuIgogCQkiCWJlcXoJJTAsIDFiCQkJCQlcbiIKIAkJIglzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCiAJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikKQEAgLTIyNSw2ICsyMjAsOCBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogCisJc21wX21iKCk7CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNDAsNiArMjM3LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAorCXNtcF9tYigpOworCiAJaWYgKGNwdV9oYXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCkBAIC0yNTMsNyArMjUyLDYgQEAKIAkJIgliZXF6bAklMCwgMWIJCQkJCVxuIgogCQkiCSBzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIxOgkJCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQpAQCAtMjcyLDcgKzI3MCw2IEBACiAJCSIJYmVxegklMCwgMWIJCQkJCVxuIgogCQkiCSBzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIxOgkJCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQpAQCAtMjg5LDYgKzI4Niw4IEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM4Myw3ICszODIsNyBAQAogCiAjaWZkZWYgQ09ORklHXzY0QklUCiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgX19zNjQgY291bnRlcjsgfSBhdG9taWM2NF90OwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBsb25nIGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKIAogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpICAgIHsgKGkpIH0KIApAQCAtNDkyLDYgKzQ5MSw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQ7CiAKKwlzbXBfbWIoKTsKKwogCWlmIChjcHVfaGFzX2xsc2MgJiYgUjEwMDAwX0xMU0NfV0FSKSB7CiAJCXVuc2lnbmVkIGxvbmcgdGVtcDsKIApAQCAtNTAyLDcgKzUwMyw2IEBACiAJCSIJc2NkCSUwLCAlMgkJCQkJXG4iCiAJCSIJYmVxemwJJTAsIDFiCQkJCQlcbiIKIAkJIglhZGR1CSUwLCAlMSwgJTMJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCiAJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikKQEAgLTUxNyw3ICs1MTcsNiBAQAogCQkiCXNjZAklMCwgJTIJCQkJCVxuIgogCQkiCWJlcXoJJTAsIDFiCQkJCQlcbiIKIAkJIglhZGR1CSUwLCAlMSwgJTMJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCiAJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikKQEAgLTUzMiw2ICs1MzEsOCBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogCisJc21wX21iKCk7CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC01MzksNiArNTQwLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAorCXNtcF9tYigpOworCiAJaWYgKGNwdV9oYXNfbGxzYyAmJiBSMTAwMDBfTExTQ19XQVIpIHsKIAkJdW5zaWduZWQgbG9uZyB0ZW1wOwogCkBAIC01NDksNyArNTUyLDYgQEAKIAkJIglzY2QJJTAsICUyCQkJCQlcbiIKIAkJIgliZXF6bAklMCwgMWIJCQkJCVxuIgogCQkiCXN1YnUJJTAsICUxLCAlMwkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKIAkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKQpAQCAtNTY0LDcgKzU2Niw2IEBACiAJCSIJc2NkCSUwLCAlMgkJCQkJXG4iCiAJCSIJYmVxegklMCwgMWIJCQkJCVxuIgogCQkiCXN1YnUJJTAsICUxLCAlMwkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKIAkJOiAiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKQpAQCAtNTc5LDYgKzU4MCw4IEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTU5NCw2ICs1OTcsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCisJc21wX21iKCk7CisKIAlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgewogCQl1bnNpZ25lZCBsb25nIHRlbXA7CiAKQEAgLTYwNyw3ICs2MTIsNiBAQAogCQkiCWJlcXpsCSUwLCAxYgkJCQkJXG4iCiAJCSIJIGRzdWJ1CSUwLCAlMSwgJTMJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIxOgkJCQkJCQlcbiIKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmVzdWx0KSwgIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQpAQCAtNjI2LDcgKzYzMCw2IEBACiAJCSIJYmVxegklMCwgMWIJCQkJCVxuIgogCQkiCSBkc3VidQklMCwgJTEsICUzCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCi0JCSIJc3luYwkJCQkJCVxuIgogCQkiMToJCQkJCQkJXG4iCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHJlc3VsdCksICI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlcikKQEAgLTY0Myw2ICs2NDYsOCBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogCisJc21wX21iKCk7CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2JhcnJpZXIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvYmFycmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODI2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2JhcnJpZXIuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCisgKi8KKyNpZm5kZWYgX19BU01fQkFSUklFUl9ICisjZGVmaW5lIF9fQVNNX0JBUlJJRVJfSAorCisvKgorICogcmVhZF9iYXJyaWVyX2RlcGVuZHMgLSBGbHVzaCBhbGwgcGVuZGluZyByZWFkcyB0aGF0IHN1YnNlcXVlbnRzIHJlYWRzCisgKiBkZXBlbmQgb24uCisgKgorICogTm8gZGF0YS1kZXBlbmRlbnQgcmVhZHMgZnJvbSBtZW1vcnktbGlrZSByZWdpb25zIGFyZSBldmVyIHJlb3JkZXJlZAorICogb3ZlciB0aGlzIGJhcnJpZXIuICBBbGwgcmVhZHMgcHJlY2VkaW5nIHRoaXMgcHJpbWl0aXZlIGFyZSBndWFyYW50ZWVkCisgKiB0byBhY2Nlc3MgbWVtb3J5IChidXQgbm90IG5lY2Vzc2FyaWx5IG90aGVyIENQVXMnIGNhY2hlcykgYmVmb3JlIGFueQorICogcmVhZHMgZm9sbG93aW5nIHRoaXMgcHJpbWl0aXZlIHRoYXQgZGVwZW5kIG9uIHRoZSBkYXRhIHJldHVybiBieQorICogYW55IG9mIHRoZSBwcmVjZWRpbmcgcmVhZHMuICBUaGlzIHByaW1pdGl2ZSBpcyBtdWNoIGxpZ2h0ZXIgd2VpZ2h0IHRoYW4KKyAqIHJtYigpIG9uIG1vc3QgQ1BVcywgYW5kIGlzIG5ldmVyIGhlYXZpZXIgd2VpZ2h0IHRoYW4gaXMKKyAqIHJtYigpLgorICoKKyAqIFRoZXNlIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZSByZXNwZWN0ZWQgYnkgYm90aCB0aGUgbG9jYWwgQ1BVCisgKiBhbmQgdGhlIGNvbXBpbGVyLgorICoKKyAqIE9yZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlc2UgcHJpbWl0aXZlcywKKyAqIG5vdCBldmVuIGJ5IGRhdGEgZGVwZW5kZW5jaWVzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgorICogbWVtb3J5X2JhcnJpZXIoKSBmb3IgZXhhbXBsZXMgYW5kIFVSTHMgdG8gbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGZvcmNlIG9yZGVyaW5nICh0aGUgaW5pdGlhbAorICogdmFsdWUgb2YgImEiIGlzIHplcm8sICJiIiBpcyBvbmUsIGFuZCAicCIgaXMgIiZhIik6CisgKgorICogPHByb2dyYW1saXN0aW5nPgorICoJQ1BVIDAJCQkJQ1BVIDEKKyAqCisgKgliID0gMjsKKyAqCW1lbW9yeV9iYXJyaWVyKCk7CisgKglwID0gJmI7CQkJCXEgPSBwOworICoJCQkJCXJlYWRfYmFycmllcl9kZXBlbmRzKCk7CisgKgkJCQkJZCA9ICpxOworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqCisgKiBiZWNhdXNlIHRoZSByZWFkIG9mICIqcSIgZGVwZW5kcyBvbiB0aGUgcmVhZCBvZiAicCIgYW5kIHRoZXNlCisgKiB0d28gcmVhZHMgYXJlIHNlcGFyYXRlZCBieSBhIHJlYWRfYmFycmllcl9kZXBlbmRzKCkuICBIb3dldmVyLAorICogdGhlIGZvbGxvd2luZyBjb2RlLCB3aXRoIHRoZSBzYW1lIGluaXRpYWwgdmFsdWVzIGZvciAiYSIgYW5kICJiIjoKKyAqCisgKiA8cHJvZ3JhbWxpc3Rpbmc+CisgKglDUFUgMAkJCQlDUFUgMQorICoKKyAqCWEgPSAyOworICoJbWVtb3J5X2JhcnJpZXIoKTsKKyAqCWIgPSAzOwkJCQl5ID0gYjsKKyAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOworICoJCQkJCXggPSBhOworICogPC9wcm9ncmFtbGlzdGluZz4KKyAqCisgKiBkb2VzIG5vdCBlbmZvcmNlIG9yZGVyaW5nLCBzaW5jZSB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kgYmV0d2VlbgorICogdGhlIHJlYWQgb2YgImEiIGFuZCB0aGUgcmVhZCBvZiAiYiIuICBUaGVyZWZvcmUsIG9uIHNvbWUgQ1BVcywgc3VjaAorICogYXMgQWxwaGEsICJ5IiBjb3VsZCBiZSBzZXQgdG8gMyBhbmQgIngiIHRvIDAuICBVc2Ugcm1iKCkKKyAqIGluIGNhc2VzIGxpa2UgdGhpcyB3aGVyZSB0aGVyZSBhcmUgbm8gZGF0YSBkZXBlbmRlbmNpZXMuCisgKi8KKworI2RlZmluZSByZWFkX2JhcnJpZXJfZGVwZW5kcygpCQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlKDApCisKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19TWU5DCisjZGVmaW5lIF9fc3luYygpCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCSIuc2V0CXB1c2hcblx0IgkJXAorCQkiLnNldAlub3Jlb3JkZXJcblx0IgkJXAorCQkiLnNldAltaXBzMlxuXHQiCQlcCisJCSJzeW5jXG5cdCIJCQlcCisJCSIuc2V0CXBvcCIJCQlcCisJCTogLyogbm8gb3V0cHV0ICovCQlcCisJCTogLyogbm8gaW5wdXQgKi8JCVwKKwkJOiAibWVtb3J5IikKKyNlbHNlCisjZGVmaW5lIF9fc3luYygpCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgX19mYXN0X2lvYigpCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCSIuc2V0CXB1c2hcblx0IgkJXAorCQkiLnNldAlub3Jlb3JkZXJcblx0IgkJXAorCQkibHcJJDAsJTBcblx0IgkJXAorCQkibm9wXG5cdCIJCQlcCisJCSIuc2V0CXBvcCIJCQlcCisJCTogLyogbm8gb3V0cHV0ICovCQlcCisJCTogIm0iICgqKGludCAqKUNLU0VHMSkJCVwKKwkJOiAibWVtb3J5IikKKworI2RlZmluZSBmYXN0X3dtYigpCV9fc3luYygpCisjZGVmaW5lIGZhc3Rfcm1iKCkJX19zeW5jKCkKKyNkZWZpbmUgZmFzdF9tYigpCV9fc3luYygpCisjZGVmaW5lIGZhc3RfaW9iKCkJCQkJXAorCWRvIHsJCQkJCVwKKwkJX19zeW5jKCk7CQkJXAorCQlfX2Zhc3RfaW9iKCk7CQkJXAorCX0gd2hpbGUgKDApCisKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19XQgorCisjaW5jbHVkZSA8YXNtL3diZmx1c2guaD4KKworI2RlZmluZSB3bWIoKQkJZmFzdF93bWIoKQorI2RlZmluZSBybWIoKQkJZmFzdF9ybWIoKQorI2RlZmluZSBtYigpCQl3YmZsdXNoKCkKKyNkZWZpbmUgaW9iKCkJCXdiZmx1c2goKQorCisjZWxzZSAvKiAhQ09ORklHX0NQVV9IQVNfV0IgKi8KKworI2RlZmluZSB3bWIoKQkJZmFzdF93bWIoKQorI2RlZmluZSBybWIoKQkJZmFzdF9ybWIoKQorI2RlZmluZSBtYigpCQlmYXN0X21iKCkKKyNkZWZpbmUgaW9iKCkJCWZhc3RfaW9iKCkKKworI2VuZGlmIC8qICFDT05GSUdfQ1BVX0hBU19XQiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfV0VBS19PUkRFUklORykgJiYgZGVmaW5lZChDT05GSUdfU01QKQorI2RlZmluZSBfX1dFQUtfT1JERVJJTkdfTUIJIiAgICAgICBzeW5jCVxuIgorI2Vsc2UKKyNkZWZpbmUgX19XRUFLX09SREVSSU5HX01CCSIJCVxuIgorI2VuZGlmCisKKyNkZWZpbmUgc21wX21iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18oX19XRUFLX09SREVSSU5HX01CIDogOiA6Im1lbW9yeSIpCisjZGVmaW5lIHNtcF9ybWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyhfX1dFQUtfT1JERVJJTkdfTUIgOiA6IDoibWVtb3J5IikKKyNkZWZpbmUgc21wX3dtYigpCV9fYXNtX18gX192b2xhdGlsZV9fKF9fV0VBS19PUkRFUklOR19NQiA6IDogOiJtZW1vcnkiKQorCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBcCisJZG8geyB2YXIgPSB2YWx1ZTsgc21wX21iKCk7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX0FTTV9CQVJSSUVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYml0b3BzLmggYi9pbmNsdWRlL2FzbS1taXBzL2JpdG9wcy5oCmluZGV4IDFiYjg5YzUuLjA2NDQ1ZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9iaXRvcHMuaApAQCAtMywzOCArMywzNCBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTQgLSAxOTk3LCAxOTk5LCAyMDAwICBSYWxmIEJhZWNobGUgKHJhbGZAZ251Lm9yZykKKyAqIENvcHlyaWdodCAoYykgMTk5NCAtIDE5OTcsIDE5OTksIDIwMDAsIDA2ICBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgIFNpbGljb24gR3JhcGhpY3MsIEluYy4KICAqLwogI2lmbmRlZiBfQVNNX0JJVE9QU19ICiAjZGVmaW5lIF9BU01fQklUT1BTX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JCS8qIHNpZ2ggLi4uICovCiAjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgorI2luY2x1ZGUgPGFzbS9zZ2lkZWZzLmg+CisjaW5jbHVkZSA8YXNtL3dhci5oPgogCiAjaWYgKF9NSVBTX1NaTE9ORyA9PSAzMikKICNkZWZpbmUgU1pMT05HX0xPRyA1CiAjZGVmaW5lIFNaTE9OR19NQVNLIDMxVUwKICNkZWZpbmUgX19MTAkJImxsCSIKICNkZWZpbmUgX19TQwkJInNjCSIKLSNkZWZpbmUgY3B1X3RvX2xlbG9uZ3AoeCkgY3B1X3RvX2xlMzJwKChfX3UzMiAqKSAoeCkpCiAjZWxpZiAoX01JUFNfU1pMT05HID09IDY0KQogI2RlZmluZSBTWkxPTkdfTE9HIDYKICNkZWZpbmUgU1pMT05HX01BU0sgNjNVTAogI2RlZmluZSBfX0xMCQkibGxkCSIKICNkZWZpbmUgX19TQwkJInNjZAkiCi0jZGVmaW5lIGNwdV90b19sZWxvbmdwKHgpIGNwdV90b19sZTY0cCgoX191NjQgKikgKHgpKQogI2VuZGlmCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgotI2luY2x1ZGUgPGFzbS9zZ2lkZWZzLmg+Ci0jaW5jbHVkZSA8YXNtL3dhci5oPgotCiAvKgogICogY2xlYXJfYml0KCkgZG9lc24ndCBwcm92aWRlIGFueSBiYXJyaWVyIGZvciB0aGUgY29tcGlsZXIuCiAgKi8KQEAgLTQyLDIwICszOCw2IEBACiAjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCkJc21wX21iKCkKIAogLyoKLSAqIE9ubHkgZGlzYWJsZSBpbnRlcnJ1cHQgZm9yIGtlcm5lbCBtb2RlIHN0dWZmIHRvIGtlZXAgdXNlcm1vZGUgc3R1ZmYKLSAqIHRoYXQgZGFyZXMgdG8gdXNlIGtlcm5lbCBpbmNsdWRlIGZpbGVzIGFsaXZlLgotICovCi0KLSNkZWZpbmUgX19iaV9mbGFncwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MKLSNkZWZpbmUgX19iaV9sb2NhbF9pcnFfc2F2ZSh4KQkJbG9jYWxfaXJxX3NhdmUoeCkKLSNkZWZpbmUgX19iaV9sb2NhbF9pcnFfcmVzdG9yZSh4KQlsb2NhbF9pcnFfcmVzdG9yZSh4KQotI2Vsc2UKLSNkZWZpbmUgX19iaV9mbGFncwotI2RlZmluZSBfX2JpX2xvY2FsX2lycV9zYXZlKHgpCi0jZGVmaW5lIF9fYmlfbG9jYWxfaXJxX3Jlc3RvcmUoeCkKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLS8qCiAgKiBzZXRfYml0IC0gQXRvbWljYWxseSBzZXQgYSBiaXQgaW4gbWVtb3J5CiAgKiBAbnI6IHRoZSBiaXQgdG8gc2V0CiAgKiBAYWRkcjogdGhlIGFkZHJlc3MgdG8gc3RhcnQgY291bnRpbmcgZnJvbQpAQCAtOTMsMTMgKzc1LDEzIEBACiAJfSBlbHNlIHsKIAkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHI7CiAJCXVuc2lnbmVkIGxvbmcgbWFzazsKLQkJX19iaV9mbGFnczsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQlhICs9IG5yID4+IFNaTE9OR19MT0c7CiAJCW1hc2sgPSAxVUwgPDwgKG5yICYgU1pMT05HX01BU0spOwotCQlfX2JpX2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQkqYSB8PSBtYXNrOwotCQlfX2JpX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIH0KIApAQCAtMTQxLDEzICsxMjMsMTMgQEAKIAl9IGVsc2UgewogCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkcjsKIAkJdW5zaWduZWQgbG9uZyBtYXNrOwotCQlfX2JpX2ZsYWdzOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCWEgKz0gbnIgPj4gU1pMT05HX0xPRzsKIAkJbWFzayA9IDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSyk7Ci0JCV9fYmlfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCSphICY9IH5tYXNrOwotCQlfX2JpX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIH0KIApAQCAtMTkxLDEzICsxNzMsMTMgQEAKIAl9IGVsc2UgewogCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkcjsKIAkJdW5zaWduZWQgbG9uZyBtYXNrOwotCQlfX2JpX2ZsYWdzOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCWEgKz0gbnIgPj4gU1pMT05HX0xPRzsKIAkJbWFzayA9IDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSyk7Ci0JCV9fYmlfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCSphIF49IG1hc2s7Ci0JCV9fYmlfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogfQogCkBAIC0yMjMsOSArMjA1LDYgQEAKIAkJIgkiIF9fU0MJIiUyLCAlMQkJCQkJXG4iCiAJCSIJYmVxemwJJTIsIDFiCQkJCQlcbiIKIAkJIglhbmQJJTIsICUwLCAlMwkJCQlcbiIKLSNpZmRlZiBDT05GSUdfU01QCi0JCSIJc3luYwkJCQkJCVxuIgotI2VuZGlmCiAJCSIJLnNldAltaXBzMAkJCQkJXG4iCiAJCTogIj0mciIgKHRlbXApLCAiPW0iICgqbSksICI9JnIiIChyZXMpCiAJCTogInIiICgxVUwgPDwgKG5yICYgU1pMT05HX01BU0spKSwgIm0iICgqbSkKQEAgLTI0NSw5ICsyMjQsNiBAQAogCQkiCSIgX19TQwkiJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6CSUyLCAxYgkJCQkJXG4iCiAJCSIJIGFuZAklMiwgJTAsICUzCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CXBvcAkJCQkJXG4iCiAJCTogIj0mciIgKHRlbXApLCAiPW0iICgqbSksICI9JnIiIChyZXMpCiAJCTogInIiICgxVUwgPDwgKG5yICYgU1pMT05HX01BU0spKSwgIm0iICgqbSkKQEAgLTI1OCwxNyArMjM0LDE5IEBACiAJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyOwogCQl1bnNpZ25lZCBsb25nIG1hc2s7CiAJCWludCByZXR2YWw7Ci0JCV9fYmlfZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJYSArPSBuciA+PiBTWkxPTkdfTE9HOwogCQltYXNrID0gMVVMIDw8IChuciAmIFNaTE9OR19NQVNLKTsKLQkJX19iaV9sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKIAkJKmEgfD0gbWFzazsKLQkJX19iaV9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCQlyZXR1cm4gcmV0dmFsOwogCX0KKworCXNtcF9tYigpOwogfQogCiAvKgpAQCAtMjk0LDkgKzI3Miw2IEBACiAJCSIJIiBfX1NDIAkiJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgogCQkiCWFuZAklMiwgJTAsICUzCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAodGVtcCksICI9bSIgKCptKSwgIj0mciIgKHJlcykKIAkJOiAiciIgKDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSykpLCAibSIgKCptKQpAQCAtMzE3LDkgKzI5Miw2IEBACiAJCSIJIiBfX1NDIAkiJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6CSUyLCAxYgkJCQkJXG4iCiAJCSIJIGFuZAklMiwgJTAsICUzCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CXBvcAkJCQkJXG4iCiAJCTogIj0mciIgKHRlbXApLCAiPW0iICgqbSksICI9JnIiIChyZXMpCiAJCTogInIiICgxVUwgPDwgKG5yICYgU1pMT05HX01BU0spKSwgIm0iICgqbSkKQEAgLTMzMCwxNyArMzAyLDE5IEBACiAJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyOwogCQl1bnNpZ25lZCBsb25nIG1hc2s7CiAJCWludCByZXR2YWw7Ci0JCV9fYmlfZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJYSArPSBuciA+PiBTWkxPTkdfTE9HOwogCQltYXNrID0gMVVMIDw8IChuciAmIFNaTE9OR19NQVNLKTsKLQkJX19iaV9sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKIAkJKmEgJj0gfm1hc2s7Ci0JCV9fYmlfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CisKKwlzbXBfbWIoKTsKIH0KIAogLyoKQEAgLTM2NSw5ICszMzksNiBAQAogCQkiCSIgX19TQwkiJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgogCQkiCWFuZAklMiwgJTAsICUzCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAodGVtcCksICI9bSIgKCptKSwgIj0mciIgKHJlcykKIAkJOiAiciIgKDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSykpLCAibSIgKCptKQpAQCAtMzg3LDkgKzM1OCw2IEBACiAJCSIJIiBfX1NDCSJcdCUyLCAlMQkJCQlcbiIKIAkJIgliZXF6CSUyLCAxYgkJCQkJXG4iCiAJCSIJIGFuZAklMiwgJTAsICUzCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CXBvcAkJCQkJXG4iCiAJCTogIj0mciIgKHRlbXApLCAiPW0iICgqbSksICI9JnIiIChyZXMpCiAJCTogInIiICgxVUwgPDwgKG5yICYgU1pMT05HX01BU0spKSwgIm0iICgqbSkKQEAgLTM5OSwyMiArMzY3LDIwIEBACiAJfSBlbHNlIHsKIAkJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHI7CiAJCXVuc2lnbmVkIGxvbmcgbWFzaywgcmV0dmFsOwotCQlfX2JpX2ZsYWdzOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCWEgKz0gbnIgPj4gU1pMT05HX0xPRzsKIAkJbWFzayA9IDFVTCA8PCAobnIgJiBTWkxPTkdfTUFTSyk7Ci0JCV9fYmlfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7CiAJCSphIF49IG1hc2s7Ci0JCV9fYmlfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci19CiAKLSN1bmRlZiBfX2JpX2ZsYWdzCi0jdW5kZWYgX19iaV9sb2NhbF9pcnFfc2F2ZQotI3VuZGVmIF9fYmlfbG9jYWxfaXJxX3Jlc3RvcmUKKwlzbXBfbWIoKTsKK30KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9ub24tYXRvbWljLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYm9vdGluZm8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvYm9vdGluZm8uaAppbmRleCAxZTVjY2RhLi44ZTMyMWY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2Jvb3RpbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9ib290aW5mby5oCkBAIC0xMzEsNiArMTMxLDcgQEAKICNkZWZpbmUgIE1BQ0hfUEhJTElQU19OSU5PCTAJLyogTmlubyAqLwogI2RlZmluZSAgTUFDSF9QSElMSVBTX1ZFTE8JMQkvKiBWZWxvICovCiAjZGVmaW5lICBNQUNIX1BISUxJUFNfSkJTCTIJLyogSkJTICovCisjZGVmaW5lICBNQUNIX1BISUxJUFNfU1RCODEwCTMJLyogU1RCODEwICovCiAKIC8qCiAgKiBWYWxpZCBtYWNodHlwZSBmb3IgZ3JvdXAgU0lCWVRFCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2J1Zy5oIGIvaW5jbHVkZS9hc20tbWlwcy9idWcuaAppbmRleCA3YjQ3MzlkLi40ZDU2MGE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYnVnLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9fQVNNX0JVR19ICiAjZGVmaW5lIF9fQVNNX0JVR19ICiAKKyNpbmNsdWRlIDxhc20vc2dpZGVmcy5oPgogCiAjaWZkZWYgQ09ORklHX0JVRwogCkBAIC0xMyw2ICsxNCwxNyBAQAogCiAjZGVmaW5lIEhBVkVfQVJDSF9CVUcKIAorI2lmIChfTUlQU19JU0EgPiBfTUlQU19JU0FfTUlQUzEpCisKKyNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCJ0bmUgJDAsICUwIiA6IDogInIiIChjb25kaXRpb24pKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSEFWRV9BUkNIX0JVR19PTgorCisjZW5kaWYgLyogX01JUFNfSVNBID4gX01JUFNfSVNBX01JUFMxICovCisKICNlbmRpZgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCmluZGV4IDlhYjU5ZTIuLjBkZGFkYTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCkBAIC0xNyw2ICsxNyw3IEBACiAgKgogICogIC0gZmx1c2hfY2FjaGVfYWxsKCkgZmx1c2hlcyBlbnRpcmUgY2FjaGUKICAqICAtIGZsdXNoX2NhY2hlX21tKG1tKSBmbHVzaGVzIHRoZSBzcGVjaWZpZWQgbW0gY29udGV4dCdzIGNhY2hlIGxpbmVzCisgKiAgLSBmbHVzaF9jYWNoZV9kdXAgbW0obW0pIGhhbmRsZXMgY2FjaGUgZmx1c2hpbmcgd2hlbiBmb3JraW5nCiAgKiAgLSBmbHVzaF9jYWNoZV9wYWdlKG1tLCB2bWFkZHIsIHBmbikgZmx1c2hlcyBhIHNpbmdsZSBwYWdlCiAgKiAgLSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpIGZsdXNoZXMgYSByYW5nZSBvZiBwYWdlcwogICogIC0gZmx1c2hfaWNhY2hlX3JhbmdlKHN0YXJ0LCBlbmQpIGZsdXNoIGEgcmFuZ2Ugb2YgaW5zdHJ1Y3Rpb25zCkBAIC0zMSw2ICszMiw3IEBACiBleHRlcm4gdm9pZCAoKmZsdXNoX2NhY2hlX2FsbCkodm9pZCk7CiBleHRlcm4gdm9pZCAoKl9fZmx1c2hfY2FjaGVfYWxsKSh2b2lkKTsKIGV4dGVybiB2b2lkICgqZmx1c2hfY2FjaGVfbW0pKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQlkbyB7ICh2b2lkKSAobW0pOyB9IHdoaWxlICgwKQogZXh0ZXJuIHZvaWQgKCpmbHVzaF9jYWNoZV9yYW5nZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogZXh0ZXJuIHZvaWQgKCpmbHVzaF9jYWNoZV9wYWdlKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBwYWdlLCB1bnNpZ25lZCBsb25nIHBmbik7CkBAIC01NSwyNCArNTcsMTMgQEAKICNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCwgZW5kKQkJZmx1c2hfY2FjaGVfYWxsKCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfdnVubWFwKHN0YXJ0LCBlbmQpCQlmbHVzaF9jYWNoZV9hbGwoKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weV90b191c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCitleHRlcm4gdm9pZCBjb3B5X3RvX3VzZXJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsCi0JdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKLQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZhZGRyLCBwYWdlX3RvX3BmbihwYWdlKSk7Ci0JbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotCV9fZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwYWdlKTsKLX0KKwl1bnNpZ25lZCBsb25nIGxlbik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Zyb21fdXNlcl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorZXh0ZXJuIHZvaWQgY29weV9mcm9tX3VzZXJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsCi0JdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKLQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZhZGRyLCBwYWdlX3RvX3BmbihwYWdlKSk7Ci0JbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwotfQorCXVuc2lnbmVkIGxvbmcgbGVuKTsKIAogZXh0ZXJuIHZvaWQgKCpmbHVzaF9jYWNoZV9zaWd0cmFtcCkodW5zaWduZWQgbG9uZyBhZGRyKTsKIGV4dGVybiB2b2lkICgqZmx1c2hfaWNhY2hlX2FsbCkodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1taXBzL2NoZWNrc3VtLmgKaW5kZXggYTVlNjA1MC4uOWI3NjhjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY2hlY2tzdW0uaApAQCAtMjcsMjMgKzI3LDIyIEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogdGhpcyBpcyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBhYm92ZSB0aGF0IHJlY29yZHMgZXJyb3JzIGl0IGZpbmRzIGluICplcnJwLAogICogYnV0IGNvbnRpbnVlcyBhbmQgemVyb3MgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLAotCQkJCQkgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJCQkgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJwKTsKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKwkJCQkJIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCQkJIF9fd3N1bSBzdW0sIGludCAqZXJycCk7CiAKIC8qCiAgKiBDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCiAgKi8KICNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9hbmRfY29weV90b191c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0JCQkJCQkgIHVuc2lnbmVkIGNoYXIgX191c2VyICpkc3QsCi0JCQkJCQkgIGludCBsZW4sIGludCBzdW0sCitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIgKGNvbnN0IHZvaWQgKnNyYywgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCQkJCSAgaW50IGxlbiwgX193c3VtIHN1bSwKIAkJCQkJCSAgaW50ICplcnJfcHRyKQogewogCW1pZ2h0X3NsZWVwKCk7CkBAIC01MSw3ICs1MCw3IEBACiAKIAlpZiAoY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pKSB7CiAJCSplcnJfcHRyID0gLUVGQVVMVDsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOwogCX0KIAogCXJldHVybiBzdW07CkBAIC02MSwxMyArNjAsMTMgQEAKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHVzZXIgc3BhY2UgKGJ1dCBvbiBNSVBTCiAgKiB3ZSBoYXZlIGp1c3Qgb25lIGFkZHJlc3Mgc3BhY2UsIHNvIHRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBhYm92ZSkKICAqLwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0JCQkJICAgICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJICAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0gd2l0aG91dCBhZGRpbmcgcHNldWRvIGhlYWRlcnMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkiCS5zZXQJcHVzaAkJIyBjc3VtX2ZvbGRcbiIKQEAgLTgyLDcgKzgxLDcgQEAKIAk6ICI9ciIgKHN1bSkKIAk6ICIwIiAoc3VtKSk7CiAKLQlyZXR1cm4gc3VtOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAogLyoKQEAgLTkyLDEwICs5MSwxMCBAQAogICoJQnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkIGZvciBsaW51eCBieQogICoJQXJudCBHdWxicmFuZHNlbi4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7Ci0JdW5zaWduZWQgaW50ICp3b3JkID0gKHVuc2lnbmVkIGludCAqKSBpcGg7Ci0JdW5zaWduZWQgaW50ICpzdG9wID0gd29yZCArIGlobDsKKwljb25zdCB1bnNpZ25lZCBpbnQgKndvcmQgPSBpcGg7CisJY29uc3QgdW5zaWduZWQgaW50ICpzdG9wID0gd29yZCArIGlobDsKIAl1bnNpZ25lZCBpbnQgY3N1bTsKIAlpbnQgY2Fycnk7CiAKQEAgLTEyMyw5ICsxMjIsOSBAQAogCXJldHVybiBjc3VtX2ZvbGQoY3N1bSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLAotCXVuc2lnbmVkIGxvbmcgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsCisJX19iZTMyIGRhZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCV9fd3N1bSBzdW0pCiB7CiAJX19hc21fXygKIAkiCS5zZXQJcHVzaAkJIyBjc3VtX3RjcHVkcF9ub2ZvbGRcbiIKQEAgLTE1NSw5ICsxNTQsOSBAQAogCTogIj1yIiAoc3VtKQogCTogIjAiIChkYWRkciksICJyIihzYWRkciksCiAjaWZkZWYgX19NSVBTRUxfXwotCSAgInIiICgoKHVuc2lnbmVkIGxvbmcpaHRvbnMobGVuKTw8MTYpICsgcHJvdG8qMjU2KSwKKwkgICJyIiAoKHByb3RvICsgbGVuKSA8PCA4KSwKICNlbHNlCi0JICAiciIgKCgodW5zaWduZWQgbG9uZykocHJvdG8pPDwxNikgKyBsZW4pLAorCSAgInIiIChwcm90byArIGxlbiksCiAjZW5kaWYKIAkgICJyIiAoc3VtKSk7CiAKQEAgLTE2OCwxMSArMTY3LDEwIEBACiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJCQkgICBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLCBkYWRkciwgbGVuLCBwcm90bywgc3VtKSk7CiB9CkBAIC0xODEsMTcgKzE3OSwxNiBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgICAgIF9fdTMyIGxlbiwKLQkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCSAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fKAogCSIJLnNldAlwdXNoCQkjIGNzdW1faXB2Nl9tYWdpY1xuIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKaW5kZXggOTAwZjQ3Mi4uNDMyNjUzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCkBAIC01LDYgKzUsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogI2RlZmluZSBDT01QQVRfVVNFUl9IWgkxMDAKIApAQCAtMzIsNiArMzMsNyBAQAogCXMzMgl2YWxbMl07CiB9IGNvbXBhdF9mc2lkX3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X3RpbWVyX3Q7Cit0eXBlZGVmIHMzMgkJY29tcGF0X2tleV90OwogCiB0eXBlZGVmIHMzMgkJY29tcGF0X2ludF90OwogdHlwZWRlZiBzMzIJCWNvbXBhdF9sb25nX3Q7CkBAIC0xNDYsNCArMTQ4LDcxIEBACiAJcmV0dXJuICh2b2lkIF9fdXNlciAqKSAocmVncy0+cmVnc1syOV0gLSBsZW4pOwogfQogCitzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0geworCWNvbXBhdF9rZXlfdCBrZXk7CisJX19jb21wYXRfdWlkMzJfdCB1aWQ7CisJX19jb21wYXRfZ2lkMzJfdCBnaWQ7CisJX19jb21wYXRfdWlkMzJfdCBjdWlkOworCV9fY29tcGF0X2dpZDMyX3QgY2dpZDsKKwljb21wYXRfbW9kZV90IG1vZGU7CisJdW5zaWduZWQgc2hvcnQgc2VxOworCXVuc2lnbmVkIHNob3J0IF9fcGFkMjsKKwljb21wYXRfdWxvbmdfdCBfX3VudXNlZDE7CisJY29tcGF0X3Vsb25nX3QgX191bnVzZWQyOworfTsKKworc3RydWN0IGNvbXBhdF9zZW1pZDY0X2RzIHsKKwlzdHJ1Y3QgY29tcGF0X2lwYzY0X3Blcm0gc2VtX3Blcm07CisJY29tcGF0X3RpbWVfdAlzZW1fb3RpbWU7CisJY29tcGF0X3RpbWVfdAlzZW1fY3RpbWU7CisJY29tcGF0X3Vsb25nX3QJc2VtX25zZW1zOworCWNvbXBhdF91bG9uZ190CV9fdW51c2VkMTsKKwljb21wYXRfdWxvbmdfdAlfX3VudXNlZDI7Cit9OworCitzdHJ1Y3QgY29tcGF0X21zcWlkNjRfZHMgeworCXN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSBtc2dfcGVybTsKKyNpZm5kZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCisJY29tcGF0X3Vsb25nX3QJX191bnVzZWQxOworI2VuZGlmCisJY29tcGF0X3RpbWVfdAltc2dfc3RpbWU7CisjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCisJY29tcGF0X3Vsb25nX3QJX191bnVzZWQxOworI2VuZGlmCisjaWZuZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorCWNvbXBhdF91bG9uZ190CV9fdW51c2VkMjsKKyNlbmRpZgorCWNvbXBhdF90aW1lX3QJbXNnX3J0aW1lOworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorCWNvbXBhdF91bG9uZ190CV9fdW51c2VkMjsKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKwljb21wYXRfdWxvbmdfdAlfX3VudXNlZDM7CisjZW5kaWYKKwljb21wYXRfdGltZV90CW1zZ19jdGltZTsKKyNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKwljb21wYXRfdWxvbmdfdAlfX3VudXNlZDM7CisjZW5kaWYKKwljb21wYXRfdWxvbmdfdAltc2dfY2J5dGVzOworCWNvbXBhdF91bG9uZ190CW1zZ19xbnVtOworCWNvbXBhdF91bG9uZ190CW1zZ19xYnl0ZXM7CisJY29tcGF0X3BpZF90CW1zZ19sc3BpZDsKKwljb21wYXRfcGlkX3QJbXNnX2xycGlkOworCWNvbXBhdF91bG9uZ190CV9fdW51c2VkNDsKKwljb21wYXRfdWxvbmdfdAlfX3VudXNlZDU7Cit9OworCitzdHJ1Y3QgY29tcGF0X3NobWlkNjRfZHMgeworCXN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSBzaG1fcGVybTsKKwljb21wYXRfc2l6ZV90CXNobV9zZWdzejsKKwljb21wYXRfdGltZV90CXNobV9hdGltZTsKKwljb21wYXRfdGltZV90CXNobV9kdGltZTsKKwljb21wYXRfdGltZV90CXNobV9jdGltZTsKKwljb21wYXRfcGlkX3QJc2htX2NwaWQ7CisJY29tcGF0X3BpZF90CXNobV9scGlkOworCWNvbXBhdF91bG9uZ190CXNobV9uYXR0Y2g7CisJY29tcGF0X3Vsb25nX3QJX191bnVzZWQxOworCWNvbXBhdF91bG9uZ190CV9fdW51c2VkMjsKK307CisKICNlbmRpZiAvKiBfQVNNX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NwdS1pbmZvLmggYi9pbmNsdWRlL2FzbS1taXBzL2NwdS1pbmZvLmgKaW5kZXggYTJmMGM4ZS4uNjEwZDBjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jcHUtaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY3B1LWluZm8uaApAQCAtMjIsMTIgKzIyLDEyIEBACiAgKiBEZXNjcmlwdG9yIGZvciBhIGNhY2hlCiAgKi8KIHN0cnVjdCBjYWNoZV9kZXNjIHsKLQl1bnNpZ25lZCBzaG9ydCBsaW5lc3o7CS8qIFNpemUgb2YgbGluZSBpbiBieXRlcyAqLwotCXVuc2lnbmVkIHNob3J0IHdheXM7CS8qIE51bWJlciBvZiB3YXlzICovCi0JdW5zaWduZWQgc2hvcnQgc2V0czsJLyogTnVtYmVyIG9mIGxpbmVzIHBlciBzZXQgKi8KIAl1bnNpZ25lZCBpbnQgd2F5c2l6ZTsJLyogQnl0ZXMgcGVyIHdheSAqLwotCXVuc2lnbmVkIGludCB3YXliaXQ7CS8qIEJpdHMgdG8gc2VsZWN0IGluIGEgY2FjaGUgc2V0ICovCi0JdW5zaWduZWQgaW50IGZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIGNhY2hlIHByb3BlcnRpZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZXRzOwkvKiBOdW1iZXIgb2YgbGluZXMgcGVyIHNldCAqLworCXVuc2lnbmVkIGNoYXIgd2F5czsJLyogTnVtYmVyIG9mIHdheXMgKi8KKwl1bnNpZ25lZCBjaGFyIGxpbmVzejsJLyogU2l6ZSBvZiBsaW5lIGluIGJ5dGVzICovCisJdW5zaWduZWQgY2hhciB3YXliaXQ7CS8qIEJpdHMgdG8gc2VsZWN0IGluIGEgY2FjaGUgc2V0ICovCisJdW5zaWduZWQgY2hhciBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyBjYWNoZSBwcm9wZXJ0aWVzICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMi5oIGIvaW5jbHVkZS9hc20tbWlwcy9kZWMva24wMi5oCmluZGV4IDgzMTlhZDcuLjkzNDMwYjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZGVjL2tuMDIuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2RlYy9rbjAyLmgKQEAgLTgyLDExICs4Miw5IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIGV4dGVybiB1MzIgY2FjaGVkX2tuMDJfY3NyOwotZXh0ZXJuIHNwaW5sb2NrX3Qga24wMl9sb2NrOwogZXh0ZXJuIHZvaWQgaW5pdF9rbjAyX2lycXMoaW50IGJhc2UpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1taXBzL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZGl2NjQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZGl2NjQuaAppbmRleCA1ZjdkY2Y1Li5kMTA3ODMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2RpdjY0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9kaXY2NC5oCkBAIC04MywyNyArODMsNiBAQAogI2lmIChfTUlQU19TWkxPTkcgPT0gNjQpCiAKIC8qCi0gKiBEb24ndCB1c2UgdGhpcyBvbmUgaW4gbmV3IGNvZGUKLSAqLwotI2RlZmluZSBkb19kaXY2NF8zMihyZXMsIGhpZ2gsIGxvdywgYmFzZSkgKHsgXAotCXVuc2lnbmVkIGludCBfX3F1b3QsIF9fbW9kOyBcCi0JdW5zaWduZWQgbG9uZyBfX2RpdjsgXAotCXVuc2lnbmVkIGludCBfX2xvdywgX19oaWdoLCBfX2Jhc2U7IFwKLQlcCi0JX19oaWdoID0gKGhpZ2gpOyBcCi0JX19sb3cgPSAobG93KTsgXAotCV9fZGl2ID0gX19oaWdoOyBcCi0JX19kaXYgPSBfX2RpdiA8PCAzMiB8IF9fbG93OyBcCi0JX19iYXNlID0gKGJhc2UpOyBcCi0JXAotCV9fbW9kID0gX19kaXYgJSBfX2Jhc2U7IFwKLQlfX2RpdiA9IF9fZGl2IC8gX19iYXNlOyBcCi0JXAotCV9fcXVvdCA9IF9fZGl2OyBcCi0JKHJlcykgPSBfX3F1b3Q7IFwKLQlfX21vZDsgfSkKLQotLyoKICAqIEhleSwgd2UncmUgYWxyZWFkeSA2NC1iaXQsIG5vCiAgKiBuZWVkIHRvIHBsYXkgZ2FtZXMuLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1taXBzL2RtYS1tYXBwaW5nLmgKaW5kZXggNDMyODg2My4uMjM2ZDFhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZG1hLW1hcHBpbmcuaApAQCAtNjMsOSArNjMsOSBAQAogCXJldHVybiAxMjg7CiB9CiAKLWV4dGVybiBpbnQgZG1hX2lzX2NvbnNpc3RlbnQoZG1hX2FkZHJfdCBkbWFfYWRkcik7CitleHRlcm4gaW50IGRtYV9pc19jb25zaXN0ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcik7CiAKLWV4dGVybiB2b2lkIGRtYV9jYWNoZV9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKK2V4dGVybiB2b2lkIGRtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwogCiAjZGVmaW5lIEFSQ0hfSEFTX0RNQV9ERUNMQVJFX0NPSEVSRU5UX01FTU9SWQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9kbWEuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZG1hLmgKaW5kZXggZTg1ODQ5YS4uMjNmNzg5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2RtYS5oCkBAIC03NCw3ICs3NCw5IEBACiAgKgogICovCiAKKyNpZm5kZWYgR0VORVJJQ19JU0FfRE1BX1NVUFBPUlRfQlJPS0VOCiAjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMJOAorI2VuZGlmCiAKIC8qCiAgKiBUaGUgbWF4aW11bSBhZGRyZXNzIGluIEtTRUcwIHRoYXQgd2UgY2FuIHBlcmZvcm0gYSBETUEgdHJhbnNmZXIgdG8gb24gdGhpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZml4bWFwLmgKaW5kZXggNjk1OWJkYi4uMDJjOGExMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2ZpeG1hcC5oCkBAIC00NSw4ICs0NSwxNiBAQAogICogZml4LW1hcHBlZD8KICAqLwogZW51bSBmaXhlZF9hZGRyZXNzZXMgeworI2RlZmluZSBGSVhfTl9DT0xPVVJTIDgKKwlGSVhfQ01BUF9CRUdJTiwKKyNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCisJRklYX0NNQVBfRU5EID0gRklYX0NNQVBfQkVHSU4gKyAoRklYX05fQ09MT1VSUyAqIE5SX0NQVVMpLAorI2Vsc2UKKwlGSVhfQ01BUF9FTkQgPSBGSVhfQ01BUF9CRUdJTiArIEZJWF9OX0NPTE9VUlMsCisjZW5kaWYKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCUZJWF9LTUFQX0JFR0lOLAkvKiByZXNlcnZlZCBwdGUncyBmb3IgdGVtcG9yYXJ5IGtlcm5lbCBtYXBwaW5ncyAqLworCS8qIHJlc2VydmVkIHB0ZSdzIGZvciB0ZW1wb3Jhcnkga2VybmVsIG1hcHBpbmdzICovCisJRklYX0tNQVBfQkVHSU4gPSBGSVhfQ01BUF9FTkQgKyAxLAogCUZJWF9LTUFQX0VORCA9IEZJWF9LTUFQX0JFR0lOKyhLTV9UWVBFX05SKk5SX0NQVVMpLTEsCiAjZW5kaWYKIAlfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMKQEAgLTcwLDkgKzc4LDkgQEAKICAqIGF0IHRoZSB0b3Agb2YgbWVtLi4KICAqLwogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9UWDM5WFgpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9UWDQ5WFgpCi0jZGVmaW5lIEZJWEFERFJfVE9QCSgweGZmMDAwMDAwVUwgLSAweDIwMDApCisjZGVmaW5lIEZJWEFERFJfVE9QCSgodW5zaWduZWQgbG9uZykobG9uZykoaW50KSgweGZmMDAwMDAwIC0gMHgyMDAwMCkpCiAjZWxzZQotI2RlZmluZSBGSVhBRERSX1RPUAkoMHhmZmZmZTAwMFVMKQorI2RlZmluZSBGSVhBRERSX1RPUAkoKHVuc2lnbmVkIGxvbmcpKGxvbmcpKGludCkweGZmZmUwMDAwKQogI2VuZGlmCiAjZGVmaW5lIEZJWEFERFJfU0laRQkoX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIEZJWEFERFJfU1RBUlQJKEZJWEFERFJfVE9QIC0gRklYQUREUl9TSVpFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9mdXRleC5oIGIvaW5jbHVkZS9hc20tbWlwcy9mdXRleC5oCmluZGV4IGVkMDIzZWEuLjQ3ZTU2NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2Z1dGV4LmgKQEAgLTEsMTkgKzEsMjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKKyAqLwogI2lmbmRlZiBfQVNNX0ZVVEVYX0gKICNkZWZpbmUgX0FTTV9GVVRFWF9ICiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vd2FyLmg+CiAKLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIF9fRlVURVhfU01QX1NZTkMgIglzeW5jCQkJCQlcbiIKLSNlbHNlCi0jZGVmaW5lIF9fRlVURVhfU01QX1NZTkMKLSNlbmRpZgotCiAjZGVmaW5lIF9fZnV0ZXhfYXRvbWljX29wKGluc24sIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpCQlcCiB7CQkJCQkJCQkJXAogCWlmIChjcHVfaGFzX2xsc2MgJiYgUjEwMDAwX0xMU0NfV0FSKSB7CQkJCVwKQEAgLTI3LDcgKzI5LDcgQEAKIAkJIgkuc2V0CW1pcHMzCQkJCVxuIglcCiAJCSIyOglzYwkkMSwgJTIJCQkJXG4iCVwKIAkJIgliZXF6bAkkMSwgMWIJCQkJXG4iCVwKLQkJX19GVVRFWF9TTVBfU1lOQwkJCQkJXAorCQlfX1dFQUtfT1JERVJJTkdfTUIJCQkJCVwKIAkJIjM6CQkJCQkJXG4iCVwKIAkJIgkuc2V0CXBvcAkJCQlcbiIJXAogCQkiCS5zZXQJbWlwczAJCQkJXG4iCVwKQEAgLTUzLDcgKzU1LDcgQEAKIAkJIgkuc2V0CW1pcHMzCQkJCVxuIglcCiAJCSIyOglzYwkkMSwgJTIJCQkJXG4iCVwKIAkJIgliZXF6CSQxLCAxYgkJCQlcbiIJXAotCQlfX0ZVVEVYX1NNUF9TWU5DCQkJCQlcCisJCV9fV0VBS19PUkRFUklOR19NQgkJCQkJXAogCQkiMzoJCQkJCQlcbiIJXAogCQkiCS5zZXQJcG9wCQkJCVxuIglcCiAJCSIJLnNldAltaXBzMAkJCQlcbiIJXApAQCAtODYsNyArODgsNyBAQAogCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWluY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKIAogCXN3aXRjaCAob3ApIHsKIAljYXNlIEZVVEVYX09QX1NFVDoKQEAgLTExMyw3ICsxMTUsNyBAQAogCQlyZXQgPSAtRU5PU1lTOwogCX0KIAotCWRlY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2VuYWJsZSgpOwogCiAJaWYgKCFyZXQpIHsKIAkJc3dpdGNoIChjbXApIHsKQEAgLTE1MCw3ICsxNTIsNyBAQAogCQkiCS5zZXQJbWlwczMJCQkJCVxuIgogCQkiMjoJc2MJJDEsICUxCQkJCQlcbiIKIAkJIgliZXF6bAkkMSwgMWIJCQkJCVxuIgotCQlfX0ZVVEVYX1NNUF9TWU5DCisJCV9fV0VBS19PUkRFUklOR19NQgogCQkiMzoJCQkJCQkJXG4iCiAJCSIJLnNldAlwb3AJCQkJCVxuIgogCQkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCIJCQkJXG4iCkBAIC0xNzcsNyArMTc5LDcgQEAKIAkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKIAkJIjI6CXNjCSQxLCAlMQkJCQkJXG4iCiAJCSIJYmVxegkkMSwgMWIJCQkJCVxuIgotCQlfX0ZVVEVYX1NNUF9TWU5DCisJCV9fV0VBS19PUkRFUklOR19NQgogCQkiMzoJCQkJCQkJXG4iCiAJCSIJLnNldAlwb3AJCQkJCVxuIgogCQkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCIJCQkJXG4iCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2d0NjQxMjAuaCBiL2luY2x1ZGUvYXNtLW1pcHMvZ3Q2NDEyMC5oCmluZGV4IDJlZGQxNzEuLjRiZjhlMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZ3Q2NDEyMC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZ3Q2NDEyMC5oCkBAIC00NTEsNiArNDUxLDEzIEBACiAjZGVmaW5lIEdUX1NEUkFNX09QTU9ERV9PUF9NT0RFCQkzCiAjZGVmaW5lIEdUX1NEUkFNX09QTU9ERV9PUF9DQlIJCTQKIAorI2RlZmluZSBHVF9UQ19DT05UUk9MX0VOVEMwX1NIRgkJMAorI2RlZmluZSBHVF9UQ19DT05UUk9MX0VOVEMwX01TSwkJKE1TSygxKSA8PCBHVF9UQ19DT05UUk9MX0VOVEMwX1NIRikKKyNkZWZpbmUgR1RfVENfQ09OVFJPTF9FTlRDMF9CSVQJCUdUX1RDX0NPTlRST0xfRU5UQzBfTVNLCisjZGVmaW5lIEdUX1RDX0NPTlRST0xfU0VMVEMwX1NIRgkxCisjZGVmaW5lIEdUX1RDX0NPTlRST0xfU0VMVEMwX01TSwkoTVNLKDEpIDw8IEdUX1RDX0NPTlRST0xfU0VMVEMwX1NIRikKKyNkZWZpbmUgR1RfVENfQ09OVFJPTF9TRUxUQzBfQklUCUdUX1RDX0NPTlRST0xfU0VMVEMwX01TSworCiAKICNkZWZpbmUgR1RfUENJMF9CQVJFX1NXU0NTM0JPT1RESVNfU0hGCTAKICNkZWZpbmUgR1RfUENJMF9CQVJFX1NXU0NTM0JPT1RESVNfTVNLCShNU0soMSkgPDwgR1RfUENJMF9CQVJFX1NXU0NTM0JPT1RESVNfU0hGKQpAQCAtNTIzLDYgKzUzMCwxMyBAQAogI2RlZmluZSBHVF9QQ0kwX0NNRF9TV09SRFNXQVBfTVNLCShNU0soMSkgPDwgR1RfUENJMF9DTURfU1dPUkRTV0FQX1NIRikKICNkZWZpbmUgR1RfUENJMF9DTURfU1dPUkRTV0FQX0JJVAlHVF9QQ0kwX0NNRF9TV09SRFNXQVBfTVNLCiAKKyNkZWZpbmUgR1RfSU5UUl9UMEVYUF9TSEYJCTgKKyNkZWZpbmUgR1RfSU5UUl9UMEVYUF9NU0sJCShNU0soMSkgPDwgR1RfSU5UUl9UMEVYUF9TSEYpCisjZGVmaW5lIEdUX0lOVFJfVDBFWFBfQklUCQlHVF9JTlRSX1QwRVhQX01TSworI2RlZmluZSBHVF9JTlRSX1JFVFJZQ1RSMF9TSEYJCTIwCisjZGVmaW5lIEdUX0lOVFJfUkVUUllDVFIwX01TSwkJKE1TSygxKSA8PCBHVF9JTlRSX1JFVFJZQ1RSMF9TSEYpCisjZGVmaW5lIEdUX0lOVFJfUkVUUllDVFIwX0JJVAkJR1RfSU5UUl9SRVRSWUNUUjBfTVNLCisKIC8qCiAgKiAgTWlzYwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2hpZ2htZW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvaGlnaG1lbS5oCmluZGV4IGM5NzZiZmFhLi5mOGM4MTgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2hpZ2htZW0uaApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgogCiAvKiB1bmRlZiBmb3IgcHJvZHVjdGlvbiAqLwpAQCAtNzAsMTEgKzcxLDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hcF9hdG9taWMoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0ga21fdHlwZSB0eXBlKQogeworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGt1bm1hcF9hdG9taWModm9pZCAqa3ZhZGRyLCBlbnVtIGttX3R5cGUgdHlwZSkgeyB9Ci0jZGVmaW5lIGttYXBfYXRvbWljX3BmbihwZm4sIGlkeCkJcGFnZV9hZGRyZXNzKHBmbl90b19wYWdlKHBmbikpCitzdGF0aWMgaW5saW5lIHZvaWQga3VubWFwX2F0b21pYyh2b2lkICprdmFkZHIsIGVudW0ga21fdHlwZSB0eXBlKQoreworCXBhZ2VmYXVsdF9lbmFibGUoKTsKK30KKworI2RlZmluZSBrbWFwX2F0b21pY19wZm4ocGZuLCBpZHgpIGttYXBfYXRvbWljKHBmbl90b19wYWdlKHBmbiksIChpZHgpKQogCiAjZGVmaW5lIGttYXBfYXRvbWljX3RvX3BhZ2UocHRyKSB2aXJ0X3RvX3BhZ2UocHRyKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2k4MjU5LmggYi9pbmNsdWRlL2FzbS1taXBzL2k4MjU5LmgKaW5kZXggMDIxNGFiZS4uNGRmOGQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9pODI1OS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvaTgyNTkuaApAQCAtMTksMTAgKzE5LDMxIEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAorLyogaTgyNTlBIFBJQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUElDX01BU1RFUl9DTUQJCTB4MjAKKyNkZWZpbmUgUElDX01BU1RFUl9JTVIJCTB4MjEKKyNkZWZpbmUgUElDX01BU1RFUl9JU1IJCVBJQ19NQVNURVJfQ01ECisjZGVmaW5lIFBJQ19NQVNURVJfUE9MTAkJUElDX01BU1RFUl9JU1IKKyNkZWZpbmUgUElDX01BU1RFUl9PQ1czCQlQSUNfTUFTVEVSX0lTUgorI2RlZmluZSBQSUNfU0xBVkVfQ01ECQkweGEwCisjZGVmaW5lIFBJQ19TTEFWRV9JTVIJCTB4YTEKKworLyogaTgyNTlBIFBJQyByZWxhdGVkIHZhbHVlICovCisjZGVmaW5lIFBJQ19DQVNDQURFX0lSCQkyCisjZGVmaW5lIE1BU1RFUl9JQ1c0X0RFRkFVTFQJMHgwMQorI2RlZmluZSBTTEFWRV9JQ1c0X0RFRkFVTFQJMHgwMQorI2RlZmluZSBQSUNfSUNXNF9BRU9JCQkyCisKIGV4dGVybiBzcGlubG9ja190IGk4MjU5QV9sb2NrOwogCitleHRlcm4gdm9pZCBpbml0XzgyNTlBKGludCBhdXRvX2VvaSk7CitleHRlcm4gdm9pZCBlbmFibGVfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpOworZXh0ZXJuIHZvaWQgZGlzYWJsZV84MjU5QV9pcnEodW5zaWduZWQgaW50IGlycSk7CisKIGV4dGVybiB2b2lkIGluaXRfaTgyNTlfaXJxcyh2b2lkKTsKIAorI2RlZmluZSBJODI1OUFfSVJRX0JBU0UJMAorCiAvKgogICogRG8gdGhlIHRyYWRpdGlvbmFsIGk4MjU5IGludGVycnVwdCBwb2xsaW5nIHRoaW5nLiAgVGhpcyBpcyBmb3IgdGhlIGZldwogICogY2FzZXMgd2hlcmUgbm8gYmV0dGVyIGludGVycnVwdCBhY2tub3dsZWRnZSBtZXRob2QgaXMgYXZhaWxhYmxlIGFuZCB3ZQpAQCAtMzUsMTUgKzU2LDE1IEBACiAJc3Bpbl9sb2NrKCZpODI1OUFfbG9jayk7CiAKIAkvKiBQZXJmb3JtIGFuIGludGVycnVwdCBhY2tub3dsZWRnZSBjeWNsZSBvbiBjb250cm9sbGVyIDEuICovCi0Jb3V0YigweDBDLCAweDIwKTsJCS8qIHByZXBhcmUgZm9yIHBvbGwgKi8KLQlpcnEgPSBpbmIoMHgyMCkgJiA3OwotCWlmIChpcnEgPT0gMikgeworCW91dGIoMHgwQywgUElDX01BU1RFUl9DTUQpOwkJLyogcHJlcGFyZSBmb3IgcG9sbCAqLworCWlycSA9IGluYihQSUNfTUFTVEVSX0NNRCkgJiA3OworCWlmIChpcnEgPT0gUElDX0NBU0NBREVfSVIpIHsKIAkJLyoKIAkJICogSW50ZXJydXB0IGlzIGNhc2NhZGVkIHNvIHBlcmZvcm0gaW50ZXJydXB0CiAJCSAqIGFja25vd2xlZGdlIG9uIGNvbnRyb2xsZXIgMi4KIAkJICovCi0JCW91dGIoMHgwQywgMHhBMCk7CQkvKiBwcmVwYXJlIGZvciBwb2xsICovCi0JCWlycSA9IChpbmIoMHhBMCkgJiA3KSArIDg7CisJCW91dGIoMHgwQywgUElDX1NMQVZFX0NNRCk7CQkvKiBwcmVwYXJlIGZvciBwb2xsICovCisJCWlycSA9IChpbmIoUElDX1NMQVZFX0NNRCkgJiA3KSArIDg7CiAJfQogCiAJaWYgKHVubGlrZWx5KGlycSA9PSA3KSkgewpAQCAtNTQsMTQgKzc1LDE0IEBACiAJCSAqIHNpZ25pZmljYW50IGJpdCBpcyBub3Qgc2V0IHRoZW4gdGhlcmUgaXMgbm8gdmFsaWQKIAkJICogaW50ZXJydXB0LgogCQkgKi8KLQkJb3V0YigweDBCLCAweDIwKTsJCS8qIElTUiByZWdpc3RlciAqLwotCQlpZih+aW5iKDB4MjApICYgMHg4MCkKKwkJb3V0YigweDBCLCBQSUNfTUFTVEVSX0lTUik7CQkvKiBJU1IgcmVnaXN0ZXIgKi8KKwkJaWYofmluYihQSUNfTUFTVEVSX0lTUikgJiAweDgwKQogCQkJaXJxID0gLTE7CiAJfQogCiAJc3Bpbl91bmxvY2soJmk4MjU5QV9sb2NrKTsKIAotCXJldHVybiBpcnE7CisJcmV0dXJuIGxpa2VseShpcnEgPj0gMCkgPyBpcnEgKyBJODI1OUFfSVJRX0JBU0UgOiBpcnE7CiB9CiAKICNlbmRpZiAvKiBfQVNNX0k4MjU5X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaW8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvaW8uaAppbmRleCBjMmQxMjRiLi5kNzdiNjU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9pby5oCkBAIC0xMTMsNyArMTEzLDcgQEAKICAqICAgICBhbG1vc3QgYWxsIGNvbmNlaXZhYmxlIGNhc2VzIGEgZGV2aWNlIGRyaXZlciBzaG91bGQgbm90IGJlIHVzaW5nCiAgKiAgICAgdGhpcyBmdW5jdGlvbgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19waHlzKHZvbGF0aWxlIHZvaWQgKiBhZGRyZXNzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fcGh5cyh2b2xhdGlsZSBjb25zdCB2b2lkICphZGRyZXNzKQogewogCXJldHVybiAodW5zaWduZWQgbG9uZylhZGRyZXNzIC0gUEFHRV9PRkZTRVQ7CiB9CkBAIC0xNzIsNyArMTcyLDcgQEAKICNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpCSgoZG1hX2FkZHJfdClwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUKQogCiBleHRlcm4gdm9pZCBfX2lvbWVtICogX19pb3JlbWFwKHBoeXNfdCBvZmZzZXQsIHBoeXNfdCBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkIF9faW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOworZXh0ZXJuIHZvaWQgX19pb3VubWFwKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICogX19pb3JlbWFwX21vZGUocGh5c190IG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCkBAIC0yNzksNyArMjc5LDcgQEAKICNkZWZpbmUgaW9yZW1hcF91bmNhY2hlZF9hY2NlbGVyYXRlZChvZmZzZXQsIHNpemUpCQkJXAogCV9faW9yZW1hcF9tb2RlKChvZmZzZXQpLCAoc2l6ZSksIF9DQUNIRV9VTkNBQ0hFRF9BQ0NFTEVSQVRFRCkKIAotc3RhdGljIGlubGluZSB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIGlvdW5tYXAoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogI2RlZmluZSBfX0lTX0tTRUcxKGFkZHIpICgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICYgfjB4MWZmZmZmZmZVTCkgPT0gQ0tTRUcxKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2lycS5oIGIvaW5jbHVkZS9hc20tbWlwcy9pcnEuaAppbmRleCAwY2UyYTgwLi42NzY1NzA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmgKQEAgLTI0LDggKzI0LDYgQEAKICNkZWZpbmUgaXJxX2Nhbm9uaWNhbGl6ZShpcnEpIChpcnEpCS8qIFNhbmUgaGFyZHdhcmUsIHNhbmUgY29kZSAuLi4gKi8KICNlbmRpZgogCi1leHRlcm4gYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgZG9fSVJRKHVuc2lnbmVkIGludCBpcnEpOwotCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogLyoKICAqIENsZWFyIGludGVycnVwdCBtYXNrIGhhbmRsaW5nICJiYWNrc3RvcCIgaWYgaXJxX2h3bWFzawpAQCAtNDMsOCArNDEsNiBAQAogI2RlZmluZSBfX0RPX0lSUV9TTVRDX0hPT0soKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19QUkVFTVBUCi0KIC8qCiAgKiBkb19JUlEgaGFuZGxlcyBhbGwgbm9ybWFsIGRldmljZSBJUlEncyAodGhlIHNwZWNpYWwKICAqIFNNUCBjcm9zcy1DUFUgaW50ZXJydXB0cyBoYXZlIHRoZWlyIG93biBzcGVjaWZpYwpAQCAtNTcsMTIgKzUzLDEwIEBACiBkbyB7CQkJCQkJCQkJXAogCWlycV9lbnRlcigpOwkJCQkJCQlcCiAJX19ET19JUlFfU01UQ19IT09LKCk7CQkJCQkJXAotCV9fZG9fSVJRKChpcnEpKTsJCQkJCQlcCisJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CQkJCQlcCiAJaXJxX2V4aXQoKTsJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAotI2VuZGlmCi0KIGV4dGVybiB2b2lkIGFyY2hfaW5pdF9pcnEodm9pZCk7CiBleHRlcm4gdm9pZCBzcHVyaW91c19pbnRlcnJ1cHQodm9pZCk7CiAKQEAgLTc0LDQgKzY4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBod21hc2spOwogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KIAorZXh0ZXJuIGludCBhbGxvY2F0ZV9pcnFubyh2b2lkKTsKK2V4dGVybiB2b2lkIGFsbG9jX2xlZ2FjeV9pcnFubyh2b2lkKTsKK2V4dGVybiB2b2lkIGZyZWVfaXJxbm8odW5zaWduZWQgaW50IGlycSk7CisKICNlbmRpZiAvKiBfQVNNX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2tleGVjLmggYi9pbmNsdWRlL2FzbS1taXBzL2tleGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1MjY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMva2V4ZWMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICoga2V4ZWMuaCBmb3Iga2V4ZWMKKyAqIENyZWF0ZWQgYnkgPG5zY2hpY2hhbkBjb3JwLmZyZWUuZnI+IG9uIFRodSBPY3QgMTIgMTQ6NTk6MzQgMjAwNgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9NSVBTX0tFWEVDCisjIGRlZmluZSBfTUlQU19LRVhFQworCisvKiBNYXhpbXVtIHBoeXNpY2FsIGFkZHJlc3Mgd2UgY2FuIHVzZSBwYWdlcyBmcm9tICovCisjZGVmaW5lIEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQgKDB4MjAwMDAwMDApCisvKiBNYXhpbXVtIGFkZHJlc3Mgd2UgY2FuIHJlYWNoIGluIHBoeXNpY2FsIGFkZHJlc3MgbW9kZSAqLworI2RlZmluZSBLRVhFQ19ERVNUSU5BVElPTl9NRU1PUllfTElNSVQgKDB4MjAwMDAwMDApCisgLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiB1c2UgZm9yIHRoZSBjb250cm9sIGNvZGUgYnVmZmVyICovCisjZGVmaW5lIEtFWEVDX0NPTlRST0xfTUVNT1JZX0xJTUlUICgweDIwMDAwMDAwKQorCisjZGVmaW5lIEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFIDQwOTYKKworLyogVGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgS0VYRUNfQVJDSCBLRVhFQ19BUkNIX01JUFMKKworI2RlZmluZSBNQVhfTk9URV9CWVRFUyAxMDI0CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcmFzaF9zZXR1cF9yZWdzKHN0cnVjdCBwdF9yZWdzICpuZXdyZWdzLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqb2xkcmVncykKK3sKKwkvKiBEdW1teSBpbXBsZW1lbnRhdGlvbiBmb3Igbm93ICovCit9CisKKyNlbmRpZiAvKiAhX01JUFNfS0VYRUMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgKaW5kZXggMzAxZTcxMy4uZTlmYTI1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgKQEAgLTE3MCwxMCArMTcwLDggQEAKICAgICAgICAgc3RhdGljIGludCBhdWlkZV9kbWFfaG9zdF9vbihpZGVfZHJpdmVfdCAqZHJpdmUpOwogICAgICAgICBzdGF0aWMgaW50IGF1aWRlX2RtYV9sb3N0aXJxKGlkZV9kcml2ZV90ICpkcml2ZSk7CiAgICAgICAgIHN0YXRpYyBpbnQgYXVpZGVfZG1hX29uKGlkZV9kcml2ZV90ICpkcml2ZSk7Ci0gICAgICAgIHN0YXRpYyB2b2lkIGF1aWRlX2RkbWFfdHhfY2FsbGJhY2soaW50IGlycSwgdm9pZCAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotICAgICAgICBzdGF0aWMgdm9pZCBhdWlkZV9kZG1hX3J4X2NhbGxiYWNrKGludCBpcnEsIHZvaWQgKnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyAgICAgICAgc3RhdGljIHZvaWQgYXVpZGVfZGRtYV90eF9jYWxsYmFjayhpbnQgaXJxLCB2b2lkICpwYXJhbSk7CisgICAgICAgIHN0YXRpYyB2b2lkIGF1aWRlX2RkbWFfcnhfY2FsbGJhY2soaW50IGlycSwgdm9pZCAqcGFyYW0pOwogICAgICAgICBzdGF0aWMgaW50IGF1aWRlX2RtYV9vZmZfcXVpZXRseShpZGVfZHJpdmVfdCAqZHJpdmUpOwogI2VuZGlmIC8qIGVuZCBDT05GSUdfQkxLX0RFVl9JREVfQVUxWFhYX01ETUEyX0RCRE1BICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvY29iYWx0LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L2NvYmFsdC5oCmluZGV4IGIzYzVlY2IuLjAwYjBmYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvY29iYWx0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC9jb2JhbHQuaApAQCAtNjcsMzQgKzY3LDkgQEAKICNkZWZpbmUgQ09CQUxUX0JSRF9JRF9RVUJFMiAgICAweDUKICNkZWZpbmUgQ09CQUxUX0JSRF9JRF9SQVEyICAgICAweDYKIAotLyoKLSAqIEdhbGlsZW8gY2hpcHNldCBhY2Nlc3MgbWFjcm9zIGZvciB0aGUgQ29iYWx0LiBUaGUgYmFzZSBhZGRyZXNzIGZvcgotICogdGhlIEdUNjQxMTEgY2hpcCBpcyAweDE0MDAwMDAwCi0gKgotICogTW9zdCBvZiB0aGlzIHJlYWxseSBzaG91bGQgZ28gaW50byBhIHNlcGFyYXRlIEdUNjQxMTEgaGVhZGVyIGZpbGUuCi0gKi8KLSNkZWZpbmUgR1Q2NDExMV9JT19CQVNFCQkweDEwMDAwMDAwVUwKLSNkZWZpbmUgR1Q2NDExMV9JT19FTkQJCTB4MTFmZmZmZmZVTAotI2RlZmluZSBHVDY0MTExX01FTV9CQVNFCTB4MTIwMDAwMDBVTAotI2RlZmluZSBHVDY0MTExX01FTV9FTkQJCTB4MTNmZmZmZmZVTAotI2RlZmluZSBHVDY0MTExX0JBU0UJCTB4MTQwMDAwMDBVTAotI2RlZmluZSBHQUxJTEVPX1JFRyhvZnMpCUNLU0VHMUFERFIoR1Q2NDExMV9CQVNFICsgKHVuc2lnbmVkIGxvbmcpKG9mcykpCi0KLSNkZWZpbmUgR0FMSUxFT19JTkwocG9ydCkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIEdBTElMRU9fUkVHKHBvcnQpKQotI2RlZmluZSBHQUxJTEVPX09VVEwodmFsLCBwb3J0KQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgR0FMSUxFT19SRUcocG9ydCkgPSAodmFsKTsJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR0FMSUxFT19JTlRSX1QwRVhQCSgxIDw8IDgpCi0jZGVmaW5lIEdBTElMRU9fSU5UUl9SRVRSWV9DVFIJKDEgPDwgMjApCi0KLSNkZWZpbmUgR0FMSUxFT19FTlRDMAkJMHgwMQotI2RlZmluZSBHQUxJTEVPX1NFTFRDMAkJMHgwMgotCiAjZGVmaW5lIFBDSV9DRkdfU0VUKGRldmZuLHdoZXJlKQkJCQkJXAotCUdBTElMRU9fT1VUTCgoMHg4MDAwMDAwMCB8IChQQ0lfU0xPVCAoZGV2Zm4pIDw8IDExKSB8CQlcCi0JCShQQ0lfRlVOQyAoZGV2Zm4pIDw8IDgpIHwgKHdoZXJlKSksIEdUX1BDSTBfQ0ZHQUREUl9PRlMpCisJR1RfV1JJVEUoR1RfUENJMF9DRkdBRERSX09GUywgKDB4ODAwMDAwMDAgfCAoUENJX1NMT1QgKGRldmZuKSA8PCAxMSkgfAkJXAorCQkoUENJX0ZVTkMgKGRldmZuKSA8PCA4KSB8ICh3aGVyZSkpKQogCiAjZGVmaW5lIENPQkFMVF9MRURfUE9SVAkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBDS1NFRzFBRERSKDB4MWMwMDAwMDApKQogIyBkZWZpbmUgQ09CQUxUX0xFRF9CQVJfTEVGVAkoMSA8PCAwKQkvKiBRdWJlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L21hY2gtZ3Q2NDEyMC5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC9tYWNoLWd0NjQxMjAuaAppbmRleCA1ODdmYzQzLi5hZTljNTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L21hY2gtZ3Q2NDEyMC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvbWFjaC1ndDY0MTIwLmgKQEAgLTEgKzEsMjcgQEAKLS8qIHRoZXJlJ3Mgc29tZXRoaW5nIGhlcmUgLi4uIGluIHRoZSBkYXJrICovCisvKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2lmbmRlZiBfQ09CQUxUX01BQ0hfR1Q2NDEyMF9ICisjZGVmaW5lIF9DT0JBTFRfTUFDSF9HVDY0MTIwX0gKKworLyoKKyAqIENvYmFsdCB1c2VzIEdUNjQxMTEuIEdUNjQxMTEgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIEdUNjQxMjAuCisgKi8KKworI2RlZmluZSBHVDY0MTIwX0JBU0UJQ0tTRUcxQUREUihHVF9ERUZfQkFTRSkKKworI2VuZGlmIC8qIF9DT0JBTFRfTUFDSF9HVDY0MTIwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L2lycS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvaXJxLmgKaW5kZXggODA2MjEzYy4uMjVmMGMzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvaXJxLmgKQEAgLTEwLDggKzEwLDYgQEAKICNpZm5kZWYgX19BU01fTUFDSF9JUDI3X0lSUV9ICiAjZGVmaW5lIF9fQVNNX01BQ0hfSVAyN19JUlFfSAogCi0jaW5jbHVkZSA8YXNtL3NuL2FyY2guaD4KLQogLyoKICAqIEEgaGFyZHdpcmVkIGludGVycnVwdCBudW1iZXIgaXMgY29tcGxldGx5IHN0dXBpZCBmb3IgdGhpcyBzeXN0ZW0gLSBhCiAgKiBsYXJnZSBjb25maWd1cmF0aW9uIG1pZ2h0IGhhdmUgdGhvdXNhbmRzIGlmIG5vdCB0ZW50aG91c2FuZHMgb2YKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtaXAyNy90b3BvbG9neS5oCmluZGV4IGExM2I3MTUuLjQ0NzkwZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1pcDI3L3RvcG9sb2d5LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWlwMjcvdG9wb2xvZ3kuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9NQUNIX1RPUE9MT0dZX0gKICNkZWZpbmUgX0FTTV9NQUNIX1RPUE9MT0dZX0gJMQogCi0jaW5jbHVkZSA8YXNtL3NuL2FyY2guaD4KICNpbmNsdWRlIDxhc20vc24vaHViLmg+CiAjaW5jbHVkZSA8YXNtL21tem9uZS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcm0yMDAvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtcm0vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1ybTIwMC9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJtL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcm0yMDAvbWMxNDY4MThydGMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1ybS9tYzE0NjgxOHJ0Yy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1taXBzL21hY2gtcm0yMDAvbWMxNDY4MThydGMuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJtL21jMTQ2ODE4cnRjLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1ybTIwMC90aW1leC5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXJtL3RpbWV4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLW1pcHMvbWFjaC1ybTIwMC90aW1leC5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1taXBzL21hY2gtcm0vdGltZXguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9taXBzbXRyZWdzLmggYi9pbmNsdWRlL2FzbS1taXBzL21pcHNtdHJlZ3MuaAppbmRleCBmNjM3Y2U3Li4zZTk0NjhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21pcHNtdHJlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21pcHNtdHJlZ3MuaApAQCAtMzUyLDYgKzM1Miw4IEBACiAjZGVmaW5lIHdyaXRlX3ZwZV9jMF92cGVjb250cm9sKHZhbCkJbXR0YzAoMSwgMSwgdmFsKQogI2RlZmluZSByZWFkX3ZwZV9jMF92cGVjb25mMCgpCQltZnRjMCgxLCAyKQogI2RlZmluZSB3cml0ZV92cGVfYzBfdnBlY29uZjAodmFsKQltdHRjMCgxLCAyLCB2YWwpCisjZGVmaW5lIHJlYWRfdnBlX2MwX2NvdW50KCkJCW1mdGMwKDksIDApCisjZGVmaW5lIHdyaXRlX3ZwZV9jMF9jb3VudCh2YWwpCQltdHRjMCg5LCAwLCB2YWwpCiAjZGVmaW5lIHJlYWRfdnBlX2MwX3N0YXR1cygpCQltZnRjMCgxMiwgMCkKICNkZWZpbmUgd3JpdGVfdnBlX2MwX3N0YXR1cyh2YWwpCW10dGMwKDEyLCAwLCB2YWwpCiAjZGVmaW5lIHJlYWRfdnBlX2MwX2NhdXNlKCkJCW1mdGMwKDEzLCAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9taXBzcmVncy5oIGIvaW5jbHVkZS9hc20tbWlwcy9taXBzcmVncy5oCmluZGV4IDFmMzE4ZDcuLjk5ODVjYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwc3JlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21pcHNyZWdzLmgKQEAgLTU0NSw2MiArNTQ1LDYgQEAKICNkZWZpbmUgTUlQU19GUElSX0wJCShfVUxDQVNUXygxKSA8PCAyMSkKICNkZWZpbmUgTUlQU19GUElSX0Y2NAkJKF9VTENBU1RfKDEpIDw8IDIyKQogCi0vKgotICogUjEwMDAwIHBlcmZvcm1hbmNlIGNvdW50ZXIgZGVmaW5pdGlvbnMuCi0gKgotICogRklYTUU6IFRoZSBSMTAwMDAgcGVyZm9ybWFuY2UgY291bnRlciBvcGVucyBhIG5pY2Ugd2F5IHRvIGltcGxlbWVudCBDUFUKLSAqICAgICAgICB0aW1lIGFjY291bnRpbmcgd2l0aCBhIHByZWNpc3Npb24gb2Ygb25lIGN5Y2xlLiAgSSBkb24ndCBoYXZlCi0gKiAgICAgICAgUjEwMDAwIHNpbGljb24gYnV0IGp1c3QgYSBtYW51YWwsIHNvIC4uLgotICovCi0KLS8qCi0gKiBFdmVudHMgY291bnRlZCBieSBjb3VudGVyICMwCi0gKi8KLSNkZWZpbmUgQ0UwX0NZQ0xFUwkJCTAKLSNkZWZpbmUgQ0UwX0lOU05fSVNTVUVECQkJMQotI2RlZmluZSBDRTBfTFBTQ19JU1NVRUQJCQkyCi0jZGVmaW5lIENFMF9TX0lTU1VFRAkJCTMKLSNkZWZpbmUgQ0UwX1NDX0lTU1VFRAkJCTQKLSNkZWZpbmUgQ0UwX1NDX0ZBSUxFRAkJCTUKLSNkZWZpbmUgQ0UwX0JSQU5DSF9ERUNPREVECQk2Ci0jZGVmaW5lIENFMF9RV19XQl9TRUNPTkRBUlkJCTcKLSNkZWZpbmUgQ0UwX0NPUlJFQ1RFRF9FQ0NfRVJST1JTCTgKLSNkZWZpbmUgQ0UwX0lDQUNIRV9NSVNTRVMJCTkKLSNkZWZpbmUgQ0UwX1NDQUNIRV9JX01JU1NFUwkJMTAKLSNkZWZpbmUgQ0UwX1NDQUNIRV9JX1dBWV9NSVNTUFJFRElDVEVECTExCi0jZGVmaW5lIENFMF9FWFRfSU5URVJWRU5USU9OU19SRVEJMTIKLSNkZWZpbmUgQ0UwX0VYVF9JTlZBTElEQVRFX1JFUQkJMTMKLSNkZWZpbmUgQ0UwX1ZJUlRVQUxfQ09IRVJFTkNZX0NPTkQJMTQKLSNkZWZpbmUgQ0UwX0lOU05fR1JBRFVBVEVECQkxNQotCi0vKgotICogRXZlbnRzIGNvdW50ZWQgYnkgY291bnRlciAjMQotICovCi0jZGVmaW5lIENFMV9DWUNMRVMJCQkwCi0jZGVmaW5lIENFMV9JTlNOX0dSQURVQVRFRAkJMQotI2RlZmluZSBDRTFfTFBTQ19HUkFEVUFURUQJCTIKLSNkZWZpbmUgQ0UxX1NfR1JBRFVBVEVECQkJMwotI2RlZmluZSBDRTFfU0NfR1JBRFVBVEVECQk0Ci0jZGVmaW5lIENFMV9GUF9JTlNOX0dSQURVQVRFRAkJNQotI2RlZmluZSBDRTFfUVdfV0JfUFJJTUFSWQkJNgotI2RlZmluZSBDRTFfVExCX1JFRklMTAkJCTcKLSNkZWZpbmUgQ0UxX0JSQU5DSF9NSVNTUFJFRElDVEVECTgKLSNkZWZpbmUgQ0UxX0RDQUNIRV9NSVNTCQkJOQotI2RlZmluZSBDRTFfU0NBQ0hFX0RfTUlTU0VTCQkxMAotI2RlZmluZSBDRTFfU0NBQ0hFX0RfV0FZX01JU1NQUkVESUNURUQJMTEKLSNkZWZpbmUgQ0UxX0VYVF9JTlRFUlZFTlRJT05fSElUUwkxMgotI2RlZmluZSBDRTFfRVhUX0lOVkFMSURBVEVfUkVRCQkxMwotI2RlZmluZSBDRTFfU1BfSElOVF9UT19DRVhDTF9TQ19CTE9DS1MJMTQKLSNkZWZpbmUgQ0UxX1NQX0hJTlRfVE9fU0hBUkVEX1NDX0JMT0NLUwkxNQotCi0vKgotICogVGhlc2UgZmxhZ3MgZGVmaW5lIGluIHdoaWNoIHByaXZpbGVnZSBtb2RlIHRoZSBjb3VudGVycyBjb3VudCBldmVudHMKLSAqLwotI2RlZmluZSBDRUJfVVNFUgk4CS8qIENvdW50IGV2ZW50cyBpbiB1c2VyIG1vZGUsIEVYTCA9IEVSTCA9IDAgKi8KLSNkZWZpbmUgQ0VCX1NVUEVSVklTT1IJNAkvKiBDb3VudCBldmVudHMgaW4gc3VwdmVydmlzb3IgbW9kZSBFWEwgPSBFUkwgPSAwICovCi0jZGVmaW5lIENFQl9LRVJORUwJMgkvKiBDb3VudCBldmVudHMgaW4ga2VybmVsIG1vZGUgRVhMID0gRVJMID0gMCAqLwotI2RlZmluZSBDRUJfRVhMCQkxCS8qIENvdW50IGV2ZW50cyB3aXRoIEVYTCA9IDEsIEVSTCA9IDAgKi8KLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmgKaW5kZXggODViMjU4ZS4uMmY5ZTFhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmgKQEAgLTM0LDcgKzM0LDggQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotI2luY2x1ZGUgPGFzbS9jcHUtZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogZXh0ZXJuIHZvaWQgY2xlYXJfcGFnZSh2b2lkICogcGFnZSk7CiBleHRlcm4gdm9pZCBjb3B5X3BhZ2Uodm9pZCAqIHRvLCB2b2lkICogZnJvbSk7CkBAIC01OSwxNiArNjAsMTMgQEAKIAkJZmx1c2hfZGF0YV9jYWNoZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdnRvLCB2b2lkICp2ZnJvbSwgdW5zaWduZWQgbG9uZyB2YWRkciwKLQlzdHJ1Y3QgcGFnZSAqdG8pCi17Ci0JZXh0ZXJuIHZvaWQgKCpmbHVzaF9kYXRhX2NhY2hlX3BhZ2UpKHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gdm9pZCBjb3B5X3VzZXJfcGFnZSh2b2lkICp2dG8sIHZvaWQgKnZmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyLAorCXN0cnVjdCBwYWdlICp0byk7CitzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7CitleHRlcm4gdm9pZCBjb3B5X3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHBhZ2UgKnRvLCBzdHJ1Y3QgcGFnZSAqZnJvbSwKKwl1bnNpZ25lZCBsb25nIHZhZGRyLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAKLQljb3B5X3BhZ2UodnRvLCB2ZnJvbSk7Ci0JaWYgKCFjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMgfHwKLQkgICAgcGFnZXNfZG9fYWxpYXMoKHVuc2lnbmVkIGxvbmcpdnRvLCB2YWRkciAmIFBBR0VfTUFTSykpCi0JCWZsdXNoX2RhdGFfY2FjaGVfcGFnZSgodW5zaWduZWQgbG9uZyl2dG8pOwotfQorI2RlZmluZSBfX0hBVkVfQVJDSF9DT1BZX1VTRVJfSElHSFBBR0UKIAogLyoKICAqIFRoZXNlIGFyZSB1c2VkIHRvIG1ha2UgdXNlIG9mIEMgdHlwZS1jaGVja2luZy4uCkBAIC0xMzQsOCArMTMyLDE0IEBACiAvKiB0byBhbGlnbiB0aGUgcG9pbnRlciB0byB0aGUgKG5leHQpIHBhZ2UgYm91bmRhcnkgKi8KICNkZWZpbmUgUEFHRV9BTElHTihhZGRyKQkoKChhZGRyKSArIFBBR0VfU0laRSAtIDEpICYgUEFHRV9NQVNLKQogCi0jZGVmaW5lIF9fcGEoeCkJCQkoKHVuc2lnbmVkIGxvbmcpICh4KSAtIFBBR0VfT0ZGU0VUKQotI2RlZmluZSBfX3ZhKHgpCQkJKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKSAoeCkgKyBQQUdFX09GRlNFVCkpCisjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmICFkZWZpbmVkKENPTkZJR19CVUlMRF9FTEY2NCkKKyNkZWZpbmUgX19wYV9wYWdlX29mZnNldCh4KQkoKHVuc2lnbmVkIGxvbmcpKHgpIDwgQ0tTRUcwID8gUEFHRV9PRkZTRVQgOiBDS1NFRzApCisjZWxzZQorI2RlZmluZSBfX3BhX3BhZ2Vfb2Zmc2V0KHgpCVBBR0VfT0ZGU0VUCisjZW5kaWYKKyNkZWZpbmUgX19wYSh4KQkJCSgodW5zaWduZWQgbG9uZykoeCkgLSBfX3BhX3BhZ2Vfb2Zmc2V0KHgpKQorI2RlZmluZSBfX3BhX3N5bWJvbCh4KQkJX19wYShSRUxPQ19ISURFKCh1bnNpZ25lZCBsb25nKSh4KSwwKSkKKyNkZWZpbmUgX192YSh4KQkJCSgodm9pZCAqKSgodW5zaWduZWQgbG9uZykoeCkgKyBQQUdFX09GRlNFVCkpCiAKICNkZWZpbmUgcGZuX3RvX2thZGRyKHBmbikJX192YSgocGZuKSA8PCBQQUdFX1NISUZUKQogCkBAIC0xNjAsOCArMTY0LDggQEAKIAogI2VuZGlmCiAKLSNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQotI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSB2aXJ0X3RvX3BhZ2Uoa2FkZHIpCXBmbl90b19wYWdlKFBGTl9ET1dOKHZpcnRfdG9fcGh5cyhrYWRkcikpKQorI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChQRk5fRE9XTih2aXJ0X3RvX3BoeXMoa2FkZHIpKSkKIAogI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MJKFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMgfCBcCiAJCQkJIFZNX01BWVJFQUQgfCBWTV9NQVlXUklURSB8IFZNX01BWUVYRUMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BjaS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wY2kuaAppbmRleCBjNGQ2OGJlLi43ZjBmMTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGNpLmgKQEAgLTE4Nyw0ICsxODcsMTAgQEAKIC8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KIGV4dGVybiBpbnQgcGNpYmlvc19wbGF0X2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCisvKiBDaGFuY2VzIGFyZSB0aGlzIGludGVycnVwdCBpcyB3aXJlZCBQQy1zdHlsZSAuLi4gICovCitzdGF0aWMgaW5saW5lIGludCBwY2lfZ2V0X2xlZ2FjeV9pZGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsID8gMTUgOiAxNDsKK30KKwogI2VuZGlmIC8qIF9BU01fUENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ2FsbG9jLmgKaW5kZXggNTgyYzFmZS4uYWYxMjFjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ2FsbG9jLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogCXJldCA9IChwZ2RfdCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFBHRF9PUkRFUik7CiAJaWYgKHJldCkgewotCQlpbml0ID0gcGdkX29mZnNldCgmaW5pdF9tbSwgMCk7CisJCWluaXQgPSBwZ2Rfb2Zmc2V0KCZpbml0X21tLCAwVUwpOwogCQlwZ2RfaW5pdCgodW5zaWduZWQgbG9uZylyZXQpOwogCQltZW1jcHkocmV0ICsgVVNFUl9QVFJTX1BFUl9QR0QsIGluaXQgKyBVU0VSX1BUUlNfUEVSX1BHRCwKIAkJICAgICAgIChQVFJTX1BFUl9QR0QgLSBVU0VSX1BUUlNfUEVSX1BHRCkgKiBzaXplb2YocGdkX3QpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS0zMi5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTMyLmgKaW5kZXggZDIwZjJlOS4uMmZiZDQ3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTMyLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTMyLmgKQEAgLTE1Niw5ICsxNTYsOSBAQAogI2RlZmluZSBfX3B0ZV9vZmZzZXQoYWRkcmVzcykJCQkJCQlcCiAJKCgoYWRkcmVzcykgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUFRFIC0gMSkpCiAjZGVmaW5lIHB0ZV9vZmZzZXQoZGlyLCBhZGRyZXNzKQkJCQkJXAotCSgocHRlX3QgKikgKHBtZF9wYWdlX3ZhZGRyKCpkaXIpKSArIF9fcHRlX29mZnNldChhZGRyZXNzKSkKLSNkZWZpbmUgcHRlX29mZnNldF9rZXJuZWwoZGlyLCBhZGRyZXNzKSBcCi0JKChwdGVfdCAqKSBwbWRfcGFnZV92YWRkcigqKGRpcikpICsgIF9fcHRlX29mZnNldChhZGRyZXNzKSkKKwkoKHB0ZV90ICopIHBtZF9wYWdlX3ZhZGRyKCooZGlyKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCisjZGVmaW5lIHB0ZV9vZmZzZXRfa2VybmVsKGRpciwgYWRkcmVzcykJCQkJCVwKKwkoKHB0ZV90ICopIHBtZF9wYWdlX3ZhZGRyKCooZGlyKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCiAKICNkZWZpbmUgcHRlX29mZnNldF9tYXAoZGlyLCBhZGRyZXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkoKHB0ZV90ICopcGFnZV9hZGRyZXNzKHBtZF9wYWdlKCooZGlyKSkpICsgX19wdGVfb2Zmc2V0KGFkZHJlc3MpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmggYi9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUtNjQuaAppbmRleCBkMDVmYjZmLi5hNWIxODcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUtNjQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUtNjQuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWN0bC5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUtbm9wdWQuaD4KIApAQCAtMTAzLDYgKzEwNCwxMyBAQAogI2RlZmluZSBWTUFMTE9DX1NUQVJUCQlNQVBfQkFTRQogI2RlZmluZSBWTUFMTE9DX0VORAlcCiAJKFZNQUxMT0NfU1RBUlQgKyBQVFJTX1BFUl9QR0QgKiBQVFJTX1BFUl9QTUQgKiBQVFJTX1BFUl9QVEUgKiBQQUdFX1NJWkUpCisjaWYgZGVmaW5lZChDT05GSUdfTU9EVUxFUykgJiYgIWRlZmluZWQoQ09ORklHX0JVSUxEX0VMRjY0KSAmJiBcCisJVk1BTExPQ19TVEFSVCAhPSBDS1NTRUcKKy8qIExvYWQgbW9kdWxlcyBpbnRvIDMyYml0LWNvbXBhdGlibGUgc2VnbWVudC4gKi8KKyNkZWZpbmUgTU9EVUxFX1NUQVJUCUNLU1NFRworI2RlZmluZSBNT0RVTEVfRU5ECShGSVhBRERSX1NUQVJULTIqUEFHRV9TSVpFKQorZXh0ZXJuIHBnZF90IG1vZHVsZV9wZ19kaXJbUFRSU19QRVJfUEdEXTsKKyNlbmRpZgogCiAjZGVmaW5lIHB0ZV9FUlJPUihlKSBcCiAJcHJpbnRrKCIlczolZDogYmFkIHB0ZSAlMDE2bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHB0ZV92YWwoZSkpCkBAIC0xNzQsNyArMTgyLDEyIEBACiAjZGVmaW5lIF9fcG1kX29mZnNldChhZGRyZXNzKQlwbWRfaW5kZXgoYWRkcmVzcykKIAogLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIGtlcm5lbCBwYWdlLXRhYmxlLWRpcmVjdG9yeSAqLwotI2RlZmluZSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcykgcGdkX29mZnNldCgmaW5pdF9tbSwgMCkKKyNpZmRlZiBNT0RVTEVfU1RBUlQKKyNkZWZpbmUgcGdkX29mZnNldF9rKGFkZHJlc3MpIFwKKwkoKGFkZHJlc3MpID49IE1PRFVMRV9TVEFSVCA/IG1vZHVsZV9wZ19kaXIgOiBwZ2Rfb2Zmc2V0KCZpbml0X21tLCAwVUwpKQorI2Vsc2UKKyNkZWZpbmUgcGdkX29mZnNldF9rKGFkZHJlc3MpIHBnZF9vZmZzZXQoJmluaXRfbW0sIDBVTCkKKyNlbmRpZgogCiAjZGVmaW5lIHBnZF9pbmRleChhZGRyZXNzKQkoKChhZGRyZXNzKSA+PiBQR0RJUl9TSElGVCkgJiAoUFRSU19QRVJfUEdELTEpKQogI2RlZmluZSBwbWRfaW5kZXgoYWRkcmVzcykJKCgoYWRkcmVzcykgPj4gUE1EX1NISUZUKSAmIChQVFJTX1BFUl9QTUQtMSkpCkBAIC0xOTksOSArMjEyLDkgQEAKICNkZWZpbmUgX19wdGVfb2Zmc2V0KGFkZHJlc3MpCQkJCQkJXAogCSgoKGFkZHJlc3MpID4+IFBBR0VfU0hJRlQpICYgKFBUUlNfUEVSX1BURSAtIDEpKQogI2RlZmluZSBwdGVfb2Zmc2V0KGRpciwgYWRkcmVzcykJCQkJCVwKLQkoKHB0ZV90ICopIChwbWRfcGFnZV92YWRkcigqZGlyKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCisJKChwdGVfdCAqKSBwbWRfcGFnZV92YWRkcigqKGRpcikpICsgX19wdGVfb2Zmc2V0KGFkZHJlc3MpKQogI2RlZmluZSBwdGVfb2Zmc2V0X2tlcm5lbChkaXIsIGFkZHJlc3MpCQkJCQlcCi0JKChwdGVfdCAqKSBwbWRfcGFnZV92YWRkcigqKGRpcikpICsgIF9fcHRlX29mZnNldChhZGRyZXNzKSkKKwkoKHB0ZV90ICopIHBtZF9wYWdlX3ZhZGRyKCooZGlyKSkgKyBfX3B0ZV9vZmZzZXQoYWRkcmVzcykpCiAjZGVmaW5lIHB0ZV9vZmZzZXRfbWFwKGRpciwgYWRkcmVzcykJCQkJCVwKIAkoKHB0ZV90ICopcGFnZV9hZGRyZXNzKHBtZF9wYWdlKCooZGlyKSkpICsgX19wdGVfb2Zmc2V0KGFkZHJlc3MpKQogI2RlZmluZSBwdGVfb2Zmc2V0X21hcF9uZXN0ZWQoZGlyLCBhZGRyZXNzKQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCmluZGV4IDFjYTRkMWUuLmYyZTEzMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oCkBAIC02Nyw3ICs2Nyw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyB6ZXJvX3BhZ2VfbWFzazsKIAogI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpIFwKLQkodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSArICgoKHVuc2lnbmVkIGxvbmcpKHZhZGRyKSkgJiB6ZXJvX3BhZ2VfbWFzaykpKQorCSh2aXJ0X3RvX3BhZ2UoKHZvaWQgKikoZW1wdHlfemVyb19wYWdlICsgKCgodW5zaWduZWQgbG9uZykodmFkZHIpKSAmIHplcm9fcGFnZV9tYXNrKSkpKQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX01PVkVfUFRFCiAjZGVmaW5lIG1vdmVfcHRlKHB0ZSwgcHJvdCwgb2xkX2FkZHIsIG5ld19hZGRyKQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3B0cmFjZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wdHJhY2UuaAppbmRleCA1ZjNhOTA3Li44YTFmMmI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcHRyYWNlLmgKQEAgLTgwLDEwICs4MCwxNiBAQAogI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPmNwMF9lcGMpCiAjZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQogCi1leHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7Ci0KIGV4dGVybiBhc21saW5rYWdlIHZvaWQgZG9fc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVudHJ5ZXhpdCk7CiAKK2V4dGVybiBOT1JFVF9UWVBFIHZvaWQgZGllKGNvbnN0IGNoYXIgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHVubGlrZWx5KCF1c2VyX21vZGUocmVncykpKQorCQlkaWUoc3RyLCByZWdzKTsKK30KKwogI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NldHVwLmggYi9pbmNsdWRlL2FzbS1taXBzL3NldHVwLmgKaW5kZXggNzM3ZmE0YS4uNzAwMDlhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2V0dXAuaApAQCAtMSw4ICsxLDYgQEAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9NSVBTX1NFVFVQX0gKICNkZWZpbmUgX01JUFNfU0VUVVBfSAogCiAjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFCTI1NgogCiAjZW5kaWYgLyogX19TRVRVUF9IICovCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTAuaAppbmRleCBiMDllMTZjLi4yYmE2OTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTAuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTAuaApAQCAtNTEsOCArNTEsOCBAQAogZXh0ZXJuIHZvaWQgc2IxMjUwX3VubWFza19pcnEoaW50IGNwdSwgaW50IGlycSk7CiBleHRlcm4gdm9pZCBzYjEyNTBfc21wX2ZpbmlzaCh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgYmNtMTQ4MF9ocHRfc2V0dXAodm9pZCk7CiBleHRlcm4gdm9pZCBiY20xNDgwX3RpbWVfaW5pdCh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGJjbTE0ODBfZ2V0dGltZW9mZnNldCh2b2lkKTsKIGV4dGVybiB2b2lkIGJjbTE0ODBfbWFza19pcnEoaW50IGNwdSwgaW50IGlycSk7CiBleHRlcm4gdm9pZCBiY20xNDgwX3VubWFza19pcnEoaW50IGNwdSwgaW50IGlycSk7CiBleHRlcm4gdm9pZCBiY20xNDgwX3NtcF9maW5pc2godm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NuL2FyY2guaCBiL2luY2x1ZGUvYXNtLW1pcHMvc24vYXJjaC5oCmluZGV4IDUxMTc0YWYuLmRhNTIzZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc24vYXJjaC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc24vYXJjaC5oCkBAIC0xOCw3ICsxOCw2IEBACiAjZW5kaWYKIAogdHlwZWRlZiB1NjQJaHVicmVnX3Q7Ci10eXBlZGVmIHU2NAluaWNfdDsKIAogI2RlZmluZSBjcHV0b25hc2lkKGNwdSkJCQkoY3B1X2RhdGFbKGNwdSldLnBfbmFzaWQpCiAjZGVmaW5lIGNwdXRvc2xpY2UoY3B1KQkJCShjcHVfZGF0YVsoY3B1KV0ucF9zbGljZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc24va2xjb25maWcuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc24va2xjb25maWcuaAppbmRleCBiNjNjZDA2Li44MmFlYjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NuL2tsY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zbi9rbGNvbmZpZy5oCkBAIC02MSw2ICs2MSw4IEBACiAjZW5kaWYgLyogQ09ORklHX1NHSV9JUDM1ICovCiAjZW5kaWYgLyogQ09ORklHX1NHSV9JUDI3IHx8IENPTkZJR19TR0lfSVAzNSAqLwogCit0eXBlZGVmIHU2NCAgbmljX3Q7CisKICNkZWZpbmUgS0xDRkdJTkZPX01BR0lDCTB4YmVlZGJhYmUKIAogdHlwZWRlZiBzMzIga2xjb25mX29mZl90OwpAQCAtMTc2LDcgKzE3OCw3IEBACiAvKiAtLS0gTmV3IE1hY3JvcyBmb3IgdGhlIGNoYW5nZWQga2xfY29uZmlnX2hkcl90IHN0cnVjdHVyZSAtLS0gKi8KIAogI2RlZmluZSBQVFJfQ0hfTUFMTE9DX0hEUihfaykgICAoKGtsY19tYWxsb2NfaGRyX3QgKilcCi0JCQkodW5zaWduZWQgbG9uZylfayArIChfay0+Y2hfbWFsbG9jX2hkcl9vZmYpKSkKKwkJCSgodW5zaWduZWQgbG9uZylfayArIChfay0+Y2hfbWFsbG9jX2hkcl9vZmYpKSkKIAogI2RlZmluZSBLTF9DT05GSUdfQ0hfTUFMTE9DX0hEUihfbikgICBQVFJfQ0hfTUFMTE9DX0hEUihLTF9DT05GSUdfSERSKF9uKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9jay5oCmluZGV4IGM4ZDU1ODcuLmZjMzIxN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrLmgKQEAgLTMsMTIgKzMsMTMgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIGJ5IFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAwNiBieSBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAgKi8KICNpZm5kZWYgX0FTTV9TUElOTE9DS19ICiAjZGVmaW5lIF9BU01fU1BJTkxPQ0tfSAogCisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KICNpbmNsdWRlIDxhc20vd2FyLmg+CiAKIC8qCkBAIC00MCw3ICs0MSw2IEBACiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgogCQkiCSBub3AJCQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKIAkJOiAiPW0iIChsb2NrLT5sb2NrKSwgIj0mciIgKHRtcCkKIAkJOiAibSIgKGxvY2stPmxvY2spCkBAIC01MywxOSArNTMsMjIgQEAKIAkJIgkgbGkJJTEsIDEJCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxegklMSwgMWIJCQkJCVxuIgotCQkiCSBzeW5jCQkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCiAJCTogIj1tIiAobG9jay0+bG9jayksICI9JnIiICh0bXApCiAJCTogIm0iIChsb2NrLT5sb2NrKQogCQk6ICJtZW1vcnkiKTsKIAl9CisKKwlzbXBfbWIoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogeworCXNtcF9tYigpOworCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJIgkuc2V0CW5vcmVvcmRlcgkjIF9fcmF3X3NwaW5fdW5sb2NrCVxuIgotCSIJc3luYwkJCQkJCVxuIgogCSIJc3cJJDAsICUwCQkJCQlcbiIKIAkiCS5zZXRcdHJlb3JkZXIJCQkJCVxuIgogCTogIj1tIiAobG9jay0+bG9jaykKQEAgLTg2LDcgKzg5LDYgQEAKIAkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgogCQkiCSBub3AJCQkJCQlcbiIKIAkJIglhbmRpCSUyLCAlMCwgMQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyIgogCQk6ICI9JnIiICh0ZW1wKSwgIj1tIiAobG9jay0+bG9jayksICI9JnIiIChyZXMpCiAJCTogIm0iIChsb2NrLT5sb2NrKQpAQCAtOTksMTMgKzEwMSwxNCBAQAogCQkiCXNjCSUyLCAlMQkJCQkJXG4iCiAJCSIJYmVxegklMiwgMWIJCQkJCVxuIgogCQkiCSBhbmRpCSUyLCAlMCwgMQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyIgogCQk6ICI9JnIiICh0ZW1wKSwgIj1tIiAobG9jay0+bG9jayksICI9JnIiIChyZXMpCiAJCTogIm0iIChsb2NrLT5sb2NrKQogCQk6ICJtZW1vcnkiKTsKIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXMgPT0gMDsKIH0KIApAQCAtMTQzLDcgKzE0Niw2IEBACiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgogCQkiCSBub3AJCQkJCQlcbiIKLQkJIglzeW5jCQkJCQkJXG4iCiAJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKIAkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApCiAJCTogIm0iIChydy0+bG9jaykKQEAgLTE1NiwxMiArMTU4LDE0IEBACiAJCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxegklMSwgMWIJCQkJCVxuIgotCQkiCSBzeW5jCQkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCiAJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKQogCQk6ICJtIiAocnctPmxvY2spCiAJCTogIm1lbW9yeSIpOwogCX0KKworCXNtcF9tYigpOwogfQogCiAvKiBOb3RlIHRoZSB1c2Ugb2Ygc3ViLCBub3Qgc3VidSB3aGljaCB3aWxsIG1ha2UgdGhlIGtlcm5lbCBkaWUgd2l0aCBhbgpAQCAtMTcxLDEzICsxNzUsMTQgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCisJc21wX21iKCk7CisKIAlpZiAoUjEwMDAwX0xMU0NfV0FSKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkiMToJbGwJJTEsICUyCQkjIF9fcmF3X3JlYWRfdW5sb2NrCVxuIgogCQkiCXN1YgklMSwgMQkJCQkJXG4iCiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgotCQkiCXN5bmMJCQkJCQlcbiIKIAkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApCiAJCTogIm0iIChydy0+bG9jaykKIAkJOiAibWVtb3J5Iik7CkBAIC0xODgsNyArMTkzLDcgQEAKIAkJIglzdWIJJTEsIDEJCQkJCVxuIgogCQkiCXNjCSUxLCAlMAkJCQkJXG4iCiAJCSIJYmVxegklMSwgMWIJCQkJCVxuIgotCQkiCSBzeW5jCQkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCiAJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKQogCQk6ICJtIiAocnctPmxvY2spCkBAIC0yMDgsNyArMjEzLDcgQEAKIAkJIgkgbHVpCSUxLCAweDgwMDAJCQkJXG4iCiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgotCQkiCSBzeW5jCQkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCiAJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKQogCQk6ICJtIiAocnctPmxvY2spCkBAIC0yMjEsMTggKzIyNiwyMiBAQAogCQkiCSBsdWkJJTEsIDB4ODAwMAkJCQlcbiIKIAkJIglzYwklMSwgJTAJCQkJCVxuIgogCQkiCWJlcXoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgc3luYwkJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgogCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCkKIAkJOiAibSIgKHJ3LT5sb2NrKQogCQk6ICJtZW1vcnkiKTsKIAl9CisKKwlzbXBfbWIoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQogeworCXNtcF9tYigpOworCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIglzeW5jCQkJIyBfX3Jhd193cml0ZV91bmxvY2sJXG4iCisJIgkJCQkjIF9fcmF3X3dyaXRlX3VubG9jawlcbiIKIAkiCXN3CSQwLCAlMAkJCQkJXG4iCiAJOiAiPW0iIChydy0+bG9jaykKIAk6ICJtIiAocnctPmxvY2spCkBAIC0yNTIsMTEgKzI2MSwxMCBAQAogCQkiCWJuZXoJJTEsIDJmCQkJCQlcbiIKIAkJIgkgYWRkdQklMSwgMQkJCQkJXG4iCiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKLQkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCSBzeW5jCQkJCQkJXG4iCi0jZW5kaWYKKwkJIgliZXF6bAklMSwgMWIJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKKwkJX19XRUFLX09SREVSSU5HX01CCiAJCSIJbGkJJTIsIDEJCQkJCVxuIgogCQkiMjoJCQkJCQkJXG4iCiAJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKSwgIj0mciIgKHJldCkKQEAgLTI3MSwxMCArMjc5LDkgQEAKIAkJIgkgYWRkdQklMSwgMQkJCQkJXG4iCiAJCSIJc2MJJTEsICUwCQkJCQlcbiIKIAkJIgliZXF6CSUxLCAxYgkJCQkJXG4iCisJCSIJIG5vcAkJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCSBzeW5jCQkJCQkJXG4iCi0jZW5kaWYKKwkJX19XRUFLX09SREVSSU5HX01CCiAJCSIJbGkJJTIsIDEJCQkJCVxuIgogCQkiMjoJCQkJCQkJXG4iCiAJCTogIj1tIiAocnctPmxvY2spLCAiPSZyIiAodG1wKSwgIj0mciIgKHJldCkKQEAgLTI5OSw3ICszMDYsOCBAQAogCQkiCSBsdWkJJTEsIDB4ODAwMAkJCQlcbiIKIAkJIglzYwklMSwgJTAJCQkJCVxuIgogCQkiCWJlcXpsCSUxLCAxYgkJCQkJXG4iCi0JCSIJIHN5bmMJCQkJCQlcbiIKKwkJIgkgbm9wCQkJCQkJXG4iCisJCV9fV0VBS19PUkRFUklOR19NQgogCQkiCWxpCSUyLCAxCQkJCQlcbiIKIAkJIgkuc2V0CXJlb3JkZXIJCQkJCVxuIgogCQkiMjoJCQkJCQkJXG4iCkBAIC0zMTUsNyArMzIzLDggQEAKIAkJIglsdWkJJTEsIDB4ODAwMAkJCQlcbiIKIAkJIglzYwklMSwgJTAJCQkJCVxuIgogCQkiCWJlcXoJJTEsIDFiCQkJCQlcbiIKLQkJIgkgc3luYwkJCQkJCVxuIgorCQkiCSBub3AJCQkJCQlcbiIKKwkJX19XRUFLX09SREVSSU5HX01CCiAJCSIJbGkJJTIsIDEJCQkJCVxuIgogCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCiAJCSIyOgkJCQkJCQlcbiIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCmluZGV4IGRjYjQ3MDEuLjVlMTI4OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaApAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDIwMDMgYnkgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMjAwMywgMDYgYnkgUmFsZiBCYWVjaGxlCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYgYnkgUGF1bCBNLiBBbnRvaW5lCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcwogICogS2V2aW4gRC4gS2lzc2VsbCwga2V2aW5rQG1pcHMub3JnIGFuZCBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KQEAgLTE2LDEzMiArMTYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgogCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgogI2luY2x1ZGUgPGFzbS9kc3AuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3dhci5oPgogCi0vKgotICogcmVhZF9iYXJyaWVyX2RlcGVuZHMgLSBGbHVzaCBhbGwgcGVuZGluZyByZWFkcyB0aGF0IHN1YnNlcXVlbnRzIHJlYWRzCi0gKiBkZXBlbmQgb24uCi0gKgotICogTm8gZGF0YS1kZXBlbmRlbnQgcmVhZHMgZnJvbSBtZW1vcnktbGlrZSByZWdpb25zIGFyZSBldmVyIHJlb3JkZXJlZAotICogb3ZlciB0aGlzIGJhcnJpZXIuICBBbGwgcmVhZHMgcHJlY2VkaW5nIHRoaXMgcHJpbWl0aXZlIGFyZSBndWFyYW50ZWVkCi0gKiB0byBhY2Nlc3MgbWVtb3J5IChidXQgbm90IG5lY2Vzc2FyaWx5IG90aGVyIENQVXMnIGNhY2hlcykgYmVmb3JlIGFueQotICogcmVhZHMgZm9sbG93aW5nIHRoaXMgcHJpbWl0aXZlIHRoYXQgZGVwZW5kIG9uIHRoZSBkYXRhIHJldHVybiBieQotICogYW55IG9mIHRoZSBwcmVjZWRpbmcgcmVhZHMuICBUaGlzIHByaW1pdGl2ZSBpcyBtdWNoIGxpZ2h0ZXIgd2VpZ2h0IHRoYW4KLSAqIHJtYigpIG9uIG1vc3QgQ1BVcywgYW5kIGlzIG5ldmVyIGhlYXZpZXIgd2VpZ2h0IHRoYW4gaXMKLSAqIHJtYigpLgotICoKLSAqIFRoZXNlIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZSByZXNwZWN0ZWQgYnkgYm90aCB0aGUgbG9jYWwgQ1BVCi0gKiBhbmQgdGhlIGNvbXBpbGVyLgotICoKLSAqIE9yZGVyaW5nIGlzIG5vdCBndWFyYW50ZWVkIGJ5IGFueXRoaW5nIG90aGVyIHRoYW4gdGhlc2UgcHJpbWl0aXZlcywKLSAqIG5vdCBldmVuIGJ5IGRhdGEgZGVwZW5kZW5jaWVzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgotICogbWVtb3J5X2JhcnJpZXIoKSBmb3IgZXhhbXBsZXMgYW5kIFVSTHMgdG8gbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIGZvcmNlIG9yZGVyaW5nICh0aGUgaW5pdGlhbAotICogdmFsdWUgb2YgImEiIGlzIHplcm8sICJiIiBpcyBvbmUsIGFuZCAicCIgaXMgIiZhIik6Ci0gKgotICogPHByb2dyYW1saXN0aW5nPgotICoJQ1BVIDAJCQkJQ1BVIDEKLSAqCi0gKgliID0gMjsKLSAqCW1lbW9yeV9iYXJyaWVyKCk7Ci0gKglwID0gJmI7CQkJCXEgPSBwOwotICoJCQkJCXJlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0gKgkJCQkJZCA9ICpxOwotICogPC9wcm9ncmFtbGlzdGluZz4KLSAqCi0gKiBiZWNhdXNlIHRoZSByZWFkIG9mICIqcSIgZGVwZW5kcyBvbiB0aGUgcmVhZCBvZiAicCIgYW5kIHRoZXNlCi0gKiB0d28gcmVhZHMgYXJlIHNlcGFyYXRlZCBieSBhIHJlYWRfYmFycmllcl9kZXBlbmRzKCkuICBIb3dldmVyLAotICogdGhlIGZvbGxvd2luZyBjb2RlLCB3aXRoIHRoZSBzYW1lIGluaXRpYWwgdmFsdWVzIGZvciAiYSIgYW5kICJiIjoKLSAqCi0gKiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gKglDUFUgMAkJCQlDUFUgMQotICoKLSAqCWEgPSAyOwotICoJbWVtb3J5X2JhcnJpZXIoKTsKLSAqCWIgPSAzOwkJCQl5ID0gYjsKLSAqCQkJCQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotICoJCQkJCXggPSBhOwotICogPC9wcm9ncmFtbGlzdGluZz4KLSAqCi0gKiBkb2VzIG5vdCBlbmZvcmNlIG9yZGVyaW5nLCBzaW5jZSB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kgYmV0d2VlbgotICogdGhlIHJlYWQgb2YgImEiIGFuZCB0aGUgcmVhZCBvZiAiYiIuICBUaGVyZWZvcmUsIG9uIHNvbWUgQ1BVcywgc3VjaAotICogYXMgQWxwaGEsICJ5IiBjb3VsZCBiZSBzZXQgdG8gMyBhbmQgIngiIHRvIDAuICBVc2Ugcm1iKCkKLSAqIGluIGNhc2VzIGxpa2UgdGhpcyB3aGVyZSB0aGVyZSBhcmUgbm8gZGF0YSBkZXBlbmRlbmNpZXMuCi0gKi8KLQotI2RlZmluZSByZWFkX2JhcnJpZXJfZGVwZW5kcygpCWRvIHsgfSB3aGlsZSgwKQotCi0jaWZkZWYgQ09ORklHX0NQVV9IQVNfU1lOQwotI2RlZmluZSBfX3N5bmMoKQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJXAotCQkiLnNldAlwdXNoXG5cdCIJCVwKLQkJIi5zZXQJbm9yZW9yZGVyXG5cdCIJCVwKLQkJIi5zZXQJbWlwczJcblx0IgkJXAotCQkic3luY1xuXHQiCQkJXAotCQkiLnNldAlwb3AiCQkJXAotCQk6IC8qIG5vIG91dHB1dCAqLwkJXAotCQk6IC8qIG5vIGlucHV0ICovCQlcCi0JCTogIm1lbW9yeSIpCi0jZWxzZQotI2RlZmluZSBfX3N5bmMoKQlkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jZGVmaW5lIF9fZmFzdF9pb2IoKQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJXAotCQkiLnNldAlwdXNoXG5cdCIJCVwKLQkJIi5zZXQJbm9yZW9yZGVyXG5cdCIJCVwKLQkJImx3CSQwLCUwXG5cdCIJCVwKLQkJIm5vcFxuXHQiCQkJXAotCQkiLnNldAlwb3AiCQkJXAotCQk6IC8qIG5vIG91dHB1dCAqLwkJXAotCQk6ICJtIiAoKihpbnQgKilDS1NFRzEpCQlcCi0JCTogIm1lbW9yeSIpCi0KLSNkZWZpbmUgZmFzdF93bWIoKQlfX3N5bmMoKQotI2RlZmluZSBmYXN0X3JtYigpCV9fc3luYygpCi0jZGVmaW5lIGZhc3RfbWIoKQlfX3N5bmMoKQotI2RlZmluZSBmYXN0X2lvYigpCQkJCVwKLQlkbyB7CQkJCQlcCi0JCV9fc3luYygpOwkJCVwKLQkJX19mYXN0X2lvYigpOwkJCVwKLQl9IHdoaWxlICgwKQotCi0jaWZkZWYgQ09ORklHX0NQVV9IQVNfV0IKLQotI2luY2x1ZGUgPGFzbS93YmZsdXNoLmg+Ci0KLSNkZWZpbmUgd21iKCkJCWZhc3Rfd21iKCkKLSNkZWZpbmUgcm1iKCkJCWZhc3Rfcm1iKCkKLSNkZWZpbmUgbWIoKQkJd2JmbHVzaCgpCi0jZGVmaW5lIGlvYigpCQl3YmZsdXNoKCkKLQotI2Vsc2UgLyogIUNPTkZJR19DUFVfSEFTX1dCICovCi0KLSNkZWZpbmUgd21iKCkJCWZhc3Rfd21iKCkKLSNkZWZpbmUgcm1iKCkJCWZhc3Rfcm1iKCkKLSNkZWZpbmUgbWIoKQkJZmFzdF9tYigpCi0jZGVmaW5lIGlvYigpCQlmYXN0X2lvYigpCi0KLSNlbmRpZiAvKiAhQ09ORklHX0NQVV9IQVNfV0IgKi8KLQotI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgc21wX21iKCkJbWIoKQotI2RlZmluZSBzbXBfcm1iKCkJcm1iKCkKLSNkZWZpbmUgc21wX3dtYigpCXdtYigpCi0jZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCXJlYWRfYmFycmllcl9kZXBlbmRzKCkKLSNlbHNlCi0jZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCi0jZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgXAotZG8geyB2YXIgPSB2YWx1ZTsgbWIoKTsgfSB3aGlsZSAoMCkKIAogLyoKICAqIHN3aXRjaF90byhuKSBzaG91bGQgc3dpdGNoIHRhc2tzIHRvIHRhc2sgbnIgbiwgZmlyc3QKQEAgLTIxNyw5ICs5Niw2IEBACiAJCSIJLnNldAltaXBzMwkJCQkJXG4iCiAJCSIJc2MJJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6bAklMiwgMWIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmV0dmFsKSwgIj1tIiAoKm0pLCAiPSZyIiAoZHVtbXkpCiAJCTogIlIiICgqbSksICJKciIgKHZhbCkKQEAgLTIzNSw5ICsxMTEsNiBAQAogCQkiCS5zZXQJbWlwczMJCQkJCVxuIgogCQkiCXNjCSUyLCAlMQkJCQkJXG4iCiAJCSIJYmVxegklMiwgMWIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIgkuc2V0CW1pcHMwCQkJCQlcbiIKIAkJOiAiPSZyIiAocmV0dmFsKSwgIj1tIiAoKm0pLCAiPSZyIiAoZHVtbXkpCiAJCTogIlIiICgqbSksICJKciIgKHZhbCkKQEAgLTI1MSw2ICsxMjQsOCBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CS8qIGltcGxpZXMgbWVtb3J5IGJhcnJpZXIgICovCiAJfQogCisJc21wX21iKCk7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yNjgsOSArMTQzLDYgQEAKIAkJIgltb3ZlCSUyLCAlejQJCQkJCVxuIgogCQkiCXNjZAklMiwgJTEJCQkJCVxuIgogCQkiCWJlcXpsCSUyLCAxYgkJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXR2YWwpLCAiPW0iICgqbSksICI9JnIiIChkdW1teSkKIAkJOiAiUiIgKCptKSwgIkpyIiAodmFsKQpAQCAtMjg0LDkgKzE1Niw2IEBACiAJCSIJbW92ZQklMiwgJXo0CQkJCQlcbiIKIAkJIglzY2QJJTIsICUxCQkJCQlcbiIKIAkJIgliZXF6CSUyLCAxYgkJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiCS5zZXQJbWlwczAJCQkJCVxuIgogCQk6ICI9JnIiIChyZXR2YWwpLCAiPW0iICgqbSksICI9JnIiIChkdW1teSkKIAkJOiAiUiIgKCptKSwgIkpyIiAodmFsKQpAQCAtMzAwLDYgKzE2OSw4IEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJLyogaW1wbGllcyBtZW1vcnkgYmFycmllciAgKi8KIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXR2YWw7CiB9CiAjZWxzZQpAQCAtMzQ1LDkgKzIxNiw2IEBACiAJCSIJLnNldAltaXBzMwkJCQkJXG4iCiAJCSIJc2MJJDEsICUxCQkJCQlcbiIKIAkJIgliZXF6bAkkMSwgMWIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIjI6CQkJCQkJCVxuIgogCQkiCS5zZXQJcG9wCQkJCQlcbiIKIAkJOiAiPSZyIiAocmV0dmFsKSwgIj1SIiAoKm0pCkBAIC0zNjUsOSArMjMzLDYgQEAKIAkJIgkuc2V0CW1pcHMzCQkJCQlcbiIKIAkJIglzYwkkMSwgJTEJCQkJCVxuIgogCQkiCWJlcXoJJDEsIDFiCQkJCQlcbiIKLSNpZmRlZiBDT05GSUdfU01QCi0JCSIJc3luYwkJCQkJCVxuIgotI2VuZGlmCiAJCSIyOgkJCQkJCQlcbiIKIAkJIgkuc2V0CXBvcAkJCQkJXG4iCiAJCTogIj0mciIgKHJldHZhbCksICI9UiIgKCptKQpAQCAtMzgzLDYgKzI0OCw4IEBACiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJLyogaW1wbGllcyBtZW1vcnkgYmFycmllciAgKi8KIAl9CiAKKwlzbXBfbWIoKTsKKwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTM5Miw3ICsyNTksNyBAQAogewogCV9fdTY0IHJldHZhbDsKIAotCWlmIChjcHVfaGFzX2xsc2MpIHsKKwlpZiAoY3B1X2hhc19sbHNjICYmIFIxMDAwMF9MTFNDX1dBUikgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIgkuc2V0CXB1c2gJCQkJCVxuIgogCQkiCS5zZXQJbm9hdAkJCQkJXG4iCkBAIC00MDIsOSArMjY5LDYgQEAKIAkJIgltb3ZlCSQxLCAlejQJCQkJCVxuIgogCQkiCXNjZAkkMSwgJTEJCQkJCVxuIgogCQkiCWJlcXpsCSQxLCAxYgkJCQkJXG4iCi0jaWZkZWYgQ09ORklHX1NNUAotCQkiCXN5bmMJCQkJCQlcbiIKLSNlbmRpZgogCQkiMjoJCQkJCQkJXG4iCiAJCSIJLnNldAlwb3AJCQkJCVxuIgogCQk6ICI9JnIiIChyZXR2YWwpLCAiPVIiICgqbSkKQEAgLTQyMCw5ICsyODQsNiBAQAogCQkiCW1vdmUJJDEsICV6NAkJCQkJXG4iCiAJCSIJc2NkCSQxLCAlMQkJCQkJXG4iCiAJCSIJYmVxegkkMSwgMWIJCQkJCVxuIgotI2lmZGVmIENPTkZJR19TTVAKLQkJIglzeW5jCQkJCQkJXG4iCi0jZW5kaWYKIAkJIjI6CQkJCQkJCVxuIgogCQkiCS5zZXQJcG9wCQkJCQlcbiIKIAkJOiAiPSZyIiAocmV0dmFsKSwgIj1SIiAoKm0pCkBAIC00MzgsNiArMjk5LDggQEAKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwkvKiBpbXBsaWVzIG1lbW9yeSBiYXJyaWVyICAqLwogCX0KIAorCXNtcF9tYigpOworCiAJcmV0dXJuIHJldHZhbDsKIH0KICNlbHNlCkBAIC00NzIsMTQgKzMzNSw2IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBlYmFzZTsKIGV4dGVybiB2b2lkIHBlcl9jcHVfdHJhcF9pbml0KHZvaWQpOwogCi1leHRlcm4gTk9SRVRfVFlQRSB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICopOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWlmICh1bmxpa2VseSghdXNlcl9tb2RlKHJlZ3MpKSkKLQkJZGllKHN0ciwgcmVncyk7Ci19Ci0KIGV4dGVybiBpbnQgc3RvcF9hX2VuYWJsZWQ7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1taXBzL3Rlcm1iaXRzLmgKaW5kZXggYjYyZWM3Yy4uMGJiZTA3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdGVybWJpdHMuaApAQCAtMzAsNiArMzAsMTcgQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIJCSAwCQkvKiBJbnRlcnJ1cHQgY2hhcmFjdGVyIFtJU0lHXS4gICovCiAjZGVmaW5lIFZRVUlUCQkgMQkJLyogUXVpdCBjaGFyYWN0ZXIgW0lTSUddLiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdGltZS5oIGIvaW5jbHVkZS9hc20tbWlwcy90aW1lLmgKaW5kZXggMjg1MTJiYS4uYTYzMmNlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy90aW1lLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy90aW1lLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAKIGV4dGVybiBzcGlubG9ja190IHJ0Y19sb2NrOwogCkBAIC00NCwxMSArNDUsMTAgQEAKIGV4dGVybiB2b2lkICgqbWlwc190aW1lcl9hY2spKHZvaWQpOwogCiAvKgotICogSGlnaCBwcmVjaXNpb24gdGltZXIgZnVuY3Rpb25zLgotICogSWYgbWlwc19ocHRfcmVhZCBpcyBOVUxMLCBhbiBSNGstY29tcGF0aWJsZSB0aW1lciBzZXR1cCBpcyBhdHRlbXB0ZWQuCisgKiBIaWdoIHByZWNpc2lvbiB0aW1lciBjbG9ja3NvdXJjZS4KKyAqIElmIC5yZWFkIGlzIE5VTEwsIGFuIFI0ay1jb21wYXRpYmxlIHRpbWVyIHNldHVwIGlzIGF0dGVtcHRlZC4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCAoKm1pcHNfaHB0X3JlYWQpKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCptaXBzX2hwdF9pbml0KSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9taXBzOwogCiAvKgogICogdG9fdG0oKSBjb252ZXJ0cyBzeXN0ZW0gdGltZSBiYWNrIHRvICh5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCBzZWMpLgpAQCAtNTgsMTMgKzU4LDYgQEAKIGV4dGVybiB2b2lkIHRvX3RtKHVuc2lnbmVkIGxvbmcgdGltLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKTsKIAogLyoKLSAqIGRvX2dldHRpbWVvZmZzZXQoKS4gQnkgZGVmYXVsdCwgdGhpcyBmdW5jIHBvaW50ZXIgcG9pbnRzIHRvCi0gKiBkb19udWxsX2dldHRpbWVvZmZzZXQoKSwgd2hpY2ggbGVhZHMgdG8gdGhlIHNhbWUgcmVzb2x1dGlvbiBhcyBIWi4KLSAqIEhpZ2hlciByZXNvbHV0aW9uIHZlcnNpb25zIGFyZSBhdmFpbGFibGUsIHdoaWNoIGdpdmUgfjF1cyByZXNvbHV0aW9uLgotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyAoKmRvX2dldHRpbWVvZmZzZXQpKHZvaWQpOwotCi0vKgogICogaGlnaC1sZXZlbCB0aW1lciBpbnRlcnJ1cHQgcm91dGluZXMuCiAgKi8KIGV4dGVybiBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdHlwZXMuaAppbmRleCAyYjUyZTE4Li42M2ExM2M1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy90eXBlcy5oCkBAIC05MywxNiArOTMsNiBAQAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfdDsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0xCRAotdHlwZWRlZiB1NjQgc2VjdG9yX3Q7Ci0jZGVmaW5lIEhBVkVfU0VDVE9SX1QKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0xTRgotdHlwZWRlZiB1NjQgYmxrY250X3Q7Ci0jZGVmaW5lIEhBVkVfQkxLQ05UX1QKLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tbWlwcy91bmlzdGQuaAppbmRleCA2ODVjOTE0Li42OTZjZmYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdW5pc3RkLmgKQEAgLTMzMSwxNiArMzMxLDE5IEBACiAjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJCShfX05SX0xpbnV4ICsgMzA4KQogI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkJKF9fTlJfTGludXggKyAzMDkpCiAjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CQkoX19OUl9MaW51eCArIDMxMCkKKyNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkJKF9fTlJfTGludXggKyAzMTEpCisjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkJKF9fTlJfTGludXggKyAzMTIpCisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJCShfX05SX0xpbnV4ICsgMzEzKQogCiAvKgogICogT2Zmc2V0IG9mIHRoZSBsYXN0IExpbnV4IG8zMiBmbGF2b3VyZWQgc3lzY2FsbAogICovCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTMxMAorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkzMTMKIAogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJMzIgKi8KIAogI2RlZmluZSBfX05SX08zMl9MaW51eAkJCTQwMDAKLSNkZWZpbmUgX19OUl9PMzJfTGludXhfc3lzY2FsbHMJCTMxMAorI2RlZmluZSBfX05SX08zMl9MaW51eF9zeXNjYWxscwkJMzEzCiAKICNpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTY0CiAKQEAgLTYxOCwxNiArNjIxLDE5IEBACiAjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJCShfX05SX0xpbnV4ICsgMjY3KQogI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkJKF9fTlJfTGludXggKyAyNjgpCiAjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CQkoX19OUl9MaW51eCArIDI2OSkKKyNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkJKF9fTlJfTGludXggKyAyNzApCisjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkJKF9fTlJfTGludXggKyAyNzEpCisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJCShfX05SX0xpbnV4ICsgMjcyKQogCiAvKgogICogT2Zmc2V0IG9mIHRoZSBsYXN0IExpbnV4IDY0LWJpdCBmbGF2b3VyZWQgc3lzY2FsbAogICovCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTI2OQorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkyNzIKIAogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJNjQgKi8KIAogI2RlZmluZSBfX05SXzY0X0xpbnV4CQkJNTAwMAotI2RlZmluZSBfX05SXzY0X0xpbnV4X3N5c2NhbGxzCQkyNjkKKyNkZWZpbmUgX19OUl82NF9MaW51eF9zeXNjYWxscwkJMjcyCiAKICNpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX05BQkkzMgogCkBAIC05MDksMjgzICs5MTUsMjUgQEAKICNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkJKF9fTlJfTGludXggKyAyNzEpCiAjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CQkoX19OUl9MaW51eCArIDI3MikKICNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJCShfX05SX0xpbnV4ICsgMjczKQorI2RlZmluZSBfX05SX2tleGVjX2xvYWQJCQkoX19OUl9MaW51eCArIDI3NCkKKyNkZWZpbmUgX19OUl9nZXRjcHUJCQkoX19OUl9MaW51eCArIDI3NSkKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkJKF9fTlJfTGludXggKyAyNzYpCiAKIC8qCiAgKiBPZmZzZXQgb2YgdGhlIGxhc3QgTjMyIGZsYXZvdXJlZCBzeXNjYWxsCiAgKi8KLSNkZWZpbmUgX19OUl9MaW51eF9zeXNjYWxscwkJMjczCisjZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTI3NgogCiAjZW5kaWYgLyogX01JUFNfU0lNID09IF9NSVBTX1NJTV9OQUJJMzIgKi8KIAogI2RlZmluZSBfX05SX04zMl9MaW51eAkJCTYwMDAKLSNkZWZpbmUgX19OUl9OMzJfTGludXhfc3lzY2FsbHMJCTI3MworI2RlZmluZSBfX05SX04zMl9MaW51eF9zeXNjYWxscwkJMjc2CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLS8qIFhYWCAtIF9mb28gbmVlZHMgdG8gYmUgX19mb28sIHdoaWxlIF9fTlJfYmFyIGNvdWxkIGJlIF9OUl9iYXIuICovCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLG5hbWUpIFwKLXR5cGUgbmFtZSh2b2lkKSBcCi17IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTMgYXNtKCIkNyIpOyBcCi0JdW5zaWduZWQgbG9uZyBfX3YwOyBcCi0JXAotCV9fYXNtX18gdm9sYXRpbGUgKCBcCi0JIi5zZXRcdG5vcmVvcmRlclxuXHQiIFwKLQkibGlcdCQyLCAlMlx0XHRcdCMgIiAjbmFtZSAiXG5cdCIgXAotCSJzeXNjYWxsXG5cdCIgXAotCSJtb3ZlXHQlMCwgJDJcblx0IiBcCi0JIi5zZXRcdHJlb3JkZXIiIFwKLQk6ICI9JnIiIChfX3YwKSwgIj1yIiAoX19hMykgXAotCTogImkiIChfX05SXyMjbmFtZSkgXAotCTogIiQyIiwgIiQ4IiwgIiQ5IiwgIiQxMCIsICIkMTEiLCAiJDEyIiwgIiQxMyIsICIkMTQiLCAiJDE1IiwgIiQyNCIsIFwKLQkgICJtZW1vcnkiKTsgXAotCVwKLQlpZiAoX19hMyA9PSAwKSBcCi0JCXJldHVybiAodHlwZSkgX192MDsgXAotCWVycm5vID0gX192MDsgXAotCXJldHVybiAodHlwZSkgLTE7IFwKLX0KLQotLyoKLSAqIERBTkdFUjogVGhpcyBtYWNybyBpc24ndCB1c2FibGUgZm9yIHRoZSBwaXBlKDIpIGNhbGwKLSAqIHdoaWNoIGhhcyBhIHVudXN1YWwgcmV0dXJuIGNvbnZlbnRpb24uCi0gKi8KLSNkZWZpbmUgX3N5c2NhbGwxKHR5cGUsbmFtZSxhdHlwZSxhKSBcCi10eXBlIG5hbWUoYXR5cGUgYSkgXAoteyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EwIGFzbSgiJDQiKSA9ICh1bnNpZ25lZCBsb25nKSBhOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EzIGFzbSgiJDciKTsgXAotCXVuc2lnbmVkIGxvbmcgX192MDsgXAotCVwKLQlfX2FzbV9fIHZvbGF0aWxlICggXAotCSIuc2V0XHRub3Jlb3JkZXJcblx0IiBcCi0JImxpXHQkMiwgJTNcdFx0XHQjICIgI25hbWUgIlxuXHQiIFwKLQkic3lzY2FsbFxuXHQiIFwKLQkibW92ZVx0JTAsICQyXG5cdCIgXAotCSIuc2V0XHRyZW9yZGVyIiBcCi0JOiAiPSZyIiAoX192MCksICI9ciIgKF9fYTMpIFwKLQk6ICJyIiAoX19hMCksICJpIiAoX19OUl8jI25hbWUpIFwKLQk6ICIkMiIsICIkOCIsICIkOSIsICIkMTAiLCAiJDExIiwgIiQxMiIsICIkMTMiLCAiJDE0IiwgIiQxNSIsICIkMjQiLCBcCi0JICAibWVtb3J5Iik7IFwKLQlcCi0JaWYgKF9fYTMgPT0gMCkgXAotCQlyZXR1cm4gKHR5cGUpIF9fdjA7IFwKLQllcnJubyA9IF9fdjA7IFwKLQlyZXR1cm4gKHR5cGUpIC0xOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwyKHR5cGUsbmFtZSxhdHlwZSxhLGJ0eXBlLGIpIFwKLXR5cGUgbmFtZShhdHlwZSBhLCBidHlwZSBiKSBcCi17IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTAgYXNtKCIkNCIpID0gKHVuc2lnbmVkIGxvbmcpIGE7IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTEgYXNtKCIkNSIpID0gKHVuc2lnbmVkIGxvbmcpIGI7IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTMgYXNtKCIkNyIpOyBcCi0JdW5zaWduZWQgbG9uZyBfX3YwOyBcCi0JXAotCV9fYXNtX18gdm9sYXRpbGUgKCBcCi0JIi5zZXRcdG5vcmVvcmRlclxuXHQiIFwKLQkibGlcdCQyLCAlNFx0XHRcdCMgIiAjbmFtZSAiXG5cdCIgXAotCSJzeXNjYWxsXG5cdCIgXAotCSJtb3ZlXHQlMCwgJDJcblx0IiBcCi0JIi5zZXRcdHJlb3JkZXIiIFwKLQk6ICI9JnIiIChfX3YwKSwgIj1yIiAoX19hMykgXAotCTogInIiIChfX2EwKSwgInIiIChfX2ExKSwgImkiIChfX05SXyMjbmFtZSkgXAotCTogIiQyIiwgIiQ4IiwgIiQ5IiwgIiQxMCIsICIkMTEiLCAiJDEyIiwgIiQxMyIsICIkMTQiLCAiJDE1IiwgIiQyNCIsIFwKLQkgICJtZW1vcnkiKTsgXAotCVwKLQlpZiAoX19hMyA9PSAwKSBcCi0JCXJldHVybiAodHlwZSkgX192MDsgXAotCWVycm5vID0gX192MDsgXAotCXJldHVybiAodHlwZSkgLTE7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDModHlwZSxuYW1lLGF0eXBlLGEsYnR5cGUsYixjdHlwZSxjKSBcCi10eXBlIG5hbWUoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYykgXAoteyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EwIGFzbSgiJDQiKSA9ICh1bnNpZ25lZCBsb25nKSBhOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2ExIGFzbSgiJDUiKSA9ICh1bnNpZ25lZCBsb25nKSBiOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EyIGFzbSgiJDYiKSA9ICh1bnNpZ25lZCBsb25nKSBjOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EzIGFzbSgiJDciKTsgXAotCXVuc2lnbmVkIGxvbmcgX192MDsgXAotCVwKLQlfX2FzbV9fIHZvbGF0aWxlICggXAotCSIuc2V0XHRub3Jlb3JkZXJcblx0IiBcCi0JImxpXHQkMiwgJTVcdFx0XHQjICIgI25hbWUgIlxuXHQiIFwKLQkic3lzY2FsbFxuXHQiIFwKLQkibW92ZVx0JTAsICQyXG5cdCIgXAotCSIuc2V0XHRyZW9yZGVyIiBcCi0JOiAiPSZyIiAoX192MCksICI9ciIgKF9fYTMpIFwKLQk6ICJyIiAoX19hMCksICJyIiAoX19hMSksICJyIiAoX19hMiksICJpIiAoX19OUl8jI25hbWUpIFwKLQk6ICIkMiIsICIkOCIsICIkOSIsICIkMTAiLCAiJDExIiwgIiQxMiIsICIkMTMiLCAiJDE0IiwgIiQxNSIsICIkMjQiLCBcCi0JICAibWVtb3J5Iik7IFwKLQlcCi0JaWYgKF9fYTMgPT0gMCkgXAotCQlyZXR1cm4gKHR5cGUpIF9fdjA7IFwKLQllcnJubyA9IF9fdjA7IFwKLQlyZXR1cm4gKHR5cGUpIC0xOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsbmFtZSxhdHlwZSxhLGJ0eXBlLGIsY3R5cGUsYyxkdHlwZSxkKSBcCi10eXBlIG5hbWUoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCkgXAoteyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EwIGFzbSgiJDQiKSA9ICh1bnNpZ25lZCBsb25nKSBhOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2ExIGFzbSgiJDUiKSA9ICh1bnNpZ25lZCBsb25nKSBiOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EyIGFzbSgiJDYiKSA9ICh1bnNpZ25lZCBsb25nKSBjOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EzIGFzbSgiJDciKSA9ICh1bnNpZ25lZCBsb25nKSBkOyBcCi0JdW5zaWduZWQgbG9uZyBfX3YwOyBcCi0JXAotCV9fYXNtX18gdm9sYXRpbGUgKCBcCi0JIi5zZXRcdG5vcmVvcmRlclxuXHQiIFwKLQkibGlcdCQyLCAlNVx0XHRcdCMgIiAjbmFtZSAiXG5cdCIgXAotCSJzeXNjYWxsXG5cdCIgXAotCSJtb3ZlXHQlMCwgJDJcblx0IiBcCi0JIi5zZXRcdHJlb3JkZXIiIFwKLQk6ICI9JnIiIChfX3YwKSwgIityIiAoX19hMykgXAotCTogInIiIChfX2EwKSwgInIiIChfX2ExKSwgInIiIChfX2EyKSwgImkiIChfX05SXyMjbmFtZSkgXAotCTogIiQyIiwgIiQ4IiwgIiQ5IiwgIiQxMCIsICIkMTEiLCAiJDEyIiwgIiQxMyIsICIkMTQiLCAiJDE1IiwgIiQyNCIsIFwKLQkgICJtZW1vcnkiKTsgXAotCVwKLQlpZiAoX19hMyA9PSAwKSBcCi0JCXJldHVybiAodHlwZSkgX192MDsgXAotCWVycm5vID0gX192MDsgXAotCXJldHVybiAodHlwZSkgLTE7IFwKLX0KLQotI2lmIChfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTMyKQotCi0vKgotICogVXNpbmcgdGhvc2UgbWVhbnMgeW91ciBicmFpbiBuZWVkcyBtb3JlIHRoYW4gYW4gb2lsIGNoYW5nZSA7LSkKLSAqLwotCi0jZGVmaW5lIF9zeXNjYWxsNSh0eXBlLG5hbWUsYXR5cGUsYSxidHlwZSxiLGN0eXBlLGMsZHR5cGUsZCxldHlwZSxlKSBcCi10eXBlIG5hbWUoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCwgZXR5cGUgZSkgXAoteyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EwIGFzbSgiJDQiKSA9ICh1bnNpZ25lZCBsb25nKSBhOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2ExIGFzbSgiJDUiKSA9ICh1bnNpZ25lZCBsb25nKSBiOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EyIGFzbSgiJDYiKSA9ICh1bnNpZ25lZCBsb25nKSBjOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EzIGFzbSgiJDciKSA9ICh1bnNpZ25lZCBsb25nKSBkOyBcCi0JdW5zaWduZWQgbG9uZyBfX3YwOyBcCi0JXAotCV9fYXNtX18gdm9sYXRpbGUgKCBcCi0JIi5zZXRcdG5vcmVvcmRlclxuXHQiIFwKLQkibHdcdCQyLCAlNlxuXHQiIFwKLQkic3VidVx0JDI5LCAzMlxuXHQiIFwKLQkic3dcdCQyLCAxNigkMjkpXG5cdCIgXAotCSJsaVx0JDIsICU1XHRcdFx0IyAiICNuYW1lICJcblx0IiBcCi0JInN5c2NhbGxcblx0IiBcCi0JIm1vdmVcdCUwLCAkMlxuXHQiIFwKLQkiYWRkaXVcdCQyOSwgMzJcblx0IiBcCi0JIi5zZXRcdHJlb3JkZXIiIFwKLQk6ICI9JnIiIChfX3YwKSwgIityIiAoX19hMykgXAotCTogInIiIChfX2EwKSwgInIiIChfX2ExKSwgInIiIChfX2EyKSwgImkiIChfX05SXyMjbmFtZSksIFwKLQkgICJtIiAoKHVuc2lnbmVkIGxvbmcpZSkgXAotCTogIiQyIiwgIiQ4IiwgIiQ5IiwgIiQxMCIsICIkMTEiLCAiJDEyIiwgIiQxMyIsICIkMTQiLCAiJDE1IiwgIiQyNCIsIFwKLQkgICJtZW1vcnkiKTsgXAotCVwKLQlpZiAoX19hMyA9PSAwKSBcCi0JCXJldHVybiAodHlwZSkgX192MDsgXAotCWVycm5vID0gX192MDsgXAotCXJldHVybiAodHlwZSkgLTE7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDYodHlwZSxuYW1lLGF0eXBlLGEsYnR5cGUsYixjdHlwZSxjLGR0eXBlLGQsZXR5cGUsZSxmdHlwZSxmKSBcCi10eXBlIG5hbWUoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCwgZXR5cGUgZSwgZnR5cGUgZikgXAoteyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EwIGFzbSgiJDQiKSA9ICh1bnNpZ25lZCBsb25nKSBhOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2ExIGFzbSgiJDUiKSA9ICh1bnNpZ25lZCBsb25nKSBiOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EyIGFzbSgiJDYiKSA9ICh1bnNpZ25lZCBsb25nKSBjOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EzIGFzbSgiJDciKSA9ICh1bnNpZ25lZCBsb25nKSBkOyBcCi0JdW5zaWduZWQgbG9uZyBfX3YwOyBcCi0JXAotCV9fYXNtX18gdm9sYXRpbGUgKCBcCi0JIi5zZXRcdG5vcmVvcmRlclxuXHQiIFwKLQkibHdcdCQyLCAlNlxuXHQiIFwKLQkibHdcdCQ4LCAlN1xuXHQiIFwKLQkic3VidVx0JDI5LCAzMlxuXHQiIFwKLQkic3dcdCQyLCAxNigkMjkpXG5cdCIgXAotCSJzd1x0JDgsIDIwKCQyOSlcblx0IiBcCi0JImxpXHQkMiwgJTVcdFx0XHQjICIgI25hbWUgIlxuXHQiIFwKLQkic3lzY2FsbFxuXHQiIFwKLQkibW92ZVx0JTAsICQyXG5cdCIgXAotCSJhZGRpdVx0JDI5LCAzMlxuXHQiIFwKLQkiLnNldFx0cmVvcmRlciIgXAotCTogIj0mciIgKF9fdjApLCAiK3IiIChfX2EzKSBcCi0JOiAiciIgKF9fYTApLCAiciIgKF9fYTEpLCAiciIgKF9fYTIpLCAiaSIgKF9fTlJfIyNuYW1lKSwgXAotCSAgIm0iICgodW5zaWduZWQgbG9uZyllKSwgIm0iICgodW5zaWduZWQgbG9uZylmKSBcCi0JOiAiJDIiLCAiJDgiLCAiJDkiLCAiJDEwIiwgIiQxMSIsICIkMTIiLCAiJDEzIiwgIiQxNCIsICIkMTUiLCAiJDI0IiwgXAotCSAgIm1lbW9yeSIpOyBcCi0JXAotCWlmIChfX2EzID09IDApIFwKLQkJcmV0dXJuICh0eXBlKSBfX3YwOyBcCi0JZXJybm8gPSBfX3YwOyBcCi0JcmV0dXJuICh0eXBlKSAtMTsgXAotfQotCi0jZW5kaWYgLyogKF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJMzIpICovCi0KLSNpZiAoX01JUFNfU0lNID09IF9NSVBTX1NJTV9OQUJJMzIpIHx8IChfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTY0KQotCi0jZGVmaW5lIF9zeXNjYWxsNSh0eXBlLG5hbWUsYXR5cGUsYSxidHlwZSxiLGN0eXBlLGMsZHR5cGUsZCxldHlwZSxlKSBcCi10eXBlIG5hbWUgKGF0eXBlIGEsYnR5cGUgYixjdHlwZSBjLGR0eXBlIGQsZXR5cGUgZSkgXAoteyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EwIGFzbSgiJDQiKSA9ICh1bnNpZ25lZCBsb25nKSBhOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2ExIGFzbSgiJDUiKSA9ICh1bnNpZ25lZCBsb25nKSBiOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EyIGFzbSgiJDYiKSA9ICh1bnNpZ25lZCBsb25nKSBjOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2EzIGFzbSgiJDciKSA9ICh1bnNpZ25lZCBsb25nKSBkOyBcCi0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX2E0IGFzbSgiJDgiKSA9ICh1bnNpZ25lZCBsb25nKSBlOyBcCi0JdW5zaWduZWQgbG9uZyBfX3YwOyBcCi0JXAotCV9fYXNtX18gdm9sYXRpbGUgKCBcCi0JIi5zZXRcdG5vcmVvcmRlclxuXHQiIFwKLQkibGlcdCQyLCAlNlx0XHRcdCMgIiAjbmFtZSAiXG5cdCIgXAotCSJzeXNjYWxsXG5cdCIgXAotCSJtb3ZlXHQlMCwgJDJcblx0IiBcCi0JIi5zZXRcdHJlb3JkZXIiIFwKLQk6ICI9JnIiIChfX3YwKSwgIityIiAoX19hMykgXAotCTogInIiIChfX2EwKSwgInIiIChfX2ExKSwgInIiIChfX2EyKSwgInIiIChfX2E0KSwgImkiIChfX05SXyMjbmFtZSkgXAotCTogIiQyIiwgIiQ5IiwgIiQxMCIsICIkMTEiLCAiJDEyIiwgIiQxMyIsICIkMTQiLCAiJDE1IiwgIiQyNCIsIFwKLQkgICJtZW1vcnkiKTsgXAotCVwKLQlpZiAoX19hMyA9PSAwKSBcCi0JCXJldHVybiAodHlwZSkgX192MDsgXAotCWVycm5vID0gX192MDsgXAotCXJldHVybiAodHlwZSkgLTE7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDYodHlwZSxuYW1lLGF0eXBlLGEsYnR5cGUsYixjdHlwZSxjLGR0eXBlLGQsZXR5cGUsZSxmdHlwZSxmKSBcCi10eXBlIG5hbWUgKGF0eXBlIGEsYnR5cGUgYixjdHlwZSBjLGR0eXBlIGQsZXR5cGUgZSxmdHlwZSBmKSBcCi17IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTAgYXNtKCIkNCIpID0gKHVuc2lnbmVkIGxvbmcpIGE7IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTEgYXNtKCIkNSIpID0gKHVuc2lnbmVkIGxvbmcpIGI7IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTIgYXNtKCIkNiIpID0gKHVuc2lnbmVkIGxvbmcpIGM7IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTMgYXNtKCIkNyIpID0gKHVuc2lnbmVkIGxvbmcpIGQ7IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTQgYXNtKCIkOCIpID0gKHVuc2lnbmVkIGxvbmcpIGU7IFwKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fYTUgYXNtKCIkOSIpID0gKHVuc2lnbmVkIGxvbmcpIGY7IFwKLQl1bnNpZ25lZCBsb25nIF9fdjA7IFwKLQlcCi0JX19hc21fXyB2b2xhdGlsZSAoIFwKLQkiLnNldFx0bm9yZW9yZGVyXG5cdCIgXAotCSJsaVx0JDIsICU3XHRcdFx0IyAiICNuYW1lICJcblx0IiBcCi0JInN5c2NhbGxcblx0IiBcCi0JIm1vdmVcdCUwLCAkMlxuXHQiIFwKLQkiLnNldFx0cmVvcmRlciIgXAotCTogIj0mciIgKF9fdjApLCAiK3IiIChfX2EzKSBcCi0JOiAiciIgKF9fYTApLCAiciIgKF9fYTEpLCAiciIgKF9fYTIpLCAiciIgKF9fYTQpLCAiciIgKF9fYTUpLCBcCi0JICAiaSIgKF9fTlJfIyNuYW1lKSBcCi0JOiAiJDIiLCAiJDkiLCAiJDEwIiwgIiQxMSIsICIkMTIiLCAiJDEzIiwgIiQxNCIsICIkMTUiLCAiJDI0IiwgXAotCSAgIm1lbW9yeSIpOyBcCi0JXAotCWlmIChfX2EzID09IDApIFwKLQkJcmV0dXJuICh0eXBlKSBfX3YwOyBcCi0JZXJybm8gPSBfX3YwOyBcCi0JcmV0dXJuICh0eXBlKSAtMTsgXAotfQotCi0jZW5kaWYgLyogKF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fTkFCSTMyKSB8fCAoX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkk2NCkgKi8KLQotCisjZGVmaW5lIF9fQVJDSF9PTUlUX0NPTVBBVF9TWVNfR0VUREVOVFM2NAogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdnI0MXh4L3ZyNDF4eC5oIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnI0MXh4LmgKaW5kZXggZGQzZWIzZC4uODhiNDkyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnI0MXh4LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy92cjQxeHgvdnI0MXh4LmgKQEAgLTc1LDcgKzc1LDcgQEAKICAqIEludGVycnVwdCBDb250cm9sIFVuaXQKICAqLwogZXh0ZXJuIGludCB2cjQxeHhfc2V0X2ludGFzc2lnbih1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBjaGFyIGludGFzc2lnbik7Ci1leHRlcm4gaW50IGNhc2NhZGVfaXJxKHVuc2lnbmVkIGludCBpcnEsIGludCAoKmdldF9pcnEpKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKikpOworZXh0ZXJuIGludCBjYXNjYWRlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgKCpnZXRfaXJxKSh1bnNpZ25lZCBpbnQpKTsKIAogI2RlZmluZSBQSVVJTlRfQ09NTUFORAkJMHgwMDQwCiAjZGVmaW5lIFBJVUlOVF9EQVRBCQkweDAwMjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvd2FyLmggYi9pbmNsdWRlL2FzbS1taXBzL3dhci5oCmluZGV4IDNhYzE0NmMuLjEzYTM1MDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvd2FyLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy93YXIuaApAQCAtNzYsNyArNzYsNyBAQAogLyoKICAqIEJ1dCB0aGUgUk0yMDBDIHNlZW1zIHRvIGhhdmUgYmVlbiBzaGlwcGVkIG9ubHkgd2l0aCBWMi4wIFI0NjAwcwogICovCi0jaWZkZWYgQ09ORklHX1NOSV9STTIwMF9QQ0kKKyNpZmRlZiBDT05GSUdfU05JX1JNCiAKICNkZWZpbmUgUjQ2MDBfVjJfSElUX0NBQ0hFT1BfV0FSCTEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9jYWNoZWZsdXNoLmgKaW5kZXggMmJjNDFmMi4uYWVkYjA1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvY2FjaGVmbHVzaC5oCkBAIC0xNSw2ICsxNSw4IEBACiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKSBmbHVzaF9jYWNoZV9hbGxfbG9jYWwoKQogI2VuZGlmCiAKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKSBmbHVzaF9jYWNoZV9tbShtbSkKKwogI2RlZmluZSBmbHVzaF9rZXJuZWxfZGNhY2hlX3JhbmdlKHN0YXJ0LHNpemUpIFwKIAlmbHVzaF9rZXJuZWxfZGNhY2hlX3JhbmdlX2FzbSgoc3RhcnQpLCAoc3RhcnQpKyhzaXplKSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NoZWNrc3VtLmgKaW5kZXggMjI5Y2I1Ni4uY2MzZWMxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NoZWNrc3VtLmgKQEAgLTE1LDcgKzE1LDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICosIGludCwgX193c3VtKTsKIAogLyoKICAqIFRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdCBjaGVja3N1bXMuCkBAIC0yMywxNSArMjMsMTQgQEAKICAqIEhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLAotCQkJCQkgICAgICBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqLCB2b2lkICosIGludCwgX193c3VtKTsKIAogLyoKICAqIHRoaXMgaXMgYSBuZXcgdmVyc2lvbiBvZiB0aGUgYWJvdmUgdGhhdCByZWNvcmRzIGVycm9ycyBpdCBmaW5kcyBpbiAqZXJycCwKICAqIGJ1dCBjb250aW51ZXMgYW5kIHplcm9zIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSwgaW50ICplcnJwKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsCisJCXZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJwKTsKIAogLyoKICAqCU9wdGltaXplZCBmb3IgSVAgaGVhZGVycywgd2hpY2ggYWx3YXlzIGNoZWNrc3VtIG9uIDQgb2N0ZXQgYm91bmRhcmllcy4KQEAgLTM5LDExICszOCwxMCBAQAogICoJV3JpdHRlbiBieSBSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4sIGFuZCB0aGVuIG11Y2tlZCB3aXRoIGJ5CiAgKglMYU1vbnQgSm9uZXMgPGxhbW9udEBkZWJpYW4ub3JnPgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLAotCQkJCQkgIHVuc2lnbmVkIGludCBpaGwpIHsKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorewogCXVuc2lnbmVkIGludCBzdW07CiAKLQogCV9fYXNtX18gX192b2xhdGlsZV9fICgKICIJbGR3cyxtYQkJNCglMSksICUwXG4iCiAiCWFkZGliLDw9CS00LCAlMiwgMmZcbiIKQEAgLTY5LDI3ICs2NywyNyBAQAogCTogIjEiIChpcGgpLCAiMiIgKGlobCkKIAk6ICJyMTkiLCAicjIwIiwgInIyMSIgKTsKIAotCXJldHVybihzdW0pOworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKIH0KIAogLyoKICAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gY3N1bSkKIHsKKwl1MzIgc3VtID0gKF9fZm9yY2UgdTMyKWNzdW07CiAJLyogYWRkIHRoZSBzd2FwcGVkIHR3byAxNi1iaXQgaGFsdmVzIG9mIHN1bSwKIAkgICBhIHBvc3NpYmxlIGNhcnJ5IGZyb20gYWRkaW5nIHRoZSB0d28gMTYtYml0IGhhbHZlcywKIAkgICB3aWxsIGNhcnJ5IGZyb20gdGhlIGxvd2VyIGhhbGYgaW50byB0aGUgdXBwZXIgaGFsZiwKIAkgICBnaXZpbmcgdXMgdGhlIGNvcnJlY3Qgc3VtIGluIHRoZSB1cHBlciBoYWxmLiAqLwogCXN1bSArPSAoc3VtIDw8IDE2KSArIChzdW0gPj4gMTYpOwotCXJldHVybiAofnN1bSkgPj4gMTY7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpKH5zdW0gPj4gMTYpOwogfQogIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHN1bSkgCisJCQkJCSAgICAgICBfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJIglhZGQgICUxLCAlMCwgJTBcbiIKQEAgLTk3LDE5ICs5NSwxOCBAQAogCSIJYWRkYyAlMywgJTAsICUwXG4iCiAJIglhZGRjICUlcjAsICUwLCAlMFxuIgogCQk6ICI9ciIgKHN1bSkKLQkJOiAiciIgKGRhZGRyKSwgInIiKHNhZGRyKSwgInIiKChwcm90bzw8MTYpK2xlbiksICIwIihzdW0pKTsKLSAgICByZXR1cm4gc3VtOworCQk6ICJyIiAoZGFkZHIpLCAiciIoc2FkZHIpLCAiciIocHJvdG8rbGVuKSwgIjAiKHN1bSkpOworCXJldHVybiBzdW07CiB9CiAKIC8qCiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pIAorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xMTgsMTcgKzExNSwxNyBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWYsIGludCBsZW4pIHsKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQorewogCSByZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmLCBsZW4sIDApKTsKIH0KIAogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgICAgIF9fdTE2IGxlbiwKLQkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pIAorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCSAgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCiAKQEAgLTE5Myw5ICsxOTAsOSBAQAogICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgogICovCiAjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBjc3VtX2FuZF9jb3B5X3RvX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICpkc3QsCi0JCQkJCQkgICAgICBpbnQgbGVuLCBpbnQgc3VtLCAKK3N0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLAorCQkJCQkJICAgICAgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCQkJCSAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0sCiAJCQkJCQkgICAgICBpbnQgKmVycl9wdHIpCiB7CiAJLyogY29kZSBzdG9sZW4gZnJvbSBpbmNsdWRlL2FzbS1taXBzNjQgKi8KQEAgLTIwMyw3ICsyMDAsNyBAQAogCSAKIAlpZiAoY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pKSB7CiAJCSplcnJfcHRyID0gLUVGQVVMVDsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOwogCX0KIAogCXJldHVybiBzdW07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9kbWEtbWFwcGluZy5oCmluZGV4IDFlMzg3ZTEuLjY2ZjBiNDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9kbWEtbWFwcGluZy5oCkBAIC0xOTEsMTMgKzE5MSwxMyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotZG1hX2lzX2NvbnNpc3RlbnQoZG1hX2FkZHJfdCBkbWFfYWRkcikKK2RtYV9pc19jb25zaXN0ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKIAlyZXR1cm4gKGhwcGFfZG1hX29wcy0+ZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUgPT0gTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAorZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCiAJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlpZihocHBhX2RtYV9vcHMtPmRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2RtYS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2RtYS5oCmluZGV4IGRhMmNmMzcuLjMxYWQwZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvZG1hLmgKQEAgLTE3LDEwICsxNywxMCBAQAogCiAvKgogKiogRE1BX0NIVU5LX1NJWkUgaXMgdXNlZCBieSB0aGUgU0NTSSBtaWQtbGF5ZXIgdG8gYnJlYWsgdXAKLSoqIChvciByYXRoZXIgbm90IG1lcmdlKSBETUEncyBpbnRvIG1hbmFnYWJsZSBjaHVua3MuCisqKiAob3IgcmF0aGVyIG5vdCBtZXJnZSkgRE1BcyBpbnRvIG1hbmFnZWFibGUgY2h1bmtzLgogKiogT24gcGFyaXNjLCB0aGlzIGlzIG1vcmUgb2YgdGhlIHNvZnR3YXJlL3R1bmluZyBjb25zdHJhaW50Ci0qKiByYXRoZXIgdGhhbiB0aGUgSFcuIEkvTyBNTVUgYWxsb2NhdGlvbiBhbG9nb3JpdGhtcyBjYW4gYmUKLSoqIGZhc3RlciB3aXRoIHNtYWxsZXIgc2l6ZSBpcyAodG8gc29tZSBkZWdyZWUpLgorKiogcmF0aGVyIHRoYW4gdGhlIEhXLiBJL08gTU1VIGFsbG9jYXRpb24gYWxnb3JpdGhtcyBjYW4gYmUKKyoqIGZhc3RlciB3aXRoIHNtYWxsZXIgc2l6ZXMgKHRvIHNvbWUgZGVncmVlKS4KICovCiAjZGVmaW5lIERNQV9DSFVOS19TSVpFCShCSVRTX1BFUl9MT05HKlBBR0VfU0laRSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvZnV0ZXguaAppbmRleCBkODRiYmIyLi5kYmVlNmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvZnV0ZXguaApAQCAtMjEsNyArMjEsNyBAQAogCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWluY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKIAogCXN3aXRjaCAob3ApIHsKIAljYXNlIEZVVEVYX09QX1NFVDoKQEAgLTMzLDcgKzMzLDcgQEAKIAkJcmV0ID0gLUVOT1NZUzsKIAl9CiAKLQlkZWNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAogCWlmICghcmV0KSB7CiAJCXN3aXRjaCAoY21wKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmgKaW5kZXggN2I4YWQxMS4uN2IzYmU5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaApAQCAtMTQ5LDcgKzE0OSw3IEBACiAvKgogKiogTW9zdCBQQ0kgZGV2aWNlcyAoZWcgVHVsaXAsIE5DUjcyMCkgYWxzbyBleHBvcnQgdGhlIHNhbWUgcmVnaXN0ZXJzCiAqKiB0byBib3RoIE1NSU8gYW5kIEkvTyBwb3J0IHNwYWNlLiAgRHVlIHRvIHBvb3IgcGVyZm9ybWFuY2Ugb2YgSS9PIFBvcnQKLSoqIGFjY2VzcyB1bmRlciBIUCBQQ0kgYnVzIGFkYXB0ZXJzLCBzdHJvbmdseSByZWNjb21lbmQgdXNlIG9mIE1NSU8KKyoqIGFjY2VzcyB1bmRlciBIUCBQQ0kgYnVzIGFkYXB0ZXJzLCBzdHJvbmdseSByZWNvbW1lbmQgdGhlIHVzZSBvZiBNTUlPCiAqKiBhZGRyZXNzIHNwYWNlLgogKioKICoqIFdoaWxlIEknbSBhdCBpdCBtb3JlIFBBIHByb2dyYW1taW5nIG5vdGVzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3JvcGVzLmggYi9pbmNsdWRlL2FzbS1wYXJpc2Mvcm9wZXMuaAppbmRleCA1NTQyZGQwLi4wMDdhODgwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3JvcGVzLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3JvcGVzLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNlbmRpZgogCiAvKgotKiogVGhlIG51bWJlciBvZiBwZGlyIGVudHJpZXMgdG8gImZyZWUiIGJlZm9yZSBpc3N1ZWluZworKiogVGhlIG51bWJlciBvZiBwZGlyIGVudHJpZXMgdG8gImZyZWUiIGJlZm9yZSBpc3N1aW5nCiAqKiBhIHJlYWQgdG8gUENPTSByZWdpc3RlciB0byBmbHVzaCBvdXQgUENPTSB3cml0ZXMuCiAqKiBJbnRlcmFjdHMgd2l0aCBhbGxvY2F0aW9uIGdyYW51bGFyaXR5IChpZSA0IG9yIDggZW50cmllcwogKiogYWxsb2NhdGVkIGFuZCBmcmVlJ2QvcHVyZ2VkIGF0IGEgdGltZSBtaWdodCBtYWtlIHRoaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zZW1hcGhvcmUuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zZW1hcGhvcmUuaAppbmRleCBjOWVlNDFjLi5kNDU4MjdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc2VtYXBob3JlLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NlbWFwaG9yZS5oCkBAIC0xMTUsNyArMTE1LDggQEAKICAqLwogZXh0ZXJuIF9faW5saW5lX18gaW50IGRvd25fdHJ5bG9jayhzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQogewotCWludCBmbGFncywgY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT5zZW50cnksIGZsYWdzKTsKIAljb3VudCA9IHNlbS0+Y291bnQgLSAxOwpAQCAtMTMxLDcgKzEzMiw4IEBACiAgKi8KIGV4dGVybiBfX2lubGluZV9fIHZvaWQgdXAoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKIHsKLQlpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPnNlbnRyeSwgZmxhZ3MpOwogCWlmIChzZW0tPmNvdW50IDwgMCkgewogCQlfX3VwKHNlbSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy90ZXJtYml0cy5oCmluZGV4IDM3MmI2MzQuLmE0NmUyOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy90ZXJtYml0cy5oCkBAIC0xNyw2ICsxNywxNyBAQAogCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwogfTsKIAorc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKIC8qIGNfY2MgY2hhcmFjdGVycyAqLwogI2RlZmluZSBWSU5UUiAwCiAjZGVmaW5lIFZRVUlUIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvS2J1aWxkIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9LYnVpbGQKaW5kZXggOTgyNzg0OS4uNzAzOTcwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9LYnVpbGQKQEAgLTM2LDYgKzM2LDcgQEAKIHVuaWZkZWYteSArPSBwdHJhY2UuaAogdW5pZmRlZi15ICs9IHNlY2NvbXAuaAogdW5pZmRlZi15ICs9IHNpZ25hbC5oCit1bmlmZGVmLXkgKz0gc3B1X2luZm8uaAogdW5pZmRlZi15ICs9IHRlcm1pb3MuaAogdW5pZmRlZi15ICs9IHR5cGVzLmgKIHVuaWZkZWYteSArPSB1bmlzdGQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9hc20tY29tcGF0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2FzbS1jb21wYXQuaAppbmRleCA4ZTY0YmUwLi5jODliZDU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2FzbS1jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2FzbS1jb21wYXQuaApAQCAtMTQsNiArMTQsNTggQEAKICMgIGRlZmluZSBBU01fQ09OU1QoeCkJCV9fQVNNX0NPTlNUKHgpCiAjZW5kaWYKIAorCisvKgorICogRmVhdHVyZSBzZWN0aW9uIGNvbW1vbiBtYWNyb3MKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGVudHJpZXMgbm93IGNvbnRhaW4gb2Zmc2V0cyBiZXR3ZWVuIHRoZSB0YWJsZSBlbnRyeQorICogYW5kIHRoZSBjb2RlIHJhdGhlciB0aGFuIGFic29sdXRlIGNvZGUgcG9pbnRlcnMgaW4gb3JkZXIgdG8gYmUKKyAqIHVzZWFibGUgd2l0aCB0aGUgdmRzbyBzaGFyZWQgbGlicmFyeS4gVGhlcmUgaXMgYWxzbyBhbiBhc3N1bXB0aW9uCisgKiB0aGF0IHZhbHVlcyB3aWxsIGJlIG5lZ2F0aXZlLCB0aGF0IGlzLCB0aGUgZml4dXAgdGFibGUgaGFzIHRvIGJlCisgKiBsb2NhdGVkIGFmdGVyIHRoZSBjb2RlIGl0IGZpeGVzIHVwLgorICovCisjaWZkZWYgQ09ORklHX1BQQzY0CisjaWZkZWYgX19wb3dlcnBjNjRfXworLyogNjQgYml0cyBrZXJuZWwsIDY0IGJpdHMgY29kZSAqLworI2RlZmluZSBNQUtFX0ZUUl9TRUNUSU9OX0VOVFJZKG1zaywgdmFsLCBsYWJlbCwgc2VjdCkJXAorOTk6CQkJCQkJCVwKKwkuc2VjdGlvbiBzZWN0LCJhIjsJCQkJXAorCS5hbGlnbiAzOwkJCQkJXAorOTg6CQkJCQkJICAgICAgIAlcCisJLmxsb25nIG1zazsJCQkJCVwKKwkubGxvbmcgdmFsOwkJCQkJXAorCS5sbG9uZyBsYWJlbCMjYi05OGI7CQkJCVwKKwkubGxvbmcgOTliLTk4YjsJCSAJCQlcCisJLnByZXZpb3VzCisjZWxzZSAvKiBfX3Bvd2VycGM2NF9fICovCisvKiA2NCBiaXRzIGtlcm5lbCwgMzIgYml0cyBjb2RlIChpZS4gdmRzbzMyKSAqLworI2RlZmluZSBNQUtFX0ZUUl9TRUNUSU9OX0VOVFJZKG1zaywgdmFsLCBsYWJlbCwgc2VjdCkJXAorOTk6CQkJCQkJCVwKKwkuc2VjdGlvbiBzZWN0LCJhIjsJCQkJXAorCS5hbGlnbiAzOwkJCQkJXAorOTg6CQkJCQkJICAgICAgIAlcCisJLmxsb25nIG1zazsJCQkJCVwKKwkubGxvbmcgdmFsOwkJCQkJXAorCS5sb25nIDB4ZmZmZmZmZmY7ICAgICAgCQkJCVwKKwkubG9uZyBsYWJlbCMjYi05OGI7CQkJCVwKKwkubG9uZyAweGZmZmZmZmZmOwkgICAgICAgCQkJXAorCS5sb25nIDk5Yi05OGI7CQkgCQkJXAorCS5wcmV2aW91cworI2VuZGlmIC8qICFfX3Bvd2VycGM2NF9fICovCisjZWxzZSAvKiBDT05GSUdfUFBDNjQgKi8KKy8qIDMyIGJpdHMga2VybmVsLCAzMiBiaXRzIGNvZGUgKi8KKyNkZWZpbmUgTUFLRV9GVFJfU0VDVElPTl9FTlRSWShtc2ssIHZhbCwgbGFiZWwsIHNlY3QpCVwKKzk5OgkJCQkJCSAgICAgICAJXAorCS5zZWN0aW9uIHNlY3QsImEiOwkJCSAgICAgICAJXAorCS5hbGlnbiAyOwkJCQkgICAgICAgCVwKKzk4OgkJCQkJCSAgICAgICAJXAorCS5sb25nIG1zazsJCQkJICAgICAgIAlcCisJLmxvbmcgdmFsOwkJCQkgICAgICAgCVwKKwkubG9uZyBsYWJlbCMjYi05OGI7CQkJICAgICAgIAlcCisJLmxvbmcgOTliLTk4YjsJCQkJICAgICAgIAlcCisJLnByZXZpb3VzCisjZW5kaWYgLyogIUNPTkZJR19QUEM2NCAqLworCiAjaWZkZWYgX19wb3dlcnBjNjRfXwogCiAvKiBvcGVyYXRpb25zIGZvciBsb25ncyBhbmQgcG9pbnRlcnMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYml0b3BzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2JpdG9wcy5oCmluZGV4IGMzNDEwNjMuLjhmNzU3ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9iaXRvcHMuaApAQCAtMTkwLDcgKzE5MCw4IEBACiAgKiBSZXR1cm4gdGhlIHplcm8tYmFzZWQgYml0IHBvc2l0aW9uIChMRSwgbm90IElCTSBiaXQgbnVtYmVyaW5nKSBvZgogICogdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMS1iaXQgaW4gYSBkb3VibGUgd29yZC4KICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IF9faWxvZzIodW5zaWduZWQgbG9uZyB4KQorc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoY29uc3QpKQoraW50IF9faWxvZzIodW5zaWduZWQgbG9uZyB4KQogewogCWludCBsejsKIApAQCAtMTk4LDYgKzE5OSwyNCBAQAogCXJldHVybiBCSVRTX1BFUl9MT05HIC0gMSAtIGx6OwogfQogCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK2ludCBfX2lsb2cyX3UzMih1MzIgbikKK3sKKwlpbnQgYml0OworCWFzbSAoImNudGx6dyAlMCwlMSIgOiAiPXIiIChiaXQpIDogInIiIChuKSk7CisJcmV0dXJuIDMxIC0gYml0OworfQorCisjaWZkZWYgX19wb3dlcnBjNjRfXworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitpbnQgX19pbG9nMl91NjQodTY0IG4pCit7CisJaW50IGJpdDsKKwlhc20gKCJjbnRsemQgJTAsJTEiIDogIj1yIiAoYml0KSA6ICJyIiAobikpOworCXJldHVybiA2MyAtIGJpdDsKK30KKyNlbmRpZgorCiAvKgogICogRGV0ZXJtaW5lcyB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCAwIGJpdCBpbiB0aGUKICAqIHNwZWNpZmllZCBkb3VibGUgd29yZC4gVGhlIHJldHVybmVkIGJpdCBwb3NpdGlvbiB3aWxsIGJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2J1Zy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9idWcuaAppbmRleCA5NzhiMmM3Li43MDk1Njg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYnVnLmgKQEAgLTEzLDM2ICsxMywzOSBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi1zdHJ1Y3QgYnVnX2VudHJ5IHsKLQl1bnNpZ25lZCBsb25nCWJ1Z19hZGRyOwotCWxvbmcJCWxpbmU7Ci0JY29uc3QgY2hhcgkqZmlsZTsKLQljb25zdCBjaGFyCSpmdW5jdGlvbjsKLX07Ci0KLXN0cnVjdCBidWdfZW50cnkgKmZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcik7Ci0KLS8qCi0gKiBJZiB0aGlzIGJpdCBpcyBzZXQgaW4gdGhlIGxpbmUgbnVtYmVyIGl0IG1lYW5zIHRoYXQgdGhlIHRyYXAKLSAqIGlzIGZvciBXQVJOX09OIHJhdGhlciB0aGFuIEJVRyBvciBCVUdfT04uCi0gKi8KLSNkZWZpbmUgQlVHX1dBUk5JTkdfVFJBUAkweDEwMDAwMDAKLQogI2lmZGVmIENPTkZJR19CVUcKIAorLyogX0VNSVRfQlVHX0VOVFJZIGV4cGVjdHMgYXJncyAlMCwlMSwlMiwlMyB0byBiZSBGSUxFLCBMSU5FLCBmbGFncyBhbmQKKyAgIHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KSwgcmVzcGVjdGl2ZWx5ICovCisjaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKKyNkZWZpbmUgX0VNSVRfQlVHX0VOVFJZCQkJCVwKKwkiLnNlY3Rpb24gX19idWdfdGFibGUsXCJhXCJcbiIJCVwKKwkiMjpcdCIgUFBDX0xPTkcgIjFiLCAlMFxuIgkJXAorCSJcdC5zaG9ydCAlMSwgJTJcbiIJCQlcCisJIi5vcmcgMmIrJTNcbiIJCQkJXAorCSIucHJldmlvdXNcbiIKKyNlbHNlCisjZGVmaW5lIF9FTUlUX0JVR19FTlRSWQkJCQlcCisJIi5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQlcCisJIjI6XHQiIFBQQ19MT05HICIxYlxuIgkJCVwKKwkiXHQuc2hvcnQgJTJcbiIJCQkJXAorCSIub3JnIDJiKyUzXG4iCQkJCVwKKwkiLnByZXZpb3VzXG4iCisjZW5kaWYKKwogLyoKICAqIEJVR19PTigpIGFuZCBXQVJOX09OKCkgZG8gdGhlaXIgYmVzdCB0byBjb29wZXJhdGUgd2l0aCBjb21waWxlLXRpbWUKICAqIG9wdGltaXNhdGlvbnMuIEhvd2V2ZXIgZGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBjb25kaXRpb24KICAqIHNvbWUgY29tcGlsZXIgdmVyc2lvbnMgbWF5IG5vdCBwcm9kdWNlIG9wdGltYWwgcmVzdWx0cy4KICAqLwogCi0jZGVmaW5lIEJVRygpIGRvIHsJCQkJCQkJIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQkgXAotCQkiMToJdHdpIDMxLDAsMFxuIgkJCQkJIFwKLQkJIi5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQkJCSBcCi0JCSJcdCJQUENfTE9ORyIJMWIsJTAsJTEsJTJcbiIJCQkJIFwKLQkJIi5wcmV2aW91cyIJCQkJCQkgXAotCQk6IDogImkiIChfX0xJTkVfXyksICJpIiAoX19GSUxFX18pLCAiaSIgKF9fRlVOQ1RJT05fXykpOyBcCisjZGVmaW5lIEJVRygpIGRvIHsJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCSIxOgl0d2kgMzEsMCwwXG4iCQkJCVwKKwkJX0VNSVRfQlVHX0VOVFJZCQkJCQlcCisJCTogOiAiaSIgKF9fRklMRV9fKSwgImkiIChfX0xJTkVfXyksCQlcCisJCSAgICAiaSIgKDApLCAiaSIgIChzaXplb2Yoc3RydWN0IGJ1Z19lbnRyeSkpKTsJXAorCWZvcig7OykgOwkJCQkJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgQlVHX09OKHgpIGRvIHsJCQkJCQlcCkBAIC01MSwyMyArNTQsMjEgQEAKIAkJCUJVRygpOwkJCQkJXAogCX0gZWxzZSB7CQkJCQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJXAotCQkiMToJIlBQQ19UTE5FSSIJJTAsMFxuIgkJCVwKLQkJIi5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQkJXAotCQkiXHQiUFBDX0xPTkciCTFiLCUxLCUyLCUzXG4iCQkJXAotCQkiLnByZXZpb3VzIgkJCQkJXAotCQk6IDogInIiICgobG9uZykoeCkpLCAiaSIgKF9fTElORV9fKSwJCVwKLQkJICAgICJpIiAoX19GSUxFX18pLCAiaSIgKF9fRlVOQ1RJT05fXykpOwlcCisJCSIxOgkiUFBDX1RMTkVJIgklNCwwXG4iCQkJXAorCQlfRU1JVF9CVUdfRU5UUlkJCQkJCVwKKwkJOiA6ICJpIiAoX19GSUxFX18pLCAiaSIgKF9fTElORV9fKSwgImkiICgwKSwJXAorCQkgICJpIiAoc2l6ZW9mKHN0cnVjdCBidWdfZW50cnkpKSwJCVwKKwkJICAiciIgKChsb25nKSh4KSkpOwkJCQlcCiAJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIF9fV0FSTigpIGRvIHsJCQkJCQlcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCiAJCSIxOgl0d2kgMzEsMCwwXG4iCQkJCVwKLQkJIi5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQkJXAotCQkiXHQiUFBDX0xPTkciCTFiLCUwLCUxLCUyXG4iCQkJXAotCQkiLnByZXZpb3VzIgkJCQkJXAotCQk6IDogImkiIChfX0xJTkVfXyArIEJVR19XQVJOSU5HX1RSQVApLAkJXAotCQkgICAgImkiIChfX0ZJTEVfXyksICJpIiAoX19GVU5DVElPTl9fKSk7CVwKKwkJX0VNSVRfQlVHX0VOVFJZCQkJCQlcCisJCTogOiAiaSIgKF9fRklMRV9fKSwgImkiIChfX0xJTkVfXyksCQlcCisJCSAgImkiIChCVUdGTEFHX1dBUk5JTkcpLAkJCVwKKwkJICAiaSIgKHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KSkpOwkJXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBXQVJOX09OKHgpICh7CQkJCQkJXApAQCAtNzcsMTMgKzc4LDEyIEBACiAJCQlfX1dBUk4oKTsJCQkJXAogCX0gZWxzZSB7CQkJCQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJXAotCQkiMToJIlBQQ19UTE5FSSIJJTAsMFxuIgkJCVwKLQkJIi5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQkJXAotCQkiXHQiUFBDX0xPTkciCTFiLCUxLCUyLCUzXG4iCQkJXAotCQkiLnByZXZpb3VzIgkJCQkJXAotCQk6IDogInIiIChfX3JldF93YXJuX29uKSwJCQlcCi0JCSAgICAiaSIgKF9fTElORV9fICsgQlVHX1dBUk5JTkdfVFJBUCksCQlcCi0JCSAgICAiaSIgKF9fRklMRV9fKSwgImkiIChfX0ZVTkNUSU9OX18pKTsJXAorCQkiMToJIlBQQ19UTE5FSSIJJTQsMFxuIgkJCVwKKwkJX0VNSVRfQlVHX0VOVFJZCQkJCQlcCisJCTogOiAiaSIgKF9fRklMRV9fKSwgImkiIChfX0xJTkVfXyksCQlcCisJCSAgImkiIChCVUdGTEFHX1dBUk5JTkcpLAkJCVwKKwkJICAiaSIgKHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KSksCQlcCisJCSAgInIiIChfX3JldF93YXJuX29uKSk7CQkJCVwKIAl9CQkJCQkJCVwKIAl1bmxpa2VseShfX3JldF93YXJuX29uKTsJCQkJXAogfSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZWZsdXNoLmgKaW5kZXggOGE3NDBjOC4uMDhlOTNlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZWZsdXNoLmgKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2ljYWNoZV9wYWdlKHZtYSwgcGFnZSkJCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2VsbC1wbXUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2VsbC1wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGMyZWJkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jZWxsLXBtdS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ2VsbCBCcm9hZGJhbmQgRW5naW5lIFBlcmZvcm1hbmNlIE1vbml0b3IKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA2CisgKgorICogQXV0aG9yOgorICogICBEYXZpZCBFcmIgKGRqZXJiQHVzLmlibS5jb20pCisgKiAgIEtldmluIENvcnJ5IChrZXZjb3JyeUB1cy5pYm0uY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19BU01fQ0VMTF9QTVVfSF9fCisjZGVmaW5lIF9fQVNNX0NFTExfUE1VX0hfXworCisvKiBUaGUgQ2VsbCBQTVUgaGFzIGZvdXIgaGFyZHdhcmUgcGVyZm9ybWFuY2UgY291bnRlcnMsIHdoaWNoIGNhbiBiZQorICogY29uZmlndXJlZCBhcyBmb3VyIDMyLWJpdCBjb3VudGVycyBvciBlaWdodCAxNi1iaXQgY291bnRlcnMuCisgKi8KKyNkZWZpbmUgTlJfUEhZU19DVFJTIDQKKyNkZWZpbmUgTlJfQ1RSUyAgICAgIChOUl9QSFlTX0NUUlMgKiAyKQorCisvKiBNYWNyb3MgZm9yIHRoZSBwbV9jb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBDQkVfUE1fMTZCSVRfQ1RSKGN0cikgICAgICAgICAgICAgICgxIDw8ICgyNCAtICgoY3RyKSAmIChOUl9QSFlTX0NUUlMgLSAxKSkpKQorI2RlZmluZSBDQkVfUE1fRU5BQkxFX1BFUkZfTU9OICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgQ0JFX1BNX1NUT1BfQVRfTUFYICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIENCRV9QTV9UUkFDRV9NT0RFX0dFVChwbV9jb250cm9sKSAgKCgocG1fY29udHJvbCkgPj4gMjgpICYgMHgzKQorI2RlZmluZSBDQkVfUE1fVFJBQ0VfTU9ERV9TRVQobW9kZSkgICAgICAgICgoKG1vZGUpICAmIDB4MykgPDwgMjgpCisjZGVmaW5lIENCRV9QTV9DT1VOVF9NT0RFX1NFVChjb3VudCkgICAgICAgKCgoY291bnQpICYgMHgzKSA8PCAxOCkKKyNkZWZpbmUgQ0JFX1BNX0ZSRUVaRV9BTExfQ1RSUyAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIENCRV9QTV9FTkFCTEVfRVhUX1RSQUNFICAgICAgICAgICAgMHgwMDAwODAwMAorCisvKiBNYWNyb3MgZm9yIHRoZSB0cmFjZV9hZGRyZXNzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBDQkVfUE1fVFJBQ0VfQlVGX0ZVTEwgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQ0JFX1BNX1RSQUNFX0JVRl9FTVBUWSAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIENCRV9QTV9UUkFDRV9CVUZfREFUQV9DT1VOVCh0YSkgICAgKCh0YSkgJiAweDNmZikKKyNkZWZpbmUgQ0JFX1BNX1RSQUNFX0JVRl9NQVhfQ09VTlQgICAgICAgICAweDQwMAorCisvKiBNYWNyb3MgZm9yIHRoZSBwbTA3X2NvbnRyb2wgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBDQkVfUE1fQ1RSX0lOUFVUX01VWChwbTA3X2NvbnRyb2wpICgoKHBtMDdfY29udHJvbCkgPj4gMjYpICYgMHgzZikKKyNkZWZpbmUgQ0JFX1BNX0NUUl9JTlBVVF9DT05UUk9MICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIENCRV9QTV9DVFJfUE9MQVJJVFkgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBDQkVfUE1fQ1RSX0NPVU5UX0NZQ0xFUyAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQ0JFX1BNX0NUUl9FTkFCTEUgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisKKy8qIE1hY3JvcyBmb3IgdGhlIHBtX3N0YXR1cyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQ0JFX1BNX0NUUl9PVkVSRkxPV19JTlRSKGN0cikgICAgICAoMSA8PCAoMzEgLSAoKGN0cikgJiA3KSkpCisKK2VudW0gcG1fcmVnX25hbWUgeworCWdyb3VwX2NvbnRyb2wsCisJZGVidWdfYnVzX2NvbnRyb2wsCisJdHJhY2VfYWRkcmVzcywKKwlleHRfdHJfdGltZXIsCisJcG1fc3RhdHVzLAorCXBtX2NvbnRyb2wsCisJcG1faW50ZXJ2YWwsCisJcG1fc3RhcnRfc3RvcCwKK307CisKKy8qIFJvdXRpbmVzIGZvciByZWFkaW5nL3dyaXRpbmcgdGhlIFBNVSByZWdpc3RlcnMuICovCitleHRlcm4gdTMyICBjYmVfcmVhZF9waHlzX2N0cih1MzIgY3B1LCB1MzIgcGh5c19jdHIpOworZXh0ZXJuIHZvaWQgY2JlX3dyaXRlX3BoeXNfY3RyKHUzMiBjcHUsIHUzMiBwaHlzX2N0ciwgdTMyIHZhbCk7CitleHRlcm4gdTMyICBjYmVfcmVhZF9jdHIodTMyIGNwdSwgdTMyIGN0cik7CitleHRlcm4gdm9pZCBjYmVfd3JpdGVfY3RyKHUzMiBjcHUsIHUzMiBjdHIsIHUzMiB2YWwpOworCitleHRlcm4gdTMyICBjYmVfcmVhZF9wbTA3X2NvbnRyb2wodTMyIGNwdSwgdTMyIGN0cik7CitleHRlcm4gdm9pZCBjYmVfd3JpdGVfcG0wN19jb250cm9sKHUzMiBjcHUsIHUzMiBjdHIsIHUzMiB2YWwpOworZXh0ZXJuIHUzMiAgY2JlX3JlYWRfcG0odTMyIGNwdSwgZW51bSBwbV9yZWdfbmFtZSByZWcpOworZXh0ZXJuIHZvaWQgY2JlX3dyaXRlX3BtKHUzMiBjcHUsIGVudW0gcG1fcmVnX25hbWUgcmVnLCB1MzIgdmFsKTsKKworZXh0ZXJuIHUzMiAgY2JlX2dldF9jdHJfc2l6ZSh1MzIgY3B1LCB1MzIgcGh5c19jdHIpOworZXh0ZXJuIHZvaWQgY2JlX3NldF9jdHJfc2l6ZSh1MzIgY3B1LCB1MzIgcGh5c19jdHIsIHUzMiBjdHJfc2l6ZSk7CisKK2V4dGVybiB2b2lkIGNiZV9lbmFibGVfcG0odTMyIGNwdSk7CitleHRlcm4gdm9pZCBjYmVfZGlzYWJsZV9wbSh1MzIgY3B1KTsKKworZXh0ZXJuIHZvaWQgY2JlX3JlYWRfdHJhY2VfYnVmZmVyKHUzMiBjcHUsIHU2NCAqYnVmKTsKKworZXh0ZXJuIHZvaWQgY2JlX2VuYWJsZV9wbV9pbnRlcnJ1cHRzKHUzMiBjcHUsIHUzMiB0aHJlYWQsIHUzMiBtYXNrKTsKK2V4dGVybiB2b2lkIGNiZV9kaXNhYmxlX3BtX2ludGVycnVwdHModTMyIGNwdSk7CitleHRlcm4gdTMyICBjYmVfcXVlcnlfcG1faW50ZXJydXB0cyh1MzIgY3B1KTsKK2V4dGVybiB1MzIgIGNiZV9jbGVhcl9wbV9pbnRlcnJ1cHRzKHUzMiBjcHUpOworZXh0ZXJuIHZvaWQgY2JlX3N5bmNfaXJxKGludCBub2RlKTsKKworLyogVXRpbGl0eSBmdW5jdGlvbnMsIG1hY3JvcyAqLworZXh0ZXJuIHUzMiBjYmVfZ2V0X2h3X3RocmVhZF9pZChpbnQgY3B1KTsKKworI2RlZmluZSBjYmVfY3B1X3RvX25vZGUoY3B1KSAoKGNwdSkgPj4gMSkKKworI2RlZmluZSBDQkVfQ09VTlRfU1VQRVJWSVNPUl9NT0RFICAgICAgIDAKKyNkZWZpbmUgQ0JFX0NPVU5UX0hZUEVSVklTT1JfTU9ERSAgICAgICAxCisjZGVmaW5lIENCRV9DT1VOVF9QUk9CTEVNX01PREUgICAgICAgICAgMgorI2RlZmluZSBDQkVfQ09VTlRfQUxMX01PREVTICAgICAgICAgICAgIDMKKworLyogTWFjcm9zIGZvciB0aGUgcG0wN19jb250cm9sIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgUE0wN19DVFJfSU5QVVRfTVVYKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4M0YpIDw8IDI2KQorI2RlZmluZSBQTTA3X0NUUl9JTlBVVF9DT05UUk9MKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMSkgPDwgMjUpCisjZGVmaW5lIFBNMDdfQ1RSX1BPTEFSSVRZKHgpICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAxKSA8PCAyNCkKKyNkZWZpbmUgUE0wN19DVFJfQ09VTlRfQ1lDTEVTKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDEpIDw8IDIzKQorI2RlZmluZSBQTTA3X0NUUl9FTkFCTEUoeCkgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMSkgPDwgMjIpCisKKyNlbmRpZiAvKiBfX0FTTV9DRUxMX1BNVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2hlY2tzdW0uaAppbmRleCA2MDllY2JiLi43Y2RmMzU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jaGVja3N1bS5oCkBAIC0xNCwxNyArMTQsMTYgQEAKICAqIHdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuICBpaGwgaXMgdGhlIG51bWJlcgogICogb2YgMzItYml0IHdvcmRzIGFuZCBpcyBhbHdheXMgPj0gNS4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKK2V4dGVybiBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpOwogCiAvKgogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAotCQkJCQl1bnNpZ25lZCBsb25nIGRhZGRyLAorZXh0ZXJuIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCXVuc2lnbmVkIHNob3J0IGxlbiwKIAkJCQkJdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCXVuc2lnbmVkIGludCBzdW0pOworCQkJCQlfX3dzdW0gc3VtKTsKIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLApAQCAtMzgsOCArMzcsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwKLQkJCQkgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIENvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBzcmMsIGxlbmd0aCBsZW4sCkBAIC01MSwyMCArNDksMTUgQEAKICAqIExpa2UgY3N1bV9wYXJ0aWFsLCB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLAogICogZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudC4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLAorZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLAogCQkJCQkgICAgICBpbnQgKnNyY19lcnIsIGludCAqZHN0X2Vycik7CiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHRvIGRzdCB3aGlsZSBpdAogICogY2hlY2tzdW1zLgogICovCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCBjaGFyICpzcmMsIAotCQkJCSAgICAgICBjaGFyICpkc3QsIAotCQkJCSAgICAgICBpbnQgbGVuLCAKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IHN1bSk7Ci0KICNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSwgZXJycCkgICBcCi0gICAgICAgIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSksIChlcnJwKSwgTlVMTCkKKyAgICAgICAgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSBjb25zdCB2b2lkICopKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSksIChlcnJwKSwgTlVMTCkKIAogI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYywgZHN0LCBsZW4sIHN1bSkgICBcCiAgICAgICAgIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSksIE5VTEwsIE5VTEwpCkBAIC03NCw3ICs2Nyw3IEBACiAgKiB0dXJucyBhIDMyLWJpdCBwYXJ0aWFsIGNoZWNrc3VtIChlLmcuIGZyb20gY3N1bV9wYXJ0aWFsKSBpbnRvIGEKICAqIDEncyBjb21wbGVtZW50IDE2LWJpdCBjaGVja3N1bS4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIApAQCAtODMsNDEgKzc2LDMyIEBACiAJLyogaWYgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIGFkZGluZyB0aGUgdHdvIDE2LWJpdCBoYWx2ZXMsCiAJICAgaXQgd2lsbCBjYXJyeSBmcm9tIHRoZSBsb3dlciBoYWxmIGludG8gdGhlIHVwcGVyIGhhbGYsCiAJICAgZ2l2aW5nIHVzIHRoZSBjb3JyZWN0IHN1bSBpbiB0aGUgdXBwZXIgaGFsZi4gKi8KLQlzdW0gPSB+KHN1bSArIHRtcCkgPj4gMTY7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNikofigoX19mb3JjZSB1MzIpc3VtICsgdG1wKSA+PiAxNik7CiB9CiAKIC8qCiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CiAgKiBpbiBpY21wLmMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCi1zdGF0aWMgaW5saW5lIHUzMiBjc3VtX3RjcHVkcF9ub2ZvbGQodTMyIHNhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3dzdW0gc3VtKQogewotCXVuc2lnbmVkIGxvbmcgcyA9IHN1bTsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJdW5zaWduZWQgbG9uZyBzID0gKF9fZm9yY2UgdTMyKXN1bTsKIAotCXMgKz0gc2FkZHI7Ci0JcyArPSBkYWRkcjsKLQlzICs9IChwcm90byA8PCAxNikgKyBsZW47CisJcyArPSAoX19mb3JjZSB1MzIpc2FkZHI7CisJcyArPSAoX19mb3JjZSB1MzIpZGFkZHI7CisJcyArPSBwcm90byArIGxlbjsKIAlzICs9IChzID4+IDMyKTsKLQlyZXR1cm4gKHUzMikgczsKLX0KKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKSBzOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCi17CiAgICAgX19hc21fXygiXG5cCiAJYWRkYyAlMCwlMCwlMSBcblwKIAlhZGRlICUwLCUwLCUyIFxuXApAQCAtMTI1LDEwICsxMDksOSBAQAogCWFkZHplICUwLCUwIFxuXAogCSIKIAk6ICI9ciIgKHN1bSkKLQk6ICJyIiAoZGFkZHIpLCAiciIoc2FkZHIpLCAiciIoKHByb3RvPDwxNikrbGVuKSwgIjAiKHN1bSkpOwotICAgIHJldHVybiBzdW07Ci19Ci0KKwk6ICJyIiAoZGFkZHIpLCAiciIoc2FkZHIpLCAiciIocHJvdG8gKyBsZW4pLCAiMCIoc3VtKSk7CisJcmV0dXJuIHN1bTsKICNlbmRpZgorfQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCmluZGV4IDEyNzA3YWIuLjczODRiODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKQEAgLTI0LDYgKzI0LDggQEAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfSUNBQ0hFX1NOT09QCTB4MDAwMDIwMDAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfQVJDSF8yXzA1CQkweDAwMDAxMDAwCiAjZGVmaW5lIFBQQ19GRUFUVVJFX1BBNlQJCTB4MDAwMDA4MDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfSEFTX0RGUAkJMHgwMDAwMDQwMAorI2RlZmluZSBQUENfRkVBVFVSRV9QT1dFUjZfRVhUCQkweDAwMDAwMjAwCiAKICNkZWZpbmUgUFBDX0ZFQVRVUkVfVFJVRV9MRQkJMHgwMDAwMDAwMgogI2RlZmluZSBQUENfRkVBVFVSRV9QUENfTEUJCTB4MDAwMDAwMDEKQEAgLTQ1LDYgKzQ3LDcgQEAKIAlQUENfT1BST0ZJTEVfUE9XRVI0ID0gMiwKIAlQUENfT1BST0ZJTEVfRzQgPSAzLAogCVBQQ19PUFJPRklMRV9CT09LRSA9IDQsCisJUFBDX09QUk9GSUxFX0NFTEwgPSA1LAogfTsKIAogc3RydWN0IGNwdV9zcGVjIHsKQEAgLTg5LDggKzkyLDExIEBACiAKIGV4dGVybiBzdHJ1Y3QgY3B1X3NwZWMJCSpjdXJfY3B1X3NwZWM7CiAKLWV4dGVybiB2b2lkIGlkZW50aWZ5X2NwdSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBjcHUpOwotZXh0ZXJuIHZvaWQgZG9fY3B1X2Z0cl9maXh1cHModW5zaWduZWQgbG9uZyBvZmZzZXQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBfX3N0YXJ0X19fZnRyX2ZpeHVwLCBfX3N0b3BfX19mdHJfZml4dXA7CisKK2V4dGVybiBzdHJ1Y3QgY3B1X3NwZWMgKmlkZW50aWZ5X2NwdSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHB2cik7CitleHRlcm4gdm9pZCBkb19mZWF0dXJlX2ZpeHVwcyh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICpmaXh1cF9zdGFydCwKKwkJCSAgICAgIHZvaWQgKmZpeHVwX2VuZCk7CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApAQCAtMTIwLDYgKzEyNiw3IEBACiAjZGVmaW5lIENQVV9GVFJfTk9EU0lTUkFMSUdOCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMTAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1BQQ19MRQkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAyMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfUkVBTF9MRQkJCUFTTV9DT05TVCgweDAwMDAwMDAwMDA0MDAwMDApCisjZGVmaW5lIENQVV9GVFJfRlBVX1VOQVZBSUxBQkxFCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwODAwMDAwKQogCiAvKgogICogQWRkIHRoZSA2NC1iaXQgcHJvY2Vzc29yIHVuaXF1ZSBmZWF0dXJlcyBpbiB0aGUgdG9wIGhhbGYgb2YgdGhlIHdvcmQ7CkBAIC0xNDQsMTkgKzE1MSwxNSBAQAogI2RlZmluZSBDUFVfRlRSX0NJX0xBUkdFX1BBR0UJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDEwMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9QQVVTRV9aRVJPCQlMT05HX0FTTV9DT05TVCgweDAwMDAyMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfUFVSUgkJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDQwMDAwMDAwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9DRUxMX1RCX0JVRwkJTE9OR19BU01fQ09OU1QoMHgwMDAwODAwMDAwMDAwMDAwKQorI2RlZmluZSBDUFVfRlRSX1NQVVJSCQkJTE9OR19BU01fQ09OU1QoMHgwMDAxMDAwMDAwMDAwMDAwKQorI2RlZmluZSBDUFVfRlRSX0RTQ1IJCQlMT05HX0FTTV9DT05TVCgweDAwMDIwMDAwMDAwMDAwMDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNkZWZpbmUgQ1BVX0ZUUl9QUENBU19BUkNIX1YyX0JBU0UgKENQVV9GVFJfU0xCIHwgXAotCQkJCQlDUFVfRlRSX1RMQklFTCB8IENQVV9GVFJfTk9FWEVDVVRFIHwgXAotCQkJCQlDUFVfRlRSX05PRFNJU1JBTElHTikKLQotLyogaVNlcmllcyBkb2Vzbid0IHN1cHBvcnQgbGFyZ2UgcGFnZXMgKi8KLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLSNkZWZpbmUgQ1BVX0ZUUl9QUENBU19BUkNIX1YyCShDUFVfRlRSX1BQQ0FTX0FSQ0hfVjJfQkFTRSkKLSNlbHNlCi0jZGVmaW5lIENQVV9GVFJfUFBDQVNfQVJDSF9WMgkoQ1BVX0ZUUl9QUENBU19BUkNIX1YyX0JBU0UgfCBDUFVfRlRSXzE2TV9QQUdFKQotI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLworI2RlZmluZSBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIJKENQVV9GVFJfU0xCIHwgXAorCQkJCSBDUFVfRlRSX1RMQklFTCB8IENQVV9GVFJfTk9FWEVDVVRFIHwgXAorCQkJCSBDUFVfRlRSX05PRFNJU1JBTElHTiB8IENQVV9GVFJfMTZNX1BBR0UpCiAKIC8qIFdlIG9ubHkgc2V0IHRoZSBhbHRpdmVjIGZlYXR1cmVzIGlmIHRoZSBrZXJuZWwgd2FzIGNvbXBpbGVkIHdpdGggYWx0aXZlYwogICogc3VwcG9ydApAQCAtMjk0LDYgKzI5Nyw5IEBACiAjZGVmaW5lIENQVV9GVFJTX0UzMDAJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9DT01NT04pCisjZGVmaW5lIENQVV9GVFJTX0UzMDBDMgkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCisJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAorCSAgICBDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfRlBVX1VOQVZBSUxBQkxFKQogI2RlZmluZSBDUFVfRlRSU19DTEFTU0lDMzIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUpCiAjZGVmaW5lIENQVV9GVFJTXzhYWAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCKQpAQCAtMzA3LDcgKzMxMyw4IEBACiAjZGVmaW5lIENQVV9GVFJTX0U1MDBfMgkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0JJR19QSFlTIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCiAjZGVmaW5lIENQVV9GVFJTX0dFTkVSSUNfMzIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCi0jaWZkZWYgX19wb3dlcnBjNjRfXworCisvKiA2NC1iaXQgQ1BVcyAqLwogI2RlZmluZSBDUFVfRlRSU19QT1dFUjMJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTX1JTNjQJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKQEAgLTMyOCwxOCArMzM1LDI0IEBACiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCi0JICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IENQVV9GVFJfUkVBTF9MRSkKKwkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9TUFVSUiB8IENQVV9GVFJfUkVBTF9MRSB8IFwKKwkgICAgQ1BVX0ZUUl9EU0NSKQorI2RlZmluZSBDUFVfRlRSU19QT1dFUjZYIChDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCisJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKKwkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAorCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCisJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IFwKKwkgICAgQ1BVX0ZUUl9TUFVSUiB8IENQVV9GVFJfUkVBTF9MRSB8IENQVV9GVFJfRFNDUikKICNkZWZpbmUgQ1BVX0ZUUlNfQ0VMTAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAotCSAgICBDUFVfRlRSX1BBVVNFX1pFUk8gfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UpCisJICAgIENQVV9GVFJfUEFVU0VfWkVSTyB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IENQVV9GVFJfQ0VMTF9UQl9CVUcpCiAjZGVmaW5lIENQVV9GVFJTX1BBNlQgKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9SRUFMX0xFKQogI2RlZmluZSBDUFVfRlRSU19DT01QQVRJQkxFCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMikKLSNlbmRpZgogCiAjaWZkZWYgX19wb3dlcnBjNjRfXwogI2RlZmluZSBDUFVfRlRSU19QT1NTSUJMRQlcCkBAIC0zNTcsNyArMzcwLDggQEAKIAkgICAgQ1BVX0ZUUlNfNzQ1MF8yMSB8IENQVV9GVFJTXzc0NTBfMjMgfCBDUFVfRlRSU183NDU1XzEgfAogCSAgICBDUFVfRlRSU183NDU1XzIwIHwgQ1BVX0ZUUlNfNzQ1NSB8IENQVV9GVFJTXzc0NDdfMTAgfAogCSAgICBDUFVfRlRSU183NDQ3IHwgQ1BVX0ZUUlNfNzQ0N0EgfCBDUFVfRlRSU184MlhYIHwKLQkgICAgQ1BVX0ZUUlNfRzJfTEUgfCBDUFVfRlRSU19FMzAwIHwgQ1BVX0ZUUlNfQ0xBU1NJQzMyIHwKKwkgICAgQ1BVX0ZUUlNfRzJfTEUgfCBDUFVfRlRSU19FMzAwIHwgQ1BVX0ZUUlNfRTMwMEMyIHwKKwkgICAgQ1BVX0ZUUlNfQ0xBU1NJQzMyIHwKICNlbHNlCiAJICAgIENQVV9GVFJTX0dFTkVSSUNfMzIgfAogI2VuZGlmCkBAIC0zOTYsNyArNDEwLDggQEAKIAkgICAgQ1BVX0ZUUlNfNzQ1MF8yMSAmIENQVV9GVFJTXzc0NTBfMjMgJiBDUFVfRlRSU183NDU1XzEgJgogCSAgICBDUFVfRlRSU183NDU1XzIwICYgQ1BVX0ZUUlNfNzQ1NSAmIENQVV9GVFJTXzc0NDdfMTAgJgogCSAgICBDUFVfRlRSU183NDQ3ICYgQ1BVX0ZUUlNfNzQ0N0EgJiBDUFVfRlRSU184MlhYICYKLQkgICAgQ1BVX0ZUUlNfRzJfTEUgJiBDUFVfRlRSU19FMzAwICYgQ1BVX0ZUUlNfQ0xBU1NJQzMyICYKKwkgICAgQ1BVX0ZUUlNfRzJfTEUgJiBDUFVfRlRSU19FMzAwICYgQ1BVX0ZUUlNfRTMwMEMyICYKKwkgICAgQ1BVX0ZUUlNfQ0xBU1NJQzMyICYKICNlbHNlCiAJICAgIENQVV9GVFJTX0dFTkVSSUNfMzIgJgogI2VuZGlmCkBAIC00MzEsMjkgKzQ0NiwxMiBAQAogCiAjaWZkZWYgX19BU1NFTUJMWV9fCiAKLSNkZWZpbmUgQkVHSU5fRlRSX1NFQ1RJT04JCTk4OgotCi0jaWZuZGVmIF9fcG93ZXJwYzY0X18KKyNkZWZpbmUgQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKGxhYmVsKQlsYWJlbDoKKyNkZWZpbmUgQkVHSU5fRlRSX1NFQ1RJT04JCUJFR0lOX0ZUUl9TRUNUSU9OX05FU1RFRCg5NykKKyNkZWZpbmUgRU5EX0ZUUl9TRUNUSU9OX05FU1RFRChtc2ssIHZhbCwgbGFiZWwpIFwKKwlNQUtFX0ZUUl9TRUNUSU9OX0VOVFJZKG1zaywgdmFsLCBsYWJlbCwgX19mdHJfZml4dXApCiAjZGVmaW5lIEVORF9GVFJfU0VDVElPTihtc2ssIHZhbCkJCVwKLTk5OgkJCQkJCVwKLQkuc2VjdGlvbiBfX2Z0cl9maXh1cCwiYSI7CQlcCi0JLmFsaWduIDI7CQkJCVwKLQkubG9uZyBtc2s7CQkJCVwKLQkubG9uZyB2YWw7CQkJCVwKLQkubG9uZyA5OGI7CQkJCVwKLQkubG9uZyA5OWI7CQkJCVwKLQkucHJldmlvdXMKLSNlbHNlIC8qIF9fcG93ZXJwYzY0X18gKi8KLSNkZWZpbmUgRU5EX0ZUUl9TRUNUSU9OKG1zaywgdmFsKQkJXAotOTk6CQkJCQkJXAotCS5zZWN0aW9uIF9fZnRyX2ZpeHVwLCJhIjsJCVwKLQkuYWxpZ24gMzsJCQkJXAotCS5sbG9uZyBtc2s7CQkJCVwKLQkubGxvbmcgdmFsOwkJCQlcCi0JLmxsb25nIDk4YjsJCQkJXAotCS5sbG9uZyA5OWI7CSAJCQlcCi0JLnByZXZpb3VzCi0jZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLworCUVORF9GVFJfU0VDVElPTl9ORVNURUQobXNrLCB2YWwsIDk3KQogCiAjZGVmaW5lIEVORF9GVFJfU0VDVElPTl9JRlNFVChtc2spCUVORF9GVFJfU0VDVElPTigobXNrKSwgKG1zaykpCiAjZGVmaW5lIEVORF9GVFJfU0VDVElPTl9JRkNMUihtc2spCUVORF9GVFJfU0VDVElPTigobXNrKSwgMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3VycmVudC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jdXJyZW50LmgKaW5kZXggMTkzOGQ2YWIuLmI4NzA4YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3VycmVudC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3VycmVudC5oCkBAIC0xNCw3ICsxNCwxNyBAQAogI2lmZGVmIF9fcG93ZXJwYzY0X18KICNpbmNsdWRlIDxhc20vcGFjYS5oPgogCi0jZGVmaW5lIGN1cnJlbnQJCShnZXRfcGFjYSgpLT5fX2N1cnJlbnQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqZ2V0X2N1cnJlbnQodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGQgJTAsJTEoMTMpIgorCTogIj1yIiAodGFzaykKKwk6ICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBfX2N1cnJlbnQpKSk7CisKKwlyZXR1cm4gdGFzazsKK30KKyNkZWZpbmUgY3VycmVudAlnZXRfY3VycmVudCgpCiAKICNlbHNlCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZGJkbWEuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGJkbWEuaAppbmRleCA4OTczNTY1Li5lMjNmMDdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RiZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kYmRtYS5oCkBAIC05NSw3ICs5NSwxMyBAQAogI2RlZmluZSBEQkRNQV9ET19TVE9QKHJlZ3MpIGRvIHsJCQkJXAogCW91dF9sZTMyKCYoKHJlZ3MpLT5jb250cm9sKSwgKFJVTnxGTFVTSCk8PDE2KTsJCVwKIAl3aGlsZShpbl9sZTMyKCYoKHJlZ3MpLT5zdGF0dXMpKSAmIChBQ1RJVkV8RkxVU0gpKQlcCi0JCTsJCQkJCQlcCisJCTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIERCRE1BX0RPX1JFU0VUKHJlZ3MpIGRvIHsJCQkJXAorCW91dF9sZTMyKCYoKHJlZ3MpLT5jb250cm9sKSwgKEFDVElWRXxERUFEfFdBS0V8RkxVU0h8UEFVU0V8UlVOKTw8MTYpO1wKKwl3aGlsZShpbl9sZTMyKCYoKHJlZ3MpLT5zdGF0dXMpKSAmIChSVU4pKSBcCisJCTsgXAogfSB3aGlsZSgwKQogCiAjZW5kaWYgLyogX0FTTV9EQkRNQV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kY3ItbW1pby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kY3ItbW1pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmZjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Rjci1tbWlvLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KKyAqICAgICAgICAgICAgICAgICAgICA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX0RDUl9NTUlPX0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0RDUl9NTUlPX0gKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKwordHlwZWRlZiBzdHJ1Y3QgeyB2b2lkIF9faW9tZW0gKnRva2VuOyB1bnNpZ25lZCBpbnQgc3RyaWRlOyB9IGRjcl9ob3N0X3Q7CisKKyNkZWZpbmUgRENSX01BUF9PSyhob3N0KQkoKGhvc3QpLnRva2VuICE9IE5VTEwpCisKK2V4dGVybiBkY3JfaG9zdF90IGRjcl9tYXAoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIHVuc2lnbmVkIGludCBkY3JfbiwKKwkJCSAgdW5zaWduZWQgaW50IGRjcl9jKTsKK2V4dGVybiB2b2lkIGRjcl91bm1hcChkY3JfaG9zdF90IGhvc3QsIHVuc2lnbmVkIGludCBkY3JfbiwgdW5zaWduZWQgaW50IGRjcl9jKTsKKworc3RhdGljIGlubGluZSB1MzIgZGNyX3JlYWQoZGNyX2hvc3RfdCBob3N0LCB1bnNpZ25lZCBpbnQgZGNyX24pCit7CisJcmV0dXJuIGluX2JlMzIoaG9zdC50b2tlbiArIGRjcl9uICogaG9zdC5zdHJpZGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGNyX3dyaXRlKGRjcl9ob3N0X3QgaG9zdCwgdW5zaWduZWQgaW50IGRjcl9uLCB1MzIgdmFsdWUpCit7CisJb3V0X2JlMzIoaG9zdC50b2tlbiArIGRjcl9uICogaG9zdC5zdHJpZGUsIHZhbHVlKTsKK30KKworZXh0ZXJuIHU2NCBvZl90cmFuc2xhdGVfZGNyX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsCisJCQkJICAgIHVuc2lnbmVkIGludCBkY3JfbiwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpzdHJpZGUpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19EQ1JfTU1JT19IICovCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kY3ItbmF0aXZlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Rjci1uYXRpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2ExYmMxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kY3ItbmF0aXZlLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KKyAqICAgICAgICAgICAgICAgICAgICA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX0RDUl9OQVRJVkVfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfRENSX05BVElWRV9ICisjaWZkZWYgX19LRVJORUxfXworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwordHlwZWRlZiBzdHJ1Y3Qge30gZGNyX2hvc3RfdDsKKworI2RlZmluZSBEQ1JfTUFQX09LKGhvc3QpCSgxKQorCisjZGVmaW5lIGRjcl9tYXAoZGV2LCBkY3JfbiwgZGNyX2MpCXt9CisjZGVmaW5lIGRjcl91bm1hcChob3N0LCBkY3JfbiwgZGNyX2MpCXt9CisjZGVmaW5lIGRjcl9yZWFkKGhvc3QsIGRjcl9uKQkJbWZkY3IoZGNyX24pCisjZGVmaW5lIGRjcl93cml0ZShob3N0LCBkY3JfbiwgdmFsdWUpCW10ZGNyKGRjcl9uLCB2YWx1ZSkKKworLyogRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXJzICovCit2b2lkIF9fbXRkY3IoaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCk7Cit1bnNpZ25lZCBpbnQgX19tZmRjcihpbnQgcmVnKTsKKyNkZWZpbmUgbWZkY3Iocm4pCQkJCQkJXAorCSh7dW5zaWduZWQgaW50IHJ2YWw7CQkJCQlcCisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHJuKSkJCQkJXAorCQlhc20gdm9sYXRpbGUoIm1mZGNyICUwLCIgX19zdHJpbmdpZnkocm4pCVwKKwkJICAgICAgICAgICAgICA6ICI9ciIgKHJ2YWwpKTsJCQlcCisJZWxzZQkJCQkJCQlcCisJCXJ2YWwgPSBfX21mZGNyKHJuKTsJCQkJXAorCXJ2YWw7fSkKKworI2RlZmluZSBtdGRjcihybiwgdikJCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHJuKSkJCQkJXAorCQlhc20gdm9sYXRpbGUoIm10ZGNyICIgX19zdHJpbmdpZnkocm4pICIsJTAiCVwKKwkJCSAgICAgIDogOiAiciIgKHYpKTsgCQkJXAorCWVsc2UJCQkJCQkJXAorCQlfX210ZGNyKHJuLCB2KTsJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFIvVyBvZiBpbmRpcmVjdCBEQ1JzIG1ha2UgdXNlIG9mIHN0YW5kYXJkIG5hbWluZyBjb252ZW50aW9ucyBmb3IgRENScyAqLworI2RlZmluZSBtZmRjcmkoYmFzZSwgcmVnKQkJCVwKKyh7CQkJCQkJXAorCW10ZGNyKGJhc2UgIyMgX0NGR0FERFIsIGJhc2UgIyMgXyAjIyByZWcpOwlcCisJbWZkY3IoYmFzZSAjIyBfQ0ZHREFUQSk7CQkJXAorfSkKKworI2RlZmluZSBtdGRjcmkoYmFzZSwgcmVnLCBkYXRhKQkJCVwKK2RvIHsJCQkJCQlcCisJbXRkY3IoYmFzZSAjIyBfQ0ZHQUREUiwgYmFzZSAjIyBfICMjIHJlZyk7CVwKKwltdGRjcihiYXNlICMjIF9DRkdEQVRBLCBkYXRhKTsJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0RDUl9OQVRJVkVfSCAqLworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZGNyLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Rjci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmM1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Rjci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDYgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAuCisgKiAgICAgICAgICAgICAgICAgICAgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9BU01fUE9XRVJQQ19EQ1JfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfRENSX0gKKyNpZmRlZiBfX0tFUk5FTF9fCisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKworI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQorI2luY2x1ZGUgPGFzbS9kY3ItbmF0aXZlLmg+CisjZWxzZQorI2luY2x1ZGUgPGFzbS9kY3ItbW1pby5oPgorI2VuZGlmCisKKy8qCisgKiBPbiBDT05GSUdfUFBDX01FUkdFLCB3ZSBoYXZlIGFkZGl0aW9uYWwgaGVscGVycyB0byByZWFkIHRoZSBEQ1IKKyAqIGJhc2UgZnJvbSB0aGUgZGV2aWNlLXRyZWUKKyAqLworI2lmZGVmIENPTkZJR19QUENfTUVSR0UKK2V4dGVybiB1bnNpZ25lZCBpbnQgZGNyX3Jlc291cmNlX3N0YXJ0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBpbmRleCk7CitleHRlcm4gdW5zaWduZWQgaW50IGRjcl9yZXNvdXJjZV9sZW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBpbmRleCk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19NRVJHRSAqLworCisjZW5kaWYgLyogQ09ORklHX1BQQ19EQ1IgKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0RDUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RldmljZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhhYjJhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kZXZpY2UuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpZm5kZWYgX0FTTV9QT1dFUlBDX0RFVklDRV9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19ERVZJQ0VfSAorCitzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzOworc3RydWN0IGRldmljZV9ub2RlOworCitzdHJ1Y3QgZGV2X2FyY2hkYXRhIHsKKwkvKiBPcHRpb25hbCBwb2ludGVyIHRvIGFuIE9GIGRldmljZSBub2RlICovCisJc3RydWN0IGRldmljZV9ub2RlCSpvZl9ub2RlOworCisJLyogRE1BIG9wZXJhdGlvbnMgb24gdGhhdCBkZXZpY2UgKi8KKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzCSpkbWFfb3BzOworCXZvaWQJCQkqZG1hX2RhdGE7CisKKwkvKiBOVU1BIG5vZGUgaWYgYXBwbGljYWJsZSAqLworCWludAkJCW51bWFfbm9kZTsKK307CisKKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZG1hLW1hcHBpbmcuaAppbmRleCAyYWI5YmFmLi43YzdkZTg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kbWEtbWFwcGluZy5oCkBAIC00NCwyNiArNDQsMTUwIEBACiAjZW5kaWYgLyogISBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFICovCiAKICNpZmRlZiBDT05GSUdfUFBDNjQKKy8qCisgKiBETUEgb3BlcmF0aW9ucyBhcmUgYWJzdHJhY3RlZCBmb3IgRzUgdnMuIGkvcFNlcmllcywgUENJIHZzLiBWSU8KKyAqLworc3RydWN0IGRtYV9tYXBwaW5nX29wcyB7CisJdm9pZCAqCQkoKmFsbG9jX2NvaGVyZW50KShzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWcpOworCXZvaWQJCSgqZnJlZV9jb2hlcmVudCkoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQl2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKKwlkbWFfYWRkcl90CSgqbWFwX3NpbmdsZSkoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsCisJCQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJdm9pZAkJKCp1bm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwlpbnQJCSgqbWFwX3NnKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCXZvaWQJCSgqdW5tYXBfc2cpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJaW50CQkoKmRtYV9zdXBwb3J0ZWQpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOworCWludAkJKCpkYWNfZG1hX3N1cHBvcnRlZCkoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CisJaW50CQkoKnNldF9kbWFfbWFzaykoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spOworfTsKIAotZXh0ZXJuIGludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOwotZXh0ZXJuIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spOwotZXh0ZXJuIHZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAotCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKTsKLWV4dGVybiB2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLAotCQlkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwotZXh0ZXJuIGRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpjcHVfYWRkciwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7Ci1leHRlcm4gdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7Ci1leHRlcm4gZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwotZXh0ZXJuIHZvaWQgZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLAotCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKLWV4dGVybiBpbnQgZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKLWV4dGVybiB2b2lkIGRtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCWludCBuaHdlbnRyaWVzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpnZXRfZG1hX29wcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyogV2UgZG9uJ3QgaGFuZGxlIHRoZSBOVUxMIGRldiBjYXNlIGZvciBJU0EgZm9yIG5vdy4gV2UgY291bGQKKwkgKiBkbyBpdCB2aWEgYW4gb3V0IG9mIGxpbmUgY2FsbCBidXQgaXQgaXMgbm90IG5lZWRlZCBmb3Igbm93LiBUaGUKKwkgKiBvbmx5IElTQSBETUEgZGV2aWNlIHdlIHN1cHBvcnQgaXMgdGhlIGZsb3BweSBhbmQgd2UgaGF2ZSBhIGhhY2sKKwkgKiBpbiB0aGUgZmxvcHB5IGRyaXZlciBkaXJlY3RseSB0byBnZXQgYSBkZXZpY2UgZm9yIHVzLgorCSAqLworCWlmICh1bmxpa2VseShkZXYgPT0gTlVMTCB8fCBkZXYtPmFyY2hkYXRhLmRtYV9vcHMgPT0gTlVMTCkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBkZXYtPmFyY2hkYXRhLmRtYV9vcHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCWlmICh1bmxpa2VseShkbWFfb3BzID09IE5VTEwpKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hX29wcy0+ZG1hX3N1cHBvcnRlZCA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gZG1hX29wcy0+ZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spCit7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlpZiAodW5saWtlbHkoZG1hX29wcyA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGRtYV9vcHMtPnNldF9kbWFfbWFzayAhPSBOVUxMKQorCQlyZXR1cm4gZG1hX29wcy0+c2V0X2RtYV9tYXNrKGRldiwgZG1hX21hc2spOworCWlmICghZGV2LT5kbWFfbWFzayB8fCAhZG1hX3N1cHBvcnRlZChkZXYsICpkZXYtPmRtYV9tYXNrKSkKKwkJcmV0dXJuIC1FSU87CisJKmRldi0+ZG1hX21hc2sgPSBkbWFfbWFzazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighZG1hX29wcyk7CisJcmV0dXJuIGRtYV9vcHMtPmFsbG9jX2NvaGVyZW50KGRldiwgc2l6ZSwgZG1hX2hhbmRsZSwgZmxhZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighZG1hX29wcyk7CisJZG1hX29wcy0+ZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIGNwdV9hZGRyLCBkbWFfaGFuZGxlKTsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqY3B1X2FkZHIsCisJCQkJCXNpemVfdCBzaXplLAorCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIWRtYV9vcHMpOworCXJldHVybiBkbWFfb3BzLT5tYXBfc2luZ2xlKGRldiwgY3B1X2FkZHIsIHNpemUsIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCQkgICAgc2l6ZV90IHNpemUsCisJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighZG1hX29wcyk7CisJZG1hX29wcy0+dW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJQlVHX09OKCFkbWFfb3BzKTsKKwlyZXR1cm4gZG1hX29wcy0+bWFwX3NpbmdsZShkZXYsIHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgc2l6ZSwKKwkJCWRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsCisJCQkJICBzaXplX3Qgc2l6ZSwKKwkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighZG1hX29wcyk7CisJZG1hX29wcy0+dW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHJlc3MsIHNpemUsIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKworCUJVR19PTighZG1hX29wcyk7CisJcmV0dXJuIGRtYV9vcHMtPm1hcF9zZyhkZXYsIHNnLCBuZW50cywgZGlyZWN0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJaW50IG5od2VudHJpZXMsCisJCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJQlVHX09OKCFkbWFfb3BzKTsKKwlkbWFfb3BzLT51bm1hcF9zZyhkZXYsIHNnLCBuaHdlbnRyaWVzLCBkaXJlY3Rpb24pOworfQorCisKKy8qCisgKiBBdmFpbGFibGUgZ2VuZXJpYyBzZXRzIG9mIG9wZXJhdGlvbnMKKyAqLworZXh0ZXJuIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgZG1hX2lvbW11X29wczsKK2V4dGVybiBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGRtYV9kaXJlY3Rfb3BzOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBkbWFfZGlyZWN0X29mZnNldDsKIAogI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCiAKQEAgLTIxOCw5ICszNDIsOSBAQAogI2RlZmluZSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoZCwgcywgaCwgZikgZG1hX2FsbG9jX2NvaGVyZW50KGQsIHMsIGgsIGYpCiAjZGVmaW5lIGRtYV9mcmVlX25vbmNvaGVyZW50KGQsIHMsIHYsIGgpIGRtYV9mcmVlX2NvaGVyZW50KGQsIHMsIHYsIGgpCiAjaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkKQkoMCkKKyNkZWZpbmUgZG1hX2lzX2NvbnNpc3RlbnQoZCwgaCkJKDApCiAjZWxzZQotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkKQkoMSkKKyNkZWZpbmUgZG1hX2lzX2NvbnNpc3RlbnQoZCwgaCkJKDEpCiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQodm9pZCkKQEAgLTI1NCwzMiArMzc4LDEyIEBACiAJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBkbWFfaGFuZGxlLCBvZmZzZXQgKyBzaXplLCBkaXJlY3Rpb24pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAorc3RhdGljIGlubGluZSB2b2lkIGRtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CiAJX19kbWFfc3luYyh2YWRkciwgc2l6ZSwgKGludClkaXJlY3Rpb24pOwogfQogCi0vKgotICogRE1BIG9wZXJhdGlvbnMgYXJlIGFic3RyYWN0ZWQgZm9yIEc1IHZzLiBpL3BTZXJpZXMsIFBDSSB2cy4gVklPCi0gKi8KLXN0cnVjdCBkbWFfbWFwcGluZ19vcHMgewotCXZvaWQgKgkJKCphbGxvY19jb2hlcmVudCkoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKTsKLQl2b2lkCQkoKmZyZWVfY29oZXJlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JCQkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7Ci0JZG1hX2FkZHJfdAkoKm1hcF9zaW5nbGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLAotCQkJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwotCXZvaWQJCSgqdW5tYXBfc2luZ2xlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCi0JCQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7Ci0JaW50CQkoKm1hcF9zZykoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJCWludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKLQl2b2lkCQkoKnVubWFwX3NnKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwotCWludAkJKCpkbWFfc3VwcG9ydGVkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKLQlpbnQJCSgqZGFjX2RtYV9zdXBwb3J0ZWQpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spOwotfTsKLQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfQVNNX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VlaC5oCmluZGV4IDZhNzg0MzkuLmI4ODZiZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWguaApAQCAtMTIwLDEwICsxMjAsNiBAQAogCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgdmFsKTsKIAlyZXR1cm4gdmFsOwogfQotc3RhdGljIGlubGluZSB2b2lkIGVlaF93cml0ZWIodTggdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0Jb3V0XzgoYWRkciwgdmFsKTsKLX0KIAogc3RhdGljIGlubGluZSB1MTYgZWVoX3JlYWR3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKQEAgLTEzMiwyMSArMTI4LDYgQEAKIAkJcmV0dXJuIGVlaF9jaGVja19mYWlsdXJlKGFkZHIsIHZhbCk7CiAJcmV0dXJuIHZhbDsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfd3JpdGV3KHUxNiB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlvdXRfbGUxNihhZGRyLCB2YWwpOwotfQotc3RhdGljIGlubGluZSB1MTYgZWVoX3Jhd19yZWFkdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JdTE2IHZhbCA9IGluX2JlMTYoYWRkcik7Ci0JaWYgKEVFSF9QT1NTSUJMRV9FUlJPUih2YWwsIHUxNikpCi0JCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZShhZGRyLCB2YWwpOwotCXJldHVybiB2YWw7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX3Jhd193cml0ZXcodTE2IHZhbCwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKSB7Ci0Jdm9sYXRpbGUgdTE2IF9faW9tZW0gKnZhZGRyID0gKHZvbGF0aWxlIHUxNiBfX2lvbWVtICopIGFkZHI7Ci0Jb3V0X2JlMTYodmFkZHIsIHZhbCk7Ci19CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGVlaF9yZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CkBAIC0xNTUsMjEgKzEzNiw2IEBACiAJCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZShhZGRyLCB2YWwpOwogCXJldHVybiB2YWw7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX3dyaXRlbCh1MzIgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0Jb3V0X2xlMzIoYWRkciwgdmFsKTsKLX0KLXN0YXRpYyBpbmxpbmUgdTMyIGVlaF9yYXdfcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQotewotCXUzMiB2YWwgPSBpbl9iZTMyKGFkZHIpOwotCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1MzIpKQotCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotc3RhdGljIGlubGluZSB2b2lkIGVlaF9yYXdfd3JpdGVsKHUzMiB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlvdXRfYmUzMihhZGRyLCB2YWwpOwotfQogCiBzdGF0aWMgaW5saW5lIHU2NCBlZWhfcmVhZHEoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewpAQCAtMTc4LDE4MiArMTQ0LDY3IEBACiAJCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZShhZGRyLCB2YWwpOwogCXJldHVybiB2YWw7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX3dyaXRlcSh1NjQgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCisKK3N0YXRpYyBpbmxpbmUgdTE2IGVlaF9yZWFkd19iZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0Jb3V0X2xlNjQoYWRkciwgdmFsKTsKKwl1MTYgdmFsID0gaW5fYmUxNihhZGRyKTsKKwlpZiAoRUVIX1BPU1NJQkxFX0VSUk9SKHZhbCwgdTE2KSkKKwkJcmV0dXJuIGVlaF9jaGVja19mYWlsdXJlKGFkZHIsIHZhbCk7CisJcmV0dXJuIHZhbDsKIH0KLXN0YXRpYyBpbmxpbmUgdTY0IGVlaF9yYXdfcmVhZHEoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorCitzdGF0aWMgaW5saW5lIHUzMiBlZWhfcmVhZGxfYmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXUzMiB2YWwgPSBpbl9iZTMyKGFkZHIpOworCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1MzIpKQorCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBlZWhfcmVhZHFfYmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXU2NCB2YWwgPSBpbl9iZTY0KGFkZHIpOwogCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1NjQpKQogCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgdmFsKTsKIAlyZXR1cm4gdmFsOwogfQotc3RhdGljIGlubGluZSB2b2lkIGVlaF9yYXdfd3JpdGVxKHU2NCB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlvdXRfYmU2NChhZGRyLCB2YWwpOwotfQogCi0jZGVmaW5lIEVFSF9DSEVDS19BTElHTih2LGEpIFwKLQkoKCgodW5zaWduZWQgbG9uZykodikpICYgKChhKSAtIDEpKSA9PSAwKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX21lbXNldF9pbyh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIGludCBjLAotCQkJCSB1bnNpZ25lZCBsb25nIG4pCi17Ci0Jdm9pZCAqcCA9ICh2b2lkIF9fZm9yY2UgKilhZGRyOwotCXUzMiBsYyA9IGM7Ci0JbGMgfD0gbGMgPDwgODsKLQlsYyB8PSBsYyA8PCAxNjsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwotCXdoaWxlKG4gJiYgIUVFSF9DSEVDS19BTElHTihwLCA0KSkgewotCQkqKCh2b2xhdGlsZSB1OCAqKXApID0gYzsKLQkJcCsrOwotCQluLS07Ci0JfQotCXdoaWxlKG4gPj0gNCkgewotCQkqKCh2b2xhdGlsZSB1MzIgKilwKSA9IGxjOwotCQlwICs9IDQ7Ci0JCW4gLT0gNDsKLQl9Ci0Jd2hpbGUobikgewotCQkqKCh2b2xhdGlsZSB1OCAqKXApID0gYzsKLQkJcCsrOwotCQluLS07Ci0JfQotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwotfQotc3RhdGljIGlubGluZSB2b2lkIGVlaF9tZW1jcHlfZnJvbWlvKHZvaWQgKmRlc3QsIGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3JjLAorc3RhdGljIGlubGluZSB2b2lkIGVlaF9tZW1jcHlfZnJvbWlvKHZvaWQgKmRlc3QsIGNvbnN0CisJCQkJICAgICB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbikKIHsKLQl2b2lkICp2c3JjID0gKHZvaWQgX19mb3JjZSAqKSBzcmM7Ci0Jdm9pZCAqZGVzdHNhdmUgPSBkZXN0OwotCXVuc2lnbmVkIGxvbmcgbnNhdmUgPSBuOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7Ci0Jd2hpbGUobiAmJiAoIUVFSF9DSEVDS19BTElHTih2c3JjLCA0KSB8fCAhRUVIX0NIRUNLX0FMSUdOKGRlc3QsIDQpKSkgewotCQkqKCh1OCAqKWRlc3QpID0gKigodm9sYXRpbGUgdTggKil2c3JjKTsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOwotCQl2c3JjKys7Ci0JCWRlc3QrKzsKLQkJbi0tOwotCX0KLQl3aGlsZShuID4gNCkgewotCQkqKCh1MzIgKilkZXN0KSA9ICooKHZvbGF0aWxlIHUzMiAqKXZzcmMpOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7Ci0JCXZzcmMgKz0gNDsKLQkJZGVzdCArPSA0OwotCQluIC09IDQ7Ci0JfQotCXdoaWxlKG4pIHsKLQkJKigodTggKilkZXN0KSA9ICooKHZvbGF0aWxlIHU4ICopdnNyYyk7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKLQkJdnNyYysrOwotCQlkZXN0Kys7Ci0JCW4tLTsKLQl9Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJX21lbWNweV9mcm9taW8oZGVzdCwgc3JjLCBuKTsKIAogCS8qIExvb2sgZm9yIGZmZmYncyBoZXJlIGF0IGRlc3Rbbl0uICBBc3N1bWUgdGhhdCBhdCBsZWFzdCA0IGJ5dGVzCiAJICogd2VyZSBjb3BpZWQuIENoZWNrIGFsbCBmb3VyIGJ5dGVzLgogCSAqLwotCWlmICgobnNhdmUgPj0gNCkgJiYKLQkJKEVFSF9QT1NTSUJMRV9FUlJPUigoKigodTMyICopIGRlc3RzYXZlK25zYXZlLTQpKSwgdTMyKSkpIHsKLQkJZWVoX2NoZWNrX2ZhaWx1cmUoc3JjLCAoKigodTMyICopIGRlc3RzYXZlK25zYXZlLTQpKSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX21lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgbikKLXsKLQl2b2lkICp2ZGVzdCA9ICh2b2lkIF9fZm9yY2UgKikgZGVzdDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwotCXdoaWxlKG4gJiYgKCFFRUhfQ0hFQ0tfQUxJR04odmRlc3QsIDQpIHx8ICFFRUhfQ0hFQ0tfQUxJR04oc3JjLCA0KSkpIHsKLQkJKigodm9sYXRpbGUgdTggKil2ZGVzdCkgPSAqKCh1OCAqKXNyYyk7Ci0JCXNyYysrOwotCQl2ZGVzdCsrOwotCQluLS07Ci0JfQotCXdoaWxlKG4gPiA0KSB7Ci0JCSooKHZvbGF0aWxlIHUzMiAqKXZkZXN0KSA9ICooKHZvbGF0aWxlIHUzMiAqKXNyYyk7Ci0JCXNyYyArPSA0OwotCQl2ZGVzdCArPSA0OwotCQluLT00OwotCX0KLQl3aGlsZShuKSB7Ci0JCSooKHZvbGF0aWxlIHU4ICopdmRlc3QpID0gKigodTggKilzcmMpOwotCQlzcmMrKzsKLQkJdmRlc3QrKzsKLQkJbi0tOwotCX0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKLX0KLQotI3VuZGVmIEVFSF9DSEVDS19BTElHTgotCi1zdGF0aWMgaW5saW5lIHU4IGVlaF9pbmIodW5zaWduZWQgbG9uZyBwb3J0KQotewotCXU4IHZhbDsKLQl2YWwgPSBpbl84KCh1OCBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpKTsKLQlpZiAoRUVIX1BPU1NJQkxFX0VSUk9SKHZhbCwgdTgpKQotCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoKHZvaWQgX19pb21lbSAqKShwb3J0KSwgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX291dGIodTggdmFsLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0Jb3V0XzgoKHU4IF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSksIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IGVlaF9pbncodW5zaWduZWQgbG9uZyBwb3J0KQotewotCXUxNiB2YWw7Ci0JdmFsID0gaW5fbGUxNigodTE2IF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSkpOwotCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1MTYpKQotCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoKHZvaWQgX19pb21lbSAqKShwb3J0KSwgdmFsKTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWVoX291dHcodTE2IHZhbCwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCW91dF9sZTE2KCh1MTYgX19pb21lbSAqKShwb3J0K3BjaV9pb19iYXNlKSwgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgZWVoX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JdTMyIHZhbDsKLQl2YWwgPSBpbl9sZTMyKCh1MzIgX19pb21lbSAqKShwb3J0K3BjaV9pb19iYXNlKSk7Ci0JaWYgKEVFSF9QT1NTSUJMRV9FUlJPUih2YWwsIHUzMikpCi0JCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZSgodm9pZCBfX2lvbWVtICopKHBvcnQpLCB2YWwpOwotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfb3V0bCh1MzIgdmFsLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0Jb3V0X2xlMzIoKHUzMiBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpLCB2YWwpOworCWlmIChuID49IDQgJiYgRUVIX1BPU1NJQkxFX0VSUk9SKCooKHUzMiAqKShkZXN0ICsgbiAtIDQpKSwgdTMyKSkKKwkJZWVoX2NoZWNrX2ZhaWx1cmUoc3JjLCAqKCh1MzIgKikoZGVzdCArIG4gLSA0KSkpOwogfQogCiAvKiBpbi1zdHJpbmcgZWVoIG1hY3JvcyAqLwotc3RhdGljIGlubGluZSB2b2lkIGVlaF9pbnNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqIGJ1ZiwgaW50IG5zKQorc3RhdGljIGlubGluZSB2b2lkIGVlaF9yZWFkc2IoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICogYnVmLAorCQkJICAgICAgaW50IG5zKQogewotCV9pbnNiKCh1OCBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpLCBidWYsIG5zKTsKKwlfaW5zYihhZGRyLCBidWYsIG5zKTsKIAlpZiAoRUVIX1BPU1NJQkxFX0VSUk9SKCgqKCgodTgqKWJ1ZikrbnMtMSkpLCB1OCkpCi0JCWVlaF9jaGVja19mYWlsdXJlKCh2b2lkIF9faW9tZW0gKikocG9ydCksICoodTgqKWJ1Zik7CisJCWVlaF9jaGVja19mYWlsdXJlKGFkZHIsICoodTgqKWJ1Zik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfaW5zd19ucyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKiBidWYsIGludCBucykKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZWhfcmVhZHN3KGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqIGJ1ZiwKKwkJCSAgICAgIGludCBucykKIHsKLQlfaW5zd19ucygodTE2IF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSksIGJ1ZiwgbnMpOworCV9pbnN3KGFkZHIsIGJ1ZiwgbnMpOwogCWlmIChFRUhfUE9TU0lCTEVfRVJST1IoKCooKCh1MTYqKWJ1ZikrbnMtMSkpLCB1MTYpKQotCQllZWhfY2hlY2tfZmFpbHVyZSgodm9pZCBfX2lvbWVtICopKHBvcnQpLCAqKHUxNiopYnVmKTsKKwkJZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgKih1MTYqKWJ1Zik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfaW5zbF9ucyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKiBidWYsIGludCBubCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZWhfcmVhZHNsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqIGJ1ZiwKKwkJCSAgICAgIGludCBubCkKIHsKLQlfaW5zbF9ucygodTMyIF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSksIGJ1ZiwgbmwpOworCV9pbnNsKGFkZHIsIGJ1ZiwgbmwpOwogCWlmIChFRUhfUE9TU0lCTEVfRVJST1IoKCooKCh1MzIqKWJ1ZikrbmwtMSkpLCB1MzIpKQotCQllZWhfY2hlY2tfZmFpbHVyZSgodm9pZCBfX2lvbWVtICopKHBvcnQpLCAqKHUzMiopYnVmKTsKKwkJZWVoX2NoZWNrX2ZhaWx1cmUoYWRkciwgKih1MzIqKWJ1Zik7CiB9CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lbGYuaAppbmRleCA5YTgzYTk4Li5kMzY0MjZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmgKQEAgLTEyNCwxMiArMTI0LDEwIEBACiAjIGRlZmluZSBFTEZfREFUQQlFTEZEQVRBMk1TQgogICB0eXBlZGVmIGVsZl9ncmVnX3Q2NCBlbGZfZ3JlZ190OwogICB0eXBlZGVmIGVsZl9ncmVnc2V0X3Q2NCBlbGZfZ3JlZ3NldF90OwotIyBkZWZpbmUgZWxmX2FkZHJfdCB1bnNpZ25lZCBsb25nCiAjZWxzZQogICAvKiBBc3N1bXB0aW9uOiBFTEZfQVJDSCA9PSBFTV9QUEMgYW5kIEVMRl9DTEFTUyA9PSBFTEZDTEFTUzMyICovCiAgIHR5cGVkZWYgZWxmX2dyZWdfdDMyIGVsZl9ncmVnX3Q7CiAgIHR5cGVkZWYgZWxmX2dyZWdzZXRfdDMyIGVsZl9ncmVnc2V0X3Q7Ci0jIGRlZmluZSBlbGZfYWRkcl90IF9fdTMyCiAjZW5kaWYgLyogRUxGX0FSQ0ggKi8KIAogLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCkBAIC00MTEsNCArNDA5LDE3IEBACiAvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLwogI2RlZmluZSBSX1BQQzY0X05VTQkJMTA3CiAKKyNpZmRlZiBDT05GSUdfU1BVX0JBU0UKKy8qIE5vdGVzIHVzZWQgaW4gRVRfQ09SRS4gTm90ZSBuYW1lIGlzICJTUFUvPGZkPi88ZmlsZW5hbWU+Ii4gKi8KKyNkZWZpbmUgTlRfU1BVCQkxCisKK2V4dGVybiBpbnQgYXJjaF9ub3Rlc19zaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgYXJjaF93cml0ZV9ub3RlcyhzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKKyNkZWZpbmUgRUxGX0NPUkVfRVhUUkFfTk9URVNfU0laRSBhcmNoX25vdGVzX3NpemUoKQorI2RlZmluZSBFTEZfQ09SRV9XUklURV9FWFRSQV9OT1RFUyBhcmNoX3dyaXRlX25vdGVzKGZpbGUpCisKKyNkZWZpbmUgQVJDSF9IQVZFX0VYVFJBX0VMRl9OT1RFUworI2VuZGlmIC8qIENPTkZJR19QUENfQ0VMTCAqLworCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0VMRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zpcm13YXJlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zpcm13YXJlLmgKaW5kZXggMTAyMjczNy4uOThmN2I2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9maXJtd2FyZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmlybXdhcmUuaApAQCAtNDIsNiArNDIsNyBAQAogI2RlZmluZSBGV19GRUFUVVJFX1NQTFBBUglBU01fQ09OU1QoMHgwMDAwMDAwMDAwMTAwMDAwKQogI2RlZmluZSBGV19GRUFUVVJFX0lTRVJJRVMJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDIwMDAwMCkKICNkZWZpbmUgRldfRkVBVFVSRV9MUEFSCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwNDAwMDAwKQorI2RlZmluZSBGV19GRUFUVVJFX1BTM19MVjEJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDgwMDAwMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtNTgsNiArNTksMTAgQEAKIAlGV19GRUFUVVJFX1BTRVJJRVNfQUxXQVlTID0gMCwKIAlGV19GRUFUVVJFX0lTRVJJRVNfUE9TU0lCTEUgPSBGV19GRUFUVVJFX0lTRVJJRVMgfCBGV19GRUFUVVJFX0xQQVIsCiAJRldfRkVBVFVSRV9JU0VSSUVTX0FMV0FZUyA9IEZXX0ZFQVRVUkVfSVNFUklFUyB8IEZXX0ZFQVRVUkVfTFBBUiwKKwlGV19GRUFUVVJFX1BTM19QT1NTSUJMRSA9IEZXX0ZFQVRVUkVfTFBBUiB8IEZXX0ZFQVRVUkVfUFMzX0xWMSwKKwlGV19GRUFUVVJFX1BTM19BTFdBWVMgPSBGV19GRUFUVVJFX0xQQVIgfCBGV19GRUFUVVJFX1BTM19MVjEsCisJRldfRkVBVFVSRV9OQVRJVkVfUE9TU0lCTEUgPSAwLAorCUZXX0ZFQVRVUkVfTkFUSVZFX0FMV0FZUyA9IDAsCiAJRldfRkVBVFVSRV9QT1NTSUJMRSA9CiAjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCiAJCUZXX0ZFQVRVUkVfUFNFUklFU19QT1NTSUJMRSB8CkBAIC02NSw2ICs3MCwxMiBAQAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogCQlGV19GRUFUVVJFX0lTRVJJRVNfUE9TU0lCTEUgfAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19QUzMKKwkJRldfRkVBVFVSRV9QUzNfUE9TU0lCTEUgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19OQVRJVkUKKwkJRldfRkVBVFVSRV9OQVRJVkVfQUxXQVlTIHwKKyNlbmRpZgogCQkwLAogCUZXX0ZFQVRVUkVfQUxXQVlTID0KICNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKQEAgLTczLDYgKzg0LDEyIEBACiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAJCUZXX0ZFQVRVUkVfSVNFUklFU19BTFdBWVMgJgogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19QUzMKKwkJRldfRkVBVFVSRV9QUzNfQUxXQVlTICYKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QUENfTkFUSVZFCisJCUZXX0ZFQVRVUkVfTkFUSVZFX0FMV0FZUyAmCisjZW5kaWYKIAkJRldfRkVBVFVSRV9QT1NTSUJMRSwKIAogI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCkBAIC05NiwxOSArMTEzLDE2IEBACiAvKiBUaGlzIGlzIHRydWUgaWYgd2UgYXJlIHVzaW5nIHRoZSBmaXJtd2FyZSBOTUkgaGFuZGxlciAodHlwaWNhbGx5IExQQVIpICovCiBleHRlcm4gaW50IGZ3bm1pX2FjdGl2ZTsKIAorZXh0ZXJuIHVuc2lnbmVkIGludCBfX3N0YXJ0X19fZndfZnRyX2ZpeHVwLCBfX3N0b3BfX19md19mdHJfZml4dXA7CisKICNlbHNlIC8qIF9fQVNTRU1CTFlfXyAqLwogCi0jZGVmaW5lIEJFR0lOX0ZXX0ZUUl9TRUNUSU9OCQk5NjoKLQorI2RlZmluZSBCRUdJTl9GV19GVFJfU0VDVElPTl9ORVNURUQobGFiZWwpCWxhYmVsOgorI2RlZmluZSBCRUdJTl9GV19GVFJfU0VDVElPTgkJCUJFR0lOX0ZXX0ZUUl9TRUNUSU9OX05FU1RFRCg5NykKKyNkZWZpbmUgRU5EX0ZXX0ZUUl9TRUNUSU9OX05FU1RFRChtc2ssIHZhbCwgbGFiZWwpIFwKKwlNQUtFX0ZUUl9TRUNUSU9OX0VOVFJZKG1zaywgdmFsLCBsYWJlbCwgX19md19mdHJfZml4dXApCiAjZGVmaW5lIEVORF9GV19GVFJfU0VDVElPTihtc2ssIHZhbCkJCVwKLTk3OgkJCQkJCVwKLQkuc2VjdGlvbiBfX2Z3X2Z0cl9maXh1cCwiYSI7CQlcCi0JLmFsaWduIDM7CQkJCVwKLQkubGxvbmcgbXNrOwkJCQlcCi0JLmxsb25nIHZhbDsJCQkJXAotCS5sbG9uZyA5NmI7CQkJCVwKLQkubGxvbmcgOTdiOwkJCQlcCi0JLnByZXZpb3VzCisJRU5EX0ZXX0ZUUl9TRUNUSU9OX05FU1RFRChtc2ssIHZhbCwgOTcpCiAKICNkZWZpbmUgRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGU0VUKG1zaykJRU5EX0ZXX0ZUUl9TRUNUSU9OKChtc2spLCAobXNrKSkKICNkZWZpbmUgRU5EX0ZXX0ZUUl9TRUNUSU9OX0lGQ0xSKG1zaykJRU5EX0ZXX0ZUUl9TRUNUSU9OKChtc2spLCAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mdXRleC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mdXRleC5oCmluZGV4IDkzNjQyMmUuLjNmMzY3M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZnV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Z1dGV4LmgKQEAgLTQzLDcgKzQzLDcgQEAKIAlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpbmNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBGVVRFWF9PUF9TRVQ6CkBAIC02NSw3ICs2NSw3IEBACiAJCXJldCA9IC1FTk9TWVM7CiAJfQogCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlpZiAoIXJldCkgewogCQlzd2l0Y2ggKGNtcCkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9od19pcnEuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHdfaXJxLmgKaW5kZXggZDQwMzU5Mi4uOWU0ZGQ5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9od19pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h3X2lycS5oCkBAIC03LDE2ICs3LDQwIEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKIGV4dGVybiB2b2lkIHRpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKIAotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUworI2lmZGVmIENPTkZJR19QUEM2NAorI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxvY2FsX2dldF9mbGFncyh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxvY2FsX2lycV9kaXNhYmxlKHZvaWQpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvY2FsX2dldF9mbGFncyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGJ6ICUwLCUxKDEzKSIKKwk6ICI9ciIgKGZsYWdzKQorCTogImkiIChvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNvZnRfZW5hYmxlZCkpKTsKKworCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvY2FsX2lycV9kaXNhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgemVybzsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsaSAlMSwwOyBsYnogJTAsJTIoMTMpOyBzdGIgJTEsJTIoMTMpIgorCTogIj1yIiAoZmxhZ3MpLCAiPSZyIiAoemVybykKKwk6ICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzb2Z0X2VuYWJsZWQpKQorCTogIm1lbW9yeSIpOworCisJcmV0dXJuIGZsYWdzOworfQorCiBleHRlcm4gdm9pZCBsb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIGlzZXJpZXNfaGFuZGxlX2ludGVycnVwdHModm9pZCk7CiAKICNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZSgpCWxvY2FsX2lycV9yZXN0b3JlKDEpCiAjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpCSgoZmxhZ3MpID0gbG9jYWxfZ2V0X2ZsYWdzKCkpCkBAIC0yNCwxNyArNDgsMTQgQEAKIAogI2RlZmluZSBpcnFzX2Rpc2FibGVkKCkJCShsb2NhbF9nZXRfZmxhZ3MoKSA9PSAwKQogCisjZGVmaW5lIGhhcmRfaXJxX2VuYWJsZSgpCV9fbXRtc3JkKG1mbXNyKCkgfCBNU1JfRUUsIDEpCisjZGVmaW5lIGhhcmRfaXJxX2Rpc2FibGUoKQlfX210bXNyZChtZm1zcigpICYgfk1TUl9FRSwgMSkKKwogI2Vsc2UKIAogI2lmIGRlZmluZWQoQ09ORklHX0JPT0tFKQogI2RlZmluZSBTRVRfTVNSX0VFKHgpCW10bXNyKHgpCiAjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKQlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3J0ZWUgJTAiIDogOiAiciIgKGZsYWdzKSA6ICJtZW1vcnkiKQotI2VsaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQotI2RlZmluZSBTRVRfTVNSX0VFKHgpCV9fbXRtc3JkKHgsIDEpCi0jZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKSBkbyB7IFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjogOiA6Im1lbW9yeSIpOyBcCi0JX19tdG1zcmQoKGZsYWdzKSwgMSk7IFwKLX0gd2hpbGUoMCkKICNlbHNlCiAjZGVmaW5lIFNFVF9NU1JfRUUoeCkJbXRtc3IoeCkKICNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpCW10bXNyKGZsYWdzKQpAQCAtODEsMjYgKzEwMiwxMCBAQAogI2RlZmluZSBsb2NhbF9pcnFfc2F2ZShmbGFncykJbG9jYWxfaXJxX3NhdmVfcHRyKCZmbGFncykKICNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkoKG1mbXNyKCkgJiBNU1JfRUUpID09IDApCiAKLSNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KKyNkZWZpbmUgaGFyZF9pcnFfZW5hYmxlKCkJbG9jYWxfaXJxX2VuYWJsZSgpCisjZGVmaW5lIGhhcmRfaXJxX2Rpc2FibGUoKQlsb2NhbF9pcnFfZGlzYWJsZSgpCiAKLSNkZWZpbmUgbWFza19pcnEoaXJxKQkJCQkJCVwKLQkoewkJCQkJCQlcCi0JIAlpcnFfZGVzY190ICpkZXNjID0gZ2V0X2lycV9kZXNjKGlycSk7CQlcCi0JCWlmIChkZXNjLT5jaGlwICYmIGRlc2MtPmNoaXAtPmRpc2FibGUpCVwKLQkJCWRlc2MtPmNoaXAtPmRpc2FibGUoaXJxKTsJCVwKLQl9KQotI2RlZmluZSB1bm1hc2tfaXJxKGlycSkJCQkJCQlcCi0JKHsJCQkJCQkJXAotCSAJaXJxX2Rlc2NfdCAqZGVzYyA9IGdldF9pcnFfZGVzYyhpcnEpOwkJXAotCQlpZiAoZGVzYy0+Y2hpcCAmJiBkZXNjLT5jaGlwLT5lbmFibGUpCVwKLQkJCWRlc2MtPmNoaXAtPmVuYWJsZShpcnEpOwkJXAotCX0pCi0jZGVmaW5lIGFja19pcnEoaXJxKQkJCQkJCVwKLQkoewkJCQkJCQlcCi0JIAlpcnFfZGVzY190ICpkZXNjID0gZ2V0X2lycV9kZXNjKGlycSk7CQlcCi0JCWlmIChkZXNjLT5jaGlwICYmIGRlc2MtPmNoaXAtPmFjaykJXAotCQkJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CQlcCi0JfSkKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogLyoKICAqIGludGVycnVwdC1yZXRyaWdnZXI6IHNob3VsZCB3ZSBoYW5kbGUgdGhpcyB2aWEgbG9zdCBpbnRlcnJ1cHRzIGFuZCBJUElzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2k4MjU5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2k4MjU5LmgKaW5kZXggNzg0ODlmYi4uZGIxMzYyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pODI1OS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaTgyNTkuaApAQCAtNyw2ICs3LDcgQEAKICNpZmRlZiBDT05GSUdfUFBDX01FUkdFCiBleHRlcm4gdm9pZCBpODI1OV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyBpbnRhY2tfYWRkcik7CiBleHRlcm4gdW5zaWduZWQgaW50IGk4MjU5X2lycSh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgaXJxX2hvc3QgKmk4MjU5X2dldF9ob3N0KHZvaWQpOwogI2Vsc2UKIGV4dGVybiB2b2lkIGk4MjU5X2luaXQodW5zaWduZWQgbG9uZyBpbnRhY2tfYWRkciwgaW50IG9mZnNldCk7CiBleHRlcm4gaW50IGk4MjU5X2lycSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaWJtZWJ1cy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pYm1lYnVzLmgKaW5kZXggMzQ5MzQyOWIuLjY2MTEyMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaWJtZWJ1cy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaWJtZWJ1cy5oCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogCi1leHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyBpYm1lYnVzX2RtYV9vcHM7CiBleHRlcm4gc3RydWN0IGJ1c190eXBlIGlibWVidXNfYnVzX3R5cGU7CiAKIHN0cnVjdCBpYm1lYnVzX2RldiB7CQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pZGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaWRlLmgKaW5kZXggYzgzOTBmOS4uMGY2NmYwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pZGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lkZS5oCkBAIC0yMiwxMCArMjIsMTAgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNkZWZpbmUgX19pZGVfbW1faW5zdyhwLCBhLCBjKQlfaW5zd19ucygodm9sYXRpbGUgdTE2IF9faW9tZW0gKikocCksIChhKSwgKGMpKQotI2RlZmluZSBfX2lkZV9tbV9pbnNsKHAsIGEsIGMpCV9pbnNsX25zKCh2b2xhdGlsZSB1MzIgX19pb21lbSAqKShwKSwgKGEpLCAoYykpCi0jZGVmaW5lIF9faWRlX21tX291dHN3KHAsIGEsIGMpCV9vdXRzd19ucygodm9sYXRpbGUgdTE2IF9faW9tZW0gKikocCksIChhKSwgKGMpKQotI2RlZmluZSBfX2lkZV9tbV9vdXRzbChwLCBhLCBjKQlfb3V0c2xfbnMoKHZvbGF0aWxlIHUzMiBfX2lvbWVtICopKHApLCAoYSksIChjKSkKKyNkZWZpbmUgX19pZGVfbW1faW5zdyhwLCBhLCBjKQlyZWFkc3coKHZvaWQgX19pb21lbSAqKShwKSwgKGEpLCAoYykpCisjZGVmaW5lIF9faWRlX21tX2luc2wocCwgYSwgYykJcmVhZHNsKCh2b2lkIF9faW9tZW0gKikocCksIChhKSwgKGMpKQorI2RlZmluZSBfX2lkZV9tbV9vdXRzdyhwLCBhLCBjKQl3cml0ZXN3KCh2b2lkIF9faW9tZW0gKikocCksIChhKSwgKGMpKQorI2RlZmluZSBfX2lkZV9tbV9vdXRzbChwLCBhLCBjKQl3cml0ZXNsKCh2b2lkIF9faW9tZW0gKikocCksIChhKSwgKGMpKQogCiAjaWZuZGVmICBfX3Bvd2VycGM2NF9fCiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW1tYXBfcWUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW1tYXBfcWUuaAppbmRleCBjZTEyZjg1Li45ZmRkMDQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2ltbWFwX3FlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pbW1hcF9xZS5oCkBAIC0xMzYsMjIgKzEzNiw3IEBACiAKIC8qIEJSRyAqLwogc3RydWN0IHFlX2JyZyB7Ci0JX19iZTMyCWJyZ2MxOwkJLyogQlJHMSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MyOwkJLyogQlJHMiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MzOwkJLyogQlJHMyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M0OwkJLyogQlJHNCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M1OwkJLyogQlJHNSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M2OwkJLyogQlJHNiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M3OwkJLyogQlJHNyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M4OwkJLyogQlJHOCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2M5OwkJLyogQlJHOSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MxMDsJCS8qIEJSRzEwIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQlfX2JlMzIJYnJnYzExOwkJLyogQlJHMTEgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCV9fYmUzMglicmdjMTI7CQkvKiBCUkcxMiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MxMzsJCS8qIEJSRzEzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQlfX2JlMzIJYnJnYzE0OwkJLyogQlJHMTQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotCV9fYmUzMglicmdjMTU7CQkvKiBCUkcxNSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0JX19iZTMyCWJyZ2MxNjsJCS8qIEJSRzE2IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlfX2JlMzIJYnJnY1sxNl07CS8qIEJSRyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwogCXU4CXJlczBbMHg0MF07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby1kZWZzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzY5MWFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pby1kZWZzLmgKQEAgLTAsMCArMSw1OSBAQAorLyogVGhpcyBmaWxlIGlzIG1lYW50IHRvIGJlIGluY2x1ZGUgbXVsdGlwbGUgdGltZXMgYnkgb3RoZXIgaGVhZGVycyAqLworCitERUZfUENJX0FDX1JFVChyZWFkYiwgdTgsIChjb25zdCBQQ0lfSU9fQUREUiBhZGRyKSwgKGFkZHIpKQorREVGX1BDSV9BQ19SRVQocmVhZHcsIHUxNiwgKGNvbnN0IFBDSV9JT19BRERSIGFkZHIpLCAoYWRkcikpCitERUZfUENJX0FDX1JFVChyZWFkbCwgdTMyLCAoY29uc3QgUENJX0lPX0FERFIgYWRkciksIChhZGRyKSkKK0RFRl9QQ0lfQUNfUkVUKHJlYWR3X2JlLCB1MTYsIChjb25zdCBQQ0lfSU9fQUREUiBhZGRyKSwgKGFkZHIpKQorREVGX1BDSV9BQ19SRVQocmVhZGxfYmUsIHUzMiwgKGNvbnN0IFBDSV9JT19BRERSIGFkZHIpLCAoYWRkcikpCitERUZfUENJX0FDX05PUkVUKHdyaXRlYiwgKHU4IHZhbCwgUENJX0lPX0FERFIgYWRkciksICh2YWwsIGFkZHIpKQorREVGX1BDSV9BQ19OT1JFVCh3cml0ZXcsICh1MTYgdmFsLCBQQ0lfSU9fQUREUiBhZGRyKSwgKHZhbCwgYWRkcikpCitERUZfUENJX0FDX05PUkVUKHdyaXRlbCwgKHUzMiB2YWwsIFBDSV9JT19BRERSIGFkZHIpLCAodmFsLCBhZGRyKSkKK0RFRl9QQ0lfQUNfTk9SRVQod3JpdGV3X2JlLCAodTE2IHZhbCwgUENJX0lPX0FERFIgYWRkciksICh2YWwsIGFkZHIpKQorREVGX1BDSV9BQ19OT1JFVCh3cml0ZWxfYmUsICh1MzIgdmFsLCBQQ0lfSU9fQUREUiBhZGRyKSwgKHZhbCwgYWRkcikpCisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCitERUZfUENJX0FDX1JFVChyZWFkcSwgdTY0LCAoY29uc3QgUENJX0lPX0FERFIgYWRkciksIChhZGRyKSkKK0RFRl9QQ0lfQUNfUkVUKHJlYWRxX2JlLCB1NjQsIChjb25zdCBQQ0lfSU9fQUREUiBhZGRyKSwgKGFkZHIpKQorREVGX1BDSV9BQ19OT1JFVCh3cml0ZXEsICh1NjQgdmFsLCBQQ0lfSU9fQUREUiBhZGRyKSwgKHZhbCwgYWRkcikpCitERUZfUENJX0FDX05PUkVUKHdyaXRlcV9iZSwgKHU2NCB2YWwsIFBDSV9JT19BRERSIGFkZHIpLCAodmFsLCBhZGRyKSkKKyNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCisKK0RFRl9QQ0lfQUNfUkVUKGluYiwgdTgsICh1bnNpZ25lZCBsb25nIHBvcnQpLCAocG9ydCkpCitERUZfUENJX0FDX1JFVChpbncsIHUxNiwgKHVuc2lnbmVkIGxvbmcgcG9ydCksIChwb3J0KSkKK0RFRl9QQ0lfQUNfUkVUKGlubCwgdTMyLCAodW5zaWduZWQgbG9uZyBwb3J0KSwgKHBvcnQpKQorREVGX1BDSV9BQ19OT1JFVChvdXRiLCAodTggdmFsLCB1bnNpZ25lZCBsb25nIHBvcnQpLCAodmFsLCBwb3J0KSkKK0RFRl9QQ0lfQUNfTk9SRVQob3V0dywgKHUxNiB2YWwsIHVuc2lnbmVkIGxvbmcgcG9ydCksICh2YWwsIHBvcnQpKQorREVGX1BDSV9BQ19OT1JFVChvdXRsLCAodTMyIHZhbCwgdW5zaWduZWQgbG9uZyBwb3J0KSwgKHZhbCwgcG9ydCkpCisKK0RFRl9QQ0lfQUNfTk9SRVQocmVhZHNiLCAoY29uc3QgUENJX0lPX0FERFIgYSwgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKGEsIGIsIGMpKQorREVGX1BDSV9BQ19OT1JFVChyZWFkc3csIChjb25zdCBQQ0lfSU9fQUREUiBhLCB2b2lkICpiLCB1bnNpZ25lZCBsb25nIGMpLCBcCisJCSAoYSwgYiwgYykpCitERUZfUENJX0FDX05PUkVUKHJlYWRzbCwgKGNvbnN0IFBDSV9JT19BRERSIGEsIHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChhLCBiLCBjKSkKK0RFRl9QQ0lfQUNfTk9SRVQod3JpdGVzYiwgKFBDSV9JT19BRERSIGEsIGNvbnN0IHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChhLCBiLCBjKSkKK0RFRl9QQ0lfQUNfTk9SRVQod3JpdGVzdywgKFBDSV9JT19BRERSIGEsIGNvbnN0IHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChhLCBiLCBjKSkKK0RFRl9QQ0lfQUNfTk9SRVQod3JpdGVzbCwgKFBDSV9JT19BRERSIGEsIGNvbnN0IHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChhLCBiLCBjKSkKKworREVGX1BDSV9BQ19OT1JFVChpbnNiLCAodW5zaWduZWQgbG9uZyBwLCB2b2lkICpiLCB1bnNpZ25lZCBsb25nIGMpLCBcCisJCSAocCwgYiwgYykpCitERUZfUENJX0FDX05PUkVUKGluc3csICh1bnNpZ25lZCBsb25nIHAsIHZvaWQgKmIsIHVuc2lnbmVkIGxvbmcgYyksIFwKKwkJIChwLCBiLCBjKSkKK0RFRl9QQ0lfQUNfTk9SRVQoaW5zbCwgKHVuc2lnbmVkIGxvbmcgcCwgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKHAsIGIsIGMpKQorREVGX1BDSV9BQ19OT1JFVChvdXRzYiwgKHVuc2lnbmVkIGxvbmcgcCwgY29uc3Qgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKHAsIGIsIGMpKQorREVGX1BDSV9BQ19OT1JFVChvdXRzdywgKHVuc2lnbmVkIGxvbmcgcCwgY29uc3Qgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKHAsIGIsIGMpKQorREVGX1BDSV9BQ19OT1JFVChvdXRzbCwgKHVuc2lnbmVkIGxvbmcgcCwgY29uc3Qgdm9pZCAqYiwgdW5zaWduZWQgbG9uZyBjKSwgXAorCQkgKHAsIGIsIGMpKQorCitERUZfUENJX0FDX05PUkVUKG1lbXNldF9pbywgKFBDSV9JT19BRERSIGEsIGludCBjLCB1bnNpZ25lZCBsb25nIG4pLAkgICBcCisJCSAoYSwgYywgbikpCitERUZfUENJX0FDX05PUkVUKG1lbWNweV9mcm9taW8sKHZvaWQgKmQsY29uc3QgUENJX0lPX0FERFIgcyx1bnNpZ25lZCBsb25nIG4pLCBcCisJCSAoZCwgcywgbikpCitERUZfUENJX0FDX05PUkVUKG1lbWNweV90b2lvLChQQ0lfSU9fQUREUiBkLGNvbnN0IHZvaWQgKnMsdW5zaWduZWQgbG9uZyBuKSwgICBcCisJCSAoZCwgcywgbikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKaW5kZXggM2JhZmY4Yi4uMWNkNTMyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaApAQCAtMTMsMTU5ICsxMyw1NTYgQEAKIGV4dGVybiBpbnQgY2hlY2tfbGVnYWN5X2lvcG9ydCh1bnNpZ25lZCBsb25nIGJhc2VfcG9ydCk7CiAjZGVmaW5lIFBOUEJJT1NfQkFTRQkweGYwMDAJLyogb25seSByZWxldmFudCBmb3IgUFJlUCAqLwogCi0jaWZuZGVmIENPTkZJR19QUEM2NAotI2luY2x1ZGUgPGFzbS1wcGMvaW8uaD4KLSNlbHNlCi0KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAjaW5jbHVkZSA8YXNtL3N5bmNoLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9tYXAuaD4KIAorI2lmZGVmIENPTkZJR19QUEM2NAorI2luY2x1ZGUgPGFzbS9wYWNhLmg+CisjZW5kaWYKKwogI2RlZmluZSBTSU9fQ09ORklHX1JBCTB4Mzk4CiAjZGVmaW5lIFNJT19DT05GSUdfUkQJMHgzOTkKIAogI2RlZmluZSBTTE9XX0RPV05fSU8KIAorLyogMzIgYml0cyB1c2VzIHNsaWdodGx5IGRpZmZlcmVudCB2YXJpYWJsZXMgZm9yIHRoZSB2YXJpb3VzIElPCisgKiBiYXNlcy4gTW9zdCBvZiB0aGlzIGZpbGUgb25seSB1c2VzIF9JT19CQVNFIHRob3VnaCB3aGljaCB3ZQorICogZGVmaW5lIHByb3Blcmx5IGJhc2VkIG9uIHRoZSBwbGF0Zm9ybQorICovCisjaWZuZGVmIENPTkZJR19QQ0kKKyNkZWZpbmUgX0lPX0JBU0UJMAorI2RlZmluZSBfSVNBX01FTV9CQVNFCTAKKyNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUIDAKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQzMyKQorI2RlZmluZSBfSU9fQkFTRQlpc2FfaW9fYmFzZQorI2RlZmluZSBfSVNBX01FTV9CQVNFCWlzYV9tZW1fYmFzZQorI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQJcGNpX2RyYW1fb2Zmc2V0CisjZWxzZQorI2RlZmluZSBfSU9fQkFTRQlwY2lfaW9fYmFzZQorI2RlZmluZSBfSVNBX01FTV9CQVNFCTAKKyNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUCTAKKyNlbmRpZgorCiBleHRlcm4gdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9pb19iYXNlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2RyYW1fb2Zmc2V0OwogCi0jaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCisjaWYgZGVmaW5lZChDT05GSUdfUFBDMzIpICYmIGRlZmluZWQoQ09ORklHX1BQQ19JTkRJUkVDVF9JTykKKyNlcnJvciBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIG9uIDMyIGJpdHMKKyNlbmRpZgogCi1leHRlcm4gaW50IGluXzgoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICphZGRyKTsKLWV4dGVybiB2b2lkIG91dF84KHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqYWRkciwgaW50IHZhbCk7Ci1leHRlcm4gaW50IGluX2xlMTYoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gaW50IGluX2JlMTYoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBvdXRfbGUxNih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBfX2lvbWVtICphZGRyLCBpbnQgdmFsKTsKLWV4dGVybiB2b2lkIG91dF9iZTE2KHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIsIGludCB2YWwpOwotZXh0ZXJuIHVuc2lnbmVkIGluX2xlMzIoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgaW5fYmUzMihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBfX2lvbWVtICphZGRyKTsKLWV4dGVybiB2b2lkIG91dF9sZTMyKHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIsIGludCB2YWwpOwotZXh0ZXJuIHZvaWQgb3V0X2JlMzIodm9sYXRpbGUgdW5zaWduZWQgX19pb21lbSAqYWRkciwgaW50IHZhbCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpbl9sZTY0KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpbl9iZTY0KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBvdXRfbGU2NCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGxvbmcgdmFsKTsKLWV4dGVybiB2b2lkIG91dF9iZTY0KHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkciwgdW5zaWduZWQgbG9uZyB2YWwpOworLyoKKyAqCisgKiBMb3cgbGV2ZWwgTU1JTyBhY2Nlc3NvcnMKKyAqCisgKiBUaGlzIHByb3ZpZGVzIHRoZSBub24tYnVzIHNwZWNpZmljIGFjY2Vzc29ycyB0byBNTUlPLiBUaG9zZSBhcmUgUG93ZXJQQworICogc3BlY2lmaWMgYW5kIHRodXMgc2hvdWxkbid0IGJlIHVzZWQgaW4gZ2VuZXJpYyBjb2RlLiBUaGUgYWNjZXNzb3JzCisgKiBwcm92aWRlZCBoZXJlIGFyZToKKyAqCisgKglpbl84LCBpbl9sZTE2LCBpbl9iZTE2LCBpbl9sZTMyLCBpbl9iZTMyLCBpbl9sZTY0LCBpbl9iZTY0CisgKglvdXRfOCwgb3V0X2xlMTYsIG91dF9iZTE2LCBvdXRfbGUzMiwgb3V0X2JlMzIsIG91dF9sZTY0LCBvdXRfYmU2NAorICoJX2luc2IsIF9pbnN3X25zLCBfaW5zbF9ucywgX291dHNiLCBfb3V0c3dfbnMsIF9vdXRzbF9ucworICoKKyAqIFRob3NlIG9wZXJhdGUgZGlyZWN0bHkgb24gYSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzLiBOb3RlIHRoYXQgdGhlIHByb3RvdHlwZQorICogZm9yIHRoZSBvdXRfKiBhY2Nlc3NvcnMgaGFzIHRoZSBhcmd1bWVudHMgaW4gb3Bwb3NpdGUgb3JkZXIgZnJvbSB0aGUgdXN1YWwKKyAqIGxpbnV4IFBDSSBhY2Nlc3NvcnMuIFVubGlrZSB0aG9zZSwgdGhleSB0YWtlIHRoZSBhZGRyZXNzIGZpcnN0IGFuZCB0aGUgdmFsdWUKKyAqIG5leHQuCisgKgorICogTm90ZTogSSBtaWdodCBkcm9wIHRoZSBfbnMgc3VmZml4IG9uIHRoZSBzdHJlYW0gb3BlcmF0aW9ucyBzb29uIGFzIGl0IGlzCisgKiBzaW1wbHkgbm9ybWFsIGZvciBzdHJlYW0gb3BlcmF0aW9ucyB0byBub3Qgc3dhcCBpbiB0aGUgZmlyc3QgcGxhY2UuCisgKgorICovCiAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIF9fcmF3X3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgX19yYXdfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgX19yYXdfcmVhZGwoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fcmF3X3JlYWRxKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBfX3Jhd193cml0ZWIodW5zaWduZWQgY2hhciB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOwotZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGV3KHVuc2lnbmVkIHNob3J0IHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBfX3Jhd193cml0ZWwodW5zaWduZWQgaW50IHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7Ci1leHRlcm4gdm9pZCBfX3Jhd193cml0ZXEodW5zaWduZWQgbG9uZyB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOworI2lmZGVmIENPTkZJR19QUEM2NAorI2RlZmluZSBJT19TRVRfU1lOQ19GTEFHKCkJZG8geyBnZXRfcGFjYSgpLT5pb19zeW5jID0gMTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgSU9fU0VUX1NZTkNfRkxBRygpCisjZW5kaWYKIAotZXh0ZXJuIHZvaWQgbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgaW50IGMsIHVuc2lnbmVkIGxvbmcgbik7Ci1leHRlcm4gdm9pZCBtZW1jcHlfZnJvbWlvKHZvaWQgKmRlc3QsIGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuKTsKLWV4dGVybiB2b2lkIG1lbWNweV90b2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuKTsKKyNkZWZpbmUgREVGX01NSU9fSU4obmFtZSwgdHlwZSwgaW5zbikJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdHlwZSBuYW1lKGNvbnN0IHZvbGF0aWxlIHR5cGUgX19pb21lbSAqYWRkcikJCVwKK3sJCQkJCQkJCQlcCisJdHlwZSByZXQ7CQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsiIGluc24gIjt0d2kgMCwlMCwwO2lzeW5jIgkJXAorIAkJOiAiPXIiIChyZXQpIDogInIiIChhZGRyKSwgIm0iICgqYWRkcikpOwkJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30KIAotI2Vsc2UgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCisjZGVmaW5lIERFRl9NTUlPX09VVChuYW1lLCB0eXBlLCBpbnNuKQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIG5hbWUodm9sYXRpbGUgdHlwZSBfX2lvbWVtICphZGRyLCB0eXBlIHZhbCkJCVwKK3sJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IiBpbnNuCQkJCVwKKyAJCTogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsJCVwKKwlJT19TRVRfU1lOQ19GTEFHKCk7CQkJCQlcCit9CiAKLSNkZWZpbmUgaW5fOChhZGRyKQkJX19pbl84KChhZGRyKSkKLSNkZWZpbmUgb3V0XzgoYWRkciwgdmFsKQlfX291dF84KChhZGRyKSwgKHZhbCkpCi0jZGVmaW5lIGluX2xlMTYoYWRkcikJCV9faW5fbGUxNigoYWRkcikpCi0jZGVmaW5lIGluX2JlMTYoYWRkcikJCV9faW5fYmUxNigoYWRkcikpCi0jZGVmaW5lIG91dF9sZTE2KGFkZHIsIHZhbCkJX19vdXRfbGUxNigoYWRkciksICh2YWwpKQotI2RlZmluZSBvdXRfYmUxNihhZGRyLCB2YWwpCV9fb3V0X2JlMTYoKGFkZHIpLCAodmFsKSkKLSNkZWZpbmUgaW5fbGUzMihhZGRyKQkJX19pbl9sZTMyKChhZGRyKSkKLSNkZWZpbmUgaW5fYmUzMihhZGRyKQkJX19pbl9iZTMyKChhZGRyKSkKLSNkZWZpbmUgb3V0X2xlMzIoYWRkciwgdmFsKQlfX291dF9sZTMyKChhZGRyKSwgKHZhbCkpCi0jZGVmaW5lIG91dF9iZTMyKGFkZHIsIHZhbCkJX19vdXRfYmUzMigoYWRkciksICh2YWwpKQotI2RlZmluZSBpbl9sZTY0KGFkZHIpCQlfX2luX2xlNjQoKGFkZHIpKQotI2RlZmluZSBpbl9iZTY0KGFkZHIpCQlfX2luX2JlNjQoKGFkZHIpKQotI2RlZmluZSBvdXRfbGU2NChhZGRyLCB2YWwpCV9fb3V0X2xlNjQoKGFkZHIpLCAodmFsKSkKLSNkZWZpbmUgb3V0X2JlNjQoYWRkciwgdmFsKQlfX291dF9iZTY0KChhZGRyKSwgKHZhbCkpCisKKyNkZWZpbmUgREVGX01NSU9fSU5fQkUobmFtZSwgc2l6ZSwgaW5zbikgXAorCURFRl9NTUlPX0lOKG5hbWUsIHUjI3NpemUsIF9fc3RyaW5naWZ5KGluc24pIiVVMiVYMiAlMCwlMiIpCisjZGVmaW5lIERFRl9NTUlPX0lOX0xFKG5hbWUsIHNpemUsIGluc24pIFwKKwlERUZfTU1JT19JTihuYW1lLCB1IyNzaXplLCBfX3N0cmluZ2lmeShpbnNuKSIgJTAsMCwlMSIpCisKKyNkZWZpbmUgREVGX01NSU9fT1VUX0JFKG5hbWUsIHNpemUsIGluc24pIFwKKwlERUZfTU1JT19PVVQobmFtZSwgdSMjc2l6ZSwgX19zdHJpbmdpZnkoaW5zbikiJVUwJVgwICUxLCUwIikKKyNkZWZpbmUgREVGX01NSU9fT1VUX0xFKG5hbWUsIHNpemUsIGluc24pIFwKKwlERUZfTU1JT19PVVQobmFtZSwgdSMjc2l6ZSwgX19zdHJpbmdpZnkoaW5zbikiICUxLDAsJTIiKQorCitERUZfTU1JT19JTl9CRShpbl84LCAgICAgOCwgbGJ6KTsKK0RFRl9NTUlPX0lOX0JFKGluX2JlMTYsIDE2LCBsaHopOworREVGX01NSU9fSU5fQkUoaW5fYmUzMiwgMzIsIGx3eik7CitERUZfTU1JT19JTl9MRShpbl9sZTE2LCAxNiwgbGhicngpOworREVGX01NSU9fSU5fTEUoaW5fbGUzMiwgMzIsIGx3YnJ4KTsKKworREVGX01NSU9fT1VUX0JFKG91dF84LCAgICAgOCwgc3RiKTsKK0RFRl9NTUlPX09VVF9CRShvdXRfYmUxNiwgMTYsIHN0aCk7CitERUZfTU1JT19PVVRfQkUob3V0X2JlMzIsIDMyLCBzdHcpOworREVGX01NSU9fT1VUX0xFKG91dF9sZTE2LCAxNiwgc3RoYnJ4KTsKK0RFRl9NTUlPX09VVF9MRShvdXRfbGUzMiwgMzIsIHN0d2JyeCk7CisKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCitERUZfTU1JT19PVVRfQkUob3V0X2JlNjQsIDY0LCBzdGQpOworREVGX01NSU9fSU5fQkUoaW5fYmU2NCwgNjQsIGxkKTsKKworLyogVGhlcmUgaXMgbm8gYXNtIGluc3RydWN0aW9ucyBmb3IgNjQgYml0cyByZXZlcnNlIGxvYWRzIGFuZCBzdG9yZXMgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IGluX2xlNjQoY29uc3Qgdm9sYXRpbGUgdTY0IF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIGxlNjRfdG9fY3B1KGluX2JlNjQoYWRkcikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0X2xlNjQodm9sYXRpbGUgdTY0IF9faW9tZW0gKmFkZHIsIHU2NCB2YWwpCit7CisJb3V0X2JlNjQoYWRkciwgY3B1X3RvX2xlNjQodmFsKSk7Cit9CisjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLworCisvKgorICogTG93IGxldmVsIElPIHN0cmVhbSBpbnN0cnVjdGlvbnMgYXJlIGRlZmluZWQgb3V0IG9mIGxpbmUgZm9yIG5vdworICovCitleHRlcm4gdm9pZCBfaW5zYihjb25zdCB2b2xhdGlsZSB1OCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgX291dHNiKHZvbGF0aWxlIHU4IF9faW9tZW0gKmFkZHIsY29uc3Qgdm9pZCAqYnVmLGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgX2luc3dfbnMoY29uc3Qgdm9sYXRpbGUgdTE2IF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBfb3V0c3dfbnModm9sYXRpbGUgdTE2IF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBfaW5zbF9ucyhjb25zdCB2b2xhdGlsZSB1MzIgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIF9vdXRzbF9ucyh2b2xhdGlsZSB1MzIgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKKworLyogVGhlIF9ucyBuYW1pbmcgaXMgaGlzdG9yaWNhbCBhbmQgd2lsbCBiZSByZW1vdmVkLiBGb3Igbm93LCBqdXN0ICNkZWZpbmUKKyAqIHRoZSBub24gX25zIGVxdWl2YWxlbnQgbmFtZXMKKyAqLworI2RlZmluZSBfaW5zdwlfaW5zd19ucworI2RlZmluZSBfaW5zbAlfaW5zbF9ucworI2RlZmluZSBfb3V0c3cJX291dHN3X25zCisjZGVmaW5lIF9vdXRzbAlfb3V0c2xfbnMKKworCisvKgorICogbWVtc2V0X2lvLCBtZW1jcHlfdG9pbywgbWVtY3B5X2Zyb21pbyBiYXNlIGltcGxlbWVudGF0aW9ucyBhcmUgb3V0IG9mIGxpbmUKKyAqLworCitleHRlcm4gdm9pZCBfbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgaW50IGMsIHVuc2lnbmVkIGxvbmcgbik7CitleHRlcm4gdm9pZCBfbWVtY3B5X2Zyb21pbyh2b2lkICpkZXN0LCBjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNyYywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbik7CitleHRlcm4gdm9pZCBfbWVtY3B5X3RvaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkZXN0LCBjb25zdCB2b2lkICpzcmMsCisJCQkgdW5zaWduZWQgbG9uZyBuKTsKKworLyoKKyAqCisgKiBQQ0kgYW5kIHN0YW5kYXJkIElTQSBhY2Nlc3NvcnMKKyAqCisgKiBUaG9zZSBhcmUgZ2xvYmFsbHkgZGVmaW5lZCBsaW51eCBhY2Nlc3NvcnMgZm9yIGRldmljZXMgb24gUENJIG9yIElTQQorICogYnVzc2VzLiBUaGV5IGZvbGxvdyB0aGUgTGludXggZGVmaW5lZCBzZW1hbnRpY3MuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCisgKiBmb3IgUG93ZXJQQyBpcyBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgeDg2IHZlcnNpb24gb2YgdGhlc2UsIGFuZCB0aHVzCisgKiBwcm92aWRlcyBmYWlybHkgaGVhdnkgd2VpZ2h0IGJhcnJpZXJzIGZvciB0aGUgbm9uLXJhdyB2ZXJzaW9ucworICoKKyAqIEluIGFkZGl0aW9uLCB0aGV5IHN1cHBvcnQgYSBob29rIG1lY2hhbmlzbSB3aGVuIENPTkZJR19QUENfSU5ESVJFQ1RfSU8KKyAqIGFsbG93aW5nIHRoZSBwbGF0Zm9ybSB0byBwcm92aWRlIGl0cyBvd24gaW1wbGVtZW50YXRpb24gb2Ygc29tZSBvciBhbGwKKyAqIG9mIHRoZSBhY2Nlc3NvcnMuCisgKi8KKworLyoKKyAqIEluY2x1ZGUgdGhlIEVFSCBkZWZpbml0aW9ucyB3aGVuIEVFSCBpcyBlbmFibGVkIG9ubHkgc28gdGhleSBkb24ndCBnZXQKKyAqIGluIHRoZSB3YXkgd2hlbiBidWlsZGluZyBmb3IgMzIgYml0cworICovCisjaWZkZWYgQ09ORklHX0VFSAorI2luY2x1ZGUgPGFzbS9lZWguaD4KKyNlbmRpZgorCisvKiBTaG9ydGN1dCB0byB0aGUgTU1JTyBhcmd1bWVudCBwb2ludGVyICovCisjZGVmaW5lIFBDSV9JT19BRERSCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqCisKKy8qIEluZGlyZWN0IElPIGFkZHJlc3MgdG9rZW5zOgorICoKKyAqIFdoZW4gQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBzZXQsIHRoZSBwbGF0Zm9ybSBjYW4gcHJvdmlkZSBob29rcworICogb24gYWxsIElPcy4gKE5vdGUgdGhhdCB0aGlzIGlzIGFsbCA2NCBiaXRzIG9ubHkgZm9yIG5vdykKKyAqCisgKiBUbyBoZWxwIHBsYXRmb3JtcyB3aG8gbWF5IG5lZWQgdG8gZGlmZmVyZW5jaWF0ZSBNTUlPIGFkZHJlc3NlcyBpbgorICogdGhlaXIgaG9va3MsIGEgYml0ZmllbGQgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgcGxhdGZvcm0gbmVhciB0aGUKKyAqIHRvcCBvZiBNTUlPIGFkZHJlc3NlcyAobm90IFBJTywgdGhvc2UgaGF2ZSB0byBjb3BlIHRoZSBoYXJkIHdheSkuCisgKgorICogVGhpcyBiaXQgZmllbGQgaXMgMTIgYml0cyBhbmQgaXMgYXQgdGhlIHRvcCBvZiB0aGUgSU8gdmlydHVhbAorICogYWRkcmVzc2VzIFBDSV9JT19JTkRJUkVDVF9UT0tFTl9NQVNLLgorICoKKyAqIFRoZSBrZXJuZWwgdmlydHVhbCBzcGFjZSBpcyB0aHVzOgorICoKKyAqICAweEQwMDAwMDAwMDAwMDAwMDAJCTogdm1hbGxvYworICogIDB4RDAwMDA4MDAwMDAwMDAwMAkJOiBQQ0kgUEhCIElPIHNwYWNlCisgKiAgMHhEMDAwMDgwMDgwMDAwMDAwCQk6IGlvcmVtYXAKKyAqICAweEQwMDAwZmZmZmZmZmZmZmYJCTogZW5kIG9mIGlvcmVtYXAgcmVnaW9uCisgKgorICogU2luY2UgdGhlIHRvcCA0IGJpdHMgYXJlIHJlc2VydmVkIGFzIHRoZSByZWdpb24gSUQsIHdlIHVzZSB0aHVzCisgKiB0aGUgbmV4dCAxMiBiaXRzIGFuZCBrZWVwIDQgYml0cyBhdmFpbGFibGUgZm9yIHRoZSBmdXR1cmUgaWYgdGhlCisgKiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgaXMgZXZlciB0byBiZSBleHRlbmRlZC4KKyAqCisgKiBUaGUgZGlyZWN0IElPIG1hcHBpbmcgb3BlcmF0aW9ucyB3aWxsIHRoZW4gbWFzayBvZmYgdGhvc2UgYml0cworICogYmVmb3JlIGRvaW5nIHRoZSBhY3R1YWwgYWNjZXNzLCB0aG91Z2ggdGhhdCBvbmx5IGhhcHBlbiB3aGVuCisgKiBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIHNldCwgdGh1cyBiZSBjYXJlZnVsIHdoZW4geW91IHVzZSB0aGF0CisgKiBtZWNoYW5pc20KKyAqLworCisjaWZkZWYgQ09ORklHX1BQQ19JTkRJUkVDVF9JTworI2RlZmluZSBQQ0lfSU9fSU5EX1RPS0VOX01BU0sJMHgwZmZmMDAwMDAwMDAwMDAwdWwKKyNkZWZpbmUgUENJX0lPX0lORF9UT0tFTl9TSElGVAk0OAorI2RlZmluZSBQQ0lfRklYX0FERFIoYWRkcikJCQkJCQlcCisJKChQQ0lfSU9fQUREUikoKCh1bnNpZ25lZCBsb25nKShhZGRyKSkgJiB+UENJX0lPX0lORF9UT0tFTl9NQVNLKSkKKyNkZWZpbmUgUENJX0dFVF9BRERSX1RPS0VOKGFkZHIpCQkJCQlcCisJKCgodW5zaWduZWQgbG9uZykoYWRkcikgJiBQQ0lfSU9fSU5EX1RPS0VOX01BU0spID4+IAkJXAorCQlQQ0lfSU9fSU5EX1RPS0VOX1NISUZUKQorI2RlZmluZSBQQ0lfU0VUX0FERFJfVE9LRU4oYWRkciwgdG9rZW4pIAkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19hID0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpOwkJCVwKKwlfX2EgJj0gflBDSV9JT19JTkRfVE9LRU5fTUFTSzsJCQkJCVwKKwlfX2EgfD0gKCh1bnNpZ25lZCBsb25nKSh0b2tlbikpIDw8IFBDSV9JT19JTkRfVE9LRU5fU0hJRlQ7CVwKKwkoYWRkcikgPSAodm9pZCBfX2lvbWVtICopX19hOwkJCQkJXAorfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgUENJX0ZJWF9BRERSKGFkZHIpIChhZGRyKQorI2VuZGlmCisKKworLyoKKyAqIE5vbiBvcmRlcmVkIGFuZCBub24tc3dhcHBpbmcgInJhdyIgYWNjZXNzb3JzCisgKi8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIF9fcmF3X3JlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9fZm9yY2UgKilhZGRyOworCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19mb3JjZSAqKVBDSV9GSVhfQUREUihhZGRyKTsKIH0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgX19yYXdfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9fZm9yY2UgKilhZGRyOworCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9fZm9yY2UgKilQQ0lfRklYX0FERFIoYWRkcik7CiB9CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX3Jhd19yZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50IF9fZm9yY2UgKilhZGRyOwotfQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X3JlYWRxKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9fZm9yY2UgKilhZGRyOworCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2ZvcmNlICopUENJX0ZJWF9BRERSKGFkZHIpOwogfQogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlYih1bnNpZ25lZCBjaGFyIHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19mb3JjZSAqKWFkZHIgPSB2OworCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2ZvcmNlICopUENJX0ZJWF9BRERSKGFkZHIpID0gdjsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZXcodW5zaWduZWQgc2hvcnQgdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19mb3JjZSAqKWFkZHIgPSB2OworCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19mb3JjZSAqKVBDSV9GSVhfQUREUihhZGRyKSA9IHY7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVsKHVuc2lnbmVkIGludCB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgX19mb3JjZSAqKWFkZHIgPSB2OworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50IF9fZm9yY2UgKilQQ0lfRklYX0FERFIoYWRkcikgPSB2OworfQorCisjaWZkZWYgX19wb3dlcnBjNjRfXworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X3JlYWRxKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9fZm9yY2UgKilQQ0lfRklYX0FERFIoYWRkcik7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVxKHVuc2lnbmVkIGxvbmcgdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCSoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2ZvcmNlICopYWRkciA9IHY7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9fZm9yY2UgKilQQ0lfRklYX0FERFIoYWRkcikgPSB2OwogfQotI2RlZmluZSBtZW1zZXRfaW8oYSxiLGMpCWVlaF9tZW1zZXRfaW8oKGEpLChiKSwoYykpCi0jZGVmaW5lIG1lbWNweV9mcm9taW8oYSxiLGMpCWVlaF9tZW1jcHlfZnJvbWlvKChhKSwoYiksKGMpKQotI2RlZmluZSBtZW1jcHlfdG9pbyhhLGIsYykJZWVoX21lbWNweV90b2lvKChhKSwoYiksKGMpKQotCi0jZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCisjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCiAvKgotICogVGhlIGluc3cvb3V0c3cvaW5zbC9vdXRzbCBtYWNyb3MgZG9uJ3QgZG8gYnl0ZS1zd2FwcGluZy4KLSAqIFRoZXkgYXJlIG9ubHkgdXNlZCBpbiBwcmFjdGljZSBmb3IgdHJhbnNmZXJyaW5nIGJ1ZmZlcnMgd2hpY2gKLSAqIGFyZSBhcnJheXMgb2YgYnl0ZXMsIGFuZCBieXRlLXN3YXBwaW5nIGlzIG5vdCBhcHByb3ByaWF0ZSBpbgotICogdGhhdCBjYXNlLiAgLSBwYXVsdXMgKi8KLSNkZWZpbmUgaW5zYihwb3J0LCBidWYsIG5zKQllZWhfaW5zYigocG9ydCksIChidWYpLCAobnMpKQotI2RlZmluZSBpbnN3KHBvcnQsIGJ1ZiwgbnMpCWVlaF9pbnN3X25zKChwb3J0KSwgKGJ1ZiksIChucykpCi0jZGVmaW5lIGluc2wocG9ydCwgYnVmLCBubCkJZWVoX2luc2xfbnMoKHBvcnQpLCAoYnVmKSwgKG5sKSkKKyAqCisgKiBQQ0kgUElPIGFuZCBNTUlPIGFjY2Vzc29ycy4KKyAqCisgKgorICogT24gMzIgYml0cywgUElPIG9wZXJhdGlvbnMgaGF2ZSBhIHJlY292ZXJ5IG1lY2hhbmlzbSBpbiBjYXNlIHRoZXkgdHJpZ2dlcgorICogbWFjaGluZSBjaGVja3MgKHdoaWNoIHRoZXkgb2NjYXNpb25hbGx5IGRvIHdoZW4gcHJvYmluZyBub24gZXhpc3RpbmcKKyAqIElPIHBvcnRzIG9uIHNvbWUgcGxhdGZvcm1zLCBsaWtlIFBvd2VyTWFjIGFuZCA4eHgpLgorICogSSBhbHdheXMgZm91bmQgaXQgdG8gYmUgb2YgZHViaW91cyByZWxpYWJpbGl0eSBhbmQgSSBhbSB0ZW1wdGVkIHRvIGdldAorICogcmlkIG9mIGl0IG9uZSBvZiB0aGVzZSBkYXlzLiBTbyBpZiB5b3UgdGhpbmsgaXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpdCwKKyAqIHBsZWFzZSB2b2ljZSB1cCBhc2FwLiBXZSBuZXZlciBoYWQgaXQgZm9yIDY0IGJpdHMgYW5kIEkgZG8gbm90IGludGVuZAorICogdG8gcG9ydCBpdCBvdmVyCisgKi8KIAotI2RlZmluZSBvdXRzYihwb3J0LCBidWYsIG5zKSAgX291dHNiKCh1OCBfX2lvbWVtICopKChwb3J0KStwY2lfaW9fYmFzZSksIChidWYpLCAobnMpKQotI2RlZmluZSBvdXRzdyhwb3J0LCBidWYsIG5zKSAgX291dHN3X25zKCh1MTYgX19pb21lbSAqKSgocG9ydCkrcGNpX2lvX2Jhc2UpLCAoYnVmKSwgKG5zKSkKLSNkZWZpbmUgb3V0c2wocG9ydCwgYnVmLCBubCkgIF9vdXRzbF9ucygodTMyIF9faW9tZW0gKikoKHBvcnQpK3BjaV9pb19iYXNlKSwgKGJ1ZiksIChubCkpCisjaWZkZWYgQ09ORklHX1BQQzMyCiAKLSNkZWZpbmUgcmVhZGIoYWRkcikJCWVlaF9yZWFkYihhZGRyKQotI2RlZmluZSByZWFkdyhhZGRyKQkJZWVoX3JlYWR3KGFkZHIpCi0jZGVmaW5lIHJlYWRsKGFkZHIpCQllZWhfcmVhZGwoYWRkcikKLSNkZWZpbmUgcmVhZHEoYWRkcikJCWVlaF9yZWFkcShhZGRyKQotI2RlZmluZSB3cml0ZWIoZGF0YSwgYWRkcikJZWVoX3dyaXRlYigoZGF0YSksIChhZGRyKSkKLSNkZWZpbmUgd3JpdGV3KGRhdGEsIGFkZHIpCWVlaF93cml0ZXcoKGRhdGEpLCAoYWRkcikpCi0jZGVmaW5lIHdyaXRlbChkYXRhLCBhZGRyKQllZWhfd3JpdGVsKChkYXRhKSwgKGFkZHIpKQotI2RlZmluZSB3cml0ZXEoZGF0YSwgYWRkcikJZWVoX3dyaXRlcSgoZGF0YSksIChhZGRyKSkKLSNkZWZpbmUgaW5iKHBvcnQpCQllZWhfaW5iKCh1bnNpZ25lZCBsb25nKXBvcnQpCi0jZGVmaW5lIG91dGIodmFsLCBwb3J0KQkJZWVoX291dGIodmFsLCAodW5zaWduZWQgbG9uZylwb3J0KQotI2RlZmluZSBpbncocG9ydCkJCWVlaF9pbncoKHVuc2lnbmVkIGxvbmcpcG9ydCkKLSNkZWZpbmUgb3V0dyh2YWwsIHBvcnQpCQllZWhfb3V0dyh2YWwsICh1bnNpZ25lZCBsb25nKXBvcnQpCi0jZGVmaW5lIGlubChwb3J0KQkJZWVoX2lubCgodW5zaWduZWQgbG9uZylwb3J0KQotI2RlZmluZSBvdXRsKHZhbCwgcG9ydCkJCWVlaF9vdXRsKHZhbCwgKHVuc2lnbmVkIGxvbmcpcG9ydCkKKyNkZWZpbmUgX19kb19pbl9hc20obmFtZSwgb3ApCQkJCVwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5hbWUodW5zaWduZWQgaW50IHBvcnQpCVwKK3sJCQkJCQkJXAorCXVuc2lnbmVkIGludCB4OwkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQlcCisJCSJzeW5jXG4iCQkJCVwKKwkJIjA6IglvcCAiCSUwLDAsJTFcbiIJCVwKKwkJIjE6CXR3aQkwLCUwLDBcbiIJCVwKKwkJIjI6CWlzeW5jXG4iCQkJXAorCQkiMzoJbm9wXG4iCQkJCVwKKwkJIjQ6XG4iCQkJCQlcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCisJCSI1OglsaQklMCwtMVxuIgkJXAorCQkiCWIJNGJcbiIJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCQkiCS5hbGlnbgkyXG4iCQkJXAorCQkiCS5sb25nCTBiLDViXG4iCQlcCisJCSIJLmxvbmcJMWIsNWJcbiIJCVwKKwkJIgkubG9uZwkyYiw1YlxuIgkJXAorCQkiCS5sb25nCTNiLDViXG4iCQlcCisJCSIucHJldmlvdXMiCQkJCVwKKwkJOiAiPSZyIiAoeCkJCQkJXAorCQk6ICJyIiAocG9ydCArIF9JT19CQVNFKSk7CQlcCisJcmV0dXJuIHg7CQkJCQlcCit9CiAKKyNkZWZpbmUgX19kb19vdXRfYXNtKG5hbWUsIG9wKQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgbmFtZSh1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgcG9ydCkgXAorewkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCVwKKwkJInN5bmNcbiIJCQkJXAorCQkiMDoiIG9wICIgJTAsMCwlMVxuIgkJCVwKKwkJIjE6CXN5bmNcbiIJCQkJXAorCQkiMjpcbiIJCQkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCVwKKwkJIgkuYWxpZ24JMlxuIgkJCVwKKwkJIgkubG9uZwkwYiwyYlxuIgkJXAorCQkiCS5sb25nCTFiLDJiXG4iCQlcCisJCSIucHJldmlvdXMiCQkJCVwKKwkJOiA6ICJyIiAodmFsKSwgInIiIChwb3J0ICsgX0lPX0JBU0UpKTsJXAorfQorCitfX2RvX2luX2FzbShfcmVjX2luYiwgImxiengiKQorX19kb19pbl9hc20oX3JlY19pbncsICJsaGJyeCIpCitfX2RvX2luX2FzbShfcmVjX2lubCwgImx3YnJ4IikKK19fZG9fb3V0X2FzbShfcmVjX291dGIsICJzdGJ4IikKK19fZG9fb3V0X2FzbShfcmVjX291dHcsICJzdGhicngiKQorX19kb19vdXRfYXNtKF9yZWNfb3V0bCwgInN0d2JyeCIpCisKKyNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KKworLyogVGhlICJfX2RvXyoiIG9wZXJhdGlvbnMgYmVsb3cgcHJvdmlkZSB0aGUgYWN0dWFsICJiYXNlIiBpbXBsZW1lbnRhdGlvbgorICogZm9yIGVhY2ggb2YgdGhlIGRlZmluZWQgYWNjY2Vzc29yLiBTb21lIG9mIHRoZW0gdXNlIHRoZSBvdXRfKiBmdW5jdGlvbnMKKyAqIGRpcmVjdGx5LCBzb21lIG9mIHRoZW0gc3RpbGwgdXNlIEVFSCwgdGhvdWdoIHdlIG1pZ2h0IGNoYW5nZSB0aGF0IGluIHRoZQorICogZnV0dXJlLiBUaG9zZSBtYWNyb3MgYmVsb3cgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50IHN3YXBwaW5nIGFuZAorICogaGFuZGxpbmcgb2YgdGhlIElPIGJhc2UgZm9yIFBJTy4KKyAqCisgKiBUaGV5IGFyZSB0aGVtc2VsdmVzIHVzZWQgYnkgdGhlIG1hY3JvcyB0aGF0IGRlZmluZSB0aGUgYWN0dWFsIGFjY2Vzc29ycworICogYW5kIGNhbiBiZSB1c2VkIGJ5IHRoZSBob29rcyBpZiBhbnkuCisgKgorICogTm90ZSB0aGF0IFBJTyBvcGVyYXRpb25zIGFyZSBhbHdheXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGVpciBjb3JyZXNvbmRpbmcKKyAqIE1NSU8gb3BlcmF0aW9ucy4gVGhhdCBhbGxvd3MgcGxhdGZvcm1zIGxpa2UgaVNlcmllcyB3aG8gd2FudCB0byBtb2RpZnkgdGhlCisgKiBiZWhhdmlvdXIgb2YgYm90aCB0byBvbmx5IGhvb2sgb24gdGhlIE1NSU8gdmVyc2lvbiBhbmQgZ2V0IGJvdGguIEl0J3MgYWxzbworICogcG9zc2libGUgdG8gaG9vayBkaXJlY3RseSBhdCB0aGUgdG9wbGV2ZWwgUElPIG9wZXJhdGlvbiBpZiB0aGV5IGhhdmUgdG8KKyAqIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkKKyAqLworI2RlZmluZSBfX2RvX3dyaXRlYih2YWwsIGFkZHIpCW91dF84KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRldyh2YWwsIGFkZHIpCW91dF9sZTE2KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRlbCh2YWwsIGFkZHIpCW91dF9sZTMyKFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRlcSh2YWwsIGFkZHIpCW91dF9sZTY0KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRld19iZSh2YWwsIGFkZHIpIG91dF9iZTE2KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRlbF9iZSh2YWwsIGFkZHIpIG91dF9iZTMyKFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorI2RlZmluZSBfX2RvX3dyaXRlcV9iZSh2YWwsIGFkZHIpIG91dF9iZTY0KFBDSV9GSVhfQUREUihhZGRyKSwgdmFsKQorCisjaWZkZWYgQ09ORklHX0VFSAorI2RlZmluZSBfX2RvX3JlYWRiKGFkZHIpCWVlaF9yZWFkYihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHcoYWRkcikJZWVoX3JlYWR3KFBDSV9GSVhfQUREUihhZGRyKSkKKyNkZWZpbmUgX19kb19yZWFkbChhZGRyKQllZWhfcmVhZGwoUENJX0ZJWF9BRERSKGFkZHIpKQorI2RlZmluZSBfX2RvX3JlYWRxKGFkZHIpCWVlaF9yZWFkcShQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHdfYmUoYWRkcikJZWVoX3JlYWR3X2JlKFBDSV9GSVhfQUREUihhZGRyKSkKKyNkZWZpbmUgX19kb19yZWFkbF9iZShhZGRyKQllZWhfcmVhZGxfYmUoUENJX0ZJWF9BRERSKGFkZHIpKQorI2RlZmluZSBfX2RvX3JlYWRxX2JlKGFkZHIpCWVlaF9yZWFkcV9iZShQQ0lfRklYX0FERFIoYWRkcikpCisjZWxzZSAvKiBDT05GSUdfRUVIICovCisjZGVmaW5lIF9fZG9fcmVhZGIoYWRkcikJaW5fOChQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHcoYWRkcikJaW5fbGUxNihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZGwoYWRkcikJaW5fbGUzMihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHEoYWRkcikJaW5fbGU2NChQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHdfYmUoYWRkcikJaW5fYmUxNihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZGxfYmUoYWRkcikJaW5fYmUzMihQQ0lfRklYX0FERFIoYWRkcikpCisjZGVmaW5lIF9fZG9fcmVhZHFfYmUoYWRkcikJaW5fYmU2NChQQ0lfRklYX0FERFIoYWRkcikpCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX0VFSCkgKi8KKworI2lmZGVmIENPTkZJR19QUEMzMgorI2RlZmluZSBfX2RvX291dGIodmFsLCBwb3J0KQlfcmVjX291dGIodmFsLCBwb3J0KQorI2RlZmluZSBfX2RvX291dHcodmFsLCBwb3J0KQlfcmVjX291dHcodmFsLCBwb3J0KQorI2RlZmluZSBfX2RvX291dGwodmFsLCBwb3J0KQlfcmVjX291dGwodmFsLCBwb3J0KQorI2RlZmluZSBfX2RvX2luYihwb3J0KQkJX3JlY19pbmIocG9ydCkKKyNkZWZpbmUgX19kb19pbncocG9ydCkJCV9yZWNfaW53KHBvcnQpCisjZGVmaW5lIF9fZG9faW5sKHBvcnQpCQlfcmVjX2lubChwb3J0KQorI2Vsc2UgLyogQ09ORklHX1BQQzMyICovCisjZGVmaW5lIF9fZG9fb3V0Yih2YWwsIHBvcnQpCXdyaXRlYih2YWwsKFBDSV9JT19BRERSKV9JT19CQVNFK3BvcnQpOworI2RlZmluZSBfX2RvX291dHcodmFsLCBwb3J0KQl3cml0ZXcodmFsLChQQ0lfSU9fQUREUilfSU9fQkFTRStwb3J0KTsKKyNkZWZpbmUgX19kb19vdXRsKHZhbCwgcG9ydCkJd3JpdGVsKHZhbCwoUENJX0lPX0FERFIpX0lPX0JBU0UrcG9ydCk7CisjZGVmaW5lIF9fZG9faW5iKHBvcnQpCQlyZWFkYigoUENJX0lPX0FERFIpX0lPX0JBU0UgKyBwb3J0KTsKKyNkZWZpbmUgX19kb19pbncocG9ydCkJCXJlYWR3KChQQ0lfSU9fQUREUilfSU9fQkFTRSArIHBvcnQpOworI2RlZmluZSBfX2RvX2lubChwb3J0KQkJcmVhZGwoKFBDSV9JT19BRERSKV9JT19CQVNFICsgcG9ydCk7CisjZW5kaWYgLyogIUNPTkZJR19QUEMzMiAqLworCisjaWZkZWYgQ09ORklHX0VFSAorI2RlZmluZSBfX2RvX3JlYWRzYihhLCBiLCBuKQllZWhfcmVhZHNiKFBDSV9GSVhfQUREUihhKSwgKGIpLCAobikpCisjZGVmaW5lIF9fZG9fcmVhZHN3KGEsIGIsIG4pCWVlaF9yZWFkc3coUENJX0ZJWF9BRERSKGEpLCAoYiksIChuKSkKKyNkZWZpbmUgX19kb19yZWFkc2woYSwgYiwgbikJZWVoX3JlYWRzbChQQ0lfRklYX0FERFIoYSksIChiKSwgKG4pKQorI2Vsc2UgLyogQ09ORklHX0VFSCAqLworI2RlZmluZSBfX2RvX3JlYWRzYihhLCBiLCBuKQlfaW5zYihQQ0lfRklYX0FERFIoYSksIChiKSwgKG4pKQorI2RlZmluZSBfX2RvX3JlYWRzdyhhLCBiLCBuKQlfaW5zdyhQQ0lfRklYX0FERFIoYSksIChiKSwgKG4pKQorI2RlZmluZSBfX2RvX3JlYWRzbChhLCBiLCBuKQlfaW5zbChQQ0lfRklYX0FERFIoYSksIChiKSwgKG4pKQorI2VuZGlmIC8qICFDT05GSUdfRUVIICovCisjZGVmaW5lIF9fZG9fd3JpdGVzYihhLCBiLCBuKQlfb3V0c2IoUENJX0ZJWF9BRERSKGEpLChiKSwobikpCisjZGVmaW5lIF9fZG9fd3JpdGVzdyhhLCBiLCBuKQlfb3V0c3coUENJX0ZJWF9BRERSKGEpLChiKSwobikpCisjZGVmaW5lIF9fZG9fd3JpdGVzbChhLCBiLCBuKQlfb3V0c2woUENJX0ZJWF9BRERSKGEpLChiKSwobikpCisKKyNkZWZpbmUgX19kb19pbnNiKHAsIGIsIG4pCXJlYWRzYigoUENJX0lPX0FERFIpX0lPX0JBU0UrKHApLCAoYiksIChuKSkKKyNkZWZpbmUgX19kb19pbnN3KHAsIGIsIG4pCXJlYWRzdygoUENJX0lPX0FERFIpX0lPX0JBU0UrKHApLCAoYiksIChuKSkKKyNkZWZpbmUgX19kb19pbnNsKHAsIGIsIG4pCXJlYWRzbCgoUENJX0lPX0FERFIpX0lPX0JBU0UrKHApLCAoYiksIChuKSkKKyNkZWZpbmUgX19kb19vdXRzYihwLCBiLCBuKQl3cml0ZXNiKChQQ0lfSU9fQUREUilfSU9fQkFTRSsocCksKGIpLChuKSkKKyNkZWZpbmUgX19kb19vdXRzdyhwLCBiLCBuKQl3cml0ZXN3KChQQ0lfSU9fQUREUilfSU9fQkFTRSsocCksKGIpLChuKSkKKyNkZWZpbmUgX19kb19vdXRzbChwLCBiLCBuKQl3cml0ZXNsKChQQ0lfSU9fQUREUilfSU9fQkFTRSsocCksKGIpLChuKSkKKworI2RlZmluZSBfX2RvX21lbXNldF9pbyhhZGRyLCBjLCBuKQlcCisJCQkJX21lbXNldF9pbyhQQ0lfRklYX0FERFIoYWRkciksIGMsIG4pCisjZGVmaW5lIF9fZG9fbWVtY3B5X3RvaW8oZHN0LCBzcmMsIG4pCVwKKwkJCQlfbWVtY3B5X3RvaW8oUENJX0ZJWF9BRERSKGRzdCksIHNyYywgbikKKworI2lmZGVmIENPTkZJR19FRUgKKyNkZWZpbmUgX19kb19tZW1jcHlfZnJvbWlvKGRzdCwgc3JjLCBuKQlcCisJCQkJZWVoX21lbWNweV9mcm9taW8oZHN0LCBQQ0lfRklYX0FERFIoc3JjKSwgbikKKyNlbHNlIC8qIENPTkZJR19FRUggKi8KKyNkZWZpbmUgX19kb19tZW1jcHlfZnJvbWlvKGRzdCwgc3JjLCBuKQlcCisJCQkJX21lbWNweV9mcm9taW8oZHN0LFBDSV9GSVhfQUREUihzcmMpLG4pCisjZW5kaWYgLyogIUNPTkZJR19FRUggKi8KKworI2lmZGVmIENPTkZJR19QUENfSU5ESVJFQ1RfSU8KKyNkZWZpbmUgREVGX1BDSV9IT09LKHgpCQl4CisjZWxzZQorI2RlZmluZSBERUZfUENJX0hPT0soeCkJCU5VTEwKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgdGhlIGhvb2tzICovCitleHRlcm4gc3RydWN0IHBwY19wY2lfaW8geworCisjZGVmaW5lIERFRl9QQ0lfQUNfUkVUKG5hbWUsIHJldCwgYXQsIGFsKQlyZXQgKCpuYW1lKSBhdDsKKyNkZWZpbmUgREVGX1BDSV9BQ19OT1JFVChuYW1lLCBhdCwgYWwpCQl2b2lkICgqbmFtZSkgYXQ7CisKKyNpbmNsdWRlIDxhc20vaW8tZGVmcy5oPgorCisjdW5kZWYgREVGX1BDSV9BQ19SRVQKKyN1bmRlZiBERUZfUENJX0FDX05PUkVUCisKK30gcHBjX3BjaV9pbzsKKworLyogVGhlIGlubGluZSB3cmFwcGVycyAqLworI2RlZmluZSBERUZfUENJX0FDX1JFVChuYW1lLCByZXQsIGF0LCBhbCkJCQlcCitzdGF0aWMgaW5saW5lIHJldCBuYW1lIGF0CQkJCQlcCit7CQkJCQkJCQlcCisJaWYgKERFRl9QQ0lfSE9PSyhwcGNfcGNpX2lvLm5hbWUpICE9IE5VTEwpCQlcCisJCXJldHVybiBwcGNfcGNpX2lvLm5hbWUgYWw7CQkJXAorCXJldHVybiBfX2RvXyMjbmFtZSBhbDsJCQkJCVwKK30KKworI2RlZmluZSBERUZfUENJX0FDX05PUkVUKG5hbWUsIGF0LCBhbCkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIG5hbWUgYXQJCQkJCVwKK3sJCQkJCQkJCVwKKwlpZiAoREVGX1BDSV9IT09LKHBwY19wY2lfaW8ubmFtZSkgIT0gTlVMTCkJCVwKKwkJcHBjX3BjaV9pby5uYW1lIGFsOwkJCQlcCisJZWxzZQkJCQkJCQlcCisJCV9fZG9fIyNuYW1lIGFsOwkJCQkJXAorfQorCisjaW5jbHVkZSA8YXNtL2lvLWRlZnMuaD4KKworI3VuZGVmIERFRl9QQ0lfQUNfUkVUCisjdW5kZWYgREVGX1BDSV9BQ19OT1JFVAorCisvKiBTb21lIGRyaXZlcnMgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiByZWFkcSAmIHdyaXRlcSB3aXRoCisgKiBhICNpZmRlZiwgc28gd2UgbWFrZSB0aGVtIGhhcHB5IGhlcmUuCisgKi8KKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisjZGVmaW5lIHJlYWRxCXJlYWRxCisjZGVmaW5lIHdyaXRlcQl3cml0ZXEKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQorCisjZGVmaW5lIGRtYV9jYWNoZV9pbnYoX3N0YXJ0LF9zaXplKSBcCisJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoX3N0YXJ0LCAoX3N0YXJ0ICsgX3NpemUpKQorI2RlZmluZSBkbWFfY2FjaGVfd2JhY2soX3N0YXJ0LF9zaXplKSBcCisJY2xlYW5fZGNhY2hlX3JhbmdlKF9zdGFydCwgKF9zdGFydCArIF9zaXplKSkKKyNkZWZpbmUgZG1hX2NhY2hlX3diYWNrX2ludihfc3RhcnQsX3NpemUpIFwKKwlmbHVzaF9kY2FjaGVfcmFuZ2UoX3N0YXJ0LCAoX3N0YXJ0ICsgX3NpemUpKQorCisjZWxzZSAvKiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFICovCisKKyNkZWZpbmUgZG1hX2NhY2hlX2ludihfc3RhcnQsX3NpemUpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRtYV9jYWNoZV93YmFjayhfc3RhcnQsX3NpemUpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGRtYV9jYWNoZV93YmFja19pbnYoX3N0YXJ0LF9zaXplKQlkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiAhQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSAqLworCisvKgorICogQ29udmVydCBhIHBoeXNpY2FsIHBvaW50ZXIgdG8gYSB2aXJ0dWFsIGtlcm5lbCBwb2ludGVyIGZvciAvZGV2L21lbQorICogYWNjZXNzCisgKi8KKyNkZWZpbmUgeGxhdGVfZGV2X21lbV9wdHIocCkJX192YShwKQorCisvKgorICogQ29udmVydCBhIHZpcnR1YWwgY2FjaGVkIHBvaW50ZXIgdG8gYW4gdW5jYWNoZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHhsYXRlX2Rldl9rbWVtX3B0cihwKQlwCisKKy8qCisgKiBXZSBkb24ndCBkbyByZWxheGVkIG9wZXJhdGlvbnMgeWV0LCBhdCBsZWFzdCBub3Qgd2l0aCB0aGlzIHNlbWFudGljCisgKi8KICNkZWZpbmUgcmVhZGJfcmVsYXhlZChhZGRyKSByZWFkYihhZGRyKQogI2RlZmluZSByZWFkd19yZWxheGVkKGFkZHIpIHJlYWR3KGFkZHIpCiAjZGVmaW5lIHJlYWRsX3JlbGF4ZWQoYWRkcikgcmVhZGwoYWRkcikKICNkZWZpbmUgcmVhZHFfcmVsYXhlZChhZGRyKSByZWFkcShhZGRyKQogCi1leHRlcm4gdm9pZCBfaW5zYih2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgX291dHNiKHZvbGF0aWxlIHU4IF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBfaW5zd19ucyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIF9vdXRzd19ucyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIF9pbnNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgX291dHNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotCisjaWZkZWYgQ09ORklHX1BQQzMyCisjZGVmaW5lIG1taW93YigpCisjZWxzZQorLyoKKyAqIEVuZm9yY2Ugc3luY2hyb25pc2F0aW9uIG9mIHN0b3JlcyB2cy4gc3Bpbl91bmxvY2sKKyAqICh0aGlzIGRvZXMgaXQgZXhwbGljaXRlbHksIHRob3VnaCBvdXIgaW1wbGVtZW50YXRpb24gb2Ygc3Bpbl91bmxvY2sKKyAqIGRvZXMgaXQgaW1wbGljaXRlbHkgdG9vKQorICovCiBzdGF0aWMgaW5saW5lIHZvaWQgbW1pb3diKHZvaWQpCiB7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7Ci0JZ2V0X3BhY2EoKS0+aW9fc3luYyA9IDA7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsgbGkgJTAsMDsgc3RiICUwLCUxKDEzKSIKKwk6ICI9JnIiICh0bXApIDogImkiIChvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGlvX3N5bmMpKQorCTogIm1lbW9yeSIpOwogfQorI2VuZGlmIC8qICFDT05GSUdfUFBDMzIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGlvc3luYyh2b2lkKQoreworICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKK30KKworLyogRW5mb3JjZSBpbi1vcmRlciBleGVjdXRpb24gb2YgZGF0YSBJL08uCisgKiBObyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHJlYWQvd3JpdGUgb24gUFBDOyB1c2UgZWllaW8gZm9yIGFsbCB0aHJlZS4KKyAqIFRob3NlIGFyZSBmYWlybHkgd2VlayB0aG91Z2guIFRoZXkgZG9uJ3QgcHJvdmlkZSBhIGJhcnJpZXIgYmV0d2VlbgorICogTU1JTyBhbmQgY2FjaGVhYmxlIHN0b3JhZ2Ugbm9yIGRvIHRoZXkgcHJvdmlkZSBhIGJhcnJpZXIgdnMuIGxvY2tzLAorICogdGhleSBvbmx5IHByb3ZpZGUgYmFycmllcnMgYmV0d2VlbiAyIF9fcmF3IE1NSU8gb3BlcmF0aW9ucyBhbmQKKyAqIHBvc3NpYmx5IGJyZWFrIHdyaXRlIGNvbWJpbmluZy4KKyAqLworI2RlZmluZSBpb2JhcnJpZXJfcncoKSBlaWVpbygpCisjZGVmaW5lIGlvYmFycmllcl9yKCkgIGVpZWlvKCkKKyNkZWZpbmUgaW9iYXJyaWVyX3coKSAgZWllaW8oKQorCiAKIC8qCiAgKiBvdXRwdXQgcGF1c2UgdmVyc2lvbnMgbmVlZCBhIGRlbGF5IGF0IGxlYXN0IGZvciB0aGUKQEAgLTE4MiwxMSArNTc5LDYgQEAKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgfigwVUwpCiAKIAotZXh0ZXJuIGludCBfX2lvcmVtYXBfZXhwbGljaXQodW5zaWduZWQgbG9uZyBwX2FkZHIsIHVuc2lnbmVkIGxvbmcgdl9hZGRyLAotCQkgICAgIAkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgX19pb21lbSAqX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci0KIC8qKgogICogaW9yZW1hcCAgICAgLSAgIG1hcCBidXMgbWVtb3J5IGludG8gQ1BVIHNwYWNlCiAgKiBAYWRkcmVzczogICBidXMgYWRkcmVzcyBvZiB0aGUgbWVtb3J5CkBAIC0xOTcsMTQgKzU4OSw3NyBAQAogICogd3JpdGV3L3dyaXRlbCBmdW5jdGlvbnMgYW5kIHRoZSBvdGhlciBtbWlvIGhlbHBlcnMuIFRoZSByZXR1cm5lZAogICogYWRkcmVzcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1c2FibGUgZGlyZWN0bHkgYXMgYSB2aXJ0dWFsCiAgKiBhZGRyZXNzLgorICoKKyAqIFdlIHByb3ZpZGUgYSBmZXcgdmFyaWF0aW9ucyBvZiBpdDoKKyAqCisgKiAqIGlvcmVtYXAgaXMgdGhlIHN0YW5kYXJkIG9uZSBhbmQgcHJvdmlkZXMgbm9uLWNhY2hlYWJsZSBndWFyZGVkIG1hcHBpbmdzCisgKiAgIGFuZCBjYW4gYmUgaG9va2VkIGJ5IHRoZSBwbGF0Zm9ybSB2aWEgcHBjX21kCisgKgorICogKiBpb3JlbWFwX2ZsYWdzIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBwYWdlIGZsYWdzIGFzIGFuIGFyZ3VtZW50IGFuZCBjYW4KKyAqICAgYWxzbyBiZSBob29rZWQgYnkgdGhlIHBsYXRmb3JtIHZpYSBwcGNfbWQKKyAqCisgKiAqIGlvcmVtYXBfbm9jYWNoZSBpcyBpZGVudGljYWwgdG8gaW9yZW1hcAorICoKKyAqICogaW91bm1hcCB1bmRvZXMgc3VjaCBhIG1hcHBpbmcgYW5kIGNhbiBiZSBob29rZWQKKyAqCisgKiAqIF9faW9yZW1hcF9leHBsaWNpdCAoYW5kIHRoZSBwZW5kaW5nIF9faW91bm1hcF9leHBsaWNpdCkgYXJlIGxvdyBsZXZlbAorICogICBmdW5jdGlvbnMgdG8gY3JlYXRlIGhhbmQtbWFkZSBtYXBwaW5ncyBmb3IgdXNlIG9ubHkgYnkgdGhlIFBDSSBjb2RlCisgKiAgIGFuZCBjYW5ub3QgY3VycmVudGx5IGJlIGhvb2tlZC4KKyAqCisgKiAqIF9faW9yZW1hcCBpcyB0aGUgbG93IGxldmVsIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgaW9yZW1hcCBhbmQKKyAqICAgaW9yZW1hcF9mbGFncyBhbmQgY2Fubm90IGJlIGhvb2tlZCAoYnV0IGNhbiBiZSB1c2VkIGJ5IGEgaG9vayBvbiBvbmUKKyAqICAgb2YgdGhlIHByZXZpb3VzIG9uZXMpCisgKgorICogKiBfX2lvdW5tYXAsIGlzIHRoZSBsb3cgbGV2ZWwgaW1wbGVtZW50YXRpb24gdXNlZCBieSBpb3VubWFwIGFuZCBjYW5ub3QKKyAqICAgYmUgaG9va2VkIChidXQgY2FuIGJlIHVzZWQgYnkgYSBob29rIG9uIGlvdW5tYXApCisgKgogICovCi1leHRlcm4gdm9pZCBfX2lvbWVtICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplKTsKLQorZXh0ZXJuIHZvaWQgX19pb21lbSAqaW9yZW1hcChwaHlzX2FkZHJfdCBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgX19pb21lbSAqaW9yZW1hcF9mbGFncyhwaHlzX2FkZHJfdCBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAjZGVmaW5lIGlvcmVtYXBfbm9jYWNoZShhZGRyLCBzaXplKQlpb3JlbWFwKChhZGRyKSwgKHNpemUpKQotZXh0ZXJuIGludCBpb3VubWFwX2V4cGxpY2l0KHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKKworZXh0ZXJuIHZvaWQgX19pb21lbSAqX19pb3JlbWFwKHBoeXNfYWRkcl90LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gdm9pZCBfX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKKworZXh0ZXJuIGludCBfX2lvcmVtYXBfZXhwbGljaXQocGh5c19hZGRyX3QgcF9hZGRyLCB1bnNpZ25lZCBsb25nIHZfYWRkciwKKwkJICAgICAJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiBpbnQgX19pb3VubWFwX2V4cGxpY2l0KHZvbGF0aWxlIHZvaWQgX19pb21lbSAqc3RhcnQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOworCiBleHRlcm4gdm9pZCBfX2lvbWVtICogcmVzZXJ2ZV9waGJfaW9zcGFjZSh1bnNpZ25lZCBsb25nIHNpemUpOwogCisvKiBUaG9zZSBhcmUgbW9yZSAzMiBiaXRzIG9ubHkgZnVuY3Rpb25zICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpb3BhKHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtbV9wdG92KHVuc2lnbmVkIGxvbmcgYWRkcikgX19hdHRyaWJ1dGVfY29uc3RfXzsKK2V4dGVybiB2b2lkIGlvX2Jsb2NrX21hcHBpbmcodW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKTsKKworCisvKgorICogV2hlbiBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIHNldCwgd2UgdXNlIHRoZSBnZW5lcmljIGlvbWFwIGltcGxlbWVudGF0aW9uCisgKiB3aGljaCBuZWVkcyBzb21lIGFkZGl0aW9uYWwgZGVmaW5pdGlvbnMgaGVyZS4gVGhleSBiYXNpY2FsbHkgYWxsb3cgUElPCisgKiBzcGFjZSBvdmVyYWxsIHRvIGJlIDFHQi4gVGhpcyB3aWxsIHdvcmsgYXMgbG9uZyBhcyB3ZSBuZXZlciB0cnkgdG8gdXNlCisgKiBpb21hcCB0byBtYXAgTU1JTyBiZWxvdyAxR0Igd2hpY2ggc2hvdWxkIGJlIGZpbmUgb24gcHBjNjQKKyAqLworI2RlZmluZSBIQVZFX0FSQ0hfUElPX1NJWkUJCTEKKyNkZWZpbmUgUElPX09GRlNFVAkJCTB4MDAwMDAwMDBVTAorI2RlZmluZSBQSU9fTUFTSwkJCTB4M2ZmZmZmZmZVTAorI2RlZmluZSBQSU9fUkVTRVJWRUQJCQkweDQwMDAwMDAwVUwKKworI2RlZmluZSBtbWlvX3JlYWQxNmJlKGFkZHIpCQlyZWFkd19iZShhZGRyKQorI2RlZmluZSBtbWlvX3JlYWQzMmJlKGFkZHIpCQlyZWFkbF9iZShhZGRyKQorI2RlZmluZSBtbWlvX3dyaXRlMTZiZSh2YWwsIGFkZHIpCXdyaXRld19iZSh2YWwsIGFkZHIpCisjZGVmaW5lIG1taW9fd3JpdGUzMmJlKHZhbCwgYWRkcikJd3JpdGVsX2JlKHZhbCwgYWRkcikKKyNkZWZpbmUgbW1pb19pbnNiKGFkZHIsIGRzdCwgY291bnQpCXJlYWRzYihhZGRyLCBkc3QsIGNvdW50KQorI2RlZmluZSBtbWlvX2luc3coYWRkciwgZHN0LCBjb3VudCkJcmVhZHN3KGFkZHIsIGRzdCwgY291bnQpCisjZGVmaW5lIG1taW9faW5zbChhZGRyLCBkc3QsIGNvdW50KQlyZWFkc2woYWRkciwgZHN0LCBjb3VudCkKKyNkZWZpbmUgbW1pb19vdXRzYihhZGRyLCBzcmMsIGNvdW50KQl3cml0ZXNiKGFkZHIsIHNyYywgY291bnQpCisjZGVmaW5lIG1taW9fb3V0c3coYWRkciwgc3JjLCBjb3VudCkJd3JpdGVzdyhhZGRyLCBzcmMsIGNvdW50KQorI2RlZmluZSBtbWlvX291dHNsKGFkZHIsIHNyYywgY291bnQpCXdyaXRlc2woYWRkciwgc3JjLCBjb3VudCkKKwogLyoqCiAgKgl2aXJ0X3RvX3BoeXMJLQltYXAgdmlydHVhbCBhZGRyZXNzZXMgdG8gcGh5c2ljYWwKICAqCUBhZGRyZXNzOiBhZGRyZXNzIHRvIHJlbWFwCkBAIC0yNTEsMTc4ICs3MDYsMzMgQEAKICAqLwogI2RlZmluZSBCSU9fVk1FUkdFX0JPVU5EQVJZCTAKIAotc3RhdGljIGlubGluZSB2b2lkIGlvc3luYyh2b2lkKQotewotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKLX0KLQotLyogRW5mb3JjZSBpbi1vcmRlciBleGVjdXRpb24gb2YgZGF0YSBJL08uIAotICogTm8gZGlzdGluY3Rpb24gYmV0d2VlbiByZWFkL3dyaXRlIG9uIFBQQzsgdXNlIGVpZWlvIGZvciBhbGwgdGhyZWUuCi0gKi8KLSNkZWZpbmUgaW9iYXJyaWVyX3J3KCkgZWllaW8oKQotI2RlZmluZSBpb2JhcnJpZXJfcigpICBlaWVpbygpCi0jZGVmaW5lIGlvYmFycmllcl93KCkgIGVpZWlvKCkKLQogLyoKLSAqIDgsIDE2IGFuZCAzMiBiaXQsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBJL08gb3BlcmF0aW9ucywgd2l0aCBiYXJyaWVyLgotICogVGhlc2Ugcm91dGluZXMgZG8gbm90IHBlcmZvcm0gRUVILXJlbGF0ZWQgSS9PIGFkZHJlc3MgdHJhbnNsYXRpb24sCi0gKiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IGRldmljZSBkcml2ZXJzLiAgVXNlIGluYi9yZWFkYgotICogaW5zdGVhZC4KKyAqIDMyIGJpdHMgc3RpbGwgdXNlcyB2aXJ0X3RvX2J1cygpIGZvciBpdCdzIGltcGxlbWVudGF0aW9uIG9mIERNQQorICogbWFwcGluZ3Mgc2Ugd2UgaGF2ZSB0byBrZWVwIGl0IGRlZmluZWQgaGVyZS4gV2UgYWxzbyBoYXZlIHNvbWUgb2xkCisgKiBkcml2ZXJzIChzaGFtZSBzaGFtZSBzaGFtZSkgdGhhdCB1c2UgYnVzX3RvX3ZpcnQoKSBhbmQgaGF2ZW4ndCBiZWVuCisgKiBmaXhlZCB5ZXQgc28gSSBuZWVkIHRvIGRlZmluZSBpdCBoZXJlLgogICovCi1zdGF0aWMgaW5saW5lIGludCBfX2luXzgoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICphZGRyKQotewotCWludCByZXQ7CisjaWZkZWYgQ09ORklHX1BQQzMyCiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsgbGJ6JVUxJVgxICUwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKLQkJCSAgICAgOiAiPXIiIChyZXQpIDogIm0iICgqYWRkcikpOwotCXJldHVybiByZXQ7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19idXModm9sYXRpbGUgdm9pZCAqIGFkZHJlc3MpCit7CisgICAgICAgIGlmIChhZGRyZXNzID09IE5VTEwpCisJCXJldHVybiAwOworICAgICAgICByZXR1cm4gX19wYShhZGRyZXNzKSArIFBDSV9EUkFNX09GRlNFVDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fb3V0Xzgodm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICphZGRyLCBpbnQgdmFsKQorc3RhdGljIGlubGluZSB2b2lkICogYnVzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBzdGIlVTAlWDAgJTEsJTAiCi0JCQkgICAgIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpKTsKLQlnZXRfcGFjYSgpLT5pb19zeW5jID0gMTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBfX3ZhKGFkZHJlc3MgLSBQQ0lfRFJBTV9PRkZTRVQpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX2luX2xlMTYoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkcikKLXsKLQlpbnQgcmV0OworI2RlZmluZSBwYWdlX3RvX2J1cyhwYWdlKQkocGFnZV90b19waHlzKHBhZ2UpICsgUENJX0RSQU1fT0ZGU0VUKQogCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IGxoYnJ4ICUwLDAsJTE7IHR3aSAwLCUwLDA7IGlzeW5jIgotCQkJICAgICA6ICI9ciIgKHJldCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7Ci0JcmV0dXJuIHJldDsKLX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KIAotc3RhdGljIGlubGluZSBpbnQgX19pbl9iZTE2KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKmFkZHIpCi17Ci0JaW50IHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jOyBsaHolVTElWDEgJTAsJTE7IHR3aSAwLCUwLDA7IGlzeW5jIgotCQkJICAgICA6ICI9ciIgKHJldCkgOiAibSIgKCphZGRyKSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fb3V0X2xlMTYodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkciwgaW50IHZhbCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsgc3RoYnJ4ICUxLDAsJTIiCi0JCQkgICAgIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKLQlnZXRfcGFjYSgpLT5pb19zeW5jID0gMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fb3V0X2JlMTYodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19pb21lbSAqYWRkciwgaW50IHZhbCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsgc3RoJVUwJVgwICUxLCUwIgotCQkJICAgICA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSk7Ci0JZ2V0X3BhY2EoKS0+aW9fc3luYyA9IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgX19pbl9sZTMyKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIpCi17Ci0JdW5zaWduZWQgcmV0OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IGx3YnJ4ICUwLDAsJTE7IHR3aSAwLCUwLDA7IGlzeW5jIgotCQkJICAgICA6ICI9ciIgKHJldCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBfX2luX2JlMzIoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgX19pb21lbSAqYWRkcikKLXsKLQl1bnNpZ25lZCByZXQ7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYzsgbHd6JVUxJVgxICUwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKLQkJCSAgICAgOiAiPXIiIChyZXQpIDogIm0iICgqYWRkcikpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dF9sZTMyKHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIsIGludCB2YWwpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IHN0d2JyeCAlMSwwLCUyIiA6ICI9bSIgKCphZGRyKQotCQkJICAgICA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7Ci0JZ2V0X3BhY2EoKS0+aW9fc3luYyA9IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dF9iZTMyKHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKmFkZHIsIGludCB2YWwpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IHN0dyVVMCVYMCAlMSwlMCIKLQkJCSAgICAgOiAiPW0iICgqYWRkcikgOiAiciIgKHZhbCkpOwotCWdldF9wYWNhKCktPmlvX3N5bmMgPSAxOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19pbl9sZTY0KGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHRtcCwgcmV0OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCQkgICAgICJzeW5jXG4iCi0JCQkgICAgICJsZCAlMSwwKCUyKVxuIgotCQkJICAgICAidHdpIDAsJTEsMFxuIgotCQkJICAgICAiaXN5bmNcbiIKLQkJCSAgICAgInJsZGltaSAlMCwlMSw1KjgsMSo4XG4iCi0JCQkgICAgICJybGRpbWkgJTAsJTEsMyo4LDIqOFxuIgotCQkJICAgICAicmxkaW1pICUwLCUxLDEqOCwzKjhcbiIKLQkJCSAgICAgInJsZGltaSAlMCwlMSw3KjgsNCo4XG4iCi0JCQkgICAgICJybGRpY2wgJTEsJTEsMzIsMFxuIgotCQkJICAgICAicmx3aW1pICUwLCUxLDgsOCwzMVxuIgotCQkJICAgICAicmx3aW1pICUwLCUxLDI0LDE2LDIzXG4iCi0JCQkgICAgIDogIj1yIiAocmV0KSAsICI9ciIgKHRtcCkgOiAiYiIgKGFkZHIpICwgIm0iICgqYWRkcikpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2luX2JlNjQoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2lvbWVtICphZGRyKQotewotCXVuc2lnbmVkIGxvbmcgcmV0OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IGxkJVUxJVgxICUwLCUxOyB0d2kgMCwlMCwwOyBpc3luYyIKLQkJCSAgICAgOiAiPXIiIChyZXQpIDogIm0iICgqYWRkcikpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dF9sZTY0KHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkciwgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJCSAgICAgInJsZGltaSAlMCwlMSw1KjgsMSo4XG4iCi0JCQkgICAgICJybGRpbWkgJTAsJTEsMyo4LDIqOFxuIgotCQkJICAgICAicmxkaW1pICUwLCUxLDEqOCwzKjhcbiIKLQkJCSAgICAgInJsZGltaSAlMCwlMSw3KjgsNCo4XG4iCi0JCQkgICAgICJybGRpY2wgJTEsJTEsMzIsMFxuIgotCQkJICAgICAicmx3aW1pICUwLCUxLDgsOCwzMVxuIgotCQkJICAgICAicmx3aW1pICUwLCUxLDI0LDE2LDIzXG4iCi0JCQkgICAgICJzeW5jXG4iCi0JCQkgICAgICJzdGQgJTAsMCglMykiCi0JCQkgICAgIDogIj0mciIgKHRtcCkgLCAiPSZyIiAodmFsKSA6ICIxIiAodmFsKSAsICJiIiAoYWRkcikgLCAibSIgKCphZGRyKSk7Ci0JZ2V0X3BhY2EoKS0+aW9fc3luYyA9IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dF9iZTY0KHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqYWRkciwgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmM7IHN0ZCVVMCVYMCAlMSwlMCIgOiAiPW0iICgqYWRkcikgOiAiciIgKHZhbCkpOwotCWdldF9wYWNhKCktPmlvX3N5bmMgPSAxOwotfQotCi0jaW5jbHVkZSA8YXNtL2VlaC5oPgotCi0vKiBOb3RoaW5nIHRvIGRvICovCi0KLSNkZWZpbmUgZG1hX2NhY2hlX2ludihfc3RhcnQsX3NpemUpCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGRtYV9jYWNoZV93YmFjayhfc3RhcnQsX3NpemUpCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGRtYV9jYWNoZV93YmFja19pbnYoX3N0YXJ0LF9zaXplKQlkbyB7IH0gd2hpbGUgKDApCi0KLQotLyoKLSAqIENvbnZlcnQgYSBwaHlzaWNhbCBwb2ludGVyIHRvIGEgdmlydHVhbCBrZXJuZWwgcG9pbnRlciBmb3IgL2Rldi9tZW0KLSAqIGFjY2VzcwotICovCi0jZGVmaW5lIHhsYXRlX2Rldl9tZW1fcHRyKHApCV9fdmEocCkKLQotLyoKLSAqIENvbnZlcnQgYSB2aXJ0dWFsIGNhY2hlZCBwb2ludGVyIHRvIGFuIHVuY2FjaGVkIHBvaW50ZXIKLSAqLwotI2RlZmluZSB4bGF0ZV9kZXZfa21lbV9wdHIocCkJcAogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCi0jZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9tbXUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9tbXUuaAppbmRleCBhNWU5ODY0Li5mODVkYmQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pb21tdS5oCkBAIC0yMiwxNyArMjIsMzUgQEAKICNkZWZpbmUgX0FTTV9JT01NVV9ICiAjaWZkZWYgX19LRVJORUxfXwogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorCisjZGVmaW5lIElPTU1VX1BBR0VfU0hJRlQgICAgICAxMgorI2RlZmluZSBJT01NVV9QQUdFX1NJWkUgICAgICAgKEFTTV9DT05TVCgxKSA8PCBJT01NVV9QQUdFX1NISUZUKQorI2RlZmluZSBJT01NVV9QQUdFX01BU0sgICAgICAgKH4oKDEgPDwgSU9NTVVfUEFHRV9TSElGVCkgLSAxKSkKKyNkZWZpbmUgSU9NTVVfUEFHRV9BTElHTihhZGRyKSBfQUxJR05fVVAoYWRkciwgSU9NTVVfUEFHRV9TSVpFKQorCisvKiBCb290IHRpbWUgZmxhZ3MgKi8KK2V4dGVybiBpbnQgaW9tbXVfaXNfb2ZmOworZXh0ZXJuIGludCBpb21tdV9mb3JjZV9vbjsKKworLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gaW50IGdldF9pb21tdV9vcmRlcih1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIF9faWxvZzIoKHNpemUgLSAxKSA+PiBJT01NVV9QQUdFX1NISUZUKSArIDE7Cit9CisKIAogLyoKICAqIElPTUFQX01BWF9PUkRFUiBkZWZpbmVzIHRoZSBsYXJnZXN0IGNvbnRpZ3VvdXMgYmxvY2sKICAqIG9mIGRtYSBzcGFjZSB3ZSBjYW4gZ2V0LiAgSU9NQVBfTUFYX09SREVSID0gMTMKICAqIGFsbG93cyB1cCB0byAyKioxMiBwYWdlcyAoNDA5NiAqIDQwOTYpID0gMTYgTUIKICAqLwotI2RlZmluZSBJT01BUF9NQVhfT1JERVIgMTMKKyNkZWZpbmUgSU9NQVBfTUFYX09SREVSCQkxMwogCiBzdHJ1Y3QgaW9tbXVfdGFibGUgewogCXVuc2lnbmVkIGxvbmcgIGl0X2J1c25vOyAgICAgLyogQnVzIG51bWJlciB0aGlzIHRhYmxlIGJlbG9uZ3MgdG8gKi8KQEAgLTUyLDM5ICs3MCwzMSBAQAogc3RydWN0IHNjYXR0ZXJsaXN0Owogc3RydWN0IGRldmljZV9ub2RlOwogCi0jaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCi0KLS8qIFdhbGtzIGFsbCBidXNlcyBhbmQgY3JlYXRlcyBpb21tdSB0YWJsZXMgKi8KLWV4dGVybiB2b2lkIGlvbW11X3NldHVwX3BTZXJpZXModm9pZCk7Ci1leHRlcm4gdm9pZCBpb21tdV9zZXR1cF9kYXJ0KHZvaWQpOwotCiAvKiBGcmVlcyB0YWJsZSBmb3IgYW4gaW5kaXZpZHVhbCBkZXZpY2Ugbm9kZSAqLwogZXh0ZXJuIHZvaWQgaW9tbXVfZnJlZV90YWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKTsKIAotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwotCiAvKiBJbml0aWFsaXplcyBhbiBpb21tdV90YWJsZSBiYXNlZCBpbiB2YWx1ZXMgc2V0IGluIHRoZSBwYXNzZWQtaW4KICAqIHN0cnVjdHVyZQogICovCiBleHRlcm4gc3RydWN0IGlvbW11X3RhYmxlICppb21tdV9pbml0X3RhYmxlKHN0cnVjdCBpb21tdV90YWJsZSAqIHRibCwKIAkJCQkJICAgIGludCBuaWQpOwogCi1leHRlcm4gaW50IGlvbW11X21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLAotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgdW5zaWduZWQgbG9uZyBtYXNrLAotCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworZXh0ZXJuIGludCBpb21tdV9tYXBfc2coc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkJaW50IG5lbGVtcywgdW5zaWduZWQgbG9uZyBtYXNrLAorCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKIGV4dGVybiB2b2lkIGlvbW11X3VubWFwX3NnKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKwkJCSAgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CiAKIGV4dGVybiB2b2lkICppb21tdV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgc2l6ZV90IHNpemUsCi0JCWRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIHVuc2lnbmVkIGxvbmcgbWFzaywKLQkJZ2ZwX3QgZmxhZywgaW50IG5vZGUpOworCQkJCSAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBtYXNrLAorCQkJCSAgZ2ZwX3QgZmxhZywgaW50IG5vZGUpOwogZXh0ZXJuIHZvaWQgaW9tbXVfZnJlZV9jb2hlcmVudChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgc2l6ZV90IHNpemUsCi0JCXZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOworCQkJCXZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwogZXh0ZXJuIGRtYV9hZGRyX3QgaW9tbXVfbWFwX3NpbmdsZShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgdm9pZCAqdmFkZHIsCi0JCXNpemVfdCBzaXplLCB1bnNpZ25lZCBsb25nIG1hc2ssCi0JCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJCQkJICAgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgbWFzaywKKwkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwogZXh0ZXJuIHZvaWQgaW9tbXVfdW5tYXBfc2luZ2xlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCi0JCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCQkJICAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwogCiBleHRlcm4gdm9pZCBpb21tdV9pbml0X2Vhcmx5X3BTZXJpZXModm9pZCk7CiBleHRlcm4gdm9pZCBpb21tdV9pbml0X2Vhcmx5X2lTZXJpZXModm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaAppbmRleCBmOTYwZjUzLi40NjQ3NmU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmgKQEAgLTEzNSw2ICsxMzUsMTAgQEAKIAogZXh0ZXJuIHN0cnVjdCBpcnFfbWFwX2VudHJ5IGlycV9tYXBbTlJfSVJRU107CiAKK3N0YXRpYyBpbmxpbmUgaXJxX2h3X251bWJlcl90IHZpcnFfdG9faHcodW5zaWduZWQgaW50IHZpcnEpCit7CisJcmV0dXJuIGlycV9tYXBbdmlycV0uaHdpcnE7Cit9CiAKIC8qKgogICogaXJxX2FsbG9jX2hvc3QgLSBBbGxvY2F0ZSBhIG5ldyBpcnFfaG9zdCBkYXRhIHN0cnVjdHVyZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2lvbW11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaW9tbXUuaAppbmRleCAwZWRiZmUxLi42ZTMyM2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaW9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lzZXJpZXMvaW9tbXUuaApAQCAtMjEsMTEgKzIxLDEzIEBACiAgKiBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCitzdHJ1Y3QgcGNpX2RldjsKIHN0cnVjdCBkZXZpY2Vfbm9kZTsKIHN0cnVjdCBpb21tdV90YWJsZTsKIAogLyogQ3JlYXRlcyB0YWJsZSBmb3IgYW4gaW5kaXZpZHVhbCBkZXZpY2Ugbm9kZSAqLwotZXh0ZXJuIHZvaWQgaW9tbXVfZGV2bm9kZV9pbml0X2lTZXJpZXMoc3RydWN0IGRldmljZV9ub2RlICpkbik7CitleHRlcm4gdm9pZCBpb21tdV9kZXZub2RlX2luaXRfaVNlcmllcyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkbik7CiAKIC8qIEdldCB0YWJsZSBwYXJhbWV0ZXJzIGZyb20gSFYgKi8KIGV4dGVybiB2b2lkIGlvbW11X3RhYmxlX2dldHBhcm1zX2lTZXJpZXModW5zaWduZWQgbG9uZyBidXNubywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczM2JlZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHYxY2FsbC5oCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogIFBTMyBodmNhbGwgaW50ZXJmYWNlLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWYgIWRlZmluZWQoX0FTTV9QT1dFUlBDX0xWMUNBTExfSCkKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0xWMUNBTExfSAorCisjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogbHYxIGNhbGwgZGVjbGFyYXRpb24gbWFjcm9zICovCisKKyNkZWZpbmUgTFYxXzFfSU5fQVJHX0RFQ0wgdTY0IGluXzEKKyNkZWZpbmUgTFYxXzJfSU5fQVJHX0RFQ0wgTFYxXzFfSU5fQVJHX0RFQ0wsIHU2NCBpbl8yCisjZGVmaW5lIExWMV8zX0lOX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMLCB1NjQgaW5fMworI2RlZmluZSBMVjFfNF9JTl9BUkdfREVDTCBMVjFfM19JTl9BUkdfREVDTCwgdTY0IGluXzQKKyNkZWZpbmUgTFYxXzVfSU5fQVJHX0RFQ0wgTFYxXzRfSU5fQVJHX0RFQ0wsIHU2NCBpbl81CisjZGVmaW5lIExWMV82X0lOX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMLCB1NjQgaW5fNgorI2RlZmluZSBMVjFfN19JTl9BUkdfREVDTCBMVjFfNl9JTl9BUkdfREVDTCwgdTY0IGluXzcKKyNkZWZpbmUgTFYxXzhfSU5fQVJHX0RFQ0wgTFYxXzdfSU5fQVJHX0RFQ0wsIHU2NCBpbl84CisjZGVmaW5lIExWMV8xX09VVF9BUkdfREVDTCB1NjQgKm91dF8xCisjZGVmaW5lIExWMV8yX09VVF9BUkdfREVDTCBMVjFfMV9PVVRfQVJHX0RFQ0wsIHU2NCAqb3V0XzIKKyNkZWZpbmUgTFYxXzNfT1VUX0FSR19ERUNMIExWMV8yX09VVF9BUkdfREVDTCwgdTY0ICpvdXRfMworI2RlZmluZSBMVjFfNF9PVVRfQVJHX0RFQ0wgTFYxXzNfT1VUX0FSR19ERUNMLCB1NjQgKm91dF80CisjZGVmaW5lIExWMV81X09VVF9BUkdfREVDTCBMVjFfNF9PVVRfQVJHX0RFQ0wsIHU2NCAqb3V0XzUKKyNkZWZpbmUgTFYxXzZfT1VUX0FSR19ERUNMIExWMV81X09VVF9BUkdfREVDTCwgdTY0ICpvdXRfNgorI2RlZmluZSBMVjFfN19PVVRfQVJHX0RFQ0wgTFYxXzZfT1VUX0FSR19ERUNMLCB1NjQgKm91dF83CisKKyNkZWZpbmUgTFYxXzBfSU5fMF9PVVRfQVJHX0RFQ0wgdm9pZAorI2RlZmluZSBMVjFfMV9JTl8wX09VVF9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTAorI2RlZmluZSBMVjFfMl9JTl8wX09VVF9BUkdfREVDTCBMVjFfMl9JTl9BUkdfREVDTAorI2RlZmluZSBMVjFfM19JTl8wX09VVF9BUkdfREVDTCBMVjFfM19JTl9BUkdfREVDTAorI2RlZmluZSBMVjFfNF9JTl8wX09VVF9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTAorI2RlZmluZSBMVjFfNV9JTl8wX09VVF9BUkdfREVDTCBMVjFfNV9JTl9BUkdfREVDTAorI2RlZmluZSBMVjFfNl9JTl8wX09VVF9BUkdfREVDTCBMVjFfNl9JTl9BUkdfREVDTAorI2RlZmluZSBMVjFfN19JTl8wX09VVF9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTAorCisjZGVmaW5lIExWMV8wX0lOXzFfT1VUX0FSR19ERUNMICAgICAgICAgICAgICAgICAgICBMVjFfMV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzFfSU5fMV9PVVRfQVJHX0RFQ0wgTFYxXzFfSU5fQVJHX0RFQ0wsIExWMV8xX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfMl9JTl8xX09VVF9BUkdfREVDTCBMVjFfMl9JTl9BUkdfREVDTCwgTFYxXzFfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8zX0lOXzFfT1VUX0FSR19ERUNMIExWMV8zX0lOX0FSR19ERUNMLCBMVjFfMV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzRfSU5fMV9PVVRfQVJHX0RFQ0wgTFYxXzRfSU5fQVJHX0RFQ0wsIExWMV8xX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNV9JTl8xX09VVF9BUkdfREVDTCBMVjFfNV9JTl9BUkdfREVDTCwgTFYxXzFfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV82X0lOXzFfT1VUX0FSR19ERUNMIExWMV82X0lOX0FSR19ERUNMLCBMVjFfMV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzdfSU5fMV9PVVRfQVJHX0RFQ0wgTFYxXzdfSU5fQVJHX0RFQ0wsIExWMV8xX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfOF9JTl8xX09VVF9BUkdfREVDTCBMVjFfOF9JTl9BUkdfREVDTCwgTFYxXzFfT1VUX0FSR19ERUNMCisKKyNkZWZpbmUgTFYxXzBfSU5fMl9PVVRfQVJHX0RFQ0wgICAgICAgICAgICAgICAgICAgIExWMV8yX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfMV9JTl8yX09VVF9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTCwgTFYxXzJfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8yX0lOXzJfT1VUX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMLCBMVjFfMl9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzNfSU5fMl9PVVRfQVJHX0RFQ0wgTFYxXzNfSU5fQVJHX0RFQ0wsIExWMV8yX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNF9JTl8yX09VVF9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTCwgTFYxXzJfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV81X0lOXzJfT1VUX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMLCBMVjFfMl9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzZfSU5fMl9PVVRfQVJHX0RFQ0wgTFYxXzZfSU5fQVJHX0RFQ0wsIExWMV8yX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfN19JTl8yX09VVF9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTCwgTFYxXzJfT1VUX0FSR19ERUNMCisKKyNkZWZpbmUgTFYxXzBfSU5fM19PVVRfQVJHX0RFQ0wgICAgICAgICAgICAgICAgICAgIExWMV8zX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfMV9JTl8zX09VVF9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTCwgTFYxXzNfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8yX0lOXzNfT1VUX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMLCBMVjFfM19PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzNfSU5fM19PVVRfQVJHX0RFQ0wgTFYxXzNfSU5fQVJHX0RFQ0wsIExWMV8zX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNF9JTl8zX09VVF9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTCwgTFYxXzNfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV81X0lOXzNfT1VUX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMLCBMVjFfM19PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzZfSU5fM19PVVRfQVJHX0RFQ0wgTFYxXzZfSU5fQVJHX0RFQ0wsIExWMV8zX09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfN19JTl8zX09VVF9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTCwgTFYxXzNfT1VUX0FSR19ERUNMCisKKyNkZWZpbmUgTFYxXzBfSU5fNF9PVVRfQVJHX0RFQ0wgICAgICAgICAgICAgICAgICAgIExWMV80X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfMV9JTl80X09VVF9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTCwgTFYxXzRfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8yX0lOXzRfT1VUX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMLCBMVjFfNF9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzNfSU5fNF9PVVRfQVJHX0RFQ0wgTFYxXzNfSU5fQVJHX0RFQ0wsIExWMV80X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNF9JTl80X09VVF9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTCwgTFYxXzRfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV81X0lOXzRfT1VUX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMLCBMVjFfNF9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzZfSU5fNF9PVVRfQVJHX0RFQ0wgTFYxXzZfSU5fQVJHX0RFQ0wsIExWMV80X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfN19JTl80X09VVF9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTCwgTFYxXzRfT1VUX0FSR19ERUNMCisKKyNkZWZpbmUgTFYxXzBfSU5fNV9PVVRfQVJHX0RFQ0wgICAgICAgICAgICAgICAgICAgIExWMV81X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfMV9JTl81X09VVF9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTCwgTFYxXzVfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8yX0lOXzVfT1VUX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMLCBMVjFfNV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzNfSU5fNV9PVVRfQVJHX0RFQ0wgTFYxXzNfSU5fQVJHX0RFQ0wsIExWMV81X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNF9JTl81X09VVF9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTCwgTFYxXzVfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV81X0lOXzVfT1VUX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMLCBMVjFfNV9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzZfSU5fNV9PVVRfQVJHX0RFQ0wgTFYxXzZfSU5fQVJHX0RFQ0wsIExWMV81X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfN19JTl81X09VVF9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTCwgTFYxXzVfT1VUX0FSR19ERUNMCisKKyNkZWZpbmUgTFYxXzBfSU5fNl9PVVRfQVJHX0RFQ0wgICAgICAgICAgICAgICAgICAgIExWMV82X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfMV9JTl82X09VVF9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTCwgTFYxXzZfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8yX0lOXzZfT1VUX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMLCBMVjFfNl9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzNfSU5fNl9PVVRfQVJHX0RFQ0wgTFYxXzNfSU5fQVJHX0RFQ0wsIExWMV82X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNF9JTl82X09VVF9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTCwgTFYxXzZfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV81X0lOXzZfT1VUX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMLCBMVjFfNl9PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzZfSU5fNl9PVVRfQVJHX0RFQ0wgTFYxXzZfSU5fQVJHX0RFQ0wsIExWMV82X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfN19JTl82X09VVF9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTCwgTFYxXzZfT1VUX0FSR19ERUNMCisKKyNkZWZpbmUgTFYxXzBfSU5fN19PVVRfQVJHX0RFQ0wgICAgICAgICAgICAgICAgICAgIExWMV83X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfMV9JTl83X09VVF9BUkdfREVDTCBMVjFfMV9JTl9BUkdfREVDTCwgTFYxXzdfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV8yX0lOXzdfT1VUX0FSR19ERUNMIExWMV8yX0lOX0FSR19ERUNMLCBMVjFfN19PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzNfSU5fN19PVVRfQVJHX0RFQ0wgTFYxXzNfSU5fQVJHX0RFQ0wsIExWMV83X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfNF9JTl83X09VVF9BUkdfREVDTCBMVjFfNF9JTl9BUkdfREVDTCwgTFYxXzdfT1VUX0FSR19ERUNMCisjZGVmaW5lIExWMV81X0lOXzdfT1VUX0FSR19ERUNMIExWMV81X0lOX0FSR19ERUNMLCBMVjFfN19PVVRfQVJHX0RFQ0wKKyNkZWZpbmUgTFYxXzZfSU5fN19PVVRfQVJHX0RFQ0wgTFYxXzZfSU5fQVJHX0RFQ0wsIExWMV83X09VVF9BUkdfREVDTAorI2RlZmluZSBMVjFfN19JTl83X09VVF9BUkdfREVDTCBMVjFfN19JTl9BUkdfREVDTCwgTFYxXzdfT1VUX0FSR19ERUNMCisKKyNkZWZpbmUgTFYxXzFfSU5fQVJHUyBpbl8xCisjZGVmaW5lIExWMV8yX0lOX0FSR1MgTFYxXzFfSU5fQVJHUywgaW5fMgorI2RlZmluZSBMVjFfM19JTl9BUkdTIExWMV8yX0lOX0FSR1MsIGluXzMKKyNkZWZpbmUgTFYxXzRfSU5fQVJHUyBMVjFfM19JTl9BUkdTLCBpbl80CisjZGVmaW5lIExWMV81X0lOX0FSR1MgTFYxXzRfSU5fQVJHUywgaW5fNQorI2RlZmluZSBMVjFfNl9JTl9BUkdTIExWMV81X0lOX0FSR1MsIGluXzYKKyNkZWZpbmUgTFYxXzdfSU5fQVJHUyBMVjFfNl9JTl9BUkdTLCBpbl83CisjZGVmaW5lIExWMV84X0lOX0FSR1MgTFYxXzdfSU5fQVJHUywgaW5fOAorCisjZGVmaW5lIExWMV8xX09VVF9BUkdTIG91dF8xCisjZGVmaW5lIExWMV8yX09VVF9BUkdTIExWMV8xX09VVF9BUkdTLCBvdXRfMgorI2RlZmluZSBMVjFfM19PVVRfQVJHUyBMVjFfMl9PVVRfQVJHUywgb3V0XzMKKyNkZWZpbmUgTFYxXzRfT1VUX0FSR1MgTFYxXzNfT1VUX0FSR1MsIG91dF80CisjZGVmaW5lIExWMV81X09VVF9BUkdTIExWMV80X09VVF9BUkdTLCBvdXRfNQorI2RlZmluZSBMVjFfNl9PVVRfQVJHUyBMVjFfNV9PVVRfQVJHUywgb3V0XzYKKyNkZWZpbmUgTFYxXzdfT1VUX0FSR1MgTFYxXzZfT1VUX0FSR1MsIG91dF83CisKKyNkZWZpbmUgTFYxXzBfSU5fMF9PVVRfQVJHUworI2RlZmluZSBMVjFfMV9JTl8wX09VVF9BUkdTIExWMV8xX0lOX0FSR1MKKyNkZWZpbmUgTFYxXzJfSU5fMF9PVVRfQVJHUyBMVjFfMl9JTl9BUkdTCisjZGVmaW5lIExWMV8zX0lOXzBfT1VUX0FSR1MgTFYxXzNfSU5fQVJHUworI2RlZmluZSBMVjFfNF9JTl8wX09VVF9BUkdTIExWMV80X0lOX0FSR1MKKyNkZWZpbmUgTFYxXzVfSU5fMF9PVVRfQVJHUyBMVjFfNV9JTl9BUkdTCisjZGVmaW5lIExWMV82X0lOXzBfT1VUX0FSR1MgTFYxXzZfSU5fQVJHUworI2RlZmluZSBMVjFfN19JTl8wX09VVF9BUkdTIExWMV83X0lOX0FSR1MKKworI2RlZmluZSBMVjFfMF9JTl8xX09VVF9BUkdTICAgICAgICAgICAgICAgIExWMV8xX09VVF9BUkdTCisjZGVmaW5lIExWMV8xX0lOXzFfT1VUX0FSR1MgTFYxXzFfSU5fQVJHUywgTFYxXzFfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzJfSU5fMV9PVVRfQVJHUyBMVjFfMl9JTl9BUkdTLCBMVjFfMV9PVVRfQVJHUworI2RlZmluZSBMVjFfM19JTl8xX09VVF9BUkdTIExWMV8zX0lOX0FSR1MsIExWMV8xX09VVF9BUkdTCisjZGVmaW5lIExWMV80X0lOXzFfT1VUX0FSR1MgTFYxXzRfSU5fQVJHUywgTFYxXzFfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzVfSU5fMV9PVVRfQVJHUyBMVjFfNV9JTl9BUkdTLCBMVjFfMV9PVVRfQVJHUworI2RlZmluZSBMVjFfNl9JTl8xX09VVF9BUkdTIExWMV82X0lOX0FSR1MsIExWMV8xX09VVF9BUkdTCisjZGVmaW5lIExWMV83X0lOXzFfT1VUX0FSR1MgTFYxXzdfSU5fQVJHUywgTFYxXzFfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzhfSU5fMV9PVVRfQVJHUyBMVjFfOF9JTl9BUkdTLCBMVjFfMV9PVVRfQVJHUworCisjZGVmaW5lIExWMV8wX0lOXzJfT1VUX0FSR1MgICAgICAgICAgICAgICAgTFYxXzJfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzFfSU5fMl9PVVRfQVJHUyBMVjFfMV9JTl9BUkdTLCBMVjFfMl9PVVRfQVJHUworI2RlZmluZSBMVjFfMl9JTl8yX09VVF9BUkdTIExWMV8yX0lOX0FSR1MsIExWMV8yX09VVF9BUkdTCisjZGVmaW5lIExWMV8zX0lOXzJfT1VUX0FSR1MgTFYxXzNfSU5fQVJHUywgTFYxXzJfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzRfSU5fMl9PVVRfQVJHUyBMVjFfNF9JTl9BUkdTLCBMVjFfMl9PVVRfQVJHUworI2RlZmluZSBMVjFfNV9JTl8yX09VVF9BUkdTIExWMV81X0lOX0FSR1MsIExWMV8yX09VVF9BUkdTCisjZGVmaW5lIExWMV82X0lOXzJfT1VUX0FSR1MgTFYxXzZfSU5fQVJHUywgTFYxXzJfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzdfSU5fMl9PVVRfQVJHUyBMVjFfN19JTl9BUkdTLCBMVjFfMl9PVVRfQVJHUworCisjZGVmaW5lIExWMV8wX0lOXzNfT1VUX0FSR1MgICAgICAgICAgICAgICAgTFYxXzNfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzFfSU5fM19PVVRfQVJHUyBMVjFfMV9JTl9BUkdTLCBMVjFfM19PVVRfQVJHUworI2RlZmluZSBMVjFfMl9JTl8zX09VVF9BUkdTIExWMV8yX0lOX0FSR1MsIExWMV8zX09VVF9BUkdTCisjZGVmaW5lIExWMV8zX0lOXzNfT1VUX0FSR1MgTFYxXzNfSU5fQVJHUywgTFYxXzNfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzRfSU5fM19PVVRfQVJHUyBMVjFfNF9JTl9BUkdTLCBMVjFfM19PVVRfQVJHUworI2RlZmluZSBMVjFfNV9JTl8zX09VVF9BUkdTIExWMV81X0lOX0FSR1MsIExWMV8zX09VVF9BUkdTCisjZGVmaW5lIExWMV82X0lOXzNfT1VUX0FSR1MgTFYxXzZfSU5fQVJHUywgTFYxXzNfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzdfSU5fM19PVVRfQVJHUyBMVjFfN19JTl9BUkdTLCBMVjFfM19PVVRfQVJHUworCisjZGVmaW5lIExWMV8wX0lOXzRfT1VUX0FSR1MgICAgICAgICAgICAgICAgTFYxXzRfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzFfSU5fNF9PVVRfQVJHUyBMVjFfMV9JTl9BUkdTLCBMVjFfNF9PVVRfQVJHUworI2RlZmluZSBMVjFfMl9JTl80X09VVF9BUkdTIExWMV8yX0lOX0FSR1MsIExWMV80X09VVF9BUkdTCisjZGVmaW5lIExWMV8zX0lOXzRfT1VUX0FSR1MgTFYxXzNfSU5fQVJHUywgTFYxXzRfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzRfSU5fNF9PVVRfQVJHUyBMVjFfNF9JTl9BUkdTLCBMVjFfNF9PVVRfQVJHUworI2RlZmluZSBMVjFfNV9JTl80X09VVF9BUkdTIExWMV81X0lOX0FSR1MsIExWMV80X09VVF9BUkdTCisjZGVmaW5lIExWMV82X0lOXzRfT1VUX0FSR1MgTFYxXzZfSU5fQVJHUywgTFYxXzRfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzdfSU5fNF9PVVRfQVJHUyBMVjFfN19JTl9BUkdTLCBMVjFfNF9PVVRfQVJHUworCisjZGVmaW5lIExWMV8wX0lOXzVfT1VUX0FSR1MgICAgICAgICAgICAgICAgTFYxXzVfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzFfSU5fNV9PVVRfQVJHUyBMVjFfMV9JTl9BUkdTLCBMVjFfNV9PVVRfQVJHUworI2RlZmluZSBMVjFfMl9JTl81X09VVF9BUkdTIExWMV8yX0lOX0FSR1MsIExWMV81X09VVF9BUkdTCisjZGVmaW5lIExWMV8zX0lOXzVfT1VUX0FSR1MgTFYxXzNfSU5fQVJHUywgTFYxXzVfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzRfSU5fNV9PVVRfQVJHUyBMVjFfNF9JTl9BUkdTLCBMVjFfNV9PVVRfQVJHUworI2RlZmluZSBMVjFfNV9JTl81X09VVF9BUkdTIExWMV81X0lOX0FSR1MsIExWMV81X09VVF9BUkdTCisjZGVmaW5lIExWMV82X0lOXzVfT1VUX0FSR1MgTFYxXzZfSU5fQVJHUywgTFYxXzVfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzdfSU5fNV9PVVRfQVJHUyBMVjFfN19JTl9BUkdTLCBMVjFfNV9PVVRfQVJHUworCisjZGVmaW5lIExWMV8wX0lOXzZfT1VUX0FSR1MgICAgICAgICAgICAgICAgTFYxXzZfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzFfSU5fNl9PVVRfQVJHUyBMVjFfMV9JTl9BUkdTLCBMVjFfNl9PVVRfQVJHUworI2RlZmluZSBMVjFfMl9JTl82X09VVF9BUkdTIExWMV8yX0lOX0FSR1MsIExWMV82X09VVF9BUkdTCisjZGVmaW5lIExWMV8zX0lOXzZfT1VUX0FSR1MgTFYxXzNfSU5fQVJHUywgTFYxXzZfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzRfSU5fNl9PVVRfQVJHUyBMVjFfNF9JTl9BUkdTLCBMVjFfNl9PVVRfQVJHUworI2RlZmluZSBMVjFfNV9JTl82X09VVF9BUkdTIExWMV81X0lOX0FSR1MsIExWMV82X09VVF9BUkdTCisjZGVmaW5lIExWMV82X0lOXzZfT1VUX0FSR1MgTFYxXzZfSU5fQVJHUywgTFYxXzZfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzdfSU5fNl9PVVRfQVJHUyBMVjFfN19JTl9BUkdTLCBMVjFfNl9PVVRfQVJHUworCisjZGVmaW5lIExWMV8wX0lOXzdfT1VUX0FSR1MgICAgICAgICAgICAgICAgTFYxXzdfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzFfSU5fN19PVVRfQVJHUyBMVjFfMV9JTl9BUkdTLCBMVjFfN19PVVRfQVJHUworI2RlZmluZSBMVjFfMl9JTl83X09VVF9BUkdTIExWMV8yX0lOX0FSR1MsIExWMV83X09VVF9BUkdTCisjZGVmaW5lIExWMV8zX0lOXzdfT1VUX0FSR1MgTFYxXzNfSU5fQVJHUywgTFYxXzdfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzRfSU5fN19PVVRfQVJHUyBMVjFfNF9JTl9BUkdTLCBMVjFfN19PVVRfQVJHUworI2RlZmluZSBMVjFfNV9JTl83X09VVF9BUkdTIExWMV81X0lOX0FSR1MsIExWMV83X09VVF9BUkdTCisjZGVmaW5lIExWMV82X0lOXzdfT1VUX0FSR1MgTFYxXzZfSU5fQVJHUywgTFYxXzdfT1VUX0FSR1MKKyNkZWZpbmUgTFYxXzdfSU5fN19PVVRfQVJHUyBMVjFfN19JTl9BUkdTLCBMVjFfN19PVVRfQVJHUworCisvKgorICogVGhpcyBMVjFfQ0FMTCgpIG1hY3JvIGlzIGZvciB1c2UgYnkgY2FsbGVycy4gIEl0IGV4cGFuZHMgaW50byBhbgorICogaW5saW5lIGNhbGwgd3JhcHBlciBhbmQgYW4gdW5kZXJzY29yZWQgSFYgY2FsbCBkZWNsYXJhdGlvbi4gIFRoZQorICogd3JhcHBlciBjYW4gYmUgdXNlZCB0byBpbnN0cnVtZW50IHRoZSBsdjEgY2FsbCBpbnRlcmZhY2UuICBUaGUKKyAqIGZpbGUgbHYxY2FsbC5TIGRlZmluZXMgaXRzIG93biBMVjFfQ0FMTCgpIG1hY3JvIHRvIGV4cGFuZCBpbnRvCisgKiB0aGUgYWN0dWFsIHVuZGVyc2NvcmVkIGNhbGwgZGVmaW5pdGlvbi4KKyAqLworCisjaWYgIWRlZmluZWQoTFYxX0NBTEwpCisjZGVmaW5lIExWMV9DQUxMKG5hbWUsIGluLCBvdXQsIG51bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleHRlcm4gczY0IF9sdjFfIyNuYW1lKExWMV8jI2luIyNfSU5fIyNvdXQjI19PVVRfQVJHX0RFQ0wpOyAgICAgIFwKKyAgc3RhdGljIGlubGluZSBpbnQgbHYxXyMjbmFtZShMVjFfIyNpbiMjX0lOXyMjb3V0IyNfT1VUX0FSR19ERUNMKSBcCisgICAge3JldHVybiBfbHYxXyMjbmFtZShMVjFfIyNpbiMjX0lOXyMjb3V0IyNfT1VUX0FSR1MpO30KKyNlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQoX19BU1NFTUJMWV9fKSAqLworCisvKiBsdjEgY2FsbCB0YWJsZSAqLworCitMVjFfQ0FMTChhbGxvY2F0ZV9tZW1vcnksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDIsICAgMCApCitMVjFfQ0FMTCh3cml0ZV9odGFiX2VudHJ5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsICAgMSApCitMVjFfQ0FMTChjb25zdHJ1Y3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlLCAgICAgICAgICAgICAgIDMsIDIsICAgMiApCitMVjFfQ0FMTChpbnZhbGlkYXRlX2h0YWJfZW50cmllcywgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsICAgMyApCitMVjFfQ0FMTChnZXRfdmlydHVhbF9hZGRyZXNzX3NwYWNlX2lkX29mX3BwZSwgICAgICAgICAgIDEsIDEsICAgNCApCitMVjFfQ0FMTChxdWVyeV9sb2dpY2FsX3BhcnRpdGlvbl9hZGRyZXNzX3JlZ2lvbl9pbmZvLCAgIDEsIDUsICAgNiApCitMVjFfQ0FMTChzZWxlY3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlLCAgICAgICAgICAgICAgICAgIDEsIDAsICAgNyApCitMVjFfQ0FMTChwYXVzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsICAgOSApCitMVjFfQ0FMTChkZXN0cnVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UsICAgICAgICAgICAgICAgIDEsIDAsICAxMCApCitMVjFfQ0FMTChjb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCwgICAgICAgICAgICAgICAgICAgIDMsIDAsICAxMSApCitMVjFfQ0FMTChjb25uZWN0X2lycV9wbHVnX2V4dCwgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsICAxMiApCitMVjFfQ0FMTChyZWxlYXNlX21lbW9yeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsICAxMyApCitMVjFfQ0FMTChkaXNjb25uZWN0X2lycV9wbHVnX2V4dCwgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsICAxNyApCitMVjFfQ0FMTChjb25zdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0LCAgICAgICAgICAgICAgICAgIDAsIDEsICAxOCApCitMVjFfQ0FMTChkZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQsICAgICAgICAgICAgICAgICAgIDEsIDAsICAxOSApCitMVjFfQ0FMTChzZW5kX2V2ZW50X2xvY2FsbHksICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsICAyNCApCitMVjFfQ0FMTChlbmRfb2ZfaW50ZXJydXB0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsICAyNyApCitMVjFfQ0FMTChjb25uZWN0X2lycV9wbHVnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsICAyOCApCitMVjFfQ0FMTChkaXNjb25uZWN0X2lycV9wbHVnLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsICAyOSApCitMVjFfQ0FMTChlbmRfb2ZfaW50ZXJydXB0X2V4dCwgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsICAzMCApCitMVjFfQ0FMTChkaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrLCAgICAgICAgICAgICAgICAgICAgIDIsIDAsICAzMSApCitMVjFfQ0FMTChzaHV0ZG93bl9sb2dpY2FsX3BhcnRpdGlvbiwgICAgICAgICAgICAgICAgICAgIDEsIDAsICA0NCApCitMVjFfQ0FMTChkZXN0cnVjdF9sb2dpY2FsX3NwZSwgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsICA1NCApCitMVjFfQ0FMTChjb25zdHJ1Y3RfbG9naWNhbF9zcGUsICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDYsICA1NyApCitMVjFfQ0FMTChzZXRfc3BlX2ludGVycnVwdF9tYXNrLCAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsICA2MSApCitMVjFfQ0FMTChzZXRfc3BlX3RyYW5zaXRpb25fbm90aWZpZXIsICAgICAgICAgICAgICAgICAgIDMsIDAsICA2NCApCitMVjFfQ0FMTChkaXNhYmxlX2xvZ2ljYWxfc3BlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsICA2NSApCitMVjFfQ0FMTChjbGVhcl9zcGVfaW50ZXJydXB0X3N0YXR1cywgICAgICAgICAgICAgICAgICAgIDQsIDAsICA2NiApCitMVjFfQ0FMTChnZXRfc3BlX2ludGVycnVwdF9zdGF0dXMsICAgICAgICAgICAgICAgICAgICAgIDIsIDEsICA2NyApCitMVjFfQ0FMTChnZXRfbG9naWNhbF9wcGVfaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsICA2OSApCitMVjFfQ0FMTChzZXRfaW50ZXJydXB0X21hc2ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsICA3MyApCitMVjFfQ0FMTChnZXRfbG9naWNhbF9wYXJ0aXRpb25faWQsICAgICAgICAgICAgICAgICAgICAgIDAsIDEsICA3NCApCitMVjFfQ0FMTChjb25maWd1cmVfZXhlY3V0aW9uX3RpbWVfdmFyaWFibGUsICAgICAgICAgICAgIDEsIDAsICA3NyApCitMVjFfQ0FMTChnZXRfc3BlX2lycV9vdXRsZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDEsICA3OCApCitMVjFfQ0FMTChzZXRfc3BlX3ByaXZpbGVnZV9zdGF0ZV9hcmVhXzFfcmVnaXN0ZXIsICAgICAgIDMsIDAsICA3OSApCitMVjFfQ0FMTChjcmVhdGVfcmVwb3NpdG9yeV9ub2RlLCAgICAgICAgICAgICAgICAgICAgICAgIDYsIDAsICA5MCApCitMVjFfQ0FMTChnZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgIDUsIDIsICA5MSApCitMVjFfQ0FMTChtb2RpZnlfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlLCAgICAgICAgICAgICAgICAgIDYsIDAsICA5MiApCitMVjFfQ0FMTChyZW1vdmVfcmVwb3NpdG9yeV9ub2RlLCAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsICA5MyApCitMVjFfQ0FMTChyZWFkX2h0YWJfZW50cmllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDUsICA5NSApCitMVjFfQ0FMTChzZXRfZGFiciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsICA5NiApCitMVjFfQ0FMTChnZXRfdG90YWxfZXhlY3V0aW9uX3RpbWUsICAgICAgICAgICAgICAgICAgICAgIDIsIDEsIDEwMyApCitMVjFfQ0FMTChjb25zdHJ1Y3RfaW9faXJxX291dGxldCwgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEyMCApCitMVjFfQ0FMTChkZXN0cnVjdF9pb19pcnFfb3V0bGV0LCAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDEyMSApCitMVjFfQ0FMTChtYXBfaHRhYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEyMiApCitMVjFfQ0FMTCh1bm1hcF9odGFiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDEyMyApCitMVjFfQ0FMTChnZXRfdmVyc2lvbl9pbmZvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDEyNyApCitMVjFfQ0FMTChpbnNlcnRfaHRhYl9lbnRyeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDMsIDE1OCApCitMVjFfQ0FMTChyZWFkX3ZpcnR1YWxfdWFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDE2MiApCitMVjFfQ0FMTCh3cml0ZV92aXJ0dWFsX3VhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDE2MyApCitMVjFfQ0FMTChzZXRfdmlydHVhbF91YXJ0X3BhcmFtLCAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDE2NCApCitMVjFfQ0FMTChnZXRfdmlydHVhbF91YXJ0X3BhcmFtLCAgICAgICAgICAgICAgICAgICAgICAgIDIsIDEsIDE2NSApCitMVjFfQ0FMTChjb25maWd1cmVfdmlydHVhbF91YXJ0X2lycSwgICAgICAgICAgICAgICAgICAgIDEsIDEsIDE2NiApCitMVjFfQ0FMTChvcGVuX2RldmljZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDE3MCApCitMVjFfQ0FMTChjbG9zZV9kZXZpY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsIDE3MSApCitMVjFfQ0FMTChtYXBfZGV2aWNlX21taW9fcmVnaW9uLCAgICAgICAgICAgICAgICAgICAgICAgIDUsIDEsIDE3MiApCitMVjFfQ0FMTCh1bm1hcF9kZXZpY2VfbW1pb19yZWdpb24sICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDE3MyApCitMVjFfQ0FMTChhbGxvY2F0ZV9kZXZpY2VfZG1hX3JlZ2lvbiwgICAgICAgICAgICAgICAgICAgIDUsIDEsIDE3NCApCitMVjFfQ0FMTChmcmVlX2RldmljZV9kbWFfcmVnaW9uLCAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDE3NSApCitMVjFfQ0FMTChtYXBfZGV2aWNlX2RtYV9yZWdpb24sICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDAsIDE3NiApCitMVjFfQ0FMTCh1bm1hcF9kZXZpY2VfZG1hX3JlZ2lvbiwgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsIDE3NyApCitMVjFfQ0FMTChuZXRfYWRkX211bHRpY2FzdF9hZGRyZXNzLCAgICAgICAgICAgICAgICAgICAgIDQsIDAsIDE4NSApCitMVjFfQ0FMTChuZXRfcmVtb3ZlX211bHRpY2FzdF9hZGRyZXNzLCAgICAgICAgICAgICAgICAgIDQsIDAsIDE4NiApCitMVjFfQ0FMTChuZXRfc3RhcnRfdHhfZG1hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsIDE4NyApCitMVjFfQ0FMTChuZXRfc3RvcF90eF9kbWEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDE4OCApCitMVjFfQ0FMTChuZXRfc3RhcnRfcnhfZG1hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsIDE4OSApCitMVjFfQ0FMTChuZXRfc3RvcF9yeF9kbWEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDE5MCApCitMVjFfQ0FMTChuZXRfc2V0X2ludGVycnVwdF9zdGF0dXNfaW5kaWNhdG9yLCAgICAgICAgICAgIDQsIDAsIDE5MSApCitMVjFfQ0FMTChuZXRfc2V0X2ludGVycnVwdF9tYXNrLCAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsIDE5MyApCitMVjFfQ0FMTChuZXRfY29udHJvbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDIsIDE5NCApCitMVjFfQ0FMTChjb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQsICAgICAgICAgIDQsIDAsIDE5NyApCitMVjFfQ0FMTChkaXNjb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQsICAgICAgIDQsIDAsIDE5OCApCitMVjFfQ0FMTChnZXRfc3BlX2FsbF9pbnRlcnJ1cHRfc3RhdHVzZXMsICAgICAgICAgICAgICAgIDEsIDEsIDE5OSApCitMVjFfQ0FMTChkZWNvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxLCAgICAgICAgICAgICAgICAgIDAsIDAsIDIwMiApCitMVjFfQ0FMTChlbmFibGVfbG9naWNhbF9zcGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsIDIwNyApCitMVjFfQ0FMTChncHVfb3BlbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDIxMCApCitMVjFfQ0FMTChncHVfY2xvc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDIxMSApCitMVjFfQ0FMTChncHVfZGV2aWNlX21hcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDIxMiApCitMVjFfQ0FMTChncHVfZGV2aWNlX3VubWFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDIxMyApCitMVjFfQ0FMTChncHVfbWVtb3J5X2FsbG9jYXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDIsIDIxNCApCitMVjFfQ0FMTChncHVfbWVtb3J5X2ZyZWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDIxNiApCitMVjFfQ0FMTChncHVfY29udGV4dF9hbGxvY2F0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDUsIDIxNyApCitMVjFfQ0FMTChncHVfY29udGV4dF9mcmVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDIxOCApCitMVjFfQ0FMTChncHVfY29udGV4dF9pb21hcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsIDIyMSApCitMVjFfQ0FMTChncHVfY29udGV4dF9hdHRyaWJ1dGUsICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDAsIDIyNSApCitMVjFfQ0FMTChncHVfY29udGV4dF9pbnRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDIyNyApCitMVjFfQ0FMTChncHVfYXR0cmlidXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsIDIyOCApCitMVjFfQ0FMTChnZXRfcnRjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIDIzMiApCitMVjFfQ0FMTChzZXRfcHBlX3BlcmlvZGljX3RyYWNlcl9mcmVxdWVuY3ksICAgICAgICAgICAgIDEsIDAsIDI0MCApCitMVjFfQ0FMTChzdGFydF9wcGVfcGVyaW9kaWNfdHJhY2VyLCAgICAgICAgICAgICAgICAgICAgIDUsIDAsIDI0MSApCitMVjFfQ0FMTChzdG9wX3BwZV9wZXJpb2RpY190cmFjZXIsICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDI0MiApCitMVjFfQ0FMTChzdG9yYWdlX3JlYWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDEsIDI0NSApCitMVjFfQ0FMTChzdG9yYWdlX3dyaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDEsIDI0NiApCitMVjFfQ0FMTChzdG9yYWdlX3NlbmRfZGV2aWNlX2NvbW1hbmQsICAgICAgICAgICAgICAgICAgIDYsIDEsIDI0OCApCitMVjFfQ0FMTChzdG9yYWdlX2dldF9hc3luY19zdGF0dXMsICAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDI0OSApCitMVjFfQ0FMTChzdG9yYWdlX2NoZWNrX2FzeW5jX3N0YXR1cywgICAgICAgICAgICAgICAgICAgIDIsIDEsIDI1NCApCitMVjFfQ0FMTChwYW5pYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDI1NSApCitMVjFfQ0FMTChjb25zdHJ1Y3RfbHBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDMsIDE0MCApCitMVjFfQ0FMTChkZXN0cnVjdF9scG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDE0MSApCitMVjFfQ0FMTChzdGFydF9scG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDE0MiApCitMVjFfQ0FMTChzdG9wX2xwbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDE0MyApCitMVjFfQ0FMTChjb3B5X2xwbV90cmFjZV9idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDE0NCApCitMVjFfQ0FMTChhZGRfbHBtX2V2ZW50X2Jvb2ttYXJrLCAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsIDE0NSApCitMVjFfQ0FMTChkZWxldGVfbHBtX2V2ZW50X2Jvb2ttYXJrLCAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDE0NiApCitMVjFfQ0FMTChzZXRfbHBtX2ludGVycnVwdF9tYXNrLCAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDE0NyApCitMVjFfQ0FMTChnZXRfbHBtX2ludGVycnVwdF9zdGF0dXMsICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDE0OCApCitMVjFfQ0FMTChzZXRfbHBtX2dlbmVyYWxfY29udHJvbCwgICAgICAgICAgICAgICAgICAgICAgIDUsIDIsIDE0OSApCitMVjFfQ0FMTChzZXRfbHBtX2ludGVydmFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDE1MCApCitMVjFfQ0FMTChzZXRfbHBtX3RyaWdnZXJfY29udHJvbCwgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDE1MSApCitMVjFfQ0FMTChzZXRfbHBtX2NvdW50ZXJfY29udHJvbCwgICAgICAgICAgICAgICAgICAgICAgIDQsIDEsIDE1MiApCitMVjFfQ0FMTChzZXRfbHBtX2dyb3VwX2NvbnRyb2wsICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDE1MyApCitMVjFfQ0FMTChzZXRfbHBtX2RlYnVnX2J1c19jb250cm9sLCAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDE1NCApCitMVjFfQ0FMTChzZXRfbHBtX2NvdW50ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDIsIDE1NSApCitMVjFfQ0FMTChzZXRfbHBtX3NpZ25hbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIDAsIDE1NiApCitMVjFfQ0FMTChzZXRfbHBtX3Nwcl90cmlnZ2VyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDAsIDE1NyApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNoZGVwLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaAppbmRleCBkYWM5MGRjMy4uMWIwNGU1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNoZGVwLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNoZGVwLmgKQEAgLTI2LDYgKzI2LDcgQEAKIHN0cnVjdCBpb21tdV90YWJsZTsKIHN0cnVjdCBydGNfdGltZTsKIHN0cnVjdCBmaWxlOworc3RydWN0IHBjaV9jb250cm9sbGVyOwogI2lmZGVmIENPTkZJR19LRVhFQwogc3RydWN0IGtpbWFnZTsKICNlbmRpZgpAQCAtODQsOSArODUsMTIgQEAKIAl1bnNpZ25lZCBsb25nCSgqdGNlX2dldCkoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsCiAJCQkJICAgIGxvbmcgaW5kZXgpOwogCXZvaWQJCSgqdGNlX2ZsdXNoKShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCk7Ci0Jdm9pZAkJKCppb21tdV9kZXZfc2V0dXApKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotCXZvaWQJCSgqaW9tbXVfYnVzX3NldHVwKShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKLQl2b2lkCQkoKmlycV9idXNfc2V0dXApKHN0cnVjdCBwY2lfYnVzICpidXMpOworCXZvaWQJCSgqcGNpX2RtYV9kZXZfc2V0dXApKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCXZvaWQJCSgqcGNpX2RtYV9idXNfc2V0dXApKHN0cnVjdCBwY2lfYnVzICpidXMpOworCisJdm9pZCBfX2lvbWVtICoJKCppb3JlbWFwKShwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJdm9pZAkJKCppb3VubWFwKSh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnRva2VuKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogCWludAkJKCpwcm9iZSkodm9pZCk7CkBAIC0xMDYsNiArMTEwLDEwIEBACiAJLyogQ2FsbGVkIGFmdGVyIHNjYW5uaW5nIHRoZSBidXMsIGJlZm9yZSBhbGxvY2F0aW5nIHJlc291cmNlcyAqLwogCXZvaWQJCSgqcGNpYmlvc19maXh1cCkodm9pZCk7CiAJaW50CQkoKnBjaV9wcm9iZV9tb2RlKShzdHJ1Y3QgcGNpX2J1cyAqKTsKKwl2b2lkCQkoKnBjaV9pcnFfZml4dXApKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCisJLyogVG8gc2V0dXAgUEhCcyB3aGVuIHVzaW5nIGF1dG9tYXRpYyBPRiBwbGF0Zm9ybSBkcml2ZXIgZm9yIFBDSSAqLworCWludAkJKCpwY2lfc2V0dXBfcGhiKShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc3QpOwogCiAJdm9pZAkJKCpyZXN0YXJ0KShjaGFyICpjbWQpOwogCXZvaWQJCSgqcG93ZXJfb2ZmKSh2b2lkKTsKQEAgLTE5OSwxMCArMjA3LDYgQEAKIAkgKiBSZXR1cm5zIDAgdG8gYWxsb3cgYXNzaWdubWVudC9lbmFibGluZyBvZiB0aGUgZGV2aWNlLiAqLwogCWludCAgKCpwY2liaW9zX2VuYWJsZV9kZXZpY2VfaG9vaykoc3RydWN0IHBjaV9kZXYgKiwgaW50IGluaXRpYWwpOwogCi0JLyogRm9yIGludGVycnVwdCByb3V0aW5nICovCi0JdW5zaWduZWQgY2hhciAoKnBjaV9zd2l6emxlKShzdHJ1Y3QgcGNpX2RldiAqLCB1bnNpZ25lZCBjaGFyICopOwotCWludCAoKnBjaV9tYXBfaXJxKShzdHJ1Y3QgcGNpX2RldiAqLCB1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKLQogCS8qIENhbGxlZCBpbiBpbmRpcmVjdF8qIHRvIGF2b2lkIHRvdWNoaW5nIGRldmljZXMgKi8KIAlpbnQgKCpwY2lfZXhjbHVkZV9kZXZpY2UpKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaAppbmRleCBjM2ZjN2EyLi40MWM4YzljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKQEAgLTI0OCwyMSArMjQ4LDYgQEAKIGV4dGVybiB2b2lkIGhwdGVfaW5pdF9scGFyKHZvaWQpOwogZXh0ZXJuIHZvaWQgaHB0ZV9pbml0X2lTZXJpZXModm9pZCk7CiAKLWV4dGVybiBsb25nIHBTZXJpZXNfbHBhcl9ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHZhLCB1bnNpZ25lZCBsb25nIHBycG4sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHJmbGFncywKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCBpbnQgcHNpemUpOwotCi1leHRlcm4gbG9uZyBuYXRpdmVfaHB0ZV9pbnNlcnQodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmEsIHVuc2lnbmVkIGxvbmcgcHJwbiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHJmbGFncywKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKTsKLQotZXh0ZXJuIGxvbmcgaVNlcmllc19ocHRlX2luc2VydCh1bnNpZ25lZCBsb25nIGhwdGVfZ3JvdXAsCi0JCQkJdW5zaWduZWQgbG9uZyB2YSwgdW5zaWduZWQgbG9uZyBwcnBuLAotCQkJCXVuc2lnbmVkIGxvbmcgcmZsYWdzLAotCQkJCXVuc2lnbmVkIGxvbmcgdmZsYWdzLCBpbnQgcHNpemUpOwotCiBleHRlcm4gdm9pZCBzdGFic19hbGxvYyh2b2lkKTsKIGV4dGVybiB2b2lkIHNsYl9pbml0aWFsaXplKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2xiX2ZsdXNoX2FuZF9yZWJvbHQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21vZHVsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tb2R1bGUuaAppbmRleCA1ODRmYWJmLi5lNWYxNGIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21vZHVsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW9kdWxlLmgKQEAgLTQ2LDggKzQ2LDYgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX2J1Z3M7CiB9OwogCi1leHRlcm4gc3RydWN0IGJ1Z19lbnRyeSAqbW9kdWxlX2ZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcik7Ci0KIC8qCiAgKiBTZWxlY3QgRUxGIGhlYWRlcnMuCiAgKiBNYWtlIGVtcHR5IHNlY3Rpb24gZm9yIG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMgdG8gZXhwYW5kLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM1Mnh4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzUyeHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI4YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM1Mnh4LmgKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBQcm90b3R5cGVzLCBldGMuIGZvciB0aGUgRnJlZXNjYWxlIE1QQzUyeHggZW1iZWRkZWQgY3B1IGNoaXBzCisgKiBNYXkgbmVlZCB0byBiZSBjbGVhbmVkIGFzIHRoZSBwb3J0IGdvZXMgb24gLi4uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9fQVNNX1BPV0VSUENfTVBDNTJ4eF9IX18KKyNkZWZpbmUgX19BU01fUE9XRVJQQ19NUEM1Mnh4X0hfXworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBTdHJ1Y3R1cmVzIG1hcHBpbmcgb2Ygc29tZSB1bml0IHJlZ2lzdGVyIHNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKiBNZW1vcnkgTWFwcGluZyBDb250cm9sICovCitzdHJ1Y3QgbXBjNTJ4eF9tbWFwX2N0bCB7CisJdTMyIG1iYXI7CQkvKiBNTUFQX0NUUkwgKyAweDAwICovCisKKwl1MzIgY3MwX3N0YXJ0OwkJLyogTU1BUF9DVFJMICsgMHgwNCAqLworCXUzMiBjczBfc3RvcDsJCS8qIE1NQVBfQ1RSTCArIDB4MDggKi8KKwl1MzIgY3MxX3N0YXJ0OwkJLyogTU1BUF9DVFJMICsgMHgwYyAqLworCXUzMiBjczFfc3RvcDsJCS8qIE1NQVBfQ1RSTCArIDB4MTAgKi8KKwl1MzIgY3MyX3N0YXJ0OwkJLyogTU1BUF9DVFJMICsgMHgxNCAqLworCXUzMiBjczJfc3RvcDsJCS8qIE1NQVBfQ1RSTCArIDB4MTggKi8KKwl1MzIgY3MzX3N0YXJ0OwkJLyogTU1BUF9DVFJMICsgMHgxYyAqLworCXUzMiBjczNfc3RvcDsJCS8qIE1NQVBfQ1RSTCArIDB4MjAgKi8KKwl1MzIgY3M0X3N0YXJ0OwkJLyogTU1BUF9DVFJMICsgMHgyNCAqLworCXUzMiBjczRfc3RvcDsJCS8qIE1NQVBfQ1RSTCArIDB4MjggKi8KKwl1MzIgY3M1X3N0YXJ0OwkJLyogTU1BUF9DVFJMICsgMHgyYyAqLworCXUzMiBjczVfc3RvcDsJCS8qIE1NQVBfQ1RSTCArIDB4MzAgKi8KKworCXUzMiBzZHJhbTA7CQkvKiBNTUFQX0NUUkwgKyAweDM0ICovCisJdTMyIHNkcmFtMTsJCS8qIE1NQVBfQ1RSTCArIDBYMzggKi8KKworCXUzMiByZXNlcnZlZFs0XTsJLyogTU1BUF9DVFJMICsgMHgzYyAuLiAweDQ4ICovCisKKwl1MzIgYm9vdF9zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4NGMgKi8KKwl1MzIgYm9vdF9zdG9wOwkJLyogTU1BUF9DVFJMICsgMHg1MCAqLworCisJdTMyIGlwYmlfd3NfY3RybDsJLyogTU1BUF9DVFJMICsgMHg1NCAqLworCisJdTMyIGNzNl9zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4NTggKi8KKwl1MzIgY3M2X3N0b3A7CQkvKiBNTUFQX0NUUkwgKyAweDVjICovCisJdTMyIGNzN19zdGFydDsJCS8qIE1NQVBfQ1RSTCArIDB4NjAgKi8KKwl1MzIgY3M3X3N0b3A7CQkvKiBNTUFQX0NUUkwgKyAweDY0ICovCit9OworCisvKiBTRFJBTSBjb250cm9sICovCitzdHJ1Y3QgbXBjNTJ4eF9zZHJhbSB7CisJdTMyIG1vZGU7CQkvKiBTRFJBTSArIDB4MDAgKi8KKwl1MzIgY3RybDsJCS8qIFNEUkFNICsgMHgwNCAqLworCXUzMiBjb25maWcxOwkJLyogU0RSQU0gKyAweDA4ICovCisJdTMyIGNvbmZpZzI7CQkvKiBTRFJBTSArIDB4MGMgKi8KK307CisKKy8qIFNETUEgKi8KK3N0cnVjdCBtcGM1Mnh4X3NkbWEgeworCXUzMiB0YXNrQmFyOwkJLyogU0RNQSArIDB4MDAgKi8KKwl1MzIgY3VycmVudFBvaW50ZXI7CS8qIFNETUEgKyAweDA0ICovCisJdTMyIGVuZFBvaW50ZXI7CQkvKiBTRE1BICsgMHgwOCAqLworCXUzMiB2YXJpYWJsZVBvaW50ZXI7CS8qIFNETUEgKyAweDBjICovCisKKwl1OCBJbnRWZWN0MTsJCS8qIFNETUEgKyAweDEwICovCisJdTggSW50VmVjdDI7CQkvKiBTRE1BICsgMHgxMSAqLworCXUxNiBQdGRDbnRybDsJCS8qIFNETUEgKyAweDEyICovCisKKwl1MzIgSW50UGVuZDsJCS8qIFNETUEgKyAweDE0ICovCisJdTMyIEludE1hc2s7CQkvKiBTRE1BICsgMHgxOCAqLworCisJdTE2IHRjclsxNl07CQkvKiBTRE1BICsgMHgxYyAuLiAweDNhICovCisKKwl1OCBpcHJbMzJdOwkJLyogU0RNQSArIDB4M2MgLi4gMHg1YiAqLworCisJdTMyIGNSZXFTZWxlY3Q7CQkvKiBTRE1BICsgMHg1YyAqLworCXUzMiB0YXNrX3NpemUwOwkJLyogU0RNQSArIDB4NjAgKi8KKwl1MzIgdGFza19zaXplMTsJCS8qIFNETUEgKyAweDY0ICovCisJdTMyIE1ERURlYnVnOwkJLyogU0RNQSArIDB4NjggKi8KKwl1MzIgQURTRGVidWc7CQkvKiBTRE1BICsgMHg2YyAqLworCXUzMiBWYWx1ZTE7CQkvKiBTRE1BICsgMHg3MCAqLworCXUzMiBWYWx1ZTI7CQkvKiBTRE1BICsgMHg3NCAqLworCXUzMiBDb250cm9sOwkJLyogU0RNQSArIDB4NzggKi8KKwl1MzIgU3RhdHVzOwkJLyogU0RNQSArIDB4N2MgKi8KKwl1MzIgUFRERGVidWc7CQkvKiBTRE1BICsgMHg4MCAqLworfTsKKworLyogR1BUICovCitzdHJ1Y3QgbXBjNTJ4eF9ncHQgeworCXUzMiBtb2RlOwkJLyogR1BUeCArIDB4MDAgKi8KKwl1MzIgY291bnQ7CQkvKiBHUFR4ICsgMHgwNCAqLworCXUzMiBwd207CQkvKiBHUFR4ICsgMHgwOCAqLworCXUzMiBzdGF0dXM7CQkvKiBHUFR4ICsgMFgwYyAqLworfTsKKworLyogR1BJTyAqLworc3RydWN0IG1wYzUyeHhfZ3BpbyB7CisJdTMyIHBvcnRfY29uZmlnOwkvKiBHUElPICsgMHgwMCAqLworCXUzMiBzaW1wbGVfZ3Bpb2U7CS8qIEdQSU8gKyAweDA0ICovCisJdTMyIHNpbXBsZV9vZGU7CQkvKiBHUElPICsgMHgwOCAqLworCXUzMiBzaW1wbGVfZGRyOwkJLyogR1BJTyArIDB4MGMgKi8KKwl1MzIgc2ltcGxlX2R2bzsJCS8qIEdQSU8gKyAweDEwICovCisJdTMyIHNpbXBsZV9pdmFsOwkvKiBHUElPICsgMHgxNCAqLworCXU4IG91dG9fZ3Bpb2U7CQkvKiBHUElPICsgMHgxOCAqLworCXU4IHJlc2VydmVkMVszXTsJLyogR1BJTyArIDB4MTkgKi8KKwl1OCBvdXRvX2R2bzsJCS8qIEdQSU8gKyAweDFjICovCisJdTggcmVzZXJ2ZWQyWzNdOwkvKiBHUElPICsgMHgxZCAqLworCXU4IHNpbnRfZ3Bpb2U7CQkvKiBHUElPICsgMHgyMCAqLworCXU4IHJlc2VydmVkM1szXTsJLyogR1BJTyArIDB4MjEgKi8KKwl1OCBzaW50X29kZTsJCS8qIEdQSU8gKyAweDI0ICovCisJdTggcmVzZXJ2ZWQ0WzNdOwkvKiBHUElPICsgMHgyNSAqLworCXU4IHNpbnRfZGRyOwkJLyogR1BJTyArIDB4MjggKi8KKwl1OCByZXNlcnZlZDVbM107CS8qIEdQSU8gKyAweDI5ICovCisJdTggc2ludF9kdm87CQkvKiBHUElPICsgMHgyYyAqLworCXU4IHJlc2VydmVkNlszXTsJLyogR1BJTyArIDB4MmQgKi8KKwl1OCBzaW50X2ludGVuOwkJLyogR1BJTyArIDB4MzAgKi8KKwl1OCByZXNlcnZlZDdbM107CS8qIEdQSU8gKyAweDMxICovCisJdTE2IHNpbnRfaXR5cGU7CQkvKiBHUElPICsgMHgzNCAqLworCXUxNiByZXNlcnZlZDg7CQkvKiBHUElPICsgMHgzNiAqLworCXU4IGdwaW9fY29udHJvbDsJLyogR1BJTyArIDB4MzggKi8KKwl1OCByZXNlcnZlZDlbM107CS8qIEdQSU8gKyAweDM5ICovCisJdTggc2ludF9pc3RhdDsJCS8qIEdQSU8gKyAweDNjICovCisJdTggc2ludF9pdmFsOwkJLyogR1BJTyArIDB4M2QgKi8KKwl1OCBidXNfZXJyczsJCS8qIEdQSU8gKyAweDNlICovCisJdTggcmVzZXJ2ZWQxMDsJCS8qIEdQSU8gKyAweDNmICovCit9OworCisjZGVmaW5lIE1QQzUyeHhfR1BJT19QU0NfQ09ORklHX1VBUlRfV0lUSE9VVF9DRAk0CisjZGVmaW5lIE1QQzUyeHhfR1BJT19QU0NfQ09ORklHX1VBUlRfV0lUSF9DRAk1CisjZGVmaW5lIE1QQzUyeHhfR1BJT19QQ0lfRElTCQkJKDE8PDE1KQorCisvKiBHUElPIHdpdGggV2FrZVVwKi8KK3N0cnVjdCBtcGM1Mnh4X2dwaW9fd2t1cCB7CisJdTggd2t1cF9ncGlvZTsJCS8qIEdQSU9fV0tVUCArIDB4MDAgKi8KKwl1OCByZXNlcnZlZDFbM107CS8qIEdQSU9fV0tVUCArIDB4MDMgKi8KKwl1OCB3a3VwX29kZTsJCS8qIEdQSU9fV0tVUCArIDB4MDQgKi8KKwl1OCByZXNlcnZlZDJbM107CS8qIEdQSU9fV0tVUCArIDB4MDUgKi8KKwl1OCB3a3VwX2RkcjsJCS8qIEdQSU9fV0tVUCArIDB4MDggKi8KKwl1OCByZXNlcnZlZDNbM107CS8qIEdQSU9fV0tVUCArIDB4MDkgKi8KKwl1OCB3a3VwX2R2bzsJCS8qIEdQSU9fV0tVUCArIDB4MEMgKi8KKwl1OCByZXNlcnZlZDRbM107CS8qIEdQSU9fV0tVUCArIDB4MEQgKi8KKwl1OCB3a3VwX2ludGVuOwkJLyogR1BJT19XS1VQICsgMHgxMCAqLworCXU4IHJlc2VydmVkNVszXTsJLyogR1BJT19XS1VQICsgMHgxMSAqLworCXU4IHdrdXBfaWludGVuOwkJLyogR1BJT19XS1VQICsgMHgxNCAqLworCXU4IHJlc2VydmVkNlszXTsJLyogR1BJT19XS1VQICsgMHgxNSAqLworCXUxNiB3a3VwX2l0eXBlOwkJLyogR1BJT19XS1VQICsgMHgxOCAqLworCXU4IHJlc2VydmVkN1syXTsJLyogR1BJT19XS1VQICsgMHgxQSAqLworCXU4IHdrdXBfbWFzdGU7CQkvKiBHUElPX1dLVVAgKyAweDFDICovCisJdTggcmVzZXJ2ZWQ4WzNdOwkvKiBHUElPX1dLVVAgKyAweDFEICovCisJdTggd2t1cF9pdmFsOwkJLyogR1BJT19XS1VQICsgMHgyMCAqLworCXU4IHJlc2VydmVkOVszXTsJLyogR1BJT19XS1VQICsgMHgyMSAqLworCXU4IHdrdXBfaXN0YXQ7CQkvKiBHUElPX1dLVVAgKyAweDI0ICovCisJdTggcmVzZXJ2ZWQxMFszXTsJLyogR1BJT19XS1VQICsgMHgyNSAqLworfTsKKworLyogWExCIEJ1cyBjb250cm9sICovCitzdHJ1Y3QgbXBjNTJ4eF94bGIgeworCXU4IHJlc2VydmVkWzB4NDBdOworCXUzMiBjb25maWc7CQkvKiBYTEIgKyAweDQwICovCisJdTMyIHZlcnNpb247CQkvKiBYTEIgKyAweDQ0ICovCisJdTMyIHN0YXR1czsJCS8qIFhMQiArIDB4NDggKi8KKwl1MzIgaW50X2VuYWJsZTsJCS8qIFhMQiArIDB4NGMgKi8KKwl1MzIgYWRkcl9jYXB0dXJlOwkvKiBYTEIgKyAweDUwICovCisJdTMyIGJ1c19zaWdfY2FwdHVyZTsJLyogWExCICsgMHg1NCAqLworCXUzMiBhZGRyX3RpbWVvdXQ7CS8qIFhMQiArIDB4NTggKi8KKwl1MzIgZGF0YV90aW1lb3V0OwkvKiBYTEIgKyAweDVjICovCisJdTMyIGJ1c19hY3RfdGltZW91dDsJLyogWExCICsgMHg2MCAqLworCXUzMiBtYXN0ZXJfcHJpX2VuYWJsZTsJLyogWExCICsgMHg2NCAqLworCXUzMiBtYXN0ZXJfcHJpb3JpdHk7CS8qIFhMQiArIDB4NjggKi8KKwl1MzIgYmFzZV9hZGRyZXNzOwkvKiBYTEIgKyAweDZjICovCisJdTMyIHNub29wX3dpbmRvdzsJLyogWExCICsgMHg3MCAqLworfTsKKworI2RlZmluZSBNUEM1Mnh4X1hMQl9DRkdfUExESVMJCSgxIDw8IDMxKQorI2RlZmluZSBNUEM1Mnh4X1hMQl9DRkdfU05PT1AJCSgxIDw8IDE1KQorCisvKiBDbG9jayBEaXN0cmlidXRpb24gY29udHJvbCAqLworc3RydWN0IG1wYzUyeHhfY2RtIHsKKwl1MzIganRhZ19pZDsJCS8qIENETSArIDB4MDAgIHJlZzAgcmVhZCBvbmx5ICovCisJdTMyIHJzdGNmZzsJCS8qIENETSArIDB4MDQgIHJlZzEgcmVhZCBvbmx5ICovCisJdTMyIGJyZWFkY3J1bWI7CQkvKiBDRE0gKyAweDA4ICByZWcyICovCisKKwl1OCBtZW1fY2xrX3NlbDsJCS8qIENETSArIDB4MGMgIHJlZzMgYnl0ZTAgKi8KKwl1OCB4bGJfY2xrX3NlbDsJCS8qIENETSArIDB4MGQgIHJlZzMgYnl0ZTEgcmVhZCBvbmx5ICovCisJdTggaXBiX2Nsa19zZWw7CQkvKiBDRE0gKyAweDBlICByZWczIGJ5dGUyICovCisJdTggcGNpX2Nsa19zZWw7CQkvKiBDRE0gKyAweDBmICByZWczIGJ5dGUzICovCisKKwl1OCBleHRfNDhtaHpfZW47CS8qIENETSArIDB4MTAgIHJlZzQgYnl0ZTAgKi8KKwl1OCBmZF9lbmFibGU7CQkvKiBDRE0gKyAweDExICByZWc0IGJ5dGUxICovCisJdTE2IGZkX2NvdW50ZXJzOwkvKiBDRE0gKyAweDEyICByZWc0IGJ5dGUyLDMgKi8KKworCXUzMiBjbGtfZW5hYmxlczsJLyogQ0RNICsgMHgxNCAgcmVnNSAqLworCisJdTggb3NjX2Rpc2FibGU7CQkvKiBDRE0gKyAweDE4ICByZWc2IGJ5dGUwICovCisJdTggcmVzZXJ2ZWQwWzNdOwkvKiBDRE0gKyAweDE5ICByZWc2IGJ5dGUxLDIsMyAqLworCisJdTggY2NzX3NsZWVwX2VuYWJsZTsJLyogQ0RNICsgMHgxYyAgcmVnNyBieXRlMCAqLworCXU4IG9zY19zbGVlcF9lbmFibGU7CS8qIENETSArIDB4MWQgIHJlZzcgYnl0ZTEgKi8KKwl1OCByZXNlcnZlZDE7CQkvKiBDRE0gKyAweDFlICByZWc3IGJ5dGUyICovCisJdTggY2NzX3FyZXFfdGVzdDsJLyogQ0RNICsgMHgxZiAgcmVnNyBieXRlMyAqLworCisJdTggc29mdF9yZXNldDsJCS8qIENETSArIDB4MjAgIHU4IGJ5dGUwICovCisJdTggbm9fY2tzdHA7CQkvKiBDRE0gKyAweDIxICB1OCBieXRlMCAqLworCXU4IHJlc2VydmVkMlsyXTsJLyogQ0RNICsgMHgyMiAgdTggYnl0ZTEsMiwzICovCisKKwl1OCBwbGxfbG9jazsJCS8qIENETSArIDB4MjQgIHJlZzkgYnl0ZTAgKi8KKwl1OCBwbGxfbG9vc2Vsb2NrOwkvKiBDRE0gKyAweDI1ICByZWc5IGJ5dGUxICovCisJdTggcGxsX3NtX2xvY2t3aW47CS8qIENETSArIDB4MjYgIHJlZzkgYnl0ZTIgKi8KKwl1OCByZXNlcnZlZDM7CQkvKiBDRE0gKyAweDI3ICByZWc5IGJ5dGUzICovCisKKwl1MTYgcmVzZXJ2ZWQ0OwkJLyogQ0RNICsgMHgyOCAgcmVnMTAgYnl0ZTAsMSAqLworCXUxNiBtY2xrZW5fZGl2X3BzYzE7CS8qIENETSArIDB4MmEgIHJlZzEwIGJ5dGUyLDMgKi8KKworCXUxNiByZXNlcnZlZDU7CQkvKiBDRE0gKyAweDJjICByZWcxMSBieXRlMCwxICovCisJdTE2IG1jbGtlbl9kaXZfcHNjMjsJLyogQ0RNICsgMHgyZSAgcmVnMTEgYnl0ZTIsMyAqLworCisJdTE2IHJlc2VydmVkNjsJCS8qIENETSArIDB4MzAgIHJlZzEyIGJ5dGUwLDEgKi8KKwl1MTYgbWNsa2VuX2Rpdl9wc2MzOwkvKiBDRE0gKyAweDMyICByZWcxMiBieXRlMiwzICovCisKKwl1MTYgcmVzZXJ2ZWQ3OwkJLyogQ0RNICsgMHgzNCAgcmVnMTMgYnl0ZTAsMSAqLworCXUxNiBtY2xrZW5fZGl2X3BzYzY7CS8qIENETSArIDB4MzYgIHJlZzEzIGJ5dGUyLDMgKi8KK307CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBQcm90b3R5cGVzIGZvciBNUEM1Mnh4IHN5c2RldiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK2V4dGVybiB2b2lkIF9faW9tZW0gKiBtcGM1Mnh4X2ZpbmRfYW5kX21hcChjb25zdCBjaGFyICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBtcGM1Mnh4X2ZpbmRfaXBiX2ZyZXEoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKK2V4dGVybiB2b2lkIG1wYzUyeHhfc2V0dXBfY3B1KHZvaWQpOworCitleHRlcm4gdm9pZCBtcGM1Mnh4X2luaXRfaXJxKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBtcGM1Mnh4X2dldF9pcnEodm9pZCk7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9fQVNNX1BPV0VSUENfTVBDNTJ4eF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4NXh4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg1eHguaAppbmRleCBjY2RiOGEyLi41NDE0Mjk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg1eHguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg1eHguaApAQCAtMzEsMTQgKzMxLDYgQEAKICNpbmNsdWRlIDxwbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5oPgogI2VuZGlmCiAKLSNkZWZpbmUgX0lPX0JBU0UgICAgICAgIGlzYV9pb19iYXNlCi0jZGVmaW5lIF9JU0FfTUVNX0JBU0UgICBpc2FfbWVtX2Jhc2UKLSNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVCBwY2lfZHJhbV9vZmZzZXQKLSNlbHNlCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVCAwCi0jZW5kaWYKLQogLyogTGV0IG1vZHVsZXMvZHJpdmVycyBnZXQgYXQgQ0NTUkJBUiAqLwogZXh0ZXJuIHBoeXNfYWRkcl90IGdldF9jY3NyYmFyKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBpYy5oCmluZGV4IGVmMGE1NDUuLmI3MWU3YjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBpYy5oCkBAIC0zLDYgKzMsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9kY3IuaD4KIAogLyoKICAqIEdsb2JhbCByZWdpc3RlcnMKQEAgLTIyNSw2ICsyMjYsMjMgQEAKICNlbmRpZiAvKiBDT05GSUdfTVBJQ19CUk9LRU5fVTMgKi8KIAogCitlbnVtIG1waWNfcmVnX3R5cGUgeworCW1waWNfYWNjZXNzX21taW9fbGUsCisJbXBpY19hY2Nlc3NfbW1pb19iZSwKKyNpZmRlZiBDT05GSUdfUFBDX0RDUgorCW1waWNfYWNjZXNzX2RjcgorI2VuZGlmCit9OworCitzdHJ1Y3QgbXBpY19yZWdfYmFuayB7CisJdTMyIF9faW9tZW0JKmJhc2U7CisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKwlkY3JfaG9zdF90CWRob3N0OworCXVuc2lnbmVkIGludAlkYmFzZTsKKwl1bnNpZ25lZCBpbnQJZG9mZjsKKyNlbmRpZiAvKiBDT05GSUdfUFBDX0RDUiAqLworfTsKKwogLyogVGhlIGluc3RhbmNlIGRhdGEgb2YgYSBnaXZlbiBNUElDICovCiBzdHJ1Y3QgbXBpYwogewpAQCAtMjY0LDExICsyODIsMTggQEAKIAlzcGlubG9ja190CQlmaXh1cF9sb2NrOwogI2VuZGlmCiAKKwkvKiBSZWdpc3RlciBhY2Nlc3MgbWV0aG9kICovCisJZW51bSBtcGljX3JlZ190eXBlCXJlZ190eXBlOworCiAJLyogVGhlIHZhcmlvdXMgaW9yZW1hcCdlZCBiYXNlcyAqLwotCXZvbGF0aWxlIHUzMiBfX2lvbWVtCSpncmVnczsKLQl2b2xhdGlsZSB1MzIgX19pb21lbQkqdG1yZWdzOwotCXZvbGF0aWxlIHUzMiBfX2lvbWVtCSpjcHVyZWdzW01QSUNfTUFYX0NQVVNdOwotCXZvbGF0aWxlIHUzMiBfX2lvbWVtCSppc3VzW01QSUNfTUFYX0lTVV07CisJc3RydWN0IG1waWNfcmVnX2JhbmsJZ3JlZ3M7CisJc3RydWN0IG1waWNfcmVnX2JhbmsJdG1yZWdzOworCXN0cnVjdCBtcGljX3JlZ19iYW5rCWNwdXJlZ3NbTVBJQ19NQVhfQ1BVU107CisJc3RydWN0IG1waWNfcmVnX2JhbmsJaXN1c1tNUElDX01BWF9JU1VdOworCisjaWZkZWYgQ09ORklHX1BQQ19EQ1IKKwl1bnNpZ25lZCBpbnQJCWRjcl9iYXNlOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTVBJQ19XRUlSRAogCS8qIFBvaW50ZXIgdG8gSFcgaW5mbyBhcnJheSAqLwpAQCAtMzA1LDYgKzMzMCw4IEBACiAjZGVmaW5lIE1QSUNfU1BWX0VPSQkJCTB4MDAwMDAwMjAKIC8qIE5vIHBhc3N0aHJvdWdoIGRpc2FibGUgKi8KICNkZWZpbmUgTVBJQ19OT19QVEhST1VfRElTCQkweDAwMDAwMDQwCisvKiBEQ1IgYmFzZWQgTVBJQyAqLworI2RlZmluZSBNUElDX1VTRVNfRENSCQkJMHgwMDAwMDA4MAogCiAvKiBNUElDIEhXIG1vZGlmaWNhdGlvbiBJRCAqLwogI2RlZmluZSBNUElDX1JFR1NFVF9NQVNLCQkweGYwMDAwMDAwCkBAIC0zMzcsNyArMzY0LDcgQEAKICAqIHRoYXQgaXMgc2Vuc2VzWzBdIGNvcnJlc3BvbmQgdG8gbGludXggaXJxICJpcnFfb2Zmc2V0Ii4KICAqLwogZXh0ZXJuIHN0cnVjdCBtcGljICptcGljX2FsbG9jKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkJCSAgICAgICBwaHlzX2FkZHJfdCBwaHlzX2FkZHIsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBpc3Vfc2l6ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgaXJxX2NvdW50LApAQCAtMzUwLDcgKzM3Nyw3IEBACiAgKiBAcGh5c19hZGRyOglwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBJU1UKICAqLwogZXh0ZXJuIHZvaWQgbXBpY19hc3NpZ25faXN1KHN0cnVjdCBtcGljICptcGljLCB1bnNpZ25lZCBpbnQgaXN1X251bSwKLQkJCSAgICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcik7CisJCQkgICAgcGh5c19hZGRyX3QgcGh5c19hZGRyKTsKIAogLyogU2V0IGRlZmF1bHQgc2Vuc2UgY29kZXMKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX2RldmljZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vZl9kZXZpY2UuaAppbmRleCBjNWMwYjBiLi5hODg5YjIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX2RldmljZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvb2ZfZGV2aWNlLmgKQEAgLTYsMTIgKzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKLS8qCi0gKiBUaGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGUgaXMgYSBidXMgdHlwZSB1c2VkIGJ5IGRyaXZlcnMgdGhhdCBkbyBub3QKLSAqIGF0dGFjaCB0byBhIG1hY2lvIG9yIHNpbWlsYXIgYnVzIGJ1dCBzdGlsbCB1c2UgT0YgcHJvYmluZwotICogbWVjaGFuaXNtCi0gKi8KLWV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgb2ZfcGxhdGZvcm1fYnVzX3R5cGU7CiAKIC8qCiAgKiBUaGUgb2ZfZGV2aWNlIGlzIGEga2luZCBvZiAiYmFzZSBjbGFzcyIgdGhhdCBpcyBhIHN1cGVyc2V0IG9mCkBAIC0yMCw0NiArMTQsMjIgQEAKICAqLwogc3RydWN0IG9mX2RldmljZQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbm9kZTsJCS8qIE9GIGRldmljZSBub2RlICovCisJc3RydWN0IGRldmljZV9ub2RlCSpub2RlOwkJLyogdG8gYmUgb2Jzb2xldGVkICovCiAJdTY0CQkJZG1hX21hc2s7CS8qIERNQSBtYXNrICovCiAJc3RydWN0IGRldmljZQkJZGV2OwkJLyogR2VuZXJpYyBkZXZpY2UgaW50ZXJmYWNlICovCiB9OwogI2RlZmluZQl0b19vZl9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBvZl9kZXZpY2UsIGRldikKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX21hdGNoX25vZGUoCisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywgY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9kZXZpY2UoCiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywgY29uc3Qgc3RydWN0IG9mX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKm9mX2Rldl9nZXQoc3RydWN0IG9mX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIG9mX2Rldl9wdXQoc3RydWN0IG9mX2RldmljZSAqZGV2KTsKIAotLyoKLSAqIEFuIG9mX3BsYXRmb3JtX2RyaXZlciBkcml2ZXIgaXMgYXR0YWNoZWQgdG8gYSBiYXNpYyBvZl9kZXZpY2Ugb24KLSAqIHRoZSAicGxhdGZvcm0gYnVzIiAob2ZfcGxhdGZvcm1fYnVzX3R5cGUpCi0gKi8KLXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIKLXsKLQljaGFyCQkJKm5hbWU7Ci0Jc3RydWN0IG9mX2RldmljZV9pZAkqbWF0Y2hfdGFibGU7Ci0Jc3RydWN0IG1vZHVsZQkJKm93bmVyOwotCi0JaW50CSgqcHJvYmUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpOwotCWludAkoKnJlbW92ZSkoc3RydWN0IG9mX2RldmljZSogZGV2KTsKLQotCWludAkoKnN1c3BlbmQpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLQlpbnQJKCpyZXN1bWUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7Ci0JaW50CSgqc2h1dGRvd24pKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7Ci0KLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcml2ZXI7Ci19OwotI2RlZmluZQl0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KSBjb250YWluZXJfb2YoZHJ2LHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIsIGRyaXZlcikKLQotZXh0ZXJuIGludCBvZl9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KTsKLWV4dGVybiB2b2lkIG9mX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydik7CiBleHRlcm4gaW50IG9mX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldik7CiBleHRlcm4gdm9pZCBvZl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldik7Ci1leHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkJICAgY29uc3QgY2hhciAqYnVzX2lkLAotCQkJCQkJICAgc3RydWN0IGRldmljZSAqcGFyZW50KTsKIGV4dGVybiB2b2lkIG9mX3JlbGVhc2VfZGV2KHN0cnVjdCBkZXZpY2UgKmRldik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX3BsYXRmb3JtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3ZWFmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvb2ZfcGxhdGZvcm0uaApAQCAtMCwwICsxLDYwIEBACisvKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3JwLgorICoJCQkgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKworLyoKKyAqIFRoZSBvZl9wbGF0Zm9ybV9idXNfdHlwZSBpcyBhIGJ1cyB0eXBlIHVzZWQgYnkgZHJpdmVycyB0aGF0IGRvIG5vdAorICogYXR0YWNoIHRvIGEgbWFjaW8gb3Igc2ltaWxhciBidXMgYnV0IHN0aWxsIHVzZSBPRiBwcm9iaW5nCisgKiBtZWNoYW5pc20KKyAqLworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBvZl9wbGF0Zm9ybV9idXNfdHlwZTsKKworLyoKKyAqIEFuIG9mX3BsYXRmb3JtX2RyaXZlciBkcml2ZXIgaXMgYXR0YWNoZWQgdG8gYSBiYXNpYyBvZl9kZXZpY2Ugb24KKyAqIHRoZSAicGxhdGZvcm0gYnVzIiAob2ZfcGxhdGZvcm1fYnVzX3R5cGUpCisgKi8KK3N0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIKK3sKKwljaGFyCQkJKm5hbWU7CisJc3RydWN0IG9mX2RldmljZV9pZAkqbWF0Y2hfdGFibGU7CisJc3RydWN0IG1vZHVsZQkJKm93bmVyOworCisJaW50CSgqcHJvYmUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwKKwkJCSBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCk7CisJaW50CSgqcmVtb3ZlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYpOworCisJaW50CSgqc3VzcGVuZCkoc3RydWN0IG9mX2RldmljZSogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludAkoKnJlc3VtZSkoc3RydWN0IG9mX2RldmljZSogZGV2KTsKKwlpbnQJKCpzaHV0ZG93bikoc3RydWN0IG9mX2RldmljZSogZGV2KTsKKworCXN0cnVjdCBkZXZpY2VfZHJpdmVyCWRyaXZlcjsKK307CisjZGVmaW5lCXRvX29mX3BsYXRmb3JtX2RyaXZlcihkcnYpIFwKKwljb250YWluZXJfb2YoZHJ2LHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIsIGRyaXZlcikKKworLyogUGxhdGZvcm0gZHJpdmVycyByZWdpc3Rlci91bnJlZ2lzdGVyICovCitleHRlcm4gaW50IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcihzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYpOworZXh0ZXJuIHZvaWQgb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KTsKKworLyogUGxhdGZvcm0gZGV2aWNlcyBhbmQgYnVzc2VzIGNyZWF0aW9uICovCitleHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkJICAgY29uc3QgY2hhciAqYnVzX2lkLAorCQkJCQkJICAgc3RydWN0IGRldmljZSAqcGFyZW50KTsKKy8qIHBzZXVkbyAibWF0Y2hlcyIgdmFsdWUgdG8gbm90IGRvIGRlZXAgcHJvYmUgKi8KKyNkZWZpbmUgT0ZfTk9fREVFUF9QUk9CRSAoKHN0cnVjdCBvZl9kZXZpY2VfaWQgKiktMSkKKworZXh0ZXJuIGludCBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoc3RydWN0IGRldmljZV9ub2RlICpyb290LAorCQkJCSBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAorCQkJCSBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpOworCitleHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9maW5kX2RldmljZV9ieV9waGFuZGxlKHBoYW5kbGUgcGgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaAppbmRleCA1YjMzOTk0Li43MTA0M2JmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaApAQCAtNDIsOSArNDIsMTEgQEAKIAl2b2lkICgqcmVnX3NldHVwKSAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICosCiAJCQkgICBzdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyAqLAogCQkJICAgaW50IG51bV9jb3VudGVycyk7Ci0Jdm9pZCAoKmNwdV9zZXR1cCkgKHZvaWQgKik7CisJdm9pZCAoKmNwdV9zZXR1cCkgKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqKTsKIAl2b2lkICgqc3RhcnQpIChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKik7CisgICAgICAgIHZvaWQgKCpnbG9iYWxfc3RhcnQpIChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKik7CiAJdm9pZCAoKnN0b3ApICh2b2lkKTsKKwl2b2lkICgqZ2xvYmFsX3N0b3ApICh2b2lkKTsKIAl2b2lkICgqaGFuZGxlX2ludGVycnVwdCkgKHN0cnVjdCBwdF9yZWdzICosCiAJCQkJICBzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKik7CiAJaW50IG51bV9jb3VudGVyczsKQEAgLTU0LDYgKzU2LDcgQEAKIGV4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF9yczY0OwogZXh0ZXJuIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX3Bvd2VyNDsKIGV4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF83NDUwOworZXh0ZXJuIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX2NlbGw7CiAKICNpZm5kZWYgQ09ORklHX0ZTTF9CT09LRQogCkBAIC0xMjEsNyArMTI0LDkwIEBACiAJCWJyZWFrOwogCX0KIH0KLSNlbmRpZiAvKiAhQ09ORklHX0ZTTF9CT09LRSAqLworI2Vsc2UgLyogQ09ORklHX0ZTTF9CT09LRSAqLworc3RhdGljIGlubGluZSB1MzIgZ2V0X3BtbGNhKGludCBjdHIpCit7CisJdTMyIHBtbGNhOworCisJc3dpdGNoIChjdHIpIHsKKwkJY2FzZSAwOgorCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBhbmljKCJCYWQgY3RyIG51bWJlclxuIik7CisJfQorCisJcmV0dXJuIHBtbGNhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BtbGNhKGludCBjdHIsIHUzMiBwbWxjYSkKK3sKKwlzd2l0Y2ggKGN0cikgeworCQljYXNlIDA6CisJCQltdHBtcihQTVJOX1BNTENBMCwgcG1sY2EpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW10cG1yKFBNUk5fUE1MQ0ExLCBwbWxjYSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbXRwbXIoUE1STl9QTUxDQTIsIHBtbGNhKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQltdHBtcihQTVJOX1BNTENBMywgcG1sY2EpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYW5pYygiQmFkIGN0ciBudW1iZXJcbiIpOworCX0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3RyX3JlYWQodW5zaWduZWQgaW50IGkpCit7CisJc3dpdGNoKGkpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMCk7CisJCWNhc2UgMToKKwkJCXJldHVybiBtZnBtcihQTVJOX1BNQzEpOworCQljYXNlIDI6CisJCQlyZXR1cm4gbWZwbXIoUE1STl9QTUMyKTsKKwkJY2FzZSAzOgorCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMyk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdHJfd3JpdGUodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCB2YWwpCit7CisJc3dpdGNoKGkpIHsKKwkJY2FzZSAwOgorCQkJbXRwbXIoUE1STl9QTUMwLCB2YWwpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW10cG1yKFBNUk5fUE1DMSwgdmFsKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQltdHBtcihQTVJOX1BNQzIsIHZhbCk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJbXRwbXIoUE1STl9QTUMzLCB2YWwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworI2VuZGlmIC8qIENPTkZJR19GU0xfQk9PS0UgKi8KKwogCiBleHRlcm4gdm9pZCBvcF9wb3dlcnBjX2JhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsIHVuc2lnbmVkIGludCBkZXB0aCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFjYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKaW5kZXggMGE0ZTVjOS4uMGQzYWRjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKQEAgLTkzLDcgKzkzLDggQEAKIAl1NjQgc3RhYl9ycjsJCQkvKiBzdGFiL3NsYiByb3VuZC1yb2JpbiBjb3VudGVyICovCiAJdTY0IHNhdmVkX3IxOwkJCS8qIHIxIHNhdmUgZm9yIFJUQVMgY2FsbHMgKi8KIAl1NjQgc2F2ZWRfbXNyOwkJCS8qIE1TUiBzYXZlZCBoZXJlIGJ5IGVudGVyX3J0YXMgKi8KLQl1OCBwcm9jX2VuYWJsZWQ7CQkvKiBpcnEgc29mdC1lbmFibGUgZmxhZyAqLworCXU4IHNvZnRfZW5hYmxlZDsJCS8qIGlycSBzb2Z0LWVuYWJsZSBmbGFnICovCisJdTggaGFyZF9lbmFibGVkOwkJLyogc2V0IGlmIGlycXMgYXJlIGVuYWJsZWQgaW4gTVNSICovCiAJdTggaW9fc3luYzsJCQkvKiB3cml0ZWwoKSBuZWVkcyBzcGluX3VubG9jayBzeW5jICovCiAKIAkvKiBTdHVmZiBmb3IgYWNjdXJhdGUgdGltZSBhY2NvdW50aW5nICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2VfMzIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZV8zMi5oCmluZGV4IDI2NzdiYWQuLjA3ZjZkM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZV8zMi5oCkBAIC0yNiwxNSArMjYsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3BhZ2Uodm9pZCAqcGFnZSkgeyBjbGVhcl9wYWdlcyhwYWdlLCAwKTsgfQogZXh0ZXJuIHZvaWQgY29weV9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tKTsKIAotLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KLWV4dGVybiBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBsejsKLQotCXNpemUgPSAoc2l6ZS0xKSA+PiBQQUdFX1NISUZUOwotCWFzbSAoImNudGx6dyAlMCwlMSIgOiAiPXIiIChseikgOiAiciIgKHNpemUpKTsKLQlyZXR1cm4gMzIgLSBsejsKLX0KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaAppbmRleCA4NmVlNDZiLi5jYjAyYzlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaApAQCAtMjUsMTcgKzI1LDE4IEBACiAJaW50IG5vZGU7CiAJdm9pZCAqYXJjaF9kYXRhOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9ub2RlOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKIAogCWludCBmaXJzdF9idXNubzsKIAlpbnQgbGFzdF9idXNubzsKIAogCXZvaWQgX19pb21lbSAqaW9fYmFzZV92aXJ0OwotCXVuc2lnbmVkIGxvbmcgaW9fYmFzZV9waHlzOworCXJlc291cmNlX3NpemVfdCBpb19iYXNlX3BoeXM7CiAKIAkvKiBTb21lIG1hY2hpbmVzIGhhdmUgYSBub24gMToxIG1hcHBpbmcgb2YKIAkgKiB0aGUgUENJIG1lbW9yeSBzcGFjZSBpbiB0aGUgQ1BVIGJ1cyBzcGFjZQogCSAqLwotCXVuc2lnbmVkIGxvbmcgcGNpX21lbV9vZmZzZXQ7CisJcmVzb3VyY2Vfc2l6ZV90IHBjaV9tZW1fb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgcGNpX2lvX3NpemU7CiAKIAlzdHJ1Y3QgcGNpX29wcyAqb3BzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKaW5kZXggNDZhZmQyOS4uYWM2NTZlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCkBAIC02MiwyOSArNjIsMjMgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QUEM2NAotI2RlZmluZSBIQVZFX0FSQ0hfUENJX01XSSAxCi1zdGF0aWMgaW5saW5lIGludCBwY2liaW9zX3ByZXBfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JLyoKLQkgKiBXZSB3b3VsZCBsaWtlIHRvIGF2b2lkIHRvdWNoaW5nIHRoZSBjYWNoZWxpbmUgc2l6ZSBvciBNV0kgYml0Ci0JICogYnV0IHdlIGNhbnQgZG8gdGhhdCB3aXRoIHRoZSBjdXJyZW50IHBjaWJpb3NfcHJlcF9td2kgCi0JICogaW50ZXJmYWNlLiBwU2VyaWVzIGZpcm13YXJlIHNldHMgdGhlIGNhY2hlbGluZSBzaXplICh3aGljaCBpcyBub3QKLQkgKiB0aGUgY3B1IGNhY2hlbGluZSBzaXplIGluIGFsbCBjYXNlcykgYW5kIGhhcmR3YXJlIHRyZWF0cyBNV0kgCi0JICogdGhlIHNhbWUgYXMgbWVtb3J5IHdyaXRlLiBTbyB3ZSBkb250IHRvdWNoIHRoZSBjYWNoZWxpbmUgc2l6ZQotCSAqIGhlcmUgYW5kIGFsbG93IHRoZSBnZW5lcmljIGNvZGUgdG8gc2V0IHRoZSBNV0kgYml0LgotCSAqLwotCXJldHVybiAwOwotfQogCi1leHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyBwY2lfZG1hX29wczsKKy8qCisgKiBXZSB3YW50IHRvIGF2b2lkIHRvdWNoaW5nIHRoZSBjYWNoZWxpbmUgc2l6ZSBvciBNV0kgYml0LgorICogcFNlcmllcyBmaXJtd2FyZSBzZXRzIHRoZSBjYWNoZWxpbmUgc2l6ZSAod2hpY2ggaXMgbm90IHRoZSBjcHUgY2FjaGVsaW5lCisgKiBzaXplIGluIGFsbCBjYXNlcykgYW5kIGhhcmR3YXJlIHRyZWF0cyBNV0kgdGhlIHNhbWUgYXMgbWVtb3J5IHdyaXRlLgorICovCisjZGVmaW5lIFBDSV9ESVNBQkxFX01XSQorCitleHRlcm4gc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqcGNpX2RtYV9vcHM7CiAKIC8qIEZvciBEQUMgRE1BLCB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBpdCBieSBkZWZhdWx0LCBidXQKICAqIHdlIGxldCA2NC1iaXQgcGxhdGZvcm1zIG92ZXJyaWRlIHRoaXMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9kYWNfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsdTY0IG1hc2spCiB7Ci0JaWYgKHBjaV9kbWFfb3BzLmRhY19kbWFfc3VwcG9ydGVkKQotCQlyZXR1cm4gcGNpX2RtYV9vcHMuZGFjX2RtYV9zdXBwb3J0ZWQoJmh3ZGV2LT5kZXYsIG1hc2spOworCWlmIChwY2lfZG1hX29wcyAmJiBwY2lfZG1hX29wcy0+ZGFjX2RtYV9zdXBwb3J0ZWQpCisJCXJldHVybiBwY2lfZG1hX29wcy0+ZGFjX2RtYV9zdXBwb3J0ZWQoJmh3ZGV2LT5kZXYsIG1hc2spOwogCXJldHVybiAwOwogfQogCkBAIC0xNDksOCArMTQzLDEzIEBACiAvKiBUZWxsIGRyaXZlcnMvcGNpL3Byb2MuYyB0aGF0IHdlIGhhdmUgcGNpX21tYXBfcGFnZV9yYW5nZSgpICovCiAjZGVmaW5lIEhBVkVfUENJX01NQVAJMQogCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0vKiBwY2lfdW5tYXBfe3NpbmdsZSxwYWdlfSBpcyBub3QgYSBub3AsIHRodXMuLi4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QUEM2NCkgfHwgZGVmaW5lZChDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFKQorLyoKKyAqIEZvciA2NC1iaXQga2VybmVscywgcGNpX3VubWFwX3tzaW5nbGUscGFnZX0gaXMgbm90IGEgbm9wLgorICogRm9yIDMyLWJpdCBub24tY29oZXJlbnQga2VybmVscywgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCkgYW5kCisgKiBzbyBvbiBhcmUgbm90IG5vcHMuCisgKiBhbmQgdGh1cy4uLgorICovCiAjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0FERFIoQUREUl9OQU1FKQlcCiAJZG1hX2FkZHJfdCBBRERSX05BTUU7CiAjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0xFTihMRU5fTkFNRSkJCVwKQEAgLTE2NCw2ICsxNjMsMjAgQEAKICNkZWZpbmUgcGNpX3VubWFwX2xlbl9zZXQoUFRSLCBMRU5fTkFNRSwgVkFMKQkJXAogCSgoKFBUUiktPkxFTl9OQU1FKSA9IChWQUwpKQogCisjZWxzZSAvKiAzMi1iaXQgJiYgY29oZXJlbnQgKi8KKworLyogcGNpX3VubWFwX3twYWdlLHNpbmdsZX0gaXMgYSBub3Agc28uLi4gKi8KKyNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfQUREUihBRERSX05BTUUpCisjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0xFTihMRU5fTkFNRSkKKyNkZWZpbmUgcGNpX3VubWFwX2FkZHIoUFRSLCBBRERSX05BTUUpCQkoMCkKKyNkZWZpbmUgcGNpX3VubWFwX2FkZHJfc2V0KFBUUiwgQUREUl9OQU1FLCBWQUwpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcGNpX3VubWFwX2xlbihQVFIsIExFTl9OQU1FKQkJKDApCisjZGVmaW5lIHBjaV91bm1hcF9sZW5fc2V0KFBUUiwgTEVOX05BTUUsIFZBTCkJZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogQ09ORklHX1BQQzY0IHx8IENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUgKi8KKworI2lmZGVmIENPTkZJR19QUEM2NAorCiAvKiBUaGUgUENJIGFkZHJlc3Mgc3BhY2UgZG9lcyBub3QgZXF1YWwgdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzCiAgKiBzcGFjZSAod2UgaGF2ZSBhbiBJT01NVSkuICBUaGUgSURFIGFuZCBTQ1NJIGRldmljZSBsYXllcnMgdXNlCiAgKiB0aGlzIGJvb2xlYW4gZm9yIGJvdW5jZSBidWZmZXIgZGVjaXNpb25zLgpAQCAtMTc4LDE2ICsxOTEsOCBAQAogICovCiAjZGVmaW5lIFBDSV9ETUFfQlVTX0lTX1BIWVMgICAgICgxKQogCi0vKiBwY2lfdW5tYXBfe3BhZ2Usc2luZ2xlfSBpcyBhIG5vcCBzby4uLiAqLwotI2RlZmluZSBERUNMQVJFX1BDSV9VTk1BUF9BRERSKEFERFJfTkFNRSkKLSNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfTEVOKExFTl9OQU1FKQotI2RlZmluZSBwY2lfdW5tYXBfYWRkcihQVFIsIEFERFJfTkFNRSkJCSgwKQotI2RlZmluZSBwY2lfdW5tYXBfYWRkcl9zZXQoUFRSLCBBRERSX05BTUUsIFZBTCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBwY2lfdW5tYXBfbGVuKFBUUiwgTEVOX05BTUUpCQkoMCkKLSNkZWZpbmUgcGNpX3VubWFwX2xlbl9zZXQoUFRSLCBMRU5fTkFNRSwgVkFMKQlkbyB7IH0gd2hpbGUgKDApCi0KICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KLQkKKwogZXh0ZXJuIHZvaWQgcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLAogCQkJc3RydWN0IHJlc291cmNlICpyZXMpOwpAQCAtMjE2LDYgKzIyMSw4IEBACiBleHRlcm4gdm9pZCBwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCXN0cnVjdCBwY2lfYnVzICpidXMpOwogCitleHRlcm4gdm9pZCBwY2liaW9zX3NldHVwX25ld19kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CisKIGV4dGVybiB2b2lkIHBjaWJpb3NfY2xhaW1fb25lX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYik7CiAKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmluaXRfcGhiX2R5bmFtaWMoc3RydWN0IGRldmljZV9ub2RlICpkbik7CkBAIC0yMzgsMTIgKzI0NSwxMCBAQAogCQkJCQkgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQkgcGdwcm90X3QgcHJvdCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QUENfTVVMVElQTEFURk9STSkgfHwgZGVmaW5lZChDT05GSUdfUFBDMzIpCiAjZGVmaW5lIEhBVkVfQVJDSF9QQ0lfUkVTT1VSQ0VfVE9fVVNFUgogZXh0ZXJuIHZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKIAkJCQkgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLAogCQkJCSByZXNvdXJjZV9zaXplX3QgKnN0YXJ0LCByZXNvdXJjZV9zaXplX3QgKmVuZCk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNIHx8IENPTkZJR19QUEMzMiAqLwogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1BPV0VSUENfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ2FsbG9jLmgKaW5kZXggYWU2M2RiNy4uYjA4MzBkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ2FsbG9jLmgKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAKLWV4dGVybiBrbWVtX2NhY2hlX3QgKnBndGFibGVfY2FjaGVbXTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqcGd0YWJsZV9jYWNoZVtdOwogCiAjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKICNkZWZpbmUgUFRFX0NBQ0hFX05VTQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWMuaAppbmRleCAwN2Q2YTQyLi44NTg4YmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1jLmgKQEAgLTMyLDE4ICszMiw1IEBACiB2b2lkIHBvd2VyNF9lbmFibGVfcG1jcyh2b2lkKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0ZTTF9CT09LRQotdm9pZCBpbml0X3BtY19zdG9wKGludCBjdHIpOwotdm9pZCBzZXRfcG1jX2V2ZW50KGludCBjdHIsIGludCBldmVudCk7Ci12b2lkIHNldF9wbWNfdXNlcl9rZXJuZWwoaW50IGN0ciwgaW50IHVzZXIsIGludCBrZXJuZWwpOwotdm9pZCBzZXRfcG1jX21hcmtlZChpbnQgY3RyLCBpbnQgbWFyazAsIGludCBtYXJrMSk7Ci12b2lkIHBtY19zdGFydF9jdHIoaW50IGN0ciwgaW50IGVuYWJsZSk7Ci12b2lkIHBtY19zdGFydF9jdHJzKGludCBlbmFibGUpOwotdm9pZCBwbWNfc3RvcF9jdHJzKHZvaWQpOwotdm9pZCBkdW1wX3BtY3Modm9pZCk7Ci0KLWV4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF9mc2xfYm9va2U7Ci0jZW5kaWYKLQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfUE9XRVJQQ19QTUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAppbmRleCAxMTE1NzU2Li5hYjZlZGRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaApAQCAtMzYsMTggKzM2LDE3IEBACiB2b2lkICp0cmF2ZXJzZV9wY2lfZGV2aWNlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKnN0YXJ0LCB0cmF2ZXJzZV9mdW5jIHByZSwKIAkJdm9pZCAqZGF0YSk7CiAKLXZvaWQgcGNpX2RldnNfcGhiX2luaXQodm9pZCk7Ci12b2lkIHBjaV9kZXZzX3BoYl9pbml0X2R5bmFtaWMoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwotaW50IHNldHVwX3BoYihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwotdm9pZCBfX2RldmluaXQgc2Nhbl9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKK2V4dGVybiB2b2lkIHBjaV9kZXZzX3BoYl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgcGNpX2RldnNfcGhiX2luaXRfZHluYW1pYyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CitleHRlcm4gdm9pZCBzY2FuX3BoYihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOwogCiAvKiBGcm9tIHJ0YXNfcGNpLmggKi8KLXZvaWQgaW5pdF9wY2lfY29uZmlnX3Rva2VucyAodm9pZCk7Ci11bnNpZ25lZCBsb25nIGdldF9waGJfYnVpZCAoc3RydWN0IGRldmljZV9ub2RlICopOworZXh0ZXJuIHZvaWQgaW5pdF9wY2lfY29uZmlnX3Rva2VucyAodm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfcGhiX2J1aWQgKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKK2V4dGVybiBpbnQgcnRhc19zZXR1cF9waGIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpOwogCiAvKiBGcm9tIHBTZXJpZXNfcGNpLmggKi8KIGV4dGVybiB2b2lkIHBTZXJpZXNfZmluYWxfZml4dXAodm9pZCk7Ci1leHRlcm4gdm9pZCBwU2VyaWVzX2lycV9idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9wcm9iZV9vbmx5OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwY19hc20uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjX2FzbS5oCmluZGV4IGE5NDBjZmUuLmZhMDgzZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjX2FzbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjX2FzbS5oCkBAIC0zMCw5ICszMCw5IEBACiAJbWZzcHIJcmEsU1BSTl9QVVJSOwkJLyogZ2V0IHByb2Nlc3NvciB1dGlsLiByZWcgKi8JXAogRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfUFVSUik7CQkJCQlcCiBCRUdJTl9GVFJfU0VDVElPTjsJCQkJCQkJXAotCW1mdGIJcmE7CQkJLyogb3IgZ2V0IFRCIGlmIG5vIFBVUlIgKi8JXAorCU1GVEIocmEpOwkJCS8qIG9yIGdldCBUQiBpZiBubyBQVVJSICovCVwKIEVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1BVUlIpOwkJCQkJXAotCWxkCXJiLFBBQ0FfU1RBUlRQVVJSKHIxMyk7CQkJCVwKKwlsZAlyYixQQUNBX1NUQVJUUFVSUihyMTMpOwkJCQkJXAogCXN0ZAlyYSxQQUNBX1NUQVJUUFVSUihyMTMpOwkJCQkJXAogCXN1YmYJcmIscmIscmE7CQkvKiBzdWJ0cmFjdCBzdGFydCB2YWx1ZSAqLwlcCiAJbGQJcmEsUEFDQV9VU0VSX1RJTUUocjEzKTsJCQkJCVwKQEAgLTQ1LDkgKzQ1LDkgQEAKIAltZnNwcglyYSxTUFJOX1BVUlI7CQkvKiBnZXQgcHJvY2Vzc29yIHV0aWwuIHJlZyAqLwlcCiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9QVVJSKTsJCQkJCVwKIEJFR0lOX0ZUUl9TRUNUSU9OOwkJCQkJCQlcCi0JbWZ0YglyYTsJCQkvKiBvciBnZXQgVEIgaWYgbm8gUFVSUiAqLwlcCisJTUZUQihyYSk7CQkJLyogb3IgZ2V0IFRCIGlmIG5vIFBVUlIgKi8JXAogRU5EX0ZUUl9TRUNUSU9OX0lGQ0xSKENQVV9GVFJfUFVSUik7CQkJCQlcCi0JbGQJcmIsUEFDQV9TVEFSVFBVUlIocjEzKTsJCQkJXAorCWxkCXJiLFBBQ0FfU1RBUlRQVVJSKHIxMyk7CQkJCQlcCiAJc3RkCXJhLFBBQ0FfU1RBUlRQVVJSKHIxMyk7CQkJCQlcCiAJc3ViZglyYixyYixyYTsJCS8qIHN1YnRyYWN0IHN0YXJ0IHZhbHVlICovCVwKIAlsZAlyYSxQQUNBX1NZU1RFTV9USU1FKHIxMyk7CQkJCVwKQEAgLTI3NCw2ICsyNzQsMTYgQEAKICNkZWZpbmUgSVNZTkNfNjAxCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QUENfQ0VMTAorI2RlZmluZSBNRlRCKGRlc3QpCQkJXAorOTA6CW1mdGIgIGRlc3Q7CQkJXAorQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDk2KTsJCVwKKwljbXB3aSBkZXN0LDA7CQkJXAorCWJlcS0gIDkwYjsJCQlcCitFTkRfRlRSX1NFQ1RJT05fTkVTVEVEKENQVV9GVFJfQ0VMTF9UQl9CVUcsIENQVV9GVFJfQ0VMTF9UQl9CVUcsIDk2KQorI2Vsc2UKKyNkZWZpbmUgTUZUQihkZXN0KQkJCW1mdGIgZGVzdAorI2VuZGlmCiAKICNpZm5kZWYgQ09ORklHX1NNUAogI2RlZmluZSBUTEJTWU5DCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaAppbmRleCA2Y2I2ZmIxLi5hMjZjMzJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKQEAgLTUzLDEwICs1Myw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BSRVAgKi8KIAotI2lmbmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KLSNkZWZpbmUgX21hY2hpbmUgMAotI2VuZGlmIC8qIENPTkZJR19QUENfTVVMVElQTEFURk9STSAqLwotCiAjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKaW5kZXggNTI0NjI5Ny4uMGFmZWUxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmgKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgZmxhdHRlbmVkIGRldmljZSB0cmVlICovCkBAIC0xMzQsNyArMTM1LDcgQEAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9wYXJlbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9uZXh0X2NoaWxkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpOwotZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJIGludCAqbGVucCk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlX2dldChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwpAQCAtMTU4LDEwICsxNTksMTIgQEAKIGV4dGVybiB2b2lkIGZpbmlzaF9kZXZpY2VfdHJlZSh2b2lkKTsKIGV4dGVybiB2b2lkIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSh2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfZGV2dHJlZSh2b2lkICopOwotZXh0ZXJuIGludCBkZXZpY2VfaXNfY29tcGF0aWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgZGV2aWNlX2lzX2NvbXBhdGlibGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsCisJCQkJY29uc3QgY2hhciAqKTsKIGV4dGVybiBpbnQgbWFjaGluZV9pc19jb21wYXRpYmxlKGNvbnN0IGNoYXIgKmNvbXBhdCk7Ci1leHRlcm4gY29uc3Qgdm9pZCAqZ2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJaW50ICpsZW5wKTsKK2V4dGVybiBjb25zdCB2b2lkICpnZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJaW50ICpsZW5wKTsKIGV4dGVybiB2b2lkIHByaW50X3Byb3BlcnRpZXMoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIGV4dGVybiBpbnQgcHJvbV9uX2FkZHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlKiBucCk7CiBleHRlcm4gaW50IHByb21fbl9zaXplX2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSogbnApOwpAQCAtMzMxLDYgKzMzNCwyMCBAQAogc3RydWN0IHBjaV9kZXY7CiBleHRlcm4gaW50IG9mX2lycV9tYXBfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgb2ZfaXJxICpvdXRfaXJxKTsKIAorc3RhdGljIGlubGluZSBpbnQgb2ZfaXJxX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsIHN0cnVjdCByZXNvdXJjZSAqcikKK3sKKwlpbnQgaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LCBpbmRleCk7CisKKwkvKiBPbmx5IGRlcmVmZXJlbmNlIHRoZSByZXNvdXJjZSBpZiBib3RoIHRoZQorCSAqIHJlc291cmNlIGFuZCB0aGUgaXJxIGFyZSB2YWxpZC4gKi8KKwlpZiAociAmJiBpcnEgIT0gTk9fSVJRKSB7CisJCXItPnN0YXJ0ID0gci0+ZW5kID0gaXJxOworCQlyLT5mbGFncyA9IElPUkVTT1VSQ0VfSVJROworCX0KKworCXJldHVybiBpcnE7Cit9CisKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfUE9XRVJQQ19QUk9NX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTY5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzMy5oCkBAIC0wLDAgKzEsNDYyIEBACisvKgorICogIFBTMyBwbGF0Zm9ybSBkZWNsYXJhdGlvbnMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWYgIWRlZmluZWQoX0FTTV9QT1dFUlBDX1BTM19IKQorI2RlZmluZSBfQVNNX1BPV0VSUENfUFMzX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+IC8qIGZvciBfX2RlcHJlY2F0ZWQgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyoqCisgKiBzdHJ1Y3QgcHMzX2RldmljZV9pZCAtIEhWIGJ1cyBkZXZpY2UgaWRlbnRpZmllciBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeQorICogQGJ1c19pZDogSFYgYnVzIGlkLCB7MS4ufSAoemVybyBpbnZhbGlkKQorICogQGRldl9pZDogSFYgZGV2aWNlIGlkLCB7MC4ufQorICovCisKK3N0cnVjdCBwczNfZGV2aWNlX2lkIHsKKwl1bnNpZ25lZCBpbnQgYnVzX2lkOworCXVuc2lnbmVkIGludCBkZXZfaWQ7Cit9OworCisKKy8qIGRtYSByb3V0aW5lcyAqLworCitlbnVtIHBzM19kbWFfcGFnZV9zaXplIHsKKwlQUzNfRE1BXzRLID0gMTJVLAorCVBTM19ETUFfNjRLID0gMTZVLAorCVBTM19ETUFfMU0gPSAyMFUsCisJUFMzX0RNQV8xNk0gPSAyNFUsCit9OworCitlbnVtIHBzM19kbWFfcmVnaW9uX3R5cGUgeworCVBTM19ETUFfT1RIRVIgPSAwLAorCVBTM19ETUFfSU5URVJOQUwgPSAyLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gLSBBIHBlciBkZXZpY2UgZG1hIHN0YXRlIHZhcmlhYmxlcyBzdHJ1Y3R1cmUKKyAqIEBkaWQ6IFRoZSBIViBkZXZpY2UgaWQuCisgKiBAcGFnZV9zaXplOiBUaGUgaW9jIHBhZ2VzaXplLgorICogQHJlZ2lvbl90eXBlOiBUaGUgSFYgcmVnaW9uIHR5cGUuCisgKiBAYnVzX2FkZHI6IFRoZSAndHJhbnNsYXRlZCcgYnVzIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbi4KKyAqIEBsZW46IFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbi4KKyAqIEBjaHVua19saXN0OiBPcGFxdWUgdmFyaWFibGUgdXNlZCBieSB0aGUgaW9jIHBhZ2UgbWFuYWdlci4KKyAqLworCitzdHJ1Y3QgcHMzX2RtYV9yZWdpb24geworCXN0cnVjdCBwczNfZGV2aWNlX2lkIGRpZDsKKwllbnVtIHBzM19kbWFfcGFnZV9zaXplIHBhZ2Vfc2l6ZTsKKwllbnVtIHBzM19kbWFfcmVnaW9uX3R5cGUgcmVnaW9uX3R5cGU7CisJdW5zaWduZWQgbG9uZyBidXNfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlzdHJ1Y3QgeworCQlzcGlubG9ja190IGxvY2s7CisJCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwl9IGNodW5rX2xpc3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9pbml0IC0gSGVscGVyIHRvIGluaXRpYWxpemUgc3RydWN0dXJlIHZhcmlhYmxlcworICoKKyAqIEhlbHBlciB0byBwcm9wZXJseSBpbml0aWFsaXplIHZhcmlhYmxlcyBwcmlvciB0byBjYWxsaW5nCisgKiBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBzM19kbWFfcmVnaW9uX2luaXQoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorCWNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkKiBkaWQsIGVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplLAorCWVudW0gcHMzX2RtYV9yZWdpb25fdHlwZSByZWdpb25fdHlwZSkKK3sKKwlyLT5kaWQgPSAqZGlkOworCXItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKKwlyLT5yZWdpb25fdHlwZSA9IHJlZ2lvbl90eXBlOworfQoraW50IHBzM19kbWFfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpOworaW50IHBzM19kbWFfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKTsKK2ludCBwczNfZG1hX21hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAorCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcik7CitpbnQgcHMzX2RtYV91bm1hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCisJdW5zaWduZWQgbG9uZyBsZW4pOworCisvKiBtbWlvIHJvdXRpbmVzICovCisKK2VudW0gcHMzX21taW9fcGFnZV9zaXplIHsKKwlQUzNfTU1JT180SyA9IDEyVSwKKwlQUzNfTU1JT182NEsgPSAxNlUKK307CisKKy8qKgorICogc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAtIGEgcGVyIGRldmljZSBtbWlvIHN0YXRlIHZhcmlhYmxlcyBzdHJ1Y3R1cmUKKyAqCisgKiBDdXJyZW50IHN5c3RlbXMgY2FuIGJlIHN1cHBvcnRlZCB3aXRoIGEgc2luZ2xlIHJlZ2lvbiBwZXIgZGV2aWNlLgorICovCisKK3N0cnVjdCBwczNfbW1pb19yZWdpb24geworCXN0cnVjdCBwczNfZGV2aWNlX2lkIGRpZDsKKwl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWVudW0gcHMzX21taW9fcGFnZV9zaXplIHBhZ2Vfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcjsKK307CisKKy8qKgorICogc3RydWN0IHBzM19tbWlvX3JlZ2lvbl9pbml0IC0gSGVscGVyIHRvIGluaXRpYWxpemUgc3RydWN0dXJlIHZhcmlhYmxlcworICoKKyAqIEhlbHBlciB0byBwcm9wZXJseSBpbml0aWFsaXplIHZhcmlhYmxlcyBwcmlvciB0byBjYWxsaW5nCisgKiBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBzM19tbWlvX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIsCisJY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQqIGRpZCwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbiwgZW51bSBwczNfbW1pb19wYWdlX3NpemUgcGFnZV9zaXplKQoreworCXItPmRpZCA9ICpkaWQ7CisJci0+YnVzX2FkZHIgPSBidXNfYWRkcjsKKwlyLT5sZW4gPSBsZW47CisJci0+cGFnZV9zaXplID0gcGFnZV9zaXplOworfQoraW50IHBzM19tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcik7CitpbnQgcHMzX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcik7Cit1bnNpZ25lZCBsb25nIHBzM19tbV9waHlzX3RvX2xwYXIodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpOworCisvKiBpbnJlcnJ1cHQgcm91dGluZXMgKi8KKworaW50IHBzM19hbGxvY19pb19pcnEodW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50ICp2aXJxKTsKK2ludCBwczNfZnJlZV9pb19pcnEodW5zaWduZWQgaW50IHZpcnEpOworaW50IHBzM19hbGxvY19ldmVudF9pcnEodW5zaWduZWQgaW50ICp2aXJxKTsKK2ludCBwczNfZnJlZV9ldmVudF9pcnEodW5zaWduZWQgaW50IHZpcnEpOworaW50IHBzM19zZW5kX2V2ZW50X2xvY2FsbHkodW5zaWduZWQgaW50IHZpcnEpOworaW50IHBzM19jb25uZWN0X2V2ZW50X2lycShjb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCAqZGlkLAorCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsIHVuc2lnbmVkIGludCAqdmlycSk7CitpbnQgcHMzX2Rpc2Nvbm5lY3RfZXZlbnRfaXJxKGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCisJdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50IHZpcnEpOworaW50IHBzM19hbGxvY192dWFydF9pcnEodm9pZCogdmlydF9hZGRyX2JtcCwgdW5zaWduZWQgaW50ICp2aXJxKTsKK2ludCBwczNfZnJlZV92dWFydF9pcnEodW5zaWduZWQgaW50IHZpcnEpOworaW50IHBzM19hbGxvY19zcGVfaXJxKHVuc2lnbmVkIGxvbmcgc3BlX2lkLCB1bnNpZ25lZCBpbnQgY2xhc3MsCisJdW5zaWduZWQgaW50ICp2aXJxKTsKK2ludCBwczNfZnJlZV9zcGVfaXJxKHVuc2lnbmVkIGludCB2aXJxKTsKKworLyogbHYxIHJlc3VsdCBjb2RlcyAqLworCitlbnVtIGx2MV9yZXN1bHQgeworCUxWMV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgPSAwLAorCS8qIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAtMSAqLworCUxWMV9SRVNPVVJDRV9TSE9SVEFHRSAgICAgICAgICAgPSAtMiwKKwlMVjFfTk9fUFJJVklMRUdFICAgICAgICAgICAgICAgID0gLTMsCisJTFYxX0RFTklFRF9CWV9QT0xJQ1kgICAgICAgICAgICA9IC00LAorCUxWMV9BQ0NFU1NfVklPTEFUSU9OICAgICAgICAgICAgPSAtNSwKKwlMVjFfTk9fRU5UUlkgICAgICAgICAgICAgICAgICAgID0gLTYsCisJTFYxX0RVUExJQ0FURV9FTlRSWSAgICAgICAgICAgICA9IC03LAorCUxWMV9UWVBFX01JU01BVENIICAgICAgICAgICAgICAgPSAtOCwKKwlMVjFfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgID0gLTksCisJTFYxX0VNUFRZICAgICAgICAgICAgICAgICAgICAgICA9IC0xMCwKKwlMVjFfV1JPTkdfU1RBVEUgICAgICAgICAgICAgICAgID0gLTExLAorCS8qIG5vdCB1c2VkICAgICAgICAgICAgICAgICAgICAgICAtMTIgKi8KKwlMVjFfTk9fTUFUQ0ggICAgICAgICAgICAgICAgICAgID0gLTEzLAorCUxWMV9BTFJFQURZX0NPTk5FQ1RFRCAgICAgICAgICAgPSAtMTQsCisJTFYxX1VOU1VQUE9SVEVEX1BBUkFNRVRFUl9WQUxVRSA9IC0xNSwKKwlMVjFfQ09ORElUSU9OX05PVF9TQVRJU0ZJRUQgICAgID0gLTE2LAorCUxWMV9JTExFR0FMX1BBUkFNRVRFUl9WQUxVRSAgICAgPSAtMTcsCisJTFYxX0JBRF9PUFRJT04gICAgICAgICAgICAgICAgICA9IC0xOCwKKwlMVjFfSU1QTEVNRU5UQVRJT05fTElNSVRBVElPTiAgID0gLTE5LAorCUxWMV9OT1RfSU1QTEVNRU5URUQgICAgICAgICAgICAgPSAtMjAsCisJTFYxX0lOVkFMSURfQ0xBU1NfSUQgICAgICAgICAgICA9IC0yMSwKKwlMVjFfQ09OU1RSQUlOVF9OT1RfU0FUSVNGSUVEICAgID0gLTIyLAorCUxWMV9BTElHTk1FTlRfRVJST1IgICAgICAgICAgICAgPSAtMjMsCisJTFYxX0lOVEVSTkFMX0VSUk9SICAgICAgICAgICAgICA9IC0zMjc2OCwKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogcHMzX3Jlc3VsdChpbnQgcmVzdWx0KQoreworI2lmIGRlZmluZWQoREVCVUcpCisJc3dpdGNoIChyZXN1bHQpIHsKKwljYXNlIExWMV9TVUNDRVNTOgorCQlyZXR1cm4gIkxWMV9TVUNDRVNTICgwKSI7CisJY2FzZSAtMToKKwkJcmV0dXJuICIqKiB1bmtub3duIHJlc3VsdCAqKiAoLTEpIjsKKwljYXNlIExWMV9SRVNPVVJDRV9TSE9SVEFHRToKKwkJcmV0dXJuICJMVjFfUkVTT1VSQ0VfU0hPUlRBR0UgKC0yKSI7CisJY2FzZSBMVjFfTk9fUFJJVklMRUdFOgorCQlyZXR1cm4gIkxWMV9OT19QUklWSUxFR0UgKC0zKSI7CisJY2FzZSBMVjFfREVOSUVEX0JZX1BPTElDWToKKwkJcmV0dXJuICJMVjFfREVOSUVEX0JZX1BPTElDWSAoLTQpIjsKKwljYXNlIExWMV9BQ0NFU1NfVklPTEFUSU9OOgorCQlyZXR1cm4gIkxWMV9BQ0NFU1NfVklPTEFUSU9OICgtNSkiOworCWNhc2UgTFYxX05PX0VOVFJZOgorCQlyZXR1cm4gIkxWMV9OT19FTlRSWSAoLTYpIjsKKwljYXNlIExWMV9EVVBMSUNBVEVfRU5UUlk6CisJCXJldHVybiAiTFYxX0RVUExJQ0FURV9FTlRSWSAoLTcpIjsKKwljYXNlIExWMV9UWVBFX01JU01BVENIOgorCQlyZXR1cm4gIkxWMV9UWVBFX01JU01BVENIICgtOCkiOworCWNhc2UgTFYxX0JVU1k6CisJCXJldHVybiAiTFYxX0JVU1kgKC05KSI7CisJY2FzZSBMVjFfRU1QVFk6CisJCXJldHVybiAiTFYxX0VNUFRZICgtMTApIjsKKwljYXNlIExWMV9XUk9OR19TVEFURToKKwkJcmV0dXJuICJMVjFfV1JPTkdfU1RBVEUgKC0xMSkiOworCWNhc2UgLTEyOgorCQlyZXR1cm4gIioqIHVua25vd24gcmVzdWx0ICoqICgtMTIpIjsKKwljYXNlIExWMV9OT19NQVRDSDoKKwkJcmV0dXJuICJMVjFfTk9fTUFUQ0ggKC0xMykiOworCWNhc2UgTFYxX0FMUkVBRFlfQ09OTkVDVEVEOgorCQlyZXR1cm4gIkxWMV9BTFJFQURZX0NPTk5FQ1RFRCAoLTE0KSI7CisJY2FzZSBMVjFfVU5TVVBQT1JURURfUEFSQU1FVEVSX1ZBTFVFOgorCQlyZXR1cm4gIkxWMV9VTlNVUFBPUlRFRF9QQVJBTUVURVJfVkFMVUUgKC0xNSkiOworCWNhc2UgTFYxX0NPTkRJVElPTl9OT1RfU0FUSVNGSUVEOgorCQlyZXR1cm4gIkxWMV9DT05ESVRJT05fTk9UX1NBVElTRklFRCAoLTE2KSI7CisJY2FzZSBMVjFfSUxMRUdBTF9QQVJBTUVURVJfVkFMVUU6CisJCXJldHVybiAiTFYxX0lMTEVHQUxfUEFSQU1FVEVSX1ZBTFVFICgtMTcpIjsKKwljYXNlIExWMV9CQURfT1BUSU9OOgorCQlyZXR1cm4gIkxWMV9CQURfT1BUSU9OICgtMTgpIjsKKwljYXNlIExWMV9JTVBMRU1FTlRBVElPTl9MSU1JVEFUSU9OOgorCQlyZXR1cm4gIkxWMV9JTVBMRU1FTlRBVElPTl9MSU1JVEFUSU9OICgtMTkpIjsKKwljYXNlIExWMV9OT1RfSU1QTEVNRU5URUQ6CisJCXJldHVybiAiTFYxX05PVF9JTVBMRU1FTlRFRCAoLTIwKSI7CisJY2FzZSBMVjFfSU5WQUxJRF9DTEFTU19JRDoKKwkJcmV0dXJuICJMVjFfSU5WQUxJRF9DTEFTU19JRCAoLTIxKSI7CisJY2FzZSBMVjFfQ09OU1RSQUlOVF9OT1RfU0FUSVNGSUVEOgorCQlyZXR1cm4gIkxWMV9DT05TVFJBSU5UX05PVF9TQVRJU0ZJRUQgKC0yMikiOworCWNhc2UgTFYxX0FMSUdOTUVOVF9FUlJPUjoKKwkJcmV0dXJuICJMVjFfQUxJR05NRU5UX0VSUk9SICgtMjMpIjsKKwljYXNlIExWMV9JTlRFUk5BTF9FUlJPUjoKKwkJcmV0dXJuICJMVjFfSU5URVJOQUxfRVJST1IgKC0zMjc2OCkiOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gIioqIHVua25vd24gcmVzdWx0ICoqIjsKKwl9OworI2Vsc2UKKwlyZXR1cm4gIiI7CisjZW5kaWYKK30KKworLyogcmVwb3NpdG9yeSBidXMgaW5mbyAqLworCitlbnVtIHBzM19idXNfdHlwZSB7CisJUFMzX0JVU19UWVBFX1NCID0gNCwKKwlQUzNfQlVTX1RZUEVfU1RPUkFHRSA9IDUsCit9OworCitlbnVtIHBzM19kZXZfdHlwZSB7CisJUFMzX0RFVl9UWVBFX1NCX0dFTElDID0gMywKKwlQUzNfREVWX1RZUEVfU0JfVVNCID0gNCwKKwlQUzNfREVWX1RZUEVfU0JfR1BJTyA9IDYsCit9OworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfc3RyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIGNvbnN0IGNoYXIgKmJ1c19zdHIsCisJdTY0ICp2YWx1ZSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQodW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50ICpidXNfaWQpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwllbnVtIHBzM19idXNfdHlwZSAqYnVzX3R5cGUpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgKm51bV9kZXYpOworCisvKiByZXBvc2l0b3J5IGJ1cyBkZXZpY2UgaW5mbyAqLworCitlbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSB7CisJUFMzX0lOVEVSUlVQVF9UWVBFX0VWRU5UX1BPUlQgPSAyLAorCVBTM19JTlRFUlJVUFRfVFlQRV9TQl9PSENJID0gMywKKwlQUzNfSU5URVJSVVBUX1RZUEVfU0JfRUhDSSA9IDQsCisJUFMzX0lOVEVSUlVQVF9UWVBFX09USEVSID0gNSwKK307CisKK2VudW0gcHMzX3JlZ2lvbl90eXBlIHsKKwlQUzNfUkVHSU9OX1RZUEVfU0JfT0hDSSA9IDMsCisJUFMzX1JFR0lPTl9UWVBFX1NCX0VIQ0kgPSA0LAorCVBTM19SRUdJT05fVFlQRV9TQl9HUElPID0gNSwKK307CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9zdHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCBjb25zdCBjaGFyICpkZXZfc3RyLCB1NjQgKnZhbHVlKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LCB1bnNpZ25lZCBpbnQgZGV2X2luZGV4LAorCXVuc2lnbmVkIGludCAqZGV2X2lkKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgZW51bSBwczNfZGV2X3R5cGUgKmRldl90eXBlKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdW5zaWduZWQgaW50IGludHJfaW5kZXgsCisJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgKmludHJfdHlwZSwgdW5zaWduZWQgaW50ICppbnRlcnJ1cHRfaWQpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ190eXBlKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdW5zaWduZWQgaW50IHJlZ19pbmRleCwKKwllbnVtIHBzM19yZWdpb25fdHlwZSAqcmVnX3R5cGUpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ19hZGRyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdW5zaWduZWQgaW50IHJlZ19pbmRleCwgdTY0ICpidXNfYWRkciwKKwl1NjQgKmxlbik7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdW5zaWduZWQgaW50IHJlZ19pbmRleCwKKwllbnVtIHBzM19yZWdpb25fdHlwZSAqcmVnX3R5cGUsIHU2NCAqYnVzX2FkZHIsIHU2NCAqbGVuKTsKKworLyogcmVwb3NpdG9yeSBidXMgZW51bWVyYXRvcnMgKi8KKworc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSB7CisJdW5zaWduZWQgaW50IGJ1c19pbmRleDsKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4OworCXN0cnVjdCBwczNfZGV2aWNlX2lkIGRpZDsKK307CisKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZShlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKKwllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpzdGFydF9kZXYsCisJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbmxpbmUgaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZmlyc3RfZGV2aWNlKAorCWVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLCBlbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKGJ1c190eXBlLCBkZXZfdHlwZSwgTlVMTCwgZGV2KTsKK30KK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCisJZW51bSBwczNfaW50ZXJydXB0X3R5cGUgaW50cl90eXBlLCB1bnNpZ25lZCBpbnQgKmludGVycnVwdF9pZCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWdpb24oY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2LAorCWVudW0gcHMzX3JlZ2lvbl90eXBlIHJlZ190eXBlLCB1NjQgKmJ1c19hZGRyLCB1NjQgKmxlbik7CisKKy8qIHJlcG9zaXRvcnkgYmxvY2sgZGV2aWNlIGluZm8gKi8KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3BvcnQodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1NjQgKnBvcnQpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2Jsa19zaXplKHVuc2lnbmVkIGludCBidXNfaW5kZXgsCisJdW5zaWduZWQgaW50IGRldl9pbmRleCwgdTY0ICpibGtfc2l6ZSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfbnVtX2Jsb2Nrcyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHU2NCAqbnVtX2Jsb2Nrcyk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfbnVtX3JlZ2lvbnModW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgKm51bV9yZWdpb25zKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWdpb25faWQodW5zaWduZWQgaW50IGJ1c19pbmRleCwKKwl1bnNpZ25lZCBpbnQgZGV2X2luZGV4LCB1bnNpZ25lZCBpbnQgcmVnaW9uX2luZGV4LAorCXVuc2lnbmVkIGludCAqcmVnaW9uX2lkKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWdpb25fc2l6ZSh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsCXVuc2lnbmVkIGludCByZWdpb25faW5kZXgsIHU2NCAqcmVnaW9uX3NpemUpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZ2lvbl9zdGFydCh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAorCXVuc2lnbmVkIGludCBkZXZfaW5kZXgsIHVuc2lnbmVkIGludCByZWdpb25faW5kZXgsIHU2NCAqcmVnaW9uX3N0YXJ0KTsKKworLyogcmVwb3NpdG9yeSBwdSBhbmQgbWVtb3J5IGluZm8gKi8KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfbnVtX3B1KHVuc2lnbmVkIGludCAqbnVtX3B1KTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3BwZV9pZCh1bnNpZ25lZCBpbnQgKnB1X2luZGV4LCB1bnNpZ25lZCBpbnQgKnBwZV9pZCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9ybV9iYXNlKHVuc2lnbmVkIGludCBwcGVfaWQsIHU2NCAqcm1fYmFzZSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9ybV9zaXplKHVuc2lnbmVkIGludCBwcGVfaWQsIHU2NCAqcm1fc2l6ZSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9yZWdpb25fdG90YWwodTY0ICpyZWdpb25fdG90YWwpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfbW1faW5mbyh1NjQgKnJtX2Jhc2UsIHU2NCAqcm1fc2l6ZSwKKwl1NjQgKnJlZ2lvbl90b3RhbCk7CisKKy8qIHJlcG9zaXRvcnkgcG1lIGluZm8gKi8KKworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfbnVtX2JlKHVuc2lnbmVkIGludCAqbnVtX2JlKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2JlX25vZGVfaWQodW5zaWduZWQgaW50IGJlX2luZGV4LCB1NjQgKm5vZGVfaWQpOworaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfdGJfZnJlcSh1NjQgbm9kZV9pZCwgdTY0ICp0Yl9mcmVxKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2JlX3RiX2ZyZXEodW5zaWduZWQgaW50IGJlX2luZGV4LCB1NjQgKnRiX2ZyZXEpOworCisvKiByZXBvc2l0b3J5ICdPdGhlciBPUycgYXJlYSAqLworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9hZGRyKHU2NCAqbHBhcl9hZGRyKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X3NpemUodW5zaWduZWQgaW50ICpzaXplKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX2Jvb3RfZGF0X2luZm8odTY0ICpscGFyX2FkZHIsIHVuc2lnbmVkIGludCAqc2l6ZSk7CisKKy8qIHJlcG9zaXRvcnkgc3B1IGluZm8gKi8KKworLyoqCisgKiBlbnVtIHNwdV9yZXNvdXJjZV90eXBlIC0gVHlwZSBvZiBzcHUgcmVzb3VyY2UuCisgKiBAc3B1X3Jlc291cmNlX3R5cGVfc2hhcmVkOiBMb2dpY2FsIHNwdSBpcyBzaGFyZWQgd2l0aCBvdGhlciBwYXJ0aW9ucy4KKyAqIEBzcHVfcmVzb3VyY2VfdHlwZV9leGNsdXNpdmU6IExvZ2ljYWwgc3B1IGlzIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBwYXJ0aW9ucy4KKyAqCisgKiBSZXR1cm5lZCBieSBwczNfcmVwb3NpdG9yeV9yZWFkX3NwdV9yZXNvdXJjZV9pZCgpLgorICovCisKK2VudW0gcHMzX3NwdV9yZXNvdXJjZV90eXBlIHsKKwlQUzNfU1BVX1JFU09VUkNFX1RZUEVfU0hBUkVEID0gMCwKKwlQUzNfU1BVX1JFU09VUkNFX1RZUEVfRVhDTFVTSVZFID0gMHg4MDAwMDAwMDAwMDAwMDAwVUwsCit9OworCitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fc3B1X3Jlc2VydmVkKHVuc2lnbmVkIGludCAqbnVtX3NwdV9yZXNlcnZlZCk7CitpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9udW1fc3B1X3Jlc291cmNlX2lkKHVuc2lnbmVkIGludCAqbnVtX3Jlc291cmNlX2lkKTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3NwdV9yZXNvdXJjZV9pZCh1bnNpZ25lZCBpbnQgcmVzX2luZGV4LAorCWVudW0gcHMzX3NwdV9yZXNvdXJjZV90eXBlKiByZXNvdXJjZV90eXBlLCB1bnNpZ25lZCBpbnQgKnJlc291cmNlX2lkKTsKKworCisvKiBzeXN0ZW0gYnVzIHJvdXRpbmVzICovCisKK2VudW0gcHMzX21hdGNoX2lkIHsKKwlQUzNfTUFUQ0hfSURfRUhDSSA9IDEsCisJUFMzX01BVENIX0lEX09IQ0ksCisJUFMzX01BVENIX0lEX0dFTElDLAorCVBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUywKKwlQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVIsCit9OworCisvKioKKyAqIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgLSBhIGRldmljZSBvbiB0aGUgc3lzdGVtIGJ1cworICovCisKK3N0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgeworCWVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkOworCXN0cnVjdCBwczNfZGV2aWNlX2lkIGRpZDsKKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0X2lkOworLyoJc3RydWN0IGlvbW11X3RhYmxlICppb21tdV90YWJsZTsgLS0gd2FpdGluZyBmb3IgQmVuJ3MgY2xlYW51cHMgKi8KKwlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKmRfcmVnaW9uOworCXN0cnVjdCBwczNfbW1pb19yZWdpb24gKm1fcmVnaW9uOworCXN0cnVjdCBkZXZpY2UgY29yZTsKK307CisKKy8qKgorICogc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAtIGEgZHJpdmVyIGZvciBhIGRldmljZSBvbiB0aGUgc3lzdGVtIGJ1cworICovCisKK3N0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgeworCWVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGNvcmU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOworLyoJaW50ICgqc3VzcGVuZCkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqLCBwbV9tZXNzYWdlX3QpOyAqLworLyoJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOyAqLworfTsKKworaW50IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOworaW50IHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpOwordm9pZCBwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICp0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoCisJc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihfZHJ2LCBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyLCBjb3JlKTsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKAorCXN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlLCBjb3JlKTsKK30KKworLyoqCisgKiBwczNfc3lzdGVtX2J1c19zZXRfZHJ2ZGF0YSAtCisgKiBAZGV2OiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZGF0YTogRGF0YSB0byBzZXQKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcHMzX3N5c3RlbV9idXNfc2V0X2RyaXZlcl9kYXRhKAorCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlkZXYtPmNvcmUuZHJpdmVyX2RhdGEgPSBkYXRhOworfQorc3RhdGljIGlubGluZSB2b2lkICpwczNfc3lzdGVtX2J1c19nZXRfZHJpdmVyX2RhdGEoCisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPmNvcmUuZHJpdmVyX2RhdGE7Cit9CisKKy8qIFRoZXNlIHR3byBuZWVkIGdsb2JhbCBzY29wZSBmb3IgZ2V0X2RtYV9vcHMoKS4gKi8KKworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBwczNfc3lzdGVtX2J1c190eXBlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCmluZGV4IDhmYjk2ODEuLmEzNjMxYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaApAQCAtMTQzLDYgKzE0Myw3IEBACiAKIC8qIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlcnMgKFNQUk5zKSovCiAjZGVmaW5lIFNQUk5fQ1RSCTB4MDA5CS8qIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFNQUk5fRFNDUgkweDExCiAjZGVmaW5lIFNQUk5fQ1RSTEYJMHgwODgKICNkZWZpbmUgU1BSTl9DVFJMVAkweDA5OAogI2RlZmluZSAgIENUUkxfQ1QJMHhjMDAwMDAwMAkvKiBjdXJyZW50IHRocmVhZCAqLwpAQCAtMTYzLDYgKzE2NCw3IEBACiAjZGVmaW5lIFNQUk5fVEJSVQkweDEwRAkvKiBUaW1lIEJhc2UgUmVhZCBVcHBlciBSZWdpc3RlciAodXNlciwgUi9PKSAqLwogI2RlZmluZSBTUFJOX1RCV0wJMHgxMUMJLyogVGltZSBCYXNlIExvd2VyIFJlZ2lzdGVyIChzdXBlciwgUi9XKSAqLwogI2RlZmluZSBTUFJOX1RCV1UJMHgxMUQJLyogVGltZSBCYXNlIFVwcGVyIFJlZ2lzdGVyIChzdXBlciwgUi9XKSAqLworI2RlZmluZSBTUFJOX1NQVVJSCTB4MTM0CS8qIFNjYWxlZCBQVVJSICovCiAjZGVmaW5lIFNQUk5fSElPUgkweDEzNwkvKiA5NzAgSHlwZXJ2aXNvciBpbnRlcnJ1cHQgb2Zmc2V0ICovCiAjZGVmaW5lIFNQUk5fREJBVDBMCTB4MjE5CS8qIERhdGEgQkFUIDAgTG93ZXIgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9EQkFUMFUJMHgyMTgJLyogRGF0YSBCQVQgMCBVcHBlciBSZWdpc3RlciAqLwpAQCAtNTkxLDYgKzU5Myw3IEBACiAjZGVmaW5lIFBWXzYzMAkJMHgwMDQwCiAjZGVmaW5lIFBWXzYzMHAJMHgwMDQxCiAjZGVmaW5lIFBWXzk3ME1QCTB4MDA0NAorI2RlZmluZSBQVl85NzBHWAkweDAwNDUKICNkZWZpbmUgUFZfQkUJCTB4MDA3MAogI2RlZmluZSBQVl9QQTZUCQkweDAwOTAKIApAQCAtNjE4LDEwICs2MjEsMzUgQEAKIAkJCQk6ICI9ciIgKHJ2YWwpKTsgcnZhbDt9KQogI2RlZmluZSBtdHNwcihybiwgdikJYXNtIHZvbGF0aWxlKCJtdHNwciAiIF9fc3RyaW5naWZ5KHJuKSAiLCUwIiA6IDogInIiICh2KSkKIAorI2lmZGVmIF9fcG93ZXJwYzY0X18KKyNpZmRlZiBDT05GSUdfUFBDX0NFTEwKKyNkZWZpbmUgbWZ0YigpCQkoe3Vuc2lnbmVkIGxvbmcgcnZhbDsJCQkJXAorCQkJYXNtIHZvbGF0aWxlKAkJCQkJXAorCQkJCSI5MDoJbWZ0YiAlMDtcbiIJCQlcCisJCQkJIjk3OgljbXB3aSAlMCwwO1xuIgkJCVwKKwkJCQkiCWJlcS0gOTBiO1xuIgkJCVwKKwkJCQkiOTk6XG4iCQkJCQlcCisJCQkJIi5zZWN0aW9uIF9fZnRyX2ZpeHVwLFwiYVwiXG4iCQlcCisJCQkJIi5hbGlnbiAzXG4iCQkJCVwKKwkJCQkiOTg6XG4iCQkJCQlcCisJCQkJIgkubGxvbmcgJTFcbiIJCQlcCisJCQkJIgkubGxvbmcgJTFcbiIJCQlcCisJCQkJIgkubGxvbmcgOTdiLTk4YlxuIgkJXAorCQkJCSIJLmxsb25nIDk5Yi05OGJcbiIJCVwKKwkJCQkiLnByZXZpb3VzIgkJCQlcCisJCQk6ICI9ciIgKHJ2YWwpIDogImkiIChDUFVfRlRSX0NFTExfVEJfQlVHKSk7IHJ2YWw7fSkKKyNlbHNlCiAjZGVmaW5lIG1mdGIoKQkJKHt1bnNpZ25lZCBsb25nIHJ2YWw7CVwKIAkJCWFzbSB2b2xhdGlsZSgibWZ0YiAlMCIgOiAiPXIiIChydmFsKSk7IHJ2YWw7fSkKKyNlbmRpZiAvKiAhQ09ORklHX1BQQ19DRUxMICovCisKKyNlbHNlIC8qIF9fcG93ZXJwYzY0X18gKi8KKwogI2RlZmluZSBtZnRibCgpCQkoe3Vuc2lnbmVkIGxvbmcgcnZhbDsJXAogCQkJYXNtIHZvbGF0aWxlKCJtZnRibCAlMCIgOiAiPXIiIChydmFsKSk7IHJ2YWw7fSkKKyNkZWZpbmUgbWZ0YnUoKQkJKHt1bnNpZ25lZCBsb25nIHJ2YWw7CVwKKwkJCWFzbSB2b2xhdGlsZSgibWZ0YnUgJTAiIDogIj1yIiAocnZhbCkpOyBydmFsO30pCisjZW5kaWYgLyogIV9fcG93ZXJwYzY0X18gKi8KIAogI2RlZmluZSBtdHRibCh2KQlhc20gdm9sYXRpbGUoIm10dGJsICUwIjo6ICJyIih2KSkKICNkZWZpbmUgbXR0YnUodikJYXNtIHZvbGF0aWxlKCJtdHRidSAlMCI6OiAiciIodikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3J0YXMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcnRhcy5oCmluZGV4IGQzNGY5ZTEuLjhlYWE3YjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcnRhcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcnRhcy5oCkBAIC01NCw4ICs1NCw2IEBACiAJcnRhc19hcmdfdCAqcmV0czsgICAgIC8qIFBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlcyBpbiBhcmdzW10uICovCiB9OyAgCiAKLWV4dGVybiBzdHJ1Y3QgcnRhc19hcmdzIHJ0YXNfc3RvcF9zZWxmX2FyZ3M7Ci0KIHN0cnVjdCBydGFzX3QgewogCXVuc2lnbmVkIGxvbmcgZW50cnk7CQkvKiBwaHlzaWNhbCBhZGRyZXNzIHBvaW50ZXIgKi8KIAl1bnNpZ25lZCBsb25nIGJhc2U7CQkvKiBwaHlzaWNhbCBhZGRyZXNzIHBvaW50ZXIgKi8KQEAgLTE2MSw2ICsxNTksNyBAQAogCiBleHRlcm4gdm9pZCBlbnRlcl9ydGFzKHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBydGFzX3Rva2VuKGNvbnN0IGNoYXIgKnNlcnZpY2UpOworZXh0ZXJuIGludCBydGFzX3NlcnZpY2VfcHJlc2VudChjb25zdCBjaGFyICpzZXJ2aWNlKTsKIGV4dGVybiBpbnQgcnRhc19jYWxsKGludCB0b2tlbiwgaW50LCBpbnQsIGludCAqLCAuLi4pOwogZXh0ZXJuIHZvaWQgcnRhc19yZXN0YXJ0KGNoYXIgKmNtZCk7CiBleHRlcm4gdm9pZCBydGFzX3Bvd2VyX29mZih2b2lkKTsKQEAgLTIyMyw4ICsyMjIsNiBAQAogZXh0ZXJuIHNwaW5sb2NrX3QgcnRhc19kYXRhX2J1Zl9sb2NrOwogZXh0ZXJuIGNoYXIgcnRhc19kYXRhX2J1ZltSVEFTX0RBVEFfQlVGX1NJWkVdOwogCi1leHRlcm4gdm9pZCBydGFzX3N0b3Bfc2VsZih2b2lkKTsKLQogLyogUk1PIGJ1ZmZlciByZXNlcnZlZCBmb3IgdXNlci1zcGFjZSBSVEFTIHVzZSAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcnRhc19ybW9fYnVmOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NldHVwLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NldHVwLmgKaW5kZXggM2Q5NzQwYS4uODE3ZmFjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zZXR1cC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc2V0dXAuaApAQCAtMSw5ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX1NFVFVQX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1NFVFVQX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KLQogI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRQk1MTIKIAotI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfQVNNX1BPV0VSUENfU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGFyc2VtZW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3BhcnNlbWVtLmgKaW5kZXggMzhiMWVhMy4uNDhhZDgwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcGFyc2VtZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwYXJzZW1lbS5oCkBAIC05LDggKzksMTQgQEAKICAqIE1BWF9QSFlTTUVNX0JJVFMJCTJeTjogaG93IG11Y2ggbWVtb3J5IHdlIGNhbiBoYXZlIGluIHRoYXQgc3BhY2UKICAqLwogI2RlZmluZSBTRUNUSU9OX1NJWkVfQklUUyAgICAgICAyNAorCisjaWYgZGVmaW5lZChDT05GSUdfUFMzX1VTRV9MUEFSX0FERFIpCisjZGVmaW5lIE1BWF9QSFlTQUREUl9CSVRTICAgICAgIDQ3CisjZGVmaW5lIE1BWF9QSFlTTUVNX0JJVFMgICAgICAgIDQ3CisjZWxzZQogI2RlZmluZSBNQVhfUEhZU0FERFJfQklUUyAgICAgICA0NAogI2RlZmluZSBNQVhfUEhZU01FTV9CSVRTICAgICAgICA0NAorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKIGV4dGVybiB2b2lkIGNyZWF0ZV9zZWN0aW9uX21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKaW5kZXggZTczZWEwMC4uZmRhZDQyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oCkBAIC0xMTEsMTQgKzExMSwxMiBAQAogCXU4ICpsb2NhbF9zdG9yZTsKIAl1bnNpZ25lZCBsb25nIHByb2JsZW1fcGh5czsKIAlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYmxlbTsKLQlzdHJ1Y3Qgc3B1X3ByaXYxIF9faW9tZW0gKnByaXYxOwogCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjI7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgc2NoZWRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZ1bGxfbGlzdDsKIAlpbnQgbnVtYmVyOwotCWludCBuaWQ7CiAJdW5zaWduZWQgaW50IGlycXNbM107Ci0JdTMyIGlzcmM7CiAJdTMyIG5vZGU7CiAJdTY0IGZsYWdzOwogCXU2NCBkYXI7CkBAIC0xNDQsNiArMTQyLDcgQEAKIAljaGFyIGlycV9jMVs4XTsKIAljaGFyIGlycV9jMls4XTsKIAorCXZvaWQqIHBkYXRhOyAvKiBwbGF0Zm9ybSBwcml2YXRlIGRhdGEgKi8KIAlzdHJ1Y3Qgc3lzX2RldmljZSBzeXNkZXY7CiB9OwogCkBAIC0xNzAsNiArMTY5LDEzIEBACiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9IHNwdWZzX2NhbGxzOwogCisvKiBjb3JlZHVtcCBjYWxscyBpbXBsZW1lbnRlZCBpbiBzcHVmcyAqLworc3RydWN0IHNwdV9jb3JlZHVtcF9jYWxscyB7CisJYXNtbGlua2FnZSBpbnQgKCphcmNoX25vdGVzX3NpemUpKHZvaWQpOworCWFzbWxpbmthZ2Ugdm9pZCAoKmFyY2hfd3JpdGVfbm90ZXMpKHN0cnVjdCBmaWxlICpmaWxlKTsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKK307CisKIC8qIHJldHVybiBzdGF0dXMgZnJvbSBzcHVfcnVuLCBzYW1lIGFzIGluIGxpYnNwZSAqLwogI2RlZmluZSBTUEVfRVZFTlRfRE1BX0FMSUdOTUVOVAkJMHgwMDA4CS8qQSBETUEgYWxpZ25tZW50IGVycm9yICovCiAjZGVmaW5lIFNQRV9FVkVOVF9TUEVfRVJST1IJCTB4MDAxMAkvKkFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZXJyb3IqLwpAQCAtMTgyLDggKzE4OCwxMCBAQAogICovCiAjZGVmaW5lIFNQVV9DUkVBVEVfRVZFTlRTX0VOQUJMRUQJMHgwMDAxCiAjZGVmaW5lIFNQVV9DUkVBVEVfR0FORwkJCTB4MDAwMgorI2RlZmluZSBTUFVfQ1JFQVRFX05PU0NIRUQJCTB4MDAwNAorI2RlZmluZSBTUFVfQ1JFQVRFX0lTT0xBVEUJCTB4MDAwOAogCi0jZGVmaW5lIFNQVV9DUkVBVEVfRkxBR19BTEwJCTB4MDAwMyAvKiBtYXNrIG9mIGFsbCB2YWxpZCBmbGFncyAqLworI2RlZmluZSBTUFVfQ1JFQVRFX0ZMQUdfQUxMCQkweDAwMGYgLyogbWFzayBvZiBhbGwgdmFsaWQgZmxhZ3MgKi8KIAogCiAjaWZkZWYgQ09ORklHX1NQVV9GU19NT0RVTEUKQEAgLTE5OSw2ICsyMDcsMTUgQEAKIH0KICNlbmRpZiAvKiBNT0RVTEUgKi8KIAoraW50IHJlZ2lzdGVyX2FyY2hfY29yZWR1bXBfY2FsbHMoc3RydWN0IHNwdV9jb3JlZHVtcF9jYWxscyAqY2FsbHMpOwordm9pZCB1bnJlZ2lzdGVyX2FyY2hfY29yZWR1bXBfY2FsbHMoc3RydWN0IHNwdV9jb3JlZHVtcF9jYWxscyAqY2FsbHMpOworCitpbnQgc3B1X2FkZF9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cik7Cit2b2lkIHNwdV9yZW1vdmVfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpOworCitpbnQgc3B1X2FkZF9zeXNkZXZfYXR0cl9ncm91cChzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRycyk7Cit2b2lkIHNwdV9yZW1vdmVfc3lzZGV2X2F0dHJfZ3JvdXAoc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cnMpOworCiAKIC8qCiAgKiBOb3RpZmllciBibG9ja3M6CkBAIC0yNzcsNiArMjk0LDcgQEAKIAl1MzIgc3B1X3J1bmNudGxfUlc7CQkJCQkvKiAweDQwMWMgKi8KICNkZWZpbmUgU1BVX1JVTkNOVExfU1RPUAkwTAogI2RlZmluZSBTUFVfUlVOQ05UTF9SVU5OQUJMRQkxTAorI2RlZmluZSBTUFVfUlVOQ05UTF9JU09MQVRFCTJMCiAJdTggIHBhZF8weDQwMjBfMHg0MDI0WzB4NF07CQkJCS8qIDB4NDAyMCAqLwogCXUzMiBzcHVfc3RhdHVzX1I7CQkJCQkvKiAweDQwMjQgKi8KICNkZWZpbmUgU1BVX1NUT1BfU1RBVFVTX1NISUZUICAgICAgICAgICAxNgpAQCAtMjg5LDggKzMwNyw4IEBACiAjZGVmaW5lIFNQVV9TVEFUVVNfSU5WQUxJRF9JTlNUUiAgICAgICAgMHgyMAogI2RlZmluZSBTUFVfU1RBVFVTX0lOVkFMSURfQ0ggICAgICAgICAgIDB4NDAKICNkZWZpbmUgU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSAgICAgICAweDgwCi0jZGVmaW5lIFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFVVFVTIDB4MjAwCi0jZGVmaW5lIFNQVV9TVEFUVVNfSVNPTEFURURfRVhJVF9TVEFVVFVTIDB4NDAwCisjZGVmaW5lIFNQVV9TVEFUVVNfSVNPTEFURURfTE9BRF9TVEFUVVMgMHgyMDAKKyNkZWZpbmUgU1BVX1NUQVRVU19JU09MQVRFRF9FWElUX1NUQVRVUyAweDQwMAogCXU4ICBwYWRfMHg0MDI4XzB4NDAyY1sweDRdOwkJCQkvKiAweDQwMjggKi8KIAl1MzIgc3B1X3NwZV9SOwkJCQkJCS8qIDB4NDAyYyAqLwogCXU4ICBwYWRfMHg0MDMwXzB4NDAzNFsweDRdOwkJCQkvKiAweDQwMzAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X2NzYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKaW5kZXggOTY0YzJkMy4uYmRiZjkwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKQEAgLTE1MSw3ICsxNTEsNiBAQAogCXU2NCBtZmNfZmlyX2Noa3N0cF9lbmFibGVfUlc7CiAJdTY0IHNtZl9zYmlfc2lnbmFsX3NlbDsKIAl1NjQgc21mX2F0b19zaWduYWxfc2VsOwotCXU2NCBtZmNfc2RyX1JXOwogCXU2NCB0bGJfaW5kZXhfaGludF9STzsKIAl1NjQgdGxiX2luZGV4X1c7CiAJdTY0IHRsYl92cG5fUlc7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9pbmZvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0NWVmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X2luZm8uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogU1BVIGluZm8gc3RydWN0dXJlcworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBJQk0gQ29ycC4KKyAqCisgKiBBdXRob3I6IER3YXluZSBHcmFudCBNY0Nvbm5lbGwgPGRlY2ltYWxAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX1NQVV9JTkZPX0gKKyNkZWZpbmUgX1NQVV9JTkZPX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbHNlCitzdHJ1Y3QgbWZjX2NxX3NyIHsKKwlfX3U2NCBtZmNfY3FfZGF0YTBfUlc7CisJX191NjQgbWZjX2NxX2RhdGExX1JXOworCV9fdTY0IG1mY19jcV9kYXRhMl9SVzsKKwlfX3U2NCBtZmNfY3FfZGF0YTNfUlc7Cit9OworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworc3RydWN0IHNwdV9kbWFfaW5mbyB7CisJX191NjQgZG1hX2luZm9fdHlwZTsKKwlfX3U2NCBkbWFfaW5mb19tYXNrOworCV9fdTY0IGRtYV9pbmZvX3N0YXR1czsKKwlfX3U2NCBkbWFfaW5mb19zdGFsbF9hbmRfbm90aWZ5OworCV9fdTY0IGRtYV9pbmZvX2F0b21pY19jb21tYW5kX3N0YXR1czsKKwlzdHJ1Y3QgbWZjX2NxX3NyIGRtYV9pbmZvX2NvbW1hbmRfZGF0YVsxNl07Cit9OworCitzdHJ1Y3Qgc3B1X3Byb3h5ZG1hX2luZm8geworCV9fdTY0IHByb3h5ZG1hX2luZm9fdHlwZTsKKwlfX3U2NCBwcm94eWRtYV9pbmZvX21hc2s7CisJX191NjQgcHJveHlkbWFfaW5mb19zdGF0dXM7CisJc3RydWN0IG1mY19jcV9zciBwcm94eWRtYV9pbmZvX2NvbW1hbmRfZGF0YVs4XTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfcHJpdjEuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X3ByaXYxLmgKaW5kZXggMzAwYzQ1OC4uNjlkY2IwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfcHJpdjEuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdV9wcml2MS5oCkBAIC0yMSwxMiArMjEsMTMgQEAKICNkZWZpbmUgX1NQVV9QUklWMV9ICiAjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogc3RydWN0IHNwdTsKIAogLyogYWNjZXNzIHRvIHByaXYxIHJlZ2lzdGVycyAqLwogCi1zdHJ1Y3Qgc3B1X3ByaXYxX29wcwoteworc3RydWN0IHNwdV9wcml2MV9vcHMgewogCXZvaWQgKCppbnRfbWFza19hbmQpIChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spOwogCXZvaWQgKCppbnRfbWFza19vcikgKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzayk7CiAJdm9pZCAoKmludF9tYXNrX3NldCkgKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzayk7CkBAIC0zNyw3ICszOCw3IEBACiAJdTY0ICgqbWZjX2Rhcl9nZXQpIChzdHJ1Y3Qgc3B1ICpzcHUpOwogCXU2NCAoKm1mY19kc2lzcl9nZXQpIChzdHJ1Y3Qgc3B1ICpzcHUpOwogCXZvaWQgKCptZmNfZHNpc3Jfc2V0KSAoc3RydWN0IHNwdSAqc3B1LCB1NjQgZHNpc3IpOwotCXZvaWQgKCptZmNfc2RyX3NldCkgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNkcik7CisJdm9pZCAoKm1mY19zZHJfc2V0dXApIChzdHJ1Y3Qgc3B1ICpzcHUpOwogCXZvaWQgKCptZmNfc3IxX3NldCkgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNyMSk7CiAJdTY0ICgqbWZjX3NyMV9nZXQpIChzdHJ1Y3Qgc3B1ICpzcHUpOwogCXZvaWQgKCptZmNfdGNsYXNzX2lkX3NldCkgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHRjbGFzc19pZCk7CkBAIC0xMTIsOSArMTEzLDkgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1zcHVfbWZjX3Nkcl9zZXQgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNkcikKK3NwdV9tZmNfc2RyX3NldHVwIChzdHJ1Y3Qgc3B1ICpzcHUpCiB7Ci0Jc3B1X3ByaXYxX29wcy0+bWZjX3Nkcl9zZXQoc3B1LCBzZHIpOworCXNwdV9wcml2MV9vcHMtPm1mY19zZHJfc2V0dXAoc3B1KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0xNzEsMTIgKzE3Miw0MSBAQAogCXJldHVybiBzcHVfcHJpdjFfb3BzLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9nZXQoc3B1KTsKIH0KIAotLyogVGhlIGRlY2xhcmF0aW9ucyBmb2xvd2luZyBhcmUgcHV0IGhlcmUgZm9yIGNvbnZlbmllbmNlCi0gKiBhbmQgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSBwbGF0Zm9ybSBzZXR1cCBjb2RlCi0gKiBmb3IgaW5pdGlhbGl6aW5nIHNwdV9wcml2MV9vcHMuCisvKiBzcHUgbWFuYWdlbWVudCBhYnN0cmFjdGlvbiAqLworCitzdHJ1Y3Qgc3B1X21hbmFnZW1lbnRfb3BzIHsKKwlpbnQgKCplbnVtZXJhdGVfc3B1cykoaW50ICgqZm4pKHZvaWQgKmRhdGEpKTsKKwlpbnQgKCpjcmVhdGVfc3B1KShzdHJ1Y3Qgc3B1ICpzcHUsIHZvaWQgKmRhdGEpOworCWludCAoKmRlc3Ryb3lfc3B1KShzdHJ1Y3Qgc3B1ICpzcHUpOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzcHVfbWFuYWdlbWVudF9vcHMqIHNwdV9tYW5hZ2VtZW50X29wczsKKworc3RhdGljIGlubGluZSBpbnQKK3NwdV9lbnVtZXJhdGVfc3B1cyAoaW50ICgqZm4pKHZvaWQgKmRhdGEpKQoreworCXJldHVybiBzcHVfbWFuYWdlbWVudF9vcHMtPmVudW1lcmF0ZV9zcHVzKGZuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NwdV9jcmVhdGVfc3B1IChzdHJ1Y3Qgc3B1ICpzcHUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHNwdV9tYW5hZ2VtZW50X29wcy0+Y3JlYXRlX3NwdShzcHUsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc3B1X2Rlc3Ryb3lfc3B1IChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIHNwdV9tYW5hZ2VtZW50X29wcy0+ZGVzdHJveV9zcHUoc3B1KTsKK30KKworLyoKKyAqIFRoZSBkZWNsYXJhdGlvbnMgZm9sb3dpbmcgYXJlIHB1dCBoZXJlIGZvciBjb252ZW5pZW5jZQorICogYW5kIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgcGxhdGZvcm0gc2V0dXAgY29kZS4KICAqLwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHNwdV9wcml2MV9vcHMgc3B1X3ByaXYxX21taW9fb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzcHVfbWFuYWdlbWVudF9vcHMgc3B1X21hbmFnZW1lbnRfb2Zfb3BzOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RibC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0YmwuaAppbmRleCBlYWM4NWNlLi45N2I0MzU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RibC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGJsLmgKQEAgLTI2MSw3ICsyNjEsNyBAQAogUFBDX1NZU19TUFUocnRhcykKIE9MRFNZUyhkZWJ1Z19zZXRjb250ZXh0KQogU1lTQ0FMTChuaV9zeXNjYWxsKQotU1lTQ0FMTChuaV9zeXNjYWxsKQorQ09NUEFUX1NZUyhtaWdyYXRlX3BhZ2VzKQogQ09NUEFUX1NZUyhtYmluZCkKIENPTVBBVF9TWVMoZ2V0X21lbXBvbGljeSkKIENPTVBBVF9TWVMoc2V0X21lbXBvbGljeSkKQEAgLTMwNCwzICszMDQsNCBAQAogU1lTQ0FMTF9TUFUoZmFjY2Vzc2F0KQogQ09NUEFUX1NZU19TUFUoZ2V0X3JvYnVzdF9saXN0KQogQ09NUEFUX1NZU19TUFUoc2V0X3JvYnVzdF9saXN0KQorQ09NUEFUX1NZUyhtb3ZlX3BhZ2VzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKaW5kZXggNDM2Mjc1OS4uZjdiMTIyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCkBAIC0yNSw4ICsyNSw4IEBACiAgKgogICogV2UgaGF2ZSB0byB1c2UgdGhlIHN5bmMgaW5zdHJ1Y3Rpb25zIGZvciBtYigpLCBzaW5jZSBsd3N5bmMgZG9lc24ndAogICogb3JkZXIgbG9hZHMgd2l0aCByZXNwZWN0IHRvIHByZXZpb3VzIHN0b3Jlcy4gIEx3c3luYyBpcyBmaW5lIGZvcgotICogcm1iKCksIHRob3VnaC4gIE5vdGUgdGhhdCBsd3N5bmMgaXMgaW50ZXJwcmV0ZWQgYXMgc3luYyBieQotICogMzItYml0IGFuZCBvbGRlciA2NC1iaXQgQ1BVcy4KKyAqIHJtYigpLCB0aG91Z2guIE5vdGUgdGhhdCBybWIoKSBhY3R1YWxseSB1c2VzIGEgc3luYyBvbiAzMi1iaXQKKyAqIGFyY2hpdGVjdHVyZXMuCiAgKgogICogRm9yIHdtYigpLCB3ZSB1c2Ugc3luYyBzaW5jZSB3bWIgaXMgdXNlZCBpbiBkcml2ZXJzIHRvIG9yZGVyCiAgKiBzdG9yZXMgdG8gc3lzdGVtIG1lbW9yeSB3aXRoIHJlc3BlY3QgdG8gd3JpdGVzIHRvIHRoZSBkZXZpY2UuCkBAIC0zNCw3ICszNCw3IEBACiAgKiBTTVAgc2luY2UgaXQgaXMgb25seSB1c2VkIHRvIG9yZGVyIHVwZGF0ZXMgdG8gc3lzdGVtIG1lbW9yeS4KICAqLwogI2RlZmluZSBtYigpICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5IikKLSNkZWZpbmUgcm1iKCkgIF9fYXNtX18gX192b2xhdGlsZV9fICgibHdzeW5jIiA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgcm1iKCkgIF9fYXNtX18gX192b2xhdGlsZV9fIChfX3N0cmluZ2lmeShMV1NZTkMpIDogOiA6ICJtZW1vcnkiKQogI2RlZmluZSB3bWIoKSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIiA6IDogOiAibWVtb3J5IikKICNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKSAgZG8geyB9IHdoaWxlKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGNlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RjZS5oCmluZGV4IGM5NDgzYWQuLmY2NjM2MzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGNlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90Y2UuaApAQCAtMjIsNiArMjIsOCBAQAogI2RlZmluZSBfQVNNX1BPV0VSUENfVENFX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKwogLyoKICAqIFRjZXMgY29tZSBpbiB0d28gZm9ybWF0cywgb25lIGZvciB0aGUgdmlydHVhbCBidXMgYW5kIGEgZGlmZmVyZW50CiAgKiBmb3JtYXQgZm9yIFBDSQpAQCAtMzMsNyArMzUsNiBAQAogCiAjZGVmaW5lIFRDRV9TSElGVAkxMgogI2RlZmluZSBUQ0VfUEFHRV9TSVpFCSgxIDw8IFRDRV9TSElGVCkKLSNkZWZpbmUgVENFX1BBR0VfRkFDVE9SCShQQUdFX1NISUZUIC0gVENFX1NISUZUKQogCiAjZGVmaW5lIFRDRV9FTlRSWV9TSVpFCQk4CQkvKiBlYWNoIFRDRSBpcyA2NCBiaXRzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGVybWJpdHMuaAppbmRleCA2ZDUzM2IwLi41ZTc5MTk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oCkBAIC0zMCw2ICszMCwxOSBAQAogCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KIH07CiAKKy8qIEZvciBQb3dlclBDIHRoZSB0ZXJtaW9zIGFuZCBrdGVybWlvcyBhcmUgdGhlIHNhbWUgKi8KKworc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAoPT0gY19jY1sxOV0pICovCisJc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisJc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworfTsKKwogLyogY19jYyBjaGFyYWN0ZXJzICovCiAjZGVmaW5lIFZJTlRSIAkgICAgICAgICAwCiAjZGVmaW5lIFZRVUlUIAkgICAgICAgICAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmgKaW5kZXggZDMzOWUyZS4uM2YzMmNhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGhyZWFkX2luZm8uaApAQCAtMTIyLDYgKzEyMiw3IEBACiAjZGVmaW5lIFRJRl9SRVNUT1JFQUxMCQkxMgkvKiBSZXN0b3JlIGFsbCByZWdzIChpbXBsaWVzIE5PRVJST1IpICovCiAjZGVmaW5lIFRJRl9OT0VSUk9SCQkxNAkvKiBGb3JjZSBzdWNjZXNzZnVsIHN5c2NhbGwgcmV0dXJuICovCiAjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJMTUJLyogUmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwgKi8KKyNkZWZpbmUgVElGX0ZSRUVaRQkJMTYJLyogRnJlZXppbmcgZm9yIHN1c3BlbmQgKi8KIAogLyogYXMgYWJvdmUsIGJ1dCBhcyBiaXQgdmFsdWVzICovCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCkBAIC0xMzgsNiArMTM5LDcgQEAKICNkZWZpbmUgX1RJRl9SRVNUT1JFQUxMCQkoMTw8VElGX1JFU1RPUkVBTEwpCiAjZGVmaW5lIF9USUZfTk9FUlJPUgkJKDE8PFRJRl9OT0VSUk9SKQogI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMTw8VElGX1JFU1RPUkVfU0lHTUFTSykKKyNkZWZpbmUgX1RJRl9GUkVFWkUJCSgxPDxUSUZfRlJFRVpFKQogI2RlZmluZSBfVElGX1NZU0NBTExfVF9PUl9BCShfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCkKIAogI2RlZmluZSBfVElGX1VTRVJfV09SS19NQVNLCShfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX1NJR1BFTkRJTkcgfCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCmluZGV4IGIwNTFkNGMuLjRjZmY5NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCkBAIC0zOSwxMCArMzksNiBAQAogZXh0ZXJuIHZvaWQgd2FrZXVwX2RlY3JlbWVudGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgc25hcHNob3RfdGltZWJhc2Uodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfUlRDX0NMQVNTCi1leHRlcm4gaW50IF9faW5pdCBydGNfY2xhc3NfaG9va3VwKHZvaWQpOwotI2VuZGlmCi0KIC8qIFNvbWUgc2FuZSBkZWZhdWx0czogMTI1IE1IeiB0aW1lYmFzZSwgMUdIeiBwcm9jZXNzb3IgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIHBwY19wcm9jX2ZyZXE7CiAjZGVmaW5lIERFRkFVTFRfUFJPQ19GUkVRCShERUZBVUxUX1RCX0ZSRVEgKiA4KQpAQCAtODIsMzAgKzc4LDM1IEBACiAjZGVmaW5lIF9fVVNFX1JUQygpCTAKICNlbmRpZgogCi0vKiBPbiBwcGM2NCB0aGlzIGdldHMgdXMgdGhlIHdob2xlIHRpbWViYXNlOyBvbiBwcGMzMiBqdXN0IHRoZSBsb3dlciBoYWxmICovCisjaWZkZWYgQ09ORklHX1BQQzY0CisKKy8qIEZvciBjb21wYXRpYmlsaXR5LCBnZXRfdGJsKCkgaXMgZGVmaW5lZCBhcyBnZXRfdGIoKSBvbiBwcGM2NCAqLworI2RlZmluZSBnZXRfdGJsCQlnZXRfdGIKKworI2Vsc2UKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF90Ymwodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHRibDsKLQogI2lmIGRlZmluZWQoQ09ORklHXzQwM0dDWCkKKwl1bnNpZ25lZCBsb25nIHRibDsKIAlhc20gdm9sYXRpbGUoIm1mc3ByICUwLCAweDNkZCIgOiAiPXIiICh0YmwpKTsKLSNlbHNlCi0JYXNtIHZvbGF0aWxlKCJtZnRiICUwIiA6ICI9ciIgKHRibCkpOwotI2VuZGlmCiAJcmV0dXJuIHRibDsKKyNlbHNlCisJcmV0dXJuIG1mdGJsKCk7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3RidSh2b2lkKQogeworI2lmZGVmIENPTkZJR180MDNHQ1gKIAl1bnNpZ25lZCBpbnQgdGJ1OwotCi0jaWYgZGVmaW5lZChDT05GSUdfNDAzR0NYKQogCWFzbSB2b2xhdGlsZSgibWZzcHIgJTAsIDB4M2RjIiA6ICI9ciIgKHRidSkpOwotI2Vsc2UKLQlhc20gdm9sYXRpbGUoIm1mdGJ1ICUwIiA6ICI9ciIgKHRidSkpOwotI2VuZGlmCiAJcmV0dXJuIHRidTsKKyNlbHNlCisJcmV0dXJuIG1mdGJ1KCk7CisjZW5kaWYKIH0KKyNlbmRpZiAvKiAhQ09ORklHX1BQQzY0ICovCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9ydGNsKHZvaWQpCiB7CkBAIC0xMzEsNyArMTMyLDcgQEAKIHsKIAlyZXR1cm4gbWZ0YigpOwogfQotI2Vsc2UKKyNlbHNlIC8qIENPTkZJR19QUEM2NCAqLwogc3RhdGljIGlubGluZSB1NjQgZ2V0X3RiKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHRiaGksIHRibG8sIHRiaGkyOwpAQCAtMTQ0LDcgKzE0NSw3IEBACiAKIAlyZXR1cm4gKCh1NjQpdGJoaSA8PCAzMikgfCB0YmxvOwogfQotI2VuZGlmCisjZW5kaWYgLyogIUNPTkZJR19QUEM2NCAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3RiKHVuc2lnbmVkIGludCB1cHBlciwgdW5zaWduZWQgaW50IGxvd2VyKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1leC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aW1leC5oCmluZGV4IDNiOWE4ZTcuLjkyZGVkZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWV4LmgKQEAgLTgsNiArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KIAogI2RlZmluZSBDTE9DS19USUNLX1JBVEUJMTAyNDAwMCAvKiBVbmRlcmx5aW5nIEhaICovCiAKQEAgLTE1LDEzICsxNiwxMSBAQAogCiBzdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKIHsKKyNpZmRlZiBfX3Bvd2VycGM2NF9fCisJcmV0dXJuIG1mdGIoKTsKKyNlbHNlCiAJY3ljbGVzX3QgcmV0OwogCi0jaWZkZWYgX19wb3dlcnBjNjRfXwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1mdGIgJTAiIDogIj1yIiAocmV0KSA6ICk7Ci0KLSNlbHNlCiAJLyoKIAkgKiBGb3IgdGhlICJjeWNsZSIgY291bnRlciB3ZSB1c2UgdGhlIHRpbWViYXNlIGxvd2VyIGhhbGYuCiAJICogQ3VycmVudGx5IG9ubHkgdXNlZCBvbiBTTVAuCkBAIC0zMCwxOCArMjksMTkgQEAKIAlyZXQgPSAwOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSI5ODoJbWZ0YiAlMFxuIgorCQkiOTc6CW1mdGIgJTBcbiIKIAkJIjk5OlxuIgogCQkiLnNlY3Rpb24gX19mdHJfZml4dXAsXCJhXCJcbiIKKwkJIi5hbGlnbiAyXG4iCisJCSI5ODpcbiIKIAkJIgkubG9uZyAlMVxuIgogCQkiCS5sb25nIDBcbiIKLQkJIgkubG9uZyA5OGJcbiIKLQkJIgkubG9uZyA5OWJcbiIKKwkJIgkubG9uZyA5N2ItOThiXG4iCisJCSIJLmxvbmcgOTliLTk4YlxuIgogCQkiLnByZXZpb3VzIgogCQk6ICI9ciIgKHJldCkgOiAiaSIgKENQVV9GVFJfNjAxKSk7Ci0jZW5kaWYKLQogCXJldHVybiByZXQ7CisjZW5kaWYKIH0KIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9kYy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90b2RjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYThjMzkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90b2RjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLyoKLSAqIERlZmluaXRpb25zIGZvciB0aGUgTTQ4VHh4IGFuZCBtYzE0NjgxOCBzZXJpZXMgb2YgVGltZSBvZiBkYXkvUmVhbCBUaW1lCi0gKiBDbG9jayBjaGlwcy4KLSAqCi0gKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPgotICoKLSAqIDIwMDEgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLQotLyoKLSAqIFN1cHBvcnQgZm9yIHRoZSBNNDhUMzcvTTQ4VDU5Ly4uLi9tYzE0NjgxOCBSZWFsIFRpbWUgQ2xvY2sgY2hpcHMuCi0gKiBQdXJwb3NlIGlzIHRvIG1ha2Ugb25lIGdlbmVyaWMgZmlsZSB0aGF0IGhhbmRsZXMgYWxsIG9mIHRoZXNlIGNoaXBzIGluc3RlYWQKLSAqIG9mIGV2ZXJ5IHBsYXRmb3JtIGltcGxlbWVudGluZyB0aGUgc2FtZSBjb2RlIG92ZXIgJiBvdmVyIGFnYWluLgotICovCi0KLSNpZm5kZWYgX19QUENfS0VSTkVMX1RPRENfSAotI2RlZmluZSBfX1BQQ19LRVJORUxfVE9EQ19ICi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1aW50IHJ0Y190eXBlOwkJLyogeW91ciBwYXJ0aWN1bGFyIGNoaXAgKi8KLQotCS8qCi0JICogRm9sbG93aW5nIGFyZSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBBUzAsIEFTMSwgYW5kIERBVEEgcmVnaXN0ZXJzCi0JICogb2YgdGhlc2UgY2hpcHMuICBOb3RlIHRoYXQgdGhlc2UgYXJlIGJvYXJkLXNwZWNpZmljLgotCSAqLwotCXVuc2lnbmVkIGludCBudnJhbV9hczA7Ci0JdW5zaWduZWQgaW50IG52cmFtX2FzMTsKLQl1bnNpZ25lZCBpbnQgbnZyYW1fZGF0YTsKLQotCS8qCi0JICogRGVmaW5lIGJpdHMgdG8gc3RvcCBleHRlcm5hbCBzZXQgb2YgcmVncyBmcm9tIGNoYW5naW5nIHNvCi0JICogdGhlIGNoaXAgY2FuIGJlIHJlYWQvd3JpdHRlbiByZWxpYWJseS4KLQkgKi8KLQl1bnNpZ25lZCBjaGFyIGVuYWJsZV9yZWFkOwotCXVuc2lnbmVkIGNoYXIgZW5hYmxlX3dyaXRlOwotCi0JLyoKLQkgKiBGb2xsb3dpbmcgaXMgdGhlIG51bWJlciBvZiBBUzAgYWRkcmVzcyBiaXRzLiAgVGhpcyBpcyBub3JtYWxseQotCSAqIDggYnV0IHNvbWUgYmFkIGhhcmR3YXJlIHJvdXRlcyBhZGRyZXNzIGxpbmVzIGluY29ycmVjdGx5LgotCSAqLwotCWludCBhczBfYml0czsKLQotCWludCBudnJhbV9zaXplOwkvKiBTaXplIG9mIE5WUkFNIG9uIGNoaXAgKi8KLQlpbnQgc3dfZmxhZ3M7CS8qIFNvZnR3YXJlIGNvbnRyb2wgZmxhZ3MgKi8KLQotCS8qIEZvbGxvd2luZyBhcmUgdGhlIHJlZ2lzdGVyIG9mZnNldHMgZm9yIHRoZSBwYXJ0aWN1bGFyIGNoaXAgKi8KLQlpbnQgeWVhcjsKLQlpbnQgbW9udGg7Ci0JaW50IGRheV9vZl9tb250aDsKLQlpbnQgZGF5X29mX3dlZWs7Ci0JaW50IGhvdXJzOwotCWludCBtaW51dGVzOwotCWludCBzZWNvbmRzOwotCWludCBjb250cm9sX2I7Ci0JaW50IGNvbnRyb2xfYTsKLQlpbnQgd2F0Y2hkb2c7Ci0JaW50IGludGVycnVwdHM7Ci0JaW50IGFsYXJtX2RhdGU7Ci0JaW50IGFsYXJtX2hvdXI7Ci0JaW50IGFsYXJtX21pbnV0ZXM7Ci0JaW50IGFsYXJtX3NlY29uZHM7Ci0JaW50IGNlbnR1cnk7Ci0JaW50IGZsYWdzOwotCi0JLyoKLQkgKiBTb21lIFJUQyBjaGlwcyBoYXZlIHRoZWlyIE5WUkFNIGJ1cmllZCBiZWhpbmQgYSBhZGRyL2RhdGEgcGFpciBvZgotCSAqIHJlZ3Mgb24gdGhlIGZpcnN0IGxldmVsL2Nsb2NrIHJlZ2lzdGVycy4gIFRoZSBmb2xsb3dpbmcgZmllbGRzCi0JICogYXJlIHRoZSBhZGRyZXNzZXMgZm9yIHRob3NlIGFkZHIvZGF0YSByZWdzLgotCSAqLwotCWludCBudnJhbV9hZGRyX3JlZzsKLQlpbnQgbnZyYW1fZGF0YV9yZWc7Ci19IHRvZGNfaW5mb190OwotCi0vKgotICogRGVmaW5lIHRoZSB0eXBlcyBvZiBUT0RDL1JUQyB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQgaW4KLSAqIGFyY2gvcHBjL2tlcm5lbC90b2RjX3RpbWUuYwotICogTWFrZSBhIG5ldyBvbmUgb2YgdGhlc2UgZm9yIGFueSBjaGlwIHNvbWVob3cgZGlmZmVycyBmcm9tIHdoYXQncyBhbHJlYWR5Ci0gKiBkZWZpbmVkLiAgVGhhdCB3YXksIGlmIHlvdSBldmVyIG5lZWQgdG8gcHV0IGluIGNvZGUgdG8gdG91Y2ggdGhvc2UKLSAqIGJpdHMvcmVnaXN0ZXJzIGluIHRvZGNfdGltZS5jLCB5b3UgY2FuIHB1dCBpdCBpbnNpZGUgYW4KLSAqICdpZiAodG9kY19pbmZvLT5ydGNfdHlwZSA9PSBUT0RDX1RZUEVfWFhYKScgc28geW91IHdvbid0IGJyZWFrCi0gKiBhbnlvbmUgZWxzZS4KLSAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNQkJMQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNwkJMgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OQkJMwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzCQk0CS8qIERhbGxhcyBEUzE2OTMgUlRDICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDMJCTUJLyogRGFsbGFzIERTMTc0MyBSVEMgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0NgkJNgkvKiBEYWxsYXMgRFMxNzQ2IFJUQyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3CQk3CS8qIERhbGxhcyBEUzE3NDcgUlRDICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDEJCTgJLyogRGFsbGFzIERTMTUwMSBSVEMgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0MwkJOQkvKiBEYWxsYXMgRFMxNjQzIFJUQyAqLwotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwNwkJMTAJLyogUEM5NzMwNyBpbnRlcm5hbCBSVEMgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1NwkJMTEJLyogRGFsbGFzIERTMTU1NyBSVEMgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODUJCTEyCS8qIERhbGxhcyBEUzE3Mjg1IFJUQyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzCQkxMwkvKiBEYWxsYXMgRFMxNTUzIFJUQyAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MTgJCTEwMAkvKiBMZWF2ZSByb29tIGZvciBtNDh0eHgncyAqLwotCi0vKgotICogQml0IHRvIGNsZWFyL3NldCB0byBlbmFibGUgcmVhZHMvd3JpdGVzIHRvIHRoZSBjaGlwCi0gKi8KLSNkZWZpbmUgVE9EQ19NSzQ4VFhYX0NOVExfQV9SCQkweDQwCi0jZGVmaW5lIFRPRENfTUs0OFRYWF9DTlRMX0FfVwkJMHg4MAotI2RlZmluZSBUT0RDX01LNDhUWFhfREFZX0NCCQkweDgwCi0KLSNkZWZpbmUgVE9EQ19EUzE1MDFfQ05UTF9CX1RFCQkweDgwCi0KLS8qCi0gKiBEZWZpbmUgZmxhZyBiaXRzIHVzZWQgYnkgdG9kYyByb3V0aW5lcy4KLSAqLwotI2RlZmluZSBUT0RDX0ZMQUdfMl9MRVZFTF9OVlJBTQkJMHgwMDAwMDAwMQotCi0vKgotICogRGVmaW5lIHRoZSB2YWx1ZXMgZm9yIHRoZSB2YXJpb3VzIFJUQydzIHRoYXQgc2hvdWxkIHRvIGludG8gdGhlIHRvZGNfaW5mbwotICogdGFibGUuCi0gKiBOb3RlOiBUaGUgWFhYX05WUkFNX1NJWkUsIFhYWF9OVlJBTV9BRERSX1JFRywgYW5kIFhYWF9OVlJBTV9EQVRBX1JFRyBvbmx5Ci0gKiBtYXR0ZXIgaWYgWFhYX1NXX0ZMQUdTIGhhcyBUT0RDX0ZMQUdfMl9MRVZFTF9OVlJBTSBzZXQuCi0gKi8KLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfTlZSQU1fU0laRQkJMHg3ZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X1lFQVIJCQkweDdmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfTU9OVEgJCQkweDdmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfRE9NCQkJMHg3ZmZkCS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9ET1cJCQkweDdmZmMJLyogRGF5IG9mIFdlZWsgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfSE9VUlMJCQkweDdmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfTUlOVVRFUwkJMHg3ZmZhCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X1NFQ09ORFMJCTB4N2ZmOQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9DTlRMX0IJCTB4N2ZmOQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9DTlRMX0EJCTB4N2ZmOAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9XQVRDSERPRwkJMHgwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X0lOVEVSUlVQVFMJCTB4MDAwMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9BTEFSTV9EQVRFCQkweDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfQUxBUk1fSE9VUgkJMHgwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X0FMQVJNX01JTlVURVMJCTB4MDAwMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzNV9BTEFSTV9TRUNPTkRTCQkweDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfQ0VOVFVSWQkJMHgwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X0ZMQUdTCQkJMHgwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM1X05WUkFNX0FERFJfUkVHCTAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzVfTlZSQU1fREFUQV9SRUcJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X05WUkFNX1NJWkUJCTB4N2ZmMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19TV19GTEFHUwkJMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19ZRUFSCQkJMHg3ZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X01PTlRICQkJMHg3ZmZlCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X0RPTQkJCTB4N2ZmZAkvKiBEYXkgb2YgTW9udGggKi8KLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfRE9XCQkJMHg3ZmZjCS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X0hPVVJTCQkJMHg3ZmZiCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X01JTlVURVMJCTB4N2ZmYQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19TRUNPTkRTCQkweDdmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfQ05UTF9CCQkweDdmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfQ05UTF9BCQkweDdmZjgKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfV0FUQ0hET0cJCTB4N2ZmNwotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19JTlRFUlJVUFRTCQkweDdmZjYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfQUxBUk1fREFURQkJMHg3ZmY1Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X0FMQVJNX0hPVVIJCTB4N2ZmNAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19BTEFSTV9NSU5VVEVTCQkweDdmZjMKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUMzdfQUxBUk1fU0VDT05EUwkJMHg3ZmYyCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X0NFTlRVUlkJCTB4N2ZmMQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19GTEFHUwkJCTB4N2ZmMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQzN19OVlJBTV9BRERSX1JFRwkwCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDM3X05WUkFNX0RBVEFfUkVHCTAKLQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9OVlJBTV9TSVpFCQkweDFmZjAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfU1dfRkxBR1MJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfWUVBUgkJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9NT05USAkJCTB4MWZmZQotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9ET00JCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0RPVwkJCTB4MWZmYwkvKiBEYXkgb2YgV2VlayAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9IT1VSUwkJCTB4MWZmYgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9NSU5VVEVTCQkweDFmZmEKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfU0VDT05EUwkJMHgxZmY5Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0NOVExfQgkJMHgxZmY5Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0NOVExfQQkJMHgxZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X1dBVENIRE9HCQkweDFmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfSU5URVJSVVBUUwkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0FMQVJNX0RBVEUJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9BTEFSTV9IT1VSCQkweDFmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfQUxBUk1fTUlOVVRFUwkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9NSzQ4VDU5X0FMQVJNX1NFQ09ORFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9DRU5UVVJZCQkweDFmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfRkxBR1MJCQkweDFmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01LNDhUNTlfTlZSQU1fQUREUl9SRUcJMAotI2RlZmluZSBUT0RDX1RZUEVfTUs0OFQ1OV9OVlJBTV9EQVRBX1JFRwkwCi0KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFCTB4MTAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfU1dfRkxBR1MJVE9EQ19GTEFHXzJfTEVWRUxfTlZSQU0KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9ZRUFSCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwNikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9NT05USAkJKFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fU0laRSArIDB4MDUpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfRE9NCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwNCkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9ET1cJCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDAzKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX0hPVVJTCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwMikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9NSU5VVEVTCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDAxKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX1NFQ09ORFMJKFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fU0laRSArIDB4MDApCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfQ05UTF9CCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwZikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9DTlRMX0EJCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDBmKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX1dBVENIRE9HCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweGZmKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX0lOVEVSUlVQVFMJKFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fU0laRSArIDB4ZmYpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfQUxBUk1fREFURQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwYikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9BTEFSTV9IT1VSCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDBhKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX0FMQVJNX01JTlVURVMJKFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fU0laRSArIDB4MDkpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfQUxBUk1fU0VDT05EUwkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHgwOCkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9DRU5UVVJZCShUT0RDX1RZUEVfRFMxNTAxX05WUkFNX1NJWkUgKyAweDA3KQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTAxX0ZMQUdTCQkoVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9TSVpFICsgMHhmZikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTUwMV9OVlJBTV9BRERSX1JFRwkweDEwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1MDFfTlZSQU1fREFUQV9SRUcJMHgxMwotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfTlZSQU1fU0laRQkJMHgxZmYwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfU1dfRkxBR1MJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19ZRUFSCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfTU9OVEgJCQkweDFmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19ET00JCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfRE9XCQkJMHgxZmZjCS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfSE9VUlMJCQkweDFmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19NSU5VVEVTCQkweDFmZmEKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19TRUNPTkRTCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19DTlRMX0IJCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19DTlRMX0EJCQkweDFmZjgJLyogY29udHJvbF9hIFIvVyByZWdzICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfV0FUQ0hET0cJCTB4MWZmNwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0lOVEVSUlVQVFMJCTB4MWZmNgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0FMQVJNX0RBVEUJCTB4MWZmNQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0FMQVJNX0hPVVIJCTB4MWZmNAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0FMQVJNX01JTlVURVMJCTB4MWZmMwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0FMQVJNX1NFQ09ORFMJCTB4MWZmMgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0NFTlRVUlkJCTB4MWZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTUzX0ZMQUdTCQkJMHgxZmYwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTNfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1M19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfTlZSQU1fU0laRQkJMHg3ZmZmMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfWUVBUgkJCTB4N2ZmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19NT05USAkJCTB4N2ZmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19ET00JCQkweDdmZmZkCS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X0RPVwkJCTB4N2ZmZmMJLyogRGF5IG9mIFdlZWsgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19IT1VSUwkJCTB4N2ZmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19NSU5VVEVTCQkweDdmZmZhCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfU0VDT05EUwkJMHg3ZmZmOQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X0NOVExfQgkJCTB4N2ZmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19DTlRMX0EJCQkweDdmZmY4CS8qIGNvbnRyb2xfYSBSL1cgcmVncyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X1dBVENIRE9HCQkweDdmZmY3Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfSU5URVJSVVBUUwkJMHg3ZmZmNgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X0FMQVJNX0RBVEUJCTB4N2ZmZjUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19BTEFSTV9IT1VSCQkweDdmZmY0Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfQUxBUk1fTUlOVVRFUwkJMHg3ZmZmMwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNTU3X0FMQVJNX1NFQ09ORFMJCTB4N2ZmZjIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19DRU5UVVJZCQkweDdmZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfRkxBR1MJCQkweDdmZmYwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE1NTdfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTU1N19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfTlZSQU1fU0laRQkJMHgxZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfU1dfRkxBR1MJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19ZRUFSCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfTU9OVEgJCQkweDFmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19ET00JCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfRE9XCQkJMHgxZmZjCS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfSE9VUlMJCQkweDFmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19NSU5VVEVTCQkweDFmZmEKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19TRUNPTkRTCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19DTlRMX0IJCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19DTlRMX0EJCQkweDFmZjgJLyogY29udHJvbF9hIFIvVyByZWdzICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfV0FUQ0hET0cJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0lOVEVSUlVQVFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0FMQVJNX0RBVEUJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0FMQVJNX0hPVVIJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0FMQVJNX01JTlVURVMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0FMQVJNX1NFQ09ORFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0NFTlRVUlkJCTB4MWZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjQzX0ZMQUdTCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2NDNfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY0M19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfTlZSQU1fU0laRQkJMCAvKiBOb3QgaGFuZGxlZCB5ZXQgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19TV19GTEFHUwkJMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX1lFQVIJCQkweDA5Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfTU9OVEgJCQkweDA4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfRE9NCQkJMHgwNwkvKiBEYXkgb2YgTW9udGggKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19ET1cJCQkweDA2CS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfSE9VUlMJCQkweDA0Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfTUlOVVRFUwkJMHgwMgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX1NFQ09ORFMJCTB4MDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19DTlRMX0IJCQkweDBiCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfQ05UTF9BCQkJMHgwYQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX1dBVENIRE9HCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfSU5URVJSVVBUUwkJMHhmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX0FMQVJNX0RBVEUJCTB4NDkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19BTEFSTV9IT1VSCQkweDA1Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfQUxBUk1fTUlOVVRFUwkJMHgwMwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNjkzX0FMQVJNX1NFQ09ORFMJCTB4MDEKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19DRU5UVVJZCQkweDQ4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfRkxBR1MJCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE2OTNfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTY5M19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfTlZSQU1fU0laRQkJMHgxZmY4Ci0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfU1dfRkxBR1MJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19ZRUFSCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfTU9OVEgJCQkweDFmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19ET00JCQkweDFmZmQJLyogRGF5IG9mIE1vbnRoICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfRE9XCQkJMHgxZmZjCS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfSE9VUlMJCQkweDFmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19NSU5VVEVTCQkweDFmZmEKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19TRUNPTkRTCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19DTlRMX0IJCQkweDFmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19DTlRMX0EJCQkweDFmZjgJLyogY29udHJvbF9hIFIvVyByZWdzICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfV0FUQ0hET0cJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0lOVEVSUlVQVFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0FMQVJNX0RBVEUJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0FMQVJNX0hPVVIJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0FMQVJNX01JTlVURVMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0FMQVJNX1NFQ09ORFMJCTB4MWZmZgotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0NFTlRVUlkJCTB4MWZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQzX0ZMQUdTCQkJMHgxZmZmCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDNfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0M19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfTlZSQU1fU0laRQkJMHgxZmZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfWUVBUgkJCTB4MWZmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9NT05USAkJCTB4MWZmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9ET00JCQkweDFmZmZkCS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X0RPVwkJCTB4MWZmZmMJLyogRGF5IG9mIFdlZWsgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9IT1VSUwkJCTB4MWZmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9NSU5VVEVTCQkweDFmZmZhCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfU0VDT05EUwkJMHgxZmZmOQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X0NOVExfQgkJCTB4MWZmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9DTlRMX0EJCQkweDFmZmY4CS8qIGNvbnRyb2xfYSBSL1cgcmVncyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X1dBVENIRE9HCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfSU5URVJSVVBUUwkJMHgwMDAwMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X0FMQVJNX0RBVEUJCTB4MDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9BTEFSTV9IT1VSCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfQUxBUk1fTUlOVVRFUwkJMHgwMDAwMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ2X0FMQVJNX1NFQ09ORFMJCTB4MDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9DRU5UVVJZCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfRkxBR1MJCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDZfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0Nl9OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfTlZSQU1fU0laRQkJMHg3ZmZmOAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfWUVBUgkJCTB4N2ZmZmYKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19NT05USAkJCTB4N2ZmZmUKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19ET00JCQkweDdmZmZkCS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X0RPVwkJCTB4N2ZmZmMJLyogRGF5IG9mIFdlZWsgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19IT1VSUwkJCTB4N2ZmZmIKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19NSU5VVEVTCQkweDdmZmZhCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfU0VDT05EUwkJMHg3ZmZmOQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X0NOVExfQgkJCTB4N2ZmZjkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19DTlRMX0EJCQkweDdmZmY4CS8qIGNvbnRyb2xfYSBSL1cgcmVncyAqLwotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X1dBVENIRE9HCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfSU5URVJSVVBUUwkJMHgwMDAwMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X0FMQVJNX0RBVEUJCTB4MDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19BTEFSTV9IT1VSCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfQUxBUk1fTUlOVVRFUwkJMHgwMDAwMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzQ3X0FMQVJNX1NFQ09ORFMJCTB4MDAwMDAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19DRU5UVVJZCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfRkxBR1MJCQkweDAwMDAwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3NDdfTlZSQU1fQUREUl9SRUcJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTc0N19OVlJBTV9EQVRBX1JFRwkJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUJCSgweDEwMDAtMHg4MCkgLyogNEt4OCBOVlJBTSAobWludXMgUlRDIHJlZ3MpICovCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X1NXX0ZMQUdTCQlUT0RDX0ZMQUdfMl9MRVZFTF9OVlJBTQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9TRUNPTkRTCQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MDApCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0FMQVJNX1NFQ09ORFMJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwMSkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfTUlOVVRFUwkJKFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUgKyAweDAyKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9BTEFSTV9NSU5VVEVTCQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MDMpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0hPVVJTCQkJKFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUgKyAweDA0KQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9BTEFSTV9IT1VSCQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MDUpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0RPVwkJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwNikKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfRE9NCQkJKFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUgKyAweDA3KQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9NT05USAkJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwOCkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfWUVBUgkJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwOSkKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfQ05UTF9BCQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MEEpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0NOVExfQgkJKFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX1NJWkUgKyAweDBCKQotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9DTlRMX0MJCShUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9TSVpFICsgMHgwQykKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfQ05UTF9ECQkoVE9EQ19UWVBFX0RTMTcyODVfTlZSQU1fU0laRSArIDB4MEQpCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X1dBVENIRE9HCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0lOVEVSUlVQVFMJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX0RTMTcyODVfQUxBUk1fREFURQkJMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9DRU5UVVJZCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X0ZMQUdTCQkJMAotI2RlZmluZSBUT0RDX1RZUEVfRFMxNzI4NV9OVlJBTV9BRERSX1JFRwkweDUwCi0jZGVmaW5lIFRPRENfVFlQRV9EUzE3Mjg1X05WUkFNX0RBVEFfUkVHCTB4NTMKLQotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfTlZSQU1fU0laRQkJMAkvKiBYWFhYICovCi0jZGVmaW5lIFRPRENfVFlQRV9NQzE0NjgxOF9TV19GTEFHUwkJMAotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfWUVBUgkJCTB4MDkKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X01PTlRICQkweDA4Ci0jZGVmaW5lIFRPRENfVFlQRV9NQzE0NjgxOF9ET00JCQkweDA3CS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfRE9XCQkJMHgwNgkvKiBEYXkgb2YgV2VlayAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfSE9VUlMJCTB4MDQKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X01JTlVURVMJCTB4MDIKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X1NFQ09ORFMJCTB4MDAKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0NOVExfQgkJMHgwYQotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfQ05UTF9BCQkweDBiCS8qIGNvbnRyb2xfYSBSL1cgcmVncyAqLwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfV0FUQ0hET0cJCTAKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0lOVEVSUlVQVFMJCTB4MGMKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0FMQVJNX0RBVEUJCTB4ZmYKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0FMQVJNX0hPVVIJCTB4MDUKLSNkZWZpbmUgVE9EQ19UWVBFX01DMTQ2ODE4X0FMQVJNX01JTlVURVMJMHgwMwotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfQUxBUk1fU0VDT05EUwkweDAxCi0jZGVmaW5lIFRPRENfVFlQRV9NQzE0NjgxOF9DRU5UVVJZCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9NQzE0NjgxOF9GTEFHUwkJMHhmZgotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfTlZSQU1fQUREUl9SRUcJMAotI2RlZmluZSBUT0RDX1RZUEVfTUMxNDY4MThfTlZSQU1fREFUQV9SRUcJMAotCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X05WUkFNX1NJWkUJCTAJLyogTm8gTlZSQU0/ICovCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X1NXX0ZMQUdTCQkwCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X1lFQVIJCQkweDA5Ci0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X01PTlRICQkJMHgwOAotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19ET00JCQkweDA3CS8qIERheSBvZiBNb250aCAqLwotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19ET1cJCQkweDA2CS8qIERheSBvZiBXZWVrICovCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X0hPVVJTCQkJMHgwNAotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19NSU5VVEVTCQkweDAyCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X1NFQ09ORFMJCTB4MDAKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfQ05UTF9CCQkweDBhCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X0NOVExfQQkJMHgwYgkvKiBjb250cm9sX2EgUi9XIHJlZ3MgKi8KLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfV0FUQ0hET0cJCTB4MGMKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfSU5URVJSVVBUUwkJMHgwZAotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19BTEFSTV9EQVRFCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X0FMQVJNX0hPVVIJCTB4MDUKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfQUxBUk1fTUlOVVRFUwkJMHgwMwotI2RlZmluZSBUT0RDX1RZUEVfUEM5NzMwN19BTEFSTV9TRUNPTkRTCQkweDAxCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X0NFTlRVUlkJCTB4ZmYKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfRkxBR1MJCQkweGZmCi0jZGVmaW5lIFRPRENfVFlQRV9QQzk3MzA3X05WUkFNX0FERFJfUkVHCTAKLSNkZWZpbmUgVE9EQ19UWVBFX1BDOTczMDdfTlZSQU1fREFUQV9SRUcJMAotCi0vKgotICogRGVmaW5lIG1hY3JvcyB0byBhbGxvY2F0ZSBhbmQgaW5pdCB0aGUgdG9kY19pbmZvX3QgdGFibGUgdGhhdCB3aWxsCi0gKiBiZSB1c2VkIGJ5IHRoZSB0b2RjX3RpbWUuYyByb3V0aW5lcy4KLSAqLwotI2RlZmluZSBUT0RDX0FMTE9DKCkJCQkJCQkJXAotCXN0YXRpYyB0b2RjX2luZm9fdCB0b2RjX2luZm9fYWxsb2M7CQkJCVwKLQl0b2RjX2luZm9fdCAqdG9kY19pbmZvID0gJnRvZGNfaW5mb19hbGxvYzsKLQotI2RlZmluZSBUT0RDX0lOSVQoY2xvY2tfdHlwZSwgYXMwLCBhczEsIGRhdGEsIGJpdHMpIHsJCQlcCi0JdG9kY19pbmZvLT5ydGNfdHlwZSA9IGNsb2NrX3R5cGU7CQkJCVwKLQkJCQkJCQkJCVwKLQl0b2RjX2luZm8tPm52cmFtX2FzMCA9ICh1bnNpZ25lZCBpbnQpKGFzMCk7CQkJXAotCXRvZGNfaW5mby0+bnZyYW1fYXMxID0gKHVuc2lnbmVkIGludCkoYXMxKTsJCQlcCi0JdG9kY19pbmZvLT5udnJhbV9kYXRhID0gKHVuc2lnbmVkIGludCkoZGF0YSk7CQkJXAotCQkJCQkJCQkJXAotCXRvZGNfaW5mby0+YXMwX2JpdHMgPSAoYml0cyk7CQkJCQlcCi0JCQkJCQkJCQlcCi0JdG9kY19pbmZvLT5udnJhbV9zaXplID0gY2xvY2tfdHlwZSAjI19OVlJBTV9TSVpFOwkJXAotCXRvZGNfaW5mby0+c3dfZmxhZ3MgPSBjbG9ja190eXBlICMjX1NXX0ZMQUdTOwkJCVwKLQkJCQkJCQkJCVwKLQl0b2RjX2luZm8tPnllYXIgPSBjbG9ja190eXBlICMjX1lFQVI7CQkJCVwKLQl0b2RjX2luZm8tPm1vbnRoID0gY2xvY2tfdHlwZSAjI19NT05USDsJCQkJXAotCXRvZGNfaW5mby0+ZGF5X29mX21vbnRoID0gY2xvY2tfdHlwZSAjI19ET007CQkJXAotCXRvZGNfaW5mby0+ZGF5X29mX3dlZWsgPSBjbG9ja190eXBlICMjX0RPVzsJCQlcCi0JdG9kY19pbmZvLT5ob3VycyA9IGNsb2NrX3R5cGUgIyNfSE9VUlM7CQkJCVwKLQl0b2RjX2luZm8tPm1pbnV0ZXMgPSBjbG9ja190eXBlICMjX01JTlVURVM7CQkJXAotCXRvZGNfaW5mby0+c2Vjb25kcyA9IGNsb2NrX3R5cGUgIyNfU0VDT05EUzsJCQlcCi0JdG9kY19pbmZvLT5jb250cm9sX2IgPSBjbG9ja190eXBlICMjX0NOVExfQjsJCQlcCi0JdG9kY19pbmZvLT5jb250cm9sX2EgPSBjbG9ja190eXBlICMjX0NOVExfQTsJCQlcCi0JdG9kY19pbmZvLT53YXRjaGRvZyA9IGNsb2NrX3R5cGUgIyNfV0FUQ0hET0c7CQkJXAotCXRvZGNfaW5mby0+aW50ZXJydXB0cyA9IGNsb2NrX3R5cGUgIyNfSU5URVJSVVBUUzsJCVwKLQl0b2RjX2luZm8tPmFsYXJtX2RhdGUgPSBjbG9ja190eXBlICMjX0FMQVJNX0RBVEU7CQlcCi0JdG9kY19pbmZvLT5hbGFybV9ob3VyID0gY2xvY2tfdHlwZSAjI19BTEFSTV9IT1VSOwkJXAotCXRvZGNfaW5mby0+YWxhcm1fbWludXRlcyA9IGNsb2NrX3R5cGUgIyNfQUxBUk1fTUlOVVRFUzsJCVwKLQl0b2RjX2luZm8tPmFsYXJtX3NlY29uZHMgPSBjbG9ja190eXBlICMjX0FMQVJNX1NFQ09ORFM7CQlcCi0JdG9kY19pbmZvLT5jZW50dXJ5ID0gY2xvY2tfdHlwZSAjI19DRU5UVVJZOwkJCVwKLQl0b2RjX2luZm8tPmZsYWdzID0gY2xvY2tfdHlwZSAjI19GTEFHUzsJCQkJXAotCQkJCQkJCQkJXAotCXRvZGNfaW5mby0+bnZyYW1fYWRkcl9yZWcgPSBjbG9ja190eXBlICMjX05WUkFNX0FERFJfUkVHOwlcCi0JdG9kY19pbmZvLT5udnJhbV9kYXRhX3JlZyA9IGNsb2NrX3R5cGUgIyNfTlZSQU1fREFUQV9SRUc7CVwKLX0KLQotZXh0ZXJuIHRvZGNfaW5mb190ICp0b2RjX2luZm87Ci0KLXVuc2lnbmVkIGNoYXIgdG9kY19kaXJlY3RfcmVhZF92YWwoaW50IGFkZHIpOwotdm9pZCB0b2RjX2RpcmVjdF93cml0ZV92YWwoaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKTsKLXVuc2lnbmVkIGNoYXIgdG9kY19tNDh0eHhfcmVhZF92YWwoaW50IGFkZHIpOwotdm9pZCB0b2RjX200OHR4eF93cml0ZV92YWwoaW50IGFkZHIsIHVuc2lnbmVkIGNoYXIgdmFsKTsKLXVuc2lnbmVkIGNoYXIgdG9kY19tYzE0NjgxOF9yZWFkX3ZhbChpbnQgYWRkcik7Ci12b2lkIHRvZGNfbWMxNDY4MThfd3JpdGVfdmFsKGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCk7Ci0KLWxvbmcgdG9kY190aW1lX2luaXQodm9pZCk7Ci12b2lkIHRvZGNfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqKTsKLWludCB0b2RjX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKik7Ci12b2lkIHRvZGNfY2FsaWJyYXRlX2RlY3Iodm9pZCk7Ci0KLSNlbmRpZgkJCQkvKiBfX1BQQ19LRVJORUxfVE9EQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKaW5kZXggOGY3ZWUxNi4uNjYxMDQ5NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKQEAgLTMyLDcgKzMyLDE0IEBACiBpbnQgb2Zfbm9kZV90b19uaWQoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UpOwogCiBzdHJ1Y3QgcGNpX2J1czsKKyNpZmRlZiBDT05GSUdfUENJCiBleHRlcm4gaW50IHBjaWJ1c190b19ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHBjaWJ1c190b19ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJcmV0dXJuIC0xOworfQorI2VuZGlmCiAKICNkZWZpbmUgcGNpYnVzX3RvX2NwdW1hc2soYnVzKQkocGNpYnVzX3RvX25vZGUoYnVzKSA9PSAtMSA/IFwKIAkJCQkJQ1BVX01BU0tfQUxMIDogXApAQCAtNTksNiArNjYsNyBAQAogCQkJCXwgU0RfQkFMQU5DRV9FWEVDCVwKIAkJCQl8IFNEX0JBTEFOQ0VfTkVXSURMRQlcCiAJCQkJfCBTRF9XQUtFX0lETEUJCVwKKwkJCQl8IFNEX1NFUklBTElaRQkJXAogCQkJCXwgU0RfV0FLRV9CQUxBTkNFLAlcCiAJLmxhc3RfYmFsYW5jZQkJPSBqaWZmaWVzLAkJXAogCS5iYWxhbmNlX2ludGVydmFsCT0gMSwJCQlcCkBAIC05Niw3ICsxMDQsMTMgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KLSNkZWZpbmUgc210X2NhcGFibGUoKSAJCShjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQorI2RlZmluZSBzbXRfY2FwYWJsZSgpCQkoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU01UKSkKKworI2lmZGVmIENPTkZJR19QUEM2NAorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKworI2RlZmluZSB0b3BvbG9neV90aHJlYWRfc2libGluZ3MoY3B1KQkoY3B1X3NpYmxpbmdfbWFwW2NwdV0pCisjZW5kaWYKICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90c2kxMDguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdHNpMTA4LmgKaW5kZXggMmM3MDJkMy4uNGU5NWQxNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy90c2kxMDguaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RzaTEwOC5oCkBAIC05OCwxMiArOTgsMTIgQEAKIGV4dGVybiB1MzIgZ2V0X3Zpcl9jc3JiYXNlKHZvaWQpOwogZXh0ZXJuIHUzMiB0c2kxMDhfY3NyX3Zpcl9iYXNlOwogCi1leHRlcm4gaW5saW5lIHUzMiB0c2kxMDhfcmVhZF9yZWcodTMyIHJlZ19vZmZzZXQpCitzdGF0aWMgaW5saW5lIHUzMiB0c2kxMDhfcmVhZF9yZWcodTMyIHJlZ19vZmZzZXQpCiB7CiAJcmV0dXJuIGluX2JlMzIoKHZvbGF0aWxlIHUzMiAqKSh0c2kxMDhfY3NyX3Zpcl9iYXNlICsgcmVnX29mZnNldCkpOwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgdHNpMTA4X3dyaXRlX3JlZyh1MzIgcmVnX29mZnNldCwgdTMyIHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0c2kxMDhfd3JpdGVfcmVnKHUzMiByZWdfb2Zmc2V0LCB1MzIgdmFsKQogewogCW91dF9iZTMyKCh2b2xhdGlsZSB1MzIgKikodHNpMTA4X2Nzcl92aXJfYmFzZSArIHJlZ19vZmZzZXQpLCB2YWwpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90eXBlcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90eXBlcy5oCmluZGV4IGQ2ZmI1NmIuLjNiMzYzNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3R5cGVzLmgKQEAgLTk3LDE2ICs5Nyw2IEBACiAJdW5zaWduZWQgbG9uZyBlbnY7CiB9IGZ1bmNfZGVzY3JfdDsKIAotI2lmZGVmIENPTkZJR19MQkQKLXR5cGVkZWYgdTY0IHNlY3Rvcl90OwotI2RlZmluZSBIQVZFX1NFQ1RPUl9UCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19MU0YKLXR5cGVkZWYgdTY0IGJsa2NudF90OwotI2RlZmluZSBIQVZFX0JMS0NOVF9UCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VhY2Nlc3MuaAppbmRleCBkODNmYzI5Li5hZGJmMTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VhY2Nlc3MuaApAQCAtMzA0LDcgKzMwNCw3IEBACiAKICNpZm5kZWYgX19wb3dlcnBjNjRfXwogCi1leHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sCiAJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJdW5zaWduZWQgbG9uZyBvdmVyOwpAQCAtMzE5LDcgKzMxOSw3IEBACiAJcmV0dXJuIG47CiB9CiAKLWV4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sCiAJCWNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAl1bnNpZ25lZCBsb25nIG92ZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy91bmlzdGQuaAppbmRleCA0NjRhNDhjLi4wYWU5NTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdW5pc3RkLmgKQEAgLTI3Niw3ICsyNzYsNyBAQAogI2RlZmluZSBfX05SX3J0YXMJCTI1NQogI2RlZmluZSBfX05SX3N5c19kZWJ1Z19zZXRjb250ZXh0IDI1NgogLyogTnVtYmVyIDI1NyBpcyByZXNlcnZlZCBmb3IgdnNlcnZlciAqLwotLyogMjU4IGN1cnJlbnRseSB1bnVzZWQgKi8KKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTI1OAogI2RlZmluZSBfX05SX21iaW5kCQkyNTkKICNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CTI2MAogI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJMjYxCkBAIC0zMjMsMTI5ICszMjMsMjAgQEAKICNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCTI5OAogI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdAkyOTkKICNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJMzAwCisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzAxCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgX19OUl9zeXNjYWxscwkJMzAxCisjZGVmaW5lIF9fTlJfc3lzY2FsbHMJCTMwMgogCiAjZGVmaW5lIF9fTlJfX2V4aXQgX19OUl9leGl0CiAjZGVmaW5lIE5SX3N5c2NhbGxzCV9fTlJfc3lzY2FsbHMKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotLyogT24gcG93ZXJwYyBhIHN5c3RlbSBjYWxsIGJhc2ljYWxseSBjbG9iYmVycyB0aGUgc2FtZSByZWdpc3RlcnMgbGlrZSBhCi0gKiBmdW5jdGlvbiBjYWxsLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgTFIgKHdoaWNoIGlzIG5lZWRlZCBmb3IgdGhlCi0gKiAic2M7IGJuc2xyIiBzZXF1ZW5jZSkgYW5kIENSICh3aGVyZSBvbmx5IENSMC5TTyBpcyBjbG9iYmVyZWQgdG8gc2lnbmFsCi0gKiBhbiBlcnJvciByZXR1cm4gc3RhdHVzKS4KLSAqLwotCi0jZGVmaW5lIF9fc3lzY2FsbF9ucihuciwgdHlwZSwgbmFtZSwgYXJncy4uLikJCQkJXAotCXVuc2lnbmVkIGxvbmcgX19zY19yZXQsIF9fc2NfZXJyOwkJCQlcCi0JewkJCQkJCQkJXAotCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2NfMCAgX19hc21fXyAoInIwIik7CQlcCi0JCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zY18zICBfX2FzbV9fICgicjMiKTsJCVwKLQkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjXzQgIF9fYXNtX18gKCJyNCIpOwkJXAotCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2NfNSAgX19hc21fXyAoInI1Iik7CQlcCi0JCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zY182ICBfX2FzbV9fICgicjYiKTsJCVwKLQkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjXzcgIF9fYXNtX18gKCJyNyIpOwkJXAotCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2NfOCAgX19hc21fXyAoInI4Iik7CQlcCi0JCQkJCQkJCQlcCi0JCV9fc2NfbG9hZGFyZ3NfIyNucihuYW1lLCBhcmdzKTsJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXwkJCQkJXAotCQkJKCJzYyAgICAgICAgICAgXG5cdCIJCQkJXAotCQkJICJtZmNyICUwICAgICAgIgkJCQlcCi0JCQk6ICI9JnIiIChfX3NjXzApLAkJCQlcCi0JCQkgICI9JnIiIChfX3NjXzMpLCAgIj0mciIgKF9fc2NfNCksCQlcCi0JCQkgICI9JnIiIChfX3NjXzUpLCAgIj0mciIgKF9fc2NfNiksCQlcCi0JCQkgICI9JnIiIChfX3NjXzcpLCAgIj0mciIgKF9fc2NfOCkJCVwKLQkJCTogX19zY19hc21faW5wdXRfIyNucgkJCQlcCi0JCQk6ICJjcjAiLCAiY3RyIiwgIm1lbW9yeSIsCQkJXAotCQkJICAicjkiLCAicjEwIiwicjExIiwgInIxMiIpOwkJCVwKLQkJX19zY19yZXQgPSBfX3NjXzM7CQkJCQlcCi0JCV9fc2NfZXJyID0gX19zY18wOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlpZiAoX19zY19lcnIgJiAweDEwMDAwMDAwKQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJZXJybm8gPSBfX3NjX3JldDsJCQkJCVwKLQkJX19zY19yZXQgPSAtMTsJCQkJCQlcCi0JfQkJCQkJCQkJXAotCXJldHVybiAodHlwZSkgX19zY19yZXQKLQotI2RlZmluZSBfX3NjX2xvYWRhcmdzXzAobmFtZSwgZHVtbXkuLi4pCQkJCQlcCi0JX19zY18wID0gX19OUl8jI25hbWUKLSNkZWZpbmUgX19zY19sb2FkYXJnc18xKG5hbWUsIGFyZzEpCQkJCQlcCi0JX19zY19sb2FkYXJnc18wKG5hbWUpOwkJCQkJCVwKLQlfX3NjXzMgPSAodW5zaWduZWQgbG9uZykgKGFyZzEpCi0jZGVmaW5lIF9fc2NfbG9hZGFyZ3NfMihuYW1lLCBhcmcxLCBhcmcyKQkJCQlcCi0JX19zY19sb2FkYXJnc18xKG5hbWUsIGFyZzEpOwkJCQkJXAotCV9fc2NfNCA9ICh1bnNpZ25lZCBsb25nKSAoYXJnMikKLSNkZWZpbmUgX19zY19sb2FkYXJnc18zKG5hbWUsIGFyZzEsIGFyZzIsIGFyZzMpCQkJCVwKLQlfX3NjX2xvYWRhcmdzXzIobmFtZSwgYXJnMSwgYXJnMik7CQkJCVwKLQlfX3NjXzUgPSAodW5zaWduZWQgbG9uZykgKGFyZzMpCi0jZGVmaW5lIF9fc2NfbG9hZGFyZ3NfNChuYW1lLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KQkJCVwKLQlfX3NjX2xvYWRhcmdzXzMobmFtZSwgYXJnMSwgYXJnMiwgYXJnMyk7CQkJXAotCV9fc2NfNiA9ICh1bnNpZ25lZCBsb25nKSAoYXJnNCkKLSNkZWZpbmUgX19zY19sb2FkYXJnc181KG5hbWUsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpCQlcCi0JX19zY19sb2FkYXJnc180KG5hbWUsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwkJCVwKLQlfX3NjXzcgPSAodW5zaWduZWQgbG9uZykgKGFyZzUpCi0jZGVmaW5lIF9fc2NfbG9hZGFyZ3NfNihuYW1lLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2KQlcCi0JX19zY19sb2FkYXJnc181KG5hbWUsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwkJXAotCV9fc2NfOCA9ICh1bnNpZ25lZCBsb25nKSAoYXJnNikKLQotI2RlZmluZSBfX3NjX2FzbV9pbnB1dF8wICIwIiAoX19zY18wKQotI2RlZmluZSBfX3NjX2FzbV9pbnB1dF8xIF9fc2NfYXNtX2lucHV0XzAsICIxIiAoX19zY18zKQotI2RlZmluZSBfX3NjX2FzbV9pbnB1dF8yIF9fc2NfYXNtX2lucHV0XzEsICIyIiAoX19zY180KQotI2RlZmluZSBfX3NjX2FzbV9pbnB1dF8zIF9fc2NfYXNtX2lucHV0XzIsICIzIiAoX19zY181KQotI2RlZmluZSBfX3NjX2FzbV9pbnB1dF80IF9fc2NfYXNtX2lucHV0XzMsICI0IiAoX19zY182KQotI2RlZmluZSBfX3NjX2FzbV9pbnB1dF81IF9fc2NfYXNtX2lucHV0XzQsICI1IiAoX19zY183KQotI2RlZmluZSBfX3NjX2FzbV9pbnB1dF82IF9fc2NfYXNtX2lucHV0XzUsICI2IiAoX19zY184KQotCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLG5hbWUpCQkJCQkJXAotdHlwZSBuYW1lKHZvaWQpCQkJCQkJCQlcCi17CQkJCQkJCQkJXAotCV9fc3lzY2FsbF9ucigwLCB0eXBlLCBuYW1lKTsJCQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUxLGFyZzEpCQkJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSkJCQkJCQkJXAotewkJCQkJCQkJCVwKLQlfX3N5c2NhbGxfbnIoMSwgdHlwZSwgbmFtZSwgYXJnMSk7CQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMikJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSwgdHlwZTIgYXJnMikJCQkJCVwKLXsJCQkJCQkJCQlcCi0JX19zeXNjYWxsX25yKDIsIHR5cGUsIG5hbWUsIGFyZzEsIGFyZzIpOwkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDModHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczKQkJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMpCQkJCVwKLXsJCQkJCQkJCQlcCi0JX19zeXNjYWxsX25yKDMsIHR5cGUsIG5hbWUsIGFyZzEsIGFyZzIsIGFyZzMpOwkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDQodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQpIFwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0KQkJXAotewkJCQkJCQkJCVwKLQlfX3N5c2NhbGxfbnIoNCwgdHlwZSwgbmFtZSwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7CQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw1KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LHR5cGU1LGFyZzUpIFwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0LCB0eXBlNSBhcmc1KQlcCi17CQkJCQkJCQkJXAotCV9fc3lzY2FsbF9ucig1LCB0eXBlLCBuYW1lLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsJXAotfQotI2RlZmluZSBfc3lzY2FsbDYodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsdHlwZTUsYXJnNSx0eXBlNixhcmc2KSBcCi10eXBlIG5hbWUodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCwgdHlwZTUgYXJnNSwgdHlwZTYgYXJnNikgXAotewkJCQkJCQkJCVwKLQlfX3N5c2NhbGxfbnIoNiwgdHlwZSwgbmFtZSwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7IFwKLX0KLQotCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgpAQCAtNDgwLDE2ICszNzEsOSBAQAogCiAvKgogICogIkNvbmRpdGlvbmFsIiBzeXNjYWxscwotICoKLSAqIFdoYXQgd2Ugd2FudCBpcyBfX2F0dHJpYnV0ZV9fKCh3ZWFrLGFsaWFzKCJzeXNfbmlfc3lzY2FsbCIpKSksCi0gKiBidXQgaXQgZG9lc24ndCB3b3JrIG9uIGFsbCB0b29sY2hhaW5zLCBzbyB3ZSBqdXN0IGRvIGl0IGJ5IGhhbmQKICAqLwotI2lmZGVmIENPTkZJR19QUEMzMgotI2RlZmluZSBjb25kX3N5c2NhbGwoeCkgYXNtKCIud2Vha1x0IiAjeCAiXG5cdC5zZXRcdCIgI3ggIixzeXNfbmlfc3lzY2FsbCIpCi0jZWxzZQotI2RlZmluZSBjb25kX3N5c2NhbGwoeCkgYXNtKCIud2Vha1x0LiIgI3ggIlxuXHQuc2V0XHQuIiAjeCAiLC5zeXNfbmlfc3lzY2FsbCIpCi0jZW5kaWYKLQorI2RlZmluZSBjb25kX3N5c2NhbGwoeCkgXAorCWFzbWxpbmthZ2UgbG9uZyB4ICh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLGFsaWFzKCJzeXNfbmlfc3lzY2FsbCIpKSkKIAogI2VuZGlmCQkvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkJLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdmlvLmgKaW5kZXggNGI1MWQ0Mi4uMDExN2I1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zpby5oCkBAIC00NSw3ICs0NSw2IEBACiAgKiBUaGUgdmlvX2RldiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSB2aXJ0dWFsIEkvTyBkZXZpY2VzLgogICovCiBzdHJ1Y3QgdmlvX2RldiB7Ci0Jc3RydWN0IGlvbW11X3RhYmxlICppb21tdV90YWJsZTsgICAgIC8qIHZpb19tYXBfKiB1c2VzIHRoaXMgKi8KIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IGNoYXIgKnR5cGU7CiAJdWludDMyX3QgdW5pdF9hZGRyZXNzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy94bW9uLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3htb24uaAppbmRleCBmMWQzMzdlLi44ODMyMGEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3htb24uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3htb24uaApAQCAtMTQsOCArMTQsMTAgQEAKIAogI2lmZGVmIENPTkZJR19YTU9OCiBleHRlcm4gdm9pZCB4bW9uX3NldHVwKHZvaWQpOworZXh0ZXJuIHZvaWQgeG1vbl9yZWdpc3Rlcl9zcHVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB4bW9uX3NldHVwKHZvaWQpIHsgfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bW9uX3JlZ2lzdGVyX3NwdXMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkgeyB9OwogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTCBfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2RldmljZS5oIGIvaW5jbHVkZS9hc20tcHBjL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2hpZ2htZW0uaCBiL2luY2x1ZGUvYXNtLXBwYy9oaWdobWVtLmgKaW5kZXggMWQyYzRlZi4uZjdiMjFlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvaGlnaG1lbS5oCkBAIC03OSw3ICs3OSw3IEBACiAJdW5zaWduZWQgbG9uZyB2YWRkcjsKIAogCS8qIGV2ZW4gIUNPTkZJR19QUkVFTVBUIG5lZWRzIHRoaXMsIGZvciBpbl9hdG9taWMgaW4gZG9fcGFnZV9mYXVsdCAqLwotCWluY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKIAlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKQogCQlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCkBAIC0xMDEsOCArMTAxLDcgQEAKIAl1bnNpZ25lZCBpbnQgaWR4ID0gdHlwZSArIEtNX1RZUEVfTlIqc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJaWYgKHZhZGRyIDwgS01BUF9GSVhfQkVHSU4pIHsgLy8gRklYTUUKLQkJZGVjX3ByZWVtcHRfY291bnQoKTsKLQkJcHJlZW1wdF9jaGVja19yZXNjaGVkKCk7CisJCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTE1LDggKzExNCw3IEBACiAJcHRlX2NsZWFyKCZpbml0X21tLCB2YWRkciwga21hcF9wdGUraWR4KTsKIAlmbHVzaF90bGJfcGFnZShOVUxMLCB2YWRkcik7CiAjZW5kaWYKLQlkZWNfcHJlZW1wdF9jb3VudCgpOwotCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqa21hcF9hdG9taWNfdG9fcGFnZSh2b2lkICpwdHIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvaW8uaCBiL2luY2x1ZGUvYXNtLXBwYy9pby5oCmluZGV4IGE0YzQxMWIuLmNjZjFhOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9pby5oCkBAIC0yNiwxNyArMjYsMTEgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHXzR4eCkKICNpbmNsdWRlIDxhc20vaWJtNHh4Lmg+Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19QUENfTVBDNTJ4eCkKLSNpbmNsdWRlIDxhc20vbXBjNTJ4eC5oPgogI2VsaWYgZGVmaW5lZChDT05GSUdfOHh4KQogI2luY2x1ZGUgPGFzbS9tcGM4eHguaD4KICNlbGlmIGRlZmluZWQoQ09ORklHXzgyNjApCiAjaW5jbHVkZSA8YXNtL21wYzgyNjAuaD4KLSNlbGlmIGRlZmluZWQoQ09ORklHXzgzeHgpCi0jaW5jbHVkZSA8YXNtL21wYzgzeHguaD4KLSNlbGlmIGRlZmluZWQoQ09ORklHXzg1eHgpCi0jaW5jbHVkZSA8YXNtL21wYzg1eHguaD4KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FQVVMpCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUFVTKSB8fCAhZGVmaW5lZChDT05GSUdfUENJKQogI2RlZmluZSBfSU9fQkFTRQkwCiAjZGVmaW5lIF9JU0FfTUVNX0JBU0UJMAogI2RlZmluZSBQQ0lfRFJBTV9PRkZTRVQgMApAQCAtMjM3LDYgKzIzMSwxNCBAQAogI2RlZmluZSBpbnNsKHBvcnQsIGJ1ZiwgbmwpCV9pbnNsX25zKChwb3J0KStfX19JT19CQVNFLCAoYnVmKSwgKG5sKSkKICNkZWZpbmUgb3V0c2wocG9ydCwgYnVmLCBubCkJX291dHNsX25zKChwb3J0KStfX19JT19CQVNFLCAoYnVmKSwgKG5sKSkKIAorI2RlZmluZSByZWFkc2IoYSwgYiwgbikJCV9pbnNiKChhKSwgKGIpLCAobikpCisjZGVmaW5lIHJlYWRzdyhhLCBiLCBuKQkJX2luc3dfbnMoKGEpLCAoYiksIChuKSkKKyNkZWZpbmUgcmVhZHNsKGEsIGIsIG4pCQlfaW5zbF9ucygoYSksIChiKSwgKG4pKQorI2RlZmluZSB3cml0ZXNiKGEsIGIsIG4pCV9vdXRzYigoYSksKGIpLChuKSkKKyNkZWZpbmUgd3JpdGVzdyhhLCBiLCBuKQlfb3V0c3dfbnMoKGEpLChiKSwobikpCisjZGVmaW5lIHdyaXRlc2woYSwgYiwgbikJX291dHNsX25zKChhKSwoYiksKG4pKQorCisKIC8qCiAgKiBPbiBwb3dlcm1hY3MgYW5kIDh4eCB3ZSB3aWxsIGdldCBhIG1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIAogICogaWYgd2UgdHJ5IHRvIHJlYWQgZGF0YSBmcm9tIGEgbm9uLWV4aXN0ZW50IEkvTyBwb3J0LiBCZWNhdXNlCkBAIC0zMjcsMTIgKzMyOSwxMiBAQAogI2RlZmluZSBpbmxfcChwb3J0KQkJaW5sKChwb3J0KSkKICNkZWZpbmUgb3V0bF9wKHZhbCwgcG9ydCkJb3V0bCgodmFsKSwgKHBvcnQpKQogCi1leHRlcm4gdm9pZCBfaW5zYih2b2xhdGlsZSB1OCBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgX291dHNiKHZvbGF0aWxlIHU4IF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBfaW5zd19ucyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIF9vdXRzd19ucyh2b2xhdGlsZSB1MTYgX19pb21lbSAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIF9pbnNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgX291dHNsX25zKHZvbGF0aWxlIHUzMiBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgX2luc2IoY29uc3Qgdm9sYXRpbGUgdTggX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIF9vdXRzYih2b2xhdGlsZSB1OCBfX2lvbWVtICphZGRyLGNvbnN0IHZvaWQgKmJ1Zixsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIF9pbnN3X25zKGNvbnN0IHZvbGF0aWxlIHUxNiBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgX291dHN3X25zKHZvbGF0aWxlIHUxNiBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgX2luc2xfbnMoY29uc3Qgdm9sYXRpbGUgdTMyIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBfb3V0c2xfbnModm9sYXRpbGUgdTMyIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgbG9uZyBjb3VudCk7CiAKIAogI2RlZmluZSBJT19TUEFDRV9MSU1JVCB+MApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL200OHQzNS5oIGIvaW5jbHVkZS9hc20tcHBjL200OHQzNS5oCmluZGV4IGYzYzVlNWQuLmE1Mjc3ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tNDh0MzUuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbTQ4dDM1LmgKQEAgLTM5LDcgKzM5LDcgQEAKICNkZWZpbmUgTTQ4VDM1X1JUQ19XQVRDSERPR19SQiAgICAgICAgIDB4MDMKICNkZWZpbmUgTTQ4VDM1X1JUQ19XQVRDSERPR19CTUIgICAgICAgIDB4N2MKICNkZWZpbmUgTTQ4VDM1X1JUQ19XQVRDSERPR19XRFMgICAgICAgIDB4ODAKLSNkZWZpbmUgTTQ4VDM1X1JUQ19XQVRDSERPR19BTEwgICAgICAgIChNNDhUMzVfUlRDX1dBVENIRE9HX1JCfE00OFQzNV9SVENfV0FUQ0hET0dfQk1CfE00OFQzNV9SVENfVworI2RlZmluZSBNNDhUMzVfUlRDX1dBVENIRE9HX0FMTCAgICAgICAgKE00OFQzNV9SVENfV0FUQ0hET0dfUkJ8TTQ4VDM1X1JUQ19XQVRDSERPR19CTUJ8TTQ4VDM1X1JUQ19XKQogCiAjZGVmaW5lIE00OFQzNV9SVENfQ09OVFJPTF9XUklURSAgICAgICAweDgwCiAjZGVmaW5lIE00OFQzNV9SVENfQ09OVFJPTF9SRUFEICAgICAgICAweDQwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbXBjNTJ4eC5oIGIvaW5jbHVkZS9hc20tcHBjL21wYzUyeHguaAppbmRleCA2NGM4ODc0Li5kOWQyMWFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbXBjNTJ4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tcGM1Mnh4LmgKQEAgLTI5LDE3ICsyOSw2IEBACiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKIAotI2lmZGVmIENPTkZJR19QQ0kKLSNkZWZpbmUgX0lPX0JBU0UJaXNhX2lvX2Jhc2UKLSNkZWZpbmUgX0lTQV9NRU1fQkFTRQlpc2FfbWVtX2Jhc2UKLSNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUCXBjaV9kcmFtX29mZnNldAotI2Vsc2UKLSNkZWZpbmUgX0lPX0JBU0UJMAotI2RlZmluZSBfSVNBX01FTV9CQVNFCTAKLSNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUCTAKLSNlbmRpZgotCi0KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogUFBDIFN5cyBkZXZpY2VzIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tcGM4M3h4LmggYi9pbmNsdWRlL2FzbS1wcGMvbXBjODN4eC5oCmluZGV4IDAyZWQyYzMuLmMzMDYxOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tcGM4M3h4LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL21wYzgzeHguaApAQCAtMjUsMTQgKzI1LDYgQEAKICNpbmNsdWRlIDxwbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5oPgogI2VuZGlmCiAKLSNkZWZpbmUgX0lPX0JBU0UgICAgICAgIGlzYV9pb19iYXNlCi0jZGVmaW5lIF9JU0FfTUVNX0JBU0UgICBpc2FfbWVtX2Jhc2UKLSNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVCBwY2lfZHJhbV9vZmZzZXQKLSNlbHNlCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVCAwCi0jZW5kaWYKLQogLyoKICAqIFRoZSAicmVzaWR1YWwiIGJvYXJkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB0aGUgYm9vdCBsb2FkZXIgcGFzc2VzCiAgKiBpbnRvIHRoZSBrZXJuZWwuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbXBjODV4eC5oIGIvaW5jbHVkZS9hc20tcHBjL21wYzg1eHguaAppbmRleCA5YjQ4NTExLi5kN2U0YTc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbXBjODV4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tcGM4NXh4LmgKQEAgLTQ0LDE0ICs0NCw2IEBACiAjaW5jbHVkZSA8cGxhdGZvcm1zLzg1eHgvdHFtODV4eC5oPgogI2VuZGlmCiAKLSNkZWZpbmUgX0lPX0JBU0UgICAgICAgIGlzYV9pb19iYXNlCi0jZGVmaW5lIF9JU0FfTUVNX0JBU0UgICBpc2FfbWVtX2Jhc2UKLSNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVCBwY2lfZHJhbV9vZmZzZXQKLSNlbHNlCi0jZGVmaW5lIFBDSV9EUkFNX09GRlNFVCAwCi0jZW5kaWYKLQogLyoKICAqIFRoZSAicmVzaWR1YWwiIGJvYXJkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB0aGUgYm9vdCBsb2FkZXIgcGFzc2VzCiAgKiBpbnRvIHRoZSBrZXJuZWwuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcGNpLWJyaWRnZS5oIGIvaW5jbHVkZS9hc20tcHBjL3BjaS1icmlkZ2UuaAppbmRleCA5ZDUyMzA2Li40ZDM1Yjg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvcGNpLWJyaWRnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wY2ktYnJpZGdlLmgKQEAgLTIwLDggKzIwLDggQEAKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcih2b2lkKTsKIAogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIHJlc291cmNlcyAqLwotZXh0ZXJuIHZvaWQgcGNpX2luaXRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGVuZCwgaW50IGZsYWdzLCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIHBjaV9pbml0X3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCByZXNvdXJjZV9zaXplX3Qgc3RhcnQsCisJCQkgICAgICByZXNvdXJjZV9zaXplX3QgZW5kLCBpbnQgZmxhZ3MsIGNoYXIgKm5hbWUpOwogCiAvKiBHZXQgdGhlIFBDSSBob3N0IGNvbnRyb2xsZXIgZm9yIGEgYnVzICovCiBleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfYnVzX3RvX2hvc2UoaW50IGJ1cyk7CkBAIC00MywxOCArNDMsMTkgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKm5leHQ7CiAgICAgICAgIHN0cnVjdCBwY2lfYnVzICpidXM7CiAJdm9pZCAqYXJjaF9kYXRhOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKIAogCWludCBmaXJzdF9idXNubzsKIAlpbnQgbGFzdF9idXNubzsKIAlpbnQgYnVzX29mZnNldDsKIAogCXZvaWQgX19pb21lbSAqaW9fYmFzZV92aXJ0OwotCXVuc2lnbmVkIGxvbmcgaW9fYmFzZV9waHlzOworCXJlc291cmNlX3NpemVfdCBpb19iYXNlX3BoeXM7CiAKIAkvKiBTb21lIG1hY2hpbmVzIChQUmVQKSBoYXZlIGEgbm9uIDE6MSBtYXBwaW5nIG9mCiAJICogdGhlIFBDSSBtZW1vcnkgc3BhY2UgaW4gdGhlIENQVSBidXMgc3BhY2UKIAkgKi8KLQl1bnNpZ25lZCBsb25nIHBjaV9tZW1fb2Zmc2V0OworCXJlc291cmNlX3NpemVfdCBwY2lfbWVtX29mZnNldDsKIAogCXN0cnVjdCBwY2lfb3BzICpvcHM7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50IF9faW9tZW0gKmNmZ19hZGRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3BjaS5oIGIvaW5jbHVkZS9hc20tcHBjL3BjaS5oCmluZGV4IDExZmZhYWEuLjlkMTYyMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcGNpLmgKQEAgLTYxLDYgKzYxLDI3IEBACiAgKi8KICNkZWZpbmUgUENJX0RNQV9CVVNfSVNfUEhZUyAgICAgKDEpCiAKKyNpZmRlZiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFCisvKgorICogcGNpX3VubWFwX3twYWdlLHNpbmdsZX0gYXJlIE5PUHMgYnV0IHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSgpCisgKiBhbmQgc28gb24gYXJlIG5vdCwgc28uLi4KKyAqLworCisjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0FERFIoQUREUl9OQU1FKQlcCisJZG1hX2FkZHJfdCBBRERSX05BTUU7CisjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0xFTihMRU5fTkFNRSkJCVwKKwlfX3UzMiBMRU5fTkFNRTsKKyNkZWZpbmUgcGNpX3VubWFwX2FkZHIoUFRSLCBBRERSX05BTUUpCQkJXAorCSgoUFRSKS0+QUREUl9OQU1FKQorI2RlZmluZSBwY2lfdW5tYXBfYWRkcl9zZXQoUFRSLCBBRERSX05BTUUsIFZBTCkJCVwKKwkoKChQVFIpLT5BRERSX05BTUUpID0gKFZBTCkpCisjZGVmaW5lIHBjaV91bm1hcF9sZW4oUFRSLCBMRU5fTkFNRSkJCQlcCisJKChQVFIpLT5MRU5fTkFNRSkKKyNkZWZpbmUgcGNpX3VubWFwX2xlbl9zZXQoUFRSLCBMRU5fTkFNRSwgVkFMKQkJXAorCSgoKFBUUiktPkxFTl9OQU1FKSA9IChWQUwpKQorCisjZWxzZSAvKiBjb2hlcmVudCAqLworCiAvKiBwY2lfdW5tYXBfe3BhZ2Usc2luZ2xlfSBpcyBhIG5vcCBzby4uLiAqLwogI2RlZmluZSBERUNMQVJFX1BDSV9VTk1BUF9BRERSKEFERFJfTkFNRSkKICNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfTEVOKExFTl9OQU1FKQpAQCAtNjksNiArOTAsOCBAQAogI2RlZmluZSBwY2lfdW5tYXBfbGVuKFBUUiwgTEVOX05BTUUpCQkoMCkKICNkZWZpbmUgcGNpX3VubWFwX2xlbl9zZXQoUFRSLCBMRU5fTkFNRSwgVkFMKQlkbyB7IH0gd2hpbGUgKDApCiAKKyNlbmRpZiAvKiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFICovCisKICNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcmVnX2Jvb2tlLmggYi9pbmNsdWRlL2FzbS1wcGMvcmVnX2Jvb2tlLmgKaW5kZXggNjAyZmJhZC4uYTI2M2ZjMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9yZWdfYm9va2UuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcmVnX2Jvb2tlLmgKQEAgLTksNDEgKzksOSBAQAogI2lmbmRlZiBfX0FTTV9QUENfUkVHX0JPT0tFX0hfXwogI2RlZmluZSBfX0FTTV9QUENfUkVHX0JPT0tFX0hfXwogCisjaW5jbHVkZSA8YXNtL2Rjci5oPgorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwotLyogRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXJzICovCi12b2lkIF9fbXRkY3IoaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCk7Ci11bnNpZ25lZCBpbnQgX19tZmRjcihpbnQgcmVnKTsKLSNkZWZpbmUgbWZkY3Iocm4pCQkJCQkJXAotCSh7dW5zaWduZWQgaW50IHJ2YWw7CQkJCQlcCi0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHJuKSkJCQkJXAotCQlhc20gdm9sYXRpbGUoIm1mZGNyICUwLCIgX19zdHJpbmdpZnkocm4pCVwKLQkJICAgICAgICAgICAgICA6ICI9ciIgKHJ2YWwpKTsJCQlcCi0JZWxzZQkJCQkJCQlcCi0JCXJ2YWwgPSBfX21mZGNyKHJuKTsJCQkJXAotCXJ2YWw7fSkKLQotI2RlZmluZSBtdGRjcihybiwgdikJCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHJuKSkJCQkJXAotCQlhc20gdm9sYXRpbGUoIm10ZGNyICIgX19zdHJpbmdpZnkocm4pICIsJTAiCVwKLQkJCSAgICAgIDogOiAiciIgKHYpKTsgCQkJXAotCWVsc2UJCQkJCQkJXAotCQlfX210ZGNyKHJuLCB2KTsJCQkJCVwKLX0gd2hpbGUgKDApCi0KLS8qIFIvVyBvZiBpbmRpcmVjdCBEQ1JzIG1ha2UgdXNlIG9mIHN0YW5kYXJkIG5hbWluZyBjb252ZW50aW9ucyBmb3IgRENScyAqLwotI2RlZmluZSBtZmRjcmkoYmFzZSwgcmVnKQkJCVwKLSh7CQkJCQkJXAotCW10ZGNyKGJhc2UgIyMgX0NGR0FERFIsIGJhc2UgIyMgXyAjIyByZWcpOwlcCi0JbWZkY3IoYmFzZSAjIyBfQ0ZHREFUQSk7CQkJXAotfSkKLQotI2RlZmluZSBtdGRjcmkoYmFzZSwgcmVnLCBkYXRhKQkJCVwKLWRvIHsJCQkJCQlcCi0JbXRkY3IoYmFzZSAjIyBfQ0ZHQUREUiwgYmFzZSAjIyBfICMjIHJlZyk7CVwKLQltdGRjcihiYXNlICMjIF9DRkdEQVRBLCBkYXRhKTsJCVwKLX0gd2hpbGUgKDApCi0KIC8qIFBlcmZvcm1hbmNlIE1vbml0b3IgUmVnaXN0ZXJzICovCiAjZGVmaW5lIG1mcG1yKHJuKQkoe3Vuc2lnbmVkIGludCBydmFsOyBcCiAJCQlhc20gdm9sYXRpbGUoIm1mcG1yICUwLCIgX19zdHJpbmdpZnkocm4pIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tczM5MC9jYWNoZWZsdXNoLmgKaW5kZXggZTM5OWE4Yi4uZjdjYWRlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9jYWNoZWZsdXNoLmgKQEAgLTcsNiArNyw3IEBACiAvKiBDYWNoZXMgYXJlbid0IGJyYWluLWRlYWQgb24gdGhlIHMzOTAuICovCiAjZGVmaW5lIGZsdXNoX2NhY2hlX2FsbCgpCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9tbShtbSkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2NhY2hlX2R1cF9tbShtbSkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9wYWdlKHZtYSwgdm1hZGRyLCBwZm4pCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1zMzkwL2NoZWNrc3VtLmgKaW5kZXggMzdjMzYyZC4uMGEzY2Q3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY2hlY2tzdW0uaApAQCAtMjcsOCArMjcsOCBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMiBhc20oIjIiKSA9ICh1bnNpZ25lZCBsb25nKSBidWZmOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMyBhc20oIjMiKSA9ICh1bnNpZ25lZCBsb25nKSBsZW47CkBAIC00OSw5ICs0OSw5IEBACiAgKiBDb3B5IGZyb20gdXNlcnNwYWNlIGFuZCBjb21wdXRlIGNoZWNrc3VtLiAgSWYgd2UgY2F0Y2ggYW4gZXhjZXB0aW9uCiAgKiB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLAorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplcnJfcHRyKQogewogCWludCBtaXNzaW5nOwpAQCAtNjYsOCArNjYsOCBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrIChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrIChjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKIHsKICAgICAgICAgbWVtY3B5KGRzdCxzcmMsbGVuKTsKIAlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOwpAQCAtNzYsOCArNzYsNyBAQAogLyoKICAqICAgICAgRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0gd2l0aG91dCBhZGRpbmcgcHNldWRvIGhlYWRlcnMKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAotY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAjaWZuZGVmIF9fczM5MHhfXwogCXJlZ2lzdGVyX3BhaXIgcnA7CkBAIC0xMDAsNyArOTksNyBAQAogCQkiCXNybAklMCwxNlxuIgkvKiAlMCA9IEgrTCtDICovCiAJCTogIismZCIgKHN1bSkgOiA6ICJjYyIsICIyIiwgIjMiKTsKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQlyZXR1cm4gKCh1bnNpZ25lZCBzaG9ydCkgfnN1bSk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpIH5zdW07CiB9CiAKIC8qCkBAIC0xMDgsOCArMTA3LDcgQEAKICAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCiAgKgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0Ci1pcF9mYXN0X2NzdW0odW5zaWduZWQgY2hhciAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoaXBoLCBpaGwqNCwgMCkpOwogfQpAQCAtMTE4LDEwICsxMTYsMTAgQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMzItYml0IGNoZWNrc3VtCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IAotY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fd3N1bQorY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1bSkKKyAgICAgICAgICAgICAgICAgICBfX3dzdW0gc3VtKQogewogI2lmbmRlZiBfX3MzOTB4X18KIAlhc20gdm9sYXRpbGUoCkBAIC0xMzcsMTIgKzEzNSwxMiBAQAogCQkiMToiCiAJCTogIismZCIgKHN1bSkgOiAiZCIgKGRhZGRyKSA6ICJjYyIpOwogCWFzbSB2b2xhdGlsZSgKLQkJIglhbHIJJTAsJTFcbiIgLyogc3VtICs9IChsZW48PDE2KSArIChwcm90bzw8OCkgKi8KKwkJIglhbHIJJTAsJTFcbiIgLyogc3VtICs9IGxlbiArIHByb3RvICovCiAJCSIJYnJjCTEyLDJmXG4iCiAJCSIJYWhpCSUwLDFcbiIgIC8qIGFkZCBjYXJyeSAqLwogCQkiMjoiCiAJCTogIismZCIgKHN1bSkKLQkJOiAiZCIgKCgodW5zaWduZWQgaW50KSBsZW48PDE2KSArICh1bnNpZ25lZCBpbnQpIHByb3RvKQorCQk6ICJkIiAobGVuICsgcHJvdG8pCiAJCTogImNjIik7CiAjZWxzZSAvKiBfX3MzOTB4X18gKi8KIAlhc20gdm9sYXRpbGUoCkBAIC0xNTMsNyArMTUxLDcgQEAKIAkJIjA6CWFsZ3IJJTAsJTJcbiIgIC8qIHN1bSArPSBkYWRkciAqLwogCQkiCWJyYwkxMiwxZlxuIgogCQkiCWFnaGkJJTAsMVxuIiAgIC8qIGFkZCBjYXJyeSAqLwotCQkiMToJYWxnZnIJJTAsJTNcbiIgIC8qIHN1bSArPSAobGVuPDwxNikgKyBwcm90byAqLworCQkiMToJYWxnZnIJJTAsJTNcbiIgIC8qIHN1bSArPSBsZW4gKyBwcm90byAqLwogCQkiCWJyYwkxMiwyZlxuIgogCQkiCWFnaGkJJTAsMVxuIiAgIC8qIGFkZCBjYXJyeSAqLwogCQkiMjoJc3JsZwkwLCUwLDMyXG4iCkBAIC0xNjMsNyArMTYxLDcgQEAKIAkJIjM6CWxsZ2ZyCSUwLCUwIgogCQk6ICIrJmQiIChzdW0pCiAJCTogImQiIChzYWRkciksICJkIiAoZGFkZHIpLAotCQkgICJkIiAoKCh1bnNpZ25lZCBpbnQpIGxlbjw8MTYpICsgKHVuc2lnbmVkIGludCkgcHJvdG8pCisJCSAgImQiIChsZW4gKyBwcm90bykKIAkJOiAiY2MiLCAiMCIpOwogI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogCXJldHVybiBzdW07CkBAIC0xNzQsMTAgKzE3MiwxMCBAQAogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1bSkKKyAgICAgICAgICAgICAgICAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQpAQCAtMTg3LDggKzE4NSw3IEBACiAgKiBpbiBpY21wLmMKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0Ci1pcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2Npby5oIGIvaW5jbHVkZS9hc20tczM5MC9jaW8uaAppbmRleCA4MTI4N2Q4Li5kOTI3ODUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2Npby5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY2lvLmgKQEAgLTI3OCwxNyArMjc4LDE2IEBACiBzdGF0aWMgaW5saW5lIGludCBjY3dfZGV2X2lkX2lzX2VxdWFsKHN0cnVjdCBjY3dfZGV2X2lkICpkZXZfaWQxLAogCQkJCSAgICAgIHN0cnVjdCBjY3dfZGV2X2lkICpkZXZfaWQyKQogewotCXJldHVybiAhbWVtY21wKGRldl9pZDEsIGRldl9pZDIsIHNpemVvZihzdHJ1Y3QgY2N3X2Rldl9pZCkpOworCWlmICgoZGV2X2lkMS0+c3NpZCA9PSBkZXZfaWQyLT5zc2lkKSAmJgorCSAgICAoZGV2X2lkMS0+ZGV2bm8gPT0gZGV2X2lkMi0+ZGV2bm8pKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogZXh0ZXJuIGludCBkaWFnMjEwKHN0cnVjdCBkaWFnMjEwICphZGRyKTsKIAogZXh0ZXJuIHZvaWQgd2FpdF9jb25zX2Rldih2b2lkKTsKIAotZXh0ZXJuIHZvaWQgY2xlYXJfYWxsX3N1YmNoYW5uZWxzKHZvaWQpOwotCi1leHRlcm4gdm9pZCBjaW9fcmVzZXRfY2hhbm5lbF9wYXRocyh2b2lkKTsKLQogZXh0ZXJuIHZvaWQgY3NzX3NjaGVkdWxlX3JlcHJvYmUodm9pZCk7CiAKIGV4dGVybiB2b2lkIHJlaXBsX2Njd19kZXYoc3RydWN0IGNjd19kZXZfaWQgKmlkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY3BjbWQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvY3BjbWQuaAppbmRleCAxZmNmNjViLi40OGE5ZWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2NwY21kLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9jcGNtZC5oCkBAIC03LDggKzcsOCBAQAogICogICAgICAgICAgICAgICBDaHJpc3RpYW4gQm9ybnRyYWVnZXIgKGNib3JudHJhQGRlLmlibS5jb20pLAogICovCiAKLSNpZm5kZWYgX19DUENNRF9fCi0jZGVmaW5lIF9fQ1BDTURfXworI2lmbmRlZiBfQVNNX1MzOTBfQ1BDTURfSAorI2RlZmluZSBfQVNNX1MzOTBfQ1BDTURfSAogCiAvKgogICogdGhlIGxvd2xldmVsIGZ1bmN0aW9uIGZvciBjcGNtZApAQCAtMTYsOSArMTYsNiBAQAogICovCiBleHRlcm4gaW50IF9fY3BjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4sIGludCAqcmVzcG9uc2VfY29kZSk7CiAKLSNpZm5kZWYgX19zMzkweF9fCi0jZGVmaW5lIGNwY21kIF9fY3BjbWQKLSNlbHNlCiAvKgogICogY3BjbWQgaXMgdGhlIGluLWtlcm5lbCBpbnRlcmZhY2UgZm9yIGlzc3VpbmcgQ1AgY29tbWFuZHMKICAqCkBAIC0zMyw2ICszMCw1IEBACiAgKiBOT1RFOiBJZiB0aGUgcmVzcG9uc2UgYnVmZmVyIGlzIG5vdCBiZWxvdyAyIEdCLCBjcGNtZCBjYW4gc2xlZXAKICAqLwogZXh0ZXJuIGludCBjcGNtZChjb25zdCBjaGFyICpjbWQsIGNoYXIgKnJlc3BvbnNlLCBpbnQgcmxlbiwgaW50ICpyZXNwb25zZV9jb2RlKTsKLSNlbmRpZiAvKl9fczM5MHhfXyovCiAKLSNlbmRpZgorI2VuZGlmIC8qIF9BU01fUzM5MF9DUENNRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2Rhc2QuaCBiL2luY2x1ZGUvYXNtLXMzOTAvZGFzZC5oCmluZGV4IGMwNDJmOTUuLjYwNGY2OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvZGFzZC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvZGFzZC5oCkBAIC02OSwxMSArNjksMTMgQEAKICAqIDB4MDE6IHJlYWRvbmx5IChybykKICAqIDB4MDI6IHVzZSBkaWFnIGRpc2NpcGxpbmUgKGRpYWcpCiAgKiAweDA0OiBzZXQgdGhlIGRldmljZSBpbml0aWFsbHkgb25saW5lIChpbnRlcm5hbCB1c2Ugb25seSkKKyAqIDB4MDg6IGVuYWJsZSBFUlAgcmVsYXRlZCBsb2dnaW5nCiAgKi8KICNkZWZpbmUgREFTRF9GRUFUVVJFX0RFRkFVTFQJICAgICAweDAwCiAjZGVmaW5lIERBU0RfRkVBVFVSRV9SRUFET05MWQkgICAgIDB4MDEKICNkZWZpbmUgREFTRF9GRUFUVVJFX1VTRURJQUcJICAgICAweDAyCiAjZGVmaW5lIERBU0RfRkVBVFVSRV9JTklUSUFMX09OTElORSAgMHgwNAorI2RlZmluZSBEQVNEX0ZFQVRVUkVfRVJQTE9HCSAgICAgMHgwOAogCiAjZGVmaW5lIERBU0RfUEFSVE5fQklUUyAyCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1zMzkwL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAva2V4ZWMuaCBiL2luY2x1ZGUvYXNtLXMzOTAva2V4ZWMuaAppbmRleCBjZTI4ZGRkLi45YzM1YzhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2tleGVjLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9rZXhlYy5oCkBAIC0yNiw3ICsyNiw3IEBACiAKIC8qIE1heGltdW0gYWRkcmVzcyB3ZSBjYW4gdXNlIGZvciB0aGUgY29udHJvbCBwYWdlcyAqLwogLyogTm90IG1vcmUgdGhhbiAyR0IgKi8KLSNkZWZpbmUgS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQgKDE8PDMxKQorI2RlZmluZSBLRVhFQ19DT05UUk9MX01FTU9SWV9MSU1JVCAoMVVMPDwzMSkKIAogLyogQWxsb2NhdGUgb25lIHBhZ2UgZm9yIHRoZSBwZHAgYW5kIHRoZSBzZWNvbmQgZm9yIHRoZSBjb2RlICovCiAjZGVmaW5lIEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFIDQwOTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oIGIvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKaW5kZXggMDY1ODNlZC4uNzRmNzM4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKQEAgLTM2Miw2ICszNjIsMTQgQEAKIAlhc20gdm9sYXRpbGUoInNweCAlMCIgOiA6ICJtIiAoYWRkcmVzcykgOiAibWVtb3J5Iik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgX191MzIgc3RvcmVfcHJlZml4KHZvaWQpCit7CisJX191MzIgYWRkcmVzczsKKworCWFzbSB2b2xhdGlsZSgic3RweCAlMCIgOiAiPW0iIChhZGRyZXNzKSk7CisJcmV0dXJuIGFkZHJlc3M7Cit9CisKICNkZWZpbmUgX19QQU5JQ19NQUdJQyAgICAgICAgICAgMHhERUFEQzBERQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oIGIvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKaW5kZXggMzYzZWE3Ni4uMDVlYTZmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKQEAgLTEyNyw2ICsxMjcsMjYgQEAKIAlyZXR1cm4gc2tleTsKIH0KIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X3BmbjsKKworc3RhdGljIGlubGluZSBpbnQgcGZuX3ZhbGlkKHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXVuc2lnbmVkIGxvbmcgZHVtbXk7CisJaW50IGNjb2RlOworCisJaWYgKHBmbiA+PSBtYXhfcGZuKQorCQlyZXR1cm4gMDsKKworCWFzbSB2b2xhdGlsZSgKKwkJIglscmEJJTAsMCglMilcbiIKKwkJIglpcG0JJTFcbiIKKwkJIglzcmwJJTEsMjhcbiIKKwkJOiAiPWQiIChkdW1teSksICI9ZCIgKGNjb2RlKQorCQk6ICJhIiAocGZuIDw8IFBBR0VfU0hJRlQpCisJCTogImNjIik7CisJcmV0dXJuICFjY29kZTsKK30KKwogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAogLyogdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gdGhlIChuZXh0KSBwYWdlIGJvdW5kYXJ5ICovCkBAIC0xMzgsOCArMTU4LDYgQEAKICNkZWZpbmUgX192YSh4KSAgICAgICAgICAgICAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykoeCkKICNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQogI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkJKHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCi0KLSNkZWZpbmUgcGZuX3ZhbGlkKHBmbikJCSgocGZuKSA8IG1heF9tYXBucikKICNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKIAogI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MJKFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMgfCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcGdhbGxvYy5oCmluZGV4IDI4NjE5ZGUuLjA3MDdhN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcGdhbGxvYy5oCkBAIC0yNSw4ICsyNSwxMSBAQAogICogUGFnZSBhbGxvY2F0aW9uIG9yZGVycy4KICAqLwogI2lmbmRlZiBfX3MzOTB4X18KKyMgZGVmaW5lIFBURV9BTExPQ19PUkRFUgkwCisjIGRlZmluZSBQTURfQUxMT0NfT1JERVIJMAogIyBkZWZpbmUgUEdEX0FMTE9DX09SREVSCTEKICNlbHNlIC8qIF9fczM5MHhfXyAqLworIyBkZWZpbmUgUFRFX0FMTE9DX09SREVSCTAKICMgZGVmaW5lIFBNRF9BTExPQ19PUkRFUgkyCiAjIGRlZmluZSBQR0RfQUxMT0NfT1JERVIJMgogI2VuZGlmIC8qIF9fczM5MHhfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaAppbmRleCA1MTlmMGE1Li5hZTYxYWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaApAQCAtMTA3LDE1ICsxMDcsMjYgQEAKICAqIFRoZSB2bWFsbG9jKCkgcm91dGluZXMgbGVhdmVzIGEgaG9sZSBvZiA0a0IgYmV0d2VlbiBlYWNoIHZtYWxsb2NlZAogICogYXJlYSBmb3IgdGhlIHNhbWUgcmVhc29uLiA7KQogICovCitleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZDsKICNkZWZpbmUgVk1BTExPQ19PRkZTRVQgICg4KjEwMjQqMTAyNCkKICNkZWZpbmUgVk1BTExPQ19TVEFSVCAgICgoKHVuc2lnbmVkIGxvbmcpIGhpZ2hfbWVtb3J5ICsgVk1BTExPQ19PRkZTRVQpIFwKIAkJCSAmIH4oVk1BTExPQ19PRkZTRVQtMSkpCi0jaWZuZGVmIF9fczM5MHhfXwotIyBkZWZpbmUgVk1BTExPQ19FTkQgICAgICgweDdmZmZmZmZmTCkKLSNlbHNlIC8qIF9fczM5MHhfXyAqLwotIyBkZWZpbmUgVk1BTExPQ19FTkQgICAgICgweDQwMDAwMDAwMDAwTCkKLSNlbmRpZiAvKiBfX3MzOTB4X18gKi8KKyNkZWZpbmUgVk1BTExPQ19FTkQJdm1hbGxvY19lbmQKIAorLyoKKyAqIFdlIG5lZWQgc29tZSBmcmVlIHZpcnR1YWwgc3BhY2UgdG8gYmUgYWJsZSB0byBkbyB2bWFsbG9jLgorICogVk1BTExPQ19NSU5fU0laRSBkZWZpbmVzIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIHZtYWxsb2MKKyAqIGFyZWEuIE9uIGEgbWFjaGluZSB3aXRoIDJHQiBtZW1vcnkgd2UgbWFrZSBzdXJlIHRoYXQgd2UKKyAqIGhhdmUgYXQgbGVhc3QgMTI4TUIgZnJlZSBzcGFjZSBmb3Igdm1hbGxvYy4gT24gYSBtYWNoaW5lCisgKiB3aXRoIDRUQiB3ZSBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCAxMjhHQi4KKyAqLworI2lmbmRlZiBfX3MzOTB4X18KKyNkZWZpbmUgVk1BTExPQ19NSU5fU0laRQkweDgwMDAwMDBVTAorI2RlZmluZSBWTUFMTE9DX0VORF9JTklUCTB4ODAwMDAwMDBVTAorI2Vsc2UgLyogX19zMzkweF9fICovCisjZGVmaW5lIFZNQUxMT0NfTUlOX1NJWkUJMHgyMDAwMDAwMDAwVUwKKyNkZWZpbmUgVk1BTExPQ19FTkRfSU5JVAkweDQwMDAwMDAwMDAwVUwKKyNlbmRpZiAvKiBfX3MzOTB4X18gKi8KIAogLyoKICAqIEEgMzEgYml0IHBhZ2V0YWJsZSBlbnRyeSBvZiBTMzkwIGhhcyBmb2xsb3dpbmcgZm9ybWF0OgpAQCAtMjAwLDE4ICsyMTEsNDUgQEAKICAqLwogCiAvKiBIYXJkd2FyZSBiaXRzIGluIHRoZSBwYWdlIHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lIF9QQUdFX1JPICAgICAgICAweDIwMCAgICAgICAgICAvKiBIVyByZWFkLW9ubHkgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBfUEFHRV9JTlZBTElEICAgMHg0MDAgICAgICAgICAgLyogSFcgaW52YWxpZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgX1BBR0VfUk8JMHgyMDAJCS8qIEhXIHJlYWQtb25seSBiaXQgICovCisjZGVmaW5lIF9QQUdFX0lOVkFMSUQJMHg0MDAJCS8qIEhXIGludmFsaWQgYml0ICAgICovCisjZGVmaW5lIF9QQUdFX1NXVAkweDAwMQkJLyogU1cgcHRlIHR5cGUgYml0IHQgKi8KKyNkZWZpbmUgX1BBR0VfU1dYCTB4MDAyCQkvKiBTVyBwdGUgdHlwZSBiaXQgeCAqLwogCi0vKiBNYXNrIGFuZCBzaXggZGlmZmVyZW50IHR5cGVzIG9mIHBhZ2VzLiAqLwotI2RlZmluZSBfUEFHRV9UWVBFX01BU0sJCTB4NjAxCisvKiBTaXggZGlmZmVyZW50IHR5cGVzIG9mIHBhZ2VzLiAqLwogI2RlZmluZSBfUEFHRV9UWVBFX0VNUFRZCTB4NDAwCiAjZGVmaW5lIF9QQUdFX1RZUEVfTk9ORQkJMHg0MDEKLSNkZWZpbmUgX1BBR0VfVFlQRV9TV0FQCQkweDYwMAotI2RlZmluZSBfUEFHRV9UWVBFX0ZJTEUJCTB4NjAxCisjZGVmaW5lIF9QQUdFX1RZUEVfU1dBUAkJMHg0MDMKKyNkZWZpbmUgX1BBR0VfVFlQRV9GSUxFCQkweDYwMQkvKiBiaXQgMHgwMDIgaXMgdXNlZCBmb3Igb2Zmc2V0ICEhICovCiAjZGVmaW5lIF9QQUdFX1RZUEVfUk8JCTB4MjAwCiAjZGVmaW5lIF9QQUdFX1RZUEVfUlcJCTB4MDAwCiAKKy8qCisgKiBQVEUgdHlwZSBiaXRzIGFyZSByYXRoZXIgY29tcGxpY2F0ZWQuIGhhbmRsZV9wdGVfZmF1bHQgdXNlcyBwdGVfcHJlc2VudCwKKyAqIHB0ZV9ub25lIGFuZCBwdGVfZmlsZSB0byBmaW5kIG91dCB0aGUgcHRlIHR5cGUgV0lUSE9VVCBob2xkaW5nIHRoZSBwYWdlCisgKiB0YWJsZSBsb2NrLiBwdGVwX2NsZWFyX2ZsdXNoIG9uIHRoZSBvdGhlciBoYW5kIHVzZXMgcHRlcF9jbGVhcl9mbHVzaCB0bworICogaW52YWxpZGF0ZSBhIGdpdmVuIHB0ZS4gaXB0ZSBzZXRzIHRoZSBodyBpbnZhbGlkIGJpdCBhbmQgY2xlYXJzIGFsbCB0bGJzCisgKiBmb3IgdGhlIHBhZ2UuIFRoZSBwYWdlIHRhYmxlIGVudHJ5IGlzIHNldCB0byBfUEFHRV9UWVBFX0VNUFRZIGFmdGVyd2FyZHMuCisgKiBUaGlzIGNoYW5nZSBpcyBkb25lIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2ssIGJ1dCB0aGUgaW50ZXJtZWRpYXRlIHN0ZXAKKyAqIG9mIGEgcHJldmlvdXNseSB2YWxpZCBwdGUgd2l0aCB0aGUgaHcgaW52YWxpZCBiaXQgc2V0IGNhbiBiZSBvYnNlcnZlZCBieQorICogaGFuZGxlX3B0ZV9mYXVsdC4gVGhhdCBtYWtlcyBpdCBuZWNlc3NhcnkgdGhhdCBhbGwgdmFsaWQgcHRlIHR5cGVzIHdpdGgKKyAqIHRoZSBodyBpbnZhbGlkIGJpdCBzZXQgbXVzdCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgZm91ciBwdGUgdHlwZXMKKyAqIGVtcHR5LCBub25lLCBzd2FwIGFuZCBmaWxlLgorICoKKyAqCQkJaXJ4dCAgaXB0ZSAgaXJ4dAorICogX1BBR0VfVFlQRV9FTVBUWQkxMDAwICAgLT4gICAxMDAwCisgKiBfUEFHRV9UWVBFX05PTkUJMTAwMSAgIC0+ICAgMTAwMQorICogX1BBR0VfVFlQRV9TV0FQCTEwMTEgICAtPiAgIDEwMTEKKyAqIF9QQUdFX1RZUEVfRklMRQkxMT8xICAgLT4gICAxMT8xCisgKiBfUEFHRV9UWVBFX1JPCTAxMDAgICAtPiAgIDExMDAKKyAqIF9QQUdFX1RZUEVfUlcJMDAwMCAgIC0+ICAgMTAwMAorICoKKyAqIHB0ZV9ub25lIGlzIHRydWUgZm9yIGJpdHMgY29tYmluYXRpb25zIDEwMDAsIDExMDAKKyAqIHB0ZV9wcmVzZW50IGlzIHRydWUgZm9yIGJpdHMgY29tYmluYXRpb25zIDAwMDAsIDAwMTAsIDAxMDAsIDAxMTAsIDEwMDEKKyAqIHB0ZV9maWxlIGlzIHRydWUgZm9yIGJpdHMgY29tYmluYXRpb25zIDExMDEsIDExMTEKKyAqIHN3YXAgcHRlIGlzIDEwMTEgYW5kIDAwMDEsIDAwMTEsIDAxMDEsIDAxMTEsIDEwMTAgYW5kIDExMTAgYXJlIGludmFsaWQuCisgKi8KKwogI2lmbmRlZiBfX3MzOTB4X18KIAogLyogQml0cyBpbiB0aGUgc2VnbWVudCB0YWJsZSBlbnRyeSAqLwpAQCAtMzY1LDE4ICs0MDMsMjEgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcHRlX25vbmUocHRlX3QgcHRlKQogewotCXJldHVybiAocHRlX3ZhbChwdGUpICYgX1BBR0VfVFlQRV9NQVNLKSA9PSBfUEFHRV9UWVBFX0VNUFRZOworCXJldHVybiAocHRlX3ZhbChwdGUpICYgX1BBR0VfSU5WQUxJRCkgJiYgIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9TV1QpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwdGVfcHJlc2VudChwdGVfdCBwdGUpCiB7Ci0JcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfSU5WQUxJRCkgfHwKLQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX1RZUEVfTUFTSykgPT0gX1BBR0VfVFlQRV9OT05FOworCXVuc2lnbmVkIGxvbmcgbWFzayA9IF9QQUdFX1JPIHwgX1BBR0VfSU5WQUxJRCB8IF9QQUdFX1NXVCB8IF9QQUdFX1NXWDsKKwlyZXR1cm4gKHB0ZV92YWwocHRlKSAmIG1hc2spID09IF9QQUdFX1RZUEVfTk9ORSB8fAorCQkoIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9JTlZBTElEKSAmJgorCQkgIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9TV1QpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQogewotCXJldHVybiAocHRlX3ZhbChwdGUpICYgX1BBR0VfVFlQRV9NQVNLKSA9PSBfUEFHRV9UWVBFX0ZJTEU7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gX1BBR0VfUk8gfCBfUEFHRV9JTlZBTElEIHwgX1BBR0VfU1dUOworCXJldHVybiAocHRlX3ZhbChwdGUpICYgbWFzaykgPT0gX1BBR0VfVFlQRV9GSUxFOwogfQogCiAjZGVmaW5lIHB0ZV9zYW1lKGEsYikJKHB0ZV92YWwoYSkgPT0gcHRlX3ZhbChiKSkKQEAgLTc3NiwxMSArODE3LDE3IEBACiAKICNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpICAgKDEpCiAKK2V4dGVybiBpbnQgYWRkX3NoYXJlZF9tZW1vcnkodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgcmVtb3ZlX3NoYXJlZF9tZW1vcnkodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKKwogLyoKICAqIE5vIHBhZ2UgdGFibGUgY2FjaGVzIHRvIGluaXRpYWxpc2UKICAqLwogI2RlZmluZSBwZ3RhYmxlX2NhY2hlX2luaXQoKQlkbyB7IH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNTUFQX0lOSVQKK2V4dGVybiB2b2lkIG1lbW1hcF9pbml0KHVuc2lnbmVkIGxvbmcsIGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9FU1RBQkxJU0gKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfQUNDRVNTX0ZMQUdTCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvcmVzZXQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcmVzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQzOWNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tczM5MC9yZXNldC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiAgaW5jbHVkZS9hc20tczM5MC9yZXNldC5oCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA2CisgKiAgICBBdXRob3Iocyk6IEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tPgorICovCisKKyNpZm5kZWYgX0FTTV9TMzkwX1JFU0VUX0gKKyNkZWZpbmUgX0FTTV9TMzkwX1JFU0VUX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworc3RydWN0IHJlc2V0X2NhbGwgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl2b2lkICgqZm4pKHZvaWQpOworfTsKKworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfcmVzZXRfY2FsbChzdHJ1Y3QgcmVzZXRfY2FsbCAqcmVzZXQpOworZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9yZXNldF9jYWxsKHN0cnVjdCByZXNldF9jYWxsICpyZXNldCk7CitleHRlcm4gdm9pZCBzMzkwX3Jlc2V0X3N5c3RlbSh2b2lkKTsKK2V4dGVybiB2b2lkICgqczM5MF9yZXNldF9tY2NrX2hhbmRsZXIpKHZvaWQpOworCisjZW5kaWYgLyogX0FTTV9TMzkwX1JFU0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLXMzOTAvc2V0dXAuaAppbmRleCA1ZDcyZWRhLi45NTc0ZmU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9zZXR1cC5oCkBAIC0yLDE4ICsyLDE5IEBACiAgKiAgaW5jbHVkZS9hc20tczM5MC9zZXR1cC5oCiAgKgogICogIFMzOTAgdmVyc2lvbgotICogICAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMTk5OSwyMDA2CiAgKi8KIAogI2lmbmRlZiBfQVNNX1MzOTBfU0VUVVBfSAogI2RlZmluZSBfQVNNX1MzOTBfU0VUVVBfSAogCisjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIAk4OTYKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCiAjZGVmaW5lIFBBUk1BUkVBCQkweDEwNDAwCi0jZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIAk4OTYKICNkZWZpbmUgTUVNT1JZX0NIVU5LUwkJMTYJLyogbWF4IDB4N2ZmZiAqLwogI2RlZmluZSBJUExfUEFSTUJMT0NLX09SSUdJTgkweDIwMDAKIApAQCAtMzAsNiArMzEsMTcgQEAKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KICNkZWZpbmUgQ09NTUFORF9MSU5FICAgICAgKChjaGFyICopICAgICAgICAgICAgKDB4MTA0ODApKQogCisjZGVmaW5lIENIVU5LX1JFQURfV1JJVEUgMAorI2RlZmluZSBDSFVOS19SRUFEX09OTFkgIDEKKworc3RydWN0IG1lbV9jaHVuayB7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHR5cGU7Cit9OworCitleHRlcm4gc3RydWN0IG1lbV9jaHVuayBtZW1vcnlfY2h1bmtbXTsKKwogLyoKICAqIE1hY2hpbmUgZmVhdHVyZXMgZGV0ZWN0ZWQgaW4gaGVhZC5TCiAgKi8KQEAgLTUzLDcgKzY1LDYgQEAKICNkZWZpbmUgTUFDSElORV9IQVNfTVZDT1MJKG1hY2hpbmVfZmxhZ3MgJiA1MTIpCiAjZW5kaWYgLyogX19zMzkweF9fICovCiAKLQogI2RlZmluZSBNQUNISU5FX0hBU19TQ0xQCSghTUFDSElORV9JU19QMzkwKQogCiAvKgpAQCAtNzEsNyArODIsNiBAQAogI2RlZmluZSBTRVRfQ09OU09MRV8zMjE1CWRvIHsgY29uc29sZV9tb2RlID0gMjsgfSB3aGlsZSAoMCkKICNkZWZpbmUgU0VUX0NPTlNPTEVfMzI3MAlkbyB7IGNvbnNvbGVfbW9kZSA9IDM7IH0gd2hpbGUgKDApCiAKLQogc3RydWN0IGlwbF9saXN0X2hkciB7CiAJdTMyIGxlbjsKIAl1OCAgcmVzZXJ2ZWQxWzNdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zbXAuaCBiL2luY2x1ZGUvYXNtLXMzOTAvc21wLmgKaW5kZXggYzNjZjAzMC4uNzA5N2M5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NtcC5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgogI2luY2x1ZGUgPGFzbS9zaWdwLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAvKgogICBzMzkwIHNwZWNpZmljIHNtcC5jIGhlYWRlcnMKQEAgLTEwMSw2ICsxMDIsMTMgQEAKIAlmdW5jKGluZm8pOwogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQoreworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMvbWFjaGluZSBjaGVja3MgKi8KKwlfX2xvYWRfcHN3X21hc2soUFNXX0tFUk5FTF9CSVRTICYgflBTV19NQVNLX01DSEVDSyk7Cit9CisKICNkZWZpbmUgc21wX2NwdV9ub3RfcnVubmluZyhjcHUpCTEKICNkZWZpbmUgc21wX2dldF9jcHUoY3B1KSAoeyAwOyB9KQogI2RlZmluZSBzbXBfcHV0X2NwdShjcHUpICh7IDA7IH0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaAppbmRleCBjY2JhZmU0Li5iZDBiMDVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmgKQEAgLTExNSw2ICsxMTUsMTYgQEAKICNkZWZpbmUgYWNjb3VudF92dGltZSh4KSBkbyB7IC8qIGVtcHR5ICovIH0gd2hpbGUgKDApCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QRkFVTFQKK2V4dGVybiB2b2lkIHBmYXVsdF9pcnFfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgcGZhdWx0X2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBwZmF1bHRfZmluaSh2b2lkKTsKKyNlbHNlIC8qIENPTkZJR19QRkFVTFQgKi8KKyNkZWZpbmUgcGZhdWx0X2lycV9pbml0KCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBwZmF1bHRfaW5pdCgpCQkoey0xO30pCisjZGVmaW5lIHBmYXVsdF9maW5pKCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfUEZBVUxUICovCisKICNkZWZpbmUgZmluaXNoX2FyY2hfc3dpdGNoKHByZXYpIGRvIHsJCQkJCSAgICAgXAogCXNldF9mcyhjdXJyZW50LT50aHJlYWQubW1fc2VnbWVudCk7CQkJCSAgICAgXAogCWFjY291bnRfdnRpbWUocHJldik7CQkJCQkJICAgICBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1zMzkwL3Rlcm1iaXRzLmgKaW5kZXggZWIzZjhiZi4uNTg1Yzc4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvdGVybWJpdHMuaApAQCAtMjUsNiArMjUsMTcgQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIgMAogI2RlZmluZSBWUVVJVCAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLXMzOTAvdGVybWlvcy5oCmluZGV4IGQxZTI5Y2MuLjYyYjIzY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvdGVybWlvcy5oCkBAIC03NSwzOSArNzUsNyBAQAogKi8KICNkZWZpbmUgSU5JVF9DX0NDICJcMDAzXDAzNFwxNzdcMDI1XDAwNFwwXDFcMFwwMjFcMDIzXDAzMlwwXDAyMlwwMTdcMDI3XDAyNlwwIgogCi0vKgotICogVHJhbnNsYXRlIGEgInRlcm1pbyIgc3RydWN0dXJlIGludG8gYSAidGVybWlvcyIuIFVnaC4KLSAqLwotI2RlZmluZSBTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIHgpIHsgXAotCXVuc2lnbmVkIHNob3J0IF9fdG1wOyBcCi0JZ2V0X3VzZXIoX190bXAsJih0ZXJtaW8pLT54KTsgXAotCSh0ZXJtaW9zKS0+eCA9ICgweGZmZmYwMDAwICYgKCh0ZXJtaW9zKS0+eCkpIHwgX190bXA7IFwKLX0KLQotI2RlZmluZSB1c2VyX3Rlcm1pb190b19rZXJuZWxfdGVybWlvcyh0ZXJtaW9zLCB0ZXJtaW8pIFwKLSh7IFwKLQlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfaWZsYWcpOyBcCi0JU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX29mbGFnKTsgXAotCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19jZmxhZyk7IFwKLQlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfbGZsYWcpOyBcCi0JY29weV9mcm9tX3VzZXIoKHRlcm1pb3MpLT5jX2NjLCAodGVybWlvKS0+Y19jYywgTkNDKTsgXAotfSkKLQotLyoKLSAqIFRyYW5zbGF0ZSBhICJ0ZXJtaW9zIiBzdHJ1Y3R1cmUgaW50byBhICJ0ZXJtaW8iLiBVZ2guCi0gKi8KLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odGVybWlvLCB0ZXJtaW9zKSBcCi0oeyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2lmbGFnLCAmKHRlcm1pbyktPmNfaWZsYWcpOyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX29mbGFnLCAmKHRlcm1pbyktPmNfb2ZsYWcpOyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2NmbGFnLCAmKHRlcm1pbyktPmNfY2ZsYWcpOyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2xmbGFnLCAmKHRlcm1pbyktPmNfbGZsYWcpOyBcCi0JcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2xpbmUsICAmKHRlcm1pbyktPmNfbGluZSk7IFwKLQljb3B5X3RvX3VzZXIoKHRlcm1pbyktPmNfY2MsICh0ZXJtaW9zKS0+Y19jYywgTkNDKTsgXAotfSkKLQotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Rlcm1pb3MuaD4KIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC90eXBlcy5oIGIvaW5jbHVkZS9hc20tczM5MC90eXBlcy5oCmluZGV4IGFlMjk1MWMuLmZjNWQ3Y2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3R5cGVzLmgKQEAgLTg3LDE2ICs4Nyw2IEBACiAJfSBzdWJyZWc7CiB9IHJlZ2lzdGVyX3BhaXI7CiAKLSNpZmRlZiBDT05GSUdfTEJECi10eXBlZGVmIHU2NCBzZWN0b3JfdDsKLSNkZWZpbmUgSEFWRV9TRUNUT1JfVAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTFNGCi10eXBlZGVmIHU2NCBibGtjbnRfdDsKLSNkZWZpbmUgSEFWRV9CTEtDTlRfVAotI2VuZGlmCi0KICNlbmRpZiAvKiAhIF9fczM5MHhfXyAgICovCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tczM5MC91YWNjZXNzLmgKaW5kZXggNzJhZTRlZi4uNzNhYzRlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC91YWNjZXNzLmgKQEAgLTIwMSw3ICsyMDEsNyBAQAogICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjb3VsZCBub3QgYmUgY29waWVkLgogICogT24gc3VjY2VzcywgdGhpcyB3aWxsIGJlIHplcm8uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pICYmIChuIDw9IDI1NikpCkBAIC0yMjYsNyArMjI2LDcgQEAKICAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KICAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAltaWdodF9zbGVlcCgpOwpAQCAtMjUyLDcgKzI1Miw3IEBACiAgKiBJZiBzb21lIGRhdGEgY291bGQgbm90IGJlIGNvcGllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgY29waWVkCiAgKiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZSB1c2luZyB6ZXJvIGJ5dGVzLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIF9fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pICYmIChuIDw9IDI1NikpCkBAIC0yNzcsNyArMjc3LDcgQEAKICAqIElmIHNvbWUgZGF0YSBjb3VsZCBub3QgYmUgY29waWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGFkIHRoZSBjb3BpZWQKICAqIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCBzaXplIHVzaW5nIHplcm8gYnl0ZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJbWlnaHRfc2xlZXAoKTsKQEAgLTI4OCwxMyArMjg4LDEzIEBACiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jb3B5X2luX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCXJldHVybiB1YWNjZXNzLmNvcHlfaW5fdXNlcihuLCB0bywgZnJvbSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogY29weV9pbl91c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAltaWdodF9zbGVlcCgpOwpAQCAtMzA2LDcgKzMwNiw3IEBACiAvKgogICogQ29weSBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSB1c2Vyc3BhY2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgbG9uZworc3RhdGljIGlubGluZSBsb25nIF9fbXVzdF9jaGVjawogc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KQogewogICAgICAgICBsb25nIHJlcyA9IC1FRkFVTFQ7CkBAIC0zNDMsMTMgKzM0MywxMyBAQAogICogWmVybyBVc2Vyc3BhY2UKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIF9fY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlyZXR1cm4gdWFjY2Vzcy5jbGVhcl91c2VyKG4sIHRvKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBjbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKQogewogCW1pZ2h0X3NsZWVwKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tczM5MC91bmlzdGQuaAppbmRleCBhMTkyMzhjLi5mYjZmZWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmgKQEAgLTI0OSw4ICsyNDksOSBAQAogI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkzMDkKIC8qIE51bWJlciAzMTAgaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfbW92ZV9wYWdlcyAqLwogI2RlZmluZSBfX05SX2dldGNwdQkJMzExCisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzEyCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzEyCisjZGVmaW5lIE5SX3N5c2NhbGxzIDMxMwogCiAvKiAKICAqIFRoZXJlIGFyZSBzb21lIHN5c3RlbSBjYWxscyB0aGF0IGFyZSBub3QgcHJlc2VudCBvbiA2NCBiaXQsIHNvbWUKQEAgLTM0NCwxNjAgKzM0NSw2IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykJCQkgICAgIFwKLWRvIHsJCQkJCQkJICAgICBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCi0JCWVycm5vID0gLShyZXMpOwkJCQkgICAgIFwKLQkJcmVzID0gLTE7CQkJCSAgICAgXAotCX0JCQkJCQkgICAgIFwKLQlyZXR1cm4gKHR5cGUpIChyZXMpOwkJCQkgICAgIFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX3N2Y19jbG9iYmVyICIxIiwgImNjIiwgIm1lbW9yeSIKLQotI2RlZmluZSBfc3lzY2FsbDAodHlwZSxuYW1lKQkJCQkJXAotdHlwZSBuYW1lKHZvaWQpIHsJCQkJCQlcCi0JcmVnaXN0ZXIgbG9uZyBfX3N2Y3JlcyBhc20oIjIiKTsJCQlcCi0JbG9uZyBfX3JlczsJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKAkJCQkJCVwKLQkJIgkuaWYJJTEgPCAyNTZcbiIJCQlcCi0JCSIJc3ZjCSViMVxuIgkJCQlcCi0JCSIJLmVsc2VcbiIJCQkJXAotCQkiCWxhCSUlcjEsJTFcbiIJCQlcCi0JCSIJc3ZjCTBcbiIJCQkJXAotCQkiCS5lbmRpZiIJCQkJCVwKLQkJOiAiPWQiIChfX3N2Y3JlcykJCQkJXAotCQk6ICJpIiAoX19OUl8jI25hbWUpCQkJCVwKLQkJOiBfc3ZjX2Nsb2JiZXIpOwkJCQlcCi0JX19yZXMgPSBfX3N2Y3JlczsJCQkJCVwKLQlfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwxKHR5cGUsbmFtZSx0eXBlMSxhcmcxKQkJCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSkgewkJCQkJCVwKLQlyZWdpc3RlciB0eXBlMSBfX2FyZzEgYXNtKCIyIikgPSBhcmcxOwkJCVwKLQlyZWdpc3RlciBsb25nIF9fc3ZjcmVzIGFzbSgiMiIpOwkJCVwKLQlsb25nIF9fcmVzOwkJCQkJCVwKLQlhc20gdm9sYXRpbGUoCQkJCQkJXAotCQkiCS5pZgklMSA8IDI1NlxuIgkJCVwKLQkJIglzdmMJJWIxXG4iCQkJCVwKLQkJIgkuZWxzZVxuIgkJCQlcCi0JCSIJbGEJJSVyMSwlMVxuIgkJCVwKLQkJIglzdmMJMFxuIgkJCQlcCi0JCSIJLmVuZGlmIgkJCQkJXAotCQk6ICI9ZCIgKF9fc3ZjcmVzKQkJCQlcCi0JCTogImkiIChfX05SXyMjbmFtZSksCQkJCVwKLQkJICAiMCIgKF9fYXJnMSkJCQkJCVwKLQkJOiBfc3ZjX2Nsb2JiZXIpOwkJCQlcCi0JX19yZXMgPSBfX3N2Y3JlczsJCQkJCVwKLQlfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwyKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIpCQlcCi10eXBlIG5hbWUodHlwZTEgYXJnMSwgdHlwZTIgYXJnMikgewkJCQlcCi0JcmVnaXN0ZXIgdHlwZTEgX19hcmcxIGFzbSgiMiIpID0gYXJnMTsJCQlcCi0JcmVnaXN0ZXIgdHlwZTIgX19hcmcyIGFzbSgiMyIpID0gYXJnMjsJCQlcCi0JcmVnaXN0ZXIgbG9uZyBfX3N2Y3JlcyBhc20oIjIiKTsJCQlcCi0JbG9uZyBfX3JlczsJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKAkJCQkJCVwKLQkJIgkuaWYJJTEgPCAyNTZcbiIJCQlcCi0JCSIJc3ZjCSViMVxuIgkJCQlcCi0JCSIJLmVsc2VcbiIJCQkJXAotCQkiCWxhCSUlcjEsJTFcbiIJCQlcCi0JCSIJc3ZjCTBcbiIJCQkJXAotCQkiCS5lbmRpZiIJCQkJCVwKLQkJOiAiPWQiIChfX3N2Y3JlcykJCQkJXAotCQk6ICJpIiAoX19OUl8jI25hbWUpLAkJCQlcCi0JCSAgIjAiIChfX2FyZzEpLAkJCQkJXAotCQkgICJkIiAoX19hcmcyKQkJCQkJXAotCQk6IF9zdmNfY2xvYmJlciApOwkJCQlcCi0JX19yZXMgPSBfX3N2Y3JlczsJCQkJCVwKLQlfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMykJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMpIHsJCQlcCi0JcmVnaXN0ZXIgdHlwZTEgX19hcmcxIGFzbSgiMiIpID0gYXJnMTsJCQlcCi0JcmVnaXN0ZXIgdHlwZTIgX19hcmcyIGFzbSgiMyIpID0gYXJnMjsJCQlcCi0JcmVnaXN0ZXIgdHlwZTMgX19hcmczIGFzbSgiNCIpID0gYXJnMzsJCQlcCi0JcmVnaXN0ZXIgbG9uZyBfX3N2Y3JlcyBhc20oIjIiKTsJCQlcCi0JbG9uZyBfX3JlczsJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKAkJCQkJCVwKLQkJIgkuaWYJJTEgPCAyNTZcbiIJCQlcCi0JCSIJc3ZjCSViMVxuIgkJCQlcCi0JCSIJLmVsc2VcbiIJCQkJXAotCQkiCWxhCSUlcjEsJTFcbiIJCQlcCi0JCSIJc3ZjCTBcbiIJCQkJXAotCQkiCS5lbmRpZiIJCQkJCVwKLQkJOiAiPWQiIChfX3N2Y3JlcykJCQkJXAotCQk6ICJpIiAoX19OUl8jI25hbWUpLAkJCQlcCi0JCSAgIjAiIChfX2FyZzEpLAkJCQkJXAotCQkgICJkIiAoX19hcmcyKSwJCQkJCVwKLQkJICAiZCIgKF9fYXJnMykJCQkJCVwKLQkJOiBfc3ZjX2Nsb2JiZXIpOwkJCQlcCi0JX19yZXMgPSBfX3N2Y3JlczsJCQkJCVwKLQlfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOwkJCQlcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMywJXAotCQkgIHR5cGU0LG5hbWU0KQkJCQkJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQpIHsJXAotCXJlZ2lzdGVyIHR5cGUxIF9fYXJnMSBhc20oIjIiKSA9IGFyZzE7CQkJXAotCXJlZ2lzdGVyIHR5cGUyIF9fYXJnMiBhc20oIjMiKSA9IGFyZzI7CQkJXAotCXJlZ2lzdGVyIHR5cGUzIF9fYXJnMyBhc20oIjQiKSA9IGFyZzM7CQkJXAotCXJlZ2lzdGVyIHR5cGU0IF9fYXJnNCBhc20oIjUiKSA9IGFyZzQ7CQkJXAotCXJlZ2lzdGVyIGxvbmcgX19zdmNyZXMgYXNtKCIyIik7CQkJXAotCWxvbmcgX19yZXM7CQkJCQkJXAotCWFzbSB2b2xhdGlsZSgJCQkJCQlcCi0JCSIJLmlmCSUxIDwgMjU2XG4iCQkJXAotCQkiCXN2YwklYjFcbiIJCQkJXAotCQkiCS5lbHNlXG4iCQkJCVwKLQkJIglsYQklJXIxLCUxXG4iCQkJXAotCQkiCXN2YwkwXG4iCQkJCVwKLQkJIgkuZW5kaWYiCQkJCQlcCi0JCTogIj1kIiAoX19zdmNyZXMpCQkJCVwKLQkJOiAiaSIgKF9fTlJfIyNuYW1lKSwJCQkJXAotCQkgICIwIiAoX19hcmcxKSwJCQkJCVwKLQkJICAiZCIgKF9fYXJnMiksCQkJCQlcCi0JCSAgImQiIChfX2FyZzMpLAkJCQkJXAotCQkgICJkIiAoX19hcmc0KQkJCQkJXAotCQk6IF9zdmNfY2xvYmJlcik7CQkJCVwKLQlfX3JlcyA9IF9fc3ZjcmVzOwkJCQkJXAotCV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7CQkJCVwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDUodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLAlcCi0JCSAgdHlwZTQsbmFtZTQsdHlwZTUsbmFtZTUpCQkJXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQsCVwKLQkgIHR5cGU1IGFyZzUpIHsJCQkJCQlcCi0JcmVnaXN0ZXIgdHlwZTEgX19hcmcxIGFzbSgiMiIpID0gYXJnMTsJCQlcCi0JcmVnaXN0ZXIgdHlwZTIgX19hcmcyIGFzbSgiMyIpID0gYXJnMjsJCQlcCi0JcmVnaXN0ZXIgdHlwZTMgX19hcmczIGFzbSgiNCIpID0gYXJnMzsJCQlcCi0JcmVnaXN0ZXIgdHlwZTQgX19hcmc0IGFzbSgiNSIpID0gYXJnNDsJCQlcCi0JcmVnaXN0ZXIgdHlwZTUgX19hcmc1IGFzbSgiNiIpID0gYXJnNTsJCQlcCi0JcmVnaXN0ZXIgbG9uZyBfX3N2Y3JlcyBhc20oIjIiKTsJCQlcCi0JbG9uZyBfX3JlczsJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKAkJCQkJCVwKLQkJIgkuaWYJJTEgPCAyNTZcbiIJCQlcCi0JCSIJc3ZjCSViMVxuIgkJCQlcCi0JCSIJLmVsc2VcbiIJCQkJXAotCQkiCWxhCSUlcjEsJTFcbiIJCQlcCi0JCSIJc3ZjCTBcbiIJCQkJXAotCQkiCS5lbmRpZiIJCQkJCVwKLQkJOiAiPWQiIChfX3N2Y3JlcykJCQkJXAotCQk6ICJpIiAoX19OUl8jI25hbWUpLAkJCQlcCi0JCSAgIjAiIChfX2FyZzEpLAkJCQkJXAotCQkgICJkIiAoX19hcmcyKSwJCQkJCVwKLQkJICAiZCIgKF9fYXJnMyksCQkJCQlcCi0JCSAgImQiIChfX2FyZzQpLAkJCQkJXAotCQkgICJkIiAoX19hcmc1KQkJCQkJXAotCQk6IF9zdmNfY2xvYmJlcik7CQkJCVwKLQlfX3JlcyA9IF9fc3ZjcmVzOwkJCQkJXAotCV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7CQkJCVwKLX0KLQogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvemNyeXB0LmggYi9pbmNsdWRlL2FzbS1zMzkwL3pjcnlwdC5oCmluZGV4IDcyNDRjNjguLmI5MGU1NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvemNyeXB0LmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC96Y3J5cHQuaApAQCAtMTgwLDQwICsxODAsOCBAQAogICoJICAgICBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUKICAqCSAgICAgYmxvY2sKICAqCi0gKiAgIFo5MFNUQVRfVE9UQUxDT1VOVAotICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBkZXZpY2UgdHlwZXMgdG9nZXRoZXIuCi0gKgotICogICBaOTBTVEFUX1BDSUNBQ09VTlQKLSAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgUENJQ0FzLgotICoKLSAqICAgWjkwU1RBVF9QQ0lDQ0NPVU5UCi0gKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIFBDSUNDcy4KLSAqCi0gKiAgIFo5MFNUQVRfUENJWENDTUNMMkNPVU5UCi0gKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIE1DTDIgUENJWENDcy4KLSAqCi0gKiAgIFo5MFNUQVRfUENJWENDTUNMM0NPVU5UCi0gKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIE1DTDMgUENJWENDcy4KLSAqCi0gKiAgIFo5MFNUQVRfQ0VYMkNDT1VOVAotICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBDRVgyQ3MuCi0gKgotICogICBaOTBTVEFUX0NFWDJBQ09VTlQKLSAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgQ0VYMkFzLgotICoKLSAqICAgWjkwU1RBVF9SRVFVRVNUUV9DT1VOVAotICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyB3YWl0aW5nIHRvIGJlCi0gKiAgICAgc2VudCB0byBhIGRldmljZS4KLSAqCi0gKiAgIFo5MFNUQVRfUEVORElOR1FfQ09VTlQKLSAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgc2VudCB0byBhCi0gKiAgICAgZGV2aWNlIGF3YWl0aW5nIHRoZSByZXBseS4KLSAqCi0gKiAgIFo5MFNUQVRfVE9UQUxPUEVOX0NPVU5UCi0gKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgdGhlIG51bWJlciBvZiBvcGVuIGZpbGUgaGFuZGxlcy4KLSAqCi0gKiAgIFo5MFNUQVRfRE9NQUlOX0lOREVYCi0gKiAgICAgUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBDcnlwdG9ncmFwaGljIERvbWFpbi4KKyAqICAgWlNFQ1NFTkRDUFJCCisgKiAgICAgU2VuZCBhbiBhcmJpdHJhcnkgQ1BSQiB0byBhIGNyeXB0byBjYXJkLgogICoKICAqICAgWjkwU1RBVF9TVEFUVVNfTUFTSwogICogICAgIFJldHVybiBhbiA2NCBlbGVtZW50IGFycmF5IG9mIHVuc2lnbmVkIGNoYXJzIGZvciB0aGUgc3RhdHVzIG9mCkBAIC0yMzUsMjggKzIwMyw1MSBAQAogICogICAgIG9mIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgcmVxdWVzdHMgcGVyIGRldmljZSBzaW5jZSB0aGUgZGV2aWNlCiAgKiAgICAgd2FzIGRldGVjdGVkIGFuZCBtYWRlIGF2YWlsYWJsZS4KICAqCi0gKiAgIElDQVo5MFNUQVRVUyAoZGVwcmVjYXRlZCkKKyAqICAgWjkwU1RBVF9SRVFVRVNUUV9DT1VOVAorICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyB3YWl0aW5nIHRvIGJlCisgKiAgICAgc2VudCB0byBhIGRldmljZS4KKyAqCisgKiAgIFo5MFNUQVRfUEVORElOR1FfQ09VTlQKKyAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgc2VudCB0byBhbGwKKyAqICAgICBkZXZpY2VzIGF3YWl0aW5nIHRoZSByZXBseS4KKyAqCisgKiAgIFo5MFNUQVRfVE9UQUxPUEVOX0NPVU5UCisgKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgdGhlIG51bWJlciBvZiBvcGVuIGZpbGUgaGFuZGxlcy4KKyAqCisgKiAgIFo5MFNUQVRfRE9NQUlOX0lOREVYCisgKiAgICAgUmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBDcnlwdG9ncmFwaGljIERvbWFpbi4KKyAqCisgKiAgIFRoZSBmb2xsb3dpbmcgaW9jdGxzIGFyZSBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgbm8gbG9uZ2VyIHVzZWQ6CisgKgorICogICBaOTBTVEFUX1RPVEFMQ09VTlQKKyAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgZGV2aWNlIHR5cGVzIHRvZ2V0aGVyLgorICoKKyAqICAgWjkwU1RBVF9QQ0lDQUNPVU5UCisgKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIFBDSUNBcy4KKyAqCisgKiAgIFo5MFNUQVRfUENJQ0NDT1VOVAorICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBQQ0lDQ3MuCisgKgorICogICBaOTBTVEFUX1BDSVhDQ01DTDJDT1VOVAorICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBNQ0wyIFBDSVhDQ3MuCisgKgorICogICBaOTBTVEFUX1BDSVhDQ01DTDNDT1VOVAorICogICAgIFJldHVybiBhbiBpbnRlZ2VyIGNvdW50IG9mIGFsbCBNQ0wzIFBDSVhDQ3MuCisgKgorICogICBaOTBTVEFUX0NFWDJDQ09VTlQKKyAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgQ0VYMkNzLgorICoKKyAqICAgWjkwU1RBVF9DRVgyQUNPVU5UCisgKiAgICAgUmV0dXJuIGFuIGludGVnZXIgY291bnQgb2YgYWxsIENFWDJBcy4KKyAqCisgKiAgIElDQVo5MFNUQVRVUwogICogICAgIFJldHVybiBzb21lIGRldmljZSBkcml2ZXIgc3RhdHVzIGluIGEgaWNhX3o5MF9zdGF0dXMgc3RydWN0CiAgKiAgICAgVGhpcyB0YWtlcyBhbiBpY2FfejkwX3N0YXR1cyBzdHJ1Y3QgYXMgaXRzIGFyZy4KICAqCi0gKiAgICAgTk9URTogdGhpcyBpb2N0bCgpIGlzIGRlcHJlY2F0ZWQsIGFuZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoCi0gKgkgICAgIHNpbmdsZSBpb2N0bCgpcyBmb3IgZWFjaCB0eXBlIG9mIHN0YXR1cyBiZWluZyByZXF1ZXN0ZWQKLSAqCi0gKiAgIFo5MFNUQVRfUENJWENDQ09VTlQgKGRlcHJlY2F0ZWQpCisgKiAgIFo5MFNUQVRfUENJWENDQ09VTlQKICAqICAgICBSZXR1cm4gYW4gaW50ZWdlciBjb3VudCBvZiBhbGwgUENJWENDcyAoTUNMMiArIE1DTDMpLgogICogICAgIFRoaXMgaXMgREVQUkVDQVRFRCBub3cgdGhhdCBNQ0wzIFBDSVhDQ3MgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgZnJvbQogICogICAgIE1DTDIgUENJWENDcy4KLSAqCi0gKiAgIFo5MFFVSUVTQ0UgKG5vdCByZWNvbW1lbmRlZCkKLSAqICAgICBRdWllc2NlIHRoZSBkcml2ZXIuICBUaGlzIGlzIGludGVuZGVkIHRvIHN0b3AgYWxsIG5ldwotICogICAgIHJlcXVlc3RzIGZyb20gYmVpbmcgcHJvY2Vzc2VkLiAgSXRzIHVzZSBpcyBOT1QgcmVjb21tZW5kZWQsCi0gKiAgICAgZXhjZXB0IGluIGNpcmN1bXN0YW5jZXMgd2hlcmUgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHN0b3AKLSAqICAgICBjYWxsZXJzIGZyb20gYWNjZXNzaW5nIHRoZSBkcml2ZXIuICBJdHMgb3JpZ2luYWwgdXNlIHdhcyB0bwotICogICAgIGFsbG93IHRoZSBkcml2ZXIgdG8gYmUgImRyYWluZWQiIG9mIHdvcmsgaW4gcHJlcGFyYXRpb24gZm9yCi0gKiAgICAgYSBzeXN0ZW0gc2h1dGRvd24uCi0gKgotICogICAgIE5PVEU6IG9uY2UgaXNzdWVkLCB0aGlzIGJhbiBvbiBuZXcgd29yayBjYW5ub3QgYmUgdW5kb25lCi0gKgkgICAgIGV4Y2VwdCBieSB1bmxvYWRpbmcgYW5kIHJlbG9hZGluZyB0aGUgZHJpdmVyLgogICovCiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYXRvbWljLWlycS5oIGIvaW5jbHVkZS9hc20tc2gvYXRvbWljLWlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Zjc5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9hdG9taWMtaXJxLmgKQEAgLTAsMCArMSw3MSBAQAorI2lmbmRlZiBfX0FTTV9TSF9BVE9NSUNfSVJRX0gKKyNkZWZpbmUgX19BU01fU0hfQVRPTUlDX0lSUV9ICisKKy8qCisgKiBUbyBnZXQgcHJvcGVyIGJyYW5jaCBwcmVkaWN0aW9uIGZvciB0aGUgbWFpbiBsaW5lLCB3ZSBtdXN0IGJyYW5jaAorICogZm9yd2FyZCB0byBjb2RlIGF0IHRoZSBlbmQgb2YgdGhpcyBvYmplY3QncyAudGV4dCBzZWN0aW9uLCB0aGVuCisgKiBicmFuY2ggYmFjayB0byByZXN0YXJ0IHRoZSBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSoobG9uZyAqKXYgKz0gaTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSoobG9uZyAqKXYgLT0gaTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXAsIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRlbXAgPSAqKGxvbmcgKil2OworCXRlbXAgKz0gaTsKKwkqKGxvbmcgKil2ID0gdGVtcDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gdGVtcDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgdGVtcCwgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdGVtcCA9ICoobG9uZyAqKXY7CisJdGVtcCAtPSBpOworCSoobG9uZyAqKXYgPSB0ZW1wOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJKihsb25nICopdiAmPSB+bWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJKihsb25nICopdiB8PSBtYXNrOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX1NIX0FUT01JQ19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYXRvbWljLWxsc2MuaCBiL2luY2x1ZGUvYXNtLXNoL2F0b21pYy1sbHNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwMGI3OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL2F0b21pYy1sbHNjLmgKQEAgLTAsMCArMSwxMDcgQEAKKyNpZm5kZWYgX19BU01fU0hfQVRPTUlDX0xMU0NfSAorI2RlZmluZSBfX0FTTV9TSF9BVE9NSUNfTExTQ19ICisKKy8qCisgKiBUbyBnZXQgcHJvcGVyIGJyYW5jaCBwcmVkaWN0aW9uIGZvciB0aGUgbWFpbiBsaW5lLCB3ZSBtdXN0IGJyYW5jaAorICogZm9yd2FyZCB0byBjb2RlIGF0IHRoZSBlbmQgb2YgdGhpcyBvYmplY3QncyAudGV4dCBzZWN0aW9uLCB0aGVuCisgKiBicmFuY2ggYmFjayB0byByZXN0YXJ0IHRoZSBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKyIxOgltb3ZsaS5sIEAlMiwgJTAJCSEgYXRvbWljX2FkZAlcbiIKKyIJYWRkCSUxLCAlMAkJCQlcbiIKKyIJbW92Y28ubAklMCwgQCUyCQkJCVxuIgorIgliZgkxYgkJCQlcbiIKKwk6ICI9JnoiICh0bXApCisJOiAiciIgKGkpLCAiciIgKCZ2LT5jb3VudGVyKQorCTogInQiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zdWIoaW50IGksIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorIjE6CW1vdmxpLmwgQCUyLCAlMAkJISBhdG9taWNfc3ViCVxuIgorIglzdWIJJTEsICUwCQkJCVxuIgorIgltb3Zjby5sCSUwLCBAJTIJCQkJXG4iCisiCWJmCTFiCQkJCVxuIgorCTogIj0meiIgKHRtcCkKKwk6ICJyIiAoaSksICJyIiAoJnYtPmNvdW50ZXIpCisJOiAidCIpOworfQorCisvKgorICogU0gtNEEgbm90ZToKKyAqCisgKiBXZSBiYXNpY2FsbHkgZ2V0IGF0b21pY194eHhfcmV0dXJuKCkgZm9yIGZyZWUgY29tcGFyZWQgd2l0aAorICogYXRvbWljX3h4eCgpLiBtb3ZsaS5sL21vdmNvLmwgcmVxdWlyZSByMCBkdWUgdG8gdGhlIGluc3RydWN0aW9uCisgKiBlbmNvZGluZywgc28gdGhlIHJldHZhbCBpcyBhdXRvbWF0aWNhbGx5IHNldCB3aXRob3V0IGhhdmluZyB0bworICogZG8gYW55IHNwZWNpYWwgd29yay4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKyIxOgltb3ZsaS5sIEAlMiwgJTAJCSEgYXRvbWljX2FkZF9yZXR1cm4JXG4iCisiCWFkZAklMSwgJTAJCQkJCVxuIgorIgltb3Zjby5sCSUwLCBAJTIJCQkJCVxuIgorIgliZgkxYgkJCQkJXG4iCisiCXN5bmNvCQkJCQkJXG4iCisJOiAiPSZ6IiAodGVtcCkKKwk6ICJyIiAoaSksICJyIiAoJnYtPmNvdW50ZXIpCisJOiAidCIpOworCisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisiMToJbW92bGkubCBAJTIsICUwCQkhIGF0b21pY19zdWJfcmV0dXJuCVxuIgorIglzdWIJJTEsICUwCQkJCQlcbiIKKyIJbW92Y28ubAklMCwgQCUyCQkJCQlcbiIKKyIJYmYJMWIJCQkJCVxuIgorIglzeW5jbwkJCQkJCVxuIgorCTogIj0meiIgKHRlbXApCisJOiAiciIgKGkpLCAiciIgKCZ2LT5jb3VudGVyKQorCTogInQiKTsKKworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorIjE6CW1vdmxpLmwgQCUyLCAlMAkJISBhdG9taWNfY2xlYXJfbWFzawlcbiIKKyIJYW5kCSUxLCAlMAkJCQkJXG4iCisiCW1vdmNvLmwJJTAsIEAlMgkJCQkJXG4iCisiCWJmCTFiCQkJCQlcbiIKKwk6ICI9JnoiICh0bXApCisJOiAiciIgKH5tYXNrKSwgInIiICgmdi0+Y291bnRlcikKKwk6ICJ0Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorIjE6CW1vdmxpLmwgQCUyLCAlMAkJISBhdG9taWNfc2V0X21hc2sJXG4iCisiCW9yCSUxLCAlMAkJCQkJXG4iCisiCW1vdmNvLmwJJTAsIEAlMgkJCQkJXG4iCisiCWJmCTFiCQkJCQlcbiIKKwk6ICI9JnoiICh0bXApCisJOiAiciIgKG1hc2spLCAiciIgKCZ2LT5jb3VudGVyKQorCTogInQiKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX1NIX0FUT01JQ19MTFNDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKaW5kZXggOGJkYzFiYS4uZTEyNTcwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKQEAgLTE3LDExOSArMTcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotLyoKLSAqIFRvIGdldCBwcm9wZXIgYnJhbmNoIHByZWRpY3Rpb24gZm9yIHRoZSBtYWluIGxpbmUsIHdlIG11c3QgYnJhbmNoCi0gKiBmb3J3YXJkIHRvIGNvZGUgYXQgdGhlIGVuZCBvZiB0aGlzIG9iamVjdCdzIC50ZXh0IHNlY3Rpb24sIHRoZW4KLSAqIGJyYW5jaCBiYWNrIHRvIHJlc3RhcnQgdGhlIG9wZXJhdGlvbi4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICp2KQotewogI2lmZGVmIENPTkZJR19DUFVfU0g0QQotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotIjE6CW1vdmxpLmwgQCUzLCAlMAkJISBhdG9taWNfYWRkCVxuIgotIglhZGQJJTIsICUwCQkJCVxuIgotIgltb3Zjby5sCSUwLCBAJTMJCQkJXG4iCi0iCWJmCTFiCQkJCVxuIgotCTogIj0meiIgKHRtcCksICI9ciIgKCZ2LT5jb3VudGVyKQotCTogInIiIChpKSwgInIiICgmdi0+Y291bnRlcikKLQk6ICJ0Iik7CisjaW5jbHVkZSA8YXNtL2F0b21pYy1sbHNjLmg+CiAjZWxzZQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JKihsb25nICopdiArPSBpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNpbmNsdWRlIDxhc20vYXRvbWljLWlycS5oPgogI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqdikKLXsKLSNpZmRlZiBDT05GSUdfQ1BVX1NINEEKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLSIxOgltb3ZsaS5sIEAlMywgJTAJCSEgYXRvbWljX3N1YglcbiIKLSIJc3ViCSUyLCAlMAkJCQlcbiIKLSIJbW92Y28ubAklMCwgQCUzCQkJCVxuIgotIgliZgkxYgkJCQlcbiIKLQk6ICI9JnoiICh0bXApLCAiPXIiICgmdi0+Y291bnRlcikKLQk6ICJyIiAoaSksICJyIiAoJnYtPmNvdW50ZXIpCi0JOiAidCIpOwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCSoobG9uZyAqKXYgLT0gaTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFNILTRBIG5vdGU6Ci0gKgotICogV2UgYmFzaWNhbGx5IGdldCBhdG9taWNfeHh4X3JldHVybigpIGZvciBmcmVlIGNvbXBhcmVkIHdpdGgKLSAqIGF0b21pY194eHgoKS4gbW92bGkubC9tb3Zjby5sIHJlcXVpcmUgcjAgZHVlIHRvIHRoZSBpbnN0cnVjdGlvbgotICogZW5jb2RpbmcsIHNvIHRoZSByZXR2YWwgaXMgYXV0b21hdGljYWxseSBzZXQgd2l0aG91dCBoYXZpbmcgdG8KLSAqIGRvIGFueSBzcGVjaWFsIHdvcmsuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKLXsKLQl1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1NINEEKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0iMToJbW92bGkubCBAJTMsICUwCQkhIGF0b21pY19hZGRfcmV0dXJuCVxuIgotIglhZGQJJTIsICUwCQkJCQlcbiIKLSIJbW92Y28ubAklMCwgQCUzCQkJCQlcbiIKLSIJYmYJMWIJCQkJCVxuIgotIglzeW5jbwkJCQkJCVxuIgotCTogIj0meiIgKHRlbXApLCAiPXIiICgmdi0+Y291bnRlcikKLQk6ICJyIiAoaSksICJyIiAoJnYtPmNvdW50ZXIpCi0JOiAidCIpOwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXRlbXAgPSAqKGxvbmcgKil2OwotCXRlbXAgKz0gaTsKLQkqKGxvbmcgKil2ID0gdGVtcDsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0jZW5kaWYKLQotCXJldHVybiB0ZW1wOwotfQogCiAjZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoYSwgdikJKGF0b21pY19hZGRfcmV0dXJuKChhKSwgKHYpKSA8IDApCiAKLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKLXsKLQl1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX1NINEEKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0iMToJbW92bGkubCBAJTMsICUwCQkhIGF0b21pY19zdWJfcmV0dXJuCVxuIgotIglzdWIJJTIsICUwCQkJCQlcbiIKLSIJbW92Y28ubAklMCwgQCUzCQkJCQlcbiIKLSIJYmYJMWIJCQkJCVxuIgotIglzeW5jbwkJCQkJCVxuIgotCTogIj0meiIgKHRlbXApLCAiPXIiICgmdi0+Y291bnRlcikKLQk6ICJyIiAoaSksICJyIiAoJnYtPmNvdW50ZXIpCi0JOiAidCIpOwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXRlbXAgPSAqKGxvbmcgKil2OwotCXRlbXAgLT0gaTsKLQkqKGxvbmcgKil2ID0gdGVtcDsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0jZW5kaWYKLQotCXJldHVybiB0ZW1wOwotfQotCiAjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpIGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQogI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSBhdG9taWNfYWRkX3JldHVybigxLCh2KSkKIApAQCAtMTgwLDUwICs3NSw2IEBACiB9CiAjZGVmaW5lIGF0b21pY19pbmNfbm90X3plcm8odikgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAxLCAwKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQotewotI2lmZGVmIENPTkZJR19DUFVfU0g0QQotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotIjE6CW1vdmxpLmwgQCUzLCAlMAkJISBhdG9taWNfY2xlYXJfbWFzawlcbiIKLSIJYW5kCSUyLCAlMAkJCQkJXG4iCi0iCW1vdmNvLmwJJTAsIEAlMwkJCQkJXG4iCi0iCWJmCTFiCQkJCQlcbiIKLQk6ICI9JnoiICh0bXApLCAiPXIiICgmdi0+Y291bnRlcikKLQk6ICJyIiAofm1hc2spLCAiciIgKCZ2LT5jb3VudGVyKQotCTogInQiKTsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkqKGxvbmcgKil2ICY9IH5tYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3NldF9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKLXsKLSNpZmRlZiBDT05GSUdfQ1BVX1NINEEKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLSIxOgltb3ZsaS5sIEAlMywgJTAJCSEgYXRvbWljX3NldF9tYXNrCVxuIgotIglvcgklMiwgJTAJCQkJCVxuIgotIgltb3Zjby5sCSUwLCBAJTMJCQkJCVxuIgotIgliZgkxYgkJCQkJXG4iCi0JOiAiPSZ6IiAodG1wKSwgIj1yIiAoJnYtPmNvdW50ZXIpCi0JOiAiciIgKG1hc2spLCAiciIgKCZ2LT5jb3VudGVyKQotCTogInQiKTsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkqKGxvbmcgKil2IHw9IG1hc2s7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotI2VuZGlmCi19Ci0KIC8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nIG9uIFNIICovCiAjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkJYmFycmllcigpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9idWcuaCBiL2luY2x1ZGUvYXNtLXNoL2J1Zy5oCmluZGV4IDFiNGZjNTIuLjJmODlkZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2J1Zy5oCkBAIC0xLDE5ICsxLDU0IEBACiAjaWZuZGVmIF9fQVNNX1NIX0JVR19ICiAjZGVmaW5lIF9fQVNNX1NIX0JVR19ICiAKLQogI2lmZGVmIENPTkZJR19CVUcKLS8qCi0gKiBUZWxsIHRoZSB1c2VyIHRoZXJlIGlzIHNvbWUgcHJvYmxlbS4KLSAqLwotI2RlZmluZSBCVUcoKSBkbyB7IFwKLQlwcmludGsoImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCi0JKih2b2xhdGlsZSBpbnQgKikwID0gMDsgXAorCitzdHJ1Y3QgYnVnX2ZyYW1lIHsKKwl1bnNpZ25lZCBzaG9ydAlvcGNvZGU7CisJdW5zaWduZWQgc2hvcnQJbGluZTsKKwljb25zdCBjaGFyCSpmaWxlOworCWNvbnN0IGNoYXIJKmZ1bmM7Cit9OworCitzdHJ1Y3QgcHRfcmVnczsKKworZXh0ZXJuIHZvaWQgaGFuZGxlX0JVRyhzdHJ1Y3QgcHRfcmVncyAqKTsKKworI2RlZmluZSBUUkFQQV9CVUdfT1BDT0RFCTB4YzMzZQkvKiB0cmFwYSAjMHgzZSAqLworCisjaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKKworI2RlZmluZSBCVUcoKQkJCQkJCVwKK2RvIHsJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJXAorCQkiLmFsaWduCTJcblx0IgkJCQlcCisJCSIuc2hvcnQJJU8wXG5cdCIJCQlcCisJCSIuc2hvcnQJJU8xXG5cdCIJCQlcCisJCSIubG9uZwklTzJcblx0IgkJCVwKKwkJIi5sb25nCSVPM1xuXHQiCQkJXAorCQk6CQkJCQlcCisJCTogIm4iIChUUkFQQV9CVUdfT1BDT0RFKSwJCVwKKwkJICAiaSIgKF9fTElORV9fKSwgIlgiIChfX0ZJTEVfXyksCVwKKwkJICAiWCIgKF9fRlVOQ1RJT05fXykpOwkJCVwKIH0gd2hpbGUgKDApCiAKKyNlbHNlCisKKyNkZWZpbmUgQlVHKCkJCQkJCVwKK2RvIHsJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCVwKKwkJIi5hbGlnbgkyXG5cdCIJCQlcCisJCSIuc2hvcnQJJU8wXG5cdCIJCVwKKwkJOgkJCQlcCisJCTogIm4iIChUUkFQQV9CVUdfT1BDT0RFKSk7CVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSAqLworCiAjZGVmaW5lIEhBVkVfQVJDSF9CVUcKLSNlbmRpZgorCisjZW5kaWYgLyogQ09ORklHX0JVRyAqLwogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CiAKLSNlbmRpZgorI2VuZGlmIC8qIF9fQVNNX1NIX0JVR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9idWdzLmggYi9pbmNsdWRlL2FzbS1zaC9idWdzLmgKaW5kZXggYmVlZWE0MC4uYTI5NDk5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvYnVncy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaApAQCAtMTYsMjYgKzE2LDM4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjaGVja19idWdzKHZvaWQpCiB7Ci0JZXh0ZXJuIGNoYXIgKmdldF9jcHVfc3VidHlwZSh2b2lkKTsKIAlleHRlcm4gdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7Ci0JY2hhciAqcD0gJmluaXRfdXRzbmFtZSgpLT5tYWNoaW5lWzJdOyAvKiAic2giICovCisJY2hhciAqcCA9ICZpbml0X3V0c25hbWUoKS0+bWFjaGluZVsyXTsgLyogInNoIiAqLwogCiAJY3B1X2RhdGEtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKIAogCXN3aXRjaCAoY3B1X2RhdGEtPnR5cGUpIHsKLQljYXNlIENQVV9TSDc2MDQ6CisJY2FzZSBDUFVfU0g3NjA0IC4uLiBDUFVfU0g3NjE5OgogCQkqcCsrID0gJzInOwogCQlicmVhazsKKwljYXNlIENQVV9TSDcyMDY6CisJCSpwKysgPSAnMic7CisJCSpwKysgPSAnYSc7CisJCWJyZWFrOwogCWNhc2UgQ1BVX1NINzcwNSAuLi4gQ1BVX1NINzMwMDoKIAkJKnArKyA9ICczJzsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfU0g3NzUwIC4uLiBDUFVfU0g0XzUwMToKIAkJKnArKyA9ICc0JzsKIAkJYnJlYWs7Ci0JY2FzZSBDUFVfU0g3NzcwIC4uLiBDUFVfU0g3NzgxOgorCWNhc2UgQ1BVX1NINzc3MCAuLi4gQ1BVX1NINzc4NToKIAkJKnArKyA9ICc0JzsKIAkJKnArKyA9ICdhJzsKIAkJYnJlYWs7CisJY2FzZSBDUFVfU0g3MzE4MCAuLi4gQ1BVX1NINzcyMjoKKwkJKnArKyA9ICc0JzsKKwkJKnArKyA9ICdhJzsKKwkJKnArKyA9ICdsJzsKKwkJKnArKyA9ICctJzsKKwkJKnArKyA9ICdkJzsKKwkJKnArKyA9ICdzJzsKKwkJKnArKyA9ICdwJzsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJKnArKyA9ICc/JzsKIAkJKnArKyA9ICchJzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1zaC9jaGVja3N1bS5oCmluZGV4IDA4MTY4YWYuLjRiYzgzNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY2hlY2tzdW0uaApAQCAtMjMsNyArMjMsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1hc21saW5rYWdlIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworYXNtbGlua2FnZSBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKgogICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0CkBAIC0zMywzNSArMzMsMzcgQEAKICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KIAotYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkJCSAgaW50IGxlbiwgaW50IHN1bSwgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7Cithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgICAgaW50IGxlbiwgX193c3VtIHN1bSwKKwkJCQkJICAgIGludCAqc3JjX2Vycl9wdHIsIGludCAqZHN0X2Vycl9wdHIpOwogCiAvKgogICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQotICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLiAKLSAqCQotICoJSWYgeW91IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgcGxlYXNlIGRvbid0IGZvcmdldCB0aGUgCisgKglwYXNzZWQgaW4gYW4gaW5jb3JyZWN0IGtlcm5lbCBhZGRyZXNzIHRvIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuCisgKgorICoJSWYgeW91IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgcGxlYXNlIGRvbid0IGZvcmdldCB0aGUKICAqCWFjY2Vzc19vaygpLgogICovCi1zdGF0aWMgX19pbmxpbmVfXwotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCQlpbnQgbGVuLCBpbnQgc3VtKQorc3RhdGljIGlubGluZQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMgKCBzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIE5VTEwpOworCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkJCWludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cikKK3N0YXRpYyBpbmxpbmUKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKIHsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyAoIHNyYywgZHN0LCBsZW4sIHN1bSwgZXJyX3B0ciwgTlVMTCk7CisJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKF9fZm9yY2UgY29uc3Qgdm9pZCAqKXNyYywgZHN0LAorCQkJCQlsZW4sIHN1bSwgZXJyX3B0ciwgTlVMTCk7CiB9CiAKIC8qCiAgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBjc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgX19kdW1teTsKIAlfX2FzbV9fKCJzd2FwLncgJTAsICUxXG5cdCIKQEAgLTc0LDcgKzc2LDcgQEAKIAkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKIAkJOiAiMCIgKHN1bSkKIAkJOiAidCIpOwotCXJldHVybiBzdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpc3VtOwogfQogCiAvKgpAQCAtODQsNyArODYsNyBAQAogICogICAgICBpMzg2IHZlcnNpb24gYnkgSm9yZ2UgQ3dpayA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+LCBhZGFwdGVkCiAgKiAgICAgIGZvciBsaW51eCBieSAqIEFybnQgR3VsYnJhbmRzZW4uCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bSwgX19kdW1teTAsIF9fZHVtbXkxOwogCkBAIC0xMTIsMTYgKzExNCwxNSBAQAogCXJldHVybgljc3VtX2ZvbGQoc3VtKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pIAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCQl1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCXVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQlfX3dzdW0gc3VtKQogewogI2lmZGVmIF9fTElUVExFX0VORElBTl9fCi0JdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSAobnRvaHMobGVuKTw8MTYpK3Byb3RvKjI1NjsKKwl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChwcm90byArIGxlbikgPDwgODsKICNlbHNlCi0JdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSAocHJvdG88PDE2KStsZW47CisJdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSBwcm90byArIGxlbjsKICNlbmRpZgogCV9fYXNtX18oImNscnRcblx0IgogCQkiYWRkYwklMCwgJTFcblx0IgpAQCAtMTMyLDYgKzEzMyw3IEBACiAJCTogIj1yIiAoc3VtKSwgIj1yIiAobGVuX3Byb3RvKQogCQk6ICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgIjEiIChsZW5fcHJvdG8pLCAiMCIgKHN1bSkKIAkJOiAidCIpOworCiAJcmV0dXJuIHN1bTsKIH0KIApAQCAtMTM5LDMyICsxNDEsMjggQEAKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCiAgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAogICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhZGRyLAotCQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtKSAKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkJdW5zaWduZWQgc2hvcnQgbGVuLAorCQkJCQl1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJX193c3VtIHN1bSkKIHsKLQlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CisJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsIGRhZGRyLCBsZW4sIHByb3RvLCBzdW0pKTsKIH0KIAogLyoKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKLSAgICByZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CisgICAgcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLSNpZmRlZiBDT05GSUdfSVBWNgotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW50IGNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkJICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCQkJICAgICBfX3UzMiBsZW4sCi0JCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgc3VtKSAKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCSAgICAgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJICAgICAgX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgX19kdW1teTsKIAlfX2FzbV9fKCJjbHJ0XG5cdCIKQEAgLTE4OSwyOSArMTg3LDI5IEBACiAJCSJtb3Z0CSUxXG5cdCIKIAkJImFkZAklMSwgJTBcbiIKIAkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKLQkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksIAorCQk6ICJyIiAoc2FkZHIpLCAiciIgKGRhZGRyKSwKIAkJICAiciIgKGh0b25sKGxlbikpLCAiciIgKGh0b25sKHByb3RvKSksICIwIiAoc3VtKQogCQk6ICJ0Iik7CiAKIAlyZXR1cm4gY3N1bV9mb2xkKHN1bSk7CiB9Ci0jZW5kaWYKIAotLyogCisvKgogICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgogICovCiAjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBjc3VtX2FuZF9jb3B5X3RvX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICpkc3QsCi0JCQkJCQkgICAgICBpbnQgbGVuLCBpbnQgc3VtLAotCQkJCQkJICAgICAgaW50ICplcnJfcHRyKQorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywKKwkJCQkJICAgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCQkJICAgaW50IGxlbiwgX193c3VtIHN1bSwKKwkJCQkJICAgaW50ICplcnJfcHRyKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIGxlbikpCi0JCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgZXJyX3B0cik7CisJCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKChfX2ZvcmNlIGNvbnN0IHZvaWQgKilzcmMsCisJCQkJCQlkc3QsIGxlbiwgc3VtLCBOVUxMLCBlcnJfcHRyKTsKIAogCWlmIChsZW4pCiAJCSplcnJfcHRyID0gLUVGQVVMVDsKIAotCXJldHVybiAtMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7IC8qIGludmFsaWQgY2hlY2tzdW0gKi8KIH0KICNlbmRpZiAvKiBfX0FTTV9TSF9DSEVDS1NVTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jbG9jay5oIGIvaW5jbHVkZS9hc20tc2gvY2xvY2suaAppbmRleCBmZGZiNzViLi4xZGY5MjgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jbG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2Nsb2NrLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiBzdHJ1Y3QgY2xrOwogCkBAIC0xOCw3ICsxOSw3IEBACiBzdHJ1Y3QgY2xrIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CiAJY29uc3QgY2hhcgkJKm5hbWU7Ci0KKwlpbnQJCQlpZDsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAKIAlzdHJ1Y3QgY2xrCQkqcGFyZW50OwpAQCAtNDAsMjIgKzQxLDEzIEBACiBpbnQgY2xrX2luaXQodm9pZCk7CiAKIGludCBfX2Nsa19lbmFibGUoc3RydWN0IGNsayAqKTsKLWludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKik7Ci0KIHZvaWQgX19jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICopOwotdm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICopOwogCi1pbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKiwgdW5zaWduZWQgbG9uZyByYXRlKTsKLXVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKik7CiB2b2lkIGNsa19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrICopOwogCi1zdHJ1Y3QgY2xrICpjbGtfZ2V0KGNvbnN0IGNoYXIgKmlkKTsKLXZvaWQgY2xrX3B1dChzdHJ1Y3QgY2xrICopOwotCiBpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKik7CiB2b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKik7CiAKIGludCBzaG93X2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwogCiAjZW5kaWYgLyogX19BU01fU0hfQ0xPQ0tfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmgKaW5kZXggY2Q5NjQwMi4uMjBiOTc5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGUuaApAQCAtMTIsNiArMTIsNyBAQAogCiAjZGVmaW5lIEwxX0NBQ0hFX1NISUZUCTQKIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCkKICNkZWZpbmUgQ0NSCQkweGZmZmZmZTkyCS8qIEFkZHJlc3Mgb2YgQ2FjaGUgQ29udHJvbCBSZWdpc3RlciAqLwogCiAjZGVmaW5lIENDUl9DQUNIRV9DRQkweDAxCS8qIENhY2hlIGVuYWJsZSAqLwpAQCAtMjcsNSArMjgsMjYgQEAKICNkZWZpbmUgQ0NSX0NBQ0hFX09SQQkJQ0NSX0NBQ0hFX1RXCiAjZGVmaW5lIENDUl9DQUNIRV9XVAkJMHgwMAkvKiBTSC0yIGlzIF9hbHdheXNfIHdyaXRlLXRocm91Z2ggKi8KIAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQorI2RlZmluZSBDQ1IxCQkweGZmZmZmZmVjCisjZGVmaW5lIENDUgkJQ0NSMQorCisjZGVmaW5lIENDUl9DQUNIRV9DRQkweDAxCS8qIENhY2hlIGVuYWJsZSAqLworI2RlZmluZSBDQ1JfQ0FDSEVfV1QJMHgwNiAgICAvKiBDQ1JbYml0MT0xLGJpdDI9MV0gKi8KKwkJCQkvKiAweDAwMDAwMDAwLTB4N2ZmZmZmZmY6IFdyaXRlLXRocm91Z2ggICovCisJCQkJLyogMHg4MDAwMDAwMC0weDlmZmZmZmZmOiBXcml0ZS1iYWNrICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweGMwMDAwMDAwLTB4ZGZmZmZmZmY6IFdyaXRlLXRocm91Z2ggICovCisjZGVmaW5lIENDUl9DQUNIRV9DQgkweDAwICAgIC8qIENDUltiaXQxPTAsYml0Mj0wXSAqLworCQkJCS8qIDB4MDAwMDAwMDAtMHg3ZmZmZmZmZjogV3JpdGUtYmFjayAgICAgKi8KKwkJCQkvKiAweDgwMDAwMDAwLTB4OWZmZmZmZmY6IFdyaXRlLXRocm91Z2ggICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4YzAwMDAwMDAtMHhkZmZmZmZmZjogV3JpdGUtYmFjayAgICAgKi8KKyNkZWZpbmUgQ0NSX0NBQ0hFX0NGCTB4MDgJLyogQ2FjaGUgaW52YWxpZGF0ZSAqLworCisjZGVmaW5lIENBQ0hFX09DX0FERFJFU1NfQVJSQVkJMHhmMDAwMDAwMAorI2RlZmluZSBDQUNIRV9PQ19EQVRBX0FSUkFZCTB4ZjEwMDAwMDAKKworI2RlZmluZSBDQ1JfQ0FDSEVfRU5BQkxFCUNDUl9DQUNIRV9DRQorI2RlZmluZSBDQ1JfQ0FDSEVfSU5WQUxJREFURQlDQ1JfQ0FDSEVfQ0YKKyNlbmRpZgogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDJfQ0FDSEVfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGVmbHVzaC5oCmluZGV4IGY1NTZmYTguLjI5NzllZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGVmbHVzaC5oCkBAIC0xNSw2ICsxNSw3IEBACiAgKgogICogIC0gZmx1c2hfY2FjaGVfYWxsKCkgZmx1c2hlcyBlbnRpcmUgY2FjaGUKICAqICAtIGZsdXNoX2NhY2hlX21tKG1tKSBmbHVzaGVzIHRoZSBzcGVjaWZpZWQgbW0gY29udGV4dCdzIGNhY2hlIGxpbmVzCisgKiAgLSBmbHVzaF9jYWNoZV9kdXAgbW0obW0pIGhhbmRsZXMgY2FjaGUgZmx1c2hpbmcgd2hlbiBmb3JraW5nCiAgKiAgLSBmbHVzaF9jYWNoZV9wYWdlKG1tLCB2bWFkZHIsIHBmbikgZmx1c2hlcyBhIHNpbmdsZSBwYWdlCiAgKiAgLSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpIGZsdXNoZXMgYSByYW5nZSBvZiBwYWdlcwogICoKQEAgLTI3LDYgKzI4LDcgQEAKICAqLwogI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9mcmVxLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2ZyZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRlNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9mcmVxLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXNoL2NwdS1zaDIvZnJlcS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBZb3NoaW5vcmkgU2F0bworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fQVNNX0NQVV9TSDJfRlJFUV9ICisjZGVmaW5lIF9fQVNNX0NQVV9TSDJfRlJFUV9ICisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCisjZGVmaW5lIEZSRVFDUgkweGY4MTVmZjgwCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDJfRlJFUV9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvbW11X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWViMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9tbXVfY29udGV4dC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1zaC9jcHUtc2gyL21tdV9jb250ZXh0LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0FTTV9DUFVfU0gyX01NVV9DT05URVhUX0gKKyNkZWZpbmUgX19BU01fQ1BVX1NIMl9NTVVfQ09OVEVYVF9ICisKKy8qIE5vIE1NVSAqLworCisjZW5kaWYgLyogX19BU01fQ1BVX1NIMl9NTVVfQ09OVEVYVF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvdGltZXIuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzljMjQxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi90aW1lci5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX0FTTV9DUFVfU0gyX1RJTUVSX0gKKyNkZWZpbmUgX19BU01fQ1BVX1NIMl9USU1FUl9ICisKKy8qIE5vdGhpbmcgbmVlZGVkIHlldCAqLworCisjZW5kaWYgLyogX19BU01fQ1BVX1NIMl9USU1FUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS9hZGRyc3BhY2UuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDJhL2FkZHJzcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmU5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS9hZGRyc3BhY2UuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtL2NwdS1zaDIvYWRkcnNwYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS9jYWNoZS5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRiOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvY2FjaGUuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvY2FjaGUuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19BU01fQ1BVX1NIMkFfQ0FDSEVfSAorI2RlZmluZSBfX0FTTV9DUFVfU0gyQV9DQUNIRV9ICisKKyNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJNAorCisjZGVmaW5lIENDUjEJCTB4ZmZmYzEwMDAKKyNkZWZpbmUgQ0NSMgkJMHhmZmZjMTAwNAorCisvKiBDQ1IxIGJlaGF2ZXMgbW9yZSBsaWtlIHRoZSB0cmFkaXRpb25hbCBDQ1IgKi8KKyNkZWZpbmUgQ0NSCQlDQ1IxCisKKy8qCisgKiBNb3N0IG9mIHRoZSBTSC0yQSBDQ1IxIGRlZmluaXRpb25zIHJlc2VtYmxlIHRoZSBTSC00IG9uZXMuIEFsbCBvdGhlcnMgbm90CisgKiBsaXN0ZWQgaGVyZSBhcmUgcmVzZXJ2ZWQuCisgKi8KKyNkZWZpbmUgQ0NSX0NBQ0hFX0NCCTB4MDAwMAkvKiBIYWNrICovCisjZGVmaW5lIENDUl9DQUNIRV9PQ0UJMHgwMDAxCisjZGVmaW5lIENDUl9DQUNIRV9XVAkweDAwMDIKKyNkZWZpbmUgQ0NSX0NBQ0hFX09DSQkweDAwMDgJLyogT0NGICovCisjZGVmaW5lIENDUl9DQUNIRV9JQ0UJMHgwMTAwCisjZGVmaW5lIENDUl9DQUNIRV9JQ0kJMHgwODAwCS8qIElDRiAqLworCisjZGVmaW5lIENBQ0hFX0lDX0FERFJFU1NfQVJSQVkJMHhmMDAwMDAwMAorI2RlZmluZSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZCTB4ZjA4MDAwMDAKKworI2RlZmluZSBDQ1JfQ0FDSEVfRU5BQkxFCShDQ1JfQ0FDSEVfT0NFIHwgQ0NSX0NBQ0hFX0lDRSkKKyNkZWZpbmUgQ0NSX0NBQ0hFX0lOVkFMSURBVEUJKENDUl9DQUNIRV9PQ0kgfCBDQ1JfQ0FDSEVfSUNJKQorCisjZW5kaWYgLyogX19BU01fQ1BVX1NIMkFfQ0FDSEVfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS9jYWNoZWZsdXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzMTg2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDJhL2NhY2hlZmx1c2guaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtL2NwdS1zaDIvY2FjaGVmbHVzaC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvZG1hLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDVhZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvZG1hLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS9jcHUtc2gyL2RtYS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvZnJlcS5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvZnJlcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MThmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS9mcmVxLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXNoL2NwdS1zaDJhL2ZyZXEuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgWW9zaGlub3JpIFNhdG8KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBfX0FTTV9DUFVfU0gyQV9GUkVRX0gKKyNkZWZpbmUgX19BU01fQ1BVX1NIMkFfRlJFUV9ICisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYpCisjZGVmaW5lIEZSRVFDUgkweGZmZmUwMDEwCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDJBX0ZSRVFfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvbW11X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDIzODdmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvbW11X2NvbnRleHQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtL2NwdS1zaDIvbW11X2NvbnRleHQuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDJhL3RpbWVyLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTUwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS90aW1lci5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20vY3B1LXNoMi90aW1lci5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvdWJjLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyYS91YmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI4MDYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvdWJjLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS9jcHUtc2gyL3ViYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMmEvd2F0Y2hkb2cuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDJhL3dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiM2UyNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDJhL3dhdGNoZG9nLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS9jcHUtc2gyL3dhdGNoZG9nLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvY2FjaGVmbHVzaC5oCmluZGV4IDAzZmRlOTcuLmY3MGQ4ZWY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL2NhY2hlZmx1c2guaApAQCAtMTUsNiArMTUsNyBAQAogICoKICAqICAtIGZsdXNoX2NhY2hlX2FsbCgpIGZsdXNoZXMgZW50aXJlIGNhY2hlCiAgKiAgLSBmbHVzaF9jYWNoZV9tbShtbSkgZmx1c2hlcyB0aGUgc3BlY2lmaWVkIG1tIGNvbnRleHQncyBjYWNoZSBsaW5lcworICogIC0gZmx1c2hfY2FjaGVfZHVwIG1tKG1tKSBoYW5kbGVzIGNhY2hlIGZsdXNoaW5nIHdoZW4gZm9ya2luZwogICogIC0gZmx1c2hfY2FjaGVfcGFnZShtbSwgdm1hZGRyLCBwZm4pIGZsdXNoZXMgYSBzaW5nbGUgcGFnZQogICogIC0gZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKSBmbHVzaGVzIGEgcmFuZ2Ugb2YgcGFnZXMKICAqCkBAIC0zOSw2ICs0MCw3IEBACiAKIHZvaWQgZmx1c2hfY2FjaGVfYWxsKHZvaWQpOwogdm9pZCBmbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CisjZGVmaW5lIGZsdXNoX2NhY2hlX2R1cF9tbShtbSkgZmx1c2hfY2FjaGVfbW0obW0pCiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBlbmQpOwogdm9pZCBmbHVzaF9jYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGZuKTsKQEAgLTQ4LDYgKzUwLDcgQEAKICNlbHNlCiAjZGVmaW5lIGZsdXNoX2NhY2hlX2FsbCgpCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9tbShtbSkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2NhY2hlX2R1cF9tbShtbSkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV9wYWdlKHZtYSwgdm1hZGRyLCBwZm4pCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQlkbyB7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlLmgKaW5kZXggNmU5YzdlNi4uZjkyYjIwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvY2FjaGUuaApAQCAtMjIsNyArMjIsNyBAQAogI2RlZmluZSBDQ1JfQ0FDSEVfSUNFCTB4MDEwMAkvKiBJbnN0cnVjdGlvbiBDYWNoZSBFbmFibGUgKi8KICNkZWZpbmUgQ0NSX0NBQ0hFX0lDSQkweDA4MDAJLyogSUMgSW52YWxpZGF0ZSAqLwogI2RlZmluZSBDQ1JfQ0FDSEVfSUlYCTB4ODAwMAkvKiBJQyBJbmRleCBFbmFibGUgKi8KLSNpZm5kZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MAorI2lmbmRlZiBDT05GSUdfQ1BVX1NINEEKICNkZWZpbmUgQ0NSX0NBQ0hFX0VNT0RFCTB4ODAwMDAwMDAJLyogRU1PREUgRW5hYmxlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlZmx1c2guaAppbmRleCA1MTVmZDU3Li5iMDFhMTBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlZmx1c2guaApAQCAtMTgsNiArMTgsNyBAQAogICovCiB2b2lkIGZsdXNoX2NhY2hlX2FsbCh2b2lkKTsKIHZvaWQgZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOworI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pIGZsdXNoX2NhY2hlX21tKG1tKQogdm9pZCBmbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKIHZvaWQgZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9mcmVxLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAppbmRleCBlZjJiOWIxLi42MDJkMDYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaApAQCAtMTAsNyArMTAsNyBAQAogI2lmbmRlZiBfX0FTTV9DUFVfU0g0X0ZSRVFfSAogI2RlZmluZSBfX0FTTV9DUFVfU0g0X0ZSRVFfSAogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCiAjZGVmaW5lIEZSUUNSCQkgICAgICAgIDB4YTQxNTAwMDAKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKICNkZWZpbmUJRlJRQ1IJCQkweGZmYzgwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXNoL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tc2gvZG1hLW1hcHBpbmcuaAppbmRleCA1NmNkNGI5Li44ZDA4NjdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2RtYS1tYXBwaW5nLmgKQEAgLTUzLDcgKzUzLDcgQEAKIAljb25zaXN0ZW50X2ZyZWUodmFkZHIsIHNpemUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAorc3RhdGljIGlubGluZSB2b2lkIGRtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCQkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewogCWNvbnNpc3RlbnRfc3luYyh2YWRkciwgc2l6ZSwgKGludClkaXIpOwpAQCAtNjcsNyArNjcsNyBAQAogCWlmIChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKQogCQlyZXR1cm4gdmlydF90b19idXMocHRyKTsKICNlbmRpZgotCWRtYV9jYWNoZV9zeW5jKHB0ciwgc2l6ZSwgZGlyKTsKKwlkbWFfY2FjaGVfc3luYyhkZXYsIHB0ciwgc2l6ZSwgZGlyKTsKIAogCXJldHVybiB2aXJ0X3RvX2J1cyhwdHIpOwogfQpAQCAtODEsNyArODEsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyspIHsKICNpZiAhZGVmaW5lZChDT05GSUdfUENJKSB8fCBkZWZpbmVkKENPTkZJR19TSF9QQ0lETUFfTk9OQ09IRVJFTlQpCi0JCWRtYV9jYWNoZV9zeW5jKHBhZ2VfYWRkcmVzcyhzZ1tpXS5wYWdlKSArIHNnW2ldLm9mZnNldCwKKwkJZG1hX2NhY2hlX3N5bmMoZGV2LCBwYWdlX2FkZHJlc3Moc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQsCiAJCQkgICAgICAgc2dbaV0ubGVuZ3RoLCBkaXIpOwogI2VuZGlmCiAJCXNnW2ldLmRtYV9hZGRyZXNzID0gcGFnZV90b19waHlzKHNnW2ldLnBhZ2UpICsgc2dbaV0ub2Zmc2V0OwpAQCAtMTEyLDcgKzExMiw3IEBACiAJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCiAJCXJldHVybjsKICNlbmRpZgotCWRtYV9jYWNoZV9zeW5jKGJ1c190b192aXJ0KGRtYV9oYW5kbGUpLCBzaXplLCBkaXIpOworCWRtYV9jYWNoZV9zeW5jKGRldiwgYnVzX3RvX3ZpcnQoZG1hX2hhbmRsZSksIHNpemUsIGRpcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2Uoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTI0LDcgKzEyNCw3IEBACiAJaWYgKGRldi0+YnVzID09ICZwY2lfYnVzX3R5cGUpCiAJCXJldHVybjsKICNlbmRpZgotCWRtYV9jYWNoZV9zeW5jKGJ1c190b192aXJ0KGRtYV9oYW5kbGUpICsgb2Zmc2V0LCBzaXplLCBkaXIpOworCWRtYV9jYWNoZV9zeW5jKGRldiwgYnVzX3RvX3ZpcnQoZG1hX2hhbmRsZSkgKyBvZmZzZXQsIHNpemUsIGRpcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBuZWxlbXM7IGkrKykgewogI2lmICFkZWZpbmVkKENPTkZJR19QQ0kpIHx8IGRlZmluZWQoQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCkKLQkJZG1hX2NhY2hlX3N5bmMocGFnZV9hZGRyZXNzKHNnW2ldLnBhZ2UpICsgc2dbaV0ub2Zmc2V0LAorCQlkbWFfY2FjaGVfc3luYyhkZXYsIHBhZ2VfYWRkcmVzcyhzZ1tpXS5wYWdlKSArIHNnW2ldLm9mZnNldCwKIAkJCSAgICAgICBzZ1tpXS5sZW5ndGgsIGRpcik7CiAjZW5kaWYKIAkJc2dbaV0uZG1hX2FkZHJlc3MgPSBwYWdlX3RvX3BoeXMoc2dbaV0ucGFnZSkgKyBzZ1tpXS5vZmZzZXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9kbWEuaCBiL2luY2x1ZGUvYXNtLXNoL2RtYS5oCmluZGV4IGQ5ZGFhMDIuLmZhZjMwNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2RtYS5oCkBAIC0xNCw5ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKIC8qIFRoZSBtYXhpbXVtIGFkZHJlc3MgdGhhdCB3ZSBjYW4gcGVyZm9ybSBhIERNQSB0cmFuc2ZlciB0byBvbiB0aGlzIHBsYXRmb3JtICovCiAvKiBEb24ndCBkZWZpbmUgTUFYX0RNQV9BRERSRVNTOyBpdCdzIHVzZWxlc3Mgb24gdGhlIFN1cGVySCBhbmQgYW55CkBAIC00NiwxNiArNDQsMjEgQEAKICAqIERNQUMgKGRtYV9pbmZvKSBmbGFncwogICovCiBlbnVtIHsKLQlETUFDX0NIQU5ORUxTX0NPTkZJR1VSRUQJPSAweDAwLAotCURNQUNfQ0hBTk5FTFNfVEVJX0NBUEFCTEUJPSAweDAxLAorCURNQUNfQ0hBTk5FTFNfQ09ORklHVVJFRAk9IDB4MDEsCisJRE1BQ19DSEFOTkVMU19URUlfQ0FQQUJMRQk9IDB4MDIsCS8qIFRyYW5zZmVyIGVuZCBpbnRlcnJ1cHQgKi8KIH07CiAKIC8qCiAgKiBETUEgY2hhbm5lbCBjYXBhYmlsaXRpZXMgLyBmbGFncwogICovCiBlbnVtIHsKLQlETUFfVEVJX0NBUEFCTEUJCQk9IDB4MDEsCi0JRE1BX0NPTkZJR1VSRUQJCQk9IDB4MDIsCisJRE1BX0NPTkZJR1VSRUQJCQk9IDB4MDEsCisKKwkvKgorCSAqIFRyYW5zZmVyIGVuZCBpbnRlcnJ1cHQsIGluaGVyaXRlZCBmcm9tIERNQUMuCisJICogd2FpdF9xdWV1ZSB1c2VkIGluIGRtYV93YWl0X2Zvcl9jb21wbGV0aW9uLgorCSAqLworCURNQV9URUlfQ0FQQUJMRQkJCT0gMHgwMiwKIH07CiAKIGV4dGVybiBzcGlubG9ja190IGRtYV9zcGluX2xvY2s7CkBAIC02OCwyOCArNzEsMzEgQEAKIAogCWludCAoKmdldF9yZXNpZHVlKShzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4pOwogCWludCAoKnhmZXIpKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbik7Ci0Jdm9pZCAoKmNvbmZpZ3VyZSkoc3RydWN0IGRtYV9jaGFubmVsICpjaGFuLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwlpbnQgKCpjb25maWd1cmUpKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJaW50ICgqZXh0ZW5kKShzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4sIHVuc2lnbmVkIGxvbmcgb3AsIHZvaWQgKnBhcmFtKTsKIH07CiAKIHN0cnVjdCBkbWFfY2hhbm5lbCB7Ci0JY2hhciBkZXZfaWRbMTZdOworCWNoYXIgZGV2X2lkWzE2XTsJCS8qIHVuaXF1ZSBuYW1lIHBlciBETUFDIG9mIGNoYW5uZWwgKi8KIAotCXVuc2lnbmVkIGludCBjaGFuOwkJLyogUGh5c2ljYWwgY2hhbm5lbCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbjsJCS8qIERNQUMgY2hhbm5lbCBudW1iZXIgKi8KIAl1bnNpZ25lZCBpbnQgdmNoYW47CQkvKiBWaXJ0dWFsIGNoYW5uZWwgbnVtYmVyICovCisKIAl1bnNpZ25lZCBpbnQgbW9kZTsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAKIAl1bnNpZ25lZCBsb25nIHNhcjsKIAl1bnNpZ25lZCBsb25nIGRhcjsKIAorCWNvbnN0IGNoYXIgKipjYXBzOworCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlhdG9taWNfdCBidXN5OwogCi0Jc3RydWN0IHNlbWFwaG9yZSBzZW07CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKIAogCXN0cnVjdCBzeXNfZGV2aWNlIGRldjsKLQljaGFyICpuYW1lOworCXZvaWQgKnByaXZfZGF0YTsKIH07CiAKIHN0cnVjdCBkbWFfaW5mbyB7CkBAIC0xMDMsNiArMTA5LDEyIEBACiAJc3RydWN0IGRtYV9jaGFubmVsICpjaGFubmVsczsKIAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgZmlyc3RfY2hhbm5lbF9ucjsKK307CisKK3N0cnVjdCBkbWFfY2hhbl9jYXBzIHsKKwlpbnQgY2hfbnVtOworCWNvbnN0IGNoYXIgKipjYXBsaXN0OwogfTsKIAogI2RlZmluZSB0b19kbWFfY2hhbm5lbChjaGFubmVsKSBjb250YWluZXJfb2YoY2hhbm5lbCwgc3RydWN0IGRtYV9jaGFubmVsLCBkZXYpCkBAIC0xMjEsNiArMTMzLDggQEAKICNkZWZpbmUgZG1hX3JlYWRfcGFnZShjaGFuLCBmcm9tLCB0bykJXAogCWRtYV9yZWFkKGNoYW4sIGZyb20sIHRvLCBQQUdFX1NJWkUpCiAKK2V4dGVybiBpbnQgcmVxdWVzdF9kbWFfYnljYXAoY29uc3QgY2hhciAqKmRtYWMsIGNvbnN0IGNoYXIgKipjYXBzLAorCQkJICAgICBjb25zdCBjaGFyICpkZXZfaWQpOwogZXh0ZXJuIGludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQgY2hhbiwgY29uc3QgY2hhciAqZGV2X2lkKTsKIGV4dGVybiB2b2lkIGZyZWVfZG1hKHVuc2lnbmVkIGludCBjaGFuKTsKIGV4dGVybiBpbnQgZ2V0X2RtYV9yZXNpZHVlKHVuc2lnbmVkIGludCBjaGFuKTsKQEAgLTEzMSw2ICsxNDUsMTAgQEAKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9kbWFjKHN0cnVjdCBkbWFfaW5mbyAqaW5mbyk7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2RtYWMoc3RydWN0IGRtYV9pbmZvICppbmZvKTsKK2V4dGVybiBzdHJ1Y3QgZG1hX2luZm8gKmdldF9kbWFfaW5mb19ieV9uYW1lKGNvbnN0IGNoYXIgKmRtYWNfbmFtZSk7CisKK2V4dGVybiBpbnQgZG1hX2V4dGVuZCh1bnNpZ25lZCBpbnQgY2hhbiwgdW5zaWduZWQgbG9uZyBvcCwgdm9pZCAqcGFyYW0pOworZXh0ZXJuIGludCByZWdpc3Rlcl9jaGFuX2NhcHMoY29uc3QgY2hhciAqZG1hYywgc3RydWN0IGRtYV9jaGFuX2NhcHMgKmNhcHNsaXN0KTsKIAogI2lmZGVmIENPTkZJR19TWVNGUwogLyogYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc3lzZnMuYyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZWRvc2s3NzA1L2lvLmggYi9pbmNsdWRlL2FzbS1zaC9lZG9zazc3MDUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvZWRvc2s3NzA1L2lvLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL2Vkb3NrNzcwNS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9lbGYuaCBiL2luY2x1ZGUvYXNtLXNoL2VsZi5oCmluZGV4IGZjMDUwZmQuLjQzY2EyNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2VsZi5oCkBAIC03NCw3ICs3NCw3IEBACiAjZGVmaW5lIEVMRl9BUkNICUVNX1NICiAKICNkZWZpbmUgVVNFX0VMRl9DT1JFX0RVTVAKLSNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUJNDA5NgorI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQlQQUdFX1NJWkUKIAogLyogVGhpcyBpcyB0aGUgbG9jYXRpb24gdGhhdCBhbiBFVF9EWU4gcHJvZ3JhbSBpcyBsb2FkZWQgaWYgZXhlYydlZC4gIFR5cGljYWwKICAgIHVzZSBvZiB0aGlzIGlzIHRvIGludm9rZSAiLi9sZC5zbyBzb21lcHJvZyIgdG8gdGVzdCBvdXQgYSBuZXcgdmVyc2lvbiBvZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZW50cnktbWFjcm9zLlMgYi9pbmNsdWRlL2FzbS1zaC9lbnRyeS1tYWNyb3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDAwMzBlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvZW50cnktbWFjcm9zLlMKQEAgLTAsMCArMSwzMyBAQAorISBlbnRyeS5TIG1hY3JvIGRlZmluZQorCQorCS5tYWNybwljbGkKKwlzdGMJc3IsIHIwCisJb3IJIzB4ZjAsIHIwCisJbGRjCXIwLCBzcgorCS5lbmRtCisKKwkubWFjcm8Jc3RpCisJbW92CSMweGYwLCByMTEKKwlleHR1LmIJcjExLCByMTEKKwlub3QJcjExLCByMTEKKwlzdGMJc3IsIHIxMAorCWFuZAlyMTEsIHIxMAorI2lmZGVmIENPTkZJR19IQVNfU1JfUkIKKwlzdGMJa19nX2ltYXNrLCByMTEKKwlvcglyMTEsIHIxMAorI2VuZGlmCisJbGRjCXIxMCwgc3IKKwkuZW5kbQorCisJLm1hY3JvCWdldF9jdXJyZW50X3RocmVhZF9pbmZvLCB0aSwgdG1wCisjaWZkZWYgQ09ORklHX0hBU19TUl9SQgorCXN0YwlyN19iYW5rLCBcdGkKKyNlbHNlCisJbW92CSMoKFRIUkVBRF9TSVpFIC0gMSkgPj4gMTApIF4gMHhmZiwgXHRtcAorCXNobGw4CVx0bXAKKwlzaGxsMglcdG1wCisJbW92CXIxNSwgXHRpCisJYW5kCVx0bXAsIFx0aQorI2VuZGlmCQorCS5lbmRtCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hwNnh4L2hwNnh4LmggYi9pbmNsdWRlL2FzbS1zaC9ocDZ4eC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1zaC9ocDZ4eC9ocDZ4eC5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1zaC9ocDZ4eC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9ocDZ4eC9pZGUuaCBiL2luY2x1ZGUvYXNtLXNoL2hwNnh4L2lkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzAzOTVhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2hwNnh4L2lkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1NIX0hQNlhYX0lERV9ICi0jZGVmaW5lIF9fQVNNX1NIX0hQNlhYX0lERV9ICi0KLSNkZWZpbmUgSVJRX0NGQ0FSRAk5MwotI2RlZmluZSBJUlFfUENNQ0lBCTk0Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9IUDZYWF9JREVfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9ocDZ4eC9pby5oIGIvaW5jbHVkZS9hc20tc2gvaHA2eHgvaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA0NDQ3Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9ocDZ4eC9pby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSF9IUDZYWF9JT19ICi0jZGVmaW5lIF9fQVNNX1NIX0hQNlhYX0lPX0gKLQotLyoKLSAqIE5vdGhpbmcgc3BlY2lhbCBoZXJlLi4ganVzdCB1c2UgdGhlIGdlbmVyaWMgY2NoaXAgaW8gcm91dGluZXMuCi0gKi8KLSNpbmNsdWRlIDxhc20vaGQ2NDQ2MS5oPgotCi0jZW5kaWYgLyogX19BU01fU0hfSFA2WFhfSU9fSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9oczc3NTFydm9pcC9oczc3NTFydm9pcC5oIGIvaW5jbHVkZS9hc20tc2gvaHM3NzUxcnZvaXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvaHM3NzUxcnZvaXAvaHM3NzUxcnZvaXAuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tc2gvaHM3NzUxcnZvaXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaHM3NzUxcnZvaXAvaWRlLmggYi9pbmNsdWRlL2FzbS1zaC9oczc3NTFydm9pcC9pZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhZDFkMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9oczc3NTFydm9pcC9pZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSF9IUzc3NTFSVk9JUF9JREVfSAotI2RlZmluZSBfX0FTTV9TSF9IUzc3NTFSVk9JUF9JREVfSAotCi0vKiBOb3RoaW5nIHRvIHNlZSBoZXJlLi4gKi8KLSNpbmNsdWRlIDxhc20vaHM3NzUxcnZvaXAvaHM3NzUxcnZvaXAuaD4KLQotI2VuZGlmIC8qIF9fQVNNX1NIX0hTNzc1MVJWT0lQX0lERV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2lycS1zaDczMTgwLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3MzE4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjhhZjlhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2lycS1zaDczMTgwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSF9JUlFfU0g3MzE4MF9ICi0jZGVmaW5lIF9fQVNNX1NIX0lSUV9TSDczMTgwX0gKLQotLyoKLSAqIGxpbnV4L2luY2x1ZGUvYXNtLXNoL2lycS1zaDczMTgwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGFrYXNoaSBTSFVETyA8c2h1ZG9AaGl0YWNoaS11bC5jby5qcD4KLSAqLwotCi0jdW5kZWYgSU5UQ19JUFJBCi0jdW5kZWYgSU5UQ19JUFJCCi0jdW5kZWYgSU5UQ19JUFJDCi0jdW5kZWYgSU5UQ19JUFJECi0KLSN1bmRlZiBETVRFMF9JUlEKLSN1bmRlZiBETVRFMV9JUlEKLSN1bmRlZiBETVRFMl9JUlEKLSN1bmRlZiBETVRFM19JUlEKLSN1bmRlZiBETVRFNF9JUlEKLSN1bmRlZiBETVRFNV9JUlEKLSN1bmRlZiBETVRFNl9JUlEKLSN1bmRlZiBETVRFN19JUlEKLSN1bmRlZiBETUFFX0lSUQotI3VuZGVmIERNQV9JUFJfQUREUgotI3VuZGVmIERNQV9JUFJfUE9TCi0jdW5kZWYgRE1BX1BSSU9SSVRZCi0KLSN1bmRlZiBJTlRDX0lNQ1IwCi0jdW5kZWYgSU5UQ19JTUNSMQotI3VuZGVmIElOVENfSU1DUjIKLSN1bmRlZiBJTlRDX0lNQ1IzCi0jdW5kZWYgSU5UQ19JTUNSNAotI3VuZGVmIElOVENfSU1DUjUKLSN1bmRlZiBJTlRDX0lNQ1I2Ci0jdW5kZWYgSU5UQ19JTUNSNwotI3VuZGVmIElOVENfSU1DUjgKLSN1bmRlZiBJTlRDX0lNQ1I5Ci0jdW5kZWYgSU5UQ19JTUNSMTAKLQotCi0jZGVmaW5lIElOVENfSVBSQSAgCTB4QTQwODAwMDBVTAotI2RlZmluZSBJTlRDX0lQUkIgIAkweEE0MDgwMDA0VUwKLSNkZWZpbmUgSU5UQ19JUFJDICAJMHhBNDA4MDAwOFVMCi0jZGVmaW5lIElOVENfSVBSRCAgCTB4QTQwODAwMENVTAotI2RlZmluZSBJTlRDX0lQUkUgIAkweEE0MDgwMDEwVUwKLSNkZWZpbmUgSU5UQ19JUFJGICAJMHhBNDA4MDAxNFVMCi0jZGVmaW5lIElOVENfSVBSRyAgCTB4QTQwODAwMThVTAotI2RlZmluZSBJTlRDX0lQUkggIAkweEE0MDgwMDFDVUwKLSNkZWZpbmUgSU5UQ19JUFJJICAJMHhBNDA4MDAyMFVMCi0jZGVmaW5lIElOVENfSVBSSiAgCTB4QTQwODAwMjRVTAotI2RlZmluZSBJTlRDX0lQUksgIAkweEE0MDgwMDI4VUwKLQotI2RlZmluZSBJTlRDX0lNUjAJMHhBNDA4MDA4MFVMCi0jZGVmaW5lIElOVENfSU1SMQkweEE0MDgwMDg0VUwKLSNkZWZpbmUgSU5UQ19JTVIyCTB4QTQwODAwODhVTAotI2RlZmluZSBJTlRDX0lNUjMJMHhBNDA4MDA4Q1VMCi0jZGVmaW5lIElOVENfSU1SNAkweEE0MDgwMDkwVUwKLSNkZWZpbmUgSU5UQ19JTVI1CTB4QTQwODAwOTRVTAotI2RlZmluZSBJTlRDX0lNUjYJMHhBNDA4MDA5OFVMCi0jZGVmaW5lIElOVENfSU1SNwkweEE0MDgwMDlDVUwKLSNkZWZpbmUgSU5UQ19JTVI4CTB4QTQwODAwQTBVTAotI2RlZmluZSBJTlRDX0lNUjkJMHhBNDA4MDBBNFVMCi0jZGVmaW5lIElOVENfSU1SMTAJMHhBNDA4MDBBOFVMCi0jZGVmaW5lIElOVENfSU1SMTEJMHhBNDA4MDBBQ1VMCi0KLSNkZWZpbmUgSU5UQ19JTUNSMAkweEE0MDgwMEMwVUwKLSNkZWZpbmUgSU5UQ19JTUNSMQkweEE0MDgwMEM0VUwKLSNkZWZpbmUgSU5UQ19JTUNSMgkweEE0MDgwMEM4VUwKLSNkZWZpbmUgSU5UQ19JTUNSMwkweEE0MDgwMENDVUwKLSNkZWZpbmUgSU5UQ19JTUNSNAkweEE0MDgwMEQwVUwKLSNkZWZpbmUgSU5UQ19JTUNSNQkweEE0MDgwMEQ0VUwKLSNkZWZpbmUgSU5UQ19JTUNSNgkweEE0MDgwMEQ4VUwKLSNkZWZpbmUgSU5UQ19JTUNSNwkweEE0MDgwMERDVUwKLSNkZWZpbmUgSU5UQ19JTUNSOAkweEE0MDgwMEUwVUwKLSNkZWZpbmUgSU5UQ19JTUNSOQkweEE0MDgwMEU0VUwKLSNkZWZpbmUgSU5UQ19JTUNSMTAJMHhBNDA4MDBFOFVMCi0jZGVmaW5lIElOVENfSU1DUjExCTB4QTQwODAwRUNVTAotCi0jZGVmaW5lIElOVENfSUNSMAkweEE0MTQwMDAwVUwKLSNkZWZpbmUgSU5UQ19JQ1IxCTB4QTQxNDAwMUNVTAotCi0jZGVmaW5lIElOVE1TSzAJCTB4YTQxNDAwNDQKLSNkZWZpbmUgSU5UTVNLQ0xSMAkweGE0MTQwMDY0Ci0jZGVmaW5lIElOVENfSU5UUFJJMAkweGE0MTQwMDEwCi0KLS8qCi0gIE5PVEU6Ci0KLSAgKl9JUlEgPSAoSU5URVZUMiAtIDB4MjAwKS8weDIwCi0qLwotCi0vKiBUTVUwICovCi0jZGVmaW5lIFRNVTBfSVJRCTE2Ci0jZGVmaW5lIFRNVTBfSVBSX0FERFIJSU5UQ19JUFJBCi0jZGVmaW5lIFRNVTBfSVBSX1BPUwkgMwotI2RlZmluZSBUTVUwX1BSSU9SSVRZCSAyCi0KLSNkZWZpbmUgVElNRVJfSVJRICAgICAgIDE2Ci0jZGVmaW5lIFRJTUVSX0lQUl9BRERSICBJTlRDX0lQUkEKLSNkZWZpbmUgVElNRVJfSVBSX1BPUyAgICAzCi0jZGVmaW5lIFRJTUVSX1BSSU9SSVRZICAgMgotCi0vKiBUTVUxICovCi0jZGVmaW5lIFRNVTFfSVJRCTE3Ci0jZGVmaW5lIFRNVTFfSVBSX0FERFIJSU5UQ19JUFJBCi0jZGVmaW5lIFRNVTFfSVBSX1BPUwkgMgotI2RlZmluZSBUTVUxX1BSSU9SSVRZCSAyCi0KLS8qIFRNVTIgKi8KLSNkZWZpbmUgVE1VMl9JUlEJMTgKLSNkZWZpbmUgVE1VMl9JUFJfQUREUglJTlRDX0lQUkEKLSNkZWZpbmUgVE1VMl9JUFJfUE9TCSAxCi0jZGVmaW5lIFRNVTJfUFJJT1JJVFkJIDIKLQotLyogTENEQyAqLwotI2RlZmluZSBMQ0RDX0lSUQkyOAotI2RlZmluZSBMQ0RDX0lQUl9BRERSCUlOVENfSVBSQgotI2RlZmluZSBMQ0RDX0lQUl9QT1MJIDIKLSNkZWZpbmUgTENEQ19QUklPUklUWQkgMgotCi0vKiBWSU8gKFZpZGVvIEkvTykgKi8KLSNkZWZpbmUgQ0VVX0lSUQkJNTIKLSNkZWZpbmUgQkVVX0lSUQkJNTMKLSNkZWZpbmUgVkVVX0lSUQkJNTQKLSNkZWZpbmUgVk9VX0lSUQkJNTUKLSNkZWZpbmUgVklPX0lQUl9BRERSCUlOVENfSVBSRQotI2RlZmluZSBWSU9fSVBSX1BPUwkgMgotI2RlZmluZSBWSU9fUFJJT1JJVFkJIDIKLQotLyogTUZJIChNdWx0aSBGdW5jdGlvbmFsIEludGVyZmFjZSkgKi8KLSNkZWZpbmUgTUZJX0lSUQkJNTYKLSNkZWZpbmUgTUZJX0lQUl9BRERSCUlOVENfSVBSRQotI2RlZmluZSBNRklfSVBSX1BPUwkgMQotI2RlZmluZSBNRklfUFJJT1JJVFkJIDIKLQotLyogVlBVIChWaWRlbyBQcm9jZXNzaW5nIFVuaXQpICovCi0jZGVmaW5lIFZQVV9JUlEJCTYwCi0jZGVmaW5lIFZQVV9JUFJfQUREUglJTlRDX0lQUkUKLSNkZWZpbmUgVlBVX0lQUl9QT1MJIDAKLSNkZWZpbmUgVlBVX1BSSU9SSVRZCSAyCi0KLS8qIDNERyAqLwotI2RlZmluZSBUREdfSVJRCQk2MwotI2RlZmluZSBUREdfSVBSX0FERFIJSU5UQ19JUFJKCi0jZGVmaW5lIFRER19JUFJfUE9TCSAyCi0jZGVmaW5lIFRER19QUklPUklUWQkgMgotCi0vKiBETUFDKDEpICovCi0jZGVmaW5lIERNVEUwX0lSUQk0OAotI2RlZmluZSBETVRFMV9JUlEJNDkKLSNkZWZpbmUgRE1URTJfSVJRCTUwCi0jZGVmaW5lIERNVEUzX0lSUQk1MQotI2RlZmluZSBETUExX0lQUl9BRERSCUlOVENfSVBSRQotI2RlZmluZSBETUExX0lQUl9QT1MJMwotI2RlZmluZSBETUExX1BSSU9SSVRZCTcKLQotLyogRE1BQygyKSAqLwotI2RlZmluZSBETVRFNF9JUlEJNzYKLSNkZWZpbmUgRE1URTVfSVJRCTc3Ci0jZGVmaW5lIERNQTJfSVBSX0FERFIJSU5UQ19JUFJGCi0jZGVmaW5lIERNQTJfSVBSX1BPUwkyCi0jZGVmaW5lIERNQTJfUFJJT1JJVFkJNwotCi0vKiBTQ0lGMCAqLwotI2RlZmluZSBTQ0lGX0VSSV9JUlEJODAKLSNkZWZpbmUgU0NJRl9SWElfSVJRCTgxCi0jZGVmaW5lIFNDSUZfQlJJX0lSUQk4MgotI2RlZmluZSBTQ0lGX1RYSV9JUlEJODMKLSNkZWZpbmUgU0NJRl9JUFJfQUREUglJTlRDX0lQUkcKLSNkZWZpbmUgU0NJRl9JUFJfUE9TCTMKLSNkZWZpbmUgU0NJRl9QUklPUklUWQkzCi0KLS8qIFNJT0YwICovCi0jZGVmaW5lIFNJT0YwX0lSUQk4NAotI2RlZmluZSBTSU9GMF9JUFJfQUREUglJTlRDX0lQUkgKLSNkZWZpbmUgU0lPRjBfSVBSX1BPUwkzCi0jZGVmaW5lIFNJT0YwX1BSSU9SSVRZCTMKLQotLyogRkxDVEwgKEZsYXNoIE1lbW9yeSBDb250cm9sbGVyKSAqLwotI2RlZmluZSBGTFNURV9JUlEJOTIKLSNkZWZpbmUgRkxURU5EX0lSUQk5MwotI2RlZmluZSBGTFRSUTBfSVJRCTk0Ci0jZGVmaW5lIEZMVFJRMV9JUlEJOTUKLSNkZWZpbmUgRkxDVExfSVBSX0FERFIJSU5UQ19JUFJICi0jZGVmaW5lIEZMQ1RMX0lQUl9QT1MJMQotI2RlZmluZSBGTENUTF9QUklPUklUWQkzCi0KLS8qIElJQygwKSAoSUlDIEJ1cyBJbnRlcmZhY2UpICovCi0jZGVmaW5lIElJQzBfQUxJX0lSUQk5NgotI2RlZmluZSBJSUMwX1RBQ0tJX0lSUQk5NwotI2RlZmluZSBJSUMwX1dBSVRJX0lSUQk5OAotI2RlZmluZSBJSUMwX0RURUlfSVJRCTk5Ci0jZGVmaW5lIElJQzBfSVBSX0FERFIJSU5UQ19JUFJICi0jZGVmaW5lIElJQzBfSVBSX1BPUwkwCi0jZGVmaW5lIElJQzBfUFJJT1JJVFkJMwotCi0vKiBJSUMoMSkgKElJQyBCdXMgSW50ZXJmYWNlKSAqLwotI2RlZmluZSBJSUMxX0FMSV9JUlEJNDQKLSNkZWZpbmUgSUlDMV9UQUNLSV9JUlEJNDUKLSNkZWZpbmUgSUlDMV9XQUlUSV9JUlEJNDYKLSNkZWZpbmUgSUlDMV9EVEVJX0lSUQk0NwotI2RlZmluZSBJSUMxX0lQUl9BRERSCUlOVENfSVBSRwotI2RlZmluZSBJSUMxX0lQUl9QT1MJMAotI2RlZmluZSBJSUMxX1BSSU9SSVRZCTMKLQotLyogU0lPMCAqLwotI2RlZmluZSBTSU8wX0lSUQk4OAotI2RlZmluZSBTSU8wX0lQUl9BRERSCUlOVENfSVBSSQotI2RlZmluZSBTSU8wX0lQUl9QT1MJMwotI2RlZmluZSBTSU8wX1BSSU9SSVRZCTMKLQotLyogU0RISSAqLwotI2RlZmluZSBTREhJX1NESElJMF9JUlEJMTAwCi0jZGVmaW5lIFNESElfU0RISUkxX0lSUQkxMDEKLSNkZWZpbmUgU0RISV9TREhJSTJfSVJRCTEwMgotI2RlZmluZSBTREhJX1NESElJM19JUlEJMTAzCi0jZGVmaW5lIFNESElfSVBSX0FERFIJSU5UQ19JUFJLCi0jZGVmaW5lIFNESElfSVBSX1BPUwkwCi0jZGVmaW5lIFNESElfUFJJT1JJVFkJMwotCi0vKiBTSVUgKFNvdW5kIEludGVyZmFjZSBVbml0KSAqLwotI2RlZmluZSBTSVVfSVJRCQkxMDgKLSNkZWZpbmUgU0lVX0lQUl9BRERSCUlOVENfSVBSSgotI2RlZmluZSBTSVVfSVBSX1BPUwkxCi0jZGVmaW5lIFNJVV9QUklPUklUWQkzCi0KLSNkZWZpbmUgUE9SVF9QQUNSCTB4QTQwNTAxMDBVTAotI2RlZmluZSBQT1JUX1BCQ1IJMHhBNDA1MDEwMlVMCi0jZGVmaW5lIFBPUlRfUENDUgkweEE0MDUwMTA0VUwKLSNkZWZpbmUgUE9SVF9QRENSCTB4QTQwNTAxMDZVTAotI2RlZmluZSBQT1JUX1BFQ1IJMHhBNDA1MDEwOFVMCi0jZGVmaW5lIFBPUlRfUEZDUgkweEE0MDUwMTBBVUwKLSNkZWZpbmUgUE9SVF9QR0NSCTB4QTQwNTAxMENVTAotI2RlZmluZSBQT1JUX1BIQ1IJMHhBNDA1MDEwRVVMCi0jZGVmaW5lIFBPUlRfUEpDUgkweEE0MDUwMTEwVUwKLSNkZWZpbmUgUE9SVF9QS0NSCTB4QTQwNTAxMTJVTAotI2RlZmluZSBQT1JUX1BMQ1IJMHhBNDA1MDExNFVMCi0jZGVmaW5lIFBPUlRfU0NQQ1IJMHhBNDA1MDExNlVMCi0jZGVmaW5lIFBPUlRfUE1DUgkweEE0MDUwMTE4VUwKLSNkZWZpbmUgUE9SVF9QTkNSCTB4QTQwNTAxMUFVTAotI2RlZmluZSBQT1JUX1BRQ1IJMHhBNDA1MDExQ1VMCi0jZGVmaW5lIFBPUlRfUFJDUgkweEE0MDUwMTFFVUwKLSNkZWZpbmUgUE9SVF9QVENSCTB4QTQwNTAxNENVTAotI2RlZmluZSBQT1JUX1BVQ1IJMHhBNDA1MDE0RVVMCi0jZGVmaW5lIFBPUlRfUFZDUgkweEE0MDUwMTUwVUwKLQotI2RlZmluZSBQT1JUX1BTRUxBCTB4QTQwNTAxNDBVTAotI2RlZmluZSBQT1JUX1BTRUxCCTB4QTQwNTAxNDJVTAotI2RlZmluZSBQT1JUX1BTRUxDCTB4QTQwNTAxNDRVTAotI2RlZmluZSBQT1JUX1BTRUxFCTB4QTQwNTAxNThVTAotCi0jZGVmaW5lIFBPUlRfSElaQ1JBCTB4QTQwNTAxNDZVTAotI2RlZmluZSBQT1JUX0hJWkNSQgkweEE0MDUwMTQ4VUwKLSNkZWZpbmUgUE9SVF9EUlZDUgkweEE0MDUwMTRBVUwKLQotI2RlZmluZSBQT1JUX1BBRFIgIAkweEE0MDUwMTIwVUwKLSNkZWZpbmUgUE9SVF9QQkRSICAJMHhBNDA1MDEyMlVMCi0jZGVmaW5lIFBPUlRfUENEUiAgCTB4QTQwNTAxMjRVTAotI2RlZmluZSBQT1JUX1BERFIgIAkweEE0MDUwMTI2VUwKLSNkZWZpbmUgUE9SVF9QRURSICAJMHhBNDA1MDEyOFVMCi0jZGVmaW5lIFBPUlRfUEZEUiAgCTB4QTQwNTAxMkFVTAotI2RlZmluZSBQT1JUX1BHRFIgIAkweEE0MDUwMTJDVUwKLSNkZWZpbmUgUE9SVF9QSERSICAJMHhBNDA1MDEyRVVMCi0jZGVmaW5lIFBPUlRfUEpEUiAgCTB4QTQwNTAxMzBVTAotI2RlZmluZSBQT1JUX1BLRFIgIAkweEE0MDUwMTMyVUwKLSNkZWZpbmUgUE9SVF9QTERSICAJMHhBNDA1MDEzNFVMCi0jZGVmaW5lIFBPUlRfU0NQRFIgIAkweEE0MDUwMTM2VUwKLSNkZWZpbmUgUE9SVF9QTURSICAJMHhBNDA1MDEzOFVMCi0jZGVmaW5lIFBPUlRfUE5EUiAgCTB4QTQwNTAxM0FVTAotI2RlZmluZSBQT1JUX1BRRFIgIAkweEE0MDUwMTNDVUwKLSNkZWZpbmUgUE9SVF9QUkRSICAJMHhBNDA1MDEzRVVMCi0jZGVmaW5lIFBPUlRfUFREUiAgCTB4QTQwNTAxNkNVTAotI2RlZmluZSBQT1JUX1BVRFIgIAkweEE0MDUwMTZFVUwKLSNkZWZpbmUgUE9SVF9QVkRSICAJMHhBNDA1MDE3MFVMCi0KLSNkZWZpbmUgSVJRMF9JUlEJMzIKLSNkZWZpbmUgSVJRMV9JUlEJMzMKLSNkZWZpbmUgSVJRMl9JUlEJMzQKLSNkZWZpbmUgSVJRM19JUlEJMzUKLSNkZWZpbmUgSVJRNF9JUlEJMzYKLSNkZWZpbmUgSVJRNV9JUlEJMzcKLSNkZWZpbmUgSVJRNl9JUlEJMzgKLSNkZWZpbmUgSVJRN19JUlEJMzkKLQotI2RlZmluZSBJTlRQUkkwMAkweEE0MTQwMDEwVUwKLQotI2RlZmluZSBJUlEwX0lQUl9BRERSCUlOVFBSSTAwCi0jZGVmaW5lIElSUTFfSVBSX0FERFIJSU5UUFJJMDAKLSNkZWZpbmUgSVJRMl9JUFJfQUREUglJTlRQUkkwMAotI2RlZmluZSBJUlEzX0lQUl9BRERSCUlOVFBSSTAwCi0jZGVmaW5lIElSUTRfSVBSX0FERFIJSU5UUFJJMDAKLSNkZWZpbmUgSVJRNV9JUFJfQUREUglJTlRQUkkwMAotI2RlZmluZSBJUlE2X0lQUl9BRERSCUlOVFBSSTAwCi0jZGVmaW5lIElSUTdfSVBSX0FERFIJSU5UUFJJMDAKLQotI2RlZmluZSBJUlEwX0lQUl9QT1MJNwotI2RlZmluZSBJUlExX0lQUl9QT1MJNgotI2RlZmluZSBJUlEyX0lQUl9QT1MJNQotI2RlZmluZSBJUlEzX0lQUl9QT1MJNAotI2RlZmluZSBJUlE0X0lQUl9QT1MJMwotI2RlZmluZSBJUlE1X0lQUl9QT1MJMgotI2RlZmluZSBJUlE2X0lQUl9QT1MJMQotI2RlZmluZSBJUlE3X0lQUl9QT1MJMAotCi0jZGVmaW5lIElSUTBfUFJJT1JJVFkJMQotI2RlZmluZSBJUlExX1BSSU9SSVRZCTEKLSNkZWZpbmUgSVJRMl9QUklPUklUWQkxCi0jZGVmaW5lIElSUTNfUFJJT1JJVFkJMQotI2RlZmluZSBJUlE0X1BSSU9SSVRZCTEKLSNkZWZpbmUgSVJRNV9QUklPUklUWQkxCi0jZGVmaW5lIElSUTZfUFJJT1JJVFkJMQotI2RlZmluZSBJUlE3X1BSSU9SSVRZCTEKLQotI2VuZGlmIC8qIF9fQVNNX1NIX0lSUV9TSDczMTgwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2lycS1zaDczNDMuaCBiL2luY2x1ZGUvYXNtLXNoL2lycS1zaDczNDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxNTQxOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3MzQzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSF9JUlFfU0g3MzQzX0gKLSNkZWZpbmUgX19BU01fU0hfSVJRX1NINzM0M19ICi0KLS8qCi0gKiBsaW51eC9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3MzQzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgS2VuYXRpIFRlY2hub2xvZ2llcyBJbmMuCi0gKiBBbmRyZSBNY2N1cmR5IDxhbmRyZUBrZW5hdGkuY29tPgotICogUmFuaml0IERlc2hwYW5kZSA8cmFuaml0QGtlbmF0aS5jb20+Ci0gKi8KLQotI3VuZGVmIElOVENfSVBSQQotI3VuZGVmIElOVENfSVBSQgotI3VuZGVmIElOVENfSVBSQwotI3VuZGVmIElOVENfSVBSRAotCi0jdW5kZWYgRE1URTBfSVJRCi0jdW5kZWYgRE1URTFfSVJRCi0jdW5kZWYgRE1URTJfSVJRCi0jdW5kZWYgRE1URTNfSVJRCi0jdW5kZWYgRE1URTRfSVJRCi0jdW5kZWYgRE1URTVfSVJRCi0jdW5kZWYgRE1URTZfSVJRCi0jdW5kZWYgRE1URTdfSVJRCi0jdW5kZWYgRE1BRV9JUlEKLSN1bmRlZiBETUFfSVBSX0FERFIKLSN1bmRlZiBETUFfSVBSX1BPUwotI3VuZGVmIERNQV9QUklPUklUWQotCi0jdW5kZWYgSU5UQ19JTUNSMAotI3VuZGVmIElOVENfSU1DUjEKLSN1bmRlZiBJTlRDX0lNQ1IyCi0jdW5kZWYgSU5UQ19JTUNSMwotI3VuZGVmIElOVENfSU1DUjQKLSN1bmRlZiBJTlRDX0lNQ1I1Ci0jdW5kZWYgSU5UQ19JTUNSNgotI3VuZGVmIElOVENfSU1DUjcKLSN1bmRlZiBJTlRDX0lNQ1I4Ci0jdW5kZWYgSU5UQ19JTUNSOQotI3VuZGVmIElOVENfSU1DUjEwCi0KLQotI2RlZmluZSBJTlRDX0lQUkEgIAkweEE0MDgwMDAwVUwKLSNkZWZpbmUgSU5UQ19JUFJCICAJMHhBNDA4MDAwNFVMCi0jZGVmaW5lIElOVENfSVBSQyAgCTB4QTQwODAwMDhVTAotI2RlZmluZSBJTlRDX0lQUkQgIAkweEE0MDgwMDBDVUwKLSNkZWZpbmUgSU5UQ19JUFJFICAJMHhBNDA4MDAxMFVMCi0jZGVmaW5lIElOVENfSVBSRiAgCTB4QTQwODAwMTRVTAotI2RlZmluZSBJTlRDX0lQUkcgIAkweEE0MDgwMDE4VUwKLSNkZWZpbmUgSU5UQ19JUFJIICAJMHhBNDA4MDAxQ1VMCi0jZGVmaW5lIElOVENfSVBSSSAgCTB4QTQwODAwMjBVTAotI2RlZmluZSBJTlRDX0lQUkogIAkweEE0MDgwMDI0VUwKLSNkZWZpbmUgSU5UQ19JUFJLICAJMHhBNDA4MDAyOFVMCi0jZGVmaW5lIElOVENfSVBSTCAgCTB4QTQwODAwMkNVTAotCi0jZGVmaW5lIElOVENfSU1SMAkweEE0MDgwMDgwVUwKLSNkZWZpbmUgSU5UQ19JTVIxCTB4QTQwODAwODRVTAotI2RlZmluZSBJTlRDX0lNUjIJMHhBNDA4MDA4OFVMCi0jZGVmaW5lIElOVENfSU1SMwkweEE0MDgwMDhDVUwKLSNkZWZpbmUgSU5UQ19JTVI0CTB4QTQwODAwOTBVTAotI2RlZmluZSBJTlRDX0lNUjUJMHhBNDA4MDA5NFVMCi0jZGVmaW5lIElOVENfSU1SNgkweEE0MDgwMDk4VUwKLSNkZWZpbmUgSU5UQ19JTVI3CTB4QTQwODAwOUNVTAotI2RlZmluZSBJTlRDX0lNUjgJMHhBNDA4MDBBMFVMCi0jZGVmaW5lIElOVENfSU1SOQkweEE0MDgwMEE0VUwKLSNkZWZpbmUgSU5UQ19JTVIxMAkweEE0MDgwMEE4VUwKLSNkZWZpbmUgSU5UQ19JTVIxMQkweEE0MDgwMEFDVUwKLQotI2RlZmluZSBJTlRDX0lNQ1IwCTB4QTQwODAwQzBVTAotI2RlZmluZSBJTlRDX0lNQ1IxCTB4QTQwODAwQzRVTAotI2RlZmluZSBJTlRDX0lNQ1IyCTB4QTQwODAwQzhVTAotI2RlZmluZSBJTlRDX0lNQ1IzCTB4QTQwODAwQ0NVTAotI2RlZmluZSBJTlRDX0lNQ1I0CTB4QTQwODAwRDBVTAotI2RlZmluZSBJTlRDX0lNQ1I1CTB4QTQwODAwRDRVTAotI2RlZmluZSBJTlRDX0lNQ1I2CTB4QTQwODAwRDhVTAotI2RlZmluZSBJTlRDX0lNQ1I3CTB4QTQwODAwRENVTAotI2RlZmluZSBJTlRDX0lNQ1I4CTB4QTQwODAwRTBVTAotI2RlZmluZSBJTlRDX0lNQ1I5CTB4QTQwODAwRTRVTAotI2RlZmluZSBJTlRDX0lNQ1IxMAkweEE0MDgwMEU4VUwKLSNkZWZpbmUgSU5UQ19JTUNSMTEJMHhBNDA4MDBFQ1VMCi0KLSNkZWZpbmUgSU5UQ19JQ1IwCTB4QTQxNDAwMDBVTAotI2RlZmluZSBJTlRDX0lDUjEJMHhBNDE0MDAxQ1VMCi0KLSNkZWZpbmUgSU5UTVNLMAkJMHhhNDE0MDA0NAotI2RlZmluZSBJTlRNU0tDTFIwCTB4YTQxNDAwNjQKLSNkZWZpbmUgSU5UQ19JTlRQUkkwCTB4YTQxNDAwMTAKLQotLyoKLSAgTk9URToKLQotICAqX0lSUSA9IChJTlRFVlQyIC0gMHgyMDApLzB4MjAKLSovCi0KLS8qIFRNVTAgKi8KLSNkZWZpbmUgVE1VMF9JUlEJMTYKLSNkZWZpbmUgVE1VMF9JUFJfQUREUglJTlRDX0lQUkEKLSNkZWZpbmUgVE1VMF9JUFJfUE9TCSAzCi0jZGVmaW5lIFRNVTBfUFJJT1JJVFkJIDIKLQotI2RlZmluZSBUSU1FUl9JUlEgICAgICAgMTYKLSNkZWZpbmUgVElNRVJfSVBSX0FERFIgIElOVENfSVBSQQotI2RlZmluZSBUSU1FUl9JUFJfUE9TICAgIDMKLSNkZWZpbmUgVElNRVJfUFJJT1JJVFkgICAyCi0KLS8qIFRNVTEgKi8KLSNkZWZpbmUgVE1VMV9JUlEJMTcKLSNkZWZpbmUgVE1VMV9JUFJfQUREUglJTlRDX0lQUkEKLSNkZWZpbmUgVE1VMV9JUFJfUE9TCSAyCi0jZGVmaW5lIFRNVTFfUFJJT1JJVFkJIDIKLQotLyogVE1VMiAqLwotI2RlZmluZSBUTVUyX0lSUQkxOAotI2RlZmluZSBUTVUyX0lQUl9BRERSCUlOVENfSVBSQQotI2RlZmluZSBUTVUyX0lQUl9QT1MJIDEKLSNkZWZpbmUgVE1VMl9QUklPUklUWQkgMgotCi0vKiBMQ0RDICovCi0jZGVmaW5lIExDRENfSVJRCTI4Ci0jZGVmaW5lIExDRENfSVBSX0FERFIJSU5UQ19JUFJCCi0jZGVmaW5lIExDRENfSVBSX1BPUwkgMgotI2RlZmluZSBMQ0RDX1BSSU9SSVRZCSAyCi0KLS8qIFZJTyAoVmlkZW8gSS9PKSAqLwotI2RlZmluZSBDRVVfSVJRCQk1MgotI2RlZmluZSBCRVVfSVJRCQk1MwotI2RlZmluZSBWRVVfSVJRCQk1NAotI2RlZmluZSBWT1VfSVJRCQk1NQotI2RlZmluZSBWSU9fSVBSX0FERFIJSU5UQ19JUFJFCi0jZGVmaW5lIFZJT19JUFJfUE9TCSAyCi0jZGVmaW5lIFZJT19QUklPUklUWQkgMgotCi0vKiBNRkkgKE11bHRpIEZ1bmN0aW9uYWwgSW50ZXJmYWNlKSAqLwotI2RlZmluZSBNRklfSVJRCQk1NgotI2RlZmluZSBNRklfSVBSX0FERFIJSU5UQ19JUFJFCi0jZGVmaW5lIE1GSV9JUFJfUE9TCSAxCi0jZGVmaW5lIE1GSV9QUklPUklUWQkgMgotCi0vKiBWUFUgKFZpZGVvIFByb2Nlc3NpbmcgVW5pdCkgKi8KLSNkZWZpbmUgVlBVX0lSUQkJNjAKLSNkZWZpbmUgVlBVX0lQUl9BRERSCUlOVENfSVBSRQotI2RlZmluZSBWUFVfSVBSX1BPUwkgMAotI2RlZmluZSBWUFVfUFJJT1JJVFkJIDIKLQotLyogM0RHICovCi0jZGVmaW5lIFRER19JUlEJCTYzCi0jZGVmaW5lIFRER19JUFJfQUREUglJTlRDX0lQUkoKLSNkZWZpbmUgVERHX0lQUl9QT1MJIDIKLSNkZWZpbmUgVERHX1BSSU9SSVRZCSAyCi0KLS8qIERNQUMoMSkgKi8KLSNkZWZpbmUgRE1URTBfSVJRCTQ4Ci0jZGVmaW5lIERNVEUxX0lSUQk0OQotI2RlZmluZSBETVRFMl9JUlEJNTAKLSNkZWZpbmUgRE1URTNfSVJRCTUxCi0jZGVmaW5lIERNQTFfSVBSX0FERFIJSU5UQ19JUFJFCi0jZGVmaW5lIERNQTFfSVBSX1BPUwkzCi0jZGVmaW5lIERNQTFfUFJJT1JJVFkJNwotCi0vKiBETUFDKDIpICovCi0jZGVmaW5lIERNVEU0X0lSUQk3NgotI2RlZmluZSBETVRFNV9JUlEJNzcKLSNkZWZpbmUgRE1BMl9JUFJfQUREUglJTlRDX0lQUkYKLSNkZWZpbmUgRE1BMl9JUFJfUE9TCTIKLSNkZWZpbmUgRE1BMl9QUklPUklUWQk3Ci0KLS8qIFNDSUYwICovCi0jZGVmaW5lIFNDSUZfRVJJX0lSUQk4MAotI2RlZmluZSBTQ0lGX1JYSV9JUlEJODEKLSNkZWZpbmUgU0NJRl9CUklfSVJRCTgyCi0jZGVmaW5lIFNDSUZfVFhJX0lSUQk4MwotI2RlZmluZSBTQ0lGX0lQUl9BRERSCUlOVENfSVBSRwotI2RlZmluZSBTQ0lGX0lQUl9QT1MJMwotI2RlZmluZSBTQ0lGX1BSSU9SSVRZCTMKLQotLyogU0lPRjAgKi8KLSNkZWZpbmUgU0lPRjBfSVJRCTg0Ci0jZGVmaW5lIFNJT0YwX0lQUl9BRERSCUlOVENfSVBSSAotI2RlZmluZSBTSU9GMF9JUFJfUE9TCTMKLSNkZWZpbmUgU0lPRjBfUFJJT1JJVFkJMwotCi0vKiBGTENUTCAoRmxhc2ggTWVtb3J5IENvbnRyb2xsZXIpICovCi0jZGVmaW5lIEZMU1RFX0lSUQk5MgotI2RlZmluZSBGTFRFTkRfSVJRCTkzCi0jZGVmaW5lIEZMVFJRMF9JUlEJOTQKLSNkZWZpbmUgRkxUUlExX0lSUQk5NQotI2RlZmluZSBGTENUTF9JUFJfQUREUglJTlRDX0lQUkgKLSNkZWZpbmUgRkxDVExfSVBSX1BPUwkxCi0jZGVmaW5lIEZMQ1RMX1BSSU9SSVRZCTMKLQotLyogSUlDKDApIChJSUMgQnVzIEludGVyZmFjZSkgKi8KLSNkZWZpbmUgSUlDMF9BTElfSVJRCTk2Ci0jZGVmaW5lIElJQzBfVEFDS0lfSVJRCTk3Ci0jZGVmaW5lIElJQzBfV0FJVElfSVJRCTk4Ci0jZGVmaW5lIElJQzBfRFRFSV9JUlEJOTkKLSNkZWZpbmUgSUlDMF9JUFJfQUREUglJTlRDX0lQUkgKLSNkZWZpbmUgSUlDMF9JUFJfUE9TCTAKLSNkZWZpbmUgSUlDMF9QUklPUklUWQkzCi0KLS8qIElJQygxKSAoSUlDIEJ1cyBJbnRlcmZhY2UpICovCi0jZGVmaW5lIElJQzFfQUxJX0lSUQk0NAotI2RlZmluZSBJSUMxX1RBQ0tJX0lSUQk0NQotI2RlZmluZSBJSUMxX1dBSVRJX0lSUQk0NgotI2RlZmluZSBJSUMxX0RURUlfSVJRCTQ3Ci0jZGVmaW5lIElJQzFfSVBSX0FERFIJSU5UQ19JUFJJCi0jZGVmaW5lIElJQzFfSVBSX1BPUwkwCi0jZGVmaW5lIElJQzFfUFJJT1JJVFkJMwotCi0vKiBTSU8wICovCi0jZGVmaW5lIFNJTzBfSVJRCTg4Ci0jZGVmaW5lIFNJTzBfSVBSX0FERFIJSU5UQ19JUFJJCi0jZGVmaW5lIFNJTzBfSVBSX1BPUwkzCi0jZGVmaW5lIFNJTzBfUFJJT1JJVFkJMwotCi0vKiBTREhJICovCi0jZGVmaW5lIFNESElfU0RISUkwX0lSUQkxMDAKLSNkZWZpbmUgU0RISV9TREhJSTFfSVJRCTEwMQotI2RlZmluZSBTREhJX1NESElJMl9JUlEJMTAyCi0jZGVmaW5lIFNESElfU0RISUkzX0lSUQkxMDMKLSNkZWZpbmUgU0RISV9JUFJfQUREUglJTlRDX0lQUksKLSNkZWZpbmUgU0RISV9JUFJfUE9TCTAKLSNkZWZpbmUgU0RISV9QUklPUklUWQkzCi0KLS8qIFNJVSAoU291bmQgSW50ZXJmYWNlIFVuaXQpICovCi0jZGVmaW5lIFNJVV9JUlEJCTEwOAotI2RlZmluZSBTSVVfSVBSX0FERFIJSU5UQ19JUFJKCi0jZGVmaW5lIFNJVV9JUFJfUE9TCTEKLSNkZWZpbmUgU0lVX1BSSU9SSVRZCTMKLQotI2RlZmluZSBQT1JUX1BBQ1IJMHhBNDA1MDEwMFVMCi0jZGVmaW5lIFBPUlRfUEJDUgkweEE0MDUwMTAyVUwKLSNkZWZpbmUgUE9SVF9QQ0NSCTB4QTQwNTAxMDRVTAotI2RlZmluZSBQT1JUX1BEQ1IJMHhBNDA1MDEwNlVMCi0jZGVmaW5lIFBPUlRfUEVDUgkweEE0MDUwMTA4VUwKLSNkZWZpbmUgUE9SVF9QRkNSCTB4QTQwNTAxMEFVTAotI2RlZmluZSBQT1JUX1BHQ1IJMHhBNDA1MDEwQ1VMCi0jZGVmaW5lIFBPUlRfUEhDUgkweEE0MDUwMTBFVUwKLSNkZWZpbmUgUE9SVF9QSkNSCTB4QTQwNTAxMTBVTAotI2RlZmluZSBQT1JUX1BLQ1IJMHhBNDA1MDExMlVMCi0jZGVmaW5lIFBPUlRfUExDUgkweEE0MDUwMTE0VUwKLSNkZWZpbmUgUE9SVF9TQ1BDUgkweEE0MDUwMTE2VUwKLSNkZWZpbmUgUE9SVF9QTUNSCTB4QTQwNTAxMThVTAotI2RlZmluZSBQT1JUX1BOQ1IJMHhBNDA1MDExQVVMCi0jZGVmaW5lIFBPUlRfUFFDUgkweEE0MDUwMTFDVUwKLSNkZWZpbmUgUE9SVF9QUkNSCTB4QTQwNTAxMUVVTAotI2RlZmluZSBQT1JUX1BUQ1IJMHhBNDA1MDE0Q1VMCi0jZGVmaW5lIFBPUlRfUFVDUgkweEE0MDUwMTRFVUwKLSNkZWZpbmUgUE9SVF9QVkNSCTB4QTQwNTAxNTBVTAotCi0jZGVmaW5lIFBPUlRfUFNFTEEJMHhBNDA1MDE0MFVMCi0jZGVmaW5lIFBPUlRfUFNFTEIJMHhBNDA1MDE0MlVMCi0jZGVmaW5lIFBPUlRfUFNFTEMJMHhBNDA1MDE0NFVMCi0jZGVmaW5lIFBPUlRfUFNFTEUJMHhBNDA1MDE1OFVMCi0KLSNkZWZpbmUgUE9SVF9ISVpDUkEJMHhBNDA1MDE0NlVMCi0jZGVmaW5lIFBPUlRfSElaQ1JCCTB4QTQwNTAxNDhVTAotI2RlZmluZSBQT1JUX0RSVkNSCTB4QTQwNTAxNEFVTAotCi0jZGVmaW5lIFBPUlRfUEFEUiAgCTB4QTQwNTAxMjBVTAotI2RlZmluZSBQT1JUX1BCRFIgIAkweEE0MDUwMTIyVUwKLSNkZWZpbmUgUE9SVF9QQ0RSICAJMHhBNDA1MDEyNFVMCi0jZGVmaW5lIFBPUlRfUEREUiAgCTB4QTQwNTAxMjZVTAotI2RlZmluZSBQT1JUX1BFRFIgIAkweEE0MDUwMTI4VUwKLSNkZWZpbmUgUE9SVF9QRkRSICAJMHhBNDA1MDEyQVVMCi0jZGVmaW5lIFBPUlRfUEdEUiAgCTB4QTQwNTAxMkNVTAotI2RlZmluZSBQT1JUX1BIRFIgIAkweEE0MDUwMTJFVUwKLSNkZWZpbmUgUE9SVF9QSkRSICAJMHhBNDA1MDEzMFVMCi0jZGVmaW5lIFBPUlRfUEtEUiAgCTB4QTQwNTAxMzJVTAotI2RlZmluZSBQT1JUX1BMRFIgIAkweEE0MDUwMTM0VUwKLSNkZWZpbmUgUE9SVF9TQ1BEUiAgCTB4QTQwNTAxMzZVTAotI2RlZmluZSBQT1JUX1BNRFIgIAkweEE0MDUwMTM4VUwKLSNkZWZpbmUgUE9SVF9QTkRSICAJMHhBNDA1MDEzQVVMCi0jZGVmaW5lIFBPUlRfUFFEUiAgCTB4QTQwNTAxM0NVTAotI2RlZmluZSBQT1JUX1BSRFIgIAkweEE0MDUwMTNFVUwKLSNkZWZpbmUgUE9SVF9QVERSICAJMHhBNDA1MDE2Q1VMCi0jZGVmaW5lIFBPUlRfUFVEUiAgCTB4QTQwNTAxNkVVTAotI2RlZmluZSBQT1JUX1BWRFIgIAkweEE0MDUwMTcwVUwKLQotI2RlZmluZSBJUlEwX0lSUQkzMgotI2RlZmluZSBJUlExX0lSUQkzMwotI2RlZmluZSBJUlEyX0lSUQkzNAotI2RlZmluZSBJUlEzX0lSUQkzNQotI2RlZmluZSBJUlE0X0lSUQkzNgotI2RlZmluZSBJUlE1X0lSUQkzNwotI2RlZmluZSBJUlE2X0lSUQkzOAotI2RlZmluZSBJUlE3X0lSUQkzOQotCi0jZGVmaW5lIElOVFBSSTAwCTB4QTQxNDAwMTBVTAotCi0jZGVmaW5lIElSUTBfSVBSX0FERFIJSU5UUFJJMDAKLSNkZWZpbmUgSVJRMV9JUFJfQUREUglJTlRQUkkwMAotI2RlZmluZSBJUlEyX0lQUl9BRERSCUlOVFBSSTAwCi0jZGVmaW5lIElSUTNfSVBSX0FERFIJSU5UUFJJMDAKLSNkZWZpbmUgSVJRNF9JUFJfQUREUglJTlRQUkkwMAotI2RlZmluZSBJUlE1X0lQUl9BRERSCUlOVFBSSTAwCi0jZGVmaW5lIElSUTZfSVBSX0FERFIJSU5UUFJJMDAKLSNkZWZpbmUgSVJRN19JUFJfQUREUglJTlRQUkkwMAotCi0jZGVmaW5lIElSUTBfSVBSX1BPUwk3Ci0jZGVmaW5lIElSUTFfSVBSX1BPUwk2Ci0jZGVmaW5lIElSUTJfSVBSX1BPUwk1Ci0jZGVmaW5lIElSUTNfSVBSX1BPUwk0Ci0jZGVmaW5lIElSUTRfSVBSX1BPUwkzCi0jZGVmaW5lIElSUTVfSVBSX1BPUwkyCi0jZGVmaW5lIElSUTZfSVBSX1BPUwkxCi0jZGVmaW5lIElSUTdfSVBSX1BPUwkwCi0KLSNkZWZpbmUgSVJRMF9QUklPUklUWQkxCi0jZGVmaW5lIElSUTFfUFJJT1JJVFkJMQotI2RlZmluZSBJUlEyX1BSSU9SSVRZCTEKLSNkZWZpbmUgSVJRM19QUklPUklUWQkxCi0jZGVmaW5lIElSUTRfUFJJT1JJVFkJMQotI2RlZmluZSBJUlE1X1BSSU9SSVRZCTEKLSNkZWZpbmUgSVJRNl9QUklPUklUWQkxCi0jZGVmaW5lIElSUTdfUFJJT1JJVFkJMQotCi0jZW5kaWYgLyogX19BU01fU0hfSVJRX1NINzM0M19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3NzgwLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3NzgwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWM1NzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzc4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfSVJRX1NINzc4MF9ICi0jZGVmaW5lIF9fQVNNX1NIX0lSUV9TSDc3ODBfSAotCi0vKgotICogbGludXgvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzc4MC5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IFRha2FzaGkgU0hVRE8gPHNodWRvQGhpdGFjaGktdWwuY28uanA+Ci0gKi8KLQotI2lmZGVmIENPTkZJR19JREUKLSMgaWZuZGVmIElSUV9DRkNBUkQKLSMgIGRlZmluZSBJUlFfQ0ZDQVJECTE0Ci0jIGVuZGlmCi0jIGlmbmRlZiBJUlFfUENNQ0lBCi0jICBkZWZpbmUgSVJRX1BDTUNJQQkxNQotIyBlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgSU5UQ19CQVNFCTB4ZmZkMDAwMDAKLSNkZWZpbmUgSU5UQ19JQ1IwCShJTlRDX0JBU0UrMHgwKQotI2RlZmluZSBJTlRDX0lDUjEJKElOVENfQkFTRSsweDFjKQotI2RlZmluZSBJTlRDX0lOVFBSSQkoSU5UQ19CQVNFKzB4MTApCi0jZGVmaW5lIElOVENfSU5UUkVRCShJTlRDX0JBU0UrMHgyNCkKLSNkZWZpbmUgSU5UQ19JTlRNU0swCShJTlRDX0JBU0UrMHg0NCkKLSNkZWZpbmUgSU5UQ19JTlRNU0sxCShJTlRDX0JBU0UrMHg0OCkKLSNkZWZpbmUgSU5UQ19JTlRNU0syCShJTlRDX0JBU0UrMHg0MDA4MCkKLSNkZWZpbmUgSU5UQ19JTlRNU0tDTFIwCShJTlRDX0JBU0UrMHg2NCkKLSNkZWZpbmUgSU5UQ19JTlRNU0tDTFIxCShJTlRDX0JBU0UrMHg2OCkKLSNkZWZpbmUgSU5UQ19JTlRNU0tDTFIyCShJTlRDX0JBU0UrMHg0MDA4NCkKLSNkZWZpbmUgSU5UQ19OTUlGQ1IJKElOVENfQkFTRSsweGMwKQotI2RlZmluZSBJTlRDX1VTRVJJTUFTSwkoSU5UQ19CQVNFKzB4MzAwMDApCi0KLSNkZWZpbmUJSU5UQ19JTlQyUFJJMAkoSU5UQ19CQVNFKzB4NDAwMDApCi0jZGVmaW5lCUlOVENfSU5UMlBSSTEJKElOVENfQkFTRSsweDQwMDA0KQotI2RlZmluZQlJTlRDX0lOVDJQUkkyCShJTlRDX0JBU0UrMHg0MDAwOCkKLSNkZWZpbmUJSU5UQ19JTlQyUFJJMwkoSU5UQ19CQVNFKzB4NDAwMGMpCi0jZGVmaW5lCUlOVENfSU5UMlBSSTQJKElOVENfQkFTRSsweDQwMDEwKQotI2RlZmluZQlJTlRDX0lOVDJQUkk1CShJTlRDX0JBU0UrMHg0MDAxNCkKLSNkZWZpbmUJSU5UQ19JTlQyUFJJNgkoSU5UQ19CQVNFKzB4NDAwMTgpCi0jZGVmaW5lCUlOVENfSU5UMlBSSTcJKElOVENfQkFTRSsweDQwMDFjKQotI2RlZmluZQlJTlRDX0lOVDJBMAkoSU5UQ19CQVNFKzB4NDAwMzApCi0jZGVmaW5lCUlOVENfSU5UMkExCShJTlRDX0JBU0UrMHg0MDAzNCkKLSNkZWZpbmUJSU5UQ19JTlQyTVNLUgkoSU5UQ19CQVNFKzB4NDAwMzgpCi0jZGVmaW5lCUlOVENfSU5UMk1TS0NSCShJTlRDX0JBU0UrMHg0MDAzYykKLSNkZWZpbmUJSU5UQ19JTlQyQjAJKElOVENfQkFTRSsweDQwMDQwKQotI2RlZmluZQlJTlRDX0lOVDJCMQkoSU5UQ19CQVNFKzB4NDAwNDQpCi0jZGVmaW5lCUlOVENfSU5UMkIyCShJTlRDX0JBU0UrMHg0MDA0OCkKLSNkZWZpbmUJSU5UQ19JTlQyQjMJKElOVENfQkFTRSsweDQwMDRjKQotI2RlZmluZQlJTlRDX0lOVDJCNAkoSU5UQ19CQVNFKzB4NDAwNTApCi0jZGVmaW5lCUlOVENfSU5UMkI1CShJTlRDX0JBU0UrMHg0MDA1NCkKLSNkZWZpbmUJSU5UQ19JTlQyQjYJKElOVENfQkFTRSsweDQwMDU4KQotI2RlZmluZQlJTlRDX0lOVDJCNwkoSU5UQ19CQVNFKzB4NDAwNWMpCi0jZGVmaW5lCUlOVENfSU5UMkdQSUMJKElOVENfQkFTRSsweDQwMDkwKQotLyoKLSAgTk9URToKLSAgKl9JUlEgPSAoSU5URVZUMiAtIDB4MjAwKS8weDIwCi0qLwotLyogSVJRIDAtNyBsaW5lIGV4dGVybmFsIGludCovCi0jZGVmaW5lIElSUTBfSVJRCTIKLSNkZWZpbmUgSVJRMF9JUFJfQUREUglJTlRDX0lOVFBSSQotI2RlZmluZSBJUlEwX0lQUl9QT1MJNwotI2RlZmluZSBJUlEwX1BSSU9SSVRZCTIKLQotI2RlZmluZSBJUlExX0lSUQk0Ci0jZGVmaW5lIElSUTFfSVBSX0FERFIJSU5UQ19JTlRQUkkKLSNkZWZpbmUgSVJRMV9JUFJfUE9TCTYKLSNkZWZpbmUgSVJRMV9QUklPUklUWQkyCi0KLSNkZWZpbmUgSVJRMl9JUlEJNgotI2RlZmluZSBJUlEyX0lQUl9BRERSCUlOVENfSU5UUFJJCi0jZGVmaW5lIElSUTJfSVBSX1BPUwk1Ci0jZGVmaW5lIElSUTJfUFJJT1JJVFkJMgotCi0jZGVmaW5lIElSUTNfSVJRCTgKLSNkZWZpbmUgSVJRM19JUFJfQUREUglJTlRDX0lOVFBSSQotI2RlZmluZSBJUlEzX0lQUl9QT1MJNAotI2RlZmluZSBJUlEzX1BSSU9SSVRZCTIKLQotI2RlZmluZSBJUlE0X0lSUQkxMAotI2RlZmluZSBJUlE0X0lQUl9BRERSCUlOVENfSU5UUFJJCi0jZGVmaW5lIElSUTRfSVBSX1BPUwkzCi0jZGVmaW5lIElSUTRfUFJJT1JJVFkJMgotCi0jZGVmaW5lIElSUTVfSVJRCTEyCi0jZGVmaW5lIElSUTVfSVBSX0FERFIJSU5UQ19JTlRQUkkKLSNkZWZpbmUgSVJRNV9JUFJfUE9TCTIKLSNkZWZpbmUgSVJRNV9QUklPUklUWQkyCi0KLSNkZWZpbmUgSVJRNl9JUlEJMTQKLSNkZWZpbmUgSVJRNl9JUFJfQUREUglJTlRDX0lOVFBSSQotI2RlZmluZSBJUlE2X0lQUl9QT1MJMQotI2RlZmluZSBJUlE2X1BSSU9SSVRZCTIKLQotI2RlZmluZSBJUlE3X0lSUQkwCi0jZGVmaW5lIElSUTdfSVBSX0FERFIJSU5UQ19JTlRQUkkKLSNkZWZpbmUgSVJRN19JUFJfUE9TCTAKLSNkZWZpbmUgSVJRN19QUklPUklUWQkyCi0KLS8qIFRNVSAqLwotLyogY2gwICovCi0jZGVmaW5lIFRNVV9JUlEJCTI4Ci0jZGVmaW5lCVRNVV9JUFJfQUREUglJTlRDX0lOVDJQUkkwCi0jZGVmaW5lCVRNVV9JUFJfUE9TCTMKLSNkZWZpbmUgVE1VX1BSSU9SSVRZCTIKLQotI2RlZmluZSBUSU1FUl9JUlEJMjgKLSNkZWZpbmUJVElNRVJfSVBSX0FERFIJSU5UQ19JTlQyUFJJMAotI2RlZmluZQlUSU1FUl9JUFJfUE9TCTMKLSNkZWZpbmUgVElNRVJfUFJJT1JJVFkJMgotCi0vKiBjaCAxKi8KLSNkZWZpbmUgVE1VX0NIMV9JUlEJCTI5Ci0jZGVmaW5lCVRNVV9DSDFfSVBSX0FERFIJSU5UQ19JTlQyUFJJMAotI2RlZmluZQlUTVVfQ0gxX0lQUl9QT1MJCTIKLSNkZWZpbmUgVE1VX0NIMV9QUklPUklUWQkyCi0KLSNkZWZpbmUgVElNRVIxX0lSUQkyOQotI2RlZmluZQlUSU1FUjFfSVBSX0FERFIJSU5UQ19JTlQyUFJJMAotI2RlZmluZQlUSU1FUjFfSVBSX1BPUwkyCi0jZGVmaW5lIFRJTUVSMV9QUklPUklUWQkyCi0KLS8qIGNoIDIqLwotI2RlZmluZSBUTVVfQ0gyX0lSUQkJMzAKLSNkZWZpbmUJVE1VX0NIMl9JUFJfQUREUglJTlRDX0lOVDJQUkkwCi0jZGVmaW5lCVRNVV9DSDJfSVBSX1BPUwkJMQotI2RlZmluZSBUTVVfQ0gyX1BSSU9SSVRZCTIKLS8qIGNoIDIgSW5wdXQgY2FwdHVyZSAqLwotI2RlZmluZSBUTVVfQ0gySUNfSVJRCQkzMQotI2RlZmluZQlUTVVfQ0gySUNfSVBSX0FERFIJSU5UQ19JTlQyUFJJMAotI2RlZmluZQlUTVVfQ0gySUNfSVBSX1BPUwkwCi0jZGVmaW5lIFRNVV9DSDJJQ19QUklPUklUWQkyCi0vKiBjaCAzICovCi0jZGVmaW5lIFRNVV9DSDNfSVJRCQk5NgotI2RlZmluZQlUTVVfQ0gzX0lQUl9BRERSCUlOVENfSU5UMlBSSTEKLSNkZWZpbmUJVE1VX0NIM19JUFJfUE9TCQkzCi0jZGVmaW5lIFRNVV9DSDNfUFJJT1JJVFkJMgotLyogY2ggNCAqLwotI2RlZmluZSBUTVVfQ0g0X0lSUQkJOTcKLSNkZWZpbmUJVE1VX0NINF9JUFJfQUREUglJTlRDX0lOVDJQUkkxCi0jZGVmaW5lCVRNVV9DSDRfSVBSX1BPUwkJMgotI2RlZmluZSBUTVVfQ0g0X1BSSU9SSVRZCTIKLS8qIGNoIDUqLwotI2RlZmluZSBUTVVfQ0g1X0lSUQkJOTgKLSNkZWZpbmUJVE1VX0NINV9JUFJfQUREUglJTlRDX0lOVDJQUkkxCi0jZGVmaW5lCVRNVV9DSDVfSVBSX1BPUwkJMQotI2RlZmluZSBUTVVfQ0g1X1BSSU9SSVRZCTIKLQotLyogU0NJRjAgKi8KLSNkZWZpbmUgU0NJRjBfRVJJX0lSUQk0MAotI2RlZmluZSBTQ0lGMF9SWElfSVJRCTQxCi0jZGVmaW5lIFNDSUYwX0JSSV9JUlEJNDIKLSNkZWZpbmUgU0NJRjBfVFhJX0lSUQk0MwotI2RlZmluZQlTQ0lGMF9JUFJfQUREUglJTlRDX0lOVDJQUkkyCi0jZGVmaW5lCVNDSUYwX0lQUl9QT1MJMwotI2RlZmluZSBTQ0lGMF9QUklPUklUWQkzCi0KLS8qIFNDSUYxICovCi0jZGVmaW5lIFNDSUYxX0VSSV9JUlEJNzYKLSNkZWZpbmUgU0NJRjFfUlhJX0lSUQk3NwotI2RlZmluZSBTQ0lGMV9CUklfSVJRCTc4Ci0jZGVmaW5lIFNDSUYxX1RYSV9JUlEJNzkKLSNkZWZpbmUJU0NJRjFfSVBSX0FERFIJSU5UQ19JTlQyUFJJMgotI2RlZmluZQlTQ0lGMV9JUFJfUE9TCTIKLSNkZWZpbmUgU0NJRjFfUFJJT1JJVFkJMwotCi0jZGVmaW5lCVdEVF9JUlEJCTI3Ci0jZGVmaW5lCVdEVF9JUFJfQUREUglJTlRDX0lOVDJQUkkyCi0jZGVmaW5lCVdEVF9JUFJfUE9TCTEKLSNkZWZpbmUJV0RUX1BSSU9SSVRZCTIKLQotLyogRE1BQygwKSAqLwotI2RlZmluZQlETUlOVDBfSVJRCTM0Ci0jZGVmaW5lCURNSU5UMV9JUlEJMzUKLSNkZWZpbmUJRE1JTlQyX0lSUQkzNgotI2RlZmluZQlETUlOVDNfSVJRCTM3Ci0jZGVmaW5lCURNSU5UNF9JUlEJNDQKLSNkZWZpbmUJRE1JTlQ1X0lSUQk0NQotI2RlZmluZQlETUlOVDZfSVJRCTQ2Ci0jZGVmaW5lCURNSU5UN19JUlEJNDcKLSNkZWZpbmUJRE1BRV9JUlEJMzgKLSNkZWZpbmUJRE1BMF9JUFJfQUREUglJTlRDX0lOVDJQUkkzCi0jZGVmaW5lCURNQTBfSVBSX1BPUwkyCi0jZGVmaW5lCURNQTBfUFJJT1JJVFkJNwotCi0vKiBETUFDKDEpICovCi0jZGVmaW5lCURNSU5UOF9JUlEJOTIKLSNkZWZpbmUJRE1JTlQ5X0lSUQk5MwotI2RlZmluZQlETUlOVDEwX0lSUQk5NAotI2RlZmluZQlETUlOVDExX0lSUQk5NQotI2RlZmluZQlETUExX0lQUl9BRERSCUlOVENfSU5UMlBSSTMKLSNkZWZpbmUJRE1BMV9JUFJfUE9TCTEKLSNkZWZpbmUJRE1BMV9QUklPUklUWQk3Ci0KLSNkZWZpbmUJRE1URTBfSVJRCURNSU5UMF9JUlEKLSNkZWZpbmUJRE1URTRfSVJRCURNSU5UNF9JUlEKLSNkZWZpbmUJRE1BX0lQUl9BRERSCURNQTBfSVBSX0FERFIKLSNkZWZpbmUJRE1BX0lQUl9QT1MJRE1BMF9JUFJfUE9TCi0jZGVmaW5lCURNQV9QUklPUklUWQlETUEwX1BSSU9SSVRZCi0KLS8qIENNVCAqLwotI2RlZmluZQlDTVRfSVJRCQk1NgotI2RlZmluZQlDTVRfSVBSX0FERFIJSU5UQ19JTlQyUFJJNAotI2RlZmluZQlDTVRfSVBSX1BPUwkzCi0jZGVmaW5lCUNNVF9QUklPUklUWQkwCi0KLS8qIEhBQyAqLwotI2RlZmluZQlIQUNfSVJRCQk2MAotI2RlZmluZQlIQUNfSVBSX0FERFIJSU5UQ19JTlQyUFJJNAotI2RlZmluZQlIQUNfSVBSX1BPUwkyCi0jZGVmaW5lCUNNVF9QUklPUklUWQkwCi0KLS8qIFBDSUMoMCkgKi8KLSNkZWZpbmUJUENJQzBfSVJRCTY0Ci0jZGVmaW5lCVBDSUMwX0lQUl9BRERSCUlOVENfSU5UMlBSSTQKLSNkZWZpbmUJUENJQzBfSVBSX1BPUwkxCi0jZGVmaW5lCVBDSUMwX1BSSU9SSVRZCTIKLQotLyogUENJQygxKSAqLwotI2RlZmluZQlQQ0lDMV9JUlEJNjUKLSNkZWZpbmUJUENJQzFfSVBSX0FERFIJSU5UQ19JTlQyUFJJNAotI2RlZmluZQlQQ0lDMV9JUFJfUE9TCTAKLSNkZWZpbmUJUENJQzFfUFJJT1JJVFkJMgotCi0vKiBQQ0lDKDIpICovCi0jZGVmaW5lCVBDSUMyX0lSUQk2NgotI2RlZmluZQlQQ0lDMl9JUFJfQUREUglJTlRDX0lOVDJQUkk1Ci0jZGVmaW5lCVBDSUMyX0lQUl9QT1MJMwotI2RlZmluZQlQQ0lDMl9QUklPUklUWQkyCi0KLS8qIFBDSUMoMykgKi8KLSNkZWZpbmUJUENJQzNfSVJRCTY3Ci0jZGVmaW5lCVBDSUMzX0lQUl9BRERSCUlOVENfSU5UMlBSSTUKLSNkZWZpbmUJUENJQzNfSVBSX1BPUwkyCi0jZGVmaW5lCVBDSUMzX1BSSU9SSVRZCTIKLQotLyogUENJQyg0KSAqLwotI2RlZmluZQlQQ0lDNF9JUlEJNjgKLSNkZWZpbmUJUENJQzRfSVBSX0FERFIJSU5UQ19JTlQyUFJJNQotI2RlZmluZQlQQ0lDNF9JUFJfUE9TCTEKLSNkZWZpbmUJUENJQzRfUFJJT1JJVFkJMgotCi0vKiBQQ0lDKDUpICovCi0jZGVmaW5lCVBDSUNFUlJfSVJRCTY5Ci0jZGVmaW5lCVBDSUNQV0QzX0lSUQk3MAotI2RlZmluZQlQQ0lDUFdEMl9JUlEJNzEKLSNkZWZpbmUJUENJQ1BXRDFfSVJRCTcyCi0jZGVmaW5lCVBDSUNQV0QwX0lSUQk3MwotI2RlZmluZQlQQ0lDNV9JUFJfQUREUglJTlRDX0lOVDJQUkk1Ci0jZGVmaW5lCVBDSUM1X0lQUl9QT1MJMAotI2RlZmluZQlQQ0lDNV9QUklPUklUWQkyCi0KLS8qIFNJT0YgKi8KLSNkZWZpbmUJU0lPRl9JUlEJODAKLSNkZWZpbmUJU0lPRl9JUFJfQUREUglJTlRDX0lOVDJQUkk2Ci0jZGVmaW5lCVNJT0ZfSVBSX1BPUwkzCi0jZGVmaW5lCVNJT0ZfUFJJT1JJVFkJMwotCi0vKiBIU1BJICovCi0jZGVmaW5lCUhTUElfSVJRCTg0Ci0jZGVmaW5lCUhTUElfSVBSX0FERFIJSU5UQ19JTlQyUFJJNgotI2RlZmluZQlIU1BJX0lQUl9QT1MJMgotI2RlZmluZQlIU1BJX1BSSU9SSVRZCTMKLQotLyogTU1DSUYgKi8KLSNkZWZpbmUJTU1DSUZfRlNUQVRfSVJRCTg4Ci0jZGVmaW5lCU1NQ0lGX1RSQU5fSVJRCTg5Ci0jZGVmaW5lCU1NQ0lGX0VSUl9JUlEJOTAKLSNkZWZpbmUJTU1DSUZfRlJEWV9JUlEJOTEKLSNkZWZpbmUJTU1DSUZfSVBSX0FERFIJSU5UQ19JTlQyUFJJNgotI2RlZmluZQlNTUNJRl9JUFJfUE9TCTEKLSNkZWZpbmUJSFNQSV9QUklPUklUWQkzCi0KLS8qIFNTSSAqLwotI2RlZmluZQlTU0lfSVJRCQkxMDAKLSNkZWZpbmUJU1NJX0lQUl9BRERSCUlOVENfSU5UMlBSSTYKLSNkZWZpbmUJU1NJX0lQUl9QT1MJMAotI2RlZmluZQlTU0lfUFJJT1JJVFkJMwotCi0vKiBGTENUTCAqLwotI2RlZmluZQlGTENUTF9GTFNURV9JUlEJCTEwNAotI2RlZmluZQlGTENUTF9GTFRFTkRfSVJRCTEwNQotI2RlZmluZQlGTENUTF9GTFRSUTBfSVJRCTEwNgotI2RlZmluZQlGTENUTF9GTFRSUTFfSVJRCTEwNwotI2RlZmluZQlGTENUTF9JUFJfQUREUgkJSU5UQ19JTlQyUFJJNwotI2RlZmluZQlGTENUTF9JUFJfUE9TCQkzCi0jZGVmaW5lCUZMQ1RMX1BSSU9SSVRZCQkzCi0KLS8qIEdQSU8gKi8KLSNkZWZpbmUJR1BJTzBfSVJRCTEwOAotI2RlZmluZQlHUElPMV9JUlEJMTA5Ci0jZGVmaW5lCUdQSU8yX0lSUQkxMTAKLSNkZWZpbmUJR1BJTzNfSVJRCTExMQotI2RlZmluZQlHUElPX0lQUl9BRERSCUlOVENfSU5UMlBSSTcKLSNkZWZpbmUJR1BJT19JUFJfUE9TCTIKLSNkZWZpbmUJR1BJT19QUklPUklUWQkzCi0KLSNkZWZpbmUJSU5UQ19UTVUwX01TSwkwCi0jZGVmaW5lCUlOVENfVE1VM19NU0sJMQotI2RlZmluZQlJTlRDX1JUQ19NU0sJMgotI2RlZmluZQlJTlRDX1NDSUYwX01TSwkzCi0jZGVmaW5lCUlOVENfU0NJRjFfTVNLCTQKLSNkZWZpbmUJSU5UQ19XRFRfTVNLCTUKLSNkZWZpbmUJSU5UQ19IVUlEX01TSwk3Ci0jZGVmaW5lCUlOVENfRE1BQzBfTVNLCTgKLSNkZWZpbmUJSU5UQ19ETUFDMV9NU0sJOQotI2RlZmluZQlJTlRDX0NNVF9NU0sJMTIKLSNkZWZpbmUJSU5UQ19IQUNfTVNLCTEzCi0jZGVmaW5lCUlOVENfUENJQzBfTVNLCTE0Ci0jZGVmaW5lCUlOVENfUENJQzFfTVNLCTE1Ci0jZGVmaW5lCUlOVENfUENJQzJfTVNLCTE2Ci0jZGVmaW5lCUlOVENfUENJQzNfTVNLCTE3Ci0jZGVmaW5lCUlOVENfUENJQzRfTVNLCTE4Ci0jZGVmaW5lCUlOVENfUENJQzVfTVNLCTE5Ci0jZGVmaW5lCUlOVENfU0lPRl9NU0sJMjAKLSNkZWZpbmUJSU5UQ19IU1BJX01TSwkyMQotI2RlZmluZQlJTlRDX01NQ0lGX01TSwkyMgotI2RlZmluZQlJTlRDX1NTSV9NU0sJMjMKLSNkZWZpbmUJSU5UQ19GTENUTF9NU0sJMjQKLSNkZWZpbmUJSU5UQ19HUElPX01TSwkyNQotCi0jZW5kaWYgLyogX19BU01fU0hfSVJRX1NINzc4MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pcnEuaCBiL2luY2x1ZGUvYXNtLXNoL2lycS5oCmluZGV4IDI4OTk2ZjkuLmJmZjk2NWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lycS5oCkBAIC0xLDI1MiArMSw5IEBACiAjaWZuZGVmIF9fQVNNX1NIX0lSUV9ICiAjZGVmaW5lIF9fQVNNX1NIX0lSUV9ICiAKLS8qCi0gKgotICogbGludXgvaW5jbHVkZS9hc20tc2gvaXJxLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYSAmIFRha2VzaGkgWWFlZ2FzaGkKLSAqIENvcHlyaWdodCAoQykgMjAwMCAgS2F6dW1vdG8gS29qaW1hCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKLSAqCi0gKi8KLQogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgkJLyogZm9yIHB0X3JlZ3MgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1NIX0hQNlhYKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfU0hfUlRTNzc1MVIyRCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NIX0hTNzc1MVJWT0lQKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfU0hfSFM3NzUxUlZPSVApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19TSF9TSDAzKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfU0hfUjc3ODBSUCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1NIX0xBTkRJU0spCi0jaW5jbHVkZSA8YXNtL21hY2gvaWRlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwCi0KLSNkZWZpbmUgSU5UQ19ETUFDMF9NU0sJMAotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykKLSNkZWZpbmUgSU5UQ19JUFJBCTB4ZmZmZmZlZTJVTAotI2RlZmluZSBJTlRDX0lQUkIJMHhmZmZmZmVlNFVMCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotI2RlZmluZSBJTlRDX0lQUkEJMHhmZmQwMDAwNFVMCi0jZGVmaW5lIElOVENfSVBSQgkweGZmZDAwMDA4VUwKLSNkZWZpbmUgSU5UQ19JUFJDCTB4ZmZkMDAwMGNVTAotI2RlZmluZSBJTlRDX0lQUkQJMHhmZmQwMDAxMFVMCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19JREUKLSMgaWZuZGVmIElSUV9DRkNBUkQKLSMgIGRlZmluZSBJUlFfQ0ZDQVJECTE0Ci0jIGVuZGlmCi0jIGlmbmRlZiBJUlFfUENNQ0lBCi0jICBkZWZpbmUgSVJRX1BDTUNJQQkxNQotIyBlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgVElNRVJfSVJRCTE2Ci0jZGVmaW5lIFRJTUVSX0lQUl9BRERSCUlOVENfSVBSQQotI2RlZmluZSBUSU1FUl9JUFJfUE9TCSAzCi0jZGVmaW5lIFRJTUVSX1BSSU9SSVRZCSAyCi0KLSNkZWZpbmUgVElNRVIxX0lSUQkxNwotI2RlZmluZSBUSU1FUjFfSVBSX0FERFIJSU5UQ19JUFJBCi0jZGVmaW5lIFRJTUVSMV9JUFJfUE9TCSAyCi0jZGVmaW5lIFRJTUVSMV9QUklPUklUWQkgNAotCi0jZGVmaW5lIFJUQ19JUlEJCTIyCi0jZGVmaW5lIFJUQ19JUFJfQUREUglJTlRDX0lQUkEKLSNkZWZpbmUgUlRDX0lQUl9QT1MJIDAKLSNkZWZpbmUgUlRDX1BSSU9SSVRZCVRJTUVSX1BSSU9SSVRZCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0gzKQotI2RlZmluZSBETVRFMF9JUlEJNDgKLSNkZWZpbmUgRE1URTFfSVJRCTQ5Ci0jZGVmaW5lIERNVEUyX0lSUQk1MAotI2RlZmluZSBETVRFM19JUlEJNTEKLSNkZWZpbmUgRE1BX0lQUl9BRERSCUlOVENfSVBSRQotI2RlZmluZSBETUFfSVBSX1BPUwkzCi0jZGVmaW5lIERNQV9QUklPUklUWQk3Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQotLyogVE1VMiAqLwotI2RlZmluZSBUSU1FUjJfSVJRICAgICAgMTgKLSNkZWZpbmUgVElNRVIyX0lQUl9BRERSIElOVENfSVBSQQotI2RlZmluZSBUSU1FUjJfSVBSX1BPUyAgIDEKLSNkZWZpbmUgVElNRVIyX1BSSU9SSVRZICAyCi0KLS8qIFdEVCAqLwotI2RlZmluZSBXRFRfSVJRCQkyNwotI2RlZmluZSBXRFRfSVBSX0FERFIJSU5UQ19JUFJCCi0jZGVmaW5lIFdEVF9JUFJfUE9TCSAzCi0jZGVmaW5lIFdEVF9QUklPUklUWQkgMgotCi0vKiBTSU0gKFNJTSBDYXJkIE1vZHVsZSkgKi8KLSNkZWZpbmUgU0lNX0VSSV9JUlEJMjMKLSNkZWZpbmUgU0lNX1JYSV9JUlEJMjQKLSNkZWZpbmUgU0lNX1RYSV9JUlEJMjUKLSNkZWZpbmUgU0lNX1RFTkRfSVJRCTI2Ci0jZGVmaW5lIFNJTV9JUFJfQUREUglJTlRDX0lQUkIKLSNkZWZpbmUgU0lNX0lQUl9QT1MJIDEKLSNkZWZpbmUgU0lNX1BSSU9SSVRZCSAyCi0KLS8qIFZJTyAoVmlkZW8gSS9PKSAqLwotI2RlZmluZSBWSU9fSVJRCQk1MgotI2RlZmluZSBWSU9fSVBSX0FERFIJSU5UQ19JUFJFCi0jZGVmaW5lIFZJT19JUFJfUE9TCSAyCi0jZGVmaW5lIFZJT19QUklPUklUWQkgMgotCi0vKiBNRkkgKE11bHRpIEZ1bmN0aW9uYWwgSW50ZXJmYWNlKSAqLwotI2RlZmluZSBNRklfSVJRCQk1NgotI2RlZmluZSBNRklfSVBSX0FERFIJSU5UQ19JUFJFCi0jZGVmaW5lIE1GSV9JUFJfUE9TCSAxCi0jZGVmaW5lIE1GSV9QUklPUklUWQkgMgotCi0vKiBWUFUgKFZpZGVvIFByb2Nlc3NpbmcgVW5pdCkgKi8KLSNkZWZpbmUgVlBVX0lSUQkJNjAKLSNkZWZpbmUgVlBVX0lQUl9BRERSCUlOVENfSVBSRQotI2RlZmluZSBWUFVfSVBSX1BPUwkgMAotI2RlZmluZSBWUFVfUFJJT1JJVFkJIDIKLQotLyogS0VZIChLZXkgU2NhbiBJbnRlcmZhY2UpICovCi0jZGVmaW5lIEtFWV9JUlEJCTc5Ci0jZGVmaW5lIEtFWV9JUFJfQUREUglJTlRDX0lQUkYKLSNkZWZpbmUgS0VZX0lQUl9QT1MJIDMKLSNkZWZpbmUgS0VZX1BSSU9SSVRZCSAyCi0KLS8qIENNVCAoQ29tcGFyZSBNYXRjaCBUaW1lcikgKi8KLSNkZWZpbmUgQ01UX0lSUQkJMTA0Ci0jZGVmaW5lIENNVF9JUFJfQUREUglJTlRDX0lQUkYKLSNkZWZpbmUgQ01UX0lQUl9QT1MJIDAKLSNkZWZpbmUgQ01UX1BSSU9SSVRZCSAyCi0KLS8qIERNQUMoMSkgKi8KLSNkZWZpbmUgRE1URTBfSVJRCTQ4Ci0jZGVmaW5lIERNVEUxX0lSUQk0OQotI2RlZmluZSBETVRFMl9JUlEJNTAKLSNkZWZpbmUgRE1URTNfSVJRCTUxCi0jZGVmaW5lIERNQTFfSVBSX0FERFIJSU5UQ19JUFJFCi0jZGVmaW5lIERNQTFfSVBSX1BPUwkzCi0jZGVmaW5lIERNQTFfUFJJT1JJVFkJNwotCi0vKiBETUFDKDIpICovCi0jZGVmaW5lIERNVEU0X0lSUQk3NgotI2RlZmluZSBETVRFNV9JUlEJNzcKLSNkZWZpbmUgRE1BMl9JUFJfQUREUglJTlRDX0lQUkYKLSNkZWZpbmUgRE1BMl9JUFJfUE9TCTIKLSNkZWZpbmUgRE1BMl9QUklPUklUWQk3Ci0KLS8qIFNJT0YwICovCi0jZGVmaW5lIFNJT0YwX0lSUQk4NAotI2RlZmluZSBTSU9GMF9JUFJfQUREUglJTlRDX0lQUkgKLSNkZWZpbmUgU0lPRjBfSVBSX1BPUwkzCi0jZGVmaW5lIFNJT0YwX1BSSU9SSVRZCTMKLQotLyogRkxDVEwgKEZsYXNoIE1lbW9yeSBDb250cm9sbGVyKSAqLwotI2RlZmluZSBGTFNURV9JUlEJOTIKLSNkZWZpbmUgRkxURU5EX0lSUQk5MwotI2RlZmluZSBGTFRSUTBfSVJRCTk0Ci0jZGVmaW5lIEZMVFJRMV9JUlEJOTUKLSNkZWZpbmUgRkxDVExfSVBSX0FERFIJSU5UQ19JUFJICi0jZGVmaW5lIEZMQ1RMX0lQUl9QT1MJMQotI2RlZmluZSBGTENUTF9QUklPUklUWQkzCi0KLS8qIElJQyAoSUlDIEJ1cyBJbnRlcmZhY2UpICovCi0jZGVmaW5lIElJQ19BTElfSVJRCTk2Ci0jZGVmaW5lIElJQ19UQUNLSV9JUlEJOTcKLSNkZWZpbmUgSUlDX1dBSVRJX0lSUQk5OAotI2RlZmluZSBJSUNfRFRFSV9JUlEJOTkKLSNkZWZpbmUgSUlDX0lQUl9BRERSCUlOVENfSVBSSAotI2RlZmluZSBJSUNfSVBSX1BPUwkwCi0jZGVmaW5lIElJQ19QUklPUklUWQkzCi0KLS8qIFNJTzAgKi8KLSNkZWZpbmUgU0lPMF9JUlEJODgKLSNkZWZpbmUgU0lPMF9JUFJfQUREUglJTlRDX0lQUkkKLSNkZWZpbmUgU0lPMF9JUFJfUE9TCTMKLSNkZWZpbmUgU0lPMF9QUklPUklUWQkzCi0KLS8qIFNJVSAoU291bmQgSW50ZXJmYWNlIFVuaXQpICovCi0jZGVmaW5lIFNJVV9JUlEJCTEwOAotI2RlZmluZSBTSVVfSVBSX0FERFIJSU5UQ19JUFJKCi0jZGVmaW5lIFNJVV9JUFJfUE9TCTEKLSNkZWZpbmUgU0lVX1BSSU9SSVRZCTMKLQotI2VuZGlmCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotI2RlZmluZSBETVRFMF9JUlEJMzQKLSNkZWZpbmUgRE1URTFfSVJRCTM1Ci0jZGVmaW5lIERNVEUyX0lSUQkzNgotI2RlZmluZSBETVRFM19JUlEJMzcKLSNkZWZpbmUgRE1URTRfSVJRCTQ0CS8qIDc3NTFSIG9ubHkgKi8KLSNkZWZpbmUgRE1URTVfSVJRCTQ1CS8qIDc3NTFSIG9ubHkgKi8KLSNkZWZpbmUgRE1URTZfSVJRCTQ2CS8qIDc3NTFSIG9ubHkgKi8KLSNkZWZpbmUgRE1URTdfSVJRCTQ3CS8qIDc3NTFSIG9ubHkgKi8KLSNkZWZpbmUgRE1BRV9JUlEJMzgKLSNkZWZpbmUgRE1BX0lQUl9BRERSCUlOVENfSVBSQwotI2RlZmluZSBETUFfSVBSX1BPUwkyCi0jZGVmaW5lIERNQV9QUklPUklUWQk3Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IGRlZmluZWQgKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDgpIHx8IFwKLSAgICBkZWZpbmVkIChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KSB8fCBkZWZpbmVkIChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSB8fCBcCi0gICAgZGVmaW5lZCAoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikKLSNkZWZpbmUgU0NJX0VSSV9JUlEJMjMKLSNkZWZpbmUgU0NJX1JYSV9JUlEJMjQKLSNkZWZpbmUgU0NJX1RYSV9JUlEJMjUKLSNkZWZpbmUgU0NJX0lQUl9BRERSCUlOVENfSVBSQgotI2RlZmluZSBTQ0lfSVBSX1BPUwkxCi0jZGVmaW5lIFNDSV9QUklPUklUWQkzCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkKLSNkZWZpbmUgU0NJRjBfSVJRCTgwCi0jZGVmaW5lIFNDSUYwX0lQUl9BRERSCUlOVENfSVBSRwotI2RlZmluZSBTQ0lGMF9JUFJfUE9TCTMKLSNkZWZpbmUgU0NJRjBfUFJJT1JJVFkJMwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQotI2RlZmluZSBTQ0lGX0VSSV9JUlEJNTYKLSNkZWZpbmUgU0NJRl9SWElfSVJRCTU3Ci0jZGVmaW5lIFNDSUZfQlJJX0lSUQk1OAotI2RlZmluZSBTQ0lGX1RYSV9JUlEJNTkKLSNkZWZpbmUgU0NJRl9JUFJfQUREUglJTlRDX0lQUkUKLSNkZWZpbmUgU0NJRl9JUFJfUE9TCTEKLSNkZWZpbmUgU0NJRl9QUklPUklUWQkzCi0KLSNkZWZpbmUgSVJEQV9FUklfSVJRCTUyCi0jZGVmaW5lIElSREFfUlhJX0lSUQk1MwotI2RlZmluZSBJUkRBX0JSSV9JUlEJNTQKLSNkZWZpbmUgSVJEQV9UWElfSVJRCTU1Ci0jZGVmaW5lIElSREFfSVBSX0FERFIJSU5UQ19JUFJFCi0jZGVmaW5lIElSREFfSVBSX1BPUwkyCi0jZGVmaW5lIElSREFfUFJJT1JJVFkJMwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQotI2RlZmluZSBTQ0lGX0VSSV9JUlEJNDAKLSNkZWZpbmUgU0NJRl9SWElfSVJRCTQxCi0jZGVmaW5lIFNDSUZfQlJJX0lSUQk0MgotI2RlZmluZSBTQ0lGX1RYSV9JUlEJNDMKLSNkZWZpbmUgU0NJRl9JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgU0NJRl9JUFJfUE9TCTEKLSNkZWZpbmUgU0NJRl9QUklPUklUWQkzCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEpCi0jZGVmaW5lIFNDSUYxX0VSSV9JUlEJMjMKLSNkZWZpbmUgU0NJRjFfUlhJX0lSUQkyNAotI2RlZmluZSBTQ0lGMV9CUklfSVJRCTI1Ci0jZGVmaW5lIFNDSUYxX1RYSV9JUlEJMjYKLSNkZWZpbmUgU0NJRjFfSVBSX0FERFIJSU5UQ19JUFJCCi0jZGVmaW5lIFNDSUYxX0lQUl9QT1MJMQotI2RlZmluZSBTQ0lGMV9QUklPUklUWQkzCi0jZW5kaWYgLyogU1Q0MFNUQjEgKi8KLQotI2VuZGlmIC8qIDc3NXggLyBTSDQtMjAyIC8gU1Q0MFNUQjEgKi8KLSNlbmRpZiAvKiA3NzgwICovCi0KIC8qIE5SX0lSUVMgaXMgbWFkZSBmcm9tIHRocmVlIGNvbXBvbmVudHM6CiAgKiAgIDEuIE9OQ0hJUF9OUl9JUlFTIC0gbnVtYmVyIG9mIElSTFMgKyBvbi1jaGlwIHBlcmlwaGVyaWFsIG1vZHVsZXMKICAqICAgMi4gUElOVF9OUl9JUlFTICAgLSBudW1iZXIgb2YgUElOVCBpbnRlcnJ1cHRzCkBAIC0yODAsMTAgKzM3LDE1IEBACiAjIGRlZmluZSBPTkNISVBfTlJfSVJRUyAxNDQKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQorICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCiAjIGRlZmluZSBPTkNISVBfTlJfSVJRUyAxMDkKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKICMgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDExMQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2KQorIyBkZWZpbmUgT05DSElQX05SX0lSUVMgMjU2CisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCisjIGRlZmluZSBPTkNISVBfTlJfSVJRUyAxMjgKICNlbGlmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCS8qIE1vc3QgYmUgbGFzdCAqLwogIyBkZWZpbmUgT05DSElQX05SX0lSUVMgMTQ0CiAjZW5kaWYKQEAgLTMxOCw2ICs4MCw4IEBACiAjIGRlZmluZSBPRkZDSElQX05SX0lSUVMgMTYKICNlbGlmIGRlZmluZWQoQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FKQogIyBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDEyCisjZWxpZiBkZWZpbmVkKENPTkZJR19TSF83NzIyX1NPTFVUSU9OX0VOR0lORSkKKyMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxNAogI2VsaWYgZGVmaW5lZChDT05GSUdfU0hfVU5LTk9XTikKICMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxNgkvKiBNdXN0IGFsc28gYmUgbGFzdCAqLwogI2Vsc2UKQEAgLTMzMSw5ICs5NSwxMSBAQAogLyogTlJfSVJRUy4gMSsyKzMgKi8KICNkZWZpbmUgTlJfSVJRUyAoT05DSElQX05SX0lSUVMgKyBQSU5UX05SX0lSUVMgKyBPRkZDSElQX05SX0lSUVMpCiAKLWV4dGVybiB2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBkaXNhYmxlX2lycV9ub3N5bmModW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKy8qCisgKiBDb252ZXJ0IGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gSU5URVZUIGFuZCBJUlEgdmFsdWVzLgorICovCisjZGVmaW5lIGV2dDJpcnEoZXZ0KQkJKCgoZXZ0KSA+PiA1KSAtIDE2KQorI2RlZmluZSBpcnEyZXZ0KGlycSkJCSgoKGlycSkgKyAxNikgPDwgNSkKIAogLyoKICAqIFNpbXBsZSBNYXNrIFJlZ2lzdGVyIFN1cHBvcnQKQEAgLTM0NywzNTUgKzExMywzNSBAQAogdm9pZCBpbml0X0lSUV9waW50KHZvaWQpOwogCiAvKgorICogVGhlIHNoaWZ0IHZhbHVlIGlzIG5vdyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQsIG5vdCB0aGUgbnVtYmVyIG9mCisgKiBiaXRzLzQuIFRoaXMgaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUKKyAqIGRhdGFzaGVldHMuIFRoZSBJUFIgYWRkcmVzcywgYWRkciwgd2lsbCBiZSBzZXQgZnJvbSBpcHJfaWR4IHZpYSB0aGUKKyAqIG1hcF9pcHJpZHhfdG9fYWRkciBmdW5jdGlvbi4KKyAqLworc3RydWN0IGlwcl9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgaXJxOworCWludCBpcHJfaWR4OwkJLyogSW5kZXggZm9yIHRoZSBJUFIgcmVnaXN0ZXJlZCAqLworCWludCBzaGlmdDsJCS8qIE51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IHRoZSBkYXRhICovCisJaW50IHByaW9yaXR5OwkJLyogVGhlIHByaW9yaXR5ICovCisJdW5zaWduZWQgaW50IGFkZHI7CS8qIEFkZHJlc3Mgb2YgSW50ZXJydXB0IFByaW9yaXR5IFJlZ2lzdGVyICovCit9OworCisvKgorICogR2l2ZW4gYW4gSVBSIElEWCwgbWFwIHRoZSB2YWx1ZSB0byBhbiBJUFIgcmVnaXN0ZXIgYWRkcmVzcy4KKyAqLwordW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KTsKKworLyoKKyAqIEVuYWJsZSBpbmRpdmlkdWFsIGludGVycnVwdCBtb2RlIGZvciBleHRlcm5hbCBJUFIgSVJRcy4KKyAqLwordm9pZCBpcHJfaXJxX2VuYWJsZV9pcmxtKHZvaWQpOworCisvKgogICogRnVuY3Rpb24gZm9yICJvbiBjaGlwIHN1cHBvcnQgbW9kdWxlcyIuCiAgKi8KLWV4dGVybiB2b2lkIG1ha2VfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgYWRkciwKLQkJCSBpbnQgcG9zLCAgaW50IHByaW9yaXR5KTsKLWV4dGVybiB2b2lkIG1ha2VfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQotI3VuZGVmIElOVENfSVBSQQotI3VuZGVmIElOVENfSVBSQgotI2RlZmluZSBJTlRDX0lQUkEgIAkweEE0MTRGRUUyVUwKLSNkZWZpbmUgSU5UQ19JUFJCICAJMHhBNDE0RkVFNFVMCi0jZGVmaW5lIElOVENfSVBSQyAgCTB4QTQxNDAwMTZVTAotI2RlZmluZSBJTlRDX0lQUkQgIAkweEE0MTQwMDE4VUwKLSNkZWZpbmUgSU5UQ19JUFJFICAJMHhBNDE0MDAxQVVMCi0jZGVmaW5lIElOVENfSVBSRiAgCTB4QTQwODAwMDBVTAotI2RlZmluZSBJTlRDX0lQUkcgIAkweEE0MDgwMDAyVUwKLSNkZWZpbmUgSU5UQ19JUFJIICAJMHhBNDA4MDAwNFVMCi0jZGVmaW5lIElOVENfSVBSSSAgCTB4QTQwODAwMDZVTAotI2RlZmluZSBJTlRDX0lQUkogIAkweEE0MDgwMDA4VUwKLQotI2RlZmluZSBJTlRDX0lNUjAJMHhBNDA4MDA0MFVMCi0jZGVmaW5lIElOVENfSU1SMQkweEE0MDgwMDQyVUwKLSNkZWZpbmUgSU5UQ19JTVIyCTB4QTQwODAwNDRVTAotI2RlZmluZSBJTlRDX0lNUjMJMHhBNDA4MDA0NlVMCi0jZGVmaW5lIElOVENfSU1SNAkweEE0MDgwMDQ4VUwKLSNkZWZpbmUgSU5UQ19JTVI1CTB4QTQwODAwNEFVTAotI2RlZmluZSBJTlRDX0lNUjYJMHhBNDA4MDA0Q1VMCi0jZGVmaW5lIElOVENfSU1SNwkweEE0MDgwMDRFVUwKLSNkZWZpbmUgSU5UQ19JTVI4CTB4QTQwODAwNTBVTAotI2RlZmluZSBJTlRDX0lNUjkJMHhBNDA4MDA1MlVMCi0jZGVmaW5lIElOVENfSU1SMTAJMHhBNDA4MDA1NFVMCi0KLSNkZWZpbmUgSU5UQ19JTUNSMAkweEE0MDgwMDYwVUwKLSNkZWZpbmUgSU5UQ19JTUNSMQkweEE0MDgwMDYyVUwKLSNkZWZpbmUgSU5UQ19JTUNSMgkweEE0MDgwMDY0VUwKLSNkZWZpbmUgSU5UQ19JTUNSMwkweEE0MDgwMDY2VUwKLSNkZWZpbmUgSU5UQ19JTUNSNAkweEE0MDgwMDY4VUwKLSNkZWZpbmUgSU5UQ19JTUNSNQkweEE0MDgwMDZBVUwKLSNkZWZpbmUgSU5UQ19JTUNSNgkweEE0MDgwMDZDVUwKLSNkZWZpbmUgSU5UQ19JTUNSNwkweEE0MDgwMDZFVUwKLSNkZWZpbmUgSU5UQ19JTUNSOAkweEE0MDgwMDcwVUwKLSNkZWZpbmUgSU5UQ19JTUNSOQkweEE0MDgwMDcyVUwKLSNkZWZpbmUgSU5UQ19JTUNSMTAJMHhBNDA4MDA3NFVMCi0KLSNkZWZpbmUgSU5UQ19JQ1IwCTB4QTQxNEZFRTBVTAotI2RlZmluZSBJTlRDX0lDUjEJMHhBNDE0MDAxMFVMCi0KLSNkZWZpbmUgSU5UQ19JUlIwCTB4QTQxNDAwMDRVTAotCi0jZGVmaW5lIFBPUlRfUEFDUgkweEE0MDUwMTAwVUwKLSNkZWZpbmUgUE9SVF9QQkNSCTB4QTQwNTAxMDJVTAotI2RlZmluZSBQT1JUX1BDQ1IJMHhBNDA1MDEwNFVMCi0jZGVmaW5lIFBPUlRfUERDUgkweEE0MDUwMTA2VUwKLSNkZWZpbmUgUE9SVF9QRUNSCTB4QTQwNTAxMDhVTAotI2RlZmluZSBQT1JUX1BGQ1IJMHhBNDA1MDEwQVVMCi0jZGVmaW5lIFBPUlRfUEdDUgkweEE0MDUwMTBDVUwKLSNkZWZpbmUgUE9SVF9QSENSCTB4QTQwNTAxMEVVTAotI2RlZmluZSBQT1JUX1BKQ1IJMHhBNDA1MDExMFVMCi0jZGVmaW5lIFBPUlRfUEtDUgkweEE0MDUwMTEyVUwKLSNkZWZpbmUgUE9SVF9QTENSCTB4QTQwNTAxMTRVTAotI2RlZmluZSBQT1JUX1NDUENSCTB4QTQwNTAxMTZVTAotI2RlZmluZSBQT1JUX1BNQ1IJMHhBNDA1MDExOFVMCi0jZGVmaW5lIFBPUlRfUE5DUgkweEE0MDUwMTFBVUwKLSNkZWZpbmUgUE9SVF9QUUNSCTB4QTQwNTAxMUNVTAotCi0jZGVmaW5lIFBPUlRfUFNFTEEJMHhBNDA1MDE0MFVMCi0jZGVmaW5lIFBPUlRfUFNFTEIJMHhBNDA1MDE0MlVMCi0jZGVmaW5lIFBPUlRfUFNFTEMJMHhBNDA1MDE0NFVMCi0KLSNkZWZpbmUgUE9SVF9ISVpDUkEJMHhBNDA1MDE0NlVMCi0jZGVmaW5lIFBPUlRfSElaQ1JCCTB4QTQwNTAxNDhVTAotI2RlZmluZSBQT1JUX0RSVkNSCTB4QTQwNTAxNTBVTAotCi0jZGVmaW5lIFBPUlRfUEFEUiAgCTB4QTQwNTAxMjBVTAotI2RlZmluZSBQT1JUX1BCRFIgIAkweEE0MDUwMTIyVUwKLSNkZWZpbmUgUE9SVF9QQ0RSICAJMHhBNDA1MDEyNFVMCi0jZGVmaW5lIFBPUlRfUEREUiAgCTB4QTQwNTAxMjZVTAotI2RlZmluZSBQT1JUX1BFRFIgIAkweEE0MDUwMTI4VUwKLSNkZWZpbmUgUE9SVF9QRkRSICAJMHhBNDA1MDEyQVVMCi0jZGVmaW5lIFBPUlRfUEdEUiAgCTB4QTQwNTAxMkNVTAotI2RlZmluZSBQT1JUX1BIRFIgIAkweEE0MDUwMTJFVUwKLSNkZWZpbmUgUE9SVF9QSkRSICAJMHhBNDA1MDEzMFVMCi0jZGVmaW5lIFBPUlRfUEtEUiAgCTB4QTQwNTAxMzJVTAotI2RlZmluZSBQT1JUX1BMRFIgIAkweEE0MDUwMTM0VUwKLSNkZWZpbmUgUE9SVF9TQ1BEUiAgCTB4QTQwNTAxMzZVTAotI2RlZmluZSBQT1JUX1BNRFIgIAkweEE0MDUwMTM4VUwKLSNkZWZpbmUgUE9SVF9QTkRSICAJMHhBNDA1MDEzQVVMCi0jZGVmaW5lIFBPUlRfUFFEUiAgCTB4QTQwNTAxM0NVTAotCi0jZGVmaW5lIElSUTBfSVJRCTMyCi0jZGVmaW5lIElSUTFfSVJRCTMzCi0jZGVmaW5lIElSUTJfSVJRCTM0Ci0jZGVmaW5lIElSUTNfSVJRCTM1Ci0jZGVmaW5lIElSUTRfSVJRCTM2Ci0jZGVmaW5lIElSUTVfSVJRCTM3Ci0KLSNkZWZpbmUgSVJRMF9JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgSVJRMV9JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgSVJRMl9JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgSVJRM19JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgSVJRNF9JUFJfQUREUglJTlRDX0lQUkQKLSNkZWZpbmUgSVJRNV9JUFJfQUREUglJTlRDX0lQUkQKLQotI2RlZmluZSBJUlEwX0lQUl9QT1MJMAotI2RlZmluZSBJUlExX0lQUl9QT1MJMQotI2RlZmluZSBJUlEyX0lQUl9QT1MJMgotI2RlZmluZSBJUlEzX0lQUl9QT1MJMwotI2RlZmluZSBJUlE0X0lQUl9QT1MJMAotI2RlZmluZSBJUlE1X0lQUl9QT1MJMQotCi0jZGVmaW5lIElSUTBfUFJJT1JJVFkJMQotI2RlZmluZSBJUlExX1BSSU9SSVRZCTEKLSNkZWZpbmUgSVJRMl9QUklPUklUWQkxCi0jZGVmaW5lIElSUTNfUFJJT1JJVFkJMQotI2RlZmluZSBJUlE0X1BSSU9SSVRZCTEKLSNkZWZpbmUgSVJRNV9QUklPUklUWQkxCi0KLWV4dGVybiBpbnQgaXByX2lycV9kZW11eChpbnQgaXJxKTsKLSNkZWZpbmUgX19pcnFfZGVtdXgoaXJxKSBpcHJfaXJxX2RlbXV4KGlycSkKLQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0KQotI2RlZmluZSBJTlRDX0lQUkEJMHhmZmZmZmVlMlVMCi0jZGVmaW5lIElOVENfSVBSQgkweGZmZmZmZTYwVUwKLQotI2RlZmluZSBJTlRDX1ZDUkEJMHhmZmZmZmU2MlVMCi0jZGVmaW5lIElOVENfVkNSQgkweGZmZmZmZTY0VUwKLSNkZWZpbmUgSU5UQ19WQ1JDCTB4ZmZmZmZlNjZVTAotI2RlZmluZSBJTlRDX1ZDUkQJMHhmZmZmZmU2OFVMCi0KLSNkZWZpbmUgSU5UQ19WQ1JXRFQJMHhmZmZmZmVlNFVMCi0jZGVmaW5lIElOVENfVkNSRElWCTB4ZmZmZmZmMGNVTAotI2RlZmluZSBJTlRDX1ZDUkRNQTAJMHhmZmZmZmZhMFVMCi0jZGVmaW5lIElOVENfVkNSRE1BMQkweGZmZmZmZmE4VUwKLQotI2RlZmluZSBJTlRDX0lDUgkweGZmZmZmZWUwVUwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQotI2RlZmluZSBJTlRDX0lSUjAJMHhhNDAwMDAwNFVMCi0jZGVmaW5lIElOVENfSVJSMQkweGE0MDAwMDA2VUwKLSNkZWZpbmUgSU5UQ19JUlIyCTB4YTQwMDAwMDhVTAotCi0jZGVmaW5lIElOVENfSUNSMAkweGZmZmZmZWUwVUwKLSNkZWZpbmUgSU5UQ19JQ1IxCTB4YTQwMDAwMTBVTAotI2RlZmluZSBJTlRDX0lDUjIJMHhhNDAwMDAxMlVMCi0jZGVmaW5lIElOVENfSU5URVIJMHhhNDAwMDAxNFVMCi0KLSNkZWZpbmUgSU5UQ19JUFJDCTB4YTQwMDAwMTZVTAotI2RlZmluZSBJTlRDX0lQUkQJMHhhNDAwMDAxOFVMCi0jZGVmaW5lIElOVENfSVBSRQkweGE0MDAwMDFhVUwKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpCi0jZGVmaW5lIElOVENfSVBSRgkweGE0MDAwMDFjVUwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKLSNkZWZpbmUgSU5UQ19JUFJGCTB4YTQwODAwMDBVTAotI2RlZmluZSBJTlRDX0lQUkcJMHhhNDA4MDAwMlVMCi0jZGVmaW5lIElOVENfSVBSSAkweGE0MDgwMDA0VUwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkKLS8qIEludGVycnVwdCBDb250cm9sbGVyIFJlZ2lzdGVycyAqLwotI3VuZGVmIElOVENfSVBSQQotI3VuZGVmIElOVENfSVBSQgotI2RlZmluZSBJTlRDX0lQUkEgIAkweEE0MTRGRUUyVUwKLSNkZWZpbmUgSU5UQ19JUFJCICAJMHhBNDE0RkVFNFVMCi0jZGVmaW5lIElOVENfSVBSRiAgCTB4QTQwODAwMDBVTAotI2RlZmluZSBJTlRDX0lQUkcgIAkweEE0MDgwMDAyVUwKLSNkZWZpbmUgSU5UQ19JUFJIICAJMHhBNDA4MDAwNFVMCi0jZGVmaW5lIElOVENfSVBSSSAgCTB4QTQwODAwMDZVTAotCi0jdW5kZWYgSU5UQ19JQ1IwCi0jdW5kZWYgSU5UQ19JQ1IxCi0jZGVmaW5lIElOVENfSUNSMAkweEE0MTRGRUUwVUwKLSNkZWZpbmUgSU5UQ19JQ1IxCTB4QTQxNDAwMTBVTAotCi0jZGVmaW5lIElOVENfSVJSMAkweGE0MDAwMDA0VUwKLSNkZWZpbmUgSU5UQ19JUlIxCTB4YTQwMDAwMDZVTAotI2RlZmluZSBJTlRDX0lSUjIJMHhhNDAwMDAwOFVMCi0jZGVmaW5lIElOVENfSVJSMwkweGE0MDAwMDBBVUwKLSNkZWZpbmUgSU5UQ19JUlI0CTB4YTQwMDAwMENVTAotI2RlZmluZSBJTlRDX0lSUjUJMHhhNDA4MDAyMFVMCi0jZGVmaW5lIElOVENfSVJSNwkweGE0MDgwMDI0VUwKLSNkZWZpbmUgSU5UQ19JUlI4CTB4YTQwODAwMjZVTAotCi0vKiBJbnRlcnJ1cHQgbnVtYmVycyAqLwotI2RlZmluZSBUSU1FUjJfSVJRICAgICAgMTgKLSNkZWZpbmUgVElNRVIyX0lQUl9BRERSIElOVENfSVBSQQotI2RlZmluZSBUSU1FUjJfSVBSX1BPUyAgIDEKLSNkZWZpbmUgVElNRVIyX1BSSU9SSVRZICAyCi0KLS8qIFdEVCAqLwotI2RlZmluZSBXRFRfSVJRCQkyNwotI2RlZmluZSBXRFRfSVBSX0FERFIJSU5UQ19JUFJCCi0jZGVmaW5lIFdEVF9JUFJfUE9TCSAzCi0jZGVmaW5lIFdEVF9QUklPUklUWQkgMgotCi0jZGVmaW5lIFNDSUYwX0VSSV9JUlEJNTIKLSNkZWZpbmUgU0NJRjBfUlhJX0lSUQk1MwotI2RlZmluZSBTQ0lGMF9CUklfSVJRCTU0Ci0jZGVmaW5lIFNDSUYwX1RYSV9JUlEJNTUKLSNkZWZpbmUgU0NJRjBfSVBSX0FERFIJSU5UQ19JUFJFCi0jZGVmaW5lIFNDSUYwX0lQUl9QT1MJMgotI2RlZmluZSBTQ0lGMF9QUklPUklUWQkzCi0KLSNkZWZpbmUgRE1URTRfSVJRCTc2Ci0jZGVmaW5lIERNVEU1X0lSUQk3NwotI2RlZmluZSBETUEyX0lQUl9BRERSCUlOVENfSVBSRgotI2RlZmluZSBETUEyX0lQUl9QT1MJMgotI2RlZmluZSBETUEyX1BSSU9SSVRZCTcKLQotI2RlZmluZSBJUFNFQ19JUlEJNzkKLSNkZWZpbmUgSVBTRUNfSVBSX0FERFIJSU5UQ19JUFJGCi0jZGVmaW5lIElQU0VDX0lQUl9QT1MJMwotI2RlZmluZSBJUFNFQ19QUklPUklUWQkzCi0KLS8qIEVETUFDICovCi0jZGVmaW5lIEVETUFDMF9JUlEJODAKLSNkZWZpbmUgRURNQUMwX0lQUl9BRERSCUlOVENfSVBSRwotI2RlZmluZSBFRE1BQzBfSVBSX1BPUwkzCi0jZGVmaW5lIEVETUFDMF9QUklPUklUWQkzCi0KLSNkZWZpbmUgRURNQUMxX0lSUQk4MQotI2RlZmluZSBFRE1BQzFfSVBSX0FERFIJSU5UQ19JUFJHCi0jZGVmaW5lIEVETUFDMV9JUFJfUE9TCTIKLSNkZWZpbmUgRURNQUMxX1BSSU9SSVRZCTMKLQotI2RlZmluZSBFRE1BQzJfSVJRCTgyCi0jZGVmaW5lIEVETUFDMl9JUFJfQUREUglJTlRDX0lQUkcKLSNkZWZpbmUgRURNQUMyX0lQUl9QT1MJMQotI2RlZmluZSBFRE1BQzJfUFJJT1JJVFkJMwotCi0vKiBTSU9GICovCi0jZGVmaW5lIFNJT0YwX0VSSV9JUlEJOTYKLSNkZWZpbmUgU0lPRjBfVFhJX0lSUQk5NwotI2RlZmluZSBTSU9GMF9SWElfSVJRCTk4Ci0jZGVmaW5lIFNJT0YwX0NDSV9JUlEJOTkKLSNkZWZpbmUgU0lPRjBfSVBSX0FERFIJSU5UQ19JUFJICi0jZGVmaW5lIFNJT0YwX0lQUl9QT1MJMAotI2RlZmluZSBTSU9GMF9QUklPUklUWQk3Ci0KLSNkZWZpbmUgU0lPRjFfRVJJX0lSUQkxMDAKLSNkZWZpbmUgU0lPRjFfVFhJX0lSUQkxMDEKLSNkZWZpbmUgU0lPRjFfUlhJX0lSUQkxMDIKLSNkZWZpbmUgU0lPRjFfQ0NJX0lSUQkxMDMKLSNkZWZpbmUgU0lPRjFfSVBSX0FERFIJSU5UQ19JUFJJCi0jZGVmaW5lIFNJT0YxX0lQUl9QT1MJMQotI2RlZmluZSBTSU9GMV9QUklPUklUWQk3Ci0jZW5kaWYgLyogQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQotI2RlZmluZSBQT1JUX1BBQ1IJMHhhNDA1MDEwMFVMCi0jZGVmaW5lIFBPUlRfUEJDUgkweGE0MDUwMTAyVUwKLSNkZWZpbmUgUE9SVF9QQ0NSCTB4YTQwNTAxMDRVTAotI2RlZmluZSBQT1JUX1BFVENSCTB4YTQwNTAxMDZVTAotI2RlZmluZSBQT1JUX1BBRFIgIAkweGE0MDUwMTIwVUwKLSNkZWZpbmUgUE9SVF9QQkRSICAJMHhhNDA1MDEyMlVMCi0jZGVmaW5lIFBPUlRfUENEUiAgCTB4YTQwNTAxMjRVTAotI2Vsc2UKLSNkZWZpbmUgUE9SVF9QQUNSCTB4YTQwMDAxMDBVTAotI2RlZmluZSBQT1JUX1BCQ1IJMHhhNDAwMDEwMlVMCi0jZGVmaW5lIFBPUlRfUENDUgkweGE0MDAwMTA0VUwKLSNkZWZpbmUgUE9SVF9QRkNSCTB4YTQwMDAxMGFVTAotI2RlZmluZSBQT1JUX1BBRFIgIAkweGE0MDAwMTIwVUwKLSNkZWZpbmUgUE9SVF9QQkRSICAJMHhhNDAwMDEyMlVMCi0jZGVmaW5lIFBPUlRfUENEUiAgCTB4YTQwMDAxMjRVTAotI2RlZmluZSBQT1JUX1BGRFIgIAkweGE0MDAwMTJhVUwKLSNlbmRpZgotCi0jZGVmaW5lIElSUTBfSVJRCTMyCi0jZGVmaW5lIElSUTFfSVJRCTMzCi0jZGVmaW5lIElSUTJfSVJRCTM0Ci0jZGVmaW5lIElSUTNfSVJRCTM1Ci0jZGVmaW5lIElSUTRfSVJRCTM2Ci0jZGVmaW5lIElSUTVfSVJRCTM3Ci0KLSNkZWZpbmUgSVJRMF9JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgSVJRMV9JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgSVJRMl9JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgSVJRM19JUFJfQUREUglJTlRDX0lQUkMKLSNkZWZpbmUgSVJRNF9JUFJfQUREUglJTlRDX0lQUkQKLSNkZWZpbmUgSVJRNV9JUFJfQUREUglJTlRDX0lQUkQKLQotI2RlZmluZSBJUlEwX0lQUl9QT1MJMAotI2RlZmluZSBJUlExX0lQUl9QT1MJMQotI2RlZmluZSBJUlEyX0lQUl9QT1MJMgotI2RlZmluZSBJUlEzX0lQUl9QT1MJMwotI2RlZmluZSBJUlE0X0lQUl9QT1MJMAotI2RlZmluZSBJUlE1X0lQUl9QT1MJMQotCi0jZGVmaW5lIElSUTBfUFJJT1JJVFkJMQotI2RlZmluZSBJUlExX1BSSU9SSVRZCTEKLSNkZWZpbmUgSVJRMl9QUklPUklUWQkxCi0jZGVmaW5lIElSUTNfUFJJT1JJVFkJMQotI2RlZmluZSBJUlE0X1BSSU9SSVRZCTEKLSNkZWZpbmUgSVJRNV9QUklPUklUWQkxCi0KLSNkZWZpbmUgUElOVDBfSVJRCTQwCi0jZGVmaW5lIFBJTlQ4X0lSUQk0MQotCi0jZGVmaW5lIFBJTlQwX0lQUl9BRERSCUlOVENfSVBSRAotI2RlZmluZSBQSU5UOF9JUFJfQUREUglJTlRDX0lQUkQKLQotI2RlZmluZSBQSU5UMF9JUFJfUE9TCTMKLSNkZWZpbmUgUElOVDhfSVBSX1BPUwkyCi0jZGVmaW5lIFBJTlQwX1BSSU9SSVRZCTIKLSNkZWZpbmUgUElOVDhfUFJJT1JJVFkJMgotCi1leHRlcm4gaW50IGlwcl9pcnFfZGVtdXgoaW50IGlycSk7Ci0jZGVmaW5lIF9faXJxX2RlbXV4KGlycSkgaXByX2lycV9kZW11eChpcnEpCi0jZW5kaWYgLyogQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyB8fCBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5ICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQotI2RlZmluZSBJTlRDX0lDUiAgICAgICAgMHhmZmQwMDAwMAotI2RlZmluZSBJTlRDX0lDUl9OTUlMCSgxPDwxNSkKLSNkZWZpbmUgSU5UQ19JQ1JfTUFJCSgxPDwxNCkKLSNkZWZpbmUgSU5UQ19JQ1JfTk1JQgkoMTw8OSkKLSNkZWZpbmUgSU5UQ19JQ1JfTk1JRQkoMTw8OCkKLSNkZWZpbmUgSU5UQ19JQ1JfSVJMTQkoMTw8NykKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MAotI2luY2x1ZGUgPGFzbS9pcnEtc2g3NzgwLmg+Ci0jZW5kaWYKLQotLyogU0ggd2l0aCBJTlRDMi1zdHlsZSBpbnRlcnJ1cHRzICovCi0jaWZkZWYgQ09ORklHX0NQVV9IQVNfSU5UQzJfSVJRCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEpCi0jZGVmaW5lIElOVEMyX0JBU0UJMHhmZTA4MDAwMAotI2RlZmluZSBJTlRDMl9GSVJTVF9JUlEgNjQKLSNkZWZpbmUgSU5UQzJfSU5UUkVRX09GRlNFVAkweDIwCi0jZGVmaW5lIElOVEMyX0lOVE1TS19PRkZTRVQJMHg0MAotI2RlZmluZSBJTlRDMl9JTlRNU0tDTFJfT0ZGU0VUCTB4NjAKLSNkZWZpbmUgTlJfSU5UQzJfSVJRUwkyNQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmUwODAwMDAKLSNkZWZpbmUgSU5UQzJfRklSU1RfSVJRIDQ4CS8qIElOVEVWVCAweDgwMCAqLwotI2RlZmluZSBJTlRDMl9JTlRSRVFfT0ZGU0VUCTB4MjAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLX09GRlNFVAkweDQwCi0jZGVmaW5lIElOVEMyX0lOVE1TS0NMUl9PRkZTRVQJMHg2MAotI2RlZmluZSBOUl9JTlRDMl9JUlFTCTY0Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCi0jZGVmaW5lIElOVEMyX0JBU0UJMHhmZmQ0MDAwMAotI2RlZmluZSBJTlRDMl9GSVJTVF9JUlEJMjEKLSNkZWZpbmUgSU5UQzJfSU5UTVNLX09GRlNFVAkoMHgzOCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSX09GRlNFVAkoMHgzYykKLSNkZWZpbmUgTlJfSU5UQzJfSVJRUwk2MAotI2VuZGlmCi0KLSNkZWZpbmUgSU5UQzJfSU5UUFJJX09GRlNFVAkweDAwCit2b2lkIG1ha2VfaXByX2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcyk7Cit2b2lkIG1ha2VfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOwordm9pZCBpbml0X0lSUV9pcHIodm9pZCk7CiAKIHN0cnVjdCBpbnRjMl9kYXRhIHsKIAl1bnNpZ25lZCBzaG9ydCBpcnE7CkBAIC03MDQsMjIgKzE1MCwxNiBAQAogCXVuc2lnbmVkIGNoYXIgcHJpb3JpdHk7CiB9OwogCi12b2lkIG1ha2VfaW50YzJfaXJxKHN0cnVjdCBpbnRjMl9kYXRhICopOwordm9pZCBtYWtlX2ludGMyX2lycShzdHJ1Y3QgaW50YzJfZGF0YSAqLCB1bnNpZ25lZCBpbnQgbnJfaXJxcyk7CiB2b2lkIGluaXRfSVJRX2ludGMyKHZvaWQpOwotI2VuZGlmCi0KLWV4dGVybiBpbnQgc2htc2VfaXJxX2RlbXV4KGludCBpcnEpOwogCiBzdGF0aWMgaW5saW5lIGludCBnZW5lcmljX2lycV9kZW11eChpbnQgaXJxKQogewogCXJldHVybiBpcnE7CiB9CiAKLSNpZm5kZWYgX19pcnFfZGVtdXgKLSNkZWZpbmUgX19pcnFfZGVtdXgoaXJxKQkoaXJxKQotI2VuZGlmCiAjZGVmaW5lIGlycV9jYW5vbmljYWxpemUoaXJxKQkoaXJxKQotI2RlZmluZSBpcnFfZGVtdXgoaXJxKQkJX19pcnFfZGVtdXgoc2hfbXYubXZfaXJxX2RlbXV4KGlycSkpCisjZGVmaW5lIGlycV9kZW11eChpcnEpCQlzaF9tdi5tdl9pcnFfZGVtdXgoaXJxKQogCiAjaWZkZWYgQ09ORklHXzRLU1RBQ0tTCiBleHRlcm4gdm9pZCBpcnFfY3R4X2luaXQoaW50IGNwdSk7CkBAIC03MzAsMTIgKzE3MCw0IEBACiAjIGRlZmluZSBpcnFfY3R4X2V4aXQoY3B1KSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCi0jaW5jbHVkZSA8YXNtL2lycS1zaDczMTgwLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykKLSNpbmNsdWRlIDxhc20vaXJxLXNoNzM0My5oPgotI2VuZGlmCi0KICNlbmRpZiAvKiBfX0FTTV9TSF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxZmxhZ3MuaCBiL2luY2x1ZGUvYXNtLXNoL2lycWZsYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlZGMxYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lycWZsYWdzLmgKQEAgLTAsMCArMSwxMjMgQEAKKyNpZm5kZWYgX19BU01fU0hfSVJRRkxBR1NfSAorI2RlZmluZSBfX0FTTV9TSF9JUlFGTEFHU19ICisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkic3RjCXNyLCAlMFxuXHQiCisJCSJhbmQJJTEsICUwXG5cdCIKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19TUl9SQgorCQkic3RjCXI2X2JhbmssICUxXG5cdCIKKwkJIm9yCSUxLCAlMFxuXHQiCisjZW5kaWYKKwkJImxkYwklMCwgc3Jcblx0IgorCQk6ICI9JnIiIChfX2R1bW15MCksICI9ciIgKF9fZHVtbXkxKQorCQk6ICIxIiAofjB4MDAwMDAwZjApCisJCTogIm1lbW9yeSIKKwkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9kaXNhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInN0YwlzciwgJTBcblx0IgorCQkib3IJIzB4ZjAsICUwXG5cdCIKKwkJImxkYwklMCwgc3Jcblx0IgorCQk6ICI9JnoiIChmbGFncykKKwkJOiAvKiBubyBpbnB1dHMgKi8KKwkJOiAibWVtb3J5IgorCSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxfYml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBfX2R1bW15MCwgX19kdW1teTE7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJzdGMJc3IsICUwXG5cdCIKKwkJIm9yCSUyLCAlMFxuXHQiCisJCSJhbmQJJTMsICUwXG5cdCIKKwkJImxkYwklMCwgc3Jcblx0IgorCQk6ICI9JnIiIChfX2R1bW15MCksICI9ciIgKF9fZHVtbXkxKQorCQk6ICJyIiAoMHgxMDAwMDAwMCksICJyIiAoMHhmZmZmZmYwZikKKwkJOiAibWVtb3J5IgorCSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ibF9iaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIF9fZHVtbXkwLCBfX2R1bW15MTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJInN0YwlzciwgJTBcblx0IgorCQkiYW5kCSUyLCAlMFxuXHQiCisJCSJsZGMJJTAsIHNyXG5cdCIKKwkJOiAiPSZyIiAoX19kdW1teTApLCAiPXIiIChfX2R1bW15MSkKKwkJOiAiMSIgKH4weDEwMDAwMDAwKQorCQk6ICJtZW1vcnkiCisJKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkic3RjCXNyLCAlMFxuXHQiCisJCSJhbmQJIzB4ZjAsICUwXG5cdCIKKwkJOiAiPSZ6IiAoZmxhZ3MpCisJCTogLyogbm8gaW5wdXRzICovCisJCTogIm1lbW9yeSIKKwkpOworCisJcmV0dXJuIGZsYWdzOworfQorCisjZGVmaW5lIHJhd19sb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKSBcCisJCWRvIHsgKGZsYWdzKSA9IF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3MoKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gKGZsYWdzICE9IDApOworfQorCitzdGF0aWMgaW5saW5lIGludCByYXdfaXJxc19kaXNhYmxlZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBfX3Jhd19sb2NhbF9zYXZlX2ZsYWdzKCk7CisKKwlyZXR1cm4gcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yYXdfbG9jYWxfaXJxX3NhdmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBfX2R1bW15OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkic3RjCXNyLCAlMVxuXHQiCisJCSJtb3YJJTEsICUwXG5cdCIKKwkJIm9yCSMweGYwLCAlMFxuXHQiCisJCSJsZGMJJTAsIHNyXG5cdCIKKwkJIm1vdgklMSwgJTBcblx0IgorCQkiYW5kCSMweGYwLCAlMFxuXHQiCisJCTogIj0meiIgKGZsYWdzKSwgIj0mciIgKF9fZHVtbXkpCisJCTogLyogbm8gaW5wdXRzICovCisJCTogIm1lbW9yeSIKKwkpOworCisJcmV0dXJuIGZsYWdzOworfQorCisjZGVmaW5lIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncykgXAorCQlkbyB7IChmbGFncykgPSBfX3Jhd19sb2NhbF9pcnFfc2F2ZSgpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmF3X2xvY2FsX2lycV9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaWYgKChmbGFncyAmIDB4ZjApICE9IDB4ZjApCisJCXJhd19sb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKyNlbmRpZiAvKiBfX0FTTV9TSF9JUlFGTEFHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9sYW5kaXNrL2lkZS5oIGIvaW5jbHVkZS9hc20tc2gvbGFuZGlzay9pZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5MGUyOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9sYW5kaXNrL2lkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoKLSAqIG1vZGlmZWQgYnkga29naWlkZW5hCi0gKiAyMDA1LjAzLjAzCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9TSF9MQU5ESVNLX0lERV9ICi0jZGVmaW5lIF9fQVNNX1NIX0xBTkRJU0tfSURFX0gKLQotLyogTm90aGluZyB0byBzZWUgaGVyZS4uICovCi0jaW5jbHVkZSA8YXNtL2xhbmRpc2svaW9kYXRhX2xhbmRpc2suaD4KLSNkZWZpbmUgSVJRX0NGQ0FSRAlJUlFfRkFUQQkvKiBDRiBDYXJkIElSUSAqLwotI2RlZmluZSBJUlFfUENNQ0lBCUlSUV9BVEEJCS8qIFBDTUNJQSBJUlEgKi8KLQotI2VuZGlmIC8qIF9fQVNNX1NIX0xBTkRJU0tfSURFX0ggICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tc2gvbW11X2NvbnRleHQuaAppbmRleCBjNzA4OGVmLi40NmYwNGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL21tdV9jb250ZXh0LmgKQEAgLTEwLDcgKzEwLDYgQEAKIAogI2luY2x1ZGUgPGFzbS9jcHUvbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKQEAgLTQyLDEwICs0MSw4IEBACiAvKgogICogR2V0IE1NVSBjb250ZXh0IGlmIG5lZWRlZC4KICAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZAotZ2V0X21tdV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQorc3RhdGljIGlubGluZSB2b2lkIGdldF9tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlleHRlcm4gdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpOwogCXVuc2lnbmVkIGxvbmcgbWMgPSBtbXVfY29udGV4dF9jYWNoZTsKIAogCS8qIENoZWNrIGlmIHdlIGhhdmUgb2xkIHZlcnNpb24gb2YgY29udGV4dC4gKi8KQEAgLTYxLDYgKzU4LDcgQEAKIAkJICogRmx1c2ggYWxsIFRMQiBhbmQgc3RhcnQgbmV3IGN5Y2xlLgogCQkgKi8KIAkJZmx1c2hfdGxiX2FsbCgpOworCiAJCS8qCiAJCSAqIEZpeCB2ZXJzaW9uOyBOb3RlIHRoYXQgd2UgYXZvaWQgdmVyc2lvbiAjMAogCQkgKiB0byBkaXN0aW5ndXNoIE5PX0NPTlRFWFQuCkBAIC03NSwxMSArNzMsMTAgQEAKICAqIEluaXRpYWxpemUgdGhlIGNvbnRleHQgcmVsYXRlZCBpbmZvIGZvciBhIG5ldyBtbV9zdHJ1Y3QKICAqIGluc3RhbmNlLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5pdF9uZXdfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKK3N0YXRpYyBpbmxpbmUgaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKLQogCXJldHVybiAwOwogfQogCkBAIC04NywxMiArODQsMTIgQEAKICAqIERlc3Ryb3kgY29udGV4dCByZWxhdGVkIGluZm8gZm9yIGFuIG1tX3N0cnVjdCB0aGF0IGlzIGFib3V0CiAgKiB0byBiZSBwdXQgdG8gcmVzdC4KICAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCitzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCS8qIERvIG5vdGhpbmcgKi8KIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfYXNpZCh1bnNpZ25lZCBsb25nIGFzaWQpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FzaWQodW5zaWduZWQgbG9uZyBhc2lkKQogewogCXVuc2lnbmVkIGxvbmcgX19kdW1teTsKIApAQCAtMTA1LDcgKzEwMiw3IEBACiAJCQkgICAgICAgICJyIiAoMHhmZmZmZmYwMCkpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGdldF9hc2lkKHZvaWQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2FzaWQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGFzaWQ7CiAKQEAgLTEyMCwyNCArMTE3LDI5IEBACiAgKiBBZnRlciB3ZSBoYXZlIHNldCBjdXJyZW50LT5tbSB0byBhIG5ldyB2YWx1ZSwgdGhpcyBhY3RpdmF0ZXMKICAqIHRoZSBjb250ZXh0IGZvciB0aGUgbmV3IG1tIHNvIHdlIHNlZSB0aGUgbmV3IG1hcHBpbmdzLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGFjdGl2YXRlX2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlnZXRfbW11X2NvbnRleHQobW0pOwogCXNldF9hc2lkKG1tLT5jb250ZXh0LmlkICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLKTsKIH0KIAotLyogTU1VX1RUQiBjYW4gYmUgdXNlZCBmb3Igb3B0aW1pemluZyB0aGUgZmF1bHQgaGFuZGxpbmcuCi0gICAoQ3VycmVudGx5IG5vdCB1c2VkKSAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwKLQkJCQkgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKLQkJCQkgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCisvKiBNTVVfVFRCIGlzIHVzZWQgZm9yIG9wdGltaXppbmcgdGhlIGZhdWx0IGhhbmRsaW5nLiAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9UVEIocGdkX3QgKnBnZCkKK3sKKwljdHJsX291dGwoKHVuc2lnbmVkIGxvbmcpcGdkLCBNTVVfVFRCKTsKK30KKworc3RhdGljIGlubGluZSBwZ2RfdCAqZ2V0X1RUQih2b2lkKQoreworCXJldHVybiAocGdkX3QgKiljdHJsX2lubChNTVVfVFRCKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LAorCQkJICAgICBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LAorCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlpZiAobGlrZWx5KHByZXYgIT0gbmV4dCkpIHsKLQkJdW5zaWduZWQgbG9uZyBfX3BnZGlyID0gKHVuc2lnbmVkIGxvbmcpbmV4dC0+cGdkOwotCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3YubAklMCwgJTEiCi0JCQkJICAgICA6IC8qIG5vIG91dHB1dCAqLwotCQkJCSAgICAgOiAiciIgKF9fcGdkaXIpLCAibSIgKF9fbShNTVVfVFRCKSkpOworCQlzZXRfVFRCKG5leHQtPnBnZCk7CiAJCWFjdGl2YXRlX2NvbnRleHQobmV4dCk7CiAJfQogfQpAQCAtMTQ3LDcgKzE0OSw3IEBACiAjZGVmaW5lIGFjdGl2YXRlX21tKHByZXYsIG5leHQpIFwKIAlzd2l0Y2hfbW0oKHByZXYpLChuZXh0KSxOVUxMKQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGVudGVyX2xhenlfdGxiKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaAppbmRleCBjYThiMjZkLi4zODBmZDYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcGFnZS5oCkBAIC0xMyw5ICsxMywxNiBAQAogICAgWyBQNCBjb250cm9sICAgXQkJMHhFMDAwMDAwMAogICovCiAKLQogLyogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgUEFHRV9TSElGVAkxMgorI2lmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV80S0IpCisjIGRlZmluZSBQQUdFX1NISUZUCTEyCisjZWxpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfOEtCKQorIyBkZWZpbmUgUEFHRV9TSElGVAkxMworI2VsaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzY0S0IpCisjIGRlZmluZSBQQUdFX1NISUZUCTE2CisjZWxzZQorIyBlcnJvciAiQm9ndXMga2VybmVsIHBhZ2Ugc2l6ZT8iCisjZW5kaWYKIAogI2lmZGVmIF9fQVNTRU1CTFlfXwogI2RlZmluZSBQQUdFX1NJWkUJKDEgPDwgUEFHRV9TSElGVCkKQEAgLTI4LDggKzM1LDE0IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NEspCiAjZGVmaW5lIEhQQUdFX1NISUZUCTE2CisjZWxpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8yNTZLKQorI2RlZmluZSBIUEFHRV9TSElGVAkxOAogI2VsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CKQogI2RlZmluZSBIUEFHRV9TSElGVAkyMAorI2VsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNE1CKQorI2RlZmluZSBIUEFHRV9TSElGVAkyMgorI2VsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRNQikKKyNkZWZpbmUgSFBBR0VfU0hJRlQJMjYKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQpAQCAtNjksMTUgKzgyLDI1IEBACiAvKgogICogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgQyB0eXBlLWNoZWNraW5nLi4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHB0ZTsgfSBwdGVfdDsKLXR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ2Q7IH0gcGdkX3Q7CisjaWZkZWYgQ09ORklHX1gyVExCCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlX2xvdywgcHRlX2hpZ2g7IH0gcHRlX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgbG9uZyBwZ3Byb3Q7IH0gcGdwcm90X3Q7CisjZGVmaW5lIHB0ZV92YWwoeCkgXAorCSgoeCkucHRlX2xvdyB8ICgodW5zaWduZWQgbG9uZyBsb25nKSh4KS5wdGVfaGlnaCA8PCAzMikpCisjZGVmaW5lIF9fcHRlKHgpIFwKKwkoeyBwdGVfdCBfX3B0ZSA9IHsoeCksICgodW5zaWduZWQgbG9uZyBsb25nKSh4KSkgPj4gMzJ9OyBfX3B0ZTsgfSkKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlX2xvdzsgfSBwdGVfdDsKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ3Byb3Q7IH0gcGdwcm90X3Q7CisjZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGVfbG93KQorI2RlZmluZSBfX3B0ZSh4KSAoKHB0ZV90KSB7ICh4KSB9ICkKKyNlbmRpZgogCi0jZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdkOyB9IHBnZF90OworCiAjZGVmaW5lIHBnZF92YWwoeCkJKCh4KS5wZ2QpCiAjZGVmaW5lIHBncHJvdF92YWwoeCkJKCh4KS5wZ3Byb3QpCiAKLSNkZWZpbmUgX19wdGUoeCkgKChwdGVfdCkgeyAoeCkgfSApCiAjZGVmaW5lIF9fcGdkKHgpICgocGdkX3QpIHsgKHgpIH0gKQogI2RlZmluZSBfX3BncHJvdCh4KQkoKHBncHJvdF90KSB7ICh4KSB9ICkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tc2gvcGdhbGxvYy5oCmluZGV4IGU4NDE0NjUuLjg4OGU0NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wZ2FsbG9jLmgKQEAgLTEsMTMgKzEsMTYgQEAKICNpZm5kZWYgX19BU01fU0hfUEdBTExPQ19ICiAjZGVmaW5lIF9fQVNNX1NIX1BHQUxMT0NfSAogCi0jZGVmaW5lIHBtZF9wb3B1bGF0ZV9rZXJuZWwobW0sIHBtZCwgcHRlKSBcCi0JCXNldF9wbWQocG1kLCBfX3BtZChfUEFHRV9UQUJMRSArIF9fcGEocHRlKSkpCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwKKwkJCQkgICAgICAgcHRlX3QgKnB0ZSkKK3sKKwlzZXRfcG1kKHBtZCwgX19wbWQoKHVuc2lnbmVkIGxvbmcpcHRlKSk7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbWRfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsCiAJCQkJc3RydWN0IHBhZ2UgKnB0ZSkKIHsKLQlzZXRfcG1kKHBtZCwgX19wbWQoX1BBR0VfVEFCTEUgKyBwYWdlX3RvX3BoeXMocHRlKSkpOworCXNldF9wbWQocG1kLCBfX3BtZCgodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocHRlKSkpOwogfQogCiAvKgpAQCAtMTUsNyArMTgsMTYgQEAKICAqLwogc3RhdGljIGlubGluZSBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCXJldHVybiAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVCB8IF9fR0ZQX1pFUk8pOworCXBnZF90ICpwZ2QgPSAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVCk7CisKKwlpZiAocGdkKSB7CisJCW1lbXNldChwZ2QsIDAsIFVTRVJfUFRSU19QRVJfUEdEICogc2l6ZW9mKHBnZF90KSk7CisJCW1lbWNweShwZ2QgKyBVU0VSX1BUUlNfUEVSX1BHRCwKKwkJICAgICAgIHN3YXBwZXJfcGdfZGlyICsgVVNFUl9QVFJTX1BFUl9QR0QsCisJCSAgICAgICAoUFRSU19QRVJfUEdEIC0gVVNFUl9QVFJTX1BFUl9QR0QpICogc2l6ZW9mKHBnZF90KSk7CisJfQorCisJcmV0dXJuIHBnZDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHBnZF9mcmVlKHBnZF90ICpwZ2QpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLTJsZXZlbC5oIGIvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS0ybGV2ZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyNWRiNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLTJsZXZlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSF9QR1RBQkxFXzJMRVZFTF9ICi0jZGVmaW5lIF9fQVNNX1NIX1BHVEFCTEVfMkxFVkVMX0gKLQotLyoKLSAqIHRyYWRpdGlvbmFsIHR3by1sZXZlbCBwYWdpbmcgc3RydWN0dXJlOgotICovCi0KLSNkZWZpbmUgUEdESVJfU0hJRlQJMjIKLSNkZWZpbmUgUFRSU19QRVJfUEdECTEwMjQKLQotLyoKLSAqIHRoaXMgaXMgdHdvLWxldmVsLCBzbyB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhbnkKLSAqIFBNRCBkaXJlY3RvcnkgcGh5c2ljYWxseS4KLSAqLwotI2RlZmluZSBQTURfU0hJRlQJMjIKLSNkZWZpbmUgUFRSU19QRVJfUE1ECTEKLQotI2RlZmluZSBQVFJTX1BFUl9QVEUJMTAyNAotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotI2RlZmluZSBwdGVfRVJST1IoZSkgXAotCXByaW50aygiJXM6JWQ6IGJhZCBwdGUgJTA4bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHB0ZV92YWwoZSkpCi0jZGVmaW5lIHBtZF9FUlJPUihlKSBcCi0JcHJpbnRrKCIlczolZDogYmFkIHBtZCAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcG1kX3ZhbChlKSkKLSNkZWZpbmUgcGdkX0VSUk9SKGUpIFwKLQlwcmludGsoIiVzOiVkOiBiYWQgcGdkICUwOGx4LlxuIiwgX19GSUxFX18sIF9fTElORV9fLCBwZ2RfdmFsKGUpKQotCi0vKgotICogVGhlICJwZ2RfeHh4KCkiIGZ1bmN0aW9ucyBoZXJlIGFyZSB0cml2aWFsIGZvciBhIGZvbGRlZCB0d28tbGV2ZWwKLSAqIHNldHVwOiB0aGUgcGdkIGlzIG5ldmVyIGJhZCwgYW5kIGEgcG1kIGFsd2F5cyBleGlzdHMgKGFzIGl0J3MgZm9sZGVkCi0gKiBpbnRvIHRoZSBwZ2QgZW50cnkpCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHBnZF9ub25lKHBnZF90IHBnZCkJCXsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHBnZF9iYWQocGdkX3QgcGdkKQkJeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgcGdkX3ByZXNlbnQocGdkX3QgcGdkKQl7IHJldHVybiAxOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGdkX2NsZWFyIChwZ2RfdCAqIHBnZHApIAl7IH0KLQotLyoKLSAqIENlcnRhaW4gYXJjaGl0ZWN0dXJlcyBuZWVkIHRvIGRvIHNwZWNpYWwgdGhpbmdzIHdoZW4gUFRFcwotICogd2l0aGluIGEgcGFnZSB0YWJsZSBhcmUgZGlyZWN0bHkgbW9kaWZpZWQuICBUaHVzLCB0aGUgZm9sbG93aW5nCi0gKiBob29rIGlzIG1hZGUgYXZhaWxhYmxlLgotICovCi0jZGVmaW5lIHNldF9wdGUocHRlcHRyLCBwdGV2YWwpICgqKHB0ZXB0cikgPSBwdGV2YWwpCi0jZGVmaW5lIHNldF9wdGVfYXQobW0sYWRkcixwdGVwLHB0ZXZhbCkgc2V0X3B0ZShwdGVwLHB0ZXZhbCkKLQotLyoKLSAqIChwbWRzIGFyZSBmb2xkZWQgaW50byBwZ2RzIHNvIHRoaXMgZG9lc24ndCBnZXQgYWN0dWFsbHkgY2FsbGVkLAotICogYnV0IHRoZSBkZWZpbmUgaXMgbmVlZGVkIGZvciBhIGdlbmVyaWMgaW5saW5lIGZ1bmN0aW9uLikKLSAqLwotI2RlZmluZSBzZXRfcG1kKHBtZHB0ciwgcG1kdmFsKSAoKihwbWRwdHIpID0gcG1kdmFsKQotI2RlZmluZSBzZXRfcGdkKHBnZHB0ciwgcGdkdmFsKSAoKihwZ2RwdHIpID0gcGdkdmFsKQotCi0jZGVmaW5lIHBnZF9wYWdlX3ZhZGRyKHBnZCkgXAotKCh1bnNpZ25lZCBsb25nKSBfX3ZhKHBnZF92YWwocGdkKSAmIFBBR0VfTUFTSykpCi0KLSNkZWZpbmUgcGdkX3BhZ2UocGdkKSBcCi0JKHBoeXNfdG9fcGFnZShwZ2RfdmFsKHBnZCkpKQotCi1zdGF0aWMgaW5saW5lIHBtZF90ICogcG1kX29mZnNldChwZ2RfdCAqIGRpciwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotCXJldHVybiAocG1kX3QgKikgZGlyOwotfQotCi0jZGVmaW5lIHB0ZV9wZm4oeCkJCSgodW5zaWduZWQgbG9uZykoKCh4KS5wdGUgPj4gUEFHRV9TSElGVCkpKQotI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkJX19wdGUoKChwZm4pIDw8IFBBR0VfU0hJRlQpIHwgcGdwcm90X3ZhbChwcm90KSkKLSNkZWZpbmUgcGZuX3BtZChwZm4sIHByb3QpCV9fcG1kKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCi0KLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KLSNlbmRpZiAvKiBfX0FTTV9TSF9QR1RBQkxFXzJMRVZFTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmgKaW5kZXggMmM4NjgyYS4uMDM2Y2EyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaApAQCAtMTUsMTUgKzE1LDEwIEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3BtZC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKLSNkZWZpbmUgUFRSU19QRVJfUEdECQkxMDI0Ci0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KIAotZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF07Ci1leHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKLQogLyoKICAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCiAgKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCkBAIC0zMywxNSArMjgsMjggQEAKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAotLyogdHJhZGl0aW9uYWwgdHdvLWxldmVsIHBhZ2luZyBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgUEdESVJfU0hJRlQJMjIKLSNkZWZpbmUgUFRSU19QRVJfUE1ECTEKLSNkZWZpbmUgUFRSU19QRVJfUFRFCTEwMjQKLSNkZWZpbmUgUE1EX1NJWkUJKDFVTCA8PCBQTURfU0hJRlQpCi0jZGVmaW5lIFBNRF9NQVNLCSh+KFBNRF9TSVpFLTEpKQotI2RlZmluZSBQR0RJUl9TSVpFCSgxVUwgPDwgUEdESVJfU0hJRlQpCisvKgorICogdHJhZGl0aW9uYWwgdHdvLWxldmVsIHBhZ2luZyBzdHJ1Y3R1cmUKKyAqLworLyogUFRFIGJpdHMgKi8KKyNpZmRlZiBDT05GSUdfWDJUTEIKKyMgZGVmaW5lIFBURV9NQUdOSVRVREUJMwkvKiA2NC1iaXQgUFRFcyBvbiBleHRlbmRlZCBtb2RlIFNILVgyIFRMQiAqLworI2Vsc2UKKyMgZGVmaW5lIFBURV9NQUdOSVRVREUJMgkvKiAzMi1iaXQgUFRFcyAqLworI2VuZGlmCisjZGVmaW5lIFBURV9TSElGVAlQQUdFX1NISUZUCisjZGVmaW5lIFBURV9CSVRTCShQVEVfU0hJRlQgLSBQVEVfTUFHTklUVURFKQorCisvKiBQR0QgYml0cyAqLworI2RlZmluZSBQR0RJUl9TSElGVAkoUFRFX1NISUZUICsgUFRFX0JJVFMpCisjZGVmaW5lIFBHRElSX0JJVFMJKDMyIC0gUEdESVJfU0hJRlQpCisjZGVmaW5lIFBHRElSX1NJWkUJKDEgPDwgUEdESVJfU0hJRlQpCiAjZGVmaW5lIFBHRElSX01BU0sJKH4oUEdESVJfU0laRS0xKSkKIAorLyogRW50cmllcyBwZXIgbGV2ZWwgKi8KKyNkZWZpbmUgUFRSU19QRVJfUFRFCShQQUdFX1NJWkUgLyA0KQorI2RlZmluZSBQVFJTX1BFUl9QR0QJKFBBR0VfU0laRSAvIDQpCisKICNkZWZpbmUgVVNFUl9QVFJTX1BFUl9QR0QJKFRBU0tfU0laRS9QR0RJUl9TSVpFKQogI2RlZmluZSBGSVJTVF9VU0VSX0FERFJFU1MJMAogCkBAIC00OSw3ICs1Nyw3IEBACiAKIC8qCiAgKiBGaXJzdCAxTUIgbWFwIGlzIHVzZWQgYnkgZml4ZWQgcHVycG9zZS4KLSAqIEN1cnJlbnRseSBvbmx5IDQtZW50eSAoMTZrQikgaXMgdXNlZCAoc2VlIGFyY2gvc2gvbW0vY2FjaGUuYykKKyAqIEN1cnJlbnRseSBvbmx5IDQtZW50cnkgKDE2a0IpIGlzIHVzZWQgKHNlZSBhcmNoL3NoL21tL2NhY2hlLmMpCiAgKi8KICNkZWZpbmUgVk1BTExPQ19TVEFSVAkoUDNTRUcrMHgwMDEwMDAwMCkKICNkZWZpbmUgVk1BTExPQ19FTkQJKEZJWEFERFJfU1RBUlQtMipQQUdFX1NJWkUpCkBAIC01Nyw3ICs2NSw4IEBACiAvKgogICogTGludXggUFRFTCBlbmNvZGluZy4KICAqCi0gKiBIYXJkd2FyZSBhbmQgc29mdHdhcmUgYml0IGRlZmluaXRpb25zIGZvciB0aGUgUFRFTCB2YWx1ZToKKyAqIEhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBiaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBQVEVMIHZhbHVlIChzZWUgYmVsb3cgZm9yCisgKiBub3RlcyBvbiBTSC1YMiBNTVVzIGFuZCA2NC1iaXQgUFRFcyk6CiAgKgogICogLSBCaXRzIDAgYW5kIDcgYXJlIHJlc2VydmVkIG9uIFNILTMgKF9QQUdFX1dUIGFuZCBfUEFHRV9TWjEgb24gU0gtNCkuCiAgKgpAQCAtNzYsMjAgKzg1LDU3IEBACiAgKgogICogLSBCaXRzIDMxLCAzMCwgYW5kIDI5IHJlbWFpbiB1bnVzZWQgYnkgZXZlcnlvbmUgYW5kIGNhbiBiZSB1c2VkIGZvciBmdXR1cmUKICAqICAgc29mdHdhcmUgZmxhZ3MsIGFsdGhvdWdoIGNhcmUgbXVzdCBiZSB0YWtlbiB0byB1cGRhdGUgX1BBR0VfQ0xFQVJfRkxBR1MuCisgKgorICogWFhYOiBMZWF2ZSB0aGUgX1BBR0VfRklMRSBhbmQgX1BBR0VfV1Qgb3ZlcmhhdWwgZm9yIGEgcmFpbnkgZGF5LgorICoKKyAqIFNILVgyIE1NVXMgYW5kIGV4dGVuZGVkIFBURXMKKyAqCisgKiBTSC1YMiBzdXBwb3J0cyBhbiBleHRlbmRlZCBtb2RlIFRMQiB3aXRoIHNwbGl0IGRhdGEgYXJyYXlzIGR1ZSB0byB0aGUKKyAqIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgUFIgYW5kIFNaIChub3cgRVBSIGFuZCBFU1opIGVuY29kaW5ncy4gVGhlIFBSIGFuZAorICogU1ogYml0IHBsYWNlaG9sZGVycyBzdGlsbCBleGlzdCBpbiBkYXRhIGFycmF5IDEsIGJ1dCBhcmUgaW1wbGVtZW50ZWQgYXMKKyAqIHJlc2VydmVkIGJpdHMsIHdpdGggdGhlIHJlYWwgbG9naWMgZXhpc3RpbmcgaW4gZGF0YSBhcnJheSAyLgorICoKKyAqIFRoZSBkb3duc2lkZSB0byB0aGlzIGlzIHRoYXQgd2UgY2FuIG5vIGxvbmdlciBmaXQgZXZlcnl0aGluZyBpbiB0byBhIDMyLWJpdAorICogUFRFIGVuY29kaW5nLCBzbyBhIDY0LWJpdCBwdGVfdCBpcyBuZWNlc3NhcnkgZm9yIHRoZXNlIHBhcnRzLiBPbiB0aGUgcGx1cworICogc2lkZSwgdGhpcyBnaXZlcyB1cyBxdWl0ZSBhIGZldyBzcGFyZSBiaXRzIHRvIHBsYXkgd2l0aCBmb3IgZnV0dXJlIHVzYWdlLgogICovCisvKiBMZWdhY3kgYW5kIGNvbXBhdCBtb2RlIGJpdHMgKi8KICNkZWZpbmUJX1BBR0VfV1QJMHgwMDEJCS8qIFdULWJpdCBvbiBTSC00LCAwIG9uIFNILTMgKi8KICNkZWZpbmUgX1BBR0VfSFdfU0hBUkVECTB4MDAyCQkvKiBTSC1iaXQgIDogc2hhcmVkIGFtb25nIHByb2Nlc3NlcyAqLwogI2RlZmluZSBfUEFHRV9ESVJUWQkweDAwNAkJLyogRC1iaXQgICA6IHBhZ2UgY2hhbmdlZCAqLwogI2RlZmluZSBfUEFHRV9DQUNIQUJMRQkweDAwOAkJLyogQy1iaXQgICA6IGNhY2hhYmxlICovCi0jZGVmaW5lIF9QQUdFX1NaMAkweDAxMAkJLyogU1owLWJpdCA6IFNpemUgb2YgcGFnZSAqLwotI2RlZmluZSBfUEFHRV9SVwkweDAyMAkJLyogUFIwLWJpdCA6IHdyaXRlIGFjY2VzcyBhbGxvd2VkICovCi0jZGVmaW5lIF9QQUdFX1VTRVIJMHgwNDAJCS8qIFBSMS1iaXQgOiB1c2VyIHNwYWNlIGFjY2VzcyBhbGxvd2VkICovCi0jZGVmaW5lIF9QQUdFX1NaMQkweDA4MAkJLyogU1oxLWJpdCA6IFNpemUgb2YgcGFnZSAob24gU0gtNCkgKi8KKyNpZm5kZWYgQ09ORklHX1gyVExCCisjIGRlZmluZSBfUEFHRV9TWjAJMHgwMTAJCS8qIFNaMC1iaXQgOiBTaXplIG9mIHBhZ2UgKi8KKyMgZGVmaW5lIF9QQUdFX1JXCTB4MDIwCQkvKiBQUjAtYml0IDogd3JpdGUgYWNjZXNzIGFsbG93ZWQgKi8KKyMgZGVmaW5lIF9QQUdFX1VTRVIJMHgwNDAJCS8qIFBSMS1iaXQgOiB1c2VyIHNwYWNlIGFjY2VzcyBhbGxvd2VkKi8KKyMgZGVmaW5lIF9QQUdFX1NaMQkweDA4MAkJLyogU1oxLWJpdCA6IFNpemUgb2YgcGFnZSAob24gU0gtNCkgKi8KKyNlbmRpZgogI2RlZmluZSBfUEFHRV9QUkVTRU5UCTB4MTAwCQkvKiBWLWJpdCAgIDogcGFnZSBpcyB2YWxpZCAqLwogI2RlZmluZSBfUEFHRV9QUk9UTk9ORQkweDIwMAkJLyogc29mdHdhcmU6IGlmIG5vdCBwcmVzZW50ICAqLwogI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkweDQwMAkJLyogc29mdHdhcmU6IHBhZ2UgcmVmZXJlbmNlZCAqLwogI2RlZmluZSBfUEFHRV9GSUxFCV9QQUdFX1dUCS8qIHNvZnR3YXJlOiBwYWdlY2FjaGUgb3Igc3dhcD8gKi8KIAorLyogRXh0ZW5kZWQgbW9kZSBiaXRzICovCisjZGVmaW5lIF9QQUdFX0VYVF9FU1owCQkweDAwMTAJLyogRVNaMC1iaXQ6IFNpemUgb2YgcGFnZSAqLworI2RlZmluZSBfUEFHRV9FWFRfRVNaMQkJMHgwMDIwCS8qIEVTWjEtYml0OiBTaXplIG9mIHBhZ2UgKi8KKyNkZWZpbmUgX1BBR0VfRVhUX0VTWjIJCTB4MDA0MAkvKiBFU1oyLWJpdDogU2l6ZSBvZiBwYWdlICovCisjZGVmaW5lIF9QQUdFX0VYVF9FU1ozCQkweDAwODAJLyogRVNaMy1iaXQ6IFNpemUgb2YgcGFnZSAqLworCisjZGVmaW5lIF9QQUdFX0VYVF9VU0VSX0VYRUMJMHgwMTAwCS8qIEVQUjAtYml0OiBVc2VyIHNwYWNlIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgX1BBR0VfRVhUX1VTRVJfV1JJVEUJMHgwMjAwCS8qIEVQUjEtYml0OiBVc2VyIHNwYWNlIHdyaXRhYmxlICovCisjZGVmaW5lIF9QQUdFX0VYVF9VU0VSX1JFQUQJMHgwNDAwCS8qIEVQUjItYml0OiBVc2VyIHNwYWNlIHJlYWRhYmxlICovCisKKyNkZWZpbmUgX1BBR0VfRVhUX0tFUk5fRVhFQwkweDA4MDAJLyogRVBSMy1iaXQ6IEtlcm5lbCBzcGFjZSBleGVjdXRhYmxlICovCisjZGVmaW5lIF9QQUdFX0VYVF9LRVJOX1dSSVRFCTB4MTAwMAkvKiBFUFI0LWJpdDogS2VybmVsIHNwYWNlIHdyaXRhYmxlICovCisjZGVmaW5lIF9QQUdFX0VYVF9LRVJOX1JFQUQJMHgyMDAwCS8qIEVQUjUtYml0OiBLZXJuZWwgc3BhY2UgcmVhZGFibGUgKi8KKworLyogV3JhcHBlciBmb3IgZXh0ZW5kZWQgbW9kZSBwZ3Byb3QgdHdpZGRsaW5nICovCisjaWZkZWYgQ09ORklHX1gyVExCCisjIGRlZmluZSBfUEFHRV9FWFQoeCkJCSgodW5zaWduZWQgbG9uZyBsb25nKSh4KSA8PCAzMikKKyNlbHNlCisjIGRlZmluZSBfUEFHRV9FWFQoeCkJCSgwKQorI2VuZGlmCisKIC8qIHNvZnR3YXJlOiBtb3ZlcyB0byBQVEVBLlRDIChUaW1pbmcgQ29udHJvbCkgKi8KICNkZWZpbmUgX1BBR0VfUENDX0FSRUE1CTB4MDAwMDAwMDAJLyogdXNlIEJTQyByZWdpc3RlcnMgZm9yIGFyZWE1ICovCiAjZGVmaW5lIF9QQUdFX1BDQ19BUkVBNgkweDgwMDAwMDAwCS8qIHVzZSBCU0MgcmVnaXN0ZXJzIGZvciBhcmVhNiAqLwpAQCAtMTE0LDM3ICsxNjAsMTYwIEBACiAKICNkZWZpbmUgX1BBR0VfRkxBR1NfSEFSRFdBUkVfTUFTSwkoMHgxZmZmZmZmZiAmIH4oX1BBR0VfQ0xFQVJfRkxBR1MpKQogCi0vKiBIYXJkd2FyZSBmbGFnczogU1owPTEgKDRrLWJ5dGUpICovCi0jZGVmaW5lIF9QQUdFX0ZMQUdTX0hBUkQJX1BBR0VfU1owCi0KLSNpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NEspCi0jZGVmaW5lIF9QQUdFX1NaSFVHRQkoX1BBR0VfU1oxKQotI2VsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CKQotI2RlZmluZSBfUEFHRV9TWkhVR0UJKF9QQUdFX1NaMCB8IF9QQUdFX1NaMSkKKy8qIEhhcmR3YXJlIGZsYWdzLCBwYWdlIHNpemUgZW5jb2RpbmcgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19YMlRMQikKKyMgaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzRLQikKKyMgIGRlZmluZSBfUEFHRV9GTEFHU19IQVJECV9QQUdFX0VYVChfUEFHRV9FWFRfRVNaMCkKKyMgZWxpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfOEtCKQorIyAgZGVmaW5lIF9QQUdFX0ZMQUdTX0hBUkQJX1BBR0VfRVhUKF9QQUdFX0VYVF9FU1oxKQorIyBlbGlmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV82NEtCKQorIyAgZGVmaW5lIF9QQUdFX0ZMQUdTX0hBUkQJX1BBR0VfRVhUKF9QQUdFX0VYVF9FU1oyKQorIyBlbmRpZgorI2Vsc2UKKyMgaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzRLQikKKyMgIGRlZmluZSBfUEFHRV9GTEFHU19IQVJECV9QQUdFX1NaMAorIyBlbGlmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV82NEtCKQorIyAgZGVmaW5lIF9QQUdFX0ZMQUdTX0hBUkQJX1BBR0VfU1oxCisjIGVuZGlmCiAjZW5kaWYKIAotI2RlZmluZSBfUEFHRV9UQUJMRQkoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfVVNFUiB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRElSVFkpCi0jZGVmaW5lIF9LRVJOUEdfVEFCTEUJKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRElSVFkpCi0jZGVmaW5lIF9QQUdFX0NIR19NQVNLCShQVEVfTUFTSyB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfQ0FDSEFCTEUgfCBfUEFHRV9ESVJUWSkKKyNpZiBkZWZpbmVkKENPTkZJR19YMlRMQikKKyMgaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLKQorIyAgZGVmaW5lIF9QQUdFX1NaSFVHRQkoX1BBR0VfRVhUX0VTWjIpCisjIGVsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMjU2SykKKyMgIGRlZmluZSBfUEFHRV9TWkhVR0UJKF9QQUdFX0VYVF9FU1owIHwgX1BBR0VfRVhUX0VTWjIpCisjIGVsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CKQorIyAgZGVmaW5lIF9QQUdFX1NaSFVHRQkoX1BBR0VfRVhUX0VTWjAgfCBfUEFHRV9FWFRfRVNaMSB8IF9QQUdFX0VYVF9FU1oyKQorIyBlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQikKKyMgIGRlZmluZSBfUEFHRV9TWkhVR0UJKF9QQUdFX0VYVF9FU1ozKQorIyBlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0TUIpCisjICBkZWZpbmUgX1BBR0VfU1pIVUdFCShfUEFHRV9FWFRfRVNaMiB8IF9QQUdFX0VYVF9FU1ozKQorIyBlbmRpZgorI2Vsc2UKKyMgaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLKQorIyAgZGVmaW5lIF9QQUdFX1NaSFVHRQkoX1BBR0VfU1oxKQorIyBlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNQikKKyMgIGRlZmluZSBfUEFHRV9TWkhVR0UJKF9QQUdFX1NaMCB8IF9QQUdFX1NaMSkKKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogU3R1YiBvdXQgX1BBR0VfU1pIVUdFIGlmIHdlIGRvbid0IGhhdmUgYSBnb29kIGRlZmluaXRpb24gZm9yIGl0LAorICogdG8gbWFrZSBwdGVfbWtodWdlKCkgaGFwcHkuCisgKi8KKyNpZm5kZWYgX1BBR0VfU1pIVUdFCisjIGRlZmluZSBfUEFHRV9TWkhVR0UJKF9QQUdFX0ZMQUdTX0hBUkQpCisjZW5kaWYKKworI2RlZmluZSBfUEFHRV9DSEdfTUFTSyBcCisJKFBURV9NQVNLIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9DQUNIQUJMRSB8IF9QQUdFX0RJUlRZKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0jaWZkZWYgQ09ORklHX01NVQotI2RlZmluZSBQQUdFX05PTkUJX19wZ3Byb3QoX1BBR0VfUFJPVE5PTkUgfCBfUEFHRV9DQUNIQUJMRSB8X1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9GTEFHU19IQVJEKQotI2RlZmluZSBQQUdFX1NIQVJFRAlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9VU0VSIHwgX1BBR0VfQ0FDSEFCTEUgfF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRkxBR1NfSEFSRCkKLSNkZWZpbmUgUEFHRV9DT1BZCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgX1BBR0VfQ0FDSEFCTEUgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCi0jZGVmaW5lIFBBR0VfUkVBRE9OTFkJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBfUEFHRV9DQUNIQUJMRSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRkxBR1NfSEFSRCkKLSNkZWZpbmUgUEFHRV9LRVJORUwJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfQ0FDSEFCTEUgfCBfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfSFdfU0hBUkVEIHwgX1BBR0VfRkxBR1NfSEFSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19YMlRMQikgLyogU0gtWDIgVExCICovCisjZGVmaW5lIFBBR0VfTk9ORQlfX3BncHJvdChfUEFHRV9QUk9UTk9ORSB8IF9QQUdFX0NBQ0hBQkxFIHwgXAorCQkJCSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCisKKyNkZWZpbmUgUEFHRV9TSEFSRUQJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX0FDQ0VTU0VEIHwgXAorCQkJCSBfUEFHRV9DQUNIQUJMRSB8IF9QQUdFX0ZMQUdTX0hBUkQgfCBcCisJCQkJIF9QQUdFX0VYVChfUEFHRV9FWFRfVVNFUl9SRUFEIHwgXAorCQkJCQkgICBfUEFHRV9FWFRfVVNFUl9XUklURSkpCisKKyNkZWZpbmUgUEFHRV9FWEVDUkVBRAlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfQUNDRVNTRUQgfCBcCisJCQkJIF9QQUdFX0NBQ0hBQkxFIHwgX1BBR0VfRkxBR1NfSEFSRCB8IFwKKwkJCQkgX1BBR0VfRVhUKF9QQUdFX0VYVF9VU0VSX0VYRUMgfCBcCisJCQkJCSAgIF9QQUdFX0VYVF9VU0VSX1JFQUQpKQorCisjZGVmaW5lIFBBR0VfQ09QWQlQQUdFX0VYRUNSRUFECisKKyNkZWZpbmUgUEFHRV9SRUFET05MWQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfQUNDRVNTRUQgfCBcCisJCQkJIF9QQUdFX0NBQ0hBQkxFIHwgX1BBR0VfRkxBR1NfSEFSRCB8IFwKKwkJCQkgX1BBR0VfRVhUKF9QQUdFX0VYVF9VU0VSX1JFQUQpKQorCisjZGVmaW5lIFBBR0VfV1JJVEVPTkxZCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9BQ0NFU1NFRCB8IFwKKwkJCQkgX1BBR0VfQ0FDSEFCTEUgfCBfUEFHRV9GTEFHU19IQVJEIHwgXAorCQkJCSBfUEFHRV9FWFQoX1BBR0VfRVhUX1VTRVJfV1JJVEUpKQorCisjZGVmaW5lIFBBR0VfUldYCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9BQ0NFU1NFRCB8IFwKKwkJCQkgX1BBR0VfQ0FDSEFCTEUgfCBfUEFHRV9GTEFHU19IQVJEIHwgXAorCQkJCSBfUEFHRV9FWFQoX1BBR0VfRVhUX1VTRVJfV1JJVEUgfCBcCisJCQkJCSAgIF9QQUdFX0VYVF9VU0VSX1JFQUQgIHwgXAorCQkJCQkgICBfUEFHRV9FWFRfVVNFUl9FWEVDKSkKKworI2RlZmluZSBQQUdFX0tFUk5FTAlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfQ0FDSEFCTEUgfCBcCisJCQkJIF9QQUdFX0RJUlRZIHwgX1BBR0VfQUNDRVNTRUQgfCBcCisJCQkJIF9QQUdFX0hXX1NIQVJFRCB8IF9QQUdFX0ZMQUdTX0hBUkQgfCBcCisJCQkJIF9QQUdFX0VYVChfUEFHRV9FWFRfS0VSTl9SRUFEIHwgXAorCQkJCQkgICBfUEFHRV9FWFRfS0VSTl9XUklURSB8IFwKKwkJCQkJICAgX1BBR0VfRVhUX0tFUk5fRVhFQykpCisKICNkZWZpbmUgUEFHRV9LRVJORUxfTk9DQUNIRSBcCi0JCQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfSFdfU0hBUkVEIHwgX1BBR0VfRkxBR1NfSEFSRCkKLSNkZWZpbmUgUEFHRV9LRVJORUxfUk8JX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX0NBQ0hBQkxFIHwgX1BBR0VfRElSVFkgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0hXX1NIQVJFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCisJCQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfRElSVFkgfCBcCisJCQkJIF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfSFdfU0hBUkVEIHwgXAorCQkJCSBfUEFHRV9GTEFHU19IQVJEIHwgXAorCQkJCSBfUEFHRV9FWFQoX1BBR0VfRVhUX0tFUk5fUkVBRCB8IFwKKwkJCQkJICAgX1BBR0VfRVhUX0tFUk5fV1JJVEUgfCBcCisJCQkJCSAgIF9QQUdFX0VYVF9LRVJOX0VYRUMpKQorCisjZGVmaW5lIFBBR0VfS0VSTkVMX1JPCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9DQUNIQUJMRSB8IFwKKwkJCQkgX1BBR0VfRElSVFkgfCBfUEFHRV9BQ0NFU1NFRCB8IFwKKwkJCQkgX1BBR0VfSFdfU0hBUkVEIHwgX1BBR0VfRkxBR1NfSEFSRCB8IFwKKwkJCQkgX1BBR0VfRVhUKF9QQUdFX0VYVF9LRVJOX1JFQUQgfCBcCisJCQkJCSAgIF9QQUdFX0VYVF9LRVJOX0VYRUMpKQorCiAjZGVmaW5lIFBBR0VfS0VSTkVMX1BDQyhzbG90LCB0eXBlKSBcCi0JCQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRkxBR1NfSEFSRCB8IChzbG90ID8gX1BBR0VfUENDX0FSRUE1IDogX1BBR0VfUENDX0FSRUE2KSB8ICh0eXBlKSkKKwkJCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9ESVJUWSB8IFwKKwkJCQkgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9GTEFHU19IQVJEIHwgXAorCQkJCSBfUEFHRV9FWFQoX1BBR0VfRVhUX0tFUk5fUkVBRCB8IFwKKwkJCQkJICAgX1BBR0VfRVhUX0tFUk5fV1JJVEUgfCBcCisJCQkJCSAgIF9QQUdFX0VYVF9LRVJOX0VYRUMpIFwKKwkJCQkgKHNsb3QgPyBfUEFHRV9QQ0NfQVJFQTUgOiBfUEFHRV9QQ0NfQVJFQTYpIHwgXAorCQkJCSAodHlwZSkpCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX01NVSkgLyogU0gtWCBUTEIgKi8KKyNkZWZpbmUgUEFHRV9OT05FCV9fcGdwcm90KF9QQUdFX1BST1ROT05FIHwgX1BBR0VfQ0FDSEFCTEUgfCBcCisJCQkJIF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRkxBR1NfSEFSRCkKKworI2RlZmluZSBQQUdFX1NIQVJFRAlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9VU0VSIHwgXAorCQkJCSBfUEFHRV9DQUNIQUJMRSB8IF9QQUdFX0FDQ0VTU0VEIHwgXAorCQkJCSBfUEFHRV9GTEFHU19IQVJEKQorCisjZGVmaW5lIFBBR0VfQ09QWQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IF9QQUdFX0NBQ0hBQkxFIHwgXAorCQkJCSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCisKKyNkZWZpbmUgUEFHRV9SRUFET05MWQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IF9QQUdFX0NBQ0hBQkxFIHwgXAorCQkJCSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCisKKyNkZWZpbmUgUEFHRV9FWEVDUkVBRAlQQUdFX1JFQURPTkxZCisjZGVmaW5lIFBBR0VfUldYCVBBR0VfU0hBUkVECisjZGVmaW5lIFBBR0VfV1JJVEVPTkxZCVBBR0VfU0hBUkVECisKKyNkZWZpbmUgUEFHRV9LRVJORUwJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfQ0FDSEFCTEUgfCBcCisJCQkJIF9QQUdFX0RJUlRZIHwgX1BBR0VfQUNDRVNTRUQgfCBcCisJCQkJIF9QQUdFX0hXX1NIQVJFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCisKKyNkZWZpbmUgUEFHRV9LRVJORUxfTk9DQUNIRSBcCisJCQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9ESVJUWSB8IFwKKwkJCQkgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9IV19TSEFSRUQgfCBcCisJCQkJIF9QQUdFX0ZMQUdTX0hBUkQpCisKKyNkZWZpbmUgUEFHRV9LRVJORUxfUk8JX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX0NBQ0hBQkxFIHwgXAorCQkJCSBfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgXAorCQkJCSBfUEFHRV9IV19TSEFSRUQgfCBfUEFHRV9GTEFHU19IQVJEKQorCisjZGVmaW5lIFBBR0VfS0VSTkVMX1BDQyhzbG90LCB0eXBlKSBcCisJCQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9ESVJUWSB8IFwKKwkJCQkgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9GTEFHU19IQVJEIHwgXAorCQkJCSAoc2xvdCA/IF9QQUdFX1BDQ19BUkVBNSA6IF9QQUdFX1BDQ19BUkVBNikgfCBcCisJCQkJICh0eXBlKSkKICNlbHNlIC8qIG5vIG1tdSAqLwogI2RlZmluZSBQQUdFX05PTkUJCV9fcGdwcm90KDApCiAjZGVmaW5lIFBBR0VfU0hBUkVECQlfX3BncHJvdCgwKQogI2RlZmluZSBQQUdFX0NPUFkJCV9fcGdwcm90KDApCisjZGVmaW5lIFBBR0VfRVhFQ1JFQUQJCV9fcGdwcm90KDApCisjZGVmaW5lIFBBR0VfUldYCQlfX3BncHJvdCgwKQogI2RlZmluZSBQQUdFX1JFQURPTkxZCQlfX3BncHJvdCgwKQorI2RlZmluZSBQQUdFX1dSSVRFT05MWQkJX19wZ3Byb3QoMCkKICNkZWZpbmUgUEFHRV9LRVJORUwJCV9fcGdwcm90KDApCiAjZGVmaW5lIFBBR0VfS0VSTkVMX05PQ0FDSEUJX19wZ3Byb3QoMCkKICNkZWZpbmUgUEFHRV9LRVJORUxfUk8JCV9fcGdwcm90KDApCkBAIC0xNTQsMjcgKzMyMywzMiBAQAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAvKgotICogQXMgaTM4NiBhbmQgTUlQUywgU3VwZXJIIGNhbid0IGRvIHBhZ2UgcHJvdGVjdGlvbiBmb3IgZXhlY3V0ZSwgYW5kCi0gKiBjb25zaWRlcnMgdGhhdCB0aGUgc2FtZSBhcyBhIHJlYWQuICBBbHNvLCB3cml0ZSBwZXJtaXNzaW9ucyBpbXBseQotICogcmVhZCBwZXJtaXNzaW9ucy4gVGhpcyBpcyB0aGUgY2xvc2VzdCB3ZSBjYW4gZ2V0Li4KKyAqIFNILVggYW5kIGxvd2VyIChsZWdhY3kpIFN1cGVySCBwYXJ0cyAoU0gtMywgU0gtNCwgc29tZSBTSC00QSkgY2FuJ3QgZG8gcGFnZQorICogcHJvdGVjdGlvbiBmb3IgZXhlY3V0ZSwgYW5kIGNvbnNpZGVycyBpdCB0aGUgc2FtZSBhcyBhIHJlYWQuIEFsc28sIHdyaXRlCisgKiBwZXJtaXNzaW9uIGltcGxpZXMgcmVhZCBwZXJtaXNzaW9uLiBUaGlzIGlzIHRoZSBjbG9zZXN0IHdlIGNhbiBnZXQuLgorICoKKyAqIFNILVgyIChTSDc3ODUpIGFuZCBsYXRlciBwYXJ0cyB0YWtlIHRoaXMgdG8gdGhlIG9wcG9zaXRlIGVuZCBvZiB0aGUgZXh0cmVtZSwKKyAqIG5vdCBvbmx5IHN1cHBvcnRpbmcgc2VwYXJhdGUgZXhlY3V0ZSwgcmVhZCwgYW5kIHdyaXRlIGJpdHMsIGJ1dCBoYXZpbmcKKyAqIGNvbXBsZXRlbHkgc2VwYXJhdGUgcGVybWlzc2lvbiBiaXRzIGZvciB1c2VyIGFuZCBrZXJuZWwgc3BhY2UuCiAgKi8KKwkgLyp4d3IqLwogI2RlZmluZSBfX1AwMDAJUEFHRV9OT05FCiAjZGVmaW5lIF9fUDAwMQlQQUdFX1JFQURPTkxZCiAjZGVmaW5lIF9fUDAxMAlQQUdFX0NPUFkKICNkZWZpbmUgX19QMDExCVBBR0VfQ09QWQotI2RlZmluZSBfX1AxMDAJUEFHRV9SRUFET05MWQotI2RlZmluZSBfX1AxMDEJUEFHRV9SRUFET05MWQorI2RlZmluZSBfX1AxMDAJUEFHRV9FWEVDUkVBRAorI2RlZmluZSBfX1AxMDEJUEFHRV9FWEVDUkVBRAogI2RlZmluZSBfX1AxMTAJUEFHRV9DT1BZCiAjZGVmaW5lIF9fUDExMQlQQUdFX0NPUFkKIAogI2RlZmluZSBfX1MwMDAJUEFHRV9OT05FCiAjZGVmaW5lIF9fUzAwMQlQQUdFX1JFQURPTkxZCi0jZGVmaW5lIF9fUzAxMAlQQUdFX1NIQVJFRAorI2RlZmluZSBfX1MwMTAJUEFHRV9XUklURU9OTFkKICNkZWZpbmUgX19TMDExCVBBR0VfU0hBUkVECi0jZGVmaW5lIF9fUzEwMAlQQUdFX1JFQURPTkxZCi0jZGVmaW5lIF9fUzEwMQlQQUdFX1JFQURPTkxZCi0jZGVmaW5lIF9fUzExMAlQQUdFX1NIQVJFRAotI2RlZmluZSBfX1MxMTEJUEFHRV9TSEFSRUQKKyNkZWZpbmUgX19TMTAwCVBBR0VfRVhFQ1JFQUQKKyNkZWZpbmUgX19TMTAxCVBBR0VfRVhFQ1JFQUQKKyNkZWZpbmUgX19TMTEwCVBBR0VfUldYCisjZGVmaW5lIF9fUzExMQlQQUdFX1JXWAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC0xODMsNyArMzU3LDE3IEBACiAgKiB3aXRoaW4gYSBwYWdlIHRhYmxlIGFyZSBkaXJlY3RseSBtb2RpZmllZC4gIFRodXMsIHRoZSBmb2xsb3dpbmcKICAqIGhvb2sgaXMgbWFkZSBhdmFpbGFibGUuCiAgKi8KKyNpZmRlZiBDT05GSUdfWDJUTEIKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcHRlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCit7CisJcHRlcC0+cHRlX2hpZ2ggPSBwdGUucHRlX2hpZ2g7CisJc21wX3dtYigpOworCXB0ZXAtPnB0ZV9sb3cgPSBwdGUucHRlX2xvdzsKK30KKyNlbHNlCiAjZGVmaW5lIHNldF9wdGUocHRlcHRyLCBwdGV2YWwpICgqKHB0ZXB0cikgPSBwdGV2YWwpCisjZW5kaWYKKwogI2RlZmluZSBzZXRfcHRlX2F0KG1tLGFkZHIscHRlcCxwdGV2YWwpIHNldF9wdGUocHRlcCxwdGV2YWwpCiAKIC8qCkBAIC0xOTIsMTggKzM3NiwxOCBAQAogICovCiAjZGVmaW5lIHNldF9wbWQocG1kcHRyLCBwbWR2YWwpICgqKHBtZHB0cikgPSBwbWR2YWwpCiAKLSNkZWZpbmUgcHRlX3Bmbih4KQkJKCh1bnNpZ25lZCBsb25nKSgoKHgpLnB0ZSA+PiBQQUdFX1NISUZUKSkpCisjZGVmaW5lIHB0ZV9wZm4oeCkJCSgodW5zaWduZWQgbG9uZykoKCh4KS5wdGVfbG93ID4+IFBBR0VfU0hJRlQpKSkKICNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCiAjZGVmaW5lIHBmbl9wbWQocGZuLCBwcm90KQlfX3BtZCgoKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKQogCiAjZGVmaW5lIHB0ZV9ub25lKHgpCSghcHRlX3ZhbCh4KSkKICNkZWZpbmUgcHRlX3ByZXNlbnQoeCkJKHB0ZV92YWwoeCkgJiAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1BST1ROT05FKSkKLSNkZWZpbmUgcHRlX2NsZWFyKG1tLGFkZHIseHApCWRvIHsgc2V0X3B0ZV9hdChtbSwgYWRkciwgeHAsIF9fcHRlKDApKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHRlX2NsZWFyKG1tLGFkZHIseHApIGRvIHsgc2V0X3B0ZV9hdChtbSwgYWRkciwgeHAsIF9fcHRlKDApKTsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSBwbWRfbm9uZSh4KQkoIXBtZF92YWwoeCkpCi0jZGVmaW5lIHBtZF9wcmVzZW50KHgpCShwbWRfdmFsKHgpICYgX1BBR0VfUFJFU0VOVCkKKyNkZWZpbmUgcG1kX3ByZXNlbnQoeCkJKHBtZF92YWwoeCkpCiAjZGVmaW5lIHBtZF9jbGVhcih4cCkJZG8geyBzZXRfcG1kKHhwLCBfX3BtZCgwKSk7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXBtZF9iYWQoeCkJKChwbWRfdmFsKHgpICYgKH5QQUdFX01BU0sgJiB+X1BBR0VfVVNFUikpICE9IF9LRVJOUEdfVEFCTEUpCisjZGVmaW5lCXBtZF9iYWQoeCkJKHBtZF92YWwoeCkgJiB+UEFHRV9NQVNLKQogCiAjZGVmaW5lIHBhZ2VzX3RvX21iKHgpCSgoeCkgPj4gKDIwLVBBR0VfU0hJRlQpKQogI2RlZmluZSBwdGVfcGFnZSh4KQlwaHlzX3RvX3BhZ2UocHRlX3ZhbCh4KSZQVEVfUEhZU19NQVNLKQpAQCAtMjEyLDI4ICszOTYsNTIgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX25vdF9wcmVzZW50KHB0ZV90IHB0ZSl7IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX1BSRVNFTlQpOyB9CisjZGVmaW5lIHB0ZV9ub3RfcHJlc2VudChwdGUpCSghKHB0ZV92YWwocHRlKSAmIF9QQUdFX1BSRVNFTlQpKQorI2RlZmluZSBwdGVfZGlydHkocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZKQorI2RlZmluZSBwdGVfeW91bmcocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEKQorI2RlZmluZSBwdGVfZmlsZShwdGUpCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRSkKIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9ESVJUWSkpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9SVykpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9SVykpOyByZXR1cm4gcHRlOyB9Ci0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtodWdlKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1NaSFVHRSkpOyByZXR1cm4gcHRlOyB9CisjaWZkZWYgQ09ORklHX1gyVExCCisjZGVmaW5lIHB0ZV9yZWFkKHB0ZSkJCSgocHRlKS5wdGVfaGlnaCAmIF9QQUdFX0VYVF9VU0VSX1JFQUQpCisjZGVmaW5lIHB0ZV9leGVjKHB0ZSkJCSgocHRlKS5wdGVfaGlnaCAmIF9QQUdFX0VYVF9VU0VSX0VYRUMpCisjZGVmaW5lIHB0ZV93cml0ZShwdGUpCQkoKHB0ZSkucHRlX2hpZ2ggJiBfUEFHRV9FWFRfVVNFUl9XUklURSkKKyNlbHNlCisjZGVmaW5lIHB0ZV9yZWFkKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSKQorI2RlZmluZSBwdGVfZXhlYyhwdGUpCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUikKKyNkZWZpbmUgcHRlX3dyaXRlKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVykKICNlbmRpZgogCisjZGVmaW5lIFBURV9CSVRfRlVOQyhoLGZuLG9wKSBcCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV8jI2ZuKHB0ZV90IHB0ZSkgeyBwdGUucHRlXyMjaCBvcDsgcmV0dXJuIHB0ZTsgfQorCisjaWZkZWYgQ09ORklHX1gyVExCCisvKgorICogV2UgY2hlYXQgYSBiaXQgaW4gdGhlIFNILVgyIFRMQiBjYXNlLiBBcyB0aGUgcGVybWlzc2lvbiBiaXRzIGFyZQorICogaW5kaXZpZHVhbGx5IHRvZ2dsZWQgKGFuZCB1c2VyIHBlcm1pc3Npb25zIGFyZSBlbnRpcmVseSBkZWNvdXBsZWQgZnJvbQorICoga2VybmVsIHBlcm1pc3Npb25zKSwgd2UgYXR0ZW1wdCB0byBjb3VwbGUgdGhlbSBhIGJpdCBtb3JlIHNhbmVseSBoZXJlLgorICovCitQVEVfQklUX0ZVTkMoaGlnaCwgcmRwcm90ZWN0LCAmPSB+X1BBR0VfRVhUX1VTRVJfUkVBRCk7CitQVEVfQklUX0ZVTkMoaGlnaCwgbWtyZWFkLCB8PSBfUEFHRV9FWFRfVVNFUl9SRUFEIHwgX1BBR0VfRVhUX0tFUk5fUkVBRCk7CitQVEVfQklUX0ZVTkMoaGlnaCwgd3Jwcm90ZWN0LCAmPSB+X1BBR0VfRVhUX1VTRVJfV1JJVEUpOworUFRFX0JJVF9GVU5DKGhpZ2gsIG1rd3JpdGUsIHw9IF9QQUdFX0VYVF9VU0VSX1dSSVRFIHwgX1BBR0VfRVhUX0tFUk5fV1JJVEUpOworUFRFX0JJVF9GVU5DKGhpZ2gsIGV4cHJvdGVjdCwgJj0gfl9QQUdFX0VYVF9VU0VSX0VYRUMpOworUFRFX0JJVF9GVU5DKGhpZ2gsIG1rZXhlYywgfD0gX1BBR0VfRVhUX1VTRVJfRVhFQyB8IF9QQUdFX0VYVF9LRVJOX0VYRUMpOworUFRFX0JJVF9GVU5DKGhpZ2gsIG1raHVnZSwgfD0gX1BBR0VfU1pIVUdFKTsKKyNlbHNlCitQVEVfQklUX0ZVTkMobG93LCByZHByb3RlY3QsICY9IH5fUEFHRV9VU0VSKTsKK1BURV9CSVRfRlVOQyhsb3csIG1rcmVhZCwgfD0gX1BBR0VfVVNFUik7CitQVEVfQklUX0ZVTkMobG93LCB3cnByb3RlY3QsICY9IH5fUEFHRV9SVyk7CitQVEVfQklUX0ZVTkMobG93LCBta3dyaXRlLCB8PSBfUEFHRV9SVyk7CitQVEVfQklUX0ZVTkMobG93LCBleHByb3RlY3QsICY9IH5fUEFHRV9VU0VSKTsKK1BURV9CSVRfRlVOQyhsb3csIG1rZXhlYywgfD0gX1BBR0VfVVNFUik7CitQVEVfQklUX0ZVTkMobG93LCBta2h1Z2UsIHw9IF9QQUdFX1NaSFVHRSk7CisjZW5kaWYKKworUFRFX0JJVF9GVU5DKGxvdywgbWtjbGVhbiwgJj0gfl9QQUdFX0RJUlRZKTsKK1BURV9CSVRfRlVOQyhsb3csIG1rZGlydHksIHw9IF9QQUdFX0RJUlRZKTsKK1BURV9CSVRfRlVOQyhsb3csIG1rb2xkLCAmPSB+X1BBR0VfQUNDRVNTRUQpOworUFRFX0JJVF9GVU5DKGxvdywgbWt5b3VuZywgfD0gX1BBR0VfQUNDRVNTRUQpOworCiAvKgogICogTWFjcm8gYW5kIGltcGxlbWVudGF0aW9uIHRvIG1ha2UgYSBwYWdlIHByb3RlY3Rpb24gYXMgdW5jYWNoYWJsZS4KICAqLwpAQCAtMjU4LDEzICs0NjYsMTQgQEAKICNkZWZpbmUgbWtfcHRlKHBhZ2UsIHBncHJvdCkJcGZuX3B0ZShwYWdlX3RvX3BmbihwYWdlKSwgKHBncHJvdCkpCiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21vZGlmeShwdGVfdCBwdGUsIHBncHJvdF90IG5ld3Byb3QpCi17IHNldF9wdGUoJnB0ZSwgX19wdGUoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0NIR19NQVNLKSB8IHBncHJvdF92YWwobmV3cHJvdCkpKTsgcmV0dXJuIHB0ZTsgfQoreworCXNldF9wdGUoJnB0ZSwgX19wdGUoKHB0ZV92YWwocHRlKSAmIF9QQUdFX0NIR19NQVNLKSB8CisJCQkgICAgcGdwcm90X3ZhbChuZXdwcm90KSkpOworCXJldHVybiBwdGU7Cit9CiAKLSNkZWZpbmUgcG1kX3BhZ2VfdmFkZHIocG1kKSBcCi0oKHVuc2lnbmVkIGxvbmcpIF9fdmEocG1kX3ZhbChwbWQpICYgUEFHRV9NQVNLKSkKLQotI2RlZmluZSBwbWRfcGFnZShwbWQpIFwKLQkocGh5c190b19wYWdlKHBtZF92YWwocG1kKSkpCisjZGVmaW5lIHBtZF9wYWdlX3ZhZGRyKHBtZCkJcG1kX3ZhbChwbWQpCisjZGVmaW5lIHBtZF9wYWdlKHBtZCkJCSh2aXJ0X3RvX3BhZ2UocG1kX3ZhbChwbWQpKSkKIAogLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIHBhZ2UtdGFibGUtZGlyZWN0b3J5LiAqLwogI2RlZmluZSBwZ2RfaW5kZXgoYWRkcmVzcykgKCgoYWRkcmVzcykgPj4gUEdESVJfU0hJRlQpICYgKFBUUlNfUEVSX1BHRC0xKSkKQEAgLTI4Myw4ICs0OTIsMTUgQEAKICNkZWZpbmUgcHRlX3VubWFwKHB0ZSkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgcHRlX3VubWFwX25lc3RlZChwdGUpCWRvIHsgfSB3aGlsZSAoMCkKIAorI2lmZGVmIENPTkZJR19YMlRMQgorI2RlZmluZSBwdGVfRVJST1IoZSkgXAorCXByaW50aygiJXM6JWQ6IGJhZCBwdGUgJXAoJTA4bHglMDhseCkuXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIFwKKwkgICAgICAgJihlKSwgKGUpLnB0ZV9oaWdoLCAoZSkucHRlX2xvdykKKyNlbHNlCiAjZGVmaW5lIHB0ZV9FUlJPUihlKSBcCiAJcHJpbnRrKCIlczolZDogYmFkIHB0ZSAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRlX3ZhbChlKSkKKyNlbmRpZgorCiAjZGVmaW5lIHBnZF9FUlJPUihlKSBcCiAJcHJpbnRrKCIlczolZDogYmFkIHBnZCAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcGdkX3ZhbChlKSkKIApAQCAtMjkyLDE2ICs1MDgsNTAgQEAKIGV4dGVybiB2b2lkIHVwZGF0ZV9tbXVfY2FjaGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90IHB0ZSk7CiAKLS8qIEVuY29kZSBhbmQgZGUtY29kZSBhIHN3YXAgZW50cnkgKi8KIC8qCisgKiBFbmNvZGUgYW5kIGRlLWNvZGUgYSBzd2FwIGVudHJ5CisgKgorICogQ29uc3RyYWludHM6CisgKglfUEFHRV9GSUxFIGF0IGJpdCAwCisgKglfUEFHRV9QUkVTRU5UIGF0IGJpdCA4CisgKglfUEFHRV9QUk9UTk9ORSBhdCBiaXQgOQorICoKKyAqIEZvciB0aGUgbm9ybWFsIGNhc2UsIHdlIGVuY29kZSB0aGUgc3dhcCB0eXBlIGludG8gYml0cyAwOjcgYW5kIHRoZQorICogc3dhcCBvZmZzZXQgaW50byBiaXRzIDEwOjMwLiBGb3IgdGhlIDY0LWJpdCBQVEUgY2FzZSwgd2Uga2VlcCB0aGUKKyAqIHByZXNlcnZlZCBiaXRzIGluIHRoZSBsb3cgMzItYml0cyBhbmQgdXNlIHRoZSB1cHBlciAzMiBhcyB0aGUgc3dhcAorICogb2Zmc2V0IChhbG9uZyB3aXRoIGEgNS1iaXQgdHlwZSksIGZvbGxvd2luZyB0aGUgc2FtZSBhcHByb2FjaCBhcyB4ODYKKyAqIFBBRS4gVGhpcyBrZWVwcyB0aGUgbG9naWMgcXVpdGUgc2ltcGxlLCBhbmQgYWxsb3dzIGZvciBhIGZ1bGwgMzIKKyAqIFBURV9GSUxFX01BWF9CSVRTLCBhcyBvcHBvc2VkIHRvIHRoZSAyOS1iaXRzIHdlJ3JlIGNvbnN0cmFpbmVkIHdpdGgKKyAqIGluIHRoZSBwdGVfbG93IGNhc2UuCisgKgorICogQXMgaXMgZXZpZGVudCBieSB0aGUgQWxwaGEgY29kZSwgaWYgd2UgZXZlciBnZXQgYSA2NC1iaXQgdW5zaWduZWQKKyAqIGxvbmcgKHN3cF9lbnRyeV90KSB0byBtYXRjaCB1cCB3aXRoIHRoZSA2NC1iaXQgUFRFcywgdGhpcyBhbGwgYmVjb21lcworICogbXVjaCBjbGVhbmVyLi4KKyAqCiAgKiBOT1RFOiBXZSBzaG91bGQgc2V0IFpFUk9zIGF0IHRoZSBwb3NpdGlvbiBvZiBfUEFHRV9QUkVTRU5UCiAgKiAgICAgICBhbmQgX1BBR0VfUFJPVE5PTkUgYml0cwogICovCi0jZGVmaW5lIF9fc3dwX3R5cGUoeCkJCSgoeCkudmFsICYgMHhmZikKLSNkZWZpbmUgX19zd3Bfb2Zmc2V0KHgpCQkoKHgpLnZhbCA+PiAxMCkKLSNkZWZpbmUgX19zd3BfZW50cnkodHlwZSwgb2Zmc2V0KSAoKHN3cF9lbnRyeV90KSB7ICh0eXBlKSB8ICgob2Zmc2V0KSA8PCAxMCkgfSkKLSNkZWZpbmUgX19wdGVfdG9fc3dwX2VudHJ5KHB0ZSkJKChzd3BfZW50cnlfdCkgeyBwdGVfdmFsKHB0ZSkgPj4gMSB9KQotI2RlZmluZSBfX3N3cF9lbnRyeV90b19wdGUoeCkJKChwdGVfdCkgeyAoeCkudmFsIDw8IDEgfSkKKyNpZmRlZiBDT05GSUdfWDJUTEIKKyNkZWZpbmUgX19zd3BfdHlwZSh4KQkJCSgoeCkudmFsICYgMHgxZikKKyNkZWZpbmUgX19zd3Bfb2Zmc2V0KHgpCQkJKCh4KS52YWwgPj4gNSkKKyNkZWZpbmUgX19zd3BfZW50cnkodHlwZSwgb2Zmc2V0KQkoKHN3cF9lbnRyeV90KXsgKHR5cGUpIHwgKG9mZnNldCkgPDwgNX0pCisjZGVmaW5lIF9fcHRlX3RvX3N3cF9lbnRyeShwdGUpCQkoKHN3cF9lbnRyeV90KXsgKHB0ZSkucHRlX2hpZ2ggfSkKKyNkZWZpbmUgX19zd3BfZW50cnlfdG9fcHRlKHgpCQkoKHB0ZV90KXsgMCwgKHgpLnZhbCB9KQorCisvKgorICogRW5jb2RlIGFuZCBkZWNvZGUgYSBub25saW5lYXIgZmlsZSBtYXBwaW5nIGVudHJ5CisgKi8KKyNkZWZpbmUgcHRlX3RvX3Bnb2ZmKHB0ZSkJCSgocHRlKS5wdGVfaGlnaCkKKyNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJCSgocHRlX3QpIHsgX1BBR0VfRklMRSwgKG9mZikgfSkKKworI2RlZmluZSBQVEVfRklMRV9NQVhfQklUUwkJMzIKKyNlbHNlCisjZGVmaW5lIF9fc3dwX3R5cGUoeCkJCQkoKHgpLnZhbCAmIDB4ZmYpCisjZGVmaW5lIF9fc3dwX29mZnNldCh4KQkJCSgoeCkudmFsID4+IDEwKQorI2RlZmluZSBfX3N3cF9lbnRyeSh0eXBlLCBvZmZzZXQpCSgoc3dwX2VudHJ5X3Qpeyh0eXBlKSB8IChvZmZzZXQpIDw8MTB9KQorCisjZGVmaW5lIF9fcHRlX3RvX3N3cF9lbnRyeShwdGUpCQkoKHN3cF9lbnRyeV90KSB7IHB0ZV92YWwocHRlKSA+PiAxIH0pCisjZGVmaW5lIF9fc3dwX2VudHJ5X3RvX3B0ZSh4KQkJKChwdGVfdCkgeyAoeCkudmFsIDw8IDEgfSkKIAogLyoKICAqIEVuY29kZSBhbmQgZGVjb2RlIGEgbm9ubGluZWFyIGZpbGUgbWFwcGluZyBlbnRyeQpAQCAtMzA5LDYgKzU1OSw3IEBACiAjZGVmaW5lIFBURV9GSUxFX01BWF9CSVRTCTI5CiAjZGVmaW5lIHB0ZV90b19wZ29mZihwdGUpCShwdGVfdmFsKHB0ZSkgPj4gMSkKICNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJKChwdGVfdCkgeyAoKG9mZikgPDwgMSkgfCBfUEFHRV9GSUxFIH0pCisjZW5kaWYKIAogdHlwZWRlZiBwdGVfdCAqcHRlX2FkZHJfdDsKIApAQCAtMzM3LDYgKzU4OCw5IEBACiBleHRlcm4gcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKTsKICNlbmRpZgogCitleHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsKK2V4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOworCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS5oPgogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaAppbmRleCA0NzQ3NzM4Li5lMjlmMmFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaApAQCAtMjcsNiArMjcsOCBAQAogI2RlZmluZSBDQ05fQ1ZSCQkweGZmMDAwMDQwCiAjZGVmaW5lIENDTl9QUlIJCTB4ZmYwMDAwNDQKIAorY29uc3QgY2hhciAqZ2V0X2NwdV9zdWJ0eXBlKHZvaWQpOworCiAvKgogICogIENQVSB0eXBlIGFuZCBoYXJkd2FyZSBidWcgZmxhZ3MuIEtlcHQgc2VwYXJhdGVseSBmb3IgZWFjaCBDUFUuCiAgKgpAQCAtMzYsNyArMzgsMTAgQEAKICAqLwogZW51bSBjcHVfdHlwZSB7CiAJLyogU0gtMiB0eXBlcyAqLwotCUNQVV9TSDc2MDQsCisJQ1BVX1NINzYwNCwgQ1BVX1NINzYxOSwKKworCS8qIFNILTJBIHR5cGVzICovCisJQ1BVX1NINzIwNiwKIAogCS8qIFNILTMgdHlwZXMgKi8KIAlDUFVfU0g3NzA1LCBDUFVfU0g3NzA2LCBDUFVfU0g3NzA3LApAQCAtNDcsNyArNTIsMTIgQEAKIAkvKiBTSC00IHR5cGVzICovCiAJQ1BVX1NINzc1MCwgQ1BVX1NINzc1MFMsIENQVV9TSDc3NTBSLCBDUFVfU0g3NzUxLCBDUFVfU0g3NzUxUiwKIAlDUFVfU0g3NzYwLCBDUFVfU1Q0MFJBLCBDUFVfU1Q0MEdYMSwgQ1BVX1NINF8yMDIsIENQVV9TSDRfNTAxLAotCUNQVV9TSDczMTgwLCBDUFVfU0g3MzQzLCBDUFVfU0g3NzcwLCBDUFVfU0g3NzgwLCBDUFVfU0g3NzgxLAorCisJLyogU0gtNEEgdHlwZXMgKi8KKwlDUFVfU0g3NzcwLCBDUFVfU0g3NzgwLCBDUFVfU0g3NzgxLCBDUFVfU0g3Nzg1LAorCisJLyogU0g0QUwtRFNQIHR5cGVzICovCisJQ1BVX1NINzMxODAsIENQVV9TSDczNDMsIENQVV9TSDc3MjIsCiAKIAkvKiBVbmtub3duIHN1YnR5cGUgKi8KIAlDUFVfU0hfTk9ORQpAQCAtMTMwLDEyICsxNDAsMTEgQEAKIH07CiAKIHN0cnVjdCB0aHJlYWRfc3RydWN0IHsKKwkvKiBTYXZlZCByZWdpc3RlcnMgd2hlbiB0aHJlYWQgaXMgZGVzY2hlZHVsZWQgKi8KIAl1bnNpZ25lZCBsb25nIHNwOwogCXVuc2lnbmVkIGxvbmcgcGM7CiAKLQl1bnNpZ25lZCBsb25nIHRyYXBfbm8sIGVycm9yX2NvZGU7Ci0JdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCS8qIEhhcmR3YXJlIGRlYnVnZ2luZyByZWdpc3RlcnMgbWF5IGNvbWUgaGVyZSAqLworCS8qIEhhcmR3YXJlIGRlYnVnZ2luZyByZWdpc3RlcnMgKi8KIAl1bnNpZ25lZCBsb25nIHViY19wYzsKIAogCS8qIGZsb2F0aW5nIHBvaW50IGluZm8gKi8KQEAgLTE1MCwxMiArMTU5LDcgQEAKIGV4dGVybiBpbnQgdWJjX3VzZXJjbnQ7CiAKICNkZWZpbmUgSU5JVF9USFJFQUQgIHsJCQkJCQlcCi0Jc2l6ZW9mKGluaXRfc3RhY2spICsgKGxvbmcpICZpbml0X3N0YWNrLCAvKiBzcCAqLwlcCi0JMCwJCQkJCSAvKiBwYyAqLwlcCi0JMCwgMCwJCQkJCQkJXAotCTAsCQkJCQkJCVwKLQkwLAkJCQkJCQlcCi0Je3t7MCx9fSx9CQkJCS8qIGZwdSBzdGF0ZSAqLwlcCisJLnNwID0gc2l6ZW9mKGluaXRfc3RhY2spICsgKGxvbmcpICZpbml0X3N0YWNrLAkJXAogfQogCiAvKgpAQCAtMjU1LDEwICsyNTksMTIgQEAKICAqLwogI2RlZmluZSB0aHJlYWRfc2F2ZWRfcGModHNrKQkodHNrLT50aHJlYWQucGMpCiAKK3ZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqc3AsCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogCi0jZGVmaW5lIEtTVEtfRUlQKHRzaykgICgodHNrKS0+dGhyZWFkLnBjKQotI2RlZmluZSBLU1RLX0VTUCh0c2spICAoKHRzayktPnRocmVhZC5zcCkKKyNkZWZpbmUgS1NUS19FSVAodHNrKSAgKHRhc2tfcHRfcmVncyh0c2spLT5wYykKKyNkZWZpbmUgS1NUS19FU1AodHNrKSAgKHRhc2tfcHRfcmVncyh0c2spLT5yZWdzWzE1XSkKIAogI2RlZmluZSBjcHVfc2xlZXAoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNsZWVwIiA6IDogOiAibWVtb3J5IikKICNkZWZpbmUgY3B1X3JlbGF4KCkJYmFycmllcigpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wdXNoLXN3aXRjaC5oIGIvaW5jbHVkZS9hc20tc2gvcHVzaC1zd2l0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTAzZjllCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvcHVzaC1zd2l0Y2guaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIF9fQVNNX1NIX1BVU0hfU1dJVENIX0gKKyNkZWZpbmUgX19BU01fU0hfUFVTSF9TV0lUQ0hfSAorCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworc3RydWN0IHB1c2hfc3dpdGNoIHsKKwkvKiBzd2l0Y2ggc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQJCXN0YXRlOjE7CisJLyogZGVib3VuY2UgdGltZXIgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdAlkZWJvdW5jZTsKKwkvKiB3b3JrcXVldWUgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKwkvKiBwbGF0Zm9ybSBkZXZpY2UsIGZvciB3b3JrcXVldWUgaGFuZGxlciAqLworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7Cit9OworCitzdHJ1Y3QgcHVzaF9zd2l0Y2hfcGxhdGZvcm1faW5mbyB7CisJLyogSVJRIGhhbmRsZXIgKi8KKwlpcnFyZXR1cm5fdAkJKCppcnFfaGFuZGxlcikoaW50IGlycSwgdm9pZCAqZGF0YSk7CisJLyogU3BlY2lhbCBJUlEgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJCWlycV9mbGFnczsKKwkvKiBCaXQgbG9jYXRpb24gb2Ygc3dpdGNoICovCisJdW5zaWduZWQgaW50CQliaXQ7CisJLyogU3ltYm9saWMgc3dpdGNoIG5hbWUgKi8KKwljb25zdCBjaGFyCQkqbmFtZTsKK307CisKKyNlbmRpZiAvKiBfX0FTTV9TSF9QVVNIX1NXSVRDSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwLmggYi9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4ZjY0OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL3I3NzgwcnAuaApAQCAtMCwwICsxLDE3MSBAQAorI2lmbmRlZiBfX0FTTV9TSF9SRU5FU0FTX1I3NzgwUlBfSAorI2RlZmluZSBfX0FTTV9TSF9SRU5FU0FTX1I3NzgwUlBfSAorCisvKgorICogbGludXgvaW5jbHVkZS9hc20tc2gvcjc3ODBycC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KKyAqCisgKiBSZW5lc2FzIFNvbHV0aW9ucyBIaWdobGFuZGVyIFI3NzgwUlAgc3VwcG9ydAorICovCisKKy8qIEJveCBzcGVjaWZpYyBhZGRyZXNzZXMuICAqLworI2lmIGRlZmluZWQoQ09ORklHX1NIX1I3NzgwTVApCisjZGVmaW5lIFBBX0JDUiAgICAgICAgICAweGE0MDAwMDAwICAgICAgLyogRlBHQSAqLworI2RlZmluZSBQQV9JUkxNU0sgICAgICAgKFBBX0JDUisweDAwMDApIC8qIEludGVycnVwdCBNYXNrIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSVJMTU9OICAgICAgIChQQV9CQ1IrMHgwMDAyKSAvKiBJbnRlcnJ1cHQgU3RhdHVzIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSVJMUFJJMSAgICAgIChQQV9CQ1IrMHgwMDA0KSAvKiBJbnRlcnJ1cHQgUHJpb3J0eSAxICovCisjZGVmaW5lIFBBX0lSTFBSSTIgICAgICAoUEFfQkNSKzB4MDAwNikgLyogSW50ZXJydXB0IFByaW9ydHkgMiAqLworI2RlZmluZSBQQV9JUkxQUkkzICAgICAgKFBBX0JDUisweDAwMDgpIC8qIEludGVycnVwdCBQcmlvcnR5IDMgKi8KKyNkZWZpbmUgUEFfSVJMUFJJNCAgICAgIChQQV9CQ1IrMHgwMDBhKSAvKiBJbnRlcnJ1cHQgUHJpb3J0eSA0ICovCisjZGVmaW5lIFBBX1JTVENUTCAgICAgICAoUEFfQkNSKzB4MDAwYykgLyogUmVzZXQgQ29udHJvbCAqLworI2RlZmluZSBQQV9QQ0lCRCAgICAgICAgKFBBX0JDUisweDAwMGUpIC8qIFBDSSBCb2FyZCBkZXRlY3QgY29udHJvbCAqLworI2RlZmluZSBQQV9QQ0lDRCAgICAgICAgKFBBX0JDUisweDAwMTApIC8qIFBDSSBDb25lY3RvciBkZXRlY3QgY29udHJvbCAqLworI2RlZmluZSBQQV9FWFRHSU8gICAgICAgKFBBX0JDUisweDAwMTYpIC8qIEV4dGVuc2lvbiBHUElPIENvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSVZEUk1PTiAgICAgIChQQV9CQ1IrMHgwMDE4KSAvKiBpVkRSIE1vbml0ZXIgY29udHJvbCAqLworI2RlZmluZSBQQV9JVkRSQ1RMICAgICAgKFBBX0JDUisweDAwMWEpIC8qIGlWRFIgY29udHJvbCAqLworI2RlZmluZSBQQV9PQkxFRCAgICAgICAgKFBBX0JDUisweDAwMWMpIC8qIE9uIEJvYXJkIExFRCBjb250cm9sICovCisjZGVmaW5lIFBBX09CU1cgICAgICAgICAoUEFfQkNSKzB4MDAxZSkgLyogT24gQm9hcmQgU3dpdGNoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQVVESU9TRUwgICAgIChQQV9CQ1IrMHgwMDIwKSAvKiBTb3VuZCBJbnRlcmZhY2UgU2VsZWN0IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfRVhUUExSICAgICAgIChQQV9CQ1IrMHgwMDFlKSAvKiBFeHRlbnRpb24gUGluIFBvbGFyaXR5IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVFBDVEwgICAgICAgIChQQV9CQ1IrMHgwMTAwKSAvKiBUb3VjaCBQYW5lbCBBY2Nlc3MgY29udHJvbCAqLworI2RlZmluZSBQQV9UUERDS0NUTCAgICAgKFBBX0JDUisweDAxMDIpIC8qIFRvdWNoIFBhbmVsIEFjY2VzcyBkYXRhIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVFBDVExDTFIgICAgIChQQV9CQ1IrMHgwMTA0KSAvKiBUb3VjaCBQYW5lbCBBY2Nlc3MgY29udHJvbCAqLworI2RlZmluZSBQQV9UUFhQT1MgICAgICAgKFBBX0JDUisweDAxMDYpIC8qIFRvdWNoIFBhbmVsIFggcG9zaXRpb24gY29udHJvbCAqLworI2RlZmluZSBQQV9UUFlQT1MgICAgICAgKFBBX0JDUisweDAxMDgpIC8qIFRvdWNoIFBhbmVsIFkgcG9zaXRpb24gY29udHJvbCAqLworI2RlZmluZSBQQV9EQlNXICAgICAgICAgKFBBX0JDUisweDAyMDApIC8qIERlYnVnIEJvYXJkIFN3aXRjaCBjb250cm9sICovCisjZGVmaW5lIFBBX0NGQ1RMICAgICAgICAoUEFfQkNSKzB4MDMwMCkgLyogQ0YgVGltaW5nIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQ0ZQT1cgICAgICAgIChQQV9CQ1IrMHgwMzAyKSAvKiBDRiBQb3dlciBjb250cm9sICovCisjZGVmaW5lIFBBX0NGQ0RJTlRDTFIgICAoUEFfQkNSKzB4MDMwNCkgLyogQ0YgSW5zZXJ0IEludGVycnVwdCBjbGVhciAqLworI2RlZmluZSBQQV9TQ1NNUjAgICAgICAgKFBBX0JDUisweDA0MDApIC8qIFNDSUYwIFNlcmlhbCBtb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NCUlIwICAgICAgIChQQV9CQ1IrMHgwNDA0KSAvKiBTQ0lGMCBCaXQgcmF0ZSBjb250cm9sICovCisjZGVmaW5lIFBBX1NDU0NSMCAgICAgICAoUEFfQkNSKzB4MDQwOCkgLyogU0NJRjAgU2VyaWFsIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NGVERSMCAgICAgIChQQV9CQ1IrMHgwNDBjKSAvKiBTQ0lGMCBTZW5kIEZJRk8gY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZTUjAgICAgICAgKFBBX0JDUisweDA0MTApIC8qIFNDSUYwIFNlcmlhbCBzdGF0dXMgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZSRFIwICAgICAgKFBBX0JDUisweDA0MTQpIC8qIFNDSUYwIFJlY2VpdmUgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRkNSMCAgICAgICAoUEFfQkNSKzB4MDQxOCkgLyogU0NJRjAgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDVEZEUjAgICAgICAoUEFfQkNSKzB4MDQxYykgLyogU0NJRjAgU2VuZCBGSUZPIGRhdGEgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ1JGRFIwICAgICAgKFBBX0JDUisweDA0MjApIC8qIFNDSUYwIFJlY2VpdmUgRklGTyBkYXRhIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NTUFRSMCAgICAgIChQQV9CQ1IrMHgwNDI0KSAvKiBTQ0lGMCBTZXJpYWwgUG9ydCBjb250cm9sICovCisjZGVmaW5lIFBBX1NDTFNSMCAgICAgICAoUEFfQkNSKzB4MDQyOCkgLyogU0NJRjAgTGluZSBTdGF0dXMgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ1JFUjAgICAgICAgKFBBX0JDUisweDA0MmMpIC8qIFNDSUYwIFNlcmlhbCBFcnJvciBjb250cm9sICovCisjZGVmaW5lIFBBX1NDU01SMSAgICAgICAoUEFfQkNSKzB4MDUwMCkgLyogU0NJRjEgU2VyaWFsIG1vZGUgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0JSUjEgICAgICAgKFBBX0JDUisweDA1MDQpIC8qIFNDSUYxIEJpdCByYXRlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NTQ1IxICAgICAgIChQQV9CQ1IrMHgwNTA4KSAvKiBTQ0lGMSBTZXJpYWwgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZURFIxICAgICAgKFBBX0JDUisweDA1MGMpIC8qIFNDSUYxIFNlbmQgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRlNSMSAgICAgICAoUEFfQkNSKzB4MDUxMCkgLyogU0NJRjEgU2VyaWFsIHN0YXR1cyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRlJEUjEgICAgICAoUEFfQkNSKzB4MDUxNCkgLyogU0NJRjEgUmVjZWl2ZSBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NGQ1IxICAgICAgIChQQV9CQ1IrMHgwNTE4KSAvKiBTQ0lGMSBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NURkRSMSAgICAgIChQQV9CQ1IrMHgwNTFjKSAvKiBTQ0lGMSBTZW5kIEZJRk8gZGF0YSBjb250cm9sICovCisjZGVmaW5lIFBBX1NDUkZEUjEgICAgICAoUEFfQkNSKzB4MDUyMCkgLyogU0NJRjEgUmVjZWl2ZSBGSUZPIGRhdGEgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ1NQVFIxICAgICAgKFBBX0JDUisweDA1MjQpIC8qIFNDSUYxIFNlcmlhbCBQb3J0IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NMU1IxICAgICAgIChQQV9CQ1IrMHgwNTI4KSAvKiBTQ0lGMSBMaW5lIFN0YXR1cyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDUkVSMSAgICAgICAoUEFfQkNSKzB4MDUyYykgLyogU0NJRjEgU2VyaWFsIEVycm9yIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSUNDUiAgICAgICAgIChQQV9CQ1IrMHgwNjAwKSAvKiBTZXJpYWwgY29udHJvbCAqLworI2RlZmluZSBQQV9TQVIgICAgICAgICAgKFBBX0JDUisweDA2MDIpIC8qIFNlcmlhbCBTbGF2ZSBjb250cm9sICovCisjZGVmaW5lIFBBX01EUiAgICAgICAgICAoUEFfQkNSKzB4MDYwNCkgLyogU2VyaWFsIE1vZGUgY29udHJvbCAqLworI2RlZmluZSBQQV9BRFIxICAgICAgICAgKFBBX0JDUisweDA2MDYpIC8qIFNlcmlhbCBBZGRyZXNzMSBjb250cm9sICovCisjZGVmaW5lIFBBX0RBUjEgICAgICAgICAoUEFfQkNSKzB4MDY0NikgLyogU2VyaWFsIERhdGExIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVkVSUkVHICAgICAgIChQQV9CQ1IrMHgwNzAwKSAvKiBGUEdBIFZlcnNpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEFfUE9GRiAgICAgICAgIChQQV9CQ1IrMHgwODAwKSAvKiBTeXN0ZW0gUG93ZXIgT2ZmIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfUE1SICAgICAgICAgIChQQV9CQ1IrMHgwOTAwKSAvKiAgKi8KKworI2RlZmluZSBQQV9BWDg4Nzk2TCAgICAgMHhhNDEwMDQwMCAgICAgIC8qIEFYODg3OTZMIEFyZWEgKi8KKyNkZWZpbmUgUEFfU0MxNjAyQlNMQiAgIDB4YTYwMDAwMDAgICAgICAvKiBTQzE2MDJCU0xCIEFyZWEgKi8KKyNkZWZpbmUgUEFfSURFX09GRlNFVCAgIDB4MWYwICAgICAgICAgICAvKiBDRiBJREUgT2Zmc2V0ICovCisjZGVmaW5lIEFYODg3OTZMX0lPX0JBU0UgICAgICAgIDB4MTAwMCAgLyogQVg4ODc5NkwgSU8gQmFzZSBBZGRyZXNzICovCisKKyNkZWZpbmUgSVJMQ05UUjEgICAgICAgIChQQV9CQ1IgKyAwKSAgICAvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlcjEgKi8KKworI2RlZmluZSBJUlFfUENJU0xPVDEgICAgNjUgICAgICAgICAgICAgIC8qIFBDSSBTbG90ICMxIElSUSAqLworI2RlZmluZSBJUlFfUENJU0xPVDIgICAgNjYgICAgICAgICAgICAgIC8qIFBDSSBTbG90ICMyIElSUSAqLworI2RlZmluZSBJUlFfUENJU0xPVDMgICAgNjcgICAgICAgICAgICAgIC8qIFBDSSBTbG90ICMzIElSUSAqLworI2RlZmluZSBJUlFfUENJU0xPVDQgICAgNjggICAgICAgICAgICAgIC8qIFBDSSBTbG90ICM0IElSUSAqLworLy8gI2RlZmluZSBJUlFfQ0ZJTlNUICAgMCAgICAgICAgICAgICAgIC8qIENGIENhcmQgSW5zZXJ0IElSUSAqLworI2RlZmluZSBJUlFfVFAgICAgICAgICAgMiAgICAgICAgICAgICAgIC8qIFRvdWNoIFBhbmVsIElSUSAqLworI2RlZmluZSBJUlFfU0NJMSAgICAgICAgMyAgICAgICAgICAgICAgIC8qIFNDSTEgSVJRICovCisjZGVmaW5lIElSUV9TQ0kwICAgICAgICA0ICAgICAgICAgICAgICAgLyogU0NJMCBJUlEgKi8KKyNkZWZpbmUgSVJRXzJTRVJJQUwgICAgIDUgICAgICAgICAgICAgICAvKiBTZXJpYWwgSVJRICovCisjZGVmaW5lIElSUV9SVEMgICAgICAgICA2ICAgICAgICAgICAgICAgLyogUlRDIEEgLyBCIElSUSAqLworI2RlZmluZSBJUlFfRVhURU5USU9ONiAgNyAgICAgICAgICAgICAgIC8qIEVYVDZuIElSUSAqLworI2RlZmluZSBJUlFfRVhURU5USU9ONSAgOCAgICAgICAgICAgICAgIC8qIEVYVDVuIElSUSAqLworI2RlZmluZSBJUlFfRVhURU5USU9ONCAgOSAgICAgICAgICAgICAgIC8qIEVYVDRuIElSUSAqLworI2RlZmluZSBJUlFfRVhURU5USU9OMiAgMTAgICAgICAgICAgICAgIC8qIEVYVDJuIElSUSAqLworI2RlZmluZSBJUlFfRVhURU5USU9OMSAgMTEgICAgICAgICAgICAgIC8qIEVYVDFuIElSUSAqLworI2RlZmluZSBJUlFfT05FVEggICAgICAgMTMgICAgICAgICAgICAgIC8qIE9uIGJvYXJkIEV0aGVybmV0IElSUSAqLworI2RlZmluZSBJUlFfUFNXICAgICAgICAgMTQgICAgICAgICAgICAgIC8qIFB1c2ggU3dpdGNoIElSUSAqLworCisjZWxzZSAvKiBSNzc4MFJQICovCisKKyNkZWZpbmUgUEFfQkNSCQkweGE1MDAwMDAwCS8qIEZQR0EgKi8KKyNkZWZpbmUJUEFfSVJMTVNLCShQQV9CQ1IrMHgwMDAwKQkvKiBJbnRlcnJ1cHQgTWFzayBjb250cm9sICovCisjZGVmaW5lIFBBX0lSTE1PTgkoUEFfQkNSKzB4MDAwMikJLyogSW50ZXJydXB0IFN0YXR1cyBjb250cm9sICovCisjZGVmaW5lCVBBX1NEUE9XCShQQV9CQ1IrMHgwMDA0KQkvKiBTRCBQb3dlciBjb250cm9sICovCisjZGVmaW5lCVBBX1JTVENUTAkoUEFfQkNSKzB4MDAwNikJLyogRGV2aWNlIFJlc2V0IGNvbnRyb2wgKi8KKyNkZWZpbmUJUEFfUENJQkQJKFBBX0JDUisweDAwMDgpCS8qIFBDSSBCb2FyZCBkZXRlY3QgY29udHJvbCAqLworI2RlZmluZQlQQV9QQ0lDRAkoUEFfQkNSKzB4MDAwYSkJLyogUENJIENvbmVjdG9yIGRldGVjdCBjb250cm9sICovCisjZGVmaW5lCVBBX1pJR0lPMQkoUEFfQkNSKzB4MDAwYykJLyogWmlnYmVlIElPIGNvbnRyb2wgMSAqLworI2RlZmluZQlQQV9aSUdJTzIJKFBBX0JDUisweDAwMGUpCS8qIFppZ2JlZSBJTyBjb250cm9sIDIgKi8KKyNkZWZpbmUJUEFfWklHSU8zCShQQV9CQ1IrMHgwMDEwKQkvKiBaaWdiZWUgSU8gY29udHJvbCAzICovCisjZGVmaW5lCVBBX1pJR0lPNAkoUEFfQkNSKzB4MDAxMikJLyogWmlnYmVlIElPIGNvbnRyb2wgNCAqLworI2RlZmluZQlQQV9JVkRSTU9OCShQQV9CQ1IrMHgwMDE0KQkvKiBpVkRSIE1vbml0ZXIgY29udHJvbCAqLworI2RlZmluZQlQQV9JVkRSQ1RMCShQQV9CQ1IrMHgwMDE2KQkvKiBpVkRSIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfT0JMRUQJKFBBX0JDUisweDAwMTgpCS8qIE9uIEJvYXJkIExFRCBjb250cm9sICovCisjZGVmaW5lIFBBX09CU1cJCShQQV9CQ1IrMHgwMDFhKQkvKiBPbiBCb2FyZCBTd2l0Y2ggY29udHJvbCAqLworI2RlZmluZSBQQV9BVURJT1NFTAkoUEFfQkNSKzB4MDAxYykJLyogU291bmQgSW50ZXJmYWNlIFNlbGVjdCBjb250cm9sICovCisjZGVmaW5lIFBBX0VYVFBMUgkoUEFfQkNSKzB4MDAxZSkJLyogRXh0ZW50aW9uIFBpbiBQb2xhcml0eSBjb250cm9sICovCisjZGVmaW5lIFBBX1RQQ1RMCShQQV9CQ1IrMHgwMTAwKQkvKiBUb3VjaCBQYW5lbCBBY2Nlc3MgY29udHJvbCAqLworI2RlZmluZSBQQV9UUERDS0NUTAkoUEFfQkNSKzB4MDEwMikJLyogVG91Y2ggUGFuZWwgQWNjZXNzIGRhdGEgY29udHJvbCAqLworI2RlZmluZSBQQV9UUENUTENMUgkoUEFfQkNSKzB4MDEwNCkJLyogVG91Y2ggUGFuZWwgQWNjZXNzIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVFBYUE9TCShQQV9CQ1IrMHgwMTA2KQkvKiBUb3VjaCBQYW5lbCBYIHBvc2l0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVFBZUE9TCShQQV9CQ1IrMHgwMTA4KQkvKiBUb3VjaCBQYW5lbCBZIHBvc2l0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfREJERVQJKFBBX0JDUisweDAyMDApCS8qIERlYnVnIEJvYXJkIGRldGVjdCBjb250cm9sICovCisjZGVmaW5lIFBBX0RCRElTUENUTAkoUEFfQkNSKzB4MDIwMikJLyogRGVidWcgQm9hcmQgRG90IHRpbWluZyBjb250cm9sICovCisjZGVmaW5lIFBBX0RCU1cJCShQQV9CQ1IrMHgwMjA0KQkvKiBEZWJ1ZyBCb2FyZCBTd2l0Y2ggY29udHJvbCAqLworI2RlZmluZSBQQV9DRkNUTAkoUEFfQkNSKzB4MDMwMCkJLyogQ0YgVGltaW5nIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQ0ZQT1cJKFBBX0JDUisweDAzMDIpCS8qIENGIFBvd2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQ0ZDRElOVENMUgkoUEFfQkNSKzB4MDMwNCkJLyogQ0YgSW5zZXJ0IEludGVycnVwdCBjbGVhciAqLworI2RlZmluZSBQQV9TQ1NNUgkoUEFfQkNSKzB4MDQwMCkJLyogU0NJRiBTZXJpYWwgbW9kZSBjb250cm9sICovCisjZGVmaW5lIFBBX1NDQlJSCShQQV9CQ1IrMHgwNDAyKQkvKiBTQ0lGIEJpdCByYXRlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NTQ1IJKFBBX0JDUisweDA0MDQpCS8qIFNDSUYgU2VyaWFsIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NGRFRSCShQQV9CQ1IrMHgwNDA2KQkvKiBTQ0lGIFNlbmQgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRlNSCShQQV9CQ1IrMHgwNDA4KQkvKiBTQ0lGIFNlcmlhbCBzdGF0dXMgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZSRFIJKFBBX0JDUisweDA0MGEpCS8qIFNDSUYgUmVjZWl2ZSBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NGQ1IJKFBBX0JDUisweDA0MGMpCS8qIFNDSUYgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRkRSCShQQV9CQ1IrMHgwNDBlKQkvKiBTQ0lGIEZJRk8gZGF0YSBjb250cm9sICovCisjZGVmaW5lIFBBX1NDTFNSCShQQV9CQ1IrMHgwNDEyKQkvKiBTQ0lGIExpbmUgU3RhdHVzIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSUNDUgkJKFBBX0JDUisweDA1MDApCS8qIFNlcmlhbCBjb250cm9sICovCisjZGVmaW5lIFBBX1NBUgkJKFBBX0JDUisweDA1MDIpCS8qIFNlcmlhbCBTbGF2ZSBjb250cm9sICovCisjZGVmaW5lIFBBX01EUgkJKFBBX0JDUisweDA1MDQpCS8qIFNlcmlhbCBNb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQURSMQkJKFBBX0JDUisweDA1MDYpCS8qIFNlcmlhbCBBZGRyZXNzMSBjb250cm9sICovCisjZGVmaW5lIFBBX0RBUjEJCShQQV9CQ1IrMHgwNTQ2KQkvKiBTZXJpYWwgRGF0YTEgY29udHJvbCAqLworI2RlZmluZSBQQV9WRVJSRUcJKFBBX0JDUisweDA2MDApCS8qIEZQR0EgVmVyc2lvbiBSZWdpc3RlciAqLworCisjZGVmaW5lIFBBX0FYODg3OTZMCTB4YTU4MDA0MDAJLyogQVg4ODc5NkwgQXJlYSAqLworI2RlZmluZSBQQV9TQzE2MDJCU0xCCTB4YTYwMDAwMDAJLyogU0MxNjAyQlNMQiBBcmVhICovCisjZGVmaW5lIFBBX0lERV9PRkZTRVQJMHgxZjAJCS8qIENGIElERSBPZmZzZXQgKi8KKyNkZWZpbmUgQVg4ODc5NkxfSU9fQkFTRQkweDEwMDAJLyogQVg4ODc5NkwgSU8gQmFzZSBBZGRyZXNzICovCisKKyNkZWZpbmUgSVJMQ05UUjEJKFBBX0JDUiArIDApCS8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyMSAqLworCisjZGVmaW5lIElSUV9QQ0lTTE9UMQkwCQkvKiBQQ0kgU2xvdCAjMSBJUlEgKi8KKyNkZWZpbmUgSVJRX1BDSVNMT1QyCTEJCS8qIFBDSSBTbG90ICMyIElSUSAqLworI2RlZmluZSBJUlFfUENJU0xPVDMJMgkJLyogUENJIFNsb3QgIzMgSVJRICovCisjZGVmaW5lIElSUV9QQ0lTTE9UNAkzCQkvKiBQQ0kgU2xvdCAjNCBJUlEgKi8KKyNkZWZpbmUgSVJRX0NGSU5TVAk1CQkvKiBDRiBDYXJkIEluc2VydCBJUlEgKi8KKyNkZWZpbmUgSVJRX002NjU5Ngk2CQkvKiBNNjY1OTYgSVJRICovCisjZGVmaW5lIElSUV9TRENBUkQJNwkJLyogU0QgQ2FyZCBJUlEgKi8KKyNkZWZpbmUgSVJRX1RVQ0hQQU5FTAk4CQkvKiBUb3VjaCBQYW5lbCBJUlEgKi8KKyNkZWZpbmUgSVJRX1NDSQkJOQkJLyogU0NJIElSUSAqLworI2RlZmluZSBJUlFfMlNFUklBTAkxMAkJLyogU2VyaWFsIElSUSAqLworI2RlZmluZQlJUlFfRVhURU5USU9OCTExCQkvKiBFWFRuIElSUSAqLworI2RlZmluZSBJUlFfT05FVEgJMTIJCS8qIE9uIGJvYXJkIEV0aGVybmV0IElSUSAqLworI2RlZmluZSBJUlFfUFNXCQkxMwkJLyogUHVzaCBTd2l0Y2ggSVJRICovCisjZGVmaW5lIElSUV9aSUdCRUUJMTQJCS8qIFppZ2diZWUgSU8gSVJRICovCisKKyNlbmRpZiAgLyogQ09ORklHX1NIX1I3NzgwTVAgKi8KKworI2RlZmluZSBfX0lPX1BSRUZJWAlyNzc4MHJwCisjaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KKworI2VuZGlmICAvKiBfX0FTTV9TSF9SRU5FU0FTX1I3NzgwUlAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3I3NzgwcnAvaWRlLmggYi9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL2lkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWVkNzhlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL3I3NzgwcnAvaWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfUjc3ODBSUF9JREVfSAotI2RlZmluZSBfX0FTTV9TSF9SNzc4MFJQX0lERV9ICi0KLS8qIE5vdGhpbmcgdG8gc2VlIGhlcmUuLiAqLwotI2luY2x1ZGUgPGFzbS9tYWNoL3I3NzgwcnAuaD4KLQotI2VuZGlmIC8qIF9fQVNNX1NIX1I3NzgwUlBfSURFX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcjc3ODBycC9yNzc4MHJwLmggYi9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL3I3NzgwcnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1ZDlkYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL3I3NzgwcnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1NIX1JFTkVTQVNfUjc3ODBSUF9ICi0jZGVmaW5lIF9fQVNNX1NIX1JFTkVTQVNfUjc3ODBSUF9ICi0KLS8qCi0gKiBsaW51eC9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgotICoKLSAqIFJlbmVzYXMgU29sdXRpb25zIEhpZ2hsYW5kZXIgUjc3ODBSUCBzdXBwb3J0Ci0gKi8KLQotLyogQm94IHNwZWNpZmljIGFkZHJlc3Nlcy4gICovCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfUjc3ODBNUCkKLSNkZWZpbmUgUEFfQkNSICAgICAgICAgIDB4YTQwMDAwMDAgICAgICAvKiBGUEdBICovCi0jZGVmaW5lIFBBX0lSTE1TSyAgICAgICAoUEFfQkNSKzB4MDAwMCkgLyogSW50ZXJydXB0IE1hc2sgY29udHJvbCAqLwotI2RlZmluZSBQQV9JUkxNT04gICAgICAgKFBBX0JDUisweDAwMDIpIC8qIEludGVycnVwdCBTdGF0dXMgY29udHJvbCAqLwotI2RlZmluZSBQQV9JUkxQUkkxICAgICAgKFBBX0JDUisweDAwMDQpIC8qIEludGVycnVwdCBQcmlvcnR5IDEgKi8KLSNkZWZpbmUgUEFfSVJMUFJJMiAgICAgIChQQV9CQ1IrMHgwMDA2KSAvKiBJbnRlcnJ1cHQgUHJpb3J0eSAyICovCi0jZGVmaW5lIFBBX0lSTFBSSTMgICAgICAoUEFfQkNSKzB4MDAwOCkgLyogSW50ZXJydXB0IFByaW9ydHkgMyAqLwotI2RlZmluZSBQQV9JUkxQUkk0ICAgICAgKFBBX0JDUisweDAwMGEpIC8qIEludGVycnVwdCBQcmlvcnR5IDQgKi8KLSNkZWZpbmUgUEFfUlNUQ1RMICAgICAgIChQQV9CQ1IrMHgwMDBjKSAvKiBSZXNldCBDb250cm9sICovCi0jZGVmaW5lIFBBX1BDSUJEICAgICAgICAoUEFfQkNSKzB4MDAwZSkgLyogUENJIEJvYXJkIGRldGVjdCBjb250cm9sICovCi0jZGVmaW5lIFBBX1BDSUNEICAgICAgICAoUEFfQkNSKzB4MDAxMCkgLyogUENJIENvbmVjdG9yIGRldGVjdCBjb250cm9sICovCi0jZGVmaW5lIFBBX0VYVEdJTyAgICAgICAoUEFfQkNSKzB4MDAxNikgLyogRXh0ZW5zaW9uIEdQSU8gQ29udHJvbCAqLwotI2RlZmluZSBQQV9JVkRSTU9OICAgICAgKFBBX0JDUisweDAwMTgpIC8qIGlWRFIgTW9uaXRlciBjb250cm9sICovCi0jZGVmaW5lIFBBX0lWRFJDVEwgICAgICAoUEFfQkNSKzB4MDAxYSkgLyogaVZEUiBjb250cm9sICovCi0jZGVmaW5lIFBBX09CTEVEICAgICAgICAoUEFfQkNSKzB4MDAxYykgLyogT24gQm9hcmQgTEVEIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfT0JTVyAgICAgICAgIChQQV9CQ1IrMHgwMDFlKSAvKiBPbiBCb2FyZCBTd2l0Y2ggY29udHJvbCAqLwotI2RlZmluZSBQQV9BVURJT1NFTCAgICAgKFBBX0JDUisweDAwMjApIC8qIFNvdW5kIEludGVyZmFjZSBTZWxlY3QgY29udHJvbCAqLwotI2RlZmluZSBQQV9FWFRQTFIgICAgICAgKFBBX0JDUisweDAwMWUpIC8qIEV4dGVudGlvbiBQaW4gUG9sYXJpdHkgY29udHJvbCAqLwotI2RlZmluZSBQQV9UUENUTCAgICAgICAgKFBBX0JDUisweDAxMDApIC8qIFRvdWNoIFBhbmVsIEFjY2VzcyBjb250cm9sICovCi0jZGVmaW5lIFBBX1RQRENLQ1RMICAgICAoUEFfQkNSKzB4MDEwMikgLyogVG91Y2ggUGFuZWwgQWNjZXNzIGRhdGEgY29udHJvbCAqLwotI2RlZmluZSBQQV9UUENUTENMUiAgICAgKFBBX0JDUisweDAxMDQpIC8qIFRvdWNoIFBhbmVsIEFjY2VzcyBjb250cm9sICovCi0jZGVmaW5lIFBBX1RQWFBPUyAgICAgICAoUEFfQkNSKzB4MDEwNikgLyogVG91Y2ggUGFuZWwgWCBwb3NpdGlvbiBjb250cm9sICovCi0jZGVmaW5lIFBBX1RQWVBPUyAgICAgICAoUEFfQkNSKzB4MDEwOCkgLyogVG91Y2ggUGFuZWwgWSBwb3NpdGlvbiBjb250cm9sICovCi0jZGVmaW5lIFBBX0RCU1cgICAgICAgICAoUEFfQkNSKzB4MDIwMCkgLyogRGVidWcgQm9hcmQgU3dpdGNoIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfQ0ZDVEwgICAgICAgIChQQV9CQ1IrMHgwMzAwKSAvKiBDRiBUaW1pbmcgY29udHJvbCAqLwotI2RlZmluZSBQQV9DRlBPVyAgICAgICAgKFBBX0JDUisweDAzMDIpIC8qIENGIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfQ0ZDRElOVENMUiAgIChQQV9CQ1IrMHgwMzA0KSAvKiBDRiBJbnNlcnQgSW50ZXJydXB0IGNsZWFyICovCi0jZGVmaW5lIFBBX1NDU01SMCAgICAgICAoUEFfQkNSKzB4MDQwMCkgLyogU0NJRjAgU2VyaWFsIG1vZGUgY29udHJvbCAqLwotI2RlZmluZSBQQV9TQ0JSUjAgICAgICAgKFBBX0JDUisweDA0MDQpIC8qIFNDSUYwIEJpdCByYXRlIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NTQ1IwICAgICAgIChQQV9CQ1IrMHgwNDA4KSAvKiBTQ0lGMCBTZXJpYWwgY29udHJvbCAqLwotI2RlZmluZSBQQV9TQ0ZURFIwICAgICAgKFBBX0JDUisweDA0MGMpIC8qIFNDSUYwIFNlbmQgRklGTyBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDRlNSMCAgICAgICAoUEFfQkNSKzB4MDQxMCkgLyogU0NJRjAgU2VyaWFsIHN0YXR1cyBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDRlJEUjAgICAgICAoUEFfQkNSKzB4MDQxNCkgLyogU0NJRjAgUmVjZWl2ZSBGSUZPIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NGQ1IwICAgICAgIChQQV9CQ1IrMHgwNDE4KSAvKiBTQ0lGMCBGSUZPIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NURkRSMCAgICAgIChQQV9CQ1IrMHgwNDFjKSAvKiBTQ0lGMCBTZW5kIEZJRk8gZGF0YSBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDUkZEUjAgICAgICAoUEFfQkNSKzB4MDQyMCkgLyogU0NJRjAgUmVjZWl2ZSBGSUZPIGRhdGEgY29udHJvbCAqLwotI2RlZmluZSBQQV9TQ1NQVFIwICAgICAgKFBBX0JDUisweDA0MjQpIC8qIFNDSUYwIFNlcmlhbCBQb3J0IGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NMU1IwICAgICAgIChQQV9CQ1IrMHgwNDI4KSAvKiBTQ0lGMCBMaW5lIFN0YXR1cyBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDUkVSMCAgICAgICAoUEFfQkNSKzB4MDQyYykgLyogU0NJRjAgU2VyaWFsIEVycm9yIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NTTVIxICAgICAgIChQQV9CQ1IrMHgwNTAwKSAvKiBTQ0lGMSBTZXJpYWwgbW9kZSBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDQlJSMSAgICAgICAoUEFfQkNSKzB4MDUwNCkgLyogU0NJRjEgQml0IHJhdGUgY29udHJvbCAqLwotI2RlZmluZSBQQV9TQ1NDUjEgICAgICAgKFBBX0JDUisweDA1MDgpIC8qIFNDSUYxIFNlcmlhbCBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDRlREUjEgICAgICAoUEFfQkNSKzB4MDUwYykgLyogU0NJRjEgU2VuZCBGSUZPIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NGU1IxICAgICAgIChQQV9CQ1IrMHgwNTEwKSAvKiBTQ0lGMSBTZXJpYWwgc3RhdHVzIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NGUkRSMSAgICAgIChQQV9CQ1IrMHgwNTE0KSAvKiBTQ0lGMSBSZWNlaXZlIEZJRk8gY29udHJvbCAqLwotI2RlZmluZSBQQV9TQ0ZDUjEgICAgICAgKFBBX0JDUisweDA1MTgpIC8qIFNDSUYxIEZJRk8gY29udHJvbCAqLwotI2RlZmluZSBQQV9TQ1RGRFIxICAgICAgKFBBX0JDUisweDA1MWMpIC8qIFNDSUYxIFNlbmQgRklGTyBkYXRhIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NSRkRSMSAgICAgIChQQV9CQ1IrMHgwNTIwKSAvKiBTQ0lGMSBSZWNlaXZlIEZJRk8gZGF0YSBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDU1BUUjEgICAgICAoUEFfQkNSKzB4MDUyNCkgLyogU0NJRjEgU2VyaWFsIFBvcnQgY29udHJvbCAqLwotI2RlZmluZSBQQV9TQ0xTUjEgICAgICAgKFBBX0JDUisweDA1MjgpIC8qIFNDSUYxIExpbmUgU3RhdHVzIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NSRVIxICAgICAgIChQQV9CQ1IrMHgwNTJjKSAvKiBTQ0lGMSBTZXJpYWwgRXJyb3IgY29udHJvbCAqLwotI2RlZmluZSBQQV9JQ0NSICAgICAgICAgKFBBX0JDUisweDA2MDApIC8qIFNlcmlhbCBjb250cm9sICovCi0jZGVmaW5lIFBBX1NBUiAgICAgICAgICAoUEFfQkNSKzB4MDYwMikgLyogU2VyaWFsIFNsYXZlIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfTURSICAgICAgICAgIChQQV9CQ1IrMHgwNjA0KSAvKiBTZXJpYWwgTW9kZSBjb250cm9sICovCi0jZGVmaW5lIFBBX0FEUjEgICAgICAgICAoUEFfQkNSKzB4MDYwNikgLyogU2VyaWFsIEFkZHJlc3MxIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfREFSMSAgICAgICAgIChQQV9CQ1IrMHgwNjQ2KSAvKiBTZXJpYWwgRGF0YTEgY29udHJvbCAqLwotI2RlZmluZSBQQV9WRVJSRUcgICAgICAgKFBBX0JDUisweDA3MDApIC8qIEZQR0EgVmVyc2lvbiBSZWdpc3RlciAqLwotI2RlZmluZSBQQV9QT0ZGICAgICAgICAgKFBBX0JDUisweDA4MDApIC8qIFN5c3RlbSBQb3dlciBPZmYgY29udHJvbCAqLwotI2RlZmluZSBQQV9QTVIgICAgICAgICAgKFBBX0JDUisweDA5MDApIC8qICAqLwotCi0jZGVmaW5lIFBBX0FYODg3OTZMICAgICAweGE0MTAwNDAwICAgICAgLyogQVg4ODc5NkwgQXJlYSAqLwotI2RlZmluZSBQQV9TQzE2MDJCU0xCICAgMHhhNjAwMDAwMCAgICAgIC8qIFNDMTYwMkJTTEIgQXJlYSAqLwotI2RlZmluZSBQQV9BUkVBNV9JTyAgICAgMHhiNDAwMDAwMCAgICAgIC8qIEFyZWEgNSBJTyBNZW1vcnkgKi8KLSNkZWZpbmUgUEFfQVJFQTZfSU8gICAgIDB4YjgwMDAwMDAgICAgICAvKiBBcmVhIDYgSU8gTWVtb3J5ICovCi0jZGVmaW5lIFBBX0lERV9PRkZTRVQgICAweDFmMCAgICAgICAgICAgLyogQ0YgSURFIE9mZnNldCAqLwotI2RlZmluZSBBWDg4Nzk2TF9JT19CQVNFICAgICAgICAweDEwMDAgIC8qIEFYODg3OTZMIElPIEJhc2UgQWRkcmVzcyAqLwotCi0jZGVmaW5lIElSTENOVFIxICAgICAgICAoUEFfQkNSICsgMCkgICAgLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIxICovCi0KLSNkZWZpbmUgSVJRX1BDSVNMT1QxICAgIDY1ICAgICAgICAgICAgICAvKiBQQ0kgU2xvdCAjMSBJUlEgKi8KLSNkZWZpbmUgSVJRX1BDSVNMT1QyICAgIDY2ICAgICAgICAgICAgICAvKiBQQ0kgU2xvdCAjMiBJUlEgKi8KLSNkZWZpbmUgSVJRX1BDSVNMT1QzICAgIDY3ICAgICAgICAgICAgICAvKiBQQ0kgU2xvdCAjMyBJUlEgKi8KLSNkZWZpbmUgSVJRX1BDSVNMT1Q0ICAgIDY4ICAgICAgICAgICAgICAvKiBQQ0kgU2xvdCAjNCBJUlEgKi8KLSNkZWZpbmUgSVJRX0NGQ0FSRCAgICAgIDEgICAgICAgICAgICAgICAvKiBDRiBDYXJkIElSUSAqLwotLy8gI2RlZmluZSBJUlFfQ0ZJTlNUICAgMCAgICAgICAgICAgICAgIC8qIENGIENhcmQgSW5zZXJ0IElSUSAqLwotI2RlZmluZSBJUlFfVFAgICAgICAgICAgMiAgICAgICAgICAgICAgIC8qIFRvdWNoIFBhbmVsIElSUSAqLwotI2RlZmluZSBJUlFfU0NJMSAgICAgICAgMyAgICAgICAgICAgICAgIC8qIFNDSTEgSVJRICovCi0jZGVmaW5lIElSUV9TQ0kwICAgICAgICA0ICAgICAgICAgICAgICAgLyogU0NJMCBJUlEgKi8KLSNkZWZpbmUgSVJRXzJTRVJJQUwgICAgIDUgICAgICAgICAgICAgICAvKiBTZXJpYWwgSVJRICovCi0jZGVmaW5lIElSUV9SVEMgICAgICAgICA2ICAgICAgICAgICAgICAgLyogUlRDIEEgLyBCIElSUSAqLwotI2RlZmluZSBJUlFfRVhURU5USU9ONiAgNyAgICAgICAgICAgICAgIC8qIEVYVDZuIElSUSAqLwotI2RlZmluZSBJUlFfRVhURU5USU9ONSAgOCAgICAgICAgICAgICAgIC8qIEVYVDVuIElSUSAqLwotI2RlZmluZSBJUlFfRVhURU5USU9ONCAgOSAgICAgICAgICAgICAgIC8qIEVYVDRuIElSUSAqLwotI2RlZmluZSBJUlFfRVhURU5USU9OMiAgMTAgICAgICAgICAgICAgIC8qIEVYVDJuIElSUSAqLwotI2RlZmluZSBJUlFfRVhURU5USU9OMSAgMTEgICAgICAgICAgICAgIC8qIEVYVDFuIElSUSAqLwotI2RlZmluZSBJUlFfT05FVEggICAgICAgMTMgICAgICAgICAgICAgIC8qIE9uIGJvYXJkIEV0aGVybmV0IElSUSAqLwotI2RlZmluZSBJUlFfUFNXICAgICAgICAgMTQgICAgICAgICAgICAgIC8qIFB1c2ggU3dpdGNoIElSUSAqLwotCi0jZWxzZSAvKiBSNzc4MFJQICovCi0KLSNkZWZpbmUgUEFfQkNSCQkweGE1MDAwMDAwCS8qIEZQR0EgKi8KLSNkZWZpbmUJUEFfSVJMTVNLCShQQV9CQ1IrMHgwMDAwKQkvKiBJbnRlcnJ1cHQgTWFzayBjb250cm9sICovCi0jZGVmaW5lIFBBX0lSTE1PTgkoUEFfQkNSKzB4MDAwMikJLyogSW50ZXJydXB0IFN0YXR1cyBjb250cm9sICovCi0jZGVmaW5lCVBBX1NEUE9XCShQQV9CQ1IrMHgwMDA0KQkvKiBTRCBQb3dlciBjb250cm9sICovCi0jZGVmaW5lCVBBX1JTVENUTAkoUEFfQkNSKzB4MDAwNikJLyogRGV2aWNlIFJlc2V0IGNvbnRyb2wgKi8KLSNkZWZpbmUJUEFfUENJQkQJKFBBX0JDUisweDAwMDgpCS8qIFBDSSBCb2FyZCBkZXRlY3QgY29udHJvbCAqLwotI2RlZmluZQlQQV9QQ0lDRAkoUEFfQkNSKzB4MDAwYSkJLyogUENJIENvbmVjdG9yIGRldGVjdCBjb250cm9sICovCi0jZGVmaW5lCVBBX1pJR0lPMQkoUEFfQkNSKzB4MDAwYykJLyogWmlnYmVlIElPIGNvbnRyb2wgMSAqLwotI2RlZmluZQlQQV9aSUdJTzIJKFBBX0JDUisweDAwMGUpCS8qIFppZ2JlZSBJTyBjb250cm9sIDIgKi8KLSNkZWZpbmUJUEFfWklHSU8zCShQQV9CQ1IrMHgwMDEwKQkvKiBaaWdiZWUgSU8gY29udHJvbCAzICovCi0jZGVmaW5lCVBBX1pJR0lPNAkoUEFfQkNSKzB4MDAxMikJLyogWmlnYmVlIElPIGNvbnRyb2wgNCAqLwotI2RlZmluZQlQQV9JVkRSTU9OCShQQV9CQ1IrMHgwMDE0KQkvKiBpVkRSIE1vbml0ZXIgY29udHJvbCAqLwotI2RlZmluZQlQQV9JVkRSQ1RMCShQQV9CQ1IrMHgwMDE2KQkvKiBpVkRSIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfT0JMRUQJKFBBX0JDUisweDAwMTgpCS8qIE9uIEJvYXJkIExFRCBjb250cm9sICovCi0jZGVmaW5lIFBBX09CU1cJCShQQV9CQ1IrMHgwMDFhKQkvKiBPbiBCb2FyZCBTd2l0Y2ggY29udHJvbCAqLwotI2RlZmluZSBQQV9BVURJT1NFTAkoUEFfQkNSKzB4MDAxYykJLyogU291bmQgSW50ZXJmYWNlIFNlbGVjdCBjb250cm9sICovCi0jZGVmaW5lIFBBX0VYVFBMUgkoUEFfQkNSKzB4MDAxZSkJLyogRXh0ZW50aW9uIFBpbiBQb2xhcml0eSBjb250cm9sICovCi0jZGVmaW5lIFBBX1RQQ1RMCShQQV9CQ1IrMHgwMTAwKQkvKiBUb3VjaCBQYW5lbCBBY2Nlc3MgY29udHJvbCAqLwotI2RlZmluZSBQQV9UUERDS0NUTAkoUEFfQkNSKzB4MDEwMikJLyogVG91Y2ggUGFuZWwgQWNjZXNzIGRhdGEgY29udHJvbCAqLwotI2RlZmluZSBQQV9UUENUTENMUgkoUEFfQkNSKzB4MDEwNCkJLyogVG91Y2ggUGFuZWwgQWNjZXNzIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfVFBYUE9TCShQQV9CQ1IrMHgwMTA2KQkvKiBUb3VjaCBQYW5lbCBYIHBvc2l0aW9uIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfVFBZUE9TCShQQV9CQ1IrMHgwMTA4KQkvKiBUb3VjaCBQYW5lbCBZIHBvc2l0aW9uIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfREJERVQJKFBBX0JDUisweDAyMDApCS8qIERlYnVnIEJvYXJkIGRldGVjdCBjb250cm9sICovCi0jZGVmaW5lIFBBX0RCRElTUENUTAkoUEFfQkNSKzB4MDIwMikJLyogRGVidWcgQm9hcmQgRG90IHRpbWluZyBjb250cm9sICovCi0jZGVmaW5lIFBBX0RCU1cJCShQQV9CQ1IrMHgwMjA0KQkvKiBEZWJ1ZyBCb2FyZCBTd2l0Y2ggY29udHJvbCAqLwotI2RlZmluZSBQQV9DRkNUTAkoUEFfQkNSKzB4MDMwMCkJLyogQ0YgVGltaW5nIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfQ0ZQT1cJKFBBX0JDUisweDAzMDIpCS8qIENGIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfQ0ZDRElOVENMUgkoUEFfQkNSKzB4MDMwNCkJLyogQ0YgSW5zZXJ0IEludGVycnVwdCBjbGVhciAqLwotI2RlZmluZSBQQV9TQ1NNUgkoUEFfQkNSKzB4MDQwMCkJLyogU0NJRiBTZXJpYWwgbW9kZSBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDQlJSCShQQV9CQ1IrMHgwNDAyKQkvKiBTQ0lGIEJpdCByYXRlIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NTQ1IJKFBBX0JDUisweDA0MDQpCS8qIFNDSUYgU2VyaWFsIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NGRFRSCShQQV9CQ1IrMHgwNDA2KQkvKiBTQ0lGIFNlbmQgRklGTyBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDRlNSCShQQV9CQ1IrMHgwNDA4KQkvKiBTQ0lGIFNlcmlhbCBzdGF0dXMgY29udHJvbCAqLwotI2RlZmluZSBQQV9TQ0ZSRFIJKFBBX0JDUisweDA0MGEpCS8qIFNDSUYgUmVjZWl2ZSBGSUZPIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfU0NGQ1IJKFBBX0JDUisweDA0MGMpCS8qIFNDSUYgRklGTyBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDRkRSCShQQV9CQ1IrMHgwNDBlKQkvKiBTQ0lGIEZJRk8gZGF0YSBjb250cm9sICovCi0jZGVmaW5lIFBBX1NDTFNSCShQQV9CQ1IrMHgwNDEyKQkvKiBTQ0lGIExpbmUgU3RhdHVzIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfSUNDUgkJKFBBX0JDUisweDA1MDApCS8qIFNlcmlhbCBjb250cm9sICovCi0jZGVmaW5lIFBBX1NBUgkJKFBBX0JDUisweDA1MDIpCS8qIFNlcmlhbCBTbGF2ZSBjb250cm9sICovCi0jZGVmaW5lIFBBX01EUgkJKFBBX0JDUisweDA1MDQpCS8qIFNlcmlhbCBNb2RlIGNvbnRyb2wgKi8KLSNkZWZpbmUgUEFfQURSMQkJKFBBX0JDUisweDA1MDYpCS8qIFNlcmlhbCBBZGRyZXNzMSBjb250cm9sICovCi0jZGVmaW5lIFBBX0RBUjEJCShQQV9CQ1IrMHgwNTQ2KQkvKiBTZXJpYWwgRGF0YTEgY29udHJvbCAqLwotI2RlZmluZSBQQV9WRVJSRUcJKFBBX0JDUisweDA2MDApCS8qIEZQR0EgVmVyc2lvbiBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFBBX0FYODg3OTZMCTB4YTU4MDA0MDAJLyogQVg4ODc5NkwgQXJlYSAqLwotI2RlZmluZSBQQV9TQzE2MDJCU0xCCTB4YTYwMDAwMDAJLyogU0MxNjAyQlNMQiBBcmVhICovCi0jZGVmaW5lIFBBX0FSRUE1X0lPCTB4YjQwMDAwMDAJLyogQXJlYSA1IElPIE1lbW9yeSAqLwotI2RlZmluZSBQQV9BUkVBNl9JTwkweGI4MDAwMDAwCS8qIEFyZWEgNiBJTyBNZW1vcnkgKi8KLSNkZWZpbmUgUEFfSURFX09GRlNFVAkweDFmMAkJLyogQ0YgSURFIE9mZnNldCAqLwotI2RlZmluZSBBWDg4Nzk2TF9JT19CQVNFCTB4MTAwMAkvKiBBWDg4Nzk2TCBJTyBCYXNlIEFkZHJlc3MgKi8KLQotI2RlZmluZSBJUkxDTlRSMQkoUEFfQkNSICsgMCkJLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIxICovCi0KLSNkZWZpbmUgSVJRX1BDSVNMT1QxCTAJCS8qIFBDSSBTbG90ICMxIElSUSAqLwotI2RlZmluZSBJUlFfUENJU0xPVDIJMQkJLyogUENJIFNsb3QgIzIgSVJRICovCi0jZGVmaW5lIElSUV9QQ0lTTE9UMwkyCQkvKiBQQ0kgU2xvdCAjMyBJUlEgKi8KLSNkZWZpbmUgSVJRX1BDSVNMT1Q0CTMJCS8qIFBDSSBTbG90ICM0IElSUSAqLwotI2RlZmluZSBJUlFfQ0ZDQVJECTQJCS8qIENGIENhcmQgSVJRICovCi0jZGVmaW5lIElSUV9DRklOU1QJNQkJLyogQ0YgQ2FyZCBJbnNlcnQgSVJRICovCi0jZGVmaW5lIElSUV9NNjY1OTYJNgkJLyogTTY2NTk2IElSUSAqLwotI2RlZmluZSBJUlFfU0RDQVJECTcJCS8qIFNEIENhcmQgSVJRICovCi0jZGVmaW5lIElSUV9UVUNIUEFORUwJOAkJLyogVG91Y2ggUGFuZWwgSVJRICovCi0jZGVmaW5lIElSUV9TQ0kJCTkJCS8qIFNDSSBJUlEgKi8KLSNkZWZpbmUgSVJRXzJTRVJJQUwJMTAJCS8qIFNlcmlhbCBJUlEgKi8KLSNkZWZpbmUJSVJRX0VYVEVOVElPTgkxMQkJLyogRVhUbiBJUlEgKi8KLSNkZWZpbmUgSVJRX09ORVRICTEyCQkvKiBPbiBib2FyZCBFdGhlcm5ldCBJUlEgKi8KLSNkZWZpbmUgSVJRX1BTVwkJMTMJCS8qIFB1c2ggU3dpdGNoIElSUSAqLwotI2RlZmluZSBJUlFfWklHQkVFCTE0CQkvKiBaaWdnYmVlIElPIElSUSAqLwotCi0jZW5kaWYgIC8qIENPTkZJR19TSF9SNzc4ME1QICovCi0KLSNkZWZpbmUgX19JT19QUkVGSVgJcjc3ODBycAotI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+Ci0KLSNlbmRpZiAgLyogX19BU01fU0hfUkVORVNBU19SNzc4MFJQICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9ydHM3NzUxcjJkL3J0czc3NTFyMmQuaCBiL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC9ydHM3NzUxcjJkLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC9pZGUuaCBiL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQvaWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNmY5NmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC9pZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSF9SVFM3NzUxUjJEX0lERV9ICi0jZGVmaW5lIF9fQVNNX1NIX1JUUzc3NTFSMkRfSURFX0gKLQotLyogTm90aGluZyB0byBzZWUgaGVyZS4uICovCi0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oPgotCi0jZW5kaWYgLyogX19BU01fU0hfUlRTNzc1MVIyRF9JREVfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9yd3NlbS5oIGIvaW5jbHVkZS9hc20tc2gvcndzZW0uaAppbmRleCA5ZDJhZWE1Li40OTMxYmE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9yd3NlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3J3c2VtLmgKQEAgLTI1LDExICsyNSwyMSBAQAogI2RlZmluZSBSV1NFTV9BQ1RJVkVfV1JJVEVfQklBUwkJKFJXU0VNX1dBSVRJTkdfQklBUyArIFJXU0VNX0FDVElWRV9CSUFTKQogCXNwaW5sb2NrX3QJCXdhaXRfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXdhaXRfbGlzdDsKKyNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQworCXN0cnVjdCBsb2NrZGVwX21hcAlkZXBfbWFwOworI2VuZGlmCiB9OwogCisjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKKyMgZGVmaW5lIF9fUldTRU1fREVQX01BUF9JTklUKGxvY2tuYW1lKSAsIC5kZXBfbWFwID0geyAubmFtZSA9ICNsb2NrbmFtZSB9CisjZWxzZQorIyBkZWZpbmUgX19SV1NFTV9ERVBfTUFQX0lOSVQobG9ja25hbWUpCisjZW5kaWYKKwogI2RlZmluZSBfX1JXU0VNX0lOSVRJQUxJWkVSKG5hbWUpIFwKIAl7IFJXU0VNX1VOTE9DS0VEX1ZBTFVFLCBTUElOX0xPQ0tfVU5MT0NLRUQsIFwKLQkgIExJU1RfSEVBRF9JTklUKChuYW1lKS53YWl0X2xpc3QpIH0KKwkgIExJU1RfSEVBRF9JTklUKChuYW1lKS53YWl0X2xpc3QpIFwKKwkgIF9fUldTRU1fREVQX01BUF9JTklUKG5hbWUpIH0KIAogI2RlZmluZSBERUNMQVJFX1JXU0VNKG5hbWUpCQlcCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBuYW1lID0gX19SV1NFTV9JTklUSUFMSVpFUihuYW1lKQpAQCAtMzksNiArNDksMTYgQEAKIGV4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlICpyd3NlbV93YWtlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSk7CiBleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSAqcndzZW1fZG93bmdyYWRlX3dha2Uoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKTsKIAorZXh0ZXJuIHZvaWQgX19pbml0X3J3c2VtKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSk7CisKKyNkZWZpbmUgaW5pdF9yd3NlbShzZW0pCQkJCVwKK2RvIHsJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBfX2tleTsJXAorCQkJCQkJXAorCV9faW5pdF9yd3NlbSgoc2VtKSwgI3NlbSwgJl9fa2V5KTsJXAorfSB3aGlsZSAoMCkKKwogc3RhdGljIGlubGluZSB2b2lkIGluaXRfcndzZW0oc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewogCXNlbS0+Y291bnQgPSBSV1NFTV9VTkxPQ0tFRF9WQUxVRTsKQEAgLTE0MSw2ICsxNjEsMTEgQEAKIAkJcndzZW1fZG93bmdyYWRlX3dha2Uoc2VtKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fZG93bl93cml0ZV9uZXN0ZWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtLCBpbnQgc3ViY2xhc3MpCit7CisJX19kb3duX3dyaXRlKHNlbSk7Cit9CisKIC8qCiAgKiBpbXBsZW1lbnQgZXhjaGFuZ2UgYW5kIGFkZCBmdW5jdGlvbmFsaXR5CiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NlNzIwNi5oIGIvaW5jbHVkZS9hc20tc2gvc2U3MjA2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4ZWI4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NlNzIwNi5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19BU01fU0hfU0U3MjA2X0gKKyNkZWZpbmUgX19BU01fU0hfU0U3MjA2X0gKKworI2RlZmluZSBQQV9TTVNDCQkweDMwMDAwMDAwCisjZGVmaW5lIFBBX01SU0hQQwkweDM0MDAwMDAwCisjZGVmaW5lIFBBX0xFRAkJMHgzMTQwMDAwMAorCit2b2lkIGluaXRfc2U3MjA2X0lSUSh2b2lkKTsKKworI2RlZmluZSBfX0lPX1BSRUZJWAlzZTcyMDYKKyNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgorCisjZW5kaWYgLyogX19BU01fU0hfU0U3MjA2X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NldHVwLmggYi9pbmNsdWRlL2FzbS1zaC9zZXR1cC5oCmluZGV4IDM0Y2E4YTcuLjE1ODNjNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2V0dXAuaApAQCAtMSwxMCArMSwxMiBAQAotI2lmZGVmIF9fS0VSTkVMX18KICNpZm5kZWYgX1NIX1NFVFVQX0gKICNkZWZpbmUgX1NIX1NFVFVQX0gKIAogI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRSAyNTYKIAorI2lmZGVmIF9fS0VSTkVMX18KKwogaW50IHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICopOwogCi0jZW5kaWYgLyogX1NIX1NFVFVQX0ggKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfU0hfU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2gwMy9pZGUuaCBiL2luY2x1ZGUvYXNtLXNoL3NoMDMvaWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWU5MmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2gwMy9pZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9TSF9TSDAzX0lERV9ICi0jZGVmaW5lIF9fQVNNX1NIX1NIMDNfSURFX0gKLQotI2RlZmluZSBJUlFfQ0ZDQVJECTgKLSNkZWZpbmUgSVJRX1BDTUNJQQk4Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9TSDAzX0lERV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zaG1pbi9zaG1pbi5oIGIvaW5jbHVkZS9hc20tc2gvc2htaW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvc2htaW4vc2htaW4uaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tc2gvc2htaW4uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1zaC9zeXN0ZW0uaAppbmRleCA2YzFmOGZkLi5iMWU0MmU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zeXN0ZW0uaApAQCAtNiw2ICs2LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiBQYXVsIE11bmR0CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKIC8qCkBAIC0xMzEsMTAzICsxMzIsNiBAQAogCiAjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7IHhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQogCi0vKiBJbnRlcnJ1cHQgQ29udHJvbCAqLwotI2lmZGVmIENPTkZJR19DUFVfSEFTX1NSX1JCCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YwlzciwgJTBcblx0IgotCQkJICAgICAiYW5kCSUxLCAlMFxuXHQiCi0JCQkgICAgICJzdGMJcjZfYmFuaywgJTFcblx0IgotCQkJICAgICAib3IJJTEsICUwXG5cdCIKLQkJCSAgICAgImxkYwklMCwgc3IiCi0JCQkgICAgIDogIj0mciIgKF9fZHVtbXkwKSwgIj1yIiAoX19kdW1teTEpCi0JCQkgICAgIDogIjEiICh+MHgwMDAwMDBmMCkKLQkJCSAgICAgOiAibWVtb3J5Iik7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2lycV9lbmFibGUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIF9fZHVtbXkwLCBfX2R1bW15MTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJInN0YwlzciwgJTBcblx0IgotCQkiYW5kCSUxLCAlMFxuXHQiCi0JCSJsZGMJJTAsIHNyXG5cdCIKLQkJOiAiPSZyIiAoX19kdW1teTApLCAiPXIiIChfX2R1bW15MSkKLQkJOiAiMSIgKH4weDAwMDAwMGYwKQotCQk6ICJtZW1vcnkiKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIF9fZHVtbXk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YwlzciwgJTBcblx0IgotCQkJICAgICAib3IJIzB4ZjAsICUwXG5cdCIKLQkJCSAgICAgImxkYwklMCwgc3IiCi0JCQkgICAgIDogIj0meiIgKF9fZHVtbXkpCi0JCQkgICAgIDogLyogbm8gaW5wdXRzICovCi0JCQkgICAgIDogIm1lbW9yeSIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JsX2JpdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzdGMJc3IsICUwXG5cdCIKLQkJCSAgICAgIm9yCSUyLCAlMFxuXHQiCi0JCQkgICAgICJhbmQJJTMsICUwXG5cdCIKLQkJCSAgICAgImxkYwklMCwgc3IiCi0JCQkgICAgIDogIj0mciIgKF9fZHVtbXkwKSwgIj1yIiAoX19kdW1teTEpCi0JCQkgICAgIDogInIiICgweDEwMDAwMDAwKSwgInIiICgweGZmZmZmZjBmKQotCQkJICAgICA6ICJtZW1vcnkiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2JsX2JpdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzdGMJc3IsICUwXG5cdCIKLQkJCSAgICAgImFuZAklMiwgJTBcblx0IgotCQkJICAgICAibGRjCSUwLCBzciIKLQkJCSAgICAgOiAiPSZyIiAoX19kdW1teTApLCAiPXIiIChfX2R1bW15MSkKLQkJCSAgICAgOiAiMSIgKH4weDEwMDAwMDAwKQotCQkJICAgICA6ICJtZW1vcnkiKTsKLX0KLQotI2RlZmluZSBsb2NhbF9zYXZlX2ZsYWdzKHgpIFwKLQlfX2FzbV9fKCJzdGMgc3IsICUwOyBhbmQgIzB4ZjAsICUwIiA6ICI9JnoiICh4KSA6LyoqLzogIm1lbW9yeSIgKQotCi0jZGVmaW5lIGlycXNfZGlzYWJsZWQoKQkJCVwKLSh7CQkJCQlcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCVwKLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsJXAotCShmbGFncyAhPSAwKTsJCQlcCi19KQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9jYWxfaXJxX3NhdmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBfX2R1bW15OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YwlzciwgJTFcblx0IgotCQkJICAgICAibW92CSUxLCAlMFxuXHQiCi0JCQkgICAgICJvcgkjMHhmMCwgJTBcblx0IgotCQkJICAgICAibGRjCSUwLCBzclxuXHQiCi0JCQkgICAgICJtb3YJJTEsICUwXG5cdCIKLQkJCSAgICAgImFuZAkjMHhmMCwgJTAiCi0JCQkgICAgIDogIj0meiIgKGZsYWdzKSwgIj0mciIgKF9fZHVtbXkpCi0JCQkgICAgIDovKiovCi0JCQkgICAgIDogIm1lbW9yeSIgKTsKLQlyZXR1cm4gZmxhZ3M7Ci19Ci0KLSNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoeCkgZG8gewkJCVwKLQlpZiAoKHggJiAweDAwMDAwMGYwKSAhPSAweDAwMDAwMGYwKQkJXAotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CQkJXAotfSB3aGlsZSAoMCkKLQogLyoKICAqIEp1bXAgdG8gUDIgYXJlYS4KICAqIFdoZW4gaGFuZGxpbmcgVExCIG9yIGNhY2hlcywgd2UgbmVlZCB0byBkbyBpdCBmcm9tIFAyIGFyZWEuCkBAIC0yNjQsOSArMTY4LDYgQEAKIAkJOiAiPSZyIiAoX19kdW1teSkpOwkJCVwKIH0gd2hpbGUgKDApCiAKLS8qIEZvciBzcGlubG9ja3MgZXRjICovCi0jZGVmaW5lIGxvY2FsX2lycV9zYXZlKHgpCXggPSBsb2NhbF9pcnFfc2F2ZSgpCi0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB4Y2hnX3UzMih2b2xhdGlsZSB1MzIgKm0sIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHJldHZhbDsKQEAgLTM1Myw2ICsyNTQsMTMgQEAKIAkJCQkgICAgKHVuc2lnbmVkIGxvbmcpX25fLCBzaXplb2YoKihwdHIpKSk7IFwKICAgfSkKIAorZXh0ZXJuIHZvaWQgKnNldF9leGNlcHRpb25fdGFibGVfdmVjKHVuc2lnbmVkIGludCB2ZWMsIHZvaWQgKmhhbmRsZXIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKnNldF9leGNlcHRpb25fdGFibGVfZXZ0KHVuc2lnbmVkIGludCBldnQsIHZvaWQgKmhhbmRsZXIpCit7CisJcmV0dXJuIHNldF9leGNlcHRpb25fdGFibGVfdmVjKGV2dCA+PiA1LCBoYW5kbGVyKTsKK30KKwogLyogWFhYCiAgKiBkaXNhYmxlIGhsdCBkdXJpbmcgY2VydGFpbiBjcml0aWNhbCBpL28gb3BlcmF0aW9ucwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tc2gvdGVybWJpdHMuaAppbmRleCA0Zjk4MjJhLi5mMWI3YjQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3Rlcm1iaXRzLmgKQEAgLTE3LDYgKzE3LDE3IEBACiAJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCiB9OwogCitzdHJ1Y3Qga3Rlcm1pb3MgeworCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCisJc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisJc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworfTsKKwogLyogY19jYyBjaGFyYWN0ZXJzICovCiAjZGVmaW5lIFZJTlRSIDAKICNkZWZpbmUgVlFVSVQgMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNoL3RocmVhZF9pbmZvLmgKaW5kZXggM2ViYzNmOS4uODc5Zjc0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1zaC90aHJlYWRfaW5mby5oCkBAIC05MCwxMyArOTAsNyBAQAogI2VuZGlmCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpCWtmcmVlKHRpKQogCi0jZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCi0KLS8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBBU00gKi8KLSNkZWZpbmUgR0VUX1RIUkVBRF9JTkZPKHJlZykgXAotCXN0YyAgICAgcjdfYmFuaywgcmVnCi0KLSNlbmRpZgorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAvKgogICogdGhyZWFkIGluZm9ybWF0aW9uIGZsYWdzCkBAIC0xMTIsNiArMTA2LDcgQEAKICNkZWZpbmUgVElGX1VTRURGUFUJCTE2CS8qIEZQVSB3YXMgdXNlZCBieSB0aGlzIHRhc2sgdGhpcyBxdWFudHVtIChTTVApICovCiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNwkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkxOAorI2RlZmluZSBUSUZfRlJFRVpFCQkxOQogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCkBAIC0xMjAsNiArMTE1LDcgQEAKICNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKDE8PFRJRl9SRVNUT1JFX1NJR01BU0spCiAjZGVmaW5lIF9USUZfVVNFREZQVQkJKDE8PFRJRl9VU0VERlBVKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCisjZGVmaW5lIF9USUZfRlJFRVpFCQkoMTw8VElGX0ZSRUVaRSkKIAogI2RlZmluZSBfVElGX1dPUktfTUFTSwkJMHgwMDAwMDBGRQkvKiB3b3JrIHRvIGRvIG9uIGludGVycnVwdC9leGNlcHRpb24gcmV0dXJuICovCiAjZGVmaW5lIF9USUZfQUxMV09SS19NQVNLCTB4MDAwMDAwRkYJLyogd29yayB0byBkbyBvbiBhbnkgcmV0dXJuIHRvIHUtc3BhY2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3RpbWVyLmggYi9pbmNsdWRlL2FzbS1zaC90aW1lci5oCmluZGV4IDVkZjg0MmIuLjE3YjVlNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3RpbWVyLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdGltZXIuaApAQCAtMTgsMTEgKzE4LDMyIEBACiAKIAlzdHJ1Y3Qgc3lzX2RldmljZQlkZXY7CiAJc3RydWN0IHN5c190aW1lcl9vcHMJKm9wczsKKworI2lmZGVmIENPTkZJR19OT19JRExFX0haCisJc3RydWN0IGR5bl90aWNrX3RpbWVyCSpkeW5fdGljazsKKyNlbmRpZgogfTsKIAorI2lmZGVmIENPTkZJR19OT19JRExFX0haCisjZGVmaW5lIERZTl9USUNLX0VOQUJMRUQJKDEgPDwgMSkKKworc3RydWN0IGR5bl90aWNrX3RpbWVyIHsKKwlzcGlubG9ja190CWxvY2s7CisJdW5zaWduZWQgaW50CXN0YXRlOwkJCS8qIEN1cnJlbnQgc3RhdGUgKi8KKwlpbnQJCSgqZW5hYmxlKSh2b2lkKTsJLyogRW5hYmxlcyBkeW5hbWljIHRpY2sgKi8KKwlpbnQJCSgqZGlzYWJsZSkodm9pZCk7CS8qIERpc2FibGVzIGR5bmFtaWMgdGljayAqLworCXZvaWQJCSgqcmVwcm9ncmFtKSh1bnNpZ25lZCBsb25nKTsgLyogUmVwcm9ncmFtcyB0aGUgdGltZXIgKi8KKwlpbnQJCSgqaGFuZGxlcikoaW50LCB2b2lkICopOworfTsKKwordm9pZCB0aW1lcl9keW5fcmVwcm9ncmFtKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgdGltZXJfZHluX3JlcHJvZ3JhbSgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiAjZGVmaW5lIFRJQ0tfU0laRSAodGlja19uc2VjIC8gMTAwMCkKIAotZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgdG11X3RpbWVyOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgdG11X3RpbWVyLCBjbXRfdGltZXIsIG10dTJfdGltZXI7CiBleHRlcm4gc3RydWN0IHN5c190aW1lciAqc3lzX3RpbWVyOwogCiAjaWZuZGVmIENPTkZJR19HRU5FUklDX1RJTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3RpdGFuLmggYi9pbmNsdWRlL2FzbS1zaC90aXRhbi5oCmluZGV4IDI3MGE0ZjQuLjAzZjM1ODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3RpdGFuLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdGl0YW4uaApAQCAtMSw5ICsxLDggQEAKIC8qCiAgKiBQbGF0Zm9ybSBkZWZpbnRpb25zIGZvciBUaXRhbgogICovCi0KLSNpZm5kZWYgX0FTTV9TSF9USVRBTl9USVRBTl9ICi0jZGVmaW5lIF9BU01fU0hfVElUQU5fVElUQU5fSAorI2lmbmRlZiBfQVNNX1NIX1RJVEFOX0gKKyNkZWZpbmUgX0FTTV9TSF9USVRBTl9ICiAKICNkZWZpbmUgX19JT19QUkVGSVggdGl0YW4KICNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgpAQCAtMTUsMjkgKzE0LDQgQEAKICNkZWZpbmUgVElUQU5fSVJRX01QQ0lCCQkxMQkvKiBtUENJIEIgKi8KICNkZWZpbmUgVElUQU5fSVJRX1VTQgkJMTEJLyogVVNCICovCiAKLS8qCi0gKiBUaGUgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmVzLCB0aGVzZSB0YWtlIHVwIGludHMgMCAtIDE1IGluY2x1c2l2ZQotICogZGVwZW5kaW5nIG9uIHRoZSBwcmlvcml0eSBmb3IgdGhlIGludGVycnVwdC4gIEluIGZhY3QgdGhlIHByaW9yaXR5Ci0gKiBpcyB0aGUgaW50ZXJydXB0IDotKQotICovCi0jZGVmaW5lIElSTDBfSVJRCTAKLSNkZWZpbmUgSVJMMF9JUFJfQUREUglJTlRDX0lQUkQKLSNkZWZpbmUgSVJMMF9JUFJfUE9TCTMKLSNkZWZpbmUgSVJMMF9QUklPUklUWQk4Ci0KLSNkZWZpbmUgSVJMMV9JUlEJMQotI2RlZmluZSBJUkwxX0lQUl9BRERSCUlOVENfSVBSRAotI2RlZmluZSBJUkwxX0lQUl9QT1MJMgotI2RlZmluZSBJUkwxX1BSSU9SSVRZCTgKLQotI2RlZmluZSBJUkwyX0lSUQkyCi0jZGVmaW5lIElSTDJfSVBSX0FERFIJSU5UQ19JUFJECi0jZGVmaW5lIElSTDJfSVBSX1BPUwkxCi0jZGVmaW5lIElSTDJfUFJJT1JJVFkJOAotCi0jZGVmaW5lIElSTDNfSVJRCTMKLSNkZWZpbmUgSVJMM19JUFJfQUREUglJTlRDX0lQUkQKLSNkZWZpbmUgSVJMM19JUFJfUE9TCTAKLSNkZWZpbmUgSVJMM19QUklPUklUWQk4Ci0KLSNlbmRpZgorI2VuZGlmIC8qIF9fQVNNX1NIX1RJVEFOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3R5cGVzLmggYi9pbmNsdWRlL2FzbS1zaC90eXBlcy5oCmluZGV4IDNjMDlkZDQuLmZkMDBkYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdHlwZXMuaApAQCAtNTIsMTYgKzUyLDYgQEAKIAogdHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKIAotI2lmZGVmIENPTkZJR19MQkQKLXR5cGVkZWYgdTY0IHNlY3Rvcl90OwotI2RlZmluZSBIQVZFX1NFQ1RPUl9UCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19MU0YKLXR5cGVkZWYgdTY0IGJsa2NudF90OwotI2RlZmluZSBIQVZFX0JMS0NOVF9UCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1zaC91bmlzdGQuaAppbmRleCBmMWEwY2JjLi5mOTgyMDczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zaC91bmlzdGQuaApAQCAtMzI0LDEzMCArMzI0LDE0IEBACiAjZGVmaW5lIF9fTlJfc3luY19maWxlX3JhbmdlCTMxNAogI2RlZmluZSBfX05SX3RlZQkJMzE1CiAjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCTMxNgorI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCTMxNworI2RlZmluZSBfX05SX2dldGNwdQkJMzE4CisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzE5CiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzE3CisjZGVmaW5lIE5SX3N5c2NhbGxzIDMyMAogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLS8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtTUFYX0VSUk5POgotICogc2VlIDxhc20tc2gvZXJybm8uaD4gKi8KLQotI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAotZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCi0JLyogQXZvaWQgdXNpbmcgInJlcyIgd2hpY2ggaXMgZGVjbGFyZWQgdG8gYmUgaW4gcmVnaXN0ZXIgcjA7IFwKLQkgICBlcnJubyBtaWdodCBleHBhbmQgdG8gYSBmdW5jdGlvbiBjYWxsIGFuZCBjbG9iYmVyIGl0LiAgKi8gXAotCQlpbnQgX19lcnIgPSAtKHJlcyk7IFwKLQkJZXJybm8gPSBfX2VycjsgXAotCQlyZXMgPSAtMTsgXAotCX0gXAotCXJldHVybiAodHlwZSkgKHJlcyk7IFwKLX0gd2hpbGUgKDApCi0KLS8qIFhYWCAtIF9mb28gbmVlZHMgdG8gYmUgX19mb28sIHdoaWxlIF9fTlJfYmFyIGNvdWxkIGJlIF9OUl9iYXIuICovCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLG5hbWUpIFwKLXR5cGUgbmFtZSh2b2lkKSBcCi17IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzAgX19hc21fXyAoInIzIikgPSBfX05SXyMjbmFtZTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0cmFwYQkjMHgxMCIgXAotCTogIj16IiAoX19zYzApIFwKLQk6ICIwIiAoX19zYzApIFwKLQk6ICJtZW1vcnkiICk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3NjMCk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUxLGFyZzEpIFwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxKSBcCi17IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzAgX19hc21fXyAoInIzIikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjNCBfX2FzbV9fICgicjQiKSA9IChsb25nKSBhcmcxOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXBhCSMweDExIiBcCi0JOiAiPXoiIChfX3NjMCkgXAotCTogIjAiIChfX3NjMCksICJyIiAoX19zYzQpIFwKLQk6ICJtZW1vcnkiKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fc2MwKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyKSBcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyKSBcCi17IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzAgX19hc21fXyAoInIzIikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjNCBfX2FzbV9fICgicjQiKSA9IChsb25nKSBhcmcxOyBcCi1yZWdpc3RlciBsb25nIF9fc2M1IF9fYXNtX18gKCJyNSIpID0gKGxvbmcpIGFyZzI7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcGEJIzB4MTIiIFwKLQk6ICI9eiIgKF9fc2MwKSBcCi0JOiAiMCIgKF9fc2MwKSwgInIiIChfX3NjNCksICJyIiAoX19zYzUpIFwKLQk6ICJtZW1vcnkiKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fc2MwKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMyh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMpIFwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxLHR5cGUyIGFyZzIsdHlwZTMgYXJnMykgXAoteyBcCi1yZWdpc3RlciBsb25nIF9fc2MwIF9fYXNtX18gKCJyMyIpID0gX19OUl8jI25hbWU7IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzQgX19hc21fXyAoInI0IikgPSAobG9uZykgYXJnMTsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjNSBfX2FzbV9fICgicjUiKSA9IChsb25nKSBhcmcyOyBcCi1yZWdpc3RlciBsb25nIF9fc2M2IF9fYXNtX18gKCJyNiIpID0gKGxvbmcpIGFyZzM7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcGEJIzB4MTMiIFwKLQk6ICI9eiIgKF9fc2MwKSBcCi0JOiAiMCIgKF9fc2MwKSwgInIiIChfX3NjNCksICJyIiAoX19zYzUpLCAiciIgKF9fc2M2KSBcCi0JOiAibWVtb3J5Iik7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3NjMCk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDQodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQpIFwKLXR5cGUgbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCkgXAoteyBcCi1yZWdpc3RlciBsb25nIF9fc2MwIF9fYXNtX18gKCJyMyIpID0gX19OUl8jI25hbWU7IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzQgX19hc21fXyAoInI0IikgPSAobG9uZykgYXJnMTsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjNSBfX2FzbV9fICgicjUiKSA9IChsb25nKSBhcmcyOyBcCi1yZWdpc3RlciBsb25nIF9fc2M2IF9fYXNtX18gKCJyNiIpID0gKGxvbmcpIGFyZzM7IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzcgX19hc21fXyAoInI3IikgPSAobG9uZykgYXJnNDsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0cmFwYQkjMHgxNCIgXAotCTogIj16IiAoX19zYzApIFwKLQk6ICIwIiAoX19zYzApLCAiciIgKF9fc2M0KSwgInIiIChfX3NjNSksICJyIiAoX19zYzYpLCAgXAotCSAgInIiIChfX3NjNykgXAotCTogIm1lbW9yeSIgKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fc2MwKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNSh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCx0eXBlNSxhcmc1KSBcCi10eXBlIG5hbWUgKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQsIHR5cGU1IGFyZzUpIFwKLXsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjMyBfX2FzbV9fICgicjMiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fc2M0IF9fYXNtX18gKCJyNCIpID0gKGxvbmcpIGFyZzE7IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzUgX19hc21fXyAoInI1IikgPSAobG9uZykgYXJnMjsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjNiBfX2FzbV9fICgicjYiKSA9IChsb25nKSBhcmczOyBcCi1yZWdpc3RlciBsb25nIF9fc2M3IF9fYXNtX18gKCJyNyIpID0gKGxvbmcpIGFyZzQ7IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzAgX19hc21fXyAoInIwIikgPSAobG9uZykgYXJnNTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0cmFwYQkjMHgxNSIgXAotCTogIj16IiAoX19zYzApIFwKLQk6ICIwIiAoX19zYzApLCAiciIgKF9fc2M0KSwgInIiIChfX3NjNSksICJyIiAoX19zYzYpLCAiciIgKF9fc2M3KSwgIFwKLQkgICJyIiAoX19zYzMpIFwKLQk6ICJtZW1vcnkiICk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3NjMCk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDYodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsdHlwZTUsYXJnNSx0eXBlNixhcmc2KSBcCi10eXBlIG5hbWUgKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQsIHR5cGU1IGFyZzUsIHR5cGU2IGFyZzYpIFwKLXsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjMyBfX2FzbV9fICgicjMiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fc2M0IF9fYXNtX18gKCJyNCIpID0gKGxvbmcpIGFyZzE7IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzUgX19hc21fXyAoInI1IikgPSAobG9uZykgYXJnMjsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjNiBfX2FzbV9fICgicjYiKSA9IChsb25nKSBhcmczOyBcCi1yZWdpc3RlciBsb25nIF9fc2M3IF9fYXNtX18gKCJyNyIpID0gKGxvbmcpIGFyZzQ7IFwKLXJlZ2lzdGVyIGxvbmcgX19zYzAgX19hc21fXyAoInIwIikgPSAobG9uZykgYXJnNTsgXAotcmVnaXN0ZXIgbG9uZyBfX3NjMSBfX2FzbV9fICgicjEiKSA9IChsb25nKSBhcmc2OyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXBhCSMweDE2IiBcCi0JOiAiPXoiIChfX3NjMCkgXAotCTogIjAiIChfX3NjMCksICJyIiAoX19zYzQpLCAiciIgKF9fc2M1KSwgInIiIChfX3NjNiksICJyIiAoX19zYzcpLCAgXAotCSAgInIiIChfX3NjMyksICJyIiAoX19zYzEpIFwKLQk6ICJtZW1vcnkiICk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3NjMCk7IFwKLX0KLQogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfU1RBVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1zaDY0L2NhY2hlZmx1c2guaAppbmRleCA1NWY3MWFhLi4xZTUzYTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2NhY2hlZmx1c2guaApAQCAtMjEsNiArMjEsOCBAQAogCQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICBpbnQgbGVuKTsKIAorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCWZsdXNoX2NhY2hlX21tKG1tKQorCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZykJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpCWRvIHsgfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tc2g2NC9jaGVja3N1bS5oCmluZGV4IGZkMDM0ZTkuLmJhNTk0Y2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2NoZWNrc3VtLmgKQEAgLTI2LDggKzI2LDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBsZW4sCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgc3VtKTsKK2FzbWxpbmthZ2UgX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqCU5vdGU6IHdoZW4geW91IGdldCBhIE5VTEwgcG9pbnRlciBleGNlcHRpb24gaGVyZSB0aGlzIG1lYW5zIHNvbWVvbmUKQEAgLTM4LDQ2ICszNywzNCBAQAogICovCiAKIAotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBzdW0pOworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sCisJCQkJICAgICAgIF9fd3N1bSBzdW0pOwogCi11bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkgaW50IGxlbiwgaW50IHN1bSwgaW50ICplcnJfcHRyKTsKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKTsKIAotLyoKLSAqIFRoZXNlIGFyZSB0aGUgb2xkIChhbmQgdW5zYWZlKSB3YXkgb2YgZG9pbmcgY2hlY2tzdW1zLCBhIHdhcm5pbmcgbWVzc2FnZSB3aWxsIGJlCi0gKiBwcmludGVkIGlmIHRoZXkgYXJlIHVzZWQgYW5kIGFuIGV4ZXB0aW9uIG9jY3Vycy4KLSAqCi0gKiB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGdvIGF3YXkgYWZ0ZXIgc29tZSB0aW1lLgotICovCi0KLSNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbXVzZXIgY3N1bV9wYXJ0aWFsX2NvcHkKLQotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5KGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBzdW0pOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gY3N1bSkKIHsKKwl1MzIgc3VtID0gKF9fZm9yY2UgdTMyKWNzdW07CiAgICAgICAgIHN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7CiAgICAgICAgIHN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7Ci0gICAgICAgIHJldHVybiB+KHN1bSk7CisgICAgICAgIHJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5zdW07CiB9CiAKLXVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCk7CiAKLXVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCSB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCSB1bnNpZ25lZCBpbnQgc3VtKTsKKwkJCQkgX193c3VtIHN1bSk7CiAKIC8qCiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJCQkgICBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKIH0KQEAgLTg2LDcgKzczLDcgQEAKICAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKICAqIGluIGljbXAuYwogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1zaDY0L2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXNoNjQvZG1hLW1hcHBpbmcuaAppbmRleCA2OGUyN2E4Li41ZWZlOTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9kbWEtbWFwcGluZy5oCkBAIC0zNSw3ICszNSw3IEBACiAJY29uc2lzdGVudF9mcmVlKE5VTEwsIHNpemUsIHZhZGRyLCBkbWFfaGFuZGxlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRtYV9jYWNoZV9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKIAkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKIAlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKXZhZGRyLCBzaXplKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tc2g2NC9wZ2FsbG9jLmgKaW5kZXggYjI5ZGQ0Ni4uY2I4MDNlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9wZ2FsbG9jLmgKQEAgLTQxLDcgKzQxLDcgQEAKIHN0YXRpYyBpbmxpbmUgcGdkX3QgKmdldF9wZ2Rfc2xvdyh2b2lkKQogewogCXVuc2lnbmVkIGludCBwZ2Rfc2l6ZSA9IChVU0VSX1BUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCkpOwotCXBnZF90ICpyZXQgPSAocGdkX3QgKilrbWFsbG9jKHBnZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlwZ2RfdCAqcmV0ID0ga21hbGxvYyhwZ2Rfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9zZXR1cC5oIGIvaW5jbHVkZS9hc20tc2g2NC9zZXR1cC5oCmluZGV4IGViZDQyZWIuLjViMDdiMTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoNjQvc2V0dXAuaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L3NldHVwLmgKQEAgLTEsNiArMSwxMCBAQAogI2lmbmRlZiBfX0FTTV9TSDY0X1NFVFVQX0gKICNkZWZpbmUgX19BU01fU0g2NF9TRVRVUF9ICiAKKyNkZWZpbmUgQ09NTUFORF9MSU5FX1NJWkUgMjU2CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKICNkZWZpbmUgUEFSQU0gKCh1bnNpZ25lZCBjaGFyICopZW1wdHlfemVyb19wYWdlKQogI2RlZmluZSBNT1VOVF9ST09UX1JET05MWSAoKih1bnNpZ25lZCBsb25nICopIChQQVJBTSsweDAwMCkpCiAjZGVmaW5lIFJBTURJU0tfRkxBR1MgKCoodW5zaWduZWQgbG9uZyAqKSAoUEFSQU0rMHgwMDQpKQpAQCAtMTIsNSArMTYsNyBAQAogI2RlZmluZSBDT01NQU5EX0xJTkUgKChjaGFyICopIChQQVJBTSsyNTYpKQogI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRSAyNTYKIAorI2VuZGlmICAvKiAgX19LRVJORUxfXyAgKi8KKwogI2VuZGlmIC8qIF9fQVNNX1NINjRfU0VUVVBfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaDY0L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tc2g2NC91bmlzdGQuaAppbmRleCBlZTc4MjhiLi4xZjM4YTdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaDY0L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoNjQvdW5pc3RkLmgKQEAgLTM0NywxNDggKzM0Nyw2IEBACiAjaWZkZWYgX19LRVJORUxfXyAKIAogI2RlZmluZSBOUl9zeXNjYWxscyAzMjEKLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC1NQVhfRVJSTk86Ci0gKiBzZWUgPGFzbS1zaDY0L2Vycm5vLmg+ICovCi0KLSNkZWZpbmUgX19zeXNjYWxsX3JldHVybih0eXBlLCByZXMpIFwKLWRvIHsgXAotCS8qIE5vdGU6IHdoZW4gcmV0dXJuaW5nIGZyb20ga2VybmVsIHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gcjkJICAgIFwKLQkqKiAgICAgICBUaGlzIHByZXZlbnRzIGNvbmZsaWN0cyBiZXR3ZWVuIHJldHVybiB2YWx1ZSBhbmQgYXJnMSAgICAgIFwKLQkqKiAgICAgICB3aGVuIGRpc3BhdGNoaW5nIHNpZ25hbCBoYW5kbGVyLCBpbiBvdGhlciB3b3JkcyBtYWtlcwkgICAgXAotCSoqICAgICAgIGxpZmUgZWFzaWVyIGluIHRoZSBzeXN0ZW0gY2FsbCBlcGlsb2d1ZSAoc2VlIGVudHJ5LlMpICAgICAgXAotCSovCQkJCQkJCQkgICAgXAotICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc3IyIF9fYXNtX18gKCJyMiIpID0gcmVzOwkJICAgIFwKLQlpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC1NQVhfRVJSTk8pKSB7CSAgICBcCi0JCWVycm5vID0gLShyZXMpOwkJCQkJCSAgICBcCi0JCV9fc3IyID0gLTE7IAkJCQkJCSAgICBcCi0JfSBcCi0JcmV0dXJuICh0eXBlKSAoX19zcjIpOyAJCQkJCQkgICAgXAotfSB3aGlsZSAoMCkKLQotLyogWFhYIC0gX2ZvbyBuZWVkcyB0byBiZSBfX2Zvbywgd2hpbGUgX19OUl9iYXIgY291bGQgYmUgX05SX2Jhci4gKi8KLQotI2RlZmluZSBfc3lzY2FsbDAodHlwZSxuYW1lKSBcCi10eXBlIG5hbWUodm9pZCkgXAoteyBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MwIF9fYXNtX18gKCJyOSIpID0gKCgweDEwIDw8IDE2KSB8IF9fTlJfIyNuYW1lKTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0cmFwYQklMSAhXHRcdFx0IiAjbmFtZSAiKCkiCQkJICAgIFwKLQk6ICI9ciIgKF9fc2MwKSAJCQkJCQkJICAgIFwKLQk6ICJyIiAoX19zYzApICk7IAkJCQkJCSAgICBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19zYzApOyAJCQkJCQkgICAgXAotfQotCi0JLyoKLQkgKiBUaGUgYXBwYXJlbnQgc3B1cmlvdXMgImR1bW15IiBhc3NlbWJsZXIgY29tbWVudCBpcyAqbmVlZGVkKiwKLQkgKiBhcyB3aXRob3V0IGl0LCB0aGUgY29tcGlsZXIgdHJlYXRzIHRoZSBhcmc8bj4gdmFyaWFibGVzCi0JICogYXMgbm8gbG9uZ2VyIGxpdmUganVzdCBiZWZvcmUgdGhlIGFzbS4gVGhlIGNvbXBpbGVyIGNhbgotCSAqIHRoZW4gb3B0aW1pemUgdGhlIHN0b3JhZ2UgaW50byBhbnkgcmVnaXN0ZXJzIGl0IHdpc2hlcy4KLQkgKiBUaGUgYWRkaXRpb25hbCBkdW1teSBzdGF0ZW1lbnQgZm9yY2VzIHRoZSBjb21waWxlciB0byBwdXQKLQkgKiB0aGUgYXJndW1lbnRzIGludG8gdGhlIGNvcnJlY3QgcmVnaXN0ZXJzIGJlZm9yZSB0aGUgVFJBUEEuCi0JICovCi0jZGVmaW5lIF9zeXNjYWxsMSh0eXBlLG5hbWUsdHlwZTEsYXJnMSkgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEpIFwKLXsgXAotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMCBfX2FzbV9fICgicjkiKSA9ICgoMHgxMSA8PCAxNikgfCBfX05SXyMjbmFtZSk7IFwKLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzIgX19hc21fXyAoInIyIikgPSAodW5zaWduZWQgbG9uZykgYXJnMTsJICAgIFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcGEJJTEgIVx0XHRcdCIgI25hbWUgIiglMikiCQkgICAgXAotCTogIj1yIiAoX19zYzApIAkJCQkJCQkgICAgXAotCTogInIiIChfX3NjMCksICJyIiAoX19zYzIpKTsJCQkJCSAgICBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiFkdW1teQklMCAlMSIJCQkJICAgCSAgICBcCi0JOgkJCQkJCQkJICAgIFwKLQk6ICJyIiAoX19zYzApLCAiciIgKF9fc2MyKSk7CQkJCQkgICAgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fc2MwKTsgCQkJCQkJICAgIFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMikgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMikgXAoteyBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MwIF9fYXNtX18gKCJyOSIpID0gKCgweDEyIDw8IDE2KSB8IF9fTlJfIyNuYW1lKTsgXAotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMiBfX2FzbV9fICgicjIiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmcxOwkgICAgXAotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMyBfX2FzbV9fICgicjMiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmcyOwkgICAgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0cmFwYQklMSAhXHRcdFx0IiAjbmFtZSAiKCUyLCUzKSIJCSAgICBcCi0JOiAiPXIiIChfX3NjMCkgCQkJCQkJCSAgICBcCi0JOiAiciIgKF9fc2MwKSwgInIiIChfX3NjMiksICJyIiAoX19zYzMpICk7CQkJICAgIFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgiIWR1bW15CSUwICUxICUyIgkJCSAgIAkgICAgXAotCToJCQkJCQkJCSAgICBcCi0JOiAiciIgKF9fc2MwKSwgInIiIChfX3NjMiksICJyIiAoX19zYzMpICk7CQkJICAgIFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3NjMCk7IAkJCQkJCSAgICBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMykgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczKSBcCi17IFwKLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzAgX19hc21fXyAoInI5IikgPSAoKDB4MTMgPDwgMTYpIHwgX19OUl8jI25hbWUpOyBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MyIF9fYXNtX18gKCJyMiIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzE7CSAgICBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MzIF9fYXNtX18gKCJyMyIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzI7CSAgICBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2M0IF9fYXNtX18gKCJyNCIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzM7CSAgICBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXBhCSUxICFcdFx0XHQiICNuYW1lICIoJTIsJTMsJTQpIgkJICAgIFwKLQk6ICI9ciIgKF9fc2MwKSAJCQkJCQkJICAgIFwKLQk6ICJyIiAoX19zYzApLCAiciIgKF9fc2MyKSwgInIiIChfX3NjMyksICJyIiAoX19zYzQpICk7CQkgICAgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCIhZHVtbXkJJTAgJTEgJTIgJTMiCQkJICAgCSAgICBcCi0JOgkJCQkJCQkJICAgIFwKLQk6ICJyIiAoX19zYzApLCAiciIgKF9fc2MyKSwgInIiIChfX3NjMyksICJyIiAoX19zYzQpICk7CSAgIAkgICAgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fc2MwKTsgCQkJCQkJICAgIFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDQodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQpIFwKLXR5cGUgbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCkgXAoteyBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MwIF9fYXNtX18gKCJyOSIpID0gKCgweDE0IDw8IDE2KSB8IF9fTlJfIyNuYW1lKTsgXAotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMiBfX2FzbV9fICgicjIiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmcxOwkgICAgXAotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMyBfX2FzbV9fICgicjMiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmcyOwkgICAgXAotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjNCBfX2FzbV9fICgicjQiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmczOwkgICAgXAotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjNSBfX2FzbV9fICgicjUiKSA9ICh1bnNpZ25lZCBsb25nKSBhcmc0OwkgICAgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0cmFwYQklMSAhXHRcdFx0IiAjbmFtZSAiKCUyLCUzLCU0LCU1KSIJICAgIFwKLQk6ICI9ciIgKF9fc2MwKSAJCQkJCQkJICAgIFwKLQk6ICJyIiAoX19zYzApLCAiciIgKF9fc2MyKSwgInIiIChfX3NjMyksICJyIiAoX19zYzQpLCAiciIgKF9fc2M1KSApO1wKLV9fYXNtX18gX192b2xhdGlsZV9fICgiIWR1bW15CSUwICUxICUyICUzICU0IgkJCSAgIAkgICAgXAotCToJCQkJCQkJCSAgICBcCi0JOiAiciIgKF9fc2MwKSwgInIiIChfX3NjMiksICJyIiAoX19zYzMpLCAiciIgKF9fc2M0KSwgInIiIChfX3NjNSkgKTtcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19zYzApOyAJCQkJCQkgICAgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNSh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCx0eXBlNSxhcmc1KSBcCi10eXBlIG5hbWUgKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQsIHR5cGU1IGFyZzUpIFwKLXsgXAotcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3NjMCBfX2FzbV9fICgicjkiKSA9ICgoMHgxNSA8PCAxNikgfCBfX05SXyMjbmFtZSk7IFwKLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzIgX19hc21fXyAoInIyIikgPSAodW5zaWduZWQgbG9uZykgYXJnMTsJICAgIFwKLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzMgX19hc21fXyAoInIzIikgPSAodW5zaWduZWQgbG9uZykgYXJnMjsJICAgIFwKLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzQgX19hc21fXyAoInI0IikgPSAodW5zaWduZWQgbG9uZykgYXJnMzsJICAgIFwKLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzUgX19hc21fXyAoInI1IikgPSAodW5zaWduZWQgbG9uZykgYXJnNDsJICAgIFwKLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzYgX19hc21fXyAoInI2IikgPSAodW5zaWduZWQgbG9uZykgYXJnNTsJICAgIFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcGEJJTEgIVx0XHRcdCIgI25hbWUgIiglMiwlMywlNCwlNSwlNikiCSAgICBcCi0JOiAiPXIiIChfX3NjMCkgCQkJCQkJCSAgICBcCi0JOiAiciIgKF9fc2MwKSwgInIiIChfX3NjMiksICJyIiAoX19zYzMpLCAiciIgKF9fc2M0KSwgInIiIChfX3NjNSksICBcCi0JICAiciIgKF9fc2M2KSk7CQkJCQkJCSAgICBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiFkdW1teQklMCAlMSAlMiAlMyAlNCAlNSIJCSAgIAkgICAgXAotCToJCQkJCQkJCSAgICBcCi0JOiAiciIgKF9fc2MwKSwgInIiIChfX3NjMiksICJyIiAoX19zYzMpLCAiciIgKF9fc2M0KSwgInIiIChfX3NjNSksICBcCi0JICAiciIgKF9fc2M2KSk7CQkJCQkJCSAgICBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19zYzApOyAJCQkJCQkgICAgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCx0eXBlNSxhcmc1LCB0eXBlNiwgYXJnNikgXAotdHlwZSBuYW1lICh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0LCB0eXBlNSBhcmc1LCB0eXBlNiBhcmc2KSBcCi17IFwKLXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19zYzAgX19hc21fXyAoInI5IikgPSAoKDB4MTYgPDwgMTYpIHwgX19OUl8jI25hbWUpOyBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MyIF9fYXNtX18gKCJyMiIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzE7CSAgICBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2MzIF9fYXNtX18gKCJyMyIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzI7CSAgICBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2M0IF9fYXNtX18gKCJyNCIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzM7CSAgICBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2M1IF9fYXNtX18gKCJyNSIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzQ7CSAgICBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2M2IF9fYXNtX18gKCJyNiIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzU7CSAgICBcCi1yZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc2M3IF9fYXNtX18gKCJyNyIpID0gKHVuc2lnbmVkIGxvbmcpIGFyZzY7CSAgICBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXBhCSUxICFcdFx0XHQiICNuYW1lICIoJTIsJTMsJTQsJTUsJTYsJTcpIgkgICAgXAotCTogIj1yIiAoX19zYzApIAkJCQkJCQkgICAgXAotCTogInIiIChfX3NjMCksICJyIiAoX19zYzIpLCAiciIgKF9fc2MzKSwgInIiIChfX3NjNCksICJyIiAoX19zYzUpLCAgXAotCSAgInIiIChfX3NjNiksICJyIiAoX19zYzcpKTsJCQkJCSAgICBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiFkdW1teQklMCAlMSAlMiAlMyAlNCAlNSAlNiIJCSAgIAkgICAgXAotCToJCQkJCQkJCSAgICBcCi0JOiAiciIgKF9fc2MwKSwgInIiIChfX3NjMiksICJyIiAoX19zYzMpLCAiciIgKF9fc2M0KSwgInIiIChfX3NjNSksICBcCi0JICAiciIgKF9fc2M2KSwgInIiIChfX3NjNykpOwkJCQkJICAgIFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3NjMCk7IAkJCQkJCSAgICBcCi19CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2NhY2hlZmx1c2guaAppbmRleCBmYzYzMmY4Li42OGFjMTA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvY2FjaGVmbHVzaC5oCkBAIC00OCw2ICs0OCw3IEBACiAKICNkZWZpbmUgZmx1c2hfY2FjaGVfYWxsKCkgQlRGSVhVUF9DQUxMKGZsdXNoX2NhY2hlX2FsbCkoKQogI2RlZmluZSBmbHVzaF9jYWNoZV9tbShtbSkgQlRGSVhVUF9DQUxMKGZsdXNoX2NhY2hlX21tKShtbSkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKSBCVEZJWFVQX0NBTEwoZmx1c2hfY2FjaGVfbW0pKG1tKQogI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsc3RhcnQsZW5kKSBCVEZJWFVQX0NBTEwoZmx1c2hfY2FjaGVfcmFuZ2UpKHZtYSxzdGFydCxlbmQpCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLGFkZHIscGZuKSBCVEZJWFVQX0NBTEwoZmx1c2hfY2FjaGVfcGFnZSkodm1hLGFkZHIpCiAjZGVmaW5lIGZsdXNoX2ljYWNoZV9yYW5nZShzdGFydCwgZW5kKQkJZG8geyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2NoZWNrc3VtLmgKaW5kZXggMjg2MTU4MS4uMjY3ZTYzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9jaGVja3N1bS5oCkBAIC0zMCw3ICszMCw3IEBACiAgKgogICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCiAvKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBmczpzcmMgd2hpbGUgaXQKICAqIGNoZWNrc3VtcwpAQCAtNDEsOSArNDEsOCBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IF9fY3N1bV9wYXJ0aWFsX2NvcHlfc3BhcmNfZ2VuZXJpYyAoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCAKLWNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJICAgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXQgYXNtKCJvMCIpID0gKHVuc2lnbmVkIGludClzcmM7CiAJcmVnaXN0ZXIgY2hhciAqZCBhc20oIm8xIikgPSBkc3Q7CkBAIC01Nyw0MiArNTYsMzYgQEAKIAk6ICJvMiIsICJvMyIsICJvNCIsICJvNSIsICJvNyIsCiAJICAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLCAiZzciLAogCSAgIm1lbW9yeSIsICJjYyIpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycikKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLAorCQkJICAgIF9fd3N1bSBzdW0sIGludCAqZXJyKQogICB7Ci0JaWYgKCFhY2Nlc3Nfb2sgKFZFUklGWV9SRUFELCBzcmMsIGxlbikpIHsKLQkJKmVyciA9IC1FRkFVTFQ7Ci0JCW1lbXNldCAoZHN0LCAwLCBsZW4pOwotCQlyZXR1cm4gc3VtOwotCX0gZWxzZSB7Ci0JCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmV0IGFzbSgibzAiKSA9ICh1bnNpZ25lZCBsb25nKXNyYzsKLQkJcmVnaXN0ZXIgY2hhciAqZCBhc20oIm8xIikgPSBkc3Q7Ci0JCXJlZ2lzdGVyIGludCBsIGFzbSgiZzEiKSA9IGxlbjsKLQkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHMgYXNtKCJnNyIpID0gc3VtOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmV0IGFzbSgibzAiKSA9ICh1bnNpZ25lZCBsb25nKXNyYzsKKwlyZWdpc3RlciBjaGFyICpkIGFzbSgibzEiKSA9IGRzdDsKKwlyZWdpc3RlciBpbnQgbCBhc20oImcxIikgPSBsZW47CisJcmVnaXN0ZXIgX193c3VtIHMgYXNtKCJnNyIpID0gc3VtOwogCi0JCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJIi5zZWN0aW9uIF9fZXhfdGFibGUsI2FsbG9jXG5cdCIKLQkJIi5hbGlnbiA0XG5cdCIKLQkJIi53b3JkIDFmLDJcblx0IgotCQkiLnByZXZpb3VzXG4iCi0JCSIxOlxuXHQiCi0JCSJjYWxsIF9fY3N1bV9wYXJ0aWFsX2NvcHlfc3BhcmNfZ2VuZXJpY1xuXHQiCi0JCSIgc3QgJTgsIFslJXNwICsgNjRdXG4iCi0JCTogIj0mciIgKHJldCksICI9JnIiIChkKSwgIj0mciIgKGwpLCAiPSZyIiAocykKLQkJOiAiMCIgKHJldCksICIxIiAoZCksICIyIiAobCksICIzIiAocyksICJyIiAoZXJyKQotCQk6ICJvMiIsICJvMyIsICJvNCIsICJvNSIsICJvNyIsICJnMiIsICJnMyIsICJnNCIsICJnNSIsCi0JCSAgImNjIiwgIm1lbW9yeSIpOwotCQlyZXR1cm4gcmV0OwotCX0KLSAgfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkiLnNlY3Rpb24gX19leF90YWJsZSwjYWxsb2Ncblx0IgorCSIuYWxpZ24gNFxuXHQiCisJIi53b3JkIDFmLDJcblx0IgorCSIucHJldmlvdXNcbiIKKwkiMTpcblx0IgorCSJjYWxsIF9fY3N1bV9wYXJ0aWFsX2NvcHlfc3BhcmNfZ2VuZXJpY1xuXHQiCisJIiBzdCAlOCwgWyUlc3AgKyA2NF1cbiIKKwk6ICI9JnIiIChyZXQpLCAiPSZyIiAoZCksICI9JnIiIChsKSwgIj0mciIgKHMpCisJOiAiMCIgKHJldCksICIxIiAoZCksICIyIiAobCksICIzIiAocyksICJyIiAoZXJyKQorCTogIm8yIiwgIm8zIiwgIm80IiwgIm81IiwgIm83IiwgImcyIiwgImczIiwgImc0IiwgImc1IiwKKwkgICJjYyIsICJtZW1vcnkiKTsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJldDsKK30KICAgCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCAKLWNzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqZHN0LCBpbnQgbGVuLAotCQkJICB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycikKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX3BhcnRpYWxfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCBfX3VzZXIgKmRzdCwgaW50IGxlbiwKKwkJCSAgX193c3VtIHN1bSwgaW50ICplcnIpCiB7CiAJaWYgKCFhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKSB7CiAJCSplcnIgPSAtRUZBVUxUOwpAQCAtMTAxLDcgKzk0LDcgQEAKIAkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXQgYXNtKCJvMCIpID0gKHVuc2lnbmVkIGxvbmcpc3JjOwogCQlyZWdpc3RlciBjaGFyIF9fdXNlciAqZCBhc20oIm8xIikgPSBkc3Q7CiAJCXJlZ2lzdGVyIGludCBsIGFzbSgiZzEiKSA9IGxlbjsKLQkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHMgYXNtKCJnNyIpID0gc3VtOworCQlyZWdpc3RlciBfX3dzdW0gcyBhc20oImc3IikgPSBzdW07CiAKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAogCQkiLnNlY3Rpb24gX19leF90YWJsZSwjYWxsb2Ncblx0IgpAQCAtMTE2LDcgKzEwOSw3IEBACiAJCTogIm8yIiwgIm8zIiwgIm80IiwgIm81IiwgIm83IiwKIAkJICAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLAogCQkgICJjYyIsICJtZW1vcnkiKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXQ7CiAJfQogfQogCkBAIC0xMjYsMTAgKzExOSw5IEBACiAvKiBpaGwgaXMgYWx3YXlzIDUgb3IgZ3JlYXRlciwgYWxtb3N0IGFsd2F5cyBpcyA1LCBhbmQgaXBoIGlzIHdvcmQgYWxpZ25lZAogICogdGhlIG1ham9yaXR5IG9mIHRoZSB0aW1lLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICppcGgsCi0JCQkJCSAgdW5zaWduZWQgaW50IGlobCkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQogewotCXVuc2lnbmVkIHNob3J0IHN1bTsKKwlfX3N1bTE2IHN1bTsKIAogCS8qIE5vdGU6IFdlIG11c3QgcmVhZCAlMiBiZWZvcmUgd2UgdG91Y2ggJTAgZm9yIHRoZSBmaXJzdCB0aW1lLAogCSAqICAgICAgIGJlY2F1c2UgR0NDIGNhbiBsZWdpdGltYXRlbHkgdXNlIHRoZSBzYW1lIHJlZ2lzdGVyIGZvcgpAQCAtMTY0LDcgKzE1Niw3IEBACiB9CiAKIC8qIEZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtIHdpdGhvdXQgYWRkaW5nIHBzZXVkbyBoZWFkZXJzLiAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9mb2xkKHVuc2lnbmVkIGludCBzdW0pCitzdGF0aWMgaW5saW5lIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIApAQCAtMTczLDIzICsxNjUsMjIgQEAKIAkJCSAgICAgImFkZHhcdCUxLCAlJWcwLCAlMVxuXHQiCiAJCQkgICAgICJ4bm9yXHQlJWcwLCAlMSwgJTAiCiAJCQkgICAgIDogIj0mciIgKHN1bSksICI9ciIgKHRtcCkKLQkJCSAgICAgOiAiMCIgKHN1bSksICIxIiAoc3VtPDwxNikKKwkJCSAgICAgOiAiMCIgKHN1bSksICIxIiAoKF9fZm9yY2UgdTMyKXN1bTw8MTYpCiAJCQkgICAgIDogImNjIik7Ci0JcmV0dXJuIHN1bTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuLAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkgICAgICAgX193c3VtIHN1bSkKIHsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYWRkY2NcdCUxLCAlMCwgJTBcblx0IgogCQkJICAgICAiYWRkeGNjXHQlMiwgJTAsICUwXG5cdCIKIAkJCSAgICAgImFkZHhjY1x0JTMsICUwLCAlMFxuXHQiCiAJCQkgICAgICJhZGR4XHQlMCwgJSVnMCwgJTBcblx0IgogCQkJICAgICA6ICI9ciIgKHN1bSksICI9ciIgKHNhZGRyKQotCQkJICAgICA6ICJyIiAoZGFkZHIpLCAiciIgKChwcm90bzw8MTYpK2xlbiksICIwIiAoc3VtKSwKKwkJCSAgICAgOiAiciIgKGRhZGRyKSwgInIiIChwcm90byArIGxlbiksICIwIiAoc3VtKSwKIAkJCSAgICAgICAiMSIgKHNhZGRyKQogCQkJICAgICA6ICJjYyIpOwogCXJldHVybiBzdW07CkBAIC0xOTksMjIgKzE5MCwyMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKSAKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkJIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgX191MzIgbGVuLAotCQkJCQkJIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJIHVuc2lnbmVkIGludCBzdW0pIAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJICAgICAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkgICAgICBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fICgKIAkJImFkZGNjCSUzLCAlNCwgJSVnNFxuXHQiCkBAIC0yNDUsNyArMjM0LDcgQEAKIH0KIAogLyogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seSBpbiBpY21wLmMgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQogewogCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvZWxmLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9lbGYuaAppbmRleCA4M2EzZGQxLi5hYWY2ZWY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9lbGYuaApAQCAtOCwxMSArOCw2IEBACiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8YXNtL21idXMuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2VuZGlmCi0KIC8qCiAgKiBTcGFyYyBzZWN0aW9uIHR5cGVzCiAgKi8KQEAgLTc3LDYgKzcyLDIzIEBACiAjZGVmaW5lIEVMRl9OR1JFRyAzOAogdHlwZWRlZiBlbGZfZ3JlZ190IGVsZl9ncmVnc2V0X3RbRUxGX05HUkVHXTsKIAordHlwZWRlZiBzdHJ1Y3QgeworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZwlwcl9yZWdzWzMyXTsKKwkJZG91YmxlCQlwcl9kcmVnc1sxNl07CisJfSBwcl9mcjsKKwl1bnNpZ25lZCBsb25nIF9fdW51c2VkOworCXVuc2lnbmVkIGxvbmcJcHJfZnNyOworCXVuc2lnbmVkIGNoYXIJcHJfcWNudDsKKwl1bnNpZ25lZCBjaGFyCXByX3FfZW50cnlzaXplOworCXVuc2lnbmVkIGNoYXIJcHJfZW47CisJdW5zaWduZWQgaW50CXByX3FbNjRdOworfSBlbGZfZnByZWdzZXRfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20vbWJ1cy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKIC8qIEZvcm1hdCBpczoKICAqIAlHMCAtLT4gRzcKICAqCU8wIC0tPiBPNwpAQCAtOTksMjAgKzExMSw3IEBACiAJZGVzdFszNF0gPSBzcmMtPm5wYzsJCQkJXAogCWRlc3RbMzVdID0gc3JjLT55OwkJCQlcCiAJZGVzdFszNl0gPSBkZXN0WzM3XSA9IDA7IC8qIFhYWCAqLwkJXAotfSB3aGlsZSgwKTsgLyogSmFuaXRvcnM6IERvbid0IHRvdWNoIHRoaXMgY29sb24uICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bmlvbiB7Ci0JCXVuc2lnbmVkIGxvbmcJcHJfcmVnc1szMl07Ci0JCWRvdWJsZQkJcHJfZHJlZ3NbMTZdOwotCX0gcHJfZnI7Ci0JdW5zaWduZWQgbG9uZyBfX3VudXNlZDsKLQl1bnNpZ25lZCBsb25nCXByX2ZzcjsKLQl1bnNpZ25lZCBjaGFyCXByX3FjbnQ7Ci0JdW5zaWduZWQgY2hhcglwcl9xX2VudHJ5c2l6ZTsKLQl1bnNpZ25lZCBjaGFyCXByX2VuOwotCXVuc2lnbmVkIGludAlwcl9xWzY0XTsKLX0gZWxmX2ZwcmVnc2V0X3Q7Cit9IHdoaWxlKDApOyAvKiBKYW5pdG9yczogRG9uJ3QgdG91Y2ggdGhpcyBzZW1pY29sb24uICovCiAKICNkZWZpbmUgRUxGX0NPUkVfQ09QWV9UQVNLX1JFR1MoX190c2ssIF9fZWxmX3JlZ3MpCVwKIAkoeyBFTEZfQ09SRV9DT1BZX1JFR1MoKCooX19lbGZfcmVncykpLCAoX190c2spLT50aHJlYWQua3JlZ3MpOyAxOyB9KQpAQCAtMTY1LDggKzE2NCw4IEBACiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNCShOVUxMKQogCi0jaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoKGliY3MyKT9QRVJfU1ZSNDpQRVJfTElOVVgpCi0jZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qICEoX19BU01TUEFSQ19FTEZfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1zcGFyYy90ZXJtYml0cy5oCmluZGV4IDE3OTRkNzEuLjVlYjAwYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvdGVybWJpdHMuaApAQCAtMzEsNiArMzEsMTggQEAKICNlbmRpZgogfTsKIAorc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCWNjX3QgX3hfY2NbMl07ICAgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0aGVtIHRvIGhvbGQgdm1pbi92dGltZSAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKIC8qIGNfY2MgY2hhcmFjdGVycyAqLwogI2RlZmluZSBWSU5UUiAgICAwCiAjZGVmaW5lIFZRVUlUICAgIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmgKaW5kZXggYzdhNDk1YS4uZDViMmY4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmgKQEAgLTMxOCwxNDQgKzMxOCwxNyBAQAogI2RlZmluZSBfX05SX3Vuc2hhcmUJCTI5OQogI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkzMDAKICNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJMzAxCisjZGVmaW5lIF9fTlJfbWlncmF0ZV9wYWdlcwkzMDIKKworI2RlZmluZSBOUl9TWVNDQUxMUwkJMzAzCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0vKiBXQVJOSU5HOiBZb3UgTUFZIE5PVCBhZGQgc3lzY2FsbCBudW1iZXJzIGxhcmdlciB0aGFuIDMwMSwgc2luY2UKKy8qIFdBUk5JTkc6IFlvdSBNQVkgTk9UIGFkZCBzeXNjYWxsIG51bWJlcnMgbGFyZ2VyIHRoYW4gMzAyLCBzaW5jZQogICogICAgICAgICAgYWxsIG9mIHRoZSBzeXNjYWxsIHRhYmxlcyBpbiB0aGUgU3BhcmMga2VybmVsIGFyZQotICogICAgICAgICAgc2l6ZWQgdG8gaGF2ZSAzMDEgZW50cmllcyAoc3RhcnRpbmcgYXQgemVybykuICBUaGVyZWZvcmUKLSAqICAgICAgICAgIGZpbmQgYSBmcmVlIHNsb3QgaW4gdGhlIDAtMzAxIHJhbmdlLgorICogICAgICAgICAgc2l6ZWQgdG8gaGF2ZSAzMDIgZW50cmllcyAoc3RhcnRpbmcgYXQgemVybykuICBUaGVyZWZvcmUKKyAqICAgICAgICAgIGZpbmQgYSBmcmVlIHNsb3QgaW4gdGhlIDAtMzAyIHJhbmdlLgogICovCiAKLSNkZWZpbmUgX3N5c2NhbGwwKHR5cGUsbmFtZSkgXAotdHlwZSBuYW1lKHZvaWQpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotcmVnaXN0ZXIgbG9uZyBfX2cxIF9fYXNtX18gKCJnMSIpID0gX19OUl8jI25hbWU7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidCAweDEwXG5cdCIgXAotCQkgICAgICAiYmNjIDFmXG5cdCIgXAotCQkgICAgICAibW92ICUlbzAsICUwXG5cdCIgXAotCQkgICAgICAic3ViICUlZzAsICUlbzAsICUwXG5cdCIgXAotCQkgICAgICAiMTpcblx0IiBcCi0JCSAgICAgIDogIj1yIiAoX19yZXMpXAotCQkgICAgICA6ICJyIiAoX19nMSkgXAotCQkgICAgICA6ICJvMCIsICJjYyIpOyBcCi1pZiAoX19yZXMgPCAtMjU1IHx8IF9fcmVzID49IDApIFwKLSAgICByZXR1cm4gKHR5cGUpIF9fcmVzOyBcCi1lcnJubyA9IC1fX3JlczsgXAotcmV0dXJuIC0xOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwxKHR5cGUsbmFtZSx0eXBlMSxhcmcxKSBcCi10eXBlIG5hbWUodHlwZTEgYXJnMSkgXAoteyBcCi1sb25nIF9fcmVzOyBcCi1yZWdpc3RlciBsb25nIF9fZzEgX19hc21fXyAoImcxIikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX28wIF9fYXNtX18gKCJvMCIpID0gKGxvbmcpKGFyZzEpOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInQgMHgxMFxuXHQiIFwKLQkJICAgICAgImJjYyAxZlxuXHQiIFwKLQkJICAgICAgIm1vdiAlJW8wLCAlMFxuXHQiIFwKLQkJICAgICAgInN1YiAlJWcwLCAlJW8wLCAlMFxuXHQiIFwKLQkJICAgICAgIjE6XG5cdCIgXAotCQkgICAgICA6ICI9ciIgKF9fcmVzKSwgIj0mciIgKF9fbzApIFwKLQkJICAgICAgOiAiMSIgKF9fbzApLCAiciIgKF9fZzEpIFwKLQkJICAgICAgOiAiY2MiKTsgXAotaWYgKF9fcmVzIDwgLTI1NSB8fCBfX3JlcyA+PSAwKSBcCi0JcmV0dXJuICh0eXBlKSBfX3JlczsgXAotZXJybm8gPSAtX19yZXM7IFwKLXJldHVybiAtMTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyKSBcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLXJlZ2lzdGVyIGxvbmcgX19nMSBfX2FzbV9fICgiZzEiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fbzAgX19hc21fXyAoIm8wIikgPSAobG9uZykoYXJnMSk7IFwKLXJlZ2lzdGVyIGxvbmcgX19vMSBfX2FzbV9fICgibzEiKSA9IChsb25nKShhcmcyKTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0IDB4MTBcblx0IiBcCi0JCSAgICAgICJiY2MgMWZcblx0IiBcCi0JCSAgICAgICJtb3YgJSVvMCwgJTBcblx0IiBcCi0JCSAgICAgICJzdWIgJSVnMCwgJSVvMCwgJTBcblx0IiBcCi0JCSAgICAgICIxOlxuXHQiIFwKLQkJICAgICAgOiAiPXIiIChfX3JlcyksICI9JnIiIChfX28wKSBcCi0JCSAgICAgIDogIjEiIChfX28wKSwgInIiIChfX28xKSwgInIiIChfX2cxKSBcCi0JCSAgICAgIDogImNjIik7IFwKLWlmIChfX3JlcyA8IC0yNTUgfHwgX19yZXMgPj0gMCkgXAotCXJldHVybiAodHlwZSkgX19yZXM7IFwKLWVycm5vID0gLV9fcmVzOyBcCi1yZXR1cm4gLTE7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDModHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczKSBcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotcmVnaXN0ZXIgbG9uZyBfX2cxIF9fYXNtX18gKCJnMSIpID0gX19OUl8jI25hbWU7IFwKLXJlZ2lzdGVyIGxvbmcgX19vMCBfX2FzbV9fICgibzAiKSA9IChsb25nKShhcmcxKTsgXAotcmVnaXN0ZXIgbG9uZyBfX28xIF9fYXNtX18gKCJvMSIpID0gKGxvbmcpKGFyZzIpOyBcCi1yZWdpc3RlciBsb25nIF9fbzIgX19hc21fXyAoIm8yIikgPSAobG9uZykoYXJnMyk7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidCAweDEwXG5cdCIgXAotCQkgICAgICAiYmNjIDFmXG5cdCIgXAotCQkgICAgICAibW92ICUlbzAsICUwXG5cdCIgXAotCQkgICAgICAic3ViICUlZzAsICUlbzAsICUwXG5cdCIgXAotCQkgICAgICAiMTpcblx0IiBcCi0JCSAgICAgIDogIj1yIiAoX19yZXMpLCAiPSZyIiAoX19vMCkgXAotCQkgICAgICA6ICIxIiAoX19vMCksICJyIiAoX19vMSksICJyIiAoX19vMiksICJyIiAoX19nMSkgXAotCQkgICAgICA6ICJjYyIpOyBcCi1pZiAoX19yZXMgPCAtMjU1IHx8IF9fcmVzPj0wKSBcCi0JcmV0dXJuICh0eXBlKSBfX3JlczsgXAotZXJybm8gPSAtX19yZXM7IFwKLXJldHVybiAtMTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNCh0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCkgXAotdHlwZSBuYW1lICh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0KSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLXJlZ2lzdGVyIGxvbmcgX19nMSBfX2FzbV9fICgiZzEiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fbzAgX19hc21fXyAoIm8wIikgPSAobG9uZykoYXJnMSk7IFwKLXJlZ2lzdGVyIGxvbmcgX19vMSBfX2FzbV9fICgibzEiKSA9IChsb25nKShhcmcyKTsgXAotcmVnaXN0ZXIgbG9uZyBfX28yIF9fYXNtX18gKCJvMiIpID0gKGxvbmcpKGFyZzMpOyBcCi1yZWdpc3RlciBsb25nIF9fbzMgX19hc21fXyAoIm8zIikgPSAobG9uZykoYXJnNCk7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidCAweDEwXG5cdCIgXAotCQkgICAgICAiYmNjIDFmXG5cdCIgXAotCQkgICAgICAibW92ICUlbzAsICUwXG5cdCIgXAotCQkgICAgICAic3ViICUlZzAsICUlbzAsICUwXG5cdCIgXAotCQkgICAgICAiMTpcblx0IiBcCi0JCSAgICAgIDogIj1yIiAoX19yZXMpLCAiPSZyIiAoX19vMCkgXAotCQkgICAgICA6ICIxIiAoX19vMCksICJyIiAoX19vMSksICJyIiAoX19vMiksICJyIiAoX19vMyksICJyIiAoX19nMSkgXAotCQkgICAgICA6ICJjYyIpOyBcCi1pZiAoX19yZXMgPCAtMjU1IHx8IF9fcmVzPj0wKSBcCi0JcmV0dXJuICh0eXBlKSBfX3JlczsgXAotZXJybm8gPSAtX19yZXM7IFwKLXJldHVybiAtMTsgXAotfSAKLQotI2RlZmluZSBfc3lzY2FsbDUodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsIFwKLQkgIHR5cGU1LGFyZzUpIFwKLXR5cGUgbmFtZSAodHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMsdHlwZTQgYXJnNCx0eXBlNSBhcmc1KSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLXJlZ2lzdGVyIGxvbmcgX19nMSBfX2FzbV9fICgiZzEiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fbzAgX19hc21fXyAoIm8wIikgPSAobG9uZykoYXJnMSk7IFwKLXJlZ2lzdGVyIGxvbmcgX19vMSBfX2FzbV9fICgibzEiKSA9IChsb25nKShhcmcyKTsgXAotcmVnaXN0ZXIgbG9uZyBfX28yIF9fYXNtX18gKCJvMiIpID0gKGxvbmcpKGFyZzMpOyBcCi1yZWdpc3RlciBsb25nIF9fbzMgX19hc21fXyAoIm8zIikgPSAobG9uZykoYXJnNCk7IFwKLXJlZ2lzdGVyIGxvbmcgX19vNCBfX2FzbV9fICgibzQiKSA9IChsb25nKShhcmc1KTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0IDB4MTBcblx0IiBcCi0JCSAgICAgICJiY2MgMWZcblx0IiBcCi0JCSAgICAgICJtb3YgJSVvMCwgJTBcblx0IiBcCi0JCSAgICAgICJzdWIgJSVnMCwgJSVvMCwgJTBcblx0IiBcCi0JCSAgICAgICIxOlxuXHQiIFwKLQkJICAgICAgOiAiPXIiIChfX3JlcyksICI9JnIiIChfX28wKSBcCi0JCSAgICAgIDogIjEiIChfX28wKSwgInIiIChfX28xKSwgInIiIChfX28yKSwgInIiIChfX28zKSwgInIiIChfX280KSwgInIiIChfX2cxKSBcCi0JCSAgICAgIDogImNjIik7IFwKLWlmIChfX3JlcyA8IC0yNTUgfHwgX19yZXM+PTApIFwKLQlyZXR1cm4gKHR5cGUpIF9fcmVzOyBcCi1lcnJubyA9IC1fX3JlczsgXAotcmV0dXJuIC0xOyBcCi19Ci0KICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKICNkZWZpbmUgX19BUkNIX1dBTlRfU1RBVDY0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY2FjaGVmbHVzaC5oCmluZGV4IDc0NWQxYWIuLjEyMmU0MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY2FjaGVmbHVzaC5oCkBAIC0xMiw2ICsxMiw3IEBACiAvKiBUaGVzZSBhcmUgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgaXMgYW4gU01QIGtlcm5lbCBvciBub3QuICovCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKF9fbW0pIFwKIAlkbyB7IGlmICgoX19tbSkgPT0gY3VycmVudC0+bW0pIGZsdXNod191c2VyKCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKSBmbHVzaF9jYWNoZV9tbShtbSkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKSBcCiAJZmx1c2hfY2FjaGVfbW0oKHZtYSktPnZtX21tKQogI2RlZmluZSBmbHVzaF9jYWNoZV9wYWdlKHZtYSwgcGFnZSwgcGZuKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NoZWNrc3VtLmgKaW5kZXggZGM4YmVkMi4uNzBhMDA2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY2hlY2tzdW0uaApAQCAtMzAsNyArMzAsNyBAQAogICoKICAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICogYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIC8qIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHVzZXIgc3BhY2Ugd2hpbGUgaXQKICAqIGNoZWNrc3VtcwpAQCAtMzgsNTIgKzM4LDUwIEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkJICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJCSAgICAgIGludCBsZW4sIF9fd3N1bSBzdW0pOwogCi1leHRlcm4gbG9uZyBfX2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqc3JjLAotCQkJCQkgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgc3VtKTsKK2V4dGVybiBsb25nIF9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsCisJCQkJCSAgdm9pZCAqZHN0LCBpbnQgbGVuLAorCQkJCQkgIF9fd3N1bSBzdW0pOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsCi0JCQkgICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLAotCQkJICAgIHVuc2lnbmVkIGludCBzdW0sIGludCAqZXJyKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLAorCQkJICAgIHZvaWQgKmRzdCwgaW50IGxlbiwKKwkJCSAgICBfX3dzdW0gc3VtLCBpbnQgKmVycikKIHsKIAlsb25nIHJldCA9IF9fY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSk7CiAJaWYgKHJldCA8IDApCiAJCSplcnIgPSAtRUZBVUxUOwotCXJldHVybiAodW5zaWduZWQgaW50KSByZXQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSkgcmV0OwogfQogCiAvKiAKICAqCUNvcHkgYW5kIGNoZWNrc3VtIHRvIHVzZXIKICAqLwogI2RlZmluZSBIQVZFX0NTVU1fQ09QWV9VU0VSCi1leHRlcm4gbG9uZyBfX2NzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkJCQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqZHN0LCBpbnQgbGVuLAotCQkJCQkgIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIGxvbmcgX19jc3VtX3BhcnRpYWxfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywKKwkJCQkJdm9pZCBfX3VzZXIgKmRzdCwgaW50IGxlbiwKKwkJCQkJICBfX3dzdW0gc3VtKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNzdW1fYW5kX2NvcHlfdG9fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICpkc3QsIGludCBsZW4sCi0JCSAgICAgIHVuc2lnbmVkIGludCBzdW0sIGludCAqZXJyKQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fYW5kX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsCisJCSAgICAgIHZvaWQgX191c2VyICpkc3QsIGludCBsZW4sCisJCSAgICAgIF9fd3N1bSBzdW0sIGludCAqZXJyKQogewogCWxvbmcgcmV0ID0gX19jc3VtX3BhcnRpYWxfY29weV90b191c2VyKHNyYywgZHN0LCBsZW4sIHN1bSk7CiAJaWYgKHJldCA8IDApCiAJCSplcnIgPSAtRUZBVUxUOwotCXJldHVybiAodW5zaWduZWQgaW50KSByZXQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSkgcmV0OwogfQogCiAvKiBpaGwgaXMgYWx3YXlzIDUgb3IgZ3JlYXRlciwgYWxtb3N0IGFsd2F5cyBpcyA1LCBhbmQgaXBoIGlzIHdvcmQgYWxpZ25lZAogICogdGhlIG1ham9yaXR5IG9mIHRoZSB0aW1lLgogICovCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKF9fY29uc3RfXyB1bnNpZ25lZCBjaGFyICppcGgsCi0JCQkJICAgdW5zaWduZWQgaW50IGlobCk7CitleHRlcm4gX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKIAogLyogRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0gd2l0aG91dCBhZGRpbmcgcHNldWRvIGhlYWRlcnMuICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCXVuc2lnbmVkIGludCB0bXA7CiAKQEAgLTkzLDE2ICs5MSwxNSBAQAogIglhZGRjCQklMSwgJSVnMCwgJTFcbiIKICIJeG5vcgkJJSVnMCwgJTEsICUwXG4iCiAJOiAiPSZyIiAoc3VtKSwgIj1yIiAodG1wKQotCTogIjAiIChzdW0pLCAiMSIgKHN1bTw8MTYpCisJOiAiMCIgKHN1bSksICIxIiAoKF9fZm9yY2UgdTMyKXN1bTw8MTYpCiAJOiAiY2MiKTsKLQlyZXR1cm4gKHN1bSAmIDB4ZmZmZik7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpc3VtOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGxlbiwKIAkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHN1bSkKKwkJCQkJICAgICAgIF9fd3N1bSBzdW0pCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAiCWFkZGNjCQklMSwgJTAsICUwXG4iCkBAIC0xMTAsNyArMTA3LDcgQEAKICIJYWRkY2NjCQklMywgJTAsICUwXG4iCiAiCWFkZGMJCSUwLCAlJWcwLCAlMFxuIgogCTogIj1yIiAoc3VtKSwgIj1yIiAoc2FkZHIpCi0JOiAiciIgKGRhZGRyKSwgInIiICgocHJvdG88PDE2KStsZW4pLCAiMCIgKHN1bSksICIxIiAoc2FkZHIpCisJOiAiciIgKGRhZGRyKSwgInIiIChwcm90byArIGxlbiksICIwIiAoc3VtKSwgIjEiIChzYWRkcikKIAk6ICJjYyIpOwogCXJldHVybiBzdW07CiB9CkBAIC0xMTksMjIgKzExNiwyMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKSAKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCiB7CiAJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IGNzdW1faXB2Nl9tYWdpYyhzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkJIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgX191MzIgbGVuLAotCQkJCQkJIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJIHVuc2lnbmVkIGludCBzdW0pIAorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJICAgICAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkgICAgICBfX3dzdW0gc3VtKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fICgKICIJYWRkY2MJCSUzLCAlNCwgJSVnN1xuIgpAQCAtMTY1LDcgKzE2MCw3IEBACiB9CiAKIC8qIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkgaW4gaWNtcC5jICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2NvbXB1dGVfY3N1bSh1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oCmluZGV4IGM3MzkzNWQuLjM2NTExY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaApAQCAtMTY0LDcgKzE2NCw3IEBACiAJcmV0dXJuICh1MzIpKHVuc2lnbmVkIGxvbmcpdXB0cjsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3VzZXIgKmNvbXBhdF9hbGxvY191c2VyX3NwYWNlKGxvbmcgbGVuKQorc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobG9uZyBsZW4pCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmtyZWdzOwogCXVuc2lnbmVkIGxvbmcgdXNwID0gcmVncy0+dV9yZWdzW1VSRUdfSTZdOwpAQCAtMTc0LDcgKzE3NCwxMCBAQAogCWVsc2UKIAkJdXNwICY9IDB4ZmZmZmZmZmZVTDsKIAotCXJldHVybiAodm9pZCBfX3VzZXIgKikgKHVzcCAtIGxlbik7CisJdXNwIC09IGxlbjsKKwl1c3AgJj0gfjB4N1VMOworCisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSB1c3A7CiB9CiAKIHN0cnVjdCBjb21wYXRfaXBjNjRfcGVybSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2RldmljZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2RtYS1tYXBwaW5nLmgKaW5kZXggMjdjNDZmYi4uMmY4NThhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZG1hLW1hcHBpbmcuaApAQCAtMTgxLDcgKzE4MSw3IEBACiAKICNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQogI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkKQkoMSkKKyNkZWZpbmUgZG1hX2lzX2NvbnNpc3RlbnQoZCwgaCkJKDEpCiAKIHN0YXRpYyBpbmxpbmUgaW50CiBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKQpAQCAtMjEwLDcgKzIxMCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAorZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCiAJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAkvKiBjb3VsZCBkZWZpbmUgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgZG1hX2NhY2hlIC4uLiBvcGVyYXRpb25zLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9kbWEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZG1hLmgKaW5kZXggMjdmNjU5Ny4uOTNlNWEwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9kbWEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2RtYS5oCkBAIC0xNTIsOSArMTUyLDkgQEAKICNkZWZpbmUgRE1BX01BWEVORChhZGRyKSAoMHgwMTAwMDAwMFVMLSgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKSYweDAwZmZmZmZmVUwpKQogCiAvKiBZZXMsIEkgaGFjayBhIGxvdCBvZiBlbGlzcCBpbiBteSBzcGFyZSB0aW1lLi4uICovCi0jZGVmaW5lIERNQV9FUlJPUl9QKHJlZ3MpICAoKChzYnVzX3JlYWRsKChyZWdzKSArIERNQV9DU1IpICYgRE1BX0hORExfRVJST1IpKQotI2RlZmluZSBETUFfSVJRX1AocmVncykgICAgKCgoc2J1c19yZWFkbCgocmVncykgKyBETUFfQ1NSKSkgJiAoRE1BX0hORExfSU5UUiB8IERNQV9ITkRMX0VSUk9SKSkpCi0jZGVmaW5lIERNQV9XUklURV9QKHJlZ3MpICAoKChzYnVzX3JlYWRsKChyZWdzKSArIERNQV9DU1IpICYgRE1BX1NUX1dSSVRFKSkKKyNkZWZpbmUgRE1BX0VSUk9SX1AocmVncykgICgoc2J1c19yZWFkbCgocmVncykgKyBETUFfQ1NSKSAmIERNQV9ITkRMX0VSUk9SKSkKKyNkZWZpbmUgRE1BX0lSUV9QKHJlZ3MpICAgICgoc2J1c19yZWFkbCgocmVncykgKyBETUFfQ1NSKSkgJiAoRE1BX0hORExfSU5UUiB8IERNQV9ITkRMX0VSUk9SKSkKKyNkZWZpbmUgRE1BX1dSSVRFX1AocmVncykgICgoc2J1c19yZWFkbCgocmVncykgKyBETUFfQ1NSKSAmIERNQV9TVF9XUklURSkpCiAjZGVmaW5lIERNQV9PRkYoX19yZWdzKQkJXAogZG8gewl1MzIgdG1wID0gc2J1c19yZWFkbCgoX19yZWdzKSArIERNQV9DU1IpOyBcCiAJdG1wICY9IH5ETUFfRU5BQkxFOyBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Z1dGV4LmgKaW5kZXggZGVlNDAyMC4uODc2MzEyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mdXRleC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZnV0ZXguaApAQCAtNDUsNyArNDUsNyBAQAogCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKIAkJb3BhcmcgPSAxIDw8IG9wYXJnOwogCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCiAJc3dpdGNoIChvcCkgewogCWNhc2UgRlVURVhfT1BfU0VUOgpAQCAtNjcsNyArNjcsNyBAQAogCQlyZXQgPSAtRU5PU1lTOwogCX0KIAotCWRlY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2VuYWJsZSgpOwogCiAJaWYgKCFyZXQpIHsKIAkJc3dpdGNoIChjbXApIHsKQEAgLTg3LDI0ICs4NywyMiBAQAogZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWMoaW50IF9fdXNlciAqdWFkZHIsIGludCBvbGR2YWwsIGludCBuZXd2YWwpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIlxuMToJbGR1d2EJWyUyXSAlJWFzaSwgJTBcbiIKLQkiMjoJY2FzYQlbJTJdICUlYXNpLCAlMCwgJTFcbiIKLQkiMzpcbiIKKwkiXG4xOgljYXNhCVslM10gJSVhc2ksICUyLCAlMFxuIgorCSIyOlxuIgogCSIJLnNlY3Rpb24gLmZpeHVwLCNhbGxvYywjZXhlY2luc3RyXG4iCiAJIgkuYWxpZ24JNFxuIgotCSI0OgliYQkzYlxuIgotCSIJIG1vdgklMywgJTBcbiIKKwkiMzoJYmEJMmJcbiIKKwkiCSBtb3YJJTQsICUwXG4iCiAJIgkucHJldmlvdXNcbiIKIAkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKIAkiCS5hbGlnbgk0XG4iCi0JIgkud29yZAkxYiwgNGJcbiIKLQkiCS53b3JkCTJiLCA0YlxuIgorCSIJLndvcmQJMWIsIDNiXG4iCiAJIgkucHJldmlvdXNcbiIKLQk6ICI9JnIiIChvbGR2YWwpCi0JOiAiciIgKG5ld3ZhbCksICJyIiAodWFkZHIpLCAiaSIgKC1FRkFVTFQpCisJOiAiPXIiIChuZXd2YWwpCisJOiAiMCIgKG5ld3ZhbCksICJyIiAob2xkdmFsKSwgInIiICh1YWRkciksICJpIiAoLUVGQVVMVCkKIAk6ICJtZW1vcnkiKTsKIAotCXJldHVybiBvbGR2YWw7CisJcmV0dXJuIG5ld3ZhbDsKIH0KIAogI2VuZGlmIC8qICEoX1NQQVJDNjRfRlVURVhfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxZmxhZ3MuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjRmYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnFmbGFncy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1zcGFyYzY0L2lycWZsYWdzLmgKKyAqCisgKiBJUlEgZmxhZ3MgaGFuZGxpbmcKKyAqCisgKiBUaGlzIGZpbGUgZ2V0cyBpbmNsdWRlZCBmcm9tIGxvd2xldmVsIGFzbSBoZWFkZXJzIHRvbywgdG8gcHJvdmlkZQorICogd3JhcHBlZCB2ZXJzaW9ucyBvZiB0aGUgbG9jYWxfaXJxXyooKSBBUElzLCBiYXNlZCBvbiB0aGUKKyAqIHJhd19sb2NhbF9pcnFfKigpIGZ1bmN0aW9ucyBmcm9tIHRoZSBsb3dsZXZlbCBoZWFkZXJzLgorICovCisjaWZuZGVmIF9BU01fSVJRRkxBR1NfSAorI2RlZmluZSBfQVNNX0lSUUZMQUdTX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJyZHByCSUlcGlsLCAlMCIKKwkJOiAiPXIiIChmbGFncykKKwkpOworCisJcmV0dXJuIGZsYWdzOworfQorCisjZGVmaW5lIHJhd19sb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKSBcCisJCWRvIHsgKGZsYWdzKSA9IF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3MoKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIHJhd19sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkid3JwcgklMCwgJSVwaWwiCisJCTogLyogbm8gb3V0cHV0ICovCisJCTogInIiIChmbGFncykKKwkJOiAibWVtb3J5IgorCSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIndycHIJMTUsICUlcGlsIgorCQk6IC8qIG5vIG91dHB1dHMgKi8KKwkJOiAvKiBubyBpbnB1dHMgKi8KKwkJOiAibWVtb3J5IgorCSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYXdfbG9jYWxfaXJxX2VuYWJsZSh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkid3JwcgkwLCAlJXBpbCIKKwkJOiAvKiBubyBvdXRwdXRzICovCisJCTogLyogbm8gaW5wdXRzICovCisJCTogIm1lbW9yeSIKKwkpOworfQorCitzdGF0aWMgaW5saW5lIGludCByYXdfaXJxc19kaXNhYmxlZF9mbGFncyh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiAoZmxhZ3MgPiAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmF3X2lycXNfZGlzYWJsZWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gX19yYXdfbG9jYWxfc2F2ZV9mbGFncygpOworCisJcmV0dXJuIHJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKTsKK30KKworLyoKKyAqIEZvciBzcGlubG9ja3MsIGV0YzoKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmF3X2xvY2FsX2lycV9zYXZlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IF9fcmF3X2xvY2FsX3NhdmVfZmxhZ3MoKTsKKworCXJhd19sb2NhbF9pcnFfZGlzYWJsZSgpOworCisJcmV0dXJuIGZsYWdzOworfQorCisjZGVmaW5lIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncykgXAorCQlkbyB7IChmbGFncykgPSBfX3Jhd19sb2NhbF9pcnFfc2F2ZSgpOyB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogKF9fQVNTRU1CTFlfXykgKi8KKworI2VuZGlmIC8qICEoX0FTTV9JUlFGTEFHU19IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2twcm9iZXMuaAppbmRleCBjOWY1YzM0Li5iZWNjMzhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2twcm9iZXMuaApAQCAtMTMsNyArMTMsMTEgQEAKICNkZWZpbmUgSlBST0JFX0VOVFJZKHBlbnRyeSkJKGtwcm9iZV9vcGNvZGVfdCAqKXBlbnRyeQogI2RlZmluZSBhcmNoX3JlbW92ZV9rcHJvYmUocCkJZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lICBBUkNIX0lOQUNUSVZFX0tQUk9CRV9DT1VOVCAwCi0jZGVmaW5lIGZsdXNoX2luc25fc2xvdChwKQlkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZmx1c2hfaW5zbl9zbG90KHApCQlcCitkbyB7IAlmbHVzaGkoJihwKS0+YWluc24uaW5zblswXSk7CVwKKwlmbHVzaGkoJihwKS0+YWluc24uaW5zblsxXSk7CVwKK30gd2hpbGUgKDApCiAKIC8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb3B5IG9mIG9yaWdpbmFsIGluc3RydWN0aW9uKi8KIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gewpAQCAtMjMsNyArMjcsNyBAQAogCiBzdHJ1Y3QgcHJldl9rcHJvYmUgewogCXN0cnVjdCBrcHJvYmUgKmtwOwotCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBvcmlnX3RucGM7CiAJdW5zaWduZWQgbG9uZyBvcmlnX3RzdGF0ZV9waWw7CiB9OwpAQCAtMzMsMTAgKzM3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGtwcm9iZV9zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBrcHJvYmVfb3JpZ190bnBjOwogCXVuc2lnbmVkIGxvbmcga3Byb2JlX29yaWdfdHN0YXRlX3BpbDsKLQlsb25nICpqcHJvYmVfc2F2ZWRfZXNwOwogCXN0cnVjdCBwdF9yZWdzIGpwcm9iZV9zYXZlZF9yZWdzOwotCXN0cnVjdCBwdF9yZWdzICpqcHJvYmVfc2F2ZWRfcmVnc19sb2NhdGlvbjsKLQlzdHJ1Y3Qgc3BhcmNfc3RhY2tmIGpwcm9iZV9zYXZlZF9zdGFjazsKIAlzdHJ1Y3QgcHJldl9rcHJvYmUgcHJldl9rcHJvYmU7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaAppbmRleCBlMWVhNjdiLi5jYTY1NjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKQEAgLTE4LDYgKzE4LDggQEAKIAogI2RlZmluZSBQQ0lfSVJRX05PTkUJCTB4ZmZmZmZmZmYKIAorI2RlZmluZSBQQ0lfQ0FDSEVfTElORV9CWVRFUwk2NAorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCkBAIC0yOTEsMTAgKzI5Myw2IEBACiAJCQkgICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAogCQkJICAgICAgIGludCB3cml0ZV9jb21iaW5lKTsKIAotLyogUGxhdGZvcm0gc3BlY2lmaWMgTVdJIHN1cHBvcnQuICovCi0jZGVmaW5lIEhBVkVfQVJDSF9QQ0lfTVdJCi1leHRlcm4gaW50IHBjaWJpb3NfcHJlcF9td2koc3RydWN0IHBjaV9kZXYgKmRldik7Ci0KIGV4dGVybiB2b2lkCiBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKIAkJCXN0cnVjdCByZXNvdXJjZSAqcmVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ2FsbG9jLmgKaW5kZXggMDEwZjljZC4uNTg5MWZmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ2FsbG9jLmgKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiAvKiBQYWdlIHRhYmxlIGFsbG9jYXRpb24vZnJlZWluZy4gKi8KLWV4dGVybiBrbWVtX2NhY2hlX3QgKnBndGFibGVfY2FjaGU7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnBndGFibGVfY2FjaGU7CiAKIHN0YXRpYyBpbmxpbmUgcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcndzZW0uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcndzZW0uaAppbmRleCBjZWY1ZTgyLi4xMjk0YjdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3J3c2VtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9yd3NlbS5oCkBAIC0yMywyMCArMjMsMzMgQEAKIAlzaWduZWQgaW50IGNvdW50OwogCXNwaW5sb2NrX3QJCXdhaXRfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXdhaXRfbGlzdDsKKyNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQworCXN0cnVjdCBsb2NrZGVwX21hcAlkZXBfbWFwOworI2VuZGlmCiB9OwogCisjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKKyMgZGVmaW5lIF9fUldTRU1fREVQX01BUF9JTklUKGxvY2tuYW1lKSAsIC5kZXBfbWFwID0geyAubmFtZSA9ICNsb2NrbmFtZSB9CisjZWxzZQorIyBkZWZpbmUgX19SV1NFTV9ERVBfTUFQX0lOSVQobG9ja25hbWUpCisjZW5kaWYKKwogI2RlZmluZSBfX1JXU0VNX0lOSVRJQUxJWkVSKG5hbWUpIFwKLXsgUldTRU1fVU5MT0NLRURfVkFMVUUsIFNQSU5fTE9DS19VTkxPQ0tFRCwgTElTVF9IRUFEX0lOSVQoKG5hbWUpLndhaXRfbGlzdCkgfQoreyBSV1NFTV9VTkxPQ0tFRF9WQUxVRSwgU1BJTl9MT0NLX1VOTE9DS0VELCBMSVNUX0hFQURfSU5JVCgobmFtZSkud2FpdF9saXN0KSBcCisgIF9fUldTRU1fREVQX01BUF9JTklUKG5hbWUpIH0KIAogI2RlZmluZSBERUNMQVJFX1JXU0VNKG5hbWUpIFwKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIG5hbWUgPSBfX1JXU0VNX0lOSVRJQUxJWkVSKG5hbWUpCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5pdF9yd3NlbShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCi17Ci0Jc2VtLT5jb3VudCA9IFJXU0VNX1VOTE9DS0VEX1ZBTFVFOwotCXNwaW5fbG9ja19pbml0KCZzZW0tPndhaXRfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNlbS0+d2FpdF9saXN0KTsKLX0KK2V4dGVybiB2b2lkIF9faW5pdF9yd3NlbShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpOworCisjZGVmaW5lIGluaXRfcndzZW0oc2VtKQkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IF9fa2V5OwkJCVwKKwkJCQkJCQkJXAorCV9faW5pdF9yd3NlbSgoc2VtKSwgI3NlbSwgJl9fa2V5KTsJCQlcCit9IHdoaWxlICgwKQogCiBleHRlcm4gdm9pZCBfX2Rvd25fcmVhZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pOwogZXh0ZXJuIGludCBfX2Rvd25fcmVhZF90cnlsb2NrKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSk7CkBAIC00Niw2ICs1OSwxMSBAQAogZXh0ZXJuIHZvaWQgX191cF93cml0ZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pOwogZXh0ZXJuIHZvaWQgX19kb3duZ3JhZGVfd3JpdGUoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKTsKIAorc3RhdGljIGlubGluZSB2b2lkIF9fZG93bl93cml0ZV9uZXN0ZWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtLCBpbnQgc3ViY2xhc3MpCit7CisJX19kb3duX3dyaXRlKHNlbSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHJ3c2VtX2F0b21pY191cGRhdGUoaW50IGRlbHRhLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCiB7CiAJcmV0dXJuIGF0b21pY19hZGRfcmV0dXJuKGRlbHRhLCAoYXRvbWljX3QgKikoJnNlbS0+Y291bnQpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oCmluZGV4IGE4Yjc0MzIuLjMyMjgxYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaApAQCAtNyw2ICs3LDkgQEAKICNpbmNsdWRlIDxhc20vdmlzYXNtLmg+CiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorCiAvKgogICogU3BhcmMgKGdlbmVyYWwpIENQVSB0eXBlcwogICovCkBAIC03Miw1MiArNzUsNiBAQAogCiAjZW5kaWYKIAotI2RlZmluZSBzZXRpcGwoX19uZXdfaXBsKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIndycHIJJTAsICUlcGlsIiAgOiA6ICJyIiAoX19uZXdfaXBsKSA6ICJtZW1vcnkiKQotCi0jZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByCTE1LCAlJXBpbCIgOiA6IDogIm1lbW9yeSIpCi0KLSNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZSgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3JwcgkwLCAlJXBpbCIgOiA6IDogIm1lbW9yeSIpCi0KLSNkZWZpbmUgZ2V0aXBsKCkgXAotKHsgdW5zaWduZWQgbG9uZyByZXR2YWw7IF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHByCSUlcGlsLCAlMCIgOiAiPXIiIChyZXR2YWwpKTsgcmV0dmFsOyB9KQotCi0jZGVmaW5lIHN3YXBfcGlsKF9fbmV3X3BpbCkgXAotKHsJdW5zaWduZWQgbG9uZyByZXR2YWw7IFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmRwcgklJXBpbCwgJTBcblx0IiBcCi0JCQkgICAgICJ3cnByCSUxLCAlJXBpbCIgXAotCQkJICAgICA6ICI9JnIiIChyZXR2YWwpIFwKLQkJCSAgICAgOiAiciIgKF9fbmV3X3BpbCkgXAotCQkJICAgICA6ICJtZW1vcnkiKTsgXAotCXJldHZhbDsgXAotfSkKLQotI2RlZmluZSByZWFkX3BpbF9hbmRfY2xpKCkgXAotKHsJdW5zaWduZWQgbG9uZyByZXR2YWw7IFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmRwcgklJXBpbCwgJTBcblx0IiBcCi0JCQkgICAgICJ3cnByCTE1LCAlJXBpbCIgXAotCQkJICAgICA6ICI9ciIgKHJldHZhbCkgXAotCQkJICAgICA6IDogIm1lbW9yeSIpOyBcCi0JcmV0dmFsOyBcCi19KQotCi0jZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpCQkoKGZsYWdzKSA9IGdldGlwbCgpKQotI2RlZmluZSBsb2NhbF9pcnFfc2F2ZShmbGFncykJCSgoZmxhZ3MpID0gcmVhZF9waWxfYW5kX2NsaSgpKQotI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZShmbGFncykJCXNldGlwbCgoZmxhZ3MpKQotCi0vKiBPbiBzcGFyYzY0IElSUSBmbGFncyBhcmUgdGhlIFBJTCByZWdpc3Rlci4gIEEgdmFsdWUgb2YgemVybwotICogbWVhbnMgYWxsIGludGVycnVwdCBsZXZlbHMgYXJlIGVuYWJsZWQsIGFueSBvdGhlciB2YWx1ZSBtZWFucwotICogb25seSBJUlEgbGV2ZWxzIGdyZWF0ZXIgdGhhbiB0aGF0IHZhbHVlIHdpbGwgYmUgcmVjZWl2ZWQuCi0gKiBDb25zZXF1ZW50bHkgdGhpcyBtZWFucyB0aGF0IHRoZSBsb3dlc3QgSVJRIGxldmVsIGlzIG9uZS4KLSAqLwotI2RlZmluZSBpcnFzX2Rpc2FibGVkKCkJCVwKLSh7CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CVwKLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTtcCi0JKGZsYWdzID4gMCk7CQlcCi19KQotCiAjZGVmaW5lIG5vcCgpIAkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJub3AiKQogCiAjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJCWRvIHsgfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90ZXJtYml0cy5oCmluZGV4IGIwNzcxNTIuLjcwNWNkNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Rlcm1iaXRzLmgKQEAgLTMzLDYgKzMzLDE4IEBACiAjZW5kaWYKIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwljY190IF94X2NjWzJdOyAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdGhlbSB0byBob2xkIHZtaW4vdnRpbWUgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIgICAgMAogI2RlZmluZSBWUVVJVCAgICAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3R0YWJsZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90dGFibGUuaAppbmRleCBmMjM1MjYwLi5jMmExNmUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3R0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdHRhYmxlLmgKQEAgLTEzNywxMCArMTM3LDQ5IEBACiAjZW5kaWYKICNkZWZpbmUgQlJFQUtQT0lOVF9UUkFQIFRSQVAoYnJlYWtwb2ludF90cmFwKQogCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisKICNkZWZpbmUgVFJBUF9JUlEocm91dGluZSwgbGV2ZWwpCQkJXAogCXJkcHIJJXBpbCwgJWcyOwkJCQlcCiAJd3JwcgklZzAsIDE1LCAlcGlsOwkJCQlcCi0JYixwdAkleGNjLCBldHJhcF9pcnE7CQkJXAorCXNldGhpCSVoaSgxZi00KSwgJWc3OwkJCQlcCisJYmEscHQJJXhjYywgZXRyYXBfaXJxOwkJCVwKKwkgb3IJJWc3LCAlbG8oMWYtNCksICVnNzsJCQlcCisJbm9wOwkJCQkJCVwKKwlub3A7CQkJCQkJXAorCW5vcDsJCQkJCQlcCisJLnN1YnNlY3Rpb24JMjsJCQkJXAorMToJY2FsbAl0cmFjZV9oYXJkaXJxc19vZmY7CQkJXAorCSBub3A7CQkJCQkJXAorCW1vdglsZXZlbCwgJW8wOwkJCQlcCisJY2FsbAlyb3V0aW5lOwkJCQlcCisJIGFkZAklc3AsIFBUUkVHU19PRkYsICVvMTsJCQlcCisJYmEsYSxwdAkleGNjLCBydHJhcF9pcnE7CQkJXAorCS5wcmV2aW91czsKKworI2RlZmluZSBUSUNLX1NNUF9JUlEJCQkJCVwKKwlyZHByCSVwaWwsICVnMjsJCQkJXAorCXdycHIJJWcwLCAxNSwgJXBpbDsJCQkJXAorCXNldGhpCSVoaSgxZi00KSwgJWc3OwkJCQlcCisJYmEscHQJJXhjYywgZXRyYXBfaXJxOwkJCVwKKwkgb3IJJWc3LCAlbG8oMWYtNCksICVnNzsJCQlcCisJbm9wOwkJCQkJCVwKKwlub3A7CQkJCQkJXAorCW5vcDsJCQkJCQlcCisJLnN1YnNlY3Rpb24JMjsJCQkJXAorMToJY2FsbAl0cmFjZV9oYXJkaXJxc19vZmY7CQkJXAorCSBub3A7CQkJCQkJXAorCWNhbGwJc21wX3BlcmNwdV90aW1lcl9pbnRlcnJ1cHQ7CQlcCisJIGFkZAklc3AsIFBUUkVHU19PRkYsICVvMDsJCQlcCisJYmEsYSxwdAkleGNjLCBydHJhcF9pcnE7CQkJXAorCS5wcmV2aW91czsKKworI2Vsc2UKKworI2RlZmluZSBUUkFQX0lSUShyb3V0aW5lLCBsZXZlbCkJCQlcCisJcmRwcgklcGlsLCAlZzI7CQkJCVwKKwl3cnByCSVnMCwgMTUsICVwaWw7CQkJCVwKKwliYSxwdAkleGNjLCBldHJhcF9pcnE7CQkJXAogCSByZAklcGMsICVnNzsJCQkJXAogCW1vdglsZXZlbCwgJW8wOwkJCQlcCiAJY2FsbAlyb3V0aW5lOwkJCQlcCkBAIC0xNTEsMTIgKzE5MCwxNCBAQAogCXJkcHIJJXBpbCwgJWcyOwkJCQlcCiAJd3JwcgklZzAsIDE1LCAlcGlsOwkJCQlcCiAJc2V0aGkJJWhpKDEwOWYpLCAlZzc7CQkJCVwKLQliLHB0CSV4Y2MsIGV0cmFwX2lycTsJCQlcCisJYmEscHQJJXhjYywgZXRyYXBfaXJxOwkJCVwKIDEwOToJIG9yCSVnNywgJWxvKDEwOWIpLCAlZzc7CQkJXAogCWNhbGwJc21wX3BlcmNwdV90aW1lcl9pbnRlcnJ1cHQ7CQlcCiAJIGFkZAklc3AsIFBUUkVHU19PRkYsICVvMDsJCQlcCiAJYmEsYSxwdAkleGNjLCBydHJhcF9pcnE7CiAKKyNlbmRpZgorCiAjZGVmaW5lIFRSQVBfSVZFQyBUUkFQX05PU0FWRShkb19pdmVjKQogCiAjZGVmaW5lIEJUUkFQKGx2bCkgVFJBUF9BUkcoYmFkX3RyYXAsIGx2bCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VuaXN0ZC5oCmluZGV4IDEyNGNmMDcuLjQ3MDQ3NTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaApAQCAtMzIwLDEzMiArMzIwLDE4IEBACiAjZGVmaW5lIF9fTlJfdW5zaGFyZQkJMjk5CiAjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CTMwMAogI2RlZmluZSBfX05SX2dldF9yb2J1c3RfbGlzdAkzMDEKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTMwMgorCisjZGVmaW5lIE5SX1NZU0NBTExTCQkzMDMKIAogI2lmZGVmIF9fS0VSTkVMX18KLS8qIFdBUk5JTkc6IFlvdSBNQVkgTk9UIGFkZCBzeXNjYWxsIG51bWJlcnMgbGFyZ2VyIHRoYW4gMzAxLCBzaW5jZQorCisvKiBXQVJOSU5HOiBZb3UgTUFZIE5PVCBhZGQgc3lzY2FsbCBudW1iZXJzIGxhcmdlciB0aGFuIDMwMiwgc2luY2UKICAqICAgICAgICAgIGFsbCBvZiB0aGUgc3lzY2FsbCB0YWJsZXMgaW4gdGhlIFNwYXJjIGtlcm5lbCBhcmUKLSAqICAgICAgICAgIHNpemVkIHRvIGhhdmUgMzAxIGVudHJpZXMgKHN0YXJ0aW5nIGF0IHplcm8pLiAgVGhlcmVmb3JlCi0gKiAgICAgICAgICBmaW5kIGEgZnJlZSBzbG90IGluIHRoZSAwLTMwMSByYW5nZS4KKyAqICAgICAgICAgIHNpemVkIHRvIGhhdmUgMzAyIGVudHJpZXMgKHN0YXJ0aW5nIGF0IHplcm8pLiAgVGhlcmVmb3JlCisgKiAgICAgICAgICBmaW5kIGEgZnJlZSBzbG90IGluIHRoZSAwLTMwMiByYW5nZS4KICAqLwogCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLG5hbWUpIFwKLXR5cGUgbmFtZSh2b2lkKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLXJlZ2lzdGVyIGxvbmcgX19nMSBfX2FzbV9fICgiZzEiKSA9IF9fTlJfIyNuYW1lOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInQgMHg2ZFxuXHQiIFwKLQkJICAgICAgInN1YiAlJWcwLCAlJW8wLCAlMFxuXHQiIFwKLQkJICAgICAgIm1vdmNjICUleGNjLCAlJW8wLCAlMFxuXHQiIFwKLQkJICAgICAgOiAiPXIiIChfX3JlcylcCi0JCSAgICAgIDogInIiIChfX2cxKSBcCi0JCSAgICAgIDogIm8wIiwgImNjIik7IFwKLWlmIChfX3JlcyA+PSAwKSBcCi0gICAgcmV0dXJuICh0eXBlKSBfX3JlczsgXAotZXJybm8gPSAtX19yZXM7IFwKLXJldHVybiAtMTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMSh0eXBlLG5hbWUsdHlwZTEsYXJnMSkgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotcmVnaXN0ZXIgbG9uZyBfX2cxIF9fYXNtX18gKCJnMSIpID0gX19OUl8jI25hbWU7IFwKLXJlZ2lzdGVyIGxvbmcgX19vMCBfX2FzbV9fICgibzAiKSA9IChsb25nKShhcmcxKTsgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0IDB4NmRcblx0IiBcCi0JCSAgICAgICJzdWIgJSVnMCwgJSVvMCwgJTBcblx0IiBcCi0JCSAgICAgICJtb3ZjYyAlJXhjYywgJSVvMCwgJTBcblx0IiBcCi0JCSAgICAgIDogIj1yIiAoX19yZXMpLCAiPSZyIiAoX19vMCkgXAotCQkgICAgICA6ICIxIiAoX19vMCksICJyIiAoX19nMSkgXAotCQkgICAgICA6ICJjYyIpOyBcCi1pZiAoX19yZXMgPj0gMCkgXAotCXJldHVybiAodHlwZSkgX19yZXM7IFwKLWVycm5vID0gLV9fcmVzOyBcCi1yZXR1cm4gLTE7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMikgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMikgXAoteyBcCi1sb25nIF9fcmVzOyBcCi1yZWdpc3RlciBsb25nIF9fZzEgX19hc21fXyAoImcxIikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX28wIF9fYXNtX18gKCJvMCIpID0gKGxvbmcpKGFyZzEpOyBcCi1yZWdpc3RlciBsb25nIF9fbzEgX19hc21fXyAoIm8xIikgPSAobG9uZykoYXJnMik7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidCAweDZkXG5cdCIgXAotCQkgICAgICAic3ViICUlZzAsICUlbzAsICUwXG5cdCIgXAotCQkgICAgICAibW92Y2MgJSV4Y2MsICUlbzAsICUwXG5cdCIgXAotCQkgICAgICA6ICI9ciIgKF9fcmVzKSwgIj0mciIgKF9fbzApIFwKLQkJICAgICAgOiAiMSIgKF9fbzApLCAiciIgKF9fbzEpLCAiciIgKF9fZzEpIFwKLQkJICAgICAgOiAiY2MiKTsgXAotaWYgKF9fcmVzID49IDApIFwKLQlyZXR1cm4gKHR5cGUpIF9fcmVzOyBcCi1lcnJubyA9IC1fX3JlczsgXAotcmV0dXJuIC0xOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMykgXAotdHlwZSBuYW1lKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLXJlZ2lzdGVyIGxvbmcgX19nMSBfX2FzbV9fICgiZzEiKSA9IF9fTlJfIyNuYW1lOyBcCi1yZWdpc3RlciBsb25nIF9fbzAgX19hc21fXyAoIm8wIikgPSAobG9uZykoYXJnMSk7IFwKLXJlZ2lzdGVyIGxvbmcgX19vMSBfX2FzbV9fICgibzEiKSA9IChsb25nKShhcmcyKTsgXAotcmVnaXN0ZXIgbG9uZyBfX28yIF9fYXNtX18gKCJvMiIpID0gKGxvbmcpKGFyZzMpOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInQgMHg2ZFxuXHQiIFwKLQkJICAgICAgInN1YiAlJWcwLCAlJW8wLCAlMFxuXHQiIFwKLQkJICAgICAgIm1vdmNjICUleGNjLCAlJW8wLCAlMFxuXHQiIFwKLQkJICAgICAgOiAiPXIiIChfX3JlcyksICI9JnIiIChfX28wKSBcCi0JCSAgICAgIDogIjEiIChfX28wKSwgInIiIChfX28xKSwgInIiIChfX28yKSwgInIiIChfX2cxKSBcCi0JCSAgICAgIDogImNjIik7IFwKLWlmIChfX3Jlcz49MCkgXAotCXJldHVybiAodHlwZSkgX19yZXM7IFwKLWVycm5vID0gLV9fcmVzOyBcCi1yZXR1cm4gLTE7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDQodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQpIFwKLXR5cGUgbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCkgXAoteyBcCi1sb25nIF9fcmVzOyBcCi1yZWdpc3RlciBsb25nIF9fZzEgX19hc21fXyAoImcxIikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX28wIF9fYXNtX18gKCJvMCIpID0gKGxvbmcpKGFyZzEpOyBcCi1yZWdpc3RlciBsb25nIF9fbzEgX19hc21fXyAoIm8xIikgPSAobG9uZykoYXJnMik7IFwKLXJlZ2lzdGVyIGxvbmcgX19vMiBfX2FzbV9fICgibzIiKSA9IChsb25nKShhcmczKTsgXAotcmVnaXN0ZXIgbG9uZyBfX28zIF9fYXNtX18gKCJvMyIpID0gKGxvbmcpKGFyZzQpOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoInQgMHg2ZFxuXHQiIFwKLQkJICAgICAgInN1YiAlJWcwLCAlJW8wLCAlMFxuXHQiIFwKLQkJICAgICAgIm1vdmNjICUleGNjLCAlJW8wLCAlMFxuXHQiIFwKLQkJICAgICAgOiAiPXIiIChfX3JlcyksICI9JnIiIChfX28wKSBcCi0JCSAgICAgIDogIjEiIChfX28wKSwgInIiIChfX28xKSwgInIiIChfX28yKSwgInIiIChfX28zKSwgInIiIChfX2cxKSBcCi0JCSAgICAgIDogImNjIik7IFwKLWlmIChfX3Jlcz49MCkgXAotCXJldHVybiAodHlwZSkgX19yZXM7IFwKLWVycm5vID0gLV9fcmVzOyBcCi1yZXR1cm4gLTE7IFwKLX0gCi0KLSNkZWZpbmUgX3N5c2NhbGw1KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LCBcCi0JICB0eXBlNSxhcmc1KSBcCi10eXBlIG5hbWUgKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczLHR5cGU0IGFyZzQsdHlwZTUgYXJnNSkgXAoteyBcCi1sb25nIF9fcmVzOyBcCi1yZWdpc3RlciBsb25nIF9fZzEgX19hc21fXyAoImcxIikgPSBfX05SXyMjbmFtZTsgXAotcmVnaXN0ZXIgbG9uZyBfX28wIF9fYXNtX18gKCJvMCIpID0gKGxvbmcpKGFyZzEpOyBcCi1yZWdpc3RlciBsb25nIF9fbzEgX19hc21fXyAoIm8xIikgPSAobG9uZykoYXJnMik7IFwKLXJlZ2lzdGVyIGxvbmcgX19vMiBfX2FzbV9fICgibzIiKSA9IChsb25nKShhcmczKTsgXAotcmVnaXN0ZXIgbG9uZyBfX28zIF9fYXNtX18gKCJvMyIpID0gKGxvbmcpKGFyZzQpOyBcCi1yZWdpc3RlciBsb25nIF9fbzQgX19hc21fXyAoIm80IikgPSAobG9uZykoYXJnNSk7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICgidCAweDZkXG5cdCIgXAotCQkgICAgICAic3ViICUlZzAsICUlbzAsICUwXG5cdCIgXAotCQkgICAgICAibW92Y2MgJSV4Y2MsICUlbzAsICUwXG5cdCIgXAotCQkgICAgICA6ICI9ciIgKF9fcmVzKSwgIj0mciIgKF9fbzApIFwKLQkJICAgICAgOiAiMSIgKF9fbzApLCAiciIgKF9fbzEpLCAiciIgKF9fbzIpLCAiciIgKF9fbzMpLCAiciIgKF9fbzQpLCAiciIgKF9fZzEpIFwKLQkJICAgICAgOiAiY2MiKTsgXAotaWYgKF9fcmVzPj0wKSBcCi0JcmV0dXJuICh0eXBlKSBfX3JlczsgXAotZXJybm8gPSAtX19yZXM7IFwKLXJldHVybiAtMTsgXAotfQotCiAvKiBzeXNjb25mIG9wdGlvbnMsIGZvciBTdW5PUyBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lICAgX1NDX0FSR19NQVggICAgICAgICAgICAgMQogI2RlZmluZSAgIF9TQ19DSElMRF9NQVggICAgICAgICAgIDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2FyY2hwYXJhbS1wcGMuaCBiL2luY2x1ZGUvYXNtLXVtL2FyY2hwYXJhbS1wcGMuaAppbmRleCAxNzJjZDZmLi40MjY5ZDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9hcmNocGFyYW0tcHBjLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vYXJjaHBhcmFtLXBwYy5oCkBAIC0xLDE1ICsxLDYgQEAKICNpZm5kZWYgX19VTV9BUkNIUEFSQU1fUFBDX0gKICNkZWZpbmUgX19VTV9BUkNIUEFSQU1fUFBDX0gKIAotLyoqKioqKioqKiBCaXRzIGZvciBhc20tdW0vaHdfaXJxLmggKioqKioqKioqKi8KLQotc3RydWN0IGh3X2ludGVycnVwdF90eXBlOwotCi0vKioqKioqKioqIEJpdHMgZm9yIGFzbS11bS9oYXJkaXJxLmggKioqKioqKioqKi8KLQotI2RlZmluZSBpcnFfZW50ZXIoY3B1LCBpcnEpIGhhcmRpcnFfZW50ZXIoY3B1KQotI2RlZmluZSBpcnFfZXhpdChjcHUsIGlycSkgaGFyZGlycV9leGl0KGNwdSkKLQogLyoqKioqKioqKiBCaXRzIGZvciBhc20tdW0vc3RyaW5nLmggKioqKioqKioqKi8KIAogI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJSQ0hSCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9idWcuaCBiL2luY2x1ZGUvYXNtLXVtL2J1Zy5oCmluZGV4IDFlMjJmYTIuLjMzNTdjNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL2J1Zy5oCkBAIC0xLDQgKzEsNiBAQAogI2lmbmRlZiBfX1VNX0JVR19ICiAjZGVmaW5lIF9fVU1fQlVHX0gKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2J1Zy5oPgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2NvbW1vbi5sZHMuUyBiL2luY2x1ZGUvYXNtLXVtL2NvbW1vbi5sZHMuUwppbmRleCAxMDEwMTUzLi5mMDQ1NDUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9jb21tb24ubGRzLlMKKysrIGIvaW5jbHVkZS9hc20tdW0vY29tbW9uLmxkcy5TCkBAIC00MiwxMyArNDIsNyBAQAogCQogICBfX2luaXRjYWxsX3N0YXJ0ID0gLjsKICAgLmluaXRjYWxsLmluaXQgOiB7Ci0JKiguaW5pdGNhbGwxLmluaXQpIAotCSooLmluaXRjYWxsMi5pbml0KSAKLQkqKC5pbml0Y2FsbDMuaW5pdCkgCi0JKiguaW5pdGNhbGw0LmluaXQpIAotCSooLmluaXRjYWxsNS5pbml0KSAKLQkqKC5pbml0Y2FsbDYuaW5pdCkgCi0JKiguaW5pdGNhbGw3LmluaXQpCisJSU5JVENBTExTCiAgIH0KICAgX19pbml0Y2FsbF9lbmQgPSAuOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXVtL2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Zjk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS11bS9kZXZpY2UuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tdW0vZG1hLW1hcHBpbmcuaAppbmRleCBiYWJkMjk4Li5mMGVlNGZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL2RtYS1tYXBwaW5nLmgKQEAgLTk0LDcgKzk0LDcgQEAKIAogI2RlZmluZSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoZCwgcywgaCwgZikgZG1hX2FsbG9jX2NvaGVyZW50KGQsIHMsIGgsIGYpCiAjZGVmaW5lIGRtYV9mcmVlX25vbmNvaGVyZW50KGQsIHMsIHYsIGgpIGRtYV9mcmVlX2NvaGVyZW50KGQsIHMsIHYsIGgpCi0jZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQpICgxKQorI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkLCBoKSAoMSkKIAogc3RhdGljIGlubGluZSBpbnQKIGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpCkBAIC0xMTIsNyArMTEyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1kbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCitkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKIAkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCUJVRygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS12ODUwL2NhY2hlZmx1c2guaAppbmRleCBlMWE4N2Y4Li45ZWNlMDVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2NhY2hlZmx1c2guaApAQCAtMjQsNiArMjQsNyBAQAogICAgc3lzdGVtcyB3aXRoIE1NVXMsIHNvIHdlIGRvbid0IG5lZWQgdGhlbS4gICovCiAjZGVmaW5lIGZsdXNoX2NhY2hlX2FsbCgpCQkJKCh2b2lkKTApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCSgodm9pZCkwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQkJKCh2b2lkKTApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkJKCh2b2lkKTApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIHBmbikJKCh2b2lkKTApCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJKCh2b2lkKTApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS12ODUwL2NoZWNrc3VtLmgKaW5kZXggNGRmNWU3MTAuLmQxZGRkZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2NoZWNrc3VtLmgKQEAgLTI2LDggKzI2LDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLAotCQkJCSAgdW5zaWduZWQgaW50IHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMzYsOCArMzUsOCBAQAogICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgY3N1bV9wYXJ0aWFsX2NvcHkgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJCQkgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sIHVuc2lnbmVkIHN1bSk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLAorCQkJCSAgIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKIAogLyoKQEAgLTQ2LDIwICs0NSwxNyBAQAogICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCiAgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQogICovCi1leHRlcm4gdW5zaWduZWQgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCi0JCQkJCSAgICAgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCQkgICAgIGludCBsZW4sIHVuc2lnbmVkIHN1bSwKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyIChjb25zdCB2b2lkICpzcmMsCisJCQkJCSAgICAgdm9pZCAqZHN0LAorCQkJCQkgICAgIGludCBsZW4sIF9fd3N1bSBzdW0sCiAJCQkJCSAgICAgaW50ICpjc3VtX2Vycik7CiAKLSNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhzcmMsIGRzdCwgbGVuLCBzdW0pCVwKLQljc3VtX3BhcnRpYWxfY29weSAoKHNyYyksIChkc3QpLCAobGVuKSwgKHN1bSkpCi0KLXVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSAodW5zaWduZWQgY2hhciAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKTsKK19fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCk7CiAKIC8qCiAgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjc3VtX2ZvbGQgKHVuc2lnbmVkIGxvbmcgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZCAoX193c3VtIHN1bSkKIHsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0OwogCS8qCkBAIC02OCw3ICs2NCw3IEBACiAJICAgICAgYWRkICUxLCAlMAlIICAgICBMCQlIK0wrQyBIK0wKIAkqLwogCWFzbSAoImhzdyAlMSwgJTA7IGFkZCAlMSwgJTAiIDogIj0mciIgKHJlc3VsdCkgOiAiciIgKHN1bSkpOwotCXJldHVybiAofnJlc3VsdCkgPj4gMTY7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpKH5yZXN1bHQgPj4gMTYpOwogfQogCiAKQEAgLTc2LDEwICs3MiwxMCBAQAogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKICAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX3RjcHVkcF9ub2ZvbGQgKHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgaW5saW5lIF9fd3N1bQorY3N1bV90Y3B1ZHBfbm9mb2xkIChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJICAgIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKQorCQkgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIF9fd3N1bSBzdW0pCiB7CiAJaW50IF9fY2Fycnk7CiAJX19hc21fXyAoImFkZCAlMiwgJTA7IgpAQCAtOTMsMTUgKzg5LDE1IEBACiAJCSAiYWRkICUxLCAlMCIKIAkJIDogIj0mciIgKHN1bSksICI9JnIiIChfX2NhcnJ5KQogCQkgOiAiciIgKGRhZGRyKSwgInIiIChzYWRkciksCi0JCSAiciIgKG50b2hzIChsZW4pICsgKHByb3RvIDw8IDgpKSwKKwkJICJyIiAoKGxlbiArIHByb3RvKSA8PCA4KSwKIAkJICIwIiAoc3VtKSk7CiAJcmV0dXJuIHN1bTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBpbnQKLWNzdW1fdGNwdWRwX21hZ2ljICh1bnNpZ25lZCBsb25nIHNhZGRyLCB1bnNpZ25lZCBsb25nIGRhZGRyLAorc3RhdGljIGlubGluZSBfX3N1bTE2Citjc3VtX3RjcHVkcF9tYWdpYyAoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pCisJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQogewogCXJldHVybiBjc3VtX2ZvbGQgKGNzdW1fdGNwdWRwX25vZm9sZCAoc2FkZHIsIGRhZGRyLCBsZW4sIHByb3RvLCBzdW0pKTsKIH0KQEAgLTExMCw3ICsxMDYsNyBAQAogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQogICogaW4gaWNtcC5jCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKTsKK2V4dGVybiBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKTsKIAogCiAjZW5kaWYgLyogX19WODUwX0NIRUNLU1VNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXY4NTAvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOTg3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvZGV2aWNlLmgKQEAgLTAsMCArMSw3IEBACisvKgorICogQXJjaCBzcGVjaWZpYyBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9pcnEuaCBiL2luY2x1ZGUvYXNtLXY4NTAvaXJxLmgKaW5kZXggMWJmMDk2ZC4uODg2ODdjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL2lycS5oCkBAIC00Niw4ICs0Niw2IEBACiBpbml0X2lycV9oYW5kbGVycyAoaW50IGJhc2VfaXJxLCBpbnQgbnVtLCBpbnQgaW50ZXJ2YWwsCiAJCSAgIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSAqaXJxX3R5cGUpOwogCi10eXBlZGVmIHZvaWQgKCppcnFfaGFuZGxlcl90KShpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KIC8qIEhhbmRsZSBpbnRlcnJ1cHQgSVJRLiAgUkVHUyBhcmUgdGhlIHJlZ2lzdGVycyBhdCB0aGUgdGltZSBvZiB0aGVyCiAgICBpbnRlcnJ1cHQuICAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCBoYW5kbGVfaXJxIChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS12ODUwL3Rlcm1iaXRzLmgKaW5kZXggMjEyZDRlMi4uZjNiNDMzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvdGVybWJpdHMuaApAQCAtMTcsNiArMTcsMTcgQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIgMAogI2RlZmluZSBWUVVJVCAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tdjg1MC91bmlzdGQuaAppbmRleCA3Mzc0MDFlLi4yMjQxZWQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvdW5pc3RkLmgKQEAgLTIwNCwxNjggKzIwNCw4IEBACiAjZGVmaW5lIF9fTlJfZ2V0dGlkCQkyMDEKICNkZWZpbmUgX19OUl90a2lsbAkJMjAyCiAKLQotLyogU3lzY2FsbCBwcm90b2NvbDoKLSAgIFN5c2NhbGwgbnVtYmVyIGluIHIxMiwgYXJncyBpbiByNi1yOSwgcjEzLXIxNAotICAgUmV0dXJuIHZhbHVlIGluIHIxMAotICAgVHJhcCAwIGZvciBgc2hvcnQnIHN5c2NhbGxzLCB3aGVyZSBhbGwgdGhlIGFyZ3MgY2FuIGZpdCBpbiBmdW5jdGlvbgotICAgY2FsbCBhcmd1bWVudCByZWdpc3RlcnMsIGFuZCB0cmFwIDEgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25hbCBhcmdzIGluCi0gICByMTMtcjE0LiAgKi8KLQotI2RlZmluZSBTWVNDQUxMX05VTQkicjEyIgotI2RlZmluZSBTWVNDQUxMX0FSRzAJInI2IgotI2RlZmluZSBTWVNDQUxMX0FSRzEJInI3IgotI2RlZmluZSBTWVNDQUxMX0FSRzIJInI4IgotI2RlZmluZSBTWVNDQUxMX0FSRzMJInI5IgotI2RlZmluZSBTWVNDQUxMX0FSRzQJInIxMyIKLSNkZWZpbmUgU1lTQ0FMTF9BUkc1CSJyMTQiCi0jZGVmaW5lIFNZU0NBTExfUkVUCSJyMTAiCi0KLSNkZWZpbmUgU1lTQ0FMTF9TSE9SVF9UUkFQCSIwIgotI2RlZmluZSBTWVNDQUxMX0xPTkdfVFJBUAkiMSIKLQotLyogUmVnaXN0ZXJzIGNsb2JiZXJlZCBieSBhbnkgc3lzY2FsbC4gIFRoaXMgX2RvZXNuJ3RfIGluY2x1ZGUgdGhlIHN5c2NhbGwKLSAgIG51bWJlciAocjEyKSBvciB0aGUgYGV4dGVuZGVkIGFyZycgcmVnaXN0ZXJzIChyMTMsIHIxNCksIGV2ZW4gdGhvdWdoCi0gICB0aGV5IGFyZSBhY3R1YWxseSBjbG9iYmVyZWQgdG9vICh0aGlzIGlzIGJlY2F1c2UgZ2NjJ3MgYGFzbScgc3RhdGVtZW50Ci0gICBkb2Vzbid0IGFsbG93IGEgY2xvYmJlciB0byBiZSB1c2VkIGFzIGFuIGlucHV0IG9yIG91dHB1dCkuICAqLwotI2RlZmluZSBTWVNDQUxMX0NMT0JCRVJTCSJyMSIsICJyNSIsICJyMTEiLCAicjE1IiwgInIxNiIsIFwKLQkJCQkicjE3IiwgInIxOCIsICJyMTkiCi0KLS8qIFJlZ2lzdGVycyBjbG9iYmVyZWQgYnkgYSBgc2hvcnQnIHN5c2NhbGwuICBUaGlzIGluY2x1ZGVzIGFsbCBjbG9iYmVycwotICAgZXhjZXB0IHRoZSBzeXNjYWxsIG51bWJlciAocjEyKS4gICovCi0jZGVmaW5lIFNZU0NBTExfU0hPUlRfQ0xPQkJFUlMJU1lTQ0FMTF9DTE9CQkVSUywgInIxMyIsICJyMTQiCi0KICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpbmNsdWRlIDxhc20vY2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLQkgIC8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtTUFYX0VSUk5POiAgICAgIFwKLQkgICAgIHNlZSA8YXNtLXY4NTAvZXJybm8uaD4gKi8JCQkJCSAgICAgIFwKLQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0ICgodW5zaWduZWQgbG9uZykocmVzKSA+PSAodW5zaWduZWQgbG9uZykoLU1BWF9FUlJOTyksIDApKSB7IFwKLQkJICBlcnJubyA9IC0ocmVzKTsJCQkJCSAgICAgIFwKLQkJICByZXMgPSAtMTsJCQkJCQkgICAgICBcCi0JICB9CQkJCQkJCQkgICAgICBcCi0JICByZXR1cm4gKHR5cGUpIChyZXMpOwkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLCBuYW1lKQkJCQkJCSAgICAgIFwKLXR5cGUgbmFtZSAodm9pZCkJCQkJCQkJICAgICAgXAotewkJCQkJCQkJCSAgICAgIFwKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3N5c2NhbGwgX19hc21fXyAoU1lTQ0FMTF9OVU0pID0gX19OUl8jI25hbWU7CSAgICAgIFwKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3JldCBfX2FzbV9fIChTWVNDQUxMX1JFVCk7CQkJICAgICAgXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXAgIiBTWVNDQUxMX1NIT1JUX1RSQVAJCQkgICAgICBcCi0JCQk6ICI9ciIgKF9fcmV0KSwgIj1yIiAoX19zeXNjYWxsKQkgCSAgICAgIFwKLQkJCTogIjEiIChfX3N5c2NhbGwpCQkJCSAgICAgIFwKLQkJCTogU1lTQ0FMTF9TSE9SVF9DTE9CQkVSUyk7CQkJICAgICAgXAotICBfX3N5c2NhbGxfcmV0dXJuICh0eXBlLCBfX3JldCk7CQkJCQkgICAgICBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwxKHR5cGUsIG5hbWUsIGF0eXBlLCBhKQkJCQkJICAgICAgXAotdHlwZSBuYW1lIChhdHlwZSBhKQkJCQkJCQkgICAgICBcCi17CQkJCQkJCQkJICAgICAgXAotICByZWdpc3RlciBhdHlwZSBfX2EgX19hc21fXyAoU1lTQ0FMTF9BUkcwKSA9IGE7CQkJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc3lzY2FsbCBfX2FzbV9fIChTWVNDQUxMX05VTSkgPSBfX05SXyMjbmFtZTsJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fcmV0IF9fYXNtX18gKFNZU0NBTExfUkVUKTsJCQkgICAgICBcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcCAiIFNZU0NBTExfU0hPUlRfVFJBUAkJCSAgICAgIFwKLQkJCTogIj1yIiAoX19yZXQpLCAiPXIiIChfX3N5c2NhbGwpCQkgICAgICBcCi0JCQk6ICIxIiAoX19zeXNjYWxsKSwgInIiIChfX2EpCQkJICAgICAgXAotCQkJOiBTWVNDQUxMX1NIT1JUX0NMT0JCRVJTKTsJCQkgICAgICBcCi0gIF9fc3lzY2FsbF9yZXR1cm4gKHR5cGUsIF9fcmV0KTsJCQkJCSAgICAgIFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSwgbmFtZSwgYXR5cGUsIGEsIGJ0eXBlLCBiKQkJCSAgICAgIFwKLXR5cGUgbmFtZSAoYXR5cGUgYSwgYnR5cGUgYikJCQkJCQkgICAgICBcCi17CQkJCQkJCQkJICAgICAgXAotICByZWdpc3RlciBhdHlwZSBfX2EgX19hc21fXyAoU1lTQ0FMTF9BUkcwKSA9IGE7CQkJICAgICAgXAotICByZWdpc3RlciBidHlwZSBfX2IgX19hc21fXyAoU1lTQ0FMTF9BUkcxKSA9IGI7CQkJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc3lzY2FsbCBfX2FzbV9fIChTWVNDQUxMX05VTSkgPSBfX05SXyMjbmFtZTsJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fcmV0IF9fYXNtX18gKFNZU0NBTExfUkVUKTsJCQkgICAgICBcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcCAiIFNZU0NBTExfU0hPUlRfVFJBUAkJCSAgICAgIFwKLQkJCTogIj1yIiAoX19yZXQpLCAiPXIiIChfX3N5c2NhbGwpCQkgICAgICBcCi0JCQk6ICIxIiAoX19zeXNjYWxsKSwgInIiIChfX2EpLCAiciIgKF9fYikJCSAgICAgIFwKLQkJCTogU1lTQ0FMTF9TSE9SVF9DTE9CQkVSUyk7CQkJICAgICAgXAotICBfX3N5c2NhbGxfcmV0dXJuICh0eXBlLCBfX3JldCk7CQkJCQkgICAgICBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsIG5hbWUsIGF0eXBlLCBhLCBidHlwZSwgYiwgY3R5cGUsIGMpCQkgICAgICBcCi10eXBlIG5hbWUgKGF0eXBlIGEsIGJ0eXBlIGIsIGN0eXBlIGMpCQkJCQkgICAgICBcCi17CQkJCQkJCQkJICAgICAgXAotICByZWdpc3RlciBhdHlwZSBfX2EgX19hc21fXyAoU1lTQ0FMTF9BUkcwKSA9IGE7CQkJICAgICAgXAotICByZWdpc3RlciBidHlwZSBfX2IgX19hc21fXyAoU1lTQ0FMTF9BUkcxKSA9IGI7CQkJICAgICAgXAotICByZWdpc3RlciBjdHlwZSBfX2MgX19hc21fXyAoU1lTQ0FMTF9BUkcyKSA9IGM7CQkJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc3lzY2FsbCBfX2FzbV9fIChTWVNDQUxMX05VTSkgPSBfX05SXyMjbmFtZTsJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fcmV0IF9fYXNtX18gKFNZU0NBTExfUkVUKTsJCQkgICAgICBcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcCAiIFNZU0NBTExfU0hPUlRfVFJBUAkJCSAgICAgIFwKLQkJCTogIj1yIiAoX19yZXQpLCAiPXIiIChfX3N5c2NhbGwpCQkgICAgICBcCi0JCQk6ICIxIiAoX19zeXNjYWxsKSwgInIiIChfX2EpLCAiciIgKF9fYiksICJyIiAoX19jKSAgICBcCi0JCQk6IFNZU0NBTExfU0hPUlRfQ0xPQkJFUlMpOwkJCSAgICAgIFwKLSAgX19zeXNjYWxsX3JldHVybiAodHlwZSwgX19yZXQpOwkJCQkJICAgICAgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNCh0eXBlLCBuYW1lLCBhdHlwZSwgYSwgYnR5cGUsIGIsIGN0eXBlLCBjLCBkdHlwZSwgZCkJICAgICAgXAotdHlwZSBuYW1lIChhdHlwZSBhLCBidHlwZSBiLCBjdHlwZSBjLCBkdHlwZSBkKQkJCQkgICAgICBcCi17CQkJCQkJCQkJICAgICAgXAotICByZWdpc3RlciBhdHlwZSBfX2EgX19hc21fXyAoU1lTQ0FMTF9BUkcwKSA9IGE7CQkJICAgICAgXAotICByZWdpc3RlciBidHlwZSBfX2IgX19hc21fXyAoU1lTQ0FMTF9BUkcxKSA9IGI7CQkJICAgICAgXAotICByZWdpc3RlciBjdHlwZSBfX2MgX19hc21fXyAoU1lTQ0FMTF9BUkcyKSA9IGM7CQkJICAgICAgXAotICByZWdpc3RlciBkdHlwZSBfX2QgX19hc21fXyAoU1lTQ0FMTF9BUkczKSA9IGQ7CQkJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc3lzY2FsbCBfX2FzbV9fIChTWVNDQUxMX05VTSkgPSBfX05SXyMjbmFtZTsJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fcmV0IF9fYXNtX18gKFNZU0NBTExfUkVUKTsJCQkgICAgICBcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcCAiIFNZU0NBTExfU0hPUlRfVFJBUAkJCSAgICAgIFwKLQkJCTogIj1yIiAoX19yZXQpLCAiPXIiIChfX3N5c2NhbGwpCQkgICAgICBcCi0JCQk6ICIxIiAoX19zeXNjYWxsKSwJCQkJICAgICAgXAotCQkJInIiIChfX2EpLCAiciIgKF9fYiksICJyIiAoX19jKSwgInIiIChfX2QpCSAgICAgIFwKLQkJCTogU1lTQ0FMTF9TSE9SVF9DTE9CQkVSUyk7CQkJICAgICAgXAotICBfX3N5c2NhbGxfcmV0dXJuICh0eXBlLCBfX3JldCk7CQkJCQkgICAgICBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw1KHR5cGUsIG5hbWUsIGF0eXBlLCBhLCBidHlwZSwgYiwgY3R5cGUsIGMsIGR0eXBlLCBkLCBldHlwZSxlKVwKLXR5cGUgbmFtZSAoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCwgZXR5cGUgZSkJCQkgICAgICBcCi17CQkJCQkJCQkJICAgICAgXAotICByZWdpc3RlciBhdHlwZSBfX2EgX19hc21fXyAoU1lTQ0FMTF9BUkcwKSA9IGE7CQkJICAgICAgXAotICByZWdpc3RlciBidHlwZSBfX2IgX19hc21fXyAoU1lTQ0FMTF9BUkcxKSA9IGI7CQkJICAgICAgXAotICByZWdpc3RlciBjdHlwZSBfX2MgX19hc21fXyAoU1lTQ0FMTF9BUkcyKSA9IGM7CQkJICAgICAgXAotICByZWdpc3RlciBkdHlwZSBfX2QgX19hc21fXyAoU1lTQ0FMTF9BUkczKSA9IGQ7CQkJICAgICAgXAotICByZWdpc3RlciBldHlwZSBfX2UgX19hc21fXyAoU1lTQ0FMTF9BUkc0KSA9IGU7CQkJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc3lzY2FsbCBfX2FzbV9fIChTWVNDQUxMX05VTSkgPSBfX05SXyMjbmFtZTsJICAgICAgXAotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fcmV0IF9fYXNtX18gKFNZU0NBTExfUkVUKTsJCQkgICAgICBcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgidHJhcCAiIFNZU0NBTExfTE9OR19UUkFQCQkJICAgICAgXAotCQkJOiAiPXIiIChfX3JldCksICI9ciIgKF9fc3lzY2FsbCksICI9ciIgKF9fZSkJICAgICAgXAotCQkJOiAiMSIgKF9fc3lzY2FsbCksCQkJCSAgICAgIFwKLQkJCSJyIiAoX19hKSwgInIiIChfX2IpLCAiciIgKF9fYyksICJyIiAoX19kKSwgIjIiIChfX2UpIFwKLQkJCTogU1lTQ0FMTF9DTE9CQkVSUyk7CQkJCSAgICAgIFwKLSAgX19zeXNjYWxsX3JldHVybiAodHlwZSwgX19yZXQpOwkJCQkJICAgICAgXAotfQotCi0jZGVmaW5lIF9fU1lTQ0FMTDZfVFJBUChzeXNjYWxsLCByZXQsIGEsIGIsIGMsIGQsIGUsIGYpCQkJICAgICAgXAotICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInRyYXAgIiBTWVNDQUxMX0xPTkdfVFJBUAkJCSAgICAgIFwKLQkJCTogIj1yIiAocmV0KSwgIj1yIiAoc3lzY2FsbCksCQkJICAgICAgXAotIAkJCSI9ciIgKGUpLCAiPXIiIChmKQkJCQkgICAgICBcCi0JCQk6ICIxIiAoc3lzY2FsbCksCQkJCSAgICAgIFwKLQkJCSJyIiAoYSksICJyIiAoYiksICJyIiAoYyksICJyIiAoZCksCQkgICAgICBcCi0JCQkiMiIgKGUpLCAiMyIgKGYpCQkJCSAgICAgIFwKLQkJCTogU1lTQ0FMTF9DTE9CQkVSUyk7Ci0KLSNkZWZpbmUgX3N5c2NhbGw2KHR5cGUsIG5hbWUsIGF0eXBlLCBhLCBidHlwZSwgYiwgY3R5cGUsIGMsIGR0eXBlLCBkLCBldHlwZSwgZSwgZnR5cGUsIGYpIFwKLXR5cGUgbmFtZSAoYXR5cGUgYSwgYnR5cGUgYiwgY3R5cGUgYywgZHR5cGUgZCwgZXR5cGUgZSwgZnR5cGUgZikJICAgICAgXAotewkJCQkJCQkJCSAgICAgIFwKLSAgcmVnaXN0ZXIgYXR5cGUgX19hIF9fYXNtX18gKFNZU0NBTExfQVJHMCkgPSBhOwkJCSAgICAgIFwKLSAgcmVnaXN0ZXIgYnR5cGUgX19iIF9fYXNtX18gKFNZU0NBTExfQVJHMSkgPSBiOwkJCSAgICAgIFwKLSAgcmVnaXN0ZXIgY3R5cGUgX19jIF9fYXNtX18gKFNZU0NBTExfQVJHMikgPSBjOwkJCSAgICAgIFwKLSAgcmVnaXN0ZXIgZHR5cGUgX19kIF9fYXNtX18gKFNZU0NBTExfQVJHMykgPSBkOwkJCSAgICAgIFwKLSAgcmVnaXN0ZXIgZXR5cGUgX19lIF9fYXNtX18gKFNZU0NBTExfQVJHNCkgPSBlOwkJCSAgICAgIFwKLSAgcmVnaXN0ZXIgZXR5cGUgX19mIF9fYXNtX18gKFNZU0NBTExfQVJHNSkgPSBmOwkJCSAgICAgIFwKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3N5c2NhbGwgX19hc21fXyAoU1lTQ0FMTF9OVU0pID0gX19OUl8jI25hbWU7CSAgICAgIFwKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfX3JldCBfX2FzbV9fIChTWVNDQUxMX1JFVCk7CQkJICAgICAgXAotICBfX1NZU0NBTEw2X1RSQVAoX19zeXNjYWxsLCBfX3JldCwgX19hLCBfX2IsIF9fYywgX19kLCBfX2UsIF9fZik7CSAgICAgIFwKLSAgX19zeXNjYWxsX3JldHVybiAodHlwZSwgX19yZXQpOwkJCQkJICAgICAgXAotfQotCQkKLQogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgogI2RlZmluZSBfX0FSQ0hfV0FOVF9TVEFUNjQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9LYnVpbGQgYi9pbmNsdWRlL2FzbS14ODZfNjQvS2J1aWxkCmluZGV4IDFlZTliMDcuLmViZDcxMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L0tidWlsZApAQCAtNiwxMyArNiwxMSBAQAogCiBoZWFkZXIteSArPSBib290LmgKIGhlYWRlci15ICs9IGJvb3RzZXR1cC5oCi1oZWFkZXIteSArPSBjcHVmZWF0dXJlLmgKIGhlYWRlci15ICs9IGRlYnVncmVnLmgKIGhlYWRlci15ICs9IGxkdC5oCiBoZWFkZXIteSArPSBtc3IuaAogaGVhZGVyLXkgKz0gcHJjdGwuaAogaGVhZGVyLXkgKz0gcHRyYWNlLWFiaS5oCi1oZWFkZXIteSArPSBzZXR1cC5oCiBoZWFkZXIteSArPSBzaWdjb250ZXh0MzIuaAogaGVhZGVyLXkgKz0gdWNvbnRleHQuaAogaGVhZGVyLXkgKz0gdnN5c2NhbGwzMi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAppbmRleCBlZDU5YWE0Li42YjZmYzZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKQEAgLTU0LDMwICs1NCw4IEBACiAjZGVmaW5lIEFDUElfRU5BQkxFX0lSUVMoKSAgbG9jYWxfaXJxX2VuYWJsZSgpCiAjZGVmaW5lIEFDUElfRkxVU0hfQ1BVX0NBQ0hFKCkJd2JpbnZkKCkKIAotCi1zdGF0aWMgaW5saW5lIGludAotX19hY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sgKHVuc2lnbmVkIGludCAqbG9jaykKLXsKLQl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHZhbDsKLQlkbyB7Ci0JCW9sZCA9ICpsb2NrOwotCQluZXcgPSAoKChvbGQgJiB+MHgzKSArIDIpICsgKChvbGQgPj4gMSkgJiAweDEpKTsKLQkJdmFsID0gY21weGNoZyhsb2NrLCBvbGQsIG5ldyk7Ci0JfSB3aGlsZSAodW5saWtlbHkgKHZhbCAhPSBvbGQpKTsKLQlyZXR1cm4gKG5ldyA8IDMpID8gLTEgOiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotX19hY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2sgKHVuc2lnbmVkIGludCAqbG9jaykKLXsKLQl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHZhbDsKLQlkbyB7Ci0JCW9sZCA9ICpsb2NrOwotCQluZXcgPSBvbGQgJiB+MHgzOwotCQl2YWwgPSBjbXB4Y2hnKGxvY2ssIG9sZCwgbmV3KTsKLQl9IHdoaWxlICh1bmxpa2VseSAodmFsICE9IG9sZCkpOwotCXJldHVybiBvbGQgJiAweDE7Ci19CitpbnQgX19hY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sodW5zaWduZWQgaW50ICpsb2NrKTsKK2ludCBfX2FjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayh1bnNpZ25lZCBpbnQgKmxvY2spOwogCiAjZGVmaW5lIEFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhHTHB0ciwgQWNxKSBcCiAJKChBY3EpID0gX19hY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soKHVuc2lnbmVkIGludCAqKSBHTHB0cikpCkBAIC0xNjMsNiArMTQxLDcgQEAKICNkZWZpbmUgQVJDSF9IQVNfUE9XRVJfSU5JVCAxCiAKIGV4dGVybiBpbnQgYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlOworZXh0ZXJuIGludCBhY3BpX3VzZV90aW1lcl9vdmVycmlkZTsKIAogI2VuZGlmIC8qX19LRVJORUxfXyovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hbHRlcm5hdGl2ZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2FsdGVybmF0aXZlLmgKaW5kZXggYTU4NDgyNi4uYTY2NTdiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FsdGVybmF0aXZlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2FsdGVybmF0aXZlLmgKQEAgLTQsNiArNCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogCiBzdHJ1Y3QgYWx0X2luc3RyIHsKQEAgLTEzMyw0ICsxMzQsMTUgQEAKICNkZWZpbmUgTE9DS19QUkVGSVggIiIKICNlbmRpZgogCitzdHJ1Y3QgcGFyYXZpcnRfcGF0Y2g7CisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCit2b2lkIGFwcGx5X3BhcmF2aXJ0KHN0cnVjdCBwYXJhdmlydF9wYXRjaCAqc3RhcnQsIHN0cnVjdCBwYXJhdmlydF9wYXRjaCAqZW5kKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK2FwcGx5X3BhcmF2aXJ0KHN0cnVjdCBwYXJhdmlydF9wYXRjaCAqc3RhcnQsIHN0cnVjdCBwYXJhdmlydF9wYXRjaCAqZW5kKQore30KKyNkZWZpbmUgX19zdGFydF9wYXJhaW5zdHJ1Y3Rpb25zIE5VTEwKKyNkZWZpbmUgX19zdG9wX3BhcmFpbnN0cnVjdGlvbnMgTlVMTAorI2VuZGlmCisKICNlbmRpZiAvKiBfWDg2XzY0X0FMVEVSTkFUSVZFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hdG9taWMuaAppbmRleCAwMDdlODhkLi43MDZjYTRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2F0b21pYy5oCkBAIC0yMSw3ICsyMSw3IEBACiAgKiBvbiB1cy4gV2UgbmVlZCB0byB1c2UgX2V4YWN0bHlfIHRoZSBhZGRyZXNzIHRoZSB1c2VyIGdhdmUgdXMsCiAgKiBub3Qgc29tZSBhbGlhcyB0aGF0IGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uLgogICovCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKIAogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKQEAgLTE4OSw5ICsxODksOSBAQAogewogCWludCBfX2kgPSBpOwogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlMT0NLX1BSRUZJWCAieGFkZGwgJTAsICUxOyIKLQkJOiI9ciIoaSkKLQkJOiJtIih2LT5jb3VudGVyKSwgIjAiKGkpKTsKKwkJTE9DS19QUkVGSVggInhhZGRsICUwLCAlMSIKKwkJOiIrciIgKGkpLCAiK20iICh2LT5jb3VudGVyKQorCQk6IDogIm1lbW9yeSIpOwogCXJldHVybiBpICsgX19pOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYnVnLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvYnVnLmgKaW5kZXggODBhYzFmZS4uNjgyNjA2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9idWcuaApAQCAtMSwzMCArMSwzMCBAQAogI2lmbmRlZiBfX0FTTV9YODY2NF9CVUdfSAogI2RlZmluZSBfX0FTTV9YODY2NF9CVUdfSCAxCiAKLSNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KLQotLyoKLSAqIFRlbGwgdGhlIHVzZXIgdGhlcmUgaXMgc29tZSBwcm9ibGVtLiAgVGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGRlY29kZXMgCi0gKiB0aGlzIGZyYW1lLgotICovCi1zdHJ1Y3QgYnVnX2ZyYW1lIHsKLQl1bnNpZ25lZCBjaGFyIHVkMlsyXTsKLQl1bnNpZ25lZCBjaGFyIHB1c2g7Ci0Jc2lnbmVkIGludCBmaWxlbmFtZTsKLQl1bnNpZ25lZCBjaGFyIHJldDsKLQl1bnNpZ25lZCBzaG9ydCBsaW5lOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQogI2lmZGVmIENPTkZJR19CVUcKICNkZWZpbmUgSEFWRV9BUkNIX0JVRwotLyogV2UgdHVybiB0aGUgYnVnIGZyYW1lIGludG8gdmFsaWQgaW5zdHJ1Y3Rpb25zIHRvIG5vdCBjb25mdXNlCi0gICB0aGUgZGlzYXNzZW1ibGVyLiBUaGFua3MgdG8gSmFuIEJldWxpY2ggJiBTdXJlc2ggU2lkZGhhCi0gICBmb3IgbmljZSBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCi0gICBUaGUgbWFnaWMgbnVtYmVycyBnZW5lcmF0ZSBtb3YgJDY0Yml0aW1tLCVlYXggOyByZXQgJG9mZnNldC4gKi8KLSNkZWZpbmUgQlVHKCkgCQkJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKAkJCQkJCQlcCi0JInVkMiA7IHB1c2hxICQlYzEgOyByZXQgJCVjMCIgOjogCQkJCVwKLQkJICAgICAiaSIoX19MSU5FX18pLCAiaSIgKF9fRklMRV9fKSkKKworI2lmZGVmIENPTkZJR19ERUJVR19CVUdWRVJCT1NFCisjZGVmaW5lIEJVRygpCQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlhc20gdm9sYXRpbGUoIjE6XHR1ZDJcbiIJCQkJXAorCQkJICAgICAiLnB1c2hzZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiXG4iCQlcCisJCQkgICAgICIyOlx0LnF1YWQgMWIsICVjMFxuIgkJCVwKKwkJCSAgICAgIlx0LndvcmQgJWMxLCAwXG4iCQkJCVwKKwkJCSAgICAgIlx0Lm9yZyAyYislYzJcbiIJCQkJXAorCQkJICAgICAiLnBvcHNlY3Rpb24iCQkJCVwKKwkJCSAgICAgOiA6ICJpIiAoX19GSUxFX18pLCAiaSIgKF9fTElORV9fKSwJXAorCQkJICAgICAgICAiaSIgKHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KSkpOwlcCisJCWZvcig7OykgOwkJCQkJCVwKKwl9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBCVUcoKQkJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJYXNtIHZvbGF0aWxlKCJ1ZDIiKTsJCQkJCVwKKwkJZm9yKDs7KSA7CQkJCQkJXAorCX0gd2hpbGUoMCkKKyNlbmRpZgorCiB2b2lkIG91dF9vZl9saW5lX2J1Zyh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgb3V0X29mX2xpbmVfYnVnKHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jYWNoZWZsdXNoLmgKaW5kZXggZDMyZjdmNS4uYWIxY2I1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvY2FjaGVmbHVzaC5oCkBAIC03LDYgKzcsNyBAQAogLyogQ2FjaGVzIGFyZW4ndCBicmFpbi1kZWFkIG9uIHRoZSBpbnRlbC4gKi8KICNkZWZpbmUgZmx1c2hfY2FjaGVfYWxsKCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIHBmbikJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKQkJCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jYWxnYXJ5LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvY2FsZ2FyeS5oCmluZGV4IDZiOTNmNWEuLjdlZTkwMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jYWxnYXJ5LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2NhbGdhcnkuaApAQCAtNTEsNiArNTEsOCBAQAogI2RlZmluZSBUQ0VfVEFCTEVfU0laRV80TQkJNgogI2RlZmluZSBUQ0VfVEFCTEVfU0laRV84TQkJNwogCitleHRlcm4gaW50IHVzZV9jYWxnYXJ5OworCiAjaWZkZWYgQ09ORklHX0NBTEdBUllfSU9NTVUKIGV4dGVybiBpbnQgY2FsZ2FyeV9pb21tdV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgZGV0ZWN0X2NhbGdhcnkodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jaGVja3N1bS5oCmluZGV4IDk4OTQ2OWUuLjQxOWZlODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jaGVja3N1bS5oCkBAIC0xOSwxNSArMTksMTYgQEAKICAqIHRoZSBsYXN0IHN0ZXAgYmVmb3JlIHB1dHRpbmcgYSBjaGVja3N1bSBpbnRvIGEgcGFja2V0LgogICogTWFrZSBzdXJlIG5vdCB0byBtaXggd2l0aCA2NGJpdCBjaGVja3N1bXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQorc3RhdGljIGlubGluZSBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQogewogCV9fYXNtX18oCiAJCSIgIGFkZGwgJTEsJTBcbiIKIAkJIiAgYWRjbCAkMHhmZmZmLCUwIgogCQk6ICI9ciIgKHN1bSkKLQkJOiAiciIgKHN1bSA8PCAxNiksICIwIiAoc3VtICYgMHhmZmZmMDAwMCkKKwkJOiAiciIgKChfX2ZvcmNlIHUzMilzdW0gPDwgMTYpLAorCQkgICIwIiAoKF9fZm9yY2UgdTMyKXN1bSAmIDB4ZmZmZjAwMDApCiAJKTsKLQlyZXR1cm4gKH5zdW0pID4+IDE2OworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KSh+KF9fZm9yY2UgdTMyKXN1bSA+PiAxNik7CiB9CiAKIC8qCkBAIC00Myw3ICs0NCw3IEBACiAgKiBpcGg6IGlwdjQgaGVhZGVyCiAgKiBpaGw6IGxlbmd0aCBvZiBoZWFkZXIgLyA0CiAgKi8gCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICppcGgsIHVuc2lnbmVkIGludCBpaGwpIAorc3RhdGljIGlubGluZSBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bTsKIApAQCAtNzAsNyArNzEsNyBAQAogCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKQogCTogIjEiIChpcGgpLCAiMiIgKGlobCkKIAk6ICJtZW1vcnkiKTsKLQlyZXR1cm4oc3VtKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07CiB9CiAKIC8qKiAKQEAgLTg0LDE2ICs4NSwxNyBAQAogICogUmV0dXJucyB0aGUgcHNldWRvIGhlYWRlciBjaGVja3N1bSB0aGUgaW5wdXQgZGF0YS4gUmVzdWx0IGlzIAogICogMzJiaXQgdW5mb2xkZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAKLWNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBzYWRkciwgdW5zaWduZWQgZGFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pIAorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlhc20oIiAgYWRkbCAlMSwgJTBcbiIKIAkgICAgIiAgYWRjbCAlMiwgJTBcbiIKIAkgICAgIiAgYWRjbCAlMywgJTBcbiIKIAkgICAgIiAgYWRjbCAkMCwgJTBcbiIKIAkJOiAiPXIiIChzdW0pCi0JICAgIDogImciIChkYWRkciksICJnIiAoc2FkZHIpLCAiZyIgKChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2KSwgIjAiIChzdW0pKTsKKwkgICAgOiAiZyIgKGRhZGRyKSwgImciIChzYWRkciksCisJICAgICAgImciICgobGVuICsgcHJvdG8pPDw4KSwgIjAiIChzdW0pKTsKICAgICByZXR1cm4gc3VtOwogfQogCkBAIC0xMDksOSArMTExLDkgQEAKICAqIFJldHVybnMgdGhlIDE2Yml0IHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0gdGhlIGlucHV0IGRhdGEgYWxyZWFkeQogICogY29tcGxlbWVudGVkIGFuZCByZWFkeSB0byBiZSBmaWxsZWQgaW4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50IAotY3N1bV90Y3B1ZHBfbWFnaWModW5zaWduZWQgbG9uZyBzYWRkciwgdW5zaWduZWQgbG9uZyBkYWRkciwKLQkJICB1bnNpZ25lZCBzaG9ydCBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCB1bnNpZ25lZCBpbnQgc3VtKSAKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgorY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCSAgdW5zaWduZWQgc2hvcnQgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xMjYsMjUgKzEyOCwyNSBAQAogICogQmVmb3JlIGZpbGxpbmcgaXQgaW4gaXQgbmVlZHMgdG8gYmUgY3N1bV9mb2xkKCknZWQuCiAgKiBidWZmIHNob3VsZCBiZSBhbGlnbmVkIHRvIGEgNjRiaXQgYm91bmRhcnkgaWYgcG9zc2libGUuCiAgKi8gCi1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CiAKICNkZWZpbmUgIF9IQVZFX0FSQ0hfQ09QWV9BTkRfQ1NVTV9GUk9NX1VTRVIgMQogI2RlZmluZSBIQVZFX0NTVU1fQ09QWV9VU0VSIDEKIAogCiAvKiBEbyBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LiBVc2UgdGhlIHdyYXBwZXJzIGJlbG93ICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgY29uc3QgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCQkgICAgICAgdW5zaWduZWQgbGVuLAotCQkJCQkgICAgICAgdW5zaWduZWQgc3VtLCAKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB2b2lkICpzcmMsIGNvbnN0IHZvaWQgKmRzdCwKKwkJCQkJICAgICAgIGludCBsZW4sCisJCQkJCSAgICAgICBfX3dzdW0gc3VtLAogCQkJCQkgICAgICAgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7CiAKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgdW5zaWduZWQgY2hhciBfX3VzZXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAotCQkJCSAgICAgICBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgaXN1bSwgaW50ICplcnJwKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgX191c2VyICpkc3QsCi0JCQkJICAgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IGlzdW0sIGludCAqZXJycCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4sCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCSAgICAgICBpbnQgbGVuLCBfX3dzdW0gaXN1bSwgaW50ICplcnJwKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgX191c2VyICpkc3QsCisJCQkJICAgICAgaW50IGxlbiwgX193c3VtIGlzdW0sIGludCAqZXJycCk7CitleHRlcm4gX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sCisJCQkJCSAgICAgIF9fd3N1bSBzdW0pOwogCiAvKiBPbGQgbmFtZXMuIFRvIGJlIHJlbW92ZWQuICovCiAjZGVmaW5lIGNzdW1fYW5kX2NvcHlfdG9fdXNlciBjc3VtX3BhcnRpYWxfY29weV90b191c2VyCkBAIC0xNTgsNyArMTYwLDcgQEAKICAqIFJldHVybnMgdGhlIDE2Yml0IGZvbGRlZC9pbnZlcnRlZCBjaGVja3N1bSBvZiB0aGUgcGFzc2VkIGJ1ZmZlci4KICAqIFJlYWR5IHRvIGZpbGwgaW4uCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pOworZXh0ZXJuIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pOwogCiAvKioKICAqIGNzdW1faXB2Nl9tYWdpYyAtIENvbXB1dGUgY2hlY2tzdW0gb2YgYW4gSVB2NiBwc2V1ZG8gaGVhZGVyLgpAQCAtMTc2LDkgKzE3OCw5IEBACiBzdHJ1Y3QgaW42X2FkZHI7CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0gMQotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IAotY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCV9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sIHVuc2lnbmVkIGludCBzdW0pOworZXh0ZXJuIF9fc3VtMTYKK2NzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQlfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBhZGQzMl93aXRoX2NhcnJ5KHVuc2lnbmVkIGEsIHVuc2lnbmVkIGIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY3B1ZmVhdHVyZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NwdWZlYXR1cmUuaAppbmRleCBlZTc5MmZhLi4wYjNjNjg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvY3B1ZmVhdHVyZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jcHVmZWF0dXJlLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfUFNFMzYJKDAqMzIrMTcpIC8qIDM2LWJpdCBQU0VzICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BOCQkoMCozMisxOCkgLyogUHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0xGTFNICSgwKjMyKzE5KSAvKiBTdXBwb3J0cyB0aGUgQ0xGTFVTSCBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9EVEVTCSgwKjMyKzIxKSAvKiBEZWJ1ZyBUcmFjZSBTdG9yZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9EUwkJKDAqMzIrMjEpIC8qIERlYnVnIFN0b3JlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FDUEkJKDAqMzIrMjIpIC8qIEFDUEkgdmlhIE1TUiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9NTVgJCSgwKjMyKzIzKSAvKiBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfRlhTUgkoMCozMisyNCkgLyogRlhTQVZFIGFuZCBGWFJTVE9SIGluc3RydWN0aW9ucyAoZmFzdCBzYXZlIGFuZCByZXN0b3JlICovCkBAIC02OCw2ICs2OCw4IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0ZYU0FWRV9MRUFLICgzKjMyKzcpICAvKiBGSVAvRk9QL0ZEUCBsZWFrcyB0aHJvdWdoIEZYU0FWRSAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9VUAkJKDMqMzIrOCkgLyogU01QIGtlcm5lbCBydW5uaW5nIG9uIFVQICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTiAoMyozMis5KSAvKiBJbnRlbCBBcmNoaXRlY3R1cmFsIFBlcmZNb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUEVCUwkoMyozMisxMCkgLyogUHJlY2lzZS1FdmVudCBCYXNlZCBTYW1wbGluZyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9CVFMJCSgzKjMyKzExKSAvKiBCcmFuY2ggVHJhY2UgU3RvcmUgKi8KIAogLyogSW50ZWwtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4MDAwMDAwMDEgKGVjeCksIHdvcmQgNCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9YTU0zCSg0KjMyKyAwKSAvKiBTdHJlYW1pbmcgU0lNRCBFeHRlbnNpb25zLTMgKi8KQEAgLTExMiw1ICsxMTQsOCBAQAogI2RlZmluZSBjcHVfaGFzX2N5cml4X2FyciAgICAgIDAKICNkZWZpbmUgY3B1X2hhc19jZW50YXVyX21jciAgICAwCiAjZGVmaW5lIGNwdV9oYXNfY2xmbHVzaAkgICAgICAgYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxTSCkKKyNkZWZpbmUgY3B1X2hhc19kcyAJICAgICAgIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9EUykKKyNkZWZpbmUgY3B1X2hhc19wZWJzIAkgICAgICAgYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1BFQlMpCisjZGVmaW5lIGNwdV9oYXNfYnRzIAkgICAgICAgYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0JUUykKIAogI2VuZGlmIC8qIF9fQVNNX1g4NjY0X0NQVUZFQVRVUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2RlbGF5LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZGVsYXkuaAppbmRleCA2NWY2NGFjLi5jMjY2OWYxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2RlbGF5LmgKQEAgLTcsMTggKzcsMjEgQEAKICAqIERlbGF5IHJvdXRpbmVzIGNhbGxpbmcgZnVuY3Rpb25zIGluIGFyY2gveDg2XzY0L2xpYi9kZWxheS5jCiAgKi8KICAKKy8qIFVuZGVmaW5lZCBmdW5jdGlvbnMgdG8gZ2V0IGNvbXBpbGUtdGltZSBlcnJvcnMgKi8KIGV4dGVybiB2b2lkIF9fYmFkX3VkZWxheSh2b2lkKTsKIGV4dGVybiB2b2lkIF9fYmFkX25kZWxheSh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7Ci1leHRlcm4gdm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKK2V4dGVybiB2b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbnNlY3MpOwogZXh0ZXJuIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CiBleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOwogCisvKiAweDEwYzcgaXMgMioqMzIgLyAxMDAwMDAwIChyb3VuZGVkIHVwKSAqLwogI2RlZmluZSB1ZGVsYXkobikgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gXAotCSgobikgPiAyMDAwMCA/IF9fYmFkX3VkZWxheSgpIDogX19jb25zdF91ZGVsYXkoKG4pICogMHgxMGM2dWwpKSA6IFwKKwkoKG4pID4gMjAwMDAgPyBfX2JhZF91ZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjN3VsKSkgOiBcCiAJX191ZGVsYXkobikpCiAKKy8qIDB4NSBpcyAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCiAjZGVmaW5lIG5kZWxheShuKSAoX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCiAgICAgICAgKChuKSA+IDIwMDAwID8gX19iYWRfbmRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpKSA6IFwKICAgICAgICBfX25kZWxheShuKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9kZXNjLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZGVzYy5oCmluZGV4IGViNzcyM2EuLjkxM2Q2YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9kZXNjLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2Rlc2MuaApAQCAtOSw2NCArOSwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2NfZGVmcy5oPgogCiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKLS8vIDggYnl0ZSBzZWdtZW50IGRlc2NyaXB0b3IKLXN0cnVjdCBkZXNjX3N0cnVjdCB7IAotCXUxNiBsaW1pdDA7Ci0JdTE2IGJhc2UwOwotCXVuc2lnbmVkIGJhc2UxIDogOCwgdHlwZSA6IDQsIHMgOiAxLCBkcGwgOiAyLCBwIDogMTsKLQl1bnNpZ25lZCBsaW1pdCA6IDQsIGF2bCA6IDEsIGwgOiAxLCBkIDogMSwgZyA6IDEsIGJhc2UyIDogODsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IAotCi1zdHJ1Y3Qgbl9kZXNjX3N0cnVjdCB7IAotCXVuc2lnbmVkIGludCBhLGI7Ci19OyAJCi0KIGV4dGVybiBzdHJ1Y3QgZGVzY19zdHJ1Y3QgY3B1X2dkdF90YWJsZVtHRFRfRU5UUklFU107CiAKLWVudW0geyAKLQlHQVRFX0lOVEVSUlVQVCA9IDB4RSwgCi0JR0FURV9UUkFQID0gMHhGLCAJCi0JR0FURV9DQUxMID0gMHhDLAotfTsgCQotCi0vLyAxNmJ5dGUgZ2F0ZQotc3RydWN0IGdhdGVfc3RydWN0IHsgICAgICAgICAgCi0JdTE2IG9mZnNldF9sb3c7Ci0JdTE2IHNlZ21lbnQ7IAotCXVuc2lnbmVkIGlzdCA6IDMsIHplcm8wIDogNSwgdHlwZSA6IDUsIGRwbCA6IDIsIHAgOiAxOwotCXUxNiBvZmZzZXRfbWlkZGxlOwotCXUzMiBvZmZzZXRfaGlnaDsKLQl1MzIgemVybzE7IAotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBQVFJfTE9XKHgpICgodW5zaWduZWQgbG9uZykoeCkgJiAweEZGRkYpIAotI2RlZmluZSBQVFJfTUlERExFKHgpICgoKHVuc2lnbmVkIGxvbmcpKHgpID4+IDE2KSAmIDB4RkZGRikKLSNkZWZpbmUgUFRSX0hJR0goeCkgKCh1bnNpZ25lZCBsb25nKSh4KSA+PiAzMikKLQotZW51bSB7IAotCURFU0NfVFNTID0gMHg5LAotCURFU0NfTERUID0gMHgyLAotfTsgCi0KLS8vIExEVCBvciBUU1MgZGVzY3JpcHRvciBpbiB0aGUgR0RULiAxNiBieXRlcy4KLXN0cnVjdCBsZHR0c3NfZGVzYyB7IAotCXUxNiBsaW1pdDA7Ci0JdTE2IGJhc2UwOwotCXVuc2lnbmVkIGJhc2UxIDogOCwgdHlwZSA6IDUsIGRwbCA6IDIsIHAgOiAxOwotCXVuc2lnbmVkIGxpbWl0MSA6IDQsIHplcm8wIDogMywgZyA6IDEsIGJhc2UyIDogODsKLQl1MzIgYmFzZTM7Ci0JdTMyIHplcm8xOyAKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IAotCi1zdHJ1Y3QgZGVzY19wdHIgewotCXVuc2lnbmVkIHNob3J0IHNpemU7Ci0JdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSA7Ci0KICNkZWZpbmUgbG9hZF9UUl9kZXNjKCkgYXNtIHZvbGF0aWxlKCJsdHIgJXcwIjo6InIiIChHRFRfRU5UUllfVFNTKjgpKQogI2RlZmluZSBsb2FkX0xEVF9kZXNjKCkgYXNtIHZvbGF0aWxlKCJsbGR0ICV3MCI6OiJyIiAoR0RUX0VOVFJZX0xEVCo4KSkKICNkZWZpbmUgY2xlYXJfTERUKCkgIGFzbSB2b2xhdGlsZSgibGxkdCAldzAiOjoiciIgKDApKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2Rlc2NfZGVmcy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2Rlc2NfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTAwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZGVzY19kZWZzLmgKQEAgLTAsMCArMSw2OSBAQAorLyogV3JpdHRlbiAyMDAwIGJ5IEFuZGkgS2xlZW4gKi8KKyNpZm5kZWYgX19BUkNIX0RFU0NfREVGU19ICisjZGVmaW5lIF9fQVJDSF9ERVNDX0RFRlNfSAorCisvKgorICogU2VnbWVudCBkZXNjcmlwdG9yIHN0cnVjdHVyZSBkZWZpbml0aW9ucywgdXNhYmxlIGZyb20gYm90aCB4ODZfNjQgYW5kIGkzODYKKyAqIGFyY2hzLgorICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvLyA4IGJ5dGUgc2VnbWVudCBkZXNjcmlwdG9yCitzdHJ1Y3QgZGVzY19zdHJ1Y3QgeworCXUxNiBsaW1pdDA7CisJdTE2IGJhc2UwOworCXVuc2lnbmVkIGJhc2UxIDogOCwgdHlwZSA6IDQsIHMgOiAxLCBkcGwgOiAyLCBwIDogMTsKKwl1bnNpZ25lZCBsaW1pdCA6IDQsIGF2bCA6IDEsIGwgOiAxLCBkIDogMSwgZyA6IDEsIGJhc2UyIDogODsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBuX2Rlc2Nfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgYSxiOworfTsKKworZW51bSB7CisJR0FURV9JTlRFUlJVUFQgPSAweEUsCisJR0FURV9UUkFQID0gMHhGLAorCUdBVEVfQ0FMTCA9IDB4QywKK307CisKKy8vIDE2Ynl0ZSBnYXRlCitzdHJ1Y3QgZ2F0ZV9zdHJ1Y3QgeworCXUxNiBvZmZzZXRfbG93OworCXUxNiBzZWdtZW50OworCXVuc2lnbmVkIGlzdCA6IDMsIHplcm8wIDogNSwgdHlwZSA6IDUsIGRwbCA6IDIsIHAgOiAxOworCXUxNiBvZmZzZXRfbWlkZGxlOworCXUzMiBvZmZzZXRfaGlnaDsKKwl1MzIgemVybzE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFBUUl9MT1coeCkgKCh1bnNpZ25lZCBsb25nKSh4KSAmIDB4RkZGRikKKyNkZWZpbmUgUFRSX01JRERMRSh4KSAoKCh1bnNpZ25lZCBsb25nKSh4KSA+PiAxNikgJiAweEZGRkYpCisjZGVmaW5lIFBUUl9ISUdIKHgpICgodW5zaWduZWQgbG9uZykoeCkgPj4gMzIpCisKK2VudW0geworCURFU0NfVFNTID0gMHg5LAorCURFU0NfTERUID0gMHgyLAorfTsKKworLy8gTERUIG9yIFRTUyBkZXNjcmlwdG9yIGluIHRoZSBHRFQuIDE2IGJ5dGVzLgorc3RydWN0IGxkdHRzc19kZXNjIHsKKwl1MTYgbGltaXQwOworCXUxNiBiYXNlMDsKKwl1bnNpZ25lZCBiYXNlMSA6IDgsIHR5cGUgOiA1LCBkcGwgOiAyLCBwIDogMTsKKwl1bnNpZ25lZCBsaW1pdDEgOiA0LCB6ZXJvMCA6IDMsIGcgOiAxLCBiYXNlMiA6IDg7CisJdTMyIGJhc2UzOworCXUzMiB6ZXJvMTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBkZXNjX3B0ciB7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIDsKKworCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZhMDNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2RldmljZS5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBBcmNoIHNwZWNpZmljIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworI2lmbmRlZiBfQVNNX1g4Nl82NF9ERVZJQ0VfSAorI2RlZmluZSBfQVNNX1g4Nl82NF9ERVZJQ0VfSAorCitzdHJ1Y3QgZGV2X2FyY2hkYXRhIHsKKyNpZmRlZiBDT05GSUdfQUNQSQorCXZvaWQJKmFjcGlfaGFuZGxlOworI2VuZGlmCit9OworCisjZW5kaWYgLyogX0FTTV9YODZfNjRfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2RtYS1tYXBwaW5nLmgKaW5kZXggMTAxNzRiMS4uYmU5ZWM2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2RtYS1tYXBwaW5nLmgKQEAgLTE4MCwxMiArMTgwLDEzIEBACiAJcmV0dXJuIGJvb3RfY3B1X2RhdGEueDg2X2NsZmx1c2hfc2l6ZTsKIH0KIAotI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChoKSAxCisjZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQsIGgpIDEKIAogZXh0ZXJuIGludCBkbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotZG1hX2NhY2hlX3N5bmModm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCitkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CiAJZmx1c2hfd3JpdGVfYnVmZmVycygpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2VsZi5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2VsZi5oCmluZGV4IGE0MDZmY2IuLjZkMjRlYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZWxmLmgKQEAgLTQ1LDcgKzQ1LDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbXBhdC5oPgogCiAvKgogICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9mdXRleC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2Z1dGV4LmgKaW5kZXggOTgwNGJmMC4uNWNkZmIwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2Z1dGV4LmgKQEAgLTU1LDcgKzU1LDcgQEAKIAlpZiAoISBhY2Nlc3Nfb2sgKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpbmNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBGVVRFWF9PUF9TRVQ6CkBAIC03OCw3ICs3OCw3IEBACiAJCXJldCA9IC1FTk9TWVM7CiAJfQogCi0JZGVjX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlpZiAoIXJldCkgewogCQlzd2l0Y2ggKGNtcCkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2dlbmFwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9nZW5hcGljLmgKaW5kZXggYTBlOWE0Yi4uYjgwZjRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2dlbmFwaWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZ2VuYXBpYy5oCkBAIC0zMCw2ICszMCw2IEBACiB9OwogCiAKLWV4dGVybiBzdHJ1Y3QgZ2VuYXBpYyAqZ2VuYXBpYzsKK2V4dGVybiBzdHJ1Y3QgZ2VuYXBpYyAqZ2VuYXBpYywgKmdlbmFwaWNfZm9yY2UsIGFwaWNfZmxhdDsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaHdfaXJxLmgKaW5kZXggNzkyZGQ1Mi4uMTc5Y2NlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9od19pcnEuaApAQCAtNzYsNiArNzYsOCBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIHR5cGVkZWYgaW50IHZlY3Rvcl9pcnFfdFtOUl9WRUNUT1JTXTsKIERFQ0xBUkVfUEVSX0NQVSh2ZWN0b3JfaXJxX3QsIHZlY3Rvcl9pcnEpOworZXh0ZXJuIHZvaWQgX19zZXR1cF92ZWN0b3JfaXJxKGludCBjcHUpOworZXh0ZXJuIHNwaW5sb2NrX3QgdmVjdG9yX2xvY2s7CiAKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBpcnEgZGV0YWlscyBuZWVkZWQgYnkgaXJxLmMsIHByb2Nlc3MuYywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oCmluZGV4IDE3MWVjMmQuLjU2MWVjYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaApAQCAtMTIsMTAgKzEyLDYgQEAKIAogI2RlZmluZSBBUElDX01JU01BVENIX0RFQlVHCiAKLSNkZWZpbmUgSU9fQVBJQ19CQVNFKGlkeCkgXAotCQkoKHZvbGF0aWxlIGludCAqKShfX2ZpeF90b192aXJ0KEZJWF9JT19BUElDX0JBU0VfMCArIGlkeCkgXAotCQkrIChtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyICYgflBBR0VfTUFTSykpKQotCiAvKgogICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgSU8tQVBJQzoKICAqLwpAQCAtMTE5LDM2ICsxMTUsNiBAQAogLyogbm9uLTAgaWYgZGVmYXVsdCAodGFibGUtbGVzcykgTVAgY29uZmlndXJhdGlvbiAqLwogZXh0ZXJuIGludCBtcGNfZGVmYXVsdF90eXBlOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpb19hcGljX3JlYWQodW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JKklPX0FQSUNfQkFTRShhcGljKSA9IHJlZzsKLQlyZXR1cm4gKihJT19BUElDX0JBU0UoYXBpYykrNCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpb19hcGljX3dyaXRlKHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JKklPX0FQSUNfQkFTRShhcGljKSA9IHJlZzsKLQkqKElPX0FQSUNfQkFTRShhcGljKSs0KSA9IHZhbHVlOwotfQotCi0vKgotICogUmUtd3JpdGUgYSB2YWx1ZTogdG8gYmUgdXNlZCBmb3IgcmVhZC1tb2RpZnktd3JpdGUKLSAqIGN5Y2xlcyB3aGVyZSB0aGUgcmVhZCBhbHJlYWR5IHNldCB1cCB0aGUgaW5kZXggcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpb19hcGljX21vZGlmeSh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHZhbHVlKQotewotCSooSU9fQVBJQ19CQVNFKGFwaWMpKzQpID0gdmFsdWU7Ci19Ci0KLS8qCi0gKiBTeW5jaHJvbml6ZSB0aGUgSU8tQVBJQyBhbmQgdGhlIENQVSBieSBkb2luZwotICogYSBkdW1teSByZWFkIGZyb20gdGhlIElPLUFQSUMKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGlvX2FwaWNfc3luYyh1bnNpZ25lZCBpbnQgYXBpYykKLXsKLQkodm9pZCkgKihJT19BUElDX0JBU0UoYXBpYykrNCk7Ci19Ci0KIC8qIDEgaWYgIm5vYXBpYyIgYm9vdCBvcHRpb24gcGFzc2VkICovCiBleHRlcm4gaW50IHNraXBfaW9hcGljX3NldHVwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaW9jdGxzLmgKaW5kZXggNjJjYWY4Yi4uM2ZjMGIxNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pb2N0bHMuaApAQCAtNDYsNiArNDYsMTAgQEAKICNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tc3IuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tc3IuaAppbmRleCAzN2UxOTQxLi4zMjI3YmM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvbXNyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L21zci5oCkBAIC0xNjksOCArMTY5LDggQEAKICNkZWZpbmUgTVNSX0xTVEFSIDB4YzAwMDAwODIgCQkvKiBsb25nIG1vZGUgU1lTQ0FMTCB0YXJnZXQgKi8KICNkZWZpbmUgTVNSX0NTVEFSIDB4YzAwMDAwODMJCS8qIGNvbXBhdGliaWxpdHkgbW9kZSBTWVNDQUxMIHRhcmdldCAqLwogI2RlZmluZSBNU1JfU1lTQ0FMTF9NQVNLIDB4YzAwMDAwODQJLyogRUZMQUdTIG1hc2sgZm9yIHN5c2NhbGwgKi8KLSNkZWZpbmUgTVNSX0ZTX0JBU0UgMHhjMDAwMDEwMAkJLyogNjRiaXQgR1MgYmFzZSAqLwotI2RlZmluZSBNU1JfR1NfQkFTRSAweGMwMDAwMTAxCQkvKiA2NGJpdCBGUyBiYXNlICovCisjZGVmaW5lIE1TUl9GU19CQVNFIDB4YzAwMDAxMDAJCS8qIDY0Yml0IEZTIGJhc2UgKi8KKyNkZWZpbmUgTVNSX0dTX0JBU0UgMHhjMDAwMDEwMQkJLyogNjRiaXQgR1MgYmFzZSAqLwogI2RlZmluZSBNU1JfS0VSTkVMX0dTX0JBU0UgIDB4YzAwMDAxMDIJLyogU3dhcEdTIEdTIHNoYWRvdyAob3IgVVNFUl9HUyBmcm9tIGtlcm5lbCkgKi8gCiAvKiBFRkVSIGJpdHM6ICovIAogI2RlZmluZSBfRUZFUl9TQ0UgMCAgLyogU1lTQ0FMTC9TWVNSRVQgKi8KQEAgLTE4OSw2ICsxODksNyBAQAogCiAjZGVmaW5lIE1TUl9JQTMyX1BFUkZDVFIwICAgICAgMHhjMQogI2RlZmluZSBNU1JfSUEzMl9QRVJGQ1RSMSAgICAgIDB4YzIKKyNkZWZpbmUgTVNSX0ZTQl9GUkVRCQkweGNkCiAKICNkZWZpbmUgTVNSX01UUlJjYXAJCTB4MGZlCiAjZGVmaW5lIE1TUl9JQTMyX0JCTF9DUl9DVEwgICAgICAgIDB4MTE5CkBAIC0yMTAsNiArMjExLDEwIEBACiAjZGVmaW5lIE1TUl9JQTMyX0xBU1RJTlRGUk9NSVAgICAgIDB4MWRkCiAjZGVmaW5lIE1TUl9JQTMyX0xBU1RJTlRUT0lQICAgICAgIDB4MWRlCiAKKyNkZWZpbmUgTVNSX0lBMzJfUEVCU19FTkFCTEUJCTB4M2YxCisjZGVmaW5lIE1TUl9JQTMyX0RTX0FSRUEJCTB4NjAwCisjZGVmaW5lIE1TUl9JQTMyX1BFUkZfQ0FQQUJJTElUSUVTCTB4MzQ1CisKICNkZWZpbmUgTVNSX01UUlJmaXg2NEtfMDAwMDAJMHgyNTAKICNkZWZpbmUgTVNSX01UUlJmaXgxNktfODAwMDAJMHgyNTgKICNkZWZpbmUgTVNSX01UUlJmaXgxNktfQTAwMDAJMHgyNTkKQEAgLTMwNyw2ICszMTIsOSBAQAogI2RlZmluZSBNU1JfSUEzMl9QRVJGX1NUQVRVUwkJMHgxOTgKICNkZWZpbmUgTVNSX0lBMzJfUEVSRl9DVEwJCTB4MTk5CiAKKyNkZWZpbmUgTVNSX0lBMzJfTVBFUkYJCQkweEU3CisjZGVmaW5lIE1TUl9JQTMyX0FQRVJGCQkJMHhFOAorCiAjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX0NPTlRST0wJCTB4MTlhCiAjZGVmaW5lIE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVAkweDE5YgogI2RlZmluZSBNU1JfSUEzMl9USEVSTV9TVEFUVVMJCTB4MTljCkBAIC00MDcsNCArNDE1LDEzIEBACiAjZGVmaW5lIE1TUl9QNF9VMkxfRVNDUjAgCQkweDNiMAogI2RlZmluZSBNU1JfUDRfVTJMX0VTQ1IxIAkJMHgzYjEKIAorLyogSW50ZWwgQ29yZS1iYXNlZCBDUFUgcGVyZm9ybWFuY2UgY291bnRlcnMgKi8KKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIwCTB4MzA5CisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMQkweDMwYQorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0ZJWEVEX0NUUjIJMHgzMGIKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFJfQ1RSTAkweDM4ZAorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9TVEFUVVMJMHgzOGUKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfQ1RSTAkweDM4ZgorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9PVkZfQ1RSTAkweDM5MAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9ubWkuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9ubWkuaAppbmRleCBmMzY3ZDQwLi43MjM3NWU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvbm1pLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L25taS5oCkBAIC03Nyw0ICs3Nyw3IEBACiAKIGV4dGVybiBpbnQgdW5rbm93bl9ubWlfcGFuaWM7CiAKK3ZvaWQgX190cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKHZvaWQpOworI2RlZmluZSB0cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKCkgX190cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKCkKKwogI2VuZGlmIC8qIEFTTV9OTUlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BjaS1kaXJlY3QuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wY2ktZGlyZWN0LmgKaW5kZXggZWJhOWNiNC4uNjgyM2ZhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BjaS1kaXJlY3QuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGNpLWRpcmVjdC5oCkBAIC0xMCw2ICsxMCw3IEBACiBleHRlcm4gdTggcmVhZF9wY2lfY29uZmlnX2J5dGUodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQpOwogZXh0ZXJuIHUxNiByZWFkX3BjaV9jb25maWdfMTYodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQpOwogZXh0ZXJuIHZvaWQgd3JpdGVfcGNpX2NvbmZpZyh1OCBidXMsIHU4IHNsb3QsIHU4IGZ1bmMsIHU4IG9mZnNldCwgdTMyIHZhbCk7CitleHRlcm4gdm9pZCB3cml0ZV9wY2lfY29uZmlnX2J5dGUodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQsIHU4IHZhbCk7CiAKIGV4dGVybiBpbnQgZWFybHlfcGNpX2FsbG93ZWQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZGEuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZGEuaAppbmRleCAxNDk5NmQ5Li41NjQyNjM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcGRhLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BkYS5oCkBAIC0xMDksNiArMTA5LDE1IEBACiAjZGVmaW5lIHN1Yl9wZGEoZmllbGQsdmFsKSBwZGFfdG9fb3AoInN1YiIsZmllbGQsdmFsKQogI2RlZmluZSBvcl9wZGEoZmllbGQsdmFsKSBwZGFfdG9fb3AoIm9yIixmaWVsZCx2YWwpCiAKKy8qIFRoaXMgaXMgbm90IGF0b21pYyBhZ2FpbnN0IG90aGVyIENQVXMgLS0gQ1BVIHByZWVtcHRpb24gbmVlZHMgdG8gYmUgb2ZmICovCisjZGVmaW5lIHRlc3RfYW5kX2NsZWFyX2JpdF9wZGEoYml0LGZpZWxkKSAoewkJXAorCWludCBvbGRfXzsJCQkJCQlcCisJYXNtIHZvbGF0aWxlKCJidHIgJTIsJSVnczolYzNcblx0c2JibCAlMCwlMCIJCVwKKwkgICAgOiAiPXIiIChvbGRfXyksICIrbSIgKF9wcm94eV9wZGEuZmllbGQpIAkJXAorCSAgICA6ICJkSXIiIChiaXQpLCAiaSIgKHBkYV9vZmZzZXQoZmllbGQpKSA6ICJtZW1vcnkiKTsJXAorCW9sZF9fOwkJCQkJCQlcCit9KQorCiAjZW5kaWYKIAogI2RlZmluZSBQREFfU1RBQ0tPRkZTRVQgKDUqOCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCmluZGV4IDY4OTllNzcuLjU5OTAxYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaApAQCAtMjIxLDIwICsyMjEsMTkgQEAKICNkZWZpbmUgX19TMTEwCVBBR0VfU0hBUkVEX0VYRUMKICNkZWZpbmUgX19TMTExCVBBR0VfU0hBUkVEX0VYRUMKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBnZF9iYWQocGdkX3QgcGdkKSAKLXsgCi0gICAgICAgdW5zaWduZWQgbG9uZyB2YWwgPSBwZ2RfdmFsKHBnZCk7Ci0gICAgICAgdmFsICY9IH5QVEVfTUFTSzsgCi0gICAgICAgdmFsICY9IH4oX1BBR0VfVVNFUiB8IF9QQUdFX0RJUlRZKTsgCi0gICAgICAgcmV0dXJuIHZhbCAmIH4oX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfQUNDRVNTRUQpOyAgICAgIAotfSAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZ2RfYmFkKHBnZF90IHBnZCkKK3sKKwlyZXR1cm4gcGdkX3ZhbChwZ2QpICYgfihQVEVfTUFTSyB8IF9LRVJOUEdfVEFCTEUgfCBfUEFHRV9VU0VSKTsKK30KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB1ZF9iYWQocHVkX3QgcHVkKQogewotICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsID0gcHVkX3ZhbChwdWQpOwotICAgICAgIHZhbCAmPSB+UFRFX01BU0s7Ci0gICAgICAgdmFsICY9IH4oX1BBR0VfVVNFUiB8IF9QQUdFX0RJUlRZKTsKLSAgICAgICByZXR1cm4gdmFsICYgfihfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9BQ0NFU1NFRCk7CisJcmV0dXJuIHB1ZF92YWwocHVkKSAmIH4oUFRFX01BU0sgfCBfS0VSTlBHX1RBQkxFIHwgX1BBR0VfVVNFUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwbWRfYmFkKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX3ZhbChwbWQpICYgfihQVEVfTUFTSyB8IF9LRVJOUEdfVEFCTEUgfCBfUEFHRV9VU0VSKTsKIH0KIAogI2RlZmluZSBwdGVfbm9uZSh4KQkoIXB0ZV92YWwoeCkpCkBAIC0zNDcsNyArMzQ2LDYgQEAKICNkZWZpbmUgcG1kX25vbmUoeCkJKCFwbWRfdmFsKHgpKQogI2RlZmluZSBwbWRfcHJlc2VudCh4KQkocG1kX3ZhbCh4KSAmIF9QQUdFX1BSRVNFTlQpCiAjZGVmaW5lIHBtZF9jbGVhcih4cCkJZG8geyBzZXRfcG1kKHhwLCBfX3BtZCgwKSk7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXBtZF9iYWQoeCkJKChwbWRfdmFsKHgpICYgKH5QVEVfTUFTSyAmIH5fUEFHRV9VU0VSKSkgIT0gX0tFUk5QR19UQUJMRSApCiAjZGVmaW5lIHBmbl9wbWQobnIscHJvdCkgKF9fcG1kKCgobnIpIDw8IFBBR0VfU0hJRlQpIHwgcGdwcm90X3ZhbChwcm90KSkpCiAjZGVmaW5lIHBtZF9wZm4oeCkgICgocG1kX3ZhbCh4KSAmIF9fUEhZU0lDQUxfTUFTSykgPj4gUEFHRV9TSElGVCkKIApAQCAtMzY2LDYgKzM2NCw3IEBACiB7IAogCXB0ZV90IHB0ZTsKIAlwdGVfdmFsKHB0ZSkgPSBwaHlzcGFnZSB8IHBncHJvdF92YWwocGdwcm90KTsgCisJcHRlX3ZhbChwdGUpICY9IF9fc3VwcG9ydGVkX3B0ZV9tYXNrOwogCXJldHVybiBwdGU7IAogfQogIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb2Nlc3Nvci5oCmluZGV4IGRlOWMzMTQuLjc2NTUyZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvY2Vzc29yLmgKQEAgLTQ3NSw2ICs0NzUsMTYgQEAKIAkJOiA6ImEiIChlYXgpLCAiYyIgKGVjeCkpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGlfbXdhaXQodW5zaWduZWQgbG9uZyBlYXgsIHVuc2lnbmVkIGxvbmcgZWN4KQoreworCS8qICJtd2FpdCAlZWF4LCVlY3g7IiAqLworCWFzbSB2b2xhdGlsZSgKKwkJInN0aTsgLmJ5dGUgMHgwZiwweDAxLDB4Yzk7IgorCQk6IDoiYSIgKGVheCksICJjIiAoZWN4KSk7Cit9CisKK2V4dGVybiB2b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGVheCwgdW5zaWduZWQgbG9uZyBlY3gpOworCiAjZGVmaW5lIHN0YWNrX2N1cnJlbnQoKSBcCiAoewkJCQkJCQkJXAogCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7CQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCmluZGV4IGMxODFmZWYuLjZkMzI0YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCkBAIC02MSw3ICs2MSw2IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBudW1hX2ZyZWVfYWxsX2Jvb3RtZW0odm9pZCk7CiAKIGV4dGVybiB2b2lkIHJlc2VydmVfYm9vdG1lbV9nZW5lcmljKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbGVuKTsKLWV4dGVybiB2b2lkIGZyZWVfYm9vdG1lbV9nZW5lcmljKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbGVuKTsKIAogZXh0ZXJuIHZvaWQgbG9hZF9nc19pbmRleCh1bnNpZ25lZCBncyk7CiAKQEAgLTg4LDYgKzg3LDcgQEAKIGV4dGVybiB2b2lkIHNldHVwX25vZGVfYm9vdG1lbShpbnQgbm9kZWlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiAKIGV4dGVybiB2b2lkIGVhcmx5X3F1aXJrcyh2b2lkKTsKK2V4dGVybiB2b2lkIHF1aXJrX2ludGVsX2lycWJhbGFuY2Uodm9pZCk7CiBleHRlcm4gdm9pZCBjaGVja19lZmVyKHZvaWQpOwogCiBleHRlcm4gaW50IHVuaGFuZGxlZF9zaWduYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBzaWcpOwpAQCAtMTIyLDYgKzEyMiw4IEBACiBleHRlcm4gaW50IHJlYm9vdF9mb3JjZTsKIGV4dGVybiBpbnQgbm90c2Nfc2V0dXAoY2hhciAqKTsKIAorZXh0ZXJuIGludCB0aW1lcl9vdmVyXzgyNTQ7CisKIGV4dGVybiBpbnQgZ3NpX2lycV9zaGFyaW5nKGludCBnc2kpOwogCiBleHRlcm4gdm9pZCBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Jpby5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Jpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzUwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcmlvLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIERlcml2ZWQgZnJvbSBpbmNsdWRlL2FzbS1pMzg2L21hY2gtc3VtbWl0L21hY2hfbXBwYXJzZS5oCisgKiAgICAgICAgICBhbmQgaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvYmlvc19lYmRhLmgKKyAqCisgKiBBdXRob3I6IExhdXJlbnQgVml2aWVyIDxMYXVyZW50LlZpdmllckBidWxsLm5ldD4KKyAqLworCisjaWZuZGVmIF9fQVNNX1JJT19ICisjZGVmaW5lIF9fQVNNX1JJT19ICisKKyNkZWZpbmUgUklPX1RBQkxFX1ZFUlNJT04JMworCitzdHJ1Y3QgcmlvX3RhYmxlX2hkciB7CisJdTggdmVyc2lvbjsgICAgICAvKiBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGRhdGEgc3RydWN0dXJlICAqLworCXU4IG51bV9zY2FsX2RldjsgLyogIyBvZiBTY2FsYWJpbGl0eSBkZXZpY2VzICAgICAgICAgICAgICAgKi8KKwl1OCBudW1fcmlvX2RldjsgIC8qICMgb2YgUklPIEkvTyBkZXZpY2VzICAgICAgICAgICAgICAgICAgICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NhbF9kZXRhaWwgeworCXU4IG5vZGVfaWQ7ICAgICAgLyogU2NhbGFiaWxpdHkgTm9kZSBJRCAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgQ0JBUjsgICAgICAgIC8qIEFkZHJlc3Mgb2YgMU1CIHJlZ2lzdGVyIHNwYWNlICAgICAgICAgICovCisJdTggcG9ydDBub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGPU5vbmUgICAqLworCXU4IHBvcnQwcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAgKi8KKwkgICAgICAgICAgICAgICAgIC8qIDB4RkY9Tm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTggcG9ydDFub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGID0gTm9uZSAqLworCXU4IHBvcnQxcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAgKi8KKwkgICAgICAgICAgICAgICAgIC8qIDB4RkY9Tm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTggcG9ydDJub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGID0gTm9uZSAqLworCXU4IHBvcnQycG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAgKi8KKwkgICAgICAgICAgICAgICAgIC8qIDB4RkY9Tm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTggY2hhc3Npc19udW07ICAvKiAxIGJhc2VkIENoYXNzaXMgbnVtYmVyICgxID0gYm9vdCBub2RlKSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJpb19kZXRhaWwgeworCXU4IG5vZGVfaWQ7ICAgICAgLyogUklPIE5vZGUgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgQkJBUjsgICAgICAgIC8qIEFkZHJlc3Mgb2YgMU1CIHJlZ2lzdGVyIHNwYWNlICAgICAgICAgICovCisJdTggdHlwZTsgICAgICAgICAvKiBUeXBlIG9mIGRldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXU4IG93bmVyX2lkOyAgICAgLyogTm9kZSBJRCBvZiBIdXJyaWNhbmUgdGhhdCBvd25zIHRoaXMgICAgKi8KKwkgICAgICAgICAgICAgICAgIC8qIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTggcG9ydDBub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGPU5vbmUgICAqLworCXU4IHBvcnQwcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAgKi8KKwkgICAgICAgICAgICAgICAgIC8qIDB4RkY9Tm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTggcG9ydDFub2RlOyAgICAvKiBOb2RlIElEIHBvcnQgY29ubmVjdGVkIHRvOiAweEZGPU5vbmUgICAqLworCXU4IHBvcnQxcG9ydDsgICAgLyogUG9ydCBudW0gcG9ydCBjb25uZWN0ZWQgdG86IDAsMSwyLCBvciAgKi8KKwkgICAgICAgICAgICAgICAgIC8qIDB4RkY9Tm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTggZmlyc3Rfc2xvdDsgICAvKiBMb3dlc3Qgc2xvdCBudW1iZXIgYmVsb3cgdGhpcyBDYWxnYXJ5ICAqLworCXU4IHN0YXR1czsgICAgICAgLyogQml0IDAgPSAxIDogdGhlIFhBUElDIGlzIHVzZWQgICAgICAgICAgKi8KKwkgICAgICAgICAgICAgICAgIC8qICAgICAgID0gMCA6IHRoZSBYQVBJQyBpcyBub3QgdXNlZCwgaWU6ICovCisJICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgIGludHMgZndkZWQgdG8gYW5vdGhlciBYQVBJQyAqLworCSAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIEJpdHMxOjcgUmVzZXJ2ZWQgICAgICAgICAgICAgKi8KKwl1OCBXUF9pbmRleDsgICAgIC8qIGluc3RhbmNlIGluZGV4IC0gbG93ZXIgb25lcyBoYXZlICAgICAgICovCisJICAgICAgICAgICAgICAgICAvKiAgICAgbG93ZXIgc2xvdCBudW1iZXJzL1BDSSBidXMgbnVtYmVycyAqLworCXU4IGNoYXNzaXNfbnVtOyAgLyogMSBiYXNlZCBDaGFzc2lzIG51bWJlciAgICAgICAgICAgICAgICAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0geworCUhVUlJfU0NBTEFCSUxUWQk9IDAsICAvKiBIdXJyaWNhbmUgU2NhbGFiaWxpdHkgaW5mbyAqLworCUhVUlJfUklPSUIJPSAyLCAgLyogSHVycmljYW5lIFJJT0lCIGluZm8gICAgICAgKi8KKwlDT01QQVRfQ0FMR0FSWQk9IDQsICAvKiBDb21wYXRpYmlsaXR5IENhbGdhcnkgICAgICAqLworCUFMVF9DQUxHQVJZCT0gNSwgIC8qIFNlY29uZCBQbGFuYXIgQ2FsZ2FyeSAgICAgICovCit9OworCisvKgorICogdGhlcmUgaXMgYSByZWFsLW1vZGUgc2VnbWVudGVkIHBvaW50ZXIgcG9pbnRpbmcgdG8gdGhlCisgKiA0SyBFQkRBIGFyZWEgYXQgMHg0MEUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfYmlvc19lYmRhKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKih1bnNpZ25lZCBzaG9ydCAqKXBoeXNfdG9fdmlydCgweDQwRVVMKTsKKwlhZGRyZXNzIDw8PSA0OworCXJldHVybiBhZGRyZXNzOworfQorCisjZW5kaWYgLyogX19BU01fUklPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zbXAuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zbXAuaAppbmRleCBkNmI3YzA1Li5lMTdiOWVjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zbXAuaApAQCAtODIsMTEgKzgyLDYgQEAKIGV4dGVybiB1OCB4ODZfY3B1X3RvX2xvZ19hcGljaWRbTlJfQ1BVU107CiBleHRlcm4gdTggYmlvc19jcHVfYXBpY2lkW107CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrX3QgY3B1bWFzaykKLXsKLQlyZXR1cm4gY3B1c19hZGRyKGNwdW1hc2spWzBdOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBjcHVfcHJlc2VudF90b19hcGljaWQoaW50IG1wc19jcHUpCiB7CiAJaWYgKG1wc19jcHUgPCBOUl9DUFVTKQpAQCAtMTE4LDEzICsxMTMsNiBAQAogI2RlZmluZSBjcHVfcGh5c2ljYWxfaWQoY3B1KQkJeDg2X2NwdV90b19hcGljaWRbY3B1XQogI2Vsc2UKICNkZWZpbmUgY3B1X3BoeXNpY2FsX2lkKGNwdSkJCWJvb3RfY3B1X2lkCi1zdGF0aWMgaW5saW5lIGludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdWlkLCB2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLAotCQkJCXZvaWQgKmluZm8sIGludCByZXRyeSwgaW50IHdhaXQpCi17Ci0JLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmU/ICovCi0JZnVuYyhpbmZvKTsKLQlyZXR1cm4gMDsKLX0KICNlbmRpZiAvKiAhQ09ORklHX1NNUCAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKaW5kZXggMDVlZjA5Ny4uODhiZjk4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKQEAgLTM2LDcgKzM2LDM0IEBACiAJCSIyOlx0IiA6ICI9bSIgKGxvY2stPnNsb2NrKSA6IDogIm1lbW9yeSIpOwogfQogCi0jZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19mbGFncyhsb2NrLCBmbGFncykgX19yYXdfc3Bpbl9sb2NrKGxvY2spCisvKgorICogU2FtZSBhcyBfX3Jhd19zcGluX2xvY2ssIGJ1dCByZWVuYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyBzcGlubmluZy4KKyAqLworI2lmbmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9ja19mbGFncyhyYXdfc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlhc20gdm9sYXRpbGUoCisJCSJcbjE6XHQiCisJCUxPQ0tfUFJFRklYICIgOyBkZWNsICUwXG5cdCIKKwkJImpucyA1ZlxuIgorCQkidGVzdGwgJDB4MjAwLCAlMVxuXHQiCS8qIGludGVycnVwdHMgd2VyZSBkaXNhYmxlZD8gKi8KKwkJImp6IDRmXG5cdCIKKwkgICAgICAgICJzdGlcbiIKKwkJIjM6XHQiCisJCSJyZXA7bm9wXG5cdCIKKwkJImNtcGwgJDAsICUwXG5cdCIKKwkJImpsZSAzYlxuXHQiCisJCSJjbGlcblx0IgorCQkiam1wIDFiXG4iCisJCSI0Olx0IgorCQkicmVwO25vcFxuXHQiCisJCSJjbXBsICQwLCAlMFxuXHQiCisJCSJqZyAxYlxuXHQiCisJCSJqbXAgNGJcbiIKKwkJIjU6XG5cdCIKKwkJOiAiK20iIChsb2NrLT5zbG9jaykgOiAiciIgKCh1bnNpZ25lZClmbGFncykgOiAibWVtb3J5Iik7Cit9CisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrX3R5cGVzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc3BpbmxvY2tfdHlwZXMuaAppbmRleCA1OWVmZTg0Li40ZGE5MzQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvc3BpbmxvY2tfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc3BpbmxvY2tfdHlwZXMuaApAQCAtNiwxMyArNiwxMyBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgc2xvY2s7CisJdW5zaWduZWQgaW50IHNsb2NrOwogfSByYXdfc3BpbmxvY2tfdDsKIAogI2RlZmluZSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQJeyAxIH0KIAogdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrOworCXVuc2lnbmVkIGludCBsb2NrOwogfSByYXdfcndsb2NrX3Q7CiAKICNkZWZpbmUgX19SQVdfUldfTE9DS19VTkxPQ0tFRAkJeyBSV19MT0NLX0JJQVMgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3N0YWNrdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zdGFja3RyYWNlLmgKaW5kZXggNWViOTc5OS4uNmYwYjU0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3N0YWNrdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc3RhY2t0cmFjZS5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfQVNNX1NUQUNLVFJBQ0VfSAogI2RlZmluZSBfQVNNX1NUQUNLVFJBQ0VfSCAxCiAKK2V4dGVybiBpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50OworCiAvKiBHZW5lcmljIHN0YWNrIHRyYWNlciB3aXRoIGNhbGxiYWNrcyAqLwogCiBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdGVybWJpdHMuaAppbmRleCBiZDk1MDk0Li42Y2ZjM2JiMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90ZXJtYml0cy5oCkBAIC0xNyw2ICsxNywyOCBAQAogCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLwogfTsKIAorc3RydWN0IHRlcm1pb3MyIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KICNkZWZpbmUgVklOVFIgMAogI2RlZmluZSBWUVVJVCAxCkBAIC0xMTgsNiArMTQwLDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUJICAgQk9USEVSIDAwMTAwMDAJCS8qIG5vbiBzdGFuZGFyZCByYXRlICovCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xMzMsMTAgKzE1NiwxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAqLwogI2RlZmluZSBDTVNQQVIJICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCiAKKyNkZWZpbmUgSUJTSElGVAkgIDgJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdGVybWlvcy5oCmluZGV4IDA0MWE5MWYuLjQ0M2IyMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3Rlcm1pb3MuaApAQCAtOTgsOCArOTgsMTAgQEAKIAljb3B5X3RvX3VzZXIoKHRlcm1pbyktPmNfY2MsICh0ZXJtaW9zKS0+Y19jYywgTkNDKTsgXAogfSkKIAotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCmluZGV4IDc4N2EwODEuLjc0YTZjNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oCkBAIC0xMjIsNiArMTIyLDcgQEAKICNkZWZpbmUgVElGX01FTURJRQkJMjAKICNkZWZpbmUgVElGX0RFQlVHCQkyMQkvKiB1c2VzIGRlYnVnIHJlZ2lzdGVycyAqLwogI2RlZmluZSBUSUZfSU9fQklUTUFQCQkyMgkvKiB1c2VzIEkvTyBiaXRtYXAgKi8KKyNkZWZpbmUgVElGX0ZSRUVaRQkJMjMJLyogaXMgZnJlZXppbmcgZm9yIHN1c3BlbmQgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQogI2RlZmluZSBfVElGX05PVElGWV9SRVNVTUUJKDE8PFRJRl9OT1RJRllfUkVTVU1FKQpAQCAtMTM3LDYgKzEzOCw3IEBACiAjZGVmaW5lIF9USUZfQUJJX1BFTkRJTkcJKDE8PFRJRl9BQklfUEVORElORykKICNkZWZpbmUgX1RJRl9ERUJVRwkJKDE8PFRJRl9ERUJVRykKICNkZWZpbmUgX1RJRl9JT19CSVRNQVAJCSgxPDxUSUZfSU9fQklUTUFQKQorI2RlZmluZSBfVElGX0ZSRUVaRQkJKDE8PFRJRl9GUkVFWkUpCiAKIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KICNkZWZpbmUgX1RJRl9XT1JLX01BU0sgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaAppbmRleCA1YzhmNDkyLi4yZmFjZWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaApAQCAtNDcsNiArNDcsNyBAQAogCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKIAkJCQl8IFNEX0JBTEFOQ0VfRk9SSwlcCiAJCQkJfCBTRF9CQUxBTkNFX0VYRUMJXAorCQkJCXwgU0RfU0VSSUFMSVpFCQlcCiAJCQkJfCBTRF9XQUtFX0JBTEFOQ0UsCVwKIAkubGFzdF9iYWxhbmNlCQk9IGppZmZpZXMsCQlcCiAJLmJhbGFuY2VfaW50ZXJ2YWwJPSAxLAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC90eXBlcy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3R5cGVzLmgKaW5kZXggYzg2YzJlNi4uMmQ0NDkxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3R5cGVzLmgKQEAgLTQ4LDkgKzQ4LDYgQEAKIHR5cGVkZWYgdTY0IGRtYTY0X2FkZHJfdDsKIHR5cGVkZWYgdTY0IGRtYV9hZGRyX3Q7CiAKLXR5cGVkZWYgdTY0IHNlY3Rvcl90OwotI2RlZmluZSBIQVZFX1NFQ1RPUl9UCi0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdWFjY2Vzcy5oCmluZGV4IDE5Zjk5MTcuLmQ1ZGJjODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaApAQCAtNiw3ICs2LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oCmluZGV4IDc3NzI4OGUuLmM1ZjU5NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdW5pc3RkLmgKQEAgLTYyMiwyNSArNjIyLDcgQEAKIAogI2RlZmluZSBfX05SX3N5c2NhbGxfbWF4IF9fTlJfbW92ZV9wYWdlcwogCi0jaWZkZWYgX19LRVJORUxfXwotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2VuZGlmCi0KICNpZm5kZWYgX19OT19TVFVCUwotCi0vKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLU1BWF9FUlJOTyAqLwotCi0jZGVmaW5lIF9fc3lzY2FsbF9jbG9iYmVyICJyMTEiLCJyY3giLCJtZW1vcnkiIAotCi0jZGVmaW5lIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgcmVzKSBcCi1kbyB7IFwKLQlpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC1NQVhfRVJSTk8pKSB7IFwKLQkJZXJybm8gPSAtKHJlcyk7IFwKLQkJcmVzID0gLTE7IFwKLQl9IFwKLQlyZXR1cm4gKHR5cGUpIChyZXMpOyBcCi19IHdoaWxlICgwKQotCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9TVEFUCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQpAQCAtNjY0LDg3ICs2NDYsNiBAQAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVElNRQogI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1RJTUUKIAotI2RlZmluZSBfX3N5c2NhbGwgInN5c2NhbGwiCi0KLSNkZWZpbmUgX3N5c2NhbGwwKHR5cGUsbmFtZSkgXAotdHlwZSBuYW1lKHZvaWQpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotX19hc21fXyB2b2xhdGlsZSAoX19zeXNjYWxsIFwKLQk6ICI9YSIgKF9fcmVzKSBcCi0JOiAiMCIgKF9fTlJfIyNuYW1lKSA6IF9fc3lzY2FsbF9jbG9iYmVyICk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUxLGFyZzEpIFwKLXR5cGUgbmFtZSh0eXBlMSBhcmcxKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gdm9sYXRpbGUgKF9fc3lzY2FsbCBcCi0JOiAiPWEiIChfX3JlcykgXAotCTogIjAiIChfX05SXyMjbmFtZSksIkQiICgobG9uZykoYXJnMSkpIDogX19zeXNjYWxsX2Nsb2JiZXIgKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsMih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyKSBcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gdm9sYXRpbGUgKF9fc3lzY2FsbCBcCi0JOiAiPWEiIChfX3JlcykgXAotCTogIjAiIChfX05SXyMjbmFtZSksIkQiICgobG9uZykoYXJnMSkpLCJTIiAoKGxvbmcpKGFyZzIpKSA6IF9fc3lzY2FsbF9jbG9iYmVyICk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDModHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczKSBcCi10eXBlIG5hbWUodHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotX19hc21fXyB2b2xhdGlsZSAoX19zeXNjYWxsIFwKLQk6ICI9YSIgKF9fcmVzKSBcCi0JOiAiMCIgKF9fTlJfIyNuYW1lKSwiRCIgKChsb25nKShhcmcxKSksIlMiICgobG9uZykoYXJnMikpLCBcCi0JCSAgImQiICgobG9uZykoYXJnMykpIDogX19zeXNjYWxsX2Nsb2JiZXIpOyBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0KSBcCi10eXBlIG5hbWUgKHR5cGUxIGFyZzEsIHR5cGUyIGFyZzIsIHR5cGUzIGFyZzMsIHR5cGU0IGFyZzQpIFwKLXsgXAotbG9uZyBfX3JlczsgXAotX19hc21fXyB2b2xhdGlsZSAoIm1vdnEgJTUsJSVyMTAgOyIgX19zeXNjYWxsIFwKLQk6ICI9YSIgKF9fcmVzKSBcCi0JOiAiMCIgKF9fTlJfIyNuYW1lKSwiRCIgKChsb25nKShhcmcxKSksIlMiICgobG9uZykoYXJnMikpLCBcCi0JICAiZCIgKChsb25nKShhcmczKSksImciICgobG9uZykoYXJnNCkpIDogX19zeXNjYWxsX2Nsb2JiZXIsInIxMCIgKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfSAKLQotI2RlZmluZSBfc3lzY2FsbDUodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsIFwKLQkgIHR5cGU1LGFyZzUpIFwKLXR5cGUgbmFtZSAodHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMsdHlwZTQgYXJnNCx0eXBlNSBhcmc1KSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gdm9sYXRpbGUgKCJtb3ZxICU1LCUlcjEwIDsgbW92cSAlNiwlJXI4IDsgIiBfX3N5c2NhbGwgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICIwIiAoX19OUl8jI25hbWUpLCJEIiAoKGxvbmcpKGFyZzEpKSwiUyIgKChsb25nKShhcmcyKSksIFwKLQkgICJkIiAoKGxvbmcpKGFyZzMpKSwiZyIgKChsb25nKShhcmc0KSksImciICgobG9uZykoYXJnNSkpIDogXAotCV9fc3lzY2FsbF9jbG9iYmVyLCJyOCIsInIxMCIgKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0jZGVmaW5lIF9zeXNjYWxsNih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCwgXAotCSAgdHlwZTUsYXJnNSx0eXBlNixhcmc2KSBcCi10eXBlIG5hbWUgKHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczLHR5cGU0IGFyZzQsdHlwZTUgYXJnNSx0eXBlNiBhcmc2KSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gdm9sYXRpbGUgKCJtb3ZxICU1LCUlcjEwIDsgbW92cSAlNiwlJXI4IDsgbW92cSAlNywlJXI5IDsgIiBfX3N5c2NhbGwgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICIwIiAoX19OUl8jI25hbWUpLCJEIiAoKGxvbmcpKGFyZzEpKSwiUyIgKChsb25nKShhcmcyKSksIFwKLQkgICJkIiAoKGxvbmcpKGFyZzMpKSwgImciICgobG9uZykoYXJnNCkpLCAiZyIgKChsb25nKShhcmc1KSksIFwKLQkgICJnIiAoKGxvbmcpKGFyZzYpKSA6IFwKLQlfX3N5c2NhbGxfY2xvYmJlciwicjgiLCJyMTAiLCJyOSIgKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCiAjaWZkZWYgX19LRVJORUxfXwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Vud2luZC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Vud2luZC5oCmluZGV4IDJlN2ZmMTAuLjJmNjM0OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC91bndpbmQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdW53aW5kLmgKQEAgLTg3LDE0ICs4NywxMCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3Vud191c2VyX21vZGUoY29uc3Qgc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvKQogewotI2lmIDAgLyogVGhpcyBjYW4gb25seSB3b3JrIHdoZW4gc2VsZWN0b3IgcmVnaXN0ZXIgc2F2ZXMvcmVzdG9yZXMKLSAgICAgICAgIGFyZSBwcm9wZXJseSBhbm5vdGF0ZWQgKGFuZCB0cmFja2VkIGluIFVOV19SRUdJU1RFUl9JTkZPKS4gKi8KLQlyZXR1cm4gdXNlcl9tb2RlKCZpbmZvLT5yZWdzKTsKLSNlbHNlCi0JcmV0dXJuIChsb25nKWluZm8tPnJlZ3MucmlwID49IDAKKwlyZXR1cm4gdXNlcl9tb2RlKCZpbmZvLT5yZWdzKQorCSAgICAgICB8fCAobG9uZylpbmZvLT5yZWdzLnJpcCA+PSAwCiAJICAgICAgIHx8IChpbmZvLT5yZWdzLnJpcCA+PSBWU1lTQ0FMTF9TVEFSVCAmJiBpbmZvLT5yZWdzLnJpcCA8IFZTWVNDQUxMX0VORCkKIAkgICAgICAgfHwgKGxvbmcpaW5mby0+cmVncy5yc3AgPj0gMDsKLSNlbmRpZgogfQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3ZzeXNjYWxsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAppbmRleCBmZDQ1MmZjLi4wNWNiOGRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaApAQCAtMTAsNiArMTAsNyBAQAogI2RlZmluZSBWU1lTQ0FMTF9TVEFSVCAoLTEwVUwgPDwgMjApCiAjZGVmaW5lIFZTWVNDQUxMX1NJWkUgMTAyNAogI2RlZmluZSBWU1lTQ0FMTF9FTkQgKC0yVUwgPDwgMjApCisjZGVmaW5lIFZTWVNDQUxMX01BUFBFRF9QQUdFUyAxCiAjZGVmaW5lIFZTWVNDQUxMX0FERFIodnN5c2NhbGxfbnIpIChWU1lTQ0FMTF9TVEFSVCtWU1lTQ0FMTF9TSVpFKih2c3lzY2FsbF9ucikpCiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC01OSw4ICs2MCw2IEBACiAKIGV4dGVybiBpbnQgc3lzY3RsX3ZzeXNjYWxsOwogCi1leHRlcm4gdm9pZCB2c3lzY2FsbF9zZXRfY3B1KGludCBjcHUpOwotCiAjZGVmaW5lIEFSQ0hfSEFWRV9YVElNRV9MT0NLIDEKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hc21tYWNyby5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5MTVjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hc21tYWNyby5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQVNNTUFDUk9fSAorI2RlZmluZSBfWFRFTlNBX0FTTU1BQ1JPX0gKKworI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKworLyoKKyAqIFNvbWUgbGl0dGxlIGhlbHBlcnMgZm9yIGxvb3BzLiBVc2UgemVyby1vdmVyaGVhZC1sb29wcworICogd2hlcmUgYXBwbGljYWJsZSBhbmQgaWYgc3VwcG9ydGVkIGJ5IHRoZSBwcm9jZXNzb3IuCisgKgorICogX19sb29waSBhciwgYXQsIHNpemUsIGluYworICogICAgICAgICBhcglyZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZSBzdGFydCBhZGRyZXNzCisgKgkgICBhdAlzY3JhdGNoIHJlZ2lzdGVyIHVzZWQgYnkgbWFjcm8KKyAqCSAgIHNpemUJc2l6ZSBpbW1lZGlhdGUgdmFsdWUKKyAqCSAgIGluYwlpbmNyZW1lbnQKKyAqCisgKiBfX2xvb3BzIGFyLCBhcywgYXQsIGluY19sb2cyWywgbWFza19sb2cyXVssIGNvbmRdWywgbmNvbmRdCisgKgkgICBhcglyZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZSBzdGFydCBhZGRyZXNzCisgKgkgICBhcwlyZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZSBzaXplCisgKgkgICBhdAlzY3JhdGNoIHJlZ2lzdGVyIHVzZSBieSBtYWNybworICoJICAgaW5jX2xvZzIJaW5jcmVtZW50IFtpbiBsb2cyXQorICoJICAgbWFza19sb2cyCW1hc2sgW2luIGxvZzJdCisgKgkgICBjb25kCQl0cnVlIGNvbmRpdGlvbiAodXNlZCBpbiBsb29wJ2NvbmQnKQorICoJICAgbmNvbmQJZmFsc2UgY29uZGl0aW9uICh1c2VkIGluIGInbmNvbmQnKQorICoKKyAqIF9fbG9vcCAgYXMKKyAqCSAgIHJlc3RhcnQgbG9vcC4gJ2FzJyByZWdpc3RlciBtdXN0IG5vdCBoYXZlIGJlZW4gbW9kaWZpZWQhCisgKgorICogX19lbmRsYSBhciwgYXQsIGluY3IKKyAqCSAgIGFyCXN0YXJ0IGFkZHJlc3MgKG1vZGlmaWVkKQorICoJICAgYXMJc2NyYXRjaCByZWdpc3RlciB1c2VkIGJ5IG1hY3JvCisgKgkgICBpbmMJaW5jcmVtZW50CisgKi8KKworLyoKKyAqIGxvb3AgZm9yIGdpdmVuIHNpemUgYXMgaW1tZWRpYXRlCisgKi8KKworCS5tYWNybwlfX2xvb3BpIGFyLCBhdCwgc2l6ZSwgaW5jcgorCisjaWYgWENIQUxfSEFWRV9MT09QUworCQltb3ZpCVxhdCwgKChcc2l6ZSArIFxpbmNyIC0gMSkgLyAoXGluY3IpKQorCQlsb29wCVxhdCwgOTlmCisjZWxzZQorCQlhZGRpCVxhdCwgXGFyLCBcc2l6ZQorCQk5ODoKKyNlbmRpZgorCisJLmVuZG0KKworLyoKKyAqIGxvb3AgZm9yIGdpdmVuIHNpemUgaW4gcmVnaXN0ZXIKKyAqLworCisJLm1hY3JvCV9fbG9vcHMJYXIsIGFzLCBhdCwgaW5jcl9sb2cyLCBtYXNrX2xvZzIsIGNvbmQsIG5jb25kCisKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJCS5pZmd0IFxpbmNyX2xvZzIgLSAxCisJCQlhZGRpCVxhdCwgXGFzLCAoMSA8PCBcaW5jcl9sb2cyKSAtIDEKKwkJCS5pZm5jIFxtYXNrX2xvZzIsCisJCQkJZXh0dWkJXGF0LCBcYXQsIFxpbmNyX2xvZzIsIFxtYXNrX2xvZzIKKwkJCS5lbHNlCisJCQkJc3JsaQlcYXQsIFxhdCwgXGluY3JfbG9nMgorCQkJLmVuZGlmCisJCS5lbmRpZgorCQlsb29wXGNvbmQJXGF0LCA5OWYKKyNlbHNlCisJCS5pZm5jIFxtYXNrX2xvZzIsCisJCQlleHR1aQlcYXQsIFxhcywgXGluY3JfbG9nMiwgXG1hc2tfbG9nMgorCQkuZWxzZQorCQkJLmlmbmMgXG5jb25kLAorCQkJCXNybGkJXGF0LCBcYXMsIFxpbmNyX2xvZzIKKwkJCS5lbmRpZgorCQkuZW5kaWYKKwkJLmlmbmMgXG5jb25kLAorCQkJYlxuY29uZAlcYXQsIDk5ZgorCisJCS5lbmRpZgorCQkuaWZuYyBcbWFza19sb2cyLAorCQkJc2xsaQlcYXQsIFxhdCwgXGluY3JfbG9nMgorCQkJYWRkCVxhdCwgXGFyLCBcYXQKKwkJLmVsc2UKKwkJCWFkZAlcYXQsIFxhciwgXGFzCisJCS5lbmRpZgorI2VuZGlmCisJCTk4OgorCisJLmVuZG0KKworLyoKKyAqIGxvb3AgZnJvbSBhciB0byBheAorICovCisKKwkubWFjcm8JX19sb29wdAlhciwgYXMsIGF0LCBpbmNyX2xvZzIKKworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwkJc3ViCVxhdCwgXGFzLCBcYXIKKwkJLmlmZ3QJXGluY3JfbG9nMiAtIDEKKwkJCWFkZGkJXGF0LCBcYXQsICgxIDw8IFxpbmNyX2xvZzIpIC0gMQorCQkJc3JsaQlcYXQsIFxhdCwgXGluY3JfbG9nMgorCQkuZW5kaWYKKwkJbG9vcAlcYXQsIDk5ZgorI2Vsc2UKKwkJOTg6CisjZW5kaWYKKworCS5lbmRtCisKKy8qCisgKiByZXN0YXJ0IGxvb3AuIHJlZ2lzdGVycyBtdXN0IGJlIHVuY2hhbmdlZAorICovCisKKwkubWFjcm8JX19sb29wCWFzCisKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJCWxvb3AJXGFzLCA5OWYKKyNlbHNlCisJCTk4OgorI2VuZGlmCisKKwkuZW5kbQorCisvKgorICogZW5kIG9mIGxvb3Agd2l0aCBubyBpbmNyZW1lbnQgb2YgdGhlIGFkZHJlc3MuCisgKi8KKworCS5tYWNybwlfX2VuZGwJYXIsIGFzCisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwkJYmx0dQlcYXIsIFxhcywgOThiCisjZW5kaWYKKwkJOTk6CisJLmVuZG0KKworLyoKKyAqIGVuZCBvZiBsb29wIHdpdGggaW5jcmVtZW50IG9mIHRoZSBhZGRyZXNzLgorICovCisKKwkubWFjcm8JX19lbmRsYQlhciwgYXMsIGluY3IKKwkJYWRkaQlcYXIsIFxhciwgXGluY3IKKwkJX19lbmRsCVxhciBcYXMKKwkuZW5kbQorCisKKyNlbmRpZiAvKiBfWFRFTlNBX0FTTU1BQ1JPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9idWcuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9idWcuaAppbmRleCA1NjcwMzY1Li4zZTUyZDcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvYnVnLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2J1Zy5oCkBAIC0xMywyOSArMTMsNiBAQAogI2lmbmRlZiBfWFRFTlNBX0JVR19ICiAjZGVmaW5lIF9YVEVOU0FfQlVHX0gKIAotI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgotCi0jZGVmaW5lIElMTAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIi5ieXRlIDAsMCwwXG4iKQotCi0jaWZkZWYgQ09ORklHX0tBTExTWU1TCi0jIGRlZmluZSBCVUcoKSBkbyB7CQkJCQkJCVwKLQlwcmludGsoImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOwkJXAotCUlMTDsJCQkJCQkJCVwKLX0gd2hpbGUgKDApCi0jZWxzZQotIyBkZWZpbmUgQlVHKCkgZG8gewkJCQkJCQlcCi0JcHJpbnRrKCJrZXJuZWwgQlVHIVxuIik7CQkJCQlcCi0gICAgICAJSUxMOwkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIEJVR19PTihjb25kaXRpb24pIGRvIHsgaWYgKHVubGlrZWx5KChjb25kaXRpb24pIT0wKSkgQlVHKCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgUEFHRV9CVUcocGFnZSkgZG8geyAgQlVHKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdBUk5fT04oY29uZGl0aW9uKSBkbyB7CQkJCQkJICAgXAotICBpZiAodW5saWtlbHkoKGNvbmRpdGlvbikhPTApKSB7CQkJCQkgICBcCi0gICAgcHJpbnRrICgiV2FybmluZyBpbiAlcyBhdCAlczolZFxuIiwgX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCi0gICAgICBkdW1wX3N0YWNrKCk7CQkJCQkJCSAgIFwKLSAgfQkJCQkJCQkJCSAgIFwKLX0gd2hpbGUgKDApCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CiAKICNlbmRpZgkvKiBfWFRFTlNBX0JVR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYnl0ZW9yZGVyLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvYnl0ZW9yZGVyLmgKaW5kZXggMGIxNTUyNS4uMGY1NDBhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9ieXRlb3JkZXIuaApAQCAtMTEsMTAgKzExLDkgQEAKICNpZm5kZWYgX1hURU5TQV9CWVRFT1JERVJfSAogI2RlZmluZSBfWFRFTlNBX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKLXN0YXRpYyBfX2lubGluZV9fIF9fY29uc3RfXyBfX3UzMiBfX19hcmNoX19zd2FiMzIoX191MzIgeCkKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCiB7CiAgICAgX191MzIgcmVzOwogICAgIC8qIGluc3RydWN0aW9uIHNlcXVlbmNlIGZyb20gWHRlbnNhIElTQSByZWxlYXNlIDIvMjAwMCAqLwpAQCAtMjksNyArMjgsNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIF9fY29uc3RfXyBfX3UxNiBfX19hcmNoX19zd2FiMTYoX191MTYgeCkKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19fYXJjaF9fc3dhYjE2KF9fdTE2IHgpCiB7CiAgICAgLyogR2l2ZW4gdGhhdCAnc2hvcnQnIHZhbHVlcyBhcmUgc2lnbmVkIChpLmUuLCBjYW4gYmUgbmVnYXRpdmUpLAogICAgICAqIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCB0aGUgdXBwZXIgMTYtYml0cyBvZiB0aGUgcmVnaXN0ZXIgYXJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCmluZGV4IDFlNzljMGUuLjFjNGE3OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCkBAIC00LDcgKzQsNiBAQAogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICoKICAqIChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgogICovCkBAIC0xMiwyMSArMTEsMTQgQEAKICNpZm5kZWYgX1hURU5TQV9DQUNIRV9ICiAjZGVmaW5lIF9YVEVOU0FfQ0FDSEVfSAogCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgogCi0jaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwCi0jIGlmIChYQ0hBTF9JQ0FDSEVfU0laRSAlIChYQ0hBTF9JQ0FDSEVfTElORVNJWkUqWENIQUxfSUNBQ0hFX1dBWVMqNCkpICE9IDAKLSMgIGVycm9yIGNhY2hlIGNvbmZpZ3VyYXRpb24gb3V0c2lkZSBleHBlY3RlZC9zdXBwb3J0ZWQgcmFuZ2UhCi0jIGVuZGlmCi0jZW5kaWYKKyNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJWENIQUxfRENBQ0hFX0xJTkVXSURUSAorI2RlZmluZSBMMV9DQUNIRV9CWVRFUwlYQ0hBTF9EQ0FDSEVfTElORVNJWkUKKyNkZWZpbmUgU01QX0NBQ0hFX0JZVEVTCUwxX0NBQ0hFX0JZVEVTCiAKLSNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAKLSMgaWYgKFhDSEFMX0RDQUNIRV9TSVpFICUgKFhDSEFMX0RDQUNIRV9MSU5FU0laRSpYQ0hBTF9EQ0FDSEVfV0FZUyo0KSkgIT0gMAotIyAgZXJyb3IgY2FjaGUgY29uZmlndXJhdGlvbiBvdXRzaWRlIGV4cGVjdGVkL3N1cHBvcnRlZCByYW5nZSEKLSMgZW5kaWYKLSNlbmRpZgorI2RlZmluZSBEQ0FDSEVfV0FZX1NJWkUJKFhDSEFMX0RDQUNIRV9TSVpFL1hDSEFMX0RDQUNIRV9XQVlTKQorI2RlZmluZSBJQ0FDSEVfV0FZX1NJWkUJKFhDSEFMX0lDQUNIRV9TSVpFL1hDSEFMX0lDQUNIRV9XQVlTKQogCi0jZGVmaW5lIEwxX0NBQ0hFX1NISUZUCQlYQ0hBTF9DQUNIRV9MSU5FV0lEVEhfTUFYCi0jZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCQlYQ0hBTF9DQUNIRV9MSU5FU0laRV9NQVgKIAogI2VuZGlmCS8qIF9YVEVOU0FfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlYXNtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzIwYTU4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlYXNtLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVhc20uaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKworLyoKKyAqIERlZmluZSBjYWNoZSBmdW5jdGlvbnMgYXMgbWFjcm9zIGhlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkCisgKiBieSB0aGUga2VybmVsIGFuZCBib290IGxvYWRlci4gV2Ugc2hvdWxkIGNvbnNpZGVyIG1vdmluZyB0aGVtIHRvIGEKKyAqIGxpYnJhcnkgdGhhdCBjYW4gYmUgbGlua2VkIGJ5IGJvdGguCisgKgorICogTG9ja2luZworICoKKyAqICAgX19fdW5sb2NrX2RjYWNoZV9hbGwKKyAqICAgX19fdW5sb2NrX2ljYWNoZV9hbGwKKyAqCisgKiBGbHVzaCBhbmQgaW52YWxkYXRpbmcKKyAqCisgKiAgIF9fX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3thbGx8cmFuZ2V8cGFnZX0KKyAqICAgX19fZmx1c2hfZGNhY2hlX3thbGx8cmFuZ2V8cGFnZX0KKyAqICAgX19faW52YWxpZGF0ZV9kY2FjaGVfe2FsbHxyYW5nZXxwYWdlfQorICogICBfX19pbnZhbGlkYXRlX2ljYWNoZV97YWxsfHJhbmdlfHBhZ2V9CisgKgorICovCisKKwkubWFjcm8JX19sb29wX2NhY2hlX2FsbCBhciBhdCBpbnNuIHNpemUgbGluZV93aWR0aAorCisJbW92aQlcYXIsIDAKKworCV9fbG9vcGkJXGFyLCBcYXQsIFxzaXplLCAoNCA8PCAoXGxpbmVfd2lkdGgpKQorCVxpbnNuCVxhciwgMCA8PCAoXGxpbmVfd2lkdGgpCisJXGluc24JXGFyLCAxIDw8IChcbGluZV93aWR0aCkKKwlcaW5zbglcYXIsIDIgPDwgKFxsaW5lX3dpZHRoKQorCVxpbnNuCVxhciwgMyA8PCAoXGxpbmVfd2lkdGgpCisJX19lbmRsYQlcYXIsIFxhdCwgNCA8PCAoXGxpbmVfd2lkdGgpCisKKwkuZW5kbQorCisKKwkubWFjcm8JX19sb29wX2NhY2hlX3JhbmdlIGFyIGFzIGF0IGluc24gbGluZV93aWR0aAorCisJZXh0dWkJXGF0LCBcYXIsIDAsIFxsaW5lX3dpZHRoCisJYWRkCVxhcywgXGFzLCBcYXQKKworCV9fbG9vcHMJXGFyLCBcYXMsIFxhdCwgXGxpbmVfd2lkdGgKKwlcaW5zbglcYXIsIDAKKwlfX2VuZGxhCVxhciwgXGF0LCAoMSA8PCAoXGxpbmVfd2lkdGgpKQorCisJLmVuZG0KKworCisJLm1hY3JvCV9fbG9vcF9jYWNoZV9wYWdlIGFyIGF0IGluc24gbGluZV93aWR0aAorCisJX19sb29waQlcYXIsIFxhdCwgUEFHRV9TSVpFLCA0IDw8IChcbGluZV93aWR0aCkKKwlcaW5zbglcYXIsIDAgPDwgKFxsaW5lX3dpZHRoKQorCVxpbnNuCVxhciwgMSA8PCAoXGxpbmVfd2lkdGgpCisJXGluc24JXGFyLCAyIDw8IChcbGluZV93aWR0aCkKKwlcaW5zbglcYXIsIDMgPDwgKFxsaW5lX3dpZHRoKQorCV9fZW5kbGEJXGFyLCBcYXQsIDQgPDwgKFxsaW5lX3dpZHRoKQorCisJLmVuZG0KKworCisjaWYgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUKKworCS5tYWNybwlfX191bmxvY2tfZGNhY2hlX2FsbCBhciBhdAorCisJX19sb29wX2NhY2hlX2FsbCBcYXIgXGF0IGRpdSBYQ0hBTF9EQ0FDSEVfU0laRSBYQ0hBTF9EQ0FDSEVfTElORVdJRFRICisKKwkuZW5kbQorCisjZW5kaWYKKworI2lmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCisKKwkubWFjcm8JX19fdW5sb2NrX2ljYWNoZV9hbGwgYXIgYXQKKworCV9fbG9vcF9jYWNoZV9hbGwgXGFyIFxhdCBpaXUgWENIQUxfSUNBQ0hFX1NJWkUgWENIQUxfSUNBQ0hFX0xJTkVXSURUSAorCisJLmVuZG0KKyNlbmRpZgorCisJLm1hY3JvCV9fX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX2FsbCBhciBhdAorCisJX19sb29wX2NhY2hlX2FsbCBcYXIgXGF0IGRpd2JpIFhDSEFMX0RDQUNIRV9TSVpFIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgKKworCS5lbmRtCisKKworCS5tYWNybwlfX19mbHVzaF9kY2FjaGVfYWxsIGFyIGF0CisKKwlfX2xvb3BfY2FjaGVfYWxsIFxhciBcYXQgZGl3YiBYQ0hBTF9EQ0FDSEVfU0laRSBYQ0hBTF9EQ0FDSEVfTElORVdJRFRICisKKwkuZW5kbQorCisKKwkubWFjcm8JX19faW52YWxpZGF0ZV9kY2FjaGVfYWxsIGFyIGF0CisKKwlfX2xvb3BfY2FjaGVfYWxsIFxhciBcYXQgZGlpIF9fc3RyaW5naWZ5KERDQUNIRV9XQVlfU0laRSkgXAorCQkJIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgKKworCS5lbmRtCisKKworCS5tYWNybwlfX19pbnZhbGlkYXRlX2ljYWNoZV9hbGwgYXIgYXQKKworCV9fbG9vcF9jYWNoZV9hbGwgXGFyIFxhdCBpaWkgX19zdHJpbmdpZnkoSUNBQ0hFX1dBWV9TSVpFKSBcCisJCQkgWENIQUxfSUNBQ0hFX0xJTkVXSURUSAorCisJLmVuZG0KKworCisKKwkubWFjcm8JX19fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UgYXIgYXMgYXQKKworCV9fbG9vcF9jYWNoZV9yYW5nZSBcYXIgXGFzIFxhdCBkaHdiaSBYQ0hBTF9EQ0FDSEVfTElORVdJRFRICisKKwkuZW5kbQorCisKKwkubWFjcm8JX19fZmx1c2hfZGNhY2hlX3JhbmdlIGFyIGFzIGF0CisKKwlfX2xvb3BfY2FjaGVfcmFuZ2UgXGFyIFxhcyBcYXQgZGh3YiBYQ0hBTF9EQ0FDSEVfTElORVdJRFRICisKKwkuZW5kbQorCisKKwkubWFjcm8JX19faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UgYXIgYXMgYXQKKworCV9fbG9vcF9jYWNoZV9yYW5nZSBcYXIgXGFzIFxhdCBkaGkgWENIQUxfRENBQ0hFX0xJTkVXSURUSAorCisJLmVuZG0KKworCisJLm1hY3JvCV9fX2ludmFsaWRhdGVfaWNhY2hlX3JhbmdlIGFyIGFzIGF0CisKKwlfX2xvb3BfY2FjaGVfcmFuZ2UgXGFyIFxhcyBcYXQgaWhpIFhDSEFMX0lDQUNIRV9MSU5FV0lEVEgKKworCS5lbmRtCisKKworCisJLm1hY3JvCV9fX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2UgYXIgYXMKKworCV9fbG9vcF9jYWNoZV9wYWdlIFxhciBcYXMgZGh3YmkgWENIQUxfRENBQ0hFX0xJTkVXSURUSAorCisJLmVuZG0KKworCisJLm1hY3JvIF9fX2ZsdXNoX2RjYWNoZV9wYWdlIGFyIGFzCisKKwlfX2xvb3BfY2FjaGVfcGFnZSBcYXIgXGFzIGRod2IgWENIQUxfRENBQ0hFX0xJTkVXSURUSAorCisJLmVuZG0KKworCisJLm1hY3JvCV9fX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2UgYXIgYXMKKworCV9fbG9vcF9jYWNoZV9wYWdlIFxhciBcYXMgZGhpIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgKKworCS5lbmRtCisKKworCS5tYWNybwlfX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlIGFyIGFzCisKKwlfX2xvb3BfY2FjaGVfcGFnZSBcYXIgXGFzIGloaSBYQ0hBTF9JQ0FDSEVfTElORVdJRFRICisKKwkuZW5kbQorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlZmx1c2guaAppbmRleCA0NGEzNmUwLi4yMmVmOTAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZWZsdXNoLmgKQEAgLTUsNyArNSw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICogKEMpIDIwMDEgLSAyMDA2IFRlbnNpbGljYSBJbmMuCiAgKi8KIAogI2lmbmRlZiBfWFRFTlNBX0NBQ0hFRkxVU0hfSApAQCAtNzUsNiArNzUsNyBAQAogCiAjZGVmaW5lIGZsdXNoX2NhY2hlX2FsbCgpCQlfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfYWxsKCk7CiAjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJX19mbHVzaF9pbnZhbGlkYXRlX2NhY2hlX2FsbCgpOworI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pCQlfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfYWxsKCk7CiAKICNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCxlbmQpCV9fZmx1c2hfaW52YWxpZGF0ZV9jYWNoZV9hbGwoKTsKICNkZWZpbmUgZmx1c2hfY2FjaGVfdnVubWFwKHN0YXJ0LGVuZCkJX19mbHVzaF9pbnZhbGlkYXRlX2NhY2hlX2FsbCgpOwpAQCAtODgsNiArODksNyBAQAogCiAjZGVmaW5lIGZsdXNoX2NhY2hlX2FsbCgpCQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQkJCQlkbyB7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCxlbmQpCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9jYWNoZV92dW5tYXAoc3RhcnQsZW5kKQkJCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2NoZWNrc3VtLmgKaW5kZXggMDMxMTRmOC4uMjM1MzRjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2NoZWNrc3VtLmgKQEAgLTEyLDcgKzEyLDcgQEAKICNkZWZpbmUgX1hURU5TQV9DSEVDS1NVTV9ICiAKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CiAKIC8qCiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgYSBtZW1vcnkgYmxvY2sgYXQgYnVmZiwgbGVuZ3RoIGxlbiwKQEAgLTI2LDcgKzI2LDcgQEAKICAqCiAgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKICAqLwotYXNtbGlua2FnZSB1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKTsKK2FzbWxpbmthZ2UgX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKIAogLyoKICAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdApAQCAtMzYsNyArMzYsNyBAQAogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwogCi1hc21saW5rYWdlIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKCBjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSwKK2FzbWxpbmthZ2UgX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0sCiAJCQkJCQkgICBpbnQgKnNyY19lcnJfcHRyLCBpbnQgKmRzdF9lcnJfcHRyKTsKIAogLyoKQEAgLTQ2LDM0ICs0NiwyNSBAQAogICoJSWYgeW91IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgcGxlYXNlIGRvbid0IGZvcmdldCB0aGUgYWNjZXNzX29rKCkuCiAgKi8KIHN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrICggY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsCi0JCQkJCWludCBsZW4sIGludCBzdW0pCitfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkJaW50IGxlbiwgX193c3VtIHN1bSkKIHsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyAoIHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZQotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlciAoIGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAotCQkJCQkJaW50IGxlbiwgaW50IHN1bSwgaW50ICplcnJfcHRyKQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMgKCBzcmMsIGRzdCwgbGVuLCBzdW0sIGVycl9wdHIsIE5VTEwpOworCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKChfX2ZvcmNlIGNvbnN0IHZvaWQgKilzcmMsIGRzdCwKKwkJCQkJbGVuLCBzdW0sIGVycl9wdHIsIE5VTEwpOwogfQogCiAvKgotICogVGhlc2UgYXJlIHRoZSBvbGQgKGFuZCB1bnNhZmUpIHdheSBvZiBkb2luZyBjaGVja3N1bXMsIGEgd2FybmluZyBtZXNzYWdlIHdpbGwgYmUKLSAqIHByaW50ZWQgaWYgdGhleSBhcmUgdXNlZCBhbmQgYW4gZXhlcHRpb24gb2NjdXJzLgotICoKLSAqIHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgZ28gYXdheSBhZnRlciBzb21lIHRpbWUuCi0gKi8KLQotI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9mcm9tdXNlciBjc3VtX3BhcnRpYWxfY29weQotdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5KCBjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwgaW50IHN1bSk7Ci0KLS8qCiAgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBjc3VtX2ZvbGQodW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IF9fZHVtbXk7CiAJX19hc21fXygiZXh0dWkJJTEsICUwLCAxNiwgMTZcblx0IgpAQCAtODcsMTQgKzc4LDE0IEBACiAJCSJleHR1aQklMCwgJTAsIDAsIDE2XG5cdCIKIAkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKIAkJOiAiMCIgKHN1bSkpOwotCXJldHVybiBzdW07CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpc3VtOwogfQogCiAvKgogICoJVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLAogICoJd2hpY2ggYWx3YXlzIGNoZWNrc3VtIG9uIDQgb2N0ZXQgYm91bmRhcmllcy4KICAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaXBfZmFzdF9jc3VtKHVuc2lnbmVkIGNoYXIgKiBpcGgsIHVuc2lnbmVkIGludCBpaGwpCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCiB7CiAJdW5zaWduZWQgaW50IHN1bSwgdG1wLCBlbmRhZGRyOwogCkBAIC0xMjcsMTcgKzExOCwxNiBAQAogCXJldHVybgljc3VtX2ZvbGQoc3VtKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBjc3VtX3RjcHVkcF9ub2ZvbGQodW5zaWduZWQgbG9uZyBzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGFkZHIsCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQorCQkJCQkJICAgX193c3VtIHN1bSkKIHsKIAogI2lmZGVmIF9fWFRFTlNBX0VMX18KLQl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2OworCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gKGxlbiArIHByb3RvKSA8PCA4OwogI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQotCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gKHByb3RvPDwxNikrbGVuOworCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gbGVuICsgcHJvdG87CiAjZWxzZQogIyBlcnJvciBwcm9jZXNzb3IgYnl0ZSBvcmRlciB1bmRlZmluZWQhCiAjZW5kaWYKQEAgLTE2MiwxMSArMTUyLDEwIEBACiAgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgogICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKICAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCi0JCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBkYWRkciwKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBzdW0pCisJCQkJCQkgICAgICAgX193c3VtIHN1bSkKIHsKIAlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7CiB9CkBAIC0xNzYsMTcgKzE2NSwxNiBAQAogICogaW4gaWNtcC5jCiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaXBfY29tcHV0ZV9jc3VtKHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuKQorc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKIHsKICAgICByZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7CiB9CiAKICNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJCSAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQkJCSAgICAgX191MzIgbGVuLAotCQkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKLQkJCQkJCSAgICAgdW5zaWduZWQgaW50IHN1bSkKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV9pcHY2X21hZ2ljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCQkJICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkgIF9fd3N1bSBzdW0pCiB7CiAJdW5zaWduZWQgaW50IF9fZHVtbXk7CiAJX19hc21fXygibDMyaQklMSwgJTIsIDBcblx0IgpAQCAtMjQ4LDggKzIzNiw4IEBACiAgKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCiAgKi8KICNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGNzdW1fYW5kX2NvcHlfdG9fdXNlciAoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsCi0JCQkJICAgIGludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cikKK3N0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLCB2b2lkIF9fdXNlciAqZHN0LAorCQkJCSAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkKIAkJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBlcnJfcHRyKTsKQEAgLTI1Nyw2ICsyNDUsNiBAQAogCWlmIChsZW4pCiAJCSplcnJfcHRyID0gLUVGQVVMVDsKIAotCXJldHVybiAtMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7IC8qIGludmFsaWQgY2hlY2tzdW0gKi8KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaAppbmRleCA1MDkzMDM0Li5iZDA5ZWMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaApAQCAtMTEsNyArMTEsMTYgQEAKICNpZm5kZWYgX1hURU5TQV9DT1BST0NFU1NPUl9ICiAjZGVmaW5lIF9YVEVOU0FfQ09QUk9DRVNTT1JfSAogCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPGFzbS92YXJpYW50L3RpZS5oPgorCisjaWYgIVhDSEFMX0hBVkVfQ1AKKworI2RlZmluZSBYVEVOU0FfQ1BfRVhUUkFfT0ZGU0VUIAkwCisjZGVmaW5lIFhURU5TQV9DUF9FWFRSQV9BTElHTgkxCS8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIFhURU5TQV9DUF9FWFRSQV9TSVpFCTAKKworI2Vsc2UKIAogI2RlZmluZSBYVE9GUyhsYXN0X3N0YXJ0LGxhc3Rfc2l6ZSxhbGlnbikgXAogCSgobGFzdF9zdGFydCtsYXN0X3NpemUrYWxpZ24tMSkgJiAtYWxpZ24pCkBAIC02Nyw0ICs3Niw2IEBACiAjIGVuZGlmCiAjZW5kaWYKIAorI2VuZGlmCisKICNlbmRpZgkvKiBfWFRFTlNBX0NPUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2RldmljZS5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqIEFyY2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byBzdHJ1Y3QgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2RtYS1tYXBwaW5nLmgKaW5kZXggYzM5YzkxZC4uODJiMDNiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2RtYS1tYXBwaW5nLmgKQEAgLTE3MCwxMCArMTcwLDEwIEBACiAJcmV0dXJuIEwxX0NBQ0hFX0JZVEVTOwogfQogCi0jZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQpCSgxKQorI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkLCBoKQkoMSkKIAogc3RhdGljIGlubGluZSB2b2lkCi1kbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCitkbWFfY2FjaGVfc3luYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKIAkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCWNvbnNpc3RlbnRfc3luYyh2YWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kbWEuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kbWEuaAppbmRleCBkYjI2MzNmLi5lMzBmM2FiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2RtYS5oCkBAIC0xMiw3ICsxMiw2IEBACiAjZGVmaW5lIF9YVEVOU0FfRE1BX0gKIAogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogbmVlZCBieXRlIElPICovCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CiAKIC8qCiAgKiBUaGlzIGlzIG9ubHkgdG8gYmUgZGVmaW5lZCBpZiB3ZSBoYXZlIFBDLWxpa2UgRE1BLgpAQCAtNDQsNyArNDMsOSBAQAogICoJZW50ZXJzIGFub3RoZXIgYXJlYSwgYW5kIHZpcnRfdG9fcGh5cygpIG1heSBub3QgcmV0dXJuCiAgKgl0aGUgdmFsdWUgZGVzaXJlZCkuCiAgKi8KLSNkZWZpbmUgTUFYX0RNQV9BRERSRVNTCQkoUEFHRV9PRkZTRVQgKyBYQ0hBTF9LU0VHX0NBQ0hFRF9TSVpFIC0gMSkKKworI2RlZmluZSBNQVhfRE1BX0FERFJFU1MJCShQQUdFX09GRlNFVCArIFhDSEFMX0tJT19TSVpFIC0gMSkKKwogCiAvKiBSZXNlcnZlIGFuZCByZWxlYXNlIGEgRE1BIGNoYW5uZWwgKi8KIGV4dGVybiBpbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGRtYW5yLCBjb25zdCBjaGFyICogZGV2aWNlX2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaAppbmRleCBkZTA2Njc0Li5mMGY5ZmQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2VsZi5oCkBAIC0xMyw5ICsxMyw4IEBACiAjaWZuZGVmIF9YVEVOU0FfRUxGX0gKICNkZWZpbmUgX1hURU5TQV9FTEZfSAogCisjaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vY29wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4KIAogLyogWHRlbnNhIHByb2Nlc3NvciBFTEYgYXJjaGl0ZWN0dXJlLW1hZ2ljIG51bWJlciAqLwogCkBAIC0xMTgsMTEgKzExNywxNSBAQAogICogdXNpbmcgbWVtY3B5KCkuICBCdXQgd2UgZG8gYWxsb3cgc3BhY2UgZm9yIHN1Y2ggYWxpZ25tZW50LAogICogdG8gYWxsb3cgb3B0aW1pemF0aW9ucyBvZiBsYXlvdXQgYW5kIGNvcHlpbmcuCiAgKi8KLQorI2lmIDAKICNkZWZpbmUgVE9UQUxfRlBSRUdTX1NJWkUJCQkJCQlcCiAgIAkoNCArIFhURU5TQV9DUEVfTFRBQkxFX1NJWkUgKyBYVEVOU0FfQ1BfRVhUUkFfU0laRSkKICNkZWZpbmUgRUxGX05GUFJFRwkJCQkJCQlcCiAJKChUT1RBTF9GUFJFR1NfU0laRSArIHNpemVvZihlbGZfZnByZWdfdCkgLSAxKSAvIHNpemVvZihlbGZfZnByZWdfdCkpCisjZWxzZQorI2RlZmluZSBUT1RBTF9GUFJFR1NfU0laRQkwCisjZGVmaW5lIEVMRl9ORlBSRUcJCTAKKyNlbmRpZgogCiB0eXBlZGVmIHVuc2lnbmVkIGludCBlbGZfZnByZWdfdDsKIHR5cGVkZWYgZWxmX2ZwcmVnX3QgZWxmX2ZwcmVnc2V0X3RbRUxGX05GUFJFR107CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oCmluZGV4IGVjMDY2YWUuLjA2MDlmYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oCkBAIC0xNCw0OCArMTQsODYgQEAKIAogLyogb3Blbi9mY250bCAtIE9fU1lOQyBpcyBvbmx5IGltcGxlbWVudGVkIG9uIGJsb2NrcyBkZXZpY2VzIGFuZCBvbiBmaWxlcwogICAgbG9jYXRlZCBvbiBhbiBleHQyIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIE9fQVBQRU5ECTB4MDAwOAotI2RlZmluZSBPX1NZTkMJCTB4MDAxMAotI2RlZmluZSBPX05PTkJMT0NLCTB4MDA4MAotI2RlZmluZSBPX0NSRUFUICAgICAgICAgMHgwMTAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0VYQ0wJCTB4MDQwMAkvKiBub3QgZmNudGwgKi8KLSNkZWZpbmUgT19OT0NUVFkJMHgwODAwCS8qIG5vdCBmY250bCAqLwotI2RlZmluZSBGQVNZTkMJCTB4MTAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIE9fTEFSR0VGSUxFCTB4MjAwMAkvKiBhbGxvdyBsYXJnZSBmaWxlIG9wZW5zIC0gY3VycmVudGx5IGlnbm9yZWQgKi8KLSNkZWZpbmUgT19ESVJFQ1QJMHg4MDAwCS8qIGRpcmVjdCBkaXNrIGFjY2VzcyBoaW50IC0gY3VycmVudGx5IGlnbm9yZWQqLwotI2RlZmluZSBPX05PQVRJTUUJMHgxMDAwMDAKKyNkZWZpbmUgT19BQ0NNT0RFCSAgIDAwMDMKKyNkZWZpbmUgT19SRE9OTFkJICAgICAwMAorI2RlZmluZSBPX1dST05MWQkgICAgIDAxCisjZGVmaW5lIE9fUkRXUgkJICAgICAwMgorI2RlZmluZSBPX0NSRUFUCQkgICAwMTAwCS8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX0VYQ0wJCSAgIDAyMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fTk9DVFRZCSAgIDA0MDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fVFJVTkMJCSAgMDEwMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fQVBQRU5ECSAgMDIwMDAKKyNkZWZpbmUgT19OT05CTE9DSwkgIDA0MDAwCisjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKKyNkZWZpbmUgT19TWU5DCQkgMDEwMDAwCisjZGVmaW5lIEZBU1lOQwkJIDAyMDAwMAkvKiBmY250bCwgZm9yIEJTRCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIE9fRElSRUNUCSAwNDAwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgKi8KKyNkZWZpbmUgT19MQVJHRUZJTEUJMDEwMDAwMAorI2RlZmluZSBPX0RJUkVDVE9SWQkwMjAwMDAwCS8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgT19OT0ZPTExPVwkwNDAwMDAwIC8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLworI2RlZmluZSBPX05PQVRJTUUJMDEwMDAwMDAKIAotI2RlZmluZSBGX0dFVExLCQkxNAotI2RlZmluZSBGX0dFVExLNjQgICAgICAgMTUKKyNkZWZpbmUgRl9EVVBGRAkJMAkvKiBkdXAgKi8KKyNkZWZpbmUgRl9HRVRGRAkJMQkvKiBnZXQgY2xvc2Vfb25fZXhlYyAqLworI2RlZmluZSBGX1NFVEZECQkyCS8qIHNldC9jbGVhciBjbG9zZV9vbl9leGVjICovCisjZGVmaW5lIEZfR0VURkwJCTMJLyogZ2V0IGZpbGUtPmZfZmxhZ3MgKi8KKyNkZWZpbmUgRl9TRVRGTAkJNAkvKiBzZXQgZmlsZS0+Zl9mbGFncyAqLworI2RlZmluZSBGX0dFVExLCQk1CiAjZGVmaW5lIEZfU0VUTEsJCTYKICNkZWZpbmUgRl9TRVRMS1cJNwotI2RlZmluZSBGX1NFVExLNjQgICAgICAgMTYKLSNkZWZpbmUgRl9TRVRMS1c2NCAgICAgIDE3CiAKLSNkZWZpbmUgRl9TRVRPV04JMjQJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX0dFVE9XTgkyMwkvKiAgZm9yIHNvY2tldHMuICovCisjZGVmaW5lIEZfU0VUT1dOCTgJLyogIGZvciBzb2NrZXRzLiAqLworI2RlZmluZSBGX0dFVE9XTgk5CS8qICBmb3Igc29ja2V0cy4gKi8KKyNkZWZpbmUgRl9TRVRTSUcJMTAJLyogIGZvciBzb2NrZXRzLiAqLworI2RlZmluZSBGX0dFVFNJRwkxMQkvKiAgZm9yIHNvY2tldHMuICovCiAKLXR5cGVkZWYgc3RydWN0IGZsb2NrIHsKKyNkZWZpbmUgRl9HRVRMSzY0CTEyCS8qICB1c2luZyAnc3RydWN0IGZsb2NrNjQnICovCisjZGVmaW5lIEZfU0VUTEs2NAkxMworI2RlZmluZSBGX1NFVExLVzY0CTE0CisKKy8qIGZvciBGX1tHRVR8U0VUXUZMICovCisjZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KKworLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KKyNkZWZpbmUgRl9SRExDSwkJMAorI2RlZmluZSBGX1dSTENLCQkxCisjZGVmaW5lIEZfVU5MQ0sJCTIKKworLyogZm9yIG9sZCBpbXBsZW1lbnRhdGlvbiBvZiBic2QgZmxvY2sgKCkgKi8KKyNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCisjZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLworCisvKiBmb3IgbGVhc2VzICovCisjZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgorCisvKiBvcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24gKi8KKyNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLworI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCisjZGVmaW5lIExPQ0tfTkIJCTQJLyogb3InZCB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgdG8gcHJldmVudAorCQkJCSAgIGJsb2NraW5nICovCisjZGVmaW5lIExPQ0tfVU4JCTgJLyogcmVtb3ZlIGxvY2sgKi8KKworI2RlZmluZSBMT0NLX01BTkQJMzIJLyogVGhpcyBpcyBhIG1hbmRhdG9yeSBmbG9jayAqLworI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLworI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogLi4uIFdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KKworc3RydWN0IGZsb2NrIHsKIAlzaG9ydCBsX3R5cGU7CiAJc2hvcnQgbF93aGVuY2U7Ci0JX19rZXJuZWxfb2ZmX3QgbF9zdGFydDsKLQlfX2tlcm5lbF9vZmZfdCBsX2xlbjsKLQlsb25nICBsX3N5c2lkOwotCV9fa2VybmVsX3BpZF90IGxfcGlkOwotCWxvbmcgIHBhZFs0XTsKLX0gZmxvY2tfdDsKKwlvZmZfdCBsX3N0YXJ0OworCW9mZl90IGxfbGVuOworCXBpZF90IGxfcGlkOworfTsKIAogc3RydWN0IGZsb2NrNjQgewogCXNob3J0ICBsX3R5cGU7CiAJc2hvcnQgIGxfd2hlbmNlOwotCV9fa2VybmVsX29mZl90IGxfc3RhcnQ7Ci0JX19rZXJuZWxfb2ZmX3QgbF9sZW47CisJbG9mZl90IGxfc3RhcnQ7CisJbG9mZl90IGxfbGVuOwogCXBpZF90ICBsX3BpZDsKIH07CiAKLSNkZWZpbmUgSEFWRV9BUkNIX1NUUlVDVF9GTE9DSwotI2RlZmluZSBIQVZFX0FSQ0hfU1RSVUNUX0ZMT0NLNjQKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ZjbnRsLmg+CisjZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CiAKICNlbmRpZiAvKiBfWFRFTlNBX0ZDTlRMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9maXhtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyM2I4YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvZml4bWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9maXhtYXAuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfRklYTUFQX0gKLSNkZWZpbmUgX1hURU5TQV9GSVhNQVBfSAotCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCi0jaWZkZWYgQ09ORklHX01NVQotCi0vKgotICogSGVyZSB3ZSBkZWZpbmUgYWxsIHRoZSBjb21waWxlLXRpbWUgdmlydHVhbCBhZGRyZXNzZXMuCi0gKi8KLQotI2lmIFhDSEFMX1NFR19NQVBQQUJMRV9WQUREUiAhPSAwCi0jIGVycm9yICJDdXJyZW50IHBvcnQgcmVxdWlyZXMgdmlydHVhbCB1c2VyIHNwYWNlIHN0YXJ0aW5nIGF0IDAiCi0jZW5kaWYKLSNpZiBYQ0hBTF9TRUdfTUFQUEFCTEVfU0laRSA8IDB4ODAwMDAwMDAKLSMgZXJyb3IgIkN1cnJlbnQgcG9ydCByZXF1aXJlcyBhdCBsZWFzdCAweDgwMDAwMDAgYnl0ZXMgZm9yIHVzZXIgc3BhY2UiCi0jZW5kaWYKLQotLyogVmVyaWZ5IGluc3RydWN0aW9uL2RhdGEgcmFtL3JvbSBhbmQgeGxtaSBkb24ndCBvdmVybGF5IHZtYWxsb2Mgc3BhY2UuICovCi0KLSNkZWZpbmUgX19JTl9WTUFMTE9DKGFkZHIpCQkJCQkJXAotCSgoKGFkZHIpID49IFZNQUxMT0NfU1RBUlQpICYmICgoYWRkcikgPCBWTUFMTE9DX0VORCkpCi0jZGVmaW5lIF9fU1BBTl9WTUFMTE9DKHN0YXJ0LGVuZCkJCQkJCVwKLQkoKChzdGFydCkgPCBWTUFMTE9DX1NUQVJUKSAmJiAoKGVuZCkgPj0gVk1BTExPQ19FTkQpKQotI2RlZmluZSBJTlNJREVfVk1BTExPQyhzdGFydCxlbmQpIAkJCQkJXAotCShfX0lOX1ZNQUxMT0MoKHN0YXJ0KSkgfHwgX19JTl9WTUFMTE9DKGVuZCkgfHwgX19TUEFOX1ZNQUxMT0MoKHN0YXJ0KSwoZW5kKSkpCi0KLSNpZiBYQ0hBTF9OVU1fSU5TVFJPTQotIyBpZiBYQ0hBTF9OVU1fSU5TVFJPTSA9PSAxCi0jICBpZiBJTlNJREVfVk1BTExPQyhYQ0hBTF9JTlNUUk9NMF9WQUREUixYQ0hBTF9JTlNUUk9NMF9WQUREUitYQ0hBTF9JTlNUUk9NMF9TSVpFKQotIyAgIGVycm9yIHZtYWxsb2MgcmFuZ2UgY29uZmxpY3RzIHdpdGggaW5zdHJvbTAKLSMgIGVuZGlmCi0jIGVuZGlmCi0jIGlmIFhDSEFMX05VTV9JTlNUUk9NID09IDIKLSMgIGlmIElOU0lERV9WTUFMTE9DKFhDSEFMX0lOU1RST00xX1ZBRERSLFhDSEFMX0lOU1RST00xX1ZBRERSK1hDSEFMX0lOU1RST00xX1NJWkUpCi0jICAgZXJyb3Igdm1hbGxvYyByYW5nZSBjb25mbGljdHMgd2l0aCBpbnN0cm9tMQotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgWENIQUxfTlVNX0lOU1RSQU0KLSMgaWYgWENIQUxfTlVNX0lOU1RSQU0gPT0gMQotIyAgaWYgSU5TSURFX1ZNQUxMT0MoWENIQUxfSU5TVFJBTTBfVkFERFIsWENIQUxfSU5TVFJBTTBfVkFERFIrWENIQUxfSU5TVFJBTTBfU0laRSkKLSMgICBlcnJvciB2bWFsbG9jIHJhbmdlIGNvbmZsaWN0cyB3aXRoIGluc3RyYW0wCi0jICBlbmRpZgotIyBlbmRpZgotIyBpZiBYQ0hBTF9OVU1fSU5TVFJBTSA9PSAyCi0jICBpZiBJTlNJREVfVk1BTExPQyhYQ0hBTF9JTlNUUkFNMV9WQUREUixYQ0hBTF9JTlNUUkFNMV9WQUREUitYQ0hBTF9JTlNUUkFNMV9TSVpFKQotIyAgIGVycm9yIHZtYWxsb2MgcmFuZ2UgY29uZmxpY3RzIHdpdGggaW5zdHJhbTEKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIFhDSEFMX05VTV9EQVRBUk9NCi0jIGlmIFhDSEFMX05VTV9EQVRBUk9NID09IDEKLSMgIGlmIElOU0lERV9WTUFMTE9DKFhDSEFMX0RBVEFST00wX1ZBRERSLFhDSEFMX0RBVEFST00wX1ZBRERSK1hDSEFMX0RBVEFST00wX1NJWkUpCi0jICAgZXJyb3Igdm1hbGxvYyByYW5nZSBjb25mbGljdHMgd2l0aCBkYXRhcm9tMAotIyAgZW5kaWYKLSMgZW5kaWYKLSMgaWYgWENIQUxfTlVNX0RBVEFST00gPT0gMgotIyAgaWYgSU5TSURFX1ZNQUxMT0MoWENIQUxfREFUQVJPTTFfVkFERFIsWENIQUxfREFUQVJPTTFfVkFERFIrWENIQUxfREFUQVJPTTFfU0laRSkKLSMgICBlcnJvciB2bWFsbG9jIHJhbmdlIGNvbmZsaWN0cyB3aXRoIGRhdGFyb20xCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBYQ0hBTF9OVU1fREFUQVJBTQotIyBpZiBYQ0hBTF9OVU1fREFUQVJBTSA9PSAxCi0jICBpZiBJTlNJREVfVk1BTExPQyhYQ0hBTF9EQVRBUkFNMF9WQUREUixYQ0hBTF9EQVRBUkFNMF9WQUREUitYQ0hBTF9EQVRBUkFNMF9TSVpFKQotIyAgIGVycm9yIHZtYWxsb2MgcmFuZ2UgY29uZmxpY3RzIHdpdGggZGF0YXJhbTAKLSMgIGVuZGlmCi0jIGVuZGlmCi0jIGlmIFhDSEFMX05VTV9EQVRBUkFNID09IDIKLSMgIGlmIElOU0lERV9WTUFMTE9DKFhDSEFMX0RBVEFSQU0xX1ZBRERSLFhDSEFMX0RBVEFSQU0xX1ZBRERSK1hDSEFMX0RBVEFSQU0xX1NJWkUpCi0jICAgZXJyb3Igdm1hbGxvYyByYW5nZSBjb25mbGljdHMgd2l0aCBkYXRhcmFtMQotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgWENIQUxfTlVNX1hMTUkKLSMgaWYgWENIQUxfTlVNX1hMTUkgPT0gMQotIyAgaWYgSU5TSURFX1ZNQUxMT0MoWENIQUxfWExNSTBfVkFERFIsWENIQUxfWExNSTBfVkFERFIrWENIQUxfWExNSTBfU0laRSkKLSMgICBlcnJvciB2bWFsbG9jIHJhbmdlIGNvbmZsaWN0cyB3aXRoIHhsbWkwCi0jICBlbmRpZgotIyBlbmRpZgotIyBpZiBYQ0hBTF9OVU1fWExNSSA9PSAyCi0jICBpZiBJTlNJREVfVk1BTExPQyhYQ0hBTF9YTE1JMV9WQUREUixYQ0hBTF9YTE1JMV9WQUREUitYQ0hBTF9YTE1JMV9TSVpFKQotIyAgIGVycm9yIHZtYWxsb2MgcmFuZ2UgY29uZmxpY3RzIHdpdGggeGxtaTEKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIChYQ0hBTF9OVU1fSU5TVFJPTSA+IDIpIHx8IFwKLSAgICAoWENIQUxfTlVNX0lOU1RSQU0gPiAyKSB8fCBcCi0gICAgKFhDSEFMX05VTV9EQVRBUkFNID4gMikgfHwgXAotICAgIChYQ0hBTF9OVU1fREFUQVJPTSA+IDIpIHx8IFwKLSAgICAoWENIQUxfTlVNX1hMTUkgICAgPiAyKQotIyBlcnJvciBJbnN1ZmZpY2llbnQgY2hlY2tzIG9uIHZtYWxsb2MgYWJvdmUgZm9yIG1vcmUgdGhhbiAyIGRldmljZXMKLSNlbmRpZgotCi0vKgotICogVVNFUl9WTV9TSVpFIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGVxdWFsIFRBU0tfU0laRS4gIFdlIGJ1bXBlZAotICogVEFTS19TSVpFIGRvd24gdG8gMHg0MDAwMDAwIHRvIHNpbXBsaWZ5IHRoZSBoYW5kbGluZyBvZiB3aW5kb3dlZAotICogY2FsbCBpbnN0cnVjdGlvbnMgKGN1cnJlbnRseSBsaW1pdGVkIHRvIGEgcmFuZ2Ugb2YgMSBHQnl0ZSkuICBVc2VyCi0gKiB0YXNrcyBtYXkgdmVyeSB3ZWxsIHJlY2xhaW0gdGhlIFZNIHNwYWNlIGZyb20gMHg0MDAwMDAwMCB0bwotICogMHg3ZmZmZmZmZiBpbiB0aGUgZnV0dXJlLCBzbyB3ZSBkbyBub3Qgd2FudCB0aGUga2VybmVsIGJlY29taW5nCi0gKiBhY2N1c3RvbWVkIHRvIGhhdmluZyBhbnkgb2YgaXRzIHN0dWZmIChlLmcuLCBwYWdlIHRhYmxlcykgaW4gdGhpcwotICogcmVnaW9uLiAgVGhpcyBWTSByZWdpb24gaXMgbm8tbWFuJ3MgbGFuZCBmb3Igbm93LgotICovCi0KLSNkZWZpbmUgVVNFUl9WTV9TVEFSVAkJWENIQUxfU0VHX01BUFBBQkxFX1ZBRERSCi0jZGVmaW5lIFVTRVJfVk1fU0laRQkJMHg4MDAwMDAwMAotCi0vKiAgU2l6ZSBvZiBwYWdlIHRhYmxlOiAgKi8KLQotI2RlZmluZSBQR1RBQkxFX1NJWkVfQklUUwkoMzIgLSBYQ0hBTF9NTVVfTUlOX1BURV9QQUdFX1NJWkUgKyAyKQotI2RlZmluZSBQR1RBQkxFX1NJWkUJCSgxTCA8PCBQR1RBQkxFX1NJWkVfQklUUykKLQotLyogIEFsbCBrZXJuZWwtbWFwcGFibGUgc3BhY2U6ICAqLwotCi0jZGVmaW5lIEtFUk5FTF9BTExNQVBfU1RBUlQJKFVTRVJfVk1fU1RBUlQgKyBVU0VSX1ZNX1NJWkUpCi0jZGVmaW5lIEtFUk5FTF9BTExNQVBfU0laRQkoWENIQUxfU0VHX01BUFBBQkxFX1NJWkUgLSBLRVJORUxfQUxMTUFQX1NUQVJUKQotCi0vKiAgQ2FydmUgb3V0IHBhZ2UgdGFibGUgYXQgc3RhcnQgb2Yga2VybmVsLW1hcHBhYmxlIGFyZWE6ICAqLwotCi0jaWYgS0VSTkVMX0FMTE1BUF9TSVpFIDwgUEdUQUJMRV9TSVpFCi0jZXJyb3IgIkdpbW1lIHNvbWUgc3BhY2UgZm9yIHBhZ2UgdGFibGUhIgotI2VuZGlmCi0jZGVmaW5lIFBHVEFCTEVfU1RBUlQJCUtFUk5FTF9BTExNQVBfU1RBUlQKLQotLyogIFJlbWFpbmluZyBrZXJuZWwtbWFwcGFibGUgc3BhY2U6ICAqLwotCi0jZGVmaW5lIEtFUk5FTF9NQVBQRURfU1RBUlQJKEtFUk5FTF9BTExNQVBfU1RBUlQgKyBQR1RBQkxFX1NJWkUpCi0jZGVmaW5lIEtFUk5FTF9NQVBQRURfU0laRQkoS0VSTkVMX0FMTE1BUF9TSVpFIC0gUEdUQUJMRV9TSVpFKQotCi0jaWYgS0VSTkVMX01BUFBFRF9TSVpFIDwgMHgwMTAwMDAwMAkvKiAxNiBNQiBpcyBhcmJpdHJhcnkgZm9yIG5vdyAqLwotIyBlcnJvciAiU2hvdWxkbid0IHRoZSBrZXJuZWwgaGF2ZSBhdCBsZWFzdCAqc29tZSogbWFwcGFibGUgc3BhY2U/IgotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0xPV19NRU1PUlkJCVhDSEFMX0tTRUdfQ0FDSEVEX1NJWkUKLQotI2VuZGlmCi0KLS8qCi0gKiAgU29tZSBjb25zdGFudHMgdXNlZCBlbHNld2hlcmUsIGJ1dCBwZXJoYXBzIG9ubHkgaW4gWHRlbnNhIGhlYWRlcgotICogIGZpbGVzLCBzbyBtYXliZSB3ZSBjYW4gZ2V0IHJpZCBvZiBzb21lIGFuZCBhY2Nlc3MgY29tcGlsZS10aW1lIEhBTAotICogIGRpcmVjdGx5Li4uCi0gKgotICogIE5vdGU6ICBXZSBhc3N1bWUgdGhhdCBzeXN0ZW0gUkFNIGlzIGxvY2F0ZWQgYXQgdGhlIHZlcnkgc3RhcnQgb2YgdGhlCi0gKiAgCSAgIGtlcm5lbCBzZWdtZW50cyAhIQotICovCi0jZGVmaW5lIEtFUk5FTF9WTV9MT1cgICAgICAgICAgIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCi0jZGVmaW5lIEtFUk5FTF9WTV9ISUdIICAgICAgICAgIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSCi0jZGVmaW5lIEtFUk5FTF9TUEFDRSAgICAgICAgICAgIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCi0KLS8qCi0gKiBSZXR1cm5zIHRoZSBwaHlzaWNhbC92aXJ0dWFsIGFkZHJlc3NlcyBvZiB0aGUga2VybmVsIHNwYWNlCi0gKiAod29ya3Mgd2l0aCB0aGUgY2FjaGVkIGtlcm5lbCBzZWdtZW50IG9ubHksIHdoaWNoIGlzIHRoZQotICogIG9uZSBub3JtYWxseSB1c2VkIGZvciBrZXJuZWwgb3BlcmF0aW9uKS4KLSAqLwotCi0vKgkJCVBIWVNJQ0FMCUJZUEFTUwkJQ0FDSEVECi0gKgotICogIGJ5cGFzcyB2YWRkcglieXBhc3MgcGFkZHIJKgkJY2FjaGVkIHZhZGRyCi0gKiAgY2FjaGVkIHZhZGRyCWNhY2hlZCBwYWRkcglieXBhc3MgdmFkZHIJKgotICogIGJ5cGFzcyBwYWRkcgkqCQlieXBhc3MgdmFkZHIJY2FjaGVkIHZhZGRyCi0gKiAgY2FjaGVkIHBhZGRyCSoJCWJ5cGFzcyB2YWRkcgljYWNoZWQgdmFkZHIKLSAqICBvdGhlcgkJKgkJKgkJKgotICovCi0KLSNkZWZpbmUgUEhZU0FERFIoYSkJCQkJCQkJICAgICAgXAotKCgodW5zaWduZWQpKGEpID49IFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSCQkJCSAgICAgIFwKLSAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSICsgWENIQUxfS1NFR19CWVBBU1NfU0laRSkgPyAgICAgIFwKLSAgICAodW5zaWduZWQpKGEpIC0gWENIQUxfS1NFR19CWVBBU1NfVkFERFIgKyBYQ0hBTF9LU0VHX0JZUEFTU19QQUREUiA6ICAgICAgIFwKLSAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUgkJCQkgICAgICBcCi0gICAgICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiArIFhDSEFMX0tTRUdfQ0FDSEVEX1NJWkUpID8gICBcCi0gICAgICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiArIFhDSEFMX0tTRUdfQ0FDSEVEX1BBRERSIDogICBcCi0JKHVuc2lnbmVkKShhKSkKLQotI2RlZmluZSBCWVBBU1NfQUREUihhKQkJCQkJCQkgICAgICBcCi0oKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS1NFR19CWVBBU1NfUEFERFIJCQkJICAgICAgXAotICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS1NFR19CWVBBU1NfUEFERFIgKyBYQ0hBTF9LU0VHX0JZUEFTU19TSVpFKSA/ICAgICAgXAotICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LU0VHX0JZUEFTU19QQUREUiArIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSIDogICAgICAgXAotICAgICgodW5zaWduZWQpKGEpID49IFhDSEFMX0tTRUdfQ0FDSEVEX1BBRERSCQkJCSAgICAgIFwKLSAgICAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tTRUdfQ0FDSEVEX1BBRERSICsgWENIQUxfS1NFR19DQUNIRURfU0laRSkgPyAgIFwKLSAgICAgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tTRUdfQ0FDSEVEX1BBRERSICsgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgOiAgIFwKLSAgICAgICAgKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS1NFR19DQUNIRURfVkFERFIJCQkgICAgICBcCi0gICAgICAgICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS1NFR19DQUNIRURfVkFERFIrWENIQUxfS1NFR19DQUNIRURfU0laRSk/ICBcCi0gICAgICAgICAgICAodW5zaWduZWQpKGEpIC0gWENIQUxfS1NFR19DQUNIRURfVkFERFIrWENIQUxfS1NFR19CWVBBU1NfVkFERFI6ICBcCi0JICAgICh1bnNpZ25lZCkoYSkpCi0KLSNkZWZpbmUgQ0FDSEVEX0FERFIoYSkJCQkJCQkJICAgICAgXAotKCgodW5zaWduZWQpKGEpID49IFhDSEFMX0tTRUdfQllQQVNTX1BBRERSCQkJCSAgICAgIFwKLSAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tTRUdfQllQQVNTX1BBRERSICsgWENIQUxfS1NFR19CWVBBU1NfU0laRSkgPyAgICAgIFwKLSAgICAodW5zaWduZWQpKGEpIC0gWENIQUxfS1NFR19CWVBBU1NfUEFERFIgKyBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiA6ICAgICAgIFwKLSAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LU0VHX0NBQ0hFRF9QQUREUgkJCSAgICAgICAgICAgICAgXAotICAgICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS1NFR19DQUNIRURfUEFERFIgKyBYQ0hBTF9LU0VHX0NBQ0hFRF9TSVpFKSA/ICAgXAotICAgICAgICAodW5zaWduZWQpKGEpIC0gWENIQUxfS1NFR19DQUNIRURfUEFERFIgKyBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiA6ICAgXAotICAgICAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUgkJCSAgICAgIFwKLSAgICAgICAgICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUitYQ0hBTF9LU0VHX0JZUEFTU19TSVpFKSA/IFwKLSAgICAgICAgICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUitYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiA6IFwKLQkgICAgKHVuc2lnbmVkKShhKSkKLQotI2RlZmluZSBQSFlTQUREUl9JTyhhKQkJCQkJCQkgICAgICBcCi0oKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS0lPX0JZUEFTU19WQUREUgkJCQkgICAgICBcCi0gICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICsgWENIQUxfS0lPX0JZUEFTU19TSVpFKSA/CSAgICAgIFwKLSAgICAodW5zaWduZWQpKGEpIC0gWENIQUxfS0lPX0JZUEFTU19WQUREUiArIFhDSEFMX0tJT19CWVBBU1NfUEFERFIgOgkgICAgICBcCi0gICAgKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS0lPX0NBQ0hFRF9WQUREUgkJCQkgICAgICBcCi0gICAgICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSICsgWENIQUxfS0lPX0NBQ0hFRF9TSVpFKSA/ICAgICBcCi0gICAgICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSICsgWENIQUxfS0lPX0NBQ0hFRF9QQUREUiA6ICAgICBcCi0JKHVuc2lnbmVkKShhKSkKLQotI2RlZmluZSBCWVBBU1NfQUREUl9JTyhhKQkJCQkJCSAgICAgIFwKLSgoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LSU9fQllQQVNTX1BBRERSCQkJCSAgICAgIFwKLSAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tJT19CWVBBU1NfUEFERFIgKyBYQ0hBTF9LSU9fQllQQVNTX1NJWkUpID8JICAgICAgXAotICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LSU9fQllQQVNTX1BBRERSICsgWENIQUxfS0lPX0JZUEFTU19WQUREUiA6CSAgICAgIFwKLSAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LSU9fQ0FDSEVEX1BBRERSCQkJCSAgICAgIFwKLSAgICAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tJT19DQUNIRURfUEFERFIgKyBYQ0hBTF9LSU9fQ0FDSEVEX1NJWkUpID8gICAgIFwKLSAgICAgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tJT19DQUNIRURfUEFERFIgKyBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSIDogICAgIFwKLSAgICAgICAgKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS0lPX0NBQ0hFRF9WQUREUgkJCSAgICAgIFwKLSAgICAgICAgICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSICsgWENIQUxfS0lPX0NBQ0hFRF9TSVpFKSA/IFwKLSAgICAgICAgICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSICsgWENIQUxfS0lPX0JZUEFTU19WQUREUiA6IFwKLQkgICAgKHVuc2lnbmVkKShhKSkKLQotI2RlZmluZSBDQUNIRURfQUREUl9JTyhhKQkJCQkJCSAgICAgIFwKLSgoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LSU9fQllQQVNTX1BBRERSCQkJCSAgICAgIFwKLSAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tJT19CWVBBU1NfUEFERFIgKyBYQ0hBTF9LSU9fQllQQVNTX1NJWkUpID8JICAgICAgXAotICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LSU9fQllQQVNTX1BBRERSICsgWENIQUxfS0lPX0NBQ0hFRF9WQUREUiA6CSAgICAgIFwKLSAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LSU9fQ0FDSEVEX1BBRERSCQkJCSAgICAgIFwKLSAgICAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tJT19DQUNIRURfUEFERFIgKyBYQ0hBTF9LSU9fQ0FDSEVEX1NJWkUpID8gICAgIFwKLSAgICAgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tJT19DQUNIRURfUEFERFIgKyBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSIDogICAgIFwKLSAgICAgICAgKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS0lPX0JZUEFTU19WQUREUgkJCSAgICAgIFwKLSAgICAgICAgICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICsgWENIQUxfS0lPX0JZUEFTU19TSVpFKSA/IFwKLSAgICAgICAgICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICsgWENIQUxfS0lPX0NBQ0hFRF9WQUREUiA6IFwKLQkgICAgKHVuc2lnbmVkKShhKSkKLQotI2VuZGlmIC8qIF9YVEVOU0FfQUREUlNQQUNFX0ggKi8KLQotCi0KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaW8uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCmluZGV4IDU1NmU1ZWUuLjMxZmZjM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGxpbnV4L2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvaW8uaAogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xNSwxMCArMTUsMTEgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KIAotI2RlZmluZSBfSU9fQkFTRSAwCi0KKyNkZWZpbmUgWENIQUxfS0lPX0NBQ0hFRF9WQUREUgkweGYwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0tJT19CWVBBU1NfVkFERFIJMHhmODAwMDAwMAorI2RlZmluZSBYQ0hBTF9LSU9fUEFERFIJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgWENIQUxfS0lPX1NJWkUJCTB4MDgwMDAwMDAKIAogLyoKICAqIHN3YXAgZnVuY3Rpb25zIHRvIGNoYW5nZSBieXRlIG9yZGVyIGZyb20gbGl0dGxlLWVuZGlhbiB0byBiaWctZW5kaWFuIGFuZApAQCAtNDIsNDAgKzQzLDQzIEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXModm9sYXRpbGUgdm9pZCAqIGFkZHJlc3MpCiB7Ci0JcmV0dXJuIFBIWVNBRERSKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOworCXJldHVybiBfX3BhKGFkZHJlc3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKiBwaHlzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCXJldHVybiAodm9pZCopIENBQ0hFRF9BRERSKGFkZHJlc3MpOworCXJldHVybiBfX3ZhKGFkZHJlc3MpOwogfQogCiAvKgotICogSU8gYnVzIG1lbW9yeSBhZGRyZXNzZXMgYXJlIGFsc28gMToxIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3MKKyAqIHZpcnRfdG9fYnVzIGFuZCBidXNfdG9fdmlydCBhcmUgZGVwcmVjYXRlZC4KICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19idXModm9sYXRpbGUgdm9pZCAqIGFkZHJlc3MpCi17Ci0JcmV0dXJuIFBIWVNBRERSKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKiBidXNfdG9fdmlydCAodW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotCXJldHVybiAodm9pZCAqKSBDQUNIRURfQUREUihhZGRyZXNzKTsKLX0KKyNkZWZpbmUgdmlydF90b19idXMoeCkJdmlydF90b19waHlzKHgpCisjZGVmaW5lIGJ1c190b192aXJ0KHgpCXBoeXNfdG9fdmlydCh4KQogCiAvKgotICogQ2hhbmdlICJzdHJ1Y3QgcGFnZSIgdG8gcGh5c2ljYWwgYWRkcmVzcy4KKyAqIFJldHVybiB0aGUgdmlydHVhbCAoY2FjaGVkKSBhZGRyZXNzIGZvciB0aGUgc3BlY2lmaWVkIGJ1cyBtZW1vcnkuCisgKiBOb3RlIHRoYXQgd2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgYW55IGFkZHJlc3Mgb3V0c2lkZSB0aGUgS0lPIHNlZ21lbnQuCiAgKi8KIAogc3RhdGljIGlubGluZSB2b2lkICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0gICAgICAgIHJldHVybiAodm9pZCAqKSBDQUNIRURfQUREUl9JTyhvZmZzZXQpOworCWlmIChvZmZzZXQgPj0gWENIQUxfS0lPX1BBRERSCisJICAgICYmIG9mZnNldCA8IFhDSEFMX0tJT19QQUREUiArIFhDSEFMX0tJT19TSVpFKQorCQlyZXR1cm4gKHZvaWQqKShvZmZzZXQtWENIQUxfS0lPX1BBRERSK1hDSEFMX0tJT19CWVBBU1NfVkFERFIpOworCisJZWxzZQorCQlCVUcoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICppb3JlbWFwX25vY2FjaGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLSAgICAgICAgcmV0dXJuICh2b2lkICopIEJZUEFTU19BRERSX0lPKG9mZnNldCk7CisJaWYgKG9mZnNldCA+PSBYQ0hBTF9LSU9fUEFERFIKKwkgICAgJiYgb2Zmc2V0IDwgWENIQUxfS0lPX1BBRERSICsgWENIQUxfS0lPX1NJWkUpCisJCXJldHVybiAodm9pZCopKG9mZnNldC1YQ0hBTF9LSU9fUEFERFIrWENIQUxfS0lPX0NBQ0hFRF9WQUREUik7CisJZWxzZQorCQlCVUcoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGlvdW5tYXAodm9pZCAqYWRkcikKQEAgLTEyMSw5ICsxMjUsNiBAQAogICAgICAgICAgICooX19mb3JjZSB2b2xhdGlsZSBfX3UzMiAqKShhZGRyKSA9IGI7CiB9CiAKLQotCi0KIC8qIFRoZXNlIGFyZSB0aGUgZGVmaW5pdGlvbnMgZm9yIHRoZSB4ODYgSU8gaW5zdHJ1Y3Rpb25zCiAgKiBpbmIvaW53L2lubC9vdXRiL291dHcvb3V0bCwgdGhlICJzdHJpbmciIHZlcnNpb25zCiAgKiBpbnNiL2luc3cvaW5zbC9vdXRzYi9vdXRzdy9vdXRzbCwgYW5kIHRoZSAicGF1c2luZyIgdmVyc2lvbnMKQEAgLTEzMSwxMSArMTMyLDExIEBACiAgKiBUaGUgbWFjcm9zIGRvbid0IGRvIGJ5dGUtc3dhcHBpbmcuCiAgKi8KIAotI2RlZmluZSBpbmIocG9ydCkJCXJlYWRiKCh1OCAqKSgocG9ydCkrX0lPX0JBU0UpKQotI2RlZmluZSBvdXRiKHZhbCwgcG9ydCkJCXdyaXRlYigodmFsKSwodTggKikoKHVuc2lnbmVkIGxvbmcpKHBvcnQpK19JT19CQVNFKSkKLSNkZWZpbmUgaW53KHBvcnQpCQlyZWFkdygodTE2ICopKChwb3J0KStfSU9fQkFTRSkpCi0jZGVmaW5lIG91dHcodmFsLCBwb3J0KQkJd3JpdGV3KCh2YWwpLCh1MTYgKikoKHVuc2lnbmVkIGxvbmcpKHBvcnQpK19JT19CQVNFKSkKLSNkZWZpbmUgaW5sKHBvcnQpCQlyZWFkbCgodTMyICopKChwb3J0KStfSU9fQkFTRSkpCisjZGVmaW5lIGluYihwb3J0KQkJcmVhZGIoKHU4ICopKChwb3J0KSkpCisjZGVmaW5lIG91dGIodmFsLCBwb3J0KQkJd3JpdGViKCh2YWwpLCh1OCAqKSgodW5zaWduZWQgbG9uZykocG9ydCkpKQorI2RlZmluZSBpbncocG9ydCkJCXJlYWR3KCh1MTYgKikoKHBvcnQpKSkKKyNkZWZpbmUgb3V0dyh2YWwsIHBvcnQpCQl3cml0ZXcoKHZhbCksKHUxNiAqKSgodW5zaWduZWQgbG9uZykocG9ydCkpKQorI2RlZmluZSBpbmwocG9ydCkJCXJlYWRsKCh1MzIgKikoKHBvcnQpKSkKICNkZWZpbmUgb3V0bCh2YWwsIHBvcnQpCQl3cml0ZWwoKHZhbCksKHUzMiAqKSgodW5zaWduZWQgbG9uZykocG9ydCkpKQogCiAjZGVmaW5lIGluYl9wKHBvcnQpCQlpbmIoKHBvcnQpKQpAQCAtMTgwLDE0ICsxODEsMTMgQEAKIAogCiAvKgotICogICogQ29udmVydCBhIHBoeXNpY2FsIHBvaW50ZXIgdG8gYSB2aXJ0dWFsIGtlcm5lbCBwb2ludGVyIGZvciAvZGV2L21lbQotICogICAqIGFjY2VzcwotICogICAgKi8KKyAqIENvbnZlcnQgYSBwaHlzaWNhbCBwb2ludGVyIHRvIGEgdmlydHVhbCBrZXJuZWwgcG9pbnRlciBmb3IgL2Rldi9tZW0gYWNjZXNzCisgKi8KICNkZWZpbmUgeGxhdGVfZGV2X21lbV9wdHIocCkgICAgX192YShwKQogCiAvKgotICogICogQ29udmVydCBhIHZpcnR1YWwgY2FjaGVkIHBvaW50ZXIgdG8gYW4gdW5jYWNoZWQgcG9pbnRlcgotICogICAqLworICogQ29udmVydCBhIHZpcnR1YWwgY2FjaGVkIHBvaW50ZXIgdG8gYW4gdW5jYWNoZWQgcG9pbnRlcgorICovCiAjZGVmaW5lIHhsYXRlX2Rldl9rbWVtX3B0cihwKSAgIHAKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaXJxLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvaXJxLmgKaW5kZXggMDQ5ZmRlNy4uZmM3M2I3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcnEuaApAQCAtMTIsOCArMTIsNyBAQAogI2RlZmluZSBfWFRFTlNBX0lSUV9ICiAKICNpbmNsdWRlIDxhc20vcGxhdGZvcm0vaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgorI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KIAogI2lmbmRlZiBQTEFURk9STV9OUl9JUlFTCiAjIGRlZmluZSBQTEFURk9STV9OUl9JUlFTIDAKQEAgLTI3LDEwICsyNiw1IEBACiB9CiAKIHN0cnVjdCBpcnFhY3Rpb247Ci0jaWYgMCAvLyBGSVhNRQotZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnFfbm9zeW5jKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOwotI2VuZGlmCiAKICNlbmRpZgkvKiBfWFRFTlNBX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaXJxX3JlZ3MuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcnFfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDljMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvaXJxX3JlZ3MuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaXJxX3JlZ3MuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL21tdV9jb250ZXh0LmgKaW5kZXggYWY2ODNhNy4uZjE0ODUxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL21tdV9jb250ZXh0LmgKQEAgLTE2LDE4NyArMTYsMzIgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAotLyoKLSAqIExpbnV4IHdhcyBwb3J0ZWQgdG8gWHRlbnNhIGFzc3VtaW5nIGFsbCBhdXRvLXJlZmlsbCB3YXlzIGluIHNldCAwCi0gKiBoYWQgdGhlIHNhbWUgcHJvcGVydGllcyAoYSB2ZXJ5IGxpa2VseSBhc3N1bXB0aW9uKS4gIE11bHRpcGxlIHNldHMKLSAqIG9mIGF1dG8tcmVmaWxsIHdheXMgd2lsbCBzdGlsbCB3b3JrIHByb3Blcmx5LCBidXQgbm90IGFzIG9wdGltYWxseQotICogYXMgdGhlIFh0ZW5zYSBkZXNpZ25lciBtYXkgaGF2ZSBhc3N1bWVkLgotICoKLSAqIFdlIG1ha2UgdGhpcyBjYXNlIGEgaGFyZCAjZXJyb3IsIGtpbGxpbmcgdGhlIGtlcm5lbCBidWlsZCwgdG8gYWxlcnQKLSAqIHRoZSBkZXZlbG9wZXIgdG8gdGhpcyBjb25kaXRpb24gKHdoaWNoIGlzIG1vcmUgbGlrZWx5IGFuIGVycm9yKS4KLSAqIFlvdSBzdXBlci1kdXBlciBjbGV2ZXIgZGV2ZWxvcGVycyBjYW4gY2hhbmdlIGl0IHRvIGEgd2FybmluZyBvcgotICogcmVtb3ZlIGl0IGFsdG9nZXRoZXIgaWYgeW91IHRoaW5rIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiAgOikKLSAqLworI2RlZmluZSBYQ0hBTF9NTVVfQVNJRF9CSVRTCTgKIAogI2lmIChYQ0hBTF9IQVZFX1RMQlMgIT0gMSkKICMgZXJyb3IgIkxpbnV4IG11c3QgaGF2ZSBhbiBNTVUhIgogI2VuZGlmCiAKLSNpZiAoKFhDSEFMX0lUTEJfQVJGX1dBWVMgPT0gMCkgfHwgKFhDSEFMX0RUTEJfQVJGX1dBWVMgPT0gMCkpCi0jIGVycm9yICJNTVUgbXVzdCBoYXZlIGF1dG8tcmVmaWxsIHdheXMiCi0jZW5kaWYKLQotI2lmICgoWENIQUxfSVRMQl9BUkZfU0VUUyAhPSAxKSB8fCAoWENIQUxfRFRMQl9BUkZfU0VUUyAhPSAxKSkKLSMgZXJyb3IgTGludXggbWF5IG5vdCB1c2UgYWxsIGF1dG8tcmVmaWxsIHdheXMgYXMgZWZmaWNpZW50bHkgYXMgeW91IHRoaW5rCi0jZW5kaWYKLQotI2lmIChYQ0hBTF9NTVVfTUFYX1BURV9QQUdFX1NJWkUgIT0gWENIQUxfTU1VX01JTl9QVEVfUEFHRV9TSVpFKQotIyBlcnJvciBPbmx5IG9uZSBwYWdlIHNpemUgYWxsb3dlZCEKLSNlbmRpZgotCiBleHRlcm4gdW5zaWduZWQgbG9uZyBhc2lkX2NhY2hlOwotZXh0ZXJuIHBnZF90ICpjdXJyZW50X3BnZDsKLQotLyoKLSAqIERlZmluZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgcGVyIGF1dG8tcmVmaWxsIHdheSBpbiBzZXQgMCBvZiBib3RoIEkgYW5kIEQKLSAqIFRMQnMuICBXZSBkZWFsIG9ubHkgd2l0aCBzZXQgMCBoZXJlIChhbiBhc3N1bXB0aW9uIGZ1cnRoZXIgZXhwbGFpbmVkIGluCi0gKiBhc3NlcnRpb25zLmgpLiAgQWxzbywgZGVmaW5lIHRoZSB0b3RhbCBudW1iZXIgb2YgQVJGIGVudHJpZXMgaW4gYm90aCBUTEJzLgotICovCi0KLSNkZWZpbmUgSVRMQl9FTlRSSUVTX1BFUl9BUkZfV0FZICAoWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9BUkZfU0VUMCxFTlRSSUVTKSkKLSNkZWZpbmUgRFRMQl9FTlRSSUVTX1BFUl9BUkZfV0FZICAoWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9BUkZfU0VUMCxFTlRSSUVTKSkKLQotI2RlZmluZSBJVExCX0VOVFJJRVMJCQkJCQkJXAotIAkoSVRMQl9FTlRSSUVTX1BFUl9BUkZfV0FZICogKFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfQVJGX1NFVDAsV0FZUykpKQotI2RlZmluZSBEVExCX0VOVFJJRVMJCQkJCQkJXAotCShEVExCX0VOVFJJRVNfUEVSX0FSRl9XQVkgKiAoWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9BUkZfU0VUMCxXQVlTKSkpCi0KLQotLyoKLSAqIFNNQUxMRVNUX05UTEJfRU5UUklFUyBpcyB0aGUgc21hbGxlciBvZiBJVExCX0VOVFJJRVMgYW5kIERUTEJfRU5UUklFUy4KLSAqIEluIHByYWN0aWNlLCB0aGV5IGFyZSBwcm9iYWJseSBlcXVhbC4gIFRoaXMgbWFjcm8gc2ltcGxpZmllcyBmdW5jdGlvbgotICogZmx1c2hfdGxiX3JhbmdlKCkuCi0gKi8KLQotI2lmIChEVExCX0VOVFJJRVMgPCBJVExCX0VOVFJJRVMpCi0jIGRlZmluZSBTTUFMTEVTVF9OVExCX0VOVFJJRVMgIERUTEJfRU5UUklFUwotI2Vsc2UKLSMgZGVmaW5lIFNNQUxMRVNUX05UTEJfRU5UUklFUyAgSVRMQl9FTlRSSUVTCi0jZW5kaWYKLQotCi0vKgotICogYXNpZF9jYWNoZSB0cmFja3Mgb25seSB0aGUgQVNJRFtVU0VSX1JJTkddIGZpZWxkIG9mIHRoZSBSQVNJRCBzcGVjaWFsCi0gKiByZWdpc3Rlciwgd2hpY2ggaXMgdGhlIGN1cnJlbnQgdXNlci10YXNrIGFzaWQgYWxsb2NhdGlvbiB2YWx1ZS4KLSAqIG1tLT5jb250ZXh0IGhhcyB0aGUgc2FtZSBtZWFuaW5nLiAgV2hlbiBpdCBjb21lcyB0aW1lIHRvIHdyaXRlIHRoZQotICogYXNpZF9jYWNoZSBvciBtbS0+Y29udGV4dCB2YWx1ZXMgdG8gdGhlIFJBU0lEIHNwZWNpYWwgcmVnaXN0ZXIsIHdlIGZpcnN0Ci0gKiBzaGlmdCB0aGUgdmFsdWUgbGVmdCBieSA4LCB0aGVuIGluc2VydCB0aGUgdmFsdWUuCi0gKiBBU0lEWzBdIGFsd2F5cyBjb250YWlucyB0aGUga2VybmVsJ3MgYXNpZCB2YWx1ZSwgYW5kIHdlIHJlc2VydmUgdGhyZWUKLSAqIG90aGVyIGFzaWQgdmFsdWVzIHRoYXQgd2UgbmV2ZXIgYXNzaWduIHRvIHVzZXIgdGFza3MuCi0gKi8KLQotI2RlZmluZSBBU0lEX0lOQwkweDEKLSNkZWZpbmUgQVNJRF9NQVNLCSgoMSA8PCBYQ0hBTF9NTVVfQVNJRF9CSVRTKSAtIDEpCi0KLS8qCi0gKiBYQ0hBTF9NTVVfQVNJRF9JTlZBTElEIGlzIGEgY29uZmlndXJhYmxlIFh0ZW5zYSBwcm9jZXNzb3IgY29uc3RhbnQKLSAqIGluZGljYXRpbmcgaW52YWxpZCBhZGRyZXNzIHNwYWNlLiAgWENIQUxfTU1VX0FTSURfS0VSTkVMIGlzIGEgY29uZmlndXJhYmxlCi0gKiBYdGVuc2EgcHJvY2Vzc29yIGNvbnN0YW50IGluZGljYXRpbmcgdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLiAgVGhleSBjYW4KLSAqIGJlIGFyYml0cmFyeSB2YWx1ZXMuCi0gKgotICogV2UgaWRlbnRpZnkgdGhyZWUgbW9yZSB1bmlxdWUsIHJlc2VydmVkIEFTSUQgdmFsdWVzIHRvIHVzZSBpbiB0aGUgdW51c2VkCi0gKiByaW5nIHBvc2l0aW9ucy4gIE5vIG90aGVyIHVzZXIgcHJvY2VzcyB3aWxsIGJlIGFzc2lnbmVkIHRoZXNlIHJlc2VydmVkCi0gKiBBU0lEIHZhbHVlcy4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhhdAotICoKLSAqCVhDSEFMX01NVV9BU0lEX0lOVkFMSUQgPT0gMAotICoJWENIQUxfTU1VX0FTSURfS0VSTkVMICA9PSAxCi0gKgotICogdGhlIGZvbGxvd2luZyBtYXplIG9mICNpZiBzdGF0ZW1lbnRzIHdvdWxkIGdlbmVyYXRlCi0gKgotICoJQVNJRF9SRVNFUlZFRF8xICAgICAgICA9PSAyCi0gKglBU0lEX1JFU0VSVkVEXzIgICAgICAgID09IDMKLSAqCUFTSURfUkVTRVJWRURfMyAgICAgICAgPT0gNAotICoJQVNJRF9GSVJTVF9OT05SRVNFUlZFRCA9PSA1Ci0gKi8KLQotI2lmIChYQ0hBTF9NTVVfQVNJRF9JTlZBTElEICE9IFhDSEFMX01NVV9BU0lEX0tFUk5FTCArIDEpCi0jIGRlZmluZSBBU0lEX1JFU0VSVkVEXzEgICAgICAgICAoKFhDSEFMX01NVV9BU0lEX0tFUk5FTCArIDEpICYgQVNJRF9NQVNLKQotI2Vsc2UKLSMgZGVmaW5lIEFTSURfUkVTRVJWRURfMSAgICAgICAgICgoWENIQUxfTU1VX0FTSURfS0VSTkVMICsgMikgJiBBU0lEX01BU0spCi0jZW5kaWYKLQotI2lmIChYQ0hBTF9NTVVfQVNJRF9JTlZBTElEICE9IEFTSURfUkVTRVJWRURfMSArIDEpCi0jIGRlZmluZSBBU0lEX1JFU0VSVkVEXzIgICAgICAgICAoKEFTSURfUkVTRVJWRURfMSArIDEpICYgQVNJRF9NQVNLKQotI2Vsc2UKLSMgZGVmaW5lIEFTSURfUkVTRVJWRURfMiAgICAgICAgICgoQVNJRF9SRVNFUlZFRF8xICsgMikgJiBBU0lEX01BU0spCi0jZW5kaWYKLQotI2lmIChYQ0hBTF9NTVVfQVNJRF9JTlZBTElEICE9IEFTSURfUkVTRVJWRURfMiArIDEpCi0jIGRlZmluZSBBU0lEX1JFU0VSVkVEXzMgICAgICAgICAoKEFTSURfUkVTRVJWRURfMiArIDEpICYgQVNJRF9NQVNLKQotI2Vsc2UKLSMgZGVmaW5lIEFTSURfUkVTRVJWRURfMyAgICAgICAgICgoQVNJRF9SRVNFUlZFRF8yICsgMikgJiBBU0lEX01BU0spCi0jZW5kaWYKLQotI2lmIChYQ0hBTF9NTVVfQVNJRF9JTlZBTElEICE9IEFTSURfUkVTRVJWRURfMyArIDEpCi0jIGRlZmluZSBBU0lEX0ZJUlNUX05PTlJFU0VSVkVEICAoKEFTSURfUkVTRVJWRURfMyArIDEpICYgQVNJRF9NQVNLKQotI2Vsc2UKLSMgZGVmaW5lIEFTSURfRklSU1RfTk9OUkVTRVJWRUQgICgoQVNJRF9SRVNFUlZFRF8zICsgMikgJiBBU0lEX01BU0spCi0jZW5kaWYKLQotI2RlZmluZSBBU0lEX0FMTF9SRVNFUlZFRCAoICgoQVNJRF9SRVNFUlZFRF8xKSA8PCAyNCkgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBU0lEX1JFU0VSVkVEXzIpIDw8IDE2KSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFTSURfUkVTRVJWRURfMykgPDwgIDgpICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoWENIQUxfTU1VX0FTSURfS0VSTkVMKSkgICApCi0KIAogLyoKICAqIE5PX0NPTlRFWFQgaXMgdGhlIGludmFsaWQgQVNJRCB2YWx1ZSB0aGF0IHdlIGRvbid0IGV2ZXIgYXNzaWduIHRvCi0gKiBhbnkgdXNlciBvciBrZXJuZWwgY29udGV4dC4gIE5PX0NPTlRFWFQgaXMgYSBiZXR0ZXIgbW5lbW9uaWMgdGhhbgotICogWENIQUxfTU1VX0FTSURfSU5WQUxJRCwgc28gd2UgdXNlIGl0IGluIGNvZGUgaW5zdGVhZC4KKyAqIGFueSB1c2VyIG9yIGtlcm5lbCBjb250ZXh0LgorICoKKyAqIDAgaW52YWxpZAorICogMSBrZXJuZWwKKyAqIDIgcmVzZXJ2ZWQKKyAqIDMgcmVzZXJ2ZWQKKyAqIDQuLi4yNTUgYXZhaWxhYmxlCiAgKi8KIAotI2RlZmluZSBOT19DT05URVhUICAgWENIQUxfTU1VX0FTSURfSU5WQUxJRAotCi0jaWYgKEtFUk5FTF9SSU5HICE9IDApCi0jIGVycm9yIFRoZSBLRVJORUxfUklORyByZWFsbHkgc2hvdWxkIGJlIHplcm8uCi0jZW5kaWYKLQotI2lmIChVU0VSX1JJTkcgPj0gWENIQUxfTU1VX1JJTkdTKQotIyBlcnJvciBVU0VSX1JJTkcgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgaGlnaGVzdCBudW1iZXJlZCByaW5nLgotI2VuZGlmCi0KLSNpZiAoVVNFUl9SSU5HID09IEtFUk5FTF9SSU5HKQotIyBlcnJvciBUaGUgdXNlciBhbmQga2VybmVsIHJpbmdzIHJlYWxseSBzaG91bGQgbm90IGJlIGVxdWFsLgotI2VuZGlmCi0KLSNpZiAoVVNFUl9SSU5HID09IDEpCi0jZGVmaW5lIEFTSURfSU5TRVJUKHgpICggKChBU0lEX1JFU0VSVkVEXzEpICAgPDwgMjQpICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICgoQVNJRF9SRVNFUlZFRF8yKSAgIDw8IDE2KSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIChBU0lEX01BU0spKSA8PCAgOCkgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKChYQ0hBTF9NTVVfQVNJRF9LRVJORUwpKSAgICkKLQotI2VsaWYgKFVTRVJfUklORyA9PSAyKQotI2RlZmluZSBBU0lEX0lOU0VSVCh4KSAoICgoQVNJRF9SRVNFUlZFRF8xKSAgIDw8IDI0KSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIChBU0lEX01BU0spKSA8PCAxNikgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKChBU0lEX1JFU0VSVkVEXzIpICAgPDwgIDgpICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICgoWENIQUxfTU1VX0FTSURfS0VSTkVMKSkgICApCi0KLSNlbGlmIChVU0VSX1JJTkcgPT0gMykKLSNkZWZpbmUgQVNJRF9JTlNFUlQoeCkgKCAoKCh4KSAmIChBU0lEX01BU0spKSA8PCAyNCkgKyBcCi0JCQkgKChBU0lEX1JFU0VSVkVEXzEpICAgPDwgMTYpICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICgoQVNJRF9SRVNFUlZFRF8yKSAgIDw8ICA4KSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKFhDSEFMX01NVV9BU0lEX0tFUk5FTCkpICAgKQotCi0jZWxzZQotI2Vycm9yIEdvb2Z5IHZhbHVlIGZvciBVU0VSX1JJTkcKLQotI2VuZGlmIC8qIFVTRVJfUklORyA9PSAxICovCi0KLQotLyoKLSAqICBBbGwgdW51c2VkIGJ5IGhhcmR3YXJlIHVwcGVyIGJpdHMgd2lsbCBiZSBjb25zaWRlcmVkCi0gKiAgYXMgYSBzb2Z0d2FyZSBhc2lkIGV4dGVuc2lvbi4KLSAqLwotCi0jZGVmaW5lIEFTSURfVkVSU0lPTl9NQVNLICAoKHVuc2lnbmVkIGxvbmcpfihBU0lEX01BU0t8KEFTSURfTUFTSy0xKSkpCi0jZGVmaW5lIEFTSURfRklSU1RfVkVSU0lPTgkJCQkJCVwKLQkoKHVuc2lnbmVkIGxvbmcpKH5BU0lEX1ZFUlNJT05fTUFTSykgKyAxICsgQVNJRF9GSVJTVF9OT05SRVNFUlZFRCkKKyNkZWZpbmUgTk9fQ09OVEVYVAkwCisjZGVmaW5lIEFTSURfVVNFUl9GSVJTVAk0CisjZGVmaW5lIEFTSURfTUFTSwkoKDEgPDwgWENIQUxfTU1VX0FTSURfQklUUykgLSAxKQorI2RlZmluZSBBU0lEX0lOU0VSVCh4KQkoMHgwMzAyMDAwMSB8ICgoKHgpICYgQVNJRF9NQVNLKSA8PCA4KSkKIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9yYXNpZF9yZWdpc3RlciAodW5zaWduZWQgbG9uZyB2YWwpCiB7CkBAIC0yMDcsNjcgKzUyLDI4IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3Jhc2lkX3JlZ2lzdGVyICh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdG1wOwotCV9fYXNtX18gX192b2xhdGlsZV9fICgiIHJzciAlMCwgIl9fc3RyaW5naWZ5KFJBU0lEKSJcblx0IiA6ICI9YSIgKHRtcCkpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgiIHJzciAlMCwiX19zdHJpbmdpZnkoUkFTSUQpIlxuXHQiIDogIj1hIiAodG1wKSk7CiAJcmV0dXJuIHRtcDsKIH0KIAotCi0jaWYgKChYQ0hBTF9NTVVfQVNJRF9JTlZBTElEID09IDApICYmIChYQ0hBTF9NTVVfQVNJRF9LRVJORUwgPT0gMSkpCi0KIHN0YXRpYyBpbmxpbmUgdm9pZAotZ2V0X25ld19tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhc2lkKQorX19nZXRfbmV3X21tdV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCWV4dGVybiB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCk7Ci0JaWYgKCEgKChhc2lkICs9IEFTSURfSU5DKSAmIEFTSURfTUFTSykgKSB7CisJaWYgKCEgKCsrYXNpZF9jYWNoZSAmIEFTSURfTUFTSykgKSB7CiAJCWZsdXNoX3RsYl9hbGwoKTsgLyogc3RhcnQgbmV3IGFzaWQgY3ljbGUgKi8KLQkJaWYgKCFhc2lkKSAgICAgIC8qIGZpeCB2ZXJzaW9uIGlmIG5lZWRlZCAqLwotCQkJYXNpZCA9IEFTSURfRklSU1RfVkVSU0lPTiAtIEFTSURfRklSU1RfTk9OUkVTRVJWRUQ7Ci0JCWFzaWQgKz0gQVNJRF9GSVJTVF9OT05SRVNFUlZFRDsKKwkJYXNpZF9jYWNoZSArPSBBU0lEX1VTRVJfRklSU1Q7CiAJfQotCW1tLT5jb250ZXh0ID0gYXNpZF9jYWNoZSA9IGFzaWQ7Ci19Ci0KLSNlbHNlCi0jd2FybmluZyBBU0lEX3tJTlZBTElELEtFUk5FTH0gdmFsdWVzIGltcG9zZSBub24tb3B0aW1hbCBnZXRfbmV3X21tdV9jb250ZXh0IGltcGxlbWVudGF0aW9uCi0KLS8qIFhDSEFMX01NVV9BU0lEX0lOVkFMSUQgPT0gMCBhbmQgWENIQUxfTU1VX0FTSURfS0VSTkVMID09MSBhcmUKLSAgIHJlYWxseSB0aGUgYmVzdCwgYnV0IGlmIHlvdSBpbnNpc3QuLi4gKi8KLQotc3RhdGljIGlubGluZSBpbnQgdmFsaWRhdGVfYXNpZCAodW5zaWduZWQgbG9uZyBhc2lkKQotewotCXN3aXRjaCAoYXNpZCkgewotCWNhc2UgWENIQUxfTU1VX0FTSURfSU5WQUxJRDoKLQljYXNlIFhDSEFMX01NVV9BU0lEX0tFUk5FTDoKLQljYXNlIEFTSURfUkVTRVJWRURfMToKLQljYXNlIEFTSURfUkVTRVJWRURfMjoKLQljYXNlIEFTSURfUkVTRVJWRURfMzoKLQkJcmV0dXJuIDA7IC8qIGNhbid0IHVzZSB0aGVzZSB2YWx1ZXMgYXMgQVNJRHMgKi8KLQl9Ci0JcmV0dXJuIDE7IC8qIHZhbGlkICovCisJbW0tPmNvbnRleHQgPSBhc2lkX2NhY2hlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLWdldF9uZXdfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYXNpZCkKK19fbG9hZF9tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlleHRlcm4gdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpOwotCXdoaWxlICgxKSB7Ci0JCWFzaWQgKz0gQVNJRF9JTkM7Ci0JCWlmICggISAoYXNpZCAmIEFTSURfTUFTSykgKSB7Ci0JCQlmbHVzaF90bGJfYWxsKCk7IC8qIHN0YXJ0IG5ldyBhc2lkIGN5Y2xlICovCi0JCQlpZiAoIWFzaWQpICAgICAgLyogZml4IHZlcnNpb24gaWYgbmVlZGVkICovCi0JCQkJYXNpZCA9IEFTSURfRklSU1RfVkVSU0lPTiAtIEFTSURfRklSU1RfTk9OUkVTRVJWRUQ7Ci0JCQlhc2lkICs9IEFTSURfRklSU1RfTk9OUkVTRVJWRUQ7Ci0JCQlicmVhazsgLyogbm8gbmVlZCB0byB2YWxpZGF0ZSBoZXJlICovCi0JCX0KLQkJaWYgKHZhbGlkYXRlX2FzaWQgKGFzaWQgJiBBU0lEX01BU0spKQotCQkJYnJlYWs7Ci0JfQotCW1tLT5jb250ZXh0ID0gYXNpZF9jYWNoZSA9IGFzaWQ7CisJc2V0X3Jhc2lkX3JlZ2lzdGVyKEFTSURfSU5TRVJUKG1tLT5jb250ZXh0KSk7CisJaW52YWxpZGF0ZV9wYWdlX2RpcmVjdG9yeSgpOwogfQogCi0jZW5kaWYKLQotCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCByZWxhdGVkIGluZm8gZm9yIGEgbmV3IG1tX3N0cnVjdAogICogaW5zdGFuY2UuCkBAIC0yODAsNiArODYsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIEFmdGVyIHdlIGhhdmUgc2V0IGN1cnJlbnQtPm1tIHRvIGEgbmV3IHZhbHVlLCB0aGlzIGFjdGl2YXRlcworICogdGhlIGNvbnRleHQgZm9yIHRoZSBuZXcgbW0gc28gd2Ugc2VlIHRoZSBuZXcgbWFwcGluZ3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCkKK3sKKwkvKiBVbmNvbmRpdGlvbmFsbHkgZ2V0IGEgbmV3IEFTSUQuICAqLworCisJX19nZXRfbmV3X21tdV9jb250ZXh0KG5leHQpOworCV9fbG9hZF9tbXVfY29udGV4dChuZXh0KTsKK30KKworCiBzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewpAQCAtMjg3LDExICsxMDcsMTAgQEAKIAogCS8qIENoZWNrIGlmIG91ciBBU0lEIGlzIG9mIGFuIG9sZGVyIHZlcnNpb24gYW5kIHRodXMgaW52YWxpZCAqLwogCi0JaWYgKChuZXh0LT5jb250ZXh0IF4gYXNpZCkgJiBBU0lEX1ZFUlNJT05fTUFTSykKLQkJZ2V0X25ld19tbXVfY29udGV4dChuZXh0LCBhc2lkKTsKKwlpZiAobmV4dC0+Y29udGV4dCA9PSBOT19DT05URVhUIHx8ICgobmV4dC0+Y29udGV4dF5hc2lkKSAmIH5BU0lEX01BU0spKQorCQlfX2dldF9uZXdfbW11X2NvbnRleHQobmV4dCk7CiAKLQlzZXRfcmFzaWRfcmVnaXN0ZXIgKEFTSURfSU5TRVJUKG5leHQtPmNvbnRleHQpKTsKLQlpbnZhbGlkYXRlX3BhZ2VfZGlyZWN0b3J5KCk7CisJX19sb2FkX21tdV9jb250ZXh0KG5leHQpOwogfQogCiAjZGVmaW5lIGRlYWN0aXZhdGVfbW0odHNrLCBtbSkJZG8geyB9IHdoaWxlKDApCkBAIC0zMDIsMjAgKzEyMSw2IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JLyogTm90aGluZyB0byBkby4gKi8KLX0KLQotLyoKLSAqIEFmdGVyIHdlIGhhdmUgc2V0IGN1cnJlbnQtPm1tIHRvIGEgbmV3IHZhbHVlLCB0aGlzIGFjdGl2YXRlcwotICogdGhlIGNvbnRleHQgZm9yIHRoZSBuZXcgbW0gc28gd2Ugc2VlIHRoZSBuZXcgbWFwcGluZ3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCkKLXsKLQkvKiBVbmNvbmRpdGlvbmFsbHkgZ2V0IGEgbmV3IEFTSUQuICAqLwotCi0JZ2V0X25ld19tbXVfY29udGV4dChuZXh0LCBhc2lkX2NhY2hlKTsKLQlzZXRfcmFzaWRfcmVnaXN0ZXIgKEFTSURfSU5TRVJUKG5leHQtPmNvbnRleHQpKTsKIAlpbnZhbGlkYXRlX3BhZ2VfZGlyZWN0b3J5KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oCmluZGV4IDQwZjRjNmMuLmM2MzFkMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaApAQCAtMTUsMTggKzE1LDI0IEBACiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKKyNkZWZpbmUgWENIQUxfS1NFR19DQUNIRURfVkFERFIgMHhkMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUiAweGQ4MDAwMDAwCisjZGVmaW5lIFhDSEFMX0tTRUdfUEFERFIgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfS1NFR19TSVpFICAgICAgICAgMHgwODAwMDAwMAorCiAvKgogICogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUKICAqIFBBR0VfQUxJR04oeCkgYWxpZ25zIHRoZSBwb2ludGVyIHRvIHRoZSAobmV4dCkgcGFnZSBib3VuZGFyeQogICovCiAKLSNkZWZpbmUgUEFHRV9TSElGVAkJWENIQUxfTU1VX01JTl9QVEVfUEFHRV9TSVpFCisjZGVmaW5lIFBBR0VfU0hJRlQJCTEyCiAjZGVmaW5lIFBBR0VfU0laRQkJKDEgPDwgUEFHRV9TSElGVCkKICNkZWZpbmUgUEFHRV9NQVNLCQkofihQQUdFX1NJWkUtMSkpCiAjZGVmaW5lIFBBR0VfQUxJR04oYWRkcikJKCgoYWRkcikrUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0spCiAKLSNkZWZpbmUgRENBQ0hFX1dBWV9TSVpFCQkoWENIQUxfRENBQ0hFX1NJWkUgLyBYQ0hBTF9EQ0FDSEVfV0FZUykKICNkZWZpbmUgUEFHRV9PRkZTRVQJCVhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCisjZGVmaW5lIE1BWF9NRU1fUEZOICAgICAgICAgICAgIFhDSEFMX0tTRUdfU0laRQorI2RlZmluZSBQR1RBQkxFX1NUQVJUICAgICAgICAgICAweDgwMDAwMDAwCiAKICNpZmRlZiBfX0FTU0VNQkxZX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BhcmFtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaAppbmRleCBjMGVlYzgyLi42ZjI4MTM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaApAQCAtMTEsNyArMTEsNyBAQAogI2lmbmRlZiBfWFRFTlNBX1BBUkFNX0gKICNkZWZpbmUgX1hURU5TQV9QQVJBTV9ICiAKLSNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjIGRlZmluZSBIWgkJMTAwCQkvKiBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCmluZGV4IGI0MzE4OTMuLjJkNGI1ZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaApAQCAtMTQsNDUgKzE0LDYgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLW5vcG1kLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAotLyogQXNzZXJ0aW9ucy4gKi8KLQotI2lmZGVmIENPTkZJR19NTVUKLQotCi0jaWYgKFhDSEFMX01NVV9SSU5HUyA8IDIpCi0jIGVycm9yIExpbnV4IGJ1aWxkIGFzc3VtZXMgYXQgbGVhc3QgMiByaW5nIGxldmVscy4KLSNlbmRpZgotCi0jaWYgKFhDSEFMX01NVV9DQV9CSVRTICE9IDQpCi0jIGVycm9yIFdlIGFzc3VtZSBleGFjdGx5IGZvdXIgYml0cyBmb3IgQ0EuCi0jZW5kaWYKLQotI2lmIChYQ0hBTF9NTVVfU1JfQklUUyAhPSAwKQotIyBlcnJvciBXZSBoYXZlIG5vIHJvb20gZm9yIFNSIGJpdHMuCi0jZW5kaWYKLQotLyoKLSAqIFVzZSB0aGUgZmlyc3QgbWluLXdpcmVkIHdheSBmb3IgbWFwcGluZyBwYWdlLXRhYmxlIHBhZ2VzLgotICogUGFnZSBjb2xvcmluZyByZXF1aXJlcyBhIHNlY29uZCBtaW4td2lyZWQgd2F5LgotICovCi0KLSNpZiAoWENIQUxfRFRMQl9NSU5XSVJFRF9TRVRTID09IDApCi0jIGVycm9yIE5lZWQgYSBtaW4td2lyZWQgd2F5IGZvciBtYXBwaW5nIHBhZ2UtdGFibGUgcGFnZXMKLSNlbmRpZgotCi0jZGVmaW5lIERUTEJfV0FZX1BHVEFCTEUgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9NSU5XSVJFRF9TRVQwLCBXQVkpCi0KLSNpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKSAmJiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCi0jIGlmIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfTUlOV0lSRURfU0VUMCwgV0FZUykgPj0gMgotIyAgZGVmaW5lIERUTEJfV0FZX0RDQUNIRV9BTElBUzAgKERUTEJfV0FZX1BHVEFCTEUgKyAxKQotIyAgZGVmaW5lIERUTEJfV0FZX0RDQUNIRV9BTElBUzEgKERUTEJfV0FZX1BHVEFCTEUgKyAyKQotIyBlbHNlCi0jICBlcnJvciBQYWdlIGNvbG9yaW5nIHJlcXVpcmVzIGl0cyBvd24gd2lyZWQgZHRsYiB3YXkhCi0jIGVuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KLQogLyoKICAqIFdlIG9ubHkgdXNlIHR3byByaW5nIGxldmVscywgdXNlciBhbmQga2VybmVsIHNwYWNlLgogICovCkBAIC05Nyw3ICs1OCw3IEBACiAjZGVmaW5lIFBHRF9PUkRFUgkJMAogI2RlZmluZSBQTURfT1JERVIJCTAKICNkZWZpbmUgVVNFUl9QVFJTX1BFUl9QR0QJKFRBU0tfU0laRS9QR0RJUl9TSVpFKQotI2RlZmluZSBGSVJTVF9VU0VSX0FERFJFU1MgICAgICBYQ0hBTF9TRUdfTUFQUEFCTEVfVkFERFIKKyNkZWZpbmUgRklSU1RfVVNFUl9BRERSRVNTICAgICAgMAogI2RlZmluZSBGSVJTVF9VU0VSX1BHRF9OUgkoRklSU1RfVVNFUl9BRERSRVNTID4+IFBHRElSX1NISUZUKQogCiAvKiB2aXJ0dWFsIG1lbW9yeSBhcmVhLiBXZSBrZWVwIGEgZGlzdGFuY2UgdG8gb3RoZXIgbWVtb3J5IHJlZ2lvbnMgdG8gYmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3MvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3MvaGFyZHdhcmUuaAppbmRleCAyMjI0MGYwLi42OTMwYzEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0taXNzL2hhcmR3YXJlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLWlzcy9oYXJkd2FyZS5oCkBAIC0xMiwxOCArMTIsMTggQEAKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIElTUy4KICAqLwogCi0jaWZuZGVmIF9fQVNNX1hURU5TQV9JU1NfSEFSRFdBUkUKLSNkZWZpbmUgX19BU01fWFRFTlNBX0lTU19IQVJEV0FSRQorI2lmbmRlZiBfWFRFTlNBX1BMQVRGT1JNX0lTU19IQVJEV0FSRV9ICisjZGVmaW5lIF9YVEVOU0FfUExBVEZPUk1fSVNTX0hBUkRXQVJFX0gKIAogLyoKICAqIE1lbW9yeSBjb25maWd1cmF0aW9uLgogICovCiAKLSNkZWZpbmUgUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQgWFNIQUxfUkFNX1BBRERSCi0jZGVmaW5lIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NJWkUgWFNIQUxfUkFNX1ZTSVpFCisjZGVmaW5lIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUCTB4MDAwMDAwMDAKKyNkZWZpbmUgUExBVEZPUk1fREVGQVVMVF9NRU1fU0laRQkweDA4MDAwMDAwCiAKIC8qCiAgKiBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbi4KICAqLwogCi0jZW5kaWYgLyogX19BU01fWFRFTlNBX0lTU19IQVJEV0FSRSAqLworI2VuZGlmIC8qIF9YVEVOU0FfUExBVEZPUk1fSVNTX0hBUkRXQVJFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3Mvc2ltY2FsbC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLWlzcy9zaW1jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjYjU3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3Mvc2ltY2FsbC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0taXNzL2hhcmR3YXJlLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUExBVEZPUk1fSVNTX1NJTUNBTExfSAorI2RlZmluZSBfWFRFTlNBX1BMQVRGT1JNX0lTU19TSU1DQUxMX0gKKworCisvKgorICogIFN5c3RlbSBjYWxsIGxpa2Ugc2VydmljZXMgb2ZmZXJlZCBieSB0aGUgc2ltdWxhdG9yIGhvc3QuCisgKi8KKworI2RlZmluZSBTWVNfbm9wCQkwCS8qIHVudXNlZCAqLworI2RlZmluZSBTWVNfZXhpdAkxCS8qeCovCisjZGVmaW5lIFNZU19mb3JrCTIKKyNkZWZpbmUgU1lTX3JlYWQJMwkvKngqLworI2RlZmluZSBTWVNfd3JpdGUJNAkvKngqLworI2RlZmluZSBTWVNfb3Blbgk1CS8qeCovCisjZGVmaW5lIFNZU19jbG9zZQk2CS8qeCovCisjZGVmaW5lIFNZU19yZW5hbWUJNwkvKnggMzggLSB3YWl0cGlkICovCisjZGVmaW5lIFNZU19jcmVhdAk4CS8qeCovCisjZGVmaW5lIFNZU19saW5rCTkJLyp4IChub3QgaW1wbGVtZW50ZWQgb24gV0lOMzIpICovCisjZGVmaW5lIFNZU191bmxpbmsJMTAJLyp4Ki8KKyNkZWZpbmUgU1lTX2V4ZWN2CTExCS8qIG4vYSAtIGV4ZWN2ZSAqLworI2RlZmluZSBTWVNfZXhlY3ZlCTEyCS8qIDExIC0gY2hkaXIgKi8KKyNkZWZpbmUgU1lTX3BpcGUJMTMJLyogNDIgLSB0aW1lICovCisjZGVmaW5lIFNZU19zdGF0CTE0CS8qIDEwNiAtIG1rbm9kICovCisjZGVmaW5lIFNZU19jaG1vZAkxNQorI2RlZmluZSBTWVNfY2hvd24JMTYJLyogMjAyIC0gbGNob3duICovCisjZGVmaW5lIFNZU191dGltZQkxNwkvKiAzMCAtIGJyZWFrICovCisjZGVmaW5lIFNZU193YWl0CTE4CS8qIG4vYSAtIG9sZHN0YXQgKi8KKyNkZWZpbmUgU1lTX2xzZWVrCTE5CS8qeCovCisjZGVmaW5lIFNZU19nZXRwaWQJMjAKKyNkZWZpbmUgU1lTX2lzYXR0eQkyMQkvKiBuL2EgLSBtb3VudCAqLworI2RlZmluZSBTWVNfZnN0YXQJMjIJLyogMTA4IC0gb2xkdW1vdW50ICovCisjZGVmaW5lIFNZU190aW1lCTIzCS8qIDEzIC0gc2V0dWlkICovCisjZGVmaW5lIFNZU19nZXR0aW1lb2ZkYXkgMjQJLyp4IDc4IC0gZ2V0dWlkIChub3QgaW1wbGVtZW50ZWQgb24gV0lOMzIpICovCisjZGVmaW5lIFNZU190aW1lcwkyNQkvKlggNDMgLSBzdGltZSAoWHRlbnNhLXNwZWNpZmljIGltcGxlbWVudGF0aW9uKSAqLworI2RlZmluZSBTWVNfc29ja2V0ICAgICAgMjYKKyNkZWZpbmUgU1lTX3NlbmR0byAgICAgIDI3CisjZGVmaW5lIFNZU19yZWN2ZnJvbSAgICAyOAorI2RlZmluZSBTWVNfc2VsZWN0X29uZSAgMjkgICAgICAvKiBub3QgY29tcGl0aWJsZSBzZWxlY3QsIG9uZSBmaWxlIGRlc2NyaXB0b3IgYXQgdGhlIHRpbWUgKi8KKyNkZWZpbmUgU1lTX2JpbmQgICAgICAgIDMwCisjZGVmaW5lIFNZU19pb2N0bAkzMQorCisvKgorICogU1lTX3NlbGVjdF9vbmUgc3BlY2lmaWVycworICovCisKKyNkZWZpbmUgIFhUSVNTX1NFTEVDVF9PTkVfUkVBRCAgICAxCisjZGVmaW5lICBYVElTU19TRUxFQ1RfT05FX1dSSVRFICAgMgorI2RlZmluZSAgWFRJU1NfU0VMRUNUX09ORV9FWENFUFQgIDMKKworCisjZW5kaWYgLyogX1hURU5TQV9QTEFURk9STV9JU1NfU0lNQ0FMTF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wb3NpeF90eXBlcy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3Bvc2l4X3R5cGVzLmgKaW5kZXggMmM4MTZiMC4uMzQ3MGI0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3Bvc2l4X3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3Bvc2l4X3R5cGVzLmgKQEAgLTIxLDcgKzIxLDcgQEAKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX2lub190OwogdHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfbW9kZV90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX25saW5rX3Q7CiB0eXBlZGVmIGxvbmcJCV9fa2VybmVsX29mZl90OwogdHlwZWRlZiBpbnQJCV9fa2VybmVsX3BpZF90OwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9pcGNfcGlkX3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcHJvY2Vzc29yLmgKaW5kZXggOGI5NmU3Ny4uNGZlYjlmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaApAQCAtMTEsMjQgKzExLDE4IEBACiAjaWZuZGVmIF9YVEVOU0FfUFJPQ0VTU09SX0gKICNkZWZpbmUgX1hURU5TQV9QUk9DRVNTT1JfSAogCi0jaWZkZWYgX19BU1NFTUJMWV9fCi0jZGVmaW5lIF9BU01MQU5HVUFHRQotI2VuZGlmCi0KLSNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4KLSNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL3NwZWNyZWcuaD4KLSNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL3RpZS5oPgotI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPGFzbS9jb3Byb2Nlc3Nvci5oPgogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2NvcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3JlZ3MuaD4KIAogLyogQXNzZXJ0aW9ucy4gKi8KIAogI2lmIChYQ0hBTF9IQVZFX1dJTkRPV0VEICE9IDEpCi0jZXJyb3IgTGludXggcmVxdWlyZXMgdGhlIFh0ZW5zYSBXaW5kb3dlZCBSZWdpc3RlcnMgT3B0aW9uLgorIyBlcnJvciBMaW51eCByZXF1aXJlcyB0aGUgWHRlbnNhIFdpbmRvd2VkIFJlZ2lzdGVycyBPcHRpb24uCiAjZW5kaWYKIAogLyoKQEAgLTE0NSwxMSArMTM5LDExIEBACiAgKiBOb3RlOiBXZSBzZXQtdXAgcHMgYXMgaWYgd2UgZGlkIGEgY2FsbDQgdG8gdGhlIG5ldyBwYy4KICAqICAgICAgIHNldF90aHJlYWRfc3RhdGUgaW4gc2lnbmFsLmMgZGVwZW5kcyBvbiBpdC4KICAqLwotI2RlZmluZSBVU0VSX1BTX1ZBTFVFICggKDEgPDwgWENIQUxfUFNfV09FX1NISUZUKSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFhDSEFMX1BTX0NBTExJTkNfU0hJRlQpICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgKFVTRVJfUklORyA8PCBYQ0hBTF9QU19SSU5HX1NISUZUKSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFhDSEFMX1BTX1BST0dTVEFDS19TSElGVCkgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBYQ0hBTF9QU19FWENNX1NISUZUKSApCisjZGVmaW5lIFVTRVJfUFNfVkFMVUUgKCgxIDw8IFBTX1dPRV9CSVQpIHwJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBQU19DQUxMSU5DX1NISUZUKSB8CQkJXAorICAgICAgICAgICAgICAgICAgICAgICAoVVNFUl9SSU5HIDw8IFBTX1JJTkdfU0hJRlQpIHwJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFBTX1VNX0JJVCkgfAkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFBTX0VYQ01fQklUKSkKIAogLyogQ2xlYXJpbmcgYTAgdGVybWluYXRlcyB0aGUgYmFja3RyYWNlLiAqLwogI2RlZmluZSBzdGFydF90aHJlYWQocmVncywgbmV3X3BjLCBuZXdfc3ApIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAppbmRleCBhNWFjNzFhLi4xYjdmZTM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3B0cmFjZS5oCkBAIC0xMSw3ICsxMSw3IEBACiAjaWZuZGVmIF9YVEVOU0FfUFRSQUNFX0gKICNkZWZpbmUgX1hURU5TQV9QVFJBQ0VfSAogCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgogCiAvKgogICogS2VybmVsIHN0YWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcmVncy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTEzZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3JlZ3MuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBUZW5zaWxpY2EsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9SRUdTX0gKKyNkZWZpbmUgX1hURU5TQV9SRUdTX0gKKworLyogIFNwZWNpYWwgcmVnaXN0ZXJzLiAgKi8KKworI2RlZmluZSBMQkVHCQkwCisjZGVmaW5lIExFTkQJCTEKKyNkZWZpbmUgTENPVU5UCQkyCisjZGVmaW5lIFNBUgkJMworI2RlZmluZSBCUgkJNAorI2RlZmluZSBTQ09NUEFSRTEJMTIKKyNkZWZpbmUgQUNDSEkJCTE2CisjZGVmaW5lIEFDQ0xPCQkxNworI2RlZmluZSBNUgkJMzIKKyNkZWZpbmUgV0lORE9XQkFTRQk3MgorI2RlZmluZSBXSU5ET1dTVEFSVAk3MworI2RlZmluZSBQVEVWQUREUgk4MworI2RlZmluZSBSQVNJRAkJOTAKKyNkZWZpbmUgSVRMQkNGRwkJOTEKKyNkZWZpbmUgRFRMQkNGRwkJOTIKKyNkZWZpbmUgSUJSRUFLRU5BQkxFCTk2CisjZGVmaW5lIEREUgkJMTA0CisjZGVmaW5lIElCUkVBS0EJCTEyOAorI2RlZmluZSBEQlJFQUtBCQkxNDQKKyNkZWZpbmUgREJSRUFLQwkJMTYwCisjZGVmaW5lIEVQQwkJMTc2CisjZGVmaW5lIEVQQ18xCQkxNzcKKyNkZWZpbmUgREVQQwkJMTkyCisjZGVmaW5lIEVQUwkJMTkyCisjZGVmaW5lIEVQU18xCQkxOTMKKyNkZWZpbmUgRVhDU0FWRQkJMjA4CisjZGVmaW5lIEVYQ1NBVkVfMQkyMDkKKyNkZWZpbmUgSU5URVJSVVBUCTIyNgorI2RlZmluZSBJTlRFTkFCTEUJMjI4CisjZGVmaW5lIFBTCQkyMzAKKyNkZWZpbmUgVEhSRUFEUFRSCTIzMQorI2RlZmluZSBFWENDQVVTRQkyMzIKKyNkZWZpbmUgREVCVUdDQVVTRQkyMzMKKyNkZWZpbmUgQ0NPVU5UCQkyMzQKKyNkZWZpbmUgUFJJRAkJMjM1CisjZGVmaW5lIElDT1VOVAkJMjM2CisjZGVmaW5lIElDT1VOVExFVkVMCTIzNworI2RlZmluZSBFWENWQUREUgkyMzgKKyNkZWZpbmUgQ0NPTVBBUkUJMjQwCisjZGVmaW5lIE1JU0MJCTI0NAorCisvKiAgU3BlY2lhbCBuYW1lcyBmb3IgcmVhZC1vbmx5IGFuZCB3cml0ZS1vbmx5IGludGVycnVwdCByZWdpc3RlcnMuICAqLworCisjZGVmaW5lIElOVFJFQUQJCTIyNgorI2RlZmluZSBJTlRTRVQJCTIyNgorI2RlZmluZSBJTlRDTEVBUgkyMjcKKworLyogIEVYQ0NBVVNFIHJlZ2lzdGVyIGZpZWxkcyAgKi8KKworI2RlZmluZSBFWENDQVVTRV9FWENDQVVTRV9TSElGVAkwCisjZGVmaW5lIEVYQ0NBVVNFX0VYQ0NBVVNFX01BU0sJMHgzRgorCisjZGVmaW5lIEVYQ0NBVVNFX0lMTEVHQUxfSU5TVFJVQ1RJT04JCTAKKyNkZWZpbmUgRVhDQ0FVU0VfU1lTVEVNX0NBTEwJCQkxCisjZGVmaW5lIEVYQ0NBVVNFX0lOU1RSVUNUSU9OX0ZFVENIX0VSUk9SCTIKKyNkZWZpbmUgRVhDQ0FVU0VfTE9BRF9TVE9SRV9FUlJPUgkJMworI2RlZmluZSBFWENDQVVTRV9MRVZFTDFfSU5URVJSVVBUCQk0CisjZGVmaW5lIEVYQ0NBVVNFX0FMTE9DQQkJCQk1CisjZGVmaW5lIEVYQ0NBVVNFX0lOVEVHRVJfRElWSURFX0JZX1pFUk8JCTYKKyNkZWZpbmUgRVhDQ0FVU0VfU1BFQ1VMQVRJT04JCQk3CisjZGVmaW5lIEVYQ0NBVVNFX1BSSVZJTEVHRUQJCQk4CisjZGVmaW5lIEVYQ0NBVVNFX1VOQUxJR05FRAkJCTkKKyNkZWZpbmUgRVhDQ0FVU0VfSVRMQl9NSVNTCQkJMTYKKyNkZWZpbmUgRVhDQ0FVU0VfSVRMQl9NVUxUSUhJVAkJCTE3CisjZGVmaW5lIEVYQ0NBVVNFX0lUTEJfUFJJVklMRUdFCQkJMTgKKyNkZWZpbmUgRVhDQ0FVU0VfSVRMQl9TSVpFX1JFU1RSSUNUSU9OCQkxOQorI2RlZmluZSBFWENDQVVTRV9GRVRDSF9DQUNIRV9BVFRSSUJVVEUJCTIwCisjZGVmaW5lIEVYQ0NBVVNFX0RUTEJfTUlTUwkJCTI0CisjZGVmaW5lIEVYQ0NBVVNFX0RUTEJfTVVMVElISVQJCQkyNQorI2RlZmluZSBFWENDQVVTRV9EVExCX1BSSVZJTEVHRQkJCTI2CisjZGVmaW5lIEVYQ0NBVVNFX0RUTEJfU0laRV9SRVNUUklDVElPTgkJMjcKKyNkZWZpbmUgRVhDQ0FVU0VfTE9BRF9DQUNIRV9BVFRSSUJVVEUJCTI4CisjZGVmaW5lIEVYQ0NBVVNFX1NUT1JFX0NBQ0hFX0FUVFJJQlVURQkJMjkKKyNkZWZpbmUgRVhDQ0FVU0VfRkxPQVRJTkdfUE9JTlQJCQk0MAorCisvKiAgUFMgcmVnaXN0ZXIgZmllbGRzLiAgKi8KKworI2RlZmluZSBQU19XT0VfQklUCQkxOAorI2RlZmluZSBQU19DQUxMSU5DX1NISUZUCTE2CisjZGVmaW5lIFBTX0NBTExJTkNfTUFTSwkJMHgwMDAzMDAwMAorI2RlZmluZSBQU19PV0JfU0hJRlQJCTgKKyNkZWZpbmUgUFNfT1dCX01BU0sJCTB4MDAwMDBGMDAKKyNkZWZpbmUgUFNfUklOR19TSElGVAkJNgorI2RlZmluZSBQU19SSU5HX01BU0sJCTB4MDAwMDAwQzAKKyNkZWZpbmUgUFNfVU1fQklUCQk1CisjZGVmaW5lIFBTX0VYQ01fQklUCQk0CisjZGVmaW5lIFBTX0lOVExFVkVMX1NISUZUCTAKKyNkZWZpbmUgUFNfSU5UTEVWRUxfTUFTSwkweDAwMDAwMDBGCisKKy8qICBEQlJFQUtDbiByZWdpc3RlciBmaWVsZHMuICAqLworCisjZGVmaW5lIERCUkVBS0NfTUFTS19CSVQJCTAKKyNkZWZpbmUgREJSRUFLQ19NQVNLX01BU0sJCTB4MDAwMDAwM0YKKyNkZWZpbmUgREJSRUFLQ19MT0FEX0JJVAkJMzAKKyNkZWZpbmUgREJSRUFLQ19MT0FEX01BU0sJCTB4NDAwMDAwMDAKKyNkZWZpbmUgREJSRUFLQ19TVE9SX0JJVAkJMzEKKyNkZWZpbmUgREJSRUFLQ19TVE9SX01BU0sJCTB4ODAwMDAwMDAKKworLyogIERFQlVHQ0FVU0UgcmVnaXN0ZXIgZmllbGRzLiAgKi8KKworI2RlZmluZSBERUJVR0NBVVNFX0RFQlVHSU5UX0JJVAkJNQkvKiBFeHRlcm5hbCBkZWJ1ZyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgREVCVUdDQVVTRV9CUkVBS05fQklUCQk0CS8qIEJSRUFLLk4gaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgREVCVUdDQVVTRV9CUkVBS19CSVQJCTMJLyogQlJFQUsgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgREVCVUdDQVVTRV9EQlJFQUtfQklUCQkyCS8qIERCUkVBSyBtYXRjaCAqLworI2RlZmluZSBERUJVR0NBVVNFX0lCUkVBS19CSVQJCTEJLyogSUJSRUFLIG1hdGNoICovCisjZGVmaW5lIERFQlVHQ0FVU0VfSUNPVU5UX0JJVAkJMAkvKiBJQ09VTlQgd291bGQgaW5jci4gdG8gemVybyAqLworCisjZW5kaWYgLyogX1hURU5TQV9TUEVDUkVHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlbWJ1Zi5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NlbWJ1Zi5oCmluZGV4IDJkMjZjNDcuLmMxNTg3MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZW1idWYuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc2VtYnVmLmgKQEAgLTI1LDcgKzI1LDcgQEAKIAogc3RydWN0IHNlbWlkNjRfZHMgewogCXN0cnVjdCBpcGM2NF9wZXJtIHNlbV9wZXJtOwkJLyogcGVybWlzc2lvbnMgLi4gc2VlIGlwYy5oICovCi0jaWYgWENIQUxfSEFWRV9MRQorI2lmZGVmIF9fWFRFTlNBX0VMX18KIAlfX2tlcm5lbF90aW1lX3QJc2VtX290aW1lOwkJLyogbGFzdCBzZW1vcCB0aW1lICovCiAJdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7CiAJX19rZXJuZWxfdGltZV90CXNlbV9jdGltZTsJCS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaG1idWYuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaG1idWYuaAppbmRleCBhMzBiODFhLi5hZDRiMDEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2Evc2htYnVmLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NobWJ1Zi5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaWZuZGVmIF9YVEVOU0FfU0hNQlVGX0gKICNkZWZpbmUgX1hURU5TQV9TSE1CVUZfSAogCisjaWYgZGVmaW5lZCAoX19YVEVOU0FfRUxfXykKIHN0cnVjdCBzaG1pZDY0X2RzIHsKIAlzdHJ1Y3QgaXBjNjRfcGVybQlzaG1fcGVybTsJLyogb3BlcmF0aW9uIHBlcm1zICovCiAJc2l6ZV90CQkJc2htX3NlZ3N6OwkvKiBzaXplIG9mIHNlZ21lbnQgKGJ5dGVzKSAqLwpAQCAtMzQsNiArMzUsMjYgQEAKIAl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDQ7CiAJdW5zaWduZWQgbG9uZwkJX191bnVzZWQ1OwogfTsKKyNlbGlmIGRlZmluZWQgKF9fWFRFTlNBX0VCX18pCitzdHJ1Y3Qgc2htaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0Jc2htX3Blcm07CS8qIG9wZXJhdGlvbiBwZXJtcyAqLworCXNpemVfdAkJCXNobV9zZWdzejsJLyogc2l6ZSBvZiBzZWdtZW50IChieXRlcykgKi8KKwlfX2tlcm5lbF90aW1lX3QJCXNobV9hdGltZTsJLyogbGFzdCBhdHRhY2ggdGltZSAqLworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMTsKKwlfX2tlcm5lbF90aW1lX3QJCXNobV9kdGltZTsJLyogbGFzdCBkZXRhY2ggdGltZSAqLworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMjsKKwlfX2tlcm5lbF90aW1lX3QJCXNobV9jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMzsKKwlfX2tlcm5lbF9waWRfdAkJc2htX2NwaWQ7CS8qIHBpZCBvZiBjcmVhdG9yICovCisJX19rZXJuZWxfcGlkX3QJCXNobV9scGlkOwkvKiBwaWQgb2YgbGFzdCBvcGVyYXRvciAqLworCXVuc2lnbmVkIGxvbmcJCXNobV9uYXR0Y2g7CS8qIG5vLiBvZiBjdXJyZW50IGF0dGFjaGVzICovCisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkNTsKK307CisjZWxzZQorIyBlcnJvciBlbmRpYW4gb3JkZXIgbm90IGRlZmluZWQKKyNlbmRpZgorCiAKIHN0cnVjdCBzaG1pbmZvNjQgewogCXVuc2lnbmVkIGxvbmcJc2htbWF4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3N0YXQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdGF0LmgKaW5kZXggMmY0NjYyZi4uMTQ5ZjRiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3N0YXQuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc3RhdC5oCkBAIC0xMyw5MyArMTMsNTcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLXN0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCB7Ci0JdW5zaWduZWQgc2hvcnQgc3RfZGV2OwotCXVuc2lnbmVkIHNob3J0IHN0X2lubzsKLQl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOwotCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOwotCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKLQl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7Ci0JdW5zaWduZWQgc2hvcnQgc3RfcmRldjsKLQl1bnNpZ25lZCBsb25nICBzdF9zaXplOwotCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOwotCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOwotCXVuc2lnbmVkIGxvbmcgIHN0X2N0aW1lOwotfTsKLQogI2RlZmluZSBTVEFUX0hBVkVfTlNFQyAxCiAKIHN0cnVjdCBzdGF0IHsKLQl1bnNpZ25lZCBzaG9ydCBzdF9kZXY7Ci0JdW5zaWduZWQgc2hvcnQgX19wYWQxOwotCXVuc2lnbmVkIGxvbmcgc3RfaW5vOwotCXVuc2lnbmVkIHNob3J0IHN0X21vZGU7Ci0JdW5zaWduZWQgc2hvcnQgc3Rfbmxpbms7Ci0JdW5zaWduZWQgc2hvcnQgc3RfdWlkOwotCXVuc2lnbmVkIHNob3J0IHN0X2dpZDsKLQl1bnNpZ25lZCBzaG9ydCBzdF9yZGV2OwotCXVuc2lnbmVkIHNob3J0IF9fcGFkMjsKLQl1bnNpZ25lZCBsb25nICBzdF9zaXplOwotCXVuc2lnbmVkIGxvbmcgIHN0X2Jsa3NpemU7Ci0JdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOwotCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOwotCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lX25zZWM7Ci0JdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7Ci0JdW5zaWduZWQgbG9uZyAgc3RfbXRpbWVfbnNlYzsKLQl1bnNpZ25lZCBsb25nICBzdF9jdGltZTsKLQl1bnNpZ25lZCBsb25nICBzdF9jdGltZV9uc2VjOwotCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKLQl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7CisJdW5zaWduZWQgbG9uZwlzdF9kZXY7CisJaW5vX3QJCXN0X2lubzsKKwltb2RlX3QJCXN0X21vZGU7CisJbmxpbmtfdAkJc3Rfbmxpbms7CisJdWlkX3QJCXN0X3VpZDsKKwlnaWRfdAkJc3RfZ2lkOworCXVuc2lnbmVkIGludAlzdF9yZGV2OworCW9mZl90CQlzdF9zaXplOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfbXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkNTsKIH07CiAKLS8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjLTIuMi4zLiAqLworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMtMi4zICovCiAKIHN0cnVjdCBzdGF0NjQgIHsKLSNpZmRlZiBfX1hURU5TQV9FTF9fCi0JdW5zaWduZWQgc2hvcnQJc3RfZGV2OwkJLyogRGV2aWNlICovCi0JdW5zaWduZWQgY2hhcglfX3BhZDBbMTBdOwotI2Vsc2UKLQl1bnNpZ25lZCBjaGFyCV9fcGFkMFs2XTsKLQl1bnNpZ25lZCBzaG9ydAlzdF9kZXY7Ci0JdW5zaWduZWQgY2hhcglfX3BhZDFbMl07Ci0jZW5kaWYKLQotI2RlZmluZSBTVEFUNjRfSEFTX0JST0tFTl9TVF9JTk8JMQotCXVuc2lnbmVkIGxvbmcgX19zdF9pbm87CQkvKiAzMmJpdCBmaWxlIHNlcmlhbCBudW1iZXIuICovCi0KKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfZGV2OwkvKiBEZXZpY2UgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfaW5vOwkvKiBGaWxlIHNlcmlhbCBudW1iZXIgKi8KIAl1bnNpZ25lZCBpbnQgIHN0X21vZGU7CQkvKiBGaWxlIG1vZGUuICovCiAJdW5zaWduZWQgaW50ICBzdF9ubGluazsJCS8qIExpbmsgY291bnQuICovCiAJdW5zaWduZWQgaW50ICBzdF91aWQ7CQkvKiBVc2VyIElEIG9mIHRoZSBmaWxlJ3Mgb3duZXIuICovCiAJdW5zaWduZWQgaW50ICBzdF9naWQ7CQkvKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwLiAqLwotCi0jaWZkZWYgX19YVEVOU0FfRUxfXwotCXVuc2lnbmVkIHNob3J0CXN0X3JkZXY7CS8qIERldmljZSBudW1iZXIsIGlmIGRldmljZS4gKi8KLQl1bnNpZ25lZCBjaGFyCV9fcGFkM1sxMF07CisJdW5zaWduZWQgbG9uZyBsb25nIHN0X3JkZXY7CS8qIERldmljZSBudW1iZXIsIGlmIGRldmljZS4gKi8KKwlsb25nIGxvbmcgc3Rfc2l6ZTsJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICovCisJbG9uZyBzdF9ibGtzaXplOwkJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICovCisJdW5zaWduZWQgbG9uZyBfX3VudXNlZDI7CisjaWZkZWYgX19YVEVOU0FfRUJfXworCXVuc2lnbmVkIGxvbmcgX191bnVzZWQzOworCWxvbmcgc3RfYmxvY2tzOwkJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLwogI2Vsc2UKLQl1bnNpZ25lZCBjaGFyCV9fcGFkMls2XTsKLQl1bnNpZ25lZCBzaG9ydAlzdF9yZGV2OwotCXVuc2lnbmVkIGNoYXIJX19wYWQzWzJdOworCWxvbmcgc3RfYmxvY2tzOwkJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCXVuc2lnbmVkIGxvbmcgX191bnVzZWQzOwogI2VuZGlmCi0KLQlsb25nIGxvbmcgaW50ICBzdF9zaXplOwkJLyogU2l6ZSBvZiBmaWxlLCBpbiBieXRlcy4gKi8KLQlsb25nIGludCBzdF9ibGtzaXplOwkJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICovCi0KLSNpZmRlZiBfX1hURU5TQV9FTF9fCi0JdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KLQl1bnNpZ25lZCBsb25nICBfX3BhZDQ7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgIF9fcGFkNDsKLQl1bnNpZ25lZCBsb25nICBzdF9ibG9ja3M7Ci0jZW5kaWYKLQotCXVuc2lnbmVkIGxvbmcgIF9fcGFkNTsKLQlsb25nIGludCBzdF9hdGltZTsJCS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICovCi0JdW5zaWduZWQgbG9uZyAgc3RfYXRpbWVfbnNlYzsKLQlsb25nIGludCBzdF9tdGltZTsJCS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICovCi0JdW5zaWduZWQgbG9uZyAgc3RfbXRpbWVfbnNlYzsKLQlsb25nIGludCAgc3RfY3RpbWU7CQkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gKi8KLQl1bnNpZ25lZCBsb25nICBzdF9jdGltZV9uc2VjOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgc3RfaW5vOwkvKiBGaWxlIHNlcmlhbCBudW1iZXIuICovCisJbG9uZyBzdF9hdGltZTsJCQkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAqLworCXVuc2lnbmVkIGxvbmcgc3RfYXRpbWVfbnNlYzsKKwlsb25nIHN0X210aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICovCisJdW5zaWduZWQgbG9uZyBzdF9tdGltZV9uc2VjOworCWxvbmcgc3RfY3RpbWU7CQkJLyogVGltZSBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICovCisJdW5zaWduZWQgbG9uZyBzdF9jdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcgX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgX191bnVzZWQ1OwogfTsKIAogI2VuZGlmCS8qIF9YVEVOU0FfU1RBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3lzY2FsbC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3N5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2IwZDQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3N5c2NhbGwuaApAQCAtMCwwICsxLDIwIEBACitzdHJ1Y3QgcHRfcmVnczsKK3N0cnVjdCBzaWdhY3Rpb247Cithc21saW5rYWdlIGxvbmcgeHRlbnNhX2V4ZWN2ZShjaGFyKiwgY2hhcioqLCBjaGFyKiosIHN0cnVjdCBwdF9yZWdzKik7Cithc21saW5rYWdlIGxvbmcgeHRlbnNhX2Nsb25lKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBwdF9yZWdzKik7Cithc21saW5rYWdlIGxvbmcgeHRlbnNhX3BpcGUoaW50IF9fdXNlciAqKTsKK2FzbWxpbmthZ2UgbG9uZyB4dGVuc2FfbW1hcDIodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKKyAgICAJCQkgICAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9wdHJhY2UobG9uZywgbG9uZywgbG9uZywgbG9uZyk7Cithc21saW5rYWdlIGxvbmcgeHRlbnNhX3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyopOworYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MqKTsKK2FzbWxpbmthZ2UgbG9uZyB4dGVuc2Ffc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyopOworYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzKik7Cithc21saW5rYWdlIGxvbmcgeHRlbnNhX3NpZ2FjdGlvbihpbnQsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uKiwKKwkJCQkgc3RydWN0IG9sZF9zaWdhY3Rpb24qKTsKK2FzbWxpbmthZ2UgbG9uZyB4dGVuc2Ffc2lnYWx0c3RhY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworYXNtbGlua2FnZSBsb25nIHN5c19ydF9zaWdhY3Rpb24oaW50LAorCQkJCSBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uIF9fdXNlciAqLAorCQkJCSBzdHJ1Y3Qgc2lnYWN0aW9uIF9fdXNlciAqLAorCQkJCSBzaXplX3QpOworYXNtbGlua2FnZSBsb25nIHh0ZW5zYV9zaG1hdChpbnQgc2htaWQsIGNoYXIgX191c2VyICpzaG1hZGRyLCBpbnQgc2htZmxnKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zeXN0ZW0uaAppbmRleCA5MzJiZGE5Li40YWFlZDdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2Evc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3N5c3RlbS5oCkBAIC0yMTMsNyArMjEzLDcgQEAKIAl1bnNpZ25lZCBpbnQgYTAsIHBzOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkibW92aQlhMTQsIiBfX3N0cmluZ2lmeSAoUFNfRVhDTV9NQVNLKSAiIHwgMVxuXHQiCisJCSJtb3ZpCWExNCwiIF9fc3RyaW5naWZ5IChQU19FWENNX0JJVCkgIiB8IDFcblx0IgogCQkibW92CWExMiwgYTBcblx0IgogCQkicnNyCWExMywiIF9fc3RyaW5naWZ5KFNBUikgIlxuXHQiCiAJCSJ4c3IJYTE0LCIgX19zdHJpbmdpZnkoUFMpICJcblx0IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdGVybWJpdHMuaAppbmRleCBjNzgwNTkzLi4wNTdiOWEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdGVybWJpdHMuaApAQCAtMzAsNiArMzAsMTcgQEAKIAljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KIH07CiAKK3N0cnVjdCBrdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCiAvKiBjX2NjIGNoYXJhY3RlcnMgKi8KIAogI2RlZmluZSBWSU5UUiAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGltZXguaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90aW1leC5oCmluZGV4IGM3YjcwNWUuLjI4Yzc5ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90aW1leC5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90aW1leC5oCkBAIC0xNiwxNyArMTYsMjIgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAKLSNpZiBYQ0hBTF9JTlRfTEVWRUwoWENIQUxfVElNRVIwX0lOVEVSUlVQVCkgPT0gMQorI2RlZmluZSBfSU5UTEVWRUwoeCkJWENIQUxfSU5UICMjIHggIyMgX0xFVkVMCisjZGVmaW5lIElOVExFVkVMKHgpCV9JTlRMRVZFTCh4KQorCisjaWYgSU5UTEVWRUwoWENIQUxfVElNRVIwX0lOVEVSUlVQVCkgPT0gMQogIyBkZWZpbmUgTElOVVhfVElNRVIgICAgIDAKLSNlbGlmIFhDSEFMX0lOVF9MRVZFTChYQ0hBTF9USU1FUjFfSU5URVJSVVBUKSA9PSAxCisjIGRlZmluZSBMSU5VWF9USU1FUl9JTlQgWENIQUxfVElNRVIwX0lOVEVSUlVQVAorI2VsaWYgSU5UTEVWRUwoWENIQUxfVElNRVIxX0lOVEVSUlVQVCkgPT0gMQogIyBkZWZpbmUgTElOVVhfVElNRVIgICAgIDEKLSNlbGlmIFhDSEFMX0lOVF9MRVZFTChYQ0hBTF9USU1FUjJfSU5URVJSVVBUKSA9PSAxCisjIGRlZmluZSBMSU5VWF9USU1FUl9JTlQgWENIQUxfVElNRVIxX0lOVEVSUlVQVAorI2VsaWYgSU5UTEVWRUwoWENIQUxfVElNRVIyX0lOVEVSUlVQVCkgPT0gMQogIyBkZWZpbmUgTElOVVhfVElNRVIgICAgIDIKKyMgZGVmaW5lIExJTlVYX1RJTUVSX0lOVCBYQ0hBTF9USU1FUjJfSU5URVJSVVBUCiAjZWxzZQogIyBlcnJvciAiQmFkIHRpbWVyIG51bWJlciBmb3IgTGludXggY29uZmlndXJhdGlvbnMhIgogI2VuZGlmCiAKLSNkZWZpbmUgTElOVVhfVElNRVJfSU5UICAgICAgICAgWENIQUxfVElNRVJfSU5URVJSVVBUKExJTlVYX1RJTUVSKQogI2RlZmluZSBMSU5VWF9USU1FUl9NQVNLICAgICAgICAoMUwgPDwgTElOVVhfVElNRVJfSU5UKQogCiAjZGVmaW5lIENMT0NLX1RJQ0tfUkFURSAJMTE5MzE4MAkvKiAoZXZlcnlvbmUgaXMgdXNpbmcgdGhpcyB2YWx1ZSkgKi8KQEAgLTYwLDggKzY1LDggQEAKIAogI2RlZmluZSBXU1JfQ0NPVU5UKHIpCSAgX19hc21fXygid3NyICUwLCJfX3N0cmluZ2lmeShDQ09VTlQpIDo6ICJhIiAocikpCiAjZGVmaW5lIFJTUl9DQ09VTlQocikJICBfX2FzbV9fKCJyc3IgJTAsIl9fc3RyaW5naWZ5KENDT1VOVCkgOiAiPWEiIChyKSkKLSNkZWZpbmUgV1NSX0NDT01QQVJFKHgscikgX19hc21fXygid3NyICUwLCJfX3N0cmluZ2lmeShDQ09NUEFSRV8wKSIrIl9fc3RyaW5naWZ5KHgpIDo6ICJhIihyKSkKLSNkZWZpbmUgUlNSX0NDT01QQVJFKHgscikgX19hc21fXygicnNyICUwLCJfX3N0cmluZ2lmeShDQ09NUEFSRV8wKSIrIl9fc3RyaW5naWZ5KHgpIDogIj1hIihyKSkKKyNkZWZpbmUgV1NSX0NDT01QQVJFKHgscikgX19hc21fXygid3NyICUwLCJfX3N0cmluZ2lmeShDQ09NUEFSRSkiKyJfX3N0cmluZ2lmeSh4KSA6OiAiYSIocikpCisjZGVmaW5lIFJTUl9DQ09NUEFSRSh4LHIpIF9fYXNtX18oInJzciAlMCwiX19zdHJpbmdpZnkoQ0NPTVBBUkUpIisiX19zdHJpbmdpZnkoeCkgOiAiPWEiKHIpKQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2Njb3VudCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3RsYmZsdXNoLmgKaW5kZXggNDNmNmVjOC4uN2M2MzdiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3RsYmZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3RsYmZsdXNoLmgKQEAgLTExLDEyICsxMSwyMCBAQAogI2lmbmRlZiBfWFRFTlNBX1RMQkZMVVNIX0gKICNkZWZpbmUgX1hURU5TQV9UTEJGTFVTSF9ICiAKLSNkZWZpbmUgREVCVUdfVExCCi0KICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjZGVmaW5lIERUTEJfV0FZX1BHRAk3CisKKyNkZWZpbmUgSVRMQl9BUkZfV0FZUwk0CisjZGVmaW5lIERUTEJfQVJGX1dBWVMJNAorCisjZGVmaW5lIElUTEJfSElUX0JJVAkzCisjZGVmaW5lIERUTEJfSElUX0JJVAk0CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qIFRMQiBmbHVzaGluZzoKICAqCkBAIC00NiwxMSArNTQsNiBAQAogCiAvKiBUTEIgb3BlcmF0aW9ucy4gKi8KIAotI2RlZmluZSBJVExCX1dBWVNfTE9HMiAgICAgIFhDSEFMX0lUTEJfV0FZX0JJVFMKLSNkZWZpbmUgRFRMQl9XQVlTX0xPRzIgICAgICBYQ0hBTF9EVExCX1dBWV9CSVRTCi0jZGVmaW5lIElUTEJfUFJPQkVfU1VDQ0VTUyAgKDEgPDwgSVRMQl9XQVlTX0xPRzIpCi0jZGVmaW5lIERUTEJfUFJPQkVfU1VDQ0VTUyAgKDEgPDwgRFRMQl9XQVlTX0xPRzIpCi0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpdGxiX3Byb2JlKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKQEAgLTEzMSwyOSArMTM0LDMwIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlX3BhZ2VfZGlyZWN0b3J5ICh2b2lkKQogewotCWludmFsaWRhdGVfZHRsYl9lbnRyeSAoRFRMQl9XQVlfUEdUQUJMRSk7CisJaW52YWxpZGF0ZV9kdGxiX2VudHJ5IChEVExCX1dBWV9QR0QpOworCWludmFsaWRhdGVfZHRsYl9lbnRyeSAoRFRMQl9XQVlfUEdEKzEpOworCWludmFsaWRhdGVfZHRsYl9lbnRyeSAoRFRMQl9XQVlfUEdEKzIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9pdGxiX21hcHBpbmcgKHVuc2lnbmVkIGFkZHJlc3MpCiB7CiAJdW5zaWduZWQgbG9uZyB0bGJfZW50cnk7Ci0Jd2hpbGUgKCh0bGJfZW50cnkgPSBpdGxiX3Byb2JlIChhZGRyZXNzKSkgJiBJVExCX1BST0JFX1NVQ0NFU1MpCi0JCWludmFsaWRhdGVfaXRsYl9lbnRyeSAodGxiX2VudHJ5KTsKKwlpZiAoKCh0bGJfZW50cnkgPSBpdGxiX3Byb2JlKGFkZHJlc3MpKSAmICgxIDw8IElUTEJfSElUX0JJVCkpICE9IDApCisJCWludmFsaWRhdGVfaXRsYl9lbnRyeSh0bGJfZW50cnkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9kdGxiX21hcHBpbmcgKHVuc2lnbmVkIGFkZHJlc3MpCiB7CiAJdW5zaWduZWQgbG9uZyB0bGJfZW50cnk7Ci0Jd2hpbGUgKCh0bGJfZW50cnkgPSBkdGxiX3Byb2JlIChhZGRyZXNzKSkgJiBEVExCX1BST0JFX1NVQ0NFU1MpCi0JCWludmFsaWRhdGVfZHRsYl9lbnRyeSAodGxiX2VudHJ5KTsKKwlpZiAoKCh0bGJfZW50cnkgPSBkdGxiX3Byb2JlKGFkZHJlc3MpKSAmICgxIDw8IERUTEJfSElUX0JJVCkpICE9IDApCisJCWludmFsaWRhdGVfZHRsYl9lbnRyeSh0bGJfZW50cnkpOwogfQogCiAjZGVmaW5lIGNoZWNrX3BndF9jYWNoZSgpCWRvIHsgfSB3aGlsZSAoMCkKIAogCi0jaWZkZWYgREVCVUdfVExCCi0KLS8qIERPIE5PVCBVU0UgVEhFU0UgRlVOQ1RJT05TLiAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZW4ndCBwYXJ0IG9mIHRoZSBYdGVuc2EKKy8qCisgKiBETyBOT1QgVVNFIFRIRVNFIEZVTkNUSU9OUy4gIFRoZXNlIGluc3RydWN0aW9ucyBhcmVuJ3QgcGFydCBvZiB0aGUgWHRlbnNhCiAgKiBJU0EgYW5kIGV4aXN0IG9ubHkgZm9yIHRlc3QgcHVycG9zZXMuLgogICogWW91IG1heSBmaW5kIGl0IGhlbHBmdWwgZm9yIE1NVSBkZWJ1Z2dpbmcsIGhvd2V2ZXIuCiAgKgpAQCAtMTkzLDggKzE5Nyw2IEBACiAJcmV0dXJuIHRtcDsKIH0KIAotI2VuZGlmCS8qIERFQlVHX1RMQiAqLwotCi0KKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYJLyogX1hURU5TQV9QR0FMTE9DX0ggKi8KKyNlbmRpZgkvKiBfWFRFTlNBX1RMQkZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oCmluZGV4IDg4YTY0ZTEuLmQ2MzUyZGEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmgKQEAgLTIzLDcgKzIzLDYgQEAKIAogI2lmZGVmIF9fQVNTRU1CTFlfXwogCi0jZGVmaW5lIF9BU01MQU5HVUFHRQogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oCmluZGV4IDQxMWY4MTAuLjhhN2ZiNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdW5pc3RkLmgKQEAgLTExLDM5NiArMTEsNTkzIEBACiAjaWZuZGVmIF9YVEVOU0FfVU5JU1REX0gKICNkZWZpbmUgX1hURU5TQV9VTklTVERfSAogCi0jZGVmaW5lIF9fTlJfc3BpbGwJCSAgMAotI2RlZmluZSBfX05SX2V4aXQJCSAgMQotI2RlZmluZSBfX05SX3JlYWQJCSAgMwotI2RlZmluZSBfX05SX3dyaXRlCQkgIDQKLSNkZWZpbmUgX19OUl9vcGVuCQkgIDUKLSNkZWZpbmUgX19OUl9jbG9zZQkJICA2Ci0jZGVmaW5lIF9fTlJfY3JlYXQJCSAgOAotI2RlZmluZSBfX05SX2xpbmsJCSAgOQotI2RlZmluZSBfX05SX3VubGluawkJIDEwCi0jZGVmaW5lIF9fTlJfZXhlY3ZlCQkgMTEKLSNkZWZpbmUgX19OUl9jaGRpcgkJIDEyCi0jZGVmaW5lIF9fTlJfbWtub2QJCSAxNAotI2RlZmluZSBfX05SX2NobW9kCQkgMTUKLSNkZWZpbmUgX19OUl9sY2hvd24JCSAxNgotI2RlZmluZSBfX05SX2JyZWFrCQkgMTcKLSNkZWZpbmUgX19OUl9sc2VlawkJIDE5Ci0jZGVmaW5lIF9fTlJfZ2V0cGlkCQkgMjAKLSNkZWZpbmUgX19OUl9tb3VudAkJIDIxCi0jZGVmaW5lIF9fTlJfc2V0dWlkCQkgMjMKLSNkZWZpbmUgX19OUl9nZXR1aWQJCSAyNAotI2RlZmluZSBfX05SX3B0cmFjZQkJIDI2Ci0jZGVmaW5lIF9fTlJfdXRpbWUJCSAzMAotI2RlZmluZSBfX05SX3N0dHkJCSAzMQotI2RlZmluZSBfX05SX2d0dHkJCSAzMgotI2RlZmluZSBfX05SX2FjY2VzcwkJIDMzCi0jZGVmaW5lIF9fTlJfZnRpbWUJCSAzNQotI2RlZmluZSBfX05SX3N5bmMJCSAzNgotI2RlZmluZSBfX05SX2tpbGwJCSAzNwotI2RlZmluZSBfX05SX3JlbmFtZQkJIDM4Ci0jZGVmaW5lIF9fTlJfbWtkaXIJCSAzOQotI2RlZmluZSBfX05SX3JtZGlyCQkgNDAKLSNkZWZpbmUgX19OUl9kdXAJCSA0MQotI2RlZmluZSBfX05SX3BpcGUJCSA0MgotI2RlZmluZSBfX05SX3RpbWVzCQkgNDMKLSNkZWZpbmUgX19OUl9wcm9mCQkgNDQKLSNkZWZpbmUgX19OUl9icmsJCSA0NQotI2RlZmluZSBfX05SX3NldGdpZAkJIDQ2Ci0jZGVmaW5lIF9fTlJfZ2V0Z2lkCQkgNDcKLSNkZWZpbmUgX19OUl9zaWduYWwJCSA0OAotI2RlZmluZSBfX05SX2dldGV1aWQJCSA0OQotI2RlZmluZSBfX05SX2dldGVnaWQJCSA1MAotI2RlZmluZSBfX05SX2FjY3QJCSA1MQotI2RlZmluZSBfX05SX2xvY2sJCSA1MwotI2RlZmluZSBfX05SX2lvY3RsCQkgNTQKLSNkZWZpbmUgX19OUl9mY250bAkJIDU1Ci0jZGVmaW5lIF9fTlJfc2V0cGdpZAkJIDU3Ci0jZGVmaW5lIF9fTlJfdWxpbWl0CQkgNTgKLSNkZWZpbmUgX19OUl91bWFzawkJIDYwCi0jZGVmaW5lIF9fTlJfY2hyb290CQkgNjEKLSNkZWZpbmUgX19OUl91c3RhdAkJIDYyCi0jZGVmaW5lIF9fTlJfZHVwMgkJIDYzCi0jZGVmaW5lIF9fTlJfZ2V0cHBpZAkJIDY0Ci0jZGVmaW5lIF9fTlJfc2V0c2lkCQkgNjYKLSNkZWZpbmUgX19OUl9zaWdhY3Rpb24JCSA2NwotI2RlZmluZSBfX05SX3NldHJldWlkCQkgNzAKLSNkZWZpbmUgX19OUl9zZXRyZWdpZAkJIDcxCi0jZGVmaW5lIF9fTlJfc2lnc3VzcGVuZAkJIDcyCi0jZGVmaW5lIF9fTlJfc2lncGVuZGluZwkJIDczCi0jZGVmaW5lIF9fTlJfc2V0aG9zdG5hbWUJIDc0Ci0jZGVmaW5lIF9fTlJfc2V0cmxpbWl0CQkgNzUKLSNkZWZpbmUgX19OUl9nZXRybGltaXQJIAkgNzYJLyogQmFjayBjb21wYXRpYmxlIDJHaWcgbGltaXRlZCBybGltaXQgKi8KLSNkZWZpbmUgX19OUl9nZXRydXNhZ2UJCSA3NwotI2RlZmluZSBfX05SX2dldHRpbWVvZmRheQkgNzgKLSNkZWZpbmUgX19OUl9zZXR0aW1lb2ZkYXkJIDc5Ci0jZGVmaW5lIF9fTlJfZ2V0Z3JvdXBzCQkgODAKLSNkZWZpbmUgX19OUl9zZXRncm91cHMJCSA4MQotI2RlZmluZSBfX05SX3NlbGVjdAkJIDgyCi0jZGVmaW5lIF9fTlJfc3ltbGluawkJIDgzCi0jZGVmaW5lIF9fTlJfcmVhZGxpbmsJCSA4NQotI2RlZmluZSBfX05SX3VzZWxpYgkJIDg2Ci0jZGVmaW5lIF9fTlJfc3dhcG9uCQkgODcKLSNkZWZpbmUgX19OUl9yZWJvb3QJCSA4OAotI2RlZmluZSBfX05SX211bm1hcAkJIDkxCi0jZGVmaW5lIF9fTlJfdHJ1bmNhdGUJCSA5MgotI2RlZmluZSBfX05SX2Z0cnVuY2F0ZQkJIDkzCi0jZGVmaW5lIF9fTlJfZmNobW9kCQkgOTQKLSNkZWZpbmUgX19OUl9mY2hvd24JCSA5NQotI2RlZmluZSBfX05SX2dldHByaW9yaXR5CSA5NgotI2RlZmluZSBfX05SX3NldHByaW9yaXR5CSA5NwotI2RlZmluZSBfX05SX3Byb2ZpbAkJIDk4Ci0jZGVmaW5lIF9fTlJfc3RhdGZzCQkgOTkKLSNkZWZpbmUgX19OUl9mc3RhdGZzCQkxMDAKLSNkZWZpbmUgX19OUl9pb3Blcm0JCTEwMQotI2RlZmluZSBfX05SX3N5c2xvZwkJMTAzCi0jZGVmaW5lIF9fTlJfc2V0aXRpbWVyCQkxMDQKLSNkZWZpbmUgX19OUl9nZXRpdGltZXIJCTEwNQotI2RlZmluZSBfX05SX3N0YXQJCTEwNgotI2RlZmluZSBfX05SX2xzdGF0CQkxMDcKLSNkZWZpbmUgX19OUl9mc3RhdAkJMTA4Ci0jZGVmaW5lIF9fTlJfaW9wbAkJMTEwCi0jZGVmaW5lIF9fTlJfdmhhbmd1cAkJMTExCi0jZGVmaW5lIF9fTlJfaWRsZQkJMTEyCi0jZGVmaW5lIF9fTlJfd2FpdDQJCTExNAotI2RlZmluZSBfX05SX3N3YXBvZmYJCTExNQotI2RlZmluZSBfX05SX3N5c2luZm8JCTExNgotI2RlZmluZSBfX05SX2ZzeW5jCQkxMTgKLSNkZWZpbmUgX19OUl9zaWdyZXR1cm4JCTExOQotI2RlZmluZSBfX05SX2Nsb25lCQkxMjAKLSNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lCTEyMQotI2RlZmluZSBfX05SX3VuYW1lCQkxMjIKLSNkZWZpbmUgX19OUl9tb2RpZnlfbGR0CQkxMjMKLSNkZWZpbmUgX19OUl9hZGp0aW1leAkJMTI0Ci0jZGVmaW5lIF9fTlJfbXByb3RlY3QJCTEyNQotI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUJMTI3Ci0jZGVmaW5lIF9fTlJfaW5pdF9tb2R1bGUJMTI4Ci0jZGVmaW5lIF9fTlJfZGVsZXRlX21vZHVsZQkxMjkKLSNkZWZpbmUgX19OUl9xdW90YWN0bAkJMTMxCi0jZGVmaW5lIF9fTlJfZ2V0cGdpZAkJMTMyCi0jZGVmaW5lIF9fTlJfZmNoZGlyCQkxMzMKLSNkZWZpbmUgX19OUl9iZGZsdXNoCQkxMzQKLSNkZWZpbmUgX19OUl9zeXNmcwkJMTM1Ci0jZGVmaW5lIF9fTlJfcGVyc29uYWxpdHkJMTM2Ci0jZGVmaW5lIF9fTlJfc2V0ZnN1aWQJCTEzOAotI2RlZmluZSBfX05SX3NldGZzZ2lkCQkxMzkKLSNkZWZpbmUgX19OUl9fbGxzZWVrCQkxNDAKLSNkZWZpbmUgX19OUl9nZXRkZW50cwkJMTQxCi0jZGVmaW5lIF9fTlJfX25ld3NlbGVjdAkJMTQyCi0jZGVmaW5lIF9fTlJfZmxvY2sJCTE0MwotI2RlZmluZSBfX05SX21zeW5jCQkxNDQKLSNkZWZpbmUgX19OUl9yZWFkdgkJMTQ1Ci0jZGVmaW5lIF9fTlJfd3JpdGV2CQkxNDYKLSNkZWZpbmUgX19OUl9jYWNoZWZsdXNoICAgICAgICAgMTQ3Ci0jZGVmaW5lIF9fTlJfY2FjaGVjdGwgICAgICAgICAgIDE0OAotI2RlZmluZSBfX05SX3N5c3h0ZW5zYSAgICAgICAgICAxNDkKLSNkZWZpbmUgX19OUl9zeXNkdW1teSAgICAgICAgICAgMTUwCi0jZGVmaW5lIF9fTlJfZ2V0c2lkCQkxNTEKLSNkZWZpbmUgX19OUl9mZGF0YXN5bmMJCTE1MgotI2RlZmluZSBfX05SX19zeXNjdGwJCTE1MwotI2RlZmluZSBfX05SX21sb2NrCQkxNTQKLSNkZWZpbmUgX19OUl9tdW5sb2NrCQkxNTUKLSNkZWZpbmUgX19OUl9tbG9ja2FsbAkJMTU2Ci0jZGVmaW5lIF9fTlJfbXVubG9ja2FsbAkJMTU3Ci0jZGVmaW5lIF9fTlJfc2NoZWRfc2V0cGFyYW0JCTE1OAotI2RlZmluZSBfX05SX3NjaGVkX2dldHBhcmFtCQkxNTkKLSNkZWZpbmUgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIJCTE2MAotI2RlZmluZSBfX05SX3NjaGVkX2dldHNjaGVkdWxlcgkJMTYxCi0jZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQJCTE2MgotI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgJMTYzCi0jZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbgkxNjQKLSNkZWZpbmUgX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwJMTY1Ci0jZGVmaW5lIF9fTlJfbmFub3NsZWVwCQkxNjYKLSNkZWZpbmUgX19OUl9tcmVtYXAJCTE2NwotI2RlZmluZSBfX05SX2FjY2VwdCAgICAgICAgICAgICAxNjgKLSNkZWZpbmUgX19OUl9iaW5kICAgICAgICAgICAgICAgMTY5Ci0jZGVmaW5lIF9fTlJfY29ubmVjdCAgICAgICAgICAgIDE3MAotI2RlZmluZSBfX05SX2dldHBlZXJuYW1lICAgICAgICAxNzEKLSNkZWZpbmUgX19OUl9nZXRzb2NrbmFtZSAgICAgICAgMTcyCi0jZGVmaW5lIF9fTlJfZ2V0c29ja29wdCAgICAgICAgIDE3MwotI2RlZmluZSBfX05SX2xpc3RlbiAgICAgICAgICAgICAxNzQKLSNkZWZpbmUgX19OUl9yZWN2ICAgICAgICAgICAgICAgMTc1Ci0jZGVmaW5lIF9fTlJfcmVjdmZyb20gICAgICAgICAgIDE3NgotI2RlZmluZSBfX05SX3JlY3Ztc2cgICAgICAgICAgICAxNzcKLSNkZWZpbmUgX19OUl9zZW5kICAgICAgICAgICAgICAgMTc4Ci0jZGVmaW5lIF9fTlJfc2VuZG1zZyAgICAgICAgICAgIDE3OQotI2RlZmluZSBfX05SX3NlbmR0byAgICAgICAgICAgICAxODAKLSNkZWZpbmUgX19OUl9zZXRzb2Nrb3B0ICAgICAgICAgMTgxCi0jZGVmaW5lIF9fTlJfc2h1dGRvd24gICAgICAgICAgIDE4MgotI2RlZmluZSBfX05SX3NvY2tldCAgICAgICAgICAgICAxODMKLSNkZWZpbmUgX19OUl9zb2NrZXRwYWlyICAgICAgICAgMTg0Ci0jZGVmaW5lIF9fTlJfc2V0cmVzdWlkCQkxODUKLSNkZWZpbmUgX19OUl9nZXRyZXN1aWQJCTE4NgotI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkxODcKLSNkZWZpbmUgX19OUl9wb2xsCQkxODgKLSNkZWZpbmUgX19OUl9uZnNzZXJ2Y3RsCQkxODkKLSNkZWZpbmUgX19OUl9zZXRyZXNnaWQJCTE5MAotI2RlZmluZSBfX05SX2dldHJlc2dpZAkJMTkxCi0jZGVmaW5lIF9fTlJfcHJjdGwgICAgICAgICAgICAgIDE5MgotI2RlZmluZSBfX05SX3J0X3NpZ3JldHVybgkxOTMKLSNkZWZpbmUgX19OUl9ydF9zaWdhY3Rpb24JMTk0Ci0jZGVmaW5lIF9fTlJfcnRfc2lncHJvY21hc2sJMTk1Ci0jZGVmaW5lIF9fTlJfcnRfc2lncGVuZGluZwkxOTYKLSNkZWZpbmUgX19OUl9ydF9zaWd0aW1lZHdhaXQJMTk3Ci0jZGVmaW5lIF9fTlJfcnRfc2lncXVldWVpbmZvCTE5OAotI2RlZmluZSBfX05SX3J0X3NpZ3N1c3BlbmQJMTk5Ci0jZGVmaW5lIF9fTlJfcHJlYWQJCTIwMAotI2RlZmluZSBfX05SX3B3cml0ZQkJMjAxCi0jZGVmaW5lIF9fTlJfY2hvd24JCTIwMgotI2RlZmluZSBfX05SX2dldGN3ZAkJMjAzCi0jZGVmaW5lIF9fTlJfY2FwZ2V0CQkyMDQKLSNkZWZpbmUgX19OUl9jYXBzZXQJCTIwNQotI2RlZmluZSBfX05SX3NpZ2FsdHN0YWNrCTIwNgotI2RlZmluZSBfX05SX3NlbmRmaWxlCQkyMDcKLSNkZWZpbmUgX19OUl9tbWFwMgkJMjEwCi0jZGVmaW5lIF9fTlJfdHJ1bmNhdGU2NAkJMjExCi0jZGVmaW5lIF9fTlJfZnRydW5jYXRlNjQJMjEyCi0jZGVmaW5lIF9fTlJfc3RhdDY0CQkyMTMKLSNkZWZpbmUgX19OUl9sc3RhdDY0CQkyMTQKLSNkZWZpbmUgX19OUl9mc3RhdDY0CQkyMTUKLSNkZWZpbmUgX19OUl9waXZvdF9yb290CQkyMTYKLSNkZWZpbmUgX19OUl9taW5jb3JlCQkyMTcKLSNkZWZpbmUgX19OUl9tYWR2aXNlCQkyMTgKLSNkZWZpbmUgX19OUl9nZXRkZW50czY0CQkyMTkKKyNpZm5kZWYgX19TWVNDQUxMCisjIGRlZmluZSBfX1NZU0NBTEwobnIsZnVuYyxuYXJncykKKyNlbmRpZgogCi0vKiBLZWVwIHRoaXMgbGFzdDsgc2hvdWxkIGFsd2F5cyBlcXVhbCB0aGUgbGFzdCB2YWxpZCBjYWxsIG51bWJlci4gKi8KLSNkZWZpbmUgX19OUl9MaW51eF9zeXNjYWxscyAgICAgMjIwCisjZGVmaW5lIF9fTlJfc3BpbGwJCQkJICAwCitfX1NZU0NBTEwoICAwLCBzeXNfbmlfc3lzY2FsbCwgMCkKKyNkZWZpbmUgX19OUl94dGVuc2EJCQkJICAxCitfX1NZU0NBTEwoICAxLCBzeXNfbmlfc3lzY2FsbCwgMCkKKyNkZWZpbmUgX19OUl9hdmFpbGFibGU0CQkJCSAgMgorX19TWVNDQUxMKCAgMiwgc3lzX25pX3N5c2NhbGwsIDApCisjZGVmaW5lIF9fTlJfYXZhaWxhYmxlNQkJCQkgIDMKK19fU1lTQ0FMTCggIDMsIHN5c19uaV9zeXNjYWxsLCAwKQorI2RlZmluZSBfX05SX2F2YWlsYWJsZTYJCQkJICA0CitfX1NZU0NBTEwoICA0LCBzeXNfbmlfc3lzY2FsbCwgMCkKKyNkZWZpbmUgX19OUl9hdmFpbGFibGU3CQkJCSAgNQorX19TWVNDQUxMKCAgNSwgc3lzX25pX3N5c2NhbGwsIDApCisjZGVmaW5lIF9fTlJfYXZhaWxhYmxlOAkJCQkgIDYKK19fU1lTQ0FMTCggIDYsIHN5c19uaV9zeXNjYWxsLCAwKQorI2RlZmluZSBfX05SX2F2YWlsYWJsZTkJCQkJICA3CitfX1NZU0NBTEwoICA3LCBzeXNfbmlfc3lzY2FsbCwgMCkKIAotLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC0xMjU6IHNlZQotICogPGFzbS14dGVuc2EvZXJybm8uaD4gKi8KKy8qIEZpbGUgT3BlcmF0aW9ucyAqLwogCi0jZGVmaW5lIFNZU1hURU5TQV9SRVNFUlZFRAkgICAwCS8qIGRvbid0IHVzZSB0aGlzICovCi0jZGVmaW5lIFNZU1hURU5TQV9BVE9NSUNfU0VUCSAgIDEJLyogc2V0IHZhcmlhYmxlICovCi0jZGVmaW5lIFNZU1hURU5TQV9BVE9NSUNfRVhHX0FERCAgIDIJLyogZXhjaGFuZ2UgbWVtb3J5IGFuZCBhZGQgKi8KLSNkZWZpbmUgU1lTWFRFTlNBX0FUT01JQ19BREQJICAgMwkvKiBhZGQgdG8gbWVtb3J5ICovCi0jZGVmaW5lIFNZU1hURU5TQV9BVE9NSUNfQ01QX1NXUCAgIDQJLyogY29tcGFyZSBhbmQgc3dhcCAqLworI2RlZmluZSBfX05SX29wZW4gCQkJCSAgOAorX19TWVNDQUxMKCAgOCwgc3lzX29wZW4sIDMpCisjZGVmaW5lIF9fTlJfY2xvc2UgCQkJCSAgOQorX19TWVNDQUxMKCAgOSwgc3lzX2Nsb3NlLCAxKQorI2RlZmluZSBfX05SX2R1cCAJCQkJIDEwCitfX1NZU0NBTEwoIDEwLCBzeXNfZHVwLCAxKQorI2RlZmluZSBfX05SX2R1cDIgCQkJCSAxMQorX19TWVNDQUxMKCAxMSwgc3lzX2R1cDIsIDIpCisjZGVmaW5lIF9fTlJfcmVhZCAJCQkJIDEyCitfX1NZU0NBTEwoIDEyLCBzeXNfcmVhZCwgMykKKyNkZWZpbmUgX19OUl93cml0ZSAJCQkJIDEzCitfX1NZU0NBTEwoIDEzLCBzeXNfd3JpdGUsIDMpCisjZGVmaW5lIF9fTlJfc2VsZWN0IAkJCQkgMTQKK19fU1lTQ0FMTCggMTQsIHN5c19zZWxlY3QsIDUpCisjZGVmaW5lIF9fTlJfbHNlZWsgCQkJCSAxNQorX19TWVNDQUxMKCAxNSwgc3lzX2xzZWVrLCAzKQorI2RlZmluZSBfX05SX3BvbGwgCQkJCSAxNgorX19TWVNDQUxMKCAxNiwgc3lzX3BvbGwsIDMpCisjZGVmaW5lIF9fTlJfX2xsc2VlawkJCQkgMTcKK19fU1lTQ0FMTCggMTcsIHN5c19sbHNlZWssIDUpCisjZGVmaW5lIF9fTlJfZXBvbGxfd2FpdCAJCQkgMTgKK19fU1lTQ0FMTCggMTgsIHN5c19lcG9sbF93YWl0LCA0KQorI2RlZmluZSBfX05SX2Vwb2xsX2N0bCAJCQkJIDE5CitfX1NZU0NBTEwoIDE5LCBzeXNfZXBvbGxfY3RsLCA0KQorI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZSAJCQkgMjAKK19fU1lTQ0FMTCggMjAsIHN5c19lcG9sbF9jcmVhdGUsIDEpCisjZGVmaW5lIF9fTlJfY3JlYXQgCQkJCSAyMQorX19TWVNDQUxMKCAyMSwgc3lzX2NyZWF0LCAyKQorI2RlZmluZSBfX05SX3RydW5jYXRlIAkJCQkgMjIKK19fU1lTQ0FMTCggMjIsIHN5c190cnVuY2F0ZSwgMikKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGUgCQkJCSAyMworX19TWVNDQUxMKCAyMywgc3lzX2Z0cnVuY2F0ZSwgMikKKyNkZWZpbmUgX19OUl9yZWFkdiAJCQkJIDI0CitfX1NZU0NBTEwoIDI0LCBzeXNfcmVhZHYsIDMpCisjZGVmaW5lIF9fTlJfd3JpdGV2IAkJCQkgMjUKK19fU1lTQ0FMTCggMjUsIHN5c193cml0ZXYsIDMpCisjZGVmaW5lIF9fTlJfZnN5bmMgCQkJCSAyNgorX19TWVNDQUxMKCAyNiwgc3lzX2ZzeW5jLCAxKQorI2RlZmluZSBfX05SX2ZkYXRhc3luYyAJCQkJIDI3CitfX1NZU0NBTEwoIDI3LCBzeXNfZmRhdGFzeW5jLCAxKQorI2RlZmluZSBfX05SX3RydW5jYXRlNjQgCQkJIDI4CitfX1NZU0NBTEwoIDI4LCBzeXNfdHJ1bmNhdGU2NCwgMikKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NCAJCQkgMjkKK19fU1lTQ0FMTCggMjksIHN5c19mdHJ1bmNhdGU2NCwgMikKKyNkZWZpbmUgX19OUl9wcmVhZDY0IAkJCQkgMzAKK19fU1lTQ0FMTCggMzAsIHN5c19wcmVhZDY0LCA2KQorI2RlZmluZSBfX05SX3B3cml0ZTY0IAkJCQkgMzEKK19fU1lTQ0FMTCggMzEsIHN5c19wd3JpdGU2NCwgNikKIAotI2RlZmluZSBTWVNYVEVOU0FfQ09VTlQJCSAgIDUJLyogY291bnQgb2Ygc3lzY2FsbDAgZnVuY3Rpb25zKi8KKyNkZWZpbmUgX19OUl9saW5rIAkJCQkgMzIKK19fU1lTQ0FMTCggMzIsIHN5c19saW5rLCAyKQorI2RlZmluZSBfX05SX3JlbmFtZSAJCQkJIDMzCitfX1NZU0NBTEwoIDMzLCBzeXNfcmVuYW1lLCAyKQorI2RlZmluZSBfX05SX3N5bWxpbmsgCQkJCSAzNAorX19TWVNDQUxMKCAzNCwgc3lzX3N5bWxpbmssIDIpCisjZGVmaW5lIF9fTlJfcmVhZGxpbmsgCQkJCSAzNQorX19TWVNDQUxMKCAzNSwgc3lzX3JlYWRsaW5rLCAzKQorI2RlZmluZSBfX05SX21rbm9kIAkJCQkgMzYKK19fU1lTQ0FMTCggMzYsIHN5c19ta25vZCwgMykKKyNkZWZpbmUgX19OUl9waXBlIAkJCQkgMzcKK19fU1lTQ0FMTCggMzcsIHh0ZW5zYV9waXBlLCAxKQorI2RlZmluZSBfX05SX3VubGluayAJCQkJIDM4CitfX1NZU0NBTEwoIDM4LCBzeXNfdW5saW5rLCAxKQorI2RlZmluZSBfX05SX3JtZGlyIAkJCQkgMzkKK19fU1lTQ0FMTCggMzksIHN5c19ybWRpciwgMSkKKworI2RlZmluZSBfX05SX21rZGlyIAkJCQkgNDAKK19fU1lTQ0FMTCggNDAsIHN5c19ta2RpciwgMikKKyNkZWZpbmUgX19OUl9jaGRpciAJCQkJIDQxCitfX1NZU0NBTEwoIDQxLCBzeXNfY2hkaXIsIDEpCisjZGVmaW5lIF9fTlJfZmNoZGlyIAkJCQkgNDIKK19fU1lTQ0FMTCggNDIsIHN5c19mY2hkaXIsIDEpCisjZGVmaW5lIF9fTlJfZ2V0Y3dkIAkJCQkgNDMKK19fU1lTQ0FMTCggNDMsIHN5c19nZXRjd2QsIDIpCisKKyNkZWZpbmUgX19OUl9jaG1vZCAJCQkJIDQ0CitfX1NZU0NBTEwoIDQ0LCBzeXNfY2htb2QsIDIpCisjZGVmaW5lIF9fTlJfY2hvd24gCQkJCSA0NQorX19TWVNDQUxMKCA0NSwgc3lzX2Nob3duLCAzKQorI2RlZmluZSBfX05SX3N0YXQgCQkJCSA0NgorX19TWVNDQUxMKCA0Niwgc3lzX25ld3N0YXQsIDIpCisjZGVmaW5lIF9fTlJfc3RhdDY0IAkJCQkgNDcKK19fU1lTQ0FMTCggNDcsIHN5c19zdGF0NjQsIDIpCisKKyNkZWZpbmUgX19OUl9sY2hvd24gCQkJCSA0OAorX19TWVNDQUxMKCA0OCwgc3lzX2xjaG93biwgMykKKyNkZWZpbmUgX19OUl9sc3RhdCAJCQkJIDQ5CitfX1NZU0NBTEwoIDQ5LCBzeXNfbmV3bHN0YXQsIDIpCisjZGVmaW5lIF9fTlJfbHN0YXQ2NCAJCQkJIDUwCitfX1NZU0NBTEwoIDUwLCBzeXNfbHN0YXQ2NCwgMikKKyNkZWZpbmUgX19OUl9hdmFpbGFibGU1MQkJCSA1MQorX19TWVNDQUxMKCA1MSwgc3lzX25pX3N5c2NhbGwsIDApCisKKyNkZWZpbmUgX19OUl9mY2htb2QgCQkJCSA1MgorX19TWVNDQUxMKCA1Miwgc3lzX2ZjaG1vZCwgMikKKyNkZWZpbmUgX19OUl9mY2hvd24gCQkJCSA1MworX19TWVNDQUxMKCA1Mywgc3lzX2ZjaG93biwgMykKKyNkZWZpbmUgX19OUl9mc3RhdCAJCQkJIDU0CitfX1NZU0NBTEwoIDU0LCBzeXNfbmV3ZnN0YXQsIDIpCisjZGVmaW5lIF9fTlJfZnN0YXQ2NCAJCQkJIDU1CitfX1NZU0NBTEwoIDU1LCBzeXNfZnN0YXQ2NCwgMikKKworI2RlZmluZSBfX05SX2Zsb2NrIAkJCQkgNTYKK19fU1lTQ0FMTCggNTYsIHN5c19mbG9jaywgMikKKyNkZWZpbmUgX19OUl9hY2Nlc3MgCQkJCSA1NworX19TWVNDQUxMKCA1Nywgc3lzX2FjY2VzcywgMikKKyNkZWZpbmUgX19OUl91bWFzayAJCQkJIDU4CitfX1NZU0NBTEwoIDU4LCBzeXNfdW1hc2ssIDEpCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHMgCQkJCSA1OQorX19TWVNDQUxMKCA1OSwgc3lzX2dldGRlbnRzLCAzKQorI2RlZmluZSBfX05SX2dldGRlbnRzNjQgCQkJIDYwCitfX1NZU0NBTEwoIDYwLCBzeXNfZ2V0ZGVudHM2NCwgMykKKyNkZWZpbmUgX19OUl9mY250bDY0IAkJCQkgNjEKK19fU1lTQ0FMTCggNjEsIHN5c19mY250bDY0LCAzKQorI2RlZmluZSBfX05SX2F2YWlsYWJsZTYyCQkJIDYyCitfX1NZU0NBTEwoIDYyLCBzeXNfbmlfc3lzY2FsbCwgMCkKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjRfNjQgCQkJIDYzCitfX1NZU0NBTEwoIDYzLCBzeXNfZmFkdmlzZTY0XzY0LCA2KQorI2RlZmluZSBfX05SX3V0aW1lCQkJCSA2NAkvKiBnbGliYyAyLjMuMyA/PyAqLworX19TWVNDQUxMKCA2NCwgc3lzX3V0aW1lLCAyKQorI2RlZmluZSBfX05SX3V0aW1lcyAJCQkJIDY1CitfX1NZU0NBTEwoIDY1LCBzeXNfdXRpbWVzLCAyKQorI2RlZmluZSBfX05SX2lvY3RsIAkJCQkgNjYKK19fU1lTQ0FMTCggNjYsIHN5c19pb2N0bCwgMykKKyNkZWZpbmUgX19OUl9mY250bCAJCQkJIDY3CitfX1NZU0NBTEwoIDY3LCBzeXNfZmNudGwsIDMpCisKKyNkZWZpbmUgX19OUl9zZXR4YXR0ciAJCQkJIDY4CitfX1NZU0NBTEwoIDY4LCBzeXNfc2V0eGF0dHIsIDUpCisjZGVmaW5lIF9fTlJfZ2V0eGF0dHIgCQkJCSA2OQorX19TWVNDQUxMKCA2OSwgc3lzX2dldHhhdHRyLCA0KQorI2RlZmluZSBfX05SX2xpc3R4YXR0ciAJCQkJIDcwCitfX1NZU0NBTEwoIDcwLCBzeXNfbGlzdHhhdHRyLCAzKQorI2RlZmluZSBfX05SX3JlbW92ZXhhdHRyIAkJCSA3MQorX19TWVNDQUxMKCA3MSwgc3lzX3JlbW92ZXhhdHRyLCAyKQorI2RlZmluZSBfX05SX2xzZXR4YXR0ciAJCQkJIDcyCitfX1NZU0NBTEwoIDcyLCBzeXNfbHNldHhhdHRyLCA1KQorI2RlZmluZSBfX05SX2xnZXR4YXR0ciAJCQkJIDczCitfX1NZU0NBTEwoIDczLCBzeXNfbGdldHhhdHRyLCA0KQorI2RlZmluZSBfX05SX2xsaXN0eGF0dHIgCQkJIDc0CitfX1NZU0NBTEwoIDc0LCBzeXNfbGxpc3R4YXR0ciwgMykKKyNkZWZpbmUgX19OUl9scmVtb3ZleGF0dHIgCQkJIDc1CitfX1NZU0NBTEwoIDc1LCBzeXNfbHJlbW92ZXhhdHRyLCAyKQorI2RlZmluZSBfX05SX2ZzZXR4YXR0ciAJCQkJIDc2CitfX1NZU0NBTEwoIDc2LCBzeXNfZnNldHhhdHRyLCA1KQorI2RlZmluZSBfX05SX2ZnZXR4YXR0ciAJCQkJIDc3CitfX1NZU0NBTEwoIDc3LCBzeXNfZmdldHhhdHRyLCA0KQorI2RlZmluZSBfX05SX2ZsaXN0eGF0dHIgCQkJIDc4CitfX1NZU0NBTEwoIDc4LCBzeXNfZmxpc3R4YXR0ciwgMykKKyNkZWZpbmUgX19OUl9mcmVtb3ZleGF0dHIgCQkJIDc5CitfX1NZU0NBTEwoIDc5LCBzeXNfZnJlbW92ZXhhdHRyLCAyKQorCisvKiBGaWxlIE1hcCAvIFNoYXJlZCBNZW1vcnkgT3BlcmF0aW9ucyAqLworCisjZGVmaW5lIF9fTlJfbW1hcDIgCQkJCSA4MAorX19TWVNDQUxMKCA4MCwgeHRlbnNhX21tYXAyLCA2KQorI2RlZmluZSBfX05SX211bm1hcCAJCQkJIDgxCitfX1NZU0NBTEwoIDgxLCBzeXNfbXVubWFwLCAyKQorI2RlZmluZSBfX05SX21wcm90ZWN0IAkJCQkgODIKK19fU1lTQ0FMTCggODIsIHN5c19tcHJvdGVjdCwgMykKKyNkZWZpbmUgX19OUl9icmsgCQkJCSA4MworX19TWVNDQUxMKCA4Mywgc3lzX2JyaywgMSkKKyNkZWZpbmUgX19OUl9tbG9jayAJCQkJIDg0CitfX1NZU0NBTEwoIDg0LCBzeXNfbWxvY2ssIDIpCisjZGVmaW5lIF9fTlJfbXVubG9jayAJCQkJIDg1CitfX1NZU0NBTEwoIDg1LCBzeXNfbXVubG9jaywgMikKKyNkZWZpbmUgX19OUl9tbG9ja2FsbCAJCQkJIDg2CitfX1NZU0NBTEwoIDg2LCBzeXNfbWxvY2thbGwsIDEpCisjZGVmaW5lIF9fTlJfbXVubG9ja2FsbCAJCQkgODcKK19fU1lTQ0FMTCggODcsIHN5c19tdW5sb2NrYWxsLCAwKQorI2RlZmluZSBfX05SX21yZW1hcCAJCQkJIDg4CitfX1NZU0NBTEwoIDg4LCBzeXNfbXJlbWFwLCA0KQorI2RlZmluZSBfX05SX21zeW5jIAkJCQkgODkKK19fU1lTQ0FMTCggODksIHN5c19tc3luYywgMykKKyNkZWZpbmUgX19OUl9taW5jb3JlIAkJCQkgOTAKK19fU1lTQ0FMTCggOTAsIHN5c19taW5jb3JlLCAzKQorI2RlZmluZSBfX05SX21hZHZpc2UgCQkJCSA5MQorX19TWVNDQUxMKCA5MSwgc3lzX21hZHZpc2UsIDMpCisjZGVmaW5lIF9fTlJfc2htZ2V0CQkJCSA5MgorX19TWVNDQUxMKCA5Miwgc3lzX3NobWdldCwgNCkKKyNkZWZpbmUgX19OUl9zaG1hdAkJCQkgOTMKK19fU1lTQ0FMTCggOTMsIHh0ZW5zYV9zaG1hdCwgNCkKKyNkZWZpbmUgX19OUl9zaG1jdGwJCQkJIDk0CitfX1NZU0NBTEwoIDk0LCBzeXNfc2htY3RsLCA0KQorI2RlZmluZSBfX05SX3NobWR0CQkJCSA5NQorX19TWVNDQUxMKCA5NSwgc3lzX3NobWR0LCA0KQorCisvKiBTb2NrZXQgT3BlcmF0aW9ucyAqLworCisjZGVmaW5lIF9fTlJfc29ja2V0IAkJCQkgOTYKK19fU1lTQ0FMTCggOTYsIHN5c19zb2NrZXQsIDMpCisjZGVmaW5lIF9fTlJfc2V0c29ja29wdCAJCQkgOTcKK19fU1lTQ0FMTCggOTcsIHN5c19zZXRzb2Nrb3B0LCA1KQorI2RlZmluZSBfX05SX2dldHNvY2tvcHQgCQkJIDk4CitfX1NZU0NBTEwoIDk4LCBzeXNfZ2V0c29ja29wdCwgNSkKKyNkZWZpbmUgX19OUl9zaHV0ZG93biAJCQkJIDk5CitfX1NZU0NBTEwoIDk5LCBzeXNfc2h1dGRvd24sIDIpCisKKyNkZWZpbmUgX19OUl9iaW5kIAkJCQkxMDAKK19fU1lTQ0FMTCgxMDAsIHN5c19iaW5kLCAzKQorI2RlZmluZSBfX05SX2Nvbm5lY3QgCQkJCTEwMQorX19TWVNDQUxMKDEwMSwgc3lzX2Nvbm5lY3QsIDMpCisjZGVmaW5lIF9fTlJfbGlzdGVuIAkJCQkxMDIKK19fU1lTQ0FMTCgxMDIsIHN5c19saXN0ZW4sIDIpCisjZGVmaW5lIF9fTlJfYWNjZXB0IAkJCQkxMDMKK19fU1lTQ0FMTCgxMDMsIHN5c19hY2NlcHQsIDMpCisKKyNkZWZpbmUgX19OUl9nZXRzb2NrbmFtZSAJCQkxMDQKK19fU1lTQ0FMTCgxMDQsIHN5c19nZXRzb2NrbmFtZSwgMykKKyNkZWZpbmUgX19OUl9nZXRwZWVybmFtZSAJCQkxMDUKK19fU1lTQ0FMTCgxMDUsIHN5c19nZXRwZWVybmFtZSwgMykKKyNkZWZpbmUgX19OUl9zZW5kbXNnIAkJCQkxMDYKK19fU1lTQ0FMTCgxMDYsIHN5c19zZW5kbXNnLCAzKQorI2RlZmluZSBfX05SX3JlY3Ztc2cgCQkJCTEwNworX19TWVNDQUxMKDEwNywgc3lzX3JlY3Ztc2csIDMpCisjZGVmaW5lIF9fTlJfc2VuZCAJCQkJMTA4CitfX1NZU0NBTEwoMTA4LCBzeXNfc2VuZCwgNCkKKyNkZWZpbmUgX19OUl9yZWN2IAkJCQkxMDkKK19fU1lTQ0FMTCgxMDksIHN5c19yZWN2LCA0KQorI2RlZmluZSBfX05SX3NlbmR0byAJCQkJMTEwCitfX1NZU0NBTEwoMTEwLCBzeXNfc2VuZHRvLCA2KQorI2RlZmluZSBfX05SX3JlY3Zmcm9tIAkJCQkxMTEKK19fU1lTQ0FMTCgxMTEsIHN5c19yZWN2ZnJvbSwgNikKKworI2RlZmluZSBfX05SX3NvY2tldHBhaXIgCQkJMTEyCitfX1NZU0NBTEwoMTEyLCBzeXNfc29ja2V0cGFpciwgNCkKKyNkZWZpbmUgX19OUl9zZW5kZmlsZSAJCQkJMTEzCitfX1NZU0NBTEwoMTEzLCBzeXNfc2VuZGZpbGUsIDQpCisjZGVmaW5lIF9fTlJfc2VuZGZpbGU2NCAJCQkxMTQKK19fU1lTQ0FMTCgxMTQsIHN5c19zZW5kZmlsZTY0LCA0KQorI2RlZmluZSBfX05SX2F2YWlsYWJsZTExNQkJCTExNQorX19TWVNDQUxMKDExNSwgc3lzX25pX3N5c2NhbGwsIDApCisKKy8qIFByb2Nlc3MgT3BlcmF0aW9ucyAqLworCisjZGVmaW5lIF9fTlJfY2xvbmUgCQkJCTExNgorX19TWVNDQUxMKDExNiwgeHRlbnNhX2Nsb25lLCA1KQorI2RlZmluZSBfX05SX2V4ZWN2ZSAJCQkJMTE3CitfX1NZU0NBTEwoMTE3LCB4dGVuc2FfZXhlY3ZlLCAzKQorI2RlZmluZSBfX05SX2V4aXQgCQkJCTExOAorX19TWVNDQUxMKDExOCwgc3lzX2V4aXQsIDEpCisjZGVmaW5lIF9fTlJfZXhpdF9ncm91cCAJCQkxMTkKK19fU1lTQ0FMTCgxMTksIHN5c19leGl0X2dyb3VwLCAxKQorI2RlZmluZSBfX05SX2dldHBpZCAJCQkJMTIwCitfX1NZU0NBTEwoMTIwLCBzeXNfZ2V0cGlkLCAwKQorI2RlZmluZSBfX05SX3dhaXQ0IAkJCQkxMjEKK19fU1lTQ0FMTCgxMjEsIHN5c193YWl0NCwgNCkKKyNkZWZpbmUgX19OUl93YWl0aWQgCQkJCTEyMgorX19TWVNDQUxMKDEyMiwgc3lzX3dhaXRpZCwgNSkKKyNkZWZpbmUgX19OUl9raWxsIAkJCQkxMjMKK19fU1lTQ0FMTCgxMjMsIHN5c19raWxsLCAyKQorI2RlZmluZSBfX05SX3RraWxsIAkJCQkxMjQKK19fU1lTQ0FMTCgxMjQsIHN5c190a2lsbCwgMikKKyNkZWZpbmUgX19OUl90Z2tpbGwgCQkJCTEyNQorX19TWVNDQUxMKDEyNSwgc3lzX3Rna2lsbCwgMykKKyNkZWZpbmUgX19OUl9zZXRfdGlkX2FkZHJlc3MgCQkJMTI2CitfX1NZU0NBTEwoMTI2LCBzeXNfc2V0X3RpZF9hZGRyZXNzLCAxKQorI2RlZmluZSBfX05SX2dldHRpZCAJCQkJMTI3CitfX1NZU0NBTEwoMTI3LCBzeXNfZ2V0dGlkLCAwKQorI2RlZmluZSBfX05SX3NldHNpZCAJCQkJMTI4CitfX1NZU0NBTEwoMTI4LCBzeXNfc2V0c2lkLCAwKQorI2RlZmluZSBfX05SX2dldHNpZCAJCQkJMTI5CitfX1NZU0NBTEwoMTI5LCBzeXNfZ2V0c2lkLCAxKQorI2RlZmluZSBfX05SX3ByY3RsIAkJCQkxMzAKK19fU1lTQ0FMTCgxMzAsIHN5c19wcmN0bCwgNSkKKyNkZWZpbmUgX19OUl9wZXJzb25hbGl0eSAJCQkxMzEKK19fU1lTQ0FMTCgxMzEsIHN5c19wZXJzb25hbGl0eSwgMSkKKyNkZWZpbmUgX19OUl9nZXRwcmlvcml0eSAJCQkxMzIKK19fU1lTQ0FMTCgxMzIsIHN5c19nZXRwcmlvcml0eSwgMikKKyNkZWZpbmUgX19OUl9zZXRwcmlvcml0eSAJCQkxMzMKK19fU1lTQ0FMTCgxMzMsIHN5c19zZXRwcmlvcml0eSwgMykKKyNkZWZpbmUgX19OUl9zZXRpdGltZXIgCQkJCTEzNAorX19TWVNDQUxMKDEzNCwgc3lzX3NldGl0aW1lciwgMykKKyNkZWZpbmUgX19OUl9nZXRpdGltZXIgCQkJCTEzNQorX19TWVNDQUxMKDEzNSwgc3lzX2dldGl0aW1lciwgMikKKyNkZWZpbmUgX19OUl9zZXR1aWQgCQkJCTEzNgorX19TWVNDQUxMKDEzNiwgc3lzX3NldHVpZCwgMSkKKyNkZWZpbmUgX19OUl9nZXR1aWQgCQkJCTEzNworX19TWVNDQUxMKDEzNywgc3lzX2dldHVpZCwgMCkKKyNkZWZpbmUgX19OUl9zZXRnaWQgCQkJCTEzOAorX19TWVNDQUxMKDEzOCwgc3lzX3NldGdpZCwgMSkKKyNkZWZpbmUgX19OUl9nZXRnaWQgCQkJCTEzOQorX19TWVNDQUxMKDEzOSwgc3lzX2dldGdpZCwgMCkKKyNkZWZpbmUgX19OUl9nZXRldWlkIAkJCQkxNDAKK19fU1lTQ0FMTCgxNDAsIHN5c19nZXRldWlkLCAwKQorI2RlZmluZSBfX05SX2dldGVnaWQgCQkJCTE0MQorX19TWVNDQUxMKDE0MSwgc3lzX2dldGVnaWQsIDApCisjZGVmaW5lIF9fTlJfc2V0cmV1aWQgCQkJCTE0MgorX19TWVNDQUxMKDE0Miwgc3lzX3NldHJldWlkLCAyKQorI2RlZmluZSBfX05SX3NldHJlZ2lkIAkJCQkxNDMKK19fU1lTQ0FMTCgxNDMsIHN5c19zZXRyZWdpZCwgMikKKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQgCQkJCTE0NAorX19TWVNDQUxMKDE0NCwgc3lzX3NldHJlc3VpZCwgMykKKyNkZWZpbmUgX19OUl9nZXRyZXN1aWQgCQkJCTE0NQorX19TWVNDQUxMKDE0NSwgc3lzX2dldHJlc3VpZCwgMykKKyNkZWZpbmUgX19OUl9zZXRyZXNnaWQgCQkJCTE0NgorX19TWVNDQUxMKDE0Niwgc3lzX3NldHJlc2dpZCwgMykKKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQgCQkJCTE0NworX19TWVNDQUxMKDE0Nywgc3lzX2dldHJlc2dpZCwgMykKKyNkZWZpbmUgX19OUl9zZXRwZ2lkIAkJCQkxNDgKK19fU1lTQ0FMTCgxNDgsIHN5c19zZXRwZ2lkLCAyKQorI2RlZmluZSBfX05SX2dldHBnaWQgCQkJCTE0OQorX19TWVNDQUxMKDE0OSwgc3lzX2dldHBnaWQsIDEpCisjZGVmaW5lIF9fTlJfZ2V0cHBpZCAJCQkJMTUwCitfX1NZU0NBTEwoMTUwLCBzeXNfZ2V0cHBpZCwgMCkKKyNkZWZpbmUgX19OUl9hdmFpbGFibGUxNTEJCQkxNTEKK19fU1lTQ0FMTCgxNTEsIHN5c19uaV9zeXNjYWxsLCAwKQorCisjZGVmaW5lIF9fTlJfcmVzZXJ2ZWQxNTIgCQkJMTUyCS8qIHNldF90aHJlYWRfYXJlYSAqLworX19TWVNDQUxMKDE1Miwgc3lzX25pX3N5c2NhbGwsIDApCisjZGVmaW5lIF9fTlJfcmVzZXJ2ZWQxNTMgCQkJMTUzCS8qIGdldF90aHJlYWRfYXJlYSAqLworX19TWVNDQUxMKDE1Mywgc3lzX25pX3N5c2NhbGwsIDApCisjZGVmaW5lIF9fTlJfdGltZXMgCQkJCTE1NAorX19TWVNDQUxMKDE1NCwgc3lzX3RpbWVzLCAxKQorI2RlZmluZSBfX05SX2FjY3QgCQkJCTE1NQorX19TWVNDQUxMKDE1NSwgc3lzX2FjY3QsIDEpCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgCQkJMTU2CitfX1NZU0NBTEwoMTU2LCBzeXNfc2NoZWRfc2V0YWZmaW5pdHksIDMpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgCQkJMTU3CitfX1NZU0NBTEwoMTU3LCBzeXNfc2NoZWRfZ2V0YWZmaW5pdHksIDMpCisjZGVmaW5lIF9fTlJfY2FwZ2V0IAkJCQkxNTgKK19fU1lTQ0FMTCgxNTgsIHN5c19jYXBnZXQsIDIpCisjZGVmaW5lIF9fTlJfY2Fwc2V0IAkJCQkxNTkKK19fU1lTQ0FMTCgxNTksIHN5c19jYXBzZXQsIDIpCisjZGVmaW5lIF9fTlJfcHRyYWNlIAkJCQkxNjAKK19fU1lTQ0FMTCgxNjAsIHN5c19wdHJhY2UsIDQpCisjZGVmaW5lIF9fTlJfc2VtdGltZWRvcAkJCQkxNjEKK19fU1lTQ0FMTCgxNjEsIHN5c19zZW10aW1lZG9wLCA1KQorI2RlZmluZSBfX05SX3NlbWdldAkJCQkxNjIKK19fU1lTQ0FMTCgxNjIsIHN5c19zZW1nZXQsIDQpCisjZGVmaW5lIF9fTlJfc2Vtb3AJCQkJMTYzCitfX1NZU0NBTEwoMTYzLCBzeXNfc2Vtb3AsIDQpCisjZGVmaW5lIF9fTlJfc2VtY3RsCQkJCTE2NAorX19TWVNDQUxMKDE2NCwgc3lzX3NlbWN0bCwgNCkKKyNkZWZpbmUgX19OUl9hdmFpbGFibGUxNjUJCQkxNjUKK19fU1lTQ0FMTCgxNjUsIHN5c19uaV9zeXNjYWxsLCAwKQorI2RlZmluZSBfX05SX21zZ2dldAkJCQkxNjYKK19fU1lTQ0FMTCgxNjYsIHN5c19tc2dnZXQsIDQpCisjZGVmaW5lIF9fTlJfbXNnc25kCQkJCTE2NworX19TWVNDQUxMKDE2Nywgc3lzX21zZ3NuZCwgNCkKKyNkZWZpbmUgX19OUl9tc2dyY3YJCQkJMTY4CitfX1NZU0NBTEwoMTY4LCBzeXNfbXNncmN2LCA0KQorI2RlZmluZSBfX05SX21zZ2N0bAkJCQkxNjkKK19fU1lTQ0FMTCgxNjksIHN5c19tc2djdGwsIDQpCisjZGVmaW5lIF9fTlJfYXZhaWxhYmxlMTcwCQkJMTcwCitfX1NZU0NBTEwoMTcwLCBzeXNfbmlfc3lzY2FsbCwgMCkKKyNkZWZpbmUgX19OUl9hdmFpbGFibGUxNzEJCQkxNzEKK19fU1lTQ0FMTCgxNzEsIHN5c19uaV9zeXNjYWxsLCAwKQorCisvKiBGaWxlIFN5c3RlbSAqLworCisjZGVmaW5lIF9fTlJfbW91bnQgCQkJCTE3MgorX19TWVNDQUxMKDE3Miwgc3lzX21vdW50LCA1KQorI2RlZmluZSBfX05SX3N3YXBvbiAJCQkJMTczCitfX1NZU0NBTEwoMTczLCBzeXNfc3dhcG9uLCAyKQorI2RlZmluZSBfX05SX2Nocm9vdCAJCQkJMTc0CitfX1NZU0NBTEwoMTc0LCBzeXNfY2hyb290LCAxKQorI2RlZmluZSBfX05SX3Bpdm90X3Jvb3QgCQkJMTc1CitfX1NZU0NBTEwoMTc1LCBzeXNfcGl2b3Rfcm9vdCwgMikKKyNkZWZpbmUgX19OUl91bW91bnQgCQkJCTE3NgorX19TWVNDQUxMKDE3Niwgc3lzX3Vtb3VudCwgMikKKyNkZWZpbmUgX19OUl9zd2Fwb2ZmIAkJCQkxNzcKK19fU1lTQ0FMTCgxNzcsIHN5c19zd2Fwb2ZmLCAxKQorI2RlZmluZSBfX05SX3N5bmMgCQkJCTE3OAorX19TWVNDQUxMKDE3OCwgc3lzX3N5bmMsIDApCisjZGVmaW5lIF9fTlJfYXZhaWxhYmxlMTc5CQkJMTc5CitfX1NZU0NBTEwoMTc5LCBzeXNfbmlfc3lzY2FsbCwgMCkKKyNkZWZpbmUgX19OUl9zZXRmc3VpZCAJCQkJMTgwCitfX1NZU0NBTEwoMTgwLCBzeXNfc2V0ZnN1aWQsIDEpCisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQgCQkJCTE4MQorX19TWVNDQUxMKDE4MSwgc3lzX3NldGZzZ2lkLCAxKQorI2RlZmluZSBfX05SX3N5c2ZzIAkJCQkxODIKK19fU1lTQ0FMTCgxODIsIHN5c19zeXNmcywgMykKKyNkZWZpbmUgX19OUl91c3RhdCAJCQkJMTgzCitfX1NZU0NBTEwoMTgzLCBzeXNfdXN0YXQsIDIpCisjZGVmaW5lIF9fTlJfc3RhdGZzIAkJCQkxODQKK19fU1lTQ0FMTCgxODQsIHN5c19zdGF0ZnMsIDIpCisjZGVmaW5lIF9fTlJfZnN0YXRmcyAJCQkJMTg1CitfX1NZU0NBTEwoMTg1LCBzeXNfZnN0YXRmcywgMikKKyNkZWZpbmUgX19OUl9zdGF0ZnM2NCAJCQkJMTg2CitfX1NZU0NBTEwoMTg2LCBzeXNfc3RhdGZzNjQsIDMpCisjZGVmaW5lIF9fTlJfZnN0YXRmczY0IAkJCQkxODcKK19fU1lTQ0FMTCgxODcsIHN5c19mc3RhdGZzNjQsIDMpCisKKy8qIFN5c3RlbSAqLworCisjZGVmaW5lIF9fTlJfc2V0cmxpbWl0IAkJCQkxODgKK19fU1lTQ0FMTCgxODgsIHN5c19zZXRybGltaXQsIDIpCisjZGVmaW5lIF9fTlJfZ2V0cmxpbWl0IAkJCQkxODkKK19fU1lTQ0FMTCgxODksIHN5c19nZXRybGltaXQsIDIpCisjZGVmaW5lIF9fTlJfZ2V0cnVzYWdlIAkJCQkxOTAKK19fU1lTQ0FMTCgxOTAsIHN5c19nZXRydXNhZ2UsIDIpCisjZGVmaW5lIF9fTlJfZnV0ZXgJCQkJMTkxCitfX1NZU0NBTEwoMTkxLCBzeXNfZnV0ZXgsIDUpCisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5IAkJCTE5MgorX19TWVNDQUxMKDE5Miwgc3lzX2dldHRpbWVvZmRheSwgMikKKyNkZWZpbmUgX19OUl9zZXR0aW1lb2ZkYXkgCQkJMTkzCitfX1NZU0NBTEwoMTkzLCBzeXNfc2V0dGltZW9mZGF5LCAyKQorI2RlZmluZSBfX05SX2FkanRpbWV4IAkJCQkxOTQKK19fU1lTQ0FMTCgxOTQsIHN5c19hZGp0aW1leCwgMSkKKyNkZWZpbmUgX19OUl9uYW5vc2xlZXAJIAkJCTE5NQorX19TWVNDQUxMKDE5NSwgc3lzX25hbm9zbGVlcCwgMikKKyNkZWZpbmUgX19OUl9nZXRncm91cHMgCQkJCTE5NgorX19TWVNDQUxMKDE5Niwgc3lzX2dldGdyb3VwcywgMikKKyNkZWZpbmUgX19OUl9zZXRncm91cHMgCQkJCTE5NworX19TWVNDQUxMKDE5Nywgc3lzX3NldGdyb3VwcywgMikKKyNkZWZpbmUgX19OUl9zZXRob3N0bmFtZSAJCQkxOTgKK19fU1lTQ0FMTCgxOTgsIHN5c19zZXRob3N0bmFtZSwgMikKKyNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lIAkJCTE5OQorX19TWVNDQUxMKDE5OSwgc3lzX3NldGRvbWFpbm5hbWUsIDIpCisjZGVmaW5lIF9fTlJfc3lzbG9nIAkJCQkyMDAKK19fU1lTQ0FMTCgyMDAsIHN5c19zeXNsb2csIDMpCisjZGVmaW5lIF9fTlJfdmhhbmd1cCAJCQkJMjAxCitfX1NZU0NBTEwoMjAxLCBzeXNfdmhhbmd1cCwgMCkKKyNkZWZpbmUgX19OUl91c2VsaWIgCQkJCTIwMgorX19TWVNDQUxMKDIwMiwgc3lzX3VzZWxpYiwgMSkKKyNkZWZpbmUgX19OUl9yZWJvb3QgCQkJCTIwMworX19TWVNDQUxMKDIwMywgc3lzX3JlYm9vdCwgMykKKyNkZWZpbmUgX19OUl9xdW90YWN0bCAJCQkJMjA0CitfX1NZU0NBTEwoMjA0LCBzeXNfcXVvdGFjdGwsIDQpCisjZGVmaW5lIF9fTlJfbmZzc2VydmN0bCAJCQkyMDUKK19fU1lTQ0FMTCgyMDUsIHN5c19uZnNzZXJ2Y3RsLCAzKQorI2RlZmluZSBfX05SX19zeXNjdGwgCQkJCTIwNgorX19TWVNDQUxMKDIwNiwgc3lzX3N5c2N0bCwgMSkKKyNkZWZpbmUgX19OUl9iZGZsdXNoIAkJCQkyMDcKK19fU1lTQ0FMTCgyMDcsIHN5c19iZGZsdXNoLCAyKQorI2RlZmluZSBfX05SX3VuYW1lIAkJCQkyMDgKK19fU1lTQ0FMTCgyMDgsIHN5c19uZXd1bmFtZSwgMSkKKyNkZWZpbmUgX19OUl9zeXNpbmZvIAkJCQkyMDkKK19fU1lTQ0FMTCgyMDksIHN5c19zeXNpbmZvLCAxKQorI2RlZmluZSBfX05SX2luaXRfbW9kdWxlIAkJCTIxMAorX19TWVNDQUxMKDIxMCwgc3lzX2luaXRfbW9kdWxlLCAyKQorI2RlZmluZSBfX05SX2RlbGV0ZV9tb2R1bGUgCQkJMjExCitfX1NZU0NBTEwoMjExLCBzeXNfZGVsZXRlX21vZHVsZSwgMSkKKworI2RlZmluZSBfX05SX3NjaGVkX3NldHBhcmFtIAkJCTIxMgorX19TWVNDQUxMKDIxMiwgc3lzX3NjaGVkX3NldHBhcmFtLCAyKQorI2RlZmluZSBfX05SX3NjaGVkX2dldHBhcmFtIAkJCTIxMworX19TWVNDQUxMKDIxMywgc3lzX3NjaGVkX2dldHBhcmFtLCAyKQorI2RlZmluZSBfX05SX3NjaGVkX3NldHNjaGVkdWxlciAJCTIxNAorX19TWVNDQUxMKDIxNCwgc3lzX3NjaGVkX3NldHNjaGVkdWxlciwgMykKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIgCQkyMTUKK19fU1lTQ0FMTCgyMTUsIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIsIDEpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCAJCTIxNgorX19TWVNDQUxMKDIxNiwgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsIDEpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAJCTIxNworX19TWVNDQUxMKDIxNywgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4sIDEpCisjZGVmaW5lIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsIAkJMjE4CitfX1NZU0NBTEwoMjE4LCBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsLCAyKQorI2RlZmluZSBfX05SX3NjaGVkX3lpZWxkIAkJCTIxOQorX19TWVNDQUxMKDIxOSwgc3lzX3NjaGVkX3lpZWxkLCAwKQorI2RlZmluZSBfX05SX3NpZ3JldHVybgkgCQkJMjIyCitfX1NZU0NBTEwoMjIyLCB4dGVuc2Ffc2lncmV0dXJuLCAwKQorCisvKiBTaWduYWwgSGFuZGxpbmcgKi8KKworI2RlZmluZSBfX05SX3Jlc3RhcnRfc3lzY2FsbCAJCQkyMjMKK19fU1lTQ0FMTCgyMjMsIHN5c19yZXN0YXJ0X3N5c2NhbGwsIDApCisjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sgCQkJMjI0CitfX1NZU0NBTEwoMjI0LCB4dGVuc2Ffc2lnYWx0c3RhY2ssIDIpCisjZGVmaW5lIF9fTlJfcnRfc2lncmV0dXJuIAkJCTIyNQorX19TWVNDQUxMKDIyNSwgeHRlbnNhX3J0X3NpZ3JldHVybiwgMSkKKyNkZWZpbmUgX19OUl9ydF9zaWdhY3Rpb24gCQkJMjI2CitfX1NZU0NBTEwoMjI2LCBzeXNfcnRfc2lnYWN0aW9uLCA0KQorI2RlZmluZSBfX05SX3J0X3NpZ3Byb2NtYXNrIAkJCTIyNworX19TWVNDQUxMKDIyNywgc3lzX3J0X3NpZ3Byb2NtYXNrLCA0KQorI2RlZmluZSBfX05SX3J0X3NpZ3BlbmRpbmcgCQkJMjI4CitfX1NZU0NBTEwoMjI4LCBzeXNfcnRfc2lncGVuZGluZywgMikKKyNkZWZpbmUgX19OUl9ydF9zaWd0aW1lZHdhaXQgCQkJMjI5CitfX1NZU0NBTEwoMjI5LCBzeXNfcnRfc2lndGltZWR3YWl0LCA0KQorI2RlZmluZSBfX05SX3J0X3NpZ3F1ZXVlaW5mbyAJCQkyMzAKK19fU1lTQ0FMTCgyMzAsIHN5c19ydF9zaWdxdWV1ZWluZm8sIDMpCisjZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZCAJCQkyMzEKK19fU1lTQ0FMTCgyMzEsIHh0ZW5zYV9ydF9zaWdzdXNwZW5kLCAyKQorCisvKiBNZXNzYWdlICovCisKKyNkZWZpbmUgX19OUl9tcV9vcGVuIAkJCQkyMzIKK19fU1lTQ0FMTCgyMzIsIHN5c19tcV9vcGVuLCA0KQorI2RlZmluZSBfX05SX21xX3VubGluayAJCQkJMjMzCitfX1NZU0NBTEwoMjMzLCBzeXNfbXFfdW5saW5rLCAxKQorI2RlZmluZSBfX05SX21xX3RpbWVkc2VuZCAJCQkyMzQKK19fU1lTQ0FMTCgyMzQsIHN5c19tcV90aW1lZHNlbmQsIDUpCisjZGVmaW5lIF9fTlJfbXFfdGltZWRyZWNlaXZlIAkJCTIzNQorX19TWVNDQUxMKDIzNSwgc3lzX21xX3RpbWVkcmVjZWl2ZSwgNSkKKyNkZWZpbmUgX19OUl9tcV9ub3RpZnkgCQkJCTIzNgorX19TWVNDQUxMKDIzNiwgc3lzX21xX25vdGlmeSwgMikKKyNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyIAkJCTIzNworX19TWVNDQUxMKDIzNywgc3lzX21xX2dldHNldGF0dHIsIDMpCisjZGVmaW5lIF9fTlJfYXZhaWxhYmxlMjM4CQkJMjM4CitfX1NZU0NBTEwoMjM4LCBzeXNfbmlfc3lzY2FsbCwgMCkKKworLyogSU8gKi8KKworI2RlZmluZSBfX05SX2lvX3NldHVwIAkJCQkyMzkKK19fU1lTQ0FMTCgyMzksIHN5c19pb19zZXR1cCwgMikKKyNkZWZpbmUgX19OUl9pb19kZXN0cm95IAkJCTI0MAorX19TWVNDQUxMKDI0MCwgc3lzX2lvX2Rlc3Ryb3ksIDEpCisjZGVmaW5lIF9fTlJfaW9fc3VibWl0IAkJCQkyNDEKK19fU1lTQ0FMTCgyNDEsIHN5c19pb19zdWJtaXQsIDMpCisjZGVmaW5lIF9fTlJfaW9fZ2V0ZXZlbnRzIAkJCTI0MgorX19TWVNDQUxMKDI0Miwgc3lzX2lvX2dldGV2ZW50cywgNSkKKyNkZWZpbmUgX19OUl9pb19jYW5jZWwgCQkJCTI0MworX19TWVNDQUxMKDI0Mywgc3lzX2lvX2NhbmNlbCwgMykKKyNkZWZpbmUgX19OUl9jbG9ja19zZXR0aW1lIAkJCTI0NAorX19TWVNDQUxMKDI0NCwgc3lzX2Nsb2NrX3NldHRpbWUsIDIpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0dGltZSAJCQkyNDUKK19fU1lTQ0FMTCgyNDUsIHN5c19jbG9ja19nZXR0aW1lLCAyKQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHJlcyAJCQkyNDYKK19fU1lTQ0FMTCgyNDYsIHN5c19jbG9ja19nZXRyZXMsIDIpCisjZGVmaW5lIF9fTlJfY2xvY2tfbmFub3NsZWVwIAkJCTI0NworX19TWVNDQUxMKDI0Nywgc3lzX2Nsb2NrX25hbm9zbGVlcCwgNCkKKworLyogVGltZXIgKi8KKworI2RlZmluZSBfX05SX3RpbWVyX2NyZWF0ZSAJCQkyNDgKK19fU1lTQ0FMTCgyNDgsIHN5c190aW1lcl9jcmVhdGUsIDMpCisjZGVmaW5lIF9fTlJfdGltZXJfZGVsZXRlIAkJCTI0OQorX19TWVNDQUxMKDI0OSwgc3lzX3RpbWVyX2RlbGV0ZSwgMSkKKyNkZWZpbmUgX19OUl90aW1lcl9zZXR0aW1lIAkJCTI1MAorX19TWVNDQUxMKDI1MCwgc3lzX3RpbWVyX3NldHRpbWUsIDQpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0dGltZSAJCQkyNTEKK19fU1lTQ0FMTCgyNTEsIHN5c190aW1lcl9nZXR0aW1lLCAyKQorI2RlZmluZSBfX05SX3RpbWVyX2dldG92ZXJydW4gCQkJMjUyCitfX1NZU0NBTEwoMjUyLCBzeXNfdGltZXJfZ2V0b3ZlcnJ1biwgMSkKKworLyogU3lzdGVtICovCisKKyNkZWZpbmUgX19OUl9yZXNlcnZlZDI0NCAJCQkyNTMKK19fU1lTQ0FMTCgyNTMsIHN5c19uaV9zeXNjYWxsLCAwKQorI2RlZmluZSBfX05SX2xvb2t1cF9kY29va2llIAkJCTI1NAorX19TWVNDQUxMKDI1NCwgc3lzX2xvb2t1cF9kY29va2llLCA0KQorI2RlZmluZSBfX05SX2F2YWlsYWJsZTI1NQkJCTI1NQorX19TWVNDQUxMKDI1NSwgc3lzX25pX3N5c2NhbGwsIDApCisjZGVmaW5lIF9fTlJfYWRkX2tleSAJCQkJMjU2CitfX1NZU0NBTEwoMjU2LCBzeXNfYWRkX2tleSwgNSkKKyNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleSAJCQkyNTcKK19fU1lTQ0FMTCgyNTcsIHN5c19yZXF1ZXN0X2tleSwgNSkKKyNkZWZpbmUgX19OUl9rZXljdGwgCQkJCTI1OAorX19TWVNDQUxMKDI1OCwgc3lzX2tleWN0bCwgNSkKKyNkZWZpbmUgX19OUl9hdmFpbGFibGUyNTkJCQkyNTkKK19fU1lTQ0FMTCgyNTksIHN5c19uaV9zeXNjYWxsLCAwKQorCisjZGVmaW5lIF9fTlJfc3lzY2FsbF9jb3VudAkJCTI2MQorCisvKgorICogc3lzeHRlbnNhIHN5c2NhbGwgaGFuZGxlcgorICoKKyAqIGludCBzeXN4dGVuc2EgKFNZU19YVEVOU0FfQVRPTUlDX1NFVCwgICAgIHB0ciwgdmFsLCAgICB1bnVzZWQpOworICogaW50IHN5c3h0ZW5zYSAoU1lTX1hURU5TQV9BVE9NSUNfQURELCAgICAgcHRyLCB2YWwsICAgIHVudXNlZCk7CisgKiBpbnQgc3lzeHRlbnNhIChTWVNfWFRFTlNBX0FUT01JQ19FWEdfQURELCBwdHIsIHZhbCwgICAgdW51c2VkKTsKKyAqIGludCBzeXN4dGVuc2EgKFNZU19YVEVOU0FfQVRPTUlDX0NNUF9TV1AsIHB0ciwgb2xkdmFsLCBuZXd2YWwpOworICogICAgICAgIGEyICAgICAgICAgICAgYTYgICAgICAgICAgICAgICAgICAgYTMgICAgYTQgICAgICBhNQorICovCisKKyNkZWZpbmUgU1lTX1hURU5TQV9SRVNFUlZFRCAgICAgICAgICAgICAgIDAgICAgIC8qIGRvbid0IHVzZSB0aGlzICovCisjZGVmaW5lIFNZU19YVEVOU0FfQVRPTUlDX1NFVCAgICAgICAgICAgICAxICAgICAvKiBzZXQgdmFyaWFibGUgKi8KKyNkZWZpbmUgU1lTX1hURU5TQV9BVE9NSUNfRVhHX0FERCAgICAgICAgIDIgICAgIC8qIGV4Y2hhbmdlIG1lbW9yeSBhbmQgYWRkICovCisjZGVmaW5lIFNZU19YVEVOU0FfQVRPTUlDX0FERCAgICAgICAgICAgICAzICAgICAvKiBhZGQgdG8gbWVtb3J5ICovCisjZGVmaW5lIFNZU19YVEVOU0FfQVRPTUlDX0NNUF9TV1AgICAgICAgICA0ICAgICAvKiBjb21wYXJlIGFuZCBzd2FwICovCisKKyNkZWZpbmUgU1lTX1hURU5TQV9DT1VOVCAgICAgICAgICAgICAgICAgIDUgICAgIC8qIGNvdW50ICovCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotCi0jZGVmaW5lIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgcmVzKSByZXR1cm4gKCh0eXBlKShyZXMpKQotCi0vKiBUZW5zaWxpY2EncyB4dC14Y2MgY29tcGlsZXIgaXMgbXVjaCBtb3JlIGFncmVzc2l2ZSBhdCBjb2RlCi0gKiBvcHRpbWl6YXRpb24gdGhhbiBnY2MuICBNdWx0aXBsZSBfX2FzbV9fIHN0YXRlbWVudHMgYXJlCi0gKiBpbnN1ZmZpY2llbnQgZm9yIHh0LXhjYyBiZWNhdXNlIHN1YnNlcXVlbnQgb3B0aW1pemF0aW9uIHBhc3NlcwotICogKGJleW9uZCB0aGUgZnJvbnQtZW5kIHRoYXQga25vd3Mgb2YgX19hc21fXyBzdGF0ZW1lbnRzIGFuZCBvdGhlcgotICogc3VjaCBHTlUgRXh0ZW5zaW9ucyB0byBDKSBjYW4gbW9kaWZ5IHRoZSByZWdpc3RlciBzZWxlY3Rpb24gZm9yCi0gKiBjb250YWlubWVudCBvZiBDIHZhcmlhYmxlcy4KLSAqCi0gKiB4dC14Y2MgY2Fubm90IG1vZGlmeSB0aGUgY29udGVudHMgb2YgYSBzaW5nbGUgX19hc21fXyBzdGF0ZW1lbnQsIHNvCi0gKiB3ZSBjcmVhdGUgc2luZ2xlLWFzbSB2ZXJzaW9ucyBvZiB0aGUgc3lzY2FsbCBtYWNyb3MgdGhhdCBhcmUKLSAqIHN1aXRhYmxlIGFuZCBvcHRpbWFsIGZvciBib3RoIHh0LXhjYyBhbmQgZ2NjLgotICoKLSAqIExpbnV4IHRha2VzIHN5c3RlbS1jYWxsIGFyZ3VtZW50cyBpbiByZWdpc3RlcnMuICBUaGUgZm9sbG93aW5nCi0gKiBkZXNpZ24gaXMgb3B0aW1pemVkIGZvciB1c2VyLWxhbmQgYXBwcyAoZS5nLiwgZ2xpYmMpIHdoaWNoCi0gKiB0eXBpY2FsbHkgaGF2ZSBhIGZ1bmN0aW9uIHdyYXBwZXIgYXJvdW5kIHRoZSAic3lzY2FsbCIgYXNzZW1ibHkKLSAqIGluc3RydWN0aW9uLiAgSXQgc2F0aXNmaWVzIHRoZSBYdGVuc2EgQUJJIHdoaWxlIG1pbml6aW5nIGFyZ3VtZW50Ci0gKiBzaGlmdGluZy4KLSAqCi0gKiBUaGUgWHRlbnNhIEFCSSBhbmQgc29mdHdhcmUgY29udmVudGlvbnMgcmVxdWlyZSB0aGUgc3lzdGVtLWNhbGwKLSAqIG51bWJlciBpbiBhMi4gIElmIGFuIGFyZ3VtZW50IGV4aXN0cyBpbiBhMiwgd2UgbW92ZSBpdCB0byB0aGUgbmV4dAotICogYXZhaWxhYmxlIHJlZ2lzdGVyLiAgTm90ZSB0aGF0IGZvciBpbXByb3ZlZCBlZmZpY2llbmN5LCB3ZSBkbyBOT1QKLSAqIHNoaWZ0IGFsbCBwYXJhbWV0ZXJzIGRvd24gb25lIHJlZ2lzdGVyIHRvIG1haW50YWluIHRoZSBvcmlnaW5hbAotICogb3JkZXIuCi0gKgotICogQXQgYmVzdCBjYXNlICh6ZXJvIGFyZ3VtZW50cyksIHdlIGp1c3Qgd3JpdGUgdGhlIHN5c2NhbGwgbnVtYmVyIHRvCi0gKiBhMi4gIEF0IHdvcnN0IGNhc2UgKDEgdG8gNiBhcmd1bWVudHMpLCB3ZSBtb3ZlIHRoZSBhcmd1bWVudCBpbiBhMgotICogdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJlZ2lzdGVyLCB0aGVuIHdyaXRlIHRoZSBzeXNjYWxsIG51bWJlciB0bwotICogYTIuCi0gKgotICogRm9yIGNsYXJpdHksIHRoZSBmb2xsb3dpbmcgdHJ1dGggdGFibGUgZW51bWVyYXRlcyBhbGwgcG9zc2liaWxpdGllcy4KLSAqCi0gKiBhcmd1bWVudHMJc3lzY2FsbCBudW1iZXIJYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNQotICogLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCTAJICAgICAgYTIKLSAqCTEJICAgICAgYTIJYTMKLSAqCTIJICAgICAgYTIJYTQsICAgYTMKLSAqCTMJICAgICAgYTIJYTUsICAgYTMsICAgYTQKLSAqCTQJICAgICAgYTIJYTYsICAgYTMsICAgYTQsICAgYTUKLSAqCTUJICAgICAgYTIJYTcsICAgYTMsICAgYTQsICAgYTUsICAgYTYKLSAqCTYJICAgICAgYTIJYTgsICAgYTMsICAgYTQsICAgYTUsICAgYTYsICAgYTcKLSAqLwotCi0jZGVmaW5lIF9zeXNjYWxsMCh0eXBlLG5hbWUpIFwKLXR5cGUgbmFtZSh2b2lkKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICggXAotCSIgIG1vdmkgIGEyLCAlMSBcbiIgXAotCSIgIHN5c2NhbGwgICAgICBcbiIgXAotCSIgIG1vdiAgICUwLCBhMiBcbiIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICJpIiAoX19OUl8jI25hbWUpIFwKLQk6ICJhMiIgXAotCSk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDEodHlwZSxuYW1lLHR5cGUwLGFyZzApIFwKLXR5cGUgbmFtZSh0eXBlMCBhcmcwKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICggXAotCSIgIG1vdiAgIGEzLCAlMiBcbiIgXAotCSIgIG1vdmkgIGEyLCAlMSBcbiIgXAotCSIgIHN5c2NhbGwgICAgICBcbiIgXAotCSIgIG1vdiAgICUwLCBhMiBcbiIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICJpIiAoX19OUl8jI25hbWUpLCAiYSIgKGFyZzApIFwKLQk6ICJhMiIsICJhMyIgXAotCSk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDIodHlwZSxuYW1lLHR5cGUwLGFyZzAsdHlwZTEsYXJnMSkgXAotdHlwZSBuYW1lKHR5cGUwIGFyZzAsdHlwZTEgYXJnMSkgXAoteyBcCi1sb25nIF9fcmVzOyBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKLQkiICBtb3YgICBhNCwgJTIgXG4iIFwKLQkiICBtb3YgICBhMywgJTMgXG4iIFwKLQkiICBtb3ZpICBhMiwgJTEgXG4iIFwKLQkiICBzeXNjYWxsICAgICAgXG4iIFwKLQkiICBtb3YgICAlMCwgYTIgXG4iIFwKLQk6ICI9YSIgKF9fcmVzKSBcCi0JOiAiaSIgKF9fTlJfIyNuYW1lKSwgImEiIChhcmcwKSwgImEiIChhcmcxKSBcCi0JOiAiYTIiLCAiYTMiLCAiYTQiIFwKLQkpOyBcCi1fX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCi19Ci0KLSNkZWZpbmUgX3N5c2NhbGwzKHR5cGUsbmFtZSx0eXBlMCxhcmcwLHR5cGUxLGFyZzEsdHlwZTIsYXJnMikgXAotdHlwZSBuYW1lKHR5cGUwIGFyZzAsdHlwZTEgYXJnMSx0eXBlMiBhcmcyKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICggXAotCSIgIG1vdiAgIGE1LCAlMiBcbiIgXAotCSIgIG1vdiAgIGE0LCAlNCBcbiIgXAotCSIgIG1vdiAgIGEzLCAlMyBcbiIgXAotCSIgIG1vdmkgIGEyLCAlMSBcbiIgXAotCSIgIHN5c2NhbGwgICAgICBcbiIgXAotCSIgIG1vdiAgICUwLCBhMiBcbiIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICJpIiAoX19OUl8jI25hbWUpLCAiYSIgKGFyZzApLCAiYSIgKGFyZzEpLCAiYSIgKGFyZzIpIFwKLQk6ICJhMiIsICJhMyIsICJhNCIsICJhNSIgXAotCSk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotI2RlZmluZSBfc3lzY2FsbDQodHlwZSxuYW1lLHR5cGUwLGFyZzAsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMpIFwKLXR5cGUgbmFtZSh0eXBlMCBhcmcwLHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczKSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICggXAotCSIgIG1vdiAgIGE2LCAlMiBcbiIgXAotCSIgIG1vdiAgIGE1LCAlNSBcbiIgXAotCSIgIG1vdiAgIGE0LCAlNCBcbiIgXAotCSIgIG1vdiAgIGEzLCAlMyBcbiIgXAotCSIgIG1vdmkgIGEyLCAlMSBcbiIgXAotCSIgIHN5c2NhbGwgICAgICBcbiIgXAotCSIgIG1vdiAgICUwLCBhMiBcbiIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICJpIiAoX19OUl8jI25hbWUpLCAiYSIgKGFyZzApLCAiYSIgKGFyZzEpLCAiYSIgKGFyZzIpLCAiYSIgKGFyZzMpIFwKLQk6ICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJhNiIgXAotCSk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KLQotLyogTm90ZSB0aGF0IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGE3IGZyYW1lIHBvaW50ZXIuCi0gKiBJbmNsdWRpbmcgYTcgaW4gdGhlIGNsb2JiZXIgbGlzdCBkb2Vzbid0IGRvIHdoYXQgeW91J2QgZXhwZWN0LgotICovCi0jZGVmaW5lIF9zeXNjYWxsNSh0eXBlLG5hbWUsdHlwZTAsYXJnMCx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0KSBcCi10eXBlIG5hbWUodHlwZTAgYXJnMCx0eXBlMSBhcmcxLHR5cGUyIGFyZzIsdHlwZTMgYXJnMyx0eXBlNCBhcmc0KSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICggXAotCSIgIG1vdiAgIGE5LCBhNyBcbiIgXAotCSIgIG1vdiAgIGE3LCAlMiBcbiIgXAotCSIgIG1vdiAgIGE2LCAlNiBcbiIgXAotCSIgIG1vdiAgIGE1LCAlNSBcbiIgXAotCSIgIG1vdiAgIGE0LCAlNCBcbiIgXAotCSIgIG1vdiAgIGEzLCAlMyBcbiIgXAotCSIgIG1vdmkgIGEyLCAlMSBcbiIgXAotCSIgIHN5c2NhbGwgICAgICBcbiIgXAotCSIgIG1vdiAgIGE3LCBhOSBcbiIgXAotCSIgIG1vdiAgICUwLCBhMiBcbiIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICJpIiAoX19OUl8jI25hbWUpLCAiYSIgKGFyZzApLCAiYSIgKGFyZzEpLCAiYSIgKGFyZzIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiAoYXJnMyksICJhIiAoYXJnNCkgXAotCTogImEyIiwgImEzIiwgImE0IiwgImE1IiwgImE2IiwgImE5IiBcCi0JKTsgXAotX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAotfQotCi0vKiBOb3RlIHRoYXQgd2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgYTcgZnJhbWUgcG9pbnRlci4KLSAqIEluY2x1ZGluZyBhNyBpbiB0aGUgY2xvYmJlciBsaXN0IGRvZXNuJ3QgZG8gd2hhdCB5b3UnZCBleHBlY3QuCi0gKi8KLSNkZWZpbmUgX3N5c2NhbGw2KHR5cGUsbmFtZSx0eXBlMCxhcmcwLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsdHlwZTUsYXJnNSkgXAotdHlwZSBuYW1lKHR5cGUwIGFyZzAsdHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMsdHlwZTQgYXJnNCx0eXBlNSBhcmc1KSBcCi17IFwKLWxvbmcgX19yZXM7IFwKLV9fYXNtX18gX192b2xhdGlsZV9fICggXAotCSIgIG1vdiAgIGE5LCBhNyBcbiIgXAotCSIgIG1vdiAgIGE4LCAlMiBcbiIgXAotCSIgIG1vdiAgIGE3LCAlNyBcbiIgXAotCSIgIG1vdiAgIGE2LCAlNiBcbiIgXAotCSIgIG1vdiAgIGE1LCAlNSBcbiIgXAotCSIgIG1vdiAgIGE0LCAlNCBcbiIgXAotCSIgIG1vdiAgIGEzLCAlMyBcbiIgXAotCSIgIG1vdmkgIGEyLCAlMSBcbiIgXAotCSIgIHN5c2NhbGwgICAgICBcbiIgXAotCSIgIG1vdiAgIGE3LCBhOSBcbiIgXAotCSIgIG1vdiAgICUwLCBhMiBcbiIgXAotCTogIj1hIiAoX19yZXMpIFwKLQk6ICJpIiAoX19OUl8jI25hbWUpLCAiYSIgKGFyZzApLCAiYSIgKGFyZzEpLCAiYSIgKGFyZzIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiAoYXJnMyksICJhIiAoYXJnNCksICJhIiAoYXJnNSkgIFwKLQk6ICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJhNiIsICJhOCIsICJhOSIgXAotCSk7IFwKLV9fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKLX0KIAogLyoKICAqICJDb25kaXRpb25hbCIgc3lzY2FsbHMKQEAgLTQxNCw2ICs2MTEsOSBAQAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVVRJTUUKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0xMU0VFSwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHU1VTUEVORAorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJLyogX1hURU5TQV9VTklTVERfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1mc2YvY29yZS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjMzNzYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL2NvcmUuaApAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIFh0ZW5zYSBwcm9jZXNzb3IgY29yZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0NPUkVfSAorI2RlZmluZSBfWFRFTlNBX0NPUkVfSAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICAgIFBhcmFtZXRlcnMgVXNlZnVsIGZvciBBbnkgQ29kZSwgVVNFUiBvciBQUklWSUxFR0VECisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBOb3RlOiAgTWFjcm9zIG9mIHRoZSBmb3JtIFhDSEFMX0hBVkVfKioqIGhhdmUgYSB2YWx1ZSBvZiAxIGlmIHRoZSBvcHRpb24gaXMKKyAqICBjb25maWd1cmVkLCBhbmQgYSB2YWx1ZSBvZiAwIG90aGVyd2lzZS4gIFRoZXNlIG1hY3JvcyBhcmUgYWx3YXlzIGRlZmluZWQuCisgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlJU0EKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9CRQkJCTEJLyogYmlnLWVuZGlhbiBieXRlIG9yZGVyaW5nICovCisjZGVmaW5lIFhDSEFMX0hBVkVfV0lORE9XRUQJCTEJLyogd2luZG93ZWQgcmVnaXN0ZXJzIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9OVU1fQVJFR1MJCQk2NAkvKiBudW0gb2YgcGh5c2ljYWwgYWRkciByZWdzICovCisjZGVmaW5lIFhDSEFMX05VTV9BUkVHU19MT0cyCQk2CS8qIGxvZzIoWENIQUxfTlVNX0FSRUdTKSAqLworI2RlZmluZSBYQ0hBTF9NQVhfSU5TVFJVQ1RJT05fU0laRQkzCS8qIG1heCBpbnN0ciBieXRlcyAoMy4uOCkgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERUJVRwkJMQkvKiBkZWJ1ZyBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERU5TSVRZCQkxCS8qIDE2LWJpdCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9MT09QUwkJMQkvKiB6ZXJvLW92ZXJoZWFkIGxvb3BzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTlNBCQkJMQkvKiBOU0EvTlNBVSBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NSU5NQVgJCTAJLyogTUlOL01BWCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9TRVhUCQkJMAkvKiBTRVhUIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ0xBTVBTCQkwCS8qIENMQU1QUyBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01VTDE2CQkwCS8qIE1VTDE2Uy9NVUwxNlUgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTVVMMzIJCTAJLyogTVVMTCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01VTDMyX0hJR0gJCTAJLyogTVVMVUgvTVVMU0ggaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTDMyUgkJCTEJLyogTDMyUiBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0FCU09MVVRFX0xJVEVSQUxTCTEJLyogbm9uLVBDLXJlbCAoZXh0ZW5kZWQpIEwzMlIgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9DT05TVDE2CQkwCS8qIENPTlNUMTYgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9BRERYCQkJMQkvKiBBRERYIy9TVUJYIyBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9XSURFX0JSQU5DSEVTCTAJLyogQiouVzE4IG9yIEIqLlcxNSBpbnN0cidzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUFJFRElDVEVEX0JSQU5DSEVTCTAJLyogQltFUS9FUVovTkUvTkVaXVQgaW5zdHIncyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0NBTEw0QU5EMTIJCTEJLyogKG9ic29sZXRlIG9wdGlvbikgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9BQlMJCQkxCS8qIEFCUyBpbnN0cnVjdGlvbiAqLworLyojZGVmaW5lIFhDSEFMX0hBVkVfUE9QQwkJMCovCS8qIFBPUEMgaW5zdHJ1Y3Rpb24gKi8KKy8qI2RlZmluZSBYQ0hBTF9IQVZFX0NSQwkJMCovCS8qIENSQyBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1JFTEVBU0VfU1lOQwkJMAkvKiBMMzJBSS9TMzJSSSBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9TMzJDMUkJCTAJLyogUzMyQzFJIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfU1BFQ1VMQVRJT04JCTAJLyogc3BlY3VsYXRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GVUxMX1JFU0VUCQkxCS8qIGFsbCByZWdzL3N0YXRlIHJlc2V0ICovCisjZGVmaW5lIFhDSEFMX05VTV9DT05URVhUUwkJMQkvKiAqLworI2RlZmluZSBYQ0hBTF9OVU1fTUlTQ19SRUdTCQkyCS8qIG51bSBvZiBzY3JhdGNoIHJlZ3MgKDAuLjQpICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVEFQX01BU1RFUgkJMAkvKiBKVEFHIFRBUCBjb250cm9sIGluc3RyJ3MgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9QUklECQkJMQkvKiBwcm9jZXNzb3IgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9USFJFQURQVFIJCTEJLyogVEhSRUFEUFRSIHJlZ2lzdGVyICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQk9PTEVBTlMJCTAJLyogYm9vbGVhbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9DUAkJCTAJLyogQ1BFTkFCTEUgcmVnIChjb3Byb2Nlc3NvcikgKi8KKyNkZWZpbmUgWENIQUxfQ1BfTUFYQ0ZHCQkJMAkvKiBtYXggYWxsb3dlZCBjcCBpZCBwbHVzIG9uZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01BQzE2CQkwCS8qIE1BQzE2IHBhY2thZ2UgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9WRUNUT1JGUFUyMDA1CTAJLyogdmVjdG9yIGZsb2F0aW5nLXBvaW50IHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZQCQkJMAkvKiBmbG9hdGluZyBwb2ludCBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9WRUNUUkExCQkwCS8qIFZlY3RyYSBJICBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9WRUNUUkFMWAkJMAkvKiBWZWN0cmEgTFggcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSTIJCTAJLyogSGlGaTIgQXVkaW8gRW5naW5lIHBrZyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCU1JU0MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfTlVNX1dSSVRFQlVGRkVSX0VOVFJJRVMJNAkvKiBzaXplIG9mIHdyaXRlIGJ1ZmZlciAqLworI2RlZmluZSBYQ0hBTF9JTlNUX0ZFVENIX1dJRFRICQk0CS8qIGluc3RyLWZldGNoIHdpZHRoIGluIGJ5dGVzICovCisjZGVmaW5lIFhDSEFMX0RBVEFfV0lEVEgJCTQJLyogZGF0YSB3aWR0aCBpbiBieXRlcyAqLworLyogIEluIFQxMDUwLCBhcHBsaWVzIHRvIHNlbGVjdGVkIGNvcmUgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIChzZWUgSVNBKTogKi8KKyNkZWZpbmUgWENIQUxfVU5BTElHTkVEX0xPQURfRVhDRVBUSU9OCTEJLyogdW5hbGlnbmVkIGxvYWRzIGNhdXNlIGV4Yy4gKi8KKyNkZWZpbmUgWENIQUxfVU5BTElHTkVEX1NUT1JFX0VYQ0VQVElPTgkxCS8qIHVuYWxpZ25lZCBzdG9yZXMgY2F1c2UgZXhjLiovCisKKyNkZWZpbmUgWENIQUxfQ09SRV9JRAkJCSJmc2YiCS8qIGFscGhhbnVtIGNvcmUgbmFtZQorCQkJCQkJICAgKENvcmVJRCkgc2V0IGluIHRoZSBYdGVuc2EKKwkJCQkJCSAgIFByb2Nlc3NvciBHZW5lcmF0b3IgKi8KKworI2RlZmluZSBYQ0hBTF9CVUlMRF9VTklRVUVfSUQJCTB4MDAwMDY3MDAJLyogMjItYml0IHN3IGJ1aWxkIElEICovCisKKy8qCisgKiAgVGhlc2UgZGVmaW5pdGlvbnMgZGVzY3JpYmUgdGhlIGhhcmR3YXJlIHRhcmdldGVkIGJ5IHRoaXMgc29mdHdhcmUuCisgKi8KKyNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQwCQkweEMxMDNDM0ZGCS8qIENvbmZpZ0lEIGhpIDMyIGJpdHMqLworI2RlZmluZSBYQ0hBTF9IV19DT05GSUdJRDEJCTB4MEMwMDY3MDAJLyogQ29uZmlnSUQgbG8gMzIgYml0cyovCisjZGVmaW5lIFhDSEFMX0hXX1ZFUlNJT05fTkFNRQkJIkxYMi4wLjAiCS8qIGZ1bGwgdmVyc2lvbiBuYW1lICovCisjZGVmaW5lIFhDSEFMX0hXX1ZFUlNJT05fTUFKT1IJCTIyMDAJLyogbWFqb3IgdmVyIyBvZiB0YXJnZXRlZCBodyAqLworI2RlZmluZSBYQ0hBTF9IV19WRVJTSU9OX01JTk9SCQkwCS8qIG1pbm9yIHZlciMgb2YgdGFyZ2V0ZWQgaHcgKi8KKyNkZWZpbmUgWFRIQUxfSFdfUkVMX0xYMgkJMQorI2RlZmluZSBYVEhBTF9IV19SRUxfTFgyXzAJCTEKKyNkZWZpbmUgWFRIQUxfSFdfUkVMX0xYMl8wXzAJCTEKKyNkZWZpbmUgWENIQUxfSFdfQ09ORklHSURfUkVMSUFCTEUJMQorLyogIElmIHNvZnR3YXJlIHRhcmdldHMgYSAqcmFuZ2UqIG9mIGhhcmR3YXJlIHZlcnNpb25zLCB0aGVzZSBhcmUgdGhlIGJvdW5kczogKi8KKyNkZWZpbmUgWENIQUxfSFdfTUlOX1ZFUlNJT05fTUFKT1IJMjIwMAkvKiBtYWpvciB2IG9mIGVhcmxpZXN0IHRndCBodyAqLworI2RlZmluZSBYQ0hBTF9IV19NSU5fVkVSU0lPTl9NSU5PUgkwCS8qIG1pbm9yIHYgb2YgZWFybGllc3QgdGd0IGh3ICovCisjZGVmaW5lIFhDSEFMX0hXX01BWF9WRVJTSU9OX01BSk9SCTIyMDAJLyogbWFqb3IgdiBvZiBsYXRlc3QgdGd0IGh3ICovCisjZGVmaW5lIFhDSEFMX0hXX01BWF9WRVJTSU9OX01JTk9SCTAJLyogbWlub3IgdiBvZiBsYXRlc3QgdGd0IGh3ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJQ0FDSEUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfSUNBQ0hFX0xJTkVTSVpFCQkxNgkvKiBJLWNhY2hlIGxpbmUgc2l6ZSBpbiBieXRlcyAqLworI2RlZmluZSBYQ0hBTF9EQ0FDSEVfTElORVNJWkUJCTE2CS8qIEQtY2FjaGUgbGluZSBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIFhDSEFMX0lDQUNIRV9MSU5FV0lEVEgJCTQJLyogbG9nMihJIGxpbmUgc2l6ZSBpbiBieXRlcykgKi8KKyNkZWZpbmUgWENIQUxfRENBQ0hFX0xJTkVXSURUSAkJNAkvKiBsb2cyKEQgbGluZSBzaXplIGluIGJ5dGVzKSAqLworCisjZGVmaW5lIFhDSEFMX0lDQUNIRV9TSVpFCQk4MTkyCS8qIEktY2FjaGUgc2l6ZSBpbiBieXRlcyBvciAwICovCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEQtY2FjaGUgc2l6ZSBpbiBieXRlcyBvciAwICovCisKKyNkZWZpbmUgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSwkwCS8qIHdyaXRlYmFjayBmZWF0dXJlICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgUGFyYW1ldGVycyBVc2VmdWwgZm9yIFBSSVZJTEVHRUQgKFN1cGVydmlzb3J5IG9yIE5vbi1WaXJ0dWFsaXplZCkgQ29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBYVEVOU0FfSEFMX05PTl9QUklWSUxFR0VEX09OTFkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJQ0FDSEUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9QSUYJCQkxCS8qIGFueSBvdXRib3VuZCBQSUYgcHJlc2VudCAqLworCisvKiAgSWYgcHJlc2VudCwgY2FjaGUgc2l6ZSBpbiBieXRlcyA9PSAod2F5cyAqIDJeKGxpbmV3aWR0aCArIHNldHdpZHRoKSkuICAqLworCisvKiAgTnVtYmVyIG9mIGNhY2hlIHNldHMgaW4gbG9nMihsaW5lcyBwZXIgd2F5KTogICovCisjZGVmaW5lIFhDSEFMX0lDQUNIRV9TRVRXSURUSAkJOAorI2RlZmluZSBYQ0hBTF9EQ0FDSEVfU0VUV0lEVEgJCTgKKworLyogIENhY2hlIHNldCBhc3NvY2lhdGl2aXR5IChudW1iZXIgb2Ygd2F5cyk6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfV0FZUwkJMgorI2RlZmluZSBYQ0hBTF9EQ0FDSEVfV0FZUwkJMgorCisvKiAgQ2FjaGUgZmVhdHVyZXM6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfTElORV9MT0NLQUJMRQkwCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9MSU5FX0xPQ0tBQkxFCTAKKyNkZWZpbmUgWENIQUxfSUNBQ0hFX0VDQ19QQVJJVFkJCTAKKyNkZWZpbmUgWENIQUxfRENBQ0hFX0VDQ19QQVJJVFkJCTAKKworLyogIE51bWJlciBvZiBlbmNvZGVkIGNhY2hlIGF0dHIgYml0cyAoc2VlIDx4dGVuc2EvaGFsLmg+IGZvciBkZWNvZGVkIGJpdHMpOiAgKi8KKyNkZWZpbmUgWENIQUxfQ0FfQklUUwkJCTQKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUlOVEVSTkFMIEkvRCBSQU0vUk9NcyBhbmQgWExNSQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9OVU1fSU5TVFJPTQkJMAkvKiBudW1iZXIgb2YgY29yZSBpbnN0ci4gUk9NcyAqLworI2RlZmluZSBYQ0hBTF9OVU1fSU5TVFJBTQkJMAkvKiBudW1iZXIgb2YgY29yZSBpbnN0ci4gUkFNcyAqLworI2RlZmluZSBYQ0hBTF9OVU1fREFUQVJPTQkJMAkvKiBudW1iZXIgb2YgY29yZSBkYXRhIFJPTXMgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0RBVEFSQU0JCTAJLyogbnVtYmVyIG9mIGNvcmUgZGF0YSBSQU1zICovCisjZGVmaW5lIFhDSEFMX05VTV9VUkFNCQkJMAkvKiBudW1iZXIgb2YgY29yZSB1bmlmaWVkIFJBTXMqLworI2RlZmluZSBYQ0hBTF9OVU1fWExNSQkJCTAJLyogbnVtYmVyIG9mIGNvcmUgWExNSSBwb3J0cyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSU5URVJSVVBUUyBhbmQgVElNRVJTCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX0hBVkVfSU5URVJSVVBUUwkJMQkvKiBpbnRlcnJ1cHQgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElHSFBSSV9JTlRFUlJVUFRTCTEJLyogbWVkL2hpZ2gtcHJpLiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTk1JCQkJMAkvKiBub24tbWFza2FibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ0NPVU5UCQkxCS8qIENDT1VOVCByZWcuICh0aW1lciBvcHRpb24pICovCisjZGVmaW5lIFhDSEFMX05VTV9USU1FUlMJCTMJLyogbnVtYmVyIG9mIENDT01QQVJFbiByZWdzICovCisjZGVmaW5lIFhDSEFMX05VTV9JTlRFUlJVUFRTCQkxNwkvKiBudW1iZXIgb2YgaW50ZXJydXB0cyAqLworI2RlZmluZSBYQ0hBTF9OVU1fSU5URVJSVVBUU19MT0cyCTUJLyogY2VpbChsb2cyKE5VTV9JTlRFUlJVUFRTKSkgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0VYVElOVEVSUlVQVFMJCTEwCS8qIG51bSBvZiBleHRlcm5hbCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFhDSEFMX05VTV9JTlRMRVZFTFMJCTQJLyogbnVtYmVyIG9mIGludGVycnVwdCBsZXZlbHMKKwkJCQkJCSAgIChub3QgaW5jbHVkaW5nIGxldmVsIHplcm8pICovCisjZGVmaW5lIFhDSEFMX0VYQ01fTEVWRUwJCTEJLyogbGV2ZWwgbWFza2VkIGJ5IFBTLkVYQ00gKi8KKwkvKiAoYWx3YXlzIDEgaW4gWEVBMTsgbGV2ZWxzIDIgLi4gRVhDTV9MRVZFTCBhcmUgIm1lZGl1bSBwcmlvcml0eSIpICovCisKKy8qICBNYXNrcyBvZiBpbnRlcnJ1cHRzIGF0IGVhY2ggaW50ZXJydXB0IGxldmVsOiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwxX01BU0sJCTB4MDAwMDY0RjkKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwyX01BU0sJCTB4MDAwMDg5MDIKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX01BU0sJCTB4MDAwMTEyMDQKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw0X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw1X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw2X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw3X01BU0sJCTB4MDAwMDAwMDAKKworLyogIE1hc2tzIG9mIGludGVycnVwdHMgYXQgZWFjaCByYW5nZSAxLi5uIG9mIGludGVycnVwdCBsZXZlbHM6ICAqLworI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDFfQU5EQkVMT1dfTUFTSwkweDAwMDA2NEY5CisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMl9BTkRCRUxPV19NQVNLCTB4MDAwMEVERkIKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNV9BTkRCRUxPV19NQVNLCTB4MDAwMUZGRkYKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw2X0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDdfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCisKKy8qICBMZXZlbCBvZiBlYWNoIGludGVycnVwdDogICovCisjZGVmaW5lIFhDSEFMX0lOVDBfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UMV9MRVZFTAkJMgorI2RlZmluZSBYQ0hBTF9JTlQyX0xFVkVMCQkzCisjZGVmaW5lIFhDSEFMX0lOVDNfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UNF9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQ1X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDZfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UN19MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQ4X0xFVkVMCQkyCisjZGVmaW5lIFhDSEFMX0lOVDlfTEVWRUwJCTMKKyNkZWZpbmUgWENIQUxfSU5UMTBfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UMTFfTEVWRUwJCTIKKyNkZWZpbmUgWENIQUxfSU5UMTJfTEVWRUwJCTMKKyNkZWZpbmUgWENIQUxfSU5UMTNfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UMTRfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UMTVfTEVWRUwJCTIKKyNkZWZpbmUgWENIQUxfSU5UMTZfTEVWRUwJCTMKKyNkZWZpbmUgWENIQUxfREVCVUdMRVZFTAkJNAkvKiBkZWJ1ZyBpbnRlcnJ1cHQgbGV2ZWwgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERUJVR19FWFRFUk5fSU5UCTAJLyogT0NEIGV4dGVybmFsIGRiIGludGVycnVwdCAqLworCisvKiAgVHlwZSBvZiBlYWNoIGludGVycnVwdDogICovCisjZGVmaW5lIFhDSEFMX0lOVDBfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UMV9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQyX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDNfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UNF9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQ1X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDZfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UN19UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCisjZGVmaW5lIFhDSEFMX0lOVDhfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fRURHRQorI2RlZmluZSBYQ0hBTF9JTlQ5X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UKKyNkZWZpbmUgWENIQUxfSU5UMTBfVFlQRSAJWFRIQUxfSU5UVFlQRV9USU1FUgorI2RlZmluZSBYQ0hBTF9JTlQxMV9UWVBFIAlYVEhBTF9JTlRUWVBFX1RJTUVSCisjZGVmaW5lIFhDSEFMX0lOVDEyX1RZUEUgCVhUSEFMX0lOVFRZUEVfVElNRVIKKyNkZWZpbmUgWENIQUxfSU5UMTNfVFlQRSAJWFRIQUxfSU5UVFlQRV9TT0ZUV0FSRQorI2RlZmluZSBYQ0hBTF9JTlQxNF9UWVBFIAlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFCisjZGVmaW5lIFhDSEFMX0lOVDE1X1RZUEUgCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUKKyNkZWZpbmUgWENIQUxfSU5UMTZfVFlQRSAJWFRIQUxfSU5UVFlQRV9TT0ZUV0FSRQorCisvKiAgTWFza3Mgb2YgaW50ZXJydXB0cyBmb3IgZWFjaCB0eXBlIG9mIGludGVycnVwdDogICovCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19VTkNPTkZJR1VSRUQJMHhGRkZFMDAwMAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfU09GVFdBUkUJMHgwMDAxRTAwMAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfRVhURVJOX0VER0UJMHgwMDAwMDM4MAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfRVhURVJOX0xFVkVMCTB4MDAwMDAwN0YKKyNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX1RJTUVSCTB4MDAwMDFDMDAKKyNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX05NSQkJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfV1JJVEVfRVJST1IJMHgwMDAwMDAwMAorCisvKiAgSW50ZXJydXB0IG51bWJlcnMgYXNzaWduZWQgdG8gc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZXM6ICAqLworI2RlZmluZSBYQ0hBTF9USU1FUjBfSU5URVJSVVBUCQkxMAkvKiBDQ09NUEFSRTAgKi8KKyNkZWZpbmUgWENIQUxfVElNRVIxX0lOVEVSUlVQVAkJMTEJLyogQ0NPTVBBUkUxICovCisjZGVmaW5lIFhDSEFMX1RJTUVSMl9JTlRFUlJVUFQJCTEyCS8qIENDT01QQVJFMiAqLworI2RlZmluZSBYQ0hBTF9USU1FUjNfSU5URVJSVVBUCQlYVEhBTF9USU1FUl9VTkNPTkZJR1VSRUQKKworLyogIEludGVycnVwdCBudW1iZXJzIGZvciBsZXZlbHMgYXQgd2hpY2ggb25seSBvbmUgaW50ZXJydXB0IGlzIGNvbmZpZ3VyZWQ6ICAqLworLyogIChUaGVyZSBhcmUgbWFueSBpbnRlcnJ1cHRzIGVhY2ggYXQgbGV2ZWwocykgMSwgMiwgMy4pICAqLworCisKKy8qCisgKiAgRXh0ZXJuYWwgaW50ZXJydXB0IHZlY3RvcnMvbGV2ZWxzLgorICogIFRoZXNlIG1hY3JvcyBkZXNjcmliZSBob3cgWHRlbnNhIHByb2Nlc3NvciBpbnRlcnJ1cHQgbnVtYmVycworICogIChhcyBudW1iZXJlZCBpbnRlcm5hbGx5LCBlZy4gaW4gSU5URVJSVVBUIGFuZCBJTlRFTkFCTEUgcmVnaXN0ZXJzKQorICogIG1hcCB0byBleHRlcm5hbCBCSW50ZXJydXB0PG4+IHBpbnMsIGZvciB0aG9zZSBpbnRlcnJ1cHRzCisgKiAgY29uZmlndXJlZCBhcyBleHRlcm5hbCAobGV2ZWwtdHJpZ2dlcmVkLCBlZGdlLXRyaWdnZXJlZCwgb3IgTk1JKS4KKyAqICBTZWUgdGhlIFh0ZW5zYSBwcm9jZXNzb3IgZGF0YWJvb2sgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiAgQ29yZSBpbnRlcnJ1cHQgbnVtYmVycyBtYXBwZWQgdG8gZWFjaCBFWFRFUk5BTCBpbnRlcnJ1cHQgbnVtYmVyOiAgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMF9OVU0JCTAJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDFfTlVNCQkxCS8qIChpbnRsZXZlbCAyKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQyX05VTQkJMgkvKiAoaW50bGV2ZWwgMykgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UM19OVU0JCTMJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDRfTlVNCQk0CS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ1X05VTQkJNQkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UNl9OVU0JCTYJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDdfTlVNCQk3CS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ4X05VTQkJOAkvKiAoaW50bGV2ZWwgMikgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UOV9OVU0JCTkJLyogKGludGxldmVsIDMpICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlFWENFUFRJT05TIGFuZCBWRUNUT1JTCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX1hFQV9WRVJTSU9OCQkyCS8qIFh0ZW5zYSBFeGNlcHRpb24gQXJjaGl0ZWN0dXJlCisJCQkJCQkgICBudW1iZXI6IDEgPT0gWEVBMSAob2xkKQorCQkJCQkJCSAgIDIgPT0gWEVBMiAobmV3KQorCQkJCQkJCSAgIDAgPT0gWEVBWCAoZXh0ZXJuKSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1hFQTEJCQkwCS8qIEV4Y2VwdGlvbiBBcmNoaXRlY3R1cmUgMSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1hFQTIJCQkxCS8qIEV4Y2VwdGlvbiBBcmNoaXRlY3R1cmUgMiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1hFQVgJCQkwCS8qIEV4dGVybmFsIEV4Y2VwdGlvbiBBcmNoLiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0VYQ0VQVElPTlMJCTEJLyogZXhjZXB0aW9uIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01FTV9FQ0NfUEFSSVRZCTAJLyogbG9jYWwgbWVtb3J5IEVDQy9wYXJpdHkgKi8KKworI2RlZmluZSBYQ0hBTF9SRVNFVF9WRUNUT1JfVkFERFIJMHhGRTAwMDAyMAorI2RlZmluZSBYQ0hBTF9SRVNFVF9WRUNUT1JfUEFERFIJMHhGRTAwMDAyMAorI2RlZmluZSBYQ0hBTF9VU0VSX1ZFQ1RPUl9WQUREUgkJMHhEMDAwMDIyMAorI2RlZmluZSBYQ0hBTF9VU0VSX1ZFQ1RPUl9QQUREUgkJMHgwMDAwMDIyMAorI2RlZmluZSBYQ0hBTF9LRVJORUxfVkVDVE9SX1ZBRERSCTB4RDAwMDAyMDAKKyNkZWZpbmUgWENIQUxfS0VSTkVMX1ZFQ1RPUl9QQUREUgkweDAwMDAwMjAwCisjZGVmaW5lIFhDSEFMX0RPVUJMRUVYQ19WRUNUT1JfVkFERFIJMHhEMDAwMDI5MAorI2RlZmluZSBYQ0hBTF9ET1VCTEVFWENfVkVDVE9SX1BBRERSCTB4MDAwMDAyOTAKKyNkZWZpbmUgWENIQUxfV0lORE9XX1ZFQ1RPUlNfVkFERFIJMHhEMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfVkVDVE9SU19QQUREUgkweDAwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMl9WRUNUT1JfVkFERFIJMHhEMDAwMDI0MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfVkVDVE9SX1BBRERSCTB4MDAwMDAyNDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX1ZFQ1RPUl9WQUREUgkweEQwMDAwMjUwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMM19WRUNUT1JfUEFERFIJMHgwMDAwMDI1MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1ZBRERSCTB4RkUwMDA1MjAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw0X1ZFQ1RPUl9QQUREUgkweEZFMDAwNTIwCisjZGVmaW5lIFhDSEFMX0RFQlVHX1ZFQ1RPUl9WQUREUglYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1ZBRERSCisjZGVmaW5lIFhDSEFMX0RFQlVHX1ZFQ1RPUl9QQUREUglYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1BBRERSCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJREVCVUcKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9PQ0QJCQkxCS8qIE9uQ2hpcERlYnVnIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9OVU1fSUJSRUFLCQkyCS8qIG51bWJlciBvZiBJQlJFQUtuIHJlZ3MgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0RCUkVBSwkJMgkvKiBudW1iZXIgb2YgREJSRUFLbiByZWdzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfT0NEX0RJUl9BUlJBWQkxCS8qIGZhc3RlciBPQ0Qgb3B0aW9uICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJTU1VCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAgU2VlIDx4dGVuc2EvY29uZmlnL2NvcmUtbWF0bWFwLmg+IGhlYWRlciBmaWxlIGZvciBtb3JlIGRldGFpbHMuICAqLworCisjZGVmaW5lIFhDSEFMX0hBVkVfVExCUwkJCTEJLyogaW52ZXJzZSBvZiBIQVZFX0NBQ0hFQVRUUiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1NQQU5OSU5HX1dBWQkJMAkvKiBvbmUgd2F5IG1hcHMgSStEIDRHQiB2YWRkciAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0lERU5USVRZX01BUAkJMAkvKiB2YWRkciA9PSBwYWRkciBhbHdheXMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9DQUNIRUFUVFIJCTAJLyogQ0FDSEVBVFRSIHJlZ2lzdGVyIHByZXNlbnQgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIJMAkvKiByZWdpb24gcHJvdGVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIJMAkvKiByZWdpb24gcHJvdC4gdy90cmFuc2xhdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1BUUF9NTVUJCTEJLyogZnVsbCBNTVUgKHdpdGggcGFnZSB0YWJsZQorCQkJCQkJICAgW2F1dG9yZWZpbGxdIGFuZCBwcm90ZWN0aW9uKQorCQkJCQkJICAgdXNhYmxlIGZvciBhbiBNTVUtYmFzZWQgT1MgKi8KKy8qICBJZiBub25lIG9mIHRoZSBhYm92ZSBsYXN0IDQgYXJlIHNldCwgaXQncyBhIGN1c3RvbSBUTEIgY29uZmlndXJhdGlvbi4gICovCisjZGVmaW5lIFhDSEFMX0lUTEJfQVJGX0VOVFJJRVNfTE9HMgkyCS8qIGxvZzIoYXV0b3JlZmlsbCB3YXkgc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9BUkZfRU5UUklFU19MT0cyCTIJLyogbG9nMihhdXRvcmVmaWxsIHdheSBzaXplKSAqLworCisjZGVmaW5lIFhDSEFMX01NVV9BU0lEX0JJVFMJCTgJLyogbnVtYmVyIG9mIGJpdHMgaW4gQVNJRHMgKi8KKyNkZWZpbmUgWENIQUxfTU1VX1JJTkdTCQkJNAkvKiBudW1iZXIgb2YgcmluZ3MgKDEuLjQpICovCisjZGVmaW5lIFhDSEFMX01NVV9SSU5HX0JJVFMJCTIJLyogbnVtIG9mIGJpdHMgaW4gUklORyBmaWVsZCAqLworCisjZW5kaWYgLyogIVhURU5TQV9IQUxfTk9OX1BSSVZJTEVHRURfT05MWSAqLworCisKKyNlbmRpZiAvKiBfWFRFTlNBX0NPUkVfQ09ORklHVVJBVElPTl9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWZzZi90aWUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWZzZi90aWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzNjNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL3RpZS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBYdGVuc2EgcHJvY2Vzc29yIGNvcmUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgWFRFTlNBX1RJRV9ICisjZGVmaW5lIFhURU5TQV9USUVfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUNPUFJPQ0VTU09SUyBhbmQgRVhUUkEgU1RBVEUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfQ1BfTlVNCQkJMAkvKiBudW1iZXIgb2YgY29wcm9jZXNzb3JzICovCisjZGVmaW5lIFhDSEFMX0NQX01BU0sJCQkweDAwCisKKyNlbmRpZiAvKlhURU5TQV9DT05GSUdfVElFX0gqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NhY2hlYXNtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NhY2hlYXNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZGJiMGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jYWNoZWFzbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzA4ICswLDAgQEAKLSNpZm5kZWYgWFRFTlNBX0NBQ0hFQVNNX0gKLSNkZWZpbmUgWFRFTlNBX0NBQ0hFQVNNX0gKLQotLyoKLSAqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLS0gRE8gTk9UIE1PRElGWSBCWSBIQU5ECi0gKgotICogaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jYWNoZWFzbS5oIC0tIGFzc2VtYmxlci1zcGVjaWZpYyBjYWNoZQotICogcmVsYXRlZCBkZWZpbml0aW9ucyB0aGF0IGRlcGVuZCBvbiBDT1JFIGNvbmZpZ3VyYXRpb24uCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCi0gKi8KLQotCi0jaW5jbHVkZSA8eHRlbnNhL2NvcmVhc20uaD4KLQotCi0vKgotICogIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhc3NlbWJsZXIgbWFjcm9zIG9mIHRoZSBmb3JtOgotICoJPHg+Y2FjaGVfPGZ1bmM+Ci0gKiAgd2hlcmUgPHg+IGlzICdpJyBvciAnZCcgZm9yIGluc3RydWN0aW9uIGFuZCBkYXRhIGNhY2hlcywKLSAqICBhbmQgPGZ1bmM+IGluZGljYXRlcyB0aGUgZnVuY3Rpb24gb2YgdGhlIG1hY3JvLgotICoKLSAqICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyA8ZnVuYz4gYXJlIGRlZmluZWQsCi0gKiAgYW5kIGFwcGx5IG9ubHkgdG8gdGhlIHNwZWNpZmllZCBjYWNoZSAoSSBvciBEKToKLSAqCi0gKiAgcmVzZXQKLSAqCVJlc2V0cyB0aGUgY2FjaGUuCi0gKgotICogIHN5bmMKLSAqCU1ha2VzIHN1cmUgYW55IHByZXZpb3VzIGNhY2hlIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gY29tcGxldGVkOwotICoJaWUuIG1ha2VzIHN1cmUgYW55IHByZXZpb3VzIGNhY2hlIGNvbnRyb2wgb3BlcmF0aW9ucwotICoJaGF2ZSBoYWQgZnVsbCBlZmZlY3QgYW5kIGJlZW4gc3luY2hyb25pemVkIHRvIG1lbW9yeS4KLSAqCUVnLiBhbnkgaW52YWxpZGF0ZSBjb21wbGV0ZWQgW3NvIGFzIG5vdCB0byBnZW5lcmF0ZSBhIGhpdF0sCi0gKglhbnkgd3JpdGViYWNrcyBvciBvdGhlciBwaXBlbGluZWQgd3JpdGVzIHdyaXR0ZW4gdG8gbWVtb3J5LCBldGMuCi0gKgotICogIGludmFsaWRhdGVfbGluZQkJKHNpbmdsZSBjYWNoZSBsaW5lKQotICogIGludmFsaWRhdGVfcmVnaW9uCQkoc3BlY2lmaWVkIG1lbW9yeSByYW5nZSkKLSAqICBpbnZhbGlkYXRlX2FsbAkJKGVudGlyZSBjYWNoZSkKLSAqCUludmFsaWRhdGVzIGFsbCBjYWNoZSBlbnRyaWVzIHRoYXQgY2FjaGUKLSAqCWRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIG1lbW9yeSByYW5nZS4KLSAqCU5PVEU6IGxvY2tlZCBlbnRyaWVzIGFyZSBub3QgaW52YWxpZGF0ZWQuCi0gKgotICogIHdyaXRlYmFja19saW5lCQkoc2luZ2xlIGNhY2hlIGxpbmUpCi0gKiAgd3JpdGViYWNrX3JlZ2lvbgkJKHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UpCi0gKiAgd3JpdGViYWNrX2FsbAkJKGVudGlyZSBjYWNoZSkKLSAqCVdyaXRlcyBiYWNrIHRvIG1lbW9yeSBhbGwgZGlydHkgY2FjaGUgZW50cmllcwotICoJdGhhdCBjYWNoZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UsCi0gKglhbmQgbWFya3MgdGhlc2UgZW50cmllcyBhcyBjbGVhbi4KLSAqCU5PVEU6IG9uIHNvbWUgZnV0dXJlIGltcGxlbWVudGF0aW9ucywgdGhpcyBtaWdodAotICoJCWFsc28gaW52YWxpZGF0ZS4KLSAqCU5PVEU6IGxvY2tlZCBlbnRyaWVzIGFyZSB3cml0dGVuIGJhY2ssIGJ1dCBuZXZlciBpbnZhbGlkYXRlZC4KLSAqCU5PVEU6IGluc3RydWN0aW9uIGNhY2hlcyBuZXZlciBpbXBsZW1lbnQgd3JpdGViYWNrLgotICoKLSAqICB3cml0ZWJhY2tfaW52X2xpbmUJCShzaW5nbGUgY2FjaGUgbGluZSkKLSAqICB3cml0ZWJhY2tfaW52X3JlZ2lvbgkoc3BlY2lmaWVkIG1lbW9yeSByYW5nZSkKLSAqICB3cml0ZWJhY2tfaW52X2FsbAkJKGVudGlyZSBjYWNoZSkKLSAqCVdyaXRlcyBiYWNrIHRvIG1lbW9yeSBhbGwgZGlydHkgY2FjaGUgZW50cmllcwotICoJdGhhdCBjYWNoZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UsCi0gKglhbmQgaW52YWxpZGF0ZXMgdGhlc2UgZW50cmllcyAoaW5jbHVkaW5nIGFsbCBjbGVhbgotICoJY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIGRhdGEgZnJvbSB0aGF0IHJhbmdlKS4KLSAqCU5PVEU6IGxvY2tlZCBlbnRyaWVzIGFyZSB3cml0dGVuIGJhY2sgYnV0IG5vdCBpbnZhbGlkYXRlZC4KLSAqCU5PVEU6IGluc3RydWN0aW9uIGNhY2hlcyBuZXZlciBpbXBsZW1lbnQgd3JpdGViYWNrLgotICoKLSAqICBsb2NrX2xpbmUJCQkoc2luZ2xlIGNhY2hlIGxpbmUpCi0gKiAgbG9ja19yZWdpb24JCQkoc3BlY2lmaWVkIG1lbW9yeSByYW5nZSkKLSAqCVByZWZldGNoIGFuZCBsb2NrIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlIGludG8gY2FjaGUuCi0gKglOT1RFOiAgaWYgYW55IHBhcnQgb2YgdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UgY2Fubm90Ci0gKgliZSBsb2NrZWQsIGEgPz8/IGV4Y2VwdGlvbiBvY2N1cnMuICBUaGVzZSBtYWNyb3MgZG9uJ3QKLSAqCWRvIGFueXRoaW5nIHNwZWNpYWwgKHlldCBhbnl3YXkpIHRvIGhhbmRsZSB0aGlzIHNpdHVhdGlvbi4KLSAqCi0gKiAgdW5sb2NrX2xpbmUJCQkoc2luZ2xlIGNhY2hlIGxpbmUpCi0gKiAgdW5sb2NrX3JlZ2lvbgkJKHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UpCi0gKiAgdW5sb2NrX2FsbAkJCShlbnRpcmUgY2FjaGUpCi0gKglVbmxvY2sgY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlLgotICoJRW50cmllcyBub3QgYWxyZWFkeSBsb2NrZWQgYXJlIHVuYWZmZWN0ZWQuCi0gKi8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogICBHRU5FUklDIC0tIEFMTCBDQUNIRVMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhc3N1bWUgdGhlIGZvbGxvd2luZyBjYWNoZSBzaXplL3BhcmFtZXRlciBsaW1pdHMKLSAqICBpbiB0aGUgY3VycmVudCBYdGVuc2EgY29yZSBpbXBsZW1lbnRhdGlvbjoKLSAqCWNhY2hlIHNpemU6CTEwMjQgYnl0ZXMgbWluaW11bQotICoJbGluZSBzaXplOgkxNiAtIDY0IGJ5dGVzCi0gKgl3YXkgY291bnQ6CTEgLSA0Ci0gKgotICogIE1pbmltdW0gZW50cmllcyBwZXIgd2F5IChpZS4gcGVyIGFzc29jaWF0aXZpdHkpID0gMTAyNCAvIDY0IC8gNCA9IDQKLSAqICBIZW5jZSB0aGUgYXNzdW1wdGlvbiB0aGF0IGVhY2ggbG9vcCBjYW4gZXhlY3V0ZSBmb3VyIGNhY2hlIGluc3RydWN0aW9ucy4KLSAqCi0gKiAgQ29ycmVzcG9uZGluZ2x5LCB0aGUgb2Zmc2V0IHJhbmdlIG9mIGluc3RydWN0aW9ucyBpcyBhc3N1bWVkIGFibGUgdG8gY292ZXIKLSAqICBmb3VyIGxpbmVzLCBpZS4gb2Zmc2V0cyB7MCwxLDIsM30gKiBsaW5lX3NpemUgYXJlIGFzc3VtZWQgdmFsaWQgZm9yCi0gKiAgYm90aCBoaXQgYW5kIGluZGV4ZWQgY2FjaGUgaW5zdHJ1Y3Rpb25zLiAgSWUuIHRoZXNlIG9mZnNldHMgYXJlIGFsbAotICogIHZhbGlkOiAgMCwgMTYsIDMyLCA0OCwgNjQsIDk2LCAxMjgsIDE5MiAoZm9yIGxpbmUgc2l6ZXMgMTYsIDMyLCA2NCkuCi0gKiAgVGhpcyBpcyB0cnVlIG9mIGFsbCBvcmlnaW5hbCBjYWNoZSBpbnN0cnVjdGlvbnMKLSAqICAoZGhpLCBpaGksIGRod2IsIGRod2JpLCBkaWksIGlpaSkgd2hpY2ggaGF2ZSBvZmZzZXRzCi0gKiAgb2YgMCB0byAxMDIwIGluIG11bHRpcGxlcyBvZiA0IChpZS4gOCBiaXRzIHNoaWZ0ZWQgYnkgMikuCi0gKiAgVGhpcyBpcyBhbHNvIHRydWUgb2Ygc3Vic2VxdWVudCBjYWNoZSBpbnN0cnVjdGlvbnMKLSAqICAoZGh1LCBpaHUsIGRpdSwgaWl1LCBkaXdiLCBkaXdiaSwgZHBmbCwgaXBmbCkgd2hpY2ggaGF2ZSBvZmZzZXRzCi0gKiAgb2YgMCB0byAyNDAgaW4gbXVsdGlwbGVzIG9mIDE2IChpZS4gNCBiaXRzIHNoaWZ0ZWQgYnkgNCkuCi0gKgotICogIChNYXhpbXVtIGNhY2hlIHNpemUsIGN1cnJlbnRseSAzMmssIGRvZXNuJ3QgYWZmZWN0IHRoZSBmb2xsb3dpbmcgbWFjcm9zLgotICogIENhY2hlIHdheXMgPiBNTVUgbWluIHBhZ2Ugc2l6ZSBjYXVzZSBhbGlhc2luZyBidXQgdGhhdCdzIGFub3RoZXIgbWF0dGVyLikKLSAqLwotCi0KLQotLyoKLSAqICBNYWNybyB0byBhcHBseSBhbiAnaW5kZXhlZCcgY2FjaGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGVudGlyZSBjYWNoZS4KLSAqCi0gKiAgUGFyYW1ldGVyczoKLSAqCWNhaW5zdAkJaW5zdHJ1Y3Rpb24vIHRoYXQgdGFrZXMgYW4gYWRkcmVzcyByZWdpc3RlciBwYXJhbWV0ZXIKLSAqCQkJYW5kIGFuIG9mZnNldCBwYXJhbWV0ZXIgKGluIHJhbmdlIDAgLi4gMypsaW5lc2l6ZSkuCi0gKglzaXplCQlzaXplIG9mIGNhY2hlIGluIGJ5dGVzCi0gKglsaW5lc2l6ZQlzaXplIG9mIGNhY2hlIGxpbmUgaW4gYnl0ZXMKLSAqCWFzc29jX29yMQludW1iZXIgb2YgYXNzb2NpYXRpdml0aWVzICh3YXlzL3NldHMpIGluIGNhY2hlCi0gKgkJCWlmIGFsbCBzZXRzIGFmZmVjdGVkIGJ5IGNhaW5zdCwKLSAqCQkJb3IgMSBpZiBvbmx5IG9uZSBzZXQgKG9yIG5vdCBhbGwgc2V0cykgb2YgdGhlIGNhY2hlCi0gKgkJCWlzIGFmZmVjdGVkIGJ5IGNhaW5zdCAoZWcuIERJV0Igb3IgRElXQkkgW25vdCB5ZXQgSVNBIGRlZmluZWRdKS4KLSAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKLSAqLwotCi0JLm1hY3JvCWNhY2hlX2luZGV4X2FsbAkJY2FpbnN0LCBzaXplLCBsaW5lc2l6ZSwgYXNzb2Nfb3IxLCBhYSwgYWIKLQotCS8vICBTYW5pdHktY2hlY2sgb24gY2FjaGUgcGFyYW1ldGVyczoKLQkuaWZuZQkoXHNpemUgJSAoXGxpbmVzaXplICogXGFzc29jX29yMSAqIDQpKQotCS5lcnIJLy8gIGNhY2hlIGNvbmZpZ3VyYXRpb24gb3V0c2lkZSBleHBlY3RlZC9zdXBwb3J0ZWQgcmFuZ2UhCi0JLmVuZGlmCi0KLQkvLyAgXHNpemUgYnl0ZSBjYWNoZSwgXGxpbmVzaXplIGJ5dGUgbGluZXMsIFxhc3NvY19vcjEgd2F5KHMpIGFmZmVjdGVkIGJ5IGVhY2ggXGNhaW5zdC4KLQltb3ZpCVxhYSwgKFxzaXplIC8gKFxsaW5lc2l6ZSAqIFxhc3NvY19vcjEgKiA0KSkKLQkvLyBQb3NzaWJsZSBpbXByb3ZlbWVudDogbmVlZCBvbmx5IGxvb3AgaWYgXGFhID4gMSA7Ci0JLy8gaG93ZXZlciB0aGF0IHBhcnRpY3VsYXIgY29uZGl0aW9uIGlzIGhpZ2hseSB1bmxpa2VseS4KLQltb3ZpCVxhYiwgMAkJLy8gdG8gaXRlcmF0ZSBvdmVyIGNhY2hlCi0JZmxvb3AJCVxhYSwgY2FjaGV4XEAKLQlcY2FpbnN0CQlcYWIsIDAqXGxpbmVzaXplCi0JXGNhaW5zdAkJXGFiLCAxKlxsaW5lc2l6ZQotCVxjYWluc3QJCVxhYiwgMipcbGluZXNpemUKLQlcY2FpbnN0CQlcYWIsIDMqXGxpbmVzaXplCi0JYWRkaQkJXGFiLCBcYWIsIDQqXGxpbmVzaXplCS8vIG1vdmUgdG8gbmV4dCBsaW5lCi0JZmxvb3BlbmQJXGFhLCBjYWNoZXhcQAotCi0JLmVuZG0KLQotCi0vKgotICogIE1hY3JvIHRvIGFwcGx5IGEgJ2hpdCcgY2FjaGUgaW5zdHJ1Y3Rpb24gdG8gYSBtZW1vcnkgcmVnaW9uLAotICogIGllLiB0byBhbnkgY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIGEgc3BlY2lmaWVkIHBvcnRpb24gKHJlZ2lvbikgb2YgbWVtb3J5LgotICogIFRha2VzIGNhcmUgb2YgdGhlIHVuYWxpZ25lZCBjYXNlcywgaWUuIG1heSBhcHBseSB0byBvbmUKLSAqICBtb3JlIGNhY2hlIGxpbmUgdGhhbiAkYXNpemUgLyBsaW5lU2l6ZSBpZiAkYWFkZHIgaXMgbm90IGFsaWduZWQuCi0gKgotICoKLSAqICBQYXJhbWV0ZXJzIGFyZToKLSAqCWNhaW5zdAlpbnN0cnVjdGlvbi9tYWNybyB0aGF0IHRha2VzIGFuIGFkZHJlc3MgcmVnaXN0ZXIgcGFyYW1ldGVyCi0gKgkJYW5kIGFuIG9mZnNldCBwYXJhbWV0ZXIgKGN1cnJlbnRseSBhbHdheXMgemVybykKLSAqCQlhbmQgZ2VuZXJhdGVzIGEgY2FjaGUgaW5zdHJ1Y3Rpb24gKGVnLiAiZGhpIiwgImRod2IiLCAiaWhpIiwgZXRjLikKLSAqCWxpbmVzaXplX2xvZzIJbG9nMihzaXplIG9mIGNhY2hlIGxpbmUgaW4gYnl0ZXMpCi0gKglhZGRyCXJlZ2lzdGVyIGNvbnRhaW5pbmcgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24gKGNsb2JiZXJlZCkKLSAqCWFzaXplCXJlZ2lzdGVyIGNvbnRhaW5pbmcgc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzIChjbG9iYmVyZWQpCi0gKglhc2tldwl1bmlxdWUgcmVnaXN0ZXIgdXNlZCBhcyB0ZW1wb3JhcnkKLSAqCi0gKiAhPyE/ISAyRE86IG9wdGltaXphdGlvbjogaXRlcmF0ZSBtYXgoY2FjaGVfc2l6ZSBhbmQgXGFzaXplKSAvIGxpbmVzaXplCi0gKi8KLQotCS5tYWNybwljYWNoZV9oaXRfcmVnaW9uCWNhaW5zdCwgbGluZXNpemVfbG9nMiwgYWRkciwgYXNpemUsIGFza2V3Ci0KLQkvLyAgTWFrZSBcYXNpemUgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zOgotCWV4dHVpCVxhc2tldywgXGFkZHIsIDAsIFxsaW5lc2l6ZV9sb2cyCS8vIGdldCB1bmFsaWdubWVudCBhbW91bnQgb2YgXGFkZHIKLQlhZGQJXGFzaXplLCBcYXNpemUsIFxhc2tldwkJCS8vIC4uLiBhbmQgYWRkIGl0IHRvIFxhc2l6ZQotCWFkZGkJXGFzaXplLCBcYXNpemUsICgxIDw8IFxsaW5lc2l6ZV9sb2cyKSAtIDEJLy8gcm91bmQgdXAhCi0Jc3JsaQlcYXNpemUsIFxhc2l6ZSwgXGxpbmVzaXplX2xvZzIKLQotCS8vICBJdGVyYXRlIG92ZXIgcmVnaW9uOgotCWZsb29wbmV6CVxhc2l6ZSwgY2FjaGVoXEAKLQlcY2FpbnN0CQlcYWRkciwgMAotCWFkZGkJCVxhZGRyLCBcYWRkciwgKDEgPDwgXGxpbmVzaXplX2xvZzIpCS8vIG1vdmUgdG8gbmV4dCBsaW5lCi0JZmxvb3BlbmQJXGFzaXplLCBjYWNoZWhcQAotCi0JLmVuZG0KLQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgSU5TVFJVQ1RJT04gQ0FDSEUgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqICBSZXNldC9pbml0aWFsaXplIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBieSBzaW1wbHkgaW52YWxpZGF0aW5nIGl0OgotICogIChuZWVkIHRvIHVubG9jayBmaXJzdCBhbHNvLCBpZiBjYWNoZSBsb2NraW5nIGltcGxlbWVudGVkKToKLSAqCi0gKiAgUGFyYW1ldGVyczoKLSAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKLSAqLwotCS5tYWNybwlpY2FjaGVfcmVzZXQJYWEsIGFiCi0JaWNhY2hlX3VubG9ja19hbGwJXGFhLCBcYWIKLQlpY2FjaGVfaW52YWxpZGF0ZV9hbGwJXGFhLCBcYWIKLQkuZW5kbQotCi0KLS8qCi0gKiBTeW5jaHJvbml6ZSBhZnRlciBhbiBpbnN0cnVjdGlvbiBjYWNoZSBvcGVyYXRpb24sCi0gKiB0byBiZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgaW4gc3luYyB3aXRoIG1lbW9yeSBhcyB0byBiZQotICogZXhwZWN0ZWQgZm9sbG93aW5nIGFueSBwcmV2aW91cyBpbnN0cnVjdGlvbiBjYWNoZSBjb250cm9sIG9wZXJhdGlvbnMuCi0gKgotICogUGFyYW1ldGVycyBhcmU6Ci0gKglhcglhbiBhZGRyZXNzIHJlZ2lzdGVyICh0ZW1wb3JhcnkpIChjdXJyZW50bHkgdW51c2VkLCBidXQgbWF5IGJlIHVzZWQgaW4gZnV0dXJlKQotICovCi0JLm1hY3JvCWljYWNoZV9zeW5jCWFyCi0jaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwCi0JaXN5bmMKLSNlbmRpZgotCS5lbmRtCi0KLQotCi0vKgotICogIEludmFsaWRhdGUgYSBzaW5nbGUgbGluZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCi0gKiAgUGFyYW1ldGVycyBhcmU6Ci0gKglhcglhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgKHZpcnR1YWwpIGFkZHJlc3MgdG8gaW52YWxpZGF0ZQotICoJCShtYXkgZ2V0IGNsb2JiZXJlZCBpbiBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG5vdCBjdXJyZW50bHkpCi0gKglvZmZzZXQJKG9wdGlvbmFsKSBvZmZzZXQgdG8gYWRkIHRvIFxhciB0byBjb21wdXRlIGVmZmVjdGl2ZSBhZGRyZXNzIHRvIGludmFsaWRhdGUKLSAqCQkobm90ZTogc29tZSBudW1iZXIgb2YgbHNiaXRzIGFyZSBpZ25vcmVkKQotICovCi0JLm1hY3JvCWljYWNoZV9pbnZhbGlkYXRlX2xpbmUJYXIsIG9mZnNldAotI2lmIFhDSEFMX0lDQUNIRV9TSVpFID4gMAotCWloaQlcYXIsIFxvZmZzZXQJCS8vIGludmFsaWRhdGUgaWNhY2hlIGxpbmUKLQkvKgotCSAqICBOT1RFOiAgaW4gc29tZSB2ZXJzaW9uIG9mIHRoZSBzaWxpY29uIFshISFTSE9VTEQgSEFWRSBCRUVOIERPQ1VNRU5URUQhISFdCi0JICogICdpaGknIGRvZXNuJ3Qgd29yaywgc28gaXQgaGFkIGJlZW4gcmVwbGFjZWQgd2l0aCAnaWlpJwotCSAqICAod2hpY2ggd291bGQganVzdCBpbnZhbGlkYXRlIG1vcmUgdGhhbiBpdCBzaG91bGQsCi0JICogIHdoaWNoIHNob3VsZCBiZSBva2F5IG90aGVyIHRoYW4gdGhlIHBlcmZvcm1hbmNlIGhpdAotCSAqICBiZWNhdXNlIGNhY2hlIGxvY2tpbmcgZGlkIG5vdCBleGlzdCBpbiB0aGF0IHZlcnNpb24sCi0JICogIHVubGVzcyB1c2VyIHNvbWVob3cgcmVsaWVzIG9uIHNvbWV0aGluZyBiZWluZyBjYWNoZWQpLgotCSAqICBbV0hBVCBWRVJTSU9OIElTIElUISE/IT8KLQkgKiAgSVMgVEhFUkUgQU5ZIFdBWSBUTyBURVNUIEZPUiBUSEFUIEhFUkUsIFRPIE9VVFBVVCAnSUlJJyBPTkxZIElGIE5FRURFRCE/IT9dLgotCSAqCi0JICoJaWlpCVxhciwgXG9mZnNldAotCSAqLwotCWljYWNoZV9zeW5jCVxhcgotI2VuZGlmCi0JLmVuZG0KLQotCi0KLQotLyoKLSAqICBJbnZhbGlkYXRlIGluc3RydWN0aW9uICBjYWNoZSBlbnRyaWVzIHRoYXQgY2FjaGUgYSBzcGVjaWZpZWQgcG9ydGlvbiBvZiBtZW1vcnkuCi0gKiAgUGFyYW1ldGVycyBhcmU6Ci0gKglhc3RhcnQJc3RhcnQgYWRkcmVzcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCi0gKglhc2l6ZQlzaXplIG9mIHRoZSByZWdpb24gaW4gYnl0ZXMgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQotICoJYWMJdW5pcXVlIHJlZ2lzdGVyIHVzZWQgYXMgdGVtcG9yYXJ5Ci0gKi8KLQkubWFjcm8JaWNhY2hlX2ludmFsaWRhdGVfcmVnaW9uCWFzdGFydCwgYXNpemUsIGFjCi0jaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwCi0JLy8gIEluc3RydWN0aW9uIGNhY2hlIHJlZ2lvbiBpbnZhbGlkYXRpb246Ci0JY2FjaGVfaGl0X3JlZ2lvbglpaGksIFhDSEFMX0lDQUNIRV9MSU5FV0lEVEgsIFxhc3RhcnQsIFxhc2l6ZSwgXGFjCi0JaWNhY2hlX3N5bmMJXGFjCi0JLy8gIEVuZCBvZiBpbnN0cnVjdGlvbiBjYWNoZSByZWdpb24gaW52YWxpZGF0aW9uCi0jZW5kaWYKLQkuZW5kbQotCi0KLQotLyoKLSAqICBJbnZhbGlkYXRlIGVudGlyZSBpbnN0cnVjdGlvbiBjYWNoZS4KLSAqCi0gKiAgUGFyYW1ldGVyczoKLSAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKLSAqLwotCS5tYWNybwlpY2FjaGVfaW52YWxpZGF0ZV9hbGwJYWEsIGFiCi0jaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwCi0JLy8gIEluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGlvbjoKLQljYWNoZV9pbmRleF9hbGwJCWlpaSwgWENIQUxfSUNBQ0hFX1NJWkUsIFhDSEFMX0lDQUNIRV9MSU5FU0laRSwgWENIQUxfSUNBQ0hFX1dBWVMsIFxhYSwgXGFiCi0JaWNhY2hlX3N5bmMJXGFhCi0JLy8gIEVuZCBvZiBpbnN0cnVjdGlvbiBjYWNoZSBpbnZhbGlkYXRpb24KLSNlbmRpZgotCS5lbmRtCi0KLQotCi0vKgotICogIExvY2sgKHByZWZldGNoICYgbG9jaykgYSBzaW5nbGUgbGluZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCi0gKgotICogIFBhcmFtZXRlcnMgYXJlOgotICoJYXIJYWRkcmVzcyByZWdpc3RlciB0aGF0IGNvbnRhaW5zICh2aXJ0dWFsKSBhZGRyZXNzIHRvIGxvY2sKLSAqCQkobWF5IGdldCBjbG9iYmVyZWQgaW4gYSBmdXR1cmUgaW1wbGVtZW50YXRpb24sIGJ1dCBub3QgY3VycmVudGx5KQotICoJb2Zmc2V0CW9mZnNldCB0byBhZGQgdG8gXGFyIHRvIGNvbXB1dGUgZWZmZWN0aXZlIGFkZHJlc3MgdG8gbG9jawotICoJCShub3RlOiBzb21lIG51bWJlciBvZiBsc2JpdHMgYXJlIGlnbm9yZWQpCi0gKi8KLQkubWFjcm8JaWNhY2hlX2xvY2tfbGluZQlhciwgb2Zmc2V0Ci0jaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwICYmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCi0JaXBmbAlcYXIsIFxvZmZzZXQJLyogcHJlZmV0Y2ggYW5kIGxvY2sgaWNhY2hlIGxpbmUgKi8KLQlpY2FjaGVfc3luYwlcYXIKLSNlbmRpZgotCS5lbmRtCi0KLQotCi0vKgotICogIExvY2sgKHByZWZldGNoICYgbG9jaykgYSBzcGVjaWZpZWQgcG9ydGlvbiBvZiBtZW1vcnkgaW50byB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCi0gKiAgUGFyYW1ldGVycyBhcmU6Ci0gKglhc3RhcnQJc3RhcnQgYWRkcmVzcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCi0gKglhc2l6ZQlzaXplIG9mIHRoZSByZWdpb24gaW4gYnl0ZXMgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQotICoJYWMJdW5pcXVlIHJlZ2lzdGVyIHVzZWQgYXMgdGVtcG9yYXJ5Ci0gKi8KLQkubWFjcm8JaWNhY2hlX2xvY2tfcmVnaW9uCWFzdGFydCwgYXNpemUsIGFjCi0jaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwICYmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCi0JLy8gIEluc3RydWN0aW9uIGNhY2hlIHJlZ2lvbiBsb2NrOgotCWNhY2hlX2hpdF9yZWdpb24JaXBmbCwgWENIQUxfSUNBQ0hFX0xJTkVXSURUSCwgXGFzdGFydCwgXGFzaXplLCBcYWMKLQlpY2FjaGVfc3luYwlcYWMKLQkvLyAgRW5kIG9mIGluc3RydWN0aW9uIGNhY2hlIHJlZ2lvbiBsb2NrCi0jZW5kaWYKLQkuZW5kbQotCi0KLQotLyoKLSAqICBVbmxvY2sgYSBzaW5nbGUgbGluZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCi0gKgotICogIFBhcmFtZXRlcnMgYXJlOgotICoJYXIJYWRkcmVzcyByZWdpc3RlciB0aGF0IGNvbnRhaW5zICh2aXJ0dWFsKSBhZGRyZXNzIHRvIHVubG9jawotICoJCShtYXkgZ2V0IGNsb2JiZXJlZCBpbiBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG5vdCBjdXJyZW50bHkpCi0gKglvZmZzZXQJb2Zmc2V0IHRvIGFkZCB0byBcYXIgdG8gY29tcHV0ZSBlZmZlY3RpdmUgYWRkcmVzcyB0byB1bmxvY2sKLSAqCQkobm90ZTogc29tZSBudW1iZXIgb2YgbHNiaXRzIGFyZSBpZ25vcmVkKQotICovCi0JLm1hY3JvCWljYWNoZV91bmxvY2tfbGluZQlhciwgb2Zmc2V0Ci0jaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwICYmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCi0JaWh1CVxhciwgXG9mZnNldAkvKiB1bmxvY2sgaWNhY2hlIGxpbmUgKi8KLQlpY2FjaGVfc3luYwlcYXIKLSNlbmRpZgotCS5lbmRtCi0KLQotCi0vKgotICogIFVubG9jayBhIHNwZWNpZmllZCBwb3J0aW9uIG9mIG1lbW9yeSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4KLSAqICBQYXJhbWV0ZXJzIGFyZToKLSAqCWFzdGFydAlzdGFydCBhZGRyZXNzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKLSAqCWFzaXplCXNpemUgb2YgdGhlIHJlZ2lvbiBpbiBieXRlcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCi0gKglhYwl1bmlxdWUgcmVnaXN0ZXIgdXNlZCBhcyB0ZW1wb3JhcnkKLSAqLwotCS5tYWNybwlpY2FjaGVfdW5sb2NrX3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYwotI2lmIFhDSEFMX0lDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9JQ0FDSEVfTElORV9MT0NLQUJMRQotCS8vICBJbnN0cnVjdGlvbiBjYWNoZSByZWdpb24gdW5sb2NrOgotCWNhY2hlX2hpdF9yZWdpb24JaWh1LCBYQ0hBTF9JQ0FDSEVfTElORVdJRFRILCBcYXN0YXJ0LCBcYXNpemUsIFxhYwotCWljYWNoZV9zeW5jCVxhYwotCS8vICBFbmQgb2YgaW5zdHJ1Y3Rpb24gY2FjaGUgcmVnaW9uIHVubG9jawotI2VuZGlmCi0JLmVuZG0KLQotCi0KLS8qCi0gKiAgVW5sb2NrIGVudGlyZSBpbnN0cnVjdGlvbiBjYWNoZS4KLSAqCi0gKiAgUGFyYW1ldGVyczoKLSAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKLSAqLwotCS5tYWNybwlpY2FjaGVfdW5sb2NrX2FsbAlhYSwgYWIKLSNpZiBYQ0hBTF9JQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfSUNBQ0hFX0xJTkVfTE9DS0FCTEUKLQkvLyAgSW5zdHJ1Y3Rpb24gY2FjaGUgdW5sb2NrOgotCWNhY2hlX2luZGV4X2FsbAkJaWl1LCBYQ0hBTF9JQ0FDSEVfU0laRSwgWENIQUxfSUNBQ0hFX0xJTkVTSVpFLCAxLCBcYWEsIFxhYgotCWljYWNoZV9zeW5jCVxhYQotCS8vICBFbmQgb2YgaW5zdHJ1Y3Rpb24gY2FjaGUgdW5sb2NrCi0jZW5kaWYKLQkuZW5kbQotCi0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiogICBEQVRBIENBQ0hFICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotLyoKLSAqICBSZXNldC9pbml0aWFsaXplIHRoZSBkYXRhIGNhY2hlIGJ5IHNpbXBseSBpbnZhbGlkYXRpbmcgaXQKLSAqICAobmVlZCB0byB1bmxvY2sgZmlyc3QgYWxzbywgaWYgY2FjaGUgbG9ja2luZyBpbXBsZW1lbnRlZCk6Ci0gKgotICogIFBhcmFtZXRlcnM6Ci0gKglhYSwgYWIJCXVuaXF1ZSBhZGRyZXNzIHJlZ2lzdGVycyAodGVtcG9yYXJpZXMpCi0gKi8KLQkubWFjcm8JZGNhY2hlX3Jlc2V0CWFhLCBhYgotCWRjYWNoZV91bmxvY2tfYWxsCVxhYSwgXGFiCi0JZGNhY2hlX2ludmFsaWRhdGVfYWxsCVxhYSwgXGFiCi0JLmVuZG0KLQotCi0KLQotLyoKLSAqIFN5bmNocm9uaXplIGFmdGVyIGEgZGF0YSBjYWNoZSBvcGVyYXRpb24sCi0gKiB0byBiZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgaW4gc3luYyB3aXRoIG1lbW9yeSBhcyB0byBiZQotICogZXhwZWN0ZWQgZm9sbG93aW5nIGFueSBwcmV2aW91cyBkYXRhIGNhY2hlIGNvbnRyb2wgb3BlcmF0aW9ucy4KLSAqCi0gKiBQYXJhbWV0ZXJzIGFyZToKLSAqCWFyCWFuIGFkZHJlc3MgcmVnaXN0ZXIgKHRlbXBvcmFyeSkgKGN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtYXkgYmUgdXNlZCBpbiBmdXR1cmUpCi0gKi8KLQkubWFjcm8JZGNhY2hlX3N5bmMJYXIKLSNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAKLQkvLyAgVGhpcyBwcmV2aW91cyBzZXF1ZW5jZSBlcnJzIG9uIHRoZSBjb25zZXJ2YXRpdmUgc2lkZSAodG9vIG11Y2ggc28pOyBhIERTWU5DIHNob3VsZCBiZSBzdWZmaWNpZW50OgotCS8vbWVtdwkJLy8gc3luY2hyb25pemUgZGF0YSBjYWNoZSBjaGFuZ2VzIHJlbGF0aXZlIHRvIHN1YnNlcXVlbnQgbWVtb3J5IGFjY2Vzc2VzCi0JLy9pc3luYwkJLy8gYmUgY29uc2VydmF0aXZlIGFuZCBJU1lOQyBhcyB3ZWxsIChqdXN0IHRvIGJlIHN1cmUpCi0KLQlkc3luYwotI2VuZGlmCi0JLmVuZG0KLQotCi0KLS8qCi0gKiBTeW5jaHJvbml6ZSBhZnRlciBhIGRhdGEgc3RvcmUgb3BlcmF0aW9uLAotICogdG8gYmUgc3VyZSB0aGUgc3RvcmVkIGRhdGEgaXMgY29tcGxldGVseSBvZmYgdGhlIHByb2Nlc3NvcgotICogKGFuZCBhc3N1bWluZyB0aGVyZSBpcyBubyBidWZmZXJpbmcgb3V0c2lkZSB0aGUgcHJvY2Vzc29yLAotICogIHRoYXQgdGhlIGRhdGEgaXMgaW4gbWVtb3J5KS4gIFRoaXMgbWF5IGJlIHJlcXVpcmVkIHRvCi0gKiBlbnN1cmUgdGhhdCB0aGUgcHJvY2Vzc29yJ3Mgd3JpdGUgYnVmZmVycyBhcmUgZW1wdGllZC4KLSAqIEEgTUVNVyBmb2xsb3dlZCBieSBhIHJlYWQgZ3VhcmFudGVlcyB0aGlzLCBieSBkZWZpbml0aW9uLgotICogV2UgYWxzbyB0cnkgdG8gbWFrZSBzdXJlIHRoZSByZWFkIGl0c2VsZiBjb21wbGV0ZXMuCi0gKgotICogUGFyYW1ldGVycyBhcmU6Ci0gKglhcglhbiBhZGRyZXNzIHJlZ2lzdGVyICh0ZW1wb3JhcnkpCi0gKi8KLQkubWFjcm8Jd3JpdGVfc3luYwlhcgotCW1lbXcJCQkvLyBlbnN1cmUgcHJldmlvdXMgbWVtb3J5IGFjY2Vzc2VzIGFyZSBjb21wbGV0ZSBwcmlvciB0byBzdWJzZXF1ZW50IG1lbW9yeSBhY2Nlc3NlcwotCWwzMmkJXGFyLCBzcCwgMAkvLyBjb21wbGV0aW5nIHRoaXMgcmVhZCBlbnN1cmVzIGFueSBwcmV2aW91cyB3cml0ZSBoYXMgY29tcGxldGVkLCBiZWNhdXNlIG9mIE1FTVcKLQkvL3Nsb3QKLQlhZGQJXGFyLCBcYXIsIFxhcgkvLyB1c2UgdGhlIHJlc3VsdCBvZiB0aGUgcmVhZCB0byBoZWxwIGVuc3VyZSB0aGUgcmVhZCBjb21wbGV0ZXMgKGluIGZ1dHVyZSBhcmNoaXRlY3R1cmVzKQotCS5lbmRtCi0KLQotLyoKLSAqICBJbnZhbGlkYXRlIGEgc2luZ2xlIGxpbmUgb2YgdGhlIGRhdGEgY2FjaGUuCi0gKiAgUGFyYW1ldGVycyBhcmU6Ci0gKglhcglhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgKHZpcnR1YWwpIGFkZHJlc3MgdG8gaW52YWxpZGF0ZQotICoJCShtYXkgZ2V0IGNsb2JiZXJlZCBpbiBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG5vdCBjdXJyZW50bHkpCi0gKglvZmZzZXQJKG9wdGlvbmFsKSBvZmZzZXQgdG8gYWRkIHRvIFxhciB0byBjb21wdXRlIGVmZmVjdGl2ZSBhZGRyZXNzIHRvIGludmFsaWRhdGUKLSAqCQkobm90ZTogc29tZSBudW1iZXIgb2YgbHNiaXRzIGFyZSBpZ25vcmVkKQotICovCi0JLm1hY3JvCWRjYWNoZV9pbnZhbGlkYXRlX2xpbmUJYXIsIG9mZnNldAotI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAotCWRoaQlcYXIsIFxvZmZzZXQKLQlkY2FjaGVfc3luYwlcYXIKLSNlbmRpZgotCS5lbmRtCi0KLQotCi0KLQotLyoKLSAqICBJbnZhbGlkYXRlIGRhdGEgY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIGEgc3BlY2lmaWVkIHBvcnRpb24gb2YgbWVtb3J5LgotICogIFBhcmFtZXRlcnMgYXJlOgotICoJYXN0YXJ0CXN0YXJ0IGFkZHJlc3MgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQotICoJYXNpemUJc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKLSAqCWFjCXVuaXF1ZSByZWdpc3RlciB1c2VkIGFzIHRlbXBvcmFyeQotICovCi0JLm1hY3JvCWRjYWNoZV9pbnZhbGlkYXRlX3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYwotI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAotCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiBpbnZhbGlkYXRpb246Ci0JY2FjaGVfaGl0X3JlZ2lvbglkaGksIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgsIFxhc3RhcnQsIFxhc2l6ZSwgXGFjCi0JZGNhY2hlX3N5bmMJXGFjCi0JLy8gIEVuZCBvZiBkYXRhIGNhY2hlIHJlZ2lvbiBpbnZhbGlkYXRpb24KLSNlbmRpZgotCS5lbmRtCi0KLQotCi0jaWYgMAotLyoKLSAqICBUaGlzIGlzIGEgd29yay1hcm91bmQgZm9yIGEgYnVnIGluIFNpQ2hpcDEgKD8/PykuCi0gKiAgVGhlcmUgc2hvdWxkIGJlIGEgcHJvcGVyIG1lY2hhbmlzbSBmb3Igbm90IG91dHB1dHRpbmcKLSAqICB0aGVzZSBpbnN0cnVjdGlvbnMgd2hlbiBub3QgbmVlZGVkLgotICogIFRvIGVuYWJsZSB3b3JrLWFyb3VuZCwgdW5jb21tZW50IHRoaXMgYW5kIHJlcGxhY2UgJ2RpaScKLSAqICB3aXRoICdkaWlfczEnIGV2ZXJ5d2hlcmUsIGVnLiBpbiBkY2FjaGVfaW52YWxpZGF0ZV9hbGwKLSAqICBtYWNybyBiZWxvdy4KLSAqLwotCS5tYWNybwlkaWlfczEJYXIsIG9mZnNldAotCWRpaQlcYXIsIFxvZmZzZXQKLQlvcglcYXIsIFxhciwgXGFyCi0Jb3IJXGFyLCBcYXIsIFxhcgotCW9yCVxhciwgXGFyLCBcYXIKLQlvcglcYXIsIFxhciwgXGFyCi0JLmVuZG0KLSNlbmRpZgotCi0KLS8qCi0gKiAgSW52YWxpZGF0ZSBlbnRpcmUgZGF0YSBjYWNoZS4KLSAqCi0gKiAgUGFyYW1ldGVyczoKLSAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKLSAqLwotCS5tYWNybwlkY2FjaGVfaW52YWxpZGF0ZV9hbGwJYWEsIGFiCi0jaWYgWENIQUxfRENBQ0hFX1NJWkUgPiAwCi0JLy8gIERhdGEgY2FjaGUgaW52YWxpZGF0aW9uOgotCWNhY2hlX2luZGV4X2FsbAkJZGlpLCBYQ0hBTF9EQ0FDSEVfU0laRSwgWENIQUxfRENBQ0hFX0xJTkVTSVpFLCBYQ0hBTF9EQ0FDSEVfV0FZUywgXGFhLCBcYWIKLQlkY2FjaGVfc3luYwlcYWEKLQkvLyAgRW5kIG9mIGRhdGEgY2FjaGUgaW52YWxpZGF0aW9uCi0jZW5kaWYKLQkuZW5kbQotCi0KLQotLyoKLSAqICBXcml0ZWJhY2sgYSBzaW5nbGUgbGluZSBvZiB0aGUgZGF0YSBjYWNoZS4KLSAqICBQYXJhbWV0ZXJzIGFyZToKLSAqCWFyCWFkZHJlc3MgcmVnaXN0ZXIgdGhhdCBjb250YWlucyAodmlydHVhbCkgYWRkcmVzcyB0byB3cml0ZWJhY2sKLSAqCQkobWF5IGdldCBjbG9iYmVyZWQgaW4gYSBmdXR1cmUgaW1wbGVtZW50YXRpb24sIGJ1dCBub3QgY3VycmVudGx5KQotICoJb2Zmc2V0CW9mZnNldCB0byBhZGQgdG8gXGFyIHRvIGNvbXB1dGUgZWZmZWN0aXZlIGFkZHJlc3MgdG8gd3JpdGViYWNrCi0gKgkJKG5vdGU6IHNvbWUgbnVtYmVyIG9mIGxzYml0cyBhcmUgaWdub3JlZCkKLSAqLwotCS5tYWNybwlkY2FjaGVfd3JpdGViYWNrX2xpbmUJYXIsIG9mZnNldAotI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCi0JZGh3YglcYXIsIFxvZmZzZXQKLQlkY2FjaGVfc3luYwlcYXIKLSNlbmRpZgotCS5lbmRtCi0KLQotCi0vKgotICogIFdyaXRlYmFjayBkaXJ0eSBkYXRhIGNhY2hlIGVudHJpZXMgdGhhdCBjYWNoZSBhIHNwZWNpZmllZCBwb3J0aW9uIG9mIG1lbW9yeS4KLSAqICBQYXJhbWV0ZXJzIGFyZToKLSAqCWFzdGFydAlzdGFydCBhZGRyZXNzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKLSAqCWFzaXplCXNpemUgb2YgdGhlIHJlZ2lvbiBpbiBieXRlcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCi0gKglhYwl1bmlxdWUgcmVnaXN0ZXIgdXNlZCBhcyB0ZW1wb3JhcnkKLSAqLwotCS5tYWNybwlkY2FjaGVfd3JpdGViYWNrX3JlZ2lvbgkJYXN0YXJ0LCBhc2l6ZSwgYWMKLSNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSwotCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiB3cml0ZWJhY2s6Ci0JY2FjaGVfaGl0X3JlZ2lvbglkaHdiLCBYQ0hBTF9EQ0FDSEVfTElORVdJRFRILCBcYXN0YXJ0LCBcYXNpemUsIFxhYwotCWRjYWNoZV9zeW5jCVxhYwotCS8vICBFbmQgb2YgZGF0YSBjYWNoZSByZWdpb24gd3JpdGViYWNrCi0jZW5kaWYKLQkuZW5kbQotCi0KLQotLyoKLSAqICBXcml0ZWJhY2sgZW50aXJlIGRhdGEgY2FjaGUuCi0gKiAgUGFyYW1ldGVyczoKLSAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKLSAqLwotCS5tYWNybwlkY2FjaGVfd3JpdGViYWNrX2FsbAlhYSwgYWIKLSNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSwotCS8vICBEYXRhIGNhY2hlIHdyaXRlYmFjazoKLQljYWNoZV9pbmRleF9hbGwJCWRpd2IsIFhDSEFMX0RDQUNIRV9TSVpFLCBYQ0hBTF9EQ0FDSEVfTElORVNJWkUsIDEsIFxhYSwgXGFiCi0JZGNhY2hlX3N5bmMJXGFhCi0JLy8gIEVuZCBvZiBkYXRhIGNhY2hlIHdyaXRlYmFjawotI2VuZGlmCi0JLmVuZG0KLQotCi0KLS8qCi0gKiAgV3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlIGEgc2luZ2xlIGxpbmUgb2YgdGhlIGRhdGEgY2FjaGUuCi0gKiAgUGFyYW1ldGVycyBhcmU6Ci0gKglhcglhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgKHZpcnR1YWwpIGFkZHJlc3MgdG8gd3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlCi0gKgkJKG1heSBnZXQgY2xvYmJlcmVkIGluIGEgZnV0dXJlIGltcGxlbWVudGF0aW9uLCBidXQgbm90IGN1cnJlbnRseSkKLSAqCW9mZnNldAlvZmZzZXQgdG8gYWRkIHRvIFxhciB0byBjb21wdXRlIGVmZmVjdGl2ZSBhZGRyZXNzIHRvIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZQotICoJCShub3RlOiBzb21lIG51bWJlciBvZiBsc2JpdHMgYXJlIGlnbm9yZWQpCi0gKi8KLQkubWFjcm8JZGNhY2hlX3dyaXRlYmFja19pbnZfbGluZQlhciwgb2Zmc2V0Ci0jaWYgWENIQUxfRENBQ0hFX1NJWkUgPiAwCi0JZGh3YmkJXGFyLCBcb2Zmc2V0CS8qIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZSBkY2FjaGUgbGluZSAqLwotCWRjYWNoZV9zeW5jCVxhcgotI2VuZGlmCi0JLmVuZG0KLQotCi0KLS8qCi0gKiAgV3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlIGRhdGEgY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIGEgc3BlY2lmaWVkIHBvcnRpb24gb2YgbWVtb3J5LgotICogIFBhcmFtZXRlcnMgYXJlOgotICoJYXN0YXJ0CXN0YXJ0IGFkZHJlc3MgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQotICoJYXNpemUJc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKLSAqCWFjCXVuaXF1ZSByZWdpc3RlciB1c2VkIGFzIHRlbXBvcmFyeQotICovCi0JLm1hY3JvCWRjYWNoZV93cml0ZWJhY2tfaW52X3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYwotI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAotCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiB3cml0ZWJhY2sgYW5kIGludmFsaWRhdGU6Ci0JY2FjaGVfaGl0X3JlZ2lvbglkaHdiaSwgWENIQUxfRENBQ0hFX0xJTkVXSURUSCwgXGFzdGFydCwgXGFzaXplLCBcYWMKLQlkY2FjaGVfc3luYwlcYWMKLQkvLyAgRW5kIG9mIGRhdGEgY2FjaGUgcmVnaW9uIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZQotI2VuZGlmCi0JLmVuZG0KLQotCi0KLS8qCi0gKiAgV3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlIGVudGlyZSBkYXRhIGNhY2hlLgotICogIFBhcmFtZXRlcnM6Ci0gKglhYSwgYWIJCXVuaXF1ZSBhZGRyZXNzIHJlZ2lzdGVycyAodGVtcG9yYXJpZXMpCi0gKi8KLQkubWFjcm8JZGNhY2hlX3dyaXRlYmFja19pbnZfYWxsCWFhLCBhYgotI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAotCS8vICBEYXRhIGNhY2hlIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZToKLSNpZiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCi0JY2FjaGVfaW5kZXhfYWxsCQlkaXdiaSwgWENIQUxfRENBQ0hFX1NJWkUsIFhDSEFMX0RDQUNIRV9MSU5FU0laRSwgMSwgXGFhLCBcYWIKLQlkY2FjaGVfc3luYwlcYWEKLSNlbHNlIC8qd3JpdGViYWNrKi8KLQkvLyAgRGF0YSBjYWNoZSBkb2VzIG5vdCBzdXBwb3J0IHdyaXRlYmFjaywgc28ganVzdCBpbnZhbGlkYXRlOiAqLwotCWRjYWNoZV9pbnZhbGlkYXRlX2FsbAlcYWEsIFxhYgotI2VuZGlmIC8qd3JpdGViYWNrKi8KLQkvLyAgRW5kIG9mIGRhdGEgY2FjaGUgd3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlCi0jZW5kaWYKLQkuZW5kbQotCi0KLQotCi0vKgotICogIExvY2sgKHByZWZldGNoICYgbG9jaykgYSBzaW5nbGUgbGluZSBvZiB0aGUgZGF0YSBjYWNoZS4KLSAqCi0gKiAgUGFyYW1ldGVycyBhcmU6Ci0gKglhcglhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgKHZpcnR1YWwpIGFkZHJlc3MgdG8gbG9jawotICoJCShtYXkgZ2V0IGNsb2JiZXJlZCBpbiBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG5vdCBjdXJyZW50bHkpCi0gKglvZmZzZXQJb2Zmc2V0IHRvIGFkZCB0byBcYXIgdG8gY29tcHV0ZSBlZmZlY3RpdmUgYWRkcmVzcyB0byBsb2NrCi0gKgkJKG5vdGU6IHNvbWUgbnVtYmVyIG9mIGxzYml0cyBhcmUgaWdub3JlZCkKLSAqLwotCS5tYWNybwlkY2FjaGVfbG9ja19saW5lCWFyLCBvZmZzZXQKLSNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUKLQlkcGZsCVxhciwgXG9mZnNldAkvKiBwcmVmZXRjaCBhbmQgbG9jayBkY2FjaGUgbGluZSAqLwotCWRjYWNoZV9zeW5jCVxhcgotI2VuZGlmCi0JLmVuZG0KLQotCi0KLS8qCi0gKiAgTG9jayAocHJlZmV0Y2ggJiBsb2NrKSBhIHNwZWNpZmllZCBwb3J0aW9uIG9mIG1lbW9yeSBpbnRvIHRoZSBkYXRhIGNhY2hlLgotICogIFBhcmFtZXRlcnMgYXJlOgotICoJYXN0YXJ0CXN0YXJ0IGFkZHJlc3MgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQotICoJYXNpemUJc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKLSAqCWFjCXVuaXF1ZSByZWdpc3RlciB1c2VkIGFzIHRlbXBvcmFyeQotICovCi0JLm1hY3JvCWRjYWNoZV9sb2NrX3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYwotI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRQotCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiBsb2NrOgotCWNhY2hlX2hpdF9yZWdpb24JZHBmbCwgWENIQUxfRENBQ0hFX0xJTkVXSURUSCwgXGFzdGFydCwgXGFzaXplLCBcYWMKLQlkY2FjaGVfc3luYwlcYWMKLQkvLyAgRW5kIG9mIGRhdGEgY2FjaGUgcmVnaW9uIGxvY2sKLSNlbmRpZgotCS5lbmRtCi0KLQotCi0vKgotICogIFVubG9jayBhIHNpbmdsZSBsaW5lIG9mIHRoZSBkYXRhIGNhY2hlLgotICoKLSAqICBQYXJhbWV0ZXJzIGFyZToKLSAqCWFyCWFkZHJlc3MgcmVnaXN0ZXIgdGhhdCBjb250YWlucyAodmlydHVhbCkgYWRkcmVzcyB0byB1bmxvY2sKLSAqCQkobWF5IGdldCBjbG9iYmVyZWQgaW4gYSBmdXR1cmUgaW1wbGVtZW50YXRpb24sIGJ1dCBub3QgY3VycmVudGx5KQotICoJb2Zmc2V0CW9mZnNldCB0byBhZGQgdG8gXGFyIHRvIGNvbXB1dGUgZWZmZWN0aXZlIGFkZHJlc3MgdG8gdW5sb2NrCi0gKgkJKG5vdGU6IHNvbWUgbnVtYmVyIG9mIGxzYml0cyBhcmUgaWdub3JlZCkKLSAqLwotCS5tYWNybwlkY2FjaGVfdW5sb2NrX2xpbmUJYXIsIG9mZnNldAotI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRQotCWRodQlcYXIsIFxvZmZzZXQJLyogdW5sb2NrIGRjYWNoZSBsaW5lICovCi0JZGNhY2hlX3N5bmMJXGFyCi0jZW5kaWYKLQkuZW5kbQotCi0KLQotLyoKLSAqICBVbmxvY2sgYSBzcGVjaWZpZWQgcG9ydGlvbiBvZiBtZW1vcnkgZnJvbSB0aGUgZGF0YSBjYWNoZS4KLSAqICBQYXJhbWV0ZXJzIGFyZToKLSAqCWFzdGFydAlzdGFydCBhZGRyZXNzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKLSAqCWFzaXplCXNpemUgb2YgdGhlIHJlZ2lvbiBpbiBieXRlcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCi0gKglhYwl1bmlxdWUgcmVnaXN0ZXIgdXNlZCBhcyB0ZW1wb3JhcnkKLSAqLwotCS5tYWNybwlkY2FjaGVfdW5sb2NrX3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYwotI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRQotCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiB1bmxvY2s6Ci0JY2FjaGVfaGl0X3JlZ2lvbglkaHUsIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgsIFxhc3RhcnQsIFxhc2l6ZSwgXGFjCi0JZGNhY2hlX3N5bmMJXGFjCi0JLy8gIEVuZCBvZiBkYXRhIGNhY2hlIHJlZ2lvbiB1bmxvY2sKLSNlbmRpZgotCS5lbmRtCi0KLQotCi0vKgotICogIFVubG9jayBlbnRpcmUgZGF0YSBjYWNoZS4KLSAqCi0gKiAgUGFyYW1ldGVyczoKLSAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKLSAqLwotCS5tYWNybwlkY2FjaGVfdW5sb2NrX2FsbAlhYSwgYWIKLSNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUKLQkvLyAgRGF0YSBjYWNoZSB1bmxvY2s6Ci0JY2FjaGVfaW5kZXhfYWxsCQlkaXUsIFhDSEFMX0RDQUNIRV9TSVpFLCBYQ0hBTF9EQ0FDSEVfTElORVNJWkUsIDEsIFxhYSwgXGFiCi0JZGNhY2hlX3N5bmMJXGFhCi0JLy8gIEVuZCBvZiBkYXRhIGNhY2hlIHVubG9jawotI2VuZGlmCi0JLmVuZG0KLQotCi0jZW5kaWYgLypYVEVOU0FfQ0FDSEVBU01fSCovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY2FjaGVhdHRyYXNtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NhY2hlYXR0cmFzbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzNlMTE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY2FjaGVhdHRyYXNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotI2lmbmRlZiBYVEVOU0FfQ0FDSEVBVFRSQVNNX0gKLSNkZWZpbmUgWFRFTlNBX0NBQ0hFQVRUUkFTTV9ICi0KLS8qCi0gKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0tIERPIE5PVCBNT0RJRlkgQlkgSEFORAotICoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY2FjaGVhdHRyYXNtLmggLS0gYXNzZW1ibGVyLXNwZWNpZmljCi0gKiBDQUNIRUFUVFIgcmVnaXN0ZXIgcmVsYXRlZCBkZWZpbml0aW9ucyB0aGF0IGRlcGVuZCBvbiBDT1JFCi0gKiBjb25maWd1cmF0aW9uLgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgotICovCi0KLQotI2luY2x1ZGUgPHh0ZW5zYS9jb3JlYXNtLmg+Ci0KLQotLyoKLSAqICBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgYXNzZW1ibGVyIG1hY3JvcyBvZiB0aGUgZm9ybToKLSAqCTx4PmNhY2hlYXR0cl88ZnVuYz4KLSAqICB3aGVyZToKLSAqCTx4PiBpcyAnaScsICdkJyBvciBhYnNlbnQgZm9yIGluc3RydWN0aW9uLCBkYXRhCi0gKgkJb3IgYm90aCBjYWNoZXM7IGFuZAotICoJPGZ1bmM+IGluZGljYXRlcyB0aGUgZnVuY3Rpb24gb2YgdGhlIG1hY3JvLgotICoKLSAqICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZDoKLSAqCi0gKiAgaWNhY2hlYXR0cl9nZXQKLSAqCVJlYWRzIEktY2FjaGUgQ0FDSEVBVFRSIGludG8gYTIgKGNsb2JiZXJzIGEzLWE1KS4KLSAqCi0gKiAgZGNhY2hlYXR0cl9nZXQKLSAqCVJlYWRzIEQtY2FjaGUgQ0FDSEVBVFRSIGludG8gYTIgKGNsb2JiZXJzIGEzLWE1KS4KLSAqCShOb3RlOiAgZm9yIGNvbmZpZ3Mgd2l0aCBhIHJlYWwgQ0FDSEVBVFRSIHJlZ2lzdGVyLCB0aGUKLSAqCSBhYm92ZSB0d28gbWFjcm9zIGFyZSBpZGVudGljYWwuKQotICoKLSAqICBjYWNoZWF0dHJfc2V0Ci0gKglXcml0ZXMgYm90aCBJLWNhY2hlIGFuZCBELWNhY2hlIENBQ0hFQVRUUnMgZnJvbSBhMiAoYTMtYTggY2xvYmJlcmVkKS4KLSAqCVdvcmtzIGV2ZW4gd2hlbiBjaGFuZ2luZyBvbmUncyBvd24gY29kZSdzIGF0dHJpYnV0ZXMuCi0gKgotICogIGljYWNoZWF0dHJfaXNfZW5hYmxlZCAgbGFiZWwKLSAqCUJyYW5jaGVzIHRvIFxsYWJlbCBpZiBJLWNhY2hlIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGVuYWJsZWQKLSAqCShlZy4gaWYgQ0FDSEVBVFRSIGNvbnRhaW5zIGEgY2FjaGUtZW5hYmxlZCBhdHRyaWJ1dGUpLgotICoJKGNsb2JiZXJzIGEyLWE1LFNBUikKLSAqCi0gKiAgZGNhY2hlYXR0cl9pc19lbmFibGVkICBsYWJlbAotICoJQnJhbmNoZXMgdG8gXGxhYmVsIGlmIEQtY2FjaGUgYXBwZWFycyB0byBoYXZlIGJlZW4gZW5hYmxlZAotICoJKGVnLiBpZiBDQUNIRUFUVFIgY29udGFpbnMgYSBjYWNoZS1lbmFibGVkIGF0dHJpYnV0ZSkuCi0gKgkoY2xvYmJlcnMgYTItYTUsU0FSKQotICoKLSAqICBjYWNoZWF0dHJfaXNfZW5hYmxlZCAgbGFiZWwKLSAqCUJyYW5jaGVzIHRvIFxsYWJlbCBpZiBlaXRoZXIgSS1jYWNoZSBvciBELWNhY2hlIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGVuYWJsZWQKLSAqCShlZy4gaWYgQ0FDSEVBVFRSIGNvbnRhaW5zIGEgY2FjaGUtZW5hYmxlZCBhdHRyaWJ1dGUpLgotICoJKGNsb2JiZXJzIGEyLWE1LFNBUikKLSAqCi0gKiAgVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG9ubHkgZGVmaW5lZCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM6Ci0gKgotICogIGljYWNoZWF0dHJfc2V0CShpZiBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIpCi0gKglXcml0ZXMgSS1jYWNoZSBDQUNIRUFUVFIgZnJvbSBhMiAoYTMtYTggY2xvYmJlcmVkKS4KLSAqCi0gKiAgZGNhY2hlYXR0cl9zZXQJKGlmIFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUikKLSAqCVdyaXRlcyBELWNhY2hlIENBQ0hFQVRUUiBmcm9tIGEyIChhMy1hOCBjbG9iYmVyZWQpLgotICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgR0VORVJJQyAtLSBBTEwgQ0FDSEVTICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogIF9jYWNoZWF0dHJfZ2V0Ci0gKgotICogIChJbnRlcm5hbCBtYWNyby4pCi0gKiAgUmV0dXJucyB2YWx1ZSBvZiBDQUNIRUFUVFIgcmVnaXN0ZXIgKG9yIGNsb3Nlc3QgZXF1aXZhbGVudCkgaW4gYTIuCi0gKgotICogIEVudHJ5OgotICoJKG5vbmUpCi0gKiAgRXhpdDoKLSAqCWEyCXZhbHVlIHJlYWQgZnJvbSBDQUNIRUFUVFIKLSAqCWEzLWE1CWNsb2JiZXJlZCAodGVtcG9yYXJpZXMpCi0gKi8KLQkubWFjcm8JX2NhY2hlYXR0cl9nZXQJdGxiCi0jaWYgWENIQUxfSEFWRV9DQUNIRUFUVFIKLQlyc3IJYTIsIENBQ0hFQVRUUgotI2VsaWYgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSCi0JLy8gIFdlIGhhdmUgYSBjb25maWcgdGhhdCAibWltaWNzIiBDQUNIRUFUVFIgdXNpbmcgYSBzaW1wbGlmaWVkCi0JLy8gICJNTVUiIGNvbXBvc2VkIG9mIGEgc2luZ2xlIHN0YXRpY2FsbHktbWFwcGVkIHdheS4KLQkvLyAgRFRMQiBhbmQgSVRMQiBhcmUgaW5kZXBlbmRlbnQsIHNvIHRoZXJlJ3Mgbm8gc2luZ2xlCi0JLy8gIGNhY2hlIGF0dHJpYnV0ZSB0aGF0IGNhbiBkZXNjcmliZSBib3RoLiAgU28gZm9yIG5vdwotCS8vICBqdXN0IHJldHVybiB0aGUgRFRMQiBzdGF0ZS4KLQltb3ZpCWE1LCAweEUwMDAwMDAwCi0JbW92aQlhMiwgMAotCW1vdmkJYTMsIDAKLTE6CWFkZAlhMywgYTMsIGE1CS8vIG5leHQgc2VnbWVudAotCXImdGxiJjEJYTQsIGEzCQkvLyBnZXQgUFBOK0NBIG9mIHNlZ21lbnQgYXQgMHhFMDAwMDAwMCwgMHhDMDAwMDAwMCwgLi4uLCAwCi0JZHN5bmMJLy8gaW50ZXJsb2NrPz8/Ci0Jc2xsaQlhMiwgYTIsIDQKLQlleHR1aQlhNCwgYTQsIDAsIDQJLy8gZXh0cmFjdCBDQQotCW9yCWEyLCBhMiwgYTQKLQlibmV6CWEzLCAxYgotI2Vsc2UKLQkvLyAgVGhpcyBtYWNybyBpc24ndCBhcHBsaWNhYmxlIHRvIGFyYml0cmFyeSBNTVUgY29uZmlndXJhdGlvbnMuCi0JLy8gIEp1c3QgcmV0dXJuIHplcm8uCi0JbW92aQlhMiwgMAotI2VuZGlmCi0JLmVuZG0KLQotCS5tYWNybwlpY2FjaGVhdHRyX2dldAotCV9jYWNoZWF0dHJfZ2V0CWl0bGIKLQkuZW5kbQotCi0JLm1hY3JvCWRjYWNoZWF0dHJfZ2V0Ci0JX2NhY2hlYXR0cl9nZXQJZHRsYgotCS5lbmRtCi0KLQotI2RlZmluZSBYQ0hBTF9DQUNIRUFUVFJfQUxMX0JZUEFTUwkweDIyMjIyMjIyCS8qIGRlZmF1bHQgKHBvd2VydXAvcmVzZXQpIHZhbHVlIG9mIENBQ0hFQVRUUiwgYWxsIEJZUEFTUwotCQkJCQkJCSAgIG1vZGUgKGllLiBkaXNhYmxlZC9ieXBhc3NlZCBjYWNoZXMpICovCi0KLSNpZiBYQ0hBTF9IQVZFX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIKLQotI2RlZmluZSBYQ0hBTF9GQ0FfRU5BTUFTSwkweDAwMUEJLyogYml0bWFwIG9mIGZldGNoIGF0dHJpYnV0ZXMgdGhhdCByZXF1aXJlIGVuYWJsZWQgaWNhY2hlICovCi0jZGVmaW5lIFhDSEFMX0xDQV9FTkFNQVNLCTB4MDAwMwkvKiBiaXRtYXAgb2YgbG9hZCAgYXR0cmlidXRlcyB0aGF0IHJlcXVpcmUgZW5hYmxlZCBkY2FjaGUgKi8KLSNkZWZpbmUgWENIQUxfU0NBX0VOQU1BU0sJMHgwMDAzCS8qIGJpdG1hcCBvZiBzdG9yZSBhdHRyaWJ1dGVzIHRoYXQgcmVxdWlyZSBlbmFibGVkIGRjYWNoZSAqLwotI2RlZmluZSBYQ0hBTF9MU0NBX0VOQU1BU0sJKFhDSEFMX0xDQV9FTkFNQVNLfFhDSEFMX1NDQV9FTkFNQVNLKQkvKiBsL3MgYXR0cnMgcmVxdWlyaW5nIGVuYWJsZWQgZGNhY2hlICovCi0jZGVmaW5lIFhDSEFMX0FMTENBX0VOQU1BU0sJKFhDSEFMX0ZDQV9FTkFNQVNLfFhDSEFMX0xTQ0FfRU5BTUFTSykJLyogYWxsIGF0dHJzIHJlcXVpcmluZyBlbmFibGVkIGNhY2hlcyAqLwotCi0vKgotICogIF9jYWNoZWF0dHJfaXNfZW5hYmxlZAotICoKLSAqICAoSW50ZXJuYWwgbWFjcm8uKQotICogIEJyYW5jaGVzIHRvIFxsYWJlbCBpZiBDQUNIRUFUVFIgaW4gYTIgaW5kaWNhdGVzIGFuIGVuYWJsZWQKLSAqICBjYWNoZSwgdXNpbmcgbWFzayBpbiBhMy4KLSAqCi0gKiAgUGFyYW1ldGVyczoKLSAqCWxhYmVsCXdoZXJlIHRvIGJyYW5jaCB0byBpZiBjYWNoZSBpcyBlbmFibGVkCi0gKiAgRW50cnk6Ci0gKglhMgljb250YWlucyBDQUNIRUFUVFIgdmFsdWUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlcgotICoJCWNhY2hlcyBhcmUgZW5hYmxlZAotICoJYTMJMTYtYml0IGNvbnN0YW50IHdoZXJlIGVhY2ggYml0IGNvcnJlc3BvbmQgdG8KLSAqCQlvbmUgb2YgdGhlIDE2IHBvc3NpYmxlIENBIHZhbHVlcyAoaW4gYSBDQUNIRUFUVFIgbWFzayk7Ci0gKgkJQ0EgdmFsdWVzIHRoYXQgaW5kaWNhdGUgdGhlIGNhY2hlIGlzIGVuYWJsZWQKLSAqCQloYXZlIHRoZWlyIGNvcnJlc3BvbmRpbmcgYml0IHNldCBpbiB0aGlzIG1hc2sKLSAqCQkoZWcuIHVzZSBYQ0hBTF94Q0FfRU5BTUFTSyAsIGFib3ZlKQotICogIEV4aXQ6Ci0gKglhMixhNCxhNQljbG9iYmVyZWQKLSAqCVNBUgkJY2xvYmJlcmVkCi0gKi8KLQkubWFjcm8JX2NhY2hlYXR0cl9pc19lbmFibGVkCWxhYmVsCi0JbW92aQlhNCwgOAkJLy8gbG9vcCA4IHRpbWVzCi0uTGNhaWZlXEA6Ci0JZXh0dWkJYTUsIGEyLCAwLCA0CS8vIGdldCBDQSBuaWJibGUKLQlzc3IJYTUJCS8vIGluZGV4IGludG8gbWFzayBhY2NvcmRpbmcgdG8gQ0EuLi4KLQlzcmwJYTUsIGEzCQkvLyAuLi5hbmQgZ2V0IENBJ3MgbWFzayBiaXQgaW4gYTUgYml0IDAKLQliYnNpLmwJYTUsIDAsIFxsYWJlbAkvLyBpZiBDQSBpbmRpY2F0ZXMgY2FjaGUgZW5hYmxlZCwganVtcCB0byBsYWJlbAotCXNybGkJYTIsIGEyLCA0CS8vIG5leHQgbmliYmxlCi0JYWRkaQlhNCwgYTQsIC0xCi0JYm5leglhNCwgLkxjYWlmZVxACS8vIGxvb3AgZm9yIGVhY2ggbmliYmxlCi0JLmVuZG0KLQotI2Vsc2UgLyogWENIQUxfSEFWRV9DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSICovCi0JLm1hY3JvCV9jYWNoZWF0dHJfaXNfZW5hYmxlZAlsYWJlbAotCWoJXGxhYmVsCQkvLyBtYWNybyBub3QgYXBwbGljYWJsZSwgYXNzdW1lIGNhY2hlcyBhbHdheXMgZW5hYmxlZAotCS5lbmRtCi0jZW5kaWYgLyogWENIQUxfSEFWRV9DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSICovCi0KLQotCi0vKgotICogIGljYWNoZWF0dHJfaXNfZW5hYmxlZAotICoKLSAqICBCcmFuY2hlcyB0byBcbGFiZWwgaWYgSS1jYWNoZSBpcyBlbmFibGVkLgotICoKLSAqICBQYXJhbWV0ZXJzOgotICoJbGFiZWwJd2hlcmUgdG8gYnJhbmNoIHRvIGlmIGljYWNoZSBpcyBlbmFibGVkCi0gKiAgRW50cnk6Ci0gKgkobm9uZSkKLSAqICBFeGl0OgotICoJYTItYTUsIFNBUgljbG9iYmVyZWQgKHRlbXBvcmFyaWVzKQotICovCi0JLm1hY3JvCWljYWNoZWF0dHJfaXNfZW5hYmxlZAlsYWJlbAotI2lmIFhDSEFMX0hBVkVfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgotCWljYWNoZWF0dHJfZ2V0Ci0JbW92aQlhMywgWENIQUxfRkNBX0VOQU1BU0sKLSNlbmRpZgotCV9jYWNoZWF0dHJfaXNfZW5hYmxlZAlcbGFiZWwKLQkuZW5kbQotCi0vKgotICogIGRjYWNoZWF0dHJfaXNfZW5hYmxlZAotICoKLSAqICBCcmFuY2hlcyB0byBcbGFiZWwgaWYgRC1jYWNoZSBpcyBlbmFibGVkLgotICoKLSAqICBQYXJhbWV0ZXJzOgotICoJbGFiZWwJd2hlcmUgdG8gYnJhbmNoIHRvIGlmIGRjYWNoZSBpcyBlbmFibGVkCi0gKiAgRW50cnk6Ci0gKgkobm9uZSkKLSAqICBFeGl0OgotICoJYTItYTUsIFNBUgljbG9iYmVyZWQgKHRlbXBvcmFyaWVzKQotICovCi0JLm1hY3JvCWRjYWNoZWF0dHJfaXNfZW5hYmxlZAlsYWJlbAotI2lmIFhDSEFMX0hBVkVfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgotCWRjYWNoZWF0dHJfZ2V0Ci0JbW92aQlhMywgWENIQUxfTFNDQV9FTkFNQVNLCi0jZW5kaWYKLQlfY2FjaGVhdHRyX2lzX2VuYWJsZWQJXGxhYmVsCi0JLmVuZG0KLQotLyoKLSAqICBjYWNoZWF0dHJfaXNfZW5hYmxlZAotICoKLSAqICBCcmFuY2hlcyB0byBcbGFiZWwgaWYgZWl0aGVyIEktY2FjaGUgb3IgRC1jYWNoZSBpcyBlbmFibGVkLgotICoKLSAqICBQYXJhbWV0ZXJzOgotICoJbGFiZWwJd2hlcmUgdG8gYnJhbmNoIHRvIGlmIGEgY2FjaGUgaXMgZW5hYmxlZAotICogIEVudHJ5OgotICoJKG5vbmUpCi0gKiAgRXhpdDoKLSAqCWEyLWE1LCBTQVIJY2xvYmJlcmVkICh0ZW1wb3JhcmllcykKLSAqLwotCS5tYWNybwljYWNoZWF0dHJfaXNfZW5hYmxlZAlsYWJlbAotI2lmIFhDSEFMX0hBVkVfQ0FDSEVBVFRSCi0JcnNyCWEyLCBDQUNIRUFUVFIKLQltb3ZpCWEzLCBYQ0hBTF9BTExDQV9FTkFNQVNLCi0jZWxpZiBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIKLQlpY2FjaGVhdHRyX2dldAotCW1vdmkJYTMsIFhDSEFMX0ZDQV9FTkFNQVNLCi0JX2NhY2hlYXR0cl9pc19lbmFibGVkCVxsYWJlbAotCWRjYWNoZWF0dHJfZ2V0Ci0JbW92aQlhMywgWENIQUxfTFNDQV9FTkFNQVNLCi0jZW5kaWYKLQlfY2FjaGVhdHRyX2lzX2VuYWJsZWQJXGxhYmVsCi0JLmVuZG0KLQotCi0KLS8qCi0gKiAgVGhlIElTQSBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCB3YXkgdG8gY2hhbmdlIHRoZQotICogIGluc3RydWN0aW9uIGNhY2hlIGF0dHJpYnV0ZXMgb2YgdGhlIHJ1bm5pbmcgY29kZSwKLSAqICBpZS4gb2YgdGhlIG1lbW9yeSBhcmVhIHRoYXQgZW5jbG9zZXMgdGhlIGN1cnJlbnQgUEMuCi0gKiAgSG93ZXZlciwgZWFjaCBtaWNyby1hcmNoaXRlY3R1cmUgKG9yIGNsYXNzIG9mCi0gKiAgY29uZmlndXJhdGlvbnMgd2l0aGluIGEgbWljcm8tYXJjaGl0ZWN0dXJlKQotICogIHByb3ZpZGVzIGEgd2F5IHRvIGRlYWwgd2l0aCB0aGlzIGlzc3VlLgotICoKLSAqICBIZXJlIGFyZSBhIGZldyBtYWNyb3MgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHJlbGV2YW50Ci0gKiAgYXBwcm9hY2ggdGFrZW4uCi0gKi8KLQotI2lmIFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgotCS8vICBXZSBoYXZlIGEgY29uZmlnIHRoYXQgIm1pbWljcyIgQ0FDSEVBVFRSIHVzaW5nIGEgc2ltcGxpZmllZAotCS8vICAiTU1VIiBjb21wb3NlZCBvZiBhIHNpbmdsZSBzdGF0aWNhbGx5LW1hcHBlZCB3YXkuCi0KLS8qCi0gKiAgaWNhY2hlYXR0cl9zZXQKLSAqCi0gKiAgRW50cnk6Ci0gKglhMgkJY2FjaGVhdHRyIHZhbHVlIHRvIHNldAotICogIEV4aXQ6Ci0gKglhMgkJdW5jaGFuZ2VkCi0gKglhMy1hOAkJY2xvYmJlcmVkICh0ZW1wb3JhcmllcykKLSAqLwotCS5tYWNybwlpY2FjaGVhdHRyX3NldAotCi0JbW92aQlhNSwgMHhFMDAwMDAwMAkvLyBtYXNrIG9mIHVwcGVyIDMgYml0cwotCW1vdmkJYTYsIDNmCQkvLyBQQyB3aGVyZSBJVExCIGlzIHNldAotCW1vdmkJYTMsIDAJCS8vIHN0YXJ0IGF0IHJlZ2lvbiAwICgwIC4uIDcpCi0JYW5kCWE2LCBhNiwgYTUJLy8gdXBwZXIgMyBiaXRzIG9mIGxvY2FsIFBDIGFyZWEKLQltb3YJYTcsIGEyCQkvLyBjb3B5IGEyIHNvIGl0IGRvZXNuJ3QgZ2V0IGNsb2JiZXJlZAotCWoJM2YKLQotIyBpZiBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIKLQkvLyAgQ2FuIGRvIHRyYW5zbGF0aW9ucywgdXNlIGdlbmVyaWMgbWV0aG9kOgotMToJc3ViCWE2LCBhMywgYTUJLy8gYWRkcmVzcyBvZiBzb21lIG90aGVyIHNlZ21lbnQKLQlyaXRsYjEJYTgsIGE2CQkvLyBzYXZlIGl0cyBQUE4rQ0EKLQlkc3luYwkvLyBpbnRlcmxvY2s/PwotCXdpdGxiCWE0LCBhNgkJLy8gbWFrZSBpdCB0cmFuc2xhdGUgdG8gdGhpcyBjb2RlIGFyZWEKLQltb3ZpCWE2LCA1ZgkJLy8gd2hlcmUgdG8ganVtcCBpbnRvIGl0Ci0JaXN5bmMKLQlzdWIJYTYsIGE2LCBhNQkvLyBhZGp1c3QganVtcCBhZGRyZXNzIHdpdGhpbiB0aGF0IG90aGVyIHNlZ21lbnQKLQlqeAlhNgotCi0JLy8gIE5vdGUgdGhhdCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgc25pcHBldCwgd2hpY2ggcnVucyBhdCBhIGRpZmZlcmVudCB2aXJ0dWFsCi0JLy8gIGFkZHJlc3MgdGhhbiBpdCBpcyBhc3NlbWJsZWQgZm9yLCB3ZSBhdm9pZCB1c2luZyBsaXRlcmFscyAoZWcuIHZpYSBtb3ZpL2wzMnIpCi0JLy8gIGp1c3QgaW4gY2FzZSBsaXRlcmFscyBlbmQgdXAgaW4gYSBkaWZmZXJlbnQgNTEyIE1CIHNlZ21lbnQsIGFuZCB3ZSBhdm9pZAotCS8vICBpbnN0cnVjdGlvbnMgdGhhdCByZWx5IG9uIHRoZSBjdXJyZW50IFBDIGJlaW5nIHdoYXQgaXMgZXhwZWN0ZWQuCi0JLy8KLQkuYWxpZ24JNAotCV9qCTZmCQkvLyB0aGlzIGlzIGF0IGxhYmVsICc1JyBtaW51cyA0IGJ5dGVzCi0JLmFsaWduCTQKLTU6CXdpdGxiCWE0LCBhMwkJLy8gd2UncmUgaW4gb3RoZXIgc2VnbWVudCwgbm93IGNhbiB3cml0ZSBwcmV2aW91cyBzZWdtZW50J3MgQ0EKLQlpc3luYwotCWFkZAlhNiwgYTYsIGE1CS8vIGJhY2sgdG8gcHJldmlvdXMgc2VnbWVudAotCWFkZGkJYTYsIGE2LCAtNAkvLyBuZXh0IGp1bXAgbGFiZWwKLQlqeAlhNgotCi02OglzdWIJYTYsIGEzLCBhNQkvLyBhZGRyZXNzIG9mIHNvbWUgb3RoZXIgc2VnbWVudAotCXdpdGxiCWE4LCBhNgkJLy8gcmVzdG9yZSBQUE4rQ0Egb2Ygb3RoZXIgc2VnbWVudAotCW1vdglhNiwgYTMJCS8vIHJlc3RvcmUgYTYKLQlpc3luYwotIyBlbHNlIC8qIFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUiAqLwotCS8vICBVc2UgbWljcm8tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIG1ldGhvZC4KLQkvLyAgVGhlIGZvbGxvd2luZyA0LWluc3RydWN0aW9uIHNlcXVlbmNlIGlzIGFsaWduZWQgc3VjaCB0aGF0Ci0JLy8gIGl0IGFsbCBmaXRzIHdpdGhpbiBhIHNpbmdsZSBJLWNhY2hlIGxpbmUuICBTaXh0ZWVuIGJ5dGUKLQkvLyAgYWxpZ25tZW50IGlzIHN1ZmZpY2llbnQgZm9yIHRoaXMgKHVzaW5nIFhDSEFMX0lDQUNIRV9MSU5FU0laRQotCS8vICBhY3R1YWxseSBjYXVzZXMgcHJvYmxlbXMgYmVjYXVzZSB0aGF0IGNhbiBiZSBncmVhdGVyIHRoYW4KLQkvLyAgdGhlIGFsaWdubWVudCBvZiB0aGUgcmVzZXQgdmVjdG9yLCB3aGVyZSB0aGlzIG1hY3JvIGlzIG9mdGVuCi0JLy8gIGludm9rZWQsIHdoaWNoIHdvdWxkIGNhdXNlIHRoZSBsaW5rZXIgdG8gYWxpZ24gdGhlIHJlc2V0Ci0JLy8gIHZlY3RvciBjb2RlIGF3YXkgZnJvbSB0aGUgcmVzZXQgdmVjdG9yISEpLgotCS5hbGlnbgkxNiAvKlhDSEFMX0lDQUNIRV9MSU5FU0laRSovCi0xOglfd2l0bGIJYTQsIGEzCQkvLyB3cml0ZSB3aXJlZCBQVEUgKENBLCBubyBQUE4pIG9mIDUxMk1CIHNlZ21lbnQgdG8gSVRMQgotCV9pc3luYwotCW5vcAotCW5vcAotIyBlbmRpZiAvKiBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIgKi8KLQliZXEJYTMsIGE1LCA0ZgkvLyBkb25lPwotCi0JLy8gIE5vdGUgdGhhdCBpbiB0aGUgV0lUTEIgbG9vcCwgd2UgZG9uJ3QgZG8gYW55IGxvYWQvc3RvcmVzCi0JLy8gIChtYXkgbm90IGJlIGFuIGlzc3VlIGhlcmUsIGJ1dCBpdCBpcyBpbXBvcnRhbnQgaW4gdGhlIERUTEIgY2FzZSkuCi0yOglzcmxpCWE3LCBhNywgNAkvLyBuZXh0IENBCi0Jc3ViCWEzLCBhMywgYTUJLy8gbmV4dCBzZWdtZW50IChhZGQgMHgyMDAwMDAwMCkKLTM6Ci0jIGlmIFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgkvKiBpZiBoYXZlIHRyYW5zbGF0aW9uLCBwcmVzZXJ2ZSBpdCAqLwotCXJpdGxiMQlhOCwgYTMJCS8vIGdldCBjdXJyZW50IFBQTitDQSBvZiBzZWdtZW50Ci0JZHN5bmMJLy8gaW50ZXJsb2NrPz8/Ci0JZXh0dWkJYTQsIGE3LCAwLCA0CS8vIGV4dHJhY3QgQ0EgdG8gc2V0Ci0Jc3JsaQlhOCwgYTgsIDQJLy8gY2xlYXIgQ0EgYnV0IGtlZXAgUFBOIC4uLgotCXNsbGkJYTgsIGE4LCA0CS8vIC4uLgotCWFkZAlhNCwgYTQsIGE4CS8vIGNvbWJpbmUgbmV3IENBIHdpdGggUFBOIHRvIHByZXNlcnZlCi0jIGVsc2UKLQlleHR1aQlhNCwgYTcsIDAsIDQJLy8gZXh0cmFjdCBDQQotIyBlbmRpZgotCWJlcQlhMywgYTYsIDFiCS8vIGN1cnJlbnQgUEMncyByZWdpb24/IGlmIHNvLCBkbyBpdCBpbiBhIHNhZmUgd2F5Ci0Jd2l0bGIJYTQsIGEzCQkvLyB3cml0ZSB3aXJlZCBQVEUgKENBIFsrUFBOXSkgb2YgNTEyTUIgc2VnbWVudCB0byBJVExCCi0JYm5lCWEzLCBhNSwgMmIKLQlpc3luYwkJCS8vIG1ha2Ugc3VyZSBhbGwgaWZldGNoIGNoYW5nZXMgdGFrZSBlZmZlY3QKLTQ6Ci0JLmVuZG0JLy8gaWNhY2hlYXR0cl9zZXQKLQotCi0vKgotICogIGRjYWNoZWF0dHJfc2V0Ci0gKgotICogIEVudHJ5OgotICoJYTIJCWNhY2hlYXR0ciB2YWx1ZSB0byBzZXQKLSAqICBFeGl0OgotICoJYTIJCXVuY2hhbmdlZAotICoJYTMtYTgJCWNsb2JiZXJlZCAodGVtcG9yYXJpZXMpCi0gKi8KLQotCS5tYWNybwlkY2FjaGVhdHRyX3NldAotCi0JbW92aQlhNSwgMHhFMDAwMDAwMAkvLyBtYXNrIG9mIHVwcGVyIDMgYml0cwotCW1vdmkJYTMsIDAJCS8vIHN0YXJ0IGF0IHJlZ2lvbiAwICgwIC4uIDcpCi0JbW92CWE3LCBhMgkJLy8gY29weSBhMiBzbyBpdCBkb2Vzbid0IGdldCBjbG9iYmVyZWQKLQlqCTNmCi0JLy8gIE5vdGUgdGhhdCBpbiB0aGUgV0RUTEIgbG9vcCwgd2UgZG9uJ3QgZG8gYW55IGxvYWQvc3RvcmVzCi0JLy8gIChpbmNsdWRpbmcgaW1wbGljaXQgbDMyciB2aWEgbW92aSkgYmVjYXVzZSBpdCBpc24ndCBzYWZlLgotMjoJc3JsaQlhNywgYTcsIDQJLy8gbmV4dCBDQQotCXN1YglhMywgYTMsIGE1CS8vIG5leHQgc2VnbWVudCAoYWRkIDB4MjAwMDAwMDApCi0zOgotIyBpZiBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIJLyogaWYgaGF2ZSB0cmFuc2xhdGlvbiwgcHJlc2VydmUgaXQgKi8KLQlyZHRsYjEJYTgsIGEzCQkvLyBnZXQgY3VycmVudCBQUE4rQ0Egb2Ygc2VnbWVudAotCWRzeW5jCS8vIGludGVybG9jaz8/PwotCWV4dHVpCWE0LCBhNywgMCwgNAkvLyBleHRyYWN0IENBIHRvIHNldAotCXNybGkJYTgsIGE4LCA0CS8vIGNsZWFyIENBIGJ1dCBrZWVwIFBQTiAuLi4KLQlzbGxpCWE4LCBhOCwgNAkvLyAuLi4KLQlhZGQJYTQsIGE0LCBhOAkvLyBjb21iaW5lIG5ldyBDQSB3aXRoIFBQTiB0byBwcmVzZXJ2ZQotIyBlbHNlCi0JZXh0dWkJYTQsIGE3LCAwLCA0CS8vIGV4dHJhY3QgQ0EgdG8gc2V0Ci0jIGVuZGlmCi0Jd2R0bGIJYTQsIGEzCQkvLyB3cml0ZSB3aXJlZCBQVEUgKENBIFsrUFBOXSkgb2YgNTEyTUIgc2VnbWVudCB0byBEVExCCi0JYm5lCWEzLCBhNSwgMmIKLQlkc3luYwkJCS8vIG1ha2Ugc3VyZSBhbGwgZGF0YSBwYXRoIGNoYW5nZXMgdGFrZSBlZmZlY3QKLQkuZW5kbQkvLyBkY2FjaGVhdHRyX3NldAotCi0jZW5kaWYgLyogWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSICovCi0KLQotCi0vKgotICogIGNhY2hlYXR0cl9zZXQKLSAqCi0gKiAgTWFjcm8gdGhhdCBzZXRzIHRoZSBjdXJyZW50IENBQ0hFQVRUUiBzYWZlbHkKLSAqICAoYm90aCBpIGFuZCBkKSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgYTIuCi0gKiAgSXQgd29ya3MgZXZlbiB3aGVuIGNoYW5naW5nIHRoZSBjYWNoZSBhdHRyaWJ1dGVzIG9mCi0gKiAgdGhlIGN1cnJlbnRseSBydW5uaW5nIGNvZGUuCi0gKgotICogIEVudHJ5OgotICoJYTIJCWNhY2hlYXR0ciB2YWx1ZSB0byBzZXQKLSAqICBFeGl0OgotICoJYTIJCXVuY2hhbmdlZAotICoJYTMtYTgJCWNsb2JiZXJlZCAodGVtcG9yYXJpZXMpCi0gKi8KLQkubWFjcm8JY2FjaGVhdHRyX3NldAotCi0jaWYgWENIQUxfSEFWRV9DQUNIRUFUVFIKLSMgaWYgWENIQUxfSUNBQ0hFX0xJTkVTSVpFIDwgNAotCS8vICBObyBpLWNhY2hlLCBzbyBjYW4gYWx3YXlzIHNhZmVseSB3cml0ZSB0byBDQUNIRUFUVFI6Ci0Jd3NyCWEyLCBDQUNIRUFUVFIKLSMgZWxzZQotCS8vICBUaGUgQXRoZW5zIG1pY3JvLWFyY2hpdGVjdHVyZSwgd2hlbiB1c2luZyB0aGUgb2xkCi0JLy8gIGV4Y2VwdGlvbiBhcmNoaXRlY3R1cmUgb3B0aW9uIChpZS4gd2l0aCB0aGUgQ0FDSEVBVFRSIHJlZ2lzdGVyKQotCS8vICBhbGxvd3MgY2hhbmdpbmcgdGhlIGNhY2hlIGF0dHJpYnV0ZXMgb2YgdGhlIHJ1bm5pbmcgY29kZQotCS8vICB1c2luZyB0aGUgZm9sbG93aW5nIGV4YWN0IHNlcXVlbmNlIGFsaWduZWQgdG8gYmUgd2l0aGluCi0JLy8gIGFuIGluc3RydWN0aW9uIGNhY2hlIGxpbmUuICAoTk9URTogdXNpbmcgWENIQUxfSUNBQ0hFX0xJTkVTSVpFCi0JLy8gIGFsaWdubWVudCBhY3R1YWxseSBjYXVzZXMgcHJvYmxlbXMgYmVjYXVzZSB0aGF0IGNhbiBiZSBncmVhdGVyCi0JLy8gIHRoYW4gdGhlIGFsaWdubWVudCBvZiB0aGUgcmVzZXQgdmVjdG9yLCB3aGVyZSB0aGlzIG1hY3JvIGlzIG9mdGVuCi0JLy8gIGludm9rZWQsIHdoaWNoIHdvdWxkIGNhdXNlIHRoZSBsaW5rZXIgdG8gYWxpZ24gdGhlIHJlc2V0Ci0JLy8gIHZlY3RvciBjb2RlIGF3YXkgZnJvbSB0aGUgcmVzZXQgdmVjdG9yISEpLgotCWoJMWYKLQkuYWxpZ24JMTYgLypYQ0hBTF9JQ0FDSEVfTElORVNJWkUqLwkvLyBhbGlnbiB0byB3aXRoaW4gYW4gSS1jYWNoZSBsaW5lCi0xOglfd3NyCWEyLCBDQUNIRUFUVFIKLQlfaXN5bmMKLQlub3AKLQlub3AKLSMgZW5kaWYKLSNlbGlmIFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgotCS8vICBEVExCIGFuZCBJVExCIGFyZSBpbmRlcGVuZGVudCwgYnV0IHRvIGtlZXAgc2VtYW50aWNzCi0JLy8gIG9mIHRoaXMgbWFjcm8gd2Ugc2ltcGx5IHdyaXRlIHRvIGJvdGguCi0JaWNhY2hlYXR0cl9zZXQKLQlkY2FjaGVhdHRyX3NldAotI2Vsc2UKLQkvLyAgVGhpcyBtYWNybyBpc24ndCBhcHBsaWNhYmxlIHRvIGFyYml0cmFyeSBNTVUgY29uZmlndXJhdGlvbnMuCi0JLy8gIERvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLgotI2VuZGlmCi0JLmVuZG0KLQotCi0jZW5kaWYgLypYVEVOU0FfQ0FDSEVBVFRSQVNNX0gqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9jb3JlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NGZlNWUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3MCArMCwwIEBACi0vKgotICogeHRlbnNhL2NvbmZpZy9jb3JlLmggLS0gSEFMIGRlZmluaXRpb25zIHRoYXQgYXJlIGRlcGVuZGVudCBvbiBDT1JFIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiAgVGhpcyBoZWFkZXIgZmlsZSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgdGhlICJjb21waWxlLXRpbWUgSEFMIiBvciBDSEFMLgotICogIEl0IHdhcyBnZW5lcmF0ZWQgZm9yIGEgc3BlY2lmaWMgWHRlbnNhIHByb2Nlc3NvciBjb25maWd1cmF0aW9uLgotICoKLSAqICBTb3VyY2UgZm9yIGNvbmZpZ3VyYXRpb24taW5kZXBlbmRlbnQgYmluYXJpZXMgKHdoaWNoIGxpbmsgaW4gYQotICogIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWMgSEFMIGxpYnJhcnkpIG11c3QgTkVWRVIgaW5jbHVkZSB0aGlzIGZpbGUuCi0gKiAgSXQgaXMgcGVyZmVjdGx5IG5vcm1hbCwgaG93ZXZlciwgZm9yIHRoZSBIQUwgc291cmNlIGl0c2VsZiB0byBpbmNsdWRlIHRoaXMgZmlsZS4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzIFRlbnNpbGljYSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsCi0gKiBVU0EuCi0gKi8KLQotCi0jaWZuZGVmIFhURU5TQV9DT05GSUdfQ09SRV9ICi0jZGVmaW5lIFhURU5TQV9DT05GSUdfQ09SRV9ICi0KLSNpbmNsdWRlIDx4dGVuc2EvaGFsLmg+Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJR0VORVJBTAotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqICBTZXBhcmF0b3JzIGZvciBtYWNyb3MgdGhhdCBleHBhbmQgaW50byBhcnJheXMuCi0gKiAgVGhlc2UgY2FuIGJlIHByZWRlZmluZWQgYnkgZmlsZXMgdGhhdCAjaW5jbHVkZSB0aGlzIG9uZSwKLSAqICB3aGVuIGRpZmZlcmVudCBzZXBhcmF0b3JzIGFyZSByZXF1aXJlZC4KLSAqLwotLyogIEVsZW1lbnQgc2VwYXJhdG9yIGZvciBtYWNyb3MgdGhhdCBleHBhbmQgaW50byAxLWRpbWVuc2lvbmFsIGFycmF5czogICovCi0jaWZuZGVmIFhDSEFMX1NFUAotI2RlZmluZSBYQ0hBTF9TRVAJCQksCi0jZW5kaWYKLS8qICBBcnJheSBzZXBhcmF0b3IgZm9yIG1hY3JvcyB0aGF0IGV4cGFuZCBpbnRvIDItZGltZW5zaW9uYWwgYXJyYXlzOiAgKi8KLSNpZm5kZWYgWENIQUxfU0VQMgotI2RlZmluZSBYQ0hBTF9TRVAyCQkJfSx7Ci0jZW5kaWYKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlFTkRJQU5ORVNTCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFhDSEFMX0hBVkVfQkUJCQkxCi0jZGVmaW5lIFhDSEFMX0hBVkVfTEUJCQkwCi0jZGVmaW5lIFhDSEFMX01FTU9SWV9PUkRFUgkJWFRIQUxfQklHRU5ESUFOCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJUkVHSVNURVIgV0lORE9XUwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBYQ0hBTF9IQVZFX1dJTkRPV0VECQkxCS8qIDEgaWYgd2luZG93ZWQgcmVnaXN0ZXJzIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9OVU1fQVJFR1MJCQk2NAkvKiBudW1iZXIgb2YgcGh5c2ljYWwgYWRkcmVzcyByZWdzICovCi0jZGVmaW5lIFhDSEFMX05VTV9BUkVHU19MT0cyCQk2CS8qIGxvZzIoWENIQUxfTlVNX0FSRUdTKSAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCUFERFJFU1MgQUxJR05NRU5UCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiAgVGhlc2UgYXBwbHkgdG8gYSBzZWxlY3RlZCBzZXQgb2YgY29yZSBsb2FkIGFuZCBzdG9yZSBpbnN0cnVjdGlvbnMgb25seSAoc2VlIElTQSk6ICAqLwotI2RlZmluZSBYQ0hBTF9VTkFMSUdORURfTE9BRF9FWENFUFRJT04JMQkvKiAxIGlmIHVuYWxpZ25lZCBsb2FkcyBjYXVzZSBhbiBleGNlcHRpb24sIDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX1VOQUxJR05FRF9TVE9SRV9FWENFUFRJT04JMQkvKiAxIGlmIHVuYWxpZ25lZCBzdG9yZXMgY2F1c2UgYW4gZXhjZXB0aW9uLCAwIG90aGVyd2lzZSAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCUlOVEVSUlVQVFMKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgWENIQUxfSEFWRV9JTlRFUlJVUFRTCQkxCS8qIDEgaWYgaW50ZXJydXB0IG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9IQVZFX0hJR0hQUklfSU5URVJSVVBUUwkxCS8qIDEgaWYgaGlnaC1wcmlvcml0eSBpbnRlcnJ1cHQgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0hBVkVfSElHSExFVkVMX0lOVEVSUlVQVFMJWENIQUxfSEFWRV9ISUdIUFJJX0lOVEVSUlVQVFMKLSNkZWZpbmUgWENIQUxfSEFWRV9OTUkJCQkwCS8qIDEgaWYgTk1JIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9OVU1fSU5URVJSVVBUUwkJMTcJLyogbnVtYmVyIG9mIGludGVycnVwdHMgKi8KLSNkZWZpbmUgWENIQUxfTlVNX0lOVEVSUlVQVFNfTE9HMgk1CS8qIG51bWJlciBvZiBiaXRzIHRvIGhvbGQgYW4gaW50ZXJydXB0IG51bWJlcjogcm91bmR1cChsb2cyKG51bWJlciBvZiBpbnRlcnJ1cHRzKSkgKi8KLSNkZWZpbmUgWENIQUxfTlVNX0VYVElOVEVSUlVQVFMJCTEwCS8qIG51bWJlciBvZiBleHRlcm5hbCBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIFhDSEFMX05VTV9JTlRMRVZFTFMJCTQJLyogbnVtYmVyIG9mIGludGVycnVwdCBsZXZlbHMgKG5vdCBpbmNsdWRpbmcgbGV2ZWwgemVybyEpICovCi0jZGVmaW5lIFhDSEFMX05VTV9MT1dQUklfTEVWRUxTCQkxCQkJLyogbnVtYmVyIG9mIGxvdy1wcmlvcml0eSBpbnRlcnJ1cHQgbGV2ZWxzIChhbHdheXMgMSkgKi8KLSNkZWZpbmUgWENIQUxfRklSU1RfSElHSFBSSV9MRVZFTAkoWENIQUxfTlVNX0xPV1BSSV9MRVZFTFMrMSkJLyogbGV2ZWwgb2YgZmlyc3QgaGlnaC1wcmlvcml0eSBpbnRlcnJ1cHQgKGFsd2F5cyAyKSAqLwotI2RlZmluZSBYQ0hBTF9FWENNX0xFVkVMCQkxCQkJLyogbGV2ZWwgb2YgaW50ZXJydXB0cyBtYXNrZWQgYnkgUFMuRVhDTSAoWEVBMiBvbmx5OyBhbHdheXMgMSBpbiBUMTB4eCk7Ci0JCQkJCQkJCSAgIGZvciBYRUExLCB3aGVyZSB0aGVyZSBpcyBubyBQUy5FWENNLCB0aGlzIGlzIGFsd2F5cyAxOwotCQkJCQkJCQkgICBpbnRlcnJ1cHRzIGF0IGxldmVscyBGSVJTVF9ISUdIUFJJIDw9IG4gPD0gRVhDTV9MRVZFTCwgaWYgYW55LAotCQkJCQkJCQkgICBhcmUgdGVybWVkICJtZWRpdW0gcHJpb3JpdHkiIGludGVycnVwdHMgKHBvc3QgVDEweHggb25seSkgKi8KLS8qICBOb3RlOiAgMSA8PSBMT1dQUklfTEVWRUxTIDw9IEVYQ01fTEVWRUwgPCBERUJVR0xFVkVMIDw9IE5VTV9JTlRMRVZFTFMgPCBOTUlMRVZFTCA8PSAxNSAgKi8KLQotLyogIE1hc2tzIG9mIGludGVycnVwdHMgYXQgZWFjaCBpbnRlcnJ1cHQgbGV2ZWw6ICAqLwotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDBfTUFTSwkJMHgwMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDFfTUFTSwkJMHgwMDAwNjRGOQotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfTUFTSwkJMHgwMDAwODkwMgotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDNfTUFTSwkJMHgwMDAxMTIwNAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfTUFTSwkJMHgwMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDVfTUFTSwkJMHgwMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDZfTUFTSwkJMHgwMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDdfTUFTSwkJMHgwMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDhfTUFTSwkJMHgwMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDlfTUFTSwkJMHgwMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDEwX01BU0sJCTB4MDAwMDAwMDAKLSNkZWZpbmUgWENIQUxfSU5UTEVWRUwxMV9NQVNLCQkweDAwMDAwMDAwCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMTJfTUFTSwkJMHgwMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDEzX01BU0sJCTB4MDAwMDAwMDAKLSNkZWZpbmUgWENIQUxfSU5UTEVWRUwxNF9NQVNLCQkweDAwMDAwMDAwCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMTVfTUFTSwkJMHgwMDAwMDAwMAotLyogIEFzIGFuIGFycmF5IG9mIGVudHJpZXMgKGVnLiBmb3IgQyBjb25zdGFudCBhcnJheXMpOiAgKi8KLSNkZWZpbmUgWENIQUxfSU5UTEVWRUxfTUFTS1MJCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAwNjRGOQlYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDA4OTAyCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMTEyMDQJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAwMDAwMAlYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAwMDAwMAlYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAwMDAwMAlYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAwMDAwMAlYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMDAwMDAKLQotLyogIE1hc2tzIG9mIGludGVycnVwdHMgYXQgZWFjaCByYW5nZSAxLi5uIG9mIGludGVycnVwdCBsZXZlbHM6ICAqLwotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDBfQU5EQkVMT1dfTUFTSwkweDAwMDAwMDAwCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMV9BTkRCRUxPV19NQVNLCTB4MDAwMDY0RjkKLSNkZWZpbmUgWENIQUxfSU5UTEVWRUwyX0FOREJFTE9XX01BU0sJMHgwMDAwRURGQgotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDNfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMNF9BTkRCRUxPV19NQVNLCTB4MDAwMUZGRkYKLSNkZWZpbmUgWENIQUxfSU5UTEVWRUw1X0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDZfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMN19BTkRCRUxPV19NQVNLCTB4MDAwMUZGRkYKLSNkZWZpbmUgWENIQUxfSU5UTEVWRUw4X0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDlfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMTBfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMTFfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMTJfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMTNfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMTRfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMTVfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCi0jZGVmaW5lIFhDSEFMX0xPV1BSSV9NQVNLCQlYQ0hBTF9JTlRMRVZFTDFfQU5EQkVMT1dfTUFTSwkvKiBtYXNrIG9mIGFsbCBsb3ctcHJpb3JpdHkgaW50ZXJydXB0cyAqLwotI2RlZmluZSBYQ0hBTF9FWENNX01BU0sJCQlYQ0hBTF9JTlRMRVZFTDFfQU5EQkVMT1dfTUFTSwkvKiBtYXNrIG9mIGFsbCBpbnRlcnJ1cHRzIG1hc2tlZCBieSBQUy5FWENNIChvciBDRVhDTSkgKi8KLS8qICBBcyBhbiBhcnJheSBvZiBlbnRyaWVzIChlZy4gZm9yIEMgY29uc3RhbnQgYXJyYXlzKTogICovCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMX0FOREJFTE9XX01BU0tTCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAwNjRGOQlYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDBFREZCCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMUZGRkYJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAxRkZGRglYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDFGRkZGCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMUZGRkYJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAxRkZGRglYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDFGRkZGCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMUZGRkYJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAxRkZGRglYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDFGRkZGCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMUZGRkYJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAxRkZGRglYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDFGRkZGCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMUZGRkYKLQotLyogIEludGVycnVwdCBudW1iZXJzIGZvciBlYWNoIGludGVycnVwdCBsZXZlbCBhdCB3aGljaCBvbmx5IG9uZSBpbnRlcnJ1cHQgd2FzIGNvbmZpZ3VyZWQ6ICAqLwotLyojZGVmaW5lIFhDSEFMX0lOVExFVkVMMV9OVU0JCS4uLm1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IGF0IHRoaXMgbGV2ZWwuLi4qLwotLyojZGVmaW5lIFhDSEFMX0lOVExFVkVMMl9OVU0JCS4uLm1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IGF0IHRoaXMgbGV2ZWwuLi4qLwotLyojZGVmaW5lIFhDSEFMX0lOVExFVkVMM19OVU0JCS4uLm1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IGF0IHRoaXMgbGV2ZWwuLi4qLwotCi0vKiAgTGV2ZWwgb2YgZWFjaCBpbnRlcnJ1cHQ6ICAqLwotI2RlZmluZSBYQ0hBTF9JTlQwX0xFVkVMCQkxCi0jZGVmaW5lIFhDSEFMX0lOVDFfTEVWRUwJCTIKLSNkZWZpbmUgWENIQUxfSU5UMl9MRVZFTAkJMwotI2RlZmluZSBYQ0hBTF9JTlQzX0xFVkVMCQkxCi0jZGVmaW5lIFhDSEFMX0lOVDRfTEVWRUwJCTEKLSNkZWZpbmUgWENIQUxfSU5UNV9MRVZFTAkJMQotI2RlZmluZSBYQ0hBTF9JTlQ2X0xFVkVMCQkxCi0jZGVmaW5lIFhDSEFMX0lOVDdfTEVWRUwJCTEKLSNkZWZpbmUgWENIQUxfSU5UOF9MRVZFTAkJMgotI2RlZmluZSBYQ0hBTF9JTlQ5X0xFVkVMCQkzCi0jZGVmaW5lIFhDSEFMX0lOVDEwX0xFVkVMCQkxCi0jZGVmaW5lIFhDSEFMX0lOVDExX0xFVkVMCQkyCi0jZGVmaW5lIFhDSEFMX0lOVDEyX0xFVkVMCQkzCi0jZGVmaW5lIFhDSEFMX0lOVDEzX0xFVkVMCQkxCi0jZGVmaW5lIFhDSEFMX0lOVDE0X0xFVkVMCQkxCi0jZGVmaW5lIFhDSEFMX0lOVDE1X0xFVkVMCQkyCi0jZGVmaW5lIFhDSEFMX0lOVDE2X0xFVkVMCQkzCi0jZGVmaW5lIFhDSEFMX0lOVDE3X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDE4X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDE5X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDIwX0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDIxX0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDIyX0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDIzX0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDI0X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDI1X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDI2X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDI3X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDI4X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDI5X0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDMwX0xFVkVMCQkwCi0jZGVmaW5lIFhDSEFMX0lOVDMxX0xFVkVMCQkwCi0vKiAgQXMgYW4gYXJyYXkgb2YgZW50cmllcyAoZWcuIGZvciBDIGNvbnN0YW50IGFycmF5cyk6ICAqLwotI2RlZmluZSBYQ0hBTF9JTlRfTEVWRUxTCQkxCVhDSEFMX1NFUCBcCi0JCQkJCTIJWENIQUxfU0VQIFwKLQkJCQkJMwlYQ0hBTF9TRVAgXAotCQkJCQkxCVhDSEFMX1NFUCBcCi0JCQkJCTEJWENIQUxfU0VQIFwKLQkJCQkJMQlYQ0hBTF9TRVAgXAotCQkJCQkxCVhDSEFMX1NFUCBcCi0JCQkJCTEJWENIQUxfU0VQIFwKLQkJCQkJMglYQ0hBTF9TRVAgXAotCQkJCQkzCVhDSEFMX1NFUCBcCi0JCQkJCTEJWENIQUxfU0VQIFwKLQkJCQkJMglYQ0hBTF9TRVAgXAotCQkJCQkzCVhDSEFMX1NFUCBcCi0JCQkJCTEJWENIQUxfU0VQIFwKLQkJCQkJMQlYQ0hBTF9TRVAgXAotCQkJCQkyCVhDSEFMX1NFUCBcCi0JCQkJCTMJWENIQUxfU0VQIFwKLQkJCQkJMAlYQ0hBTF9TRVAgXAotCQkJCQkwCVhDSEFMX1NFUCBcCi0JCQkJCTAJWENIQUxfU0VQIFwKLQkJCQkJMAlYQ0hBTF9TRVAgXAotCQkJCQkwCVhDSEFMX1NFUCBcCi0JCQkJCTAJWENIQUxfU0VQIFwKLQkJCQkJMAlYQ0hBTF9TRVAgXAotCQkJCQkwCVhDSEFMX1NFUCBcCi0JCQkJCTAJWENIQUxfU0VQIFwKLQkJCQkJMAlYQ0hBTF9TRVAgXAotCQkJCQkwCVhDSEFMX1NFUCBcCi0JCQkJCTAJWENIQUxfU0VQIFwKLQkJCQkJMAlYQ0hBTF9TRVAgXAotCQkJCQkwCVhDSEFMX1NFUCBcCi0JCQkJCTAKLQotLyogIFR5cGUgb2YgZWFjaCBpbnRlcnJ1cHQ6ICAqLwotI2RlZmluZSBYQ0hBTF9JTlQwX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCi0jZGVmaW5lIFhDSEFMX0lOVDFfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKLSNkZWZpbmUgWENIQUxfSU5UMl9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAotI2RlZmluZSBYQ0hBTF9JTlQzX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCi0jZGVmaW5lIFhDSEFMX0lOVDRfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKLSNkZWZpbmUgWENIQUxfSU5UNV9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAotI2RlZmluZSBYQ0hBTF9JTlQ2X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCi0jZGVmaW5lIFhDSEFMX0lOVDdfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fRURHRQotI2RlZmluZSBYQ0hBTF9JTlQ4X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UKLSNkZWZpbmUgWENIQUxfSU5UOV9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCi0jZGVmaW5lIFhDSEFMX0lOVDEwX1RZUEUgCVhUSEFMX0lOVFRZUEVfVElNRVIKLSNkZWZpbmUgWENIQUxfSU5UMTFfVFlQRSAJWFRIQUxfSU5UVFlQRV9USU1FUgotI2RlZmluZSBYQ0hBTF9JTlQxMl9UWVBFIAlYVEhBTF9JTlRUWVBFX1RJTUVSCi0jZGVmaW5lIFhDSEFMX0lOVDEzX1RZUEUgCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUKLSNkZWZpbmUgWENIQUxfSU5UMTRfVFlQRSAJWFRIQUxfSU5UVFlQRV9TT0ZUV0FSRQotI2RlZmluZSBYQ0hBTF9JTlQxNV9UWVBFIAlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFCi0jZGVmaW5lIFhDSEFMX0lOVDE2X1RZUEUgCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUKLSNkZWZpbmUgWENIQUxfSU5UMTdfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMThfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMTlfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjBfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjFfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjJfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjNfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjRfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjVfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjZfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjdfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjhfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMjlfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMzBfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLSNkZWZpbmUgWENIQUxfSU5UMzFfVFlQRSAJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLS8qICBBcyBhbiBhcnJheSBvZiBlbnRyaWVzIChlZy4gZm9yIEMgY29uc3RhbnQgYXJyYXlzKTogICovCi0jZGVmaW5lIFhDSEFMX0lOVF9UWVBFUwkJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMICAgICAJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTCAgICAgCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMICAgICAJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTCAgICAgCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfVElNRVIgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfVElNRVIgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfVElNRVIgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQKLQotLyogIE1hc2tzIG9mIGludGVycnVwdHMgZm9yIGVhY2ggdHlwZSBvZiBpbnRlcnJ1cHQ6ICAqLwotI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfVU5DT05GSUdVUkVECTB4RkZGRTAwMDAKLSNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX1NPRlRXQVJFCTB4MDAwMUUwMDAKLSNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX0VYVEVSTl9FREdFCTB4MDAwMDAzODAKLSNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX0VYVEVSTl9MRVZFTAkweDAwMDAwMDdGCi0jZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19USU1FUgkweDAwMDAxQzAwCi0jZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19OTUkJCTB4MDAwMDAwMDAKLS8qICBBcyBhbiBhcnJheSBvZiBlbnRyaWVzIChlZy4gZm9yIEMgY29uc3RhbnQgYXJyYXlzKTogICovCi0jZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS1MJCTB4RkZGRTAwMDAJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAxRTAwMAlYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDAwMzgwCVhDSEFMX1NFUCBcCi0JCQkJCTB4MDAwMDAwN0YJWENIQUxfU0VQIFwKLQkJCQkJMHgwMDAwMUMwMAlYQ0hBTF9TRVAgXAotCQkJCQkweDAwMDAwMDAwCi0KLS8qICBJbnRlcnJ1cHRzIGFzc2lnbmVkIHRvIGVhY2ggdGltZXIgKENDT01QQVJFMCB0byBDQ09NUEFSRTMpLCAtMSBpZiB1bmFzc2lnbmVkICAqLwotI2RlZmluZSBYQ0hBTF9USU1FUjBfSU5URVJSVVBUCTEwCi0jZGVmaW5lIFhDSEFMX1RJTUVSMV9JTlRFUlJVUFQJMTEKLSNkZWZpbmUgWENIQUxfVElNRVIyX0lOVEVSUlVQVAkxMgotI2RlZmluZSBYQ0hBTF9USU1FUjNfSU5URVJSVVBUCVhUSEFMX1RJTUVSX1VOQ09ORklHVVJFRAotLyogIEFzIGFuIGFycmF5IG9mIGVudHJpZXMgKGVnLiBmb3IgQyBjb25zdGFudCBhcnJheXMpOiAgKi8KLSNkZWZpbmUgWENIQUxfVElNRVJfSU5URVJSVVBUUwkxMAlYQ0hBTF9TRVAgXAotCQkJCTExCVhDSEFMX1NFUCBcCi0JCQkJMTIJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9USU1FUl9VTkNPTkZJR1VSRUQKLQotLyogIEluZGV4aW5nIG1hY3JvczogICovCi0jZGVmaW5lIF9YQ0hBTF9JTlRMRVZFTF9NQVNLKG4pCQlYQ0hBTF9JTlRMRVZFTCAjIyBuICMjIF9NQVNLCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMX01BU0sobikJCV9YQ0hBTF9JTlRMRVZFTF9NQVNLKG4pCQkvKiBuID0gMCAuLiAxNSAqLwotI2RlZmluZSBfWENIQUxfSU5UTEVWRUxfQU5EQkVMT1dNQVNLKG4pCVhDSEFMX0lOVExFVkVMICMjIG4gIyMgX0FOREJFTE9XX01BU0sKLSNkZWZpbmUgWENIQUxfSU5UTEVWRUxfQU5EQkVMT1dfTUFTSyhuKQlfWENIQUxfSU5UTEVWRUxfQU5EQkVMT1dNQVNLKG4pCS8qIG4gPSAwIC4uIDE1ICovCi0jZGVmaW5lIF9YQ0hBTF9JTlRfTEVWRUwobikJCVhDSEFMX0lOVCAjIyBuICMjIF9MRVZFTAotI2RlZmluZSBYQ0hBTF9JTlRfTEVWRUwobikJCV9YQ0hBTF9JTlRfTEVWRUwobikJCS8qIG4gPSAwIC4uIDMxICovCi0jZGVmaW5lIF9YQ0hBTF9JTlRfVFlQRShuKQkJWENIQUxfSU5UICMjIG4gIyMgX1RZUEUKLSNkZWZpbmUgWENIQUxfSU5UX1RZUEUobikJCV9YQ0hBTF9JTlRfVFlQRShuKQkJLyogbiA9IDAgLi4gMzEgKi8KLSNkZWZpbmUgX1hDSEFMX1RJTUVSX0lOVEVSUlVQVChuKQlYQ0hBTF9USU1FUiAjIyBuICMjIF9JTlRFUlJVUFQKLSNkZWZpbmUgWENIQUxfVElNRVJfSU5URVJSVVBUKG4pCV9YQ0hBTF9USU1FUl9JTlRFUlJVUFQobikJLyogbiA9IDAgLi4gMyAqLwotCi0KLQotLyoKLSAqICBFeHRlcm5hbCBpbnRlcnJ1cHQgdmVjdG9ycy9sZXZlbHMuCi0gKiAgVGhlc2UgbWFjcm9zIGRlc2NyaWJlIGhvdyBYdGVuc2EgcHJvY2Vzc29yIGludGVycnVwdCBudW1iZXJzCi0gKiAgKGFzIG51bWJlcmVkIGludGVybmFsbHksIGVnLiBpbiBJTlRFUlJVUFQgYW5kIElOVEVOQUJMRSByZWdpc3RlcnMpCi0gKiAgbWFwIHRvIGV4dGVybmFsIEJJbnRlcnJ1cHQ8bj4gcGlucywgZm9yIHRob3NlIGludGVycnVwdHMKLSAqICBjb25maWd1cmVkIGFzIGV4dGVybmFsIChsZXZlbC10cmlnZ2VyZWQsIGVkZ2UtdHJpZ2dlcmVkLCBvciBOTUkpLgotICogIFNlZSB0aGUgWHRlbnNhIHByb2Nlc3NvciBkYXRhYm9vayBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLS8qICBDb3JlIGludGVycnVwdCBudW1iZXJzIG1hcHBlZCB0byBlYWNoIEVYVEVSTkFMIGludGVycnVwdCBudW1iZXI6ICAqLwotI2RlZmluZSBYQ0hBTF9FWFRJTlQwX05VTQkJMAkvKiAoaW50bGV2ZWwgMSkgKi8KLSNkZWZpbmUgWENIQUxfRVhUSU5UMV9OVU0JCTEJLyogKGludGxldmVsIDIpICovCi0jZGVmaW5lIFhDSEFMX0VYVElOVDJfTlVNCQkyCS8qIChpbnRsZXZlbCAzKSAqLwotI2RlZmluZSBYQ0hBTF9FWFRJTlQzX05VTQkJMwkvKiAoaW50bGV2ZWwgMSkgKi8KLSNkZWZpbmUgWENIQUxfRVhUSU5UNF9OVU0JCTQJLyogKGludGxldmVsIDEpICovCi0jZGVmaW5lIFhDSEFMX0VYVElOVDVfTlVNCQk1CS8qIChpbnRsZXZlbCAxKSAqLwotI2RlZmluZSBYQ0hBTF9FWFRJTlQ2X05VTQkJNgkvKiAoaW50bGV2ZWwgMSkgKi8KLSNkZWZpbmUgWENIQUxfRVhUSU5UN19OVU0JCTcJLyogKGludGxldmVsIDEpICovCi0jZGVmaW5lIFhDSEFMX0VYVElOVDhfTlVNCQk4CS8qIChpbnRsZXZlbCAyKSAqLwotI2RlZmluZSBYQ0hBTF9FWFRJTlQ5X05VTQkJOQkvKiAoaW50bGV2ZWwgMykgKi8KLQotLyogIENvcnJlc3BvbmRpbmcgaW50ZXJydXB0IG1hc2tzOiAgKi8KLSNkZWZpbmUgWENIQUxfRVhUSU5UMF9NQVNLCQkweDAwMDAwMDAxCi0jZGVmaW5lIFhDSEFMX0VYVElOVDFfTUFTSwkJMHgwMDAwMDAwMgotI2RlZmluZSBYQ0hBTF9FWFRJTlQyX01BU0sJCTB4MDAwMDAwMDQKLSNkZWZpbmUgWENIQUxfRVhUSU5UM19NQVNLCQkweDAwMDAwMDA4Ci0jZGVmaW5lIFhDSEFMX0VYVElOVDRfTUFTSwkJMHgwMDAwMDAxMAotI2RlZmluZSBYQ0hBTF9FWFRJTlQ1X01BU0sJCTB4MDAwMDAwMjAKLSNkZWZpbmUgWENIQUxfRVhUSU5UNl9NQVNLCQkweDAwMDAwMDQwCi0jZGVmaW5lIFhDSEFMX0VYVElOVDdfTUFTSwkJMHgwMDAwMDA4MAotI2RlZmluZSBYQ0hBTF9FWFRJTlQ4X01BU0sJCTB4MDAwMDAxMDAKLSNkZWZpbmUgWENIQUxfRVhUSU5UOV9NQVNLCQkweDAwMDAwMjAwCi0KLS8qICBDb3JlIGNvbmZpZyBpbnRlcnJ1cHQgbGV2ZWxzIG1hcHBlZCB0byBlYWNoIGV4dGVybmFsIGludGVycnVwdDogICovCi0jZGVmaW5lIFhDSEFMX0VYVElOVDBfTEVWRUwJCTEJLyogKGludCBudW1iZXIgMCkgKi8KLSNkZWZpbmUgWENIQUxfRVhUSU5UMV9MRVZFTAkJMgkvKiAoaW50IG51bWJlciAxKSAqLwotI2RlZmluZSBYQ0hBTF9FWFRJTlQyX0xFVkVMCQkzCS8qIChpbnQgbnVtYmVyIDIpICovCi0jZGVmaW5lIFhDSEFMX0VYVElOVDNfTEVWRUwJCTEJLyogKGludCBudW1iZXIgMykgKi8KLSNkZWZpbmUgWENIQUxfRVhUSU5UNF9MRVZFTAkJMQkvKiAoaW50IG51bWJlciA0KSAqLwotI2RlZmluZSBYQ0hBTF9FWFRJTlQ1X0xFVkVMCQkxCS8qIChpbnQgbnVtYmVyIDUpICovCi0jZGVmaW5lIFhDSEFMX0VYVElOVDZfTEVWRUwJCTEJLyogKGludCBudW1iZXIgNikgKi8KLSNkZWZpbmUgWENIQUxfRVhUSU5UN19MRVZFTAkJMQkvKiAoaW50IG51bWJlciA3KSAqLwotI2RlZmluZSBYQ0hBTF9FWFRJTlQ4X0xFVkVMCQkyCS8qIChpbnQgbnVtYmVyIDgpICovCi0jZGVmaW5lIFhDSEFMX0VYVElOVDlfTEVWRUwJCTMJLyogKGludCBudW1iZXIgOSkgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCUVYQ0VQVElPTlMgYW5kIFZFQ1RPUlMKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgWENIQUxfSEFWRV9FWENFUFRJT05TCQkxCS8qIDEgaWYgZXhjZXB0aW9uIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotCi0jZGVmaW5lIFhDSEFMX1hFQV9WRVJTSU9OCQkyCS8qIFh0ZW5zYSBFeGNlcHRpb24gQXJjaGl0ZWN0dXJlIG51bWJlcjogMSBmb3IgWEVBMSAob2xkKSwgMiBmb3IgWEVBMiAobmV3KSAqLwotI2RlZmluZSBYQ0hBTF9IQVZFX1hFQTEJCQkwCS8qIDEgaWYgWEVBMSwgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9YRUEyCQkJMQkvKiAxIGlmIFhFQTIsIDAgb3RoZXJ3aXNlICovCi0vKiAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgT05MWSAtLSBETyBOT1QgVVNFICh3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHJlbGVhc2UpOiAgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9PTERfRVhDX0FSQ0gJCVhDSEFMX0hBVkVfWEVBMQkvKiAoREVQUkVDQVRFRCkgMSBpZiBvbGQgZXhjZXB0aW9uIGFyY2hpdGVjdHVyZSAoWEVBMSksIDAgb3RoZXJ3aXNlIChlZy4gWEVBMikgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9FWENNCQkJWENIQUxfSEFWRV9YRUEyCS8qIChERVBSRUNBVEVEKSAxIGlmIFBTLkVYQ00gYml0IGV4aXN0cyAoY3VycmVudGx5IGVxdWFscyBYQ0hBTF9IQVZFX1RMQlMpICovCi0KLSNkZWZpbmUgWENIQUxfUkVTRVRfVkVDVE9SX1ZBRERSCTB4RkUwMDAwMjAKLSNkZWZpbmUgWENIQUxfUkVTRVRfVkVDVE9SX1BBRERSCTB4RkUwMDAwMjAKLSNkZWZpbmUgWENIQUxfVVNFUl9WRUNUT1JfVkFERFIJCTB4RDAwMDAyMjAKLSNkZWZpbmUgWENIQUxfUFJPR1JBTUVYQ19WRUNUT1JfVkFERFIJWENIQUxfVVNFUl9WRUNUT1JfVkFERFIJCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFhDSEFMX1VTRVJFWENfVkVDVE9SX1ZBRERSCVhDSEFMX1VTRVJfVkVDVE9SX1ZBRERSCQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBYQ0hBTF9VU0VSX1ZFQ1RPUl9QQUREUgkJMHgwMDAwMDIyMAotI2RlZmluZSBYQ0hBTF9QUk9HUkFNRVhDX1ZFQ1RPUl9QQUREUglYQ0hBTF9VU0VSX1ZFQ1RPUl9QQUREUgkJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgWENIQUxfVVNFUkVYQ19WRUNUT1JfUEFERFIJWENIQUxfVVNFUl9WRUNUT1JfUEFERFIJCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFhDSEFMX0tFUk5FTF9WRUNUT1JfVkFERFIJMHhEMDAwMDIwMAotI2RlZmluZSBYQ0hBTF9TVEFDS0VERVhDX1ZFQ1RPUl9WQUREUglYQ0hBTF9LRVJORUxfVkVDVE9SX1ZBRERSCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFhDSEFMX0tFUk5FTEVYQ19WRUNUT1JfVkFERFIJWENIQUxfS0VSTkVMX1ZFQ1RPUl9WQUREUgkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBYQ0hBTF9LRVJORUxfVkVDVE9SX1BBRERSCTB4MDAwMDAyMDAKLSNkZWZpbmUgWENIQUxfU1RBQ0tFREVYQ19WRUNUT1JfUEFERFIJWENIQUxfS0VSTkVMX1ZFQ1RPUl9QQUREUgkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBYQ0hBTF9LRVJORUxFWENfVkVDVE9SX1BBRERSCVhDSEFMX0tFUk5FTF9WRUNUT1JfUEFERFIJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgWENIQUxfRE9VQkxFRVhDX1ZFQ1RPUl9WQUREUgkweEQwMDAwMjkwCi0jZGVmaW5lIFhDSEFMX0RPVUJMRUVYQ19WRUNUT1JfUEFERFIJMHgwMDAwMDI5MAotI2RlZmluZSBYQ0hBTF9XSU5ET1dfVkVDVE9SU19WQUREUgkweEQwMDAwMDAwCi0jZGVmaW5lIFhDSEFMX1dJTkRPV19WRUNUT1JTX1BBRERSCTB4MDAwMDAwMDAKLSNkZWZpbmUgWENIQUxfSU5UTEVWRUwyX1ZFQ1RPUl9WQUREUgkweEQwMDAwMjQwCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMMl9WRUNUT1JfUEFERFIJMHgwMDAwMDI0MAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDNfVkVDVE9SX1ZBRERSCTB4RDAwMDAyNTAKLSNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX1ZFQ1RPUl9QQUREUgkweDAwMDAwMjUwCi0jZGVmaW5lIFhDSEFMX0lOVExFVkVMNF9WRUNUT1JfVkFERFIJMHhGRTAwMDUyMAotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1BBRERSCTB4RkUwMDA1MjAKLSNkZWZpbmUgWENIQUxfREVCVUdfVkVDVE9SX1ZBRERSCVhDSEFMX0lOVExFVkVMNF9WRUNUT1JfVkFERFIKLSNkZWZpbmUgWENIQUxfREVCVUdfVkVDVE9SX1BBRERSCVhDSEFMX0lOVExFVkVMNF9WRUNUT1JfUEFERFIKLQotLyogIEluZGV4aW5nIG1hY3JvczogICovCi0jZGVmaW5lIF9YQ0hBTF9JTlRMRVZFTF9WRUNUT1JfVkFERFIobikJCVhDSEFMX0lOVExFVkVMICMjIG4gIyMgX1ZFQ1RPUl9WQUREUgotI2RlZmluZSBYQ0hBTF9JTlRMRVZFTF9WRUNUT1JfVkFERFIobikJCV9YQ0hBTF9JTlRMRVZFTF9WRUNUT1JfVkFERFIobikJCS8qIG4gPSAwIC4uIDE1ICovCi0KLS8qCi0gKiAgR2VuZXJhbCBFeGNlcHRpb24gQ2F1c2VzCi0gKiAgKHZhbHVlcyBvZiBFWENDQVVTRSBzcGVjaWFsIHJlZ2lzdGVyIHNldCBieSBnZW5lcmFsIGV4Y2VwdGlvbnMsCi0gKiAgIHdoaWNoIHZlY3RvciB0byB0aGUgdXNlciwga2VybmVsLCBvciBkb3VibGUtZXhjZXB0aW9uIHZlY3RvcnMpOgotICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0lMTEVHQUxfSU5TVFJVQ1RJT04JCTAJLyogSWxsZWdhbCBJbnN0cnVjdGlvbiAoSWxsZWdhbEluc3RydWN0aW9uKSAqLwotI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9TWVNURU1fQ0FMTAkJCTEJLyogU3lzdGVtIENhbGwgKFN5c3RlbUNhbGwpICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0lOU1RSVUNUSU9OX0ZFVENIX0VSUk9SCQkyCS8qIEluc3RydWN0aW9uIEZldGNoIEVycm9yIChJbnN0cnVjdGlvbkZldGNoRXJyb3IpICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0xPQURfU1RPUkVfRVJST1IJCQkzCS8qIExvYWQgU3RvcmUgRXJyb3IgKExvYWRTdG9yZUVycm9yKSAqLwotI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9MRVZFTDFfSU5URVJSVVBUCQkJNAkvKiBMZXZlbCAxIEludGVycnVwdCAoTGV2ZWwxSW50ZXJydXB0KSAqLwotI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9BTExPQ0EJCQkJNQkvKiBTdGFjayBFeHRlbnNpb24gQXNzaXN0IChBbGxvY2EpICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0lOVEVHRVJfRElWSURFX0JZX1pFUk8JCTYJLyogSW50ZWdlciBEaXZpZGUgYnkgWmVybyAoSW50ZWdlckRpdmlkZUJ5WmVybykgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfU1BFQ1VMQVRJT04JCQk3CS8qIFNwZWN1bGF0aW9uIChTcGVjdWxhdGlvbikgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfUFJJVklMRUdFRAkJCTgJLyogUHJpdmlsZWdlZCBJbnN0cnVjdGlvbiAoUHJpdmlsZWdlZCkgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfVU5BTElHTkVECQkJOQkvKiBVbmFsaWduZWQgTG9hZCBTdG9yZSAoVW5hbGlnbmVkKSAqLwotI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9JVExCX01JU1MJCQkxNgkvKiBJVGxiIE1pc3MgRXhjZXB0aW9uIChJVGxiTWlzcykgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfSVRMQl9NVUxUSUhJVAkJCTE3CS8qIElUbGIgTXV0bHRpaGl0IEV4Y2VwdGlvbiAoSVRsYk11bHRpaGl0KSAqLwotI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9JVExCX1BSSVZJTEVHRQkJCTE4CS8qIElUbGIgUHJpdmlsZWdlIEV4Y2VwdGlvbiAoSVRsYlByaXZpbGVnZSkgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfSVRMQl9TSVpFX1JFU1RSSUNUSU9OCQkxOQkvKiBJVGxiIFNpemUgUmVzdHJpY3Rpb24gRXhjZXB0aW9uIChJVGxiU2l6ZVJlc3RyaWN0aW9uKSAqLwotI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9GRVRDSF9DQUNIRV9BVFRSSUJVVEUJCTIwCS8qIEZldGNoIENhY2hlIEF0dHJpYnV0ZSBFeGNlcHRpb24gKEZldGNoQ2FjaGVBdHRyaWJ1dGUpICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0RUTEJfTUlTUwkJCTI0CS8qIERUbGIgTWlzcyBFeGNlcHRpb24gKERUbGJNaXNzKSAqLwotI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9EVExCX01VTFRJSElUCQkJMjUJLyogRFRsYiBNdWx0aWhpdCBFeGNlcHRpb24gKERUbGJNdWx0aWhpdCkgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfRFRMQl9QUklWSUxFR0UJCQkyNgkvKiBEVGxiIFByaXZpbGVnZSBFeGNlcHRpb24gKERUbGJQcml2aWxlZ2UpICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0RUTEJfU0laRV9SRVNUUklDVElPTgkJMjcJLyogRFRsYiBTaXplIFJlc3RyaWN0aW9uIEV4Y2VwdGlvbiAoRFRsYlNpemVSZXN0cmljdGlvbikgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfTE9BRF9DQUNIRV9BVFRSSUJVVEUJCTI4CS8qIExvYWQgQ2FjaGUgQXR0cmlidXRlIEV4Y2VwdGlvbiAoTG9hZENhY2hlQXR0cmlidXRlKSAqLwotI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9TVE9SRV9DQUNIRV9BVFRSSUJVVEUJCTI5CS8qIFN0b3JlIENhY2hlIEF0dHJpYnV0ZSBFeGNlcHRpb24gKFN0b3JlQ2FjaGVBdHRyaWJ1dGUpICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0ZMT0FUSU5HX1BPSU5UCQkJNDAJLyogRmxvYXRpbmcgUG9pbnQgRXhjZXB0aW9uIChGbG9hdGluZ1BvaW50KSAqLwotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJVElNRVJTCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFhDSEFMX0hBVkVfQ0NPVU5UCQkxCS8qIDEgaWYgaGF2ZSBDQ09VTlQsIDAgb3RoZXJ3aXNlICovCi0vKiNkZWZpbmUgWENIQUxfSEFWRV9USU1FUlMJCVhDSEFMX0hBVkVfQ0NPVU5UKi8KLSNkZWZpbmUgWENIQUxfTlVNX1RJTUVSUwkJMwkvKiBudW1iZXIgb2YgQ0NPTVBBUkVuIHJlZ3MgKi8KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCURFQlVHCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFhDSEFMX0hBVkVfREVCVUcJCTEJLyogMSBpZiBkZWJ1ZyBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9PQ0QJCQkxCS8qIDEgaWYgT25DaGlwRGVidWcgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX05VTV9JQlJFQUsJCTIJLyogbnVtYmVyIG9mIElCUkVBS24gcmVncyAqLwotI2RlZmluZSBYQ0hBTF9OVU1fREJSRUFLCQkyCS8qIG51bWJlciBvZiBEQlJFQUtuIHJlZ3MgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdMRVZFTAkJNAkvKiBkZWJ1ZyBpbnRlcnJ1cHQgbGV2ZWwgKi8KLS8qRGVidWdFeHRlcm5hbEludGVycnVwdAkJMAkJMHwxKi8KLS8qRGVidWdVc2VESVJBcnJheQkJCTAJCTB8MSovCi0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJQ09QUk9DRVNTT1JTIGFuZCBFWFRSQSBTVEFURQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBYQ0hBTF9IQVZFX0NQCQkJMAkvKiAxIGlmIGNvcHJvY2Vzc29yIG9wdGlvbiBjb25maWd1cmVkIChDUEVOQUJMRSBwcmVzZW50KSAqLwotI2RlZmluZSBYQ0hBTF9DUF9NQVhDRkcJCQkwCS8qIG1heCBhbGxvd2VkIGNwIGlkIHBsdXMgb25lIChwZXIgY2ZnKSAqLwotCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy90aWUuaD4KLQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQlJTlRFUk5BTCBJL0QgUkFNL1JPTXMgYW5kIFhMTUkKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgWENIQUxfTlVNX0lOU1RST00JCTAJLyogbnVtYmVyIG9mIGNvcmUgaW5zdHJ1Y3Rpb24gUk9NcyBjb25maWd1cmVkICovCi0jZGVmaW5lIFhDSEFMX05VTV9JTlNUUkFNCQkwCS8qIG51bWJlciBvZiBjb3JlIGluc3RydWN0aW9uIFJBTXMgY29uZmlndXJlZCAqLwotI2RlZmluZSBYQ0hBTF9OVU1fREFUQVJPTQkJMAkvKiBudW1iZXIgb2YgY29yZSBkYXRhIFJPTXMgY29uZmlndXJlZCAqLwotI2RlZmluZSBYQ0hBTF9OVU1fREFUQVJBTQkJMAkvKiBudW1iZXIgb2YgY29yZSBkYXRhIFJBTXMgY29uZmlndXJlZCAqLwotI2RlZmluZSBYQ0hBTF9OVU1fWExNSQkJCTAJLyogbnVtYmVyIG9mIGNvcmUgWExNSSBwb3J0cyBjb25maWd1cmVkICovCi0jZGVmaW5lICBYQ0hBTF9OVU1fSVJPTQkJCVhDSEFMX05VTV9JTlNUUk9NCS8qIChERVBSRUNBVEVEKSAqLwotI2RlZmluZSAgWENIQUxfTlVNX0lSQU0JCQlYQ0hBTF9OVU1fSU5TVFJBTQkvKiAoREVQUkVDQVRFRCkgKi8KLSNkZWZpbmUgIFhDSEFMX05VTV9EUk9NCQkJWENIQUxfTlVNX0RBVEFST00JLyogKERFUFJFQ0FURUQpICovCi0jZGVmaW5lICBYQ0hBTF9OVU1fRFJBTQkJCVhDSEFMX05VTV9EQVRBUkFNCS8qIChERVBSRUNBVEVEKSAqLwotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJQ0FDSEUKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qICBTaXplIG9mIHRoZSBjYWNoZSBsaW5lcyBpbiBsb2cyKGJ5dGVzKTogICovCi0jZGVmaW5lIFhDSEFMX0lDQUNIRV9MSU5FV0lEVEgJCTQKLSNkZWZpbmUgWENIQUxfRENBQ0hFX0xJTkVXSURUSAkJNAotLyogIFNpemUgb2YgdGhlIGNhY2hlIGxpbmVzIGluIGJ5dGVzOiAgKi8KLSNkZWZpbmUgWENIQUxfSUNBQ0hFX0xJTkVTSVpFCQkxNgotI2RlZmluZSBYQ0hBTF9EQ0FDSEVfTElORVNJWkUJCTE2Ci0vKiAgTWF4IGZvciBib3RoIEktY2FjaGUgYW5kIEQtY2FjaGUgKHVzZWQgZm9yIGdlbmVyYWwgYWxpZ25tZW50KTogICovCi0jZGVmaW5lIFhDSEFMX0NBQ0hFX0xJTkVXSURUSF9NQVgJNAotI2RlZmluZSBYQ0hBTF9DQUNIRV9MSU5FU0laRV9NQVgJMTYKLQotLyogIE51bWJlciBvZiBjYWNoZSBzZXRzIGluIGxvZzIobGluZXMgcGVyIHdheSk6ICAqLwotI2RlZmluZSBYQ0hBTF9JQ0FDSEVfU0VUV0lEVEgJCTgKLSNkZWZpbmUgWENIQUxfRENBQ0hFX1NFVFdJRFRICQk4Ci0vKiAgTWF4IGZvciBib3RoIEktY2FjaGUgYW5kIEQtY2FjaGUgKHVzZWQgZm9yIGdlbmVyYWwgY2FjaGUtY29oZXJlbmN5IHBhZ2UgYWxpZ25tZW50KTogICovCi0jZGVmaW5lIFhDSEFMX0NBQ0hFX1NFVFdJRFRIX01BWAk4Ci0jZGVmaW5lIFhDSEFMX0NBQ0hFX1NFVFNJWkVfTUFYCQkyNTYKLQotLyogIENhY2hlIHNldCBhc3NvY2lhdGl2aXR5IChudW1iZXIgb2Ygd2F5cyk6ICAqLwotI2RlZmluZSBYQ0hBTF9JQ0FDSEVfV0FZUwkJMgotI2RlZmluZSBYQ0hBTF9EQ0FDSEVfV0FZUwkJMgotCi0vKiAgU2l6ZSBvZiB0aGUgY2FjaGVzIGluIGJ5dGVzICh3YXlzICogMl4obGluZXdpZHRoICsgc2V0d2lkdGgpKTogICovCi0jZGVmaW5lIFhDSEFMX0lDQUNIRV9TSVpFCQk4MTkyCi0jZGVmaW5lIFhDSEFMX0RDQUNIRV9TSVpFCQk4MTkyCi0KLS8qICBDYWNoZSBmZWF0dXJlczogICovCi0jZGVmaW5lIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sJMAotLyogIFdoZXRoZXIgY2FjaGUgbG9ja2luZyBmZWF0dXJlIGlzIGF2YWlsYWJsZTogICovCi0jZGVmaW5lIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCTAKLSNkZWZpbmUgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUJMAotCi0vKiAgTnVtYmVyIG9mIChlbmNvZGVkKSBjYWNoZSBhdHRyaWJ1dGUgYml0czogICovCi0jZGVmaW5lIFhDSEFMX0NBX0JJVFMJCQk0CS8qIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byBob2xkIGNhY2hlIGF0dHJpYnV0ZSBlbmNvZGluZyAqLwotLyogIChUaGUgbnVtYmVyIG9mIGFjY2VzcyBtb2RlIGJpdHMgKGRlY29kZWQgY2FjaGUgYXR0cmlidXRlIGJpdHMpIGlzIGRlZmluZWQgYnkgdGhlIGFyY2hpdGVjdHVyZTsgc2VlIHh0ZW5zYS9oYWwuaD8pICAqLwotCi0KLS8qICBDYWNoZSBBdHRyaWJ1dGUgZW5jb2RpbmdzIC0tIGxpc3RzIG9mIGFjY2VzcyBtb2RlcyBmb3IgZWFjaCBjYWNoZSBhdHRyaWJ1dGU6ICAqLwotI2RlZmluZSBYQ0hBTF9GQ0FfTElTVAkJWFRIQUxfRkFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0ZBTV9CWVBBU1MJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9GQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfRkFNX0JZUEFTUwlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0ZBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9GQU1fQ0FDSEVECVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfRkFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0ZBTV9DQUNIRUQJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9GQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfRkFNX0NBQ0hFRAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0ZBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9GQU1fQ0FDSEVECVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfRkFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0ZBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9GQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfRkFNX0VYQ0VQVElPTgotI2RlZmluZSBYQ0hBTF9MQ0FfTElTVAkJWFRIQUxfTEFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0xBTV9CWVBBU1NHCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfTEFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0xBTV9CWVBBU1NHCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfTEFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0xBTV9DQUNIRUQJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9MQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfTEFNX0NBQ0hFRAlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0xBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9MQU1fTkFDQUNIRUQJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9MQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfTEFNX05BQ0FDSEVECVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfTEFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0xBTV9JU09MQVRFCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfTEFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX0xBTV9DQUNIRUQKLSNkZWZpbmUgWENIQUxfU0NBX0xJU1QJCVhUSEFMX1NBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9TQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfU0FNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX1NBTV9CWVBBU1MJWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9TQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfU0FNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX1NBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9TQU1fV1JJVEVUSFJVCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfU0FNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX1NBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9TQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCi0JCQkJWFRIQUxfU0FNX1dSSVRFVEhSVQlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX1NBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9TQU1fSVNPTEFURQlYQ0hBTF9TRVAgXAotCQkJCVhUSEFMX1NBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKLQkJCQlYVEhBTF9TQU1fV1JJVEVUSFJVCi0KLS8qICBUZXN0OgotCXJlYWQvb25seTogMCArIDEgKyAyICsgNCArIDUgKyA2ICsgOCArIDkgKyAxMCArIDEyICsgMTQKLQlyZWFkL29ubHk6IDAgKyAxICsgMiArIDQgKyA1ICsgNiArIDggKyA5ICsgMTAgKyAxMiArIDE0Ci0JYWxsOiAgICAgICAwICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNyArIDggKyA5ICsgMTAgKyAxMSArIDEyICsgMTMgKyAxNCArIDE1Ci0JZmF1bHQ6ICAgICAwICsgMiArIDQgKyA2ICsgOCArIDEwICsgMTIgKyAxNAotCXIvdy94IGNhY2hlZDoKLQlyL3cveCBkY2FjaGVkOgotCUktYnlwYXNzOiAgMSArIDMKLQotCWxvYWQgZ3VhcmQgYml0IHNldDogMSArIDMKLQlsb2FkIGd1YXJkIGJpdCBjbHI6IDAgKyAyICsgNCArIDUgKyA2ICsgNyArIDggKyA5ICsgMTAgKyAxMSArIDEyICsgMTMgKyAxNCArIDE1Ci0JaGl0LWNhY2hlIHIvdy94OiA3ICsgMTEKLQotCWZhbXM6IDUKLQlmYW1zOiAwIC8gNiAvIDE4IC8gMSAvIDIKLQlmYW1zOiBCeXBhc3MgLyBJc29sYXRlIC8gQ2FjaGVkIC8gRXhjZXB0aW9uIC8gTkFDYWNoZWQKLQotICAgICAgICBNTVUgb2theTogIHllcwotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlNTVUKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiAgR2VuZXJhbCBub3RlcyBvbiBNTVUgcGFyYW1ldGVycy4KLSAqCi0gKiAgVGVybWlub2xvZ3k6Ci0gKglBU0lEID0gYWRkcmVzcy1zcGFjZSBJRCAoYWN0cyBhcyBhbiAiZXh0ZW5zaW9uIiBvZiB2aXJ0dWFsIGFkZHJlc3NlcykKLSAqCVZQTiAgPSB2aXJ0dWFsIHBhZ2UgbnVtYmVyCi0gKglQUE4gID0gcGh5c2ljYWwgcGFnZSBudW1iZXIKLSAqCUNBICAgPSBlbmNvZGVkIGNhY2hlIGF0dHJpYnV0ZSAoYWNjZXNzIG1vZGVzKQotICoJVExCICA9IHRyYW5zbGF0aW9uIGxvb2stYXNpZGUgYnVmZmVyICh0ZXJtIGlzIHN0cmV0Y2hlZCBzb21ld2hhdCBoZXJlKQotICoJSSAgICA9IGluc3RydWN0aW9uIChmZXRjaCBhY2Nlc3NlcykKLSAqCUQgICAgPSBkYXRhIChsb2FkIGFuZCBzdG9yZSBhY2Nlc3NlcykKLSAqCXdheSAgPSBlYWNoIFRMQiAoSVRMQiBhbmQgRFRMQikgY29uc2lzdHMgb2YgYSBudW1iZXIgb2YgIndheXMiCi0gKgkJdGhhdCBzaW11bHRhbmVvdXNseSBtYXRjaCB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIGFuIGFjY2VzczsKLSAqCQlhIFRMQiBzdWNjZXNzZnVsbHkgdHJhbnNsYXRlcyBhIHZpcnR1YWwgYWRkcmVzcyBpZiBleGFjdGx5Ci0gKgkJb25lIHdheSBtYXRjaGVzIHRoZSB2YWRkcjsgaWYgbm9uZSBtYXRjaCwgaXQgaXMgYSBtaXNzOwotICoJCWlmIG11bHRpcGxlIG1hdGNoLCBvbmUgZ2V0cyBhICJtdWx0aWhpdCIgZXhjZXB0aW9uOwotICoJCWVhY2ggd2F5IGNhbiBiZSBpbmRlcGVuZGVudGx5IGNvbmZpZ3VyZWQgaW4gdGVybXMgb2YgbnVtYmVyIG9mCi0gKgkJZW50cmllcywgcGFnZSBzaXplcywgd2hpY2ggZmllbGRzIGFyZSB3cml0YWJsZSBvciBjb25zdGFudCwgZXRjLgotICoJc2V0ICA9IGdyb3VwIG9mIGNvbnRpZ3VvdXMgd2F5cyB3aXRoIGV4YWN0bHkgaWRlbnRpY2FsIHBhcmFtZXRlcnMKLSAqCUFSRiAgPSBhdXRvLXJlZmlsbDsgaGFyZHdhcmUgc2VydmljZXMgYSAxc3QtbGV2ZWwgbWlzcyBieSBsb2FkaW5nIGEgUFRFCi0gKgkJZnJvbSB0aGUgcGFnZSB0YWJsZSBhbmQgc3RvcmluZyBpdCBpbiBvbmUgb2YgdGhlIGF1dG8tcmVmaWxsIHdheXM7Ci0gKgkJaWYgdGhpcyBQVEUgbG9hZCBhbHNvIG1pc3NlcywgYSBtaXNzIGV4Y2VwdGlvbiBpcyBwb3N0ZWQgZm9yIHMvdy4KLSAqCW1pbi13aXJlZCA9IGEgIm1pbi13aXJlZCIgd2F5IGNhbiBiZSB1c2VkIHRvIG1hcCBhIHNpbmdsZSAobWluaW11bS1zaXplZCkKLSAqIAkJcGFnZSBhcmJpdHJhcmlseSB1bmRlciBwcm9ncmFtIGNvbnRyb2w7IGl0IGhhcyBhIHNpbmdsZSBlbnRyeSwKLSAqCQlpcyBub24tYXV0by1yZWZpbGwgKHNvbWUgb3RoZXIgd2F5KHMpIG11c3QgYmUgYXV0by1yZWZpbGwpLAotICoJCWFsbCBpdHMgZmllbGRzIChWUE4sIFBQTiwgQVNJRCwgQ0EpIGFyZSBhbGwgd3JpdGFibGUsIGFuZCBpdAotICoJCXN1cHBvcnRzIHRoZSBYQ0hBTF9NTVVfTUlOX1BURV9QQUdFX1NJWkUgcGFnZSBzaXplIChhIGN1cnJlbnQKLSAqCQlyZXN0cmljdGlvbiBpcyB0aGF0IHRoaXMgYmUgdGhlIG9ubHkgcGFnZSBzaXplIGl0IHN1cHBvcnRzKS4KLSAqCi0gKiAgVExCIHdheSBlbnRyaWVzIGFyZSB2aXJ0dWFsbHkgaW5kZXhlZC4KLSAqICBUTEIgd2F5cyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgcGFnZSBzaXplczoKLSAqCS0gbXVzdCBoYXZlIGFsbCB3cml0YWJsZSBWUE4gYW5kIFBQTiBmaWVsZHM7Ci0gKgktIGNhbiBvbmx5IHVzZSBvbmUgcGFnZSBzaXplIGF0IGFueSBnaXZlbiB0aW1lIChlZy4gc2V0dXAgYXQgc3RhcnR1cCksCi0gKgkgIHNlbGVjdGVkIGJ5IHRoZSByZXNwZWN0aXZlIElUTEJDRkcgb3IgRFRMQkNGRyBzcGVjaWFsIHJlZ2lzdGVyLAotICoJICB3aG9zZSBiaXRzIG4qNCszIC4uIG4qNCBpbmRleCB0aGUgbGlzdCBvZiBwYWdlIHNpemVzIGZvciB3YXkgbgotICoJICAoWENIQUxfeFRMQl9TRVRtX1BBR0VTWl9MT0cyX0xJU1QgZm9yIHNldCBtIGNvcnJlc3BvbmRpbmcgdG8gd2F5IG4pOwotICoJICB0aGlzIGxpc3QgbWF5IGJlIHNwYXJzZSBmb3IgYXV0by1yZWZpbGwgd2F5cyBiZWNhdXNlIGF1dG8tcmVmaWxsCi0gKgkgIHdheXMgaGF2ZSBpbmRlcGVuZGVudCBsaXN0cyBvZiBzdXBwb3J0ZWQgcGFnZSBzaXplcyBzaGFyaW5nIGEKLSAqCSAgY29tbW9uIGVuY29kaW5nIHdpdGggUFRFIGVudHJpZXM7IHRoZSBlbmNvZGluZyBpcyB0aGUgaW5kZXggaW50bwotICoJICB0aGlzIGxpc3Q7IHVuc3VwcG9ydGVkIHNpemVzIGZvciBhIGdpdmVuIHdheSBhcmUgemVybyBpbiB0aGUgbGlzdDsKLSAqCSAgc2VsZWN0aW5nIHVuc3VwcG9ydGVkIHNpemVzIHJlc3VsdHMgaW4gdW5kZWZpbmVkIGhhcmR3YXJlIGJlaGF2aW91cjsKLSAqCS0gaXMgb25seSBwb3NzaWJsZSBmb3Igd2F5cyAwIHRocnUgNyAoZHVlIHRvIElUTEJDRkcvRFRMQkNGRyBkZWZpbml0aW9uKS4KLSAqLwotCi0jZGVmaW5lIFhDSEFMX0hBVkVfQ0FDSEVBVFRSCQkwCS8qIDEgaWYgQ0FDSEVBVFRSIHJlZ2lzdGVyIHByZXNlbnQsIDAgaWYgVExCcyBwcmVzZW50IGluc3RlYWQgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9UTEJTCQkJMQkvKiAxIGlmIFRMQnMgcHJlc2VudCwgMCBpZiBDQUNIRUFUVFIgcHJlc2VudCBpbnN0ZWFkICovCi0jZGVmaW5lIFhDSEFMX0hBVkVfTU1VCQkJWENIQUxfSEFWRV9UTEJTCS8qIChERVBSRUNBVEVEOyB1c2UgWENIQUxfSEFWRV9UTEJTIGluc3RlYWQ7IHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgcmVsZWFzZSkgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9TUEFOTklOR19XQVkJCTAJLyogMSBpZiBzaW5nbGUgd2F5IG1hcHMgZW50aXJlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBpbiBJK0QgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9JREVOVElUWV9NQVAJCTAJLyogMSBpZiB2aXJ0dWFsIGFkZHIgPT0gcGh5c2ljYWwgYWRkciBhbHdheXMsIDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSCTAJLyogMSBpZiBoYXZlIE1NVSB0aGF0IG1pbWljcyBhIENBQ0hFQVRUUiBjb25maWcgKENhTU1VKSAqLwotI2RlZmluZSBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIJMAkvKiAxIGlmIGhhdmUgTU1VIHRoYXQgbWltaWNzIGEgQ0FDSEVBVFRSIGNvbmZpZywgYnV0IHdpdGggdHJhbnNsYXRpb24gKENhWGx0TU1VKSAqLwotCi0jZGVmaW5lIFhDSEFMX01NVV9BU0lEX0JJVFMJCTgJLyogbnVtYmVyIG9mIGJpdHMgaW4gQVNJRHMgKGFkZHJlc3Mgc3BhY2UgSURzKSAqLwotI2RlZmluZSBYQ0hBTF9NTVVfQVNJRF9JTlZBTElECQkwCS8qIEFTSUQgdmFsdWUgaW5kaWNhdGluZyBpbnZhbGlkIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUgWENIQUxfTU1VX0FTSURfS0VSTkVMCQkxCS8qIEFTSUQgdmFsdWUgaW5kaWNhdGluZyBrZXJuZWwgKHJpbmcgMCkgYWRkcmVzcyBzcGFjZSAqLwotI2RlZmluZSBYQ0hBTF9NTVVfUklOR1MJCQk0CS8qIG51bWJlciBvZiByaW5ncyBzdXBwb3J0ZWQgKDEuLjQpICovCi0jZGVmaW5lIFhDSEFMX01NVV9SSU5HX0JJVFMJCTIJLyogbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIGhvbGQgcmluZyBudW1iZXIgKi8KLSNkZWZpbmUgWENIQUxfTU1VX1NSX0JJVFMJCTAJLyogbnVtYmVyIG9mIHNpemUtcmVzdHJpY3Rpb24gYml0cyBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgWENIQUxfTU1VX0NBX0JJVFMJCTQJLyogbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIGhvbGQgY2FjaGUgYXR0cmlidXRlIGVuY29kaW5nICovCi0jZGVmaW5lIFhDSEFMX01NVV9NQVhfUFRFX1BBR0VfU0laRQkxMgkvKiBtYXggcGFnZSBzaXplIGluIGEgUFRFIHN0cnVjdHVyZSAobG9nMikgKi8KLSNkZWZpbmUgWENIQUxfTU1VX01JTl9QVEVfUEFHRV9TSVpFCTEyCS8qIG1pbiBwYWdlIHNpemUgaW4gYSBQVEUgc3RydWN0dXJlIChsb2cyKSAqLwotCi0KLS8qKiogIEluc3RydWN0aW9uIFRMQjogICoqKi8KLQotI2RlZmluZSBYQ0hBTF9JVExCX1dBWV9CSVRTCQkzCS8qIG51bWJlciBvZiBiaXRzIGhvbGRpbmcgdGhlIHdheXMgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9XQVlTCQkJNwkvKiBudW1iZXIgb2Ygd2F5cyAobi13YXkgc2V0LWFzc29jaWF0aXZlIFRMQikgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9BUkZfV0FZUwkJNAkvKiBudW1iZXIgb2YgYXV0by1yZWZpbGwgd2F5cyAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVFMJCQk0CS8qIG51bWJlciBvZiBzZXRzIChncm91cHMgb2Ygd2F5cyB3aXRoIGlkZW50aWNhbCBzZXR0aW5ncykgKi8KLQotLyogIFdheSBzZXQgdG8gd2hpY2ggZWFjaCB3YXkgYmVsb25nczogICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfV0FZMF9TRVQJCTAKLSNkZWZpbmUgWENIQUxfSVRMQl9XQVkxX1NFVAkJMAotI2RlZmluZSBYQ0hBTF9JVExCX1dBWTJfU0VUCQkwCi0jZGVmaW5lIFhDSEFMX0lUTEJfV0FZM19TRVQJCTAKLSNkZWZpbmUgWENIQUxfSVRMQl9XQVk0X1NFVAkJMQotI2RlZmluZSBYQ0hBTF9JVExCX1dBWTVfU0VUCQkyCi0jZGVmaW5lIFhDSEFMX0lUTEJfV0FZNl9TRVQJCTMKLQotLyogIFdheXMgc2V0cyB0aGF0IGFyZSB1c2VkIGJ5IGhhcmR3YXJlIGF1dG8tcmVmaWxsIChBUkYpOiAgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9BUkZfU0VUUwkJMQkvKiBudW1iZXIgb2YgYXV0by1yZWZpbGwgc2V0cyAqLwotI2RlZmluZSBYQ0hBTF9JVExCX0FSRl9TRVQwCQkwCS8qIGluZGV4IG9mIG4ndGggYXV0by1yZWZpbGwgc2V0ICovCi0KLS8qICBXYXkgc2V0cyB0aGF0IGFyZSAibWluLXdpcmVkIiAoc2VlIHRlcm1pbm9sb2d5IGNvbW1lbnQgYWJvdmUpOiAgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9NSU5XSVJFRF9TRVRTCTAJLyogbnVtYmVyIG9mICJtaW4td2lyZWQiIHNldHMgKi8KLQotCi0vKiAgSVRMQiB3YXkgc2V0IDAgKGdyb3VwIG9mIHdheXMgMCB0aHJ1IDMpOiAgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1dBWQkJCTAJLyogaW5kZXggb2YgZmlyc3Qgd2F5IGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfV0FZUwkJCTQJLyogbnVtYmVyIG9mIChjb250aWd1b3VzKSB3YXlzIGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfRU5UUklFU19MT0cyCQkyCS8qIGxvZzIobnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkpICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9FTlRSSUVTCQkJNAkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSAoYWx3YXlzIGEgcG93ZXIgb2YgMikgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX0FSRgkJCTEJLyogMT1hdXRvcmVmaWxsIGJ5IGgvdywgMD1ub24tYXV0b3JlZmlsbCAod2lyZWQvY29uc3RhbnQvc3RhdGljKSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfUEFHRVNJWkVTCQkxCS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgcGFnZSBzaXplcyBpbiB0aGlzIHdheSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfUEFHRVNaX0JJVFMJCTAJLyogbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1BBR0VTWl9MT0cyX01JTgkJMTIJLyogbG9nMihtaW5pbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9QQUdFU1pfTE9HMl9NQVgJCTEyCS8qIGxvZzIobWF4aW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfUEFHRVNaX0xPRzJfTElTVAkxMgkvKiBsaXN0IG9mIGxvZzIocGFnZSBzaXplKXMsIHNlcGFyYXRlZCBieSBYQ0hBTF9TRVA7Ci0JCQkJCQkJICAgMl5QQUdFU1pfQklUUyBlbnRyaWVzIGluIGxpc3QsIHVuc3VwcG9ydGVkIGVudHJpZXMgYXJlIHplcm8gKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX0FTSURfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IEFTSUQgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1ZQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgVlBOIGJpdHMsIG5vdCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1BQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgUFBOIGJpdHMsIGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfQ0FfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IENBIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9BU0lEX1JFU0VUCQkwCS8qIDEgaWYgQVNJRCByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9WUE5fUkVTRVQJCTAJLyogMSBpZiBWUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfUFBOX1JFU0VUCQkwCS8qIDEgaWYgUFBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX0NBX1JFU0VUCQkwCS8qIDEgaWYgQ0EgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotCi0vKiAgSVRMQiB3YXkgc2V0IDEgKGdyb3VwIG9mIHdheXMgNCB0aHJ1IDQpOiAgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1dBWQkJCTQJLyogaW5kZXggb2YgZmlyc3Qgd2F5IGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfV0FZUwkJCTEJLyogbnVtYmVyIG9mIChjb250aWd1b3VzKSB3YXlzIGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfRU5UUklFU19MT0cyCQkyCS8qIGxvZzIobnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkpICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9FTlRSSUVTCQkJNAkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSAoYWx3YXlzIGEgcG93ZXIgb2YgMikgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX0FSRgkJCTAJLyogMT1hdXRvcmVmaWxsIGJ5IGgvdywgMD1ub24tYXV0b3JlZmlsbCAod2lyZWQvY29uc3RhbnQvc3RhdGljKSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfUEFHRVNJWkVTCQk0CS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgcGFnZSBzaXplcyBpbiB0aGlzIHdheSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfUEFHRVNaX0JJVFMJCTIJLyogbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1BBR0VTWl9MT0cyX01JTgkJMjAJLyogbG9nMihtaW5pbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9QQUdFU1pfTE9HMl9NQVgJCTI2CS8qIGxvZzIobWF4aW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfUEFHRVNaX0xPRzJfTElTVAkyMCBYQ0hBTF9TRVAgMjIgWENIQUxfU0VQIDI0IFhDSEFMX1NFUCAyNgkvKiBsaXN0IG9mIGxvZzIocGFnZSBzaXplKXMsIHNlcGFyYXRlZCBieSBYQ0hBTF9TRVA7Ci0JCQkJCQkJICAgMl5QQUdFU1pfQklUUyBlbnRyaWVzIGluIGxpc3QsIHVuc3VwcG9ydGVkIGVudHJpZXMgYXJlIHplcm8gKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX0FTSURfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IEFTSUQgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1ZQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgVlBOIGJpdHMsIG5vdCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1BQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgUFBOIGJpdHMsIGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfQ0FfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IENBIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9BU0lEX1JFU0VUCQkwCS8qIDEgaWYgQVNJRCByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9WUE5fUkVTRVQJCTAJLyogMSBpZiBWUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfUFBOX1JFU0VUCQkwCS8qIDEgaWYgUFBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX0NBX1JFU0VUCQkwCS8qIDEgaWYgQ0EgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotCi0vKiAgSVRMQiB3YXkgc2V0IDIgKGdyb3VwIG9mIHdheXMgNSB0aHJ1IDUpOiAgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1dBWQkJCTUJLyogaW5kZXggb2YgZmlyc3Qgd2F5IGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfV0FZUwkJCTEJLyogbnVtYmVyIG9mIChjb250aWd1b3VzKSB3YXlzIGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRU5UUklFU19MT0cyCQkxCS8qIGxvZzIobnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkpICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9FTlRSSUVTCQkJMgkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSAoYWx3YXlzIGEgcG93ZXIgb2YgMikgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX0FSRgkJCTAJLyogMT1hdXRvcmVmaWxsIGJ5IGgvdywgMD1ub24tYXV0b3JlZmlsbCAod2lyZWQvY29uc3RhbnQvc3RhdGljKSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfUEFHRVNJWkVTCQkxCS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgcGFnZSBzaXplcyBpbiB0aGlzIHdheSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfUEFHRVNaX0JJVFMJCTAJLyogbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1BBR0VTWl9MT0cyX01JTgkJMjcJLyogbG9nMihtaW5pbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9QQUdFU1pfTE9HMl9NQVgJCTI3CS8qIGxvZzIobWF4aW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfUEFHRVNaX0xPRzJfTElTVAkyNwkvKiBsaXN0IG9mIGxvZzIocGFnZSBzaXplKXMsIHNlcGFyYXRlZCBieSBYQ0hBTF9TRVA7Ci0JCQkJCQkJICAgMl5QQUdFU1pfQklUUyBlbnRyaWVzIGluIGxpc3QsIHVuc3VwcG9ydGVkIGVudHJpZXMgYXJlIHplcm8gKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX0FTSURfQ09OU1RNQVNLCQkweEZGCS8qIGNvbnN0YW50IEFTSUQgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1ZQTl9DT05TVE1BU0sJCTB4RjAwMDAwMDAJLyogY29uc3RhbnQgVlBOIGJpdHMsIG5vdCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1BQTl9DT05TVE1BU0sJCTB4RjgwMDAwMDAJLyogY29uc3RhbnQgUFBOIGJpdHMsIGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfQ0FfQ09OU1RNQVNLCQkweDAwMDAwMDBGCS8qIGNvbnN0YW50IENBIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9BU0lEX1JFU0VUCQkwCS8qIDEgaWYgQVNJRCByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9WUE5fUkVTRVQJCTAJLyogMSBpZiBWUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfUFBOX1JFU0VUCQkwCS8qIDEgaWYgUFBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX0NBX1JFU0VUCQkwCS8qIDEgaWYgQ0EgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotLyogIENvbnN0YW50IEFTSUQgdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIElUTEIgd2F5IHNldCAyIChiZWNhdXNlIEFTSURfQ09OU1RNQVNLIGlzIG5vbi16ZXJvKTogICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9FMF9BU0lEX0NPTlNUCQkweDAxCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9FMV9BU0lEX0NPTlNUCQkweDAxCi0vKiAgQ29uc3RhbnQgVlBOIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBJVExCIHdheSBzZXQgMiAoYmVjYXVzZSBWUE5fQ09OU1RNQVNLIGlzIG5vbi16ZXJvKTogICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9FMF9WUE5fQ09OU1QJCTB4RDAwMDAwMDAKLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX0UxX1ZQTl9DT05TVAkJMHhEODAwMDAwMAotLyogIENvbnN0YW50IFBQTiB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgSVRMQiB3YXkgc2V0IDIgKGJlY2F1c2UgUFBOX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRTBfUFBOX0NPTlNUCQkweDAwMDAwMDAwCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9FMV9QUE5fQ09OU1QJCTB4MDAwMDAwMDAKLS8qICBDb25zdGFudCBDQSB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgSVRMQiB3YXkgc2V0IDIgKGJlY2F1c2UgQ0FfQ09OU1RNQVNLIGlzIG5vbi16ZXJvKTogICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9FMF9DQV9DT05TVAkJMHgwNwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRTFfQ0FfQ09OU1QJCTB4MDMKLQotLyogIElUTEIgd2F5IHNldCAzIChncm91cCBvZiB3YXlzIDYgdGhydSA2KTogICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19XQVkJCQk2CS8qIGluZGV4IG9mIGZpcnN0IHdheSBpbiB0aGlzIHdheSBzZXQgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX1dBWVMJCQkxCS8qIG51bWJlciBvZiAoY29udGlndW91cykgd2F5cyBpbiB0aGlzIHdheSBzZXQgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0VOVFJJRVNfTE9HMgkJMQkvKiBsb2cyKG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5KSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfRU5UUklFUwkJCTIJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkgKGFsd2F5cyBhIHBvd2VyIG9mIDIpICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19BUkYJCQkwCS8qIDE9YXV0b3JlZmlsbCBieSBoL3csIDA9bm9uLWF1dG9yZWZpbGwgKHdpcmVkL2NvbnN0YW50L3N0YXRpYykgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX1BBR0VTSVpFUwkJMQkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW4gdGhpcyB3YXkgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX1BBR0VTWl9CSVRTCQkwCS8qIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgcGFnZSBzaXplICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19QQUdFU1pfTE9HMl9NSU4JCTI4CS8qIGxvZzIobWluaW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfUEFHRVNaX0xPRzJfTUFYCQkyOAkvKiBsb2cyKG1heGltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX1BBR0VTWl9MT0cyX0xJU1QJMjgJLyogbGlzdCBvZiBsb2cyKHBhZ2Ugc2l6ZSlzLCBzZXBhcmF0ZWQgYnkgWENIQUxfU0VQOwotCQkJCQkJCSAgIDJeUEFHRVNaX0JJVFMgZW50cmllcyBpbiBsaXN0LCB1bnN1cHBvcnRlZCBlbnRyaWVzIGFyZSB6ZXJvICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19BU0lEX0NPTlNUTUFTSwkJMHhGRgkvKiBjb25zdGFudCBBU0lEIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19WUE5fQ09OU1RNQVNLCQkweEUwMDAwMDAwCS8qIGNvbnN0YW50IFZQTiBiaXRzLCBub3QgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19QUE5fQ09OU1RNQVNLCQkweEYwMDAwMDAwCS8qIGNvbnN0YW50IFBQTiBiaXRzLCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0NBX0NPTlNUTUFTSwkJMHgwMDAwMDAwRgkvKiBjb25zdGFudCBDQSBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfQVNJRF9SRVNFVAkJMAkvKiAxIGlmIEFTSUQgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfVlBOX1JFU0VUCQkwCS8qIDEgaWYgVlBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX1BQTl9SRVNFVAkJMAkvKiAxIGlmIFBQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19DQV9SRVNFVAkJMAkvKiAxIGlmIENBIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLS8qICBDb25zdGFudCBBU0lEIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBJVExCIHdheSBzZXQgMyAoYmVjYXVzZSBBU0lEX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfRTBfQVNJRF9DT05TVAkJMHgwMQotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfRTFfQVNJRF9DT05TVAkJMHgwMQotLyogIENvbnN0YW50IFZQTiB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgSVRMQiB3YXkgc2V0IDMgKGJlY2F1c2UgVlBOX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfRTBfVlBOX0NPTlNUCQkweEUwMDAwMDAwCi0jZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19FMV9WUE5fQ09OU1QJCTB4RjAwMDAwMDAKLS8qICBDb25zdGFudCBQUE4gdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIElUTEIgd2F5IHNldCAzIChiZWNhdXNlIFBQTl9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0UwX1BQTl9DT05TVAkJMHhGMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfRTFfUFBOX0NPTlNUCQkweEYwMDAwMDAwCi0vKiAgQ29uc3RhbnQgQ0EgdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIElUTEIgd2F5IHNldCAzIChiZWNhdXNlIENBX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLwotI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfRTBfQ0FfQ09OU1QJCTB4MDcKLSNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0UxX0NBX0NPTlNUCQkweDAzCi0KLS8qICBJbmRleGluZyBtYWNyb3M6ICAqLwotI2RlZmluZSBfWENIQUxfSVRMQl9TRVQobixfd2hhdCkJWENIQUxfSVRMQl9TRVQgIyMgbiAjIyBfd2hhdAotI2RlZmluZSBYQ0hBTF9JVExCX1NFVChuLHdoYXQpCQlfWENIQUxfSVRMQl9TRVQobiwgXyAjIyB3aGF0ICkKLSNkZWZpbmUgX1hDSEFMX0lUTEJfU0VUX0UobixpLF93aGF0KQlYQ0hBTF9JVExCX1NFVCAjIyBuICMjIF9FICMjIGkgIyMgX3doYXQKLSNkZWZpbmUgWENIQUxfSVRMQl9TRVRfRShuLGksd2hhdCkJX1hDSEFMX0lUTEJfU0VUX0UobixpLCBfICMjIHdoYXQgKQotLyoKLSAqICBFeGFtcGxlIHVzZTogIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfQVJGX1NFVDAsRU5UUklFUykKLSAqCXRvIGdldCB0aGUgdmFsdWUgb2YgWENIQUxfSVRMQl9TRVQ8bj5fRU5UUklFUyB3aGVyZSA8bj4gaXMgdGhlIGZpcnN0IGF1dG8tcmVmaWxsIHNldC4KLSAqLwotCi0KLS8qKiogIERhdGEgVExCOiAgKioqLwotCi0jZGVmaW5lIFhDSEFMX0RUTEJfV0FZX0JJVFMJCTQJLyogbnVtYmVyIG9mIGJpdHMgaG9sZGluZyB0aGUgd2F5cyAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1dBWVMJCQkxMAkvKiBudW1iZXIgb2Ygd2F5cyAobi13YXkgc2V0LWFzc29jaWF0aXZlIFRMQikgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9BUkZfV0FZUwkJNAkvKiBudW1iZXIgb2YgYXV0by1yZWZpbGwgd2F5cyAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVFMJCQk1CS8qIG51bWJlciBvZiBzZXRzIChncm91cHMgb2Ygd2F5cyB3aXRoIGlkZW50aWNhbCBzZXR0aW5ncykgKi8KLQotLyogIFdheSBzZXQgdG8gd2hpY2ggZWFjaCB3YXkgYmVsb25nczogICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfV0FZMF9TRVQJCTAKLSNkZWZpbmUgWENIQUxfRFRMQl9XQVkxX1NFVAkJMAotI2RlZmluZSBYQ0hBTF9EVExCX1dBWTJfU0VUCQkwCi0jZGVmaW5lIFhDSEFMX0RUTEJfV0FZM19TRVQJCTAKLSNkZWZpbmUgWENIQUxfRFRMQl9XQVk0X1NFVAkJMQotI2RlZmluZSBYQ0hBTF9EVExCX1dBWTVfU0VUCQkyCi0jZGVmaW5lIFhDSEFMX0RUTEJfV0FZNl9TRVQJCTMKLSNkZWZpbmUgWENIQUxfRFRMQl9XQVk3X1NFVAkJNAotI2RlZmluZSBYQ0hBTF9EVExCX1dBWThfU0VUCQk0Ci0jZGVmaW5lIFhDSEFMX0RUTEJfV0FZOV9TRVQJCTQKLQotLyogIFdheXMgc2V0cyB0aGF0IGFyZSB1c2VkIGJ5IGhhcmR3YXJlIGF1dG8tcmVmaWxsIChBUkYpOiAgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9BUkZfU0VUUwkJMQkvKiBudW1iZXIgb2YgYXV0by1yZWZpbGwgc2V0cyAqLwotI2RlZmluZSBYQ0hBTF9EVExCX0FSRl9TRVQwCQkwCS8qIGluZGV4IG9mIG4ndGggYXV0by1yZWZpbGwgc2V0ICovCi0KLS8qICBXYXkgc2V0cyB0aGF0IGFyZSAibWluLXdpcmVkIiAoc2VlIHRlcm1pbm9sb2d5IGNvbW1lbnQgYWJvdmUpOiAgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9NSU5XSVJFRF9TRVRTCTEJLyogbnVtYmVyIG9mICJtaW4td2lyZWQiIHNldHMgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9NSU5XSVJFRF9TRVQwCTQJLyogaW5kZXggb2Ygbid0aCAibWluLXdpcmVkIiBzZXQgKi8KLQotCi0vKiAgRFRMQiB3YXkgc2V0IDAgKGdyb3VwIG9mIHdheXMgMCB0aHJ1IDMpOiAgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1dBWQkJCTAJLyogaW5kZXggb2YgZmlyc3Qgd2F5IGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfV0FZUwkJCTQJLyogbnVtYmVyIG9mIChjb250aWd1b3VzKSB3YXlzIGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfRU5UUklFU19MT0cyCQkyCS8qIGxvZzIobnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9FTlRSSUVTCQkJNAkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSAoYWx3YXlzIGEgcG93ZXIgb2YgMikgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX0FSRgkJCTEJLyogMT1hdXRvcmVmaWxsIGJ5IGgvdywgMD1ub24tYXV0b3JlZmlsbCAod2lyZWQvY29uc3RhbnQvc3RhdGljKSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfUEFHRVNJWkVTCQkxCS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgcGFnZSBzaXplcyBpbiB0aGlzIHdheSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfUEFHRVNaX0JJVFMJCTAJLyogbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1BBR0VTWl9MT0cyX01JTgkJMTIJLyogbG9nMihtaW5pbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9QQUdFU1pfTE9HMl9NQVgJCTEyCS8qIGxvZzIobWF4aW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfUEFHRVNaX0xPRzJfTElTVAkxMgkvKiBsaXN0IG9mIGxvZzIocGFnZSBzaXplKXMsIHNlcGFyYXRlZCBieSBYQ0hBTF9TRVA7Ci0JCQkJCQkJICAgMl5QQUdFU1pfQklUUyBlbnRyaWVzIGluIGxpc3QsIHVuc3VwcG9ydGVkIGVudHJpZXMgYXJlIHplcm8gKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX0FTSURfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IEFTSUQgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1ZQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgVlBOIGJpdHMsIG5vdCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1BQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgUFBOIGJpdHMsIGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfQ0FfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IENBIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9BU0lEX1JFU0VUCQkwCS8qIDEgaWYgQVNJRCByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9WUE5fUkVTRVQJCTAJLyogMSBpZiBWUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfUFBOX1JFU0VUCQkwCS8qIDEgaWYgUFBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX0NBX1JFU0VUCQkwCS8qIDEgaWYgQ0EgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotCi0vKiAgRFRMQiB3YXkgc2V0IDEgKGdyb3VwIG9mIHdheXMgNCB0aHJ1IDQpOiAgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1dBWQkJCTQJLyogaW5kZXggb2YgZmlyc3Qgd2F5IGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfV0FZUwkJCTEJLyogbnVtYmVyIG9mIChjb250aWd1b3VzKSB3YXlzIGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfRU5UUklFU19MT0cyCQkyCS8qIGxvZzIobnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9FTlRSSUVTCQkJNAkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSAoYWx3YXlzIGEgcG93ZXIgb2YgMikgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX0FSRgkJCTAJLyogMT1hdXRvcmVmaWxsIGJ5IGgvdywgMD1ub24tYXV0b3JlZmlsbCAod2lyZWQvY29uc3RhbnQvc3RhdGljKSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfUEFHRVNJWkVTCQk0CS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgcGFnZSBzaXplcyBpbiB0aGlzIHdheSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfUEFHRVNaX0JJVFMJCTIJLyogbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1BBR0VTWl9MT0cyX01JTgkJMjAJLyogbG9nMihtaW5pbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9QQUdFU1pfTE9HMl9NQVgJCTI2CS8qIGxvZzIobWF4aW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfUEFHRVNaX0xPRzJfTElTVAkyMCBYQ0hBTF9TRVAgMjIgWENIQUxfU0VQIDI0IFhDSEFMX1NFUCAyNgkvKiBsaXN0IG9mIGxvZzIocGFnZSBzaXplKXMsIHNlcGFyYXRlZCBieSBYQ0hBTF9TRVA7Ci0JCQkJCQkJICAgMl5QQUdFU1pfQklUUyBlbnRyaWVzIGluIGxpc3QsIHVuc3VwcG9ydGVkIGVudHJpZXMgYXJlIHplcm8gKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX0FTSURfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IEFTSUQgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1ZQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgVlBOIGJpdHMsIG5vdCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1BQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgUFBOIGJpdHMsIGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfQ0FfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IENBIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9BU0lEX1JFU0VUCQkwCS8qIDEgaWYgQVNJRCByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9WUE5fUkVTRVQJCTAJLyogMSBpZiBWUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfUFBOX1JFU0VUCQkwCS8qIDEgaWYgUFBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX0NBX1JFU0VUCQkwCS8qIDEgaWYgQ0EgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotCi0vKiAgRFRMQiB3YXkgc2V0IDIgKGdyb3VwIG9mIHdheXMgNSB0aHJ1IDUpOiAgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1dBWQkJCTUJLyogaW5kZXggb2YgZmlyc3Qgd2F5IGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfV0FZUwkJCTEJLyogbnVtYmVyIG9mIChjb250aWd1b3VzKSB3YXlzIGluIHRoaXMgd2F5IHNldCAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRU5UUklFU19MT0cyCQkxCS8qIGxvZzIobnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9FTlRSSUVTCQkJMgkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSAoYWx3YXlzIGEgcG93ZXIgb2YgMikgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX0FSRgkJCTAJLyogMT1hdXRvcmVmaWxsIGJ5IGgvdywgMD1ub24tYXV0b3JlZmlsbCAod2lyZWQvY29uc3RhbnQvc3RhdGljKSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfUEFHRVNJWkVTCQkxCS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgcGFnZSBzaXplcyBpbiB0aGlzIHdheSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfUEFHRVNaX0JJVFMJCTAJLyogbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBwYWdlIHNpemUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1BBR0VTWl9MT0cyX01JTgkJMjcJLyogbG9nMihtaW5pbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9QQUdFU1pfTE9HMl9NQVgJCTI3CS8qIGxvZzIobWF4aW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfUEFHRVNaX0xPRzJfTElTVAkyNwkvKiBsaXN0IG9mIGxvZzIocGFnZSBzaXplKXMsIHNlcGFyYXRlZCBieSBYQ0hBTF9TRVA7Ci0JCQkJCQkJICAgMl5QQUdFU1pfQklUUyBlbnRyaWVzIGluIGxpc3QsIHVuc3VwcG9ydGVkIGVudHJpZXMgYXJlIHplcm8gKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX0FTSURfQ09OU1RNQVNLCQkweEZGCS8qIGNvbnN0YW50IEFTSUQgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1ZQTl9DT05TVE1BU0sJCTB4RjAwMDAwMDAJLyogY29uc3RhbnQgVlBOIGJpdHMsIG5vdCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1BQTl9DT05TVE1BU0sJCTB4RjgwMDAwMDAJLyogY29uc3RhbnQgUFBOIGJpdHMsIGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfQ0FfQ09OU1RNQVNLCQkweDAwMDAwMDBGCS8qIGNvbnN0YW50IENBIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9BU0lEX1JFU0VUCQkwCS8qIDEgaWYgQVNJRCByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9WUE5fUkVTRVQJCTAJLyogMSBpZiBWUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfUFBOX1JFU0VUCQkwCS8qIDEgaWYgUFBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX0NBX1JFU0VUCQkwCS8qIDEgaWYgQ0EgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotLyogIENvbnN0YW50IEFTSUQgdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIERUTEIgd2F5IHNldCAyIChiZWNhdXNlIEFTSURfQ09OU1RNQVNLIGlzIG5vbi16ZXJvKTogICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9FMF9BU0lEX0NPTlNUCQkweDAxCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9FMV9BU0lEX0NPTlNUCQkweDAxCi0vKiAgQ29uc3RhbnQgVlBOIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBEVExCIHdheSBzZXQgMiAoYmVjYXVzZSBWUE5fQ09OU1RNQVNLIGlzIG5vbi16ZXJvKTogICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9FMF9WUE5fQ09OU1QJCTB4RDAwMDAwMDAKLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX0UxX1ZQTl9DT05TVAkJMHhEODAwMDAwMAotLyogIENvbnN0YW50IFBQTiB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgRFRMQiB3YXkgc2V0IDIgKGJlY2F1c2UgUFBOX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRTBfUFBOX0NPTlNUCQkweDAwMDAwMDAwCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9FMV9QUE5fQ09OU1QJCTB4MDAwMDAwMDAKLS8qICBDb25zdGFudCBDQSB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgRFRMQiB3YXkgc2V0IDIgKGJlY2F1c2UgQ0FfQ09OU1RNQVNLIGlzIG5vbi16ZXJvKTogICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9FMF9DQV9DT05TVAkJMHgwNwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRTFfQ0FfQ09OU1QJCTB4MDMKLQotLyogIERUTEIgd2F5IHNldCAzIChncm91cCBvZiB3YXlzIDYgdGhydSA2KTogICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19XQVkJCQk2CS8qIGluZGV4IG9mIGZpcnN0IHdheSBpbiB0aGlzIHdheSBzZXQgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX1dBWVMJCQkxCS8qIG51bWJlciBvZiAoY29udGlndW91cykgd2F5cyBpbiB0aGlzIHdheSBzZXQgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0VOVFJJRVNfTE9HMgkJMQkvKiBsb2cyKG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5KSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfRU5UUklFUwkJCTIJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkgKGFsd2F5cyBhIHBvd2VyIG9mIDIpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19BUkYJCQkwCS8qIDE9YXV0b3JlZmlsbCBieSBoL3csIDA9bm9uLWF1dG9yZWZpbGwgKHdpcmVkL2NvbnN0YW50L3N0YXRpYykgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX1BBR0VTSVpFUwkJMQkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW4gdGhpcyB3YXkgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX1BBR0VTWl9CSVRTCQkwCS8qIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgcGFnZSBzaXplICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19QQUdFU1pfTE9HMl9NSU4JCTI4CS8qIGxvZzIobWluaW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfUEFHRVNaX0xPRzJfTUFYCQkyOAkvKiBsb2cyKG1heGltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX1BBR0VTWl9MT0cyX0xJU1QJMjgJLyogbGlzdCBvZiBsb2cyKHBhZ2Ugc2l6ZSlzLCBzZXBhcmF0ZWQgYnkgWENIQUxfU0VQOwotCQkJCQkJCSAgIDJeUEFHRVNaX0JJVFMgZW50cmllcyBpbiBsaXN0LCB1bnN1cHBvcnRlZCBlbnRyaWVzIGFyZSB6ZXJvICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19BU0lEX0NPTlNUTUFTSwkJMHhGRgkvKiBjb25zdGFudCBBU0lEIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19WUE5fQ09OU1RNQVNLCQkweEUwMDAwMDAwCS8qIGNvbnN0YW50IFZQTiBiaXRzLCBub3QgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19QUE5fQ09OU1RNQVNLCQkweEYwMDAwMDAwCS8qIGNvbnN0YW50IFBQTiBiaXRzLCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0NBX0NPTlNUTUFTSwkJMHgwMDAwMDAwRgkvKiBjb25zdGFudCBDQSBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfQVNJRF9SRVNFVAkJMAkvKiAxIGlmIEFTSUQgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfVlBOX1JFU0VUCQkwCS8qIDEgaWYgVlBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX1BQTl9SRVNFVAkJMAkvKiAxIGlmIFBQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19DQV9SRVNFVAkJMAkvKiAxIGlmIENBIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLS8qICBDb25zdGFudCBBU0lEIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBEVExCIHdheSBzZXQgMyAoYmVjYXVzZSBBU0lEX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfRTBfQVNJRF9DT05TVAkJMHgwMQotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfRTFfQVNJRF9DT05TVAkJMHgwMQotLyogIENvbnN0YW50IFZQTiB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgRFRMQiB3YXkgc2V0IDMgKGJlY2F1c2UgVlBOX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfRTBfVlBOX0NPTlNUCQkweEUwMDAwMDAwCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19FMV9WUE5fQ09OU1QJCTB4RjAwMDAwMDAKLS8qICBDb25zdGFudCBQUE4gdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIERUTEIgd2F5IHNldCAzIChiZWNhdXNlIFBQTl9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0UwX1BQTl9DT05TVAkJMHhGMDAwMDAwMAotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfRTFfUFBOX0NPTlNUCQkweEYwMDAwMDAwCi0vKiAgQ29uc3RhbnQgQ0EgdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIERUTEIgd2F5IHNldCAzIChiZWNhdXNlIENBX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfRTBfQ0FfQ09OU1QJCTB4MDcKLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0UxX0NBX0NPTlNUCQkweDAzCi0KLS8qICBEVExCIHdheSBzZXQgNCAoZ3JvdXAgb2Ygd2F5cyA3IHRocnUgOSk6ICAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfV0FZCQkJNwkvKiBpbmRleCBvZiBmaXJzdCB3YXkgaW4gdGhpcyB3YXkgc2V0ICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9XQVlTCQkJMwkvKiBudW1iZXIgb2YgKGNvbnRpZ3VvdXMpIHdheXMgaW4gdGhpcyB3YXkgc2V0ICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9FTlRSSUVTX0xPRzIJCTAJLyogbG9nMihudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSkgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X0VOVFJJRVMJCQkxCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5IChhbHdheXMgYSBwb3dlciBvZiAyKSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfQVJGCQkJMAkvKiAxPWF1dG9yZWZpbGwgYnkgaC93LCAwPW5vbi1hdXRvcmVmaWxsICh3aXJlZC9jb25zdGFudC9zdGF0aWMpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9QQUdFU0laRVMJCTEJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCBwYWdlIHNpemVzIGluIHRoaXMgd2F5ICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9QQUdFU1pfQklUUwkJMAkvKiBudW1iZXIgb2YgYml0cyB0byBlbmNvZGUgdGhlIHBhZ2Ugc2l6ZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfUEFHRVNaX0xPRzJfTUlOCQkxMgkvKiBsb2cyKG1pbmltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X1BBR0VTWl9MT0cyX01BWAkJMTIJLyogbG9nMihtYXhpbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9QQUdFU1pfTE9HMl9MSVNUCTEyCS8qIGxpc3Qgb2YgbG9nMihwYWdlIHNpemUpcywgc2VwYXJhdGVkIGJ5IFhDSEFMX1NFUDsKLQkJCQkJCQkgICAyXlBBR0VTWl9CSVRTIGVudHJpZXMgaW4gbGlzdCwgdW5zdXBwb3J0ZWQgZW50cmllcyBhcmUgemVybyAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfQVNJRF9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgQVNJRCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfVlBOX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBWUE4gYml0cywgbm90IGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfUFBOX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBQUE4gYml0cywgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9DQV9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgQ0EgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X0FTSURfUkVTRVQJCTAJLyogMSBpZiBBU0lEIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X1ZQTl9SRVNFVAkJMAkvKiAxIGlmIFZQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9QUE5fUkVTRVQJCTAJLyogMSBpZiBQUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfQ0FfUkVTRVQJCTAJLyogMSBpZiBDQSByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCi0KLS8qICBJbmRleGluZyBtYWNyb3M6ICAqLwotI2RlZmluZSBfWENIQUxfRFRMQl9TRVQobixfd2hhdCkJWENIQUxfRFRMQl9TRVQgIyMgbiAjIyBfd2hhdAotI2RlZmluZSBYQ0hBTF9EVExCX1NFVChuLHdoYXQpCQlfWENIQUxfRFRMQl9TRVQobiwgXyAjIyB3aGF0ICkKLSNkZWZpbmUgX1hDSEFMX0RUTEJfU0VUX0UobixpLF93aGF0KQlYQ0hBTF9EVExCX1NFVCAjIyBuICMjIF9FICMjIGkgIyMgX3doYXQKLSNkZWZpbmUgWENIQUxfRFRMQl9TRVRfRShuLGksd2hhdCkJX1hDSEFMX0RUTEJfU0VUX0UobixpLCBfICMjIHdoYXQgKQotLyoKLSAqICBFeGFtcGxlIHVzZTogIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfQVJGX1NFVDAsRU5UUklFUykKLSAqCXRvIGdldCB0aGUgdmFsdWUgb2YgWENIQUxfRFRMQl9TRVQ8bj5fRU5UUklFUyB3aGVyZSA8bj4gaXMgdGhlIGZpcnN0IGF1dG8tcmVmaWxsIHNldC4KLSAqLwotCi0KLS8qCi0gKiAgRGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIGZ1bGwgTU1VICh3aXRoIFBhZ2UgVGFibGUgYW5kIFByb3RlY3Rpb24pCi0gKiAgdXNhYmxlIGZvciBhbiBNTVUtYmFzZWQgT1M6Ci0gKi8KLSNpZiBYQ0hBTF9IQVZFX1RMQlMgJiYgIVhDSEFMX0hBVkVfU1BBTk5JTkdfV0FZICYmIFhDSEFMX0lUTEJfQVJGX1dBWVMgPiAwICYmIFhDSEFMX0RUTEJfQVJGX1dBWVMgPiAwICYmIFhDSEFMX01NVV9SSU5HUyA+PSAyCi0jIGRlZmluZSBYQ0hBTF9IQVZFX1BUUF9NTVUJCTEJLyogaGF2ZSBmdWxsIE1NVSAod2l0aCBwYWdlIHRhYmxlIFthdXRvcmVmaWxsXSBhbmQgcHJvdGVjdGlvbikgKi8KLSNlbHNlCi0jIGRlZmluZSBYQ0hBTF9IQVZFX1BUUF9NTVUJCTAJLyogZG9uJ3QgaGF2ZSBmdWxsIE1NVSAqLwotI2VuZGlmCi0KLS8qCi0gKiAgRm9yIGZ1bGwgTU1VcywgcmVwb3J0IGtlcm5lbCBSQU0gc2VnbWVudCBhbmQga2VybmVsIEkvTyBzZWdtZW50IHN0YXRpYyBwYWdlIG1hcHBpbmdzOgotICovCi0jaWYgWENIQUxfSEFWRV9QVFBfTU1VCi0jZGVmaW5lIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCQkweEQwMDAwMDAwCS8qIHZpcnQuYWRkciBvZiBrZXJuZWwgUkFNIGNhY2hlZCBzdGF0aWMgbWFwICovCi0jZGVmaW5lIFhDSEFMX0tTRUdfQ0FDSEVEX1BBRERSCQkweDAwMDAwMDAwCS8qIHBoeXMuYWRkciBvZiBrc2VnX2NhY2hlZCAqLwotI2RlZmluZSBYQ0hBTF9LU0VHX0NBQ0hFRF9TSVpFCQkweDA4MDAwMDAwCS8qIHNpemUgaW4gYnl0ZXMgb2Yga3NlZ19jYWNoZWQgKGFzc3VtZWQgcG93ZXIgb2YgMiEhISkgKi8KLSNkZWZpbmUgWENIQUxfS1NFR19CWVBBU1NfVkFERFIJCTB4RDgwMDAwMDAJLyogdmlydC5hZGRyIG9mIGtlcm5lbCBSQU0gYnlwYXNzICh1bmNhY2hlZCkgc3RhdGljIG1hcCAqLwotI2RlZmluZSBYQ0hBTF9LU0VHX0JZUEFTU19QQUREUgkJMHgwMDAwMDAwMAkvKiBwaHlzLmFkZHIgb2Yga3NlZ19ieXBhc3MgKi8KLSNkZWZpbmUgWENIQUxfS1NFR19CWVBBU1NfU0laRQkJMHgwODAwMDAwMAkvKiBzaXplIGluIGJ5dGVzIG9mIGtzZWdfYnlwYXNzIChhc3N1bWVkIHBvd2VyIG9mIDIhISEpICovCi0KLSNkZWZpbmUgWENIQUxfS0lPX0NBQ0hFRF9WQUREUgkJMHhFMDAwMDAwMAkvKiB2aXJ0LmFkZHIgb2Yga2VybmVsIEkvTyBjYWNoZWQgc3RhdGljIG1hcCAqLwotI2RlZmluZSBYQ0hBTF9LSU9fQ0FDSEVEX1BBRERSCQkweEYwMDAwMDAwCS8qIHBoeXMuYWRkciBvZiBraW9fY2FjaGVkICovCi0jZGVmaW5lIFhDSEFMX0tJT19DQUNIRURfU0laRQkJMHgxMDAwMDAwMAkvKiBzaXplIGluIGJ5dGVzIG9mIGtpb19jYWNoZWQgKGFzc3VtZWQgcG93ZXIgb2YgMiEhISkgKi8KLSNkZWZpbmUgWENIQUxfS0lPX0JZUEFTU19WQUREUgkJMHhGMDAwMDAwMAkvKiB2aXJ0LmFkZHIgb2Yga2VybmVsIEkvTyBieXBhc3MgKHVuY2FjaGVkKSBzdGF0aWMgbWFwICovCi0jZGVmaW5lIFhDSEFMX0tJT19CWVBBU1NfUEFERFIJCTB4RjAwMDAwMDAJLyogcGh5cy5hZGRyIG9mIGtpb19ieXBhc3MgKi8KLSNkZWZpbmUgWENIQUxfS0lPX0JZUEFTU19TSVpFCQkweDEwMDAwMDAwCS8qIHNpemUgaW4gYnl0ZXMgb2Yga2lvX2J5cGFzcyAoYXNzdW1lZCBwb3dlciBvZiAyISEhKSAqLwotCi0jZGVmaW5lIFhDSEFMX1NFR19NQVBQQUJMRV9WQUREUgkweDAwMDAwMDAwCS8qIHN0YXJ0IG9mIGxhcmdlc3Qgbm9uLXN0YXRpYy1tYXBwZWQgdmlydHVhbCBhZGRyIGFyZWEgKi8KLSNkZWZpbmUgWENIQUxfU0VHX01BUFBBQkxFX1NJWkUJCTB4RDAwMDAwMDAJLyogc2l6ZSBpbiBieXRlcyBvZiAgIiAgKi8KLS8qIGRlZmluZSBYQ0hBTF9TRUdfTUFQUEFCTEUyX3h4eCBpZiBtb3JlIGFyZWFzIHByZXNlbnQsIHNvcnRlZCBpbiBvcmRlciBvZiBkZXNjZW5kaW5nIHNpemUuICAqLwotI2VuZGlmCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJTUlTQwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBYQ0hBTF9OVU1fV1JJVEVCVUZGRVJfRU5UUklFUwk0CS8qIG51bWJlciBvZiB3cml0ZSBidWZmZXIgZW50cmllcyAqLwotCi0jZGVmaW5lIFhDSEFMX0NPUkVfSUQJCQkibGludXhfYmUiCS8qIGNvbmZpZ3VyYXRpb24ncyBhbHBoYW51bWVyaWMgY29yZSBpZGVudGlmaWVyCi0JCQkJCQkJICAgKENvcmVJRCkgc2V0IGluIHRoZSBYdGVuc2EgUHJvY2Vzc29yIEdlbmVyYXRvciAqLwotCi0jZGVmaW5lIFhDSEFMX0JVSUxEX1VOSVFVRV9JRAkJMHgwMDAwMzI1NgkvKiBzb2Z0d2FyZSBidWlsZC11bmlxdWUgSUQgKDIyLWJpdCkgKi8KLQotLyogIFRoZXNlIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBoYXJkd2FyZSB0YXJnZXRlZCBieSB0aGlzIHNvZnR3YXJlOiAgKi8KLSNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQwCQkweEMxMDNEMUZGCS8qIGNvbmZpZyBJRCByZWcgMCB2YWx1ZSAodXBwZXIgMzIgb2YgNjQgYml0cykgKi8KLSNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQxCQkweDAwODAzMjU2CS8qIGNvbmZpZyBJRCByZWcgMSB2YWx1ZSAobG93ZXIgMzIgb2YgNjQgYml0cykgKi8KLSNkZWZpbmUgWENIQUxfQ09ORklHSUQwCQkJWENIQUxfSFdfQ09ORklHSUQwCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkgLS0gZG9uJ3QgdXNlISAqLwotI2RlZmluZSBYQ0hBTF9DT05GSUdJRDEJCQlYQ0hBTF9IV19DT05GSUdJRDEJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seSAtLSBkb24ndCB1c2UhICovCi0jZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfTUFKT1IJCTEwNTAJLyogbWFqb3IgcmVsZWFzZSBvZiB0YXJnZXRlZCBoYXJkd2FyZSAqLwotI2RlZmluZSBYQ0hBTF9IV19SRUxFQVNFX01JTk9SCQkxCS8qIG1pbm9yIHJlbGVhc2Ugb2YgdGFyZ2V0ZWQgaGFyZHdhcmUgKi8KLSNkZWZpbmUgWENIQUxfSFdfUkVMRUFTRV9OQU1FCQkiVDEwNTAuMSIJLyogZnVsbCByZWxlYXNlIG5hbWUgb2YgdGFyZ2V0ZWQgaGFyZHdhcmUgKi8KLSNkZWZpbmUgWFRIQUxfSFdfUkVMX1QxMDUwCTEKLSNkZWZpbmUgWFRIQUxfSFdfUkVMX1QxMDUwXzEJMQotI2RlZmluZSBYQ0hBTF9IV19DT05GSUdJRF9SRUxJQUJMRQkxCi0KLQotLyoKLSAqICBNaXNjZWxsYW5lb3VzIHNwZWNpYWwgcmVnaXN0ZXIgZmllbGRzOgotICovCi0KLQotLyogIERCUkVBS0MgKHNwZWNpYWwgcmVnaXN0ZXIgbnVtYmVyIDE2MCk6ICAqLwotI2RlZmluZSBYQ0hBTF9EQlJFQUtDX1ZBTElETUFTSwkweEMwMDAwMDNGCS8qIGJpdHMgb2YgREJSRUFLQyB0aGF0IGFyZSBkZWZpbmVkICovCi0vKiAgTUFTSyBmaWVsZDogICovCi0jZGVmaW5lIFhDSEFMX0RCUkVBS0NfTUFTS19CSVRTIAk2CQkvKiBudW1iZXIgb2YgYml0cyBpbiBNQVNLIGZpZWxkICovCi0jZGVmaW5lIFhDSEFMX0RCUkVBS0NfTUFTS19OVU0gIAk2NAkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KLSNkZWZpbmUgWENIQUxfREJSRUFLQ19NQVNLX1NISUZUCTAJCS8qIHBvc2l0aW9uIG9mIE1BU0sgYml0cyBpbiBEQlJFQUtDLCBzdGFydGluZyBmcm9tIGxzYml0ICovCi0jZGVmaW5lIFhDSEFMX0RCUkVBS0NfTUFTS19NQVNLIAkweDAwMDAwMDNGCS8qIG1hc2sgb2YgYml0cyBpbiBNQVNLIGZpZWxkIG9mIERCUkVBS0MgKi8KLS8qICBMT0FEQlJFQUsgZmllbGQ6ICAqLwotI2RlZmluZSBYQ0hBTF9EQlJFQUtDX0xPQURCUkVBS19CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBMT0FEQlJFQUsgZmllbGQgKi8KLSNkZWZpbmUgWENIQUxfREJSRUFLQ19MT0FEQlJFQUtfTlVNICAJMgkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KLSNkZWZpbmUgWENIQUxfREJSRUFLQ19MT0FEQlJFQUtfU0hJRlQJMzAJCS8qIHBvc2l0aW9uIG9mIExPQURCUkVBSyBiaXRzIGluIERCUkVBS0MsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KLSNkZWZpbmUgWENIQUxfREJSRUFLQ19MT0FEQlJFQUtfTUFTSyAJMHg0MDAwMDAwMAkvKiBtYXNrIG9mIGJpdHMgaW4gTE9BREJSRUFLIGZpZWxkIG9mIERCUkVBS0MgKi8KLS8qICBTVE9SRUJSRUFLIGZpZWxkOiAgKi8KLSNkZWZpbmUgWENIQUxfREJSRUFLQ19TVE9SRUJSRUFLX0JJVFMgCTEJCS8qIG51bWJlciBvZiBiaXRzIGluIFNUT1JFQlJFQUsgZmllbGQgKi8KLSNkZWZpbmUgWENIQUxfREJSRUFLQ19TVE9SRUJSRUFLX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCi0jZGVmaW5lIFhDSEFMX0RCUkVBS0NfU1RPUkVCUkVBS19TSElGVAkzMQkJLyogcG9zaXRpb24gb2YgU1RPUkVCUkVBSyBiaXRzIGluIERCUkVBS0MsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KLSNkZWZpbmUgWENIQUxfREJSRUFLQ19TVE9SRUJSRUFLX01BU0sgCTB4ODAwMDAwMDAJLyogbWFzayBvZiBiaXRzIGluIFNUT1JFQlJFQUsgZmllbGQgb2YgREJSRUFLQyAqLwotCi0vKiAgUFMgKHNwZWNpYWwgcmVnaXN0ZXIgbnVtYmVyIDIzMCk6ICAqLwotI2RlZmluZSBYQ0hBTF9QU19WQUxJRE1BU0sJMHgwMDA3MEZGRgkvKiBiaXRzIG9mIFBTIHRoYXQgYXJlIGRlZmluZWQgKi8KLS8qICBJTlRMRVZFTCBmaWVsZDogICovCi0jZGVmaW5lIFhDSEFMX1BTX0lOVExFVkVMX0JJVFMgCTQJCS8qIG51bWJlciBvZiBiaXRzIGluIElOVExFVkVMIGZpZWxkICovCi0jZGVmaW5lIFhDSEFMX1BTX0lOVExFVkVMX05VTSAgCTE2CQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLwotI2RlZmluZSBYQ0hBTF9QU19JTlRMRVZFTF9TSElGVAkwCQkvKiBwb3NpdGlvbiBvZiBJTlRMRVZFTCBiaXRzIGluIFBTLCBzdGFydGluZyBmcm9tIGxzYml0ICovCi0jZGVmaW5lIFhDSEFMX1BTX0lOVExFVkVMX01BU0sgCTB4MDAwMDAwMEYJLyogbWFzayBvZiBiaXRzIGluIElOVExFVkVMIGZpZWxkIG9mIFBTICovCi0vKiAgRVhDTSBmaWVsZDogICovCi0jZGVmaW5lIFhDSEFMX1BTX0VYQ01fQklUUyAJMQkJLyogbnVtYmVyIG9mIGJpdHMgaW4gRVhDTSBmaWVsZCAqLwotI2RlZmluZSBYQ0hBTF9QU19FWENNX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCi0jZGVmaW5lIFhDSEFMX1BTX0VYQ01fU0hJRlQJNAkJLyogcG9zaXRpb24gb2YgRVhDTSBiaXRzIGluIFBTLCBzdGFydGluZyBmcm9tIGxzYml0ICovCi0jZGVmaW5lIFhDSEFMX1BTX0VYQ01fTUFTSyAJMHgwMDAwMDAxMAkvKiBtYXNrIG9mIGJpdHMgaW4gRVhDTSBmaWVsZCBvZiBQUyAqLwotLyogIFBST0dTVEFDSyBmaWVsZDogICovCi0jZGVmaW5lIFhDSEFMX1BTX1BST0dTVEFDS19CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBQUk9HU1RBQ0sgZmllbGQgKi8KLSNkZWZpbmUgWENIQUxfUFNfUFJPR1NUQUNLX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCi0jZGVmaW5lIFhDSEFMX1BTX1BST0dTVEFDS19TSElGVAk1CQkvKiBwb3NpdGlvbiBvZiBQUk9HU1RBQ0sgYml0cyBpbiBQUywgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLwotI2RlZmluZSBYQ0hBTF9QU19QUk9HU1RBQ0tfTUFTSyAJMHgwMDAwMDAyMAkvKiBtYXNrIG9mIGJpdHMgaW4gUFJPR1NUQUNLIGZpZWxkIG9mIFBTICovCi0vKiAgUklORyBmaWVsZDogICovCi0jZGVmaW5lIFhDSEFMX1BTX1JJTkdfQklUUyAJMgkJLyogbnVtYmVyIG9mIGJpdHMgaW4gUklORyBmaWVsZCAqLwotI2RlZmluZSBYQ0hBTF9QU19SSU5HX05VTSAgCTQJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCi0jZGVmaW5lIFhDSEFMX1BTX1JJTkdfU0hJRlQJNgkJLyogcG9zaXRpb24gb2YgUklORyBiaXRzIGluIFBTLCBzdGFydGluZyBmcm9tIGxzYml0ICovCi0jZGVmaW5lIFhDSEFMX1BTX1JJTkdfTUFTSyAJMHgwMDAwMDBDMAkvKiBtYXNrIG9mIGJpdHMgaW4gUklORyBmaWVsZCBvZiBQUyAqLwotLyogIE9XQiBmaWVsZDogICovCi0jZGVmaW5lIFhDSEFMX1BTX09XQl9CSVRTIAk0CQkvKiBudW1iZXIgb2YgYml0cyBpbiBPV0IgZmllbGQgKi8KLSNkZWZpbmUgWENIQUxfUFNfT1dCX05VTSAgCTE2CQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLwotI2RlZmluZSBYQ0hBTF9QU19PV0JfU0hJRlQJOAkJLyogcG9zaXRpb24gb2YgT1dCIGJpdHMgaW4gUFMsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KLSNkZWZpbmUgWENIQUxfUFNfT1dCX01BU0sgCTB4MDAwMDBGMDAJLyogbWFzayBvZiBiaXRzIGluIE9XQiBmaWVsZCBvZiBQUyAqLwotLyogIENBTExJTkMgZmllbGQ6ICAqLwotI2RlZmluZSBYQ0hBTF9QU19DQUxMSU5DX0JJVFMgCTIJCS8qIG51bWJlciBvZiBiaXRzIGluIENBTExJTkMgZmllbGQgKi8KLSNkZWZpbmUgWENIQUxfUFNfQ0FMTElOQ19OVU0gIAk0CQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLwotI2RlZmluZSBYQ0hBTF9QU19DQUxMSU5DX1NISUZUCTE2CQkvKiBwb3NpdGlvbiBvZiBDQUxMSU5DIGJpdHMgaW4gUFMsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KLSNkZWZpbmUgWENIQUxfUFNfQ0FMTElOQ19NQVNLIAkweDAwMDMwMDAwCS8qIG1hc2sgb2YgYml0cyBpbiBDQUxMSU5DIGZpZWxkIG9mIFBTICovCi0vKiAgV09FIGZpZWxkOiAgKi8KLSNkZWZpbmUgWENIQUxfUFNfV09FX0JJVFMgCTEJCS8qIG51bWJlciBvZiBiaXRzIGluIFdPRSBmaWVsZCAqLwotI2RlZmluZSBYQ0hBTF9QU19XT0VfTlVNICAJMgkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KLSNkZWZpbmUgWENIQUxfUFNfV09FX1NISUZUCTE4CQkvKiBwb3NpdGlvbiBvZiBXT0UgYml0cyBpbiBQUywgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLwotI2RlZmluZSBYQ0hBTF9QU19XT0VfTUFTSyAJMHgwMDA0MDAwMAkvKiBtYXNrIG9mIGJpdHMgaW4gV09FIGZpZWxkIG9mIFBTICovCi0KLS8qICBFWENDQVVTRSAoc3BlY2lhbCByZWdpc3RlciBudW1iZXIgMjMyKTogICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX1ZBTElETUFTSwkweDAwMDAwMDNGCS8qIGJpdHMgb2YgRVhDQ0FVU0UgdGhhdCBhcmUgZGVmaW5lZCAqLwotLyogIEVYQ0NBVVNFIGZpZWxkOiAgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfQklUUyAJCTYJCS8qIG51bWJlciBvZiBiaXRzIGluIEVYQ0NBVVNFIHJlZ2lzdGVyICovCi0jZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX05VTSAgCQk2NAkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfU0hJRlQJCTAJCS8qIHBvc2l0aW9uIG9mIEVYQ0NBVVNFIGJpdHMgaW4gcmVnaXN0ZXIsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KLSNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfTUFTSyAJCTB4MDAwMDAwM0YJLyogbWFzayBvZiBiaXRzIGluIEVYQ0NBVVNFIHJlZ2lzdGVyICovCi0KLS8qICBERUJVR0NBVVNFIChzcGVjaWFsIHJlZ2lzdGVyIG51bWJlciAyMzMpOiAgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9WQUxJRE1BU0sJMHgwMDAwMDAzRgkvKiBiaXRzIG9mIERFQlVHQ0FVU0UgdGhhdCBhcmUgZGVmaW5lZCAqLwotLyogIElDT1VOVCBmaWVsZDogICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfSUNPVU5UX0JJVFMgCTEJCS8qIG51bWJlciBvZiBiaXRzIGluIElDT1VOVCBmaWVsZCAqLwotI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0lDT1VOVF9OVU0gIAkyCQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLwotI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0lDT1VOVF9TSElGVAkwCQkvKiBwb3NpdGlvbiBvZiBJQ09VTlQgYml0cyBpbiBERUJVR0NBVVNFLCBzdGFydGluZyBmcm9tIGxzYml0ICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfSUNPVU5UX01BU0sgCTB4MDAwMDAwMDEJLyogbWFzayBvZiBiaXRzIGluIElDT1VOVCBmaWVsZCBvZiBERUJVR0NBVVNFICovCi0vKiAgSUJSRUFLIGZpZWxkOiAgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9JQlJFQUtfQklUUyAJMQkJLyogbnVtYmVyIG9mIGJpdHMgaW4gSUJSRUFLIGZpZWxkICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfSUJSRUFLX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfSUJSRUFLX1NISUZUCTEJCS8qIHBvc2l0aW9uIG9mIElCUkVBSyBiaXRzIGluIERFQlVHQ0FVU0UsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9JQlJFQUtfTUFTSyAJMHgwMDAwMDAwMgkvKiBtYXNrIG9mIGJpdHMgaW4gSUJSRUFLIGZpZWxkIG9mIERFQlVHQ0FVU0UgKi8KLS8qICBEQlJFQUsgZmllbGQ6ICAqLwotI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0RCUkVBS19CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBEQlJFQUsgZmllbGQgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9EQlJFQUtfTlVNICAJMgkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9EQlJFQUtfU0hJRlQJMgkJLyogcG9zaXRpb24gb2YgREJSRUFLIGJpdHMgaW4gREVCVUdDQVVTRSwgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLwotI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0RCUkVBS19NQVNLIAkweDAwMDAwMDA0CS8qIG1hc2sgb2YgYml0cyBpbiBEQlJFQUsgZmllbGQgb2YgREVCVUdDQVVTRSAqLwotLyogIEJSRUFLIGZpZWxkOiAgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9CUkVBS19CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBCUkVBSyBmaWVsZCAqLwotI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0JSRUFLX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfQlJFQUtfU0hJRlQJMwkJLyogcG9zaXRpb24gb2YgQlJFQUsgYml0cyBpbiBERUJVR0NBVVNFLCBzdGFydGluZyBmcm9tIGxzYml0ICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfQlJFQUtfTUFTSyAJMHgwMDAwMDAwOAkvKiBtYXNrIG9mIGJpdHMgaW4gQlJFQUsgZmllbGQgb2YgREVCVUdDQVVTRSAqLwotLyogIEJSRUFLTiBmaWVsZDogICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfQlJFQUtOX0JJVFMgCTEJCS8qIG51bWJlciBvZiBiaXRzIGluIEJSRUFLTiBmaWVsZCAqLwotI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0JSRUFLTl9OVU0gIAkyCQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLwotI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0JSRUFLTl9TSElGVAk0CQkvKiBwb3NpdGlvbiBvZiBCUkVBS04gYml0cyBpbiBERUJVR0NBVVNFLCBzdGFydGluZyBmcm9tIGxzYml0ICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfQlJFQUtOX01BU0sgCTB4MDAwMDAwMTAJLyogbWFzayBvZiBiaXRzIGluIEJSRUFLTiBmaWVsZCBvZiBERUJVR0NBVVNFICovCi0vKiAgREVCVUdJTlQgZmllbGQ6ICAqLwotI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0RFQlVHSU5UX0JJVFMgCTEJCS8qIG51bWJlciBvZiBiaXRzIGluIERFQlVHSU5UIGZpZWxkICovCi0jZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfREVCVUdJTlRfTlVNICAJMgkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9ERUJVR0lOVF9TSElGVAk1CQkvKiBwb3NpdGlvbiBvZiBERUJVR0lOVCBiaXRzIGluIERFQlVHQ0FVU0UsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KLSNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9ERUJVR0lOVF9NQVNLIAkweDAwMDAwMDIwCS8qIG1hc2sgb2YgYml0cyBpbiBERUJVR0lOVCBmaWVsZCBvZiBERUJVR0NBVVNFICovCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlJU0EKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgWENIQUxfSEFWRV9ERU5TSVRZCQkxCS8qIDEgaWYgZGVuc2l0eSBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9MT09QUwkJMQkvKiAxIGlmIHplcm8tb3ZlcmhlYWQgbG9vcHMgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0vKiAgTWlzYyBpbnN0cnVjdGlvbnM6ICAqLwotI2RlZmluZSBYQ0hBTF9IQVZFX05TQQkJCTAJLyogMSBpZiBOU0EvTlNBVSBpbnN0cnVjdGlvbnMgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0hBVkVfTUlOTUFYCQkwCS8qIDEgaWYgTUlOL01BWCBpbnN0cnVjdGlvbnMgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0hBVkVfU0VYVAkJCTAJLyogMSBpZiBzaWduLWV4dGVuZCBpbnN0cnVjdGlvbiBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9DTEFNUFMJCTAJLyogMSBpZiBDTEFNUFMgaW5zdHJ1Y3Rpb24gb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0hBVkVfTUFDMTYJCTAJLyogMSBpZiBNQUMxNiBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9NVUwxNgkJMAkvKiAxIGlmIDE2LWJpdCBpbnRlZ2VyIG11bHRpcGx5IG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotLyojZGVmaW5lIFhDSEFMX0hBVkVfUE9QQwkJMCovCS8qIDEgaWYgQ1JDIGluc3RydWN0aW9uIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotLyojZGVmaW5lIFhDSEFMX0hBVkVfQ1JDCQkwKi8JLyogMSBpZiBQT1BDIGluc3RydWN0aW9uIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotCi0jZGVmaW5lIFhDSEFMX0hBVkVfU1BFQ1VMQVRJT04JCTAJLyogMSBpZiBzcGVjdWxhdGlvbiBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KLS8qI2RlZmluZSBYQ0hBTF9IQVZFX01QX1NZTkMJCTAqLwkvKiAxIGlmIG11bHRpcHJvY2Vzc29yIHN5bmMuIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9IQVZFX1BSSUQJCQkwCS8qIDEgaWYgcHJvY2Vzc29yIElEIHJlZ2lzdGVyIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0KLSNkZWZpbmUgWENIQUxfTlVNX01JU0NfUkVHUwkJMgkvKiBudW1iZXIgb2YgbWlzY2VsbGFuZW91cyByZWdpc3RlcnMgKDAuLjQpICovCi0KLS8qICBUaGVzZSByZWxhdGUgYSBiaXQgbW9yZSB0byBUSUU6ICAqLwotI2RlZmluZSBYQ0hBTF9IQVZFX0JPT0xFQU5TCQkwCS8qIDEgaWYgYm9vbGVhbnMgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0jZGVmaW5lIFhDSEFMX0hBVkVfTVVMMzIJCTAJLyogMSBpZiAzMi1iaXQgaW50ZWdlciBtdWx0aXBseSBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9NVUwzMl9ISUdICQkwCS8qIDEgaWYgTVVMMzIgb3B0aW9uIGluY2x1ZGVzIE1VTFVIIGFuZCBNVUxTSCwgMCBvdGhlcndpc2UgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9GUAkJCTAJLyogMSBpZiBmbG9hdGluZyBwb2ludCBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlERVJJVkVECi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgWENIQUxfSEFWRV9CRQotI2RlZmluZSBYQ0hBTF9JTlNUX0lMTE4JCQkweEQ2MEYJCS8qIDItYnl0ZSBpbGxlZ2FsIGluc3RydWN0aW9uLCBtc2ItZmlyc3QgKi8KLSNkZWZpbmUgWENIQUxfSU5TVF9JTExOX0JZVEUwCQkweEQ2CQkvKiAyLWJ5dGUgaWxsZWdhbCBpbnN0cnVjdGlvbiwgMXN0IGJ5dGUgKi8KLSNkZWZpbmUgWENIQUxfSU5TVF9JTExOX0JZVEUxCQkweDBGCQkvKiAyLWJ5dGUgaWxsZWdhbCBpbnN0cnVjdGlvbiwgMm5kIGJ5dGUgKi8KLSNlbHNlCi0jZGVmaW5lIFhDSEFMX0lOU1RfSUxMTgkJCTB4RjA2RAkJLyogMi1ieXRlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24sIGxzYi1maXJzdCAqLwotI2RlZmluZSBYQ0hBTF9JTlNUX0lMTE5fQllURTAJCTB4NkQJCS8qIDItYnl0ZSBpbGxlZ2FsIGluc3RydWN0aW9uLCAxc3QgYnl0ZSAqLwotI2RlZmluZSBYQ0hBTF9JTlNUX0lMTE5fQllURTEJCTB4RjAJCS8qIDItYnl0ZSBpbGxlZ2FsIGluc3RydWN0aW9uLCAybmQgYnl0ZSAqLwotI2VuZGlmCi0vKiAgQmVsb25ncyBpbiB4dGVuc2EvaGFsLmg6ICAqLwotI2RlZmluZSBYVEhBTF9JTlNUX0lMTAkJCTB4MDAwMDAwCS8qIDMtYnl0ZSBpbGxlZ2FsIGluc3RydWN0aW9uICovCi0KLQotLyoKLSAqICBCZWNhdXNlIGluZm9ybWF0aW9uIGFzIHRvIGV4YWN0bHkgd2hpY2ggaGFyZHdhcmUgcmVsZWFzZSBpcyB0YXJnZXRlZAotICogIGJ5IGEgZ2l2ZW4gc29mdHdhcmUgYnVpbGQgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUsIGNvbXBpbGUtdGltZSBIQUwKLSAqICBIYXJkd2FyZS1SZWxlYXNlICJfQVQiIG1hY3JvcyBhcmUgZnV6enkgKHJldHVybiAwLCAxLCBvciBYQ0hBTF9NQVlCRSk6Ci0gKi8KLSNpZm5kZWYgWENIQUxfSFdfUkVMRUFTRV9NQUpPUgotIyBkZWZpbmUgWENIQUxfSFdfQ09ORklHSURfUkVMSUFCTEUJMAotI2VuZGlmCi0jaWYgWENIQUxfSFdfQ09ORklHSURfUkVMSUFCTEUKLSMgZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfQVRfT1JfQkVMT1cobWFqb3IsbWlub3IpCShYVEhBTF9SRUxfTEUoIFhDSEFMX0hXX1JFTEVBU0VfTUFKT1IsWENIQUxfSFdfUkVMRUFTRV9NSU5PUiwgbWFqb3IsbWlub3IgKSA/IDEgOiAwKQotIyBkZWZpbmUgWENIQUxfSFdfUkVMRUFTRV9BVF9PUl9BQk9WRShtYWpvcixtaW5vcikJKFhUSEFMX1JFTF9HRSggWENIQUxfSFdfUkVMRUFTRV9NQUpPUixYQ0hBTF9IV19SRUxFQVNFX01JTk9SLCBtYWpvcixtaW5vciApID8gMSA6IDApCi0jIGRlZmluZSBYQ0hBTF9IV19SRUxFQVNFX0FUKG1ham9yLG1pbm9yKQkJKFhUSEFMX1JFTF9FUSggWENIQUxfSFdfUkVMRUFTRV9NQUpPUixYQ0hBTF9IV19SRUxFQVNFX01JTk9SLCBtYWpvcixtaW5vciApID8gMSA6IDApCi0jIGRlZmluZSBYQ0hBTF9IV19SRUxFQVNFX01BSk9SX0FUKG1ham9yKQkJKChYQ0hBTF9IV19SRUxFQVNFX01BSk9SID09IChtYWpvcikpID8gMSA6IDApCi0jZWxzZQotIyBkZWZpbmUgWENIQUxfSFdfUkVMRUFTRV9BVF9PUl9CRUxPVyhtYWpvcixtaW5vcikJKCAoKG1ham9yKSA8IDEwNDAgJiYgWENIQUxfSEFWRV9YRUEyKSA/IDAgXAotCQkJCQkJCTogKChtYWpvcikgPiAxMDUwICYmIFhDSEFMX0hBVkVfWEVBMSkgPyAxIFwKLQkJCQkJCQk6IFhUSEFMX01BWUJFICkKLSMgZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfQVRfT1JfQUJPVkUobWFqb3IsbWlub3IpCSggKChtYWpvcikgPj0gMjAwMCAmJiBYQ0hBTF9IQVZFX1hFQTEpID8gMCBcCi0JCQkJCQkJOiAoWFRIQUxfUkVMX0xFKG1ham9yLG1pbm9yLCAxMDQwLDApICYmIFhDSEFMX0hBVkVfWEVBMikgPyAxIFwKLQkJCQkJCQk6IFhUSEFMX01BWUJFICkKLSMgZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfQVQobWFqb3IsbWlub3IpCQkoICgoKG1ham9yKSA8IDEwNDAgJiYgWENIQUxfSEFWRV9YRUEyKSB8fCBcCi0JCQkJCQkJICAgKChtYWpvcikgPj0gMjAwMCAmJiBYQ0hBTF9IQVZFX1hFQTEpKSA/IDAgOiBYVEhBTF9NQVlCRSkKLSMgZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfTUFKT1JfQVQobWFqb3IpCQlYQ0hBTF9IV19SRUxFQVNFX0FUKG1ham9yLDApCi0jZW5kaWYKLQotLyoKLSAqICBTcGVjaWZpYyBlcnJhdGE6Ci0gKi8KLQotLyoKLSAqICBFcnJhdHVtIFQxMDIwLkgxMywgVDEwMzAuSDcsIFQxMDQwLkgxMCwgVDEwNTAuSDQgKGZpeGVkIGluIFQxMDQwLjMgYW5kIFQxMDUwLjE7Ci0gKiAgcmVsZXZhbnQgb25seSBpbiBYRUExLCBrZXJuZWwtdmVjdG9yIG1vZGUsIGxldmVsLW9uZSBpbnRlcnJ1cHRzIGFuZCBvdmVyZmxvd3MgZW5hYmxlZCk6Ci0gKi8KLSNkZWZpbmUgWENIQUxfTUFZSEFWRV9FUlJBVFVNX1hFQTFLV0lOCShYQ0hBTF9IQVZFX1hFQTEgJiYgXAotCQkJCQkgKFhDSEFMX0hXX1JFTEVBU0VfQVRfT1JfQkVMT1coMTA0MCwyKSAhPSAwIFwKLQkJCQkJICB8fCBYQ0hBTF9IV19SRUxFQVNFX0FUKDEwNTAsMCkpKQotCi0KLQotI2VuZGlmIC8qWFRFTlNBX0NPTkZJR19DT1JFX0gqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9kZWZzLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9kZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzU4YjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIERlZmluaXRpb25zIGZvciBYdGVuc2EgaW5zdHJ1Y3Rpb25zLCB0eXBlcywgYW5kIHByb3Rvcy4gKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUZW5zaWxpY2EsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LAotICogVVNBLgotICovCi0KLS8qIERvIG5vdCBtb2RpZnkuIFRoaXMgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuKi8KLQotI2lmbmRlZiBfWFRFTlNBX0JBU0VfSEVBREVSCi0jZGVmaW5lIF9YVEVOU0FfQkFTRV9IRUFERVIKLQotI2lmZGVmIF9fWFRFTlNBX18KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1hDQ19fKQotCi0jZGVmaW5lIEw4VUlfQVNNKGFyciwgYXJzLCBpbW0pIHsgXAotICBfX2FzbV9fIHZvbGF0aWxlKCJsOHVpICUwLCAlMSwgJTIiIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJzKSAsICJpIiAoaW1tKSk7IFwKLX0KLQotI2RlZmluZSBYVF9MOFVJKGFycywgaW1tKSBcCi0oeyBcCi0gIHVuc2lnbmVkIGNoYXIgX2FycjsgXAotICBjb25zdCB1bnNpZ25lZCBjaGFyICpfYXJzID0gYXJzOyBcCi0gIEw4VUlfQVNNKF9hcnIsIF9hcnMsIGltbSk7IFwKLSAgX2FycjsgXAotfSkKLQotI2RlZmluZSBMMTZVSV9BU00oYXJyLCBhcnMsIGltbSkgeyBcCi0gIF9fYXNtX18gdm9sYXRpbGUoImwxNnVpICUwLCAlMSwgJTIiIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJzKSAsICJpIiAoaW1tKSk7IFwKLX0KLQotI2RlZmluZSBYVF9MMTZVSShhcnMsIGltbSkgXAotKHsgXAotICB1bnNpZ25lZCBzaG9ydCBfYXJyOyBcCi0gIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpfYXJzID0gYXJzOyBcCi0gIEwxNlVJX0FTTShfYXJyLCBfYXJzLCBpbW0pOyBcCi0gIF9hcnI7IFwKLX0pCi0KLSNkZWZpbmUgTDE2U0lfQVNNKGFyciwgYXJzLCBpbW0pIHtcCi0gIF9fYXNtX18gdm9sYXRpbGUoImwxNnNpICUwLCAlMSwgJTIiIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJzKSAsICJpIiAoaW1tKSk7IFwKLX0KLQotI2RlZmluZSBYVF9MMTZTSShhcnMsIGltbSkgXAotKHsgXAotICBzaWduZWQgc2hvcnQgX2FycjsgXAotICBjb25zdCBzaWduZWQgc2hvcnQgKl9hcnMgPSBhcnM7IFwKLSAgTDE2U0lfQVNNKF9hcnIsIF9hcnMsIGltbSk7IFwKLSAgX2FycjsgXAotfSkKLQotI2RlZmluZSBMMzJJX0FTTShhcnIsIGFycywgaW1tKSB7IFwKLSAgX19hc21fXyB2b2xhdGlsZSgibDMyaSAlMCwgJTEsICUyIiA6ICI9YSIgKGFycikgOiAiYSIgKGFycykgLCAiaSIgKGltbSkpOyBcCi19Ci0KLSNkZWZpbmUgWFRfTDMySShhcnMsIGltbSkgXAotKHsgXAotICB1bnNpZ25lZCBfYXJyOyBcCi0gIGNvbnN0IHVuc2lnbmVkICpfYXJzID0gYXJzOyBcCi0gIEwzMklfQVNNKF9hcnIsIF9hcnMsIGltbSk7IFwKLSAgX2FycjsgXAotfSkKLQotI2RlZmluZSBTOElfQVNNKGFyciwgYXJzLCBpbW0pIHtcCi0gIF9fYXNtX18gdm9sYXRpbGUoInM4aSAlMCwgJTEsICUyIiA6IDogImEiIChhcnIpLCAiYSIgKGFycykgLCAiaSIgKGltbSkgOiAibWVtb3J5IiApOyBcCi19Ci0KLSNkZWZpbmUgWFRfUzhJKGFyciwgYXJzLCBpbW0pIFwKLSh7IFwKLSAgc2lnbmVkIGNoYXIgX2FyciA9IGFycjsgXAotICBjb25zdCBzaWduZWQgY2hhciAqX2FycyA9IGFyczsgXAotICBTOElfQVNNKF9hcnIsIF9hcnMsIGltbSk7IFwKLX0pCi0KLSNkZWZpbmUgUzE2SV9BU00oYXJyLCBhcnMsIGltbSkge1wKLSAgX19hc21fXyB2b2xhdGlsZSgiczE2aSAlMCwgJTEsICUyIiA6IDogImEiIChhcnIpLCAiYSIgKGFycykgLCAiaSIgKGltbSkgOiAibWVtb3J5IiApOyBcCi19Ci0KLSNkZWZpbmUgWFRfUzE2SShhcnIsIGFycywgaW1tKSBcCi0oeyBcCi0gIHNpZ25lZCBzaG9ydCBfYXJyID0gYXJyOyBcCi0gIGNvbnN0IHNpZ25lZCBzaG9ydCAqX2FycyA9IGFyczsgXAotICBTMTZJX0FTTShfYXJyLCBfYXJzLCBpbW0pOyBcCi19KQotCi0jZGVmaW5lIFMzMklfQVNNKGFyciwgYXJzLCBpbW0pIHsgXAotICBfX2FzbV9fIHZvbGF0aWxlKCJzMzJpICUwLCAlMSwgJTIiIDogOiAiYSIgKGFyciksICJhIiAoYXJzKSAsICJpIiAoaW1tKSA6ICJtZW1vcnkiICk7IFwKLX0KLQotI2RlZmluZSBYVF9TMzJJKGFyciwgYXJzLCBpbW0pIFwKLSh7IFwKLSAgc2lnbmVkIGludCBfYXJyID0gYXJyOyBcCi0gIGNvbnN0IHNpZ25lZCBpbnQgKl9hcnMgPSBhcnM7IFwKLSAgUzMySV9BU00oX2FyciwgX2FycywgaW1tKTsgXAotfSkKLQotI2RlZmluZSBBRERJX0FTTShhcnQsIGFycywgaW1tKSB7XAotICAgX19hc21fXyAoImFkZGkgJTAsICUxLCAlMiIgOiAiPWEiIChhcnQpIDogImEiIChhcnMpLCAiaSIgKGltbSkpOyBcCi19Ci0KLSNkZWZpbmUgWFRfQURESShhcnMsIGltbSkgXAotKHsgXAotICAgdW5zaWduZWQgX2FydDsgXAotICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAotICAgQURESV9BU00oX2FydCwgX2FycywgaW1tKTsgXAotICAgX2FydDsgXAotfSkKLQotI2RlZmluZSBBQlNfQVNNKGFyciwgYXJ0KSB7XAotICAgX19hc21fXyAoImFicyAlMCwgJTEiIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJ0KSk7IFwKLX0KLQotI2RlZmluZSBYVF9BQlMoYXJ0KSBcCi0oeyBcCi0gICB1bnNpZ25lZCBfYXJyOyBcCi0gICBzaWduZWQgX2FydCA9IGFydDsgXAotICAgQUJTX0FTTShfYXJyLCBfYXJ0KTsgXAotICAgX2FycjsgXAotfSkKLQotLyogTm90ZTogSW4gdGhlIGZvbGxvd2luZyBtYWNyb3MgdGhhdCByZWZlcmVuY2UgU0FSLCB0aGUgbWFnaWMgInN0YXRlIgotICAgcmVnaXN0ZXIgaXMgdXNlZCB0byBjYXB0dXJlIHRoZSBkZXBlbmRlbmN5IG9uIFNBUi4gIFRoaXMgaXMgYmVjYXVzZQotICAgU0FSIGlzIGEgNS1iaXQgcmVnaXN0ZXIgYW5kIHRodXMgdGhlcmUgYXJlIG5vIEMgdHlwZXMgdGhhdCBjYW4gYmUKLSAgIHVzZWQgdG8gcmVwcmVzZW50IGl0LiAgSXQgZG9lc24ndCBhcHBlYXIgdGhhdCB0aGUgU0FSIHJlZ2lzdGVyIGlzCi0gICBldmVuIHJlbGV2YW50IHRvIEdDQywgYnV0IGl0IGlzIG1hcmtlZCBhcyAiY2xvYmJlcmVkIiBqdXN0IGluCi0gICBjYXNlLiAgKi8KLQotI2RlZmluZSBTUkNfQVNNKGFyciwgYXJzLCBhcnQpIHtcCi0gICByZWdpc3RlciBpbnQgX3h0X3NhciBfX2FzbV9fICgic3RhdGUiKTsgXAotICAgX19hc21fXyAoInNyYyAlMCwgJTEsICUyIiBcCi0JICAgIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJzKSwgImEiIChhcnQpLCAidCIgKF94dF9zYXIpKTsgXAotfQotCi0jZGVmaW5lIFhUX1NSQyhhcnMsIGFydCkgXAotKHsgXAotICAgdW5zaWduZWQgX2FycjsgXAotICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAotICAgdW5zaWduZWQgX2FydCA9IGFydDsgXAotICAgU1JDX0FTTShfYXJyLCBfYXJzLCBfYXJ0KTsgXAotICAgX2FycjsgXAotfSkKLQotI2RlZmluZSBTU1JfQVNNKGFycykge1wKLSAgIHJlZ2lzdGVyIGludCBfeHRfc2FyIF9fYXNtX18gKCJzdGF0ZSIpOyBcCi0gICBfX2FzbV9fICgic3NyICUxIiA6ICI9dCIgKF94dF9zYXIpIDogImEiIChhcnMpIDogInNhciIpOyBcCi19Ci0KLSNkZWZpbmUgWFRfU1NSKGFycykgXAotKHsgXAotICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAotICAgU1NSX0FTTShfYXJzKTsgXAotfSkKLQotI2RlZmluZSBTU0xfQVNNKGFycykge1wKLSAgIHJlZ2lzdGVyIGludCBfeHRfc2FyIF9fYXNtX18gKCJzdGF0ZSIpOyBcCi0gICBfX2FzbV9fICgic3NsICUxIiA6ICI9dCIgKF94dF9zYXIpIDogImEiIChhcnMpIDogInNhciIpOyBcCi19Ci0KLSNkZWZpbmUgWFRfU1NMKGFycykgXAotKHsgXAotICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAotICAgU1NMX0FTTShfYXJzKTsgXAotfSkKLQotI2RlZmluZSBTU0E4Ql9BU00oYXJzKSB7XAotICAgcmVnaXN0ZXIgaW50IF94dF9zYXIgX19hc21fXyAoInN0YXRlIik7IFwKLSAgIF9fYXNtX18gKCJzc2E4YiAlMSIgOiAiPXQiIChfeHRfc2FyKSA6ICJhIiAoYXJzKSA6ICJzYXIiKTsgXAotfQotCi0jZGVmaW5lIFhUX1NTQThCKGFycykgXAotKHsgXAotICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAotICAgU1NBOEJfQVNNKF9hcnMpOyBcCi19KQotCi0jZGVmaW5lIFNTQThMX0FTTShhcnMpIHtcCi0gICByZWdpc3RlciBpbnQgX3h0X3NhciBfX2FzbV9fICgic3RhdGUiKTsgXAotICAgX19hc21fXyAoInNzYThsICUxIiA6ICI9dCIgKF94dF9zYXIpIDogImEiIChhcnMpIDogInNhciIpOyBcCi19Ci0KLSNkZWZpbmUgWFRfU1NBOEwoYXJzKSBcCi0oeyBcCi0gICB1bnNpZ25lZCBfYXJzID0gYXJzOyBcCi0gICBTU0E4TF9BU00oX2Fycyk7IFwKLX0pCi0KLSNkZWZpbmUgU1NBSV9BU00oaW1tKSB7XAotICAgcmVnaXN0ZXIgaW50IF94dF9zYXIgX19hc21fXyAoInN0YXRlIik7IFwKLSAgIF9fYXNtX18gKCJzc2FpICUxIiA6ICI9dCIgKF94dF9zYXIpIDogImkiIChpbW0pIDogInNhciIpOyBcCi19Ci0KLSNkZWZpbmUgWFRfU1NBSShpbW0pIFwKLSh7IFwKLSAgIFNTQUlfQVNNKGltbSk7IFwKLX0pCi0KLQotCi0KLQotCi0KLQotI2VuZGlmIC8qIF9fR05VQ19fICYmICFfX1hDQ19fICovCi0KLSNpZmRlZiBfX1hDQ19fCi0KLS8qIENvcmUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgKi8KLWV4dGVybiB1bnNpZ25lZCBjaGFyIF9USUVfTDhVSShjb25zdCB1bnNpZ25lZCBjaGFyICogYXJzLCBpbW1lZGlhdGUgaW1tKTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBfVElFX0wxNlVJKGNvbnN0IHVuc2lnbmVkIHNob3J0ICogYXJzLCBpbW1lZGlhdGUgaW1tKTsKLWV4dGVybiBzaWduZWQgc2hvcnQgX1RJRV9MMTZTSShjb25zdCBzaWduZWQgc2hvcnQgKiBhcnMsIGltbWVkaWF0ZSBpbW0pOwotZXh0ZXJuIHVuc2lnbmVkIF9USUVfTDMySShjb25zdCB1bnNpZ25lZCAqIGFycywgaW1tZWRpYXRlIGltbSk7Ci1leHRlcm4gdm9pZCBfVElFX1M4SSh1bnNpZ25lZCBjaGFyIGFyciwgdW5zaWduZWQgY2hhciAqIGFycywgaW1tZWRpYXRlIGltbSk7Ci1leHRlcm4gdm9pZCBfVElFX1MxNkkodW5zaWduZWQgc2hvcnQgYXJyLCB1bnNpZ25lZCBzaG9ydCAqIGFycywgaW1tZWRpYXRlIGltbSk7Ci1leHRlcm4gdm9pZCBfVElFX1MzMkkodW5zaWduZWQgYXJyLCB1bnNpZ25lZCAqIGFycywgaW1tZWRpYXRlIGltbSk7Ci0KLSNkZWZpbmUgWFRfTDhVSSAgX1RJRV9MOFVJCi0jZGVmaW5lIFhUX0wxNlVJIF9USUVfTDE2VUkKLSNkZWZpbmUgWFRfTDE2U0kgX1RJRV9MMTZTSQotI2RlZmluZSBYVF9MMzJJICBfVElFX0wzMkkKLSNkZWZpbmUgWFRfUzhJICAgX1RJRV9TOEkKLSNkZWZpbmUgWFRfUzE2SSAgX1RJRV9TMTZJCi0jZGVmaW5lIFhUX1MzMkkgIF9USUVfUzMySQotCi0vKiBBZGQtaW1tZWRpYXRlIGluc3RydWN0aW9uICovCi1leHRlcm4gdW5zaWduZWQgX1RJRV9BRERJKHVuc2lnbmVkIGFycywgaW1tZWRpYXRlIGltbSk7Ci0jZGVmaW5lIFhUX0FEREkgIF9USUVfQURESQotCi0vKiBBYnNvbHV0ZSB2YWx1ZSBpbnN0cnVjdGlvbiAqLwotZXh0ZXJuIHVuc2lnbmVkIF9USUVfQUJTKGludCBhcnQpOwotI2RlZmluZSBYVF9BQlMgX1RJRV9BQlMKLQotLyogZnVubmVsIHNoaWZ0IGluc3RydWN0aW9ucyAqLwotZXh0ZXJuIHVuc2lnbmVkIF9USUVfU1JDKHVuc2lnbmVkIGFycywgdW5zaWduZWQgYXJ0KTsKLSNkZWZpbmUgWFRfU1JDIF9USUVfU1JDCi1leHRlcm4gdm9pZCBfVElFX1NTUih1bnNpZ25lZCBhcnMpOwotI2RlZmluZSBYVF9TU1IgX1RJRV9TU1IKLWV4dGVybiB2b2lkIF9USUVfU1NMKHVuc2lnbmVkIGFycyk7Ci0jZGVmaW5lIFhUX1NTTCBfVElFX1NTTAotZXh0ZXJuIHZvaWQgX1RJRV9TU0E4Qih1bnNpZ25lZCBhcnMpOwotI2RlZmluZSBYVF9TU0E4QiBfVElFX1NTQThCCi1leHRlcm4gdm9pZCBfVElFX1NTQThMKHVuc2lnbmVkIGFycyk7Ci0jZGVmaW5lIFhUX1NTQThMIF9USUVfU1NBOEwKLWV4dGVybiB2b2lkIF9USUVfU1NBSShpbW1lZGlhdGUgaW1tKTsKLSNkZWZpbmUgWFRfU1NBSSBfVElFX1NTQUkKLQotCi0jZW5kaWYgLyogX19YQ0NfXyAqLwotCi0jZW5kaWYgLyogX19YVEVOU0FfXyAqLwotI2VuZGlmIC8qICFfWFRFTlNBX0JBU0VfSEVBREVSICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9zcGVjcmVnLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9zcGVjcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNDEwNmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvc3BlY3JlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIFh0ZW5zYSBTcGVjaWFsIFJlZ2lzdGVyIHN5bWJvbGljIG5hbWVzCi0gKi8KLQotLyogJElkOiBzcGVjcmVnLmgsdiAxLjIgMjAwMy8wMy8wNyAxOToxNToxOCBqb2V0YXlsb3IgRXhwICQgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUZW5zaWxpY2EsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LAotICogVVNBLgotICovCi0KLSNpZm5kZWYgWFRFTlNBX1NQRUNSRUdfSAotI2RlZmluZSBYVEVOU0FfU1BFQ1JFR19ICi0KLS8qICBJbmNsdWRlIHRoZXNlIHNwZWNpYWwgcmVnaXN0ZXIgYml0ZmllbGQgZGVmaW5pdGlvbnMsIGZvciBoaXN0b3JpY2FsIHJlYXNvbnM6ICAqLwotI2luY2x1ZGUgPHh0ZW5zYS9jb3JlYml0cy5oPgotCi0KLS8qICBTcGVjaWFsIHJlZ2lzdGVyczogICovCi0jZGVmaW5lIExCRUcJCTAKLSNkZWZpbmUgTEVORAkJMQotI2RlZmluZSBMQ09VTlQJCTIKLSNkZWZpbmUgU0FSCQkzCi0jZGVmaW5lIFdJTkRPV0JBU0UJNzIKLSNkZWZpbmUgV0lORE9XU1RBUlQJNzMKLSNkZWZpbmUgUFRFVkFERFIJODMKLSNkZWZpbmUgUkFTSUQJCTkwCi0jZGVmaW5lIElUTEJDRkcJCTkxCi0jZGVmaW5lIERUTEJDRkcJCTkyCi0jZGVmaW5lIElCUkVBS0VOQUJMRQk5NgotI2RlZmluZSBERFIJCTEwNAotI2RlZmluZSBJQlJFQUtBXzAJMTI4Ci0jZGVmaW5lIElCUkVBS0FfMQkxMjkKLSNkZWZpbmUgREJSRUFLQV8wCTE0NAotI2RlZmluZSBEQlJFQUtBXzEJMTQ1Ci0jZGVmaW5lIERCUkVBS0NfMAkxNjAKLSNkZWZpbmUgREJSRUFLQ18xCTE2MQotI2RlZmluZSBFUENfMQkJMTc3Ci0jZGVmaW5lIEVQQ18yCQkxNzgKLSNkZWZpbmUgRVBDXzMJCTE3OQotI2RlZmluZSBFUENfNAkJMTgwCi0jZGVmaW5lIERFUEMJCTE5MgotI2RlZmluZSBFUFNfMgkJMTk0Ci0jZGVmaW5lIEVQU18zCQkxOTUKLSNkZWZpbmUgRVBTXzQJCTE5NgotI2RlZmluZSBFWENTQVZFXzEJMjA5Ci0jZGVmaW5lIEVYQ1NBVkVfMgkyMTAKLSNkZWZpbmUgRVhDU0FWRV8zCTIxMQotI2RlZmluZSBFWENTQVZFXzQJMjEyCi0jZGVmaW5lIElOVEVSUlVQVAkyMjYKLSNkZWZpbmUgSU5URU5BQkxFCTIyOAotI2RlZmluZSBQUwkJMjMwCi0jZGVmaW5lIEVYQ0NBVVNFCTIzMgotI2RlZmluZSBERUJVR0NBVVNFCTIzMwotI2RlZmluZSBDQ09VTlQJCTIzNAotI2RlZmluZSBJQ09VTlQJCTIzNgotI2RlZmluZSBJQ09VTlRMRVZFTAkyMzcKLSNkZWZpbmUgRVhDVkFERFIJMjM4Ci0jZGVmaW5lIENDT01QQVJFXzAJMjQwCi0jZGVmaW5lIENDT01QQVJFXzEJMjQxCi0jZGVmaW5lIENDT01QQVJFXzIJMjQyCi0jZGVmaW5lIE1JU0NfUkVHXzAJMjQ0Ci0jZGVmaW5lIE1JU0NfUkVHXzEJMjQ1Ci0KLS8qICBTcGVjaWFsIGNhc2VzIChiYXNlcyBvZiBzcGVjaWFsIHJlZ2lzdGVyIHNlcmllcyk6ICAqLwotI2RlZmluZSBJQlJFQUtBCQkxMjgKLSNkZWZpbmUgREJSRUFLQQkJMTQ0Ci0jZGVmaW5lIERCUkVBS0MJCTE2MAotI2RlZmluZSBFUEMJCTE3NgotI2RlZmluZSBFUFMJCTE5MgotI2RlZmluZSBFWENTQVZFCQkyMDgKLSNkZWZpbmUgQ0NPTVBBUkUJMjQwCi0KLS8qICBTcGVjaWFsIG5hbWVzIGZvciByZWFkLW9ubHkgYW5kIHdyaXRlLW9ubHkgaW50ZXJydXB0IHJlZ2lzdGVyczogICovCi0jZGVmaW5lIElOVFJFQUQJCTIyNgotI2RlZmluZSBJTlRTRVQJCTIyNgotI2RlZmluZSBJTlRDTEVBUgkyMjcKLQotI2VuZGlmIC8qIFhURU5TQV9TUEVDUkVHX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9zeXN0ZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5ZDRkMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9zeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogeHRlbnNhL2NvbmZpZy9zeXN0ZW0uaCAtLSBIQUwgZGVmaW5pdGlvbnMgdGhhdCBhcmUgZGVwZW5kZW50IG9uIFNZU1RFTSBjb25maWd1cmF0aW9uCi0gKgotICogIE5PVEU6IFRoZSBsb2NhdGlvbiBhbmQgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBoaWdobHkgc3ViamVjdCB0byBjaGFuZ2UuCi0gKgotICogIFNvdXJjZSBmb3IgY29uZmlndXJhdGlvbi1pbmRlcGVuZGVudCBiaW5hcmllcyAod2hpY2ggbGluayBpbiBhCi0gKiAgY29uZmlndXJhdGlvbi1zcGVjaWZpYyBIQUwgbGlicmFyeSkgbXVzdCBORVZFUiBpbmNsdWRlIHRoaXMgZmlsZS4KLSAqICBUaGUgSEFMIGl0c2VsZiBoYXMgaGlzdG9yaWNhbGx5IGluY2x1ZGVkIHRoaXMgZmlsZSBpbiBzb21lIGluc3RhbmNlcywKLSAqICBidXQgdGhpcyBpcyBub3QgYXBwcm9wcmlhdGUgZWl0aGVyLCBiZWNhdXNlIHRoZSBIQUwgaXMgbWVhbnQgdG8gYmUKLSAqICBjb3JlLXNwZWNpZmljIGJ1dCBzeXN0ZW0gaW5kZXBlbmRlbnQuCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUZW5zaWxpY2EsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcwotICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50Ci0gKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCi0gKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCi0gKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCi0gKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LAotICogVVNBLgotICovCi0KLQotI2lmbmRlZiBYVEVOU0FfQ09ORklHX1NZU1RFTV9ICi0jZGVmaW5lIFhURU5TQV9DT05GSUdfU1lTVEVNX0gKLQotLyojaW5jbHVkZSA8eHRlbnNhL2hhbC5oPiovCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlERVZJQ0UgQUREUkVTU0VTCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogIFN0cmFuZ2UgcGxhY2UgdG8gZmluZCB0aGVzZSwgYnV0IHRoZSBjb25maWd1cmF0aW9uIEdVSQotICogIGFsbG93cyBtb3ZpbmcgdGhlc2UgYXJvdW5kIHRvIGFjY291bnQgZm9yIHZhcmlvdXMgY29yZQotICogIGNvbmZpZ3VyYXRpb25zLiAgU3BlY2lmaWMgYm9hcmRzIChhbmQgdGhlaXIgQlNQIHNvZnR3YXJlKQotICogIHdpbGwgaGF2ZSBzcGVjaWZpYyBtZWFuaW5ncyBmb3IgdGhlc2UgY29tcG9uZW50cy4KLSAqLwotCi0vKiAgSS9PIEJsb2NrIGFyZWFzOiAgKi8KLSNkZWZpbmUgWFNIQUxfSU9CTE9DS19DQUNIRURfVkFERFIJMHhFMDAwMDAwMAotI2RlZmluZSBYU0hBTF9JT0JMT0NLX0NBQ0hFRF9QQUREUgkweEYwMDAwMDAwCi0jZGVmaW5lIFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1NJWkUJMHgwRTAwMDAwMAotCi0jZGVmaW5lIFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSCTB4RjAwMDAwMDAKLSNkZWZpbmUgWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIJMHhGMDAwMDAwMAotI2RlZmluZSBYU0hBTF9JT0JMT0NLX0JZUEFTU19TSVpFCTB4MEUwMDAwMDAKLQotLyogIFN5c3RlbSBST006ICAqLwotI2RlZmluZSBYU0hBTF9ST01fVkFERFIJCTB4RUUwMDAwMDAKLSNkZWZpbmUgWFNIQUxfUk9NX1BBRERSCQkweEZFMDAwMDAwCi0jZGVmaW5lIFhTSEFMX1JPTV9TSVpFCQkweDAwNDAwMDAwCi0vKiAgTGFyZ2VzdCBhdmFpbGFibGUgYXJlYSAoZnJlZSBvZiB2ZWN0b3JzKTogICovCi0jZGVmaW5lIFhTSEFMX1JPTV9BVkFJTF9WQUREUgkweEVFMDAwNTJDCi0jZGVmaW5lIFhTSEFMX1JPTV9BVkFJTF9WU0laRQkweDAwM0ZGQUQ0Ci0KLS8qICBTeXN0ZW0gUkFNOiAgKi8KLSNkZWZpbmUgWFNIQUxfUkFNX1ZBRERSCQkweEQwMDAwMDAwCi0jZGVmaW5lIFhTSEFMX1JBTV9QQUREUgkJMHgwMDAwMDAwMAotI2RlZmluZSBYU0hBTF9SQU1fVlNJWkUJCTB4MDgwMDAwMDAKLSNkZWZpbmUgWFNIQUxfUkFNX1BTSVpFCQkweDEwMDAwMDAwCi0jZGVmaW5lIFhTSEFMX1JBTV9TSVpFCQlYU0hBTF9SQU1fUFNJWkUKLS8qICBMYXJnZXN0IGF2YWlsYWJsZSBhcmVhIChmcmVlIG9mIHZlY3RvcnMpOiAgKi8KLSNkZWZpbmUgWFNIQUxfUkFNX0FWQUlMX1ZBRERSCTB4RDAwMDAzNzAKLSNkZWZpbmUgWFNIQUxfUkFNX0FWQUlMX1ZTSVpFCTB4MDdGRkZDOTAKLQotLyoKLSAqICBTaGFkb3cgc3lzdGVtIFJBTSAoc2FtZSBkZXZpY2UgYXMgc3lzdGVtIFJBTSwgYXQgZGlmZmVyZW50IGFkZHJlc3MpLgotICogIChFbXVsYXRpb24gYm9hcmRzIG5lZWQgdGhpcyBmb3IgdGhlIFNPTklDIEV0aGVybmV0IGRyaXZlcgotICogICB3aGVuIGRhdGEgY2FjaGVzIGFyZSBjb25maWd1cmVkIGZvciB3cml0ZWJhY2sgbW9kZS4pCi0gKiAgTk9URTogb24gZnVsbCBNTVUgY29uZmlncywgdGhpcyBwb2ludHMgdG8gdGhlIEJZUEFTUyB2aXJ0dWFsIGFkZHJlc3MKLSAqICBvZiBzeXN0ZW0gUkFNLCBpZS4gaXMgdGhlIHNhbWUgYXMgWFNIQUxfUkFNXyogZXhjZXB0IHRoYXQgdmlydHVhbAotICogIGFkZHJlc3NlcyBhcmUgdmlld2VkIHRocm91Z2ggdGhlIEJZUEFTUyBzdGF0aWMgbWFwIHJhdGhlciB0aGFuCi0gKiAgdGhlIENBQ0hFRCBzdGF0aWMgbWFwLgotICovCi0jZGVmaW5lIFhTSEFMX1JBTV9CWVBBU1NfVkFERFIJCTB4RDgwMDAwMDAKLSNkZWZpbmUgWFNIQUxfUkFNX0JZUEFTU19QQUREUgkJMHgwMDAwMDAwMAotI2RlZmluZSBYU0hBTF9SQU1fQllQQVNTX1BTSVpFCQkweDA4MDAwMDAwCi0KLS8qICBBbHRlcm5hdGUgc3lzdGVtIFJBTSAoZGlmZmVyZW50IGRldmljZSB0aGFuIHN5c3RlbSBSQU0pOiAgKi8KLSNkZWZpbmUgWFNIQUxfQUxUUkFNX1ZBRERSCQkweENFRTAwMDAwCi0jZGVmaW5lIFhTSEFMX0FMVFJBTV9QQUREUgkJMHhDMDAwMDAwMAotI2RlZmluZSBYU0hBTF9BTFRSQU1fU0laRQkJMHgwMDIwMDAwMAotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJCQlERVZJQ0UtQUREUkVTUyBERVBFTkRFTlQuLi4KLSAqCi0gKiAgVmFsdWVzIHdyaXR0ZW4gdG8gQ0FDSEVBVFRSIHNwZWNpYWwgcmVnaXN0ZXIgKG9yIGl0cyBlcXVpdmFsZW50KQotICogIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBjYWNoZXMgaW4gdmFyaW91cyBtb2Rlcy4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJQkFDS1dBUkQgQ09NUEFUSUJJTElUWSAuLi4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiAgTk9URTogIHRoZSBmb2xsb3dpbmcgdHdvIG1hY3JvcyBhcmUgREVQUkVDQVRFRC4gIFVzZSB0aGUgbGF0dGVyCi0gKiAgYm9hcmQtc3BlY2lmaWMgbWFjcm9zIGluc3RlYWQsIHdoaWNoIGFyZSBzcGVjaWFsbHkgdHVuZWQgZm9yIHRoZQotICogIHBhcnRpY3VsYXIgdGFyZ2V0IGVudmlyb25tZW50cycgbWVtb3J5IG1hcHMuCi0gKi8KLSNkZWZpbmUgWFNIQUxfQ0FDSEVBVFRSX0JZUEFTUwkJWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9CWVBBU1MJLyogZGlzYWJsZSBjYWNoZXMgaW4gYnlwYXNzIG1vZGUgKi8KLSNkZWZpbmUgWFNIQUxfQ0FDSEVBVFRSX0RFRkFVTFQJCVhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfREVGQVVMVAkvKiBkZWZhdWx0IHNldHRpbmcgdG8gZW5hYmxlIGNhY2hlcyAobm8gd3JpdGViYWNrISkgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQlJU1MgKEluc3RydWN0aW9uIFNldCBTaW11bGF0b3IpIFNQRUNJRklDIC4uLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBYU0hBTF9JU1NfQ0FDSEVBVFRSX1dSSVRFQkFDSwkweDExMjIyMjJGCS8qIGVuYWJsZSBjYWNoZXMgaW4gd3JpdGUtYmFjayBtb2RlICovCi0jZGVmaW5lIFhTSEFMX0lTU19DQUNIRUFUVFJfV1JJVEVBTExPQwkweDExMjIyMjJGCS8qIGVuYWJsZSBjYWNoZXMgaW4gd3JpdGUtYWxsb2NhdGUgbW9kZSAqLwotI2RlZmluZSBYU0hBTF9JU1NfQ0FDSEVBVFRSX1dSSVRFVEhSVQkweDExMjIyMjJGCS8qIGVuYWJsZSBjYWNoZXMgaW4gd3JpdGUtdGhyb3VnaCBtb2RlICovCi0jZGVmaW5lIFhTSEFMX0lTU19DQUNIRUFUVFJfQllQQVNTCTB4MjIyMjIyMkYJLyogZGlzYWJsZSBjYWNoZXMgaW4gYnlwYXNzIG1vZGUgKi8KLSNkZWZpbmUgWFNIQUxfSVNTX0NBQ0hFQVRUUl9ERUZBVUxUCVhTSEFMX0lTU19DQUNIRUFUVFJfV1JJVEVCQUNLCS8qIGRlZmF1bHQgc2V0dGluZyB0byBlbmFibGUgY2FjaGVzICovCi0KLS8qICBGb3IgQ293YXJlIG9ubHk6ICAqLwotI2RlZmluZSBYU0hBTF9DT1dBUkVfQ0FDSEVBVFRSX1dSSVRFQkFDSwkweDExMjIyMjIyCS8qIGVuYWJsZSBjYWNoZXMgaW4gd3JpdGUtYmFjayBtb2RlICovCi0jZGVmaW5lIFhTSEFMX0NPV0FSRV9DQUNIRUFUVFJfV1JJVEVBTExPQwkweDExMjIyMjIyCS8qIGVuYWJsZSBjYWNoZXMgaW4gd3JpdGUtYWxsb2NhdGUgbW9kZSAqLwotI2RlZmluZSBYU0hBTF9DT1dBUkVfQ0FDSEVBVFRSX1dSSVRFVEhSVQkweDExMjIyMjIyCS8qIGVuYWJsZSBjYWNoZXMgaW4gd3JpdGUtdGhyb3VnaCBtb2RlICovCi0jZGVmaW5lIFhTSEFMX0NPV0FSRV9DQUNIRUFUVFJfQllQQVNTCQkweDIyMjIyMjIyCS8qIGRpc2FibGUgY2FjaGVzIGluIGJ5cGFzcyBtb2RlICovCi0jZGVmaW5lIFhTSEFMX0NPV0FSRV9DQUNIRUFUVFJfREVGQVVMVAkJWFNIQUxfQ09XQVJFX0NBQ0hFQVRUUl9XUklURUJBQ0sJLyogZGVmYXVsdCBzZXR0aW5nIHRvIGVuYWJsZSBjYWNoZXMgKi8KLQotLyogIEZvciBCRk0gYW5kIG90aGVyIHB1cnBvc2VzOiAgKi8KLSNkZWZpbmUgWFNIQUxfQUxMVkFMSURfQ0FDSEVBVFRSX1dSSVRFQkFDSwkweDExMjIyMjIyCS8qIGVuYWJsZSBjYWNoZXMgd2l0aG91dCBhbnkgaW52YWxpZCByZWdpb25zICovCi0jZGVmaW5lIFhTSEFMX0FMTFZBTElEX0NBQ0hFQVRUUl9ERUZBVUxUCVhTSEFMX0FMTFZBTElEX0NBQ0hFQVRUUl9XUklURUJBQ0sJLyogZGVmYXVsdCBzZXR0aW5nIGZvciBjYWNoZXMgd2l0aG91dCBhbnkgaW52YWxpZCByZWdpb25zICovCi0KLSNkZWZpbmUgWFNIQUxfSVNTX1BJUEVfUkVHSU9OUwkwCi0jZGVmaW5lIFhTSEFMX0lTU19TRFJBTV9SRUdJT05TCTAKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCVhUMjAwMCBCT0FSRCBTUEVDSUZJQyAuLi4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9XUklURUJBQ0sJMHgyMkZGRkZGRgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLWJhY2sgbW9kZSAqLwotI2RlZmluZSBYU0hBTF9YVDIwMDBfQ0FDSEVBVFRSX1dSSVRFQUxMT0MJMHgyMkZGRkZGRgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLWFsbG9jYXRlIG1vZGUgKi8KLSNkZWZpbmUgWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9XUklURVRIUlUJMHgyMkZGRkZGRgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLXRocm91Z2ggbW9kZSAqLwotI2RlZmluZSBYU0hBTF9YVDIwMDBfQ0FDSEVBVFRSX0JZUEFTUwkJMHgyMkZGRkZGRgkvKiBkaXNhYmxlIGNhY2hlcyBpbiBieXBhc3MgbW9kZSAqLwotI2RlZmluZSBYU0hBTF9YVDIwMDBfQ0FDSEVBVFRSX0RFRkFVTFQJCVhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfV1JJVEVCQUNLCS8qIGRlZmF1bHQgc2V0dGluZyB0byBlbmFibGUgY2FjaGVzICovCi0KLSNkZWZpbmUgWFNIQUxfWFQyMDAwX1BJUEVfUkVHSU9OUwkweDAwMDAxMDAwCS8qIEJ1c0ludCBwaXBlbGluZSByZWdpb25zICovCi0jZGVmaW5lIFhTSEFMX1hUMjAwMF9TRFJBTV9SRUdJT05TCTB4MDAwMDAwMDUJLyogQnVzSW50IFNEUkFNIHJlZ2lvbnMgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlWRUNUT1IgU0laRVMKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiAgU2l6ZXMgYWxsb2NhdGVkIHRvIHZlY3RvcnMgYnkgdGhlIHN5c3RlbSAobWVtb3J5IG1hcCkgY29uZmlndXJhdGlvbi4KLSAqICBUaGVzZSBzaXplcyBhcmUgY29uc3RyYWluZWQgYnkgY29yZSBjb25maWd1cmF0aW9uIChlZy4gb25lIHZlY3RvcidzCi0gKiAgY29kZSBjYW5ub3Qgb3ZlcmZsb3cgaW50byBhbm90aGVyIHZlY3RvcikgYnV0IGFyZSBkZXBlbmRlbnQgb24gdGhlCi0gKiAgc3lzdGVtIG9yIGJvYXJkIChvciBMU1ApIG1lbW9yeSBtYXAgY29uZmlndXJhdGlvbi4KLSAqCi0gKiAgV2hldGhlciBvciBub3QgZWFjaCB2ZWN0b3IgaGFwcGVucyB0byBiZSBpbiBhIHN5c3RlbSBST00gaXMgYWxzbwotICogIGEgc3lzdGVtIGNvbmZpZ3VyYXRpb24gbWF0dGVyLCBzb21ldGltZXMgdXNlZnVsLCBpbmNsdWRlZCBoZXJlIGFsc286Ci0gKi8KLSNkZWZpbmUgWFNIQUxfUkVTRVRfVkVDVE9SX1NJWkUJMHgwMDAwMDRFMAotI2RlZmluZSBYU0hBTF9SRVNFVF9WRUNUT1JfSVNST00JMQotI2RlZmluZSBYU0hBTF9VU0VSX1ZFQ1RPUl9TSVpFCTB4MDAwMDAwMUMKLSNkZWZpbmUgWFNIQUxfVVNFUl9WRUNUT1JfSVNST00JMAotI2RlZmluZSBYU0hBTF9QUk9HUkFNRVhDX1ZFQ1RPUl9TSVpFCVhTSEFMX1VTRVJfVkVDVE9SX1NJWkUJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgWFNIQUxfVVNFUkVYQ19WRUNUT1JfU0laRQlYU0hBTF9VU0VSX1ZFQ1RPUl9TSVpFCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFhTSEFMX0tFUk5FTF9WRUNUT1JfU0laRQkweDAwMDAwMDFDCi0jZGVmaW5lIFhTSEFMX0tFUk5FTF9WRUNUT1JfSVNST00JMAotI2RlZmluZSBYU0hBTF9TVEFDS0VERVhDX1ZFQ1RPUl9TSVpFCVhTSEFMX0tFUk5FTF9WRUNUT1JfU0laRQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBYU0hBTF9LRVJORUxFWENfVkVDVE9SX1NJWkUJWFNIQUxfS0VSTkVMX1ZFQ1RPUl9TSVpFCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFhTSEFMX0RPVUJMRUVYQ19WRUNUT1JfU0laRQkweDAwMDAwMEUwCi0jZGVmaW5lIFhTSEFMX0RPVUJMRUVYQ19WRUNUT1JfSVNST00JMAotI2RlZmluZSBYU0hBTF9XSU5ET1dfVkVDVE9SU19TSVpFCTB4MDAwMDAxODAKLSNkZWZpbmUgWFNIQUxfV0lORE9XX1ZFQ1RPUlNfSVNST00JMAotI2RlZmluZSBYU0hBTF9JTlRMRVZFTDJfVkVDVE9SX1NJWkUJMHgwMDAwMDAwQwotI2RlZmluZSBYU0hBTF9JTlRMRVZFTDJfVkVDVE9SX0lTUk9NCTAKLSNkZWZpbmUgWFNIQUxfSU5UTEVWRUwzX1ZFQ1RPUl9TSVpFCTB4MDAwMDAwMEMKLSNkZWZpbmUgWFNIQUxfSU5UTEVWRUwzX1ZFQ1RPUl9JU1JPTQkwCi0jZGVmaW5lIFhTSEFMX0lOVExFVkVMNF9WRUNUT1JfU0laRQkweDAwMDAwMDBDCi0jZGVmaW5lIFhTSEFMX0lOVExFVkVMNF9WRUNUT1JfSVNST00JMQotI2RlZmluZSBYU0hBTF9ERUJVR19WRUNUT1JfU0laRQkJWFNIQUxfSU5UTEVWRUw0X1ZFQ1RPUl9TSVpFCi0jZGVmaW5lIFhTSEFMX0RFQlVHX1ZFQ1RPUl9JU1JPTQlYU0hBTF9JTlRMRVZFTDRfVkVDVE9SX0lTUk9NCi0KLQotI2VuZGlmIC8qWFRFTlNBX0NPTkZJR19TWVNURU1fSCovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29uZmlnLWxpbnV4X2JlL3RpZS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvdGllLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmU1MTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvdGllLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIHh0ZW5zYS9jb25maWcvdGllLmggLS0gSEFMIGRlZmluaXRpb25zIHRoYXQgYXJlIGRlcGVuZGVudCBvbiBDT1JFIGFuZCBUSUUgY29uZmlndXJhdGlvbgotICoKLSAqICBUaGlzIGhlYWRlciBmaWxlIGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgImNvbXBpbGUtdGltZSBIQUwiIG9yIENIQUwuCi0gKiAgSXQgd2FzIGdlbmVyYXRlZCBmb3IgYSBzcGVjaWZpYyBYdGVuc2EgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24sCi0gKiAgYW5kIGZ1cnRoZXJtb3JlIGZvciBhIHNwZWNpZmljIHNldCBvZiBUSUUgc291cmNlIGZpbGVzIHRoYXQgZXh0ZW5kCi0gKiAgYmFzaWMgY29yZSBmdW5jdGlvbmFsaXR5LgotICoKLSAqICBTb3VyY2UgZm9yIGNvbmZpZ3VyYXRpb24taW5kZXBlbmRlbnQgYmluYXJpZXMgKHdoaWNoIGxpbmsgaW4gYQotICogIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWMgSEFMIGxpYnJhcnkpIG11c3QgTkVWRVIgaW5jbHVkZSB0aGlzIGZpbGUuCi0gKiAgSXQgaXMgcGVyZmVjdGx5IG5vcm1hbCwgaG93ZXZlciwgZm9yIHRoZSBIQUwgc291cmNlIGl0c2VsZiB0byBpbmNsdWRlIHRoaXMgZmlsZS4KLSAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzIFRlbnNpbGljYSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCi0gKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKLSAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKLSAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKLSAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKLSAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsCi0gKiBVU0EuCi0gKi8KLQotCi0jaWZuZGVmIFhURU5TQV9DT05GSUdfVElFX0gKLSNkZWZpbmUgWFRFTlNBX0NPTkZJR19USUVfSAotCi0jaW5jbHVkZSA8eHRlbnNhL2hhbC5oPgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCUdFTkVSQUwKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiAgU2VwYXJhdG9ycyBmb3IgbWFjcm9zIHRoYXQgZXhwYW5kIGludG8gYXJyYXlzLgotICogIFRoZXNlIGNhbiBiZSBwcmVkZWZpbmVkIGJ5IGZpbGVzIHRoYXQgI2luY2x1ZGUgdGhpcyBvbmUsCi0gKiAgd2hlbiBkaWZmZXJlbnQgc2VwYXJhdG9ycyBhcmUgcmVxdWlyZWQuCi0gKi8KLS8qICBFbGVtZW50IHNlcGFyYXRvciBmb3IgbWFjcm9zIHRoYXQgZXhwYW5kIGludG8gMS1kaW1lbnNpb25hbCBhcnJheXM6ICAqLwotI2lmbmRlZiBYQ0hBTF9TRVAKLSNkZWZpbmUgWENIQUxfU0VQCQkJLAotI2VuZGlmCi0vKiAgQXJyYXkgc2VwYXJhdG9yIGZvciBtYWNyb3MgdGhhdCBleHBhbmQgaW50byAyLWRpbWVuc2lvbmFsIGFycmF5czogICovCi0jaWZuZGVmIFhDSEFMX1NFUDIKLSNkZWZpbmUgWENIQUxfU0VQMgkJCX0sewotI2VuZGlmCi0KLQotCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCUNPUFJPQ0VTU09SUyBhbmQgRVhUUkEgU1RBVEUKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgWENIQUxfQ1BfTlVNCQkJMAkvKiBudW1iZXIgb2YgY29wcm9jZXNzb3JzICovCi0jZGVmaW5lIFhDSEFMX0NQX01BWAkJCTAJLyogbWF4IGNvcHJvY2Vzc29yIGlkIHBsdXMgb25lICgwIGlmIG5vbmUpICovCi0jZGVmaW5lIFhDSEFMX0NQX01BU0sJCQkweDAwCS8qIGJpdG1hc2sgb2YgY29wcm9jZXNzb3JzIGJ5IGlkICovCi0KLS8qICBTcGFjZSBmb3IgY29wcm9jZXNzb3JzJyBzdGF0ZSBzYXZlIGFyZWFzOiAgKi8KLSNkZWZpbmUgWENIQUxfQ1AwX1NBX1NJWkUJCTAKLSNkZWZpbmUgWENIQUxfQ1AxX1NBX1NJWkUJCTAKLSNkZWZpbmUgWENIQUxfQ1AyX1NBX1NJWkUJCTAKLSNkZWZpbmUgWENIQUxfQ1AzX1NBX1NJWkUJCTAKLSNkZWZpbmUgWENIQUxfQ1A0X1NBX1NJWkUJCTAKLSNkZWZpbmUgWENIQUxfQ1A1X1NBX1NJWkUJCTAKLSNkZWZpbmUgWENIQUxfQ1A2X1NBX1NJWkUJCTAKLSNkZWZpbmUgWENIQUxfQ1A3X1NBX1NJWkUJCTAKLS8qICBNaW5pbXVtIHJlcXVpcmVkIGFsaWdubWVudHMgb2YgQ1Agc3RhdGUgc2F2ZSBhcmVhczogICovCi0jZGVmaW5lIFhDSEFMX0NQMF9TQV9BTElHTgkJMQotI2RlZmluZSBYQ0hBTF9DUDFfU0FfQUxJR04JCTEKLSNkZWZpbmUgWENIQUxfQ1AyX1NBX0FMSUdOCQkxCi0jZGVmaW5lIFhDSEFMX0NQM19TQV9BTElHTgkJMQotI2RlZmluZSBYQ0hBTF9DUDRfU0FfQUxJR04JCTEKLSNkZWZpbmUgWENIQUxfQ1A1X1NBX0FMSUdOCQkxCi0jZGVmaW5lIFhDSEFMX0NQNl9TQV9BTElHTgkJMQotI2RlZmluZSBYQ0hBTF9DUDdfU0FfQUxJR04JCTEKLQotLyogIEluZGV4aW5nIG1hY3JvczogICovCi0jZGVmaW5lIF9YQ0hBTF9DUF9TQV9TSVpFKG4pCQlYQ0hBTF9DUCAjIyBuICMjIF9TQV9TSVpFCi0jZGVmaW5lIFhDSEFMX0NQX1NBX1NJWkUobikJCV9YQ0hBTF9DUF9TQV9TSVpFKG4pCS8qIG4gPSAwIC4uIDcgKi8KLSNkZWZpbmUgX1hDSEFMX0NQX1NBX0FMSUdOKG4pCQlYQ0hBTF9DUCAjIyBuICMjIF9TQV9BTElHTgotI2RlZmluZSBYQ0hBTF9DUF9TQV9BTElHTihuKQkJX1hDSEFMX0NQX1NBX0FMSUdOKG4pCS8qIG4gPSAwIC4uIDcgKi8KLQotCi0vKiAgU3BhY2UgZm9yICJleHRyYSIgc3RhdGUgKHVzZXIgc3BlY2lhbCByZWdpc3RlcnMgYW5kIG5vbi1jcCBUSUUpIHNhdmUgYXJlYTogICovCi0jZGVmaW5lIFhDSEFMX0VYVFJBX1NBX1NJWkUJCTAKLSNkZWZpbmUgWENIQUxfRVhUUkFfU0FfQUxJR04JCTEKLQotLyogIFRvdGFsIHNhdmUgYXJlYSBzaXplIChleHRyYSArIGFsbCBjb3Byb2Nlc3NvcnMpICAqLwotLyogIChub3QgdXNlZnVsIHVudGlsIHh0aGFsX3tzYXZlLHJlc3RvcmV9X2FsbF9leHRyYSgpIGlzIGltcGxlbWVudGVkLCAgKi8KLS8qICAgYnV0IGluY2x1ZGVkIGZvciBUb3IyIGJldGE7IGRvZXNuJ3QgYWNjb3VudCBmb3IgYWxpZ25tZW50ISk6ICAqLwotI2RlZmluZSBYQ0hBTF9DUEVYVFJBX1NBX1NJWkVfVE9SMgkwCS8qIFRvcjJCZXRhIHRlbXBvcmFyeSBkZWZpbml0aW9uIC0tIGRvIG5vdCB1c2UgKi8KLQotLyogIENvbWJpbmVkIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgYWxsIENQIGFuZCBFWFRSQSBzdGF0ZSBzYXZlIGFyZWFzICAqLwotLyogIChkb2VzIG5vdCBpbmNsdWRlIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgYW55IGJhc2UgY29uZmlnIHJlZ2lzdGVycyk6ICAqLwotI2RlZmluZSBYQ0hBTF9DUEVYVFJBX1NBX0FMSUdOCQkxCi0KLS8qIC4uLiAqLwotCi0KLSNpZmRlZiBfQVNNTEFOR1VBR0UKLS8qCi0gKiAgQXNzZW1ibHktbGFuZ3VhZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMgKGFzc2VtYmx5IG1hY3JvcywgZXRjLikuCi0gKi8KLSNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL3NwZWNyZWcuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgTWFjcm9zIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIG5vbi1jb3Byb2Nlc3NvciBUSUUgcG9ydGlvbiBvZiBFWFRSQSBzdGF0ZS4KLSAqLwotCi0vKiAobm9uZSkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICBNYWNyb3MgdG8gY3JlYXRlIGZ1bmN0aW9ucyB0aGF0IHNhdmUgYW5kIHJlc3RvcmUgYWxsIEVYVFJBIChub24tY29wcm9jZXNzb3IpIHN0YXRlCi0gKiAgKGRvZXMgbm90IGluY2x1ZGUgemVyby1vdmVyaGVhZCBsb29wIHJlZ2lzdGVycyBhbmQgbm9uLW9wdGlvbmFsIHJlZ2lzdGVycykuCi0gKi8KLQotCS8qCi0JICogIE1hY3JvIHRoYXQgZXhwYW5kcyB0byB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIHRoYXQKLQkgKiAgc3RvcmVzIHRoZSBleHRyYSAobm9uLWNvcHJvY2Vzc29yKSBvcHRpb25hbC9jdXN0b20gc3RhdGUuCi0JICoJRW50cnk6CWEyID0gcHRyIHRvIHNhdmUgYXJlYSBpbiB3aGljaCB0byBzYXZlIGV4dHJhIHN0YXRlCi0JICoJRXhpdDoJYW55IHJlZ2lzdGVyIGEyLWExNSAoPykgbWF5IGhhdmUgYmVlbiBjbG9iYmVyZWQuCi0JICovCi0JLm1hY3JvCXhjaGFsX2V4dHJhX3N0b3JlX2Z1bmNib2R5Ci0JLmVuZG0KLQotCi0JLyoKLQkgKiAgTWFjcm8gdGhhdCBleHBhbmRzIHRvIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gdGhhdAotCSAqICBsb2FkcyB0aGUgZXh0cmEgKG5vbi1jb3Byb2Nlc3Nvcikgb3B0aW9uYWwvY3VzdG9tIHN0YXRlLgotCSAqCUVudHJ5OglhMiA9IHB0ciB0byBzYXZlIGFyZWEgZnJvbSB3aGljaCB0byByZXN0b3JlIGV4dHJhIHN0YXRlCi0JICoJRXhpdDoJYW55IHJlZ2lzdGVyIGEyLWExNSAoPykgbWF5IGhhdmUgYmVlbiBjbG9iYmVyZWQuCi0JICovCi0JLm1hY3JvCXhjaGFsX2V4dHJhX2xvYWRfZnVuY2JvZHkKLQkuZW5kbQotCi0KLS8qKioqKioqKioqKioqKioqKioqKgotICogIE1hY3JvcyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiBlYWNoIFRJRSBjb3Byb2Nlc3Nvci4KLSAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgTWFjcm9zIHRvIGNyZWF0ZSBmdW5jdGlvbnMgdGhhdCBzYXZlIGFuZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiAqYW55KiBUSUUgY29wcm9jZXNzb3IuCi0gKi8KLQotCS8qCi0JICogIE1hY3JvIHRoYXQgZXhwYW5kcyB0byB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uCi0JICogIHRoYXQgc3RvcmVzIHRoZSBzZWxlY3RlZCBjb3Byb2Nlc3NvcidzIHN0YXRlIChyZWdpc3RlcnMgZXRjKS4KLQkgKglFbnRyeToJYTIgPSBwdHIgdG8gc2F2ZSBhcmVhIGluIHdoaWNoIHRvIHNhdmUgY3Agc3RhdGUKLQkgKgkJYTMgPSBjb3Byb2Nlc3NvciBudW1iZXIKLQkgKglFeGl0OglhbnkgcmVnaXN0ZXIgYTItYTE1ICg/KSBtYXkgaGF2ZSBiZWVuIGNsb2JiZXJlZC4KLQkgKi8KLQkubWFjcm8JeGNoYWxfY3BpX3N0b3JlX2Z1bmNib2R5Ci0JLmVuZG0KLQotCi0JLyoKLQkgKiAgTWFjcm8gdGhhdCBleHBhbmRzIHRvIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24KLQkgKiAgdGhhdCBsb2FkcyB0aGUgc2VsZWN0ZWQgY29wcm9jZXNzb3IncyBzdGF0ZSAocmVnaXN0ZXJzIGV0YykuCi0JICoJRW50cnk6CWEyID0gcHRyIHRvIHNhdmUgYXJlYSBmcm9tIHdoaWNoIHRvIHJlc3RvcmUgY3Agc3RhdGUKLQkgKgkJYTMgPSBjb3Byb2Nlc3NvciBudW1iZXIKLQkgKglFeGl0OglhbnkgcmVnaXN0ZXIgYTItYTE1ICg/KSBtYXkgaGF2ZSBiZWVuIGNsb2JiZXJlZC4KLQkgKi8KLQkubWFjcm8JeGNoYWxfY3BpX2xvYWRfZnVuY2JvZHkKLQkuZW5kbQotCi0jZW5kaWYgLypfQVNNTEFOR1VBR0UqLwotCi0KLS8qCi0gKiAgQ29udGVudHMgb2Ygc2F2ZSBhcmVhcyBpbiB0ZXJtcyBvZiBsaWJkYiByZWdpc3RlciBudW1iZXJzLgotICogIE5PVEU6ICBDT05URU5UU19MSUJEQl97VVJFRyxSRUdGfSBtYWNyb3MgYXJlIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZTsKLSAqICBpdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIGhlYWRlciBmaWxlIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MKLSAqICB1c2VmdWxseSBiZWZvcmUgZWFjaCBleHBhbnNpb24gb2YgdGhlIENPTlRFTlRTX0xJQkRCIG1hY3Jvcy4KLSAqICAoRmllbGRzIHJzdlsxMjNdIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIGFkZGl0aW9uczsgdGhleSBhcmUgY3VycmVudGx5Ci0gKiAgIHNldCB0byB6ZXJvIGJ1dCBtYXkgYmUgc2V0IHRvIHNvbWUgdXNlZnVsIHZhbHVlcyBpbiB0aGUgZnV0dXJlLikKLSAqCi0gKglDT05URU5UU19MSUJEQl9TUkVHKGxpYmRibnVtLCBvZmZzZXQsIHNpemUsIGFsaWduLCByc3YxLCBuYW1lLCBzcmVnbnVtLCBiaXRtYXNrLCByc3YyLCByc3YzKQotICoJQ09OVEVOVFNfTElCREJfVVJFRyhsaWJkYm51bSwgb2Zmc2V0LCBzaXplLCBhbGlnbiwgcnN2MSwgbmFtZSwgdXJlZ251bSwgYml0bWFzaywgcnN2MiwgcnN2MykKLSAqCUNPTlRFTlRTX0xJQkRCX1JFR0YobGliZGJudW0sIG9mZnNldCwgc2l6ZSwgYWxpZ24sIHJzdjEsIG5hbWUsIGluZGV4LCBudW1lbnRyaWVzLCBjb250ZW50c2l6ZSwgcmVnbmFtZV9iYXNlLCByZWdmaWxlX25hbWUsIHJzdjIsIHJzdjMpCi0gKi8KLQotI2RlZmluZSBYQ0hBTF9FWFRSQV9TQV9DT05URU5UU19MSUJEQl9OVU0JMAotI2RlZmluZSBYQ0hBTF9FWFRSQV9TQV9DT05URU5UU19MSUJEQgkvKiBlbXB0eSAqLwotCi0jZGVmaW5lIFhDSEFMX0NQMF9TQV9DT05URU5UU19MSUJEQl9OVU0JMAotI2RlZmluZSBYQ0hBTF9DUDBfU0FfQ09OVEVOVFNfTElCREIJLyogZW1wdHkgKi8KLQotI2RlZmluZSBYQ0hBTF9DUDFfU0FfQ09OVEVOVFNfTElCREJfTlVNCTAKLSNkZWZpbmUgWENIQUxfQ1AxX1NBX0NPTlRFTlRTX0xJQkRCCS8qIGVtcHR5ICovCi0KLSNkZWZpbmUgWENIQUxfQ1AyX1NBX0NPTlRFTlRTX0xJQkRCX05VTQkwCi0jZGVmaW5lIFhDSEFMX0NQMl9TQV9DT05URU5UU19MSUJEQgkvKiBlbXB0eSAqLwotCi0jZGVmaW5lIFhDSEFMX0NQM19TQV9DT05URU5UU19MSUJEQl9OVU0JMAotI2RlZmluZSBYQ0hBTF9DUDNfU0FfQ09OVEVOVFNfTElCREIJLyogZW1wdHkgKi8KLQotI2RlZmluZSBYQ0hBTF9DUDRfU0FfQ09OVEVOVFNfTElCREJfTlVNCTAKLSNkZWZpbmUgWENIQUxfQ1A0X1NBX0NPTlRFTlRTX0xJQkRCCS8qIGVtcHR5ICovCi0KLSNkZWZpbmUgWENIQUxfQ1A1X1NBX0NPTlRFTlRTX0xJQkRCX05VTQkwCi0jZGVmaW5lIFhDSEFMX0NQNV9TQV9DT05URU5UU19MSUJEQgkvKiBlbXB0eSAqLwotCi0jZGVmaW5lIFhDSEFMX0NQNl9TQV9DT05URU5UU19MSUJEQl9OVU0JMAotI2RlZmluZSBYQ0hBTF9DUDZfU0FfQ09OVEVOVFNfTElCREIJLyogZW1wdHkgKi8KLQotI2RlZmluZSBYQ0hBTF9DUDdfU0FfQ09OVEVOVFNfTElCREJfTlVNCTAKLSNkZWZpbmUgWENIQUxfQ1A3X1NBX0NPTlRFTlRTX0xJQkRCCS8qIGVtcHR5ICovCi0KLQotCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlNSVNDCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgMAkvKiBpcyB0aGVyZSBzb21ldGhpbmcgZXF1aXZhbGVudCBmb3IgdXNlciBUSUU/ICovCi0jZGVmaW5lIFhDSEFMX0NPUkVfSUQJCQkibGludXhfYmUiCS8qIGNvbmZpZ3VyYXRpb24ncyBhbHBoYW51bWVyaWMgY29yZSBpZGVudGlmaWVyCi0JCQkJCQkJICAgKENvcmVJRCkgc2V0IGluIHRoZSBYdGVuc2EgUHJvY2Vzc29yIEdlbmVyYXRvciAqLwotCi0jZGVmaW5lIFhDSEFMX0JVSUxEX1VOSVFVRV9JRAkJMHgwMDAwMzI1NgkvKiBzb2Z0d2FyZSBidWlsZC11bmlxdWUgSUQgKDIyLWJpdCkgKi8KLQotLyogIFRoZXNlIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBoYXJkd2FyZSB0YXJnZXRlZCBieSB0aGlzIHNvZnR3YXJlOiAgKi8KLSNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQwCQkweEMxMDNEMUZGCS8qIGNvbmZpZyBJRCByZWcgMCB2YWx1ZSAodXBwZXIgMzIgb2YgNjQgYml0cykgKi8KLSNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQxCQkweDAwODAzMjU2CS8qIGNvbmZpZyBJRCByZWcgMSB2YWx1ZSAobG93ZXIgMzIgb2YgNjQgYml0cykgKi8KLSNkZWZpbmUgWENIQUxfQ09ORklHSUQwCQkJWENIQUxfSFdfQ09ORklHSUQwCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkgLS0gZG9uJ3QgdXNlISAqLwotI2RlZmluZSBYQ0hBTF9DT05GSUdJRDEJCQlYQ0hBTF9IV19DT05GSUdJRDEJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seSAtLSBkb24ndCB1c2UhICovCi0jZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfTUFKT1IJCTEwNTAJLyogbWFqb3IgcmVsZWFzZSBvZiB0YXJnZXRlZCBoYXJkd2FyZSAqLwotI2RlZmluZSBYQ0hBTF9IV19SRUxFQVNFX01JTk9SCQkxCS8qIG1pbm9yIHJlbGVhc2Ugb2YgdGFyZ2V0ZWQgaGFyZHdhcmUgKi8KLSNkZWZpbmUgWENIQUxfSFdfUkVMRUFTRV9OQU1FCQkiVDEwNTAuMSIJLyogZnVsbCByZWxlYXNlIG5hbWUgb2YgdGFyZ2V0ZWQgaGFyZHdhcmUgKi8KLSNkZWZpbmUgWFRIQUxfSFdfUkVMX1QxMDUwCTEKLSNkZWZpbmUgWFRIQUxfSFdfUkVMX1QxMDUwXzEJMQotI2RlZmluZSBYQ0hBTF9IV19DT05GSUdJRF9SRUxJQUJMRQkxCi0jZW5kaWYgLyowKi8KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCUlTQQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIDAJLyogdGhlc2UgcHJvYmFibHkgZG9uJ3QgYmVsb25nIGhlcmUsIGJ1dCBhcmUgcmVsYXRlZCB0byBvciBpbXBsZW1lbnRlZCB1c2luZyBUSUUgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9CT09MRUFOUwkJMAkvKiAxIGlmIGJvb2xlYW5zIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotLyogIE1pc2MgaW5zdHJ1Y3Rpb25zOiAgKi8KLSNkZWZpbmUgWENIQUxfSEFWRV9NVUwzMgkJMAkvKiAxIGlmIDMyLWJpdCBpbnRlZ2VyIG11bHRpcGx5IG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLwotI2RlZmluZSBYQ0hBTF9IQVZFX01VTDMyX0hJR0gJCTAJLyogMSBpZiBNVUwzMiBvcHRpb24gaW5jbHVkZXMgTVVMVUggYW5kIE1VTFNILCAwIG90aGVyd2lzZSAqLwotCi0jZGVmaW5lIFhDSEFMX0hBVkVfRlAJCQkwCS8qIDEgaWYgZmxvYXRpbmcgcG9pbnQgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCi0jZW5kaWYgLyowKi8KLQotCi0jZW5kaWYgLypYVEVOU0FfQ09ORklHX1RJRV9IKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb3JlYXNtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvcmVhc20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjZmI1NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvcmVhc20uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0jaWZuZGVmIFhURU5TQV9DT1JFQVNNX0gKLSNkZWZpbmUgWFRFTlNBX0NPUkVBU01fSAotCi0vKgotICogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLSAqCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvcmVhc20uaCAtLSBhc3NlbWJsZXItc3BlY2lmaWMKLSAqIGRlZmluaXRpb25zIHRoYXQgZGVwZW5kIG9uIENPUkUgY29uZmlndXJhdGlvbi4KLSAqCi0gKiBTb3VyY2UgZm9yIGNvbmZpZ3VyYXRpb24taW5kZXBlbmRlbnQgYmluYXJpZXMgKHdoaWNoIGxpbmsgaW4gYQotICogY29uZmlndXJhdGlvbi1zcGVjaWZpYyBIQUwgbGlicmFyeSkgbXVzdCBORVZFUiBpbmNsdWRlIHRoaXMgZmlsZS4KLSAqIEl0IGlzIHBlcmZlY3RseSBub3JtYWwsIGhvd2V2ZXIsIGZvciB0aGUgSEFMIGl0c2VsZiB0byBpbmNsdWRlIHRoaXMKLSAqIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIG11c3QgTk9UIGluY2x1ZGUgeHRlbnNhL2NvbmZpZy9zeXN0ZW0uaC4gIEFueSBhc3NlbWJsZXIKLSAqIGhlYWRlciBmaWxlIHRoYXQgZGVwZW5kcyBvbiBzeXN0ZW0gaW5mb3JtYXRpb24gc2hvdWxkIGxpa2VseSBnbyBpbgotICogYSBuZXcgc3lzdGVtYXNtLmggKG9yIHN5c2FzbS5oKSBoZWFkZXIgZmlsZS4KLSAqCi0gKiAgTk9URTogbWFjcm8gYmVxaTMyIGlzIE5PVCBjb25maWd1cmF0aW9uLWRlcGVuZGVudCwgYW5kIGlzIHBsYWNlZAotICogICAgICAgIGhlcmUgdGlsIHdlIHdpbGwgaGF2ZSBjb25maWd1cmF0aW9uLWluZGVwZW5kZW50IGhlYWRlciBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKLSAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgotICovCi0KLQotI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgotI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvc3BlY3JlZy5oPgotCi0vKgotICogIEFzc2VtYmx5LWxhbmd1YWdlIHNwZWNpZmljIGRlZmluaXRpb25zIChhc3NlbWJseSBtYWNyb3MsIGV0Yy4pLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIGZpbmRfbXNfc2V0Yml0Ci0gKgotICogIFRoaXMgbWFjcm8gZmluZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRoYXQgaXMgc2V0IGluIDxhcz4KLSAqICBhbmQgcmV0dXJuIGl0cyBpbmRleCArIDxiYXNlPiBpbiA8YWQ+LCBvciA8YmFzZT4gLSAxIGlmIDxhcz4gaXMgemVyby4KLSAqICBUaGUgaW5kZXggY291bnRzIHN0YXJ0aW5nIGF0IHplcm8gZm9yIHRoZSBsc2JpdCwgc28gdGhlIHJldHVybgotICogIHZhbHVlIHJhbmdlcyBmcm9tIDxiYXNlPi0xIChubyBiaXQgc2V0KSB0byA8YmFzZT4rMzEgKG1zYml0IHNldCkuCi0gKgotICogIFBhcmFtZXRlcnM6Ci0gKgk8YWQ+CWRlc3RpbmF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgKGFueSByZWdpc3RlcikKLSAqCTxhcz4Jc291cmNlIGFkZHJlc3MgcmVnaXN0ZXIKLSAqCTxhdD4JdGVtcG9yYXJ5IGFkZHJlc3MgcmVnaXN0ZXIgKG11c3QgYmUgZGlmZmVyZW50IHRoYW4gPGFzPikKLSAqCTxiYXNlPgljb25zdGFudCB2YWx1ZSBhZGRlZCB0byByZXN1bHQgKHVzdWFsbHkgMCBvciAxKQotICogIE9uIGVudHJ5OgotICoJPGFkPiA9IHVuZGVmaW5lZCBpZiBkaWZmZXJlbnQgdGhhbiA8YXM+Ci0gKgk8YXM+ID0gdmFsdWUgd2hvc2UgbW9zdCBzaWduaWZpY2FudCBzZXQgYml0IGlzIHRvIGJlIGZvdW5kCi0gKgk8YXQ+ID0gdW5kZWZpbmVkCi0gKglubyBvdGhlciByZWdpc3RlcnMgYXJlIHVzZWQgYnkgdGhpcyBtYWNyby4KLSAqICBPbiBleGl0OgotICoJPGFkPiA9IDxiYXNlPiArIGluZGV4IG9mIG1zYml0IHNldCBpbiBvcmlnaW5hbCA8YXM+LAotICoJICAgICA9IDxiYXNlPiAtIDEgaWYgb3JpZ2luYWwgPGFzPiB3YXMgemVyby4KLSAqCTxhcz4gY2xvYmJlcmVkIChpZiBub3QgPGFkPikKLSAqCTxhdD4gY2xvYmJlcmVkIChpZiBub3QgPGFkPikKLSAqICBFeGFtcGxlOgotICoJZmluZF9tc19zZXRiaXQgYTAsIGE0LCBhMCwgMAkJLS0gcmV0dXJuIGluIGEwIGluZGV4IG9mIG1zYml0IHNldCBpbiBhNAotICovCi0KLQkubWFjcm8JZmluZF9tc19zZXRiaXQgYWQsIGFzLCBhdCwgYmFzZQotI2lmIFhDSEFMX0hBVkVfTlNBCi0JbW92aQlcYXQsIDMxK1xiYXNlCi0JbnNhdQlcYXMsIFxhcwkvLyBnZXQgaW5kZXggb2YgXGFzLCBudW1iZXJlZCBmcm9tIG1zYml0ICgzMiBpZiBhYnNlbnQpCi0Jc3ViCVxhZCwgXGF0LCBcYXMJLy8gZ2V0IG51bWJlcmluZyBmcm9tIGxzYml0ICgwLi4zMSwgLTEgaWYgYWJzZW50KQotI2Vsc2UgLyogWENIQUxfSEFWRV9OU0EgKi8KLQltb3ZpCVxhdCwgXGJhc2UJLy8gc3RhcnQgd2l0aCByZXN1bHQgb2YgMCAocG9pbnQgdG8gbHNiaXQgb2YgMzIpCi0KLQliZXF6CVxhcywgMmYJCS8vIHNwZWNpYWwgY2FzZSBmb3IgemVybyBhcmd1bWVudDogcmV0dXJuIC0xCi0JYmx0dWkJXGFzLCAweDEwMDAwLCAxZgkvLyBpcyBpdCBvbmUgb2YgdGhlIDE2IGxzYml0cz8gKGlmIHNvLCBjaGVjayBsb3dlciAxNiBiaXRzKQotCWFkZGkJXGF0LCBcYXQsIDE2CS8vIG5vLCBpbmNyZW1lbnQgcmVzdWx0IHRvIHVwcGVyIDE2IGJpdHMgKG9mIDMyKQotCS8vc3JsaQlcYXMsIFxhcywgMTYJLy8gY2hlY2sgdXBwZXIgaGFsZiAoc2hpZnQgcmlnaHQgMTYgYml0cykKLQlleHR1aQlcYXMsIFxhcywgMTYsIDE2CS8vIGNoZWNrIHVwcGVyIGhhbGYgKHNoaWZ0IHJpZ2h0IDE2IGJpdHMpCi0xOglibHR1aQlcYXMsIDB4MTAwLCAxZgkvLyBpcyBpdCBvbmUgb2YgdGhlIDggbHNiaXRzPyAoaWYgc28sIGNoZWNrIGxvd2VyIDggYml0cykKLQlhZGRpCVxhdCwgXGF0LCA4CS8vIG5vLCBpbmNyZW1lbnQgcmVzdWx0IHRvIHVwcGVyIDggYml0cyAob2YgMTYpCi0Jc3JsaQlcYXMsIFxhcywgOAkvLyBzaGlmdCByaWdodCB0byBjaGVjayB1cHBlciA4IGJpdHMKLTE6CWJsdHVpCVxhcywgMHgxMCwgMWYJLy8gaXMgaXQgb25lIG9mIHRoZSA0IGxzYml0cz8gKGlmIHNvLCBjaGVjayBsb3dlciA0IGJpdHMpCi0JYWRkaQlcYXQsIFxhdCwgNAkvLyBubywgaW5jcmVtZW50IHJlc3VsdCB0byB1cHBlciA0IGJpdHMgKG9mIDgpCi0Jc3JsaQlcYXMsIFxhcywgNAkvLyBzaGlmdCByaWdodCA0IGJpdHMgdG8gY2hlY2sgdXBwZXIgaGFsZgotMToJYmx0dWkJXGFzLCAweDQsIDFmCS8vIGlzIGl0IG9uZSBvZiB0aGUgMiBsc2JpdHM/IChpZiBzbywgY2hlY2sgbG93ZXIgMiBiaXRzKQotCWFkZGkJXGF0LCBcYXQsIDIJLy8gbm8sIGluY3JlbWVudCByZXN1bHQgdG8gdXBwZXIgMiBiaXRzIChvZiA0KQotCXNybGkJXGFzLCBcYXMsIDIJLy8gc2hpZnQgcmlnaHQgMiBiaXRzIHRvIGNoZWNrIHVwcGVyIGhhbGYKLTE6CWJsdHVpCVxhcywgMHgyLCAxZgkvLyBpcyBpdCB0aGUgbHNiaXQ/Ci0JYWRkaQlcYXQsIFxhdCwgMgkvLyBubywgaW5jcmVtZW50IHJlc3VsdCB0byB1cHBlciBiaXQgKG9mIDIpCi0yOglhZGRpCVxhdCwgXGF0LCAtMQkvLyAoZnJvbSBqdXN0IGFib3ZlOiBhZGQgMTsgIGZyb20gYmVxejogcmV0dXJuIC0xKQotCS8vc3JsaQlcYXMsIFxhcywgMQotMToJCQkJLy8gZG9uZSEgXGF0IGNvbnRhaW5zIGluZGV4IG9mIG1zYml0IHNldCAob3IgLTEgaWYgbm9uZSBzZXQpCi0JLmlmCTB4XGFkIC0gMHhcYXQJLy8gZGVzdGluYXRpb24gZGlmZmVyZW50IHRoYW4gXGF0ID8gKHdvcmtzIGJlY2F1c2UgcmVncyBhcmUgYTAtYTE1KQotCW1vdglcYWQsIFxhdAkvLyB0aGVuIG1vdmUgcmVzdWx0IHRvIFxhZAotCS5lbmRpZgotI2VuZGlmIC8qIFhDSEFMX0hBVkVfTlNBICovCi0JLmVuZG0JLy8gZmluZF9tc19zZXRiaXQKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgZmluZF9sc19zZXRiaXQKLSAqCi0gKiAgVGhpcyBtYWNybyBmaW5kcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRoYXQgaXMgc2V0IGluIDxhcz4sCi0gKiAgYW5kIHJldHVybiBpdHMgaW5kZXggaW4gPGFkPi4KLSAqICBVc2FnZSBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIGZpbmRfbXNfc2V0Yml0IG1hY3JvLgotICogIEV4YW1wbGU6Ci0gKglmaW5kX2xzX3NldGJpdCBhMCwgYTQsIGEwLCAwCS0tIHJldHVybiBpbiBhMCBpbmRleCBvZiBsc2JpdCBzZXQgaW4gYTQKLSAqLwotCi0JLm1hY3JvCWZpbmRfbHNfc2V0Yml0IGFkLCBhcywgYXQsIGJhc2UKLQluZWcJXGF0LCBcYXMJLy8ga2VlcCBvbmx5IHRoZSBsZWFzdC1zaWduaWZpY2FudCBiaXQgdGhhdCBpcyBzZXQuLi4KLQlhbmQJXGFzLCBcYXQsIFxhcwkvLyAuLi4gaW4gXGFzCi0JZmluZF9tc19zZXRiaXQJXGFkLCBcYXMsIFxhdCwgXGJhc2UKLQkuZW5kbQkvLyBmaW5kX2xzX3NldGJpdAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICBmaW5kX2xzX29uZQotICoKLSAqICBTYW1lIGFzIGZpbmRfbHNfc2V0Yml0IHdpdGggYmFzZSB6ZXJvLgotICogIFNvdXJjZSAoYXMpIGFuZCBkZXN0aW5hdGlvbiAoYWQpIHJlZ2lzdGVycyBtdXN0IGJlIGRpZmZlcmVudC4KLSAqICBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLSAqLwotCi0JLm1hY3JvCWZpbmRfbHNfb25lIGFkLCBhcwotCWZpbmRfbHNfc2V0Yml0CVxhZCwgXGFzLCBcYWQsIDAKLQkuZW5kbQkvLyBmaW5kX2xzX29uZQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICBmbG9vcCwgZmxvb3BuZXosIGZsb29wZ3R6LCBmbG9vcGVuZAotICoKLSAqICBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIGZhc3QgaW5uZXIgbG9vcHMgdGhhdAotICogIHdvcmsgd2hldGhlciBvciBub3QgdGhlIExvb3BzIG9wdGlvbnMgaXMgY29uZmlndXJlZC4KLSAqICBJZiB0aGUgTG9vcHMgb3B0aW9uIGlzIGNvbmZpZ3VyZWQsIHRoZXkgc2ltcGx5IHVzZQotICogIHRoZSB6ZXJvLW92ZXJoZWFkIExPT1AgaW5zdHJ1Y3Rpb25zOyBvdGhlcndpc2UKLSAqICB0aGV5IHVzZSBleHBsaWNpdCBkZWNyZW1lbnQgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0gKgotICogIFRoZXkgYXJlIHVzZWQgaW4gcGFpcnMsIHdpdGggZmxvb3AsIGZsb29wbmV6IG9yIGZsb29wZ3R6Ci0gKiAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcCwgYW5kIGZsb29wZW5kIGF0IHRoZSBlbmQuCi0gKgotICogIEVhY2ggcGFpciBvZiBsb29wIG1hY3JvIGNhbGxzIG11c3QgYmUgZ2l2ZW4gdGhlIGxvb3AgY291bnQKLSAqICBhZGRyZXNzIHJlZ2lzdGVyIGFuZCBhIHVuaXF1ZSBsYWJlbCBmb3IgdGhhdCBsb29wLgotICoKLSAqICBFeGFtcGxlOgotICoKLSAqCW1vdmkJIGEzLCAxNiAgICAgLy8gbG9vcCAxNiB0aW1lcwotICoJZmxvb3AgICAgYTMsIG15bG9vcDEKLSAqCToKLSAqCWJuZXogICAgIGE3LCBlbmQxCS8vIGV4aXQgbG9vcCBpZiBhNyAhPSAwCi0gKgk6Ci0gKglmbG9vcGVuZCBhMywgbXlsb29wMQotICogIGVuZDE6Ci0gKgotICogIExpa2UgdGhlIExPT1AgaW5zdHJ1Y3Rpb25zLCB0aGVzZSBtYWNyb3MgY2Fubm90IGJlCi0gKiAgbmVzdGVkLCBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIGluc3RydWN0aW9uLAotICogIGNhbm5vdCBjYWxsIGZ1bmN0aW9ucyBpbnNpZGUgdGhlIGxvb3AsIGV0Yy4KLSAqICBUaGUgbG9vcCBjYW4gYmUgZXhpdGVkIGJ5IGp1bXBpbmcgdG8gdGhlIGluc3RydWN0aW9uCi0gKiAgZm9sbG93aW5nIGZsb29wZW5kIChvciBlbHNld2hlcmUgb3V0c2lkZSB0aGUgbG9vcCksCi0gKiAgb3IgY29udGludWVkIGJ5IGp1bXBpbmcgdG8gYSBOT1AgaW5zdHJ1Y3Rpb24gcGxhY2VkCi0gKiAgaW1tZWRpYXRlbHkgYmVmb3JlIGZsb29wZW5kLgotICoKLSAqICBVbmxpa2UgTE9PUCBpbnN0cnVjdGlvbnMsIHRoZSByZWdpc3RlciBwYXNzZWQgdG8gZmxvb3AqCi0gKiAgY2Fubm90IGJlIHVzZWQgaW5zaWRlIHRoZSBsb29wLCBiZWNhdXNlIGl0IGlzIHVzZWQgYXMKLSAqICB0aGUgbG9vcCBjb3VudGVyIGlmIHRoZSBMb29wcyBvcHRpb24gaXMgbm90IGNvbmZpZ3VyZWQuCi0gKiAgQW5kIGl0cyB2YWx1ZSBpcyB1bmRlZmluZWQgYWZ0ZXIgZXhpdGluZyB0aGUgbG9vcC4KLSAqICBBbmQgYmVjYXVzZSB0aGUgbG9vcCBjb3VudGVyIHJlZ2lzdGVyIGlzIGFjdGl2ZSBpbnNpZGUKLSAqICB0aGUgbG9vcCwgeW91IGNhbid0IGVhc2lseSB1c2UgdGhpcyBjb25zdHJ1Y3QgdG8gbG9vcAotICogIGFjcm9zcyBhIHJlZ2lzdGVyIGZpbGUgdXNpbmcgUk9UVyBhcyB5b3UgbWlnaHQgd2l0aCBMT09QCi0gKiAgaW5zdHJ1Y3Rpb25zLCB1bmxlc3MgeW91IGNvcHkgdGhlIGxvb3AgcmVnaXN0ZXIgYWxvbmcuCi0gKi8KLQotCS8qICBOYW1lZCBsYWJlbCB2ZXJzaW9uIG9mIHRoZSBtYWNyb3M6ICAqLwotCi0JLm1hY3JvCWZsb29wCQlhciwgZW5kbGFiZWwKLQlmbG9vcF8JCVxhciwgLkxmbG9vcHN0YXJ0X1xlbmRsYWJlbCwgLkxmbG9vcGVuZF9cZW5kbGFiZWwKLQkuZW5kbQotCi0JLm1hY3JvCWZsb29wbmV6CWFyLCBlbmRsYWJlbAotCWZsb29wbmV6XwlcYXIsIC5MZmxvb3BzdGFydF9cZW5kbGFiZWwsIC5MZmxvb3BlbmRfXGVuZGxhYmVsCi0JLmVuZG0KLQotCS5tYWNybwlmbG9vcGd0eglhciwgZW5kbGFiZWwKLQlmbG9vcGd0el8JXGFyLCAuTGZsb29wc3RhcnRfXGVuZGxhYmVsLCAuTGZsb29wZW5kX1xlbmRsYWJlbAotCS5lbmRtCi0KLQkubWFjcm8JZmxvb3BlbmQJYXIsIGVuZGxhYmVsCi0JZmxvb3BlbmRfCVxhciwgLkxmbG9vcHN0YXJ0X1xlbmRsYWJlbCwgLkxmbG9vcGVuZF9cZW5kbGFiZWwKLQkuZW5kbQotCi0JLyogIE51bWJlcmVkIGxvY2FsIGxhYmVsIHZlcnNpb24gb2YgdGhlIG1hY3JvczogICovCi0jaWYgMCAvKlVOVEVTVEVEKi8KLQkubWFjcm8JZmxvb3A4OQkJYXIKLQlmbG9vcF8JCVxhciwgOCwgOWYKLQkuZW5kbQotCi0JLm1hY3JvCWZsb29wbmV6ODkJYXIKLQlmbG9vcG5lel8JXGFyLCA4LCA5ZgotCS5lbmRtCi0KLQkubWFjcm8JZmxvb3BndHo4OQlhcgotCWZsb29wZ3R6XwlcYXIsIDgsIDlmCi0JLmVuZG0KLQotCS5tYWNybwlmbG9vcGVuZDg5CWFyCi0JZmxvb3BlbmRfCVxhciwgOGIsIDkKLQkuZW5kbQotI2VuZGlmIC8qMCovCi0KLQkvKiAgVW5kZXJseWluZyB2ZXJzaW9uIG9mIHRoZSBtYWNyb3M6ICAqLwotCi0JLm1hY3JvCWZsb29wXwlhciwgc3RhcnRsYWJlbCwgZW5kbGFiZWxyZWYKLQkuaWZkZWYJX2luZmxvb3BfCi0JLmlmCV9pbmZsb29wXwotCS5lcnIJLy8gRXJyb3I6IGZsb29wIGNhbm5vdCBiZSBuZXN0ZWQKLQkuZW5kaWYKLQkuZW5kaWYKLQkuc2V0CV9pbmZsb29wXywgMQotI2lmIFhDSEFMX0hBVkVfTE9PUFMKLQlsb29wCVxhciwgXGVuZGxhYmVscmVmCi0jZWxzZSAvKiBYQ0hBTF9IQVZFX0xPT1BTICovCi1cc3RhcnRsYWJlbDoKLQlhZGRpCVxhciwgXGFyLCAtMQotI2VuZGlmIC8qIFhDSEFMX0hBVkVfTE9PUFMgKi8KLQkuZW5kbQkvLyBmbG9vcF8KLQotCS5tYWNybwlmbG9vcG5lel8JYXIsIHN0YXJ0bGFiZWwsIGVuZGxhYmVscmVmCi0JLmlmZGVmCV9pbmZsb29wXwotCS5pZglfaW5mbG9vcF8KLQkuZXJyCS8vIEVycm9yOiBmbG9vcG5leiBjYW5ub3QgYmUgbmVzdGVkCi0JLmVuZGlmCi0JLmVuZGlmCi0JLnNldAlfaW5mbG9vcF8sIDEKLSNpZiBYQ0hBTF9IQVZFX0xPT1BTCi0JbG9vcG5leglcYXIsIFxlbmRsYWJlbHJlZgotI2Vsc2UgLyogWENIQUxfSEFWRV9MT09QUyAqLwotCWJlcXoJXGFyLCBcZW5kbGFiZWxyZWYKLVxzdGFydGxhYmVsOgotCWFkZGkJXGFyLCBcYXIsIC0xCi0jZW5kaWYgLyogWENIQUxfSEFWRV9MT09QUyAqLwotCS5lbmRtCS8vIGZsb29wbmV6XwotCi0JLm1hY3JvCWZsb29wZ3R6Xwlhciwgc3RhcnRsYWJlbCwgZW5kbGFiZWxyZWYKLQkuaWZkZWYJX2luZmxvb3BfCi0JLmlmCV9pbmZsb29wXwotCS5lcnIJLy8gRXJyb3I6IGZsb29wZ3R6IGNhbm5vdCBiZSBuZXN0ZWQKLQkuZW5kaWYKLQkuZW5kaWYKLQkuc2V0CV9pbmZsb29wXywgMQotI2lmIFhDSEFMX0hBVkVfTE9PUFMKLQlsb29wZ3R6CVxhciwgXGVuZGxhYmVscmVmCi0jZWxzZSAvKiBYQ0hBTF9IQVZFX0xPT1BTICovCi0JYmx0eglcYXIsIFxlbmRsYWJlbHJlZgotCWJlcXoJXGFyLCBcZW5kbGFiZWxyZWYKLVxzdGFydGxhYmVsOgotCWFkZGkJXGFyLCBcYXIsIC0xCi0jZW5kaWYgLyogWENIQUxfSEFWRV9MT09QUyAqLwotCS5lbmRtCS8vIGZsb29wZ3R6XwotCi0KLQkubWFjcm8JZmxvb3BlbmRfCWFyLCBzdGFydGxhYmVscmVmLCBlbmRsYWJlbAotCS5pZm5kZWYJX2luZmxvb3BfCi0JLmVycgkvLyBFcnJvcjogZmxvb3BlbmQgd2l0aG91dCBtYXRjaGluZyBmbG9vcFhYWAotCS5lbmRpZgotCS5pZmVxCV9pbmZsb29wXwotCS5lcnIJLy8gRXJyb3I6IGZsb29wZW5kIHdpdGhvdXQgbWF0Y2hpbmcgZmxvb3BYWFgKLQkuZW5kaWYKLQkuc2V0CV9pbmZsb29wXywgMAotI2lmICEgWENIQUxfSEFWRV9MT09QUwotCWJuZXoJXGFyLCBcc3RhcnRsYWJlbHJlZgotI2VuZGlmIC8qIFhDSEFMX0hBVkVfTE9PUFMgKi8KLVxlbmRsYWJlbDoKLQkuZW5kbQkvLyBmbG9vcGVuZF8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgY3JzaWwgIC0tICBjb25kaXRpb25hbCBSU0lMIChyZWFkL3NldCBpbnRlcnJ1cHQgbGV2ZWwpCi0gKgotICogIEV4ZWN1dGVzIHRoZSBSU0lMIGluc3RydWN0aW9uIGlmIGl0IGV4aXN0cywgZWxzZSBqdXN0IHJlYWRzIFBTLgotICogIFRoZSBSU0lMIGluc3RydWN0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBuZXcgZXhjZXB0aW9uIGFyY2hpdGVjdHVyZQotICogIGlmIHRoZSBpbnRlcnJ1cHQgb3B0aW9uIGlzIG5vdCBzZWxlY3RlZC4KLSAqLwotCi0JLm1hY3JvCWNyc2lsCWFyLCBuZXdsZXZlbAotI2lmIFhDSEFMX0hBVkVfT0xEX0VYQ19BUkNIIHx8IFhDSEFMX0hBVkVfSU5URVJSVVBUUwotCXJzaWwJXGFyLCBcbmV3bGV2ZWwKLSNlbHNlCi0JcnNyCVxhciwgUFMKLSNlbmRpZgotCS5lbmRtCS8vIGNyc2lsCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIHdpbmRvd19zcGlsbHs0LDgsMTJ9Ci0gKgotICogIFRoZXNlIG1hY3JvcyBzcGlsbCBjYWxsZXJzJyByZWdpc3RlciB3aW5kb3dzIHRvIHRoZSBzdGFjay4KLSAqICBUaGV5IHdvcmsgZm9yIGJvdGggcHJpdmlsZWdlZCBhbmQgbm9uLXByaXZpbGVnZWQgdGFza3MuCi0gKiAgTXVzdCBiZSBjYWxsZWQgZnJvbSBhIHdpbmRvd2VkIEFCSSBjb250ZXh0LCBlZy4gd2l0aGluCi0gKiAgYSB3aW5kb3dlZCBBQkkgZnVuY3Rpb24gKGllLiB2YWxpZCBzdGFjayBmcmFtZSwgd2luZG93Ci0gKiAgZXhjZXB0aW9ucyBlbmFibGVkLCBub3QgaW4gZXhjZXB0aW9uIG1vZGUsIGV0YykuCi0gKgotICogIFRoaXMgbWFjcm8gcmVxdWlyZXMgYSBzaW5nbGUgaW52b2NhdGlvbiBvZiB0aGUgd2luZG93X3NwaWxsX2NvbW1vbgotICogIG1hY3JvIGluIHRoZSBzYW1lIGFzc2VtYmx5IHVuaXQgYW5kIHNlY3Rpb24uCi0gKgotICogIE5vdGUgdGhhdCB1c2luZyB3aW5kb3dfc3BpbGx7NCw4LDEyfSBtYWNyb3MgaXMgbW9yZSBlZmZpY2llbnQKLSAqICB0aGFuIGNhbGxpbmcgYSBmdW5jdGlvbiBpbXBsZW1lbnRlZCB1c2luZyB3aW5kb3dfc3BpbGxfZnVuY3Rpb24sCi0gKiAgYmVjYXVzZSB0aGUgbGF0dGVyIG5lZWRzIGV4dHJhIGNvZGUgdG8gZmlndXJlIG91dCB0aGUgc2l6ZSBvZgotICogIHRoZSBjYWxsIHRvIHRoZSBzcGlsbGluZyBmdW5jdGlvbi4KLSAqCi0gKiAgRXhhbXBsZSB1c2FnZToKLSAqCi0gKgkJLnRleHQKLSAqCQkuYWxpZ24JNAotICoJCS5nbG9iYWwJc29tZV9mdW5jdGlvbgotICoJCS50eXBlCXNvbWVfZnVuY3Rpb24sQGZ1bmN0aW9uCi0gKglzb21lX2Z1bmN0aW9uOgotICoJCWVudHJ5CWExLCAxNgotICoJCToKLSAqCQk6Ci0gKgotICoJCXdpbmRvd19zcGlsbDQJLy8gc3BpbGwgd2luZG93cyBvZiBzb21lX2Z1bmN0aW9uJ3MgY2FsbGVyczsgcHJlc2VydmVzIGEwLi5hMyBvbmx5OwotICoJCQkJLy8gdG8gdXNlIHdpbmRvd19zcGlsbHs4LDEyfSBpbiB0aGlzIGV4YW1wbGUgZnVuY3Rpb24gd2UnZCBoYXZlCi0gKgkJCQkvLyB0byBpbmNyZWFzZSBzcGFjZSBhbGxvY2F0ZWQgYnkgdGhlIGVudHJ5IGluc3RydWN0aW9uLCBiZWNhdXNlCi0gKgkJCQkvLyAxNiBieXRlcyBvbmx5IGFsbG93cyBjYWxsNDsgMzIgb3IgNDggYnl0ZXMgKCtsb2NhbHMpIGFyZSBuZWVkZWQKLSAqCQkJCS8vIGZvciBjYWxsOC93aW5kb3dfc3BpbGw4IG9yIGNhbGwxMi93aW5kb3dfc3BpbGwxMiByZXNwZWN0aXZlbHkuCi0gKgkJOgotICoKLSAqCQlyZXR3Ci0gKgotICoJCXdpbmRvd19zcGlsbF9jb21tb24JLy8gaW5zdGFudGlhdGVzIGNvZGUgdXNlZCBieSB3aW5kb3dfc3BpbGw0Ci0gKgotICoKLSAqICBPbiBlbnRyeToKLSAqCW5vbmUgKGlmIHdpbmRvd19zcGlsbDQpCi0gKglzdGFjayBmcmFtZSBoYXMgZW5vdWdoIHNwYWNlIGFsbG9jYXRlZCBmb3IgY2FsbDggKGlmIHdpbmRvd19zcGlsbDgpCi0gKglzdGFjayBmcmFtZSBoYXMgZW5vdWdoIHNwYWNlIGFsbG9jYXRlZCBmb3IgY2FsbDEyIChpZiB3aW5kb3dfc3BpbGwxMikKLSAqICBPbiBleGl0OgotICoJIGE0Li5hMTUgY2xvYmJlcmVkIChpZiB3aW5kb3dfc3BpbGw0KQotICoJIGE4Li5hMTUgY2xvYmJlcmVkIChpZiB3aW5kb3dfc3BpbGw4KQotICoJYTEyLi5hMTUgY2xvYmJlcmVkIChpZiB3aW5kb3dfc3BpbGwxMikKLSAqCW5vIGNhbGxlciB3aW5kb3dzIGFyZSBpbiBsaXZlIHJlZ2lzdGVycwotICovCi0KLQkubWFjcm8Jd2luZG93X3NwaWxsNAotI2lmIFhDSEFMX0hBVkVfV0lORE9XRUQKLSMgaWYgWENIQUxfTlVNX0FSRUdTID09IDE2Ci0JbW92aQlhMTUsIDAJCQkvLyBmb3IgMTYtcmVnaXN0ZXIgZmlsZXMsIG5vIG5lZWQgdG8gY2FsbCB0byByZWFjaCB0aGUgZW5kCi0jIGVsaWYgWENIQUxfTlVNX0FSRUdTID09IDMyCi0JY2FsbDQJLkxfX3dkd3NwaWxsX2Fzc2lzdDI4CS8vIGNhbGwgZGVlcCBlbm91Z2ggdG8gY2xlYXIgb3V0IGFueSBsaXZlIGNhbGxlcnMKLSMgZWxpZiBYQ0hBTF9OVU1fQVJFR1MgPT0gNjQKLQljYWxsNAkuTF9fd2R3c3BpbGxfYXNzaXN0NjAJLy8gY2FsbCBkZWVwIGVub3VnaCB0byBjbGVhciBvdXQgYW55IGxpdmUgY2FsbGVycwotIyBlbmRpZgotI2VuZGlmCi0JLmVuZG0JLy8gd2luZG93X3NwaWxsNAotCi0JLm1hY3JvCXdpbmRvd19zcGlsbDgKLSNpZiBYQ0hBTF9IQVZFX1dJTkRPV0VECi0jIGlmIFhDSEFMX05VTV9BUkVHUyA9PSAxNgotCW1vdmkJYTE1LCAwCQkJLy8gZm9yIDE2LXJlZ2lzdGVyIGZpbGVzLCBubyBuZWVkIHRvIGNhbGwgdG8gcmVhY2ggdGhlIGVuZAotIyBlbGlmIFhDSEFMX05VTV9BUkVHUyA9PSAzMgotCWNhbGw4CS5MX193ZHdzcGlsbF9hc3Npc3QyNAkvLyBjYWxsIGRlZXAgZW5vdWdoIHRvIGNsZWFyIG91dCBhbnkgbGl2ZSBjYWxsZXJzCi0jIGVsaWYgWENIQUxfTlVNX0FSRUdTID09IDY0Ci0JY2FsbDgJLkxfX3dkd3NwaWxsX2Fzc2lzdDU2CS8vIGNhbGwgZGVlcCBlbm91Z2ggdG8gY2xlYXIgb3V0IGFueSBsaXZlIGNhbGxlcnMKLSMgZW5kaWYKLSNlbmRpZgotCS5lbmRtCS8vIHdpbmRvd19zcGlsbDgKLQotCS5tYWNybwl3aW5kb3dfc3BpbGwxMgotI2lmIFhDSEFMX0hBVkVfV0lORE9XRUQKLSMgaWYgWENIQUxfTlVNX0FSRUdTID09IDE2Ci0JbW92aQlhMTUsIDAJCQkvLyBmb3IgMTYtcmVnaXN0ZXIgZmlsZXMsIG5vIG5lZWQgdG8gY2FsbCB0byByZWFjaCB0aGUgZW5kCi0jIGVsaWYgWENIQUxfTlVNX0FSRUdTID09IDMyCi0JY2FsbDEyCS5MX193ZHdzcGlsbF9hc3Npc3QyMAkvLyBjYWxsIGRlZXAgZW5vdWdoIHRvIGNsZWFyIG91dCBhbnkgbGl2ZSBjYWxsZXJzCi0jIGVsaWYgWENIQUxfTlVNX0FSRUdTID09IDY0Ci0JY2FsbDEyCS5MX193ZHdzcGlsbF9hc3Npc3Q1MgkvLyBjYWxsIGRlZXAgZW5vdWdoIHRvIGNsZWFyIG91dCBhbnkgbGl2ZSBjYWxsZXJzCi0jIGVuZGlmCi0jZW5kaWYKLQkuZW5kbQkvLyB3aW5kb3dfc3BpbGwxMgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICB3aW5kb3dfc3BpbGxfZnVuY3Rpb24KLSAqCi0gKiAgVGhpcyBtYWNybyBvdXRwdXRzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHNwaWxsIGl0cyBjYWxsZXIncyBjYWxsZXJzJwotICogIHJlZ2lzdGVyIHdpbmRvd3MgdG8gdGhlIHN0YWNrLiAgRWcuIGl0IGNvdWxkIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci0gKiAgYSB2ZXJzaW9uIG9mIHh0aGFsX3dpbmRvd19zcGlsbCgpIHRoYXQgd29ya3MgaW4gbm9uLXByaXZpbGVnZWQgdGFza3MuCi0gKiAgVGhpcyB3b3JrcyBmb3IgYm90aCBwcml2aWxlZ2VkIGFuZCBub24tcHJpdmlsZWdlZCB0YXNrcy4KLSAqCi0gKiAgVHlwaWNhbCB1c2FnZToKLSAqCi0gKgkJLnRleHQKLSAqCQkuYWxpZ24JNAotICoJCS5nbG9iYWwJbXlfc3BpbGxfZnVuY3Rpb24KLSAqCQkudHlwZQlteV9zcGlsbF9mdW5jdGlvbixAZnVuY3Rpb24KLSAqCW15X3NwaWxsX2Z1bmN0aW9uOgotICoJCXdpbmRvd19zcGlsbF9mdW5jdGlvbgotICoKLSAqICBPbiBlbnRyeSB0byByZXN1bHRpbmcgZnVuY3Rpb246Ci0gKglub25lCi0gKiAgT24gZXhpdCBmcm9tIHJlc3VsdGluZyBmdW5jdGlvbjoKLSAqCW5vbmUgKG5vIGNhbGxlciB3aW5kb3dzIGFyZSBpbiBsaXZlIHJlZ2lzdGVycykKLSAqLwotCi0JLm1hY3JvCXdpbmRvd19zcGlsbF9mdW5jdGlvbgotI2lmIFhDSEFMX0hBVkVfV0lORE9XRUQKLSMgaWYgWENIQUxfTlVNX0FSRUdTID09IDMyCi0JZW50cnkJc3AsIDQ4Ci0JYmJjaS5sCWEwLCAzMSwgMWYJCS8vIGJyYW5jaCBpZiBjYWxsZWQgd2l0aCBjYWxsNAotCWJic2kubAlhMCwgMzAsIDJmCQkvLyBicmFuY2ggaWYgY2FsbGVkIHdpdGggY2FsbDEyCi0JY2FsbDgJLkxfX3dkd3NwaWxsX2Fzc2lzdDE2CS8vIGNhbGxlZCB3aXRoIGNhbGw4LCBvbmx5IG5lZWQgYW5vdGhlciA4Ci0JcmV0dwotMToJY2FsbDEyCS5MX193ZHdzcGlsbF9hc3Npc3QxNgkvLyBjYWxsZWQgd2l0aCBjYWxsNCwgb25seSBuZWVkIGFub3RoZXIgMTIKLQlyZXR3Ci0yOgljYWxsNAkuTF9fd2R3c3BpbGxfYXNzaXN0MTYJLy8gY2FsbGVkIHdpdGggY2FsbDEyLCBvbmx5IG5lZWQgYW5vdGhlciA0Ci0JcmV0dwotIyBlbGlmIFhDSEFMX05VTV9BUkVHUyA9PSA2NAotCWVudHJ5CXNwLCA0OAotCWJiY2kubAlhMCwgMzEsIDFmCQkvLyBicmFuY2ggaWYgY2FsbGVkIHdpdGggY2FsbDQKLQliYnNpLmwJYTAsIDMwLCAyZgkJLy8gYnJhbmNoIGlmIGNhbGxlZCB3aXRoIGNhbGwxMgotCWNhbGw0CS5MX193ZHdzcGlsbF9hc3Npc3Q1MgkvLyBjYWxsZWQgd2l0aCBjYWxsOCwgb25seSBuZWVkIGEgY2FsbDQKLQlyZXR3Ci0xOgljYWxsOAkuTF9fd2R3c3BpbGxfYXNzaXN0NTIJLy8gY2FsbGVkIHdpdGggY2FsbDQsIG9ubHkgbmVlZCBhIGNhbGw4Ci0JcmV0dwotMjoJY2FsbDEyCS5MX193ZHdzcGlsbF9hc3Npc3Q0MAkvLyBjYWxsZWQgd2l0aCBjYWxsMTIsIGNhbiBza2lwIGEgY2FsbDEyCi0JcmV0dwotIyBlbGlmIFhDSEFMX05VTV9BUkVHUyA9PSAxNgotCWVudHJ5CXNwLCAxNgotCWJiY2kubAlhMCwgMzEsIDFmCS8vIGJyYW5jaCBpZiBjYWxsZWQgd2l0aCBjYWxsNAotCWJic2kubAlhMCwgMzAsIDJmCS8vIGJyYW5jaCBpZiBjYWxsZWQgd2l0aCBjYWxsMTIKLQltb3ZpCWE3LCAwCQkvLyBjYWxsZWQgd2l0aCBjYWxsOAotCXJldHcKLTE6CW1vdmkJYTExLCAwCQkvLyBjYWxsZWQgd2l0aCBjYWxsNAotMjoJcmV0dwkJCS8vIGlmIGNhbGxlZCB3aXRoIGNhbGwxMiwgZXZlcnl0aGluZyBhbHJlYWR5IHNwaWxsZWQKLQotLy8JbW92aQlhMTUsIDAJCS8vIHRyaWNrIHRvIHNwaWxsIGFsbCBidXQgdGhlIGRpcmVjdCBjYWxsZXIKLS8vCWoJMWYKLS8vCS8vICBUaGUgZW50cnkgaW5zdHJ1Y3Rpb24gaXMgbWFnaWNhbCBpbiB0aGUgYXNzZW1ibGVyIChnZXRzIGF1dG8tYWxpZ25lZCkKLS8vCS8vICBzbyB3ZSBoYXZlIHRvIGp1bXAgdG8gaXQgdG8gYXZvaWQgZmFsbGluZyB0aHJvdWdoIHRoZSBwYWRkaW5nLgotLy8JLy8gIFdlIG5lZWQgZW50cnkvcmV0dyB0byBrbm93IHdoZXJlIHRvIHJldHVybi4KLS8vMToJZW50cnkJc3AsIDE2Ci0vLwlyZXR3Ci0jIGVsc2UKLSMgIGVycm9yICJ1bnJlY29nbml6ZWQgYWRkcmVzcyByZWdpc3RlciBmaWxlIHNpemUiCi0jIGVuZGlmCi0jZW5kaWYgLyogWENIQUxfSEFWRV9XSU5ET1dFRCAqLwotCXdpbmRvd19zcGlsbF9jb21tb24KLQkuZW5kbQkvLyB3aW5kb3dfc3BpbGxfZnVuY3Rpb24KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgd2luZG93X3NwaWxsX2NvbW1vbgotICoKLSAqICBDb21tb24gY29kZSB1c2VkIGJ5IGFueSBudW1iZXIgb2YgaW52b2NhdGlvbnMgb2YgdGhlIHdpbmRvd19zcGlsbCMjCi0gKiAgYW5kIHdpbmRvd19zcGlsbF9mdW5jdGlvbiBtYWNyb3MuCi0gKgotICogIE11c3QgYmUgaW5zdGFudGlhdGVkIGV4YWN0bHkgb25jZSB3aXRoaW4gYSBnaXZlbiBhc3NlbWJseSB1bml0LAotICogIHdpdGhpbiBjYWxsL2ogcmFuZ2Ugb2YgYW5kIHNhbWUgc2VjdGlvbiBhcyB3aW5kb3dfc3BpbGwjIwotICogIG1hY3JvIGludm9jYXRpb25zIGZvciB0aGF0IGFzc2VtYmx5IHVuaXQuCi0gKiAgKElzIGF1dG9tYXRpY2FsbHkgaW5zdGFudGlhdGVkIGJ5IHRoZSB3aW5kb3dfc3BpbGxfZnVuY3Rpb24gbWFjcm8uKQotICovCi0KLQkubWFjcm8Jd2luZG93X3NwaWxsX2NvbW1vbgotI2lmIFhDSEFMX0hBVkVfV0lORE9XRUQgJiYgKFhDSEFMX05VTV9BUkVHUyA9PSAzMiB8fCBYQ0hBTF9OVU1fQVJFR1MgPT0gNjQpCi0JLmlmbmRlZgkuTF9fd2R3c3BpbGxfZGVmaW5lZAotIyBpZiBYQ0hBTF9OVU1fQVJFR1MgPj0gNjQKLS5MX193ZHdzcGlsbF9hc3Npc3Q2MDoKLQllbnRyeQlzcCwgMzIKLQljYWxsOAkuTF9fd2R3c3BpbGxfYXNzaXN0NTIKLQlyZXR3Ci0uTF9fd2R3c3BpbGxfYXNzaXN0NTY6Ci0JZW50cnkJc3AsIDE2Ci0JY2FsbDQJLkxfX3dkd3NwaWxsX2Fzc2lzdDUyCi0JcmV0dwotLkxfX3dkd3NwaWxsX2Fzc2lzdDUyOgotCWVudHJ5CXNwLCA0OAotCWNhbGwxMgkuTF9fd2R3c3BpbGxfYXNzaXN0NDAKLQlyZXR3Ci0uTF9fd2R3c3BpbGxfYXNzaXN0NDA6Ci0JZW50cnkJc3AsIDQ4Ci0JY2FsbDEyCS5MX193ZHdzcGlsbF9hc3Npc3QyOAotCXJldHcKLSMgZW5kaWYKLS5MX193ZHdzcGlsbF9hc3Npc3QyODoKLQllbnRyeQlzcCwgNDgKLQljYWxsMTIJLkxfX3dkd3NwaWxsX2Fzc2lzdDE2Ci0JcmV0dwotLkxfX3dkd3NwaWxsX2Fzc2lzdDI0OgotCWVudHJ5CXNwLCAzMgotCWNhbGw4CS5MX193ZHdzcGlsbF9hc3Npc3QxNgotCXJldHcKLS5MX193ZHdzcGlsbF9hc3Npc3QyMDoKLQllbnRyeQlzcCwgMTYKLQljYWxsNAkuTF9fd2R3c3BpbGxfYXNzaXN0MTYKLQlyZXR3Ci0uTF9fd2R3c3BpbGxfYXNzaXN0MTY6Ci0JZW50cnkJc3AsIDE2Ci0JbW92aQlhMTUsIDAKLQlyZXR3Ci0JLnNldAkuTF9fd2R3c3BpbGxfZGVmaW5lZCwgMQotCS5lbmRpZgotI2VuZGlmIC8qIFhDSEFMX0hBVkVfV0lORE9XRUQgd2l0aCAzMiBvciA2NCBhcmVncyAqLwotCS5lbmRtCS8vIHdpbmRvd19zcGlsbF9jb21tb24KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgYmVxaTMyCi0gKgotICogIG1hY3JvIGltcGxlbWVudHMgdmVyc2lvbiBvZiBiZXFpIGZvciBhcmJpdHJhcnkgMzItYml0IGltbWlkaWF0ZSB2YWx1ZQotICoKLSAqICAgICBiZXFpMzIgYXgsIGF5LCBpbW0zMiwgbGFiZWwKLSAqCi0gKiAgQ29tcGFyZXMgdmFsdWUgaW4gcmVnaXN0ZXIgYXggd2l0aCBpbW0zMiB2YWx1ZSBhbmQganVtcHMgdG8gbGFiZWwgaWYKLSAqICBlcXVhbC4gQ2xvYmJlcmVzIHJlZ2lzdGVyIGF5IGlmIG5lZWRlZAotICoKLSAqLwotICAgLm1hY3JvIGJlcWkzMglheCwgYXksIGltbSwgbGFiZWwKLSAgICAuaWZlcSAoKFxpbW0tMSkgJiB+NykJLy8gMS4uOCA/Ci0JCWJlcWkJXGF4LCBcaW1tLCBcbGFiZWwKLSAgICAuZWxzZQotICAgICAgLmlmZXEgKFxpbW0rMSkJCS8vIC0xID8KLQkJYmVxaQlcYXgsIFxpbW0sIFxsYWJlbAotICAgICAgLmVsc2UKLSAgICAgICAgLmlmZXEgKFxpbW0pCQkvLyAwID8KLQkJYmVxeglcYXgsIFxsYWJlbAotICAgICAgICAuZWxzZQotCQkvLyAgV2UgY291bGQgYWxzbyBoYW5kbGUgaW1tZWRpYXRlcyAxMCwxMiwxNiwzMiw2NCwxMjgsMjU2Ci0JCS8vICBidXQgaXQgd291bGQgYmUgYSBsb25nIG1hY3JvLi4uCi0JCW1vdmkJXGF5LCBcaW1tCi0JCWJlcQlcYXgsIFxheSwgXGxhYmVsCi0gICAgICAgIC5lbmRpZgotICAgICAgLmVuZGlmCi0gICAgLmVuZGlmCi0gICAuZW5kbSAvLyBiZXFpMzIKLQotI2VuZGlmIC8qWFRFTlNBX0NPUkVBU01fSCovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29yZWJpdHMuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29yZWJpdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3OGFkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvcmViaXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0jaWZuZGVmIFhURU5TQV9DT1JFQklUU19ICi0jZGVmaW5lIFhURU5TQV9DT1JFQklUU19ICi0KLS8qCi0gKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0tIERPIE5PVCBNT0RJRlkgQlkgSEFORAotICoKLSAqIHh0ZW5zYS9jb3JlYml0cy5oIC0gWHRlbnNhIFNwZWNpYWwgUmVnaXN0ZXIgZmllbGQgcG9zaXRpb25zIGFuZCBtYXNrcy4KLSAqCi0gKiAoSW4gcHJldmlvdXMgcmVsZWFzZXMsIHRoZXNlIHdlcmUgZGVmaW5lZCBpbiBzcGVjcmVnLmgsIGEgZ2VuZXJhdGVkIGZpbGUuCi0gKiAgVGhpcyBmaWxlIGlzIG5vdCBnZW5lcmF0ZWQsIGkuZS4gaXQgaXMgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24gaW5kZXBlbmRlbnQuKQotICovCi0KLQotLyogIEVYQ0NBVVNFIHJlZ2lzdGVyIGZpZWxkczogICovCi0jZGVmaW5lIEVYQ0NBVVNFX0VYQ0NBVVNFX1NISUZUCTAKLSNkZWZpbmUgRVhDQ0FVU0VfRVhDQ0FVU0VfTUFTSwkweDNGCi0vKiAgRXhjZXB0aW9uIGNhdXNlcyAobW9zdGx5IGluY29tcGxldGUhKTogICovCi0jZGVmaW5lIEVYQ0NBVVNFX0lMTEVHQUwJCTAKLSNkZWZpbmUgRVhDQ0FVU0VfU1lTQ0FMTAkJMQotI2RlZmluZSBFWENDQVVTRV9JRkVUQ0hFUlJPUgkJMgotI2RlZmluZSBFWENDQVVTRV9MT0FEU1RPUkVFUlJPUgkJMwotI2RlZmluZSBFWENDQVVTRV9MRVZFTDFJTlRFUlJVUFQJNAotI2RlZmluZSBFWENDQVVTRV9BTExPQ0EJCQk1Ci0KLS8qICBQUyByZWdpc3RlciBmaWVsZHM6ICAqLwotI2RlZmluZSBQU19XT0VfU0hJRlQJCTE4Ci0jZGVmaW5lIFBTX1dPRV9NQVNLCQkweDAwMDQwMDAwCi0jZGVmaW5lIFBTX1dPRQkJCVBTX1dPRV9NQVNLCi0jZGVmaW5lIFBTX0NBTExJTkNfU0hJRlQJMTYKLSNkZWZpbmUgUFNfQ0FMTElOQ19NQVNLCQkweDAwMDMwMDAwCi0jZGVmaW5lIFBTX0NBTExJTkMobikJCSgoKG4pJjMpPDxQU19DQUxMSU5DX1NISUZUKQkvKiBuID0gMC4uMyAqLwotI2RlZmluZSBQU19PV0JfU0hJRlQJCTgKLSNkZWZpbmUgUFNfT1dCX01BU0sJCTB4MDAwMDBGMDAKLSNkZWZpbmUgUFNfT1dCKG4pCQkoKChuKSYxNSk8PFBTX09XQl9TSElGVCkJLyogbiA9IDAuLjE1IChvciAwLi43KSAqLwotI2RlZmluZSBQU19SSU5HX1NISUZUCQk2Ci0jZGVmaW5lIFBTX1JJTkdfTUFTSwkJMHgwMDAwMDBDMAotI2RlZmluZSBQU19SSU5HKG4pCQkoKChuKSYzKTw8UFNfUklOR19TSElGVCkJLyogbiA9IDAuLjMgKi8KLSNkZWZpbmUgUFNfVU1fU0hJRlQJCTUKLSNkZWZpbmUgUFNfVU1fTUFTSwkJMHgwMDAwMDAyMAotI2RlZmluZSBQU19VTQkJCVBTX1VNX01BU0sKLSNkZWZpbmUgUFNfRVhDTV9TSElGVAkJNAotI2RlZmluZSBQU19FWENNX01BU0sJCTB4MDAwMDAwMTAKLSNkZWZpbmUgUFNfRVhDTQkJCVBTX0VYQ01fTUFTSwotI2RlZmluZSBQU19JTlRMRVZFTF9TSElGVAkwCi0jZGVmaW5lIFBTX0lOVExFVkVMX01BU0sJMHgwMDAwMDAwRgotI2RlZmluZSBQU19JTlRMRVZFTChuKQkJKChuKSZQU19JTlRMRVZFTF9NQVNLKQkJLyogbiA9IDAuLjE1ICovCi0vKiAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSAoZGVwcmVjYXRlZCk6ICAqLwotI2RlZmluZSBQU19QUk9HU1RBQ0tfU0hJRlQJUFNfVU1fU0hJRlQKLSNkZWZpbmUgUFNfUFJPR1NUQUNLX01BU0sJUFNfVU1fTUFTSwotI2RlZmluZSBQU19QUk9HX1NISUZUCQlQU19VTV9TSElGVAotI2RlZmluZSBQU19QUk9HX01BU0sJCVBTX1VNX01BU0sKLSNkZWZpbmUgUFNfUFJPRwkJCVBTX1VNCi0KLS8qICBEQlJFQUtDbiByZWdpc3RlciBmaWVsZHM6ICAqLwotI2RlZmluZSBEQlJFQUtDX01BU0tfU0hJRlQJCTAKLSNkZWZpbmUgREJSRUFLQ19NQVNLX01BU0sJCTB4MDAwMDAwM0YKLSNkZWZpbmUgREJSRUFLQ19MT0FEQlJFQUtfU0hJRlQJCTMwCi0jZGVmaW5lIERCUkVBS0NfTE9BREJSRUFLX01BU0sJCTB4NDAwMDAwMDAKLSNkZWZpbmUgREJSRUFLQ19TVE9SRUJSRUFLX1NISUZUCTMxCi0jZGVmaW5lIERCUkVBS0NfU1RPUkVCUkVBS19NQVNLCQkweDgwMDAwMDAwCi0KLS8qICBERUJVR0NBVVNFIHJlZ2lzdGVyIGZpZWxkczogICovCi0jZGVmaW5lIERFQlVHQ0FVU0VfREVCVUdJTlRfU0hJRlQJNQotI2RlZmluZSBERUJVR0NBVVNFX0RFQlVHSU5UX01BU0sJMHgyMAkvKiBkZWJ1ZyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgREVCVUdDQVVTRV9CUkVBS05fU0hJRlQJCTQKLSNkZWZpbmUgREVCVUdDQVVTRV9CUkVBS05fTUFTSwkJMHgxMAkvKiBCUkVBSy5OIGluc3RydWN0aW9uICovCi0jZGVmaW5lIERFQlVHQ0FVU0VfQlJFQUtfU0hJRlQJCTMKLSNkZWZpbmUgREVCVUdDQVVTRV9CUkVBS19NQVNLCQkweDA4CS8qIEJSRUFLIGluc3RydWN0aW9uICovCi0jZGVmaW5lIERFQlVHQ0FVU0VfREJSRUFLX1NISUZUCQkyCi0jZGVmaW5lIERFQlVHQ0FVU0VfREJSRUFLX01BU0sJCTB4MDQJLyogREJSRUFLIG1hdGNoICovCi0jZGVmaW5lIERFQlVHQ0FVU0VfSUJSRUFLX1NISUZUCQkxCi0jZGVmaW5lIERFQlVHQ0FVU0VfSUJSRUFLX01BU0sJCTB4MDIJLyogSUJSRUFLIG1hdGNoICovCi0jZGVmaW5lIERFQlVHQ0FVU0VfSUNPVU5UX1NISUZUCQkwCi0jZGVmaW5lIERFQlVHQ0FVU0VfSUNPVU5UX01BU0sJCTB4MDEJLyogSUNPVU5UIHdvdWxkIGluY3JlbWVudCB0byB6ZXJvICovCi0KLSNlbmRpZiAvKlhURU5TQV9DT1JFQklUU19IKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9oYWwuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvaGFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDQ3MjUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9oYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyMiArMCwwIEBACi0jaWZuZGVmIFhURU5TQV9IQUxfSAotI2RlZmluZSBYVEVOU0FfSEFMX0gKLQotLyoKLSAqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLS0gRE8gTk9UIE1PRElGWSBCWSBIQU5ECi0gKgotICogaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9oYWwuaCAtLSBjb250YWlucyBhIGRlZmluaXRpb24gb2YgdGhlCi0gKiBDb3JlIEhBTCBpbnRlcmZhY2UuCi0gKgotICogQWxsIGRlZmluaXRpb25zIGluIHRoaXMgaGVhZGVyIGZpbGUgYXJlIGluZGVwZW5kZW50IG9mIGFueSBzcGVjaWZpYwotICogWHRlbnNhIHByb2Nlc3NvciBjb25maWd1cmF0aW9uLiAgVGh1cyBhbiBPUyBvciBvdGhlciBzb2Z0d2FyZSBjYW4KLSAqIGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSBhbmQgYmUgY29tcGlsZWQgaW50byBjb25maWd1cmF0aW9uLQotICogaW5kZXBlbmRlbnQgb2JqZWN0cyB0aGF0IGNhbiBiZSBkaXN0cmlidXRlZCBhbmQgZXZlbnR1YWxseSBsaW5rZWQKLSAqIHRvIHRoZSBIQUwgbGlicmFyeSAobGliaGFsLmEpIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWMKLSAqIGZpbmFsIGV4ZWN1dGFibGUuCi0gKgotICogQ2VydGFpbiBkZWZpbml0aW9ucywgaG93ZXZlciwgYXJlIHJlbGVhc2Utc3BlY2lmaWMgLS0gc3VjaCBhcyB0aGUKLSAqIFhUSEFMX1JFTEVBU0VfeHh4IG1hY3JvcyAob3IgYWRkaXRpb25zIG1hZGUgaW4gbGF0ZXIgcmVsZWFzZXMpLgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgotICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAkJCSBDb25zdGFudCBEZWZpbml0aW9ucwotCQkJKHNoYXJlZCB3aXRoIGFzc2VtYmx5KQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogIFNvZnR3YXJlIHJlbGVhc2UgaW5mb3JtYXRpb24gKG5vdCBjb25maWd1cmF0aW9uLXNwZWNpZmljISk6ICAqLwotI2RlZmluZSBYVEhBTF9SRUxFQVNFX01BSk9SCTEwNTAKLSNkZWZpbmUgWFRIQUxfUkVMRUFTRV9NSU5PUgkwCi0jZGVmaW5lIFhUSEFMX1JFTEVBU0VfTkFNRQkiVDEwNTAuMC0yMDAyLTA4LTA2LWVuZzAiCi0jZGVmaW5lIFhUSEFMX1JFTEVBU0VfSU5URVJOQUwJIjIwMDItMDgtMDYtZW5nMCIKLSNkZWZpbmUgWFRIQUxfUkVMX1QxMDUwCTEKLSNkZWZpbmUgWFRIQUxfUkVMX1QxMDUwXzAJMQotI2RlZmluZSBYVEhBTF9SRUxfVDEwNTBfMF8yMDAyCTEKLSNkZWZpbmUgWFRIQUxfUkVMX1QxMDUwXzBfMjAwMl8wOAkxCi0jZGVmaW5lIFhUSEFMX1JFTF9UMTA1MF8wXzIwMDJfMDhfMDYJMQotI2RlZmluZSBYVEhBTF9SRUxfVDEwNTBfMF8yMDAyXzA4XzA2X0VORzAJMQotCi0vKiAgSEFMIHZlcnNpb24gbnVtYmVycyAodGhlc2UgbmFtZXMgYXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTogICovCi0jZGVmaW5lIFhUSEFMX01BSk9SX1JFVgkJWFRIQUxfUkVMRUFTRV9NQUpPUgotI2RlZmluZSBYVEhBTF9NSU5PUl9SRVYJCVhUSEFMX1JFTEVBU0VfTUlOT1IKLS8qCi0gKiAgQSBiaXQgb2Ygc29mdHdhcmUgcmVsZWFzZSBoaXN0b3J5IG9uIHZhbHVlcyBvZiBYVEhBTF97TUFKT1IsTUlOT1J9X1JFVjoKLSAqCi0gKglSZWxlYXNlCQlNQUpPUglNSU5PUgkJQ29tbWVudAotICoJPT09PT09PQkJPT09PT0JPT09PT0JCT09PT09PT0KLSAqCVQxMDE1Lm4JCW4vYQluL2EJCShIQUwgbm90IHlldCBhdmFpbGFibGUpCi0gKglUMTAyMC57MCwxLDJ9CTAJMQkJKEhBTCBiZXRhKQotICoJVDEwMjAuezMsNH0JMAkyCQlGaXJzdCByZWxlYXNlLgotICoJVDEwMjAubiAobj40KQkwCTIgb3IgPjMJCShUQkQpCi0gKglUMTAzMC4wCQkwCTEJCShIQUwgYmV0YSkKLSAqCVQxMDMwLnsxLDJ9CTAJMwkJRXF1aXZhbGVudCB0byBmaXJzdCByZWxlYXNlLgotICoJVDEwMzAubiAobj49MykJMAk+PSAzCQkoVEJEKQotICoJVDEwNDAubgkJMTA0MAluCQlGdWxsIENIQUwgYXZhaWxhYmxlIGZyb20gVDEwNDAuMgotICoJVDEwNTAubgkJMTA1MAluCQlDdXJyZW50IHJlbGVhc2UuCi0gKgotICoKLSAqICBOb3RlOiAgdGhlcmUgaXMgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBzb2Z0d2FyZSByZWxlYXNlIHdpdGgKLSAqICB3aGljaCBzb21ldGhpbmcgaXMgY29tcGlsZWQgKGFjY2Vzc2libGUgdXNpbmcgWFRIQUxfUkVMRUFTRV8qIG1hY3JvcykKLSAqICBhbmQgdGhlIHNvZnR3YXJlIHJlbGVhc2Ugd2l0aCB3aGljaCB0aGUgSEFMIGxpYnJhcnkgd2FzIGNvbXBpbGVkCi0gKiAgKGFjY2Vzc2libGUgdXNpbmcgWHRoYWxfcmVsZWFzZV8qIGdsb2JhbCB2YXJpYWJsZXMpLiAgVGhpcwotICogIGRpc3RpbmN0aW9uIGlzIHBhcnRpY3VsYXJseSByZWxldmFudCBmb3IgdmVuZG9ycyB0aGF0IGRpc3RyaWJ1dGUKLSAqICBjb25maWd1cmF0aW9uLWluZGVwZW5kZW50IGJpbmFyaWVzIChlZy4gYW4gT1MpLCB3aGVyZSB0aGVpciBjdXN0b21lcgotICogIG1pZ2h0IGxpbmsgaXQgd2l0aCBhIEhBTCBvZiBhIGRpZmZlcmVudCBYdGVuc2Egc29mdHdhcmUgcmVsZWFzZS4KLSAqICBJbiB0aGlzIGNhc2UsIGl0IG1heSBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIE9TIHRvIHZlcmlmeSBhdCBydW4tdGltZQotICogIHdoZXRoZXIgWFRIQUxfUkVMRUFTRV8qIGFuZCBYdGhhbF9yZWxlYXNlXyogYXJlIGNvbXBhdGlibGUuCi0gKiAgW0d1aWRlbGluZXMgYXMgdG8gd2hpY2ggcmVsZWFzZSBpcyBjb21wYXRpYmxlIHdpdGggd2hpY2ggYXJlIG5vdAotICogIGN1cnJlbnRseSBwcm92aWRlZCBleHBsaWNpdGx5LCBidXQgbWlnaHQgYmUgaW5mZXJyZWQgZnJvbSByZWFkaW5nCi0gKiAgT1NLaXQgZG9jdW1lbnRhdGlvbiBmb3IgYWxsIHJlbGVhc2VzIC0tIGNvbXBhdGliaWxpdHkgaXMgYWxzbyBoaWdobHkKLSAqICBkZXBlbmRlbnQgb24gd2hpY2ggSEFMIGZlYXR1cmVzIGFyZSB1c2VkLiAgRWFjaCByZWxlYXNlIGlzIHVzdWFsbHkKLSAqICBiYWNrd2FyZCBjb21wYXRpYmxlLCB3aXRoIHZlcnkgZmV3IGV4Y2VwdGlvbnMgaWYgYW55Ll0KLSAqCi0gKiAgTm90ZXM6Ci0gKglUb3JuYWRvIDIuMCBzdXBwb3J0ZWQgaW4gVDEwMjAuMyssIFQxMDMwLjErLCBhbmQgVDEwNDAuezAsMX0gb25seS4KLSAqCVRvcm5hZG8gMi4wLjIgc3VwcG9ydGVkIGluIFQxMDQwLjIrLCBhbmQgVDEwNTAuCi0gKglDb21waWxlLXRpbWUgSEFMIHBvcnQgb2YgTnVjbGV1c1BsdXMgc3VwcG9ydGVkIGJ5IFQxMDQwLjIrIGFuZCBUMTA1MC4KLSAqLwotCi0KLS8qCi0gKiAgQXJjaGl0ZWN0dXJhbCBsaW1pdHMsIGluZGVwZW5kZW50IG9mIGNvbmZpZ3VyYXRpb24uCi0gKiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBJU0EtZGVmaW5lZCBsaW1pdHMsIG5vdCBtaWNyby1hcmNoaXRlY3R1cmUgaW1wbGVtZW50YXRpb24KLSAqICBsaW1pdHMgZW5mb3JjZWQgYnkgdGhlIFh0ZW5zYSBQcm9jZXNzb3IgR2VuZXJhdG9yICh3aGljaCBtYXkgYmUgc3RyaWN0ZXIgdGhhbgotICogIHRoZXNlIGJlbG93KS4KLSAqLwotI2RlZmluZSBYVEhBTF9NQVhfQ1BTCQk4CS8qIG1heCBudW1iZXIgb2YgY29wcm9jZXNzb3JzICgwLi43KSAqLwotI2RlZmluZSBYVEhBTF9NQVhfSU5URVJSVVBUUwkzMgkvKiBtYXggbnVtYmVyIG9mIGludGVycnVwdHMgKDAuLjMxKSAqLwotI2RlZmluZSBYVEhBTF9NQVhfSU5UTEVWRUxTCTE2CS8qIG1heCBudW1iZXIgb2YgaW50ZXJydXB0IGxldmVscyAoMC4uMTUpICovCi0JCQkJCS8qIChhcyBvZiBUMTA0MCwgaW1wbGVtZW50YXRpb24gbGltaXQgaXMgNzogMC4uNikgKi8KLSNkZWZpbmUgWFRIQUxfTUFYX1RJTUVSUwk0CS8qIG1heCBudW1iZXIgb2YgdGltZXJzIChDQ09NUEFSRTAuLkNDT01QQVJFMykgKi8KLQkJCQkJLyogKGFzIG9mIFQxMDQwLCBpbXBsZW1lbnRhdGlvbiBsaW1pdCBpcyAzOiAwLi4yKSAqLwotCi0vKiAgTWlzYzogICovCi0jZGVmaW5lIFhUSEFMX0xJVFRMRUVORElBTgkJMAotI2RlZmluZSBYVEhBTF9CSUdFTkRJQU4JCQkxCi0KLQotLyogIEludGVycnVwdCB0eXBlczogICovCi0jZGVmaW5lIFhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECTAKLSNkZWZpbmUgWFRIQUxfSU5UVFlQRV9TT0ZUV0FSRQkJMQotI2RlZmluZSBYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCTIKLSNkZWZpbmUgWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwJMwotI2RlZmluZSBYVEhBTF9JTlRUWVBFX1RJTUVSCQk0Ci0jZGVmaW5lIFhUSEFMX0lOVFRZUEVfTk1JCQk1Ci0jZGVmaW5lIFhUSEFMX01BWF9JTlRUWVBFUwkJNgkvKiBudW1iZXIgb2YgaW50ZXJydXB0IHR5cGVzICovCi0KLS8qICBUaW1lciByZWxhdGVkOiAgKi8KLSNkZWZpbmUgWFRIQUxfVElNRVJfVU5DT05GSUdVUkVECS0xCS8qIFh0aGFsX3RpbWVyX2ludGVycnVwdFtdIHZhbHVlIGZvciBub24tZXhpc3RlbnQgdGltZXJzICovCi0jZGVmaW5lIFhUSEFMX1RJTUVSX1VOQVNTSUdORUQJWFRIQUxfVElNRVJfVU5DT05GSUdVUkVECS8qIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSkgKi8KLQotCi0vKiAgQWNjZXNzIE1vZGUgYml0cyAodGVudGF0aXZlKTogICovCS8qIGJpdCBhYmJyIHVuaXQgc2hvcnRfbmFtZSAgICAgICBQUEMgZXF1IC0gRGVzY3JpcHRpb24gKi8KLSNkZWZpbmUgWFRIQUxfQU1CX0VYQ0VQVElPTgkwCS8qIDAwMSBFIEVYIGZsczogRVhjZXB0aW9uICAgICAgICBub25lICAgIC0gZ2VuZXJhdGUgZXhjZXB0aW9uIG9uIGFueSBhY2Nlc3MgKGFrYSAiaWxsZWdhbCIpICovCi0jZGVmaW5lIFhUSEFMX0FNQl9ISVRDQUNIRQkxCS8qIDAwMiBDIENIIGZsczogdXNlIENhY2hlIG9uIEhpdCB+KEkgQ0kpIC0gdXNlIGNhY2hlIG9uIGhpdCAtLSB3YXkgZnJvbSB0YWcgbWF0Y2ggW29yIEggSEMsIG9yIFUgVUNdIChJU0E6IHNhbWUsIGV4Y2VwdCBmb3IgSXNvbGF0ZSBjYXNlKSAqLwotI2RlZmluZSBYVEhBTF9BTUJfQUxMT0NBVEUJMgkvKiAwMDQgQSBBTCBmbD86IEFMbG9jYXRlICAgICAgICAgbm9uZSAgICAtIHJlZmlsbCBjYWNoZSBvbiBtaXNzIC0tIHdheSBmcm9tIExSVSBbb3IgRiBGSSBmaWxsXSAoSVNBOiBSZWFkL1dyaXRlIE1pc3MgUmVmaWxsKSAqLwotI2RlZmluZSBYVEhBTF9BTUJfV1JJVEVUSFJVCTMJLyogMDA4IFcgV1QgLS1zOiBXcml0ZVRocm91Z2ggICAgIFcgV1QgICAgLSBzdG9yZSBpbW1lZGlhdGVseSB0byBtZW1vcnkgKElTQTogc2FtZSkgKi8KLSNkZWZpbmUgWFRIQUxfQU1CX0lTT0xBVEUJNAkvKiAwMTAgSSBJUyBmbHM6IElTb2xhdGUgICAgICAgICAgbm9uZSAgICAtIHVzZSBjYWNoZSByZWdhcmRsZXNzIG9mIGhpdC12cy1taXNzIC0tIHdheSBmcm9tIHZhZGRyIChJU0E6IHVzZS1jYWNoZS1vbi1taXNzK2hpdCkgKi8KLSNkZWZpbmUgWFRIQUxfQU1CX0dVQVJECQk1CS8qIDAyMCBHIEdVID9sPzogR1VhcmQgICAgICAgICAgICBHICogICAgIC0gbm9uLXNwZWN1bGF0aXZlOyBzcGVjL3JlcGxheSByZWZzIG5vdCBwZXJtaXR0ZWQgKi8KLSNpZiAwCi0jZGVmaW5lIFhUSEFMX0FNQl9PUkRFUkVECXgJLyogMDAwIE8gT1IgZmxzOiBPUmRlcmVkICAgICAgICAgIEcgKiAgICAgLSBtZW0gYWNjZXNzZXMgY2Fubm90IGJlIG91dCBvZiBvcmRlciAqLwotI2RlZmluZSBYVEhBTF9BTUJfRlVTRVdSSVRFUwl4CS8qIDAwMCBGIEZXIC0tczogRnVzZVdyaXRlcyAgICAgICBub25lICAgIC0gYWxsb3cgY29tYmluaW5nL21lcmdpbmcgbXVsdGlwbGUgd3JpdGVzICh0byBzYW1lIGRhdGFwYXRoIGRhdGEgdW5pdCkgaW50byBvbmUgKGltcGxpZWQgYnkgd3JpdGViYWNrKSAqLwotI2RlZmluZSBYVEhBTF9BTUJfQ09IRVJFTlQJeAkvKiAwMDAgTSBNQyBmbD86IE1lbS9NUCBDb2hlcmVudCAgTSAgICAgICAtIG9uIHJlYWRzLCBvdGhlciBDUFVzL2J1cy1tYXN0ZXJzIG1heSBuZWVkIHRvIHN1cHBseSBkYXRhICovCi0jZGVmaW5lIFhUSEFMX0FNQl9UUlVTVEVECXgJLyogMDAwIFQgVFIgP2w/OiBUUnVzdGVkICAgICAgICAgIG5vbmUgICAgLSBtZW1vcnkgd2lsbCBub3QgYnVzIGVycm9yIChpZiBpdCBkb2VzLCBoYW5kbGUgYXMgZmF0YWwgaW1wcmVjaXNlIGludGVycnVwdCkgKi8KLSNkZWZpbmUgWFRIQUxfQU1CX1BSRUZFVENICXgJLyogMDAwIFAgUFIgZmw/OiBQUmVmZXRjaCAgICAgICAgIG5vbmUgICAgLSBvbiByZWZpbGwsIHJlYWQgbGluZSsxIGludG8gcHJlZmV0Y2ggYnVmZmVycyAqLwotI2RlZmluZSBYVEhBTF9BTUJfU1RSRUFNCXgJLyogMDAwIFMgU1QgPz8/OiBTVHJlYW1pbmcgICAgICAgIG5vbmUgICAgLSBhY2Nlc3Mgb25lIG9mIE4gc3RyZWFtIGJ1ZmZlcnMgKi8KLSNlbmRpZiAvKjAqLwotCi0jZGVmaW5lIFhUSEFMX0FNX0VYQ0VQVElPTgkoMTw8WFRIQUxfQU1CX0VYQ0VQVElPTikKLSNkZWZpbmUgWFRIQUxfQU1fSElUQ0FDSEUJKDE8PFhUSEFMX0FNQl9ISVRDQUNIRSkKLSNkZWZpbmUgWFRIQUxfQU1fQUxMT0NBVEUJKDE8PFhUSEFMX0FNQl9BTExPQ0FURSkKLSNkZWZpbmUgWFRIQUxfQU1fV1JJVEVUSFJVCSgxPDxYVEhBTF9BTUJfV1JJVEVUSFJVKQotI2RlZmluZSBYVEhBTF9BTV9JU09MQVRFCSgxPDxYVEhBTF9BTUJfSVNPTEFURSkKLSNkZWZpbmUgWFRIQUxfQU1fR1VBUkQJCSgxPDxYVEhBTF9BTUJfR1VBUkQpCi0jaWYgMAotI2RlZmluZSBYVEhBTF9BTV9PUkRFUkVECSgxPDxYVEhBTF9BTUJfT1JERVJFRCkKLSNkZWZpbmUgWFRIQUxfQU1fRlVTRVdSSVRFUwkoMTw8WFRIQUxfQU1CX0ZVU0VXUklURVMpCi0jZGVmaW5lIFhUSEFMX0FNX0NPSEVSRU5UCSgxPDxYVEhBTF9BTUJfQ09IRVJFTlQpCi0jZGVmaW5lIFhUSEFMX0FNX1RSVVNURUQJKDE8PFhUSEFMX0FNQl9UUlVTVEVEKQotI2RlZmluZSBYVEhBTF9BTV9QUkVGRVRDSAkoMTw8WFRIQUxfQU1CX1BSRUZFVENIKQotI2RlZmluZSBYVEhBTF9BTV9TVFJFQU0JCSgxPDxYVEhBTF9BTUJfU1RSRUFNKQotI2VuZGlmIC8qMCovCi0KLS8qCi0gKiAgQWxsb3dlZCBBY2Nlc3MgTW9kZXMgKGJpdCBjb21iaW5hdGlvbnMpLgotICoKLSAqICBDb2x1bW5zIGFyZToKLSAqICAiRk9HSVdBQ0UiCi0gKglBY2Nlc3MgbW9kZSBiaXRzIChzZWUgWFRIQUxfQU1CX3h4eCBhYm92ZSkuCi0gKgk8bGV0dGVyPiA9IGJpdCBpcyBzZXQKLSAqCSctJyAgICAgID0gYml0IGlzIGNsZWFyCi0gKgknLicgICAgICA9IGJpdCBpcyBpcnJlbGV2YW50IC8gZG9uJ3QgY2FyZSwgYXMgZm9sbG93czoKLSAqCQkJRT0xIG1ha2VzIGFsbCBvdGhlcnMgaXJyZWxldmFudAotICoJCQlXLEYgcmVsZXZhbnQgb25seSBmb3Igc3RvcmVzCi0gKiAgIjIzNDUiCi0gKglJbmRpY2F0ZXMgd2hpY2ggWHRlbnNhIHJlbGVhc2VzIHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcKLSAqCWFjY2VzcyBtb2RlLiAgUmVsZWFzZXMgZm9yIGVhY2ggY2hhcmFjdGVyIGNvbHVtbiBhcmU6Ci0gKgkJMiA9IHByaW9yIHRvIFQxMDIwLjI6ICAgVDEwMTUgKFYxLjUpLCBUMTAyMC4wLCBUMTAyMC4xCi0gKgkJMyA9IFQxMDIwLjIgYW5kIGxhdGVyOiAgVDEwMjAuMissIFQxMDMwCi0gKgkJNCA9IFQxMDQwCi0gKgkJNSA9IFQxMDUwIChtYXliZSkKLSAqCUFuZCB0aGUgY2hhcmFjdGVyIGNvbHVtbiBjb250ZW50cyBhcmU6Ci0gKgkJPG51bWJlcj4gPSBzdXBwb3J0IGJ5IHJlbGVhc2UocykKLSAqCQkiLiIgPSB1bnN1cHBvcnRlZCBieSByZWxlYXNlKHMpCi0gKgkJIj8iID0gc3VwcG9ydCB1bmtub3duCi0gKi8KLQkJCQkJLyogRk9HSVdBQ0UgMjM0NSAqLwotLyogIEZvciBpbnN0cnVjdGlvbiBmZXRjaDogICovCi0jZGVmaW5lIFhUSEFMX0ZBTV9FWENFUFRJT04JMHgwMDEJLyogLi4uLi4uLkUgMjM0NSBleGNlcHRpb24gKi8KLSNkZWZpbmUgWFRIQUxfRkFNX0lTT0xBVEUJMHgwMTIJLyogLi0tSS4tQy0gLi4uLiBpc29sYXRlICovCi0jZGVmaW5lIFhUSEFMX0ZBTV9CWVBBU1MJMHgwMDAJLyogLi0tLS4tLS0gMjM0NSBieXBhc3MgKi8KLSNkZWZpbmUgWFRIQUxfRkFNX05BQ0FDSEVECTB4MDAyCS8qIC4tLS0uLUMtIC4uLi4gY2FjaGVkIG5vLWFsbG9jYXRlIChmcm96ZW4pICovCi0jZGVmaW5lIFhUSEFMX0ZBTV9DQUNIRUQJMHgwMDYJLyogLi0tLS5BQy0gMjM0NSBjYWNoZWQgKi8KLS8qICBGb3IgZGF0YSBsb2FkOiAgKi8KLSNkZWZpbmUgWFRIQUxfTEFNX0VYQ0VQVElPTgkweDAwMQkvKiAuLi4uLi4uRSAyMzQ1IGV4Y2VwdGlvbiAqLwotI2RlZmluZSBYVEhBTF9MQU1fSVNPTEFURQkweDAxMgkvKiAuLS1JLi1DLSAyMzQ1IGlzb2xhdGUgKi8KLSNkZWZpbmUgWFRIQUxfTEFNX0JZUEFTUwkweDAwMAkvKiAuTy0tLi0tLSAyLi4uIGJ5cGFzcyBzcGVjdWxhdGl2ZSAqLwotI2RlZmluZSBYVEhBTF9MQU1fQllQQVNTRwkweDAyMAkvKiAuT0ctLi0tLSAuMzQ1IGJ5cGFzcyBndWFyZGVkICovCi0jZGVmaW5lIFhUSEFMX0xBTV9OQUNBQ0hFRAkweDAwMgkvKiAuTy0tLi1DLSAyLi4uIGNhY2hlZCBuby1hbGxvY2F0ZSBzcGVjdWxhdGl2ZSAqLwotI2RlZmluZSBYVEhBTF9MQU1fTkFDQUNIRURHCTB4MDIyCS8qIC5PRy0uLUMtIC4zNDUgY2FjaGVkIG5vLWFsbG9jYXRlIGd1YXJkZWQgKi8KLSNkZWZpbmUgWFRIQUxfTEFNX0NBQ0hFRAkweDAwNgkvKiAuLS0tLkFDLSAyMzQ1IGNhY2hlZCBzcGVjdWxhdGl2ZSAqLwotI2RlZmluZSBYVEhBTF9MQU1fQ0FDSEVERwkweDAyNgkvKiAuP0ctLkFDLSAuLi4uIGNhY2hlZCBndWFyZGVkICovCi0vKiAgRm9yIGRhdGEgc3RvcmU6ICAqLwotI2RlZmluZSBYVEhBTF9TQU1fRVhDRVBUSU9OCTB4MDAxCS8qIC4uLi4uLi5FIDIzNDUgZXhjZXB0aW9uICovCi0jZGVmaW5lIFhUSEFMX1NBTV9JU09MQVRFCTB4MDMyCS8qIC4tR0ktLUMtIDIzNDUgaXNvbGF0ZSAqLwotI2RlZmluZSBYVEhBTF9TQU1fQllQQVNTCTB4MDI4CS8qIC1PRy1XLS0tIDIzNDUgYnlwYXNzICovCi0vKmVmaW5lIFhUSEFMX1NBTV9CWVBBU1NGCTB4MDI4Ki8JLyogRi1HLVctLS0gLi4uPyBieXBhc3Mgd3JpdGUtY29tYmluZWQgKi8KLSNkZWZpbmUgWFRIQUxfU0FNX1dSSVRFVEhSVQkweDAyQQkvKiAtT0ctVy1DLSAyMzQ/IHdyaXRldGhyb3VnaCAqLwotLyplZmluZSBYVEhBTF9TQU1fV1JJVEVUSFJVRgkweDAyQSovCS8qIEYtRy1XLUMtIC4uLjUgd3JpdGV0aHJvdWdoIHdyaXRlLWNvbWJpbmVkICovCi0jZGVmaW5lIFhUSEFMX1NBTV9XUklURUFMTE9DCTB4MDJFCS8qIC1PRy1XQUMtIC4uLj8gd3JpdGV0aHJvdWdoLWFsbG9jYXRlICovCi0vKmVmaW5lIFhUSEFMX1NBTV9XUklURUFMTE9DRgkweDAyRSovCS8qIEYtRy1XQUMtIC4uLj8gd3JpdGV0aHJvdWdoLWFsbG9jYXRlIHdyaXRlLWNvbWJpbmVkICovCi0jZGVmaW5lIFhUSEFMX1NBTV9XUklURUJBQ0sJMHgwMjYJLyogRi1HLS1BQy0gLi4uNSB3cml0ZWJhY2sgKi8KLQotI2lmIDAKLS8qCi0gICAgQ2FjaGUgYXR0cmlidXRlIGVuY29kaW5nIGZvciBDQUNIRUFUVFIgKHBlciBJU0EpOgotICAgIChOb3RlOiAgaWYgdGhpcyBkaWZmZXJzIGZyb20gSVNBIFJlZiBNYW51YWwsIElTQSBoYXMgcHJlY2VkZW5jZSkKLQotCUluc3QtZmV0Y2hlcwlMb2FkcwkJU3RvcmVzCi0JLS0tLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLQotMHgwCUZDQV9FWENFUFRJT04gID9MQ0FfTkFDQUNIRURfRyoJU0NBX1dSSVRFVEhSVQkidW5jYWNoZWQiCi0weDEJRkNBX0NBQ0hFRAlMQ0FfQ0FDSEVECVNDQV9XUklURVRIUlUJY2FjaGVkCi0weDIJRkNBX0JZUEFTUwlMQ0FfQllQQVNTX0cqCVNDQV9CWVBBU1MJYnlwYXNzCi0weDMJRkNBX0NBQ0hFRAlMQ0FfQ0FDSEVECVNDQV9XUklURUFMTE9DRgl3cml0ZS1hbGxvY2F0ZQotCQkgICAgIG9yIExDQV9FWENFUFRJT04JU0NBX0VYQ0VQVElPTgkoaWYgdW5pbXBsZW1lbnRlZCkKLTB4NAlGQ0FfQ0FDSEVECUxDQV9DQUNIRUQJU0NBX1dSSVRFQkFDSwl3cml0ZS1iYWNrCi0JCSAgICAgb3IgTENBX0VYQ0VQVElPTglTQ0FfRVhDRVBUSU9OCShpZiB1bmltcGxlbWVudGVkKQotMHg1Li5ECUZDQV9FWENFUFRJT04JTENBX0VYQ0VQVElPTglTQ0FfRVhDRVBUSU9OCShyZXNlcnZlZCkKLTB4RQlGQ0FfRVhDRVBUSU9OCUxDQV9JU09MQVRFCVNDQV9JU09MQVRFCWlzb2xhdGUKLTB4RglGQ0FfRVhDRVBUSU9OCUxDQV9FWENFUFRJT04JU0NBX0VYQ0VQVElPTglpbGxlZ2FsCi0gICAgICogIFByaW9yIHRvIFQxMDIwLjI/LCBndWFyZCBmZWF0dXJlIG5vdCBzdXBwb3J0ZWQsIHRoaXMgZGVmYXVsdGVkIHRvIHNwZWN1bGF0aXZlIChubyBfRykKLSovCi0jZW5kaWYgLyowKi8KLQotCi0jaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKSAmJiAhZGVmaW5lZChfTk9DTEFOR1VBR0UpCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAJCQkgICAgIEhBTAotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQ29uc3RhbnQgdG8gYmUgY2hlY2tlZCBpbiBidWlsZCA9IChYVEhBTF9NQUpPUl9SRVY8PDE2KXxYVEhBTF9NSU5PUl9SRVYgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfcmV2X25vOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAJCQlQcm9jZXNzb3IgU3RhdGUKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBzYXZlICYgcmVzdG9yZSB0aGUgZXh0cmEgcHJvY2Vzc29yIHN0YXRlICovCi1leHRlcm4gdm9pZCB4dGhhbF9zYXZlX2V4dHJhKHZvaWQgKmJhc2UpOwotZXh0ZXJuIHZvaWQgeHRoYWxfcmVzdG9yZV9leHRyYSh2b2lkICpiYXNlKTsKLQotZXh0ZXJuIHZvaWQgeHRoYWxfc2F2ZV9jcHJlZ3Modm9pZCAqYmFzZSwgaW50KTsKLWV4dGVybiB2b2lkIHh0aGFsX3Jlc3RvcmVfY3ByZWdzKHZvaWQgKmJhc2UsIGludCk7Ci0KLS8qZXh0ZXJuIHZvaWQgeHRoYWxfc2F2ZV9hbGxfZXh0cmEodm9pZCAqYmFzZSk7Ki8KLS8qZXh0ZXJuIHZvaWQgeHRoYWxfcmVzdG9yZV9hbGxfZXh0cmEodm9pZCAqYmFzZSk7Ki8KLQotLyogc3BhY2UgZm9yIHByb2Nlc3NvciBzdGF0ZSAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9leHRyYV9zaXplOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9leHRyYV9hbGlnbjsKLS8qIHNwYWNlIGZvciBUSUUgcmVnaXN0ZXIgZmlsZXMgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfY3ByZWdzX3NpemVbWFRIQUxfTUFYX0NQU107Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50IFh0aGFsX2NwcmVnc19hbGlnbltYVEhBTF9NQVhfQ1BTXTsKLQotLyogdG90YWwgb2Ygc3BhY2UgZm9yIHRoZSBwcm9jZXNzb3Igc3RhdGUgKGZvciBUb3IyKSAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9hbGxfZXh0cmFfc2l6ZTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfYWxsX2V4dHJhX2FsaWduOwotCi0vKiBpbml0aWFsaXplIHRoZSBleHRyYSBwcm9jZXNzb3IgKi8KLS8qZXh0ZXJuIHZvaWQgeHRoYWxfaW5pdF9leHRyYSh2b2lkKTsqLwotLyogaW5pdGlhbGl6ZSB0aGUgVElFIGNvcHJvY2Vzc29yICovCi0vKmV4dGVybiB2b2lkIHh0aGFsX2luaXRfY3AoaW50KTsqLwotCi0vKiBpbml0aWFsaXplIHRoZSBleHRyYSBwcm9jZXNzb3IgKi8KLWV4dGVybiB2b2lkIHh0aGFsX2luaXRfbWVtX2V4dHJhKHZvaWQgKik7Ci0vKiBpbml0aWFsaXplIHRoZSBUSUUgY29wcm9jZXNzb3IgKi8KLWV4dGVybiB2b2lkIHh0aGFsX2luaXRfbWVtX2NwKHZvaWQgKiwgaW50KTsKLQotLyogdmFsaWRhdGUgJiBpbnZhbGlkYXRlIHRoZSBUSUUgcmVnaXN0ZXIgZmlsZSAqLwotZXh0ZXJuIHZvaWQgeHRoYWxfdmFsaWRhdGVfY3AoaW50KTsKLWV4dGVybiB2b2lkIHh0aGFsX2ludmFsaWRhdGVfY3AoaW50KTsKLQotLyogdGhlIG51bWJlciBvZiBUSUUgY29wcm9jZXNzb3JzIGNvbnRpZ3VvdXMgZnJvbSB6ZXJvIChmb3IgVG9yMikgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfbnVtX2NvcHJvY2Vzc29yczsKLQotLyogYWN0dWFsIG51bWJlciBvZiBjb3Byb2Nlc3NvcnMgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2NwX251bTsKLS8qIGluZGV4IG9mIGhpZ2hlc3QgbnVtYmVyZWQgY29wcm9jZXNzb3IsIHBsdXMgb25lICovCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9jcF9tYXg7Ci0vKiBpbmRleCBvZiBoaWdoZXN0IGFsbG93ZWQgY29wcm9jZXNzb3IgbnVtYmVyLCBwZXIgY2ZnLCBwbHVzIG9uZSAqLwotLypleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9jcF9tYXhjZmc7Ki8KLS8qIGJpdG1hc2sgb2Ygd2hpY2ggY29wcm9jZXNzb3JzIGFyZSBwcmVzZW50ICovCi1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9jcF9tYXNrOwotCi0vKiByZWFkIGFuZCB3cml0ZSBjcGVuYWJsZSByZWdpc3RlciAqLwotZXh0ZXJuIHZvaWQgeHRoYWxfc2V0X2NwZW5hYmxlKHVuc2lnbmVkKTsKLWV4dGVybiB1bnNpZ25lZCB4dGhhbF9nZXRfY3BlbmFibGUodm9pZCk7Ci0KLS8qIHJlYWQgJiB3cml0ZSBleHRyYSBzdGF0ZSByZWdpc3RlciAqLwotLypleHRlcm4gaW50IHh0aGFsX3JlYWRfZXh0cmEodm9pZCAqYmFzZSwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCAqdmFsdWUpOyovCi0vKmV4dGVybiBpbnQgeHRoYWxfd3JpdGVfZXh0cmEodm9pZCAqYmFzZSwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB2YWx1ZSk7Ki8KLQotLyogcmVhZCAmIHdyaXRlIGEgVElFIGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCi0vKmV4dGVybiBpbnQgeHRoYWxfcmVhZF9jcHJlZyh2b2lkICpiYXNlLCBpbnQgY3AsIHVuc2lnbmVkIHJlZywgdW5zaWduZWQgKnZhbHVlKTsqLwotLypleHRlcm4gaW50IHh0aGFsX3dyaXRlX2NwcmVnKHZvaWQgKmJhc2UsIGludCBjcCwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB2YWx1ZSk7Ki8KLQotLyogcmV0dXJuIGNvcHJvY2Vzc29yIG51bWJlciBiYXNlZCBvbiByZWdpc3RlciAqLwotLypleHRlcm4gaW50IHh0aGFsX3doaWNoX2NwKHVuc2lnbmVkIHJlZyk7Ki8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAJCQkJSW50ZXJydXB0cwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogdGhlIG51bWJlciBvZiBpbnRlcnJ1cHQgbGV2ZWxzICovCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9udW1faW50bGV2ZWxzOwotLyogdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9udW1faW50ZXJydXB0czsKLQotLyogbWFzayBmb3IgbGV2ZWwgb2YgaW50ZXJydXB0cyAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9pbnRsZXZlbF9tYXNrW1hUSEFMX01BWF9JTlRMRVZFTFNdOwotLyogbWFzayBmb3IgbGV2ZWwgMCB0byBOIGludGVycnVwdHMgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfaW50bGV2ZWxfYW5kYmVsb3dfbWFza1tYVEhBTF9NQVhfSU5UTEVWRUxTXTsKLQotLyogbGV2ZWwgb2YgZWFjaCBpbnRlcnJ1cHQgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2ludGxldmVsW1hUSEFMX01BWF9JTlRFUlJVUFRTXTsKLQotLyogdHlwZSBwZXIgaW50ZXJydXB0ICovCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9pbnR0eXBlW1hUSEFMX01BWF9JTlRFUlJVUFRTXTsKLQotLyogbWFza3Mgb2YgZWFjaCB0eXBlIG9mIGludGVycnVwdCAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9pbnR0eXBlX21hc2tbWFRIQUxfTUFYX0lOVFRZUEVTXTsKLQotLyogaW50ZXJydXB0IG51bWJlcnMgYXNzaWduZWQgdG8gZWFjaCB0aW1lciBpbnRlcnJ1cHQgKi8KLWV4dGVybiBjb25zdCBpbnQgWHRoYWxfdGltZXJfaW50ZXJydXB0W1hUSEFMX01BWF9USU1FUlNdOwotCi0vKioqICBWaXJ0dWFsIGludGVycnVwdCBwcmlvcml0aXphdGlvbjogICoqKi8KLQotLyogIENvbnZlcnQgYmV0d2VlbiBpbnRlcnJ1cHQgbGV2ZWxzIChhcyBwZXIgUFMuSU5UTEVWRUwpIGFuZCB2aXJ0dWFsIGludGVycnVwdCBwcmlvcml0aWVzOiAgKi8KLWV4dGVybiB1bnNpZ25lZAl4dGhhbF92cHJpX3RvX2ludGxldmVsKHVuc2lnbmVkIHZwcmkpOwotZXh0ZXJuIHVuc2lnbmVkCXh0aGFsX2ludGxldmVsX3RvX3ZwcmkodW5zaWduZWQgaW50bGV2ZWwpOwotCi0vKiAgRW5hYmxlcy9kaXNhYmxlcyBnaXZlbiBzZXQgKG1hc2spIG9mIGludGVycnVwdHM7IHJldHVybnMgcHJldmlvdXMgZW5hYmxlZC1tYXNrIG9mIGFsbCBpbnRzOiAgKi8KLWV4dGVybiB1bnNpZ25lZAl4dGhhbF9pbnRfZW5hYmxlKHVuc2lnbmVkKTsKLWV4dGVybiB1bnNpZ25lZAl4dGhhbF9pbnRfZGlzYWJsZSh1bnNpZ25lZCk7Ci0KLS8qICBTZXQvZ2V0IHZpcnR1YWwgcHJpb3JpdHkgb2YgYW4gaW50ZXJydXB0OiAgKi8KLWV4dGVybiBpbnQJeHRoYWxfc2V0X2ludF92cHJpKGludCBpbnRudW0sIGludCB2cHJpKTsKLWV4dGVybiBpbnQJeHRoYWxfZ2V0X2ludF92cHJpKGludCBpbnRudW0pOwotCi0vKiAgU2V0L2dldCBpbnRlcnJ1cHQgbG9ja291dCBsZXZlbCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byB2aXJ0dWFsIHByaW9yaXR5IGRhdGEgc3RydWN0dXJlczogICovCi1leHRlcm4gdm9pZAl4dGhhbF9zZXRfdnByaV9sb2NrbGV2ZWwodW5zaWduZWQgaW50bGV2ZWwpOwotZXh0ZXJuIHVuc2lnbmVkCXh0aGFsX2dldF92cHJpX2xvY2tsZXZlbCh2b2lkKTsKLQotLyogIFNldC9nZXQgY3VycmVudCB2aXJ0dWFsIGludGVycnVwdCBwcmlvcml0eTogICovCi1leHRlcm4gdW5zaWduZWQJeHRoYWxfc2V0X3ZwcmkodW5zaWduZWQgdnByaSk7Ci1leHRlcm4gdW5zaWduZWQJeHRoYWxfZ2V0X3ZwcmkodW5zaWduZWQgdnByaSk7Ci1leHRlcm4gdW5zaWduZWQJeHRoYWxfc2V0X3ZwcmlfaW50bGV2ZWwodW5zaWduZWQgaW50bGV2ZWwpOwotZXh0ZXJuIHVuc2lnbmVkCXh0aGFsX3NldF92cHJpX2xvY2sodm9pZCk7Ci0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIAkJCUdlbmVyaWMgSW50ZXJydXB0IFRyYW1wb2xpbmluZyBTdXBwb3J0Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHZvaWQgKFh0SGFsVm9pZEZ1bmMpKHZvaWQpOwotCi0vKgotICogIEJpdG1hc2sgb2YgaW50ZXJydXB0cyBjdXJyZW50bHkgdHJhbXBvbGluaW5nIGRvd246Ci0gKi8KLWV4dGVybiB1bnNpZ25lZCBYdGhhbF90cmFtX3BlbmRpbmc7Ci0KLS8qCi0gKiAgQml0bWFzayBvZiB3aGljaCBpbnRlcnJ1cHRzIGN1cnJlbnRseSB0cmFtcG9saW5pbmcgZG93bgotICogIHN5bmNocm9ub3VzbHkgYXJlIGFjdHVhbGx5IGVuYWJsZWQ7IHRoaXMgYml0bWFzayBpcyBuZWNlc3NhcnkKLSAqICBiZWNhdXNlIElOVEVOQUJMRSBjYW5ub3QgaG9sZCB0aGF0IHN0YXRlIChzeW5jLXRyYW1wb2xpbmluZwotICogIGludGVycnVwdHMgbXVzdCBiZSBrZXB0IGRpc2FibGVkIHdoaWxlIHRyYW1wb2xpbmluZyk7Ci0gKiAgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGFueSBiaXQgc2V0IGhlcmUgaXMgbm90IHNldAotICogIGluIElOVEVOQUJMRSwgYW5kIHZpY2UtdmVyc2E7IG9uY2UgYSBzeW5jLXRyYW1wb2xpbmUgaXMKLSAqICBoYW5kbGVkIChhdCBsZXZlbCBvbmUpLCBpdHMgZW5hYmxlIGJpdCBtdXN0IGJlIG1vdmVkIGZyb20KLSAqICBoZXJlIHRvIElOVEVOQUJMRToKLSAqLwotZXh0ZXJuIHVuc2lnbmVkIFh0aGFsX3RyYW1fZW5hYmxlZDsKLQotLyoKLSAqICBCaXRtYXNrIG9mIGludGVycnVwdHMgY29uZmlndXJlZCBmb3Igc3luYyB0cmFtcG9saW5pbmc6Ci0gKi8KLWV4dGVybiB1bnNpZ25lZCBYdGhhbF90cmFtX3N5bmM7Ci0KLQotLyogIFRyYW1wb2xpbmUgc3VwcG9ydCBmdW5jdGlvbnM6ICAqLwotZXh0ZXJuIHVuc2lnbmVkICB4dGhhbF90cmFtX3BlbmRpbmdfdG9fc2VydmljZSggdm9pZCApOwotZXh0ZXJuIHZvaWQgICAgICB4dGhhbF90cmFtX2RvbmUoIHVuc2lnbmVkIHNlcnZpY2VkX21hc2sgKTsKLWV4dGVybiBpbnQgICAgICAgeHRoYWxfdHJhbV9zZXRfc3luYyggaW50IGludG51bSwgaW50IHN5bmMgKTsKLWV4dGVybiBYdEhhbFZvaWRGdW5jKiB4dGhhbF9zZXRfdHJhbV90cmlnZ2VyX2Z1bmMoIFh0SGFsVm9pZEZ1bmMgKnRyaWdnZXJfZm4gKTsKLQotLyogIElOVEVOQUJMRSxJTlRSRUFELElOVFNFVCxJTlRDTEVBUiByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zOiAgKi8KLWV4dGVybiB1bnNpZ25lZCAgeHRoYWxfZ2V0X2ludGVuYWJsZSggdm9pZCApOwotZXh0ZXJuIHZvaWQgICAgICB4dGhhbF9zZXRfaW50ZW5hYmxlKCB1bnNpZ25lZCApOwotZXh0ZXJuIHVuc2lnbmVkICB4dGhhbF9nZXRfaW50cmVhZCggdm9pZCApOwotZXh0ZXJuIHZvaWQgICAgICB4dGhhbF9zZXRfaW50c2V0KCB1bnNpZ25lZCApOwotZXh0ZXJuIHZvaWQgICAgICB4dGhhbF9zZXRfaW50Y2xlYXIoIHVuc2lnbmVkICk7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAJCQkJUmVnaXN0ZXIgV2luZG93cwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogbnVtYmVyIG9mIHJlZ2lzdGVycyBpbiByZWdpc3RlciB3aW5kb3cgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX251bV9hcmVnczsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9hcmVnc19sb2cyOwotCi0vKiAgVGhpcyBzcGlsbCBhbnkgbGl2ZSByZWdpc3RlciB3aW5kb3dzIChvdGhlciB0aGFuIHRoZSBjYWxsZXIncyk6ICAqLwotZXh0ZXJuIHZvaWQgICAgICB4dGhhbF93aW5kb3dfc3BpbGwoIHZvaWQgKTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIAkJCQlDYWNoZQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc2l6ZSBvZiB0aGUgY2FjaGUgbGluZXMgaW4gbG9nMihieXRlcykgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2ljYWNoZV9saW5ld2lkdGg7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9kY2FjaGVfbGluZXdpZHRoOwotLyogc2l6ZSBvZiB0aGUgY2FjaGUgbGluZXMgaW4gYnl0ZXMgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBYdGhhbF9pY2FjaGVfbGluZXNpemU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgWHRoYWxfZGNhY2hlX2xpbmVzaXplOwotLyogbnVtYmVyIG9mIGNhY2hlIHNldHMgaW4gbG9nMihsaW5lcyBwZXIgd2F5KSAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaWNhY2hlX3NldHdpZHRoOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfZGNhY2hlX3NldHdpZHRoOwotLyogY2FjaGUgc2V0IGFzc29jaWF0aXZpdHkgKG51bWJlciBvZiB3YXlzKSAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaWNhY2hlX3dheXM7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9kY2FjaGVfd2F5czsKLS8qIHNpemUgb2YgdGhlIGNhY2hlcyBpbiBieXRlcyAod2F5cyAqIDJeKGxpbmV3aWR0aCArIHNldHdpZHRoKSkgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2ljYWNoZV9zaXplOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfZGNhY2hlX3NpemU7Ci0vKiBjYWNoZSBmZWF0dXJlcyAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfZGNhY2hlX2lzX3dyaXRlYmFjazsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2ljYWNoZV9saW5lX2xvY2thYmxlOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfZGNhY2hlX2xpbmVfbG9ja2FibGU7Ci0KLS8qIGNhY2hlIGF0dHJpYnV0ZSByZWdpc3RlciBjb250cm9sICh1c2VkIGJ5IG90aGVyIEhBTCByb3V0aW5lcykgKi8KLWV4dGVybiB1bnNpZ25lZCB4dGhhbF9nZXRfY2FjaGVhdHRyKCB2b2lkICk7Ci1leHRlcm4gdW5zaWduZWQgeHRoYWxfZ2V0X2ljYWNoZWF0dHIoIHZvaWQgKTsKLWV4dGVybiB1bnNpZ25lZCB4dGhhbF9nZXRfZGNhY2hlYXR0ciggdm9pZCApOwotZXh0ZXJuIHZvaWQgICAgIHh0aGFsX3NldF9jYWNoZWF0dHIoIHVuc2lnbmVkICk7Ci1leHRlcm4gdm9pZCAgICAgeHRoYWxfc2V0X2ljYWNoZWF0dHIoIHVuc2lnbmVkICk7Ci1leHRlcm4gdm9pZCAgICAgeHRoYWxfc2V0X2RjYWNoZWF0dHIoIHVuc2lnbmVkICk7Ci0KLS8qIGluaXRpYWxpemUgY2FjaGUgc3VwcG9ydCAobXVzdCBiZSBjYWxsZWQgb25jZSBhdCBzdGFydHVwLCBiZWZvcmUgYWxsIG90aGVyIGNhY2hlIGNhbGxzKSAqLwotLypleHRlcm4gdm9pZCB4dGhhbF9jYWNoZV9zdGFydGluaXQoIHZvaWQgKTsqLwotLyogcmVzZXQgY2FjaGVzICovCi0vKmV4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9yZXNldCggdm9pZCApOyovCi0vKmV4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9yZXNldCggdm9pZCApOyovCi0vKiBlbmFibGUgY2FjaGVzICovCi1leHRlcm4gdm9pZCB4dGhhbF9pY2FjaGVfZW5hYmxlKCB2b2lkICk7CS8qIERFUFJFQ0FURUQgKi8KLWV4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9lbmFibGUoIHZvaWQgKTsJLyogREVQUkVDQVRFRCAqLwotLyogZGlzYWJsZSBjYWNoZXMgKi8KLWV4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9kaXNhYmxlKCB2b2lkICk7CS8qIERFUFJFQ0FURUQgKi8KLWV4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9kaXNhYmxlKCB2b2lkICk7CS8qIERFUFJFQ0FURUQgKi8KLQotLyogaW52YWxpZGF0ZSB0aGUgY2FjaGVzICovCi1leHRlcm4gdm9pZCB4dGhhbF9pY2FjaGVfYWxsX2ludmFsaWRhdGUoIHZvaWQgKTsKLWV4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9hbGxfaW52YWxpZGF0ZSggdm9pZCApOwotZXh0ZXJuIHZvaWQgeHRoYWxfaWNhY2hlX3JlZ2lvbl9pbnZhbGlkYXRlKCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaXplICk7Ci1leHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfcmVnaW9uX2ludmFsaWRhdGUoIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNpemUgKTsKLWV4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9saW5lX2ludmFsaWRhdGUodm9pZCAqYWRkcik7Ci1leHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfbGluZV9pbnZhbGlkYXRlKHZvaWQgKmFkZHIpOwotLyogd3JpdGUgZGlydHkgZGF0YSBiYWNrICovCi1leHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfYWxsX3dyaXRlYmFjayggdm9pZCApOwotZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX3JlZ2lvbl93cml0ZWJhY2soIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNpemUgKTsKLWV4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9saW5lX3dyaXRlYmFjayh2b2lkICphZGRyKTsKLS8qIHdyaXRlIGRpcnR5IGRhdGEgYmFjayBhbmQgaW52YWxpZGF0ZSAqLwotZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX2FsbF93cml0ZWJhY2tfaW52KCB2b2lkICk7Ci1leHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfcmVnaW9uX3dyaXRlYmFja19pbnYoIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNpemUgKTsKLWV4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9saW5lX3dyaXRlYmFja19pbnYodm9pZCAqYWRkcik7Ci0vKiBwcmVmZXRjaCBhbmQgbG9jayBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlIGludG8gY2FjaGUgKi8KLWV4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9yZWdpb25fbG9jayggdm9pZCAqYWRkciwgdW5zaWduZWQgc2l6ZSApOwotZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX3JlZ2lvbl9sb2NrKCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaXplICk7Ci1leHRlcm4gdm9pZCB4dGhhbF9pY2FjaGVfbGluZV9sb2NrKHZvaWQgKmFkZHIpOwotZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX2xpbmVfbG9jayh2b2lkICphZGRyKTsKLS8qIHVubG9jayBmcm9tIGNhY2hlICovCi1leHRlcm4gdm9pZCB4dGhhbF9pY2FjaGVfYWxsX3VubG9jayggdm9pZCApOwotZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX2FsbF91bmxvY2soIHZvaWQgKTsKLWV4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9yZWdpb25fdW5sb2NrKCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaXplICk7Ci1leHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfcmVnaW9uX3VubG9jayggdm9pZCAqYWRkciwgdW5zaWduZWQgc2l6ZSApOwotZXh0ZXJuIHZvaWQgeHRoYWxfaWNhY2hlX2xpbmVfdW5sb2NrKHZvaWQgKmFkZHIpOwotZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX2xpbmVfdW5sb2NrKHZvaWQgKmFkZHIpOwotCi0KLS8qIHN5bmMgaWNhY2hlIGFuZCBtZW1vcnkgKi8KLWV4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9zeW5jKCB2b2lkICk7Ci0vKiBzeW5jIGRjYWNoZSBhbmQgbWVtb3J5ICovCi1leHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfc3luYyggdm9pZCApOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIAkJCQlEZWJ1ZwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogIDEgaWYgZGVidWcgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgaWYgbm90OiAgKi8KLWV4dGVybiBjb25zdCBpbnQgWHRoYWxfZGVidWdfY29uZmlndXJlZDsKLQotLyogIE51bWJlciBvZiBpbnN0cnVjdGlvbiBhbmQgZGF0YSBicmVhayByZWdpc3RlcnM6ICAqLwotZXh0ZXJuIGNvbnN0IGludCBYdGhhbF9udW1faWJyZWFrOwotZXh0ZXJuIGNvbnN0IGludCBYdGhhbF9udW1fZGJyZWFrOwotCi0vKiAgU2V0IChwbGFudCkgYW5kIHJlbW92ZSBzb2Z0d2FyZSBicmVha3BvaW50LCBib3RoIHN5bmNocm9uaXppbmcgY2FjaGU6ICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCB4dGhhbF9zZXRfc29mdF9icmVhayh2b2lkICphZGRyKTsKLWV4dGVybiB2b2lkICAgICAgICAgeHRoYWxfcmVtb3ZlX3NvZnRfYnJlYWsodm9pZCAqYWRkciwgdW5zaWduZWQgaW50KTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIAkJCQlEaXNhc3NlbWJsZXIKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qICBNYXggZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgcmV0dXJuIGJ1ZmZlciBmb3IgYSBkaXNhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gKGhpbnQgb25seSk6ICAqLwotI2RlZmluZSBYVEhBTF9ESVNBU01fQlVGU0laRQk4MAotCi0vKiAgRGlzYXNzZW1ibHkgb3B0aW9uIGJpdHMgZm9yIHNlbGVjdGluZyB3aGF0IHRvIHJldHVybjogICovCi0jZGVmaW5lIFhUSEFMX0RJU0FTTV9PUFRfQUREUgkweDAwMDEJLyogZGlzcGxheSBhZGRyZXNzICovCi0jZGVmaW5lIFhUSEFMX0RJU0FTTV9PUFRfT1BIRVgJMHgwMDAyCS8qIGRpc3BsYXkgb3Bjb2RlIGJ5dGVzIGluIGhleCAqLwotI2RlZmluZSBYVEhBTF9ESVNBU01fT1BUX09QQ09ERQkweDAwMDQJLyogZGlzcGxheSBvcGNvZGUgbmFtZSAobW5lbW9uaWMpICovCi0jZGVmaW5lIFhUSEFMX0RJU0FTTV9PUFRfUEFSTVMJMHgwMDA4CS8qIGRpc3BsYXkgcGFyYW1ldGVycyAqLwotI2RlZmluZSBYVEhBTF9ESVNBU01fT1BUX0FMTAkweDBGRkYJLyogZGlzcGxheSBldmVyeXRoaW5nICovCi0KLS8qIHJvdXRpbmUgdG8gZ2V0IGEgc3RyaW5nIGZvciB0aGUgZGlzYXNzZW1ibGVkIGluc3RydWN0aW9uICovCi1leHRlcm4gaW50IHh0aGFsX2Rpc2Fzc2VtYmxlKCB1bnNpZ25lZCBjaGFyICppbnN0cl9idWYsIHZvaWQgKnRndF9hZGRyLAotCQkgICAgICAgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBidWZsZW4sIHVuc2lnbmVkIG9wdGlvbnMgKTsKLQotLyogcm91dGluZSB0byBnZXQgdGhlIHNpemUgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uIFJldHVybnMgMCBmb3IKLSAgIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KLWV4dGVybiBpbnQgeHRoYWxfZGlzYXNzZW1ibGVfc2l6ZSggdW5zaWduZWQgY2hhciAqaW5zdHJfYnVmICk7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAJCQkJQ29yZSBDb3VudGVyCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBjb3VudGVyIGluZm8gKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfY2NvdW50OwkvKiBzZXQgaWYgQ0NPVU5UIHJlZ2lzdGVyIHByZXNlbnQgKi8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9jY29tcGFyZTsJLyogbnVtYmVyIG9mIENDT01QQVJFbiByZWdpc3RlcnMgKi8KLQotLyogZ2V0IENDT1VOVCByZWdpc3RlciAoaWYgbm90IHByZXNlbnQgcmV0dXJuIDApICovCi1leHRlcm4gdW5zaWduZWQgeHRoYWxfZ2V0X2Njb3VudCh2b2lkKTsKLQotLyogc2V0IGFuZCBnZXQgQ0NPTVBBUkVuIHJlZ2lzdGVycyAoaWYgbm90IHByZXNlbnQsIGdldCByZXR1cm5zIDApICovCi1leHRlcm4gdm9pZCAgICAgeHRoYWxfc2V0X2Njb21wYXJlKGludCwgdW5zaWduZWQpOwotZXh0ZXJuIHVuc2lnbmVkIHh0aGFsX2dldF9jY29tcGFyZShpbnQpOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJSW5zdHJ1Y3Rpb24vRGF0YSBSQU0vUk9NIEFjY2VzcwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZXh0ZXJuIHZvaWQqIHh0aGFsX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbGVuKTsKLWV4dGVybiB2b2lkKiB4dGhhbF9iY29weShjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgdW5zaWduZWQgbGVuKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNUCBTeW5jaHJvbml6YXRpb24KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4gaW50ICAgICAgeHRoYWxfY29tcGFyZV9hbmRfc2V0KCBpbnQgKmFkZHIsIGludCB0ZXN0X3ZhbCwgaW50IGNvbXBhcmVfdmFsICk7Ci1leHRlcm4gdW5zaWduZWQgeHRoYWxfZ2V0X3ByaWQoIHZvaWQgKTsKLQotLypleHRlcm4gY29uc3QgY2hhciAgWHRoYWxfaGF2ZV9zMzJjMWk7Ki8KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfcHJpZDsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzY2VsbGFuZW91cwotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfcmVsZWFzZV9tYWpvcjsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX3JlbGVhc2VfbWlub3I7Ci1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0ICBYdGhhbF9yZWxlYXNlX25hbWU7Ci1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0ICBYdGhhbF9yZWxlYXNlX2ludGVybmFsOwotCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9tZW1vcnlfb3JkZXI7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX3dpbmRvd2VkOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9kZW5zaXR5OwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9ib29sZWFuczsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfbG9vcHM7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX25zYTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfbWlubWF4OwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9zZXh0OwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9jbGFtcHM7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX21hYzE2OwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9tdWwxNjsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfZnA7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX3NwZWN1bGF0aW9uOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9leGNlcHRpb25zOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfeGVhX3ZlcnNpb247Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX2ludGVycnVwdHM7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX2hpZ2hsZXZlbF9pbnRlcnJ1cHRzOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9ubWk7Ci0KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBYdGhhbF9udW1fd3JpdGVidWZmZXJfZW50cmllczsKLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfYnVpbGRfdW5pcXVlX2lkOwotLyogIFJlbGVhc2UgaW5mbyBmb3IgaGFyZHdhcmUgdGFyZ2V0ZWQgYnkgc29mdHdhcmUgdXBncmFkZXM6ICAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaHdfY29uZmlnaWQwOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaHdfY29uZmlnaWQxOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaHdfcmVsZWFzZV9tYWpvcjsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2h3X3JlbGVhc2VfbWlub3I7Ci1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0ICBYdGhhbF9od19yZWxlYXNlX25hbWU7Ci1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0ICBYdGhhbF9od19yZWxlYXNlX2ludGVybmFsOwotCi0KLS8qICBJbnRlcm5hbCBtZW1vcmllcy4uLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfbnVtX2luc3Ryb207Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9udW1faW5zdHJhbTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9kYXRhcm9tOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfbnVtX2RhdGFyYW07Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9udW1feGxtaTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2luc3Ryb21fdmFkZHJbMV07Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9pbnN0cm9tX3BhZGRyWzFdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaW5zdHJvbV9zaXplIFsxXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2luc3RyYW1fdmFkZHJbMV07Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9pbnN0cmFtX3BhZGRyWzFdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaW5zdHJhbV9zaXplIFsxXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2RhdGFyb21fdmFkZHJbMV07Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9kYXRhcm9tX3BhZGRyWzFdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfZGF0YXJvbV9zaXplIFsxXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2RhdGFyYW1fdmFkZHJbMV07Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9kYXRhcmFtX3BhZGRyWzFdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfZGF0YXJhbV9zaXplIFsxXTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX3hsbWlfdmFkZHJbMV07Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF94bG1pX3BhZGRyWzFdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfeGxtaV9zaXplIFsxXTsKLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBNYW5hZ2VtZW50IFVuaXQKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfc3Bhbm5pbmdfd2F5OwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9pZGVudGl0eV9tYXA7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX21pbWljX2NhY2hlYXR0cjsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfeGx0X2NhY2hlYXR0cjsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfY2FjaGVhdHRyOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV90bGJzOwotCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9tbXVfYXNpZF9iaXRzOwkJLyogMCAuLiA4ICovCi1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9tbXVfYXNpZF9rZXJuZWw7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9tbXVfcmluZ3M7CQkvKiAxIC4uIDQgKHBlcmhhcHMgMCBpZiBubyBNTVUgYW5kL29yIG5vIHByb3RlY3Rpb24/KSAqLwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfbW11X3JpbmdfYml0czsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX21tdV9zcl9iaXRzOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfbW11X2NhX2JpdHM7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9tbXVfbWF4X3B0ZV9wYWdlX3NpemU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9tbXVfbWluX3B0ZV9wYWdlX3NpemU7Ci0KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2l0bGJfd2F5X2JpdHM7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9pdGxiX3dheXM7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9pdGxiX2FyZl93YXlzOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfZHRsYl93YXlfYml0czsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2R0bGJfd2F5czsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2R0bGJfYXJmX3dheXM7Ci0KLS8qICBDb252ZXJ0IGJldHdlZW4gdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzICh0aHJvdWdoIHN0YXRpYyBtYXBzIG9ubHkpOiAgKi8KLS8qKiogV0FSTklORzogdGhlc2UgdHdvIGZ1bmN0aW9ucyBtYXkgZ28gYXdheSBpbiBhIGZ1dHVyZSByZWxlYXNlOyBkb24ndCBkZXBlbmQgb24gdGhlbSEgKioqLwotZXh0ZXJuIGludCAgeHRoYWxfc3RhdGljX3YycCggdW5zaWduZWQgdmFkZHIsIHVuc2lnbmVkICpwYWRkcnAgKTsKLWV4dGVybiBpbnQgIHh0aGFsX3N0YXRpY19wMnYoIHVuc2lnbmVkIHBhZGRyLCB1bnNpZ25lZCAqdmFkZHJwLCB1bnNpZ25lZCBjYWNoZWQgKTsKLQotI2lmIDAKLS8qKioqKioqKioqKioqKioqKioqICAgRVhQRVJJTUVOVEFMIEFORCBURU5UQVRJVkUgT05MWSAgICoqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFhUSEFMX01NVV9QQUdFU1pfQ09VTlRfTUFYCTgJLyogbWF4aW11bSBudW1iZXIgb2YgZGlmZmVyZW50IHBhZ2Ugc2l6ZXMgKi8KLWV4dGVybiBjb25zdCBjaGFyCVh0aGFsX21tdV9wYWdlc3pfY291bnQ7CQkvKiAwIC4uIDgJCW51bWJlciBvZiBkaWZmZXJlbnQgcGFnZSBzaXplcyBjb25maWd1cmVkICovCi0KLS8qICBOb3RlOiAgdGhlIGZvbGxvd2luZyB0YWJsZSBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgcGFnZSBzaXplcyBpbiBpbmNyZWFzaW5nIG9yZGVyOiAqLwotZXh0ZXJuIGNvbnN0IGNoYXIJWHRoYWxfbW11X3BhZ2Vzel9sb2cyW1hUSEFMX01NVV9QQUdFU1pfQ09VTlRfTUFYXTsJLyogMTAgLi4gMjggKDAgcGFzdCBjb3VudCkgKi8KLQotLyogIFNvcnRlZCAoaW5jcmVhc2luZykgdGFibGUgb2YgcGFnZSBzaXplcywgdGhhdCBpbmRleGVzIGludG8gdGhlIGFib3ZlIHRhYmxlOiAqLwotZXh0ZXJuIGNvbnN0IGNoYXIJWHRoYWxfbW11X3BhZ2Vzel9zb3J0ZWRbWFRIQUxfTU1VX1BBR0VTWl9DT1VOVF9NQVhdOwkvKiAwIC4uIDcgKDAgcGFzdCBjb3VudCkgKi8KLQotLyp1MzIJWHRoYWxfdmlydHVhbF9leGNlcHRpb25zOyovCS8qIGJpdG1hc2sgb2Ygd2hpY2ggZXhjZXB0aW9ucyBleGVjdXRlIGluIHZpcnR1YWwgbW9kZS4uLiAqLwotCi1leHRlcm4gY29uc3QgY2hhcglYdGhhbF9tbXVfcHRlX3BhZ2Vzel9sb2cyX21pbjsJLyogPz8gbWluaW11bSBwYWdlIHNpemUgaW4gUFRFcyAqLwotZXh0ZXJuIGNvbnN0IGNoYXIJWHRoYWxfbW11X3B0ZV9wYWdlc3pfbG9nMl9tYXg7CS8qID8/IG1heGltdW0gcGFnZSBzaXplIGluIFBURXMgKi8KLQotLyogIENhY2hlIEF0dHJpYnV0ZSBCaXRzIEltcGxlbWVudGVkIGJ5IHRoZSBDYWNoZSAocGFydCBvZiB0aGUgY2FjaGUgYWJzdHJhY3Rpb24pICovCi1leHRlcm4gY29uc3QgY2hhcglYdGhhbF9pY2FjaGVfZmNhX2JpdHNfaW1wbGVtZW50ZWQ7CS8qIElUTEIvVVRMQiBvbmx5ISAqLwotZXh0ZXJuIGNvbnN0IGNoYXIJWHRoYWxfZGNhY2hlX2xjYV9iaXRzX2ltcGxlbWVudGVkOwkvKiBEVExCL1VUTEIgb25seSEgKi8KLWV4dGVybiBjb25zdCBjaGFyCVh0aGFsX2RjYWNoZV9zY2FfYml0c19pbXBsZW1lbnRlZDsgCS8qIERUTEIvVVRMQiBvbmx5ISAqLwotCi0vKiAgUGVyIFRMQiBQYXJhbWV0ZXJzIChJbnN0cnVjdGlvbiwgRGF0YSwgVW5pZmllZCkgICovCi1zdHJ1Y3QgWHRIYWxNbXVUbGIJWHRoYWxfaXRsYjsJLyogZGVzY3JpcHRpb24gb2YgTU1VIEktVExCIGdlbmVyaWMgZmVhdHVyZXMgKi8KLXN0cnVjdCBYdEhhbE1tdVRsYglYdGhhbF9kdGxiOwkvKiBkZXNjcmlwdGlvbiBvZiBNTVUgRC1UTEIgZ2VuZXJpYyBmZWF0dXJlcyAqLwotc3RydWN0IFh0SGFsTW11VGxiCVh0aGFsX3V0bGI7CS8qIGRlc2NyaXB0aW9uIG9mIE1NVSBVLVRMQiBnZW5lcmljIGZlYXR1cmVzICovCi0KLSNkZWZpbmUgWFRIQUxfTU1VX1dBWVNfTUFYCTgJLyogbWF4aW11bSBudW1iZXIgb2Ygd2F5cyAoYXNzb2NpYXRpdml0aWVzKSBmb3IgZWFjaCBUTEIgKi8KLQotLyogIFN0cnVjdHVyZSBmb3IgY29tbW9uIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBmb3IgZWFjaCBwb3NzaWJsZSBUTEIgKGluc3RydWN0aW9uLCBkYXRhIGFuZCB1bmlmaWVkKTogKi8KLXR5cGVkZWYgc3RydWN0IFh0SGFsTW11VGxiIHsKLSAgICB1OCAgCXZhX2JpdHM7CQkvKiAzMgkJKG51bWJlciBvZiB2aXJ0dWFsIGFkZHJlc3MgYml0cykgKi8KLSAgICB1OCAgCXBhX2JpdHM7CQkvKiAzMgkJKG51bWJlciBvZiBwaHlzaWNhbCBhZGRyZXNzIGJpdHMpICovCi0gICAgYm9vbAl0bGJfdmFfaW5kZXhlZDsJCS8qIDEJKHNldCBpZiBUTEIgaXMgaW5kZXhlZCBieSB2aXJ0dWFsIGFkZHJlc3MpICovCi0gICAgYm9vbAl0bGJfdmFfdGFnZ2VkOwkJLyogMAkoc2V0IGlmIFRMQiBpcyB0YWdnZWQgYnkgdmlydHVhbCBhZGRyZXNzKSAqLwotICAgIGJvb2wJY2FjaGVfdmFfaW5kZXhlZDsJLyogMQkoc2V0IGlmIGNhY2hlIGlzIGluZGV4ZWQgYnkgdmlydHVhbCBhZGRyZXNzKSAqLwotICAgIGJvb2wJY2FjaGVfdmFfdGFnZ2VkOwkvKiAwCShzZXQgaWYgY2FjaGUgaXMgdGFnZ2VkIGJ5IHZpcnR1YWwgYWRkcmVzcykgKi8KLSAgICAvKmJvb2wJKHdoZXRoZXIgcGFnZSB0YWJsZXMgYXJlIHRyYXZlcnNlZCBpbiB2YWRkciBzb3J0ZWQgb3JkZXIsIHBhZGRyIHNvcnRlZCBvcmRlciwgLi4uKSAqLwotICAgIC8qdTgJKHNldCBvZiBhdmFpbGFibGUgcGFnZSBhdHRyaWJ1dGUgYml0cywgb3RoZXIgdGhhbiBjYWNoZSBhdHRyaWJ1dGUgYml0cyBkZWZpbmVkIGFib3ZlKSAqLwotICAgIC8qdTMyCSh2YXJpb3VzIG1hc2tzIGZvciBwYWdlcywgTU1VIHRhYmxlL1RMQiBlbnRyaWVzLCBldGMuKSAqLwotICAgIHU4ICAJd2F5X2NvdW50OwkJLyogMCAuLiA4CShudW1iZXIgb2Ygd2F5cywgYS5rLmEuIGFzc29jaWF0aXZpdGllcywgZm9yIHRoaXMgVExCKSAqLwotICAgIFh0SGFsTW11VGxiV2F5ICoJd2F5c1tYVEhBTF9NTVVfV0FZU19NQVhdOwkvKiBwb2ludGVycyB0byBwZXItd2F5IHBhcm1zIGZvciBlYWNoIHdheSAqLwotfSBYdEhhbE1tdVRsYjsKLQotLyogIFBlciBUTEIgV2F5IChQZXIgQXNzb2NpYXRpdml0eSkgUGFyYW1ldGVycyAgKi8KLXR5cGVkZWYgc3RydWN0IFh0SGFsTW11VGxiV2F5IHsKLSAgICAgdTMyCWluZGV4X2NvdW50X2xvZzI7CS8qIDAgLi4gNCAqLwotICAgICB1MzIJcGFnZXN6X21hc2s7CQkvKiAwIC4uIDJecGFnZXN6X2NvdW50IC0gMQkoZWFjaCBiaXQgY29ycmVzcG9uZHMgdG8gYSBzaXplICovCi0JCQkJCS8qCQlkZWZpbmVkIGluIHRoZSBYdGhhbF9tbXVfcGFnZXN6X2xvZzJbXSB0YWJsZSkgKi8KLSAgICAgdTMyCXZwbl9jb25zdF9tYXNrOwotICAgICB1MzIJdnBuX2NvbnN0X3ZhbHVlOwotICAgICB1NjQJcHBuX2NvbnN0X21hc2s7CQkvKiBmdXR1cmUgbWF5IHN1cHBvcnQgcGFfYml0cyA+IDMyICovCi0gICAgIHU2NAlwcG5fY29uc3RfdmFsdWU7Ci0gICAgIHUzMglwcG5faWRfbWFzazsJCS8qIHBhZGRyIGJpdHMgdGFrZW4gZGlyZWN0bHkgZnJvbSB2YWRkciAqLwotICAgICBib29sCWJhY2tnbmRfbWF0Y2g7CQkvKiAwIG9yIDEgKi8KLSAgICAgLyogIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBYVEhBTF9DQUNIRV94eHggYml0czogKi8KLSAgICAgdTggCWZjYV9jb25zdF9tYXNrOwkJLyogSVRMQi9VVExCIG9ubHkhICovCi0gICAgIHU4IAlmY2FfY29uc3RfdmFsdWU7CS8qIElUTEIvVVRMQiBvbmx5ISAqLwotICAgICB1OCAJbGNhX2NvbnN0X21hc2s7CQkvKiBEVExCL1VUTEIgb25seSEgKi8KLSAgICAgdTggCWxjYV9jb25zdF92YWx1ZTsgCS8qIERUTEIvVVRMQiBvbmx5ISAqLwotICAgICB1OCAJc2NhX2NvbnN0X21hc2s7IAkvKiBEVExCL1VUTEIgb25seSEgKi8KLSAgICAgdTggCXNjYV9jb25zdF92YWx1ZTsgCS8qIERUTEIvVVRMQiBvbmx5ISAqLwotICAgICAvKiAgVGhlc2UgZGVmaW5lIGFuIGVuY29kaW5nIHRoYXQgbWFwIDUgYml0cyBpbiBUTEIgYW5kIFBURSBlbnRyaWVzIHRvICovCi0gICAgIC8qICA4IGJpdHMgKEZDQSwgSVRMQiksIDE2IGJpdHMgKExDQStTQ0EsIERUTEIpIG9yIDI0IGJpdHMgKEZDQStMQ0ErU0NBLCBVVExCKTogKi8KLSAgICAgLyogICh0aGV5IG1heSBiZSBtb3ZlZCB0byBzdHJ1Y3QgWHRIYWxNbXVUbGIpICovCi0gICAgIHU4CQljYV9iaXRzOwkJLyogbnVtYmVyIG9mIGJpdHMgaW4gVExCL1BURSBlbnRyaWVzIGZvciBjYWNoZSBhdHRyaWJ1dGVzICovCi0gICAgIHUzMiAqCWNhX21hcDsJCQkvKiBwb2ludGVyIHRvIGFycmF5IG9mIDJeY2FfYml0cyBlbnRyaWVzIG9mIEZDQStMQ0ErU0NBIGJpdHMgKi8KLX0gWHRIYWxNbXVUbGJXYXk7Ci0KLS8qCi0gKiAgVGhlIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciBwcm90ZWN0aW9uIHN1cHBvcnQgaXMgcHJlc2VudCBpbiBjb3JlCi0gKiAgaXMgdG8gW2xvb2sgYXQgWHRoYWxfbW11X3JpbmdzID8/P10uCi0gKiAgR2l2ZSBpbmZvIG9uIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIE1NVSB0YWJsZXMgYW5kIG90aGVyIGluLW1lbW9yeQotICogIGRhdGEgc3RydWN0dXJlcyAoZ2xvYmFsbHksIHBlciB0YXNrLCBiYXNlIGFuZCBwZXIgcGFnZSwgZXRjLikgLSB3aGF0ZXZlciBib3VuZHMgY2FuIGJlIGNhbGN1bGF0ZWQuCi0gKi8KLQotCi0vKiAgRGVmYXVsdCB2ZWN0b3JzOiAgKi8KLXh0aGFsX2ltbXVfZmV0Y2hfbWlzc192ZWN0b3IKLXh0aGFsX2RtbXVfbG9hZF9taXNzX3ZlY3RvcgoteHRoYWxfZG1tdV9zdG9yZV9taXNzX3ZlY3RvcgotCi0vKiAgRnVuY3Rpb25zIGNhbGxlZCB3aGVuIGEgZmF1bHQgaXMgZGV0ZWN0ZWQ6ICAqLwotdHlwZWRlZiB2b2lkIChYdEhhbE1tdUZhdWx0RnVuYykoIHVuc2lnbmVkIHZhZGRyLCAuLi5jb250ZXh0Li4uICk7Ci0vKiAgT3IsICovCi0vKglhPyA9IHZhZGRyICovCi0vKglhPyA9IGNvbnRleHQuLi4gKi8KLS8qCVBTLnh4eCA9IHh4eCAqLwotWHRIYWxNTXVGYXVsdEZ1bmMgKlh0aGFsX2ltbXVfZmV0Y2hfZmF1bHRfZnVuYzsKLVh0SGFsTU11RmF1bHRGdW5jICpYdGhhbF9kbW11X2xvYWRfZmF1bHRfZnVuYzsKLVh0SGFsTU11RmF1bHRGdW5jICpYdGhhbF9kbW11X3N0b3JlX2ZhdWx0X2Z1bmM7Ci0KLS8qICBEZWZhdWx0IEhhbmRsZXJzOiAgKi8KLS8qICBUaGUgdXNlciBhbmQvb3Iga2VybmVsIGV4Y2VwdGlvbiBoYW5kbGVycyBtYXkganVtcCB0byB0aGVzZSBoYW5kbGVycyB0byBoYW5kbGUgdGhlIHJlbGV2YW50IGV4Y2VwdGlvbnMsCi0gKiAgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBFWENDQVVTRS4gIFRoZSBleGFjdCByZWdpc3RlciBzdGF0ZSBvbiBlbnRyeSB0byB0aGVzZSBoYW5kbGVycyBpcyBUQkQuICAqLwotLyogIFdoZW4gbXVsdGlwbGUgVExCIGVudHJpZXMgbWF0Y2ggKGhpdCkgb24gdGhlIHNhbWUgYWNjZXNzOiAgKi8KLXh0aGFsX2ltbXVfZmV0Y2hfbXVsdGloaXRfaGFuZGxlcgoteHRoYWxfZG1tdV9sb2FkX211bHRpaGl0X2hhbmRsZXIKLXh0aGFsX2RtbXVfc3RvcmVfbXVsdGloaXRfaGFuZGxlcgotLyogIFByb3RlY3Rpb24gdmlvbGF0aW9ucyBhY2NvcmRpbmcgdG8gY2FjaGUgYXR0cmlidXRlcywgYW5kIG90aGVyIGNhY2hlIGF0dHJpYnV0ZSBtaXNtYXRjaGVzOiAgKi8KLXh0aGFsX2ltbXVfZmV0Y2hfYXR0cl9oYW5kbGVyCi14dGhhbF9kbW11X2xvYWRfYXR0cl9oYW5kbGVyCi14dGhhbF9kbW11X3N0b3JlX2F0dHJfaGFuZGxlcgotLyogIFByb3RlY3Rpb24gdmlvbGF0aW9ucyBkdWUgdG8gaW5zdWZmaWNpZW50IHJpbmcgbGV2ZWw6ICAqLwoteHRoYWxfaW1tdV9mZXRjaF9wcml2X2hhbmRsZXIKLXh0aGFsX2RtbXVfbG9hZF9wcml2X2hhbmRsZXIKLXh0aGFsX2RtbXVfc3RvcmVfcHJpdl9oYW5kbGVyCi0vKiAgQWxpZ25tZW50IGV4Y2VwdGlvbiBoYW5kbGVycyAoaWYgc3VwcG9ydGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIFh0ZW5zYSBNTVUgY29uZmlndXJhdGlvbik6ICAqLwoteHRoYWxfZG1tdV9sb2FkX2FsaWduX2hhbmRsZXIKLXh0aGFsX2RtbXVfc3RvcmVfYWxpZ25faGFuZGxlcgotCi0vKiAgT3IsIGFsdGVybmF0aXZlbHksIHRoZSBPUyB1c2VyIGFuZC9vciBrZXJuZWwgZXhjZXB0aW9uIGhhbmRsZXJzIG1heSBzaW1wbHkganVtcCB0byB0aGUKLSAqICBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIHdoaWNoIHdpbGwgaGFuZGxlIGFueSB2YWx1ZXMgb2YgRVhDQ0FVU0Ugbm90IGhhbmRsZWQgYnkgdGhlIE9TOiAgKi8KLXh0aGFsX3VzZXJfZXhjX2RlZmF1bHRfaGFuZGxlcgoteHRoYWxfa2VybmVsX2V4Y19kZWZhdWx0X2hhbmRsZXIKLQotI2VuZGlmIC8qMCovCi0KLSNpZmRlZiBJTkNMVURFX0RFUFJFQ0FURURfSEFMX0NPREUKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfb2xkX2V4Y19hcmNoOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9tbXU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9udW1fcmVnczsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9pcm9tczsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9pcmFtczsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9kcm9tczsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9kcmFtczsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2NvbmZpZ2lkMDsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2NvbmZpZ2lkMTsKLSNlbmRpZgotCi0jaWZkZWYgSU5DTFVERV9ERVBSRUNBVEVEX0hBTF9ERUJVR19DT0RFCi0jZGVmaW5lIFhUSEFMXzI0X0JJVF9CUkVBSwkJMHg4MDAwMDAwMAotI2RlZmluZSBYVEhBTF8xNl9CSVRfQlJFQUsJCTB4NDAwMDAwMDAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydAlYdGhhbF9pbGxfaW5zdF8xNlsxNl07Ci0jZGVmaW5lIFhUSEFMX0RFU1RfUkVHCQkweGYwMDAwMDAwCS8qIE1hc2sgZm9yIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0jZGVmaW5lIFhUSEFMX0RFU1RfUkVHX0lOU1QJMHgwODAwMDAwMAkvKiBCcmFuY2ggYWRkcmVzcyBpcyBpbiByZWdpc3RlciAqLwotI2RlZmluZSBYVEhBTF9ERVNUX1JFTF9JTlNUCTB4MDQwMDAwMDAJLyogQnJhbmNoIGFkZHJlc3MgaXMgcmVsYXRpdmUgKi8KLSNkZWZpbmUgWFRIQUxfUkZXX0lOU1QJCTB4MDAwMDA4MDAKLSNkZWZpbmUgWFRIQUxfUkZVRV9JTlNUCQkweDAwMDAwNDAwCi0jZGVmaW5lIFhUSEFMX1JGSV9JTlNUCQkweDAwMDAwMjAwCi0jZGVmaW5lIFhUSEFMX1JGRV9JTlNUCQkweDAwMDAwMTAwCi0jZGVmaW5lIFhUSEFMX1JFVF9JTlNUCQkweDAwMDAwMDgwCi0jZGVmaW5lIFhUSEFMX0JSRUFLX0lOU1QJMHgwMDAwMDA0MAotI2RlZmluZSBYVEhBTF9TWVNDQUxMX0lOU1QJMHgwMDAwMDAyMAotI2RlZmluZSBYVEhBTF9MT09QX0VORAkJMHgwMDAwMDAxMAkvKiBOb3Qgc2V0IGJ5IHh0aGFsX2luc3RfdHlwZSAqLwotI2RlZmluZSBYVEhBTF9KVU1QX0lOU1QJCTB4MDAwMDAwMDgJLyogQ2FsbCBvciBqdW1wIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFhUSEFMX0JSQU5DSF9JTlNUCTB4MDAwMDAwMDQJLyogQnJhbmNoIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFhUSEFMXzI0X0JJVF9JTlNUCTB4MDAwMDAwMDIKLSNkZWZpbmUgWFRIQUxfMTZfQklUX0lOU1QgICAweDAwMDAwMDAxCi10eXBlZGVmIHN0cnVjdCB4dGhhbF9zdGF0ZSB7Ci0gICAgdW5zaWduZWQJcGM7Ci0gICAgdW5zaWduZWQJYXJbMTZdOwotICAgIHVuc2lnbmVkCWxiZWc7Ci0gICAgdW5zaWduZWQJbGVuZDsKLSAgICB1bnNpZ25lZAlsY291bnQ7Ci0gICAgdW5zaWduZWQJZXh0cmFfcHRyOwotICAgIHVuc2lnbmVkCWNwcmVnc19wdHJbWFRIQUxfTUFYX0NQU107Ci19IFhUSEFMX1NUQVRFOwotZXh0ZXJuIHVuc2lnbmVkIGludCB4dGhhbF9pbnN0X3R5cGUodm9pZCAqYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgaW50IHh0aGFsX2JyYW5jaF9hZGRyKHZvaWQgKmFkZHIpOwotZXh0ZXJuIHVuc2lnbmVkIGludCB4dGhhbF9nZXRfbnBjKFhUSEFMX1NUQVRFICp1c2VyX3N0YXRlKTsKLSNlbmRpZiAvKiBJTkNMVURFX0RFUFJFQ0FURURfSEFMX0RFQlVHX0NPREUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZiAvKiFfX0FTU0VNQkxZX18gKi8KLQotI2VuZGlmIC8qWFRFTlNBX0hBTF9IKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9zaW1jYWxsLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3NpbWNhbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiODY4OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3NpbWNhbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0jaWZuZGVmIFNJTUNBTExfSU5DTFVERUQKLSNkZWZpbmUgU0lNQ0FMTF9JTkNMVURFRAotCi0vKgotICogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLSAqCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3NpbWNhbGwuaCAgLSAgU2ltdWxhdG9yIGNhbGwgbnVtYmVycwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKLSAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgotICovCi0KLQotLyoKLSAqICBTeXN0ZW0gY2FsbCBsaWtlIHNlcnZpY2VzIG9mZmVyZWQgYnkgdGhlIHNpbXVsYXRvciBob3N0LgotICogIFRoZXNlIGFyZSBtb2RlbGVkIGFmdGVyIHRoZSBMaW51eCAyLjQga2VybmVsIHN5c3RlbSBjYWxscwotICogIGZvciBYdGVuc2EgcHJvY2Vzc29ycy4gIEhvd2V2ZXIgbm90IGFsbCBzeXN0ZW0gY2FsbHMgYW5kCi0gKiAgbm90IGFsbCBmdW5jdGlvbmFsaXR5IG9mIGEgZ2l2ZW4gc3lzdGVtIGNhbGwgYXJlIGltcGxlbWVudGVkLAotICogIG9yIG5lY2Vzc2FyaWx5IGhhdmUgd2VsbCBkZWZpbmVkIG9yIGVxdWl2YWxlbnQgc2VtYW50aWNzIGluCi0gKiAgdGhlIGNvbnRleHQgb2YgYSBzaW11bGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgVW5peCBrZXJuZWwpLgotICoKLSAqICBUaGVzZSBzZXJ2aWNlcyBiZWhhdmUgbGFyZ2VseSBhcyBpZiB0aGV5IGhhZCBiZWVuIGludm9rZWQKLSAqICBhcyBhIHRhc2sgaW4gdGhlIHNpbXVsYXRvciBob3N0J3Mgb3BlcmF0aW5nIHN5c3RlbQotICogIChlZy4gZmlsZXMgYWNjZXNzZWQgYXJlIHRob3NlIG9mIHRoZSBzaW11bGF0b3IgaG9zdCkuCi0gKiAgSG93ZXZlciwgdGhlc2UgU0lNQ0FMTHMgbW9kZWwgYSB2aXJ0dWFsIG9wZXJhdGluZyBzeXN0ZW0KLSAqICBzbyB0aGF0IHZhcmlvdXMgZGVmaW5pdGlvbnMsIGJpdCBhc3NpZ25tZW50cyBldGMKLSAqICAoZWcuIG9wZW4gbW9kZSBiaXRzLCBlcnJubyB2YWx1ZXMsIGV0YykgYXJlIGluZGVwZW5kZW50Ci0gKiAgb2YgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSB1c2VkIHRvIHJ1biB0aGUgc2ltdWxhdGlvbi4KLSAqICBSYXRoZXIgdGhlc2UgZGVmaW5pdGlvbnMgYXJlIHNwZWNpZmljIHRvIHRoZSBYdGVuc2EgSVNTLgotICogIFRoaXMgd2F5IFh0ZW5zYSBJU0EgY29kZSB3cml0dGVuIHRvIHVzZSB0aGVzZSBTSU1DQUxMcwotICogIGNhbiAoaW4gcHJpbmNpcGxlKSBiZSBzaW11bGF0ZWQgb24gYW55IGhvc3QuCi0gKgotICogIFVwIHRvIDYgcGFyYW1ldGVycyBhcmUgcGFzc2VkIGluIHJlZ2lzdGVycyBhMyB0byBhOAotICogIChub3RlIHRoZSA2dGggcGFyYW1ldGVyIGlzbid0IHBhc3NlZCBvbiB0aGUgc3RhY2ssCi0gKiAgIHVubGlrZSB3aW5kb3dlZCBmdW5jdGlvbiBjYWxsaW5nIGNvbnZlbnRpb25zKS4KLSAqICBUaGUgcmV0dXJuIHZhbHVlIGlzIGluIGEyLiAgQSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUKLSAqICByYW5nZSAtNDA5NiB0byAtMSBpbmRpY2F0ZXMgYSBuZWdhdGVkIGVycm9yIGNvZGUgdG8gYmUKLSAqICByZXBvcnRlZCBpbiBlcnJubyB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mIC0xLCBvdGhlcndpc2UKLSAqICB0aGUgdmFsdWUgaW4gYTIgaXMgcmV0dXJuZWQgYXMgaXMuCi0gKi8KLQotLyogVGhlc2UgI2RlZmluZXMgbmVlZCB0byBtYXRjaCB3aGF0J3MgaW4gWHRlbnNhL09TL3Z4d29ya3MveHRpc3Mvc2ltY2FsbHMuYyAqLwotCi0jZGVmaW5lIFNZU19ub3AJCTAJLyogbi9hIC0gc2V0dXA7IHVzZWQgdG8gZmx1c2ggcmVnaXN0ZXIgd2luZG93cyAqLwotI2RlZmluZSBTWVNfZXhpdAkxCS8qeCovCi0jZGVmaW5lIFNZU19mb3JrCTIKLSNkZWZpbmUgU1lTX3JlYWQJMwkvKngqLwotI2RlZmluZSBTWVNfd3JpdGUJNAkvKngqLwotI2RlZmluZSBTWVNfb3Blbgk1CS8qeCovCi0jZGVmaW5lIFNZU19jbG9zZQk2CS8qeCovCi0jZGVmaW5lIFNZU19yZW5hbWUJNwkvKnggMzggLSB3YWl0cGlkICovCi0jZGVmaW5lIFNZU19jcmVhdAk4CS8qeCovCi0jZGVmaW5lIFNZU19saW5rCTkJLyp4IChub3QgaW1wbGVtZW50ZWQgb24gV0lOMzIpICovCi0jZGVmaW5lIFNZU191bmxpbmsJMTAJLyp4Ki8KLSNkZWZpbmUgU1lTX2V4ZWN2CTExCS8qIG4vYSAtIGV4ZWN2ZSAqLwotI2RlZmluZSBTWVNfZXhlY3ZlCTEyCS8qIDExIC0gY2hkaXIgKi8KLSNkZWZpbmUgU1lTX3BpcGUJMTMJLyogNDIgLSB0aW1lICovCi0jZGVmaW5lIFNZU19zdGF0CTE0CS8qIDEwNiAtIG1rbm9kICovCi0jZGVmaW5lIFNZU19jaG1vZAkxNQotI2RlZmluZSBTWVNfY2hvd24JMTYJLyogMjAyIC0gbGNob3duICovCi0jZGVmaW5lIFNZU191dGltZQkxNwkvKiAzMCAtIGJyZWFrICovCi0jZGVmaW5lIFNZU193YWl0CTE4CS8qIG4vYSAtIG9sZHN0YXQgKi8KLSNkZWZpbmUgU1lTX2xzZWVrCTE5CS8qeCovCi0jZGVmaW5lIFNZU19nZXRwaWQJMjAKLSNkZWZpbmUgU1lTX2lzYXR0eQkyMQkvKiBuL2EgLSBtb3VudCAqLwotI2RlZmluZSBTWVNfZnN0YXQJMjIJLyogMTA4IC0gb2xkdW1vdW50ICovCi0jZGVmaW5lIFNZU190aW1lCTIzCS8qIDEzIC0gc2V0dWlkICovCi0jZGVmaW5lIFNZU19nZXR0aW1lb2ZkYXkgMjQJLyp4IDc4IC0gZ2V0dWlkIChub3QgaW1wbGVtZW50ZWQgb24gV0lOMzIpICovCi0jZGVmaW5lIFNZU190aW1lcwkyNQkvKlggNDMgLSBzdGltZSAoWHRlbnNhLXNwZWNpZmljIGltcGxlbWVudGF0aW9uKSAqLwotI2RlZmluZSBTWVNfc29ja2V0ICAgICAgMjYKLSNkZWZpbmUgU1lTX3NlbmR0byAgICAgIDI3Ci0jZGVmaW5lIFNZU19yZWN2ZnJvbSAgICAyOAotI2RlZmluZSBTWVNfc2VsZWN0X29uZSAgMjkgICAgICAvKiBub3QgY29tcGl0aWJsZSBzZWxlY3QsIG9uZSBmaWxlIGRlc2NyaXB0b3IgYXQgdGhlIHRpbWUgKi8KLSNkZWZpbmUgU1lTX2JpbmQgICAgICAgIDMwCi0jZGVmaW5lIFNZU19pb2N0bAkzMQotCi0vKgotICogIE90aGVyLi4uCi0gKi8KLSNkZWZpbmUgU1lTX2lzc19hcmdjICAgICAgMTAwMAkvKiByZXR1cm5zIHZhbHVlIG9mIGFyZ2MgKi8KLSNkZWZpbmUgU1lTX2lzc19hcmd2X3NpemUgMTAwMQkvKiBieXRlcyBuZWVkZWQgZm9yIGFyZ3YgJiBhcmcgc3RyaW5ncyAqLwotI2RlZmluZSBTWVNfaXNzX3NldF9hcmd2ICAxMDAyCS8qIHNhdmVzIGFyZ3YgJiBhcmcgc3RyaW5ncyBhdCBnaXZlbiBhZGRyICovCi0KLS8qCi0gKiBTSU1DQUxMcyBmb3IgdGhlIGZlcnJldCBtZW1vcnkgZGVidWdnZXIuIEFsbCBhcmUgaW52b2tlZCBieQotICogbGliZmVycmV0LmEgLi4uICAoIFh0ZW5zYS9UYXJnZXQtTGlicy9mZXJyZXQgKQotICovCi0jZGVmaW5lIFNZU19mZXJyZXQgICAgICAgICAgIDEwMTAKLSNkZWZpbmUgU1lTX21hbGxvYyAgICAgICAgICAgMTAxMQotI2RlZmluZSBTWVNfZnJlZSAgICAgICAgICAgICAxMDEyCi0jZGVmaW5lIFNZU19tb3JlX2hlYXAgICAgICAgIDEwMTMKLSNkZWZpbmUgU1lTX25vX2hlYXAgICAgICAgICAgMTAxNAotCi0KLS8qCi0gKiAgRXh0cmEgU0lNQ0FMTHMgZm9yIEdEQjoKLSAqLwotI2RlZmluZSBTWVNfZ2RiX2JyZWFrICAgICAgICAgLTEJLyogaW52b2tlZCBieSBYVE9TIG9uIHVzZXIgZXhjZXB0aW9ucyBpZiBFUEMgcG9pbnRzCi0JCQkJCSAgIHRvIGEgYnJlYWsubi9icmVhaywgcmVnYXJkbGVzcyBvZiBjYXVzZSEgKi8KLSNkZWZpbmUgU1lTX3htb25fb3V0ICAgICAgICAgIC0yCS8qIGludm9rZWQgYnkgWE1PTjogLi4uICovCi0jZGVmaW5lIFNZU194bW9uX2luICAgICAgICAgICAtMwkvKiBpbnZva2VkIGJ5IFhNT046IC4uLiAqLwotI2RlZmluZSBTWVNfeG1vbl9mbHVzaCAgICAgICAgLTQJLyogaW52b2tlZCBieSBYTU9OOiAuLi4gKi8KLSNkZWZpbmUgU1lTX2dkYl9hYm9ydCAgICAgICAgIC01CS8qIGludm9rZWQgYnkgWFRPUyBpbiBfeHRvc19wYW5pYygpICovCi0jZGVmaW5lIFNZU19nZGJfaWxsZWdhbF9pbnN0ICAtNgkvKiBpbnZva2VkIGJ5IFhUT1MgZm9yIGlsbGVnYWwgaW5zdHJ1Y3Rpb25zICh0b28gZGVlcGx5KSAqLwotI2RlZmluZSBTWVNfeG1vbl9pbml0ICAgICAgICAgLTcJLyogaW52b2tlZCBieSBYTU9OOiAuLi4gKi8KLSNkZWZpbmUgU1lTX2dkYl9lbnRlcl9za3Rsb29wIC04CS8qIGludm9rZWQgYnkgWFRPUyBvbiBkZWJ1ZyBleGNlcHRpb25zICovCi0KLS8qCi0gKiAgU0lNQ0FMTHMgZm9yIHZ4V29ya3MgeHRpc3MgQlNQOgotICovCi0jZGVmaW5lIFNZU19zZXR1cF9wcHBfcGlwZXMgICAtODMKLSNkZWZpbmUgU1lTX2xvZ19tc2cgICAgICAgICAgIC04NAotCi0vKgotICogIFRlc3QgU0lNQ0FMTHM6Ci0gKi8KLSNkZWZpbmUgU1lTX3Rlc3Rfd3JpdGVfc3RhdGUgIC0xMDAKLSNkZWZpbmUgU1lTX3Rlc3RfcmVhZF9zdGF0ZSAgIC0xMDEKLQotLyoKLSAqIFNZU19zZWxlY3Rfb25lIHNwZWNpZmllcnMKLSAqLwotI2RlZmluZSAgWFRJU1NfU0VMRUNUX09ORV9SRUFEICAgIDEKLSNkZWZpbmUgIFhUSVNTX1NFTEVDVF9PTkVfV1JJVEUgICAyCi0jZGVmaW5lICBYVElTU19TRUxFQ1RfT05FX0VYQ0VQVCAgMwotCi0jZW5kaWYgLyogIVNJTUNBTExfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EveHQyMDAwLXVhcnQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EveHQyMDAwLXVhcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1NDQ2MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3h0MjAwMC11YXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotI2lmbmRlZiBfdWFydF9oX2luY2x1ZGVkXwotI2RlZmluZSBfdWFydF9oX2luY2x1ZGVkXwotCi0vKgotICogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLSAqCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3h0MjAwMC11YXJ0LmggLS0gTmF0U2VtaSBQQzE2NTUyRCBEVUFSVAotICogZGVmaW5pdGlvbnMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0KLSNpbmNsdWRlIDx4dGVuc2EveHQyMDAwLmg+Ci0KLQotLyogMTY1NTAgVUFSVCBERVZJQ0UgUkVHSVNURVJTCi0gICBUaGUgWFQyMDAwIGJvYXJkIGFsaWducyBlYWNoIHJlZ2lzdGVyIHRvIGEgMzItYml0IHdvcmQgYnV0IHRoZSBVQVJUIGRldmljZSBvbmx5IHVzZXMKLSAgIG9uZSBieXRlIG9mIHRoZSB3b3JkLCB3aGljaCBpcyB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSByZWdhcmRsZXNzIG9mIHRoZQotICAgZW5kaWFubmVzcyBvZiB0aGUgY29yZSAoaWUuIGJ5dGUgb2Zmc2V0IDAgZm9yIGxpdHRsZS1lbmRpYW4gYW5kIDMgZm9yIGJpZy1lbmRpYW4pLgotICAgU28gaWYgdXNpbmcgd29yZCBhY2Nlc3NlcyB0aGVuIGVuZGlhbm5lc3MgZG9lc24ndCBtYXR0ZXIuCi0gICBUaGUgbWFjcm9zIHByb3ZpZGVkIGhlcmUgZG8gdGhhdC4KLSovCi1zdHJ1Y3QgdWFydF9kZXZfcyB7Ci0gIHVuaW9uIHsKLSAgICB1bnNpZ25lZCBpbnQgcnhiOwkvKiBETEFCPTA6IHJlY2VpdmUgYnVmZmVyLCByZWFkLW9ubHkgKi8KLSAgICB1bnNpZ25lZCBpbnQgdHhiOwkvKiBETEFCPTA6IHRyYW5zbWl0IGJ1ZmZlciwgd3JpdGUtb25seSAqLwotICAgIHVuc2lnbmVkIGludCBkbGw7CS8qIERMQUI9MTogZGl2aXNvciwgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBsYXRjaCAod2FzIHdyaXRlLW9ubHk/KSAqLwotICB9IHcwOwotICB1bmlvbiB7Ci0gICAgdW5zaWduZWQgaW50IGllcjsJLyogRExBQj0wOiBpbnRlcnJ1cHQtZW5hYmxlIHJlZ2lzdGVyICh3YXMgd3JpdGUtb25seT8pICovCi0gICAgdW5zaWduZWQgaW50IGRsbTsJLyogRExBQj0xOiBkaXZpc29yLCBtb3N0LXNpZ25pZmljYW50IGJ5dGUgbGF0Y2ggKHdhcyB3cml0ZS1vbmx5PykgKi8KLSAgfSB3MTsKLQotICB1bmlvbiB7Ci0gICAgdW5zaWduZWQgaW50IGlzcjsJLyogRExBQj0wOiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLCByZWFkLW9ubHkgKi8KLSAgICB1bnNpZ25lZCBpbnQgZmNyOwkvKiBETEFCPTA6IEZJRk8gY29udHJvbCByZWdpc3Rlciwgd3JpdGUtb25seSAqLwotICAgIHVuc2lnbmVkIGludCBhZnI7CS8qIERMQUI9MTogYWx0ZXJuYXRlIGZ1bmN0aW9uIHJlZ2lzdGVyICovCi0gIH0gdzI7Ci0KLSAgdW5zaWduZWQgaW50IGxjcjsJLyogbGluZSBjb250cm9sLXJlZ2lzdGVyLCB3cml0ZS1vbmx5ICovCi0gIHVuc2lnbmVkIGludCBtY3I7CS8qIG1vZGVtIGNvbnRyb2wtcmVnc2l0ZXIsIHdyaXRlLW9ubHkgKi8KLSAgdW5zaWduZWQgaW50IGxzcjsJLyogbGluZSBzdGF0dXMgcmVnaXN0ZXIsIHJlYWQtb25seSAqLwotICB1bnNpZ25lZCBpbnQgbXNyOwkvKiBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIsIHJlYWQtb25seSAqLwotICB1bnNpZ25lZCBpbnQgc2NyOwkvKiBzY3JhdGNoIHJlZ3NpdGVyLCByZWFkL3dyaXRlICovCi19OwotCi0jZGVmaW5lIF9SWEIodSkgKCh1KS0+dzAucnhiKQotI2RlZmluZSBfVFhCKHUpICgodSktPncwLnR4YikKLSNkZWZpbmUgX0RMTCh1KSAoKHUpLT53MC5kbGwpCi0jZGVmaW5lIF9JRVIodSkgKCh1KS0+dzEuaWVyKQotI2RlZmluZSBfRExNKHUpICgodSktPncxLmRsbSkKLSNkZWZpbmUgX0lTUih1KSAoKHUpLT53Mi5pc3IpCi0jZGVmaW5lIF9GQ1IodSkgKCh1KS0+dzIuZmNyKQotI2RlZmluZSBfQUZSKHUpICgodSktPncyLmFmcikKLSNkZWZpbmUgX0xDUih1KSAoKHUpLT5sY3IpCi0jZGVmaW5lIF9NQ1IodSkgKCh1KS0+bWNyKQotI2RlZmluZSBfTFNSKHUpICgodSktPmxzcikKLSNkZWZpbmUgX01TUih1KSAoKHUpLT5tc3IpCi0jZGVmaW5lIF9TQ1IodSkgKCh1KS0+c2NyKQotCi10eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB1YXJ0X2Rldl9zIHVhcnRfZGV2X3Q7Ci0KLS8qIElFUiBiaXRzICovCi0jZGVmaW5lIFJDVlJfREFUQV9SRUdfSU5URU5BQkxFIDB4MDEKLSNkZWZpbmUgWE1JVF9IT0xEX1JFR19JTlRFTkFCTEUgICAgMHgwMgotI2RlZmluZSBSQ1ZSX1NUQVRVU19JTlRFTkFCTEUgICAweDA0Ci0jZGVmaW5lIE1PREVNX1NUQVRVU19JTlRFTkFCTEUgICAgIDB4MDgKLQotLyogRkNSIGJpdHMgKi8KLSNkZWZpbmUgX0ZJRk9fRU5BQkxFICAgICAgMHgwMQotI2RlZmluZSBSQ1ZSX0ZJRk9fUkVTRVQgIDB4MDIKLSNkZWZpbmUgWE1JVF9GSUZPX1JFU0VUICAweDA0Ci0jZGVmaW5lIERNQV9NT0RFX1NFTEVDVCAgMHgwOAotI2RlZmluZSBSQ1ZSX1RSSUdHRVJfTFNCIDB4NDAKLSNkZWZpbmUgUkNWUl9UUklHR0VSX01TQiAweDgwCi0KLS8qIEFGUiBiaXRzICovCi0jZGVmaW5lIEFGUl9DT05DX1dSSVRFCTB4MDEKLSNkZWZpbmUgQUZSX0JBVURPVVRfU0VMCTB4MDIKLSNkZWZpbmUgQUZSX1JYUkRZX1NFTAkweDA0Ci0KLS8qIElTUiBiaXRzICovCi0jZGVmaW5lIElOVF9TVEFUVVMocikgICAoKHIpJjEpCi0jZGVmaW5lIElOVF9QUklPUklUWShyKSAoKChyKT4+MSkmMHg3KQotCi0vKiBMQ1IgYml0cyAqLwotI2RlZmluZSBXT1JEX0xFTkdUSChuKSAgKCgobiktNSkmMHgzKQotI2RlZmluZSBTVE9QX0JJVF9FTkFCTEUgMHgwNAotI2RlZmluZSBQQVJJVFlfRU5BQkxFICAgMHgwOAotI2RlZmluZSBFVkVOX1BBUklUWSAgICAgMHgxMAotI2RlZmluZSBGT1JDRV9QQVJJVFkgICAgMHgyMAotI2RlZmluZSBYTUlUX0JSRUFLICAgICAgMHg0MAotI2RlZmluZSBETEFCX0VOQUJMRSAgICAgMHg4MAotCi0vKiBNQ1IgYml0cyAqLwotI2RlZmluZSBfRFRSIDB4MDEKLSNkZWZpbmUgX1JUUyAweDAyCi0jZGVmaW5lIF9PUDEgMHgwNAotI2RlZmluZSBfT1AyIDB4MDgKLSNkZWZpbmUgTE9PUF9CQUNLIDB4MTAKLQotLyogTFNSIEJpdHMgKi8KLSNkZWZpbmUgUkNWUl9EQVRBX1JFQURZIDB4MDEKLSNkZWZpbmUgT1ZFUlJVTl9FUlJPUiAgIDB4MDIKLSNkZWZpbmUgUEFSSVRZX0VSUk9SICAgIDB4MDQKLSNkZWZpbmUgRlJBTUlOR19FUlJPUiAgIDB4MDgKLSNkZWZpbmUgQlJFQUtfSU5URVJSVVBUIDB4MTAKLSNkZWZpbmUgWE1JVF9IT0xEX0VNUFRZIDB4MjAKLSNkZWZpbmUgWE1JVF9FTVBUWSAgICAgIDB4NDAKLSNkZWZpbmUgRklGT19FUlJPUiAgICAgIDB4ODAKLSNkZWZpbmUgUkNWUl9SRUFEWSh1KSAgIChfTFNSKHUpJlJDVlJfREFUQV9SRUFEWSkKLSNkZWZpbmUgWE1JVF9SRUFEWSh1KSAgIChfTFNSKHUpJlhNSVRfSE9MRF9FTVBUWSkKLQotLyogTVNSIGJpdHMgKi8KLSNkZWZpbmUgX1JEUiAgICAgICAweDAxCi0jZGVmaW5lIERFTFRBX0RTUiAweDAyCi0jZGVmaW5lIERFTFRBX1JJICAweDA0Ci0jZGVmaW5lIERFTFRBX0NEICAweDA4Ci0jZGVmaW5lIF9DVFMgICAgICAgMHgxMAotI2RlZmluZSBfRFNSICAgICAgIDB4MjAKLSNkZWZpbmUgX1JJICAgICAgICAweDQwCi0jZGVmaW5lIF9DRCAgICAgICAgMHg4MAotCi0vKiBwcm90b3R5cGVzICovCi12b2lkIHVhcnRfaW5pdCggdWFydF9kZXZfdCAqdSwgaW50IGJpdHJhdGUgKTsKLXZvaWQgdWFydF9vdXQoIHVhcnRfZGV2X3QgKnUsIGNoYXIgYyApOwotdm9pZCB1YXJ0X3B1dHMoIHVhcnRfZGV2X3QgKnUsIGNoYXIgKnMgKTsKLWNoYXIgdWFydF9pbiggdWFydF9kZXZfdCAqdSApOwotdm9pZCB1YXJ0X2VuYWJsZV9yY3ZyX2ludCggdWFydF9kZXZfdCAqdSApOwotdm9pZCB1YXJ0X2Rpc2FibGVfcmN2cl9pbnQoIHVhcnRfZGV2X3QgKnUgKTsKLQotI2lmZGVmIERVQVJUMTY1NTJfMV9WQUREUgotLyogIERVQVJUIHByZXNlbnQuICAqLwotI2RlZmluZSBEVUFSVF8xX0JBU0UJKCoodWFydF9kZXZfdCopRFVBUlQxNjU1Ml8xX1ZBRERSKQotI2RlZmluZSBEVUFSVF8yX0JBU0UJKCoodWFydF9kZXZfdCopRFVBUlQxNjU1Ml8yX1ZBRERSKQotI2RlZmluZSBVQVJUMV9QVVRTKHMpCXVhcnRfcHV0cyggJkRVQVJUXzFfQkFTRSwgcyApCi0jZGVmaW5lIFVBUlQyX1BVVFMocykJdWFydF9wdXRzKCAmRFVBUlRfMl9CQVNFLCBzICkKLSNlbHNlCi0vKiAgRFVBUlQgbm90IGNvbmZpZ3VyZWQsIHVzZSBkdW1teSBwbGFjZWhvbGRlcnMgdG8gYWxsb3cgY29tcGlsZXMgdG8gd29yay4gICovCi0jZGVmaW5lIERVQVJUXzFfQkFTRQkoKih1YXJ0X2Rldl90KikwKQotI2RlZmluZSBEVUFSVF8yX0JBU0UJKCoodWFydF9kZXZfdCopMCkKLSNkZWZpbmUgVUFSVDFfUFVUUyhzKQotI2RlZmluZSBVQVJUMl9QVVRTKHMpCi0jZW5kaWYKLQotLyogIENvbXB1dGUgMTYtYml0IGRpdmlzb3IgZm9yIGJhdWRyYXRlIGdlbmVyYXRvciwgd2l0aCByb3VuZGluZzogICovCi0jZGVmaW5lIERVQVJUX0RJVklTT1IoY3J5c3RhbCxzcGVlZCkJKCgoY3J5c3RhbCkvMTYgKyAoc3BlZWQpLzIpLyhzcGVlZCkpCi0KLSNlbmRpZiAvKl91YXJ0X2hfaW5jbHVkZWRfKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS94dDIwMDAuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EveHQyMDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwM2E0NTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS94dDIwMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi0jaWZuZGVmIF9JTkNfWFQyMDAwX0hfCi0jZGVmaW5lIF9JTkNfWFQyMDAwX0hfCi0KLS8qCi0gKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0tIERPIE5PVCBNT0RJRlkgQlkgSEFORAotICoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EveHQyMDAwLmggLSBEZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUKLSAqIFRlbnNpbGljYSBYVDIwMDAgRW11bGF0aW9uIEJvYXJkCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCi0gKi8KLQotCi0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+Ci0jaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9zeXN0ZW0uaD4KLQotCi0vKgotICogIERlZmF1bHQgYXNzaWdubWVudCBvZiBYVDIwMDAgZGV2aWNlcyB0byBleHRlcm5hbCBpbnRlcnJ1cHRzLgotICovCi0KLS8qICBFdGhlcm5ldCBpbnRlcnJ1cHQ6ICAqLwotI2lmZGVmIFhDSEFMX0VYVElOVDNfTlVNCi0jZGVmaW5lIFNPTklDODM5MzRfSU5UTlVNCVhDSEFMX0VYVElOVDNfTlVNCi0jZGVmaW5lIFNPTklDODM5MzRfSU5UTEVWRUwJWENIQUxfRVhUSU5UM19MRVZFTAotI2RlZmluZSBTT05JQzgzOTM0X0lOVE1BU0sJWENIQUxfRVhUSU5UM19NQVNLCi0jZWxzZQotI2RlZmluZSBTT05JQzgzOTM0X0lOVE1BU0sJMAotI2VuZGlmCi0KLS8qICBEVUFSVCBjaGFubmVsIDEgaW50ZXJydXB0IChQMSAtIGNvbnNvbGUpOiAgKi8KLSNpZmRlZiBYQ0hBTF9FWFRJTlQ0X05VTQotI2RlZmluZSBEVUFSVDE2NTUyXzFfSU5UTlVNCVhDSEFMX0VYVElOVDRfTlVNCi0jZGVmaW5lIERVQVJUMTY1NTJfMV9JTlRMRVZFTAlYQ0hBTF9FWFRJTlQ0X0xFVkVMCi0jZGVmaW5lIERVQVJUMTY1NTJfMV9JTlRNQVNLCVhDSEFMX0VYVElOVDRfTUFTSwotI2Vsc2UKLSNkZWZpbmUgRFVBUlQxNjU1Ml8xX0lOVE1BU0sJMAotI2VuZGlmCi0KLS8qICBEVUFSVCBjaGFubmVsIDIgaW50ZXJydXB0IChQMiAtIDJuZCBzZXJpYWwgcG9ydCk6ICAqLwotI2lmZGVmIFhDSEFMX0VYVElOVDVfTlVNCi0jZGVmaW5lIERVQVJUMTY1NTJfMl9JTlROVU0JWENIQUxfRVhUSU5UNV9OVU0KLSNkZWZpbmUgRFVBUlQxNjU1Ml8yX0lOVExFVkVMCVhDSEFMX0VYVElOVDVfTEVWRUwKLSNkZWZpbmUgRFVBUlQxNjU1Ml8yX0lOVE1BU0sJWENIQUxfRVhUSU5UNV9NQVNLCi0jZWxzZQotI2RlZmluZSBEVUFSVDE2NTUyXzJfSU5UTUFTSwkwCi0jZW5kaWYKLQotLyogIEZQR0EtY29tYmluZWQgUENJL2V0YyBpbnRlcnJ1cHRzOiAgKi8KLSNpZmRlZiBYQ0hBTF9FWFRJTlQ2X05VTQotI2RlZmluZSBYVDIwMDBfRlBHQVBDSV9JTlROVU0JWENIQUxfRVhUSU5UNl9OVU0KLSNkZWZpbmUgWFQyMDAwX0ZQR0FQQ0lfSU5UTEVWRUwJWENIQUxfRVhUSU5UNl9MRVZFTAotI2RlZmluZSBYVDIwMDBfRlBHQVBDSV9JTlRNQVNLCVhDSEFMX0VYVElOVDZfTUFTSwotI2Vsc2UKLSNkZWZpbmUgWFQyMDAwX0ZQR0FQQ0lfSU5UTUFTSwkwCi0jZW5kaWYKLQotCi0KLS8qCi0gKiAgRGV2aWNlIGFkZHJlc3Nlcy4KLSAqCi0gKiAgTm90ZTogIGZvciBlbmRpYW5uZXNzLWluZGVwZW5kZW5jZSwgdXNlIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzIGZvciBhbGwKLSAqICByZWdpc3RlciBhY2Nlc3NlcyB0byBFdGhlcm5ldCwgRFVBUlQgYW5kIExFRCBkZXZpY2VzLiAgVW5kZWZpbmVkIGJpdHMKLSAqICBtYXkgbmVlZCB0byBiZSBtYXNrZWQgb3V0IGlmIG5lZWRlZCB3aGVuIHJlYWRpbmcgaWYgdGhlIGFjdHVhbCByZWdpc3RlcgotICogIHNpemUgaXMgc21hbGxlciB0aGFuIDMyIGJpdHMuCi0gKgotICogIE5vdGU6ICBYVDIwMDAgYnVzIGJ5dGUgbGFuZXMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgbXNieXRlIGFuZCBsc2J5dGUKLSAqICByZWxhdGl2ZSB0byB0aGUgcHJvY2Vzc29yLiAgU28gMzItYml0IHJlZ2lzdGVycyBhcmUgYWNjZXNzZWQgY29uc2lzdGVudGx5Ci0gKiAgZnJvbSBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBwcm9jZXNzb3JzLiAgSG93ZXZlciwgdGhpcyBtZWFucyBieXRlCi0gKiAgc2VxdWVuY2VzIGFyZSBub3QgY29uc2lzdGVudCBiZXR3ZWVuIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBwcm9jZXNzb3JzLgotICogIFRoaXMgaXMgZmluZSBmb3IgUkFNLCBhbmQgZm9yIFJPTSBpZiBST00gaXMgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYwotICogIHByb2Nlc3NvciAoYW5kIHRodXMgaGFzIGNvcnJlY3QgYnl0ZSBzZXF1ZW5jZXMpLiAgSG93ZXZlciB0aGlzIG1heSBiZQotICogIHVuZXhwZWN0ZWQgZm9yIEZsYXNoLCB3aGljaCBtaWdodCBjb250YWluIGEgZmlsZS1zeXN0ZW0gdGhhdCBvbmUgd2FudHMKLSAqICB0byB1c2UgZm9yIG11bHRpcGxlIHByb2Nlc3NvciBjb25maWd1cmF0aW9ucyAoZWcuIHRoZSBGbGFzaCBtaWdodCBjb250YWluCi0gKiAgdGhlIEV0aGVybmV0IGNhcmQncyBhZGRyZXNzLCBlbmRpYW5uZXNzLWluZGVwZW5kZW50IGFwcGxpY2F0aW9uIGRhdGEsIGV0YykuCi0gKiAgVGhhdCBpcywgYnl0ZSBzZXF1ZW5jZXMgd3JpdHRlbiBpbiBGbGFzaCBieSBhIGNvcmUgb2YgYSBnaXZlbiBlbmRpYW5uZXNzCi0gKiAgd2lsbCBiZSBieXRlLXN3YXBwZWQgd2hlbiBzZWVuIGJ5IGEgY29yZSBvZiB0aGUgb3RoZXIgZW5kaWFubmVzcy4KLSAqICBTb21lb25lIGltcGxlbWVudGluZyBhbiBlbmRpYW5uZXNzLWluZGVwZW5kZW50IEZsYXNoIGZpbGUgc3lzdGVtIHdpbGwKLSAqICBsaWtlbHkgaGFuZGxlIHRoaXMgYnl0ZS1zd2FwcGluZyBpc3N1ZSBpbiB0aGUgRmxhc2ggZHJpdmVyIHNvZnR3YXJlLgotICovCi0KLSNkZWZpbmUgRFVBUlQxNjU1Ml9YVEFMX0ZSRVEJMTg0MzIwMDAJLyogY3J5c3RhbCBmcmVxdWVuY3kgaW4gSHogKi8KLSNkZWZpbmUgWFRCT0FSRF9GTEFTSF9NQVhTSVpFCTB4NDAwMDAwMAkvKiA2NCBNQiAobWF4OyBkZXBlbmRzIG9uIHdoYXQgaXMgc29ja2V0ZWQhKSAqLwotI2RlZmluZSBYVEJPQVJEX0VQUk9NX01BWFNJWkUJMHgwNDAwMDAwCS8qIDQgTUIgKG1heDsgZGVwZW5kcyBvbiB3aGF0IGlzIHNvY2tldGVkISkgKi8KLSNkZWZpbmUgWFRCT0FSRF9FRVBST01fTUFYU0laRQkweDAwODAwMDAJLyogNTEyIGtCIChtYXg7IGRlcGVuZHMgb24gd2hhdCBpcyBzb2NrZXRlZCEpICovCi0jZGVmaW5lIFhUQk9BUkRfQVNSQU1fU0laRQkweDAxMDAwMDAJLyogMSBNQiAqLwotI2RlZmluZSBYVEJPQVJEX1BDSV9NRU1fU0laRQkweDgwMDAwMDAJLyogMTI4IE1CIChhbGxvY2F0ZWQpICovCi0jZGVmaW5lIFhUQk9BUkRfUENJX0lPX1NJWkUJMHgxMDAwMDAwCS8qIDE2IE1CIChhbGxvY2F0ZWQpICovCi0KLSNpZmRlZiBYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUgotLyogIFBDSSBtZW1vcnkgc3BhY2U6ICAqLwotIyBkZWZpbmUgWFRCT0FSRF9QQ0lfTUVNX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweDAwMDAwMDApCi0vKiAgU29ja2V0ZWQgRmxhc2ggKGVnLiAyIHggMTYtYml0IGRldmljZXMpOiAgKi8KLSMgZGVmaW5lIFhUQk9BUkRfRkxBU0hfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSKzB4ODAwMDAwMCkKLS8qICBQQ0kgSS9PIHNwYWNlOiAgKi8KLSMgZGVmaW5lIFhUQk9BUkRfUENJX0lPX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweEMwMDAwMDApCi0vKiAgVjMgUENJIGludGVyZmFjZSBjaGlwIHJlZ2lzdGVyL2NvbmZpZyBzcGFjZTogICovCi0jIGRlZmluZSBYVEJPQVJEX1YzUENJX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweEQwMDAwMDApCi0vKiAgQnVzIEludGVyZmFjZSByZWdpc3RlcnM6ICAqLwotIyBkZWZpbmUgWFRCT0FSRF9CVVNJTlRfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSKzB4RDAxMDAwMCkKLS8qICBGUEdBIHJlZ2lzdGVyczogICovCi0jIGRlZmluZSBYVDIwMDBfRlBHQVJFR1NfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSKzB4RDAyMDAwMCkKLS8qICBTT05JQyBTTjgzOTM0IEV0aGVybmV0IGNvbnRyb2xsZXIvdHJhbnNjZWl2ZXI6ICAqLwotIyBkZWZpbmUgU09OSUM4MzkzNF9QQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIrMHhEMDMwMDAwKQotLyogIDgtY2hhcmFjdGVyIGJpdG1hcHBlZCBMRUQgZGlzcGxheTogICovCi0jIGRlZmluZSBYVEJPQVJEX0xFRF9QQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIrMHhEMDQwMDAwKQotLyogIE5hdGlvbmFsLVNlbWkgUEMxNjU1MkQgRFVBUlQ6ICAqLwotIyBkZWZpbmUgRFVBUlQxNjU1Ml8xX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweEQwNTAwMjApCS8qIGNoYW5uZWwgMSAoUDEgLSBjb25zb2xlKSAqLwotIyBkZWZpbmUgRFVBUlQxNjU1Ml8yX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweEQwNTAwMDApCS8qIGNoYW5uZWwgMiAoUDIpICovCi0vKiAgQXN5bmNocm9ub3VzIFN0YXRpYyBSQU06ICAqLwotIyBkZWZpbmUgWFRCT0FSRF9BU1JBTV9QQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIrMHhENDAwMDAwKQotLyogIDgtYml0IEVFUFJPTTogICovCi0jIGRlZmluZSBYVEJPQVJEX0VFUFJPTV9QQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIrMHhENjAwMDAwKQotLyogIDIgeCAxNi1iaXQgRVBST01zOiAgKi8KLSMgZGVmaW5lIFhUQk9BUkRfRVBST01fUEFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSKzB4RDgwMDAwMCkKLSNlbmRpZiAvKiBYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUiAqLwotCi0vKiAgVGhlc2UgZGV2aWNlcyBtaWdodCBiZSBhY2Nlc3NlZCBjYWNoZWQ6ICAqLwotI2lmZGVmIFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1BBRERSCi0jIGRlZmluZSBYVEJPQVJEX1BDSV9NRU1fQ0FDSEVEX1BBRERSCShYU0hBTF9JT0JMT0NLX0NBQ0hFRF9QQUREUisweDAwMDAwMDApCi0jIGRlZmluZSBYVEJPQVJEX0ZMQVNIX0NBQ0hFRF9QQUREUgkoWFNIQUxfSU9CTE9DS19DQUNIRURfUEFERFIrMHg4MDAwMDAwKQotIyBkZWZpbmUgWFRCT0FSRF9BU1JBTV9DQUNIRURfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1BBRERSKzB4RDQwMDAwMCkKLSMgZGVmaW5lIFhUQk9BUkRfRUVQUk9NX0NBQ0hFRF9QQUREUgkoWFNIQUxfSU9CTE9DS19DQUNIRURfUEFERFIrMHhENjAwMDAwKQotIyBkZWZpbmUgWFRCT0FSRF9FUFJPTV9DQUNIRURfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1BBRERSKzB4RDgwMDAwMCkKLSNlbmRpZiAvKiBYU0hBTF9JT0JMT0NLX0NBQ0hFRF9QQUREUiAqLwotCi0KLS8qKiogIFNhbWUgdGhpbmcgb3ZlciBhZ2FpbiwgdGhpcyB0aW1lIHdpdGggdmlydHVhbCBhZGRyZXNzZXM6ICAqKiovCi0KLSNpZmRlZiBYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUgotLyogIFBDSSBtZW1vcnkgc3BhY2U6ICAqLwotIyBkZWZpbmUgWFRCT0FSRF9QQ0lfTUVNX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweDAwMDAwMDApCi0vKiAgU29ja2V0ZWQgRmxhc2ggKGVnLiAyIHggMTYtYml0IGRldmljZXMpOiAgKi8KLSMgZGVmaW5lIFhUQk9BUkRfRkxBU0hfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSKzB4ODAwMDAwMCkKLS8qICBQQ0kgSS9PIHNwYWNlOiAgKi8KLSMgZGVmaW5lIFhUQk9BUkRfUENJX0lPX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweEMwMDAwMDApCi0vKiAgVjMgUENJIGludGVyZmFjZSBjaGlwIHJlZ2lzdGVyL2NvbmZpZyBzcGFjZTogICovCi0jIGRlZmluZSBYVEJPQVJEX1YzUENJX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweEQwMDAwMDApCi0vKiAgQnVzIEludGVyZmFjZSByZWdpc3RlcnM6ICAqLwotIyBkZWZpbmUgWFRCT0FSRF9CVVNJTlRfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSKzB4RDAxMDAwMCkKLS8qICBGUEdBIHJlZ2lzdGVyczogICovCi0jIGRlZmluZSBYVDIwMDBfRlBHQVJFR1NfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSKzB4RDAyMDAwMCkKLS8qICBTT05JQyBTTjgzOTM0IEV0aGVybmV0IGNvbnRyb2xsZXIvdHJhbnNjZWl2ZXI6ICAqLwotIyBkZWZpbmUgU09OSUM4MzkzNF9WQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfVkFERFIrMHhEMDMwMDAwKQotLyogIDgtY2hhcmFjdGVyIGJpdG1hcHBlZCBMRUQgZGlzcGxheTogICovCi0jIGRlZmluZSBYVEJPQVJEX0xFRF9WQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfVkFERFIrMHhEMDQwMDAwKQotLyogIE5hdGlvbmFsLVNlbWkgUEMxNjU1MkQgRFVBUlQ6ICAqLwotIyBkZWZpbmUgRFVBUlQxNjU1Ml8xX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweEQwNTAwMjApCS8qIGNoYW5uZWwgMSAoUDEgLSBjb25zb2xlKSAqLwotIyBkZWZpbmUgRFVBUlQxNjU1Ml8yX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweEQwNTAwMDApCS8qIGNoYW5uZWwgMiAoUDIpICovCi0vKiAgQXN5bmNocm9ub3VzIFN0YXRpYyBSQU06ICAqLwotIyBkZWZpbmUgWFRCT0FSRF9BU1JBTV9WQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfVkFERFIrMHhENDAwMDAwKQotLyogIDgtYml0IEVFUFJPTTogICovCi0jIGRlZmluZSBYVEJPQVJEX0VFUFJPTV9WQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfVkFERFIrMHhENjAwMDAwKQotLyogIDIgeCAxNi1iaXQgRVBST01zOiAgKi8KLSMgZGVmaW5lIFhUQk9BUkRfRVBST01fVkFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSKzB4RDgwMDAwMCkKLSNlbmRpZiAvKiBYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUiAqLwotCi0vKiAgVGhlc2UgZGV2aWNlcyBtaWdodCBiZSBhY2Nlc3NlZCBjYWNoZWQ6ICAqLwotI2lmZGVmIFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1ZBRERSCi0jIGRlZmluZSBYVEJPQVJEX1BDSV9NRU1fQ0FDSEVEX1ZBRERSCShYU0hBTF9JT0JMT0NLX0NBQ0hFRF9WQUREUisweDAwMDAwMDApCi0jIGRlZmluZSBYVEJPQVJEX0ZMQVNIX0NBQ0hFRF9WQUREUgkoWFNIQUxfSU9CTE9DS19DQUNIRURfVkFERFIrMHg4MDAwMDAwKQotIyBkZWZpbmUgWFRCT0FSRF9BU1JBTV9DQUNIRURfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1ZBRERSKzB4RDQwMDAwMCkKLSMgZGVmaW5lIFhUQk9BUkRfRUVQUk9NX0NBQ0hFRF9WQUREUgkoWFNIQUxfSU9CTE9DS19DQUNIRURfVkFERFIrMHhENjAwMDAwKQotIyBkZWZpbmUgWFRCT0FSRF9FUFJPTV9DQUNIRURfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1ZBRERSKzB4RDgwMDAwMCkKLSNlbmRpZiAvKiBYU0hBTF9JT0JMT0NLX0NBQ0hFRF9WQUREUiAqLwotCi0KLS8qICBTeXN0ZW0gUk9NOiAgKi8KLSNkZWZpbmUgWFRCT0FSRF9ST01fU0laRQkJWFNIQUxfUk9NX1NJWkUKLSNpZmRlZiBYU0hBTF9ST01fVkFERFIKLSNkZWZpbmUgWFRCT0FSRF9ST01fVkFERFIJCVhTSEFMX1JPTV9WQUREUgotI2VuZGlmCi0jaWZkZWYgWFNIQUxfUk9NX1BBRERSCi0jZGVmaW5lIFhUQk9BUkRfUk9NX1BBRERSCQlYU0hBTF9ST01fUEFERFIKLSNlbmRpZgotCi0vKiAgU3lzdGVtIFJBTTogICovCi0jZGVmaW5lIFhUQk9BUkRfUkFNX1NJWkUJCVhTSEFMX1JBTV9TSVpFCi0jaWZkZWYgWFNIQUxfUkFNX1ZBRERSCi0jZGVmaW5lIFhUQk9BUkRfUkFNX1ZBRERSCQlYU0hBTF9SQU1fVkFERFIKLSNlbmRpZgotI2lmZGVmIFhTSEFMX1JBTV9QQUREUgotI2RlZmluZSBYVEJPQVJEX1JBTV9QQUREUgkJWFNIQUxfUkFNX1BBRERSCi0jZW5kaWYKLSNkZWZpbmUgWFRCT0FSRF9SQU1fQllQQVNTX1ZBRERSCVhTSEFMX1JBTV9CWVBBU1NfVkFERFIKLSNkZWZpbmUgWFRCT0FSRF9SQU1fQllQQVNTX1BBRERSCVhTSEFMX1JBTV9CWVBBU1NfUEFERFIKLQotCi0KLS8qCi0gKiAgVGhpbmdzIHRoYXQgZGVwZW5kIG9uIGRldmljZSBhZGRyZXNzZXMuCi0gKi8KLQotCi0jZGVmaW5lIFhUQk9BUkRfQ0FDSEVBVFRSX1dSSVRFQkFDSwlYU0hBTF9YVDIwMDBfQ0FDSEVBVFRSX1dSSVRFQkFDSwotI2RlZmluZSBYVEJPQVJEX0NBQ0hFQVRUUl9XUklURUFMTE9DCVhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfV1JJVEVBTExPQwotI2RlZmluZSBYVEJPQVJEX0NBQ0hFQVRUUl9XUklURVRIUlUJWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9XUklURVRIUlUKLSNkZWZpbmUgWFRCT0FSRF9DQUNIRUFUVFJfQllQQVNTCVhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfQllQQVNTCi0jZGVmaW5lIFhUQk9BUkRfQ0FDSEVBVFRSX0RFRkFVTFQJWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9ERUZBVUxUCi0KLSNkZWZpbmUgWFRCT0FSRF9CVVNJTlRfUElQRV9SRUdJT05TCVhTSEFMX1hUMjAwMF9QSVBFX1JFR0lPTlMKLSNkZWZpbmUgWFRCT0FSRF9CVVNJTlRfU0RSQU1fUkVHSU9OUwlYU0hBTF9YVDIwMDBfU0RSQU1fUkVHSU9OUwotCi0KLQotLyoKLSAqICBCdXNMb2dpYyAoRlBHQSkgcmVnaXN0ZXJzLgotICogIEFsbCB0aGVzZSByZWdpc3RlcnMgYXJlIG5vcm1hbGx5IGFjY2Vzc2VkIHVzaW5nIDMyLWJpdCBsb2Fkcy9zdG9yZXMuCi0gKi8KLQotLyogIFJlZ2lzdGVyIG9mZnNldHM6ICAqLwotI2RlZmluZSBYVDIwMDBfREFURUNEX09GUwkweDAwCS8qIGRhdGUgY29kZSAocmVhZC1vbmx5KSAqLwotI2RlZmluZSBYVDIwMDBfU1RTUkVHX09GUwkweDA0CS8qIHN0YXR1cyAocmVhZC1vbmx5KSAqLwotI2RlZmluZSBYVDIwMDBfU1lTTEVEX09GUwkweDA4CS8qIHN5c3RlbSBMRUQgKi8KLSNkZWZpbmUgWFQyMDAwX1dSUFJPVF9PRlMJMHgwQwkvKiB3cml0ZSBwcm90ZWN0ICovCi0jZGVmaW5lIFhUMjAwMF9TV1JTVF9PRlMJMHgxMAkvKiBzb2Z0d2FyZSByZXNldCAqLwotI2RlZmluZSBYVDIwMDBfU1lTUlNUX09GUwkweDE0CS8qIHN5c3RlbSAocGVyaXBoZXJhbHMpIHJlc2V0ICovCi0jZGVmaW5lIFhUMjAwMF9JTUFTS19PRlMJMHgxOAkvKiBpbnRlcnJ1cHQgbWFzayAqLwotI2RlZmluZSBYVDIwMDBfSVNUQVRfT0ZTCTB4MUMJLyogaW50ZXJydXB0IHN0YXR1cyAqLwotI2RlZmluZSBYVDIwMDBfVjNDRkdfT0ZTCTB4MjAJLyogVjMgY29uZmlnIChWMzIwIFBDSSkgKi8KLQotLyogIFBoeXNpY2FsIHJlZ2lzdGVyIGFkZHJlc3NlczogICovCi0jaWZkZWYgWFQyMDAwX0ZQR0FSRUdTX1BBRERSCi0jZGVmaW5lIFhUMjAwMF9EQVRFQ0RfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfREFURUNEX09GUykKLSNkZWZpbmUgWFQyMDAwX1NUU1JFR19QQUREUgkoWFQyMDAwX0ZQR0FSRUdTX1BBRERSK1hUMjAwMF9TVFNSRUdfT0ZTKQotI2RlZmluZSBYVDIwMDBfU1lTTEVEX1BBRERSCShYVDIwMDBfRlBHQVJFR1NfUEFERFIrWFQyMDAwX1NZU0xFRF9PRlMpCi0jZGVmaW5lIFhUMjAwMF9XUlBST1RfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfV1JQUk9UX09GUykKLSNkZWZpbmUgWFQyMDAwX1NXUlNUX1BBRERSCShYVDIwMDBfRlBHQVJFR1NfUEFERFIrWFQyMDAwX1NXUlNUX09GUykKLSNkZWZpbmUgWFQyMDAwX1NZU1JTVF9QQUREUgkoWFQyMDAwX0ZQR0FSRUdTX1BBRERSK1hUMjAwMF9TWVNSU1RfT0ZTKQotI2RlZmluZSBYVDIwMDBfSU1BU0tfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfSU1BU0tfT0ZTKQotI2RlZmluZSBYVDIwMDBfSVNUQVRfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfSVNUQVRfT0ZTKQotI2RlZmluZSBYVDIwMDBfVjNDRkdfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfVjNDRkdfT0ZTKQotI2VuZGlmCi0KLS8qICBWaXJ0dWFsIHJlZ2lzdGVyIGFkZHJlc3NlczogICovCi0jaWZkZWYgWFQyMDAwX0ZQR0FSRUdTX1ZBRERSCi0jZGVmaW5lIFhUMjAwMF9EQVRFQ0RfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfREFURUNEX09GUykKLSNkZWZpbmUgWFQyMDAwX1NUU1JFR19WQUREUgkoWFQyMDAwX0ZQR0FSRUdTX1ZBRERSK1hUMjAwMF9TVFNSRUdfT0ZTKQotI2RlZmluZSBYVDIwMDBfU1lTTEVEX1ZBRERSCShYVDIwMDBfRlBHQVJFR1NfVkFERFIrWFQyMDAwX1NZU0xFRF9PRlMpCi0jZGVmaW5lIFhUMjAwMF9XUlBST1RfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfV1JQUk9UX09GUykKLSNkZWZpbmUgWFQyMDAwX1NXUlNUX1ZBRERSCShYVDIwMDBfRlBHQVJFR1NfVkFERFIrWFQyMDAwX1NXUlNUX09GUykKLSNkZWZpbmUgWFQyMDAwX1NZU1JTVF9WQUREUgkoWFQyMDAwX0ZQR0FSRUdTX1ZBRERSK1hUMjAwMF9TWVNSU1RfT0ZTKQotI2RlZmluZSBYVDIwMDBfSU1BU0tfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfSU1BU0tfT0ZTKQotI2RlZmluZSBYVDIwMDBfSVNUQVRfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfSVNUQVRfT0ZTKQotI2RlZmluZSBYVDIwMDBfVjNDRkdfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfVjNDRkdfT0ZTKQotLyogIFJlZ2lzdGVyIGFjY2VzcyAoZm9yIEMgY29kZSk6ICAqLwotI2RlZmluZSBYVDIwMDBfREFURUNEX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9EQVRFQ0RfVkFERFIpCi0jZGVmaW5lIFhUMjAwMF9TVFNSRUdfUkVHCSgqKHZvbGF0aWxlIHVuc2lnbmVkKikgWFQyMDAwX1NUU1JFR19WQUREUikKLSNkZWZpbmUgWFQyMDAwX1NZU0xFRF9SRUcJKCoodm9sYXRpbGUgdW5zaWduZWQqKSBYVDIwMDBfU1lTTEVEX1ZBRERSKQotI2RlZmluZSBYVDIwMDBfV1JQUk9UX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9XUlBST1RfVkFERFIpCi0jZGVmaW5lIFhUMjAwMF9TV1JTVF9SRUcJKCoodm9sYXRpbGUgdW5zaWduZWQqKSBYVDIwMDBfU1dSU1RfVkFERFIpCi0jZGVmaW5lIFhUMjAwMF9TWVNSU1RfUkVHCSgqKHZvbGF0aWxlIHVuc2lnbmVkKikgWFQyMDAwX1NZU1JTVF9WQUREUikKLSNkZWZpbmUgWFQyMDAwX0lNQVNLX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9JTUFTS19WQUREUikKLSNkZWZpbmUgWFQyMDAwX0lTVEFUX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9JU1RBVF9WQUREUikKLSNkZWZpbmUgWFQyMDAwX1YzQ0ZHX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9WM0NGR19WQUREUikKLSNlbmRpZgotCi0vKiAgREFURUNEIChkYXRlIGNvZGUpIGJpdCBmaWVsZHM6ICAqLwotCi0vKiAgQkNELWNvZGVkIG1vbnRoICgwMS4uMTIpOiAgKi8KLSNkZWZpbmUgWFQyMDAwX0RBVEVDRF9NT05USF9TSElGVAkyNAotI2RlZmluZSBYVDIwMDBfREFURUNEX01PTlRIX0JJVFMJOAotI2RlZmluZSBYVDIwMDBfREFURUNEX01PTlRIX01BU0sJMHhGRjAwMDAwMAotLyogIEJDRC1jb2RlZCBkYXkgKDAxLi4zMSk6ICAqLwotI2RlZmluZSBYVDIwMDBfREFURUNEX0RBWV9TSElGVAkJMTYKLSNkZWZpbmUgWFQyMDAwX0RBVEVDRF9EQVlfQklUUwkJOAotI2RlZmluZSBYVDIwMDBfREFURUNEX0RBWV9NQVNLCQkweDAwRkYwMDAwCi0vKiAgQkNELWNvZGVkIHllYXIgKDIwMDEuLjk5OTkpOiAgKi8KLSNkZWZpbmUgWFQyMDAwX0RBVEVDRF9ZRUFSX1NISUZUCTAKLSNkZWZpbmUgWFQyMDAwX0RBVEVDRF9ZRUFSX0JJVFMJCTE2Ci0jZGVmaW5lIFhUMjAwMF9EQVRFQ0RfWUVBUl9NQVNLCQkweDAwMDBGRkZGCi0KLS8qICBTVFNSRUcgKHN0YXR1cykgYml0IGZpZWxkczogICovCi0KLS8qICBTd2l0Y2ggU1czIHNldHRpbmcgYml0IGZpZWxkcyAoMD1vZmYvdXAsIDE9b24vZG93bik6ICAqLwotI2RlZmluZSBYVDIwMDBfU1RTUkVHX1NXM19TSElGVAkJMAotI2RlZmluZSBYVDIwMDBfU1RTUkVHX1NXM19CSVRTCQk0Ci0jZGVmaW5lIFhUMjAwMF9TVFNSRUdfU1czX01BU0sJCTB4MDAwMDAwMEYKLS8qICBCb290LXNlbGVjdCBiaXRzIG9mIHN3aXRjaCBTVzM6ICAqLwotI2RlZmluZSBYVDIwMDBfU1RTUkVHX0JPT1RTRUxfU0hJRlQJMAotI2RlZmluZSBYVDIwMDBfU1RTUkVHX0JPT1RTRUxfQklUUwkyCi0jZGVmaW5lIFhUMjAwMF9TVFNSRUdfQk9PVFNFTF9NQVNLCTB4MDAwMDAwMDMKLS8qICBCb290LXNlbGVjdCB2YWx1ZXM6ICAqLwotI2RlZmluZSBYVDIwMDBfU1RTUkVHX0JPT1RTRUxfRkxBU0gJMAotI2RlZmluZSBYVDIwMDBfU1RTUkVHX0JPT1RTRUxfRVBST00xNgkxCi0jZGVmaW5lIFhUMjAwMF9TVFNSRUdfQk9PVFNFTF9QUk9NOAkyCi0jZGVmaW5lIFhUMjAwMF9TVFNSRUdfQk9PVFNFTF9BU1JBTQkzCi0vKiAgVXNlci1kZWZpbmVkIGJpdHMgb2Ygc3dpdGNoIFNXMzogICovCi0jZGVmaW5lIFhUMjAwMF9TVFNSRUdfU1czXzJfU0hJRlQJMgotI2RlZmluZSBYVDIwMDBfU1RTUkVHX1NXM18yX01BU0sJMHgwMDAwMDAwNAotI2RlZmluZSBYVDIwMDBfU1RTUkVHX1NXM18zX1NISUZUCTMKLSNkZWZpbmUgWFQyMDAwX1NUU1JFR19TVzNfM19NQVNLCTB4MDAwMDAwMDgKLQotLyogIFNZU0xFRCAoc3lzdGVtIExFRCkgYml0IGZpZWxkczogICovCi0KLS8qICBMRUQgY29udHJvbCBiaXQgKDA9b2ZmLCAxPW9uKTogICovCi0jZGVmaW5lIFhUMjAwMF9TWVNMRURfTEVET05fU0hJRlQJMAotI2RlZmluZSBYVDIwMDBfU1lTTEVEX0xFRE9OX01BU0sJMHgwMDAwMDAwMQotCi0vKiAgV1JQUk9UICh3cml0ZSBwcm90ZWN0KSBiaXQgZmllbGRzICgwPXdyaXRhYmxlLCAxPXdyaXRlLXByb3RlY3RlZCBbZGVmYXVsdF0pOiAgKi8KLQotLyogIEZsYXNoIHdyaXRlIHByb3RlY3Q6ICAqLwotI2RlZmluZSBYVDIwMDBfV1JQUk9UX0ZMV1BfU0hJRlQJMAotI2RlZmluZSBYVDIwMDBfV1JQUk9UX0ZMV1BfTUFTSwkJMHgwMDAwMDAwMQotLyogIFJlc2VydmVkIGJ1dCBwcmVzZW50IHdyaXRlIHByb3RlY3QgYml0czogICovCi0jZGVmaW5lIFhUMjAwMF9XUlBST1RfV1JQX1NISUZUCQkxCi0jZGVmaW5lIFhUMjAwMF9XUlBST1RfV1JQX0JJVFMJCTcKLSNkZWZpbmUgWFQyMDAwX1dSUFJPVF9XUlBfTUFTSwkJMHgwMDAwMDBGRQotCi0vKiAgU1dSU1QgKHNvZnR3YXJlIHJlc2V0OyBhbGxvd3Mgcy93IHRvIGdlbmVyYXRlIHBvd2VyLW9uIGVxdWl2YWxlbnQgcmVzZXQpOiAgKi8KLQotLyogIFNvZnR3YXJlIHJlc2V0IGJpdHM6ICAqLwotI2RlZmluZSBYVDIwMDBfU1dSU1RfU1dSX1NISUZUCQkwCi0jZGVmaW5lIFhUMjAwMF9TV1JTVF9TV1JfQklUUwkJMTYKLSNkZWZpbmUgWFQyMDAwX1NXUlNUX1NXUl9NQVNLCQkweDAwMDBGRkZGCi0vKiAgU29mdHdhcmUgcmVzZXQgdmFsdWUgLS0gd3JpdGluZyB0aGlzIHZhbHVlIHJlc2V0cyB0aGUgYm9hcmQ6ICAqLwotI2RlZmluZSBYVDIwMDBfU1dSU1RfUkVTRVRWQUxVRQkJMHgwMDAwREVBRAotCi0vKiAgU1lTUlNUIChzeXN0ZW0gcmVzZXQ7IGNvbnRyb2xzIHJlc2V0IG9mIGluZGl2aWR1YWwgcGVyaXBoZXJhbHMpOiAgKi8KLQotLyogIEFsbC1kZXZpY2UgcmVzZXQ6ICAqLwotI2RlZmluZSBYVDIwMDBfU1lTUlNUX0FMTF9TSElGVAkJMAotI2RlZmluZSBYVDIwMDBfU1lTUlNUX0FMTF9CSVRTCQk0Ci0jZGVmaW5lIFhUMjAwMF9TWVNSU1RfQUxMX01BU0sJCTB4MDAwMDAwMEYKLS8qICBIRFNQLTI1MzQgTEVEIGRpc3BsYXkgcmVzZXQgKDE9cmVzZXQsIDA9bm90aGluZyk6ICAqLwotI2RlZmluZSBYVDIwMDBfU1lTUlNUX0xFRF9TSElGVAkJMAotI2RlZmluZSBYVDIwMDBfU1lTUlNUX0xFRF9NQVNLCQkweDAwMDAwMDAxCi0vKiAgU29uaWMgRFA4MzkzNCBFdGhlcm5ldCBjb250cm9sbGVyIHJlc2V0ICgxPXJlc2V0LCAwPW5vdGhpbmcpOiAgKi8KLSNkZWZpbmUgWFQyMDAwX1NZU1JTVF9TT05JQ19TSElGVAkxCi0jZGVmaW5lIFhUMjAwMF9TWVNSU1RfU09OSUNfTUFTSwkweDAwMDAwMDAyCi0vKiAgRFAxNjU1MiBEVUFSVCByZXNldCAoMT1yZXNldCwgMD1ub3RoaW5nKTogICovCi0jZGVmaW5lIFhUMjAwMF9TWVNSU1RfRFVBUlRfU0hJRlQJMgotI2RlZmluZSBYVDIwMDBfU1lTUlNUX0RVQVJUX01BU0sJMHgwMDAwMDAwNAotLyogIFYzIFYzMjAgUENJIGJyaWRnZSBjb250cm9sbGVyIHJlc2V0ICgxPXJlc2V0LCAwPW5vdGhpbmcpOiAgKi8KLSNkZWZpbmUgWFQyMDAwX1NZU1JTVF9WM19TSElGVAkJMwotI2RlZmluZSBYVDIwMDBfU1lTUlNUX1YzX01BU0sJCTB4MDAwMDAwMDgKLQotLyogIElNQVNLIChpbnRlcnJ1cHQgbWFzazsgMD1kaXNhYmxlLCAxPWVuYWJsZSk6ICAqLwotLyogIElTVEFUIChpbnRlcnJ1cHQgc3RhdHVzOyAwPWluYWN0aXZlLCAxPXBlbmRpbmcpOiAgKi8KLQotLyogIFBDSSBJTlRQIGludGVycnVwdDogICovCi0jZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0lOVFBfU0hJRlQJMgotI2RlZmluZSBYVDIwMDBfSU5UTVVYX1BDSV9JTlRQX01BU0sJMHgwMDAwMDAwNAotLyogIFBDSSBJTlRTIGludGVycnVwdDogICovCi0jZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0lOVFNfU0hJRlQJMwotI2RlZmluZSBYVDIwMDBfSU5UTVVYX1BDSV9JTlRTX01BU0sJMHgwMDAwMDAwOAotLyogIFBDSSBJTlREIGludGVycnVwdDogICovCi0jZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0lOVERfU0hJRlQJNAotI2RlZmluZSBYVDIwMDBfSU5UTVVYX1BDSV9JTlREX01BU0sJMHgwMDAwMDAxMAotLyogIFYzMjAgUENJIGNvbnRyb2xsZXIgaW50ZXJydXB0OiAgKi8KLSNkZWZpbmUgWFQyMDAwX0lOVE1VWF9WM19TSElGVAkJNQotI2RlZmluZSBYVDIwMDBfSU5UTVVYX1YzX01BU0sJCTB4MDAwMDAwMjAKLS8qICBQQ0kgRU5VTSBpbnRlcnJ1cHQ6ICAqLwotI2RlZmluZSBYVDIwMDBfSU5UTVVYX1BDSV9FTlVNX1NISUZUCTYKLSNkZWZpbmUgWFQyMDAwX0lOVE1VWF9QQ0lfRU5VTV9NQVNLCTB4MDAwMDAwNDAKLS8qICBQQ0kgREVHIGludGVycnVwdDogICovCi0jZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0RFR19TSElGVAk3Ci0jZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0RFR19NQVNLCTB4MDAwMDAwODAKLQotLyogIFYzQ0ZHIChWMyBjb25maWcsIFYzMjAgUENJIGNvbnRyb2xsZXIpOiAgKi8KLQotLyogIFYzIGFkZHJlc3MgY29udHJvbCAoMD1wYXNzLXRocnUsIDE9VjMgYWRkcmVzcyBiaXRzIDMxOjI4IHNldCB0byA0J2IwMDAxIFtkZWZhdWx0XSk6ICAqLwotI2RlZmluZSBYVDIwMDBfVjNDRkdfVjNBRENfU0hJRlQJMAotI2RlZmluZSBYVDIwMDBfVjNDRkdfVjNBRENfTUFTSwkJMHgwMDAwMDAwMQotCi0vKiBJMkMgRGV2aWNlcyAqLwotCi0jZGVmaW5lCVhUMjAwMF9JMkNfUlRDX0lECQkweDY4Ci0jZGVmaW5lCVhUMjAwMF9JMkNfTlZSQU0wX0lECQkweDU2CS8qIDFzdCAyNTYgYnl0ZSBibG9jayAqLwotI2RlZmluZQlYVDIwMDBfSTJDX05WUkFNMV9JRAkJMHg1NwkvKiAybmQgMjU2IGJ5dGUgYmxvY2sgKi8KLQotLyogIE5WUkFNIEJvYXJkIEluZm8gc3RydWN0dXJlOiAgKi8KLQotI2RlZmluZSBYVDIwMDBfTlZSQU1fU0laRQkJNTEyCi0KLSNkZWZpbmUgWFQyMDAwX05WUkFNX0JJTkZPX1NUQVJUCTB4MTAwCi0jZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19TSVpFCQkweDIwCi0jZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19WRVJTSU9OCTB4MTAJLyogdmVyc2lvbiAxLjAgKi8KLSNpZiAwCi0jZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19WRVJTSU9OX09GRlNFVAkweDAwCi0jZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19WRVJTSU9OX1NJWkUJCQkweDEKLSNkZWZpbmUgWFQyMDAwX05WUkFNX0JJTkZPX0VUSF9BRERSX09GRlNFVAkweDAyCi0jZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19FVEhfQUREUl9TSVpFCQkweDYKLSNkZWZpbmUgWFQyMDAwX05WUkFNX0JJTkZPX1NOX09GRlNFVAkJMHgxMAotI2RlZmluZSBYVDIwMDBfTlZSQU1fQklORk9fU05fU0laRQkJCTB4RQotI2RlZmluZQlYVDIwMDBfTlZSQU1fQklORk9fQ1JDX09GRlNFVAkJMHgxRQotI2RlZmluZQlYVDIwMDBfTlZSQU1fQklORk9fQ1JDX1NJWkUJCQkweDIKLSNlbmRpZiAvKjAqLwotCi0jaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKSAmJiAhZGVmaW5lZChfTk9DTEFOR1VBR0UpCi10eXBlZGVmIHN0cnVjdCB4dDIwMDBfbnZyYW1fYmluZm8gewotICAgIHVuc2lnbmVkIGNoYXIJdmVyc2lvbjsKLSAgICB1bnNpZ25lZCBjaGFyCXJlc2VydmVkMTsKLSAgICB1bnNpZ25lZCBjaGFyCWV0aF9hZGRyWzZdOwotICAgIHVuc2lnbmVkIGNoYXIJcmVzZXJ2ZWQ4WzhdOwotICAgIHVuc2lnbmVkIGNoYXIJc2VyaWFsbm9bMTRdOwotICAgIHVuc2lnbmVkIGNoYXIJY3JjWzJdOwkJLyogMTYtYml0IENSQyAqLwotfSB4dDIwMDBfbnZyYW1fYmluZm87Ci0jZW5kaWYgLyohX19BU1NFTUJMWV9fICYmICFfTk9DTEFOR1VBR0UqLwotCi0KLSNlbmRpZiAvKl9JTkNfWFQyMDAwX0hfKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS94dGJvYXJkLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3h0Ym9hcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0NjljMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3h0Ym9hcmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0jaWZuZGVmIF94dGJvYXJkX2hfaW5jbHVkZWRfCi0jZGVmaW5lIF94dGJvYXJkX2hfaW5jbHVkZWRfCi0KLS8qCi0gKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0tIERPIE5PVCBNT0RJRlkgQlkgSEFORAotICoKLSAqICB4dGJvYXJkLmggIC0tICBSb3V0aW5lcyBmb3IgZ2V0dGluZyB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSB0aGUgYm9hcmQuCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCi0gKi8KLQotCi0jaW5jbHVkZSA8eHRlbnNhL3h0MjAwMC5oPgotCi0jZGVmaW5lCVhUQk9BUkRfUlRDX0VSUk9SCS0xCi0jZGVmaW5lCVhUQk9BUkRfUlRDX1NUT1BQRUQJLTIKLQotCi0vKiAgeHQyMDAwLWkyY2Rldi5jOiAgKi8KLXR5cGVkZWYgdm9pZCBYdGJvYXJkRGVsYXlGdW5jKCB1bnNpZ25lZCApOwotZXh0ZXJuIFh0Ym9hcmREZWxheUZ1bmMqIHh0Ym9hcmRfc2V0X25zZGVsYXlfZnVuYyggWHRib2FyZERlbGF5RnVuYyAqZGVsYXlfZm4gKTsKLWV4dGVybiBpbnQgeHRib2FyZF9pMmNfcmVhZCAodW5zaWduZWQgaWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgYWRkciwgdW5zaWduZWQgc2l6ZSk7Ci1leHRlcm4gaW50IHh0Ym9hcmRfaTJjX3dyaXRlKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGFkZHIsIHVuc2lnbmVkIHNpemUpOwotZXh0ZXJuIGludCB4dGJvYXJkX2kyY193YWl0X252cmFtX2Fjayh1bnNpZ25lZCBpZCwgdW5zaWduZWQgc3d0aW1lcik7Ci0KLS8qICB4dGJvYXJkLmM6ICAqLwotZXh0ZXJuIGludCB4dGJvYXJkX252cmFtX3JlYWQgKHVuc2lnbmVkIGFkZHIsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY2hhciAqYnVmKTsKLWV4dGVybiBpbnQgeHRib2FyZF9udnJhbV93cml0ZSh1bnNpZ25lZCBhZGRyLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNoYXIgKmJ1Zik7Ci1leHRlcm4gaW50IHh0Ym9hcmRfbnZyYW1fYmluZm9fcmVhZCAoeHQyMDAwX252cmFtX2JpbmZvICpidWYpOwotZXh0ZXJuIGludCB4dGJvYXJkX252cmFtX2JpbmZvX3dyaXRlKHh0MjAwMF9udnJhbV9iaW5mbyAqYnVmKTsKLWV4dGVybiBpbnQgeHRib2FyZF9udnJhbV9iaW5mb192YWxpZCh4dDIwMDBfbnZyYW1fYmluZm8gKmJ1Zik7Ci1leHRlcm4gaW50IHh0Ym9hcmRfZXRoZXJtYWNfZ2V0KHVuc2lnbmVkIGNoYXIgKmJ1Zik7Ci1leHRlcm4gaW50IHh0Ym9hcmRfZXRoZXJtYWNfc2V0KHVuc2lnbmVkIGNoYXIgKmJ1Zik7Ci0KLS8qKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vIEZ1bmN0aW9uOiB4dGJvYXJkX2dldF9ydGNfdGltZQotLwotLyBEZXNjcmlwdGlvbjogIEdldCB0aW1lIHN0b3JlZCBpbiByZWFsLXRpbWUgY2xvY2suCi0vCi0vIFJldHVybnM6IHRpbWUgaW4gc2Vjb25kcyBzdG9yZWQgaW4gcmVhbC10aW1lIGNsb2NrLgotLy0qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1leHRlcm4gdW5zaWduZWQgeHRib2FyZF9nZXRfcnRjX3RpbWUodm9pZCk7Ci0KLS8qKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vIEZ1bmN0aW9uOiB4dGJvYXJkX3NldF9ydGNfdGltZQotLwotLyBEZXNjcmlwdGlvbjogIFNldCB0aW1lIHN0b3JlZCBpbiByZWFsLXRpbWUgY2xvY2suCi0vCi0vIFBhcmFtZXRlcnM6IAl0aW1lIC0tIHRpbWUgaW4gc2Vjb25kcyB0byBzdG9yZSB0byByZWFsLXRpbWUgY2xvY2sKLS8KLS8gUmV0dXJuczogMCBvbiBzdWNjZXNzLCB4dGJvYXJkX2kyY193cml0ZSgpIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotLy0qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1leHRlcm4gaW50IHh0Ym9hcmRfc2V0X3J0Y190aW1lKHVuc2lnbmVkIHRpbWUpOwotCi0KLS8qICB4dGZyZXEuYzogICovCi0vKisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyBGdW5jdGlvbjogeHRib2FyZF9tZWFzdXJlX3N5c19jbGsKLS8KLS8gRGVzY3JpcHRpb246ICBHZXQgZnJlcXVlbmN5IG9mIHN5c3RlbSBjbG9jay4KLS8KLS8gUGFyYW1ldGVyczoJbm9uZQotLwotLyBSZXR1cm5zOiBmcmVxdWVuY3kgb2Ygc3lzdGVtIGNsb2NrLgotLy0qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1leHRlcm4gdW5zaWduZWQgeHRib2FyZF9tZWFzdXJlX3N5c19jbGsodm9pZCk7Ci0KLQotI2lmIDAJLyogb2xkIHN0dWZmIGZyb20geHRib2FyZC5jOiAqLwotCi0vKisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyBGdW5jdGlvbjogeHRib2FyZF9udnJhbSB2YWxpZAotLwotLyBEZXNjcmlwdGlvbjogIERldGVybWluZXMgaWYgZGF0YSBpbiBOVlJBTSBpcyB2YWxpZC4KLS8KLS8gUGFyYW1ldGVyczoJZGVsYXkgLS0gMTB1cyBkZWxheSBmdW5jdGlvbgotLwotLyBSZXR1cm5zOiAxIGlmIE5WUkFNIGlzIHZhbGlkLCAwIG90aGVyd2lzZQotLy0qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1leHRlcm4gdW5zaWduZWQgeHRib2FyZF9udnJhbV92YWxpZCh2b2lkICgqZGVsYXkpKCB2b2lkICkpOwotCi0vKisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyBGdW5jdGlvbjogeHRib2FyZF9nZXRfbnZyYW1fY29udGVudHMKLS8KLS8gRGVzY3JpcHRpb246ICBSZXR1cm5zIGNvbnRlbnRzIG9mIE5WUkFNLgotLwotLyBQYXJhbWV0ZXJzOiAJYnVmIC0tIGJ1ZmZlciB0byBOVlJBTSBjb250ZW50cy4KLS8JCWRlbGF5IC0tIDEwdXMgZGVsYXkgZnVuY3Rpb24KLS8KLS8gUmV0dXJuczogMSBpZiBOVlJBTSBpcyB2YWxpZCwgMCBvdGhlcndpc2UKLS8tKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZXh0ZXJuIHVuc2lnbmVkIHh0Ym9hcmRfZ2V0X252cmFtX2NvbnRlbnRzKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgdm9pZCAoKmRlbGF5KSggdm9pZCApKTsKLQotLyorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8gRnVuY3Rpb246IHh0Ym9hcmRfZ2V0X2V0aGVyX2FkZHIKLS8KLS8gRGVzY3JpcHRpb246ICBSZXR1cm5zIGV0aGVybmV0IGFkZHJlc3Mgb2YgYm9hcmQuCi0vCi0vIFBhcmFtZXRlcnM6IAlidWYgLS0gYnVmZmVyIHRvIHN0b3JlIGV0aGVybmV0IGFkZHJlc3MKLS8JCWRlbGF5IC0tIDEwdXMgZGVsYXkgZnVuY3Rpb24KLS8KLS8gUmV0dXJuczogbm90aGluZy4KLS8tKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZXh0ZXJuIHZvaWQgeHRib2FyZF9nZXRfZXRoZXJfYWRkcih1bnNpZ25lZCBjaGFyICpidWYsIHZvaWQgKCpkZWxheSkoIHZvaWQgKSk7Ci0KLSNlbmRpZiAvKjAqLwotCi0KLSNlbmRpZiAvKl94dGJvYXJkX2hfaW5jbHVkZWRfKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vYjEyOG9wcy5oIGIvaW5jbHVkZS9jcnlwdG8vYjEyOG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOGU2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NyeXB0by9iMTI4b3BzLmgKQEAgLTAsMCArMSw4MCBAQAorLyogYjEyOG9wcy5oIC0gY29tbW9uIDEyOC1iaXQgYmxvY2sgb3BlcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMywgRHIgQnJpYW4gR2xhZG1hbiwgV29yY2VzdGVyLCBVSy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgUmlrIFNuZWwgPHJzbmVsQGN1YmUuZHluZG5zLm9yZz4KKyAqCisgKiBCYXNlZCBvbiBEciBCcmlhbiBHbGFkbWFuJ3MgKEdQTCdkKSB3b3JrIHB1Ymxpc2hlZCBhdAorICogaHR0cDovL2ZwLmdsYWRtYW4ucGx1cy5jb20vY3J5cHRvZ3JhcGh5X3RlY2hub2xvZ3kvaW5kZXguaHRtCisgKiBTZWUgdGhlIG9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgYmVsb3cuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworLyoKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDb3B5cmlnaHQgKGMpIDIwMDMsIERyIEJyaWFuIEdsYWRtYW4sIFdvcmNlc3RlciwgVUsuICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIExJQ0VOU0UgVEVSTVMKKworIFRoZSBmcmVlIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gYm90aCBzb3VyY2UgYW5kIGJpbmFyeQorIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisKKyAgIDEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKworICAgMi4gZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIGFzc29jaWF0ZWQgbWF0ZXJpYWxzOworCisgICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICAgICAgYnVpbHQgdXNpbmcgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksCisgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2ZW4gYWJvdmUuCisKKyBESVNDTEFJTUVSCisKKyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgY29ycmVjdG5lc3MKKyBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJc3N1ZSBEYXRlOiAxMy8wNi8yMDA2CisqLworCisjaWZuZGVmIF9DUllQVE9fQjEyOE9QU19ICisjZGVmaW5lIF9DUllQVE9fQjEyOE9QU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJdTY0IGEsIGI7Cit9IHUxMjg7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2JlNjQgYSwgYjsKK30gYmUxMjg7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlNjQgYiwgYTsKK30gbGUxMjg7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTI4X3hvcih1MTI4ICpyLCBjb25zdCB1MTI4ICpwLCBjb25zdCB1MTI4ICpxKQoreworCXItPmEgPSBwLT5hIF4gcS0+YTsKKwlyLT5iID0gcC0+YiBeIHEtPmI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZTEyOF94b3IoYmUxMjggKnIsIGNvbnN0IGJlMTI4ICpwLCBjb25zdCBiZTEyOCAqcSkKK3sKKwl1MTI4X3hvcigodTEyOCAqKXIsICh1MTI4ICopcCwgKHUxMjggKilxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxlMTI4X3hvcihsZTEyOCAqciwgY29uc3QgbGUxMjggKnAsIGNvbnN0IGxlMTI4ICpxKQoreworCXUxMjhfeG9yKCh1MTI4ICopciwgKHUxMjggKilwLCAodTEyOCAqKXEpOworfQorCisjZW5kaWYgLyogX0NSWVBUT19CMTI4T1BTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL2dmMTI4bXVsLmggYi9pbmNsdWRlL2NyeXB0by9nZjEyOG11bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDMxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NyeXB0by9nZjEyOG11bC5oCkBAIC0wLDAgKzEsMTk4IEBACisvKiBnZjEyOG11bC5oIC0gR0YoMl4xMjgpIG11bHRpcGxpY2F0aW9uIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMywgRHIgQnJpYW4gR2xhZG1hbiwgV29yY2VzdGVyLCBVSy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBSaWsgU25lbCA8cnNuZWxAY3ViZS5keW5kbnMub3JnPgorICoKKyAqIEJhc2VkIG9uIERyIEJyaWFuIEdsYWRtYW4ncyAoR1BMJ2QpIHdvcmsgcHVibGlzaGVkIGF0CisgKiBodHRwOi8vZnAuZ2xhZG1hbi5wbHVzLmNvbS9jcnlwdG9ncmFwaHlfdGVjaG5vbG9neS9pbmRleC5odG0KKyAqIFNlZSB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBiZWxvdy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisvKgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENvcHlyaWdodCAoYykgMjAwMywgRHIgQnJpYW4gR2xhZG1hbiwgV29yY2VzdGVyLCBVSy4gICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgTElDRU5TRSBURVJNUworCisgVGhlIGZyZWUgZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5CisgZm9ybSBpcyBhbGxvd2VkICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykgcHJvdmlkZWQgdGhhdDoKKworICAgMS4gZGlzdHJpYnV0aW9ucyBvZiB0aGlzIHNvdXJjZSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyOworCisgICAyLiBkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisKKyAgIDMuIHRoZSBjb3B5cmlnaHQgaG9sZGVyJ3MgbmFtZSBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzCisgICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgQUxURVJOQVRJVkVMWSwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyByZXRhaW5lZCBpbiBmdWxsLCB0aGlzIHByb2R1Y3QKKyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXBwbHkgSU5TVEVBRCBPRiB0aG9zZSBnaXZlbiBhYm92ZS4KKworIERJU0NMQUlNRVIKKworIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzIGlzJyB3aXRoIG5vIGV4cGxpY2l0IG9yIGltcGxpZWQgd2FycmFudGllcworIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworIGFuZC9vciBmaXRuZXNzIGZvciBwdXJwb3NlLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElzc3VlIERhdGU6IDMxLzAxLzIwMDYKKworIEFuIGltcGxlbWVudGF0aW9uIG9mIGZpZWxkIG11bHRpcGxpY2F0aW9uIGluIEdhbG9pcyBGaWVsZCBHRigxMjgpCisqLworCisjaWZuZGVmIF9DUllQVE9fR0YxMjhNVUxfSAorI2RlZmluZSBfQ1JZUFRPX0dGMTI4TVVMX0gKKworI2luY2x1ZGUgPGNyeXB0by9iMTI4b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBDb21tZW50IGJ5IFJpazoKKyAqCisgKiBGb3Igc29tZSBiYWNrZ3JvdW5kIG9uIEdGKDJeMTI4KSBzZWUgZm9yIGV4YW1wbGU6IGh0dHA6Ly8tCisgKiBjc3JjLm5pc3QuZ292L0NyeXB0b1Rvb2xraXQvbW9kZXMvcHJvcG9zZWRtb2Rlcy9nY20vZ2NtLXJldmlzZWQtc3BlYy5wZGYKKyAqCisgKiBUaGUgZWxlbWVudHMgb2YgR0YoMl4xMjgpIDo9IEdGKDIpW1hdLyhYXjEyOC1YXjctWF4yLVheMS0xKSBjYW4KKyAqIGJlIG1hcHBlZCB0byBjb21wdXRlciBtZW1vcnkgaW4gYSB2YXJpZXR5IG9mIHdheXMuIExldCdzIGV4YW1pbmUKKyAqIHRocmVlIGNvbW1vbiBjYXNlcy4KKyAqCisgKiBUYWtlIGEgbG9vayBhdCB0aGUgMTYgYmluYXJ5IG9jdGV0cyBiZWxvdyBpbiBtZW1vcnkgb3JkZXIuIFRoZSBtc2IncworICogYXJlIGxlZnQgYW5kIHRoZSBsc2IncyBhcmUgcmlnaHQuIGNoYXIgYlsxNl0gaXMgYW4gYXJyYXkgYW5kIGJbMF0gaXMKKyAqIHRoZSBmaXJzdCBvY3RldC4KKyAqCisgKiA4MDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAuLi4uIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwCisgKiAgIGJbMF0gICAgIGJbMV0gICAgIGJbMl0gICAgIGJbM10gICAgICAgICAgYlsxM10gICAgYlsxNF0gICAgYlsxNV0KKyAqCisgKiBFdmVyeSBiaXQgaXMgYSBjb2VmZmljaWVudCBvZiBzb21lIHBvd2VyIG9mIFguIFdlIGNhbiBzdG9yZSB0aGUgYml0cworICogaW4gZXZlcnkgYnl0ZSBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIGFuZCB0aGUgYnl0ZXMgdGhlbXNlbHZlcyBhbHNvIGluCisgKiBsaXR0bGUgZW5kaWFuIG9yZGVyLiBJIHdpbGwgY2FsbCB0aGlzIGxsZSAobGl0dGxlLWxpdHRsZS1lbmRpYW4pLgorICogVGhlIGFib3ZlIGJ1ZmZlciByZXByZXNlbnRzIHRoZSBwb2x5bm9taWFsIDEsIGFuZCBYXjcrWF4yK1heMSsxIGxvb2tzCisgKiBsaWtlIDExMTAwMDAxIDAwMDAwMDAwIC4uLi4gMDAwMDAwMDAgPSB7IDB4RTEsIDB4MDAsIH0uCisgKiBUaGlzIGZvcm1hdCB3YXMgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBpbiBnZjEyOG11bCBhbmQgaXMgdXNlZAorICogaW4gR0NNIChHYWxvaXMvQ291bnRlciBtb2RlKSBhbmQgaW4gQUJMIChBcmJpdHJhcnkgQmxvY2sgTGVuZ3RoKS4KKyAqCisgKiBBbm90aGVyIGNvbnZlbnRpb24gc2F5czogc3RvcmUgdGhlIGJpdHMgaW4gYmlnZW5kaWFuIG9yZGVyIGFuZCB0aGUKKyAqIGJ5dGVzIGFsc28uIFRoaXMgaXMgYmJlIChiaWctYmlnLWVuZGlhbikuIE5vdyB0aGUgYnVmZmVyIGFib3ZlCisgKiByZXByZXNlbnRzIFheMTI3LiBYXjcrWF4yK1heMSsxIGxvb2tzIGxpa2UgMDAwMDAwMDAgLi4uLiAxMDAwMDExMSwKKyAqIGJbMTVdID0gMHg4NyBhbmQgdGhlIHJlc3QgaXMgMC4gTFJXIHVzZXMgdGhpcyBjb252ZW50aW9uIGFuZCBiYmUKKyAqIGlzIHBhcnRseSBpbXBsZW1lbnRlZC4KKyAqCisgKiBCb3RoIG9mIHRoZSBhYm92ZSBmb3JtYXRzIGFyZSBlYXN5IHRvIGltcGxlbWVudCBvbiBiaWctZW5kaWFuCisgKiBtYWNoaW5lcy4KKyAqCisgKiBFTUUgKHdoaWNoIGlzIHBhdGVudCBlbmN1bWJlcmVkKSB1c2VzIHRoZSBibGUgZm9ybWF0IChiaXRzIGFyZSBzdG9yZWQKKyAqIGluIGJpZyBlbmRpYW4gb3JkZXIgYW5kIHRoZSBieXRlcyBpbiBsaXR0bGUgZW5kaWFuKS4gVGhlIGFib3ZlIGJ1ZmZlcgorICogcmVwcmVzZW50cyBYXjcgaW4gdGhpcyBjYXNlIGFuZCB0aGUgcHJpbWl0aXZlIHBvbHlub21pYWwgaXMgYlswXSA9IDB4ODcuCisgKgorICogVGhlIGNvbW1vbiBtYWNoaW5lIHdvcmQtc2l6ZSBpcyBzbWFsbGVyIHRoYW4gMTI4IGJpdHMsIHNvIHRvIG1ha2UKKyAqIGFuIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiB3ZSBtdXN0IHNwbGl0IGludG8gbWFjaGluZSB3b3JkIHNpemVzLgorICogVGhpcyBmaWxlIHVzZXMgb25lIDMyYml0IGZvciB0aGUgbW9tZW50LiBNYWNoaW5lIGVuZGlhbm5lc3MgY29tZXMgaW50bworICogcGxheS4gVGhlIGxsZSBmb3JtYXQgaW4gcmVsYXRpb24gdG8gbWFjaGluZSBlbmRpYW5uZXNzIGlzIGRpc2N1c3NlZAorICogYmVsb3cgYnkgdGhlIG9yaWdpbmFsIGF1dGhvciBvZiBnZjEyOG11bCBEciBCcmlhbiBHbGFkbWFuLgorICoKKyAqIExldCdzIGxvb2sgYXQgdGhlIGJiZSBhbmQgYmxlIGZvcm1hdCBvbiBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZS4KKyAqCisgKiBiYmUgb24gYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmUgdTMyIHhbNF06CisgKgorICogIE1TICAgICAgICAgICAgeFswXSAgICAgICAgICAgTFMgIE1TICAgICAgICAgICAgeFsxXQkJICBMUworICogIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMgIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMKKyAqICAxMDMuLjk2IDExMS4xMDQgMTE5LjExMiAxMjcuMTIwICA3MS4uLjY0IDc5Li4uNzIgODcuLi44MCA5NS4uLjg4CisgKgorICogIE1TICAgICAgICAgICAgeFsyXSAgICAgICAgICAgTFMgIE1TICAgICAgICAgICAgeFszXQkJICBMUworICogIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMgIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMKKyAqICAzOS4uLjMyIDQ3Li4uNDAgNTUuLi40OCA2My4uLjU2ICAwNy4uLjAwIDE1Li4uMDggMjMuLi4xNiAzMS4uLjI0CisgKgorICogYmxlIG9uIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lCisgKgorICogIE1TICAgICAgICAgICAgeFswXSAgICAgICAgICAgTFMgIE1TICAgICAgICAgICAgeFsxXQkJICBMUworICogIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMgIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMKKyAqICAzMS4uLjI0IDIzLi4uMTYgMTUuLi4wOCAwNy4uLjAwICA2My4uLjU2IDU1Li4uNDggNDcuLi40MCAzOS4uLjMyCisgKgorICogIE1TICAgICAgICAgICAgeFsyXSAgICAgICAgICAgTFMgIE1TICAgICAgICAgICAgeFszXQkJICBMUworICogIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMgIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMKKyAqICA5NS4uLjg4IDg3Li4uODAgNzkuLi43MiA3MS4uLjY0ICAxMjcuMTIwIDE5OS4xMTIgMTExLjEwNCAxMDMuLjk2CisgKgorICogTXVsdGlwbGljYXRpb25zIGluIEdGKDJeMTI4KSBhcmUgbW9zdGx5IGJpdC1zaGlmdHMsIHNvIHlvdSBzZWUgd2h5CisgKiBibGUgKGFuZCBsYmUgYWxzbykgYXJlIGVhc2llciB0byBpbXBsZW1lbnQgb24gYSBsaXR0bGUtZW5kaWFuCisgKiBtYWNoaW5lIHRoYW4gb24gYSBiaWctZW5kaWFuIG1hY2hpbmUuIFRoZSBjb252ZXJzZSBob2xkcyBmb3IgYmJlCisgKiBhbmQgbGxlLgorICoKKyAqIE5vdGU6IHRvIGhhdmUgZ29vZCBhbGlnbm1lbnQsIGl0IHNlZW1zIHRvIG1lIHRoYXQgaXQgaXMgc3VmZmljaWVudAorICogdG8ga2VlcCBlbGVtZW50cyBvZiBHRigyXjEyOCkgaW4gdHlwZSB1NjRbMl0uIE9uIDMyLWJpdCB3b3Jkc2l6ZQorICogbWFjaGluZXMgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYWxpZ25lZCB0byB3b3Jkc2l6ZSBhbmQgb24gYSA2NC1iaXQKKyAqIG1hY2hpbmUgYWxzby4KKyAqLworLyoJTXVsdGlwbHkgYSBHRjEyOCBmaWVsZCBlbGVtZW50IGJ5IHguIEZpZWxkIGVsZW1lbnRzIGFyZSBoZWxkIGluIGFycmF5cworICAgIG9mIGJ5dGVzIGluIHdoaWNoIGZpZWxkIGJpdHMgOG4uLjhuICsgNyBhcmUgaGVsZCBpbiBieXRlW25dLCB3aXRoIGxvd2VyCisgICAgaW5kZXhlZCBiaXRzIHBsYWNlZCBpbiB0aGUgbW9yZSBudW1lcmljYWxseSBzaWduaWZpY2FudCBiaXQgcG9zaXRpb25zCisgICAgd2l0aGluIGJ5dGVzLgorCisgICAgT24gbGl0dGxlIGVuZGlhbiBtYWNoaW5lcyB0aGUgYml0IGluZGV4ZXMgdHJhbnNsYXRlIGludG8gdGhlIGJpdAorICAgIHBvc2l0aW9ucyB3aXRoaW4gZm91ciAzMi1iaXQgd29yZHMgaW4gdGhlIGZvbGxvd2luZyB3YXkKKworICAgIE1TICAgICAgICAgICAgeFswXSAgICAgICAgICAgTFMgIE1TICAgICAgICAgICAgeFsxXQkJICBMUworICAgIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMgIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMKKyAgICAyNC4uLjMxIDE2Li4uMjMgMDguLi4xNSAwMC4uLjA3ICA1Ni4uLjYzIDQ4Li4uNTUgNDAuLi40NyAzMi4uLjM5CisKKyAgICBNUyAgICAgICAgICAgIHhbMl0gICAgICAgICAgIExTICBNUyAgICAgICAgICAgIHhbM10JCSAgTFMKKyAgICBtcyAgIGxzIG1zICAgbHMgbXMgICBscyBtcyAgIGxzICBtcyAgIGxzIG1zICAgbHMgbXMgICBscyBtcyAgIGxzCisgICAgODguLi45NSA4MC4uLjg3IDcyLi4uNzkgNjQuLi43MSAgMTIwLjEyNyAxMTIuMTE5IDEwNC4xMTEgOTYuLjEwMworCisgICAgT24gYmlnIGVuZGlhbiBtYWNoaW5lcyB0aGUgYml0IGluZGV4ZXMgdHJhbnNsYXRlIGludG8gdGhlIGJpdAorICAgIHBvc2l0aW9ucyB3aXRoaW4gZm91ciAzMi1iaXQgd29yZHMgaW4gdGhlIGZvbGxvd2luZyB3YXkKKworICAgIE1TICAgICAgICAgICAgeFswXSAgICAgICAgICAgTFMgIE1TICAgICAgICAgICAgeFsxXQkJICBMUworICAgIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMgIG1zICAgbHMgbXMgICBscyBtcyAgIGxzIG1zICAgbHMKKyAgICAwMC4uLjA3IDA4Li4uMTUgMTYuLi4yMyAyNC4uLjMxICAzMi4uLjM5IDQwLi4uNDcgNDguLi41NSA1Ni4uLjYzCisKKyAgICBNUyAgICAgICAgICAgIHhbMl0gICAgICAgICAgIExTICBNUyAgICAgICAgICAgIHhbM10JCSAgTFMKKyAgICBtcyAgIGxzIG1zICAgbHMgbXMgICBscyBtcyAgIGxzICBtcyAgIGxzIG1zICAgbHMgbXMgICBscyBtcyAgIGxzCisgICAgNjQuLi43MSA3Mi4uLjc5IDgwLi4uODcgODguLi45NSAgOTYuLjEwMyAxMDQuMTExIDExMi4xMTkgMTIwLjEyNworKi8KKworLyoJQSBzbG93IGdlbmVyaWMgdmVyc2lvbiBvZiBnZl9tdWwsIGltcGxlbWVudGVkIGZvciBsbGUgYW5kIGJiZQorICogCUl0IG11bHRpcGxpZXMgYSBhbmQgYiBhbmQgcHV0cyB0aGUgcmVzdWx0IGluIGEgKi8KK3ZvaWQgZ2YxMjhtdWxfbGxlKGJlMTI4ICphLCBjb25zdCBiZTEyOCAqYik7CisKK3ZvaWQgZ2YxMjhtdWxfYmJlKGJlMTI4ICphLCBjb25zdCBiZTEyOCAqYik7CisKKworLyogNGsgdGFibGUgb3B0aW1pemF0aW9uICovCisKK3N0cnVjdCBnZjEyOG11bF80ayB7CisJYmUxMjggdFsyNTZdOworfTsKKworc3RydWN0IGdmMTI4bXVsXzRrICpnZjEyOG11bF9pbml0XzRrX2xsZShjb25zdCBiZTEyOCAqZyk7CitzdHJ1Y3QgZ2YxMjhtdWxfNGsgKmdmMTI4bXVsX2luaXRfNGtfYmJlKGNvbnN0IGJlMTI4ICpnKTsKK3ZvaWQgZ2YxMjhtdWxfNGtfbGxlKGJlMTI4ICphLCBzdHJ1Y3QgZ2YxMjhtdWxfNGsgKnQpOwordm9pZCBnZjEyOG11bF80a19iYmUoYmUxMjggKmEsIHN0cnVjdCBnZjEyOG11bF80ayAqdCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZjEyOG11bF9mcmVlXzRrKHN0cnVjdCBnZjEyOG11bF80ayAqdCkKK3sKKwlrZnJlZSh0KTsKK30KKworCisvKiA2NGsgdGFibGUgb3B0aW1pemF0aW9uLCBpbXBsZW1lbnRlZCBmb3IgbGxlIGFuZCBiYmUgKi8KKworc3RydWN0IGdmMTI4bXVsXzY0ayB7CisJc3RydWN0IGdmMTI4bXVsXzRrICp0WzE2XTsKK307CisKKy8qIGZpcnN0IGluaXRpYWxpemUgd2l0aCB0aGUgY29uc3RhbnQgZmFjdG9yIHdpdGggd2hpY2ggeW91CisgKiB3YW50IHRvIG11bHRpcGx5IGFuZCB0aGVuIGNhbGwgZ2YxMjhfNjRrX2xsZSB3aXRoIHRoZSBvdGhlcgorICogZmFjdG9yIGluIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIHRhYmxlIGluIHRoZSBzZWNvbmQgYW5kIGEKKyAqIHNjcmF0Y2ggcmVnaXN0ZXIgaW4gdGhlIHRoaXJkLiBBZnRlcndhcmRzICphID0gKnIuICovCitzdHJ1Y3QgZ2YxMjhtdWxfNjRrICpnZjEyOG11bF9pbml0XzY0a19sbGUoY29uc3QgYmUxMjggKmcpOworc3RydWN0IGdmMTI4bXVsXzY0ayAqZ2YxMjhtdWxfaW5pdF82NGtfYmJlKGNvbnN0IGJlMTI4ICpnKTsKK3ZvaWQgZ2YxMjhtdWxfZnJlZV82NGsoc3RydWN0IGdmMTI4bXVsXzY0ayAqdCk7Cit2b2lkIGdmMTI4bXVsXzY0a19sbGUoYmUxMjggKmEsIHN0cnVjdCBnZjEyOG11bF82NGsgKnQpOwordm9pZCBnZjEyOG11bF82NGtfYmJlKGJlMTI4ICphLCBzdHJ1Y3QgZ2YxMjhtdWxfNjRrICp0KTsKKworI2VuZGlmIC8qIF9DUllQVE9fR0YxMjhNVUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCA1MTE0ZmYxLi5hMWIwNGQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtNjAsMTAgKzYwLDcgQEAKIGhlYWRlci15ICs9IGZkLmgKIGhlYWRlci15ICs9IGZkcmVnLmgKIGhlYWRlci15ICs9IGZpYl9ydWxlcy5oCi1oZWFkZXIteSArPSBmdGFwZS1oZWFkZXItc2VnbWVudC5oCi1oZWFkZXIteSArPSBmdGFwZS12ZW5kb3JzLmgKIGhlYWRlci15ICs9IGZ1c2UuaAotaGVhZGVyLXkgKz0gZnV0ZXguaAogaGVhZGVyLXkgKz0gZ2VuZXRsaW5rLmgKIGhlYWRlci15ICs9IGdlbl9zdGF0cy5oCiBoZWFkZXIteSArPSBnaWdhc2V0X2Rldi5oCkBAIC0xMjAsNiArMTE3LDcgQEAKIGhlYWRlci15ICs9IG5mczIuaAogaGVhZGVyLXkgKz0gbmZzNF9tb3VudC5oCiBoZWFkZXIteSArPSBuZnNfbW91bnQuaAoraGVhZGVyLXkgKz0gb29tLmgKIGhlYWRlci15ICs9IHBhcmFtLmgKIGhlYWRlci15ICs9IHBjaV9pZHMuaAogaGVhZGVyLXkgKz0gcGNpX3JlZ3MuaApAQCAtMTkyLDcgKzE5MCw2IEBACiB1bmlmZGVmLXkgKz0gY3ljbGFkZXMuaAogdW5pZmRlZi15ICs9IGRjY3AuaAogdW5pZmRlZi15ICs9IGRpcmVudC5oCi11bmlmZGVmLXkgKz0gZGl2ZXJ0LmgKIHVuaWZkZWYteSArPSBkbG0uaAogdW5pZmRlZi15ICs9IGVsZmNvcmUuaAogdW5pZmRlZi15ICs9IGVycm5vLmgKQEAgLTIwNSw4ICsyMDIsOCBAQAogdW5pZmRlZi15ICs9IGZjbnRsLmgKIHVuaWZkZWYteSArPSBmaWx0ZXIuaAogdW5pZmRlZi15ICs9IGZsYXQuaAordW5pZmRlZi15ICs9IGZ1dGV4LmgKIHVuaWZkZWYteSArPSBmcy5oCi11bmlmZGVmLXkgKz0gZnRhcGUuaAogdW5pZmRlZi15ICs9IGdhbWVwb3J0LmgKIHVuaWZkZWYteSArPSBnZW5lcmljX3NlcmlhbC5oCiB1bmlmZGVmLXkgKz0gZ2VuaGQuaApAQCAtMjI0LDYgKzIyMSw3IEBACiB1bmlmZGVmLXkgKz0gaWZfZWMuaAogdW5pZmRlZi15ICs9IGlmX2VxbC5oCiB1bmlmZGVmLXkgKz0gaWZfZXRoZXIuaAordW5pZmRlZi15ICs9IGlmX2ZkZGkuaAogdW5pZmRlZi15ICs9IGlmX2ZyYWQuaAogdW5pZmRlZi15ICs9IGlmX2x0YWxrLmgKIHVuaWZkZWYteSArPSBpZl9wcHBveC5oCkBAIC0yODUsNiArMjgzLDcgQEAKIHVuaWZkZWYteSArPSBwYXJwb3J0LmgKIHVuaWZkZWYteSArPSBwYXRjaGtleS5oCiB1bmlmZGVmLXkgKz0gcGNpLmgKK3VuaWZkZWYteSArPSBwZXJzb25hbGl0eS5oCiB1bmlmZGVmLXkgKz0gcGt0Y2R2ZC5oCiB1bmlmZGVmLXkgKz0gcG11LmgKIHVuaWZkZWYteSArPSBwb2xsLmgKQEAgLTM0MCw3ICszMzksNyBAQAogdW5pZmRlZi15ICs9IHdhaXQuaAogdW5pZmRlZi15ICs9IHdhbnJvdXRlci5oCiB1bmlmZGVmLXkgKz0gd2F0Y2hkb2cuaAordW5pZmRlZi15ICs9IHdpcmVsZXNzLmgKIHVuaWZkZWYteSArPSB4ZnJtLmgKLXVuaWZkZWYteSArPSB6ZnRhcGUuaAogCiBvYmpoZHIteSArPSB2ZXJzaW9uLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNjdC5oIGIvaW5jbHVkZS9saW51eC9hY2N0LmgKaW5kZXggMDQ5NmQxZi4uMzAyZWI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY2N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hY2N0LmgKQEAgLTExOSw2ICsxMTksNyBAQAogI2lmZGVmIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUCiBzdHJ1Y3QgdmZzbW91bnQ7CiBzdHJ1Y3Qgc3VwZXJfYmxvY2s7CitzdHJ1Y3QgcGFjY3Rfc3RydWN0OwogZXh0ZXJuIHZvaWQgYWNjdF9hdXRvX2Nsb3NlX21udChzdHJ1Y3QgdmZzbW91bnQgKm0pOwogZXh0ZXJuIHZvaWQgYWNjdF9hdXRvX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogZXh0ZXJuIHZvaWQgYWNjdF9pbml0X3BhY2N0KHN0cnVjdCBwYWNjdF9zdHJ1Y3QgKnBhY2N0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggODhiNWRmZC4uMmIwYzk1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTQ5NCw2ICs0OTQsOSBAQAogCiBleHRlcm4gaW50IGVjX3JlYWQodTggYWRkciwgdTggKnZhbCk7CiBleHRlcm4gaW50IGVjX3dyaXRlKHU4IGFkZHIsIHU4IHZhbCk7CitleHRlcm4gaW50IGVjX3RyYW5zYWN0aW9uKHU4IGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICp3ZGF0YSwgdW5zaWduZWQgd2RhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqcmRhdGEsIHVuc2lnbmVkIHJkYXRhX2xlbik7CiAKICNlbmRpZiAvKkNPTkZJR19BQ1BJX0VDKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9haW8uaCBiL2luY2x1ZGUvbGludXgvYWlvLmgKaW5kZXggMGQ3MWMwMC4uYTMwZWYxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9haW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Fpby5oCkBAIC0xMDUsMTMgKzEwNSwxMyBAQAogCXdhaXRfcXVldWVfdAkJa2lfd2FpdDsKIAlsb2ZmX3QJCQlraV9wb3M7CiAKKwlhdG9taWNfdAkJa2lfYmlvX2NvdW50OwkvKiBudW0gYmlvIHVzZWQgZm9yIHRoaXMgaW9jYiAqLwogCXZvaWQJCQkqcHJpdmF0ZTsKIAkvKiBTdGF0ZSB0aGF0IHdlIHJlbWVtYmVyIHRvIGJlIGFibGUgdG8gcmVzdGFydC9yZXRyeSAgKi8KIAl1bnNpZ25lZCBzaG9ydAkJa2lfb3Bjb2RlOwogCXNpemVfdAkJCWtpX25ieXRlczsgCS8qIGNvcHkgb2YgaW9jYi0+YWlvX25ieXRlcyAqLwogCWNoYXIgCQkJX191c2VyICpraV9idWY7CS8qIHJlbWFpbmluZyBpb2NiLT5haW9fYnVmICovCiAJc2l6ZV90CQkJa2lfbGVmdDsgCS8qIHJlbWFpbmluZyBieXRlcyAqLwotCWxvbmcJCQlraV9yZXRyaWVkOyAJLyoganVzdCBmb3IgdGVzdGluZyAqLwogCXN0cnVjdCBpb3ZlYwkJa2lfaW5saW5lX3ZlYzsJLyogaW5saW5lIHZlY3RvciAqLwogIAlzdHJ1Y3QgaW92ZWMJCSpraV9pb3ZlYzsKICAJdW5zaWduZWQgbG9uZwkJa2lfbnJfc2VnczsKQEAgLTE5NCw3ICsxOTQsNyBAQAogCiAJc3RydWN0IGFpb19yaW5nX2luZm8JcmluZ19pbmZvOwogCi0Jc3RydWN0IHdvcmtfc3RydWN0CXdxOworCXN0cnVjdCBkZWxheWVkX3dvcmsJd3E7CiB9OwogCiAvKiBwcm90b3R5cGVzICovCkBAIC0yMzgsNyArMjM4LDYgQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgaW9fd2FpdF90b19raW9jYih3YWl0KSBjb250YWluZXJfb2Yod2FpdCwgc3RydWN0IGtpb2NiLCBraV93YWl0KQotI2RlZmluZSBpc19yZXRyaWVkX2tpb2NiKGlvY2IpICgoaW9jYiktPmtpX3JldHJpZWQgPiAxKQogCiAjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0YS5oIGIvaW5jbHVkZS9saW51eC9hdGEuaAppbmRleCBkODk0NDE5Li4xZGY5NDE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRhLmgKQEAgLTIwMCw4ICsyMDAsOSBAQAogCUFUQV9DQkxfTk9ORQkJPSAwLAogCUFUQV9DQkxfUEFUQTQwCQk9IDEsCiAJQVRBX0NCTF9QQVRBODAJCT0gMiwKLQlBVEFfQ0JMX1BBVEFfVU5LCT0gMywKLQlBVEFfQ0JMX1NBVEEJCT0gNCwKKwlBVEFfQ0JMX1BBVEE0MF9TSE9SVAk9IDMsCQkvKiA0MCB3aXJlIGNhYmxlIHRvIGhpZ2ggVURNQSBzcGVjICovCisJQVRBX0NCTF9QQVRBX1VOSwk9IDQsCisJQVRBX0NCTF9TQVRBCQk9IDUsCiAKIAkvKiBTQVRBIFN0YXR1cyBhbmQgQ29udHJvbCBSZWdpc3RlcnMgKi8KIAlTQ1JfU1RBVFVTCQk9IDAsCkBAIC0zNDIsNiArMzQzLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGF0YV9kcml2ZV80MHdpcmUoY29uc3QgdTE2ICpkZXZfaWQpCit7CisJaWYgKGF0YV9pZF9tYWpvcl92ZXJzaW9uKGRldl9pZCkgPj0gNSAmJiBhdGFfaWRfaXNfc2F0YShkZXZfaWQpKQorCQlyZXR1cm4gMDsJLyogU0FUQSAqLworCWlmIChkZXZfaWRbOTNdICYgMHg0MDAwKQorCQlyZXR1cm4gMDsJLyogODAgd2lyZSAqLworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW5saW5lIGludCBhdGFwaV9jZGJfbGVuKGNvbnN0IHUxNiAqZGV2X2lkKQogewogCXUxNiB0bXAgPSBkZXZfaWRbMF0gJiAweDM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWFycC5oIGIvaW5jbHVkZS9saW51eC9hdG1hcnAuaAppbmRleCAyNGY4MjMzLi5lZTEwOGY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWFycC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtYXJwLmgKQEAgLTM3LDcgKzM3LDcgQEAKIHN0cnVjdCBhdG1hcnBfY3RybCB7CiAJZW51bSBhdG1hcnBfY3RybF90eXBlCXR5cGU7CS8qIG1lc3NhZ2UgdHlwZSAqLwogCWludAkJCWl0Zl9udW07LyogaW50ZXJmYWNlIG51bWJlciAoaWYgcHJlc2VudCkgKi8KLQl1aW50MzJfdAkJaXA7CS8qIElQIGFkZHJlc3MgKGFjdF9uZWVkIG9ubHkpICovCisJX19iZTMyCQkJaXA7CS8qIElQIGFkZHJlc3MgKGFjdF9uZWVkIG9ubHkpICovCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRtYnIyNjg0LmggYi9pbmNsdWRlL2xpbnV4L2F0bWJyMjY4NC5oCmluZGV4IDc5ODFiNzMuLjk2OWZiNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRtYnIyNjg0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hdG1icjI2ODQuaApAQCAtODYsOCArODYsOCBAQAogICogZWZmaWNpZW50IHBlci1pZiBpbi9vdXQgZmlsdGVycywgdGhpcyBzdXBwb3J0IHdpbGwgYmUgcmVtb3ZlZAogICovCiBzdHJ1Y3QgYnIyNjg0X2ZpbHRlciB7Ci0JX191MzIJcHJlZml4OwkJLyogbmV0d29yayBieXRlIG9yZGVyICovCi0JX191MzIJbmV0bWFzazsJLyogMCA9IGRpc2FibGUgZmlsdGVyICovCisJX19iZTMyCXByZWZpeDsJCS8qIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCV9fYmUzMgluZXRtYXNrOwkvKiAwID0gZGlzYWJsZSBmaWx0ZXIgKi8KIH07CiAKIHN0cnVjdCBicjI2ODRfZmlsdGVyX3NldCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bW1wYy5oIGIvaW5jbHVkZS9saW51eC9hdG1tcGMuaAppbmRleCA1ZmJmYTY4Li5lYTE2NTA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bW1wYy5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtbXBjLmgKQEAgLTEzLDcgKzEzLDcgQEAKIAogc3RydWN0IGF0bW1wY19pb2MgewogICAgICAgICBpbnQgZGV2X251bTsKLSAgICAgICAgdWludDMyX3QgaXBhZGRyOyAgICAgICAgICAgICAgLyogdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNob3J0Y3V0ICAgICovCisgICAgICAgIF9fYmUzMiBpcGFkZHI7ICAgICAgICAgICAgICAvKiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgc2hvcnRjdXQgICAgKi8KICAgICAgICAgaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgICAgLyogaW5ncmVzcyBvciBlZ3Jlc3MgICAgICAgICAgICAgICAgICovCiB9OwogCkBAIC0yMSw4ICsyMSw4IEBACiAgICAgICAgIHVpbnQ4X3QgICBMYXN0X05IUlBfQ0lFX2NvZGU7CiAgICAgICAgIHVpbnQ4X3QgICBMYXN0X1EyOTMxX2NhdXNlX3ZhbHVlOyAgICAgCiAgICAgICAgIHVpbnQ4X3QgICBlZ19NUENfQVRNX2FkZHJbQVRNX0VTQV9MRU5dOwotICAgICAgICB1aW50MzJfdCAgdGFnOwotICAgICAgICB1aW50MzJfdCAgaW5fZHN0X2lwOyAgICAgIC8qIElQIGFkZHJlc3MgdGhpcyBpbmdyZXNzIE1QQyBzZW5kcyBwYWNrZXRzIHRvICovCisgICAgICAgIF9fYmUzMiAgdGFnOworICAgICAgICBfX2JlMzIgIGluX2RzdF9pcDsgICAgICAvKiBJUCBhZGRyZXNzIHRoaXMgaW5ncmVzcyBNUEMgc2VuZHMgcGFja2V0cyB0byAqLwogICAgICAgICB1aW50MTZfdCAgaG9sZGluZ190aW1lOwogICAgICAgICB1aW50MzJfdCAgcmVxdWVzdF9pZDsKIH0gaW5fY3RybF9pbmZvOwpAQCAtMzAsMTAgKzMwLDEwIEBACiB0eXBlZGVmIHN0cnVjdCBlZ19jdHJsX2luZm8gewogICAgICAgICB1aW50OF90ICAgRExMX2hlYWRlclsyNTZdOwogICAgICAgICB1aW50OF90ICAgREhfbGVuZ3RoOwotICAgICAgICB1aW50MzJfdCAgY2FjaGVfaWQ7Ci0gICAgICAgIHVpbnQzMl90ICB0YWc7Ci0gICAgICAgIHVpbnQzMl90ICBtcHNfaXA7Ci0gICAgICAgIHVpbnQzMl90ICBlZ19kc3RfaXA7ICAgICAgLyogSVAgYWRkcmVzcyB0byB3aGljaCBpbmdyZXNzIE1QQyBzZW5kcyBwYWNrZXRzICovCisgICAgICAgIF9fYmUzMiAgY2FjaGVfaWQ7CisgICAgICAgIF9fYmUzMiAgdGFnOworICAgICAgICBfX2JlMzIgIG1wc19pcDsKKyAgICAgICAgX19iZTMyICBlZ19kc3RfaXA7ICAgICAgLyogSVAgYWRkcmVzcyB0byB3aGljaCBpbmdyZXNzIE1QQyBzZW5kcyBwYWNrZXRzICovCiAgICAgICAgIHVpbnQ4X3QgICBpbl9NUENfZGF0YV9BVE1fYWRkcltBVE1fRVNBX0xFTl07CiAgICAgICAgIHVpbnQxNl90ICBob2xkaW5nX3RpbWU7CiB9IGVnX2N0cmxfaW5mbzsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogc3RydWN0IGtfbWVzc2FnZSB7CiAgICAgICAgIHVpbnQxNl90IHR5cGU7Ci0gICAgICAgIHVpbnQzMl90IGlwX21hc2s7CisgICAgICAgIF9fYmUzMiBpcF9tYXNrOwogICAgICAgICB1aW50OF90ICBNUFNfY3RybFtBVE1fRVNBX0xFTl07CiAgICAgICAgIHVuaW9uIHsKICAgICAgICAgICAgICAgICBpbl9jdHJsX2luZm8gaW5faW5mbzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXVkaXQuaCBiL2luY2x1ZGUvbGludXgvYXVkaXQuaAppbmRleCBiMmNhNjY2Li4wZTA3ZGI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCkBAIC0xMDEsNiArMTAxLDEwIEBACiAjZGVmaW5lIEFVRElUX01BQ19DSVBTT1Y0X0RFTAkxNDA4CS8qIE5ldExhYmVsOiBkZWwgQ0lQU092NCBET0kgZW50cnkgKi8KICNkZWZpbmUgQVVESVRfTUFDX01BUF9BREQJMTQwOQkvKiBOZXRMYWJlbDogYWRkIExTTSBkb21haW4gbWFwcGluZyAqLwogI2RlZmluZSBBVURJVF9NQUNfTUFQX0RFTAkxNDEwCS8qIE5ldExhYmVsOiBkZWwgTFNNIGRvbWFpbiBtYXBwaW5nICovCisjZGVmaW5lIEFVRElUX01BQ19JUFNFQ19BRERTQQkxNDExCS8qIEFkZCBhIFhGUk0gc3RhdGUgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0RFTFNBCTE0MTIJLyogRGVsZXRlIGEgWEZSTSBzdGF0ZSAqLworI2RlZmluZSBBVURJVF9NQUNfSVBTRUNfQUREU1BECTE0MTMJLyogQWRkIGEgWEZSTSBwb2xpY3kgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0RFTFNQRAkxNDE0CS8qIERlbGV0ZSBhIFhGUk0gcG9saWN5ICovCiAKICNkZWZpbmUgQVVESVRfRklSU1RfS0VSTl9BTk9NX01TRyAgIDE3MDAKICNkZWZpbmUgQVVESVRfTEFTVF9LRVJOX0FOT01fTVNHICAgIDE3OTkKQEAgLTM3Nyw2ICszODEsNyBAQAogCQkJICAgICAgc3RydWN0IHRpbWVzcGVjICp0LCB1bnNpZ25lZCBpbnQgKnNlcmlhbCk7CiBleHRlcm4gaW50ICBhdWRpdF9zZXRfbG9naW51aWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1aWRfdCBsb2dpbnVpZCk7CiBleHRlcm4gdWlkX3QgYXVkaXRfZ2V0X2xvZ2ludWlkKHN0cnVjdCBhdWRpdF9jb250ZXh0ICpjdHgpOworZXh0ZXJuIHZvaWQgYXVkaXRfbG9nX3Rhc2tfY29udGV4dChzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYik7CiBleHRlcm4gaW50IF9fYXVkaXRfaXBjX29iaihzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjcCk7CiBleHRlcm4gaW50IF9fYXVkaXRfaXBjX3NldF9wZXJtKHVuc2lnbmVkIGxvbmcgcWJ5dGVzLCB1aWRfdCB1aWQsIGdpZF90IGdpZCwgbW9kZV90IG1vZGUpOwogZXh0ZXJuIGludCBhdWRpdF9icHJtKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwpAQCAtNDQ5LDYgKzQ1NCw3IEBACiAjZGVmaW5lIGF1ZGl0X2lub2RlX3VwZGF0ZShpKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRzY19nZXRfc3RhbXAoYyx0LHMpIGRvIHsgQlVHKCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGF1ZGl0X2dldF9sb2dpbnVpZChjKSAoeyAtMTsgfSkKKyNkZWZpbmUgYXVkaXRfbG9nX3Rhc2tfY29udGV4dChiKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRfaXBjX29iaihpKSAoeyAwOyB9KQogI2RlZmluZSBhdWRpdF9pcGNfc2V0X3Blcm0ocSx1LGcsbSkgKHsgMDsgfSkKICNkZWZpbmUgYXVkaXRfYnBybShwKSAoeyAwOyB9KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oIGIvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oCmluZGV4IGY3YTEzOTAuLjcwMTFkNjI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oCkBAIC0xMCw2ICsxMCw4IEBACiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKK3N0cnVjdCBwYWdlOworCiAvKgogICogQml0cyBpbiBiYWNraW5nX2Rldl9pbmZvLnN0YXRlCiAgKi8KQEAgLTg4LDYgKzkwLDExIEBACiAJCQkJICAoMSA8PCBCRElfd3JpdGVfY29uZ2VzdGVkKSk7CiB9CiAKK3ZvaWQgY2xlYXJfYmRpX2Nvbmdlc3RlZChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgcncpOwordm9pZCBzZXRfYmRpX2Nvbmdlc3RlZChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBpbnQgcncpOworbG9uZyBjb25nZXN0aW9uX3dhaXQoaW50IHJ3LCBsb25nIHRpbWVvdXQpOwordm9pZCBjb25nZXN0aW9uX2VuZChpbnQgcncpOworCiAjZGVmaW5lIGJkaV9jYXBfd3JpdGViYWNrX2RpcnR5KGJkaSkgXAogCSghKChiZGkpLT5jYXBhYmlsaXRpZXMgJiBCRElfQ0FQX05PX1dSSVRFQkFDSykpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmlvLmggYi9pbmNsdWRlL2xpbnV4L2Jpby5oCmluZGV4IDA5MmRiZDAuLjA4ZGFmMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaW8uaApAQCAtMzA5LDYgKzMwOSw3IEBACiAJCQkJZ2ZwX3QpOwogZXh0ZXJuIHZvaWQgYmlvX3NldF9wYWdlc19kaXJ0eShzdHJ1Y3QgYmlvICpiaW8pOwogZXh0ZXJuIHZvaWQgYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KHN0cnVjdCBiaW8gKmJpbyk7CitleHRlcm4gdm9pZCBiaW9fcmVsZWFzZV9wYWdlcyhzdHJ1Y3QgYmlvICpiaW8pOwogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19jb3B5X3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50LCBpbnQpOwogZXh0ZXJuIGludCBiaW9fdW5jb3B5X3VzZXIoc3RydWN0IGJpbyAqKTsKIHZvaWQgemVyb19maWxsX2JpbyhzdHJ1Y3QgYmlvICpiaW8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaXRyZXYuaCBiL2luY2x1ZGUvbGludXgvYml0cmV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlNTQwZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYml0cmV2LmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfTElOVVhfQklUUkVWX0gKKyNkZWZpbmUgX0xJTlVYX0JJVFJFVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitleHRlcm4gdTggY29uc3QgYnl0ZV9yZXZfdGFibGVbMjU2XTsKKworc3RhdGljIGlubGluZSB1OCBiaXRyZXY4KHU4IGJ5dGUpCit7CisJcmV0dXJuIGJ5dGVfcmV2X3RhYmxlW2J5dGVdOworfQorCitleHRlcm4gdTMyIGJpdHJldjMyKHUzMiBpbik7CisKKyNlbmRpZiAvKiBfTElOVVhfQklUUkVWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IGQzNzBkMmMuLmVhMzMwZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtMzQyLDcgKzM0Miw2IEBACiAKIHN0cnVjdCBiaW9fdmVjOwogdHlwZWRlZiBpbnQgKG1lcmdlX2J2ZWNfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGJpbyAqLCBzdHJ1Y3QgYmlvX3ZlYyAqKTsKLXR5cGVkZWYgdm9pZCAoYWN0aXZpdHlfZm4pICh2b2lkICpkYXRhLCBpbnQgcncpOwogdHlwZWRlZiBpbnQgKGlzc3VlX2ZsdXNoX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBnZW5kaXNrICosIHNlY3Rvcl90ICopOwogdHlwZWRlZiB2b2lkIChwcmVwYXJlX2ZsdXNoX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiB2b2lkIChzb2Z0aXJxX2RvbmVfZm4pKHN0cnVjdCByZXF1ZXN0ICopOwpAQCAtMzg0LDcgKzM4Myw2IEBACiAJcHJlcF9ycV9mbgkJKnByZXBfcnFfZm47CiAJdW5wbHVnX2ZuCQkqdW5wbHVnX2ZuOwogCW1lcmdlX2J2ZWNfZm4JCSptZXJnZV9idmVjX2ZuOwotCWFjdGl2aXR5X2ZuCQkqYWN0aXZpdHlfZm47CiAJaXNzdWVfZmx1c2hfZm4JCSppc3N1ZV9mbHVzaF9mbjsKIAlwcmVwYXJlX2ZsdXNoX2ZuCSpwcmVwYXJlX2ZsdXNoX2ZuOwogCXNvZnRpcnFfZG9uZV9mbgkJKnNvZnRpcnFfZG9uZV9mbjsKQEAgLTQxMSw4ICs0MDksNiBAQAogCSAqLwogCXZvaWQJCQkqcXVldWVkYXRhOwogCi0Jdm9pZAkJCSphY3Rpdml0eV9kYXRhOwotCiAJLyoKIAkgKiBxdWV1ZSBuZWVkcyBib3VuY2UgcGFnZXMgZm9yIHBhZ2VzIGFib3ZlIHRoaXMgbGltaXQKIAkgKi8KQEAgLTY1MSwxNyArNjQ3LDM3IEBACiBleHRlcm4gaW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCBnZW5kaXNrICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CiBleHRlcm4gaW50IHNnX3Njc2lfaW9jdGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKIAkJc3RydWN0IGdlbmRpc2sgKiwgc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZCBfX3VzZXIgKik7CisKKy8qCisgKiBBIHF1ZXVlIGhhcyBqdXN0IGV4aXR0ZWQgY29uZ2VzdGlvbi4gIE5vdGUgdGhpcyBpbiB0aGUgZ2xvYmFsIGNvdW50ZXIgb2YKKyAqIGNvbmdlc3RlZCBxdWV1ZXMsIGFuZCB3YWtlIHVwIGFueW9uZSB3aG8gd2FzIHdhaXRpbmcgZm9yIHJlcXVlc3RzIHRvIGJlCisgKiBwdXQgYmFjay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJsa19jbGVhcl9xdWV1ZV9jb25nZXN0ZWQocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncpCit7CisJY2xlYXJfYmRpX2Nvbmdlc3RlZCgmcS0+YmFja2luZ19kZXZfaW5mbywgcncpOworfQorCisvKgorICogQSBxdWV1ZSBoYXMganVzdCBlbnRlcmVkIGNvbmdlc3Rpb24uICBGbGFnIHRoYXQgaW4gdGhlIHF1ZXVlJ3MgVk0tdmlzaWJsZQorICogc3RhdGUgZmxhZ3MgYW5kIGluY3JlbWVudCB0aGUgZ2xvYmFsIGdvdW50ZXIgb2YgY29uZ2VzdGVkIHF1ZXVlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJsa19zZXRfcXVldWVfY29uZ2VzdGVkKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQoreworCXNldF9iZGlfY29uZ2VzdGVkKCZxLT5iYWNraW5nX2Rldl9pbmZvLCBydyk7Cit9CisKIGV4dGVybiB2b2lkIGJsa19zdGFydF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpOwogZXh0ZXJuIHZvaWQgYmxrX3N0b3BfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKIGV4dGVybiB2b2lkIGJsa19zeW5jX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKIGV4dGVybiB2b2lkIF9fYmxrX3N0b3BfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKIGV4dGVybiB2b2lkIGJsa19ydW5fcXVldWUocmVxdWVzdF9xdWV1ZV90ICopOwogZXh0ZXJuIHZvaWQgYmxrX3N0YXJ0X3F1ZXVlaW5nKHJlcXVlc3RfcXVldWVfdCAqKTsKLWV4dGVybiB2b2lkIGJsa19xdWV1ZV9hY3Rpdml0eV9mbihyZXF1ZXN0X3F1ZXVlX3QgKiwgYWN0aXZpdHlfZm4gKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQgYmxrX3JxX21hcF91c2VyKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCB2b2lkIF9fdXNlciAqLCB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIGludCBibGtfcnFfdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcihyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgdm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50IGJsa19ycV91bm1hcF91c2VyKHN0cnVjdCByZXF1ZXN0ICopOwogZXh0ZXJuIGludCBibGtfcnFfbWFwX2tlcm4ocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHZvaWQgKiwgdW5zaWduZWQgaW50LCBnZnBfdCk7Ci1leHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcl9pb3YocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzZ19pb3ZlYyAqLCBpbnQpOworZXh0ZXJuIGludCBibGtfcnFfbWFwX3VzZXJfaW92KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLAorCQkJICAgICAgIHN0cnVjdCBzZ19pb3ZlYyAqLCBpbnQsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gaW50IGJsa19leGVjdXRlX3JxKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgZ2VuZGlzayAqLAogCQkJICBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgZ2VuZGlzayAqLApAQCAtNzY1LDEwICs3ODEsOCBAQAogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2ZyZWVfdGFncyhyZXF1ZXN0X3F1ZXVlX3QgKik7CiBleHRlcm4gaW50IGJsa19xdWV1ZV9yZXNpemVfdGFncyhyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9pbnZhbGlkYXRlX3RhZ3MocmVxdWVzdF9xdWV1ZV90ICopOwotZXh0ZXJuIGxvbmcgYmxrX2Nvbmdlc3Rpb25fd2FpdChpbnQgcncsIGxvbmcgdGltZW91dCk7CiBleHRlcm4gc3RydWN0IGJsa19xdWV1ZV90YWcgKmJsa19pbml0X3RhZ3MoaW50KTsKIGV4dGVybiB2b2lkIGJsa19mcmVlX3RhZ3Moc3RydWN0IGJsa19xdWV1ZV90YWcgKik7Ci1leHRlcm4gdm9pZCBibGtfY29uZ2VzdGlvbl9lbmQoaW50IHJ3KTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdCAqYmxrX21hcF9xdWV1ZV9maW5kX3RhZyhzdHJ1Y3QgYmxrX3F1ZXVlX3RhZyAqYnF0LAogCQkJCQkJaW50IHRhZykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmggYi9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCmluZGV4IGI5OWE3MTQuLjM2ODBmZjlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKQEAgLTUwLDYgKzUwLDE1IEBACiB9OwogCiAvKgorICogTm90aWZ5IGV2ZW50cy4KKyAqLworZW51bSBibGt0cmFjZV9ub3RpZnkgeworCV9fQkxLX1ROX1BST0NFU1MgPSAwLAkJLyogZXN0YWJsaXNoIHBpZC9uYW1lIG1hcHBpbmcgKi8KKwlfX0JMS19UTl9USU1FU1RBTVAsCQkvKiBpbmNsdWRlIHN5c3RlbSBjbG9jayAqLworfTsKKworCisvKgogICogVHJhY2UgYWN0aW9ucyBpbiBmdWxsLiBBZGRpdGlvbmFsbHksIHJlYWQgb3Igd3JpdGUgaXMgbWFza2VkCiAgKi8KICNkZWZpbmUgQkxLX1RBX1FVRVVFCQkoX19CTEtfVEFfUVVFVUUgfCBCTEtfVENfQUNUKEJMS19UQ19RVUVVRSkpCkBAIC02OCw2ICs3Nyw5IEBACiAjZGVmaW5lIEJMS19UQV9CT1VOQ0UJCShfX0JMS19UQV9CT1VOQ0UpCiAjZGVmaW5lIEJMS19UQV9SRU1BUAkJKF9fQkxLX1RBX1JFTUFQIHwgQkxLX1RDX0FDVChCTEtfVENfUVVFVUUpKQogCisjZGVmaW5lIEJMS19UTl9QUk9DRVNTCQkoX19CTEtfVE5fUFJPQ0VTUyB8IEJMS19UQ19BQ1QoQkxLX1RDX05PVElGWSkpCisjZGVmaW5lIEJMS19UTl9USU1FU1RBTVAJKF9fQkxLX1ROX1RJTUVTVEFNUCB8IEJMS19UQ19BQ1QoQkxLX1RDX05PVElGWSkpCisKICNkZWZpbmUgQkxLX0lPX1RSQUNFX01BR0lDCTB4NjU2MTc0MDAKICNkZWZpbmUgQkxLX0lPX1RSQUNFX1ZFUlNJT04JMHgwNwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jvb3RtZW0uaCBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCmluZGV4IDMxZTlhYmIuLjIyNzVmMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCisrKyBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCkBAIC0xMTksOCArMTE5LDcgQEAKIAkJCQkgICAgIHVuc2lnbmVkIGludCAqX2hhc2hfbWFzaywKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbGltaXQpOwogCi0jZGVmaW5lIEhBU0hfSElHSE1FTQkweDAwMDAwMDAxCS8qIENvbnNpZGVyIGhpZ2htZW0/ICovCi0jZGVmaW5lIEhBU0hfRUFSTFkJMHgwMDAwMDAwMgkvKiBBbGxvY2F0aW5nIGR1cmluZyBlYXJseSBib290PyAqLworI2RlZmluZSBIQVNIX0VBUkxZCTB4MDAwMDAwMDEJLyogQWxsb2NhdGluZyBkdXJpbmcgZWFybHkgYm9vdD8gKi8KIAogLyogT25seSBOVU1BIG5lZWRzIGhhc2ggZGlzdHJpYnV0aW9uLgogICogSUE2NCBpcyBrbm93biB0byBoYXZlIHN1ZmZpY2llbnQgdm1hbGxvYyBzcGFjZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYm90dG9tX2hhbGYuaCBiL2luY2x1ZGUvbGludXgvYm90dG9tX2hhbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdkYmY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ib3R0b21faGFsZi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0xJTlVYX0JIX0gKKyNkZWZpbmUgX0xJTlVYX0JIX0gKKworZXh0ZXJuIHZvaWQgbG9jYWxfYmhfZGlzYWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fbG9jYWxfYmhfZW5hYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgX2xvY2FsX2JoX2VuYWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIGxvY2FsX2JoX2VuYWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIGxvY2FsX2JoX2VuYWJsZV9pcCh1bnNpZ25lZCBsb25nIGlwKTsKKworI2VuZGlmIC8qIF9MSU5VWF9CSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmggYi9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgKaW5kZXggMTMxZmZkMy4uNWQ5ZmIwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oCisrKyBiL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaApAQCAtNjksNiArNjksOCBAQAogCWJoX2VuZF9pb190ICpiX2VuZF9pbzsJCS8qIEkvTyBjb21wbGV0aW9uICovCiAgCXZvaWQgKmJfcHJpdmF0ZTsJCS8qIHJlc2VydmVkIGZvciBiX2VuZF9pbyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYl9hc3NvY19idWZmZXJzOyAvKiBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBtYXBwaW5nICovCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJfYXNzb2NfbWFwOwkvKiBtYXBwaW5nIHRoaXMgYnVmZmVyIGlzCisJCQkJCQkgICBhc3NvY2lhdGVkIHdpdGggKi8KIAlhdG9taWNfdCBiX2NvdW50OwkJLyogdXNlcnMgdXNpbmcgdGhpcyBidWZmZXJfaGVhZCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9idWcuaCBiL2luY2x1ZGUvbGludXgvYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhYTBhNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYnVnLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfTElOVVhfQlVHX0gKKyNkZWZpbmUgX0xJTlVYX0JVR19ICisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vYnVnLmg+CisKK2VudW0gYnVnX3RyYXBfdHlwZSB7CisJQlVHX1RSQVBfVFlQRV9OT05FID0gMCwKKwlCVUdfVFJBUF9UWVBFX1dBUk4gPSAxLAorCUJVR19UUkFQX1RZUEVfQlVHID0gMiwKK307CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19CVUcKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KKworc3RhdGljIGlubGluZSBpbnQgaXNfd2FybmluZ19idWcoY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSAqYnVnKQoreworCXJldHVybiBidWctPmZsYWdzICYgQlVHRkxBR19XQVJOSU5HOworfQorCitjb25zdCBzdHJ1Y3QgYnVnX2VudHJ5ICpmaW5kX2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpOworCitlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyKTsKKworaW50ICBtb2R1bGVfYnVnX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICosIGNvbnN0IEVsZl9TaGRyICosCisJCQkgc3RydWN0IG1vZHVsZSAqKTsKK3ZvaWQgbW9kdWxlX2J1Z19jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKik7CisKKy8qIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgKi8KK2ludCBpc192YWxpZF9idWdhZGRyKHVuc2lnbmVkIGxvbmcgYWRkcik7CisKKyNlbHNlCS8qICFDT05GSUdfR0VORVJJQ19CVUcgKi8KKworc3RhdGljIGlubGluZSBlbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyKQoreworCXJldHVybiBCVUdfVFJBUF9UWVBFX0JVRzsKK30KK3N0YXRpYyBpbmxpbmUgaW50ICBtb2R1bGVfYnVnX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCisJCQkJCWNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAorCQkJCQlzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbW9kdWxlX2J1Z19jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkge30KKworI2VuZGlmCS8qIENPTkZJR19HRU5FUklDX0JVRyAqLworI2VuZGlmCS8qIF9MSU5VWF9CVUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXJ0YV9yYW5kb20zMi5oIGIvaW5jbHVkZS9saW51eC9jYXJ0YV9yYW5kb20zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmYzYmQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvY2FydGFfcmFuZG9tMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBGYXN0LCBzaW1wbGUsIHlldCBkZWNlbnQgcXVhbGl0eSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiYXNlZCBvbgotICogYSBwYXBlciBieSBEYXZpZCBHLiBDYXJ0YSAoIlR3byBGYXN0IEltcGxlbWVudGF0aW9ucyBvZiB0aGUKLSAqIGBNaW5pbWFsIFN0YW5kYXJkJyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciwiIENvbW11bmljYXRpb25zIG9mIHRoZQotICogQUNNLCBKYW51YXJ5LCAxOTkwKS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgotICoJQ29udHJpYnV0ZWQgYnkgU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gKiAwMjExMS0xMzA3IFVTQQotICovCi0jaWZuZGVmIF9MSU5VWF9DQVJUQV9SQU5ET00zMl9IXwotI2RlZmluZSBfTElOVVhfQ0FSVEFfUkFORE9NMzJfSF8KLQotdTY0IGNhcnRhX3JhbmRvbTMyKHU2NCBzZWVkKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9DQVJUQV9SQU5ET00zMl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oCmluZGV4IDZlMjdmNDIuLmNiNTdjMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2Npc3NfaW9jdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmgKQEAgLTgwLDcgKzgwLDcgQEAKICNkZWZpbmUgSFdPUkQgX191MTYKICNkZWZpbmUgRFdPUkQgX191MzIKIAotI2RlZmluZSBDSVNTX01BWF9MVU4JMTYJCisjZGVmaW5lIENJU1NfTUFYX0xVTgkxMDI0CiAKICNkZWZpbmUgTEVWRUwyTFVOICAgMSAgIC8vIGluZGV4IGludG8gVGFyZ2V0KHgpIHN0cnVjdHVyZSwgZHVlIHRvIGJ5dGUgc3dhcHBpbmcKICNkZWZpbmUgTEVWRUwzTFVOICAgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZGV2LmggYi9pbmNsdWRlL2xpbnV4L2NkZXYuaAppbmRleCBlZTVmNTNmLi5mMzA5YjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NkZXYuaApAQCAtMiw2ICsyLDEwIEBACiAjZGVmaW5lIF9MSU5VWF9DREVWX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCiBzdHJ1Y3QgY2RldiB7CiAJc3RydWN0IGtvYmplY3Qga29iajsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaCBiL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaAppbmRleCBkODUyMDI0Li4xNjIyZDIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCkBAIC0xNTksNyArMTU5LDcgQEAKICAqIFVubGVzcyB5b3UncmUgdGhlIHRpbWVrZWVwaW5nIGNvZGUsIHlvdSBzaG91bGQgbm90IGJlIHVzaW5nIHRoaXMhCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwoc3RydWN0IGNsb2Nrc291cmNlICpjLAotCQkJCQkJdW5zaWduZWQgbG9uZyBsZW5ndGhfbnNlYykKKwkJCQkJICAJICB1bnNpZ25lZCBsb25nIGxlbmd0aF9uc2VjKQogewogCXU2NCB0bXA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kYV9saW51eC5oIGIvaW5jbHVkZS9saW51eC9jb2RhX2xpbnV4LmgKaW5kZXggYmU1MTJjYy4uNGMyNjMyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb2RhX2xpbnV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb2RhX2xpbnV4LmgKQEAgLTY0LDcgKzY0LDcgQEAKIAogI2RlZmluZSBDT0RBX0FMTE9DKHB0ciwgY2FzdCwgc2l6ZSkgZG8geyBcCiAgICAgaWYgKHNpemUgPCBQQUdFX1NJWkUpIFwKLSAgICAgICAgcHRyID0gKGNhc3Qpa21hbGxvYygodW5zaWduZWQgbG9uZykgc2l6ZSwgR0ZQX0tFUk5FTCk7IFwKKyAgICAgICAgcHRyID0ga21hbGxvYygodW5zaWduZWQgbG9uZykgc2l6ZSwgR0ZQX0tFUk5FTCk7IFwKICAgICBlbHNlIFwKICAgICAgICAgcHRyID0gKGNhc3Qpdm1hbGxvYygodW5zaWduZWQgbG9uZykgc2l6ZSk7IFwKICAgICBpZiAoIXB0cikgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXQuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKaW5kZXggZjRlYmY5Ni4uODBiMTdmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCkBAIC0xOTYsNyArMTk2LDcgQEAKICNkZWZpbmUgQklUU19UT19DT01QQVRfTE9OR1MoYml0cykgXAogCSgoKGJpdHMpK0JJVFNfUEVSX0NPTVBBVF9MT05HLTEpL0JJVFNfUEVSX0NPTVBBVF9MT05HKQogCi1sb25nIGNvbXBhdF9nZXRfYml0bWFwKHVuc2lnbmVkIGxvbmcgKm1hc2ssIGNvbXBhdF91bG9uZ190IF9fdXNlciAqdW1hc2ssCitsb25nIGNvbXBhdF9nZXRfYml0bWFwKHVuc2lnbmVkIGxvbmcgKm1hc2ssIGNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqdW1hc2ssCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGJpdG1hcF9zaXplKTsKIGxvbmcgY29tcGF0X3B1dF9iaXRtYXAoY29tcGF0X3Vsb25nX3QgX191c2VyICp1bWFzaywgdW5zaWduZWQgbG9uZyAqbWFzaywKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYml0bWFwX3NpemUpOwpAQCAtMjMwLDUgKzIzMCw5IEBACiBleHRlcm4gaW50IGNvbXBhdF9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOwogZXh0ZXJuIHZvaWQgc2lnc2V0X2Zyb21fY29tcGF0KHNpZ3NldF90ICpzZXQsIGNvbXBhdF9zaWdzZXRfdCAqY29tcGF0KTsKIAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbWlncmF0ZV9wYWdlcyhjb21wYXRfcGlkX3QgcGlkLAorCQljb21wYXRfdWxvbmdfdCBtYXhub2RlLCBjb25zdCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKm9sZF9ub2RlcywKKwkJY29uc3QgY29tcGF0X3Vsb25nX3QgX191c2VyICpuZXdfbm9kZXMpOworCiAjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwogI2VuZGlmIC8qIF9MSU5VWF9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaCBiL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmgKaW5kZXggY2ZkYjRmNmEuLmMyNmMzYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaApAQCAtMTMxLDYgKzEzMSw3IEBACiBDT01QQVRJQkxFX0lPQ1RMKFNUT1BfQVJSQVkpCiBDT01QQVRJQkxFX0lPQ1RMKFNUT1BfQVJSQVlfUk8pCiBDT01QQVRJQkxFX0lPQ1RMKFJFU1RBUlRfQVJSQVlfUlcpCitDT01QQVRJQkxFX0lPQ1RMKEdFVF9CSVRNQVBfRklMRSkKIFVMT05HX0lPQ1RMKFNFVF9CSVRNQVBfRklMRSkKIC8qIERNICovCiBDT01QQVRJQkxFX0lPQ1RMKERNX1ZFUlNJT05fMzIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKaW5kZXggNTM4NDIzZC4uYWNhNjY5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21waWxlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaApAQCAtNDAsNyArNDAsNyBAQAogI2Vycm9yIG5vIGNvbXBpbGVyLWdjYy5oIGZpbGUgZm9yIHRoaXMgZ2NjIHZlcnNpb24KICNlbGlmIF9fR05VQ19fID09IDQKICMgaW5jbHVkZSA8bGludXgvY29tcGlsZXItZ2NjNC5oPgotI2VsaWYgX19HTlVDX18gPT0gMworI2VsaWYgX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSAyCiAjIGluY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLWdjYzMuaD4KICNlbHNlCiAjIGVycm9yIFNvcnJ5LCB5b3VyIGNvbXBpbGVyIGlzIHRvbyBvbGQvbm90IHJlY29nbml6ZWQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmggYi9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmgKaW5kZXggYTdmMDE1MC4uZmVmNmYzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25maWdmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvY29uZmlnZnMuaApAQCAtMTYwLDMxICsxNjAsNiBAQAogCXZvaWQgKCpkcm9wX2l0ZW0pKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogfTsKIAotCi0KLS8qKgotICogVXNlIHRoZXNlIG1hY3JvcyB0byBtYWtlIGRlZmluaW5nIGF0dHJpYnV0ZXMgZWFzaWVyLiBTZWUgaW5jbHVkZS9saW51eC9kZXZpY2UuaAotICogZm9yIGV4YW1wbGVzLi4KLSAqLwotCi0jaWYgMAotI2RlZmluZSBfX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKSB7IFwKLQkuYXR0ciA9IHsuY2FfbmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwgLmNhX21vZGUgPSBfbW9kZSwgLmNhX293bmVyID0gVEhJU19NT0RVTEUgfSwJXAotCS5zaG93CT0gX3Nob3csCQkJCQlcCi0JLnN0b3JlCT0gX3N0b3JlLAkJCQkJXAotfQotCi0jZGVmaW5lIF9fQVRUUl9STyhfbmFtZSkgeyBcCi0JLmF0dHIJPSB7IC5jYV9uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCAuY2FfbW9kZSA9IDA0NDQsIC5jYV9vd25lciA9IFRISVNfTU9EVUxFIH0sCVwKLQkuc2hvdwk9IF9uYW1lIyNfc2hvdywJXAotfQotCi0jZGVmaW5lIF9fQVRUUl9OVUxMIHsgLmF0dHIgPSB7IC5uYW1lID0gTlVMTCB9IH0KLQotI2RlZmluZSBhdHRyX25hbWUoX2F0dHIpIChfYXR0cikuYXR0ci5uYW1lCi0jZW5kaWYKLQotCiBzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtIHsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwCXN1X2dyb3VwOwogCXN0cnVjdCBzZW1hcGhvcmUJc3Vfc2VtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaCBiL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKaW5kZXggNGMwMjExOS4uM2VhMWNkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCkBAIC0xMzMsNyArMTMzLDcgQEAKIHN0cnVjdCBjbl9jYWxsYmFja19lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBjYWxsYmFja19lbnRyeTsKIAlzdHJ1Y3QgY25fY2FsbGJhY2sgKmNiOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3QgY25fcXVldWVfZGV2ICpwZGV2OwogCiAJc3RydWN0IGNuX2NhbGxiYWNrX2lkIGlkOwpAQCAtMTcwLDcgKzE3MCw3IEBACiAKIGludCBjbl9jYl9lcXVhbChzdHJ1Y3QgY2JfaWQgKiwgc3RydWN0IGNiX2lkICopOwogCi12b2lkIGNuX3F1ZXVlX3dyYXBwZXIodm9pZCAqZGF0YSk7Cit2b2lkIGNuX3F1ZXVlX3dyYXBwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogZXh0ZXJuIGludCBjbl9hbHJlYWR5X2luaXRpYWxpemVkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCAzZmVmN2Q2Li5iZmI1MjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTI0LDE1ICsyNCwyNCBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiBzdHJ1Y3QgY3B1IHsKIAlpbnQgbm9kZV9pZDsJCS8qIFRoZSBub2RlIHdoaWNoIGNvbnRhaW5zIHRoZSBDUFUgKi8KLQlpbnQgbm9fY29udHJvbDsJCS8qIFNob3VsZCB0aGUgc3lzZnMgY29udHJvbCBmaWxlIGJlIGNyZWF0ZWQ/ICovCisJaW50IGhvdHBsdWdnYWJsZTsJLyogY3JlYXRlcyBzeXNmcyBjb250cm9sIGZpbGUgaWYgaG90cGx1Z2dhYmxlICovCiAJc3RydWN0IHN5c19kZXZpY2Ugc3lzZGV2OwogfTsKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9jcHUoc3RydWN0IGNwdSAqY3B1LCBpbnQgbnVtKTsKIGV4dGVybiBzdHJ1Y3Qgc3lzX2RldmljZSAqZ2V0X2NwdV9zeXNkZXYodW5zaWduZWQgY3B1KTsKKworZXh0ZXJuIGludCBjcHVfYWRkX3N5c2Rldl9hdHRyKHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyKTsKK2V4dGVybiB2b2lkIGNwdV9yZW1vdmVfc3lzZGV2X2F0dHIoc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIpOworCitleHRlcm4gaW50IGNwdV9hZGRfc3lzZGV2X2F0dHJfZ3JvdXAoc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cnMpOworZXh0ZXJuIHZvaWQgY3B1X3JlbW92ZV9zeXNkZXZfYXR0cl9ncm91cChzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRycyk7CisKKwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9jcHUoc3RydWN0IGNwdSAqY3B1KTsKICNlbmRpZgpAQCAtNjYsNiArNzUsMTcgQEAKIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyogU3RvcCBDUFVzIGdvaW5nIHVwIGFuZCBkb3duLiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1aG90cGx1Z19tdXRleF9sb2NrKHN0cnVjdCBtdXRleCAqY3B1X2hwX211dGV4KQoreworCW11dGV4X2xvY2soY3B1X2hwX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwdWhvdHBsdWdfbXV0ZXhfdW5sb2NrKHN0cnVjdCBtdXRleCAqY3B1X2hwX211dGV4KQoreworCW11dGV4X3VubG9jayhjcHVfaHBfbXV0ZXgpOworfQorCiBleHRlcm4gdm9pZCBsb2NrX2NwdV9ob3RwbHVnKHZvaWQpOwogZXh0ZXJuIHZvaWQgdW5sb2NrX2NwdV9ob3RwbHVnKHZvaWQpOwogI2RlZmluZSBob3RjcHVfbm90aWZpZXIoZm4sIHByaSkgewkJCQlcCkBAIC03NywxNyArOTcsMjQgQEAKICNkZWZpbmUgdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIobmIpCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKG5iKQogaW50IGNwdV9kb3duKHVuc2lnbmVkIGludCBjcHUpOwogI2RlZmluZSBjcHVfaXNfb2ZmbGluZShjcHUpIHVubGlrZWx5KCFjcHVfb25saW5lKGNwdSkpCi0jZWxzZQorCisjZWxzZQkJLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVob3RwbHVnX211dGV4X2xvY2soc3RydWN0IG11dGV4ICpjcHVfaHBfbXV0ZXgpCit7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVob3RwbHVnX211dGV4X3VubG9jayhzdHJ1Y3QgbXV0ZXggKmNwdV9ocF9tdXRleCkKK3sgfQorCiAjZGVmaW5lIGxvY2tfY3B1X2hvdHBsdWcoKQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHVubG9ja19jcHVfaG90cGx1ZygpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgbG9ja19jcHVfaG90cGx1Z19pbnRlcnJ1cHRpYmxlKCkgMAotI2RlZmluZSBob3RjcHVfbm90aWZpZXIoZm4sIHByaSkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIobmIpCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIobmIpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaG90Y3B1X25vdGlmaWVyKGZuLCBwcmkpCWRvIHsgKHZvaWQpKGZuKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKG5iKQlkbyB7ICh2b2lkKShuYik7IH0gd2hpbGUgKDApCisjZGVmaW5lIHVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKG5iKQlkbyB7ICh2b2lkKShuYik7IH0gd2hpbGUgKDApCiAKIC8qIENQVXMgZG9uJ3QgZ28gb2ZmbGluZSBvbmNlIHRoZXkncmUgb25saW5lIHcvbyBDT05GSUdfSE9UUExVR19DUFUgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGNwdV9pc19vZmZsaW5lKGludCBjcHUpIHsgcmV0dXJuIDA7IH0KLSNlbmRpZgorI2VuZGlmCQkvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAogI2lmZGVmIENPTkZJR19TVVNQRU5EX1NNUAogZXh0ZXJuIGludCBkaXNhYmxlX25vbmJvb3RfY3B1cyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKaW5kZXggNGVhMzlmZS4uN2YwMDhmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKQEAgLTE3Miw2ICsxNzIsOCBAQAogCQkJCSAgIHVuc2lnbmVkIGludCByZWxhdGlvbik7CiAKIAorZXh0ZXJuIGludCBjcHVmcmVxX2RyaXZlcl9nZXRhdmcoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOworCiBpbnQgY3B1ZnJlcV9yZWdpc3Rlcl9nb3Zlcm5vcihzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqZ292ZXJub3IpOwogdm9pZCBjcHVmcmVxX3VucmVnaXN0ZXJfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgKmdvdmVybm9yKTsKIApAQCAtMjA0LDYgKzIwNiw3IEBACiAJdW5zaWduZWQgaW50CSgqZ2V0KQkodW5zaWduZWQgaW50IGNwdSk7CiAKIAkvKiBvcHRpb25hbCAqLworCXVuc2lnbmVkIGludCAoKmdldGF2ZykJKHVuc2lnbmVkIGludCBjcHUpOwogCWludAkoKmV4aXQpCQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCWludAkoKnN1c3BlbmQpCShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgcG1fbWVzc2FnZV90IHBtc2cpOwogCWludAkoKnJlc3VtZSkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmggYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCmluZGV4IDRkOGFkZjYuLjgyNmIxNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaApAQCAtMjMsMTYgKzIzLDI2IEBACiBleHRlcm4gdm9pZCBjcHVzZXRfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogZXh0ZXJuIGNwdW1hc2tfdCBjcHVzZXRfY3B1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBleHRlcm4gbm9kZW1hc2tfdCBjcHVzZXRfbWVtc19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisjZGVmaW5lIGNwdXNldF9jdXJyZW50X21lbXNfYWxsb3dlZCAoY3VycmVudC0+bWVtc19hbGxvd2VkKQogdm9pZCBjcHVzZXRfaW5pdF9jdXJyZW50X21lbXNfYWxsb3dlZCh2b2lkKTsKIHZvaWQgY3B1c2V0X3VwZGF0ZV90YXNrX21lbW9yeV9zdGF0ZSh2b2lkKTsKICNkZWZpbmUgY3B1c2V0X25vZGVzX3N1YnNldF9jdXJyZW50X21lbXNfYWxsb3dlZChub2RlcykgXAogCQlub2Rlc19zdWJzZXQoKG5vZGVzKSwgY3VycmVudC0+bWVtc19hbGxvd2VkKQogaW50IGNwdXNldF96b25lbGlzdF92YWxpZF9tZW1zX2FsbG93ZWQoc3RydWN0IHpvbmVsaXN0ICp6bCk7CiAKLWV4dGVybiBpbnQgX19jcHVzZXRfem9uZV9hbGxvd2VkKHN0cnVjdCB6b25lICp6LCBnZnBfdCBnZnBfbWFzayk7Ci1zdGF0aWMgaW50IGlubGluZSBjcHVzZXRfem9uZV9hbGxvd2VkKHN0cnVjdCB6b25lICp6LCBnZnBfdCBnZnBfbWFzaykKK2V4dGVybiBpbnQgX19jcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKHN0cnVjdCB6b25lICp6LCBnZnBfdCBnZnBfbWFzayk7CitleHRlcm4gaW50IF9fY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbChzdHJ1Y3Qgem9uZSAqeiwgZ2ZwX3QgZ2ZwX21hc2spOworCitzdGF0aWMgaW50IGlubGluZSBjcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKHN0cnVjdCB6b25lICp6LCBnZnBfdCBnZnBfbWFzaykKIHsKLQlyZXR1cm4gbnVtYmVyX29mX2NwdXNldHMgPD0gMSB8fCBfX2NwdXNldF96b25lX2FsbG93ZWQoeiwgZ2ZwX21hc2spOworCXJldHVybiBudW1iZXJfb2ZfY3B1c2V0cyA8PSAxIHx8CisJCV9fY3B1c2V0X3pvbmVfYWxsb3dlZF9zb2Z0d2FsbCh6LCBnZnBfbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIGNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoc3RydWN0IHpvbmUgKnosIGdmcF90IGdmcF9tYXNrKQoreworCXJldHVybiBudW1iZXJfb2ZfY3B1c2V0cyA8PSAxIHx8CisJCV9fY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6LCBnZnBfbWFzayk7CiB9CiAKIGV4dGVybiBpbnQgY3B1c2V0X2V4Y2xfbm9kZXNfb3ZlcmxhcChjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwpAQCAtNDUsNyArNTUsNyBAQAogZXh0ZXJuIGludCBjcHVzZXRfbWVtb3J5X3ByZXNzdXJlX2VuYWJsZWQ7CiBleHRlcm4gdm9pZCBfX2NwdXNldF9tZW1vcnlfcHJlc3N1cmVfYnVtcCh2b2lkKTsKIAotZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcHVzZXRfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY3B1c2V0X29wZXJhdGlvbnM7CiBleHRlcm4gY2hhciAqY3B1c2V0X3Rhc2tfc3RhdHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpOwogCiBleHRlcm4gdm9pZCBjcHVzZXRfbG9jayh2b2lkKTsKQEAgLTgzLDYgKzkzLDcgQEAKIAlyZXR1cm4gbm9kZV9wb3NzaWJsZV9tYXA7CiB9CiAKKyNkZWZpbmUgY3B1c2V0X2N1cnJlbnRfbWVtc19hbGxvd2VkIChub2RlX29ubGluZV9tYXApCiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X2luaXRfY3VycmVudF9tZW1zX2FsbG93ZWQodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfdXBkYXRlX3Rhc2tfbWVtb3J5X3N0YXRlKHZvaWQpIHt9CiAjZGVmaW5lIGNwdXNldF9ub2Rlc19zdWJzZXRfY3VycmVudF9tZW1zX2FsbG93ZWQobm9kZXMpICgxKQpAQCAtOTIsNyArMTAzLDEyIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNwdXNldF96b25lX2FsbG93ZWQoc3RydWN0IHpvbmUgKnosIGdmcF90IGdmcF9tYXNrKQorc3RhdGljIGlubGluZSBpbnQgY3B1c2V0X3pvbmVfYWxsb3dlZF9zb2Z0d2FsbChzdHJ1Y3Qgem9uZSAqeiwgZ2ZwX3QgZ2ZwX21hc2spCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoc3RydWN0IHpvbmUgKnosIGdmcF90IGdmcF9tYXNrKQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmMzMi5oIGIvaW5jbHVkZS9saW51eC9jcmMzMi5oCmluZGV4IDU2YzA2NDUuLmUyMGRkMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3JjMzIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyYzMyLmgKQEAgLTYsMTAgKzYsMTAgQEAKICNkZWZpbmUgX0xJTlVYX0NSQzMyX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CiAKIGV4dGVybiB1MzIgIGNyYzMyX2xlKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pOwogZXh0ZXJuIHUzMiAgY3JjMzJfYmUodTMyIGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbik7Ci1leHRlcm4gdTMyICBiaXRyZXZlcnNlKHUzMiBpbik7CiAKICNkZWZpbmUgY3JjMzIoc2VlZCwgZGF0YSwgbGVuZ3RoKSAgY3JjMzJfbGUoc2VlZCwgKHVuc2lnbmVkIGNoYXIgY29uc3QgKilkYXRhLCBsZW5ndGgpCiAKQEAgLTIxLDcgKzIxLDcgQEAKICAqIGlzIGluIGJpdCBuciAwXSwgdGh1cyBpdCBtdXN0IGJlIHJldmVyc2VkIGJlZm9yZSB1c2UuIEV4Y2VwdCBmb3IKICAqIG5pY3MgdGhhdCBiaXQgc3dhcCB0aGUgcmVzdWx0IGludGVybmFsbHkuLi4KICAqLwotI2RlZmluZSBldGhlcl9jcmMobGVuZ3RoLCBkYXRhKSAgICBiaXRyZXZlcnNlKGNyYzMyX2xlKH4wLCBkYXRhLCBsZW5ndGgpKQorI2RlZmluZSBldGhlcl9jcmMobGVuZ3RoLCBkYXRhKSAgICBiaXRyZXYzMihjcmMzMl9sZSh+MCwgZGF0YSwgbGVuZ3RoKSkKICNkZWZpbmUgZXRoZXJfY3JjX2xlKGxlbmd0aCwgZGF0YSkgY3JjMzJfbGUofjAsIGRhdGEsIGxlbmd0aCkKIAogI2VuZGlmIC8qIF9MSU5VWF9DUkMzMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyeXB0by5oIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaAppbmRleCA4ZjJmZmE0Li40YWE5MDQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCisrKyBiL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKQEAgLTI0MSwxMiArMjQxLDggQEAKICAqIEFsZ29yaXRobSBxdWVyeSBpbnRlcmZhY2UuCiAgKi8KICNpZmRlZiBDT05GSUdfQ1JZUFRPCi1pbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQotCV9fZGVwcmVjYXRlZF9mb3JfbW9kdWxlczsKIGludCBjcnlwdG9faGFzX2FsZyhjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOwogI2Vsc2UKLXN0YXRpYyBpbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKTsKLQlfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXM7CiBzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxnX2F2YWlsYWJsZShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCiB7CiAJcmV0dXJuIDA7CkBAIC03MDcsMTYgKzcwMyw2IEBACiAJCQkJCQlkc3QsIHNyYyk7CiB9CiAKLXZvaWQgY3J5cHRvX2RpZ2VzdF9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pIF9fZGVwcmVjYXRlZF9mb3JfbW9kdWxlczsKLXZvaWQgY3J5cHRvX2RpZ2VzdF91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZykKLQlfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXM7Ci12b2lkIGNyeXB0b19kaWdlc3RfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKLQlfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXM7Ci12b2lkIGNyeXB0b19kaWdlc3RfZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpCi0JX19kZXByZWNhdGVkX2Zvcl9tb2R1bGVzOwotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9faGFzaCAqX19jcnlwdG9faGFzaF9jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7CiAJcmV0dXJuIChzdHJ1Y3QgY3J5cHRvX2hhc2ggKil0Zm07CkBAIC03MjksMTQgKzcxNSw2IEBACiAJcmV0dXJuIF9fY3J5cHRvX2hhc2hfY2FzdCh0Zm0pOwogfQogCi1zdGF0aWMgaW50IGNyeXB0b19kaWdlc3Rfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCi0JCQkJdW5zaWduZWQgaW50IGtleWxlbikgX19kZXByZWNhdGVkOwotc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2RpZ2VzdF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCi17Ci0JcmV0dXJuIHRmbS0+Y3J0X2hhc2guc2V0a2V5KGNyeXB0b19oYXNoX2Nhc3QodGZtKSwga2V5LCBrZXlsZW4pOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9faGFzaCAqY3J5cHRvX2FsbG9jX2hhc2goY29uc3QgY2hhciAqYWxnX25hbWUsCiAJCQkJCQkgICAgdTMyIHR5cGUsIHUzMiBtYXNrKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kY2NwLmggYi9pbmNsdWRlL2xpbnV4L2RjY3AuaAppbmRleCA1MzU1M2M5Li4xY2IwNTRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjY3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RjY3AuaApAQCAtMzAsNyArMzAsNyBAQAogI2Vsc2UKICNlcnJvciAgIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCiAjZW5kaWYKLQlfX3UxNglkY2NwaF9jaGVja3N1bTsKKwlfX3N1bTE2CWRjY3BoX2NoZWNrc3VtOwogI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQogCV9fdTgJZGNjcGhfeDoxLAogCQlkY2NwaF90eXBlOjQsCkBAIC0xNzUsMTQgKzE3NSwxOCBAQAogCURDQ1BDX0NDSUQzID0gMywKIH07CiAKLS8qIERDQ1AgZmVhdHVyZXMgKi8KKy8qIERDQ1AgZmVhdHVyZXMgKFJGQyA0MzQwIHNlY3Rpb24gNi40KSAqLwogZW51bSB7CiAJRENDUEZfUkVTRVJWRUQgPSAwLAogCURDQ1BGX0NDSUQgPSAxLAorCURDQ1BGX1NIT1JUX1NFUU5PUyA9IDIsCQkvKiBYWFg6IG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KIAlEQ0NQRl9TRVFVRU5DRV9XSU5ET1cgPSAzLAorCURDQ1BGX0VDTl9JTkNBUEFCTEUgPSA0LAkvKiBYWFg6IG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KIAlEQ0NQRl9BQ0tfUkFUSU8gPSA1LAogCURDQ1BGX1NFTkRfQUNLX1ZFQ1RPUiA9IDYsCiAJRENDUEZfU0VORF9ORFBfQ09VTlQgPSA3LAorCURDQ1BGX01JTl9DU1VNX0NPVkVSID0gOCwKKwlEQ0NQRl9EQVRBX0NIRUNLU1VNID0gOSwJLyogWFhYOiBub3QgeWV0IGltcGxlbWVudGVkICovCiAJLyogMTAtMTI3IHJlc2VydmVkICovCiAJRENDUEZfTUlOX0NDSURfU1BFQ0lGSUMgPSAxMjgsCiAJRENDUEZfTUFYX0NDSURfU1BFQ0lGSUMgPSAyNTUsCkBAIC0xOTYsMTMgKzIwMCwxNiBAQAogfTsKIAogLyogRENDUCBzb2NrZXQgb3B0aW9ucyAqLwotI2RlZmluZSBEQ0NQX1NPQ0tPUFRfUEFDS0VUX1NJWkUJMQorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfUEFDS0VUX1NJWkUJMSAvKiBYWFggZGVwcmVjYXRlZCwgd2l0aG91dCBlZmZlY3QgKi8KICNkZWZpbmUgRENDUF9TT0NLT1BUX1NFUlZJQ0UJCTIKICNkZWZpbmUgRENDUF9TT0NLT1BUX0NIQU5HRV9MCQkzCiAjZGVmaW5lIERDQ1BfU09DS09QVF9DSEFOR0VfUgkJNAorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPVgkJMTAKKyNkZWZpbmUgRENDUF9TT0NLT1BUX1JFQ1ZfQ1NDT1YJCTExCiAjZGVmaW5lIERDQ1BfU09DS09QVF9DQ0lEX1JYX0lORk8JMTI4CiAjZGVmaW5lIERDQ1BfU09DS09QVF9DQ0lEX1RYX0lORk8JMTkyCiAKKy8qIG1heGltdW0gbnVtYmVyIG9mIHNlcnZpY2VzIHByb3ZpZGVkIG9uIHRoZSBzYW1lIGxpc3RlbmluZyBwb3J0ICovCiAjZGVmaW5lIERDQ1BfU0VSVklDRV9MSVNUX01BWF9MRU4gICAgICAzMgogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMjU2LDYgKzI2MywxMyBAQAogCXJldHVybiAoc3RydWN0IGRjY3BfaGRyICopc2tiLT5oLnJhdzsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9oZHIgKmRjY3BfemVyb2VkX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGVhZGxlbikKK3sKKwlza2ItPmgucmF3ID0gc2tiX3B1c2goc2tiLCBoZWFkbGVuKTsKKwltZW1zZXQoc2tiLT5oLnJhdywgMCwgaGVhZGxlbik7CisJcmV0dXJuIGRjY3BfaGRyKHNrYik7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyX2V4dCAqZGNjcF9oZHJ4KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIChzdHJ1Y3QgZGNjcF9oZHJfZXh0ICopKHNrYi0+aC5yYXcgKyBzaXplb2Yoc3RydWN0IGRjY3BfaGRyKSk7CkBAIC0zNDIsNiArMzU2LDkgQEAKICAgKiBAZGNjcG1zX2NjaWQgLSBDb25nZXN0aW9uIENvbnRyb2wgSWQgKENDSUQpIChzZWN0aW9uIDEwKQogICAqIEBkY2NwbXNfc2VuZF9hY2tfdmVjdG9yIC0gU2VuZCBBY2sgVmVjdG9yIEZlYXR1cmUgKHNlY3Rpb24gMTEuNSkKICAgKiBAZGNjcG1zX3NlbmRfbmRwX2NvdW50IC0gU2VuZCBORFAgQ291bnQgRmVhdHVyZSAoNy43LjIpCisgICogQGRjY3Btc19hY2tfcmF0aW8gLSBBY2sgUmF0aW8gRmVhdHVyZSAoc2VjdGlvbiAxMS4zKQorICAqIEBkY2NwbXNfcGVuZGluZyAtIExpc3Qgb2YgZmVhdHVyZXMgYmVpbmcgbmVnb3RpYXRlZAorICAqIEBkY2NwbXNfY29uZiAtCiAgICovCiBzdHJ1Y3QgZGNjcF9taW5pc29jayB7CiAJX191NjQJCQlkY2NwbXNfc2VxdWVuY2Vfd2luZG93OwpAQCAtNDEwLDcgKzQyNyw3IEBACiB9OwogCiAjZGVmaW5lIERDQ1BfU0VSVklDRV9JTlZBTElEX1ZBTFVFIGh0b25sKChfX3UzMiktMSkKLSNkZWZpbmUgRENDUF9TRVJWSUNFX0NPREVfSVNfQUJTRU5UIAkJIDAKKyNkZWZpbmUgRENDUF9TRVJWSUNFX0NPREVfSVNfQUJTRU5UCQkwCiAKIHN0YXRpYyBpbmxpbmUgaW50IGRjY3BfbGlzdF9oYXNfc2VydmljZShjb25zdCBzdHJ1Y3QgZGNjcF9zZXJ2aWNlX2xpc3QgKnNsLAogCQkJCQljb25zdCBfX2JlMzIgc2VydmljZSkKQEAgLTQxOSw3ICs0MzYsNyBAQAogCQl1MzIgaSA9IHNsLT5kY2Nwc2xfbnI7CiAJCXdoaWxlIChpLS0pCiAJCQlpZiAoc2wtPmRjY3BzbF9saXN0W2ldID09IHNlcnZpY2UpCi0JCQkJcmV0dXJuIDE7IAorCQkJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQzOSwxMiArNDU2LDI1IEBACiAgKiBAZGNjcHNfZ3NzIC0gZ3JlYXRlc3Qgc2VxdWVuY2UgbnVtYmVyIHNlbnQKICAqIEBkY2Nwc19nc3IgLSBncmVhdGVzdCB2YWxpZCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQKICAqIEBkY2Nwc19nYXIgLSBncmVhdGVzdCB2YWxpZCBhY2sgbnVtYmVyIHJlY2VpdmVkIG9uIGEgbm9uLVN5bmM7IGluaXRpYWxpemVkIHRvICVkY2Nwc19pc3MKKyAqIEBkY2Nwc19zZXJ2aWNlIC0gZmlyc3QgKHBhc3NpdmUgc29jaykgb3IgdW5pcXVlIChhY3RpdmUgc29jaykgc2VydmljZSBjb2RlCisgKiBAZGNjcHNfc2VydmljZV9saXN0IC0gc2Vjb25kIC4uIGxhc3Qgc2VydmljZSBjb2RlIG9uIHBhc3NpdmUgc29ja2V0CiAgKiBAZGNjcHNfdGltZXN0YW1wX3RpbWUgLSB0aW1lIG9mIGxhdGVzdCBUSU1FU1RBTVAgb3B0aW9uCiAgKiBAZGNjcHNfdGltZXN0YW1wX2VjaG8gLSBsYXRlc3QgdGltZXN0YW1wIHJlY2VpdmVkIG9uIGEgVElNRVNUQU1QIG9wdGlvbgotICogQGRjY3BzX3BhY2tldF9zaXplIC0gU2V0IHRocnUgc2V0c29ja29wdAotICogQGRjY3BzX3JvbGUgLSBSb2xlIG9mIHRoaXMgc29jaywgb25lIG9mICVkY2NwX3JvbGUKKyAqIEBkY2Nwc19sX2Fja19yYXRpbyAtCisgKiBAZGNjcHNfcl9hY2tfcmF0aW8gLQorICogQGRjY3BzX3Bjc2xlbiAtIHNlbmRlciAgIHBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UgKHZpYSBzb2Nrb3B0KQorICogQGRjY3BzX3BjcmxlbiAtIHJlY2VpdmVyIHBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UgKHZpYSBzb2Nrb3B0KQogICogQGRjY3BzX25kcF9jb3VudCAtIG51bWJlciBvZiBOb24gRGF0YSBQYWNrZXRzIHNpbmNlIGxhc3QgZGF0YSBwYWNrZXQKKyAqIEBkY2Nwc19tc3NfY2FjaGUgLQorICogQGRjY3BzX21pbmlzb2NrIC0KICAqIEBkY2Nwc19oY19yeF9hY2t2ZWMgLSByeCBoYWxmIGNvbm5lY3Rpb24gYWNrIHZlY3RvcgorICogQGRjY3BzX2hjX3J4X2NjaWQgLQorICogQGRjY3BzX2hjX3R4X2NjaWQgLQorICogQGRjY3BzX29wdGlvbnNfcmVjZWl2ZWQgLQorICogQGRjY3BzX2Vwb2NoIC0KKyAqIEBkY2Nwc19yb2xlIC0gUm9sZSBvZiB0aGlzIHNvY2ssIG9uZSBvZiAlZGNjcF9yb2xlCisgKiBAZGNjcHNfaGNfcnhfaW5zZXJ0X29wdGlvbnMgLQorICogQGRjY3BzX2hjX3R4X2luc2VydF9vcHRpb25zIC0KICAqIEBkY2Nwc194bWl0X3RpbWVyIC0gdGltZXIgZm9yIHdoZW4gQ0NJRCBpcyBub3QgcmVhZHkgdG8gc2VuZAogICovCiBzdHJ1Y3QgZGNjcF9zb2NrIHsKQEAgLTQ2NCw5ICs0OTQsMTAgQEAKIAlzdHJ1Y3QgZGNjcF9zZXJ2aWNlX2xpc3QJKmRjY3BzX3NlcnZpY2VfbGlzdDsKIAlzdHJ1Y3QgdGltZXZhbAkJCWRjY3BzX3RpbWVzdGFtcF90aW1lOwogCV9fdTMyCQkJCWRjY3BzX3RpbWVzdGFtcF9lY2hvOwotCV9fdTMyCQkJCWRjY3BzX3BhY2tldF9zaXplOwogCV9fdTE2CQkJCWRjY3BzX2xfYWNrX3JhdGlvOwogCV9fdTE2CQkJCWRjY3BzX3JfYWNrX3JhdGlvOworCV9fdTE2CQkJCWRjY3BzX3Bjc2xlbjsKKwlfX3UxNgkJCQlkY2Nwc19wY3JsZW47CiAJdW5zaWduZWQgbG9uZwkJCWRjY3BzX25kcF9jb3VudDsKIAlfX3UzMgkJCQlkY2Nwc19tc3NfY2FjaGU7CiAJc3RydWN0IGRjY3BfbWluaXNvY2sJCWRjY3BzX21pbmlzb2NrOwpAQCAtNDgwLDcgKzUxMSw3IEBACiAJX191OAkJCQlkY2Nwc19oY190eF9pbnNlcnRfb3B0aW9uczoxOwogCXN0cnVjdCB0aW1lcl9saXN0CQlkY2Nwc194bWl0X3RpbWVyOwogfTsKLSAKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9zb2NrICpkY2NwX3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gKHN0cnVjdCBkY2NwX3NvY2sgKilzazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGVidWdfbG9ja3MuaCBiL2luY2x1ZGUvbGludXgvZGVidWdfbG9ja3MuaAppbmRleCA5NTJiZWU3Li5hMWMxMGIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RlYnVnX2xvY2tzLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZWJ1Z19sb2Nrcy5oCkBAIC0yNCw3ICsyNCw3IEBACiAJaW50IF9fcmV0ID0gMDsJCQkJCQkJXAogCQkJCQkJCQkJXAogCWlmICh1bmxpa2VseShjKSkgewkJCQkJCVwKLQkJaWYgKGRlYnVnX2xvY2tzX29mZigpKQkJCQkJXAorCQlpZiAoZGVidWdfbG9ja3Nfc2lsZW50IHx8IGRlYnVnX2xvY2tzX29mZigpKQkJXAogCQkJV0FSTl9PTigxKTsJCQkJCVwKIAkJX19yZXQgPSAxOwkJCQkJCVwKIAl9CQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RlbGF5YWNjdC5oIGIvaW5jbHVkZS9saW51eC9kZWxheWFjY3QuaAppbmRleCA1NjFlMmE3Li41NWQxY2E1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RlbGF5YWNjdC5oCisrKyBiL2luY2x1ZGUvbGludXgvZGVsYXlhY2N0LmgKQEAgLTMwLDcgKzMwLDcgQEAKICNpZmRlZiBDT05GSUdfVEFTS19ERUxBWV9BQ0NUCiAKIGV4dGVybiBpbnQgZGVsYXlhY2N0X29uOwkvKiBEZWxheSBhY2NvdW50aW5nIHR1cm5lZCBvbi9vZmYgKi8KLWV4dGVybiBrbWVtX2NhY2hlX3QgKmRlbGF5YWNjdF9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZGVsYXlhY2N0X2NhY2hlOwogZXh0ZXJuIHZvaWQgZGVsYXlhY2N0X2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBfX2RlbGF5YWNjdF90c2tfaW5pdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBfX2RlbGF5YWNjdF90c2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCmluZGV4IDAzZWY0MWMuLjQ5OWY1MzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCkBAIC0zOSw3ICszOSw4IEBACiAgKiBUaGUgbWFwIGZ1bmN0aW9uIG11c3QgcmV0dXJuOgogICogPCAwOiBlcnJvcgogICogPSAwOiBUaGUgdGFyZ2V0IHdpbGwgaGFuZGxlIHRoZSBpbyBieSByZXN1Ym1pdHRpbmcgaXQgbGF0ZXIKLSAqID4gMDogc2ltcGxlIHJlbWFwIGNvbXBsZXRlCisgKiA9IDE6IHNpbXBsZSByZW1hcCBjb21wbGV0ZQorICogPSAyOiBUaGUgdGFyZ2V0IHdhbnRzIHRvIHB1c2ggYmFjayB0aGUgaW8KICAqLwogdHlwZWRlZiBpbnQgKCpkbV9tYXBfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLAogCQkJICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpOwpAQCAtNTAsNiArNTEsNyBAQAogICogMCAgIDogZW5kZWQgc3VjY2Vzc2Z1bGx5CiAgKiAxICAgOiBmb3Igc29tZSByZWFzb24gdGhlIGlvIGhhcyBzdGlsbCBub3QgY29tcGxldGVkIChlZywKICAqICAgICAgIG11bHRpcGF0aCB0YXJnZXQgbWlnaHQgd2FudCB0byByZXF1ZXVlIGEgZmFpbGVkIGlvKS4KKyAqIDIgICA6IFRoZSB0YXJnZXQgd2FudHMgdG8gcHVzaCBiYWNrIHRoZSBpbwogICovCiB0eXBlZGVmIGludCAoKmRtX2VuZGlvX2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqdGksCiAJCQkgICAgc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IsCkBAIC0xNzMsNyArMTc1LDcgQEAKIC8qCiAgKiBBIGRldmljZSBjYW4gc3RpbGwgYmUgdXNlZCB3aGlsZSBzdXNwZW5kZWQsIGJ1dCBJL08gaXMgZGVmZXJyZWQuCiAgKi8KLWludCBkbV9zdXNwZW5kKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgaW50IHdpdGhfbG9ja2ZzKTsKK2ludCBkbV9zdXNwZW5kKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgdW5zaWduZWQgc3VzcGVuZF9mbGFncyk7CiBpbnQgZG1fcmVzdW1lKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CiAKIC8qCkBAIC0xODgsNiArMTkwLDcgQEAKIGNvbnN0IGNoYXIgKmRtX2RldmljZV9uYW1lKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CiBzdHJ1Y3QgZ2VuZGlzayAqZG1fZGlzayhzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogaW50IGRtX3N1c3BlbmRlZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworaW50IGRtX25vZmx1c2hfc3VzcGVuZGluZyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSk7CiAKIC8qCiAgKiBHZW9tZXRyeSBmdW5jdGlvbnMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCA2NjJlNmExLi40OWFiNTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2RldmljZS5oPgogCiAjZGVmaW5lIERFVklDRV9OQU1FX1NJWkUJNTAKICNkZWZpbmUgREVWSUNFX05BTUVfSEFMRglfX3N0cmluZ2lmeSgyMCkJLyogTGVzcyB0aGFuIGhhbGYgdG8gYWNjb21tb2RhdGUgc2xvcCAqLwpAQCAtNDIsNiArNDMsOCBAQAogCXN0cnVjdCBrbGlzdAkJa2xpc3RfZGV2aWNlczsKIAlzdHJ1Y3Qga2xpc3QJCWtsaXN0X2RyaXZlcnM7CiAKKwlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBidXNfbm90aWZpZXI7CisKIAlzdHJ1Y3QgYnVzX2F0dHJpYnV0ZQkqIGJ1c19hdHRyczsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQkqIGRldl9hdHRyczsKIAlzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZQkqIGRydl9hdHRyczsKQEAgLTc1LDYgKzc4LDI5IEBACiAJCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpzdGFydCwgdm9pZCAqZGF0YSwKIAkJaW50ICgqZm4pKHN0cnVjdCBkZXZpY2VfZHJpdmVyICosIHZvaWQgKikpOwogCisvKgorICogQnVzIG5vdGlmaWVyczogR2V0IG5vdGlmaWVkIG9mIGFkZGl0aW9uL3JlbW92YWwgb2YgZGV2aWNlcworICogYW5kIGJpbmRpbmcvdW5iaW5kaW5nIG9mIGRyaXZlcnMgdG8gZGV2aWNlcy4KKyAqIEluIHRoZSBsb25nIHJ1biwgaXQgc2hvdWxkIGJlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBwbGF0Zm9ybQorICogbm90aWZ5IGhvb2tzLgorICovCitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2s7CisKK2V4dGVybiBpbnQgYnVzX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBidXNfdHlwZSAqYnVzLAorCQkJCSBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiBpbnQgYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IGJ1c190eXBlICpidXMsCisJCQkJICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CisKKy8qIEFsbCA0IG5vdGlmZXJzIGJlbG93IGdldCBjYWxsZWQgd2l0aCB0aGUgdGFyZ2V0IHN0cnVjdCBkZXZpY2UgKgorICogYXMgYW4gYXJndW1lbnQuIE5vdGUgdGhhdCB0aG9zZSBmdW5jdGlvbnMgYXJlIGxpa2VseSB0byBiZSBjYWxsZWQKKyAqIHdpdGggdGhlIGRldmljZSBzZW1hcGhvcmUgaGVsZCBpbiB0aGUgY29yZSwgc28gYmUgY2FyZWZ1bC4KKyAqLworI2RlZmluZSBCVVNfTk9USUZZX0FERF9ERVZJQ0UJCTB4MDAwMDAwMDEgLyogZGV2aWNlIGFkZGVkICovCisjZGVmaW5lIEJVU19OT1RJRllfREVMX0RFVklDRQkJMHgwMDAwMDAwMiAvKiBkZXZpY2UgcmVtb3ZlZCAqLworI2RlZmluZSBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUgkJMHgwMDAwMDAwMyAvKiBkcml2ZXIgYm91bmQgdG8gZGV2aWNlICovCisjZGVmaW5lIEJVU19OT1RJRllfVU5CSU5EX0RSSVZFUgkweDAwMDAwMDA0IC8qIGRyaXZlciBhYm91dCB0byBiZQorCQkJCQkJICAgICAgdW5ib3VuZCAqLworCiAvKiBkcml2ZXJmcyBpbnRlcmZhY2UgZm9yIGV4cG9ydGluZyBidXMgYXR0cmlidXRlcyAqLwogCiBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSB7CkBAIC0zNDMsMTAgKzM2OSwxMSBAQAogCXZvaWQJCSpkcml2ZXJfZGF0YTsJLyogZGF0YSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgKi8KIAl2b2lkCQkqcGxhdGZvcm1fZGF0YTsJLyogUGxhdGZvcm0gc3BlY2lmaWMgZGF0YSwgZGV2aWNlCiAJCQkJCSAgIGNvcmUgZG9lc24ndCB0b3VjaCBpdCAqLwotCXZvaWQJCSpmaXJtd2FyZV9kYXRhOyAvKiBGaXJtd2FyZSBzcGVjaWZpYyBkYXRhIChlLmcuIEFDUEksCi0JCQkJCSAgIEJJT1MgZGF0YSkscmVzZXJ2ZWQgZm9yIGRldmljZSBjb3JlKi8KIAlzdHJ1Y3QgZGV2X3BtX2luZm8JcG93ZXI7CiAKKyNpZmRlZiBDT05GSUdfTlVNQQorCWludAkJbnVtYV9ub2RlOwkvKiBOVU1BIG5vZGUgdGhpcyBkZXZpY2UgaXMgY2xvc2UgdG8gKi8KKyNlbmRpZgogCXU2NAkJKmRtYV9tYXNrOwkvKiBkbWEgbWFzayAoaWYgZG1hJ2FibGUgZGV2aWNlKSAqLwogCXU2NAkJY29oZXJlbnRfZG1hX21hc2s7LyogTGlrZSBkbWFfbWFzaywgYnV0IGZvcgogCQkJCQkgICAgIGFsbG9jX2NvaGVyZW50IG1hcHBpbmdzIGFzCkBAIC0zNTgsNiArMzg1LDggQEAKIAogCXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtCSpkbWFfbWVtOyAvKiBpbnRlcm5hbCBmb3IgY29oZXJlbnQgbWVtCiAJCQkJCSAgICAgb3ZlcnJpZGUgKi8KKwkvKiBhcmNoIHNwZWNpZmljIGFkZGl0aW9ucyAqLworCXN0cnVjdCBkZXZfYXJjaGRhdGEJYXJjaGRhdGE7CiAKIAkvKiBjbGFzc19kZXZpY2UgbWlncmF0aW9uIHBhdGggKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CkBAIC0zNjgsNiArMzk3LDI1IEBACiAJdm9pZAkoKnJlbGVhc2UpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogfTsKIAorI2lmZGVmIENPTkZJR19OVU1BCitzdGF0aWMgaW5saW5lIGludCBkZXZfdG9fbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+bnVtYV9ub2RlOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kZXZfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBub2RlKQoreworCWRldi0+bnVtYV9ub2RlID0gbm9kZTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBkZXZfdG9fbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIC0xOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kZXZfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBub2RlKQoreworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgdm9pZCAqCiBkZXZfZ2V0X2RydmRhdGEgKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTM5Myw5ICs0NDEsMTIgQEAKIGV4dGVybiB2b2lkIGRldmljZV9pbml0aWFsaXplKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZGV2aWNlX2FkZChzdHJ1Y3QgZGV2aWNlICogZGV2KTsKIGV4dGVybiB2b2lkIGRldmljZV9kZWwoc3RydWN0IGRldmljZSAqIGRldik7Ci1leHRlcm4gaW50IF9fbXVzdF9jaGVjayBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoc3RydWN0IGRldmljZSAqLCB2b2lkICosCitleHRlcm4gaW50IGRldmljZV9mb3JfZWFjaF9jaGlsZChzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKiwKIAkJICAgICBpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlICpkZXZpY2VfZmluZF9jaGlsZChzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKmRhdGEsCisJCQkJCWludCAoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOwogZXh0ZXJuIGludCBkZXZpY2VfcmVuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbmV3X25hbWUpOworZXh0ZXJuIGludCBkZXZpY2VfbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm5ld19wYXJlbnQpOwogCiAvKgogICogTWFudWFsIGJpbmRpbmcgb2YgYSBkZXZpY2UgdG8gZHJpdmVyLiBTZWUgZHJpdmVycy9iYXNlL2J1cy5jCkBAIC00MTUsOCArNDY2LDYgQEAKIAkJCQkgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50Ziw0LDUpKSk7CiBleHRlcm4gdm9pZCBkZXZpY2VfZGVzdHJveShzdHJ1Y3QgY2xhc3MgKmNscywgZGV2X3QgZGV2dCk7CiAKLWV4dGVybiBpbnQgdmlydHVhbF9kZXZpY2VfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KIC8qCiAgKiBQbGF0Zm9ybSAiZml4dXAiIGZ1bmN0aW9ucyAtIGFsbG93IHRoZSBwbGF0Zm9ybSB0byBoYXZlIHRoZWlyIHNheQogICogYWJvdXQgZGV2aWNlcyBhbmQgYWN0aW9ucyB0aGF0IHRoZSBnZW5lcmFsIGRldmljZSBsYXllciBkb2Vzbid0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RpdmVydC5oIGIvaW5jbHVkZS9saW51eC9kaXZlcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiNGU5ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2RpdmVydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBGcmFtZSBEaXZlcnNpb24sIEJlbm9pdCBMb2NoZXIgPEJlbm9pdC5Mb2NoZXJAc2tmLmNvbT4KLSAqCi0gKiBDaGFuZ2VzOgotICogCQkwNi8wOS8yMDAwCUJMOglpbml0aWFsIHZlcnNpb24KLSAqIAotICovCi0gCi0jaWZuZGVmIF9MSU5VWF9ESVZFUlRfSAotI2RlZmluZSBfTElOVVhfRElWRVJUX0gKLQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi0jZGVmaW5lCU1BWF9ESVZFUlRfUE9SVFMJOAkvKiBNYXggbnVtYmVyIG9mIHBvcnRzIHRvIGRpdmVydCAodGNwLCB1ZHApICovCi0KLS8qIERpdmVydGFibGUgcHJvdG9jb2xzICovCi0jZGVmaW5lCURJVkVSVF9QUk9UT19OT05FCTB4MDAwMAotI2RlZmluZQlESVZFUlRfUFJPVE9fSVAJCTB4MDAwMQotI2RlZmluZQlESVZFUlRfUFJPVE9fSUNNUAkweDAwMDIKLSNkZWZpbmUJRElWRVJUX1BST1RPX1RDUAkweDAwMDQKLSNkZWZpbmUJRElWRVJUX1BST1RPX1VEUAkweDAwMDgKLQotLyoKLSAqCVRoaXMgaXMgYW4gRXRoZXJuZXQgRnJhbWUgRGl2ZXJ0ZXIgb3B0aW9uIGJsb2NrCi0gKi8KLXN0cnVjdCBkaXZlcnRfYmxrCi17Ci0JaW50CQlkaXZlcnQ7ICAvKiBhcmUgd2UgYWN0aXZlICovCi0JdW5zaWduZWQgaW50IHByb3RvczsJLyogcHJvdG9jb2xzICovCi0JX191MTYJCXRjcF9kc3RbTUFYX0RJVkVSVF9QT1JUU107IC8qIHNwZWNpZmljIHRjcCBkc3QgcG9ydHMgdG8gZGl2ZXJ0ICovCi0JX191MTYJCXRjcF9zcmNbTUFYX0RJVkVSVF9QT1JUU107IC8qIHNwZWNpZmljIHRjcCBzcmMgcG9ydHMgdG8gZGl2ZXJ0ICovCi0JX191MTYJCXVkcF9kc3RbTUFYX0RJVkVSVF9QT1JUU107IC8qIHNwZWNpZmljIHVkcCBkc3QgcG9ydHMgdG8gZGl2ZXJ0ICovCi0JX191MTYJCXVkcF9zcmNbTUFYX0RJVkVSVF9QT1JUU107IC8qIHNwZWNpZmljIHVkcCBzcmMgcG9ydHMgdG8gZGl2ZXJ0ICovCi19OwotCi0vKgotICogRGl2ZXJzaW9uIGNvbnRyb2wgYmxvY2ssIGZvciBjb25maWd1cmF0aW9uIHdpdGggdGhlIHVzZXJzcGFjZSB0b29sCi0gKiBkaXZlcnQKLSAqLwotCi10eXBlZGVmIHVuaW9uIF9kaXZlcnRfY2ZfYXJnCi17Ci0JX19zMTYJCWludDE2OwotCV9fdTE2CQl1aW50MTY7Ci0JX19zMzIJCWludDMyOwotCV9fdTMyCQl1aW50MzI7Ci0JX19zNjQJCWludDY0OwotCV9fdTY0CQl1aW50NjQ7Ci0Jdm9pZAlfX3VzZXIgKnB0cjsKLX0gZGl2ZXJ0X2NmX2FyZzsKLQotCi1zdHJ1Y3QgZGl2ZXJ0X2NmCi17Ci0JaW50CWNtZDsJCQkJLyogQ29tbWFuZCAqLwotCWRpdmVydF9jZl9hcmcgCWFyZzEsCi0JCQkJCWFyZzIsCi0JCQkJCWFyZzM7Ci0JaW50CWRldl9pbmRleDsJLyogZGV2aWNlIGluZGV4IChldGgwPTAsIGV0Yy4uLikgKi8KLX07Ci0KLQotLyogRGl2ZXJzaW9uIGNvbW1hbmRzICovCi0jZGVmaW5lCURJVkNNRF9ESVZFUlQJCQkxIC8qIEVOQUJMRS9ESVNBQkxFIGRpdmVyc2lvbiAqLwotI2RlZmluZQlESVZDTURfSVAJCQkJMiAvKiBFTkFCTEUvRElTQUJMRSB3aG9sZCBJUCBkaXZlcnNpb24gKi8KLSNkZWZpbmUJRElWQ01EX1RDUAkJCQkzIC8qIEVOQUJMRS9ESVNBQkxFIHdob2xkIFRDUCBkaXZlcnNpb24gKi8KLSNkZWZpbmUJRElWQ01EX1RDUERTVAkJCTQgLyogQUREL1JFTU9WRSBUQ1AgRFNUIHBvcnQgZm9yIGRpdmVyc2lvbiAqLwotI2RlZmluZQlESVZDTURfVENQU1JDCQkJNSAvKiBBREQvUkVNT1ZFIFRDUCBTUkMgcG9ydCBmb3IgZGl2ZXJzaW9uICovCi0jZGVmaW5lCURJVkNNRF9VRFAJCQkJNiAvKiBFTkFCTEUvRElTQUJMRSB3aG9sZSBVRFAgZGl2ZXJzaW9uICovCi0jZGVmaW5lCURJVkNNRF9VRFBEU1QJCQk3IC8qIEFERC9SRU1PVkUgVURQIERTVCBwb3J0IGZvciBkaXZlcnNpb24gKi8KLSNkZWZpbmUJRElWQ01EX1VEUFNSQwkJCTggLyogQUREL1JFTU9WRSBVRFAgU1JDIHBvcnQgZm9yIGRpdmVyc2lvbiAqLwotI2RlZmluZQlESVZDTURfSUNNUAkJCQk5IC8qIEVOQUJMRS9ESVNBQkxFIHdob2xlIElDTVAgZGl2ZXJzaW9uICovCi0jZGVmaW5lCURJVkNNRF9HRVRTVEFUVVMJCTEwIC8qIEdFVCB0aGUgc3RhdHVzIG9mIHRoZSBkaXZlcnRlciAqLwotI2RlZmluZQlESVZDTURfUkVTRVQJCQkxMSAvKiBSZXNldCB0aGUgZGl2ZXJ0ZXIgb24gdGhlIHNwZWNpZmllZCBkZXYgKi8KLSNkZWZpbmUgRElWQ01EX0dFVFZFUlNJT04JCTEyIC8qIFJldHJpZXZlIHRoZSBkaXZlcnRlciBjb2RlIHZlcnNpb24gKGNoYXJbMzJdKSAqLwotCi0vKiBHZW5lcmFsIHN5bnRheCBvZiB0aGUgY29tbWFuZHM6Ci0gKiAKLSAqIERJVkNNRF94eHh4eHgoYXJnMSwgYXJnMiwgYXJnMywgZGV2X2luZGV4KQotICogCi0gKiBTSU9DU0lGRElWRVJUOgotICogICBESVZDTURfRElWRVJUKERJVkFSRzFfRU5BQkxFfERJVkFSRzFfRElTQUJMRSwgLCAsaWZpbmRleCkKLSAqICAgRElWQ01EX0lQKERJVkFSRzFfRU5BQkxFfERJVkFSRzFfRElTQUJMRSwgLCAsIGlmaW5kZXgpCi0gKiAgIERJVkNNRF9UQ1AoRElWQVJHMV9FTkFCTEV8RElWQVJHMV9ESVNBQkxFLCAsICwgaWZpbmRleCkKLSAqICAgRElWQ01EX1RDUERTVChESVZBUkcxX0FERHxESVZBUkcxX1JFTU9WRSwgcG9ydCwgLCBpZmluZGV4KQotICogICBESVZDTURfVENQU1JDKERJVkFSRzFfQUREfERJVkFSRzFfUkVNT1ZFLCBwb3J0LCAsIGlmaW5kZXgpCi0gKiAgIERJVkNNRF9VRFAoRElWQVJHMV9FTkFCTEV8RElWQVJHMV9ESVNBQkxFLCAsICwgaWZpbmRleCkKLSAqICAgRElWQ01EX1VEUERTVChESVZBUkcxX0FERHxESVZBUkcxX1JFTU9WRSwgcG9ydCwgLCBpZmluZGV4KQotICogICBESVZDTURfVURQU1JDKERJVkFSRzFfQUREfERJVkFSRzFfUkVNT1ZFLCBwb3J0LCAsIGlmaW5kZXgpCi0gKiAgIERJVkNNRF9JQ01QKERJVkFSRzFfRU5BQkxFfERJVkFSRzFfRElTQUJMRSwgLCAsIGlmaW5kZXgpCi0gKiAgIERJVkNNRF9SRVNFVCgsICwgLCBpZmluZGV4KQotICogICAKLSAqIFNJT0dJRkRJVkVSVDoKLSAqICAgRElWQ01EX0dFVFNUQVRVUyhkaXZlcnRfYmxrLCAsICwgaWZpbmRleCkKLSAqICAgRElWQ01EX0dFVFZFUlNJT04oc3RyaW5nWzNdKQotICovCi0KLQotLyogUG9zc2libGUgdmFsdWVzIGZvciBhcmcxICovCi0jZGVmaW5lCURJVkFSRzFfRU5BQkxFCQkJMCAvKiBFTkFCTEUgc29tZXRoaW5nICovCi0jZGVmaW5lCURJVkFSRzFfRElTQUJMRQkJCTEgLyogRElTQUJMRSBzb21ldGhpbmcgKi8KLSNkZWZpbmUgRElWQVJHMV9BREQJCQkJMiAvKiBBREQgc29tZXRoaW5nICovCi0jZGVmaW5lIERJVkFSRzFfUkVNT1ZFCQkJMyAvKiBSRU1PVkUgc29tZXRoaW5nICovCi0KLQotI2lmZGVmIF9fS0VSTkVMX18KLQotLyogZGl2ZXJ0ZXIgZnVuY3Rpb25zICovCi0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpZmRlZiBDT05GSUdfTkVUX0RJVkVSVAotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCi1pbnQgYWxsb2NfZGl2ZXJ0X2JsayhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXZvaWQgZnJlZV9kaXZlcnRfYmxrKHN0cnVjdCBuZXRfZGV2aWNlICopOwotaW50IGRpdmVydF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgZGl2ZXJ0X2NmIF9fdXNlciAqYXJnKTsKLXZvaWQgZGl2ZXJ0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9kaXZlcnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCS8qIGlmIGRpdmVyc2lvbiBpcyBzdXBwb3J0ZWQgb24gZGV2aWNlLCB0aGVuIGRpdmVydCAqLwotCWlmIChza2ItPmRldi0+ZGl2ZXJ0ICYmIHNrYi0+ZGV2LT5kaXZlcnQtPmRpdmVydCkKLQkJZGl2ZXJ0X2ZyYW1lKHNrYik7Ci19Ci0KLSNlbHNlCi0jIGRlZmluZSBhbGxvY19kaXZlcnRfYmxrKGRldikJCSgwKQotIyBkZWZpbmUgZnJlZV9kaXZlcnRfYmxrKGRldikJCWRvIHt9IHdoaWxlICgwKQotIyBkZWZpbmUgZGl2ZXJ0X2lvY3RsKGNtZCwgYXJnKQkJKC1FTk9QS0cpCi0jIGRlZmluZSBoYW5kbGVfZGl2ZXJ0ZXIoc2tiKQkJZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLSNlbmRpZiAKLSNlbmRpZgkvKiBfTElOVVhfRElWRVJUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaCBiL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaAppbmRleCA4ODUzZmM0Li5iOTM0ODYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCkBAIC0yODUsOSArMjg1LDkgQEAKICNkZWZpbmUgRE1fREVWX1NFVF9HRU9NRVRSWQlfSU9XUihETV9JT0NUTCwgRE1fREVWX1NFVF9HRU9NRVRSWV9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKIAogI2RlZmluZSBETV9WRVJTSU9OX01BSk9SCTQKLSNkZWZpbmUgRE1fVkVSU0lPTl9NSU5PUgkxMAorI2RlZmluZSBETV9WRVJTSU9OX01JTk9SCTExCiAjZGVmaW5lIERNX1ZFUlNJT05fUEFUQ0hMRVZFTAkwCi0jZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAwNi0wOS0xNCkiCisjZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAwNi0xMC0xMikiCiAKIC8qIFN0YXR1cyBiaXRzICovCiAjZGVmaW5lIERNX1JFQURPTkxZX0ZMQUcJKDEgPDwgMCkgLyogSW4vT3V0ICovCkBAIC0zMjMsNCArMzIzLDkgQEAKICAqLwogI2RlZmluZSBETV9TS0lQX0xPQ0tGU19GTEFHCSgxIDw8IDEwKSAvKiBJbiAqLwogCisvKgorICogU2V0IHRoaXMgdG8gc3VzcGVuZCB3aXRob3V0IGZsdXNoaW5nIHF1ZXVlZCBpb3MuCisgKi8KKyNkZWZpbmUgRE1fTk9GTFVTSF9GTEFHCQkoMSA8PCAxMSkgLyogSW4gKi8KKwogI2VuZGlmCQkJCS8qIF9MSU5VWF9ETV9JT0NUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtaS5oIGIvaW5jbHVkZS9saW51eC9kbWkuaAppbmRleCAzOGRjNDAzLi45MDRiZjNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1pLmgKQEAgLTY5LDYgKzY5LDcgQEAKIAlzdHJ1Y3QgZG1pX2RldmljZSAqZnJvbSk7CiBleHRlcm4gdm9pZCBkbWlfc2Nhbl9tYWNoaW5lKHZvaWQpOwogZXh0ZXJuIGludCBkbWlfZ2V0X3llYXIoaW50IGZpZWxkKTsKK2V4dGVybiBpbnQgZG1pX25hbWVfaW5fdmVuZG9ycyhjaGFyICpzdHIpOwogCiAjZWxzZQogCkBAIC03Nyw2ICs3OCw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkbWlfZGV2aWNlICogZG1pX2ZpbmRfZGV2aWNlKGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAogCXN0cnVjdCBkbWlfZGV2aWNlICpmcm9tKSB7IHJldHVybiBOVUxMOyB9CiBzdGF0aWMgaW5saW5lIGludCBkbWlfZ2V0X3llYXIoaW50IHllYXIpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRtaV9uYW1lX2luX3ZlbmRvcnMoY2hhciAqcykgeyByZXR1cm4gMDsgfQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lZmkuaCBiL2luY2x1ZGUvbGludXgvZWZpLmgKaW5kZXggNjZkNjIxZC4uZGYxYzkxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lZmkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VmaS5oCkBAIC0zMDAsOCArMzAwLDkgQEAKIGV4dGVybiBpbnQgX19pbml0IGVmaV91YXJ0X2NvbnNvbGVfb25seSAodm9pZCk7CiBleHRlcm4gdm9pZCBlZmlfaW5pdGlhbGl6ZV9pb21lbV9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpjb2RlX3Jlc291cmNlLAogCQkJCQlzdHJ1Y3QgcmVzb3VyY2UgKmRhdGFfcmVzb3VyY2UpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pbml0IGVmaV9nZXRfdGltZSh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGVmaV9nZXRfdGltZSh2b2lkKTsKIGV4dGVybiBpbnQgX19pbml0IGVmaV9zZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKTsKK2V4dGVybiBpbnQgaXNfYXZhaWxhYmxlX21lbW9yeShlZmlfbWVtb3J5X2Rlc2NfdCAqIG1kKTsKIGV4dGVybiBzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgbWVtbWFwOwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaCBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAppbmRleCAyZmE5ZjExLi5hMjQ5MzFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCkBAIC0yMSwxMSArMjEsMTEgQEAKIHR5cGVkZWYgaW50IChlbGV2YXRvcl9tYXlfcXVldWVfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50KTsKIAogdHlwZWRlZiBpbnQgKGVsZXZhdG9yX3NldF9yZXFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgZ2ZwX3QpOwotdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9wdXRfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwordHlwZWRlZiB2b2lkIChlbGV2YXRvcl9wdXRfcmVxX2ZuKSAoc3RydWN0IHJlcXVlc3QgKik7CiB0eXBlZGVmIHZvaWQgKGVsZXZhdG9yX2FjdGl2YXRlX3JlcV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIHR5cGVkZWYgdm9pZCAoZWxldmF0b3JfZGVhY3RpdmF0ZV9yZXFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAKLXR5cGVkZWYgdm9pZCAqKGVsZXZhdG9yX2luaXRfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgZWxldmF0b3JfdCAqKTsKK3R5cGVkZWYgdm9pZCAqKGVsZXZhdG9yX2luaXRfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKik7CiB0eXBlZGVmIHZvaWQgKGVsZXZhdG9yX2V4aXRfZm4pIChlbGV2YXRvcl90ICopOwogCiBzdHJ1Y3QgZWxldmF0b3Jfb3BzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VsZi5oIGIvaW5jbHVkZS9saW51eC9lbGYuaAppbmRleCBiNzBkMWQyLi42MDcxM2U2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZi5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxmLmgKQEAgLTYsNiArNiw4IEBACiAjaW5jbHVkZSA8bGludXgvZWxmLWVtLmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgogCitzdHJ1Y3QgZmlsZTsKKwogI2lmbmRlZiBlbGZfcmVhZF9pbXBsaWVzX2V4ZWMKICAgLyogRXhlY3V0YWJsZXMgZm9yIHdoaWNoIGVsZl9yZWFkX2ltcGxpZXNfZXhlYygpIHJldHVybnMgVFJVRSB3aWxsCiAgICAgIGhhdmUgdGhlIFJFQURfSU1QTElFU19FWEVDIHBlcnNvbmFsaXR5IGZsYWcgc2V0IGF1dG9tYXRpY2FsbHkuCkBAIC0zNTgsNiArMzYwLDcgQEAKICNkZWZpbmUgZWxmaGRyCQllbGYzMl9oZHIKICNkZWZpbmUgZWxmX3BoZHIJZWxmMzJfcGhkcgogI2RlZmluZSBlbGZfbm90ZQllbGYzMl9ub3RlCisjZGVmaW5lIGVsZl9hZGRyX3QJRWxmMzJfT2ZmCiAKICNlbHNlCiAKQEAgLTM2NSw4ICszNjgsMTYgQEAKICNkZWZpbmUgZWxmaGRyCQllbGY2NF9oZHIKICNkZWZpbmUgZWxmX3BoZHIJZWxmNjRfcGhkcgogI2RlZmluZSBlbGZfbm90ZQllbGY2NF9ub3RlCisjZGVmaW5lIGVsZl9hZGRyX3QJRWxmNjRfT2ZmCiAKICNlbmRpZgogCisjaWZuZGVmIEFSQ0hfSEFWRV9FWFRSQV9FTEZfTk9URVMKK3N0YXRpYyBpbmxpbmUgaW50IGFyY2hfbm90ZXNfc2l6ZSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF93cml0ZV9ub3RlcyhzdHJ1Y3QgZmlsZSAqZmlsZSkgeyB9CisKKyNkZWZpbmUgRUxGX0NPUkVfRVhUUkFfTk9URVNfU0laRSBhcmNoX25vdGVzX3NpemUoKQorI2RlZmluZSBFTEZfQ09SRV9XUklURV9FWFRSQV9OT1RFUyBhcmNoX3dyaXRlX25vdGVzKGZpbGUpCisjZW5kaWYgLyogQVJDSF9IQVZFX0VYVFJBX0VMRl9OT1RFUyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX0VMRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmgKaW5kZXggY2UwZTYxMC4uOGM0M2IxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2piZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19qYmQuaApAQCAtMTA5LDc0ICsxMDksMzIgQEAKICAqIGJlZW4gZG9uZSB5ZXQuCiAgKi8KIAotdm9pZCBleHQzX2pvdXJuYWxfYWJvcnRfaGFuZGxlKGNvbnN0IGNoYXIgKmNhbGxlciwgY29uc3QgY2hhciAqZXJyX2ZuLAotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBoYW5kbGVfdCAqaGFuZGxlLCBpbnQgZXJyKTsKLQotc3RhdGljIGlubGluZSBpbnQKLV9fZXh0M19qb3VybmFsX2dldF91bmRvX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWludCBlcnIgPSBqb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQzX2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX0ZVTkNUSU9OX18sIGJoLCBoYW5kbGUsZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotX19leHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWludCBlcnIgPSBqb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1leHQzX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQzX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7CiAJam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGJoKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLV9fZXh0M19qb3VybmFsX2ZvcmdldChjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlpbnQgZXJyID0gam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7Ci0JcmV0dXJuIGVycjsKLX0KK3ZvaWQgZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZShjb25zdCBjaGFyICpjYWxsZXIsIGNvbnN0IGNoYXIgKmVycl9mbiwKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaGFuZGxlX3QgKmhhbmRsZSwgaW50IGVycik7CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2V4dDNfam91cm5hbF9yZXZva2UoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlpbnQgZXJyID0gam91cm5hbF9yZXZva2UoaGFuZGxlLCBibG9ja25yLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7Ci0JcmV0dXJuIGVycjsKLX0KK2ludCBfX2V4dDNfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2V4dDNfam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwKLQkJCQkgaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlpbnQgZXJyID0gam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQzX2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX0ZVTkNUSU9OX18sIGJoLCBoYW5kbGUsZXJyKTsKLQlyZXR1cm4gZXJyOwotfQoraW50IF9fZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2V4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShjb25zdCBjaGFyICp3aGVyZSwKLQkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JaW50IGVyciA9IGpvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7Ci0JcmV0dXJuIGVycjsKLX0KK2ludCBfX2V4dDNfam91cm5hbF9mb3JnZXQoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKK2ludCBfX2V4dDNfam91cm5hbF9yZXZva2UoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJdW5zaWduZWQgbG9uZyBibG9ja25yLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKKworaW50IF9fZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGNvbnN0IGNoYXIgKndoZXJlLAorCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworCitpbnQgX19leHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoY29uc3QgY2hhciAqd2hlcmUsCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKICNkZWZpbmUgZXh0M19qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKSBcCiAJX19leHQzX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKF9fRlVOQ1RJT05fXywgKGhhbmRsZSksIChiaCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDRfamJkMi5oIGIvaW5jbHVkZS9saW51eC9leHQ0X2piZDIuaAppbmRleCA3MmRkNjMxLi5kNzE2ZTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDRfamJkMi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0NF9qYmQyLmgKQEAgLTExNCw3NCArMTE0LDMyIEBACiAgKiBiZWVuIGRvbmUgeWV0LgogICovCiAKLXZvaWQgZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZShjb25zdCBjaGFyICpjYWxsZXIsIGNvbnN0IGNoYXIgKmVycl9mbiwKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaGFuZGxlX3QgKmhhbmRsZSwgaW50IGVycik7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2V4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX0ZVTkNUSU9OX18sIGJoLCBoYW5kbGUsZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotX19leHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX0ZVTkNUSU9OX18sIGJoLCBoYW5kbGUsZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWV4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorc3RhdGljIGlubGluZSB2b2lkIGV4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2V4dDRfam91cm5hbF9mb3JnZXQoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JaW50IGVyciA9IGpiZDJfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19GVU5DVElPTl9fLCBiaCwgaGFuZGxlLGVycik7Ci0JcmV0dXJuIGVycjsKLX0KK3ZvaWQgZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZShjb25zdCBjaGFyICpjYWxsZXIsIGNvbnN0IGNoYXIgKmVycl9mbiwKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaGFuZGxlX3QgKmhhbmRsZSwgaW50IGVycik7CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2V4dDRfam91cm5hbF9yZXZva2UoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCi0JCSAgICAgIGV4dDRfZnNibGtfdCBibG9ja25yLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfcmV2b2tlKGhhbmRsZSwgYmxvY2tuciwgYmgpOwotCWlmIChlcnIpCi0JCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fRlVOQ1RJT05fXywgYmgsIGhhbmRsZSxlcnIpOwotCXJldHVybiBlcnI7Ci19CitpbnQgX19leHQ0X2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCi1zdGF0aWMgaW5saW5lIGludAotX19leHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsCi0JCQkJIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JaW50IGVyciA9IGpiZDJfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX0ZVTkNUSU9OX18sIGJoLCBoYW5kbGUsZXJyKTsKLQlyZXR1cm4gZXJyOwotfQoraW50IF9fZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2V4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShjb25zdCBjaGFyICp3aGVyZSwKLQkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JaW50IGVyciA9IGpiZDJfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX0ZVTkNUSU9OX18sIGJoLCBoYW5kbGUsZXJyKTsKLQlyZXR1cm4gZXJyOwotfQoraW50IF9fZXh0NF9qb3VybmFsX2ZvcmdldChjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAoraW50IF9fZXh0NF9qb3VybmFsX3Jldm9rZShjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlleHQ0X2ZzYmxrX3QgYmxvY2tuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CisKK2ludCBfX2V4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwKKwkJCQloYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKKworaW50IF9fZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGNvbnN0IGNoYXIgKndoZXJlLAorCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCiAjZGVmaW5lIGV4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCkgXAogCV9fZXh0NF9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhfX0ZVTkNUSU9OX18sIChoYW5kbGUpLCAoYmgpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYXVsdC1pbmplY3QuaCBiL2luY2x1ZGUvbGludXgvZmF1bHQtaW5qZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzNjhjNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZmF1bHQtaW5qZWN0LmgKQEAgLTAsMCArMSw4NCBAQAorI2lmbmRlZiBfTElOVVhfRkFVTFRfSU5KRUNUX0gKKyNkZWZpbmUgX0xJTlVYX0ZBVUxUX0lOSkVDVF9ICisKKyNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKy8qCisgKiBGb3IgZXhwbGFuYXRpb24gb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgc3RydWN0LCBzZWUKKyAqIERvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKKyAqLworc3RydWN0IGZhdWx0X2F0dHIgeworCXVuc2lnbmVkIGxvbmcgcHJvYmFiaWxpdHk7CisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKKwlhdG9taWNfdCB0aW1lczsKKwlhdG9taWNfdCBzcGFjZTsKKwl1bnNpZ25lZCBsb25nIHZlcmJvc2U7CisJdTMyIHRhc2tfZmlsdGVyOworCXVuc2lnbmVkIGxvbmcgc3RhY2t0cmFjZV9kZXB0aDsKKwl1bnNpZ25lZCBsb25nIHJlcXVpcmVfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyByZXF1aXJlX2VuZDsKKwl1bnNpZ25lZCBsb25nIHJlamVjdF9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHJlamVjdF9lbmQ7CisKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCisjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUworCisJc3RydWN0IHsKKwkJc3RydWN0IGRlbnRyeSAqZGlyOworCisJCXN0cnVjdCBkZW50cnkgKnByb2JhYmlsaXR5X2ZpbGU7CisJCXN0cnVjdCBkZW50cnkgKmludGVydmFsX2ZpbGU7CisJCXN0cnVjdCBkZW50cnkgKnRpbWVzX2ZpbGU7CisJCXN0cnVjdCBkZW50cnkgKnNwYWNlX2ZpbGU7CisJCXN0cnVjdCBkZW50cnkgKnZlcmJvc2VfZmlsZTsKKwkJc3RydWN0IGRlbnRyeSAqdGFza19maWx0ZXJfZmlsZTsKKwkJc3RydWN0IGRlbnRyeSAqc3RhY2t0cmFjZV9kZXB0aF9maWxlOworCQlzdHJ1Y3QgZGVudHJ5ICpyZXF1aXJlX3N0YXJ0X2ZpbGU7CisJCXN0cnVjdCBkZW50cnkgKnJlcXVpcmVfZW5kX2ZpbGU7CisJCXN0cnVjdCBkZW50cnkgKnJlamVjdF9zdGFydF9maWxlOworCQlzdHJ1Y3QgZGVudHJ5ICpyZWplY3RfZW5kX2ZpbGU7CisJfSBkZW50cmllczsKKworI2VuZGlmCit9OworCisjZGVmaW5lIEZBVUxUX0FUVFJfSU5JVElBTElaRVIgewkJCQlcCisJCS5pbnRlcnZhbCA9IDEsCQkJCQlcCisJCS50aW1lcyA9IEFUT01JQ19JTklUKDEpLAkJCVwKKwkJLnJlcXVpcmVfZW5kID0gVUxPTkdfTUFYLAkJCVwKKwkJLnN0YWNrdHJhY2VfZGVwdGggPSAzMiwJCQkJXAorCQkudmVyYm9zZSA9IDIsCQkJCQlcCisJfQorCisjZGVmaW5lIERFQ0xBUkVfRkFVTFRfQVRUUihuYW1lKSBzdHJ1Y3QgZmF1bHRfYXR0ciBuYW1lID0gRkFVTFRfQVRUUl9JTklUSUFMSVpFUgoraW50IHNldHVwX2ZhdWx0X2F0dHIoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIGNoYXIgKnN0cik7Cit2b2lkIHNob3VsZF9mYWlsX3NyYW5kb20odW5zaWduZWQgbG9uZyBlbnRyb3B5KTsKK2Jvb2wgc2hvdWxkX2ZhaWwoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIHNzaXplX3Qgc2l6ZSk7CisKKyNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCisKK2ludCBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBjbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpOworCisjZWxzZSAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGluaXRfZmF1bHRfYXR0cl9kZW50cmllcyhzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0ciwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLworCisjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTiAqLworCisjZW5kaWYgLyogX0xJTlVYX0ZBVUxUX0lOSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZiLmggYi9pbmNsdWRlL2xpbnV4L2ZiLmgKaW5kZXggM2U2OTI0MS4uNjQxNzdlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmIuaApAQCAtNzc0LDggKzc3NCw4IEBACiAjZW5kaWYKIAogCXN0cnVjdCBmYl9vcHMgKmZib3BzOwotCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2U7IC8qIHN5c2ZzIHBlciBkZXZpY2UgYXR0cnMgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7CQkvKiBUaGlzIGlzIHRoZSBwYXJlbnQgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkvKiBUaGlzIGlzIHRoaXMgZmIgZGV2aWNlICovCiAJaW50IGNsYXNzX2ZsYWc7ICAgICAgICAgICAgICAgICAgICAvKiBwcml2YXRlIHN5c2ZzIGZsYWdzICovCiAjaWZkZWYgQ09ORklHX0ZCX1RJTEVCTElUVElORwogCXN0cnVjdCBmYl90aWxlX29wcyAqdGlsZW9wczsgICAgLyogVGlsZSBCbGl0dGluZyAqLwpAQCAtOTEwLDggKzkxMCw4IEBACiAvKiBkcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYyAqLwogZXh0ZXJuIHN0cnVjdCBmYl9pbmZvICpmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplX3Qgc2l6ZSwgc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGZyYW1lYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8pOwotZXh0ZXJuIGludCBmYl9pbml0X2NsYXNzX2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyk7Ci1leHRlcm4gdm9pZCBmYl9jbGVhbnVwX2NsYXNzX2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaGVhZCk7CitleHRlcm4gaW50IGZiX2luaXRfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKK2V4dGVybiB2b2lkIGZiX2NsZWFudXBfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpoZWFkKTsKIGV4dGVybiB2b2lkIGZiX2JsX2RlZmF1bHRfY3VydmUoc3RydWN0IGZiX2luZm8gKmZiX2luZm8sIHU4IG9mZiwgdTggbWluLCB1OCBtYXgpOwogCiAvKiBkcml2ZXJzL3ZpZGVvL2ZibW9uLmMgKi8KQEAgLTkyOSw4ICs5MjksNiBAQAogI2RlZmluZSBGQl9NT0RFX0lTX0ZJUlNUCTE2CiAjZGVmaW5lIEZCX01PREVfSVNfRlJPTV9WQVIgICAgIDMyCiAKLWV4dGVybiBpbnQgZmJtb25fdmFsaWRfdGltaW5ncyh1X2ludCBwaXhjbG9jaywgdV9pbnQgaHRvdGFsLCB1X2ludCB2dG90YWwsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwogZXh0ZXJuIGludCBmYm1vbl9kcG1zKGNvbnN0IHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKIGV4dGVybiBpbnQgZmJfZ2V0X21vZGUoaW50IGZsYWdzLCB1MzIgdmFsLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKQEAgLTk3MCwxMSArOTY4LDExIEBACiAvKiBkcml2ZXJzL3ZpZGVvL2ZiY21hcC5jICovCiBleHRlcm4gaW50IGZiX2FsbG9jX2NtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIGludCBsZW4sIGludCB0cmFuc3ApOwogZXh0ZXJuIHZvaWQgZmJfZGVhbGxvY19jbWFwKHN0cnVjdCBmYl9jbWFwICpjbWFwKTsKLWV4dGVybiBpbnQgZmJfY29weV9jbWFwKHN0cnVjdCBmYl9jbWFwICpmcm9tLCBzdHJ1Y3QgZmJfY21hcCAqdG8pOwotZXh0ZXJuIGludCBmYl9jbWFwX3RvX3VzZXIoc3RydWN0IGZiX2NtYXAgKmZyb20sIHN0cnVjdCBmYl9jbWFwX3VzZXIgKnRvKTsKK2V4dGVybiBpbnQgZmJfY29weV9jbWFwKGNvbnN0IHN0cnVjdCBmYl9jbWFwICpmcm9tLCBzdHJ1Y3QgZmJfY21hcCAqdG8pOworZXh0ZXJuIGludCBmYl9jbWFwX3RvX3VzZXIoY29uc3Qgc3RydWN0IGZiX2NtYXAgKmZyb20sIHN0cnVjdCBmYl9jbWFwX3VzZXIgKnRvKTsKIGV4dGVybiBpbnQgZmJfc2V0X2NtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKIGV4dGVybiBpbnQgZmJfc2V0X3VzZXJfY21hcChzdHJ1Y3QgZmJfY21hcF91c2VyICpjbWFwLCBzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyk7Ci1leHRlcm4gc3RydWN0IGZiX2NtYXAgKmZiX2RlZmF1bHRfY21hcChpbnQgbGVuKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmJfY21hcCAqZmJfZGVmYXVsdF9jbWFwKGludCBsZW4pOwogZXh0ZXJuIHZvaWQgZmJfaW52ZXJ0X2NtYXBzKHZvaWQpOwogCiBzdHJ1Y3QgZmJfdmlkZW9tb2RlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmggYi9pbmNsdWRlL2xpbnV4L2ZpYl9ydWxlcy5oCmluZGV4IDQ0MThjOGQuLjgyNzBhYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaApAQCAtNiw2ICs2LDcgQEAKIAogLyogcnVsZSBpcyBwZXJtYW5lbnQsIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCAqLwogI2RlZmluZSBGSUJfUlVMRV9QRVJNQU5FTlQJMQorI2RlZmluZSBGSUJfUlVMRV9JTlZFUlQJCTIKIAogc3RydWN0IGZpYl9ydWxlX2hkcgogewpAQCAtMzQsNyArMzUsNyBAQAogCUZSQV9VTlVTRUQzLAogCUZSQV9VTlVTRUQ0LAogCUZSQV9VTlVTRUQ1LAotCUZSQV9GV01BUkssCS8qIG5ldGZpbHRlciBtYXJrICovCisJRlJBX0ZXTUFSSywJLyogbWFyayAqLwogCUZSQV9GTE9XLAkvKiBmbG93L2NsYXNzIGlkICovCiAJRlJBX1VOVVNFRDYsCiAJRlJBX1VOVVNFRDcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbGUuaCBiL2luY2x1ZGUvbGludXgvZmlsZS5oCmluZGV4IDc0MTgzZTYuLmVkY2EzNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlsZS5oCkBAIC0yNiwxOSArMjYsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZkc19iaXRzWzFdOwogfTsKIAotLyoKLSAqIE1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBmZHM6IHdlIHVzZSBhIHNlcGFyYXRlbHkgYWxsb2NhdGVkIGZkX3NldAotICovCi0jZGVmaW5lIEVNQkVEREVEX0ZEX1NFVF9TSVpFIChCSVRTX1BFUl9CWVRFICogc2l6ZW9mKHN0cnVjdCBlbWJlZGRlZF9mZF9zZXQpKQotCiBzdHJ1Y3QgZmR0YWJsZSB7CiAJdW5zaWduZWQgaW50IG1heF9mZHM7Ci0JaW50IG1heF9mZHNldDsKIAlzdHJ1Y3QgZmlsZSAqKiBmZDsgICAgICAvKiBjdXJyZW50IGZkIGFycmF5ICovCiAJZmRfc2V0ICpjbG9zZV9vbl9leGVjOwogCWZkX3NldCAqb3Blbl9mZHM7CiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcmVlX2ZpbGVzOwogCXN0cnVjdCBmZHRhYmxlICpuZXh0OwogfTsKIApAQCAtNjQsNiArNTcsOCBAQAogCiAjZGVmaW5lIGZpbGVzX2ZkdGFibGUoZmlsZXMpIChyY3VfZGVyZWZlcmVuY2UoKGZpbGVzKS0+ZmR0KSkKIAorZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpmaWxwX2NhY2hlcDsKKwogZXh0ZXJuIHZvaWQgRkFTVENBTEwoX19mcHV0KHN0cnVjdCBmaWxlICopKTsKIGV4dGVybiB2b2lkIEZBU1RDQUxMKGZwdXQoc3RydWN0IGZpbGUgKikpOwogCkBAIC04MSwxNCArNzYsOCBAQAogZXh0ZXJuIHZvaWQgRkFTVENBTEwocHV0X3VudXNlZF9mZCh1bnNpZ25lZCBpbnQgZmQpKTsKIHN0cnVjdCBrbWVtX2NhY2hlOwogCi1leHRlcm4gc3RydWN0IGZpbGUgKiogYWxsb2NfZmRfYXJyYXkoaW50KTsKLWV4dGVybiB2b2lkIGZyZWVfZmRfYXJyYXkoc3RydWN0IGZpbGUgKiosIGludCk7Ci0KLWV4dGVybiBmZF9zZXQgKmFsbG9jX2Zkc2V0KGludCk7Ci1leHRlcm4gdm9pZCBmcmVlX2Zkc2V0KGZkX3NldCAqLCBpbnQpOwotCiBleHRlcm4gaW50IGV4cGFuZF9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICosIGludCBucik7Ci1leHRlcm4gdm9pZCBmcmVlX2ZkdGFibGUoc3RydWN0IGZkdGFibGUgKmZkdCk7CitleHRlcm4gdm9pZCBmcmVlX2ZkdGFibGVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KTsKIGV4dGVybiB2b2lkIF9faW5pdCBmaWxlc19kZWZlcl9pbml0KHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmaWxlICogZmNoZWNrX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCB1bnNpZ25lZCBpbnQgZmQpCkBAIC0xMTQsNCArMTAzLDYgQEAKIHZvaWQgRkFTVENBTEwocHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcykpOwogdm9pZCByZXNldF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICosIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKik7CiAKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZmlsZXNfY2FjaGVwOworCiAjZW5kaWYgLyogX19MSU5VWF9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnJlZXplci5oIGIvaW5jbHVkZS9saW51eC9mcmVlemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3NWUyNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZnJlZXplci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qIEZyZWV6ZXIgZGVjbGFyYXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogQ2hlY2sgaWYgYSBwcm9jZXNzIGhhcyBiZWVuIGZyb3plbgorICovCitzdGF0aWMgaW5saW5lIGludCBmcm96ZW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBwLT5mbGFncyAmIFBGX0ZST1pFTjsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZXJlIGlzIGEgcmVxdWVzdCB0byBmcmVlemUgYSBwcm9jZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZyZWV6aW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gdGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX0ZSRUVaRSk7Cit9CisKKy8qCisgKiBSZXF1ZXN0IHRoYXQgYSBwcm9jZXNzIGJlIGZyb3plbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZXplKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9GUkVFWkUpOworfQorCisvKgorICogU29tZXRpbWVzIHdlIG1heSBuZWVkIHRvIGNhbmNlbCB0aGUgcHJldmlvdXMgJ2ZyZWV6ZScgcmVxdWVzdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fbm90X2ZyZWV6ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9GUkVFWkUpOworfQorCisvKgorICogV2FrZSB1cCBhIGZyb3plbiBwcm9jZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRoYXdfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaWYgKGZyb3plbihwKSkgeworCQlwLT5mbGFncyAmPSB+UEZfRlJPWkVOOworCQl3YWtlX3VwX3Byb2Nlc3MocCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGZyZWV6aW5nIGlzIGNvbXBsZXRlLCBtYXJrIHByb2Nlc3MgYXMgZnJvemVuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcm96ZW5fcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcC0+ZmxhZ3MgfD0gUEZfRlJPWkVOOworCXdtYigpOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhwLCBUSUZfRlJFRVpFKTsKK30KKworZXh0ZXJuIHZvaWQgcmVmcmlnZXJhdG9yKHZvaWQpOworZXh0ZXJuIGludCBmcmVlemVfcHJvY2Vzc2VzKHZvaWQpOworZXh0ZXJuIHZvaWQgdGhhd19wcm9jZXNzZXModm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV90b19mcmVlemUodm9pZCkKK3sKKwlpZiAoZnJlZXppbmcoY3VycmVudCkpIHsKKwkJcmVmcmlnZXJhdG9yKCk7CisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKworZXh0ZXJuIHZvaWQgdGhhd19zb21lX3Byb2Nlc3NlcyhpbnQgYWxsKTsKKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGZyb3plbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGZyZWV6aW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgQlVHKCk7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHRoYXdfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDE7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcm96ZW5fcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgQlVHKCk7IH0KKworc3RhdGljIGlubGluZSB2b2lkIHJlZnJpZ2VyYXRvcih2b2lkKSB7fQorc3RhdGljIGlubGluZSBpbnQgZnJlZXplX3Byb2Nlc3Nlcyh2b2lkKSB7IEJVRygpOyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHRoYXdfcHJvY2Vzc2VzKHZvaWQpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV90b19mcmVlemUodm9pZCkgeyByZXR1cm4gMDsgfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDM0NDA2ZWQuLjE4NmRhODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTEyMCw2ICsxMjAsNyBAQAogI2RlZmluZSBNU19QUklWQVRFCSgxPDwxOCkJLyogY2hhbmdlIHRvIHByaXZhdGUgKi8KICNkZWZpbmUgTVNfU0xBVkUJKDE8PDE5KQkvKiBjaGFuZ2UgdG8gc2xhdmUgKi8KICNkZWZpbmUgTVNfU0hBUkVECSgxPDwyMCkJLyogY2hhbmdlIHRvIHNoYXJlZCAqLworI2RlZmluZSBNU19SRUxBVElNRQkoMTw8MjEpCS8qIFVwZGF0ZSBhdGltZSByZWxhdGl2ZSB0byBtdGltZS9jdGltZS4gKi8KICNkZWZpbmUgTVNfQUNUSVZFCSgxPDwzMCkKICNkZWZpbmUgTVNfTk9VU0VSCSgxPDwzMSkKIApAQCAtMjY5LDYgKzI3MCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KQEAgLTI3Niw3ICsyNzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcmlvX3RyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9waWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtNDgyLDIxICs0ODQsNiBAQAogfTsKIAogLyoKLSAqIGJkZXYtPmJkX211dGV4IG5lc3Rpbmcgc3ViY2xhc3NlcyBmb3IgdGhlIGxvY2sgdmFsaWRhdG9yOgotICoKLSAqIDA6IG5vcm1hbAotICogMTogJ3dob2xlJwotICogMjogJ3BhcnRpdGlvbicKLSAqLwotZW51bSBiZGV2X2JkX211dGV4X2xvY2tfY2xhc3MKLXsKLQlCRF9NVVRFWF9OT1JNQUwsCi0JQkRfTVVURVhfV0hPTEUsCi0JQkRfTVVURVhfUEFSVElUSU9OCi19OwotCi0KLS8qCiAgKiBSYWRpeC10cmVlIHRhZ3MsIGZvciB0YWdnaW5nIGRpcnR5IGFuZCB3cml0ZWJhY2sgcGFnZXMgd2l0aGluIHRoZSBwYWdlY2FjaGUKICAqIHJhZGl4IHRyZWVzCiAgKi8KQEAgLTU0MywxOSArNTMwLDIyIEBACiAJc3RydWN0IGxpc3RfaGVhZAlpX2RlbnRyeTsKIAl1bnNpZ25lZCBsb25nCQlpX2lubzsKIAlhdG9taWNfdAkJaV9jb3VudDsKLQl1bW9kZV90CQkJaV9tb2RlOwogCXVuc2lnbmVkIGludAkJaV9ubGluazsKIAl1aWRfdAkJCWlfdWlkOwogCWdpZF90CQkJaV9naWQ7CiAJZGV2X3QJCQlpX3JkZXY7CisJdW5zaWduZWQgbG9uZwkJaV92ZXJzaW9uOwogCWxvZmZfdAkJCWlfc2l6ZTsKKyNpZmRlZiBfX05FRURfSV9TSVpFX09SREVSRUQKKwlzZXFjb3VudF90CQlpX3NpemVfc2VxY291bnQ7CisjZW5kaWYKIAlzdHJ1Y3QgdGltZXNwZWMJCWlfYXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCQlpX210aW1lOwogCXN0cnVjdCB0aW1lc3BlYwkJaV9jdGltZTsKIAl1bnNpZ25lZCBpbnQJCWlfYmxrYml0czsKLQl1bnNpZ25lZCBsb25nCQlpX3ZlcnNpb247CiAJYmxrY250X3QJCWlfYmxvY2tzOwogCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGlfYnl0ZXM7CisJdW1vZGVfdAkJCWlfbW9kZTsKIAlzcGlubG9ja190CQlpX2xvY2s7CS8qIGlfYmxvY2tzLCBpX2J5dGVzLCBtYXliZSBpX3NpemUgKi8KIAlzdHJ1Y3QgbXV0ZXgJCWlfbXV0ZXg7CiAJc3RydWN0IHJ3X3NlbWFwaG9yZQlpX2FsbG9jX3NlbTsKQEAgLTU5OCw5ICs1ODgsNiBAQAogCXZvaWQJCQkqaV9zZWN1cml0eTsKICNlbmRpZgogCXZvaWQJCQkqaV9wcml2YXRlOyAvKiBmcyBvciBkZXZpY2UgcHJpdmF0ZSBwb2ludGVyICovCi0jaWZkZWYgX19ORUVEX0lfU0laRV9PUkRFUkVECi0Jc2VxY291bnRfdAkJaV9zaXplX3NlcWNvdW50OwotI2VuZGlmCiB9OwogCiAvKgpAQCAtNjIzLDYgKzYxMCw5IEBACiAJSV9NVVRFWF9RVU9UQQogfTsKIAorZXh0ZXJuIHZvaWQgaW5vZGVfZG91YmxlX2xvY2soc3RydWN0IGlub2RlICppbm9kZTEsIHN0cnVjdCBpbm9kZSAqaW5vZGUyKTsKK2V4dGVybiB2b2lkIGlub2RlX2RvdWJsZV91bmxvY2soc3RydWN0IGlub2RlICppbm9kZTEsIHN0cnVjdCBpbm9kZSAqaW5vZGUyKTsKKwogLyoKICAqIE5PVEU6IGluIGEgMzJiaXQgYXJjaCB3aXRoIGEgcHJlZW1wdGFibGUga2VybmVsIGFuZAogICogYW4gVVAgY29tcGlsZSB0aGUgaV9zaXplX3JlYWQvd3JpdGUgbXVzdCBiZSBhdG9taWMKQEAgLTYzMyw3ICs2MjMsNyBAQAogICogY21weGNoZzhiIHdpdGhvdXQgdGhlIG5lZWQgb2YgdGhlIGxvY2sgcHJlZml4KS4gRm9yIFNNUCBjb21waWxlcwogICogYW5kIDY0Yml0IGFyY2hzIGl0IG1ha2VzIG5vIGRpZmZlcmVuY2UgaWYgcHJlZW1wdCBpcyBlbmFibGVkIG9yIG5vdC4KICAqLwotc3RhdGljIGlubGluZSBsb2ZmX3QgaV9zaXplX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbmxpbmUgbG9mZl90IGlfc2l6ZV9yZWFkKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgZGVmaW5lZChDT05GSUdfU01QKQogCWxvZmZfdCBpX3NpemU7CkBAIC02NTYsNyArNjQ2LDExIEBACiAjZW5kaWYKIH0KIAotCisvKgorICogTk9URTogdW5saWtlIGlfc2l6ZV9yZWFkKCksIGlfc2l6ZV93cml0ZSgpIGRvZXMgbmVlZCBsb2NraW5nIGFyb3VuZCBpdAorICogKG5vcm1hbGx5IGlfbXV0ZXgpLCBvdGhlcndpc2Ugb24gMzJiaXQvU01QIGFuIHVwZGF0ZSBvZiBpX3NpemVfc2VxY291bnQKKyAqIGNhbiBiZSBsb3N0LCByZXN1bHRpbmcgaW4gc3Vic2VxdWVudCBpX3NpemVfcmVhZCgpIGNhbGxzIHNwaW5uaW5nIGZvcmV2ZXIuCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpX3NpemVfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGlfc2l6ZSkKIHsKICNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCkBAIC02NzIsMTIgKzY2NiwxMiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW1pbm9yKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGltaW5vcihjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXJldHVybiBNSU5PUihpbm9kZS0+aV9yZGV2KTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbWFqb3Ioc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW1ham9yKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJcmV0dXJuIE1BSk9SKGlub2RlLT5pX3JkZXYpOwogfQpAQCAtNzE5LDggKzcxMyw5IEBACiAJCXN0cnVjdCBsaXN0X2hlYWQJZnVfbGlzdDsKIAkJc3RydWN0IHJjdV9oZWFkIAlmdV9yY3VoZWFkOwogCX0gZl91OwotCXN0cnVjdCBkZW50cnkJCSpmX2RlbnRyeTsKLQlzdHJ1Y3QgdmZzbW91bnQgICAgICAgICAqZl92ZnNtbnQ7CisJc3RydWN0IHBhdGgJCWZfcGF0aDsKKyNkZWZpbmUgZl9kZW50cnkJZl9wYXRoLmRlbnRyeQorI2RlZmluZSBmX3Zmc21udAlmX3BhdGgubW50CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkqZl9vcDsKIAlhdG9taWNfdAkJZl9jb3VudDsKIAl1bnNpZ25lZCBpbnQgCQlmX2ZsYWdzOwpAQCAtOTcwLDM2ICs5NjUsMTMgQEAKICNkZWZpbmUgdmZzX2NoZWNrX2Zyb3plbihzYiwgbGV2ZWwpIFwKIAl3YWl0X2V2ZW50KChzYiktPnNfd2FpdF91bmZyb3plbiwgKChzYiktPnNfZnJvemVuIDwgKGxldmVsKSkpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfZnNfZXhjbCh2b2lkKQotewotCWF0b21pY19pbmMoJmN1cnJlbnQtPmZzX2V4Y2wpOwotfQorI2RlZmluZSBnZXRfZnNfZXhjbCgpIGF0b21pY19pbmMoJmN1cnJlbnQtPmZzX2V4Y2wpCisjZGVmaW5lIHB1dF9mc19leGNsKCkgYXRvbWljX2RlYygmY3VycmVudC0+ZnNfZXhjbCkKKyNkZWZpbmUgaGFzX2ZzX2V4Y2woKSBhdG9taWNfcmVhZCgmY3VycmVudC0+ZnNfZXhjbCkKIAotc3RhdGljIGlubGluZSB2b2lkIHB1dF9mc19leGNsKHZvaWQpCi17Ci0JYXRvbWljX2RlYygmY3VycmVudC0+ZnNfZXhjbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGhhc19mc19leGNsKHZvaWQpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZjdXJyZW50LT5mc19leGNsKTsKLX0KLQotCi0vKgotICogU3VwZXJibG9jayBsb2NraW5nLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9ja19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKLXsKLQlnZXRfZnNfZXhjbCgpOwotCW11dGV4X2xvY2soJnNiLT5zX2xvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQotewotCXB1dF9mc19leGNsKCk7Ci0JbXV0ZXhfdW5sb2NrKCZzYi0+c19sb2NrKTsKLX0KKy8qIG5vdCBxdWl0ZSByZWFkeSB0byBiZSBkZXByZWNhdGVkLCBidXQuLi4gKi8KK2V4dGVybiB2b2lkIGxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHZvaWQgdW5sb2NrX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAogLyoKICAqIFZGUyBoZWxwZXIgZnVuY3Rpb25zLi4KQEAgLTEyNTUsNyArMTIyNyw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZmlsZV9hY2Nlc3NlZChzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT0FUSU1FKSkKLQkJdG91Y2hfYXRpbWUoZmlsZS0+Zl92ZnNtbnQsIGZpbGUtPmZfZGVudHJ5KTsKKwkJdG91Y2hfYXRpbWUoZmlsZS0+Zl9wYXRoLm1udCwgZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiB9CiAKIGludCBzeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKQEAgLTE0OTcsNyArMTQ2OSw5IEBACiBleHRlcm4gdm9pZCBfX2luaXQgdmZzX2NhY2hlc19pbml0X2Vhcmx5KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHZmc19jYWNoZXNfaW5pdCh1bnNpZ25lZCBsb25nKTsKIAotI2RlZmluZSBfX2dldG5hbWUoKQlrbWVtX2NhY2hlX2FsbG9jKG5hbWVzX2NhY2hlcCwgU0xBQl9LRVJORUwpCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKm5hbWVzX2NhY2hlcDsKKworI2RlZmluZSBfX2dldG5hbWUoKQlrbWVtX2NhY2hlX2FsbG9jKG5hbWVzX2NhY2hlcCwgR0ZQX0tFUk5FTCkKICNkZWZpbmUgX19wdXRuYW1lKG5hbWUpIGttZW1fY2FjaGVfZnJlZShuYW1lc19jYWNoZXAsICh2b2lkICopKG5hbWUpKQogI2lmbmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCiAjZGVmaW5lIHB1dG5hbWUobmFtZSkgICBfX3B1dG5hbWUobmFtZSkKQEAgLTE1MTMsNyArMTQ4Nyw2IEBACiBleHRlcm4gdm9pZCBiZF9mb3JnZXQoc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gdm9pZCBiZHB1dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOwogZXh0ZXJuIHN0cnVjdCBibG9ja19kZXZpY2UgKm9wZW5fYnlfZGV2bnVtKGRldl90LCB1bnNpZ25lZCk7Ci1leHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqb3Blbl9wYXJ0aXRpb25fYnlfZGV2bnVtKGRldl90LCB1bnNpZ25lZCk7CiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBkZWZfYmxrX2FvcHM7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGJkX2ZvcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7fQpAQCAtMTUzMSw3ICsxNTA0LDYgQEAKIGV4dGVybiBsb25nIGNvbXBhdF9ibGtkZXZfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBibGtkZXZfZ2V0KHN0cnVjdCBibG9ja19kZXZpY2UgKiwgbW9kZV90LCB1bnNpZ25lZCk7CiBleHRlcm4gaW50IGJsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqKTsKLWV4dGVybiBpbnQgYmxrZGV2X3B1dF9wYXJ0aXRpb24oc3RydWN0IGJsb2NrX2RldmljZSAqKTsKIGV4dGVybiBpbnQgYmRfY2xhaW0oc3RydWN0IGJsb2NrX2RldmljZSAqLCB2b2lkICopOwogZXh0ZXJuIHZvaWQgYmRfcmVsZWFzZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOwogI2lmZGVmIENPTkZJR19TWVNGUwpAQCAtMTY0Niw3ICsxNjE4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhbGxvd193cml0ZV9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJaWYgKGZpbGUpCi0JCWF0b21pY19pbmMoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3dyaXRlY291bnQpOworCQlhdG9taWNfaW5jKCZmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3dyaXRlY291bnQpOwogfQogZXh0ZXJuIGludCBkb19waXBlKGludCAqKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqY3JlYXRlX3JlYWRfcGlwZShzdHJ1Y3QgZmlsZSAqZik7CkBAIC0xNzA1LDYgKzE2NzcsOCBAQAogZXh0ZXJuIHZvaWQgY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGlub2RlICpuZXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIGludCBfX3JlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK2V4dGVybiBpbnQgc2hvdWxkX3JlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gaW50IHJlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIHN0cnVjdCBsaXN0X2hlYWQgKik7CiAKQEAgLTE3NTEsNiArMTcyNSw4IEBACiAJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosCiAJCXN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CitleHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlX25vbG9jayhzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosCisJCXN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gc3NpemVfdCBnZW5lcmljX3NwbGljZV9zZW5kcGFnZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAogCQlzdHJ1Y3QgZmlsZSAqb3V0LCBsb2ZmX3QgKiwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKIGV4dGVybiBsb25nIGRvX3NwbGljZV9kaXJlY3Qoc3RydWN0IGZpbGUgKmluLCBsb2ZmX3QgKnBwb3MsIHN0cnVjdCBmaWxlICpvdXQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzX3N0YWNrLmggYi9pbmNsdWRlL2xpbnV4L2ZzX3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1MTZjZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZnNfc3RhY2suaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIF9MSU5VWF9GU19TVEFDS19ICisjZGVmaW5lIF9MSU5VWF9GU19TVEFDS19ICisKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIGdlbmVyaWMgZnVuY3Rpb25zIHVzZWQgcHJpbWFyaWx5IGJ5IHN0YWNrYWJsZQorICogZmlsZXN5c3RlbXM7IG5vbmUgb2YgdGhlc2UgZnVuY3Rpb25zIHJlcXVpcmUgaV9tdXRleCB0byBiZSBoZWxkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisvKiBleHRlcm5zIGZvciBmcy9zdGFjay5jICovCitleHRlcm4gdm9pZCBmc3N0YWNrX2NvcHlfYXR0cl9hbGwoc3RydWN0IGlub2RlICpkZXN0LCBjb25zdCBzdHJ1Y3QgaW5vZGUgKnNyYywKKwkJCQlpbnQgKCpnZXRfbmxpbmtzKShzdHJ1Y3QgaW5vZGUgKikpOworCitleHRlcm4gdm9pZCBmc3N0YWNrX2NvcHlfaW5vZGVfc2l6ZShzdHJ1Y3QgaW5vZGUgKmRzdCwgY29uc3Qgc3RydWN0IGlub2RlICpzcmMpOworCisvKiBpbmxpbmVzICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNzdGFja19jb3B5X2F0dHJfYXRpbWUoc3RydWN0IGlub2RlICpkZXN0LAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW5vZGUgKnNyYykKK3sKKwlkZXN0LT5pX2F0aW1lID0gc3JjLT5pX2F0aW1lOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnNzdGFja19jb3B5X2F0dHJfdGltZXMoc3RydWN0IGlub2RlICpkZXN0LAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW5vZGUgKnNyYykKK3sKKwlkZXN0LT5pX2F0aW1lID0gc3JjLT5pX2F0aW1lOworCWRlc3QtPmlfbXRpbWUgPSBzcmMtPmlfbXRpbWU7CisJZGVzdC0+aV9jdGltZSA9IHNyYy0+aV9jdGltZTsKK30KKworI2VuZGlmIC8qIF9MSU5VWF9GU19TVEFDS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oIGIvaW5jbHVkZS9saW51eC9mc19zdHJ1Y3QuaAppbmRleCBjNjIzZDEyLi4xMWEzNmNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzX3N0cnVjdC5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNfc3RydWN0LmgKQEAgLTE4LDYgKzE4LDggQEAKIAkudW1hc2sJCT0gMDAyMiwgXAogfQogCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmZzX2NhY2hlcDsKKwogZXh0ZXJuIHZvaWQgZXhpdF9mcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBzZXRfZnNfYWx0cm9vdCh2b2lkKTsKIGV4dGVybiB2b2lkIHNldF9mc19yb290KHN0cnVjdCBmc19zdHJ1Y3QgKiwgc3RydWN0IHZmc21vdW50ICosIHN0cnVjdCBkZW50cnkgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmggYi9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKaW5kZXggM2RhMjllMi4uYWJiNjRjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBfRlNMX0RFVklDRV9IXwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KIAogLyoKICAqIFNvbWUgY29udmVudGlvbnMgb24gaG93IHdlIGhhbmRsZSBwZXJpcGhlcmFscyBvbiBGcmVlc2NhbGUgY2hpcHMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNub3RpZnkuaCBiL2luY2x1ZGUvbGludXgvZnNub3RpZnkuaAppbmRleCBkNGYyMTlmLi5kZmM0ZTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmgKKysrIGIvaW5jbHVkZS9saW51eC9mc25vdGlmeS5oCkBAIC0xNjQsNyArMTY0LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKIAltb2RlX3QgbW9kZSA9IGZpbGUtPmZfbW9kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaCBiL2luY2x1ZGUvbGludXgvZnRhcGUtaGVhZGVyLXNlZ21lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMjIxOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0YXBlLWhlYWRlci1zZWdtZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfSEVBREVSX1NFR01FTlRfSAotI2RlZmluZSBfRlRBUEVfSEVBREVSX1NFR01FTlRfSAotCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9pbmNsdWRlL2xpbnV4L2Z0YXBlLWhlYWRlci1zZWdtZW50LmgsdiAkCi0gKiAkUmV2aXNpb246IDEuMiAkCi0gKiAkRGF0ZTogMTk5Ny8xMC8wNSAxOToxOToyOCAkCi0gKgotICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBzb21lIG9mZnNldHMgaW50byB0aGUgaGVhZGVyIHNlZ21lbnQgb2YgYQotICogICAgICBmbG9wcHkgdGFwZSBjYXJ0cmlkZ2UuICBGb3IgdXNlIHdpdGggdGhlIFFJQy00MC84MC8zMDEwLzMwMjAKLSAqICAgICAgZmxvcHB5LXRhcGUgZHJpdmVyICJmdGFwZSIgZm9yIExpbnV4LgotICovCi0KLSNkZWZpbmUgRlRfU0lHTkFUVVJFICAgMCAgLyogbXVzdCBiZSAweGFhNTVhYTU1ICovCi0jZGVmaW5lIEZUX0ZNVF9DT0RFICAgIDQKLSNkZWZpbmUgRlRfUkVWX0xFVkVMICAgNSAgLyogb25seSBmb3IgUUlDLTgwIHNpbmNlLiBSZXYuIEwgKD09IDB4MGMpICAgICAgICAgKi8KLSNkZWZpbmUgRlRfSFNFR18xICAgICAgNiAgLyogZmlyc3QgaGVhZGVyIHNlZ21lbnQsIGV4Y2VwdCBmb3IgZm9ybWF0IGNvZGUgIDYgKi8KLSNkZWZpbmUgRlRfSFNFR18yICAgICAgOCAgLyogc2Vjb25kIGhlYWRlciBzZWdtZW50LCBleGNlcHQgZm9yIGZvcm1hdCBjb2RlIDYgKi8KLSNkZWZpbmUgRlRfRlJTVF9TRUcgICAxMCAgLyogZmlyc3QgZGF0YSBzZWdtZW50LCBleGNlcHQgZm9yIGZvcm1hdCBjb2RlIDYgICAgKi8KLSNkZWZpbmUgRlRfTEFTVF9TRUcgICAxMiAgLyogbGFzdCBkYXRhIHNlZ21lbnQsIGV4Y2VwdCBmb3IgZm9ybWF0IGNvZGUgNiAgICAgKi8KLSNkZWZpbmUgRlRfRk1UX0RBVEUgICAxNCAgLyogZGF0ZSBhbmQgdGltZSBvZiBtb3N0IHJlY2VudCBmb3JtYXQsIHNlZSBiZWxvdyAgKi8KLSNkZWZpbmUgRlRfV1JfREFURSAgICAxOCAgLyogZGF0ZSBhbmQgdGltZSBvZiBtb3N0IHJlY2VudCB3cml0ZSBvciBmb3JtYXQgICAgKi8KLSNkZWZpbmUgRlRfU1BUICAgICAgICAyNCAgLyogc2VnbWVudHMgcGVyIHRyYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfVFBDICAgICAgICAyNiAgLyogdHJhY2tzIHBlciBjYXJ0cmlkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfRkhNICAgICAgICAyNyAgLyogZmxvcHB5IGRyaXZlIGhlYWQgKG1heGltdW0gb2YgaXQpICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfRlRNICAgICAgICAyOCAgLyogZmxvcHB5IHRyYWNrIG1heC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfRlNNICAgICAgICAyOSAgLyogZmxvcHB5IHNlY3RvciBtYXguICgxMjgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfTEFCRUwgICAgICAzMCAgLyogZmxvcHB5IHRhcGUgbGFiZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfTEFCRUxfREFURSA3NCAgLyogZGF0ZSBhbmQgdGltZSB0aGUgdGFwZSBsYWJlbCB3YXMgd3JpdHRlbiAgICAgICAgKi8KLSNkZWZpbmUgRlRfTEFCRUxfU1ogICAoRlRfTEFCRUxfREFURSAtIEZUX0xBQkVMKQotI2RlZmluZSBGVF9DTUFQX1NUQVJUIDc4ICAvKiBzdGFydGluZyBzZWdtZW50IG9mIGNvbXByZXNzaW9uIG1hcCAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9GTVRfRVJST1IgMTI4ICAvKiBtdXN0IGJlIHNldCB0byAweGZmIGlmIHJlbWFpbmRlciBnZXRzIGxvc3QgZHVyaW5nCi0JCQkgICAqIHRhcGUgZm9ybWF0Ci0JCQkgICAqLwotI2RlZmluZSBGVF9TRUdfQ05UICAgMTMwICAvKiBudW1iZXIgb2Ygc2VnLiB3cml0dGVuLCBmb3JtYXR0ZWQgb3IgdmVyaWZpZWQKLQkJCSAgICogdGhyb3VnaCBsaWZldGltZSBvZiB0YXBlICh3aHkgbm90IHJlYWQ/KQotCQkJICAgKi8KLSNkZWZpbmUgRlRfSU5JVF9EQVRFIDEzOCAgLyogZGF0ZSBhbmQgdGltZSBvZiBpbml0aWFsIHRhcGUgZm9ybWF0ICAgICovCi0jZGVmaW5lIEZUX0ZNVF9DTlQgICAxNDIgIC8qIG51bWJlciBvZiB0aW1lcyB0YXBlIGhhcyBiZWVuIGZvcm1hdHRlZCAqLwotI2RlZmluZSBGVF9GU0xfQ05UICAgMTQ0ICAvKiBudW1iZXIgb2Ygc2VnbWVudHMgaW4gZmFpbGVkIHNlY3RvciBsb2cgKi8KLSNkZWZpbmUgRlRfTUtfQ09ERSAgIDE0NiAgLyogaWQgc3RyaW5nIG9mIHRhcGUgbWFudWZhY3R1cmVyICAgICAgICAgICovCi0jZGVmaW5lIEZUX0xPVF9DT0RFICAxOTAgIC8qIHRhcGUgbWFudWZhY3R1cmVyIGxvdCBjb2RlICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF82X0hTRUdfMSAgMjM0ICAvKiBmaXJzdCBoZWFkZXIgc2VnbWVudCBmb3IgZm9ybWF0IGNvZGUgIDYgKi8KLSNkZWZpbmUgRlRfNl9IU0VHXzIgIDIzOCAgLyogc2Vjb25kIGhlYWRlciBzZWdtZW50IGZvciBmb3JtYXQgY29kZSA2ICovCi0jZGVmaW5lIEZUXzZfRlJTVF9TRUcgMjQyIC8qIGZpcnN0IGRhdGEgc2VnbWVudCBmb3IgZm9ybWF0IGNvZGUgNiAgICAqLwotI2RlZmluZSBGVF82X0xBU1RfU0VHIDI0NiAvKiBsYXN0IGRhdGEgc2VnbWVudCBmb3IgZm9ybWF0IGNvZGUgNiAgICAgKi8KLQotI2RlZmluZSBGVF9GU0wgICAgICAgIDI1NgotI2RlZmluZSBGVF9IRUFERVJfRU5EIDI1NiAvKiBzcGFjZSBiZXlvbmQgdGhpcyBwb2ludDoKLQkJCSAgICogZm9ybWF0IGNvZGVzIDIsIDMgYW5kIDU6IAotCQkJICAgKiAtICBmYWlsZWQgc2VjdG9yIGxvZyB1bnRpbCBieXRlIDIwNDcKLQkJCSAgICogLSAgYmFkIHNlY3RvciBtYXAgaW4gdGhlIHJlYW1pbmluZyBwYXJ0IG9mIHNlZ21lbnQKLQkJCSAgICogZm9ybWF0IGNvZGVzIDQgYW5kIDY6Ci0JCQkgICAqIC0gIGJhZCBzZWN0b3IgbWFwICBzdGFydHMgaGVhcgotCQkJICAgKi8KLQotCi0vKiAgdmFsdWUgdG8gYmUgc3RvcmVkIGF0IHRoZSBGVF9TSUdOQVRVUkUgb2Zmc2V0IAotICovCi0jZGVmaW5lIEZUX0hTRUdfTUFHSUMgMHhhYTU1YWE1NQotI2RlZmluZSBGVF9EMkdfTUFHSUMgIDB4ODIyODgyMjggLyogRGl0dG8gMkdCICovCi0KLS8qIGRhdGEgYW5kIHRpbWUgZW5jb2Rpbmc6ICovCi0jZGVmaW5lIEZUX1lFQVJfU0hJRlQgMjUKLSNkZWZpbmUgRlRfWUVBUl9NQVNLICAweGZlMDAwMDAwCi0jZGVmaW5lIEZUX1lFQVJfMCAgICAgMTk3MAotI2RlZmluZSBGVF9ZRUFSX01BWCAgIDEyNwotI2RlZmluZSBGVF9ZRUFSKHllYXIpICgoKCh5ZWFyKS1GVF9ZRUFSXzApPDxGVF9ZRUFSX1NISUZUKSZGVF9ZRUFSX01BU0spCi0KLSNkZWZpbmUgRlRfVElNRV9TSElGVCAgIDAKLSNkZWZpbmUgRlRfVElNRV9NQVNLICAgIDB4MDFGRkZGRkYKLSNkZWZpbmUgRlRfVElNRV9NQVggICAgIDB4MDFlYTZkZmYgLyogbGFzdCBzZWNvbmQgb2YgYSB5ZWFyICovCi0jZGVmaW5lIEZUX1RJTUUobW8sZCxoLG0scykgXAotCSgoKChzKSs2MCooKG0pKzYwKigoaCkrMjQqKChkKSszMSoobW8pKSkpKSAmIEZUX1RJTUVfTUFTSykpCi0KLSNkZWZpbmUgRlRfVElNRV9TVEFNUCh5LG1vLGQsaCxtLHMpIChGVF9ZRUFSKHkpIHwgRlRfVElNRShtbyxkLGgsbSxzKSkKLQotLyogdmFsdWVzIGZvciB0aGUgZm9ybWF0IGNvZGUgZmllbGQgKi8KLXR5cGVkZWYgZW51bSB7Ci0JZm10X25vcm1hbCA9IDIsIC8qICBRSUMtODAgcG9zdCBSZXYuIEIgMjA1RnQgb3IgMzA3RnQgdGFwZSAgICAqLwotCWZtdF8xMTAwZnQgPSAzLCAvKiAgUUlDLTgwIHBvc3QgUmV2LiBCIDExMDBGdCB0YXBlICAgICAgICAgICAgKi8KLQlmbXRfdmFyICAgID0gNCwgLyogIFFJQy04MCBwb3N0IFJldi4gQiB2YXJpYWJlbCBsZW5ndGggZm9ybWF0ICovCi0JZm10XzQyNWZ0ICA9IDUsIC8qICBRSUMtODAgcG9zdCBSZXYuIEIgNDI1RnQgdGFwZSAgICAgICAgICAgICAqLwotCWZtdF9iaWcgICAgPSA2ICAvKiAgUUlDLTMwMTAvMzAyMCB2YXJpYWJsZSBsZW5ndGggdGFwZSB3aXRoIG1vcmUgCi0JCQkgKiAgdGhhbiAyXjE2IHNlZ21lbnRzIHBlciB0YXBlCi0JCQkgKi8KLX0gZnRfZm9ybWF0X3R5cGU7Ci0KLS8qIGRlZmluaXRpb25zIGZvciB0aGUgZmFpbGVkIHNlY3RvciBsb2cgKi8KLSNkZWZpbmUgRlRfRlNMX1NJWkUgICAgICAgICgyICogRlRfU0VDVE9SX1NJWkUgLSBGVF9IRUFERVJfRU5EKQotI2RlZmluZSBGVF9GU0xfTUFYX0VOVFJJRVMgKEZUX0ZTTF9TSVpFL3NpemVvZihfX3UzMikpCi0KLXR5cGVkZWYgc3RydWN0IGZ0X2ZzbF9lbnRyeSB7Ci0JX191MTYgc2VnbWVudDsKLQlfX3UxNiBkYXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZnRfZnNsX2VudHJ5OwotCi0KLS8qICBkYXRlIGVuY29kaW5nIGZvciB0aGUgZmFpbGVkIHNlY3RvciBsb2cgCi0gKiAgbW9udGg6IDEuLjEyLCBkYXk6IDEuLjMxLCB5ZWFyOiAxOTcwLi4yMDk3Ci0gKi8KLSNkZWZpbmUgRlRfRlNMX1RJTUVfU1RBTVAoeSxtLGQpIFwKLQkoKCgoKHkpIC0gRlRfWUVBUl8wKTw8OSkmMHhmZTAwKSB8ICgoKG0pPDw1KSYweDAxZTApIHwgKChkKSYweDAwMWYpKQotCi0jZW5kaWYgLyogX0ZUQVBFX0hFQURFUl9TRUdNRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRhcGUtdmVuZG9ycy5oIGIvaW5jbHVkZS9saW51eC9mdGFwZS12ZW5kb3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMWE4MWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9mdGFwZS12ZW5kb3JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotI2lmbmRlZiBfRlRBUEVfVkVORE9SU19ICi0jZGVmaW5lIF9GVEFQRV9WRU5ET1JTX0gKLQotLyoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkzLTE5OTYgQmFzIExhYXJob3ZlbiwKLSAqICAgICAgICAgICAgICAgIChDKSAxOTk2LTE5OTcgQ2xhdXMtSnVzdHVzIEhlaW5lLgotCi0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotICoKLSAqICRTb3VyY2U6IC9ob21lcy9jdnMvZnRhcGUtc3RhY2tlZC9pbmNsdWRlL2xpbnV4L2Z0YXBlLXZlbmRvcnMuaCx2ICQKLSAqICRSZXZpc2lvbjogMS42ICQKLSAqICREYXRlOiAxOTk3LzEwLzA5IDE1OjM4OjExICQKLSAqCi0gKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3VwcG9ydGVkIGRyaXZlIHR5cGVzIHdpdGggdGhlaXIKLSAqICAgICAgUUlDLTExNyBzcGVjLiB2ZW5kb3IgY29kZSBhbmQgZHJpdmUgZGVwZW5kZW50IGNvbmZpZ3VyYXRpb24KLSAqICAgICAgaW5mb3JtYXRpb24uCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQl1bmtub3duX3dha2VfdXAgPSAwLAotCW5vX3dha2VfdXAsCi0Jd2FrZV91cF9jb2xvcmFkbywKLQl3YWtlX3VwX21vdW50YWluLAotCXdha2VfdXBfaW5zaWdodCwKLX0gd2FrZV91cF90eXBlczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXdha2VfdXBfdHlwZXMgd2FrZV91cDsJLyogc2VlIHdha2VfdXBfdHlwZXMgKi8KLQljaGFyICpuYW1lOwkJLyogVGV4dCBkZXNjcmliaW5nIHRoZSBkcml2ZSAqLwotfSB3YWtldXBfbWV0aG9kOwotCi0vKiAgTm90ZTogb3JkZXIgb2YgZW50cmllcyBpbiBXQUtFVVBfTUVUSE9EUyBtdXN0IGJlIHNvIHRoYXQgYSB2YXJpYWJsZQotICogICAgICAgIG9mIHR5cGUgd2FrZV91cF90eXBlcyBjYW4gYmUgdXNlZCBhcyBhbiBpbmRleCBpbiB0aGUgYXJyYXkuCi0gKi8KLSNkZWZpbmUgV0FLRVVQX01FVEhPRFMgeyBcCi0gIHsgdW5rbm93bl93YWtlX3VwLCAgICAiVW5rbm93biIgfSwgXAotICB7IG5vX3dha2VfdXAsICAgICAgICAgIk5vbmUiIH0sIFwKLSAgeyB3YWtlX3VwX2NvbG9yYWRvLCAgICJDb2xvcmFkbyIgfSwgXAotICB7IHdha2VfdXBfbW91bnRhaW4sICAgIk1vdW50YWluIiB9LCBcCi0gIHsgd2FrZV91cF9pbnNpZ2h0LCAgICAiTW90b3Itb24iIH0sIFwKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludCB2ZW5kb3JfaWQ7CS8qIHZlbmRvciBpZCBmcm9tIGRyaXZlICovCi0JaW50IHNwZWVkOwkJLyogbWF4aW11bSB0YXBlIHRyYW5zcG9ydCBzcGVlZCAoaXBzKSAqLwotCXdha2VfdXBfdHlwZXMgd2FrZV91cDsJLyogc2VlIHdha2VfdXBfdHlwZXMgKi8KLQljaGFyICpuYW1lOwkJLyogVGV4dCBkZXNjcmliaW5nIHRoZSBkcml2ZSAqLwotfSB2ZW5kb3Jfc3RydWN0OwotCi0jZGVmaW5lIFVOS05PV05fVkVORE9SICgtMSkKLQotI2RlZmluZSBRSUMxMTdfVkVORE9SUyB7CQkJCQkJICAgIFwKLS8qIHNlZSBfdmVuZG9yX3N0cnVjdCAqLwkJCQkJCSAgICBcCi0gIHsgMHgwMDAwMCwgIDgyLCB3YWtlX3VwX2NvbG9yYWRvLCAgIkNvbG9yYWRvIERKLTEwIChvbGQpIiB9LAkJICAgIFwKLSAgeyAweDAwMDQ3LCAgOTAsIHdha2VfdXBfY29sb3JhZG8sICAiQ29sb3JhZG8gREotMTAvREotMjAiIH0sCQkgICAgXAotICB7IDB4MDExYzIsICA4NCwgd2FrZV91cF9jb2xvcmFkbywgICJDb2xvcmFkbyA3MDAiIH0sCQkJICAgIFwKLSAgeyAweDAxMWMzLCAgOTAsIHdha2VfdXBfY29sb3JhZG8sICAiQ29sb3JhZG8gMTQwMCIgfSwJCQkgICAgXAotICB7IDB4MDExYzQsICA4NCwgd2FrZV91cF9jb2xvcmFkbywgICJDb2xvcmFkbyBESi0xMC9ESi0yMCAobmV3KSIgfSwJICAgIFwKLSAgeyAweDAxMWM1LCAgODQsIHdha2VfdXBfY29sb3JhZG8sICAiSFAgQ29sb3JhZG8gVDEwMDAiIH0sCQkgICAgXAotICB7IDB4MDExYzYsICA5MCwgd2FrZV91cF9jb2xvcmFkbywgICJIUCBDb2xvcmFkbyBUMzAwMCIgfSwJCSAgICBcCi0gIHsgMHgwMDAwNSwgIDQ1LCB3YWtlX3VwX21vdW50YWluLCAgIkFyY2hpdmUgNTU4MGkiIH0sCQkJICAgIFwKLSAgeyAweDEwMDA1LCAgNTAsIHdha2VfdXBfaW5zaWdodCwgICAiSW5zaWdodCA4ME1iLCBJcndpbiA4MFNYIiB9LAkgICAgXAotICB7IDB4MDAxNDAsICA3NCwgd2FrZV91cF9tb3VudGFpbiwgICJBcmNoaXZlIFMuSG9ybmV0IFtJZGVudGl0eS9Fc2NvbV0iIH0sIFwKLSAgeyAweDAwMTQ2LCAgNzIsIHdha2VfdXBfbW91bnRhaW4sICAiQXJjaGl2ZSAzMTI1MFEgW0VzY29tXSIgfSwJICAgIFwKLSAgeyAweDAwMTRhLCAxMDAsIHdha2VfdXBfbW91bnRhaW4sICAiQXJjaGl2ZSBYTDkyNTBpIFtDb25uZXIvRXNjb21dIiB9LCAgICBcCi0gIHsgMHgwMDE0YywgIDk4LCB3YWtlX3VwX21vdW50YWluLCAgIkNvbm5lciBDMjUwTVFUIiB9LAkJICAgIFwKLSAgeyAweDAwMTRlLCAgODAsIHdha2VfdXBfbW91bnRhaW4sICAiQ29ubmVyIEMyNTBNUSIgfSwJCQkgICAgXAotICB7IDB4MDAxNTAsICA4MCwgd2FrZV91cF9tb3VudGFpbiwgICJDb25uZXIgVFNNNDIwUi9UU1Q4MDBSIiB9LAkgICAgXAotICB7IDB4MDAxNTIsICA4MCwgd2FrZV91cF9tb3VudGFpbiwgICJDb25uZXIgVFNNODUwUiIgfSwJCSAgICBcCi0gIHsgMHgwMDE1NiwgIDgwLCB3YWtlX3VwX21vdW50YWluLCAgIkNvbm5lciBUU004NTBSLzE3MDBSL1RTVDMyMDBSIiB9LAkgICAgXAotICB7IDB4MDAxODAsICAgMCwgd2FrZV91cF9tb3VudGFpbiwgICJTdW1taXQgU0UgMTUwIiB9LAkJCSAgICBcCi0gIHsgMHgwMDE4MSwgIDg1LCB3YWtlX3VwX21vdW50YWluLCAgIlN1bW1pdCBTRSAyNTAsIE1vdW50YWluIEZTODAwMCIgfSwgICAgXAotICB7IDB4MDAxYzEsICA4Miwgbm9fd2FrZV91cCwgICAgICAgICJXYW5ndGVrIDMwNDBGIiB9LAkJCSAgICBcCi0gIHsgMHgwMDFjOCwgIDY0LCBub193YWtlX3VwLCAgICAgICAgIldhbmd0ZWsgMzA4MEYiIH0sCQkJICAgIFwKLSAgeyAweDAwMWM4LCAgNjQsIHdha2VfdXBfY29sb3JhZG8sICAiV2FuZ3RlayAzMDgwRiIgfSwJCQkgICAgXAotICB7IDB4MDAxY2EsICA2Nywgbm9fd2FrZV91cCwgICAgICAgICJXYW5ndGVrIDMwODBGIChuZXcpIiB9LAkJICAgIFwKLSAgeyAweDAwMWNjLCAgNzcsIHdha2VfdXBfY29sb3JhZG8sICAiV2FuZ3RlayAzMjAwIC8gVGVhYyA3MDAiIH0sCSAgICBcCi0gIHsgMHgwMDFjZCwgIDc1LCB3YWtlX3VwX2NvbG9yYWRvLCAgIlJldmVhbCBUQjE0MDAiIH0sCQkJICAgIFwKLSAgeyAweDAwMzgwLCAgODUsIHdha2VfdXBfY29sb3JhZG8sICAiRXhhYnl0ZSBFYWdsZS05NiIgfSwJCSAgICBcCi0gIHsgMHgwMDM4MSwgIDg1LCB3YWtlX3VwX2NvbG9yYWRvLCAgIkV4YWJ5dGUgRWFnbGUgVFItMyIgfSwJCSAgICBcCi0gIHsgMHgwMDM4MiwgIDg1LCB3YWtlX3VwX2NvbG9yYWRvLCAgIkV4YWJ5dGUgRWFnbGUgVFItMyIgfSwJCSAgICBcCi0gIHsgMHgwMDNjZSwgIDc3LCB3YWtlX3VwX2NvbG9yYWRvLCAgIlRlYWMgODAwIiB9LAkJCSAgICBcCi0gIHsgMHgwMDNjZiwgICAwLCB3YWtlX3VwX2NvbG9yYWRvLCAgIlRlYWMgRlQzMDEwVFIiIH0sCQkJICAgIFwKLSAgeyAweDA4ODgwLCAgNjQsIG5vX3dha2VfdXAsICAgICAgICAiSW9tZWdhIDI1MCwgRGl0dG8gODAwIiB9LAkJICAgIFwKLSAgeyAweDA4ODgwLCAgNjQsIHdha2VfdXBfY29sb3JhZG8sICAiSW9tZWdhIDI1MCwgRGl0dG8gODAwIiB9LAkJICAgIFwKLSAgeyAweDA4ODgwLCAgNjQsIHdha2VfdXBfaW5zaWdodCwgICAiSW9tZWdhIDI1MCwgRGl0dG8gODAwIiB9LAkJICAgIFwKLSAgeyAweDA4ODgxLCAgODAsIHdha2VfdXBfY29sb3JhZG8sICAiSW9tZWdhIDcwMCIgfSwJCQkgICAgXAotICB7IDB4MDg4ODIsICA4MCwgd2FrZV91cF9jb2xvcmFkbywgICJJb21lZ2EgMzIwMCIgfSwJCQkgICAgXAotICB7IDB4MDg4ODMsICA4MCwgd2FrZV91cF9jb2xvcmFkbywgICJJb21lZ2EgRElUVE8gMkdCIiB9LAkJICAgIFwKLSAgeyAweDAwMDIxLCAgNzAsIG5vX3dha2VfdXAsICAgICAgICAiQUlXQSBDVC04MDMiIH0sCQkJICAgIFwKLSAgeyAweDAwNGMwLCAgODAsIG5vX3dha2VfdXAsICAgICAgICAiQUlXQSBURC1TMTYwMCIgfSwJCQkgICAgXAotICB7IDB4MDAwMjEsICAgMCwgd2FrZV91cF9tb3VudGFpbiwgICJDT1JFdGFwZSBRSUM4MCIgfSwJCSAgICBcCi0gIHsgMHgwMDQ0MSwgICAwLCB3YWtlX3VwX21vdW50YWluLCAgIkNvbUJ5dGUgRG91YmxlUGxheSIgfSwJCSAgICBcCi0gIHsgMHgwMDQ4MSwgMTI3LCB3YWtlX3VwX21vdW50YWluLCAgIlBFUlRFQyBNeVRhcGUgODAwIiB9LAkJICAgIFwKLSAgeyAweDAwNDgzLCAxMzAsIHdha2VfdXBfbW91bnRhaW4sICAiUEVSVEVDIE15VGFwZSAzMjAwIiB9LAkJICAgIFwKLSAgeyBVTktOT1dOX1ZFTkRPUiwgMCwgbm9fd2FrZV91cCwgInVua25vd24iIH0JCQkJICAgIFwKLX0KLQotI2RlZmluZSBRSUMxMTdfTUFLRV9DT0RFUyB7CQkJXAotICB7IDAsICJVbmFzc2lnbmVkIiB9LAkJCQlcCi0gIHsgMSwgIkFsbG95IENvbXB1dGVyIFByb2R1Y3RzIiB9LAkJXAotICB7IDIsICIzTSIgfSwJCQkJCVwKLSAgeyAzLCAiVGFuZGJlcmcgRGF0YSIgfSwJCQlcCi0gIHsgNCwgIkNvbG9yYWRvIiB9LAkJCQlcCi0gIHsgNSwgIkFyY2hpdmUvQ29ubmVyIiB9LAkJCVwKLSAgeyA2LCAiTW91bnRhaW4vU3VtbWl0IE1lbW9yeSBTeXN0ZW1zIiB9LAlcCi0gIHsgNywgIldhbmd0ZWsvUmV4b24vVGVjbWFyIiB9LAkJXAotICB7IDgsICJTb255IiB9LAkJCQlcCi0gIHsgOSwgIkNpcGhlciBEYXRhIFByb2R1Y3RzIiB9LAkJXAotICB7IDEwLCAiSXJ3aW4gTWFnbmV0aWMgU3lzdGVtcyIgfSwJCVwKLSAgeyAxMSwgIkJyYWVtYXIiIH0sCQkJCVwKLSAgeyAxMiwgIlZlcmJhdGltIiB9LAkJCQlcCi0gIHsgMTMsICJDb3JlIEludGVybmF0aW9uYWwiIH0sCQkJXAotICB7IDE0LCAiRXhhYnl0ZSIgfSwJCQkJXAotICB7IDE1LCAiVGVhYyIgfSwJCQkJXAotICB7IDE2LCAiR2lnYXRlayIgfSwJCQkJXAotICB7IDE3LCAiQ29tQnl0ZSIgfSwJCQkJXAotICB7IDE4LCAiUEVSVEVDIE1lbW9yaWVzIiB9LAkJCVwKLSAgeyAxOSwgIkFpd2EiIH0sCQkJCVwKLSAgeyA3MSwgIkNvbG9yYWRvIiB9LAkJCQlcCi0gIHsgNTQ2LCAiSW9tZWdhIEluYyIgfSwJCQlcCi19Ci0KLSNlbmRpZiAvKiBfRlRBUEVfVkVORE9SU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z0YXBlLmggYi9pbmNsdWRlL2xpbnV4L2Z0YXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzAzOGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9mdGFwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLSNpZm5kZWYgX0ZUQVBFX0gKLSNkZWZpbmUgX0ZUQVBFX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2IEJhcyBMYWFyaG92ZW4sCi0gKiAgICAgICAgICAgKEMpIDE5OTYtMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2luY2x1ZGUvbGludXgvZnRhcGUuaCx2ICQKLSAqICRSZXZpc2lvbjogMS4xNy42LjQgJAotICogJERhdGU6IDE5OTcvMTEvMjUgMDE6NTI6NTQgJAotICoKLSAqICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGdsb2JhbCBkZWZpbml0aW9ucywgdHlwZWRlZnMgYW5kIG1hY3JvJ3MKLSAqICAgICAgZm9yIHRoZSBRSUMtNDAvODAvMzAxMC8zMDIwIGZsb3BweS10YXBlIGRyaXZlciBmb3IgTGludXguCi0gKi8KLQotI2RlZmluZSBGVEFQRV9WRVJTSU9OICJmdGFwZSB2My4wNGQgMjUvMTEvOTciCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRpby5oPgotCi0jZGVmaW5lIEZUX1NFQ1RPUih4KQkJKHgrMSkJLyogc2VjdG9yIG9mZnNldCBpbnRvIHJlYWwgc2VjdG9yICovCi0jZGVmaW5lIEZUX1NFQ1RPUl9TSVpFCQkxMDI0Ci0jZGVmaW5lIEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQJICAzMgotI2RlZmluZSBGVF9FQ0NfU0VDVE9SUwkJICAgMwotI2RlZmluZSBGVF9TRUdNRU5UX1NJWkUJCSgoRlRfU0VDVE9SU19QRVJfU0VHTUVOVCAtIEZUX0VDQ19TRUNUT1JTKSAqIEZUX1NFQ1RPUl9TSVpFKQotI2RlZmluZSBGVF9CVUZGX1NJWkUgICAgKEZUX1NFQ1RPUlNfUEVSX1NFR01FTlQgKiBGVF9TRUNUT1JfU0laRSkKLQotLyoKLSAqICAgYml0cyBvZiB0aGUgbWlub3IgZGV2aWNlIG51bWJlciB0aGF0IGRlZmluZSBkcml2ZSBzZWxlY3Rpb24KLSAqICAgbWV0aG9kcy4gQ291bGQgYmUgdXNlZCBvbmUgZGF5IHRvIGFjY2VzcyBtdWx0aXBsZSB0YXBlCi0gKiAgIGRyaXZlcyBvbiB0aGUgc2FtZSBjb250cm9sbGVyLgotICovCi0jZGVmaW5lIEZUQVBFX1NFTF9BICAgICAwCi0jZGVmaW5lIEZUQVBFX1NFTF9CICAgICAxCi0jZGVmaW5lIEZUQVBFX1NFTF9DICAgICAyCi0jZGVmaW5lIEZUQVBFX1NFTF9EICAgICAzCi0jZGVmaW5lIEZUQVBFX1NFTF9NQVNLICAgICAzCi0jZGVmaW5lIEZUQVBFX1NFTCh1bml0KSAoKHVuaXQpICYgRlRBUEVfU0VMX01BU0spCi0jZGVmaW5lIEZUQVBFX05PX1JFV0lORCA0CS8qIG1hc2sgZm9yIG1pbm9yIG5yICovCi0KLS8qIHRoZSBmb2xsb3dpbmcgdHdvIG1heSBiZSByZXBvcnRlZCB3aGVuIE1USU9DR0VUIGlzIHJlcXVlc3RlZCAuLi4gKi8KLXR5cGVkZWYgdW5pb24gewotCXN0cnVjdCB7Ci0JCV9fdTggZXJyb3I7Ci0JCV9fdTggY29tbWFuZDsKLQl9IGVycm9yOwotCWxvbmcgc3BhY2U7Ci19IGZ0X2RyaXZlX2Vycm9yOwotdHlwZWRlZiB1bmlvbiB7Ci0Jc3RydWN0IHsKLQkJX191OCBkcml2ZV9zdGF0dXM7Ci0JCV9fdTggZHJpdmVfY29uZmlnOwotCQlfX3U4IHRhcGVfc3RhdHVzOwotCX0gc3RhdHVzOwotCWxvbmcgc3BhY2U7Ci19IGZ0X2RyaXZlX3N0YXR1czsKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2RlZmluZSBGVF9SUU1fREVMQVkgICAgMTIKLSNkZWZpbmUgRlRfTUlMTElTRUNPTkQgIDEKLSNkZWZpbmUgRlRfU0VDT05EICAgICAgIDEwMDAKLSNkZWZpbmUgRlRfRk9SRVZFUiAgICAgIC0xCi0jaWZuZGVmIEhaCi0jZXJyb3IgIkhaIHVuZGVmaW5lZC4iCi0jZW5kaWYKLSNkZWZpbmUgRlRfVVNQVCAgICAgICAgICgxMDAwMDAwL0haKSAvKiBtaWNyb3NlY29uZHMgcGVyIHRpY2sgKi8KLQotLyogVGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgb2YgcmV0cmllcyB0aGF0IHRoZSBkcml2ZXIgd2lsbCBhbGxvdwotICogYmVmb3JlIGdpdmluZyB1cCAoYW5kIGxldHRpbmcgYSBoaWdoZXIgbGV2ZWwgaGFuZGxlIHRoZSBlcnJvcikuCi0gKi8KLSNpZmRlZiBURVNUSU5HCi0jZGVmaW5lIEZUX1NPRlRfUkVUUklFUyAxCSAgIC8qIG51bWJlciBvZiBsb3cgbGV2ZWwgcmV0cmllcyAqLwotI2RlZmluZSBGVF9SRVRSSUVTX09OX0VDQ19FUlJPUiAzICAvKiBlY2MgZXJyb3Igd2hlbiBjb3JyZWN0aW5nIHNlZ21lbnQgKi8KLSNlbHNlCi0jZGVmaW5lIEZUX1NPRlRfUkVUUklFUyA2CSAgIC8qIG51bWJlciBvZiBsb3cgbGV2ZWwgcmV0cmllcyAodHJpcGxlKSAqLwotI2RlZmluZSBGVF9SRVRSSUVTX09OX0VDQ19FUlJPUiAzICAvKiBlY2MgZXJyb3Igd2hlbiBjb3JyZWN0aW5nIHNlZ21lbnQgKi8KLSNlbmRpZgotCi0jaWZuZGVmIFRIRV9GVEFQRV9NQUlOVEFJTkVSCi0jZGVmaW5lIFRIRV9GVEFQRV9NQUlOVEFJTkVSICJ0aGUgZnRhcGUgbWFpbnRhaW5lciIKLSNlbmRpZgotCi0vKiBJbml0aWFsaXplIG1pc3NpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgotICovCi0jaWZuZGVmIENPTkZJR19GVF9OUl9CVUZGRVJTCi0jIGRlZmluZSBDT05GSUdfRlRfTlJfQlVGRkVSUyAzCi0jZW5kaWYKLSNpZm5kZWYgQ09ORklHX0ZUX0ZEQ19USFIKLSMgZGVmaW5lIENPTkZJR19GVF9GRENfVEhSIDgKLSNlbmRpZgotI2lmbmRlZiBDT05GSUdfRlRfRkRDX01BWF9SQVRFCi0jIGRlZmluZSBDT05GSUdfRlRfRkRDX01BWF9SQVRFIDIwMDAKLSNlbmRpZgotI2lmbmRlZiBDT05GSUdfRlRfRkRDX0JBU0UKLSMgZGVmaW5lIENPTkZJR19GVF9GRENfQkFTRSAwCi0jZW5kaWYKLSNpZm5kZWYgQ09ORklHX0ZUX0ZEQ19JUlEKLSMgZGVmaW5lIENPTkZJR19GVF9GRENfSVJRICAwCi0jZW5kaWYKLSNpZm5kZWYgQ09ORklHX0ZUX0ZEQ19ETUEKLSMgZGVmaW5lIENPTkZJR19GVF9GRENfRE1BICAwCi0jZW5kaWYKLQotLyogVHVybiBzb21lIGJvb2xlYW5zIGludG8gbnVtYmVycy4KLSAqLwotI2lmZGVmIENPTkZJR19GVF9QUk9CRV9GQzEwCi0jIHVuZGVmIENPTkZJR19GVF9QUk9CRV9GQzEwCi0jIGRlZmluZSBDT05GSUdfRlRfUFJPQkVfRkMxMCAxCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0ZUX1BST0JFX0ZDMTAgMAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0ZUX01BQ0gyCi0jIHVuZGVmIENPTkZJR19GVF9NQUNIMgotIyBkZWZpbmUgQ09ORklHX0ZUX01BQ0gyIDEKLSNlbHNlCi0jIGRlZmluZSBDT05GSUdfRlRfTUFDSDIgMAotI2VuZGlmCi0KLS8qIEluc2VydCBkZWZhdWx0IHNldHRpbmdzCi0gKi8KLSNpZiBDT05GSUdfRlRfUFJPQkVfRkMxMCA9PSAxCi0jIGlmIENPTkZJR19GVF9GRENfQkFTRSA9PSAwCi0jICB1bmRlZiAgQ09ORklHX0ZUX0ZEQ19CQVNFCi0jICBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19CQVNFIDB4MTgwCi0jIGVuZGlmCi0jIGlmIENPTkZJR19GVF9GRENfSVJRID09IDAKLSMgIHVuZGVmICBDT05GSUdfRlRfRkRDX0lSUQotIyAgZGVmaW5lIENPTkZJR19GVF9GRENfSVJRIDkKLSMgZW5kaWYKLSMgaWYgQ09ORklHX0ZUX0ZEQ19ETUEgPT0gMAotIyAgdW5kZWYgIENPTkZJR19GVF9GRENfRE1BCi0jICBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19ETUEgMwotIyBlbmRpZgotI2VsaWYgQ09ORklHX0ZUX01BQ0gyID09IDEgICAgLyogQ09ORklHX0ZUX1BST0JFX0ZDMTAgPT0gMSAqLwotIyBpZiBDT05GSUdfRlRfRkRDX0JBU0UgPT0gMAotIyAgdW5kZWYgIENPTkZJR19GVF9GRENfQkFTRQotIyAgZGVmaW5lIENPTkZJR19GVF9GRENfQkFTRSAweDFFMAotIyBlbmRpZgotIyBpZiBDT05GSUdfRlRfRkRDX0lSUSA9PSAwCi0jICB1bmRlZiAgQ09ORklHX0ZUX0ZEQ19JUlEKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0lSUSA2Ci0jIGVuZGlmCi0jIGlmIENPTkZJR19GVF9GRENfRE1BID09IDAKLSMgIHVuZGVmICBDT05GSUdfRlRfRkRDX0RNQQotIyAgZGVmaW5lIENPTkZJR19GVF9GRENfRE1BIDIKLSMgZW5kaWYKLSNlbGlmIGRlZmluZWQoQ09ORklHX0ZUX0FMVF9GREMpICAvKiBDT05GSUdfRlRfTUFDSDIgKi8KLSMgaWYgQ09ORklHX0ZUX0ZEQ19CQVNFID09IDAKLSMgIHVuZGVmICBDT05GSUdfRlRfRkRDX0JBU0UKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0JBU0UgMHgzNzAKLSMgZW5kaWYKLSMgaWYgQ09ORklHX0ZUX0ZEQ19JUlEgPT0gMAotIyAgdW5kZWYgIENPTkZJR19GVF9GRENfSVJRCi0jICBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19JUlEgNgotIyBlbmRpZgotIyBpZiBDT05GSUdfRlRfRkRDX0RNQSA9PSAwCi0jICB1bmRlZiAgQ09ORklHX0ZUX0ZEQ19ETUEKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0RNQSAyCi0jIGVuZGlmCi0jZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09ORklHX0ZUX0FMVF9GREMgKi8KLSMgaWYgQ09ORklHX0ZUX0ZEQ19CQVNFID09IDAKLSMgIHVuZGVmICBDT05GSUdfRlRfRkRDX0JBU0UKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0JBU0UgMHgzZjAKLSMgZW5kaWYKLSMgaWYgQ09ORklHX0ZUX0ZEQ19JUlEgPT0gMAotIyAgdW5kZWYgIENPTkZJR19GVF9GRENfSVJRCi0jICBkZWZpbmUgQ09ORklHX0ZUX0ZEQ19JUlEgNgotIyBlbmRpZgotIyBpZiBDT05GSUdfRlRfRkRDX0RNQSA9PSAwCi0jICB1bmRlZiAgQ09ORklHX0ZUX0ZEQ19ETUEKLSMgIGRlZmluZSBDT05GSUdfRlRfRkRDX0RNQSAyCi0jIGVuZGlmCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhbmRhcmQgRkRDICovCi0KLS8qICAgICAgc29tZSB1c2VmdWwgbWFjcm8ncwotICovCi0jZGVmaW5lIE5SX0lURU1TKHgpICAgICAoaW50KShzaXplb2YoeCkvIHNpemVvZigqeCkpCi0KLSNlbmRpZiAgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKaW5kZXggOWZjNDhhNi4uNTM0NzQ0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTE1LDcgKzE1LDcgQEAKICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDcKKyNkZWZpbmUgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTiA4CiAKIC8qKiBUaGUgbm9kZSBJRCBvZiB0aGUgcm9vdCBpbm9kZSAqLwogI2RlZmluZSBGVVNFX1JPT1RfSUQgMQpAQCAtOTIsNiArOTIsMTEgQEAKICNkZWZpbmUgRlVTRV9BU1lOQ19SRUFECQkoMSA8PCAwKQogI2RlZmluZSBGVVNFX1BPU0lYX0xPQ0tTCSgxIDw8IDEpCiAKKy8qKgorICogUmVsZWFzZSBmbGFncworICovCisjZGVmaW5lIEZVU0VfUkVMRUFTRV9GTFVTSAkoMSA8PCAwKQorCiBlbnVtIGZ1c2Vfb3Bjb2RlIHsKIAlGVVNFX0xPT0tVUAkgICA9IDEsCiAJRlVTRV9GT1JHRVQJICAgPSAyLCAgLyogbm8gcmVwbHkgKi8KQEAgLTEyNyw2ICsxMzIsOCBAQAogCUZVU0VfQUNDRVNTICAgICAgICA9IDM0LAogCUZVU0VfQ1JFQVRFICAgICAgICA9IDM1LAogCUZVU0VfSU5URVJSVVBUICAgICA9IDM2LAorCUZVU0VfQk1BUCAgICAgICAgICA9IDM3LAorCUZVU0VfREVTVFJPWSAgICAgICA9IDM4LAogfTsKIAogLyogVGhlIHJlYWQgYnVmZmVyIGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IDhrLCBidXQgbWF5IGJlIG11Y2ggbGFyZ2VyICovCkBAIC0yMDUsMTIgKzIxMiwxMyBAQAogc3RydWN0IGZ1c2VfcmVsZWFzZV9pbiB7CiAJX191NjQJZmg7CiAJX191MzIJZmxhZ3M7Ci0JX191MzIJcGFkZGluZzsKKwlfX3UzMglyZWxlYXNlX2ZsYWdzOworCV9fdTY0CWxvY2tfb3duZXI7CiB9OwogCiBzdHJ1Y3QgZnVzZV9mbHVzaF9pbiB7CiAJX191NjQJZmg7Ci0JX191MzIJZmx1c2hfZmxhZ3M7CisJX191MzIJdW51c2VkOwogCV9fdTMyCXBhZGRpbmc7CiAJX191NjQJbG9ja19vd25lcjsKIH07CkBAIC0yOTYsNiArMzA0LDE2IEBACiAJX191NjQJdW5pcXVlOwogfTsKIAorc3RydWN0IGZ1c2VfYm1hcF9pbiB7CisJX191NjQJYmxvY2s7CisJX191MzIJYmxvY2tzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9ibWFwX291dCB7CisJX191NjQJYmxvY2s7Cit9OworCiBzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgewogCV9fdTMyCWxlbjsKIAlfX3UzMglvcGNvZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z1dGV4LmggYi9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKaW5kZXggZDA5N2I1Yi4uM2YxNTNiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXRleC5oCisrKyBiL2luY2x1ZGUvbGludXgvZnV0ZXguaApAQCAtOTMsNiArOTMsNyBAQAogICovCiAjZGVmaW5lIFJPQlVTVF9MSVNUX0xJTUlUCTIwNDgKIAorI2lmZGVmIF9fS0VSTkVMX18KIGxvbmcgZG9fZnV0ZXgodTMyIF9fdXNlciAqdWFkZHIsIGludCBvcCwgdTMyIHZhbCwgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAogCSAgICAgIHUzMiBfX3VzZXIgKnVhZGRyMiwgdTMyIHZhbDIsIHUzMiB2YWwzKTsKIApAQCAtMTEwLDYgKzExMSw3IEBACiB7CiB9CiAjZW5kaWYKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNkZWZpbmUgRlVURVhfT1BfU0VUCQkwCS8qICooaW50ICopVUFERFIyID0gT1BBUkc7ICovCiAjZGVmaW5lIEZVVEVYX09QX0FERAkJMQkvKiAqKGludCAqKVVBRERSMiArPSBPUEFSRzsgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2FtZXBvcnQuaCBiL2luY2x1ZGUvbGludXgvZ2FtZXBvcnQuaAppbmRleCAyY2RiYTBjLi5hZmFkOTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dhbWVwb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9nYW1lcG9ydC5oCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0X2FsbG9jYXRlX3BvcnQodm9pZCkKIHsKLQlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGdhbWVwb3J0KSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnYW1lcG9ydCksIEdGUF9LRVJORUwpOwogCiAJcmV0dXJuIGdhbWVwb3J0OwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZW5lcmljX3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9nZW5lcmljX3NlcmlhbC5oCmluZGV4IGUyNTM4NDUuLjU0MTJkYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2VuZXJpY19zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dlbmVyaWNfc2VyaWFsLmgKQEAgLTkxLDcgKzkxLDcgQEAKIGludCAgZ3NfYmxvY2tfdGlsX3JlYWR5KHZvaWQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKIHZvaWQgZ3NfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApOwogdm9pZCBnc19zZXRfdGVybWlvcyAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRlcm1pb3MgKiBvbGRfdGVybWlvcyk7CisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGRfdGVybWlvcyk7CiBpbnQgIGdzX2luaXRfcG9ydChzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCk7CiBpbnQgIGdzX3NldHNlcmlhbChzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCk7CiBpbnQgIGdzX2dldHNlcmlhbChzdHJ1Y3QgZ3NfcG9ydCAqcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9nZW5ldGxpbmsuaAppbmRleCA5MDQ5ZGM2Li5mN2E5Mzc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dlbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuZXRsaW5rLmgKQEAgLTE3LDYgKzE3LDkgQEAKICNkZWZpbmUgR0VOTF9IRFJMRU4JTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBnZW5sbXNnaGRyKSkKIAogI2RlZmluZSBHRU5MX0FETUlOX1BFUk0JCTB4MDEKKyNkZWZpbmUgR0VOTF9DTURfQ0FQX0RPCQkweDAyCisjZGVmaW5lIEdFTkxfQ01EX0NBUF9EVU1QCTB4MDQKKyNkZWZpbmUgR0VOTF9DTURfQ0FQX0hBU1BPTAkweDA4CiAKIC8qCiAgKiBMaXN0IG9mIHJlc2VydmVkIHN0YXRpYyBnZW5lcmljIG5ldGxpbmsgaWRlbnRpZmllcnM6CkBAIC01OCw5ICs2MSw2IEBACiAJQ1RSTF9BVFRSX09QX1VOU1BFQywKIAlDVFJMX0FUVFJfT1BfSUQsCiAJQ1RSTF9BVFRSX09QX0ZMQUdTLAotCUNUUkxfQVRUUl9PUF9QT0xJQ1ksCi0JQ1RSTF9BVFRSX09QX0RPSVQsCi0JQ1RSTF9BVFRSX09QX0RVTVBJVCwKIAlfX0NUUkxfQVRUUl9PUF9NQVgsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKaW5kZXggNDFmMjc2Zi4uMGEwMjJiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5oZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtODMsNiArODMsOSBAQAogCXN0cnVjdCBrb2JqZWN0ICpob2xkZXJfZGlyOwogCXVuc2lnbmVkIGlvc1syXSwgc2VjdG9yc1syXTsJLyogUkVBRHMgYW5kIFdSSVRFcyAqLwogCWludCBwb2xpY3ksIHBhcnRubzsKKyNpZmRlZiBDT05GSUdfRkFJTF9NQUtFX1JFUVVFU1QKKwlpbnQgbWFrZV9pdF9mYWlsOworI2VuZGlmCiB9OwogCiAjZGVmaW5lIEdFTkhEX0ZMX1JFTU9WQUJMRQkJCTEKQEAgLTkwLDYgKzkzLDcgQEAKICNkZWZpbmUgR0VOSERfRkxfQ0QJCQkJOAogI2RlZmluZSBHRU5IRF9GTF9VUAkJCQkxNgogI2RlZmluZSBHRU5IRF9GTF9TVVBQUkVTU19QQVJUSVRJT05fSU5GTwkzMgorI2RlZmluZSBHRU5IRF9GTF9GQUlMCQkJCTY0CiAKIHN0cnVjdCBkaXNrX3N0YXRzIHsKIAl1bnNpZ25lZCBsb25nIHNlY3RvcnNbMl07CS8qIFJFQURzIGFuZCBXUklURXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oCmluZGV4IGJmMmI2YmMuLjAwYzMxNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtMTE2LDYgKzExNiw5IEBACiAjaWZuZGVmIEhBVkVfQVJDSF9GUkVFX1BBR0UKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2ZyZWVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKSB7IH0KICNlbmRpZgorI2lmbmRlZiBIQVZFX0FSQ0hfQUxMT0NfUEFHRQorc3RhdGljIGlubGluZSB2b2lkIGFyY2hfYWxsb2NfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKSB7IH0KKyNlbmRpZgogCiBleHRlcm4gc3RydWN0IHBhZ2UgKgogRkFTVENBTEwoX19hbGxvY19wYWdlcyhnZnBfdCwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgem9uZWxpc3QgKikpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnMyX29uZGlzay5oIGIvaW5jbHVkZS9saW51eC9nZnMyX29uZGlzay5oCmluZGV4IGE3YWU3YzEuLjhiN2U0YzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZzMl9vbmRpc2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2dmczJfb25kaXNrLmgKQEAgLTU0LDggKzU0LDEzIEBACiAJX19iZTY0IG5vX2FkZHI7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBnZnMyX2ludW1fZXF1YWwoY29uc3Qgc3RydWN0IGdmczJfaW51bSAqaW5vMSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBnZnMyX2ludW0gKmlubzIpCitzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgeworCV9fdTY0IG5vX2Zvcm1hbF9pbm87CisJX191NjQgbm9fYWRkcjsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGdmczJfaW51bV9lcXVhbChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmlubzEsCisJCQkJICBjb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3QgKmlubzIpCiB7CiAJcmV0dXJuIGlubzEtPm5vX2Zvcm1hbF9pbm8gPT0gaW5vMi0+bm9fZm9ybWFsX2lubyAmJgogCSAgICAgICBpbm8xLT5ub19hZGRyID09IGlubzItPm5vX2FkZHI7CkBAIC04OSw2ICs5NCwxMiBAQAogCV9fYmUzMiBfX3BhZDE7CQkvKiBXYXMgaW5jYXJuYXRpb24gbnVtYmVyIGluIGdmczEgKi8KIH07CiAKK3N0cnVjdCBnZnMyX21ldGFfaGVhZGVyX2hvc3QgeworCV9fdTMyIG1oX21hZ2ljOworCV9fdTMyIG1oX3R5cGU7CisJX191MzIgbWhfZm9ybWF0OworfTsKKwogLyoKICAqIHN1cGVyLWJsb2NrIHN0cnVjdHVyZQogICoKQEAgLTEyOCw2ICsxMzksMjMgQEAKIAkvKiBJbiBnZnMxLCBxdW90YSBhbmQgbGljZW5zZSBkaW5vZGVzIGZvbGxvd2VkICovCiB9OwogCitzdHJ1Y3QgZ2ZzMl9zYl9ob3N0IHsKKwlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlcl9ob3N0IHNiX2hlYWRlcjsKKworCV9fdTMyIHNiX2ZzX2Zvcm1hdDsKKwlfX3UzMiBzYl9tdWx0aWhvc3RfZm9ybWF0OworCisJX191MzIgc2JfYnNpemU7CisJX191MzIgc2JfYnNpemVfc2hpZnQ7CisKKwlzdHJ1Y3QgZ2ZzMl9pbnVtX2hvc3Qgc2JfbWFzdGVyX2RpcjsgLyogV2FzIGppbmRleCBkaW5vZGUgaW4gZ2ZzMSAqLworCXN0cnVjdCBnZnMyX2ludW1faG9zdCBzYl9yb290X2RpcjsKKworCWNoYXIgc2JfbG9ja3Byb3RvW0dGUzJfTE9DS05BTUVfTEVOXTsKKwljaGFyIHNiX2xvY2t0YWJsZVtHRlMyX0xPQ0tOQU1FX0xFTl07CisJLyogSW4gZ2ZzMSwgcXVvdGEgYW5kIGxpY2Vuc2UgZGlub2RlcyBmb2xsb3dlZCAqLworfTsKKwogLyoKICAqIHJlc291cmNlIGluZGV4IHN0cnVjdHVyZQogICovCkBAIC0xNDUsNiArMTczLDE0IEBACiAJX191OCByaV9yZXNlcnZlZFs2NF07CiB9OwogCitzdHJ1Y3QgZ2ZzMl9yaW5kZXhfaG9zdCB7CisJX191NjQgcmlfYWRkcjsJLyogZ3JwIGJsb2NrIGRpc2sgYWRkcmVzcyAqLworCV9fdTY0IHJpX2RhdGEwOwkvKiBmaXJzdCBkYXRhIGxvY2F0aW9uICovCisJX191MzIgcmlfbGVuZ3RoOwkvKiBsZW5ndGggb2YgcmdycCBoZWFkZXIgaW4gZnMgYmxvY2tzICovCisJX191MzIgcmlfZGF0YTsJLyogbnVtIG9mIGRhdGEgYmxvY2tzIGluIHJncnAgKi8KKwlfX3UzMiByaV9iaXRieXRlczsJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGRhdGEgYml0bWFwcyAqLworfTsKKwogLyoKICAqIHJlc291cmNlIGdyb3VwIGhlYWRlciBzdHJ1Y3R1cmUKICAqLwpAQCAtMTc2LDYgKzIxMiwxMyBAQAogCV9fdTggcmdfcmVzZXJ2ZWRbODBdOyAvKiBTZXZlcmFsIGZpZWxkcyBmcm9tIGdmczEgbm93IHJlc2VydmVkICovCiB9OwogCitzdHJ1Y3QgZ2ZzMl9yZ3JwX2hvc3QgeworCV9fdTMyIHJnX2ZsYWdzOworCV9fdTMyIHJnX2ZyZWU7CisJX191MzIgcmdfZGlub2RlczsKKwlfX3U2NCByZ19pZ2VuZXJhdGlvbjsKK307CisKIC8qCiAgKiBxdW90YSBzdHJ1Y3R1cmUKICAqLwpAQCAtMTg3LDYgKzIzMCwxMiBAQAogCV9fdTggcXVfcmVzZXJ2ZWRbNjRdOwogfTsKIAorc3RydWN0IGdmczJfcXVvdGFfaG9zdCB7CisJX191NjQgcXVfbGltaXQ7CisJX191NjQgcXVfd2FybjsKKwlfX3U2NCBxdV92YWx1ZTsKK307CisKIC8qCiAgKiBkaW5vZGUgc3RydWN0dXJlCiAgKi8KQEAgLTI3MCw2ICszMTksMjcgQEAKIAlfX3U4IGRpX3Jlc2VydmVkWzU2XTsKIH07CiAKK3N0cnVjdCBnZnMyX2Rpbm9kZV9ob3N0IHsKKwlfX3U2NCBkaV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZmlsZSAqLworCV9fdTY0IGRpX2Jsb2NrczsJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlICovCisKKwkvKiBUaGlzIHNlY3Rpb24gdmFyaWVzIGZyb20gZ2ZzMS4gUGFkZGluZyBhZGRlZCB0byBhbGlnbiB3aXRoCisgICAgICAgICAqIHJlbWFpbmRlciBvZiBkaW5vZGUKKwkgKi8KKwlfX3U2NCBkaV9nb2FsX21ldGE7CS8qIHJncnAgdG8gYWxsb2MgZnJvbSBuZXh0ICovCisJX191NjQgZGlfZ29hbF9kYXRhOwkvKiBkYXRhIGJsb2NrIGdvYWwgKi8KKwlfX3U2NCBkaV9nZW5lcmF0aW9uOwkvKiBnZW5lcmF0aW9uIG51bWJlciBmb3IgTkZTICovCisKKwlfX3UzMiBkaV9mbGFnczsJLyogR0ZTMl9ESUZfLi4uICovCisJX191MTYgZGlfaGVpZ2h0OwkvKiBoZWlnaHQgb2YgbWV0YWRhdGEgKi8KKworCS8qIFRoZXNlIG9ubHkgYXBwbHkgdG8gZGlyZWN0b3JpZXMgICovCisJX191MTYgZGlfZGVwdGg7CS8qIE51bWJlciBvZiBiaXRzIGluIHRoZSB0YWJsZSAqLworCV9fdTMyIGRpX2VudHJpZXM7CS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5ICovCisKKwlfX3U2NCBkaV9lYXR0cjsJLyogZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrIG51bWJlciAqLworfTsKKwogLyoKICAqIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgLSBtYW55IG9mIHRoZXNlIHBlciBkaXJlY3RvcnkgZmlsZQogICovCkBAIC0zNDQsNiArNDE0LDE2IEBACiAJX19iZTMyIGxoX2hhc2g7CiB9OwogCitzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyX2hvc3QgeworCXN0cnVjdCBnZnMyX21ldGFfaGVhZGVyX2hvc3QgbGhfaGVhZGVyOworCisJX191NjQgbGhfc2VxdWVuY2U7CS8qIFNlcXVlbmNlIG51bWJlciBvZiB0aGlzIHRyYW5zYWN0aW9uICovCisJX191MzIgbGhfZmxhZ3M7CS8qIEdGUzJfTE9HX0hFQURfLi4uICovCisJX191MzIgbGhfdGFpbDsJCS8qIEJsb2NrIG51bWJlciBvZiBsb2cgdGFpbCAqLworCV9fdTMyIGxoX2Jsa25vOworCV9fdTMyIGxoX2hhc2g7Cit9OworCiAvKgogICogTG9nIHR5cGUgZGVzY3JpcHRvcgogICovCkBAIC0zODQsNiArNDY0LDExIEBACiAJX19iZTY0IGlyX2xlbmd0aDsKIH07CiAKK3N0cnVjdCBnZnMyX2ludW1fcmFuZ2VfaG9zdCB7CisJX191NjQgaXJfc3RhcnQ7CisJX191NjQgaXJfbGVuZ3RoOworfTsKKwogLyoKICAqIFN0YXRmcyBjaGFuZ2UKICAqIERlc2NyaWJlcyBhbiBjaGFuZ2UgdG8gdGhlIHBvb2wgb2YgZnJlZSBhbmQgYWxsb2NhdGVkCkBAIC0zOTYsNiArNDgxLDEyIEBACiAJX19iZTY0IHNjX2Rpbm9kZXM7CiB9OwogCitzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgeworCV9fdTY0IHNjX3RvdGFsOworCV9fdTY0IHNjX2ZyZWU7CisJX191NjQgc2NfZGlub2RlczsKK307CisKIC8qCiAgKiBRdW90YSBjaGFuZ2UKICAqIERlc2NyaWJlcyBhbiBhbGxvY2F0aW9uIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyCkBAIC00MTAsMzMgKzUwMSwzOCBAQAogCV9fYmUzMiBxY19pZDsKIH07CiAKK3N0cnVjdCBnZnMyX3F1b3RhX2NoYW5nZV9ob3N0IHsKKwlfX3U2NCBxY19jaGFuZ2U7CisJX191MzIgcWNfZmxhZ3M7CS8qIEdGUzJfUUNGXy4uLiAqLworCV9fdTMyIHFjX2lkOworfTsKKwogI2lmZGVmIF9fS0VSTkVMX18KIC8qIFRyYW5zbGF0aW9uIGZ1bmN0aW9ucyAqLwogCi1leHRlcm4gdm9pZCBnZnMyX2ludW1faW4oc3RydWN0IGdmczJfaW51bSAqbm8sIGNvbnN0IHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBnZnMyX2ludW1fb3V0KGNvbnN0IHN0cnVjdCBnZnMyX2ludW0gKm5vLCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9zYl9pbihzdHJ1Y3QgZ2ZzMl9zYiAqc2IsIGNvbnN0IHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBnZnMyX3JpbmRleF9pbihzdHJ1Y3QgZ2ZzMl9yaW5kZXggKnJpLCBjb25zdCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9yaW5kZXhfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX3JpbmRleCAqcmksIHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBnZnMyX3JncnBfaW4oc3RydWN0IGdmczJfcmdycCAqcmcsIGNvbnN0IHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBnZnMyX3JncnBfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX3JncnAgKnJnLCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9xdW90YV9pbihzdHJ1Y3QgZ2ZzMl9xdW90YSAqcXUsIGNvbnN0IHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBnZnMyX3F1b3RhX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9xdW90YSAqcXUsIHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBnZnMyX2Rpbm9kZV9pbihzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpLCBjb25zdCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9kaW5vZGVfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX2Rpbm9kZSAqZGksIHZvaWQgKmJ1Zik7CitleHRlcm4gdm9pZCBnZnMyX2ludW1faW4oc3RydWN0IGdmczJfaW51bV9ob3N0ICpubywgY29uc3Qgdm9pZCAqYnVmKTsKK2V4dGVybiB2b2lkIGdmczJfaW51bV9vdXQoY29uc3Qgc3RydWN0IGdmczJfaW51bV9ob3N0ICpubywgdm9pZCAqYnVmKTsKK2V4dGVybiB2b2lkIGdmczJfc2JfaW4oc3RydWN0IGdmczJfc2JfaG9zdCAqc2IsIGNvbnN0IHZvaWQgKmJ1Zik7CitleHRlcm4gdm9pZCBnZnMyX3JpbmRleF9pbihzdHJ1Y3QgZ2ZzMl9yaW5kZXhfaG9zdCAqcmksIGNvbnN0IHZvaWQgKmJ1Zik7CitleHRlcm4gdm9pZCBnZnMyX3JpbmRleF9vdXQoY29uc3Qgc3RydWN0IGdmczJfcmluZGV4X2hvc3QgKnJpLCB2b2lkICpidWYpOworZXh0ZXJuIHZvaWQgZ2ZzMl9yZ3JwX2luKHN0cnVjdCBnZnMyX3JncnBfaG9zdCAqcmcsIGNvbnN0IHZvaWQgKmJ1Zik7CitleHRlcm4gdm9pZCBnZnMyX3JncnBfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX3JncnBfaG9zdCAqcmcsIHZvaWQgKmJ1Zik7CitleHRlcm4gdm9pZCBnZnMyX3F1b3RhX2luKHN0cnVjdCBnZnMyX3F1b3RhX2hvc3QgKnF1LCBjb25zdCB2b2lkICpidWYpOworc3RydWN0IGdmczJfaW5vZGU7CitleHRlcm4gdm9pZCBnZnMyX2Rpbm9kZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwLCB2b2lkICpidWYpOwogZXh0ZXJuIHZvaWQgZ2ZzMl9lYV9oZWFkZXJfaW4oc3RydWN0IGdmczJfZWFfaGVhZGVyICplYSwgY29uc3Qgdm9pZCAqYnVmKTsKIGV4dGVybiB2b2lkIGdmczJfZWFfaGVhZGVyX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9lYV9oZWFkZXIgKmVhLCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9sb2dfaGVhZGVyX2luKHN0cnVjdCBnZnMyX2xvZ19oZWFkZXIgKmxoLCBjb25zdCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9pbnVtX3JhbmdlX2luKHN0cnVjdCBnZnMyX2ludW1fcmFuZ2UgKmlyLCBjb25zdCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgZ2ZzMl9pbnVtX3JhbmdlX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbnVtX3JhbmdlICppciwgdm9pZCAqYnVmKTsKLWV4dGVybiB2b2lkIGdmczJfc3RhdGZzX2NoYW5nZV9pbihzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlICpzYywgY29uc3Qgdm9pZCAqYnVmKTsKLWV4dGVybiB2b2lkIGdmczJfc3RhdGZzX2NoYW5nZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSAqc2MsIHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBnZnMyX3F1b3RhX2NoYW5nZV9pbihzdHJ1Y3QgZ2ZzMl9xdW90YV9jaGFuZ2UgKnFjLCBjb25zdCB2b2lkICpidWYpOworZXh0ZXJuIHZvaWQgZ2ZzMl9sb2dfaGVhZGVyX2luKHN0cnVjdCBnZnMyX2xvZ19oZWFkZXJfaG9zdCAqbGgsIGNvbnN0IHZvaWQgKmJ1Zik7CitleHRlcm4gdm9pZCBnZnMyX2ludW1fcmFuZ2VfaW4oc3RydWN0IGdmczJfaW51bV9yYW5nZV9ob3N0ICppciwgY29uc3Qgdm9pZCAqYnVmKTsKK2V4dGVybiB2b2lkIGdmczJfaW51bV9yYW5nZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfaW51bV9yYW5nZV9ob3N0ICppciwgdm9pZCAqYnVmKTsKK2V4dGVybiB2b2lkIGdmczJfc3RhdGZzX2NoYW5nZV9pbihzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjLCBjb25zdCB2b2lkICpidWYpOworZXh0ZXJuIHZvaWQgZ2ZzMl9zdGF0ZnNfY2hhbmdlX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjLCB2b2lkICpidWYpOworZXh0ZXJuIHZvaWQgZ2ZzMl9xdW90YV9jaGFuZ2VfaW4oc3RydWN0IGdmczJfcXVvdGFfY2hhbmdlX2hvc3QgKnFjLCBjb25zdCB2b2lkICpidWYpOwogCiAvKiBQcmludGluZyBmdW5jdGlvbnMgKi8KIAotZXh0ZXJuIHZvaWQgZ2ZzMl9yaW5kZXhfcHJpbnQoY29uc3Qgc3RydWN0IGdmczJfcmluZGV4ICpyaSk7Ci1leHRlcm4gdm9pZCBnZnMyX2Rpbm9kZV9wcmludChjb25zdCBzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpKTsKK2V4dGVybiB2b2lkIGdmczJfcmluZGV4X3ByaW50KGNvbnN0IHN0cnVjdCBnZnMyX3JpbmRleF9ob3N0ICpyaSk7CitleHRlcm4gdm9pZCBnZnMyX2Rpbm9kZV9wcmludChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZGVidWcuaCBiL2luY2x1ZGUvbGludXgvaGlkLWRlYnVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oCnJlbmFtZSB0byBpbmNsdWRlL2xpbnV4L2hpZC1kZWJ1Zy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hpZC5oIGIvaW5jbHVkZS9saW51eC9oaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzAxMjBhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtMCwwICsxLDUyOCBAQAorI2lmbmRlZiBfX0hJRF9ICisjZGVmaW5lIF9fSElEX0gKKworLyoKKyAqICRJZDogaGlkLmgsdiAxLjI0IDIwMDEvMTIvMjcgMTA6Mzc6NDEgdm9qdGVjaCBFeHAgJAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBWb2p0ZWNoIFBhdmxpaworICogIENvcHlyaWdodCAoYykgMjAwNiBKaXJpIEtvc2luYQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIFNob3VsZCB5b3UgbmVlZCB0byBjb250YWN0IG1lLCB0aGUgYXV0aG9yLCB5b3UgY2FuIGRvIHNvIGVpdGhlciBieQorICogZS1tYWlsIC0gbWFpbCB5b3VyIG1lc3NhZ2UgdG8gPHZvanRlY2hAdWN3LmN6Piwgb3IgYnkgcGFwZXIgbWFpbDoKKyAqIFZvanRlY2ggUGF2bGlrLCBTaW11bmtvdmEgMTU5NCwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYworICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisvKgorICogVVNCIEhJRCAoSHVtYW4gSW50ZXJmYWNlIERldmljZSkgaW50ZXJmYWNlIGNsYXNzIGNvZGUKKyAqLworCisjZGVmaW5lIFVTQl9JTlRFUkZBQ0VfQ0xBU1NfSElECQkzCisKKy8qCisgKiBVU0IgSElEIGludGVyZmFjZSBzdWJjbGFzcyBhbmQgcHJvdG9jb2wgY29kZXMKKyAqLworCisjZGVmaW5lIFVTQl9JTlRFUkZBQ0VfU1VCQ0xBU1NfQk9PVAkxCisjZGVmaW5lIFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfS0VZQk9BUkQJMQorI2RlZmluZSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFCTIKKworLyoKKyAqIEhJRCBjbGFzcyByZXF1ZXN0cworICovCisKKyNkZWZpbmUgSElEX1JFUV9HRVRfUkVQT1JUCQkweDAxCisjZGVmaW5lIEhJRF9SRVFfR0VUX0lETEUJCTB4MDIKKyNkZWZpbmUgSElEX1JFUV9HRVRfUFJPVE9DT0wJCTB4MDMKKyNkZWZpbmUgSElEX1JFUV9TRVRfUkVQT1JUCQkweDA5CisjZGVmaW5lIEhJRF9SRVFfU0VUX0lETEUJCTB4MEEKKyNkZWZpbmUgSElEX1JFUV9TRVRfUFJPVE9DT0wJCTB4MEIKKworLyoKKyAqIEhJRCBjbGFzcyBkZXNjcmlwdG9yIHR5cGVzCisgKi8KKworI2RlZmluZSBISURfRFRfSElECQkJKFVTQl9UWVBFX0NMQVNTIHwgMHgwMSkKKyNkZWZpbmUgSElEX0RUX1JFUE9SVAkJCShVU0JfVFlQRV9DTEFTUyB8IDB4MDIpCisjZGVmaW5lIEhJRF9EVF9QSFlTSUNBTAkJCShVU0JfVFlQRV9DTEFTUyB8IDB4MDMpCisKKy8qCisgKiBXZSBwYXJzZSBlYWNoIGRlc2NyaXB0aW9uIGl0ZW0gaW50byB0aGlzIHN0cnVjdHVyZS4gU2hvcnQgaXRlbXMgZGF0YQorICogdmFsdWVzIGFyZSBleHBhbmRlZCB0byAzMi1iaXQgc2lnbmVkIGludCwgbG9uZyBpdGVtcyBjb250YWluIGEgcG9pbnRlcgorICogaW50byB0aGUgZGF0YSBhcmVhLgorICovCisKK3N0cnVjdCBoaWRfaXRlbSB7CisJdW5zaWduZWQgIGZvcm1hdDsKKwlfX3U4ICAgICAgc2l6ZTsKKwlfX3U4ICAgICAgdHlwZTsKKwlfX3U4ICAgICAgdGFnOworCXVuaW9uIHsKKwkgICAgX191OCAgIHU4OworCSAgICBfX3M4ICAgczg7CisJICAgIF9fdTE2ICB1MTY7CisJICAgIF9fczE2ICBzMTY7CisJICAgIF9fdTMyICB1MzI7CisJICAgIF9fczMyICBzMzI7CisJICAgIF9fdTggICpsb25nZGF0YTsKKwl9IGRhdGE7Cit9OworCisvKgorICogSElEIHJlcG9ydCBpdGVtIGZvcm1hdAorICovCisKKyNkZWZpbmUgSElEX0lURU1fRk9STUFUX1NIT1JUCTAKKyNkZWZpbmUgSElEX0lURU1fRk9STUFUX0xPTkcJMQorCisvKgorICogU3BlY2lhbCB0YWcgaW5kaWNhdGluZyBsb25nIGl0ZW1zCisgKi8KKworI2RlZmluZSBISURfSVRFTV9UQUdfTE9ORwkxNQorCisvKgorICogSElEIHJlcG9ydCBkZXNjcmlwdG9yIGl0ZW0gdHlwZSAocHJlZml4IGJpdCAyLDMpCisgKi8KKworI2RlZmluZSBISURfSVRFTV9UWVBFX01BSU4JCTAKKyNkZWZpbmUgSElEX0lURU1fVFlQRV9HTE9CQUwJCTEKKyNkZWZpbmUgSElEX0lURU1fVFlQRV9MT0NBTAkJMgorI2RlZmluZSBISURfSVRFTV9UWVBFX1JFU0VSVkVECQkzCisKKy8qCisgKiBISUQgcmVwb3J0IGRlc2NyaXB0b3IgbWFpbiBpdGVtIHRhZ3MKKyAqLworCisjZGVmaW5lIEhJRF9NQUlOX0lURU1fVEFHX0lOUFVUCQkJOAorI2RlZmluZSBISURfTUFJTl9JVEVNX1RBR19PVVRQVVQJCTkKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9UQUdfRkVBVFVSRQkJMTEKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9UQUdfQkVHSU5fQ09MTEVDVElPTgkxMAorI2RlZmluZSBISURfTUFJTl9JVEVNX1RBR19FTkRfQ09MTEVDVElPTgkxMgorCisvKgorICogSElEIHJlcG9ydCBkZXNjcmlwdG9yIG1haW4gaXRlbSBjb250ZW50cworICovCisKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9DT05TVEFOVAkJMHgwMDEKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9WQVJJQUJMRQkJMHgwMDIKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9SRUxBVElWRQkJMHgwMDQKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9XUkFQCQkweDAwOAorI2RlZmluZSBISURfTUFJTl9JVEVNX05PTkxJTkVBUgkJMHgwMTAKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9OT19QUkVGRVJSRUQJMHgwMjAKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9OVUxMX1NUQVRFCTB4MDQwCisjZGVmaW5lIEhJRF9NQUlOX0lURU1fVk9MQVRJTEUJCTB4MDgwCisjZGVmaW5lIEhJRF9NQUlOX0lURU1fQlVGRkVSRURfQllURQkweDEwMAorCisvKgorICogSElEIHJlcG9ydCBkZXNjcmlwdG9yIGNvbGxlY3Rpb24gaXRlbSB0eXBlcworICovCisKKyNkZWZpbmUgSElEX0NPTExFQ1RJT05fUEhZU0lDQUwJCTAKKyNkZWZpbmUgSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04JMQorI2RlZmluZSBISURfQ09MTEVDVElPTl9MT0dJQ0FMCQkyCisKKy8qCisgKiBISUQgcmVwb3J0IGRlc2NyaXB0b3IgZ2xvYmFsIGl0ZW0gdGFncworICovCisKKyNkZWZpbmUgSElEX0dMT0JBTF9JVEVNX1RBR19VU0FHRV9QQUdFCQkwCisjZGVmaW5lIEhJRF9HTE9CQUxfSVRFTV9UQUdfTE9HSUNBTF9NSU5JTVVNCTEKKyNkZWZpbmUgSElEX0dMT0JBTF9JVEVNX1RBR19MT0dJQ0FMX01BWElNVU0JMgorI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1BIWVNJQ0FMX01JTklNVU0JMworI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1BIWVNJQ0FMX01BWElNVU0JNAorI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1VOSVRfRVhQT05FTlQJNQorI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1VOSVQJCTYKKyNkZWZpbmUgSElEX0dMT0JBTF9JVEVNX1RBR19SRVBPUlRfU0laRQkJNworI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1JFUE9SVF9JRAkJOAorI2RlZmluZSBISURfR0xPQkFMX0lURU1fVEFHX1JFUE9SVF9DT1VOVAk5CisjZGVmaW5lIEhJRF9HTE9CQUxfSVRFTV9UQUdfUFVTSAkJMTAKKyNkZWZpbmUgSElEX0dMT0JBTF9JVEVNX1RBR19QT1AJCQkxMQorCisvKgorICogSElEIHJlcG9ydCBkZXNjcmlwdG9yIGxvY2FsIGl0ZW0gdGFncworICovCisKKyNkZWZpbmUgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFCQkwCisjZGVmaW5lIEhJRF9MT0NBTF9JVEVNX1RBR19VU0FHRV9NSU5JTVVNCTEKKyNkZWZpbmUgSElEX0xPQ0FMX0lURU1fVEFHX1VTQUdFX01BWElNVU0JMgorI2RlZmluZSBISURfTE9DQUxfSVRFTV9UQUdfREVTSUdOQVRPUl9JTkRFWAkzCisjZGVmaW5lIEhJRF9MT0NBTF9JVEVNX1RBR19ERVNJR05BVE9SX01JTklNVU0JNAorI2RlZmluZSBISURfTE9DQUxfSVRFTV9UQUdfREVTSUdOQVRPUl9NQVhJTVVNCTUKKyNkZWZpbmUgSElEX0xPQ0FMX0lURU1fVEFHX1NUUklOR19JTkRFWAkJNworI2RlZmluZSBISURfTE9DQUxfSVRFTV9UQUdfU1RSSU5HX01JTklNVU0JOAorI2RlZmluZSBISURfTE9DQUxfSVRFTV9UQUdfU1RSSU5HX01BWElNVU0JOQorI2RlZmluZSBISURfTE9DQUxfSVRFTV9UQUdfREVMSU1JVEVSCQkxMAorCisvKgorICogSElEIHVzYWdlIHRhYmxlcworICovCisKKyNkZWZpbmUgSElEX1VTQUdFX1BBR0UJCTB4ZmZmZjAwMDAKKworI2RlZmluZSBISURfVVBfVU5ERUZJTkVECTB4MDAwMDAwMDAKKyNkZWZpbmUgSElEX1VQX0dFTkRFU0sJCTB4MDAwMTAwMDAKKyNkZWZpbmUgSElEX1VQX1NJTVVMQVRJT04JMHgwMDAyMDAwMAorI2RlZmluZSBISURfVVBfS0VZQk9BUkQJCTB4MDAwNzAwMDAKKyNkZWZpbmUgSElEX1VQX0xFRAkJMHgwMDA4MDAwMAorI2RlZmluZSBISURfVVBfQlVUVE9OCQkweDAwMDkwMDAwCisjZGVmaW5lIEhJRF9VUF9PUkRJTkFMCQkweDAwMGEwMDAwCisjZGVmaW5lIEhJRF9VUF9DT05TVU1FUgkJMHgwMDBjMDAwMAorI2RlZmluZSBISURfVVBfRElHSVRJWkVSCTB4MDAwZDAwMDAKKyNkZWZpbmUgSElEX1VQX1BJRAkJMHgwMDBmMDAwMAorI2RlZmluZSBISURfVVBfSFBWRU5ET1IgICAgICAgICAweGZmN2YwMDAwCisjZGVmaW5lIEhJRF9VUF9NU1ZFTkRPUgkJMHhmZjAwMDAwMAorI2RlZmluZSBISURfVVBfQ1VTVE9NCQkweDAwZmYwMDAwCisjZGVmaW5lIEhJRF9VUF9MT0dJVkVORE9SCTB4ZmZiYzAwMDAKKworI2RlZmluZSBISURfVVNBR0UJCTB4MDAwMGZmZmYKKworI2RlZmluZSBISURfR0RfUE9JTlRFUgkJMHgwMDAxMDAwMQorI2RlZmluZSBISURfR0RfTU9VU0UJCTB4MDAwMTAwMDIKKyNkZWZpbmUgSElEX0dEX0pPWVNUSUNLCQkweDAwMDEwMDA0CisjZGVmaW5lIEhJRF9HRF9HQU1FUEFECQkweDAwMDEwMDA1CisjZGVmaW5lIEhJRF9HRF9LRVlCT0FSRAkJMHgwMDAxMDAwNgorI2RlZmluZSBISURfR0RfS0VZUEFECQkweDAwMDEwMDA3CisjZGVmaW5lIEhJRF9HRF9NVUxUSUFYSVMJMHgwMDAxMDAwOAorI2RlZmluZSBISURfR0RfWAkJMHgwMDAxMDAzMAorI2RlZmluZSBISURfR0RfWQkJMHgwMDAxMDAzMQorI2RlZmluZSBISURfR0RfWgkJMHgwMDAxMDAzMgorI2RlZmluZSBISURfR0RfUlgJCTB4MDAwMTAwMzMKKyNkZWZpbmUgSElEX0dEX1JZCQkweDAwMDEwMDM0CisjZGVmaW5lIEhJRF9HRF9SWgkJMHgwMDAxMDAzNQorI2RlZmluZSBISURfR0RfU0xJREVSCQkweDAwMDEwMDM2CisjZGVmaW5lIEhJRF9HRF9ESUFMCQkweDAwMDEwMDM3CisjZGVmaW5lIEhJRF9HRF9XSEVFTAkJMHgwMDAxMDAzOAorI2RlZmluZSBISURfR0RfSEFUU1dJVENICTB4MDAwMTAwMzkKKyNkZWZpbmUgSElEX0dEX0JVRkZFUgkJMHgwMDAxMDAzYQorI2RlZmluZSBISURfR0RfQllURUNPVU5UCTB4MDAwMTAwM2IKKyNkZWZpbmUgSElEX0dEX01PVElPTgkJMHgwMDAxMDAzYworI2RlZmluZSBISURfR0RfU1RBUlQJCTB4MDAwMTAwM2QKKyNkZWZpbmUgSElEX0dEX1NFTEVDVAkJMHgwMDAxMDAzZQorI2RlZmluZSBISURfR0RfVlgJCTB4MDAwMTAwNDAKKyNkZWZpbmUgSElEX0dEX1ZZCQkweDAwMDEwMDQxCisjZGVmaW5lIEhJRF9HRF9WWgkJMHgwMDAxMDA0MgorI2RlZmluZSBISURfR0RfVkJSWAkJMHgwMDAxMDA0MworI2RlZmluZSBISURfR0RfVkJSWQkJMHgwMDAxMDA0NAorI2RlZmluZSBISURfR0RfVkJSWgkJMHgwMDAxMDA0NQorI2RlZmluZSBISURfR0RfVk5PCQkweDAwMDEwMDQ2CisjZGVmaW5lIEhJRF9HRF9GRUFUVVJFCQkweDAwMDEwMDQ3CisjZGVmaW5lIEhJRF9HRF9VUAkJMHgwMDAxMDA5MAorI2RlZmluZSBISURfR0RfRE9XTgkJMHgwMDAxMDA5MQorI2RlZmluZSBISURfR0RfUklHSFQJCTB4MDAwMTAwOTIKKyNkZWZpbmUgSElEX0dEX0xFRlQJCTB4MDAwMTAwOTMKKworLyoKKyAqIEhJRCByZXBvcnQgdHlwZXMgLS0tIE91Y2ghIEhJRCBzcGVjIHNheXMgMSAyIDMhCisgKi8KKworI2RlZmluZSBISURfSU5QVVRfUkVQT1JUCTAKKyNkZWZpbmUgSElEX09VVFBVVF9SRVBPUlQJMQorI2RlZmluZSBISURfRkVBVFVSRV9SRVBPUlQJMgorCisvKgorICogSElEIGRldmljZSBxdWlya3MuCisgKi8KKworI2RlZmluZSBISURfUVVJUktfSU5WRVJUCQkJMHgwMDAwMDAwMQorI2RlZmluZSBISURfUVVJUktfTk9UT1VDSAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgSElEX1FVSVJLX0lHTk9SRQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSElEX1FVSVJLX05PR0VUCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgSElEX1FVSVJLX0hJRERFVgkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgSElEX1FVSVJLX0JBRFBBRAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgSElEX1FVSVJLX01VTFRJX0lOUFVUCQkJMHgwMDAwMDA0MAorI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNwkJMHgwMDAwMDA4MAorI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNQkJMHgwMDAwMDEwMAorI2RlZmluZSBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfT04JCTB4MDAwMDAyMDAKKyNkZWZpbmUgSElEX1FVSVJLX01JR0hUWU1PVVNFCQkJMHgwMDAwMDQwMAorI2RlZmluZSBISURfUVVJUktfQ1lNT1RJT04JCQkweDAwMDAwODAwCisjZGVmaW5lIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOCQkweDAwMDAxMDAwCisjZGVmaW5lIEhJRF9RVUlSS19QT1dFUkJPT0tfRk5fT04JCTB4MDAwMDIwMDAKKyNkZWZpbmUgSElEX1FVSVJLX0lOVkVSVF9IV0hFRUwJCQkweDAwMDA0MDAwCisjZGVmaW5lIEhJRF9RVUlSS19QT1dFUkJPT0tfSVNPX0tFWUJPQVJEICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhJRF9RVUlSS19CQURfUkVMQVRJVkVfS0VZUwkJMHgwMDAxMDAwMAorCisvKgorICogVGhpcyBpcyB0aGUgZ2xvYmFsIGVudmlyb25tZW50IG9mIHRoZSBwYXJzZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMKKyAqIHBlcnNpc3RlbnQgZm9yIG1haW4taXRlbXMuIFRoZSBnbG9iYWwgZW52aXJvbm1lbnQgY2FuIGJlIHNhdmVkIGFuZAorICogcmVzdG9yZWQgd2l0aCBQVVNIL1BPUCBzdGF0ZW1lbnRzLgorICovCisKK3N0cnVjdCBoaWRfZ2xvYmFsIHsKKwl1bnNpZ25lZCB1c2FnZV9wYWdlOworCV9fczMyICAgIGxvZ2ljYWxfbWluaW11bTsKKwlfX3MzMiAgICBsb2dpY2FsX21heGltdW07CisJX19zMzIgICAgcGh5c2ljYWxfbWluaW11bTsKKwlfX3MzMiAgICBwaHlzaWNhbF9tYXhpbXVtOworCV9fczMyICAgIHVuaXRfZXhwb25lbnQ7CisJdW5zaWduZWQgdW5pdDsKKwl1bnNpZ25lZCByZXBvcnRfaWQ7CisJdW5zaWduZWQgcmVwb3J0X3NpemU7CisJdW5zaWduZWQgcmVwb3J0X2NvdW50OworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGxvY2FsIGVudmlyb25tZW50LiBJdCBpcyBwZXJzaXN0ZW50IHVwIHRoZSBuZXh0IG1haW4taXRlbS4KKyAqLworCisjZGVmaW5lIEhJRF9NQVhfREVTQ1JJUFRPUl9TSVpFCQk0MDk2CisjZGVmaW5lIEhJRF9NQVhfVVNBR0VTCQkJMTAyNAorI2RlZmluZSBISURfREVGQVVMVF9OVU1fQ09MTEVDVElPTlMJMTYKKworc3RydWN0IGhpZF9sb2NhbCB7CisJdW5zaWduZWQgdXNhZ2VbSElEX01BWF9VU0FHRVNdOyAvKiB1c2FnZSBhcnJheSAqLworCXVuc2lnbmVkIGNvbGxlY3Rpb25faW5kZXhbSElEX01BWF9VU0FHRVNdOyAvKiBjb2xsZWN0aW9uIGluZGV4IGFycmF5ICovCisJdW5zaWduZWQgdXNhZ2VfaW5kZXg7CisJdW5zaWduZWQgdXNhZ2VfbWluaW11bTsKKwl1bnNpZ25lZCBkZWxpbWl0ZXJfZGVwdGg7CisJdW5zaWduZWQgZGVsaW1pdGVyX2JyYW5jaDsKK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjb2xsZWN0aW9uIHN0YWNrLiBXZSBjbGltYiB1cCB0aGUgc3RhY2sgdG8gZGV0ZXJtaW5lCisgKiBhcHBsaWNhdGlvbiBhbmQgZnVuY3Rpb24gb2YgZWFjaCBmaWVsZC4KKyAqLworCitzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24geworCXVuc2lnbmVkIHR5cGU7CisJdW5zaWduZWQgdXNhZ2U7CisJdW5zaWduZWQgbGV2ZWw7Cit9OworCitzdHJ1Y3QgaGlkX3VzYWdlIHsKKwl1bnNpZ25lZCAgaGlkOwkJCS8qIGhpZCB1c2FnZSBjb2RlICovCisJdW5zaWduZWQgIGNvbGxlY3Rpb25faW5kZXg7CS8qIGluZGV4IGludG8gY29sbGVjdGlvbiBhcnJheSAqLworCS8qIGhpZGlucHV0IGRhdGEgKi8KKwlfX3UxNiAgICAgY29kZTsJCQkvKiBpbnB1dCBkcml2ZXIgY29kZSAqLworCV9fdTggICAgICB0eXBlOwkJCS8qIGlucHV0IGRyaXZlciB0eXBlICovCisJX19zOAkgIGhhdF9taW47CQkvKiBoYXQgc3dpdGNoIGZ1biAqLworCV9fczgJICBoYXRfbWF4OwkJLyogZGl0dG8gKi8KKwlfX3M4CSAgaGF0X2RpcjsJCS8qIGRpdHRvICovCit9OworCitzdHJ1Y3QgaGlkX2lucHV0OworCitzdHJ1Y3QgaGlkX2ZpZWxkIHsKKwl1bnNpZ25lZCAgcGh5c2ljYWw7CQkvKiBwaHlzaWNhbCB1c2FnZSBmb3IgdGhpcyBmaWVsZCAqLworCXVuc2lnbmVkICBsb2dpY2FsOwkJLyogbG9naWNhbCB1c2FnZSBmb3IgdGhpcyBmaWVsZCAqLworCXVuc2lnbmVkICBhcHBsaWNhdGlvbjsJCS8qIGFwcGxpY2F0aW9uIHVzYWdlIGZvciB0aGlzIGZpZWxkICovCisJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2U7CS8qIHVzYWdlIHRhYmxlIGZvciB0aGlzIGZ1bmN0aW9uICovCisJdW5zaWduZWQgIG1heHVzYWdlOwkJLyogbWF4aW11bSB1c2FnZSBpbmRleCAqLworCXVuc2lnbmVkICBmbGFnczsJCS8qIG1haW4taXRlbSBmbGFncyAoaS5lLiB2b2xhdGlsZSxhcnJheSxjb25zdGFudCkgKi8KKwl1bnNpZ25lZCAgcmVwb3J0X29mZnNldDsJLyogYml0IG9mZnNldCBpbiB0aGUgcmVwb3J0ICovCisJdW5zaWduZWQgIHJlcG9ydF9zaXplOwkJLyogc2l6ZSBvZiB0aGlzIGZpZWxkIGluIHRoZSByZXBvcnQgKi8KKwl1bnNpZ25lZCAgcmVwb3J0X2NvdW50OwkJLyogbnVtYmVyIG9mIHRoaXMgZmllbGQgaW4gdGhlIHJlcG9ydCAqLworCXVuc2lnbmVkICByZXBvcnRfdHlwZTsJCS8qIChpbnB1dCxvdXRwdXQsZmVhdHVyZSkgKi8KKwlfX3MzMiAgICAqdmFsdWU7CQkvKiBsYXN0IGtub3duIHZhbHVlKHMpICovCisJX19zMzIgICAgIGxvZ2ljYWxfbWluaW11bTsKKwlfX3MzMiAgICAgbG9naWNhbF9tYXhpbXVtOworCV9fczMyICAgICBwaHlzaWNhbF9taW5pbXVtOworCV9fczMyICAgICBwaHlzaWNhbF9tYXhpbXVtOworCV9fczMyICAgICB1bml0X2V4cG9uZW50OworCXVuc2lnbmVkICB1bml0OworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CS8qIGFzc29jaWF0ZWQgcmVwb3J0ICovCisJdW5zaWduZWQgaW5kZXg7CQkJLyogaW5kZXggaW50byByZXBvcnQtPmZpZWxkW10gKi8KKwkvKiBoaWRpbnB1dCBkYXRhICovCisJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQ7CS8qIGFzc29jaWF0ZWQgaW5wdXQgc3RydWN0dXJlICovCisJX191MTYgZHBhZDsJCQkvKiBkcGFkIGlucHV0IGNvZGUgKi8KK307CisKKyNkZWZpbmUgSElEX01BWF9GSUVMRFMgNjQKKworc3RydWN0IGhpZF9yZXBvcnQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpZDsJCQkJCS8qIGlkIG9mIHRoaXMgcmVwb3J0ICovCisJdW5zaWduZWQgdHlwZTsJCQkJCS8qIHJlcG9ydCB0eXBlICovCisJc3RydWN0IGhpZF9maWVsZCAqZmllbGRbSElEX01BWF9GSUVMRFNdOwkvKiBmaWVsZHMgb2YgdGhlIHJlcG9ydCAqLworCXVuc2lnbmVkIG1heGZpZWxkOwkJCQkvKiBtYXhpbXVtIHZhbGlkIGZpZWxkIGluZGV4ICovCisJdW5zaWduZWQgc2l6ZTsJCQkJCS8qIHNpemUgb2YgdGhlIHJlcG9ydCAoYml0cykgKi8KKwlzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlOwkJCS8qIGFzc29jaWF0ZWQgZGV2aWNlICovCit9OworCitzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtIHsKKwl1bnNpZ25lZCBudW1iZXJlZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlcG9ydF9saXN0OworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnRfaWRfaGFzaFsyNTZdOworfTsKKworI2RlZmluZSBISURfUkVQT1JUX1RZUEVTIDMKKworI2RlZmluZSBISURfTUlOX0JVRkZFUl9TSVpFCTY0CQkvKiBtYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3QgYSBwYWNrZXQgc2l6ZSBvZiBzcGFjZSAqLworI2RlZmluZSBISURfTUFYX0JVRkZFUl9TSVpFCTQwOTYJCS8qIDRrYiAqLworI2RlZmluZSBISURfQ09OVFJPTF9GSUZPX1NJWkUJMjU2CQkvKiB0byBpbml0IGRldmljZXMgd2l0aCA+MTAwIHJlcG9ydHMgKi8KKyNkZWZpbmUgSElEX09VVFBVVF9GSUZPX1NJWkUJNjQKKworc3RydWN0IGhpZF9jb250cm9sX2ZpZm8geworCXVuc2lnbmVkIGNoYXIgZGlyOworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Cit9OworCisjZGVmaW5lIEhJRF9DTEFJTUVEX0lOUFVUCTEKKyNkZWZpbmUgSElEX0NMQUlNRURfSElEREVWCTIKKworI2RlZmluZSBISURfQ1RSTF9SVU5OSU5HCTEKKyNkZWZpbmUgSElEX09VVF9SVU5OSU5HCQkyCisjZGVmaW5lIEhJRF9JTl9SVU5OSU5HCQkzCisjZGVmaW5lIEhJRF9SRVNFVF9QRU5ESU5HCTQKKyNkZWZpbmUgSElEX1NVU1BFTkRFRAkJNQorI2RlZmluZSBISURfQ0xFQVJfSEFMVAkJNgorCitzdHJ1Y3QgaGlkX2lucHV0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKK307CisKK3N0cnVjdCBoaWRfZGV2aWNlIHsJCQkJCQkJLyogZGV2aWNlIHJlcG9ydCBkZXNjcmlwdG9yICovCisJIF9fdTggKnJkZXNjOworCXVuc2lnbmVkIHJzaXplOworCXN0cnVjdCBoaWRfY29sbGVjdGlvbiAqY29sbGVjdGlvbjsJCQkJLyogTGlzdCBvZiBISUQgY29sbGVjdGlvbnMgKi8KKwl1bnNpZ25lZCBjb2xsZWN0aW9uX3NpemU7CQkJCQkvKiBOdW1iZXIgb2YgYWxsb2NhdGVkIGhpZF9jb2xsZWN0aW9ucyAqLworCXVuc2lnbmVkIG1heGNvbGxlY3Rpb247CQkJCQkJLyogTnVtYmVyIG9mIHBhcnNlZCBjb2xsZWN0aW9ucyAqLworCXVuc2lnbmVkIG1heGFwcGxpY2F0aW9uOwkJCQkJLyogTnVtYmVyIG9mIGFwcGxpY2F0aW9ucyAqLworCXVuc2lnbmVkIHNob3J0IGJ1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVVMgSUQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVuZG9yIElEICovCisJdW5zaWduZWQgc2hvcnQgcHJvZHVjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2R1Y3QgSUQgKi8KKwl1bnNpZ25lZCB2ZXJzaW9uOwkJCQkJCS8qIEhJRCB2ZXJzaW9uICovCisJdW5zaWduZWQgY291bnRyeTsJCQkJCQkvKiBISUQgY291bnRyeSAqLworCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gcmVwb3J0X2VudW1bSElEX1JFUE9SVF9UWVBFU107CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkJCQkJLyogZGV2aWNlICovCisKKwl1bnNpZ25lZCBjbGFpbWVkOwkJCQkJCS8qIENsYWltZWQgYnkgaGlkaW5wdXQsIGhpZGRldj8gKi8KKwl1bnNpZ25lZCBxdWlya3M7CQkJCQkJLyogVmFyaW91cyBxdWlya3MgdGhlIGRldmljZSBjYW4gcHVsbCBvbiB1cyAqLworCisJc3RydWN0IGxpc3RfaGVhZCBpbnB1dHM7CQkJCQkvKiBUaGUgbGlzdCBvZiBpbnB1dHMgKi8KKwl2b2lkICpoaWRkZXY7CQkJCQkJCS8qIFRoZSBoaWRkZXYgc3RydWN0dXJlICovCisJaW50IG1pbm9yOwkJCQkJCQkvKiBIaWRkZXYgbWlub3IgbnVtYmVyICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkJCQkJCS8qIEZvciBzbGVlcGluZyAqLworCisJaW50IG9wZW47CQkJCQkJCS8qIGlzIHRoZSBkZXZpY2Ugb3BlbiBieSBhbnlvbmU/ICovCisJY2hhciBuYW1lWzEyOF07CQkJCQkJCS8qIERldmljZSBuYW1lICovCisJY2hhciBwaHlzWzY0XTsJCQkJCQkJLyogRGV2aWNlIHBoeXNpY2FsIGxvY2F0aW9uICovCisJY2hhciB1bmlxWzY0XTsJCQkJCQkJLyogRGV2aWNlIHVuaXF1ZSBpZGVudGlmaWVyIChzZXJpYWwgIykgKi8KKworCXZvaWQgKmRyaXZlcl9kYXRhOworCisJLyogZGV2aWNlLXNwZWNpZmljIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJaW50ICgqaGlkaW5wdXRfaW5wdXRfZXZlbnQpIChzdHJ1Y3QgaW5wdXRfZGV2ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBpbnQpOworCWludCAoKmhpZGlucHV0X29wZW4pIChzdHJ1Y3QgaW5wdXRfZGV2ICopOworCXZvaWQgKCpoaWRpbnB1dF9jbG9zZSkgKHN0cnVjdCBpbnB1dF9kZXYgKik7CisKKwkvKiBoaWRkZXYgZXZlbnQgaGFuZGxlciAqLworCXZvaWQgKCpoaWRkZXZfaGlkX2V2ZW50KSAoc3RydWN0IGhpZF9kZXZpY2UgKiwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCQkJICBzdHJ1Y3QgaGlkX3VzYWdlICosIF9fczMyKTsKKwl2b2lkICgqaGlkZGV2X3JlcG9ydF9ldmVudCkgKHN0cnVjdCBoaWRfZGV2aWNlICosIHN0cnVjdCBoaWRfcmVwb3J0ICopOworI2lmZGVmIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LCisJdW5zaWduZWQgaW50ICBwYl9mbm1vZGU7CisJdW5zaWduZWQgbG9uZyBwYl9wcmVzc2VkX2ZuW05CSVRTKEtFWV9NQVgpXTsKKwl1bnNpZ25lZCBsb25nIHBiX3ByZXNzZWRfbnVtbG9ja1tOQklUUyhLRVlfTUFYKV07CisjZW5kaWYKK307CisKKyNkZWZpbmUgSElEX0dMT0JBTF9TVEFDS19TSVpFIDQKKyNkZWZpbmUgSElEX0NPTExFQ1RJT05fU1RBQ0tfU0laRSA0CisKK3N0cnVjdCBoaWRfcGFyc2VyIHsKKwlzdHJ1Y3QgaGlkX2dsb2JhbCAgICAgZ2xvYmFsOworCXN0cnVjdCBoaWRfZ2xvYmFsICAgICBnbG9iYWxfc3RhY2tbSElEX0dMT0JBTF9TVEFDS19TSVpFXTsKKwl1bnNpZ25lZCAgICAgICAgICAgICAgZ2xvYmFsX3N0YWNrX3B0cjsKKwlzdHJ1Y3QgaGlkX2xvY2FsICAgICAgbG9jYWw7CisJdW5zaWduZWQgICAgICAgICAgICAgIGNvbGxlY3Rpb25fc3RhY2tbSElEX0NPTExFQ1RJT05fU1RBQ0tfU0laRV07CisJdW5zaWduZWQgICAgICAgICAgICAgIGNvbGxlY3Rpb25fc3RhY2tfcHRyOworCXN0cnVjdCBoaWRfZGV2aWNlICAgICpkZXZpY2U7Cit9OworCitzdHJ1Y3QgaGlkX2NsYXNzX2Rlc2NyaXB0b3IgeworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3UxNiB3RGVzY3JpcHRvckxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaGlkX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTE2IGJjZEhJRDsKKwlfX3U4ICBiQ291bnRyeUNvZGU7CisJX191OCAgYk51bURlc2NyaXB0b3JzOworCisJc3RydWN0IGhpZF9jbGFzc19kZXNjcmlwdG9yIGRlc2NbMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2lmZGVmIERFQlVHCisjaW5jbHVkZSAiaGlkLWRlYnVnLmgiCisjZWxzZQorI2RlZmluZSBoaWRfZHVtcF9pbnB1dChhLGIpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaGlkX2R1bXBfZGV2aWNlKGMpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaGlkX2R1bXBfZmllbGQoYSxiKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHJlc29sdl91c2FnZShhKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSByZXNvbHZfZXZlbnQoYSxiKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogQXBwbGljYXRpb25zIGZyb20gSElEIFVzYWdlIFRhYmxlcyA0LzgvOTkgVmVyc2lvbiAxLjEgKi8KKy8qIFdlIGlnbm9yZSBhIGZldyBpbnB1dCBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgbm90IHdpZGVseSB1c2VkICovCisjZGVmaW5lIElTX0lOUFVUX0FQUExJQ0FUSU9OKGEpICgoKGEgPj0gMHgwMDAxMDAwMCkgJiYgKGEgPD0gMHgwMDAxMDAwOCkpIHx8IChhID09IDB4MDAwMTAwODApIHx8IChhID09IDB4MDAwYzAwMDEpKQorCisvKiBISUQgY29yZSBBUEkgKi8KK2V4dGVybiB2b2lkIGhpZGlucHV0X2hpZF9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqLCBzdHJ1Y3QgaGlkX2ZpZWxkICosIHN0cnVjdCBoaWRfdXNhZ2UgKiwgX19zMzIpOworZXh0ZXJuIHZvaWQgaGlkaW5wdXRfcmVwb3J0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpOworZXh0ZXJuIGludCBoaWRpbnB1dF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgaGlkaW5wdXRfZGlzY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqKTsKKworaW50IGhpZF9zZXRfZmllbGQoc3RydWN0IGhpZF9maWVsZCAqLCB1bnNpZ25lZCwgX19zMzIpOworaW50IGhpZF9pbnB1dF9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKiwgaW50IHR5cGUsIHU4ICosIGludCwgaW50KTsKK2ludCBoaWRpbnB1dF9maW5kX2ZpZWxkKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgc3RydWN0IGhpZF9maWVsZCAqKmZpZWxkKTsKK3ZvaWQgaGlkX2lucHV0X2ZpZWxkKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBfX3U4ICpkYXRhLCBpbnQgaW50ZXJydXB0KTsKK3ZvaWQgaGlkX291dHB1dF9yZXBvcnQoc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwgX191OCAqZGF0YSk7Cit2b2lkIGhpZF9mcmVlX2RldmljZShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlKTsKK3N0cnVjdCBoaWRfZGV2aWNlICpoaWRfcGFyc2VfcmVwb3J0KF9fdTggKnN0YXJ0LCB1bnNpZ25lZCBzaXplKTsKKworI2lmZGVmIENPTkZJR19ISURfRkYKK2ludCBoaWRfZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKKworaW50IGhpZF9sZ2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CitpbnQgaGlkX3RtZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKK2ludCBoaWRfenBmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpOworI2lmZGVmIENPTkZJR19ISURfUElECitpbnQgaGlkX3BpZGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaGlkX3BpZGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkgeyByZXR1cm4gLUVOT0RFVjsgfQorI2VuZGlmCisKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBoaWRfZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKSB7IHJldHVybiAtMTsgfQorI2VuZGlmCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICJcbiIgLCBcCisJCV9fRklMRV9fICwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSICIlczogIiBmb3JtYXQgIlxuIiAsIFwKKwkJX19GSUxFX18gLCAjIyBhcmcpCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWdobWVtLmggYi9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaAppbmRleCBmZDdkMTJkLi5jYTlhNjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCkBAIC00MSw5ICs0MiwxMCBAQAogCiAjZGVmaW5lIGt1bm1hcChwYWdlKSBkbyB7ICh2b2lkKSAocGFnZSk7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUga21hcF9hdG9taWMocGFnZSwgaWR4KQkJcGFnZV9hZGRyZXNzKHBhZ2UpCi0jZGVmaW5lIGt1bm1hcF9hdG9taWMoYWRkciwgaWR4KQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGttYXBfYXRvbWljX3BmbihwZm4sIGlkeCkJcGFnZV9hZGRyZXNzKHBmbl90b19wYWdlKHBmbikpCisjZGVmaW5lIGttYXBfYXRvbWljKHBhZ2UsIGlkeCkgXAorCSh7IHBhZ2VmYXVsdF9kaXNhYmxlKCk7IHBhZ2VfYWRkcmVzcyhwYWdlKTsgfSkKKyNkZWZpbmUga3VubWFwX2F0b21pYyhhZGRyLCBpZHgpCWRvIHsgcGFnZWZhdWx0X2VuYWJsZSgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBrbWFwX2F0b21pY19wZm4ocGZuLCBpZHgpCWttYXBfYXRvbWljKHBmbl90b19wYWdlKHBmbiksIChpZHgpKQogI2RlZmluZSBrbWFwX2F0b21pY190b19wYWdlKHB0cikJdmlydF90b19wYWdlKHB0cikKICNlbmRpZgogCkBAIC05NCw3ICs5NiwxMCBAQAogCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLCB1bnNpZ25lZCBsb25nIHZhZGRyKQorI2lmbmRlZiBfX0hBVkVfQVJDSF9DT1BZX1VTRVJfSElHSFBBR0UKKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tLAorCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWNoYXIgKnZmcm9tLCAqdnRvOwogCkBAIC0xMDcsNiArMTEyLDggQEAKIAlzbXBfd21iKCk7CiB9CiAKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqdG8sIHN0cnVjdCBwYWdlICpmcm9tKQogewogCWNoYXIgKnZmcm9tLCAqdnRvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odGlycS5oIGIvaW5jbHVkZS9saW51eC9odGlycS5oCmluZGV4IDFmMTVjZTIuLmM5NmVhNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHRpcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h0aXJxLmgKQEAgLTEsMTUgKzEsMjMgQEAKICNpZm5kZWYgTElOVVhfSFRJUlFfSAogI2RlZmluZSBMSU5VWF9IVElSUV9ICiAKK3N0cnVjdCBodF9pcnFfbXNnIHsKKwl1MzIJYWRkcmVzc19sbzsJLyogbG93IDMyIGJpdHMgb2YgdGhlIGh0IGlycSBtZXNzYWdlICovCisJdTMyCWFkZHJlc3NfaGk7CS8qIGhpZ2ggMzIgYml0cyBvZiB0aGUgaXQgaXJxIG1lc3NhZ2UgKi8KK307CisKIC8qIEhlbHBlciBmdW5jdGlvbnMuLiAqLwotdm9pZCB3cml0ZV9odF9pcnFfbG93KHVuc2lnbmVkIGludCBpcnEsIHUzMiBkYXRhKTsKLXZvaWQgd3JpdGVfaHRfaXJxX2hpZ2godW5zaWduZWQgaW50IGlycSwgdTMyIGRhdGEpOwotdTMyICByZWFkX2h0X2lycV9sb3codW5zaWduZWQgaW50IGlycSk7Ci11MzIgIHJlYWRfaHRfaXJxX2hpZ2godW5zaWduZWQgaW50IGlycSk7Cit2b2lkIGZldGNoX2h0X2lycV9tc2codW5zaWduZWQgaW50IGlycSwgc3RydWN0IGh0X2lycV9tc2cgKm1zZyk7Cit2b2lkIHdyaXRlX2h0X2lycV9tc2codW5zaWduZWQgaW50IGlycSwgc3RydWN0IGh0X2lycV9tc2cgKm1zZyk7CiB2b2lkIG1hc2tfaHRfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogdm9pZCB1bm1hc2tfaHRfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCiAvKiBUaGUgYXJjaCBob29rIGZvciBnZXR0aW5nIHRoaW5ncyBzdGFydGVkICovCiBpbnQgYXJjaF9zZXR1cF9odF9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHBjaV9kZXYgKmRldik7CiAKKy8qIEZvciBkcml2ZXJzIG9mIGJ1Z2d5IGhhcmR3YXJlICovCit0eXBlZGVmIHZvaWQgKGh0X2lycV91cGRhdGVfdCkoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlycSwKKwkJCSAgICAgICBzdHJ1Y3QgaHRfaXJxX21zZyAqbXNnKTsKK2ludCBfX2h0X2NyZWF0ZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlkeCwgaHRfaXJxX3VwZGF0ZV90ICp1cGRhdGUpOworCiAjZW5kaWYgLyogTElOVVhfSFRJUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odWdldGxiLmggYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAppbmRleCA1MDgxZDI3Li5hNjA5OTVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMzUsNiArMzUsNyBAQAogCiBwdGVfdCAqaHVnZV9wdGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcik7CiBwdGVfdCAqaHVnZV9wdGVfb2Zmc2V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOworaW50IGh1Z2VfcG1kX3Vuc2hhcmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgKmFkZHIsIHB0ZV90ICpwdGVwKTsKIHN0cnVjdCBwYWdlICpmb2xsb3dfaHVnZV9hZGRyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkgICAgICBpbnQgd3JpdGUpOwogc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLApAQCAtNjAsOCArNjEsMTEgQEAKICAqIElmIHRoZSBhcmNoIGRvZXNuJ3Qgc3VwcGx5IHNvbWV0aGluZyBlbHNlLCBhc3N1bWUgdGhhdCBodWdlcGFnZQogICogc2l6ZSBhbGlnbmVkIHJlZ2lvbnMgYXJlIG9rIHdpdGhvdXQgZnVydGhlciBwcmVwYXJhdGlvbi4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9odWdlcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQorc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9odWdlcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJCQkJcGdvZmZfdCBwZ29mZikKIHsKKwlpZiAocGdvZmYgJiAofkhQQUdFX01BU0sgPj4gUEFHRV9TSElGVCkpCisJCXJldHVybiAtRUlOVkFMOwogCWlmIChsZW4gJiB+SFBBR0VfTUFTSykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGFkZHIgJiB+SFBBR0VfTUFTSykKQEAgLTY5LDcgKzczLDggQEAKIAlyZXR1cm4gMDsKIH0KICNlbHNlCi1pbnQgcHJlcGFyZV9odWdlcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2ludCBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJCQlwZ29mZl90IHBnb2ZmKTsKICNlbmRpZgogCiAjaWZuZGVmIEFSQ0hfSEFTX1NFVENMRUFSX0hVR0VfUFRFCkBAIC0xMDcsNyArMTEyLDcgQEAKICNkZWZpbmUgaHVnZXRsYl9yZXBvcnRfbWVtaW5mbyhidWYpCQkwCiAjZGVmaW5lIGh1Z2V0bGJfcmVwb3J0X25vZGVfbWVtaW5mbyhuLCBidWYpCTAKICNkZWZpbmUgZm9sbG93X2h1Z2VfcG1kKG1tLCBhZGRyLCBwbWQsIHdyaXRlKQlOVUxMCi0jZGVmaW5lIHByZXBhcmVfaHVnZXBhZ2VfcmFuZ2UoYWRkciwgbGVuKQkoLUVJTlZBTCkKKyNkZWZpbmUgcHJlcGFyZV9odWdlcGFnZV9yYW5nZShhZGRyLGxlbixwZ29mZikJKC1FSU5WQUwpCiAjZGVmaW5lIHBtZF9odWdlKHgpCTAKICNkZWZpbmUgaXNfaHVnZXBhZ2Vfb25seV9yYW5nZShtbSwgYWRkciwgbGVuKQkwCiAjZGVmaW5lIGh1Z2V0bGJfZnJlZV9wZ2RfcmFuZ2UodGxiLCBhZGRyLCBlbmQsIGZsb29yLCBjZWlsaW5nKSAoe0JVRygpOyAwOyB9KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtYWxnby1iaXQuaCBiL2luY2x1ZGUvbGludXgvaTJjLWFsZ28tYml0LmgKaW5kZXggYzhmOGRmMi4uOTM3ZGE3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMtYWxnby1iaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLWJpdC5oCkBAIC0yNiw5ICsyNiw5IEBACiAKIC8qIC0tLSBEZWZpbmVzIGZvciBiaXQtYWRhcHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCiAvKgotICogVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIGh3LWRlcGVuZGVudCBmdW5jdGlvbnMgb2YgYml0LXN0eWxlIGFkYXB0ZXJzIHRvIAorICogVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIGh3LWRlcGVuZGVudCBmdW5jdGlvbnMgb2YgYml0LXN0eWxlIGFkYXB0ZXJzIHRvCiAgKiBtYW5pcHVsYXRlIHRoZSBsaW5lIHN0YXRlcywgYW5kIHRvIGluaXQgYW55IGh3LXNwZWNpZmljIGZlYXR1cmVzLiBUaGlzIGlzCi0gKiBvbmx5IHVzZWQgaWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBody10eXBlIG9mIGFkYXB0ZXIgcnVubmluZy4gCisgKiBvbmx5IHVzZWQgaWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBody10eXBlIG9mIGFkYXB0ZXIgcnVubmluZy4KICAqLwogc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIHsKIAl2b2lkICpkYXRhOwkJLyogcHJpdmF0ZSBkYXRhIGZvciBsb3dsZXZlbCByb3V0aW5lcyAqLwpAQCAtNDQsNiArNDQsNSBAQAogfTsKIAogaW50IGkyY19iaXRfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7Ci1pbnQgaTJjX2JpdF9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKIAogI2VuZGlmIC8qIF9MSU5VWF9JMkNfQUxHT19CSVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtYWxnby1pdGUuaCBiL2luY2x1ZGUvbGludXgvaTJjLWFsZ28taXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzNmZTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMtYWxnby1pdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIGkyYy1hbGdvLWl0ZS5oIGkyYyBkcml2ZXIgYWxnb3JpdGhtcyBmb3IgSVRFIElJQyBhZGFwdGVycyAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qICAgQ29weXJpZ2h0IChDKSAxOTk1LTk3IFNpbW9uIEcuIFZvZ2wKLSAgICAgICAgICAgICAgICAgICAxOTk4LTk5IEhhbnMgQmVyZ2x1bmQKLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBXaXRoIHNvbWUgY2hhbmdlcyBmcm9tIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiBhbmQgZXZlbgotICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAqLwotCi0vKiBNb2RpZmljYXRpb25zIGJ5IE1vbnRhVmlzdGEgU29mdHdhcmUsIDIwMDEKLSAgIENoYW5nZXMgbWFkZSB0byBzdXBwb3J0IHRoZSBJVEUgSUlDIHBlcmlwaGVyYWwgKi8KLQotCi0jaWZuZGVmIEkyQ19BTEdPX0lURV9ICi0jZGVmaW5lIEkyQ19BTEdPX0lURV9IIDEKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLS8qIEV4YW1wbGUgb2YgYSBzZXF1ZW50aWFsIHJlYWQgcmVxdWVzdDoKLQlzdHJ1Y3QgaTJjX2lpY19tc2cgc19tc2c7IAotCi0Jc19tc2cuYWRkcj1kZXZpY2VfYWRkcmVzczsKLQlzX21zZy5sZW49bGVuZ3RoOwotCXNfbXNnLmJ1Zj1idWZmZXI7Ci0Jc19tc2cud2FkZHI9d29yZF9hZGRyZXNzOwotCWlvY3RsKGZpbGUsSTJDX1NSRUFELCAmc19tc2cpOwotICovCi0jZGVmaW5lIEkyQ19TUkVBRAkweDc4MAkvKiBTUkVBRCBpb2N0bCBjb21tYW5kICovCi0KLXN0cnVjdCBpMmNfaWljX21zZyB7Ci0JX191MTYgYWRkcjsJLyogZGV2aWNlIGFkZHJlc3MgKi8KLQlfX3UxNiB3YWRkcjsJLyogd29yZCBhZGRyZXNzICovCi0Jc2hvcnQgbGVuOwkvKiBtc2cgbGVuZ3RoICovCi0JY2hhciAqYnVmOwkvKiBwb2ludGVyIHRvIG1zZyBkYXRhICovCi19OwotCi0jaWZkZWYgX19LRVJORUxfXwotc3RydWN0IGkyY19hZGFwdGVyOwotCi1zdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgewotCXZvaWQgKmRhdGE7CQkvKiBwcml2YXRlIGRhdGEgZm9yIGxvbGV2ZWwgcm91dGluZXMJKi8KLQl2b2lkICgqc2V0aWljKSAodm9pZCAqZGF0YSwgaW50IGN0bCwgaW50IHZhbCk7Ci0JaW50ICAoKmdldGlpYykgKHZvaWQgKmRhdGEsIGludCBjdGwpOwotCWludCAgKCpnZXRvd24pICh2b2lkICpkYXRhKTsKLQlpbnQgICgqZ2V0Y2xvY2spICh2b2lkICpkYXRhKTsKLQl2b2lkICgqd2FpdGZvcnBpbikgKHZvaWQpOyAgICAgCi0KLQkvKiBsb2NhbCBzZXR0aW5ncyAqLwotCWludCB1ZGVsYXk7Ci0JaW50IG1kZWxheTsKLQlpbnQgdGltZW91dDsKLX07Ci0KLWludCBpMmNfaWljX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICopOwotaW50IGkyY19paWNfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7Ci0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotI2VuZGlmIC8qIEkyQ19BTEdPX0lURV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLXBjYS5oIGIvaW5jbHVkZS9saW51eC9pMmMtYWxnby1wY2EuaAppbmRleCAyMjY2OTNlLi5mY2U0N2MwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLXBjYS5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWFsZ28tcGNhLmgKQEAgLTEwLDYgKzEwLDUgQEAKIH07CiAKIGludCBpMmNfcGNhX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICopOwotaW50IGkyY19wY2FfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CiAKICNlbmRpZiAvKiBfTElOVVhfSTJDX0FMR09fUENBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLWFsZ28tcGNmLmggYi9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLXBjZi5oCmluZGV4IDk5MDhmM2YuLjk5NGViODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLWFsZ28tcGNmLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtYWxnby1wY2YuaApAQCAtMzEsNyArMzEsNyBAQAogCWludCAgKCpnZXRwY2YpICh2b2lkICpkYXRhLCBpbnQgY3RsKTsKIAlpbnQgICgqZ2V0b3duKSAodm9pZCAqZGF0YSk7CiAJaW50ICAoKmdldGNsb2NrKSAodm9pZCAqZGF0YSk7Ci0Jdm9pZCAoKndhaXRmb3JwaW4pICh2b2lkKTsgICAgIAorCXZvaWQgKCp3YWl0Zm9ycGluKSAodm9pZCk7CiAKIAkvKiBsb2NhbCBzZXR0aW5ncyAqLwogCWludCB1ZGVsYXk7CkBAIC0zOSw2ICszOSw1IEBACiB9OwogCiBpbnQgaTJjX3BjZl9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKLWludCBpMmNfcGNmX2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICopOwogCiAjZW5kaWYgLyogX0xJTlVYX0kyQ19BTEdPX1BDRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLXNnaS5oIGIvaW5jbHVkZS9saW51eC9pMmMtYWxnby1zZ2kuaAppbmRleCA0YTAxMTNkLi4zYjc3MTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLXNnaS5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWFsZ28tc2dpLmgKQEAgLTIyLDYgKzIyLDUgQEAKIH07CiAKIGludCBpMmNfc2dpX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICopOwotaW50IGkyY19zZ2lfZGVsX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CiAKICNlbmRpZiAvKiBJMkNfQUxHT19TR0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtaWQuaCBiL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKaW5kZXggMGE4Zjc1MGMuLmQzODc3OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtaWQuaApAQCAtMSw3ICsxLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIAkJCQkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkJICAgICAqLwogLyogaTJjLWlkLmggLSBpZGVudGlmaWVyIHZhbHVlcyBmb3IgaTJjIGRyaXZlcnMgYW5kIGFkYXB0ZXJzCQkgICAgICovCi0vKiAJCQkJCQkJCQkgICAgICovCisvKgkJCQkJCQkJCSAgICAgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTkgU2ltb24gRy4gVm9nbAogCkBAIC00MCwxMCArNDAsMTAgQEAKICNkZWZpbmUgSTJDX0RSSVZFUklEX1NBQTcxMjAJMTEJLyogdmlkZW8gZW5jb2RlcgkJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX1NBQTcxMjEJMTIJLyogdmlkZW8gZW5jb2RlcgkJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX1NBQTcxODVCCTEzCS8qIHZpZGVvIGVuY29kZXIJCSovCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9DSDcwMDMJMTQJLyogZGlnaXRhbCBwYyB0byB0diBlbmNvZGVyIAkqLworI2RlZmluZSBJMkNfRFJJVkVSSURfQ0g3MDAzCTE0CS8qIGRpZ2l0YWwgcGMgdG8gdHYgZW5jb2RlcgkqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfUENGODU3NEEJMTUJLyogaTJjIGV4cGFuZGVyIC0gOCBiaXQgaW4vb3V0CSovCiAjZGVmaW5lIEkyQ19EUklWRVJJRF9QQ0Y4NTgyQwkxNgkvKiBlZXByb20JCQkqLwotI2RlZmluZSBJMkNfRFJJVkVSSURfQVQyNEN4eAkxNwkvKiBlZXByb20gMS8yLzQvOC8xNiBLIAkJKi8KKyNkZWZpbmUgSTJDX0RSSVZFUklEX0FUMjRDeHgJMTcJLyogZWVwcm9tIDEvMi80LzgvMTYgSwkJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX1RFQTYzMDAJMTgJLyogYXVkaW8gbWl4ZXIJCQkqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfQlQ4MjkJMTkJLyogcGMgdG8gdHYgZW5jb2RlcgkJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX1REQTk4NTAJMjAJLyogYXVkaW8gbWl4ZXIJCQkqLwpAQCAtODIsOSArODIsOCBAQAogI2RlZmluZSBJMkNfRFJJVkVSSURfU1RNNDFUMDAJNTIJLyogcmVhbCB0aW1lIGNsb2NrCQkqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfVURBMTM0Mgk1MwkvKiBVREExMzQyIGF1ZGlvIGNvZGVjCQkqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfQURWNzE3MAk1NAkvKiB2aWRlbyBlbmNvZGVyCQkqLwotI2RlZmluZSBJMkNfRFJJVkVSSURfUkFERU9OCTU1CS8qIEkyQyBidXMgb24gUmFkZW9uIGJvYXJkcwkqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfTUFYMTYxNwk1NgkvKiB0ZW1wIHNlbnNvcgkJCSovCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9TQUE3MTkxCTU3CS8qIHZpZGVvIGVuY29kZXIJCSovCisjZGVmaW5lIEkyQ19EUklWRVJJRF9TQUE3MTkxCTU3CS8qIHZpZGVvIGRlY29kZXIJCSovCiAjZGVmaW5lIEkyQ19EUklWRVJJRF9JTkRZQ0FNCTU4CS8qIFNHSSBJbmR5Q2FtCQkJKi8KICNkZWZpbmUgSTJDX0RSSVZFUklEX0JUODMyCTU5CS8qIENNT1MgY2FtZXJhIHZpZGVvIHByb2Nlc3NvcgkqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfVERBOTg4Nwk2MAkvKiBUREE5ODh4IElGLVBMTCBkZW1vZHVsYXRvcgkqLwpAQCAtMTMyLDcgKzEzMSw2IEBACiAjZGVmaW5lIEkyQ19EUklWRVJJRF9BRE0xMDIxIDEwMDgKICNkZWZpbmUgSTJDX0RSSVZFUklEX0FETTkyNDAgMTAwOQogI2RlZmluZSBJMkNfRFJJVkVSSURfTFRDMTcxMCAxMDEwCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9JQ1NQTEwgMTAxMgogI2RlZmluZSBJMkNfRFJJVkVSSURfQlQ4NjkgMTAxMwogI2RlZmluZSBJMkNfRFJJVkVSSURfTUFYSUxJRkUgMTAxNAogI2RlZmluZSBJMkNfRFJJVkVSSURfTUFUT1JCIDEwMTUKQEAgLTE0NCw3ICsxNDIsNiBAQAogI2RlZmluZSBJMkNfRFJJVkVSSURfTVRQMDA4IDEwMjMKICNkZWZpbmUgSTJDX0RSSVZFUklEX0RTMTYyMSAxMDI0CiAjZGVmaW5lIEkyQ19EUklWRVJJRF9BRE0xMDI0IDEwMjUKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0lUODcgMTAyNgogI2RlZmluZSBJMkNfRFJJVkVSSURfQ0g3MDBYIDEwMjcgLyogc2luZ2xlIGRyaXZlciBmb3IgQ0g3MDAzLTcwMDkgZGlnaXRhbCBwYyB0byB0diBlbmNvZGVycyAqLwogI2RlZmluZSBJMkNfRFJJVkVSSURfRlNDUE9TIDEwMjgKICNkZWZpbmUgSTJDX0RSSVZFUklEX0ZTQ1NDWSAxMDI5CkBAIC0xNTksMTIgKzE1NiwxMyBAQAogI2RlZmluZSBJMkNfRFJJVkVSSURfQVNCMTAwIDEwNDMKICNkZWZpbmUgSTJDX0RSSVZFUklEX0ZTQ0hFUiAxMDQ2CiAjZGVmaW5lIEkyQ19EUklWRVJJRF9XODNMNzg1VFMgMTA0NworI2RlZmluZSBJMkNfRFJJVkVSSURfT1Y3NjcwIDEwNDgJLyogT21uaXZpc2lvbiA3NjcwIGNhbWVyYSAqLwogCiAvKgogICogLS0tLSBBZGFwdGVyIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCi0vKiAtLS0gQml0IGFsZ29yaXRobSBhZGFwdGVycyAJCQkJCQkqLworLyogLS0tIEJpdCBhbGdvcml0aG0gYWRhcHRlcnMJCQkJCQkqLwogI2RlZmluZSBJMkNfSFdfQl9MUAkJMHgwMTAwMDAgLyogUGFyYWxsZWwgcG9ydCBQaGlsaXBzIHN0eWxlICovCiAjZGVmaW5lIEkyQ19IV19CX1NFUgkJMHgwMTAwMDIgLyogU2VyaWFsIGxpbmUgaW50ZXJmYWNlICovCiAjZGVmaW5lIEkyQ19IV19CX0JUODQ4CQkweDAxMDAwNSAvKiBCVDg0OCB2aWRlbyBib2FyZHMgKi8KQEAgLTIxMiw5ICsyMTAsNiBAQAogLyogLS0tIE1QQzh4eCBQb3dlclBDIGFkYXB0ZXJzCQkJCQkJKi8KICNkZWZpbmUgSTJDX0hXX01QQzhYWF9FUE9OCTB4MTEwMDAwIC8qIEVwb255bW91cyBNUEM4eHggSTJDIGFkYXB0ZXIgKi8KIAotLyogLS0tIElURSBiYXNlZCBhbGdvcml0aG1zCQkJCQkJKi8KLSNkZWZpbmUgSTJDX0hXX0lfSUlDCQkweDA4MDAwMCAvKiBjb250cm9sbGVyIG9uIHRoZSBJVEUgKi8KLQogLyogLS0tIFBvd2VyUEMgb24tY2hpcCBhZGFwdGVycwkJCQkJCSovCiAjZGVmaW5lIEkyQ19IV19PQ1AJCTB4MTIwMDAwIC8qIElCTSBvbi1jaGlwIEkyQyBhZGFwdGVyICovCiAKQEAgLTI1MCw2ICsyNDUsNyBAQAogI2RlZmluZSBJMkNfSFdfU01CVVNfT1Y1MTgJMHgwNDAwMGYgLyogT1Y1MTgoKykgVVNCIDEuMSB3ZWJjYW0gSUNzICovCiAjZGVmaW5lIEkyQ19IV19TTUJVU19PVjUxOQkweDA0MDAxMCAvKiBPVjUxOSBVU0IgMS4xIHdlYmNhbSBJQyAqLwogI2RlZmluZSBJMkNfSFdfU01CVVNfT1ZGWDIJMHgwNDAwMTEgLyogQ3lwcmVzcy9PbW5pVmlzaW9uIEZYMiB3ZWJjYW0gKi8KKyNkZWZpbmUgSTJDX0hXX1NNQlVTX0NBRkUJMHgwNDAwMTIgLyogTWFydmVsbCA4OEFMUDAxICJDQUZFIiBjYW0gICovCiAKIC8qIC0tLSBJU0EgcHNldWRvLWFkYXB0ZXIJCQkJCQkqLwogI2RlZmluZSBJMkNfSFdfSVNBCQkweDA1MDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtcG54LmggYi9pbmNsdWRlL2xpbnV4L2kyYy1wbnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmU5YzgxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtcG54LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIEhlYWRlciBmaWxlIGZvciBJMkMgc3VwcG9ydCBvbiBQTlgwMTB4LzQwMDguCisgKgorICogQXV0aG9yOiBEZW5uaXMgS292YWxldiA8ZGtvdmFsZXZAcnUubXZpc3RhLmNvbT4KKyAqCisgKiAyMDA0LTIwMDYgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfX0kyQ19QTlhfSF9fCisjZGVmaW5lIF9fSTJDX1BOWF9IX18KKworI2luY2x1ZGUgPGFzbS9hcmNoL2kyYy5oPgorCitzdHJ1Y3QgaTJjX3BueF9taWYgeworCWludAkJCXJldDsJCS8qIFJldHVybiB2YWx1ZSAqLworCWludAkJCW1vZGU7CQkvKiBJbnRlcmZhY2UgbW9kZSAqLworCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRlOwkvKiBJL08gY29tcGxldGlvbiAqLworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwkJLyogVGltZW91dCAqLworCWNoYXIgKgkJCWJ1ZjsJCS8qIERhdGEgYnVmZmVyICovCisJaW50CQkJbGVuOwkJLyogTGVuZ3RoIG9mIGRhdGEgYnVmZmVyICovCit9OworCitzdHJ1Y3QgaTJjX3BueF9hbGdvX2RhdGEgeworCXUzMgkJCWJhc2U7CisJdTMyCQkJaW9hZGRyOworCWludAkJCWlycTsKKwlzdHJ1Y3QgaTJjX3BueF9taWYJbWlmOworCWludAkJCWxhc3Q7Cit9OworCitzdHJ1Y3QgaTJjX3BueF9kYXRhIHsKKwlpbnQgKCpzdXNwZW5kKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWUpIChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwl1MzIgKCpjYWxjdWxhdGVfaW5wdXRfZnJlcSkgKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCWludCAoKnNldF9jbG9ja19ydW4pIChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKKwlpbnQgKCpzZXRfY2xvY2tfc3RvcCkgKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKK307CisKKyNlbmRpZiAvKiBfX0kyQ19QTlhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1weGEuaCBiL2luY2x1ZGUvbGludXgvaTJjLXB4YS5oCmluZGV4IDVmM2VhZjguLjQxZGNkZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLXB4YS5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLXB4YS5oCkBAIC0xLDI5ICsxLDYgQEAKICNpZm5kZWYgX0xJTlVYX0kyQ19BTEdPX1BYQV9ICiAjZGVmaW5lIF9MSU5VWF9JMkNfQUxHT19QWEFfSAogCi1zdHJ1Y3QgaTJjX2VlcHJvbV9lbXVfd2F0Y2hlciB7Ci0Jdm9pZCAoKndyaXRlKSh2b2lkICosIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIG5ld3ZhbCk7Ci19OwotCi1zdHJ1Y3QgaTJjX2VlcHJvbV9lbXVfd2F0Y2ggewotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKLQl1bnNpZ25lZCBpbnQgc3RhcnQ7Ci0JdW5zaWduZWQgaW50IGVuZDsKLQlzdHJ1Y3QgaTJjX2VlcHJvbV9lbXVfd2F0Y2hlciAqb3BzOwotCXZvaWQgKmRhdGE7Ci19OwotCi0jZGVmaW5lIEkyQ19FRVBST01fRU1VX1NJWkUgKDI1NikKLQotc3RydWN0IGkyY19lZXByb21fZW11IHsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgcHRyOwotCXVuc2lnbmVkIGludCBzZWVuX3N0YXJ0OwotCXN0cnVjdCBsaXN0X2hlYWQgd2F0Y2g7Ci0KLQl1bnNpZ25lZCBjaGFyIGJ5dGVzW0kyQ19FRVBST01fRU1VX1NJWkVdOwotfTsKLQogdHlwZWRlZiBlbnVtIGkyY19zbGF2ZV9ldmVudF9lIHsKIAlJMkNfU0xBVkVfRVZFTlRfU1RBUlRfUkVBRCwKIAlJMkNfU0xBVkVfRVZFTlRfU1RBUlRfV1JJVEUsCkBAIC0zNywxMiArMTQsNCBAQAogCXZvaWQgKCp3cml0ZSkodm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgdmFsKTsKIH07CiAKLWV4dGVybiBpbnQgaTJjX2VlcHJvbV9lbXVfYWRkd2F0Y2hlcihzdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgKiwgdm9pZCAqZGF0YSwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkgICAgIHN0cnVjdCBpMmNfZWVwcm9tX2VtdV93YXRjaGVyICopOwotCi1leHRlcm4gdm9pZCBpMmNfZWVwcm9tX2VtdV9kZWx3YXRjaGVyKHN0cnVjdCBpMmNfZWVwcm9tX2VtdSAqLCB2b2lkICpkYXRhLCBzdHJ1Y3QgaTJjX2VlcHJvbV9lbXVfd2F0Y2hlciAqd2F0Y2hlcik7Ci0KLWV4dGVybiBzdHJ1Y3QgaTJjX2VlcHJvbV9lbXUgKmkyY19weGFfZ2V0X2VlcHJvbSh2b2lkKTsKLQogI2VuZGlmIC8qIF9MSU5VWF9JMkNfQUxHT19QWEFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMuaCBiL2luY2x1ZGUvbGludXgvaTJjLmgKaW5kZXggOWI1ZDA0Ny4uNzFlNTBkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy5oCkBAIC0xLDcgKzEsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogCQkJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCQkgICAgICovCiAvKiBpMmMuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgaTJjLWJ1cyBpbnRlcmZhY2UJCQkgICAgICovCi0vKiAJCQkJCQkJCQkgICAgICovCisvKgkJCQkJCQkJCSAgICAgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAogCkBAIC0yNyw3ICsyNyw3IEBACiAjZGVmaW5lIF9MSU5VWF9JMkNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpZmRlZiBfX0tFUk5FTF9fIAorI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KQEAgLTUzLDggKzUzLDggQEAKIAogLyoKICAqIFRoZSBtYXN0ZXIgcm91dGluZXMgYXJlIHRoZSBvbmVzIG5vcm1hbGx5IHVzZWQgdG8gdHJhbnNtaXQgZGF0YSB0byBkZXZpY2VzCi0gKiBvbiBhIGJ1cyAob3IgcmVhZCBmcm9tIHRoZW0pLiBBcGFydCBmcm9tIHR3byBiYXNpYyB0cmFuc2ZlciBmdW5jdGlvbnMgdG8gCi0gKiB0cmFuc21pdCBvbmUgbWVzc2FnZSBhdCBhIHRpbWUsIGEgbW9yZSBjb21wbGV4IHZlcnNpb24gY2FuIGJlIHVzZWQgdG8gCisgKiBvbiBhIGJ1cyAob3IgcmVhZCBmcm9tIHRoZW0pLiBBcGFydCBmcm9tIHR3byBiYXNpYyB0cmFuc2ZlciBmdW5jdGlvbnMgdG8KKyAqIHRyYW5zbWl0IG9uZSBtZXNzYWdlIGF0IGEgdGltZSwgYSBtb3JlIGNvbXBsZXggdmVyc2lvbiBjYW4gYmUgdXNlZCB0bwogICogdHJhbnNtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBtZXNzYWdlcyB3aXRob3V0IGludGVycnVwdGlvbi4KICAqLwogZXh0ZXJuIGludCBpMmNfbWFzdGVyX3NlbmQoc3RydWN0IGkyY19jbGllbnQgKixjb25zdCBjaGFyKiAsaW50KTsKQEAgLTY3LDEwICs2NywxMCBAQAogCiAvKiBUaGlzIGlzIHRoZSB2ZXJ5IGdlbmVyYWxpemVkIFNNQnVzIGFjY2VzcyByb3V0aW5lLiBZb3UgcHJvYmFibHkgZG8gbm90CiAgICB3YW50IHRvIHVzZSB0aGlzLCB0aG91Z2g7IG9uZSBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IG1heSBiZSBtdWNoIGVhc2llciwKLSAgIGFuZCBwcm9iYWJseSBqdXN0IGFzIGZhc3QuIAorICAgYW5kIHByb2JhYmx5IGp1c3QgYXMgZmFzdC4KICAgIE5vdGUgdGhhdCB3ZSB1c2UgaTJjX2FkYXB0ZXIgaGVyZSwgYmVjYXVzZSB5b3UgZG8gbm90IG5lZWQgYSBzcGVjaWZpYwogICAgc21idXMgYWRhcHRlciB0byBjYWxsIHRoaXMgZnVuY3Rpb24uICovCi1leHRlcm4gczMyIGkyY19zbWJ1c194ZmVyIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyLCB1MTYgYWRkciwgCitleHRlcm4gczMyIGkyY19zbWJ1c194ZmVyIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiBhZGFwdGVyLCB1MTYgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSk7CkBAIC0xMTIsMTQgKzExMiwxNCBAQAogCiAJLyogTm90aWZpZXMgdGhlIGRyaXZlciB0aGF0IGEgbmV3IGJ1cyBoYXMgYXBwZWFyZWQuIFRoaXMgcm91dGluZQogCSAqIGNhbiBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIgdG8gdGVzdCBpZiB0aGUgYnVzIG1lZXRzIGl0cyBjb25kaXRpb25zCi0JICogJiBzZWVrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNoaXAocykgaXQgc3VwcG9ydHMuIElmIGZvdW5kLCBpdCAKKwkgKiAmIHNlZWsgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgY2hpcChzKSBpdCBzdXBwb3J0cy4gSWYgZm91bmQsIGl0CiAJICogcmVnaXN0ZXJzIHRoZSBjbGllbnQocykgdGhhdCBhcmUgb24gdGhlIGJ1cyB0byB0aGUgaTJjIGFkbWluLiB2aWEKIAkgKiBpMmNfYXR0YWNoX2NsaWVudC4KIAkgKi8KIAlpbnQgKCphdHRhY2hfYWRhcHRlcikoc3RydWN0IGkyY19hZGFwdGVyICopOwogCWludCAoKmRldGFjaF9hZGFwdGVyKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CiAKLQkvKiB0ZWxscyB0aGUgZHJpdmVyIHRoYXQgYSBjbGllbnQgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZCAmIGdpdmVzIGl0IAorCS8qIHRlbGxzIHRoZSBkcml2ZXIgdGhhdCBhIGNsaWVudCBpcyBhYm91dCB0byBiZSBkZWxldGVkICYgZ2l2ZXMgaXQKIAkgKiB0aGUgY2hhbmNlIHRvIHJlbW92ZSBpdHMgcHJpdmF0ZSBkYXRhLiBBbHNvLCBpZiB0aGUgY2xpZW50IHN0cnVjdAogCSAqIGhhcyBiZWVuIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGluIHRoZSBmdW5jdGlvbiBhYm92ZSwKIAkgKiBpdCBtdXN0IGJlIGZyZWVkIGhlcmUuCkBAIC0xMzksMTMgKzEzOSwxMyBAQAogI2RlZmluZSBJMkNfTkFNRV9TSVpFCTUwCiAKIC8qCi0gKiBpMmNfY2xpZW50IGlkZW50aWZpZXMgYSBzaW5nbGUgZGV2aWNlIChpLmUuIGNoaXApIHRoYXQgaXMgY29ubmVjdGVkIHRvIGFuIAorICogaTJjX2NsaWVudCBpZGVudGlmaWVzIGEgc2luZ2xlIGRldmljZSAoaS5lLiBjaGlwKSB0aGF0IGlzIGNvbm5lY3RlZCB0byBhbgogICogaTJjIGJ1cy4gVGhlIGJlaGF2aW91ciBpcyBkZWZpbmVkIGJ5IHRoZSByb3V0aW5lcyBvZiB0aGUgZHJpdmVyLiBUaGlzCiAgKiBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZCBmb3IgbG9va3VwICYgb3RoZXIgYWRtaW4uIGZ1bmN0aW9ucy4KICAqLwogc3RydWN0IGkyY19jbGllbnQgewogCXVuc2lnbmVkIGludCBmbGFnczsJCS8qIGRpdi4sIHNlZSBiZWxvdwkJKi8KLQl1bnNpZ25lZCBzaG9ydCBhZGRyOwkJLyogY2hpcCBhZGRyZXNzIC0gTk9URTogN2JpdCAJKi8KKwl1bnNpZ25lZCBzaG9ydCBhZGRyOwkJLyogY2hpcCBhZGRyZXNzIC0gTk9URTogN2JpdAkqLwogCQkJCQkvKiBhZGRyZXNzZXMgYXJlIHN0b3JlZCBpbiB0aGUJKi8KIAkJCQkJLyogX0xPV0VSXyA3IGJpdHMJCSovCiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOwkvKiB0aGUgYWRhcHRlciB3ZSBzaXQgb24JKi8KQEAgLTE4MiwxNCArMTgyLDE0IEBACiAgKi8KIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHsKIAkvKiBJZiBhbiBhZGFwdGVyIGFsZ29yaXRobSBjYW4ndCBkbyBJMkMtbGV2ZWwgYWNjZXNzLCBzZXQgbWFzdGVyX3hmZXIKLQkgICB0byBOVUxMLiBJZiBhbiBhZGFwdGVyIGFsZ29yaXRobSBjYW4gZG8gU01CdXMgYWNjZXNzLCBzZXQgCisJICAgdG8gTlVMTC4gSWYgYW4gYWRhcHRlciBhbGdvcml0aG0gY2FuIGRvIFNNQnVzIGFjY2Vzcywgc2V0CiAJICAgc21idXNfeGZlci4gSWYgc2V0IHRvIE5VTEwsIHRoZSBTTUJ1cyBwcm90b2NvbCBpcyBzaW11bGF0ZWQKIAkgICB1c2luZyBjb21tb24gSTJDIG1lc3NhZ2VzICovCiAJLyogbWFzdGVyX3hmZXIgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHN1Y2Nlc3NmdWxseQogCSAgIHByb2Nlc3NlZCwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciAqLwotCWludCAoKm1hc3Rlcl94ZmVyKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgKm1zZ3MsIAorCWludCAoKm1hc3Rlcl94ZmVyKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgKm1zZ3MsCiAJICAgICAgICAgICAgICAgICAgIGludCBudW0pOwotCWludCAoKnNtYnVzX3hmZXIpIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHUxNiBhZGRyLCAKKwlpbnQgKCpzbWJ1c194ZmVyKSAoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB1MTYgYWRkciwKIAkgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKIAkgICAgICAgICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSk7CiAKQEAgLTIxNiw2ICsyMTYsNyBAQAogCWludCAoKmNsaWVudF91bnJlZ2lzdGVyKShzdHJ1Y3QgaTJjX2NsaWVudCAqKTsKIAogCS8qIGRhdGEgZmllbGRzIHRoYXQgYXJlIHZhbGlkIGZvciBhbGwgZGV2aWNlcwkqLworCXU4IGxldmVsOyAJCQkvKiBuZXN0aW5nIGxldmVsIGZvciBsb2NrZGVwICovCiAJc3RydWN0IG11dGV4IGJ1c19sb2NrOwogCXN0cnVjdCBtdXRleCBjbGlzdF9sb2NrOwogCkBAIC0zMTYsNyArMzE3LDcgQEAKICAqIEl0IHdpbGwgb25seSBjYWxsIGZvdW5kX3Byb2MgaWYgc29tZSBjbGllbnQgaXMgY29ubmVjdGVkIGF0IHRoZQogICogc3BlY2lmaWMgYWRkcmVzcyAodW5sZXNzIGEgJ2ZvcmNlJyBtYXRjaGVkKTsKICAqLwotZXh0ZXJuIGludCBpMmNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCAKK2V4dGVybiBpbnQgaTJjX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKIAkJc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhICphZGRyZXNzX2RhdGEsCiAJCWludCAoKmZvdW5kX3Byb2MpIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgaW50LCBpbnQpKTsKIApAQCAtMzUyLDE1ICszNTMsMTUgQEAKICAqLwogc3RydWN0IGkyY19tc2cgewogCV9fdTE2IGFkZHI7CS8qIHNsYXZlIGFkZHJlc3MJCQkqLwotIAlfX3UxNiBmbGFnczsJCQorCV9fdTE2IGZsYWdzOwogI2RlZmluZSBJMkNfTV9URU4JMHgxMAkvKiB3ZSBoYXZlIGEgdGVuIGJpdCBjaGlwIGFkZHJlc3MJKi8KICNkZWZpbmUgSTJDX01fUkQJMHgwMQogI2RlZmluZSBJMkNfTV9OT1NUQVJUCTB4NDAwMAogI2RlZmluZSBJMkNfTV9SRVZfRElSX0FERFIJMHgyMDAwCiAjZGVmaW5lIEkyQ19NX0lHTk9SRV9OQUsJMHgxMDAwCiAjZGVmaW5lIEkyQ19NX05PX1JEX0FDSwkJMHgwODAwCi0gCV9fdTE2IGxlbjsJCS8qIG1zZyBsZW5ndGgJCQkJKi8KLSAJX191OCAqYnVmOwkJLyogcG9pbnRlciB0byBtc2cgZGF0YQkJCSovCisJX191MTYgbGVuOwkJLyogbXNnIGxlbmd0aAkJCQkqLworCV9fdTggKmJ1ZjsJCS8qIHBvaW50ZXIgdG8gbXNnIGRhdGEJCQkqLwogfTsKIAogLyogVG8gZGV0ZXJtaW5lIHdoYXQgZnVuY3Rpb25hbGl0eSBpcyBwcmVzZW50ICovCkBAIC0zNzAsMTYgKzM3MSwxNiBAQAogI2RlZmluZSBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORwkweDAwMDAwMDA0IC8qIEkyQ19NX3tSRVZfRElSX0FERFIsTk9TVEFSVCwuLn0gKi8KICNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfSFdQRUNfQ0FMQwkweDAwMDAwMDA4IC8qIFNNQnVzIDIuMCAqLwogI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CTE9DS19QUk9DX0NBTEwJMHgwMDAwODAwMCAvKiBTTUJ1cyAyLjAgKi8KLSNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUVVJQ0sJCTB4MDAwMTAwMDAgCi0jZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURQkweDAwMDIwMDAwIAotI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFCTB4MDAwNDAwMDAgCi0jZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBCTB4MDAwODAwMDAgCi0jZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQQkweDAwMTAwMDAwIAotI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQQkweDAwMjAwMDAwIAotI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEEJMHgwMDQwMDAwMCAKLSNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMCTB4MDA4MDAwMDAgCi0jZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQkxPQ0tfREFUQQkweDAxMDAwMDAwIAotI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBIDB4MDIwMDAwMDAgCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1FVSUNLCQkweDAwMDEwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURQkweDAwMDIwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUJMHgwMDA0MDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQQkweDAwMDgwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQQkweDAwMTAwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBCTB4MDAyMDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBCTB4MDA0MDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMCTB4MDA4MDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBCTB4MDEwMDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQSAweDAyMDAwMDAwCiAjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLCTB4MDQwMDAwMDAgLyogSTJDLWxpa2UgYmxvY2sgeGZlciAgKi8KICNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLCTB4MDgwMDAwMDAgLyogdy8gMS1ieXRlIHJlZy4gYWRkci4gKi8KICNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0tfMgkgMHgxMDAwMDAwMCAvKiBJMkMtbGlrZSBibG9jayB4ZmVyICAqLwpAQCAtNDA2LDEwICs0MDcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKQogCi0vKiAKLSAqIERhdGEgZm9yIFNNQnVzIE1lc3NhZ2VzIAorLyoKKyAqIERhdGEgZm9yIFNNQnVzIE1lc3NhZ2VzCiAgKi8KLSNkZWZpbmUgSTJDX1NNQlVTX0JMT0NLX01BWAkzMgkvKiBBcyBzcGVjaWZpZWQgaW4gU01CdXMgc3RhbmRhcmQgKi8JCisjZGVmaW5lIEkyQ19TTUJVU19CTE9DS19NQVgJMzIJLyogQXMgc3BlY2lmaWVkIGluIFNNQnVzIHN0YW5kYXJkICovCiB1bmlvbiBpMmNfc21idXNfZGF0YSB7CiAJX191OCBieXRlOwogCV9fdTE2IHdvcmQ7CkBAIC00MjEsMTEgKzQyMiwxMSBAQAogI2RlZmluZSBJMkNfU01CVVNfUkVBRAkxCiAjZGVmaW5lIEkyQ19TTUJVU19XUklURQkwCiAKLS8qIFNNQnVzIHRyYW5zYWN0aW9uIHR5cGVzIChzaXplIHBhcmFtZXRlciBpbiB0aGUgYWJvdmUgZnVuY3Rpb25zKSAKKy8qIFNNQnVzIHRyYW5zYWN0aW9uIHR5cGVzIChzaXplIHBhcmFtZXRlciBpbiB0aGUgYWJvdmUgZnVuY3Rpb25zKQogICAgTm90ZTogdGhlc2Ugbm8gbG9uZ2VyIGNvcnJlc3BvbmQgdG8gdGhlIChhcmJpdHJhcnkpIFBJSVg0IGludGVybmFsIGNvZGVzISAqLwogI2RlZmluZSBJMkNfU01CVVNfUVVJQ0sJCSAgICAwCiAjZGVmaW5lIEkyQ19TTUJVU19CWVRFCQkgICAgMQotI2RlZmluZSBJMkNfU01CVVNfQllURV9EQVRBCSAgICAyIAorI2RlZmluZSBJMkNfU01CVVNfQllURV9EQVRBCSAgICAyCiAjZGVmaW5lIEkyQ19TTUJVU19XT1JEX0RBVEEJICAgIDMKICNkZWZpbmUgSTJDX1NNQlVTX1BST0NfQ0FMTAkgICAgNAogI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfREFUQQkgICAgNQpAQCAtNDM0LDE1ICs0MzUsMTUgQEAKIAogCiAvKiAtLS0tLSBjb21tYW5kcyBmb3IgdGhlIGlvY3RsIGxpa2UgaTJjX2NvbW1hbmQgY2FsbDoKLSAqIG5vdGUgdGhhdCBhZGRpdGlvbmFsIGNhbGxzIGFyZSBkZWZpbmVkIGluIHRoZSBhbGdvcml0aG0gYW5kIGh3IAotICoJZGVwZW5kZW50IGxheWVycyAtIHRoZXNlIGNhbiBiZSBsaXN0ZWQgaGVyZSwgb3Igc2VlIHRoZSAKKyAqIG5vdGUgdGhhdCBhZGRpdGlvbmFsIGNhbGxzIGFyZSBkZWZpbmVkIGluIHRoZSBhbGdvcml0aG0gYW5kIGh3CisgKglkZXBlbmRlbnQgbGF5ZXJzIC0gdGhlc2UgY2FuIGJlIGxpc3RlZCBoZXJlLCBvciBzZWUgdGhlCiAgKgljb3JyZXNwb25kaW5nIGhlYWRlciBmaWxlcy4KICAqLwogCQkJCS8qIC0+IGJpdC1hZGFwdGVyIHNwZWNpZmljIGlvY3RscwkqLwogI2RlZmluZSBJMkNfUkVUUklFUwkweDA3MDEJLyogbnVtYmVyIG9mIHRpbWVzIGEgZGV2aWNlIGFkZHJlc3MgICAgICAqLwogCQkJCS8qIHNob3VsZCBiZSBwb2xsZWQgd2hlbiBub3QgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY2tub3dsZWRnaW5nIAkJCSovCi0jZGVmaW5lIEkyQ19USU1FT1VUCTB4MDcwMgkvKiBzZXQgdGltZW91dCAtIGNhbGwgd2l0aCBpbnQgCQkqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY2tub3dsZWRnaW5nCQkJKi8KKyNkZWZpbmUgSTJDX1RJTUVPVVQJMHgwNzAyCS8qIHNldCB0aW1lb3V0IC0gY2FsbCB3aXRoIGludAkJKi8KIAogCiAvKiB0aGlzIGlzIGZvciBpMmMtZGV2LmMJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJvLmggYi9pbmNsdWRlL2xpbnV4L2kyby5oCmluZGV4IGMxMTVlOWUuLjUyZjUzZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMm8uaApAQCAtNDYxLDcgKzQ2MSw3IEBACiAJaW50ICgqcmVwbHkpIChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKiwgdTMyLCBzdHJ1Y3QgaTJvX21lc3NhZ2UgKik7CiAKIAkvKiBFdmVudCBoYW5kbGVyICovCi0Jdm9pZCAoKmV2ZW50KSAoc3RydWN0IGkyb19ldmVudCAqKTsKKwl3b3JrX2Z1bmNfdCBldmVudDsKIAogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpldmVudF9xdWV1ZTsJLyogRXZlbnQgcXVldWUgKi8KIApAQCAtNDkwLDcgKzQ5MCw3IEBACiAgKi8KIHN0cnVjdCBpMm9fcG9vbCB7CiAJY2hhciAqbmFtZTsKLQlrbWVtX2NhY2hlX3QgKnNsYWI7CisJc3RydWN0IGttZW1fY2FjaGUgKnNsYWI7CiAJbWVtcG9vbF90ICptZW1wb29sOwogfTsKIApAQCAtOTg2LDcgKzk4Niw4IEBACiAKIC8qKgogICoJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9hZGQgLSBTZW5kIG5vdGlmaWNhdGlvbiBvZiBhZGRlZCBjb250cm9sbGVyCi0gKgkJCQkJICAgdG8gYSBzaW5nbGUgSTJPIGRyaXZlcgorICoJQGRydjogSTJPIGRyaXZlcgorICoJQGM6IEkyTyBjb250cm9sbGVyCiAgKgogICoJU2VuZCBub3RpZmljYXRpb24gb2YgYWRkZWQgY29udHJvbGxlciB0byBhIHNpbmdsZSByZWdpc3RlcmVkIGRyaXZlci4KICAqLwpAQCAtOTk4LDggKzk5OSw5IEBACiB9OwogCiAvKioKLSAqCWkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlIC0gU2VuZCBub3RpZmljYXRpb24gb2YgcmVtb3ZlZAotICoJCQkJCSAgICAgIGNvbnRyb2xsZXIgdG8gYSBzaW5nbGUgSTJPIGRyaXZlcgorICoJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9yZW1vdmUgLSBTZW5kIG5vdGlmaWNhdGlvbiBvZiByZW1vdmVkIGNvbnRyb2xsZXIKKyAqCUBkcnY6IEkyTyBkcml2ZXIKKyAqCUBjOiBJMk8gY29udHJvbGxlcgogICoKICAqCVNlbmQgbm90aWZpY2F0aW9uIG9mIHJlbW92ZWQgY29udHJvbGxlciB0byBhIHNpbmdsZSByZWdpc3RlcmVkIGRyaXZlci4KICAqLwpAQCAtMTAxMSw4ICsxMDEzLDkgQEAKIH07CiAKIC8qKgotICoJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZCAtIFNlbmQgbm90aWZpY2F0aW9uIG9mIGFkZGVkIGRldmljZSB0byBhCi0gKgkJCQkgICAgICAgc2luZ2xlIEkyTyBkcml2ZXIKKyAqCWkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9hZGQgLSBTZW5kIG5vdGlmaWNhdGlvbiBvZiBhZGRlZCBkZXZpY2UKKyAqCUBkcnY6IEkyTyBkcml2ZXIKKyAqCUBpMm9fZGV2OiB0aGUgYWRkZWQgaTJvX2RldmljZQogICoKICAqCVNlbmQgbm90aWZpY2F0aW9uIG9mIGFkZGVkIGRldmljZSB0byBhIHNpbmdsZSByZWdpc3RlcmVkIGRyaXZlci4KICAqLwpAQCAtMTAyNSw3ICsxMDI4LDggQEAKIAogLyoqCiAgKglpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfcmVtb3ZlIC0gU2VuZCBub3RpZmljYXRpb24gb2YgcmVtb3ZlZCBkZXZpY2UKLSAqCQkJCQkgIHRvIGEgc2luZ2xlIEkyTyBkcml2ZXIKKyAqCUBkcnY6IEkyTyBkcml2ZXIKKyAqCUBpMm9fZGV2OiB0aGUgYWRkZWQgaTJvX2RldmljZQogICoKICAqCVNlbmQgbm90aWZpY2F0aW9uIG9mIHJlbW92ZWQgZGV2aWNlIHRvIGEgc2luZ2xlIHJlZ2lzdGVyZWQgZHJpdmVyLgogICovCkBAIC0xMTQ4LDcgKzExNTIsNyBAQAogLyoqCiAgKiAJaTJvX21zZ19wb3N0X3dhaXQgLSBQb3N0IGFuZCB3YWl0IGEgbWVzc2FnZSBhbmQgd2FpdCB1bnRpbCByZXR1cm4KICAqCUBjOiBjb250cm9sbGVyCi0gKglAbTogbWVzc2FnZSB0byBwb3N0CisgKglAbXNnOiBtZXNzYWdlIHRvIHBvc3QKICAqCUB0aW1lb3V0OiB0aW1lIGluIHNlY29uZHMgdG8gd2FpdAogICoKICAqIAlUaGlzIEFQSSBhbGxvd3MgYW4gT1NNIHRvIHBvc3QgYSBtZXNzYWdlIGFuZCB0aGVuIGJlIHRvbGQgd2hldGhlciBvcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pY21wLmggYi9pbmNsdWRlL2xpbnV4L2ljbXAuaAppbmRleCA4NzhjZmU0Li4yNGRhNGZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ljbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ljbXAuaApAQCAtNjgsNyArNjgsNyBAQAogc3RydWN0IGljbXBoZHIgewogICBfX3U4CQl0eXBlOwogICBfX3U4CQljb2RlOwotICBfX2JlMTYJY2hlY2tzdW07CisgIF9fc3VtMTYJY2hlY2tzdW07CiAgIHVuaW9uIHsKIAlzdHJ1Y3QgewogCQlfX2JlMTYJaWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oIGIvaW5jbHVkZS9saW51eC9pY21wdjYuaAppbmRleCBjNzcxYTdkLi42OGQzNTI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKQEAgLTcsMTcgKzcsMTcgQEAKIAogCV9fdTgJCWljbXA2X3R5cGU7CiAJX191OAkJaWNtcDZfY29kZTsKLQlfX3UxNgkJaWNtcDZfY2tzdW07CisJX19zdW0xNgkJaWNtcDZfY2tzdW07CiAKIAogCXVuaW9uIHsKLQkJX191MzIJCQl1bl9kYXRhMzJbMV07Ci0JCV9fdTE2CQkJdW5fZGF0YTE2WzJdOworCQlfX2JlMzIJCQl1bl9kYXRhMzJbMV07CisJCV9fYmUxNgkJCXVuX2RhdGExNlsyXTsKIAkJX191OAkJCXVuX2RhdGE4WzRdOwogCiAJCXN0cnVjdCBpY21wdjZfZWNobyB7Ci0JCQlfX3UxNgkJaWRlbnRpZmllcjsKLQkJCV9fdTE2CQlzZXF1ZW5jZTsKKwkJCV9fYmUxNgkJaWRlbnRpZmllcjsKKwkJCV9fYmUxNgkJc2VxdWVuY2U7CiAJCX0gdV9lY2hvOwogCiAgICAgICAgICAgICAgICAgc3RydWN0IGljbXB2Nl9uZF9hZHZ0IHsKQEAgLTUzLDcgKzUzLDcgQEAKICNlbHNlCiAjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCiAjZW5kaWYKLQkJCV9fdTE2CQlydF9saWZldGltZTsKKwkJCV9fYmUxNgkJcnRfbGlmZXRpbWU7CiAgICAgICAgICAgICAgICAgfSB1X25kX3JhOwogCiAJfSBpY21wNl9kYXRhdW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkZS5oIGIvaW5jbHVkZS9saW51eC9pZGUuaAppbmRleCA5YzIwNTAyLi5lMjZhMDM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRlLmgKQEAgLTc5Niw2ICs3OTYsNyBAQAogCXVuc2lnbmVkCXNnX21hcHBlZCAgOiAxOwkvKiBzZ190YWJsZSBhbmQgc2dfbmVudHMgYXJlIHJlYWR5ICovCiAJdW5zaWduZWQJbm9faW9fMzJiaXQgOiAxOyAvKiAxID0gY2FuIG5vdCBkbyAzMi1iaXQgSU8gb3BzICovCiAJdW5zaWduZWQJZXJyX3N0b3BzX2ZpZm8gOiAxOyAvKiAxPWRhdGEgRklGTyBpcyBjbGVhcmVkIGJ5IGFuIGVycm9yICovCisJdW5zaWduZWQJYXRhcGlfaXJxX2JvZ29uIDogMTsgLyogR2VuZXJhdGVzIHNwdXJpb3VzIERNQSBpbnRlcnJ1cHRzIGluIFBJTyBtb2RlICovCiAKIAlzdHJ1Y3QgZGV2aWNlCWdlbmRldjsKIAlzdHJ1Y3QgY29tcGxldGlvbiBnZW5kZXZfcmVsX2NvbXA7IC8qIFRvIGRlYWwgd2l0aCBkZXZpY2UgcmVsZWFzZSgpICovCkBAIC04MDMsOCArODA0LDYgQEAKIAl2b2lkCQkqaHdpZl9kYXRhOwkvKiBleHRyYSBod2lmIGRhdGEgKi8KIAogCXVuc2lnbmVkIGRtYTsKLQotCXZvaWQgKCpsZWRfYWN0KSh2b2lkICpkYXRhLCBpbnQgcncpOwogfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wIGlkZV9od2lmX3Q7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaCBiL2luY2x1ZGUvbGludXgvaWZfYWRkci5oCmluZGV4IGRiZThmNjEuLmQ1NTdlNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfYWRkci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfYWRkci5oCkBAIC01Miw0ICs1MiwxMCBAQAogCV9fdTMyCXRzdGFtcDsgLyogdXBkYXRlZCB0aW1lc3RhbXAsIGh1bmRyZWR0aHMgb2Ygc2Vjb25kcyAqLwogfTsKIAorLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2lmbmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIElGQV9SVEEocikgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSkpKQorI2RlZmluZSBJRkFfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKQorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9saW5rLmggYi9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaAppbmRleCBlOTYzYTA3Li4zNWVkM2I1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaApAQCAtODIsNiArODIsMTIgQEAKIAogI2RlZmluZSBJRkxBX01BWCAoX19JRkxBX01BWCAtIDEpCiAKKy8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNpZm5kZWYgX19LRVJORUxfXworI2RlZmluZSBJRkxBX1JUQShyKSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKSkpCisjZGVmaW5lIElGTEFfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKQorI2VuZGlmCisKIC8qIGlmaV9mbGFncy4KIAogICAgSUZGXyogZmxhZ3MuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oIGIvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAppbmRleCBiOTI1NTg1NC4uOTkzOTNlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCkBAIC0xLDE3ICsxLDE5IEBACiAjaWZuZGVmIF9fTElOVVhfSUZfUEFDS0VUX0gKICNkZWZpbmUgX19MSU5VWF9JRl9QQUNLRVRfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogc3RydWN0IHNvY2thZGRyX3BrdAogewogCXVuc2lnbmVkIHNob3J0IHNwa3RfZmFtaWx5OwogCXVuc2lnbmVkIGNoYXIgc3BrdF9kZXZpY2VbMTRdOwotCXVuc2lnbmVkIHNob3J0IHNwa3RfcHJvdG9jb2w7CisJX19iZTE2IHNwa3RfcHJvdG9jb2w7CiB9OwogCiBzdHJ1Y3Qgc29ja2FkZHJfbGwKIHsKIAl1bnNpZ25lZCBzaG9ydAlzbGxfZmFtaWx5OwotCXVuc2lnbmVkIHNob3J0CXNsbF9wcm90b2NvbDsKKwlfX2JlMTYJCXNsbF9wcm90b2NvbDsKIAlpbnQJCXNsbF9pZmluZGV4OwogCXVuc2lnbmVkIHNob3J0CXNsbF9oYXR5cGU7CiAJdW5zaWduZWQgY2hhcglzbGxfcGt0dHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmggYi9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oCmluZGV4IGJlZjlmOGYuLjhkZTA3OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaApAQCAtMTksMTAgKzE5LDEwIEBACiB7CiAJY2hhcgkJCW5hbWVbSUZOQU1TSVpdOwogCWludAkJCWxpbms7Ci0JX191MTYJCQlpX2ZsYWdzOwotCV9fdTE2CQkJb19mbGFnczsKLQlfX3UzMgkJCWlfa2V5OwotCV9fdTMyCQkJb19rZXk7CisJX19iZTE2CQkJaV9mbGFnczsKKwlfX2JlMTYJCQlvX2ZsYWdzOworCV9fYmUzMgkJCWlfa2V5OworCV9fYmUzMgkJCW9fa2V5OwogCXN0cnVjdCBpcGhkcgkJaXBoOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZ21wLmggYi9pbmNsdWRlL2xpbnV4L2lnbXAuaAppbmRleCAwM2Y0M2UyLi45ZGJiNTI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lnbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lnbXAuaApAQCAtMzAsNyArMzAsNyBAQAogewogCV9fdTggdHlwZTsKIAlfX3U4IGNvZGU7CQkvKiBGb3IgbmV3ZXIgSUdNUCAqLwotCV9fYmUxNiBjc3VtOworCV9fc3VtMTYgY3N1bTsKIAlfX2JlMzIgZ3JvdXA7CiB9OwogCkBAIC0xMjcsNiArMTI3LDcgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAKIGV4dGVybiBpbnQgc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzOwpAQCAtMTkxLDcgKzE5Miw3IEBACiAjZGVmaW5lIElHTVBWM19NQVNLKHZhbHVlLCBuYikgKChuYik+PTMyID8gKHZhbHVlKSA6ICgoMTw8KG5iKSktMSkgJiAodmFsdWUpKQogI2RlZmluZSBJR01QVjNfRVhQKHRocmVzaCwgbmJtYW50LCBuYmV4cCwgdmFsdWUpIFwKIAkoKHZhbHVlKSA8ICh0aHJlc2gpID8gKHZhbHVlKSA6IFwKLSAgICAgICAgKChJR01QVjNfTUFTSyh2YWx1ZSwgbmJtYW50KSB8ICgxPDwobmJtYW50K25iZXhwKSkpIDw8IFwKKyAgICAgICAgKChJR01QVjNfTUFTSyh2YWx1ZSwgbmJtYW50KSB8ICgxPDwobmJtYW50KSkpIDw8IFwKICAgICAgICAgIChJR01QVjNfTUFTSygodmFsdWUpID4+IChuYm1hbnQpLCBuYmV4cCkgKyAobmJleHApKSkpCiAKICNkZWZpbmUgSUdNUFYzX1FRSUModmFsdWUpIElHTVBWM19FWFAoMHg4MCwgNCwgMywgdmFsdWUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luLmggYi9pbmNsdWRlL2xpbnV4L2luLmgKaW5kZXggMjYxOTg1OS4uMTkxMmU3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbi5oCisrKyBiL2luY2x1ZGUvbGludXgvaW4uaApAQCAtNDUsNiArNDUsNyBAQAogCiAgIElQUFJPVE9fQ09NUCAgID0gMTA4LCAgICAgICAgICAgICAgICAvKiBDb21wcmVzc2lvbiBIZWFkZXIgcHJvdG9jb2wgKi8KICAgSVBQUk9UT19TQ1RQICAgPSAxMzIsCQkvKiBTdHJlYW0gQ29udHJvbCBUcmFuc3BvcnQgUHJvdG9jb2wJKi8KKyAgSVBQUk9UT19VRFBMSVRFID0gMTM2LAkvKiBVRFAtTGl0ZSAoUkZDIDM4MjgpCQkJKi8KIAogICBJUFBST1RPX1JBVwkgPSAyNTUsCQkvKiBSYXcgSVAgcGFja2V0cwkJCSovCiAgIElQUFJPVE9fTUFYCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luNi5oIGIvaW5jbHVkZS9saW51eC9pbjYuaAppbmRleCA5YmU2YTQ3Li40ZTgzNTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luNi5oCisrKyBiL2luY2x1ZGUvbGludXgvaW42LmgKQEAgLTU0LDcgKzU0LDcgQEAKIHN0cnVjdCBzb2NrYWRkcl9pbjYgewogCXVuc2lnbmVkIHNob3J0IGludAlzaW42X2ZhbWlseTsgICAgLyogQUZfSU5FVDYgKi8KIAlfX2JlMTYJCQlzaW42X3BvcnQ7ICAgICAgLyogVHJhbnNwb3J0IGxheWVyIHBvcnQgIyAqLwotCV9fdTMyCQkJc2luNl9mbG93aW5mbzsgIC8qIElQdjYgZmxvdyBpbmZvcm1hdGlvbiAqLworCV9fYmUzMgkJCXNpbjZfZmxvd2luZm87ICAvKiBJUHY2IGZsb3cgaW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3QgaW42X2FkZHIJCXNpbjZfYWRkcjsgICAgICAvKiBJUHY2IGFkZHJlc3MgKi8KIAlfX3UzMgkJCXNpbjZfc2NvcGVfaWQ7ICAvKiBzY29wZSBpZCAobmV3IGluIFJGQzI1NTMpICovCiB9OwpAQCAtNzIsNyArNzIsNyBAQAogc3RydWN0IGluNl9mbG93bGFiZWxfcmVxCiB7CiAJc3RydWN0IGluNl9hZGRyCWZscl9kc3Q7Ci0JX191MzIJZmxyX2xhYmVsOworCV9fYmUzMglmbHJfbGFiZWw7CiAJX191OAlmbHJfYWN0aW9uOwogCV9fdTgJZmxyX3NoYXJlOwogCV9fdTE2CWZscl9mbGFnczsKQEAgLTIyNSw3ICsyMjUsNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBOZXRmaWx0ZXIKKyAqIE5ldGZpbHRlciAoMSkKICAqCiAgKiBGb2xsb3dpbmcgc29ja2V0IG9wdGlvbnMgYXJlIHVzZWQgaW4gaXA2X3RhYmxlczsKICAqIHNlZSBpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaC4KQEAgLTI0MCw0ICsyNDAsMTQgQEAKICNkZWZpbmUgSVBWNl9SRUNWVENMQVNTCQk2NgogI2RlZmluZSBJUFY2X1RDTEFTUwkJNjcKIAorLyoKKyAqIE5ldGZpbHRlciAoMikKKyAqCisgKiBGb2xsb3dpbmcgc29ja2V0IG9wdGlvbnMgYXJlIHVzZWQgaW4gaXA2X3RhYmxlczsKKyAqIHNlZSBpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaC4KKyAqCisgKiBJUDZUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAk2OAorICogSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCTY5CisgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luZXQuaCBiL2luY2x1ZGUvbGludXgvaW5ldC5oCmluZGV4IGI3YzZkYTcuLjY3NWE3ZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5ldC5oCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogZXh0ZXJuIF9fYmUzMiBpbl9hdG9uKGNvbnN0IGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IGluNF9wdG9uKGNvbnN0IGNoYXIgKnNyYywgaW50IHNyY2xlbiwgdTggKmRzdCwgY2hhciBkZWxpbSwgY29uc3QgY2hhciAqKmVuZCk7Ci1leHRlcm4gaW50IGluNl9wdG9uKGNvbnN0IGNoYXIgKnNyYywgaW50IHNyY2xlbiwgdTggKmRzdCwgY2hhciBkZWxpbSwgY29uc3QgY2hhciAqKmVuZCk7CitleHRlcm4gaW50IGluNF9wdG9uKGNvbnN0IGNoYXIgKnNyYywgaW50IHNyY2xlbiwgdTggKmRzdCwgaW50IGRlbGltLCBjb25zdCBjaGFyICoqZW5kKTsKK2V4dGVybiBpbnQgaW42X3B0b24oY29uc3QgY2hhciAqc3JjLCBpbnQgc3JjbGVuLCB1OCAqZHN0LCBpbnQgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpOwogI2VuZGlmCiAjZW5kaWYJLyogX0xJTlVYX0lORVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2luZXRkZXZpY2UuaAppbmRleCA1YTBhYjA0Li5jMGY3YWVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luZXRkZXZpY2UuaApAQCAtMTI0LDEyICsxMjQsMTMgQEAKICAqCUNoZWNrIGlmIGEgbWFzayBpcyBhY2NlcHRhYmxlLgogICovCiAgCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgYmFkX21hc2sodTMyIG1hc2ssIHUzMiBhZGRyKQorc3RhdGljIF9faW5saW5lX18gaW50IGJhZF9tYXNrKF9fYmUzMiBtYXNrLCBfX2JlMzIgYWRkcikKIHsKKwlfX3UzMiBobWFzazsKIAlpZiAoYWRkciAmIChtYXNrID0gfm1hc2spKQogCQlyZXR1cm4gMTsKLQltYXNrID0gbnRvaGwobWFzayk7Ci0JaWYgKG1hc2sgJiAobWFzaysxKSkKKwlobWFzayA9IG50b2hsKG1hc2spOworCWlmIChobWFzayAmIChobWFzaysxKSkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTAsMTEgKzE5MSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5ldF9tYXNrX2xlbihfX3UzMiBtYXNrKQorc3RhdGljIF9faW5saW5lX18gaW50IGluZXRfbWFza19sZW4oX19iZTMyIG1hc2spCiB7Ci0JaWYgKCEobWFzayA9IG50b2hsKG1hc2spKSkKKwlfX3UzMiBobWFzayA9IG50b2hsKG1hc2spOworCWlmICghaG1hc2spCiAJCXJldHVybiAwOwotCXJldHVybiAzMiAtIGZmeih+bWFzayk7CisJcmV0dXJuIDMyIC0gZmZ6KH5obWFzayk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0LmggYi9pbmNsdWRlL2xpbnV4L2luaXQuaAppbmRleCBlOTJiMTQ1Li41YTU5M2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXQuaApAQCAtODQsMTkgKzg0LDM4IEBACiAgKiBieSBsaW5rIG9yZGVyLiAKICAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaW5pdGNhbGwoKSBwdXRzIHRoZSBjYWxsIGluIAogICogdGhlIGRldmljZSBpbml0IHN1YnNlY3Rpb24uCisgKgorICogVGhlIGBpZCcgYXJnIHRvIF9fZGVmaW5lX2luaXRjYWxsKCkgaXMgbmVlZGVkIHNvIHRoYXQgbXVsdGlwbGUgaW5pdGNhbGxzCisgKiBjYW4gcG9pbnQgYXQgdGhlIHNhbWUgaGFuZGxlciB3aXRob3V0IGNhdXNpbmcgZHVwbGljYXRlLXN5bWJvbCBidWlsZCBlcnJvcnMuCiAgKi8KIAotI2RlZmluZSBfX2RlZmluZV9pbml0Y2FsbChsZXZlbCxmbikgXAotCXN0YXRpYyBpbml0Y2FsbF90IF9faW5pdGNhbGxfIyNmbiBfX2F0dHJpYnV0ZV91c2VkX18gXAorI2RlZmluZSBfX2RlZmluZV9pbml0Y2FsbChsZXZlbCxmbixpZCkgXAorCXN0YXRpYyBpbml0Y2FsbF90IF9faW5pdGNhbGxfIyNmbiMjaWQgX19hdHRyaWJ1dGVfdXNlZF9fIFwKIAlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmluaXRjYWxsIiBsZXZlbCAiLmluaXQiKSkpID0gZm4KIAotI2RlZmluZSBjb3JlX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjEiLGZuKQotI2RlZmluZSBwb3N0Y29yZV9pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCIyIixmbikKLSNkZWZpbmUgYXJjaF9pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCIzIixmbikKLSNkZWZpbmUgc3Vic3lzX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjQiLGZuKQotI2RlZmluZSBmc19pbml0Y2FsbChmbikJCQlfX2RlZmluZV9pbml0Y2FsbCgiNSIsZm4pCi0jZGVmaW5lIGRldmljZV9pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCI2IixmbikKLSNkZWZpbmUgbGF0ZV9pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCI3IixmbikKKy8qCisgKiBBICJwdXJlIiBpbml0Y2FsbCBoYXMgbm8gZGVwZW5kZW5jaWVzIG9uIGFueXRoaW5nIGVsc2UsIGFuZCBwdXJlbHkKKyAqIGluaXRpYWxpemVzIHZhcmlhYmxlcyB0aGF0IGNvdWxkbid0IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQuCisgKgorICogVGhpcyBvbmx5IGV4aXN0cyBmb3IgYnVpbHQtaW4gY29kZSwgbm90IGZvciBtb2R1bGVzLgorICovCisjZGVmaW5lIHB1cmVfaW5pdGNhbGwoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiMCIsZm4sMSkKKworI2RlZmluZSBjb3JlX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjEiLGZuLDEpCisjZGVmaW5lIGNvcmVfaW5pdGNhbGxfc3luYyhmbikJCV9fZGVmaW5lX2luaXRjYWxsKCIxcyIsZm4sMXMpCisjZGVmaW5lIHBvc3Rjb3JlX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjIiLGZuLDIpCisjZGVmaW5lIHBvc3Rjb3JlX2luaXRjYWxsX3N5bmMoZm4pCV9fZGVmaW5lX2luaXRjYWxsKCIycyIsZm4sMnMpCisjZGVmaW5lIGFyY2hfaW5pdGNhbGwoZm4pCQlfX2RlZmluZV9pbml0Y2FsbCgiMyIsZm4sMykKKyNkZWZpbmUgYXJjaF9pbml0Y2FsbF9zeW5jKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjNzIixmbiwzcykKKyNkZWZpbmUgc3Vic3lzX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjQiLGZuLDQpCisjZGVmaW5lIHN1YnN5c19pbml0Y2FsbF9zeW5jKGZuKQlfX2RlZmluZV9pbml0Y2FsbCgiNHMiLGZuLDRzKQorI2RlZmluZSBmc19pbml0Y2FsbChmbikJCQlfX2RlZmluZV9pbml0Y2FsbCgiNSIsZm4sNSkKKyNkZWZpbmUgZnNfaW5pdGNhbGxfc3luYyhmbikJCV9fZGVmaW5lX2luaXRjYWxsKCI1cyIsZm4sNXMpCisjZGVmaW5lIHJvb3Rmc19pbml0Y2FsbChmbikJCV9fZGVmaW5lX2luaXRjYWxsKCJyb290ZnMiLGZuLHJvb3RmcykKKyNkZWZpbmUgZGV2aWNlX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjYiLGZuLDYpCisjZGVmaW5lIGRldmljZV9pbml0Y2FsbF9zeW5jKGZuKQlfX2RlZmluZV9pbml0Y2FsbCgiNnMiLGZuLDZzKQorI2RlZmluZSBsYXRlX2luaXRjYWxsKGZuKQkJX19kZWZpbmVfaW5pdGNhbGwoIjciLGZuLDcpCisjZGVmaW5lIGxhdGVfaW5pdGNhbGxfc3luYyhmbikJCV9fZGVmaW5lX2luaXRjYWxsKCI3cyIsZm4sN3MpCiAKICNkZWZpbmUgX19pbml0Y2FsbChmbikgZGV2aWNlX2luaXRjYWxsKGZuKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAppbmRleCAzM2M1ZGFhLi42MzgzZDJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTcsMTYgKzcsMTUgQEAKICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KIAogI2RlZmluZSBJTklUX0ZEVEFCTEUgXAogewkJCQkJCQlcCiAJLm1heF9mZHMJPSBOUl9PUEVOX0RFRkFVTFQsIAkJXAotCS5tYXhfZmRzZXQJPSBFTUJFRERFRF9GRF9TRVRfU0laRSwJCVwKIAkuZmQJCT0gJmluaXRfZmlsZXMuZmRfYXJyYXlbMF0sIAlcCiAJLmNsb3NlX29uX2V4ZWMJPSAoZmRfc2V0ICopJmluaXRfZmlsZXMuY2xvc2Vfb25fZXhlY19pbml0LCBcCiAJLm9wZW5fZmRzCT0gKGZkX3NldCAqKSZpbml0X2ZpbGVzLm9wZW5fZmRzX2luaXQsIAlcCiAJLnJjdQkJPSBSQ1VfSEVBRF9JTklULCAJCVwKLQkuZnJlZV9maWxlcwk9IE5VTEwsCQkgCQlcCiAJLm5leHQJCT0gTlVMTCwJCSAJCVwKIH0KIApAQCAtNTcsMjUgKzU2LDI3IEBACiAJLmNwdV92bV9tYXNrCT0gQ1BVX01BU0tfQUxMLAkJCQlcCiB9CiAKLSNkZWZpbmUgSU5JVF9TSUdOQUxTKHNpZykgewlcCi0JLmNvdW50CQk9IEFUT01JQ19JTklUKDEpLCAJCVwKKyNkZWZpbmUgSU5JVF9TSUdOQUxTKHNpZykgewkJCQkJCVwKKwkuY291bnQJCT0gQVRPTUlDX0lOSVQoMSksIAkJCQlcCiAJLndhaXRfY2hsZGV4aXQJPSBfX1dBSVRfUVVFVUVfSEVBRF9JTklUSUFMSVpFUihzaWcud2FpdF9jaGxkZXhpdCksXAotCS5zaGFyZWRfcGVuZGluZwk9IHsgCQkJCVwKKwkuc2hhcmVkX3BlbmRpbmcJPSB7IAkJCQkJCVwKIAkJLmxpc3QgPSBMSVNUX0hFQURfSU5JVChzaWcuc2hhcmVkX3BlbmRpbmcubGlzdCksCVwKLQkJLnNpZ25hbCA9ICB7ezB9fX0sIFwKKwkJLnNpZ25hbCA9ICB7ezB9fX0sCQkJCQlcCiAJLnBvc2l4X3RpbWVycwkgPSBMSVNUX0hFQURfSU5JVChzaWcucG9zaXhfdGltZXJzKSwJCVwKIAkuY3B1X3RpbWVycwk9IElOSVRfQ1BVX1RJTUVSUyhzaWcuY3B1X3RpbWVycyksCQlcCiAJLnJsaW0JCT0gSU5JVF9STElNSVRTLAkJCQkJXAogCS5wZ3JwCQk9IDEsCQkJCQkJXAotCS5zZXNzaW9uCT0gMSwJCQkJCQlcCisJLnR0eV9vbGRfcGdycCAgID0gMCwJCQkJCQlcCisJeyAuX19zZXNzaW9uICAgICAgPSAxfSwJCQkJCQlcCiB9CiAKIGV4dGVybiBzdHJ1Y3QgbnNwcm94eSBpbml0X25zcHJveHk7CiAjZGVmaW5lIElOSVRfTlNQUk9YWShuc3Byb3h5KSB7CQkJCQkJXAorCS5waWRfbnMJCT0gJmluaXRfcGlkX25zLAkJCQkJXAogCS5jb3VudAkJPSBBVE9NSUNfSU5JVCgxKSwJCQkJXAotCS5uc2xvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAkJCQlcCisJLm5zbG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChuc3Byb3h5Lm5zbG9jayksCQlcCiAJLnV0c19ucwkJPSAmaW5pdF91dHNfbnMsCQkJCQlcCi0JLm5hbWVzcGFjZQk9IE5VTEwsCQkJCQkJXAorCS5tbnRfbnMJCT0gTlVMTCwJCQkJCQlcCiAJSU5JVF9JUENfTlMoaXBjX25zKQkJCQkJCVwKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnB1dC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCmluZGV4IGMzODUwN2IuLjRlNjExNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKQEAgLTY2Myw3ICs2NjMsNyBAQAogI2RlZmluZSBCVVNfR1NDCQkJMHgxQQogCiAvKgotICogVmFsdWVzIGRlc2NyaWJpbmcgdGhlIHN0YXR1cyBvZiBhbiBlZmZlY3QKKyAqIFZhbHVlcyBkZXNjcmliaW5nIHRoZSBzdGF0dXMgb2YgYSBmb3JjZS1mZWVkYmFjayBlZmZlY3QKICAqLwogI2RlZmluZSBGRl9TVEFUVVNfU1RPUFBFRAkweDAwCiAjZGVmaW5lIEZGX1NUQVRVU19QTEFZSU5HCTB4MDEKQEAgLTY4MCw3ICs2ODAsNyBAQAogICovCiAKIC8qKgotICogc3RydWN0IGZmX3JlcGxheSAtIGRlZmluZXMgc2NoZWR1bGluZyBvZiB0aGUgZWZmZWN0CisgKiBzdHJ1Y3QgZmZfcmVwbGF5IC0gZGVmaW5lcyBzY2hlZHVsaW5nIG9mIHRoZSBmb3JjZS1mZWVkYmFjayBlZmZlY3QKICAqIEBsZW5ndGg6IGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QKICAqIEBkZWxheTogZGVsYXkgYmVmb3JlIGVmZmVjdCBzaG91bGQgc3RhcnQgcGxheWluZwogICovCkBAIC02OTAsNyArNjkwLDcgQEAKIH07CiAKIC8qKgotICogc3RydWN0IGZmX3RyaWdnZXIgLSBkZWZpbmVzIHdoYXQgdHJpZ2dlcnMgdGhlIGVmZmVjdAorICogc3RydWN0IGZmX3RyaWdnZXIgLSBkZWZpbmVzIHdoYXQgdHJpZ2dlcnMgdGhlIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAogICogQGJ1dHRvbjogbnVtYmVyIG9mIHRoZSBidXR0b24gdHJpZ2dlcmluZyB0aGUgZWZmZWN0CiAgKiBAaW50ZXJ2YWw6IGNvbnRyb2xzIGhvdyBzb29uIHRoZSBlZmZlY3QgY2FuIGJlIHJlLXRyaWdnZXJlZAogICovCkBAIC03MDAsNyArNzAwLDcgQEAKIH07CiAKIC8qKgotICogc3RydWN0IGZmX2VudmVsb3BlIC0gZ2VuZXJpYyBlZmZlY3QgZW52ZWxvcGUKKyAqIHN0cnVjdCBmZl9lbnZlbG9wZSAtIGdlbmVyaWMgZm9yY2UtZmVlZGJhY2sgZWZmZWN0IGVudmVsb3BlCiAgKiBAYXR0YWNrX2xlbmd0aDogZHVyYXRpb24gb2YgdGhlIGF0dGFjayAobXMpCiAgKiBAYXR0YWNrX2xldmVsOiBsZXZlbCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdHRhY2sKICAqIEBmYWRlX2xlbmd0aDogZHVyYXRpb24gb2YgZmFkZSAobXMpCkBAIC03MTksNyArNzE5LDcgQEAKIH07CiAKIC8qKgotICogc3RydWN0IGZmX2NvbnN0YW50X2VmZmVjdCAtIGRlZmluZXMgcGFyYW1ldGVycyBvZiBhIGNvbnN0YW50IGVmZmVjdAorICogc3RydWN0IGZmX2NvbnN0YW50X2VmZmVjdCAtIGRlZmluZXMgcGFyYW1ldGVycyBvZiBhIGNvbnN0YW50IGZvcmNlLWZlZWRiYWNrIGVmZmVjdAogICogQGxldmVsOiBzdHJlbmd0aCBvZiB0aGUgZWZmZWN0OyBtYXkgYmUgbmVnYXRpdmUKICAqIEBlbnZlbG9wZTogZW52ZWxvcGUgZGF0YQogICovCkBAIC03MjksNyArNzI5LDcgQEAKIH07CiAKIC8qKgotICogc3RydWN0IGZmX3JhbXBfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgcmFtcCBlZmZlY3QKKyAqIHN0cnVjdCBmZl9yYW1wX2VmZmVjdCAtIGRlZmluZXMgcGFyYW1ldGVycyBvZiBhIHJhbXAgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CiAgKiBAc3RhcnRfbGV2ZWw6IGJlZ2lubmluZyBzdHJlbmd0aCBvZiB0aGUgZWZmZWN0OyBtYXkgYmUgbmVnYXRpdmUKICAqIEBlbmRfbGV2ZWw6IGZpbmFsIHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3Q7IG1heSBiZSBuZWdhdGl2ZQogICogQGVudmVsb3BlOiBlbnZlbG9wZSBkYXRhCkBAIC03NDEsNyArNzQxLDcgQEAKIH07CiAKIC8qKgotICogc3RydWN0IGZmX2NvbmRpdGlvbl9lZmZlY3QgLSBkZWZpbmVzIGEgc3ByaW5nIG9yIGZyaWN0aW9uIGVmZmVjdAorICogc3RydWN0IGZmX2NvbmRpdGlvbl9lZmZlY3QgLSBkZWZpbmVzIGEgc3ByaW5nIG9yIGZyaWN0aW9uIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAogICogQHJpZ2h0X3NhdHVyYXRpb246IG1heGltdW0gbGV2ZWwgd2hlbiBqb3lzdGljayBtb3ZlZCBhbGwgd2F5IHRvIHRoZSByaWdodAogICogQGxlZnRfc2F0dXJhdGlvbjogc2FtZSBmb3IgdGhlIGxlZnQgc2lkZQogICogQHJpZ2h0X2NvZWZmOiBjb250cm9scyBob3cgZmFzdCB0aGUgZm9yY2UgZ3Jvd3Mgd2hlbiB0aGUgam95c3RpY2sgbW92ZXMKQEAgLTc2Miw3ICs3NjIsNyBAQAogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgZmZfcGVyaW9kaWNfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgcGVyaW9kaWMgZWZmZWN0CisgKiBzdHJ1Y3QgZmZfcGVyaW9kaWNfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgcGVyaW9kaWMgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CiAgKiBAd2F2ZWZvcm06IGtpbmQgb2YgdGhlIGVmZmVjdCAod2F2ZSkKICAqIEBwZXJpb2Q6IHBlcmlvZCBvZiB0aGUgd2F2ZSAobXMpCiAgKiBAbWFnbml0dWRlOiBwZWFrIHZhbHVlCkBAIC03OTMsNyArNzkzLDcgQEAKIH07CiAKIC8qKgotICogc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgLSBkZWZpbmVzIHBhcmFtZXRlcnMgb2YgYSBwZXJpb2RpYyBlZmZlY3QKKyAqIHN0cnVjdCBmZl9ydW1ibGVfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgcGVyaW9kaWMgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CiAgKiBAc3Ryb25nX21hZ25pdHVkZTogbWFnbml0dWRlIG9mIHRoZSBoZWF2eSBtb3RvcgogICogQHdlYWtfbWFnbml0dWRlOiBtYWduaXR1ZGUgb2YgdGhlIGxpZ2h0IG9uZQogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IDViODNlN2IuLmUzNmU4NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvYm90dG9tX2hhbGYuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTIxNywxMiArMjE4LDYgQEAKICNkZWZpbmUgc2F2ZV9hbmRfY2xpKHgpCXNhdmVfYW5kX2NsaSgmeCkKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLWV4dGVybiB2b2lkIGxvY2FsX2JoX2Rpc2FibGUodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2xvY2FsX2JoX2VuYWJsZSh2b2lkKTsKLWV4dGVybiB2b2lkIF9sb2NhbF9iaF9lbmFibGUodm9pZCk7Ci1leHRlcm4gdm9pZCBsb2NhbF9iaF9lbmFibGUodm9pZCk7Ci1leHRlcm4gdm9pZCBsb2NhbF9iaF9lbmFibGVfaXAodW5zaWduZWQgbG9uZyBpcCk7Ci0KIC8qIFBMRUFTRSwgYXZvaWQgdG8gYWxsb2NhdGUgbmV3IHNvZnRpcnFzLCBpZiB5b3UgbmVlZCBub3QgX3JlYWxseV8gaGlnaAogICAgZnJlcXVlbmN5IHRocmVhZGVkIGpvYiBzY2hlZHVsaW5nLiBGb3IgYWxtb3N0IGFsbCB0aGUgcHVycG9zZXMKICAgIHRhc2tsZXRzIGFyZSBtb3JlIHRoYW4gZW5vdWdoLiBGLmUuIGFsbCBzZXJpYWwgZGV2aWNlIEJIcyBldApAQCAtMjM2LDcgKzIzMSw4IEBACiAJTkVUX1RYX1NPRlRJUlEsCiAJTkVUX1JYX1NPRlRJUlEsCiAJQkxPQ0tfU09GVElSUSwKLQlUQVNLTEVUX1NPRlRJUlEKKwlUQVNLTEVUX1NPRlRJUlEsCisJU0NIRURfU09GVElSUSwKIH07CiAKIC8qIHNvZnRpcnEgbWFzayBhbmQgYWN0aXZlIGZpZWxkcyBtb3ZlZCB0byBpcnFfY3B1c3RhdF90IGluCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaAppbmRleCBkNDJjODMzLi5jZjg2OTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKQEAgLTg5LDYgKzg5LDcgQEAKICNkZWZpbmUgSU9SRVNPVVJDRV9ST01fRU5BQkxFCQkoMTw8MCkJLyogUk9NIGlzIGVuYWJsZWQsIHNhbWUgYXMgUENJX1JPTV9BRERSRVNTX0VOQUJMRSAqLwogI2RlZmluZSBJT1JFU09VUkNFX1JPTV9TSEFET1cJCSgxPDwxKQkvKiBST00gaXMgY29weSBhdCBDMDAwOjAgKi8KICNkZWZpbmUgSU9SRVNPVVJDRV9ST01fQ09QWQkJKDE8PDIpCS8qIFJPTSBpcyBhbGxvYydkIGNvcHksIHJlc291cmNlIGZpZWxkIG92ZXJsYWlkICovCisjZGVmaW5lIElPUkVTT1VSQ0VfUk9NX0JJT1NfQ09QWQkoMTw8MykJLyogUk9NIGlzIEJJT1MgY29weSwgcmVzb3VyY2UgZmllbGQgb3ZlcmxhaWQgKi8KIAogLyogUEMvSVNBL3doYXRldmVyIC0gdGhlIG5vcm1hbCBQQyBhZGRyZXNzIHNwYWNlczogSU8gYW5kIG1lbW9yeSAqLwogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBpb3BvcnRfcmVzb3VyY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwLmggYi9pbmNsdWRlL2xpbnV4L2lwLmgKaW5kZXggZWNlZTliYi4uMWQzNmI5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaXAuaApAQCAtOTgsNyArOTgsNyBAQAogCV9fYmUxNglmcmFnX29mZjsKIAlfX3U4CXR0bDsKIAlfX3U4CXByb3RvY29sOwotCV9fYmUxNgljaGVjazsKKwlfX3N1bTE2CWNoZWNrOwogCV9fYmUzMglzYWRkcjsKIAlfX2JlMzIJZGFkZHI7CiAJLypUaGUgb3B0aW9ucyBzdGFydCBoZXJlLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmggYi9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaAppbmRleCA1YzIzYWViLi5hZjNmNGE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaApAQCAtMjUsNyArMjUsNyBAQAogCV9fdTggcHJvdG87CQkvKiB0dW5uZWwgcHJvdG9jb2wgKi8KIAlfX3U4IGVuY2FwX2xpbWl0OwkvKiBlbmNhcHN1bGF0aW9uIGxpbWl0IGZvciB0dW5uZWwgKi8KIAlfX3U4IGhvcF9saW1pdDsJCS8qIGhvcCBsaW1pdCBmb3IgdHVubmVsICovCi0JX191MzIgZmxvd2luZm87CQkvKiB0cmFmZmljIGNsYXNzIGFuZCBmbG93bGFiZWwgZm9yIHR1bm5lbCAqLworCV9fYmUzMiBmbG93aW5mbzsJLyogdHJhZmZpYyBjbGFzcyBhbmQgZmxvd2xhYmVsIGZvciB0dW5uZWwgKi8KIAlfX3UzMiBmbGFnczsJCS8qIHR1bm5lbCBmbGFncyAqLwogCXN0cnVjdCBpbjZfYWRkciBsYWRkcjsJLyogbG9jYWwgdHVubmVsIGVuZC1wb2ludCBhZGRyZXNzICovCiAJc3RydWN0IGluNl9hZGRyIHJhZGRyOwkvKiByZW1vdGUgdHVubmVsIGVuZC1wb2ludCBhZGRyZXNzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwbWkuaCBiL2luY2x1ZGUvbGludXgvaXBtaS5oCmluZGV4IDc5NmNhMDAuLjdhOWRiMzkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwbWkuaApAQCAtMjA4LDYgKzIwOCwxNSBAQAogICAgY29kZSBhcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgaW5jb21pbmcgZGF0YSwgdW5saWtlIGEgcmVzcG9uc2UuICovCiAKIAorLyoKKyAqIE1vZGVzIGZvciBpcG1pX3NldF9tYWludF9tb2RlKCkgYW5kIHRoZSB1c2VybGFuZCBJT0NUTC4gIFRoZSBBVVRPCisgKiBzZXR0aW5nIGlzIHRoZSBkZWZhdWx0IGFuZCBtZWFucyBpdCB3aWxsIGJlIHNldCBvbiBjZXJ0YWluCisgKiBjb21tYW5kcy4gIEhhcmQgc2V0dGluZyBpdCBvbiBhbmQgb2ZmIHdpbGwgb3ZlcnJpZGUgYXV0b21hdGljCisgKiBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgSVBNSV9NQUlOVEVOQU5DRV9NT0RFX0FVVE8JMAorI2RlZmluZSBJUE1JX01BSU5URU5BTkNFX01PREVfT0ZGCTEKKyNkZWZpbmUgSVBNSV9NQUlOVEVOQU5DRV9NT0RFX09OCTIKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMzc0LDYgKzM4MywzNSBAQAogCQkJICAgIHVuc2lnbmVkIGludCAgY2hhbnMpOwogCiAvKgorICogR28gaW50byBhIG1vZGUgd2hlcmUgdGhlIGRyaXZlciB3aWxsIG5vdCBhdXRvbm9tb3VzbHkgYXR0ZW1wdCB0byBkbworICogdGhpbmdzIHdpdGggdGhlIGludGVyZmFjZS4gIEl0IHdpbGwgc3RpbGwgcmVzcG9uZCB0byBhdHRlbnRpb25zIGFuZAorICogaW50ZXJydXB0cywgYW5kIGl0IHdpbGwgZXhwZWN0IHRoYXQgY29tbWFuZHMgd2lsbCBjb21wbGV0ZS4gIEl0CisgKiB3aWxsIG5vdCBhdXRvbWF0Y2lhbGx5IGNoZWNrIGZvciBmbGFncywgZXZlbnRzLCBvciB0aGluZ3Mgb2YgdGhhdAorICogbmF0dXJlLgorICoKKyAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGZpcm13YXJlIHVwZ3JhZGVzLiAgVGhlIGlkZWEgaXMgdGhhdAorICogd2hlbiB5b3UgZ28gaW50byBmaXJtd2FyZSB1cGdyYWRlIG1vZGUsIHlvdSBkbyB0aGlzIG9wZXJhdGlvbgorICogYW5kIHRoZSBkcml2ZXIgd2lsbCBub3QgYXR0ZW1wdCB0byBkbyBhbnl0aGluZyBidXQgd2hhdCB5b3UgdGVsbAorICogaXQgb3Igd2hhdCB0aGUgQk1DIGFza3MgZm9yLgorICoKKyAqIE5vdGUgdGhhdCBpZiB5b3Ugc2VuZCBhIGNvbW1hbmQgdGhhdCByZXNldHMgdGhlIEJNQywgdGhlIGRyaXZlcgorICogd2lsbCBzdGlsbCBleHBlY3QgYSByZXNwb25zZSBmcm9tIHRoYXQgY29tbWFuZC4gIFNvIHRoZSBCTUMgc2hvdWxkCisgKiByZXNldCBpdHNlbGYgKmFmdGVyKiB0aGUgcmVzcG9uc2UgaXMgc2VudC4gIFJlc2V0dGluZyBiZWZvcmUgdGhlCisgKiByZXNwb25zZSBpcyBqdXN0IHNpbGx5LgorICoKKyAqIElmIGluIGF1dG8gbWFpbnRlbmFuY2UgbW9kZSwgdGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZ28gaW50bworICogbWFpbnRlbmFuY2UgbW9kZSBmb3IgMzAgc2Vjb25kcyBpZiBpdCBzZWVzIGEgY29sZCByZXNldCwgYSB3YXJtCisgKiByZXNldCwgb3IgYSBmaXJtd2FyZSBOZXRGTi4gIFRoaXMgbWVhbnMgdGhhdCBjb2RlIHRoYXQgdXNlcyBvbmx5CisgKiBmaXJtd2FyZSBOZXRGTiBjb21tYW5kcyB0byBkbyB1cGdyYWRlcyB3aWxsIHdvcmsgYXV0b21hdGljYWxseQorICogd2l0aG91dCBjaGFuZ2UsIGFzc3VtaW5nIGl0IHNlbmRzIGEgbWVzc2FnZSBldmVyeSAzMCBzZWNvbmRzIG9yCisgKiBsZXNzLgorICoKKyAqIFNlZSB0aGUgSVBNSV9NQUlOVEVOQU5DRV9NT0RFX3h4eCBkZWZpbmVzIGZvciB3aGF0IHRoZSBtb2RlIG1lYW5zLgorICovCitpbnQgaXBtaV9nZXRfbWFpbnRlbmFuY2VfbW9kZShpcG1pX3VzZXJfdCB1c2VyKTsKK2ludCBpcG1pX3NldF9tYWludGVuYW5jZV9tb2RlKGlwbWlfdXNlcl90IHVzZXIsIGludCBtb2RlKTsKKworLyoKICAqIEFsbG93IHJ1bi10by1jb21wbGV0aW9uIG1vZGUgdG8gYmUgc2V0IGZvciB0aGUgaW50ZXJmYWNlIG9mCiAgKiBhIHNwZWNpZmljIHVzZXIuCiAgKi8KQEAgLTY1Niw0ICs2OTQsMTEgQEAKICNkZWZpbmUgSVBNSUNUTF9HRVRfVElNSU5HX1BBUk1TX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAyMywgXAogCQkJCQkgICAgIHN0cnVjdCBpcG1pX3RpbWluZ19wYXJtcykKIAorLyoKKyAqIFNldCB0aGUgbWFpbnRlbmFuY2UgbW9kZS4gIFNlZSBpcG1pX3NldF9tYWludGVuYW5jZV9tb2RlKCkgYWJvdmUKKyAqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBkb2VzLgorICovCisjZGVmaW5lIElQTUlDVExfR0VUX01BSU5URU5BTkNFX01PREVfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDMwLCBpbnQpCisjZGVmaW5lIElQTUlDVExfU0VUX01BSU5URU5BTkNFX01PREVfQ01ECV9JT1coSVBNSV9JT0NfTUFHSUMsIDMxLCBpbnQpCisKICNlbmRpZiAvKiBfX0xJTlVYX0lQTUlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcG1pX21zZ2RlZnMuaCBiL2luY2x1ZGUvbGludXgvaXBtaV9tc2dkZWZzLmgKaW5kZXggMjJmNWUyYS4uYjU2YTE1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcG1pX21zZ2RlZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwbWlfbXNnZGVmcy5oCkBAIC00Niw2ICs0Niw4IEBACiAjZGVmaW5lIElQTUlfTkVURk5fQVBQX1JFUVVFU1QJCQkweDA2CiAjZGVmaW5lIElQTUlfTkVURk5fQVBQX1JFU1BPTlNFCQkJMHgwNwogI2RlZmluZSBJUE1JX0dFVF9ERVZJQ0VfSURfQ01ECQkweDAxCisjZGVmaW5lIElQTUlfQ09MRF9SRVNFVF9DTUQJCTB4MDIKKyNkZWZpbmUgSVBNSV9XQVJNX1JFU0VUX0NNRAkJMHgwMwogI2RlZmluZSBJUE1JX0NMRUFSX01TR19GTEFHU19DTUQJMHgzMAogI2RlZmluZSBJUE1JX0dFVF9ERVZJQ0VfR1VJRF9DTUQJMHgwOAogI2RlZmluZSBJUE1JX0dFVF9NU0dfRkxBR1NfQ01ECQkweDMxCkBAIC02MCwyMSArNjIsMzAgQEAKICNkZWZpbmUgSVBNSV9ORVRGTl9TVE9SQUdFX1JFU1BPTlNFCQkweDBiCiAjZGVmaW5lIElQTUlfQUREX1NFTF9FTlRSWV9DTUQJCTB4NDQKIAorI2RlZmluZSBJUE1JX05FVEZOX0ZJUk1XQVJFX1JFUVVFU1QJCTB4MDgKKyNkZWZpbmUgSVBNSV9ORVRGTl9GSVJNV0FSRV9SRVNQT05TRQkJMHgwOQorCiAvKiBUaGUgZGVmYXVsdCBzbGF2ZSBhZGRyZXNzICovCiAjZGVmaW5lIElQTUlfQk1DX1NMQVZFX0FERFIJMHgyMAogCiAvKiBUaGUgQlQgaW50ZXJmYWNlIG9uIGhpZ2gtZW5kIEhQIHN5c3RlbXMgc3VwcG9ydHMgdXAgdG8gMjU1IGJ5dGVzIGluCiAgKiBvbmUgdHJhbnNmZXIuICBJdHMgInZpcnR1YWwiIEJNQyBzdXBwb3J0cyBzb21lIGNvbW1hbmRzIHRoYXQgYXJlIGxvbmdlcgogICogdGhhbiAxMjggYnl0ZXMuICBVc2UgdGhlIGZ1bGwgMjU2LCBwbHVzIE5ldEZuL0xVTiwgQ21kLCBjQ29kZSwgcGx1cwotICogc29tZSBvdmVyaGVhZC4gIEl0IHdvdWxkIGJlIG5pY2UgdG8gYmFzZSB0aGlzIG9uIHRoZSAiQlQgQ2FwYWJpbGl0aWVzIgotICogYnV0IHRoYXQncyB0b28gaGFyZCB0byBwcm9wYWdhdGUgdG8gdGhlIHJlc3Qgb2YgdGhlIGRyaXZlci4gKi8KKyAqIHNvbWUgb3ZlcmhlYWQ7IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gZHluYW1pY2FsbHkgc2l6ZSB0aGlzIGJhc2VkCisgKiBvbiB0aGUgcmVzdWx0cyBvZiB0aGUgIkdldCBCVCBDYXBhYmlsaXRpZXMiIGNvbW1hbmQuICovCiAjZGVmaW5lIElQTUlfTUFYX01TR19MRU5HVEgJMjcyCS8qIG11bHRpcGxlIG9mIDE2ICovCiAKICNkZWZpbmUgSVBNSV9DQ19OT19FUlJPUgkJMHgwMAogI2RlZmluZSBJUE1JX05PREVfQlVTWV9FUlIJCTB4YzAKICNkZWZpbmUgSVBNSV9JTlZBTElEX0NPTU1BTkRfRVJSCTB4YzEKKyNkZWZpbmUgSVBNSV9USU1FT1VUX0VSUgkJMHhjMwogI2RlZmluZSBJUE1JX0VSUl9NU0dfVFJVTkNBVEVECQkweGM2CisjZGVmaW5lIElQTUlfUkVRX0xFTl9JTlZBTElEX0VSUgkweGM3CisjZGVmaW5lIElQTUlfUkVRX0xFTl9FWENFRURFRF9FUlIJMHhjOAorI2RlZmluZSBJUE1JX05PVF9JTl9NWV9TVEFURV9FUlIJMHhkNQkvKiBJUE1JIDIuMCAqLwogI2RlZmluZSBJUE1JX0xPU1RfQVJCSVRSQVRJT05fRVJSCTB4ODEKKyNkZWZpbmUgSVBNSV9CVVNfRVJSCQkJMHg4MgorI2RlZmluZSBJUE1JX05BS19PTl9XUklURV9FUlIJCTB4ODMKICNkZWZpbmUgSVBNSV9FUlJfVU5TUEVDSUZJRUQJCTB4ZmYKIAogI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfSVBNQgkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwbWlfc21pLmggYi9pbmNsdWRlL2xpbnV4L2lwbWlfc21pLmgKaW5kZXggNmQ5YzdlNC4uYzA2MzMxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcG1pX3NtaS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBtaV9zbWkuaApAQCAtMTE1LDYgKzExNSwxMyBAQAogCSAgIHBvbGwgZm9yIG9wZXJhdGlvbnMgZHVyaW5nIHRoaW5ncyBsaWtlIGNyYXNoIGR1bXBzLiAqLwogCXZvaWQgKCpwb2xsKSh2b2lkICpzZW5kX2luZm8pOwogCisJLyogRW5hYmxlL2Rpc2FibGUgZmlybXdhcmUgbWFpbnRlbmFuY2UgbW9kZS4gIE5vdGUgdGhhdCB0aGlzCisJICAgaXMgKm5vdCogdGhlIG1vZGVzIGRlZmluZWQsIHRoaXMgaXMgc2ltcGx5IGFuIG9uL29mZgorCSAgIHNldHRpbmcuICBUaGUgbWVzc2FnZSBoYW5kbGVyIGRvZXMgdGhlIG1vZGUgaGFuZGxpbmcuICBOb3RlCisJICAgdGhhdCB0aGlzIGlzIGNhbGxlZCBmcm9tIGludGVydXB0IGNvbnRleHQsIHNvIGl0IGNhbm5vdAorCSAgIGJsb2NrLiAqLworCXZvaWQgKCpzZXRfbWFpbnRlbmFuY2VfbW9kZSkodm9pZCAqc2VuZF9pbmZvLCBpbnQgZW5hYmxlKTsKKwogCS8qIFRlbGwgdGhlIGhhbmRsZXIgdGhhdCB3ZSBhcmUgdXNpbmcgaXQvbm90IHVzaW5nIGl0LiAgVGhlCiAJICAgbWVzc2FnZSBoYW5kbGVyIGdldCB0aGUgbW9kdWxlcyB0aGF0IHRoaXMgaGFuZGxlciBiZWxvbmdzCiAJICAgdG87IHRoaXMgZnVuY3Rpb24gbGV0cyB0aGUgU01JIGNsYWltIGFueSBtb2R1bGVzIHRoYXQgaXQKQEAgLTE3Myw2ICsxODAsNyBAQAogCQkgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgKnNlbmRfaW5mbywKIAkJICAgICAgc3RydWN0IGlwbWlfZGV2aWNlX2lkICAgICpkZXZpY2VfaWQsCiAJCSAgICAgIHN0cnVjdCBkZXZpY2UgICAgICAgICAgICAqZGV2LAorCQkgICAgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgKnN5c2ZzX25hbWUsCiAJCSAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICBzbGF2ZV9hZGRyKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXB2Ni5oIGIvaW5jbHVkZS9saW51eC9pcHY2LmgKaW5kZXggNGY0MzVjNS4uZjgyNDExMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcHY2LmgKKysrIGIvaW5jbHVkZS9saW51eC9pcHY2LmgKQEAgLTI3NCw3ICsyNzQsNyBAQAogCXN0cnVjdCBpbjZfYWRkcgkJKnNhZGRyX2NhY2hlOwogI2VuZGlmCiAKLQlfX3UzMgkJCWZsb3dfbGFiZWw7CisJX19iZTMyCQkJZmxvd19sYWJlbDsKIAlfX3UzMgkJCWZyYWdfc2l6ZTsKIAlfX3MxNgkJCWhvcF9saW1pdDsKIAlfX3MxNgkJCW1jYXN0X2hvcHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lweC5oIGIvaW5jbHVkZS9saW51eC9pcHguaAppbmRleCA0ZjI5YzYwLi5lYjE5YjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lweC5oCisrKyBiL2luY2x1ZGUvbGludXgvaXB4LmgKQEAgLTcsOCArNyw4IEBACiAKIHN0cnVjdCBzb2NrYWRkcl9pcHggewogCXNhX2ZhbWlseV90CXNpcHhfZmFtaWx5OwotCV9fdTE2CQlzaXB4X3BvcnQ7Ci0JX191MzIJCXNpcHhfbmV0d29yazsKKwlfX2JlMTYJCXNpcHhfcG9ydDsKKwlfX2JlMzIJCXNpcHhfbmV0d29yazsKIAl1bnNpZ25lZCBjaGFyIAlzaXB4X25vZGVbSVBYX05PREVfTEVOXTsKIAlfX3U4CQlzaXB4X3R5cGU7CiAJdW5zaWduZWQgY2hhcglzaXB4X3plcm87CS8qIDE2IGJ5dGUgZmlsbCAqLwpAQCAtMjMsMTMgKzIzLDEzIEBACiAjZGVmaW5lIElQWF9DUlRJVEYJMQogCiBzdHJ1Y3QgaXB4X3JvdXRlX2RlZmluaXRpb24gewotCV9fdTMyICAgICAgICAgaXB4X25ldHdvcms7Ci0JX191MzIgICAgICAgICBpcHhfcm91dGVyX25ldHdvcms7CisJX19iZTMyICAgICAgICBpcHhfbmV0d29yazsKKwlfX2JlMzIgICAgICAgIGlweF9yb3V0ZXJfbmV0d29yazsKIAl1bnNpZ25lZCBjaGFyIGlweF9yb3V0ZXJfbm9kZVtJUFhfTk9ERV9MRU5dOwogfTsKIAogc3RydWN0IGlweF9pbnRlcmZhY2VfZGVmaW5pdGlvbiB7Ci0JX191MzIgICAgICAgICBpcHhfbmV0d29yazsKKwlfX2JlMzIgICAgICAgIGlweF9uZXR3b3JrOwogCXVuc2lnbmVkIGNoYXIgaXB4X2RldmljZVsxNl07CiAJdW5zaWduZWQgY2hhciBpcHhfZGxpbmtfdHlwZTsKICNkZWZpbmUgSVBYX0ZSQU1FX05PTkUJCTAKQEAgLTU1LDggKzU1LDggQEAKICAqLwogCiBzdHJ1Y3QgaXB4X3JvdXRlX2RlZiB7Ci0JX191MzIJCWlweF9uZXR3b3JrOwotCV9fdTMyCQlpcHhfcm91dGVyX25ldHdvcms7CisJX19iZTMyCQlpcHhfbmV0d29yazsKKwlfX2JlMzIJCWlweF9yb3V0ZXJfbmV0d29yazsKICNkZWZpbmUgSVBYX1JPVVRFX05PX1JPVVRFUgkwCiAJdW5zaWduZWQgY2hhcglpcHhfcm91dGVyX25vZGVbSVBYX05PREVfTEVOXTsKIAl1bnNpZ25lZCBjaGFyCWlweF9kZXZpY2VbMTZdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggYzY0ZjNjYy4uNTJmYzQwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC0xNDEsNiArMTQxLDcgQEAKICAqIEBwZW5kaW5nX21hc2s6CXBlbmRpbmcgcmViYWxhbmNlZCBpbnRlcnJ1cHRzCiAgKiBAZGlyOgkJL3Byb2MvaXJxLyBwcm9jZnMgZW50cnkKICAqIEBhZmZpbml0eV9lbnRyeToJL3Byb2MvaXJxL3NtcF9hZmZpbml0eSBwcm9jZnMgZW50cnkgb24gU01QCisgKiBAbmFtZToJCWZsb3cgaGFuZGxlciBuYW1lIGZvciAvcHJvYy9pbnRlcnJ1cHRzIG91dHB1dAogICoKICAqIFBhZCB0aGlzIG91dCB0byAzMiBieXRlcyBmb3IgY2FjaGUgYW5kIGluZGV4aW5nIHJlYXNvbnMuCiAgKi8KQEAgLTE2NSw4ICsxNjYsOSBAQAogCWNwdW1hc2tfdAkJcGVuZGluZ19tYXNrOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcjsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmRpcjsKICNlbmRpZgorCWNvbnN0IGNoYXIJCSpuYW1lOwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIGV4dGVybiBzdHJ1Y3QgaXJxX2Rlc2MgaXJxX2Rlc2NbTlJfSVJRU107CkBAIC0yNzIsMTIgKzI3NCw2IEBACiBleHRlcm4gdm9pZCBmYXN0Y2FsbCBoYW5kbGVfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogCiAvKgotICogR2V0IGEgZGVzY3JpcHRpdmUgc3RyaW5nIGZvciB0aGUgaGlnaGxldmVsIGhhbmRsZXIsIGZvcgotICogL3Byb2MvaW50ZXJydXB0cyBvdXRwdXQ6Ci0gKi8KLWV4dGVybiBjb25zdCBjaGFyICpoYW5kbGVfaXJxX25hbWUoaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZSk7Ci0KLS8qCiAgKiBNb25vbGl0aGljIGRvX0lSUSBpbXBsZW1lbnRhdGlvbi4KICAqIChpcyBhbiBleHBsaWNpdCBmYXN0Y2FsbCwgYmVjYXVzZSBpMzg2IDRLU1RBQ0tTIGNhbGxzIGl0IGZyb20gYXNzZW1ibHkpCiAgKi8KQEAgLTMyOSw3ICszMjUsMTIgQEAKIHNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAsCiAJCQkgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZSk7CiBleHRlcm4gdm9pZAotX19zZXRfaXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZSwgaW50IGlzX2NoYWluZWQpOworc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9jaGlwICpjaGlwLAorCQkJICAgICAgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSk7CisKK2V4dGVybiB2b2lkCitfX3NldF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlLCBpbnQgaXNfY2hhaW5lZCwKKwkJICBjb25zdCBjaGFyICpuYW1lKTsKIAogLyoKICAqIFNldCBhIGhpZ2hsZXZlbCBmbG93IGhhbmRsZXIgZm9yIGEgZ2l2ZW4gSVJROgpAQCAtMzM3LDcgKzMzOCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHNldF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlKQogewotCV9fc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlLCAwKTsKKwlfX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZSwgMCwgTlVMTCk7CiB9CiAKIC8qCkBAIC0zNDksNyArMzUwLDcgQEAKIHNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsCiAJCQlpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlKQogewotCV9fc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlLCAxKTsKKwlfX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZSwgMSwgTlVMTCk7CiB9CiAKIC8qIEhhbmRsZSBkeW5hbWljIGlycSBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXNkbi5oIGIvaW5jbHVkZS9saW51eC9pc2RuLmgKaW5kZXggNjI5OTExNC4uM2M3ODc1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pc2RuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pc2RuLmgKQEAgLTUxMSw4ICs1MTEsOCBAQAogI2VuZGlmCiAgIHN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OyAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gY29ycmVzcG9uZGluZyB0dHkgICAqLwogICBhdGVtdSAgICAgICAgICAgICAgICAgZW11OyAgICAgICAgICAgICAvKiBBVC1lbXVsYXRvciBkYXRhICAgICAgICAgICAgICAgKi8KLSAgc3RydWN0IHRlcm1pb3MJbm9ybWFsX3Rlcm1pb3M7ICAvKiBGb3Igc2F2aW5nIHRlcm1pb3Mgc3RydWN0cyAgICAgKi8KLSAgc3RydWN0IHRlcm1pb3MJY2FsbG91dF90ZXJtaW9zOworICBzdHJ1Y3Qga3Rlcm1pb3MJbm9ybWFsX3Rlcm1pb3M7ICAvKiBGb3Igc2F2aW5nIHRlcm1pb3Mgc3RydWN0cyAgICAgKi8KKyAgc3RydWN0IGt0ZXJtaW9zCWNhbGxvdXRfdGVybWlvczsKICAgd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0LCBjbG9zZV93YWl0OwogICBzdHJ1Y3Qgc2VtYXBob3JlICAgICAgd3JpdGVfc2VtOwogICBzcGlubG9ja190CSAgICAgICAgcmVhZGxvY2s7CkBAIC01MjUsOCArNTI1LDggQEAKICAgaW50ICAgICAgICAgICAgICAgIHJlZmNvdW50OwkJCQkvKiBOdW1iZXIgb2Ygb3BlbnMgICAgICAgICovCiAgIHN0cnVjdCB0dHlfZHJpdmVyICAqdHR5X21vZGVtOwkJCS8qIHR0eS1kZXZpY2UgICAgICAgICAgICAgKi8KICAgc3RydWN0IHR0eV9zdHJ1Y3QgICptb2RlbV90YWJsZVtJU0ROX01BWF9DSEFOTkVMU107CS8qID8/IGNvcGllZCBmcm9tIE9yaWcgICAgKi8KLSAgc3RydWN0IHRlcm1pb3MgICAgICptb2RlbV90ZXJtaW9zW0lTRE5fTUFYX0NIQU5ORUxTXTsKLSAgc3RydWN0IHRlcm1pb3MgICAgICptb2RlbV90ZXJtaW9zX2xvY2tlZFtJU0ROX01BWF9DSEFOTkVMU107CisgIHN0cnVjdCBrdGVybWlvcyAgICAgKm1vZGVtX3Rlcm1pb3NbSVNETl9NQVhfQ0hBTk5FTFNdOworICBzdHJ1Y3Qga3Rlcm1pb3MgICAgICptb2RlbV90ZXJtaW9zX2xvY2tlZFtJU0ROX01BWF9DSEFOTkVMU107CiAgIG1vZGVtX2luZm8gICAgICAgICBpbmZvW0lTRE5fTUFYX0NIQU5ORUxTXTsJICAgLyogUHJpdmF0ZSBkYXRhICAgICAgICAgICAqLwogfSBpc2RuX21vZGVtX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXN0YWxsaW9uLmggYi9pbmNsdWRlL2xpbnV4L2lzdGFsbGlvbi5oCmluZGV4IGI1NWUyYTAuLjEwNmE1ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXN0YWxsaW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9pc3RhbGxpb24uaApAQCAtNDksMTMgKzQ5LDEzIEBACiAgKgljb21tdW5pY2F0aW9uIHdpdGggdGhlIHNsYXZlIGJvYXJkIHdpbGwgYWx3YXlzIGJlIG9uIGEgcGVyIHBvcnQKICAqCWJhc2lzLgogICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3Qgc3RsaXBvcnQgewogCXVuc2lnbmVkIGxvbmcJCW1hZ2ljOwotCWludAkJCXBvcnRucjsKLQlpbnQJCQlwYW5lbG5yOwotCWludAkJCWJyZG5yOworCXVuc2lnbmVkIGludAkJcG9ydG5yOworCXVuc2lnbmVkIGludAkJcGFuZWxucjsKKwl1bnNpZ25lZCBpbnQJCWJyZG5yOwogCXVuc2lnbmVkIGxvbmcJCXN0YXRlOwotCWludAkJCWRldm5yOworCXVuc2lnbmVkIGludAkJZGV2bnI7CiAJaW50CQkJZmxhZ3M7CiAJaW50CQkJYmF1ZF9iYXNlOwogCWludAkJCWN1c3RvbV9kaXZpc29yOwpAQCAtNzIsNyArNzIsNyBAQAogCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJcmF3X3dhaXQ7CiAJc3RydWN0IHdvcmtfc3RydWN0CXRxaGFuZ3VwOwotCWFzeXNpZ3NfdAkJYXNpZzsKKwlzdHJ1Y3QgYXN5c2lncwkJYXNpZzsKIAl1bnNpZ25lZCBsb25nCQlhZGRyOwogCXVuc2lnbmVkIGxvbmcJCXJ4b2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcJCXR4b2Zmc2V0OwpAQCAtODMsMzEgKzgzLDMxIEBACiAJdW5zaWduZWQgY2hhcgkJcmVxYml0OwogCXVuc2lnbmVkIGNoYXIJCXBvcnRpZHg7CiAJdW5zaWduZWQgY2hhcgkJcG9ydGJpdDsKLX0gc3RsaXBvcnRfdDsKK307CiAKIC8qCiAgKglVc2UgYSBzdHJ1Y3R1cmUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdG8gZG8gYm9hcmQgbGV2ZWwgb3BlcmF0aW9ucy4KICAqCVRoZXNlIGluY2x1ZGUsIGVuYWJsZS9kaXNhYmxlLCBwYWdpbmcgc2hhcmVkIG1lbW9yeSwgaW50ZXJydXB0aW5nLCBldGMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IHN0bGlicmQgeworc3RydWN0IHN0bGlicmQgewogCXVuc2lnbmVkIGxvbmcJbWFnaWM7Ci0JaW50CQlicmRucjsKLQlpbnQJCWJyZHR5cGU7Ci0JaW50CQlzdGF0ZTsKLQlpbnQJCW5ycGFuZWxzOwotCWludAkJbnJwb3J0czsKLQlpbnQJCW5yZGV2czsKKwl1bnNpZ25lZCBpbnQJYnJkbnI7CisJdW5zaWduZWQgaW50CWJyZHR5cGU7CisJdW5zaWduZWQgaW50CXN0YXRlOworCXVuc2lnbmVkIGludAlucnBhbmVsczsKKwl1bnNpZ25lZCBpbnQJbnJwb3J0czsKKwl1bnNpZ25lZCBpbnQJbnJkZXZzOwogCXVuc2lnbmVkIGludAlpb2Jhc2U7CiAJaW50CQlpb3NpemU7CiAJdW5zaWduZWQgbG9uZwltZW1hZGRyOwogCXZvaWQJCV9faW9tZW0gKm1lbWJhc2U7Ci0JaW50CQltZW1zaXplOworCXVuc2lnbmVkIGxvbmcJbWVtc2l6ZTsKIAlpbnQJCXBhZ2VzaXplOwogCWludAkJaG9zdG9mZnNldDsKIAlpbnQJCXNsYXZlb2Zmc2V0OwogCWludAkJYml0c2l6ZTsKIAlpbnQJCWVuYWJ2YWw7Ci0JaW50CQlwYW5lbHNbU1RMX01BWFBBTkVMU107CisJdW5zaWduZWQgaW50CXBhbmVsc1tTVExfTUFYUEFORUxTXTsKIAlpbnQJCXBhbmVsaWRzW1NUTF9NQVhQQU5FTFNdOwogCXZvaWQJCSgqaW5pdCkoc3RydWN0IHN0bGlicmQgKmJyZHApOwogCXZvaWQJCSgqZW5hYmxlKShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CkBAIC0xMTYsOCArMTE2LDggQEAKIAl2b2lkCQlfX2lvbWVtICooKmdldG1lbXB0cikoc3RydWN0IHN0bGlicmQgKmJyZHAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgbGluZSk7CiAJdm9pZAkJKCppbnRyKShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCk7CiAJdm9pZAkJKCpyZXNldCkoc3RydWN0IHN0bGlicmQgKmJyZHApOwotCXN0bGlwb3J0X3QJKnBvcnRzW1NUTF9NQVhQT1JUU107Ci19IHN0bGlicmRfdDsKKwlzdHJ1Y3Qgc3RsaXBvcnQJKnBvcnRzW1NUTF9NQVhQT1JUU107Cit9OwogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2l4anVzZXIuaCBiL2luY2x1ZGUvbGludXgvaXhqdXNlci5oCmluZGV4IGZkMTc1NmQuLjg4YjQ1ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXhqdXNlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaXhqdXNlci5oCkBAIC0zMTUsNyArMzE1LDcgQEAKICogc3RydWN0dXJlcy4gIElmIHRoZSBmcmVxMCB2YXJpYWJsZSBpcyBub24temVybywgdGhlIHRvbmUgdGFibGUgY29udGVudHMKICogZm9yIHRoZSB0b25lX2luZGV4IGFyZSB1cGRhdGVkIHRvIHRoZSBmcmVxdWVuY2llcyBhbmQgZ2FpbnMgZGVmaW5lZC4gIEl0CiAqIHNob3VsZCBiZSBub3RlZCB0aGF0IERUTUYgdG9uZXMgY2Fubm90IGJlIHJlYXNzaWduZWQsIHNvIGlmIERUTUYgdG9uZQotKiB0YWJsZSBpbmRleHMgYXJlIHVzZWQgaW4gYSBjYWRlbmNlIHRoZSBmcmVxdWVuY3kgYW5kIGdhaW4gdmFyaWFibGVzIHdpbGwKKyogdGFibGUgaW5kZXhlcyBhcmUgdXNlZCBpbiBhIGNhZGVuY2UgdGhlIGZyZXF1ZW5jeSBhbmQgZ2FpbiB2YXJpYWJsZXMgd2lsbAogKiBiZSBpZ25vcmVkLgogKgogKiBJZiB0aGUgYXJyYXkgZWxlbWVudHMgY29udGFpbiBmcmVxdWVuY3kgcGFyYW1ldGVycyB0aGUgZHJpdmVyIHdpbGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkLmggYi9pbmNsdWRlL2xpbnV4L2piZC5oCmluZGV4IGZlODk0NDQuLjQ1MjczNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQuaApAQCAtODM5LDcgKzgzOSw2IEBACiAgKi8KIAogLyogRmlsaW5nIGJ1ZmZlcnMgKi8KLWV4dGVybiB2b2lkIF9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpOwogZXh0ZXJuIHZvaWQgam91cm5hbF91bmZpbGVfYnVmZmVyKGpvdXJuYWxfdCAqLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICopOwogZXh0ZXJuIHZvaWQgX19qb3VybmFsX3VuZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKIGV4dGVybiB2b2lkIF9fam91cm5hbF9yZWZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CkBAIC05NDksNyArOTQ4LDcgQEAKIC8qCiAgKiBoYW5kbGUgbWFuYWdlbWVudAogICovCi1leHRlcm4ga21lbV9jYWNoZV90ICpqYmRfaGFuZGxlX2NhY2hlOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpqYmRfaGFuZGxlX2NhY2hlOwogCiBzdGF0aWMgaW5saW5lIGhhbmRsZV90ICpqYmRfYWxsb2NfaGFuZGxlKGdmcF90IGdmcF9mbGFncykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkMi5oIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKaW5kZXggZGRiMTI4Ny4uMGUwZmVkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQyLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKQEAgLTg0OCw3ICs4NDgsNiBAQAogICovCiAKIC8qIEZpbGluZyBidWZmZXJzICovCi1leHRlcm4gdm9pZCBfX2piZDJfam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpOwogZXh0ZXJuIHZvaWQgamJkMl9qb3VybmFsX3VuZmlsZV9idWZmZXIoam91cm5hbF90ICosIHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CiBleHRlcm4gdm9pZCBfX2piZDJfam91cm5hbF91bmZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CiBleHRlcm4gdm9pZCBfX2piZDJfam91cm5hbF9yZWZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CkBAIC05NTgsNyArOTU3LDcgQEAKIC8qCiAgKiBoYW5kbGUgbWFuYWdlbWVudAogICovCi1leHRlcm4ga21lbV9jYWNoZV90ICpqYmQyX2hhbmRsZV9jYWNoZTsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9oYW5kbGVfY2FjaGU7CiAKIHN0YXRpYyBpbmxpbmUgaGFuZGxlX3QgKmpiZF9hbGxvY19oYW5kbGUoZ2ZwX3QgZ2ZwX2ZsYWdzKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qaWZmaWVzLmggYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAppbmRleCBjOGQ1ZjIwLi4wZWM2ZTI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaApAQCAtNzQsNyArNzQsNyBAQAogI2RlZmluZSBfX2ppZmZ5X2RhdGEgIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5kYXRhIikpKQogCiAvKgotICogVGhlIDY0LWJpdCB2YWx1ZSBpcyBub3Qgdm9sYXRpbGUgLSB5b3UgTVVTVCBOT1QgcmVhZCBpdAorICogVGhlIDY0LWJpdCB2YWx1ZSBpcyBub3QgYXRvbWljIC0geW91IE1VU1QgTk9UIHJlYWQgaXQKICAqIHdpdGhvdXQgc2FtcGxpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBpbiB4dGltZV9sb2NrLgogICogZ2V0X2ppZmZpZXNfNjQoKSB3aWxsIGRvIHRoaXMgZm9yIHlvdSBhcyBhcHByb3ByaWF0ZS4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rYmRfa2Vybi5oIGIvaW5jbHVkZS9saW51eC9rYmRfa2Vybi5oCmluZGV4IGVmZTBlZTQuLjA2YzU4YzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2JkX2tlcm4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2tiZF9rZXJuLmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogCWlmICh0LT5idWYudGFpbCAhPSBOVUxMKQogCQl0LT5idWYudGFpbC0+Y29tbWl0ID0gdC0+YnVmLnRhaWwtPnVzZWQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdC0+YnVmLmxvY2ssIGZsYWdzKTsKLQlzY2hlZHVsZV93b3JrKCZ0LT5idWYud29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0LT5idWYud29yaywgMCk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggODBmMzljYS4uYjBjNGEwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0xMywxMSArMTMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+CiAKLWV4dGVybiBjb25zdCBjaGFyIGxpbnV4X2Jhbm5lcltdOwotCiAjZGVmaW5lIElOVF9NQVgJCSgoaW50KSh+MFU+PjEpKQogI2RlZmluZSBJTlRfTUlOCQkoLUlOVF9NQVggLSAxKQogI2RlZmluZSBVSU5UX01BWAkofjBVKQpAQCAtMzAsOCArMjksMTAgQEAKIAogI2RlZmluZSBTVEFDS19NQUdJQwkweGRlYWRiZWVmCiAKKyNkZWZpbmUgQUxJR04oeCxhKQkJX19BTElHTl9NQVNLKHgsKHR5cGVvZih4KSkoYSktMSkKKyNkZWZpbmUgX19BTElHTl9NQVNLKHgsbWFzaykJKCgoeCkrKG1hc2spKSZ+KG1hc2spKQorCiAjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQotI2RlZmluZSBBTElHTih4LGEpICgoKHgpKyhhKS0xVUwpJn4oKGEpLTFVTCkpCiAjZGVmaW5lIEZJRUxEX1NJWkVPRih0LCBmKSAoc2l6ZW9mKCgodCopMCktPmYpKQogI2RlZmluZSBESVZfUk9VTkRfVVAobixkKSAoKChuKSArIChkKSAtIDEpIC8gKGQpKQogI2RlZmluZSByb3VuZHVwKHgsIHkpICgoKCh4KSArICgoeSkgLSAxKSkgLyAoeSkpICogKHkpKQpAQCAtNjMsNyArNjQsNyBAQAogICogY29udGV4dCAoc3BpbmxvY2ssIGlycS1oYW5kbGVyLCAuLi4pLgogICoKICAqIFRoaXMgaXMgYSB1c2VmdWwgZGVidWdnaW5nIGhlbHAgdG8gYmUgYWJsZSB0byBjYXRjaCBwcm9ibGVtcyBlYXJseSBhbmQgbm90Ci0gKiBiZSBiaXRlbiBsYXRlciB3aGVuIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGhhcHBlbnMgdG8gc2xlZXAgd2hlbiBpdCBpcyBub3QKKyAqIGJlIGJpdHRlbiBsYXRlciB3aGVuIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGhhcHBlbnMgdG8gc2xlZXAgd2hlbiBpdCBpcyBub3QKICAqIHN1cHBvc2VkIHRvLgogICovCiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZCkBAIC0xNTUsMjIgKzE1NiwxMCBAQAogCiB1bnNpZ25lZCBsb25nIGludF9zcXJ0KHVuc2lnbmVkIGxvbmcpOwogCi1zdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9wdXJlX18gbG9uZ19sb2cyKHVuc2lnbmVkIGxvbmcgeCkKLXsKLQlpbnQgciA9IDA7Ci0JZm9yICh4ID4+PSAxOyB4ID4gMDsgeCA+Pj0gMSkKLQkJcisrOwotCXJldHVybiByOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fYXR0cmlidXRlX2NvbnN0X18gcm91bmR1cF9wb3dfb2ZfdHdvKHVuc2lnbmVkIGxvbmcgeCkKLXsKLQlyZXR1cm4gMVVMIDw8IGZsc19sb25nKHggLSAxKTsKLX0KLQogZXh0ZXJuIGludCBwcmludGtfcmF0ZWxpbWl0KHZvaWQpOwogZXh0ZXJuIGludCBfX3ByaW50a19yYXRlbGltaXQoaW50IHJhdGVsaW1pdF9qaWZmaWVzLCBpbnQgcmF0ZWxpbWl0X2J1cnN0KTsKK2V4dGVybiBib29sIHByaW50a190aW1lZF9yYXRlbGltaXQodW5zaWduZWQgbG9uZyAqY2FsbGVyX2ppZmZpZXMsCisJCQkJdW5zaWduZWQgaW50IGludGVydmFsX21zZWMpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV9zaWxlbnQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmgKaW5kZXggODkxYmIyYy4uYWVhMzRlNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCkBAIC00Nyw2ICs0Nyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCiAjZGVmaW5lCUtDSV9DT05UUlVQCTAJLyogYXJnOiBzdHJ1Y3QgY2FwaV9wcm9maWxlICovCiAjZGVmaW5lCUtDSV9DT05UUkRPV04JMQkvKiBhcmc6IE5VTEwgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V4ZWMuaCBiL2luY2x1ZGUvbGludXgva2V4ZWMuaAppbmRleCA2NDI3OTQ5Li5kMDI0MjVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tleGVjLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXhlYy5oCkBAIC0xMDUsOSArMTA1LDE0IEBACiAJCQkJCQl1bnNpZ25lZCBpbnQgb3JkZXIpOwogZXh0ZXJuIHZvaWQgY3Jhc2hfa2V4ZWMoc3RydWN0IHB0X3JlZ3MgKik7CiBpbnQga2V4ZWNfc2hvdWxkX2NyYXNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK3ZvaWQgY3Jhc2hfc2F2ZV9jcHUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjcHUpOwogZXh0ZXJuIHN0cnVjdCBraW1hZ2UgKmtleGVjX2ltYWdlOwogZXh0ZXJuIHN0cnVjdCBraW1hZ2UgKmtleGVjX2NyYXNoX2ltYWdlOwogCisjaWZuZGVmIGtleGVjX2ZsdXNoX2ljYWNoZV9wYWdlCisjZGVmaW5lIGtleGVjX2ZsdXNoX2ljYWNoZV9wYWdlKHBhZ2UpCisjZW5kaWYKKwogI2RlZmluZSBLRVhFQ19PTl9DUkFTSCAgMHgwMDAwMDAwMQogI2RlZmluZSBLRVhFQ19BUkNIX01BU0sgMHhmZmZmMDAwMAogCkBAIC0xMjIsNiArMTI3LDggQEAKICNkZWZpbmUgS0VYRUNfQVJDSF9JQV82NCAgICg1MCA8PCAxNikKICNkZWZpbmUgS0VYRUNfQVJDSF9TMzkwICAgICgyMiA8PCAxNikKICNkZWZpbmUgS0VYRUNfQVJDSF9TSCAgICAgICg0MiA8PCAxNikKKyNkZWZpbmUgS0VYRUNfQVJDSF9NSVBTX0xFICgxMCA8PCAxNikKKyNkZWZpbmUgS0VYRUNfQVJDSF9NSVBTICAgICggOCA8PCAxNikKIAogI2RlZmluZSBLRVhFQ19GTEFHUyAgICAoS0VYRUNfT05fQ1JBU0gpICAvKiBMaXN0IG9mIGRlZmluZWQvbGVnYWwga2V4ZWMgZmxhZ3MgKi8KIApAQCAtMTMxLDYgKzEzOCw3IEBACiB0eXBlZGVmIHUzMiBub3RlX2J1Zl90W01BWF9OT1RFX0JZVEVTLzRdOwogZXh0ZXJuIG5vdGVfYnVmX3QgKmNyYXNoX25vdGVzOwogCisKICNlbHNlIC8qICFDT05GSUdfS0VYRUMgKi8KIHN0cnVjdCBwdF9yZWdzOwogc3RydWN0IHRhc2tfc3RydWN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rb2JqZWN0LmggYi9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaAppbmRleCBiY2Q5Y2QxLi5kMWM4ZDI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaApAQCAtNDcsNiArNDcsNyBAQAogCUtPQkpfVU1PVU5UCT0gKF9fZm9yY2Uga29iamVjdF9hY3Rpb25fdCkgMHgwNSwJLyogdW1vdW50IGV2ZW50IGZvciBibG9jayBkZXZpY2VzIChicm9rZW4pICovCiAJS09CSl9PRkZMSU5FCT0gKF9fZm9yY2Uga29iamVjdF9hY3Rpb25fdCkgMHgwNiwJLyogZGV2aWNlIG9mZmxpbmUgKi8KIAlLT0JKX09OTElORQk9IChfX2ZvcmNlIGtvYmplY3RfYWN0aW9uX3QpIDB4MDcsCS8qIGRldmljZSBvbmxpbmUgKi8KKwlLT0JKX01PVkUJPSAoX19mb3JjZSBrb2JqZWN0X2FjdGlvbl90KSAweDA4LAkvKiBkZXZpY2UgbW92ZSAqLwogfTsKIAogc3RydWN0IGtvYmplY3QgewpAQCAtNzYsNiArNzcsNyBAQAogZXh0ZXJuIHZvaWQga29iamVjdF9kZWwoc3RydWN0IGtvYmplY3QgKik7CiAKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfcmVuYW1lKHN0cnVjdCBrb2JqZWN0ICosIGNvbnN0IGNoYXIgKm5ld19uYW1lKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfbW92ZShzdHJ1Y3Qga29iamVjdCAqLCBzdHJ1Y3Qga29iamVjdCAqKTsKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sga29iamVjdF9yZWdpc3RlcihzdHJ1Y3Qga29iamVjdCAqKTsKIGV4dGVybiB2b2lkIGtvYmplY3RfdW5yZWdpc3RlcihzdHJ1Y3Qga29iamVjdCAqKTsKQEAgLTI2NCw2ICsyNjYsOCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfSE9UUExVRykKIHZvaWQga29iamVjdF91ZXZlbnQoc3RydWN0IGtvYmplY3QgKmtvYmosIGVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uKTsKK3ZvaWQga29iamVjdF91ZXZlbnRfZW52KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBlbnVtIGtvYmplY3RfYWN0aW9uIGFjdGlvbiwKKwkJCWNoYXIgKmVudnBbXSk7CiAKIGludCBhZGRfdWV2ZW50X3ZhcihjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLCBpbnQgKmN1cl9pbmRleCwKIAkJCWNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplLCBpbnQgKmN1cl9sZW4sCkBAIC0yNzEsNiArMjc1LDEwIEBACiAJX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDcsIDgpKSk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGtvYmplY3RfdWV2ZW50KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBlbnVtIGtvYmplY3RfYWN0aW9uIGFjdGlvbikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQga29iamVjdF91ZXZlbnRfZW52KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgIGVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uLAorCQkJCSAgICAgIGNoYXIgKmVudnBbXSkKK3sgfQogCiBzdGF0aWMgaW5saW5lIGludCBhZGRfdWV2ZW50X3ZhcihjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLCBpbnQgKmN1cl9pbmRleCwKIAkJCQkgICAgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSwgaW50ICpjdXJfbGVuLCAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKaW5kZXggYWM0YzA1NS4uNzY5YmUzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKQEAgLTE2NSw3ICsxNjUsNyBAQAogZXh0ZXJuIGludCBhcmNoX2luaXRfa3Byb2Jlcyh2b2lkKTsKIGV4dGVybiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBrcHJvYmVfb3Bjb2RlX3QgKmdldF9pbnNuX3Nsb3Qodm9pZCk7Ci1leHRlcm4gdm9pZCBmcmVlX2luc25fc2xvdChrcHJvYmVfb3Bjb2RlX3QgKnNsb3QpOworZXh0ZXJuIHZvaWQgZnJlZV9pbnNuX3Nsb3Qoa3Byb2JlX29wY29kZV90ICpzbG90LCBpbnQgZGlydHkpOwogZXh0ZXJuIHZvaWQga3Byb2Jlc19pbmNfbm1pc3NlZF9jb3VudChzdHJ1Y3Qga3Byb2JlICpwKTsKIAogLyogR2V0IHRoZSBrcHJvYmUgYXQgdGhpcyBhZGRyIChpZiBhbnkpIC0gY2FsbGVkIHdpdGggcHJlZW1wdGlvbiBkaXNhYmxlZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdGltZS5oIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCmluZGV4IDg0ZWVlY2QuLjYxMWYxN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKQEAgLTI0OCw5ICsyNDgsOSBAQAogICoKICAqIFJldHVybnMgdGhlIHNjYWxhciBuYW5vc2Vjb25kcyByZXByZXNlbnRhdGlvbiBvZiBrdAogICovCi1zdGF0aWMgaW5saW5lIHU2NCBrdGltZV90b19ucyhjb25zdCBrdGltZV90IGt0KQorc3RhdGljIGlubGluZSBzNjQga3RpbWVfdG9fbnMoY29uc3Qga3RpbWVfdCBrdCkKIHsKLQlyZXR1cm4gKHU2NCkga3QudHYuc2VjICogTlNFQ19QRVJfU0VDICsga3QudHYubnNlYzsKKwlyZXR1cm4gKHM2NCkga3QudHYuc2VjICogTlNFQ19QRVJfU0VDICsga3QudHYubnNlYzsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS9saW51eC9rdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmIyYzNjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9rdm0uaApAQCAtMCwwICsxLDIyNyBAQAorI2lmbmRlZiBfX0xJTlVYX0tWTV9ICisjZGVmaW5lIF9fTElOVVhfS1ZNX0gKKworLyoKKyAqIFVzZXJzcGFjZSBpbnRlcmZhY2UgZm9yIC9kZXYva3ZtIC0ga2VybmVsIGJhc2VkIHZpcnR1YWwgbWFjaGluZQorICoKKyAqIE5vdGU6IHRoaXMgaW50ZXJmYWNlIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIHdpdGhvdXQKKyAqICAgICAgIG5vdGljZS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyoKKyAqIEFyY2hpdGVjdHVyYWwgaW50ZXJydXB0IGxpbmUgY291bnQsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYml0bWFwIG5lZWRlZAorICogdG8gaG9sZCB0aGVtLgorICovCisjZGVmaW5lIEtWTV9OUl9JTlRFUlJVUFRTIDI1NgorI2RlZmluZSBLVk1fSVJRX0JJVE1BUF9TSVpFX0JZVEVTICAgICgoS1ZNX05SX0lOVEVSUlVQVFMgKyA3KSAvIDgpCisjZGVmaW5lIEtWTV9JUlFfQklUTUFQX1NJWkUodHlwZSkgICAgKEtWTV9JUlFfQklUTUFQX1NJWkVfQllURVMgLyBzaXplb2YodHlwZSkpCisKKworLyogZm9yIEtWTV9DUkVBVEVfTUVNT1JZX1JFR0lPTiAqLworc3RydWN0IGt2bV9tZW1vcnlfcmVnaW9uIHsKKwlfX3UzMiBzbG90OworCV9fdTMyIGZsYWdzOworCV9fdTY0IGd1ZXN0X3BoeXNfYWRkcjsKKwlfX3U2NCBtZW1vcnlfc2l6ZTsgLyogYnl0ZXMgKi8KK307CisKKy8qIGZvciBrdm1fbWVtb3J5X3JlZ2lvbjo6ZmxhZ3MgKi8KKyNkZWZpbmUgS1ZNX01FTV9MT0dfRElSVFlfUEFHRVMgIDFVTAorCisKKyNkZWZpbmUgS1ZNX0VYSVRfVFlQRV9GQUlMX0VOVFJZIDEKKyNkZWZpbmUgS1ZNX0VYSVRfVFlQRV9WTV9FWElUICAgIDIKKworZW51bSBrdm1fZXhpdF9yZWFzb24geworCUtWTV9FWElUX1VOS05PV04gICAgICAgICAgPSAwLAorCUtWTV9FWElUX0VYQ0VQVElPTiAgICAgICAgPSAxLAorCUtWTV9FWElUX0lPICAgICAgICAgICAgICAgPSAyLAorCUtWTV9FWElUX0NQVUlEICAgICAgICAgICAgPSAzLAorCUtWTV9FWElUX0RFQlVHICAgICAgICAgICAgPSA0LAorCUtWTV9FWElUX0hMVCAgICAgICAgICAgICAgPSA1LAorCUtWTV9FWElUX01NSU8gICAgICAgICAgICAgPSA2LAorfTsKKworLyogZm9yIEtWTV9SVU4gKi8KK3N0cnVjdCBrdm1fcnVuIHsKKwkvKiBpbiAqLworCV9fdTMyIHZjcHU7CisJX191MzIgZW11bGF0ZWQ7ICAvKiBza2lwIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKi8KKwlfX3UzMiBtbWlvX2NvbXBsZXRlZDsgLyogbW1pbyByZXF1ZXN0IGNvbXBsZXRlZCAqLworCisJLyogb3V0ICovCisJX191MzIgZXhpdF90eXBlOworCV9fdTMyIGV4aXRfcmVhc29uOworCV9fdTMyIGluc3RydWN0aW9uX2xlbmd0aDsKKwl1bmlvbiB7CisJCS8qIEtWTV9FWElUX1VOS05PV04gKi8KKwkJc3RydWN0IHsKKwkJCV9fdTMyIGhhcmR3YXJlX2V4aXRfcmVhc29uOworCQl9IGh3OworCQkvKiBLVk1fRVhJVF9FWENFUFRJT04gKi8KKwkJc3RydWN0IHsKKwkJCV9fdTMyIGV4Y2VwdGlvbjsKKwkJCV9fdTMyIGVycm9yX2NvZGU7CisJCX0gZXg7CisJCS8qIEtWTV9FWElUX0lPICovCisJCXN0cnVjdCB7CisjZGVmaW5lIEtWTV9FWElUX0lPX0lOICAwCisjZGVmaW5lIEtWTV9FWElUX0lPX09VVCAxCisJCQlfX3U4IGRpcmVjdGlvbjsKKwkJCV9fdTggc2l6ZTsgLyogYnl0ZXMgKi8KKwkJCV9fdTggc3RyaW5nOworCQkJX191OCBzdHJpbmdfZG93bjsKKwkJCV9fdTggcmVwOworCQkJX191OCBwYWQ7CisJCQlfX3UxNiBwb3J0OworCQkJX191NjQgY291bnQ7CisJCQl1bmlvbiB7CisJCQkJX191NjQgYWRkcmVzczsKKwkJCQlfX3UzMiB2YWx1ZTsKKwkJCX07CisJCX0gaW87CisJCXN0cnVjdCB7CisJCX0gZGVidWc7CisJCS8qIEtWTV9FWElUX01NSU8gKi8KKwkJc3RydWN0IHsKKwkJCV9fdTY0IHBoeXNfYWRkcjsKKwkJCV9fdTggIGRhdGFbOF07CisJCQlfX3UzMiBsZW47CisJCQlfX3U4ICBpc193cml0ZTsKKwkJfSBtbWlvOworCX07Cit9OworCisvKiBmb3IgS1ZNX0dFVF9SRUdTIGFuZCBLVk1fU0VUX1JFR1MgKi8KK3N0cnVjdCBrdm1fcmVncyB7CisJLyogaW4gKi8KKwlfX3UzMiB2Y3B1OworCV9fdTMyIHBhZGRpbmc7CisKKwkvKiBvdXQgKEtWTV9HRVRfUkVHUykgLyBpbiAoS1ZNX1NFVF9SRUdTKSAqLworCV9fdTY0IHJheCwgcmJ4LCByY3gsIHJkeDsKKwlfX3U2NCByc2ksIHJkaSwgcnNwLCByYnA7CisJX191NjQgcjgsICByOSwgIHIxMCwgcjExOworCV9fdTY0IHIxMiwgcjEzLCByMTQsIHIxNTsKKwlfX3U2NCByaXAsIHJmbGFnczsKK307CisKK3N0cnVjdCBrdm1fc2VnbWVudCB7CisJX191NjQgYmFzZTsKKwlfX3UzMiBsaW1pdDsKKwlfX3UxNiBzZWxlY3RvcjsKKwlfX3U4ICB0eXBlOworCV9fdTggIHByZXNlbnQsIGRwbCwgZGIsIHMsIGwsIGcsIGF2bDsKKwlfX3U4ICB1bnVzYWJsZTsKKwlfX3U4ICBwYWRkaW5nOworfTsKKworc3RydWN0IGt2bV9kdGFibGUgeworCV9fdTY0IGJhc2U7CisJX191MTYgbGltaXQ7CisJX191MTYgcGFkZGluZ1szXTsKK307CisKKy8qIGZvciBLVk1fR0VUX1NSRUdTIGFuZCBLVk1fU0VUX1NSRUdTICovCitzdHJ1Y3Qga3ZtX3NyZWdzIHsKKwkvKiBpbiAqLworCV9fdTMyIHZjcHU7CisJX191MzIgcGFkZGluZzsKKworCS8qIG91dCAoS1ZNX0dFVF9TUkVHUykgLyBpbiAoS1ZNX1NFVF9TUkVHUykgKi8KKwlzdHJ1Y3Qga3ZtX3NlZ21lbnQgY3MsIGRzLCBlcywgZnMsIGdzLCBzczsKKwlzdHJ1Y3Qga3ZtX3NlZ21lbnQgdHIsIGxkdDsKKwlzdHJ1Y3Qga3ZtX2R0YWJsZSBnZHQsIGlkdDsKKwlfX3U2NCBjcjAsIGNyMiwgY3IzLCBjcjQsIGNyODsKKwlfX3U2NCBlZmVyOworCV9fdTY0IGFwaWNfYmFzZTsKKwlfX3U2NCBpbnRlcnJ1cHRfYml0bWFwW0tWTV9JUlFfQklUTUFQX1NJWkUoX191NjQpXTsKK307CisKK3N0cnVjdCBrdm1fbXNyX2VudHJ5IHsKKwlfX3UzMiBpbmRleDsKKwlfX3UzMiByZXNlcnZlZDsKKwlfX3U2NCBkYXRhOworfTsKKworLyogZm9yIEtWTV9HRVRfTVNSUyBhbmQgS1ZNX1NFVF9NU1JTICovCitzdHJ1Y3Qga3ZtX21zcnMgeworCV9fdTMyIHZjcHU7CisJX191MzIgbm1zcnM7IC8qIG51bWJlciBvZiBtc3JzIGluIGVudHJpZXMgKi8KKworCXN0cnVjdCBrdm1fbXNyX2VudHJ5IGVudHJpZXNbMF07Cit9OworCisvKiBmb3IgS1ZNX0dFVF9NU1JfSU5ERVhfTElTVCAqLworc3RydWN0IGt2bV9tc3JfbGlzdCB7CisJX191MzIgbm1zcnM7IC8qIG51bWJlciBvZiBtc3JzIGluIGVudHJpZXMgKi8KKwlfX3UzMiBpbmRpY2VzWzBdOworfTsKKworLyogZm9yIEtWTV9UUkFOU0xBVEUgKi8KK3N0cnVjdCBrdm1fdHJhbnNsYXRpb24geworCS8qIGluICovCisJX191NjQgbGluZWFyX2FkZHJlc3M7CisJX191MzIgdmNwdTsKKwlfX3UzMiBwYWRkaW5nOworCisJLyogb3V0ICovCisJX191NjQgcGh5c2ljYWxfYWRkcmVzczsKKwlfX3U4ICB2YWxpZDsKKwlfX3U4ICB3cml0ZWFibGU7CisJX191OCAgdXNlcm1vZGU7Cit9OworCisvKiBmb3IgS1ZNX0lOVEVSUlVQVCAqLworc3RydWN0IGt2bV9pbnRlcnJ1cHQgeworCS8qIGluICovCisJX191MzIgdmNwdTsKKwlfX3UzMiBpcnE7Cit9OworCitzdHJ1Y3Qga3ZtX2JyZWFrcG9pbnQgeworCV9fdTMyIGVuYWJsZWQ7CisJX191MzIgcGFkZGluZzsKKwlfX3U2NCBhZGRyZXNzOworfTsKKworLyogZm9yIEtWTV9ERUJVR19HVUVTVCAqLworc3RydWN0IGt2bV9kZWJ1Z19ndWVzdCB7CisJLyogaW50ICovCisJX191MzIgdmNwdTsKKwlfX3UzMiBlbmFibGVkOworCXN0cnVjdCBrdm1fYnJlYWtwb2ludCBicmVha3BvaW50c1s0XTsKKwlfX3UzMiBzaW5nbGVzdGVwOworfTsKKworLyogZm9yIEtWTV9HRVRfRElSVFlfTE9HICovCitzdHJ1Y3Qga3ZtX2RpcnR5X2xvZyB7CisJX191MzIgc2xvdDsKKwlfX3UzMiBwYWRkaW5nOworCXVuaW9uIHsKKwkJdm9pZCBfX3VzZXIgKmRpcnR5X2JpdG1hcDsgLyogb25lIGJpdCBwZXIgcGFnZSAqLworCQlfX3U2NCBwYWRkaW5nOworCX07Cit9OworCisjZGVmaW5lIEtWTUlPIDB4QUUKKworI2RlZmluZSBLVk1fUlVOICAgICAgICAgICAgICAgICAgIF9JT1dSKEtWTUlPLCAyLCBzdHJ1Y3Qga3ZtX3J1bikKKyNkZWZpbmUgS1ZNX0dFVF9SRUdTICAgICAgICAgICAgICBfSU9XUihLVk1JTywgMywgc3RydWN0IGt2bV9yZWdzKQorI2RlZmluZSBLVk1fU0VUX1JFR1MgICAgICAgICAgICAgIF9JT1coS1ZNSU8sIDQsIHN0cnVjdCBrdm1fcmVncykKKyNkZWZpbmUgS1ZNX0dFVF9TUkVHUyAgICAgICAgICAgICBfSU9XUihLVk1JTywgNSwgc3RydWN0IGt2bV9zcmVncykKKyNkZWZpbmUgS1ZNX1NFVF9TUkVHUyAgICAgICAgICAgICBfSU9XKEtWTUlPLCA2LCBzdHJ1Y3Qga3ZtX3NyZWdzKQorI2RlZmluZSBLVk1fVFJBTlNMQVRFICAgICAgICAgICAgIF9JT1dSKEtWTUlPLCA3LCBzdHJ1Y3Qga3ZtX3RyYW5zbGF0aW9uKQorI2RlZmluZSBLVk1fSU5URVJSVVBUICAgICAgICAgICAgIF9JT1coS1ZNSU8sIDgsIHN0cnVjdCBrdm1faW50ZXJydXB0KQorI2RlZmluZSBLVk1fREVCVUdfR1VFU1QgICAgICAgICAgIF9JT1coS1ZNSU8sIDksIHN0cnVjdCBrdm1fZGVidWdfZ3Vlc3QpCisjZGVmaW5lIEtWTV9TRVRfTUVNT1JZX1JFR0lPTiAgICAgX0lPVyhLVk1JTywgMTAsIHN0cnVjdCBrdm1fbWVtb3J5X3JlZ2lvbikKKyNkZWZpbmUgS1ZNX0NSRUFURV9WQ1BVICAgICAgICAgICBfSU9XKEtWTUlPLCAxMSwgaW50IC8qIHZjcHVfc2xvdCAqLykKKyNkZWZpbmUgS1ZNX0dFVF9ESVJUWV9MT0cgICAgICAgICBfSU9XKEtWTUlPLCAxMiwgc3RydWN0IGt2bV9kaXJ0eV9sb2cpCisjZGVmaW5lIEtWTV9HRVRfTVNSUyAgICAgICAgICAgICAgX0lPV1IoS1ZNSU8sIDEzLCBzdHJ1Y3Qga3ZtX21zcnMpCisjZGVmaW5lIEtWTV9TRVRfTVNSUyAgICAgICAgICAgICAgX0lPV1IoS1ZNSU8sIDE0LCBzdHJ1Y3Qga3ZtX21zcnMpCisjZGVmaW5lIEtWTV9HRVRfTVNSX0lOREVYX0xJU1QgICAgX0lPV1IoS1ZNSU8sIDE1LCBzdHJ1Y3Qga3ZtX21zcl9saXN0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGliYXRhLmggYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCmluZGV4IGQwYTdhZDUuLmFiMjc1NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGliYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaApAQCAtMTQwLDEwICsxNDAsMTEgQEAKIAlBVEFfREZMQUdfTEJBNDgJCT0gKDEgPDwgMSksIC8qIGRldmljZSBzdXBwb3J0cyBMQkE0OCAqLwogCUFUQV9ERkxBR19DREJfSU5UUgk9ICgxIDw8IDIpLCAvKiBkZXZpY2UgYXNzZXJ0cyBJTlRSUSB3aGVuIHJlYWR5IGZvciBDREIgKi8KIAlBVEFfREZMQUdfTkNRCQk9ICgxIDw8IDMpLCAvKiBkZXZpY2Ugc3VwcG9ydHMgTkNRICovCisJQVRBX0RGTEFHX0ZMVVNIX0VYVAk9ICgxIDw8IDQpLCAvKiBkbyBGTFVTSF9FWFQgaW5zdGVhZCBvZiBGTFVTSCAqLwogCUFUQV9ERkxBR19DRkdfTUFTSwk9ICgxIDw8IDgpIC0gMSwKIAogCUFUQV9ERkxBR19QSU8JCT0gKDEgPDwgOCksIC8qIGRldmljZSBsaW1pdGVkIHRvIFBJTyBtb2RlICovCi0JQVRBX0RGTEFHX05DUV9PRkYJPSAoMSA8PCA5KSwgLyogZGV2aWVkIGxpbWl0ZWQgdG8gbm9uLU5DUSBtb2RlICovCisJQVRBX0RGTEFHX05DUV9PRkYJPSAoMSA8PCA5KSwgLyogZGV2aWNlIGxpbWl0ZWQgdG8gbm9uLU5DUSBtb2RlICovCiAJQVRBX0RGTEFHX1NVU1BFTkRFRAk9ICgxIDw8IDEwKSwgLyogZGV2aWNlIHN1c3BlbmRlZCAqLwogCUFUQV9ERkxBR19JTklUX01BU0sJPSAoMSA8PCAxNikgLSAxLAogCkBAIC0xNzUsNiArMTc2LDcgQEAKIAlBVEFfRkxBR19TS0lQX0QySF9CU1kJPSAoMSA8PCAxMiksIC8qIGNhbid0IHdhaXQgZm9yIHRoZSBmaXJzdCBEMkgKIAkJCQkJICAgICAgKiBSZWdpc3RlciBGSVMgY2xlYXJpbmcgQlNZICovCiAJQVRBX0ZMQUdfREVCVUdNU0cJPSAoMSA8PCAxMyksCisJQVRBX0ZMQUdfU0VUWEZFUl9QT0xMSU5HPSAoMSA8PCAxNCksIC8qIHVzZSBwb2xsaW5nIGZvciBTRVRYRkVSICovCiAKIAkvKiBUaGUgZm9sbG93aW5nIGZsYWcgYmVsb25ncyB0byBhcC0+cGZsYWdzIGJ1dCBpcyBrZXB0IGluCiAJICogYXAtPmZsYWdzIGJlY2F1c2UgaXQncyByZWZlcmVuY2VkIGluIG1hbnkgTExEcyBhbmQgd2lsbCBiZQpAQCAtMjgzLDYgKzI4NSw5IEBACiAJQVRBX0VISV9RVUlFVAkJPSAoMSA8PCAzKSwgIC8qIGJlIHF1aWV0ICovCiAKIAlBVEFfRUhJX0RJRF9SRVNFVAk9ICgxIDw8IDE2KSwgLyogYWxyZWFkeSByZXNldCB0aGlzIHBvcnQgKi8KKwlBVEFfRUhJX1BSSU5USU5GTwk9ICgxIDw8IDE3KSwgLyogcHJpbnQgY29uZmlndXJhdGlvbiBpbmZvICovCisJQVRBX0VISV9TRVRNT0RFCQk9ICgxIDw8IDE4KSwgLyogY29uZmlndXJlIHRyYW5zZmVyIG1vZGUgKi8KKwlBVEFfRUhJX1BPU1RfU0VUTU9ERQk9ICgxIDw8IDE5KSwgLyogcmV2YWlsZGF0aW5nIGFmdGVyIHNldG1vZGUgKi8KIAogCUFUQV9FSElfUkVTRVRfTU9ESUZJRVJfTUFTSyA9IEFUQV9FSElfUkVTVU1FX0xJTkssCiAKQEAgLTMwNywxMCArMzEyLDExIEBACiAJICAgKHNvbWUgaG9ya2FnZSBtYXkgYmUgZHJpdmUvY29udHJvbGxlciBwYWlyIGRlcGVuZGFudCAqLwogCiAJQVRBX0hPUktBR0VfRElBR05PU1RJQwk9ICgxIDw8IDApLAkvKiBGYWlsZWQgYm9vdCBkaWFnICovCisJQVRBX0hPUktBR0VfTk9ETUEJPSAoMSA8PCAxKSwJLyogRE1BIHByb2JsZW1zICovCisJQVRBX0hPUktBR0VfTk9OQ1EJPSAoMSA8PCAyKSwJLyogRG9uJ3QgdXNlIE5DUSAqLwogfTsKIAogZW51bSBoc21fdGFza19zdGF0ZXMgewotCUhTTV9TVF9VTktOT1dOLAkJLyogc3RhdGUgdW5rbm93biAqLwogCUhTTV9TVF9JRExFLAkJLyogbm8gY29tbWFuZCBvbiBnb2luZyAqLwogCUhTTV9TVCwJCQkvKiAod2FpdGluZyB0aGUgZGV2aWNlIHRvKSB0cmFuc2ZlciBkYXRhICovCiAJSFNNX1NUX0xBU1QsCQkvKiAod2FpdGluZyB0aGUgZGV2aWNlIHRvKSBjb21wbGV0ZSBjb21tYW5kICovCkBAIC0zMjksNiArMzM1LDcgQEAKIAlBQ19FUlJfU1lTVEVNCQk9ICgxIDw8IDYpLCAvKiBzeXN0ZW0gZXJyb3IgKi8KIAlBQ19FUlJfSU5WQUxJRAkJPSAoMSA8PCA3KSwgLyogaW52YWxpZCBhcmd1bWVudCAqLwogCUFDX0VSUl9PVEhFUgkJPSAoMSA8PCA4KSwgLyogdW5rbm93biAqLworCUFDX0VSUl9OT0RFVl9ISU5UCT0gKDEgPDwgOSksIC8qIHBvbGxpbmcgZGV2aWNlIGRldGVjdGlvbiBoaW50ICovCiB9OwogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwpAQCAtNTY4LDggKzU3NSw5IEBACiAJc3RydWN0IGF0YV9ob3N0CQkqaG9zdDsKIAlzdHJ1Y3QgZGV2aWNlIAkJKmRldjsKIAotCXN0cnVjdCB3b3JrX3N0cnVjdAlwb3J0X3Rhc2s7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CWhvdHBsdWdfdGFzazsKKwl2b2lkCQkJKnBvcnRfdGFza19kYXRhOworCXN0cnVjdCBkZWxheWVkX3dvcmsJcG9ydF90YXNrOworCXN0cnVjdCBkZWxheWVkX3dvcmsJaG90cGx1Z190YXNrOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlzY3NpX3Jlc2Nhbl90YXNrOwogCiAJdW5zaWduZWQgaW50CQloc21fdGFza19zdGF0ZTsKQEAgLTcwMCw5ICs3MDgsMTAgQEAKIGV4dGVybiBpbnQgc2F0YV9waHlfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnBhcmFtKTsKIGV4dGVybiBpbnQgYXRhX3N0ZF9wcmVyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgYXRhX3N0ZF9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKTsKK2V4dGVybiBpbnQgc2F0YV9wb3J0X2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnRpbWluZyk7CiBleHRlcm4gaW50IHNhdGFfc3RkX2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKTsKIGV4dGVybiB2b2lkIGF0YV9zdGRfcG9zdHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3Nlcyk7Ci1leHRlcm4gaW50IGF0YV9kZXZfcmV2YWxpZGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcG9zdF9yZXNldCk7CiBleHRlcm4gdm9pZCBhdGFfcG9ydF9kaXNhYmxlKHN0cnVjdCBhdGFfcG9ydCAqKTsKIGV4dGVybiB2b2lkIGF0YV9zdGRfcG9ydHMoc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIpOwogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTc0NSwxMCArNzU0LDkgQEAKIGV4dGVybiBpbnQgYXRhX2hvc3Rfc3VzcGVuZChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsIHBtX21lc3NhZ2VfdCBtZXNnKTsKIGV4dGVybiB2b2lkIGF0YV9ob3N0X3Jlc3VtZShzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOwogZXh0ZXJuIGludCBhdGFfcmF0ZWxpbWl0KHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfYnVzeV9zbGVlcChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9wYXQsCi0JCQkJICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLWV4dGVybiB2b2lkIGF0YV9wb3J0X3F1ZXVlX3Rhc2soc3RydWN0IGF0YV9wb3J0ICphcCwgdm9pZCAoKmZuKSh2b2lkICopLAorZXh0ZXJuIGludCBhdGFfYnVzeV9zbGVlcChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXRfcGF0LCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworZXh0ZXJuIHZvaWQgYXRhX3BvcnRfcXVldWVfdGFzayhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB3b3JrX2Z1bmNfdCBmbiwKIAkJCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKIGV4dGVybiB1MzIgYXRhX3dhaXRfcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpyZWcsIHUzMiBtYXNrLCB1MzIgdmFsLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGludGVydmFsX21zZWMsCkBAIC03ODgsNiArNzk2LDcgQEAKIAkJCSAgdW5zaWduZWQgaW50IG9mcywgdW5zaWduZWQgaW50IGxlbik7CiBleHRlcm4gdm9pZCBhdGFfaWRfY19zdHJpbmcoY29uc3QgdTE2ICppZCwgdW5zaWduZWQgY2hhciAqcywKIAkJCSAgICB1bnNpZ25lZCBpbnQgb2ZzLCB1bnNpZ25lZCBpbnQgbGVuKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGF0YV9kZXZpY2VfYmxhY2tsaXN0ZWQoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBhdGFfYm1kbWFfc2V0dXAgKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogZXh0ZXJuIHZvaWQgYXRhX2JtZG1hX3N0YXJ0IChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIGV4dGVybiB2b2lkIGF0YV9ibWRtYV9zdG9wKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwpAQCAtMTA2Miw3ICsxMDcxLDcgQEAKIAkJdWRlbGF5KDEwKTsKIAkJc3RhdHVzID0gYXRhX2Noa19zdGF0dXMoYXApOwogCQltYXgtLTsKLQl9IHdoaWxlICgoc3RhdHVzICYgYml0cykgJiYgKG1heCA+IDApKTsKKwl9IHdoaWxlIChzdGF0dXMgIT0gMHhmZiAmJiAoc3RhdHVzICYgYml0cykgJiYgKG1heCA+IDApKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMDgzLDcgKzEwOTIsNyBAQAogewogCXU4IHN0YXR1cyA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZIHwgQVRBX0RSUSwgMTAwMCk7CiAKLQlpZiAoc3RhdHVzICYgKEFUQV9CVVNZIHwgQVRBX0RSUSkpIHsKKwlpZiAoc3RhdHVzICE9IDB4ZmYgJiYgKHN0YXR1cyAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKSkgewogCQl1bnNpZ25lZCBsb25nIGwgPSBhcC0+aW9hZGRyLnN0YXR1c19hZGRyOwogCQlpZiAoYXRhX21zZ193YXJuKGFwKSkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFUQTogYWJub3JtYWwgc3RhdHVzIDB4JVggb24gcG9ydCAweCVsWFxuIiwKQEAgLTExNDksMzcgKzExNTgsNiBAQAogfQogCiAvKioKLSAqCWF0YV9pcnFfb24gLSBFbmFibGUgaW50ZXJydXB0cyBvbiBhIHBvcnQuCi0gKglAYXA6IFBvcnQgb24gd2hpY2ggaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KLSAqCi0gKglFbmFibGUgaW50ZXJydXB0cyBvbiBhIGxlZ2FjeSBJREUgZGV2aWNlIHVzaW5nIE1NSU8gb3IgUElPLAotICoJd2FpdCBmb3IgaWRsZSwgY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4KLSAqCi0gKglMT0NLSU5HOgotICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdTggYXRhX2lycV9vbihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7Ci0JdTggdG1wOwotCi0JYXAtPmN0bCAmPSB+QVRBX05JRU47Ci0JYXAtPmxhc3RfY3RsID0gYXAtPmN0bDsKLQotCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQotCQl3cml0ZWIoYXAtPmN0bCwgKHZvaWQgX19pb21lbSAqKSBpb2FkZHItPmN0bF9hZGRyKTsKLQllbHNlCi0JCW91dGIoYXAtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7Ci0JdG1wID0gYXRhX3dhaXRfaWRsZShhcCk7Ci0KLQlhcC0+b3BzLT5pcnFfY2xlYXIoYXApOwotCi0JcmV0dXJuIHRtcDsKLX0KLQotCi0vKioKICAqCWF0YV9pcnFfYWNrIC0gQWNrbm93bGVkZ2UgYSBkZXZpY2UgaW50ZXJydXB0LgogICoJQGFwOiBQb3J0IG9uIHdoaWNoIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaAppbmRleCA4MWUzYTE4Li4yNDZkZTFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2JpbmQuaApAQCAtMTAsNiArMTAsMTEgQEAKICNkZWZpbmUgTElOVVhfTE9DS0RfQklORF9ICiAKICNpbmNsdWRlIDxsaW51eC9sb2NrZC9ubG0uaD4KKy8qIG5lZWQgeGRyLWVuY29kZWQgZXJyb3IgY29kZXMgdG9vLCBzby4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3hkci5oPgorI2lmZGVmIENPTkZJR19MT0NLRF9WNAorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3hkcjQuaD4KKyNlbmRpZgogCiAvKiBEdW1teSBkZWNsYXJhdGlvbnMgKi8KIHN0cnVjdCBzdmNfcnFzdDsKQEAgLTE4LDcgKzIzLDcgQEAKICAqIFRoaXMgaXMgdGhlIHNldCBvZiBmdW5jdGlvbnMgZm9yIGxvY2tkLT5uZnNkIGNvbW11bmljYXRpb24KICAqLwogc3RydWN0IG5sbXN2Y19iaW5kaW5nIHsKLQl1MzIJCQkoKmZvcGVuKShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKKwlfX2JlMzIJCQkoKmZvcGVuKShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKIAkJCQkJCXN0cnVjdCBuZnNfZmggKiwKIAkJCQkJCXN0cnVjdCBmaWxlICoqKTsKIAl2b2lkCQkJKCpmY2xvc2UpKHN0cnVjdCBmaWxlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCmluZGV4IDI5MDk2MTkuLmFjMjViNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKQEAgLTE1NCw3ICsxNTQsNyBAQAogc3RydWN0IG5sbV93YWl0ICogbmxtY2xudF9wcmVwYXJlX2Jsb2NrKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwogdm9pZAkJICBubG1jbG50X2ZpbmlzaF9ibG9jayhzdHJ1Y3QgbmxtX3dhaXQgKmJsb2NrKTsKIGludAkJICBubG1jbG50X2Jsb2NrKHN0cnVjdCBubG1fd2FpdCAqYmxvY2ssIHN0cnVjdCBubG1fcnFzdCAqcmVxLCBsb25nIHRpbWVvdXQpOwotdTMyCQkgIG5sbWNsbnRfZ3JhbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyLCBjb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKik7CitfX2JlMzIJCSAgbmxtY2xudF9ncmFudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGNvbnN0IHN0cnVjdCBubG1fbG9jayAqKTsKIHZvaWQJCSAgbmxtY2xudF9yZWNvdmVyeShzdHJ1Y3QgbmxtX2hvc3QgKik7CiBpbnQJCSAgbmxtY2xudF9yZWNsYWltKHN0cnVjdCBubG1faG9zdCAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOwogdm9pZAkJICBubG1jbG50X25leHRfY29va2llKHN0cnVjdCBubG1fY29va2llICopOwpAQCAtMTY0LDE0ICsxNjQsMTIgQEAKICAqLwogc3RydWN0IG5sbV9ob3N0ICogbmxtY2xudF9sb29rdXBfaG9zdChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsKIHN0cnVjdCBubG1faG9zdCAqIG5sbXN2Y19sb29rdXBfaG9zdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotc3RydWN0IG5sbV9ob3N0ICogbmxtX2xvb2t1cF9ob3N0KGludCBzZXJ2ZXIsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqLCBpbnQsIGludCwgY29uc3QgY2hhciAqLCBpbnQpOwogc3RydWN0IHJwY19jbG50ICogbmxtX2JpbmRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiB2b2lkCQkgIG5sbV9yZWJpbmRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiBzdHJ1Y3QgbmxtX2hvc3QgKiBubG1fZ2V0X2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwogdm9pZAkJICBubG1fcmVsZWFzZV9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKIHZvaWQJCSAgbmxtX3NodXRkb3duX2hvc3RzKHZvaWQpOwogZXh0ZXJuIHZvaWQJICBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiwgY29uc3QgY2hhciAqLCBpbnQsIHUzMik7Ci1zdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX2ZpbmQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICosIGNvbnN0IGNoYXIgKiwgaW50KTsKIHZvaWQJCSAgbnNtX3JlbGVhc2Uoc3RydWN0IG5zbV9oYW5kbGUgKik7CiAKIApAQCAtMTg0LDIxICsxODIsMjEgQEAKIC8qCiAgKiBTZXJ2ZXItc2lkZSBsb2NrIGhhbmRsaW5nCiAgKi8KLXUzMgkJICBubG1zdmNfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IG5sbV9maWxlICosCitfX2JlMzIJCSAgbmxtc3ZjX2xvY2soc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBubG1fZmlsZSAqLAogCQkJCQlzdHJ1Y3QgbmxtX2xvY2sgKiwgaW50LCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqKTsKLXUzMgkJICBubG1zdmNfdW5sb2NrKHN0cnVjdCBubG1fZmlsZSAqLCBzdHJ1Y3QgbmxtX2xvY2sgKik7Ci11MzIJCSAgbmxtc3ZjX3Rlc3Rsb2NrKHN0cnVjdCBubG1fZmlsZSAqLCBzdHJ1Y3QgbmxtX2xvY2sgKiwKK19fYmUzMgkJICBubG1zdmNfdW5sb2NrKHN0cnVjdCBubG1fZmlsZSAqLCBzdHJ1Y3QgbmxtX2xvY2sgKik7CitfX2JlMzIJCSAgbmxtc3ZjX3Rlc3Rsb2NrKHN0cnVjdCBubG1fZmlsZSAqLCBzdHJ1Y3QgbmxtX2xvY2sgKiwKIAkJCQkJc3RydWN0IG5sbV9sb2NrICopOwotdTMyCQkgIG5sbXN2Y19jYW5jZWxfYmxvY2tlZChzdHJ1Y3QgbmxtX2ZpbGUgKiwgc3RydWN0IG5sbV9sb2NrICopOworX19iZTMyCQkgIG5sbXN2Y19jYW5jZWxfYmxvY2tlZChzdHJ1Y3QgbmxtX2ZpbGUgKiwgc3RydWN0IG5sbV9sb2NrICopOwogdW5zaWduZWQgbG9uZwkgIG5sbXN2Y19yZXRyeV9ibG9ja2VkKHZvaWQpOwogdm9pZAkJICBubG1zdmNfdHJhdmVyc2VfYmxvY2tzKHN0cnVjdCBubG1faG9zdCAqLCBzdHJ1Y3QgbmxtX2ZpbGUgKiwKIAkJCQkJbmxtX2hvc3RfbWF0Y2hfZm5fdCBtYXRjaCk7Ci12b2lkCQkgIG5sbXN2Y19ncmFudF9yZXBseShzdHJ1Y3QgbmxtX2Nvb2tpZSAqLCB1MzIpOwordm9pZAkJICBubG1zdmNfZ3JhbnRfcmVwbHkoc3RydWN0IG5sbV9jb29raWUgKiwgX19iZTMyKTsKIAogLyoKICAqIEZpbGUgaGFuZGxpbmcgZm9yIHRoZSBzZXJ2ZXIgcGVyc29uYWxpdHkKICAqLwotdTMyCQkgIG5sbV9sb29rdXBfZmlsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IG5sbV9maWxlICoqLAorX19iZTMyCQkgIG5sbV9sb29rdXBfZmlsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IG5sbV9maWxlICoqLAogCQkJCQlzdHJ1Y3QgbmZzX2ZoICopOwogdm9pZAkJICBubG1fcmVsZWFzZV9maWxlKHN0cnVjdCBubG1fZmlsZSAqKTsKIHZvaWQJCSAgbmxtc3ZjX21hcmtfcmVzb3VyY2VzKHZvaWQpOwpAQCAtMjA4LDcgKzIwNiw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaW5vZGUgKgogbmxtc3ZjX2ZpbGVfaW5vZGUoc3RydWN0IG5sbV9maWxlICpmaWxlKQogewotCXJldHVybiBmaWxlLT5mX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXJldHVybiBmaWxlLT5mX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3NoYXJlLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3NoYXJlLmgKaW5kZXggY2Q3ODE2ZS4uNjMwYzViZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9zaGFyZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2Qvc2hhcmUuaApAQCAtMjEsOSArMjEsOSBAQAogCXUzMgkJCXNfbW9kZTsJCS8qIGRlbnkgbW9kZSAqLwogfTsKIAotdTMyCW5sbXN2Y19zaGFyZV9maWxlKHN0cnVjdCBubG1faG9zdCAqLCBzdHJ1Y3QgbmxtX2ZpbGUgKiwKK19fYmUzMglubG1zdmNfc2hhcmVfZmlsZShzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9maWxlICosCiAJCQkJCSAgICAgICBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci11MzIJbmxtc3ZjX3Vuc2hhcmVfZmlsZShzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9maWxlICosCitfX2JlMzIJbmxtc3ZjX3Vuc2hhcmVfZmlsZShzdHJ1Y3QgbmxtX2hvc3QgKiwgc3RydWN0IG5sbV9maWxlICosCiAJCQkJCSAgICAgICBzdHJ1Y3QgbmxtX2FyZ3MgKik7CiB2b2lkCW5sbXN2Y190cmF2ZXJzZV9zaGFyZXMoc3RydWN0IG5sbV9ob3N0ICosIHN0cnVjdCBubG1fZmlsZSAqLAogCQkJCQkgICAgICAgbmxtX2hvc3RfbWF0Y2hfZm5fdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3NtX2ludGVyLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3NtX2ludGVyLmgKaW5kZXggZmM2MWQ0MC4uMjJhNjQ1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9zbV9pbnRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2Qvc21faW50ZXIuaApAQCAtMjQsNyArMjQsNyBAQAogICogQXJndW1lbnRzIGZvciBhbGwgY2FsbHMgdG8gc3RhdGQKICAqLwogc3RydWN0IG5zbV9hcmdzIHsKLQl1MzIJCWFkZHI7CQkvKiByZW1vdGUgYWRkcmVzcyAqLworCV9fYmUzMgkJYWRkcjsJCS8qIHJlbW90ZSBhZGRyZXNzICovCiAJdTMyCQlwcm9nOwkJLyogUlBDIGNhbGxiYWNrIGluZm8gKi8KIAl1MzIJCXZlcnM7CiAJdTMyCQlwcm9jOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QveGRyLmgKaW5kZXggYmIwYTBmMS4uODNhMWY5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oCkBAIC0xMyw2ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvbmZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hkci5oPgogCitzdHJ1Y3Qgc3ZjX3Jxc3Q7CisKICNkZWZpbmUgTkxNX01BWENPT0tJRUxFTiAgICAJMzIKICNkZWZpbmUgTkxNX01BWFNUUkxFTgkJMTAyNAogCkBAIC0yMiw2ICsyNCw4IEBACiAjZGVmaW5lCW5sbV9sY2tfYmxvY2tlZAkJX19jb25zdGFudF9odG9ubChOTE1fTENLX0JMT0NLRUQpCiAjZGVmaW5lCW5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZAlfX2NvbnN0YW50X2h0b25sKE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRCkKIAorI2RlZmluZSBubG1fZHJvcF9yZXBseQkJX19jb25zdGFudF9odG9ubCgzMDAwMCkKKwogLyogTG9jayBpbmZvIHBhc3NlZCB2aWEgTkxNICovCiBzdHJ1Y3QgbmxtX2xvY2sgewogCWNoYXIgKgkJCWNhbGxlcjsKQEAgLTY1LDcgKzY5LDcgQEAKICAqLwogc3RydWN0IG5sbV9yZXMgewogCXN0cnVjdCBubG1fY29va2llCWNvb2tpZTsKLQl1MzIJCQlzdGF0dXM7CisJX19iZTMyCQkJc3RhdHVzOwogCXN0cnVjdCBubG1fbG9jawkJbG9jazsKIH07CiAKQEAgLTc2LDkgKzgwLDkgQEAKIAljaGFyICoJCW1vbjsKIAlpbnQJCWxlbjsKIAl1MzIJCXN0YXRlOwotCXUzMgkJYWRkcjsKLQl1MzIJCXZlcnM7Ci0JdTMyCQlwcm90bzsKKwlfX2JlMzIJCWFkZHI7CisJX19iZTMyCQl2ZXJzOworCV9fYmUzMgkJcHJvdG87CiB9OwogCiAvKgpAQCAtODYsMTkgKzkwLDE5IEBACiAgKi8KICNkZWZpbmUgTkxNU1ZDX1hEUlNJWkUJCXNpemVvZihzdHJ1Y3QgbmxtX2FyZ3MpCiAKLWludAlubG1zdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbXN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fcmVzICopOwotaW50CW5sbXN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtc3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKLWludAlubG1zdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtc3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX3JlcyAqKTsKLWludAlubG1zdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fcmVzICopOwotaW50CW5sbXN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHZvaWQgKik7Ci1pbnQJbmxtc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgdm9pZCAqKTsKLWludAlubG1zdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKLWludAlubG1zdmNfZW5jb2RlX3NoYXJlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9yZXMgKik7Ci1pbnQJbmxtc3ZjX2RlY29kZV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtc3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqKTsKK2ludAlubG1zdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5sbV9hcmdzICopOworaW50CW5sbXN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbXN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7CitpbnQJbmxtc3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG1zdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7CitpbnQJbmxtc3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX3JlcyAqKTsKK2ludAlubG1zdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbXN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHZvaWQgKik7CitpbnQJbmxtc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgdm9pZCAqKTsKK2ludAlubG1zdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG1zdmNfZW5jb2RlX3NoYXJlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5sbV9yZXMgKik7CitpbnQJbmxtc3ZjX2RlY29kZV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7CitpbnQJbmxtc3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqKTsKIC8qCiBpbnQJbmxtY2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKIGludAlubG1jbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC94ZHI0LmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkcjQuaAppbmRleCAzY2MxYWUyLi5kZDEyYjRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkcjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkcjQuaApAQCAtMjMsMTkgKzIzLDE5IEBACiAKIAogCi1pbnQJbmxtNHN2Y19kZWNvZGVfdGVzdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtNHN2Y19lbmNvZGVfdGVzdHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fcmVzICopOwotaW50CW5sbTRzdmNfZGVjb2RlX2xvY2thcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbTRzdmNfZGVjb2RlX2NhbmNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbTRzdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmxtX2FyZ3MgKik7Ci1pbnQJbmxtNHN2Y19lbmNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9yZXMgKik7Ci1pbnQJbmxtNHN2Y19kZWNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9yZXMgKik7Ci1pbnQJbmxtNHN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHZvaWQgKik7Ci1pbnQJbmxtNHN2Y19kZWNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHZvaWQgKik7Ci1pbnQJbmxtNHN2Y19kZWNvZGVfc2hhcmVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbTRzdmNfZW5jb2RlX3NoYXJlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9yZXMgKik7Ci1pbnQJbmxtNHN2Y19kZWNvZGVfbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwotaW50CW5sbTRzdmNfZGVjb2RlX3JlYm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fcmVib290ICopOworaW50CW5sbTRzdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5sbV9hcmdzICopOworaW50CW5sbTRzdmNfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX3JlcyAqKTsKK2ludAlubG00c3ZjX2RlY29kZV9sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG00c3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG00c3ZjX2RlY29kZV91bmxvY2thcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5sbV9hcmdzICopOworaW50CW5sbTRzdmNfZW5jb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbTRzdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbTRzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCB2b2lkICopOworaW50CW5sbTRzdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCB2b2lkICopOworaW50CW5sbTRzdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG00c3ZjX2VuY29kZV9zaGFyZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fcmVzICopOworaW50CW5sbTRzdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKK2ludAlubG00c3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqKTsKIC8qCiBpbnQJbmxtY2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBubG1fYXJncyAqKTsKIGludAlubG1jbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5sbV9hcmdzICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZGVwLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaAppbmRleCAxMzE0Y2EwLi5lYTA5N2RkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaApAQCAtMTkzLDcgKzE5Myw2IEBACiAKIGV4dGVybiB2b2lkIGxvY2tkZXBfb2ZmKHZvaWQpOwogZXh0ZXJuIHZvaWQgbG9ja2RlcF9vbih2b2lkKTsKLWV4dGVybiBpbnQgbG9ja2RlcF9pbnRlcm5hbCh2b2lkKTsKIAogLyoKICAqIFRoZXNlIG1ldGhvZHMgYXJlIHVzZWQgYnkgc3BlY2lmaWMgbG9ja2luZyB2YXJpYW50cyAoc3BpbmxvY2tzLApAQCAtMjAyLDcgKzIwMSw3IEBACiAgKi8KIAogZXh0ZXJuIHZvaWQgbG9ja2RlcF9pbml0X21hcChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5KTsKKwkJCSAgICAgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXksIGludCBzdWJjbGFzcyk7CiAKIC8qCiAgKiBSZWluaXRpYWxpemUgYSBsb2NrIGtleSAtIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyBzcGVjaWFsIGxvY2tpbmcgb3IKQEAgLTIxMSw5ICsyMTAsMTQgQEAKICAqIG9yIHRoZXkgYXJlIHRvbyBuYXJyb3cgKHRoZXkgc3VmZmVyIGZyb20gYSBmYWxzZSBjbGFzcy1zcGxpdCk6CiAgKi8KICNkZWZpbmUgbG9ja2RlcF9zZXRfY2xhc3MobG9jaywga2V5KSBcCi0JCWxvY2tkZXBfaW5pdF9tYXAoJihsb2NrKS0+ZGVwX21hcCwgI2tleSwga2V5KQorCQlsb2NrZGVwX2luaXRfbWFwKCYobG9jayktPmRlcF9tYXAsICNrZXksIGtleSwgMCkKICNkZWZpbmUgbG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUobG9jaywga2V5LCBuYW1lKSBcCi0JCWxvY2tkZXBfaW5pdF9tYXAoJihsb2NrKS0+ZGVwX21hcCwgbmFtZSwga2V5KQorCQlsb2NrZGVwX2luaXRfbWFwKCYobG9jayktPmRlcF9tYXAsIG5hbWUsIGtleSwgMCkKKyNkZWZpbmUgbG9ja2RlcF9zZXRfY2xhc3NfYW5kX3N1YmNsYXNzKGxvY2ssIGtleSwgc3ViKSBcCisJCWxvY2tkZXBfaW5pdF9tYXAoJihsb2NrKS0+ZGVwX21hcCwgI2tleSwga2V5LCBzdWIpCisjZGVmaW5lIGxvY2tkZXBfc2V0X3N1YmNsYXNzKGxvY2ssIHN1YikJXAorCQlsb2NrZGVwX2luaXRfbWFwKCYobG9jayktPmRlcF9tYXAsICNsb2NrLCBcCisJCQkJIChsb2NrKS0+ZGVwX21hcC5rZXksIHN1YikKIAogLyoKICAqIEFjcXVpcmUgYSBsb2NrLgpAQCAtMjM4LDYgKzI0Miw4IEBACiAKICMgZGVmaW5lIElOSVRfTE9DS0RFUAkJCQkubG9ja2RlcF9yZWN1cnNpb24gPSAwLAogCisjZGVmaW5lIGxvY2tkZXBfZGVwdGgodHNrKQkoKHRzayktPmxvY2tkZXBfZGVwdGgpCisKICNlbHNlIC8qICFMT0NLREVQICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2NrZGVwX29mZih2b2lkKQpAQCAtMjQ4LDE5ICsyNTQsMTggQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbG9ja2RlcF9pbnRlcm5hbCh2b2lkKQotewotCXJldHVybiAwOwotfQotCiAjIGRlZmluZSBsb2NrX2FjcXVpcmUobCwgcywgdCwgciwgYywgaSkJCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tfcmVsZWFzZShsLCBuLCBpKQkJCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tkZXBfaW5pdCgpCQkJCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tkZXBfaW5mbygpCQkJCWRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIGxvY2tkZXBfaW5pdF9tYXAobG9jaywgbmFtZSwga2V5KQlkbyB7ICh2b2lkKShrZXkpOyB9IHdoaWxlICgwKQorIyBkZWZpbmUgbG9ja2RlcF9pbml0X21hcChsb2NrLCBuYW1lLCBrZXksIHN1YikJZG8geyAodm9pZCkoa2V5KTsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIGxvY2tkZXBfc2V0X2NsYXNzKGxvY2ssIGtleSkJCWRvIHsgKHZvaWQpKGtleSk7IH0gd2hpbGUgKDApCiAjIGRlZmluZSBsb2NrZGVwX3NldF9jbGFzc19hbmRfbmFtZShsb2NrLCBrZXksIG5hbWUpIFwKIAkJZG8geyAodm9pZCkoa2V5KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbG9ja2RlcF9zZXRfY2xhc3NfYW5kX3N1YmNsYXNzKGxvY2ssIGtleSwgc3ViKSBcCisJCWRvIHsgKHZvaWQpKGtleSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGxvY2tkZXBfc2V0X3N1YmNsYXNzKGxvY2ssIHN1YikJCWRvIHsgfSB3aGlsZSAoMCkKKwogIyBkZWZpbmUgSU5JVF9MT0NLREVQCiAjIGRlZmluZSBsb2NrZGVwX3Jlc2V0KCkJCWRvIHsgZGVidWdfbG9ja3MgPSAxOyB9IHdoaWxlICgwKQogIyBkZWZpbmUgbG9ja2RlcF9mcmVlX2tleV9yYW5nZShzdGFydCwgc2l6ZSkJZG8geyB9IHdoaWxlICgwKQpAQCAtMjY4LDIwICsyNzMsMzMgQEAKICAqIFRoZSBjbGFzcyBrZXkgdGFrZXMgbm8gc3BhY2UgaWYgbG9ja2RlcCBpcyBkaXNhYmxlZDoKICAqLwogc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHsgfTsKKworI2RlZmluZSBsb2NrZGVwX2RlcHRoKHRzaykJKDApCisKICNlbmRpZiAvKiAhTE9DS0RFUCAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfVFJBQ0VfSVJRRkxBR1MpICYmIGRlZmluZWQoQ09ORklHX0dFTkVSSUNfSEFSRElSUVMpCiBleHRlcm4gdm9pZCBlYXJseV9pbml0X2lycV9sb2NrX2NsYXNzKHZvaWQpOwogI2Vsc2UKLSMgZGVmaW5lIGVhcmx5X2luaXRfaXJxX2xvY2tfY2xhc3MoKQkJZG8geyB9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB2b2lkIGVhcmx5X2luaXRfaXJxX2xvY2tfY2xhc3Modm9pZCkKK3sKK30KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiBleHRlcm4gdm9pZCBlYXJseV9ib290X2lycXNfb2ZmKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfYm9vdF9pcnFzX29uKHZvaWQpOworZXh0ZXJuIHZvaWQgcHJpbnRfaXJxdHJhY2VfZXZlbnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vycik7CiAjZWxzZQotIyBkZWZpbmUgZWFybHlfYm9vdF9pcnFzX29mZigpCQkJZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgZWFybHlfYm9vdF9pcnFzX29uKCkJCQlkbyB7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQgZWFybHlfYm9vdF9pcnFzX29mZih2b2lkKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIGVhcmx5X2Jvb3RfaXJxc19vbih2b2lkKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHByaW50X2lycXRyYWNlX2V2ZW50cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIpCit7Cit9CiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9nMi5oIGIvaW5jbHVkZS9saW51eC9sb2cyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyZTFhNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbG9nMi5oCkBAIC0wLDAgKzEsMTU3IEBACisvKiBJbnRlZ2VyIGJhc2UgMiBsb2dhcml0aG0gY2FsY3VsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfTE9HMl9ICisjZGVmaW5lIF9MSU5VWF9MT0cyX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKy8qCisgKiBkZWFsIHdpdGggdW5yZXByZXNlbnRhYmxlIGNvbnN0YW50IGxvZ2FyaXRobXMKKyAqLworZXh0ZXJuIF9fYXR0cmlidXRlX18oKGNvbnN0LCBub3JldHVybikpCitpbnQgX19fX2lsb2cyX05hTih2b2lkKTsKKworLyoKKyAqIG5vbi1jb25zdGFudCBsb2cgb2YgYmFzZSAyIGNhbGN1bGF0b3JzCisgKiAtIHRoZSBhcmNoIG1heSBvdmVycmlkZSB0aGVzZSBpbiBhc20vYml0b3BzLmggaWYgdGhleSBjYW4gYmUgaW1wbGVtZW50ZWQKKyAqICAgbW9yZSBlZmZpY2llbnRseSB0aGFuIHVzaW5nIGZscygpIGFuZCBmbHM2NCgpCisgKiAtIHRoZSBhcmNoIGlzIG5vdCByZXF1aXJlZCB0byBoYW5kbGUgbj09MCBpZiBpbXBsZW1lbnRpbmcgdGhlIGZhbGxiYWNrCisgKi8KKyNpZm5kZWYgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMgorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitpbnQgX19pbG9nMl91MzIodTMyIG4pCit7CisJcmV0dXJuIGZscyhuKSAtIDE7Cit9CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0CitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK2ludCBfX2lsb2cyX3U2NCh1NjQgbikKK3sKKwlyZXR1cm4gZmxzNjQobikgLSAxOworfQorI2VuZGlmCisKKy8qCisgKiByb3VuZCB1cCB0byBuZWFyZXN0IHBvd2VyIG9mIHR3bworICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK3Vuc2lnbmVkIGxvbmcgX19yb3VuZHVwX3Bvd19vZl90d28odW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiAxVUwgPDwgZmxzX2xvbmcobiAtIDEpOworfQorCisvKioKKyAqIGlsb2cyIC0gbG9nIG9mIGJhc2UgMiBvZiAzMi1iaXQgb3IgYSA2NC1iaXQgdW5zaWduZWQgdmFsdWUKKyAqIEBuIC0gcGFyYW1ldGVyCisgKgorICogY29uc3RhbnQtY2FwYWJsZSBsb2cgb2YgYmFzZSAyIGNhbGN1bGF0aW9uCisgKiAtIHRoaXMgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGlzZSBnbG9iYWwgdmFyaWFibGVzIGZyb20gY29uc3RhbnQgZGF0YSwgaGVuY2UKKyAqICAgdGhlIG1hc3NpdmUgdGVybmFyeSBvcGVyYXRvciBjb25zdHJ1Y3Rpb24KKyAqCisgKiBzZWxlY3RzIHRoZSBhcHByb3ByaWF0ZWx5LXNpemVkIG9wdGltaXNlZCB2ZXJzaW9uIGRlcGVuZGluZyBvbiBzaXplb2YobikKKyAqLworI2RlZmluZSBpbG9nMihuKQkJCQlcCisoCQkJCQkJXAorCV9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gKAkJXAorCQkobikgPCAxID8gX19fX2lsb2cyX05hTigpIDoJXAorCQkobikgJiAoMVVMTCA8PCA2MykgPyA2MyA6CVwKKwkJKG4pICYgKDFVTEwgPDwgNjIpID8gNjIgOglcCisJCShuKSAmICgxVUxMIDw8IDYxKSA/IDYxIDoJXAorCQkobikgJiAoMVVMTCA8PCA2MCkgPyA2MCA6CVwKKwkJKG4pICYgKDFVTEwgPDwgNTkpID8gNTkgOglcCisJCShuKSAmICgxVUxMIDw8IDU4KSA/IDU4IDoJXAorCQkobikgJiAoMVVMTCA8PCA1NykgPyA1NyA6CVwKKwkJKG4pICYgKDFVTEwgPDwgNTYpID8gNTYgOglcCisJCShuKSAmICgxVUxMIDw8IDU1KSA/IDU1IDoJXAorCQkobikgJiAoMVVMTCA8PCA1NCkgPyA1NCA6CVwKKwkJKG4pICYgKDFVTEwgPDwgNTMpID8gNTMgOglcCisJCShuKSAmICgxVUxMIDw8IDUyKSA/IDUyIDoJXAorCQkobikgJiAoMVVMTCA8PCA1MSkgPyA1MSA6CVwKKwkJKG4pICYgKDFVTEwgPDwgNTApID8gNTAgOglcCisJCShuKSAmICgxVUxMIDw8IDQ5KSA/IDQ5IDoJXAorCQkobikgJiAoMVVMTCA8PCA0OCkgPyA0OCA6CVwKKwkJKG4pICYgKDFVTEwgPDwgNDcpID8gNDcgOglcCisJCShuKSAmICgxVUxMIDw8IDQ2KSA/IDQ2IDoJXAorCQkobikgJiAoMVVMTCA8PCA0NSkgPyA0NSA6CVwKKwkJKG4pICYgKDFVTEwgPDwgNDQpID8gNDQgOglcCisJCShuKSAmICgxVUxMIDw8IDQzKSA/IDQzIDoJXAorCQkobikgJiAoMVVMTCA8PCA0MikgPyA0MiA6CVwKKwkJKG4pICYgKDFVTEwgPDwgNDEpID8gNDEgOglcCisJCShuKSAmICgxVUxMIDw8IDQwKSA/IDQwIDoJXAorCQkobikgJiAoMVVMTCA8PCAzOSkgPyAzOSA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMzgpID8gMzggOglcCisJCShuKSAmICgxVUxMIDw8IDM3KSA/IDM3IDoJXAorCQkobikgJiAoMVVMTCA8PCAzNikgPyAzNiA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMzUpID8gMzUgOglcCisJCShuKSAmICgxVUxMIDw8IDM0KSA/IDM0IDoJXAorCQkobikgJiAoMVVMTCA8PCAzMykgPyAzMyA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMzIpID8gMzIgOglcCisJCShuKSAmICgxVUxMIDw8IDMxKSA/IDMxIDoJXAorCQkobikgJiAoMVVMTCA8PCAzMCkgPyAzMCA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMjkpID8gMjkgOglcCisJCShuKSAmICgxVUxMIDw8IDI4KSA/IDI4IDoJXAorCQkobikgJiAoMVVMTCA8PCAyNykgPyAyNyA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMjYpID8gMjYgOglcCisJCShuKSAmICgxVUxMIDw8IDI1KSA/IDI1IDoJXAorCQkobikgJiAoMVVMTCA8PCAyNCkgPyAyNCA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMjMpID8gMjMgOglcCisJCShuKSAmICgxVUxMIDw8IDIyKSA/IDIyIDoJXAorCQkobikgJiAoMVVMTCA8PCAyMSkgPyAyMSA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMjApID8gMjAgOglcCisJCShuKSAmICgxVUxMIDw8IDE5KSA/IDE5IDoJXAorCQkobikgJiAoMVVMTCA8PCAxOCkgPyAxOCA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMTcpID8gMTcgOglcCisJCShuKSAmICgxVUxMIDw8IDE2KSA/IDE2IDoJXAorCQkobikgJiAoMVVMTCA8PCAxNSkgPyAxNSA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMTQpID8gMTQgOglcCisJCShuKSAmICgxVUxMIDw8IDEzKSA/IDEzIDoJXAorCQkobikgJiAoMVVMTCA8PCAxMikgPyAxMiA6CVwKKwkJKG4pICYgKDFVTEwgPDwgMTEpID8gMTEgOglcCisJCShuKSAmICgxVUxMIDw8IDEwKSA/IDEwIDoJXAorCQkobikgJiAoMVVMTCA8PCAgOSkgPyAgOSA6CVwKKwkJKG4pICYgKDFVTEwgPDwgIDgpID8gIDggOglcCisJCShuKSAmICgxVUxMIDw8ICA3KSA/ICA3IDoJXAorCQkobikgJiAoMVVMTCA8PCAgNikgPyAgNiA6CVwKKwkJKG4pICYgKDFVTEwgPDwgIDUpID8gIDUgOglcCisJCShuKSAmICgxVUxMIDw8ICA0KSA/ICA0IDoJXAorCQkobikgJiAoMVVMTCA8PCAgMykgPyAgMyA6CVwKKwkJKG4pICYgKDFVTEwgPDwgIDIpID8gIDIgOglcCisJCShuKSAmICgxVUxMIDw8ICAxKSA/ICAxIDoJXAorCQkobikgJiAoMVVMTCA8PCAgMCkgPyAgMCA6CVwKKwkJX19fX2lsb2cyX05hTigpCQkJXAorCQkJCSAgICkgOgkJXAorCShzaXplb2YobikgPD0gNCkgPwkJCVwKKwlfX2lsb2cyX3UzMihuKSA6CQkJXAorCV9faWxvZzJfdTY0KG4pCQkJCVwKKyApCisKKy8qKgorICogcm91bmR1cF9wb3dfb2ZfdHdvIC0gcm91bmQgdGhlIGdpdmVuIHZhbHVlIHVwIHRvIG5lYXJlc3QgcG93ZXIgb2YgdHdvCisgKiBAbiAtIHBhcmFtZXRlcgorICoKKyAqIHJvdW5kIHRoZSBnaXZlbiBiYWx1ZSB1cCB0byB0aGUgbmVhcmVzdCBwb3dlciBvZiB0d28KKyAqIC0gdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgd2hlbiBuID09IDAKKyAqIC0gdGhpcyBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXNlIGdsb2JhbCB2YXJpYWJsZXMgZnJvbSBjb25zdGFudCBkYXRhCisgKi8KKyNkZWZpbmUgcm91bmR1cF9wb3dfb2ZfdHdvKG4pCQkJXAorKAkJCQkJCVwKKwlfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/ICgJCVwKKwkJKG4gPT0gMSkgPyAwIDoJCQlcCisJCSgxVUwgPDwgKGlsb2cyKChuKSAtIDEpICsgMSkpCVwKKwkJCQkgICApIDoJCVwKKwlfX3JvdW5kdXBfcG93X29mX3R3byhuKQkJCVwKKyApCisKKyNlbmRpZiAvKiBfTElOVVhfTE9HMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaAppbmRleCAwOWYwZjU3Li5kYWFiYjNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKQEAgLTE1MCw3ICsxNTAsNyBAQAogZXh0ZXJuIHZvaWQgbXBvbF9maXhfZm9ya19jaGlsZF9mbGFnKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAjZGVmaW5lIHNldF9jcHVzZXRfYmVpbmdfcmVib3VuZCh4KSAoY3B1c2V0X2JlaW5nX3JlYm91bmQgPSAoeCkpCiAKLSNpZmRlZiBDT05GSUdfQ1BVU0VUCisjaWZkZWYgQ09ORklHX0NQVVNFVFMKICNkZWZpbmUgY3VycmVudF9jcHVzZXRfaXNfYmVpbmdfcmVib3VuZCgpIFwKIAkJCQkoY3B1c2V0X2JlaW5nX3JlYm91bmQgPT0gY3VycmVudC0+Y3B1c2V0KQogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKaW5kZXggYjAzY2ZiOS4uMzI2ZGE3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKQEAgLTMxLDE1ICszMSwxNCBAQAogI2RlZmluZQlIUEVUX01JTk9SCSAgICAgMjI4CiAKIHN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgY2xhc3NfZGV2aWNlOwogCiBzdHJ1Y3QgbWlzY2RldmljZSAgewogCWludCBtaW5vcjsKIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzczsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CisJc3RydWN0IGRldmljZSAqdGhpc19kZXZpY2U7CiB9OwogCiBleHRlcm4gaW50IG1pc2NfcmVnaXN0ZXIoc3RydWN0IG1pc2NkZXZpY2UgKiBtaXNjKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCA1YTYwNjhmLi5hMTdiMTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0xMTQsNiArMTE0LDggQEAKICNlbmRpZgogfTsKIAorZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICp2bV9hcmVhX2NhY2hlcDsKKwogLyoKICAqIFRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHBlci1tbSBsaXN0IG9mIFZNQXMgZm9yIHVDbGludXguIElmIENPTkZJR19NTVUgaXMKICAqIGRpc2FibGVkLCB0aGVuIHRoZXJlJ3MgYSBzaW5nbGUgc2hhcmVkIGxpc3Qgb2YgVk1BcyBtYWludGFpbmVkIGJ5IHRoZQpAQCAtMjk0LDYgKzI5NiwyNCBAQAogdm9pZCBzcGxpdF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwogCiAvKgorICogQ29tcG91bmQgcGFnZXMgaGF2ZSBhIGRlc3RydWN0b3IgZnVuY3Rpb24uICBQcm92aWRlIGEKKyAqIHByb3RvdHlwZSBmb3IgdGhhdCBmdW5jdGlvbiBhbmQgYWNjZXNzb3IgZnVuY3Rpb25zLgorICogVGhlc2UgYXJlIF9vbmx5XyB2YWxpZCBvbiB0aGUgaGVhZCBvZiBhIFBHX2NvbXBvdW5kIHBhZ2UuCisgKi8KK3R5cGVkZWYgdm9pZCBjb21wb3VuZF9wYWdlX2R0b3Ioc3RydWN0IHBhZ2UgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY29tcG91bmRfcGFnZV9kdG9yKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkJY29tcG91bmRfcGFnZV9kdG9yICpkdG9yKQoreworCXBhZ2VbMV0ubHJ1Lm5leHQgPSAodm9pZCAqKWR0b3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29tcG91bmRfcGFnZV9kdG9yICpnZXRfY29tcG91bmRfcGFnZV9kdG9yKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAoY29tcG91bmRfcGFnZV9kdG9yICopcGFnZVsxXS5scnUubmV4dDsKK30KKworLyoKICAqIE11bHRpcGxlIHByb2Nlc3NlcyBtYXkgInNlZSIgdGhlIHNhbWUgcGFnZS4gRS5nLiBmb3IgdW50b3VjaGVkCiAgKiBtYXBwaW5ncyBvZiAvZGV2L251bGwsIGFsbCBwcm9jZXNzZXMgc2VlIHRoZSBzYW1lIHBhZ2UgZnVsbCBvZgogICogemVyb2VzLCBhbmQgdGV4dCBwYWdlcyBvZiBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIGxpYnJhcmllcyBoYXZlCkBAIC0zOTYsNyArNDE2LDkgQEAKICAqIFdlIGFyZSBnb2luZyB0byB1c2UgdGhlIGZsYWdzIGZvciB0aGUgcGFnZSB0byBub2RlIG1hcHBpbmcgaWYgaXRzIGluCiAgKiB0aGVyZS4gIFRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gbm9kZSwgc28gaXQgaXMgaW1wbGljaXQuCiAgKi8KLSNkZWZpbmUgRkxBR1NfSEFTX05PREUJCShOT0RFU19XSURUSCA+IDAgfHwgTk9ERVNfU0hJRlQgPT0gMCkKKyNpZiAhKE5PREVTX1dJRFRIID4gMCB8fCBOT0RFU19TSElGVCA9PSAwKQorI2RlZmluZSBOT0RFX05PVF9JTl9QQUdFX0ZMQUdTCisjZW5kaWYKIAogI2lmbmRlZiBQRk5fU0VDVElPTl9TSElGVAogI2RlZmluZSBQRk5fU0VDVElPTl9TSElGVCAwCkBAIC00MTEsMTMgKzQzMywxOCBAQAogI2RlZmluZSBOT0RFU19QR1NISUZUCQkoTk9ERVNfUEdPRkYgKiAoTk9ERVNfV0lEVEggIT0gMCkpCiAjZGVmaW5lIFpPTkVTX1BHU0hJRlQJCShaT05FU19QR09GRiAqIChaT05FU19XSURUSCAhPSAwKSkKIAotLyogTk9ERTpaT05FIG9yIFNFQ1RJT046Wk9ORSBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgem9uZSBmcm9tIGEgcGFnZS4gKi8KLSNpZiBGTEFHU19IQVNfTk9ERQotI2RlZmluZSBaT05FVEFCTEVfU0hJRlQJCShOT0RFU19TSElGVCArIFpPTkVTX1NISUZUKQorLyogTk9ERTpaT05FIG9yIFNFQ1RJT046Wk9ORSBpcyB1c2VkIHRvIElEIGEgem9uZSBmb3IgdGhlIGJ1ZGR5IGFsbGNhdG9yICovCisjaWZkZWYgTk9ERV9OT1RfSU5fUEFHRUZMQUdTCisjZGVmaW5lIFpPTkVJRF9TSElGVAkJKFNFQ1RJT05TX1NISUZUICsgWk9ORVNfU0hJRlQpCiAjZWxzZQotI2RlZmluZSBaT05FVEFCTEVfU0hJRlQJCShTRUNUSU9OU19TSElGVCArIFpPTkVTX1NISUZUKQorI2RlZmluZSBaT05FSURfU0hJRlQJCShOT0RFU19TSElGVCArIFpPTkVTX1NISUZUKQogI2VuZGlmCi0jZGVmaW5lIFpPTkVUQUJMRV9QR1NISUZUCVpPTkVTX1BHU0hJRlQKKworI2lmIFpPTkVTX1dJRFRIID4gMAorI2RlZmluZSBaT05FSURfUEdTSElGVAkJWk9ORVNfUEdTSElGVAorI2Vsc2UKKyNkZWZpbmUgWk9ORUlEX1BHU0hJRlQJCU5PREVTX1BHT0ZGCisjZW5kaWYKIAogI2lmIFNFQ1RJT05TX1dJRFRIK05PREVTX1dJRFRIK1pPTkVTX1dJRFRIID4gRkxBR1NfUkVTRVJWRUQKICNlcnJvciBTRUNUSU9OU19XSURUSCtOT0RFU19XSURUSCtaT05FU19XSURUSCA+IEZMQUdTX1JFU0VSVkVECkBAIC00MjYsMjYgKzQ1MywyOCBAQAogI2RlZmluZSBaT05FU19NQVNLCQkoKDFVTCA8PCBaT05FU19XSURUSCkgLSAxKQogI2RlZmluZSBOT0RFU19NQVNLCQkoKDFVTCA8PCBOT0RFU19XSURUSCkgLSAxKQogI2RlZmluZSBTRUNUSU9OU19NQVNLCQkoKDFVTCA8PCBTRUNUSU9OU19XSURUSCkgLSAxKQotI2RlZmluZSBaT05FVEFCTEVfTUFTSwkJKCgxVUwgPDwgWk9ORVRBQkxFX1NISUZUKSAtIDEpCisjZGVmaW5lIFpPTkVJRF9NQVNLCQkoKDFVTCA8PCBaT05FSURfU0hJRlQpIC0gMSkKIAogc3RhdGljIGlubGluZSBlbnVtIHpvbmVfdHlwZSBwYWdlX3pvbmVudW0oc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIChwYWdlLT5mbGFncyA+PiBaT05FU19QR1NISUZUKSAmIFpPTkVTX01BU0s7CiB9CiAKLXN0cnVjdCB6b25lOwotZXh0ZXJuIHN0cnVjdCB6b25lICp6b25lX3RhYmxlW107Ci0KKy8qCisgKiBUaGUgaWRlbnRpZmljYXRpb24gZnVuY3Rpb24gaXMgb25seSB1c2VkIGJ5IHRoZSBidWRkeSBhbGxvY2F0b3IgZm9yCisgKiBkZXRlcm1pbmluZyBpZiB0d28gcGFnZXMgY291bGQgYmUgYnVkZGllcy4gV2UgYXJlIG5vdCByZWFsbHkKKyAqIGlkZW50aWZ5aW5nIGEgem9uZSBzaW5jZSB3ZSBjb3VsZCBiZSB1c2luZyBhIHRoZSBzZWN0aW9uIG51bWJlcgorICogaWQgaWYgd2UgaGF2ZSBub3Qgbm9kZSBpZCBhdmFpbGFibGUgaW4gcGFnZSBmbGFncy4KKyAqIFdlIGd1YXJhbnRlZSBvbmx5IHRoYXQgaXQgd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHR3bworICogY29tYmluYWJsZSBwYWdlcyBpbiBhIHpvbmUuCisgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBhZ2Vfem9uZV9pZChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlyZXR1cm4gKHBhZ2UtPmZsYWdzID4+IFpPTkVUQUJMRV9QR1NISUZUKSAmIFpPTkVUQUJMRV9NQVNLOwotfQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZSAqcGFnZV96b25lKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiB6b25lX3RhYmxlW3BhZ2Vfem9uZV9pZChwYWdlKV07CisJQlVJTERfQlVHX09OKFpPTkVJRF9QR1NISUZUID09IDAgJiYgWk9ORUlEX01BU0spOworCXJldHVybiAocGFnZS0+ZmxhZ3MgPj4gWk9ORUlEX1BHU0hJRlQpICYgWk9ORUlEX01BU0s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB6b25lX3RvX25pZChzdHJ1Y3Qgem9uZSAqem9uZSkKK3N0YXRpYyBpbmxpbmUgaW50IHpvbmVfdG9fbmlkKHN0cnVjdCB6b25lICp6b25lKQogewogI2lmZGVmIENPTkZJR19OVU1BCiAJcmV0dXJuIHpvbmUtPm5vZGU7CkBAIC00NTQsMTMgKzQ4MywyMCBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYWdlX3RvX25pZChzdHJ1Y3QgcGFnZSAqcGFnZSkKKyNpZmRlZiBOT0RFX05PVF9JTl9QQUdFX0ZMQUdTCitleHRlcm4gaW50IHBhZ2VfdG9fbmlkKHN0cnVjdCBwYWdlICpwYWdlKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBwYWdlX3RvX25pZChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlpZiAoRkxBR1NfSEFTX05PREUpCi0JCXJldHVybiAocGFnZS0+ZmxhZ3MgPj4gTk9ERVNfUEdTSElGVCkgJiBOT0RFU19NQVNLOwotCWVsc2UKLQkJcmV0dXJuIHpvbmVfdG9fbmlkKHBhZ2Vfem9uZShwYWdlKSk7CisJcmV0dXJuIChwYWdlLT5mbGFncyA+PiBOT0RFU19QR1NISUZUKSAmIE5PREVTX01BU0s7CiB9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZSAqcGFnZV96b25lKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAmTk9ERV9EQVRBKHBhZ2VfdG9fbmlkKHBhZ2UpKS0+bm9kZV96b25lc1twYWdlX3pvbmVudW0ocGFnZSldOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGFnZV90b19zZWN0aW9uKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXJldHVybiAocGFnZS0+ZmxhZ3MgPj4gU0VDVElPTlNfUEdTSElGVCkgJiBTRUNUSU9OU19NQVNLOwpAQCAtNDc3LDYgKzUxMyw3IEBACiAJcGFnZS0+ZmxhZ3MgJj0gfihOT0RFU19NQVNLIDw8IE5PREVTX1BHU0hJRlQpOwogCXBhZ2UtPmZsYWdzIHw9IChub2RlICYgTk9ERVNfTUFTSykgPDwgTk9ERVNfUEdTSElGVDsKIH0KKwogc3RhdGljIGlubGluZSB2b2lkIHNldF9wYWdlX3NlY3Rpb24oc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgc2VjdGlvbikKIHsKIAlwYWdlLT5mbGFncyAmPSB+KFNFQ1RJT05TX01BU0sgPDwgU0VDVElPTlNfUEdTSElGVCk7CkBAIC05NDcsOCArOTg0LDYgQEAKIGV4dGVybiB2b2lkIHNob3dfbWVtKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2lfbWVtaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqIHZhbCk7CiBleHRlcm4gdm9pZCBzaV9tZW1pbmZvX25vZGUoc3RydWN0IHN5c2luZm8gKnZhbCwgaW50IG5pZCk7Ci1leHRlcm4gdm9pZCB6b25ldGFibGVfYWRkKHN0cnVjdCB6b25lICp6b25lLCBpbnQgbmlkLCBlbnVtIHpvbmVfdHlwZSB6aWQsCi0JCQkJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiB2b2lkIHNldHVwX3Blcl9jcHVfcGFnZXNldCh2b2lkKTsKQEAgLTExMTUsOSArMTE1MCw2IEBACiAjZGVmaW5lIGluX2dhdGVfYXJlYSh0YXNrLCBhZGRyKSAoeyh2b2lkKXRhc2s7IGluX2dhdGVfYXJlYV9ub190YXNrKGFkZHIpO30pCiAjZW5kaWYJLyogX19IQVZFX0FSQ0hfR0FURV9BUkVBICovCiAKLS8qIC9wcm9jLzxwaWQ+L29vbV9hZGogc2V0IHRvIC0xNyBwcm90ZWN0cyBmcm9tIHRoZSBvb20ta2lsbGVyICovCi0jZGVmaW5lIE9PTV9ESVNBQkxFIC0xNwotCiBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCiAJCQkJCXZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiB1bnNpZ25lZCBsb25nIHNocmlua19zbGFiKHVuc2lnbmVkIGxvbmcgc2Nhbm5lZCwgZ2ZwX3QgZ2ZwX21hc2ssCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmggYi9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKaW5kZXggOTkxYTM3My4uZDBlNmE1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaApAQCAtMzksNiArMzksMTAgQEAKIAkJCQl3cml0ZV9taXNhbGlnbjoxOwogfTsKIAorc3RydWN0IG1tY19leHRfY3NkIHsKKwl1bnNpZ25lZCBpbnQJCWhzX21heF9kdHI7Cit9OworCiBzdHJ1Y3Qgc2Rfc2NyIHsKIAl1bnNpZ25lZCBjaGFyCQlzZGFfdnNuOwogCXVuc2lnbmVkIGNoYXIJCWJ1c193aWR0aHM7CkBAIC00Niw2ICs1MCwxMCBAQAogI2RlZmluZSBTRF9TQ1JfQlVTX1dJRFRIXzQJKDE8PDIpCiB9OwogCitzdHJ1Y3Qgc2Rfc3dpdGNoX2NhcHMgeworCXVuc2lnbmVkIGludAkJaHNfbWF4X2R0cjsKK307CisKIHN0cnVjdCBtbWNfaG9zdDsKIAogLyoKQEAgLTYyLDEyICs3MCwxNSBAQAogI2RlZmluZSBNTUNfU1RBVEVfQkFECQkoMTw8MikJCS8qIHVucmVjb2duaXNlZCBkZXZpY2UgKi8KICNkZWZpbmUgTU1DX1NUQVRFX1NEQ0FSRAkoMTw8MykJCS8qIGlzIGFuIFNEIGNhcmQgKi8KICNkZWZpbmUgTU1DX1NUQVRFX1JFQURPTkxZCSgxPDw0KQkJLyogY2FyZCBpcyByZWFkLW9ubHkgKi8KKyNkZWZpbmUgTU1DX1NUQVRFX0hJR0hTUEVFRAkoMTw8NSkJCS8qIGNhcmQgaXMgaW4gaGlnaCBzcGVlZCBtb2RlICovCiAJdTMyCQkJcmF3X2NpZFs0XTsJLyogcmF3IGNhcmQgQ0lEICovCiAJdTMyCQkJcmF3X2NzZFs0XTsJLyogcmF3IGNhcmQgQ1NEICovCiAJdTMyCQkJcmF3X3NjclsyXTsJLyogcmF3IGNhcmQgU0NSICovCiAJc3RydWN0IG1tY19jaWQJCWNpZDsJCS8qIGNhcmQgaWRlbnRpZmljYXRpb24gKi8KIAlzdHJ1Y3QgbW1jX2NzZAkJY3NkOwkJLyogY2FyZCBzcGVjaWZpYyAqLworCXN0cnVjdCBtbWNfZXh0X2NzZAlleHRfY3NkOwkvKiBtbWMgdjQgZXh0ZW5kZWQgY2FyZCBzcGVjaWZpYyAqLwogCXN0cnVjdCBzZF9zY3IJCXNjcjsJCS8qIGV4dHJhIFNEIGluZm9ybWF0aW9uICovCisJc3RydWN0IHNkX3N3aXRjaF9jYXBzCXN3X2NhcHM7CS8qIHN3aXRjaCAoQ01ENikgY2FwcyAqLwogfTsKIAogI2RlZmluZSBtbWNfY2FyZF9wcmVzZW50KGMpCSgoYyktPnN0YXRlICYgTU1DX1NUQVRFX1BSRVNFTlQpCkBAIC03NSwxMiArODYsMTQgQEAKICNkZWZpbmUgbW1jX2NhcmRfYmFkKGMpCQkoKGMpLT5zdGF0ZSAmIE1NQ19TVEFURV9CQUQpCiAjZGVmaW5lIG1tY19jYXJkX3NkKGMpCQkoKGMpLT5zdGF0ZSAmIE1NQ19TVEFURV9TRENBUkQpCiAjZGVmaW5lIG1tY19jYXJkX3JlYWRvbmx5KGMpCSgoYyktPnN0YXRlICYgTU1DX1NUQVRFX1JFQURPTkxZKQorI2RlZmluZSBtbWNfY2FyZF9oaWdoc3BlZWQoYykJKChjKS0+c3RhdGUgJiBNTUNfU1RBVEVfSElHSFNQRUVEKQogCiAjZGVmaW5lIG1tY19jYXJkX3NldF9wcmVzZW50KGMpCSgoYyktPnN0YXRlIHw9IE1NQ19TVEFURV9QUkVTRU5UKQogI2RlZmluZSBtbWNfY2FyZF9zZXRfZGVhZChjKQkoKGMpLT5zdGF0ZSB8PSBNTUNfU1RBVEVfREVBRCkKICNkZWZpbmUgbW1jX2NhcmRfc2V0X2JhZChjKQkoKGMpLT5zdGF0ZSB8PSBNTUNfU1RBVEVfQkFEKQogI2RlZmluZSBtbWNfY2FyZF9zZXRfc2QoYykJKChjKS0+c3RhdGUgfD0gTU1DX1NUQVRFX1NEQ0FSRCkKICNkZWZpbmUgbW1jX2NhcmRfc2V0X3JlYWRvbmx5KGMpICgoYyktPnN0YXRlIHw9IE1NQ19TVEFURV9SRUFET05MWSkKKyNkZWZpbmUgbW1jX2NhcmRfc2V0X2hpZ2hzcGVlZChjKSAoKGMpLT5zdGF0ZSB8PSBNTUNfU1RBVEVfSElHSFNQRUVEKQogCiAjZGVmaW5lIG1tY19jYXJkX25hbWUoYykJKChjKS0+Y2lkLnByb2RfbmFtZSkKICNkZWZpbmUgbW1jX2NhcmRfaWQoYykJCSgoYyktPmRldi5idXNfaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKaW5kZXggNTg3MjY0YS4uYzE1YWUxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaApAQCAtNzQsOCArNzQsOCBAQAogc3RydWN0IGRldmljZTsKIAogc3RydWN0IG1tY19ob3N0IHsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwotCXN0cnVjdCBjbGFzc19kZXZpY2UJY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UJCSpwYXJlbnQ7CisJc3RydWN0IGRldmljZQkJY2xhc3NfZGV2OwogCWludAkJCWluZGV4OwogCWNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgKm9wczsKIAl1bnNpZ25lZCBpbnQJCWZfbWluOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJc3RydWN0IG1tY19jYXJkCQkqY2FyZF9idXN5OwkvKiB0aGUgTU1DIGNhcmQgY2xhaW1pbmcgaG9zdCAqLwogCXN0cnVjdCBtbWNfY2FyZAkJKmNhcmRfc2VsZWN0ZWQ7CS8qIHRoZSBzZWxlY3RlZCBNTUMgY2FyZCAqLwogCi0Jc3RydWN0IHdvcmtfc3RydWN0CWRldGVjdDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWRldGVjdDsKIAogCXVuc2lnbmVkIGxvbmcJCXByaXZhdGVbMF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogfTsKQEAgLTEyNSw4ICsxMjUsOCBAQAogCXJldHVybiAodm9pZCAqKWhvc3QtPnByaXZhdGU7CiB9CiAKLSNkZWZpbmUgbW1jX2Rldih4KQkoKHgpLT5kZXYpCi0jZGVmaW5lIG1tY19ob3N0bmFtZSh4KQkoKHgpLT5jbGFzc19kZXYuY2xhc3NfaWQpCisjZGVmaW5lIG1tY19kZXYoeCkJKCh4KS0+cGFyZW50KQorI2RlZmluZSBtbWNfaG9zdG5hbWUoeCkJKCh4KS0+Y2xhc3NfZGV2LmJ1c19pZCkKIAogZXh0ZXJuIGludCBtbWNfc3VzcGVuZF9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqLCBwbV9tZXNzYWdlX3QpOwogZXh0ZXJuIGludCBtbWNfcmVzdW1lX2hvc3Qoc3RydWN0IG1tY19ob3N0ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvcHJvdG9jb2wuaCBiL2luY2x1ZGUvbGludXgvbW1jL3Byb3RvY29sLmgKaW5kZXggMDhkZWM4ZC4uMmRjZTYwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvcHJvdG9jb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9wcm90b2NvbC5oCkBAIC0yNSwxNCArMjUsMTYgQEAKICNpZm5kZWYgTU1DX01NQ19QUk9UT0NPTF9ICiAjZGVmaW5lIE1NQ19NTUNfUFJPVE9DT0xfSAogCi0vKiBTdGFuZGFyZCBNTUMgY29tbWFuZHMgKDMuMSkgICAgICAgICAgIHR5cGUgIGFyZ3VtZW50ICAgICByZXNwb25zZSAqLworLyogU3RhbmRhcmQgTU1DIGNvbW1hbmRzICg0LjEpICAgICAgICAgICB0eXBlICBhcmd1bWVudCAgICAgcmVzcG9uc2UgKi8KICAgIC8qIGNsYXNzIDEgKi8KICNkZWZpbmUJTU1DX0dPX0lETEVfU1RBVEUgICAgICAgICAwICAgLyogYmMgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIE1NQ19TRU5EX09QX0NPTkQgICAgICAgICAgMSAgIC8qIGJjciAgWzMxOjBdIE9DUiAgICAgICAgIFIzICAqLwogI2RlZmluZSBNTUNfQUxMX1NFTkRfQ0lEICAgICAgICAgIDIgICAvKiBiY3IgICAgICAgICAgICAgICAgICAgICBSMiAgKi8KICNkZWZpbmUgTU1DX1NFVF9SRUxBVElWRV9BRERSICAgICAzICAgLyogYWMgICBbMzE6MTZdIFJDQSAgICAgICAgUjEgICovCiAjZGVmaW5lIE1NQ19TRVRfRFNSICAgICAgICAgICAgICAgNCAgIC8qIGJjICAgWzMxOjE2XSBSQ0EgICAgICAgICAgICAqLworI2RlZmluZSBNTUNfU1dJVENIICAgICAgICAgICAgICAgIDYgICAvKiBhYyAgIFszMTowXSBTZWUgYmVsb3cgICBSMWIgKi8KICNkZWZpbmUgTU1DX1NFTEVDVF9DQVJEICAgICAgICAgICA3ICAgLyogYWMgICBbMzE6MTZdIFJDQSAgICAgICAgUjEgICovCisjZGVmaW5lIE1NQ19TRU5EX0VYVF9DU0QgICAgICAgICAgOCAgIC8qIGFkdGMgICAgICAgICAgICAgICAgICAgIFIxICAqLwogI2RlZmluZSBNTUNfU0VORF9DU0QgICAgICAgICAgICAgIDkgICAvKiBhYyAgIFszMToxNl0gUkNBICAgICAgICBSMiAgKi8KICNkZWZpbmUgTU1DX1NFTkRfQ0lEICAgICAgICAgICAgIDEwICAgLyogYWMgICBbMzE6MTZdIFJDQSAgICAgICAgUjIgICovCiAjZGVmaW5lIE1NQ19SRUFEX0RBVF9VTlRJTF9TVE9QICAxMSAgIC8qIGFkdGMgWzMxOjBdIGRhZHIgICAgICAgIFIxICAqLwpAQCAtODAsNiArODIsNyBAQAogICAvKiBjbGFzcyA4ICovCiAvKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBjb21tYW5kIGFzIGZvciBNTUMgd2l0aCBzb21lIHF1aXJrcy4gKi8KICNkZWZpbmUgU0RfU0VORF9SRUxBVElWRV9BRERSICAgICAzICAgLyogYmNyICAgICAgICAgICAgICAgICAgICAgUjYgICovCisjZGVmaW5lIFNEX1NXSVRDSCAgICAgICAgICAgICAgICAgNiAgIC8qIGFkdGMgWzMxOjBdIFNlZSBiZWxvdyAgIFIxICAqLwogCiAgIC8qIEFwcGxpY2F0aW9uIGNvbW1hbmRzICovCiAjZGVmaW5lIFNEX0FQUF9TRVRfQlVTX1dJRFRIICAgICAgNiAgIC8qIGFjICAgWzE6MF0gYnVzIHdpZHRoICAgIFIxICAqLwpAQCAtODgsNiArOTEsMzAgQEAKICNkZWZpbmUgU0RfQVBQX1NFTkRfU0NSICAgICAgICAgIDUxICAgLyogYWR0YyAgICAgICAgICAgICAgICAgICAgUjEgICovCiAKIC8qCisgKiBNTUNfU1dJVENIIGFyZ3VtZW50IGZvcm1hdDoKKyAqCisgKglbMzE6MjZdIEFsd2F5cyAwCisgKglbMjU6MjRdIEFjY2VzcyBNb2RlCisgKglbMjM6MTZdIExvY2F0aW9uIG9mIHRhcmdldCBCeXRlIGluIEVYVF9DU0QKKyAqCVsxNTowOF0gVmFsdWUgQnl0ZQorICoJWzA3OjAzXSBBbHdheXMgMAorICoJWzAyOjAwXSBDb21tYW5kIFNldAorICovCisKKy8qCisgKiBTRF9TV0lUQ0ggYXJndW1lbnQgZm9ybWF0OgorICoKKyAqICAgICAgWzMxXSBDaGVjayAoMCkgb3Igc3dpdGNoICgxKQorICogICAgICBbMzA6MjRdIFJlc2VydmVkICgwKQorICogICAgICBbMjM6MjBdIEZ1bmN0aW9uIGdyb3VwIDYKKyAqICAgICAgWzE5OjE2XSBGdW5jdGlvbiBncm91cCA1CisgKiAgICAgIFsxNToxMl0gRnVuY3Rpb24gZ3JvdXAgNAorICogICAgICBbMTE6OF0gRnVuY3Rpb24gZ3JvdXAgMworICogICAgICBbNzo0XSBGdW5jdGlvbiBncm91cCAyCisgKiAgICAgIFszOjBdIEZ1bmN0aW9uIGdyb3VwIDEKKyAqLworCisvKgogICBNTUMgc3RhdHVzIGluIFIxCiAgIFR5cGUKICAgCWUgOiBlcnJvciBiaXQKQEAgLTIzMCwxMyArMjU3LDU0IEBACiAKICNkZWZpbmUgQ1NEX1NUUlVDVF9WRVJfMV8wICAwICAgICAgICAgICAvKiBWYWxpZCBmb3Igc3lzdGVtIHNwZWNpZmljYXRpb24gMS4wIC0gMS4yICovCiAjZGVmaW5lIENTRF9TVFJVQ1RfVkVSXzFfMSAgMSAgICAgICAgICAgLyogVmFsaWQgZm9yIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDEuNCAtIDIuMiAqLwotI2RlZmluZSBDU0RfU1RSVUNUX1ZFUl8xXzIgIDIgICAgICAgICAgIC8qIFZhbGlkIGZvciBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAzLjEgICAgICAgKi8KKyNkZWZpbmUgQ1NEX1NUUlVDVF9WRVJfMV8yICAyICAgICAgICAgICAvKiBWYWxpZCBmb3Igc3lzdGVtIHNwZWNpZmljYXRpb24gMy4xIC0gMy4yIC0gMy4zMSAtIDQuMCAtIDQuMSAqLworI2RlZmluZSBDU0RfU1RSVUNUX0VYVF9DU0QgIDMgICAgICAgICAgIC8qIFZlcnNpb24gaXMgY29kZWQgaW4gQ1NEX1NUUlVDVFVSRSBpbiBFWFRfQ1NEICovCiAKICNkZWZpbmUgQ1NEX1NQRUNfVkVSXzAgICAgICAwICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDEuMCAtIDEuMiAqLwogI2RlZmluZSBDU0RfU1BFQ19WRVJfMSAgICAgIDEgICAgICAgICAgIC8qIEltcGxlbWVudHMgc3lzdGVtIHNwZWNpZmljYXRpb24gMS40ICovCiAjZGVmaW5lIENTRF9TUEVDX1ZFUl8yICAgICAgMiAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAyLjAgLSAyLjIgKi8KLSNkZWZpbmUgQ1NEX1NQRUNfVkVSXzMgICAgICAzICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDMuMSAqLworI2RlZmluZSBDU0RfU1BFQ19WRVJfMyAgICAgIDMgICAgICAgICAgIC8qIEltcGxlbWVudHMgc3lzdGVtIHNwZWNpZmljYXRpb24gMy4xIC0gMy4yIC0gMy4zMSAqLworI2RlZmluZSBDU0RfU1BFQ19WRVJfNCAgICAgIDQgICAgICAgICAgIC8qIEltcGxlbWVudHMgc3lzdGVtIHNwZWNpZmljYXRpb24gNC4wIC0gNC4xICovCiAKKy8qCisgKiBFWFRfQ1NEIGZpZWxkcworICovCisKKyNkZWZpbmUgRVhUX0NTRF9CVVNfV0lEVEgJMTgzCS8qIFIvVyAqLworI2RlZmluZSBFWFRfQ1NEX0hTX1RJTUlORwkxODUJLyogUi9XICovCisjZGVmaW5lIEVYVF9DU0RfQ0FSRF9UWVBFCTE5NgkvKiBSTyAqLworCisvKgorICogRVhUX0NTRCBmaWVsZCBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgRVhUX0NTRF9DTURfU0VUX05PUk1BTAkJKDE8PDApCisjZGVmaW5lIEVYVF9DU0RfQ01EX1NFVF9TRUNVUkUJCSgxPDwxKQorI2RlZmluZSBFWFRfQ1NEX0NNRF9TRVRfQ1BTRUNVUkUJKDE8PDIpCisKKyNkZWZpbmUgRVhUX0NTRF9DQVJEX1RZUEVfMjYJKDE8PDApCS8qIENhcmQgY2FuIHJ1biBhdCAyNk1IeiAqLworI2RlZmluZSBFWFRfQ1NEX0NBUkRfVFlQRV81MgkoMTw8MSkJLyogQ2FyZCBjYW4gcnVuIGF0IDUyTUh6ICovCisKKyNkZWZpbmUgRVhUX0NTRF9CVVNfV0lEVEhfMQkwCS8qIENhcmQgaXMgaW4gMSBiaXQgbW9kZSAqLworI2RlZmluZSBFWFRfQ1NEX0JVU19XSURUSF80CTEJLyogQ2FyZCBpcyBpbiA0IGJpdCBtb2RlICovCisjZGVmaW5lIEVYVF9DU0RfQlVTX1dJRFRIXzgJMgkvKiBDYXJkIGlzIGluIDggYml0IG1vZGUgKi8KKworLyoKKyAqIE1NQ19TV0lUQ0ggYWNjZXNzIG1vZGVzCisgKi8KKworI2RlZmluZSBNTUNfU1dJVENIX01PREVfQ01EX1NFVAkJMHgwMAkvKiBDaGFuZ2UgdGhlIGNvbW1hbmQgc2V0ICovCisjZGVmaW5lIE1NQ19TV0lUQ0hfTU9ERV9TRVRfQklUUwkweDAxCS8qIFNldCBiaXRzIHdoaWNoIGFyZSAxIGluIHZhbHVlICovCisjZGVmaW5lIE1NQ19TV0lUQ0hfTU9ERV9DTEVBUl9CSVRTCTB4MDIJLyogQ2xlYXIgYml0cyB3aGljaCBhcmUgMSBpbiB2YWx1ZSAqLworI2RlZmluZSBNTUNfU1dJVENIX01PREVfV1JJVEVfQllURQkweDAzCS8qIFNldCB0YXJnZXQgdG8gdmFsdWUgKi8KKworLyoKKyAqIFNDUiBmaWVsZCBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgU0NSX1NQRUNfVkVSXzAgICAgICAwICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDEuMCAtIDEuMDEgKi8KKyNkZWZpbmUgU0NSX1NQRUNfVkVSXzEgICAgICAxICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDEuMTAgKi8KKyNkZWZpbmUgU0NSX1NQRUNfVkVSXzIgICAgICAyICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDIuMDAgKi8KIAogLyoKICAqIFNEIGJ1cyB3aWR0aHMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IDU5ODU1YjguLmUzMzlhNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMjE4LDEzICsyMTgsOSBAQAogCSAqIHVuZGVyIC0gaXQgZHJpdmVzIHRoZSBzd2FwcGluZXNzIGRlY2lzaW9uOiB3aGV0aGVyIHRvIHVubWFwIG1hcHBlZAogCSAqIHBhZ2VzLgogCSAqCi0JICogdGVtcF9wcmlvcml0eSBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBzY2FubmluZyBwcmlvcml0eSBhdCB3aGljaAotCSAqIHRoaXMgem9uZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlZmlsbGVkIHRvIGZyZWVfcGFnZXMgPT0gcGFnZXNfaGlnaC4KLQkgKgotCSAqIEFjY2VzcyB0byBib3RoIHRoZXNlIGZpZWxkcyBpcyBxdWl0ZSByYWN5IGV2ZW4gb24gdW5pcHJvY2Vzc29yLiAgQnV0CisJICogQWNjZXNzIHRvIGJvdGggdGhpcyBmaWVsZCBpcyBxdWl0ZSByYWN5IGV2ZW4gb24gdW5pcHJvY2Vzc29yLiAgQnV0CiAJICogaXQgaXMgZXhwZWN0ZWQgdG8gYXZlcmFnZSBvdXQgT0suCiAJICovCi0JaW50IHRlbXBfcHJpb3JpdHk7CiAJaW50IHByZXZfcHJpb3JpdHk7CiAKIApAQCAtMjgyLDcgKzI3OCw3IEBACiAJLyoKIAkgKiByYXJlbHkgdXNlZCBmaWVsZHM6CiAJICovCi0JY2hhcgkJCSpuYW1lOworCWNvbnN0IGNoYXIJCSpuYW1lOwogfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogCiAvKgpAQCAtMjkyLDE5ICsyODgsOTQgQEAKICAqLwogI2RlZmluZSBERUZfUFJJT1JJVFkgMTIKIAorLyogTWF4aW11bSBudW1iZXIgb2Ygem9uZXMgb24gYSB6b25lbGlzdCAqLworI2RlZmluZSBNQVhfWk9ORVNfUEVSX1pPTkVMSVNUIChNQVhfTlVNTk9ERVMgKiBNQVhfTlJfWk9ORVMpCisKKyNpZmRlZiBDT05GSUdfTlVNQQorLyoKKyAqIFdlIGNhY2hlIGtleSBpbmZvcm1hdGlvbiBmcm9tIGVhY2ggem9uZWxpc3QgZm9yIHNtYWxsZXIgY2FjaGUKKyAqIGZvb3RwcmludCB3aGVuIHNjYW5uaW5nIGZvciBmcmVlIHBhZ2VzIGluIGdldF9wYWdlX2Zyb21fZnJlZWxpc3QoKS4KKyAqCisgKiAxKSBUaGUgQklUTUFQIGZ1bGx6b25lcyB0cmFja3Mgd2hpY2ggem9uZXMgaW4gYSB6b25lbGlzdCBoYXZlIGNvbWUKKyAqICAgIHVwIHNob3J0IG9mIGZyZWUgbWVtb3J5IHNpbmNlIHRoZSBsYXN0IHRpbWUgKGxhc3RfZnVsbHpvbmVfemFwKQorICogICAgd2UgemVybydkIGZ1bGx6b25lcy4KKyAqIDIpIFRoZSBhcnJheSB6X3RvX25bXSBtYXBzIGVhY2ggem9uZSBpbiB0aGUgem9uZWxpc3QgdG8gaXRzIG5vZGUKKyAqICAgIGlkLCBzbyB0aGF0IHdlIGNhbiBlZmZpY2llbnRseSBldmFsdWF0ZSB3aGV0aGVyIHRoYXQgbm9kZSBpcworICogICAgc2V0IGluIHRoZSBjdXJyZW50IHRhc2tzIG1lbXNfYWxsb3dlZC4KKyAqCisgKiBCb3RoIGZ1bGx6b25lcyBhbmQgel90b19uW10gYXJlIG9uZS10by1vbmUgd2l0aCB0aGUgem9uZWxpc3QsCisgKiBpbmRleGVkIGJ5IGEgem9uZXMgb2Zmc2V0IGluIHRoZSB6b25lbGlzdCB6b25lc1tdIGFycmF5LgorICoKKyAqIFRoZSBnZXRfcGFnZV9mcm9tX2ZyZWVsaXN0KCkgcm91dGluZSBkb2VzIHR3byBzY2Fucy4gIER1cmluZyB0aGUKKyAqIGZpcnN0IHNjYW4sIHdlIHNraXAgem9uZXMgd2hvc2UgY29ycmVzcG9uZGluZyBiaXQgaW4gJ2Z1bGx6b25lcycKKyAqIGlzIHNldCBvciB3aG9zZSBjb3JyZXNwb25kaW5nIG5vZGUgaW4gY3VycmVudC0+bWVtc19hbGxvd2VkICh3aGljaAorICogY29tZXMgZnJvbSBjcHVzZXRzKSBpcyBub3Qgc2V0LiAgRHVyaW5nIHRoZSBzZWNvbmQgc2Nhbiwgd2UgYnlwYXNzCisgKiB0aGlzIHpvbmVsaXN0X2NhY2hlLCB0byBlbnN1cmUgd2UgbG9vayBtZXRob2RpY2FsbHkgYXQgZWFjaCB6b25lLgorICoKKyAqIE9uY2UgcGVyIHNlY29uZCwgd2UgemVybyBvdXQgKHphcCkgZnVsbHpvbmVzLCBmb3JjaW5nIHVzIHRvCisgKiByZWNvbnNpZGVyIG5vZGVzIHRoYXQgbWlnaHQgaGF2ZSByZWdhaW5lZCBtb3JlIGZyZWUgbWVtb3J5LgorICogVGhlIGZpZWxkIGxhc3RfZnVsbF96YXAgaXMgdGhlIHRpbWUgd2UgbGFzdCB6YXBwZWQgZnVsbHpvbmVzLgorICoKKyAqIFRoaXMgbWVjaGFuaXNtIHJlZHVjZXMgdGhlIGFtb3VudCBvZiB0aW1lIHdlIHdhc3RlIHJlcGVhdGVkbHkKKyAqIHJlZXhhbWluZyB6b25lcyBmb3IgZnJlZSBtZW1vcnkgd2hlbiB0aGV5IGp1c3QgY2FtZSB1cCBsb3cgb24KKyAqIG1lbW9yeSBtb21lbnRhcmlsbHkgYWdvLgorICoKKyAqIFRoZSB6b25lbGlzdF9jYWNoZSBzdHJ1Y3QgbWVtYmVycyBsb2dpY2FsbHkgYmVsb25nIGluIHN0cnVjdAorICogem9uZWxpc3QuICBIb3dldmVyLCB0aGUgbWVtcG9saWN5IHpvbmVsaXN0cyBjb25zdHJ1Y3RlZCBmb3IKKyAqIE1QT0xfQklORCBhcmUgaW50ZW50aW9uYWxseSB2YXJpYWJsZSBsZW5ndGggKGFuZCB1c3VhbGx5IG11Y2gKKyAqIHNob3J0ZXIpLiAgQSBnZW5lcmFsIHB1cnBvc2UgbWVjaGFuaXNtIGZvciBoYW5kbGluZyBzdHJ1Y3RzIHdpdGgKKyAqIG11bHRpcGxlIHZhcmlhYmxlIGxlbmd0aCBtZW1iZXJzIGlzIG1vcmUgbWVjaGFuaXNtIHRoYW4gd2Ugd2FudAorICogaGVyZS4gIFdlIHJlc29ydCB0byBzb21lIHNwZWNpYWwgY2FzZSBoYWNrZXJ5IGluc3RlYWQuCisgKgorICogVGhlIE1QT0xfQklORCB6b25lbGlzdHMgZG9uJ3QgbmVlZCB0aGlzIHpvbmVsaXN0X2NhY2hlIChpbiBnb29kCisgKiBwYXJ0IGJlY2F1c2UgdGhleSBhcmUgc2hvcnRlciksIHNvIHdlIHB1dCB0aGUgZml4ZWQgbGVuZ3RoIHN0dWZmCisgKiBhdCB0aGUgZnJvbnQgb2YgdGhlIHpvbmVsaXN0IHN0cnVjdCwgZW5kaW5nIGluIGEgdmFyaWFibGUgbGVuZ3RoCisgKiB6b25lc1tdLCBhcyBpcyBuZWVkZWQgYnkgTVBPTF9CSU5ELgorICoKKyAqIFRoZW4gd2UgcHV0IHRoZSBvcHRpb25hbCB6b25lbGlzdCBjYWNoZSBvbiB0aGUgZW5kIG9mIHRoZSB6b25lbGlzdAorICogc3RydWN0LiAgVGhpcyBvcHRpb25hbCBzdHVmZiBpcyBmb3VuZCBieSBhICd6bGNhY2hlX3B0cicgcG9pbnRlciBpbgorICogdGhlIGZpeGVkIGxlbmd0aCBwb3J0aW9uIGF0IHRoZSBmcm9udCBvZiB0aGUgc3RydWN0LiAgVGhpcyBwb2ludGVyCisgKiBib3RoIGVuYWJsZXMgdXMgdG8gZmluZCB0aGUgem9uZWxpc3QgY2FjaGUsIGFuZCBpbiB0aGUgY2FzZSBvZgorICogTVBPTF9CSU5EIHpvbmVsaXN0cywgKHdoaWNoIHdpbGwganVzdCBzZXQgdGhlIHpsY2FjaGVfcHRyIHRvIE5VTEwpCisgKiB0byBrbm93IHRoYXQgdGhlIHpvbmVsaXN0IGNhY2hlIGlzIG5vdCB0aGVyZS4KKyAqCisgKiBUaGUgZW5kIHJlc3VsdCBpcyB0aGF0IHN0cnVjdCB6b25lbGlzdHMgY29tZSBpbiB0d28gZmxhdm9yczoKKyAqICAxKSBUaGUgZnVsbCwgZml4ZWQgbGVuZ3RoIHZlcnNpb24sIHNob3duIGJlbG93LCBhbmQKKyAqICAyKSBUaGUgY3VzdG9tIHpvbmVsaXN0cyBmb3IgTVBPTF9CSU5ELgorICogVGhlIGN1c3RvbSBNUE9MX0JJTkQgem9uZWxpc3RzIGhhdmUgYSBOVUxMIHpsY2FjaGVfcHRyIGFuZCBubyB6bGNhY2hlLgorICoKKyAqIEV2ZW4gdGhvdWdoIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBDUFUgY29yZXMgb24gYSBub2RlIG1vZGlmeWluZworICogZnVsbHpvbmVzIG9yIGxhc3RfZnVsbF96YXAgaW4gdGhlIHNhbWUgem9uZWxpc3RfY2FjaGUgYXQgdGhlIHNhbWUKKyAqIHRpbWUsIHdlIGRvbid0IGxvY2sgaXQuICBUaGlzIGlzIGp1c3QgaGludCBkYXRhIC0gaWYgaXQgaXMgd3Jvbmcgbm93CisgKiBhbmQgdGhlbiwgdGhlIGFsbG9jYXRvciB3aWxsIHN0aWxsIGZ1bmN0aW9uLCBwZXJoYXBzIGEgYml0IHNsb3dlci4KKyAqLworCisKK3N0cnVjdCB6b25lbGlzdF9jYWNoZSB7CisJdW5zaWduZWQgc2hvcnQgel90b19uW01BWF9aT05FU19QRVJfWk9ORUxJU1RdOwkJLyogem9uZS0+bmlkICovCisJREVDTEFSRV9CSVRNQVAoZnVsbHpvbmVzLCBNQVhfWk9ORVNfUEVSX1pPTkVMSVNUKTsJLyogem9uZSBmdWxsPyAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9mdWxsX3phcDsJCS8qIHdoZW4gbGFzdCB6YXAnZCAoamlmZmllcykgKi8KK307CisjZWxzZQorc3RydWN0IHpvbmVsaXN0X2NhY2hlOworI2VuZGlmCisKIC8qCiAgKiBPbmUgYWxsb2NhdGlvbiByZXF1ZXN0IG9wZXJhdGVzIG9uIGEgem9uZWxpc3QuIEEgem9uZWxpc3QKICAqIGlzIGEgbGlzdCBvZiB6b25lcywgdGhlIGZpcnN0IG9uZSBpcyB0aGUgJ2dvYWwnIG9mIHRoZQogICogYWxsb2NhdGlvbiwgdGhlIG90aGVyIHpvbmVzIGFyZSBmYWxsYmFjayB6b25lcywgaW4gZGVjcmVhc2luZwogICogcHJpb3JpdHkuCiAgKgotICogUmlnaHQgbm93IGEgem9uZWxpc3QgdGFrZXMgdXAgbGVzcyB0aGFuIGEgY2FjaGVsaW5lLiBXZSBuZXZlcgotICogbW9kaWZ5IGl0IGFwYXJ0IGZyb20gYm9vdC11cCwgYW5kIG9ubHkgYSBmZXcgaW5kaWNlcyBhcmUgdXNlZCwKLSAqIHNvIGRlc3BpdGUgdGhlIHpvbmVsaXN0IHRhYmxlIGJlaW5nIHJlbGF0aXZlbHkgYmlnLCB0aGUgY2FjaGUKLSAqIGZvb3RwcmludCBvZiB0aGlzIGNvbnN0cnVjdCBpcyB2ZXJ5IHNtYWxsLgorICogSWYgemxjYWNoZV9wdHIgaXMgbm90IE5VTEwsIHRoZW4gaXQgaXMganVzdCB0aGUgYWRkcmVzcyBvZiB6bGNhY2hlLAorICogYXMgZXhwbGFpbmVkIGFib3ZlLiAgSWYgemxjYWNoZV9wdHIgaXMgTlVMTCwgdGhlcmUgaXMgbm8gemxjYWNoZS4KICAqLworCiBzdHJ1Y3Qgem9uZWxpc3QgewotCXN0cnVjdCB6b25lICp6b25lc1tNQVhfTlVNTk9ERVMgKiBNQVhfTlJfWk9ORVMgKyAxXTsgLy8gTlVMTCBkZWxpbWl0ZWQKKwlzdHJ1Y3Qgem9uZWxpc3RfY2FjaGUgKnpsY2FjaGVfcHRyOwkJICAgICAvLyBOVUxMIG9yICZ6bGNhY2hlCisJc3RydWN0IHpvbmUgKnpvbmVzW01BWF9aT05FU19QRVJfWk9ORUxJU1QgKyAxXTsgICAgICAvLyBOVUxMIGRlbGltaXRlZAorI2lmZGVmIENPTkZJR19OVU1BCisJc3RydWN0IHpvbmVsaXN0X2NhY2hlIHpsY2FjaGU7CQkJICAgICAvLyBvcHRpb25hbCAuLi4KKyNlbmRpZgogfTsKIAogI2lmZGVmIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUApAQCAtNjc0LDYgKzc0NSwxMiBAQAogI2RlZmluZSBzcGFyc2VfaW5kZXhfaW5pdChfc2VjLCBfbmlkKSAgZG8ge30gd2hpbGUgKDApCiAjZW5kaWYgLyogQ09ORklHX1NQQVJTRU1FTSAqLwogCisjaWZkZWYgQ09ORklHX05PREVTX1NQQU5fT1RIRVJfTk9ERVMKKyNkZWZpbmUgZWFybHlfcGZuX2luX25pZChwZm4sIG5pZCkJKGVhcmx5X3Bmbl90b19uaWQocGZuKSA9PSAobmlkKSkKKyNlbHNlCisjZGVmaW5lIGVhcmx5X3Bmbl9pbl9uaWQocGZuLCBuaWQpCSgxKQorI2VuZGlmCisKICNpZm5kZWYgZWFybHlfcGZuX3ZhbGlkCiAjZGVmaW5lIGVhcmx5X3Bmbl92YWxpZChwZm4pCSgxKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21udF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvbW50X25hbWVzcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjBiMWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21udF9uYW1lc3BhY2UuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIF9OQU1FU1BBQ0VfSF8KKyNkZWZpbmUgX05BTUVTUEFDRV9IXworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisKK3N0cnVjdCBtbnRfbmFtZXNwYWNlIHsKKwlhdG9taWNfdAkJY291bnQ7CisJc3RydWN0IHZmc21vdW50ICoJcm9vdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcG9sbDsKKwlpbnQgZXZlbnQ7Cit9OworCitleHRlcm4gaW50IGNvcHlfbW50X25zKGludCwgc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgX19wdXRfbW50X25zKHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucyk7CitleHRlcm4gc3RydWN0IG1udF9uYW1lc3BhY2UgKmR1cF9tbnRfbnMoc3RydWN0IHRhc2tfc3RydWN0ICosCisJCXN0cnVjdCBmc19zdHJ1Y3QgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbW50X25zKHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucykKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmbnMtPmNvdW50LCAmdmZzbW91bnRfbG9jaykpCisJCS8qIHJlbGVhc2VzIHZmc21vdW50X2xvY2sgKi8KKwkJX19wdXRfbW50X25zKG5zKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4aXRfbW50X25zKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMgPSBwLT5uc3Byb3h5LT5tbnRfbnM7CisJaWYgKG5zKQorCQlwdXRfbW50X25zKG5zKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9tbnRfbnMoc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zKQoreworCWF0b21pY19pbmMoJm5zLT5jb3VudCk7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCBkMWQwMGNlLi4xMGY3NzFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTYsNyArNiw2IEBACiAgKiBSZXdyaXR0ZW4gYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4gRGVjIDE5OTYKICAqIFJld3JpdHRlbiBhZ2FpbiBieSBSdXN0eSBSdXNzZWxsLCAyMDAyCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KQEAgLTI2NCw2ICsyNjMsNyBAQAogCXN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptb2RpbmZvX2F0dHJzOwogCWNvbnN0IGNoYXIgKnZlcnNpb247CiAJY29uc3QgY2hhciAqc3JjdmVyc2lvbjsKKwlzdHJ1Y3Qga29iamVjdCAqZHJpdmVyc19kaXI7CiAKIAkvKiBFeHBvcnRlZCBzeW1ib2xzICovCiAJY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKnN5bXM7CkBAIC0zMTksNiArMzE5LDEzIEBACiAKIAl1bnNpZ25lZCBpbnQgdGFpbnRzOwkvKiBzYW1lIGJpdHMgYXMga2VybmVsOnRhaW50ZWQgKi8KIAorI2lmZGVmIENPTkZJR19HRU5FUklDX0JVRworCS8qIFN1cHBvcnQgZm9yIEJVRyAqLworCXN0cnVjdCBsaXN0X2hlYWQgYnVnX2xpc3Q7CisJc3RydWN0IGJ1Z19lbnRyeSAqYnVnX3RhYmxlOworCXVuc2lnbmVkIG51bV9idWdzOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAogCS8qIFJlZmVyZW5jZSBjb3VudHMgKi8KIAlzdHJ1Y3QgbW9kdWxlX3JlZiByZWZbTlJfQ1BVU107CkBAIC00MTAsMTcgKzQxNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1vZHVsZV9wdXQoc3RydWN0IG1vZHVsZSAqbW9kdWxlKQotewotCWlmIChtb2R1bGUpIHsKLQkJdW5zaWduZWQgaW50IGNwdSA9IGdldF9jcHUoKTsKLQkJbG9jYWxfZGVjKCZtb2R1bGUtPnJlZltjcHVdLmNvdW50KTsKLQkJLyogTWF5YmUgdGhleSdyZSB3YWl0aW5nIGZvciB1cyB0byBkcm9wIHJlZmVyZW5jZT8gKi8KLQkJaWYgKHVubGlrZWx5KCFtb2R1bGVfaXNfbGl2ZShtb2R1bGUpKSkKLQkJCXdha2VfdXBfcHJvY2Vzcyhtb2R1bGUtPndhaXRlcik7Ci0JCXB1dF9jcHUoKTsKLQl9Ci19CitleHRlcm4gdm9pZCBtb2R1bGVfcHV0KHN0cnVjdCBtb2R1bGUgKm1vZHVsZSk7CiAKICNlbHNlIC8qIUNPTkZJR19NT0RVTEVfVU5MT0FEKi8KIHN0YXRpYyBpbmxpbmUgaW50IHRyeV9tb2R1bGVfZ2V0KHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kdWxlcGFyYW0uaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlcGFyYW0uaAppbmRleCA3YzBjMmMxLi40YTE4OWRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZXBhcmFtLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2R1bGVwYXJhbS5oCkBAIC02Myw2ICs2Myw5IEBACiAgICBub3QgdGhlcmUsIHJlYWQgYml0cyBtZWFuIGl0J3MgcmVhZGFibGUsIHdyaXRlIGJpdHMgbWVhbiBpdCdzCiAgICB3cml0YWJsZS4gKi8KICNkZWZpbmUgX19tb2R1bGVfcGFyYW1fY2FsbChwcmVmaXgsIG5hbWUsIHNldCwgZ2V0LCBhcmcsIHBlcm0pCQlcCisJLyogRGVmYXVsdCB2YWx1ZSBpbnN0ZWFkIG9mIHBlcm1pc3Npb25zPyAqLwkJCVwKKwlzdGF0aWMgaW50IF9fcGFyYW1fcGVybV9jaGVja18jI25hbWUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPQlcCisJQlVJTERfQlVHX09OX1pFUk8oKHBlcm0pIDwgMCB8fCAocGVybSkgPiAwNzc3IHx8ICgocGVybSkgJiAyKSk7CVwKIAlzdGF0aWMgY2hhciBfX3BhcmFtX3N0cl8jI25hbWVbXSA9IHByZWZpeCAjbmFtZTsJCVwKIAlzdGF0aWMgc3RydWN0IGtlcm5lbF9wYXJhbSBjb25zdCBfX3BhcmFtXyMjbmFtZQkJCVwKIAlfX2F0dHJpYnV0ZV91c2VkX18JCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vdW50LmggYi9pbmNsdWRlL2xpbnV4L21vdW50LmgKaW5kZXggNDAzZDFhOS4uMWI3ZTE3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb3VudC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW91bnQuaApAQCAtMjAsMTMgKzIwLDE0IEBACiBzdHJ1Y3Qgc3VwZXJfYmxvY2s7CiBzdHJ1Y3QgdmZzbW91bnQ7CiBzdHJ1Y3QgZGVudHJ5Owotc3RydWN0IG5hbWVzcGFjZTsKK3N0cnVjdCBtbnRfbmFtZXNwYWNlOwogCiAjZGVmaW5lIE1OVF9OT1NVSUQJMHgwMQogI2RlZmluZSBNTlRfTk9ERVYJMHgwMgogI2RlZmluZSBNTlRfTk9FWEVDCTB4MDQKICNkZWZpbmUgTU5UX05PQVRJTUUJMHgwOAogI2RlZmluZSBNTlRfTk9ESVJBVElNRQkweDEwCisjZGVmaW5lIE1OVF9SRUxBVElNRQkweDIwCiAKICNkZWZpbmUgTU5UX1NIUklOS0FCTEUJMHgxMDAKIApAQCAtNTIsNyArNTMsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbW50X3NsYXZlX2xpc3Q7LyogbGlzdCBvZiBzbGF2ZSBtb3VudHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1udF9zbGF2ZTsJLyogc2xhdmUgbGlzdCBlbnRyeSAqLwogCXN0cnVjdCB2ZnNtb3VudCAqbW50X21hc3RlcjsJLyogc2xhdmUgaXMgb24gbWFzdGVyLT5tbnRfc2xhdmVfbGlzdCAqLwotCXN0cnVjdCBuYW1lc3BhY2UgKm1udF9uYW1lc3BhY2U7IC8qIGNvbnRhaW5pbmcgbmFtZXNwYWNlICovCisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm1udF9uczsJLyogY29udGFpbmluZyBuYW1lc3BhY2UgKi8KIAlpbnQgbW50X3Bpbm5lZDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXF1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L21xdWV1ZS5oCmluZGV4IDhkYjlkNzUuLjhiNWE3OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXF1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tcXVldWUuaApAQCAtMTgsOCArMTgsNiBAQAogI2lmbmRlZiBfTElOVVhfTVFVRVVFX0gKICNkZWZpbmUgX0xJTlVYX01RVUVVRV9ICiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCiAjZGVmaW5lIE1RX1BSSU9fTUFYIAkzMjc2OAogLyogcGVyLXVpZCBsaW1pdCBvZiBrZXJuZWwgbWVtb3J5IHVzZWQgYnkgbXF1ZXVlLCBpbiBieXRlcyAqLwogI2RlZmluZSBNUV9CWVRFU19NQVgJODE5MjAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmggYi9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKaW5kZXggY2U2Yzg1OC4uMjRhOWVmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaApAQCAtNDAyLDYgKzQwMiw4IEBACiBleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZmF0X2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBpbnQgZmF0X25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGlhdHRyICogYXR0cik7CiBleHRlcm4gdm9pZCBmYXRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gaW50IGZhdF9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpOwogCiAvKiBmYXQvaW5vZGUuYyAqLwogZXh0ZXJuIHZvaWQgZmF0X2F0dGFjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgaV9wb3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tc2cuaCBiL2luY2x1ZGUvbGludXgvbXNnLmgKaW5kZXggYWNjN2MxNy4uZjFiNjA3NDBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zZy5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNnLmgKQEAgLTkyLDYgKzkyLDEyIEBACiAJc3RydWN0IGxpc3RfaGVhZCBxX3NlbmRlcnM7CiB9OwogCisvKiBIZWxwZXIgcm91dGluZXMgZm9yIHN5c19tc2dzbmQgYW5kIHN5c19tc2dyY3YgKi8KK2V4dGVybiBsb25nIGRvX21zZ3NuZChpbnQgbXNxaWQsIGxvbmcgbXR5cGUsIHZvaWQgX191c2VyICptdGV4dCwKKwkJCXNpemVfdCBtc2dzeiwgaW50IG1zZ2ZsZyk7CitleHRlcm4gbG9uZyBkb19tc2dyY3YoaW50IG1zcWlkLCBsb25nICpwbXR5cGUsIHZvaWQgX191c2VyICptdGV4dCwKKwkJCXNpemVfdCBtc2dzeiwgbG9uZyBtc2d0eXAsIGludCBtc2dmbGcpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX01TR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmggYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKaW5kZXggNzA0MjBiYi4uOGIzZWY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaApAQCAtMzU1LDcgKzM1NSw3IEBACiAgKiBAcHJpdjoJCVtPUFRJT05BTF0gcG9pbnRlciB0byBwcml2YXRlIGNoaXAgZGF0ZQogICogQGVycnN0YXQ6CQlbT1BUSU9OQUxdIGhhcmR3YXJlIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBlcnJvciBzdGF0dXMgY2hlY2tzCiAgKgkJCShkZXRlcm1pbmUgaWYgZXJyb3JzIGFyZSBjb3JyZWN0YWJsZSkKLSAqIEB3cml0ZV9wYWdlCQlbUkVQTEFDRUFCTEVdIEhpZ2gtbGV2ZWwgcGFnZSB3cml0ZSBmdW5jdGlvbgorICogQHdyaXRlX3BhZ2U6CQlbUkVQTEFDRUFCTEVdIEhpZ2gtbGV2ZWwgcGFnZSB3cml0ZSBmdW5jdGlvbgogICovCiAKIHN0cnVjdCBuYW5kX2NoaXAgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdXRleC5oIGIvaW5jbHVkZS9saW51eC9tdXRleC5oCmluZGV4IDI3YzQ4ZGEuLmE3NTQ0YWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXV0ZXguaAorKysgYi9pbmNsdWRlL2xpbnV4L211dGV4LmgKQEAgLTk0LDcgKzk0LDcgQEAKIAogI2RlZmluZSBfX01VVEVYX0lOSVRJQUxJWkVSKGxvY2tuYW1lKSBcCiAJCXsgLmNvdW50ID0gQVRPTUlDX0lOSVQoMSkgXAotCQksIC53YWl0X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQgXAorCQksIC53YWl0X2xvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChsb2NrbmFtZS53YWl0X2xvY2spIFwKIAkJLCAud2FpdF9saXN0ID0gTElTVF9IRUFEX0lOSVQobG9ja25hbWUud2FpdF9saXN0KSBcCiAJCV9fREVCVUdfTVVURVhfSU5JVElBTElaRVIobG9ja25hbWUpIFwKIAkJX19ERVBfTUFQX01VVEVYX0lOSVRJQUxJWkVSKGxvY2tuYW1lKSB9CkBAIC0xMjUsOCArMTI1LDEwIEBACiAKICNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwogZXh0ZXJuIHZvaWQgbXV0ZXhfbG9ja19uZXN0ZWQoc3RydWN0IG11dGV4ICpsb2NrLCB1bnNpZ25lZCBpbnQgc3ViY2xhc3MpOworZXh0ZXJuIGludCBtdXRleF9sb2NrX2ludGVycnVwdGlibGVfbmVzdGVkKHN0cnVjdCBtdXRleCAqbG9jaywgdW5zaWduZWQgaW50IHN1YmNsYXNzKTsKICNlbHNlCiAjIGRlZmluZSBtdXRleF9sb2NrX25lc3RlZChsb2NrLCBzdWJjbGFzcykgbXV0ZXhfbG9jayhsb2NrKQorIyBkZWZpbmUgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX25lc3RlZChsb2NrLCBzdWJjbGFzcykgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGxvY2spCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXY2NDN4eC5oIGIvaW5jbHVkZS9saW51eC9tdjY0M3h4LmgKaW5kZXggZWRmYTAxMi4uYWZmMjVjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdjY0M3h4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tdjY0M3h4LmgKQEAgLTcyNCw3ICs3MjQsNyBAQAogI2RlZmluZSBNVjY0M1hYX0VUSF9SWF9GSUZPX1VSR0VOVF9USFJFU0hPTERfUkVHKHBvcnQpICAgICAgICAgICAgICgweDI0NzAgKyAocG9ydDw8MTApKQogI2RlZmluZSBNVjY0M1hYX0VUSF9UWF9GSUZPX1VSR0VOVF9USFJFU0hPTERfUkVHKHBvcnQpICAgICAgICAgICAgICgweDI0NzQgKyAocG9ydDw8MTApKQogI2RlZmluZSBNVjY0M1hYX0VUSF9SWF9NSU5JTUFMX0ZSQU1FX1NJWkVfUkVHKHBvcnQpICAgICAgICAgICAgICAgICgweDI0N2MgKyAocG9ydDw8MTApKQotI2RlZmluZSBNVjY0M1hYX0VUSF9SWF9ESVNDQVJERURfRlJBTUVTX0NPVU5URVIocG9ydCkgICAgICAgICAgICAgICgweDI0ODQgKyAocG9ydDw8MTApCisjZGVmaW5lIE1WNjQzWFhfRVRIX1JYX0RJU0NBUkRFRF9GUkFNRVNfQ09VTlRFUihwb3J0KSAgICAgICAgICAgICAgKDB4MjQ4NCArIChwb3J0PDwxMCkpCiAjZGVmaW5lIE1WNjQzWFhfRVRIX1BPUlRfREVCVUdfMF9SRUcocG9ydCkgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjQ4YyArIChwb3J0PDwxMCkpCiAjZGVmaW5lIE1WNjQzWFhfRVRIX1BPUlRfREVCVUdfMV9SRUcocG9ydCkgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjQ5MCArIChwb3J0PDwxMCkpCiAjZGVmaW5lIE1WNjQzWFhfRVRIX1BPUlRfSU5URVJOQUxfQUREUl9FUlJPUl9SRUcocG9ydCkgICAgICAgICAgICAgKDB4MjQ5NCArIChwb3J0PDwxMCkpCkBAIC0xMTM1LDcgKzExMzUsNyBAQAogI2RlZmluZSBNVjY0M1hYX0VUSF9ERUZBVUxUX1JYX1VEUF9RVUVVRV8xCSgxPDwxOSkKICNkZWZpbmUgTVY2NDNYWF9FVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfMgkoMTw8MjApCiAjZGVmaW5lIE1WNjQzWFhfRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzMJKCgxPDwyMCkgfCAoMTw8MTkpKQotI2RlZmluZSBNVjY0M1hYX0VUSF9ERUZBVUxUX1JYX1VEUF9RVUVVRV80CSgoMTw8MjEpCisjZGVmaW5lIE1WNjQzWFhfRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzQJKDE8PDIxKQogI2RlZmluZSBNVjY0M1hYX0VUSF9ERUZBVUxUX1JYX1VEUF9RVUVVRV81CSgoMTw8MjEpIHwgKDE8PDE5KSkKICNkZWZpbmUgTVY2NDNYWF9FVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNgkoKDE8PDIxKSB8ICgxPDwyMCkpCiAjZGVmaW5lIE1WNjQzWFhfRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzcJKCgxPDwyMSkgfCAoMTw8MjApIHwgKDE8PDE5KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbl9yMzk2NC5oIGIvaW5jbHVkZS9saW51eC9uX3IzOTY0LmgKaW5kZXggZGI0ZjM3Ny4uZGUyNGFmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uX3IzOTY0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uX3IzOTY0LmgKQEAgLTExNiw3ICsxMTYsNyBAQAogCiBzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gewogCXNwaW5sb2NrX3QgICAgIGxvY2s7Ci0JcGlkX3QgICAgICAgICAgcGlkOworCXN0cnVjdCBwaWQgICAgKnBpZDsKIAl1bnNpZ25lZCBpbnQgICBzaWdfZmxhZ3M7CiAKIAlzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKm5leHQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25hbWVpLmggYi9pbmNsdWRlL2xpbnV4L25hbWVpLmgKaW5kZXggZjVmMTk2MC4uZDM5YTVhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uYW1laS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmFtZWkuaApAQCAtMjksNiArMjksMTEgQEAKIAl9IGludGVudDsKIH07CiAKK3N0cnVjdCBwYXRoIHsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Cit9OworCiAvKgogICogVHlwZSBvZiB0aGUgbGFzdCBjb21wb25lbnQgb24gTE9PS1VQX1BBUkVOVAogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9uYW1lc3BhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzNzAwOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25hbWVzcGFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotI2lmbmRlZiBfTkFNRVNQQUNFX0hfCi0jZGVmaW5lIF9OQU1FU1BBQ0VfSF8KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgotCi1zdHJ1Y3QgbmFtZXNwYWNlIHsKLQlhdG9taWNfdAkJY291bnQ7Ci0Jc3RydWN0IHZmc21vdW50ICoJcm9vdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcG9sbDsKLQlpbnQgZXZlbnQ7Ci19OwotCi1leHRlcm4gaW50IGNvcHlfbmFtZXNwYWNlKGludCwgc3RydWN0IHRhc2tfc3RydWN0ICopOwotZXh0ZXJuIHZvaWQgX19wdXRfbmFtZXNwYWNlKHN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZSk7Ci1leHRlcm4gc3RydWN0IG5hbWVzcGFjZSAqZHVwX25hbWVzcGFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgc3RydWN0IGZzX3N0cnVjdCAqKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHB1dF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlKQotewotCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZuYW1lc3BhY2UtPmNvdW50LCAmdmZzbW91bnRfbG9jaykpCi0JCS8qIHJlbGVhc2VzIHZmc21vdW50X2xvY2sgKi8KLQkJX19wdXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBleGl0X25hbWVzcGFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlID0gcC0+bnNwcm94eS0+bmFtZXNwYWNlOwotCWlmIChuYW1lc3BhY2UpIHsKLQkJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGdldF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlKQotewotCWF0b21pY19pbmMoJm5hbWVzcGFjZS0+Y291bnQpOwotfQotCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYmQuaCBiL2luY2x1ZGUvbGludXgvbmJkLmgKaW5kZXggZDZiNmRjMC4uMGYzZTY5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25iZC5oCkBAIC02NCw2ICs2NCw3IEBACiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAJaW50IGJsa3NpemU7CiAJdTY0IGJ5dGVzaXplOworCXBpZF90IHBpZDsgLyogcGlkIG9mIG5iZC1jbGllbnQsIGlmIGF0dGFjaGVkICovCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmNwX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L25jcF9mc19zYi5oCmluZGV4IGIwODlkOTUuLmE1MDMwNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmNwX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9uY3BfZnNfc2IuaApAQCAtMTI3LDEwICsxMjcsMTAgQEAKIAl9IHVuZXhwZWN0ZWRfcGFja2V0OwogfTsKIAotZXh0ZXJuIHZvaWQgbmNwX3RjcF9yY3ZfcHJvYyh2b2lkICpzZXJ2ZXIpOwotZXh0ZXJuIHZvaWQgbmNwX3RjcF90eF9wcm9jKHZvaWQgKnNlcnZlcik7Ci1leHRlcm4gdm9pZCBuY3BkZ3JhbV9yY3ZfcHJvYyh2b2lkICpzZXJ2ZXIpOwotZXh0ZXJuIHZvaWQgbmNwZGdyYW1fdGltZW91dF9wcm9jKHZvaWQgKnNlcnZlcik7CitleHRlcm4gdm9pZCBuY3BfdGNwX3Jjdl9wcm9jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gdm9pZCBuY3BfdGNwX3R4X3Byb2Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiB2b2lkIG5jcGRncmFtX3Jjdl9wcm9jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gdm9pZCBuY3BkZ3JhbV90aW1lb3V0X3Byb2Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIGV4dGVybiB2b2lkIG5jcGRncmFtX3RpbWVvdXRfY2FsbCh1bnNpZ25lZCBsb25nIHNlcnZlcik7CiBleHRlcm4gdm9pZCBuY3BfdGNwX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sqIHNrLCBpbnQgbGVuKTsKIGV4dGVybiB2b2lkIG5jcF90Y3Bfd3JpdGVfc3BhY2Uoc3RydWN0IHNvY2sqIHNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmNwX21vdW50LmggYi9pbmNsdWRlL2xpbnV4L25jcF9tb3VudC5oCmluZGV4IGY0NmJkZGMuLmEyYjU0OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmNwX21vdW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9uY3BfbW91bnQuaApAQCAtNzUsNyArNzUsNyBAQAogCXVuc2lnbmVkIGludAkgaW50X2ZsYWdzOwkvKiBpbnRlcm5hbCBmbGFncyAqLwogI2RlZmluZSBOQ1BfSU1PVU5UX0xPR0dFRElOX1BPU1NJQkxFCTB4MDAwMQogCV9fa2VybmVsX3VpZDMyX3QgbW91bnRlZF91aWQ7CS8qIFdobyBtYXkgdW1vdW50KCkgdGhpcyBmaWxlc3lzdGVtPyAqLwotCV9fa2VybmVsX3BpZF90ICAgd2RvZ19waWQ7CQkvKiBXaG8gY2FyZXMgZm9yIG91ciB3YXRjaGRvZyBwYWNrZXRzPyAqLworCXN0cnVjdCBwaWQgICAgICAqd2RvZ19waWQ7CS8qIFdobyBjYXJlcyBmb3Igb3VyIHdhdGNoZG9nIHBhY2tldHM/ICovCiAJdW5zaWduZWQgaW50ICAgICBuY3BfZmQ7CS8qIFRoZSBzb2NrZXQgdG8gdGhlIG5jcCBwb3J0ICovCiAJdW5zaWduZWQgaW50ICAgICB0aW1lX291dDsJLyogSG93IGxvbmcgc2hvdWxkIEkgd2FpdCBhZnRlcgogCQkJCQkgICBzZW5kaW5nIGEgTkNQIHJlcXVlc3Q/ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldC5oIGIvaW5jbHVkZS9saW51eC9uZXQuaAppbmRleCBjMjU3ZjcxLi42ZjBkZmViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0LmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgX0xJTlVYX05FVF9ICiAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8YXNtL3NvY2tldC5oPgogCiBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3Q7CkBAIC0xOTMsOSArMTk0LDkgQEAKIGV4dGVybiBzdHJ1Y3Qgc29ja2V0ICpzb2NrZmRfbG9va3VwKGludCBmZCwgaW50ICplcnIpOwogI2RlZmluZQkJICAgICBzb2NrZmRfcHV0KHNvY2spIGZwdXQoc29jay0+ZmlsZSkKIGV4dGVybiBpbnQJICAgICBuZXRfcmF0ZWxpbWl0KHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmV0X3JhbmRvbSh2b2lkKTsKLWV4dGVybiB2b2lkCSAgICAgbmV0X3NyYW5kb20odW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZAkgICAgIG5ldF9yYW5kb21faW5pdCh2b2lkKTsKKworI2RlZmluZSBuZXRfcmFuZG9tKCkJCXJhbmRvbTMyKCkKKyNkZWZpbmUgbmV0X3NyYW5kb20oc2VlZCkJc3JhbmRvbTMyKChfX2ZvcmNlIHUzMilzZWVkKQogCiBleHRlcm4gaW50ICAgCSAgICAga2VybmVsX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAogCQkJCSAgICBzdHJ1Y3Qga3ZlYyAqdmVjLCBzaXplX3QgbnVtLCBzaXplX3QgbGVuKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IDkyNjQxMzkuLjZiZTc2N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgogCiAjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTM4LDcgKzM5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KIAotc3RydWN0IGRpdmVydF9ibGs7CiBzdHJ1Y3Qgdmxhbl9ncm91cDsKIHN0cnVjdCBldGh0b29sX29wczsKIHN0cnVjdCBuZXRwb2xsX2luZm87CkBAIC02Nyw2ICs2NywxMCBAQAogI2RlZmluZSBORVRfUlhfQ05fSElHSAkJNCAgIC8qIFRoZSBzdG9ybSBpcyBoZXJlICovCiAjZGVmaW5lIE5FVF9SWF9CQUQJCTUgIC8qIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBrZXJuZWwgZXJyb3IgKi8KIAorLyogTkVUX1hNSVRfQ04gaXMgc3BlY2lhbC4gSXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhpcyBwYWNrZXQgaXMgbG9zdC4gSXQKKyAqIGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2Ugd2lsbCBzb29uIGJlIGRyb3BwaW5nIHBhY2tldHMsIG9yIGFscmVhZHkgZHJvcHMKKyAqIHNvbWUgcGFja2V0cyBvZiB0aGUgc2FtZSBwcmlvcml0eTsgcHJvbXB0aW5nIHVzIHRvIHNlbmQgbGVzcyBhZ2dyZXNzaXZlbHkuICovCisjZGVmaW5lIG5ldF94bWl0X2V2YWwoZSkJKChlKSA9PSBORVRfWE1JVF9DTj8gMCA6IChlKSkKICNkZWZpbmUgbmV0X3htaXRfZXJybm8oZSkJKChlKSAhPSBORVRfWE1JVF9DTiA/IC1FTk9CVUZTIDogMCkKIAogI2VuZGlmCkBAIC05Myw4ICs5NywxMCBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmICFkZWZpbmVkKENPTkZJR19ORVRfSVBJUCkgJiYgXAotICAgICFkZWZpbmVkKENPTkZJR19JUFY2KSAmJiAhZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgIWRlZmluZWQoQ09ORklHX05FVF9JUElQKSAmJiAhZGVmaW5lZChDT05GSUdfTkVUX0lQSVBfTU9EVUxFKSAmJiBcCisgICAgIWRlZmluZWQoQ09ORklHX05FVF9JUEdSRSkgJiYgICFkZWZpbmVkKENPTkZJR19ORVRfSVBHUkVfTU9EVUxFKSAmJiBcCisgICAgIWRlZmluZWQoQ09ORklHX0lQVjZfU0lUKSAmJiAhZGVmaW5lZChDT05GSUdfSVBWNl9TSVRfTU9EVUxFKSAmJiBcCisgICAgIWRlZmluZWQoQ09ORklHX0lQVjZfVFVOTkVMKSAmJiAhZGVmaW5lZChDT05GSUdfSVBWNl9UVU5ORUxfTU9EVUxFKQogI2RlZmluZSBNQVhfSEVBREVSIExMX01BWF9IRUFERVIKICNlbHNlCiAjZGVmaW5lIE1BWF9IRUFERVIgKExMX01BWF9IRUFERVIgKyA0OCkKQEAgLTE4NywxMyArMTkzLDIwIEBACiB7CiAJc3RydWN0IGhoX2NhY2hlICpoaF9uZXh0OwkvKiBOZXh0IGVudHJ5CQkJICAgICAqLwogCWF0b21pY190CWhoX3JlZmNudDsJLyogbnVtYmVyIG9mIHVzZXJzICAgICAgICAgICAgICAgICAgICovCi0JX19iZTE2CQloaF90eXBlOwkvKiBwcm90b2NvbCBpZGVudGlmaWVyLCBmLmUgRVRIX1BfSVAKKy8qCisgKiBXZSB3YW50IGhoX291dHB1dCwgaGhfbGVuLCBoaF9sb2NrIGFuZCBoaF9kYXRhIGJlIGEgaW4gYSBzZXBhcmF0ZQorICogY2FjaGUgbGluZSBvbiBTTVAuCisgKiBUaGV5IGFyZSBtb3N0bHkgcmVhZCwgYnV0IGhoX3JlZmNudCBtYXkgYmUgY2hhbmdlZCBxdWl0ZSBmcmVxdWVudGx5LAorICogaW5jdXJyaW5nIGNhY2hlIGxpbmUgcGluZyBwb25ncy4KKyAqLworCV9fYmUxNgkJaGhfdHlwZSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCQkJCQkvKiBwcm90b2NvbCBpZGVudGlmaWVyLCBmLmUgRVRIX1BfSVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgTk9URTogIEZvciBWTEFOcywgdGhpcyB3aWxsIGJlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBlbmNhcHVzbGF0ZWQgdHlwZS4gLS1CTEcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpbnQJCWhoX2xlbjsJCS8qIGxlbmd0aCBvZiBoZWFkZXIgKi8KKwl1MTYJCWhoX2xlbjsJCS8qIGxlbmd0aCBvZiBoZWFkZXIgKi8KIAlpbnQJCSgqaGhfb3V0cHV0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQlyd2xvY2tfdAloaF9sb2NrOworCXNlcWxvY2tfdAloaF9sb2NrOwogCiAJLyogY2FjaGVkIGhhcmR3YXJlIGhlYWRlcjsgYWxsb3cgZm9yIG1hY2hpbmUgYWxpZ25tZW50IG5lZWRzLiAgICAgICAgKi8KICNkZWZpbmUgSEhfREFUQV9NT0QJMTYKQEAgLTUxNSwxMSArNTI4LDYgQEAKIAkvKiBicmlkZ2Ugc3R1ZmYgKi8KIAlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0CSpicl9wb3J0OwogCi0jaWZkZWYgQ09ORklHX05FVF9ESVZFUlQKLQkvKiB0aGlzIHdpbGwgZ2V0IGluaXRpYWxpemVkIGF0IGVhY2ggaW50ZXJmYWNlIHR5cGUgaW5pdCByb3V0aW5lICovCi0Jc3RydWN0IGRpdmVydF9ibGsJKmRpdmVydDsKLSNlbmRpZiAvKiBDT05GSUdfTkVUX0RJVkVSVCAqLwotCiAJLyogY2xhc3MvbmV0L25hbWUgZW50cnkgKi8KIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlCWNsYXNzX2RldjsKIAkvKiBzcGFjZSBmb3Igb3B0aW9uYWwgc3RhdGlzdGljcyBhbmQgd2lyZWxlc3Mgc3lzZnMgZ3JvdXBzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaAppbmRleCBiN2U2N2QxLi5kNGM0YzUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKQEAgLTExNyw2ICsxMTcsMTYgQEAKIGludCBuZl9yZWdpc3Rlcl9zb2Nrb3B0KHN0cnVjdCBuZl9zb2Nrb3B0X29wcyAqcmVnKTsKIHZvaWQgbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KHN0cnVjdCBuZl9zb2Nrb3B0X29wcyAqcmVnKTsKIAorI2lmZGVmIENPTkZJR19TWVNDVEwKKy8qIFN5c2N0bCByZWdpc3RyYXRpb24gKi8KK3N0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpuZl9yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3RydWN0IGN0bF90YWJsZSAqcGF0aCwKKwkJCQkJCSAgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpOwordm9pZCBuZl91bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkJCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKTsKK2V4dGVybiBzdHJ1Y3QgY3RsX3RhYmxlIG5mX25ldF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGhbXTsKK2V4dGVybiBzdHJ1Y3QgY3RsX3RhYmxlIG5mX25ldF9pcHY0X25ldGZpbHRlcl9zeXNjdGxfcGF0aFtdOworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgbmZfaG9va3NbTlBST1RPXVtORl9NQVhfSE9PS1NdOwogCiAvKiB0aG9zZSBORl9MT0dfKiBkZWZpbmVzIGFuZCBzdHJ1Y3QgbmZfbG9naW5mbyBhcmUgbGVnYWN5IGRlZmluaXRpb3MgdGhhdCB3aWxsCkBAIC0yODIsMTUgKzI5MiwzMSBAQAogICAgUmV0dXJucyB0cnVlIG9yIGZhbHNlLiAqLwogZXh0ZXJuIGludCBza2JfbWFrZV93cml0YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCB3cml0YWJsZV9sZW4pOwogCi1leHRlcm4gdV9pbnQxNl90IG5mX2NzdW1fdXBkYXRlKHVfaW50MzJfdCBvbGR2YWwsIHVfaW50MzJfdCBuZXd2YWwsCi0JCQkJdV9pbnQzMl90IGNzdW0pOwotZXh0ZXJuIHVfaW50MTZfdCBuZl9wcm90b19jc3VtX3VwZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgIHVfaW50MzJfdCBvbGR2YWwsIHVfaW50MzJfdCBuZXd2YWwsCi0JCQkJICAgICAgdV9pbnQxNl90IGNzdW0sIGludCBwc2V1ZG9oZHIpOworc3RhdGljIGlubGluZSB2b2lkIG5mX2NzdW1fcmVwbGFjZTQoX19zdW0xNiAqc3VtLCBfX2JlMzIgZnJvbSwgX19iZTMyIHRvKQoreworCV9fYmUzMiBkaWZmW10gPSB7IH5mcm9tLCB0byB9OworCisJKnN1bSA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoKGNoYXIgKilkaWZmLCBzaXplb2YoZGlmZiksIH5jc3VtX3VuZm9sZCgqc3VtKSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmZfY3N1bV9yZXBsYWNlMihfX3N1bTE2ICpzdW0sIF9fYmUxNiBmcm9tLCBfX2JlMTYgdG8pCit7CisJbmZfY3N1bV9yZXBsYWNlNChzdW0sIChfX2ZvcmNlIF9fYmUzMilmcm9tLCAoX19mb3JjZSBfX2JlMzIpdG8pOworfQorCitleHRlcm4gdm9pZCBuZl9wcm90b19jc3VtX3JlcGxhY2U0KF9fc3VtMTYgKnN1bSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICBfX2JlMzIgZnJvbSwgX19iZTMyIHRvLCBpbnQgcHNldWRvaGRyKTsKKworc3RhdGljIGlubGluZSB2b2lkIG5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoX19zdW0xNiAqc3VtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIF9fYmUxNiBmcm9tLCBfX2JlMTYgdG8sIGludCBwc2V1ZG9oZHIpCit7CisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNChzdW0sIHNrYiwgKF9fZm9yY2UgX19iZTMyKWZyb20sCisJCQkJKF9fZm9yY2UgX19iZTMyKXRvLCBwc2V1ZG9oZHIpOworfQogCiBzdHJ1Y3QgbmZfYWZpbmZvIHsKIAl1bnNpZ25lZCBzaG9ydAlmYW1pbHk7Ci0JdW5zaWduZWQgaW50CSgqY2hlY2tzdW0pKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rLAorCV9fc3VtMTYJCSgqY2hlY2tzdW0pKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwgdV9pbnQ4X3QgcHJvdG9jb2wpOwogCXZvaWQJCSgqc2F2ZXJvdXRlKShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgc3RydWN0IG5mX2luZm8gKmluZm8pOwpAQCAtMzA1LDEyICszMzEsMTIgQEAKIAlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlKG5mX2FmaW5mb1tmYW1pbHldKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK3N0YXRpYyBpbmxpbmUgX19zdW0xNgogbmZfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCSAgICB1X2ludDhfdCBwcm90b2NvbCwgdW5zaWduZWQgc2hvcnQgZmFtaWx5KQogewogCXN0cnVjdCBuZl9hZmluZm8gKmFmaW5mbzsKLQl1bnNpZ25lZCBpbnQgY3N1bSA9IDA7CisJX19zdW0xNiBjc3VtID0gMDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlhZmluZm8gPSBuZl9nZXRfYWZpbmZvKGZhbWlseSk7CkBAIC0zMzEsNyArMzU3LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZfbmF0X2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmbG93aSAqZmwsIGludCBmYW1pbHkpCiB7Ci0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKKyNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9OQVRfTkVFREVEKSB8fCBkZWZpbmVkKENPTkZJR19ORl9OQVRfTkVFREVEKQogCXZvaWQgKCpkZWNvZGVmbikoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IGZsb3dpICopOwogCiAJaWYgKGZhbWlseSA9PSBBRl9JTkVUICYmIChkZWNvZGVmbiA9IGlwX25hdF9kZWNvZGVfc2Vzc2lvbikgIT0gTlVMTCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZAppbmRleCAzMTJiZDJmLi42MzI4MTc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCkBAIC0xNCw2ICsxNCw3IEBACiBoZWFkZXIteSArPSB4dF9EU0NQLmgKIGhlYWRlci15ICs9IHh0X2VzcC5oCiBoZWFkZXIteSArPSB4dF9oZWxwZXIuaAoraGVhZGVyLXkgKz0geHRfaGFzaGxpbWl0LmgKIGhlYWRlci15ICs9IHh0X2xlbmd0aC5oCiBoZWFkZXIteSArPSB4dF9saW1pdC5oCiBoZWFkZXIteSArPSB4dF9tYWMuaApAQCAtMjEsNiArMjIsNyBAQAogaGVhZGVyLXkgKz0geHRfTUFSSy5oCiBoZWFkZXIteSArPSB4dF9tdWx0aXBvcnQuaAogaGVhZGVyLXkgKz0geHRfTkZRVUVVRS5oCitoZWFkZXIteSArPSB4dF9ORkxPRy5oCiBoZWFkZXIteSArPSB4dF9wa3R0eXBlLmgKIGhlYWRlci15ICs9IHh0X3BvbGljeS5oCiBoZWFkZXIteSArPSB4dF9yZWFsbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfYW1hbmRhLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfYW1hbmRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjMjIzNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hbWFuZGEuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfQU1BTkRBX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19BTUFOREFfSAorLyogQU1BTkRBIHRyYWNraW5nLiAqLworCitleHRlcm4gdW5zaWduZWQgaW50ICgqbmZfbmF0X2FtYW5kYV9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJCSAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAorCQkJCQkgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0FNQU5EQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmgKaW5kZXggYWQ0YTQxYy4uODE0NTNlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuaApAQCAtMywxNiArMywxNiBAQAogLyogRlRQIHRyYWNraW5nLiAqLwogCiAvKiBUaGlzIGVudW0gaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgKi8KLWVudW0gaXBfY3RfZnRwX3R5cGUKK2VudW0gbmZfY3RfZnRwX3R5cGUKIHsKIAkvKiBQT1JUIGNvbW1hbmQgZnJvbSBjbGllbnQgKi8KLQlJUF9DVF9GVFBfUE9SVCwKKwlORl9DVF9GVFBfUE9SVCwKIAkvKiBQQVNWIHJlc3BvbnNlIGZyb20gc2VydmVyICovCi0JSVBfQ1RfRlRQX1BBU1YsCisJTkZfQ1RfRlRQX1BBU1YsCiAJLyogRVBSVCBjb21tYW5kIGZyb20gY2xpZW50ICovCi0JSVBfQ1RfRlRQX0VQUlQsCisJTkZfQ1RfRlRQX0VQUlQsCiAJLyogRVBTViByZXNwb25zZSBmcm9tIHNlcnZlciAqLwotCUlQX0NUX0ZUUF9FUFNWLAorCU5GX0NUX0ZUUF9FUFNWLAogfTsKIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTIxLDIzICsyMSwyMyBAQAogCiAjZGVmaW5lIE5VTV9TRVFfVE9fUkVNRU1CRVIgMgogLyogVGhpcyBzdHJ1Y3R1cmUgZXhpc3RzIG9ubHkgb25jZSBwZXIgbWFzdGVyICovCi1zdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciB7CitzdHJ1Y3QgbmZfY3RfZnRwX21hc3RlciB7CiAJLyogVmFsaWQgc2VxIHBvc2l0aW9ucyBmb3IgY21kIG1hdGNoaW5nIGFmdGVyIG5ld2xpbmUgKi8KIAl1X2ludDMyX3Qgc2VxX2FmdF9ubFtJUF9DVF9ESVJfTUFYXVtOVU1fU0VRX1RPX1JFTUVNQkVSXTsKIAkvKiAwIG1lYW5zIHNlcV9tYXRjaF9hZnRfbmwgbm90IHNldCAqLwogCWludCBzZXFfYWZ0X25sX251bVtJUF9DVF9ESVJfTUFYXTsKIH07CiAKLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0Oworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3Q7CiAKIC8qIEZvciBOQVQgdG8gaG9vayBpbiB3aGVuIHdlIGZpbmQgYSBwYWNrZXQgd2hpY2ggZGVzY3JpYmVzIHdoYXQgb3RoZXIKICAqIGNvbm5lY3Rpb24gd2Ugc2hvdWxkIGV4cGVjdC4gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgKCppcF9uYXRfZnRwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKK2V4dGVybiB1bnNpZ25lZCBpbnQgKCpuZl9uYXRfZnRwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKIAkJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICAgICAgIGVudW0gaXBfY3RfZnRwX3R5cGUgdHlwZSwKKwkJCQkgICAgICAgZW51bSBuZl9jdF9mdHBfdHlwZSB0eXBlLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKLQkJCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKKwkJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwKIAkJCQkgICAgICAgdTMyICpzZXEpOwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlMmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzLmgKQEAgLTAsMCArMSw5MiBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX0gzMjNfSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX0gzMjNfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX2FzbjEuaD4KKworI2RlZmluZSBSQVNfUE9SVCAxNzE5CisjZGVmaW5lIFE5MzFfUE9SVCAxNzIwCisjZGVmaW5lIEgzMjNfUlRQX0NIQU5ORUxfTUFYIDQJLyogQXVkaW8sIHZpZGVvLCBGQVggYW5kIG90aGVyICovCisKKy8qIFRoaXMgc3RydWN0dXJlIGV4aXN0cyBvbmx5IG9uY2UgcGVyIG1hc3RlciAqLworc3RydWN0IG5mX2N0X2gzMjNfbWFzdGVyIHsKKworCS8qIE9yaWdpbmFsIGFuZCBOQVRlZCBRLjkzMSBvciBILjI0NSBzaWduYWwgcG9ydHMgKi8KKwlfX2JlMTYgc2lnX3BvcnRbSVBfQ1RfRElSX01BWF07CisKKwkvKiBPcmlnaW5hbCBhbmQgTkFUZWQgUlRQIHBvcnRzICovCisJX19iZTE2IHJ0cF9wb3J0W0gzMjNfUlRQX0NIQU5ORUxfTUFYXVtJUF9DVF9ESVJfTUFYXTsKKworCXVuaW9uIHsKKwkJLyogUkFTIGNvbm5lY3Rpb24gdGltZW91dCAqLworCQl1X2ludDMyX3QgdGltZW91dDsKKworCQkvKiBOZXh0IFRQS1QgbGVuZ3RoIChmb3Igc2VwYXJhdGUgVFBLVCBoZWFkZXIgYW5kIGRhdGEpICovCisJCXVfaW50MTZfdCB0cGt0X2xlbltJUF9DVF9ESVJfTUFYXTsKKwl9OworfTsKKworc3RydWN0IG5mX2Nvbm47CisKK2V4dGVybiBpbnQgZ2V0X2gyMjVfYWRkcihzdHJ1Y3QgbmZfY29ubiAqY3QsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsIF9fYmUxNiAqcG9ydCk7CitleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfaDI0NV9leHBlY3Qoc3RydWN0IG5mX2Nvbm4gKm5ldywKKwkJCQkgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKK2V4dGVybiB2b2lkIG5mX2Nvbm50cmFja19xOTMxX2V4cGVjdChzdHJ1Y3QgbmZfY29ubiAqbmV3LAorCQkJCSAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnRoaXMpOworZXh0ZXJuIGludCAoKnNldF9oMjQ1X2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCQkgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkJICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqYWRkciwKKwkJCQkgIF9fYmUxNiBwb3J0KTsKK2V4dGVybiBpbnQgKCpzZXRfaDIyNV9hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkJICBUcmFuc3BvcnRBZGRyZXNzICp0YWRkciwKKwkJCQkgIHVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzICphZGRyLAorCQkJCSAgX19iZTE2IHBvcnQpOworZXh0ZXJuIGludCAoKnNldF9zaWdfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkJCQkgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIGludCBjb3VudCk7CitleHRlcm4gaW50ICgqc2V0X3Jhc19hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLAorCQkJCSBUcmFuc3BvcnRBZGRyZXNzICp0YWRkciwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgKCpuYXRfcnRwX3J0Y3BfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJCSBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLAorCQkJCSBfX2JlMTYgcG9ydCwgX19iZTE2IHJ0cF9wb3J0LAorCQkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqcnRwX2V4cCwKKwkJCQkgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnJ0Y3BfZXhwKTsKK2V4dGVybiBpbnQgKCpuYXRfdDEyMF9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgICAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIF9fYmUxNiBwb3J0LAorCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKK2V4dGVybiBpbnQgKCpuYXRfaDI0NV9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgICAgIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBfX2JlMTYgcG9ydCwKKwkJCSAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CitleHRlcm4gaW50ICgqbmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCQkgICAgICAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkJICAgICAgIF9fYmUxNiBwb3J0LAorCQkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKK2V4dGVybiBpbnQgKCpuYXRfcTkzMV9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkgICAgIGludCBpZHgsIF9fYmUxNiBwb3J0LAorCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfYXNuMS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfYXNuMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYWI1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19hc24xLmgKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlwX2Nvbm50cmFja19oMzIzX2FzbjEuaCAtIEJFUiBhbmQgUEVSIGRlY29kaW5nIGxpYnJhcnkgZm9yIEguMzIzCisgKiAJCQkgICAgICBjb25udHJhY2svTkFUIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgYnkgSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBiYXNlZCBvbiBILjIyNSB2ZXJzaW9uIDQsIEguMjM1IHZlcnNpb24gMiBhbmQgSC4yNDUKKyAqIHZlcnNpb24gNy4gSXQgaXMgZXh0cmVtZWx5IG9wdGltaXplZCB0byBkZWNvZGUgb25seSB0aGUgYWJzb2x1dGVseQorICogbmVjZXNzYXJ5IG9iamVjdHMgaW4gYSBzaWduYWwgZm9yIExpbnV4IGtlcm5lbCBOQVQgbW9kdWxlIHVzZSwgc28gZG9uJ3QKKyAqIGV4cGVjdCBpdCB0byBiZSBhIGZ1bGwgQVNOLjEgbGlicmFyeS4KKyAqCisgKiBGZWF0dXJlczoKKyAqCisgKiAxLiBTbWFsbC4gVGhlIHRvdGFsIHNpemUgb2YgY29kZSBwbHVzIGRhdGEgaXMgbGVzcyB0aGFuIDIwIEtCIChJQTMyKS4KKyAqIDIuIEZhc3QuIERlY29kaW5nIE5ldG1lZXRpbmcncyBTZXR1cCBzaWduYWwgMSBtaWxsaW9uIHRpbWVzIG9uIGEgUElJSSA4NjYKKyAqICAgIHRha2VzIG9ubHkgMy45IHNlY29uZHMuCisgKiAzLiBObyBtZW1vcnkgYWxsb2NhdGlvbi4gSXQgdXNlcyBhIHN0YXRpYyBvYmplY3QuIE5vIG5lZWQgdG8gaW5pdGlhbGl6ZSBvcgorICogICAgY2xlYW51cC4KKyAqIDQuIFRocmVhZCBzYWZlLgorICogNS4gU3VwcG9ydCBlbWJlZGRlZCBhcmNoaXRlY3R1cmVzIHRoYXQgaGFzIG5vIG1pc2FsaWduZWQgbWVtb3J5IGFjY2VzcworICogICAgc3VwcG9ydC4KKyAqCisgKiBMaW1pdGF0aW9uczoKKyAqCisgKiAxLiBBdCBtb3N0IDMwIGZhc3RzdGFydCBlbnRyaWVzLiBBY3R1YWxseSB0aGlzIGlzIGxpbWl0ZWQgYnkgZXRoZXJuZXQncyBNVFUuCisgKiAgICBJZiBhIFNldHVwIHNpZ25hbCBjb250YWlucyBtb3JlIHRoYW4gMzAgZmFzdHN0YXJ0LCB0aGUgcGFja2V0IHNpemUgd2lsbAorICogICAgdmVyeSBsaWtlbHkgZXhjZWVkIHRoZSBNVFUgc2l6ZSwgdGhlbiB0aGUgVFBLVCB3aWxsIGJlIGZyYWdtZW50ZWQuIEkKKyAqICAgIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzIGluIGEgTmV0ZmlsdGVyIG1vZHVsZS4gQW55Ym9keSBjYW4gaGVscD8KKyAqICAgIEFsdGhvdWdoIEkgdGhpbmsgMzAgaXMgZW5vdWdoIGZvciBtb3N0IG9mIHRoZSBjYXNlcy4KKyAqIDIuIElQdjQgYWRkcmVzc2VzIG9ubHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19IRUxQRVJfSDMyM19BU04xX0hfCisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfSEVMUEVSX0gzMjNfQVNOMV9IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEguMzIzIFR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJuZl9jb25udHJhY2tfaDMyM190eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisJZW51bSB7CisJCVE5MzFfTmF0aW9uYWxFc2NhcGUgPSAweDAwLAorCQlROTMxX0FsZXJ0aW5nID0gMHgwMSwKKwkJUTkzMV9DYWxsUHJvY2VlZGluZyA9IDB4MDIsCisJCVE5MzFfQ29ubmVjdCA9IDB4MDcsCisJCVE5MzFfQ29ubmVjdEFjayA9IDB4MEYsCisJCVE5MzFfUHJvZ3Jlc3MgPSAweDAzLAorCQlROTMxX1NldHVwID0gMHgwNSwKKwkJUTkzMV9TZXR1cEFjayA9IDB4MEQsCisJCVE5MzFfUmVzdW1lID0gMHgyNiwKKwkJUTkzMV9SZXN1bWVBY2sgPSAweDJFLAorCQlROTMxX1Jlc3VtZVJlamVjdCA9IDB4MjIsCisJCVE5MzFfU3VzcGVuZCA9IDB4MjUsCisJCVE5MzFfU3VzcGVuZEFjayA9IDB4MkQsCisJCVE5MzFfU3VzcGVuZFJlamVjdCA9IDB4MjEsCisJCVE5MzFfVXNlckluZm9ybWF0aW9uID0gMHgyMCwKKwkJUTkzMV9EaXNjb25uZWN0ID0gMHg0NSwKKwkJUTkzMV9SZWxlYXNlID0gMHg0RCwKKwkJUTkzMV9SZWxlYXNlQ29tcGxldGUgPSAweDVBLAorCQlROTMxX1Jlc3RhcnQgPSAweDQ2LAorCQlROTMxX1Jlc3RhcnRBY2sgPSAweDRFLAorCQlROTMxX1NlZ21lbnQgPSAweDYwLAorCQlROTMxX0Nvbmdlc3Rpb25DdHJsID0gMHg3OSwKKwkJUTkzMV9JbmZvcm1hdGlvbiA9IDB4N0IsCisJCVE5MzFfTm90aWZ5ID0gMHg2RSwKKwkJUTkzMV9TdGF0dXMgPSAweDdELAorCQlROTMxX1N0YXR1c0VucXVpcnkgPSAweDc1LAorCQlROTMxX0ZhY2lsaXR5ID0gMHg2MgorCX0gTWVzc2FnZVR5cGU7CisJSDMyM19Vc2VySW5mb3JtYXRpb24gVVVJRTsKK30gUTkzMTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWNvZGUgRnVuY3Rpb25zIFJldHVybiBDb2RlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSDMyM19FUlJPUl9OT05FIDAJLyogRGVjb2RlZCBzdWNjZXNzZnVsbHkgKi8KKyNkZWZpbmUgSDMyM19FUlJPUl9TVE9QIDEJLyogRGVjb2Rpbmcgc3RvcHBlZCwgbm90IHJlYWxseSBhbiBlcnJvciAqLworI2RlZmluZSBIMzIzX0VSUk9SX0JPVU5EIC0xCisjZGVmaW5lIEgzMjNfRVJST1JfUkFOR0UgLTIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlY29kZSBGdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgRGVjb2RlUmFzTWVzc2FnZSh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBzeiwgUmFzTWVzc2FnZSAqIHJhcyk7CitpbnQgRGVjb2RlUTkzMSh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBzeiwgUTkzMSAqIHE5MzEpOworaW50IERlY29kZU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBzeiwKKwkJCQkJIE11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSAqCisJCQkJCSBtc2NtKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM190eXBlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ3NGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfdHlwZXMuaApAQCAtMCwwICsxLDk1MSBAQAorLyogR2VuZXJhdGVkIGJ5IEppbmcgTWluIFpoYW8ncyBBU04uMSBwYXJzZXIsIEFwciAyMCAyMDA2CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEppbmcgTWluIFpoYW8gPHpoYW9qaW5nbWluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICovCisKK3R5cGVkZWYgc3RydWN0IFRyYW5zcG9ydEFkZHJlc3NfaXBBZGRyZXNzIHsJLyogU0VRVUVOQ0UgKi8KKwlpbnQgb3B0aW9uczsJCS8qIE5vIHVzZSAqLworCXVuc2lnbmVkIGlwOworfSBUcmFuc3BvcnRBZGRyZXNzX2lwQWRkcmVzczsKKwordHlwZWRlZiBzdHJ1Y3QgVHJhbnNwb3J0QWRkcmVzc19pcDZBZGRyZXNzIHsJLyogU0VRVUVOQ0UgKi8KKwlpbnQgb3B0aW9uczsJCS8qIE5vIHVzZSAqLworCXVuc2lnbmVkIGlwNjsKK30gVHJhbnNwb3J0QWRkcmVzc19pcDZBZGRyZXNzOworCit0eXBlZGVmIHN0cnVjdCBUcmFuc3BvcnRBZGRyZXNzIHsJLyogQ0hPSUNFICovCisJZW51bSB7CisJCWVUcmFuc3BvcnRBZGRyZXNzX2lwQWRkcmVzcywKKwkJZVRyYW5zcG9ydEFkZHJlc3NfaXBTb3VyY2VSb3V0ZSwKKwkJZVRyYW5zcG9ydEFkZHJlc3NfaXB4QWRkcmVzcywKKwkJZVRyYW5zcG9ydEFkZHJlc3NfaXA2QWRkcmVzcywKKwkJZVRyYW5zcG9ydEFkZHJlc3NfbmV0QmlvcywKKwkJZVRyYW5zcG9ydEFkZHJlc3NfbnNhcCwKKwkJZVRyYW5zcG9ydEFkZHJlc3Nfbm9uU3RhbmRhcmRBZGRyZXNzLAorCX0gY2hvaWNlOworCXVuaW9uIHsKKwkJVHJhbnNwb3J0QWRkcmVzc19pcEFkZHJlc3MgaXBBZGRyZXNzOworCQlUcmFuc3BvcnRBZGRyZXNzX2lwNkFkZHJlc3MgaXA2QWRkcmVzczsKKwl9OworfSBUcmFuc3BvcnRBZGRyZXNzOworCit0eXBlZGVmIHN0cnVjdCBEYXRhUHJvdG9jb2xDYXBhYmlsaXR5IHsJLyogQ0hPSUNFICovCisJZW51bSB7CisJCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X25vblN0YW5kYXJkLAorCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV92MTRidWZmZXJlZCwKKwkJZURhdGFQcm90b2NvbENhcGFiaWxpdHlfdjQybGFwbSwKKwkJZURhdGFQcm90b2NvbENhcGFiaWxpdHlfaGRsY0ZyYW1lVHVubmVsbGluZywKKwkJZURhdGFQcm90b2NvbENhcGFiaWxpdHlfaDMxMFNlcGFyYXRlVkNTdGFjaywKKwkJZURhdGFQcm90b2NvbENhcGFiaWxpdHlfaDMxMFNpbmdsZVZDU3RhY2ssCisJCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3RyYW5zcGFyZW50LAorCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV9zZWdtZW50YXRpb25BbmRSZWFzc2VtYmx5LAorCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV9oZGxjRnJhbWVUdW5uZWxpbmd3U0FSLAorCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV92MTIwLAorCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV9zZXBhcmF0ZUxBTlN0YWNrLAorCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV92NzZ3Q29tcHJlc3Npb24sCisJCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3RjcCwKKwkJZURhdGFQcm90b2NvbENhcGFiaWxpdHlfdWRwLAorCX0gY2hvaWNlOworfSBEYXRhUHJvdG9jb2xDYXBhYmlsaXR5OworCit0eXBlZGVmIHN0cnVjdCBEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uIHsJLyogQ0hPSUNFICovCisJZW51bSB7CisJCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX25vblN0YW5kYXJkLAorCQllRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90MTIwLAorCQllRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl9kc21fY2MsCisJCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX3VzZXJEYXRhLAorCQllRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90ODQsCisJCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX3Q0MzQsCisJCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX2gyMjQsCisJCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX25scGlkLAorCQllRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl9kc3ZkQ29udHJvbCwKKwkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25faDIyMkRhdGFQYXJ0aXRpb25pbmcsCisJCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX3QzMGZheCwKKwkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fdDE0MCwKKwkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fdDM4ZmF4LAorCQllRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl9nZW5lcmljRGF0YUNhcGFiaWxpdHksCisJfSBjaG9pY2U7CisJdW5pb24geworCQlEYXRhUHJvdG9jb2xDYXBhYmlsaXR5IHQxMjA7CisJfTsKK30gRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eSB7CS8qIFNFUVVFTkNFICovCisJaW50IG9wdGlvbnM7CQkvKiBObyB1c2UgKi8KKwlEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworfSBEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5OworCit0eXBlZGVmIHN0cnVjdCBEYXRhVHlwZSB7CS8qIENIT0lDRSAqLworCWVudW0geworCQllRGF0YVR5cGVfbm9uU3RhbmRhcmQsCisJCWVEYXRhVHlwZV9udWxsRGF0YSwKKwkJZURhdGFUeXBlX3ZpZGVvRGF0YSwKKwkJZURhdGFUeXBlX2F1ZGlvRGF0YSwKKwkJZURhdGFUeXBlX2RhdGEsCisJCWVEYXRhVHlwZV9lbmNyeXB0aW9uRGF0YSwKKwkJZURhdGFUeXBlX2gyMzVDb250cm9sLAorCQllRGF0YVR5cGVfaDIzNU1lZGlhLAorCQllRGF0YVR5cGVfbXVsdGlwbGV4ZWRTdHJlYW0sCisJfSBjaG9pY2U7CisJdW5pb24geworCQlEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5IGRhdGE7CisJfTsKK30gRGF0YVR5cGU7CisKK3R5cGVkZWYgc3RydWN0IFVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzcyB7CS8qIFNFUVVFTkNFICovCisJaW50IG9wdGlvbnM7CQkvKiBObyB1c2UgKi8KKwl1bnNpZ25lZCBuZXR3b3JrOworfSBVbmljYXN0QWRkcmVzc19pUEFkZHJlc3M7CisKK3R5cGVkZWYgc3RydWN0IFVuaWNhc3RBZGRyZXNzX2lQNkFkZHJlc3MgewkvKiBTRVFVRU5DRSAqLworCWludCBvcHRpb25zOwkJLyogTm8gdXNlICovCisJdW5zaWduZWQgbmV0d29yazsKK30gVW5pY2FzdEFkZHJlc3NfaVA2QWRkcmVzczsKKwordHlwZWRlZiBzdHJ1Y3QgVW5pY2FzdEFkZHJlc3MgewkvKiBDSE9JQ0UgKi8KKwllbnVtIHsKKwkJZVVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzcywKKwkJZVVuaWNhc3RBZGRyZXNzX2lQWEFkZHJlc3MsCisJCWVVbmljYXN0QWRkcmVzc19pUDZBZGRyZXNzLAorCQllVW5pY2FzdEFkZHJlc3NfbmV0QmlvcywKKwkJZVVuaWNhc3RBZGRyZXNzX2lQU291cmNlUm91dGVBZGRyZXNzLAorCQllVW5pY2FzdEFkZHJlc3NfbnNhcCwKKwkJZVVuaWNhc3RBZGRyZXNzX25vblN0YW5kYXJkQWRkcmVzcywKKwl9IGNob2ljZTsKKwl1bmlvbiB7CisJCVVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzcyBpUEFkZHJlc3M7CisJCVVuaWNhc3RBZGRyZXNzX2lQNkFkZHJlc3MgaVA2QWRkcmVzczsKKwl9OworfSBVbmljYXN0QWRkcmVzczsKKwordHlwZWRlZiBzdHJ1Y3QgSDI0NV9UcmFuc3BvcnRBZGRyZXNzIHsJLyogQ0hPSUNFICovCisJZW51bSB7CisJCWVIMjQ1X1RyYW5zcG9ydEFkZHJlc3NfdW5pY2FzdEFkZHJlc3MsCisJCWVIMjQ1X1RyYW5zcG9ydEFkZHJlc3NfbXVsdGljYXN0QWRkcmVzcywKKwl9IGNob2ljZTsKKwl1bmlvbiB7CisJCVVuaWNhc3RBZGRyZXNzIHVuaWNhc3RBZGRyZXNzOworCX07Cit9IEgyNDVfVHJhbnNwb3J0QWRkcmVzczsKKwordHlwZWRlZiBzdHJ1Y3QgSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbm9uU3RhbmRhcmQgPSAoMSA8PCAzMSksCisJCWVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19hc3NvY2lhdGVkU2Vzc2lvbklEID0KKwkJICAgICgxIDw8IDMwKSwKKwkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21lZGlhQ2hhbm5lbCA9ICgxIDw8IDI5KSwKKwkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21lZGlhR3VhcmFudGVlZERlbGl2ZXJ5ID0KKwkJICAgICgxIDw8IDI4KSwKKwkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21lZGlhQ29udHJvbENoYW5uZWwgPQorCQkgICAgKDEgPDwgMjcpLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbWVkaWFDb250cm9sR3VhcmFudGVlZERlbGl2ZXJ5CisJCSAgICA9ICgxIDw8IDI2KSwKKwkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX3NpbGVuY2VTdXBwcmVzc2lvbiA9ICgxIDw8IDI1KSwKKwkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX2Rlc3RpbmF0aW9uID0gKDEgPDwgMjQpLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfZHluYW1pY1JUUFBheWxvYWRUeXBlID0KKwkJICAgICgxIDw8IDIzKSwKKwkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21lZGlhUGFja2V0aXphdGlvbiA9ICgxIDw8IDIyKSwKKwkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX3RyYW5zcG9ydENhcGFiaWxpdHkgPQorCQkgICAgKDEgPDwgMjEpLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfcmVkdW5kYW5jeUVuY29kaW5nID0gKDEgPDwgMjApLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfc291cmNlID0gKDEgPDwgMTkpLAorCX0gb3B0aW9uczsKKwlIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgbWVkaWFDaGFubmVsOworCUgyNDVfVHJhbnNwb3J0QWRkcmVzcyBtZWRpYUNvbnRyb2xDaGFubmVsOworfSBIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycyB7CS8qIENIT0lDRSAqLworCWVudW0geworCQllT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjIyTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAorCQllT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjIzTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAorCQllT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc192NzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMsCisJCWVPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzX2gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAorCQllT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19ub25lLAorCX0gY2hvaWNlOworCXVuaW9uIHsKKwkJSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7CisJfTsKK30gT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfcG9ydE51bWJlcgorCQkgICAgPSAoMSA8PCAzMSksCisJCWVPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19mb3J3YXJkTG9naWNhbENoYW5uZWxEZXBlbmRlbmN5CisJCSAgICA9ICgxIDw8IDMwKSwKKwkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX3JlcGxhY2VtZW50Rm9yCisJCSAgICA9ICgxIDw8IDI5KSwKKwl9IG9wdGlvbnM7CisJRGF0YVR5cGUgZGF0YVR5cGU7CisJT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycworCSAgICBtdWx0aXBsZXhQYXJhbWV0ZXJzOworfSBPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycyB7CS8qIENIT0lDRSAqLworCWVudW0geworCQllT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjIzTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAorCQllT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc192NzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMsCisJCWVPcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzX2gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAorCX0gY2hvaWNlOworCXVuaW9uIHsKKwkJSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7CisJfTsKK30gT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycworCQkgICAgPSAoMSA8PCAzMSksCisJCWVPcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19yZXZlcnNlTG9naWNhbENoYW5uZWxEZXBlbmRlbmN5CisJCSAgICA9ICgxIDw8IDMwKSwKKwkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX3JlcGxhY2VtZW50Rm9yCisJCSAgICA9ICgxIDw8IDI5KSwKKwl9IG9wdGlvbnM7CisJT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycworCSAgICBtdWx0aXBsZXhQYXJhbWV0ZXJzOworfSBPcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfbmV0d29ya0FkZHJlc3MgewkvKiBDSE9JQ0UgKi8KKwllbnVtIHsKKwkJZU5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzX3EyOTMxQWRkcmVzcywKKwkJZU5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzX2UxNjRBZGRyZXNzLAorCQllTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfbmV0d29ya0FkZHJlc3NfbG9jYWxBcmVhQWRkcmVzcywKKwl9IGNob2ljZTsKKwl1bmlvbiB7CisJCUgyNDVfVHJhbnNwb3J0QWRkcmVzcyBsb2NhbEFyZWFBZGRyZXNzOworCX07Cit9IE5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzOworCit0eXBlZGVmIHN0cnVjdCBOZXR3b3JrQWNjZXNzUGFyYW1ldGVycyB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVOZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19kaXN0cmlidXRpb24gPSAoMSA8PCAzMSksCisJCWVOZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19leHRlcm5hbFJlZmVyZW5jZSA9ICgxIDw8IDMwKSwKKwkJZU5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX3QxMjBTZXR1cFByb2NlZHVyZSA9ICgxIDw8IDI5KSwKKwl9IG9wdGlvbnM7CisJTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfbmV0d29ya0FkZHJlc3MgbmV0d29ya0FkZHJlc3M7Cit9IE5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzOworCit0eXBlZGVmIHN0cnVjdCBPcGVuTG9naWNhbENoYW5uZWwgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMgPQorCQkgICAgKDEgPDwgMzEpLAorCQllT3BlbkxvZ2ljYWxDaGFubmVsX3NlcGFyYXRlU3RhY2sgPSAoMSA8PCAzMCksCisJCWVPcGVuTG9naWNhbENoYW5uZWxfZW5jcnlwdGlvblN5bmMgPSAoMSA8PCAyOSksCisJfSBvcHRpb25zOworCU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzCisJICAgIGZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7CisJT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMKKwkgICAgcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyczsKKwlOZXR3b3JrQWNjZXNzUGFyYW1ldGVycyBzZXBhcmF0ZVN0YWNrOworfSBPcGVuTG9naWNhbENoYW5uZWw7CisKK3R5cGVkZWYgc3RydWN0IFNldHVwX1VVSUVfZmFzdFN0YXJ0IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwlpbnQgY291bnQ7CisJT3BlbkxvZ2ljYWxDaGFubmVsIGl0ZW1bMzBdOworfSBTZXR1cF9VVUlFX2Zhc3RTdGFydDsKKwordHlwZWRlZiBzdHJ1Y3QgU2V0dXBfVVVJRSB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVTZXR1cF9VVUlFX2gyNDVBZGRyZXNzID0gKDEgPDwgMzEpLAorCQllU2V0dXBfVVVJRV9zb3VyY2VBZGRyZXNzID0gKDEgPDwgMzApLAorCQllU2V0dXBfVVVJRV9kZXN0aW5hdGlvbkFkZHJlc3MgPSAoMSA8PCAyOSksCisJCWVTZXR1cF9VVUlFX2Rlc3RDYWxsU2lnbmFsQWRkcmVzcyA9ICgxIDw8IDI4KSwKKwkJZVNldHVwX1VVSUVfZGVzdEV4dHJhQ2FsbEluZm8gPSAoMSA8PCAyNyksCisJCWVTZXR1cF9VVUlFX2Rlc3RFeHRyYUNSViA9ICgxIDw8IDI2KSwKKwkJZVNldHVwX1VVSUVfY2FsbFNlcnZpY2VzID0gKDEgPDwgMjUpLAorCQllU2V0dXBfVVVJRV9zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcyA9ICgxIDw8IDI0KSwKKwkJZVNldHVwX1VVSUVfcmVtb3RlRXh0ZW5zaW9uQWRkcmVzcyA9ICgxIDw8IDIzKSwKKwkJZVNldHVwX1VVSUVfY2FsbElkZW50aWZpZXIgPSAoMSA8PCAyMiksCisJCWVTZXR1cF9VVUlFX2gyNDVTZWN1cml0eUNhcGFiaWxpdHkgPSAoMSA8PCAyMSksCisJCWVTZXR1cF9VVUlFX3Rva2VucyA9ICgxIDw8IDIwKSwKKwkJZVNldHVwX1VVSUVfY3J5cHRvVG9rZW5zID0gKDEgPDwgMTkpLAorCQllU2V0dXBfVVVJRV9mYXN0U3RhcnQgPSAoMSA8PCAxOCksCisJCWVTZXR1cF9VVUlFX21lZGlhV2FpdEZvckNvbm5lY3QgPSAoMSA8PCAxNyksCisJCWVTZXR1cF9VVUlFX2Nhbk92ZXJsYXBTZW5kID0gKDEgPDwgMTYpLAorCQllU2V0dXBfVVVJRV9lbmRwb2ludElkZW50aWZpZXIgPSAoMSA8PCAxNSksCisJCWVTZXR1cF9VVUlFX211bHRpcGxlQ2FsbHMgPSAoMSA8PCAxNCksCisJCWVTZXR1cF9VVUlFX21haW50YWluQ29ubmVjdGlvbiA9ICgxIDw8IDEzKSwKKwkJZVNldHVwX1VVSUVfY29ubmVjdGlvblBhcmFtZXRlcnMgPSAoMSA8PCAxMiksCisJCWVTZXR1cF9VVUlFX2xhbmd1YWdlID0gKDEgPDwgMTEpLAorCQllU2V0dXBfVVVJRV9wcmVzZW50YXRpb25JbmRpY2F0b3IgPSAoMSA8PCAxMCksCisJCWVTZXR1cF9VVUlFX3NjcmVlbmluZ0luZGljYXRvciA9ICgxIDw8IDkpLAorCQllU2V0dXBfVVVJRV9zZXJ2aWNlQ29udHJvbCA9ICgxIDw8IDgpLAorCQllU2V0dXBfVVVJRV9zeW1tZXRyaWNPcGVyYXRpb25SZXF1aXJlZCA9ICgxIDw8IDcpLAorCQllU2V0dXBfVVVJRV9jYXBhY2l0eSA9ICgxIDw8IDYpLAorCQllU2V0dXBfVVVJRV9jaXJjdWl0SW5mbyA9ICgxIDw8IDUpLAorCQllU2V0dXBfVVVJRV9kZXNpcmVkUHJvdG9jb2xzID0gKDEgPDwgNCksCisJCWVTZXR1cF9VVUlFX25lZWRlZEZlYXR1cmVzID0gKDEgPDwgMyksCisJCWVTZXR1cF9VVUlFX2Rlc2lyZWRGZWF0dXJlcyA9ICgxIDw8IDIpLAorCQllU2V0dXBfVVVJRV9zdXBwb3J0ZWRGZWF0dXJlcyA9ICgxIDw8IDEpLAorCQllU2V0dXBfVVVJRV9wYXJhbGxlbEgyNDVDb250cm9sID0gKDEgPDwgMCksCisJfSBvcHRpb25zOworCVRyYW5zcG9ydEFkZHJlc3MgaDI0NUFkZHJlc3M7CisJVHJhbnNwb3J0QWRkcmVzcyBkZXN0Q2FsbFNpZ25hbEFkZHJlc3M7CisJVHJhbnNwb3J0QWRkcmVzcyBzb3VyY2VDYWxsU2lnbmFsQWRkcmVzczsKKwlTZXR1cF9VVUlFX2Zhc3RTdGFydCBmYXN0U3RhcnQ7Cit9IFNldHVwX1VVSUU7CisKK3R5cGVkZWYgc3RydWN0IENhbGxQcm9jZWVkaW5nX1VVSUVfZmFzdFN0YXJ0IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwlpbnQgY291bnQ7CisJT3BlbkxvZ2ljYWxDaGFubmVsIGl0ZW1bMzBdOworfSBDYWxsUHJvY2VlZGluZ19VVUlFX2Zhc3RTdGFydDsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsbFByb2NlZWRpbmdfVVVJRSB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVDYWxsUHJvY2VlZGluZ19VVUlFX2gyNDVBZGRyZXNzID0gKDEgPDwgMzEpLAorCQllQ2FsbFByb2NlZWRpbmdfVVVJRV9jYWxsSWRlbnRpZmllciA9ICgxIDw8IDMwKSwKKwkJZUNhbGxQcm9jZWVkaW5nX1VVSUVfaDI0NVNlY3VyaXR5TW9kZSA9ICgxIDw8IDI5KSwKKwkJZUNhbGxQcm9jZWVkaW5nX1VVSUVfdG9rZW5zID0gKDEgPDwgMjgpLAorCQllQ2FsbFByb2NlZWRpbmdfVVVJRV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNyksCisJCWVDYWxsUHJvY2VlZGluZ19VVUlFX2Zhc3RTdGFydCA9ICgxIDw8IDI2KSwKKwkJZUNhbGxQcm9jZWVkaW5nX1VVSUVfbXVsdGlwbGVDYWxscyA9ICgxIDw8IDI1KSwKKwkJZUNhbGxQcm9jZWVkaW5nX1VVSUVfbWFpbnRhaW5Db25uZWN0aW9uID0gKDEgPDwgMjQpLAorCQllQ2FsbFByb2NlZWRpbmdfVVVJRV9mYXN0Q29ubmVjdFJlZnVzZWQgPSAoMSA8PCAyMyksCisJCWVDYWxsUHJvY2VlZGluZ19VVUlFX2ZlYXR1cmVTZXQgPSAoMSA8PCAyMiksCisJfSBvcHRpb25zOworCVRyYW5zcG9ydEFkZHJlc3MgaDI0NUFkZHJlc3M7CisJQ2FsbFByb2NlZWRpbmdfVVVJRV9mYXN0U3RhcnQgZmFzdFN0YXJ0OworfSBDYWxsUHJvY2VlZGluZ19VVUlFOworCit0eXBlZGVmIHN0cnVjdCBDb25uZWN0X1VVSUVfZmFzdFN0YXJ0IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwlpbnQgY291bnQ7CisJT3BlbkxvZ2ljYWxDaGFubmVsIGl0ZW1bMzBdOworfSBDb25uZWN0X1VVSUVfZmFzdFN0YXJ0OworCit0eXBlZGVmIHN0cnVjdCBDb25uZWN0X1VVSUUgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllQ29ubmVjdF9VVUlFX2gyNDVBZGRyZXNzID0gKDEgPDwgMzEpLAorCQllQ29ubmVjdF9VVUlFX2NhbGxJZGVudGlmaWVyID0gKDEgPDwgMzApLAorCQllQ29ubmVjdF9VVUlFX2gyNDVTZWN1cml0eU1vZGUgPSAoMSA8PCAyOSksCisJCWVDb25uZWN0X1VVSUVfdG9rZW5zID0gKDEgPDwgMjgpLAorCQllQ29ubmVjdF9VVUlFX2NyeXB0b1Rva2VucyA9ICgxIDw8IDI3KSwKKwkJZUNvbm5lY3RfVVVJRV9mYXN0U3RhcnQgPSAoMSA8PCAyNiksCisJCWVDb25uZWN0X1VVSUVfbXVsdGlwbGVDYWxscyA9ICgxIDw8IDI1KSwKKwkJZUNvbm5lY3RfVVVJRV9tYWludGFpbkNvbm5lY3Rpb24gPSAoMSA8PCAyNCksCisJCWVDb25uZWN0X1VVSUVfbGFuZ3VhZ2UgPSAoMSA8PCAyMyksCisJCWVDb25uZWN0X1VVSUVfY29ubmVjdGVkQWRkcmVzcyA9ICgxIDw8IDIyKSwKKwkJZUNvbm5lY3RfVVVJRV9wcmVzZW50YXRpb25JbmRpY2F0b3IgPSAoMSA8PCAyMSksCisJCWVDb25uZWN0X1VVSUVfc2NyZWVuaW5nSW5kaWNhdG9yID0gKDEgPDwgMjApLAorCQllQ29ubmVjdF9VVUlFX2Zhc3RDb25uZWN0UmVmdXNlZCA9ICgxIDw8IDE5KSwKKwkJZUNvbm5lY3RfVVVJRV9zZXJ2aWNlQ29udHJvbCA9ICgxIDw8IDE4KSwKKwkJZUNvbm5lY3RfVVVJRV9jYXBhY2l0eSA9ICgxIDw8IDE3KSwKKwkJZUNvbm5lY3RfVVVJRV9mZWF0dXJlU2V0ID0gKDEgPDwgMTYpLAorCX0gb3B0aW9uczsKKwlUcmFuc3BvcnRBZGRyZXNzIGgyNDVBZGRyZXNzOworCUNvbm5lY3RfVVVJRV9mYXN0U3RhcnQgZmFzdFN0YXJ0OworfSBDb25uZWN0X1VVSUU7CisKK3R5cGVkZWYgc3RydWN0IEFsZXJ0aW5nX1VVSUVfZmFzdFN0YXJ0IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwlpbnQgY291bnQ7CisJT3BlbkxvZ2ljYWxDaGFubmVsIGl0ZW1bMzBdOworfSBBbGVydGluZ19VVUlFX2Zhc3RTdGFydDsKKwordHlwZWRlZiBzdHJ1Y3QgQWxlcnRpbmdfVVVJRSB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVBbGVydGluZ19VVUlFX2gyNDVBZGRyZXNzID0gKDEgPDwgMzEpLAorCQllQWxlcnRpbmdfVVVJRV9jYWxsSWRlbnRpZmllciA9ICgxIDw8IDMwKSwKKwkJZUFsZXJ0aW5nX1VVSUVfaDI0NVNlY3VyaXR5TW9kZSA9ICgxIDw8IDI5KSwKKwkJZUFsZXJ0aW5nX1VVSUVfdG9rZW5zID0gKDEgPDwgMjgpLAorCQllQWxlcnRpbmdfVVVJRV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNyksCisJCWVBbGVydGluZ19VVUlFX2Zhc3RTdGFydCA9ICgxIDw8IDI2KSwKKwkJZUFsZXJ0aW5nX1VVSUVfbXVsdGlwbGVDYWxscyA9ICgxIDw8IDI1KSwKKwkJZUFsZXJ0aW5nX1VVSUVfbWFpbnRhaW5Db25uZWN0aW9uID0gKDEgPDwgMjQpLAorCQllQWxlcnRpbmdfVVVJRV9hbGVydGluZ0FkZHJlc3MgPSAoMSA8PCAyMyksCisJCWVBbGVydGluZ19VVUlFX3ByZXNlbnRhdGlvbkluZGljYXRvciA9ICgxIDw8IDIyKSwKKwkJZUFsZXJ0aW5nX1VVSUVfc2NyZWVuaW5nSW5kaWNhdG9yID0gKDEgPDwgMjEpLAorCQllQWxlcnRpbmdfVVVJRV9mYXN0Q29ubmVjdFJlZnVzZWQgPSAoMSA8PCAyMCksCisJCWVBbGVydGluZ19VVUlFX3NlcnZpY2VDb250cm9sID0gKDEgPDwgMTkpLAorCQllQWxlcnRpbmdfVVVJRV9jYXBhY2l0eSA9ICgxIDw8IDE4KSwKKwkJZUFsZXJ0aW5nX1VVSUVfZmVhdHVyZVNldCA9ICgxIDw8IDE3KSwKKwl9IG9wdGlvbnM7CisJVHJhbnNwb3J0QWRkcmVzcyBoMjQ1QWRkcmVzczsKKwlBbGVydGluZ19VVUlFX2Zhc3RTdGFydCBmYXN0U3RhcnQ7Cit9IEFsZXJ0aW5nX1VVSUU7CisKK3R5cGVkZWYgc3RydWN0IEluZm9ybWF0aW9uX1VVSUVfZmFzdFN0YXJ0IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwlpbnQgY291bnQ7CisJT3BlbkxvZ2ljYWxDaGFubmVsIGl0ZW1bMzBdOworfSBJbmZvcm1hdGlvbl9VVUlFX2Zhc3RTdGFydDsKKwordHlwZWRlZiBzdHJ1Y3QgSW5mb3JtYXRpb25fVVVJRSB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVJbmZvcm1hdGlvbl9VVUlFX2NhbGxJZGVudGlmaWVyID0gKDEgPDwgMzEpLAorCQllSW5mb3JtYXRpb25fVVVJRV90b2tlbnMgPSAoMSA8PCAzMCksCisJCWVJbmZvcm1hdGlvbl9VVUlFX2NyeXB0b1Rva2VucyA9ICgxIDw8IDI5KSwKKwkJZUluZm9ybWF0aW9uX1VVSUVfZmFzdFN0YXJ0ID0gKDEgPDwgMjgpLAorCQllSW5mb3JtYXRpb25fVVVJRV9mYXN0Q29ubmVjdFJlZnVzZWQgPSAoMSA8PCAyNyksCisJCWVJbmZvcm1hdGlvbl9VVUlFX2NpcmN1aXRJbmZvID0gKDEgPDwgMjYpLAorCX0gb3B0aW9uczsKKwlJbmZvcm1hdGlvbl9VVUlFX2Zhc3RTdGFydCBmYXN0U3RhcnQ7Cit9IEluZm9ybWF0aW9uX1VVSUU7CisKK3R5cGVkZWYgc3RydWN0IEZhY2lsaXR5UmVhc29uIHsJLyogQ0hPSUNFICovCisJZW51bSB7CisJCWVGYWNpbGl0eVJlYXNvbl9yb3V0ZUNhbGxUb0dhdGVrZWVwZXIsCisJCWVGYWNpbGl0eVJlYXNvbl9jYWxsRm9yd2FyZGVkLAorCQllRmFjaWxpdHlSZWFzb25fcm91dGVDYWxsVG9NQywKKwkJZUZhY2lsaXR5UmVhc29uX3VuZGVmaW5lZFJlYXNvbiwKKwkJZUZhY2lsaXR5UmVhc29uX2NvbmZlcmVuY2VMaXN0Q2hvaWNlLAorCQllRmFjaWxpdHlSZWFzb25fc3RhcnRIMjQ1LAorCQllRmFjaWxpdHlSZWFzb25fbm9IMjQ1LAorCQllRmFjaWxpdHlSZWFzb25fbmV3VG9rZW5zLAorCQllRmFjaWxpdHlSZWFzb25fZmVhdHVyZVNldFVwZGF0ZSwKKwkJZUZhY2lsaXR5UmVhc29uX2ZvcndhcmRlZEVsZW1lbnRzLAorCQllRmFjaWxpdHlSZWFzb25fdHJhbnNwb3J0ZWRJbmZvcm1hdGlvbiwKKwl9IGNob2ljZTsKK30gRmFjaWxpdHlSZWFzb247CisKK3R5cGVkZWYgc3RydWN0IEZhY2lsaXR5X1VVSUVfZmFzdFN0YXJ0IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwlpbnQgY291bnQ7CisJT3BlbkxvZ2ljYWxDaGFubmVsIGl0ZW1bMzBdOworfSBGYWNpbGl0eV9VVUlFX2Zhc3RTdGFydDsKKwordHlwZWRlZiBzdHJ1Y3QgRmFjaWxpdHlfVVVJRSB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVGYWNpbGl0eV9VVUlFX2FsdGVybmF0aXZlQWRkcmVzcyA9ICgxIDw8IDMxKSwKKwkJZUZhY2lsaXR5X1VVSUVfYWx0ZXJuYXRpdmVBbGlhc0FkZHJlc3MgPSAoMSA8PCAzMCksCisJCWVGYWNpbGl0eV9VVUlFX2NvbmZlcmVuY2VJRCA9ICgxIDw8IDI5KSwKKwkJZUZhY2lsaXR5X1VVSUVfY2FsbElkZW50aWZpZXIgPSAoMSA8PCAyOCksCisJCWVGYWNpbGl0eV9VVUlFX2Rlc3RFeHRyYUNhbGxJbmZvID0gKDEgPDwgMjcpLAorCQllRmFjaWxpdHlfVVVJRV9yZW1vdGVFeHRlbnNpb25BZGRyZXNzID0gKDEgPDwgMjYpLAorCQllRmFjaWxpdHlfVVVJRV90b2tlbnMgPSAoMSA8PCAyNSksCisJCWVGYWNpbGl0eV9VVUlFX2NyeXB0b1Rva2VucyA9ICgxIDw8IDI0KSwKKwkJZUZhY2lsaXR5X1VVSUVfY29uZmVyZW5jZXMgPSAoMSA8PCAyMyksCisJCWVGYWNpbGl0eV9VVUlFX2gyNDVBZGRyZXNzID0gKDEgPDwgMjIpLAorCQllRmFjaWxpdHlfVVVJRV9mYXN0U3RhcnQgPSAoMSA8PCAyMSksCisJCWVGYWNpbGl0eV9VVUlFX211bHRpcGxlQ2FsbHMgPSAoMSA8PCAyMCksCisJCWVGYWNpbGl0eV9VVUlFX21haW50YWluQ29ubmVjdGlvbiA9ICgxIDw8IDE5KSwKKwkJZUZhY2lsaXR5X1VVSUVfZmFzdENvbm5lY3RSZWZ1c2VkID0gKDEgPDwgMTgpLAorCQllRmFjaWxpdHlfVVVJRV9zZXJ2aWNlQ29udHJvbCA9ICgxIDw8IDE3KSwKKwkJZUZhY2lsaXR5X1VVSUVfY2lyY3VpdEluZm8gPSAoMSA8PCAxNiksCisJCWVGYWNpbGl0eV9VVUlFX2ZlYXR1cmVTZXQgPSAoMSA8PCAxNSksCisJCWVGYWNpbGl0eV9VVUlFX2Rlc3RpbmF0aW9uSW5mbyA9ICgxIDw8IDE0KSwKKwkJZUZhY2lsaXR5X1VVSUVfaDI0NVNlY3VyaXR5TW9kZSA9ICgxIDw8IDEzKSwKKwl9IG9wdGlvbnM7CisJVHJhbnNwb3J0QWRkcmVzcyBhbHRlcm5hdGl2ZUFkZHJlc3M7CisJRmFjaWxpdHlSZWFzb24gcmVhc29uOworCVRyYW5zcG9ydEFkZHJlc3MgaDI0NUFkZHJlc3M7CisJRmFjaWxpdHlfVVVJRV9mYXN0U3RhcnQgZmFzdFN0YXJ0OworfSBGYWNpbGl0eV9VVUlFOworCit0eXBlZGVmIHN0cnVjdCBQcm9ncmVzc19VVUlFX2Zhc3RTdGFydCB7CS8qIFNFUVVFTkNFIE9GICovCisJaW50IGNvdW50OworCU9wZW5Mb2dpY2FsQ2hhbm5lbCBpdGVtWzMwXTsKK30gUHJvZ3Jlc3NfVVVJRV9mYXN0U3RhcnQ7CisKK3R5cGVkZWYgc3RydWN0IFByb2dyZXNzX1VVSUUgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllUHJvZ3Jlc3NfVVVJRV9oMjQ1QWRkcmVzcyA9ICgxIDw8IDMxKSwKKwkJZVByb2dyZXNzX1VVSUVfaDI0NVNlY3VyaXR5TW9kZSA9ICgxIDw8IDMwKSwKKwkJZVByb2dyZXNzX1VVSUVfdG9rZW5zID0gKDEgPDwgMjkpLAorCQllUHJvZ3Jlc3NfVVVJRV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyOCksCisJCWVQcm9ncmVzc19VVUlFX2Zhc3RTdGFydCA9ICgxIDw8IDI3KSwKKwkJZVByb2dyZXNzX1VVSUVfbXVsdGlwbGVDYWxscyA9ICgxIDw8IDI2KSwKKwkJZVByb2dyZXNzX1VVSUVfbWFpbnRhaW5Db25uZWN0aW9uID0gKDEgPDwgMjUpLAorCQllUHJvZ3Jlc3NfVVVJRV9mYXN0Q29ubmVjdFJlZnVzZWQgPSAoMSA8PCAyNCksCisJfSBvcHRpb25zOworCVRyYW5zcG9ydEFkZHJlc3MgaDI0NUFkZHJlc3M7CisJUHJvZ3Jlc3NfVVVJRV9mYXN0U3RhcnQgZmFzdFN0YXJ0OworfSBQcm9ncmVzc19VVUlFOworCit0eXBlZGVmIHN0cnVjdCBIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSB7CS8qIENIT0lDRSAqLworCWVudW0geworCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfc2V0dXAsCisJCWVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9jYWxsUHJvY2VlZGluZywKKwkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2Nvbm5lY3QsCisJCWVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9hbGVydGluZywKKwkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2luZm9ybWF0aW9uLAorCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfcmVsZWFzZUNvbXBsZXRlLAorCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfZmFjaWxpdHksCisJCWVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9wcm9ncmVzcywKKwkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2VtcHR5LAorCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfc3RhdHVzLAorCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfc3RhdHVzSW5xdWlyeSwKKwkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3NldHVwQWNrbm93bGVkZ2UsCisJCWVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9ub3RpZnksCisJfSBjaG9pY2U7CisJdW5pb24geworCQlTZXR1cF9VVUlFIHNldHVwOworCQlDYWxsUHJvY2VlZGluZ19VVUlFIGNhbGxQcm9jZWVkaW5nOworCQlDb25uZWN0X1VVSUUgY29ubmVjdDsKKwkJQWxlcnRpbmdfVVVJRSBhbGVydGluZzsKKwkJSW5mb3JtYXRpb25fVVVJRSBpbmZvcm1hdGlvbjsKKwkJRmFjaWxpdHlfVVVJRSBmYWNpbGl0eTsKKwkJUHJvZ3Jlc3NfVVVJRSBwcm9ncmVzczsKKwl9OworfSBIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keTsKKwordHlwZWRlZiBzdHJ1Y3QgUmVxdWVzdE1lc3NhZ2UgewkvKiBDSE9JQ0UgKi8KKwllbnVtIHsKKwkJZVJlcXVlc3RNZXNzYWdlX25vblN0YW5kYXJkLAorCQllUmVxdWVzdE1lc3NhZ2VfbWFzdGVyU2xhdmVEZXRlcm1pbmF0aW9uLAorCQllUmVxdWVzdE1lc3NhZ2VfdGVybWluYWxDYXBhYmlsaXR5U2V0LAorCQllUmVxdWVzdE1lc3NhZ2Vfb3BlbkxvZ2ljYWxDaGFubmVsLAorCQllUmVxdWVzdE1lc3NhZ2VfY2xvc2VMb2dpY2FsQ2hhbm5lbCwKKwkJZVJlcXVlc3RNZXNzYWdlX3JlcXVlc3RDaGFubmVsQ2xvc2UsCisJCWVSZXF1ZXN0TWVzc2FnZV9tdWx0aXBsZXhFbnRyeVNlbmQsCisJCWVSZXF1ZXN0TWVzc2FnZV9yZXF1ZXN0TXVsdGlwbGV4RW50cnksCisJCWVSZXF1ZXN0TWVzc2FnZV9yZXF1ZXN0TW9kZSwKKwkJZVJlcXVlc3RNZXNzYWdlX3JvdW5kVHJpcERlbGF5UmVxdWVzdCwKKwkJZVJlcXVlc3RNZXNzYWdlX21haW50ZW5hbmNlTG9vcFJlcXVlc3QsCisJCWVSZXF1ZXN0TWVzc2FnZV9jb21tdW5pY2F0aW9uTW9kZVJlcXVlc3QsCisJCWVSZXF1ZXN0TWVzc2FnZV9jb25mZXJlbmNlUmVxdWVzdCwKKwkJZVJlcXVlc3RNZXNzYWdlX211bHRpbGlua1JlcXVlc3QsCisJCWVSZXF1ZXN0TWVzc2FnZV9sb2dpY2FsQ2hhbm5lbFJhdGVSZXF1ZXN0LAorCX0gY2hvaWNlOworCXVuaW9uIHsKKwkJT3BlbkxvZ2ljYWxDaGFubmVsIG9wZW5Mb2dpY2FsQ2hhbm5lbDsKKwl9OworfSBSZXF1ZXN0TWVzc2FnZTsKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycyB7CS8qIENIT0lDRSAqLworCWVudW0geworCQllT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjIyTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAorCQllT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKKwl9IGNob2ljZTsKKwl1bmlvbiB7CisJCUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzOworCX07Cit9IE9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0IE9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIHsJLyogU0VRVUVOQ0UgKi8KKwllbnVtIHsKKwkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX3BvcnROdW1iZXIKKwkJICAgID0gKDEgPDwgMzEpLAorCQllT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycworCQkgICAgPSAoMSA8PCAzMCksCisJCWVPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19yZXBsYWNlbWVudEZvcgorCQkgICAgPSAoMSA8PCAyOSksCisJfSBvcHRpb25zOworCU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMKKwkgICAgbXVsdGlwbGV4UGFyYW1ldGVyczsKK30gT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0IEgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzIHsJLyogU0VRVUVOQ0UgKi8KKwllbnVtIHsKKwkJZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX25vblN0YW5kYXJkID0gKDEgPDwgMzEpLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfc2Vzc2lvbklEID0gKDEgPDwgMzApLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfbWVkaWFDaGFubmVsID0gKDEgPDwgMjkpLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfbWVkaWFDb250cm9sQ2hhbm5lbCA9CisJCSAgICAoMSA8PCAyOCksCisJCWVIMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVyc19keW5hbWljUlRQUGF5bG9hZFR5cGUgPQorCQkgICAgKDEgPDwgMjcpLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfZmxvd0NvbnRyb2xUb1plcm8gPQorCQkgICAgKDEgPDwgMjYpLAorCQllSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfcG9ydE51bWJlciA9ICgxIDw8IDI1KSwKKwl9IG9wdGlvbnM7CisJSDI0NV9UcmFuc3BvcnRBZGRyZXNzIG1lZGlhQ2hhbm5lbDsKKwlIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgbWVkaWFDb250cm9sQ2hhbm5lbDsKK30gSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0IE9wZW5Mb2dpY2FsQ2hhbm5lbEFja19mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVycyB7CS8qIENIT0lDRSAqLworCWVudW0geworCQllT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzX2gyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzLAorCX0gY2hvaWNlOworCXVuaW9uIHsKKwkJSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnMKKwkJICAgIGgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzOworCX07Cit9IE9wZW5Mb2dpY2FsQ2hhbm5lbEFja19mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkxvZ2ljYWxDaGFubmVsQWNrIHsJLyogU0VRVUVOQ0UgKi8KKwllbnVtIHsKKwkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzID0KKwkJICAgICgxIDw8IDMxKSwKKwkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19zZXBhcmF0ZVN0YWNrID0gKDEgPDwgMzApLAorCQllT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzID0KKwkJICAgICgxIDw8IDI5KSwKKwkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19lbmNyeXB0aW9uU3luYyA9ICgxIDw8IDI4KSwKKwl9IG9wdGlvbnM7CisJT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMKKwkgICAgcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyczsKKwlPcGVuTG9naWNhbENoYW5uZWxBY2tfZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnMKKwkgICAgZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnM7Cit9IE9wZW5Mb2dpY2FsQ2hhbm5lbEFjazsKKwordHlwZWRlZiBzdHJ1Y3QgUmVzcG9uc2VNZXNzYWdlIHsJLyogQ0hPSUNFICovCisJZW51bSB7CisJCWVSZXNwb25zZU1lc3NhZ2Vfbm9uU3RhbmRhcmQsCisJCWVSZXNwb25zZU1lc3NhZ2VfbWFzdGVyU2xhdmVEZXRlcm1pbmF0aW9uQWNrLAorCQllUmVzcG9uc2VNZXNzYWdlX21hc3RlclNsYXZlRGV0ZXJtaW5hdGlvblJlamVjdCwKKwkJZVJlc3BvbnNlTWVzc2FnZV90ZXJtaW5hbENhcGFiaWxpdHlTZXRBY2ssCisJCWVSZXNwb25zZU1lc3NhZ2VfdGVybWluYWxDYXBhYmlsaXR5U2V0UmVqZWN0LAorCQllUmVzcG9uc2VNZXNzYWdlX29wZW5Mb2dpY2FsQ2hhbm5lbEFjaywKKwkJZVJlc3BvbnNlTWVzc2FnZV9vcGVuTG9naWNhbENoYW5uZWxSZWplY3QsCisJCWVSZXNwb25zZU1lc3NhZ2VfY2xvc2VMb2dpY2FsQ2hhbm5lbEFjaywKKwkJZVJlc3BvbnNlTWVzc2FnZV9yZXF1ZXN0Q2hhbm5lbENsb3NlQWNrLAorCQllUmVzcG9uc2VNZXNzYWdlX3JlcXVlc3RDaGFubmVsQ2xvc2VSZWplY3QsCisJCWVSZXNwb25zZU1lc3NhZ2VfbXVsdGlwbGV4RW50cnlTZW5kQWNrLAorCQllUmVzcG9uc2VNZXNzYWdlX211bHRpcGxleEVudHJ5U2VuZFJlamVjdCwKKwkJZVJlc3BvbnNlTWVzc2FnZV9yZXF1ZXN0TXVsdGlwbGV4RW50cnlBY2ssCisJCWVSZXNwb25zZU1lc3NhZ2VfcmVxdWVzdE11bHRpcGxleEVudHJ5UmVqZWN0LAorCQllUmVzcG9uc2VNZXNzYWdlX3JlcXVlc3RNb2RlQWNrLAorCQllUmVzcG9uc2VNZXNzYWdlX3JlcXVlc3RNb2RlUmVqZWN0LAorCQllUmVzcG9uc2VNZXNzYWdlX3JvdW5kVHJpcERlbGF5UmVzcG9uc2UsCisJCWVSZXNwb25zZU1lc3NhZ2VfbWFpbnRlbmFuY2VMb29wQWNrLAorCQllUmVzcG9uc2VNZXNzYWdlX21haW50ZW5hbmNlTG9vcFJlamVjdCwKKwkJZVJlc3BvbnNlTWVzc2FnZV9jb21tdW5pY2F0aW9uTW9kZVJlc3BvbnNlLAorCQllUmVzcG9uc2VNZXNzYWdlX2NvbmZlcmVuY2VSZXNwb25zZSwKKwkJZVJlc3BvbnNlTWVzc2FnZV9tdWx0aWxpbmtSZXNwb25zZSwKKwkJZVJlc3BvbnNlTWVzc2FnZV9sb2dpY2FsQ2hhbm5lbFJhdGVBY2tub3dsZWRnZSwKKwkJZVJlc3BvbnNlTWVzc2FnZV9sb2dpY2FsQ2hhbm5lbFJhdGVSZWplY3QsCisJfSBjaG9pY2U7CisJdW5pb24geworCQlPcGVuTG9naWNhbENoYW5uZWxBY2sgb3BlbkxvZ2ljYWxDaGFubmVsQWNrOworCX07Cit9IFJlc3BvbnNlTWVzc2FnZTsKKwordHlwZWRlZiBzdHJ1Y3QgTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlIHsJLyogQ0hPSUNFICovCisJZW51bSB7CisJCWVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2VfcmVxdWVzdCwKKwkJZU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZV9yZXNwb25zZSwKKwkJZU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZV9jb21tYW5kLAorCQllTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlX2luZGljYXRpb24sCisJfSBjaG9pY2U7CisJdW5pb24geworCQlSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0OworCQlSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2U7CisJfTsKK30gTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlOworCit0eXBlZGVmIHN0cnVjdCBIMzIzX1VVX1BEVV9oMjQ1Q29udHJvbCB7CS8qIFNFUVVFTkNFIE9GICovCisJaW50IGNvdW50OworCU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSBpdGVtWzRdOworfSBIMzIzX1VVX1BEVV9oMjQ1Q29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgSDMyM19VVV9QRFUgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllSDMyM19VVV9QRFVfbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMzEpLAorCQllSDMyM19VVV9QRFVfaDQ1MDFTdXBwbGVtZW50YXJ5U2VydmljZSA9ICgxIDw8IDMwKSwKKwkJZUgzMjNfVVVfUERVX2gyNDVUdW5uZWxpbmcgPSAoMSA8PCAyOSksCisJCWVIMzIzX1VVX1BEVV9oMjQ1Q29udHJvbCA9ICgxIDw8IDI4KSwKKwkJZUgzMjNfVVVfUERVX25vblN0YW5kYXJkQ29udHJvbCA9ICgxIDw8IDI3KSwKKwkJZUgzMjNfVVVfUERVX2NhbGxMaW5rYWdlID0gKDEgPDwgMjYpLAorCQllSDMyM19VVV9QRFVfdHVubmVsbGVkU2lnbmFsbGluZ01lc3NhZ2UgPSAoMSA8PCAyNSksCisJCWVIMzIzX1VVX1BEVV9wcm92aXNpb25hbFJlc3BUb0gyNDVUdW5uZWxpbmcgPSAoMSA8PCAyNCksCisJCWVIMzIzX1VVX1BEVV9zdGltdWx1c0NvbnRyb2wgPSAoMSA8PCAyMyksCisJCWVIMzIzX1VVX1BEVV9nZW5lcmljRGF0YSA9ICgxIDw8IDIyKSwKKwl9IG9wdGlvbnM7CisJSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHkgaDMyM19tZXNzYWdlX2JvZHk7CisJSDMyM19VVV9QRFVfaDI0NUNvbnRyb2wgaDI0NUNvbnRyb2w7Cit9IEgzMjNfVVVfUERVOworCit0eXBlZGVmIHN0cnVjdCBIMzIzX1VzZXJJbmZvcm1hdGlvbiB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVIMzIzX1VzZXJJbmZvcm1hdGlvbl91c2VyX2RhdGEgPSAoMSA8PCAzMSksCisJfSBvcHRpb25zOworCUgzMjNfVVVfUERVIGgzMjNfdXVfcGR1OworfSBIMzIzX1VzZXJJbmZvcm1hdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgR2F0ZWtlZXBlclJlcXVlc3QgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllR2F0ZWtlZXBlclJlcXVlc3Rfbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMzEpLAorCQllR2F0ZWtlZXBlclJlcXVlc3RfZ2F0ZWtlZXBlcklkZW50aWZpZXIgPSAoMSA8PCAzMCksCisJCWVHYXRla2VlcGVyUmVxdWVzdF9jYWxsU2VydmljZXMgPSAoMSA8PCAyOSksCisJCWVHYXRla2VlcGVyUmVxdWVzdF9lbmRwb2ludEFsaWFzID0gKDEgPDwgMjgpLAorCQllR2F0ZWtlZXBlclJlcXVlc3RfYWx0ZXJuYXRlRW5kcG9pbnRzID0gKDEgPDwgMjcpLAorCQllR2F0ZWtlZXBlclJlcXVlc3RfdG9rZW5zID0gKDEgPDwgMjYpLAorCQllR2F0ZWtlZXBlclJlcXVlc3RfY3J5cHRvVG9rZW5zID0gKDEgPDwgMjUpLAorCQllR2F0ZWtlZXBlclJlcXVlc3RfYXV0aGVudGljYXRpb25DYXBhYmlsaXR5ID0gKDEgPDwgMjQpLAorCQllR2F0ZWtlZXBlclJlcXVlc3RfYWxnb3JpdGhtT0lEcyA9ICgxIDw8IDIzKSwKKwkJZUdhdGVrZWVwZXJSZXF1ZXN0X2ludGVncml0eSA9ICgxIDw8IDIyKSwKKwkJZUdhdGVrZWVwZXJSZXF1ZXN0X2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAyMSksCisJCWVHYXRla2VlcGVyUmVxdWVzdF9zdXBwb3J0c0FsdEdLID0gKDEgPDwgMjApLAorCQllR2F0ZWtlZXBlclJlcXVlc3RfZmVhdHVyZVNldCA9ICgxIDw8IDE5KSwKKwkJZUdhdGVrZWVwZXJSZXF1ZXN0X2dlbmVyaWNEYXRhID0gKDEgPDwgMTgpLAorCX0gb3B0aW9uczsKKwlUcmFuc3BvcnRBZGRyZXNzIHJhc0FkZHJlc3M7Cit9IEdhdGVrZWVwZXJSZXF1ZXN0OworCit0eXBlZGVmIHN0cnVjdCBHYXRla2VlcGVyQ29uZmlybSB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVHYXRla2VlcGVyQ29uZmlybV9ub25TdGFuZGFyZERhdGEgPSAoMSA8PCAzMSksCisJCWVHYXRla2VlcGVyQ29uZmlybV9nYXRla2VlcGVySWRlbnRpZmllciA9ICgxIDw8IDMwKSwKKwkJZUdhdGVrZWVwZXJDb25maXJtX2FsdGVybmF0ZUdhdGVrZWVwZXIgPSAoMSA8PCAyOSksCisJCWVHYXRla2VlcGVyQ29uZmlybV9hdXRoZW50aWNhdGlvbk1vZGUgPSAoMSA8PCAyOCksCisJCWVHYXRla2VlcGVyQ29uZmlybV90b2tlbnMgPSAoMSA8PCAyNyksCisJCWVHYXRla2VlcGVyQ29uZmlybV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNiksCisJCWVHYXRla2VlcGVyQ29uZmlybV9hbGdvcml0aG1PSUQgPSAoMSA8PCAyNSksCisJCWVHYXRla2VlcGVyQ29uZmlybV9pbnRlZ3JpdHkgPSAoMSA8PCAyNCksCisJCWVHYXRla2VlcGVyQ29uZmlybV9pbnRlZ3JpdHlDaGVja1ZhbHVlID0gKDEgPDwgMjMpLAorCQllR2F0ZWtlZXBlckNvbmZpcm1fZmVhdHVyZVNldCA9ICgxIDw8IDIyKSwKKwkJZUdhdGVrZWVwZXJDb25maXJtX2dlbmVyaWNEYXRhID0gKDEgPDwgMjEpLAorCX0gb3B0aW9uczsKKwlUcmFuc3BvcnRBZGRyZXNzIHJhc0FkZHJlc3M7Cit9IEdhdGVrZWVwZXJDb25maXJtOworCit0eXBlZGVmIHN0cnVjdCBSZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzIHsJLyogU0VRVUVOQ0UgT0YgKi8KKwlpbnQgY291bnQ7CisJVHJhbnNwb3J0QWRkcmVzcyBpdGVtWzEwXTsKK30gUmVnaXN0cmF0aW9uUmVxdWVzdF9jYWxsU2lnbmFsQWRkcmVzczsKKwordHlwZWRlZiBzdHJ1Y3QgUmVnaXN0cmF0aW9uUmVxdWVzdF9yYXNBZGRyZXNzIHsJLyogU0VRVUVOQ0UgT0YgKi8KKwlpbnQgY291bnQ7CisJVHJhbnNwb3J0QWRkcmVzcyBpdGVtWzEwXTsKK30gUmVnaXN0cmF0aW9uUmVxdWVzdF9yYXNBZGRyZXNzOworCit0eXBlZGVmIHN0cnVjdCBSZWdpc3RyYXRpb25SZXF1ZXN0IHsJLyogU0VRVUVOQ0UgKi8KKwllbnVtIHsKKwkJZVJlZ2lzdHJhdGlvblJlcXVlc3Rfbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMzEpLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF90ZXJtaW5hbEFsaWFzID0gKDEgPDwgMzApLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9nYXRla2VlcGVySWRlbnRpZmllciA9ICgxIDw8IDI5KSwKKwkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfYWx0ZXJuYXRlRW5kcG9pbnRzID0gKDEgPDwgMjgpLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF90aW1lVG9MaXZlID0gKDEgPDwgMjcpLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF90b2tlbnMgPSAoMSA8PCAyNiksCisJCWVSZWdpc3RyYXRpb25SZXF1ZXN0X2NyeXB0b1Rva2VucyA9ICgxIDw8IDI1KSwKKwkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfaW50ZWdyaXR5Q2hlY2tWYWx1ZSA9ICgxIDw8IDI0KSwKKwkJZVJlZ2lzdHJhdGlvblJlcXVlc3Rfa2VlcEFsaXZlID0gKDEgPDwgMjMpLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9lbmRwb2ludElkZW50aWZpZXIgPSAoMSA8PCAyMiksCisJCWVSZWdpc3RyYXRpb25SZXF1ZXN0X3dpbGxTdXBwbHlVVUlFcyA9ICgxIDw8IDIxKSwKKwkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfbWFpbnRhaW5Db25uZWN0aW9uID0gKDEgPDwgMjApLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9hbHRlcm5hdGVUcmFuc3BvcnRBZGRyZXNzZXMgPSAoMSA8PCAxOSksCisJCWVSZWdpc3RyYXRpb25SZXF1ZXN0X2FkZGl0aXZlUmVnaXN0cmF0aW9uID0gKDEgPDwgMTgpLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF90ZXJtaW5hbEFsaWFzUGF0dGVybiA9ICgxIDw8IDE3KSwKKwkJZVJlZ2lzdHJhdGlvblJlcXVlc3Rfc3VwcG9ydHNBbHRHSyA9ICgxIDw8IDE2KSwKKwkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfdXNhZ2VSZXBvcnRpbmdDYXBhYmlsaXR5ID0gKDEgPDwgMTUpLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9tdWx0aXBsZUNhbGxzID0gKDEgPDwgMTQpLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9zdXBwb3J0ZWRIMjQ4UGFja2FnZXMgPSAoMSA8PCAxMyksCisJCWVSZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxDcmVkaXRDYXBhYmlsaXR5ID0gKDEgPDwgMTIpLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9jYXBhY2l0eVJlcG9ydGluZ0NhcGFiaWxpdHkgPSAoMSA8PCAxMSksCisJCWVSZWdpc3RyYXRpb25SZXF1ZXN0X2NhcGFjaXR5ID0gKDEgPDwgMTApLAorCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9mZWF0dXJlU2V0ID0gKDEgPDwgOSksCisJCWVSZWdpc3RyYXRpb25SZXF1ZXN0X2dlbmVyaWNEYXRhID0gKDEgPDwgOCksCisJfSBvcHRpb25zOworCVJlZ2lzdHJhdGlvblJlcXVlc3RfY2FsbFNpZ25hbEFkZHJlc3MgY2FsbFNpZ25hbEFkZHJlc3M7CisJUmVnaXN0cmF0aW9uUmVxdWVzdF9yYXNBZGRyZXNzIHJhc0FkZHJlc3M7CisJdW5zaWduZWQgdGltZVRvTGl2ZTsKK30gUmVnaXN0cmF0aW9uUmVxdWVzdDsKKwordHlwZWRlZiBzdHJ1Y3QgUmVnaXN0cmF0aW9uQ29uZmlybV9jYWxsU2lnbmFsQWRkcmVzcyB7CS8qIFNFUVVFTkNFIE9GICovCisJaW50IGNvdW50OworCVRyYW5zcG9ydEFkZHJlc3MgaXRlbVsxMF07Cit9IFJlZ2lzdHJhdGlvbkNvbmZpcm1fY2FsbFNpZ25hbEFkZHJlc3M7CisKK3R5cGVkZWYgc3RydWN0IFJlZ2lzdHJhdGlvbkNvbmZpcm0gewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllUmVnaXN0cmF0aW9uQ29uZmlybV9ub25TdGFuZGFyZERhdGEgPSAoMSA8PCAzMSksCisJCWVSZWdpc3RyYXRpb25Db25maXJtX3Rlcm1pbmFsQWxpYXMgPSAoMSA8PCAzMCksCisJCWVSZWdpc3RyYXRpb25Db25maXJtX2dhdGVrZWVwZXJJZGVudGlmaWVyID0gKDEgPDwgMjkpLAorCQllUmVnaXN0cmF0aW9uQ29uZmlybV9hbHRlcm5hdGVHYXRla2VlcGVyID0gKDEgPDwgMjgpLAorCQllUmVnaXN0cmF0aW9uQ29uZmlybV90aW1lVG9MaXZlID0gKDEgPDwgMjcpLAorCQllUmVnaXN0cmF0aW9uQ29uZmlybV90b2tlbnMgPSAoMSA8PCAyNiksCisJCWVSZWdpc3RyYXRpb25Db25maXJtX2NyeXB0b1Rva2VucyA9ICgxIDw8IDI1KSwKKwkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1faW50ZWdyaXR5Q2hlY2tWYWx1ZSA9ICgxIDw8IDI0KSwKKwkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fd2lsbFJlc3BvbmRUb0lSUiA9ICgxIDw8IDIzKSwKKwkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fcHJlR3JhbnRlZEFSUSA9ICgxIDw8IDIyKSwKKwkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fbWFpbnRhaW5Db25uZWN0aW9uID0gKDEgPDwgMjEpLAorCQllUmVnaXN0cmF0aW9uQ29uZmlybV9zZXJ2aWNlQ29udHJvbCA9ICgxIDw8IDIwKSwKKwkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fc3VwcG9ydHNBZGRpdGl2ZVJlZ2lzdHJhdGlvbiA9ICgxIDw8IDE5KSwKKwkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fdGVybWluYWxBbGlhc1BhdHRlcm4gPSAoMSA8PCAxOCksCisJCWVSZWdpc3RyYXRpb25Db25maXJtX3N1cHBvcnRlZFByZWZpeGVzID0gKDEgPDwgMTcpLAorCQllUmVnaXN0cmF0aW9uQ29uZmlybV91c2FnZVNwZWMgPSAoMSA8PCAxNiksCisJCWVSZWdpc3RyYXRpb25Db25maXJtX2ZlYXR1cmVTZXJ2ZXJBbGlhcyA9ICgxIDw8IDE1KSwKKwkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fY2FwYWNpdHlSZXBvcnRpbmdTcGVjID0gKDEgPDwgMTQpLAorCQllUmVnaXN0cmF0aW9uQ29uZmlybV9mZWF0dXJlU2V0ID0gKDEgPDwgMTMpLAorCQllUmVnaXN0cmF0aW9uQ29uZmlybV9nZW5lcmljRGF0YSA9ICgxIDw8IDEyKSwKKwl9IG9wdGlvbnM7CisJUmVnaXN0cmF0aW9uQ29uZmlybV9jYWxsU2lnbmFsQWRkcmVzcyBjYWxsU2lnbmFsQWRkcmVzczsKKwl1bnNpZ25lZCB0aW1lVG9MaXZlOworfSBSZWdpc3RyYXRpb25Db25maXJtOworCit0eXBlZGVmIHN0cnVjdCBVbnJlZ2lzdHJhdGlvblJlcXVlc3RfY2FsbFNpZ25hbEFkZHJlc3MgewkvKiBTRVFVRU5DRSBPRiAqLworCWludCBjb3VudDsKKwlUcmFuc3BvcnRBZGRyZXNzIGl0ZW1bMTBdOworfSBVbnJlZ2lzdHJhdGlvblJlcXVlc3RfY2FsbFNpZ25hbEFkZHJlc3M7CisKK3R5cGVkZWYgc3RydWN0IFVucmVnaXN0cmF0aW9uUmVxdWVzdCB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVVbnJlZ2lzdHJhdGlvblJlcXVlc3RfZW5kcG9pbnRBbGlhcyA9ICgxIDw8IDMxKSwKKwkJZVVucmVnaXN0cmF0aW9uUmVxdWVzdF9ub25TdGFuZGFyZERhdGEgPSAoMSA8PCAzMCksCisJCWVVbnJlZ2lzdHJhdGlvblJlcXVlc3RfZW5kcG9pbnRJZGVudGlmaWVyID0gKDEgPDwgMjkpLAorCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2FsdGVybmF0ZUVuZHBvaW50cyA9ICgxIDw8IDI4KSwKKwkJZVVucmVnaXN0cmF0aW9uUmVxdWVzdF9nYXRla2VlcGVySWRlbnRpZmllciA9ICgxIDw8IDI3KSwKKwkJZVVucmVnaXN0cmF0aW9uUmVxdWVzdF90b2tlbnMgPSAoMSA8PCAyNiksCisJCWVVbnJlZ2lzdHJhdGlvblJlcXVlc3RfY3J5cHRvVG9rZW5zID0gKDEgPDwgMjUpLAorCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAyNCksCisJCWVVbnJlZ2lzdHJhdGlvblJlcXVlc3RfcmVhc29uID0gKDEgPDwgMjMpLAorCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2VuZHBvaW50QWxpYXNQYXR0ZXJuID0gKDEgPDwgMjIpLAorCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X3N1cHBvcnRlZFByZWZpeGVzID0gKDEgPDwgMjEpLAorCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2FsdGVybmF0ZUdhdGVrZWVwZXIgPSAoMSA8PCAyMCksCisJCWVVbnJlZ2lzdHJhdGlvblJlcXVlc3RfZ2VuZXJpY0RhdGEgPSAoMSA8PCAxOSksCisJfSBvcHRpb25zOworCVVucmVnaXN0cmF0aW9uUmVxdWVzdF9jYWxsU2lnbmFsQWRkcmVzcyBjYWxsU2lnbmFsQWRkcmVzczsKK30gVW5yZWdpc3RyYXRpb25SZXF1ZXN0OworCit0eXBlZGVmIHN0cnVjdCBBZG1pc3Npb25SZXF1ZXN0IHsJLyogU0VRVUVOQ0UgKi8KKwllbnVtIHsKKwkJZUFkbWlzc2lvblJlcXVlc3RfY2FsbE1vZGVsID0gKDEgPDwgMzEpLAorCQllQWRtaXNzaW9uUmVxdWVzdF9kZXN0aW5hdGlvbkluZm8gPSAoMSA8PCAzMCksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2Rlc3RDYWxsU2lnbmFsQWRkcmVzcyA9ICgxIDw8IDI5KSwKKwkJZUFkbWlzc2lvblJlcXVlc3RfZGVzdEV4dHJhQ2FsbEluZm8gPSAoMSA8PCAyOCksCisJCWVBZG1pc3Npb25SZXF1ZXN0X3NyY0NhbGxTaWduYWxBZGRyZXNzID0gKDEgPDwgMjcpLAorCQllQWRtaXNzaW9uUmVxdWVzdF9ub25TdGFuZGFyZERhdGEgPSAoMSA8PCAyNiksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2NhbGxTZXJ2aWNlcyA9ICgxIDw8IDI1KSwKKwkJZUFkbWlzc2lvblJlcXVlc3RfY2FuTWFwQWxpYXMgPSAoMSA8PCAyNCksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2NhbGxJZGVudGlmaWVyID0gKDEgPDwgMjMpLAorCQllQWRtaXNzaW9uUmVxdWVzdF9zcmNBbHRlcm5hdGl2ZXMgPSAoMSA8PCAyMiksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2Rlc3RBbHRlcm5hdGl2ZXMgPSAoMSA8PCAyMSksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2dhdGVrZWVwZXJJZGVudGlmaWVyID0gKDEgPDwgMjApLAorCQllQWRtaXNzaW9uUmVxdWVzdF90b2tlbnMgPSAoMSA8PCAxOSksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2NyeXB0b1Rva2VucyA9ICgxIDw8IDE4KSwKKwkJZUFkbWlzc2lvblJlcXVlc3RfaW50ZWdyaXR5Q2hlY2tWYWx1ZSA9ICgxIDw8IDE3KSwKKwkJZUFkbWlzc2lvblJlcXVlc3RfdHJhbnNwb3J0UU9TID0gKDEgPDwgMTYpLAorCQllQWRtaXNzaW9uUmVxdWVzdF93aWxsU3VwcGx5VVVJRXMgPSAoMSA8PCAxNSksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2NhbGxMaW5rYWdlID0gKDEgPDwgMTQpLAorCQllQWRtaXNzaW9uUmVxdWVzdF9nYXRld2F5RGF0YVJhdGUgPSAoMSA8PCAxMyksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2NhcGFjaXR5ID0gKDEgPDwgMTIpLAorCQllQWRtaXNzaW9uUmVxdWVzdF9jaXJjdWl0SW5mbyA9ICgxIDw8IDExKSwKKwkJZUFkbWlzc2lvblJlcXVlc3RfZGVzaXJlZFByb3RvY29scyA9ICgxIDw8IDEwKSwKKwkJZUFkbWlzc2lvblJlcXVlc3RfZGVzaXJlZFR1bm5lbGxlZFByb3RvY29sID0gKDEgPDwgOSksCisJCWVBZG1pc3Npb25SZXF1ZXN0X2ZlYXR1cmVTZXQgPSAoMSA8PCA4KSwKKwkJZUFkbWlzc2lvblJlcXVlc3RfZ2VuZXJpY0RhdGEgPSAoMSA8PCA3KSwKKwl9IG9wdGlvbnM7CisJVHJhbnNwb3J0QWRkcmVzcyBkZXN0Q2FsbFNpZ25hbEFkZHJlc3M7CisJVHJhbnNwb3J0QWRkcmVzcyBzcmNDYWxsU2lnbmFsQWRkcmVzczsKK30gQWRtaXNzaW9uUmVxdWVzdDsKKwordHlwZWRlZiBzdHJ1Y3QgQWRtaXNzaW9uQ29uZmlybSB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVBZG1pc3Npb25Db25maXJtX2lyckZyZXF1ZW5jeSA9ICgxIDw8IDMxKSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMzApLAorCQllQWRtaXNzaW9uQ29uZmlybV9kZXN0aW5hdGlvbkluZm8gPSAoMSA8PCAyOSksCisJCWVBZG1pc3Npb25Db25maXJtX2Rlc3RFeHRyYUNhbGxJbmZvID0gKDEgPDwgMjgpLAorCQllQWRtaXNzaW9uQ29uZmlybV9kZXN0aW5hdGlvblR5cGUgPSAoMSA8PCAyNyksCisJCWVBZG1pc3Npb25Db25maXJtX3JlbW90ZUV4dGVuc2lvbkFkZHJlc3MgPSAoMSA8PCAyNiksCisJCWVBZG1pc3Npb25Db25maXJtX2FsdGVybmF0ZUVuZHBvaW50cyA9ICgxIDw8IDI1KSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fdG9rZW5zID0gKDEgPDwgMjQpLAorCQllQWRtaXNzaW9uQ29uZmlybV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyMyksCisJCWVBZG1pc3Npb25Db25maXJtX2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAyMiksCisJCWVBZG1pc3Npb25Db25maXJtX3RyYW5zcG9ydFFPUyA9ICgxIDw8IDIxKSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fd2lsbFJlc3BvbmRUb0lSUiA9ICgxIDw8IDIwKSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fdXVpZXNSZXF1ZXN0ZWQgPSAoMSA8PCAxOSksCisJCWVBZG1pc3Npb25Db25maXJtX2xhbmd1YWdlID0gKDEgPDwgMTgpLAorCQllQWRtaXNzaW9uQ29uZmlybV9hbHRlcm5hdGVUcmFuc3BvcnRBZGRyZXNzZXMgPSAoMSA8PCAxNyksCisJCWVBZG1pc3Npb25Db25maXJtX3VzZVNwZWNpZmllZFRyYW5zcG9ydCA9ICgxIDw8IDE2KSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fY2lyY3VpdEluZm8gPSAoMSA8PCAxNSksCisJCWVBZG1pc3Npb25Db25maXJtX3VzYWdlU3BlYyA9ICgxIDw8IDE0KSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fc3VwcG9ydGVkUHJvdG9jb2xzID0gKDEgPDwgMTMpLAorCQllQWRtaXNzaW9uQ29uZmlybV9zZXJ2aWNlQ29udHJvbCA9ICgxIDw8IDEyKSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fbXVsdGlwbGVDYWxscyA9ICgxIDw8IDExKSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fZmVhdHVyZVNldCA9ICgxIDw8IDEwKSwKKwkJZUFkbWlzc2lvbkNvbmZpcm1fZ2VuZXJpY0RhdGEgPSAoMSA8PCA5KSwKKwl9IG9wdGlvbnM7CisJVHJhbnNwb3J0QWRkcmVzcyBkZXN0Q2FsbFNpZ25hbEFkZHJlc3M7Cit9IEFkbWlzc2lvbkNvbmZpcm07CisKK3R5cGVkZWYgc3RydWN0IExvY2F0aW9uUmVxdWVzdCB7CS8qIFNFUVVFTkNFICovCisJZW51bSB7CisJCWVMb2NhdGlvblJlcXVlc3RfZW5kcG9pbnRJZGVudGlmaWVyID0gKDEgPDwgMzEpLAorCQllTG9jYXRpb25SZXF1ZXN0X25vblN0YW5kYXJkRGF0YSA9ICgxIDw8IDMwKSwKKwkJZUxvY2F0aW9uUmVxdWVzdF9zb3VyY2VJbmZvID0gKDEgPDwgMjkpLAorCQllTG9jYXRpb25SZXF1ZXN0X2Nhbk1hcEFsaWFzID0gKDEgPDwgMjgpLAorCQllTG9jYXRpb25SZXF1ZXN0X2dhdGVrZWVwZXJJZGVudGlmaWVyID0gKDEgPDwgMjcpLAorCQllTG9jYXRpb25SZXF1ZXN0X3Rva2VucyA9ICgxIDw8IDI2KSwKKwkJZUxvY2F0aW9uUmVxdWVzdF9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNSksCisJCWVMb2NhdGlvblJlcXVlc3RfaW50ZWdyaXR5Q2hlY2tWYWx1ZSA9ICgxIDw8IDI0KSwKKwkJZUxvY2F0aW9uUmVxdWVzdF9kZXNpcmVkUHJvdG9jb2xzID0gKDEgPDwgMjMpLAorCQllTG9jYXRpb25SZXF1ZXN0X2Rlc2lyZWRUdW5uZWxsZWRQcm90b2NvbCA9ICgxIDw8IDIyKSwKKwkJZUxvY2F0aW9uUmVxdWVzdF9mZWF0dXJlU2V0ID0gKDEgPDwgMjEpLAorCQllTG9jYXRpb25SZXF1ZXN0X2dlbmVyaWNEYXRhID0gKDEgPDwgMjApLAorCQllTG9jYXRpb25SZXF1ZXN0X2hvcENvdW50ID0gKDEgPDwgMTkpLAorCQllTG9jYXRpb25SZXF1ZXN0X2NpcmN1aXRJbmZvID0gKDEgPDwgMTgpLAorCX0gb3B0aW9uczsKKwlUcmFuc3BvcnRBZGRyZXNzIHJlcGx5QWRkcmVzczsKK30gTG9jYXRpb25SZXF1ZXN0OworCit0eXBlZGVmIHN0cnVjdCBMb2NhdGlvbkNvbmZpcm0gewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllTG9jYXRpb25Db25maXJtX25vblN0YW5kYXJkRGF0YSA9ICgxIDw8IDMxKSwKKwkJZUxvY2F0aW9uQ29uZmlybV9kZXN0aW5hdGlvbkluZm8gPSAoMSA8PCAzMCksCisJCWVMb2NhdGlvbkNvbmZpcm1fZGVzdEV4dHJhQ2FsbEluZm8gPSAoMSA8PCAyOSksCisJCWVMb2NhdGlvbkNvbmZpcm1fZGVzdGluYXRpb25UeXBlID0gKDEgPDwgMjgpLAorCQllTG9jYXRpb25Db25maXJtX3JlbW90ZUV4dGVuc2lvbkFkZHJlc3MgPSAoMSA8PCAyNyksCisJCWVMb2NhdGlvbkNvbmZpcm1fYWx0ZXJuYXRlRW5kcG9pbnRzID0gKDEgPDwgMjYpLAorCQllTG9jYXRpb25Db25maXJtX3Rva2VucyA9ICgxIDw8IDI1KSwKKwkJZUxvY2F0aW9uQ29uZmlybV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNCksCisJCWVMb2NhdGlvbkNvbmZpcm1faW50ZWdyaXR5Q2hlY2tWYWx1ZSA9ICgxIDw8IDIzKSwKKwkJZUxvY2F0aW9uQ29uZmlybV9hbHRlcm5hdGVUcmFuc3BvcnRBZGRyZXNzZXMgPSAoMSA8PCAyMiksCisJCWVMb2NhdGlvbkNvbmZpcm1fc3VwcG9ydGVkUHJvdG9jb2xzID0gKDEgPDwgMjEpLAorCQllTG9jYXRpb25Db25maXJtX211bHRpcGxlQ2FsbHMgPSAoMSA8PCAyMCksCisJCWVMb2NhdGlvbkNvbmZpcm1fZmVhdHVyZVNldCA9ICgxIDw8IDE5KSwKKwkJZUxvY2F0aW9uQ29uZmlybV9nZW5lcmljRGF0YSA9ICgxIDw8IDE4KSwKKwkJZUxvY2F0aW9uQ29uZmlybV9jaXJjdWl0SW5mbyA9ICgxIDw8IDE3KSwKKwkJZUxvY2F0aW9uQ29uZmlybV9zZXJ2aWNlQ29udHJvbCA9ICgxIDw8IDE2KSwKKwl9IG9wdGlvbnM7CisJVHJhbnNwb3J0QWRkcmVzcyBjYWxsU2lnbmFsQWRkcmVzczsKKwlUcmFuc3BvcnRBZGRyZXNzIHJhc0FkZHJlc3M7Cit9IExvY2F0aW9uQ29uZmlybTsKKwordHlwZWRlZiBzdHJ1Y3QgSW5mb1JlcXVlc3RSZXNwb25zZV9jYWxsU2lnbmFsQWRkcmVzcyB7CS8qIFNFUVVFTkNFIE9GICovCisJaW50IGNvdW50OworCVRyYW5zcG9ydEFkZHJlc3MgaXRlbVsxMF07Cit9IEluZm9SZXF1ZXN0UmVzcG9uc2VfY2FsbFNpZ25hbEFkZHJlc3M7CisKK3R5cGVkZWYgc3RydWN0IEluZm9SZXF1ZXN0UmVzcG9uc2UgewkvKiBTRVFVRU5DRSAqLworCWVudW0geworCQllSW5mb1JlcXVlc3RSZXNwb25zZV9ub25TdGFuZGFyZERhdGEgPSAoMSA8PCAzMSksCisJCWVJbmZvUmVxdWVzdFJlc3BvbnNlX2VuZHBvaW50QWxpYXMgPSAoMSA8PCAzMCksCisJCWVJbmZvUmVxdWVzdFJlc3BvbnNlX3BlckNhbGxJbmZvID0gKDEgPDwgMjkpLAorCQllSW5mb1JlcXVlc3RSZXNwb25zZV90b2tlbnMgPSAoMSA8PCAyOCksCisJCWVJbmZvUmVxdWVzdFJlc3BvbnNlX2NyeXB0b1Rva2VucyA9ICgxIDw8IDI3KSwKKwkJZUluZm9SZXF1ZXN0UmVzcG9uc2VfaW50ZWdyaXR5Q2hlY2tWYWx1ZSA9ICgxIDw8IDI2KSwKKwkJZUluZm9SZXF1ZXN0UmVzcG9uc2VfbmVlZFJlc3BvbnNlID0gKDEgPDwgMjUpLAorCQllSW5mb1JlcXVlc3RSZXNwb25zZV9jYXBhY2l0eSA9ICgxIDw8IDI0KSwKKwkJZUluZm9SZXF1ZXN0UmVzcG9uc2VfaXJyU3RhdHVzID0gKDEgPDwgMjMpLAorCQllSW5mb1JlcXVlc3RSZXNwb25zZV91bnNvbGljaXRlZCA9ICgxIDw8IDIyKSwKKwkJZUluZm9SZXF1ZXN0UmVzcG9uc2VfZ2VuZXJpY0RhdGEgPSAoMSA8PCAyMSksCisJfSBvcHRpb25zOworCVRyYW5zcG9ydEFkZHJlc3MgcmFzQWRkcmVzczsKKwlJbmZvUmVxdWVzdFJlc3BvbnNlX2NhbGxTaWduYWxBZGRyZXNzIGNhbGxTaWduYWxBZGRyZXNzOworfSBJbmZvUmVxdWVzdFJlc3BvbnNlOworCit0eXBlZGVmIHN0cnVjdCBSYXNNZXNzYWdlIHsJLyogQ0hPSUNFICovCisJZW51bSB7CisJCWVSYXNNZXNzYWdlX2dhdGVrZWVwZXJSZXF1ZXN0LAorCQllUmFzTWVzc2FnZV9nYXRla2VlcGVyQ29uZmlybSwKKwkJZVJhc01lc3NhZ2VfZ2F0ZWtlZXBlclJlamVjdCwKKwkJZVJhc01lc3NhZ2VfcmVnaXN0cmF0aW9uUmVxdWVzdCwKKwkJZVJhc01lc3NhZ2VfcmVnaXN0cmF0aW9uQ29uZmlybSwKKwkJZVJhc01lc3NhZ2VfcmVnaXN0cmF0aW9uUmVqZWN0LAorCQllUmFzTWVzc2FnZV91bnJlZ2lzdHJhdGlvblJlcXVlc3QsCisJCWVSYXNNZXNzYWdlX3VucmVnaXN0cmF0aW9uQ29uZmlybSwKKwkJZVJhc01lc3NhZ2VfdW5yZWdpc3RyYXRpb25SZWplY3QsCisJCWVSYXNNZXNzYWdlX2FkbWlzc2lvblJlcXVlc3QsCisJCWVSYXNNZXNzYWdlX2FkbWlzc2lvbkNvbmZpcm0sCisJCWVSYXNNZXNzYWdlX2FkbWlzc2lvblJlamVjdCwKKwkJZVJhc01lc3NhZ2VfYmFuZHdpZHRoUmVxdWVzdCwKKwkJZVJhc01lc3NhZ2VfYmFuZHdpZHRoQ29uZmlybSwKKwkJZVJhc01lc3NhZ2VfYmFuZHdpZHRoUmVqZWN0LAorCQllUmFzTWVzc2FnZV9kaXNlbmdhZ2VSZXF1ZXN0LAorCQllUmFzTWVzc2FnZV9kaXNlbmdhZ2VDb25maXJtLAorCQllUmFzTWVzc2FnZV9kaXNlbmdhZ2VSZWplY3QsCisJCWVSYXNNZXNzYWdlX2xvY2F0aW9uUmVxdWVzdCwKKwkJZVJhc01lc3NhZ2VfbG9jYXRpb25Db25maXJtLAorCQllUmFzTWVzc2FnZV9sb2NhdGlvblJlamVjdCwKKwkJZVJhc01lc3NhZ2VfaW5mb1JlcXVlc3QsCisJCWVSYXNNZXNzYWdlX2luZm9SZXF1ZXN0UmVzcG9uc2UsCisJCWVSYXNNZXNzYWdlX25vblN0YW5kYXJkTWVzc2FnZSwKKwkJZVJhc01lc3NhZ2VfdW5rbm93bk1lc3NhZ2VSZXNwb25zZSwKKwkJZVJhc01lc3NhZ2VfcmVxdWVzdEluUHJvZ3Jlc3MsCisJCWVSYXNNZXNzYWdlX3Jlc291cmNlc0F2YWlsYWJsZUluZGljYXRlLAorCQllUmFzTWVzc2FnZV9yZXNvdXJjZXNBdmFpbGFibGVDb25maXJtLAorCQllUmFzTWVzc2FnZV9pbmZvUmVxdWVzdEFjaywKKwkJZVJhc01lc3NhZ2VfaW5mb1JlcXVlc3ROYWssCisJCWVSYXNNZXNzYWdlX3NlcnZpY2VDb250cm9sSW5kaWNhdGlvbiwKKwkJZVJhc01lc3NhZ2Vfc2VydmljZUNvbnRyb2xSZXNwb25zZSwKKwl9IGNob2ljZTsKKwl1bmlvbiB7CisJCUdhdGVrZWVwZXJSZXF1ZXN0IGdhdGVrZWVwZXJSZXF1ZXN0OworCQlHYXRla2VlcGVyQ29uZmlybSBnYXRla2VlcGVyQ29uZmlybTsKKwkJUmVnaXN0cmF0aW9uUmVxdWVzdCByZWdpc3RyYXRpb25SZXF1ZXN0OworCQlSZWdpc3RyYXRpb25Db25maXJtIHJlZ2lzdHJhdGlvbkNvbmZpcm07CisJCVVucmVnaXN0cmF0aW9uUmVxdWVzdCB1bnJlZ2lzdHJhdGlvblJlcXVlc3Q7CisJCUFkbWlzc2lvblJlcXVlc3QgYWRtaXNzaW9uUmVxdWVzdDsKKwkJQWRtaXNzaW9uQ29uZmlybSBhZG1pc3Npb25Db25maXJtOworCQlMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0OworCQlMb2NhdGlvbkNvbmZpcm0gbG9jYXRpb25Db25maXJtOworCQlJbmZvUmVxdWVzdFJlc3BvbnNlIGluZm9SZXF1ZXN0UmVzcG9uc2U7CisJfTsKK30gUmFzTWVzc2FnZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWI2YjgyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2lyYy5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19JUkNfSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX0lSQ19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgSVJDX1BPUlQJNjY2NworCitleHRlcm4gdW5zaWduZWQgaW50ICgqbmZfbmF0X2lyY19ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19JUkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4MTQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qIFBQVFAgY29uc3RhbnRzIGFuZCBzdHJ1Y3RzICovCisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfUFBUUF9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfUFBUUF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oPgorCisvKiBzdGF0ZSBvZiB0aGUgY29udHJvbCBzZXNzaW9uICovCitlbnVtIHBwdHBfY3RybHNlc3Nfc3RhdGUgeworCVBQVFBfU0VTU0lPTl9OT05FLAkJCS8qIG5vIHNlc3Npb24gcHJlc2VudCAqLworCVBQVFBfU0VTU0lPTl9FUlJPUiwJCQkvKiBzb21lIHNlc3Npb24gZXJyb3IgKi8KKwlQUFRQX1NFU1NJT05fU1RPUFJFUSwJCQkvKiBzdG9wX3Nlc3MgcmVxdWVzdCBzZWVuICovCisJUFBUUF9TRVNTSU9OX1JFUVVFU1RFRCwJCQkvKiBzdGFydF9zZXNzIHJlcXVlc3Qgc2VlbiAqLworCVBQVFBfU0VTU0lPTl9DT05GSVJNRUQsCQkJLyogc2Vzc2lvbiBlc3RhYmxpc2hlZCAqLworfTsKKworLyogc3RhdGUgb2YgdGhlIGNhbGwgaW5zaWRlIHRoZSBjb250cm9sIHNlc3Npb24gKi8KK2VudW0gcHB0cF9jdHJsY2FsbF9zdGF0ZSB7CisJUFBUUF9DQUxMX05PTkUsCisJUFBUUF9DQUxMX0VSUk9SLAorCVBQVFBfQ0FMTF9PVVRfUkVRLAorCVBQVFBfQ0FMTF9PVVRfQ09ORiwKKwlQUFRQX0NBTExfSU5fUkVRLAorCVBQVFBfQ0FMTF9JTl9SRVAsCisJUFBUUF9DQUxMX0lOX0NPTkYsCisJUFBUUF9DQUxMX0NMRUFSX1JFUSwKK307CisKKy8qIGNvbm50cmFjayBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCBuZl9jdF9wcHRwX21hc3RlciB7CisJZW51bSBwcHRwX2N0cmxzZXNzX3N0YXRlIHNzdGF0ZTsJLyogc2Vzc2lvbiBzdGF0ZSAqLworCWVudW0gcHB0cF9jdHJsY2FsbF9zdGF0ZSBjc3RhdGU7CS8qIGNhbGwgc3RhdGUgKi8KKwlfX2JlMTYgcGFjX2NhbGxfaWQ7CQkJLyogY2FsbCBpZCBvZiBQQUMgKi8KKwlfX2JlMTYgcG5zX2NhbGxfaWQ7CQkJLyogY2FsbCBpZCBvZiBQTlMgKi8KKworCS8qIGluIHByZS0yLjYuMTEgdGhpcyB1c2VkIHRvIGJlIHBlci1leHBlY3QuIE5vdyBpdCBpcyBwZXItY29ubnRyYWNrCisJICogYW5kIHRoZXJlZm9yZSBpbXBvc2VzIGEgZml4ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiBtYXBzICovCisJc3RydWN0IG5mX2N0X2dyZV9rZXltYXAgKmtleW1hcFtJUF9DVF9ESVJfTUFYXTsKK307CisKK3N0cnVjdCBuZl9uYXRfcHB0cCB7CisJX19iZTE2IHBuc19jYWxsX2lkOwkJCS8qIE5BVCdlZCBQTlMgY2FsbCBpZCAqLworCV9fYmUxNiBwYWNfY2FsbF9pZDsJCQkvKiBOQVQnZWQgUEFDIGNhbGwgaWQgKi8KK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgUFBUUF9DT05UUk9MX1BPUlQJMTcyMworCisjZGVmaW5lIFBQVFBfUEFDS0VUX0NPTlRST0wJMQorI2RlZmluZSBQUFRQX1BBQ0tFVF9NR01UCTIKKworI2RlZmluZSBQUFRQX01BR0lDX0NPT0tJRQkweDFhMmIzYzRkCisKK3N0cnVjdCBwcHRwX3BrdF9oZHIgeworCV9fdTE2CXBhY2tldExlbmd0aDsKKwlfX2JlMTYJcGFja2V0VHlwZTsKKwlfX2JlMzIJbWFnaWNDb29raWU7Cit9OworCisvKiBQcHRwQ29udHJvbE1lc3NhZ2VUeXBlIHZhbHVlcyAqLworI2RlZmluZSBQUFRQX1NUQVJUX1NFU1NJT05fUkVRVUVTVAkxCisjZGVmaW5lIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVBMWQkyCisjZGVmaW5lIFBQVFBfU1RPUF9TRVNTSU9OX1JFUVVFU1QJMworI2RlZmluZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVBMWQkJNAorI2RlZmluZSBQUFRQX0VDSE9fUkVRVUVTVAkJNQorI2RlZmluZSBQUFRQX0VDSE9fUkVQTFkJCQk2CisjZGVmaW5lIFBQVFBfT1VUX0NBTExfUkVRVUVTVAkJNworI2RlZmluZSBQUFRQX09VVF9DQUxMX1JFUExZCQk4CisjZGVmaW5lIFBQVFBfSU5fQ0FMTF9SRVFVRVNUCQk5CisjZGVmaW5lIFBQVFBfSU5fQ0FMTF9SRVBMWQkJMTAKKyNkZWZpbmUgUFBUUF9JTl9DQUxMX0NPTk5FQ1QJCTExCisjZGVmaW5lIFBQVFBfQ0FMTF9DTEVBUl9SRVFVRVNUCQkxMgorI2RlZmluZSBQUFRQX0NBTExfRElTQ09OTkVDVF9OT1RJRlkJMTMKKyNkZWZpbmUgUFBUUF9XQU5fRVJST1JfTk9USUZZCQkxNAorI2RlZmluZSBQUFRQX1NFVF9MSU5LX0lORk8JCTE1CisKKyNkZWZpbmUgUFBUUF9NU0dfTUFYCQkJMTUKKworLyogUHB0cEdlbmVyYWxFcnJvciB2YWx1ZXMgKi8KKyNkZWZpbmUgUFBUUF9FUlJPUl9DT0RFX05PTkUJCTAKKyNkZWZpbmUgUFBUUF9OT1RfQ09OTkVDVEVECQkxCisjZGVmaW5lIFBQVFBfQkFEX0ZPUk1BVAkJCTIKKyNkZWZpbmUgUFBUUF9CQURfVkFMVUUJCQkzCisjZGVmaW5lIFBQVFBfTk9fUkVTT1VSQ0UJCTQKKyNkZWZpbmUgUFBUUF9CQURfQ0FMTElECQkJNQorI2RlZmluZSBQUFRQX1JFTU9WRV9ERVZJQ0VfRVJST1IJNgorCitzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgeworCV9fYmUxNgltZXNzYWdlVHlwZTsKKwlfX3UxNglyZXNlcnZlZDsKK307CisKKy8qIEZyYW1pbmdDYXBhYmlsaXR5IEJpdG1hcCBWYWx1ZXMgKi8KKyNkZWZpbmUgUFBUUF9GUkFNRV9DQVBfQVNZTkMJCTB4MQorI2RlZmluZSBQUFRQX0ZSQU1FX0NBUF9TWU5DCQkweDIKKworLyogQmVhcmVyQ2FwYWJpbGl0eSBCaXRtYXAgVmFsdWVzICovCisjZGVmaW5lIFBQVFBfQkVBUkVSX0NBUF9BTkFMT0cJCTB4MQorI2RlZmluZSBQUFRQX0JFQVJFUl9DQVBfRElHSVRBTAkJMHgyCisKK3N0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVxdWVzdCB7CisJX19iZTE2CXByb3RvY29sVmVyc2lvbjsKKwlfX3UxNglyZXNlcnZlZDE7CisJX19iZTMyCWZyYW1pbmdDYXBhYmlsaXR5OworCV9fYmUzMgliZWFyZXJDYXBhYmlsaXR5OworCV9fYmUxNgltYXhDaGFubmVsczsKKwlfX2JlMTYJZmlybXdhcmVSZXZpc2lvbjsKKwlfX3U4CWhvc3ROYW1lWzY0XTsKKwlfX3U4CXZlbmRvclN0cmluZ1s2NF07Cit9OworCisvKiBQcHRwU3RhcnRTZXNzaW9uUmVzdWx0Q29kZSBWYWx1ZXMgKi8KKyNkZWZpbmUgUFBUUF9TVEFSVF9PSwkJCTEKKyNkZWZpbmUgUFBUUF9TVEFSVF9HRU5FUkFMX0VSUk9SCTIKKyNkZWZpbmUgUFBUUF9TVEFSVF9BTFJFQURZX0NPTk5FQ1RFRAkzCisjZGVmaW5lIFBQVFBfU1RBUlRfTk9UX0FVVEhPUklaRUQJNAorI2RlZmluZSBQUFRQX1NUQVJUX1VOS05PV05fUFJPVE9DT0wJNQorCitzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcGx5IHsKKwlfX2JlMTYJcHJvdG9jb2xWZXJzaW9uOworCV9fdTgJcmVzdWx0Q29kZTsKKwlfX3U4CWdlbmVyYWxFcnJvckNvZGU7CisJX19iZTMyCWZyYW1pbmdDYXBhYmlsaXR5OworCV9fYmUzMgliZWFyZXJDYXBhYmlsaXR5OworCV9fYmUxNgltYXhDaGFubmVsczsKKwlfX2JlMTYJZmlybXdhcmVSZXZpc2lvbjsKKwlfX3U4CWhvc3ROYW1lWzY0XTsKKwlfX3U4CXZlbmRvclN0cmluZ1s2NF07Cit9OworCisvKiBQcHRwU3RvcFJlYXNvbnMgKi8KKyNkZWZpbmUgUFBUUF9TVE9QX05PTkUJCQkxCisjZGVmaW5lIFBQVFBfU1RPUF9QUk9UT0NPTAkJMgorI2RlZmluZSBQUFRQX1NUT1BfTE9DQUxfU0hVVERPV04JMworCitzdHJ1Y3QgUHB0cFN0b3BTZXNzaW9uUmVxdWVzdCB7CisJX191OAlyZWFzb247CisJX191OAlyZXNlcnZlZDE7CisJX191MTYJcmVzZXJ2ZWQyOworfTsKKworLyogUHB0cFN0b3BTZXNzaW9uUmVzdWx0Q29kZSAqLworI2RlZmluZSBQUFRQX1NUT1BfT0sJCQkxCisjZGVmaW5lIFBQVFBfU1RPUF9HRU5FUkFMX0VSUk9SCQkyCisKK3N0cnVjdCBQcHRwU3RvcFNlc3Npb25SZXBseSB7CisJX191OAlyZXN1bHRDb2RlOworCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKKwlfX3UxNglyZXNlcnZlZDE7Cit9OworCitzdHJ1Y3QgUHB0cEVjaG9SZXF1ZXN0IHsKKwlfX2JlMzIgaWRlbnROdW1iZXI7Cit9OworCisvKiBQcHRwRWNob1JlcGx5UmVzdWx0Q29kZSAqLworI2RlZmluZSBQUFRQX0VDSE9fT0sJCQkxCisjZGVmaW5lIFBQVFBfRUNIT19HRU5FUkFMX0VSUk9SCQkyCisKK3N0cnVjdCBQcHRwRWNob1JlcGx5IHsKKwlfX2JlMzIJaWRlbnROdW1iZXI7CisJX191OAlyZXN1bHRDb2RlOworCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKKwlfX3UxNglyZXNlcnZlZDsKK307CisKKy8qIFBwdHBGcmFtaW5nVHlwZSAqLworI2RlZmluZSBQUFRQX0FTWU5DX0ZSQU1JTkcJCTEKKyNkZWZpbmUgUFBUUF9TWU5DX0ZSQU1JTkcJCTIKKyNkZWZpbmUgUFBUUF9ET05UX0NBUkVfRlJBTUlORwkJMworCisvKiBQcHRwQ2FsbEJlYXJlclR5cGUgKi8KKyNkZWZpbmUgUFBUUF9BTkFMT0dfVFlQRQkJMQorI2RlZmluZSBQUFRQX0RJR0lUQUxfVFlQRQkJMgorI2RlZmluZSBQUFRQX0RPTlRfQ0FSRV9CRUFSRVJfVFlQRQkzCisKK3N0cnVjdCBQcHRwT3V0Q2FsbFJlcXVlc3QgeworCV9fYmUxNgljYWxsSUQ7CisJX19iZTE2CWNhbGxTZXJpYWxOdW1iZXI7CisJX19iZTMyCW1pbkJQUzsKKwlfX2JlMzIJbWF4QlBTOworCV9fYmUzMgliZWFyZXJUeXBlOworCV9fYmUzMglmcmFtaW5nVHlwZTsKKwlfX2JlMTYJcGFja2V0V2luZG93OworCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7CisJX19iZTE2CXBob25lTnVtYmVyTGVuZ3RoOworCV9fdTE2CXJlc2VydmVkMTsKKwlfX3U4CXBob25lTnVtYmVyWzY0XTsKKwlfX3U4CXN1YkFkZHJlc3NbNjRdOworfTsKKworLyogUHB0cENhbGxSZXN1bHRDb2RlICovCisjZGVmaW5lIFBQVFBfT1VUQ0FMTF9DT05ORUNUCQkxCisjZGVmaW5lIFBQVFBfT1VUQ0FMTF9HRU5FUkFMX0VSUk9SCTIKKyNkZWZpbmUgUFBUUF9PVVRDQUxMX05PX0NBUlJJRVIJCTMKKyNkZWZpbmUgUFBUUF9PVVRDQUxMX0JVU1kJCTQKKyNkZWZpbmUgUFBUUF9PVVRDQUxMX05PX0RJQUxfVE9ORQk1CisjZGVmaW5lIFBQVFBfT1VUQ0FMTF9USU1FT1VUCQk2CisjZGVmaW5lIFBQVFBfT1VUQ0FMTF9ET05UX0FDQ0VQVAk3CisKK3N0cnVjdCBQcHRwT3V0Q2FsbFJlcGx5IHsKKwlfX2JlMTYJY2FsbElEOworCV9fYmUxNglwZWVyc0NhbGxJRDsKKwlfX3U4CXJlc3VsdENvZGU7CisJX191OAlnZW5lcmFsRXJyb3JDb2RlOworCV9fYmUxNgljYXVzZUNvZGU7CisJX19iZTMyCWNvbm5lY3RTcGVlZDsKKwlfX2JlMTYJcGFja2V0V2luZG93OworCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7CisJX19iZTMyCXBoeXNDaGFubmVsSUQ7Cit9OworCitzdHJ1Y3QgUHB0cEluQ2FsbFJlcXVlc3QgeworCV9fYmUxNgljYWxsSUQ7CisJX19iZTE2CWNhbGxTZXJpYWxOdW1iZXI7CisJX19iZTMyCWNhbGxCZWFyZXJUeXBlOworCV9fYmUzMglwaHlzQ2hhbm5lbElEOworCV9fYmUxNglkaWFsZWROdW1iZXJMZW5ndGg7CisJX19iZTE2CWRpYWxpbmdOdW1iZXJMZW5ndGg7CisJX191OAlkaWFsZWROdW1iZXJbNjRdOworCV9fdTgJZGlhbGluZ051bWJlcls2NF07CisJX191OAlzdWJBZGRyZXNzWzY0XTsKK307CisKKy8qIFBwdHBJbkNhbGxSZXN1bHRDb2RlICovCisjZGVmaW5lIFBQVFBfSU5DQUxMX0FDQ0VQVAkJMQorI2RlZmluZSBQUFRQX0lOQ0FMTF9HRU5FUkFMX0VSUk9SCTIKKyNkZWZpbmUgUFBUUF9JTkNBTExfRE9OVF9BQ0NFUFQJCTMKKworc3RydWN0IFBwdHBJbkNhbGxSZXBseSB7CisJX19iZTE2CWNhbGxJRDsKKwlfX2JlMTYJcGVlcnNDYWxsSUQ7CisJX191OAlyZXN1bHRDb2RlOworCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKKwlfX2JlMTYJcGFja2V0V2luZG93OworCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7CisJX191MTYJcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgUHB0cEluQ2FsbENvbm5lY3RlZCB7CisJX19iZTE2CXBlZXJzQ2FsbElEOworCV9fdTE2CXJlc2VydmVkOworCV9fYmUzMgljb25uZWN0U3BlZWQ7CisJX19iZTE2CXBhY2tldFdpbmRvdzsKKwlfX2JlMTYJcGFja2V0UHJvY0RlbGF5OworCV9fYmUzMgljYWxsRnJhbWluZ1R5cGU7Cit9OworCitzdHJ1Y3QgUHB0cENsZWFyQ2FsbFJlcXVlc3QgeworCV9fYmUxNgljYWxsSUQ7CisJX191MTYJcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgUHB0cENhbGxEaXNjb25uZWN0Tm90aWZ5IHsKKwlfX2JlMTYJY2FsbElEOworCV9fdTgJcmVzdWx0Q29kZTsKKwlfX3U4CWdlbmVyYWxFcnJvckNvZGU7CisJX19iZTE2CWNhdXNlQ29kZTsKKwlfX3UxNglyZXNlcnZlZDsKKwlfX3U4CWNhbGxTdGF0aXN0aWNzWzEyOF07Cit9OworCitzdHJ1Y3QgUHB0cFdhbkVycm9yTm90aWZ5IHsKKwlfX2JlMTYJcGVlcnNDYWxsSUQ7CisJX191MTYJcmVzZXJ2ZWQ7CisJX19iZTMyCWNyY0Vycm9yczsKKwlfX2JlMzIJZnJhbWluZ0Vycm9yczsKKwlfX2JlMzIJaGFyZHdhcmVPdmVyUnVuczsKKwlfX2JlMzIJYnVmZmVyT3ZlclJ1bnM7CisJX19iZTMyCXRpbWVvdXRFcnJvcnM7CisJX19iZTMyCWFsaWdubWVudEVycm9yczsKK307CisKK3N0cnVjdCBQcHRwU2V0TGlua0luZm8geworCV9fYmUxNglwZWVyc0NhbGxJRDsKKwlfX3UxNglyZXNlcnZlZDsKKwlfX2JlMzIJc2VuZEFjY207CisJX19iZTMyCXJlY3ZBY2NtOworfTsKKwordW5pb24gcHB0cF9jdHJsX3VuaW9uIHsKKwlzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcXVlc3QJc3JlcTsKKwlzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcGx5CXNyZXA7CisJc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcXVlc3QJc3RyZXE7CisJc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcGx5CXN0cmVwOworCXN0cnVjdCBQcHRwT3V0Q2FsbFJlcXVlc3QJb2NyZXE7CisJc3RydWN0IFBwdHBPdXRDYWxsUmVwbHkJCW9jYWNrOworCXN0cnVjdCBQcHRwSW5DYWxsUmVxdWVzdAlpY3JlcTsKKwlzdHJ1Y3QgUHB0cEluQ2FsbFJlcGx5CQlpY2FjazsKKwlzdHJ1Y3QgUHB0cEluQ2FsbENvbm5lY3RlZAlpY2NvbjsKKwlzdHJ1Y3QgUHB0cENsZWFyQ2FsbFJlcXVlc3QJY2xycmVxOworCXN0cnVjdCBQcHRwQ2FsbERpc2Nvbm5lY3ROb3RpZnkgZGlzYzsKKwlzdHJ1Y3QgUHB0cFdhbkVycm9yTm90aWZ5CXdhbmVycjsKKwlzdHJ1Y3QgUHB0cFNldExpbmtJbmZvCQlzZXRsaW5rOworfTsKKworLyogY3JhcCBuZWVkZWQgZm9yIG5mX2Nvbm50cmFja19jb21wYXQuaCAqLworc3RydWN0IG5mX2Nvbm47CitzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdDsKKworZXh0ZXJuIGludAorKCpuZl9uYXRfcHB0cF9ob29rX291dGJvdW5kKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKKwkJCSAgICAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKTsKKworZXh0ZXJuIGludAorKCpuZl9uYXRfcHB0cF9ob29rX2luYm91bmQpKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKKwkJCSAgICB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpOworCitleHRlcm4gdm9pZAorKCpuZl9uYXRfcHB0cF9ob29rX2V4cF9ncmUpKHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHBfb3JpZywKKwkJCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwX3JlcGx5KTsKKworZXh0ZXJuIHZvaWQKKygqbmZfbmF0X3BwdHBfaG9va19leHBlY3Rmbikoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX1BQVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNmJiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmgKQEAgLTAsMCArMSwxMTIgQEAKKyNpZm5kZWYgX0NPTk5UUkFDS19QUk9UT19HUkVfSAorI2RlZmluZSBfQ09OTlRSQUNLX1BST1RPX0dSRV9ICisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBHUkUgUFJPVE9DT0wgSEVBREVSICovCisKKy8qIEdSRSBWZXJzaW9uIGZpZWxkICovCisjZGVmaW5lIEdSRV9WRVJTSU9OXzE3MDEJMHgwCisjZGVmaW5lIEdSRV9WRVJTSU9OX1BQVFAJMHgxCisKKy8qIEdSRSBQcm90b2NvbCBmaWVsZCAqLworI2RlZmluZSBHUkVfUFJPVE9DT0xfUFBUUAkweDg4MEIKKworLyogR1JFIEZsYWdzICovCisjZGVmaW5lIEdSRV9GTEFHX0MJCTB4ODAKKyNkZWZpbmUgR1JFX0ZMQUdfUgkJMHg0MAorI2RlZmluZSBHUkVfRkxBR19LCQkweDIwCisjZGVmaW5lIEdSRV9GTEFHX1MJCTB4MTAKKyNkZWZpbmUgR1JFX0ZMQUdfQQkJMHg4MAorCisjZGVmaW5lIEdSRV9JU19DKGYpCSgoZikmR1JFX0ZMQUdfQykKKyNkZWZpbmUgR1JFX0lTX1IoZikJKChmKSZHUkVfRkxBR19SKQorI2RlZmluZSBHUkVfSVNfSyhmKQkoKGYpJkdSRV9GTEFHX0spCisjZGVmaW5lIEdSRV9JU19TKGYpCSgoZikmR1JFX0ZMQUdfUykKKyNkZWZpbmUgR1JFX0lTX0EoZikJKChmKSZHUkVfRkxBR19BKQorCisvKiBHUkUgaXMgYSBtZXNzOiBGb3VyIGRpZmZlcmVudCBzdGFuZGFyZHMgKi8KK3N0cnVjdCBncmVfaGRyIHsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3UxNglyZWM6MywKKwkJc3JyOjEsCisJCXNlcToxLAorCQlrZXk6MSwKKwkJcm91dGluZzoxLAorCQljc3VtOjEsCisJCXZlcnNpb246MywKKwkJcmVzZXJ2ZWQ6NCwKKwkJYWNrOjE7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3UxNgljc3VtOjEsCisJCXJvdXRpbmc6MSwKKwkJa2V5OjEsCisJCXNlcToxLAorCQlzcnI6MSwKKwkJcmVjOjMsCisJCWFjazoxLAorCQlyZXNlcnZlZDo0LAorCQl2ZXJzaW9uOjM7CisjZWxzZQorI2Vycm9yICJBZGp1c3QgeW91ciA8YXNtL2J5dGVvcmRlci5oPiBkZWZpbmVzIgorI2VuZGlmCisJX19iZTE2CXByb3RvY29sOworfTsKKworLyogbW9kaWZpZWQgR1JFIGhlYWRlciBmb3IgUFBUUCAqLworc3RydWN0IGdyZV9oZHJfcHB0cCB7CisJX191OCAgIGZsYWdzOwkJLyogYml0ZmllbGQgKi8KKwlfX3U4ICAgdmVyc2lvbjsJCS8qIHNob3VsZCBiZSBHUkVfVkVSU0lPTl9QUFRQICovCisJX19iZTE2IHByb3RvY29sOwkvKiBzaG91bGQgYmUgR1JFX1BST1RPQ09MX1BQVFAgKi8KKwlfX2JlMTYgcGF5bG9hZF9sZW47CS8qIHNpemUgb2YgcHBwIHBheWxvYWQsIG5vdCBpbmMuIGdyZSBoZWFkZXIgKi8KKwlfX2JlMTYgY2FsbF9pZDsJCS8qIHBlZXIncyBjYWxsX2lkIGZvciB0aGlzIHNlc3Npb24gKi8KKwlfX2JlMzIgc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyLiAgUHJlc2VudCBpZiBTPT0xICovCisJX19iZTMyIGFjazsJCS8qIHNlcSBudW1iZXIgb2YgaGlnaGVzdCBwYWNrZXQgcmVjaWV2ZWQgYnkgKi8KKwkJCQkvKiAgc2VuZGVyIGluIHRoaXMgc2Vzc2lvbiAqLworfTsKKworc3RydWN0IG5mX2N0X2dyZSB7CisJdW5zaWduZWQgaW50IHN0cmVhbV90aW1lb3V0OworCXVuc2lnbmVkIGludCB0aW1lb3V0OworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgorCitzdHJ1Y3QgbmZfY29ubjsKKworLyogc3RydWN0dXJlIGZvciBvcmlnaW5hbCA8LT4gcmVwbHkga2V5bWFwICovCitzdHJ1Y3QgbmZfY3RfZ3JlX2tleW1hcCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7Cit9OworCisvKiBhZGQgbmV3IHR1cGxlLT5rZXlfcmVwbHkgcGFpciB0byBrZXltYXAgKi8KK2ludCBuZl9jdF9ncmVfa2V5bWFwX2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIsCisJCQkgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCk7CisKKy8qIGRlbGV0ZSBrZXltYXAgZW50cmllcyAqLwordm9pZCBuZl9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koc3RydWN0IG5mX2Nvbm4gKmN0KTsKKworLyogZ2V0IHBvaW50ZXIgdG8gZ3JlIGtleSwgaWYgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBfX2JlMzIgKmdyZV9rZXkoc3RydWN0IGdyZV9oZHIgKmdyZWgpCit7CisJaWYgKCFncmVoLT5rZXkpCisJCXJldHVybiBOVUxMOworCWlmIChncmVoLT5jc3VtIHx8IGdyZWgtPnJvdXRpbmcpCisJCXJldHVybiAoX19iZTMyICopKGdyZWgrc2l6ZW9mKCpncmVoKSs0KTsKKwlyZXR1cm4gKF9fYmUzMiAqKShncmVoK3NpemVvZigqZ3JlaCkpOworfQorCisvKiBnZXQgcG9pbnRlciBvdCBncmUgY3N1bSwgaWYgcHJlc2VudCAqLworc3RhdGljIGlubGluZSBfX3N1bTE2ICpncmVfY3N1bShzdHJ1Y3QgZ3JlX2hkciAqZ3JlaCkKK3sKKwlpZiAoIWdyZWgtPmNzdW0pCisJCXJldHVybiBOVUxMOworCXJldHVybiAoX19zdW0xNiAqKShncmVoK3NpemVvZigqZ3JlaCkpOworfQorCitleHRlcm4gdm9pZCBuZl9jdF9ncmVfa2V5bWFwX2ZsdXNoKHZvaWQpOworZXh0ZXJuIHZvaWQgbmZfbmF0X25lZWRfZ3JlKHZvaWQpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9DT05OVFJBQ0tfUFJPVE9fR1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2N0cC5oCmluZGV4IGI4OTk0ZDkuLjVjZjJjMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaApAQCAtMjAsNyArMjAsNyBAQAogewogCWVudW0gc2N0cF9jb25udHJhY2sgc3RhdGU7CiAKLQl1X2ludDMyX3QgdnRhZ1tJUF9DVF9ESVJfTUFYXTsKKwlfX2JlMzIgdnRhZ1tJUF9DVF9ESVJfTUFYXTsKIAl1X2ludDMyX3QgdHRhZ1tJUF9DVF9ESVJfTUFYXTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjdmMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgX19ORl9DT05OVFJBQ0tfU0lQX0hfXworI2RlZmluZSBfX05GX0NPTk5UUkFDS19TSVBfSF9fCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIFNJUF9QT1JUCTUwNjAKKyNkZWZpbmUgU0lQX1RJTUVPVVQJMzYwMAorCitlbnVtIHNpcF9oZWFkZXJfcG9zIHsKKwlQT1NfUkVHX1JFUV9VUkksCisJUE9TX1JFUV9VUkksCisJUE9TX0ZST00sCisJUE9TX1RPLAorCVBPU19WSUEsCisJUE9TX0NPTlRBQ1QsCisJUE9TX0NPTlRFTlQsCisJUE9TX01FRElBLAorCVBPU19PV05FUl9JUDQsCisJUE9TX0NPTk5FQ1RJT05fSVA0LAorCVBPU19PV05FUl9JUDYsCisJUE9TX0NPTk5FQ1RJT05fSVA2LAorCVBPU19TRFBfSEVBREVSLAorfTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCAoKm5mX25hdF9zaXBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgICAgICBjb25zdCBjaGFyICoqZHB0cik7CitleHRlcm4gdW5zaWduZWQgaW50ICgqbmZfbmF0X3NkcF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpkcHRyKTsKKworZXh0ZXJuIGludCBjdF9zaXBfZ2V0X2luZm8oc3RydWN0IG5mX2Nvbm4gKmN0LCBjb25zdCBjaGFyICpkcHRyLCBzaXplX3QgZGxlbiwKKwkJCSAgIHVuc2lnbmVkIGludCAqbWF0Y2hvZmYsIHVuc2lnbmVkIGludCAqbWF0Y2hsZW4sCisJCQkgICBlbnVtIHNpcF9oZWFkZXJfcG9zIHBvcyk7CitleHRlcm4gaW50IGN0X3NpcF9sbmxlbihjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpsaW1pdCk7CitleHRlcm4gY29uc3QgY2hhciAqY3Rfc2lwX3NlYXJjaChjb25zdCBjaGFyICpuZWVkbGUsIGNvbnN0IGNoYXIgKmhheXN0YWNrLAorCQkJCSBzaXplX3QgbmVlZGxlX2xlbiwgc2l6ZV90IGhheXN0YWNrX2xlbiwKKwkJCQkgaW50IGNhc2Vfc2Vuc2l0aXZlKTsKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19ORl9DT05OVFJBQ0tfU0lQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RmdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190ZnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3OWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190ZnRwLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX1RGVFBfSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX1RGVFBfSAorCisjZGVmaW5lIFRGVFBfUE9SVCA2OQorCitzdHJ1Y3QgdGZ0cGhkciB7CisJX19iZTE2IG9wY29kZTsKK307CisKKyNkZWZpbmUgVEZUUF9PUENPREVfUkVBRAkxCisjZGVmaW5lIFRGVFBfT1BDT0RFX1dSSVRFCTIKKyNkZWZpbmUgVEZUUF9PUENPREVfREFUQQkzCisjZGVmaW5lIFRGVFBfT1BDT0RFX0FDSwkJNAorI2RlZmluZSBURlRQX09QQ09ERV9FUlJPUgk1CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgKCpuZl9uYXRfdGZ0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOworCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19URlRQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKaW5kZXggNmQ4ZTNlNS4uMWU5YzgyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmgKQEAgLTc4LDcgKzc4LDcgQEAKIHN0cnVjdCBuZmdlbm1zZyB7CiAJdV9pbnQ4X3QgIG5mZ2VuX2ZhbWlseTsJCS8qIEFGX3h4eCAqLwogCXVfaW50OF90ICB2ZXJzaW9uOwkJLyogbmZuZXRsaW5rIHZlcnNpb24gKi8KLQl1X2ludDE2X3QgcmVzX2lkOwkJLyogcmVzb3VyY2UgaWQgKi8KKwlfX2JlMTYgICAgcmVzX2lkOwkJLyogcmVzb3VyY2UgaWQgKi8KIH07CiAKICNkZWZpbmUgTkZORVRMSU5LX1YwCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaAppbmRleCA4N2I5MmY4Li41OTY2YWZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5oCkBAIC0xNiwyNCArMTYsMjIgQEAKIH07CiAKIHN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9oZHIgewotCXVfaW50MTZfdAlod19wcm90b2NvbDsJLyogaHcgcHJvdG9jb2wgKG5ldHdvcmsgb3JkZXIpICovCisJX19iZTE2CQlod19wcm90b2NvbDsJLyogaHcgcHJvdG9jb2wgKG5ldHdvcmsgb3JkZXIpICovCiAJdV9pbnQ4X3QJaG9vazsJCS8qIG5ldGZpbHRlciBob29rICovCiAJdV9pbnQ4X3QJX3BhZDsKIH07CiAKIHN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9odyB7Ci0JdV9pbnQxNl90CWh3X2FkZHJsZW47CisJX19iZTE2CQlod19hZGRybGVuOwogCXVfaW50MTZfdAlfcGFkOwogCXVfaW50OF90CWh3X2FkZHJbOF07CiB9OwogCiBzdHJ1Y3QgbmZ1bG5sX21zZ19wYWNrZXRfdGltZXN0YW1wIHsKLQlhbGlnbmVkX3U2NAlzZWM7Ci0JYWxpZ25lZF91NjQJdXNlYzsKKwlhbGlnbmVkX2JlNjQJc2VjOworCWFsaWduZWRfYmU2NAl1c2VjOwogfTsKIAotI2RlZmluZSBORlVMTkxfUFJFRklYTEVOCTMwCS8qIGp1c3QgbGlrZSBvbGQgbG9nIHRhcmdldCAqLwotCiBlbnVtIG5mdWxubF9hdHRyX3R5cGUgewogCU5GVUxBX1VOU1BFQywKIAlORlVMQV9QQUNLRVRfSERSLApAQCAtNjcsNyArNjUsNyBAQAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBuZnVsbmxfbXNnX2NvbmZpZ19tb2RlIHsKLQl1X2ludDMyX3QJY29weV9yYW5nZTsKKwlfX2JlMzIJCWNvcHlfcmFuZ2U7CiAJdV9pbnQ4X3QJY29weV9tb2RlOwogCXVfaW50OF90CV9wYWQ7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmgKaW5kZXggMzZhZjAzNi4uODNlNzg5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmgKQEAgLTEzLDIwICsxMywyMCBAQAogfTsKIAogc3RydWN0IG5mcW5sX21zZ19wYWNrZXRfaGRyIHsKLQl1X2ludDMyX3QJcGFja2V0X2lkOwkvKiB1bmlxdWUgSUQgb2YgcGFja2V0IGluIHF1ZXVlICovCi0JdV9pbnQxNl90CWh3X3Byb3RvY29sOwkvKiBodyBwcm90b2NvbCAobmV0d29yayBvcmRlcikgKi8KKwlfX2JlMzIJCXBhY2tldF9pZDsJLyogdW5pcXVlIElEIG9mIHBhY2tldCBpbiBxdWV1ZSAqLworCV9fYmUxNgkJaHdfcHJvdG9jb2w7CS8qIGh3IHByb3RvY29sIChuZXR3b3JrIG9yZGVyKSAqLwogCXVfaW50OF90CWhvb2s7CQkvKiBuZXRmaWx0ZXIgaG9vayAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBuZnFubF9tc2dfcGFja2V0X2h3IHsKLQl1X2ludDE2X3QJaHdfYWRkcmxlbjsKKwlfX2JlMTYJCWh3X2FkZHJsZW47CiAJdV9pbnQxNl90CV9wYWQ7CiAJdV9pbnQ4X3QJaHdfYWRkcls4XTsKIH07CiAKIHN0cnVjdCBuZnFubF9tc2dfcGFja2V0X3RpbWVzdGFtcCB7Ci0JYWxpZ25lZF91NjQJc2VjOwotCWFsaWduZWRfdTY0CXVzZWM7CisJYWxpZ25lZF9iZTY0CXNlYzsKKwlhbGlnbmVkX2JlNjQJdXNlYzsKIH07CiAKIGVudW0gbmZxbmxfYXR0cl90eXBlIHsKQEAgLTQ3LDggKzQ3LDggQEAKICNkZWZpbmUgTkZRQV9NQVggKF9fTkZRQV9NQVggLSAxKQogCiBzdHJ1Y3QgbmZxbmxfbXNnX3ZlcmRpY3RfaGRyIHsKLQl1X2ludDMyX3QgdmVyZGljdDsKLQl1X2ludDMyX3QgaWQ7CisJX19iZTMyIHZlcmRpY3Q7CisJX19iZTMyIGlkOwogfTsKIAogCkBAIC02Myw3ICs2Myw3IEBACiBzdHJ1Y3QgbmZxbmxfbXNnX2NvbmZpZ19jbWQgewogCXVfaW50OF90CWNvbW1hbmQ7CS8qIG5mcW5sX21zZ19jb25maWdfY21kcyAqLwogCXVfaW50OF90CV9wYWQ7Ci0JdV9pbnQxNl90CXBmOwkJLyogQUZfeHh4IGZvciBQRl9bVU5dQklORCAqLworCV9fYmUxNgkJcGY7CQkvKiBBRl94eHggZm9yIFBGX1tVTl1CSU5EICovCiB9OwogCiBlbnVtIG5mcW5sX2NvbmZpZ19tb2RlIHsKQEAgLTczLDcgKzczLDcgQEAKIH07CiAKIHN0cnVjdCBuZnFubF9tc2dfY29uZmlnX3BhcmFtcyB7Ci0JdV9pbnQzMl90CWNvcHlfcmFuZ2U7CisJX19iZTMyCQljb3B5X3JhbmdlOwogCXVfaW50OF90CWNvcHlfbW9kZTsJLyogZW51bSBuZnFubF9jb25maWdfbW9kZSAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKQEAgLTgyLDYgKzgyLDcgQEAKIAlORlFBX0NGR19VTlNQRUMsCiAJTkZRQV9DRkdfQ01ELAkJCS8qIG5mcW5sX21zZ19jb25maWdfY21kICovCiAJTkZRQV9DRkdfUEFSQU1TLAkJLyogbmZxbmxfbXNnX2NvbmZpZ19wYXJhbXMgKi8KKwlORlFBX0NGR19RVUVVRV9NQVhMRU4sCQkvKiB1X2ludDMyX3QgKi8KIAlfX05GUUFfQ0ZHX01BWAogfTsKICNkZWZpbmUgTkZRQV9DRkdfTUFYIChfX05GUUFfQ0ZHX01BWC0xKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKaW5kZXggMDQzMTlhNy4uMDIyZWRmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCkBAIC05NiwyMiArOTYsNiBAQAogLyogRXJyb3IgdmVyZGljdC4gKi8KICNkZWZpbmUgWFRfRVJST1JfVEFSR0VUICJFUlJPUiIKIAotLyoKLSAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCi0gKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3Ci0gKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgWFRfQkFTRV9DVEwJCTY0CS8qIGJhc2UgZm9yIGZpcmV3YWxsIHNvY2tldCBvcHRpb25zICovCi0KLSNkZWZpbmUgWFRfU09fU0VUX1JFUExBQ0UJKFhUX0JBU0VfQ1RMKQotI2RlZmluZSBYVF9TT19TRVRfQUREX0NPVU5URVJTCShYVF9CQVNFX0NUTCArIDEpCi0jZGVmaW5lIFhUX1NPX1NFVF9NQVgJCVhUX1NPX1NFVF9BRERfQ09VTlRFUlMKLQotI2RlZmluZSBYVF9TT19HRVRfSU5GTwkJCShYVF9CQVNFX0NUTCkKLSNkZWZpbmUgWFRfU09fR0VUX0VOVFJJRVMJCShYVF9CQVNFX0NUTCArIDEpCi0jZGVmaW5lIFhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoWFRfQkFTRV9DVEwgKyAyKQotI2RlZmluZSBYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShYVF9CQVNFX0NUTCArIDMpCi0jZGVmaW5lIFhUX1NPX0dFVF9NQVgJCQlYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCi0KICNkZWZpbmUgU0VUX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgPSAoYik7IChjKS5wY250ID0gKHApOyB9IHdoaWxlKDApCiAjZGVmaW5lIEFERF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ICs9IChiKTsgKGMpLnBjbnQgKz0gKHApOyB9IHdoaWxlKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GTE9HLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ORkxPRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2QwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ORkxPRy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX1hUX05GTE9HX1RBUkdFVAorI2RlZmluZSBfWFRfTkZMT0dfVEFSR0VUCisKKyNkZWZpbmUgWFRfTkZMT0dfREVGQVVMVF9HUk9VUAkJMHgxCisjZGVmaW5lIFhUX05GTE9HX0RFRkFVTFRfVEhSRVNIT0xECTEKKworI2RlZmluZSBYVF9ORkxPR19NQVNLCQkJMHgwCisKK3N0cnVjdCB4dF9uZmxvZ19pbmZvIHsKKwl1X2ludDMyX3QJbGVuOworCXVfaW50MTZfdAlncm91cDsKKwl1X2ludDE2X3QJdGhyZXNob2xkOworCXVfaW50MTZfdAlmbGFnczsKKwl1X2ludDE2X3QJcGFkOworCWNoYXIJCXByZWZpeFs2NF07Cit9OworCisjZW5kaWYgLyogX1hUX05GTE9HX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaAppbmRleCA0YzJkOTk0Li43MGI2ZjcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaApAQCAtMjksMTQgKzI5LDE0IEBACiBzdHJ1Y3QgaXBfY29ubnRyYWNrX29sZF90dXBsZQogewogCXN0cnVjdCB7Ci0JCV9fdTMyIGlwOworCQlfX2JlMzIgaXA7CiAJCXVuaW9uIHsKIAkJCV9fdTE2IGFsbDsKIAkJfSB1OwogCX0gc3JjOwogCiAJc3RydWN0IHsKLQkJX191MzIgaXA7CisJCV9fYmUzMiBpcDsKIAkJdW5pb24gewogCQkJX191MTYgYWxsOwogCQl9IHU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTU2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaApAQCAtMCwwICsxLDQwIEBACisjaWZuZGVmIF9YVF9IQVNITElNSVRfSAorI2RlZmluZSBfWFRfSEFTSExJTUlUX0gKKworLyogdGltaW5ncyBhcmUgaW4gbWlsbGlzZWNvbmRzLiAqLworI2RlZmluZSBYVF9IQVNITElNSVRfU0NBTEUgMTAwMDAKKy8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAorICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworCisvKiBkZXRhaWxzIG9mIHRoaXMgc3RydWN0dXJlIGhpZGRlbiBieSB0aGUgaW1wbGVtZW50YXRpb24gKi8KK3N0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlOworCisjZGVmaW5lIFhUX0hBU0hMSU1JVF9IQVNIX0RJUAkweDAwMDEKKyNkZWZpbmUgWFRfSEFTSExJTUlUX0hBU0hfRFBUCTB4MDAwMgorI2RlZmluZSBYVF9IQVNITElNSVRfSEFTSF9TSVAJMHgwMDA0CisjZGVmaW5lIFhUX0hBU0hMSU1JVF9IQVNIX1NQVAkweDAwMDgKKworc3RydWN0IGhhc2hsaW1pdF9jZmcgeworCXVfaW50MzJfdCBtb2RlOwkgIC8qIGJpdG1hc2sgb2YgSVBUX0hBU0hMSU1JVF9IQVNIXyogKi8KKwl1X2ludDMyX3QgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwl1X2ludDMyX3QgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisKKwkvKiB1c2VyIHNwZWNpZmllZCAqLworCXVfaW50MzJfdCBzaXplOwkJLyogaG93IG1hbnkgYnVja2V0cyAqLworCXVfaW50MzJfdCBtYXg7CQkvKiBtYXggbnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1X2ludDMyX3QgZ2NfaW50ZXJ2YWw7CS8qIGdjIGludGVydmFsICovCisJdV9pbnQzMl90IGV4cGlyZTsJLyogd2hlbiBkbyBlbnRyaWVzIGV4cGlyZT8gKi8KK307CisKK3N0cnVjdCB4dF9oYXNobGltaXRfaW5mbyB7CisJY2hhciBuYW1lIFtJRk5BTVNJWl07CQkvKiBuYW1lICovCisJc3RydWN0IGhhc2hsaW1pdF9jZmcgY2ZnOworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbzsKKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJdW5pb24geworCQl2b2lkICpwdHI7CisJCXN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqbWFzdGVyOworCX0gdTsKK307CisjZW5kaWYgLypfWFRfSEFTSExJTUlUX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaAppbmRleCBhODEzMmVjLi40NTY1NGQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaApAQCAtMzksNyArMzksNyBAQAogCXVuaW9uIHh0X3BvbGljeV9hZGRyCXNtYXNrOwogCXVuaW9uIHh0X3BvbGljeV9hZGRyCWRhZGRyOwogCXVuaW9uIHh0X3BvbGljeV9hZGRyCWRtYXNrOwotCXVfaW50MzJfdAkJc3BpOworCV9fYmUzMgkJCXNwaTsKIAl1X2ludDMyX3QJCXJlcWlkOwogCXVfaW50OF90CQlwcm90bzsKIAl1X2ludDhfdAkJbW9kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCmluZGV4IDQ0ZTM5YjYuLjBiZTIzNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaApAQCAtMTEyLDE5ICsxMTIsMjAgQEAKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3CiAgKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4KKyAqCisgKiBBVFRFTlRJT046IGNoZWNrIGxpbnV4L2luLmggYmVmb3JlIGFkZGluZyBuZXcgbnVtYmVyIGhlcmUuCiAgKi8KLSNkZWZpbmUgQVJQVF9DVExfT0ZGU0VUCQkzMgotI2RlZmluZSBBUlBUX0JBU0VfQ1RMCQkoWFRfQkFTRV9DVEwrQVJQVF9DVExfT0ZGU0VUKQorI2RlZmluZSBBUlBUX0JBU0VfQ1RMCQk5NgogCi0jZGVmaW5lIEFSUFRfU09fU0VUX1JFUExBQ0UJCShYVF9TT19TRVRfUkVQTEFDRStBUlBUX0NUTF9PRkZTRVQpCi0jZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoWFRfU09fU0VUX0FERF9DT1VOVEVSUytBUlBUX0NUTF9PRkZTRVQpCi0jZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCShYVF9TT19TRVRfTUFYK0FSUFRfQ1RMX09GRlNFVCkKKyNkZWZpbmUgQVJQVF9TT19TRVRfUkVQTEFDRQkJKEFSUFRfQkFTRV9DVEwpCisjZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoQVJQVF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCUFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwogCi0jZGVmaW5lIEFSUFRfU09fR0VUX0lORk8JCShYVF9TT19HRVRfSU5GTytBUlBUX0NUTF9PRkZTRVQpCi0jZGVmaW5lIEFSUFRfU09fR0VUX0VOVFJJRVMJCShYVF9TT19HRVRfRU5UUklFUytBUlBUX0NUTF9PRkZTRVQpCi0vKiAjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX01BVENICVhUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSCAgKi8KLSNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShYVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUK0FSUFRfQ1RMX09GRlNFVCkKLSNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJKFhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQrQVJQVF9DVExfT0ZGU0VUKQorI2RlZmluZSBBUlBUX1NPX0dFVF9JTkZPCQkoQVJQVF9CQVNFX0NUTCkKKyNkZWZpbmUgQVJQVF9TT19HRVRfRU5UUklFUwkJKEFSUFRfQkFTRV9DVEwgKyAxKQorLyogI2RlZmluZSBBUlBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoQVBSVF9CQVNFX0NUTCArIDIpICovCisjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoQVJQVF9CQVNFX0NUTCArIDMpCisjZGVmaW5lIEFSUFRfU09fR0VUX01BWAkJCShBUlBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQpCiAKIC8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KICNkZWZpbmUgQVJQVF9DT05USU5VRSBYVF9DT05USU5VRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAppbmRleCA5YTRkZDExLi41NTY4OWYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApAQCAtNjQsMTEgKzY0LDEwIEBACiAKIHN0cnVjdCBicmlkZ2Vfc2tiX2NiIHsKIAl1bmlvbiB7Ci0JCV9fdTMyIGlwdjQ7CisJCV9fYmUzMiBpcHY0OwogCX0gZGFkZHI7CiB9OwogCi1leHRlcm4gaW50IGJybmZfZGVmZXJyZWRfaG9va3M7CiAjZWxzZQogI2RlZmluZSBuZl9icmlkZ2VfbWF5YmVfY29weV9oZWFkZXIoc2tiKQkoMCkKICNkZWZpbmUgbmZfYnJpZGdlX3BhZChza2IpCQkJKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmgKaW5kZXggYjlmNzEyYy4uMDdmMDQ0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfODAyXzMuaApAQCAtMjgsMjEgKzI4LDIxIEBACiAJdWludDhfdCBzc2FwOwogCXVpbnQ4X3QgY3RybDsKIAl1aW50OF90IG9yaWdbM107Ci0JdWludDE2X3QgdHlwZTsKKwlfX2JlMTYgdHlwZTsKIH07CiAKIHN0cnVjdCBoZHJfbmkgewogCXVpbnQ4X3QgZHNhcDsKIAl1aW50OF90IHNzYXA7Ci0JdWludDE2X3QgY3RybDsKKwlfX2JlMTYgY3RybDsKIAl1aW50OF90ICBvcmlnWzNdOwotCXVpbnQxNl90IHR5cGU7CisJX19iZTE2IHR5cGU7CiB9OwogCiBzdHJ1Y3QgZWJ0XzgwMl8zX2hkciB7CiAJdWludDhfdCAgZGFkZHJbNl07CiAJdWludDhfdCAgc2FkZHJbNl07Ci0JdWludDE2X3QgbGVuOworCV9fYmUxNiBsZW47CiAJdW5pb24gewogCQlzdHJ1Y3QgaGRyX3VpIHVpOwogCQlzdHJ1Y3QgaGRyX25pIG5pOwpAQCAtNjEsNyArNjEsNyBAQAogc3RydWN0IGVidF84MDJfM19pbmZvIAogewogCXVpbnQ4X3QgIHNhcDsKLQl1aW50MTZfdCB0eXBlOworCV9fYmUxNiB0eXBlOwogCXVpbnQ4X3QgIGJpdG1hc2s7CiAJdWludDhfdCAgaW52ZmxhZ3M7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hbW9uZy5oCmluZGV4IDMwN2MxZmUuLjc2NTQwNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2Ftb25nLmgKQEAgLTMyLDcgKzMyLDcgQEAKIHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlCiB7CiAJdWludDMyX3QgY21wWzJdOwotCXVpbnQzMl90IGlwOworCV9fYmUzMiBpcDsKIH07CiAKIHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaAppbmRleCA1MzdlYzZiLi45N2U0ZGJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwLmgKQEAgLTE0LDEzICsxNCwxMyBAQAogCiBzdHJ1Y3QgZWJ0X2FycF9pbmZvCiB7Ci0JdWludDE2X3QgaHR5cGU7Ci0JdWludDE2X3QgcHR5cGU7Ci0JdWludDE2X3Qgb3Bjb2RlOwotCXVpbnQzMl90IHNhZGRyOwotCXVpbnQzMl90IHNtc2s7Ci0JdWludDMyX3QgZGFkZHI7Ci0JdWludDMyX3QgZG1zazsKKwlfX2JlMTYgaHR5cGU7CisJX19iZTE2IHB0eXBlOworCV9fYmUxNiBvcGNvZGU7CisJX19iZTMyIHNhZGRyOworCV9fYmUzMiBzbXNrOworCV9fYmUzMiBkYWRkcjsKKwlfX2JlMzIgZG1zazsKIAl1bnNpZ25lZCBjaGFyIHNtYWRkcltFVEhfQUxFTl07CiAJdW5zaWduZWQgY2hhciBzbW1za1tFVEhfQUxFTl07CiAJdW5zaWduZWQgY2hhciBkbWFkZHJbRVRIX0FMRU5dOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oCmluZGV4IDcyNDczODUuLmQ2ODQ3NDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2lwLmgKQEAgLTI4LDEwICsyOCwxMCBAQAogLyogdGhlIHNhbWUgdmFsdWVzIGFyZSB1c2VkIGZvciB0aGUgaW52ZmxhZ3MgKi8KIHN0cnVjdCBlYnRfaXBfaW5mbwogewotCXVpbnQzMl90IHNhZGRyOwotCXVpbnQzMl90IGRhZGRyOwotCXVpbnQzMl90IHNtc2s7Ci0JdWludDMyX3QgZG1zazsKKwlfX2JlMzIgc2FkZHI7CisJX19iZTMyIGRhZGRyOworCV9fYmUzMiBzbXNrOworCV9fYmUzMiBkbXNrOwogCXVpbnQ4X3QgIHRvczsKIAl1aW50OF90ICBwcm90b2NvbDsKIAl1aW50OF90ICBiaXRtYXNrOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmF0LmgKaW5kZXggMjZmZDkwZC4uNDM1Yjg4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25hdC5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfTkFUX0gKICNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX05BVF9ICiAKKyNkZWZpbmUgTkFUX0FSUF9CSVQgICgweDAwMDAwMDEwKQogc3RydWN0IGVidF9uYXRfaW5mbwogewogCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdmxhbi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF92bGFuLmgKaW5kZXggY2IxZmNjNC4uMWQ5OGJlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF92bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF92bGFuLmgKQEAgLTEwLDcgKzEwLDcgQEAKIHN0cnVjdCBlYnRfdmxhbl9pbmZvIHsKIAl1aW50MTZfdCBpZDsJCS8qIFZMQU4gSUQgezEtNDA5NX0gKi8KIAl1aW50OF90IHByaW87CQkvKiBWTEFOIFVzZXIgUHJpb3JpdHkgezAtN30gKi8KLQl1aW50MTZfdCBlbmNhcDsJCS8qIFZMQU4gRW5jYXBzdWxhdGVkIGZyYW1lIGNvZGUgezAtNjU1MzV9ICovCisJX19iZTE2IGVuY2FwOwkJLyogVkxBTiBFbmNhcHN1bGF0ZWQgZnJhbWUgY29kZSB7MC02NTUzNX0gKi8KIAl1aW50OF90IGJpdG1hc2s7CQkvKiBBcmdzIGJpdG1hc2sgYml0IDE9MSAtIElEIGFyZywKIAkJCQkgICBiaXQgMj0xIFVzZXItUHJpb3JpdHkgYXJnLCBiaXQgMz0xIGVuY2FwKi8KIAl1aW50OF90IGludmZsYWdzOwkJLyogSW52ZXJzZSBiaXRtYXNrICBiaXQgMT0xIC0gaW52ZXJzZWQgSUQgYXJnLCAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKaW5kZXggYjFhN2NjOS4uOTRlMGE3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKQEAgLTI2LDYgKzI2LDEwIEBACiAjZGVmaW5lIEVCVF9DT05USU5VRSAtMwogI2RlZmluZSBFQlRfUkVUVVJOICAgLTQKICNkZWZpbmUgTlVNX1NUQU5EQVJEX1RBUkdFVFMgICA0CisvKiBlYnRhYmxlcyB0YXJnZXQgbW9kdWxlcyBzdG9yZSB0aGUgdmVyZGljdCBpbnNpZGUgYW4gaW50LiBXZSBjYW4KKyAqIHJlY2xhaW0gYSBwYXJ0IG9mIHRoaXMgaW50IGZvciBiYWNrd2FyZHMgY29tcGF0aWJsZSBleHRlbnNpb25zLgorICogVGhlIDQgbHNiIGFyZSBtb3JlIHRoYW4gZW5vdWdoIHRvIHN0b3JlIHRoZSB2ZXJkaWN0LiAqLworI2RlZmluZSBFQlRfVkVSRElDVF9CSVRTIDB4MDAwMDAwMEYKIAogc3RydWN0IGVidF9jb3VudGVyCiB7CkBAIC00Miw2ICs0NiwyMyBAQAogCS8qIHRvdGFsIHNpemUgb2YgdGhlIGVudHJpZXMgKi8KIAl1bnNpZ25lZCBpbnQgZW50cmllc19zaXplOwogCS8qIHN0YXJ0IG9mIHRoZSBjaGFpbnMgKi8KKwlzdHJ1Y3QgZWJ0X2VudHJpZXMgX191c2VyICpob29rX2VudHJ5W05GX0JSX05VTUhPT0tTXTsKKwkvKiBuciBvZiBjb3VudGVycyB1c2Vyc3BhY2UgZXhwZWN0cyBiYWNrICovCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwkvKiB3aGVyZSB0aGUga2VybmVsIHdpbGwgcHV0IHRoZSBvbGQgY291bnRlcnMgKi8KKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgX191c2VyICpjb3VudGVyczsKKwljaGFyIF9fdXNlciAqZW50cmllczsKK307CisKK3N0cnVjdCBlYnRfcmVwbGFjZV9rZXJuZWwKK3sKKwljaGFyIG5hbWVbRUJUX1RBQkxFX01BWE5BTUVMRU5dOworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKwkvKiBuciBvZiBydWxlcyBpbiB0aGUgdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgbmVudHJpZXM7CisJLyogdG90YWwgc2l6ZSBvZiB0aGUgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBlbnRyaWVzX3NpemU7CisJLyogc3RhcnQgb2YgdGhlIGNoYWlucyAqLwogCXN0cnVjdCBlYnRfZW50cmllcyAqaG9va19lbnRyeVtORl9CUl9OVU1IT09LU107CiAJLyogbnIgb2YgY291bnRlcnMgdXNlcnNwYWNlIGV4cGVjdHMgYmFjayAqLwogCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CkBAIC0xNDEsNyArMTYyLDcgQEAKIAkvKiB0aGlzIG5lZWRzIHRvIGJlIHRoZSBmaXJzdCBmaWVsZCAqLwogCXVuc2lnbmVkIGludCBiaXRtYXNrOwogCXVuc2lnbmVkIGludCBpbnZmbGFnczsKLQl1aW50MTZfdCBldGhwcm90bzsKKwlfX2JlMTYgZXRocHJvdG87CiAJLyogdGhlIHBoeXNpY2FsIGluLWRldiAqLwogCWNoYXIgaW5bSUZOQU1TSVpdOwogCS8qIHRoZSBsb2dpY2FsIGluLWRldiAqLwpAQCAtMjUxLDcgKzI3Miw3IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWNoYXIgbmFtZVtFQlRfVEFCTEVfTUFYTkFNRUxFTl07Ci0Jc3RydWN0IGVidF9yZXBsYWNlICp0YWJsZTsKKwlzdHJ1Y3QgZWJ0X3JlcGxhY2Vfa2VybmVsICp0YWJsZTsKIAl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7CiAJcndsb2NrX3QgbG9jazsKIAkvKiBlLmcuIGNvdWxkIGJlIHRoZSB0YWJsZSBleHBsaWNpdGx5IG9ubHkgYWxsb3dzIGNlcnRhaW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQuaAppbmRleCA1YjYzYTIzLi5jZWFlODdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC5oCkBAIC01NywxMCArNTcsOCBAQAogCU5GX0lQX1BSSV9SQVcgPSAtMzAwLAogCU5GX0lQX1BSSV9TRUxJTlVYX0ZJUlNUID0gLTIyNSwKIAlORl9JUF9QUklfQ09OTlRSQUNLID0gLTIwMCwKLQlORl9JUF9QUklfQlJJREdFX1NBQk9UQUdFX0ZPUldBUkQgPSAtMTc1LAogCU5GX0lQX1BSSV9NQU5HTEUgPSAtMTUwLAogCU5GX0lQX1BSSV9OQVRfRFNUID0gLTEwMCwKLQlORl9JUF9QUklfQlJJREdFX1NBQk9UQUdFX0xPQ0FMX09VVCA9IC01MCwKIAlORl9JUF9QUklfRklMVEVSID0gMCwKIAlORl9JUF9QUklfTkFUX1NSQyA9IDEwMCwKIAlORl9JUF9QUklfU0VMSU5VWF9MQVNUID0gMjI1LApAQCAtNzksNyArNzcsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIGV4dGVybiBpbnQgaXBfcm91dGVfbWVfaGFyZGVyKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgYWRkcl90eXBlKTsKIGV4dGVybiBpbnQgaXBfeGZybV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfaXBfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCitleHRlcm4gX19zdW0xNiBuZl9pcF9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKIAkJCQkgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwgdV9pbnQ4X3QgcHJvdG9jb2wpOwogI2VuZGlmIC8qX19LRVJORUxfXyovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKaW5kZXggNTkxYzFhOC4uMTgwMzM3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKQEAgLTEsNiArMSw0IEBACiBoZWFkZXIteSArPSBpcF9jb25udHJhY2tfaGVscGVyLmgKLWhlYWRlci15ICs9IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmgKLWhlYWRlci15ICs9IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyM190eXBlcy5oCiBoZWFkZXIteSArPSBpcF9jb25udHJhY2tfcHJvdG9jb2wuaAogaGVhZGVyLXkgKz0gaXBfY29ubnRyYWNrX3NjdHAuaAogaGVhZGVyLXkgKz0gaXBfY29ubnRyYWNrX3RjcC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaAppbmRleCA2NGU4NjgwLi4zMzU4MWMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaWNtcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b19ncmUuaD4KQEAgLTI3Nyw3ICsyNzgsNyBAQAogX19pcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwogCiBleHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKgotaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKK2lwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwogCiBleHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICoKIF9faXBfY29ubnRyYWNrX2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19mdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oCmluZGV4IDYzODExOTMuLjIxMjlmYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oCkBAIC0xLDYgKzEsNDQgQEAKICNpZm5kZWYgX0lQX0NPTk5UUkFDS19GVFBfSAogI2RlZmluZSBfSVBfQ09OTlRSQUNLX0ZUUF9ICisvKiBGVFAgdHJhY2tpbmcuICovCiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oPgorLyogVGhpcyBlbnVtIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlICovCitlbnVtIGlwX2N0X2Z0cF90eXBlCit7CisJLyogUE9SVCBjb21tYW5kIGZyb20gY2xpZW50ICovCisJSVBfQ1RfRlRQX1BPUlQsCisJLyogUEFTViByZXNwb25zZSBmcm9tIHNlcnZlciAqLworCUlQX0NUX0ZUUF9QQVNWLAorCS8qIEVQUlQgY29tbWFuZCBmcm9tIGNsaWVudCAqLworCUlQX0NUX0ZUUF9FUFJULAorCS8qIEVQU1YgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgKi8KKwlJUF9DVF9GVFBfRVBTViwKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgRlRQX1BPUlQJMjEKKworI2RlZmluZSBOVU1fU0VRX1RPX1JFTUVNQkVSIDIKKy8qIFRoaXMgc3RydWN0dXJlIGV4aXN0cyBvbmx5IG9uY2UgcGVyIG1hc3RlciAqLworc3RydWN0IGlwX2N0X2Z0cF9tYXN0ZXIgeworCS8qIFZhbGlkIHNlcSBwb3NpdGlvbnMgZm9yIGNtZCBtYXRjaGluZyBhZnRlciBuZXdsaW5lICovCisJdV9pbnQzMl90IHNlcV9hZnRfbmxbSVBfQ1RfRElSX01BWF1bTlVNX1NFUV9UT19SRU1FTUJFUl07CisJLyogMCBtZWFucyBzZXFfbWF0Y2hfYWZ0X25sIG5vdCBzZXQgKi8KKwlpbnQgc2VxX2FmdF9ubF9udW1bSVBfQ1RfRElSX01BWF07Cit9OworCitzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdDsKKworLyogRm9yIE5BVCB0byBob29rIGluIHdoZW4gd2UgZmluZCBhIHBhY2tldCB3aGljaCBkZXNjcmliZXMgd2hhdCBvdGhlcgorICogY29ubmVjdGlvbiB3ZSBzaG91bGQgZXhwZWN0LiAqLworZXh0ZXJuIHVuc2lnbmVkIGludCAoKmlwX25hdF9mdHBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgICAgZW51bSBpcF9jdF9mdHBfdHlwZSB0eXBlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKKwkJCQkgICAgICAgdTMyICpzZXEpOworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9JUF9DT05OVFJBQ0tfRlRQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2gzMjMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2gzMjMuaAppbmRleCA5NDNjYzZhLi4xOGY3Njk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oMzIzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oCkBAIC0zLDcgKzMsNyBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX2FzbjEuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfYXNuMS5oPgogCiAjZGVmaW5lIFJBU19QT1JUIDE3MTkKICNkZWZpbmUgUTkzMV9QT1JUIDE3MjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX2FzbjEuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX2FzbjEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlOWEwYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX2FzbjEuaCAtIEJFUiBhbmQgUEVSIGRlY29kaW5nIGxpYnJhcnkgZm9yIEguMzIzCi0gKiAJCQkgICAgICAJICAgICBjb25udHJhY2svTkFUIG1vZHVsZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgYnkgSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICoKLSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBiYXNlZCBvbiBILjIyNSB2ZXJzaW9uIDQsIEguMjM1IHZlcnNpb24gMiBhbmQgSC4yNDUKLSAqIHZlcnNpb24gNy4gSXQgaXMgZXh0cmVtZWx5IG9wdGltaXplZCB0byBkZWNvZGUgb25seSB0aGUgYWJzb2x1dGVseQotICogbmVjZXNzYXJ5IG9iamVjdHMgaW4gYSBzaWduYWwgZm9yIExpbnV4IGtlcm5lbCBOQVQgbW9kdWxlIHVzZSwgc28gZG9uJ3QKLSAqIGV4cGVjdCBpdCB0byBiZSBhIGZ1bGwgQVNOLjEgbGlicmFyeS4KLSAqCi0gKiBGZWF0dXJlczoKLSAqCi0gKiAxLiBTbWFsbC4gVGhlIHRvdGFsIHNpemUgb2YgY29kZSBwbHVzIGRhdGEgaXMgbGVzcyB0aGFuIDIwIEtCIChJQTMyKS4KLSAqIDIuIEZhc3QuIERlY29kaW5nIE5ldG1lZXRpbmcncyBTZXR1cCBzaWduYWwgMSBtaWxsaW9uIHRpbWVzIG9uIGEgUElJSSA4NjYKLSAqICAgIHRha2VzIG9ubHkgMy45IHNlY29uZHMuCi0gKiAzLiBObyBtZW1vcnkgYWxsb2NhdGlvbi4gSXQgdXNlcyBhIHN0YXRpYyBvYmplY3QuIE5vIG5lZWQgdG8gaW5pdGlhbGl6ZSBvcgotICogICAgY2xlYW51cC4KLSAqIDQuIFRocmVhZCBzYWZlLgotICogNS4gU3VwcG9ydCBlbWJlZGRlZCBhcmNoaXRlY3R1cmVzIHRoYXQgaGFzIG5vIG1pc2FsaWduZWQgbWVtb3J5IGFjY2VzcwotICogICAgc3VwcG9ydC4KLSAqCi0gKiBMaW1pdGF0aW9uczoKLSAqCi0gKiAxLiBBdCBtb3N0IDMwIGZhc3RzdGFydCBlbnRyaWVzLiBBY3R1YWxseSB0aGlzIGlzIGxpbWl0ZWQgYnkgZXRoZXJuZXQncyBNVFUuCi0gKiAgICBJZiBhIFNldHVwIHNpZ25hbCBjb250YWlucyBtb3JlIHRoYW4gMzAgZmFzdHN0YXJ0LCB0aGUgcGFja2V0IHNpemUgd2lsbAotICogICAgdmVyeSBsaWtlbHkgZXhjZWVkIHRoZSBNVFUgc2l6ZSwgdGhlbiB0aGUgVFBLVCB3aWxsIGJlIGZyYWdtZW50ZWQuIEkKLSAqICAgIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzIGluIGEgTmV0ZmlsdGVyIG1vZHVsZS4gQW55Ym9keSBjYW4gaGVscD8KLSAqICAgIEFsdGhvdWdoIEkgdGhpbmsgMzAgaXMgZW5vdWdoIGZvciBtb3N0IG9mIHRoZSBjYXNlcy4KLSAqIDIuIElQdjQgYWRkcmVzc2VzIG9ubHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0lQX0NPTk5UUkFDS19IRUxQRVJfSDMyM19BU04xX0hfCi0jZGVmaW5lIF9JUF9DT05OVFJBQ0tfSEVMUEVSX0gzMjNfQVNOMV9IXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEguMzIzIFR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJpcF9jb25udHJhY2tfaGVscGVyX2gzMjNfdHlwZXMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWVudW0gewotCQlROTMxX05hdGlvbmFsRXNjYXBlID0gMHgwMCwKLQkJUTkzMV9BbGVydGluZyA9IDB4MDEsCi0JCVE5MzFfQ2FsbFByb2NlZWRpbmcgPSAweDAyLAotCQlROTMxX0Nvbm5lY3QgPSAweDA3LAotCQlROTMxX0Nvbm5lY3RBY2sgPSAweDBGLAotCQlROTMxX1Byb2dyZXNzID0gMHgwMywKLQkJUTkzMV9TZXR1cCA9IDB4MDUsCi0JCVE5MzFfU2V0dXBBY2sgPSAweDBELAotCQlROTMxX1Jlc3VtZSA9IDB4MjYsCi0JCVE5MzFfUmVzdW1lQWNrID0gMHgyRSwKLQkJUTkzMV9SZXN1bWVSZWplY3QgPSAweDIyLAotCQlROTMxX1N1c3BlbmQgPSAweDI1LAotCQlROTMxX1N1c3BlbmRBY2sgPSAweDJELAotCQlROTMxX1N1c3BlbmRSZWplY3QgPSAweDIxLAotCQlROTMxX1VzZXJJbmZvcm1hdGlvbiA9IDB4MjAsCi0JCVE5MzFfRGlzY29ubmVjdCA9IDB4NDUsCi0JCVE5MzFfUmVsZWFzZSA9IDB4NEQsCi0JCVE5MzFfUmVsZWFzZUNvbXBsZXRlID0gMHg1QSwKLQkJUTkzMV9SZXN0YXJ0ID0gMHg0NiwKLQkJUTkzMV9SZXN0YXJ0QWNrID0gMHg0RSwKLQkJUTkzMV9TZWdtZW50ID0gMHg2MCwKLQkJUTkzMV9Db25nZXN0aW9uQ3RybCA9IDB4NzksCi0JCVE5MzFfSW5mb3JtYXRpb24gPSAweDdCLAotCQlROTMxX05vdGlmeSA9IDB4NkUsCi0JCVE5MzFfU3RhdHVzID0gMHg3RCwKLQkJUTkzMV9TdGF0dXNFbnF1aXJ5ID0gMHg3NSwKLQkJUTkzMV9GYWNpbGl0eSA9IDB4NjIKLQl9IE1lc3NhZ2VUeXBlOwotCUgzMjNfVXNlckluZm9ybWF0aW9uIFVVSUU7Ci19IFE5MzE7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGVjb2RlIEZ1bmN0aW9ucyBSZXR1cm4gQ29kZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEgzMjNfRVJST1JfTk9ORSAwCS8qIERlY29kZWQgc3VjY2Vzc2Z1bGx5ICovCi0jZGVmaW5lIEgzMjNfRVJST1JfU1RPUCAxCS8qIERlY29kaW5nIHN0b3BwZWQsIG5vdCByZWFsbHkgYW4gZXJyb3IgKi8KLSNkZWZpbmUgSDMyM19FUlJPUl9CT1VORCAtMQotI2RlZmluZSBIMzIzX0VSUk9SX1JBTkdFIC0yCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZWNvZGUgRnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IERlY29kZVJhc01lc3NhZ2UodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3Qgc3osIFJhc01lc3NhZ2UgKiByYXMpOwotaW50IERlY29kZVE5MzEodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3Qgc3osIFE5MzEgKiBxOTMxKTsKLWludCBEZWNvZGVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3Qgc3osCi0JCQkJCSBNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UgKgotCQkJCQkgbXNjbSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNGE3NzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzOSArMCwwIEBACi0vKiBHZW5lcmF0ZWQgYnkgSmluZyBNaW4gWmhhbydzIEFTTi4xIHBhcnNlciwgQXByIDIwIDIwMDYKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICoKLSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgVHJhbnNwb3J0QWRkcmVzc19pcEFkZHJlc3MgewkvKiBTRVFVRU5DRSAqLwotCWludCBvcHRpb25zOwkJLyogTm8gdXNlICovCi0JdW5zaWduZWQgaXA7Ci19IFRyYW5zcG9ydEFkZHJlc3NfaXBBZGRyZXNzOwotCi10eXBlZGVmIHN0cnVjdCBUcmFuc3BvcnRBZGRyZXNzIHsJLyogQ0hPSUNFICovCi0JZW51bSB7Ci0JCWVUcmFuc3BvcnRBZGRyZXNzX2lwQWRkcmVzcywKLQkJZVRyYW5zcG9ydEFkZHJlc3NfaXBTb3VyY2VSb3V0ZSwKLQkJZVRyYW5zcG9ydEFkZHJlc3NfaXB4QWRkcmVzcywKLQkJZVRyYW5zcG9ydEFkZHJlc3NfaXA2QWRkcmVzcywKLQkJZVRyYW5zcG9ydEFkZHJlc3NfbmV0QmlvcywKLQkJZVRyYW5zcG9ydEFkZHJlc3NfbnNhcCwKLQkJZVRyYW5zcG9ydEFkZHJlc3Nfbm9uU3RhbmRhcmRBZGRyZXNzLAotCX0gY2hvaWNlOwotCXVuaW9uIHsKLQkJVHJhbnNwb3J0QWRkcmVzc19pcEFkZHJlc3MgaXBBZGRyZXNzOwotCX07Ci19IFRyYW5zcG9ydEFkZHJlc3M7Ci0KLXR5cGVkZWYgc3RydWN0IERhdGFQcm90b2NvbENhcGFiaWxpdHkgewkvKiBDSE9JQ0UgKi8KLQllbnVtIHsKLQkJZURhdGFQcm90b2NvbENhcGFiaWxpdHlfbm9uU3RhbmRhcmQsCi0JCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3YxNGJ1ZmZlcmVkLAotCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV92NDJsYXBtLAotCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV9oZGxjRnJhbWVUdW5uZWxsaW5nLAotCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV9oMzEwU2VwYXJhdGVWQ1N0YWNrLAotCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV9oMzEwU2luZ2xlVkNTdGFjaywKLQkJZURhdGFQcm90b2NvbENhcGFiaWxpdHlfdHJhbnNwYXJlbnQsCi0JCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3NlZ21lbnRhdGlvbkFuZFJlYXNzZW1ibHksCi0JCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X2hkbGNGcmFtZVR1bm5lbGluZ3dTQVIsCi0JCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3YxMjAsCi0JCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3NlcGFyYXRlTEFOU3RhY2ssCi0JCWVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3Y3NndDb21wcmVzc2lvbiwKLQkJZURhdGFQcm90b2NvbENhcGFiaWxpdHlfdGNwLAotCQllRGF0YVByb3RvY29sQ2FwYWJpbGl0eV91ZHAsCi0JfSBjaG9pY2U7Ci19IERhdGFQcm90b2NvbENhcGFiaWxpdHk7Ci0KLXR5cGVkZWYgc3RydWN0IERhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb24gewkvKiBDSE9JQ0UgKi8KLQllbnVtIHsKLQkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fbm9uU3RhbmRhcmQsCi0JCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX3QxMjAsCi0JCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX2RzbV9jYywKLQkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fdXNlckRhdGEsCi0JCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX3Q4NCwKLQkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fdDQzNCwKLQkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25faDIyNCwKLQkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fbmxwaWQsCi0JCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX2RzdmRDb250cm9sLAotCQllRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl9oMjIyRGF0YVBhcnRpdGlvbmluZywKLQkJZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fdDMwZmF4LAotCQllRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90MTQwLAotCQllRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90MzhmYXgsCi0JCWVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX2dlbmVyaWNEYXRhQ2FwYWJpbGl0eSwKLQl9IGNob2ljZTsKLQl1bmlvbiB7Ci0JCURhdGFQcm90b2NvbENhcGFiaWxpdHkgdDEyMDsKLQl9OwotfSBEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uOwotCi10eXBlZGVmIHN0cnVjdCBEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5IHsJLyogU0VRVUVOQ0UgKi8KLQlpbnQgb3B0aW9uczsJCS8qIE5vIHVzZSAqLwotCURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb24gYXBwbGljYXRpb247Ci19IERhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHk7Ci0KLXR5cGVkZWYgc3RydWN0IERhdGFUeXBlIHsJLyogQ0hPSUNFICovCi0JZW51bSB7Ci0JCWVEYXRhVHlwZV9ub25TdGFuZGFyZCwKLQkJZURhdGFUeXBlX251bGxEYXRhLAotCQllRGF0YVR5cGVfdmlkZW9EYXRhLAotCQllRGF0YVR5cGVfYXVkaW9EYXRhLAotCQllRGF0YVR5cGVfZGF0YSwKLQkJZURhdGFUeXBlX2VuY3J5cHRpb25EYXRhLAotCQllRGF0YVR5cGVfaDIzNUNvbnRyb2wsCi0JCWVEYXRhVHlwZV9oMjM1TWVkaWEsCi0JCWVEYXRhVHlwZV9tdWx0aXBsZXhlZFN0cmVhbSwKLQl9IGNob2ljZTsKLQl1bmlvbiB7Ci0JCURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHkgZGF0YTsKLQl9OwotfSBEYXRhVHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgVW5pY2FzdEFkZHJlc3NfaVBBZGRyZXNzIHsJLyogU0VRVUVOQ0UgKi8KLQlpbnQgb3B0aW9uczsJCS8qIE5vIHVzZSAqLwotCXVuc2lnbmVkIG5ldHdvcms7Ci19IFVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzczsKLQotdHlwZWRlZiBzdHJ1Y3QgVW5pY2FzdEFkZHJlc3MgewkvKiBDSE9JQ0UgKi8KLQllbnVtIHsKLQkJZVVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzcywKLQkJZVVuaWNhc3RBZGRyZXNzX2lQWEFkZHJlc3MsCi0JCWVVbmljYXN0QWRkcmVzc19pUDZBZGRyZXNzLAotCQllVW5pY2FzdEFkZHJlc3NfbmV0QmlvcywKLQkJZVVuaWNhc3RBZGRyZXNzX2lQU291cmNlUm91dGVBZGRyZXNzLAotCQllVW5pY2FzdEFkZHJlc3NfbnNhcCwKLQkJZVVuaWNhc3RBZGRyZXNzX25vblN0YW5kYXJkQWRkcmVzcywKLQl9IGNob2ljZTsKLQl1bmlvbiB7Ci0JCVVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzcyBpUEFkZHJlc3M7Ci0JfTsKLX0gVW5pY2FzdEFkZHJlc3M7Ci0KLXR5cGVkZWYgc3RydWN0IEgyNDVfVHJhbnNwb3J0QWRkcmVzcyB7CS8qIENIT0lDRSAqLwotCWVudW0gewotCQllSDI0NV9UcmFuc3BvcnRBZGRyZXNzX3VuaWNhc3RBZGRyZXNzLAotCQllSDI0NV9UcmFuc3BvcnRBZGRyZXNzX211bHRpY2FzdEFkZHJlc3MsCi0JfSBjaG9pY2U7Ci0JdW5pb24gewotCQlVbmljYXN0QWRkcmVzcyB1bmljYXN0QWRkcmVzczsKLQl9OwotfSBIMjQ1X1RyYW5zcG9ydEFkZHJlc3M7Ci0KLXR5cGVkZWYgc3RydWN0IEgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX25vblN0YW5kYXJkID0gKDEgPDwgMzEpLAotCQllSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfYXNzb2NpYXRlZFNlc3Npb25JRCA9Ci0JCSAgICAoMSA8PCAzMCksCi0JCWVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tZWRpYUNoYW5uZWwgPSAoMSA8PCAyOSksCi0JCWVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tZWRpYUd1YXJhbnRlZWREZWxpdmVyeSA9Ci0JCSAgICAoMSA8PCAyOCksCi0JCWVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tZWRpYUNvbnRyb2xDaGFubmVsID0KLQkJICAgICgxIDw8IDI3KSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21lZGlhQ29udHJvbEd1YXJhbnRlZWREZWxpdmVyeQotCQkgICAgPSAoMSA8PCAyNiksCi0JCWVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19zaWxlbmNlU3VwcHJlc3Npb24gPSAoMSA8PCAyNSksCi0JCWVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19kZXN0aW5hdGlvbiA9ICgxIDw8IDI0KSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX2R5bmFtaWNSVFBQYXlsb2FkVHlwZSA9Ci0JCSAgICAoMSA8PCAyMyksCi0JCWVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tZWRpYVBhY2tldGl6YXRpb24gPSAoMSA8PCAyMiksCi0JCWVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc190cmFuc3BvcnRDYXBhYmlsaXR5ID0KLQkJICAgICgxIDw8IDIxKSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX3JlZHVuZGFuY3lFbmNvZGluZyA9ICgxIDw8IDIwKSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX3NvdXJjZSA9ICgxIDw8IDE5KSwKLQl9IG9wdGlvbnM7Ci0JSDI0NV9UcmFuc3BvcnRBZGRyZXNzIG1lZGlhQ2hhbm5lbDsKLQlIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgbWVkaWFDb250cm9sQ2hhbm5lbDsKLX0gSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7Ci0KLXR5cGVkZWYgc3RydWN0IE9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMgewkvKiBDSE9JQ0UgKi8KLQllbnVtIHsKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyMkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyM0xvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfdjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAotCQllT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfbm9uZSwKLQl9IGNob2ljZTsKLQl1bmlvbiB7Ci0JCUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzOwotCX07Ci19IE9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnM7Ci0KLXR5cGVkZWYgc3RydWN0IE9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX3BvcnROdW1iZXIKLQkJICAgID0gKDEgPDwgMzEpLAotCQllT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfZm9yd2FyZExvZ2ljYWxDaGFubmVsRGVwZW5kZW5jeQotCQkgICAgPSAoMSA8PCAzMCksCi0JCWVPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19yZXBsYWNlbWVudEZvcgotCQkgICAgPSAoMSA8PCAyOSksCi0JfSBvcHRpb25zOwotCURhdGFUeXBlIGRhdGFUeXBlOwotCU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMKLQkgICAgbXVsdGlwbGV4UGFyYW1ldGVyczsKLX0gT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7Ci0KLXR5cGVkZWYgc3RydWN0IE9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMgewkvKiBDSE9JQ0UgKi8KLQllbnVtIHsKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyM0xvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfdjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAotCQllT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKLQl9IGNob2ljZTsKLQl1bmlvbiB7Ci0JCUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzOwotCX07Ci19IE9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnM7Ci0KLXR5cGVkZWYgc3RydWN0IE9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMKLQkJICAgID0gKDEgPDwgMzEpLAotCQllT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsRGVwZW5kZW5jeQotCQkgICAgPSAoMSA8PCAzMCksCi0JCWVPcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19yZXBsYWNlbWVudEZvcgotCQkgICAgPSAoMSA8PCAyOSksCi0JfSBvcHRpb25zOwotCU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMKLQkgICAgbXVsdGlwbGV4UGFyYW1ldGVyczsKLX0gT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7Ci0KLXR5cGVkZWYgc3RydWN0IE5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzIHsJLyogQ0hPSUNFICovCi0JZW51bSB7Ci0JCWVOZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19uZXR3b3JrQWRkcmVzc19xMjkzMUFkZHJlc3MsCi0JCWVOZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19uZXR3b3JrQWRkcmVzc19lMTY0QWRkcmVzcywKLQkJZU5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzX2xvY2FsQXJlYUFkZHJlc3MsCi0JfSBjaG9pY2U7Ci0JdW5pb24gewotCQlIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgbG9jYWxBcmVhQWRkcmVzczsKLQl9OwotfSBOZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19uZXR3b3JrQWRkcmVzczsKLQotdHlwZWRlZiBzdHJ1Y3QgTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnMgewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfZGlzdHJpYnV0aW9uID0gKDEgPDwgMzEpLAotCQllTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfZXh0ZXJuYWxSZWZlcmVuY2UgPSAoMSA8PCAzMCksCi0JCWVOZXR3b3JrQWNjZXNzUGFyYW1ldGVyc190MTIwU2V0dXBQcm9jZWR1cmUgPSAoMSA8PCAyOSksCi0JfSBvcHRpb25zOwotCU5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzIG5ldHdvcmtBZGRyZXNzOwotfSBOZXR3b3JrQWNjZXNzUGFyYW1ldGVyczsKLQotdHlwZWRlZiBzdHJ1Y3QgT3BlbkxvZ2ljYWxDaGFubmVsIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzID0KLQkJICAgICgxIDw8IDMxKSwKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9zZXBhcmF0ZVN0YWNrID0gKDEgPDwgMzApLAotCQllT3BlbkxvZ2ljYWxDaGFubmVsX2VuY3J5cHRpb25TeW5jID0gKDEgPDwgMjkpLAotCX0gb3B0aW9uczsKLQlPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycwotCSAgICBmb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzOwotCU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzCi0JICAgIHJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7Ci0JTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnMgc2VwYXJhdGVTdGFjazsKLX0gT3BlbkxvZ2ljYWxDaGFubmVsOwotCi10eXBlZGVmIHN0cnVjdCBTZXR1cF9VVUlFX2Zhc3RTdGFydCB7CS8qIFNFUVVFTkNFIE9GICovCi0JaW50IGNvdW50OwotCU9wZW5Mb2dpY2FsQ2hhbm5lbCBpdGVtWzMwXTsKLX0gU2V0dXBfVVVJRV9mYXN0U3RhcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IFNldHVwX1VVSUUgewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllU2V0dXBfVVVJRV9oMjQ1QWRkcmVzcyA9ICgxIDw8IDMxKSwKLQkJZVNldHVwX1VVSUVfc291cmNlQWRkcmVzcyA9ICgxIDw8IDMwKSwKLQkJZVNldHVwX1VVSUVfZGVzdGluYXRpb25BZGRyZXNzID0gKDEgPDwgMjkpLAotCQllU2V0dXBfVVVJRV9kZXN0Q2FsbFNpZ25hbEFkZHJlc3MgPSAoMSA8PCAyOCksCi0JCWVTZXR1cF9VVUlFX2Rlc3RFeHRyYUNhbGxJbmZvID0gKDEgPDwgMjcpLAotCQllU2V0dXBfVVVJRV9kZXN0RXh0cmFDUlYgPSAoMSA8PCAyNiksCi0JCWVTZXR1cF9VVUlFX2NhbGxTZXJ2aWNlcyA9ICgxIDw8IDI1KSwKLQkJZVNldHVwX1VVSUVfc291cmNlQ2FsbFNpZ25hbEFkZHJlc3MgPSAoMSA8PCAyNCksCi0JCWVTZXR1cF9VVUlFX3JlbW90ZUV4dGVuc2lvbkFkZHJlc3MgPSAoMSA8PCAyMyksCi0JCWVTZXR1cF9VVUlFX2NhbGxJZGVudGlmaWVyID0gKDEgPDwgMjIpLAotCQllU2V0dXBfVVVJRV9oMjQ1U2VjdXJpdHlDYXBhYmlsaXR5ID0gKDEgPDwgMjEpLAotCQllU2V0dXBfVVVJRV90b2tlbnMgPSAoMSA8PCAyMCksCi0JCWVTZXR1cF9VVUlFX2NyeXB0b1Rva2VucyA9ICgxIDw8IDE5KSwKLQkJZVNldHVwX1VVSUVfZmFzdFN0YXJ0ID0gKDEgPDwgMTgpLAotCQllU2V0dXBfVVVJRV9tZWRpYVdhaXRGb3JDb25uZWN0ID0gKDEgPDwgMTcpLAotCQllU2V0dXBfVVVJRV9jYW5PdmVybGFwU2VuZCA9ICgxIDw8IDE2KSwKLQkJZVNldHVwX1VVSUVfZW5kcG9pbnRJZGVudGlmaWVyID0gKDEgPDwgMTUpLAotCQllU2V0dXBfVVVJRV9tdWx0aXBsZUNhbGxzID0gKDEgPDwgMTQpLAotCQllU2V0dXBfVVVJRV9tYWludGFpbkNvbm5lY3Rpb24gPSAoMSA8PCAxMyksCi0JCWVTZXR1cF9VVUlFX2Nvbm5lY3Rpb25QYXJhbWV0ZXJzID0gKDEgPDwgMTIpLAotCQllU2V0dXBfVVVJRV9sYW5ndWFnZSA9ICgxIDw8IDExKSwKLQkJZVNldHVwX1VVSUVfcHJlc2VudGF0aW9uSW5kaWNhdG9yID0gKDEgPDwgMTApLAotCQllU2V0dXBfVVVJRV9zY3JlZW5pbmdJbmRpY2F0b3IgPSAoMSA8PCA5KSwKLQkJZVNldHVwX1VVSUVfc2VydmljZUNvbnRyb2wgPSAoMSA8PCA4KSwKLQkJZVNldHVwX1VVSUVfc3ltbWV0cmljT3BlcmF0aW9uUmVxdWlyZWQgPSAoMSA8PCA3KSwKLQkJZVNldHVwX1VVSUVfY2FwYWNpdHkgPSAoMSA8PCA2KSwKLQkJZVNldHVwX1VVSUVfY2lyY3VpdEluZm8gPSAoMSA8PCA1KSwKLQkJZVNldHVwX1VVSUVfZGVzaXJlZFByb3RvY29scyA9ICgxIDw8IDQpLAotCQllU2V0dXBfVVVJRV9uZWVkZWRGZWF0dXJlcyA9ICgxIDw8IDMpLAotCQllU2V0dXBfVVVJRV9kZXNpcmVkRmVhdHVyZXMgPSAoMSA8PCAyKSwKLQkJZVNldHVwX1VVSUVfc3VwcG9ydGVkRmVhdHVyZXMgPSAoMSA8PCAxKSwKLQkJZVNldHVwX1VVSUVfcGFyYWxsZWxIMjQ1Q29udHJvbCA9ICgxIDw8IDApLAotCX0gb3B0aW9uczsKLQlUcmFuc3BvcnRBZGRyZXNzIGgyNDVBZGRyZXNzOwotCVRyYW5zcG9ydEFkZHJlc3MgZGVzdENhbGxTaWduYWxBZGRyZXNzOwotCVRyYW5zcG9ydEFkZHJlc3Mgc291cmNlQ2FsbFNpZ25hbEFkZHJlc3M7Ci0JU2V0dXBfVVVJRV9mYXN0U3RhcnQgZmFzdFN0YXJ0OwotfSBTZXR1cF9VVUlFOwotCi10eXBlZGVmIHN0cnVjdCBDYWxsUHJvY2VlZGluZ19VVUlFX2Zhc3RTdGFydCB7CS8qIFNFUVVFTkNFIE9GICovCi0JaW50IGNvdW50OwotCU9wZW5Mb2dpY2FsQ2hhbm5lbCBpdGVtWzMwXTsKLX0gQ2FsbFByb2NlZWRpbmdfVVVJRV9mYXN0U3RhcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IENhbGxQcm9jZWVkaW5nX1VVSUUgewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllQ2FsbFByb2NlZWRpbmdfVVVJRV9oMjQ1QWRkcmVzcyA9ICgxIDw8IDMxKSwKLQkJZUNhbGxQcm9jZWVkaW5nX1VVSUVfY2FsbElkZW50aWZpZXIgPSAoMSA8PCAzMCksCi0JCWVDYWxsUHJvY2VlZGluZ19VVUlFX2gyNDVTZWN1cml0eU1vZGUgPSAoMSA8PCAyOSksCi0JCWVDYWxsUHJvY2VlZGluZ19VVUlFX3Rva2VucyA9ICgxIDw8IDI4KSwKLQkJZUNhbGxQcm9jZWVkaW5nX1VVSUVfY3J5cHRvVG9rZW5zID0gKDEgPDwgMjcpLAotCQllQ2FsbFByb2NlZWRpbmdfVVVJRV9mYXN0U3RhcnQgPSAoMSA8PCAyNiksCi0JCWVDYWxsUHJvY2VlZGluZ19VVUlFX211bHRpcGxlQ2FsbHMgPSAoMSA8PCAyNSksCi0JCWVDYWxsUHJvY2VlZGluZ19VVUlFX21haW50YWluQ29ubmVjdGlvbiA9ICgxIDw8IDI0KSwKLQkJZUNhbGxQcm9jZWVkaW5nX1VVSUVfZmFzdENvbm5lY3RSZWZ1c2VkID0gKDEgPDwgMjMpLAotCQllQ2FsbFByb2NlZWRpbmdfVVVJRV9mZWF0dXJlU2V0ID0gKDEgPDwgMjIpLAotCX0gb3B0aW9uczsKLQlUcmFuc3BvcnRBZGRyZXNzIGgyNDVBZGRyZXNzOwotCUNhbGxQcm9jZWVkaW5nX1VVSUVfZmFzdFN0YXJ0IGZhc3RTdGFydDsKLX0gQ2FsbFByb2NlZWRpbmdfVVVJRTsKLQotdHlwZWRlZiBzdHJ1Y3QgQ29ubmVjdF9VVUlFX2Zhc3RTdGFydCB7CS8qIFNFUVVFTkNFIE9GICovCi0JaW50IGNvdW50OwotCU9wZW5Mb2dpY2FsQ2hhbm5lbCBpdGVtWzMwXTsKLX0gQ29ubmVjdF9VVUlFX2Zhc3RTdGFydDsKLQotdHlwZWRlZiBzdHJ1Y3QgQ29ubmVjdF9VVUlFIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZUNvbm5lY3RfVVVJRV9oMjQ1QWRkcmVzcyA9ICgxIDw8IDMxKSwKLQkJZUNvbm5lY3RfVVVJRV9jYWxsSWRlbnRpZmllciA9ICgxIDw8IDMwKSwKLQkJZUNvbm5lY3RfVVVJRV9oMjQ1U2VjdXJpdHlNb2RlID0gKDEgPDwgMjkpLAotCQllQ29ubmVjdF9VVUlFX3Rva2VucyA9ICgxIDw8IDI4KSwKLQkJZUNvbm5lY3RfVVVJRV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNyksCi0JCWVDb25uZWN0X1VVSUVfZmFzdFN0YXJ0ID0gKDEgPDwgMjYpLAotCQllQ29ubmVjdF9VVUlFX211bHRpcGxlQ2FsbHMgPSAoMSA8PCAyNSksCi0JCWVDb25uZWN0X1VVSUVfbWFpbnRhaW5Db25uZWN0aW9uID0gKDEgPDwgMjQpLAotCQllQ29ubmVjdF9VVUlFX2xhbmd1YWdlID0gKDEgPDwgMjMpLAotCQllQ29ubmVjdF9VVUlFX2Nvbm5lY3RlZEFkZHJlc3MgPSAoMSA8PCAyMiksCi0JCWVDb25uZWN0X1VVSUVfcHJlc2VudGF0aW9uSW5kaWNhdG9yID0gKDEgPDwgMjEpLAotCQllQ29ubmVjdF9VVUlFX3NjcmVlbmluZ0luZGljYXRvciA9ICgxIDw8IDIwKSwKLQkJZUNvbm5lY3RfVVVJRV9mYXN0Q29ubmVjdFJlZnVzZWQgPSAoMSA8PCAxOSksCi0JCWVDb25uZWN0X1VVSUVfc2VydmljZUNvbnRyb2wgPSAoMSA8PCAxOCksCi0JCWVDb25uZWN0X1VVSUVfY2FwYWNpdHkgPSAoMSA8PCAxNyksCi0JCWVDb25uZWN0X1VVSUVfZmVhdHVyZVNldCA9ICgxIDw8IDE2KSwKLQl9IG9wdGlvbnM7Ci0JVHJhbnNwb3J0QWRkcmVzcyBoMjQ1QWRkcmVzczsKLQlDb25uZWN0X1VVSUVfZmFzdFN0YXJ0IGZhc3RTdGFydDsKLX0gQ29ubmVjdF9VVUlFOwotCi10eXBlZGVmIHN0cnVjdCBBbGVydGluZ19VVUlFX2Zhc3RTdGFydCB7CS8qIFNFUVVFTkNFIE9GICovCi0JaW50IGNvdW50OwotCU9wZW5Mb2dpY2FsQ2hhbm5lbCBpdGVtWzMwXTsKLX0gQWxlcnRpbmdfVVVJRV9mYXN0U3RhcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IEFsZXJ0aW5nX1VVSUUgewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllQWxlcnRpbmdfVVVJRV9oMjQ1QWRkcmVzcyA9ICgxIDw8IDMxKSwKLQkJZUFsZXJ0aW5nX1VVSUVfY2FsbElkZW50aWZpZXIgPSAoMSA8PCAzMCksCi0JCWVBbGVydGluZ19VVUlFX2gyNDVTZWN1cml0eU1vZGUgPSAoMSA8PCAyOSksCi0JCWVBbGVydGluZ19VVUlFX3Rva2VucyA9ICgxIDw8IDI4KSwKLQkJZUFsZXJ0aW5nX1VVSUVfY3J5cHRvVG9rZW5zID0gKDEgPDwgMjcpLAotCQllQWxlcnRpbmdfVVVJRV9mYXN0U3RhcnQgPSAoMSA8PCAyNiksCi0JCWVBbGVydGluZ19VVUlFX211bHRpcGxlQ2FsbHMgPSAoMSA8PCAyNSksCi0JCWVBbGVydGluZ19VVUlFX21haW50YWluQ29ubmVjdGlvbiA9ICgxIDw8IDI0KSwKLQkJZUFsZXJ0aW5nX1VVSUVfYWxlcnRpbmdBZGRyZXNzID0gKDEgPDwgMjMpLAotCQllQWxlcnRpbmdfVVVJRV9wcmVzZW50YXRpb25JbmRpY2F0b3IgPSAoMSA8PCAyMiksCi0JCWVBbGVydGluZ19VVUlFX3NjcmVlbmluZ0luZGljYXRvciA9ICgxIDw8IDIxKSwKLQkJZUFsZXJ0aW5nX1VVSUVfZmFzdENvbm5lY3RSZWZ1c2VkID0gKDEgPDwgMjApLAotCQllQWxlcnRpbmdfVVVJRV9zZXJ2aWNlQ29udHJvbCA9ICgxIDw8IDE5KSwKLQkJZUFsZXJ0aW5nX1VVSUVfY2FwYWNpdHkgPSAoMSA8PCAxOCksCi0JCWVBbGVydGluZ19VVUlFX2ZlYXR1cmVTZXQgPSAoMSA8PCAxNyksCi0JfSBvcHRpb25zOwotCVRyYW5zcG9ydEFkZHJlc3MgaDI0NUFkZHJlc3M7Ci0JQWxlcnRpbmdfVVVJRV9mYXN0U3RhcnQgZmFzdFN0YXJ0OwotfSBBbGVydGluZ19VVUlFOwotCi10eXBlZGVmIHN0cnVjdCBJbmZvcm1hdGlvbl9VVUlFX2Zhc3RTdGFydCB7CS8qIFNFUVVFTkNFIE9GICovCi0JaW50IGNvdW50OwotCU9wZW5Mb2dpY2FsQ2hhbm5lbCBpdGVtWzMwXTsKLX0gSW5mb3JtYXRpb25fVVVJRV9mYXN0U3RhcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IEluZm9ybWF0aW9uX1VVSUUgewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllSW5mb3JtYXRpb25fVVVJRV9jYWxsSWRlbnRpZmllciA9ICgxIDw8IDMxKSwKLQkJZUluZm9ybWF0aW9uX1VVSUVfdG9rZW5zID0gKDEgPDwgMzApLAotCQllSW5mb3JtYXRpb25fVVVJRV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyOSksCi0JCWVJbmZvcm1hdGlvbl9VVUlFX2Zhc3RTdGFydCA9ICgxIDw8IDI4KSwKLQkJZUluZm9ybWF0aW9uX1VVSUVfZmFzdENvbm5lY3RSZWZ1c2VkID0gKDEgPDwgMjcpLAotCQllSW5mb3JtYXRpb25fVVVJRV9jaXJjdWl0SW5mbyA9ICgxIDw8IDI2KSwKLQl9IG9wdGlvbnM7Ci0JSW5mb3JtYXRpb25fVVVJRV9mYXN0U3RhcnQgZmFzdFN0YXJ0OwotfSBJbmZvcm1hdGlvbl9VVUlFOwotCi10eXBlZGVmIHN0cnVjdCBGYWNpbGl0eVJlYXNvbiB7CS8qIENIT0lDRSAqLwotCWVudW0gewotCQllRmFjaWxpdHlSZWFzb25fcm91dGVDYWxsVG9HYXRla2VlcGVyLAotCQllRmFjaWxpdHlSZWFzb25fY2FsbEZvcndhcmRlZCwKLQkJZUZhY2lsaXR5UmVhc29uX3JvdXRlQ2FsbFRvTUMsCi0JCWVGYWNpbGl0eVJlYXNvbl91bmRlZmluZWRSZWFzb24sCi0JCWVGYWNpbGl0eVJlYXNvbl9jb25mZXJlbmNlTGlzdENob2ljZSwKLQkJZUZhY2lsaXR5UmVhc29uX3N0YXJ0SDI0NSwKLQkJZUZhY2lsaXR5UmVhc29uX25vSDI0NSwKLQkJZUZhY2lsaXR5UmVhc29uX25ld1Rva2VucywKLQkJZUZhY2lsaXR5UmVhc29uX2ZlYXR1cmVTZXRVcGRhdGUsCi0JCWVGYWNpbGl0eVJlYXNvbl9mb3J3YXJkZWRFbGVtZW50cywKLQkJZUZhY2lsaXR5UmVhc29uX3RyYW5zcG9ydGVkSW5mb3JtYXRpb24sCi0JfSBjaG9pY2U7Ci19IEZhY2lsaXR5UmVhc29uOwotCi10eXBlZGVmIHN0cnVjdCBGYWNpbGl0eV9VVUlFX2Zhc3RTdGFydCB7CS8qIFNFUVVFTkNFIE9GICovCi0JaW50IGNvdW50OwotCU9wZW5Mb2dpY2FsQ2hhbm5lbCBpdGVtWzMwXTsKLX0gRmFjaWxpdHlfVVVJRV9mYXN0U3RhcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IEZhY2lsaXR5X1VVSUUgewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllRmFjaWxpdHlfVVVJRV9hbHRlcm5hdGl2ZUFkZHJlc3MgPSAoMSA8PCAzMSksCi0JCWVGYWNpbGl0eV9VVUlFX2FsdGVybmF0aXZlQWxpYXNBZGRyZXNzID0gKDEgPDwgMzApLAotCQllRmFjaWxpdHlfVVVJRV9jb25mZXJlbmNlSUQgPSAoMSA8PCAyOSksCi0JCWVGYWNpbGl0eV9VVUlFX2NhbGxJZGVudGlmaWVyID0gKDEgPDwgMjgpLAotCQllRmFjaWxpdHlfVVVJRV9kZXN0RXh0cmFDYWxsSW5mbyA9ICgxIDw8IDI3KSwKLQkJZUZhY2lsaXR5X1VVSUVfcmVtb3RlRXh0ZW5zaW9uQWRkcmVzcyA9ICgxIDw8IDI2KSwKLQkJZUZhY2lsaXR5X1VVSUVfdG9rZW5zID0gKDEgPDwgMjUpLAotCQllRmFjaWxpdHlfVVVJRV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNCksCi0JCWVGYWNpbGl0eV9VVUlFX2NvbmZlcmVuY2VzID0gKDEgPDwgMjMpLAotCQllRmFjaWxpdHlfVVVJRV9oMjQ1QWRkcmVzcyA9ICgxIDw8IDIyKSwKLQkJZUZhY2lsaXR5X1VVSUVfZmFzdFN0YXJ0ID0gKDEgPDwgMjEpLAotCQllRmFjaWxpdHlfVVVJRV9tdWx0aXBsZUNhbGxzID0gKDEgPDwgMjApLAotCQllRmFjaWxpdHlfVVVJRV9tYWludGFpbkNvbm5lY3Rpb24gPSAoMSA8PCAxOSksCi0JCWVGYWNpbGl0eV9VVUlFX2Zhc3RDb25uZWN0UmVmdXNlZCA9ICgxIDw8IDE4KSwKLQkJZUZhY2lsaXR5X1VVSUVfc2VydmljZUNvbnRyb2wgPSAoMSA8PCAxNyksCi0JCWVGYWNpbGl0eV9VVUlFX2NpcmN1aXRJbmZvID0gKDEgPDwgMTYpLAotCQllRmFjaWxpdHlfVVVJRV9mZWF0dXJlU2V0ID0gKDEgPDwgMTUpLAotCQllRmFjaWxpdHlfVVVJRV9kZXN0aW5hdGlvbkluZm8gPSAoMSA8PCAxNCksCi0JCWVGYWNpbGl0eV9VVUlFX2gyNDVTZWN1cml0eU1vZGUgPSAoMSA8PCAxMyksCi0JfSBvcHRpb25zOwotCVRyYW5zcG9ydEFkZHJlc3MgYWx0ZXJuYXRpdmVBZGRyZXNzOwotCUZhY2lsaXR5UmVhc29uIHJlYXNvbjsKLQlUcmFuc3BvcnRBZGRyZXNzIGgyNDVBZGRyZXNzOwotCUZhY2lsaXR5X1VVSUVfZmFzdFN0YXJ0IGZhc3RTdGFydDsKLX0gRmFjaWxpdHlfVVVJRTsKLQotdHlwZWRlZiBzdHJ1Y3QgUHJvZ3Jlc3NfVVVJRV9mYXN0U3RhcnQgewkvKiBTRVFVRU5DRSBPRiAqLwotCWludCBjb3VudDsKLQlPcGVuTG9naWNhbENoYW5uZWwgaXRlbVszMF07Ci19IFByb2dyZXNzX1VVSUVfZmFzdFN0YXJ0OwotCi10eXBlZGVmIHN0cnVjdCBQcm9ncmVzc19VVUlFIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZVByb2dyZXNzX1VVSUVfaDI0NUFkZHJlc3MgPSAoMSA8PCAzMSksCi0JCWVQcm9ncmVzc19VVUlFX2gyNDVTZWN1cml0eU1vZGUgPSAoMSA8PCAzMCksCi0JCWVQcm9ncmVzc19VVUlFX3Rva2VucyA9ICgxIDw8IDI5KSwKLQkJZVByb2dyZXNzX1VVSUVfY3J5cHRvVG9rZW5zID0gKDEgPDwgMjgpLAotCQllUHJvZ3Jlc3NfVVVJRV9mYXN0U3RhcnQgPSAoMSA8PCAyNyksCi0JCWVQcm9ncmVzc19VVUlFX211bHRpcGxlQ2FsbHMgPSAoMSA8PCAyNiksCi0JCWVQcm9ncmVzc19VVUlFX21haW50YWluQ29ubmVjdGlvbiA9ICgxIDw8IDI1KSwKLQkJZVByb2dyZXNzX1VVSUVfZmFzdENvbm5lY3RSZWZ1c2VkID0gKDEgPDwgMjQpLAotCX0gb3B0aW9uczsKLQlUcmFuc3BvcnRBZGRyZXNzIGgyNDVBZGRyZXNzOwotCVByb2dyZXNzX1VVSUVfZmFzdFN0YXJ0IGZhc3RTdGFydDsKLX0gUHJvZ3Jlc3NfVVVJRTsKLQotdHlwZWRlZiBzdHJ1Y3QgSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHkgewkvKiBDSE9JQ0UgKi8KLQllbnVtIHsKLQkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3NldHVwLAotCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfY2FsbFByb2NlZWRpbmcsCi0JCWVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9jb25uZWN0LAotCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfYWxlcnRpbmcsCi0JCWVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9pbmZvcm1hdGlvbiwKLQkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3JlbGVhc2VDb21wbGV0ZSwKLQkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2ZhY2lsaXR5LAotCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfcHJvZ3Jlc3MsCi0JCWVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9lbXB0eSwKLQkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3N0YXR1cywKLQkJZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3N0YXR1c0lucXVpcnksCi0JCWVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9zZXR1cEFja25vd2xlZGdlLAotCQllSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfbm90aWZ5LAotCX0gY2hvaWNlOwotCXVuaW9uIHsKLQkJU2V0dXBfVVVJRSBzZXR1cDsKLQkJQ2FsbFByb2NlZWRpbmdfVVVJRSBjYWxsUHJvY2VlZGluZzsKLQkJQ29ubmVjdF9VVUlFIGNvbm5lY3Q7Ci0JCUFsZXJ0aW5nX1VVSUUgYWxlcnRpbmc7Ci0JCUluZm9ybWF0aW9uX1VVSUUgaW5mb3JtYXRpb247Ci0JCUZhY2lsaXR5X1VVSUUgZmFjaWxpdHk7Ci0JCVByb2dyZXNzX1VVSUUgcHJvZ3Jlc3M7Ci0JfTsKLX0gSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHk7Ci0KLXR5cGVkZWYgc3RydWN0IFJlcXVlc3RNZXNzYWdlIHsJLyogQ0hPSUNFICovCi0JZW51bSB7Ci0JCWVSZXF1ZXN0TWVzc2FnZV9ub25TdGFuZGFyZCwKLQkJZVJlcXVlc3RNZXNzYWdlX21hc3RlclNsYXZlRGV0ZXJtaW5hdGlvbiwKLQkJZVJlcXVlc3RNZXNzYWdlX3Rlcm1pbmFsQ2FwYWJpbGl0eVNldCwKLQkJZVJlcXVlc3RNZXNzYWdlX29wZW5Mb2dpY2FsQ2hhbm5lbCwKLQkJZVJlcXVlc3RNZXNzYWdlX2Nsb3NlTG9naWNhbENoYW5uZWwsCi0JCWVSZXF1ZXN0TWVzc2FnZV9yZXF1ZXN0Q2hhbm5lbENsb3NlLAotCQllUmVxdWVzdE1lc3NhZ2VfbXVsdGlwbGV4RW50cnlTZW5kLAotCQllUmVxdWVzdE1lc3NhZ2VfcmVxdWVzdE11bHRpcGxleEVudHJ5LAotCQllUmVxdWVzdE1lc3NhZ2VfcmVxdWVzdE1vZGUsCi0JCWVSZXF1ZXN0TWVzc2FnZV9yb3VuZFRyaXBEZWxheVJlcXVlc3QsCi0JCWVSZXF1ZXN0TWVzc2FnZV9tYWludGVuYW5jZUxvb3BSZXF1ZXN0LAotCQllUmVxdWVzdE1lc3NhZ2VfY29tbXVuaWNhdGlvbk1vZGVSZXF1ZXN0LAotCQllUmVxdWVzdE1lc3NhZ2VfY29uZmVyZW5jZVJlcXVlc3QsCi0JCWVSZXF1ZXN0TWVzc2FnZV9tdWx0aWxpbmtSZXF1ZXN0LAotCQllUmVxdWVzdE1lc3NhZ2VfbG9naWNhbENoYW5uZWxSYXRlUmVxdWVzdCwKLQl9IGNob2ljZTsKLQl1bmlvbiB7Ci0JCU9wZW5Mb2dpY2FsQ2hhbm5lbCBvcGVuTG9naWNhbENoYW5uZWw7Ci0JfTsKLX0gUmVxdWVzdE1lc3NhZ2U7Ci0KLXR5cGVkZWYgc3RydWN0IE9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMgewkvKiBDSE9JQ0UgKi8KLQllbnVtIHsKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyMkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMsCi0JfSBjaG9pY2U7Ci0JdW5pb24gewotCQlIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyBoMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyczsKLQl9OwotfSBPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzOwotCi10eXBlZGVmIHN0cnVjdCBPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyB7CS8qIFNFUVVFTkNFICovCi0JZW51bSB7Ci0JCWVPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19wb3J0TnVtYmVyCi0JCSAgICA9ICgxIDw8IDMxKSwKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMKLQkJICAgID0gKDEgPDwgMzApLAotCQllT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfcmVwbGFjZW1lbnRGb3IKLQkJICAgID0gKDEgPDwgMjkpLAotCX0gb3B0aW9uczsKLQlPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzCi0JICAgIG11bHRpcGxleFBhcmFtZXRlcnM7Ci19IE9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzOwotCi10eXBlZGVmIHN0cnVjdCBIMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVycyB7CS8qIFNFUVVFTkNFICovCi0JZW51bSB7Ci0JCWVIMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVyc19ub25TdGFuZGFyZCA9ICgxIDw8IDMxKSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX3Nlc3Npb25JRCA9ICgxIDw8IDMwKSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX21lZGlhQ2hhbm5lbCA9ICgxIDw8IDI5KSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX21lZGlhQ29udHJvbENoYW5uZWwgPQotCQkgICAgKDEgPDwgMjgpLAotCQllSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfZHluYW1pY1JUUFBheWxvYWRUeXBlID0KLQkJICAgICgxIDw8IDI3KSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX2Zsb3dDb250cm9sVG9aZXJvID0KLQkJICAgICgxIDw8IDI2KSwKLQkJZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX3BvcnROdW1iZXIgPSAoMSA8PCAyNSksCi0JfSBvcHRpb25zOwotCUgyNDVfVHJhbnNwb3J0QWRkcmVzcyBtZWRpYUNoYW5uZWw7Ci0JSDI0NV9UcmFuc3BvcnRBZGRyZXNzIG1lZGlhQ29udHJvbENoYW5uZWw7Ci19IEgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzOwotCi10eXBlZGVmIHN0cnVjdCBPcGVuTG9naWNhbENoYW5uZWxBY2tfZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnMgewkvKiBDSE9JQ0UgKi8KLQllbnVtIHsKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVycywKLQl9IGNob2ljZTsKLQl1bmlvbiB7Ci0JCUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzCi0JCSAgICBoMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVyczsKLQl9OwotfSBPcGVuTG9naWNhbENoYW5uZWxBY2tfZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnM7Ci0KLXR5cGVkZWYgc3RydWN0IE9wZW5Mb2dpY2FsQ2hhbm5lbEFjayB7CS8qIFNFUVVFTkNFICovCi0JZW51bSB7Ci0JCWVPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyA9Ci0JCSAgICAoMSA8PCAzMSksCi0JCWVPcGVuTG9naWNhbENoYW5uZWxBY2tfc2VwYXJhdGVTdGFjayA9ICgxIDw8IDMwKSwKLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVycyA9Ci0JCSAgICAoMSA8PCAyOSksCi0JCWVPcGVuTG9naWNhbENoYW5uZWxBY2tfZW5jcnlwdGlvblN5bmMgPSAoMSA8PCAyOCksCi0JfSBvcHRpb25zOwotCU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzCi0JICAgIHJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnM7Ci0JT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzCi0JICAgIGZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzOwotfSBPcGVuTG9naWNhbENoYW5uZWxBY2s7Ci0KLXR5cGVkZWYgc3RydWN0IFJlc3BvbnNlTWVzc2FnZSB7CS8qIENIT0lDRSAqLwotCWVudW0gewotCQllUmVzcG9uc2VNZXNzYWdlX25vblN0YW5kYXJkLAotCQllUmVzcG9uc2VNZXNzYWdlX21hc3RlclNsYXZlRGV0ZXJtaW5hdGlvbkFjaywKLQkJZVJlc3BvbnNlTWVzc2FnZV9tYXN0ZXJTbGF2ZURldGVybWluYXRpb25SZWplY3QsCi0JCWVSZXNwb25zZU1lc3NhZ2VfdGVybWluYWxDYXBhYmlsaXR5U2V0QWNrLAotCQllUmVzcG9uc2VNZXNzYWdlX3Rlcm1pbmFsQ2FwYWJpbGl0eVNldFJlamVjdCwKLQkJZVJlc3BvbnNlTWVzc2FnZV9vcGVuTG9naWNhbENoYW5uZWxBY2ssCi0JCWVSZXNwb25zZU1lc3NhZ2Vfb3BlbkxvZ2ljYWxDaGFubmVsUmVqZWN0LAotCQllUmVzcG9uc2VNZXNzYWdlX2Nsb3NlTG9naWNhbENoYW5uZWxBY2ssCi0JCWVSZXNwb25zZU1lc3NhZ2VfcmVxdWVzdENoYW5uZWxDbG9zZUFjaywKLQkJZVJlc3BvbnNlTWVzc2FnZV9yZXF1ZXN0Q2hhbm5lbENsb3NlUmVqZWN0LAotCQllUmVzcG9uc2VNZXNzYWdlX211bHRpcGxleEVudHJ5U2VuZEFjaywKLQkJZVJlc3BvbnNlTWVzc2FnZV9tdWx0aXBsZXhFbnRyeVNlbmRSZWplY3QsCi0JCWVSZXNwb25zZU1lc3NhZ2VfcmVxdWVzdE11bHRpcGxleEVudHJ5QWNrLAotCQllUmVzcG9uc2VNZXNzYWdlX3JlcXVlc3RNdWx0aXBsZXhFbnRyeVJlamVjdCwKLQkJZVJlc3BvbnNlTWVzc2FnZV9yZXF1ZXN0TW9kZUFjaywKLQkJZVJlc3BvbnNlTWVzc2FnZV9yZXF1ZXN0TW9kZVJlamVjdCwKLQkJZVJlc3BvbnNlTWVzc2FnZV9yb3VuZFRyaXBEZWxheVJlc3BvbnNlLAotCQllUmVzcG9uc2VNZXNzYWdlX21haW50ZW5hbmNlTG9vcEFjaywKLQkJZVJlc3BvbnNlTWVzc2FnZV9tYWludGVuYW5jZUxvb3BSZWplY3QsCi0JCWVSZXNwb25zZU1lc3NhZ2VfY29tbXVuaWNhdGlvbk1vZGVSZXNwb25zZSwKLQkJZVJlc3BvbnNlTWVzc2FnZV9jb25mZXJlbmNlUmVzcG9uc2UsCi0JCWVSZXNwb25zZU1lc3NhZ2VfbXVsdGlsaW5rUmVzcG9uc2UsCi0JCWVSZXNwb25zZU1lc3NhZ2VfbG9naWNhbENoYW5uZWxSYXRlQWNrbm93bGVkZ2UsCi0JCWVSZXNwb25zZU1lc3NhZ2VfbG9naWNhbENoYW5uZWxSYXRlUmVqZWN0LAotCX0gY2hvaWNlOwotCXVuaW9uIHsKLQkJT3BlbkxvZ2ljYWxDaGFubmVsQWNrIG9wZW5Mb2dpY2FsQ2hhbm5lbEFjazsKLQl9OwotfSBSZXNwb25zZU1lc3NhZ2U7Ci0KLXR5cGVkZWYgc3RydWN0IE11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSB7CS8qIENIT0lDRSAqLwotCWVudW0gewotCQllTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlX3JlcXVlc3QsCi0JCWVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2VfcmVzcG9uc2UsCi0JCWVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2VfY29tbWFuZCwKLQkJZU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZV9pbmRpY2F0aW9uLAotCX0gY2hvaWNlOwotCXVuaW9uIHsKLQkJUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdDsKLQkJUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlOwotCX07Ci19IE11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZTsKLQotdHlwZWRlZiBzdHJ1Y3QgSDMyM19VVV9QRFVfaDI0NUNvbnRyb2wgewkvKiBTRVFVRU5DRSBPRiAqLwotCWludCBjb3VudDsKLQlNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UgaXRlbVs0XTsKLX0gSDMyM19VVV9QRFVfaDI0NUNvbnRyb2w7Ci0KLXR5cGVkZWYgc3RydWN0IEgzMjNfVVVfUERVIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZUgzMjNfVVVfUERVX25vblN0YW5kYXJkRGF0YSA9ICgxIDw8IDMxKSwKLQkJZUgzMjNfVVVfUERVX2g0NTAxU3VwcGxlbWVudGFyeVNlcnZpY2UgPSAoMSA8PCAzMCksCi0JCWVIMzIzX1VVX1BEVV9oMjQ1VHVubmVsaW5nID0gKDEgPDwgMjkpLAotCQllSDMyM19VVV9QRFVfaDI0NUNvbnRyb2wgPSAoMSA8PCAyOCksCi0JCWVIMzIzX1VVX1BEVV9ub25TdGFuZGFyZENvbnRyb2wgPSAoMSA8PCAyNyksCi0JCWVIMzIzX1VVX1BEVV9jYWxsTGlua2FnZSA9ICgxIDw8IDI2KSwKLQkJZUgzMjNfVVVfUERVX3R1bm5lbGxlZFNpZ25hbGxpbmdNZXNzYWdlID0gKDEgPDwgMjUpLAotCQllSDMyM19VVV9QRFVfcHJvdmlzaW9uYWxSZXNwVG9IMjQ1VHVubmVsaW5nID0gKDEgPDwgMjQpLAotCQllSDMyM19VVV9QRFVfc3RpbXVsdXNDb250cm9sID0gKDEgPDwgMjMpLAotCQllSDMyM19VVV9QRFVfZ2VuZXJpY0RhdGEgPSAoMSA8PCAyMiksCi0JfSBvcHRpb25zOwotCUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5IGgzMjNfbWVzc2FnZV9ib2R5OwotCUgzMjNfVVVfUERVX2gyNDVDb250cm9sIGgyNDVDb250cm9sOwotfSBIMzIzX1VVX1BEVTsKLQotdHlwZWRlZiBzdHJ1Y3QgSDMyM19Vc2VySW5mb3JtYXRpb24gewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllSDMyM19Vc2VySW5mb3JtYXRpb25fdXNlcl9kYXRhID0gKDEgPDwgMzEpLAotCX0gb3B0aW9uczsKLQlIMzIzX1VVX1BEVSBoMzIzX3V1X3BkdTsKLX0gSDMyM19Vc2VySW5mb3JtYXRpb247Ci0KLXR5cGVkZWYgc3RydWN0IEdhdGVrZWVwZXJSZXF1ZXN0IHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZUdhdGVrZWVwZXJSZXF1ZXN0X25vblN0YW5kYXJkRGF0YSA9ICgxIDw8IDMxKSwKLQkJZUdhdGVrZWVwZXJSZXF1ZXN0X2dhdGVrZWVwZXJJZGVudGlmaWVyID0gKDEgPDwgMzApLAotCQllR2F0ZWtlZXBlclJlcXVlc3RfY2FsbFNlcnZpY2VzID0gKDEgPDwgMjkpLAotCQllR2F0ZWtlZXBlclJlcXVlc3RfZW5kcG9pbnRBbGlhcyA9ICgxIDw8IDI4KSwKLQkJZUdhdGVrZWVwZXJSZXF1ZXN0X2FsdGVybmF0ZUVuZHBvaW50cyA9ICgxIDw8IDI3KSwKLQkJZUdhdGVrZWVwZXJSZXF1ZXN0X3Rva2VucyA9ICgxIDw8IDI2KSwKLQkJZUdhdGVrZWVwZXJSZXF1ZXN0X2NyeXB0b1Rva2VucyA9ICgxIDw8IDI1KSwKLQkJZUdhdGVrZWVwZXJSZXF1ZXN0X2F1dGhlbnRpY2F0aW9uQ2FwYWJpbGl0eSA9ICgxIDw8IDI0KSwKLQkJZUdhdGVrZWVwZXJSZXF1ZXN0X2FsZ29yaXRobU9JRHMgPSAoMSA8PCAyMyksCi0JCWVHYXRla2VlcGVyUmVxdWVzdF9pbnRlZ3JpdHkgPSAoMSA8PCAyMiksCi0JCWVHYXRla2VlcGVyUmVxdWVzdF9pbnRlZ3JpdHlDaGVja1ZhbHVlID0gKDEgPDwgMjEpLAotCQllR2F0ZWtlZXBlclJlcXVlc3Rfc3VwcG9ydHNBbHRHSyA9ICgxIDw8IDIwKSwKLQkJZUdhdGVrZWVwZXJSZXF1ZXN0X2ZlYXR1cmVTZXQgPSAoMSA8PCAxOSksCi0JCWVHYXRla2VlcGVyUmVxdWVzdF9nZW5lcmljRGF0YSA9ICgxIDw8IDE4KSwKLQl9IG9wdGlvbnM7Ci0JVHJhbnNwb3J0QWRkcmVzcyByYXNBZGRyZXNzOwotfSBHYXRla2VlcGVyUmVxdWVzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR2F0ZWtlZXBlckNvbmZpcm0gewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllR2F0ZWtlZXBlckNvbmZpcm1fbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMzEpLAotCQllR2F0ZWtlZXBlckNvbmZpcm1fZ2F0ZWtlZXBlcklkZW50aWZpZXIgPSAoMSA8PCAzMCksCi0JCWVHYXRla2VlcGVyQ29uZmlybV9hbHRlcm5hdGVHYXRla2VlcGVyID0gKDEgPDwgMjkpLAotCQllR2F0ZWtlZXBlckNvbmZpcm1fYXV0aGVudGljYXRpb25Nb2RlID0gKDEgPDwgMjgpLAotCQllR2F0ZWtlZXBlckNvbmZpcm1fdG9rZW5zID0gKDEgPDwgMjcpLAotCQllR2F0ZWtlZXBlckNvbmZpcm1fY3J5cHRvVG9rZW5zID0gKDEgPDwgMjYpLAotCQllR2F0ZWtlZXBlckNvbmZpcm1fYWxnb3JpdGhtT0lEID0gKDEgPDwgMjUpLAotCQllR2F0ZWtlZXBlckNvbmZpcm1faW50ZWdyaXR5ID0gKDEgPDwgMjQpLAotCQllR2F0ZWtlZXBlckNvbmZpcm1faW50ZWdyaXR5Q2hlY2tWYWx1ZSA9ICgxIDw8IDIzKSwKLQkJZUdhdGVrZWVwZXJDb25maXJtX2ZlYXR1cmVTZXQgPSAoMSA8PCAyMiksCi0JCWVHYXRla2VlcGVyQ29uZmlybV9nZW5lcmljRGF0YSA9ICgxIDw8IDIxKSwKLQl9IG9wdGlvbnM7Ci0JVHJhbnNwb3J0QWRkcmVzcyByYXNBZGRyZXNzOwotfSBHYXRla2VlcGVyQ29uZmlybTsKLQotdHlwZWRlZiBzdHJ1Y3QgUmVnaXN0cmF0aW9uUmVxdWVzdF9jYWxsU2lnbmFsQWRkcmVzcyB7CS8qIFNFUVVFTkNFIE9GICovCi0JaW50IGNvdW50OwotCVRyYW5zcG9ydEFkZHJlc3MgaXRlbVsxMF07Ci19IFJlZ2lzdHJhdGlvblJlcXVlc3RfY2FsbFNpZ25hbEFkZHJlc3M7Ci0KLXR5cGVkZWYgc3RydWN0IFJlZ2lzdHJhdGlvblJlcXVlc3RfcmFzQWRkcmVzcyB7CS8qIFNFUVVFTkNFIE9GICovCi0JaW50IGNvdW50OwotCVRyYW5zcG9ydEFkZHJlc3MgaXRlbVsxMF07Ci19IFJlZ2lzdHJhdGlvblJlcXVlc3RfcmFzQWRkcmVzczsKLQotdHlwZWRlZiBzdHJ1Y3QgUmVnaXN0cmF0aW9uUmVxdWVzdCB7CS8qIFNFUVVFTkNFICovCi0JZW51bSB7Ci0JCWVSZWdpc3RyYXRpb25SZXF1ZXN0X25vblN0YW5kYXJkRGF0YSA9ICgxIDw8IDMxKSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfdGVybWluYWxBbGlhcyA9ICgxIDw8IDMwKSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfZ2F0ZWtlZXBlcklkZW50aWZpZXIgPSAoMSA8PCAyOSksCi0JCWVSZWdpc3RyYXRpb25SZXF1ZXN0X2FsdGVybmF0ZUVuZHBvaW50cyA9ICgxIDw8IDI4KSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfdGltZVRvTGl2ZSA9ICgxIDw8IDI3KSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfdG9rZW5zID0gKDEgPDwgMjYpLAotCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNSksCi0JCWVSZWdpc3RyYXRpb25SZXF1ZXN0X2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAyNCksCi0JCWVSZWdpc3RyYXRpb25SZXF1ZXN0X2tlZXBBbGl2ZSA9ICgxIDw8IDIzKSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfZW5kcG9pbnRJZGVudGlmaWVyID0gKDEgPDwgMjIpLAotCQllUmVnaXN0cmF0aW9uUmVxdWVzdF93aWxsU3VwcGx5VVVJRXMgPSAoMSA8PCAyMSksCi0JCWVSZWdpc3RyYXRpb25SZXF1ZXN0X21haW50YWluQ29ubmVjdGlvbiA9ICgxIDw8IDIwKSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfYWx0ZXJuYXRlVHJhbnNwb3J0QWRkcmVzc2VzID0gKDEgPDwgMTkpLAotCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9hZGRpdGl2ZVJlZ2lzdHJhdGlvbiA9ICgxIDw8IDE4KSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfdGVybWluYWxBbGlhc1BhdHRlcm4gPSAoMSA8PCAxNyksCi0JCWVSZWdpc3RyYXRpb25SZXF1ZXN0X3N1cHBvcnRzQWx0R0sgPSAoMSA8PCAxNiksCi0JCWVSZWdpc3RyYXRpb25SZXF1ZXN0X3VzYWdlUmVwb3J0aW5nQ2FwYWJpbGl0eSA9ICgxIDw8IDE1KSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfbXVsdGlwbGVDYWxscyA9ICgxIDw8IDE0KSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3Rfc3VwcG9ydGVkSDI0OFBhY2thZ2VzID0gKDEgPDwgMTMpLAotCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9jYWxsQ3JlZGl0Q2FwYWJpbGl0eSA9ICgxIDw8IDEyKSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfY2FwYWNpdHlSZXBvcnRpbmdDYXBhYmlsaXR5ID0gKDEgPDwgMTEpLAotCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9jYXBhY2l0eSA9ICgxIDw8IDEwKSwKLQkJZVJlZ2lzdHJhdGlvblJlcXVlc3RfZmVhdHVyZVNldCA9ICgxIDw8IDkpLAotCQllUmVnaXN0cmF0aW9uUmVxdWVzdF9nZW5lcmljRGF0YSA9ICgxIDw8IDgpLAotCX0gb3B0aW9uczsKLQlSZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzIGNhbGxTaWduYWxBZGRyZXNzOwotCVJlZ2lzdHJhdGlvblJlcXVlc3RfcmFzQWRkcmVzcyByYXNBZGRyZXNzOwotCXVuc2lnbmVkIHRpbWVUb0xpdmU7Ci19IFJlZ2lzdHJhdGlvblJlcXVlc3Q7Ci0KLXR5cGVkZWYgc3RydWN0IFJlZ2lzdHJhdGlvbkNvbmZpcm1fY2FsbFNpZ25hbEFkZHJlc3MgewkvKiBTRVFVRU5DRSBPRiAqLwotCWludCBjb3VudDsKLQlUcmFuc3BvcnRBZGRyZXNzIGl0ZW1bMTBdOwotfSBSZWdpc3RyYXRpb25Db25maXJtX2NhbGxTaWduYWxBZGRyZXNzOwotCi10eXBlZGVmIHN0cnVjdCBSZWdpc3RyYXRpb25Db25maXJtIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMzEpLAotCQllUmVnaXN0cmF0aW9uQ29uZmlybV90ZXJtaW5hbEFsaWFzID0gKDEgPDwgMzApLAotCQllUmVnaXN0cmF0aW9uQ29uZmlybV9nYXRla2VlcGVySWRlbnRpZmllciA9ICgxIDw8IDI5KSwKLQkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fYWx0ZXJuYXRlR2F0ZWtlZXBlciA9ICgxIDw8IDI4KSwKLQkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fdGltZVRvTGl2ZSA9ICgxIDw8IDI3KSwKLQkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fdG9rZW5zID0gKDEgPDwgMjYpLAotCQllUmVnaXN0cmF0aW9uQ29uZmlybV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNSksCi0JCWVSZWdpc3RyYXRpb25Db25maXJtX2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAyNCksCi0JCWVSZWdpc3RyYXRpb25Db25maXJtX3dpbGxSZXNwb25kVG9JUlIgPSAoMSA8PCAyMyksCi0JCWVSZWdpc3RyYXRpb25Db25maXJtX3ByZUdyYW50ZWRBUlEgPSAoMSA8PCAyMiksCi0JCWVSZWdpc3RyYXRpb25Db25maXJtX21haW50YWluQ29ubmVjdGlvbiA9ICgxIDw8IDIxKSwKLQkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fc2VydmljZUNvbnRyb2wgPSAoMSA8PCAyMCksCi0JCWVSZWdpc3RyYXRpb25Db25maXJtX3N1cHBvcnRzQWRkaXRpdmVSZWdpc3RyYXRpb24gPSAoMSA8PCAxOSksCi0JCWVSZWdpc3RyYXRpb25Db25maXJtX3Rlcm1pbmFsQWxpYXNQYXR0ZXJuID0gKDEgPDwgMTgpLAotCQllUmVnaXN0cmF0aW9uQ29uZmlybV9zdXBwb3J0ZWRQcmVmaXhlcyA9ICgxIDw8IDE3KSwKLQkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fdXNhZ2VTcGVjID0gKDEgPDwgMTYpLAotCQllUmVnaXN0cmF0aW9uQ29uZmlybV9mZWF0dXJlU2VydmVyQWxpYXMgPSAoMSA8PCAxNSksCi0JCWVSZWdpc3RyYXRpb25Db25maXJtX2NhcGFjaXR5UmVwb3J0aW5nU3BlYyA9ICgxIDw8IDE0KSwKLQkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fZmVhdHVyZVNldCA9ICgxIDw8IDEzKSwKLQkJZVJlZ2lzdHJhdGlvbkNvbmZpcm1fZ2VuZXJpY0RhdGEgPSAoMSA8PCAxMiksCi0JfSBvcHRpb25zOwotCVJlZ2lzdHJhdGlvbkNvbmZpcm1fY2FsbFNpZ25hbEFkZHJlc3MgY2FsbFNpZ25hbEFkZHJlc3M7Ci0JdW5zaWduZWQgdGltZVRvTGl2ZTsKLX0gUmVnaXN0cmF0aW9uQ29uZmlybTsKLQotdHlwZWRlZiBzdHJ1Y3QgVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzIHsJLyogU0VRVUVOQ0UgT0YgKi8KLQlpbnQgY291bnQ7Ci0JVHJhbnNwb3J0QWRkcmVzcyBpdGVtWzEwXTsKLX0gVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzOwotCi10eXBlZGVmIHN0cnVjdCBVbnJlZ2lzdHJhdGlvblJlcXVlc3QgewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2VuZHBvaW50QWxpYXMgPSAoMSA8PCAzMSksCi0JCWVVbnJlZ2lzdHJhdGlvblJlcXVlc3Rfbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMzApLAotCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2VuZHBvaW50SWRlbnRpZmllciA9ICgxIDw8IDI5KSwKLQkJZVVucmVnaXN0cmF0aW9uUmVxdWVzdF9hbHRlcm5hdGVFbmRwb2ludHMgPSAoMSA8PCAyOCksCi0JCWVVbnJlZ2lzdHJhdGlvblJlcXVlc3RfZ2F0ZWtlZXBlcklkZW50aWZpZXIgPSAoMSA8PCAyNyksCi0JCWVVbnJlZ2lzdHJhdGlvblJlcXVlc3RfdG9rZW5zID0gKDEgPDwgMjYpLAotCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2NyeXB0b1Rva2VucyA9ICgxIDw8IDI1KSwKLQkJZVVucmVnaXN0cmF0aW9uUmVxdWVzdF9pbnRlZ3JpdHlDaGVja1ZhbHVlID0gKDEgPDwgMjQpLAotCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X3JlYXNvbiA9ICgxIDw8IDIzKSwKLQkJZVVucmVnaXN0cmF0aW9uUmVxdWVzdF9lbmRwb2ludEFsaWFzUGF0dGVybiA9ICgxIDw8IDIyKSwKLQkJZVVucmVnaXN0cmF0aW9uUmVxdWVzdF9zdXBwb3J0ZWRQcmVmaXhlcyA9ICgxIDw8IDIxKSwKLQkJZVVucmVnaXN0cmF0aW9uUmVxdWVzdF9hbHRlcm5hdGVHYXRla2VlcGVyID0gKDEgPDwgMjApLAotCQllVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2dlbmVyaWNEYXRhID0gKDEgPDwgMTkpLAotCX0gb3B0aW9uczsKLQlVbnJlZ2lzdHJhdGlvblJlcXVlc3RfY2FsbFNpZ25hbEFkZHJlc3MgY2FsbFNpZ25hbEFkZHJlc3M7Ci19IFVucmVnaXN0cmF0aW9uUmVxdWVzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgQWRtaXNzaW9uUmVxdWVzdCB7CS8qIFNFUVVFTkNFICovCi0JZW51bSB7Ci0JCWVBZG1pc3Npb25SZXF1ZXN0X2NhbGxNb2RlbCA9ICgxIDw8IDMxKSwKLQkJZUFkbWlzc2lvblJlcXVlc3RfZGVzdGluYXRpb25JbmZvID0gKDEgPDwgMzApLAotCQllQWRtaXNzaW9uUmVxdWVzdF9kZXN0Q2FsbFNpZ25hbEFkZHJlc3MgPSAoMSA8PCAyOSksCi0JCWVBZG1pc3Npb25SZXF1ZXN0X2Rlc3RFeHRyYUNhbGxJbmZvID0gKDEgPDwgMjgpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9zcmNDYWxsU2lnbmFsQWRkcmVzcyA9ICgxIDw8IDI3KSwKLQkJZUFkbWlzc2lvblJlcXVlc3Rfbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMjYpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9jYWxsU2VydmljZXMgPSAoMSA8PCAyNSksCi0JCWVBZG1pc3Npb25SZXF1ZXN0X2Nhbk1hcEFsaWFzID0gKDEgPDwgMjQpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9jYWxsSWRlbnRpZmllciA9ICgxIDw8IDIzKSwKLQkJZUFkbWlzc2lvblJlcXVlc3Rfc3JjQWx0ZXJuYXRpdmVzID0gKDEgPDwgMjIpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9kZXN0QWx0ZXJuYXRpdmVzID0gKDEgPDwgMjEpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9nYXRla2VlcGVySWRlbnRpZmllciA9ICgxIDw8IDIwKSwKLQkJZUFkbWlzc2lvblJlcXVlc3RfdG9rZW5zID0gKDEgPDwgMTkpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAxOCksCi0JCWVBZG1pc3Npb25SZXF1ZXN0X2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAxNyksCi0JCWVBZG1pc3Npb25SZXF1ZXN0X3RyYW5zcG9ydFFPUyA9ICgxIDw8IDE2KSwKLQkJZUFkbWlzc2lvblJlcXVlc3Rfd2lsbFN1cHBseVVVSUVzID0gKDEgPDwgMTUpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9jYWxsTGlua2FnZSA9ICgxIDw8IDE0KSwKLQkJZUFkbWlzc2lvblJlcXVlc3RfZ2F0ZXdheURhdGFSYXRlID0gKDEgPDwgMTMpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9jYXBhY2l0eSA9ICgxIDw8IDEyKSwKLQkJZUFkbWlzc2lvblJlcXVlc3RfY2lyY3VpdEluZm8gPSAoMSA8PCAxMSksCi0JCWVBZG1pc3Npb25SZXF1ZXN0X2Rlc2lyZWRQcm90b2NvbHMgPSAoMSA8PCAxMCksCi0JCWVBZG1pc3Npb25SZXF1ZXN0X2Rlc2lyZWRUdW5uZWxsZWRQcm90b2NvbCA9ICgxIDw8IDkpLAotCQllQWRtaXNzaW9uUmVxdWVzdF9mZWF0dXJlU2V0ID0gKDEgPDwgOCksCi0JCWVBZG1pc3Npb25SZXF1ZXN0X2dlbmVyaWNEYXRhID0gKDEgPDwgNyksCi0JfSBvcHRpb25zOwotCVRyYW5zcG9ydEFkZHJlc3MgZGVzdENhbGxTaWduYWxBZGRyZXNzOwotCVRyYW5zcG9ydEFkZHJlc3Mgc3JjQ2FsbFNpZ25hbEFkZHJlc3M7Ci19IEFkbWlzc2lvblJlcXVlc3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEFkbWlzc2lvbkNvbmZpcm0gewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllQWRtaXNzaW9uQ29uZmlybV9pcnJGcmVxdWVuY3kgPSAoMSA8PCAzMSksCi0JCWVBZG1pc3Npb25Db25maXJtX25vblN0YW5kYXJkRGF0YSA9ICgxIDw8IDMwKSwKLQkJZUFkbWlzc2lvbkNvbmZpcm1fZGVzdGluYXRpb25JbmZvID0gKDEgPDwgMjkpLAotCQllQWRtaXNzaW9uQ29uZmlybV9kZXN0RXh0cmFDYWxsSW5mbyA9ICgxIDw8IDI4KSwKLQkJZUFkbWlzc2lvbkNvbmZpcm1fZGVzdGluYXRpb25UeXBlID0gKDEgPDwgMjcpLAotCQllQWRtaXNzaW9uQ29uZmlybV9yZW1vdGVFeHRlbnNpb25BZGRyZXNzID0gKDEgPDwgMjYpLAotCQllQWRtaXNzaW9uQ29uZmlybV9hbHRlcm5hdGVFbmRwb2ludHMgPSAoMSA8PCAyNSksCi0JCWVBZG1pc3Npb25Db25maXJtX3Rva2VucyA9ICgxIDw8IDI0KSwKLQkJZUFkbWlzc2lvbkNvbmZpcm1fY3J5cHRvVG9rZW5zID0gKDEgPDwgMjMpLAotCQllQWRtaXNzaW9uQ29uZmlybV9pbnRlZ3JpdHlDaGVja1ZhbHVlID0gKDEgPDwgMjIpLAotCQllQWRtaXNzaW9uQ29uZmlybV90cmFuc3BvcnRRT1MgPSAoMSA8PCAyMSksCi0JCWVBZG1pc3Npb25Db25maXJtX3dpbGxSZXNwb25kVG9JUlIgPSAoMSA8PCAyMCksCi0JCWVBZG1pc3Npb25Db25maXJtX3V1aWVzUmVxdWVzdGVkID0gKDEgPDwgMTkpLAotCQllQWRtaXNzaW9uQ29uZmlybV9sYW5ndWFnZSA9ICgxIDw8IDE4KSwKLQkJZUFkbWlzc2lvbkNvbmZpcm1fYWx0ZXJuYXRlVHJhbnNwb3J0QWRkcmVzc2VzID0gKDEgPDwgMTcpLAotCQllQWRtaXNzaW9uQ29uZmlybV91c2VTcGVjaWZpZWRUcmFuc3BvcnQgPSAoMSA8PCAxNiksCi0JCWVBZG1pc3Npb25Db25maXJtX2NpcmN1aXRJbmZvID0gKDEgPDwgMTUpLAotCQllQWRtaXNzaW9uQ29uZmlybV91c2FnZVNwZWMgPSAoMSA8PCAxNCksCi0JCWVBZG1pc3Npb25Db25maXJtX3N1cHBvcnRlZFByb3RvY29scyA9ICgxIDw8IDEzKSwKLQkJZUFkbWlzc2lvbkNvbmZpcm1fc2VydmljZUNvbnRyb2wgPSAoMSA8PCAxMiksCi0JCWVBZG1pc3Npb25Db25maXJtX211bHRpcGxlQ2FsbHMgPSAoMSA8PCAxMSksCi0JCWVBZG1pc3Npb25Db25maXJtX2ZlYXR1cmVTZXQgPSAoMSA8PCAxMCksCi0JCWVBZG1pc3Npb25Db25maXJtX2dlbmVyaWNEYXRhID0gKDEgPDwgOSksCi0JfSBvcHRpb25zOwotCVRyYW5zcG9ydEFkZHJlc3MgZGVzdENhbGxTaWduYWxBZGRyZXNzOwotfSBBZG1pc3Npb25Db25maXJtOwotCi10eXBlZGVmIHN0cnVjdCBMb2NhdGlvblJlcXVlc3QgewkvKiBTRVFVRU5DRSAqLwotCWVudW0gewotCQllTG9jYXRpb25SZXF1ZXN0X2VuZHBvaW50SWRlbnRpZmllciA9ICgxIDw8IDMxKSwKLQkJZUxvY2F0aW9uUmVxdWVzdF9ub25TdGFuZGFyZERhdGEgPSAoMSA8PCAzMCksCi0JCWVMb2NhdGlvblJlcXVlc3Rfc291cmNlSW5mbyA9ICgxIDw8IDI5KSwKLQkJZUxvY2F0aW9uUmVxdWVzdF9jYW5NYXBBbGlhcyA9ICgxIDw8IDI4KSwKLQkJZUxvY2F0aW9uUmVxdWVzdF9nYXRla2VlcGVySWRlbnRpZmllciA9ICgxIDw8IDI3KSwKLQkJZUxvY2F0aW9uUmVxdWVzdF90b2tlbnMgPSAoMSA8PCAyNiksCi0JCWVMb2NhdGlvblJlcXVlc3RfY3J5cHRvVG9rZW5zID0gKDEgPDwgMjUpLAotCQllTG9jYXRpb25SZXF1ZXN0X2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAyNCksCi0JCWVMb2NhdGlvblJlcXVlc3RfZGVzaXJlZFByb3RvY29scyA9ICgxIDw8IDIzKSwKLQkJZUxvY2F0aW9uUmVxdWVzdF9kZXNpcmVkVHVubmVsbGVkUHJvdG9jb2wgPSAoMSA8PCAyMiksCi0JCWVMb2NhdGlvblJlcXVlc3RfZmVhdHVyZVNldCA9ICgxIDw8IDIxKSwKLQkJZUxvY2F0aW9uUmVxdWVzdF9nZW5lcmljRGF0YSA9ICgxIDw8IDIwKSwKLQkJZUxvY2F0aW9uUmVxdWVzdF9ob3BDb3VudCA9ICgxIDw8IDE5KSwKLQkJZUxvY2F0aW9uUmVxdWVzdF9jaXJjdWl0SW5mbyA9ICgxIDw8IDE4KSwKLQl9IG9wdGlvbnM7Ci0JVHJhbnNwb3J0QWRkcmVzcyByZXBseUFkZHJlc3M7Ci19IExvY2F0aW9uUmVxdWVzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgTG9jYXRpb25Db25maXJtIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZUxvY2F0aW9uQ29uZmlybV9ub25TdGFuZGFyZERhdGEgPSAoMSA8PCAzMSksCi0JCWVMb2NhdGlvbkNvbmZpcm1fZGVzdGluYXRpb25JbmZvID0gKDEgPDwgMzApLAotCQllTG9jYXRpb25Db25maXJtX2Rlc3RFeHRyYUNhbGxJbmZvID0gKDEgPDwgMjkpLAotCQllTG9jYXRpb25Db25maXJtX2Rlc3RpbmF0aW9uVHlwZSA9ICgxIDw8IDI4KSwKLQkJZUxvY2F0aW9uQ29uZmlybV9yZW1vdGVFeHRlbnNpb25BZGRyZXNzID0gKDEgPDwgMjcpLAotCQllTG9jYXRpb25Db25maXJtX2FsdGVybmF0ZUVuZHBvaW50cyA9ICgxIDw8IDI2KSwKLQkJZUxvY2F0aW9uQ29uZmlybV90b2tlbnMgPSAoMSA8PCAyNSksCi0JCWVMb2NhdGlvbkNvbmZpcm1fY3J5cHRvVG9rZW5zID0gKDEgPDwgMjQpLAotCQllTG9jYXRpb25Db25maXJtX2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAyMyksCi0JCWVMb2NhdGlvbkNvbmZpcm1fYWx0ZXJuYXRlVHJhbnNwb3J0QWRkcmVzc2VzID0gKDEgPDwgMjIpLAotCQllTG9jYXRpb25Db25maXJtX3N1cHBvcnRlZFByb3RvY29scyA9ICgxIDw8IDIxKSwKLQkJZUxvY2F0aW9uQ29uZmlybV9tdWx0aXBsZUNhbGxzID0gKDEgPDwgMjApLAotCQllTG9jYXRpb25Db25maXJtX2ZlYXR1cmVTZXQgPSAoMSA8PCAxOSksCi0JCWVMb2NhdGlvbkNvbmZpcm1fZ2VuZXJpY0RhdGEgPSAoMSA8PCAxOCksCi0JCWVMb2NhdGlvbkNvbmZpcm1fY2lyY3VpdEluZm8gPSAoMSA8PCAxNyksCi0JCWVMb2NhdGlvbkNvbmZpcm1fc2VydmljZUNvbnRyb2wgPSAoMSA8PCAxNiksCi0JfSBvcHRpb25zOwotCVRyYW5zcG9ydEFkZHJlc3MgY2FsbFNpZ25hbEFkZHJlc3M7Ci0JVHJhbnNwb3J0QWRkcmVzcyByYXNBZGRyZXNzOwotfSBMb2NhdGlvbkNvbmZpcm07Ci0KLXR5cGVkZWYgc3RydWN0IEluZm9SZXF1ZXN0UmVzcG9uc2VfY2FsbFNpZ25hbEFkZHJlc3MgewkvKiBTRVFVRU5DRSBPRiAqLwotCWludCBjb3VudDsKLQlUcmFuc3BvcnRBZGRyZXNzIGl0ZW1bMTBdOwotfSBJbmZvUmVxdWVzdFJlc3BvbnNlX2NhbGxTaWduYWxBZGRyZXNzOwotCi10eXBlZGVmIHN0cnVjdCBJbmZvUmVxdWVzdFJlc3BvbnNlIHsJLyogU0VRVUVOQ0UgKi8KLQllbnVtIHsKLQkJZUluZm9SZXF1ZXN0UmVzcG9uc2Vfbm9uU3RhbmRhcmREYXRhID0gKDEgPDwgMzEpLAotCQllSW5mb1JlcXVlc3RSZXNwb25zZV9lbmRwb2ludEFsaWFzID0gKDEgPDwgMzApLAotCQllSW5mb1JlcXVlc3RSZXNwb25zZV9wZXJDYWxsSW5mbyA9ICgxIDw8IDI5KSwKLQkJZUluZm9SZXF1ZXN0UmVzcG9uc2VfdG9rZW5zID0gKDEgPDwgMjgpLAotCQllSW5mb1JlcXVlc3RSZXNwb25zZV9jcnlwdG9Ub2tlbnMgPSAoMSA8PCAyNyksCi0JCWVJbmZvUmVxdWVzdFJlc3BvbnNlX2ludGVncml0eUNoZWNrVmFsdWUgPSAoMSA8PCAyNiksCi0JCWVJbmZvUmVxdWVzdFJlc3BvbnNlX25lZWRSZXNwb25zZSA9ICgxIDw8IDI1KSwKLQkJZUluZm9SZXF1ZXN0UmVzcG9uc2VfY2FwYWNpdHkgPSAoMSA8PCAyNCksCi0JCWVJbmZvUmVxdWVzdFJlc3BvbnNlX2lyclN0YXR1cyA9ICgxIDw8IDIzKSwKLQkJZUluZm9SZXF1ZXN0UmVzcG9uc2VfdW5zb2xpY2l0ZWQgPSAoMSA8PCAyMiksCi0JCWVJbmZvUmVxdWVzdFJlc3BvbnNlX2dlbmVyaWNEYXRhID0gKDEgPDwgMjEpLAotCX0gb3B0aW9uczsKLQlUcmFuc3BvcnRBZGRyZXNzIHJhc0FkZHJlc3M7Ci0JSW5mb1JlcXVlc3RSZXNwb25zZV9jYWxsU2lnbmFsQWRkcmVzcyBjYWxsU2lnbmFsQWRkcmVzczsKLX0gSW5mb1JlcXVlc3RSZXNwb25zZTsKLQotdHlwZWRlZiBzdHJ1Y3QgUmFzTWVzc2FnZSB7CS8qIENIT0lDRSAqLwotCWVudW0gewotCQllUmFzTWVzc2FnZV9nYXRla2VlcGVyUmVxdWVzdCwKLQkJZVJhc01lc3NhZ2VfZ2F0ZWtlZXBlckNvbmZpcm0sCi0JCWVSYXNNZXNzYWdlX2dhdGVrZWVwZXJSZWplY3QsCi0JCWVSYXNNZXNzYWdlX3JlZ2lzdHJhdGlvblJlcXVlc3QsCi0JCWVSYXNNZXNzYWdlX3JlZ2lzdHJhdGlvbkNvbmZpcm0sCi0JCWVSYXNNZXNzYWdlX3JlZ2lzdHJhdGlvblJlamVjdCwKLQkJZVJhc01lc3NhZ2VfdW5yZWdpc3RyYXRpb25SZXF1ZXN0LAotCQllUmFzTWVzc2FnZV91bnJlZ2lzdHJhdGlvbkNvbmZpcm0sCi0JCWVSYXNNZXNzYWdlX3VucmVnaXN0cmF0aW9uUmVqZWN0LAotCQllUmFzTWVzc2FnZV9hZG1pc3Npb25SZXF1ZXN0LAotCQllUmFzTWVzc2FnZV9hZG1pc3Npb25Db25maXJtLAotCQllUmFzTWVzc2FnZV9hZG1pc3Npb25SZWplY3QsCi0JCWVSYXNNZXNzYWdlX2JhbmR3aWR0aFJlcXVlc3QsCi0JCWVSYXNNZXNzYWdlX2JhbmR3aWR0aENvbmZpcm0sCi0JCWVSYXNNZXNzYWdlX2JhbmR3aWR0aFJlamVjdCwKLQkJZVJhc01lc3NhZ2VfZGlzZW5nYWdlUmVxdWVzdCwKLQkJZVJhc01lc3NhZ2VfZGlzZW5nYWdlQ29uZmlybSwKLQkJZVJhc01lc3NhZ2VfZGlzZW5nYWdlUmVqZWN0LAotCQllUmFzTWVzc2FnZV9sb2NhdGlvblJlcXVlc3QsCi0JCWVSYXNNZXNzYWdlX2xvY2F0aW9uQ29uZmlybSwKLQkJZVJhc01lc3NhZ2VfbG9jYXRpb25SZWplY3QsCi0JCWVSYXNNZXNzYWdlX2luZm9SZXF1ZXN0LAotCQllUmFzTWVzc2FnZV9pbmZvUmVxdWVzdFJlc3BvbnNlLAotCQllUmFzTWVzc2FnZV9ub25TdGFuZGFyZE1lc3NhZ2UsCi0JCWVSYXNNZXNzYWdlX3Vua25vd25NZXNzYWdlUmVzcG9uc2UsCi0JCWVSYXNNZXNzYWdlX3JlcXVlc3RJblByb2dyZXNzLAotCQllUmFzTWVzc2FnZV9yZXNvdXJjZXNBdmFpbGFibGVJbmRpY2F0ZSwKLQkJZVJhc01lc3NhZ2VfcmVzb3VyY2VzQXZhaWxhYmxlQ29uZmlybSwKLQkJZVJhc01lc3NhZ2VfaW5mb1JlcXVlc3RBY2ssCi0JCWVSYXNNZXNzYWdlX2luZm9SZXF1ZXN0TmFrLAotCQllUmFzTWVzc2FnZV9zZXJ2aWNlQ29udHJvbEluZGljYXRpb24sCi0JCWVSYXNNZXNzYWdlX3NlcnZpY2VDb250cm9sUmVzcG9uc2UsCi0JfSBjaG9pY2U7Ci0JdW5pb24gewotCQlHYXRla2VlcGVyUmVxdWVzdCBnYXRla2VlcGVyUmVxdWVzdDsKLQkJR2F0ZWtlZXBlckNvbmZpcm0gZ2F0ZWtlZXBlckNvbmZpcm07Ci0JCVJlZ2lzdHJhdGlvblJlcXVlc3QgcmVnaXN0cmF0aW9uUmVxdWVzdDsKLQkJUmVnaXN0cmF0aW9uQ29uZmlybSByZWdpc3RyYXRpb25Db25maXJtOwotCQlVbnJlZ2lzdHJhdGlvblJlcXVlc3QgdW5yZWdpc3RyYXRpb25SZXF1ZXN0OwotCQlBZG1pc3Npb25SZXF1ZXN0IGFkbWlzc2lvblJlcXVlc3Q7Ci0JCUFkbWlzc2lvbkNvbmZpcm0gYWRtaXNzaW9uQ29uZmlybTsKLQkJTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdDsKLQkJTG9jYXRpb25Db25maXJtIGxvY2F0aW9uQ29uZmlybTsKLQkJSW5mb1JlcXVlc3RSZXNwb25zZSBpbmZvUmVxdWVzdFJlc3BvbnNlOwotCX07Ci19IFJhc01lc3NhZ2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b19ncmUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oCmluZGV4IDFkODUzYWEuLmUzNzFlMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oCkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogfQogCiAvKiBnZXQgcG9pbnRlciBvdCBncmUgY3N1bSwgaWYgcHJlc2VudCAqLwotc3RhdGljIGlubGluZSB1X2ludDE2X3QgKmdyZV9jc3VtKHN0cnVjdCBncmVfaGRyICpncmVoKQorc3RhdGljIGlubGluZSBfX3N1bTE2ICpncmVfY3N1bShzdHJ1Y3QgZ3JlX2hkciAqZ3JlaCkKIHsKIAlpZiAoIWdyZWgtPmNzdW0pCiAJCXJldHVybiBOVUxMOwotCXJldHVybiAodV9pbnQxNl90ICopIChncmVoK3NpemVvZigqZ3JlaCkpOworCXJldHVybiAoX19zdW0xNiAqKSAoZ3JlaCtzaXplb2YoKmdyZWgpKTsKIH0KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3NpcC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2lwLmgKaW5kZXggOTEzZGFkNi4uYmVmNmM2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2lwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2lwLmgKQEAgLTUsMjMgKzUsMTggQEAKICNkZWZpbmUgU0lQX1BPUlQJNTA2MAogI2RlZmluZSBTSVBfVElNRU9VVAkzNjAwCiAKLSNkZWZpbmUgUE9TX1ZJQQkJMAotI2RlZmluZSBQT1NfQ09OVEFDVAkxCi0jZGVmaW5lIFBPU19DT05URU5UCTIKLSNkZWZpbmUgUE9TX01FRElBCTMKLSNkZWZpbmUgUE9TX09XTkVSCTQKLSNkZWZpbmUgUE9TX0NPTk5FQ1RJT04JNQotI2RlZmluZSBQT1NfUkVRX0hFQURFUgk2Ci0jZGVmaW5lIFBPU19TRFBfSEVBREVSCTcKLQotc3RydWN0IHNpcF9oZWFkZXJfbmZvIHsKLQljb25zdCBjaGFyCSpsbmFtZTsKLQljb25zdCBjaGFyCSpzbmFtZTsKLQljb25zdCBjaGFyCSpsbl9zdHI7Ci0Jc2l6ZV90CQlsbmxlbjsKLQlzaXplX3QJCXNubGVuOwotCXNpemVfdAkJbG5fc3RybGVuOwotCWludAkJKCptYXRjaF9sZW4pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitlbnVtIHNpcF9oZWFkZXJfcG9zIHsKKwlQT1NfUkVHX1JFUV9VUkksCisJUE9TX1JFUV9VUkksCisJUE9TX0ZST00sCisJUE9TX1RPLAorCVBPU19WSUEsCisJUE9TX0NPTlRBQ1QsCisJUE9TX0NPTlRFTlQsCisJUE9TX01FRElBLAorCVBPU19PV05FUiwKKwlQT1NfQ09OTkVDVElPTiwKKwlQT1NfU0RQX0hFQURFUiwKIH07CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgKCppcF9uYXRfc2lwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKQEAgLTM2LDkgKzMxLDEwIEBACiBleHRlcm4gaW50IGN0X3NpcF9nZXRfaW5mbyhjb25zdCBjaGFyICpkcHRyLCBzaXplX3QgZGxlbiwKIAkJCSAgIHVuc2lnbmVkIGludCAqbWF0Y2hvZmYsCiAJCQkgICB1bnNpZ25lZCBpbnQgKm1hdGNobGVuLAotCQkJICAgc3RydWN0IHNpcF9oZWFkZXJfbmZvICpobmZvKTsKKwkJCSAgIGVudW0gc2lwX2hlYWRlcl9wb3MgcG9zKTsKIGV4dGVybiBpbnQgY3Rfc2lwX2xubGVuKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmxpbWl0KTsKIGV4dGVybiBjb25zdCBjaGFyICpjdF9zaXBfc2VhcmNoKGNvbnN0IGNoYXIgKm5lZWRsZSwgY29uc3QgY2hhciAqaGF5c3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmVlZGxlX2xlbiwgc2l6ZV90IGhheXN0YWNrX2xlbik7CisJCQkJIHNpemVfdCBuZWVkbGVfbGVuLCBzaXplX3QgaGF5c3RhY2tfbGVuLAorCQkJCSBpbnQgY2FzZV9zZW5zaXRpdmUpOwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0lQX0NPTk5UUkFDS19TSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190ZnRwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190ZnRwLmgKaW5kZXggY2RlOTcyOS4uYTQwNGZjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfdGZ0cC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaApAQCAtNCw3ICs0LDcgQEAKICNkZWZpbmUgVEZUUF9QT1JUIDY5CiAKIHN0cnVjdCB0ZnRwaGRyIHsKLQl1X2ludDE2X3Qgb3Bjb2RlOworCV9fYmUxNiBvcGNvZGU7CiB9OwogCiAjZGVmaW5lIFRGVFBfT1BDT0RFX1JFQUQJMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKaW5kZXggYTUzNmJiZC4uNGYwNmRhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCkBAIC0xMDEsMTggKzEwMSwyMSBAQAogLyoKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlIGEgcmF3Ci0gKiBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4gKi8KLSNkZWZpbmUgSVBUX0JBU0VfQ1RMCQlYVF9CQVNFX0NUTAorICogc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuCisgKgorICogQVRURU5USU9OOiBjaGVjayBsaW51eC9pbi5oIGJlZm9yZSBhZGRpbmcgbmV3IG51bWJlciBoZXJlLgorICovCisjZGVmaW5lIElQVF9CQVNFX0NUTAkJNjQKIAotI2RlZmluZSBJUFRfU09fU0VUX1JFUExBQ0UJWFRfU09fU0VUX1JFUExBQ0UKLSNkZWZpbmUgSVBUX1NPX1NFVF9BRERfQ09VTlRFUlMJWFRfU09fU0VUX0FERF9DT1VOVEVSUwotI2RlZmluZSBJUFRfU09fU0VUX01BWAkJWFRfU09fU0VUX01BWAorI2RlZmluZSBJUFRfU09fU0VUX1JFUExBQ0UJKElQVF9CQVNFX0NUTCkKKyNkZWZpbmUgSVBUX1NPX1NFVF9BRERfQ09VTlRFUlMJKElQVF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIElQVF9TT19TRVRfTUFYCQlJUFRfU09fU0VUX0FERF9DT1VOVEVSUwogCi0jZGVmaW5lIElQVF9TT19HRVRfSU5GTwkJCVhUX1NPX0dFVF9JTkZPCi0jZGVmaW5lIElQVF9TT19HRVRfRU5UUklFUwkJWFRfU09fR0VUX0VOVFJJRVMKLSNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAlYVF9TT19HRVRfUkVWSVNJT05fTUFUQ0gKLSNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAotI2RlZmluZSBJUFRfU09fR0VUX01BWAkJCVhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKKyNkZWZpbmUgSVBUX1NPX0dFVF9JTkZPCQkJKElQVF9CQVNFX0NUTCkKKyNkZWZpbmUgSVBUX1NPX0dFVF9FTlRSSUVTCQkoSVBUX0JBU0VfQ1RMICsgMSkKKyNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoSVBUX0JBU0VfQ1RMICsgMikKKyNkZWZpbmUgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQJKElQVF9CQVNFX0NUTCArIDMpCisjZGVmaW5lIElQVF9TT19HRVRfTUFYCQkJSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKIAogI2RlZmluZSBJUFRfQ09OVElOVUUgWFRfQ09OVElOVUUKICNkZWZpbmUgSVBUX1JFVFVSTiBYVF9SRVRVUk4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmgKaW5kZXggODkyZjlhMy4uOTBmYTY1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmgKQEAgLTYsNyArNiw3IEBACiAjZGVmaW5lIElQVF9MT0dfVENQT1BUCQkweDAyCS8qIExvZyBUQ1Agb3B0aW9ucyAqLwogI2RlZmluZSBJUFRfTE9HX0lQT1BUCQkweDA0CS8qIExvZyBJUCBvcHRpb25zICovCiAjZGVmaW5lIElQVF9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLwotI2RlZmluZSBJUFRfTE9HX05GTE9HCQkweDEwCS8qIExvZyB1c2luZyBuZl9sb2cgYmFja2VuZCAqLworI2RlZmluZSBJUFRfTE9HX05GTE9HCQkweDEwCS8qIFVuc3VwcG9ydGVkLCBkb24ndCByZXVzZSAqLwogI2RlZmluZSBJUFRfTE9HX01BU0sJCTB4MWYKIAogc3RydWN0IGlwdF9sb2dfaW5mbyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oYXNobGltaXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2hhc2hsaW1pdC5oCmluZGV4IGFjMmNiNjQuLjU2NjIxMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2hhc2hsaW1pdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2hhc2hsaW1pdC5oCkBAIC0xLDQwICsxLDE0IEBACiAjaWZuZGVmIF9JUFRfSEFTSExJTUlUX0gKICNkZWZpbmUgX0lQVF9IQVNITElNSVRfSAogCi0vKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCi0jZGVmaW5lIElQVF9IQVNITElNSVRfU0NBTEUgMTAwMDAKLS8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAotICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaD4KIAotLyogZGV0YWlscyBvZiB0aGlzIHN0cnVjdHVyZSBoaWRkZW4gYnkgdGhlIGltcGxlbWVudGF0aW9uICovCi1zdHJ1Y3QgaXB0X2hhc2hsaW1pdF9odGFibGU7CisjZGVmaW5lIElQVF9IQVNITElNSVRfU0NBTEUJWFRfSEFTSExJTUlUX1NDQUxFCisjZGVmaW5lIElQVF9IQVNITElNSVRfSEFTSF9ESVAJWFRfSEFTSExJTUlUX0hBU0hfRElQCisjZGVmaW5lIElQVF9IQVNITElNSVRfSEFTSF9EUFQJWFRfSEFTSExJTUlUX0hBU0hfRFBUCisjZGVmaW5lIElQVF9IQVNITElNSVRfSEFTSF9TSVAJWFRfSEFTSExJTUlUX0hBU0hfU0lQCisjZGVmaW5lIElQVF9IQVNITElNSVRfSEFTSF9TUFQJWFRfSEFTSExJTUlUX0hBU0hfU1BUCiAKLSNkZWZpbmUgSVBUX0hBU0hMSU1JVF9IQVNIX0RJUAkweDAwMDEKLSNkZWZpbmUgSVBUX0hBU0hMSU1JVF9IQVNIX0RQVAkweDAwMDIKLSNkZWZpbmUgSVBUX0hBU0hMSU1JVF9IQVNIX1NJUAkweDAwMDQKLSNkZWZpbmUgSVBUX0hBU0hMSU1JVF9IQVNIX1NQVAkweDAwMDgKKyNkZWZpbmUgaXB0X2hhc2hsaW1pdF9pbmZvIHh0X2hhc2hsaW1pdF9pbmZvCiAKLXN0cnVjdCBoYXNobGltaXRfY2ZnIHsKLQl1X2ludDMyX3QgbW9kZTsJICAvKiBiaXRtYXNrIG9mIElQVF9IQVNITElNSVRfSEFTSF8qICovCi0JdV9pbnQzMl90IGF2ZzsgICAgLyogQXZlcmFnZSBzZWNzIGJldHdlZW4gcGFja2V0cyAqIHNjYWxlICovCi0JdV9pbnQzMl90IGJ1cnN0OyAgLyogUGVyaW9kIG11bHRpcGxpZXIgZm9yIHVwcGVyIGxpbWl0LiAqLwotCi0JLyogdXNlciBzcGVjaWZpZWQgKi8KLQl1X2ludDMyX3Qgc2l6ZTsJCS8qIGhvdyBtYW55IGJ1Y2tldHMgKi8KLQl1X2ludDMyX3QgbWF4OwkJLyogbWF4IG51bWJlciBvZiBlbnRyaWVzICovCi0JdV9pbnQzMl90IGdjX2ludGVydmFsOwkvKiBnYyBpbnRlcnZhbCAqLwotCXVfaW50MzJfdCBleHBpcmU7CS8qIHdoZW4gZG8gZW50cmllcyBleHBpcmU/ICovCi19OwotCi1zdHJ1Y3QgaXB0X2hhc2hsaW1pdF9pbmZvIHsKLQljaGFyIG5hbWUgW0lGTkFNU0laXTsJCS8qIG5hbWUgKi8KLQlzdHJ1Y3QgaGFzaGxpbWl0X2NmZyBjZmc7Ci0Jc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpoaW5mbzsKLQotCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCi0JdW5pb24gewotCQl2b2lkICpwdHI7Ci0JCXN0cnVjdCBpcHRfaGFzaGxpbWl0X2luZm8gKm1hc3RlcjsKLQl9IHU7Ci19OwotI2VuZGlmIC8qX0lQVF9IQVNITElNSVRfSCovCisjZW5kaWYgLyogX0lQVF9IQVNITElNSVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni5oCmluZGV4IGQ5N2UyNjguLjY2Y2E4ZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2LmgKQEAgLTYyLDEwICs2Miw4IEBACiAJTkZfSVA2X1BSSV9DT05OVFJBQ0tfREVGUkFHID0gLTQwMCwKIAlORl9JUDZfUFJJX1NFTElOVVhfRklSU1QgPSAtMjI1LAogCU5GX0lQNl9QUklfQ09OTlRSQUNLID0gLTIwMCwKLQlORl9JUDZfUFJJX0JSSURHRV9TQUJPVEFHRV9GT1JXQVJEID0gLTE3NSwKIAlORl9JUDZfUFJJX01BTkdMRSA9IC0xNTAsCiAJTkZfSVA2X1BSSV9OQVRfRFNUID0gLTEwMCwKLQlORl9JUDZfUFJJX0JSSURHRV9TQUJPVEFHRV9MT0NBTF9PVVQgPSAtNTAsCiAJTkZfSVA2X1BSSV9GSUxURVIgPSAwLAogCU5GX0lQNl9QUklfTkFUX1NSQyA9IDEwMCwKIAlORl9JUDZfUFJJX1NFTElOVVhfTEFTVCA9IDIyNSwKQEAgLTc0LDcgKzcyLDcgQEAKIAogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKIGV4dGVybiBpbnQgaXA2X3JvdXRlX21lX2hhcmRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfaXA2X2NoZWNrc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rLAorZXh0ZXJuIF9fc3VtMTYgbmZfaXA2X2NoZWNrc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBob29rLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwgdV9pbnQ4X3QgcHJvdG9jb2wpOwogCiBleHRlcm4gaW50IGlwdjZfbmV0ZmlsdGVyX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCmluZGV4IGQ3YThlOWMwLi40YWVkMzQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaApAQCAtMTA3LDE4ICsxMDcsMjEgQEAKIC8qCiAgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgogICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZQotICogYSByYXcgc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuICovCi0jZGVmaW5lIElQNlRfQkFTRV9DVEwJCQlYVF9CQVNFX0NUTAorICogYSByYXcgc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuCisgKgorICogQVRURU5USU9OOiBjaGVjayBsaW51eC9pbjYuaCBiZWZvcmUgYWRkaW5nIG5ldyBudW1iZXIgaGVyZS4KKyAqLworI2RlZmluZSBJUDZUX0JBU0VfQ1RMCQkJNjQKIAotI2RlZmluZSBJUDZUX1NPX1NFVF9SRVBMQUNFCQlYVF9TT19TRVRfUkVQTEFDRQotI2RlZmluZSBJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMJWFRfU09fU0VUX0FERF9DT1VOVEVSUwotI2RlZmluZSBJUDZUX1NPX1NFVF9NQVgJCQlYVF9TT19TRVRfTUFYCisjZGVmaW5lIElQNlRfU09fU0VUX1JFUExBQ0UJCShJUDZUX0JBU0VfQ1RMKQorI2RlZmluZSBJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMJKElQNlRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBJUDZUX1NPX1NFVF9NQVgJCQlJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMKIAotI2RlZmluZSBJUDZUX1NPX0dFVF9JTkZPCQlYVF9TT19HRVRfSU5GTwotI2RlZmluZSBJUDZUX1NPX0dFVF9FTlRSSUVTCQlYVF9TT19HRVRfRU5UUklFUwotI2RlZmluZQlJUDZUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAlYVF9TT19HRVRfUkVWSVNJT05fTUFUQ0gKLSNkZWZpbmUJSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCVhUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQKLSNkZWZpbmUgSVA2VF9TT19HRVRfTUFYCQkJWFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorI2RlZmluZSBJUDZUX1NPX0dFVF9JTkZPCQkoSVA2VF9CQVNFX0NUTCkKKyNkZWZpbmUgSVA2VF9TT19HRVRfRU5UUklFUwkJKElQNlRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBJUDZUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoSVA2VF9CQVNFX0NUTCArIDQpCisjZGVmaW5lIElQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoSVA2VF9CQVNFX0NUTCArIDUpCisjZGVmaW5lIElQNlRfU09fR0VUX01BWAkJCUlQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAogCiAvKiBDT05USU5VRSB2ZXJkaWN0IGZvciB0YXJnZXRzICovCiAjZGVmaW5lIElQNlRfQ09OVElOVUUgWFRfQ09OVElOVUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9MT0cuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9MT0cuaAppbmRleCAwNjBjMWExLi4wZDAxMTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTE9HLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0xPRy5oCkBAIC02LDcgKzYsNyBAQAogI2RlZmluZSBJUDZUX0xPR19UQ1BPUFQJCTB4MDIJLyogTG9nIFRDUCBvcHRpb25zICovCiAjZGVmaW5lIElQNlRfTE9HX0lQT1BUCQkweDA0CS8qIExvZyBJUCBvcHRpb25zICovCiAjZGVmaW5lIElQNlRfTE9HX1VJRAkJMHgwOAkvKiBMb2cgVUlEIG93bmluZyBsb2NhbCBzb2NrZXQgKi8KLSNkZWZpbmUgSVA2VF9MT0dfTkZMT0cJCTB4MTAJLyogTG9nIHVzaW5nIG5mX2xvZyBiYWNrZW5kICovCisjZGVmaW5lIElQNlRfTE9HX05GTE9HCQkweDEwCS8qIFVuc3VwcG9ydGVkLCBkb24ndCB1c2UgKi8KICNkZWZpbmUgSVA2VF9MT0dfTUFTSwkJMHgxZgogCiBzdHJ1Y3QgaXA2dF9sb2dfaW5mbyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvbmV0bGluay5oCmluZGV4IDY2NDExNjIuLmIzYjliNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0bGluay5oCkBAIC0xNDEsNyArMTQxLDYgQEAKIHsKIAlzdHJ1Y3QgdWNyZWQJCWNyZWRzOwkJLyogU2tiIGNyZWRlbnRpYWxzCSovCiAJX191MzIJCQlwaWQ7Ci0JX191MzIJCQlkc3RfcGlkOwogCV9fdTMyCQkJZHN0X2dyb3VwOwogCWtlcm5lbF9jYXBfdAkJZWZmX2NhcDsKIAlfX3UzMgkJCWxvZ2ludWlkOwkvKiBMb2dpbiAoYXVkaXQpIHVpZCAqLwpAQCAtMTc0LDYgKzE3Myw3IEBACiAgKi8KICNkZWZpbmUgTkxNU0dfR09PRE9SREVSIDAKICNkZWZpbmUgTkxNU0dfR09PRFNJWkUgKFNLQl9NQVhfT1JERVIoMCwgTkxNU0dfR09PRE9SREVSKSkKKyNkZWZpbmUgTkxNU0dfREVGQVVMVF9TSVpFIChOTE1TR19HT09EU0laRSAtIE5MTVNHX0hEUkxFTikKIAogCiBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRwb2xsLmggYi9pbmNsdWRlL2xpbnV4L25ldHBvbGwuaAppbmRleCAxZWZlNjBjLi4yOTkzMGI3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRwb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRwb2xsLmgKQEAgLTEyLDI2ICsxMiwyNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCi1zdHJ1Y3QgbmV0cG9sbDsKLQogc3RydWN0IG5ldHBvbGwgewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JY2hhciBkZXZfbmFtZVsxNl0sICpuYW1lOworCWNoYXIgZGV2X25hbWVbSUZOQU1TSVpdOworCWNvbnN0IGNoYXIgKm5hbWU7CiAJdm9pZCAoKnJ4X2hvb2spKHN0cnVjdCBuZXRwb2xsICosIGludCwgY2hhciAqLCBpbnQpOwotCXZvaWQgKCpkcm9wKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwogCXUzMiBsb2NhbF9pcCwgcmVtb3RlX2lwOwogCXUxNiBsb2NhbF9wb3J0LCByZW1vdGVfcG9ydDsKLQl1bnNpZ25lZCBjaGFyIGxvY2FsX21hY1s2XSwgcmVtb3RlX21hY1s2XTsKKyAJdTggbG9jYWxfbWFjW0VUSF9BTEVOXSwgcmVtb3RlX21hY1tFVEhfQUxFTl07CiB9OwogCiBzdHJ1Y3QgbmV0cG9sbF9pbmZvIHsKKwlhdG9taWNfdCByZWZjbnQ7CiAJc3BpbmxvY2tfdCBwb2xsX2xvY2s7CiAJaW50IHBvbGxfb3duZXI7Ci0JaW50IHRyaWVzOwogCWludCByeF9mbGFnczsKIAlzcGlubG9ja190IHJ4X2xvY2s7CiAJc3RydWN0IG5ldHBvbGwgKnJ4X25wOyAvKiBuZXRwb2xsIHRoYXQgcmVnaXN0ZXJlZCBhbiByeF9ob29rICovCiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBhcnBfdHg7IC8qIGxpc3Qgb2YgYXJwIHJlcXVlc3RzIHRvIHJlcGx5IHRvICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0eF93b3JrOwogfTsKIAogdm9pZCBuZXRwb2xsX3BvbGwoc3RydWN0IG5ldHBvbGwgKm5wKTsKQEAgLTQyLDcgKzQzLDcgQEAKIHZvaWQgbmV0cG9sbF9zZXRfdHJhcChpbnQgdHJhcCk7CiB2b2lkIG5ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0cG9sbCAqbnApOwogaW50IF9fbmV0cG9sbF9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgbmV0cG9sbF9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwogCiAjaWZkZWYgQ09ORklHX05FVFBPTEwKIHN0YXRpYyBpbmxpbmUgaW50IG5ldHBvbGxfcngoc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDc2ZmY1NDguLjA0OTYzMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBGTFVTSF9ISUdIUFJJCQkxNgkvKiBoaWdoIHByaW9yaXR5IG1lbW9yeSByZWNsYWltIGZsdXNoICovCiAjZGVmaW5lIEZMVVNIX05PQ09NTUlUCQkzMgkvKiBEb24ndCBzZW5kIHRoZSBORlN2My92NCBDT01NSVQgKi8KICNkZWZpbmUgRkxVU0hfSU5WQUxJREFURQk2NAkvKiBJbnZhbGlkYXRlIHRoZSBwYWdlIGNhY2hlICovCisjZGVmaW5lIEZMVVNIX05PV1JJVEVQQUdFCTEyOAkvKiBEb24ndCBjYWxsIHdyaXRlcGFnZSgpICovCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTE1Nyw3ICsxNTgsNyBAQAogCSAqIFRoaXMgaXMgdGhlIGNvb2tpZSB2ZXJpZmllciB1c2VkIGZvciBORlN2MyByZWFkZGlyCiAJICogb3BlcmF0aW9ucwogCSAqLwotCV9fdTMyCQkJY29va2lldmVyZlsyXTsKKwlfX2JlMzIJCQljb29raWV2ZXJmWzJdOwogCiAJLyoKIAkgKiBUaGlzIGlzIHRoZSBsaXN0IG9mIGRpcnR5IHVud3JpdHRlbiBwYWdlcy4KQEAgLTI5MCw2ICsyOTEsNyBAQAogICogbGludXgvZnMvbmZzL2lub2RlLmMKICAqLwogZXh0ZXJuIGludCBuZnNfc3luY19tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKTsKK2V4dGVybiB2b2lkIG5mc196YXBfbWFwcGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyk7CiBleHRlcm4gdm9pZCBuZnNfemFwX2NhY2hlcyhzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGlub2RlICpuZnNfZmhnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBuZnNfZmggKiwKIAkJCQlzdHJ1Y3QgbmZzX2ZhdHRyICopOwpAQCAtMzE3LDcgKzMxOSw3IEBACiBleHRlcm4gc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKm5mc19maW5kX29wZW5fY29udGV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGludCBtb2RlKTsKIAogLyogbGludXgvbmV0L2lwdjQvaXBjb25maWcuYzogdHJpbXMgaXAgYWRkciBvZmYgZnJvbnQgb2YgbmFtZSwgdG9vLiAqLwotZXh0ZXJuIHUzMiByb290X25mc19wYXJzZV9hZGRyKGNoYXIgKm5hbWUpOyAvKl9faW5pdCovCitleHRlcm4gX19iZTMyIHJvb3RfbmZzX3BhcnNlX2FkZHIoY2hhciAqbmFtZSk7IC8qX19pbml0Ki8KIAogc3RhdGljIGlubGluZSB2b2lkIG5mc19mYXR0cl9pbml0KHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewpAQCAtNDI2LDE5ICs0MjgsMjEgQEAKIGV4dGVybiBpbnQgIG5mc191cGRhdGVwYWdlKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwYWdlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgbmZzX3dyaXRlYmFja19kb25lKHN0cnVjdCBycGNfdGFzayAqLCBzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKik7CiBleHRlcm4gdm9pZCBuZnNfd3JpdGVkYXRhX3JlbGVhc2Uodm9pZCAqKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykgfHwgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQotc3RydWN0IG5mc193cml0ZV9kYXRhICpuZnNfY29tbWl0X2FsbG9jKHZvaWQpOwotdm9pZCBuZnNfY29tbWl0X2ZyZWUoc3RydWN0IG5mc193cml0ZV9kYXRhICpwKTsKLSNlbmRpZgorZXh0ZXJuIGludCBuZnNfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKik7CiAKIC8qCiAgKiBUcnkgdG8gd3JpdGUgYmFjayBldmVyeXRoaW5nIHN5bmNocm9ub3VzbHkgKGJ1dCBjaGVjayB0aGUKICAqIHJldHVybiB2YWx1ZSEpCiAgKi8KLWV4dGVybiBpbnQgIG5mc19zeW5jX2lub2RlX3dhaXQoc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwgaW50KTsKK2V4dGVybiBsb25nIG5mc19zeW5jX21hcHBpbmdfd2FpdChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKiwgaW50KTsKK2V4dGVybiBpbnQgbmZzX3N5bmNfbWFwcGluZ19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBsb2ZmX3QsIGxvZmZfdCwgaW50KTsKK2V4dGVybiBpbnQgbmZzX3diX2FsbChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiBpbnQgbmZzX3diX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UqIHBhZ2UpOworZXh0ZXJuIGludCBuZnNfd2JfcGFnZV9wcmlvcml0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSogcGFnZSwgaW50IGhvdyk7CiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCiBleHRlcm4gaW50ICBuZnNfY29tbWl0X2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqbmZzX2NvbW1pdF9hbGxvYyh2b2lkKTsKK2V4dGVybiB2b2lkIG5mc19jb21taXRfZnJlZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhKTsKIGV4dGVybiB2b2lkIG5mc19jb21taXRfcmVsZWFzZSh2b2lkICp3ZGF0YSk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQKQEAgLTQ1NCwyOCArNDU4LDYgQEAKIAlyZXR1cm4gTkZTX0koaW5vZGUpLT5ucGFnZXMgIT0gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLW5mc193Yl9hbGwoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlpbnQgZXJyb3IgPSBuZnNfc3luY19pbm9kZV93YWl0KGlub2RlLCAwLCAwLCAwKTsKLQlyZXR1cm4gKGVycm9yIDwgMCkgPyBlcnJvciA6IDA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBiYWNrIGFsbCByZXF1ZXN0cyBvbiBvbmUgcGFnZSAtIHdlIGRvIHRoaXMgYmVmb3JlIHJlYWRpbmcgaXQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5mc193Yl9wYWdlX3ByaW9yaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlKiBwYWdlLCBpbnQgaG93KQotewotCWludCBlcnJvciA9IG5mc19zeW5jX2lub2RlX3dhaXQoaW5vZGUsIHBhZ2UtPmluZGV4LCAxLAotCQkJaG93IHwgRkxVU0hfU1RBQkxFKTsKLQlyZXR1cm4gKGVycm9yIDwgMCkgPyBlcnJvciA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mc193Yl9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlKiBwYWdlKQotewotCXJldHVybiBuZnNfd2JfcGFnZV9wcmlvcml0eShpbm9kZSwgcGFnZSwgMCk7Ci19Ci0KIC8qCiAgKiBBbGxvY2F0ZSBuZnNfd3JpdGVfZGF0YSBzdHJ1Y3R1cmVzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCmluZGV4IDdjY2ZjN2UuLjk1Nzk2ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaApAQCAtNTEsNyArNTEsNyBAQAogCiAJdW5zaWduZWQgbG9uZwkJY2xfbGVhc2VfdGltZTsKIAl1bnNpZ25lZCBsb25nCQljbF9sYXN0X3JlbmV3YWw7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CWNsX3JlbmV3ZDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWNsX3JlbmV3ZDsKIAogCXN0cnVjdCBycGNfd2FpdF9xdWV1ZQljbF9ycGN3YWl0cTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oIGIvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oCmluZGV4IDFmN2JkMjguLjJlNTU1ZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX3BhZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmgKQEAgLTMwLDYgKzMwLDggQEAKICNkZWZpbmUgUEdfQlVTWQkJCTAKICNkZWZpbmUgUEdfTkVFRF9DT01NSVQJCTEKICNkZWZpbmUgUEdfTkVFRF9SRVNDSEVECQkyCisjZGVmaW5lIFBHX05FRURfRkxVU0gJCTMKKyNkZWZpbmUgUEdfRkxVU0hJTkcJCTQKIAogc3RydWN0IG5mc19pbm9kZTsKIHN0cnVjdCBuZnNfcGFnZSB7CkBAIC02MCw4ICs2Miw5IEBACiBleHRlcm4Jdm9pZCBuZnNfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBuZnNfcGFnZSAqcmVxKTsKIAogCi1leHRlcm4gIGludCBuZnNfc2Nhbl9sb2NrX2RpcnR5KHN0cnVjdCBuZnNfaW5vZGUgKm5mc2ksIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKLQkJCQl1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwgdW5zaWduZWQgaW50IG5wYWdlcyk7CitleHRlcm4JbG9uZyBuZnNfc2Nhbl9kaXJ0eShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpkc3QpOwogZXh0ZXJuCWludCBuZnNfc2Nhbl9saXN0KHN0cnVjdCBuZnNfaW5vZGUgKm5mc2ksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKIAkJCSAgdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsIHVuc2lnbmVkIGludCBucGFnZXMpOwogZXh0ZXJuCWludCBuZnNfY29hbGVzY2VfcmVxdWVzdHMoc3RydWN0IGxpc3RfaGVhZCAqLCBzdHJ1Y3QgbGlzdF9oZWFkICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaCBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCmluZGV4IGRjNTM5N2QuLjllZTlkYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCkBAIC0yNjYsNyArMjY2LDcgQEAKIAogc3RydWN0IG5mc193cml0ZXZlcmYgewogCWVudW0gbmZzM19zdGFibGVfaG93CWNvbW1pdHRlZDsKLQlfX3UzMgkJCXZlcmlmaWVyWzJdOworCV9fYmUzMgkJCXZlcmlmaWVyWzJdOwogfTsKIAogc3RydWN0IG5mc193cml0ZXJlcyB7CkBAIC00MjAsNyArNDIwLDcgQEAKIAl1bnNpZ25lZCBpbnQJCWxlbjsKIAlzdHJ1Y3QgaWF0dHIgKgkJc2F0dHI7CiAJZW51bSBuZnMzX2NyZWF0ZW1vZGUJY3JlYXRlbW9kZTsKLQlfX3UzMgkJCXZlcmlmaWVyWzJdOworCV9fYmUzMgkJCXZlcmlmaWVyWzJdOwogfTsKIAogc3RydWN0IG5mczNfbWtkaXJhcmdzIHsKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogc3RydWN0IG5mczNfcmVhZGRpcmFyZ3MgewogCXN0cnVjdCBuZnNfZmggKgkJZmg7CiAJX191NjQJCQljb29raWU7Ci0JX191MzIJCQl2ZXJmWzJdOworCV9fYmUzMgkJCXZlcmZbMl07CiAJaW50CQkJcGx1czsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICBjb3VudDsKIAlzdHJ1Y3QgcGFnZSAqKgkJcGFnZXM7CkBAIC01MDMsNyArNTAzLDcgQEAKIAogc3RydWN0IG5mczNfcmVhZGRpcnJlcyB7CiAJc3RydWN0IG5mc19mYXR0ciAqCWRpcl9hdHRyOwotCV9fdTMyICoJCQl2ZXJmOworCV9fYmUzMiAqCQl2ZXJmOwogCWludAkJCXBsdXM7CiB9OwogCkBAIC03ODUsOCArNzg1LDYgQEAKIAlpbnQJKCpyZWFkbGluaykoc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICosIHVuc2lnbmVkIGludCwKIAkJCSAgICB1bnNpZ25lZCBpbnQpOwogCWludAkoKnJlYWQpICAgIChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqKTsKLQlpbnQJKCp3cml0ZSkgICAoc3RydWN0IG5mc193cml0ZV9kYXRhICopOwotCWludAkoKmNvbW1pdCkgIChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKik7CiAJaW50CSgqY3JlYXRlKSAgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosCiAJCQkgICAgc3RydWN0IGlhdHRyICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKIAlpbnQJKCpyZW1vdmUpICAoc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICopOwpAQCAtODExLDcgKzgwOSw3IEBACiAJaW50CSgqcGF0aGNvbmYpIChzdHJ1Y3QgbmZzX3NlcnZlciAqLCBzdHJ1Y3QgbmZzX2ZoICosCiAJCQkgICAgIHN0cnVjdCBuZnNfcGF0aGNvbmYgKik7CiAJaW50CSgqc2V0X2NhcGFiaWxpdGllcykoc3RydWN0IG5mc19zZXJ2ZXIgKiwgc3RydWN0IG5mc19maCAqKTsKLQl1MzIgKgkoKmRlY29kZV9kaXJlbnQpKHUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCBwbHVzKTsKKwlfX2JlMzIgKigqZGVjb2RlX2RpcmVudCkoX19iZTMyICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50IHBsdXMpOwogCXZvaWQJKCpyZWFkX3NldHVwKSAgIChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqKTsKIAlpbnQJKCpyZWFkX2RvbmUpICAoc3RydWN0IHJwY190YXNrICosIHN0cnVjdCBuZnNfcmVhZF9kYXRhICopOwogCXZvaWQJKCp3cml0ZV9zZXR1cCkgIChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKiwgaW50IGhvdyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9jYWNoZS5oCmluZGV4IGMzYTM1NTcuLjAwNzQ4MGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9jYWNoZS5oCkBAIC0yNiwxNCArMjYsMTQgQEAKIAkJCQljX3R5cGUsCQkvKiBzdGF0dXMsIGJ1ZmZlciAqLwogCQkJCWNfc2VjdXJlIDogMTsJLyogcmVxIGNhbWUgZnJvbSBwb3J0IDwgMTAyNCAqLwogCXN0cnVjdCBzb2NrYWRkcl9pbgljX2FkZHI7Ci0JdTMyCQkJY194aWQ7CisJX19iZTMyCQkJY194aWQ7CiAJdTMyCQkJY19wcm90OwogCXUzMgkJCWNfcHJvYzsKIAl1MzIJCQljX3ZlcnM7CiAJdW5zaWduZWQgbG9uZwkJY190aW1lc3RhbXA7CiAJdW5pb24gewogCQlzdHJ1Y3Qga3ZlYwl1X3ZlYzsKLQkJdTMyCQl1X3N0YXR1czsKKwkJX19iZTMyCQl1X3N0YXR1czsKIAl9CQkJY191OwogfTsKIApAQCAtNzUsNyArNzUsNyBAQAogdm9pZAluZnNkX2NhY2hlX2luaXQodm9pZCk7CiB2b2lkCW5mc2RfY2FjaGVfc2h1dGRvd24odm9pZCk7CiBpbnQJbmZzZF9jYWNoZV9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICosIGludCk7Ci12b2lkCW5mc2RfY2FjaGVfdXBkYXRlKHN0cnVjdCBzdmNfcnFzdCAqLCBpbnQsIHUzMiAqKTsKK3ZvaWQJbmZzZF9jYWNoZV91cGRhdGUoc3RydWN0IHN2Y19ycXN0ICosIGludCwgX19iZTMyICopOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIE5GU0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaAppbmRleCA2ZTc4ZWE5Li4wNDVlMzhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCkBAIC0xMTcsOCArMTE3LDggQEAKIAkJCQkgICBzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKTsKIGludAkJCWV4cF9yb290Zmgoc3RydWN0IGF1dGhfZG9tYWluICosIAogCQkJCQljaGFyICpwYXRoLCBzdHJ1Y3Qga25mc2RfZmggKiwgaW50IG1heHNpemUpOwotaW50CQkJZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IGF1dGhfZG9tYWluICosIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGNhY2hlX3JlcSAqY3JlcSk7Ci1pbnQJCQluZnNlcnJubyhpbnQgZXJybm8pOworX19iZTMyCQkJZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IGF1dGhfZG9tYWluICosIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGNhY2hlX3JlcSAqY3JlcSk7CitfX2JlMzIJCQluZnNlcnJubyhpbnQgZXJybm8pOwogCiBleHRlcm4gc3RydWN0IGNhY2hlX2RldGFpbCBzdmNfZXhwb3J0X2NhY2hlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAppbmRleCBkMGQ0YWFlLi4wNzI3Nzc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKQEAgLTUwLDcgKzUwLDcgQEAKICAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciByZWFkZGlyCiAgKi8KIHN0cnVjdCByZWFkZGlyX2NkIHsKLQlpbnQJCQllcnI7CS8qIDAsIG5mc2Vyciwgb3IgbmZzZXJyX2VvZiAqLworCV9fYmUzMgkJCWVycjsJLyogMCwgbmZzZXJyLCBvciBuZnNlcnJfZW9mICovCiB9OwogdHlwZWRlZiBpbnQJCSgqZW5jb2RlX2RlbnRfZm4pKHN0cnVjdCByZWFkZGlyX2NkICosIGNvbnN0IGNoYXIgKiwKIAkJCQkJCWludCwgbG9mZl90LCBpbm9fdCwgdW5zaWduZWQgaW50KTsKQEAgLTY0LDcgKzY0LDcgQEAKICAqIEZ1bmN0aW9uIHByb3RvdHlwZXMuCiAgKi8KIGludAkJbmZzZF9zdmModW5zaWduZWQgc2hvcnQgcG9ydCwgaW50IG5yc2VydnMpOwotaW50CQluZnNkX2Rpc3BhdGNoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqc3RhdHApOworaW50CQluZnNkX2Rpc3BhdGNoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqc3RhdHApOwogCiAvKiBuZnNkL3Zmcy5jICovCiBpbnQJCWZoX2xvY2tfcGFyZW50KHN0cnVjdCBzdmNfZmggKiwgc3RydWN0IGRlbnRyeSAqKTsKQEAgLTcyLDU3ICs3Miw1NyBAQAogdm9pZAkJbmZzZF9yYWNhY2hlX3NodXRkb3duKHZvaWQpOwogaW50CQluZnNkX2Nyb3NzX21udChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgZGVudHJ5ICoqZHBwLAogCQkgICAgICAgICAgICAgICAgc3RydWN0IHN2Y19leHBvcnQgKipleHBwKTsKLWludAkJbmZzZF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKK19fYmUzMgkJbmZzZF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQljb25zdCBjaGFyICosIGludCwgc3RydWN0IHN2Y19maCAqKTsKLWludAkJbmZzZF9zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCitfX2JlMzIJCW5mc2Rfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCXN0cnVjdCBpYXR0ciAqLCBpbnQsIHRpbWVfdCk7CiAjaWZkZWYgQ09ORklHX05GU0RfVjQKLWludCAgICAgICAgICAgICBuZnNkNF9zZXRfbmZzNF9hY2woc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKK19fYmUzMiAgICAgICAgICBuZnNkNF9zZXRfbmZzNF9hY2woc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mczRfYWNsICopOwogaW50ICAgICAgICAgICAgIG5mc2Q0X2dldF9uZnM0X2FjbChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmZzNF9hY2wgKiopOwogI2VuZGlmIC8qIENPTkZJR19ORlNEX1Y0ICovCi1pbnQJCW5mc2RfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCitfX2JlMzIJCW5mc2RfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJY2hhciAqbmFtZSwgaW50IGxlbiwgc3RydWN0IGlhdHRyICphdHRycywKIAkJCQlpbnQgdHlwZSwgZGV2X3QgcmRldiwgc3RydWN0IHN2Y19maCAqcmVzKTsKICNpZmRlZiBDT05GSUdfTkZTRF9WMwotaW50CQluZnNkX2FjY2VzcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLCB1MzIgKiwgdTMyICopOwotaW50CQluZnNkX2NyZWF0ZV92MyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorX19iZTMyCQluZnNkX2FjY2VzcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLCB1MzIgKiwgdTMyICopOworX19iZTMyCQluZnNkX2NyZWF0ZV92MyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCWNoYXIgKm5hbWUsIGludCBsZW4sIHN0cnVjdCBpYXR0ciAqYXR0cnMsCiAJCQkJc3RydWN0IHN2Y19maCAqcmVzLCBpbnQgY3JlYXRlbW9kZSwKLQkJCQl1MzIgKnZlcmlmaWVyLCBpbnQgKnRydW5jcCk7Ci1pbnQJCW5mc2RfY29tbWl0KHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCisJCQkJdTMyICp2ZXJpZmllciwgaW50ICp0cnVuY3AsIGludCAqY3JlYXRlZCk7CitfX2JlMzIJCW5mc2RfY29tbWl0KHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJbG9mZl90LCB1bnNpZ25lZCBsb25nKTsKICNlbmRpZiAvKiBDT05GSUdfTkZTRF9WMyAqLwotaW50CQluZnNkX29wZW4oc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgaW50LAorX19iZTMyCQluZnNkX29wZW4oc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgaW50LAogCQkJCWludCwgc3RydWN0IGZpbGUgKiopOwogdm9pZAkJbmZzZF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTsKLWludCAJCW5mc2RfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLCBzdHJ1Y3QgZmlsZSAqLAorX19iZTMyIAkJbmZzZF9yZWFkKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosIHN0cnVjdCBmaWxlICosCiAJCQkJbG9mZl90LCBzdHJ1Y3Qga3ZlYyAqLCBpbnQsIHVuc2lnbmVkIGxvbmcgKik7Ci1pbnQgCQluZnNkX3dyaXRlKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosc3RydWN0IGZpbGUgKiwKK19fYmUzMiAJCW5mc2Rfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKixzdHJ1Y3QgZmlsZSAqLAogCQkJCWxvZmZfdCwgc3RydWN0IGt2ZWMgKixpbnQsIHVuc2lnbmVkIGxvbmcsIGludCAqKTsKLWludAkJbmZzZF9yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorX19iZTMyCQluZnNkX3JlYWRsaW5rKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJY2hhciAqLCBpbnQgKik7Ci1pbnQJCW5mc2Rfc3ltbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAorX19iZTMyCQluZnNkX3N5bWxpbmsoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQljaGFyICpuYW1lLCBpbnQgbGVuLCBjaGFyICpwYXRoLCBpbnQgcGxlbiwKIAkJCQlzdHJ1Y3Qgc3ZjX2ZoICpyZXMsIHN0cnVjdCBpYXR0ciAqKTsKLWludAkJbmZzZF9saW5rKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCitfX2JlMzIJCW5mc2RfbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCWNoYXIgKiwgaW50LCBzdHJ1Y3Qgc3ZjX2ZoICopOwotaW50CQluZnNkX3JlbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwKK19fYmUzMgkJbmZzZF9yZW5hbWUoc3RydWN0IHN2Y19ycXN0ICosCiAJCQkJc3RydWN0IHN2Y19maCAqLCBjaGFyICosIGludCwKIAkJCQlzdHJ1Y3Qgc3ZjX2ZoICosIGNoYXIgKiwgaW50KTsKLWludAkJbmZzZF9yZW1vdmUoc3RydWN0IHN2Y19ycXN0ICosCitfX2JlMzIJCW5mc2RfcmVtb3ZlKHN0cnVjdCBzdmNfcnFzdCAqLAogCQkJCXN0cnVjdCBzdmNfZmggKiwgY2hhciAqLCBpbnQpOwotaW50CQluZnNkX3VubGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLCBpbnQgdHlwZSwKK19fYmUzMgkJbmZzZF91bmxpbmsoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgaW50IHR5cGUsCiAJCQkJY2hhciAqbmFtZSwgaW50IGxlbik7CiBpbnQJCW5mc2RfdHJ1bmNhdGUoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQl1bnNpZ25lZCBsb25nIHNpemUpOwotaW50CQluZnNkX3JlYWRkaXIoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKK19fYmUzMgkJbmZzZF9yZWFkZGlyKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkgICAgIGxvZmZfdCAqLCBzdHJ1Y3QgcmVhZGRpcl9jZCAqLCBlbmNvZGVfZGVudF9mbik7Ci1pbnQJCW5mc2Rfc3RhdGZzKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCitfX2JlMzIJCW5mc2Rfc3RhdGZzKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCiAJCQkJc3RydWN0IGtzdGF0ZnMgKik7CiAKIGludAkJbmZzZF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaWF0dHIgKik7Ci1pbnQJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitfX2JlMzIJCW5mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CiBpbnQJCW5mc2Rfc3luY19kaXIoc3RydWN0IGRlbnRyeSAqZHApOwogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTRF9WMl9BQ0wpIHx8IGRlZmluZWQoQ09ORklHX05GU0RfVjNfQUNMKQpAQCAtMjM4LDYgKzIzOCw3IEBACiAjZGVmaW5lCW5mc2Vycl9iYWRuYW1lCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9CQUROQU1FKQogI2RlZmluZQluZnNlcnJfY2JfcGF0aF9kb3duCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0NCX1BBVEhfRE9XTikKICNkZWZpbmUJbmZzZXJyX2xvY2tlZAkJX19jb25zdGFudF9odG9ubChORlNFUlJfTE9DS0VEKQorI2RlZmluZQluZnNlcnJfcmVwbGF5X21lCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX1JFUExBWV9NRSkKIAogLyogZXJyb3IgY29kZXMgZm9yIGludGVybmFsIHVzZSAqLwogLyogaWYgYSByZXF1ZXN0IGZhaWxzIGR1ZSB0byBrbWFsbG9jIGZhaWx1cmUsIGl0IGdldHMgZHJvcHBlZC4KQEAgLTI3NCwxMiArMjc1LDEyIEBACiAgKiB3ZSBtaWdodCBwcm9jZXNzIGFuIG9wZXJhdGlvbiB3aXRoIHNpZGUgZWZmZWN0cywgYW5kIGJlIHVuYWJsZSB0bwogICogdGVsbCB0aGUgY2xpZW50IHRoYXQgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCiAgKgotICogQ09NUE9VTkRfU0xBQ0tfU1BBQ0UgLSB0aGlzIGlzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBidWZmZXIgc3BhY2UKKyAqIENPTVBPVU5EX1NMQUNLX1NQQUNFIC0gdGhpcyBpcyB0aGUgbWluaW11bSBieXRlcyBvZiBidWZmZXIgc3BhY2UKICAqIG5lZWRlZCB0byBlbmNvZGUgYW4gIm9yZGluYXJ5IiBfc3VjY2Vzc2Z1bF8gb3BlcmF0aW9uLiAgKEdFVEFUVFIsCiAgKiBSRUFELCBSRUFERElSLCBhbmQgUkVBRExJTksgaGF2ZSB0aGVpciBvd24gYnVmZmVyIGNoZWNrcy4pICBpZiB3ZQogICogZmFsbCBiZWxvdyB0aGlzIGxldmVsLCB3ZSBmYWlsIHRoZSBuZXh0IG9wZXJhdGlvbiB3aXRoIE5GUzRFUlJfUkVTT1VSQ0UuCiAgKgotICogQ09NUE9VTkRfRVJSX1NMQUNLX1NQQUNFIC0gdGhpcyBpcyB0aGUgbWluaW11bSBhbW91bnQgb2YgYnVmZmVyIHNwYWNlCisgKiBDT01QT1VORF9FUlJfU0xBQ0tfU1BBQ0UgLSB0aGlzIGlzIHRoZSBtaW5pbXVtIGJ5dGVzIG9mIGJ1ZmZlciBzcGFjZQogICogbmVlZGVkIHRvIGVuY29kZSBhbiBvcGVyYXRpb24gd2hpY2ggaGFzIGZhaWxlZCB3aXRoIE5GUzRFUlJfUkVTT1VSQ0UuCiAgKiBjYXJlIGlzIHRha2VuIHRvIGVuc3VyZSB0aGF0IHdlIG5ldmVyIGZhbGwgYmVsb3cgdGhpcyBsZXZlbCBmb3IgYW55CiAgKiByZWFzb24uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCmluZGV4IDA2OTI1N2UuLmYzYjUxZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCkBAIC0xNTcsNyArMTU3LDcgQEAKIAlfX3U2NAkJCWZoX3Bvc3Rfc2l6ZTsJLyogaV9zaXplICovCiAJdW5zaWduZWQgbG9uZwkJZmhfcG9zdF9ibG9ja3M7IC8qIGlfYmxvY2tzICovCiAJdW5zaWduZWQgbG9uZwkJZmhfcG9zdF9ibGtzaXplOy8qIGlfYmxrc2l6ZSAqLwotCV9fdTMyCQkJZmhfcG9zdF9yZGV2WzJdOy8qIGlfcmRldiAqLworCV9fYmUzMgkJCWZoX3Bvc3RfcmRldlsyXTsvKiBpX3JkZXYgKi8KIAlzdHJ1Y3QgdGltZXNwZWMJCWZoX3Bvc3RfYXRpbWU7CS8qIGlfYXRpbWUgKi8KIAlzdHJ1Y3QgdGltZXNwZWMJCWZoX3Bvc3RfbXRpbWU7CS8qIGlfbXRpbWUgKi8KIAlzdHJ1Y3QgdGltZXNwZWMJCWZoX3Bvc3RfY3RpbWU7CS8qIGlfY3RpbWUgKi8KQEAgLTIwOSw5ICsyMDksOSBAQAogLyoKICAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKICAqLwotdTMyCWZoX3ZlcmlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLCBpbnQsIGludCk7Ci1pbnQJZmhfY29tcG9zZShzdHJ1Y3Qgc3ZjX2ZoICosIHN0cnVjdCBzdmNfZXhwb3J0ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHN2Y19maCAqKTsKLWludAlmaF91cGRhdGUoc3RydWN0IHN2Y19maCAqKTsKK19fYmUzMglmaF92ZXJpZnkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwgaW50LCBpbnQpOworX19iZTMyCWZoX2NvbXBvc2Uoc3RydWN0IHN2Y19maCAqLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBzdmNfZmggKik7CitfX2JlMzIJZmhfdXBkYXRlKHN0cnVjdCBzdmNfZmggKik7CiB2b2lkCWZoX3B1dChzdHJ1Y3Qgc3ZjX2ZoICopOwogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgc3ZjX2ZoICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9zdGF0ZS5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKaW5kZXggOGJmMjNjZi4uYWI1YzIzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmgKQEAgLTEyNSw3ICsxMjUsNyBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgIGNsX3JlY2RpcltIRVhESVJfTEVOXTsgLyogcmVjb3ZlcnkgZGlyICovCiAJbmZzNF92ZXJpZmllcgkJY2xfdmVyaWZpZXI7IAkvKiBnZW5lcmF0ZWQgYnkgY2xpZW50ICovCiAJdGltZV90ICAgICAgICAgICAgICAgICAgY2xfdGltZTsgICAgICAgIC8qIHRpbWUgb2YgbGFzdCBsZWFzZSByZW5ld2FsICovCi0JdTMyCQkJY2xfYWRkcjsgCS8qIGNsaWVudCBpcGFkZHJlc3MgKi8KKwlfX2JlMzIJCQljbF9hZGRyOyAJLyogY2xpZW50IGlwYWRkcmVzcyAqLwogCXN0cnVjdCBzdmNfY3JlZAkJY2xfY3JlZDsgCS8qIHNldGNsaWVudGlkIHByaW5jaXBhbCAqLwogCWNsaWVudGlkX3QJCWNsX2NsaWVudGlkOwkvKiBnZW5lcmF0ZWQgYnkgc2VydmVyICovCiAJbmZzNF92ZXJpZmllcgkJY2xfY29uZmlybTsJLyogZ2VuZXJhdGVkIGJ5IHNlcnZlciAqLwpAQCAtMTY0LDcgKzE2NCw3IEBACiAgKiBpcyBjYWNoZWQuIAogICovCiBzdHJ1Y3QgbmZzNF9yZXBsYXkgewotCXUzMgkJCXJwX3N0YXR1czsKKwlfX2JlMzIJCQlycF9zdGF0dXM7CiAJdW5zaWduZWQgaW50CQlycF9idWZsZW47CiAJY2hhcgkJCSpycF9idWY7CiAJdW5zaWduZWQJCWludHJwX2FsbG9jYXRlZDsKQEAgLTI3MywxOSArMjczLDE4IEBACiAJKChlcnIpICE9IG5mc2Vycl9zdGFsZV9zdGF0ZWlkKSAmJiAgICAgIFwKIAkoKGVycikgIT0gbmZzZXJyX2JhZF9zdGF0ZWlkKSkKIAotZXh0ZXJuIGludCBuZnNkNF9yZW5ldyhjbGllbnRpZF90ICpjbGlkKTsKLWV4dGVybiBpbnQgbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3Aoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgCitleHRlcm4gX19iZTMyIG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsCiAJCXN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzLCBzdHJ1Y3QgZmlsZSAqKmZpbHApOwogZXh0ZXJuIHZvaWQgbmZzNF9sb2NrX3N0YXRlKHZvaWQpOwogZXh0ZXJuIHZvaWQgbmZzNF91bmxvY2tfc3RhdGUodm9pZCk7CiBleHRlcm4gaW50IG5mczRfaW5fZ3JhY2Uodm9pZCk7Ci1leHRlcm4gaW50IG5mczRfY2hlY2tfb3Blbl9yZWNsYWltKGNsaWVudGlkX3QgKmNsaWQpOworZXh0ZXJuIF9fYmUzMiBuZnM0X2NoZWNrX29wZW5fcmVjbGFpbShjbGllbnRpZF90ICpjbGlkKTsKIGV4dGVybiB2b2lkIHB1dF9uZnM0X2NsaWVudChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCk7CiBleHRlcm4gdm9pZCBuZnM0X2ZyZWVfc3RhdGVvd25lcihzdHJ1Y3Qga3JlZiAqa3JlZik7CiBleHRlcm4gdm9pZCBuZnNkNF9wcm9iZV9jYWxsYmFjayhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCk7CiBleHRlcm4gdm9pZCBuZnNkNF9jYl9yZWNhbGwoc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHApOwogZXh0ZXJuIHZvaWQgbmZzNF9wdXRfZGVsZWdhdGlvbihzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCk7Ci1leHRlcm4gaW50IG5mczRfbWFrZV9yZWNfY2xpZG5hbWUoY2hhciAqY2xpZG5hbWUsIHN0cnVjdCB4ZHJfbmV0b2JqICpjbG5hbWUpOworZXh0ZXJuIF9fYmUzMiBuZnM0X21ha2VfcmVjX2NsaWRuYW1lKGNoYXIgKmNsaWRuYW1lLCBzdHJ1Y3QgeGRyX25ldG9iaiAqY2xuYW1lKTsKIGV4dGVybiB2b2lkIG5mc2Q0X2luaXRfcmVjZGlyKGNoYXIgKnJlY2Rpcl9uYW1lKTsKIGV4dGVybiBpbnQgbmZzZDRfcmVjZGlyX2xvYWQodm9pZCk7CiBleHRlcm4gdm9pZCBuZnNkNF9zaHV0ZG93bl9yZWNkaXIodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyLmgKaW5kZXggMGU1M2RlOC4uODc3MTkyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHIuaApAQCAtODEsNyArODEsNyBAQAogCXN0cnVjdCBzdmNfZmgJCWZoOwogCV9fdTMyCQkJY29va2llOwogCV9fdTMyCQkJY291bnQ7Ci0JdTMyICoJCQlidWZmZXI7CisJX19iZTMyICoJCWJ1ZmZlcjsKIH07CiAKIHN0cnVjdCBuZnNkX2F0dHJzdGF0IHsKQEAgLTEwOCw5ICsxMDgsOSBAQAogCWludAkJCWNvdW50OwogCiAJc3RydWN0IHJlYWRkaXJfY2QJY29tbW9uOwotCXUzMiAqCQkJYnVmZmVyOworCV9fYmUzMiAqCQlidWZmZXI7CiAJaW50CQkJYnVmbGVuOwotCXUzMiAqCQkJb2Zmc2V0OworCV9fYmUzMiAqCQlvZmZzZXQ7CiB9OwogCiBzdHJ1Y3QgbmZzZF9zdGF0ZnNyZXMgewpAQCAtMTM1LDQzICsxMzUsNDMgQEAKICNkZWZpbmUgTkZTMl9TVkNfWERSU0laRQlzaXplb2YodW5pb24gbmZzZF94ZHJzdG9yZSkKIAogCi1pbnQgbmZzc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgdm9pZCAqKTsKLWludCBuZnNzdmNfZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICopOwotaW50IG5mc3N2Y19kZWNvZGVfc2F0dHJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnNzdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCB2b2lkICopOworaW50IG5mc3N2Y19kZWNvZGVfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBuZnNkX2ZoYW5kbGUgKik7CitpbnQgbmZzc3ZjX2RlY29kZV9zYXR0cmFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkX3NhdHRyYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX2Rpcm9wYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzc3ZjX2RlY29kZV9kaXJvcGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkX2Rpcm9wYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX3JlYWRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnNzdmNfZGVjb2RlX3JlYWRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZF9yZWFkYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX3dyaXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzc3ZjX2RlY29kZV93cml0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkX3dyaXRlYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX2NyZWF0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mc3N2Y19kZWNvZGVfY3JlYXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2RfY3JlYXRlYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX3JlbmFtZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mc3N2Y19kZWNvZGVfcmVuYW1lYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2RfcmVuYW1lYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX3JlYWRsaW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzc3ZjX2RlY29kZV9yZWFkbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkX3JlYWRsaW5rYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnNzdmNfZGVjb2RlX2xpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZF9saW5rYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZF9zeW1saW5rYXJncyAqKTsKLWludCBuZnNzdmNfZGVjb2RlX3JlYWRkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnNzdmNfZGVjb2RlX3JlYWRkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZF9yZWFkZGlyYXJncyAqKTsKLWludCBuZnNzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCB2b2lkICopOwotaW50IG5mc3N2Y19lbmNvZGVfYXR0cnN0YXQoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqKTsKLWludCBuZnNzdmNfZW5jb2RlX2Rpcm9wcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2RfZGlyb3ByZXMgKik7Ci1pbnQgbmZzc3ZjX2VuY29kZV9yZWFkbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBuZnNkX3JlYWRsaW5rcmVzICopOwotaW50IG5mc3N2Y19lbmNvZGVfcmVhZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHN0cnVjdCBuZnNkX3JlYWRyZXMgKik7Ci1pbnQgbmZzc3ZjX2VuY29kZV9zdGF0ZnNyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmZzZF9zdGF0ZnNyZXMgKik7Ci1pbnQgbmZzc3ZjX2VuY29kZV9yZWFkZGlycmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2RfcmVhZGRpcnJlcyAqKTsKK2ludCBuZnNzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCB2b2lkICopOworaW50IG5mc3N2Y19lbmNvZGVfYXR0cnN0YXQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqKTsKK2ludCBuZnNzdmNfZW5jb2RlX2Rpcm9wcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5mc2RfZGlyb3ByZXMgKik7CitpbnQgbmZzc3ZjX2VuY29kZV9yZWFkbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBuZnNkX3JlYWRsaW5rcmVzICopOworaW50IG5mc3N2Y19lbmNvZGVfcmVhZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBuZnNkX3JlYWRyZXMgKik7CitpbnQgbmZzc3ZjX2VuY29kZV9zdGF0ZnNyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmZzZF9zdGF0ZnNyZXMgKik7CitpbnQgbmZzc3ZjX2VuY29kZV9yZWFkZGlycmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5mc2RfcmVhZGRpcnJlcyAqKTsKIAogaW50IG5mc3N2Y19lbmNvZGVfZW50cnkoc3RydWN0IHJlYWRkaXJfY2QgKiwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQlpbnQgbmFtbGVuLCBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCk7CiAKLWludCBuZnNzdmNfcmVsZWFzZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2RfZmhhbmRsZSAqKTsKK2ludCBuZnNzdmNfcmVsZWFzZV9maGFuZGxlKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5mc2RfZmhhbmRsZSAqKTsKIAogLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgTkZTdjIgQUNMIGNvZGUgKi8KLXUzMiAqbmZzMnN2Y19lbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApOwotdTMyICpuZnMyc3ZjX2RlY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCk7CitfX2JlMzIgKm5mczJzdmNfZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKTsKK19fYmUzMiAqbmZzMnN2Y19kZWNvZGVfZmgoX19iZTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApOwogCiAjZW5kaWYgLyogTElOVVhfTkZTRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyMy5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3hkcjMuaAppbmRleCA0NzRkODgyLi43OTk2Mzg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyMy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHIzLmgKQEAgLTUxLDcgKzUxLDcgQEAKIAlpbnQJCQlsZW47CiAJaW50CQkJY3JlYXRlbW9kZTsKIAlzdHJ1Y3QgaWF0dHIJCWF0dHJzOwotCV9fdTMyICoJCQl2ZXJmOworCV9fYmUzMiAqCQl2ZXJmOwogfTsKIAogc3RydWN0IG5mc2QzX21rbm9kYXJncyB7CkBAIC05OCw4ICs5OCw4IEBACiAJX191NjQJCQljb29raWU7CiAJX191MzIJCQlkaXJjb3VudDsKIAlfX3UzMgkJCWNvdW50OwotCV9fdTMyICoJCQl2ZXJmOwotCXUzMiAqCQkJYnVmZmVyOworCV9fYmUzMiAqCQl2ZXJmOworCV9fYmUzMiAqCQlidWZmZXI7CiB9OwogCiBzdHJ1Y3QgbmZzZDNfY29tbWl0YXJncyB7CkBAIC0xMjIsNzkgKzEyMiw3OSBAQAogfTsKIAogc3RydWN0IG5mc2QzX2F0dHJzdGF0IHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZmg7CiAJc3RydWN0IGtzdGF0ICAgICAgICAgICAgc3RhdDsKIH07CiAKIC8qIExPT0tVUCwgQ1JFQVRFLCBNS0RJUiwgU1lNTElOSywgTUtOT0QgKi8KIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlkaXJmaDsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIH07CiAKIHN0cnVjdCBuZnNkM19hY2Nlc3NyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIAlfX3UzMgkJCWFjY2VzczsKIH07CiAKIHN0cnVjdCBuZnNkM19yZWFkbGlua3JlcyB7Ci0JX191MzIJCQlzdGF0dXM7CisJX19iZTMyCQkJc3RhdHVzOwogCXN0cnVjdCBzdmNfZmgJCWZoOwogCV9fdTMyCQkJbGVuOwogfTsKIAogc3RydWN0IG5mc2QzX3JlYWRyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIAl1bnNpZ25lZCBsb25nCQljb3VudDsKIAlpbnQJCQllb2Y7CiB9OwogCiBzdHJ1Y3QgbmZzZDNfd3JpdGVyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIAl1bnNpZ25lZCBsb25nCQljb3VudDsKIAlpbnQJCQljb21taXR0ZWQ7CiB9OwogCiBzdHJ1Y3QgbmZzZDNfcmVuYW1lcmVzIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJZmZoOwogCXN0cnVjdCBzdmNfZmgJCXRmaDsKIH07CiAKIHN0cnVjdCBuZnNkM19saW5rcmVzIHsKLQlfX3UzMgkJCXN0YXR1czsKKwlfX2JlMzIJCQlzdGF0dXM7CiAJc3RydWN0IHN2Y19maAkJdGZoOwogCXN0cnVjdCBzdmNfZmgJCWZoOwogfTsKIAogc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIAlpbnQJCQljb3VudDsKLQlfX3UzMgkJCXZlcmZbMl07CisJX19iZTMyCQkJdmVyZlsyXTsKIAogCXN0cnVjdCByZWFkZGlyX2NkCWNvbW1vbjsKLQl1MzIgKgkJCWJ1ZmZlcjsKKwlfX2JlMzIgKgkJYnVmZmVyOwogCWludAkJCWJ1ZmxlbjsKLQl1MzIgKgkJCW9mZnNldDsKLQl1MzIgKgkJCW9mZnNldDE7CisJX19iZTMyICoJCW9mZnNldDsKKwlfX2JlMzIgKgkJb2Zmc2V0MTsKIAlzdHJ1Y3Qgc3ZjX3Jxc3QgKglycXN0cDsKIAogfTsKIAogc3RydWN0IG5mc2QzX2Zzc3RhdHJlcyB7Ci0JX191MzIJCQlzdGF0dXM7CisJX19iZTMyCQkJc3RhdHVzOwogCXN0cnVjdCBrc3RhdGZzCQlzdGF0czsKIAlfX3UzMgkJCWludmFyc2VjOwogfTsKIAogc3RydWN0IG5mc2QzX2ZzaW5mb3JlcyB7Ci0JX191MzIJCQlzdGF0dXM7CisJX19iZTMyCQkJc3RhdHVzOwogCV9fdTMyCQkJZl9ydG1heDsKIAlfX3UzMgkJCWZfcnRwcmVmOwogCV9fdTMyCQkJZl9ydG11bHQ7CkBAIC0yMDcsNyArMjA3LDcgQEAKIH07CiAKIHN0cnVjdCBuZnNkM19wYXRoY29uZnJlcyB7Ci0JX191MzIJCQlzdGF0dXM7CisJX19iZTMyCQkJc3RhdHVzOwogCV9fdTMyCQkJcF9saW5rX21heDsKIAlfX3UzMgkJCXBfbmFtZV9tYXg7CiAJX191MzIJCQlwX25vX3RydW5jOwpAQCAtMjE3LDEyICsyMTcsMTIgQEAKIH07CiAKIHN0cnVjdCBuZnNkM19jb21taXRyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIH07CiAKIHN0cnVjdCBuZnNkM19nZXRhY2xyZXMgewotCV9fdTMyCQkJc3RhdHVzOworCV9fYmUzMgkJCXN0YXR1czsKIAlzdHJ1Y3Qgc3ZjX2ZoCQlmaDsKIAlpbnQJCQltYXNrOwogCXN0cnVjdCBwb3NpeF9hY2wJKmFjbF9hY2Nlc3M7CkBAIC0yNjYsNzAgKzI2Niw3MCBAQAogCiAjZGVmaW5lIE5GUzNfU1ZDX1hEUlNJWkUJCXNpemVvZih1bmlvbiBuZnNkM194ZHJzdG9yZSkKIAotaW50IG5mczNzdmNfZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICopOwotaW50IG5mczNzdmNfZGVjb2RlX3NhdHRyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHN0cnVjdCBuZnNkX2ZoYW5kbGUgKik7CitpbnQgbmZzM3N2Y19kZWNvZGVfc2F0dHJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfc2F0dHJhcmdzICopOwotaW50IG5mczNzdmNfZGVjb2RlX2Rpcm9wYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfZGlyb3BhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICopOwotaW50IG5mczNzdmNfZGVjb2RlX2FjY2Vzc2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX2FjY2Vzc2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19hY2Nlc3NhcmdzICopOwotaW50IG5mczNzdmNfZGVjb2RlX3JlYWRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX3JlYWRhcmdzICopOwotaW50IG5mczNzdmNfZGVjb2RlX3dyaXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfd3JpdGVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfd3JpdGVhcmdzICopOwotaW50IG5mczNzdmNfZGVjb2RlX2NyZWF0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX2NyZWF0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19jcmVhdGVhcmdzICopOwotaW50IG5mczNzdmNfZGVjb2RlX21rZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfbWtkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfY3JlYXRlYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9ta25vZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX21rbm9kYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX21rbm9kYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfcmVuYW1lYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9yZWFkbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX3JlYWRsaW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX3JlYWRsaW5rYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19saW5rYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9zeW1saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfc3ltbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19zeW1saW5rYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19kZWNvZGVfcmVhZGRpcmFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqKTsKLWludCBuZnMzc3ZjX2RlY29kZV9yZWFkZGlycGx1c2FyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX3JlYWRkaXJwbHVzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX3JlYWRkaXJhcmdzICopOwotaW50IG5mczNzdmNfZGVjb2RlX2NvbW1pdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZGVjb2RlX2NvbW1pdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19jb21taXRhcmdzICopOwotaW50IG5mczNzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCB2b2lkICopOwotaW50IG5mczNzdmNfZW5jb2RlX2F0dHJzdGF0KHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV92b2lkcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgdm9pZCAqKTsKK2ludCBuZnMzc3ZjX2VuY29kZV9hdHRyc3RhdChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX2F0dHJzdGF0ICopOwotaW50IG5mczNzdmNfZW5jb2RlX3djY3N0YXQoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZW5jb2RlX3djY3N0YXQoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqKTsKLWludCBuZnMzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfZGlyb3ByZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19kaXJvcHJlcyAqKTsKLWludCBuZnMzc3ZjX2VuY29kZV9hY2Nlc3NyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZW5jb2RlX2FjY2Vzc3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX2FjY2Vzc3JlcyAqKTsKLWludCBuZnMzc3ZjX2VuY29kZV9yZWFkbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfcmVhZGxpbmtyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19yZWFkbGlua3JlcyAqKTsKLWludCBuZnMzc3ZjX2VuY29kZV9yZWFkcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgc3RydWN0IG5mc2QzX3JlYWRyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfd3JpdGVyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLCBzdHJ1Y3QgbmZzZDNfd3JpdGVyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfY3JlYXRlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV9yZWFkcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwgc3RydWN0IG5mc2QzX3JlYWRyZXMgKik7CitpbnQgbmZzM3N2Y19lbmNvZGVfd3JpdGVyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLCBzdHJ1Y3QgbmZzZDNfd3JpdGVyZXMgKik7CitpbnQgbmZzM3N2Y19lbmNvZGVfY3JlYXRlcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfcmVuYW1lcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV9yZW5hbWVyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19yZW5hbWVyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX2xpbmtyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfcmVhZGRpcnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19lbmNvZGVfcmVhZGRpcnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfZnNzdGF0cmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV9mc3N0YXRyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19mc3N0YXRyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfZnNpbmZvcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV9mc2luZm9yZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19mc2luZm9yZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfcGF0aGNvbmZyZXMoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfZW5jb2RlX3BhdGhjb25mcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJCQlzdHJ1Y3QgbmZzZDNfcGF0aGNvbmZyZXMgKik7Ci1pbnQgbmZzM3N2Y19lbmNvZGVfY29tbWl0cmVzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwKK2ludCBuZnMzc3ZjX2VuY29kZV9jb21taXRyZXMoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19jb21taXRyZXMgKik7CiAKLWludCBuZnMzc3ZjX3JlbGVhc2VfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosCitpbnQgbmZzM3N2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICosIF9fYmUzMiAqLAogCQkJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqKTsKLWludCBuZnMzc3ZjX3JlbGVhc2VfZmhhbmRsZTIoc3RydWN0IHN2Y19ycXN0ICosIHUzMiAqLAoraW50IG5mczNzdmNfcmVsZWFzZV9maGFuZGxlMihzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosCiAJCQkJc3RydWN0IG5mc2QzX2ZoYW5kbGVfcGFpciAqKTsKIGludCBuZnMzc3ZjX2VuY29kZV9lbnRyeShzdHJ1Y3QgcmVhZGRpcl9jZCAqLCBjb25zdCBjaGFyICpuYW1lLAogCQkJCWludCBuYW1sZW4sIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywKQEAgLTMzOCw5ICszMzgsOSBAQAogCQkJCWludCBuYW1sZW4sIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywKIAkJCQl1bnNpZ25lZCBpbnQpOwogLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgTkZTdjMgQUNMIGNvZGUgKi8KLXUzMiAqbmZzM3N2Y19lbmNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKK19fYmUzMiAqbmZzM3N2Y19lbmNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKIAkJCQlzdHJ1Y3Qgc3ZjX2ZoICpmaHApOwotdTMyICpuZnMzc3ZjX2RlY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCk7CitfX2JlMzIgKm5mczNzdmNfZGVjb2RlX2ZoKF9fYmUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKTsKIAogCiAjZW5kaWYgLyogX0xJTlVYX05GU0RfWERSM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaAppbmRleCA2NmU2NDI3Li4wOTc5OWJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKQEAgLTQ0LDYgKzQ0LDEyIEBACiAjZGVmaW5lIE5GU0Q0X01BWF9UQUdMRU4JMTI4CiAjZGVmaW5lIFhEUl9MRU4obikgICAgICAgICAgICAgICAgICAgICAoKChuKSArIDMpICYgfjMpCiAKK3N0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSB7CisJc3RydWN0IHN2Y19maCBjdXJyZW50X2ZoOworCXN0cnVjdCBzdmNfZmggc2F2ZV9maDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpyZXBsYXlfb3duZXI7Cit9OworCiBzdHJ1Y3QgbmZzZDRfY2hhbmdlX2luZm8gewogCXUzMgkJYXRvbWljOwogCXUzMgkJYmVmb3JlX2N0aW1lX3NlYzsKQEAgLTI1OCw5ICsyNjQsOSBAQAogCXN0cnVjdCBzdmNfZmggKiByZF9maHA7ICAgICAgICAgICAgIC8qIHJlc3BvbnNlICovCiAKIAlzdHJ1Y3QgcmVhZGRpcl9jZAljb21tb247Ci0JdTMyICoJCQlidWZmZXI7CisJX19iZTMyICoJCWJ1ZmZlcjsKIAlpbnQJCQlidWZsZW47Ci0JdTMyICoJCQlvZmZzZXQ7CisJX19iZTMyICoJCW9mZnNldDsKIH07CiAKIHN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciB7CkBAIC0zMzQsNyArMzQwLDcgQEAKIAogc3RydWN0IG5mc2Q0X29wIHsKIAlpbnQJCQkJCW9wbnVtOwotCWludAkJCQkJc3RhdHVzOworCV9fYmUzMgkJCQkJc3RhdHVzOwogCXVuaW9uIHsKIAkJc3RydWN0IG5mc2Q0X2FjY2VzcwkJYWNjZXNzOwogCQlzdHJ1Y3QgbmZzZDRfY2xvc2UJCWNsb3NlOwpAQCAtMzcxLDEyICszNzcsMTIgQEAKIAogc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyB7CiAJLyogc2NyYXRjaCB2YXJpYWJsZXMgZm9yIFhEUiBkZWNvZGUgKi8KLQl1MzIgKgkJCQlwOwotCXUzMiAqCQkJCWVuZDsKKwlfX2JlMzIgKgkJCXA7CisJX19iZTMyICoJCQllbmQ7CiAJc3RydWN0IHBhZ2UgKioJCQlwYWdlbGlzdDsKIAlpbnQJCQkJcGFnZWxlbjsKLQl1MzIJCQkJdG1wWzhdOwotCXUzMiAqCQkJCXRtcHA7CisJX19iZTMyCQkJCXRtcFs4XTsKKwlfX2JlMzIgKgkJCXRtcHA7CiAJc3RydWN0IHRtcGJ1ZiB7CiAJCXN0cnVjdCB0bXBidWYgKm5leHQ7CiAJCXZvaWQgKCpyZWxlYXNlKShjb25zdCB2b2lkICopOwpAQCAtMzk1LDE1ICs0MDEsMTUgQEAKIAogc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzIHsKIAkvKiBzY3JhdGNoIHZhcmlhYmxlcyBmb3IgWERSIGVuY29kZSAqLwotCXUzMiAqCQkJCXA7Ci0JdTMyICoJCQkJZW5kOworCV9fYmUzMiAqCQkJcDsKKwlfX2JlMzIgKgkJCWVuZDsKIAlzdHJ1Y3QgeGRyX2J1ZiAqCQl4YnVmOwogCXN0cnVjdCBzdmNfcnFzdCAqCQlycXN0cDsKIAogCXUzMgkJCQl0YWdsZW47CiAJY2hhciAqCQkJCXRhZzsKIAl1MzIJCQkJb3BjbnQ7Ci0JdTMyICoJCQkJdGFncDsgLyogd2hlcmUgdG8gZW5jb2RlIHRhZyBhbmQgIG9wY291bnQgKi8KKwlfX2JlMzIgKgkJCXRhZ3A7IC8qIHdoZXJlIHRvIGVuY29kZSB0YWcgYW5kICBvcGNvdW50ICovCiB9OwogCiAjZGVmaW5lIE5GUzRfU1ZDX1hEUlNJWkUJCXNpemVvZihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzKQpAQCAtNDE5LDQ2ICs0MjUsNTAgQEAKIAljaW5mby0+YWZ0ZXJfY3RpbWVfbnNlYyA9IGZocC0+ZmhfcG9zdF9jdGltZS50dl9uc2VjOwogfQogCi1pbnQgbmZzNHN2Y19lbmNvZGVfdm9pZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIHZvaWQgKik7Ci1pbnQgbmZzNHN2Y19kZWNvZGVfY29tcG91bmRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIgKiwgCitpbnQgbmZzNHN2Y19lbmNvZGVfdm9pZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgX19iZTMyICosIHZvaWQgKik7CitpbnQgbmZzNHN2Y19kZWNvZGVfY29tcG91bmRhcmdzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqKTsKLWludCBuZnM0c3ZjX2VuY29kZV9jb21wb3VuZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdTMyICosIAoraW50IG5mczRzdmNfZW5jb2RlX2NvbXBvdW5kcmVzKHN0cnVjdCBzdmNfcnFzdCAqLCBfX2JlMzIgKiwKIAkJc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICopOwogdm9pZCBuZnNkNF9lbmNvZGVfb3BlcmF0aW9uKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqLCBzdHJ1Y3QgbmZzZDRfb3AgKik7CiB2b2lkIG5mc2Q0X2VuY29kZV9yZXBsYXkoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBzdHJ1Y3QgbmZzZDRfb3AgKm9wKTsKLWludCBuZnNkNF9lbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAotCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1MzIgKmJ1ZmZlciwgaW50ICpjb3VudHAsIAorX19iZTMyIG5mc2Q0X2VuY29kZV9mYXR0cihzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsCisJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fYmUzMiAqYnVmZmVyLCBpbnQgKmNvdW50cCwKIAkJICAgICAgIHUzMiAqYm12YWwsIHN0cnVjdCBzdmNfcnFzdCAqKTsKLWV4dGVybiBpbnQgbmZzZDRfc2V0Y2xpZW50aWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgCitleHRlcm4gX19iZTMyIG5mc2Q0X3NldGNsaWVudGlkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCXN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqLAogCQlzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNldGNsaWQpOwotZXh0ZXJuIGludCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIAorZXh0ZXJuIF9fYmUzMiBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCXN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqLAogCQlzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybSAqc2V0Y2xpZW50aWRfY29uZmlybSk7Ci1leHRlcm4gaW50IG5mc2Q0X3Byb2Nlc3Nfb3BlbjEoc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pOwotZXh0ZXJuIGludCBuZnNkNF9wcm9jZXNzX29wZW4yKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIAorZXh0ZXJuIF9fYmUzMiBuZnNkNF9wcm9jZXNzX29wZW4xKHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKTsKK2V4dGVybiBfX2JlMzIgbmZzZDRfcHJvY2Vzc19vcGVuMihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQlzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3Blbik7Ci1leHRlcm4gaW50IG5mc2Q0X29wZW5fY29uZmlybShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCAKLQkJc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW5fY29uZmlybSAqb2MsCi0JCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKiopOwotZXh0ZXJuICBpbnQgbmZzZDRfY2xvc2Uoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgCi0JCXN0cnVjdCBuZnNkNF9jbG9zZSAqY2xvc2UsCi0JCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKipyZXBsYXlfb3duZXIpOwotZXh0ZXJuIGludCBuZnNkNF9vcGVuX2Rvd25ncmFkZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCAKLQkJc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW5fZG93bmdyYWRlICpvZCwKLQkJc3RydWN0IG5mczRfc3RhdGVvd25lciAqKnJlcGxheV9vd25lcik7Ci1leHRlcm4gaW50IG5mc2Q0X2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgCi0JCXN0cnVjdCBuZnNkNF9sb2NrICpsb2NrLAotCQlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqcmVwbGF5X293bmVyKTsKLWV4dGVybiBpbnQgbmZzZDRfbG9ja3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgCitleHRlcm4gX19iZTMyIG5mc2Q0X29wZW5fY29uZmlybShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQlzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKiwgc3RydWN0IG5mc2Q0X29wZW5fY29uZmlybSAqb2MpOworZXh0ZXJuIF9fYmUzMiBuZnNkNF9jbG9zZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQlzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKiwKKwkJc3RydWN0IG5mc2Q0X2Nsb3NlICpjbG9zZSk7CitleHRlcm4gX19iZTMyIG5mc2Q0X29wZW5fZG93bmdyYWRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCXN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqLAorCQlzdHJ1Y3QgbmZzZDRfb3Blbl9kb3duZ3JhZGUgKm9kKTsKK2V4dGVybiBfX2JlMzIgbmZzZDRfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKiwKKwkJc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spOworZXh0ZXJuIF9fYmUzMiBuZnNkNF9sb2NrdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQlzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKiwKIAkJc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCk7Ci1leHRlcm4gaW50IG5mc2Q0X2xvY2t1KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIAotCQlzdHJ1Y3QgbmZzZDRfbG9ja3UgKmxvY2t1LAotCQlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqcmVwbGF5X293bmVyKTsKLWV4dGVybiBpbnQKK2V4dGVybiBfX2JlMzIgbmZzZDRfbG9ja3Uoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICosCisJCXN0cnVjdCBuZnNkNF9sb2NrdSAqbG9ja3UpOworZXh0ZXJuIF9fYmUzMgogbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICosCiAJCXN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciAqcmxvY2tvd25lcik7CiBleHRlcm4gdm9pZCBuZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICopOwotZXh0ZXJuIGludCBuZnNkNF9kZWxlZ3JldHVybihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAotCQlzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfZGVsZWdyZXR1cm4gKmRyKTsKK2V4dGVybiBfX2JlMzIgbmZzZDRfZGVsZWdyZXR1cm4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICosIHN0cnVjdCBuZnNkNF9kZWxlZ3JldHVybiAqZHIpOworZXh0ZXJuIF9fYmUzMiBuZnNkNF9yZW5ldyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQkJICBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKiwgY2xpZW50aWRfdCAqY2xpZCk7CiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbm1pLmggYi9pbmNsdWRlL2xpbnV4L25taS5oCmluZGV4IGUxNjkwNGUuLmFjYjRlZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbm1pLmgKKysrIGIvaW5jbHVkZS9saW51eC9ubWkuaApAQCAtMTUsOSArMTUsMTQgQEAKICAqIGRpc2FibGVzIGludGVycnVwdHMgZm9yIGEgbG9uZyB0aW1lLiBUaGlzIGNhbGwgaXMgc3RhdGVsZXNzLgogICovCiAjaWZkZWYgQVJDSF9IQVNfTk1JX1dBVENIRE9HCisjaW5jbHVkZSA8YXNtL25taS5oPgogZXh0ZXJuIHZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nKHZvaWQpOwogI2Vsc2UKICMgZGVmaW5lIHRvdWNoX25taV93YXRjaGRvZygpIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKQogI2VuZGlmCiAKKyNpZm5kZWYgdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZQorI2RlZmluZSB0cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uc3Byb3h5LmggYi9pbmNsdWRlL2xpbnV4L25zcHJveHkuaAppbmRleCBmNmJhZWNkLi4wYjlmMGRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25zcHJveHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25zcHJveHkuaApAQCAtNCw5ICs0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi1zdHJ1Y3QgbmFtZXNwYWNlOworc3RydWN0IG1udF9uYW1lc3BhY2U7CiBzdHJ1Y3QgdXRzX25hbWVzcGFjZTsKIHN0cnVjdCBpcGNfbmFtZXNwYWNlOworc3RydWN0IHBpZF9uYW1lc3BhY2U7CiAKIC8qCiAgKiBBIHN0cnVjdHVyZSB0byBjb250YWluIHBvaW50ZXJzIHRvIGFsbCBwZXItcHJvY2VzcwpAQCAtMjUsNyArMjYsOCBAQAogCXNwaW5sb2NrX3QgbnNsb2NrOwogCXN0cnVjdCB1dHNfbmFtZXNwYWNlICp1dHNfbnM7CiAJc3RydWN0IGlwY19uYW1lc3BhY2UgKmlwY19uczsKLQlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2U7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm1udF9uczsKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGlkX25zOwogfTsKIGV4dGVybiBzdHJ1Y3QgbnNwcm94eSBpbml0X25zcHJveHk7CiAKQEAgLTQ1LDggKzQ3LDEwIEBACiB7CiAJc3RydWN0IG5zcHJveHkgKm5zID0gcC0+bnNwcm94eTsKIAlpZiAobnMpIHsKLQkJcHV0X25zcHJveHkobnMpOworCQl0YXNrX2xvY2socCk7CiAJCXAtPm5zcHJveHkgPSBOVUxMOworCQl0YXNrX3VubG9jayhwKTsKKwkJcHV0X25zcHJveHkobnMpOwogCX0KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vb20uaCBiL2luY2x1ZGUvbGludXgvb29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3NjQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvb29tLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX0lOQ0xVREVfTElOVVhfT09NX0gKKyNkZWZpbmUgX19JTkNMVURFX0xJTlVYX09PTV9ICisKKy8qIC9wcm9jLzxwaWQ+L29vbV9hZGogc2V0IHRvIC0xNyBwcm90ZWN0cyBmcm9tIHRoZSBvb20ta2lsbGVyICovCisjZGVmaW5lIE9PTV9ESVNBQkxFICgtMTcpCisvKiBpbmNsdXNpdmUgKi8KKyNkZWZpbmUgT09NX0FESlVTVF9NSU4gKC0xNikKKyNkZWZpbmUgT09NX0FESlVTVF9NQVggMTUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaCBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCmluZGV4IDY0Zjk1MDkuLmMzZTI1NWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCkBAIC01MiwxOSArNTIsMjMgQEAKIHZvaWQgcmVsZWFzZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnIsIGludCBjb2xkKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gc3RydWN0IHBhZ2UgKnBhZ2VfY2FjaGVfYWxsb2Moc3RydWN0IGFkZHJlc3Nfc3BhY2UgKngpOwotZXh0ZXJuIHN0cnVjdCBwYWdlICpwYWdlX2NhY2hlX2FsbG9jX2NvbGQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKngpOworZXh0ZXJuIHN0cnVjdCBwYWdlICpfX3BhZ2VfY2FjaGVfYWxsb2MoZ2ZwX3QgZ2ZwKTsKICNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpfX3BhZ2VfY2FjaGVfYWxsb2MoZ2ZwX3QgZ2ZwKQoreworCXJldHVybiBhbGxvY19wYWdlcyhnZnAsIDApOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VfY2FjaGVfYWxsb2Moc3RydWN0IGFkZHJlc3Nfc3BhY2UgKngpCiB7Ci0JcmV0dXJuIGFsbG9jX3BhZ2VzKG1hcHBpbmdfZ2ZwX21hc2soeCksIDApOworCXJldHVybiBfX3BhZ2VfY2FjaGVfYWxsb2MobWFwcGluZ19nZnBfbWFzayh4KSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnBhZ2VfY2FjaGVfYWxsb2NfY29sZChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqeCkKIHsKLQlyZXR1cm4gYWxsb2NfcGFnZXMobWFwcGluZ19nZnBfbWFzayh4KXxfX0dGUF9DT0xELCAwKTsKKwlyZXR1cm4gX19wYWdlX2NhY2hlX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2soeCl8X19HRlBfQ09MRCk7CiB9Ci0jZW5kaWYKIAogdHlwZWRlZiBpbnQgZmlsbGVyX3Qodm9pZCAqLCBzdHJ1Y3QgcGFnZSAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYXRhX3BsYXRmb3JtLmggYi9pbmNsdWRlL2xpbnV4L3BhdGFfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDVmZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wYXRhX3BsYXRmb3JtLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0xJTlVYX1BBVEFfUExBVEZPUk1fSAorI2RlZmluZSBfX0xJTlVYX1BBVEFfUExBVEZPUk1fSAorCitzdHJ1Y3QgcGF0YV9wbGF0Zm9ybV9pbmZvIHsKKwkvKgorCSAqIEkvTyBwb3J0IHNoaWZ0LCBmb3IgcGxhdGZvcm1zIHdpdGggcG9ydHMgdGhhdCBhcmUKKwkgKiBjb25zdGFudGx5IHNwYWNlZCBhbmQgbmVlZCBsYXJnZXIgdGhhbiB0aGUgMS1ieXRlCisJICogc3BhY2luZyB1c2VkIGJ5IGF0YV9zdGRfcG9ydHMoKS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgaW9wb3J0X3NoaWZ0OworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfUEFUQV9QTEFURk9STV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCA1YzYwNGY1Li4wMWM3MDcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTUxLDYgKzUxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogLyogRmlsZSBzdGF0ZSBmb3IgbW1hcCgpcyBvbiAvcHJvYy9idXMvcGNpL1gvWSAqLwpAQCAtMTU5LDcgKzE2MCw2IEBACiAJdW5zaWduZWQgaW50CXRyYW5zcGFyZW50OjE7CS8qIFRyYW5zcGFyZW50IFBDSSBicmlkZ2UgKi8KIAl1bnNpZ25lZCBpbnQJbXVsdGlmdW5jdGlvbjoxOy8qIFBhcnQgb2YgbXVsdGktZnVuY3Rpb24gZGV2aWNlICovCiAJLyoga2VlcCB0cmFjayBvZiBkZXZpY2Ugc3RhdGUgKi8KLQl1bnNpZ25lZCBpbnQJaXNfZW5hYmxlZDoxOwkvKiBwY2lfZW5hYmxlX2RldmljZSBoYXMgYmVlbiBjYWxsZWQgKi8KIAl1bnNpZ25lZCBpbnQJaXNfYnVzbWFzdGVyOjE7IC8qIGRldmljZSBpcyBidXNtYXN0ZXIgKi8KIAl1bnNpZ25lZCBpbnQJbm9fbXNpOjE7CS8qIGRldmljZSBtYXkgbm90IHVzZSBtc2kgKi8KIAl1bnNpZ25lZCBpbnQJbm9fZDFkMjoxOyAgIC8qIG9ubHkgYWxsb3cgZDAgb3IgZDMgKi8KQEAgLTE2Nyw2ICsxNjcsNyBAQAogCXVuc2lnbmVkIGludAlicm9rZW5fcGFyaXR5X3N0YXR1czoxOwkvKiBEZXZpY2UgZ2VuZXJhdGVzIGZhbHNlIHBvc2l0aXZlIHBhcml0eSAqLwogCXVuc2lnbmVkIGludCAJbXNpX2VuYWJsZWQ6MTsKIAl1bnNpZ25lZCBpbnQJbXNpeF9lbmFibGVkOjE7CisJYXRvbWljX3QJZW5hYmxlX2NudDsJLyogcGNpX2VuYWJsZV9kZXZpY2UgaGFzIGJlZW4gY2FsbGVkICovCiAKIAl1MzIJCXNhdmVkX2NvbmZpZ19zcGFjZVsxNl07IC8qIGNvbmZpZyBzcGFjZSBzYXZlZCBhdCBzdXNwZW5kIHRpbWUgKi8KIAlzdHJ1Y3QgaGxpc3RfaGVhZCBzYXZlZF9jYXBfc3BhY2U7CkBAIC00NDMsNiArNDQ0LDcgQEAKIGV4dGVybiB2b2lkIHBjaV9yZW1vdmVfYnVzX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9zdG9wX2J1c19kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9zZXR1cF9jYXJkYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOworZXh0ZXJuIHZvaWQgcGNpX3NvcnRfYnJlYWR0aGZpcnN0KHZvaWQpOwogCiAvKiBHZW5lcmljIFBDSSBmdW5jdGlvbnMgZXhwb3J0ZWQgdG8gY2FyZCBkcml2ZXJzICovCiAKQEAgLTQ1MiwxMyArNDU0LDE4IEBACiBpbnQgcGNpX2ZpbmRfY2FwYWJpbGl0eSAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGNhcCk7CiBpbnQgcGNpX2ZpbmRfbmV4dF9jYXBhYmlsaXR5IChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBwb3MsIGludCBjYXApOwogaW50IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5IChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY2FwKTsKLXN0cnVjdCBwY2lfYnVzICogcGNpX2ZpbmRfbmV4dF9idXMoY29uc3Qgc3RydWN0IHBjaV9idXMgKmZyb20pOworc3RydWN0IHBjaV9idXMgKnBjaV9maW5kX25leHRfYnVzKGNvbnN0IHN0cnVjdCBwY2lfYnVzICpmcm9tKTsKIAotc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfZGV2aWNlICh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiAqZnJvbSk7CitzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9kZXZpY2UodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgaW50IGRldmljZSwKKwkJCQlzdHJ1Y3QgcGNpX2RldiAqZnJvbSk7CitzdHJ1Y3QgcGNpX2RldiAqcGNpX2dldF9kZXZpY2VfcmV2ZXJzZSh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAorCQkJCXN0cnVjdCBwY2lfZGV2ICpmcm9tKTsKKwogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfc3Vic3lzICh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAogCQkJCXVuc2lnbmVkIGludCBzc192ZW5kb3IsIHVuc2lnbmVkIGludCBzc19kZXZpY2UsCiAJCQkJc3RydWN0IHBjaV9kZXYgKmZyb20pOwogc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfc2xvdCAoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuKTsKK3N0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2J1c19hbmRfc2xvdCAodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuKTsKIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2NsYXNzICh1bnNpZ25lZCBpbnQgY2xhc3MsIHN0cnVjdCBwY2lfZGV2ICpmcm9tKTsKIGludCBwY2lfZGV2X3ByZXNlbnQoY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkcyk7CiAKQEAgLTY1OCw3ICs2NjUsMTIgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKnBjaV9maW5kX3Nsb3QodW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuKQogeyByZXR1cm4gTlVMTDsgfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RldmljZSAodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgaW50IGRldmljZSwgc3RydWN0IHBjaV9kZXYgKmZyb20pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RldmljZSh1bnNpZ25lZCBpbnQgdmVuZG9yLAorCQkJCXVuc2lnbmVkIGludCBkZXZpY2UsIHN0cnVjdCBwY2lfZGV2ICpmcm9tKQoreyByZXR1cm4gTlVMTDsgfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpwY2lfZ2V0X2RldmljZV9yZXZlcnNlKHVuc2lnbmVkIGludCB2ZW5kb3IsCisJCQkJdW5zaWduZWQgaW50IGRldmljZSwgc3RydWN0IHBjaV9kZXYgKmZyb20pCiB7IHJldHVybiBOVUxMOyB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfc3Vic3lzICh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZGV2aWNlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzVhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9ob3RwbHVnLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBQQ0kgSG90UGx1ZyBDb3JlIEZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwyMDAxIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDAxIEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSUJNIENvcnAuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTZW5kIGZlZWRiYWNrIHRvIDxrcmlzdGVuLmMuYWNjYXJkaUBpbnRlbC5jb20+CisgKgorICovCisjaWZuZGVmIF9QQ0lfSE9UUExVR19ICisjZGVmaW5lIF9QQ0lfSE9UUExVR19ICisKKworLyogVGhlc2UgdmFsdWVzIGNvbWUgZnJvbSB0aGUgUENJIEhvdHBsdWcgU3BlYyAqLworZW51bSBwY2lfYnVzX3NwZWVkIHsKKwlQQ0lfU1BFRURfMzNNSHoJCQk9IDB4MDAsCisJUENJX1NQRUVEXzY2TUh6CQkJPSAweDAxLAorCVBDSV9TUEVFRF82Nk1Iel9QQ0lYCQk9IDB4MDIsCisJUENJX1NQRUVEXzEwME1Iel9QQ0lYCQk9IDB4MDMsCisJUENJX1NQRUVEXzEzM01Iel9QQ0lYCQk9IDB4MDQsCisJUENJX1NQRUVEXzY2TUh6X1BDSVhfRUNDCT0gMHgwNSwKKwlQQ0lfU1BFRURfMTAwTUh6X1BDSVhfRUNDCT0gMHgwNiwKKwlQQ0lfU1BFRURfMTMzTUh6X1BDSVhfRUNDCT0gMHgwNywKKwlQQ0lfU1BFRURfNjZNSHpfUENJWF8yNjYJPSAweDA5LAorCVBDSV9TUEVFRF8xMDBNSHpfUENJWF8yNjYJPSAweDBhLAorCVBDSV9TUEVFRF8xMzNNSHpfUENJWF8yNjYJPSAweDBiLAorCVBDSV9TUEVFRF82Nk1Iel9QQ0lYXzUzMwk9IDB4MTEsCisJUENJX1NQRUVEXzEwME1Iel9QQ0lYXzUzMwk9IDB4MTIsCisJUENJX1NQRUVEXzEzM01Iel9QQ0lYXzUzMwk9IDB4MTMsCisJUENJX1NQRUVEX1VOS05PV04JCT0gMHhmZiwKK307CisKKy8qIFRoZXNlIHZhbHVlcyBjb21lIGZyb20gdGhlIFBDSSBFeHByZXNzIFNwZWMgKi8KK2VudW0gcGNpZV9saW5rX3dpZHRoIHsKKwlQQ0lFX0xOS19XSURUSF9SRVNSVgk9IDB4MDAsCisJUENJRV9MTktfWDEJCT0gMHgwMSwKKwlQQ0lFX0xOS19YMgkJPSAweDAyLAorCVBDSUVfTE5LX1g0CQk9IDB4MDQsCisJUENJRV9MTktfWDgJCT0gMHgwOCwKKwlQQ0lFX0xOS19YMTIJCT0gMHgwQywKKwlQQ0lFX0xOS19YMTYJCT0gMHgxMCwKKwlQQ0lFX0xOS19YMzIJCT0gMHgyMCwKKwlQQ0lFX0xOS19XSURUSF9VTktOT1dOICA9IDB4RkYsCit9OworCitlbnVtIHBjaWVfbGlua19zcGVlZCB7CisJUENJRV8yUFQ1R0IJCT0gMHgxNCwKKwlQQ0lFX0xOS19TUEVFRF9VTktOT1dOCT0gMHhGRiwKK307CisKK3N0cnVjdCBob3RwbHVnX3Nsb3Q7CitzdHJ1Y3QgaG90cGx1Z19zbG90X2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgaG90cGx1Z19zbG90ICosIGNoYXIgKik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgaG90cGx1Z19zbG90ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK307CisjZGVmaW5lIHRvX2hvdHBsdWdfYXR0cihuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IGhvdHBsdWdfc2xvdF9hdHRyaWJ1dGUsIGF0dHIpOworCisvKioKKyAqIHN0cnVjdCBob3RwbHVnX3Nsb3Rfb3BzIC10aGUgY2FsbGJhY2tzIHRoYXQgdGhlIGhvdHBsdWcgcGNpIGNvcmUgY2FuIHVzZQorICogQG93bmVyOiBUaGUgbW9kdWxlIG93bmVyIG9mIHRoaXMgc3RydWN0dXJlCisgKiBAZW5hYmxlX3Nsb3Q6IENhbGxlZCB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIGVuYWJsZSBhIHNwZWNpZmljIHBjaSBzbG90CisgKiBAZGlzYWJsZV9zbG90OiBDYWxsZWQgd2hlbiB0aGUgdXNlciB3YW50cyB0byBkaXNhYmxlIGEgc3BlY2lmaWMgcGNpIHNsb3QKKyAqIEBzZXRfYXR0ZW50aW9uX3N0YXR1czogQ2FsbGVkIHRvIHNldCB0aGUgc3BlY2lmaWMgc2xvdCdzIGF0dGVudGlvbiBMRUQgdG8KKyAqIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAqIEBoYXJkd2FyZV90ZXN0OiBDYWxsZWQgdG8gcnVuIGEgc3BlY2lmaWVkIGhhcmR3YXJlIHRlc3Qgb24gdGhlIHNwZWNpZmllZAorICogc2xvdC4KKyAqIEBnZXRfcG93ZXJfc3RhdHVzOiBDYWxsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHBvd2VyIHN0YXR1cyBvZiBhIHNsb3QuCisgKiAJSWYgdGhpcyBmaWVsZCBpcyBOVUxMLCB0aGUgdmFsdWUgcGFzc2VkIGluIHRoZSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8KKyAqIAl3aWxsIGJlIHVzZWQgd2hlbiB0aGlzIHZhbHVlIGlzIHJlcXVlc3RlZCBieSBhIHVzZXIuCisgKiBAZ2V0X2F0dGVudGlvbl9zdGF0dXM6IENhbGxlZCB0byBnZXQgdGhlIGN1cnJlbnQgYXR0ZW50aW9uIHN0YXR1cyBvZiBhIHNsb3QuCisgKglJZiB0aGlzIGZpZWxkIGlzIE5VTEwsIHRoZSB2YWx1ZSBwYXNzZWQgaW4gdGhlIHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbworICoJd2lsbCBiZSB1c2VkIHdoZW4gdGhpcyB2YWx1ZSBpcyByZXF1ZXN0ZWQgYnkgYSB1c2VyLgorICogQGdldF9sYXRjaF9zdGF0dXM6IENhbGxlZCB0byBnZXQgdGhlIGN1cnJlbnQgbGF0Y2ggc3RhdHVzIG9mIGEgc2xvdC4KKyAqCUlmIHRoaXMgZmllbGQgaXMgTlVMTCwgdGhlIHZhbHVlIHBhc3NlZCBpbiB0aGUgc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvCisgKgl3aWxsIGJlIHVzZWQgd2hlbiB0aGlzIHZhbHVlIGlzIHJlcXVlc3RlZCBieSBhIHVzZXIuCisgKiBAZ2V0X2FkYXB0ZXJfc3RhdHVzOiBDYWxsZWQgdG8gZ2V0IHNlZSBpZiBhbiBhZGFwdGVyIGlzIHByZXNlbnQgaW4gdGhlIHNsb3Qgb3Igbm90LgorICoJSWYgdGhpcyBmaWVsZCBpcyBOVUxMLCB0aGUgdmFsdWUgcGFzc2VkIGluIHRoZSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8KKyAqCXdpbGwgYmUgdXNlZCB3aGVuIHRoaXMgdmFsdWUgaXMgcmVxdWVzdGVkIGJ5IGEgdXNlci4KKyAqIEBnZXRfYWRkcmVzczogQ2FsbGVkIHRvIGdldCBwY2kgYWRkcmVzcyBvZiBhIHNsb3QuCisgKglJZiB0aGlzIGZpZWxkIGlzIE5VTEwsIHRoZSB2YWx1ZSBwYXNzZWQgaW4gdGhlIHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbworICoJd2lsbCBiZSB1c2VkIHdoZW4gdGhpcyB2YWx1ZSBpcyByZXF1ZXN0ZWQgYnkgYSB1c2VyLgorICogQGdldF9tYXhfYnVzX3NwZWVkOiBDYWxsZWQgdG8gZ2V0IHRoZSBtYXggYnVzIHNwZWVkIGZvciBhIHNsb3QuCisgKglJZiB0aGlzIGZpZWxkIGlzIE5VTEwsIHRoZSB2YWx1ZSBwYXNzZWQgaW4gdGhlIHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbworICoJd2lsbCBiZSB1c2VkIHdoZW4gdGhpcyB2YWx1ZSBpcyByZXF1ZXN0ZWQgYnkgYSB1c2VyLgorICogQGdldF9jdXJfYnVzX3NwZWVkOiBDYWxsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IGJ1cyBzcGVlZCBmb3IgYSBzbG90LgorICoJSWYgdGhpcyBmaWVsZCBpcyBOVUxMLCB0aGUgdmFsdWUgcGFzc2VkIGluIHRoZSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8KKyAqCXdpbGwgYmUgdXNlZCB3aGVuIHRoaXMgdmFsdWUgaXMgcmVxdWVzdGVkIGJ5IGEgdXNlci4KKyAqCisgKiBUaGUgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGhvdHBsdWcgcGNpIGNvcmUgYnkgYQorICogaG90cGx1ZyBwY2kgZHJpdmVyLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGhvdHBsdWcgcGNpIGNvcmUgd2hlbgorICogdGhlIHVzZXIgd2FudHMgdG8gZG8gc29tZXRoaW5nIHRvIGEgc3BlY2lmaWMgc2xvdCAocXVlcnkgaXQgZm9yIGluZm9ybWF0aW9uLAorICogc2V0IGFuIExFRCwgZW5hYmxlIC8gZGlzYWJsZSBwb3dlciwgZXRjLikKKyAqLworc3RydWN0IGhvdHBsdWdfc2xvdF9vcHMgeworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWludCAoKmVuYWJsZV9zbG90KQkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QpOworCWludCAoKmRpc2FibGVfc2xvdCkJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKKwlpbnQgKCpzZXRfYXR0ZW50aW9uX3N0YXR1cykJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHU4IHZhbHVlKTsKKwlpbnQgKCpoYXJkd2FyZV90ZXN0KQkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHUzMiB2YWx1ZSk7CisJaW50ICgqZ2V0X3Bvd2VyX3N0YXR1cykJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOworCWludCAoKmdldF9hdHRlbnRpb25fc3RhdHVzKQkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKnZhbHVlKTsKKwlpbnQgKCpnZXRfbGF0Y2hfc3RhdHVzKQkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIHU4ICp2YWx1ZSk7CisJaW50ICgqZ2V0X2FkYXB0ZXJfc3RhdHVzKQkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgdTggKnZhbHVlKTsKKwlpbnQgKCpnZXRfYWRkcmVzcykJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1MzIgKnZhbHVlKTsKKwlpbnQgKCpnZXRfbWF4X2J1c19zcGVlZCkJKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsIGVudW0gcGNpX2J1c19zcGVlZCAqdmFsdWUpOworCWludCAoKmdldF9jdXJfYnVzX3NwZWVkKQkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwgZW51bSBwY2lfYnVzX3NwZWVkICp2YWx1ZSk7Cit9OworCisvKioKKyAqIHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyAtIHVzZWQgdG8gbm90aWZ5IHRoZSBob3RwbHVnIHBjaSBjb3JlIG9mIHRoZSBzdGF0ZSBvZiB0aGUgc2xvdAorICogQHBvd2VyOiBpZiBwb3dlciBpcyBlbmFibGVkIG9yIG5vdCAoMS8wKQorICogQGF0dGVudGlvbl9zdGF0dXM6IGlmIHRoZSBhdHRlbnRpb24gbGlnaHQgaXMgZW5hYmxlZCBvciBub3QgKDEvMCkKKyAqIEBsYXRjaF9zdGF0dXM6IGlmIHRoZSBsYXRjaCAoaWYgYW55KSBpcyBvcGVuIG9yIGNsb3NlZCAoMS8wKQorICogQGFkYXB0ZXJfcHJlc2VudDogaWYgdGhlcmUgaXMgYSBwY2kgYm9hcmQgcHJlc2VudCBpbiB0aGUgc2xvdCBvciBub3QgKDEvMCkKKyAqIEBhZGRyZXNzOiAoZG9tYWluIDw8IDE2IHwgYnVzIDw8IDggfCBkZXYpCisgKgorICogVXNlZCB0byBub3RpZnkgdGhlIGhvdHBsdWcgcGNpIGNvcmUgb2YgdGhlIHN0YXR1cyBvZiBhIHNwZWNpZmljIHNsb3QuCisgKi8KK3N0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyB7CisJdTgJcG93ZXJfc3RhdHVzOworCXU4CWF0dGVudGlvbl9zdGF0dXM7CisJdTgJbGF0Y2hfc3RhdHVzOworCXU4CWFkYXB0ZXJfc3RhdHVzOworCXUzMglhZGRyZXNzOworCWVudW0gcGNpX2J1c19zcGVlZAltYXhfYnVzX3NwZWVkOworCWVudW0gcGNpX2J1c19zcGVlZAljdXJfYnVzX3NwZWVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaG90cGx1Z19zbG90IC0gdXNlZCB0byByZWdpc3RlciBhIHBoeXNpY2FsIHNsb3Qgd2l0aCB0aGUgaG90cGx1ZyBwY2kgY29yZQorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBzbG90IGJlaW5nIHJlZ2lzdGVyZWQuICBUaGlzIHN0cmluZyBtdXN0CisgKiBiZSB1bmlxdWUgYW1vdW5nIHNsb3RzIHJlZ2lzdGVyZWQgb24gdGhpcyBzeXN0ZW0uCisgKiBAb3BzOiBwb2ludGVyIHRvIHRoZSAmc3RydWN0IGhvdHBsdWdfc2xvdF9vcHMgdG8gYmUgdXNlZCBmb3IgdGhpcyBzbG90CisgKiBAaW5mbzogcG9pbnRlciB0byB0aGUgJnN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyBmb3IgdGhlIGluaXRpYWwgdmFsdWVzIGZvcgorICogdGhpcyBzbG90LgorICogQHJlbGVhc2U6IGNhbGxlZCBkdXJpbmcgcGNpX2hwX2RlcmVnaXN0ZXIgdG8gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGluIGEKKyAqIGhvdHBsdWdfc2xvdCBzdHJ1Y3R1cmUuCisgKiBAcHJpdmF0ZTogdXNlZCBieSB0aGUgaG90cGx1ZyBwY2kgY29udHJvbGxlciBkcml2ZXIgdG8gc3RvcmUgd2hhdGV2ZXIgaXQKKyAqIG5lZWRzLgorICovCitzdHJ1Y3QgaG90cGx1Z19zbG90IHsKKwljaGFyCQkJCSpuYW1lOworCXN0cnVjdCBob3RwbHVnX3Nsb3Rfb3BzCQkqb3BzOworCXN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbwkqaW5mbzsKKwl2b2lkICgqcmVsZWFzZSkgKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QpOworCXZvaWQJCQkJKnByaXZhdGU7CisKKwkvKiBWYXJpYWJsZXMgYmVsb3cgdGhpcyBhcmUgZm9yIHVzZSBvbmx5IGJ5IHRoZSBob3RwbHVnIHBjaSBjb3JlLiAqLworCXN0cnVjdCBsaXN0X2hlYWQJCXNsb3RfbGlzdDsKKwlzdHJ1Y3Qga29iamVjdAkJCWtvYmo7Cit9OworI2RlZmluZSB0b19ob3RwbHVnX3Nsb3QobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCBob3RwbHVnX3Nsb3QsIGtvYmopCisKK2V4dGVybiBpbnQgcGNpX2hwX3JlZ2lzdGVyCQkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCk7CitleHRlcm4gaW50IHBjaV9ocF9kZXJlZ2lzdGVyCQkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCk7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBwY2lfaHBfY2hhbmdlX3Nsb3RfaW5mbwkoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCwKKwkJCQkJCSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gKmluZm8pOworZXh0ZXJuIHN0cnVjdCBzdWJzeXN0ZW0gcGNpX2hvdHBsdWdfc2xvdHNfc3Vic3lzOworCisvKiBQQ0kgU2V0dGluZyBSZWNvcmQgKFR5cGUgMCkgKi8KK3N0cnVjdCBocHBfdHlwZTAgeworCXUzMiByZXZpc2lvbjsKKwl1OCAgY2FjaGVfbGluZV9zaXplOworCXU4ICBsYXRlbmN5X3RpbWVyOworCXU4ICBlbmFibGVfc2VycjsKKwl1OCAgZW5hYmxlX3BlcnI7Cit9OworCisvKiBQQ0ktWCBTZXR0aW5nIFJlY29yZCAoVHlwZSAxKSAqLworc3RydWN0IGhwcF90eXBlMSB7CisJdTMyIHJldmlzaW9uOworCXU4ICBtYXhfbWVtX3JlYWQ7CisJdTggIGF2Z19tYXhfc3BsaXQ7CisJdTE2IHRvdF9tYXhfc3BsaXQ7Cit9OworCisvKiBQQ0kgRXhwcmVzcyBTZXR0aW5nIFJlY29yZCAoVHlwZSAyKSAqLworc3RydWN0IGhwcF90eXBlMiB7CisJdTMyIHJldmlzaW9uOworCXUzMiB1bmNfZXJyX21hc2tfYW5kOworCXUzMiB1bmNfZXJyX21hc2tfb3I7CisJdTMyIHVuY19lcnJfc2V2ZXJfYW5kOworCXUzMiB1bmNfZXJyX3NldmVyX29yOworCXUzMiBjb3JfZXJyX21hc2tfYW5kOworCXUzMiBjb3JfZXJyX21hc2tfb3I7CisJdTMyIGFkdl9lcnJfY2FwX2FuZDsKKwl1MzIgYWR2X2Vycl9jYXBfb3I7CisJdTE2IHBjaV9leHBfZGV2Y3RsX2FuZDsKKwl1MTYgcGNpX2V4cF9kZXZjdGxfb3I7CisJdTE2IHBjaV9leHBfbG5rY3RsX2FuZDsKKwl1MTYgcGNpX2V4cF9sbmtjdGxfb3I7CisJdTMyIHNlY191bmNfZXJyX3NldmVyX2FuZDsKKwl1MzIgc2VjX3VuY19lcnJfc2V2ZXJfb3I7CisJdTMyIHNlY191bmNfZXJyX21hc2tfYW5kOworCXUzMiBzZWNfdW5jX2Vycl9tYXNrX29yOworfTsKKworc3RydWN0IGhvdHBsdWdfcGFyYW1zIHsKKwlzdHJ1Y3QgaHBwX3R5cGUwICp0MDsJCS8qIFR5cGUwOiBOVUxMIGlmIG5vdCBhdmFpbGFibGUgKi8KKwlzdHJ1Y3QgaHBwX3R5cGUxICp0MTsJCS8qIFR5cGUxOiBOVUxMIGlmIG5vdCBhdmFpbGFibGUgKi8KKwlzdHJ1Y3QgaHBwX3R5cGUyICp0MjsJCS8qIFR5cGUyOiBOVUxMIGlmIG5vdCBhdmFpbGFibGUgKi8KKwlzdHJ1Y3QgaHBwX3R5cGUwIHR5cGUwX2RhdGE7CisJc3RydWN0IGhwcF90eXBlMSB0eXBlMV9kYXRhOworCXN0cnVjdCBocHBfdHlwZTIgdHlwZTJfZGF0YTsKK307CisKKyNpZmRlZiBDT05GSUdfQUNQSQorI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KK2V4dGVybiBhY3BpX3N0YXR1cyBhY3BpX3J1bl9vc2hwKGFjcGlfaGFuZGxlIGhhbmRsZSk7CitleHRlcm4gYWNwaV9zdGF0dXMgYWNwaV9nZXRfaHBfcGFyYW1zX2Zyb21fZmlybXdhcmUoc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJCQlzdHJ1Y3QgaG90cGx1Z19wYXJhbXMgKmhwcCk7CitpbnQgYWNwaV9yb290X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpOworI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBmMDY5ZGYyLi45NWMxZTc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMzkwLDcgKzM5MCw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfQ1M1NTM1X0lERQkweDAwMmQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfQVVESU8JMHgwMDJlCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfQ1M1NTM1X1VTQgkweDAwMmYKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfVklERU8JMHgwMDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfR1hfVklERU8JMHgwMDMwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfU0FUVVJOCQkweDAwMzUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OU19TQ3gyMDBfQlJJREdFCTB4MDUwMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05TX1NDeDIwMF9TTUkJMHgwNTAxCkBAIC00MDMsOCArNDAzLDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OU19TQzExMDBfWEJVUwkweDA1MTUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OU184NzQxMAkJMHhkMDAxCiAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfSE9TVF9CUklER0UgIDB4MDAyOAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX05TX0NTNTUzNV9JU0FfQlJJREdFICAgMHgwMDJiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlNfR1hfSE9TVF9CUklER0UgIDB4MDAyOAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfVFNFTkcJCTB4MTAwYwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RTRU5HX1czMlBfMgkweDMyMDIKQEAgLTEyMTMsNiArMTIxMiwxMSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjEgICAgICAgICAgICAgIDB4MDQ1MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjIgICAgICAgICAgICAgIDB4MDQ1MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjMgICAgICAgICAgICAgIDB4MDQ1MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjQgICAgICAgICAgICAgIDB4MDU0QworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjUgICAgICAgICAgICAgIDB4MDU0RAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjYgICAgICAgICAgICAgIDB4MDU0RQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjcgICAgICAgICAgICAgIDB4MDU0RgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjdfSURFICAgICAgIDB4MDU2MAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU1TCQkweDEwZTAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTVNfVFQxMjgJCTB4OTEyOApAQCAtMTc4MSwxNCArMTc4NSwxNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PWEFfQzEwNAkJMHgxMDQwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwNFUJMHgxMDQxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwNEpVCTB4MTA0MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDRFTAkweDEwNDMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1hBX0NUMTE0CTB4MTE0MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMTQJMHgxMTQxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDExOFUJMHgxMTgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDExOEVMCTB4MTE4MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMzIJMHgxMzIwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzMlUJMHgxMzIxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzNFUJMHgxMzQwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTY4CQkweDE2ODAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1hBX0NQMTY4VQkweDE2ODEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1hBX0NQMTY4RUwJMHgxNjgyCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DQ0QJCTB4MTM5NwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NDRF8yQkQwCQkweDJiZDAKQEAgLTE4NTksNiArMTg2Niw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzE2UENJOTVOCTB4OTUxMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NFBQCTB4OTUxMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1MgkweDk1MjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTJQUAkweDk1MjMKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NBTVNVTkcJCTB4MTQ0ZAogCkBAIC0xODkyLDYgKzE5MDAsNyBAQAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NCQkweDE0ZTQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MgkweDE2MDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1Mk0JMHgxNjAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlgyXzU3MDkJCTB4MTYzOQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAwCTB4MTY0NAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAxCTB4MTY0NQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyCTB4MTY0NgpAQCAtMTkyNSw2ICsxOTM0LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1ME0JMHgxNjdjCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTFNCTB4MTY3ZAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUxRgkweDE2N2UKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4N0YJMHgxNjdmCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3ODdNCTB4MTY5MwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzgyCTB4MTY5NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RJR09OM181Nzg2CTB4MTY5YQpAQCAtMTk5Niw2ICsyMDA2LDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9GQVJTSVRFX1RFMSAgICAgICAweDE2MTAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9GQVJTSVRFX1RFMUMgICAgICAweDE2MTIKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FSSU1BCQkweDE2MWYKKwogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJQllURQkJMHgxNjZkCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkNNMTI1MF9QQ0kJMHgwMDAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkNNMTI1MF9IVAkweDAwMDIKQEAgLTIwNTUsNiArMjA2NywxMCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY2CTB4MjM2NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzY4CTB4MjM2OAogCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfS09SRU5JWAkJMHgxOTgyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfS09SRU5JWF9KRVRDQVJERjAJMHgxNjAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfS09SRU5JWF9KRVRDQVJERjEJMHgxNmZmCisKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9URUtSQU0JCTB4MWRlMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RFS1JBTV9EQzI5MAkweGRjMjkKIApAQCAtMjIxMCw2ICsyMjI2LDEzIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF80CTB4MjgxNQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNQkweDI4M2UKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzYJMHgyODUwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV8wCTB4MjkxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfMQkweDI5MTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzIJMHgyOTEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV8zCTB4MjkxMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNAkweDI5MTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzUJMHgyOTE1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV82CTB4MjkzMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODU1UE1fSEIJMHgzMzQwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEIJMHgzNTc1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfQ0dDCTB4MzU3NwpAQCAtMjM1MSwzICsyMzc0LDUgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9STUVfRElHSTMyX1BSTwkweDk4OTcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9STUVfRElHSTMyXzgJMHg5ODk4CiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9RVUlDS05FVAkJMHgxNUUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVJQ0tORVRfWEoJMHgwNTAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKaW5kZXggYzMxMmExMi4uMDY0YjFkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApAQCAtMjkyLDYgKzI5MiwxMiBAQAogI2RlZmluZSBQQ0lfTVNJX0RBVEFfNjQJCTEyCS8qIDE2IGJpdHMgb2YgZGF0YSBmb3IgNjQtYml0IGRldmljZXMgKi8KICNkZWZpbmUgUENJX01TSV9NQVNLX0JJVAkxNgkvKiBNYXNrIGJpdHMgcmVnaXN0ZXIgKi8KIAorLyogTVNJLVggcmVnaXN0ZXJzICh0aGVzZSBhcmUgYXQgb2Zmc2V0IFBDSV9NU0lfRkxBR1MpICovCisjZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX1FTSVpFCTB4N0ZGCisjZGVmaW5lIFBDSV9NU0lYX0ZMQUdTX0VOQUJMRQkoMSA8PCAxNSkKKyNkZWZpbmUgUENJX01TSVhfRkxBR1NfQklSTUFTSwkoNyA8PCAwKQorI2RlZmluZSBQQ0lfTVNJWF9GTEFHU19CSVRNQVNLCSgxIDw8IDApCisKIC8qIENvbXBhY3RQQ0kgSG90c3dhcCBSZWdpc3RlciAqLwogCiAjZGVmaW5lIFBDSV9DSFNXUF9DU1IJCTIJLyogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCkBAIC0zNzEsNiArMzc3LDcgQEAKICNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX1RSUE5ECTB4MjAJLyogVHJhbnNhY3Rpb25zIFBlbmRpbmcgKi8KICNkZWZpbmUgUENJX0VYUF9MTktDQVAJCTEyCS8qIExpbmsgQ2FwYWJpbGl0aWVzICovCiAjZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkxNgkvKiBMaW5rIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTiAweDEwMAkvKiBFbmFibGUgY2xrcmVxICovCiAjZGVmaW5lIFBDSV9FWFBfTE5LU1RBCQkxOAkvKiBMaW5rIFN0YXR1cyAqLwogI2RlZmluZSBQQ0lfRVhQX1NMVENBUAkJMjAJLyogU2xvdCBDYXBhYmlsaXRpZXMgKi8KICNkZWZpbmUgUENJX0VYUF9TTFRDVEwJCTI0CS8qIFNsb3QgQ29udHJvbCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oIGIvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oCmluZGV4IDgwZDc4MGUuLjAxMmNkNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyc29uYWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9MSU5VWF9QRVJTT05BTElUWV9ICiAjZGVmaW5lIF9MSU5VWF9QRVJTT05BTElUWV9ICiAKKyNpZmRlZiBfX0tFUk5FTF9fCisKIC8qCiAgKiBIYW5kbGluZyBvZiBkaWZmZXJlbnQgQUJJcyAocGVyc29uYWxpdGllcykuCiAgKi8KQEAgLTEyLDYgKzE0LDggQEAKIGV4dGVybiBpbnQJCXVucmVnaXN0ZXJfZXhlY19kb21haW4oc3RydWN0IGV4ZWNfZG9tYWluICopOwogZXh0ZXJuIGludAkJX19zZXRfcGVyc29uYWxpdHkodW5zaWduZWQgbG9uZyk7CiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKIC8qCiAgKiBGbGFncyBmb3IgYnVnIGVtdWxhdGlvbi4KICAqCkBAIC03MSw2ICs3NSw3IEBACiAJUEVSX01BU0sgPQkJMHgwMGZmLAogfTsKIAorI2lmZGVmIF9fS0VSTkVMX18KIAogLyoKICAqIERlc2NyaXB0aW9uIG9mIGFuIGV4ZWN1dGlvbiBkb21haW4uCkBAIC0xMDksNiArMTE0LDggQEAKICAqIENoYW5nZSBwZXJzb25hbGl0eSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgcHJvY2Vzcy4KICAqLwogI2RlZmluZSBzZXRfcGVyc29uYWxpdHkocGVycykgXAotCSgoY3VycmVudC0+cGVyc29uYWxpdHkgPT0gcGVycykgPyAwIDogX19zZXRfcGVyc29uYWxpdHkocGVycykpCisJKChjdXJyZW50LT5wZXJzb25hbGl0eSA9PSAocGVycykpID8gMCA6IF9fc2V0X3BlcnNvbmFsaXR5KHBlcnMpKQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX1BFUlNPTkFMSVRZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oIGIvaW5jbHVkZS9saW51eC9wZmtleXYyLmgKaW5kZXggZDVkZDQ3MS4uMjY1YmFmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZmtleXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZmtleXYyLmgKQEAgLTMyLDcgKzMyLDcgQEAKIHN0cnVjdCBzYWRiX3NhIHsKIAl1aW50MTZfdAlzYWRiX3NhX2xlbjsKIAl1aW50MTZfdAlzYWRiX3NhX2V4dHR5cGU7Ci0JdWludDMyX3QJc2FkYl9zYV9zcGk7CisJX19iZTMyCQlzYWRiX3NhX3NwaTsKIAl1aW50OF90CQlzYWRiX3NhX3JlcGxheTsKIAl1aW50OF90CQlzYWRiX3NhX3N0YXRlOwogCXVpbnQ4X3QJCXNhZGJfc2FfYXV0aDsKQEAgLTIxMSw3ICsyMTEsNyBAQAogc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0IHsKIAl1aW50MTZfdAlzYWRiX3hfbmF0X3RfcG9ydF9sZW47CiAJdWludDE2X3QJc2FkYl94X25hdF90X3BvcnRfZXh0dHlwZTsKLQl1aW50MTZfdAlzYWRiX3hfbmF0X3RfcG9ydF9wb3J0OworCV9fYmUxNgkJc2FkYl94X25hdF90X3BvcnRfcG9ydDsKIAl1aW50MTZfdAlzYWRiX3hfbmF0X3RfcG9ydF9yZXNlcnZlZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0KSA9PSA4ICovCkBAIC0yODUsNiArMjg1LDcgQEAKICNkZWZpbmUgU0FEQl9YX0FBTEdfU0hBMl8zODRITUFDCTYKICNkZWZpbmUgU0FEQl9YX0FBTEdfU0hBMl81MTJITUFDCTcKICNkZWZpbmUgU0FEQl9YX0FBTEdfUklQRU1EMTYwSE1BQwk4CisjZGVmaW5lIFNBREJfWF9BQUxHX0FFU19YQ0JDX01BQwk5CiAjZGVmaW5lIFNBREJfWF9BQUxHX05VTEwJCTI1MQkvKiBrYW1lICovCiAjZGVmaW5lIFNBREJfQUFMR19NQVgJCQkyNTEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHkuaCBiL2luY2x1ZGUvbGludXgvcGh5LmgKaW5kZXggOTQ0N2E1Ny4uZWRkNGM4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeS5oCkBAIC0yMCw2ICsyMCwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2RlZmluZSBQSFlfQkFTSUNfRkVBVFVSRVMJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBcCiAJCQkJIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBcCkBAIC00MywxNSArNDcsMjYgQEAKICNkZWZpbmUgUEhZX0hBU19JTlRFUlJVUFQJMHgwMDAwMDAwMQogI2RlZmluZSBQSFlfSEFTX01BR0lDQU5FRwkweDAwMDAwMDAyCiAKKy8qIEludGVyZmFjZSBNb2RlIGRlZmluaXRpb25zICovCit0eXBlZGVmIGVudW0geworCVBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCisJUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUksCisJUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJLAorCVBIWV9JTlRFUkZBQ0VfTU9ERV9UQkksCisJUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCisJUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJLAorCVBIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJCit9IHBoeV9pbnRlcmZhY2VfdDsKKwogI2RlZmluZSBNSUlfQlVTX01BWCA0CiAKIAotI2RlZmluZSBQSFlfSU5JVF9USU1FT1VUIDEwMDAwMAorI2RlZmluZSBQSFlfSU5JVF9USU1FT1VUCTEwMDAwMAogI2RlZmluZSBQSFlfU1RBVEVfVElNRQkJMQogI2RlZmluZSBQSFlfRk9SQ0VfVElNRU9VVAkxMAogI2RlZmluZSBQSFlfQU5fVElNRU9VVAkJMTAKIAotI2RlZmluZSBQSFlfTUFYX0FERFIgMzIKKyNkZWZpbmUgUEhZX01BWF9BRERSCTMyCiAKIC8qIFVzZWQgd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byBhIHNwZWNpZmljIHBoeSAobWlpIGJ1cyBpZDpwaHkgZGV2aWNlIGlkKSAqLwogI2RlZmluZSBQSFlfSURfRk1UICIleDolMDJ4IgpAQCAtODMsOCArOTgsOCBAQAogCWludCAqaXJxOwogfTsKIAotI2RlZmluZSBQSFlfSU5URVJSVVBUX0RJU0FCTEVEIDB4MAotI2RlZmluZSBQSFlfSU5URVJSVVBUX0VOQUJMRUQgMHg4MDAwMDAwMAorI2RlZmluZSBQSFlfSU5URVJSVVBUX0RJU0FCTEVECTB4MAorI2RlZmluZSBQSFlfSU5URVJSVVBUX0VOQUJMRUQJMHg4MDAwMDAwMAogCiAvKiBQSFkgc3RhdGUgbWFjaGluZSBzdGF0ZXM6CiAgKgpAQCAtMjI2LDYgKzI0MSw4IEBACiAKIAl1MzIgZGV2X2ZsYWdzOwogCisJcGh5X2ludGVyZmFjZV90IGludGVyZmFjZTsKKwogCS8qIEJ1cyBhZGRyZXNzIG9mIHRoZSBQSFkgKDAtMzIpICovCiAJaW50IGFkZHI7CiAKQEAgLTM0MSw5ICszNTgsMTAgQEAKIGludCBwaHlfY2xlYXJfaW50ZXJydXB0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOwogaW50IHBoeV9jb25maWdfaW50ZXJydXB0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsIHUzMiBpbnRlcnJ1cHRzKTsKIHN0cnVjdCBwaHlfZGV2aWNlICogcGh5X2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQljb25zdCBjaGFyICpwaHlfaWQsIHUzMiBmbGFncyk7CisJCWNvbnN0IGNoYXIgKnBoeV9pZCwgdTMyIGZsYWdzLCBwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKIHN0cnVjdCBwaHlfZGV2aWNlICogcGh5X2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcGh5X2lkLAotCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKiksIHUzMiBmbGFncyk7CisJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqKSwgdTMyIGZsYWdzLAorCQlwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKTsKIHZvaWQgcGh5X2Rpc2Nvbm5lY3Qoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CiB2b2lkIHBoeV9kZXRhY2goc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CiB2b2lkIHBoeV9zdGFydChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkLmggYi9pbmNsdWRlL2xpbnV4L3BpZC5oCmluZGV4IDJjMDAwN2QuLjRkZWMwNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9waWQuaApAQCAtMzUsOCArMzUsOSBAQAogICoKICAqIEhvbGRpbmcgYSByZWZlcmVuY2UgdG8gc3RydWN0IHBpZCBzb2x2ZXMgYm90aCBvZiB0aGVzZSBwcm9ibGVtcy4KICAqIEl0IGlzIHNtYWxsIHNvIGhvbGRpbmcgYSByZWZlcmVuY2UgZG9lcyBub3QgY29uc3VtZSBhIGxvdCBvZgotICogcmVzb3VyY2VzLCBhbmQgc2luY2UgYSBuZXcgc3RydWN0IHBpZCBpcyBhbGxvY2F0ZWQgd2hlbiB0aGUgbnVtZXJpYwotICogcGlkIHZhbHVlIGlzIHJldXNlZCB3ZSBkb24ndCBtaXN0YWtlbmx5IHJlZmVyIHRvIG5ldyBwcm9jZXNzZXMuCisgKiByZXNvdXJjZXMsIGFuZCBzaW5jZSBhIG5ldyBzdHJ1Y3QgcGlkIGlzIGFsbG9jYXRlZCB3aGVuIHRoZSBudW1lcmljIHBpZAorICogdmFsdWUgaXMgcmV1c2VkICh3aGVuIHBpZHMgd3JhcCBhcm91bmQpIHdlIGRvbid0IG1pc3Rha2VubHkgcmVmZXIgdG8gbmV3CisgKiBwcm9jZXNzZXMuCiAgKi8KIAogc3RydWN0IHBpZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmE5ZDQxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBfTElOVVhfUElEX05TX0gKKyNkZWZpbmUgX0xJTlVYX1BJRF9OU19ICisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BpZC5oPgorI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisKK3N0cnVjdCBwaWRtYXAgeworICAgICAgIGF0b21pY190IG5yX2ZyZWU7CisgICAgICAgdm9pZCAqcGFnZTsKK307CisKKyNkZWZpbmUgUElETUFQX0VOVFJJRVMgICAgICAgICAoKFBJRF9NQVhfTElNSVQgKyA4KlBBR0VfU0laRSAtIDEpL1BBR0VfU0laRS84KQorCitzdHJ1Y3QgcGlkX25hbWVzcGFjZSB7CisJc3RydWN0IGtyZWYga3JlZjsKKwlzdHJ1Y3QgcGlkbWFwIHBpZG1hcFtQSURNQVBfRU5UUklFU107CisJaW50IGxhc3RfcGlkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGRfcmVhcGVyOworfTsKKworZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlIGluaXRfcGlkX25zOworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3BpZF9ucyhzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpCit7CisJa3JlZl9nZXQoJm5zLT5rcmVmKTsKK30KKworZXh0ZXJuIGludCBjb3B5X3BpZF9ucyhpbnQgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKK2V4dGVybiB2b2lkIGZyZWVfcGlkX25zKHN0cnVjdCBrcmVmICprcmVmKTsKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9waWRfbnMoc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKQoreworCWtyZWZfcHV0KCZucy0+a3JlZiwgZnJlZV9waWRfbnMpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGRfcmVhcGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiB0c2stPm5zcHJveHktPnBpZF9ucy0+Y2hpbGRfcmVhcGVyOworfQorCisjZW5kaWYgLyogX0xJTlVYX1BJRF9OU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oIGIvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaAppbmRleCBlYTRmN2NkLi4yZTE5NDc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKQEAgLTEyLDcgKzEyLDcgQEAKIHN0cnVjdCBwaXBlX2J1ZmZlciB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgaW50IG9mZnNldCwgbGVuOwotCXN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zICpvcHM7CisJY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wczsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiB9OwogCkBAIC00MSw5ICs0MSw3IEBACiBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvIHsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwogCXVuc2lnbmVkIGludCBucmJ1ZnMsIGN1cmJ1ZjsKLQlzdHJ1Y3QgcGlwZV9idWZmZXIgYnVmc1tQSVBFX0JVRkZFUlNdOwogCXN0cnVjdCBwYWdlICp0bXBfcGFnZTsKLQl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAJdW5zaWduZWQgaW50IHJlYWRlcnM7CiAJdW5zaWduZWQgaW50IHdyaXRlcnM7CiAJdW5zaWduZWQgaW50IHdhaXRpbmdfd3JpdGVyczsKQEAgLTUyLDYgKzUwLDcgQEAKIAlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmFzeW5jX3JlYWRlcnM7CiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luY193cml0ZXJzOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHBpcGVfYnVmZmVyIGJ1ZnNbUElQRV9CVUZGRVJTXTsKIH07CiAKIC8qIERpZmZlcnMgZnJvbSBQSVBFX0JVRiBpbiB0aGF0IFBJUEVfU0laRSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBhY3R1YWwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGt0Y2R2ZC5oIGIvaW5jbHVkZS9saW51eC9wa3RjZHZkLmgKaW5kZXggOGE5NGM3MS4uNWVhNGYwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wa3RjZHZkLmgKKysrIGIvaW5jbHVkZS9saW51eC9wa3RjZHZkLmgKQEAgLTExMSw2ICsxMTEsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworLyogZGVmYXVsdCBiaW8gd3JpdGUgcXVldWUgY29uZ2VzdGlvbiBtYXJrcyAqLworI2RlZmluZSBQS1RfV1JJVEVfQ09OR0VTVElPTl9PTiAgICAxMDAwMAorI2RlZmluZSBQS1RfV1JJVEVfQ09OR0VTVElPTl9PRkYgICA5MDAwCisKIAogc3RydWN0IHBhY2tldF9zZXR0aW5ncwogewpAQCAtMjQxLDYgKzI0OCwxNCBAQAogfTsKICNkZWZpbmUgUFNEX1BPT0xfU0laRQkJNjQKIAorc3RydWN0IHBrdGNkdmRfa29iagoreworCXN0cnVjdCBrb2JqZWN0CQlrb2JqOworCXN0cnVjdCBwa3RjZHZkX2RldmljZQkqcGQ7Cit9OworI2RlZmluZSB0b19wa3RjZHZka29iaihfaykgXAorICAoKHN0cnVjdCBwa3RjZHZkX2tvYmoqKWNvbnRhaW5lcl9vZihfayxzdHJ1Y3QgcGt0Y2R2ZF9rb2JqLGtvYmopKQorCiBzdHJ1Y3QgcGt0Y2R2ZF9kZXZpY2UKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpiZGV2OwkJLyogZGV2IGF0dGFjaGVkICovCkBAIC0yNzEsNiArMjg2LDE2IEBACiAKIAlzdHJ1Y3QgcGFja2V0X2lvc2NoZWQgICBpb3NjaGVkOwogCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKworCWludAkJCXdyaXRlX2Nvbmdlc3Rpb25fb2ZmOworCWludAkJCXdyaXRlX2Nvbmdlc3Rpb25fb247CisKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlCSpjbHNkZXY7CS8qIHN5c2ZzIHBrdGNkdmRbMC03XSBjbGFzcyBkZXYgKi8KKwlzdHJ1Y3QgcGt0Y2R2ZF9rb2JqCSprb2JqX3N0YXQ7CS8qIHN5c2ZzIHBrdGNkdmRbMC03XS9zdGF0LyAgICAgKi8KKwlzdHJ1Y3QgcGt0Y2R2ZF9rb2JqCSprb2JqX3dxdWV1ZTsJLyogc3lzZnMgcGt0Y2R2ZFswLTddL3dyaXRlX3F1ZXVlLyAqLworCisJc3RydWN0IGRlbnRyeQkJKmRmc19kX3Jvb3Q7CS8qIGRlYnVnZnM6IGRldm5hbWUgZGlyZWN0b3J5ICovCisJc3RydWN0IGRlbnRyeQkJKmRmc19mX2luZm87CS8qIGRlYnVnZnM6IGluZm8gZmlsZSAqLwogfTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCmluZGV4IDI5Y2Q2ZGUuLjhiYmQ0NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaApAQCAtMzksNyArMzksNyBAQAogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBpZCk7CiBleHRlcm4gaW50IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgbnVtKTsKLWV4dGVybiBpbnQgcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIGV4dGVybiBpbnQgcGxhdGZvcm1fZGV2aWNlX2FkZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIGV4dGVybiB2b2lkIHBsYXRmb3JtX2RldmljZV9kZWwoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiBleHRlcm4gdm9pZCBwbGF0Zm9ybV9kZXZpY2VfcHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpAQCAtNTgsNiArNTgsMTIgQEAKIGV4dGVybiBpbnQgcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKik7CiBleHRlcm4gdm9pZCBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICopOwogCisvKiBub24taG90cGx1Z2dhYmxlIHBsYXRmb3JtIGRldmljZXMgbWF5IHVzZSB0aGlzIHNvIHRoYXQgcHJvYmUoKSBhbmQKKyAqIGl0cyBzdXBwb3J0IG1heSBsaXZlIGluIF9faW5pdCBzZWN0aW9ucywgY29uc2VydmluZyBydW50aW1lIG1lbW9yeS4KKyAqLworZXh0ZXJuIGludCBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpwcm9iZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKSk7CisKICNkZWZpbmUgcGxhdGZvcm1fZ2V0X2RydmRhdGEoX2RldikJZGV2X2dldF9kcnZkYXRhKCYoX2RldiktPmRldikKICNkZWZpbmUgcGxhdGZvcm1fc2V0X2RydmRhdGEoX2RldixkYXRhKQlkZXZfc2V0X2RydmRhdGEoJihfZGV2KS0+ZGV2LCAoZGF0YSkpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0uaCBiL2luY2x1ZGUvbGludXgvcG0uaAppbmRleCA2YjI3ZTA3Li4wNzAzOTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbS5oCkBAIC0xMTYsNyArMTE2LDkgQEAKICNkZWZpbmUJUE1fRElTS19QTEFURk9STQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSAyKQogI2RlZmluZQlQTV9ESVNLX1NIVVRET1dOCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDMpCiAjZGVmaW5lCVBNX0RJU0tfUkVCT09UCQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSA0KQotI2RlZmluZQlQTV9ESVNLX01BWAkJKChfX2ZvcmNlIHN1c3BlbmRfZGlza19tZXRob2RfdCkgNSkKKyNkZWZpbmUJUE1fRElTS19URVNUCQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSA1KQorI2RlZmluZQlQTV9ESVNLX1RFU1RQUk9DCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDYpCisjZGVmaW5lCVBNX0RJU0tfTUFYCQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSA3KQogCiBzdHJ1Y3QgcG1fb3BzIHsKIAlzdXNwZW5kX2Rpc2tfbWV0aG9kX3QgcG1fZGlza19tb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb2xsLmggYi9pbmNsdWRlL2xpbnV4L3BvbGwuaAppbmRleCA1MWUxYjU2Li4yNzY5MDc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BvbGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BvbGwuaApAQCAtOCw3ICs4LDggQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAvKiB+ODMyIGJ5dGVzIG9mIHN0YWNrIHNwYWNlIHVzZWQgbWF4IGluIHN5c19zZWxlY3Qvc3lzX3BvbGwgYmVmb3JlIGFsbG9jYXRpbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJvZmlsZS5oIGIvaW5jbHVkZS9saW51eC9wcm9maWxlLmgKaW5kZXggYWNjZTUzZi4uNTY3MGIzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcm9maWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcm9maWxlLmgKQEAgLTYsMTAgKzYsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAorZXh0ZXJuIGludCBwcm9mX29uIF9fcmVhZF9tb3N0bHk7CisKICNkZWZpbmUgQ1BVX1BST0ZJTElORwkxCiAjZGVmaW5lIFNDSEVEX1BST0ZJTElORwkyCisjZGVmaW5lIFNMRUVQX1BST0ZJTElORwkzCiAKIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeTsKIHN0cnVjdCBwdF9yZWdzOwpAQCAtMTgsNyArMjMsMjQgQEAKIC8qIGluaXQgYmFzaWMga2VybmVsIHByb2ZpbGVyICovCiB2b2lkIF9faW5pdCBwcm9maWxlX2luaXQodm9pZCk7CiB2b2lkIHByb2ZpbGVfdGljayhpbnQpOwotdm9pZCBwcm9maWxlX2hpdChpbnQsIHZvaWQgKik7CisKKy8qCisgKiBBZGQgbXVsdGlwbGUgcHJvZmlsZXIgaGl0cyB0byBhIGdpdmVuIGFkZHJlc3M6CisgKi8KK3ZvaWQgcHJvZmlsZV9oaXRzKGludCwgdm9pZCAqaXAsIHVuc2lnbmVkIGludCBucl9oaXRzKTsKKworLyoKKyAqIFNpbmdsZSBwcm9maWxlciBoaXQ6CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9maWxlX2hpdChpbnQgdHlwZSwgdm9pZCAqaXApCit7CisJLyoKKwkgKiBTcGVlZHVwIGZvciB0aGUgY29tbW9uIChubyBwcm9maWxpbmcgZW5hYmxlZCkgY2FzZToKKwkgKi8KKwlpZiAodW5saWtlbHkocHJvZl9vbiA9PSB0eXBlKSkKKwkJcHJvZmlsZV9oaXRzKHR5cGUsIGlwLCAxKTsKK30KKwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiB2b2lkIGNyZWF0ZV9wcm9mX2NwdV9tYXNrKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKTsKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9wc3BhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkNDhiOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3BzcGFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfUFNQQUNFX0gKLSNkZWZpbmUgX0xJTlVYX1BTUEFDRV9ICi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BpZC5oPgotCi1zdHJ1Y3QgcGlkbWFwIHsKLSAgICAgICBhdG9taWNfdCBucl9mcmVlOwotICAgICAgIHZvaWQgKnBhZ2U7Ci19OwotCi0jZGVmaW5lIFBJRE1BUF9FTlRSSUVTICAgICAgICAgKChQSURfTUFYX0xJTUlUICsgOCpQQUdFX1NJWkUgLSAxKS9QQUdFX1NJWkUvOCkKLQotc3RydWN0IHBzcGFjZSB7Ci0gICAgICAgc3RydWN0IHBpZG1hcCBwaWRtYXBbUElETUFQX0VOVFJJRVNdOwotICAgICAgIGludCBsYXN0X3BpZDsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgcHNwYWNlIGluaXRfcHNwYWNlOwotCi0jZW5kaWYgLyogX0xJTlVYX1BTUEFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmggYi9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmgKaW5kZXggNTExMDIwMS4uOTBjMjNmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaApAQCAtMzcsNiArMzcsOSBAQAogZXh0ZXJuIGludCBkcXVvdF9jb21taXRfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSk7CiBleHRlcm4gaW50IGRxdW90X21hcmtfZHF1b3RfZGlydHkoc3RydWN0IGRxdW90ICpkcXVvdCk7CiAKK2ludCByZW1vdmVfaW5vZGVfZHF1b3RfcmVmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLAorCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqdG9mcmVlX2hlYWQpOworCiBleHRlcm4gaW50IHZmc19xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwgY2hhciAqcGF0aCk7CiBleHRlcm4gaW50IHZmc19xdW90YV9vbl9tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpxZl9uYW1lLAogCQlpbnQgZm9ybWF0X2lkLCBpbnQgdHlwZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCmluZGV4IDkxNThhNjguLjBkZWI4NDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSBNb21jaGlsIFZlbGlrb3YKICAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMSBDaHJpc3RvcGggSGVsbHdpZworICogQ29weXJpZ2h0IChDKSAyMDA2IE5pY2sgUGlnZ2luCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTE5LDkgKzIwLDM3IEBACiAjaWZuZGVmIF9MSU5VWF9SQURJWF9UUkVFX0gKICNkZWZpbmUgX0xJTlVYX1JBRElYX1RSRUVfSAogCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorCisvKgorICogQSBkaXJlY3QgcG9pbnRlciAocm9vdC0+cm5vZGUgcG9pbnRpbmcgZGlyZWN0bHkgdG8gYSBkYXRhIGl0ZW0sCisgKiByYXRoZXIgdGhhbiBhbm90aGVyIHJhZGl4X3RyZWVfbm9kZSkgaXMgc2lnbmFsbGVkIGJ5IHRoZSBsb3cgYml0CisgKiBzZXQgaW4gdGhlIHJvb3QtPnJub2RlIHBvaW50ZXIuCisgKgorICogSW4gdGhpcyBjYXNlIHJvb3QtPmhlaWdodCBpcyBhbHNvIE5VTEwsIGJ1dCB0aGUgZGlyZWN0IHBvaW50ZXIgdGVzdHMgYXJlCisgKiBuZWVkZWQgZm9yIFJDVSBsb29rdXBzIHdoZW4gcm9vdC0+aGVpZ2h0IGlzIHVucmVsaWFibGUuCisgKi8KKyNkZWZpbmUgUkFESVhfVFJFRV9ESVJFQ1RfUFRSCTEKKworc3RhdGljIGlubGluZSB2b2lkICpyYWRpeF90cmVlX3B0cl90b19kaXJlY3Qodm9pZCAqcHRyKQoreworCXJldHVybiAodm9pZCAqKSgodW5zaWduZWQgbG9uZylwdHIgfCBSQURJWF9UUkVFX0RJUkVDVF9QVFIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnJhZGl4X3RyZWVfZGlyZWN0X3RvX3B0cih2b2lkICpwdHIpCit7CisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXB0ciAmIH5SQURJWF9UUkVFX0RJUkVDVF9QVFIpOworfQorCitzdGF0aWMgaW5saW5lIGludCByYWRpeF90cmVlX2lzX2RpcmVjdF9wdHIodm9pZCAqcHRyKQoreworCXJldHVybiAoaW50KSgodW5zaWduZWQgbG9uZylwdHIgJiBSQURJWF9UUkVFX0RJUkVDVF9QVFIpOworfQorCisvKioqIHJhZGl4LXRyZWUgQVBJIHN0YXJ0cyBoZXJlICoqKi8KIAogI2RlZmluZSBSQURJWF9UUkVFX01BWF9UQUdTIDIKIApAQCAtNDgsNiArNzcsNzcgQEAKIAkocm9vdCktPnJub2RlID0gTlVMTDsJCQkJCQlcCiB9IHdoaWxlICgwKQogCisvKioKKyAqIFJhZGl4LXRyZWUgc3luY2hyb25pemF0aW9uCisgKgorICogVGhlIHJhZGl4LXRyZWUgQVBJIHJlcXVpcmVzIHRoYXQgdXNlcnMgcHJvdmlkZSBhbGwgc3luY2hyb25pc2F0aW9uICh3aXRoCisgKiBzcGVjaWZpYyBleGNlcHRpb25zLCBub3RlZCBiZWxvdykuCisgKgorICogU3luY2hyb25pemF0aW9uIG9mIGFjY2VzcyB0byB0aGUgZGF0YSBpdGVtcyBiZWluZyBzdG9yZWQgaW4gdGhlIHRyZWUsIGFuZAorICogbWFuYWdlbWVudCBvZiB0aGVpciBsaWZldGltZXMgbXVzdCBiZSBjb21wbGV0ZWx5IG1hbmFnZWQgYnkgQVBJIHVzZXJzLgorICoKKyAqIEZvciBBUEkgdXNhZ2UsIGluIGdlbmVyYWwsCisgKiAtIGFueSBmdW5jdGlvbiBfbW9kaWZ5aW5nXyB0aGUgdGhlIHRyZWUgb3IgdGFncyAoaW5zZXJ0aW5nIG9yIGRlbGV0aW5nCisgKiAgIGl0ZW1zLCBzZXR0aW5nIG9yIGNsZWFyaW5nIHRhZ3MgbXVzdCBleGNsdWRlIG90aGVyIG1vZGlmaWNhdGlvbnMsIGFuZAorICogICBleGNsdWRlIGFueSBmdW5jdGlvbnMgcmVhZGluZyB0aGUgdHJlZS4KKyAqIC0gYW55IGZ1bmN0aW9uIF9yZWFkaW5nXyB0aGUgdGhlIHRyZWUgb3IgdGFncyAobG9va2luZyB1cCBpdGVtcyBvciB0YWdzLAorICogICBnYW5nIGxvb2t1cHMpIG11c3QgZXhjbHVkZSBtb2RpZmljYXRpb25zIHRvIHRoZSB0cmVlLCBidXQgbWF5IG9jY3VyCisgKiAgIGNvbmN1cnJlbnRseSB3aXRoIG90aGVyIHJlYWRlcnMuCisgKgorICogVGhlIG5vdGFibGUgZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGUgYXJlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICogcmFkaXhfdHJlZV9sb29rdXAKKyAqIHJhZGl4X3RyZWVfdGFnX2dldAorICogcmFkaXhfdHJlZV9nYW5nX2xvb2t1cAorICogcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWcKKyAqIHJhZGl4X3RyZWVfdGFnZ2VkCisgKgorICogVGhlIGZpcnN0IDQgZnVuY3Rpb25zIGFyZSBhYmxlIHRvIGJlIGNhbGxlZCBsb2NrbGVzc2x5LCB1c2luZyBSQ1UuIFRoZQorICogY2FsbGVyIG11c3QgZW5zdXJlIGNhbGxzIHRvIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbWFkZSB3aXRoaW4gcmN1X3JlYWRfbG9jaygpCisgKiByZWdpb25zLiBPdGhlciByZWFkZXJzIChsb2NrLWZyZWUgb3Igb3RoZXJ3aXNlKSBhbmQgbW9kaWZpY2F0aW9ucyBtYXkgYmUKKyAqIHJ1bm5pbmcgY29uY3VycmVudGx5LgorICoKKyAqIEl0IGlzIHN0aWxsIHJlcXVpcmVkIHRoYXQgdGhlIGNhbGxlciBtYW5hZ2UgdGhlIHN5bmNocm9uaXphdGlvbiBhbmQgbGlmZXRpbWVzCisgKiBvZiB0aGUgaXRlbXMuIFNvIGlmIFJDVSBsb2NrLWZyZWUgbG9va3VwcyBhcmUgdXNlZCwgdHlwaWNhbGx5IHRoaXMgd291bGQgbWVhbgorICogdGhhdCB0aGUgaXRlbXMgaGF2ZSB0aGVpciBvd24gbG9ja3MsIG9yIGFyZSBhbWVuYWJsZSB0byBsb2NrLWZyZWUgYWNjZXNzOyBhbmQKKyAqIHRoYXQgdGhlIGl0ZW1zIGFyZSBmcmVlZCBieSBSQ1UgKG9yIG9ubHkgZnJlZWQgYWZ0ZXIgaGF2aW5nIGJlZW4gZGVsZXRlZCBmcm9tCisgKiB0aGUgcmFkaXggdHJlZSAqYW5kKiBhIHN5bmNocm9uaXplX3JjdSgpIGdyYWNlIHBlcmlvZCkuCisgKgorICogKE5vdGUsIHJjdV9hc3NpZ25fcG9pbnRlciBhbmQgcmN1X2RlcmVmZXJlbmNlIGFyZSBub3QgbmVlZGVkIHRvIGNvbnRyb2wKKyAqIGFjY2VzcyB0byBkYXRhIGl0ZW1zIHdoZW4gaW5zZXJ0aW5nIGludG8gb3IgbG9va2luZyB1cCBmcm9tIHRoZSByYWRpeCB0cmVlKQorICoKKyAqIHJhZGl4X3RyZWVfdGFnZ2VkIGlzIGFibGUgdG8gYmUgY2FsbGVkIHdpdGhvdXQgbG9ja2luZyBvciBSQ1UuCisgKi8KKworLyoqCisgKiByYWRpeF90cmVlX2RlcmVmX3Nsb3QJLSBkZXJlZmVyZW5jZSBhIHNsb3QKKyAqIEBwc2xvdDoJcG9pbnRlciB0byBzbG90LCByZXR1cm5lZCBieSByYWRpeF90cmVlX2xvb2t1cF9zbG90CisgKiBSZXR1cm5zOglpdGVtIHRoYXQgd2FzIHN0b3JlZCBpbiB0aGF0IHNsb3Qgd2l0aCBhbnkgZGlyZWN0IHBvaW50ZXIgZmxhZworICoJCXJlbW92ZWQuCisgKgorICogRm9yIHVzZSB3aXRoIHJhZGl4X3RyZWVfbG9va3VwX3Nsb3QoKS4gIENhbGxlciBtdXN0IGhvbGQgdHJlZSBhdCBsZWFzdCByZWFkCisgKiBsb2NrZWQgYWNyb3NzIHNsb3QgbG9va3VwIGFuZCBkZXJlZmVyZW5jZS4gIE1vcmUgbGlrZWx5LCB3aWxsIGJlIHVzZWQgd2l0aAorICogcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3QoKSwgYXMgd2VsbCwgc28gY2FsbGVyIHdpbGwgaG9sZCB0cmVlIHdyaXRlIGxvY2tlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpyYWRpeF90cmVlX2RlcmVmX3Nsb3Qodm9pZCAqKnBzbG90KQoreworCXJldHVybiByYWRpeF90cmVlX2RpcmVjdF90b19wdHIoKnBzbG90KTsKK30KKy8qKgorICogcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3QJLSByZXBsYWNlIGl0ZW0gaW4gYSBzbG90CisgKiBAcHNsb3Q6CXBvaW50ZXIgdG8gc2xvdCwgcmV0dXJuZWQgYnkgcmFkaXhfdHJlZV9sb29rdXBfc2xvdAorICogQGl0ZW06CW5ldyBpdGVtIHRvIHN0b3JlIGluIHRoZSBzbG90LgorICoKKyAqIEZvciB1c2Ugd2l0aCByYWRpeF90cmVlX2xvb2t1cF9zbG90KCkuICBDYWxsZXIgbXVzdCBob2xkIHRyZWUgd3JpdGUgbG9ja2VkCisgKiBhY3Jvc3Mgc2xvdCBsb29rdXAgYW5kIHJlcGxhY2VtZW50LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3Qodm9pZCAqKnBzbG90LCB2b2lkICppdGVtKQoreworCUJVR19PTihyYWRpeF90cmVlX2lzX2RpcmVjdF9wdHIoaXRlbSkpOworCXJjdV9hc3NpZ25fcG9pbnRlcigqcHNsb3QsCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWl0ZW0gfAorCQkJKCh1bnNpZ25lZCBsb25nKSpwc2xvdCAmIFJBRElYX1RSRUVfRElSRUNUX1BUUikpKTsKK30KKwogaW50IHJhZGl4X3RyZWVfaW5zZXJ0KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKIHZvaWQgKnJhZGl4X3RyZWVfbG9va3VwKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkICoqcmFkaXhfdHJlZV9sb29rdXBfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICosIHVuc2lnbmVkIGxvbmcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCmluZGV4IDg0ZDg4NzcuLmViZDQyYTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKQEAgLTE0NiwxNiArMTQ2LDE2IEBACiAKIC8qIHRoZSBzdXBlcmJsb2NrIGF0IHRoZSBmcm9udCBvZiB0aGUgYml0bWFwIGZpbGUgLS0gbGl0dGxlIGVuZGlhbiAqLwogdHlwZWRlZiBzdHJ1Y3QgYml0bWFwX3N1cGVyX3MgewotCV9fdTMyIG1hZ2ljOyAgICAgICAgLyogIDAgIEJJVE1BUF9NQUdJQyAqLwotCV9fdTMyIHZlcnNpb247ICAgICAgLyogIDQgIHRoZSBiaXRtYXAgbWFqb3IgZm9yIG5vdywgY291bGQgY2hhbmdlLi4uICovCi0JX191OCAgdXVpZFsxNl07ICAgICAvKiAgOCAgMTI4IGJpdCB1dWlkIC0gbXVzdCBtYXRjaCBtZCBkZXZpY2UgdXVpZCAqLwotCV9fdTY0IGV2ZW50czsgICAgICAgLyogMjQgIGV2ZW50IGNvdW50ZXIgZm9yIHRoZSBiaXRtYXAgKDEpKi8KLQlfX3U2NCBldmVudHNfY2xlYXJlZDsvKjMyICBldmVudCBjb3VudGVyIHdoZW4gbGFzdCBiaXQgY2xlYXJlZCAoMikgKi8KLQlfX3U2NCBzeW5jX3NpemU7ICAgIC8qIDQwICB0aGUgc2l6ZSBvZiB0aGUgbWQgZGV2aWNlJ3Mgc3luYyByYW5nZSgzKSAqLwotCV9fdTMyIHN0YXRlOyAgICAgICAgLyogNDggIGJpdG1hcCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotCV9fdTMyIGNodW5rc2l6ZTsgICAgLyogNTIgIHRoZSBiaXRtYXAgY2h1bmsgc2l6ZSBpbiBieXRlcyAqLwotCV9fdTMyIGRhZW1vbl9zbGVlcDsgLyogNTYgIHNlY29uZHMgYmV0d2VlbiBkaXNrIGZsdXNoZXMgKi8KLQlfX3UzMiB3cml0ZV9iZWhpbmQ7IC8qIDYwICBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgd3JpdGUtYmVoaW5kIHdyaXRlcyAqLworCV9fbGUzMiBtYWdpYzsgICAgICAgIC8qICAwICBCSVRNQVBfTUFHSUMgKi8KKwlfX2xlMzIgdmVyc2lvbjsgICAgICAvKiAgNCAgdGhlIGJpdG1hcCBtYWpvciBmb3Igbm93LCBjb3VsZCBjaGFuZ2UuLi4gKi8KKwlfX3U4ICB1dWlkWzE2XTsgICAgICAvKiAgOCAgMTI4IGJpdCB1dWlkIC0gbXVzdCBtYXRjaCBtZCBkZXZpY2UgdXVpZCAqLworCV9fbGU2NCBldmVudHM7ICAgICAgIC8qIDI0ICBldmVudCBjb3VudGVyIGZvciB0aGUgYml0bWFwICgxKSovCisJX19sZTY0IGV2ZW50c19jbGVhcmVkOy8qMzIgIGV2ZW50IGNvdW50ZXIgd2hlbiBsYXN0IGJpdCBjbGVhcmVkICgyKSAqLworCV9fbGU2NCBzeW5jX3NpemU7ICAgIC8qIDQwICB0aGUgc2l6ZSBvZiB0aGUgbWQgZGV2aWNlJ3Mgc3luYyByYW5nZSgzKSAqLworCV9fbGUzMiBzdGF0ZTsgICAgICAgIC8qIDQ4ICBiaXRtYXAgc3RhdGUgaW5mb3JtYXRpb24gKi8KKwlfX2xlMzIgY2h1bmtzaXplOyAgICAvKiA1MiAgdGhlIGJpdG1hcCBjaHVuayBzaXplIGluIGJ5dGVzICovCisJX19sZTMyIGRhZW1vbl9zbGVlcDsgLyogNTYgIHNlY29uZHMgYmV0d2VlbiBkaXNrIGZsdXNoZXMgKi8KKwlfX2xlMzIgd3JpdGVfYmVoaW5kOyAvKiA2MCAgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHdyaXRlLWJlaGluZCB3cml0ZXMgKi8KIAogCV9fdTggIHBhZFsyNTYgLSA2NF07IC8qIHNldCB0byB6ZXJvICovCiB9IGJpdG1hcF9zdXBlcl90OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmgKaW5kZXggYjZlYmM2OS4uM2YyY2Q5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCkBAIC0yMDYsNTIgKzIwNiw1MiBAQAogICovCiBzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfMSB7CiAJLyogY29uc3RhbnQgYXJyYXkgaW5mb3JtYXRpb24gLSAxMjggYnl0ZXMgKi8KLQlfX3UzMgltYWdpYzsJCS8qIE1EX1NCX01BR0lDOiAweGE5MmI0ZWZjIC0gbGl0dGxlIGVuZGlhbiAqLwotCV9fdTMyCW1ham9yX3ZlcnNpb247CS8qIDEgKi8KLQlfX3UzMglmZWF0dXJlX21hcDsJLyogYml0IDAgc2V0IGlmICdiaXRtYXBfb2Zmc2V0JyBpcyBtZWFuaW5nZnVsICovCi0JX191MzIJcGFkMDsJCS8qIGFsd2F5cyBzZXQgdG8gMCB3aGVuIHdyaXRpbmcgKi8KKwlfX2xlMzIJbWFnaWM7CQkvKiBNRF9TQl9NQUdJQzogMHhhOTJiNGVmYyAtIGxpdHRsZSBlbmRpYW4gKi8KKwlfX2xlMzIJbWFqb3JfdmVyc2lvbjsJLyogMSAqLworCV9fbGUzMglmZWF0dXJlX21hcDsJLyogYml0IDAgc2V0IGlmICdiaXRtYXBfb2Zmc2V0JyBpcyBtZWFuaW5nZnVsICovCisJX19sZTMyCXBhZDA7CQkvKiBhbHdheXMgc2V0IHRvIDAgd2hlbiB3cml0aW5nICovCiAKIAlfX3U4CXNldF91dWlkWzE2XTsJLyogdXNlci1zcGFjZSBnZW5lcmF0ZWQuICovCiAJY2hhcglzZXRfbmFtZVszMl07CS8qIHNldCBhbmQgaW50ZXJwcmV0ZWQgYnkgdXNlci1zcGFjZSAqLwogCi0JX191NjQJY3RpbWU7CQkvKiBsbyA0MCBiaXRzIGFyZSBzZWNvbmRzLCB0b3AgMjQgYXJlIG1pY3Jvc2Vjb25kcyBvciAwKi8KLQlfX3UzMglsZXZlbDsJCS8qIC00IChtdWx0aXBhdGgpLCAtMSAobGluZWFyKSwgMCwxLDQsNSAqLwotCV9fdTMyCWxheW91dDsJCS8qIG9ubHkgZm9yIHJhaWQ1IGFuZCByYWlkMTAgY3VycmVudGx5ICovCi0JX191NjQJc2l6ZTsJCS8qIHVzZWQgc2l6ZSBvZiBjb21wb25lbnQgZGV2aWNlcywgaW4gNTEyYnl0ZSBzZWN0b3JzICovCisJX19sZTY0CWN0aW1lOwkJLyogbG8gNDAgYml0cyBhcmUgc2Vjb25kcywgdG9wIDI0IGFyZSBtaWNyb3NlY29uZHMgb3IgMCovCisJX19sZTMyCWxldmVsOwkJLyogLTQgKG11bHRpcGF0aCksIC0xIChsaW5lYXIpLCAwLDEsNCw1ICovCisJX19sZTMyCWxheW91dDsJCS8qIG9ubHkgZm9yIHJhaWQ1IGFuZCByYWlkMTAgY3VycmVudGx5ICovCisJX19sZTY0CXNpemU7CQkvKiB1c2VkIHNpemUgb2YgY29tcG9uZW50IGRldmljZXMsIGluIDUxMmJ5dGUgc2VjdG9ycyAqLwogCi0JX191MzIJY2h1bmtzaXplOwkvKiBpbiA1MTJieXRlIHNlY3RvcnMgKi8KLQlfX3UzMglyYWlkX2Rpc2tzOwotCV9fdTMyCWJpdG1hcF9vZmZzZXQ7CS8qIHNlY3RvcnMgYWZ0ZXIgc3RhcnQgb2Ygc3VwZXJibG9jayB0aGF0IGJpdG1hcCBzdGFydHMKKwlfX2xlMzIJY2h1bmtzaXplOwkvKiBpbiA1MTJieXRlIHNlY3RvcnMgKi8KKwlfX2xlMzIJcmFpZF9kaXNrczsKKwlfX2xlMzIJYml0bWFwX29mZnNldDsJLyogc2VjdG9ycyBhZnRlciBzdGFydCBvZiBzdXBlcmJsb2NrIHRoYXQgYml0bWFwIHN0YXJ0cwogCQkJCSAqIE5PVEU6IHNpZ25lZCwgc28gYml0bWFwIGNhbiBiZSBiZWZvcmUgc3VwZXJibG9jawogCQkJCSAqIG9ubHkgbWVhbmluZ2Z1bCBvZiBmZWF0dXJlX21hcFswXSBpcyBzZXQuCiAJCQkJICovCiAKIAkvKiBUaGVzZSBhcmUgb25seSB2YWxpZCB3aXRoIGZlYXR1cmUgYml0ICc0JyAqLwotCV9fdTMyCW5ld19sZXZlbDsJLyogbmV3IGxldmVsIHdlIGFyZSByZXNoYXBpbmcgdG8JCSovCi0JX191NjQJcmVzaGFwZV9wb3NpdGlvbjsJLyogbmV4dCBhZGRyZXNzIGluIGFycmF5LXNwYWNlIGZvciByZXNoYXBlICovCi0JX191MzIJZGVsdGFfZGlza3M7CS8qIGNoYW5nZSBpbiBudW1iZXIgb2YgcmFpZF9kaXNrcwkJKi8KLQlfX3UzMgluZXdfbGF5b3V0OwkvKiBuZXcgbGF5b3V0CQkJCQkqLwotCV9fdTMyCW5ld19jaHVuazsJLyogbmV3IGNodW5rIHNpemUgKGJ5dGVzKQkJCSovCisJX19sZTMyCW5ld19sZXZlbDsJLyogbmV3IGxldmVsIHdlIGFyZSByZXNoYXBpbmcgdG8JCSovCisJX19sZTY0CXJlc2hhcGVfcG9zaXRpb247CS8qIG5leHQgYWRkcmVzcyBpbiBhcnJheS1zcGFjZSBmb3IgcmVzaGFwZSAqLworCV9fbGUzMglkZWx0YV9kaXNrczsJLyogY2hhbmdlIGluIG51bWJlciBvZiByYWlkX2Rpc2tzCQkqLworCV9fbGUzMgluZXdfbGF5b3V0OwkvKiBuZXcgbGF5b3V0CQkJCQkqLworCV9fbGUzMgluZXdfY2h1bms7CS8qIG5ldyBjaHVuayBzaXplIChieXRlcykJCQkqLwogCV9fdTgJcGFkMVsxMjgtMTI0XTsJLyogc2V0IHRvIDAgd2hlbiB3cml0dGVuICovCiAKIAkvKiBjb25zdGFudCB0aGlzLWRldmljZSBpbmZvcm1hdGlvbiAtIDY0IGJ5dGVzICovCi0JX191NjQJZGF0YV9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiBkYXRhLCBvZnRlbiAwICovCi0JX191NjQJZGF0YV9zaXplOwkvKiBzZWN0b3JzIGluIHRoaXMgZGV2aWNlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRhdGEgKi8KLQlfX3U2NAlzdXBlcl9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiB0aGlzIHN1cGVyYmxvY2sgKi8KLQlfX3U2NAlyZWNvdmVyeV9vZmZzZXQ7Lyogc2VjdG9ycyBiZWZvcmUgdGhpcyBvZmZzZXQgKGZyb20gZGF0YV9vZmZzZXQpIGhhdmUgYmVlbiByZWNvdmVyZWQgKi8KLQlfX3UzMglkZXZfbnVtYmVyOwkvKiBwZXJtYW5lbnQgaWRlbnRpZmllciBvZiB0aGlzICBkZXZpY2UgLSBub3Qgcm9sZSBpbiByYWlkICovCi0JX191MzIJY250X2NvcnJlY3RlZF9yZWFkOyAvKiBudW1iZXIgb2YgcmVhZCBlcnJvcnMgdGhhdCB3ZXJlIGNvcnJlY3RlZCBieSByZS13cml0aW5nICovCisJX19sZTY0CWRhdGFfb2Zmc2V0OwkvKiBzZWN0b3Igc3RhcnQgb2YgZGF0YSwgb2Z0ZW4gMCAqLworCV9fbGU2NAlkYXRhX3NpemU7CS8qIHNlY3RvcnMgaW4gdGhpcyBkZXZpY2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGF0YSAqLworCV9fbGU2NAlzdXBlcl9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiB0aGlzIHN1cGVyYmxvY2sgKi8KKwlfX2xlNjQJcmVjb3Zlcnlfb2Zmc2V0Oy8qIHNlY3RvcnMgYmVmb3JlIHRoaXMgb2Zmc2V0IChmcm9tIGRhdGFfb2Zmc2V0KSBoYXZlIGJlZW4gcmVjb3ZlcmVkICovCisJX19sZTMyCWRldl9udW1iZXI7CS8qIHBlcm1hbmVudCBpZGVudGlmaWVyIG9mIHRoaXMgIGRldmljZSAtIG5vdCByb2xlIGluIHJhaWQgKi8KKwlfX2xlMzIJY250X2NvcnJlY3RlZF9yZWFkOyAvKiBudW1iZXIgb2YgcmVhZCBlcnJvcnMgdGhhdCB3ZXJlIGNvcnJlY3RlZCBieSByZS13cml0aW5nICovCiAJX191OAlkZXZpY2VfdXVpZFsxNl07IC8qIHVzZXItc3BhY2Ugc2V0YWJsZSwgaWdub3JlZCBieSBrZXJuZWwgKi8KIAlfX3U4CWRldmZsYWdzOwkvKiBwZXItZGV2aWNlIGZsYWdzLiAgT25seSBvbmUgZGVmaW5lZC4uLiovCiAjZGVmaW5lCVdyaXRlTW9zdGx5MQkxCS8qIG1hc2sgZm9yIHdyaXRlbW9zdGx5IGZsYWcgaW4gYWJvdmUgKi8KIAlfX3U4CXBhZDJbNjQtNTddOwkvKiBzZXQgdG8gMCB3aGVuIHdyaXRpbmcgKi8KIAogCS8qIGFycmF5IHN0YXRlIGluZm9ybWF0aW9uIC0gNjQgYnl0ZXMgKi8KLQlfX3U2NAl1dGltZTsJCS8qIDQwIGJpdHMgc2Vjb25kLCAyNCBidGVzIG1pY3Jvc2Vjb25kcyAqLwotCV9fdTY0CWV2ZW50czsJCS8qIGluY3JlbWVudGVkIHdoZW4gc3VwZXJibG9jayB1cGRhdGVkICovCi0JX191NjQJcmVzeW5jX29mZnNldDsJLyogZGF0YSBiZWZvcmUgdGhpcyBvZmZzZXQgKGZyb20gZGF0YV9vZmZzZXQpIGtub3duIHRvIGJlIGluIHN5bmMgKi8KLQlfX3UzMglzYl9jc3VtOwkvKiBjaGVja3N1bSB1cHRvIGRldnNbbWF4X2Rldl0gKi8KLQlfX3UzMgltYXhfZGV2OwkvKiBzaXplIG9mIGRldnNbXSBhcnJheSB0byBjb25zaWRlciAqLworCV9fbGU2NAl1dGltZTsJCS8qIDQwIGJpdHMgc2Vjb25kLCAyNCBidGVzIG1pY3Jvc2Vjb25kcyAqLworCV9fbGU2NAlldmVudHM7CQkvKiBpbmNyZW1lbnRlZCB3aGVuIHN1cGVyYmxvY2sgdXBkYXRlZCAqLworCV9fbGU2NAlyZXN5bmNfb2Zmc2V0OwkvKiBkYXRhIGJlZm9yZSB0aGlzIG9mZnNldCAoZnJvbSBkYXRhX29mZnNldCkga25vd24gdG8gYmUgaW4gc3luYyAqLworCV9fbGUzMglzYl9jc3VtOwkvKiBjaGVja3N1bSB1cHRvIGRldnNbbWF4X2Rldl0gKi8KKwlfX2xlMzIJbWF4X2RldjsJLyogc2l6ZSBvZiBkZXZzW10gYXJyYXkgdG8gY29uc2lkZXIgKi8KIAlfX3U4CXBhZDNbNjQtMzJdOwkvKiBzZXQgdG8gMCB3aGVuIHdyaXRpbmcgKi8KIAogCS8qIGRldmljZSBzdGF0ZSBpbmZvcm1hdGlvbi4gSW5kZXhlZCBieSBkZXZfbnVtYmVyLgpAQCAtMjYwLDcgKzI2MCw3IEBACiAJICogaW50byB0aGUgJ3JvbGVzJyB2YWx1ZS4gIElmIGEgZGV2aWNlIGlzIHNwYXJlIG9yIGZhdWx0eSwgdGhlbiBpdCBkb2Vzbid0CiAJICogaGF2ZSBhIG1lYW5pbmdmdWwgcm9sZS4KIAkgKi8KLQlfX3UxNglkZXZfcm9sZXNbMF07CS8qIHJvbGUgaW4gYXJyYXksIG9yIDB4ZmZmZiBmb3IgYSBzcGFyZSwgb3IgMHhmZmZlIGZvciBmYXVsdHkgKi8KKwlfX2xlMTYJZGV2X3JvbGVzWzBdOwkvKiByb2xlIGluIGFycmF5LCBvciAweGZmZmYgZm9yIGEgc3BhcmUsIG9yIDB4ZmZmZSBmb3IgZmF1bHR5ICovCiB9OwogCiAvKiBmZWF0dXJlX21hcCBiaXRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDUuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkNS5oCmluZGV4IGYxMzI5OWEuLmQ4Mjg2ZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkNS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9yYWlkNS5oCkBAIC0yMjcsNyArMjI3LDEwIEBACiAJc3RydWN0IGxpc3RfaGVhZAloYW5kbGVfbGlzdDsgLyogc3RyaXBlcyBuZWVkaW5nIGhhbmRsaW5nICovCiAJc3RydWN0IGxpc3RfaGVhZAlkZWxheWVkX2xpc3Q7IC8qIHN0cmlwZXMgdGhhdCBoYXZlIHBsdWdnZWQgcmVxdWVzdHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWJpdG1hcF9saXN0OyAvKiBzdHJpcGVzIGRlbGF5aW5nIGF3YWl0aW5nIGJpdG1hcCB1cGRhdGUgKi8KKwlzdHJ1Y3QgYmlvCQkqcmV0cnlfcmVhZF9hbGlnbmVkOyAvKiBjdXJyZW50bHkgcmV0cnlpbmcgYWxpZ25lZCBiaW9zICAgKi8KKwlzdHJ1Y3QgYmlvCQkqcmV0cnlfcmVhZF9hbGlnbmVkX2xpc3Q7IC8qIGFsaWduZWQgYmlvcyByZXRyeSBsaXN0ICAqLwogCWF0b21pY190CQlwcmVyZWFkX2FjdGl2ZV9zdHJpcGVzOyAvKiBzdHJpcGVzIHdpdGggc2NoZWR1bGVkIGlvICovCisJYXRvbWljX3QJCWFjdGl2ZV9hbGlnbmVkX3JlYWRzOwogCiAJYXRvbWljX3QJCXJlc2hhcGVfc3RyaXBlczsgLyogc3RyaXBlcyB3aXRoIHBlbmRpbmcgd3JpdGVzIGZvciByZXNoYXBlICovCiAJLyogdW5mb3J0dW5hdGVseSB3ZSBuZWVkIHR3byBjYWNoZSBuYW1lcyBhcyB3ZSB0ZW1wb3JhcmlseSBoYXZlCkBAIC0yMzUsNyArMjM4LDcgQEAKIAkgKi8KIAlpbnQJCQlhY3RpdmVfbmFtZTsKIAljaGFyCQkJY2FjaGVfbmFtZVsyXVsyMF07Ci0Ja21lbV9jYWNoZV90CQkqc2xhYl9jYWNoZTsgLyogZm9yIGFsbG9jYXRpbmcgc3RyaXBlcyAqLworCXN0cnVjdCBrbWVtX2NhY2hlCQkqc2xhYl9jYWNoZTsgLyogZm9yIGFsbG9jYXRpbmcgc3RyaXBlcyAqLwogCiAJaW50CQkJc2VxX2ZsdXNoLCBzZXFfd3JpdGU7CiAJaW50CQkJcXVpZXNjZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFuZG9tLmggYi9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCmluZGV4IDVkNjQ1NmIuLjAxYWQ3MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYW5kb20uaApAQCAtNTEsMTYgKzUxLDE2IEBACiBleHRlcm4gdm9pZCBnZXRfcmFuZG9tX2J5dGVzKHZvaWQgKmJ1ZiwgaW50IG5ieXRlcyk7CiB2b2lkIGdlbmVyYXRlX3JhbmRvbV91dWlkKHVuc2lnbmVkIGNoYXIgdXVpZF9vdXRbMTZdKTsKIAotZXh0ZXJuIF9fdTMyIHNlY3VyZV9pcF9pZChfX3UzMiBkYWRkcik7Ci1leHRlcm4gdTMyIHNlY3VyZV9pcHY0X3BvcnRfZXBoZW1lcmFsKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwgX191MTYgZHBvcnQpOwotZXh0ZXJuIHUzMiBzZWN1cmVfaXB2Nl9wb3J0X2VwaGVtZXJhbChjb25zdCBfX3UzMiAqc2FkZHIsIGNvbnN0IF9fdTMyICpkYWRkciwgCi0JCQkJICAgICAgX191MTYgZHBvcnQpOwotZXh0ZXJuIF9fdTMyIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKLQkJCQkJX191MTYgc3BvcnQsIF9fdTE2IGRwb3J0KTsKLWV4dGVybiBfX3UzMiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKF9fdTMyICpzYWRkciwgX191MzIgKmRhZGRyLAotCQkJCQkgIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCk7Ci1leHRlcm4gdTY0IHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCi0JCQkJICAgICAgIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCk7CitleHRlcm4gX191MzIgc2VjdXJlX2lwX2lkKF9fYmUzMiBkYWRkcik7CitleHRlcm4gdTMyIHNlY3VyZV9pcHY0X3BvcnRfZXBoZW1lcmFsKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQpOworZXh0ZXJuIHUzMiBzZWN1cmVfaXB2Nl9wb3J0X2VwaGVtZXJhbChjb25zdCBfX2JlMzIgKnNhZGRyLCBjb25zdCBfX2JlMzIgKmRhZGRyLAorCQkJCSAgICAgIF9fYmUxNiBkcG9ydCk7CitleHRlcm4gX191MzIgc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJCV9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0KTsKK2V4dGVybiBfX3UzMiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKF9fYmUzMiAqc2FkZHIsIF9fYmUzMiAqZGFkZHIsCisJCQkJCSAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQpOworZXh0ZXJuIHU2NCBzZWN1cmVfZGNjcF9zZXF1ZW5jZV9udW1iZXIoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJICAgICAgIF9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0KTsKIAogI2lmbmRlZiBNT0RVTEUKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbmRvbV9mb3BzLCB1cmFuZG9tX2ZvcHM7CkBAIC02OSw2ICs2OSw5IEBACiB1bnNpZ25lZCBpbnQgZ2V0X3JhbmRvbV9pbnQodm9pZCk7CiB1bnNpZ25lZCBsb25nIHJhbmRvbWl6ZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBsZW4pOwogCit1MzIgcmFuZG9tMzIodm9pZCk7Cit2b2lkIHNyYW5kb20zMih1MzIgc2VlZCk7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX1JBTkRPTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlY2lwcm9jYWxfZGl2LmggYi9pbmNsdWRlL2xpbnV4L3JlY2lwcm9jYWxfZGl2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljOTBiMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcmVjaXByb2NhbF9kaXYuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9MSU5VWF9SRUNJUFJPQ0FMX0RJVl9ICisjZGVmaW5lIF9MSU5VWF9SRUNJUFJPQ0FMX0RJVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVGhpcyBmaWxlIGRlc2NyaWJlcyByZWNpcHJvY2ljYWwgZGl2aXNpb24uCisgKgorICogVGhpcyBvcHRpbWl6ZXMgdGhlIChBL0IpIHByb2JsZW0sIHdoZW4gQSBhbmQgQiBhcmUgdHdvIHUzMgorICogYW5kIEIgaXMgYSBrbm93biB2YWx1ZSAoYnV0IG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUpCisgKgorICogVGhlIG1hdGggcHJpbmNpcGxlIHVzZWQgaXMgOgorICogICBMZXQgUkVDSVBST0NBTF9WQUxVRShCKSBiZSAoKCgxTEwgPDwgMzIpICsgKEIgLSAxKSkvIEIpCisgKiAgIFRoZW4gQSAvIEIgPSAodTMyKSgoKHU2NCkoQSkgKiAoUikpID4+IDMyKQorICoKKyAqIFRoaXMgcmVwbGFjZXMgYSBkaXZpZGUgYnkgYSBtdWx0aXBseSAoYW5kIGEgc2hpZnQpLCBhbmQKKyAqIGlzIGdlbmVyYWxseSBsZXNzIGV4cGVuc2l2ZSBpbiBDUFUgY3ljbGVzLgorICovCisKKy8qCisgKiBDb21wdXRlcyB0aGUgcmVjaXByb2NhbCB2YWx1ZSAoUikgZm9yIHRoZSB2YWx1ZSBCIG9mIHRoZSBkaXZpc29yLgorICogU2hvdWxkIG5vdCBiZSBjYWxsZWQgYmVmb3JlIGVhY2ggcmVjaXByb2NhbF9kaXZpZGUoKSwKKyAqIG9yIGVsc2UgdGhlIHBlcmZvcm1hbmNlIGlzIHNsb3dlciB0aGFuIGEgbm9ybWFsIGRpdmlkZS4KKyAqLworZXh0ZXJuIHUzMiByZWNpcHJvY2FsX3ZhbHVlKHUzMiBCKTsKKworCitzdGF0aWMgaW5saW5lIHUzMiByZWNpcHJvY2FsX2RpdmlkZSh1MzIgQSwgdTMyIFIpCit7CisJcmV0dXJuICh1MzIpKCgodTY0KUEgKiBSKSA+PiAzMik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAppbmRleCA3YmM2YmZiLi5jM2ZjNmNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCkBAIC03MzksNyArNzM5LDcgQEAKICNkZWZpbmUgUFVUX0JfRlJFRV9TUEFDRShwX3NfYmgsdmFsKSAgZG8geyBzZXRfYmxraF9mcmVlX3NwYWNlKEJfQkxLX0hFQUQocF9zX2JoKSx2YWwpOyB9IHdoaWxlICgwKQogCiAvKiBHZXQgcmlnaHQgZGVsaW1pdGluZyBrZXkuIC0tIGxpdHRsZSBlbmRpYW4gKi8KLSNkZWZpbmUgQl9QUklHSFRfREVMSU1fS0VZKHBfc19iaCkgICAoJihibGtfcmlnaHRfZGVsaW1fa2V5KEJfQkxLX0hFQUQocF9zX2JoKSkKKyNkZWZpbmUgQl9QUklHSFRfREVMSU1fS0VZKHBfc19iaCkgICAoJihibGtfcmlnaHRfZGVsaW1fa2V5KEJfQkxLX0hFQUQocF9zX2JoKSkpKQogCiAvKiBEb2VzIHRoZSBidWZmZXIgY29udGFpbiBhIGRpc2sgbGVhZi4gKi8KICNkZWZpbmUgQl9JU19JVEVNU19MRVZFTChwX3NfYmgpICAgICAoQl9MRVZFTChwX3NfYmgpID09IERJU0tfTEVBRl9OT0RFX0xFVkVMKQpAQCAtMTE1OSw3ICsxMTU5LDcgQEAKICNkZWZpbmUgUEFUSF9SRUFEQQkweDEJLyogZG8gcmVhZCBhaGVhZCAqLwogI2RlZmluZSBQQVRIX1JFQURBX0JBQ0sgMHgyCS8qIHJlYWQgYmFja3dhcmRzICovCiAKLXN0cnVjdCBwYXRoIHsKK3N0cnVjdCB0cmVlcGF0aCB7CiAJaW50IHBhdGhfbGVuZ3RoOwkvKiBMZW5ndGggb2YgdGhlIGFycmF5IGFib3ZlLiAgICovCiAJaW50IHJlYWRhOwogCXN0cnVjdCBwYXRoX2VsZW1lbnQgcGF0aF9lbGVtZW50c1tFWFRFTkRFRF9NQVhfSEVJR0hUXTsJLyogQXJyYXkgb2YgdGhlIHBhdGggZWxlbWVudHMuICAqLwpAQCAtMTE2OSw3ICsxMTY5LDcgQEAKICNkZWZpbmUgcG9zX2luX2l0ZW0ocGF0aCkgKChwYXRoKS0+cG9zX2luX2l0ZW0pCiAKICNkZWZpbmUgSU5JVElBTElaRV9QQVRIKHZhcikgXAotc3RydWN0IHBhdGggdmFyID0gey5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwgLnJlYWRhID0gMCx9CitzdHJ1Y3QgdHJlZXBhdGggdmFyID0gey5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwgLnJlYWRhID0gMCx9CiAKIC8qIEdldCBwYXRoIGVsZW1lbnQgYnkgcGF0aCBhbmQgcGF0aCBwb3NpdGlvbi4gKi8KICNkZWZpbmUgUEFUSF9PRkZTRVRfUEVMRU1FTlQocF9zX3BhdGgsbl9vZmZzZXQpICAoKHBfc19wYXRoKS0+cGF0aF9lbGVtZW50cyArKG5fb2Zmc2V0KSkKQEAgLTEzMjcsNyArMTMyNyw3IEBACiAJaW50IG5lZWRfYmFsYW5jZV9kaXJ0eTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnRiX3NiOwogCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRyYW5zYWN0aW9uX2hhbmRsZTsKLQlzdHJ1Y3QgcGF0aCAqdGJfcGF0aDsKKwlzdHJ1Y3QgdHJlZXBhdGggKnRiX3BhdGg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpMW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBsZWZ0IG5laWdoYm9ycyBvZiBub2RlcyBpbiB0aGUgcGF0aCAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqUltNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgcmlnaHQgbmVpZ2hib3JzIG9mIG5vZGVzIGluIHRoZSBwYXRoICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpGTFtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgZmF0aGVycyBvZiB0aGUgbGVmdCAgbmVpZ2hib3JzICAgICAgKi8KQEAgLTE3OTMsNDEgKzE3OTMsNDEgQEAKIAltZW1jcHkodG8sIGZyb20sIEtFWV9TSVpFKTsKIH0KIAotaW50IGNvbXBfaXRlbXMoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgpOwotY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZ2V0X3JrZXkoY29uc3Qgc3RydWN0IHBhdGggKnBfc19jaGtfcGF0aCwKK2ludCBjb21wX2l0ZW1zKGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKnN0b3JlZF9paCwgY29uc3Qgc3RydWN0IHRyZWVwYXRoICpwX3NfcGF0aCk7Citjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpnZXRfcmtleShjb25zdCBzdHJ1Y3QgdHJlZXBhdGggKnBfc19jaGtfcGF0aCwKIAkJCQkgICAgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpOwogaW50IHNlYXJjaF9ieV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICosCi0JCSAgc3RydWN0IHBhdGggKiwgaW50KTsKKwkJICBzdHJ1Y3QgdHJlZXBhdGggKiwgaW50KTsKICNkZWZpbmUgc2VhcmNoX2l0ZW0ocyxrZXkscGF0aCkgc2VhcmNoX2J5X2tleSAocywga2V5LCBwYXRoLCBESVNLX0xFQUZfTk9ERV9MRVZFTCkKIGludCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqcF9zX2NwdV9rZXksCi0JCQkgICAgICAgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCk7CisJCQkgICAgICAgc3RydWN0IHRyZWVwYXRoICpwX3Nfc2VhcmNoX3BhdGgpOwogZXh0ZXJuIHZvaWQgZGVjcmVtZW50X2Jjb3VudChzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaCk7Ci12b2lkIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgpOwotdm9pZCBwYXRocmVsc2Uoc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCk7Ci1pbnQgcmVpc2VyZnNfY2hlY2tfcGF0aChzdHJ1Y3QgcGF0aCAqcCk7Ci12b2lkIHBhdGhyZWxzZV9hbmRfcmVzdG9yZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgpOwordm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChzdHJ1Y3QgdHJlZXBhdGggKnBfc19zZWFyY2hfcGF0aCk7Cit2b2lkIHBhdGhyZWxzZShzdHJ1Y3QgdHJlZXBhdGggKnBfc19zZWFyY2hfcGF0aCk7CitpbnQgcmVpc2VyZnNfY2hlY2tfcGF0aChzdHJ1Y3QgdHJlZXBhdGggKnApOwordm9pZCBwYXRocmVsc2VfYW5kX3Jlc3RvcmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgdHJlZXBhdGggKnBfc19zZWFyY2hfcGF0aCk7CiAKIGludCByZWlzZXJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCSBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCSBzdHJ1Y3QgdHJlZXBhdGggKnBhdGgsCiAJCQkgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKIAkJCSBzdHJ1Y3QgaXRlbV9oZWFkICppaCwKIAkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpib2R5KTsKIAogaW50IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCSAgICAgc3RydWN0IHBhdGggKnBhdGgsCisJCQkgICAgIHN0cnVjdCB0cmVlcGF0aCAqcGF0aCwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKIAkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgY29uc3QgY2hhciAqYm9keSwgaW50IHBhc3RlX3NpemUpOwogCiBpbnQgcmVpc2VyZnNfY3V0X2Zyb21faXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCSAgIHN0cnVjdCBwYXRoICpwYXRoLAorCQkJICAgc3RydWN0IHRyZWVwYXRoICpwYXRoLAogCQkJICAgc3RydWN0IGNwdV9rZXkgKmtleSwKIAkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9mZl90IG5ld19maWxlX3NpemUpOwogCiBpbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgc3RydWN0IHBhdGggKnBhdGgsCisJCQkgc3RydWN0IHRyZWVwYXRoICpwYXRoLAogCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCiAJCQkgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfdW5fYmgpOwogCkBAIC0xODU4LDcgKzE4NTgsNyBAQAogI2RlZmluZSBHRVRfQkxPQ0tfTk9fREFOR0xFICAgMTYJLyogZG9uJ3QgbGVhdmUgYW55IHRyYW5zYWN0aW9ucyBydW5uaW5nICovCiAKIGludCByZXN0YXJ0X3RyYW5zYWN0aW9uKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpOworCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHRyZWVwYXRoICpwYXRoKTsKIHZvaWQgcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzKTsKIGludCByZWlzZXJmc19maW5kX2FjdG9yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnApOwpAQCAtMTkwNSw3ICsxOTA1LDcgQEAKIC8qIG5hbWVpLmMgKi8KIHZvaWQgc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpOwogaW50IHNlYXJjaF9ieV9lbnRyeV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKLQkJCXN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSk7CisJCQlzdHJ1Y3QgdHJlZXBhdGggKnBhdGgsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKTsKIHN0cnVjdCBkZW50cnkgKnJlaXNlcmZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqKTsKIC8qIHByb2Nmcy5jICovCiAKQEAgLTE5NTYsOSArMTk1Niw5IEBACiAKIC8qIHRhaWxfY29udmVyc2lvbi5jICovCiBpbnQgZGlyZWN0MmluZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IGlub2RlICosCi0JCSAgICBzdHJ1Y3QgcGF0aCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgbG9mZl90KTsKKwkJICAgIHN0cnVjdCB0cmVlcGF0aCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgbG9mZl90KTsKIGludCBpbmRpcmVjdDJkaXJlY3Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3QgaW5vZGUgKiwKLQkJICAgIHN0cnVjdCBwYWdlICosIHN0cnVjdCBwYXRoICosIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICosCisJCSAgICBzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgdHJlZXBhdGggKiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiwKIAkJICAgIGxvZmZfdCwgY2hhciAqKTsKIHZvaWQgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKIApAQCAtMjA0NSw3ICsyMDQ1LDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwkvKiBpbm9kZSBwYXNzZWQgdG8gYWxsb2NhdG9yLCBpZiB3ZSBhbGxvY2F0ZSB1bmYuIG5vZGVzICovCiAJbG9uZyBibG9jazsJCS8qIGZpbGUgb2Zmc2V0LCBpbiBibG9ja3MgKi8KIAlzdHJ1Y3QgaW5fY29yZV9rZXkga2V5OwotCXN0cnVjdCBwYXRoICpwYXRoOwkvKiBzZWFyY2ggcGF0aCwgdXNlZCBieSBhbGxvY2F0b3IgdG8gZGV0ZXJuaW5lIHNlYXJjaF9zdGFydCBieQorCXN0cnVjdCB0cmVlcGF0aCAqcGF0aDsJLyogc2VhcmNoIHBhdGgsIHVzZWQgYnkgYWxsb2NhdG9yIHRvIGRldGVybmluZSBzZWFyY2hfc3RhcnQgYnkKIAkJCQkgKiB2YXJpb3VzIHdheXMgKi8KIAlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aDsJLyogdHJhbnNhY3Rpb24gaGFuZGxlIGlzIG5lZWRlZCB0byBsb2cgc3VwZXIgYmxvY2tzIGFuZAogCQkJCQkJICogYml0bWFwIGJsb2NrcyBjaGFuZ2VzICAqLwpAQCAtMjEwMSw3ICsyMTAxLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZQogCQkJCQkgICAgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCi0JCQkJCSAgICBzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9uZyBibG9jaykKKwkJCQkJICAgIHN0cnVjdCB0cmVlcGF0aCAqcGF0aCwgbG9uZyBibG9jaykKIHsKIAlyZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0gewogCQkudGggPSB0aCwKQEAgLTIxMTgsNyArMjExOCw3IEBACiBzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzMihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlCiAJCQkJCSAgICAgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAotCQkJCQkgICAgIHN0cnVjdCBwYXRoICpwYXRoLCBsb25nIGJsb2NrKQorCQkJCQkgICAgIHN0cnVjdCB0cmVlcGF0aCAqcGF0aCwgbG9uZyBibG9jaykKIHsKIAlyZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0gewogCQkudGggPSB0aCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaAppbmRleCA3M2UwYmVjLi4zYTI4NzQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19zYi5oCkBAIC0yNDksNyArMjQ5LDggQEAKIAlpbnQgal9lcnJubzsKIAogCS8qIHdoZW4gZmx1c2hpbmcgb3JkZXJlZCBidWZmZXJzLCB0aHJvdHRsZSBuZXcgb3JkZXJlZCB3cml0ZXJzICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IGpfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGpfd29yazsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmpfd29ya19zYjsKIAlhdG9taWNfdCBqX2FzeW5jX3Rocm90dGxlOwogfTsKIApAQCAtNDI5LDcgKzQzMCw3IEBACiAvKiAtbyBoYXNoPXt0ZWEsIHJ1cGFzb3YsIHI1LCBkZXRlY3R9IGlzIG1lYW50IGZvciBwcm9wZXJseSBtb3VudGluZyAKICoqIHJlaXNlcmZzIGRpc2tzIGZyb20gMy41LjE5IG9yIGVhcmxpZXIuICA5OSUgb2YgdGhlIHRpbWUsIHRoaXMgb3B0aW9uCiAqKiBpcyBub3QgcmVxdWlyZWQuICBJZiB0aGUgbm9ybWFsIGF1dG9kZWN0aW9uIGNvZGUgY2FuJ3QgZGV0ZXJtaW5lIHdoaWNoCi0qKiBoYXNoIHRvIHVzZSAoYmVjYXVzZSBib3RoIGhhc2VzIGhhZCB0aGUgc2FtZSB2YWx1ZSBmb3IgYSBmaWxlKQorKiogaGFzaCB0byB1c2UgKGJlY2F1c2UgYm90aCBoYXNoZXMgaGFkIHRoZSBzYW1lIHZhbHVlIGZvciBhIGZpbGUpCiAqKiB1c2UgdGhpcyBvcHRpb24gdG8gZm9yY2UgYSBzcGVjaWZpYyBoYXNoLiAgSXQgd29uJ3QgYWxsb3cgeW91IHRvIG92ZXJyaWRlCiAqKiB0aGUgZXhpc3RpbmcgaGFzaCBvbiB0aGUgRlMsIHNvIGlmIHlvdSBoYXZlIGEgdGVhIGhhc2ggZGlzaywgYW5kIG1vdW50CiAqKiB3aXRoIC1vIGhhc2g9cnVwYXNvdiwgdGhlIG1vdW50IHdpbGwgZmFpbC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVsYXkuaCBiL2luY2x1ZGUvbGludXgvcmVsYXkuaAppbmRleCAyNGFjY2I0Li5jNmE0OGJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlbGF5LmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWxheS5oCkBAIC0zOCw3ICszOCw3IEBACiAJc2l6ZV90IHN1YmJ1ZnNfY29uc3VtZWQ7CS8qIGNvdW50IG9mIHN1Yi1idWZmZXJzIGNvbnN1bWVkICovCiAJc3RydWN0IHJjaGFuICpjaGFuOwkJLyogYXNzb2NpYXRlZCBjaGFubmVsICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiByZWFkZXIgd2FpdCBxdWV1ZSAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3YWtlX3JlYWRlcnM7IC8qIHJlYWRlciB3YWtlLXVwIHdvcmsgc3RydWN0ICovCisJc3RydWN0IGRlbGF5ZWRfd29yayB3YWtlX3JlYWRlcnM7IC8qIHJlYWRlciB3YWtlLXVwIHdvcmsgc3RydWN0ICovCiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwkJLyogY2hhbm5lbCBmaWxlIGRlbnRyeSAqLwogCXN0cnVjdCBrcmVmIGtyZWY7CQkvKiBjaGFubmVsIGJ1ZmZlciByZWZjb3VudCAqLwogCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheTsJLyogYXJyYXkgb2YgY3VycmVudCBidWZmZXIgcGFnZXMgKi8KQEAgLTI3NCw3ICsyNzQsNyBAQAogLyoKICAqIGV4cG9ydGVkIHJlbGF5IGZpbGUgb3BlcmF0aW9ucywga2VybmVsL3JlbGF5LmMKICAqLwotZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVsYXlfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVsYXlfZmlsZV9vcGVyYXRpb25zOwogCiAjZW5kaWYgLyogX0xJTlVYX1JFTEFZX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ybWFwLmggYi9pbmNsdWRlL2xpbnV4L3JtYXAuaAppbmRleCBkYjJjMWRmLi4zNmY4NTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JtYXAuaApAQCAtMzAsMTEgKzMwLDExIEBACiAKICNpZmRlZiBDT05GSUdfTU1VCiAKLWV4dGVybiBrbWVtX2NhY2hlX3QgKmFub25fdm1hX2NhY2hlcDsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqYW5vbl92bWFfY2FjaGVwOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWFfYWxsb2Modm9pZCkKIHsKLQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhhbm9uX3ZtYV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhhbm9uX3ZtYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYW5vbl92bWFfZnJlZShzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydGMuaCBiL2luY2x1ZGUvbGludXgvcnRjLmgKaW5kZXggMDlmZjRjMy4uNWUyMmQ0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3J0Yy5oCkBAIC0xMDYsNiArMTA2LDcgQEAKIGV4dGVybiBpbnQgcnRjX3ZhbGlkX3RtKHN0cnVjdCBydGNfdGltZSAqdG0pOwogZXh0ZXJuIGludCBydGNfdG1fdG9fdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtLCB1bnNpZ25lZCBsb25nICp0aW1lKTsKIGV4dGVybiB2b2lkIHJ0Y190aW1lX3RvX3RtKHVuc2lnbmVkIGxvbmcgdGltZSwgc3RydWN0IHJ0Y190aW1lICp0bSk7CitleHRlcm4gdm9pZCBydGNfbWVyZ2VfYWxhcm0oc3RydWN0IHJ0Y190aW1lICpub3csIHN0cnVjdCBydGNfdGltZSAqYWxhcm0pOwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRtdXRleC5oIGIvaW5jbHVkZS9saW51eC9ydG11dGV4LmgKaW5kZXggNWQ0MWRlZS4uYjAwOTBlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydG11dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9ydG11dGV4LmgKQEAgLTYzLDcgKzYzLDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIF9fUlRfTVVURVhfSU5JVElBTElaRVIobXV0ZXhuYW1lKSBcCi0JeyAud2FpdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEIFwKKwl7IC53YWl0X2xvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChtdXRleG5hbWUud2FpdF9sb2NrKSBcCiAJLCAud2FpdF9saXN0ID0gUExJU1RfSEVBRF9JTklUKG11dGV4bmFtZS53YWl0X2xpc3QsIG11dGV4bmFtZS53YWl0X2xvY2spIFwKIAksIC5vd25lciA9IE5VTEwgXAogCV9fREVCVUdfUlRfTVVURVhfSU5JVElBTElaRVIobXV0ZXhuYW1lKX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCmluZGV4IDNhMThhZGQuLjRhNjI5ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApAQCAtMyw2ICszLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgorI2luY2x1ZGUgPGxpbnV4L25laWdoYm91ci5oPgogCiAvKioqKgogICoJCVJvdXRpbmcvbmVpZ2hib3VyIGRpc2NvdmVyeSBtZXNzYWdlcy4KQEAgLTgxLDggKzgzLDYgQEAKIAogCVJUTV9ORVdQUkVGSVgJPSA1MiwKICNkZWZpbmUgUlRNX05FV1BSRUZJWAlSVE1fTkVXUFJFRklYCi0JUlRNX0dFVFBSRUZJWAk9IDU0LAotI2RlZmluZSBSVE1fR0VUUFJFRklYCVJUTV9HRVRQUkVGSVgKIAogCVJUTV9HRVRNVUxUSUNBU1QgPSA1OCwKICNkZWZpbmUgUlRNX0dFVE1VTFRJQ0FTVCBSVE1fR0VUTVVMVElDQVNUCkBAIC01ODcsNiArNTg3LDkgQEAKIAkJICAgICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBnZnBfdCBmbGFncyk7CiBleHRlcm4gdm9pZCBydG5sX3NldF9za19lcnIodTMyIGdyb3VwLCBpbnQgZXJyb3IpOwogZXh0ZXJuIGludCBydG5ldGxpbmtfcHV0X21ldHJpY3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyICptZXRyaWNzKTsKK2V4dGVybiBpbnQgcnRubF9wdXRfY2FjaGVpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKKwkJCSAgICAgIHUzMiBpZCwgdTMyIHRzLCB1MzIgdHNhZ2UsIGxvbmcgZXhwaXJlcywKKwkJCSAgICAgIHUzMiBlcnJvcik7CiAKIGV4dGVybiB2b2lkIF9fcnRhX2ZpbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGF0dHJ0eXBlLCBpbnQgYXR0cmxlbiwgY29uc3Qgdm9pZCAqZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcndzZW0tc3BpbmxvY2suaCBiL2luY2x1ZGUvbGludXgvcndzZW0tc3BpbmxvY2suaAppbmRleCBhZTFmY2FkLi44MTNjZWUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3J3c2VtLXNwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9yd3NlbS1zcGlubG9jay5oCkBAIC00NCw3ICs0NCw4IEBACiAjZW5kaWYKIAogI2RlZmluZSBfX1JXU0VNX0lOSVRJQUxJWkVSKG5hbWUpIFwKLXsgMCwgU1BJTl9MT0NLX1VOTE9DS0VELCBMSVNUX0hFQURfSU5JVCgobmFtZSkud2FpdF9saXN0KSBfX1JXU0VNX0RFUF9NQVBfSU5JVChuYW1lKSB9Cit7IDAsIF9fU1BJTl9MT0NLX1VOTE9DS0VEKG5hbWUud2FpdF9sb2NrKSwgTElTVF9IRUFEX0lOSVQoKG5hbWUpLndhaXRfbGlzdCkgXAorICBfX1JXU0VNX0RFUF9NQVBfSU5JVChuYW1lKSB9CiAKICNkZWZpbmUgREVDTEFSRV9SV1NFTShuYW1lKSBcCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBuYW1lID0gX19SV1NFTV9JTklUSUFMSVpFUihuYW1lKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDY3MzVjMWMuLjQ0NjM3MzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTgyLDYgKzgyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Rhc2tfaW9fYWNjb3VudGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCkBAIC0xOTQsNyArMTk1LDE2IEBACiAKIGV4dGVybiBjcHVtYXNrX3Qgbm9oel9jcHVfbWFzazsKIAotZXh0ZXJuIHZvaWQgc2hvd19zdGF0ZSh2b2lkKTsKKy8qCisgKiBPbmx5IGR1bXAgVEFTS18qIHRhc2tzLiAoLTEgZm9yIGFsbCB0YXNrcykKKyAqLworZXh0ZXJuIHZvaWQgc2hvd19zdGF0ZV9maWx0ZXIodW5zaWduZWQgbG9uZyBzdGF0ZV9maWx0ZXIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2hvd19zdGF0ZSh2b2lkKQoreworCXNob3dfc3RhdGVfZmlsdGVyKC0xKTsKK30KKwogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwogCiAvKgpAQCAtMzM4LDE1ICszNDgsMjMgQEAKIAogCXVuc2lnbmVkIGxvbmcgc2F2ZWRfYXV4dltBVF9WRUNUT1JfU0laRV07IC8qIGZvciAvcHJvYy9QSUQvYXV4diAqLwogCi0JdW5zaWduZWQgZHVtcGFibGU6MjsKIAljcHVtYXNrX3QgY3B1X3ZtX21hc2s7CiAKIAkvKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgTU0gY29udGV4dCAqLwogCW1tX2NvbnRleHRfdCBjb250ZXh0OwogCi0JLyogVG9rZW4gYmFzZWQgdGhyYXNoaW5nIHByb3RlY3Rpb24uICovCi0JdW5zaWduZWQgbG9uZyBzd2FwX3Rva2VuX3RpbWU7Ci0JY2hhciByZWNlbnRfcGFnZWluOworCS8qIFN3YXAgdG9rZW4gc3R1ZmYgKi8KKwkvKgorCSAqIExhc3QgdmFsdWUgb2YgZ2xvYmFsIGZhdWx0IHN0YW1wIGFzIHNlZW4gYnkgdGhpcyBwcm9jZXNzLgorCSAqIEluIG90aGVyIHdvcmRzLCB0aGlzIHZhbHVlIGdpdmVzIGFuIGluZGljYXRpb24gb2YgaG93IGxvbmcKKwkgKiBpdCBoYXMgYmVlbiBzaW5jZSB0aGlzIHRhc2sgZ290IHRoZSB0b2tlbi4KKwkgKiBMb29rIGF0IG1tL3RocmFzaC5jCisJICovCisJdW5zaWduZWQgaW50IGZhdWx0c3RhbXA7CisJdW5zaWduZWQgaW50IHRva2VuX3ByaW9yaXR5OworCXVuc2lnbmVkIGludCBsYXN0X2ludGVydmFsOworCisJdW5zaWduZWQgY2hhciBkdW1wYWJsZToyOwogCiAJLyogY29yZWR1bXBpbmcgc3VwcG9ydCAqLwogCWludCBjb3JlX3dhaXRlcnM7CkBAIC00MTksNyArNDM3LDEyIEBACiAJLyogam9iIGNvbnRyb2wgSURzICovCiAJcGlkX3QgcGdycDsKIAlwaWRfdCB0dHlfb2xkX3BncnA7Ci0JcGlkX3Qgc2Vzc2lvbjsKKworCXVuaW9uIHsKKwkJcGlkX3Qgc2Vzc2lvbiBfX2RlcHJlY2F0ZWQ7CisJCXBpZF90IF9fc2Vzc2lvbjsKKwl9OworCiAJLyogYm9vbGVhbiB2YWx1ZSBmb3Igc2Vzc2lvbiBncm91cCBsZWFkZXIgKi8KIAlpbnQgbGVhZGVyOwogCkBAIC00NjYsNyArNDg5LDYgQEAKIAlzdHJ1Y3QgcGFjY3Rfc3RydWN0IHBhY2N0OwkvKiBwZXItcHJvY2VzcyBhY2NvdW50aW5nIGluZm9ybWF0aW9uICovCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVEFTS1NUQVRTCi0Jc3BpbmxvY2tfdCBzdGF0c19sb2NrOwogCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzOwogI2VuZGlmCiB9OwpAQCAtNTU3LDcgKzU3OSw3IEBACiAjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU0NIRURTVEFUUykgfHwgZGVmaW5lZChDT05GSUdfVEFTS19ERUxBWV9BQ0NUKSAqLwogCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc2NoZWRzdGF0X29wZXJhdGlvbnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NjaGVkc3RhdF9vcGVyYXRpb25zOwogI2VuZGlmIC8qIENPTkZJR19TQ0hFRFNUQVRTICovCiAKICNpZmRlZiBDT05GSUdfVEFTS19ERUxBWV9BQ0NUCkBAIC02MjYsNiArNjQ4LDcgQEAKICNkZWZpbmUgU0RfU0hBUkVfQ1BVUE9XRVIJMTI4CS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBwb3dlciAqLwogI2RlZmluZSBTRF9QT1dFUlNBVklOR1NfQkFMQU5DRQkyNTYJLyogQmFsYW5jZSBmb3IgcG93ZXIgc2F2aW5ncyAqLwogI2RlZmluZSBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTCTUxMgkvKiBEb21haW4gbWVtYmVycyBzaGFyZSBjcHUgcGtnIHJlc291cmNlcyAqLworI2RlZmluZSBTRF9TRVJJQUxJWkUJCTEwMjQJLyogT25seSBhIHNpbmdsZSBsb2FkIGJhbGFuY2luZyBpbnN0YW5jZSAqLwogCiAjZGVmaW5lIEJBTEFOQ0VfRk9SX01DX1BPV0VSCVwKIAkoc2NoZWRfc210X3Bvd2VyX3NhdmluZ3MgPyBTRF9QT1dFUlNBVklOR1NfQkFMQU5DRSA6IDApCkBAIC05OTIsNiArMTAxNSw3IEBACiAJd2FpdF9xdWV1ZV90ICppb193YWl0OwogLyogaS9vIGNvdW50ZXJzKGJ5dGVzIHJlYWQvd3JpdHRlbiwgI3N5c2NhbGxzICovCiAJdTY0IHJjaGFyLCB3Y2hhciwgc3lzY3IsIHN5c2N3OworCXN0cnVjdCB0YXNrX2lvX2FjY291bnRpbmcgaW9hYzsKICNpZiBkZWZpbmVkKENPTkZJR19UQVNLX1hBQ0NUKQogCXU2NCBhY2N0X3Jzc19tZW0xOwkvKiBhY2N1bXVsYXRlZCByc3MgdXNhZ2UgKi8KIAl1NjQgYWNjdF92bV9tZW0xOwkvKiBhY2N1bXVsYXRlZCB2aXJ0dWFsIG1lbW9yeSB1c2FnZSAqLwpAQCAtMTAyNCw2ICsxMDQ4LDkgQEAKICNpZmRlZglDT05GSUdfVEFTS19ERUxBWV9BQ0NUCiAJc3RydWN0IHRhc2tfZGVsYXlfaW5mbyAqZGVsYXlzOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTgorCWludCBtYWtlX2l0X2ZhaWw7CisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbmxpbmUgcGlkX3QgcHJvY2Vzc19ncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKQEAgLTEwMzEsNiArMTA1OCwyMSBAQAogCXJldHVybiB0c2stPnNpZ25hbC0+cGdycDsKIH0KIAorc3RhdGljIGlubGluZSBwaWRfdCBzaWduYWxfc2Vzc2lvbihzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQoreworCXJldHVybiBzaWctPl9fc2Vzc2lvbjsKK30KKworc3RhdGljIGlubGluZSBwaWRfdCBwcm9jZXNzX3Nlc3Npb24oc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuIHNpZ25hbF9zZXNzaW9uKHRzay0+c2lnbmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9zaWduYWxfc2Vzc2lvbihzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnLCBwaWRfdCBzZXNzaW9uKQoreworCXNpZy0+X19zZXNzaW9uID0gc2Vzc2lvbjsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkICp0YXNrX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJcmV0dXJuIHRhc2stPnBpZHNbUElEVFlQRV9QSURdLnBpZDsKQEAgLTExMDIsNyArMTE0NCw2IEBACiAjZGVmaW5lIFBGX01FTUFMTE9DCTB4MDAwMDA4MDAJLyogQWxsb2NhdGluZyBtZW1vcnkgKi8KICNkZWZpbmUgUEZfRkxVU0hFUgkweDAwMDAxMDAwCS8qIHJlc3BvbnNpYmxlIGZvciBkaXNrIHdyaXRlYmFjayAqLwogI2RlZmluZSBQRl9VU0VEX01BVEgJMHgwMDAwMjAwMAkvKiBpZiB1bnNldCB0aGUgZnB1IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSAqLwotI2RlZmluZSBQRl9GUkVFWkUJMHgwMDAwNDAwMAkvKiB0aGlzIHRhc2sgaXMgYmVpbmcgZnJvemVuIGZvciBzdXNwZW5kIG5vdyAqLwogI2RlZmluZSBQRl9OT0ZSRUVaRQkweDAwMDA4MDAwCS8qIHRoaXMgdGhyZWFkIHNob3VsZCBub3QgYmUgZnJvemVuICovCiAjZGVmaW5lIFBGX0ZST1pFTgkweDAwMDEwMDAwCS8qIGZyb3plbiBmb3Igc3lzdGVtIHN1c3BlbmQgKi8KICNkZWZpbmUgUEZfRlNUUkFOUwkweDAwMDIwMDAwCS8qIGluc2lkZSBhIGZpbGVzeXN0ZW0gdHJhbnNhY3Rpb24gKi8KQEAgLTEyMjQsNyArMTI2NSw2IEBACiAKICNkZWZpbmUgZmluZF90YXNrX2J5X3BpZChucikJZmluZF90YXNrX2J5X3BpZF90eXBlKFBJRFRZUEVfUElELCBucikKIGV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZpbmRfdGFza19ieV9waWRfdHlwZShpbnQgdHlwZSwgaW50IHBpZCk7Ci1leHRlcm4gdm9pZCBzZXRfc3BlY2lhbF9waWRzKHBpZF90IHNlc3Npb24sIHBpZF90IHBncnApOwogZXh0ZXJuIHZvaWQgX19zZXRfc3BlY2lhbF9waWRzKHBpZF90IHNlc3Npb24sIHBpZF90IHBncnApOwogCiAvKiBwZXItVUlEIHByb2Nlc3MgY2hhcmdpbmcuICovCkBAIC0xMjg5LDcgKzEzMjksNiBAQAogZXh0ZXJuIGludCBraWxsX3BpZChzdHJ1Y3QgcGlkICpwaWQsIGludCBzaWcsIGludCBwcml2KTsKIGV4dGVybiBpbnQgX19raWxsX3BnX2luZm8oaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHBpZF90IHBncnApOwogZXh0ZXJuIGludCBraWxsX3BnX2luZm8oaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqLCBwaWRfdCk7Ci1leHRlcm4gaW50IGtpbGxfcHJvY19pbmZvKGludCwgc3RydWN0IHNpZ2luZm8gKiwgcGlkX3QpOwogZXh0ZXJuIHZvaWQgZG9fbm90aWZ5X3BhcmVudChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIGZvcmNlX3NpZyhpbnQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIGZvcmNlX3NpZ19zcGVjaWZpYyhpbnQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKQEAgLTEzNjYsNyArMTQwNSw2IEBACiBleHRlcm4gdm9pZCBkYWVtb25pemUoY29uc3QgY2hhciAqLCAuLi4pOwogZXh0ZXJuIGludCBhbGxvd19zaWduYWwoaW50KTsKIGV4dGVybiBpbnQgZGlzYWxsb3dfc2lnbmFsKGludCk7Ci1leHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZF9yZWFwZXI7CiAKIGV4dGVybiBpbnQgZG9fZXhlY3ZlKGNoYXIgKiwgY2hhciBfX3VzZXIgKiBfX3VzZXIgKiwgY2hhciBfX3VzZXIgKiBfX3VzZXIgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gbG9uZyBkb19mb3JrKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGxvbmcsIGludCBfX3VzZXIgKiwgaW50IF9fdXNlciAqKTsKQEAgLTE2MTEsODcgKzE2NDksNiBAQAogCiBleHRlcm4gdm9pZCBub3JtYWxpemVfcnRfdGFza3Modm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfUE0KLS8qCi0gKiBDaGVjayBpZiBhIHByb2Nlc3MgaGFzIGJlZW4gZnJvemVuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZyb3plbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JcmV0dXJuIHAtPmZsYWdzICYgUEZfRlJPWkVOOwotfQotCi0vKgotICogQ2hlY2sgaWYgdGhlcmUgaXMgYSByZXF1ZXN0IHRvIGZyZWV6ZSBhIHByb2Nlc3MKLSAqLwotc3RhdGljIGlubGluZSBpbnQgZnJlZXppbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXJldHVybiBwLT5mbGFncyAmIFBGX0ZSRUVaRTsKLX0KLQotLyoKLSAqIFJlcXVlc3QgdGhhdCBhIHByb2Nlc3MgYmUgZnJvemVuCi0gKiBGSVhNRTogU01QIHByb2JsZW0uIFdlIG1heSBub3QgbW9kaWZ5IG90aGVyIHByb2Nlc3MnIGZsYWdzIQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZXplKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKLXsKLQlwLT5mbGFncyB8PSBQRl9GUkVFWkU7Ci19Ci0KLS8qCi0gKiBTb21ldGltZXMgd2UgbWF5IG5lZWQgdG8gY2FuY2VsIHRoZSBwcmV2aW91cyAnZnJlZXplJyByZXF1ZXN0Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19ub3RfZnJlZXplKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKLXsKLQlwLT5mbGFncyAmPSB+UEZfRlJFRVpFOwotfQotCi0vKgotICogV2FrZSB1cCBhIGZyb3plbiBwcm9jZXNzCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRoYXdfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JaWYgKGZyb3plbihwKSkgewotCQlwLT5mbGFncyAmPSB+UEZfRlJPWkVOOwotCQl3YWtlX3VwX3Byb2Nlc3MocCk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGZyZWV6aW5nIGlzIGNvbXBsZXRlLCBtYXJrIHByb2Nlc3MgYXMgZnJvemVuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcm96ZW5fcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JcC0+ZmxhZ3MgPSAocC0+ZmxhZ3MgJiB+UEZfRlJFRVpFKSB8IFBGX0ZST1pFTjsKLX0KLQotZXh0ZXJuIHZvaWQgcmVmcmlnZXJhdG9yKHZvaWQpOwotZXh0ZXJuIGludCBmcmVlemVfcHJvY2Vzc2VzKHZvaWQpOwotZXh0ZXJuIHZvaWQgdGhhd19wcm9jZXNzZXModm9pZCk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRyeV90b19mcmVlemUodm9pZCkKLXsKLQlpZiAoZnJlZXppbmcoY3VycmVudCkpIHsKLQkJcmVmcmlnZXJhdG9yKCk7Ci0JCXJldHVybiAxOwotCX0gZWxzZQotCQlyZXR1cm4gMDsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBmcm96ZW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBmcmVlemluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlemUoc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IEJVRygpOyB9Ci1zdGF0aWMgaW5saW5lIGludCB0aGF3X3Byb2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAxOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZnJvemVuX3Byb2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IEJVRygpOyB9Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWZyaWdlcmF0b3Iodm9pZCkge30KLXN0YXRpYyBpbmxpbmUgaW50IGZyZWV6ZV9wcm9jZXNzZXModm9pZCkgeyBCVUcoKTsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aGF3X3Byb2Nlc3Nlcyh2b2lkKSB7fQotCi1zdGF0aWMgaW5saW5lIGludCB0cnlfdG9fZnJlZXplKHZvaWQpIHsgcmV0dXJuIDA7IH0KLQotI2VuZGlmIC8qIENPTkZJR19QTSAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjcmVlbl9pbmZvLmggYi9pbmNsdWRlL2xpbnV4L3NjcmVlbl9pbmZvLmgKaW5kZXggMjkyNWU2Ni4uYjAyMzA4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY3JlZW5faW5mby5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NyZWVuX2luZm8uaApAQCAtNDIsNyArNDIsOCBAQAogCXUxNiBwYWdlczsJCS8qIDB4MzIgKi8KIAl1MTYgdmVzYV9hdHRyaWJ1dGVzOwkvKiAweDM0ICovCiAJdTMyIGNhcGFiaWxpdGllczsgICAgICAgLyogMHgzNiAqLwotCQkJCS8qIDB4M2EgLS0gMHgzZiByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCQkJCS8qIDB4M2EgLS0gMHgzYiByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCQkJCS8qIDB4M2MgLS0gMHgzZiBtaWNybyBzdGFjayBmb3IgcmVsb2NhdGFibGUga2VybmVscyAqLwogfTsKIAogZXh0ZXJuIHN0cnVjdCBzY3JlZW5faW5mbyBzY3JlZW5faW5mbzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2N0cC5oIGIvaW5jbHVkZS9saW51eC9zY3RwLmgKaW5kZXggNmVjNjZkZS4uMzUxMDhmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY3RwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY3RwLmgKQEAgLTU3LDE3ICs1NywxNyBAQAogCiAvKiBTZWN0aW9uIDMuMS4gIFNDVFAgQ29tbW9uIEhlYWRlciBGb3JtYXQgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBoZHIgewotCV9fdTE2IHNvdXJjZTsKLQlfX3UxNiBkZXN0OwotCV9fdTMyIHZ0YWc7Ci0JX191MzIgY2hlY2tzdW07CisJX19iZTE2IHNvdXJjZTsKKwlfX2JlMTYgZGVzdDsKKwlfX2JlMzIgdnRhZzsKKwlfX2JlMzIgY2hlY2tzdW07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfc2N0cGhkcl90OwogCiAvKiBTZWN0aW9uIDMuMi4gIENodW5rIEZpZWxkIERlc2NyaXB0aW9ucy4gKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfY2h1bmtoZHIgewogCV9fdTggdHlwZTsKIAlfX3U4IGZsYWdzOwotCV9fdTE2IGxlbmd0aDsKKwlfX2JlMTYgbGVuZ3RoOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2NodW5raGRyX3Q7CiAKIApAQCAtMTUzLDggKzE1Myw4IEBACiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9wYXJhbWhkciB7Ci0JX191MTYgdHlwZTsKLQlfX3UxNiBsZW5ndGg7CisJX19iZTE2IHR5cGU7CisJX19iZTE2IGxlbmd0aDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9wYXJhbWhkcl90OwogCiB0eXBlZGVmIGVudW0gewpAQCAtMjAzLDEwICsyMDMsMTAgQEAKIC8qIFJGQyAyOTYwIFNlY3Rpb24gMy4zLjEgUGF5bG9hZCBEYXRhIChEQVRBKSAoMCkgKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9kYXRhaGRyIHsKLQlfX3UzMiB0c247Ci0JX191MTYgc3RyZWFtOwotCV9fdTE2IHNzbjsKLQlfX3UzMiBwcGlkOworCV9fYmUzMiB0c247CisJX19iZTE2IHN0cmVhbTsKKwlfX2JlMTYgc3NuOworCV9fYmUzMiBwcGlkOwogCV9fdTggIHBheWxvYWRbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfZGF0YWhkcl90OwogCkBAIC0yMzIsMTEgKzIzMiwxMSBAQAogICogIGVuZHBvaW50cy4KICAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9pbml0aGRyIHsKLQlfX3UzMiBpbml0X3RhZzsKLQlfX3UzMiBhX3J3bmQ7Ci0JX191MTYgbnVtX291dGJvdW5kX3N0cmVhbXM7Ci0JX191MTYgbnVtX2luYm91bmRfc3RyZWFtczsKLQlfX3UzMiBpbml0aWFsX3RzbjsKKwlfX2JlMzIgaW5pdF90YWc7CisJX19iZTMyIGFfcnduZDsKKwlfX2JlMTYgbnVtX291dGJvdW5kX3N0cmVhbXM7CisJX19iZTE2IG51bV9pbmJvdW5kX3N0cmVhbXM7CisJX19iZTMyIGluaXRpYWxfdHNuOwogCV9fdTggIHBhcmFtc1swXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9pbml0aGRyX3Q7CiAKQEAgLTI2MSw3ICsyNjEsNyBAQAogLyogU2VjdGlvbiAzLjMuMi4xIENvb2tpZSBQcmVzZXJ2YXRpdmUgKDkpICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2Nvb2tpZV9wcmVzZXJ2ZV9wYXJhbSB7CiAJc2N0cF9wYXJhbWhkcl90IHBhcmFtX2hkcjsKLQl1aW50MzJfdCAgICAgICAgbGlmZXNwYW5faW5jcmVtZW50OworCV9fYmUzMiAgICAgICAgICBsaWZlc3Bhbl9pbmNyZW1lbnQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfY29va2llX3ByZXNlcnZlX3BhcmFtX3Q7CiAKIC8qIFNlY3Rpb24gMy4zLjIuMSBIb3N0IE5hbWUgQWRkcmVzcyAoMTEpICovCkBAIC0yNzMsNyArMjczLDcgQEAKIC8qIFNlY3Rpb24gMy4zLjIuMSBTdXBwb3J0ZWQgQWRkcmVzcyBUeXBlcyAoMTIpICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX3N1cHBvcnRlZF9hZGRyc19wYXJhbSB7CiAJc2N0cF9wYXJhbWhkcl90IHBhcmFtX2hkcjsKLQl1aW50MTZfdCB0eXBlc1swXTsKKwlfX2JlMTYgdHlwZXNbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfc3VwcG9ydGVkX2FkZHJzX3BhcmFtX3Q7CiAKIC8qIEFwcGVuZGl4IEEuIEVDTiBDYXBhYmxlICgzMjc2OCkgKi8KQEAgLTI4NCw3ICsyODQsNyBAQAogLyogQURESVAgU2VjdGlvbiAzLjIuNiBBZGFwdGlvbiBMYXllciBJbmRpY2F0aW9uICovCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2FkYXB0aW9uX2luZF9wYXJhbSB7CiAJc3RydWN0IHNjdHBfcGFyYW1oZHIgcGFyYW1faGRyOwotCV9fdTMyIGFkYXB0aW9uX2luZDsKKwlfX2JlMzIgYWRhcHRpb25faW5kOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2FkYXB0aW9uX2luZF9wYXJhbV90OwogCiAvKiBSRkMgMjk2MC4gIFNlY3Rpb24gMy4zLjMgSW5pdGlhdGlvbiBBY2tub3dsZWRnZW1lbnQgKElOSVQgQUNLKSAoMik6CkBAIC0zMTYsMTEgKzMxNiwxMSBAQAogICovCiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfZ2FwX2Fja19ibG9jayB7Ci0JX191MTYgc3RhcnQ7Ci0JX191MTYgZW5kOworCV9fYmUxNiBzdGFydDsKKwlfX2JlMTYgZW5kOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzY3RwX2dhcF9hY2tfYmxvY2tfdDsKIAotdHlwZWRlZiB1aW50MzJfdCBzY3RwX2R1cF90c25fdDsKK3R5cGVkZWYgX19iZTMyIHNjdHBfZHVwX3Rzbl90OwogCiB0eXBlZGVmIHVuaW9uIHsKIAlzY3RwX2dhcF9hY2tfYmxvY2tfdAlnYWI7CkBAIC0zMjgsMTAgKzMyOCwxMCBAQAogfSBzY3RwX3NhY2tfdmFyaWFibGVfdDsKIAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9zYWNraGRyIHsKLQlfX3UzMiBjdW1fdHNuX2FjazsKLQlfX3UzMiBhX3J3bmQ7Ci0JX191MTYgbnVtX2dhcF9hY2tfYmxvY2tzOwotCV9fdTE2IG51bV9kdXBfdHNuczsKKwlfX2JlMzIgY3VtX3Rzbl9hY2s7CisJX19iZTMyIGFfcnduZDsKKwlfX2JlMTYgbnVtX2dhcF9hY2tfYmxvY2tzOworCV9fYmUxNiBudW1fZHVwX3RzbnM7CiAJc2N0cF9zYWNrX3ZhcmlhYmxlX3QgdmFyaWFibGVbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfc2Fja2hkcl90OwogCkBAIC0zNzEsNyArMzcxLDcgQEAKICAqIGFuZCB0aGUgaGlnaGVzdCBjb25zZWN1dGl2ZSBhY2tpbmcgdmFsdWUuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHNjdHBfc2h1dGRvd25oZHIgewotCV9fdTMyIGN1bV90c25fYWNrOworCV9fYmUzMiBjdW1fdHNuX2FjazsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9zaHV0ZG93bmhkcl90OwogCiBzdHJ1Y3Qgc2N0cF9zaHV0ZG93bl9jaHVua190IHsKQEAgLTM4Miw4ICszODIsOCBAQAogLyogUkZDIDI5NjAuICBTZWN0aW9uIDMuMy4xMCBPcGVyYXRpb24gRXJyb3IgKEVSUk9SKSAoOSkgKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9lcnJoZHIgewotCV9fdTE2IGNhdXNlOwotCV9fdTE2IGxlbmd0aDsKKwlfX2JlMTYgY2F1c2U7CisJX19iZTE2IGxlbmd0aDsKIAlfX3U4ICB2YXJpYWJsZVswXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9lcnJoZHJfdDsKIApAQCAtNDYyLDcgKzQ2Miw3IEBACiAgKiAgIEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uIEVjaG8gKEVDTkUpICgxMikKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9lY25laGRyIHsKLQlfX3UzMiBsb3dlc3RfdHNuOworCV9fYmUzMiBsb3dlc3RfdHNuOwogfSBzY3RwX2VjbmVoZHJfdDsKIAogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9lY25lX2NodW5rIHsKQEAgLTQ3NCw3ICs0NzQsNyBAQAogICogICBDb25nZXN0aW9uIFdpbmRvdyBSZWR1Y2VkIChDV1IpICgxMykKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9jd3JoZHIgewotCV9fdTMyIGxvd2VzdF90c247CisJX19iZTMyIGxvd2VzdF90c247CiB9IHNjdHBfY3dyaGRyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHNjdHBfY3dyX2NodW5rIHsKQEAgLTUyOSwxMiArNTI5LDEyIEBACiAgKiAgICAgICBjaHVua3MgdGhpcyBmaWVsZCBNVVNUIGJlIGZpbGxlZCBpbi4KICAqLwogc3RydWN0IHNjdHBfZndkdHNuX3NraXAgewotCV9fdTE2IHN0cmVhbTsKLQlfX3UxNiBzc247CisJX19iZTE2IHN0cmVhbTsKKwlfX2JlMTYgc3NuOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHNjdHBfZndkdHNuX2hkciB7Ci0JX191MzIgbmV3X2N1bV90c247CisJX19iZTMyIG5ld19jdW1fdHNuOwogCXN0cnVjdCBzY3RwX2Z3ZHRzbl9za2lwIHNraXBbMF07CiB9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKIApAQCAtNTc4LDExICs1NzgsMTEgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9hZGRpcF9wYXJhbSB7CiAJc2N0cF9wYXJhbWhkcl90CXBhcmFtX2hkcjsKLQlfX3UzMgkJY3JyX2lkOwkKKwlfX2JlMzIJCWNycl9pZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9hZGRpcF9wYXJhbV90OwogCiB0eXBlZGVmIHN0cnVjdCBzY3RwX2FkZGlwaGRyIHsKLQlfX3UzMglzZXJpYWw7CisJX19iZTMyCXNlcmlhbDsKIAlfX3U4CXBhcmFtc1swXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2N0cF9hZGRpcGhkcl90OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmggYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKaW5kZXggYjIwMGI5OC4uODNjZGVmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtODI2LDYgKzgyNiw4IEBACiAgKglTZXRzIHRoZSBvcGVucmVxJ3Mgc2lkIHRvIHNvY2tldCdzIHNpZCB3aXRoIE1MUyBwb3J0aW9uIHRha2VuIGZyb20gcGVlciBzaWQuCiAgKiBAaW5ldF9jc2tfY2xvbmU6CiAgKglTZXRzIHRoZSBuZXcgY2hpbGQgc29ja2V0J3Mgc2lkIHRvIHRoZSBvcGVucmVxIHNpZC4KKyAqIEBpbmV0X2Nvbm5fZXN0YWJsaXNoZWQ6CisgKiAgICAgU2V0cyB0aGUgY29ubmVjdGlvbidzIHBlZXJzaWQgdG8gdGhlIHNlY21hcmsgb24gc2tiLgogICogQHJlcV9jbGFzc2lmeV9mbG93OgogICoJU2V0cyB0aGUgZmxvdydzIHNpZCB0byB0aGUgb3BlbnJlcSBzaWQuCiAgKgpAQCAtODM2LDEwICs4MzgsOCBAQAogICoJdXNlZCBieSB0aGUgWEZSTSBzeXN0ZW0uCiAgKglAc2VjX2N0eCBjb250YWlucyB0aGUgc2VjdXJpdHkgY29udGV4dCBpbmZvcm1hdGlvbiBiZWluZyBwcm92aWRlZCBieQogICoJdGhlIHVzZXItbGV2ZWwgcG9saWN5IHVwZGF0ZSBwcm9ncmFtIChlLmcuLCBzZXRrZXkpLgotICoJQHNrIHJlZmVycyB0byB0aGUgc29jayBmcm9tIHdoaWNoIHRvIGRlcml2ZSB0aGUgc2VjdXJpdHkgY29udGV4dC4KICAqCUFsbG9jYXRlIGEgc2VjdXJpdHkgc3RydWN0dXJlIHRvIHRoZSB4cC0+c2VjdXJpdHkgZmllbGQ7IHRoZSBzZWN1cml0eQotICoJZmllbGQgaXMgaW5pdGlhbGl6ZWQgdG8gTlVMTCB3aGVuIHRoZSB4ZnJtX3BvbGljeSBpcyBhbGxvY2F0ZWQuIE9ubHkKLSAqCW9uZSBvZiBzZWNfY3R4IG9yIHNvY2sgY2FuIGJlIHNwZWNpZmllZC4KKyAqCWZpZWxkIGlzIGluaXRpYWxpemVkIHRvIE5VTEwgd2hlbiB0aGUgeGZybV9wb2xpY3kgaXMgYWxsb2NhdGVkLgogICoJUmV0dXJuIDAgaWYgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIChtZW1vcnkgdG8gYWxsb2NhdGUsIGxlZ2FsIGNvbnRleHQpCiAgKiBAeGZybV9wb2xpY3lfY2xvbmVfc2VjdXJpdHk6CiAgKglAb2xkIGNvbnRhaW5zIGFuIGV4aXN0aW5nIHhmcm1fcG9saWN5IGluIHRoZSBTUEQuCkBAIC04NTgsOSArODU4LDYgQEAKICAqCURhdGFiYXNlIGJ5IHRoZSBYRlJNIHN5c3RlbS4KICAqCUBzZWNfY3R4IGNvbnRhaW5zIHRoZSBzZWN1cml0eSBjb250ZXh0IGluZm9ybWF0aW9uIGJlaW5nIHByb3ZpZGVkIGJ5CiAgKgl0aGUgdXNlci1sZXZlbCBTQSBnZW5lcmF0aW9uIHByb2dyYW0gKGUuZy4sIHNldGtleSBvciByYWNvb24pLgotICoJQHBvbHNlYyBjb250YWlucyB0aGUgc2VjdXJpdHkgY29udGV4dCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB4ZnJtCi0gKglwb2xpY3kgcnVsZSBmcm9tIHdoaWNoIHRvIHRha2UgdGhlIGJhc2UgY29udGV4dC4gcG9sc2VjIG11c3QgYmUgTlVMTAotICoJd2hlbiBzZWNfY3R4IGlzIHNwZWNpZmllZC4KICAqCUBzZWNpZCBjb250YWlucyB0aGUgc2VjaWQgZnJvbSB3aGljaCB0byB0YWtlIHRoZSBtbHMgcG9ydGlvbiBvZiB0aGUgY29udGV4dC4KICAqCUFsbG9jYXRlIGEgc2VjdXJpdHkgc3RydWN0dXJlIHRvIHRoZSB4LT5zZWN1cml0eSBmaWVsZDsgdGhlIHNlY3VyaXR5CiAgKglmaWVsZCBpcyBpbml0aWFsaXplZCB0byBOVUxMIHdoZW4gdGhlIHhmcm1fc3RhdGUgaXMgYWxsb2NhdGVkLiBTZXQgdGhlCkBAIC04ODksMTEgKzg4Niw2IEBACiAgKglAeHAgY29udGFpbnMgdGhlIHBvbGljeSB0byBjaGVjayBmb3IgYSBtYXRjaC4KICAqCUBmbCBjb250YWlucyB0aGUgZmxvdyB0byBjaGVjayBmb3IgYSBtYXRjaC4KICAqCVJldHVybiAxIGlmIHRoZXJlIGlzIGEgbWF0Y2guCi0gKiBAeGZybV9mbG93X3N0YXRlX21hdGNoOgotICoJQGZsIGNvbnRhaW5zIHRoZSBmbG93IGtleSB0byBtYXRjaC4KLSAqCUB4ZnJtIHBvaW50cyB0byB0aGUgeGZybV9zdGF0ZSB0byBtYXRjaC4KLSAqCUB4cCBwb2ludHMgdG8gdGhlIHhmcm1fcG9saWN5IHRvIG1hdGNoLgotICoJUmV0dXJuIDEgaWYgdGhlcmUgaXMgYSBtYXRjaC4KICAqIEB4ZnJtX2RlY29kZV9zZXNzaW9uOgogICoJQHNrYiBwb2ludHMgdG8gc2tiIHRvIGRlY29kZS4KICAqCUBzZWNpZCBwb2ludHMgdG8gdGhlIGZsb3cga2V5IHNlY2lkIHRvIHNldC4KQEAgLTEzNzMsMjUgKzEzNjUsMjQgQEAKIAlpbnQgKCppbmV0X2Nvbm5fcmVxdWVzdCkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpOwogCXZvaWQgKCppbmV0X2Nza19jbG9uZSkoc3RydWN0IHNvY2sgKm5ld3NrLCBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpOworCXZvaWQgKCppbmV0X2Nvbm5fZXN0YWJsaXNoZWQpKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJdm9pZCAoKnJlcV9jbGFzc2lmeV9mbG93KShjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHN0cnVjdCBmbG93aSAqZmwpOwogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLICovCiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCiAJaW50ICgqeGZybV9wb2xpY3lfYWxsb2Nfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLAotCQkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LCBzdHJ1Y3Qgc29jayAqc2spOworCQkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4KTsKIAlpbnQgKCp4ZnJtX3BvbGljeV9jbG9uZV9zZWN1cml0eSkgKHN0cnVjdCB4ZnJtX3BvbGljeSAqb2xkLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKm5ldyk7CiAJdm9pZCAoKnhmcm1fcG9saWN5X2ZyZWVfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKTsKIAlpbnQgKCp4ZnJtX3BvbGljeV9kZWxldGVfc2VjdXJpdHkpIChzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKTsKIAlpbnQgKCp4ZnJtX3N0YXRlX2FsbG9jX3NlY3VyaXR5KSAoc3RydWN0IHhmcm1fc3RhdGUgKngsCi0JCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sc2VjLAorCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgsCiAJCXUzMiBzZWNpZCk7CiAJdm9pZCAoKnhmcm1fc3RhdGVfZnJlZV9zZWN1cml0eSkgKHN0cnVjdCB4ZnJtX3N0YXRlICp4KTsKIAlpbnQgKCp4ZnJtX3N0YXRlX2RlbGV0ZV9zZWN1cml0eSkgKHN0cnVjdCB4ZnJtX3N0YXRlICp4KTsKIAlpbnQgKCp4ZnJtX3BvbGljeV9sb29rdXApKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHUzMiBmbF9zZWNpZCwgdTggZGlyKTsKIAlpbnQgKCp4ZnJtX3N0YXRlX3BvbF9mbG93X21hdGNoKShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwKIAkJCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCBmbG93aSAqZmwpOwotCWludCAoKnhmcm1fZmxvd19zdGF0ZV9tYXRjaCkoc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IHhmcm1fc3RhdGUgKnhmcm0sCi0JCQlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwKTsKIAlpbnQgKCp4ZnJtX2RlY29kZV9zZXNzaW9uKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKnNlY2lkLCBpbnQgY2thbGwpOwogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0gKi8KIApAQCAtMjk2Niw5ICsyOTU3LDE1IEBACiB7CiAJc2VjdXJpdHlfb3BzLT5pbmV0X2Nza19jbG9uZShuZXdzaywgcmVxKTsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2luZXRfY29ubl9lc3RhYmxpc2hlZChzdHJ1Y3Qgc29jayAqc2ssCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNlY3VyaXR5X29wcy0+aW5ldF9jb25uX2VzdGFibGlzaGVkKHNrLCBza2IpOworfQogI2Vsc2UJLyogQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3VuaXhfc3RyZWFtX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqIHNvY2ssCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc29ja2V0ICogb3RoZXIsIAorCQkJCQkgICAgICAgc3RydWN0IHNvY2tldCAqIG90aGVyLAogCQkJCQkgICAgICAgc3RydWN0IHNvY2sgKiBuZXdzaykKIHsKIAlyZXR1cm4gMDsKQEAgLTMxMTUsMTIgKzMxMTIsMTcgQEAKIAkJCWNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKIHsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIHNlY3VyaXR5X2luZXRfY29ubl9lc3RhYmxpc2hlZChzdHJ1Y3Qgc29jayAqc2ssCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworfQogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLICovCiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX3BvbGljeV9hbGxvYyhzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgpCiB7Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9wb2xpY3lfYWxsb2Nfc2VjdXJpdHkoeHAsIHNlY19jdHgsIE5VTEwpOworCXJldHVybiBzZWN1cml0eV9vcHMtPnhmcm1fcG9saWN5X2FsbG9jX3NlY3VyaXR5KHhwLCBzZWNfY3R4KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfeGZybV9wb2xpY3lfY2xvbmUoc3RydWN0IHhmcm1fcG9saWN5ICpvbGQsIHN0cnVjdCB4ZnJtX3BvbGljeSAqbmV3KQpAQCAtMzE0MSw3ICszMTQzLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fc3RhdGVfYWxsb2Moc3RydWN0IHhmcm1fc3RhdGUgKngsCiAJCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgpCiB7Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9zdGF0ZV9hbGxvY19zZWN1cml0eSh4LCBzZWNfY3R4LCBOVUxMLCAwKTsKKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3N0YXRlX2FsbG9jX3NlY3VyaXR5KHgsIHNlY19jdHgsIDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV94ZnJtX3N0YXRlX2FsbG9jX2FjcXVpcmUoc3RydWN0IHhmcm1fc3RhdGUgKngsCkBAIC0zMTQ5LDcgKzMxNTEsMTEgQEAKIHsKIAlpZiAoIXBvbHNlYykKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9zdGF0ZV9hbGxvY19zZWN1cml0eSh4LCBOVUxMLCBwb2xzZWMsIHNlY2lkKTsKKwkvKgorCSAqIFdlIHdhbnQgdGhlIGNvbnRleHQgdG8gYmUgdGFrZW4gZnJvbSBzZWNpZCB3aGljaCBpcyB1c3VhbGx5CisJICogZnJvbSB0aGUgc29jay4KKwkgKi8KKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3N0YXRlX2FsbG9jX3NlY3VyaXR5KHgsIE5VTEwsIHNlY2lkKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfeGZybV9zdGF0ZV9kZWxldGUoc3RydWN0IHhmcm1fc3RhdGUgKngpCkBAIC0zMTczLDEyICszMTc5LDYgQEAKIAlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX3N0YXRlX3BvbF9mbG93X21hdGNoKHgsIHhwLCBmbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLAotCQkJc3RydWN0IHhmcm1fc3RhdGUgKnhmcm0sIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHApCi17Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+eGZybV9mbG93X3N0YXRlX21hdGNoKGZsLCB4ZnJtLCB4cCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyICpzZWNpZCkKIHsKIAlyZXR1cm4gc2VjdXJpdHlfb3BzLT54ZnJtX2RlY29kZV9zZXNzaW9uKHNrYiwgc2VjaWQsIDEpOwpAQCAtMzI0MiwxMiArMzI0Miw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLAotCQkJc3RydWN0IHhmcm1fc3RhdGUgKnhmcm0sIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHApCi17Ci0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3hmcm1fZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyICpzZWNpZCkKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VxX2ZpbGUuaCBiL2luY2x1ZGUvbGludXgvc2VxX2ZpbGUuaAppbmRleCBiOTVmNmViLi4zZTNjY2NiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcV9maWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXFfZmlsZS5oCkBAIC0yMCw3ICsyMCw3IEBACiAJbG9mZl90IGluZGV4OwogCWxvZmZfdCB2ZXJzaW9uOwogCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3A7CisJY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zICpvcDsKIAl2b2lkICpwcml2YXRlOwogfTsKIApAQCAtMzEsNyArMzEsNyBAQAogCWludCAoKnNob3cpIChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOwogfTsKIAotaW50IHNlcV9vcGVuKHN0cnVjdCBmaWxlICosIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqKTsKK2ludCBzZXFfb3BlbihzdHJ1Y3QgZmlsZSAqLCBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgKik7CiBzc2l6ZV90IHNlcV9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogbG9mZl90IHNlcV9sc2VlayhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiBpbnQgc2VxX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXFsb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaAppbmRleCA0NjAwMDkzLi42YjA2NDhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcWxvY2suaApAQCAtNDQsOCArNDQsMTEgQEAKICNkZWZpbmUgU0VRTE9DS19VTkxPQ0tFRCBcCiAJCSBfX1NFUUxPQ0tfVU5MT0NLRUQob2xkX3N0eWxlX3NlcWxvY2tfaW5pdCkKIAotI2RlZmluZSBzZXFsb2NrX2luaXQoeCkgXAotCQlkbyB7ICooeCkgPSAoc2VxbG9ja190KSBfX1NFUUxPQ0tfVU5MT0NLRUQoeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNlcWxvY2tfaW5pdCh4KQkJCQkJXAorCWRvIHsJCQkJCQlcCisJCSh4KS0+c2VxdWVuY2UgPSAwOwkJCVwKKwkJc3Bpbl9sb2NrX2luaXQoJih4KS0+bG9jayk7CQlcCisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBERUZJTkVfU0VRTE9DSyh4KSBcCiAJCXNlcWxvY2tfdCB4ID0gX19TRVFMT0NLX1VOTE9DS0VEKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKaW5kZXggOGU5NjgxNC4uNzEzMTBkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaApAQCAtNDEsNiArNDEsNyBAQAogCVBMQVQ4MjUwX0RFVl9GT1VSUE9SVCwKIAlQTEFUODI1MF9ERVZfQUNDRU5ULAogCVBMQVQ4MjUwX0RFVl9CT0NBLAorCVBMQVQ4MjUwX0RFVl9FWEFSX1NUMTZDNTU0LAogCVBMQVQ4MjUwX0RFVl9IVUI2LAogCVBMQVQ4MjUwX0RFVl9NQ0EsCiAJUExBVDgyNTBfREVWX0FVMVgwMCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCA0NjNhYjk1Li5jZjIzODEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0xMzIsNiArMTMyLDggQEAKIAogI2RlZmluZSBQT1JUX1MzQzI0MTIJNzMKIAorLyogWGlsaW54IHVhcnRsaXRlICovCisjZGVmaW5lIFBPUlRfVUFSVExJVEUJNzQKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMTY0LDggKzE2Niw4IEBACiAJdm9pZAkJKCpicmVha19jdGwpKHN0cnVjdCB1YXJ0X3BvcnQgKiwgaW50IGN0bCk7CiAJaW50CQkoKnN0YXJ0dXApKHN0cnVjdCB1YXJ0X3BvcnQgKik7CiAJdm9pZAkJKCpzaHV0ZG93bikoc3RydWN0IHVhcnRfcG9ydCAqKTsKLQl2b2lkCQkoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdWFydF9wb3J0ICosIHN0cnVjdCB0ZXJtaW9zICpuZXcsCi0JCQkJICAgICAgIHN0cnVjdCB0ZXJtaW9zICpvbGQpOworCXZvaWQJCSgqc2V0X3Rlcm1pb3MpKHN0cnVjdCB1YXJ0X3BvcnQgKiwgc3RydWN0IGt0ZXJtaW9zICpuZXcsCisJCQkJICAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKTsKIAl2b2lkCQkoKnBtKShzdHJ1Y3QgdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCBzdGF0ZSwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBvbGRzdGF0ZSk7CiAJaW50CQkoKnNldF93YWtlKShzdHJ1Y3QgdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCBzdGF0ZSk7CkBAIC0zNTksOCArMzYxLDggQEAKICAqLwogdm9pZCB1YXJ0X3VwZGF0ZV90aW1lb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZywKIAkJCSB1bnNpZ25lZCBpbnQgYmF1ZCk7Ci11bnNpZ25lZCBpbnQgdWFydF9nZXRfYmF1ZF9yYXRlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLAotCQkJCXN0cnVjdCB0ZXJtaW9zICpvbGQsIHVuc2lnbmVkIGludCBtaW4sCit1bnNpZ25lZCBpbnQgdWFydF9nZXRfYmF1ZF9yYXRlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCwgdW5zaWduZWQgaW50IG1pbiwKIAkJCQl1bnNpZ25lZCBpbnQgbWF4KTsKIHVuc2lnbmVkIGludCB1YXJ0X2dldF9kaXZpc29yKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBiYXVkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpby5oIGIvaW5jbHVkZS9saW51eC9zZXJpby5oCmluZGV4IDNhNjk3Y2MuLjBmNDc4YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKQEAgLTQxLDYgKzQxLDcgQEAKIAl2b2lkICgqc3RvcCkoc3RydWN0IHNlcmlvICopOwogCiAJc3RydWN0IHNlcmlvICpwYXJlbnQsICpjaGlsZDsKKwl1bnNpZ25lZCBpbnQgZGVwdGg7CQkvKiBsZXZlbCBvZiBuZXN0aW5nIGluIHNlcmlvIGhpZXJhcmNoeSAqLwogCiAJc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2OwkvKiBhY2Nlc3NlZCBmcm9tIGludGVycnVwdCwgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgc2VyaW8tPmxvY2sgYW5kIHNlcmlvLT5zZW0gKi8KIAlzdHJ1Y3QgbXV0ZXggZHJ2X211dGV4OwkJLyogcHJvdGVjdHMgc2VyaW8tPmRydiBzbyBhdHRyaWJ1dGVzIGNhbiBwaW4gZHJpdmVyICovCkBAIC04NCwxOCArODUsOCBAQAogCiB2b2lkIHNlcmlvX3VucmVnaXN0ZXJfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKIHZvaWQgc2VyaW9fdW5yZWdpc3Rlcl9jaGlsZF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOwotdm9pZCBfX3NlcmlvX3VucmVnaXN0ZXJfcG9ydF9kZWxheWVkKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXJpb191bnJlZ2lzdGVyX3BvcnRfZGVsYXllZChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQotewotCV9fc2VyaW9fdW5yZWdpc3Rlcl9wb3J0X2RlbGF5ZWQoc2VyaW8sIFRISVNfTU9EVUxFKTsKLX0KIAotdm9pZCBfX3NlcmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQotewotCV9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUpOwotfQotCitpbnQgc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydik7CiB2b2lkIHNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydik7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlcmlvX3dyaXRlKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCmluZGV4IDExNzEzNWUuLjE0NzQ5MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaApAQCAtMjQxLDYgKzI0MSw4IEBACiBzdHJ1Y3QgcHRfcmVnczsKIGV4dGVybiBpbnQgZ2V0X3NpZ25hbF90b19kZWxpdmVyKHNpZ2luZm9fdCAqaW5mbywgc3RydWN0IGtfc2lnYWN0aW9uICpyZXR1cm5fa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB2b2lkICpjb29raWUpOwogCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnNpZ2hhbmRfY2FjaGVwOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX1NJR05BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCA4NTU3N2E0Li40ZmYzOTQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTIyLDEyICsyMiwxMCBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC90ZXh0c2VhcmNoLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KIAogI2RlZmluZSBIQVZFX0FMTE9DX1NLQgkJLyogRm9yIHRoZSBkcml2ZXJzIHRvIGtub3cgKi8KQEAgLTEzOSw3ICsxMzcsNyBAQAogCS8qIFdhcm5pbmc6IHRoaXMgZmllbGQgaXMgbm90IGFsd2F5cyBmaWxsZWQgaW4gKFVGTykhICovCiAJdW5zaWduZWQgc2hvcnQJZ3NvX3NlZ3M7CiAJdW5zaWduZWQgc2hvcnQgIGdzb190eXBlOwotCXVuc2lnbmVkIGludCAgICBpcDZfZnJhZ19pZDsKKwlfX2JlMzIgICAgICAgICAgaXA2X2ZyYWdfaWQ7CiAJc3RydWN0IHNrX2J1ZmYJKmZyYWdfbGlzdDsKIAlza2JfZnJhZ190CWZyYWdzW01BWF9TS0JfRlJBR1NdOwogfTsKQEAgLTIxNiw3ICsyMTQsNyBAQAogICoJQHRhaWw6IFRhaWwgcG9pbnRlcgogICoJQGVuZDogRW5kIHBvaW50ZXIKICAqCUBkZXN0cnVjdG9yOiBEZXN0cnVjdCBmdW5jdGlvbgotICoJQG5mbWFyazogQ2FuIGJlIHVzZWQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBob29rcworICoJQG1hcms6IEdlbmVyaWMgcGFja2V0IG1hcmsKICAqCUBuZmN0OiBBc3NvY2lhdGVkIGNvbm5lY3Rpb24sIGlmIGFueQogICoJQGlwdnNfcHJvcGVydHk6IHNrYnVmZiBpcyBvd25lZCBieSBpcHZzCiAgKglAbmZjdGluZm86IFJlbGF0aW9uc2hpcCBvZiB0aGlzIHNrYiB0byB0aGUgY29ubmVjdGlvbgpAQCAtMjczLDggKzI3MSwxMSBAQAogCiAJdW5zaWduZWQgaW50CQlsZW4sCiAJCQkJZGF0YV9sZW4sCi0JCQkJbWFjX2xlbiwKLQkJCQljc3VtOworCQkJCW1hY19sZW47CisJdW5pb24geworCQlfX3dzdW0JCWNzdW07CisJCV9fdTMyCQljc3VtX29mZnNldDsKKwl9OwogCV9fdTMyCQkJcHJpb3JpdHk7CiAJX191OAkJCWxvY2FsX2RmOjEsCiAJCQkJY2xvbmVkOjEsCkBAIC0yOTUsNyArMjk2LDYgQEAKICNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgogCXN0cnVjdCBuZl9icmlkZ2VfaW5mbwkqbmZfYnJpZGdlOwogI2VuZGlmCi0JX191MzIJCQluZm1hcms7CiAjZW5kaWYgLyogQ09ORklHX05FVEZJTFRFUiAqLwogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAlfX3UxNgkJCXRjX2luZGV4OwkvKiB0cmFmZmljIGNvbnRyb2wgaW5kZXggKi8KQEAgLTMxMCw2ICszMTAsNyBAQAogCV9fdTMyCQkJc2VjbWFyazsKICNlbmRpZgogCisJX191MzIJCQltYXJrOwogCiAJLyogVGhlc2UgZWxlbWVudHMgbXVzdCBiZSBhdCB0aGUgZW5kLCBzZWUgYWxsb2Nfc2tiKCkgZm9yIGRldGFpbHMuICAqLwogCXVuc2lnbmVkIGludAkJdHJ1ZXNpemU7CkBAIC0zMzEsMjAgKzMzMiwyMCBAQAogZXh0ZXJuIHZvaWQga2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHZvaWQJICAgICAgIF9fa2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHN0cnVjdCBza19idWZmICpfX2FsbG9jX3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkgICBnZnBfdCBwcmlvcml0eSwgaW50IGZjbG9uZSk7CisJCQkJICAgZ2ZwX3QgcHJpb3JpdHksIGludCBmY2xvbmUsIGludCBub2RlKTsKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmFsbG9jX3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCQkJZ2ZwX3QgcHJpb3JpdHkpCiB7Ci0JcmV0dXJuIF9fYWxsb2Nfc2tiKHNpemUsIHByaW9yaXR5LCAwKTsKKwlyZXR1cm4gX19hbGxvY19za2Ioc2l6ZSwgcHJpb3JpdHksIDAsIC0xKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiX2ZjbG9uZSh1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCQkJICAgICAgIGdmcF90IHByaW9yaXR5KQogewotCXJldHVybiBfX2FsbG9jX3NrYihzaXplLCBwcmlvcml0eSwgMSk7CisJcmV0dXJuIF9fYWxsb2Nfc2tiKHNpemUsIHByaW9yaXR5LCAxLCAtMSk7CiB9CiAKLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiX2Zyb21fY2FjaGUoa21lbV9jYWNoZV90ICpjcCwKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiX2Zyb21fY2FjaGUoc3RydWN0IGttZW1fY2FjaGUgKmNwLAogCQkJCQkgICAgdW5zaWduZWQgaW50IHNpemUsCiAJCQkJCSAgICBnZnBfdCBwcmlvcml0eSk7CiBleHRlcm4gdm9pZAkgICAgICAga2ZyZWVfc2tibWVtKHN0cnVjdCBza19idWZmICpza2IpOwpAQCAtMTE5OSw4ICsxMjAwLDcgQEAKIAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9OT05FKSB7CiAJCWludCBlcnIgPSAwOwotCQl1bnNpZ25lZCBpbnQgY3N1bSA9IGNzdW1fYW5kX2NvcHlfZnJvbV91c2VyKGZyb20sCi0JCQkJCQkJICAgIHNrYl9wdXQoc2tiLCBjb3B5KSwKKwkJX193c3VtIGNzdW0gPSBjc3VtX2FuZF9jb3B5X2Zyb21fdXNlcihmcm9tLCBza2JfcHV0KHNrYiwgY29weSksCiAJCQkJCQkJICAgIGNvcHksIDAsICZlcnIpOwogCQlpZiAoIWVycikgewogCQkJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLCBjc3VtLCBvZmYpOwpAQCAtMTI5MywyNCArMTI5Myw2IEBACiAJcmV0dXJuIF9fcHNrYl90cmltKHNrYiwgbGVuKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICprbWFwX3NrYl9mcmFnKGNvbnN0IHNrYl9mcmFnX3QgKmZyYWcpCi17Ci0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLQlCVUdfT04oaW5faXJxKCkpOwotCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotI2VuZGlmCi0JcmV0dXJuIGttYXBfYXRvbWljKGZyYWctPnBhZ2UsIEtNX1NLQl9EQVRBX1NPRlRJUlEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQga3VubWFwX3NrYl9mcmFnKHZvaWQgKnZhZGRyKQotewotCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1NLQl9EQVRBX1NPRlRJUlEpOwotI2lmZGVmIENPTkZJR19ISUdITUVNCi0JbG9jYWxfYmhfZW5hYmxlKCk7Ci0jZW5kaWYKLX0KLQogI2RlZmluZSBza2JfcXVldWVfd2FsayhxdWV1ZSwgc2tiKSBcCiAJCWZvciAoc2tiID0gKHF1ZXVlKS0+bmV4dDsJCQkJCVwKIAkJICAgICBwcmVmZXRjaChza2ItPm5leHQpLCAoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKShxdWV1ZSkpOwlcCkBAIC0xMzM1LDE1ICsxMzE3LDE1IEBACiBleHRlcm4gdm9pZAkgICAgICAgc2tiX2ZyZWVfZGF0YWdyYW0oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiB2b2lkCSAgICAgICBza2Jfa2lsbF9kYXRhZ3JhbShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotZXh0ZXJuIHVuc2lnbmVkIGludCAgICBza2JfY2hlY2tzdW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKLQkJCQkgICAgaW50IGxlbiwgdW5zaWduZWQgaW50IGNzdW0pOworZXh0ZXJuIF9fd3N1bQkgICAgICAgc2tiX2NoZWNrc3VtKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCisJCQkJICAgIGludCBsZW4sIF9fd3N1bSBjc3VtKTsKIGV4dGVybiBpbnQJICAgICAgIHNrYl9jb3B5X2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKIAkJCQkgICAgIHZvaWQgKnRvLCBpbnQgbGVuKTsKIGV4dGVybiBpbnQJICAgICAgIHNrYl9zdG9yZV9iaXRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCiAJCQkJICAgICAgdm9pZCAqZnJvbSwgaW50IGxlbik7Ci1leHRlcm4gdW5zaWduZWQgaW50ICAgIHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2V4dGVybiBfX3dzdW0JICAgICAgIHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgICAgaW50IG9mZnNldCwgdTggKnRvLCBpbnQgbGVuLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3N1bSk7CisJCQkJCSAgICAgIF9fd3N1bSBjc3VtKTsKIGV4dGVybiB2b2lkCSAgICAgICBza2JfY29weV9hbmRfY3N1bV9kZXYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnRvKTsKIGV4dGVybiB2b2lkCSAgICAgICBza2Jfc3BsaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYjEsIGNvbnN0IHUzMiBsZW4pOwpAQCAtMTM5OSw3ICsxMzgxLDcgQEAKIAogZXh0ZXJuIHZvaWQgX19uZXRfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IpOwogCi1leHRlcm4gdW5zaWduZWQgaW50IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIF9fc3VtMTYgX19za2JfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qKgogICoJc2tiX2NoZWNrc3VtX2NvbXBsZXRlIC0gQ2FsY3VsYXRlIGNoZWNrc3VtIG9mIGFuIGVudGlyZSBwYWNrZXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggYzQ5NDdiOC4uMWVmODIyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTEsODIgKzEsMTA2IEBACiAvKgotICogbGludXgvaW5jbHVkZS9saW51eC9zbGFiLmgKLSAqIFdyaXR0ZW4gYnkgTWFyayBIZW1tZW50LCAxOTk2LgotICogKG1hcmtoZUBuZXh0ZC5kZW1vbi5jby51aykKKyAqIFdyaXR0ZW4gYnkgTWFyayBIZW1tZW50LCAxOTk2IChtYXJraGVAbmV4dGQuZGVtb24uY28udWspLgorICoKKyAqIChDKSBTR0kgMjAwNiwgQ2hyaXN0b3BoIExhbWV0ZXIgPGNsYW1ldGVyQHNnaS5jb20+CisgKiAJQ2xlYW5lZCB1cCBhbmQgcmVzdHJ1Y3R1cmVkIHRvIGVhc2UgdGhlIGFkZGl0aW9uIG9mIGFsdGVybmF0aXZlCisgKiAJaW1wbGVtZW50YXRpb25zIG9mIFNMQUIgYWxsb2NhdG9ycy4KICAqLwogCiAjaWZuZGVmIF9MSU5VWF9TTEFCX0gKICNkZWZpbmUJX0xJTlVYX1NMQUJfSAogCi0jaWYJZGVmaW5lZChfX0tFUk5FTF9fKQorI2lmZGVmIF9fS0VSTkVMX18KIAotdHlwZWRlZiBzdHJ1Y3Qga21lbV9jYWNoZSBrbWVtX2NhY2hlX3Q7CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI2luY2x1ZGUJPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUJPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlCTxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUJPGFzbS9wYWdlLmg+CQkvKiBrbWFsbG9jX3NpemVzLmggbmVlZHMgUEFHRV9TSVpFICovCi0jaW5jbHVkZQk8YXNtL2NhY2hlLmg+CQkvKiBrbWFsbG9jX3NpemVzLmggbmVlZHMgTDFfQ0FDSEVfQllURVMgKi8KK3R5cGVkZWYgc3RydWN0IGttZW1fY2FjaGUga21lbV9jYWNoZV90IF9fZGVwcmVjYXRlZDsKIAotLyogZmxhZ3MgZm9yIGttZW1fY2FjaGVfYWxsb2MoKSAqLwotI2RlZmluZQlTTEFCX05PRlMJCUdGUF9OT0ZTCi0jZGVmaW5lCVNMQUJfTk9JTwkJR0ZQX05PSU8KLSNkZWZpbmUJU0xBQl9BVE9NSUMJCUdGUF9BVE9NSUMKLSNkZWZpbmUJU0xBQl9VU0VSCQlHRlBfVVNFUgotI2RlZmluZQlTTEFCX0tFUk5FTAkJR0ZQX0tFUk5FTAotI2RlZmluZQlTTEFCX0RNQQkJR0ZQX0RNQQotCi0jZGVmaW5lIFNMQUJfTEVWRUxfTUFTSwkJR0ZQX0xFVkVMX01BU0sKLQotI2RlZmluZQlTTEFCX05PX0dST1cJCV9fR0ZQX05PX0dST1cJLyogZG9uJ3QgZ3JvdyBhIGNhY2hlICovCi0KLS8qIGZsYWdzIHRvIHBhc3MgdG8ga21lbV9jYWNoZV9jcmVhdGUoKS4KLSAqIFRoZSBmaXJzdCAzIGFyZSBvbmx5IHZhbGlkIHdoZW4gdGhlIGFsbG9jYXRvciBhcyBiZWVuIGJ1aWxkCi0gKiBTTEFCX0RFQlVHX1NVUFBPUlQuCisvKgorICogRmxhZ3MgdG8gcGFzcyB0byBrbWVtX2NhY2hlX2NyZWF0ZSgpLgorICogVGhlIG9uZXMgbWFya2VkIERFQlVHIGFyZSBvbmx5IHZhbGlkIGlmIENPTkZJR19TTEFCX0RFQlVHIGlzIHNldC4KICAqLwotI2RlZmluZQlTTEFCX0RFQlVHX0ZSRUUJCTB4MDAwMDAxMDBVTAkvKiBQZWZvcm0gKGV4cGVuc2l2ZSkgY2hlY2tzIG9uIGZyZWUgKi8KLSNkZWZpbmUJU0xBQl9ERUJVR19JTklUSUFMCTB4MDAwMDAyMDBVTAkvKiBDYWxsIGNvbnN0cnVjdG9yIChhcyB2ZXJpZmllcikgKi8KLSNkZWZpbmUJU0xBQl9SRURfWk9ORQkJMHgwMDAwMDQwMFVMCS8qIFJlZCB6b25lIG9ianMgaW4gYSBjYWNoZSAqLwotI2RlZmluZQlTTEFCX1BPSVNPTgkJMHgwMDAwMDgwMFVMCS8qIFBvaXNvbiBvYmplY3RzICovCi0jZGVmaW5lCVNMQUJfSFdDQUNIRV9BTElHTgkweDAwMDAyMDAwVUwJLyogYWxpZ24gb2JqcyBvbiBhIGgvdyBjYWNoZSBsaW5lcyAqLwotI2RlZmluZSBTTEFCX0NBQ0hFX0RNQQkJMHgwMDAwNDAwMFVMCS8qIHVzZSBHRlBfRE1BIG1lbW9yeSAqLwotI2RlZmluZSBTTEFCX01VU1RfSFdDQUNIRV9BTElHTgkweDAwMDA4MDAwVUwJLyogZm9yY2UgYWxpZ25tZW50ICovCi0jZGVmaW5lIFNMQUJfU1RPUkVfVVNFUgkJMHgwMDAxMDAwMFVMCS8qIHN0b3JlIHRoZSBsYXN0IG93bmVyIGZvciBidWcgaHVudGluZyAqLwotI2RlZmluZSBTTEFCX1JFQ0xBSU1fQUNDT1VOVAkweDAwMDIwMDAwVUwJLyogdHJhY2sgcGFnZXMgYWxsb2NhdGVkIHRvIGluZGljYXRlCi0JCQkJCQkgICB3aGF0IGlzIHJlY2xhaW1hYmxlIGxhdGVyKi8KLSNkZWZpbmUgU0xBQl9QQU5JQwkJMHgwMDA0MDAwMFVMCS8qIHBhbmljIGlmIGttZW1fY2FjaGVfY3JlYXRlKCkgZmFpbHMgKi8KLSNkZWZpbmUgU0xBQl9ERVNUUk9ZX0JZX1JDVQkweDAwMDgwMDAwVUwJLyogZGVmZXIgZnJlZWluZyBwYWdlcyB0byBSQ1UgKi8KKyNkZWZpbmUgU0xBQl9ERUJVR19GUkVFCQkweDAwMDAwMTAwVUwJLyogREVCVUc6IFBlcmZvcm0gKGV4cGVuc2l2ZSkgY2hlY2tzIG9uIGZyZWUgKi8KKyNkZWZpbmUgU0xBQl9ERUJVR19JTklUSUFMCTB4MDAwMDAyMDBVTAkvKiBERUJVRzogQ2FsbCBjb25zdHJ1Y3RvciAoYXMgdmVyaWZpZXIpICovCisjZGVmaW5lIFNMQUJfUkVEX1pPTkUJCTB4MDAwMDA0MDBVTAkvKiBERUJVRzogUmVkIHpvbmUgb2JqcyBpbiBhIGNhY2hlICovCisjZGVmaW5lIFNMQUJfUE9JU09OCQkweDAwMDAwODAwVUwJLyogREVCVUc6IFBvaXNvbiBvYmplY3RzICovCisjZGVmaW5lIFNMQUJfSFdDQUNIRV9BTElHTgkweDAwMDAyMDAwVUwJLyogQWxpZ24gb2JqcyBvbiBjYWNoZSBsaW5lcyAqLworI2RlZmluZSBTTEFCX0NBQ0hFX0RNQQkJMHgwMDAwNDAwMFVMCS8qIFVzZSBHRlBfRE1BIG1lbW9yeSAqLworI2RlZmluZSBTTEFCX01VU1RfSFdDQUNIRV9BTElHTgkweDAwMDA4MDAwVUwJLyogRm9yY2UgYWxpZ25tZW50IGV2ZW4gaWYgZGVidWdnaW4gaXMgYWN0aXZlICovCisjZGVmaW5lIFNMQUJfU1RPUkVfVVNFUgkJMHgwMDAxMDAwMFVMCS8qIERFQlVHOiBTdG9yZSB0aGUgbGFzdCBvd25lciBmb3IgYnVnIGh1bnRpbmcgKi8KKyNkZWZpbmUgU0xBQl9SRUNMQUlNX0FDQ09VTlQJMHgwMDAyMDAwMFVMCS8qIE9iamVjdHMgYXJlIHJlY2xhaW1hYmxlICovCisjZGVmaW5lIFNMQUJfUEFOSUMJCTB4MDAwNDAwMDBVTAkvKiBQYW5pYyBpZiBrbWVtX2NhY2hlX2NyZWF0ZSgpIGZhaWxzICovCisjZGVmaW5lIFNMQUJfREVTVFJPWV9CWV9SQ1UJMHgwMDA4MDAwMFVMCS8qIERlZmVyIGZyZWVpbmcgc2xhYnMgdG8gUkNVICovCiAjZGVmaW5lIFNMQUJfTUVNX1NQUkVBRAkJMHgwMDEwMDAwMFVMCS8qIFNwcmVhZCBzb21lIG1lbW9yeSBvdmVyIGNwdXNldCAqLwogCi0vKiBmbGFncyBwYXNzZWQgdG8gYSBjb25zdHJ1Y3RvciBmdW5jICovCi0jZGVmaW5lCVNMQUJfQ1RPUl9DT05TVFJVQ1RPUgkweDAwMVVMCQkvKiBpZiBub3Qgc2V0LCB0aGVuIGRlY29uc3RydWN0b3IgKi8KLSNkZWZpbmUgU0xBQl9DVE9SX0FUT01JQwkweDAwMlVMCQkvKiB0ZWxsIGNvbnN0cnVjdG9yIGl0IGNhbid0IHNsZWVwICovCi0jZGVmaW5lCVNMQUJfQ1RPUl9WRVJJRlkJMHgwMDRVTAkJLyogdGVsbCBjb25zdHJ1Y3RvciBpdCdzIGEgdmVyaWZ5IGNhbGwgKi8KKy8qIEZsYWdzIHBhc3NlZCB0byBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyAqLworI2RlZmluZSBTTEFCX0NUT1JfQ09OU1RSVUNUT1IJMHgwMDFVTAkJLyogSWYgbm90IHNldCwgdGhlbiBkZWNvbnN0cnVjdG9yICovCisjZGVmaW5lIFNMQUJfQ1RPUl9BVE9NSUMJMHgwMDJVTAkJLyogVGVsbCBjb25zdHJ1Y3RvciBpdCBjYW4ndCBzbGVlcCAqLworI2RlZmluZSBTTEFCX0NUT1JfVkVSSUZZCTB4MDA0VUwJCS8qIFRlbGwgY29uc3RydWN0b3IgaXQncyBhIHZlcmlmeSBjYWxsICovCiAKLSNpZm5kZWYgQ09ORklHX1NMT0IKKy8qCisgKiBzdHJ1Y3Qga21lbV9jYWNoZSByZWxhdGVkIHByb3RvdHlwZXMKKyAqLwordm9pZCBfX2luaXQga21lbV9jYWNoZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBzbGFiX2lzX2F2YWlsYWJsZSh2b2lkKTsKIAotLyogcHJvdG90eXBlcyAqLwotZXh0ZXJuIHZvaWQgX19pbml0IGttZW1fY2FjaGVfaW5pdCh2b2lkKTsKK3N0cnVjdCBrbWVtX2NhY2hlICprbWVtX2NhY2hlX2NyZWF0ZShjb25zdCBjaGFyICosIHNpemVfdCwgc2l6ZV90LAorCQkJdW5zaWduZWQgbG9uZywKKwkJCXZvaWQgKCopKHZvaWQgKiwgc3RydWN0IGttZW1fY2FjaGUgKiwgdW5zaWduZWQgbG9uZyksCisJCQl2b2lkICgqKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpKTsKK3ZvaWQga21lbV9jYWNoZV9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICopOworaW50IGttZW1fY2FjaGVfc2hyaW5rKHN0cnVjdCBrbWVtX2NhY2hlICopOwordm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7Cit2b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7Cit2b2lkIGttZW1fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCB2b2lkICopOwordW5zaWduZWQgaW50IGttZW1fY2FjaGVfc2l6ZShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKK2NvbnN0IGNoYXIgKmttZW1fY2FjaGVfbmFtZShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKK2ludCBrbWVtX3B0cl92YWxpZGF0ZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBjb25zdCB2b2lkICpwdHIpOwogCi1leHRlcm4ga21lbV9jYWNoZV90ICprbWVtX2NhY2hlX2NyZWF0ZShjb25zdCBjaGFyICosIHNpemVfdCwgc2l6ZV90LCB1bnNpZ25lZCBsb25nLAotCQkJCSAgICAgICB2b2lkICgqKSh2b2lkICosIGttZW1fY2FjaGVfdCAqLCB1bnNpZ25lZCBsb25nKSwKLQkJCQkgICAgICAgdm9pZCAoKikodm9pZCAqLCBrbWVtX2NhY2hlX3QgKiwgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIHZvaWQga21lbV9jYWNoZV9kZXN0cm95KGttZW1fY2FjaGVfdCAqKTsKLWV4dGVybiBpbnQga21lbV9jYWNoZV9zaHJpbmsoa21lbV9jYWNoZV90ICopOwotZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moa21lbV9jYWNoZV90ICosIGdmcF90KTsKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7Ci1leHRlcm4gdm9pZCBrbWVtX2NhY2hlX2ZyZWUoa21lbV9jYWNoZV90ICosIHZvaWQgKik7Ci1leHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2FjaGVfc2l6ZShrbWVtX2NhY2hlX3QgKik7Ci1leHRlcm4gY29uc3QgY2hhciAqa21lbV9jYWNoZV9uYW1lKGttZW1fY2FjaGVfdCAqKTsKKyNpZmRlZiBDT05GSUdfTlVNQQorZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCisJCQkJCWdmcF90IGZsYWdzLCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKK30KKyNlbmRpZgogCi0vKiBTaXplIGRlc2NyaXB0aW9uIHN0cnVjdCBmb3IgZ2VuZXJhbCBjYWNoZXMuICovCi1zdHJ1Y3QgY2FjaGVfc2l6ZXMgewotCXNpemVfdAkJIGNzX3NpemU7Ci0Ja21lbV9jYWNoZV90CSpjc19jYWNoZXA7Ci0Ja21lbV9jYWNoZV90CSpjc19kbWFjYWNoZXA7Ci19OwotZXh0ZXJuIHN0cnVjdCBjYWNoZV9zaXplcyBtYWxsb2Nfc2l6ZXNbXTsKKy8qCisgKiBDb21tb24ga21hbGxvYyBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgYWxsIGFsbG9jYXRvcnMKKyAqLwordm9pZCAqX19rbWFsbG9jKHNpemVfdCwgZ2ZwX3QpOwordm9pZCAqX19remFsbG9jKHNpemVfdCwgZ2ZwX3QpOwordm9pZCBrZnJlZShjb25zdCB2b2lkICopOwordW5zaWduZWQgaW50IGtzaXplKGNvbnN0IHZvaWQgKik7CiAKLWV4dGVybiB2b2lkICpfX2ttYWxsb2Moc2l6ZV90LCBnZnBfdCk7CisvKioKKyAqIGtjYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgorICogQG46IG51bWJlciBvZiBlbGVtZW50cy4KKyAqIEBzaXplOiBlbGVtZW50IHNpemUuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICprY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJaWYgKG4gIT0gMCAmJiBzaXplID4gVUxPTkdfTUFYIC8gbikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIF9fa3phbGxvYyhuICogc2l6ZSwgZmxhZ3MpOworfQorCisvKgorICogQWxsb2NhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zLiBUaGVzZSBhcmUgbWFpbmx5IHVzZWQgdG8gZXN0YWJsaXNoIG9wdGltaXplZAorICogd2F5cyB0byBjb252ZXJ0IGttYWxsb2MoKSBjYWxscyB0byBrbWVtX2NhY2hlX2FsbG9jKCkgaW52b2NhdGlvbnMgYnkgc2VsZWN0aW5nCisgKiB0aGUgYXBwcm9wcmlhdGUgZ2VuZXJhbCBjYWNoZSBhdCBjb21waWxlIHRpbWUuCisgKi8KKworI2lmZGVmIENPTkZJR19TTEFCCisjaW5jbHVkZSA8bGludXgvc2xhYl9kZWYuaD4KKyNlbHNlCisvKgorICogRmFsbGJhY2sgZGVmaW5pdGlvbnMgZm9yIGFuIGFsbG9jYXRvciBub3Qgd2FudGluZyB0byBwcm92aWRlCisgKiBpdHMgb3duIG9wdGltaXplZCBrbWFsbG9jIGRlZmluaXRpb25zIChsaWtlIFNMT0IpLgorICovCiAKIC8qKgogICoga21hbGxvYyAtIGFsbG9jYXRlIG1lbW9yeQpAQCAtMTI1LDI3ICsxNDksMzIgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKIHsKLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKLQkJaW50IGkgPSAwOwotI2RlZmluZSBDQUNIRSh4KSBcCi0JCWlmIChzaXplIDw9IHgpIFwKLQkJCWdvdG8gZm91bmQ7IFwKLQkJZWxzZSBcCi0JCQlpKys7Ci0jaW5jbHVkZSAia21hbGxvY19zaXplcy5oIgotI3VuZGVmIENBQ0hFCi0JCXsKLQkJCWV4dGVybiB2b2lkIF9feW91X2Nhbm5vdF9rbWFsbG9jX3RoYXRfbXVjaCh2b2lkKTsKLQkJCV9feW91X2Nhbm5vdF9rbWFsbG9jX3RoYXRfbXVjaCgpOwotCQl9Ci1mb3VuZDoKLQkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoKGZsYWdzICYgR0ZQX0RNQSkgPwotCQkJbWFsbG9jX3NpemVzW2ldLmNzX2RtYWNhY2hlcCA6Ci0JCQltYWxsb2Nfc2l6ZXNbaV0uY3NfY2FjaGVwLCBmbGFncyk7Ci0JfQogCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwogfQogCisvKioKKyAqIGt6YWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCisgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga21hbGxvYykuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIF9fa3phbGxvYyhzaXplLCBmbGFncyk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfTlVNQQorc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKK30KKyNlbmRpZiAvKiAhQ09ORklHX05VTUEgKi8KKwogLyoKICAqIGttYWxsb2NfdHJhY2tfY2FsbGVyIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGttYWxsb2MgdGhhdCByZWNvcmRzIHRoZQogICogY2FsbGluZyBmdW5jdGlvbiBvZiB0aGUgcm91dGluZSBjYWxsaW5nIGl0IGZvciBzbGFiIGxlYWsgdHJhY2tpbmcgaW5zdGVhZApAQCAtMTU0LDE0NiArMTgzLDQxIEBACiAgKiBhbGxvY2F0b3Igd2hlcmUgd2UgY2FyZSBhYm91dCB0aGUgcmVhbCBwbGFjZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24KICAqIHJlcXVlc3QgY29tZXMgZnJvbS4KICAqLwotI2lmbmRlZiBDT05GSUdfREVCVUdfU0xBQgotI2RlZmluZSBrbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncykgXAotCV9fa21hbGxvYyhzaXplLCBmbGFncykKLSNlbHNlCisjaWZkZWYgQ09ORklHX0RFQlVHX1NMQUIKIGV4dGVybiB2b2lkICpfX2ttYWxsb2NfdHJhY2tfY2FsbGVyKHNpemVfdCwgZ2ZwX3QsIHZvaWQqKTsKICNkZWZpbmUga21hbGxvY190cmFja19jYWxsZXIoc2l6ZSwgZmxhZ3MpIFwKIAlfX2ttYWxsb2NfdHJhY2tfY2FsbGVyKHNpemUsIGZsYWdzLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgKl9fa3phbGxvYyhzaXplX3QsIGdmcF90KTsKLQotLyoqCi0gKiBremFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgotICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGttYWxsb2MpLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewotCQlpbnQgaSA9IDA7Ci0jZGVmaW5lIENBQ0hFKHgpIFwKLQkJaWYgKHNpemUgPD0geCkgXAotCQkJZ290byBmb3VuZDsgXAotCQllbHNlIFwKLQkJCWkrKzsKLSNpbmNsdWRlICJrbWFsbG9jX3NpemVzLmgiCi0jdW5kZWYgQ0FDSEUKLQkJewotCQkJZXh0ZXJuIHZvaWQgX195b3VfY2Fubm90X2t6YWxsb2NfdGhhdF9tdWNoKHZvaWQpOwotCQkJX195b3VfY2Fubm90X2t6YWxsb2NfdGhhdF9tdWNoKCk7Ci0JCX0KLWZvdW5kOgotCQlyZXR1cm4ga21lbV9jYWNoZV96YWxsb2MoKGZsYWdzICYgR0ZQX0RNQSkgPwotCQkJbWFsbG9jX3NpemVzW2ldLmNzX2RtYWNhY2hlcCA6Ci0JCQltYWxsb2Nfc2l6ZXNbaV0uY3NfY2FjaGVwLCBmbGFncyk7Ci0JfQotCXJldHVybiBfX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpOwotfQotCi0vKioKLSAqIGtjYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgotICogQG46IG51bWJlciBvZiBlbGVtZW50cy4KLSAqIEBzaXplOiBlbGVtZW50IHNpemUuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkICprY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0JaWYgKG4gIT0gMCAmJiBzaXplID4gVUxPTkdfTUFYIC8gbikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGt6YWxsb2MobiAqIHNpemUsIGZsYWdzKTsKLX0KLQotZXh0ZXJuIHZvaWQga2ZyZWUoY29uc3Qgdm9pZCAqKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQga3NpemUoY29uc3Qgdm9pZCAqKTsKLWV4dGVybiBpbnQgc2xhYl9pc19hdmFpbGFibGUodm9pZCk7CisjZWxzZQorI2RlZmluZSBrbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncykgXAorCV9fa21hbGxvYyhzaXplLCBmbGFncykKKyNlbmRpZiAvKiBERUJVR19TTEFCICovCiAKICNpZmRlZiBDT05GSUdfTlVNQQotZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShrbWVtX2NhY2hlX3QgKiwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKLWV4dGVybiB2b2lkICpfX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKLQotc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKLXsKLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKLQkJaW50IGkgPSAwOwotI2RlZmluZSBDQUNIRSh4KSBcCi0JCWlmIChzaXplIDw9IHgpIFwKLQkJCWdvdG8gZm91bmQ7IFwKLQkJZWxzZSBcCi0JCQlpKys7Ci0jaW5jbHVkZSAia21hbGxvY19zaXplcy5oIgotI3VuZGVmIENBQ0hFCi0JCXsKLQkJCWV4dGVybiB2b2lkIF9feW91X2Nhbm5vdF9rbWFsbG9jX3RoYXRfbXVjaCh2b2lkKTsKLQkJCV9feW91X2Nhbm5vdF9rbWFsbG9jX3RoYXRfbXVjaCgpOwotCQl9Ci1mb3VuZDoKLQkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZSgoZmxhZ3MgJiBHRlBfRE1BKSA/Ci0JCQltYWxsb2Nfc2l6ZXNbaV0uY3NfZG1hY2FjaGVwIDoKLQkJCW1hbGxvY19zaXplc1tpXS5jc19jYWNoZXAsIGZsYWdzLCBub2RlKTsKLQl9Ci0JcmV0dXJuIF9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCBub2RlKTsKLX0KKy8qCisgKiBrbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGttYWxsb2Nfbm9kZSB0aGF0CisgKiByZWNvcmRzIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIG9mIHRoZSByb3V0aW5lIGNhbGxpbmcgaXQgZm9yIHNsYWIgbGVhaworICogdHJhY2tpbmcgaW5zdGVhZCBvZiBqdXN0IHRoZSBjYWxsaW5nIGZ1bmN0aW9uIChjb25mdXNpbmcsIGVoPykuCisgKiBJdCdzIHVzZWZ1bCB3aGVuIHRoZSBjYWxsIHRvIGttYWxsb2Nfbm9kZSBjb21lcyBmcm9tIGEgd2lkZWx5LXVzZWQKKyAqIHN0YW5kYXJkIGFsbG9jYXRvciB3aGVyZSB3ZSBjYXJlIGFib3V0IHRoZSByZWFsIHBsYWNlIHRoZSBtZW1vcnkKKyAqIGFsbG9jYXRpb24gcmVxdWVzdCBjb21lcyBmcm9tLgorICovCisjaWZkZWYgQ09ORklHX0RFQlVHX1NMQUIKK2V4dGVybiB2b2lkICpfX2ttYWxsb2Nfbm9kZV90cmFja19jYWxsZXIoc2l6ZV90LCBnZnBfdCwgaW50LCB2b2lkICopOworI2RlZmluZSBrbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyKHNpemUsIGZsYWdzLCBub2RlKSBcCisJX19rbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyKHNpemUsIGZsYWdzLCBub2RlLCBcCisJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoa21lbV9jYWNoZV90ICpjYWNoZXAsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKLXsKLQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCi17Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOwotfQorI2RlZmluZSBrbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyKHNpemUsIGZsYWdzLCBub2RlKSBcCisJX19rbWFsbG9jX25vZGUoc2l6ZSwgZmxhZ3MsIG5vZGUpCiAjZW5kaWYKIAotZXh0ZXJuIGludCBGQVNUQ0FMTChrbWVtX2NhY2hlX3JlYXAoaW50KSk7Ci1leHRlcm4gaW50IEZBU1RDQUxMKGttZW1fcHRyX3ZhbGlkYXRlKGttZW1fY2FjaGVfdCAqY2FjaGVwLCB2b2lkICpwdHIpKTsKKyNlbHNlIC8qIENPTkZJR19OVU1BICovCiAKLSNlbHNlIC8qIENPTkZJR19TTE9CICovCisjZGVmaW5lIGttYWxsb2Nfbm9kZV90cmFja19jYWxsZXIoc2l6ZSwgZmxhZ3MsIG5vZGUpIFwKKwlrbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncykKIAotLyogU0xPQiBhbGxvY2F0b3Igcm91dGluZXMgKi8KLQotdm9pZCBrbWVtX2NhY2hlX2luaXQodm9pZCk7Ci1zdHJ1Y3Qga21lbV9jYWNoZSAqa21lbV9jYWNoZV9jcmVhdGUoY29uc3QgY2hhciAqYywgc2l6ZV90LCBzaXplX3QsCi0JdW5zaWduZWQgbG9uZywKLQl2b2lkICgqKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpLAotCXZvaWQgKCopKHZvaWQgKiwgc3RydWN0IGttZW1fY2FjaGUgKiwgdW5zaWduZWQgbG9uZykpOwotdm9pZCBrbWVtX2NhY2hlX2Rlc3Ryb3koc3RydWN0IGttZW1fY2FjaGUgKmMpOwotdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqYywgZ2ZwX3QgZmxhZ3MpOwotdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwotdm9pZCBrbWVtX2NhY2hlX2ZyZWUoc3RydWN0IGttZW1fY2FjaGUgKmMsIHZvaWQgKmIpOwotY29uc3QgY2hhciAqa21lbV9jYWNoZV9uYW1lKHN0cnVjdCBrbWVtX2NhY2hlICopOwotdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwotdm9pZCAqX19remFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7Ci12b2lkIGtmcmVlKGNvbnN0IHZvaWQgKm0pOwotdW5zaWduZWQgaW50IGtzaXplKGNvbnN0IHZvaWQgKm0pOwotdW5zaWduZWQgaW50IGttZW1fY2FjaGVfc2l6ZShzdHJ1Y3Qga21lbV9jYWNoZSAqYyk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqa2NhbGxvYyhzaXplX3Qgbiwgc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCXJldHVybiBfX2t6YWxsb2MobiAqIHNpemUsIGZsYWdzKTsKLX0KLQotI2RlZmluZSBrbWVtX2NhY2hlX3NocmluayhkKSAoMCkKLSNkZWZpbmUga21lbV9jYWNoZV9yZWFwKGEpCi0jZGVmaW5lIGttZW1fcHRyX3ZhbGlkYXRlKGEsIGIpICgwKQotI2RlZmluZSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoYywgZiwgbikga21lbV9jYWNoZV9hbGxvYyhjLCBmKQotI2RlZmluZSBrbWFsbG9jX25vZGUocywgZiwgbikga21hbGxvYyhzLCBmKQotI2RlZmluZSBremFsbG9jKHMsIGYpIF9fa3phbGxvYyhzLCBmKQotI2RlZmluZSBrbWFsbG9jX3RyYWNrX2NhbGxlciBrbWFsbG9jCi0KLSNlbmRpZiAvKiBDT05GSUdfU0xPQiAqLwotCi0vKiBTeXN0ZW0gd2lkZSBjYWNoZXMgKi8KLWV4dGVybiBrbWVtX2NhY2hlX3QJKnZtX2FyZWFfY2FjaGVwOwotZXh0ZXJuIGttZW1fY2FjaGVfdAkqbmFtZXNfY2FjaGVwOwotZXh0ZXJuIGttZW1fY2FjaGVfdAkqZmlsZXNfY2FjaGVwOwotZXh0ZXJuIGttZW1fY2FjaGVfdAkqZmlscF9jYWNoZXA7Ci1leHRlcm4ga21lbV9jYWNoZV90CSpmc19jYWNoZXA7Ci1leHRlcm4ga21lbV9jYWNoZV90CSpzaWdoYW5kX2NhY2hlcDsKLWV4dGVybiBrbWVtX2NhY2hlX3QJKmJpb19jYWNoZXA7CisjZW5kaWYgLyogREVCVUdfU0xBQiAqLwogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYJLyogX0xJTlVYX1NMQUJfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0NjNlNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaApAQCAtMCwwICsxLDEwMCBAQAorI2lmbmRlZiBfTElOVVhfU0xBQl9ERUZfSAorI2RlZmluZQlfTElOVVhfU0xBQl9ERUZfSAorCisvKgorICogRGVmaW5pdGlvbnMgdW5pcXVlIHRvIHRoZSBvcmlnaW5hbCBMaW51eCBTTEFCIGFsbG9jYXRvci4KKyAqCisgKiBXaGF0IHdlIHByb3ZpZGUgaGVyZSBpcyBhIHdheSB0byBvcHRpbWl6ZSB0aGUgZnJlcXVlbnQga21hbGxvYworICogY2FsbHMgaW4gdGhlIGtlcm5lbCBieSBzZWxlY3RpbmcgdGhlIGFwcHJvcHJpYXRlIGdlbmVyYWwgY2FjaGUKKyAqIGlmIGttYWxsb2Mgd2FzIGNhbGxlZCB3aXRoIGEgc2l6ZSB0aGF0IGNhbiBiZSBlc3RhYmxpc2hlZCBhdAorICogY29tcGlsZSB0aW1lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4JCS8qIGttYWxsb2Nfc2l6ZXMuaCBuZWVkcyBQQUdFX1NJWkUgKi8KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4JCS8qIGttYWxsb2Nfc2l6ZXMuaCBuZWVkcyBMMV9DQUNIRV9CWVRFUyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKy8qIFNpemUgZGVzY3JpcHRpb24gc3RydWN0IGZvciBnZW5lcmFsIGNhY2hlcy4gKi8KK3N0cnVjdCBjYWNoZV9zaXplcyB7CisJc2l6ZV90CQkgCWNzX3NpemU7CisJc3RydWN0IGttZW1fY2FjaGUJKmNzX2NhY2hlcDsKKwlzdHJ1Y3Qga21lbV9jYWNoZQkqY3NfZG1hY2FjaGVwOworfTsKK2V4dGVybiBzdHJ1Y3QgY2FjaGVfc2l6ZXMgbWFsbG9jX3NpemVzW107CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CisJCWludCBpID0gMDsKKyNkZWZpbmUgQ0FDSEUoeCkgXAorCQlpZiAoc2l6ZSA8PSB4KSBcCisJCQlnb3RvIGZvdW5kOyBcCisJCWVsc2UgXAorCQkJaSsrOworI2luY2x1ZGUgImttYWxsb2Nfc2l6ZXMuaCIKKyN1bmRlZiBDQUNIRQorCQl7CisJCQlleHRlcm4gdm9pZCBfX3lvdV9jYW5ub3Rfa21hbGxvY190aGF0X211Y2godm9pZCk7CisJCQlfX3lvdV9jYW5ub3Rfa21hbGxvY190aGF0X211Y2goKTsKKwkJfQorZm91bmQ6CisJCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKChmbGFncyAmIEdGUF9ETUEpID8KKwkJCW1hbGxvY19zaXplc1tpXS5jc19kbWFjYWNoZXAgOgorCQkJbWFsbG9jX3NpemVzW2ldLmNzX2NhY2hlcCwgZmxhZ3MpOworCX0KKwlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKKwkJaW50IGkgPSAwOworI2RlZmluZSBDQUNIRSh4KSBcCisJCWlmIChzaXplIDw9IHgpIFwKKwkJCWdvdG8gZm91bmQ7IFwKKwkJZWxzZSBcCisJCQlpKys7CisjaW5jbHVkZSAia21hbGxvY19zaXplcy5oIgorI3VuZGVmIENBQ0hFCisJCXsKKwkJCWV4dGVybiB2b2lkIF9feW91X2Nhbm5vdF9remFsbG9jX3RoYXRfbXVjaCh2b2lkKTsKKwkJCV9feW91X2Nhbm5vdF9remFsbG9jX3RoYXRfbXVjaCgpOworCQl9Citmb3VuZDoKKwkJcmV0dXJuIGttZW1fY2FjaGVfemFsbG9jKChmbGFncyAmIEdGUF9ETUEpID8KKwkJCW1hbGxvY19zaXplc1tpXS5jc19kbWFjYWNoZXAgOgorCQkJbWFsbG9jX3NpemVzW2ldLmNzX2NhY2hlcCwgZmxhZ3MpOworCX0KKwlyZXR1cm4gX19remFsbG9jKHNpemUsIGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19OVU1BCitleHRlcm4gdm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CisJCWludCBpID0gMDsKKyNkZWZpbmUgQ0FDSEUoeCkgXAorCQlpZiAoc2l6ZSA8PSB4KSBcCisJCQlnb3RvIGZvdW5kOyBcCisJCWVsc2UgXAorCQkJaSsrOworI2luY2x1ZGUgImttYWxsb2Nfc2l6ZXMuaCIKKyN1bmRlZiBDQUNIRQorCQl7CisJCQlleHRlcm4gdm9pZCBfX3lvdV9jYW5ub3Rfa21hbGxvY190aGF0X211Y2godm9pZCk7CisJCQlfX3lvdV9jYW5ub3Rfa21hbGxvY190aGF0X211Y2goKTsKKwkJfQorZm91bmQ6CisJCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGUoKGZsYWdzICYgR0ZQX0RNQSkgPworCQkJbWFsbG9jX3NpemVzW2ldLmNzX2RtYWNhY2hlcCA6CisJCQltYWxsb2Nfc2l6ZXNbaV0uY3NfY2FjaGVwLCBmbGFncywgbm9kZSk7CisJfQorCXJldHVybiBfX2ttYWxsb2Nfbm9kZShzaXplLCBmbGFncywgbm9kZSk7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfTlVNQSAqLworCisjZW5kaWYJLyogX0xJTlVYX1NMQUJfREVGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21iX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L3NtYl9mc19zYi5oCmluZGV4IDViNGFlMmMuLjNhYTk3YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21iX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbWJfZnNfc2IuaApAQCAtNTUsNyArNTUsNyBAQAogCSAqIGdlbmVyYXRpb24gaXMgaW5jcmVtZW50ZWQuCiAJICovCiAJdW5zaWduZWQgaW50IGdlbmVyYXRpb247Ci0JcGlkX3QgY29ubl9waWQ7CisJc3RydWN0IHBpZCAqY29ubl9waWQ7CiAJc3RydWN0IHNtYl9jb25uX29wdCBvcHQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgY29ubl93cTsKIAlpbnQgY29ubl9jb21wbGV0ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21wLmggYi9pbmNsdWRlL2xpbnV4L3NtcC5oCmluZGV4IDUxNjQ5OTguLjdiYTIzZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXAuaApAQCAtOTksNiArOTksMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpIHsgfQogI2RlZmluZSBudW1fYm9vdGluZ19jcHVzKCkJCQkxCiAjZGVmaW5lIHNtcF9wcmVwYXJlX2Jvb3RfY3B1KCkJCQlkbyB7fSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1aWQsIHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksCisJCQkJdm9pZCAqaW5mbywgaW50IHJldHJ5LCBpbnQgd2FpdCkKK3sKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgaGVyZT8gKi8KKwlmdW5jKGluZm8pOworCXJldHVybiAwOworfQogCiAjZW5kaWYgLyogIVNNUCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCAzNjE0MDkwLi45MmNkMzhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTI2NCw2ICsyNjQsNyBAQAogI2RlZmluZSBTT0xfSVBWNgk0MQogI2RlZmluZSBTT0xfSUNNUFY2CTU4CiAjZGVmaW5lIFNPTF9TQ1RQCTEzMgorI2RlZmluZSBTT0xfVURQTElURQkxMzYgICAgIC8qIFVEUC1MaXRlIChSRkMgMzgyOCkgKi8KICNkZWZpbmUgU09MX1JBVwkJMjU1CiAjZGVmaW5lIFNPTF9JUFgJCTI1NgogI2RlZmluZSBTT0xfQVgyNQkyNTcKQEAgLTI5Miw3ICsyOTMsNyBAQAogZXh0ZXJuIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9taW92ZWNlbmQodW5zaWduZWQgY2hhciAqa2RhdGEsIAogCQkJCQkgIHN0cnVjdCBpb3ZlYyAqaW92LCAKIAkJCQkJICBpbnQgb2Zmc2V0LCAKLQkJCQkJICB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgKmNzdW1wKTsKKwkJCQkJICB1bnNpZ25lZCBpbnQgbGVuLCBfX3dzdW0gKmNzdW1wKTsKIAogZXh0ZXJuIGludCB2ZXJpZnlfaW92ZWMoc3RydWN0IG1zZ2hkciAqbSwgc3RydWN0IGlvdmVjICppb3YsIGNoYXIgKmFkZHJlc3MsIGludCBtb2RlKTsKIGV4dGVybiBpbnQgbWVtY3B5X3RvaW92ZWMoc3RydWN0IGlvdmVjICp2LCB1bnNpZ25lZCBjaGFyICprZGF0YSwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaCBiL2luY2x1ZGUvbGludXgvc29ja2lvcy5oCmluZGV4IGU2YjlkMWQuLmFiZWY3NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2lvcy5oCkBAIC03Miw4ICs3Miw4IEBACiAjZGVmaW5lIFNJT0NHSUZUWFFMRU4JMHg4OTQyCQkvKiBHZXQgdGhlIHR4IHF1ZXVlIGxlbmd0aAkqLwogI2RlZmluZSBTSU9DU0lGVFhRTEVOCTB4ODk0MwkJLyogU2V0IHRoZSB0eCBxdWV1ZSBsZW5ndGggCSovCiAKLSNkZWZpbmUgU0lPQ0dJRkRJVkVSVAkweDg5NDQJCS8qIEZyYW1lIGRpdmVyc2lvbiBzdXBwb3J0ICovCi0jZGVmaW5lIFNJT0NTSUZESVZFUlQJMHg4OTQ1CQkvKiBTZXQgZnJhbWUgZGl2ZXJzaW9uIG9wdGlvbnMgKi8KKy8qIFNJT0NHSUZESVZFUlQgd2FzOgkweDg5NDQJCUZyYW1lIGRpdmVyc2lvbiBzdXBwb3J0ICovCisvKiBTSU9DU0lGRElWRVJUIHdhczoJMHg4OTQ1CQlTZXQgZnJhbWUgZGl2ZXJzaW9uIG9wdGlvbnMgKi8KIAogI2RlZmluZSBTSU9DRVRIVE9PTAkweDg5NDYJCS8qIEV0aHRvb2wgaW50ZXJmYWNlCQkqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmggYi9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKaW5kZXggYjgwMGQyZC4uOTRiNzY3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaApAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvYm90dG9tX2hhbGYuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApAQCAtMTgzLDEzICsxODQsMjcgQEAKICNkZWZpbmUgcmVhZF9sb2NrKGxvY2spCQkJX3JlYWRfbG9jayhsb2NrKQogCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ERUJVR19TUElOTE9DSykKKwogI2RlZmluZSBzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykJZmxhZ3MgPSBfc3Bpbl9sb2NrX2lycXNhdmUobG9jaykKICNkZWZpbmUgcmVhZF9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCWZsYWdzID0gX3JlYWRfbG9ja19pcnFzYXZlKGxvY2spCiAjZGVmaW5lIHdyaXRlX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykJZmxhZ3MgPSBfd3JpdGVfbG9ja19pcnFzYXZlKGxvY2spCisKKyNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQworI2RlZmluZSBzcGluX2xvY2tfaXJxc2F2ZV9uZXN0ZWQobG9jaywgZmxhZ3MsIHN1YmNsYXNzKSBcCisJZmxhZ3MgPSBfc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKGxvY2ssIHN1YmNsYXNzKQogI2Vsc2UKKyNkZWZpbmUgc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKGxvY2ssIGZsYWdzLCBzdWJjbGFzcykgXAorCWZsYWdzID0gX3NwaW5fbG9ja19pcnFzYXZlKGxvY2spCisjZW5kaWYKKworI2Vsc2UKKwogI2RlZmluZSBzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykJX3NwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQogI2RlZmluZSByZWFkX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykJX3JlYWRfbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKQogI2RlZmluZSB3cml0ZV9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCV93cml0ZV9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpCisjZGVmaW5lIHNwaW5fbG9ja19pcnFzYXZlX25lc3RlZChsb2NrLCBmbGFncywgc3ViY2xhc3MpCVwKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncykKKwogI2VuZGlmCiAKICNkZWZpbmUgc3Bpbl9sb2NrX2lycShsb2NrKQkJX3NwaW5fbG9ja19pcnEobG9jaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfYXBpX3NtcC5oIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja19hcGlfc21wLmgKaW5kZXggODgyOGI4MS4uOGEyMzA3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGlubG9ja19hcGlfc21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja19hcGlfc21wLmgKQEAgLTMyLDYgKzMyLDggQEAKIHZvaWQgX19sb2NrZnVuYyBfd3JpdGVfbG9ja19pcnEocndsb2NrX3QgKmxvY2spCQlfX2FjcXVpcmVzKGxvY2spOwogdW5zaWduZWQgbG9uZyBfX2xvY2tmdW5jIF9zcGluX2xvY2tfaXJxc2F2ZShzcGlubG9ja190ICpsb2NrKQogCQkJCQkJCV9fYWNxdWlyZXMobG9jayk7Cit1bnNpZ25lZCBsb25nIF9fbG9ja2Z1bmMgX3NwaW5fbG9ja19pcnFzYXZlX25lc3RlZChzcGlubG9ja190ICpsb2NrLCBpbnQgc3ViY2xhc3MpCisJCQkJCQkJX19hY3F1aXJlcyhsb2NrKTsKIHVuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfcmVhZF9sb2NrX2lycXNhdmUocndsb2NrX3QgKmxvY2spCiAJCQkJCQkJX19hY3F1aXJlcyhsb2NrKTsKIHVuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfd3JpdGVfbG9ja19pcnFzYXZlKHJ3bG9ja190ICpsb2NrKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdGFsbGlvbi5oIGIvaW5jbHVkZS9saW51eC9zdGFsbGlvbi5oCmluZGV4IDEzYTM3ZjEuLjRhMGEzMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RhbGxpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3N0YWxsaW9uLmgKQEAgLTUyLDExICs1MiwxMSBAQAogICoJcHJvdGVjdGlvbiAtIHNpbmNlICJ3cml0ZSIgY29kZSBvbmx5IG5lZWRzIHRvIGNoYW5nZSB0aGUgaGVhZCwgYW5kCiAgKglpbnRlcnJ1cHQgY29kZSBvbmx5IG5lZWRzIHRvIGNoYW5nZSB0aGUgdGFpbC4KICAqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IHN0bHJxIHsKIAljaGFyCSpidWY7CiAJY2hhcgkqaGVhZDsKIAljaGFyCSp0YWlsOwotfSBzdGxycV90OworfTsKIAogLyoKICAqCVBvcnQsIHBhbmVsIGFuZCBib2FyZCBzdHJ1Y3R1cmVzIHRvIGhvbGQgc3RhdHVzIGluZm8gYWJvdXQgZWFjaC4KQEAgLTY3LDE0ICs2NywxNCBAQAogICoJaXMgYXNzb2NpYXRlZCB3aXRoLCB0aGlzIG1ha2VzIGl0IChmYWlybHkpIGVhc3kgdG8gZ2V0IGJhY2sgdG8gdGhlCiAgKglib2FyZC9wYW5lbCBpbmZvIGZvciBhIHBvcnQuCiAgKi8KLXR5cGVkZWYgc3RydWN0IHN0bHBvcnQgeworc3RydWN0IHN0bHBvcnQgewogCXVuc2lnbmVkIGxvbmcJCW1hZ2ljOwotCWludAkJCXBvcnRucjsKLQlpbnQJCQlwYW5lbG5yOwotCWludAkJCWJyZG5yOworCXVuc2lnbmVkIGludAkJcG9ydG5yOworCXVuc2lnbmVkIGludAkJcGFuZWxucjsKKwl1bnNpZ25lZCBpbnQJCWJyZG5yOwogCWludAkJCWlvYWRkcjsKIAlpbnQJCQl1YXJ0YWRkcjsKLQlpbnQJCQlwYWdlbnI7CisJdW5zaWduZWQgaW50CQlwYWdlbnI7CiAJbG9uZwkJCWlzdGF0ZTsKIAlpbnQJCQlmbGFnczsKIAlpbnQJCQliYXVkX2Jhc2U7CkBAIC05NywzMSArOTcsMzEgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OwogCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWU7CiAJY29tc3RhdHNfdAkJc3RhdHM7Ci0Jc3RscnFfdAkJCXR4OwotfSBzdGxwb3J0X3Q7CisJc3RydWN0IHN0bHJxCQl0eDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHN0bHBhbmVsIHsKK3N0cnVjdCBzdGxwYW5lbCB7CiAJdW5zaWduZWQgbG9uZwltYWdpYzsKLQlpbnQJCXBhbmVsbnI7Ci0JaW50CQlicmRucjsKLQlpbnQJCXBhZ2VucjsKLQlpbnQJCW5ycG9ydHM7CisJdW5zaWduZWQgaW50CXBhbmVsbnI7CisJdW5zaWduZWQgaW50CWJyZG5yOworCXVuc2lnbmVkIGludAlwYWdlbnI7CisJdW5zaWduZWQgaW50CW5ycG9ydHM7CiAJaW50CQlpb2Jhc2U7CiAJdm9pZAkJKnVhcnRwOwogCXZvaWQJCSgqaXNyKShzdHJ1Y3Qgc3RscGFuZWwgKnBhbmVscCwgdW5zaWduZWQgaW50IGlvYmFzZSk7CiAJdW5zaWduZWQgaW50CWh3aWQ7CiAJdW5zaWduZWQgaW50CWFja21hc2s7Ci0Jc3RscG9ydF90CSpwb3J0c1tTVExfUE9SVFNQRVJQQU5FTF07Ci19IHN0bHBhbmVsX3Q7CisJc3RydWN0IHN0bHBvcnQJKnBvcnRzW1NUTF9QT1JUU1BFUlBBTkVMXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IHN0bGJyZCB7CitzdHJ1Y3Qgc3RsYnJkIHsKIAl1bnNpZ25lZCBsb25nCW1hZ2ljOwotCWludAkJYnJkbnI7Ci0JaW50CQlicmR0eXBlOwotCWludAkJc3RhdGU7Ci0JaW50CQlucnBhbmVsczsKLQlpbnQJCW5ycG9ydHM7Ci0JaW50CQlucmJua3M7CisJdW5zaWduZWQgaW50CWJyZG5yOworCXVuc2lnbmVkIGludAlicmR0eXBlOworCXVuc2lnbmVkIGludAlzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJbnJwYW5lbHM7CisJdW5zaWduZWQgaW50CW5ycG9ydHM7CisJdW5zaWduZWQgaW50CW5yYm5rczsKIAlpbnQJCWlycTsKIAlpbnQJCWlycXR5cGU7CiAJaW50CQkoKmlzcikoc3RydWN0IHN0bGJyZCAqYnJkcCk7CkBAIC0xMzYsOSArMTM2LDkgQEAKIAl1bnNpZ25lZCBsb25nCWNsazsKIAl1bnNpZ25lZCBpbnQJYm5rcGFnZWFkZHJbU1RMX01BWEJBTktTXTsKIAl1bnNpZ25lZCBpbnQJYm5rc3RhdGFkZHJbU1RMX01BWEJBTktTXTsKLQlzdGxwYW5lbF90CSpibmsycGFuZWxbU1RMX01BWEJBTktTXTsKLQlzdGxwYW5lbF90CSpwYW5lbHNbU1RMX01BWFBBTkVMU107Ci19IHN0bGJyZF90OworCXN0cnVjdCBzdGxwYW5lbAkqYm5rMnBhbmVsW1NUTF9NQVhCQU5LU107CisJc3RydWN0IHN0bHBhbmVsCSpwYW5lbHNbU1RMX01BWFBBTkVMU107Cit9OwogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N0YXJ0X2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9zdGFydF9rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2U1ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zdGFydF9rZXJuZWwuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9MSU5VWF9TVEFSVF9LRVJORUxfSAorI2RlZmluZSBfTElOVVhfU1RBUlRfS0VSTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKy8qIERlZmluZSB0aGUgcHJvdG90eXBlIGZvciBzdGFydF9rZXJuZWwgaGVyZSwgcmF0aGVyIHRoYW4gY2x1dHRlcmluZworICAgdXAgc29tZXRoaW5nIGVsc2UuICovCisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgX19pbml0IHN0YXJ0X2tlcm5lbCh2b2lkKTsKKworI2VuZGlmIC8qIF9MSU5VWF9TVEFSVF9LRVJORUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvYXV0aF9nc3MuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2F1dGhfZ3NzLmgKaW5kZXggOTdiNjJlOS4uMmRiMmZiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvYXV0aF9nc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9hdXRoX2dzcy5oCkBAIC05MCw4ICs5MCw2IEBACiAjZGVmaW5lIGdjX2ZsYWdzCQlnY19iYXNlLmNyX2ZsYWdzCiAjZGVmaW5lIGdjX2V4cGlyZQkJZ2NfYmFzZS5jcl9leHBpcmUKIAotdm9pZCBwcmludF9oZXhsKHUzMiAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBvZmZzZXQpOwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9TVU5SUENfQVVUSF9HU1NfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKaW5kZXggZjZkMWQ2NC4uYTFiZTg5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaApAQCAtNTMsNiArNTMsNyBAQAogCXN0cnVjdCBkZW50cnkgKgkJY2xfZGVudHJ5OwkvKiBpbm9kZSAqLwogCXN0cnVjdCBycGNfY2xudCAqCWNsX3BhcmVudDsJLyogUG9pbnRzIHRvIHBhcmVudCBvZiBjbG9uZXMgKi8KIAlzdHJ1Y3QgcnBjX3J0dAkJY2xfcnR0X2RlZmF1bHQ7CisJc3RydWN0IHJwY19wcm9ncmFtICoJY2xfcHJvZ3JhbTsKIAljaGFyCQkJY2xfaW5saW5lX25hbWVbMzJdOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvZGVidWcuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2RlYnVnLmgKaW5kZXggZTQ3MjlhYS4uNjBmY2UzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvZGVidWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9kZWJ1Zy5oCkBAIC02MiwxMiArNjIsNiBAQAogIyBkZWZpbmUgUlBDX0lGREVCVUcoeCkKICNlbmRpZgogCi0jaWZkZWYgUlBDX1BST0ZJTEUKLSMgZGVmaW5lIHBwcmludGsoYXJncy4uLikJcHJpbnRrKCMjIGFyZ3MpCi0jZWxzZQotIyBkZWZpbmUgcHByaW50ayhhcmdzLi4uKQlkbyA7IHdoaWxlICgwKQotI2VuZGlmCi0KIC8qCiAgKiBTeXNjdGwgaW50ZXJmYWNlIGZvciBSUEMgZGVidWdnaW5nCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19rcmI1LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3Nfa3JiNS5oCmluZGV4IGUzMGJhMjAuLjVhNGIxZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19rcmI1LmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2tyYjUuaApAQCAtNDIsMTAgKzQyLDYgQEAKIAogc3RydWN0IGtyYjVfY3R4IHsKIAlpbnQJCQlpbml0aWF0ZTsgLyogMSA9IGluaXRpYXRpbmcsIDAgPSBhY2NlcHRpbmcgKi8KLQlpbnQJCQlzZWVkX2luaXQ7Ci0JdW5zaWduZWQgY2hhcgkJc2VlZFsxNl07Ci0JaW50CQkJc2lnbmFsZzsKLQlpbnQJCQlzZWFsYWxnOwogCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyCSplbmM7CiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIJKnNlcTsKIAlzMzIJCQllbmR0aW1lOwpAQCAtMTE3LDcgKzExMyw3IEBACiAjZGVmaW5lIEVOQ1RZUEVfVU5LTk9XTiAgICAgICAgIDB4MDFmZgogCiBzMzIKLW1ha2VfY2hlY2tzdW0oczMyIGNrc3VtdHlwZSwgY2hhciAqaGVhZGVyLCBpbnQgaGRybGVuLCBzdHJ1Y3QgeGRyX2J1ZiAqYm9keSwKK21ha2VfY2hlY2tzdW0oY2hhciAqLCBjaGFyICpoZWFkZXIsIGludCBoZHJsZW4sIHN0cnVjdCB4ZHJfYnVmICpib2R5LAogCQkgICBpbnQgYm9keV9vZmZzZXQsIHN0cnVjdCB4ZHJfbmV0b2JqICpja3N1bSk7CiAKIHUzMiBnc3NfZ2V0X21pY19rZXJiZXJvcyhzdHJ1Y3QgZ3NzX2N0eCAqLCBzdHJ1Y3QgeGRyX2J1ZiAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX3Nwa20zLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3Nfc3BrbTMuaAppbmRleCAyY2YzZmJiLi5lM2U2YTM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3Nfc3BrbTMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3Nfc3BrbTMuaApAQCAtMTIsMjcgKzEyLDE5IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19hc24xLmg+CiAKIHN0cnVjdCBzcGttM19jdHggewotCXN0cnVjdCB4ZHJfbmV0b2JqCWN0eF9pZDsgLyogcGVyIG1lc3NhZ2UgY29udGV4dCBpZCAqLwotCWludAkJCXFvcDsgICAgICAgICAvKiBuZWdvdGlhdGVkIHFvcCAqLworCXN0cnVjdCB4ZHJfbmV0b2JqCWN0eF9pZDsgIC8qIHBlciBtZXNzYWdlIGNvbnRleHQgaWQgKi8KKwlpbnQJCQllbmR0aW1lOyAvKiBlbmR0aW1lIG9mIHRoZSBjb250ZXh0ICovCiAJc3RydWN0IHhkcl9uZXRvYmoJbWVjaF91c2VkOwogCXVuc2lnbmVkIGludAkJcmV0X2ZsYWdzIDsKLQl1bnNpZ25lZCBpbnQJCXJlcV9mbGFncyA7Ci0Jc3RydWN0IHhkcl9uZXRvYmoJc2hhcmVfa2V5OwotCWludAkJCWNvbmZfYWxnOwotCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyCSpkZXJpdmVkX2NvbmZfa2V5OwotCWludAkJCWludGdfYWxnOwotCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyCSpkZXJpdmVkX2ludGVnX2tleTsKLQlpbnQJCQlrZXllc3RiX2FsZzsgICAvKiBhbGcgdXNlZCB0byBnZXQgc2hhcmVfa2V5ICovCi0JaW50CQkJb3dmX2FsZzsgICAvKiBvbmUgd2F5IGZ1bmN0aW9uICovCisJc3RydWN0IHhkcl9uZXRvYmoJY29uZl9hbGc7CisJc3RydWN0IHhkcl9uZXRvYmoJZGVyaXZlZF9jb25mX2tleTsKKwlzdHJ1Y3QgeGRyX25ldG9iaglpbnRnX2FsZzsKKwlzdHJ1Y3QgeGRyX25ldG9iaiAJZGVyaXZlZF9pbnRlZ19rZXk7CiB9OwogCi0vKiBmcm9tIG9wZW5zc2wvb2JqZWN0cy5oICovCi0vKiBYWFggbmVlZCBTRUFMX0FMR19OT05FICovCi0jZGVmaW5lIE5JRF9tZDUJCTQKLSNkZWZpbmUgTklEX2RoS2V5QWdyZWVtZW50CTI4IAotI2RlZmluZSBOSURfZGVzX2NiYwkJMzEgCi0jZGVmaW5lIE5JRF9zaGExCQk2NAotI2RlZmluZSBOSURfY2FzdDVfY2JjCQkxMDgKKy8qIE9JRHMgZGVjbGFyYXRpb25zIGZvciBLLUFMRywgSS1BTEcsIEMtQUxHLCBhbmQgT1dGLUFMRyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCB4ZHJfbmV0b2JqIGhtYWNfbWQ1X29pZDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgeGRyX25ldG9iaiBjYXN0NV9jYmNfb2lkOwogCiAvKiBTUEtNIElubmVyQ29udGV4dCBUb2tlbiB0eXBlcyAqLwogCkBAIC00NiwxMSArMzgsMTMgQEAKIHUzMiBzcGttM19yZWFkX3Rva2VuKHN0cnVjdCBzcGttM19jdHggKmN0eCwgc3RydWN0IHhkcl9uZXRvYmogKnJlYWRfdG9rZW4sIHN0cnVjdCB4ZHJfYnVmICptZXNzYWdlX2J1ZmZlciwgaW50IHRva3R5cGUpOwogCiAjZGVmaW5lIENLU1VNVFlQRV9SU0FfTUQ1ICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIENLU1VNVFlQRV9ITUFDX01ENSAgICAgICAgICAgMHgwMDA4CiAKLXMzMiBtYWtlX2NoZWNrc3VtKHMzMiBja3N1bXR5cGUsIGNoYXIgKmhlYWRlciwgaW50IGhkcmxlbiwgc3RydWN0IHhkcl9idWYgKmJvZHksCi0gICAgICAgICAgICAgICAgICAgaW50IGJvZHlfb2Zmc2V0LCBzdHJ1Y3QgeGRyX25ldG9iaiAqY2tzdW0pOworczMyIG1ha2Vfc3BrbTNfY2hlY2tzdW0oczMyIGNrc3VtdHlwZSwgc3RydWN0IHhkcl9uZXRvYmogKmtleSwgY2hhciAqaGVhZGVyLAorCQl1bnNpZ25lZCBpbnQgaGRybGVuLCBzdHJ1Y3QgeGRyX2J1ZiAqYm9keSwKKwkJdW5zaWduZWQgaW50IGJvZHlfb2Zmc2V0LCBzdHJ1Y3QgeGRyX25ldG9iaiAqY2tzdW0pOwogdm9pZCBhc24xX2JpdHN0cmluZ19sZW4oc3RydWN0IHhkcl9uZXRvYmogKmluLCBpbnQgKmVuY2xlbiwgaW50ICp6ZXJvYml0cyk7Ci1pbnQgZGVjb2RlX2FzbjFfYml0c3RyaW5nKHN0cnVjdCB4ZHJfbmV0b2JqICpvdXQsIGNoYXIgKmluLCBpbnQgZW5jbGVuLCAKK2ludCBkZWNvZGVfYXNuMV9iaXRzdHJpbmcoc3RydWN0IHhkcl9uZXRvYmogKm91dCwgY2hhciAqaW4sIGludCBlbmNsZW4sCiAgICAgICAgICAgICAgICAgICAgaW50IGV4cGxlbik7CiB2b2lkIHNwa20zX21pY19oZWFkZXIodW5zaWduZWQgY2hhciAqKmhkcmJ1ZiwgdW5zaWduZWQgaW50ICpoZHJsZW4sIAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0eGhkciwgaW50IGVsZW4sIGludCB6Yml0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL21zZ19wcm90LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9tc2dfcHJvdC5oCmluZGV4IDFlNjVmMmQuLjYwNmNiMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL21zZ19wcm90LmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvbXNnX3Byb3QuaApAQCAtNTYsNyArNTYsOSBAQAogCVJQQ19QUk9HX01JU01BVENIID0gMiwKIAlSUENfUFJPQ19VTkFWQUlMID0gMywKIAlSUENfR0FSQkFHRV9BUkdTID0gNCwKLQlSUENfU1lTVEVNX0VSUiA9IDUKKwlSUENfU1lTVEVNX0VSUiA9IDUsCisJLyogaW50ZXJuYWwgdXNlIG9ubHkgKi8KKwlSUENfRFJPUF9SRVBMWSA9IDYwMDAwLAogfTsKIAogZW51bSBycGNfcmVqZWN0X3N0YXQgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvcnBjX3BpcGVfZnMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3JwY19waXBlX2ZzLmgKaW5kZXggYTJlYjliNC4uNGE2ODEyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvcnBjX3BpcGVfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oCkBAIC0zMCw3ICszMCw3IEBACiAjZGVmaW5lIFJQQ19QSVBFX1dBSVRfRk9SX09QRU4JMQogCWludCBmbGFnczsKIAlzdHJ1Y3QgcnBjX3BpcGVfb3BzICpvcHM7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHF1ZXVlX3RpbWVvdXQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayBxdWV1ZV90aW1lb3V0OwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcnBjX2lub2RlICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zY2hlZC5oCmluZGV4IGYzOTljMTMuLjk3Yzc2MTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaApAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpAQCAtODUsNiArODYsNyBAQAogCXVuaW9uIHsKIAkJc3RydWN0IHdvcmtfc3RydWN0CXRrX3dvcms7CS8qIEFzeW5jIHRhc2sgd29yayBxdWV1ZSAqLwogCQlzdHJ1Y3QgcnBjX3dhaXQJCXRrX3dhaXQ7CS8qIFJQQyB3YWl0ICovCisJCXN0cnVjdCByY3VfaGVhZAkJdGtfcmN1OwkJLyogZm9yIHRhc2sgZGVsZXRpb24gKi8KIAl9IHU7CiAKIAl1bnNpZ25lZCBzaG9ydAkJdGtfdGltZW91dHM7CS8qIG1haiB0aW1lb3V0cyAqLwpAQCAtMTc4LDEzICsxODAsNiBAQAogCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgUlBDX0lTX0FDVElWQVRFRCh0KQkodGVzdF9iaXQoUlBDX1RBU0tfQUNUSVZFLCAmKHQpLT50a19ydW5zdGF0ZSkpCi0jZGVmaW5lIHJwY19zZXRfYWN0aXZlKHQpCShzZXRfYml0KFJQQ19UQVNLX0FDVElWRSwgJih0KS0+dGtfcnVuc3RhdGUpKQotI2RlZmluZSBycGNfY2xlYXJfYWN0aXZlKHQpCVwKLQlkbyB7IFwKLQkJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7IFwKLQkJY2xlYXJfYml0KFJQQ19UQVNLX0FDVElWRSwgJih0KS0+dGtfcnVuc3RhdGUpOyBcCi0JCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7IFwKLQl9IHdoaWxlKDApCiAKIC8qCiAgKiBUYXNrIHByaW9yaXRpZXMuCkBAIC0yMjIsNyArMjE3LDcgQEAKIAogI2lmbmRlZiBSUENfREVCVUcKICMgZGVmaW5lIFJQQ19XQUlUUV9JTklUKHZhcixxbmFtZSkgeyBcCi0JCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VELCBcCisJCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQodmFyLmxvY2spLCBcCiAJCS50YXNrcyA9IHsgXAogCQkJWzBdID0gTElTVF9IRUFEX0lOSVQodmFyLnRhc2tzWzBdKSwgXAogCQkJWzFdID0gTElTVF9IRUFEX0lOSVQodmFyLnRhc2tzWzFdKSwgXApAQCAtMjMxLDcgKzIyNiw3IEBACiAJfQogI2Vsc2UKICMgZGVmaW5lIFJQQ19XQUlUUV9JTklUKHZhcixxbmFtZSkgeyBcCi0JCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VELCBcCisJCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQodmFyLmxvY2spLCBcCiAJCS50YXNrcyA9IHsgXAogCQkJWzBdID0gTElTVF9IRUFEX0lOSVQodmFyLnRhc2tzWzBdKSwgXAogCQkJWzFdID0gTElTVF9IRUFEX0lOSVQodmFyLnRhc2tzWzFdKSwgXApAQCAtMjU0LDggKzI0OSwxMCBAQAogdm9pZAkJcnBjX2luaXRfdGFzayhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBycGNfY2xudCAqY2xudCwKIAkJCQlpbnQgZmxhZ3MsIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgKm9wcywKIAkJCQl2b2lkICpkYXRhKTsKK3ZvaWQJCXJwY19wdXRfdGFzayhzdHJ1Y3QgcnBjX3Rhc2sgKik7CiB2b2lkCQlycGNfcmVsZWFzZV90YXNrKHN0cnVjdCBycGNfdGFzayAqKTsKIHZvaWQJCXJwY19leGl0X3Rhc2soc3RydWN0IHJwY190YXNrICopOwordm9pZAkJcnBjX3JlbGVhc2VfY2FsbGRhdGEoY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyAqLCB2b2lkICopOwogdm9pZAkJcnBjX2tpbGxhbGxfdGFza3Moc3RydWN0IHJwY19jbG50ICopOwogaW50CQlycGNfZXhlY3V0ZShzdHJ1Y3QgcnBjX3Rhc2sgKik7CiB2b2lkCQlycGNfaW5pdF9wcmlvcml0eV93YWl0X3F1ZXVlKHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqLCBjb25zdCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAppbmRleCA5YzlhOGFkLi45NjVkNmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaApAQCAtMzM1LDcgKzMzNSw3IEBACiAvKgogICogUlBDIHByb2NlZHVyZSBpbmZvCiAgKi8KLXR5cGVkZWYgaW50CSgqc3ZjX3Byb2NmdW5jKShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCk7Cit0eXBlZGVmIF9fYmUzMgkoKnN2Y19wcm9jZnVuYykoc3RydWN0IHN2Y19ycXN0ICosIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApOwogc3RydWN0IHN2Y19wcm9jZWR1cmUgewogCXN2Y19wcm9jZnVuYwkJcGNfZnVuYzsJLyogcHJvY2VzcyB0aGUgcmVxdWVzdCAqLwogCWt4ZHJwcm9jX3QJCXBjX2RlY29kZTsJLyogWERSIGRlY29kZSBhcmdzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3hkci5oCmluZGV4IDk1MzcyM2IuLjllMzQwZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3hkci5oCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogLyoKICAqIEJ1ZmZlciBhZGp1c3RtZW50CkBAIC03NCw2ICs3NSw3IEBACiAjZGVmaW5lCXJwY19wcm9jX3VuYXZhaWwJX19jb25zdGFudF9odG9ubChSUENfUFJPQ19VTkFWQUlMKQogI2RlZmluZQlycGNfZ2FyYmFnZV9hcmdzCV9fY29uc3RhbnRfaHRvbmwoUlBDX0dBUkJBR0VfQVJHUykKICNkZWZpbmUJcnBjX3N5c3RlbV9lcnIJCV9fY29uc3RhbnRfaHRvbmwoUlBDX1NZU1RFTV9FUlIpCisjZGVmaW5lCXJwY19kcm9wX3JlcGx5CQlfX2NvbnN0YW50X2h0b25sKFJQQ19EUk9QX1JFUExZKQogCiAjZGVmaW5lCXJwY19hdXRoX29rCQlfX2NvbnN0YW50X2h0b25sKFJQQ19BVVRIX09LKQogI2RlZmluZQlycGNfYXV0aGVycl9iYWRjcmVkCV9fY29uc3RhbnRfaHRvbmwoUlBDX0FVVEhfQkFEQ1JFRCkKQEAgLTEzOCwyOSArMTQwLDMwIEBACiAgKi8KIGV4dGVybiB2b2lkIHhkcl9zaGlmdF9idWYoc3RydWN0IHhkcl9idWYgKiwgc2l6ZV90KTsKIGV4dGVybiB2b2lkIHhkcl9idWZfZnJvbV9pb3Yoc3RydWN0IGt2ZWMgKiwgc3RydWN0IHhkcl9idWYgKik7Ci1leHRlcm4gaW50IHhkcl9idWZfc3Vic2VnbWVudChzdHJ1Y3QgeGRyX2J1ZiAqLCBzdHJ1Y3QgeGRyX2J1ZiAqLCBpbnQsIGludCk7Ci1leHRlcm4gaW50IHhkcl9idWZfcmVhZF9uZXRvYmooc3RydWN0IHhkcl9idWYgKiwgc3RydWN0IHhkcl9uZXRvYmogKiwgaW50KTsKLWV4dGVybiBpbnQgcmVhZF9ieXRlc19mcm9tX3hkcl9idWYoc3RydWN0IHhkcl9idWYgKiwgaW50LCB2b2lkICosIGludCk7Ci1leHRlcm4gaW50IHdyaXRlX2J5dGVzX3RvX3hkcl9idWYoc3RydWN0IHhkcl9idWYgKiwgaW50LCB2b2lkICosIGludCk7CitleHRlcm4gaW50IHhkcl9idWZfc3Vic2VnbWVudChzdHJ1Y3QgeGRyX2J1ZiAqLCBzdHJ1Y3QgeGRyX2J1ZiAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IHhkcl9idWZfcmVhZF9uZXRvYmooc3RydWN0IHhkcl9idWYgKiwgc3RydWN0IHhkcl9uZXRvYmogKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgcmVhZF9ieXRlc19mcm9tX3hkcl9idWYoc3RydWN0IHhkcl9idWYgKiwgdW5zaWduZWQgaW50LCB2b2lkICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IHdyaXRlX2J5dGVzX3RvX3hkcl9idWYoc3RydWN0IHhkcl9idWYgKiwgdW5zaWduZWQgaW50LCB2b2lkICosIHVuc2lnbmVkIGludCk7CiAKIC8qCiAgKiBIZWxwZXIgc3RydWN0dXJlIGZvciBjb3B5aW5nIGZyb20gYW4gc2tfYnVmZi4KICAqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IHhkcl9za2JfcmVhZGVyIHsKIAlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwogCXVuc2lnbmVkIGludAlvZmZzZXQ7CiAJc2l6ZV90CQljb3VudDsKLQl1bnNpZ25lZCBpbnQJY3N1bTsKLX0gc2tiX3JlYWRlcl90OworCV9fd3N1bQkJY3N1bTsKK307CiAKLXR5cGVkZWYgc2l6ZV90ICgqc2tiX3JlYWRfYWN0b3JfdCkoc2tiX3JlYWRlcl90ICpkZXNjLCB2b2lkICp0bywgc2l6ZV90IGxlbik7Cit0eXBlZGVmIHNpemVfdCAoKnhkcl9za2JfcmVhZF9hY3Rvcikoc3RydWN0IHhkcl9za2JfcmVhZGVyICpkZXNjLCB2b2lkICp0bywgc2l6ZV90IGxlbik7CiAKK3NpemVfdCB4ZHJfc2tiX3JlYWRfYml0cyhzdHJ1Y3QgeGRyX3NrYl9yZWFkZXIgKmRlc2MsIHZvaWQgKnRvLCBzaXplX3QgbGVuKTsKIGV4dGVybiBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfdG9feGRyKHN0cnVjdCB4ZHJfYnVmICosIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIHNzaXplX3QgeGRyX3BhcnRpYWxfY29weV9mcm9tX3NrYihzdHJ1Y3QgeGRyX2J1ZiAqLCB1bnNpZ25lZCBpbnQsCi0JCXNrYl9yZWFkZXJfdCAqLCBza2JfcmVhZF9hY3Rvcl90KTsKKwkJc3RydWN0IHhkcl9za2JfcmVhZGVyICosIHhkcl9za2JfcmVhZF9hY3Rvcik7CiAKLWV4dGVybiBpbnQgeGRyX2VuY29kZV93b3JkKHN0cnVjdCB4ZHJfYnVmICosIGludCwgdTMyKTsKLWV4dGVybiBpbnQgeGRyX2RlY29kZV93b3JkKHN0cnVjdCB4ZHJfYnVmICosIGludCwgdTMyICopOworZXh0ZXJuIGludCB4ZHJfZW5jb2RlX3dvcmQoc3RydWN0IHhkcl9idWYgKiwgdW5zaWduZWQgaW50LCB1MzIpOworZXh0ZXJuIGludCB4ZHJfZGVjb2RlX3dvcmQoc3RydWN0IHhkcl9idWYgKiwgdW5zaWduZWQgaW50LCB1MzIgKik7CiAKIHN0cnVjdCB4ZHJfYXJyYXkyX2Rlc2M7CiB0eXBlZGVmIGludCAoKnhkcl94Y29kZV9lbGVtX3QpKHN0cnVjdCB4ZHJfYXJyYXkyX2Rlc2MgKmRlc2MsIHZvaWQgKmVsZW0pOwpAQCAtMTk1LDYgKzE5OCw3IEBACiBleHRlcm4gX19iZTMyICp4ZHJfaW5saW5lX2RlY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzaXplX3QgbmJ5dGVzKTsKIGV4dGVybiB2b2lkIHhkcl9yZWFkX3BhZ2VzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4pOwogZXh0ZXJuIHZvaWQgeGRyX2VudGVyX3BhZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbik7CitleHRlcm4gaW50IHhkcl9wcm9jZXNzX2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgKCphY3Rvcikoc3RydWN0IHNjYXR0ZXJsaXN0ICosIHZvaWQgKiksIHZvaWQgKmRhdGEpOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy94cHJ0LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94cHJ0LmgKaW5kZXggNjAzOTRmYi4uZjc4MGU3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMveHBydC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3hwcnQuaApAQCAtMTA2LDcgKzEwNiw2IEBACiAKIHN0cnVjdCBycGNfeHBydF9vcHMgewogCXZvaWQJCSgqc2V0X2J1ZmZlcl9zaXplKShzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHNpemVfdCBzbmRzaXplLCBzaXplX3QgcmN2c2l6ZSk7Ci0JY2hhciAqCQkoKnByaW50X2FkZHIpKHN0cnVjdCBycGNfeHBydCAqeHBydCwgZW51bSBycGNfZGlzcGxheV9mb3JtYXRfdCBmb3JtYXQpOwogCWludAkJKCpyZXNlcnZlX3hwcnQpKHN0cnVjdCBycGNfdGFzayAqdGFzayk7CiAJdm9pZAkJKCpyZWxlYXNlX3hwcnQpKHN0cnVjdCBycGNfeHBydCAqeHBydCwgc3RydWN0IHJwY190YXNrICp0YXNrKTsKIAl2b2lkCQkoKnJwY2JpbmQpKHN0cnVjdCBycGNfdGFzayAqdGFzayk7CkBAIC0xMjYsOCArMTI1LDYgQEAKIHN0cnVjdCBycGNfeHBydCB7CiAJc3RydWN0IGtyZWYJCWtyZWY7CQkvKiBSZWZlcmVuY2UgY291bnQgKi8KIAlzdHJ1Y3QgcnBjX3hwcnRfb3BzICoJb3BzOwkJLyogdHJhbnNwb3J0IG1ldGhvZHMgKi8KLQlzdHJ1Y3Qgc29ja2V0ICoJCXNvY2s7CQkvKiBCU0Qgc29ja2V0IGxheWVyICovCi0Jc3RydWN0IHNvY2sgKgkJaW5ldDsJCS8qIElORVQgbGF5ZXIgKi8KIAogCXN0cnVjdCBycGNfdGltZW91dAl0aW1lb3V0OwkvKiB0aW1lb3V0IHBhcm1zICovCiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UJYWRkcjsJCS8qIHNlcnZlciBhZGRyZXNzICovCkBAIC0xMzcsOSArMTM0LDYgQEAKIAl1bnNpZ25lZCBsb25nCQljb25nOwkJLyogY3VycmVudCBjb25nZXN0aW9uICovCiAJdW5zaWduZWQgbG9uZwkJY3duZDsJCS8qIGNvbmdlc3Rpb24gd2luZG93ICovCiAKLQlzaXplX3QJCQlyY3ZzaXplLAkvKiB0cmFuc3BvcnQgcmN2IGJ1ZmZlciBzaXplICovCi0JCQkJc25kc2l6ZTsJLyogdHJhbnNwb3J0IHNlbmQgYnVmZmVyIHNpemUgKi8KLQogCXNpemVfdAkJCW1heF9wYXlsb2FkOwkvKiBsYXJnZXN0IFJQQyBwYXlsb2FkIHNpemUsCiAJCQkJCQkgICBpbiBieXRlcyAqLwogCXVuc2lnbmVkIGludAkJdHNoX3NpemU7CS8qIHNpemUgb2YgdHJhbnNwb3J0IHNwZWNpZmljCkBAIC0xNTgsMjcgKzE1MiwxMSBAQAogCQkJCXJlc3Zwb3J0ICAgOiAxOyAvKiB1c2UgYSByZXNlcnZlZCBwb3J0ICovCiAKIAkvKgotCSAqIFhJRAotCSAqLwotCV9fdTMyCQkJeGlkOwkJLyogTmV4dCBYSUQgdmFsdWUgdG8gdXNlICovCi0KLQkvKgotCSAqIFN0YXRlIG9mIFRDUCByZXBseSByZWNlaXZlIHN0dWZmCi0JICovCi0JX19iZTMyCQkJdGNwX3JlY20sCS8qIEZyYWdtZW50IGhlYWRlciAqLwotCQkJCXRjcF94aWQ7CS8qIEN1cnJlbnQgWElEICovCi0JdTMyCQkJdGNwX3JlY2xlbiwJLyogZnJhZ21lbnQgbGVuZ3RoICovCi0JCQkJdGNwX29mZnNldDsJLyogZnJhZ21lbnQgb2Zmc2V0ICovCi0JdW5zaWduZWQgbG9uZwkJdGNwX2NvcGllZCwJLyogY29waWVkIHRvIHJlcXVlc3QgKi8KLQkJCQl0Y3BfZmxhZ3M7Ci0JLyoKIAkgKiBDb25uZWN0aW9uIG9mIHRyYW5zcG9ydHMKIAkgKi8KIAl1bnNpZ25lZCBsb25nCQljb25uZWN0X3RpbWVvdXQsCiAJCQkJYmluZF90aW1lb3V0LAogCQkJCXJlZXN0YWJsaXNoX3RpbWVvdXQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CWNvbm5lY3Rfd29ya2VyOwotCXVuc2lnbmVkIHNob3J0CQlwb3J0OwogCiAJLyoKIAkgKiBEaXNjb25uZWN0aW9uIG9mIGlkbGUgdHJhbnNwb3J0cwpAQCAtMTkzLDggKzE3MSw4IEBACiAJICovCiAJc3BpbmxvY2tfdAkJdHJhbnNwb3J0X2xvY2s7CS8qIGxvY2sgdHJhbnNwb3J0IGluZm8gKi8KIAlzcGlubG9ja190CQlyZXNlcnZlX2xvY2s7CS8qIGxvY2sgc2xvdCB0YWJsZSAqLworCXUzMgkJCXhpZDsJCS8qIE5leHQgWElEIHZhbHVlIHRvIHVzZSAqLwogCXN0cnVjdCBycGNfdGFzayAqCXNuZF90YXNrOwkvKiBUYXNrIGJsb2NrZWQgaW4gc2VuZCAqLwotCiAJc3RydWN0IGxpc3RfaGVhZAlyZWN2OwogCiAJc3RydWN0IHsKQEAgLTIxMCwxOCArMTg4LDkgQEAKIAkJCQkJYmtsb2dfdTsJLyogYmFja2xvZyBxdWV1ZSB1dGlsaXphdGlvbiAqLwogCX0gc3RhdDsKIAotCXZvaWQJCQkoKm9sZF9kYXRhX3JlYWR5KShzdHJ1Y3Qgc29jayAqLCBpbnQpOwotCXZvaWQJCQkoKm9sZF9zdGF0ZV9jaGFuZ2UpKHN0cnVjdCBzb2NrICopOwotCXZvaWQJCQkoKm9sZF93cml0ZV9zcGFjZSkoc3RydWN0IHNvY2sgKik7Ci0KIAljaGFyICoJCQlhZGRyZXNzX3N0cmluZ3NbUlBDX0RJU1BMQVlfTUFYXTsKIH07CiAKLSNkZWZpbmUgWFBSVF9MQVNUX0ZSQUcJCSgxIDw8IDApCi0jZGVmaW5lIFhQUlRfQ09QWV9SRUNNCQkoMSA8PCAxKQotI2RlZmluZSBYUFJUX0NPUFlfWElECQkoMSA8PCAyKQotI2RlZmluZSBYUFJUX0NPUFlfREFUQQkJKDEgPDwgMykKLQogI2lmZGVmIF9fS0VSTkVMX18KIAogLyoKQEAgLTI3MCw4ICsyMzksOCBAQAogLyoKICAqIFNvY2tldCB0cmFuc3BvcnQgc2V0dXAgb3BlcmF0aW9ucwogICovCi1pbnQJCQl4c19zZXR1cF91ZHAoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBzdHJ1Y3QgcnBjX3RpbWVvdXQgKnRvKTsKLWludAkJCXhzX3NldHVwX3RjcChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHN0cnVjdCBycGNfdGltZW91dCAqdG8pOworc3RydWN0IHJwY194cHJ0ICoJeHNfc2V0dXBfdWRwKHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc2l6ZV90IGFkZHJsZW4sIHN0cnVjdCBycGNfdGltZW91dCAqdG8pOworc3RydWN0IHJwY194cHJ0ICoJeHNfc2V0dXBfdGNwKHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc2l6ZV90IGFkZHJsZW4sIHN0cnVjdCBycGNfdGltZW91dCAqdG8pOwogCiAvKgogICogUmVzZXJ2ZWQgYml0IHBvc2l0aW9ucyBpbiB4cHJ0LT5zdGF0ZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmggYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAppbmRleCBiMTIzN2YxLi5iZjk5YmQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaApAQCAtOSwxMCArOSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCi0vKiBwYWdlIGJhY2t1cCBlbnRyeSAqLworLyogc3RydWN0IHBiZSBpcyB1c2VkIGZvciBjcmVhdGluZyBsaXN0cyBvZiBwYWdlcyB0aGF0IHNob3VsZCBiZSByZXN0b3JlZAorICogYXRvbWljYWxseSBkdXJpbmcgdGhlIHJlc3VtZSBmcm9tIGRpc2ssIGJlY2F1c2UgdGhlIHBhZ2UgZnJhbWVzIHRoZXkgaGF2ZQorICogb2NjdXBpZWQgYmVmb3JlIHRoZSBzdXNwZW5kIGFyZSBpbiB1c2UuCisgKi8KIHN0cnVjdCBwYmUgewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsJCS8qIGFkZHJlc3Mgb2YgdGhlIGNvcHkgKi8KLQl1bnNpZ25lZCBsb25nIG9yaWdfYWRkcmVzczsJLyogb3JpZ2luYWwgYWRkcmVzcyBvZiBwYWdlICovCisJdm9pZCAqYWRkcmVzczsJCS8qIGFkZHJlc3Mgb2YgdGhlIGNvcHkgKi8KKwl2b2lkICpvcmlnX2FkZHJlc3M7CS8qIG9yaWdpbmFsIGFkZHJlc3Mgb2YgYSBwYWdlICovCiAJc3RydWN0IHBiZSAqbmV4dDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggZTdjMzZiYS4uYWRkNTFjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTIxOCw4ICsyMTgsNiBAQAogLyogbGludXgvbW0vcGFnZV9pby5jICovCiBleHRlcm4gaW50IHN3YXBfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gaW50IHN3YXBfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7Ci1leHRlcm4gaW50IHJ3X3N3YXBfcGFnZV9zeW5jKGludCBydywgc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCXN0cnVjdCBiaW8gKipiaW9fY2hhaW4pOwogZXh0ZXJuIGludCBlbmRfc3dhcF9iaW9fcmVhZChzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlc19kb25lLCBpbnQgZXJyKTsKIAogLyogbGludXgvbW0vc3dhcF9zdGF0ZS5jICovCkBAIC0yNDcsOSArMjQ1LDEwIEBACiBleHRlcm4gaW50IHZhbGlkX3N3YXBoYW5kbGVzKHN3cF9lbnRyeV90LCB1bnNpZ25lZCBsb25nICopOwogZXh0ZXJuIHZvaWQgc3dhcF9mcmVlKHN3cF9lbnRyeV90KTsKIGV4dGVybiB2b2lkIGZyZWVfc3dhcF9hbmRfY2FjaGUoc3dwX2VudHJ5X3QpOwotZXh0ZXJuIGludCBzd2FwX3R5cGVfb2YoZGV2X3QpOworZXh0ZXJuIGludCBzd2FwX3R5cGVfb2YoZGV2X3QsIHNlY3Rvcl90KTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQsIGludCk7CiBleHRlcm4gc2VjdG9yX3QgbWFwX3N3YXBfcGFnZShzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqLCBwZ29mZl90KTsKK2V4dGVybiBzZWN0b3JfdCBzd2FwZGV2X2Jsb2NrKGludCwgcGdvZmZfdCk7CiBleHRlcm4gc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKmdldF9zd2FwX2luZm9fc3RydWN0KHVuc2lnbmVkKTsKIGV4dGVybiBpbnQgY2FuX3NoYXJlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqKTsKIGV4dGVybiBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKik7CkBAIC0yNTksNyArMjU4LDYgQEAKIAogLyogbGludXgvbW0vdGhyYXNoLmMgKi8KIGV4dGVybiBzdHJ1Y3QgbW1fc3RydWN0ICogc3dhcF90b2tlbl9tbTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHN3YXBfdG9rZW5fZGVmYXVsdF90aW1lb3V0OwogZXh0ZXJuIHZvaWQgZ3JhYl9zd2FwX3Rva2VuKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19wdXRfc3dhcF90b2tlbihzdHJ1Y3QgbW1fc3RydWN0ICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCAxYjI0YmQ0Li44MTQ4MGU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTYsMTAgKzYsMTcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoqCisgKiogIFdBUk5JTkc6CiAgKiogIFRoZSB2YWx1ZXMgaW4gdGhpcyBmaWxlIGFyZSBleHBvcnRlZCB0byB1c2VyIHNwYWNlIHZpYSAKLSAqKiAgdGhlIHN5c2N0bCgpIGJpbmFyeSBpbnRlcmZhY2UuICBIb3dldmVyIHRoaXMgaW50ZXJmYWNlCi0gKiogIGlzIHVuc3RhYmxlIGFuZCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gCi0gKiogIEZvciBhIHN0YWJsZSBpbnRlcmZhY2UgdXNlIC9wcm9jL3N5cy4KKyAqKiAgdGhlIHN5c2N0bCgpIGJpbmFyeSBpbnRlcmZhY2UuICBEbyAqTk9UKiBjaGFuZ2UgdGhlCisgKiogIG51bWJlcmluZyBvZiBhbnkgZXhpc3RpbmcgdmFsdWVzIGhlcmUsIGFuZCBkbyBub3QgY2hhbmdlCisgKiogIGFueSBudW1iZXJzIHdpdGhpbiBhbnkgb25lIHNldCBvZiB2YWx1ZXMuICBJZiB5b3UgaGF2ZSB0bworICoqICByZWRlZmluZSBhbiBleGlzdGluZyBpbnRlcmZhY2UsIHVzZSBhIG5ldyBudW1iZXIgZm9yIGl0LgorICoqICBUaGUga2VybmVsIHdpbGwgdGhlbiByZXR1cm4gLUVOT1RESVIgdG8gYW55IGFwcGxpY2F0aW9uIHVzaW5nCisgKiogIHRoZSBvbGQgYmluYXJ5IGludGVyZmFjZS4KKyAqKgorICoqICBGb3IgbmV3IGludGVyZmFjZXMgdW5sZXNzIHlvdSByZWFsbHkgbmVlZCBhIGJpbmFyeSBudW1iZXIKKyAqKiAgcGxlYXNlIHVzZSBDVExfVU5OVU1CRVJFRC4KICAqKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00OCw2ICs1NSw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBDVExfQU5ZCQktMQkvKiBNYXRjaGVzIGFueSBuYW1lICovCiAjZGVmaW5lIENUTF9OT05FCTAKKyNkZWZpbmUgQ1RMX1VOTlVNQkVSRUQJQ1RMX05PTkUJLyogc3lzY3RsIHdpdGhvdXQgYSBiaW5hcnkgbnVtYmVyICovCiAjZW5kaWYKIAogZW51bQpAQCAtNDE4LDYgKzQyNiw4IEBACiAJTkVUX0NJUFNPVjRfQ0FDSEVfQlVDS0VUX1NJWkU9MTE5LAogCU5FVF9DSVBTT1Y0X1JCTV9PUFRGTVQ9MTIwLAogCU5FVF9DSVBTT1Y0X1JCTV9TVFJJQ1RWQUxJRD0xMjEsCisJTkVUX1RDUF9BVkFJTF9DT05HX0NPTlRST0w9MTIyLAorCU5FVF9UQ1BfQUxMT1dFRF9DT05HX0NPTlRST0w9MTIzLAogfTsKIAogZW51bSB7CkBAIC01OTYsMTYgKzYwNiw2IEBACiAJTkVUX0RDQ1BfREVGQVVMVD0xLAogfTsKIAotLyogL3Byb2Mvc3lzL25ldC9kY2NwL2RlZmF1bHQgKi8KLWVudW0gewotCU5FVF9EQ0NQX0RFRkFVTFRfU0VRX1dJTkRPVyAgPSAxLAotCU5FVF9EQ0NQX0RFRkFVTFRfUlhfQ0NJRCAgICAgPSAyLAotCU5FVF9EQ0NQX0RFRkFVTFRfVFhfQ0NJRCAgICAgPSAzLAotCU5FVF9EQ0NQX0RFRkFVTFRfQUNLX1JBVElPICAgPSA0LAotCU5FVF9EQ0NQX0RFRkFVTFRfU0VORF9BQ0tWRUMgPSA1LAotCU5FVF9EQ0NQX0RFRkFVTFRfU0VORF9ORFAgICAgPSA2LAotfTsKLQogLyogL3Byb2Mvc3lzL25ldC9pcHggKi8KIGVudW0gewogCU5FVF9JUFhfUFBST1BfQlJPQURDQVNUSU5HPTEsCkBAIC05MTgsOCArOTE4LDcgQEAKIAogdHlwZWRlZiBpbnQgY3RsX2hhbmRsZXIgKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAogCQkJIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCi0JCQkgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgCi0JCQkgdm9pZCAqKmNvbnRleHQpOworCQkJIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOwogCiB0eXBlZGVmIGludCBwcm9jX2hhbmRsZXIgKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICogZmlscCwKIAkJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOwpAQCAtOTUwLDcgKzk0OSw3IEBACiBleHRlcm4gaW50IGRvX3N5c2N0bF9zdHJhdGVneSAoY3RsX3RhYmxlICp0YWJsZSwgCiAJCQkgICAgICAgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCQkgICAgICAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJCSAgICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCB2b2lkICoqIGNvbnRleHQpOworCQkJICAgICAgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOwogCiBleHRlcm4gY3RsX2hhbmRsZXIgc3lzY3RsX3N0cmluZzsKIGV4dGVybiBjdGxfaGFuZGxlciBzeXNjdGxfaW50dmVjOwpAQCAtOTYxLDggKzk2MCw4IEBACiAvKgogICogUmVnaXN0ZXIgYSBzZXQgb2Ygc3lzY3RsIG5hbWVzIGJ5IGNhbGxpbmcgcmVnaXN0ZXJfc3lzY3RsX3RhYmxlCiAgKiB3aXRoIGFuIGluaXRpYWxpc2VkIGFycmF5IG9mIGN0bF90YWJsZSdzLiAgQW4gZW50cnkgd2l0aCB6ZXJvCi0gKiBjdGxfbmFtZSB0ZXJtaW5hdGVzIHRoZSB0YWJsZS4gIHRhYmxlLT5kZSB3aWxsIGJlIHNldCB1cCBieSB0aGUKLSAqIHJlZ2lzdHJhdGlvbiBhbmQgbmVlZCBub3QgYmUgaW5pdGlhbGlzZWQgaW4gYWR2YW5jZS4KKyAqIGN0bF9uYW1lIGFuZCBOVUxMIHByb2NuYW1lIHRlcm1pbmF0ZXMgdGhlIHRhYmxlLiAgdGFibGUtPmRlIHdpbGwgYmUKKyAqIHNldCB1cCBieSB0aGUgcmVnaXN0cmF0aW9uIGFuZCBuZWVkIG5vdCBiZSBpbml0aWFsaXNlZCBpbiBhZHZhbmNlLgogICoKICAqIHN5c2N0bCBuYW1lcyBjYW4gYmUgbWlycm9yZWQgYXV0b21hdGljYWxseSB1bmRlciAvcHJvYy9zeXMuICBUaGUKICAqIHByb2NuYW1lIHN1cHBsaWVkIGNvbnRyb2xzIC9wcm9jIG5hbWluZy4KQEAgLTk3Myw3ICs5NzIsMTAgQEAKICAqIExlYWYgbm9kZXMgaW4gdGhlIHN5c2N0bCB0cmVlIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZmlsZQogICogdW5kZXIgL3Byb2M7IG5vbi1sZWFmIG5vZGVzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgZGlyZWN0b3JpZXMuICBBCiAgKiBudWxsIHByb2NuYW1lIGRpc2FibGVzIC9wcm9jIG1pcnJvcmluZyBhdCB0aGlzIG5vZGUuCi0gKiAKKyAqCisgKiBzeXNjdGwgZW50cmllcyB3aXRoIGEgemVybyBjdGxfbmFtZSB3aWxsIG5vdCBiZSBhdmFpbGFibGUgdGhyb3VnaAorICogdGhlIGJpbmFyeSBzeXNjdGwgaW50ZXJmYWNlLgorICoKICAqIHN5c2N0bCgyKSBjYW4gYXV0b21hdGljYWxseSBtYW5hZ2UgcmVhZCBhbmQgd3JpdGUgcmVxdWVzdHMgdGhyb3VnaAogICogdGhlIHN5c2N0bCB0YWJsZS4gIFRoZSBkYXRhIGFuZCBtYXhsZW4gZmllbGRzIG9mIHRoZSBjdGxfdGFibGUKICAqIHN0cnVjdCBlbmFibGUgbWluaW1hbCB2YWxpZGF0aW9uIG9mIHRoZSB2YWx1ZXMgYmVpbmcgd3JpdHRlbiB0byBiZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNmcy5oIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCmluZGV4IDZkNWM0M2QuLjIxMjlkMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKQEAgLTk3LDYgKzk3LDkgQEAKIHN5c2ZzX3JlbmFtZV9kaXIoc3RydWN0IGtvYmplY3QgKiwgY29uc3QgY2hhciAqbmV3X25hbWUpOwogCiBleHRlcm4gaW50IF9fbXVzdF9jaGVjaworc3lzZnNfbW92ZV9kaXIoc3RydWN0IGtvYmplY3QgKiwgc3RydWN0IGtvYmplY3QgKik7CisKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrCiBzeXNmc19jcmVhdGVfZmlsZShzdHJ1Y3Qga29iamVjdCAqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICopOwogCiBleHRlcm4gaW50IF9fbXVzdF9jaGVjawpAQCAtMTQyLDYgKzE0NSwxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzeXNmc19tb3ZlX2RpcihzdHJ1Y3Qga29iamVjdCAqIGssIHN0cnVjdCBrb2JqZWN0ICogbmV3X3BhcmVudCkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc3lzZnNfY3JlYXRlX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICogYSkKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzcnEuaCBiL2luY2x1ZGUvbGludXgvc3lzcnEuaAppbmRleCA5ZGY4ODMzLi45OGExZDhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c3JxLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNycS5oCkBAIC0zNywyMyArMzcsMzcgQEAKIAogI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQogCitleHRlcm4gaW50IHN5c3JxX29uKHZvaWQpOworCisvKgorICogRG8gbm90IHVzZSB0aGlzIG9uZSBkaXJlY3RseToKKyAqLworZXh0ZXJuIGludCBfX3N5c3JxX2VuYWJsZWQ7CisKIC8qIEdlbmVyaWMgU3lzUnEgaW50ZXJmYWNlIC0tIHlvdSBtYXkgY2FsbCBpdCBmcm9tIGFueSBkZXZpY2UgZHJpdmVyLCBzdXBwbHlpbmcKICAqIEFTQ0lJIGNvZGUgb2YgdGhlIGtleSwgcG9pbnRlciB0byByZWdpc3RlcnMgYW5kIGtiZC90dHkgc3RydWN0cyAoaWYgdGhleQogICogYXJlIGF2YWlsYWJsZSAtLSBlbHNlIE5VTEwncykuCiAgKi8KIAotdm9pZCBoYW5kbGVfc3lzcnEoaW50LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXZvaWQgX19oYW5kbGVfc3lzcnEoaW50LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBpbnQgY2hlY2tfbWFzayk7Ci1pbnQgcmVnaXN0ZXJfc3lzcnFfa2V5KGludCwgc3RydWN0IHN5c3JxX2tleV9vcCAqKTsKLWludCB1bnJlZ2lzdGVyX3N5c3JxX2tleShpbnQsIHN0cnVjdCBzeXNycV9rZXlfb3AgKik7Cit2b2lkIGhhbmRsZV9zeXNycShpbnQga2V5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3ZvaWQgX19oYW5kbGVfc3lzcnEoaW50IGtleSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGNoZWNrX21hc2spOworaW50IHJlZ2lzdGVyX3N5c3JxX2tleShpbnQga2V5LCBzdHJ1Y3Qgc3lzcnFfa2V5X29wICpvcCk7CitpbnQgdW5yZWdpc3Rlcl9zeXNycV9rZXkoaW50IGtleSwgc3RydWN0IHN5c3JxX2tleV9vcCAqb3ApOwogc3RydWN0IHN5c3JxX2tleV9vcCAqX19zeXNycV9nZXRfa2V5X29wKGludCBrZXkpOwogCiAjZWxzZQogCitzdGF0aWMgaW5saW5lIGludCBzeXNycV9vbih2b2lkKQoreworCXJldHVybiAwOworfQogc3RhdGljIGlubGluZSBpbnQgX19yZXRlcnIodm9pZCkKIHsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfc3lzcnEoaW50IGtleSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKK30KIAogI2RlZmluZSByZWdpc3Rlcl9zeXNycV9rZXkoaWcsbm9yZSkgX19yZXRlcnIoKQogI2RlZmluZSB1bnJlZ2lzdGVyX3N5c3JxX2tleShpZyxub3JlKSBfX3JldGVycigpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZy5oIGIvaW5jbHVkZS9saW51eC90YXNrX2lvX2FjY291bnRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQwMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90YXNrX2lvX2FjY291bnRpbmcuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogdGFza19pb19hY2NvdW50aW5nOiBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciByZWNvcmRpbmcgYSBzaW5nbGUgdGFzaydzCisgKiBJTyBzdGF0aXN0aWNzLgorICoKKyAqIERvbid0IGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSBkaXJlY3RseSAtIGl0IGlzIGRlc2lnbmVkIHRvIGJlIGRyYWdnZWQgaW4gdmlhCisgKiBzY2hlZC5oLgorICoKKyAqIEJsYW1lIGFrcG1Ab3NkbC5vcmcgZm9yIGFsbCB0aGlzLgorICovCisKKyNpZmRlZiBDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HCitzdHJ1Y3QgdGFza19pb19hY2NvdW50aW5nIHsKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggdGhpcyB0YXNrIGhhcyBjYXVzZWQgdG8gYmUgcmVhZCBmcm9tCisJICogc3RvcmFnZS4KKwkgKi8KKwl1NjQgcmVhZF9ieXRlczsKKworCS8qCisJICogVGhlIG51bWJlciBvZiBieXRlcyB3aGljaCB0aGlzIHRhc2sgaGFzIGNhdXNlZCwgb3Igc2hhbGwgY2F1c2UgdG8gYmUKKwkgKiB3cml0dGVuIHRvIGRpc2suCisJICovCisJdTY0IHdyaXRlX2J5dGVzOworCisJLyoKKwkgKiBBIHRhc2sgY2FuIGNhdXNlICJuZWdhdGl2ZSIgSU8gdG9vLiAgSWYgdGhpcyB0YXNrIHRydW5jYXRlcyBzb21lCisJICogZGlydHkgcGFnZWNhY2hlLCBzb21lIElPIHdoaWNoIGFub3RoZXIgdGFzayBoYXMgYmVlbiBhY2NvdW50ZWQgZm9yCisJICogKGluIGl0cyB3cml0ZV9ieXRlcykgd2lsbCBub3QgYmUgaGFwcGVuaW5nLiAgV2UgX2NvdWxkXyBqdXN0CisJICogc3VidHJhY3QgdGhhdCBmcm9tIHRoZSB0cnVuY2F0aW5nIHRhc2sncyB3cml0ZV9ieXRlcywgYnV0IHRoZXJlIGlzCisJICogaW5mb3JtYXRpb24gbG9zcyBpbiBkb2luZyB0aGF0LgorCSAqLworCXU2NCBjYW5jZWxsZWRfd3JpdGVfYnl0ZXM7Cit9OworI2Vsc2UKK3N0cnVjdCB0YXNrX2lvX2FjY291bnRpbmcgeworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmggYi9pbmNsdWRlL2xpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjJhMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIFRhc2sgSS9PIGFjY291bnRpbmcgb3BlcmF0aW9ucworICovCisjaWZuZGVmIF9fVEFTS19JT19BQ0NPVU5USU5HX09QU19JTkNMVURFRAorI2RlZmluZSBfX1RBU0tfSU9fQUNDT1VOVElOR19PUFNfSU5DTFVERUQKKworI2lmZGVmIENPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkcKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX2lvX2FjY291bnRfcmVhZChzaXplX3QgYnl0ZXMpCit7CisJY3VycmVudC0+aW9hYy5yZWFkX2J5dGVzICs9IGJ5dGVzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50X3dyaXRlKHNpemVfdCBieXRlcykKK3sKKwljdXJyZW50LT5pb2FjLndyaXRlX2J5dGVzICs9IGJ5dGVzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50X2NhbmNlbGxlZF93cml0ZShzaXplX3QgYnl0ZXMpCit7CisJY3VycmVudC0+aW9hYy5jYW5jZWxsZWRfd3JpdGVfYnl0ZXMgKz0gYnl0ZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX2lvX2FjY291bnRpbmdfaW5pdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwltZW1zZXQoJnRzay0+aW9hYywgMCwgc2l6ZW9mKHRzay0+aW9hYykpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50X3JlYWQoc2l6ZV90IGJ5dGVzKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50X3dyaXRlKHNpemVfdCBieXRlcykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRhc2tfaW9fYWNjb3VudF9jYW5jZWxsZWRfd3JpdGUoc2l6ZV90IGJ5dGVzKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50aW5nX2luaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7Cit9CisKKyNlbmRpZgkJLyogQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORyAqLworI2VuZGlmCQkvKiBfX1RBU0tfSU9fQUNDT1VOVElOR19PUFNfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmggYi9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cy5oCmluZGV4IDQ1MjQ4ODAuLjNmY2VkNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaApAQCAtMzEsNyArMzEsNyBAQAogICovCiAKIAotI2RlZmluZSBUQVNLU1RBVFNfVkVSU0lPTgkyCisjZGVmaW5lIFRBU0tTVEFUU19WRVJTSU9OCTMKICNkZWZpbmUgVFNfQ09NTV9MRU4JCTMyCS8qIHNob3VsZCBiZSA+PSBUQVNLX0NPTU1fTEVOCiAJCQkJCSAqIGluIGxpbnV4L3NjaGVkLmggKi8KIApAQCAtMTE1LDMxICsxMTUsMzcgQEAKIAlfX3U2NAlhY19tYWpmbHQ7CQkvKiBNYWpvciBQYWdlIEZhdWx0IENvdW50ICovCiAJLyogQmFzaWMgQWNjb3VudGluZyBGaWVsZHMgZW5kICovCiAKLSAJLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgc3RhcnQgKi8KKwkvKiBFeHRlbmRlZCBhY2NvdW50aW5nIGZpZWxkcyBzdGFydCAqLwogCS8qIEFjY3VtdWxhdGVkIFJTUyB1c2FnZSBpbiBkdXJhdGlvbiBvZiBhIHRhc2ssIGluIE1CeXRlcy11c2Vjcy4KIAkgKiBUaGUgY3VycmVudCByc3MgdXNhZ2UgaXMgYWRkZWQgdG8gdGhpcyBjb3VudGVyIGV2ZXJ5IHRpbWUKIAkgKiBhIHRpY2sgaXMgY2hhcmdlZCB0byBhIHRhc2sncyBzeXN0ZW0gdGltZS4gU28sIGF0IHRoZSBlbmQgd2UKIAkgKiB3aWxsIGhhdmUgbWVtb3J5IHVzYWdlIG11bHRpcGxpZWQgYnkgc3lzdGVtIHRpbWUuIFRodXMgYW4KIAkgKiBhdmVyYWdlIHVzYWdlIHBlciBzeXN0ZW0gdGltZSB1bml0IGNhbiBiZSBjYWxjdWxhdGVkLgogCSAqLwotIAlfX3U2NAljb3JlbWVtOwkJLyogYWNjdW11bGF0ZWQgUlNTIHVzYWdlIGluIE1CLXVzZWMgKi8KKwlfX3U2NAljb3JlbWVtOwkJLyogYWNjdW11bGF0ZWQgUlNTIHVzYWdlIGluIE1CLXVzZWMgKi8KIAkvKiBBY2N1bXVsYXRlZCB2aXJ0dWFsIG1lbW9yeSB1c2FnZSBpbiBkdXJhdGlvbiBvZiBhIHRhc2suCiAJICogU2FtZSBhcyBhY2N0X3Jzc19tZW0xIGFib3ZlIGV4Y2VwdCB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgVk0gdXNhZ2UuCiAJICovCi0gCV9fdTY0CXZpcnRtZW07CQkvKiBhY2N1bXVsYXRlZCBWTSAgdXNhZ2UgaW4gTUItdXNlYyAqLworCV9fdTY0CXZpcnRtZW07CQkvKiBhY2N1bXVsYXRlZCBWTSAgdXNhZ2UgaW4gTUItdXNlYyAqLwogCiAJLyogSGlnaCB3YXRlcm1hcmsgb2YgUlNTIGFuZCB2aXJ0dWFsIG1lbW9yeSB1c2FnZSBpbiBkdXJhdGlvbiBvZgogCSAqIGEgdGFzaywgaW4gS0J5dGVzLgogCSAqLwotIAlfX3U2NAloaXdhdGVyX3JzczsJCS8qIEhpZ2gtd2F0ZXJtYXJrIG9mIFJTUyB1c2FnZSwgaW4gS0IgKi8KLSAJX191NjQJaGl3YXRlcl92bTsJCS8qIEhpZ2gtd2F0ZXIgVk0gdXNhZ2UsIGluIEtCICovCisJX191NjQJaGl3YXRlcl9yc3M7CQkvKiBIaWdoLXdhdGVybWFyayBvZiBSU1MgdXNhZ2UsIGluIEtCICovCisJX191NjQJaGl3YXRlcl92bTsJCS8qIEhpZ2gtd2F0ZXIgVk0gdXNhZ2UsIGluIEtCICovCiAKIAkvKiBUaGUgZm9sbG93aW5nIGZvdXIgZmllbGRzIGFyZSBJL08gc3RhdGlzdGljcyBvZiBhIHRhc2suICovCi0gCV9fdTY0CXJlYWRfY2hhcjsJCS8qIGJ5dGVzIHJlYWQgKi8KLSAJX191NjQJd3JpdGVfY2hhcjsJCS8qIGJ5dGVzIHdyaXR0ZW4gKi8KLSAJX191NjQJcmVhZF9zeXNjYWxsczsJCS8qIHJlYWQgc3lzY2FsbHMgKi8KLSAJX191NjQJd3JpdGVfc3lzY2FsbHM7CQkvKiB3cml0ZSBzeXNjYWxscyAqLwotIAkvKiBFeHRlbmRlZCBhY2NvdW50aW5nIGZpZWxkcyBlbmQgKi8KKwlfX3U2NAlyZWFkX2NoYXI7CQkvKiBieXRlcyByZWFkICovCisJX191NjQJd3JpdGVfY2hhcjsJCS8qIGJ5dGVzIHdyaXR0ZW4gKi8KKwlfX3U2NAlyZWFkX3N5c2NhbGxzOwkJLyogcmVhZCBzeXNjYWxscyAqLworCV9fdTY0CXdyaXRlX3N5c2NhbGxzOwkJLyogd3JpdGUgc3lzY2FsbHMgKi8KKwkvKiBFeHRlbmRlZCBhY2NvdW50aW5nIGZpZWxkcyBlbmQgKi8KKworI2RlZmluZSBUQVNLU1RBVFNfSEFTX0lPX0FDQ09VTlRJTkcKKwkvKiBQZXItdGFzayBzdG9yYWdlIEkvTyBhY2NvdW50aW5nIHN0YXJ0cyAqLworCV9fdTY0CXJlYWRfYnl0ZXM7CQkvKiBieXRlcyBvZiByZWFkIEkvTyAqLworCV9fdTY0CXdyaXRlX2J5dGVzOwkJLyogYnl0ZXMgb2Ygd3JpdGUgSS9PICovCisJX191NjQJY2FuY2VsbGVkX3dyaXRlX2J5dGVzOwkvKiBieXRlcyBvZiBjYW5jZWxsZWQgd3JpdGUgSS9PICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGFza3N0YXRzX2tlcm4uaCBiL2luY2x1ZGUvbGludXgvdGFza3N0YXRzX2tlcm4uaAppbmRleCAxNjg5NGI3Li43ZTk2ODBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0c19rZXJuLmgKKysrIGIvaW5jbHVkZS9saW51eC90YXNrc3RhdHNfa2Vybi5oCkBAIC0xMiw3MyArMTIsMjcgQEAKICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAKICNpZmRlZiBDT05GSUdfVEFTS1NUQVRTCi1leHRlcm4ga21lbV9jYWNoZV90ICp0YXNrc3RhdHNfY2FjaGU7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnRhc2tzdGF0c19jYWNoZTsKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggdGFza3N0YXRzX2V4aXRfbXV0ZXg7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0YXNrc3RhdHNfZXhpdF9mcmVlKHN0cnVjdCB0YXNrc3RhdHMgKnRpZHN0YXRzKQotewotCWlmICh0aWRzdGF0cykKLQkJa21lbV9jYWNoZV9mcmVlKHRhc2tzdGF0c19jYWNoZSwgdGlkc3RhdHMpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX3RnaWRfaW5pdChzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQogewotCXNwaW5fbG9ja19pbml0KCZzaWctPnN0YXRzX2xvY2spOwogCXNpZy0+c3RhdHMgPSBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX3RnaWRfYWxsb2Moc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKLXsKLQlzdHJ1Y3QgdGFza3N0YXRzICpzdGF0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3RhdHMgPSBrbWVtX2NhY2hlX3phbGxvYyh0YXNrc3RhdHNfY2FjaGUsIFNMQUJfS0VSTkVMKTsKLQlpZiAoIXN0YXRzKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2lnLT5zdGF0c19sb2NrLCBmbGFncyk7Ci0JaWYgKCFzaWctPnN0YXRzKSB7Ci0JCXNpZy0+c3RhdHMgPSBzdGF0czsKLQkJc3RhdHMgPSBOVUxMOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaWctPnN0YXRzX2xvY2ssIGZsYWdzKTsKLQotCWlmIChzdGF0cykKLQkJa21lbV9jYWNoZV9mcmVlKHRhc2tzdGF0c19jYWNoZSwgc3RhdHMpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX3RnaWRfZnJlZShzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQogewotCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNpZy0+c3RhdHNfbG9jaywgZmxhZ3MpOwotCWlmIChzaWctPnN0YXRzKSB7Ci0JCXN0YXRzID0gc2lnLT5zdGF0czsKLQkJc2lnLT5zdGF0cyA9IE5VTEw7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNpZy0+c3RhdHNfbG9jaywgZmxhZ3MpOwotCWlmIChzdGF0cykKLQkJa21lbV9jYWNoZV9mcmVlKHRhc2tzdGF0c19jYWNoZSwgc3RhdHMpOworCWlmIChzaWctPnN0YXRzKQorCQlrbWVtX2NhY2hlX2ZyZWUodGFza3N0YXRzX2NhY2hlLCBzaWctPnN0YXRzKTsKIH0KIAotZXh0ZXJuIHZvaWQgdGFza3N0YXRzX2V4aXRfYWxsb2Moc3RydWN0IHRhc2tzdGF0cyAqKiwgdW5zaWduZWQgaW50ICopOwotZXh0ZXJuIHZvaWQgdGFza3N0YXRzX2V4aXRfc2VuZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgc3RydWN0IHRhc2tzdGF0cyAqLCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCB0YXNrc3RhdHNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaW50IGdyb3VwX2RlYWQpOwogZXh0ZXJuIHZvaWQgdGFza3N0YXRzX2luaXRfZWFybHkodm9pZCk7Ci1leHRlcm4gdm9pZCB0YXNrc3RhdHNfdGdpZF9hbGxvYyhzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX2V4aXRfYWxsb2Moc3RydWN0IHRhc2tzdGF0cyAqKnB0aWRzdGF0cywgdW5zaWduZWQgaW50ICpteWNwdSkKLXt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX2V4aXRfZnJlZShzdHJ1Y3QgdGFza3N0YXRzICpwdGlkc3RhdHMpCi17fQotc3RhdGljIGlubGluZSB2b2lkIHRhc2tzdGF0c19leGl0X3NlbmQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQkJICAgICAgIHN0cnVjdCB0YXNrc3RhdHMgKnRpZHN0YXRzLAotCQkJCSAgICAgICBpbnQgZ3JvdXBfZGVhZCwgdW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrc3RhdHNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGdyb3VwX2RlYWQpCiB7fQogc3RhdGljIGlubGluZSB2b2lkIHRhc2tzdGF0c190Z2lkX2luaXQoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX3RnaWRfYWxsb2Moc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKLXt9CiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza3N0YXRzX3RnaWRfZnJlZShzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQoge30KIHN0YXRpYyBpbmxpbmUgdm9pZCB0YXNrc3RhdHNfaW5pdF9lYXJseSh2b2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y3AuaCBiL2luY2x1ZGUvbGludXgvdGNwLmgKaW5kZXggMGUwNThhMi4uM2NjNzBkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RjcC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KIAogc3RydWN0IHRjcGhkciB7CiAJX19iZTE2CXNvdXJjZTsKQEAgLTUxLDcgKzUyLDcgQEAKICNlcnJvcgkiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKICNlbmRpZgkKIAlfX2JlMTYJd2luZG93OwotCV9fYmUxNgljaGVjazsKKwlfX3N1bTE2CWNoZWNrOwogCV9fYmUxNgl1cmdfcHRyOwogfTsKIApAQCAtOTQsNiArOTUsNyBAQAogI2RlZmluZSBUQ1BfSU5GTwkJMTEJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25uZWN0aW9uLiAqLwogI2RlZmluZSBUQ1BfUVVJQ0tBQ0sJCTEyCS8qIEJsb2NrL3JlZW5hYmxlIHF1aWNrIGFja3MgKi8KICNkZWZpbmUgVENQX0NPTkdFU1RJT04JCTEzCS8qIENvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0gKi8KKyNkZWZpbmUgVENQX01ENVNJRwkJMTQJLyogVENQIE1ENSBTaWduYXR1cmUgKFJGQzIzODUpICovCiAKICNkZWZpbmUgVENQSV9PUFRfVElNRVNUQU1QUwkxCiAjZGVmaW5lIFRDUElfT1BUX1NBQ0sJCTIKQEAgLTE1Nyw2ICsxNTksMTcgQEAKIAlfX3UzMgl0Y3BpX3RvdGFsX3JldHJhbnM7CiB9OwogCisvKiBmb3IgVENQX01ENVNJRyBzb2NrZXQgb3B0aW9uICovCisjZGVmaW5lIFRDUF9NRDVTSUdfTUFYS0VZTEVOCTgwCisKK3N0cnVjdCB0Y3BfbWQ1c2lnIHsKKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSB0Y3BtX2FkZHI7CS8qIGFkZHJlc3MgYXNzb2NpYXRlZCAqLworCV9fdTE2CV9fdGNwbV9wYWQxOwkJCQkvKiB6ZXJvICovCisJX191MTYJdGNwbV9rZXlsZW47CQkJCS8qIGtleSBsZW5ndGggKi8KKwlfX3UzMglfX3RjcG1fcGFkMjsJCQkJLyogemVybyAqLworCV9fdTgJdGNwbV9rZXlbVENQX01ENVNJR19NQVhLRVlMRU5dOwkJLyoga2V5IChiaW5hcnkpICovCit9OworCiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC0xNzIsMTcgKzE4NSwxNyBAQAogfTsKIAogc3RydWN0IHRjcF9zYWNrX2Jsb2NrIHsKLQlfX3UzMglzdGFydF9zZXE7Ci0JX191MzIJZW5kX3NlcTsKKwl1MzIJc3RhcnRfc2VxOworCXUzMgllbmRfc2VxOwogfTsKIAogc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHsKIC8qCVBBV1MvUlRUTSBkYXRhCSovCiAJbG9uZwl0c19yZWNlbnRfc3RhbXA7LyogVGltZSB3ZSBzdG9yZWQgdHNfcmVjZW50IChmb3IgYWdpbmcpICovCi0JX191MzIJdHNfcmVjZW50OwkvKiBUaW1lIHN0YW1wIHRvIGVjaG8gbmV4dAkJKi8KLQlfX3UzMglyY3ZfdHN2YWw7CS8qIFRpbWUgc3RhbXAgdmFsdWUgICAgICAgICAgICAgCSovCi0JX191MzIJcmN2X3RzZWNyOwkvKiBUaW1lIHN0YW1wIGVjaG8gcmVwbHkgICAgICAgIAkqLwotCV9fdTE2IAlzYXdfdHN0YW1wIDogMSwJLyogU2F3IFRJTUVTVEFNUCBvbiBsYXN0IHBhY2tldAkJKi8KKwl1MzIJdHNfcmVjZW50OwkvKiBUaW1lIHN0YW1wIHRvIGVjaG8gbmV4dAkJKi8KKwl1MzIJcmN2X3RzdmFsOwkvKiBUaW1lIHN0YW1wIHZhbHVlICAgICAgICAgICAgIAkqLworCXUzMglyY3ZfdHNlY3I7CS8qIFRpbWUgc3RhbXAgZWNobyByZXBseSAgICAgICAgCSovCisJdTE2IAlzYXdfdHN0YW1wIDogMSwJLyogU2F3IFRJTUVTVEFNUCBvbiBsYXN0IHBhY2tldAkJKi8KIAkJdHN0YW1wX29rIDogMSwJLyogVElNRVNUQU1QIHNlZW4gb24gU1lOIHBhY2tldAkJKi8KIAkJZHNhY2sgOiAxLAkvKiBELVNBQ0sgaXMgc2NoZWR1bGVkCQkJKi8KIAkJd3NjYWxlX29rIDogMSwJLyogV3NjYWxlIHNlZW4gb24gU1lOIHBhY2tldAkJKi8KQEAgLTE5MCwxNiArMjAzLDIwIEBACiAJCXNuZF93c2NhbGUgOiA0LAkvKiBXaW5kb3cgc2NhbGluZyByZWNlaXZlZCBmcm9tIHNlbmRlcgkqLwogCQlyY3Zfd3NjYWxlIDogNDsJLyogV2luZG93IHNjYWxpbmcgdG8gc2VuZCB0byByZWNlaXZlcgkqLwogLyoJU0FDS3MgZGF0YQkqLwotCV9fdTgJZWZmX3NhY2tzOwkvKiBTaXplIG9mIFNBQ0sgYXJyYXkgdG8gc2VuZCB3aXRoIG5leHQgcGFja2V0ICovCi0JX191OAludW1fc2Fja3M7CS8qIE51bWJlciBvZiBTQUNLIGJsb2NrcwkJKi8KLQlfX3UxNgl1c2VyX21zczsgIAkvKiBtc3MgcmVxdWVzdGVkIGJ5IHVzZXIgaW4gaW9jdGwgKi8KLQlfX3UxNgltc3NfY2xhbXA7CS8qIE1heGltYWwgbXNzLCBuZWdvdGlhdGVkIGF0IGNvbm5lY3Rpb24gc2V0dXAgKi8KKwl1OAllZmZfc2Fja3M7CS8qIFNpemUgb2YgU0FDSyBhcnJheSB0byBzZW5kIHdpdGggbmV4dCBwYWNrZXQgKi8KKwl1OAludW1fc2Fja3M7CS8qIE51bWJlciBvZiBTQUNLIGJsb2NrcwkJKi8KKwl1MTYJdXNlcl9tc3M7ICAJLyogbXNzIHJlcXVlc3RlZCBieSB1c2VyIGluIGlvY3RsICovCisJdTE2CW1zc19jbGFtcDsJLyogTWF4aW1hbCBtc3MsIG5lZ290aWF0ZWQgYXQgY29ubmVjdGlvbiBzZXR1cCAqLwogfTsKIAogc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2sgewotCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayByZXE7Ci0JX191MzIJCQkgcmN2X2lzbjsKLQlfX3UzMgkJCSBzbnRfaXNuOworCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAJcmVxOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJLyogT25seSB1c2VkIGJ5IFRDUCBNRDUgU2lnbmF0dXJlIHNvIGZhci4gKi8KKwlzdHJ1Y3QgdGNwX3JlcXVlc3Rfc29ja19vcHMJKmFmX3NwZWNpZmljOworI2VuZGlmCisJdTMyCQkJIAlyY3ZfaXNuOworCXUzMgkJCSAJc250X2lzbjsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2sgKnRjcF9yc2soY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQpAQCAtMjEwLDcgKzIyNyw4IEBACiBzdHJ1Y3QgdGNwX3NvY2sgewogCS8qIGluZXRfY29ubmVjdGlvbl9zb2NrIGhhcyB0byBiZSB0aGUgZmlyc3QgbWVtYmVyIG9mIHRjcF9zb2NrICovCiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrCWluZXRfY29ubjsKLQlpbnQJdGNwX2hlYWRlcl9sZW47CS8qIEJ5dGVzIG9mIHRjcCBoZWFkZXIgdG8gc2VuZAkJKi8KKwl1MTYJdGNwX2hlYWRlcl9sZW47CS8qIEJ5dGVzIG9mIHRjcCBoZWFkZXIgdG8gc2VuZAkJKi8KKwl1MTYJeG1pdF9zaXplX2dvYWw7CS8qIEdvYWwgZm9yIHNlZ21lbnRpbmcgb3V0cHV0IHBhY2tldHMJKi8KIAogLyoKICAqCUhlYWRlciBwcmVkaWN0aW9uIGZsYWdzCkBAIC0yMjMsMTMgKzI0MSwxMyBAQAogICoJcmVhZCB0aGUgY29kZSBhbmQgdGhlIHNwZWMgc2lkZSBieSBzaWRlIChhbmQgbGF1Z2ggLi4uKQogICoJU2VlIFJGQzc5MyBhbmQgUkZDMTEyMi4gVGhlIFJGQyB3cml0ZXMgdGhlc2UgaW4gY2FwaXRhbHMuCiAgKi8KLSAJX191MzIJcmN2X254dDsJLyogV2hhdCB3ZSB3YW50IHRvIHJlY2VpdmUgbmV4dCAJKi8KLSAJX191MzIJc25kX254dDsJLyogTmV4dCBzZXF1ZW5jZSB3ZSBzZW5kCQkqLworIAl1MzIJcmN2X254dDsJLyogV2hhdCB3ZSB3YW50IHRvIHJlY2VpdmUgbmV4dCAJKi8KKyAJdTMyCXNuZF9ueHQ7CS8qIE5leHQgc2VxdWVuY2Ugd2Ugc2VuZAkJKi8KIAotIAlfX3UzMglzbmRfdW5hOwkvKiBGaXJzdCBieXRlIHdlIHdhbnQgYW4gYWNrIGZvcgkqLwotIAlfX3UzMglzbmRfc21sOwkvKiBMYXN0IGJ5dGUgb2YgdGhlIG1vc3QgcmVjZW50bHkgdHJhbnNtaXR0ZWQgc21hbGwgcGFja2V0ICovCi0JX191MzIJcmN2X3RzdGFtcDsJLyogdGltZXN0YW1wIG9mIGxhc3QgcmVjZWl2ZWQgQUNLIChmb3Iga2VlcGFsaXZlcykgKi8KLQlfX3UzMglsc25kdGltZTsJLyogdGltZXN0YW1wIG9mIGxhc3Qgc2VudCBkYXRhIHBhY2tldCAoZm9yIHJlc3RhcnQgd2luZG93KSAqLworIAl1MzIJc25kX3VuYTsJLyogRmlyc3QgYnl0ZSB3ZSB3YW50IGFuIGFjayBmb3IJKi8KKyAJdTMyCXNuZF9zbWw7CS8qIExhc3QgYnl0ZSBvZiB0aGUgbW9zdCByZWNlbnRseSB0cmFuc21pdHRlZCBzbWFsbCBwYWNrZXQgKi8KKwl1MzIJcmN2X3RzdGFtcDsJLyogdGltZXN0YW1wIG9mIGxhc3QgcmVjZWl2ZWQgQUNLIChmb3Iga2VlcGFsaXZlcykgKi8KKwl1MzIJbHNuZHRpbWU7CS8qIHRpbWVzdGFtcCBvZiBsYXN0IHNlbnQgZGF0YSBwYWNrZXQgKGZvciByZXN0YXJ0IHdpbmRvdykgKi8KIAogCS8qIERhdGEgZm9yIGRpcmVjdCBjb3B5IHRvIHVzZXIgKi8KIAlzdHJ1Y3QgewpAQCAtMjQ3LDMyICsyNjUsMzAgQEAKICNlbmRpZgogCX0gdWNvcHk7CiAKLQlfX3UzMglzbmRfd2wxOwkvKiBTZXF1ZW5jZSBmb3Igd2luZG93IHVwZGF0ZQkJKi8KLQlfX3UzMglzbmRfd25kOwkvKiBUaGUgd2luZG93IHdlIGV4cGVjdCB0byByZWNlaXZlCSovCi0JX191MzIJbWF4X3dpbmRvdzsJLyogTWF4aW1hbCB3aW5kb3cgZXZlciBzZWVuIGZyb20gcGVlcgkqLwotCV9fdTMyCW1zc19jYWNoZTsJLyogQ2FjaGVkIGVmZmVjdGl2ZSBtc3MsIG5vdCBpbmNsdWRpbmcgU0FDS1MgKi8KLQlfX3UxNgl4bWl0X3NpemVfZ29hbDsJLyogR29hbCBmb3Igc2VnbWVudGluZyBvdXRwdXQgcGFja2V0cwkqLwotCS8qIFhYWCBUd28gYnl0ZXMgaG9sZSwgdHJ5IHRvIHBhY2sgKi8KKwl1MzIJc25kX3dsMTsJLyogU2VxdWVuY2UgZm9yIHdpbmRvdyB1cGRhdGUJCSovCisJdTMyCXNuZF93bmQ7CS8qIFRoZSB3aW5kb3cgd2UgZXhwZWN0IHRvIHJlY2VpdmUJKi8KKwl1MzIJbWF4X3dpbmRvdzsJLyogTWF4aW1hbCB3aW5kb3cgZXZlciBzZWVuIGZyb20gcGVlcgkqLworCXUzMgltc3NfY2FjaGU7CS8qIENhY2hlZCBlZmZlY3RpdmUgbXNzLCBub3QgaW5jbHVkaW5nIFNBQ0tTICovCiAKLQlfX3UzMgl3aW5kb3dfY2xhbXA7CS8qIE1heGltYWwgd2luZG93IHRvIGFkdmVydGlzZQkJKi8KLQlfX3UzMglyY3Zfc3N0aHJlc2g7CS8qIEN1cnJlbnQgd2luZG93IGNsYW1wCQkJKi8KKwl1MzIJd2luZG93X2NsYW1wOwkvKiBNYXhpbWFsIHdpbmRvdyB0byBhZHZlcnRpc2UJCSovCisJdTMyCXJjdl9zc3RocmVzaDsJLyogQ3VycmVudCB3aW5kb3cgY2xhbXAJCQkqLwogCi0JX191MzIJZnJ0b19oaWdobWFyazsJLyogc25kX254dCB3aGVuIFJUTyBvY2N1cnJlZCAqLwotCV9fdTgJcmVvcmRlcmluZzsJLyogUGFja2V0IHJlb3JkZXJpbmcgbWV0cmljLgkJKi8KLQlfX3U4CWZydG9fY291bnRlcjsJLyogTnVtYmVyIG9mIG5ldyBhY2tzIGFmdGVyIFJUTyAqLwotCV9fdTgJbm9uYWdsZTsJLyogRGlzYWJsZSBOYWdsZSBhbGdvcml0aG0/ICAgICAgICAgICAgICovCi0JX191OAlrZWVwYWxpdmVfcHJvYmVzOyAvKiBudW0gb2YgYWxsb3dlZCBrZWVwIGFsaXZlIHByb2JlcwkqLworCXUzMglmcnRvX2hpZ2htYXJrOwkvKiBzbmRfbnh0IHdoZW4gUlRPIG9jY3VycmVkICovCisJdTgJcmVvcmRlcmluZzsJLyogUGFja2V0IHJlb3JkZXJpbmcgbWV0cmljLgkJKi8KKwl1OAlmcnRvX2NvdW50ZXI7CS8qIE51bWJlciBvZiBuZXcgYWNrcyBhZnRlciBSVE8gKi8KKwl1OAlub25hZ2xlOwkvKiBEaXNhYmxlIE5hZ2xlIGFsZ29yaXRobT8gICAgICAgICAgICAgKi8KKwl1OAlrZWVwYWxpdmVfcHJvYmVzOyAvKiBudW0gb2YgYWxsb3dlZCBrZWVwIGFsaXZlIHByb2JlcwkqLwogCiAvKiBSVFQgbWVhc3VyZW1lbnQgKi8KLQlfX3UzMglzcnR0OwkJLyogc21vb3RoZWQgcm91bmQgdHJpcCB0aW1lIDw8IDMJKi8KLQlfX3UzMgltZGV2OwkJLyogbWVkaXVtIGRldmlhdGlvbgkJCSovCi0JX191MzIJbWRldl9tYXg7CS8qIG1heGltYWwgbWRldiBmb3IgdGhlIGxhc3QgcnR0IHBlcmlvZAkqLwotCV9fdTMyCXJ0dHZhcjsJCS8qIHNtb290aGVkIG1kZXZfbWF4CQkJKi8KLQlfX3UzMglydHRfc2VxOwkvKiBzZXF1ZW5jZSBudW1iZXIgdG8gdXBkYXRlIHJ0dHZhcgkqLworCXUzMglzcnR0OwkJLyogc21vb3RoZWQgcm91bmQgdHJpcCB0aW1lIDw8IDMJKi8KKwl1MzIJbWRldjsJCS8qIG1lZGl1bSBkZXZpYXRpb24JCQkqLworCXUzMgltZGV2X21heDsJLyogbWF4aW1hbCBtZGV2IGZvciB0aGUgbGFzdCBydHQgcGVyaW9kCSovCisJdTMyCXJ0dHZhcjsJCS8qIHNtb290aGVkIG1kZXZfbWF4CQkJKi8KKwl1MzIJcnR0X3NlcTsJLyogc2VxdWVuY2UgbnVtYmVyIHRvIHVwZGF0ZSBydHR2YXIJKi8KIAotCV9fdTMyCXBhY2tldHNfb3V0OwkvKiBQYWNrZXRzIHdoaWNoIGFyZSAiaW4gZmxpZ2h0IgkqLwotCV9fdTMyCWxlZnRfb3V0OwkvKiBQYWNrZXRzIHdoaWNoIGxlYXZlZCBuZXR3b3JrCSovCi0JX191MzIJcmV0cmFuc19vdXQ7CS8qIFJldHJhbnNtaXR0ZWQgcGFja2V0cyBvdXQJCSovCisJdTMyCXBhY2tldHNfb3V0OwkvKiBQYWNrZXRzIHdoaWNoIGFyZSAiaW4gZmxpZ2h0IgkqLworCXUzMglsZWZ0X291dDsJLyogUGFja2V0cyB3aGljaCBsZWF2ZWQgbmV0d29yawkqLworCXUzMglyZXRyYW5zX291dDsJLyogUmV0cmFuc21pdHRlZCBwYWNrZXRzIG91dAkJKi8KIC8qCiAgKiAgICAgIE9wdGlvbnMgcmVjZWl2ZWQgKHVzdWFsbHkgb24gbGFzdCBwYWNrZXQsIHNvbWUgb25seSBvbiBTWU4gcGFja2V0cykuCiAgKi8KQEAgLTI4MSwyMCArMjk3LDIwIEBACiAvKgogICoJU2xvdyBzdGFydCBhbmQgY29uZ2VzdGlvbiBjb250cm9sIChzZWUgYWxzbyBOYWdsZSwgYW5kIEthcm4gJiBQYXJ0cmlkZ2UpCiAgKi8KLSAJX191MzIJc25kX3NzdGhyZXNoOwkvKiBTbG93IHN0YXJ0IHNpemUgdGhyZXNob2xkCQkqLwotIAlfX3UzMglzbmRfY3duZDsJLyogU2VuZGluZyBjb25nZXN0aW9uIHdpbmRvdwkJKi8KLSAJX191MTYJc25kX2N3bmRfY250OwkvKiBMaW5lYXIgaW5jcmVhc2UgY291bnRlcgkJKi8KLQlfX3UxNglzbmRfY3duZF9jbGFtcDsgLyogRG8gbm90IGFsbG93IHNuZF9jd25kIHRvIGdyb3cgYWJvdmUgdGhpcyAqLwotCV9fdTMyCXNuZF9jd25kX3VzZWQ7Ci0JX191MzIJc25kX2N3bmRfc3RhbXA7CisgCXUzMglzbmRfc3N0aHJlc2g7CS8qIFNsb3cgc3RhcnQgc2l6ZSB0aHJlc2hvbGQJCSovCisgCXUzMglzbmRfY3duZDsJLyogU2VuZGluZyBjb25nZXN0aW9uIHdpbmRvdwkJKi8KKyAJdTE2CXNuZF9jd25kX2NudDsJLyogTGluZWFyIGluY3JlYXNlIGNvdW50ZXIJCSovCisJdTE2CXNuZF9jd25kX2NsYW1wOyAvKiBEbyBub3QgYWxsb3cgc25kX2N3bmQgdG8gZ3JvdyBhYm92ZSB0aGlzICovCisJdTMyCXNuZF9jd25kX3VzZWQ7CisJdTMyCXNuZF9jd25kX3N0YW1wOwogCiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlvdXRfb2Zfb3JkZXJfcXVldWU7IC8qIE91dCBvZiBvcmRlciBzZWdtZW50cyBnbyBoZXJlICovCiAKLSAJX191MzIJcmN2X3duZDsJLyogQ3VycmVudCByZWNlaXZlciB3aW5kb3cJCSovCi0JX191MzIJcmN2X3d1cDsJLyogcmN2X254dCBvbiBsYXN0IHdpbmRvdyB1cGRhdGUgc2VudAkqLwotCV9fdTMyCXdyaXRlX3NlcTsJLyogVGFpbCgrMSkgb2YgZGF0YSBoZWxkIGluIHRjcCBzZW5kIGJ1ZmZlciAqLwotCV9fdTMyCXB1c2hlZF9zZXE7CS8qIExhc3QgcHVzaGVkIHNlcSwgcmVxdWlyZWQgdG8gdGFsayB0byB3aW5kb3dzICovCi0JX191MzIJY29waWVkX3NlcTsJLyogSGVhZCBvZiB5ZXQgdW5yZWFkIGRhdGEJCSovCisgCXUzMglyY3Zfd25kOwkvKiBDdXJyZW50IHJlY2VpdmVyIHdpbmRvdwkJKi8KKwl1MzIJcmN2X3d1cDsJLyogcmN2X254dCBvbiBsYXN0IHdpbmRvdyB1cGRhdGUgc2VudAkqLworCXUzMgl3cml0ZV9zZXE7CS8qIFRhaWwoKzEpIG9mIGRhdGEgaGVsZCBpbiB0Y3Agc2VuZCBidWZmZXIgKi8KKwl1MzIJcHVzaGVkX3NlcTsJLyogTGFzdCBwdXNoZWQgc2VxLCByZXF1aXJlZCB0byB0YWxrIHRvIHdpbmRvd3MgKi8KKwl1MzIJY29waWVkX3NlcTsJLyogSGVhZCBvZiB5ZXQgdW5yZWFkIGRhdGEJCSovCiAKIC8qCVNBQ0tzIGRhdGEJKi8KIAlzdHJ1Y3QgdGNwX3NhY2tfYmxvY2sgZHVwbGljYXRlX3NhY2tbMV07IC8qIEQtU0FDSyBibG9jayAqLwpAQCAtMzE1LDI2ICszMzEsMjYgQEAKIAlpbnQgICAgIHJldHJhbnNtaXRfY250X2hpbnQ7CiAJaW50ICAgICBmb3J3YXJkX2NudF9oaW50OwogCi0JX191MTYJYWR2bXNzOwkJLyogQWR2ZXJ0aXNlZCBNU1MJCQkqLwotCV9fdTE2CXByaW9yX3NzdGhyZXNoOyAvKiBzc3RocmVzaCBzYXZlZCBhdCByZWNvdmVyeSBzdGFydAkqLwotCV9fdTMyCWxvc3Rfb3V0OwkvKiBMb3N0IHBhY2tldHMJCQkqLwotCV9fdTMyCXNhY2tlZF9vdXQ7CS8qIFNBQ0snZCBwYWNrZXRzCQkJKi8KLQlfX3UzMglmYWNrZXRzX291dDsJLyogRkFDSydkIHBhY2tldHMJCQkqLwotCV9fdTMyCWhpZ2hfc2VxOwkvKiBzbmRfbnh0IGF0IG9uc2V0IG9mIGNvbmdlc3Rpb24JKi8KKwl1MTYJYWR2bXNzOwkJLyogQWR2ZXJ0aXNlZCBNU1MJCQkqLworCXUxNglwcmlvcl9zc3RocmVzaDsgLyogc3N0aHJlc2ggc2F2ZWQgYXQgcmVjb3Zlcnkgc3RhcnQJKi8KKwl1MzIJbG9zdF9vdXQ7CS8qIExvc3QgcGFja2V0cwkJCSovCisJdTMyCXNhY2tlZF9vdXQ7CS8qIFNBQ0snZCBwYWNrZXRzCQkJKi8KKwl1MzIJZmFja2V0c19vdXQ7CS8qIEZBQ0snZCBwYWNrZXRzCQkJKi8KKwl1MzIJaGlnaF9zZXE7CS8qIHNuZF9ueHQgYXQgb25zZXQgb2YgY29uZ2VzdGlvbgkqLwogCi0JX191MzIJcmV0cmFuc19zdGFtcDsJLyogVGltZXN0YW1wIG9mIHRoZSBsYXN0IHJldHJhbnNtaXQsCisJdTMyCXJldHJhbnNfc3RhbXA7CS8qIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCByZXRyYW5zbWl0LAogCQkJCSAqIGFsc28gdXNlZCBpbiBTWU4tU0VOVCB0byByZW1lbWJlciBzdGFtcCBvZgogCQkJCSAqIHRoZSBmaXJzdCBTWU4uICovCi0JX191MzIJdW5kb19tYXJrZXI7CS8qIHRyYWNraW5nIHJldHJhbnMgc3RhcnRlZCBoZXJlLiAqLworCXUzMgl1bmRvX21hcmtlcjsJLyogdHJhY2tpbmcgcmV0cmFucyBzdGFydGVkIGhlcmUuICovCiAJaW50CXVuZG9fcmV0cmFuczsJLyogbnVtYmVyIG9mIHVuZG9hYmxlIHJldHJhbnNtaXNzaW9ucy4gKi8KLQlfX3UzMgl1cmdfc2VxOwkvKiBTZXEgb2YgcmVjZWl2ZWQgdXJnZW50IHBvaW50ZXIgKi8KLQlfX3UxNgl1cmdfZGF0YTsJLyogU2F2ZWQgb2N0ZXQgb2YgT09CIGRhdGEgYW5kIGNvbnRyb2wgZmxhZ3MgKi8KLQlfX3U4CXVyZ19tb2RlOwkvKiBJbiB1cmdlbnQgbW9kZQkJKi8KLQlfX3U4CWVjbl9mbGFnczsJLyogRUNOIHN0YXR1cyBiaXRzLgkJCSovCi0JX191MzIJc25kX3VwOwkJLyogVXJnZW50IHBvaW50ZXIJCSovCisJdTMyCXVyZ19zZXE7CS8qIFNlcSBvZiByZWNlaXZlZCB1cmdlbnQgcG9pbnRlciAqLworCXUxNgl1cmdfZGF0YTsJLyogU2F2ZWQgb2N0ZXQgb2YgT09CIGRhdGEgYW5kIGNvbnRyb2wgZmxhZ3MgKi8KKwl1OAl1cmdfbW9kZTsJLyogSW4gdXJnZW50IG1vZGUJCSovCisJdTgJZWNuX2ZsYWdzOwkvKiBFQ04gc3RhdHVzIGJpdHMuCQkJKi8KKwl1MzIJc25kX3VwOwkJLyogVXJnZW50IHBvaW50ZXIJCSovCiAKLQlfX3UzMgl0b3RhbF9yZXRyYW5zOwkvKiBUb3RhbCByZXRyYW5zbWl0cyBmb3IgZW50aXJlIGNvbm5lY3Rpb24gKi8KLQlfX3UzMglieXRlc19hY2tlZDsJLyogQXBwcm9wcmlhdGUgQnl0ZSBDb3VudGluZyAtIFJGQzM0NjUgKi8KKwl1MzIJdG90YWxfcmV0cmFuczsJLyogVG90YWwgcmV0cmFuc21pdHMgZm9yIGVudGlyZSBjb25uZWN0aW9uICovCisJdTMyCWJ5dGVzX2Fja2VkOwkvKiBBcHByb3ByaWF0ZSBCeXRlIENvdW50aW5nIC0gUkZDMzQ2NSAqLwogCiAJdW5zaWduZWQgaW50CQlrZWVwYWxpdmVfdGltZTsJICAvKiB0aW1lIGJlZm9yZSBrZWVwIGFsaXZlIHRha2VzIHBsYWNlICovCiAJdW5zaWduZWQgaW50CQlrZWVwYWxpdmVfaW50dmw7ICAvKiB0aW1lIGludGVydmFsIGJldHdlZW4ga2VlcCBhbGl2ZSBwcm9iZXMgKi8KQEAgLTM0MiwyNSArMzU4LDM1IEBACiAKIAl1bnNpZ25lZCBsb25nIGxhc3Rfc3lucV9vdmVyZmxvdzsgCiAKKwl1MzIJdHNvX2RlZmVycmVkOworCiAvKiBSZWNlaXZlciBzaWRlIFJUVCBlc3RpbWF0aW9uICovCiAJc3RydWN0IHsKLQkJX191MzIJcnR0OwotCQlfX3UzMglzZXE7Ci0JCV9fdTMyCXRpbWU7CisJCXUzMglydHQ7CisJCXUzMglzZXE7CisJCXUzMgl0aW1lOwogCX0gcmN2X3J0dF9lc3Q7CiAKIC8qIFJlY2VpdmVyIHF1ZXVlIHNwYWNlICovCiAJc3RydWN0IHsKIAkJaW50CXNwYWNlOwotCQlfX3UzMglzZXE7Ci0JCV9fdTMyCXRpbWU7CisJCXUzMglzZXE7CisJCXUzMgl0aW1lOwogCX0gcmN2cV9zcGFjZTsKIAogLyogVENQLXNwZWNpZmljIE1UVSBwcm9iZSBpbmZvcm1hdGlvbi4gKi8KIAlzdHJ1Y3QgewotCQlfX3UzMgkJICBwcm9iZV9zZXFfc3RhcnQ7Ci0JCV9fdTMyCQkgIHByb2JlX3NlcV9lbmQ7CisJCXUzMgkJICBwcm9iZV9zZXFfc3RhcnQ7CisJCXUzMgkJICBwcm9iZV9zZXFfZW5kOwogCX0gbXR1X3Byb2JlOworCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKy8qIFRDUCBBRi1TcGVjaWZpYyBwYXJ0czsgb25seSB1c2VkIGJ5IE1ENSBTaWduYXR1cmUgc3VwcG9ydCBzbyBmYXIgKi8KKwlzdHJ1Y3QgdGNwX3NvY2tfYWZfb3BzCSphZl9zcGVjaWZpYzsKKworLyogVENQIE1ENSBTaWduYWd1cmUgT3B0aW9uIGluZm9ybWF0aW9uICovCisJc3RydWN0IHRjcF9tZDVzaWdfaW5mbwkqbWQ1c2lnX2luZm87CisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRjcF9zb2NrICp0Y3Bfc2soY29uc3Qgc3RydWN0IHNvY2sgKnNrKQpAQCAtMzcwLDExICszOTYsMTUgQEAKIAogc3RydWN0IHRjcF90aW1ld2FpdF9zb2NrIHsKIAlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrIHR3X3NrOwotCV9fdTMyCQkJICB0d19yY3Zfbnh0OwotCV9fdTMyCQkJICB0d19zbmRfbnh0OwotCV9fdTMyCQkJICB0d19yY3Zfd25kOwotCV9fdTMyCQkJICB0d190c19yZWNlbnQ7CisJdTMyCQkJICB0d19yY3Zfbnh0OworCXUzMgkJCSAgdHdfc25kX254dDsKKwl1MzIJCQkgIHR3X3Jjdl93bmQ7CisJdTMyCQkJICB0d190c19yZWNlbnQ7CiAJbG9uZwkJCSAgdHdfdHNfcmVjZW50X3N0YW1wOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJdTE2CQkJICB0d19tZDVfa2V5bGVuOworCXU4CQkJICB0d19tZDVfa2V5W1RDUF9NRDVTSUdfTUFYS0VZTEVOXTsKKyNlbmRpZgogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnRjcF90d3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGV4dHNlYXJjaC5oIGIvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoLmgKaW5kZXggN2RhYzhmMC4uMDA0ODA4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoLmgKKysrIGIvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoLmgKQEAgLTIwLDcgKzIwLDcgQEAKIC8qKgogICogc3RydWN0IHRzX3N0YXRlIC0gc2VhcmNoIHN0YXRlCiAgKiBAb2Zmc2V0OiBvZmZzZXQgZm9yIG5leHQgbWF0Y2gKLSAqIEBjYjogY29udHJvbCBidWZmZXIsIGZvciBwZXJzaXN0YW50IHZhcmlhYmxlcyBvZiBnZXRfbmV4dF9ibG9jaygpCisgKiBAY2I6IGNvbnRyb2wgYnVmZmVyLCBmb3IgcGVyc2lzdGVudCB2YXJpYWJsZXMgb2YgZ2V0X25leHRfYmxvY2soKQogICovCiBzdHJ1Y3QgdHNfc3RhdGUKIHsKQEAgLTcxLDcgKzcxLDcgQEAKIAkgKiBDYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCAwIGlzIHJldHVybmVkLiBNdXN0IGFzc2lnbiB0aGUKIAkgKiBoZWFkIG9mIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEgdG8gJipkc3QgYW5kIHJldHVybiB0aGUgbGVuZ3RoCiAJICogb2YgdGhlIGJsb2NrIG9yIDAgaWYgYXQgdGhlIGVuZC4gY29uc3VtZWQgPT0gMCBpbmRpY2F0ZXMKLQkgKiBhIG5ldyBzZWFyY2guIE1heSBzdG9yZS9yZWFkIHBlcnNpc3RhbnQgdmFsdWVzIGluIHN0YXRlLT5jYi4KKwkgKiBhIG5ldyBzZWFyY2guIE1heSBzdG9yZS9yZWFkIHBlcnNpc3RlbnQgdmFsdWVzIGluIHN0YXRlLT5jYi4KIAkgKi8KIAl1bnNpZ25lZCBpbnQJCSgqZ2V0X25leHRfYmxvY2spKHVuc2lnbmVkIGludCBjb25zdW1lZCwKIAkJCQkJCSAgY29uc3QgdTggKipkc3QsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RmcmMuaCBiL2luY2x1ZGUvbGludXgvdGZyYy5oCmluZGV4IDdkYWI3ODMuLjhhODQ2MmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGZyYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGZyYy5oCkBAIC0xLDcgKzEsOCBAQAogI2lmbmRlZiBfTElOVVhfVEZSQ19IXwogI2RlZmluZSBfTElOVVhfVEZSQ19IXwogLyoKLSAqICBpbmNsdWRlL2xpbnV4L3RmcmMuaAorICogIFRGUkMgLSBEYXRhIFN0cnVjdHVyZXMgZm9yIHRoZSBUQ1AtRnJpZW5kbHkgUmF0ZSBDb250cm9sIGNvbmdlc3Rpb24KKyAqICAgICAgICAgY29udHJvbCBtZWNoYW5pc20gYXMgc3BlY2lmaWVkIGluIFJGQyAzNDQ4LgogICoKICAqICBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIFVuaXZlcnNpdHkgb2YgV2Fpa2F0bywgSGFtaWx0b24sIE5ldyBaZWFsYW5kLgogICogIENvcHlyaWdodCAoYykgMjAwNSBJYW4gTWNEb25hbGQgPGlhbTRAY3Mud2Fpa2F0by5hYy5uej4KQEAgLTEzLDE4ICsxNCwzNyBAQAogICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorLyoqIAl0ZnJjX3J4X2luZm8gICAgLSAgICBURlJDIFJlY2VpdmVyIERhdGEgU3RydWN0dXJlCisgKgorICogCUB0ZnJjcnhfeF9yZWN2OglyZWNlaXZlciBlc3RpbWF0ZSBvZiBzZW5kaW5nIHJhdGUgKDMuMi4yKQorICogCUB0ZnJjcnhfcnR0Oglyb3VuZC10cmlwLXRpbWUgKGNvbW11bmljYXRlZCBieSBzZW5kZXIpCisgKiAJQHRmcmNyeF9wOgljdXJyZW50IGVzdGltYXRlIG9mIGxvc3MgZXZlbnQgcmF0ZSAoMy4yLjIpCisgKi8KIHN0cnVjdCB0ZnJjX3J4X2luZm8gewogICAJX191MzIgdGZyY3J4X3hfcmVjdjsKIAlfX3UzMiB0ZnJjcnhfcnR0OwogICAJX191MzIgdGZyY3J4X3A7CiB9OwogCisvKiogCXRmcmNfdHhfaW5mbyAgICAtICAgIFRGUkMgU2VuZGVyIERhdGEgU3RydWN0dXJlCisgKgorICogCUB0ZnJjdHhfeDoJY29tcHV0ZWQgdHJhbnNtaXQgcmF0ZSAoNC4zICg0KSkKKyAqIAlAdGZyY3R4X3hfcmVjdjogcmVjZWl2ZXIgZXN0aW1hdGUgb2Ygc2VuZCByYXRlICg0LjMpCisgKiAJQHRmcmN0eF94X2NhbGM6CXJldHVybiB2YWx1ZSBvZiB0aHJvdWdocHV0IGVxdWF0aW9uICgzLjEpCisgKiAJQHRmcmN0eF9ydHQ6CShtb3ZpbmcgYXZlcmFnZSkgZXN0aW1hdGUgb2YgUlRUICg0LjMpCisgKiAJQHRmcmN0eF9wOgljdXJyZW50IGxvc3MgZXZlbnQgcmF0ZSAoNS40KQorICogCUB0ZnJjdHhfcnRvOgllc3RpbWF0ZSBvZiBSVE8sIGVxdWFscyA0KlJUVCAoNC4zKQorICogCUB0ZnJjdHhfaXBpOglpbnRlci1wYWNrZXQgaW50ZXJ2YWwgKDQuNikKKyAqCisgKiAgTm90ZTogWCBhbmQgWF9yZWN2IGFyZSBib3RoIG1haW50YWluZWQgaW4gdW5pdHMgb2YgNjQgKiBieXRlcy9zZWNvbmQuIFRoaXMKKyAqICAgICAgICBlbmFibGVzIGEgZmluZXIgcmVzb2x1dGlvbiBvZiBzZW5kaW5nIHJhdGVzIGFuZCBhdm9pZHMgcHJvYmxlbXMgd2l0aAorICogICAgICAgIGludGVnZXIgYXJpdGhtZXRpYzsgdTMyIGlzIG5vdCBzdWZmaWNpZW50IGFzIHNjYWxpbmcgY29uc3VtZXMgNiBiaXRzLgorICovCiBzdHJ1Y3QgdGZyY190eF9pbmZvIHsKLQlfX3UzMiB0ZnJjdHhfeDsKLQlfX3UzMiB0ZnJjdHhfeF9yZWN2OworCV9fdTY0IHRmcmN0eF94OworCV9fdTY0IHRmcmN0eF94X3JlY3Y7CiAJX191MzIgdGZyY3R4X3hfY2FsYzsKIAlfX3UzMiB0ZnJjdHhfcnR0OwogCV9fdTMyIHRmcmN0eF9wOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lci5oIGIvaW5jbHVkZS9saW51eC90aW1lci5oCmluZGV4IGM5ODIzMDQuLmVlZWY2NjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKQEAgLTk4LDQgKzk4LDEwIEBACiBzdHJ1Y3QgaHJ0aW1lcjsKIGV4dGVybiBpbnQgaXRfcmVhbF9mbihzdHJ1Y3QgaHJ0aW1lciAqKTsKIAordW5zaWduZWQgbG9uZyBfX3JvdW5kX2ppZmZpZXModW5zaWduZWQgbG9uZyBqLCBpbnQgY3B1KTsKK3Vuc2lnbmVkIGxvbmcgX19yb3VuZF9qaWZmaWVzX3JlbGF0aXZlKHVuc2lnbmVkIGxvbmcgaiwgaW50IGNwdSk7Cit1bnNpZ25lZCBsb25nIHJvdW5kX2ppZmZpZXModW5zaWduZWQgbG9uZyBqKTsKK3Vuc2lnbmVkIGxvbmcgcm91bmRfamlmZmllc19yZWxhdGl2ZSh1bnNpZ25lZCBsb25nIGopOworCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aXBjLmggYi9pbmNsdWRlL2xpbnV4L3RpcGMuaAppbmRleCAyNDNhMTVmLi5iZWE0Njk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpcGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpcGMuaApAQCAtMTI5LDYgKzEyOSw3IEBACiAKICNkZWZpbmUgVElQQ19TVUJfUE9SVFMgICAgIAkweDAxICAJLyogZmlsdGVyIGZvciBwb3J0IGF2YWlsYWJpbGl0eSAqLwogI2RlZmluZSBUSVBDX1NVQl9TRVJWSUNFICAgICAJMHgwMiAgCS8qIGZpbHRlciBmb3Igc2VydmljZSBhdmFpbGFiaWxpdHkgKi8KKyNkZWZpbmUgVElQQ19TVUJfQ0FOQ0VMICAgICAgICAgMHgwNCAgICAvKiBjYW5jZWwgYSBzdWJzY3JpcHRpb24gKi8KICNpZiAwCiAvKiBUaGUgZm9sbG93aW5nIGZpbHRlciBvcHRpb25zIGFyZSBub3QgY3VycmVudGx5IGltcGxlbWVudGVkICovCiAjZGVmaW5lIFRJUENfU1VCX05PX0JJTkRfRVZUUwkweDA0CS8qIGZpbHRlciBvdXQgInB1Ymxpc2giIGV2ZW50cyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oIGIvaW5jbHVkZS9saW51eC90aXBjX2NvbmZpZy5oCmluZGV4IDMzYTY1MzkuLmIwYzkxNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGlwY19jb25maWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmgKQEAgLTE5NCwzNCArMTk0LDM0IEBACiAKIAogc3RydWN0IHRpcGNfbm9kZV9pbmZvIHsKLQlfX3UzMiBhZGRyOwkJCS8qIG5ldHdvcmsgYWRkcmVzcyBvZiBub2RlICovCi0JX191MzIgdXA7CQkJLyogMD1kb3duLCAxPSB1cCAqLworCV9fYmUzMiBhZGRyOwkJCS8qIG5ldHdvcmsgYWRkcmVzcyBvZiBub2RlICovCisJX19iZTMyIHVwOwkJCS8qIDA9ZG93biwgMT0gdXAgKi8KIH07CiAKIHN0cnVjdCB0aXBjX2xpbmtfaW5mbyB7Ci0JX191MzIgZGVzdDsJCQkvKiBuZXR3b3JrIGFkZHJlc3Mgb2YgcGVlciBub2RlICovCi0JX191MzIgdXA7CQkJLyogMD1kb3duLCAxPXVwICovCisJX19iZTMyIGRlc3Q7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIHBlZXIgbm9kZSAqLworCV9fYmUzMiB1cDsJCQkvKiAwPWRvd24sIDE9dXAgKi8KIAljaGFyIHN0cltUSVBDX01BWF9MSU5LX05BTUVdOwkvKiBsaW5rIG5hbWUgKi8KIH07CiAKIHN0cnVjdCB0aXBjX2JlYXJlcl9jb25maWcgewotCV9fdTMyIHByaW9yaXR5OwkJCS8qIFJhbmdlIFsxLDMxXS4gT3ZlcnJpZGUgcGVyIGxpbmsgICovCi0JX191MzIgZGV0ZWN0X3Njb3BlOyAgICAgCisJX19iZTMyIHByaW9yaXR5OwkJLyogUmFuZ2UgWzEsMzFdLiBPdmVycmlkZSBwZXIgbGluayAgKi8KKwlfX2JlMzIgZGV0ZWN0X3Njb3BlOwogCWNoYXIgbmFtZVtUSVBDX01BWF9CRUFSRVJfTkFNRV07CiB9OwogCiBzdHJ1Y3QgdGlwY19saW5rX2NvbmZpZyB7Ci0JX191MzIgdmFsdWU7CisJX19iZTMyIHZhbHVlOwogCWNoYXIgbmFtZVtUSVBDX01BWF9MSU5LX05BTUVdOwogfTsKIAogI2RlZmluZSBUSVBDX05UUV9BTExUWVBFUyAweDgwMDAwMDAwCiAKIHN0cnVjdCB0aXBjX25hbWVfdGFibGVfcXVlcnkgewotCV9fdTMyIGRlcHRoOwkvKiAxOnR5cGUsIDI6K25hbWUgaW5mbywgMzorcG9ydCBpbmZvLCA0KzorZGVidWcgaW5mbyAqLwotCV9fdTMyIHR5cGU7CS8qIHt0LGwsdX0gaW5mbyBpZ25vcmVkIGlmIGhpZ2ggYml0IG9mICJkZXB0aCIgaXMgc2V0ICovCi0JX191MzIgbG93Ym91bmQ7IC8qIChpLmUuIGRpc3BsYXlzIGFsbCBlbnRyaWVzIG9mIG5hbWUgdGFibGUpICovCi0JX191MzIgdXBib3VuZDsKKwlfX2JlMzIgZGVwdGg7CS8qIDE6dHlwZSwgMjorbmFtZSBpbmZvLCAzOitwb3J0IGluZm8sIDQrOitkZWJ1ZyBpbmZvICovCisJX19iZTMyIHR5cGU7CS8qIHt0LGwsdX0gaW5mbyBpZ25vcmVkIGlmIGhpZ2ggYml0IG9mICJkZXB0aCIgaXMgc2V0ICovCisJX19iZTMyIGxvd2JvdW5kOyAvKiAoaS5lLiBkaXNwbGF5cyBhbGwgZW50cmllcyBvZiBuYW1lIHRhYmxlKSAqLworCV9fYmUzMiB1cGJvdW5kOwogfTsKIAogLyoKQEAgLTI2Miw4ICsyNjIsOCBAQAogICovCiAKIHN0cnVjdCB0bHZfZGVzYyB7Ci0JX191MTYgdGx2X2xlbjsJCS8qIFRMViBsZW5ndGggKGRlc2NyaXB0b3IgKyB2YWx1ZSkgKi8KLQlfX3UxNiB0bHZfdHlwZTsJCS8qIFRMViBpZGVudGlmaWVyICovCisJX19iZTE2IHRsdl9sZW47CQkvKiBUTFYgbGVuZ3RoIChkZXNjcmlwdG9yICsgdmFsdWUpICovCisJX19iZTE2IHRsdl90eXBlOwkJLyogVExWIGlkZW50aWZpZXIgKi8KIH07CiAKICNkZWZpbmUgVExWX0FMSUdOVE8gNApAQCAtMzc3LDkgKzM3Nyw5IEBACiAKIHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyCiB7Ci0JX191MzIgdGNtX2xlbjsJCS8qIE1lc3NhZ2UgbGVuZ3RoIChpbmNsdWRpbmcgaGVhZGVyKSAqLwotCV9fdTE2IHRjbV90eXBlOwkJLyogQ29tbWFuZCB0eXBlICovCi0JX191MTYgdGNtX2ZsYWdzOwkvKiBBZGRpdGlvbmFsIGZsYWdzICovCisJX19iZTMyIHRjbV9sZW47CQkvKiBNZXNzYWdlIGxlbmd0aCAoaW5jbHVkaW5nIGhlYWRlcikgKi8KKwlfX2JlMTYgdGNtX3R5cGU7CS8qIENvbW1hbmQgdHlwZSAqLworCV9fYmUxNiB0Y21fZmxhZ3M7CS8qIEFkZGl0aW9uYWwgZmxhZ3MgKi8KIAljaGFyICB0Y21fcmVzZXJ2ZWRbOF07CS8qIFVudXNlZCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90b3BvbG9neS5oIGIvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCmluZGV4IGRhNTA4ZDEuLjZjNWE2ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKQEAgLTkzLDcgKzkzLDcgQEAKIAkuZ3JvdXBzCQkJPSBOVUxMLAkJCVwKIAkubWluX2ludGVydmFsCQk9IDEsCQkJXAogCS5tYXhfaW50ZXJ2YWwJCT0gMiwJCQlcCi0JLmJ1c3lfZmFjdG9yCQk9IDgsCQkJXAorCS5idXN5X2ZhY3RvcgkJPSA2NCwJCQlcCiAJLmltYmFsYW5jZV9wY3QJCT0gMTEwLAkJCVwKIAkuY2FjaGVfbmljZV90cmllcwk9IDAsCQkJXAogCS5wZXJfY3B1X2dhaW4JCT0gMjUsCQkJXApAQCAtMTk0LDcgKzE5NCw4IEBACiAJLndha2VfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCiAJLmZvcmtleGVjX2lkeAkJPSAwLCAvKiB1bnVzZWQgKi8JXAogCS5wZXJfY3B1X2dhaW4JCT0gMTAwLAkJCVwKLQkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRSwJXAorCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKKwkJCQl8IFNEX1NFUklBTElaRSwJXAogCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCVwKIAkuYmFsYW5jZV9pbnRlcnZhbAk9IDY0LAkJCVwKIAkubnJfYmFsYW5jZV9mYWlsZWQJPSAwLAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5LmggYi9pbmNsdWRlL2xpbnV4L3R0eS5oCmluZGV4IDQ0MDkxYzAuLjY1Y2JjZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5LmgKKysrIGIvaW5jbHVkZS9saW51eC90dHkuaApAQCAtNTMsNyArNTMsNyBAQAogfTsKIAogc3RydWN0IHR0eV9idWZoZWFkIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCXN0cnVjdCBzZW1hcGhvcmUgcHR5X3NlbTsKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IHR0eV9idWZmZXIgKmhlYWQ7CS8qIFF1ZXVlIGhlYWQgKi8KQEAgLTE3NSw3ICsxNzUsNyBAQAogCWludCBpbmRleDsKIAlzdHJ1Y3QgdHR5X2xkaXNjIGxkaXNjOwogCXN0cnVjdCBtdXRleCB0ZXJtaW9zX211dGV4OwotCXN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLCAqdGVybWlvc19sb2NrZWQ7CisJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLCAqdGVybWlvc19sb2NrZWQ7CiAJY2hhciBuYW1lWzY0XTsKIAlpbnQgcGdycDsKIAlpbnQgc2Vzc2lvbjsKQEAgLTI1OCw3ICsyNTgsNyBAQAogCiBleHRlcm4gdm9pZCB0dHlfd3JpdGVfZmx1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKik7CiAKLWV4dGVybiBzdHJ1Y3QgdGVybWlvcyB0dHlfc3RkX3Rlcm1pb3M7CitleHRlcm4gc3RydWN0IGt0ZXJtaW9zIHR0eV9zdGRfdGVybWlvczsKIAogZXh0ZXJuIGludCBrbXNnX3JlZGlyZWN0OwogCkBAIC0yNzYsOSArMjc2LDggQEAKIGV4dGVybiBpbnQgdHR5X3VucmVnaXN0ZXJfbGRpc2MoaW50IGRpc2MpOwogZXh0ZXJuIGludCB0dHlfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIpOwogZXh0ZXJuIGludCB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcik7Ci1leHRlcm4gc3RydWN0IGNsYXNzX2RldmljZSAqdHR5X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLAotCQkJCQkJdW5zaWduZWQgaW5kZXgsCi0JCQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKnR0eV9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciwKKwkJCQkJICB1bnNpZ25lZCBpbmRleCwgc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHR0eV91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCB1bnNpZ25lZCBpbmRleCk7CiBleHRlcm4gaW50IHR0eV9yZWFkX3Jhd19kYXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgKmJ1ZnAsCiAJCQkgICAgIGludCBidWZsZW4pOwpAQCAtMjk0LDggKzI5Myw5IEBACiBleHRlcm4gdm9pZCBkb19TQUsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gdm9pZCBkaXNhc3NvY2lhdGVfY3R0eShpbnQgcHJpdik7CiBleHRlcm4gdm9pZCB0dHlfZmxpcF9idWZmZXJfcHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLWV4dGVybiBpbnQgdHR5X2dldF9iYXVkX3JhdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1leHRlcm4gaW50IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcyk7CitleHRlcm4gc3BlZWRfdCB0dHlfZ2V0X2JhdWRfcmF0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiBzcGVlZF90IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MpOworZXh0ZXJuIHNwZWVkX3QgdHR5X3Rlcm1pb3NfaW5wdXRfYmF1ZF9yYXRlKHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcyk7CiAKIGV4dGVybiBzdHJ1Y3QgdHR5X2xkaXNjICp0dHlfbGRpc2NfcmVmKHN0cnVjdCB0dHlfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgdHR5X2xkaXNjX2RlcmVmKHN0cnVjdCB0dHlfbGRpc2MgKik7CkBAIC0zMTAsNiArMzEwLDEyIEBACiBleHRlcm4gaW50IHR0eV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAKK2V4dGVybiBkZXZfdCB0dHlfZGV2bnVtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworZXh0ZXJuIHZvaWQgcHJvY19jbGVhcl90dHkoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKK2V4dGVybiB2b2lkIF9fcHJvY19zZXRfdHR5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK2V4dGVybiB2b2lkIHByb2Nfc2V0X3R0eShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gc3RydWN0IHR0eV9zdHJ1Y3QgKmdldF9jdXJyZW50X3R0eSh2b2lkKTsKKwogZXh0ZXJuIHN0cnVjdCBtdXRleCB0dHlfbXV0ZXg7CiAKIC8qIG5fdHR5LmMgKi8KQEAgLTMzNiwxMCArMzQyLDUgQEAKIGV4dGVybiBpbnQgdnRfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCi1zdGF0aWMgaW5saW5lIGRldl90IHR0eV9kZXZudW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlyZXR1cm4gTUtERVYodHR5LT5kcml2ZXItPm1ham9yLCB0dHktPmRyaXZlci0+bWlub3Jfc3RhcnQpICsgdHR5LT5pbmRleDsKLX0KLQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHlfZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L3R0eV9kcml2ZXIuaAppbmRleCA1Yzg0NzNiLi42NTk0ODdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eV9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eV9kcml2ZXIuaApAQCAtNTMsNyArNTMsNyBAQAogICoJZGV2aWNlLXNwZWNpZmljIGlvY3RsJ3MuICBJZiB0aGUgaW9jdGwgbnVtYmVyIHBhc3NlZCBpbiBjbWQKICAqIAlpcyBub3QgcmVjb2duaXplZCBieSB0aGUgZHJpdmVyLCBpdCBzaG91bGQgcmV0dXJuIEVOT0lPQ1RMQ01ELgogICogCi0gKiB2b2lkICgqc2V0X3Rlcm1pb3MpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICogb2xkKTsKKyAqIHZvaWQgKCpzZXRfdGVybWlvcykoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICogb2xkKTsKICAqCiAgKiAJVGhpcyByb3V0aW5lIGFsbG93cyB0aGUgdHR5IGRyaXZlciB0byBiZSBub3RpZmllZCB3aGVuCiAgKiAJZGV2aWNlJ3MgdGVybWlvcyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuICBOb3RlIHRoYXQgYQpAQCAtMTMyLDcgKzEzMiw3IEBACiAJaW50ICAoKmNoYXJzX2luX2J1ZmZlcikoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAJaW50ICAoKmlvY3RsKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci0Jdm9pZCAoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCk7CisJdm9pZCAoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogCXZvaWQgKCp0aHJvdHRsZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwogCXZvaWQgKCp1bnRocm90dGxlKShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CiAJdm9pZCAoKnN0b3ApKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJaW50CW51bTsJCS8qIG51bWJlciBvZiBkZXZpY2VzIGFsbG9jYXRlZCAqLwogCXNob3J0CXR5cGU7CQkvKiB0eXBlIG9mIHR0eSBkcml2ZXIgKi8KIAlzaG9ydAlzdWJ0eXBlOwkvKiBzdWJ0eXBlIG9mIHR0eSBkcml2ZXIgKi8KLQlzdHJ1Y3QgdGVybWlvcyBpbml0X3Rlcm1pb3M7IC8qIEluaXRpYWwgdGVybWlvcyAqLworCXN0cnVjdCBrdGVybWlvcyBpbml0X3Rlcm1pb3M7IC8qIEluaXRpYWwgdGVybWlvcyAqLwogCWludAlmbGFnczsJCS8qIHR0eSBkcml2ZXIgZmxhZ3MgKi8KIAlpbnQJcmVmY291bnQ7CS8qIGZvciBsb2FkYWJsZSB0dHkgZHJpdmVycyAqLwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeTsgLyogL3Byb2MgZnMgZW50cnkgKi8KQEAgLTE3NSw4ICsxNzUsOCBAQAogCSAqIFBvaW50ZXIgdG8gdGhlIHR0eSBkYXRhIHN0cnVjdHVyZXMKIAkgKi8KIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqKnR0eXM7Ci0Jc3RydWN0IHRlcm1pb3MgKip0ZXJtaW9zOwotCXN0cnVjdCB0ZXJtaW9zICoqdGVybWlvc19sb2NrZWQ7CisJc3RydWN0IGt0ZXJtaW9zICoqdGVybWlvczsKKwlzdHJ1Y3Qga3Rlcm1pb3MgKip0ZXJtaW9zX2xvY2tlZDsKIAl2b2lkICpkcml2ZXJfc3RhdGU7CS8qIG9ubHkgdXNlZCBmb3IgdGhlIFBUWSBkcml2ZXIgKi8KIAkKIAkvKgpAQCAtMTkzLDcgKzE5Myw3IEBACiAJaW50ICAoKmNoYXJzX2luX2J1ZmZlcikoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAJaW50ICAoKmlvY3RsKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci0Jdm9pZCAoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCk7CisJdm9pZCAoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogCXZvaWQgKCp0aHJvdHRsZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwogCXZvaWQgKCp1bnRocm90dGxlKShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CiAJdm9pZCAoKnN0b3ApKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaCBiL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmgKaW5kZXggODNjNmU2Yy4uZDc1OTMyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCkBAIC01OSw3ICs1OSw3IEBACiAgKiAJbG93LWxldmVsIGRyaXZlciBjYW4gImdyYWIiIGFuIGlvY3RsIHJlcXVlc3QgYmVmb3JlIHRoZSBsaW5lCiAgKiAJZGlzY3BsaW5lIGhhcyBhIGNoYW5jZSB0byBzZWUgaXQuCiAgKiAKLSAqIHZvaWQJKCpzZXRfdGVybWlvcykoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKiBvbGQpOworICogdm9pZAkoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogICoKICAqIAlUaGlzIGZ1bmN0aW9uIG5vdGlmaWVzIHRoZSBsaW5lIGRpc2NwbGluZSB0aGF0IGEgY2hhbmdlIGhhcwogICogCWJlZW4gbWFkZSB0byB0aGUgdGVybWlvcyBzdHJ1Y3R1cmUuCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCBzaXplX3QgbnIpOwkKIAlpbnQJKCppb2N0bCkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci0Jdm9pZAkoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCk7CisJdm9pZAkoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogCXVuc2lnbmVkIGludCAoKnBvbGwpKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCiAJCQkgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqKTsKIAlpbnQJKCpoYW5ndXApKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90eXBlcy5oIGIvaW5jbHVkZS9saW51eC90eXBlcy5oCmluZGV4IDc1MGYwODUuLjAzNTFiZjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC90eXBlcy5oCkBAIC0xMjgsMjEgKzEyOCwyNyBAQAogCiAvKiB0aGlzIGlzIGEgc3BlY2lhbCA2NGJpdCBkYXRhIHR5cGUgdGhhdCBpcyA4LWJ5dGUgYWxpZ25lZCAqLwogI2RlZmluZSBhbGlnbmVkX3U2NCB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCisjZGVmaW5lIGFsaWduZWRfYmU2NCBfX2JlNjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCisjZGVmaW5lIGFsaWduZWRfbGU2NCBfX2xlNjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpCiAKIC8qKgogICogVGhlIHR5cGUgdXNlZCBmb3IgaW5kZXhpbmcgb250byBhIGRpc2Mgb3IgZGlzYyBwYXJ0aXRpb24uCiAgKgogICogTGludXggYWx3YXlzIGNvbnNpZGVycyBzZWN0b3JzIHRvIGJlIDUxMiBieXRlcyBsb25nIGluZGVwZW5kZW50bHkKICAqIG9mIHRoZSBkZXZpY2VzIHJlYWwgYmxvY2sgc2l6ZS4KLSAqCi0gKiBJZiByZXF1aXJlZCwgYXNtL3R5cGVzLmggY2FuIG92ZXJyaWRlIGl0IGFuZCBkZWZpbmUKLSAqIEhBVkVfU0VDVE9SX1QKICAqLwotI2lmbmRlZiBIQVZFX1NFQ1RPUl9UCisjaWZkZWYgQ09ORklHX0xCRAordHlwZWRlZiB1NjQgc2VjdG9yX3Q7CisjZWxzZQogdHlwZWRlZiB1bnNpZ25lZCBsb25nIHNlY3Rvcl90OwogI2VuZGlmCiAKLSNpZm5kZWYgSEFWRV9CTEtDTlRfVAorLyoKKyAqIFRoZSB0eXBlIG9mIHRoZSBpbm9kZSdzIGJsb2NrIGNvdW50LgorICovCisjaWZkZWYgQ09ORklHX0xTRgordHlwZWRlZiB1NjQgYmxrY250X3Q7CisjZWxzZQogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJsa2NudF90OwogI2VuZGlmCiAKQEAgLTE4MCw2ICsxODYsOCBAQAogdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19sZTY0OwogdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19iZTY0OwogI2VuZGlmCit0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX3N1bTE2OwordHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX193c3VtOwogCiAjaWZkZWYgX19LRVJORUxfXwogdHlwZWRlZiB1bnNpZ25lZCBfX2JpdHdpc2VfXyBnZnBfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWFjY2Vzcy5oIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKaW5kZXggYTQ4ZDdmMS4uOTc1Yzk2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKQEAgLTEsOCArMSw0MyBAQAogI2lmbmRlZiBfX0xJTlVYX1VBQ0NFU1NfSF9fCiAjZGVmaW5lIF9fTElOVVhfVUFDQ0VTU19IX18KIAorI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisvKgorICogVGhlc2Ugcm91dGluZXMgZW5hYmxlL2Rpc2FibGUgdGhlIHBhZ2VmYXVsdCBoYW5kbGVyIGluIHRoYXQKKyAqIGl0IHdpbGwgbm90IHRha2UgYW55IGxvY2tzIGFuZCBnbyBzdHJhaWdodCB0byB0aGUgZml4dXAgdGFibGUuCisgKgorICogVGhleSBoYXZlIGdyZWF0IHJlc2VtYmxhbmNlIHRvIHRoZSBwcmVlbXB0X2Rpc2FibGUvZW5hYmxlIGNhbGxzCisgKiBhbmQgaW4gZmFjdCB0aGV5IGFyZSBpZGVudGljYWw7IHRoaXMgaXMgYmVjYXVzZSBjdXJyZW50bHkgdGhlcmUgaXMKKyAqIG5vIG90aGVyIHdheSB0byBtYWtlIHRoZSBwYWdlZmF1bHQgaGFuZGxlcnMgZG8gdGhpcy4gU28gd2UgZG8KKyAqIGRpc2FibGUgcHJlZW1wdGlvbiBidXQgd2UgZG9uJ3QgbmVjZXNzYXJpbHkgY2FyZSBhYm91dCB0aGF0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGFnZWZhdWx0X2Rpc2FibGUodm9pZCkKK3sKKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCS8qCisJICogbWFrZSBzdXJlIHRvIGhhdmUgaXNzdWVkIHRoZSBzdG9yZSBiZWZvcmUgYSBwYWdlZmF1bHQKKwkgKiBjYW4gaGl0LgorCSAqLworCWJhcnJpZXIoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBhZ2VmYXVsdF9lbmFibGUodm9pZCkKK3sKKwkvKgorCSAqIG1ha2Ugc3VyZSB0byBpc3N1ZSB0aG9zZSBsYXN0IGxvYWRzL3N0b3JlcyBiZWZvcmUgZW5hYmxpbmcKKwkgKiB0aGUgcGFnZWZhdWx0IGhhbmRsZXIgYWdhaW4uCisJICovCisJYmFycmllcigpOworCWRlY19wcmVlbXB0X2NvdW50KCk7CisJLyoKKwkgKiBtYWtlIHN1cmUgd2UgZG8uLgorCSAqLworCWJhcnJpZXIoKTsKKwlwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsKK30KKwogI2lmbmRlZiBBUkNIX0hBU19OT0NBQ0hFX1VBQ0NFU1MKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWNfbm9jYWNoZSh2b2lkICp0bywKQEAgLTMwLDE0ICs2NSwyMiBAQAogICogZG9fcGFnZV9mYXVsdCgpIGRvZXNuJ3QgYXR0ZW1wdCB0byB0YWtlIG1tYXBfc2VtLiAgVGhpcyBtYWtlcwogICogcHJvYmVfa2VybmVsX2FkZHJlc3MoKSBzdWl0YWJsZSBmb3IgdXNlIHdpdGhpbiByZWdpb25zIHdoZXJlIHRoZSBjYWxsZXIKICAqIGFscmVhZHkgaG9sZHMgbW1hcF9zZW0sIG9yIG90aGVyIGxvY2tzIHdoaWNoIG5lc3QgaW5zaWRlIG1tYXBfc2VtLgorICogVGhpcyBtdXN0IGJlIGEgbWFjcm8gYmVjYXVzZSBfX2dldF91c2VyKCkgbmVlZHMgdG8ga25vdyB0aGUgdHlwZXMgb2YgdGhlCisgKiBhcmdzLgorICoKKyAqIFdlIGRvbid0IGluY2x1ZGUgZW5vdWdoIGhlYWRlciBmaWxlcyB0byBiZSBhYmxlIHRvIGRvIHRoZSBzZXRfZnMoKS4gIFdlCisgKiByZXF1aXJlIHRoYXQgdGhlIHByb2JlX2tlcm5lbF9hZGRyZXNzKCkgY2FsbGVyIHdpbGwgZG8gdGhhdC4KICAqLwogI2RlZmluZSBwcm9iZV9rZXJuZWxfYWRkcmVzcyhhZGRyLCByZXR2YWwpCQlcCiAJKHsJCQkJCQlcCiAJCWxvbmcgcmV0OwkJCQlcCisJCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsJCVwKIAkJCQkJCQlcCi0JCWluY19wcmVlbXB0X2NvdW50KCk7CQkJXAotCQlyZXQgPSBfX2dldF91c2VyKHJldHZhbCwgYWRkcik7CQlcCi0JCWRlY19wcmVlbXB0X2NvdW50KCk7CQkJXAorCQlzZXRfZnMoS0VSTkVMX0RTKTsJCQlcCisJCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CQkJXAorCQlyZXQgPSBfX2dldF91c2VyKHJldHZhbCwgKF9fZm9yY2UgdHlwZW9mKHJldHZhbCkgX191c2VyICopKGFkZHIpKTsJCVwKKwkJcGFnZWZhdWx0X2VuYWJsZSgpOwkJCVwKKwkJc2V0X2ZzKG9sZF9mcyk7CQkJCVwKIAkJcmV0OwkJCQkJXAogCX0pCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWRwLmggYi9pbmNsdWRlL2xpbnV4L3VkcC5oCmluZGV4IDAxNGI0MWQuLjdlMDhjMDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWRwLmgKKysrIGIvaW5jbHVkZS9saW51eC91ZHAuaApAQCAtMjMsNyArMjMsNyBAQAogCV9fYmUxNglzb3VyY2U7CiAJX19iZTE2CWRlc3Q7CiAJX19iZTE2CWxlbjsKLQlfX2JlMTYJY2hlY2s7CisJX19zdW0xNgljaGVjazsKIH07CiAKIC8qIFVEUCBzb2NrZXQgb3B0aW9ucyAqLwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CisjZGVmaW5lIFVEUF9IVEFCTEVfU0laRQkJMTI4CiAKIHN0cnVjdCB1ZHBfc29jayB7CiAJLyogaW5ldF9zb2NrIGhhcyB0byBiZSB0aGUgZmlyc3QgbWVtYmVyICovCkBAIC01MCwxMiArNTEsMjMgQEAKIAkgKiB3aGVuIHRoZSBzb2NrZXQgaXMgdW5jb3JrZWQuCiAJICovCiAJX191MTYJCSBsZW47CQkvKiB0b3RhbCBsZW5ndGggb2YgcGVuZGluZyBmcmFtZXMgKi8KKwkvKgorCSAqIEZpZWxkcyBzcGVjaWZpYyB0byBVRFAtTGl0ZS4KKwkgKi8KKwlfX3UxNgkJIHBjc2xlbjsKKwlfX3UxNgkJIHBjcmxlbjsKKy8qIGluZGljYXRvciBiaXRzIHVzZWQgYnkgcGNmbGFnOiAqLworI2RlZmluZSBVRFBMSVRFX0JJVCAgICAgIDB4MSAgCQkvKiBzZXQgYnkgdWRwbGl0ZSBwcm90byBpbml0IGZ1bmN0aW9uICovCisjZGVmaW5lIFVEUExJVEVfU0VORF9DQyAgMHgyICAJCS8qIHNldCB2aWEgdWRwbGl0ZSBzZXRzb2Nrb3B0ICAgICAgICAgKi8KKyNkZWZpbmUgVURQTElURV9SRUNWX0NDICAweDQJCS8qIHNldCB2aWEgdWRwbGl0ZSBzZXRzb2NrdG9wdCAgICAgICAgKi8KKwlfX3U4CQkgcGNmbGFnOyAgICAgICAgLyogbWFya3Mgc29ja2V0IGFzIFVEUC1MaXRlIGlmID4gMCAgICAqLwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdWRwX3NvY2sgKnVkcF9zayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7CiAJcmV0dXJuIChzdHJ1Y3QgdWRwX3NvY2sgKilzazsKIH0KKyNkZWZpbmUgSVNfVURQTElURShfX3NrKSAodWRwX3NrKF9fc2spLT5wY2ZsYWcpCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oIGIvaW5jbHVkZS9saW51eC91ZnNfZnMuaAppbmRleCA2MWVlZjUwLi4yODk2N2VkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdWZzX2ZzLmgKQEAgLTkwOCw3ICs5MDgsNyBAQAogCQkJX19mczY0ICAgZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLwogCQkJX19mczY0ICAgIGZzX3BlbmRpbmdibG9ja3M7LyogYmxvY2tzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KIAkJCV9fZnMzMiAgICBmc19wZW5kaW5naW5vZGVzOy8qaW5vZGVzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KLQkJfSBmc191MjsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZnNfdTI7CiAJfSBmc191bjE7CiAJdW5pb24gewogCQlzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91bndpbmQuaCBiL2luY2x1ZGUvbGludXgvdW53aW5kLmgKaW5kZXggNzNlMTc1MS4uNzQ5OTI4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91bndpbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Vud2luZC5oCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBJbml0aWFsaXplIHVud2luZCBzdXBwb3J0LgogICovCiBleHRlcm4gdm9pZCB1bndpbmRfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHVud2luZF9zZXR1cCh2b2lkKTsKIAogI2lmZGVmIENPTkZJR19NT0RVTEVTCiAKQEAgLTczLDYgKzc0LDcgQEAKIHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyB7fTsKIAogc3RhdGljIGlubGluZSB2b2lkIHVud2luZF9pbml0KHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgdW53aW5kX3NldHVwKHZvaWQpIHt9CiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IuaAppbmRleCA1NDgyYmZiLi5hYWI1YjFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiLmgKQEAgLTMxMyw4ICszMTMsMTMgQEAKIC8qIFRoaXMgaXMgYXJiaXRyYXJ5LgogICogRnJvbSBVU0IgMi4wIHNwZWMgVGFibGUgMTEtMTMsIG9mZnNldCA3LCBhIGh1YiBjYW4KICAqIGhhdmUgdXAgdG8gMjU1IHBvcnRzLiBUaGUgbW9zdCB5ZXQgcmVwb3J0ZWQgaXMgMTAuCisgKgorICogQ3VycmVudCBXaXJlbGVzcyBVU0IgaG9zdCBoYXJkd2FyZSAoSW50ZWwgaTE0ODAgZm9yIGV4YW1wbGUpIGFsbG93cworICogdXAgdG8gMjIgZGV2aWNlcyB0byBjb25uZWN0LiBVcGNvbWluZyBoYXJkd2FyZSBtaWdodCByYWlzZSB0aGF0CisgKiBsaW1pdC4gQmVjYXVzZSB0aGUgYXJyYXlzIG5lZWQgdG8gYWRkIGEgYml0IGZvciBodWIgc3RhdHVzIGRhdGEsIHdlCisgKiBkbyAzMSwgc28gcGx1cyBvbmUgZXZlbnMgb3V0IHRvIGZvdXIgYnl0ZXMuCiAgKi8KLSNkZWZpbmUgVVNCX01BWENISUxEUkVOCQkoMTYpCisjZGVmaW5lIFVTQl9NQVhDSElMRFJFTgkJKDMxKQogCiBzdHJ1Y3QgdXNiX3R0OwogCkBAIC0zNTcsNyArMzYyLDggQEAKIAl1OCBwb3J0bnVtOwkJCS8qIFBhcmVudCBwb3J0IG51bWJlciAob3JpZ2luIDEpICovCiAJdTggbGV2ZWw7CQkJLyogTnVtYmVyIG9mIFVTQiBodWIgYW5jZXN0b3JzICovCiAKLQlpbnQgaGF2ZV9sYW5naWQ7CQkvKiB3aGV0aGVyIHN0cmluZ19sYW5naWQgaXMgdmFsaWQgKi8KKwl1bnNpZ25lZCBkaXNjb25fc3VzcGVuZGVkOjE7CS8qIERpc2Nvbm5lY3RlZCB3aGlsZSBzdXNwZW5kZWQgKi8KKwl1bnNpZ25lZCBoYXZlX2xhbmdpZDoxOwkJLyogd2hldGhlciBzdHJpbmdfbGFuZ2lkIGlzIHZhbGlkICovCiAJaW50IHN0cmluZ19sYW5naWQ7CQkvKiBsYW5ndWFnZSBJRCBmb3Igc3RyaW5ncyAqLwogCiAJLyogc3RhdGljIHN0cmluZ3MgZnJvbSB0aGUgZGV2aWNlICovCkBAIC0zODIsNyArMzg4LDcgQEAKIAogCWludCBwbV91c2FnZV9jbnQ7CQkvKiB1c2FnZSBjb3VudGVyIGZvciBhdXRvc3VzcGVuZCAqLwogI2lmZGVmIENPTkZJR19QTQotCXN0cnVjdCB3b3JrX3N0cnVjdCBhdXRvc3VzcGVuZDsJLyogZm9yIGRlbGF5ZWQgYXV0b3N1c3BlbmRzICovCisJc3RydWN0IGRlbGF5ZWRfd29yayBhdXRvc3VzcGVuZDsgLyogZm9yIGRlbGF5ZWQgYXV0b3N1c3BlbmRzICovCiAJc3RydWN0IG11dGV4IHBtX211dGV4OwkJLyogcHJvdGVjdHMgUE0gb3BlcmF0aW9ucyAqLwogCiAJdW5zaWduZWQgYXV0b19wbToxOwkJLyogYXV0b3N1c3BlbmQvcmVzdW1lIGluIHByb2dyZXNzICovCkBAIC00MTAsMTQgKzQxNiwzNyBAQAogCiAvKiBVU0IgYXV0b3N1c3BlbmQgYW5kIGF1dG9yZXN1bWUgKi8KICNpZmRlZiBDT05GSUdfVVNCX1NVU1BFTkQKK2V4dGVybiBpbnQgdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIGV4dGVybiBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIGV4dGVybiB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKLSNlbHNlCi0jZGVmaW5lIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpbnRmKQkJMAotI2RlZmluZSB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaW50ZikJCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9lbmFibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJaW50Zi0+cG1fdXNhZ2VfY250ID0gMDsKKwl1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UoaW50Zik7Cit9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2Rpc2FibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJaW50Zi0+cG1fdXNhZ2VfY250ID0gMTsKKwl1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UoaW50Zik7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sgcmV0dXJuIDA7IH0KKworc3RhdGljIGlubGluZSBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9lbmFibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2Rpc2FibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7IH0KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC00OTAsMTcgKzUxOSwxMzcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfZGlyX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKLWV4dGVybiBpbnQgdXNiX2VuZHBvaW50X2Rpcl9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOwotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKLWV4dGVybiBpbnQgdXNiX2VuZHBvaW50X3hmZXJfaW50KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKLWV4dGVybiBpbnQgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7Ci1leHRlcm4gaW50IHVzYl9lbmRwb2ludF9pc19idWxrX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKLWV4dGVybiBpbnQgdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKLWV4dGVybiBpbnQgdXNiX2VuZHBvaW50X2lzX2ludF9pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7Ci1leHRlcm4gaW50IHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKLWV4dGVybiBpbnQgdXNiX2VuZHBvaW50X2lzX2lzb2NfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOwotZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfaXNfaXNvY19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOworLyoqCisgKiB1c2JfZW5kcG9pbnRfZGlyX2luIC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBJTiBkaXJlY3Rpb24KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgSU4sIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfZGlyX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAoKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTik7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2Rpcl9vdXQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIE9VVCBkaXJlY3Rpb24KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgT1VULCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2Rpcl9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X3hmZXJfYnVsayAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGJ1bGssIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF94ZmVyX2ludCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgaW50ZXJydXB0LCBvdGhlcndpc2UgaXQgcmV0dXJucworICogZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF94ZmVyX2ludChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF94ZmVyX2lzb2MgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgaXNvY2hyb25vdXMsIG90aGVyd2lzZSBpdCByZXR1cm5zCisgKiBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBidWxrIElOCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgYnVsayBPVVQKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBidWxrIHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pbnRfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaW50ZXJydXB0IElOCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIElOIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfaW50X291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgT1VUCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfaXNvY19pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpc29jaHJvbm91cyBJTgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUgYW5kIElOIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitzdGF0aWMgaW5saW5lIGludCB1c2JfZW5kcG9pbnRfaXNfaXNvY19pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX2luKGVwZCkpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pc29jX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpc29jaHJvbm91cyBPVVQKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpc29jaHJvbm91cyB0cmFuc2ZlciB0eXBlIGFuZCBPVVQgZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9pc19pc29jX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKK30KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaAppbmRleCA5MWIzZWEyLi4xMGY5OWU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaApAQCAtMjE4LDcgKzIxOCw3IEBACiAJaW50ICAoKndyaXRlKQkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKIAlpbnQgICgqd3JpdGVfcm9vbSkJKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogCWludCAgKCppb2N0bCkJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLQl2b2lkICgqc2V0X3Rlcm1pb3MpCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqIG9sZCk7CisJdm9pZCAoKnNldF90ZXJtaW9zKQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICogb2xkKTsKIAl2b2lkICgqYnJlYWtfY3RsKQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKTsKIAlpbnQgICgqY2hhcnNfaW5fYnVmZmVyKQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiAJdm9pZCAoKnRocm90dGxlKQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAppbmRleCBjNWZkZjYyLi41Y2IzODBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKQEAgLTI0Myw3ICsyNDMsOCBAQAogI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIwICB2NGwyX2ZvdXJjYygnWScsJ1UnLCcxJywnMicpIC8qIDEyICBZVVYgNDoyOjAgICAgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZWVVWICAgIHY0bDJfZm91cmNjKCdZJywnWScsJ1UnLCdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0hJMjQwICAgdjRsMl9mb3VyY2MoJ0gnLCdJJywnMicsJzQnKSAvKiAgOCAgOC1iaXQgY29sb3IgICAqLwotI2RlZmluZSBWNEwyX1BJWF9GTVRfSE0xMiAgICB2NGwyX2ZvdXJjYygnSCcsJ00nLCcxJywnMicpIC8qICA4ICBZVVYgNDoxOjEgMTZ4MTYgbWFjcm9ibG9ja3MgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hNMTIgICAgdjRsMl9mb3VyY2MoJ0gnLCdNJywnMScsJzInKSAvKiAgOCAgWVVWIDQ6MjowIDE2eDE2IG1hY3JvYmxvY2tzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I0NDQgIHY0bDJfZm91cmNjKCdSJywnNCcsJzQnLCc0JykgLyogMTYgIHh4eHhycnJyIGdnZ2diYmJiICovCiAKIC8qIHNlZSBodHRwOi8vd3d3LnNpbGljb25pbWFnaW5nLmNvbS9SR0IlMjBCYXllci5odG0gKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSOCAgdjRsMl9mb3VyY2MoJ0InLCdBJywnOCcsJzEnKSAvKiAgOCAgQkdCRy4uIEdSR1IuLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAppbmRleCBjZTVmMTQ4Li45MjRlNTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaApAQCAtMjMsMTMgKzIzLDE0IEBACiAjZW5kaWYKIAogc3RydWN0IHZtX3N0cnVjdCB7CisJLyoga2VlcCBuZXh0LGFkZHIsc2l6ZSB0b2dldGhlciB0byBzcGVlZHVwIGxvb2t1cHMgKi8KKwlzdHJ1Y3Qgdm1fc3RydWN0CSpuZXh0OwogCXZvaWQJCQkqYWRkcjsKIAl1bnNpZ25lZCBsb25nCQlzaXplOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXN0cnVjdCBwYWdlCQkqKnBhZ2VzOwogCXVuc2lnbmVkIGludAkJbnJfcGFnZXM7CiAJdW5zaWduZWQgbG9uZwkJcGh5c19hZGRyOwotCXN0cnVjdCB2bV9zdHJ1Y3QJKm5leHQ7CiB9OwogCiAvKgpAQCAtNjAsNyArNjEsOCBAQAogZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKl9fZ2V0X3ZtX2FyZWEodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBub2RlKTsKKwkJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgbm9kZSwKKwkJCQkJICBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqcmVtb3ZlX3ZtX2FyZWEodm9pZCAqYWRkcik7CiBleHRlcm4gaW50IG1hcF92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEsIHBncHJvdF90IHByb3QsCiAJCQlzdHJ1Y3QgcGFnZSAqKipwYWdlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhaXQuaCBiL2luY2x1ZGUvbGludXgvd2FpdC5oCmluZGV4IGIzYjkwNDguLmU4MjBkMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd2FpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvd2FpdC5oCkBAIC03OSw2ICs3OSwxNSBAQAogCiBleHRlcm4gdm9pZCBpbml0X3dhaXRxdWV1ZV9oZWFkKHdhaXRfcXVldWVfaGVhZF90ICpxKTsKIAorI2lmZGVmIENPTkZJR19MT0NLREVQCisjIGRlZmluZSBfX1dBSVRfUVVFVUVfSEVBRF9JTklUX09OU1RBQ0sobmFtZSkgXAorCSh7IGluaXRfd2FpdHF1ZXVlX2hlYWQoJm5hbWUpOyBuYW1lOyB9KQorIyBkZWZpbmUgREVDTEFSRV9XQUlUX1FVRVVFX0hFQURfT05TVEFDSyhuYW1lKSBcCisJd2FpdF9xdWV1ZV9oZWFkX3QgbmFtZSA9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRfT05TVEFDSyhuYW1lKQorI2Vsc2UKKyMgZGVmaW5lIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sobmFtZSkgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobmFtZSkKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF93YWl0cXVldWVfZW50cnkod2FpdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJcS0+ZmxhZ3MgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oIGIvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oCmluZGV4IGE1MGEwMTMuLjdjMjY5ZjQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmgKKysrIGIvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oCkBAIC01NDYsNiArNTQ2LDggQEAKIC8qIE1MTUUgcmVxdWVzdHMgKFNJT0NTSVdNTE1FIC8gc3RydWN0IGl3X21sbWUpICovCiAjZGVmaW5lIElXX01MTUVfREVBVVRICQkwCiAjZGVmaW5lIElXX01MTUVfRElTQVNTT0MJMQorI2RlZmluZSBJV19NTE1FX0FVVEgJCTIKKyNkZWZpbmUgSVdfTUxNRV9BU1NPQwkJMwogCiAvKiBTSU9DU0lXQVVUSC9TSU9DR0lXQVVUSCBzdHJ1Y3QgaXdfcGFyYW0gZmxhZ3MgKi8KICNkZWZpbmUgSVdfQVVUSF9JTkRFWAkJMHgwRkZGCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCA5YmNhMzUzLi5lZGVmOGQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTExLDEyICsxMSwyMyBAQAogCiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdDsKIAorc3RydWN0IHdvcmtfc3RydWN0OwordHlwZWRlZiB2b2lkICgqd29ya19mdW5jX3QpKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIHN0cnVjdCB3b3JrX3N0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBwZW5kaW5nOworCS8qIHRoZSBmaXJzdCB3b3JkIGlzIHRoZSB3b3JrIHF1ZXVlIHBvaW50ZXIgYW5kIHRoZSBmbGFncyByb2xsZWQgaW50bworCSAqIG9uZSAqLworCXVuc2lnbmVkIGxvbmcgbWFuYWdlbWVudDsKKyNkZWZpbmUgV09SS19TVFJVQ1RfUEVORElORyAwCQkvKiBUIGlmIHdvcmsgaXRlbSBwZW5kaW5nIGV4ZWN1dGlvbiAqLworI2RlZmluZSBXT1JLX1NUUlVDVF9OT0FVVE9SRUwgMQkJLyogRiBpZiB3b3JrIGl0ZW0gYXV0b21hdGljYWxseSByZWxlYXNlZCBvbiBleGVjICovCisjZGVmaW5lIFdPUktfU1RSVUNUX0ZMQUdfTUFTSyAoM1VMKQorI2RlZmluZSBXT1JLX1NUUlVDVF9XUV9EQVRBX01BU0sgKH5XT1JLX1NUUlVDVF9GTEFHX01BU0spCiAJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKLQl2b2lkICgqZnVuYykodm9pZCAqKTsKLQl2b2lkICpkYXRhOwotCXZvaWQgKndxX2RhdGE7CisJd29ya19mdW5jX3QgZnVuYzsKK307CisKK3N0cnVjdCBkZWxheWVkX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogfTsKIApAQCAtMjQsNzcgKzM1LDE2MCBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogfTsKIAotI2RlZmluZSBfX1dPUktfSU5JVElBTElaRVIobiwgZiwgZCkgewkJCQlcCisjZGVmaW5lIF9fV09SS19JTklUSUFMSVpFUihuLCBmKSB7CQkJCVwKKwkubWFuYWdlbWVudCA9IDAsCQkJCQlcCiAgICAgICAgIC5lbnRyeQk9IHsgJihuKS5lbnRyeSwgJihuKS5lbnRyeSB9LAkJCVwKIAkuZnVuYyA9IChmKSwJCQkJCQlcCi0JLmRhdGEgPSAoZCksCQkJCQkJXAorCX0KKworI2RlZmluZSBfX1dPUktfSU5JVElBTElaRVJfTkFSKG4sIGYpIHsJCQkJXAorCS5tYW5hZ2VtZW50ID0gKDEgPDwgV09SS19TVFJVQ1RfTk9BVVRPUkVMKSwJCVwKKyAgICAgICAgLmVudHJ5CT0geyAmKG4pLmVudHJ5LCAmKG4pLmVudHJ5IH0sCQkJXAorCS5mdW5jID0gKGYpLAkJCQkJCVwKKwl9CisKKyNkZWZpbmUgX19ERUxBWUVEX1dPUktfSU5JVElBTElaRVIobiwgZikgewkJCVwKKwkud29yayA9IF9fV09SS19JTklUSUFMSVpFUigobikud29yaywgKGYpKSwJCVwKIAkudGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKSwJCQlcCiAJfQogCi0jZGVmaW5lIERFQ0xBUkVfV09SSyhuLCBmLCBkKQkJCQkJXAotCXN0cnVjdCB3b3JrX3N0cnVjdCBuID0gX19XT1JLX0lOSVRJQUxJWkVSKG4sIGYsIGQpCisjZGVmaW5lIF9fREVMQVlFRF9XT1JLX0lOSVRJQUxJWkVSX05BUihuLCBmKSB7CQkJXAorCS53b3JrID0gX19XT1JLX0lOSVRJQUxJWkVSX05BUigobikud29yaywgKGYpKSwJCVwKKwkudGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKSwJCQlcCisJfQorCisjZGVmaW5lIERFQ0xBUkVfV09SSyhuLCBmKQkJCQkJXAorCXN0cnVjdCB3b3JrX3N0cnVjdCBuID0gX19XT1JLX0lOSVRJQUxJWkVSKG4sIGYpCisKKyNkZWZpbmUgREVDTEFSRV9XT1JLX05BUihuLCBmKQkJCQkJXAorCXN0cnVjdCB3b3JrX3N0cnVjdCBuID0gX19XT1JLX0lOSVRJQUxJWkVSX05BUihuLCBmKQorCisjZGVmaW5lIERFQ0xBUkVfREVMQVlFRF9XT1JLKG4sIGYpCQkJCVwKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIG4gPSBfX0RFTEFZRURfV09SS19JTklUSUFMSVpFUihuLCBmKQorCisjZGVmaW5lIERFQ0xBUkVfREVMQVlFRF9XT1JLX05BUihuLCBmKQkJCVwKKwlzdHJ1Y3QgZHdvcmtfc3RydWN0IG4gPSBfX0RFTEFZRURfV09SS19JTklUSUFMSVpFUl9OQVIobiwgZikKIAogLyoKLSAqIGluaXRpYWxpemUgYSB3b3JrLXN0cnVjdCdzIGZ1bmMgYW5kIGRhdGEgcG9pbnRlcnM6CisgKiBpbml0aWFsaXplIGEgd29yayBpdGVtJ3MgZnVuY3Rpb24gcG9pbnRlcgogICovCi0jZGVmaW5lIFBSRVBBUkVfV09SSyhfd29yaywgX2Z1bmMsIF9kYXRhKQkJCVwKKyNkZWZpbmUgUFJFUEFSRV9XT1JLKF93b3JrLCBfZnVuYykJCQkJXAogCWRvIHsJCQkJCQkJXAotCQkoX3dvcmspLT5mdW5jID0gX2Z1bmM7CQkJCVwKLQkJKF93b3JrKS0+ZGF0YSA9IF9kYXRhOwkJCQlcCisJCShfd29yayktPmZ1bmMgPSAoX2Z1bmMpOwkJCVwKIAl9IHdoaWxlICgwKQogCisjZGVmaW5lIFBSRVBBUkVfREVMQVlFRF9XT1JLKF93b3JrLCBfZnVuYykJCQlcCisJUFJFUEFSRV9XT1JLKCYoX3dvcmspLT53b3JrLCAoX2Z1bmMpKQorCiAvKgotICogaW5pdGlhbGl6ZSBhbGwgb2YgYSB3b3JrLXN0cnVjdDoKKyAqIGluaXRpYWxpemUgYWxsIG9mIGEgd29yayBpdGVtIGluIG9uZSBnbwogICovCi0jZGVmaW5lIElOSVRfV09SSyhfd29yaywgX2Z1bmMsIF9kYXRhKQkJCQlcCisjZGVmaW5lIElOSVRfV09SSyhfd29yaywgX2Z1bmMpCQkJCQlcCiAJZG8gewkJCQkJCQlcCisJCShfd29yayktPm1hbmFnZW1lbnQgPSAwOwkJCVwKIAkJSU5JVF9MSVNUX0hFQUQoJihfd29yayktPmVudHJ5KTsJCVwKLQkJKF93b3JrKS0+cGVuZGluZyA9IDA7CQkJCVwKLQkJUFJFUEFSRV9XT1JLKChfd29yayksIChfZnVuYyksIChfZGF0YSkpOwlcCisJCVBSRVBBUkVfV09SSygoX3dvcmspLCAoX2Z1bmMpKTsJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTklUX1dPUktfTkFSKF93b3JrLCBfZnVuYykJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCShfd29yayktPm1hbmFnZW1lbnQgPSAoMSA8PCBXT1JLX1NUUlVDVF9OT0FVVE9SRUwpOwlcCisJCUlOSVRfTElTVF9IRUFEKCYoX3dvcmspLT5lbnRyeSk7CQkJXAorCQlQUkVQQVJFX1dPUksoKF93b3JrKSwgKF9mdW5jKSk7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIElOSVRfREVMQVlFRF9XT1JLKF93b3JrLCBfZnVuYykJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlJTklUX1dPUksoJihfd29yayktPndvcmssIChfZnVuYykpOwkJXAogCQlpbml0X3RpbWVyKCYoX3dvcmspLT50aW1lcik7CQkJXAogCX0gd2hpbGUgKDApCiAKKyNkZWZpbmUgSU5JVF9ERUxBWUVEX1dPUktfTkFSKF93b3JrLCBfZnVuYykJCQlcCisJZG8gewkJCQkJCQlcCisJCUlOSVRfV09SS19OQVIoJihfd29yayktPndvcmssIChfZnVuYykpOwkJXAorCQlpbml0X3RpbWVyKCYoX3dvcmspLT50aW1lcik7CQkJXAorCX0gd2hpbGUgKDApCisKKy8qKgorICogd29ya19wZW5kaW5nIC0gRmluZCBvdXQgd2hldGhlciBhIHdvcmsgaXRlbSBpcyBjdXJyZW50bHkgcGVuZGluZworICogQHdvcms6IFRoZSB3b3JrIGl0ZW0gaW4gcXVlc3Rpb24KKyAqLworI2RlZmluZSB3b3JrX3BlbmRpbmcod29yaykgXAorCXRlc3RfYml0KFdPUktfU1RSVUNUX1BFTkRJTkcsICYod29yayktPm1hbmFnZW1lbnQpCisKKy8qKgorICogZGVsYXllZF93b3JrX3BlbmRpbmcgLSBGaW5kIG91dCB3aGV0aGVyIGEgZGVsYXlhYmxlIHdvcmsgaXRlbSBpcyBjdXJyZW50bHkKKyAqIHBlbmRpbmcKKyAqIEB3b3JrOiBUaGUgd29yayBpdGVtIGluIHF1ZXN0aW9uCisgKi8KKyNkZWZpbmUgZGVsYXllZF93b3JrX3BlbmRpbmcod29yaykgXAorCXRlc3RfYml0KFdPUktfU1RSVUNUX1BFTkRJTkcsICYod29yayktPndvcmsubWFuYWdlbWVudCkKKworLyoqCisgKiB3b3JrX3JlbGVhc2UgLSBSZWxlYXNlIGEgd29yayBpdGVtIHVuZGVyIGV4ZWN1dGlvbgorICogQHdvcms6IFRoZSB3b3JrIGl0ZW0gdG8gcmVsZWFzZQorICoKKyAqIFRoaXMgaXMgdXNlZCB0byByZWxlYXNlIGEgd29yayBpdGVtIHRoYXQgaGFzIGJlZW4gaW5pdGlhbGlzZWQgd2l0aCBhdXRvbWF0aWMKKyAqIHJlbGVhc2UgbW9kZSBkaXNhYmxlZCAoV09SS19TVFJVQ1RfTk9BVVRPUkVMIGlzIHNldCkuICBUaGlzIGdpdmVzIHRoZSB3b3JrCisgKiBmdW5jdGlvbiB0aGUgb3Bwb3J0dW5pdHkgdG8gZ3JhYiBhdXhpbGlhcnkgZGF0YSBmcm9tIHRoZSBjb250YWluZXIgb2YgdGhlCisgKiB3b3JrX3N0cnVjdCBiZWZvcmUgY2xlYXJpbmcgdGhlIHBlbmRpbmcgYml0IGFzIHRoZSB3b3JrX3N0cnVjdCBtYXkgYmUKKyAqIHN1YmplY3QgdG8gZGVhbGxvY2F0aW9uIHRoZSBtb21lbnQgdGhlIHBlbmRpbmcgYml0IGlzIGNsZWFyZWQuCisgKgorICogSW4gc3VjaCBhIGNhc2UsIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgd29yayBmdW5jdGlvbiBhZnRlciBpdCBoYXMKKyAqIGZldGNoZWQgYW55IGRhdGEgaXQgbWF5IHJlcXVpcmUgZnJvbSB0aGUgY29udGFpbnRlciBvZiB0aGUgd29ya19zdHJ1Y3QuCisgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHdvcmtfc3RydWN0IG1heSBiZSBzY2hlZHVsZWQgZm9yCisgKiBmdXJ0aGVyIGV4ZWN1dGlvbiBvciBpdCBtYXkgYmUgZGVhbGxvY2F0ZWQgdW5sZXNzIG90aGVyIHByZWNhdXRpb25zIGFyZQorICogdGFrZW4uCisgKgorICogVGhpcyBzaG91bGQgYWxzbyBiZSB1c2VkIHRvIHJlbGVhc2UgYSBkZWxheWVkIHdvcmsgaXRlbS4KKyAqLworI2RlZmluZSB3b3JrX3JlbGVhc2Uod29yaykgXAorCWNsZWFyX2JpdChXT1JLX1NUUlVDVF9QRU5ESU5HLCAmKHdvcmspLT5tYW5hZ2VtZW50KQorCisKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqX19jcmVhdGVfd29ya3F1ZXVlKGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCQkgICAgaW50IHNpbmdsZXRocmVhZCk7Ci0jZGVmaW5lIGNyZWF0ZV93b3JrcXVldWUobmFtZSkgX19jcmVhdGVfd29ya3F1ZXVlKChuYW1lKSwgMCkKLSNkZWZpbmUgY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUobmFtZSkgX19jcmVhdGVfd29ya3F1ZXVlKChuYW1lKSwgMSkKKwkJCQkJCSAgICBpbnQgc2luZ2xldGhyZWFkLAorCQkJCQkJICAgIGludCBmcmVlemVhYmxlKTsKKyNkZWZpbmUgY3JlYXRlX3dvcmtxdWV1ZShuYW1lKSBfX2NyZWF0ZV93b3JrcXVldWUoKG5hbWUpLCAwLCAwKQorI2RlZmluZSBjcmVhdGVfZnJlZXplYWJsZV93b3JrcXVldWUobmFtZSkgX19jcmVhdGVfd29ya3F1ZXVlKChuYW1lKSwgMCwgMSkKKyNkZWZpbmUgY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUobmFtZSkgX19jcmVhdGVfd29ya3F1ZXVlKChuYW1lKSwgMSwgMCkKIAogZXh0ZXJuIHZvaWQgZGVzdHJveV93b3JrcXVldWUoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKTsKIAogZXh0ZXJuIGludCBGQVNUQ0FMTChxdWV1ZV93b3JrKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSk7Ci1leHRlcm4gaW50IEZBU1RDQUxMKHF1ZXVlX2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgdW5zaWduZWQgbG9uZyBkZWxheSkpOworZXh0ZXJuIGludCBGQVNUQ0FMTChxdWV1ZV9kZWxheWVkX3dvcmsoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLCBzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KSk7CiBleHRlcm4gaW50IHF1ZXVlX2RlbGF5ZWRfd29ya19vbihpbnQgY3B1LCBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsCi0Jc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKIGV4dGVybiB2b2lkIEZBU1RDQUxMKGZsdXNoX3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpKTsKIAogZXh0ZXJuIGludCBGQVNUQ0FMTChzY2hlZHVsZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykpOwotZXh0ZXJuIGludCBGQVNUQ0FMTChzY2hlZHVsZV9kZWxheWVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KSk7CitleHRlcm4gaW50IEZBU1RDQUxMKHJ1bl9zY2hlZHVsZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspKTsKK2V4dGVybiBpbnQgRkFTVENBTEwoc2NoZWR1bGVfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpKTsKIAotZXh0ZXJuIGludCBzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24oaW50IGNwdSwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKLWV4dGVybiBpbnQgc2NoZWR1bGVfb25fZWFjaF9jcHUodm9pZCAoKmZ1bmMpKHZvaWQgKmluZm8pLCB2b2lkICppbmZvKTsKK2V4dGVybiBpbnQgc2NoZWR1bGVfZGVsYXllZF93b3JrX29uKGludCBjcHUsIHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpOworZXh0ZXJuIGludCBzY2hlZHVsZV9vbl9lYWNoX2NwdSh3b3JrX2Z1bmNfdCBmdW5jKTsKIGV4dGVybiB2b2lkIGZsdXNoX3NjaGVkdWxlZF93b3JrKHZvaWQpOwogZXh0ZXJuIGludCBjdXJyZW50X2lzX2tldmVudGQodm9pZCk7CiBleHRlcm4gaW50IGtldmVudGRfdXAodm9pZCk7CiAKIGV4dGVybiB2b2lkIGluaXRfd29ya3F1ZXVlcyh2b2lkKTsKLXZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspOwogdm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrcXVldWUoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKiwKLQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICopOwotaW50IGV4ZWN1dGVfaW5fcHJvY2Vzc19jb250ZXh0KHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqLAotCQkJICAgICAgIHN0cnVjdCBleGVjdXRlX3dvcmsgKik7CisJCQkJICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKik7CitpbnQgZXhlY3V0ZV9pbl9wcm9jZXNzX2NvbnRleHQod29ya19mdW5jX3QgZm4sIHN0cnVjdCBleGVjdXRlX3dvcmsgKik7CiAKIC8qCiAgKiBLaWxsIG9mZiBhIHBlbmRpbmcgc2NoZWR1bGVfZGVsYXllZF93b3JrKCkuICBOb3RlIHRoYXQgdGhlIHdvcmsgY2FsbGJhY2sKICAqIGZ1bmN0aW9uIG1heSBzdGlsbCBiZSBydW5uaW5nIG9uIHJldHVybiBmcm9tIGNhbmNlbF9kZWxheWVkX3dvcmsoKS4gIFJ1bgogICogZmx1c2hfc2NoZWR1bGVkX3dvcmsoKSB0byB3YWl0IG9uIGl0LgogICovCi1zdGF0aWMgaW5saW5lIGludCBjYW5jZWxfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyBpbmxpbmUgaW50IGNhbmNlbF9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKIHsKIAlpbnQgcmV0OwogCiAJcmV0ID0gZGVsX3RpbWVyX3N5bmMoJndvcmstPnRpbWVyKTsKIAlpZiAocmV0KQotCQljbGVhcl9iaXQoMCwgJndvcmstPnBlbmRpbmcpOworCQljbGVhcl9iaXQoV09SS19TVFJVQ1RfUEVORElORywgJndvcmstPndvcmsubWFuYWdlbWVudCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaCBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKaW5kZXggYTM0MWM4MC4uZmMzNWU2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCkBAIC04NSw3ICs4NSw2IEBACiB2b2lkIGxhcHRvcF9pb19jb21wbGV0aW9uKHZvaWQpOwogdm9pZCBsYXB0b3Bfc3luY19jb21wbGV0aW9uKHZvaWQpOwogdm9pZCB0aHJvdHRsZV92bV93cml0ZW91dCh2b2lkKTsKLXZvaWQgd3JpdGViYWNrX2Nvbmdlc3Rpb25fZW5kKHZvaWQpOwogCiAvKiBUaGVzZSBhcmUgZXhwb3J0ZWQgdG8gc3lzY3RsLiAqLwogZXh0ZXJuIGludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC94ZnJtLmggYi9pbmNsdWRlL2xpbnV4L3hmcm0uaAppbmRleCA4YWU3Zjc0Li45NTI5ZWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3hmcm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3hmcm0uaApAQCAtMjExLDggKzIxMSw4IEBACiAKIHN0cnVjdCB4ZnJtX2VuY2FwX3RtcGwgewogCV9fdTE2CQllbmNhcF90eXBlOwotCV9fdTE2CQllbmNhcF9zcG9ydDsKLQlfX3UxNgkJZW5jYXBfZHBvcnQ7CisJX19iZTE2CQllbmNhcF9zcG9ydDsKKwlfX2JlMTYJCWVuY2FwX2Rwb3J0OwogCXhmcm1fYWRkcmVzc190CWVuY2FwX29hOwogfTsKIApAQCAtMjg5LDcgKzI4OSw5IEBACiAKIHN0cnVjdCB4ZnJtX2FldmVudF9pZCB7CiAJc3RydWN0IHhmcm1fdXNlcnNhX2lkCQlzYV9pZDsKKwl4ZnJtX2FkZHJlc3NfdAkJCXNhZGRyOwogCV9fdTMyCQkJCWZsYWdzOworCV9fdTMyCQkJCXJlcWlkOwogfTsKIAogc3RydWN0IHhmcm1fdXNlcnNwaV9pbmZvIHsKQEAgLTM1NSw3ICszNTcsNyBAQAogI2RlZmluZSBYRlJNR1JQX0VYUElSRQkJMgogI2RlZmluZSBYRlJNR1JQX1NBCQk0CiAjZGVmaW5lIFhGUk1HUlBfUE9MSUNZCQk4Ci0jZGVmaW5lIFhGUk1HUlBfUkVQT1JUCQkweDEwCisjZGVmaW5lIFhGUk1HUlBfUkVQT1JUCQkweDIwCiAjZW5kaWYKIAogZW51bSB4ZnJtX25sZ3JvdXBzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvemZ0YXBlLmggYi9pbmNsdWRlL2xpbnV4L3pmdGFwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDU3YzY1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvemZ0YXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jaWZuZGVmIF9aRlRBUEVfSAotI2RlZmluZSBfWkZUQVBFX0gKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBDbGF1cy1KdXN0dXMgSGVpbmUuCi0KLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi0gKgotICogJFNvdXJjZTogL2hvbWVzL2N2cy9mdGFwZS1zdGFja2VkL2luY2x1ZGUvbGludXgvemZ0YXBlLmgsdiAkCi0gKiAkUmV2aXNpb246IDEuMTIgJAotICogJERhdGU6IDE5OTcvMTAvMjEgMTE6MDI6MzcgJAotICoKLSAqICAgICAgU3BlY2lhbCBpb2N0bCBhbmQgb3RoZXIgZ2xvYmFsIGluZm8gZm9yIHRoZSB6ZnRhcGUgVkZTCi0gKiAgICAgIGludGVyZmFjZSBmb3IgdGhlIFFJQy00MC84MC8zMDEwLzMwMjAgZmxvcHB5LXRhcGUgZHJpdmVyIGZvcgotICogICAgICBMaW51eC4KLSAqLwotCi0jZGVmaW5lIFpGVEFQRV9WRVJTSU9OICAiemZ0YXBlIGZvciAiIEZUQVBFX1ZFUlNJT04KLQotI2luY2x1ZGUgPGxpbnV4L2Z0YXBlLmg+Ci0KLSNkZWZpbmUgWkZUQVBFX0xBQkVMICAgICAgICJGdGFwZSAtIFRoZSBMaW51eCBGbG9wcHkgVGFwZSBQcm9qZWN0ISIKLQotLyogQml0cyBvZiB0aGUgbWlub3IgZGV2aWNlIG51bWJlciB0aGF0IGNvbnRyb2wgdGhlIG9wZXJhdGlvbiBtb2RlICovCi0jZGVmaW5lIFpGVF9RODBfTU9ERQkJKDEgPDwgMykKLSNkZWZpbmUgWkZUX1pJUF9NT0RFCQkoMSA8PCA0KQotI2RlZmluZSBaRlRfUkFXX01PREUJCSgxIDw8IDUpCi0jZGVmaW5lIFpGVF9NSU5PUl9PUF9NQVNLCShaRlRfUTgwX01PREUJfCAJXAotCQkJCSBaRlRfWklQX01PREUJfCAJXAotCQkJCSBaRlRfUkFXX01PREUpCi0jZGVmaW5lIFpGVF9NSU5PUl9NQVNLCQkoRlRBUEVfU0VMX01BU0sJCXwJXAotCQkJCSBaRlRfTUlOT1JfT1BfTUFTSwl8CVwKLQkJCQkgRlRBUEVfTk9fUkVXSU5EKQotCi0jaWZkZWYgWkZUX09CU09MRVRFCi1zdHJ1Y3QgbXRibGtzeiB7Ci0JdW5zaWduZWQgaW50IG10X2Jsa3N6OwotfTsKLSNkZWZpbmUgTVRJT0NfWkZUQVBFX0dFVEJMS1NaIF9JT1IoJ20nLCAxMDQsIHN0cnVjdCBtdGJsa3N6KQotI2VuZGlmCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLWV4dGVybiBpbnQgemZ0X2luaXQodm9pZCk7Ci0KLXN0YXRpYyBpbmxpbmUgX19zNjQgemZ0X2Rpdl9ibGtzeihfX3M2NCB2YWx1ZSwgX191MzIgYmxrX3N6KQotewotCWlmIChibGtfc3ogPT0gMSkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIChfX3M2NCkoKChfX3UzMikodmFsdWUgPj4gMTApICsgKGJsa19zeiA+PiAxMCkgLSAxKSAKLQkJCSAgICAgICAvIChibGtfc3ogPj4gMTApKTsKLQl9IAotfQotCi1zdGF0aWMgaW5saW5lIF9fczY0IHpmdF9tdWxfYmxrc3ooX19zNjQgdmFsdWUsIF9fdTMyIGJsa19zeikKLXsKLQlpZiAoYmxrX3N6ID09IDEpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0gZWxzZSB7Ci0JCS8qICBpZiBibGtfc3ogIT0gMSwgdGhlbiBpdCBpcyBhIG11bHRpcGxlIG9mIDEwMjQuIEluCi0JCSAqICB0aGlzIGNhc2UsIGB2YWx1ZScgd2lsbCBhbHNvIGZpdCBpbnRvIDMyIGJpdHMuCi0JCSAqIAotCQkgKiAgQWN0dWFsbHksIHRoaXMgbGltaXRzIHRoZSBjYXBhY2l0eSB0byA0MgotCQkgKiAgYml0cy4gVGhpcyBpcyAoMl4zMikqMTAyNCwgcm91Z2hseSBhIHRob3VzYW5kCi0JCSAqICB0aW1lcyAyR0IsIG9yIDMgVGVyYWJ5dGVzLiBIb3BlZnVsbHkgdGhpcyBpcyBlbm91Z2gKLQkJICovCi0JCXJldHVybihfX3M2NCkoKChfX3UzMikodmFsdWUpKihibGtfc3o+PjEwKSk8PDEwKTsKLQl9Ci19Ci0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmggYi9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCmluZGV4IDhmNTg0MDYuLjJiMjVmNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaApAQCAtOTIsNiArOTIsNyBAQAogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX25wZ3RlY2hbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX25vcndvb2RbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3Byb3RldXNfMjMwOVtJUl9LRVlUQUJfU0laRV07CitleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfYnVkZ2V0X2NpX29sZFtJUl9LRVlUQUJfU0laRV07CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaCBiL2luY2x1ZGUvbWVkaWEvc2FhNzE0Ni5oCmluZGV4IGZlZTU3OWYuLjc5NmJjZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2FhNzE0Ni5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc2FhNzE0Ni5oCkBAIC00MiwxMCArNDIsNiBAQAogI2RlZmluZSBERUJfSU5UKHgpICBpZiAoMCE9KERFQlVHX1ZBUklBQkxFJjB4MjApKSB7IERFQlVHX1BST0xPRzsgcHJpbnRrIHg7IH0gLyogaW50ZXJydXB0IGRlYnVnIG1lc3NhZ2VzICovCiAjZGVmaW5lIERFQl9DQVAoeCkgIGlmICgwIT0oREVCVUdfVkFSSUFCTEUmMHg0MCkpIHsgREVCVUdfUFJPTE9HOyBwcmludGsgeDsgfSAvKiBjYXB0dXJlIGRlYnVnIG1lc3NhZ2VzICovCiAKLSNkZWZpbmUgU0FBNzE0Nl9JRVJfRElTQUJMRSh4LHkpIFwKLQlzYWE3MTQ2X3dyaXRlKHgsIElFUiwgc2FhNzE0Nl9yZWFkKHgsIElFUikgJiB+KHkpKTsKLSNkZWZpbmUgU0FBNzE0Nl9JRVJfRU5BQkxFKHgseSkgXAotCXNhYTcxNDZfd3JpdGUoeCwgSUVSLCBzYWE3MTQ2X3JlYWQoeCwgSUVSKSB8ICh5KSk7CiAjZGVmaW5lIFNBQTcxNDZfSVNSX0NMRUFSKHgseSkgXAogCXNhYTcxNDZfd3JpdGUoeCwgSVNSLCAoeSkpOwogCkBAIC00NDEsNCArNDM3LDIwIEBACiAjZGVmaW5lIFNBQTcxNDZfSTJDX0JVU19CSVRfUkFURV84MAkoMHgyMDApCiAjZGVmaW5lIFNBQTcxNDZfSTJDX0JVU19CSVRfUkFURV82MAkoMHgzMDApCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBTQUE3MTQ2X0lFUl9ESVNBQkxFKHN0cnVjdCBzYWE3MTQ2X2RldiAqeCwgdW5zaWduZWQgeSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZ4LT5pbnRfc2xvY2ssIGZsYWdzKTsKKwlzYWE3MTQ2X3dyaXRlKHgsIElFUiwgc2FhNzE0Nl9yZWFkKHgsIElFUikgJiB+eSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeC0+aW50X3Nsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBTQUE3MTQ2X0lFUl9FTkFCTEUoc3RydWN0IHNhYTcxNDZfZGV2ICp4LCB1bnNpZ25lZCB5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJngtPmludF9zbG9jaywgZmxhZ3MpOworCXNhYTcxNDZfd3JpdGUoeCwgSUVSLCBzYWE3MTQ2X3JlYWQoeCwgSUVSKSB8IHkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJngtPmludF9zbG9jaywgZmxhZ3MpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHVuZXItdHlwZXMuaCBiL2luY2x1ZGUvbWVkaWEvdHVuZXItdHlwZXMuaAppbmRleCAzN2RhZDA3Li5lNWFkM2ZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3R1bmVyLXR5cGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS90dW5lci10eXBlcy5oCkBAIC01MCw2ICs1MCwxMCBAQAogCSAgIHNlbnNpdGl2aXR5LiBJZiB0aGlzIHNldHRpbmcgaXMgMSwgdGhlbiBzZXQgUE9SVDIgdG8gMSB0bwogCSAgIGdldCBwcm9wZXIgRk0gcmVjZXB0aW9uLiAqLwogCXVuc2lnbmVkIGludCBwb3J0Ml9mbV9oaWdoX3NlbnNpdGl2aXR5OjE7CisJLyogU29tZSBQaGlsaXBzIHR1bmVycyB1c2UgdGRhOTg4NyBjR2Fpbk5vcm1hbCB0byBzZWxlY3QgdGhlIEZNIHJhZGlvCisJICAgc2Vuc2l0aXZpdHkuIElmIHRoaXMgc2V0dGluZyBpcyAxLCBlIHJlZ2lzdGVyIHdpbGwgdXNlIGNHYWluTm9ybWFsCisJICAgaW5zdGVhZCBvZiBjR2Fpbkxvdy4gKi8KKwl1bnNpZ25lZCBpbnQgZm1fZ2Fpbl9ub3JtYWw6MTsKIAkvKiBNb3N0IHR1bmVycyB3aXRoIGEgdGRhOTg4NyB1c2UgUVNTIG1vZGUuIFNvbWUgKGNoZWFwZXIpIHR1bmVycwogCSAgIHVzZSBJbnRlcmNhcnJpZXIgbW9kZS4gSWYgdGhpcyBzZXR0aW5nIGlzIDEsIHRoZW4gdGhlIHR1bmVyCiAJICAgbmVlZHMgdG8gYmUgc2V0IHRvIGludGVyY2FycmllciBtb2RlLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS90dW5lci5oIGIvaW5jbHVkZS9tZWRpYS90dW5lci5oCmluZGV4IDMxMTZlNzUuLjk5YWNmODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKQEAgLTE0NSw2ICsxNDUsNyBAQAogI2RlZmluZSBUREE5ODg3X0RFRU1QSEFTSVNfNzUgCQkoMzw8MTYpCiAjZGVmaW5lIFREQTk4ODdfQVVUT01VVEUgCQkoMTw8MTgpCiAjZGVmaW5lIFREQTk4ODdfR0FUSU5HXzE4CQkoMTw8MTkpCisjZGVmaW5lIFREQTk4ODdfR0FJTl9OT1JNQUwJCSgxPDwyMCkKIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS90dmVlcHJvbS5oIGIvaW5jbHVkZS9tZWRpYS90dmVlcHJvbS5oCmluZGV4IGU5ZmMxYTcuLjU2NjBlYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdHZlZXByb20uaAorKysgYi9pbmNsdWRlL21lZGlhL3R2ZWVwcm9tLmgKQEAgLTMsNyArMyw3IEBACiAKIHN0cnVjdCB0dmVlcHJvbSB7CiAJdTMyIGhhc19yYWRpbzsKLQl1MzIgaGFzX2lyOyAgICAgLyogMDogbm8gSVIsIDE6IElSIHByZXNlbnQsIDI6IHVua25vd24gKi8KKwl1MzIgaGFzX2lyOyAgICAgLyogYml0IDA6IElSIHJlY2VpdmVyIHByZXNlbnQsIGJpdCAxOiBJUiB0cmFuc21pdHRlciAoYmxhc3RlcikgcHJlc2VudC4gLTEgPT0gdW5rbm93biAqLwogCXUzMiBoYXNfTUFDX2FkZHJlc3M7IC8qIDA6IG5vIE1BQywgMTogTUFDIHByZXNlbnQsIDI6IHVua25vd24gKi8KIAogCXUzMiB0dW5lcl90eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oCmluZGV4IGFlY2M5NDYuLjkxYjE5OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jb21tb24uaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmgKQEAgLTE0NCw2ICsxNDQsOSBAQAogCVY0TDJfSURFTlRfQ1gyNTg0MSA9IDI0MSwKIAlWNEwyX0lERU5UX0NYMjU4NDIgPSAyNDIsCiAJVjRMMl9JREVOVF9DWDI1ODQzID0gMjQzLAorCisJLyogT21uaVZpc2lvbiBzZW5zb3JzIC0gcmFuZ2UgMjUwLTI5OSAqLworCVY0TDJfSURFTlRfT1Y3NjcwID0gMjUwLAogfTsKIAogLyogYXVkaW8gaW9jdGxzICovCkBAIC0yNTEsNCArMjU0LDggQEAKICAgIElmIHRoZSBmcmVxdWVuY3kgaXMgbm90IHN1cHBvcnRlZCwgdGhlbiAtRUlOVkFMIGlzIHJldHVybmVkLiAqLwogI2RlZmluZSBWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVRIAlfSU9XICgnZCcsIDExMywgc3RydWN0IHY0bDJfY3J5c3RhbF9mcmVxKQogCisvKiBJbml0aWFsaXplIHRoZSBzZW5zb3IgcmVnaXN0b3JzIHRvIHNvbWUgc29ydCBvZiByZWFzb25hYmxlCisgICBkZWZhdWx0IHZhbHVlcy4gKi8KKyNkZWZpbmUgVklESU9DX0lOVF9JTklUCQkJX0lPVyAoJ2QnLCAxMTQsIHUzMikKKwogI2VuZGlmIC8qIFY0TDJfQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKaW5kZXggNmExMWQ3Ny4uZmI5NjQ3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaApAQCAtNDMsNiArNDMsNyBAQAogCiAvKiAgVmlkZW8gc3RhbmRhcmQgZnVuY3Rpb25zICAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCB2NGwyX3ZpZGVvX3N0ZF9mcHMoc3RydWN0IHY0bDJfc3RhbmRhcmQgKnZzKTsKK2V4dGVybiBjaGFyICp2NGwyX25vcm1fdG9fbmFtZSh2NGwyX3N0ZF9pZCBpZCk7CiBleHRlcm4gaW50IHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdChzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqdnMsCiAJCQkJICAgIGludCBpZCwgY2hhciAqbmFtZSk7CiAKQEAgLTgxLDEyICs4Miw2IEBACiAgKiAJVGhpcyB2ZXJzaW9uIG1vdmVzIHJlZHVuZGFudCBjb2RlIGZyb20gdmlkZW8gZGV2aWNlIGNvZGUgdG8KICAqCXRoZSBjb21tb24gaGFuZGxlcgogICovCi1zdHJ1Y3QgdjRsMl90dm5vcm0gewotCWNoYXIgICAgICAgICAgKm5hbWU7Ci0JdjRsMl9zdGRfaWQgICBpZDsKLQotCXZvaWQgICAgICAgICAgKnByaXZfZGF0YTsKLX07CiAKIHN0cnVjdCB2aWRlb19kZXZpY2UKIHsKQEAgLTEwNCw5ICs5OSw4IEBACiAJaW50IGRlYnVnOwkvKiBBY3RpdmF0ZXMgZGVidWcgbGV2ZWwqLwogCiAJLyogVmlkZW8gc3RhbmRhcmQgdmFycyAqLwotCWludCB0dm5vcm1zaXplOwkvKiBTaXplIG9mIHR2bm9ybSBhcnJheSAqLwotCXY0bDJfc3RkX2lkIGN1cnJlbnRfbm9ybTsgLyogQ3VycmVudCB0dm5vcm0gKi8KLQlzdHJ1Y3QgdjRsMl90dm5vcm0gKnR2bm9ybXM7CisJdjRsMl9zdGRfaWQgdHZub3JtczsJCS8qIFN1cHBvcnRlZCB0diBub3JtcyAqLworCXY0bDJfc3RkX2lkIGN1cnJlbnRfbm9ybTsJLyogQ3VycmVudCB0dm5vcm0gKi8KIAogCS8qIGNhbGxiYWNrcyAqLwogCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQpOwpAQCAtMjExLDcgKzIwNSw3IEBACiAJCS8qIFN0YW5kYXJkIGhhbmRsaW5nCiAJCQlHX1NURCBhbmQgRU5VTVNURCBhcmUgaGFuZGxlZCBieSB2aWRlb2Rldi5jCiAJCSAqLwotCWludCAoKnZpZGlvY19zX3N0ZCkgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdjRsMl9zdGRfaWQgYSk7CisJaW50ICgqdmlkaW9jX3Nfc3RkKSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCAqbm9ybSk7CiAJaW50ICgqdmlkaW9jX3F1ZXJ5c3RkKSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCAqYSk7CiAKIAkJLyogSW5wdXQgaGFuZGxpbmcgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FkZHJjb25mLmggYi9pbmNsdWRlL25ldC9hZGRyY29uZi5oCmluZGV4IDQ0ZjFiNjcuLjg4ZGY4ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKKysrIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaApAQCAtMzUsOSArMzUsOSBAQAogI2Vsc2UKICNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKICNlbmRpZgotCV9fdTMyCQkJdmFsaWQ7Ci0JX191MzIJCQlwcmVmZXJlZDsKLQlfX3UzMgkJCXJlc2VydmVkMjsKKwlfX2JlMzIJCQl2YWxpZDsKKwlfX2JlMzIJCQlwcmVmZXJlZDsKKwlfX2JlMzIJCQlyZXNlcnZlZDI7CiAKIAlzdHJ1Y3QgaW42X2FkZHIJCXByZWZpeDsKIH07CkBAIC0xODMsNyArMTgzLDcgQEAKIAkgKiBUaGlzIHdpbGwgaW5jbHVkZSB0aGUgSUVFRSBhZGRyZXNzIHRva2VuIG9uIGxpbmtzIHRoYXQgc3VwcG9ydCBpdC4KIAkgKi8KIAotCXdvcmQgPSBhZGRyLT5zNl9hZGRyMzJbMl0gXiBhZGRyLT5zNl9hZGRyMzJbM107CisJd29yZCA9IChfX2ZvcmNlIHUzMikoYWRkci0+czZfYWRkcjMyWzJdIF4gYWRkci0+czZfYWRkcjMyWzNdKTsKIAl3b3JkIF49ICh3b3JkID4+IDE2KTsKIAl3b3JkIF49ICh3b3JkID4+IDgpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hcnAuaCBiL2luY2x1ZGUvbmV0L2FycC5oCmluZGV4IDZhM2Q5YTcuLmYwMjY2NDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FycC5oCisrKyBiL2luY2x1ZGUvbmV0L2FycC5oCkBAIC0xNiw3ICsxNiw3IEBACiAJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTMyIHNyY19pcCwKIAkJCSB1bnNpZ25lZCBjaGFyICpkZXN0X2h3LCB1bnNpZ25lZCBjaGFyICpzcmNfaHcsIHVuc2lnbmVkIGNoYXIgKnRoKTsKIGV4dGVybiBpbnQJYXJwX2JpbmRfbmVpZ2hib3VyKHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7Ci1leHRlcm4gaW50CWFycF9tY19tYXAodTMyIGFkZHIsIHU4ICpoYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGRpcik7CitleHRlcm4gaW50CWFycF9tY19tYXAoX19iZTMyIGFkZHIsIHU4ICpoYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGRpcik7CiBleHRlcm4gdm9pZAlhcnBfaWZkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmFycF9jcmVhdGUoaW50IHR5cGUsIGludCBwdHlwZSwgX19iZTMyIGRlc3RfaXAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hdG1jbGlwLmggYi9pbmNsdWRlL25ldC9hdG1jbGlwLmgKaW5kZXggOTBmY2M5OC4uYjVhNTFhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYXRtY2xpcC5oCisrKyBiL2luY2x1ZGUvbmV0L2F0bWNsaXAuaApAQCAtMzYsNyArMzYsNyBAQAogCiAKIHN0cnVjdCBhdG1hcnBfZW50cnkgewotCXUzMgkJaXA7CQkvKiBJUCBhZGRyZXNzICovCisJX19iZTMyCQlpcDsJCS8qIElQIGFkZHJlc3MgKi8KIAlzdHJ1Y3QgY2xpcF92Y2MJKnZjY3M7CQkvKiBhY3RpdmUgVkNDczsgTlVMTCBpZiByZXNvbHV0aW9uIGlzCiAJCQkJCSAgIHBlbmRpbmcgKi8KIAl1bnNpZ25lZCBsb25nCWV4cGlyZXM7CS8qIGVudHJ5IGV4cGlyYXRpb24gdGltZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYXgyNS5oIGIvaW5jbHVkZS9uZXQvYXgyNS5oCmluZGV4IDY5Mzc0Y2QuLjE0YjcyZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2F4MjUuaAorKysgYi9pbmNsdWRlL25ldC9heDI1LmgKQEAgLTI4MiwxNSArMjgyLDE5IEBACiBleHRlcm4gc3RydWN0IHNvY2sgKmF4MjVfbWFrZV9uZXcoc3RydWN0IHNvY2sgKiwgc3RydWN0IGF4MjVfZGV2ICopOwogCiAvKiBheDI1X2FkZHIuYyAqLwotZXh0ZXJuIGF4MjVfYWRkcmVzcyBudWxsX2F4MjVfYWRkcmVzczsKLWV4dGVybiBjaGFyICpheDJhc2MoY2hhciAqYnVmLCBheDI1X2FkZHJlc3MgKik7Ci1leHRlcm4gdm9pZCBhc2MyYXgoYXgyNV9hZGRyZXNzICphZGRyLCBjaGFyICpjYWxsc2lnbik7Ci1leHRlcm4gaW50ICBheDI1Y21wKGF4MjVfYWRkcmVzcyAqLCBheDI1X2FkZHJlc3MgKik7Ci1leHRlcm4gaW50ICBheDI1ZGlnaWNtcChheDI1X2RpZ2kgKiwgYXgyNV9kaWdpICopOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmF4MjVfYWRkcl9wYXJzZSh1bnNpZ25lZCBjaGFyICosIGludCwgYXgyNV9hZGRyZXNzICosIGF4MjVfYWRkcmVzcyAqLCBheDI1X2RpZ2kgKiwgaW50ICosIGludCAqKTsKLWV4dGVybiBpbnQgIGF4MjVfYWRkcl9idWlsZCh1bnNpZ25lZCBjaGFyICosIGF4MjVfYWRkcmVzcyAqLCBheDI1X2FkZHJlc3MgKiwgYXgyNV9kaWdpICosIGludCwgaW50KTsKLWV4dGVybiBpbnQgIGF4MjVfYWRkcl9zaXplKGF4MjVfZGlnaSAqKTsKLWV4dGVybiB2b2lkIGF4MjVfZGlnaV9pbnZlcnQoYXgyNV9kaWdpICosIGF4MjVfZGlnaSAqKTsKK2V4dGVybiBjb25zdCBheDI1X2FkZHJlc3MgYXgyNV9iY2FzdDsKK2V4dGVybiBjb25zdCBheDI1X2FkZHJlc3MgYXgyNV9kZWZhZGRyOworZXh0ZXJuIGNvbnN0IGF4MjVfYWRkcmVzcyBudWxsX2F4MjVfYWRkcmVzczsKK2V4dGVybiBjaGFyICpheDJhc2MoY2hhciAqYnVmLCBjb25zdCBheDI1X2FkZHJlc3MgKik7CitleHRlcm4gdm9pZCBhc2MyYXgoYXgyNV9hZGRyZXNzICphZGRyLCBjb25zdCBjaGFyICpjYWxsc2lnbik7CitleHRlcm4gaW50IGF4MjVjbXAoY29uc3QgYXgyNV9hZGRyZXNzICosIGNvbnN0IGF4MjVfYWRkcmVzcyAqKTsKK2V4dGVybiBpbnQgYXgyNWRpZ2ljbXAoY29uc3QgYXgyNV9kaWdpICosIGNvbnN0IGF4MjVfZGlnaSAqKTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyICpheDI1X2FkZHJfcGFyc2UoY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQsCisJYXgyNV9hZGRyZXNzICosIGF4MjVfYWRkcmVzcyAqLCBheDI1X2RpZ2kgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiBpbnQgIGF4MjVfYWRkcl9idWlsZCh1bnNpZ25lZCBjaGFyICosIGNvbnN0IGF4MjVfYWRkcmVzcyAqLAorCWNvbnN0IGF4MjVfYWRkcmVzcyAqLCBjb25zdCBheDI1X2RpZ2kgKiwgaW50LCBpbnQpOworZXh0ZXJuIGludCAgYXgyNV9hZGRyX3NpemUoY29uc3QgYXgyNV9kaWdpICopOworZXh0ZXJuIHZvaWQgYXgyNV9kaWdpX2ludmVydChjb25zdCBheDI1X2RpZ2kgKiwgYXgyNV9kaWdpICopOwogCiAvKiBheDI1X2Rldi5jICovCiBleHRlcm4gYXgyNV9kZXYgKmF4MjVfZGV2X2xpc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKaW5kZXggMTBhM2VlYy4uNDE0NTZjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaApAQCAtNzM5LDEzICs3MzksMTMgQEAKIHN0cnVjdCBoY2lfZmlsdGVyIHsKIAl1bnNpZ25lZCBsb25nIHR5cGVfbWFzazsKIAl1bnNpZ25lZCBsb25nIGV2ZW50X21hc2tbMl07Ci0JX191MTYgICBvcGNvZGU7CisJX19sZTE2ICAgb3Bjb2RlOwogfTsKIAogc3RydWN0IGhjaV91ZmlsdGVyIHsKIAlfX3UzMiAgIHR5cGVfbWFzazsKIAlfX3UzMiAgIGV2ZW50X21hc2tbMl07Ci0JX191MTYgICBvcGNvZGU7CisJX19sZTE2ICAgb3Bjb2RlOwogfTsKIAogI2RlZmluZSBIQ0lfRkxUX1RZUEVfQklUUwkzMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAppbmRleCBkZjIyZWZjLi5jMGZjMzk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaApAQCAtMTUzLDYgKzE1Myw3IEBACiAJX191OCAgICAgICAgICAgICBtb2RlOwogCV9fdTgJCSB0eXBlOwogCV9fdTgJCSBvdXQ7CisJX191OAkJIGF0dGVtcHQ7CiAJX191OAkJIGRldl9jbGFzc1szXTsKIAlfX3U4ICAgICAgICAgICAgIGZlYXR1cmVzWzhdOwogCV9fdTE2ICAgICAgICAgICAgaW50ZXJ2YWw7CkBAIC0yODksNiArMjkwLDIyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhjaV9jb25uICpoY2lfY29ubl9oYXNoX2xvb2t1cF9zdGF0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJX191OCB0eXBlLCBfX3UxNiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm5faGFzaCAqaCA9ICZoZGV2LT5jb25uX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGNpX2Nvbm4gICpjOworCisJbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgeworCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOworCQlpZiAoYy0+dHlwZSA9PSB0eXBlICYmIGMtPnN0YXRlID09IHN0YXRlKQorCQkJcmV0dXJuIGM7CisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkIGhjaV9hY2xfY29ubmVjdChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwogdm9pZCBoY2lfYWNsX2Rpc2Nvbm4oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHJlYXNvbik7CiB2b2lkIGhjaV9hZGRfc2NvKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191MTYgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3JmY29tbS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3JmY29tbS5oCmluZGV4IDg5ZDc0M2MuLjNjNTYzZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9yZmNvbW0uaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvcmZjb21tLmgKQEAgLTEyNCw3ICsxMjQsNyBAQAogCXU4ICBmbG93X2N0cmw7CiAJdTggIHByaW9yaXR5OwogCXU4ICBhY2tfdGltZXI7Ci0JdTE2IG10dTsKKwlfX2xlMTYgbXR1OwogCXU4ICBtYXhfcmV0cmFuczsKIAl1OCAgY3JlZGl0czsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJdTggIGZsb3dfY3RybDsKIAl1OCAgeG9uX2NoYXI7CiAJdTggIHhvZmZfY2hhcjsKLQl1MTYgcGFyYW1fbWFzazsKKwlfX2xlMTYgcGFyYW1fbWFzazsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcmZjb21tX3JscyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jaGVja3N1bS5oIGIvaW5jbHVkZS9uZXQvY2hlY2tzdW0uaAppbmRleCBlM2VhN2NjLi4xMjQyNDYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvbmV0L2NoZWNrc3VtLmgKQEAgLTI3LDggKzI3LDggQEAKIAogI2lmbmRlZiBfSEFWRV9BUkNIX0NPUFlfQU5EX0NTVU1fRlJPTV9VU0VSCiBzdGF0aWMgaW5saW5lCi11bnNpZ25lZCBpbnQgY3N1bV9hbmRfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLQkJCQkgICAgICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitfX3dzdW0gY3N1bV9hbmRfY29weV9mcm9tX3VzZXIgKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkgICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCBsZW4pKQogCQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKHNyYywgZHN0LCBsZW4sIHN1bSwgZXJyX3B0cik7CkBAIC00MSw4ICs0MSw4IEBACiAjZW5kaWYKIAogI2lmbmRlZiBIQVZFX0NTVU1fQ09QWV9VU0VSCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgY3N1bV9hbmRfY29weV90b191c2VyCi0oY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyCisoY29uc3Qgdm9pZCAqc3JjLCB2b2lkIF9fdXNlciAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCiB7CiAJc3VtID0gY3N1bV9wYXJ0aWFsKHNyYywgbGVuLCBzdW0pOwogCkBAIC01MywzNSArNTMsNDQgQEAKIAlpZiAobGVuKQogCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CiAKLQlyZXR1cm4gLTE7IC8qIGludmFsaWQgY2hlY2tzdW0gKi8KKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9hZGQodW5zaWduZWQgaW50IGNzdW0sIHVuc2lnbmVkIGludCBhZGRlbmQpCitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX2FkZChfX3dzdW0gY3N1bSwgX193c3VtIGFkZGVuZCkKIHsKLQljc3VtICs9IGFkZGVuZDsKLQlyZXR1cm4gY3N1bSArIChjc3VtIDwgYWRkZW5kKTsKKwl1MzIgcmVzID0gKF9fZm9yY2UgdTMyKWNzdW07CisJcmVzICs9IChfX2ZvcmNlIHUzMilhZGRlbmQ7CisJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSkocmVzICsgKHJlcyA8IChfX2ZvcmNlIHUzMilhZGRlbmQpKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3N1bV9zdWIodW5zaWduZWQgaW50IGNzdW0sIHVuc2lnbmVkIGludCBhZGRlbmQpCitzdGF0aWMgaW5saW5lIF9fd3N1bSBjc3VtX3N1YihfX3dzdW0gY3N1bSwgX193c3VtIGFkZGVuZCkKIHsKIAlyZXR1cm4gY3N1bV9hZGQoY3N1bSwgfmFkZGVuZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jc3VtX2Jsb2NrX2FkZCh1bnNpZ25lZCBpbnQgY3N1bSwgdW5zaWduZWQgaW50IGNzdW0yLCBpbnQgb2Zmc2V0KQorc3RhdGljIGlubGluZSBfX3dzdW0KK2NzdW1fYmxvY2tfYWRkKF9fd3N1bSBjc3VtLCBfX3dzdW0gY3N1bTIsIGludCBvZmZzZXQpCiB7CisJdTMyIHN1bSA9IChfX2ZvcmNlIHUzMiljc3VtMjsKIAlpZiAob2Zmc2V0JjEpCi0JCWNzdW0yID0gKChjc3VtMiYweEZGMDBGRik8PDgpKygoY3N1bTI+PjgpJjB4RkYwMEZGKTsKLQlyZXR1cm4gY3N1bV9hZGQoY3N1bSwgY3N1bTIpOworCQlzdW0gPSAoKHN1bSYweEZGMDBGRik8PDgpKygoc3VtPj44KSYweEZGMDBGRik7CisJcmV0dXJuIGNzdW1fYWRkKGNzdW0sIChfX2ZvcmNlIF9fd3N1bSlzdW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotY3N1bV9ibG9ja19zdWIodW5zaWduZWQgaW50IGNzdW0sIHVuc2lnbmVkIGludCBjc3VtMiwgaW50IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgX193c3VtCitjc3VtX2Jsb2NrX3N1YihfX3dzdW0gY3N1bSwgX193c3VtIGNzdW0yLCBpbnQgb2Zmc2V0KQogeworCXUzMiBzdW0gPSAoX19mb3JjZSB1MzIpY3N1bTI7CiAJaWYgKG9mZnNldCYxKQotCQljc3VtMiA9ICgoY3N1bTImMHhGRjAwRkYpPDw4KSsoKGNzdW0yPj44KSYweEZGMDBGRik7Ci0JcmV0dXJuIGNzdW1fc3ViKGNzdW0sIGNzdW0yKTsKKwkJc3VtID0gKChzdW0mMHhGRjAwRkYpPDw4KSsoKHN1bT4+OCkmMHhGRjAwRkYpOworCXJldHVybiBjc3VtX3N1Yihjc3VtLCAoX19mb3JjZSBfX3dzdW0pc3VtKTsKIH0KIAorc3RhdGljIGlubGluZSBfX3dzdW0gY3N1bV91bmZvbGQoX19zdW0xNiBuKQoreworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pbjsKK30KKworI2RlZmluZSBDU1VNX01BTkdMRURfMCAoKF9fZm9yY2UgX19zdW0xNikweGZmZmYpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaCBiL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaAppbmRleCA3MThiNGQ5Li40Yzk1MjJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKKysrIGIvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCkBAIC01OCwxMCArNTgsMTAgQEAKICNkZWZpbmUgQ0lQU09fVjRfTUFQX1BBU1MgICAgICAgICAgICAgMgogCiAvKiBsaW1pdHMgKi8KLSNkZWZpbmUgQ0lQU09fVjRfTUFYX1JFTV9MVkxTICAgICAgICAgMjU2CisjZGVmaW5lIENJUFNPX1Y0X01BWF9SRU1fTFZMUyAgICAgICAgIDI1NQogI2RlZmluZSBDSVBTT19WNF9JTlZfTFZMICAgICAgICAgICAgICAweDgwMDAwMDAwCiAjZGVmaW5lIENJUFNPX1Y0X01BWF9MT0NfTFZMUyAgICAgICAgIChDSVBTT19WNF9JTlZfTFZMIC0gMSkKLSNkZWZpbmUgQ0lQU09fVjRfTUFYX1JFTV9DQVRTICAgICAgICAgNjU1MzYKKyNkZWZpbmUgQ0lQU09fVjRfTUFYX1JFTV9DQVRTICAgICAgICAgNjU1MzQKICNkZWZpbmUgQ0lQU09fVjRfSU5WX0NBVCAgICAgICAgICAgICAgMHg4MDAwMDAwMAogI2RlZmluZSBDSVBTT19WNF9NQVhfTE9DX0NBVFMgICAgICAgICAoQ0lQU09fVjRfSU5WX0NBVCAtIDEpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RuLmggYi9pbmNsdWRlL25ldC9kbi5oCmluZGV4IDQ2NWI3ODMuLmFjNGNlOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RuLmgKKysrIGIvaW5jbHVkZS9uZXQvZG4uaApAQCAtMTk5LDExICsxOTksNiBAQAogewogCWZsLT51bGlfdS5kbnBvcnRzLnNwb3J0ID0gc2NwLT5hZGRybG9jOwogCWZsLT51bGlfdS5kbnBvcnRzLmRwb3J0ID0gc2NwLT5hZGRycmVtOwotCWZsLT51bGlfdS5kbnBvcnRzLm9iam51bSA9IHNjcC0+YWRkci5zZG5fb2JqbnVtOwotCWlmIChmbC0+dWxpX3UuZG5wb3J0cy5vYmpudW0gPT0gMCkgewotCQlmbC0+dWxpX3UuZG5wb3J0cy5vYmpuYW1lbCA9IChfX3U4KWRuX250b2hzKHNjcC0+YWRkci5zZG5fb2JqbmFtZWwpOwotCQltZW1jcHkoZmwtPnVsaV91LmRucG9ydHMub2JqbmFtZSwgc2NwLT5hZGRyLnNkbl9vYmpuYW1lLCAxNik7Ci0JfQogfQogCiBleHRlcm4gdW5zaWduZWQgZG5fbXNzX2Zyb21fcG10dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzZmllbGQuaCBiL2luY2x1ZGUvbmV0L2RzZmllbGQuaAppbmRleCBhNzljOWUwLi5lYjY1YmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kc2ZpZWxkLmgKKysrIGIvaW5jbHVkZS9uZXQvZHNmaWVsZC5oCkBAIC0yMCwxNCArMjAsMTQgQEAKIAogc3RhdGljIGlubGluZSBfX3U4IGlwdjZfZ2V0X2RzZmllbGQoc3RydWN0IGlwdjZoZHIgKmlwdjZoKQogewotCXJldHVybiBudG9ocygqKF9fdTE2ICopIGlwdjZoKSA+PiA0OworCXJldHVybiBudG9ocygqKF9fYmUxNiAqKSBpcHY2aCkgPj4gNDsKIH0KIAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXB2NF9jaGFuZ2VfZHNmaWVsZChzdHJ1Y3QgaXBoZHIgKmlwaCxfX3U4IG1hc2ssCiAgICAgX191OCB2YWx1ZSkKIHsKLSAgICAgICAgX191MzIgY2hlY2sgPSBudG9ocyhpcGgtPmNoZWNrKTsKKyAgICAgICAgX191MzIgY2hlY2sgPSBudG9ocygoX19mb3JjZSBfX2JlMTYpaXBoLT5jaGVjayk7CiAJX191OCBkc2ZpZWxkOwogCiAJZHNmaWVsZCA9IChpcGgtPnRvcyAmIG1hc2spIHwgdmFsdWU7CkBAIC0zNSw3ICszNSw3IEBACiAJaWYgKChjaGVjaysxKSA+PiAxNikgY2hlY2sgPSAoY2hlY2srMSkgJiAweGZmZmY7CiAJY2hlY2sgLT0gZHNmaWVsZDsKIAljaGVjayArPSBjaGVjayA+PiAxNjsgLyogYWRqdXN0IGNhcnJ5ICovCi0JaXBoLT5jaGVjayA9IGh0b25zKGNoZWNrKTsKKwlpcGgtPmNoZWNrID0gKF9fZm9yY2UgX19zdW0xNilodG9ucyhjaGVjayk7CiAJaXBoLT50b3MgPSBkc2ZpZWxkOwogfQogCkBAIC00NSw5ICs0NSw5IEBACiB7CiAgICAgICAgIF9fdTE2IHRtcDsKIAotCXRtcCA9IG50b2hzKCooX191MTYgKikgaXB2NmgpOworCXRtcCA9IG50b2hzKCooX19iZTE2ICopIGlwdjZoKTsKIAl0bXAgPSAodG1wICYgKChtYXNrIDw8IDQpIHwgMHhmMDBmKSkgfCAodmFsdWUgPDwgNCk7Ci0JKihfX3UxNiAqKSBpcHY2aCA9IGh0b25zKHRtcCk7CisJKihfX2JlMTYgKikgaXB2NmggPSBodG9ucyh0bXApOwogfQogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzdC5oIGIvaW5jbHVkZS9uZXQvZHN0LmgKaW5kZXggZTE1NmUzOC4uNjJiN2U3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHN0LmgKKysrIGIvaW5jbHVkZS9uZXQvZHN0LmgKQEAgLTk4LDcgKzk4LDcgQEAKIAlpbnQJCQllbnRyeV9zaXplOwogCiAJYXRvbWljX3QJCWVudHJpZXM7Ci0Ja21lbV9jYWNoZV90IAkJKmttZW1fY2FjaGVwOworCXN0cnVjdCBrbWVtX2NhY2hlIAkJKmttZW1fY2FjaGVwOwogfTsKIAogI2lmZGVmIF9fS0VSTkVMX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oIGIvaW5jbHVkZS9uZXQvZmliX3J1bGVzLmgKaW5kZXggOGUyZjQ3My4uYmMzYzI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZmliX3J1bGVzLmgKKysrIGIvaW5jbHVkZS9uZXQvZmliX3J1bGVzLmgKQEAgLTEzLDYgKzEzLDggQEAKIAlhdG9taWNfdAkJcmVmY250OwogCWludAkJCWlmaW5kZXg7CiAJY2hhcgkJCWlmbmFtZVtJRk5BTVNJWl07CisJdTMyCQkJbWFyazsKKwl1MzIJCQltYXJrX21hc2s7CiAJdTMyCQkJcHJlZjsKIAl1MzIJCQlmbGFnczsKIAl1MzIJCQl0YWJsZTsKQEAgLTUwLDYgKzUyLDcgQEAKIAkJCQkJc3RydWN0IG5sbXNnaGRyICosCiAJCQkJCXN0cnVjdCBmaWJfcnVsZV9oZHIgKik7CiAJdTMyCQkJKCpkZWZhdWx0X3ByZWYpKHZvaWQpOworCXNpemVfdAkJCSgqbmxtc2dfcGF5bG9hZCkoc3RydWN0IGZpYl9ydWxlICopOwogCiAJaW50CQkJbmxncm91cDsKIAlzdHJ1Y3QgbmxhX3BvbGljeQkqcG9saWN5OwpAQCAtNTcsNiArNjAsMTMgQEAKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiB9OwogCisjZGVmaW5lIEZSQV9HRU5FUklDX1BPTElDWSBcCisJW0ZSQV9JRk5BTUVdCT0geyAudHlwZSA9IE5MQV9TVFJJTkcsIC5sZW4gPSBJRk5BTVNJWiAtIDEgfSwgXAorCVtGUkFfUFJJT1JJVFldCT0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAorCVtGUkFfRldNQVJLXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sIFwKKwlbRlJBX0ZXTUFTS10JPSB7IC50eXBlID0gTkxBX1UzMiB9LCBcCisJW0ZSQV9UQUJMRV0gICAgID0geyAudHlwZSA9IE5MQV9VMzIgfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZmliX3J1bGVfZ2V0KHN0cnVjdCBmaWJfcnVsZSAqcnVsZSkKIHsKIAlhdG9taWNfaW5jKCZydWxlLT5yZWZjbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZmxvdy5oIGIvaW5jbHVkZS9uZXQvZmxvdy5oCmluZGV4IDNiNDRkNzIuLmNlNGIxMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2Zsb3cuaAorKysgYi9pbmNsdWRlL25ldC9mbG93LmgKQEAgLTEzLDEyICsxMywxMiBAQAogc3RydWN0IGZsb3dpIHsKIAlpbnQJb2lmOwogCWludAlpaWY7CisJX191MzIJbWFyazsKIAogCXVuaW9uIHsKIAkJc3RydWN0IHsKIAkJCV9fYmUzMgkJCWRhZGRyOwogCQkJX19iZTMyCQkJc2FkZHI7Ci0JCQlfX3UzMgkJCWZ3bWFyazsKIAkJCV9fdTgJCQl0b3M7CiAJCQlfX3U4CQkJc2NvcGU7CiAJCX0gaXA0X3U7CkBAIC0yNiwyOCArMjYsMjMgQEAKIAkJc3RydWN0IHsKIAkJCXN0cnVjdCBpbjZfYWRkcgkJZGFkZHI7CiAJCQlzdHJ1Y3QgaW42X2FkZHIJCXNhZGRyOwotCQkJX191MzIJCQlmd21hcms7Ci0JCQlfX3UzMgkJCWZsb3dsYWJlbDsKKwkJCV9fYmUzMgkJCWZsb3dsYWJlbDsKIAkJfSBpcDZfdTsKIAogCQlzdHJ1Y3QgewogCQkJX19sZTE2CQkJZGFkZHI7CiAJCQlfX2xlMTYJCQlzYWRkcjsKLQkJCV9fdTMyCQkJZndtYXJrOwogCQkJX191OAkJCXNjb3BlOwogCQl9IGRuX3U7CiAJfSBubF91OwogI2RlZmluZSBmbGRfZHN0CQlubF91LmRuX3UuZGFkZHIKICNkZWZpbmUgZmxkX3NyYwkJbmxfdS5kbl91LnNhZGRyCi0jZGVmaW5lIGZsZF9md21hcmsJbmxfdS5kbl91LmZ3bWFyawogI2RlZmluZSBmbGRfc2NvcGUJbmxfdS5kbl91LnNjb3BlCiAjZGVmaW5lIGZsNl9kc3QJCW5sX3UuaXA2X3UuZGFkZHIKICNkZWZpbmUgZmw2X3NyYwkJbmxfdS5pcDZfdS5zYWRkcgotI2RlZmluZSBmbDZfZndtYXJrCW5sX3UuaXA2X3UuZndtYXJrCiAjZGVmaW5lIGZsNl9mbG93bGFiZWwJbmxfdS5pcDZfdS5mbG93bGFiZWwKICNkZWZpbmUgZmw0X2RzdAkJbmxfdS5pcDRfdS5kYWRkcgogI2RlZmluZSBmbDRfc3JjCQlubF91LmlwNF91LnNhZGRyCi0jZGVmaW5lIGZsNF9md21hcmsJbmxfdS5pcDRfdS5md21hcmsKICNkZWZpbmUgZmw0X3RvcwkJbmxfdS5pcDRfdS50b3MKICNkZWZpbmUgZmw0X3Njb3BlCW5sX3UuaXA0X3Uuc2NvcGUKIApAQCAtNjgsOSArNjMsNiBAQAogCQlzdHJ1Y3QgewogCQkJX19sZTE2CXNwb3J0OwogCQkJX19sZTE2CWRwb3J0OwotCQkJX191OAlvYmpudW07Ci0JCQlfX3U4CW9iam5hbWVsOyAvKiBOb3QgMTYgYml0cyBzaW5jZSBtYXggdmFsIGlzIDE2ICovCi0JCQlfX3U4CW9iam5hbWVbMTZdOyAvKiBOb3QgemVybyB0ZXJtaW5hdGVkICovCiAJCX0gZG5wb3J0czsKIAogCQlfX2JlMzIJCXNwaTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKaW5kZXggYjYxOTMxNC4uYWRmZjRjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKQEAgLTUzLDYgKzUzLDcgQEAKICAqIEBwb2xpY3k6IGF0dHJpYnV0ZSB2YWxpZGF0aW9uIHBvbGljeQogICogQGRvaXQ6IHN0YW5kYXJkIGNvbW1hbmQgY2FsbGJhY2sKICAqIEBkdW1waXQ6IGNhbGxiYWNrIGZvciBkdW1wZXJzCisgKiBAZG9uZTogY29tcGxldGlvbiBjYWxsYmFjayBmb3IgZHVtcHMKICAqIEBvcHNfbGlzdDogb3BlcmF0aW9ucyBsaXN0CiAgKi8KIHN0cnVjdCBnZW5sX29wcwpAQCAtNjQsNiArNjUsNyBAQAogCQkJCSAgICAgICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAlpbnQJCSAgICAgICAoKmR1bXBpdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CisJaW50CQkgICAgICAgKCpkb25lKShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogCXN0cnVjdCBsaXN0X2hlYWQJb3BzX2xpc3Q7CiB9OwogCkBAIC03OSwzNCArODEsNTEgQEAKICAqIEBza2I6IHNvY2tldCBidWZmZXIgaG9sZGluZyB0aGUgbWVzc2FnZQogICogQHBpZDogbmV0bGluayBwaWQgdGhlIG1lc3NhZ2UgaXMgYWRkcmVzc2VkIHRvCiAgKiBAc2VxOiBzZXF1ZW5jZSBudW1iZXIgKHVzdWFsbHkgdGhlIG9uZSBvZiB0aGUgc2VuZGVyKQotICogQHR5cGU6IG5ldGxpbmsgbWVzc2FnZSB0eXBlCi0gKiBAaGRybGVuOiBsZW5ndGggb2YgdGhlIHVzZXIgc3BlY2lmaWMgaGVhZGVyCisgKiBAZmFtaWx5OiBnZW5lcmljIG5ldGxpbmsgZmFtaWx5CiAgKiBAZmxhZ3MgbmV0bGluayBtZXNzYWdlIGZsYWdzCiAgKiBAY21kOiBnZW5lcmljIG5ldGxpbmsgY29tbWFuZAotICogQHZlcnNpb246IHZlcnNpb24KICAqCiAgKiBSZXR1cm5zIHBvaW50ZXIgdG8gdXNlciBzcGVjaWZpYyBoZWFkZXIKICAqLwogc3RhdGljIGlubGluZSB2b2lkICpnZW5sbXNnX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLAotCQkJCWludCB0eXBlLCBpbnQgaGRybGVuLCBpbnQgZmxhZ3MsCi0JCQkJdTggY21kLCB1OCB2ZXJzaW9uKQorCQkJCXN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5LCBpbnQgZmxhZ3MsIHU4IGNtZCkKIHsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgZ2VubG1zZ2hkciAqaGRyOwogCi0JbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIHR5cGUsIEdFTkxfSERSTEVOICsgaGRybGVuLCBmbGFncyk7CisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGZhbWlseS0+aWQsIEdFTkxfSERSTEVOICsKKwkJCWZhbWlseS0+aGRyc2l6ZSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAloZHIgPSBubG1zZ19kYXRhKG5saCk7CiAJaGRyLT5jbWQgPSBjbWQ7Ci0JaGRyLT52ZXJzaW9uID0gdmVyc2lvbjsKKwloZHItPnZlcnNpb24gPSBmYW1pbHktPnZlcnNpb247CiAJaGRyLT5yZXNlcnZlZCA9IDA7CiAKIAlyZXR1cm4gKGNoYXIgKikgaGRyICsgR0VOTF9IRFJMRU47CiB9CiAKIC8qKgorICogZ2VubG1zZ19wdXRfcmVwbHkgLSBBZGQgZ2VuZXJpYyBuZXRsaW5rIGhlYWRlciB0byBhIHJlcGx5IG1lc3NhZ2UKKyAqIEBza2I6IHNvY2tldCBidWZmZXIgaG9sZGluZyB0aGUgbWVzc2FnZQorICogQGluZm86IHJlY2VpdmVyIGluZm8KKyAqIEBmYW1pbHk6IGdlbmVyaWMgbmV0bGluayBmYW1pbHkKKyAqIEBmbGFnczogbmV0bGluayBtZXNzYWdlIGZsYWdzCisgKiBAY21kOiBnZW5lcmljIG5ldGxpbmsgY29tbWFuZAorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byB1c2VyIHNwZWNpZmljIGhlYWRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmdlbmxtc2dfcHV0X3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbywKKwkJCQkgICAgICBzdHJ1Y3QgZ2VubF9mYW1pbHkgKmZhbWlseSwKKwkJCQkgICAgICBpbnQgZmxhZ3MsIHU4IGNtZCkKK3sKKwlyZXR1cm4gZ2VubG1zZ19wdXQoc2tiLCBpbmZvLT5zbmRfcGlkLCBpbmZvLT5zbmRfc2VxLCBmYW1pbHksCisJCQkgICBmbGFncywgY21kKTsKK30KKworLyoqCiAgKiBnZW5sbXNnX2VuZCAtIEZpbmFsaXplIGEgZ2VuZXJpYyBuZXRsaW5rIG1lc3NhZ2UKICAqIEBza2I6IHNvY2tldCBidWZmZXIgdGhlIG1lc3NhZ2UgaXMgc3RvcmVkIGluCiAgKiBAaGRyOiB1c2VyIHNwZWNpZmljIGhlYWRlcgpAQCAtMTUwLDYgKzE2OSwxNiBAQAogfQogCiAvKioKKyAqIGdlbmxtc2dfcmVwbHkgLSByZXBseSB0byBhIHJlcXVlc3QKKyAqIEBza2I6IG5ldGxpbmsgbWVzc2FnZSB0byBiZSBzZW50IGJhY2sKKyAqIEBpbmZvOiByZWNlaXZlciBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgaW5saW5lIGludCBnZW5sbXNnX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJcmV0dXJuIGdlbmxtc2dfdW5pY2FzdChza2IsIGluZm8tPnNuZF9waWQpOworfQorCisvKioKICAqIGdlbm5sbXNnX2RhdGEgLSBoZWFkIG9mIG1lc3NhZ2UgcGF5bG9hZAogICogQGdubGg6IGdlbmV0bGluayBtZXNzc2FnZSBoZWFkZXIKICAqLwpAQCAtMTg3LDQgKzIxNiwxNSBAQAogCXJldHVybiBOTE1TR19BTElHTihnZW5sbXNnX21zZ19zaXplKHBheWxvYWQpKTsKIH0KIAorLyoqCisgKiBnZW5sbXNnX25ldyAtIEFsbG9jYXRlIGEgbmV3IGdlbmVyaWMgbmV0bGluayBtZXNzYWdlCisgKiBAcGF5bG9hZDogc2l6ZSBvZiB0aGUgbWVzc2FnZSBwYXlsb2FkCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqZ2VubG1zZ19uZXcoc2l6ZV90IHBheWxvYWQsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBubG1zZ19uZXcoZ2VubG1zZ190b3RhbF9zaXplKHBheWxvYWQpLCBmbGFncyk7Cit9CisKKwogI2VuZGlmCS8qIF9fTkVUX0dFTkVSSUNfTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCmluZGV4IGIxNzRlYmIuLmU2YWYzODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCkBAIC0xMDM3LDYgKzEwMzcsMTAgQEAKIAkvKiBob3N0IHBlcmZvcm1zIG11bHRpY2FzdCBkZWNyeXB0aW9uICovCiAJaW50IGhvc3RfbWNfZGVjcnlwdDsKIAorCS8qIGhvc3Qgc2hvdWxkIHN0cmlwIElWIGFuZCBJQ1YgZnJvbSBwcm90ZWN0ZWQgZnJhbWVzICovCisJLyogbWVhbmluZ2Z1bCBvbmx5IHdoZW4gaGFyZHdhcmUgZGVjcnlwdGlvbiBpcyBiZWluZyB1c2VkICovCisJaW50IGhvc3Rfc3RyaXBfaXZfaWN2OworCiAJaW50IGhvc3Rfb3Blbl9mcmFnOwogCWludCBob3N0X2J1aWxkX2l2OwogCWludCBpZWVlODAyXzF4OwkJLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLwpAQCAtMTA3Niw2ICsxMDgwLDggQEAKIAlpbnQgcGVyZmVjdF9yc3NpOwogCWludCB3b3JzdF9yc3NpOwogCisJdTE2IHByZXZfc2VxX2N0bDsJLyogdXNlZCB0byBkcm9wIGR1cGxpY2F0ZSBmcmFtZXMgKi8KKwogCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLwogCXZvaWQgKCpzZXRfc2VjdXJpdHkpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKIAkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKiBzZWMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExc29mdG1hYy5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExc29mdG1hYy5oCmluZGV4IDQyNWIzYTUuLjg5MTE5MjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMXNvZnRtYWMuaAorKysgYi9pbmNsdWRlL25ldC9pZWVlODAyMTFzb2Z0bWFjLmgKQEAgLTYzLDEzICs2MywxMSBAQAogCiAvKgogICogSW5mb3JtYXRpb24gYWJvdXQgYXNzb2NpYXRpb24KLSAqCi0gKiBEbyB3ZSBuZWVkIGEgbG9jayBmb3IgdGhpcz8KLSAqIFdlIG9ubHkgZXZlciB1c2UgdGhpcyBzdHJ1Y3R1cmUgaW5saW5lZAotICogaW50byBvdXIgZ2xvYmFsIHN0cnVjdC4gSSd2ZSB1c2VkIGl0cyBsb2NrLAotICogYnV0IG1heWJlIHdlIG5lZWQgYSBsb2NhbCBvbmUgaGVyZT8KICAqLwogc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfYXNzb2NfaW5mbyB7CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisKIAkvKgogCSAqIFRoaXMgaXMgdGhlIHJlcXVlc3RlZCBFU1NJRC4gSXQgaXMgd3JpdHRlbgogCSAqIG9ubHkgYnkgdGhlIFdYIGhhbmRsZXJzLgpAQCAtOTksMTggKzk3LDE5IEBACiAJICoKIAkgKiBic3NmaXhlZCBpcyB1c2VkIGZvciBTSU9DU0lXQVAuCiAJICovCi0JdTggc3RhdGljX2Vzc2lkOjEsCi0JICAgc2hvcnRfcHJlYW1ibGVfYXZhaWxhYmxlOjEsCi0JICAgYXNzb2NpYXRpbmc6MSwKLQkgICBhc3NvY193YWl0OjEsCi0JICAgYnNzdmFsaWQ6MSwKLQkgICBic3NmaXhlZDoxOworCXU4IHN0YXRpY19lc3NpZDsKKwl1OCBzaG9ydF9wcmVhbWJsZV9hdmFpbGFibGU7CisJdTggYXNzb2NpYXRpbmc7CisJdTggYXNzb2NpYXRlZDsKKwl1OCBhc3NvY193YWl0OworCXU4IGJzc3ZhbGlkOworCXU4IGJzc2ZpeGVkOwogCiAJLyogU2NhbiByZXRyaWVzIHJlbWFpbmluZyAqLwogCWludCBzY2FuX3JldHJ5OwogCi0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHRpbWVvdXQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgdGltZW91dDsKIH07CiAKIHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2Jzc19pbmZvIHsKQEAgLTIyOSwxMiArMjI4LDEwIEBACiAJLyogcHJpdmF0ZSBzdHVmZiBmb2xsb3dzICovCiAJLyogdGhpcyBsb2NrIHByb3RlY3RzIHRoaXMgc3RydWN0dXJlICovCiAJc3BpbmxvY2tfdCBsb2NrOwotCQotCS8qIGNvdXBsZSBvZiBmbGFncyAqLwotCXU4IHNjYW5uaW5nOjEsIC8qIHByb3RlY3RzIHNjYW5uaW5nIGZyb20gYmVpbmcgZG9uZSBtdWx0aXBsZSB0aW1lcyBhdCBvbmNlICovCi0JICAgYXNzb2NpYXRlZDoxLAotCSAgIHJ1bm5pbmc6MTsKLQkKKworCXU4IHJ1bm5pbmc7IC8qIFNvZnRNQUMgc3RhcnRlZD8gKi8KKwl1OCBzY2FubmluZzsKKwogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX3NjYW5pbmZvICpzY2FuaW5mbzsKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19hc3NvY19pbmZvIGFzc29jaW5mbzsKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19ic3NfaW5mbyBic3NpbmZvOwpAQCAtMjUwLDcgKzI0Nyw3IEBACiAKIAkvKiB3ZSBuZWVkIHRvIGtlZXAgYSBsaXN0IG9mIG5ldHdvcmsgc3RydWN0cyB3ZSBjb3BpZWQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfbGlzdDsKLQkKKwogCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCiAJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KIAl1OCBwcml2WzBdOwpAQCAtMjk1LDcgKzI5Miw3IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfdHhyYXRlcyAqdHhyYXRlcyA9ICZtYWMtPnR4cmF0ZXM7CiAKLQlpZiAoIW1hYy0+YXNzb2NpYXRlZCkKKwlpZiAoIW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQpCiAJCXJldHVybiB0eHJhdGVzLT5tZ3RfbWNhc3RfcmF0ZTsKIAogCS8qIFdlIGFyZSBhc3NvY2lhdGVkLCBzZW5kaW5nIHVuaWNhc3QgZnJhbWUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmggYi9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCmluZGV4IDM0NDg5YzEuLjNlYzdkMDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKKysrIGIvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaApAQCAtMTUyLDYgKzE1Miw3IEBACiAKIHN0cnVjdCBpcHY2X2RldnN0YXQgewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19kaXJfZW50cnk7CisJREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaXBzdGF0c19taWIsIGlwdjYpOwogCURFRklORV9TTk1QX1NUQVQoc3RydWN0IGljbXB2Nl9taWIsIGljbXB2Nik7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0Nl9jb25uZWN0aW9uX3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5oCmluZGV4IGIzM2I0MzguLjE2YWE5NmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5oCkBAIC0yNyw3ICsyNyw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0Nl9jc2tfc2VhcmNoX3JlcShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCQkgc3RydWN0IHJlcXVlc3Rfc29jayAqKipwcmV2cCwKLQkJCQkJCSBjb25zdCBfX3UxNiBycG9ydCwKKwkJCQkJCSBjb25zdCBfX2JlMTYgcnBvcnQsCiAJCQkJCQkgY29uc3Qgc3RydWN0IGluNl9hZGRyICpyYWRkciwKIAkJCQkJCSBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmxhZGRyLAogCQkJCQkJIGNvbnN0IGludCBpaWYpOwpAQCAtMzgsNSArMzgsNSBAQAogCiBleHRlcm4gdm9pZCBpbmV0Nl9jc2tfYWRkcjJzb2NrYWRkcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIpOwogCi1leHRlcm4gaW50IGluZXQ2X2Nza194bWl0KHN0cnVjdCBza19idWZmICpza2IsIGludCBpcGZyYWdvayk7CitleHRlcm4gaW50IGluZXQ2X2Nza194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywgaW50IGlwZnJhZ29rKTsKICNlbmRpZiAvKiBfSU5FVDZfQ09OTkVDVElPTl9TT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaCBiL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaAppbmRleCBiYzZhNzFkLi5jMjhlNDI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oCkBAIC0yNiwxMSArMjYsMTEgQEAKIAogLyogSSBoYXZlIG5vIGlkZWEgaWYgdGhpcyBpcyBhIGdvb2QgaGFzaCBmb3IgdjYgb3Igbm90LiAtRGF2ZU0gKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGluZXQ2X2VoYXNoZm4oY29uc3Qgc3RydWN0IGluNl9hZGRyICpsYWRkciwgY29uc3QgdTE2IGxwb3J0LAotCQkJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsIGNvbnN0IHUxNiBmcG9ydCkKKwkJCQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmZhZGRyLCBjb25zdCBfX2JlMTYgZnBvcnQpCiB7Ci0JdW5zaWduZWQgaW50IGhhc2hlbnQgPSAobHBvcnQgXiBmcG9ydCk7CisJdW5zaWduZWQgaW50IGhhc2hlbnQgPSAobHBvcnQgXiAoX19mb3JjZSB1MTYpZnBvcnQpOwogCi0JaGFzaGVudCBePSAobGFkZHItPnM2X2FkZHIzMlszXSBeIGZhZGRyLT5zNl9hZGRyMzJbM10pOworCWhhc2hlbnQgXj0gKF9fZm9yY2UgdTMyKShsYWRkci0+czZfYWRkcjMyWzNdIF4gZmFkZHItPnM2X2FkZHIzMlszXSk7CiAJaGFzaGVudCBePSBoYXNoZW50ID4+IDE2OwogCWhhc2hlbnQgXj0gaGFzaGVudCA+PiA4OwogCXJldHVybiBoYXNoZW50OwpAQCAtNDMsNyArNDMsNyBAQAogCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbGFkZHIgPSAmbnAtPnJjdl9zYWRkcjsKIAljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmZhZGRyID0gJm5wLT5kYWRkcjsKIAljb25zdCBfX3UxNiBscG9ydCA9IGluZXQtPm51bTsKLQljb25zdCBfX3UxNiBmcG9ydCA9IGluZXQtPmRwb3J0OworCWNvbnN0IF9fYmUxNiBmcG9ydCA9IGluZXQtPmRwb3J0OwogCXJldHVybiBpbmV0Nl9laGFzaGZuKGxhZGRyLCBscG9ydCwgZmFkZHIsIGZwb3J0KTsKIH0KIApAQCAtNTcsNyArNTcsNyBAQAogICovCiBleHRlcm4gc3RydWN0IHNvY2sgKl9faW5ldDZfbG9va3VwX2VzdGFibGlzaGVkKHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbywKIAkJCQkJICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJICAgY29uc3QgdTE2IHNwb3J0LAorCQkJCQkgICBjb25zdCBfX2JlMTYgc3BvcnQsCiAJCQkJCSAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCiAJCQkJCSAgIGNvbnN0IHUxNiBobnVtLAogCQkJCQkgICBjb25zdCBpbnQgZGlmKTsKQEAgLTY5LDcgKzY5LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqX19pbmV0Nl9sb29rdXAoc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAogCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCSAgY29uc3QgdTE2IHNwb3J0LAorCQkJCQkgIGNvbnN0IF9fYmUxNiBzcG9ydCwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAogCQkJCQkgIGNvbnN0IHUxNiBobnVtLAogCQkJCQkgIGNvbnN0IGludCBkaWYpCkBAIC04Myw4ICs4Myw4IEBACiB9CiAKIGV4dGVybiBzdHJ1Y3Qgc29jayAqaW5ldDZfbG9va3VwKHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbywKLQkJCQkgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3QgdTE2IHNwb3J0LAotCQkJCSBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBjb25zdCB1MTYgZHBvcnQsCisJCQkJIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIGNvbnN0IF9fYmUxNiBzcG9ydCwKKwkJCQkgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgY29uc3QgX19iZTE2IGRwb3J0LAogCQkJCSBjb25zdCBpbnQgZGlmKTsKICNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpICovCiAjZW5kaWYgLyogX0lORVQ2X0hBU0hUQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKaW5kZXggMGJjZjlmMi4uYmYxNmQ5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcmVxdWVzdF9zb2NrLmg+CkBAIC0zNiw3ICszNyw4IEBACiAgKiAoaS5lLiB0aGluZ3MgdGhhdCBkZXBlbmQgb24gdGhlIGFkZHJlc3MgZmFtaWx5KQogICovCiBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2tfYWZfb3BzIHsKLQlpbnQJICAgICgqcXVldWVfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlwZnJhZ29rKTsKKwlpbnQJICAgICgqcXVldWVfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgaW50IGlwZnJhZ29rKTsKIAl2b2lkCSAgICAoKnNlbmRfY2hlY2spKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwKIAkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwogCWludAkgICAgKCpyZWJ1aWxkX2hlYWRlcikoc3RydWN0IHNvY2sgKnNrKTsKQEAgLTQ1LDcgKzQ3LDggQEAKIAkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCiAJCQkJICAgICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIAlpbnQJICAgICgqcmVtZW1iZXJfc3RhbXApKHN0cnVjdCBzb2NrICpzayk7Ci0JX191MTYJICAgIG5ldF9oZWFkZXJfbGVuOworCXUxNgkgICAgbmV0X2hlYWRlcl9sZW47CisJdTE2CSAgICBzb2NrYWRkcl9sZW47CiAJaW50CSAgICAoKnNldHNvY2tvcHQpKHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgCiAJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKIAlpbnQJICAgICgqZ2V0c29ja29wdCkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCAKQEAgLTU3LDcgKzYwLDYgQEAKIAkJCQlpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7CiAJdm9pZAkgICAgKCphZGRyMnNvY2thZGRyKShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqKTsKLQlpbnQgc29ja2FkZHJfbGVuOwogfTsKIAogLyoqIGluZXRfY29ubmVjdGlvbl9zb2NrIC0gSU5FVCBjb25uZWN0aW9uIG9yaWVudGVkIHNvY2sKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfZWNuLmggYi9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oCmluZGV4IGQ1OTljNmIuLjEwMTE3YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfZWNuLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9lY24uaApAQCAtNDgsMTIgKzQ4LDEyIEBACiAKICNkZWZpbmUJSVA2X0VDTl9mbG93X3htaXQoc2ssIGxhYmVsKSBkbyB7CQkJCVwKIAlpZiAoSU5FVF9FQ05faXNfY2FwYWJsZShpbmV0X3NrKHNrKS0+dG9zKSkJCQlcCi0JCShsYWJlbCkgfD0gX19jb25zdGFudF9odG9ucyhJTkVUX0VDTl9FQ1RfMCA8PCA0KTsJXAorCQkobGFiZWwpIHw9IGh0b25sKElORVRfRUNOX0VDVF8wIDw8IDIwKTsJCQlcCiAgICAgfSB3aGlsZSAoMCkKIAogc3RhdGljIGlubGluZSBpbnQgSVBfRUNOX3NldF9jZShzdHJ1Y3QgaXBoZHIgKmlwaCkKIHsKLQl1MzIgY2hlY2sgPSBpcGgtPmNoZWNrOworCXUzMiBjaGVjayA9IChfX2ZvcmNlIHUzMilpcGgtPmNoZWNrOwogCXUzMiBlY24gPSAoaXBoLT50b3MgKyAxKSAmIElORVRfRUNOX01BU0s7CiAKIAkvKgpAQCAtNzEsOSArNzEsOSBAQAogCSAqIElORVRfRUNOX0VDVF8xID0+IGNoZWNrICs9IGh0b25zKDB4RkZGRCkKIAkgKiBJTkVUX0VDTl9FQ1RfMCA9PiBjaGVjayArPSBodG9ucygweEZGRkUpCiAJICovCi0JY2hlY2sgKz0gaHRvbnMoMHhGRkZCKSArIGh0b25zKGVjbik7CisJY2hlY2sgKz0gKF9fZm9yY2UgdTE2KWh0b25zKDB4RkZGQikgKyAoX19mb3JjZSB1MTYpaHRvbnMoZWNuKTsKIAotCWlwaC0+Y2hlY2sgPSBjaGVjayArIChjaGVjaz49MHhGRkZGKTsKKwlpcGgtPmNoZWNrID0gKF9fZm9yY2UgX19zdW0xNikoY2hlY2sgKyAoY2hlY2s+PTB4RkZGRikpOwogCWlwaC0+dG9zIHw9IElORVRfRUNOX0NFOwogCXJldHVybiAxOwogfQpAQCAtOTUsMTMgKzk1LDEzIEBACiB7CiAJaWYgKElORVRfRUNOX2lzX25vdF9lY3QoaXB2Nl9nZXRfZHNmaWVsZChpcGgpKSkKIAkJcmV0dXJuIDA7Ci0JKih1MzIqKWlwaCB8PSBodG9ubChJTkVUX0VDTl9DRSA8PCAyMCk7CisJKihfX2JlMzIqKWlwaCB8PSBodG9ubChJTkVUX0VDTl9DRSA8PCAyMCk7CiAJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBJUDZfRUNOX2NsZWFyKHN0cnVjdCBpcHY2aGRyICppcGgpCiB7Ci0JKih1MzIqKWlwaCAmPSB+aHRvbmwoSU5FVF9FQ05fTUFTSyA8PCAyMCk7CisJKihfX2JlMzIqKWlwaCAmPSB+aHRvbmwoSU5FVF9FQ05fTUFTSyA8PCAyMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcHY2X2NvcHlfZHNjcChzdHJ1Y3QgaXB2NmhkciAqb3V0ZXIsIHN0cnVjdCBpcHY2aGRyICppbm5lcikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfaGFzaHRhYmxlcy5oIGIvaW5jbHVkZS9uZXQvaW5ldF9oYXNodGFibGVzLmgKaW5kZXggYTllYjJlYS4uMzRjYzc2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9oYXNodGFibGVzLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9oYXNodGFibGVzLmgKQEAgLTEyNSw3ICsxMjUsNyBAQAogCXJ3bG9ja190CQkJbGhhc2hfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAJYXRvbWljX3QJCQlsaGFzaF91c2VyczsKIAl3YWl0X3F1ZXVlX2hlYWRfdAkJbGhhc2hfd2FpdDsKLQlrbWVtX2NhY2hlX3QJCQkqYmluZF9idWNrZXRfY2FjaGVwOworCXN0cnVjdCBrbWVtX2NhY2hlCQkJKmJpbmRfYnVja2V0X2NhY2hlcDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGluZXRfZWhhc2hfYnVja2V0ICppbmV0X2VoYXNoX2J1Y2tldCgKQEAgLTEzNiwxMCArMTM2LDEwIEBACiB9CiAKIGV4dGVybiBzdHJ1Y3QgaW5ldF9iaW5kX2J1Y2tldCAqCi0JCSAgICBpbmV0X2JpbmRfYnVja2V0X2NyZWF0ZShrbWVtX2NhY2hlX3QgKmNhY2hlcCwKKwkJICAgIGluZXRfYmluZF9idWNrZXRfY3JlYXRlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCiAJCQkJCSAgICBzdHJ1Y3QgaW5ldF9iaW5kX2hhc2hidWNrZXQgKmhlYWQsCiAJCQkJCSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBzbnVtKTsKLWV4dGVybiB2b2lkIGluZXRfYmluZF9idWNrZXRfZGVzdHJveShrbWVtX2NhY2hlX3QgKmNhY2hlcCwKK2V4dGVybiB2b2lkIGluZXRfYmluZF9idWNrZXRfZGVzdHJveShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAogCQkJCSAgICAgc3RydWN0IGluZXRfYmluZF9idWNrZXQgKnRiKTsKIAogc3RhdGljIGlubGluZSBpbnQgaW5ldF9iaGFzaGZuKGNvbnN0IF9fdTE2IGxwb3J0LCBjb25zdCBpbnQgYmhhc2hfc2l6ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oIGIvaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmgKaW5kZXggNWY0ODc0OC4uZjdiZTFhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmgKQEAgLTg0LDcgKzg0LDcgQEAKIH07CiAKIGV4dGVybiB2b2lkIGluZXRfdHdkcl9oYW5nbWFuKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1leHRlcm4gdm9pZCBpbmV0X3R3ZHJfdHdraWxsX3dvcmsodm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBpbmV0X3R3ZHJfdHdraWxsX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIGV4dGVybiB2b2lkIGluZXRfdHdkcl90d2NhbF90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKICNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRwZWVyLmggYi9pbmNsdWRlL25ldC9pbmV0cGVlci5oCmluZGV4IDkyNTU3M2YuLmFhMTBhODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRwZWVyLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldHBlZXIuaApAQCAtMTcsMTQgKzE3LDE1IEBACiAKIHN0cnVjdCBpbmV0X3BlZXIKIHsKKwkvKiBncm91cCB0b2dldGhlciBhdmxfbGVmdCxhdmxfcmlnaHQsdjRkYWRkciB0byBzcGVlZHVwIGxvb2t1cHMgKi8KIAlzdHJ1Y3QgaW5ldF9wZWVyCSphdmxfbGVmdCwgKmF2bF9yaWdodDsKLQlzdHJ1Y3QgaW5ldF9wZWVyCSp1bnVzZWRfbmV4dCwgKip1bnVzZWRfcHJldnA7Ci0JdW5zaWduZWQgbG9uZwkJZHRpbWU7CQkvKiB0aGUgdGltZSBvZiBsYXN0IHVzZSBvZiBub3QKLQkJCQkJCSAqIHJlZmVyZW5jZWQgZW50cmllcyAqLwotCWF0b21pY190CQlyZWZjbnQ7CiAJX19iZTMyCQkJdjRkYWRkcjsJLyogcGVlcidzIGFkZHJlc3MgKi8KIAlfX3UxNgkJCWF2bF9oZWlnaHQ7CiAJX191MTYJCQlpcF9pZF9jb3VudDsJLyogSVAgSUQgZm9yIHRoZSBuZXh0IHBhY2tldCAqLworCXN0cnVjdCBpbmV0X3BlZXIJKnVudXNlZF9uZXh0LCAqKnVudXNlZF9wcmV2cDsKKwlfX3UzMgkJCWR0aW1lOwkJLyogdGhlIHRpbWUgb2YgbGFzdCB1c2Ugb2Ygbm90CisJCQkJCQkgKiByZWZlcmVuY2VkIGVudHJpZXMgKi8KKwlhdG9taWNfdAkJcmVmY250OwogCWF0b21pY190CQlyaWQ7CQkvKiBGcmFnIHJlY2VwdGlvbiBjb3VudGVyICovCiAJX191MzIJCQl0Y3BfdHM7CiAJdW5zaWduZWQgbG9uZwkJdGNwX3RzX3N0YW1wOwpAQCAtMzUsMjEgKzM2LDggQEAKIC8qIGNhbiBiZSBjYWxsZWQgd2l0aCBvciB3aXRob3V0IGxvY2FsIEJIIGJlaW5nIGRpc2FibGVkICovCiBzdHJ1Y3QgaW5ldF9wZWVyCSppbmV0X2dldHBlZXIoX19iZTMyIGRhZGRyLCBpbnQgY3JlYXRlKTsKIAotZXh0ZXJuIHNwaW5sb2NrX3QgaW5ldF9wZWVyX3VudXNlZF9sb2NrOwotZXh0ZXJuIHN0cnVjdCBpbmV0X3BlZXIgKippbmV0X3BlZXJfdW51c2VkX3RhaWxwOwogLyogY2FuIGJlIGNhbGxlZCBmcm9tIEJIIGNvbnRleHQgb3Igb3V0c2lkZSAqLwotc3RhdGljIGlubGluZSB2b2lkCWluZXRfcHV0cGVlcihzdHJ1Y3QgaW5ldF9wZWVyICpwKQotewotCXNwaW5fbG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcC0+cmVmY250KSkgewotCQlwLT51bnVzZWRfcHJldnAgPSBpbmV0X3BlZXJfdW51c2VkX3RhaWxwOwotCQlwLT51bnVzZWRfbmV4dCA9IE5VTEw7Ci0JCSppbmV0X3BlZXJfdW51c2VkX3RhaWxwID0gcDsKLQkJaW5ldF9wZWVyX3VudXNlZF90YWlscCA9ICZwLT51bnVzZWRfbmV4dDsKLQkJcC0+ZHRpbWUgPSBqaWZmaWVzOwotCX0KLQlzcGluX3VubG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKLX0KK2V4dGVybiB2b2lkIGluZXRfcHV0cGVlcihzdHJ1Y3QgaW5ldF9wZWVyICpwKTsKIAogZXh0ZXJuIHNwaW5sb2NrX3QgaW5ldF9wZWVyX2lkbG9jazsKIC8qIGNhbiBiZSBjYWxsZWQgd2l0aCBvciB3aXRob3V0IGxvY2FsIEJIIGJlaW5nIGRpc2FibGVkICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCBiNmQ5NWU1Li4wNTNmMDJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTk3LDcgKzk3LDcgQEAKIGV4dGVybiBpbnQJCWlwX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIGludCAoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYgKikpOwogZXh0ZXJuIGludAkJaXBfZG9fbmF0KHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHZvaWQJCWlwX3NlbmRfY2hlY2soc3RydWN0IGlwaGRyICppcCk7Ci1leHRlcm4gaW50CQlpcF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIGludCBpcGZyYWdvayk7CitleHRlcm4gaW50CQlpcF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywgaW50IGlwZnJhZ29rKTsKIGV4dGVybiB2b2lkCQlpcF9pbml0KHZvaWQpOwogZXh0ZXJuIGludAkJaXBfYXBwZW5kX2RhdGEoc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgICAgICBpbnQgZ2V0ZnJhZyh2b2lkICpmcm9tLCBjaGFyICp0bywgaW50IG9mZnNldCwgaW50IGxlbiwKQEAgLTEyMyw3ICsxMjMsNyBAQAogICogICAgICBtdWx0aWNhc3QgcGFja2V0cy4KICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfdHJfbWNfbWFwKHUzMiBhZGRyLCBjaGFyICpidWYpCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfdHJfbWNfbWFwKF9fYmUzMiBhZGRyLCBjaGFyICpidWYpCiB7CiAJYnVmWzBdPTB4QzA7CiAJYnVmWzFdPTB4MDA7CkBAIC0xMzUsNyArMTM1LDcgQEAKIAogc3RydWN0IGlwX3JlcGx5X2FyZyB7CiAJc3RydWN0IGt2ZWMgaW92WzFdOyAgIAotCXUzMiAJICAgIGNzdW07IAorCV9fd3N1bSAJICAgIGNzdW07CiAJaW50CSAgICBjc3Vtb2Zmc2V0OyAvKiB1MTYgb2Zmc2V0IG9mIGNzdW0gaW4gaW92WzBdLmlvdl9iYXNlICovCiAJCQkJLyogLTEgaWYgbm90IG5lZWRlZCAqLyAKIH07IApAQCAtMTkyLDkgKzE5Miw5IEBACiBzdGF0aWMgaW5saW5lCiBpbnQgaXBfZGVjcmVhc2VfdHRsKHN0cnVjdCBpcGhkciAqaXBoKQogewotCXUzMiBjaGVjayA9IGlwaC0+Y2hlY2s7Ci0JY2hlY2sgKz0gaHRvbnMoMHgwMTAwKTsKLQlpcGgtPmNoZWNrID0gY2hlY2sgKyAoY2hlY2s+PTB4RkZGRik7CisJdTMyIGNoZWNrID0gKF9fZm9yY2UgdTMyKWlwaC0+Y2hlY2s7CisJY2hlY2sgKz0gKF9fZm9yY2UgdTMyKWh0b25zKDB4MDEwMCk7CisJaXBoLT5jaGVjayA9IChfX2ZvcmNlIF9fc3VtMTYpKGNoZWNrICsgKGNoZWNrPj0weEZGRkYpKTsKIAlyZXR1cm4gLS1pcGgtPnR0bDsKIH0KIApAQCAtMjM4LDkgKzIzOCw5IEBACiAgKglNYXAgYSBtdWx0aWNhc3QgSVAgb250byBtdWx0aWNhc3QgTUFDIGZvciB0eXBlIGV0aGVybmV0LgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcF9ldGhfbWNfbWFwKHUzMiBhZGRyLCBjaGFyICpidWYpCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfZXRoX21jX21hcChfX2JlMzIgbmFkZHIsIGNoYXIgKmJ1ZikKIHsKLQlhZGRyPW50b2hsKGFkZHIpOworCV9fdTMyIGFkZHI9bnRvaGwobmFkZHIpOwogCWJ1ZlswXT0weDAxOwogCWJ1ZlsxXT0weDAwOwogCWJ1ZlsyXT0weDVlOwpAQCAtMjU2LDEzICsyNTYsMTQgQEAKICAqCUxlYXZlIFBfS2V5IGFzIDAgdG8gYmUgZmlsbGVkIGluIGJ5IGRyaXZlci4KICAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfaWJfbWNfbWFwKHUzMiBhZGRyLCBjaGFyICpidWYpCitzdGF0aWMgaW5saW5lIHZvaWQgaXBfaWJfbWNfbWFwKF9fYmUzMiBuYWRkciwgY2hhciAqYnVmKQogeworCV9fdTMyIGFkZHI7CiAJYnVmWzBdICA9IDA7CQkvKiBSZXNlcnZlZCAqLwogCWJ1ZlsxXSAgPSAweGZmOwkJLyogTXVsdGljYXN0IFFQTiAqLwogCWJ1ZlsyXSAgPSAweGZmOwogCWJ1ZlszXSAgPSAweGZmOwotCWFkZHIgICAgPSBudG9obChhZGRyKTsKKwlhZGRyICAgID0gbnRvaGwobmFkZHIpOwogCWJ1Zls0XSAgPSAweGZmOwogCWJ1Zls1XSAgPSAweDEyOwkJLyogbGluayBsb2NhbCBzY29wZSAqLwogCWJ1Zls2XSAgPSAweDQwOwkJLyogSVB2NCBzaWduYXR1cmUgKi8KQEAgLTM3NSw4ICszNzYsNyBAQAogCQkJIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKIGludCBpcHY0X2RvaW50X2FuZF9mbHVzaF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJCQkgIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCi0JCQkJICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCAKLQkJCQkgIHZvaWQgKipjb250ZXh0KTsKKwkJCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBleHRlcm4gaW50IGlwX21pc2NfcHJvY19pbml0KHZvaWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfY2hlY2tzdW0uaCBiL2luY2x1ZGUvbmV0L2lwNl9jaGVja3N1bS5oCmluZGV4IDNkZmM4ODUuLjY4ZTJiMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl9jaGVja3N1bS5oCkBAIC0zNCw2MCArMzQsNjAgQEAKIAogI2lmbmRlZiBfSEFWRV9BUkNIX0lQVjZfQ1NVTQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCi0JCQkJCQkgICAgIF9fdTE2IGxlbiwKLQkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgIHVuc2lnbmVkIGludCBjc3VtKSAKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV9pcHY2X21hZ2ljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCQkJICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkgIF9fd3N1bSBjc3VtKQogewogCiAJaW50IGNhcnJ5OwogCV9fdTMyIHVsZW47CiAJX191MzIgdXByb3RvOworCV9fdTMyIHN1bSA9IChfX2ZvcmNlIHUzMiljc3VtOwogCi0JY3N1bSArPSBzYWRkci0+czZfYWRkcjMyWzBdOwotCWNhcnJ5ID0gKGNzdW0gPCBzYWRkci0+czZfYWRkcjMyWzBdKTsKLQljc3VtICs9IGNhcnJ5OworCXN1bSArPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlswXTsKKwljYXJyeSA9IChzdW0gPCAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlswXSk7CisJc3VtICs9IGNhcnJ5OwogCi0JY3N1bSArPSBzYWRkci0+czZfYWRkcjMyWzFdOwotCWNhcnJ5ID0gKGNzdW0gPCBzYWRkci0+czZfYWRkcjMyWzFdKTsKLQljc3VtICs9IGNhcnJ5OworCXN1bSArPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlsxXTsKKwljYXJyeSA9IChzdW0gPCAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlsxXSk7CisJc3VtICs9IGNhcnJ5OwogCi0JY3N1bSArPSBzYWRkci0+czZfYWRkcjMyWzJdOwotCWNhcnJ5ID0gKGNzdW0gPCBzYWRkci0+czZfYWRkcjMyWzJdKTsKLQljc3VtICs9IGNhcnJ5OworCXN1bSArPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlsyXTsKKwljYXJyeSA9IChzdW0gPCAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlsyXSk7CisJc3VtICs9IGNhcnJ5OwogCi0JY3N1bSArPSBzYWRkci0+czZfYWRkcjMyWzNdOwotCWNhcnJ5ID0gKGNzdW0gPCBzYWRkci0+czZfYWRkcjMyWzNdKTsKLQljc3VtICs9IGNhcnJ5OworCXN1bSArPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlszXTsKKwljYXJyeSA9IChzdW0gPCAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlszXSk7CisJc3VtICs9IGNhcnJ5OwogCi0JY3N1bSArPSBkYWRkci0+czZfYWRkcjMyWzBdOwotCWNhcnJ5ID0gKGNzdW0gPCBkYWRkci0+czZfYWRkcjMyWzBdKTsKLQljc3VtICs9IGNhcnJ5OworCXN1bSArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlswXTsKKwljYXJyeSA9IChzdW0gPCAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlswXSk7CisJc3VtICs9IGNhcnJ5OwogCi0JY3N1bSArPSBkYWRkci0+czZfYWRkcjMyWzFdOwotCWNhcnJ5ID0gKGNzdW0gPCBkYWRkci0+czZfYWRkcjMyWzFdKTsKLQljc3VtICs9IGNhcnJ5OworCXN1bSArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsxXTsKKwljYXJyeSA9IChzdW0gPCAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsxXSk7CisJc3VtICs9IGNhcnJ5OwogCi0JY3N1bSArPSBkYWRkci0+czZfYWRkcjMyWzJdOwotCWNhcnJ5ID0gKGNzdW0gPCBkYWRkci0+czZfYWRkcjMyWzJdKTsKLQljc3VtICs9IGNhcnJ5OworCXN1bSArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsyXTsKKwljYXJyeSA9IChzdW0gPCAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsyXSk7CisJc3VtICs9IGNhcnJ5OwogCi0JY3N1bSArPSBkYWRkci0+czZfYWRkcjMyWzNdOwotCWNhcnJ5ID0gKGNzdW0gPCBkYWRkci0+czZfYWRkcjMyWzNdKTsKLQljc3VtICs9IGNhcnJ5OworCXN1bSArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlszXTsKKwljYXJyeSA9IChzdW0gPCAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlszXSk7CisJc3VtICs9IGNhcnJ5OwogCi0JdWxlbiA9IGh0b25sKChfX3UzMikgbGVuKTsKLQljc3VtICs9IHVsZW47Ci0JY2FycnkgPSAoY3N1bSA8IHVsZW4pOwotCWNzdW0gKz0gY2Fycnk7CisJdWxlbiA9IChfX2ZvcmNlIHUzMilodG9ubCgoX191MzIpIGxlbik7CisJc3VtICs9IHVsZW47CisJY2FycnkgPSAoc3VtIDwgdWxlbik7CisJc3VtICs9IGNhcnJ5OwogCi0JdXByb3RvID0gaHRvbmwocHJvdG8pOwotCWNzdW0gKz0gdXByb3RvOwotCWNhcnJ5ID0gKGNzdW0gPCB1cHJvdG8pOwotCWNzdW0gKz0gY2Fycnk7CisJdXByb3RvID0gKF9fZm9yY2UgdTMyKWh0b25sKHByb3RvKTsKKwlzdW0gKz0gdXByb3RvOworCWNhcnJ5ID0gKHN1bSA8IHVwcm90byk7CisJc3VtICs9IGNhcnJ5OwogCi0JcmV0dXJuIGNzdW1fZm9sZChjc3VtKTsKKwlyZXR1cm4gY3N1bV9mb2xkKChfX2ZvcmNlIF9fd3N1bSljc3VtKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfZmliLmggYi9pbmNsdWRlL25ldC9pcDZfZmliLmgKaW5kZXggZTQ0MzhkZS4uN2JlNGY0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl9maWIuaApAQCAtNTAsOSArNTAsOSBAQAogCXN0cnVjdCBmaWI2X25vZGUJKnBhcmVudDsKIAlzdHJ1Y3QgZmliNl9ub2RlCSpsZWZ0OwogCXN0cnVjdCBmaWI2X25vZGUJKnJpZ2h0OwotCisjaWZkZWYgQ09ORklHX0lQVjZfU1VCVFJFRVMKIAlzdHJ1Y3QgZmliNl9ub2RlCSpzdWJ0cmVlOwotCisjZW5kaWYKIAlzdHJ1Y3QgcnQ2X2luZm8JCSpsZWFmOwogCiAJX191MTYJCQlmbl9iaXQ7CQkvKiBiaXQga2V5ICovCkBAIC0xMDcsNiArMTA3LDExIEBACiAJdTgJCQkJcnQ2aV9wcm90b2NvbDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGluZXQ2X2RldiAqaXA2X2RzdF9pZGV2KHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgcnQ2X2luZm8gKilkc3QpLT5ydDZpX2lkZXY7Cit9CisKIHN0cnVjdCBmaWI2X3dhbGtlcl90CiB7CiAJc3RydWN0IGZpYjZfd2Fsa2VyX3QgKnByZXYsICpuZXh0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmggYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAppbmRleCA2Y2E2YjcxLi40ZTkyN2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaApAQCAtMjAsNyArMjAsNyBAQAogCQkJCXJvdXRlX3ByZWY6MiwKIAkJCQlyZXNlcnZlZF9oOjM7CiAjZW5kaWYKLQlfX3UzMgkJCWxpZmV0aW1lOworCV9fYmUzMgkJCWxpZmV0aW1lOwogCV9fdTgJCQlwcmVmaXhbMF07CS8qIDAsOCBvciAxNiAqLwogfTsKIApAQCAtMzYsMTMgKzM2LDYgQEAKICNkZWZpbmUgUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRQkweDIKICNkZWZpbmUgUlQ2X0xPT0tVUF9GX0hBU19TQUREUgkweDQKIAotc3RydWN0IHBvbF9jaGFpbiB7Ci0JaW50CQkJdHlwZTsKLQlpbnQJCQlwcmlvcml0eTsKLQlzdHJ1Y3QgZmliNl9ub2RlCSpydWxlczsKLQlzdHJ1Y3QgcG9sX2NoYWluCSpuZXh0OwotfTsKLQogZXh0ZXJuIHN0cnVjdCBydDZfaW5mbwlpcDZfbnVsbF9lbnRyeTsKIAogI2lmZGVmIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBfZmliLmggYi9pbmNsdWRlL25ldC9pcF9maWIuaAppbmRleCA4MjIyOTE0Li4zNmM2MzVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF9maWIuaAorKysgYi9pbmNsdWRlL25ldC9pcF9maWIuaApAQCAtMjEsMTcgKzIxLDE0IEBACiAjaW5jbHVkZSA8bmV0L2ZpYl9ydWxlcy5oPgogCiBzdHJ1Y3QgZmliX2NvbmZpZyB7Ci0JdTgJCQlmY19mYW1pbHk7CiAJdTgJCQlmY19kc3RfbGVuOwotCXU4CQkJZmNfc3JjX2xlbjsKIAl1OAkJCWZjX3RvczsKIAl1OAkJCWZjX3Byb3RvY29sOwogCXU4CQkJZmNfc2NvcGU7CiAJdTgJCQlmY190eXBlOwotCS8qIDEgYnl0ZSB1bnVzZWQgKi8KKwkvKiAzIGJ5dGVzIHVudXNlZCAqLwogCXUzMgkJCWZjX3RhYmxlOwogCV9fYmUzMgkJCWZjX2RzdDsKLQlfX2JlMzIJCQlmY19zcmM7CiAJX19iZTMyCQkJZmNfZ3c7CiAJaW50CQkJZmNfb2lmOwogCXUzMgkJCWZjX2ZsYWdzOwpAQCAtMTE4LDcgKzExNSw3IEBACiAKIHN0cnVjdCBmaWJfcmVzdWx0X25sIHsKIAlfX2JlMzIJCWZsX2FkZHI7ICAgLyogVG8gYmUgbG9va2VkIHVwKi8KLQl1MzIJCWZsX2Z3bWFyazsgCisJdTMyCQlmbF9tYXJrOwogCXVuc2lnbmVkIGNoYXIJZmxfdG9zOwogCXVuc2lnbmVkIGNoYXIgICBmbF9zY29wZTsKIAl1bnNpZ25lZCBjaGFyICAgdGJfaWRfaW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF9tcF9hbGcuaCBiL2luY2x1ZGUvbmV0L2lwX21wX2FsZy5oCmluZGV4IGJlZmZkZDYuLjI1YjU2NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX21wX2FsZy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX21wX2FsZy5oCkBAIC04OCw5ICs4OCw3IEBACiAJcmV0dXJuIGZscDEtPmZsNF9kc3QgPT0gZmxwMi0+Zmw0X2RzdCAmJgogCQlmbHAxLT5mbDRfc3JjID09IGZscDItPmZsNF9zcmMgJiYKIAkJZmxwMS0+b2lmID09IGZscDItPm9pZiAmJgotI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKLQkJZmxwMS0+Zmw0X2Z3bWFyayA9PSBmbHAyLT5mbDRfZndtYXJrICYmCi0jZW5kaWYKKwkJZmxwMS0+bWFyayA9PSBmbHAyLT5tYXJrICYmCiAJCSEoKGZscDEtPmZsNF90b3MgXiBmbHAyLT5mbDRfdG9zKSAmCiAJCSAgKElQVE9TX1JUX01BU0sgfCBSVE9fT05MSU5LKSk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF92cy5oIGIvaW5jbHVkZS9uZXQvaXBfdnMuaAppbmRleCA0OWM3MTdlLi42NzI1NjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF92cy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX3ZzLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIF9JUF9WU19ICiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4JCS8qIEZvciBfX3VYWCB0eXBlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIEZvciBfX2JlWFggdHlwZXMgaW4gdXNlcmxhbmQgKi8KIAogI2RlZmluZSBJUF9WU19WRVJTSU9OX0NPREUJMHgwMTAyMDEKICNkZWZpbmUgTlZFUlNJT04odmVyc2lvbikJCQlcCkBAIC05ODcsMTQgKzk4OCwyMCBAQAogZXh0ZXJuIHZvaWQgaXBfdnNfbmF0X2ljbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKIAkJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwLCBpbnQgZGlyKTsKIAotZXh0ZXJuIHUxNiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KTsKK2V4dGVybiBfX3N1bTE2IGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQpOwogCi1zdGF0aWMgaW5saW5lIHUxNiBpcF92c19jaGVja19kaWZmKHUzMiBvbGQsIHUzMiBuZXcsIHUxNiBvbGRzdW0pCitzdGF0aWMgaW5saW5lIF9fd3N1bSBpcF92c19jaGVja19kaWZmNChfX2JlMzIgb2xkLCBfX2JlMzIgbmV3LCBfX3dzdW0gb2xkc3VtKQogewotCXUzMiBkaWZmWzJdID0geyBvbGQsIG5ldyB9OworCV9fYmUzMiBkaWZmWzJdID0geyB+b2xkLCBuZXcgfTsKIAotCXJldHVybiBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKChjaGFyICopIGRpZmYsIHNpemVvZihkaWZmKSwKLQkJCQkgICAgICBvbGRzdW0gXiAweEZGRkYpKTsKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsKChjaGFyICopIGRpZmYsIHNpemVvZihkaWZmKSwgb2xkc3VtKTsKK30KKworc3RhdGljIGlubGluZSBfX3dzdW0gaXBfdnNfY2hlY2tfZGlmZjIoX19iZTE2IG9sZCwgX19iZTE2IG5ldywgX193c3VtIG9sZHN1bSkKK3sKKwlfX2JlMTYgZGlmZlsyXSA9IHsgfm9sZCwgbmV3IH07CisKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsKChjaGFyICopIGRpZmYsIHNpemVvZihkaWZmKSwgb2xkc3VtKTsKIH0KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwY29uZmlnLmggYi9pbmNsdWRlL25ldC9pcGNvbmZpZy5oCmluZGV4IDJhMWZlOTkuLjM5MjRkN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwY29uZmlnLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBjb25maWcuaApAQCAtMTEsMTIgKzExLDEyIEBACiBleHRlcm4gaW50IGljX3Byb3RvX2VuYWJsZWQ7CS8qIFByb3RvY29scyBlbmFibGVkIChzZWUgSUNfeHh4KSAqLwogZXh0ZXJuIGludCBpY19zZXRfbWFudWFsbHk7CS8qIElQY29uZmlnIHBhcmFtZXRlcnMgc2V0IG1hbnVhbGx5ICovCiAKLWV4dGVybiB1MzIgaWNfbXlhZGRyOwkJLyogTXkgSVAgYWRkcmVzcyAqLwotZXh0ZXJuIHUzMiBpY19nYXRld2F5OwkJLyogR2F0ZXdheSBJUCBhZGRyZXNzICovCitleHRlcm4gX19iZTMyIGljX215YWRkcjsJCS8qIE15IElQIGFkZHJlc3MgKi8KK2V4dGVybiBfX2JlMzIgaWNfZ2F0ZXdheTsJCS8qIEdhdGV3YXkgSVAgYWRkcmVzcyAqLwogCi1leHRlcm4gdTMyIGljX3NlcnZhZGRyOwkJLyogQm9vdCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLworZXh0ZXJuIF9fYmUzMiBpY19zZXJ2YWRkcjsJCS8qIEJvb3Qgc2VydmVyIElQIGFkZHJlc3MgKi8KIAotZXh0ZXJuIHUzMiByb290X3NlcnZlcl9hZGRyOwkvKiBBZGRyZXNzIG9mIE5GUyBzZXJ2ZXIgKi8KK2V4dGVybiBfX2JlMzIgcm9vdF9zZXJ2ZXJfYWRkcjsJLyogQWRkcmVzcyBvZiBORlMgc2VydmVyICovCiBleHRlcm4gdTggcm9vdF9zZXJ2ZXJfcGF0aFtdOwkvKiBQYXRoIHRvIG1vdW50IGFzIHJvb3QgKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcGlwLmggYi9pbmNsdWRlL25ldC9pcGlwLmgKaW5kZXggZjQ5MGMzYy4uN2NkYzkxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBpcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwaXAuaApAQCAtMzUsNyArMzUsNyBAQAogCWlwX3NlbmRfY2hlY2soaXBoKTsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJZXJyID0gTkZfSE9PSyhQRl9JTkVULCBORl9JUF9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgcnQtPnUuZHN0LmRldiwgZHN0X291dHB1dCk7XAotCWlmIChlcnIgPT0gTkVUX1hNSVRfU1VDQ0VTUyB8fCBlcnIgPT0gTkVUX1hNSVRfQ04pIHsJCVwKKwlpZiAobmV0X3htaXRfZXZhbChlcnIpID09IDApIHsJCQkJCVwKIAkJc3RhdHMtPnR4X2J5dGVzICs9IHBrdF9sZW47CQkJCVwKIAkJc3RhdHMtPnR4X3BhY2tldHMrKzsJCQkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCkBAIC00NCw4ICs0NCw0IEBACiAJfQkJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAotCi1leHRlcm4gaW50CXNpdF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQJc2l0X2NsZWFudXAodm9pZCk7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXB2Ni5oIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCmluZGV4IDgyMjNjNDQuLjAwMzI4YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwdjYuaAorKysgYi9pbmNsdWRlL25ldC9pcHY2LmgKQEAgLTk1LDEwICs5NSwxMCBAQAogICovCiAKIHN0cnVjdCBmcmFnX2hkciB7Ci0JdW5zaWduZWQgY2hhcgluZXh0aGRyOwotCXVuc2lnbmVkIGNoYXIJcmVzZXJ2ZWQ7CQotCXVuc2lnbmVkIHNob3J0CWZyYWdfb2ZmOwotCV9fdTMyCQlpZGVudGlmaWNhdGlvbjsKKwlfX3U4CW5leHRoZHI7CisJX191OAlyZXNlcnZlZDsKKwlfX2JlMTYJZnJhZ19vZmY7CisJX19iZTMyCWlkZW50aWZpY2F0aW9uOwogfTsKIAogI2RlZmluZQlJUDZfTUYJMHgwMDAxCkBAIC0xMTMsOSArMTEzLDI0IEBACiAKIC8qIE1JQnMgKi8KIERFQ0xBUkVfU05NUF9TVEFUKHN0cnVjdCBpcHN0YXRzX21pYiwgaXB2Nl9zdGF0aXN0aWNzKTsKLSNkZWZpbmUgSVA2X0lOQ19TVEFUUyhmaWVsZCkJCVNOTVBfSU5DX1NUQVRTKGlwdjZfc3RhdGlzdGljcywgZmllbGQpCi0jZGVmaW5lIElQNl9JTkNfU1RBVFNfQkgoZmllbGQpCQlTTk1QX0lOQ19TVEFUU19CSChpcHY2X3N0YXRpc3RpY3MsIGZpZWxkKQotI2RlZmluZSBJUDZfSU5DX1NUQVRTX1VTRVIoZmllbGQpIAlTTk1QX0lOQ19TVEFUU19VU0VSKGlwdjZfc3RhdGlzdGljcywgZmllbGQpCisjZGVmaW5lIElQNl9JTkNfU1RBVFMoaWRldixmaWVsZCkJCSh7CQkJXAorCXN0cnVjdCBpbmV0Nl9kZXYgKl9pZGV2ID0gKGlkZXYpOwkJCQlcCisJaWYgKGxpa2VseShfaWRldiAhPSBOVUxMKSkJCQkJCVwKKwkJU05NUF9JTkNfU1RBVFMoX2lkZXYtPnN0YXRzLmlwdjYsIGZpZWxkKTsJCVwKKwlTTk1QX0lOQ19TVEFUUyhpcHY2X3N0YXRpc3RpY3MsIGZpZWxkKTsJCQkJXAorfSkKKyNkZWZpbmUgSVA2X0lOQ19TVEFUU19CSChpZGV2LGZpZWxkKQkJKHsJCQlcCisJc3RydWN0IGluZXQ2X2RldiAqX2lkZXYgPSAoaWRldik7CQkJCVwKKwlpZiAobGlrZWx5KF9pZGV2ICE9IE5VTEwpKQkJCQkJXAorCQlTTk1QX0lOQ19TVEFUU19CSChfaWRldi0+c3RhdHMuaXB2NiwgZmllbGQpOwkJXAorCVNOTVBfSU5DX1NUQVRTX0JIKGlwdjZfc3RhdGlzdGljcywgZmllbGQpOwkJCVwKK30pCisjZGVmaW5lIElQNl9JTkNfU1RBVFNfVVNFUihpZGV2LGZpZWxkKQkJKHsJCQlcCisJc3RydWN0IGluZXQ2X2RldiAqX2lkZXYgPSAoaWRldik7CQkJCVwKKwlpZiAobGlrZWx5KF9pZGV2ICE9IE5VTEwpKQkJCQkJXAorCQlTTk1QX0lOQ19TVEFUU19VU0VSKF9pZGV2LT5zdGF0cy5pcHY2LCBmaWVsZCk7CQlcCisJU05NUF9JTkNfU1RBVFNfVVNFUihpcHY2X3N0YXRpc3RpY3MsIGZpZWxkKTsJCQlcCit9KQogREVDTEFSRV9TTk1QX1NUQVQoc3RydWN0IGljbXB2Nl9taWIsIGljbXB2Nl9zdGF0aXN0aWNzKTsKICNkZWZpbmUgSUNNUDZfSU5DX1NUQVRTKGlkZXYsIGZpZWxkKQkJKHsJCQlcCiAJc3RydWN0IGluZXQ2X2RldiAqX2lkZXYgPSAoaWRldik7CQkJCVwKQEAgLTE0Myw5ICsxNTgsMTMgQEAKIAlTTk1QX0lOQ19TVEFUU19PRkZTRVRfQkgoaWNtcHY2X3N0YXRpc3RpY3MsIGZpZWxkLCBfb2Zmc2V0KTsgICAgCVwKIH0pCiBERUNMQVJFX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwX3N0YXRzX2luNik7Ci0jZGVmaW5lIFVEUDZfSU5DX1NUQVRTKGZpZWxkKQkJU05NUF9JTkNfU1RBVFModWRwX3N0YXRzX2luNiwgZmllbGQpCi0jZGVmaW5lIFVEUDZfSU5DX1NUQVRTX0JIKGZpZWxkKQlTTk1QX0lOQ19TVEFUU19CSCh1ZHBfc3RhdHNfaW42LCBmaWVsZCkKLSNkZWZpbmUgVURQNl9JTkNfU1RBVFNfVVNFUihmaWVsZCkgCVNOTVBfSU5DX1NUQVRTX1VTRVIodWRwX3N0YXRzX2luNiwgZmllbGQpCitERUNMQVJFX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwbGl0ZV9zdGF0c19pbjYpOworI2RlZmluZSBVRFA2X0lOQ19TVEFUU19CSChmaWVsZCwgaXNfdWRwbGl0ZSkgCQkJICAgICAgZG8gIHsgIFwKKwlpZiAoaXNfdWRwbGl0ZSkgU05NUF9JTkNfU1RBVFNfQkgodWRwbGl0ZV9zdGF0c19pbjYsIGZpZWxkKTsgICAgICAgICBcCisJZWxzZQkJU05NUF9JTkNfU1RBVFNfQkgodWRwX3N0YXRzX2luNiwgZmllbGQpOyAgICB9IHdoaWxlKDApCisjZGVmaW5lIFVEUDZfSU5DX1NUQVRTX1VTRVIoZmllbGQsIGlzX3VkcGxpdGUpCQkJICAgICAgIGRvIHsgICAgXAorCWlmIChpc191ZHBsaXRlKSBTTk1QX0lOQ19TVEFUU19VU0VSKHVkcGxpdGVfc3RhdHNfaW42LCBmaWVsZCk7ICAgICAgICAgXAorCWVsc2UJCVNOTVBfSU5DX1NUQVRTX1VTRVIodWRwX3N0YXRzX2luNiwgZmllbGQpOyAgICB9IHdoaWxlKDApCiAKIGludCBzbm1wNl9yZWdpc3Rlcl9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldik7CiBpbnQgc25tcDZfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldik7CkBAIC0xOTEsNyArMjEwLDcgQEAKIHN0cnVjdCBpcDZfZmxvd2xhYmVsCiB7CiAJc3RydWN0IGlwNl9mbG93bGFiZWwJKm5leHQ7Ci0JdTMyCQkJbGFiZWw7CisJX19iZTMyCQkJbGFiZWw7CiAJc3RydWN0IGluNl9hZGRyCQlkc3Q7CiAJc3RydWN0IGlwdjZfdHhvcHRpb25zCSpvcHQ7CiAJYXRvbWljX3QJCXVzZXJzOwpAQCAtMjExLDcgKzIzMCw3IEBACiAJc3RydWN0IGlwNl9mbG93bGFiZWwJKmZsOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBpcDZfZmxvd2xhYmVsCSpmbDZfc29ja19sb29rdXAoc3RydWN0IHNvY2sgKnNrLCB1MzIgbGFiZWwpOworZXh0ZXJuIHN0cnVjdCBpcDZfZmxvd2xhYmVsCSpmbDZfc29ja19sb29rdXAoc3RydWN0IHNvY2sgKnNrLCBfX2JlMzIgbGFiZWwpOwogZXh0ZXJuIHN0cnVjdCBpcHY2X3R4b3B0aW9ucwkqZmw2X21lcmdlX29wdGlvbnMoc3RydWN0IGlwdjZfdHhvcHRpb25zICogb3B0X3NwYWNlLAogCQkJCQkJICAgc3RydWN0IGlwNl9mbG93bGFiZWwgKiBmbCwKIAkJCQkJCSAgIHN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqIGZvcHQpOwpAQCAtMzc1LDIyICszOTQsMTUgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgX19pcHY2X2FkZHJfZGlmZihjb25zdCB2b2lkICp0b2tlbjEsIGNvbnN0IHZvaWQgKnRva2VuMiwgaW50IGFkZHJsZW4pCiB7Ci0JY29uc3QgX191MzIgKmExID0gdG9rZW4xLCAqYTIgPSB0b2tlbjI7CisJY29uc3QgX19iZTMyICphMSA9IHRva2VuMSwgKmEyID0gdG9rZW4yOwogCWludCBpOwogCiAJYWRkcmxlbiA+Pj0gMjsKIAogCWZvciAoaSA9IDA7IGkgPCBhZGRybGVuOyBpKyspIHsKLQkJX191MzIgeGIgPSBhMVtpXSBeIGEyW2ldOwotCQlpZiAoeGIpIHsKLQkJCWludCBqID0gMzE7Ci0KLQkJCXhiID0gbnRvaGwoeGIpOwotCQkJd2hpbGUgKCh4YiAmICgxIDw8IGopKSA9PSAwKQotCQkJCWotLTsKLQotCQkJcmV0dXJuIChpICogMzIgKyAzMSAtIGopOwotCQl9CisJCV9fYmUzMiB4YiA9IGExW2ldIF4gYTJbaV07CisJCWlmICh4YikKKwkJCXJldHVybiBpICogMzIgKyAzMiAtIGZscyhudG9obCh4YikpOwogCX0KIAogCS8qCkBAIC01NDQsNyArNTU2LDcgQEAKIAkJCQkJCSAgICAgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcl9sZW4pOwogCiBleHRlcm4gaW50IAkJCWlwdjZfcmVjdl9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGxlbik7Ci1leHRlcm4gdm9pZAkJCWlwdjZfaWNtcF9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnIsIHUxNiBwb3J0LAorZXh0ZXJuIHZvaWQJCQlpcHY2X2ljbXBfZXJyb3Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZXJyLCBfX2JlMTYgcG9ydCwKIAkJCQkJCXUzMiBpbmZvLCB1OCAqcGF5bG9hZCk7CiBleHRlcm4gdm9pZAkJCWlwdjZfbG9jYWxfZXJyb3Ioc3RydWN0IHNvY2sgKnNrLCBpbnQgZXJyLCBzdHJ1Y3QgZmxvd2kgKmZsLCB1MzIgaW5mbyk7CiAKQEAgLTU4OSw2ICs2MDEsOCBAQAogZXh0ZXJuIHZvaWQgdGNwNl9wcm9jX2V4aXQodm9pZCk7CiBleHRlcm4gaW50ICB1ZHA2X3Byb2NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHVkcDZfcHJvY19leGl0KHZvaWQpOworZXh0ZXJuIGludCAgdWRwbGl0ZTZfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgdWRwbGl0ZTZfcHJvY19leGl0KHZvaWQpOwogZXh0ZXJuIGludCAgaXB2Nl9taXNjX3Byb2NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGlwdjZfbWlzY19wcm9jX2V4aXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lweC5oIGIvaW5jbHVkZS9uZXQvaXB4LmgKaW5kZXggNWMwY2YzMy4uYzZiMmVlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXB4LmgKKysrIGIvaW5jbHVkZS9uZXQvaXB4LmgKQEAgLTE1LDkgKzE1LDkgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKIHN0cnVjdCBpcHhfYWRkcmVzcyB7Ci0JX191MzIgICBuZXQ7CisJX19iZTMyICBuZXQ7CiAJX191OCAgICBub2RlW0lQWF9OT0RFX0xFTl07IAotCV9fdTE2ICAgc29jazsKKwlfX2JlMTYgIHNvY2s7CiB9OwogCiAjZGVmaW5lIGlweF9icm9hZGNhc3Rfbm9kZQkiXDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3IgpAQCAtMjYsOSArMjYsOSBAQAogI2RlZmluZSBJUFhfTUFYX1BQUk9QX0hPUFMgOAogCiBzdHJ1Y3QgaXB4aGRyIHsKLQlfX3UxNgkJCWlweF9jaGVja3N1bSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0jZGVmaW5lIElQWF9OT19DSEVDS1NVTQkweEZGRkYKLQlfX3UxNgkJCWlweF9wa3RzaXplIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwlfX2JlMTYJCQlpcHhfY2hlY2tzdW0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2RlZmluZSBJUFhfTk9fQ0hFQ0tTVU0JX19jb25zdGFudF9odG9ucygweEZGRkYpCisJX19iZTE2CQkJaXB4X3BrdHNpemUgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCV9fdTgJCQlpcHhfdGN0cmw7CiAJX191OAkJCWlweF90eXBlOwogI2RlZmluZSBJUFhfVFlQRV9VTktOT1dOCTB4MDAKQEAgLTQ4LDE0ICs0OCwxNCBAQAogCiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSB7CiAJLyogSVBYIGFkZHJlc3MgKi8KLQlfX3UzMgkJCWlmX25ldG51bTsKKwlfX2JlMzIJCQlpZl9uZXRudW07CiAJdW5zaWduZWQgY2hhcgkJaWZfbm9kZVtJUFhfTk9ERV9MRU5dOwogCWF0b21pY190CQlyZWZjbnQ7CiAKIAkvKiBwaHlzaWNhbCBkZXZpY2UgaW5mbyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlCSppZl9kZXY7CiAJc3RydWN0IGRhdGFsaW5rX3Byb3RvCSppZl9kbGluazsKLQl1bnNpZ25lZCBzaG9ydAkJaWZfZGxpbmtfdHlwZTsKKwlfX2JlMTYJCQlpZl9kbGlua190eXBlOwogCiAJLyogc29ja2V0IHN1cHBvcnQgKi8KIAl1bnNpZ25lZCBzaG9ydAkJaWZfc2tudW07CkBAIC03MSw3ICs3MSw3IEBACiB9OwogCiBzdHJ1Y3QgaXB4X3JvdXRlIHsKLQlfX3UzMgkJCWlyX25ldDsKKwlfX2JlMzIJCQlpcl9uZXQ7CiAJc3RydWN0IGlweF9pbnRlcmZhY2UJKmlyX2ludHJmYzsKIAl1bnNpZ25lZCBjaGFyCQlpcl9yb3V0ZWQ7CiAJdW5zaWduZWQgY2hhcgkJaXJfcm91dGVyX25vZGVbSVBYX05PREVfTEVOXTsKQEAgLTgyLDEwICs4MiwxMCBAQAogI2lmZGVmIF9fS0VSTkVMX18KIHN0cnVjdCBpcHhfY2IgewogCXU4CWlweF90Y3RybDsKLQl1MzIJaXB4X2Rlc3RfbmV0OwotCXUzMglpcHhfc291cmNlX25ldDsKKwlfX2JlMzIJaXB4X2Rlc3RfbmV0OworCV9fYmUzMglpcHhfc291cmNlX25ldDsKIAlzdHJ1Y3QgewotCQl1MzIgbmV0bnVtOworCQlfX2JlMzIgbmV0bnVtOwogCQlpbnQgaW5kZXg7CiAJfSBsYXN0X2hvcDsKIH07CkBAIC05Nyw3ICs5Nyw3IEBACiAJc3RydWN0IHNvY2sJCXNrOwogCXN0cnVjdCBpcHhfYWRkcmVzcwlkZXN0X2FkZHI7CiAJc3RydWN0IGlweF9pbnRlcmZhY2UJKmludHJmYzsKLQl1bnNpZ25lZCBzaG9ydAkJcG9ydDsKKwlfX2JlMTYJCQlwb3J0OwogI2lmZGVmIENPTkZJR19JUFhfSU5URVJOCiAJdW5zaWduZWQgY2hhcgkJbm9kZVtJUFhfTk9ERV9MRU5dOwogI2VuZGlmCkBAIC0xMzIsNyArMTMyLDcgQEAKIGV4dGVybiBpbnQgaXB4X3Byb2NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGlweF9wcm9jX2V4aXQodm9pZCk7CiAKLWV4dGVybiBjb25zdCBjaGFyICppcHhfZnJhbWVfbmFtZSh1bnNpZ25lZCBzaG9ydCk7CitleHRlcm4gY29uc3QgY2hhciAqaXB4X2ZyYW1lX25hbWUoX19iZTE2KTsKIGV4dGVybiBjb25zdCBjaGFyICppcHhfZGV2aWNlX25hbWUoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYyk7CiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgaXB4aXRmX2hvbGQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lyZGEvaXJjb21tX3R0eS5oIGIvaW5jbHVkZS9uZXQvaXJkYS9pcmNvbW1fdHR5LmgKaW5kZXggODc2OTljYi4uOGRhYmRkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXJkYS9pcmNvbW1fdHR5LmgKKysrIGIvaW5jbHVkZS9uZXQvaXJkYS9pcmNvbW1fdHR5LmgKQEAgLTEyNiw3ICsxMjYsNyBAQAogZXh0ZXJuIGludCBpcmNvbW1fdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCAKIAkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gdm9pZCBpcmNvbW1fdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIAotCQkJCSAgIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcyk7CisJCQkJICAgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyk7CiBleHRlcm4gaGFzaGJpbl90ICppcmNvbW1fdHR5OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lyZGEvaXJsYW5fZmlsdGVyLmggYi9pbmNsdWRlL25ldC9pcmRhL2lybGFuX2ZpbHRlci5oCmluZGV4IDQ5MmRlZGEuLjE3MjA1MzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lyZGEvaXJsYW5fZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9uZXQvaXJkYS9pcmxhbl9maWx0ZXIuaApAQCAtMjgsNiArMjgsOCBAQAogdm9pZCBpcmxhbl9jaGVja19jb21tYW5kX3BhcmFtKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgY2hhciAqcGFyYW0sIAogCQkJICAgICAgIGNoYXIgKnZhbHVlKTsKIHZvaWQgaXJsYW5fZmlsdGVyX3JlcXVlc3Qoc3RydWN0IGlybGFuX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogdm9pZCBpcmxhbl9wcmludF9maWx0ZXIoc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBmaWx0ZXJfdHlwZSk7CisjZW5kaWYKIAogI2VuZGlmIC8qIElSTEFOX0ZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcmRhL2lybGFwX2ZyYW1lLmggYi9pbmNsdWRlL25ldC9pcmRhL2lybGFwX2ZyYW1lLmgKaW5kZXggOWRkNTRhNS4uNjQxZjg4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lyZGEvaXJsYXBfZnJhbWUuaApAQCAtOTEsOCArOTEsOCBAQAogCV9fdTggIGNhZGRyOyAvKiBDb25uZWN0aW9uIGFkZHJlc3MgKi8KIAlfX3U4ICBjb250cm9sOwogCV9fdTggIGlkZW50OyAvKiBTaG91bGQgYWx3YXlzIGJlIFhJRF9GT1JNQVQgKi8gCi0JX191MzIgc2FkZHI7IC8qIFNvdXJjZSBkZXZpY2UgYWRkcmVzcyAqLwotCV9fdTMyIGRhZGRyOyAvKiBEZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLworCV9fbGUzMiBzYWRkcjsgLyogU291cmNlIGRldmljZSBhZGRyZXNzICovCisJX19sZTMyIGRhZGRyOyAvKiBEZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLwogCV9fdTggIGZsYWdzOyAvKiBEaXNjb3ZlcnkgZmxhZ3MgKi8KIAlfX3U4ICBzbG90bnI7CiAJX191OCAgdmVyc2lvbjsKQEAgLTEwMSwxNSArMTAxLDE1IEBACiBzdHJ1Y3QgdGVzdF9mcmFtZSB7CiAJX191OCBjYWRkcjsgICAgICAgICAgLyogQ29ubmVjdGlvbiBhZGRyZXNzICovCiAJX191OCBjb250cm9sOwotCV9fdTMyIHNhZGRyOyAgICAgICAgIC8qIFNvdXJjZSBkZXZpY2UgYWRkcmVzcyAqLwotCV9fdTMyIGRhZGRyOyAgICAgICAgIC8qIERlc3RpbmF0aW9uIGRldmljZSBhZGRyZXNzICovCisJX19sZTMyIHNhZGRyOyAgICAgICAgIC8qIFNvdXJjZSBkZXZpY2UgYWRkcmVzcyAqLworCV9fbGUzMiBkYWRkcjsgICAgICAgICAvKiBEZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLwogfSBJUkRBX1BBQ0s7CiAKIHN0cnVjdCB1YV9mcmFtZSB7CiAJX191OCBjYWRkcjsKIAlfX3U4IGNvbnRyb2w7Ci0JX191MzIgc2FkZHI7IC8qIFNvdXJjZSBkZXZpY2UgYWRkcmVzcyAqLwotCV9fdTMyIGRhZGRyOyAvKiBEZXN0IGRldmljZSBhZGRyZXNzICovCisJX19sZTMyIHNhZGRyOyAvKiBTb3VyY2UgZGV2aWNlIGFkZHJlc3MgKi8KKwlfX2xlMzIgZGFkZHI7IC8qIERlc3QgZGV2aWNlIGFkZHJlc3MgKi8KIH0gSVJEQV9QQUNLOwogCiBzdHJ1Y3QgZG1fZnJhbWUgewpAQCAtMTM1LDggKzEzNSw4IEBACiBzdHJ1Y3Qgc25ybV9mcmFtZSB7CiAJX191OCAgY2FkZHI7CiAJX191OCAgY29udHJvbDsKLQlfX3UzMiBzYWRkcjsKLQlfX3UzMiBkYWRkcjsKKwlfX2xlMzIgc2FkZHI7CisJX19sZTMyIGRhZGRyOwogCV9fdTggIG5jYWRkcjsKIH0gSVJEQV9QQUNLOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcmRhL3RpbWVyLmggYi9pbmNsdWRlL25ldC9pcmRhL3RpbWVyLmgKaW5kZXggMmM1ZDg4Ni4uY2I2MTU2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXJkYS90aW1lci5oCisrKyBiL2luY2x1ZGUvbmV0L2lyZGEvdGltZXIuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBUSU1FUl9ICiAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPiAgLyogZm9yIEhaICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2xsY19wZHUuaCBiL2luY2x1ZGUvbmV0L2xsY19wZHUuaAppbmRleCA4ZjYzMDY1Li5hYTMzYTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9sbGNfcGR1LmgKKysrIGIvaW5jbHVkZS9uZXQvbGxjX3BkdS5oCkBAIC0yNTIsOSArMjUyLDkgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGxsY19wZHVfZGVjb2RlX3NhKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpzYSkKIHsKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBudG9ocyhFVEhfUF84MDJfMikpCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyXzIpKQogCQltZW1jcHkoc2EsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKLQllbHNlIGlmIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX1RSXzgwMl8yKSkgeworCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfVFJfODAyXzIpKSB7CiAJCW1lbWNweShzYSwgdHJfaGRyKHNrYiktPnNhZGRyLCBFVEhfQUxFTik7CiAJCSpzYSAmPSAweDdGOwogCX0KQEAgLTI2OSw5ICsyNjksOSBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgbGxjX3BkdV9kZWNvZGVfZGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmRhKQogewotCWlmIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QXzgwMl8yKSkKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDJfMikpCiAJCW1lbWNweShkYSwgZXRoX2hkcihza2IpLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQllbHNlIGlmIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX1RSXzgwMl8yKSkKKwllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1RSXzgwMl8yKSkKIAkJbWVtY3B5KGRhLCB0cl9oZHIoc2tiKS0+ZGFkZHIsIEVUSF9BTEVOKTsKIH0KIApAQCAtMzQ1LDcgKzM0NSw3IEBACiAJcGR1LT5jdHJsXzEgID0gTExDX1BEVV9UWVBFX1U7CiAJcGR1LT5jdHJsXzEgfD0gTExDXzFfUERVX0NNRF9URVNUOwogCXBkdS0+Y3RybF8xIHw9IExMQ19VX1BGX0JJVF9NQVNLOwotCWlmIChldl9za2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QXzgwMl8yKSkgeworCWlmIChldl9za2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMl8yKSkgewogCQlzdHJ1Y3QgbGxjX3BkdV91biAqZXZfcGR1ID0gbGxjX3BkdV91bl9oZHIoZXZfc2tiKTsKIAkJaW50IGRzaXplOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZGlzYy5oIGIvaW5jbHVkZS9uZXQvbmRpc2MuaAppbmRleCBkMzkxNWRhYi4uNDc1YjEwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmRpc2MuaAorKysgYi9pbmNsdWRlL25ldC9uZGlzYy5oCkBAIC02Niw4ICs2Niw4IEBACiAKIHN0cnVjdCByYV9tc2cgewogICAgICAgICBzdHJ1Y3QgaWNtcDZoZHIJCWljbXBoOwotCV9fdTMyCQkJcmVhY2hhYmxlX3RpbWU7Ci0JX191MzIJCQlyZXRyYW5zX3RpbWVyOworCV9fYmUzMgkJCXJlYWNoYWJsZV90aW1lOworCV9fYmUzMgkJCXJldHJhbnNfdGltZXI7CiB9OwogCiBzdHJ1Y3QgbmRfb3B0X2hkciB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZWlnaGJvdXIuaCBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCmluZGV4IGM4YWFjYmQuLjM3MjViOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCisrKyBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCkBAIC0xNjAsNyArMTYwLDcgQEAKIAlhdG9taWNfdAkJZW50cmllczsKIAlyd2xvY2tfdAkJbG9jazsKIAl1bnNpZ25lZCBsb25nCQlsYXN0X3JhbmQ7Ci0Ja21lbV9jYWNoZV90CQkqa21lbV9jYWNoZXA7CisJc3RydWN0IGttZW1fY2FjaGUJCSprbWVtX2NhY2hlcDsKIAlzdHJ1Y3QgbmVpZ2hfc3RhdGlzdGljcwkqc3RhdHM7CiAJc3RydWN0IG5laWdoYm91cgkqKmhhc2hfYnVja2V0czsKIAl1bnNpZ25lZCBpbnQJCWhhc2hfbWFzazsKQEAgLTMwOSw2ICszMDksMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbmVpZ2hfaGhfb3V0cHV0KHN0cnVjdCBoaF9jYWNoZSAqaGgsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgc2VxOworCWludCBoaF9sZW47CisKKwlkbyB7CisJCWludCBoaF9hbGVuOworCisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJmhoLT5oaF9sb2NrKTsKKwkJaGhfbGVuID0gaGgtPmhoX2xlbjsKKwkJaGhfYWxlbiA9IEhIX0RBVEFfQUxJR04oaGhfbGVuKTsKKwkJbWVtY3B5KHNrYi0+ZGF0YSAtIGhoX2FsZW4sIGhoLT5oaF9kYXRhLCBoaF9hbGVuKTsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZoaC0+aGhfbG9jaywgc2VxKSk7CisKKwlza2JfcHVzaChza2IsIGhoX2xlbik7CisJcmV0dXJuIGhoLT5oaF9vdXRwdXQoc2tiKTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmVpZ2hib3VyICoKIF9fbmVpZ2hfbG9va3VwKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCBjb25zdCB2b2lkICpwa2V5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3JlYXQpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaAppbmRleCA5MTY4NDQzLi4xNDAxY2NjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0LmgKQEAgLTksMzIgKzksMzUgQEAKICNpZm5kZWYgX05GX0NPTk5UUkFDS19JUFY0X0gKICNkZWZpbmUgX05GX0NPTk5UUkFDS19JUFY0X0gKIAotI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+CisjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5oPgogCiAvKiBwZXIgY29ubnRyYWNrOiBuYXQgYXBwbGljYXRpb24gaGVscGVyIHByaXZhdGUgZGF0YSAqLwotdW5pb24gaXBfY29ubnRyYWNrX25hdF9oZWxwIHsKK3VuaW9uIG5mX2Nvbm50cmFja19uYXRfaGVscCB7CiAgICAgICAgIC8qIGluc2VydCBuYXQgaGVscGVyIHByaXZhdGUgZGF0YSBoZXJlICovCisJc3RydWN0IG5mX25hdF9wcHRwIG5hdF9wcHRwX2luZm87CiB9OwogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX2lwdjRfbmF0IHsKLQlzdHJ1Y3QgaXBfbmF0X2luZm8gaW5mbzsKLQl1bmlvbiBpcF9jb25udHJhY2tfbmF0X2hlbHAgaGVscDsKK3N0cnVjdCBuZl9jb25uX25hdCB7CisJc3RydWN0IG5mX25hdF9pbmZvIGluZm87CisJdW5pb24gbmZfY29ubnRyYWNrX25hdF9oZWxwIGhlbHA7CiAjaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREUpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERV9NT0RVTEUpCiAJaW50IG1hc3FfaW5kZXg7CiAjZW5kaWYKIH07Ci0jZW5kaWYgLyogQ09ORklHX0lQX05GX05BVF9ORUVERUQgKi8KLQotc3RydWN0IG5mX2Nvbm50cmFja19pcHY0IHsKLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotCXN0cnVjdCBuZl9jb25udHJhY2tfaXB2NF9uYXQgKm5hdDsKLSNlbmRpZgotfTsKKyNlbmRpZiAvKiBDT05GSUdfTkZfTkFUX05FRURFRCAqLwogCiAvKiBSZXR1cm5zIG5ldyBza19idWZmLCBvciBOVUxMICovCiBzdHJ1Y3Qgc2tfYnVmZiAqCiBuZl9jdF9pcHY0X2N0X2dhdGhlcl9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAorZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b190Y3A0OworZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b191ZHA0OworZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b19pY21wOworCitleHRlcm4gaW50IG5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX2lwdjRfY29tcGF0X2Zpbmkodm9pZCk7CisKICNlbmRpZiAvKl9ORl9DT05OVFJBQ0tfSVBWNF9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9pcHY2L25mX2Nvbm50cmFja19pcHY2LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9jb25udHJhY2tfaXB2Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjYwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9jb25udHJhY2tfaXB2Ni5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19JUFY2X0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19JUFY2X0gKKworZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byBuZl9jb25udHJhY2tfbDNwcm90b19pcHY2OworCitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3RjcDY7CitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3VkcDY7CitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2NjsKKworZXh0ZXJuIGludCBuZl9jdF9pcHY2X3NraXBfZXh0aGRyKHN0cnVjdCBza19idWZmICpza2IsIGludCBzdGFydCwKKwkJCQkgIHU4ICpuZXh0aGRycCwgaW50IGxlbik7CisKK2V4dGVybiBpbnQgbmZfY3RfZnJhZzZfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG5mX2N0X2ZyYWc2X2NsZWFudXAodm9pZCk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKm5mX2N0X2ZyYWc2X2dhdGhlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiB2b2lkIG5mX2N0X2ZyYWc2X291dHB1dCh1bnNpZ25lZCBpbnQgaG9va251bSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCSAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfdGltZW91dDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfbG93X3RocmVzaDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfaGlnaF90aHJlc2g7CisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0lQVjZfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKaW5kZXggMWZiZDgxOS4uYmQwMWI0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaWNtcC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9jb25udHJhY2tfaWNtcHY2Lmg+CiAKQEAgLTMzLDYgKzM0LDcgQEAKIAlzdHJ1Y3QgaXBfY3RfdGNwIHRjcDsKIAlzdHJ1Y3QgaXBfY3RfaWNtcCBpY21wOwogCXN0cnVjdCBuZl9jdF9pY21wdjYgaWNtcHY2OworCXN0cnVjdCBuZl9jdF9ncmUgZ3JlOwogfTsKIAogdW5pb24gbmZfY29ubnRyYWNrX2V4cGVjdF9wcm90byB7CkBAIC00MSwxNSArNDMsMjAgQEAKIAogLyogQWRkIHByb3RvY29sIGhlbHBlciBpbmNsdWRlIGZpbGUgaGVyZSAqLwogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzLmg+CiAKIC8qIHBlciBjb25udHJhY2s6IGFwcGxpY2F0aW9uIGhlbHBlciBwcml2YXRlIGRhdGEgKi8KIHVuaW9uIG5mX2Nvbm50cmFja19oZWxwIHsKIAkvKiBpbnNlcnQgY29ubnRyYWNrIGhlbHBlciBwcml2YXRlIGRhdGEgKG1hc3RlcikgaGVyZSAqLwotCXN0cnVjdCBpcF9jdF9mdHBfbWFzdGVyIGN0X2Z0cF9pbmZvOworCXN0cnVjdCBuZl9jdF9mdHBfbWFzdGVyIGN0X2Z0cF9pbmZvOworCXN0cnVjdCBuZl9jdF9wcHRwX21hc3RlciBjdF9wcHRwX2luZm87CisJc3RydWN0IG5mX2N0X2gzMjNfbWFzdGVyIGN0X2gzMjNfaW5mbzsKIH07CiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAKICNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCiAjZGVmaW5lIE5GX0NUX0FTU0VSVCh4KQkJCQkJCQlcCkBAIC03OSw2ICs4Niw4IEBACiAKIAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9jb25udHJhY2tfaXB2Ni5oPgorCiBzdHJ1Y3QgbmZfY29ubgogewogCS8qIFVzYWdlIGNvdW50IGluIGhlcmUgaXMgMSBmb3IgaGFzaCB0YWJsZS9kZXN0cnVjdCB0aW1lciwgMSBwZXIgc2tiLApAQCAtMTI0LDQ0ICsxMzMsNiBAQAogCWNoYXIgZGF0YVswXTsKIH07CiAKLXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0Ci17Ci0JLyogSW50ZXJuYWwgbGlua2VkIGxpc3QgKGdsb2JhbCBleHBlY3RhdGlvbiBsaXN0KSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCS8qIFdlIGV4cGVjdCB0aGlzIHR1cGxlLCB3aXRoIHRoZSBmb2xsb3dpbmcgbWFzayAqLwotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGUsIG1hc2s7Ci0gCi0JLyogRnVuY3Rpb24gdG8gY2FsbCBhZnRlciBzZXR1cCBhbmQgaW5zZXJ0aW9uICovCi0Jdm9pZCAoKmV4cGVjdGZuKShzdHJ1Y3QgbmZfY29ubiAqbmV3LAotCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKLQotCS8qIFRoZSBjb25udHJhY2sgb2YgdGhlIG1hc3RlciBjb25uZWN0aW9uICovCi0Jc3RydWN0IG5mX2Nvbm4gKm1hc3RlcjsKLQotCS8qIFRpbWVyIGZ1bmN0aW9uOyBkZWxldGVzIHRoZSBleHBlY3RhdGlvbi4gKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OwotCi0JLyogVXNhZ2UgY291bnQuICovCi0JYXRvbWljX3QgdXNlOwotCi0JLyogVW5pcXVlIElEICovCi0JdW5zaWduZWQgaW50IGlkOwotCi0JLyogRmxhZ3MgKi8KLQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0KLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAotCS8qIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHBlci1wcm90byBwYXJ0LCB1c2VkIHRvIG1hcCB0aGUKLQkgKiBleHBlY3RlZCBjb25uZWN0aW9uIHRoZSB3YXkgdGhlIHJlY2lwaWVudCBleHBlY3RzLiAqLwotCXVuaW9uIG5mX2Nvbm50cmFja19tYW5pcF9wcm90byBzYXZlZF9wcm90bzsKLQkvKiBEaXJlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG1hc3RlciBjb25uZWN0aW9uLiAqLwotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7Ci0jZW5kaWYKLX07Ci0KLSNkZWZpbmUgTkZfQ1RfRVhQRUNUX1BFUk1BTkVOVCAweDEKLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubiAqCiBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaGFzaCkKIHsKQEAgLTIwOCwxNiArMTc5LDYgQEAKIAogZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KHN0cnVjdCBuZl9jb25uICpjdCk7CiAKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqCi1fX25mX2Nvbm50cmFja19leHBlY3RfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7Ci0KLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqCi1uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwotCi1leHRlcm4gdm9pZCBuZl9jdF91bmxpbmtfZXhwZWN0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOwotCi1leHRlcm4gdm9pZCBuZl9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKHN0cnVjdCBuZl9jb25uICpjdCk7Ci0KIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19mbHVzaCh2b2lkKTsKIAogZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKQEAgLTI4OSw4OSArMjUwLDEyIEBACiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfY2hlY2tzdW07CitleHRlcm4gYXRvbWljX3QgbmZfY29ubnRyYWNrX2NvdW50OworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfbWF4OwogCitERUNMQVJFX1BFUl9DUFUoc3RydWN0IGlwX2Nvbm50cmFja19zdGF0LCBuZl9jb25udHJhY2tfc3RhdCk7CiAjZGVmaW5lIE5GX0NUX1NUQVRfSU5DKGNvdW50KSAoX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfc3RhdCkuY291bnQrKykKIAotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTCi0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgewotCXN0cnVjdCBuZl9jb25uICpjdDsKLQl1bnNpZ25lZCBpbnQgZXZlbnRzOwotfTsKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSwgbmZfY29ubnRyYWNrX2VjYWNoZSk7Ci0KLSNkZWZpbmUgQ09OTlRSQUNLX0VDQUNIRSh4KQkoX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKS54KQotCi1leHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIG5mX2Nvbm50cmFja19jaGFpbjsKLWV4dGVybiBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgbmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbjsKLQotc3RhdGljIGlubGluZSBpbnQgbmZfY29ubnRyYWNrX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbmZfY29ubnRyYWNrX2NoYWluLCBuYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfY2hhaW4sIG5iKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW5mX2Nvbm50cmFja19leHBlY3RfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluLCBuYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1uZl9jb25udHJhY2tfZXhwZWN0X3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19leHBlY3RfY2hhaW4sCi0JCQluYik7Ci19Ci0KLWV4dGVybiB2b2lkIG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpOwotZXh0ZXJuIHZvaWQgX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KHN0cnVjdCBuZl9jb25uICpjdCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKLQkJCSBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBuZl9jb25uICpjdCA9IChzdHJ1Y3QgbmZfY29ubiAqKXNrYi0+bmZjdDsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOwotCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKG5mX2Nvbm50cmFja19lY2FjaGUpOwotCWlmIChjdCAhPSBlY2FjaGUtPmN0KQotCQlfX25mX2N0X2V2ZW50X2NhY2hlX2luaXQoY3QpOwotCWVjYWNoZS0+ZXZlbnRzIHw9IGV2ZW50OwotCWxvY2FsX2JoX2VuYWJsZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubnRyYWNrX2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKLQkJCQkgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkgJiYgIW5mX2N0X2lzX2R5aW5nKGN0KSkKLQkJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5mX2Nvbm50cmFja19jaGFpbiwgZXZlbnQsIGN0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1uZl9jb25udHJhY2tfZXhwZWN0X2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudHMgZXZlbnQsCi0JCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5mX2Nvbm50cmFja19leHBlY3RfY2hhaW4sIGV2ZW50LCBleHApOwotfQotI2Vsc2UgLyogQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoZW51bSBpcF9jb25udHJhY2tfZXZlbnRzIGV2ZW50LAotCQkJCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb25udHJhY2tfZXZlbnQoZW51bSBpcF9jb25udHJhY2tfZXZlbnRzIGV2ZW50LAotCQkJCSAgICAgIHN0cnVjdCBuZl9jb25uICpjdCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KSB7fQotc3RhdGljIGlubGluZSB2b2lkCi1uZl9jb25udHJhY2tfZXhwZWN0X2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudHMgZXZlbnQsCi0JCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApIHt9Ci0jZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KLQogLyogbm8gaGVscGVyLCBubyBuYXQgKi8KICNkZWZpbmUJTkZfQ1RfRl9CQVNJQwkwCiAvKiBmb3IgaGVscGVyICovCkBAIC0zODcsOCArMjcxLDM1IEBACiAKIC8qIHZhbGlkIGNvbWJpbmF0aW9uczoKICAqIGJhc2ljOiBuZl9jb25uLCBuZl9jb25uIC4uIG5mX2Nvbm5faGVscAotICogbmF0OiBuZl9jb25uIC4uIG5mX2Nvbm5fbmF0LCBuZl9jb25uIC4uIG5mX2Nvbm5fbmF0LCBuZl9jb25uIGhlbHAKKyAqIG5hdDogbmZfY29ubiAuLiBuZl9jb25uX25hdCwgbmZfY29ubiAuLiBuZl9jb25uX25hdCAuLiBuZl9jb25uIGhlbHAKICAqLworI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX25hdCAqbmZjdF9uYXQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IG5mX2Nvbm4pOworCisJaWYgKCEoY3QtPmZlYXR1cmVzICYgTkZfQ1RfRl9OQVQpKQorCQlyZXR1cm4gTlVMTDsKKworCW9mZnNldCA9IEFMSUdOKG9mZnNldCwgX19hbGlnbm9mX18oc3RydWN0IG5mX2Nvbm5fbmF0KSk7CisJcmV0dXJuIChzdHJ1Y3QgbmZfY29ubl9uYXQgKikgKCh2b2lkICopY3QgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uX2hlbHAgKm5mY3RfaGVscChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgbmZfY29ubik7CisKKwlpZiAoIShjdC0+ZmVhdHVyZXMgJiBORl9DVF9GX0hFTFApKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoY3QtPmZlYXR1cmVzICYgTkZfQ1RfRl9OQVQpIHsKKwkJb2Zmc2V0ID0gQUxJR04ob2Zmc2V0LCBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZfY29ubl9uYXQpKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgbmZfY29ubl9uYXQpOworCX0KKworCW9mZnNldCA9IEFMSUdOKG9mZnNldCwgX19hbGlnbm9mX18oc3RydWN0IG5mX2Nvbm5faGVscCkpOworCXJldHVybiAoc3RydWN0IG5mX2Nvbm5faGVscCAqKSAoKHZvaWQgKiljdCArIG9mZnNldCk7Cit9CisjZWxzZSAvKiBObyBOQVQgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm5faGVscCAqbmZjdF9oZWxwKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBuZl9jb25uKTsKQEAgLTM5Niw4ICszMDcsOSBAQAogCWlmICghKGN0LT5mZWF0dXJlcyAmIE5GX0NUX0ZfSEVMUCkpCiAJCXJldHVybiBOVUxMOwogCisJb2Zmc2V0ID0gQUxJR04ob2Zmc2V0LCBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZfY29ubl9oZWxwKSk7CiAJcmV0dXJuIChzdHJ1Y3QgbmZfY29ubl9oZWxwICopICgodm9pZCAqKWN0ICsgb2Zmc2V0KTsKIH0KLQorI2VuZGlmIC8qIENPTkZJR19ORl9OQVRfTkVFREVEICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0LmgKaW5kZXggZjFiMTQ4Mi4uYjljZTVjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oCkBAIC02NCw2ICs2NCwxNiBAQAogCXJldHVybiAoY3QgIT0gTlVMTCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQodW5zaWduZWQgc2hvcnQgbDNwcm90bykKK3sKKwluZWVkX2Nvbm50cmFjaygpOworCXJldHVybiBsM3Byb3RvID09IFBGX0lORVQgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQodW5zaWduZWQgc2hvcnQgbDNwcm90bykKK3sKK30KKwogI2Vsc2UgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDSyAqLwogCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0Lmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oCmluZGV4IGRhMjU0NTIuLjdmZGM3MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oCkBAIC0xMyw2ICsxMyw5IEBACiAjZGVmaW5lIF9ORl9DT05OVFJBQ0tfQ09SRV9ICiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgogCiAvKiBUaGlzIGhlYWRlciBpcyB1c2VkIHRvIHNoYXJlIGNvcmUgZnVuY3Rpb25hbGl0eSBiZXR3ZWVuIHRoZQogICAgc3RhbmRhbG9uZSBjb25uZWN0aW9uIHRyYWNraW5nIG1vZHVsZSwgYW5kIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyJ3MgdXNlCkBAIC0yOSw3ICszMiw3IEBACiAvKiBMaWtlIGFib3ZlLCBidXQgeW91IGFscmVhZHkgaGF2ZSBjb25udHJhY2sgcmVhZCBsb2NrLiAqLwogZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqX19uZl9jdF9maW5kX2wzcHJvdG8odV9pbnQxNl90IGwzcHJvdG8pOwogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sOworc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvOwogCiBleHRlcm4gaW50CiBuZl9jdF9nZXRfdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTM5LDEzICs0MiwxMyBAQAogCQl1X2ludDhfdCBwcm90b251bSwKIAkJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCiAJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bywKLQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG9jb2wpOworCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8pOwogCiBleHRlcm4gaW50CiBuZl9jdF9pbnZlcnRfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKIAkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZywKIAkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAotCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCk7CisJCSAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90byk7CiAKIC8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgpAQCAtNzAsNyArNzMsMTQgQEAKIAogZXh0ZXJuIHZvaWQgX19uZl9jb25udHJhY2tfYXR0YWNoKHN0cnVjdCBza19idWZmICpuc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAoraW50CitwcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8sCisJICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqcHJvdG8pOworCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCAqbmZfY29ubnRyYWNrX2hhc2g7CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBuZl9jb25udHJhY2tfZXhwZWN0X2xpc3Q7CiBleHRlcm4gcndsb2NrX3QgbmZfY29ubnRyYWNrX2xvY2sgOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdW5jb25maXJtZWQ7CisKICNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyYThhOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIGNvbm5lY3Rpb24gdHJhY2tpbmcgZXZlbnQgY2FjaGUuCisgKi8KKworI2lmbmRlZiBfTkZfQ09OTlRSQUNLX0VDQUNIRV9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfRUNBQ0hFX0gKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorCisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSB7CisJc3RydWN0IG5mX2Nvbm4gKmN0OworCXVuc2lnbmVkIGludCBldmVudHM7Cit9OworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlLCBuZl9jb25udHJhY2tfZWNhY2hlKTsKKworI2RlZmluZSBDT05OVFJBQ0tfRUNBQ0hFKHgpCShfX2dldF9jcHVfdmFyKG5mX2Nvbm50cmFja19lY2FjaGUpLngpCisKK2V4dGVybiBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgbmZfY29ubnRyYWNrX2NoYWluOworZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluOworCitzdGF0aWMgaW5saW5lIGludCBuZl9jb25udHJhY2tfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfY2hhaW4sIG5iKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19jaGFpbiwgbmIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZfY29ubnRyYWNrX2V4cGVjdF9yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19leHBlY3RfY2hhaW4sIG5iKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mX2Nvbm50cmFja19leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbiwKKwkJCW5iKTsKK30KKworZXh0ZXJuIHZvaWQgbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCk7CitleHRlcm4gdm9pZCBfX25mX2N0X2V2ZW50X2NhY2hlX2luaXQoc3RydWN0IG5mX2Nvbm4gKmN0KTsKK2V4dGVybiB2b2lkIG5mX2N0X2V2ZW50X2NhY2hlX2ZsdXNoKHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK25mX2Nvbm50cmFja19ldmVudF9jYWNoZShlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCisJCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmZfY29ubiAqY3QgPSAoc3RydWN0IG5mX2Nvbm4gKilza2ItPm5mY3Q7CisJc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwllY2FjaGUgPSAmX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKTsKKwlpZiAoY3QgIT0gZWNhY2hlLT5jdCkKKwkJX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KGN0KTsKKwllY2FjaGUtPmV2ZW50cyB8PSBldmVudDsKKwlsb2NhbF9iaF9lbmFibGUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19ldmVudChlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCisJCQkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCWlmIChuZl9jdF9pc19jb25maXJtZWQoY3QpICYmICFuZl9jdF9pc19keWluZyhjdCkpCisJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZuZl9jb25udHJhY2tfY2hhaW4sIGV2ZW50LCBjdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZfY29ubnRyYWNrX2V4cGVjdF9ldmVudChlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIGV2ZW50LAorCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluLCBldmVudCwgZXhwKTsKK30KKworI2Vsc2UgLyogQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19ldmVudF9jYWNoZShlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fQorc3RhdGljIGlubGluZSB2b2lkIG5mX2Nvbm50cmFja19ldmVudChlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCisJCQkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0KSB7fQorc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQKK25mX2Nvbm50cmFja19leHBlY3RfZXZlbnQoZW51bSBpcF9jb25udHJhY2tfZXhwZWN0X2V2ZW50cyBldmVudCwKKwkJCSAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9ldmVudF9jYWNoZV9mbHVzaCh2b2lkKSB7fQorI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTICovCisKKyNlbmRpZiAvKl9ORl9DT05OVFJBQ0tfRUNBQ0hFX0gqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWJjYzllCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogY29ubmVjdGlvbiB0cmFja2luZyBleHBlY3RhdGlvbnMuCisgKi8KKworI2lmbmRlZiBfTkZfQ09OTlRSQUNLX0VYUEVDVF9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfRVhQRUNUX0gKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBuZl9jb25udHJhY2tfZXhwZWN0X2xpc3Q7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKm5mX2Nvbm50cmFja19leHBlY3RfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXhwX2ZpbGVfb3BzOworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdAoreworCS8qIEludGVybmFsIGxpbmtlZCBsaXN0IChnbG9iYWwgZXhwZWN0YXRpb24gbGlzdCkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBXZSBleHBlY3QgdGhpcyB0dXBsZSwgd2l0aCB0aGUgZm9sbG93aW5nIG1hc2sgKi8KKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlLCBtYXNrOworCisJLyogRnVuY3Rpb24gdG8gY2FsbCBhZnRlciBzZXR1cCBhbmQgaW5zZXJ0aW9uICovCisJdm9pZCAoKmV4cGVjdGZuKShzdHJ1Y3QgbmZfY29ubiAqbmV3LAorCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKKworCS8qIEhlbHBlciB0byBhc3NpZ24gdG8gbmV3IGNvbm5lY3Rpb24gKi8KKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOworCisJLyogVGhlIGNvbm50cmFjayBvZiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gKi8KKwlzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyOworCisJLyogVGltZXIgZnVuY3Rpb247IGRlbGV0ZXMgdGhlIGV4cGVjdGF0aW9uLiAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7CisKKwkvKiBVc2FnZSBjb3VudC4gKi8KKwlhdG9taWNfdCB1c2U7CisKKwkvKiBVbmlxdWUgSUQgKi8KKwl1bnNpZ25lZCBpbnQgaWQ7CisKKwkvKiBGbGFncyAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisJX19iZTMyIHNhdmVkX2lwOworCS8qIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHBlci1wcm90byBwYXJ0LCB1c2VkIHRvIG1hcCB0aGUKKwkgKiBleHBlY3RlZCBjb25uZWN0aW9uIHRoZSB3YXkgdGhlIHJlY2lwaWVudCBleHBlY3RzLiAqLworCXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8gc2F2ZWRfcHJvdG87CisJLyogRGlyZWN0aW9uIHJlbGF0aXZlIHRvIHRoZSBtYXN0ZXIgY29ubmVjdGlvbi4gKi8KKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyOworI2VuZGlmCit9OworCisjZGVmaW5lIE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQgMHgxCisKKworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgorX19uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqCituZl9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKKworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgorZmluZF9leHBlY3RhdGlvbihjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CisKK3ZvaWQgbmZfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKK3ZvaWQgbmZfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyhzdHJ1Y3QgbmZfY29ubiAqY3QpOwordm9pZCBuZl9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKKworLyogQWxsb2NhdGUgc3BhY2UgZm9yIGFuIGV4cGVjdGF0aW9uOiB0aGlzIGlzIG1hbmRhdG9yeSBiZWZvcmUgY2FsbGluZworICAgbmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkLiAgWW91IHdpbGwgaGF2ZSB0byBjYWxsIHB1dCBhZnRlcndhcmRzLiAqLworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKm5mX2Nvbm50cmFja19leHBlY3RfYWxsb2Moc3RydWN0IG5mX2Nvbm4gKm1lKTsKK3ZvaWQgbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICosIGludCwKKwkJCSAgICAgIHVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzICosCisJCQkgICAgICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqLAorCQkJICAgICAgdV9pbnQ4X3QsIF9fYmUxNiAqLCBfX2JlMTYgKik7Cit2b2lkIG5mX2Nvbm50cmFja19leHBlY3RfcHV0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOworaW50IG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0KTsKKworI2VuZGlmIC8qX05GX0NPTk5UUkFDS19FWFBFQ1RfSCovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oCmluZGV4IDg2ZWM4MTcuLjhjNzJhYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaApAQCAtMzQsMjAgKzM0LDIyIEBACiAJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGNvbm50cmFja2luZm8pOwogCisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBuZl9jb25uICpjdCk7CisKIAlpbnQgKCp0b19uZmF0dHIpKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCk7CiB9OwogCitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgorX19uZl9jdF9oZWxwZXJfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CisKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqCituZl9jdF9oZWxwZXJfZmluZF9nZXQoIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKKworZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKK19fbmZfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQgbmZfY3RfaGVscGVyX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyKTsKIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqKTsKIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqKTsKIAotLyogQWxsb2NhdGUgc3BhY2UgZm9yIGFuIGV4cGVjdGF0aW9uOiB0aGlzIGlzIG1hbmRhdG9yeSBiZWZvcmUgY2FsbGluZwotICAgbmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkLiAgWW91IHdpbGwgaGF2ZSB0byBjYWxsIHB1dCBhZnRlcndhcmRzLiAqLwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICoKLW5mX2Nvbm50cmFja19leHBlY3RfYWxsb2Moc3RydWN0IG5mX2Nvbm4gKm1hc3Rlcik7Ci1leHRlcm4gdm9pZCBuZl9jb25udHJhY2tfZXhwZWN0X3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLQotLyogQWRkIGFuIGV4cGVjdGVkIGNvbm5lY3Rpb246IGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgcGVyIGNvbm5lY3Rpb24gKi8KLWV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApOwotZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCk7Ci0KICNlbmRpZiAvKl9ORl9DT05OVFJBQ0tfSEVMUEVSX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaAppbmRleCBkYWM0M2IxLi42NjRkZGNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaApAQCAtMTgsOSArMTgsNiBAQAogCiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8KIHsKLQkvKiBOZXh0IHBvaW50ZXIuICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCiAJLyogTDMgUHJvdG9jb2wgRmFtaWx5IG51bWJlci4gZXgpIFBGX0lORVQgKi8KIAl1X2ludDE2X3QgbDNwcm90bzsKIApAQCAtNzgsNiArNzUsMTIgQEAKIAlpbnQgKCpuZmF0dHJfdG9fdHVwbGUpKHN0cnVjdCBuZmF0dHIgKnRiW10sCiAJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCk7CiAKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIJKmN0bF90YWJsZV9oZWFkZXI7CisJc3RydWN0IGN0bF90YWJsZQkqY3RsX3RhYmxlX3BhdGg7CisJc3RydWN0IGN0bF90YWJsZQkqY3RsX3RhYmxlOworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKwogCS8qIE1vZHVsZSAoaWYgYW55KSB3aGljaCB0aGlzIGlzIGNvbm5lY3RlZCB0by4gKi8KIAlzdHJ1Y3QgbW9kdWxlICptZTsKIH07CkBAIC04Niw3ICs4OSw3IEBACiAKIC8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2wzcHJvdG9fcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90byk7Ci1leHRlcm4gdm9pZCBuZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pOworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pOwogCiBleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICoKIG5mX2N0X2wzcHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8pOwpAQCAtOTYsMTMgKzk5LDEzIEBACiAvKiBFeGlzdGluZyBidWlsdC1pbiBwcm90b2NvbHMgKi8KIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NDsKIGV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NjsKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2dlbmVyaWNfbDNwcm90bzsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYzsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKgogX19uZl9jdF9sM3Byb3RvX2ZpbmQodV9pbnQxNl90IGwzcHJvdG8pCiB7CiAJaWYgKHVubGlrZWx5KGwzcHJvdG8gPj0gQUZfTUFYKSkKLQkJcmV0dXJuICZuZl9jb25udHJhY2tfZ2VuZXJpY19sM3Byb3RvOworCQlyZXR1cm4gJm5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWM7CiAJcmV0dXJuIG5mX2N0X2wzcHJvdG9zW2wzcHJvdG9dOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOGFmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIEhlYWRlciBmb3IgdXNlIGluIGRlZmluaW5nIGEgZ2l2ZW4gTDQgcHJvdG9jb2wgZm9yIGNvbm5lY3Rpb24gdHJhY2tpbmcuCisgKgorICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+CisgKgktIGdlbmVyYWxpemVkIEwzIHByb3RvY29sIGRlcGVuZGVudCBwYXJ0LgorICoKKyAqIERlcml2ZWQgZnJvbSBpbmNsdWRlL2xpbnV4L25ldGZpdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3Rjb2wuaAorICovCisKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19MNFBST1RPX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19MNFBST1RPX0gKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorCitzdHJ1Y3Qgc2VxX2ZpbGU7CitzdHJ1Y3QgbmZhdHRyOworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8KK3sKKwkvKiBMMyBQcm90b2NvbCBudW1iZXIuICovCisJdV9pbnQxNl90IGwzcHJvdG87CisKKwkvKiBMNCBQcm90b2NvbCBudW1iZXIuICovCisJdV9pbnQ4X3QgbDRwcm90bzsKKworCS8qIFByb3RvY29sIG5hbWUgKi8KKwljb25zdCBjaGFyICpuYW1lOworCisJLyogVHJ5IHRvIGZpbGwgaW4gdGhlIHRoaXJkIGFyZzogZGF0YW9mZiBpcyBvZmZzZXQgcGFzdCBuZXR3b3JrIHByb3RvY29sCisgICAgICAgICAgIGhkci4gIFJldHVybiB0cnVlIGlmIHBvc3NpYmxlLiAqLworCWludCAoKnBrdF90b190dXBsZSkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKKwkJCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CisKKwkvKiBJbnZlcnQgdGhlIHBlci1wcm90byBwYXJ0IG9mIHRoZSB0dXBsZTogaWUuIHR1cm4geG1pdCBpbnRvIHJlcGx5LgorCSAqIFNvbWUgcGFja2V0cyBjYW4ndCBiZSBpbnZlcnRlZDogcmV0dXJuIDAgaW4gdGhhdCBjYXNlLgorCSAqLworCWludCAoKmludmVydF90dXBsZSkoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnKTsKKworCS8qIFByaW50IG91dCB0aGUgcGVyLXByb3RvY29sIHBhcnQgb2YgdGhlIHR1cGxlLiBSZXR1cm4gbGlrZSBzZXFfKiAqLworCWludCAoKnByaW50X3R1cGxlKShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICopOworCisJLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KKwlpbnQgKCpwcmludF9jb25udHJhY2spKHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKik7CisKKwkvKiBSZXR1cm5zIHZlcmRpY3QgZm9yIHBhY2tldCwgb3IgLTEgZm9yIGludmFsaWQuICovCisJaW50ICgqcGFja2V0KShzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrLAorCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKKwkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgIGludCBwZiwKKwkJICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pOworCisJLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZDsKKwkgKiByZXR1cm5zIFRSVUUgaWYgaXQncyBPSy4gIElmIHNvLCBwYWNrZXQoKSBjYWxsZWQgbmV4dC4gKi8KKwlpbnQgKCpuZXcpKHN0cnVjdCBuZl9jb25uICpjb25udHJhY2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgIHVuc2lnbmVkIGludCBkYXRhb2ZmKTsKKworCS8qIENhbGxlZCB3aGVuIGEgY29ubnRyYWNrIGVudHJ5IGlzIGRlc3Ryb3llZCAqLworCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrKTsKKworCWludCAoKmVycm9yKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKKwkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCisJCSAgICAgaW50IHBmLCB1bnNpZ25lZCBpbnQgaG9va251bSk7CisKKwkvKiBjb252ZXJ0IHByb3RvaW5mbyB0byBuZm5ldGluayBhdHRyaWJ1dGVzICovCisJaW50ICgqdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZhdHRyICpuZmEsCisJCQkgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KTsKKworCS8qIGNvbnZlcnQgbmZuZXRsaW5rIGF0dHJpYnV0ZXMgdG8gcHJvdG9pbmZvICovCisJaW50ICgqZnJvbV9uZmF0dHIpKHN0cnVjdCBuZmF0dHIgKnRiW10sIHN0cnVjdCBuZl9jb25uICpjdCk7CisKKwlpbnQgKCp0dXBsZV90b19uZmF0dHIpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCk7CisJaW50ICgqbmZhdHRyX3RvX3R1cGxlKShzdHJ1Y3QgbmZhdHRyICp0YltdLAorCQkJICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyCSoqY3RsX3RhYmxlX2hlYWRlcjsKKwlzdHJ1Y3QgY3RsX3RhYmxlCSpjdGxfdGFibGU7CisJdW5zaWduZWQgaW50CQkqY3RsX3RhYmxlX3VzZXJzOworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKKwlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlcgkqY3RsX2NvbXBhdF90YWJsZV9oZWFkZXI7CisJc3RydWN0IGN0bF90YWJsZQkqY3RsX2NvbXBhdF90YWJsZTsKKyNlbmRpZgorI2VuZGlmCisKKwkvKiBNb2R1bGUgKGlmIGFueSkgd2hpY2ggdGhpcyBpcyBjb25uZWN0ZWQgdG8uICovCisJc3RydWN0IG1vZHVsZSAqbWU7Cit9OworCisvKiBFeGlzdGluZyBidWlsdC1pbiBwcm90b2NvbHMgKi8KK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNjsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNDsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNjsKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYzsKKworI2RlZmluZSBNQVhfTkZfQ1RfUFJPVE8gMjU2CitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoqbmZfY3RfcHJvdG9zW1BGX01BWF07CisKK2V4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKgorX19uZl9jdF9sNHByb3RvX2ZpbmQodV9pbnQxNl90IGwzcHJvdG8sIHVfaW50OF90IGw0cHJvdG8pOworCitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoKK25mX2N0X2w0cHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8sIHVfaW50OF90IHByb3RvY29sKTsKKworZXh0ZXJuIHZvaWQgbmZfY3RfbDRwcm90b19wdXQoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpwKTsKKworLyogUHJvdG9jb2wgcmVnaXN0cmF0aW9uLiAqLworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfbDRwcm90b19yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKnByb3RvKTsKK2V4dGVybiBpbnQgbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKnByb3RvKTsKKworLyogR2VuZXJpYyBuZXRsaW5rIGhlbHBlcnMgKi8KK2V4dGVybiBpbnQgbmZfY3RfcG9ydF90dXBsZV90b19uZmF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CitleHRlcm4gaW50IG5mX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlKHN0cnVjdCBuZmF0dHIgKnRiW10sCisJCQkJICAgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCk7CisKKy8qIExvZyBpbnZhbGlkIHBhY2tldHMgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfbG9nX2ludmFsaWQ7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisjaWZkZWYgREVCVUdfSU5WQUxJRF9QQUNLRVRTCisjZGVmaW5lIExPR19JTlZBTElEKHByb3RvKSBcCisJKG5mX2N0X2xvZ19pbnZhbGlkID09IChwcm90bykgfHwgbmZfY3RfbG9nX2ludmFsaWQgPT0gSVBQUk9UT19SQVcpCisjZWxzZQorI2RlZmluZSBMT0dfSU5WQUxJRChwcm90bykgXAorCSgobmZfY3RfbG9nX2ludmFsaWQgPT0gKHByb3RvKSB8fCBuZl9jdF9sb2dfaW52YWxpZCA9PSBJUFBST1RPX1JBVykgXAorCSAmJiBuZXRfcmF0ZWxpbWl0KCkpCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIExPR19JTlZBTElEKHByb3RvKSAwCisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCisjZW5kaWYgLypfTkZfQ09OTlRSQUNLX1BST1RPQ09MX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b2NvbC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjMzNzM3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogSGVhZGVyIGZvciB1c2UgaW4gZGVmaW5pbmcgYSBnaXZlbiBwcm90b2NvbCBmb3IgY29ubmVjdGlvbiB0cmFja2luZy4KLSAqCi0gKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gZ2VuZXJhbGl6ZWQgTDMgcHJvdG9jb2wgZGVwZW5kZW50IHBhcnQuCi0gKgotICogRGVyaXZlZCBmcm9tIGluY2x1ZGUvbGludXgvbmV0Zml0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdGNvbC5oCi0gKi8KLQotI2lmbmRlZiBfTkZfQ09OTlRSQUNLX1BST1RPQ09MX0gKLSNkZWZpbmUgX05GX0NPTk5UUkFDS19QUk9UT0NPTF9ICi0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KLQotc3RydWN0IHNlcV9maWxlOwotc3RydWN0IG5mYXR0cjsKLQotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbAotewotCS8qIE5leHQgcG9pbnRlci4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQkvKiBMMyBQcm90b2NvbCBudW1iZXIuICovCi0JdV9pbnQxNl90IGwzcHJvdG87Ci0KLQkvKiBQcm90b2NvbCBudW1iZXIuICovCi0JdV9pbnQ4X3QgcHJvdG87Ci0KLQkvKiBQcm90b2NvbCBuYW1lICovCi0JY29uc3QgY2hhciAqbmFtZTsKLQotCS8qIFRyeSB0byBmaWxsIGluIHRoZSB0aGlyZCBhcmc6IGRhdGFvZmYgaXMgb2Zmc2V0IHBhc3QgbmV0d29yayBwcm90b2NvbAotICAgICAgICAgICBoZHIuICBSZXR1cm4gdHJ1ZSBpZiBwb3NzaWJsZS4gKi8KLQlpbnQgKCpwa3RfdG9fdHVwbGUpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCQkgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwotCi0JLyogSW52ZXJ0IHRoZSBwZXItcHJvdG8gcGFydCBvZiB0aGUgdHVwbGU6IGllLiB0dXJuIHhtaXQgaW50byByZXBseS4KLQkgKiBTb21lIHBhY2tldHMgY2FuJ3QgYmUgaW52ZXJ0ZWQ6IHJldHVybiAwIGluIHRoYXQgY2FzZS4KLQkgKi8KLQlpbnQgKCppbnZlcnRfdHVwbGUpKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZyk7Ci0KLQkvKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gUmV0dXJuIGxpa2Ugc2VxXyogKi8KLQlpbnQgKCpwcmludF90dXBsZSkoc3RydWN0IHNlcV9maWxlICpzLAotCQkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqKTsKLQotCS8qIFByaW50IG91dCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBjb25udHJhY2suICovCi0JaW50ICgqcHJpbnRfY29ubnRyYWNrKShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGNvbnN0IHN0cnVjdCBuZl9jb25uICopOwotCi0JLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLwotCWludCAoKnBhY2tldCkoc3RydWN0IG5mX2Nvbm4gKmNvbm50cmFjaywKLQkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICBpbnQgcGYsCi0JCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKLQotCS8qIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoaXMgcHJvdG9jb2wgZm91bmQ7Ci0JICogcmV0dXJucyBUUlVFIGlmIGl0J3MgT0suICBJZiBzbywgcGFja2V0KCkgY2FsbGVkIG5leHQuICovCi0JaW50ICgqbmV3KShzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICB1bnNpZ25lZCBpbnQgZGF0YW9mZik7Ci0KLQkvKiBDYWxsZWQgd2hlbiBhIGNvbm50cmFjayBlbnRyeSBpcyBkZXN0cm95ZWQgKi8KLQl2b2lkICgqZGVzdHJveSkoc3RydWN0IG5mX2Nvbm4gKmNvbm50cmFjayk7Ci0KLQlpbnQgKCplcnJvcikoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvLAotCQkgICAgIGludCBwZiwgdW5zaWduZWQgaW50IGhvb2tudW0pOwotCi0JLyogY29udmVydCBwcm90b2luZm8gdG8gbmZuZXRpbmsgYXR0cmlidXRlcyAqLwotCWludCAoKnRvX25mYXR0cikoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mYXR0ciAqbmZhLAotCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCk7Ci0KLQkvKiBjb252ZXJ0IG5mbmV0bGluayBhdHRyaWJ1dGVzIHRvIHByb3RvaW5mbyAqLwotCWludCAoKmZyb21fbmZhdHRyKShzdHJ1Y3QgbmZhdHRyICp0YltdLCBzdHJ1Y3QgbmZfY29ubiAqY3QpOwotCi0JaW50ICgqdHVwbGVfdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpOwotCWludCAoKm5mYXR0cl90b190dXBsZSkoc3RydWN0IG5mYXR0ciAqdGJbXSwKLQkJCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0KTsKLQotCS8qIE1vZHVsZSAoaWYgYW55KSB3aGljaCB0aGlzIGlzIGNvbm5lY3RlZCB0by4gKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07Ci0KLS8qIEV4aXN0aW5nIGJ1aWx0LWluIHByb3RvY29scyAqLwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDY7Ci1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNDsKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA2OwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2w7Ci0KLSNkZWZpbmUgTUFYX05GX0NUX1BST1RPIDI1NgotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKipuZl9jdF9wcm90b3NbUEZfTUFYXTsKLQotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKgotX19uZl9jdF9wcm90b19maW5kKHVfaW50MTZfdCBsM3Byb3RvLCB1X2ludDhfdCBwcm90b2NvbCk7Ci0KLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICoKLW5mX2N0X3Byb3RvX2ZpbmRfZ2V0KHVfaW50MTZfdCBsM3Byb3RvLCB1X2ludDhfdCBwcm90b2NvbCk7Ci0KLWV4dGVybiB2b2lkIG5mX2N0X3Byb3RvX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwKTsKLQotLyogUHJvdG9jb2wgcmVnaXN0cmF0aW9uLiAqLwotZXh0ZXJuIGludCBuZl9jb25udHJhY2tfcHJvdG9jb2xfcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pOwotZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pOwotCi0vKiBHZW5lcmljIG5ldGxpbmsgaGVscGVycyAqLwotZXh0ZXJuIGludCBuZl9jdF9wb3J0X3R1cGxlX3RvX25mYXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKLWV4dGVybiBpbnQgbmZfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUoc3RydWN0IG5mYXR0ciAqdGJbXSwKLQkJCQkgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0KTsKLQotLyogTG9nIGludmFsaWQgcGFja2V0cyAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9sb2dfaW52YWxpZDsKLQotI2lmZGVmIENPTkZJR19TWVNDVEwKLSNpZmRlZiBERUJVR19JTlZBTElEX1BBQ0tFVFMKLSNkZWZpbmUgTE9HX0lOVkFMSUQocHJvdG8pIFwKLQkobmZfY3RfbG9nX2ludmFsaWQgPT0gKHByb3RvKSB8fCBuZl9jdF9sb2dfaW52YWxpZCA9PSBJUFBST1RPX1JBVykKLSNlbHNlCi0jZGVmaW5lIExPR19JTlZBTElEKHByb3RvKSBcCi0JKChuZl9jdF9sb2dfaW52YWxpZCA9PSAocHJvdG8pIHx8IG5mX2N0X2xvZ19pbnZhbGlkID09IElQUFJPVE9fUkFXKSBcCi0JICYmIG5ldF9yYXRlbGltaXQoKSkKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgTE9HX0lOVkFMSUQocHJvdG8pIDAKLSNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCi0KLSNlbmRpZiAvKl9ORl9DT05OVFJBQ0tfUFJPVE9DT0xfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKaW5kZXggNTMwZWYxZi4uNWQ3MmIxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaApAQCAtMjQsMTAgKzI0LDEwIEBACiAKIC8qIFRoZSBsMyBwcm90b2NvbC1zcGVjaWZpYyBtYW5pcHVsYWJsZSBwYXJ0cyBvZiB0aGUgdHVwbGU6IGFsd2F5cyBpbgogICAgbmV0d29yayBvcmRlciEgKi8KLXVuaW9uIG5mX2Nvbm50cmFja19tYW5fbDNwcm90byB7Cit1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyB7CiAJdV9pbnQzMl90IGFsbFtORl9DVF9UVVBMRV9MM1NJWkVdOwotCXVfaW50MzJfdCBpcDsKLQl1X2ludDMyX3QgaXA2WzRdOworCV9fYmUzMiBpcDsKKwlfX2JlMzIgaXA2WzRdOwogfTsKIAogLyogVGhlIHByb3RvY29sLXNwZWNpZmljIG1hbmlwdWxhYmxlIHBhcnRzIG9mIHRoZSB0dXBsZTogYWx3YXlzIGluCkBAIC0zOCwyMyArMzgsMjYgQEAKIAl1X2ludDE2X3QgYWxsOwogCiAJc3RydWN0IHsKLQkJdV9pbnQxNl90IHBvcnQ7CisJCV9fYmUxNiBwb3J0OwogCX0gdGNwOwogCXN0cnVjdCB7Ci0JCXVfaW50MTZfdCBwb3J0OworCQlfX2JlMTYgcG9ydDsKIAl9IHVkcDsKIAlzdHJ1Y3QgewotCQl1X2ludDE2X3QgaWQ7CisJCV9fYmUxNiBpZDsKIAl9IGljbXA7CiAJc3RydWN0IHsKLQkJdV9pbnQxNl90IHBvcnQ7CisJCV9fYmUxNiBwb3J0OwogCX0gc2N0cDsKKwlzdHJ1Y3QgeworCQlfX2JlMTYga2V5OwkvKiBHUkUga2V5IGlzIDMyYml0LCBQUHRQIG9ubHkgdXNlcyAxNmJpdCAqLworCX0gZ3JlOwogfTsKIAogLyogVGhlIG1hbmlwdWxhYmxlIHBhcnQgb2YgdGhlIHR1cGxlLiAqLwogc3RydWN0IG5mX2Nvbm50cmFja19tYW4KIHsKLQl1bmlvbiBuZl9jb25udHJhY2tfbWFuX2wzcHJvdG8gdTM7CisJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgdTM7CiAJdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byB1OwogCS8qIExheWVyIDMgcHJvdG9jb2wgKi8KIAl1X2ludDE2X3QgbDNudW07CkBAIC02NywyNyArNzAsMjYgQEAKIAogCS8qIFRoZXNlIGFyZSB0aGUgcGFydHMgb2YgdGhlIHR1cGxlIHdoaWNoIGFyZSBmaXhlZC4gKi8KIAlzdHJ1Y3QgewotCQl1bmlvbiB7Ci0JCQl1X2ludDMyX3QgYWxsW05GX0NUX1RVUExFX0wzU0laRV07Ci0JCQl1X2ludDMyX3QgaXA7Ci0JCQl1X2ludDMyX3QgaXA2WzRdOwotCQl9IHUzOworCQl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyB1MzsKIAkJdW5pb24gewogCQkJLyogQWRkIG90aGVyIHByb3RvY29scyBoZXJlLiAqLwogCQkJdV9pbnQxNl90IGFsbDsKIAogCQkJc3RydWN0IHsKLQkJCQl1X2ludDE2X3QgcG9ydDsKKwkJCQlfX2JlMTYgcG9ydDsKIAkJCX0gdGNwOwogCQkJc3RydWN0IHsKLQkJCQl1X2ludDE2X3QgcG9ydDsKKwkJCQlfX2JlMTYgcG9ydDsKIAkJCX0gdWRwOwogCQkJc3RydWN0IHsKIAkJCQl1X2ludDhfdCB0eXBlLCBjb2RlOwogCQkJfSBpY21wOwogCQkJc3RydWN0IHsKLQkJCQl1X2ludDE2X3QgcG9ydDsKKwkJCQlfX2JlMTYgcG9ydDsKIAkJCX0gc2N0cDsKKwkJCXN0cnVjdCB7CisJCQkJX19iZTE2IGtleTsKKwkJCX0gZ3JlOwogCQl9IHU7CiAKIAkJLyogVGhlIHByb3RvY29sLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzYyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0LmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfTkZfTkFUX0gKKyNkZWZpbmUgX05GX05BVF9ICisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgorCisjZGVmaW5lIE5GX05BVF9NQVBQSU5HX1RZUEVfTUFYX05BTUVMRU4gMTYKKworZW51bSBuZl9uYXRfbWFuaXBfdHlwZQoreworCUlQX05BVF9NQU5JUF9TUkMsCisJSVBfTkFUX01BTklQX0RTVAorfTsKKworLyogU1JDIG1hbmlwIG9jY3VycyBQT1NUX1JPVVRJTkcgb3IgTE9DQUxfSU4gKi8KKyNkZWZpbmUgSE9PSzJNQU5JUChob29rbnVtKSAoKGhvb2tudW0pICE9IE5GX0lQX1BPU1RfUk9VVElORyAmJiAoaG9va251bSkgIT0gTkZfSVBfTE9DQUxfSU4pCisKKyNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQorI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKKworLyogTkFUIHNlcXVlbmNlIG51bWJlciBtb2RpZmljYXRpb25zICovCitzdHJ1Y3QgbmZfbmF0X3NlcSB7CisJLyogcG9zaXRpb24gb2YgdGhlIGxhc3QgVENQIHNlcXVlbmNlIG51bWJlciBtb2RpZmljYXRpb24gKGlmIGFueSkgKi8KKwl1X2ludDMyX3QgY29ycmVjdGlvbl9wb3M7CisKKwkvKiBzZXF1ZW5jZSBudW1iZXIgb2Zmc2V0IGJlZm9yZSBhbmQgYWZ0ZXIgbGFzdCBtb2RpZmljYXRpb24gKi8KKwlpbnQxNl90IG9mZnNldF9iZWZvcmUsIG9mZnNldF9hZnRlcjsKK307CisKKy8qIFNpbmdsZSByYW5nZSBzcGVjaWZpY2F0aW9uLiAqLworc3RydWN0IG5mX25hdF9yYW5nZQoreworCS8qIFNldCB0byBPUiBvZiBmbGFncyBhYm92ZS4gKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwkvKiBJbmNsdXNpdmU6IG5ldHdvcmsgb3JkZXIuICovCisJX19iZTMyIG1pbl9pcCwgbWF4X2lwOworCisJLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyICovCisJdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byBtaW4sIG1heDsKK307CisKKy8qIEZvciBiYWNrd2FyZHMgY29tcGF0OiBkb24ndCB1c2UgaW4gbW9kZXJuIGNvZGUuICovCitzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdAoreworCXVuc2lnbmVkIGludCByYW5nZXNpemU7IC8qIE11c3QgYmUgMS4gKi8KKworCS8qIGhhbmdzIG9mZiBlbmQuICovCisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZVsxXTsKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisvKiBUaGUgc3RydWN0dXJlIGVtYmVkZGVkIGluIHRoZSBjb25udHJhY2sgc3RydWN0dXJlLiAqLworc3RydWN0IG5mX25hdF9pbmZvCit7CisJc3RydWN0IGxpc3RfaGVhZCBieXNvdXJjZTsKKwlzdHJ1Y3QgbmZfbmF0X3NlcSBzZXFbSVBfQ1RfRElSX01BWF07Cit9OworCitzdHJ1Y3QgbmZfY29ubjsKKworLyogU2V0IHVwIHRoZSBpbmZvIHN0cnVjdHVyZSB0byBtYXAgaW50byB0aGlzIHJhbmdlLiAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9uYXRfc2V0dXBfaW5mbyhzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pOworCisvKiBJcyB0aGlzIHR1cGxlIGFscmVhZHkgdGFrZW4/IChub3QgYnkgdXMpKi8KK2V4dGVybiBpbnQgbmZfbmF0X3VzZWRfdHVwbGUoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICppZ25vcmVkX2Nvbm50cmFjayk7CisKK2V4dGVybiBpbnQgbmZfbmF0X21vZHVsZV9pc19sb2FkZWQ7CisKKyNlbHNlICAvKiAhX19LRVJORUxfXzogaXB0YWJsZXMgd2FudHMgdGhpcyB0byBjb21waWxlLiAqLworI2RlZmluZSBuZl9uYXRfbXVsdGlfcmFuZ2UgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdAorI2VuZGlmIC8qX19LRVJORUxfXyovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3OGZmYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZm5kZWYgX05GX05BVF9DT1JFX0gKKyNkZWZpbmUgX05GX05BVF9DT1JFX0gKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKworLyogVGhpcyBoZWFkZXIgdXNlZCB0byBzaGFyZSBjb3JlIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiB0aGUgc3RhbmRhbG9uZQorICAgTkFUIG1vZHVsZSwgYW5kIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyJ3MgdXNlIG9mIE5BVCBmb3IgbWFzcXVlcmFkaW5nLiAqLworCitleHRlcm4gdW5zaWduZWQgaW50IG5mX25hdF9wYWNrZXQoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCQkgIHN0cnVjdCBza19idWZmICoqcHNrYik7CisKK2V4dGVybiBpbnQgbmZfbmF0X2ljbXBfcmVwbHlfdHJhbnNsYXRpb24oc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJCSB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJCQkJIHN0cnVjdCBza19idWZmICoqcHNrYik7CisKK3N0YXRpYyBpbmxpbmUgaW50IG5mX25hdF9pbml0aWFsaXplZChzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwKQoreworCWlmIChtYW5pcCA9PSBJUF9OQVRfTUFOSVBfU1JDKQorCQlyZXR1cm4gdGVzdF9iaXQoSVBTX1NSQ19OQVRfRE9ORV9CSVQsICZjdC0+c3RhdHVzKTsKKwllbHNlCisJCXJldHVybiB0ZXN0X2JpdChJUFNfRFNUX05BVF9ET05FX0JJVCwgJmN0LT5zdGF0dXMpOworfQorI2VuZGlmIC8qIF9ORl9OQVRfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk4ZWNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9ORl9OQVRfSEVMUEVSX0gKKyNkZWZpbmUgX05GX05BVF9IRUxQRVJfSAorLyogTkFUIHByb3RvY29sIGhlbHBlciByb3V0aW5lcy4gKi8KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisKK3N0cnVjdCBza19idWZmOworCisvKiBUaGVzZSByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KK2V4dGVybiBpbnQgbmZfbmF0X21hbmdsZV90Y3BfcGFja2V0KHN0cnVjdCBza19idWZmICoqc2tiLAorCQkJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbWF0Y2hfb2Zmc2V0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbWF0Y2hfbGVuLAorCQkJCSAgICBjb25zdCBjaGFyICpyZXBfYnVmZmVyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVwX2xlbik7CitleHRlcm4gaW50IG5mX25hdF9tYW5nbGVfdWRwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnNrYiwKKwkJCQkgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgICAgdW5zaWduZWQgaW50IG1hdGNoX29mZnNldCwKKwkJCQkgICAgdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKKwkJCQkgICAgY29uc3QgY2hhciAqcmVwX2J1ZmZlciwKKwkJCQkgICAgdW5zaWduZWQgaW50IHJlcF9sZW4pOworZXh0ZXJuIGludCBuZl9uYXRfc2VxX2FkanVzdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pOworCisvKiBTZXR1cCBOQVQgb24gdGhpcyBleHBlY3RlZCBjb25udHJhY2sgc28gaXQgZm9sbG93cyBtYXN0ZXIsIGJ1dCBnb2VzCisgKiB0byBwb3J0IGN0LT5tYXN0ZXItPnNhdmVkX3Byb3RvLiAqLworZXh0ZXJuIHZvaWQgbmZfbmF0X2ZvbGxvd19tYXN0ZXIoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqdGhpcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWVjNWVmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIEhlYWRlciBmb3IgdXNlIGluIGRlZmluaW5nIGEgZ2l2ZW4gcHJvdG9jb2wuICovCisjaWZuZGVmIF9ORl9OQVRfUFJPVE9DT0xfSAorI2RlZmluZSBfTkZfTkFUX1BST1RPQ09MX0gKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+CisKK3N0cnVjdCBuZl9uYXRfcmFuZ2U7CisKK3N0cnVjdCBuZl9uYXRfcHJvdG9jb2wKK3sKKwkvKiBQcm90b2NvbCBuYW1lICovCisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIFByb3RvY29sIG51bWJlci4gKi8KKwl1bnNpZ25lZCBpbnQgcHJvdG9udW07CisKKwlzdHJ1Y3QgbW9kdWxlICptZTsKKworCS8qIFRyYW5zbGF0ZSBhIHBhY2tldCB0byB0aGUgdGFyZ2V0IGFjY29yZGluZyB0byBtYW5pcCB0eXBlLgorCSAgIFJldHVybiB0cnVlIGlmIHN1Y2NlZWRlZC4gKi8KKwlpbnQgKCptYW5pcF9wa3QpKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSB1bnNpZ25lZCBpbnQgaXBoZHJvZmYsCisJCQkgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCQkgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpOworCisJLyogSXMgdGhlIG1hbmlwYWJsZSBwYXJ0IG9mIHRoZSB0dXBsZSBiZXR3ZWVuIG1pbiBhbmQgbWF4IGluY2w/ICovCisJaW50ICgqaW5fcmFuZ2UpKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkJZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCisJCQljb25zdCB1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvICptaW4sCisJCQljb25zdCB1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvICptYXgpOworCisJLyogQWx0ZXIgdGhlIHBlci1wcm90byBwYXJ0IG9mIHRoZSB0dXBsZSAoZGVwZW5kaW5nIG9uCisJICAgbWFuaXB0eXBlKSwgdG8gZ2l2ZSBhIHVuaXF1ZSB0dXBsZSBpbiB0aGUgZ2l2ZW4gcmFuZ2UgaWYKKwkgICBwb3NzaWJsZTsgcmV0dXJuIGZhbHNlIGlmIG5vdC4gIFBlci1wcm90b2NvbCBwYXJ0IG9mIHR1cGxlCisJICAgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGluY29taW5nIHBhY2tldC4gKi8KKwlpbnQgKCp1bmlxdWVfdHVwbGUpKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAorCQkJICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCk7CisKKwlpbnQgKCpyYW5nZV90b19uZmF0dHIpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpOworCisJaW50ICgqbmZhdHRyX3RvX3JhbmdlKShzdHJ1Y3QgbmZhdHRyICp0YltdLAorCQkJICAgICAgIHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKTsKK307CisKKy8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KK2V4dGVybiBpbnQgbmZfbmF0X3Byb3RvY29sX3JlZ2lzdGVyKHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKnByb3RvKTsKK2V4dGVybiB2b2lkIG5mX25hdF9wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKnByb3RvKTsKKworZXh0ZXJuIHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKm5mX25hdF9wcm90b19maW5kX2dldCh1X2ludDhfdCBwcm90b2NvbCk7CitleHRlcm4gdm9pZCBuZl9uYXRfcHJvdG9fcHV0KHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKnByb3RvKTsKKworLyogQnVpbHQtaW4gcHJvdG9jb2xzLiAqLworZXh0ZXJuIHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgbmZfbmF0X3Byb3RvY29sX3RjcDsKK2V4dGVybiBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIG5mX25hdF9wcm90b2NvbF91ZHA7CitleHRlcm4gc3RydWN0IG5mX25hdF9wcm90b2NvbCBuZl9uYXRfcHJvdG9jb2xfaWNtcDsKK2V4dGVybiBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIG5mX25hdF91bmtub3duX3Byb3RvY29sOworCitleHRlcm4gaW50IGluaXRfcHJvdG9jb2xzKHZvaWQpIF9faW5pdDsKK2V4dGVybiB2b2lkIGNsZWFudXBfcHJvdG9jb2xzKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKmZpbmRfbmF0X3Byb3RvKHVfaW50MTZfdCBwcm90b251bSk7CisKK2V4dGVybiBpbnQgbmZfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKTsKK2V4dGVybiBpbnQgbmZfbmF0X3BvcnRfbmZhdHRyX3RvX3JhbmdlKHN0cnVjdCBuZmF0dHIgKnRiW10sCisJCQkJICAgICAgIHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKTsKKworI2VuZGlmIC8qX05GX05BVF9QUk9UT19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5MWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgX05GX05BVF9SVUxFX0gKKyNkZWZpbmUgX05GX05BVF9SVUxFX0gKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisKKy8qIENvbXBhdGliaWxpdHkgZGVmaW5pdGlvbnMgZm9yIGlwdF9GT08gbW9kdWxlcyAqLworI2RlZmluZSBpcF9uYXRfcmFuZ2UJCQluZl9uYXRfcmFuZ2UKKyNkZWZpbmUgaXBfY29ubnRyYWNrX3R1cGxlCQluZl9jb25udHJhY2tfdHVwbGUKKyNkZWZpbmUgaXBfY29ubnRyYWNrX2dldAkJbmZfY3RfZ2V0CisjZGVmaW5lIGlwX2Nvbm50cmFjawkJCW5mX2Nvbm4KKyNkZWZpbmUgaXBfbmF0X3NldHVwX2luZm8JCW5mX25hdF9zZXR1cF9pbmZvCisjZGVmaW5lIGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQJbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdAorI2RlZmluZSBpcF9jdF9pdGVyYXRlX2NsZWFudXAJCW5mX2N0X2l0ZXJhdGVfY2xlYW51cAorI2RlZmluZQlJUF9ORl9BU1NFUlQJCQlORl9DVF9BU1NFUlQKKworZXh0ZXJuIGludCBuZl9uYXRfcnVsZV9pbml0KHZvaWQpIF9faW5pdDsKK2V4dGVybiB2b2lkIG5mX25hdF9ydWxlX2NsZWFudXAodm9pZCk7CitleHRlcm4gaW50IG5mX25hdF9ydWxlX2ZpbmQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICBzdHJ1Y3QgbmZfbmF0X2luZm8gKmluZm8pOworCitleHRlcm4gdW5zaWduZWQgaW50CithbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICBzdHJ1Y3QgbmZfbmF0X2luZm8gKmluZm8sCisJCSAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludAorYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgIHN0cnVjdCBuZl9uYXRfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pOworI2VuZGlmIC8qIF9ORl9OQVRfUlVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oIGIvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaAppbmRleCAxMTMzMzdjLi44M2RhN2UxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsYWJlbC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxhYmVsLmgKQEAgLTExMSwxMyArMTExLDM0IEBACiAJdm9pZCAoKmZyZWUpIChjb25zdCB2b2lkICpkYXRhKTsKIAl2b2lkICpkYXRhOwogfTsKKy8qIFRoZSBjYXRtYXAgYml0bWFwIGZpZWxkIE1VU1QgYmUgYSBwb3dlciBvZiB0d28gaW4gbGVuZ3RoIGFuZCBsYXJnZQorICogZW5vdWdoIHRvIGhvbGQgYXQgbGVhc3QgMjQwIGJpdHMuICBTcGVjaWFsIGNhcmUgKGkuZS4gY2hlY2sgdGhlIGNvZGUhKQorICogc2hvdWxkIGJlIHVzZWQgd2hlbiBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMgYXMgdGhlIExTTSBpbXBsZW1lbnRhdGlvbgorICogcHJvYmFibHkgaGFzIGZ1bmN0aW9ucyB3aGljaCByZWx5IG9uIHRoZSBzaXplcyBvZiB0aGVzZSB0eXBlcyB0byBzcGVlZAorICogcHJvY2Vzc2luZy4gKi8KKyNkZWZpbmUgTkVUTEJMX0NBVE1BUF9NQVBUWVBFICAgICAgICAgICB1NjQKKyNkZWZpbmUgTkVUTEJMX0NBVE1BUF9NQVBDTlQgICAgICAgICAgICA0CisjZGVmaW5lIE5FVExCTF9DQVRNQVBfTUFQU0laRSAgICAgICAgICAgKHNpemVvZihORVRMQkxfQ0FUTUFQX01BUFRZUEUpICogOCkKKyNkZWZpbmUgTkVUTEJMX0NBVE1BUF9TSVpFICAgICAgICAgICAgICAoTkVUTEJMX0NBVE1BUF9NQVBTSVpFICogXAorCQkJCQkgTkVUTEJMX0NBVE1BUF9NQVBDTlQpCisjZGVmaW5lIE5FVExCTF9DQVRNQVBfQklUICAgICAgICAgICAgICAgKE5FVExCTF9DQVRNQVBfTUFQVFlQRSkweDAxCitzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCB7CisJdTMyIHN0YXJ0Yml0OworCU5FVExCTF9DQVRNQVBfTUFQVFlQRSBiaXRtYXBbTkVUTEJMX0NBVE1BUF9NQVBDTlRdOworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpuZXh0OworfTsKKyNkZWZpbmUgTkVUTEJMX1NFQ0FUVFJfTk9ORSAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5FVExCTF9TRUNBVFRSX0RPTUFJTiAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBORVRMQkxfU0VDQVRUUl9DQUNIRSAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTCAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE5FVExCTF9TRUNBVFRSX01MU19DQVQgICAgICAgICAgMHgwMDAwMDAwOAogc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciB7CisJdTMyIGZsYWdzOworCiAJY2hhciAqZG9tYWluOwogCiAJdTMyIG1sc19sdmw7Ci0JdTMyIG1sc19sdmxfdmxkOwotCXVuc2lnbmVkIGNoYXIgKm1sc19jYXQ7Ci0Jc2l6ZV90IG1sc19jYXRfbGVuOworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICptbHNfY2F0OwogCiAJc3RydWN0IG5ldGxibF9sc21fY2FjaGUgKmNhY2hlOwogfTsKQEAgLTEzNiw3ICsxNTcsNyBAQAogICogb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgogICoKICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0bGJsX2xzbV9jYWNoZSAqbmV0bGJsX3NlY2F0dHJfY2FjaGVfYWxsb2MoaW50IGZsYWdzKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0bGJsX2xzbV9jYWNoZSAqbmV0bGJsX3NlY2F0dHJfY2FjaGVfYWxsb2MoZ2ZwX3QgZmxhZ3MpCiB7CiAJc3RydWN0IG5ldGxibF9sc21fY2FjaGUgKmNhY2hlOwogCkBAIC0xNjUsMTggKzE4Niw1NCBAQAogfQogCiAvKioKKyAqIG5ldGxibF9zZWNhdHRyX2NhdG1hcF9hbGxvYyAtIEFsbG9jYXRlIGEgTFNNIHNlY2F0dHIgY2F0bWFwCisgKiBAZmxhZ3M6IG1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgTFNNIHNlY2F0dHIgY2F0bWFwLCByZXR1cm5zIGEgcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMCisgKiBvbiBmYWlsdXJlLgorICoKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2FsbG9jKAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwKSwgZmxhZ3MpOworfQorCisvKioKKyAqIG5ldGxibF9zZWNhdHRyX2NhdG1hcF9mcmVlIC0gRnJlZSBhIExTTSBzZWNhdHRyIGNhdG1hcAorICogQGNhdG1hcDogdGhlIGNhdGVnb3J5IGJpdG1hcAorICoKKyAqIERlc2NyaXB0aW9uOgorICogRnJlZSBhIExTTSBzZWNhdHRyIGNhdG1hcC4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfZnJlZSgKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwKQoreworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICppdGVyOworCisJZG8geworCQlpdGVyID0gY2F0bWFwOworCQljYXRtYXAgPSBjYXRtYXAtPm5leHQ7CisJCWtmcmVlKGl0ZXIpOworCX0gd2hpbGUgKGNhdG1hcCk7Cit9CisKKy8qKgogICogbmV0bGJsX3NlY2F0dHJfaW5pdCAtIEluaXRpYWxpemUgYSBuZXRsYmxfbHNtX3NlY2F0dHIgc3RydWN0CiAgKiBAc2VjYXR0cjogdGhlIHN0cnVjdCB0byBpbml0aWFsaXplCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplIGFuIGFscmVhZHkgYWxsb2NhdGVkIG5ldGxibF9sc21fc2VjYXR0ciBzdHJ1Y3QuICBSZXR1cm5zIHplcm8gb24KLSAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBlcnJvci4KKyAqIEluaXRpYWxpemUgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgbmV0bGJsX2xzbV9zZWNhdHRyIHN0cnVjdC4KICAqCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9zZWNhdHRyX2luaXQoc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfc2VjYXR0cl9pbml0KHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JbWVtc2V0KHNlY2F0dHIsIDAsIHNpemVvZigqc2VjYXR0cikpOwotCXJldHVybiAwOworCXNlY2F0dHItPmZsYWdzID0gMDsKKwlzZWNhdHRyLT5kb21haW4gPSBOVUxMOworCXNlY2F0dHItPm1sc19jYXQgPSBOVUxMOworCXNlY2F0dHItPmNhY2hlID0gTlVMTDsKIH0KIAogLyoqCkBAIC0xOTMsNyArMjUwLDggQEAKIAlpZiAoc2VjYXR0ci0+Y2FjaGUpCiAJCW5ldGxibF9zZWNhdHRyX2NhY2hlX2ZyZWUoc2VjYXR0ci0+Y2FjaGUpOwogCWtmcmVlKHNlY2F0dHItPmRvbWFpbik7Ci0Ja2ZyZWUoc2VjYXR0ci0+bWxzX2NhdCk7CisJaWYgKHNlY2F0dHItPm1sc19jYXQpCisJCW5ldGxibF9zZWNhdHRyX2NhdG1hcF9mcmVlKHNlY2F0dHItPm1sc19jYXQpOwogfQogCiAvKioKQEAgLTIwNSw3ICsyNjMsNyBAQAogICogcG9pbnRlciBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCiAgKgogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKm5ldGxibF9zZWNhdHRyX2FsbG9jKGludCBmbGFncykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqbmV0bGJsX3NlY2F0dHJfYWxsb2MoZ2ZwX3QgZmxhZ3MpCiB7CiAJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIpLCBmbGFncyk7CiB9CkBAIC0yMjQsNiArMjgyLDUxIEBACiAJa2ZyZWUoc2VjYXR0cik7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUTEFCRUwKK2ludCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2FsayhzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwLAorCQkJICAgICAgIHUzMiBvZmZzZXQpOworaW50IG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrX3JuZyhzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwLAorCQkJCSAgIHUzMiBvZmZzZXQpOworaW50IG5ldGxibF9zZWNhdHRyX2NhdG1hcF9zZXRiaXQoc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCwKKwkJCQkgdTMyIGJpdCwKKwkJCQkgZ2ZwX3QgZmxhZ3MpOworaW50IG5ldGxibF9zZWNhdHRyX2NhdG1hcF9zZXRybmcoc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCwKKwkJCQkgdTMyIHN0YXJ0LAorCQkJCSB1MzIgZW5kLAorCQkJCSBnZnBfdCBmbGFncyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3dhbGsoCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCwKKwkJCQkgICAgICB1MzIgb2Zmc2V0KQoreworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2Fsa19ybmcoCisJCQkJICAgICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cl9jYXRtYXAgKmNhdG1hcCwKKwkJCQkgICAgICB1MzIgb2Zmc2V0KQoreworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfc2V0Yml0KAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjYXRtYXAsCisJCQkJICAgICAgdTMyIGJpdCwKKwkJCQkgICAgICBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3NldHJuZygKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwLAorCQkJCSAgICAgIHUzMiBzdGFydCwKKwkJCQkgICAgICB1MzIgZW5kLAorCQkJCSAgICAgIGdmcF90IGZsYWdzKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qCiAgKiBMU00gcHJvdG9jb2wgb3BlcmF0aW9ucwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRsaW5rLmggYi9pbmNsdWRlL25ldC9uZXRsaW5rLmgKaW5kZXggY2U1Y2JhMS4uYmNhZjY3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGxpbmsuaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiAgICAgICAgIE5ldGxpbmsgTWVzc2FnZXMgYW5kIEF0dHJpYnV0ZXMgSW50ZXJmYWNlIChBcyBTZWVuIE9uIFRWKQpAQCAtNTAwLDE0ICs1MDEsMTUgQEAKIAogLyoqCiAgKiBubG1zZ19uZXcgLSBBbGxvY2F0ZSBhIG5ldyBuZXRsaW5rIG1lc3NhZ2UKLSAqIEBzaXplOiBtYXhpbXVtIHNpemUgb2YgbWVzc2FnZQorICogQHBheWxvYWQ6IHNpemUgb2YgdGhlIG1lc3NhZ2UgcGF5bG9hZAogICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCiAgKgotICogVXNlIE5MTVNHX0dPT0RTSVpFIGlmIHNpemUgaXNuJ3Qga25vdyBhbmQgeW91IG5lZWQgYSBnb29kIGRlZmF1bHQgc2l6ZS4KKyAqIFVzZSBOTE1TR19ERUZBVUxUX1NJWkUgaWYgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgaXNuJ3Qga25vd24KKyAqIGFuZCBhIGdvb2QgZGVmYXVsdCBpcyBuZWVkZWQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm5sbXNnX25ldyhpbnQgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpubG1zZ19uZXcoc2l6ZV90IHBheWxvYWQsIGdmcF90IGZsYWdzKQogewotCXJldHVybiBhbGxvY19za2Ioc2l6ZSwgZmxhZ3MpOworCXJldHVybiBhbGxvY19za2Iobmxtc2dfdG90YWxfc2l6ZShwYXlsb2FkKSwgZmxhZ3MpOwogfQogCiAvKioKQEAgLTgyOCw2ICs4MzAsOSBAQAogI2RlZmluZSBOTEFfUFVUX1UxNihza2IsIGF0dHJ0eXBlLCB2YWx1ZSkgXAogCU5MQV9QVVRfVFlQRShza2IsIHUxNiwgYXR0cnR5cGUsIHZhbHVlKQogCisjZGVmaW5lIE5MQV9QVVRfTEUxNihza2IsIGF0dHJ0eXBlLCB2YWx1ZSkgXAorCU5MQV9QVVRfVFlQRShza2IsIF9fbGUxNiwgYXR0cnR5cGUsIHZhbHVlKQorCiAjZGVmaW5lIE5MQV9QVVRfVTMyKHNrYiwgYXR0cnR5cGUsIHZhbHVlKSBcCiAJTkxBX1BVVF9UWVBFKHNrYiwgdTMyLCBhdHRydHlwZSwgdmFsdWUpCiAKQEAgLTg3NCw2ICs4NzksMTUgQEAKIH0KIAogLyoqCisgKiBubGFfZ2V0X2xlMTYgLSByZXR1cm4gcGF5bG9hZCBvZiBfX2xlMTYgYXR0cmlidXRlCisgKiBAbmxhOiBfX2xlMTYgbmV0bGluayBhdHRyaWJ1dGUKKyAqLworc3RhdGljIGlubGluZSBfX2xlMTYgbmxhX2dldF9sZTE2KHN0cnVjdCBubGF0dHIgKm5sYSkKK3sKKwlyZXR1cm4gKihfX2xlMTYgKikgbmxhX2RhdGEobmxhKTsKK30KKworLyoqCiAgKiBubGFfZ2V0X3U4IC0gcmV0dXJuIHBheWxvYWQgb2YgdTggYXR0cmlidXRlCiAgKiBAbmxhOiB1OCBuZXRsaW5rIGF0dHJpYnV0ZQogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wcm90b2NvbC5oIGIvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaAppbmRleCBjNjQzYmNlLi4xMDViZjEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wcm90b2NvbC5oCisrKyBiL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKQEAgLTUwLDcgKzUwLDcgQEAKIAl2b2lkCSgqZXJyX2hhbmRsZXIpKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICAgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCiAJCQkgICAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LAotCQkJICAgICAgIF9fdTMyIGluZm8pOworCQkJICAgICAgIF9fYmUzMiBpbmZvKTsKIAogCWludAkoKmdzb19zZW5kX2NoZWNrKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpnc29fc2VnbWVudCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTcxLDcgKzcxLDcgQEAKIAogICAgICAgICAvKiBUaGVzZSB0d28gZmllbGRzIGZvcm0gdGhlIGxvb2t1cCBrZXkuICAqLwogCXVuc2lnbmVkIHNob3J0CSB0eXBlOwkgICAvKiBUaGlzIGlzIHRoZSAybmQgYXJndW1lbnQgdG8gc29ja2V0KDIpLiAqLwotCWludAkJIHByb3RvY29sOyAvKiBUaGlzIGlzIHRoZSBMNCBwcm90b2NvbCBudW1iZXIuICAqLworCXVuc2lnbmVkIHNob3J0CSBwcm90b2NvbDsgLyogVGhpcyBpcyB0aGUgTDQgcHJvdG9jb2wgbnVtYmVyLiAgKi8KIAogCXN0cnVjdCBwcm90bwkgKnByb3Q7CiAJY29uc3Qgc3RydWN0IHByb3RvX29wcyAqb3BzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcmF3djYuaCBiL2luY2x1ZGUvbmV0L3Jhd3Y2LmgKaW5kZXggMTQ0NzZhNy4uYWY4OTYwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcmF3djYuaAorKysgYi9pbmNsdWRlL25ldC9yYXd2Ni5oCkBAIC0yMSw3ICsyMSw3IEBACiAJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKIAkJCQkJICBpbnQgdHlwZSwgaW50IGNvZGUsIAotCQkJCQkgIGludCBvZmZzZXQsIHUzMiBpbmZvKTsKKwkJCQkJICBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbyk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9yZXF1ZXN0X3NvY2suaCBiL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCmluZGV4IDhlMTY1Y2EuLjdhZWQwMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCkBAIC0yOCwxNCArMjgsMTUgQEAKIAogc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgewogCWludAkJZmFtaWx5OwotCWttZW1fY2FjaGVfdAkqc2xhYjsKIAlpbnQJCW9ial9zaXplOworCXN0cnVjdCBrbWVtX2NhY2hlCSpzbGFiOwogCWludAkJKCpydHhfc3luX2Fjaykoc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCiAJCQkJICAgICAgIHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CiAJdm9pZAkJKCpzZW5kX2Fjaykoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTsKLQl2b2lkCQkoKnNlbmRfcmVzZXQpKHN0cnVjdCBza19idWZmICpza2IpOworCXZvaWQJCSgqc2VuZF9yZXNldCkoc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogCXZvaWQJCSgqZGVzdHJ1Y3Rvcikoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTsKIH07CiAKQEAgLTUxLDE0ICs1MiwxNSBAQAogCXUzMgkJCQlyY3Zfd25kOwkgIC8qIHJjdl93bmQgb2ZmZXJlZCBmaXJzdCB0aW1lICovCiAJdTMyCQkJCXRzX3JlY2VudDsKIAl1bnNpZ25lZCBsb25nCQkJZXhwaXJlczsKLQlzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcwkJKnJza19vcHM7CisJY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMJKnJza19vcHM7CiAJc3RydWN0IHNvY2sJCQkqc2s7CiAJdTMyCQkJCXNlY2lkOworCXUzMgkJCQlwZWVyX3NlY2lkOwogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXFza19hbGxvYyhzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcyAqb3BzKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXFza19hbGxvYyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcyAqb3BzKQogewotCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSA9IGttZW1fY2FjaGVfYWxsb2Mob3BzLT5zbGFiLCBTTEFCX0FUT01JQyk7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxID0ga21lbV9jYWNoZV9hbGxvYyhvcHMtPnNsYWIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJlcSAhPSBOVUxMKQogCQlyZXEtPnJza19vcHMgPSBvcHM7CkBAIC0xMjAsNyArMTIyLDcgQEAKIH07CiAKIGV4dGVybiBpbnQgcmVxc2tfcXVldWVfYWxsb2Moc3RydWN0IHJlcXVlc3Rfc29ja19xdWV1ZSAqcXVldWUsCi0JCQkgICAgIGNvbnN0IGludCBucl90YWJsZV9lbnRyaWVzKTsKKwkJCSAgICAgdW5zaWduZWQgaW50IG5yX3RhYmxlX2VudHJpZXMpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0ZW5fc29jayAqcmVxc2tfcXVldWVfeWFua19saXN0ZW5fc2soc3RydWN0IHJlcXVlc3Rfc29ja19xdWV1ZSAqcXVldWUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAppbmRleCBiMGU5MTA4Li44MjA4NjM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKQEAgLTYwLDYgKzYwLDcgQEAKIAlpbnQJCQkoKmdyYWZ0KShzdHJ1Y3QgUWRpc2MgKiwgdW5zaWduZWQgbG9uZyBjbCwKIAkJCQkJc3RydWN0IFFkaXNjICosIHN0cnVjdCBRZGlzYyAqKik7CiAJc3RydWN0IFFkaXNjICoJCSgqbGVhZikoc3RydWN0IFFkaXNjICosIHVuc2lnbmVkIGxvbmcgY2wpOworCXZvaWQJCQkoKnFsZW5fbm90aWZ5KShzdHJ1Y3QgUWRpc2MgKiwgdW5zaWduZWQgbG9uZyk7CiAKIAkvKiBDbGFzcyBtYW5pcHVsYXRpb24gcm91dGluZXMgKi8KIAl1bnNpZ25lZCBsb25nCQkoKmdldCkoc3RydWN0IFFkaXNjICosIHUzMiBjbGFzc2lkKTsKQEAgLTE0NCw3ICsxNDUsNyBAQAogCXZvaWQJCQkqcm9vdDsKIAlpbnQJCQkoKmNsYXNzaWZ5KShzdHJ1Y3Qgc2tfYnVmZiosIHN0cnVjdCB0Y2ZfcHJvdG8qLAogCQkJCQlzdHJ1Y3QgdGNmX3Jlc3VsdCAqKTsKLQl1MzIJCQlwcm90b2NvbDsKKwlfX2JlMTYJCQlwcm90b2NvbDsKIAogCS8qIEFsbCB0aGUgcmVzdCAqLwogCXUzMgkJCXByaW87CkBAIC0xNzIsOSArMTczLDEwIEBACiBleHRlcm4gdm9pZCBkZXZfZGVhY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHFkaXNjX3Jlc2V0KHN0cnVjdCBRZGlzYyAqcWRpc2MpOwogZXh0ZXJuIHZvaWQgcWRpc2NfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnFkaXNjKTsKK2V4dGVybiB2b2lkIHFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihzdHJ1Y3QgUWRpc2MgKnFkaXNjLCB1bnNpZ25lZCBpbnQgbik7CiBleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpOwogZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IFFkaXNjX29wcyAqb3BzKTsKKwkJCQkgICAgICAgc3RydWN0IFFkaXNjX29wcyAqb3BzLCB1MzIgcGFyZW50aWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHRjZl9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9jb21tYW5kLmggYi9pbmNsdWRlL25ldC9zY3RwL2NvbW1hbmQuaAppbmRleCA4MDdkNmYxLi42MTE0YzRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL2NvbW1hbmQuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL2NvbW1hbmQuaApAQCAtMTE2LDkgKzExNiwxMSBAQAogdHlwZWRlZiB1bmlvbiB7CiAJX19zMzIgaTMyOwogCV9fdTMyIHUzMjsKKwlfX2JlMzIgYmUzMjsKIAlfX3UxNiB1MTY7CiAJX191OCB1ODsKIAlpbnQgZXJyb3I7CisJX19iZTE2IGVycjsKIAlzY3RwX3N0YXRlX3Qgc3RhdGU7CiAJc2N0cF9ldmVudF90aW1lb3V0X3QgdG87CiAJdW5zaWduZWQgbG9uZyB6ZXJvOwpAQCAtMTY0LDkgKzE2NiwxMSBAQAogCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihJMzIsCV9fczMyLCBpMzIpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihVMzIsCV9fdTMyLCB1MzIpCitTQ1RQX0FSR19DT05TVFJVQ1RPUihCRTMyLAlfX2JlMzIsIGJlMzIpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihVMTYsCV9fdTE2LCB1MTYpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihVOCwJX191OCwgdTgpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihFUlJPUiwgICAgIGludCwgZXJyb3IpCitTQ1RQX0FSR19DT05TVFJVQ1RPUihQRVJSLCAgICAgIF9fYmUxNiwgZXJyKQkvKiBwcm90b2NvbCBlcnJvciAqLwogU0NUUF9BUkdfQ09OU1RSVUNUT1IoU1RBVEUsCXNjdHBfc3RhdGVfdCwgc3RhdGUpCiBTQ1RQX0FSR19DT05TVFJVQ1RPUihUTywJc2N0cF9ldmVudF90aW1lb3V0X3QsIHRvKQogU0NUUF9BUkdfQ09OU1RSVUNUT1IoUFRSLAl2b2lkICosIHB0cikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmggYi9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oCmluZGV4IDZjNjMyZTIuLjVkZGI4NTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaApAQCAtMzU2LDcgKzM1Niw3IEBACiAgKiBhZGRyZXNzZXMuCiAgKi8KICNkZWZpbmUgSVNfSVBWNF9VTlVTQUJMRV9BRERSRVNTKGEpIFwKLQkoKElOQUREUl9CUk9BRENBU1QgPT0gKmEpIHx8IFwKKwkoKGh0b25sKElOQUREUl9CUk9BRENBU1QpID09ICphKSB8fCBcCiAJKE1VTFRJQ0FTVCgqYSkpIHx8IFwKIAkoKCh1bnNpZ25lZCBjaGFyICopKGEpKVswXSA9PSAwKSB8fCBcCiAJKCgoKHVuc2lnbmVkIGNoYXIgKikoYSkpWzBdID09IDE5OCkgJiYgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCA3NjRlM2FmLi5jODE4Zjg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtMzY4LDcgKzM2OCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2N0cF9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKSB7IHJldHVybjsgfQogc3RhdGljIGlubGluZSBpbnQgc2N0cF9zeXNjdGxfamlmZmllc19tcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgdm9pZCAqKmNvbnRleHQpIHsKKwkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikgewogCXJldHVybiAtRU5PU1lTOwogfQogI2VuZGlmCkBAIC01ODUsNyArNTg1LDcgQEAKIH0KIAogLyogQ29udmVydCBmcm9tIGFuIGFkZHJlc3MgcGFyYW1ldGVyIHR5cGUgdG8gYW4gYWRkcmVzcyBmYW1pbHkuICAqLwotc3RhdGljIGlubGluZSBpbnQgcGFyYW1fdHlwZTJhZihfX3UxNiB0eXBlKQorc3RhdGljIGlubGluZSBpbnQgcGFyYW1fdHlwZTJhZihfX2JlMTYgdHlwZSkKIHsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFNDVFBfUEFSQU1fSVBWNF9BRERSRVNTOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zbS5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCmluZGV4IGRlMzEzZGUuLjMyNjllZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc20uaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NtLmgKQEAgLTIxMyw3ICsyMTMsNyBAQAogCQkJCQkgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICopOwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9zaHV0ZG93bl9jb21wbGV0ZShjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAogCQkJCQkgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICopOwotdm9pZCBzY3RwX2luaXRfY2F1c2Uoc3RydWN0IHNjdHBfY2h1bmsgKiwgX191MTYgY2F1c2UsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3ZvaWQgc2N0cF9pbml0X2NhdXNlKHN0cnVjdCBzY3RwX2NodW5rICosIF9fYmUxNiBjYXVzZSwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9hYm9ydChjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAogCQkJICAgICAgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKiwKIAkJCSAgICAgIGNvbnN0IHNpemVfdCBoaW50KTsKQEAgLTIzNiwxNCArMjM2LDE0IEBACiAJCQkJICAgICAgY29uc3Qgc2l6ZV90IHBheWxlbik7CiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX29wX2Vycm9yKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkJIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQkJCQkgX191MTYgY2F1c2VfY29kZSwKKwkJCQkgX19iZTE2IGNhdXNlX2NvZGUsCiAJCQkJIGNvbnN0IHZvaWQgKnBheWxvYWQsCiAJCQkJIHNpemVfdCBwYXlsZW4pOwogCiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2FzY29uZl91cGRhdGVfaXAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCQkJICAgICAgdW5pb24gc2N0cF9hZGRyICosCiAJCQkJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqLAotCQkJCQkgICAgICBpbnQsIF9fdTE2KTsKKwkJCQkJICAgICAgaW50LCBfX2JlMTYpOwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9hc2NvbmZfc2V0X3ByaW0oc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJCSAgICAgdW5pb24gc2N0cF9hZGRyICphZGRyKTsKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX3Byb2Nlc3NfYXNjb25mKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmggYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAppbmRleCBjNmQ5M2JiLi44ZDdmMjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaApAQCAtMjAxLDEzICsyMDEsMTIgQEAKIAlzdHJ1Y3Qgc2N0cF9iaW5kX2hhc2hidWNrZXQgKnBvcnRfaGFzaHRhYmxlOwogCiAJLyogVGhpcyBpcyB0aGUgZ2xvYmFsIGxvY2FsIGFkZHJlc3MgbGlzdC4KLQkgKiBXZSBhY3RpdmVseSBtYWludGFpbiB0aGlzIGNvbXBsZXRlIGxpc3Qgb2YgaW50ZXJmYWNlcyBvbgotCSAqIHRoZSBzeXN0ZW0gYnkgY2F0Y2hpbmcgcm91dGluZyBldmVudHMuCisJICogV2UgYWN0aXZlbHkgbWFpbnRhaW4gdGhpcyBjb21wbGV0ZSBsaXN0IG9mIGFkZHJlc3NlcyBvbgorCSAqIHRoZSBzeXN0ZW0gYnkgY2F0Y2hpbmcgYWRkcmVzcyBhZGQvZGVsZXRlIGV2ZW50cy4KIAkgKgogCSAqIEl0IGlzIGEgbGlzdCBvZiBzY3RwX3NvY2thZGRyX2VudHJ5LgogCSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbG9jYWxfYWRkcl9saXN0OwotCXNwaW5sb2NrX3QgbG9jYWxfYWRkcl9sb2NrOwogCQogCS8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgYWRkaXAgaXMgZW5hYmxlZC4gKi8KIAlpbnQgYWRkaXBfZW5hYmxlOwpAQCAtMjQzLDcgKzI0Miw2IEBACiAjZGVmaW5lIHNjdHBfcG9ydF9hbGxvY19sb2NrCQkoc2N0cF9nbG9iYWxzLnBvcnRfYWxsb2NfbG9jaykKICNkZWZpbmUgc2N0cF9wb3J0X2hhc2h0YWJsZQkJKHNjdHBfZ2xvYmFscy5wb3J0X2hhc2h0YWJsZSkKICNkZWZpbmUgc2N0cF9sb2NhbF9hZGRyX2xpc3QJCShzY3RwX2dsb2JhbHMubG9jYWxfYWRkcl9saXN0KQotI2RlZmluZSBzY3RwX2xvY2FsX2FkZHJfbG9jawkJKHNjdHBfZ2xvYmFscy5sb2NhbF9hZGRyX2xvY2spCiAjZGVmaW5lIHNjdHBfYWRkaXBfZW5hYmxlCQkoc2N0cF9nbG9iYWxzLmFkZGlwX2VuYWJsZSkKICNkZWZpbmUgc2N0cF9wcnNjdHBfZW5hYmxlCQkoc2N0cF9nbG9iYWxzLnByc2N0cF9lbmFibGUpCiAKQEAgLTI3Nyw2ICsyNzUsNyBAQAogCV9fdTE2IGRlZmF1bHRfZmxhZ3M7CiAJX191MzIgZGVmYXVsdF9jb250ZXh0OwogCV9fdTMyIGRlZmF1bHRfdGltZXRvbGl2ZTsKKwlfX3UzMiBkZWZhdWx0X3Jjdl9jb250ZXh0OwogCiAJLyogSGVhcnRiZWF0IGludGVydmFsOiBUaGUgZW5kcG9pbnQgc2VuZHMgb3V0IGEgSGVhcnRiZWF0IGNodW5rIHRvCiAJICogdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZXZlcnkgaGVhcnRiZWF0IGludGVydmFsLiBUaGlzIHZhbHVlCkBAIC01MzcsNyArNTM2LDcgQEAKIAkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIAl2b2lkCQkoKmRzdF9zYWRkcikJKHVuaW9uIHNjdHBfYWRkciAqc2FkZHIsCiAJCQkJCSBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCi0JCQkJCSB1bnNpZ25lZCBzaG9ydCBwb3J0KTsKKwkJCQkJIF9fYmUxNiBwb3J0KTsKIAlpbnQJCSgqY21wX2FkZHIpCShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIxLAogCQkJCQkgY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyMik7CiAJdm9pZAkJKCphZGRyX2NvcHkpCSh1bmlvbiBzY3RwX2FkZHIgKmRzdCwKQEAgLTU1MywxNCArNTUyLDE0IEBACiAJCQkJCSBzdHJ1Y3Qgc29jayAqc2spOwogCXZvaWQJCSgqZnJvbV9hZGRyX3BhcmFtKSAodW5pb24gc2N0cF9hZGRyICosCiAJCQkJCSAgICB1bmlvbiBzY3RwX2FkZHJfcGFyYW0gKiwKLQkJCQkJICAgIF9fdTE2IHBvcnQsIGludCBpaWYpOwkKKwkJCQkJICAgIF9fYmUxNiBwb3J0LCBpbnQgaWlmKTsKIAlpbnQJCSgqdG9fYWRkcl9wYXJhbSkgKGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqLAogCQkJCQkgIHVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqKTsgCiAJaW50CQkoKmFkZHJfdmFsaWQpCSh1bmlvbiBzY3RwX2FkZHIgKiwKIAkJCQkJIHN0cnVjdCBzY3RwX3NvY2sgKiwKIAkJCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICopOwogCXNjdHBfc2NvcGVfdAkoKnNjb3BlKSAodW5pb24gc2N0cF9hZGRyICopOwotCXZvaWQJCSgqaW5hZGRyX2FueSkJKHVuaW9uIHNjdHBfYWRkciAqLCB1bnNpZ25lZCBzaG9ydCk7CisJdm9pZAkJKCppbmFkZHJfYW55KQkodW5pb24gc2N0cF9hZGRyICosIF9fYmUxNik7CiAJaW50CQkoKmlzX2FueSkJKGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqKTsKIAlpbnQJCSgqYXZhaWxhYmxlKQkodW5pb24gc2N0cF9hZGRyICosCiAJCQkJCSBzdHJ1Y3Qgc2N0cF9zb2NrICopOwpAQCAtNTg3LDcgKzU4Niw3IEBACiAJCQkgIHN0cnVjdCBzY3RwX3NvY2sgKik7CiAJaW50ICAoKmJpbmRfdmVyaWZ5KSAoc3RydWN0IHNjdHBfc29jayAqLCB1bmlvbiBzY3RwX2FkZHIgKik7CiAJaW50ICAoKnNlbmRfdmVyaWZ5KSAoc3RydWN0IHNjdHBfc29jayAqLCB1bmlvbiBzY3RwX2FkZHIgKik7Ci0JaW50ICAoKnN1cHBvcnRlZF9hZGRycykoY29uc3Qgc3RydWN0IHNjdHBfc29jayAqLCBfX3UxNiAqKTsKKwlpbnQgICgqc3VwcG9ydGVkX2FkZHJzKShjb25zdCBzdHJ1Y3Qgc2N0cF9zb2NrICosIF9fYmUxNiAqKTsKIAlzdHJ1Y3Qgc29jayAqKCpjcmVhdGVfYWNjZXB0X3NrKSAoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKTsKIAl2b2lkICgqYWRkcl92NG1hcCkgKHN0cnVjdCBzY3RwX3NvY2sgKiwgdW5pb24gc2N0cF9hZGRyICopOwpAQCAtMTAzMCw3ICsxMDI5LDcgQEAKIHZvaWQgc2N0cF9pbnFfZnJlZShzdHJ1Y3Qgc2N0cF9pbnEgKik7CiB2b2lkIHNjdHBfaW5xX3B1c2goc3RydWN0IHNjdHBfaW5xICosIHN0cnVjdCBzY3RwX2NodW5rICpwYWNrZXQpOwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfaW5xX3BvcChzdHJ1Y3Qgc2N0cF9pbnEgKik7Ci12b2lkIHNjdHBfaW5xX3NldF90aF9oYW5kbGVyKHN0cnVjdCBzY3RwX2lucSAqLCB2b2lkICgqKSh2b2lkICopLCB2b2lkICopOwordm9pZCBzY3RwX2lucV9zZXRfdGhfaGFuZGxlcihzdHJ1Y3Qgc2N0cF9pbnEgKiwgd29ya19mdW5jX3QpOwogCiAvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2UgdXNlIHRvIGhvbGQgb3V0Ym91bmQgY2h1bmtzLiAgWW91IHB1c2gKICAqIGNodW5rcyBpbiBhbmQgdGhleSBhdXRvbWF0aWNhbGx5IHBvcCBvdXQgdGhlIG90aGVyIGVuZCBhcyBidW5kbGVkCkBAIC0xMjcwLDcgKzEyNjksNyBAQAogIAkgKiAJICAgIHRoaXMgaGVyZSBzbyB3ZSBwcmUtYWxsb2NhdGUgdGhpcyBvbmNlIGFuZCBjYW4gcmUtdXNlCiAgCSAqIAkgICAgb24gZXZlcnkgcmVjZWl2ZS4KICAJICovCi0gCV9fdTggZGlnZXN0W1NDVFBfU0lHTkFUVVJFX1NJWkVdOworIAlfX3U4ICpkaWdlc3Q7CiAgCiAJLyogc2VuZGJ1ZiBhY2N0LiBwb2xpY3kuCSovCiAJX191MzIgc25kYnVmX3BvbGljeTsKQEAgLTEzMTQsNiArMTMxMywxMyBAQAogX191MzIgc2N0cF9nZW5lcmF0ZV90YWcoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CiBfX3UzMiBzY3RwX2dlbmVyYXRlX3Rzbihjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqKTsKIAorc3RydWN0IHNjdHBfaW5pdGhkcl9ob3N0IHsKKwlfX3UzMiBpbml0X3RhZzsKKwlfX3UzMiBhX3J3bmQ7CisJX191MTYgbnVtX291dGJvdW5kX3N0cmVhbXM7CisJX191MTYgbnVtX2luYm91bmRfc3RyZWFtczsKKwlfX3UzMiBpbml0aWFsX3RzbjsKK307CiAKIC8qIFJGQzI5NjAKICAqCkBAIC0xNDgyLDkgKzE0ODgsOSBAQAogCQkvKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBkaXNhYmxlIHNlbmRpbmcgdGhlIEFTQ09ORiBjaHVuawogCQkgKiB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXIgdG8gcGVlci4KIAkJICovCi0JCV9fdTE2IGFkZGlwX2Rpc2FibGVkX21hc2s7CisJCV9fYmUxNiBhZGRpcF9kaXNhYmxlZF9tYXNrOwogCi0JCXN0cnVjdCBzY3RwX2luaXRoZHIgaTsKKwkJc3RydWN0IHNjdHBfaW5pdGhkcl9ob3N0IGk7CiAJCWludCBjb29raWVfbGVuOwogCQl2b2lkICpjb29raWU7CiAKQEAgLTE2NTIsNiArMTY1OCw5IEBACiAJX191MzIgZGVmYXVsdF9jb250ZXh0OwogCV9fdTMyIGRlZmF1bHRfdGltZXRvbGl2ZTsKIAorCS8qIERlZmF1bHQgcmVjZWl2ZSBwYXJhbWV0ZXJzICovCisJX191MzIgZGVmYXVsdF9yY3ZfY29udGV4dDsKKwogCS8qIFRoaXMgdHJhY2tzIG91dGJvdW5kIHNzbiBmb3IgYSBnaXZlbiBzdHJlYW0uCSAqLwogCXN0cnVjdCBzY3RwX3Nzbm1hcCAqc3NubWFwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3Rzbm1hcC5oIGIvaW5jbHVkZS9uZXQvc2N0cC90c25tYXAuaAppbmRleCAwMjE5NDdkLi43MGE4MjRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3Rzbm1hcC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvdHNubWFwLmgKQEAgLTEwNSw3ICsxMDUsNyBAQAogCSAqIGV2ZXJ5IFNBQ0suICBTdG9yZSB1cCB0byBTQ1RQX01BWF9EVVBfVFNOUyB3b3J0aCBvZgogCSAqIGluZm9ybWF0aW9uLgogCSAqLwotCV9fdTMyIGR1cF90c25zW1NDVFBfTUFYX0RVUF9UU05TXTsKKwlfX2JlMzIgZHVwX3RzbnNbU0NUUF9NQVhfRFVQX1RTTlNdOwogCV9fdTE2IG51bV9kdXBfdHNuczsKIAogCS8qIFJlY29yZCBnYXAgYWNrIGJsb2NrIGluZm9ybWF0aW9uIGhlcmUuICAqLwpAQCAtMTYyLDcgKzE2Miw3IEBACiB9CiAKIC8qIFJldHVybiBwb2ludGVyIHRvIGR1cGxpY2F0ZSB0c24gYXJyYXkgYXMgbmVlZGVkIGJ5IFNBQ0suICovCi1zdGF0aWMgaW5saW5lIF9fdTMyICpzY3RwX3Rzbm1hcF9nZXRfZHVwcyhzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCkKK3N0YXRpYyBpbmxpbmUgX19iZTMyICpzY3RwX3Rzbm1hcF9nZXRfZHVwcyhzdHJ1Y3Qgc2N0cF90c25tYXAgKm1hcCkKIHsKIAltYXAtPm51bV9kdXBfdHNucyA9IDA7CiAJcmV0dXJuIG1hcC0+ZHVwX3RzbnM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaCBiL2luY2x1ZGUvbmV0L3NjdHAvdXNlci5oCmluZGV4IDFiN2FhZTYuLjllNGEzOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvdXNlci5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvdXNlci5oCkBAIC05NSw2ICs5NSw4IEBACiAjZGVmaW5lIFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPIFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPCiAJU0NUUF9ERUxBWUVEX0FDS19USU1FLAogI2RlZmluZSBTQ1RQX0RFTEFZRURfQUNLX1RJTUUgU0NUUF9ERUxBWUVEX0FDS19USU1FCisJU0NUUF9DT05URVhULAkvKiBSZWNlaXZlIENvbnRleHQgKi8KKyNkZWZpbmUgU0NUUF9DT05URVhUIFNDVFBfQ09OVEVYVAogCiAJLyogSW50ZXJuYWwgU29ja2V0IE9wdGlvbnMuIFNvbWUgb2YgdGhlIHNjdHAgbGlicmFyeSBmdW5jdGlvbnMgYXJlIAogCSAqIGltcGxlbWVudGVkIHVzaW5nIHRoZXNlIHNvY2tldCBvcHRpb25zLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oCmluZGV4IDQwYmI5MGUuLjAzNjg0ZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9zb2NrLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CS8qIHN0cnVjdCBza19idWZmICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogCiAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CkBAIC01NzAsNyArNTcxLDcgQEAKIAlpbnQJCQkqc3lzY3RsX3JtZW07CiAJaW50CQkJbWF4X2hlYWRlcjsKIAotCWttZW1fY2FjaGVfdAkJKnNsYWI7CisJc3RydWN0IGttZW1fY2FjaGUJCSpzbGFiOwogCXVuc2lnbmVkIGludAkJb2JqX3NpemU7CiAKIAlhdG9taWNfdAkJKm9ycGhhbl9jb3VudDsKQEAgLTc0NSw3ICs3NDYsMzIgQEAKICAqLwogI2RlZmluZSBzb2NrX293bmVkX2J5X3VzZXIoc2spCSgoc2spLT5za19sb2NrLm93bmVyKQogCi1leHRlcm4gdm9pZCBGQVNUQ0FMTChsb2NrX3NvY2soc3RydWN0IHNvY2sgKnNrKSk7CisvKgorICogTWFjcm8gc28gYXMgdG8gbm90IGV2YWx1YXRlIHNvbWUgYXJndW1lbnRzIHdoZW4KKyAqIGxvY2tkZXAgaXMgbm90IGVuYWJsZWQuCisgKgorICogTWFyayBib3RoIHRoZSBza19sb2NrIGFuZCB0aGUgc2tfbG9jay5zbG9jayBhcyBhCisgKiBwZXItYWRkcmVzcy1mYW1pbHkgbG9jayBjbGFzcy4KKyAqLworI2RlZmluZSBzb2NrX2xvY2tfaW5pdF9jbGFzc19hbmRfbmFtZShzaywgc25hbWUsIHNrZXksIG5hbWUsIGtleSkgCVwKK2RvIHsJCQkJCQkJCQlcCisJc2stPnNrX2xvY2sub3duZXIgPSBOVUxMOwkJCQkJXAorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNrLT5za19sb2NrLndxKTsJCQkJXAorCXNwaW5fbG9ja19pbml0KCYoc2spLT5za19sb2NrLnNsb2NrKTsJCQkJXAorCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKCh2b2lkICopJihzayktPnNrX2xvY2ssCQlcCisJCQlzaXplb2YoKHNrKS0+c2tfbG9jaykpOwkJCQlcCisJbG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUoJihzayktPnNrX2xvY2suc2xvY2ssCQlcCisJCSAgICAgICAJKHNrZXkpLCAoc25hbWUpKTsJCQkJXAorCWxvY2tkZXBfaW5pdF9tYXAoJihzayktPnNrX2xvY2suZGVwX21hcCwgKG5hbWUpLCAoa2V5KSwgMCk7CVwKK30gd2hpbGUgKDApCisKK2V4dGVybiB2b2lkIEZBU1RDQUxMKGxvY2tfc29ja19uZXN0ZWQoc3RydWN0IHNvY2sgKnNrLCBpbnQgc3ViY2xhc3MpKTsKKworc3RhdGljIGlubGluZSB2b2lkIGxvY2tfc29jayhzdHJ1Y3Qgc29jayAqc2spCit7CisJbG9ja19zb2NrX25lc3RlZChzaywgMCk7Cit9CisKIGV4dGVybiB2b2lkIEZBU1RDQUxMKHJlbGVhc2Vfc29jayhzdHJ1Y3Qgc29jayAqc2spKTsKIAogLyogQkggY29udGV4dCBtYXkgb25seSB1c2UgdGhlIGZvbGxvd2luZyBsb2NraW5nIGludGVyZmFjZS4gKi8KQEAgLTg4MywxOCArOTA5LDIyIEBACiB9CiAKIC8qKgorICogCXNrX2ZpbHRlcl9yY3VfZnJlZTogRnJlZSBhIHNvY2tldCBmaWx0ZXIKKyAqCUByY3U6IHJjdV9oZWFkIHRoYXQgY29udGFpbnMgdGhlIHNrX2ZpbHRlciB0byBmcmVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBza19maWx0ZXJfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IHNrX2ZpbHRlciAqZnAgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgc2tfZmlsdGVyLCByY3UpOworCWtmcmVlKGZwKTsKK30KKworLyoqCiAgKglza19maWx0ZXJfcmVsZWFzZTogUmVsZWFzZSBhIHNvY2tldCBmaWx0ZXIKICAqCUBzazogc29ja2V0CiAgKglAZnA6IGZpbHRlciB0byByZW1vdmUKICAqCiAgKglSZW1vdmUgYSBmaWx0ZXIgZnJvbSBhIHNvY2tldCBhbmQgcmVsZWFzZSBpdHMgcmVzb3VyY2VzLgogICovCi0gCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tfZmlsdGVyX3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqcmN1KQotewotCXN0cnVjdCBza19maWx0ZXIgKmZwID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHNrX2ZpbHRlciwgcmN1KTsKLQlrZnJlZShmcCk7Ci19CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBza19maWx0ZXJfcmVsZWFzZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19maWx0ZXIgKmZwKQogewpAQCAtOTQ0LDcgKzk3NCw4IEBACiAJCXNrX2ZyZWUoc2spOwogfQogCi1leHRlcm4gaW50IHNrX3JlY2VpdmVfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IHNrX3JlY2VpdmVfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgY29uc3QgaW50IG5lc3RlZCk7CiAKIC8qIERldGFjaCBzb2NrZXQgZnJvbSBwcm9jZXNzIGNvbnRleHQuCiAgKiBBbm5vdW5jZSBzb2NrZXQgZGVhZCwgZGV0YWNoIGl0IGZyb20gd2FpdCBxdWV1ZSBhbmQgaW5vZGUuCkBAIC0xMDc4LDcgKzExMDksNyBAQAogewogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9OT05FKSB7CiAJCWludCBlcnIgPSAwOwotCQl1bnNpZ25lZCBpbnQgY3N1bSA9IGNzdW1fYW5kX2NvcHlfZnJvbV91c2VyKGZyb20sCisJCV9fd3N1bSBjc3VtID0gY3N1bV9hbmRfY29weV9mcm9tX3VzZXIoZnJvbSwKIAkJCQkJCSAgICAgcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2ZmLAogCQkJCQkJCSAgICBjb3B5LCAwLCAmZXJyKTsKIAkJaWYgKGVycikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggN2EwOTNkMC4uYzk5Nzc0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KIAogI2luY2x1ZGUgPG5ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X3RpbWV3YWl0X3NvY2suaD4KQEAgLTEzOCw3ICsxMzksNiBAQAogI2RlZmluZSBNQVhfVENQX1NZTkNOVAkJMTI3CiAKICNkZWZpbmUgVENQX1NZTlFfSU5URVJWQUwJKEhaLzUpCS8qIFBlcmlvZCBvZiBTWU5BQ0sgdGltZXIgKi8KLSNkZWZpbmUgVENQX1NZTlFfSFNJWkUJCTUxMgkvKiBTaXplIG9mIFNZTkFDSyBoYXNoIHRhYmxlICovCiAKICNkZWZpbmUgVENQX1BBV1NfMjREQVlTCSg2MCAqIDYwICogMjQgKiAyNCkKICNkZWZpbmUgVENQX1BBV1NfTVNMCTYwCQkvKiBQZXItaG9zdCB0aW1lc3RhbXBzIGFyZSBpbnZhbGlkYXRlZApAQCAtMTYyLDYgKzE2Miw3IEBACiAjZGVmaW5lIFRDUE9QVF9TQUNLX1BFUk0gICAgICAgIDQgICAgICAgLyogU0FDSyBQZXJtaXR0ZWQgKi8KICNkZWZpbmUgVENQT1BUX1NBQ0sgICAgICAgICAgICAgNSAgICAgICAvKiBTQUNLIEJsb2NrICovCiAjZGVmaW5lIFRDUE9QVF9USU1FU1RBTVAJOAkvKiBCZXR0ZXIgUlRUIGVzdGltYXRpb25zL1BBV1MgKi8KKyNkZWZpbmUgVENQT1BUX01ENVNJRwkJMTkJLyogTUQ1IFNpZ25hdHVyZSAoUkZDMjM4NSkgKi8KIAogLyoKICAqICAgICBUQ1Agb3B0aW9uIGxlbmd0aHMKQEAgLTE3MSw2ICsxNzIsNyBAQAogI2RlZmluZSBUQ1BPTEVOX1dJTkRPVyAgICAgICAgIDMKICNkZWZpbmUgVENQT0xFTl9TQUNLX1BFUk0gICAgICAyCiAjZGVmaW5lIFRDUE9MRU5fVElNRVNUQU1QICAgICAgMTAKKyNkZWZpbmUgVENQT0xFTl9NRDVTSUcgICAgICAgICAxOAogCiAvKiBCdXQgdGhpcyBpcyB3aGF0IHN0YWNrcyByZWFsbHkgc2VuZCBvdXQuICovCiAjZGVmaW5lIFRDUE9MRU5fVFNUQU1QX0FMSUdORUQJCTEyCkBAIC0xNzksNiArMTgxLDcgQEAKICNkZWZpbmUgVENQT0xFTl9TQUNLX0JBU0UJCTIKICNkZWZpbmUgVENQT0xFTl9TQUNLX0JBU0VfQUxJR05FRAk0CiAjZGVmaW5lIFRDUE9MRU5fU0FDS19QRVJCTE9DSwkJOAorI2RlZmluZSBUQ1BPTEVOX01ENVNJR19BTElHTkVECQkyMAogCiAvKiBGbGFncyBpbiB0cC0+bm9uYWdsZSAqLwogI2RlZmluZSBUQ1BfTkFHTEVfT0ZGCQkxCS8qIE5hZ2xlJ3MgYWxnbyBpcyBkaXNhYmxlZCAqLwpAQCAtMzAwLDYgKzMwMyw4IEBACiBleHRlcm4gaW50CQkJdGNwX3R3c2tfdW5pcXVlKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJCXN0cnVjdCBzb2NrICpza3R3LCB2b2lkICp0d3ApOwogCitleHRlcm4gdm9pZAkJCXRjcF90d3NrX2Rlc3RydWN0b3Ioc3RydWN0IHNvY2sgKnNrKTsKKwogc3RhdGljIGlubGluZSB2b2lkIHRjcF9kZWNfcXVpY2thY2tfbW9kZShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSBjb25zdCB1bnNpZ25lZCBpbnQgcGt0cykKIHsKQEAgLTYyMSw4ICs2MjYsMTIgQEAKICAqIEludGVyZmFjZSBmb3IgYWRkaW5nIG5ldyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIGhhbmRsZXJzCiAgKi8KICNkZWZpbmUgVENQX0NBX05BTUVfTUFYCTE2CisjZGVmaW5lIFRDUF9DQV9NQVgJMTI4CisjZGVmaW5lIFRDUF9DQV9CVUZfTUFYCShUQ1BfQ0FfTkFNRV9NQVgqVENQX0NBX01BWCkKKwogc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCWludAlub25fcmVzdHJpY3RlZDsKIAogCS8qIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhIChvcHRpb25hbCkgKi8KIAl2b2lkICgqaW5pdCkoc3RydWN0IHNvY2sgKnNrKTsKQEAgLTY2MCw2ICs2NjksOSBAQAogZXh0ZXJuIHZvaWQgdGNwX2NsZWFudXBfY29uZ2VzdGlvbl9jb250cm9sKHN0cnVjdCBzb2NrICpzayk7CiBleHRlcm4gaW50IHRjcF9zZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2woY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gdm9pZCB0Y3BfZ2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgdGNwX2dldF9hdmFpbGFibGVfY29uZ2VzdGlvbl9jb250cm9sKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCB0Y3BfZ2V0X2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitleHRlcm4gaW50IHRjcF9zZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2woY2hhciAqYWxsb3dlZCk7CiBleHRlcm4gaW50IHRjcF9zZXRfY29uZ2VzdGlvbl9jb250cm9sKHN0cnVjdCBzb2NrICpzaywgY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gdm9pZCB0Y3Bfc2xvd19zdGFydChzdHJ1Y3QgdGNwX3NvY2sgKnRwKTsKIApAQCAtNzk1LDE0ICs4MDcsMTQgQEAKIC8qCiAgKiBDYWxjdWxhdGUoL2NoZWNrKSBUQ1AgY2hlY2tzdW0KICAqLwotc3RhdGljIGlubGluZSB1MTYgdGNwX3Y0X2NoZWNrKHN0cnVjdCB0Y3BoZHIgKnRoLCBpbnQgbGVuLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2FkZHIsIHVuc2lnbmVkIGxvbmcgZGFkZHIsIAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSkKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiB0Y3BfdjRfY2hlY2soc3RydWN0IHRjcGhkciAqdGgsIGludCBsZW4sCisJCQkgICAgICAgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkgICAgICAgX193c3VtIGJhc2UpCiB7CiAJcmV0dXJuIGNzdW1fdGNwdWRwX21hZ2ljKHNhZGRyLGRhZGRyLGxlbixJUFBST1RPX1RDUCxiYXNlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX190Y3BfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBfX3RjcF9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwogfQpAQCAtMTA1OCw2ICsxMDcwLDExNCBAQAogCXRwLT5mYXN0cGF0aF9za2JfaGludCA9IE5VTEw7CiB9CiAKKy8qIE1ENSBTaWduYXR1cmUgKi8KK3N0cnVjdCBjcnlwdG9faGFzaDsKKworLyogLSBrZXkgZGF0YWJhc2UgKi8KK3N0cnVjdCB0Y3BfbWQ1c2lnX2tleSB7CisJdTgJCQkqa2V5OworCXU4CQkJa2V5bGVuOworfTsKKworc3RydWN0IHRjcDRfbWQ1c2lnX2tleSB7CisJdTgJCQkqa2V5OworCXUxNgkJCWtleWxlbjsKKwlfX2JlMzIJCQlhZGRyOworfTsKKworc3RydWN0IHRjcDZfbWQ1c2lnX2tleSB7CisJdTgJCQkqa2V5OworCXUxNgkJCWtleWxlbjsKKyNpZiAwCisJdTMyCQkJc2NvcGVfaWQ7CS8qIFhYWCAqLworI2VuZGlmCisJc3RydWN0IGluNl9hZGRyCQlhZGRyOworfTsKKworLyogLSBzb2NrIGJsb2NrICovCitzdHJ1Y3QgdGNwX21kNXNpZ19pbmZvIHsKKwlzdHJ1Y3QgdGNwNF9tZDVzaWdfa2V5CSprZXlzNDsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKwlzdHJ1Y3QgdGNwNl9tZDVzaWdfa2V5CSprZXlzNjsKKwl1MzIJCQllbnRyaWVzNjsKKwl1MzIJCQlhbGxvY2VkNjsKKyNlbmRpZgorCXUzMgkJCWVudHJpZXM0OworCXUzMgkJCWFsbG9jZWQ0OworfTsKKworLyogLSBwc2V1ZG8gaGVhZGVyICovCitzdHJ1Y3QgdGNwNF9wc2V1ZG9oZHIgeworCV9fYmUzMgkJc2FkZHI7CisJX19iZTMyCQlkYWRkcjsKKwlfX3U4CQlwYWQ7CisJX191OAkJcHJvdG9jb2w7CisJX19iZTE2CQlsZW47Cit9OworCitzdHJ1Y3QgdGNwNl9wc2V1ZG9oZHIgeworCXN0cnVjdCBpbjZfYWRkcglzYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgZGFkZHI7CisJX19iZTMyCQlsZW47CisJX19iZTMyCQlwcm90b2NvbDsJLyogaW5jbHVkaW5nIHBhZGRpbmcgKi8KK307CisKK3VuaW9uIHRjcF9tZDVzdW1fYmxvY2sgeworCXN0cnVjdCB0Y3A0X3BzZXVkb2hkciBpcDQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJc3RydWN0IHRjcDZfcHNldWRvaGRyIGlwNjsKKyNlbmRpZgorfTsKKworLyogLSBwb29sOiBkaWdlc3QgYWxnb3JpdGhtLCBoYXNoIGRlc2NyaXB0aW9uIGFuZCBzY3JhdGNoIGJ1ZmZlciAqLworc3RydWN0IHRjcF9tZDVzaWdfcG9vbCB7CisJc3RydWN0IGhhc2hfZGVzYwltZDVfZGVzYzsKKwl1bmlvbiB0Y3BfbWQ1c3VtX2Jsb2NrCW1kNV9ibGs7Cit9OworCisjZGVmaW5lIFRDUF9NRDVTSUdfTUFYS0VZUwkofih1MzIpMCkJLyogcmVhbGx5PyEgKi8KKworLyogLSBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQJCQl0Y3BfdjRfY2FsY19tZDVfaGFzaChjaGFyICptZDVfaGFzaCwKKwkJCQkJCSAgICAgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksCisJCQkJCQkgICAgIHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCSAgICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAorCQkJCQkJICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCisJCQkJCQkgICAgIHN0cnVjdCB0Y3BoZHIgKnRoLAorCQkJCQkJICAgICBpbnQgcHJvdG9jb2wsIGludCB0Y3BsZW4pOworZXh0ZXJuIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleQkqdGNwX3Y0X21kNV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICAgc3RydWN0IHNvY2sgKmFkZHJfc2spOworCitleHRlcm4gaW50CQkJdGNwX3Y0X21kNV9kb19hZGQoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICBfX2JlMzIgYWRkciwKKwkJCQkJCSAgdTggKm5ld2tleSwKKwkJCQkJCSAgdTggbmV3a2V5bGVuKTsKKworZXh0ZXJuIGludAkJCXRjcF92NF9tZDVfZG9fZGVsKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCSAgX19iZTMyIGFkZHIpOworCitleHRlcm4gc3RydWN0IHRjcF9tZDVzaWdfcG9vbAkqKnRjcF9hbGxvY19tZDVzaWdfcG9vbCh2b2lkKTsKK2V4dGVybiB2b2lkCQkJdGNwX2ZyZWVfbWQ1c2lnX3Bvb2wodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgdGNwX21kNXNpZ19wb29sCSpfX3RjcF9nZXRfbWQ1c2lnX3Bvb2woaW50IGNwdSk7CitleHRlcm4gdm9pZAkJCV9fdGNwX3B1dF9tZDVzaWdfcG9vbCh2b2lkKTsKKworc3RhdGljIGlubGluZQorc3RydWN0IHRjcF9tZDVzaWdfcG9vbAkJKnRjcF9nZXRfbWQ1c2lnX3Bvb2wodm9pZCkKK3sKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKnJldCA9IF9fdGNwX2dldF9tZDVzaWdfcG9vbChjcHUpOworCWlmICghcmV0KQorCQlwdXRfY3B1KCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCQl0Y3BfcHV0X21kNXNpZ19wb29sKHZvaWQpCit7CisJX190Y3BfcHV0X21kNXNpZ19wb29sKCk7CisJcHV0X2NwdSgpOworfQorCiAvKiAvcHJvYyAqLwogZW51bSB0Y3Bfc2VxX3N0YXRlcyB7CiAJVENQX1NFUV9TVEFURV9MSVNURU5JTkcsCkBAIC0xMDk3LDYgKzEyMTcsMzUgQEAKIGV4dGVybiB2b2lkIHRjcDRfcHJvY19leGl0KHZvaWQpOwogI2VuZGlmCiAKKy8qIFRDUCBhZi1zcGVjaWZpYyBmdW5jdGlvbnMgKi8KK3N0cnVjdCB0Y3Bfc29ja19hZl9vcHMgeworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJc3RydWN0IHRjcF9tZDVzaWdfa2V5CSooKm1kNV9sb29rdXApIChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQlzdHJ1Y3Qgc29jayAqYWRkcl9zayk7CisJaW50CQkJKCpjYWxjX21kNV9oYXNoKSAoY2hhciAqbG9jYXRpb24sCisJCQkJCQkgIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqbWQ1LAorCQkJCQkJICBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKKwkJCQkJCSAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJCQkJICBzdHJ1Y3QgdGNwaGRyICp0aCwKKwkJCQkJCSAgaW50IHByb3RvY29sLCBpbnQgbGVuKTsKKwlpbnQJCQkoKm1kNV9hZGQpIChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICBzdHJ1Y3Qgc29jayAqYWRkcl9zaywKKwkJCQkJICAgIHU4ICpuZXdrZXksCisJCQkJCSAgICB1OCBsZW4pOworCWludAkJCSgqbWQ1X3BhcnNlKSAoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkgICAgICBpbnQgb3B0bGVuKTsKKyNlbmRpZgorfTsKKworc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2tfb3BzIHsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleQkqKCptZDVfbG9va3VwKSAoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTsKKyNlbmRpZgorfTsKKwogZXh0ZXJuIHZvaWQgdGNwX3Y0X2luaXQoc3RydWN0IG5ldF9wcm90b19mYW1pbHkgKm9wcyk7CiBleHRlcm4gdm9pZCB0Y3BfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGltZXdhaXRfc29jay5oIGIvaW5jbHVkZS9uZXQvdGltZXdhaXRfc29jay5oCmluZGV4IGJlMjkzZDcuLjFlMWVlMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RpbWV3YWl0X3NvY2suaAorKysgYi9pbmNsdWRlL25ldC90aW1ld2FpdF9zb2NrLmgKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiBzdHJ1Y3QgdGltZXdhaXRfc29ja19vcHMgewotCWttZW1fY2FjaGVfdAkqdHdza19zbGFiOworCXN0cnVjdCBrbWVtX2NhY2hlCSp0d3NrX3NsYWI7CiAJdW5zaWduZWQgaW50CXR3c2tfb2JqX3NpemU7CiAJaW50CQkoKnR3c2tfdW5pcXVlKShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJICAgICAgIHN0cnVjdCBzb2NrICpza3R3LCB2b2lkICp0d3ApOwpAQCAtMzEsNiArMzEsOSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdHdza19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzaykKIHsKKwlCVUdfT04oc2sgPT0gTlVMTCk7CisJQlVHX09OKHNrLT5za19wcm90ID09IE5VTEwpOworCUJVR19PTihzay0+c2tfcHJvdC0+dHdza19wcm90ID09IE5VTEwpOwogCWlmIChzay0+c2tfcHJvdC0+dHdza19wcm90LT50d3NrX2Rlc3RydWN0b3IgIT0gTlVMTCkKIAkJc2stPnNrX3Byb3QtPnR3c2tfcHJvdC0+dHdza19kZXN0cnVjdG9yKHNrKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19iZWFyZXIuaAppbmRleCBlMDcxMzZkLi4yMTUxYTgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfYmVhcmVyLmgKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX2JlYXJlci5oCkBAIC01OCw3ICs1OCw3IEBACiAgKi8KIAogc3RydWN0IHRpcGNfbWVkaWFfYWRkciB7Ci0JX191MzIgIHR5cGU7CQkJLyogYmVhcmVyIHR5cGUgKG5ldHdvcmsgYnl0ZSBvcmRlcikgKi8KKwlfX2JlMzIgIHR5cGU7CQkJLyogYmVhcmVyIHR5cGUgKG5ldHdvcmsgYnl0ZSBvcmRlcikgKi8KIAl1bmlvbiB7CiAJCV9fdTggICBldGhfYWRkcls2XTsJLyogNDggYml0IEV0aGVybmV0IGFkZHIgKGJ5dGUgYXJyYXkpICovIAogI2lmIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaCBiL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaAppbmRleCA0ZDA5NmVlLi5mYjQyZWI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90aXBjL3RpcGNfbXNnLmgKKysrIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX21zZy5oCkBAIC00MCw3ICs0MCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiBzdHJ1Y3QgdGlwY19tc2cgewotCXUzMiBoZHJbMTVdOworCV9fYmUzMiBoZHJbMTVdOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90cmFuc3BfdjYuaCBiL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCmluZGV4IDYxZjcyNGMuLjQwOWRhM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCisrKyBiL2luY2x1ZGUvbmV0L3RyYW5zcF92Ni5oCkBAIC0xMSw2ICsxMSw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgcHJvdG8gcmF3djZfcHJvdDsKIGV4dGVybiBzdHJ1Y3QgcHJvdG8gdWRwdjZfcHJvdDsKK2V4dGVybiBzdHJ1Y3QgcHJvdG8gdWRwbGl0ZXY2X3Byb3Q7CiBleHRlcm4gc3RydWN0IHByb3RvIHRjcHY2X3Byb3Q7CiAKIHN0cnVjdCBmbG93aTsKQEAgLTI0LDYgKzI1LDcgQEAKIC8qIHRyYW5zcG9ydCBwcm90b2NvbHMgKi8KIGV4dGVybiB2b2lkCQkJCXJhd3Y2X2luaXQodm9pZCk7CiBleHRlcm4gdm9pZAkJCQl1ZHB2Nl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgCQkJCXVkcGxpdGV2Nl9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQJCQkJdGNwdjZfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIGludAkJCQl1ZHB2Nl9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcC5oIGIvaW5jbHVkZS9uZXQvdWRwLmgKaW5kZXggZGIwYzA1Zi4uMWI5MjFmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdWRwLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwLmgKQEAgLTI2LDkgKzI2LDI5IEBACiAjaW5jbHVkZSA8bmV0L2luZXRfc29jay5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAKLSNkZWZpbmUgVURQX0hUQUJMRV9TSVpFCQkxMjgKKy8qKgorICoJc3RydWN0IHVkcF9za2JfY2IgIC0gIFVEUCgtTGl0ZSkgcHJpdmF0ZSB2YXJpYWJsZXMKKyAqCisgKglAaGVhZGVyOiAgICAgIHByaXZhdGUgdmFyaWFibGVzIHVzZWQgYnkgSVB2NC9JUHY2CisgKglAY3Njb3Y6ICAgICAgIGNoZWNrc3VtIGNvdmVyYWdlIGxlbmd0aCAoVURQLUxpdGUgb25seSkKKyAqCUBwYXJ0aWFsX2NvdjogaWYgc2V0IGluZGljYXRlcyBwYXJ0aWFsIGNzdW0gY292ZXJhZ2UKKyAqLworc3RydWN0IHVkcF9za2JfY2IgeworCXVuaW9uIHsKKwkJc3RydWN0IGluZXRfc2tiX3Bhcm0JaDQ7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQorCQlzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0JaDY7CisjZW5kaWYKKwl9IGhlYWRlcjsKKwlfX3UxNgkJY3Njb3Y7CisJX191OAkJcGFydGlhbF9jb3Y7Cit9OworI2RlZmluZSBVRFBfU0tCX0NCKF9fc2tiKQkoKHN0cnVjdCB1ZHBfc2tiX2NiICopKChfX3NrYiktPmNiKSkKIAogZXh0ZXJuIHN0cnVjdCBobGlzdF9oZWFkIHVkcF9oYXNoW1VEUF9IVEFCTEVfU0laRV07CiBleHRlcm4gcndsb2NrX3QgdWRwX2hhc2hfbG9jazsKQEAgLTQ3LDYgKzY3LDYyIEBACiAKIHN0cnVjdCBza19idWZmOwogCisvKgorICoJR2VuZXJpYyBjaGVja3N1bW1pbmcgcm91dGluZXMgZm9yIFVEUCgtTGl0ZSkgdjQgYW5kIHY2CisgKi8KK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBfX3VkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoISBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292KQorCQlyZXR1cm4gX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKKwlyZXR1cm4gY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIFVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YsCisJCQkJICAgICAgc2tiLT5jc3VtKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKKwkJX191ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7Cit9CisKKy8qKgorICogCXVkcF9jc3VtX291dGdvaW5nICAtICBjb21wdXRlIFVEUHY0L3Y2IGNoZWNrc3VtIG92ZXIgZnJhZ21lbnRzCisgKiAJQHNrOiAJc29ja2V0IHdlIGFyZSB3cml0aW5nIHRvCisgKiAJQHNrYjogCXNrX2J1ZmYgY29udGFpbmluZyB0aGUgZmlsbGVkLWluIFVEUCBoZWFkZXIKKyAqIAkgICAgICAgIChjaGVja3N1bSBmaWVsZCBtdXN0IGJlIHplcm9lZCBvdXQpCisgKi8KK3N0YXRpYyBpbmxpbmUgX193c3VtIHVkcF9jc3VtX291dGdvaW5nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3dzdW0gY3N1bSA9IGNzdW1fcGFydGlhbChza2ItPmgucmF3LCBzaXplb2Yoc3RydWN0IHVkcGhkciksIDApOworCisJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7CisJCWNzdW0gPSBjc3VtX2FkZChjc3VtLCBza2ItPmNzdW0pOworCX0KKwlyZXR1cm4gY3N1bTsKK30KKworLyogaGFzaCByb3V0aW5lcyBzaGFyZWQgYmV0d2VlbiBVRFB2NC82IGFuZCBVRFAtTGl0ZXY0LzYgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZHBfbGliX2hhc2goc3RydWN0IHNvY2sgKnNrKQoreworCUJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRwX2xpYl91bmhhc2goc3RydWN0IHNvY2sgKnNrKQoreworCXdyaXRlX2xvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworCWlmIChza19kZWxfbm9kZV9pbml0KHNrKSkgeworCQlpbmV0X3NrKHNrKS0+bnVtID0gMDsKKwkJc29ja19wcm90X2RlY191c2Uoc2stPnNrX3Byb3QpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnVkcF9oYXNoX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRwX2xpYl9jbG9zZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKK3sKKwlza19jb21tb25fcmVsZWFzZShzayk7Cit9CisKKworLyogbmV0L2lwdjQvdWRwLmMgKi8KIGV4dGVybiBpbnQJdWRwX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKIAkJCSAgICAgaW50ICgqc2FkZHJfY21wKShjb25zdCBzdHJ1Y3Qgc29jayAqLCBjb25zdCBzdHJ1Y3Qgc29jayAqKSk7CiBleHRlcm4gdm9pZAl1ZHBfZXJyKHN0cnVjdCBza19idWZmICosIHUzMik7CkBAIC01OSwyMyArMTM1LDM2IEBACiBleHRlcm4gaW50CXVkcF9kaXNjb25uZWN0KHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgdWRwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkgICAgIHBvbGxfdGFibGUgKndhaXQpOworZXh0ZXJuIGludCAJdWRwX2xpYl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgICAgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKK2V4dGVybiBpbnQgCXVkcF9saWJfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbiwKKwkJCQkgICBpbnQgKCpwdXNoX3BlbmRpbmdfZnJhbWVzKShzdHJ1Y3Qgc29jayAqKSk7CiAKIERFQ0xBUkVfU05NUF9TVEFUKHN0cnVjdCB1ZHBfbWliLCB1ZHBfc3RhdGlzdGljcyk7Ci0jZGVmaW5lIFVEUF9JTkNfU1RBVFMoZmllbGQpCQlTTk1QX0lOQ19TVEFUUyh1ZHBfc3RhdGlzdGljcywgZmllbGQpCi0jZGVmaW5lIFVEUF9JTkNfU1RBVFNfQkgoZmllbGQpCQlTTk1QX0lOQ19TVEFUU19CSCh1ZHBfc3RhdGlzdGljcywgZmllbGQpCi0jZGVmaW5lIFVEUF9JTkNfU1RBVFNfVVNFUihmaWVsZCkgCVNOTVBfSU5DX1NUQVRTX1VTRVIodWRwX3N0YXRpc3RpY3MsIGZpZWxkKQorLyoKKyAqIAlTTk1QIHN0YXRpc3RpY3MgZm9yIFVEUCBhbmQgVURQLUxpdGUKKyAqLworI2RlZmluZSBVRFBfSU5DX1NUQVRTX1VTRVIoZmllbGQsIGlzX3VkcGxpdGUpCQkJICAgICAgIGRvIHsgICBcCisJaWYgKGlzX3VkcGxpdGUpIFNOTVBfSU5DX1NUQVRTX1VTRVIodWRwbGl0ZV9zdGF0aXN0aWNzLCBmaWVsZCk7ICAgICAgIFwKKwllbHNlCQlTTk1QX0lOQ19TVEFUU19VU0VSKHVkcF9zdGF0aXN0aWNzLCBmaWVsZCk7ICB9ICB3aGlsZSgwKQorI2RlZmluZSBVRFBfSU5DX1NUQVRTX0JIKGZpZWxkLCBpc191ZHBsaXRlKSAJCQkgICAgICAgZG8gIHsgIFwKKwlpZiAoaXNfdWRwbGl0ZSkgU05NUF9JTkNfU1RBVFNfQkgodWRwbGl0ZV9zdGF0aXN0aWNzLCBmaWVsZCk7ICAgICAgICAgXAorCWVsc2UJCVNOTVBfSU5DX1NUQVRTX0JIKHVkcF9zdGF0aXN0aWNzLCBmaWVsZCk7ICAgIH0gIHdoaWxlKDApCiAKIC8qIC9wcm9jICovCiBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gewogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKIAljaGFyCQkJKm5hbWU7CiAJc2FfZmFtaWx5X3QJCWZhbWlseTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkqaGFzaHRhYmxlOwogCWludCAJCQkoKnNlcV9zaG93KSAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKIAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCSpzZXFfZm9wczsKIH07CiAKIHN0cnVjdCB1ZHBfaXRlcl9zdGF0ZSB7CiAJc2FfZmFtaWx5X3QJCWZhbWlseTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkqaGFzaHRhYmxlOwogCWludAkJCWJ1Y2tldDsKIAlzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMJc2VxX29wczsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC91ZHBsaXRlLmggYi9pbmNsdWRlL25ldC91ZHBsaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhYzUxNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3VkcGxpdGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqCURlZmluaXRpb25zIGZvciB0aGUgVURQLUxpdGUgKFJGQyAzODI4KSBjb2RlLgorICovCisjaWZuZGVmIF9VRFBMSVRFX0gKKyNkZWZpbmUgX1VEUExJVEVfSAorCisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorCisvKiBVRFAtTGl0ZSBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBVRFBMSVRFX1NFTkRfQ1NDT1YgICAxMCAvKiBzZW5kZXIgcGFydGlhbCBjb3ZlcmFnZSAoYXMgc2VudCkgICAgICAqLworI2RlZmluZSBVRFBMSVRFX1JFQ1ZfQ1NDT1YgICAxMSAvKiByZWNlaXZlciBwYXJ0aWFsIGNvdmVyYWdlICh0aHJlc2hvbGQgKSAqLworCitleHRlcm4gc3RydWN0IHByb3RvIAkJdWRwbGl0ZV9wcm90OworZXh0ZXJuIHN0cnVjdCBobGlzdF9oZWFkIAl1ZHBsaXRlX2hhc2hbVURQX0hUQUJMRV9TSVpFXTsKKworLyogVURQLUxpdGUgZG9lcyBub3QgaGF2ZSBhIHN0YW5kYXJkaXplZCBNSUIgeWV0LCBzbyB3ZSBpbmhlcml0IGZyb20gVURQICovCitERUNMQVJFX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwbGl0ZV9zdGF0aXN0aWNzKTsKKworLyoKKyAqCUNoZWNrc3VtIGNvbXB1dGF0aW9uIGlzIGFsbCBpbiBzb2Z0d2FyZSwgaGVuY2Ugc2ltcGxlciBnZXRmcmFnLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdWRwbGl0ZV9nZXRmcmFnKHZvaWQgKmZyb20sIGNoYXIgKnRvLCBpbnQgIG9mZnNldCwKKwkJCQkgICAgICBpbnQgbGVuLCBpbnQgb2RkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBtZW1jcHlfZnJvbWlvdmVjZW5kKHRvLCAoc3RydWN0IGlvdmVjICopIGZyb20sIG9mZnNldCwgbGVuKTsKK30KKworLyogRGVzaWduYXRlIHNrIGFzIFVEUC1MaXRlIHNvY2tldCAqLworc3RhdGljIGlubGluZSBpbnQgdWRwbGl0ZV9za19pbml0KHN0cnVjdCBzb2NrICpzaykKK3sKKwl1ZHBfc2soc2spLT5wY2ZsYWcgPSBVRFBMSVRFX0JJVDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIAlDaGVja3N1bW1pbmcgcm91dGluZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgdWRwbGl0ZV9jaGVja3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoKQoreworCXUxNiBjc2NvdjsKKworICAgICAgICAvKiBJbiBVRFB2NCBhIHplcm8gY2hlY2tzdW0gbWVhbnMgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgZ2VuZXJhdGVkIG5vCisgICAgICAgICAqIGNoZWNrc3VtLiBVRFAtTGl0ZSAobGlrZSBJUHY2KSBtYW5kYXRlcyBjaGVja3N1bXMsIGhlbmNlIHBhY2tldHMKKyAgICAgICAgICogd2l0aCBhIHplcm8gY2hlY2tzdW0gZmllbGQgYXJlIGlsbGVnYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKHVoLT5jaGVjayA9PSAwKSB7CisJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIlVEUExJVEU6IHplcm9lZCBjaGVja3N1bSBmaWVsZFxuIik7CisJCXJldHVybiAxOworCX0KKworICAgICAgICBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKKwljc2NvdiA9IG50b2hzKHVoLT5sZW4pOworCisJaWYgKGNzY292ID09IDApCQkgLyogSW5kaWNhdGVzIHRoYXQgZnVsbCBjb3ZlcmFnZSBpcyByZXF1aXJlZC4gKi8KKwkJY3Njb3YgPSBza2ItPmxlbjsKKwllbHNlIGlmIChjc2NvdiA8IDggIHx8IGNzY292ID4gc2tiLT5sZW4pIHsKKwkJLyoKKwkJICogQ292ZXJhZ2UgbGVuZ3RoIHZpb2xhdGVzIFJGQyAzODI4OiBsb2cgYW5kIGRpc2NhcmQgc2lsZW50bHkuCisJCSAqLworCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJVRFBMSVRFOiBiYWQgY3N1bSBjb3ZlcmFnZSAlZC8lZFxuIiwKKwkJCSAgICAgICBjc2Nvdiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMTsKKworCX0gZWxzZSBpZiAoY3Njb3YgPCBza2ItPmxlbikKKyAgICAgICAgCVVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YgPSAxOworCisgICAgICAgIFVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YgPSBjc2NvdjsKKworCS8qCisJICogVGhlcmUgaXMgbm8ga25vd24gTklDIG1hbnVmYWN0dXJlciBzdXBwb3J0aW5nIFVEUC1MaXRlIHlldCwKKwkgKiBoZW5jZSBpcF9zdW1tZWQgaXMgYWx3YXlzIChyZS0pc2V0IHRvIENIRUNLU1VNX05PTkUuCisJICovCisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB1ZHBsaXRlNF9jc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgpCit7CisJaW50IHJjID0gdWRwbGl0ZV9jaGVja3N1bV9pbml0KHNrYiwgdWgpOworCisJaWYgKCFyYykKKwkJc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkJICAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkJICAgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUExJVEUsIDApOworCXJldHVybiByYzsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHVkcGxpdGU2X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCkKK3sKKwlpbnQgcmMgPSB1ZHBsaXRlX2NoZWNrc3VtX2luaXQoc2tiLCB1aCk7CisKKwlpZiAoIXJjKQorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkJICAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCQkJCSAgICAgc2tiLT5sZW4sIElQUFJPVE9fVURQTElURSwgMCkpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSBpbnQgdWRwbGl0ZV9zZW5kZXJfY3Njb3Yoc3RydWN0IHVkcF9zb2NrICp1cCwgc3RydWN0IHVkcGhkciAqdWgpCit7CisJaW50IGNzY292ID0gdXAtPmxlbjsKKworCS8qCisJICogU2VuZGVyIGhhcyBzZXQgYHBhcnRpYWwgY292ZXJhZ2UnIG9wdGlvbiBvbiBVRFAtTGl0ZSBzb2NrZXQKKwkgKi8KKwlpZiAodXAtPnBjZmxhZyAmIFVEUExJVEVfU0VORF9DQykgICAgeworCQlpZiAodXAtPnBjc2xlbiA8IHVwLT5sZW4pIHsKKwkJLyogdXAtPnBjc2xlbiA9PSAwIG1lYW5zIHRoYXQgZnVsbCBjb3ZlcmFnZSBpcyByZXF1aXJlZCwKKwkJICogcGFydGlhbCBjb3ZlcmFnZSBvbmx5IGlmICAwIDwgdXAtPnBjc2xlbiA8IHVwLT5sZW4gKi8KKwkJCWlmICgwIDwgdXAtPnBjc2xlbikgeworCQkJICAgICAgIGNzY292ID0gdXAtPnBjc2xlbjsKKwkJCX0KKwkJCXVoLT5sZW4gPSBodG9ucyh1cC0+cGNzbGVuKTsKKwkJfQorCS8qCisJICogTk9URTogQ2F1c2VzIGZvciB0aGUgZXJyb3IgY2FzZSAgYHVwLT5wY3NsZW4gPiB1cC0+bGVuJzoKKwkgKiAgICAgICAgKGkpICBBcHBsaWNhdGlvbiBlcnJvciAod2lsbCBub3QgYmUgcGVuYWxpemVkKS4KKwkgKiAgICAgICAoaWkpICBQYXlsb2FkIHRvbyBiaWcgZm9yIHNlbmQgYnVmZmVyOiBkYXRhIGlzIHNwbGl0CisJICogICAgICAgICAgICAgaW50byBzZXZlcmFsIHBhY2tldHMsIGVhY2ggd2l0aCBpdHMgb3duIGhlYWRlci4KKwkgKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgKGUuZy4gbGFzdCBzZWdtZW50KSwgY292ZXJhZ2UgbWF5CisJICogICAgICAgICAgICAgZXhjZWVkIHBhY2tldCBsZW5ndGguCisJICogICAgICAgU2luY2UgcGFja2V0cyB3aXRoIGNvdmVyYWdlIGxlbmd0aCA+IHBhY2tldCBsZW5ndGggYXJlCisJICogICAgICAgaWxsZWdhbCwgd2UgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0cyBoZXJlLgorCSAqLworCX0KKwlyZXR1cm4gY3Njb3Y7Cit9CisKK3N0YXRpYyBpbmxpbmUgX193c3VtIHVkcGxpdGVfY3N1bV9vdXRnb2luZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG9mZiwgbGVuLCBjc2NvdiA9IHVkcGxpdGVfc2VuZGVyX2NzY292KHVkcF9zayhzayksIHNrYi0+aC51aCk7CisJX193c3VtIGNzdW0gPSAwOworCisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOyAgICAgLyogbm8gSFcgc3VwcG9ydCBmb3IgY2hlY2tzdW1taW5nICovCisKKwlza2JfcXVldWVfd2Fsaygmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpIHsKKwkJb2ZmID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJbGVuID0gc2tiLT5sZW4gLSBvZmY7CisKKwkJY3N1bSA9IHNrYl9jaGVja3N1bShza2IsIG9mZiwgKGNzY292ID4gbGVuKT8gbGVuIDogY3Njb3YsIGNzdW0pOworCisJCWlmICgoY3Njb3YgLT0gbGVuKSA8PSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBjc3VtOworfQorCitleHRlcm4gdm9pZAl1ZHBsaXRlNF9yZWdpc3Rlcih2b2lkKTsKK2V4dGVybiBpbnQgCXVkcGxpdGVfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtLAorCQkJaW50ICgqc2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKikpOworI2VuZGlmCS8qIF9VRFBMSVRFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCA3MzdmZGIyLi5lNDc2NTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC0zMTAsNiArMzEwLDggQEAKIC8qIFNvdXJjZSBhZGRyZXNzIG9mIHR1bm5lbC4gSWdub3JlZCwgaWYgaXQgaXMgbm90IGEgdHVubmVsLiAqLwogCXhmcm1fYWRkcmVzc190CQlzYWRkcjsKIAorCXVuc2lnbmVkIHNob3J0CQllbmNhcF9mYW1pbHk7CisKIAlfX3UzMgkJCXJlcWlkOwogCiAvKiBNb2RlOiB0cmFuc3BvcnQsIHR1bm5lbCBldGMuICovCkBAIC0zNDAsMTggKzM0MiwxOSBAQAogCWF0b21pY190CQlyZWZjbnQ7CiAJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CiAKLQl1OAkJCXR5cGU7CiAJdTMyCQkJcHJpb3JpdHk7CiAJdTMyCQkJaW5kZXg7CiAJc3RydWN0IHhmcm1fc2VsZWN0b3IJc2VsZWN0b3I7CiAJc3RydWN0IHhmcm1fbGlmZXRpbWVfY2ZnIGxmdDsKIAlzdHJ1Y3QgeGZybV9saWZldGltZV9jdXIgY3VybGZ0OwogCXN0cnVjdCBkc3RfZW50cnkgICAgICAgKmJ1bmRsZXM7Ci0JX191MTYJCQlmYW1pbHk7Ci0JX191OAkJCWFjdGlvbjsKLQlfX3U4CQkJZmxhZ3M7Ci0JX191OAkJCWRlYWQ7Ci0JX191OAkJCXhmcm1fbnI7CisJdTE2CQkJZmFtaWx5OworCXU4CQkJdHlwZTsKKwl1OAkJCWFjdGlvbjsKKwl1OAkJCWZsYWdzOworCXU4CQkJZGVhZDsKKwl1OAkJCXhmcm1fbnI7CisJLyogWFhYIDEgYnl0ZSBob2xlLCB0cnkgdG8gcGFjayAqLwogCXN0cnVjdCB4ZnJtX3NlY19jdHgJKnNlY3VyaXR5OwogCXN0cnVjdCB4ZnJtX3RtcGwgICAgICAgCXhmcm1fdmVjW1hGUk1fTUFYX0RFUFRIXTsKIH07CkBAIC0zNzksNyArMzgyLDcgQEAKIAlpbnQJCQkoKm5vdGlmeSkoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBrbV9ldmVudCAqYyk7CiAJaW50CQkJKCphY3F1aXJlKShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHhmcm1fdG1wbCAqLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgZGlyKTsKIAlzdHJ1Y3QgeGZybV9wb2xpY3kJKigqY29tcGlsZV9wb2xpY3kpKHN0cnVjdCBzb2NrICpzaywgaW50IG9wdCwgdTggKmRhdGEsIGludCBsZW4sIGludCAqZGlyKTsKLQlpbnQJCQkoKm5ld19tYXBwaW5nKShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgdTE2IHNwb3J0KTsKKwlpbnQJCQkoKm5ld19tYXBwaW5nKShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgX19iZTE2IHNwb3J0KTsKIAlpbnQJCQkoKm5vdGlmeV9wb2xpY3kpKHN0cnVjdCB4ZnJtX3BvbGljeSAqeCwgaW50IGRpciwgc3RydWN0IGttX2V2ZW50ICpjKTsKIAlpbnQJCQkoKnJlcG9ydCkodTggcHJvdG8sIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHhmcm1fYWRkcmVzc190ICphZGRyKTsKIH07CkBAIC0zODksNiArMzkyLDIwIEBACiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgeGZybV9wb2xpY3lfY291bnRbWEZSTV9QT0xJQ1lfTUFYKjJdOwogCisvKiBBdWRpdCBJbmZvcm1hdGlvbiAqLworc3RydWN0IHhmcm1fYXVkaXQKK3sKKwl1aWRfdAlsb2dpbnVpZDsKKwl1MzIJc2VjaWQ7Cit9OworCisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAorZXh0ZXJuIHZvaWQgeGZybV9hdWRpdF9sb2codWlkX3QgYXVpZCwgdTMyIHNlY2lkLCBpbnQgdHlwZSwgaW50IHJlc3VsdCwKKwkJICAgIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCB4ZnJtX3N0YXRlICp4KTsKKyNlbHNlCisjZGVmaW5lIHhmcm1fYXVkaXRfbG9nKGEscyx0LHIscCx4KSBkbyB7IDsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfQVVESVRTWVNDQUxMICovCisKIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZnJtX3BvbF9ob2xkKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9saWN5KQogewogCWlmIChsaWtlbHkocG9saWN5ICE9IE5VTEwpKQpAQCAtNDY4LDYgKzQ4NSw3IEBACiAJc3dpdGNoKGZsLT5wcm90bykgewogCWNhc2UgSVBQUk9UT19UQ1A6CiAJY2FzZSBJUFBST1RPX1VEUDoKKwljYXNlIElQUFJPVE9fVURQTElURToKIAljYXNlIElQUFJPVE9fU0NUUDoKIAkJcG9ydCA9IGZsLT5mbF9pcF9zcG9ydDsKIAkJYnJlYWs7CkBAIC00OTMsNiArNTExLDcgQEAKIAlzd2l0Y2goZmwtPnByb3RvKSB7CiAJY2FzZSBJUFBST1RPX1RDUDoKIAljYXNlIElQUFJPVE9fVURQOgorCWNhc2UgSVBQUk9UT19VRFBMSVRFOgogCWNhc2UgSVBQUk9UT19TQ1RQOgogCQlwb3J0ID0gZmwtPmZsX2lwX2Rwb3J0OwogCQlicmVhazsKQEAgLTUwNiw0MCArNTI1LDggQEAKIAlyZXR1cm4gcG9ydDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLV9feGZybTRfc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCkKLXsKLQlyZXR1cm4gIGFkZHJfbWF0Y2goJmZsLT5mbDRfZHN0LCAmc2VsLT5kYWRkciwgc2VsLT5wcmVmaXhsZW5fZCkgJiYKLQkJYWRkcl9tYXRjaCgmZmwtPmZsNF9zcmMsICZzZWwtPnNhZGRyLCBzZWwtPnByZWZpeGxlbl9zKSAmJgotCQkhKCh4ZnJtX2Zsb3dpX2Rwb3J0KGZsKSBeIHNlbC0+ZHBvcnQpICYgc2VsLT5kcG9ydF9tYXNrKSAmJgotCQkhKCh4ZnJtX2Zsb3dpX3Nwb3J0KGZsKSBeIHNlbC0+c3BvcnQpICYgc2VsLT5zcG9ydF9tYXNrKSAmJgotCQkoZmwtPnByb3RvID09IHNlbC0+cHJvdG8gfHwgIXNlbC0+cHJvdG8pICYmCi0JCShmbC0+b2lmID09IHNlbC0+aWZpbmRleCB8fCAhc2VsLT5pZmluZGV4KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLV9feGZybTZfc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCkKLXsKLQlyZXR1cm4gIGFkZHJfbWF0Y2goJmZsLT5mbDZfZHN0LCAmc2VsLT5kYWRkciwgc2VsLT5wcmVmaXhsZW5fZCkgJiYKLQkJYWRkcl9tYXRjaCgmZmwtPmZsNl9zcmMsICZzZWwtPnNhZGRyLCBzZWwtPnByZWZpeGxlbl9zKSAmJgotCQkhKCh4ZnJtX2Zsb3dpX2Rwb3J0KGZsKSBeIHNlbC0+ZHBvcnQpICYgc2VsLT5kcG9ydF9tYXNrKSAmJgotCQkhKCh4ZnJtX2Zsb3dpX3Nwb3J0KGZsKSBeIHNlbC0+c3BvcnQpICYgc2VsLT5zcG9ydF9tYXNrKSAmJgotCQkoZmwtPnByb3RvID09IHNlbC0+cHJvdG8gfHwgIXNlbC0+cHJvdG8pICYmCi0JCShmbC0+b2lmID09IHNlbC0+aWZpbmRleCB8fCAhc2VsLT5pZmluZGV4KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXhmcm1fc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCwKLQkJICAgIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKLXsKLQlzd2l0Y2ggKGZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJcmV0dXJuIF9feGZybTRfc2VsZWN0b3JfbWF0Y2goc2VsLCBmbCk7Ci0JY2FzZSBBRl9JTkVUNjoKLQkJcmV0dXJuIF9feGZybTZfc2VsZWN0b3JfbWF0Y2goc2VsLCBmbCk7Ci0JfQotCXJldHVybiAwOwotfQorZXh0ZXJuIGludCB4ZnJtX3NlbGVjdG9yX21hdGNoKHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHN0cnVjdCBmbG93aSAqZmwsCisJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgZmFtaWx5KTsKIAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0KIC8qCUlmIG5laXRoZXIgaGFzIGEgY29udGV4dCAtLT4gbWF0Y2gKQEAgLTg4Nyw4ICs4NzQsNyBAQAogc3RydWN0IHhmcm02X3R1bm5lbCB7CiAJaW50ICgqaGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJaW50ICgqZXJyX2hhbmRsZXIpKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCQkJICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKTsKLQorCQkJICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbyk7CiAJc3RydWN0IHhmcm02X3R1bm5lbCAqbmV4dDsKIAlpbnQgcHJpb3JpdHk7CiB9OwpAQCAtOTM0LDcgKzkyMCw3IEBACiAjZW5kaWYKIGV4dGVybiBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV9maW5kX2FjcV9ieXNlcSh1MzIgc2VxKTsKIGV4dGVybiBpbnQgeGZybV9zdGF0ZV9kZWxldGUoc3RydWN0IHhmcm1fc3RhdGUgKngpOwotZXh0ZXJuIHZvaWQgeGZybV9zdGF0ZV9mbHVzaCh1OCBwcm90byk7CitleHRlcm4gdm9pZCB4ZnJtX3N0YXRlX2ZsdXNoKHU4IHByb3RvLCBzdHJ1Y3QgeGZybV9hdWRpdCAqYXVkaXRfaW5mbyk7CiBleHRlcm4gaW50IHhmcm1fcmVwbGF5X2NoZWNrKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBfX2JlMzIgc2VxKTsKIGV4dGVybiB2b2lkIHhmcm1fcmVwbGF5X2FkdmFuY2Uoc3RydWN0IHhmcm1fc3RhdGUgKngsIF9fYmUzMiBzZXEpOwogZXh0ZXJuIHZvaWQgeGZybV9yZXBsYXlfbm90aWZ5KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgZXZlbnQpOwpAQCAtOTUxLDkgKzkzNyw5IEBACiAJCQkgICAgeGZybV9hZGRyZXNzX3QgKnNhZGRyLCB1OCBwcm90byk7CiBleHRlcm4gaW50IHhmcm02X3R1bm5lbF9yZWdpc3RlcihzdHJ1Y3QgeGZybTZfdHVubmVsICpoYW5kbGVyKTsKIGV4dGVybiBpbnQgeGZybTZfdHVubmVsX2RlcmVnaXN0ZXIoc3RydWN0IHhmcm02X3R1bm5lbCAqaGFuZGxlcik7Ci1leHRlcm4gdTMyIHhmcm02X3R1bm5lbF9hbGxvY19zcGkoeGZybV9hZGRyZXNzX3QgKnNhZGRyKTsKK2V4dGVybiBfX2JlMzIgeGZybTZfdHVubmVsX2FsbG9jX3NwaSh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpOwogZXh0ZXJuIHZvaWQgeGZybTZfdHVubmVsX2ZyZWVfc3BpKHhmcm1fYWRkcmVzc190ICpzYWRkcik7Ci1leHRlcm4gdTMyIHhmcm02X3R1bm5lbF9zcGlfbG9va3VwKHhmcm1fYWRkcmVzc190ICpzYWRkcik7CitleHRlcm4gX19iZTMyIHhmcm02X3R1bm5lbF9zcGlfbG9va3VwKHhmcm1fYWRkcmVzc190ICpzYWRkcik7CiBleHRlcm4gaW50IHhmcm02X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQgeGZybTZfZmluZF8xc3RmcmFnb3B0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSB1OCAqKnByZXZoZHIpOwpAQCAtOTg3LDIwICs5NzMsMjAgQEAKIAkJCQkJICBzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLAogCQkJCQkgIHN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eCwgaW50IGRlbGV0ZSk7CiBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fcG9saWN5X2J5aWQodTgsIGludCBkaXIsIHUzMiBpZCwgaW50IGRlbGV0ZSk7Ci12b2lkIHhmcm1fcG9saWN5X2ZsdXNoKHU4IHR5cGUpOwordm9pZCB4ZnJtX3BvbGljeV9mbHVzaCh1OCB0eXBlLCBzdHJ1Y3QgeGZybV9hdWRpdCAqYXVkaXRfaW5mbyk7CiB1MzIgeGZybV9nZXRfYWNxc2VxKHZvaWQpOwogdm9pZCB4ZnJtX2FsbG9jX3NwaShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgX19iZTMyIG1pbnNwaSwgX19iZTMyIG1heHNwaSk7Ci1zdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fZmluZF9hY3EodTggbW9kZSwgdTMyIHJlcWlkLCB1OCBwcm90bywgCi0JCQkJICB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsIHhmcm1fYWRkcmVzc190ICpzYWRkciwgCitzdHJ1Y3QgeGZybV9zdGF0ZSAqIHhmcm1fZmluZF9hY3EodTggbW9kZSwgdTMyIHJlcWlkLCB1OCBwcm90bywKKwkJCQkgIHhmcm1fYWRkcmVzc190ICpkYWRkciwgeGZybV9hZGRyZXNzX3QgKnNhZGRyLAogCQkJCSAgaW50IGNyZWF0ZSwgdW5zaWduZWQgc2hvcnQgZmFtaWx5KTsKLWV4dGVybiB2b2lkIHhmcm1fcG9saWN5X2ZsdXNoKHU4IHR5cGUpOworZXh0ZXJuIHZvaWQgeGZybV9wb2xpY3lfZmx1c2godTggdHlwZSwgc3RydWN0IHhmcm1fYXVkaXQgKmF1ZGl0X2luZm8pOwogZXh0ZXJuIGludCB4ZnJtX3NrX3BvbGljeV9pbnNlcnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgZGlyLCBzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCk7CiBleHRlcm4gaW50IHhmcm1fYnVuZGxlX29rKHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sLCBzdHJ1Y3QgeGZybV9kc3QgKnhkc3QsCiAJCQkgIHN0cnVjdCBmbG93aSAqZmwsIGludCBmYW1pbHksIGludCBzdHJpY3QpOwogZXh0ZXJuIHZvaWQgeGZybV9pbml0X3BtdHUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIAogZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGttX3dhaXRxOwotZXh0ZXJuIGludCBrbV9uZXdfbWFwcGluZyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgdTE2IHNwb3J0KTsKK2V4dGVybiBpbnQga21fbmV3X21hcHBpbmcoc3RydWN0IHhmcm1fc3RhdGUgKngsIHhmcm1fYWRkcmVzc190ICppcGFkZHIsIF9fYmUxNiBzcG9ydCk7CiBleHRlcm4gdm9pZCBrbV9wb2xpY3lfZXhwaXJlZChzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgaW50IGRpciwgaW50IGhhcmQsIHUzMiBwaWQpOwogZXh0ZXJuIGludCBrbV9yZXBvcnQodTggcHJvdG8sIHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIHhmcm1fYWRkcmVzc190ICphZGRyKTsKIApAQCAtMTAzMyw3ICsxMDE5LDcgQEAKIAlzd2l0Y2ggKGZhbWlseSkgewogCWRlZmF1bHQ6CiAJY2FzZSBBRl9JTkVUOgotCQlyZXR1cm4gYS0+YTQgLSBiLT5hNDsKKwkJcmV0dXJuIChfX2ZvcmNlIF9fdTMyKWEtPmE0IC0gKF9fZm9yY2UgX191MzIpYi0+YTQ7CiAJY2FzZSBBRl9JTkVUNjoKIAkJcmV0dXJuIGlwdjZfYWRkcl9jbXAoKHN0cnVjdCBpbjZfYWRkciAqKWEsCiAJCQkJICAgICAoc3RydWN0IGluNl9hZGRyICopYik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9zcy5oIGIvaW5jbHVkZS9wY21jaWEvc3MuaAppbmRleCBlZGU2Mzk4Li42MjNhMGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9zcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL3NzLmgKQEAgLTI2Miw5ICsyNjIsMTAgQEAKIAkJdTgJCQlwcmVzZW50OjEsCS8qIFBDTUNJQSBjYXJkIGlzIHByZXNlbnQgaW4gc29ja2V0ICovCiAJCQkJCWJ1c3k6MSwJCS8qICJtYXN0ZXIiIGlvY3RsIGlzIHVzZWQgKi8KIAkJCQkJZGVhZDoxLAkJLyogcGNtY2lhIG1vZHVsZSBpcyBiZWluZyB1bmxvYWRlZCAqLwotCQkJCQlkZXZpY2VfYWRkX3BlbmRpbmc6MSwgLyogYSBwc2V1ZG8tbXVsdGlmdW5jdGlvbi1kZXZpY2UKKwkJCQkJZGV2aWNlX2FkZF9wZW5kaW5nOjEsIC8qIGEgbXVsdGlmdW5jdGlvbi1kZXZpY2UKIAkJCQkJCQkgICAgICAgKiBhZGQgZXZlbnQgaXMgcGVuZGluZyAqLwotCQkJCQlyZXNlcnZlZDo0OworCQkJCQltZmNfcGZjOjEsCS8qIHRoZSBwZW5kaW5nIGV2ZW50IGFkZHMgYSBtZmMgKDEpIG9yIHBmYyAoMCkgKi8KKwkJCQkJcmVzZXJ2ZWQ6MzsKIAl9IAkJCQlwY21jaWFfc3RhdGU7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCWRldmljZV9hZGQ7CS8qIGZvciBhZGRpbmcgZnVydGhlciBwc2V1ZG8tbXVsdGlmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX2FkZHIuaCBiL2luY2x1ZGUvcmRtYS9pYl9hZGRyLmgKaW5kZXggODFiNjIzMDcuLmMwOTRlNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl9hZGRyLmgKKysrIGIvaW5jbHVkZS9yZG1hL2liX2FkZHIuaApAQCAtMzYsNiArMzYsMjIgQEAKICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CiAKK3N0cnVjdCByZG1hX2FkZHJfY2xpZW50IHsKKwlhdG9taWNfdCByZWZjb3VudDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wOworfTsKKworLyoqCisgKiByZG1hX2FkZHJfcmVnaXN0ZXJfY2xpZW50IC0gUmVnaXN0ZXIgYW4gYWRkcmVzcyBjbGllbnQuCisgKi8KK3ZvaWQgcmRtYV9hZGRyX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcmRtYV9hZGRyX2NsaWVudCAqY2xpZW50KTsKKworLyoqCisgKiByZG1hX2FkZHJfdW5yZWdpc3Rlcl9jbGllbnQgLSBEZXJlZ2lzdGVyIGFuIGFkZHJlc3MgY2xpZW50LgorICogQGNsaWVudDogQ2xpZW50IG9iamVjdCB0byBkZXJlZ2lzdGVyLgorICovCit2b2lkIHJkbWFfYWRkcl91bnJlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcmRtYV9hZGRyX2NsaWVudCAqY2xpZW50KTsKKwogc3RydWN0IHJkbWFfZGV2X2FkZHIgewogCXVuc2lnbmVkIGNoYXIgc3JjX2Rldl9hZGRyW01BWF9BRERSX0xFTl07CiAJdW5zaWduZWQgY2hhciBkc3RfZGV2X2FkZHJbTUFYX0FERFJfTEVOXTsKQEAgLTUyLDYgKzY4LDcgQEAKIC8qKgogICogcmRtYV9yZXNvbHZlX2lwIC0gUmVzb2x2ZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIElQIGFkZHJlc3NlcyB0bwogICogICBSRE1BIGhhcmR3YXJlIGFkZHJlc3Nlcy4KKyAqIEBjbGllbnQ6IEFkZHJlc3MgY2xpZW50IGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LgogICogQHNyY19hZGRyOiBBbiBvcHRpb25hbCBzb3VyY2UgYWRkcmVzcyB0byB1c2UgaW4gdGhlIHJlc29sdXRpb24uICBJZiBhCiAgKiAgIHNvdXJjZSBhZGRyZXNzIGlzIG5vdCBwcm92aWRlZCwgYSB1c2FibGUgYWRkcmVzcyB3aWxsIGJlIHJldHVybmVkIHZpYQogICogICB0aGUgY2FsbGJhY2suCkBAIC02NCw3ICs4MSw4IEBACiAgKiAgIG9yIGJlZW4gY2FuY2VsZWQuICBBIHN0YXR1cyBvZiAwIGluZGljYXRlcyBzdWNjZXNzLgogICogQGNvbnRleHQ6IFVzZXItc3BlY2lmaWVkIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsLgogICovCi1pbnQgcmRtYV9yZXNvbHZlX2lwKHN0cnVjdCBzb2NrYWRkciAqc3JjX2FkZHIsIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIsCitpbnQgcmRtYV9yZXNvbHZlX2lwKHN0cnVjdCByZG1hX2FkZHJfY2xpZW50ICpjbGllbnQsCisJCSAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNyY19hZGRyLCBzdHJ1Y3Qgc29ja2FkZHIgKmRzdF9hZGRyLAogCQkgICAgc3RydWN0IHJkbWFfZGV2X2FkZHIgKmFkZHIsIGludCB0aW1lb3V0X21zLAogCQkgICAgdm9pZCAoKmNhbGxiYWNrKShpbnQgc3RhdHVzLCBzdHJ1Y3Qgc29ja2FkZHIgKnNyY19hZGRyLAogCQkJCSAgICAgc3RydWN0IHJkbWFfZGV2X2FkZHIgKmFkZHIsIHZvaWQgKmNvbnRleHQpLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX2NtLmggYi9pbmNsdWRlL3JkbWEvaWJfY20uaAppbmRleCBjOWI0NzM4Li41YzA3MDE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvaWJfY20uaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfY20uaApAQCAtNjAsNiArNjAsNyBAQAogfTsKIAogZW51bSBpYl9jbV9sYXBfc3RhdGUgeworCUlCX0NNX0xBUF9VTklOSVQsCiAJSUJfQ01fTEFQX0lETEUsCiAJSUJfQ01fTEFQX1NFTlQsCiAJSUJfQ01fTEFQX1JDVkQsCkBAIC00NDMsMTMgKzQ0NCwyMCBAQAogCQkgICAgdTggcHJpdmF0ZV9kYXRhX2xlbik7CiAKIC8qKgotICogaWJfY21fZXN0YWJsaXNoIC0gRm9yY2VzIGEgY29ubmVjdGlvbiBzdGF0ZSB0byBlc3RhYmxpc2hlZC4KKyAqIGliX2NtX25vdGlmeSAtIE5vdGlmaWVzIHRoZSBDTSBvZiBhbiBldmVudCByZXBvcnRlZCB0byB0aGUgY29uc3VtZXIuCiAgKiBAY21faWQ6IENvbm5lY3Rpb24gaWRlbnRpZmllciB0byB0cmFuc2l0aW9uIHRvIGVzdGFibGlzaGVkLgorICogQGV2ZW50OiBUeXBlIG9mIGV2ZW50LgogICoKLSAqIFRoaXMgcm91dGluZSBzaG91bGQgYmUgaW52b2tlZCBieSB1c2VycyB3aG8gcmVjZWl2ZSBtZXNzYWdlcyBvbiBhCi0gKiBjb25uZWN0ZWQgUVAgYmVmb3JlIGFuIFJUVSBoYXMgYmVlbiByZWNlaXZlZC4KKyAqIFRoaXMgcm91dGluZSBzaG91bGQgYmUgaW52b2tlZCBieSB1c2VycyB0byBub3RpZnkgdGhlIENNIG9mIHJlbGV2YW50CisgKiBjb21tdW5pY2F0aW9uIGV2ZW50cy4gIEV2ZW50cyB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgQ00gYW5kCisgKiB3aGVuIHRvIHJlcG9ydCB0aGVtIGFyZToKKyAqCisgKiBJQl9FVkVOVF9DT01NX0VTVCAtIFVzZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgb24gYSBjb25uZWN0ZWQKKyAqICAgIFFQIGJlZm9yZSBhbiBSVFUgaGFzIGJlZW4gcmVjZWl2ZWQuCisgKiBJQl9FVkVOVF9QQVRIX01JRyAtIE5vdGlmaWVzIHRoZSBDTSB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBmYWlsZWQgb3ZlcgorICogICB0byB0aGUgYWx0ZXJuYXRlIHBhdGguCiAgKi8KLWludCBpYl9jbV9lc3RhYmxpc2goc3RydWN0IGliX2NtX2lkICpjbV9pZCk7CitpbnQgaWJfY21fbm90aWZ5KHN0cnVjdCBpYl9jbV9pZCAqY21faWQsIGVudW0gaWJfZXZlbnRfdHlwZSBldmVudCk7CiAKIC8qKgogICogaWJfc2VuZF9jbV9yZWogLSBTZW5kcyBhIGNvbm5lY3Rpb24gcmVqZWN0aW9uIG1lc3NhZ2UgdG8gdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfbWFyc2hhbGwuaCBiL2luY2x1ZGUvcmRtYS9pYl9tYXJzaGFsbC5oCmluZGV4IDY2YmY0ZDcuLmRiMDM3MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl9tYXJzaGFsbC5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl9tYXJzaGFsbC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQxLDYgKzQxLDkgQEAKIHZvaWQgaWJfY29weV9xcF9hdHRyX3RvX3VzZXIoc3RydWN0IGliX3V2ZXJic19xcF9hdHRyICpkc3QsCiAJCQkgICAgIHN0cnVjdCBpYl9xcF9hdHRyICpzcmMpOwogCit2b2lkIGliX2NvcHlfYWhfYXR0cl90b191c2VyKHN0cnVjdCBpYl91dmVyYnNfYWhfYXR0ciAqZHN0LAorCQkJICAgICBzdHJ1Y3QgaWJfYWhfYXR0ciAqc3JjKTsKKwogdm9pZCBpYl9jb3B5X3BhdGhfcmVjX3RvX3VzZXIoc3RydWN0IGliX3VzZXJfcGF0aF9yZWMgKmRzdCwKIAkJCSAgICAgIHN0cnVjdCBpYl9zYV9wYXRoX3JlYyAqc3JjKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfY20uaCBiL2luY2x1ZGUvcmRtYS9pYl91c2VyX2NtLmgKaW5kZXggMDY2YzIwYi4uMzc2NTBhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfY20uaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdXNlcl9jbS5oCkBAIC0zOCw3ICszOCw3IEBACiAKICNpbmNsdWRlIDxyZG1hL2liX3VzZXJfc2EuaD4KIAotI2RlZmluZSBJQl9VU0VSX0NNX0FCSV9WRVJTSU9OIDQKKyNkZWZpbmUgSUJfVVNFUl9DTV9BQklfVkVSU0lPTiA1CiAKIGVudW0gewogCUlCX1VTRVJfQ01fQ01EX0NSRUFURV9JRCwKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlJQl9VU0VSX0NNX0NNRF9BVFRSX0lELAogCiAJSUJfVVNFUl9DTV9DTURfTElTVEVOLAotCUlCX1VTRVJfQ01fQ01EX0VTVEFCTElTSCwKKwlJQl9VU0VSX0NNX0NNRF9OT1RJRlksCiAKIAlJQl9VU0VSX0NNX0NNRF9TRU5EX1JFUSwKIAlJQl9VU0VSX0NNX0NNRF9TRU5EX1JFUCwKQEAgLTExNyw4ICsxMTcsOSBAQAogCV9fdTMyIHJlc2VydmVkOwogfTsKIAotc3RydWN0IGliX3VjbV9lc3RhYmxpc2ggeworc3RydWN0IGliX3VjbV9ub3RpZnkgewogCV9fdTMyIGlkOworCV9fdTMyIGV2ZW50OwogfTsKIAogc3RydWN0IGliX3VjbV9wcml2YXRlX2RhdGEgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl91c2VyX3ZlcmJzLmgKaW5kZXggZGIxYjgxNC4uNjRhNzIxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL2liX3VzZXJfdmVyYnMuaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdXNlcl92ZXJicy5oCkBAIC00NTgsNyArNDU4LDcgQEAKIAlfX3U4ICBjdXJfcXBfc3RhdGU7CiAJX191OCAgcGF0aF9tdHU7CiAJX191OCAgcGF0aF9taWdfc3RhdGU7Ci0JX191OCAgZW5fc3FkX2FzeW5jX25vdGlmeTsKKwlfX3U4ICBzcV9kcmFpbmluZzsKIAlfX3U4ICBtYXhfcmRfYXRvbWljOwogCV9fdTggIG1heF9kZXN0X3JkX2F0b21pYzsKIAlfX3U4ICBtaW5fcm5yX3RpbWVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX3ZlcmJzLmggYi9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaAppbmRleCA4ZWFjYzM1Li4zYzJlMTA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaAorKysgYi9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaApAQCAtNDMsNiArNDMsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CkBAIC04NDgsNiArODUwLDQ5IEBACiAJdTggICAgICAgICAgICAgICAgICAgICAqbG1jX2NhY2hlOwogfTsKIAorc3RydWN0IGliX2RtYV9tYXBwaW5nX29wcyB7CisJaW50CQkoKm1hcHBpbmdfZXJyb3IpKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkJIHU2NCBkbWFfYWRkcik7CisJdTY0CQkoKm1hcF9zaW5nbGUpKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkgICAgICB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCQkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJdm9pZAkJKCp1bm1hcF9zaW5nbGUpKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkJdTY0IGFkZHIsIHNpemVfdCBzaXplLAorCQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCXU2NAkJKCptYXBfcGFnZSkoc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICAgIHNpemVfdCBzaXplLAorCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCXZvaWQJCSgqdW5tYXBfcGFnZSkoc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHU2NCBhZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCWludAkJKCptYXBfc2cpKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJdm9pZAkJKCp1bm1hcF9zZykoc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisJdTY0CQkoKmRtYV9hZGRyZXNzKShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpOworCXVuc2lnbmVkIGludAkoKmRtYV9sZW4pKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKTsKKwl2b2lkCQkoKnN5bmNfc2luZ2xlX2Zvcl9jcHUpKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHU2NCBkbWFfaGFuZGxlLAorCQkJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgICAgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKTsKKwl2b2lkCQkoKnN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UpKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkJCSAgdTY0IGRtYV9oYW5kbGUsCisJCQkJCQkgIHNpemVfdCBzaXplLAorCQkJCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpOworCXZvaWQJCSooKmFsbG9jX2NvaGVyZW50KShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJCSAgIHNpemVfdCBzaXplLAorCQkJCQkgICB1NjQgKmRtYV9oYW5kbGUsCisJCQkJCSAgIGdmcF90IGZsYWcpOworCXZvaWQJCSgqZnJlZV9jb2hlcmVudCkoc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCQkgc2l6ZV90IHNpemUsIHZvaWQgKmNwdV9hZGRyLAorCQkJCQkgdTY0IGRtYV9oYW5kbGUpOworfTsKKwogc3RydWN0IGl3X2NtX3ZlcmJzOwogCiBzdHJ1Y3QgaWJfZGV2aWNlIHsKQEAgLTk5Miw2ICsxMDM3LDggQEAKIAkJCQkJCSAgc3RydWN0IGliX21hZCAqaW5fbWFkLAogCQkJCQkJICBzdHJ1Y3QgaWJfbWFkICpvdXRfbWFkKTsKIAorCXN0cnVjdCBpYl9kbWFfbWFwcGluZ19vcHMgICAqZG1hX29wczsKKwogCXN0cnVjdCBtb2R1bGUgICAgICAgICAgICAgICAqb3duZXI7CiAJc3RydWN0IGNsYXNzX2RldmljZSAgICAgICAgICBjbGFzc19kZXY7CiAJc3RydWN0IGtvYmplY3QgICAgICAgICAgICAgICBwb3J0c19wYXJlbnQ7CkBAIC0xMzk1LDEwICsxNDQyLDIyNCBAQAogICogICB1c2FibGUgZm9yIERNQS4KICAqIEBwZDogVGhlIHByb3RlY3Rpb24gZG9tYWluIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtb3J5IHJlZ2lvbi4KICAqIEBtcl9hY2Nlc3NfZmxhZ3M6IFNwZWNpZmllcyB0aGUgbWVtb3J5IGFjY2VzcyByaWdodHMuCisgKgorICogTm90ZSB0aGF0IHRoZSBpYl9kbWFfKigpIGZ1bmN0aW9ucyBkZWZpbmVkIGJlbG93IG11c3QgYmUgdXNlZAorICogdG8gY3JlYXRlL2Rlc3Ryb3kgYWRkcmVzc2VzIHVzZWQgd2l0aCB0aGUgTGtleSBvciBSa2V5IHJldHVybmVkCisgKiBieSBpYl9nZXRfZG1hX21yKCkuCiAgKi8KIHN0cnVjdCBpYl9tciAqaWJfZ2V0X2RtYV9tcihzdHJ1Y3QgaWJfcGQgKnBkLCBpbnQgbXJfYWNjZXNzX2ZsYWdzKTsKIAogLyoqCisgKiBpYl9kbWFfbWFwcGluZ19lcnJvciAtIGNoZWNrIGEgRE1BIGFkZHIgZm9yIGVycm9yCisgKiBAZGV2OiBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgZG1hX2FkZHIgd2FzIGNyZWF0ZWQKKyAqIEBkbWFfYWRkcjogVGhlIERNQSBhZGRyZXNzIHRvIGNoZWNrCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGliX2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgdTY0IGRtYV9hZGRyKQoreworCWlmIChkZXYtPmRtYV9vcHMpCisJCXJldHVybiBkZXYtPmRtYV9vcHMtPm1hcHBpbmdfZXJyb3IoZGV2LCBkbWFfYWRkcik7CisJcmV0dXJuIGRtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyKTsKK30KKworLyoqCisgKiBpYl9kbWFfbWFwX3NpbmdsZSAtIE1hcCBhIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgdG8gRE1BIGFkZHJlc3MKKyAqIEBkZXY6IFRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoZSBkbWFfYWRkciBpcyB0byBiZSBjcmVhdGVkCisgKiBAY3B1X2FkZHI6IFRoZSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiBpbiBieXRlcworICogQGRpcmVjdGlvbjogVGhlIGRpcmVjdGlvbiBvZiB0aGUgRE1BCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IGliX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkgICAgdm9pZCAqY3B1X2FkZHIsIHNpemVfdCBzaXplLAorCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJaWYgKGRldi0+ZG1hX29wcykKKwkJcmV0dXJuIGRldi0+ZG1hX29wcy0+bWFwX3NpbmdsZShkZXYsIGNwdV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCXJldHVybiBkbWFfbWFwX3NpbmdsZShkZXYtPmRtYV9kZXZpY2UsIGNwdV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworfQorCisvKioKKyAqIGliX2RtYV91bm1hcF9zaW5nbGUgLSBEZXN0cm95IGEgbWFwcGluZyBjcmVhdGVkIGJ5IGliX2RtYV9tYXBfc2luZ2xlKCkKKyAqIEBkZXY6IFRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoZSBETUEgYWRkcmVzcyB3YXMgY3JlYXRlZAorICogQGFkZHI6IFRoZSBETUEgYWRkcmVzcworICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSByZWdpb24gaW4gYnl0ZXMKKyAqIEBkaXJlY3Rpb246IFRoZSBkaXJlY3Rpb24gb2YgdGhlIERNQQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWJfZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHU2NCBhZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCWlmIChkZXYtPmRtYV9vcHMpCisJCWRldi0+ZG1hX29wcy0+dW5tYXBfc2luZ2xlKGRldiwgYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwllbHNlCisJCWRtYV91bm1hcF9zaW5nbGUoZGV2LT5kbWFfZGV2aWNlLCBhZGRyLCBzaXplLCBkaXJlY3Rpb24pOworfQorCisvKioKKyAqIGliX2RtYV9tYXBfcGFnZSAtIE1hcCBhIHBoeXNpY2FsIHBhZ2UgdG8gRE1BIGFkZHJlc3MKKyAqIEBkZXY6IFRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoZSBkbWFfYWRkciBpcyB0byBiZSBjcmVhdGVkCisgKiBAcGFnZTogVGhlIHBhZ2UgdG8gYmUgbWFwcGVkCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZQorICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSByZWdpb24gaW4gYnl0ZXMKKyAqIEBkaXJlY3Rpb246IFRoZSBkaXJlY3Rpb24gb2YgdGhlIERNQQorICovCitzdGF0aWMgaW5saW5lIHU2NCBpYl9kbWFfbWFwX3BhZ2Uoc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgIHNpemVfdCBzaXplLAorCQkJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCWlmIChkZXYtPmRtYV9vcHMpCisJCXJldHVybiBkZXYtPmRtYV9vcHMtPm1hcF9wYWdlKGRldiwgcGFnZSwgb2Zmc2V0LCBzaXplLCBkaXJlY3Rpb24pOworCXJldHVybiBkbWFfbWFwX3BhZ2UoZGV2LT5kbWFfZGV2aWNlLCBwYWdlLCBvZmZzZXQsIHNpemUsIGRpcmVjdGlvbik7Cit9CisKKy8qKgorICogaWJfZG1hX3VubWFwX3BhZ2UgLSBEZXN0cm95IGEgbWFwcGluZyBjcmVhdGVkIGJ5IGliX2RtYV9tYXBfcGFnZSgpCisgKiBAZGV2OiBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgRE1BIGFkZHJlc3Mgd2FzIGNyZWF0ZWQKKyAqIEBhZGRyOiBUaGUgRE1BIGFkZHJlc3MKKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzCisgKiBAZGlyZWN0aW9uOiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBETUEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGliX2RtYV91bm1hcF9wYWdlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHU2NCBhZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlpZiAoZGV2LT5kbWFfb3BzKQorCQlkZXYtPmRtYV9vcHMtPnVubWFwX3BhZ2UoZGV2LCBhZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCWVsc2UKKwkJZG1hX3VubWFwX3BhZ2UoZGV2LT5kbWFfZGV2aWNlLCBhZGRyLCBzaXplLCBkaXJlY3Rpb24pOworfQorCisvKioKKyAqIGliX2RtYV9tYXBfc2cgLSBNYXAgYSBzY2F0dGVyL2dhdGhlciBsaXN0IHRvIERNQSBhZGRyZXNzZXMKKyAqIEBkZXY6IFRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoZSBETUEgYWRkcmVzc2VzIGFyZSB0byBiZSBjcmVhdGVkCisgKiBAc2c6IFRoZSBhcnJheSBvZiBzY2F0dGVyL2dhdGhlciBlbnRyaWVzCisgKiBAbmVudHM6IFRoZSBudW1iZXIgb2Ygc2NhdHRlci9nYXRoZXIgZW50cmllcworICogQGRpcmVjdGlvbjogVGhlIGRpcmVjdGlvbiBvZiB0aGUgRE1BCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGliX2RtYV9tYXBfc2coc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJaWYgKGRldi0+ZG1hX29wcykKKwkJcmV0dXJuIGRldi0+ZG1hX29wcy0+bWFwX3NnKGRldiwgc2csIG5lbnRzLCBkaXJlY3Rpb24pOworCXJldHVybiBkbWFfbWFwX3NnKGRldi0+ZG1hX2RldmljZSwgc2csIG5lbnRzLCBkaXJlY3Rpb24pOworfQorCisvKioKKyAqIGliX2RtYV91bm1hcF9zZyAtIFVubWFwIGEgc2NhdHRlci9nYXRoZXIgbGlzdCBvZiBETUEgYWRkcmVzc2VzCisgKiBAZGV2OiBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgRE1BIGFkZHJlc3NlcyB3ZXJlIGNyZWF0ZWQKKyAqIEBzZzogVGhlIGFycmF5IG9mIHNjYXR0ZXIvZ2F0aGVyIGVudHJpZXMKKyAqIEBuZW50czogVGhlIG51bWJlciBvZiBzY2F0dGVyL2dhdGhlciBlbnRyaWVzCisgKiBAZGlyZWN0aW9uOiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBETUEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGliX2RtYV91bm1hcF9zZyhzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlpZiAoZGV2LT5kbWFfb3BzKQorCQlkZXYtPmRtYV9vcHMtPnVubWFwX3NnKGRldiwgc2csIG5lbnRzLCBkaXJlY3Rpb24pOworCWVsc2UKKwkJZG1hX3VubWFwX3NnKGRldi0+ZG1hX2RldmljZSwgc2csIG5lbnRzLCBkaXJlY3Rpb24pOworfQorCisvKioKKyAqIGliX3NnX2RtYV9hZGRyZXNzIC0gUmV0dXJuIHRoZSBETUEgYWRkcmVzcyBmcm9tIGEgc2NhdHRlci9nYXRoZXIgZW50cnkKKyAqIEBkZXY6IFRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoZSBETUEgYWRkcmVzc2VzIHdlcmUgY3JlYXRlZAorICogQHNnOiBUaGUgc2NhdHRlci9nYXRoZXIgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB1NjQgaWJfc2dfZG1hX2FkZHJlc3Moc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCWlmIChkZXYtPmRtYV9vcHMpCisJCXJldHVybiBkZXYtPmRtYV9vcHMtPmRtYV9hZGRyZXNzKGRldiwgc2cpOworCXJldHVybiBzZ19kbWFfYWRkcmVzcyhzZyk7Cit9CisKKy8qKgorICogaWJfc2dfZG1hX2xlbiAtIFJldHVybiB0aGUgRE1BIGxlbmd0aCBmcm9tIGEgc2NhdHRlci9nYXRoZXIgZW50cnkKKyAqIEBkZXY6IFRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoZSBETUEgYWRkcmVzc2VzIHdlcmUgY3JlYXRlZAorICogQHNnOiBUaGUgc2NhdHRlci9nYXRoZXIgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaWJfc2dfZG1hX2xlbihzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCWlmIChkZXYtPmRtYV9vcHMpCisJCXJldHVybiBkZXYtPmRtYV9vcHMtPmRtYV9sZW4oZGV2LCBzZyk7CisJcmV0dXJuIHNnX2RtYV9sZW4oc2cpOworfQorCisvKioKKyAqIGliX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1IC0gUHJlcGFyZSBETUEgcmVnaW9uIHRvIGJlIGFjY2Vzc2VkIGJ5IENQVQorICogQGRldjogVGhlIGRldmljZSBmb3Igd2hpY2ggdGhlIERNQSBhZGRyZXNzIHdhcyBjcmVhdGVkCisgKiBAYWRkcjogVGhlIERNQSBhZGRyZXNzCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiBpbiBieXRlcworICogQGRpcjogVGhlIGRpcmVjdGlvbiBvZiB0aGUgRE1BCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpYl9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHU2NCBhZGRyLAorCQkJCQkgICAgICBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWlmIChkZXYtPmRtYV9vcHMpCisJCWRldi0+ZG1hX29wcy0+c3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGFkZHIsIHNpemUsIGRpcik7CisJZWxzZQorCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYtPmRtYV9kZXZpY2UsIGFkZHIsIHNpemUsIGRpcik7Cit9CisKKy8qKgorICogaWJfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UgLSBQcmVwYXJlIERNQSByZWdpb24gdG8gYmUgYWNjZXNzZWQgYnkgZGV2aWNlCisgKiBAZGV2OiBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgRE1BIGFkZHJlc3Mgd2FzIGNyZWF0ZWQKKyAqIEBhZGRyOiBUaGUgRE1BIGFkZHJlc3MKKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzCisgKiBAZGlyOiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBETUEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGliX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwKKwkJCQkJCSB1NjQgYWRkciwKKwkJCQkJCSBzaXplX3Qgc2l6ZSwKKwkJCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJaWYgKGRldi0+ZG1hX29wcykKKwkJZGV2LT5kbWFfb3BzLT5zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgYWRkciwgc2l6ZSwgZGlyKTsKKwllbHNlCisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldi0+ZG1hX2RldmljZSwgYWRkciwgc2l6ZSwgZGlyKTsKK30KKworLyoqCisgKiBpYl9kbWFfYWxsb2NfY29oZXJlbnQgLSBBbGxvY2F0ZSBtZW1vcnkgYW5kIG1hcCBpdCBmb3IgRE1BCisgKiBAZGV2OiBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgRE1BIGFkZHJlc3MgaXMgcmVxdWVzdGVkCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIHJlZ2lvbiB0byBhbGxvY2F0ZSBpbiBieXRlcworICogQGRtYV9oYW5kbGU6IEEgcG9pbnRlciBmb3IgcmV0dXJuaW5nIHRoZSBETUEgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCisgKiBAZmxhZzogbWVtb3J5IGFsbG9jYXRvciBmbGFncworICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmliX2RtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsCisJCQkJCSAgIHNpemVfdCBzaXplLAorCQkJCQkgICB1NjQgKmRtYV9oYW5kbGUsCisJCQkJCSAgIGdmcF90IGZsYWcpCit7CisJaWYgKGRldi0+ZG1hX29wcykKKwkJcmV0dXJuIGRldi0+ZG1hX29wcy0+YWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBmbGFnKTsKKwlyZXR1cm4gZG1hX2FsbG9jX2NvaGVyZW50KGRldi0+ZG1hX2RldmljZSwgc2l6ZSwgZG1hX2hhbmRsZSwgZmxhZyk7Cit9CisKKy8qKgorICogaWJfZG1hX2ZyZWVfY29oZXJlbnQgLSBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgaWJfZG1hX2FsbG9jX2NvaGVyZW50KCkKKyAqIEBkZXY6IFRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoZSBETUEgYWRkcmVzc2VzIHdlcmUgYWxsb2NhdGVkCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIHJlZ2lvbgorICogQGNwdV9hZGRyOiB0aGUgYWRkcmVzcyByZXR1cm5lZCBieSBpYl9kbWFfYWxsb2NfY29oZXJlbnQoKQorICogQGRtYV9oYW5kbGU6IHRoZSBETUEgYWRkcmVzcyByZXR1cm5lZCBieSBpYl9kbWFfYWxsb2NfY29oZXJlbnQoKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWJfZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGliX2RldmljZSAqZGV2LAorCQkJCQlzaXplX3Qgc2l6ZSwgdm9pZCAqY3B1X2FkZHIsCisJCQkJCXU2NCBkbWFfaGFuZGxlKQoreworCWlmIChkZXYtPmRtYV9vcHMpCisJCWRldi0+ZG1hX29wcy0+ZnJlZV9jb2hlcmVudChkZXYsIHNpemUsIGNwdV9hZGRyLCBkbWFfaGFuZGxlKTsKKwllbHNlCisJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+ZG1hX2RldmljZSwgc2l6ZSwgY3B1X2FkZHIsIGRtYV9oYW5kbGUpOworfQorCisvKioKICAqIGliX3JlZ19waHlzX21yIC0gUHJlcGFyZXMgYSB2aXJ0dWFsbHkgYWRkcmVzc2VkIG1lbW9yeSByZWdpb24gZm9yIHVzZQogICogICBieSBhbiBIQ0EuCiAgKiBAcGQ6IFRoZSBwcm90ZWN0aW9uIGRvbWFpbiBhc3NvY2lhdGVkIGFzc2lnbmVkIHRvIHRoZSByZWdpc3RlcmVkIHJlZ2lvbi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9yZG1hX2NtLmggYi9pbmNsdWRlL3JkbWEvcmRtYV9jbS5oCmluZGV4IGRlYjVhMGEuLjM2Y2Q4YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9yZG1hX2NtLmgKKysrIGIvaW5jbHVkZS9yZG1hL3JkbWFfY20uaApAQCAtNzcsMTEgKzc3LDM0IEBACiAJaW50IG51bV9wYXRoczsKIH07CiAKK3N0cnVjdCByZG1hX2Nvbm5fcGFyYW0geworCWNvbnN0IHZvaWQgKnByaXZhdGVfZGF0YTsKKwl1OCBwcml2YXRlX2RhdGFfbGVuOworCXU4IHJlc3BvbmRlcl9yZXNvdXJjZXM7CisJdTggaW5pdGlhdG9yX2RlcHRoOworCXU4IGZsb3dfY29udHJvbDsKKwl1OCByZXRyeV9jb3VudDsJCS8qIGlnbm9yZWQgd2hlbiBhY2NlcHRpbmcgKi8KKwl1OCBybnJfcmV0cnlfY291bnQ7CisJLyogRmllbGRzIGJlbG93IGlnbm9yZWQgaWYgYSBRUCBpcyBjcmVhdGVkIG9uIHRoZSByZG1hX2NtX2lkLiAqLworCXU4IHNycTsKKwl1MzIgcXBfbnVtOworfTsKKworc3RydWN0IHJkbWFfdWRfcGFyYW0geworCWNvbnN0IHZvaWQgKnByaXZhdGVfZGF0YTsKKwl1OCBwcml2YXRlX2RhdGFfbGVuOworCXN0cnVjdCBpYl9haF9hdHRyIGFoX2F0dHI7CisJdTMyIHFwX251bTsKKwl1MzIgcWtleTsKK307CisKIHN0cnVjdCByZG1hX2NtX2V2ZW50IHsKIAllbnVtIHJkbWFfY21fZXZlbnRfdHlwZQkgZXZlbnQ7CiAJaW50CQkJIHN0YXR1czsKLQl2b2lkCQkJKnByaXZhdGVfZGF0YTsKLQl1OAkJCSBwcml2YXRlX2RhdGFfbGVuOworCXVuaW9uIHsKKwkJc3RydWN0IHJkbWFfY29ubl9wYXJhbQljb25uOworCQlzdHJ1Y3QgcmRtYV91ZF9wYXJhbQl1ZDsKKwl9IHBhcmFtOwogfTsKIAogc3RydWN0IHJkbWFfY21faWQ7CkBAIC0yMDQsMjUgKzIyNywxNyBAQAogaW50IHJkbWFfaW5pdF9xcF9hdHRyKHN0cnVjdCByZG1hX2NtX2lkICppZCwgc3RydWN0IGliX3FwX2F0dHIgKnFwX2F0dHIsCiAJCSAgICAgICBpbnQgKnFwX2F0dHJfbWFzayk7CiAKLXN0cnVjdCByZG1hX2Nvbm5fcGFyYW0gewotCWNvbnN0IHZvaWQgKnByaXZhdGVfZGF0YTsKLQl1OCBwcml2YXRlX2RhdGFfbGVuOwotCXU4IHJlc3BvbmRlcl9yZXNvdXJjZXM7Ci0JdTggaW5pdGlhdG9yX2RlcHRoOwotCXU4IGZsb3dfY29udHJvbDsKLQl1OCByZXRyeV9jb3VudDsJCS8qIGlnbm9yZWQgd2hlbiBhY2NlcHRpbmcgKi8KLQl1OCBybnJfcmV0cnlfY291bnQ7Ci0JLyogRmllbGRzIGJlbG93IGlnbm9yZWQgaWYgYSBRUCBpcyBjcmVhdGVkIG9uIHRoZSByZG1hX2NtX2lkLiAqLwotCXU4IHNycTsKLQl1MzIgcXBfbnVtOwotCWVudW0gaWJfcXBfdHlwZSBxcF90eXBlOwotfTsKLQogLyoqCiAgKiByZG1hX2Nvbm5lY3QgLSBJbml0aWF0ZSBhbiBhY3RpdmUgY29ubmVjdGlvbiByZXF1ZXN0LgorICogQGlkOiBDb25uZWN0aW9uIGlkZW50aWZpZXIgdG8gY29ubmVjdC4KKyAqIEBjb25uX3BhcmFtOiBDb25uZWN0aW9uIGluZm9ybWF0aW9uIHVzZWQgZm9yIGNvbm5lY3RlZCBRUHMuCiAgKgogICogVXNlcnMgbXVzdCBoYXZlIHJlc29sdmVkIGEgcm91dGUgZm9yIHRoZSByZG1hX2NtX2lkIHRvIGNvbm5lY3Qgd2l0aAogICogYnkgaGF2aW5nIGNhbGxlZCByZG1hX3Jlc29sdmVfcm91dGUgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICoKKyAqIFRoaXMgY2FsbCB3aWxsIGVpdGhlciBjb25uZWN0IHRvIGEgcmVtb3RlIFFQIG9yIG9idGFpbiByZW1vdGUgUVAKKyAqIGluZm9ybWF0aW9uIGZvciB1bmNvbm5lY3RlZCByZG1hX2NtX2lkJ3MuICBUaGUgYWN0dWFsIG9wZXJhdGlvbiBpcworICogYmFzZWQgb24gdGhlIHJkbWFfY21faWQncyBwb3J0IHNwYWNlLgogICovCiBpbnQgcmRtYV9jb25uZWN0KHN0cnVjdCByZG1hX2NtX2lkICppZCwgc3RydWN0IHJkbWFfY29ubl9wYXJhbSAqY29ubl9wYXJhbSk7CiAKQEAgLTI1Myw2ICsyNjgsMjEgQEAKIGludCByZG1hX2FjY2VwdChzdHJ1Y3QgcmRtYV9jbV9pZCAqaWQsIHN0cnVjdCByZG1hX2Nvbm5fcGFyYW0gKmNvbm5fcGFyYW0pOwogCiAvKioKKyAqIHJkbWFfbm90aWZ5IC0gTm90aWZpZXMgdGhlIFJETUEgQ00gb2YgYW4gYXN5bmNocm9ub3VzIGV2ZW50IHRoYXQgaGFzCisgKiBvY2N1cnJlZCBvbiB0aGUgY29ubmVjdGlvbi4KKyAqIEBpZDogQ29ubmVjdGlvbiBpZGVudGlmaWVyIHRvIHRyYW5zaXRpb24gdG8gZXN0YWJsaXNoZWQuCisgKiBAZXZlbnQ6IEFzeW5jaHJvbm91cyBldmVudC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGludm9rZWQgYnkgdXNlcnMgdG8gbm90aWZ5IHRoZSBDTSBvZiByZWxldmFudAorICogY29tbXVuaWNhdGlvbiBldmVudHMuICBFdmVudHMgdGhhdCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIENNIGFuZAorICogd2hlbiB0byByZXBvcnQgdGhlbSBhcmU6CisgKgorICogSUJfRVZFTlRfQ09NTV9FU1QgLSBVc2VkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIG9uIGEgY29ubmVjdGVkCisgKiAgICBRUCBiZWZvcmUgYW4gUlRVIGhhcyBiZWVuIHJlY2VpdmVkLgorICovCitpbnQgcmRtYV9ub3RpZnkoc3RydWN0IHJkbWFfY21faWQgKmlkLCBlbnVtIGliX2V2ZW50X3R5cGUgZXZlbnQpOworCisvKioKICAqIHJkbWFfcmVqZWN0IC0gQ2FsbGVkIHRvIHJlamVjdCBhIGNvbm5lY3Rpb24gcmVxdWVzdCBvciByZXNwb25zZS4KICAqLwogaW50IHJkbWFfcmVqZWN0KHN0cnVjdCByZG1hX2NtX2lkICppZCwgY29uc3Qgdm9pZCAqcHJpdmF0ZV9kYXRhLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL3JkbWFfY21faWIuaCBiL2luY2x1ZGUvcmRtYS9yZG1hX2NtX2liLmgKaW5kZXggZThjM2FmMS4uOWIxNzZkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZG1hL3JkbWFfY21faWIuaAorKysgYi9pbmNsdWRlL3JkbWEvcmRtYV9jbV9pYi5oCkBAIC00NCw0ICs0NCw3IEBACiBpbnQgcmRtYV9zZXRfaWJfcGF0aHMoc3RydWN0IHJkbWFfY21faWQgKmlkLAogCQkgICAgICBzdHJ1Y3QgaWJfc2FfcGF0aF9yZWMgKnBhdGhfcmVjLCBpbnQgbnVtX3BhdGhzKTsKIAorLyogR2xvYmFsIHFrZXkgZm9yIFVEIFFQcyBhbmQgbXVsdGljYXN0IGdyb3Vwcy4gKi8KKyNkZWZpbmUgUkRNQV9VRF9RS0VZIDB4MDEyMzQ1NjcKKwogI2VuZGlmIC8qIFJETUFfQ01fSUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oIGIvaW5jbHVkZS9yZG1hL3JkbWFfdXNlcl9jbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzJhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3JkbWEvcmRtYV91c2VyX2NtLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFJETUFfVVNFUl9DTV9ICisjZGVmaW5lIFJETUFfVVNFUl9DTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl92ZXJicy5oPgorI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl9zYS5oPgorCisjZGVmaW5lIFJETUFfVVNFUl9DTV9BQklfVkVSU0lPTgkzCisKKyNkZWZpbmUgUkRNQV9NQVhfUFJJVkFURV9EQVRBCQkyNTYKKworZW51bSB7CisJUkRNQV9VU0VSX0NNX0NNRF9DUkVBVEVfSUQsCisJUkRNQV9VU0VSX0NNX0NNRF9ERVNUUk9ZX0lELAorCVJETUFfVVNFUl9DTV9DTURfQklORF9BRERSLAorCVJETUFfVVNFUl9DTV9DTURfUkVTT0xWRV9BRERSLAorCVJETUFfVVNFUl9DTV9DTURfUkVTT0xWRV9ST1VURSwKKwlSRE1BX1VTRVJfQ01fQ01EX1FVRVJZX1JPVVRFLAorCVJETUFfVVNFUl9DTV9DTURfQ09OTkVDVCwKKwlSRE1BX1VTRVJfQ01fQ01EX0xJU1RFTiwKKwlSRE1BX1VTRVJfQ01fQ01EX0FDQ0VQVCwKKwlSRE1BX1VTRVJfQ01fQ01EX1JFSkVDVCwKKwlSRE1BX1VTRVJfQ01fQ01EX0RJU0NPTk5FQ1QsCisJUkRNQV9VU0VSX0NNX0NNRF9JTklUX1FQX0FUVFIsCisJUkRNQV9VU0VSX0NNX0NNRF9HRVRfRVZFTlQsCisJUkRNQV9VU0VSX0NNX0NNRF9HRVRfT1BUSU9OLAorCVJETUFfVVNFUl9DTV9DTURfU0VUX09QVElPTiwKKwlSRE1BX1VTRVJfQ01fQ01EX05PVElGWQorfTsKKworLyoKKyAqIGNvbW1hbmQgQUJJIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCByZG1hX3VjbV9jbWRfaGRyIHsKKwlfX3UzMiBjbWQ7CisJX191MTYgaW47CisJX191MTYgb3V0OworfTsKKworc3RydWN0IHJkbWFfdWNtX2NyZWF0ZV9pZCB7CisJX191NjQgdWlkOworCV9fdTY0IHJlc3BvbnNlOworCV9fdTE2IHBzOworCV9fdTggIHJlc2VydmVkWzZdOworfTsKKworc3RydWN0IHJkbWFfdWNtX2NyZWF0ZV9pZF9yZXNwIHsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9kZXN0cm95X2lkIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3UzMiBpZDsKKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9kZXN0cm95X2lkX3Jlc3AgeworCV9fdTMyIGV2ZW50c19yZXBvcnRlZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9iaW5kX2FkZHIgeworCV9fdTY0IHJlc3BvbnNlOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9yZXNvbHZlX2FkZHIgeworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc3JjX2FkZHI7CisJc3RydWN0IHNvY2thZGRyX2luNiBkc3RfYWRkcjsKKwlfX3UzMiBpZDsKKwlfX3UzMiB0aW1lb3V0X21zOworfTsKKworc3RydWN0IHJkbWFfdWNtX3Jlc29sdmVfcm91dGUgeworCV9fdTMyIGlkOworCV9fdTMyIHRpbWVvdXRfbXM7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fcXVlcnlfcm91dGUgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IHJkbWFfdWNtX3F1ZXJ5X3JvdXRlX3Jlc3AgeworCV9fdTY0IG5vZGVfZ3VpZDsKKwlzdHJ1Y3QgaWJfdXNlcl9wYXRoX3JlYyBpYl9yb3V0ZVsyXTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNyY19hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgZHN0X2FkZHI7CisJX191MzIgbnVtX3BhdGhzOworCV9fdTggcG9ydF9udW07CisJX191OCByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9jb25uX3BhcmFtIHsKKwlfX3UzMiBxcF9udW07CisJX191MzIgcmVzZXJ2ZWQ7CisJX191OCAgcHJpdmF0ZV9kYXRhW1JETUFfTUFYX1BSSVZBVEVfREFUQV07CisJX191OCAgcHJpdmF0ZV9kYXRhX2xlbjsKKwlfX3U4ICBzcnE7CisJX191OCAgcmVzcG9uZGVyX3Jlc291cmNlczsKKwlfX3U4ICBpbml0aWF0b3JfZGVwdGg7CisJX191OCAgZmxvd19jb250cm9sOworCV9fdTggIHJldHJ5X2NvdW50OworCV9fdTggIHJucl9yZXRyeV9jb3VudDsKKwlfX3U4ICB2YWxpZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV91ZF9wYXJhbSB7CisJX191MzIgcXBfbnVtOworCV9fdTMyIHFrZXk7CisJc3RydWN0IGliX3V2ZXJic19haF9hdHRyIGFoX2F0dHI7CisJX191OCAgcHJpdmF0ZV9kYXRhW1JETUFfTUFYX1BSSVZBVEVfREFUQV07CisJX191OCAgcHJpdmF0ZV9kYXRhX2xlbjsKKwlfX3U4ICByZXNlcnZlZFs3XTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9jb25uZWN0IHsKKwlzdHJ1Y3QgcmRtYV91Y21fY29ubl9wYXJhbSBjb25uX3BhcmFtOworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IHJkbWFfdWNtX2xpc3RlbiB7CisJX191MzIgaWQ7CisJX191MzIgYmFja2xvZzsKK307CisKK3N0cnVjdCByZG1hX3VjbV9hY2NlcHQgeworCV9fdTY0IHVpZDsKKwlzdHJ1Y3QgcmRtYV91Y21fY29ubl9wYXJhbSBjb25uX3BhcmFtOworCV9fdTMyIGlkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IHJkbWFfdWNtX3JlamVjdCB7CisJX191MzIgaWQ7CisJX191OCAgcHJpdmF0ZV9kYXRhX2xlbjsKKwlfX3U4ICByZXNlcnZlZFszXTsKKwlfX3U4ICBwcml2YXRlX2RhdGFbUkRNQV9NQVhfUFJJVkFURV9EQVRBXTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9kaXNjb25uZWN0IHsKKwlfX3UzMiBpZDsKK307CisKK3N0cnVjdCByZG1hX3VjbV9pbml0X3FwX2F0dHIgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTMyIGlkOworCV9fdTMyIHFwX3N0YXRlOworfTsKKworc3RydWN0IHJkbWFfdWNtX25vdGlmeSB7CisJX191MzIgaWQ7CisJX191MzIgZXZlbnQ7Cit9OworCitzdHJ1Y3QgcmRtYV91Y21fZ2V0X2V2ZW50IHsKKwlfX3U2NCByZXNwb25zZTsKK307CisKK3N0cnVjdCByZG1hX3VjbV9ldmVudF9yZXNwIHsKKwlfX3U2NCB1aWQ7CisJX191MzIgaWQ7CisJX191MzIgZXZlbnQ7CisJX191MzIgc3RhdHVzOworCXVuaW9uIHsKKwkJc3RydWN0IHJkbWFfdWNtX2Nvbm5fcGFyYW0gY29ubjsKKwkJc3RydWN0IHJkbWFfdWNtX3VkX3BhcmFtICAgdWQ7CisJfSBwYXJhbTsKK307CisKKyNlbmRpZiAvKiBSRE1BX1VTRVJfQ01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmggYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAppbmRleCA0MDExOTJlLi5lYTA4MTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaApAQCAtMjUsNiArMjUsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8c2NzaS9pc2NzaV9wcm90by5oPgogI2luY2x1ZGUgPHNjc2kvaXNjc2lfaWYuaD4KIApAQCAtMTM2LDcgKzEzOCw2IEBACiAKIAkvKiBjb250cm9sIGRhdGEgKi8KIAlpbnQJCQlpZDsJCS8qIENJRCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJaXRlbTsJCS8qIG1haW50YWlucyBsaXN0IG9mIGNvbm5zICovCiAJaW50CQkJY19zdGFnZTsJLyogY29ubmVjdGlvbiBzdGF0ZSAqLwogCS8qCiAJICogUHJlYWxsb2NhdGVkIGJ1ZmZlciBmb3IgcGR1cyB0aGF0IGhhdmUgZGF0YSBidXQgZG8gbm90CkBAIC0yMzUsMTAgKzIzNiw4IEBACiAJCQkJCQkgKiAtIG1nbXRwb29sLAkJICAgKgogCQkJCQkJICogLSByMnRwb29sCQkgICAqLwogCWludAkJCXN0YXRlOwkJLyogc2Vzc2lvbiBzdGF0ZSAgICAgICAgICAgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWl0ZW07CiAJaW50CQkJYWdlOwkJLyogY291bnRzIHNlc3Npb24gcmUtb3BlbnMgKi8KIAotCXN0cnVjdCBsaXN0X2hlYWQJY29ubmVjdGlvbnM7CS8qIGxpc3Qgb2YgY29ubmVjdGlvbnMgKi8KIAlpbnQJCQljbWRzX21heDsJLyogc2l6ZSBvZiBjbWRzIGFycmF5ICovCiAJc3RydWN0IGlzY3NpX2NtZF90YXNrCSoqY21kczsJCS8qIE9yaWdpbmFsIENtZHMgYXJyICovCiAJc3RydWN0IGlzY3NpX3F1ZXVlCWNtZHBvb2w7CS8qIFBEVSdzIHBvb2wgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJzYXMuaCBiL2luY2x1ZGUvc2NzaS9saWJzYXMuaAppbmRleCA5NTgyZTg0Li4wYzc3NWZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGlic2FzLmgKKysrIGIvaW5jbHVkZS9zY3NpL2xpYnNhcy5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KIAogc3RydWN0IGJsb2NrX2RldmljZTsKIApAQCAtMjAwLDkgKzIwMSwxNCBAQAogICAgICAgICB2b2lkICpsbGRkX2RldjsKIH07CiAKK3N0cnVjdCBzYXNfZGlzY292ZXJ5X2V2ZW50IHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgYXNkX3Nhc19wb3J0ICpwb3J0OworfTsKKwogc3RydWN0IHNhc19kaXNjb3ZlcnkgewogCXNwaW5sb2NrX3QgZGlzY19ldmVudF9sb2NrOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBkaXNjX3dvcmtbRElTQ19OVU1fRVZFTlRTXTsKKwlzdHJ1Y3Qgc2FzX2Rpc2NvdmVyeV9ldmVudCBkaXNjX3dvcmtbRElTQ19OVU1fRVZFTlRTXTsKIAl1bnNpZ25lZCBsb25nICAgIHBlbmRpbmc7CiAJdTggICAgIGZhbm91dF9zYXNfYWRkcls4XTsKIAl1OCAgICAgZWVkc19hWzhdOwpAQCAtMjQ4LDE0ICsyNTQsMTkgQEAKIAl2b2lkICpsbGRkX3BvcnQ7CSAgLyogbm90IHRvdWNoZWQgYnkgdGhlIHNhcyBjbGFzcyBjb2RlICovCiB9OwogCitzdHJ1Y3QgYXNkX3Nhc19ldmVudCB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGFzZF9zYXNfcGh5ICpwaHk7Cit9OworCiAvKiBUaGUgcGh5IHByZXR0eSBtdWNoIGlzIGNvbnRyb2xsZWQgYnkgdGhlIExMREQuCiAgKiBUaGUgY2xhc3Mgb25seSByZWFkcyB0aG9zZSBmaWVsZHMuCiAgKi8KIHN0cnVjdCBhc2Rfc2FzX3BoeSB7CiAvKiBwcml2YXRlOiAqLwogCS8qIHByb3RlY3RlZCBieSBoYS0+ZXZlbnRfbG9jayAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCAgIHBvcnRfZXZlbnRzW1BPUlRfTlVNX0VWRU5UU107Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICAgcGh5X2V2ZW50c1tQSFlfTlVNX0VWRU5UU107CisJc3RydWN0IGFzZF9zYXNfZXZlbnQgICBwb3J0X2V2ZW50c1tQT1JUX05VTV9FVkVOVFNdOworCXN0cnVjdCBhc2Rfc2FzX2V2ZW50ICAgcGh5X2V2ZW50c1tQSFlfTlVNX0VWRU5UU107CiAKIAl1bnNpZ25lZCBsb25nIHBvcnRfZXZlbnRzX3BlbmRpbmc7CiAJdW5zaWduZWQgbG9uZyBwaHlfZXZlbnRzX3BlbmRpbmc7CkBAIC0zMDcsMTAgKzMxOCwxNSBAQAogCWludCAgICAgICAgICAgICAgIHF1ZXVlX3RocmVhZF9raWxsOwogfTsKIAorc3RydWN0IHNhc19oYV9ldmVudCB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKmhhOworfTsKKwogc3RydWN0IHNhc19oYV9zdHJ1Y3QgewogLyogcHJpdmF0ZTogKi8KIAlzcGlubG9ja190ICAgICAgIGV2ZW50X2xvY2s7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGhhX2V2ZW50c1tIQV9OVU1fRVZFTlRTXTsKKwlzdHJ1Y3Qgc2FzX2hhX2V2ZW50IGhhX2V2ZW50c1tIQV9OVU1fRVZFTlRTXTsKIAl1bnNpZ25lZCBsb25nCSBwZW5kaW5nOwogCiAJc3RydWN0IHNjc2lfY29yZSBjb3JlOwpAQCAtMzM4LDYgKzM1NCw4IEBACiAJdm9pZCAoKm5vdGlmeV9waHlfZXZlbnQpKHN0cnVjdCBhc2Rfc2FzX3BoeSAqLCBlbnVtIHBoeV9ldmVudCk7CiAKIAl2b2lkICpsbGRkX2hhOwkJICAvKiBub3QgdG91Y2hlZCBieSBzYXMgY2xhc3MgY29kZSAqLworCisJc3RydWN0IGxpc3RfaGVhZCBlaF9kb25lX3E7CiB9OwogCiAjZGVmaW5lIFNIT1NUX1RPX1NBU19IQShfc2hvc3QpICgqKHN0cnVjdCBzYXNfaGFfc3RydWN0ICoqKShfc2hvc3QpLT5ob3N0ZGF0YSkKQEAgLTUyNiwxNyArNTQ0LDIwIEBACiAKIAl2b2lkICAgKmxsZGRfdGFzazsJICAvKiBmb3IgdXNlIGJ5IExMRERzICovCiAJdm9pZCAgICp1bGRkX3Rhc2s7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWJvcnRfd29yazsKIH07CiAKIAogCi0jZGVmaW5lIFNBU19UQVNLX1NUQVRFX1BFTkRJTkcgIDEKLSNkZWZpbmUgU0FTX1RBU0tfU1RBVEVfRE9ORSAgICAgMgotI2RlZmluZSBTQVNfVEFTS19TVEFURV9BQk9SVEVEICA0CisjZGVmaW5lIFNBU19UQVNLX1NUQVRFX1BFTkRJTkcgICAgICAxCisjZGVmaW5lIFNBU19UQVNLX1NUQVRFX0RPTkUgICAgICAgICAyCisjZGVmaW5lIFNBU19UQVNLX1NUQVRFX0FCT1JURUQgICAgICA0CisjZGVmaW5lIFNBU19UQVNLX0lOSVRJQVRPUl9BQk9SVEVEICA4CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNhc190YXNrICpzYXNfYWxsb2NfdGFzayhnZnBfdCBmbGFncykKIHsKLQlleHRlcm4ga21lbV9jYWNoZV90ICpzYXNfdGFza19jYWNoZTsKKwlleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnNhc190YXNrX2NhY2hlOwogCXN0cnVjdCBzYXNfdGFzayAqdGFzayA9IGttZW1fY2FjaGVfYWxsb2Moc2FzX3Rhc2tfY2FjaGUsIGZsYWdzKTsKIAogCWlmICh0YXNrKSB7CkBAIC01NTQsNyArNTc1LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXNfZnJlZV90YXNrKHN0cnVjdCBzYXNfdGFzayAqdGFzaykKIHsKIAlpZiAodGFzaykgewotCQlleHRlcm4ga21lbV9jYWNoZV90ICpzYXNfdGFza19jYWNoZTsKKwkJZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpzYXNfdGFza19jYWNoZTsKIAkJQlVHX09OKCFsaXN0X2VtcHR5KCZ0YXNrLT5saXN0KSk7CiAJCWttZW1fY2FjaGVfZnJlZShzYXNfdGFza19jYWNoZSwgdGFzayk7CiAJfQpAQCAtNTkyLDYgKzYxMyw3IEBACiBleHRlcm4gaW50IHNhc19yZWdpc3Rlcl9oYShzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqKTsKIGV4dGVybiBpbnQgc2FzX3VucmVnaXN0ZXJfaGEoc3RydWN0IHNhc19oYV9zdHJ1Y3QgKik7CiAKK2ludCBzYXNfcGh5X3Jlc2V0KHN0cnVjdCBzYXNfcGh5ICpwaHksIGludCBoYXJkX3Jlc2V0KTsKIGV4dGVybiBpbnQgc2FzX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICosCiAJCSAgICAgdm9pZCAoKnNjc2lfZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CiBleHRlcm4gaW50IHNhc190YXJnZXRfYWxsb2Moc3RydWN0IHNjc2lfdGFyZ2V0ICopOwpAQCAtNjI0LDQgKzY0Niw2IEBACiAKIHZvaWQgc2FzX2luaXRfZGV2KHN0cnVjdCBkb21haW5fZGV2aWNlICopOwogCit2b2lkIHNhc190YXNrX2Fib3J0KHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKKwogI2VuZGlmIC8qIF9TQVNMSUJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9saWJzcnAuaCBiL2luY2x1ZGUvc2NzaS9saWJzcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQzMTcxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zY3NpL2xpYnNycC5oCkBAIC0wLDAgKzEsNzcgQEAKKyNpZm5kZWYgX19MSUJTUlBfSF9fCisjZGVmaW5lIF9fTElCU1JQX0hfXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3NycC5oPgorCitlbnVtIGl1ZV9mbGFncyB7CisJVl9ESU9WRVIsCisJVl9XUklURSwKKwlWX0xJTktFRCwKKwlWX0ZMWUlORywKK307CisKK3N0cnVjdCBzcnBfYnVmIHsKKwlkbWFfYWRkcl90IGRtYTsKKwl2b2lkICpidWY7Cit9OworCitzdHJ1Y3Qgc3JwX3F1ZXVlIHsKKwl2b2lkICpwb29sOworCXZvaWQgKml0ZW1zOworCXN0cnVjdCBrZmlmbyAqcXVldWU7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RydWN0IHNycF90YXJnZXQgeworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNtZF9xdWV1ZTsKKworCXNpemVfdCBzcnBfaXVfc2l6ZTsKKwlzdHJ1Y3Qgc3JwX3F1ZXVlIGl1X3F1ZXVlOworCXNpemVfdCByeF9yaW5nX3NpemU7CisJc3RydWN0IHNycF9idWYgKipyeF9yaW5nOworCisJdm9pZCAqbGRhdGE7Cit9OworCitzdHJ1Y3QgaXVfZW50cnkgeworCXN0cnVjdCBzcnBfdGFyZ2V0ICp0YXJnZXQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlsaXN0OworCWRtYV9hZGRyX3QgcmVtb3RlX3Rva2VuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdHJ1Y3Qgc3JwX2J1ZiAqc2J1ZjsKK307CisKK3R5cGVkZWYgaW50IChzcnBfcmRtYV90KShzdHJ1Y3Qgc2NzaV9jbW5kICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsCisJCQkgc3RydWN0IHNycF9kaXJlY3RfYnVmICosIGludCwKKwkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgc3JwX3RhcmdldF9hbGxvYyhzdHJ1Y3Qgc3JwX3RhcmdldCAqLCBzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgc2l6ZV90KTsKK2V4dGVybiB2b2lkIHNycF90YXJnZXRfZnJlZShzdHJ1Y3Qgc3JwX3RhcmdldCAqKTsKKworZXh0ZXJuIHN0cnVjdCBpdV9lbnRyeSAqc3JwX2l1X2dldChzdHJ1Y3Qgc3JwX3RhcmdldCAqKTsKK2V4dGVybiB2b2lkIHNycF9pdV9wdXQoc3RydWN0IGl1X2VudHJ5ICopOworCitleHRlcm4gaW50IHNycF9jbWRfcXVldWUoc3RydWN0IFNjc2lfSG9zdCAqLCBzdHJ1Y3Qgc3JwX2NtZCAqLCB2b2lkICosIHU2NCk7CitleHRlcm4gaW50IHNycF90cmFuc2Zlcl9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKiwgc3RydWN0IHNycF9jbWQgKiwKKwkJCSAgICAgc3JwX3JkbWFfdCwgaW50LCBpbnQpOworCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNycF90YXJnZXQgKmhvc3RfdG9fc3JwX3RhcmdldChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXJldHVybiAoc3RydWN0IHNycF90YXJnZXQgKikgaG9zdC0+aG9zdGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNycF9jbWRfZGlyZWN0aW9uKHN0cnVjdCBzcnBfY21kICpjbWQpCit7CisJcmV0dXJuIChjbWQtPmJ1Zl9mbXQgPj4gNCkgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaS5oCmluZGV4IDg0YTZkNWYuLjVjMGU5NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2kuaApAQCAtOTcsNiArOTcsNyBAQAogI2RlZmluZSBQRVJTSVNURU5UX1JFU0VSVkVfSU4gMHg1ZQogI2RlZmluZSBQRVJTSVNURU5UX1JFU0VSVkVfT1VUIDB4NWYKICNkZWZpbmUgUkVQT1JUX0xVTlMgICAgICAgICAgIDB4YTAKKyNkZWZpbmUgTUFJTlRFTkFOQ0VfSU4gICAgICAgIDB4YTMKICNkZWZpbmUgTU9WRV9NRURJVU0gICAgICAgICAgIDB4YTUKICNkZWZpbmUgRVhDSEFOR0VfTUVESVVNICAgICAgIDB4YTYKICNkZWZpbmUgUkVBRF8xMiAgICAgICAgICAgICAgIDB4YTgKQEAgLTExNCw2ICsxMTUsOCBAQAogI2RlZmluZSBTRVJWSUNFX0FDVElPTl9JTiAgICAgMHg5ZQogLyogdmFsdWVzIGZvciBzZXJ2aWNlIGFjdGlvbiBpbiAqLwogI2RlZmluZQlTQUlfUkVBRF9DQVBBQ0lUWV8xNiAgMHgxMAorLyogdmFsdWVzIGZvciBtYWludGVuYW5jZSBpbiAqLworI2RlZmluZSBNSV9SRVBPUlRfVEFSR0VUX1BHUyAgMHgwYQogCiAvKiBWYWx1ZXMgZm9yIFQxMC8wNC0yNjJyNyAqLwogI2RlZmluZQlBVEFfMTYJCSAgICAgIDB4ODUJLyogMTYtYnl0ZSBwYXNzLXRocnUgKi8KQEAgLTQzMCw3ICs0MzMsNyBAQAogI2RlZmluZSBTQ1NJX0lPQ1RMX0dFVF9QQ0kJCTB4NTM4NwogCiAvKiBQdWxsIGEgdTMyIG91dCBvZiBhIFNDU0kgbWVzc2FnZSAodXNpbmcgQkUgU0NTSSBjb252ZW50aW9ucykgKi8KLXN0YXRpYyBpbmxpbmUgdTMyIHNjc2lfdG9fdTMyKHU4ICpwdHIpCitzdGF0aWMgaW5saW5lIF9fdTMyIHNjc2lfdG9fdTMyKF9fdTggKnB0cikKIHsKIAlyZXR1cm4gKHB0clswXTw8MjQpICsgKHB0clsxXTw8MTYpICsgKHB0clsyXTw8OCkgKyBwdHJbM107CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmggYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKaW5kZXggYmUxMTdmOC4uZDY5NDhkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaApAQCAtOCw2ICs4LDcgQEAKIAogc3RydWN0IHJlcXVlc3Q7CiBzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CitzdHJ1Y3QgU2NzaV9Ib3N0Owogc3RydWN0IHNjc2lfZGV2aWNlOwogCiAKQEAgLTcyLDYgKzczLDkgQEAKIAl1bnNpZ25lZCBzaG9ydCB1c2Vfc2c7CS8qIE51bWJlciBvZiBwaWVjZXMgb2Ygc2NhdHRlci1nYXRoZXIgKi8KIAl1bnNpZ25lZCBzaG9ydCBzZ2xpc3RfbGVuOwkvKiBzaXplIG9mIG1hbGxvYydkIHNjYXR0ZXItZ2F0aGVyIGxpc3QgKi8KIAorCS8qIG9mZnNldCBpbiBjbWQgd2UgYXJlIGF0IChmb3IgbXVsdGktdHJhbnNmZXIgdGd0IGNtZHMpICovCisJdW5zaWduZWQgb2Zmc2V0OworCiAJdW5zaWduZWQgdW5kZXJmbG93OwkvKiBSZXR1cm4gZXJyb3IgaWYgbGVzcyB0aGFuCiAJCQkJICAgdGhpcyBhbW91bnQgaXMgdHJhbnNmZXJyZWQgKi8KIApAQCAtMTE5LDcgKzEyMywxMCBAQAogfTsKIAogZXh0ZXJuIHN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfZ2V0X2NvbW1hbmQoc3RydWN0IHNjc2lfZGV2aWNlICosIGdmcF90KTsKK2V4dGVybiBzdHJ1Y3Qgc2NzaV9jbW5kICpfX3Njc2lfZ2V0X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqLCBnZnBfdCk7CiBleHRlcm4gdm9pZCBzY3NpX3B1dF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKik7CitleHRlcm4gdm9pZCBfX3Njc2lfcHV0X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICosCisJCQkgICAgICAgc3RydWN0IGRldmljZSAqKTsKIGV4dGVybiB2b2lkIHNjc2lfaW9fY29tcGxldGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBzY3NpX2ZpbmlzaF9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBleHRlcm4gdm9pZCBzY3NpX3JlcV9hYm9ydF9jbWQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKQEAgLTEyOCw0ICsxMzUsNyBAQAogCQkJCSBzaXplX3QgKm9mZnNldCwgc2l6ZV90ICpsZW4pOwogZXh0ZXJuIHZvaWQgc2NzaV9rdW5tYXBfYXRvbWljX3NnKHZvaWQgKnZpcnQpOwogCitleHRlcm4gc3RydWN0IHNjYXR0ZXJsaXN0ICpzY3NpX2FsbG9jX3NndGFibGUoc3RydWN0IHNjc2lfY21uZCAqLCBnZnBfdCk7CitleHRlcm4gdm9pZCBzY3NpX2ZyZWVfc2d0YWJsZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50KTsKKwogI2VuZGlmIC8qIF9TQ1NJX1NDU0lfQ01ORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9kZXZpY2UuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCmluZGV4IGI0MDFjODIuLmViZjMxYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2RldmljZS5oCkBAIC0yMjMsMTMgKzIyMywxMyBAQAogCQkJCQkJICBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiAKIC8qKgotICogc2hvc3RfZm9yX2VhY2hfZGV2aWNlICAtICBpdGVyYXRlIG92ZXIgYWxsIGRldmljZXMgb2YgYSBob3N0Ci0gKiBAc2RldjoJaXRlcmF0b3IKLSAqIEBob3N0Oglob3N0IHdoaWNoZXMgZGV2aWNlcyB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlcgorICogc2hvc3RfZm9yX2VhY2hfZGV2aWNlIC0gaXRlcmF0ZSBvdmVyIGFsbCBkZXZpY2VzIG9mIGEgaG9zdAorICogQHNkZXY6IHRoZSAmc3RydWN0IHNjc2lfZGV2aWNlIHRvIHVzZSBhcyBhIGN1cnNvcgorICogQHNob3N0OiB0aGUgJnN0cnVjdCBzY3NpX2hvc3QgdG8gaXRlcmF0ZSBvdmVyCiAgKgotICogVGhpcyB0cmF2ZXJzZXMgb3ZlciBlYWNoIGRldmljZXMgb2YgQHNob3N0LiAgVGhlIGRldmljZXMgaGF2ZQotICogYSByZWZlcmVuY2UgdGhhdCBtdXN0IGJlIHJlbGVhc2VkIGJ5IHNjc2lfaG9zdF9wdXQgd2hlbiBicmVha2luZwotICogb3V0IG9mIHRoZSBsb29wLgorICogSXRlcmF0b3IgdGhhdCByZXR1cm5zIGVhY2ggZGV2aWNlIGF0dGFjaGVkIHRvIEBzaG9zdC4gIFRoaXMgbG9vcAorICogdGFrZXMgYSByZWZlcmVuY2Ugb24gZWFjaCBkZXZpY2UgYW5kIHJlbGVhc2VzIGl0IGF0IHRoZSBlbmQuICBJZgorICogeW91IGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgeW91IG11c3QgY2FsbCBzY3NpX2RldmljZV9wdXQoc2RldikuCiAgKi8KICNkZWZpbmUgc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSBcCiAJZm9yICgoc2RldikgPSBfX3Njc2lfaXRlcmF0ZV9kZXZpY2VzKChzaG9zdCksIE5VTEwpOyBcCkBAIC0yMzcsMTcgKzIzNywxNyBAQAogCSAgICAgKHNkZXYpID0gX19zY3NpX2l0ZXJhdGVfZGV2aWNlcygoc2hvc3QpLCAoc2RldikpKQogCiAvKioKLSAqIF9fc2hvc3RfZm9yX2VhY2hfZGV2aWNlICAtICBpdGVyYXRlIG92ZXIgYWxsIGRldmljZXMgb2YgYSBob3N0IChVTkxPQ0tFRCkKLSAqIEBzZGV2OglpdGVyYXRvcgotICogQGhvc3Q6CWhvc3Qgd2hpY2hlcyBkZXZpY2VzIHdlIHdhbnQgdG8gaXRlcmF0ZSBvdmVyCisgKiBfX3Nob3N0X2Zvcl9lYWNoX2RldmljZSAtIGl0ZXJhdGUgb3ZlciBhbGwgZGV2aWNlcyBvZiBhIGhvc3QgKFVOTE9DS0VEKQorICogQHNkZXY6IHRoZSAmc3RydWN0IHNjc2lfZGV2aWNlIHRvIHVzZSBhcyBhIGN1cnNvcgorICogQHNob3N0OiB0aGUgJnN0cnVjdCBzY3NpX2hvc3QgdG8gaXRlcmF0ZSBvdmVyCiAgKgotICogVGhpcyB0cmF2ZXJzZXMgb3ZlciBlYWNoIGRldmljZXMgb2YgQHNob3N0LiAgSXQgZG9lcyBfbm90XyB0YWtlIGEKLSAqIHJlZmVyZW5jZSBvbiB0aGUgc2NzaV9kZXZpY2UsIHRodXMgaXQgdGhlIHdob2xlIGxvb3AgbXVzdCBiZSBwcm90ZWN0ZWQKLSAqIGJ5IHNob3N0LT5ob3N0X2xvY2suCisgKiBJdGVyYXRvciB0aGF0IHJldHVybnMgZWFjaCBkZXZpY2UgYXR0YWNoZWQgdG8gQHNob3N0LiAgSXQgZG9lcyBfbm90XworICogdGFrZSBhIHJlZmVyZW5jZSBvbiB0aGUgc2NzaV9kZXZpY2UsIHNvIHRoZSB3aG9sZSBsb29wIG11c3QgYmUKKyAqIHByb3RlY3RlZCBieSBzaG9zdC0+aG9zdF9sb2NrLgogICoKLSAqIE5vdGU6ICBUaGUgb25seSByZWFzb24gd2h5IGRyaXZlcnMgd291bGQgd2FudCB0byB1c2UgdGhpcyBpcyBiZWNhdXNlCi0gKiB0aGV5J3JlIG5lZWQgdG8gYWNjZXNzIHRoZSBkZXZpY2UgbGlzdCBpbiBpcnEgY29udGV4dC4gIE90aGVyd2lzZSB5b3UKLSAqIHJlYWxseSB3YW50IHRvIHVzZSBzaG9zdF9mb3JfZWFjaF9kZXZpY2UgaW5zdGVhZC4KKyAqIE5vdGU6IFRoZSBvbmx5IHJlYXNvbiB0byB1c2UgdGhpcyBpcyBiZWNhdXNlIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUKKyAqIGRldmljZSBsaXN0IGluIGludGVycnVwdCBjb250ZXh0LiAgT3RoZXJ3aXNlIHlvdSByZWFsbHkgd2FudCB0byB1c2UKKyAqIHNob3N0X2Zvcl9lYWNoX2RldmljZSBpbnN0ZWFkLgogICovCiAjZGVmaW5lIF9fc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIHNob3N0KSBcCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSgoc2RldiksICYoKHNob3N0KS0+X19kZXZpY2VzKSwgc2libGluZ3MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmggYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKaW5kZXggMzljNmY4Yy4uN2YxZjQxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaApAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCitzdHJ1Y3QgcmVxdWVzdF9xdWV1ZTsKIHN0cnVjdCBibG9ja19kZXZpY2U7CiBzdHJ1Y3QgY29tcGxldGlvbjsKIHN0cnVjdCBtb2R1bGU7CkBAIC0xMjQsNiArMTI1LDM5IEBACiAJCQkgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKIAogCS8qCisJICogVGhlIHRyYW5zZmVyIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBxdWV1ZSBhIHNjc2kgY29tbWFuZCB0bworCSAqIHRoZSBMTEQuIFdoZW4gdGhlIGRyaXZlciBpcyBmaW5pc2hlZCBwcm9jZXNzaW5nIHRoZSBjb21tYW5kCisJICogdGhlIGRvbmUgY2FsbGJhY2sgaXMgaW52b2tlZC4KKwkgKgorCSAqIHJldHVybiB2YWx1ZXM6IHNlZSBxdWV1ZWNvbW1hbmQKKwkgKgorCSAqIElmIHRoZSBMTEQgYWNjZXB0cyB0aGUgY21kLCBpdCBzaG91bGQgc2V0IHRoZSByZXN1bHQgdG8gYW4KKwkgKiBhcHByb3ByaWF0ZSB2YWx1ZSB3aGVuIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyB0aGUgZG9uZSBmdW5jdGlvbi4KKwkgKgorCSAqIFNUQVRVUzogUkVRVUlSRUQgRk9SIFRBUkdFVCBEUklWRVJTCisJICovCisJLyogVE9ETzogcmVuYW1lICovCisJaW50ICgqIHRyYW5zZmVyX3Jlc3BvbnNlKShzdHJ1Y3Qgc2NzaV9jbW5kICosCisJCQkJICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CisJLyoKKwkgKiBUaGlzIGlzIGNhbGxlZCB0byBpbmZvcm0gdGhlIExMRCB0byB0cmFuc2ZlciBjbWQtPnJlcXVlc3RfYnVmZmxlbgorCSAqIGJ5dGVzIG9mIHRoZSBjbWQgYXQgY21kLT5vZmZzZXQgaW4gdGhlIGNtZC4gVGhlIGNtZC0+dXNlX3NnCisJICogc3BlY2llZmllcyB0aGUgbnVtYmVyIG9mIHNjYXR0ZXJsaXN0IGVudHJpZWQgaW4gdGhlIGNvbW1hbmQKKwkgKiBhbmQgY21kLT5yZXF1ZXN0X2J1ZmZlciBjb250YWlucyB0aGUgc2NhdHRlcmxpc3QuCisJICoKKwkgKiBJZiB0aGUgY29tbWFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkIGluIG9uZSB0cmFuc2Zlcl9kYXRhIGNhbGwKKwkgKiBiZWN1YXNlIGEgc2NhdHRlcmxpc3Qgd2l0aGluIHRoZSBMTEQncyBsaW1pdHMgY2Fubm90IGJlCisJICogY3JlYXRlZCB0aGVuIHRyYW5zZmVyX2RhdGEgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisJICogSXQgaXMgaW5pdGlhbGx5IGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCwgYW5kIGxhdGVyCisJICogY2FsbHMgYXJlIGZyb20gdGhlIGludGVycnVwIGNvbnRleHQuCisJICovCisJaW50ICgqIHRyYW5zZmVyX2RhdGEpKHN0cnVjdCBzY3NpX2NtbmQgKiwKKwkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKKworCS8qIFVzZWQgYXMgY2FsbGJhY2sgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0LiAqLworCWludCAoKiB0c2tfbWdtdF9yZXNwb25zZSkodTY0IG1pZCwgaW50IHJlc3VsdCk7CisKKwkvKgogCSAqIFRoaXMgaXMgYW4gZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ3kgcm91dGluZS4gIFlvdSBkb24ndCBuZWVkIHRvCiAJICogZGVmaW5lIG9uZSBvZiB0aGVzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byAtIHRoZXJlIGlzIGEgZGVmYXVsdAogCSAqIHJvdXRpbmUgdGhhdCBpcyBwcmVzZW50IHRoYXQgc2hvdWxkIHdvcmsgaW4gbW9zdCBjYXNlcy4gIEZvciB0aG9zZQpAQCAtMjQxLDYgKzI3NSwyNCBAQAogCXZvaWQgKCogdGFyZ2V0X2Rlc3Ryb3kpKHN0cnVjdCBzY3NpX3RhcmdldCAqKTsKIAogCS8qCisJICogSWYgYSBob3N0IGhhcyB0aGUgYWJpbGl0eSB0byBkaXNjb3ZlciB0YXJnZXRzIG9uIGl0cyBvd24gaW5zdGVhZAorCSAqIG9mIHNjYW5uaW5nIHRoZSBlbnRpcmUgYnVzLCBpdCBjYW4gZmlsbCBpbiB0aGlzIGZ1bmN0aW9uIGFuZAorCSAqIGNhbGwgc2NzaV9zY2FuX2hvc3QoKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5CisJICogdW50aWwgaXQgcmV0dXJucyAxIHdpdGggdGhlIHNjc2lfaG9zdCBhbmQgdGhlIGVsYXBzZWQgdGltZSBvZgorCSAqIHRoZSBzY2FuIGluIGppZmZpZXMuCisJICoKKwkgKiBTdGF0dXM6IE9QVElPTkFMCisJICovCisJaW50ICgqIHNjYW5fZmluaXNoZWQpKHN0cnVjdCBTY3NpX0hvc3QgKiwgdW5zaWduZWQgbG9uZyk7CisKKwkvKgorCSAqIElmIHRoZSBob3N0IHdhbnRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNjYW4gc3RhcnRzLCBidXQKKwkgKiBhZnRlciB0aGUgbWlkbGF5ZXIgaGFzIHNldCB1cCByZWFkeSBmb3IgdGhlIHNjYW4sIGl0IGNhbiBmaWxsCisJICogaW4gdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwl2b2lkICgqIHNjYW5fc3RhcnQpKHN0cnVjdCBTY3NpX0hvc3QgKik7CisKKwkvKgogCSAqIGZpbGwgaW4gdGhpcyBmdW5jdGlvbiB0byBhbGxvdyB0aGUgcXVldWUgZGVwdGggb2YgdGhpcyBob3N0CiAJICogdG8gYmUgY2hhbmdlYWJsZSAob24gYSBwZXIgZGV2aWNlIGJhc2lzKS4gIHJldHVybnMgZWl0aGVyCiAJICogdGhlIGN1cnJlbnQgcXVldWUgZGVwdGggc2V0dGluZyAobWF5IGJlIGRpZmZlcmVudCBmcm9tIHdoYXQKQEAgLTU1Miw2ICs2MDQsOSBAQAogCS8qIHRhc2sgbWdtdCBmdW5jdGlvbiBpbiBwcm9ncmVzcyAqLwogCXVuc2lnbmVkIHRtZl9pbl9wcm9ncmVzczoxOwogCisJLyogQXN5bmNocm9ub3VzIHNjYW4gaW4gcHJvZ3Jlc3MgKi8KKwl1bnNpZ25lZCBhc3luY19zY2FuOjE7CisKIAkvKgogCSAqIE9wdGlvbmFsIHdvcmsgcXVldWUgdG8gYmUgdXRpbGl6ZWQgYnkgdGhlIHRyYW5zcG9ydAogCSAqLwpAQCAtNTY4LDYgKzYyMywxMiBAQAogCSAqLwogCXVuc2lnbmVkIGludCBtYXhfaG9zdF9ibG9ja2VkOwogCisJLyoKKwkgKiBxIHVzZWQgZm9yIHNjc2lfdGd0IG1zZ3MsIGFzeW5jIGV2ZW50cyBvciBhbnkgb3RoZXIgcmVxdWVzdHMgdGhhdAorCSAqIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGluIHVzZXJzcGFjZQorCSAqLworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICp1c3BhY2VfcmVxX3E7CisKIAkvKiBsZWdhY3kgY3JhcCAqLwogCXVuc2lnbmVkIGxvbmcgYmFzZTsKIAl1bnNpZ25lZCBsb25nIGlvX3BvcnQ7CkBAIC02NDgsMTEgKzcwOSw2IEBACiAKIGV4dGVybiB1NjQgc2NzaV9jYWxjdWxhdGVfYm91bmNlX2xpbWl0KHN0cnVjdCBTY3NpX0hvc3QgKik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzY3NpX2Fzc2lnbl9sb2NrKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzcGlubG9ja190ICpsb2NrKQotewotCXNob3N0LT5ob3N0X2xvY2sgPSBsb2NrOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKnNjc2lfZ2V0X2RldmljZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKICAgICAgICAgcmV0dXJuIHNob3N0LT5zaG9zdF9nZW5kZXYucGFyZW50OwpAQCAtNjcxLDYgKzcyNyw5IEBACiBleHRlcm4gdm9pZCBzY3NpX2Jsb2NrX3JlcXVlc3RzKHN0cnVjdCBTY3NpX0hvc3QgKik7CiAKIHN0cnVjdCBjbGFzc19jb250YWluZXI7CisKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqX19zY3NpX2FsbG9jX3F1ZXVlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJCQkJdm9pZCAoKikgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopKTsKIC8qCiAgKiBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGFsbG9jYXRlIGFuZCBmcmVlIGEgcHNldWRvIGRldmljZQogICogd2hpY2ggd2lsbCBjb25uZWN0IHRvIHRoZSBob3N0IGFkYXB0ZXIgaXRzZWxmIHJhdGhlciB0aGFuIGFueQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfdGd0LmggYi9pbmNsdWRlL3Njc2kvc2NzaV90Z3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ0Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdGd0LmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIFNDU0kgdGFyZ2V0IGRlZmluaXRpb25zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKK3N0cnVjdCBTY3NpX0hvc3Q7CitzdHJ1Y3Qgc2NzaV9jbW5kOworc3RydWN0IHNjc2lfbHVuOworCitleHRlcm4gc3RydWN0IFNjc2lfSG9zdCAqc2NzaV90Z3RfY21kX3RvX2hvc3Qoc3RydWN0IHNjc2lfY21uZCAqKTsKK2V4dGVybiBpbnQgc2NzaV90Z3RfYWxsb2NfcXVldWUoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiB2b2lkIHNjc2lfdGd0X2ZyZWVfcXVldWUoc3RydWN0IFNjc2lfSG9zdCAqKTsKK2V4dGVybiBpbnQgc2NzaV90Z3RfcXVldWVfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICosIHN0cnVjdCBzY3NpX2x1biAqLCB1NjQpOworZXh0ZXJuIGludCBzY3NpX3RndF90c2tfbWdtdF9yZXF1ZXN0KHN0cnVjdCBTY3NpX0hvc3QgKiwgaW50LCB1NjQsIHN0cnVjdCBzY3NpX2x1biAqLAorCQkJCSAgICAgdm9pZCAqKTsKK2V4dGVybiBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2hvc3RfZ2V0X2NvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqLAorCQkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24sCWdmcF90KTsKK2V4dGVybiB2b2lkIHNjc2lfaG9zdF9wdXRfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCBzY3NpX2NtbmQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90Z3RfaWYuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RndF9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDVlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90Z3RfaWYuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogU0NTSSB0YXJnZXQga2VybmVsL3VzZXIgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEZVSklUQSBUb21vbm9yaSA8dG9tb2ZAYWNtLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBNaWtlIENocmlzdGllIDxtaWNoYWVsY0Bjcy53aXNjLmVkdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpZm5kZWYgX19TQ1NJX1RBUkdFVF9JRl9ICisjZGVmaW5lIF9fU0NTSV9UQVJHRVRfSUZfSAorCisvKiB1c2VyIC0+IGtlcm5lbCAqLworI2RlZmluZQlUR1RfVUVWRU5UX0NNRF9SU1AJMHgwMDAxCisjZGVmaW5lCVRHVF9VRVZFTlRfVFNLX01HTVRfUlNQCTB4MDAwMgorCisvKiBrZXJuZWwgLT4gdXNlciAqLworI2RlZmluZQlUR1RfS0VWRU5UX0NNRF9SRVEJMHgxMDAxCisjZGVmaW5lCVRHVF9LRVZFTlRfQ01EX0RPTkUJMHgxMDAyCisjZGVmaW5lCVRHVF9LRVZFTlRfVFNLX01HTVRfUkVRCTB4MTAwMworCitzdHJ1Y3QgdGd0X2V2ZW50X2hkciB7CisJdWludDE2X3QgdmVyc2lvbjsKKwl1aW50MTZfdCBzdGF0dXM7CisJdWludDE2X3QgdHlwZTsKKwl1aW50MTZfdCBsZW47Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChzaXplb2YodWludDY0X3QpKSkpOworCitzdHJ1Y3QgdGd0X2V2ZW50IHsKKwlzdHJ1Y3QgdGd0X2V2ZW50X2hkciBoZHI7CisKKwl1bmlvbiB7CisJCS8qIHVzZXItPiBrZXJuZWwgKi8KKwkJc3RydWN0IHsKKwkJCWludCBob3N0X25vOworCQkJdWludDMyX3QgbGVuOworCQkJaW50IHJlc3VsdDsKKwkJCWFsaWduZWRfdTY0IHVhZGRyOworCQkJdWludDhfdCBydzsKKwkJCWFsaWduZWRfdTY0IHRhZzsKKwkJfSBjbWRfcnNwOworCQlzdHJ1Y3QgeworCQkJaW50IGhvc3Rfbm87CisJCQlhbGlnbmVkX3U2NCBtaWQ7CisJCQlpbnQgcmVzdWx0OworCQl9IHRza19tZ210X3JzcDsKKworCisJCS8qIGtlcm5lbCAtPiB1c2VyICovCisJCXN0cnVjdCB7CisJCQlpbnQgaG9zdF9ubzsKKwkJCXVpbnQzMl90IGRhdGFfbGVuOworCQkJdWludDhfdCBzY2JbMTZdOworCQkJdWludDhfdCBsdW5bOF07CisJCQlpbnQgYXR0cmlidXRlOworCQkJYWxpZ25lZF91NjQgdGFnOworCQl9IGNtZF9yZXE7CisJCXN0cnVjdCB7CisJCQlpbnQgaG9zdF9ubzsKKwkJCWFsaWduZWRfdTY0IHRhZzsKKwkJCWludCByZXN1bHQ7CisJCX0gY21kX2RvbmU7CisJCXN0cnVjdCB7CisJCQlpbnQgaG9zdF9ubzsKKwkJCWludCBmdW5jdGlvbjsKKwkJCWFsaWduZWRfdTY0IHRhZzsKKwkJCXVpbnQ4X3QgbHVuWzhdOworCQkJYWxpZ25lZF91NjQgbWlkOworCQl9IHRza19tZ210X3JlcTsKKwl9IHA7Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChzaXplb2YodWludDY0X3QpKSkpOworCisjZGVmaW5lIFRHVF9SSU5HX1NJWkUgKDFVTCA8PCAxNikKKyNkZWZpbmUgVEdUX1JJTkdfUEFHRVMgKFRHVF9SSU5HX1NJWkUgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgVEdUX0VWRU5UX1BFUl9QQUdFIChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IHRndF9ldmVudCkpCisjZGVmaW5lIFRHVF9NQVhfRVZFTlRTIChUR1RfRVZFTlRfUEVSX1BBR0UgKiBUR1RfUklOR19QQUdFUykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCmluZGV4IGZkMzUyMzIuLjc5OGY3YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oCkBAIC0yMDYsOSArMjA2LDkgQEAKIAl1OCBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBlZXJzOwogCXN0cnVjdCBkZXZpY2UgZGV2OwotIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGV2X2xvc3Nfd29yazsKKyAJc3RydWN0IGRlbGF5ZWRfd29yayBkZXZfbG9zc193b3JrOwogIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2Nhbl93b3JrOwotIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZmFpbF9pb193b3JrOworIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGZhaWxfaW9fd29yazsKICAJc3RydWN0IHdvcmtfc3RydWN0IHN0Z3RfZGVsZXRlX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJwb3J0X2RlbGV0ZV93b3JrOwogfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZih1bnNpZ25lZCBsb25nKSkpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKaW5kZXggMzllODMzMi4uZDVjMjE4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmgKQEAgLTI5LDcgKzI5LDYgQEAKIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIHN0cnVjdCBpc2NzaV90cmFuc3BvcnQ7CiBzdHJ1Y3QgU2NzaV9Ib3N0Owotc3RydWN0IG1lbXBvb2xfem9uZTsKIHN0cnVjdCBpc2NzaV9jbHNfY29ubjsKIHN0cnVjdCBpc2NzaV9jb25uOwogc3RydWN0IGlzY3NpX2NtZF90YXNrOwpAQCAtMTU3LDkgKzE1Niw2IEBACiAKIAlpbnQgYWN0aXZlOwkJCS8qIG11c3QgYmUgYWNjZXNzZWQgd2l0aCB0aGUgY29ubmxvY2sgKi8KIAlzdHJ1Y3QgZGV2aWNlIGRldjsJCS8qIHN5c2ZzIHRyYW5zcG9ydC9jb250YWluZXIgZGV2aWNlICovCi0Jc3RydWN0IG1lbXBvb2xfem9uZSAqel9lcnJvcjsKLQlzdHJ1Y3QgbWVtcG9vbF96b25lICp6X3BkdTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVxdWV1ZTsKIH07CiAKICNkZWZpbmUgaXNjc2lfZGV2X3RvX2Nvbm4oX2RldikgXApAQCAtMTgwLDcgKzE3Niw3IEBACiAKIAkvKiByZWNvdmVyeSBmaWVsZHMgKi8KIAlpbnQgcmVjb3ZlcnlfdG1vOwotCXN0cnVjdCB3b3JrX3N0cnVjdCByZWNvdmVyeV93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcmVjb3Zlcnlfd29yazsKIAogCWludCB0YXJnZXRfaWQ7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaAppbmRleCA1MzAyNDM3Li41OTYzM2E4MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmgKQEAgLTczLDYgKzczLDggQEAKIAogCS8qIGZvciB0aGUgbGlzdCBvZiBwaHlzIGJlbG9uZ2luZyB0byBhIHBvcnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXBvcnRfc2libGluZ3M7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICByZXNldF93b3JrOwogfTsKIAogI2RlZmluZSBkZXZfdG9fcGh5KGQpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oIGIvaW5jbHVkZS9zb3VuZC9hYzk3X2NvZGVjLmgKaW5kZXggNGM0MzUyMS4uMzM3MjAzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9hYzk3X2NvZGVjLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9hYzk3X2NvZGVjLmgKQEAgLTUxMSw3ICs1MTEsNyBAQAogI2lmZGVmIENPTkZJR19TTkRfQUM5N19QT1dFUl9TQVZFCiAJdW5zaWduZWQgaW50IHBvd2VyX3VwOwkvKiBwb3dlciBzdGF0ZXMgKi8KIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcG93ZXJfd29ya3E7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHBvd2VyX3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayBwb3dlcl93b3JrOwogI2VuZGlmCiAJc3RydWN0IGRldmljZSBkZXY7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hazQxMTQuaCBiL2luY2x1ZGUvc291bmQvYWs0MTE0LmgKaW5kZXggMTE3MDJhYS4uMmVlMDYxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9hazQxMTQuaAorKysgYi9pbmNsdWRlL3NvdW5kL2FrNDExNC5oCkBAIC0xODIsNyArMTgyLDcgQEAKIAl1bnNpZ25lZCBjaGFyIHJjczA7CiAJdW5zaWduZWQgY2hhciByY3MxOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCXZvaWQgKmNoYW5nZV9jYWxsYmFja19wcml2YXRlOwogCXZvaWQgKCpjaGFuZ2VfY2FsbGJhY2spKHN0cnVjdCBhazQxMTQgKmFrNDExNCwgdW5zaWduZWQgY2hhciBjMCwgdW5zaWduZWQgY2hhciBjMSk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9jb3JlLmggYi9pbmNsdWRlL3NvdW5kL2NvcmUuaAppbmRleCBmYTFjYTAxLi5hOTk0YmVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2NvcmUuaAorKysgYi9pbmNsdWRlL3NvdW5kL2NvcmUuaApAQCAtMTMyLDYgKzEzMiw3IEBACiAJaW50IHNodXRkb3duOwkJCS8qIHRoaXMgY2FyZCBpcyBnb2luZyBkb3duICovCiAJaW50IGZyZWVfb25fbGFzdF9jbG9zZTsJCS8qIGZyZWUgaW4gY29udGV4dCBvZiBmaWxlX3JlbGVhc2UgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBzaHV0ZG93bl9zbGVlcDsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0xODcsMTMgKzE4OCwxNCBAQAogCWludCBkZXZpY2U7CQkJLyogZGV2aWNlIG51bWJlciAqLwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZfb3BzOwkvKiBmaWxlIG9wZXJhdGlvbnMgKi8KIAl2b2lkICpwcml2YXRlX2RhdGE7CQkvKiBwcml2YXRlIGRhdGEgZm9yIGZfb3BzLT5vcGVuICovCi0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwkvKiBjbGFzcyBkZXZpY2UgZm9yIHN5c2ZzICovCisJc3RydWN0IGRldmljZSAqZGV2OwkJLyogZGV2aWNlIGZvciBzeXNmcyAqLwogfTsKIAogLyogc291bmQuYyAqLwogCiBleHRlcm4gaW50IHNuZF9tYWpvcjsKIGV4dGVybiBpbnQgc25kX2VjYXJkc19saW1pdDsKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgKnNvdW5kX2NsYXNzOwogCiB2b2lkIHNuZF9yZXF1ZXN0X2NhcmQoaW50IGNhcmQpOwogCkBAIC0yMDMsNyArMjA1LDcgQEAKIGludCBzbmRfdW5yZWdpc3Rlcl9kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldik7CiB2b2lkICpzbmRfbG9va3VwX21pbm9yX2RhdGEodW5zaWduZWQgaW50IG1pbm9yLCBpbnQgdHlwZSk7CiBpbnQgc25kX2FkZF9kZXZpY2Vfc3lzZnNfZmlsZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2LAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpOworCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpOwogCiAjaWZkZWYgQ09ORklHX1NORF9PU1NFTVVMCiBpbnQgc25kX3JlZ2lzdGVyX29zc19kZXZpY2UoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldiwKQEAgLTI1NSw3ICsyNTcsNyBAQAogaW50IHNuZF9jYXJkX2ZpbGVfcmVtb3ZlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiAjaWZuZGVmIHNuZF9jYXJkX3NldF9kZXYKLSNkZWZpbmUgc25kX2NhcmRfc2V0X2RldihjYXJkLGRldnB0cikgKChjYXJkKS0+ZGV2ID0gKGRldnB0cikpCisjZGVmaW5lIHNuZF9jYXJkX3NldF9kZXYoY2FyZCxkZXZwdHIpICgoY2FyZCktPnBhcmVudCA9IChkZXZwdHIpKQogI2VuZGlmCiAKIC8qIGRldmljZS5jICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3BjbS5oIGIvaW5jbHVkZS9zb3VuZC9wY20uaAppbmRleCBhZmFmM2U4Li4yZjY0NWRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3BjbS5oCisrKyBiL2luY2x1ZGUvc291bmQvcGNtLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9hc291bmQuaD4KICNpbmNsdWRlIDxzb3VuZC9tZW1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAjZGVmaW5lIHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKSAoKHN1YnN0cmVhbSktPnByaXZhdGVfZGF0YSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oIGIvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKaW5kZXggNGFkODZlYi4uMTcxMzdmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKQEAgLTEsMyArMSwzIEBACiAvKiBpbmNsdWRlL3ZlcnNpb24uaC4gIEdlbmVyYXRlZCBieSBhbHNhL2tzeW5jIHNjcmlwdC4gICovCiAjZGVmaW5lIENPTkZJR19TTkRfVkVSU0lPTiAiMS4wLjEzIgotI2RlZmluZSBDT05GSUdfU05EX0RBVEUgIiAoRnJpIE9jdCAwNiAxODoyODoxOSAyMDA2IFVUQykiCisjZGVmaW5lIENPTkZJR19TTkRfREFURSAiIChUdWUgTm92IDI4IDE0OjA3OjI0IDIwMDYgVVRDKSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vbWJ4ZmIuaCBiL2luY2x1ZGUvdmlkZW8vbWJ4ZmIuaAppbmRleCAzYmRlMGY1Li4yMGI5MDAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL21ieGZiLmgKKysrIGIvaW5jbHVkZS92aWRlby9tYnhmYi5oCkBAIC0xLDYgKzEsOSBAQAogI2lmbmRlZiBfX01CWF9GQl9ICiAjZGVmaW5lIF9fTUJYX0ZCX0gKIAorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCiBzdHJ1Y3QgbWJ4ZmJfdmFsIHsKIAl1bnNpZ25lZCBpbnQJZGVmdmFsOwogCXVuc2lnbmVkIGludAltaW47CkBAIC0yNSw0ICsyOCwzMiBAQAogCQlpbnQgKCpyZW1vdmUpKHN0cnVjdCBmYl9pbmZvICpmYik7CiB9OwogCisvKiBwbGFuYXIgKi8KKyNkZWZpbmUgTUJYRkJfRk1UX1lVVjEyCQkwCisKKy8qIHBhY2tlZCAqLworI2RlZmluZSBNQlhGQl9GTVRfVVkwVlkxCTEKKyNkZWZpbmUgTUJYRkJfRk1UX1ZZMFVZMQkyCisjZGVmaW5lIE1CWEZCX0ZNVF9ZMFVZMVYJMworI2RlZmluZSBNQlhGQl9GTVRfWTBWWTFVCTQKK3N0cnVjdCBtYnhmYl9vdmVybGF5U2V0dXAgeworCV9fdTMyIGVuYWJsZTsKKwlfX3UzMiB4LCB5OworCV9fdTMyIHdpZHRoLCBoZWlnaHQ7CisJX191MzIgYWxwaGE7CisJX191MzIgZm10OworCV9fdTMyIG1lbV9vZmZzZXQ7CisJX191MzIgc2NhbGVkX3dpZHRoOworCV9fdTMyIHNjYWxlZF9oZWlnaHQ7CisKKwkvKiBGaWxsZWQgYnkgdGhlIGRyaXZlciAqLworCV9fdTMyIFVfb2Zmc2V0OworCV9fdTMyIFZfb2Zmc2V0OworCisJX191MTYgWV9zdHJpZGU7CisJX191MTYgVVZfc3RyaWRlOworfTsKKworI2RlZmluZSBNQlhGQl9JT0NYX09WRVJMQVkJX0lPV1IoMHhGNCwgMHgwMCxzdHJ1Y3QgbWJ4ZmJfb3ZlcmxheVNldHVwKQorCiAjZW5kaWYgLyogX19NQlhfRkJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9wbTNmYi5oIGIvaW5jbHVkZS92aWRlby9wbTNmYi5oCmluZGV4IGFjMDIxMzcuLjk0YzdkMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vcG0zZmIuaAorKysgYi9pbmNsdWRlL3ZpZGVvL3BtM2ZiLmgKQEAgLTYwNywxNiArNjA3LDE2IEBACiAjZGVmaW5lIFBNM0ZCRGVzdFJlYWRNb2RlT3IJCQkJCTB4YWM5OAogCSNkZWZpbmUgUE0zRkJEZXN0UmVhZE1vZGVfUmVhZERpc2FibGUJCQkwPDwwCiAJI2RlZmluZSBQTTNGQkRlc3RSZWFkTW9kZV9SZWFkRW5hYmxlCQkJMTw8MAotCSNkZWZpbmUgUE0zRkJEZXN0UmVhZE1vZGVfU3RyaXBlUGl0Y2goc3ApCSgoKHNwKSYweDcpPDwyCi0JI2RlZmluZSBQTTNGQkRlc3RSZWFkTW9kZV9TdHJpcGVIZWlnaHQoc2gpCSgoKHNoKSYweDcpPDw3CisJI2RlZmluZSBQTTNGQkRlc3RSZWFkTW9kZV9TdHJpcGVQaXRjaChzcCkJKCgoc3ApJjB4Nyk8PDIpCisJI2RlZmluZSBQTTNGQkRlc3RSZWFkTW9kZV9TdHJpcGVIZWlnaHQoc2gpCSgoKHNoKSYweDcpPDw3KQogCSNkZWZpbmUgUE0zRkJEZXN0UmVhZE1vZGVfRW5hYmxlMAkJCTE8PDgKIAkjZGVmaW5lIFBNM0ZCRGVzdFJlYWRNb2RlX0VuYWJsZTEJCQkxPDw5CiAJI2RlZmluZSBQTTNGQkRlc3RSZWFkTW9kZV9FbmFibGUyCQkJMTw8MTAKIAkjZGVmaW5lIFBNM0ZCRGVzdFJlYWRNb2RlX0VuYWJsZTMJCQkxPDwxMQotCSNkZWZpbmUgUE0zRkJEZXN0UmVhZE1vZGVfTGF5b3V0MChsKQkJKCgobCkmMHgzKTw8MTIKLQkjZGVmaW5lIFBNM0ZCRGVzdFJlYWRNb2RlX0xheW91dDEobCkJCSgoKGwpJjB4Myk8PDE0Ci0JI2RlZmluZSBQTTNGQkRlc3RSZWFkTW9kZV9MYXlvdXQyKGwpCQkoKChsKSYweDMpPDwxNgotCSNkZWZpbmUgUE0zRkJEZXN0UmVhZE1vZGVfTGF5b3V0MyhsKQkJKCgobCkmMHgzKTw8MTgKKwkjZGVmaW5lIFBNM0ZCRGVzdFJlYWRNb2RlX0xheW91dDAobCkJCSgoKGwpJjB4Myk8PDEyKQorCSNkZWZpbmUgUE0zRkJEZXN0UmVhZE1vZGVfTGF5b3V0MShsKQkJKCgobCkmMHgzKTw8MTQpCisJI2RlZmluZSBQTTNGQkRlc3RSZWFkTW9kZV9MYXlvdXQyKGwpCQkoKChsKSYweDMpPDwxNikKKwkjZGVmaW5lIFBNM0ZCRGVzdFJlYWRNb2RlX0xheW91dDMobCkJCSgoKGwpJjB4Myk8PDE4KQogCSNkZWZpbmUgUE0zRkJEZXN0UmVhZE1vZGVfT3JpZ2luMAkJCTE8PDIwCiAJI2RlZmluZSBQTTNGQkRlc3RSZWFkTW9kZV9PcmlnaW4xCQkJMTw8MjEKIAkjZGVmaW5lIFBNM0ZCRGVzdFJlYWRNb2RlX09yaWdpbjIJCQkxPDwyMgpAQCAtNjQwLDE2ICs2NDAsMTYgQEAKICNkZWZpbmUgUE0zRkJTb3VyY2VSZWFkTW9kZU9yCQkJCQkweGFjYTgKIAkjZGVmaW5lIFBNM0ZCU291cmNlUmVhZE1vZGVfUmVhZERpc2FibGUJCQkoMDw8MCkKIAkjZGVmaW5lIFBNM0ZCU291cmNlUmVhZE1vZGVfUmVhZEVuYWJsZQkJCSgxPDwwKQotCSNkZWZpbmUgUE0zRkJTb3VyY2VSZWFkTW9kZV9TdHJpcGVQaXRjaChzcCkJKCgoc3ApJjB4Nyk8PDIKLQkjZGVmaW5lIFBNM0ZCU291cmNlUmVhZE1vZGVfU3RyaXBlSGVpZ2h0KHNoKQkoKChzaCkmMHg3KTw8NwotCSNkZWZpbmUgUE0zRkJTb3VyY2VSZWFkTW9kZV9MYXlvdXQobCkJCSgoKGwpJjB4Myk8PDgKKwkjZGVmaW5lIFBNM0ZCU291cmNlUmVhZE1vZGVfU3RyaXBlUGl0Y2goc3ApCSgoKHNwKSYweDcpPDwyKQorCSNkZWZpbmUgUE0zRkJTb3VyY2VSZWFkTW9kZV9TdHJpcGVIZWlnaHQoc2gpCSgoKHNoKSYweDcpPDw3KQorCSNkZWZpbmUgUE0zRkJTb3VyY2VSZWFkTW9kZV9MYXlvdXQobCkJCSgoKGwpJjB4Myk8PDgpCiAJI2RlZmluZSBQTTNGQlNvdXJjZVJlYWRNb2RlX09yaWdpbgkJCTE8PDEwCiAJI2RlZmluZSBQTTNGQlNvdXJjZVJlYWRNb2RlX0Jsb2NraW5nCQkJMTw8MTEKIAkjZGVmaW5lIFBNM0ZCU291cmNlUmVhZE1vZGVfVXNlclRleGVsQ29vcmQJCTE8PDEzCiAJI2RlZmluZSBQTTNGQlNvdXJjZVJlYWRNb2RlX1dyYXBYRW5hYmxlCQkJMTw8MTQKIAkjZGVmaW5lIFBNM0ZCU291cmNlUmVhZE1vZGVfV3JhcFlFbmFibGUJCQkxPDwxNQotCSNkZWZpbmUgUE0zRkJTb3VyY2VSZWFkTW9kZV9XcmFwWCh3KQkJKCgodykmMHhmKTw8MTYKLQkjZGVmaW5lIFBNM0ZCU291cmNlUmVhZE1vZGVfV3JhcFkodykJCSgoKHcpJjB4Zik8PDIwCisJI2RlZmluZSBQTTNGQlNvdXJjZVJlYWRNb2RlX1dyYXBYKHcpCQkoKCh3KSYweGYpPDwxNikKKwkjZGVmaW5lIFBNM0ZCU291cmNlUmVhZE1vZGVfV3JhcFkodykJCSgoKHcpJjB4Zik8PDIwKQogCSNkZWZpbmUgUE0zRkJTb3VyY2VSZWFkTW9kZV9FeHRlcm5hbFNvdXJjZURhdGEJCTE8PDI0CiAjZGVmaW5lIFBNM0ZCV3JpdGVCdWZmZXJBZGRyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAwCiAjZGVmaW5lIFBNM0ZCV3JpdGVCdWZmZXJBZGRyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDA4CkBAIC05NDIsNyArOTQyLDcgQEAKICNkZWZpbmUgUE0zV2luZG93CQkJCQkJMHg4OTgwCiAJI2RlZmluZSBQTTNXaW5kb3dfRm9yY2VMQlVwZGF0ZQkJCQkxPDwzCiAJI2RlZmluZSBQTTNXaW5kb3dfTEJVcGRhdGVTb3VyY2UJCQkxPDw0Ci0JI2RlZmluZSBQTTNXaW5kb3dfRnJhbWVDb3VudChjKQkJCQkoKChjKSYweGZmKTw8OQorCSNkZWZpbmUgUE0zV2luZG93X0ZyYW1lQ291bnQoYykJCQkJKCgoYykmMHhmZik8PDkpCiAJI2RlZmluZSBQTTNXaW5kb3dfU3RlbmNpbEZDUAkJCQkxPDwxNwogCSNkZWZpbmUgUE0zV2luZG93X0RlcHRoRkNQCQkJCTE8PDE4CiAJI2RlZmluZSBQTTNXaW5kb3dfT3ZlcnJpZGVXcml0ZUZpbHRlcmluZwkJMTw8MTkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vc3N0ZmIuaCBiL2luY2x1ZGUvdmlkZW8vc3N0ZmIuaAppbmRleCA1ZGJmNWU3Li5iYWExNjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL3NzdGZiLmgKKysrIGIvaW5jbHVkZS92aWRlby9zc3RmYi5oCkBAIC0xMTksNyArMTE5LDcgQEAKICNkZWZpbmUgQkFDS1BPUkNICQkweDAyMDgKICNkZWZpbmUgVklERU9ESU1FTlNJT05TCQkweDAyMGMKICNkZWZpbmUgRkJJSU5JVDAJCTB4MDIxMAkJLyogbWlzYytmaWZvICBjb250cm9scyAqLwotIyAgZGVmaW5lIEVOX1ZHQV9QQVNTVEhST1VHSAkgIEJJVCgwKQorIyAgZGVmaW5lIERJU19WR0FfUEFTU1RIUk9VR0gJICBCSVQoMCkKICMgIGRlZmluZSBGQklfUkVTRVQJCSAgQklUKDEpCiAjICBkZWZpbmUgRklGT19SRVNFVAkJICBCSVQoMikKICNkZWZpbmUgRkJJSU5JVDEJCTB4MDIxNAkJLyogUENJICsgdmlkZW8gY29udHJvbHMgKi8KQEAgLTI1MSw3ICsyNTEsNyBAQAogIyAgZGVmaW5lIERBQ1JFR19JQ1NfQ0xLMV9BCSAgMAkvKiBiaXQ0ICovCiAKIC8qIHNzdCBkZWZhdWx0IGluaXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEZCSUlOSVQwX0RFRkFVTFQgRU5fVkdBX1BBU1NUSFJPVUdICisjZGVmaW5lIEZCSUlOSVQwX0RFRkFVTFQgRElTX1ZHQV9QQVNTVEhST1VHSAogCiAjZGVmaW5lIEZCSUlOSVQxX0RFRkFVTFQgCVwKIAkoCQkJXApAQCAtMjk2LDYgKzI5NiwxMSBAQAogICoKICAqLwogCisvKiBpb2N0bCB0byBlbmFibGUvZGlzYWJsZSBWR0EgcGFzc3Rocm91Z2ggKi8KKyNkZWZpbmUgU1NURkJfU0VUX1ZHQVBBU1MJX0lPVygnRicsIDB4ZGQsIF9fdTMyKQorI2RlZmluZSBTU1RGQl9HRVRfVkdBUEFTUwlfSU9SKCdGJywgMHhkZCwgX191MzIpCisKKwogLyogdXNlZCB0byBrbm93IHdpdGNoIGNsb2NrIHRvIHNldCAqLwogZW51bSB7CiAJVklEX0NMT0NLPTAsCkBAIC0zMTcsNyArMzIyLDcgQEAKIH07CiAKIHN0cnVjdCBkYWNfc3dpdGNoIHsKLQljaGFyICogbmFtZTsKKwljb25zdCBjaGFyICpuYW1lOwogCWludCAoKmRldGVjdCkgKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAlpbnQgKCpzZXRfcGxsKSAoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBwbGxfdGltaW5nICp0LCBjb25zdCBpbnQgY2xvY2spOwogCXZvaWQgKCpzZXRfdmlkbW9kKSAoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGludCBicHApOwpAQCAtMzQ1LDcgKzM1MCw3IEBACiAJc3RydWN0IHBjaV9kZXYJCSpkZXY7CiAJaW50CXR5cGU7CiAJdTgJcmV2aXNpb247Ci0JaW50CWdmeF9jbG9jazsJLyogc3RhdHVzICovCisJdTgJdmdhcGFzczsJLyogVkdBIHBhc3MgdGhyb3VnaDogMT1lbmFibGVkLCAwPWRpc2FibGVkICovCiB9OwogCiAjZW5kaWYgLyogX1NTVEZCX0hfICovCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggMTAzODI5My4uZjAwMGVkYiAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMSw1ICsxLDYgQEAKIGNvbmZpZyBERUZDT05GSUdfTElTVAogCXN0cmluZworCWRlcGVuZHMgb24gIVVNTAogCW9wdGlvbiBkZWZjb25maWdfbGlzdAogCWRlZmF1bHQgIi9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCWRlZmF1bHQgIi9ldGMva2VybmVsLWNvbmZpZyIKQEAgLTI0OCw2ICsyNDksMjYgQEAKIAogCSAgU2F5IE4gaWYgdW5zdXJlLgogCitjb25maWcgU1lTRlNfREVQUkVDQVRFRAorCWJvb2wgIkNyZWF0ZSBkZXByZWNhdGVkIHN5c2ZzIGZpbGVzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGNyZWF0ZXMgZGVwcmVjYXRlZCBzeW1saW5rcyBzdWNoIGFzIHRoZQorCSAgImRldmljZSItbGluaywgdGhlIDxzdWJzeXN0ZW0+OjxuYW1lPi1saW5rLCBhbmQgdGhlCisJICAiYnVzIi1saW5rLiBJdCBtYXkgYWxzbyBhZGQgZGVwcmVjYXRlZCBrZXkgaW4gdGhlCisJICB1ZXZlbnQgZW52aXJvbm1lbnQuCisJICBOb25lIG9mIHRoZXNlIGZlYXR1cmVzIG9yIHZhbHVlcyBzaG91bGQgYmUgdXNlZCB0b2RheSwgYXMKKwkgIHRoZXkgZXhwb3J0IGRyaXZlciBjb3JlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdG8gdXNlcnNwYWNlCisJICBvciBleHBvcnQgcHJvcGVydGllcyB3aGljaCBjYW4ndCBiZSBrZXB0IHN0YWJsZSBhY3Jvc3Mga2VybmVsCisJICByZWxlYXNlcy4KKworCSAgSWYgZW5hYmxlZCwgdGhpcyBvcHRpb24gd2lsbCBhbHNvIG1vdmUgYW55IGRldmljZSBzdHJ1Y3R1cmVzCisJICB0aGF0IGJlbG9uZyB0byBhIGNsYXNzLCBiYWNrIGludG8gdGhlIC9zeXMvY2xhc3MgaGVpcmFjaHksIGluCisJICBvcmRlciB0byBzdXBwb3J0IG9sZGVyIHZlcnNpb25zIG9mIHVkZXYuCisKKwkgIElmIHlvdSBhcmUgdXNpbmcgYSBkaXN0cm8gdGhhdCB3YXMgcmVsZWFzZWQgaW4gMjAwNiBvciBsYXRlciwKKwkgIGl0IHNob3VsZCBiZSBzYWZlIHRvIHNheSBOIGhlcmUuCisKIGNvbmZpZyBSRUxBWQogCWJvb2wgIktlcm5lbC0+dXNlciBzcGFjZSByZWxheSBzdXBwb3J0IChmb3JtZXJseSByZWxheWZzKSIKIAloZWxwCkBAIC0yODMsNiArMzA0LDE1IEBACiAKIAkgIFNheSBOIGlmIHVuc3VyZS4KIAorY29uZmlnIFRBU0tfSU9fQUNDT1VOVElORworCWJvb2wgIkVuYWJsZSBwZXItdGFzayBzdG9yYWdlIEkvTyBhY2NvdW50aW5nIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gVEFTS19YQUNDVAorCWhlbHAKKwkgIENvbGxlY3QgaW5mb3JtYXRpb24gb24gdGhlIG51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIEkvTyB3aGljaCB0aGlzCisJICB0YXNrIGhhcyBjYXVzZWQuCisKKwkgIFNheSBOIGlmIHVuc3VyZS4KKwogY29uZmlnIFNZU0NUTAogCWJvb2wKIApAQCAtMzAzLDIzICszMzMsMjIgQEAKIAogY29uZmlnIFNZU0NUTF9TWVNDQUxMCiAJYm9vbCAiU3lzY3RsIHN5c2NhbGwgc3VwcG9ydCIgaWYgRU1CRURERUQKLQlkZWZhdWx0IG4KKwlkZWZhdWx0IHkKIAlzZWxlY3QgU1lTQ1RMCiAJLS0taGVscC0tLQotCSAgRW5hYmxlIHRoZSBkZXByZWNhdGVkIHN5c2N0bCBzeXN0ZW0gY2FsbC4gIHN5c19zeXNjdGwgdXNlcwotCSAgYmluYXJ5IHBhdGhzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kIHRvIGJlIGEgbWFqb3IgcGFpbiB0byBtYWludGFpbgotCSAgYW5kIHVzZS4gIFRoZSBpbnRlcmZhY2UgaW4gL3Byb2Mvc3lzIGlzIG5vdyB0aGUgcHJpbWFyeSBhbmQgd2hhdAotCSAgZXZlcnlvbmUgdXNlcy4KKwkgIHN5c19zeXNjdGwgdXNlcyBiaW5hcnkgcGF0aHMgdGhhdCBoYXZlIGJlZW4gZm91bmQgY2hhbGxlbmdpbmcKKwkgIHRvIHByb3Blcmx5IG1haW50YWluIGFuZCB1c2UuICBUaGUgaW50ZXJmYWNlIGluIC9wcm9jL3N5cworCSAgdXNpbmcgcGF0aHMgd2l0aCBhc2NpaSBuYW1lcyBpcyBub3cgdGhlIHByaW1hcnkgcGF0aCB0byB0aGlzCisJICBpbmZvcm1hdGlvbi4KIAotCSAgTm90aGluZyBoYXMgYmVlbiB1c2luZyB0aGUgYmluYXJ5IHN5c2N0bCBpbnRlcmZhY2UgZm9yIHNvbWUKLQkgIHRpbWUgbm93IHNvIG5vdGhpbmcgc2hvdWxkIGJyZWFrIGlmIHlvdSBkaXNhYmxlIHN5c2N0bCBzeXNjYWxsCi0JICBzdXBwb3J0LCBhbmQgeW91ciBrZXJuZWwgd2lsbCBnZXQgbWFyZ2luYWxseSBzbWFsbGVyLgorCSAgQWxtb3N0IG5vdGhpbmcgdXNpbmcgdGhlIGJpbmFyeSBzeXNjdGwgaW50ZXJmYWNlIHNvIGlmIHlvdSBhcmUKKwkgIHRyeWluZyB0byBzYXZlIHNvbWUgc3BhY2UgaXQgaXMgcHJvYmFibHkgc2FmZSB0byBkaXNhYmxlIHRoaXMsCisJICBtYWtpbmcgeW91ciBrZXJuZWwgbWFyZ2luYWxseSBzbWFsbGVyLgogCi0JICBVbmxlc3MgeW91IGhhdmUgYW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoZSBzeXNfc3lzY3RsIGludGVyZmFjZQotIAkgIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4gaGVyZS4KKwkgIElmIHVuc3VyZSBzYXkgWSBoZXJlLgogCiBjb25maWcgS0FMTFNZTVMKLQkgYm9vbCAiTG9hZCBhbGwgc3ltYm9scyBmb3IgZGVidWdnaW5nL2trc3ltb29wcyIgaWYgRU1CRURERUQKKwkgYm9vbCAiTG9hZCBhbGwgc3ltYm9scyBmb3IgZGVidWdnaW5nL2tzeW1vb3BzIiBpZiBFTUJFRERFRAogCSBkZWZhdWx0IHkKIAkgaGVscAogCSAgIFNheSBZIGhlcmUgdG8gbGV0IHRoZSBrZXJuZWwgcHJpbnQgb3V0IHN5bWJvbGljIGNyYXNoIGluZm9ybWF0aW9uIGFuZApkaWZmIC0tZ2l0IGEvaW5pdC9NYWtlZmlsZSBiL2luaXQvTWFrZWZpbGUKaW5kZXggNjMzYTI2OC4uZDZjNzY0ZCAxMDA2NDQKLS0tIGEvaW5pdC9NYWtlZmlsZQorKysgYi9pbml0L01ha2VmaWxlCkBAIC0xNSw2ICsxNSw3IEBACiAKICMgZGVwZW5kZW5jaWVzIG9uIGdlbmVyYXRlZCBmaWxlcyBuZWVkIHRvIGJlIGxpc3RlZCBleHBsaWNpdGx5CiAKKyQob2JqKS9tYWluLm86IGluY2x1ZGUvbGludXgvY29tcGlsZS5oCiAkKG9iaikvdmVyc2lvbi5vOiBpbmNsdWRlL2xpbnV4L2NvbXBpbGUuaAogCiAjIGNvbXBpbGUuaCBjaGFuZ2VzIGRlcGVuZGluZyBvbiBob3N0bmFtZSwgZ2VuZXJhdGlvbiBudW1iZXIsIGV0YywKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzX2luaXRyZC5jIGIvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKaW5kZXggOTE5YTgwYy4uMmNmZDdjYiAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKKysrIGIvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcm9tZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgImRvX21vdW50cy5oIgogCmRpZmYgLS1naXQgYS9pbml0L2luaXRyYW1mcy5jIGIvaW5pdC9pbml0cmFtZnMuYwppbmRleCBkMjhjMTA5Li40ZmEwZjc5IDEwMDY0NAotLS0gYS9pbml0L2luaXRyYW1mcy5jCisrKyBiL2luaXQvaW5pdHJhbWZzLmMKQEAgLTE4Miw2ICsxODIsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgZG9faGVhZGVyKHZvaWQpCiB7CisJaWYgKG1lbWNtcChjb2xsZWN0ZWQsICIwNzA3MDciLCA2KT09MCkgeworCQllcnJvcigiaW5jb3JyZWN0IGNwaW8gbWV0aG9kIHVzZWQ6IHVzZSAtSCBuZXdjIG9wdGlvbiIpOworCQlyZXR1cm4gMTsKKwl9CiAJaWYgKG1lbWNtcChjb2xsZWN0ZWQsICIwNzA3MDEiLCA2KSkgewogCQllcnJvcigibm8gY3BpbyBtYWdpYyIpOwogCQlyZXR1cm4gMTsKQEAgLTUyMiw3ICs1MjYsNyBAQAogCiAjZW5kaWYKIAotdm9pZCBfX2luaXQgcG9wdWxhdGVfcm9vdGZzKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwb3B1bGF0ZV9yb290ZnModm9pZCkKIHsKIAljaGFyICplcnIgPSB1bnBhY2tfdG9fcm9vdGZzKF9faW5pdHJhbWZzX3N0YXJ0LAogCQkJIF9faW5pdHJhbWZzX2VuZCAtIF9faW5pdHJhbWZzX3N0YXJ0LCAwKTsKQEAgLTU0MCw3ICs1NDQsNyBAQAogCQkJdW5wYWNrX3RvX3Jvb3RmcygoY2hhciAqKWluaXRyZF9zdGFydCwKIAkJCQlpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0LCAwKTsKIAkJCWZyZWVfaW5pdHJkKCk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJfQogCQlwcmludGsoIml0IGlzbid0ICglcyk7IGxvb2tzIGxpa2UgYW4gaW5pdHJkXG4iLCBlcnIpOwogCQlmZCA9IHN5c19vcGVuKCIvaW5pdHJkLmltYWdlIiwgT19XUk9OTFl8T19DUkVBVCwgMDcwMCk7CkBAIC01NjEsNCArNTY1LDYgQEAKICNlbmRpZgogCX0KICNlbmRpZgorCXJldHVybiAwOwogfQorcm9vdGZzX2luaXRjYWxsKHBvcHVsYXRlX3Jvb3Rmcyk7CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGVlMTIzMjQuLmUzZjBiYjIgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhcnRfa2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CkBAIC00OSw2ICs1MCw5IEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNyZWxlYXNlLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9idWdzLmg+CkBAIC03Myw2ICs3NywxMCBAQAogI2Vycm9yIFNvcnJ5LCB5b3VyIEdDQyBpcyB0b28gb2xkLiBJdCBidWlsZHMgaW5jb3JyZWN0IGtlcm5lbHMuCiAjZW5kaWYKIAorI2lmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMSAmJiBfX0dOVUNfUEFUQ0hMRVZFTF9fID09IDAKKyN3YXJuaW5nIGdjYy00LjEuMCBpcyBrbm93biB0byBtaXNjb21waWxlIHRoZSBrZXJuZWwuICBBIGRpZmZlcmVudCBjb21waWxlciB2ZXJzaW9uIGlzIHJlY29tbWVuZGVkLgorI2VuZGlmCisKIHN0YXRpYyBpbnQgaW5pdCh2b2lkICopOwogCiBleHRlcm4gdm9pZCBpbml0X0lSUSh2b2lkKTsKQEAgLTg2LDcgKzk0LDYgQEAKIGV4dGVybiB2b2lkIHByaW9fdHJlZV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgcmFkaXhfdHJlZV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgZnJlZV9pbml0bWVtKHZvaWQpOwotZXh0ZXJuIHZvaWQgcG9wdWxhdGVfcm9vdGZzKHZvaWQpOwogZXh0ZXJuIHZvaWQgZHJpdmVyX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBwcmVwYXJlX25hbWVzcGFjZSh2b2lkKTsKICNpZmRlZglDT05GSUdfQUNQSQpAQCAtNDc1LDYgKzQ4MiwxMiBAQAogewogfQogCitzdGF0aWMgY29uc3QgY2hhciBsaW51eF9iYW5uZXJbXSA9CisJIkxpbnV4IHZlcnNpb24gIiBVVFNfUkVMRUFTRQorCSIgKCIgTElOVVhfQ09NUElMRV9CWSAiQCIgTElOVVhfQ09NUElMRV9IT1NUICIpIgorCSIgKCIgTElOVVhfQ09NUElMRVIgIikiCisJIiAiIFVUU19WRVJTSU9OICJcbiI7CisKIGFzbWxpbmthZ2Ugdm9pZCBfX2luaXQgc3RhcnRfa2VybmVsKHZvaWQpCiB7CiAJY2hhciAqIGNvbW1hbmRfbGluZTsKQEAgLTUwMyw2ICs1MTYsNyBAQAogCXByaW50ayhLRVJOX05PVElDRSk7CiAJcHJpbnRrKGxpbnV4X2Jhbm5lcik7CiAJc2V0dXBfYXJjaCgmY29tbWFuZF9saW5lKTsKKwl1bndpbmRfc2V0dXAoKTsKIAlzZXR1cF9wZXJfY3B1X2FyZWFzKCk7CiAJc21wX3ByZXBhcmVfYm9vdF9jcHUoKTsJLyogYXJjaC1zcGVjaWZpYyBib290LWNwdSBob29rcyAqLwogCkBAIC02MTgsOCArNjMyLDYgQEAKIH0KIF9fc2V0dXAoImluaXRjYWxsX2RlYnVnIiwgaW5pdGNhbGxfZGVidWdfc2V0dXApOwogCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkX3JlYXBlciA9ICZpbml0X3Rhc2s7Ci0KIGV4dGVybiBpbml0Y2FsbF90IF9faW5pdGNhbGxfc3RhcnRbXSwgX19pbml0Y2FsbF9lbmRbXTsKIAogc3RhdGljIHZvaWQgX19pbml0IGRvX2luaXRjYWxscyh2b2lkKQpAQCAtNzE5LDcgKzczMSw3IEBACiAJICogYXNzdW1wdGlvbnMgYWJvdXQgd2hlcmUgaW4gdGhlIHRhc2sgYXJyYXkgdGhpcwogCSAqIGNhbiBiZSBmb3VuZC4KIAkgKi8KLQljaGlsZF9yZWFwZXIgPSBjdXJyZW50OworCWluaXRfcGlkX25zLmNoaWxkX3JlYXBlciA9IGN1cnJlbnQ7CiAKIAljYWRfcGlkID0gdGFza19waWQoY3VycmVudCk7CiAKQEAgLTczMiwxMiArNzQ0LDYgQEAKIAogCWNwdXNldF9pbml0X3NtcCgpOwogCi0JLyoKLQkgKiBEbyB0aGlzIGJlZm9yZSBpbml0Y2FsbHMsIGJlY2F1c2Ugc29tZSBkcml2ZXJzIHdhbnQgdG8gYWNjZXNzCi0JICogZmlybXdhcmUgZmlsZXMuCi0JICovCi0JcG9wdWxhdGVfcm9vdGZzKCk7Ci0KIAlkb19iYXNpY19zZXR1cCgpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2luaXQvdmVyc2lvbi5jIGIvaW5pdC92ZXJzaW9uLmMKaW5kZXggOGYyODM0NC4uOWQ5NmQzNiAxMDA2NDQKLS0tIGEvaW5pdC92ZXJzaW9uLmMKKysrIGIvaW5pdC92ZXJzaW9uLmMKQEAgLTMzLDcgKzMzLDMgQEAKIAl9LAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfdXRzX25zKTsKLQotY29uc3QgY2hhciBsaW51eF9iYW5uZXJbXSA9Ci0JIkxpbnV4IHZlcnNpb24gIiBVVFNfUkVMRUFTRSAiICgiIExJTlVYX0NPTVBJTEVfQlkgIkAiCi0JTElOVVhfQ09NUElMRV9IT1NUICIpICgiIExJTlVYX0NPTVBJTEVSICIpICIgVVRTX1ZFUlNJT04gIlxuIjsKZGlmZiAtLWdpdCBhL2lwYy9jb21wYXQuYyBiL2lwYy9jb21wYXQuYwppbmRleCA0ZDIwY2ZkLi5mYTE4MTQxIDEwMDY0NAotLS0gYS9pcGMvY29tcGF0LmMKKysrIGIvaXBjL2NvbXBhdC5jCkBAIC0xMTUsNyArMTE1LDYgQEAKIAogZXh0ZXJuIGludCBzZW1fY3Rsc1tdOwogI2RlZmluZSBzY19zZW1vcG0JKHNlbV9jdGxzWzJdKQotI2RlZmluZSBNQVhCVUYgKDY0KjEwMjQpCiAKIHN0YXRpYyBpbmxpbmUgaW50IGNvbXBhdF9pcGNfcGFyc2VfdmVyc2lvbihpbnQgKmNtZCkKIHsKQEAgLTMwNywzNSArMzA2LDMwIEBACiAKIGxvbmcgY29tcGF0X3N5c19tc2dzbmQoaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgdGhpcmQsIHZvaWQgX191c2VyICp1cHRyKQogewotCXN0cnVjdCBtc2didWYgX191c2VyICpwOwogCXN0cnVjdCBjb21wYXRfbXNnYnVmIF9fdXNlciAqdXAgPSB1cHRyOwogCWxvbmcgdHlwZTsKIAogCWlmIChmaXJzdCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChzZWNvbmQgPCAwIHx8IChzZWNvbmQgPj0gTUFYQlVGIC0gc2l6ZW9mKHN0cnVjdCBtc2didWYpKSkKKwlpZiAoc2Vjb25kIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2Vjb25kICsgc2l6ZW9mKHN0cnVjdCBtc2didWYpKTsKLQlpZiAoZ2V0X3VzZXIodHlwZSwgJnVwLT5tdHlwZSkgfHwKLQkgICAgcHV0X3VzZXIodHlwZSwgJnAtPm10eXBlKSB8fAotCSAgICBjb3B5X2luX3VzZXIocC0+bXRleHQsIHVwLT5tdGV4dCwgc2Vjb25kKSkKKwlpZiAoZ2V0X3VzZXIodHlwZSwgJnVwLT5tdHlwZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIHN5c19tc2dzbmQoZmlyc3QsIHAsIHNlY29uZCwgdGhpcmQpOworCXJldHVybiBkb19tc2dzbmQoZmlyc3QsIHR5cGUsIHVwLT5tdGV4dCwgc2Vjb25kLCB0aGlyZCk7CiB9CiAKIGxvbmcgY29tcGF0X3N5c19tc2dyY3YoaW50IGZpcnN0LCBpbnQgc2Vjb25kLCBpbnQgbXNndHlwLCBpbnQgdGhpcmQsCiAJCQkgICBpbnQgdmVyc2lvbiwgdm9pZCBfX3VzZXIgKnVwdHIpCiB7Ci0Jc3RydWN0IG1zZ2J1ZiBfX3VzZXIgKnA7CiAJc3RydWN0IGNvbXBhdF9tc2didWYgX191c2VyICp1cDsKIAlsb25nIHR5cGU7CiAJaW50IGVycjsKIAogCWlmIChmaXJzdCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChzZWNvbmQgPCAwIHx8IChzZWNvbmQgPj0gTUFYQlVGIC0gc2l6ZW9mKHN0cnVjdCBtc2didWYpKSkKKwlpZiAoc2Vjb25kIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXZlcnNpb24pIHsKQEAgLTM0OSwxNCArMzQzLDExIEBACiAJCXVwdHIgPSBjb21wYXRfcHRyKGlwY2subXNncCk7CiAJCW1zZ3R5cCA9IGlwY2subXNndHlwOwogCX0KLQlwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2Vjb25kICsgc2l6ZW9mKHN0cnVjdCBtc2didWYpKTsKLQllcnIgPSBzeXNfbXNncmN2KGZpcnN0LCBwLCBzZWNvbmQsIG1zZ3R5cCwgdGhpcmQpOworCXVwID0gdXB0cjsKKwllcnIgPSBkb19tc2dyY3YoZmlyc3QsICZ0eXBlLCB1cC0+bXRleHQsIHNlY29uZCwgbXNndHlwLCB0aGlyZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0OwotCXVwID0gdXB0cjsKLQlpZiAoZ2V0X3VzZXIodHlwZSwgJnAtPm10eXBlKSB8fAotCSAgICBwdXRfdXNlcih0eXBlLCAmdXAtPm10eXBlKSB8fAotCSAgICBjb3B5X2luX3VzZXIodXAtPm10ZXh0LCBwLT5tdGV4dCwgZXJyKSkKKwlpZiAocHV0X3VzZXIodHlwZSwgJnVwLT5tdHlwZSkpCiAJCWVyciA9IC1FRkFVTFQ7CiBvdXQ6CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2lwYy9tcXVldWUuYyBiL2lwYy9tcXVldWUuYwppbmRleCA3YzI3NDAwLi4wMjcxN2Y3IDEwMDY0NAotLS0gYS9pcGMvbXF1ZXVlLmMKKysrIGIvaXBjL21xdWV1ZS5jCkBAIC05MCw3ICs5MCw3IEBACiBzdGF0aWMgdm9pZCByZW1vdmVfbm90aWZpY2F0aW9uKHN0cnVjdCBtcXVldWVfaW5vZGVfaW5mbyAqaW5mbyk7CiAKIHN0YXRpYyBzcGlubG9ja190IG1xX2xvY2s7Ci1zdGF0aWMga21lbV9jYWNoZV90ICptcXVldWVfaW5vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptcXVldWVfaW5vZGVfY2FjaGVwOwogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqbXF1ZXVlX21udDsKIAogc3RhdGljIHVuc2lnbmVkIGludCBxdWV1ZXNfY291bnQ7CkBAIC0yMTEsNyArMjExLDcgQEAKIAlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgbXF1ZXVlX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIHN0cnVjdCBrbWVtX2NhY2hlICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBtcXVldWVfaW5vZGVfaW5mbyAqcCA9IChzdHJ1Y3QgbXF1ZXVlX2lub2RlX2luZm8gKikgZm9vOwogCkBAIC0yMjQsNyArMjI0LDcgQEAKIHsKIAlzdHJ1Y3QgbXF1ZXVlX2lub2RlX2luZm8gKmVpOwogCi0JZWkgPSBrbWVtX2NhY2hlX2FsbG9jKG1xdWV1ZV9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MobXF1ZXVlX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlaSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwpAQCAtMzIyLDcgKzMyMiw3IEBACiBzdGF0aWMgc3NpemVfdCBtcXVldWVfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdV9kYXRhLAogCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogb2ZmKQogewotCXN0cnVjdCBtcXVldWVfaW5vZGVfaW5mbyAqaW5mbyA9IE1RVUVVRV9JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgbXF1ZXVlX2lub2RlX2luZm8gKmluZm8gPSBNUVVFVUVfSShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAljaGFyIGJ1ZmZlcltGSUxFTlRfU0laRV07CiAJc2l6ZV90IHNsZW47CiAJbG9mZl90IG87CkBAIC0zNTQsMTMgKzM1NCwxMyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCSpvZmYgPSBvICsgY291bnQ7Ci0JZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfYXRpbWUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBpbnQgbXF1ZXVlX2ZsdXNoX2ZpbGUoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiB7Ci0Jc3RydWN0IG1xdWV1ZV9pbm9kZV9pbmZvICppbmZvID0gTVFVRVVFX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBtcXVldWVfaW5vZGVfaW5mbyAqaW5mbyA9IE1RVUVVRV9JKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCiAJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKIAlpZiAodGFza190Z2lkKGN1cnJlbnQpID09IGluZm8tPm5vdGlmeV9vd25lcikKQEAgLTM3Miw3ICszNzIsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1xdWV1ZV9wb2xsX2ZpbGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcG9sbF90YWIpCiB7Ci0Jc3RydWN0IG1xdWV1ZV9pbm9kZV9pbmZvICppbmZvID0gTVFVRVVFX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBtcXVldWVfaW5vZGVfaW5mbyAqaW5mbyA9IE1RVUVVRV9JKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWludCByZXR2YWwgPSAwOwogCiAJcG9sbF93YWl0KGZpbHAsICZpbmZvLT53YWl0X3EsIHBvbGxfdGFiKTsKQEAgLTgzNiw3ICs4MzYsNyBAQAogCWlmICh1bmxpa2VseSghZmlscCkpCiAJCWdvdG8gb3V0OwogCi0JaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKHVubGlrZWx5KGZpbHAtPmZfb3AgIT0gJm1xdWV1ZV9maWxlX29wZXJhdGlvbnMpKQogCQlnb3RvIG91dF9mcHV0OwogCWluZm8gPSBNUVVFVUVfSShpbm9kZSk7CkBAIC05MTksNyArOTE5LDcgQEAKIAlpZiAodW5saWtlbHkoIWZpbHApKQogCQlnb3RvIG91dDsKIAotCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWlmICh1bmxpa2VseShmaWxwLT5mX29wICE9ICZtcXVldWVfZmlsZV9vcGVyYXRpb25zKSkKIAkJZ290byBvdXRfZnB1dDsKIAlpbmZvID0gTVFVRVVFX0koaW5vZGUpOwpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKIAlpZiAoIWZpbHApCiAJCWdvdG8gb3V0OwogCi0JaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKHVubGlrZWx5KGZpbHAtPmZfb3AgIT0gJm1xdWV1ZV9maWxlX29wZXJhdGlvbnMpKQogCQlnb3RvIG91dF9mcHV0OwogCWluZm8gPSBNUVVFVUVfSShpbm9kZSk7CkBAIC0xMTI2LDcgKzExMjYsNyBAQAogCWlmICghZmlscCkKIAkJZ290byBvdXQ7CiAKLQlpbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAodW5saWtlbHkoZmlscC0+Zl9vcCAhPSAmbXF1ZXVlX2ZpbGVfb3BlcmF0aW9ucykpCiAJCWdvdG8gb3V0X2ZwdXQ7CiAJaW5mbyA9IE1RVUVVRV9JKGlub2RlKTsKZGlmZiAtLWdpdCBhL2lwYy9tc2cuYyBiL2lwYy9tc2cuYwppbmRleCA1YjIxM2Q5Li5hMzg4ODI0IDEwMDY0NAotLS0gYS9pcGMvbXNnLmMKKysrIGIvaXBjL21zZy5jCkBAIC01Miw3ICs1Miw3IEBACiAJbG9uZwkJCXJfbXNndHlwZTsKIAlsb25nCQkJcl9tYXhzaXplOwogCi0Jdm9sYXRpbGUgc3RydWN0IG1zZ19tc2cJKnJfbXNnOworCXN0cnVjdCBtc2dfbXNnCQkqdm9sYXRpbGUgcl9tc2c7CiB9OwogCiAvKiBvbmUgbXNnX3NlbmRlciBmb3IgZWFjaCBzbGVlcGluZyBzZW5kZXIgKi8KQEAgLTEyNCw2ICsxMjQsNyBAQAogCX0KIAltdXRleF91bmxvY2soJm1zZ19pZHMobnMpLm11dGV4KTsKIAorCWlwY19maW5pX2lkcyhucy0+aWRzW0lQQ19NU0dfSURTXSk7CiAJa2ZyZWUobnMtPmlkc1tJUENfTVNHX0lEU10pOwogCW5zLT5pZHNbSVBDX01TR19JRFNdID0gTlVMTDsKIH0KQEAgLTYyNSwxMiArNjI2LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX21zZ3NuZChpbnQgbXNxaWQsIHN0cnVjdCBtc2didWYgX191c2VyICptc2dwLCBzaXplX3QgbXNnc3osIGludCBtc2dmbGcpCitsb25nIGRvX21zZ3NuZChpbnQgbXNxaWQsIGxvbmcgbXR5cGUsIHZvaWQgX191c2VyICptdGV4dCwKKwkJc2l6ZV90IG1zZ3N6LCBpbnQgbXNnZmxnKQogewogCXN0cnVjdCBtc2dfcXVldWUgKm1zcTsKIAlzdHJ1Y3QgbXNnX21zZyAqbXNnOwotCWxvbmcgbXR5cGU7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnM7CiAKQEAgLTYzOCwxMiArNjM4LDEwIEBACiAKIAlpZiAobXNnc3ogPiBucy0+bXNnX2N0bG1heCB8fCAobG9uZykgbXNnc3ogPCAwIHx8IG1zcWlkIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGdldF91c2VyKG10eXBlLCAmbXNncC0+bXR5cGUpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAobXR5cGUgPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1zZyA9IGxvYWRfbXNnKG1zZ3AtPm10ZXh0LCBtc2dzeik7CisJbXNnID0gbG9hZF9tc2cobXRleHQsIG1zZ3N6KTsKIAlpZiAoSVNfRVJSKG1zZykpCiAJCXJldHVybiBQVFJfRVJSKG1zZyk7CiAKQEAgLTcyMiw2ICs3MjAsMTYgQEAKIAlyZXR1cm4gZXJyOwogfQogCithc21saW5rYWdlIGxvbmcKK3N5c19tc2dzbmQoaW50IG1zcWlkLCBzdHJ1Y3QgbXNnYnVmIF9fdXNlciAqbXNncCwgc2l6ZV90IG1zZ3N6LCBpbnQgbXNnZmxnKQoreworCWxvbmcgbXR5cGU7CisKKwlpZiAoZ2V0X3VzZXIobXR5cGUsICZtc2dwLT5tdHlwZSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBkb19tc2dzbmQobXNxaWQsIG10eXBlLCBtc2dwLT5tdGV4dCwgbXNnc3osIG1zZ2ZsZyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGNvbnZlcnRfbW9kZShsb25nICptc2d0eXAsIGludCBtc2dmbGcpCiB7CiAJLyoKQEAgLTc0MSw4ICs3NDksOCBAQAogCXJldHVybiBTRUFSQ0hfRVFVQUw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbXNncmN2KGludCBtc3FpZCwgc3RydWN0IG1zZ2J1ZiBfX3VzZXIgKm1zZ3AsIHNpemVfdCBtc2dzeiwKLQkJCSAgIGxvbmcgbXNndHlwLCBpbnQgbXNnZmxnKQorbG9uZyBkb19tc2dyY3YoaW50IG1zcWlkLCBsb25nICpwbXR5cGUsIHZvaWQgX191c2VyICptdGV4dCwKKwkJc2l6ZV90IG1zZ3N6LCBsb25nIG1zZ3R5cCwgaW50IG1zZ2ZsZykKIHsKIAlzdHJ1Y3QgbXNnX3F1ZXVlICptc3E7CiAJc3RydWN0IG1zZ19tc2cgKm1zZzsKQEAgLTg4OCwxNSArODk2LDMwIEBACiAJCXJldHVybiBQVFJfRVJSKG1zZyk7CiAKIAltc2dzeiA9IChtc2dzeiA+IG1zZy0+bV90cykgPyBtc2ctPm1fdHMgOiBtc2dzejsKLQlpZiAocHV0X3VzZXIgKG1zZy0+bV90eXBlLCAmbXNncC0+bXR5cGUpIHx8Ci0JICAgIHN0b3JlX21zZyhtc2dwLT5tdGV4dCwgbXNnLCBtc2dzeikpIHsKKwkqcG10eXBlID0gbXNnLT5tX3R5cGU7CisJaWYgKHN0b3JlX21zZyhtdGV4dCwgbXNnLCBtc2dzeikpCiAJCW1zZ3N6ID0gLUVGQVVMVDsKLQl9CisKIAlmcmVlX21zZyhtc2cpOwogCiAJcmV0dXJuIG1zZ3N6OwogfQogCithc21saW5rYWdlIGxvbmcgc3lzX21zZ3JjdihpbnQgbXNxaWQsIHN0cnVjdCBtc2didWYgX191c2VyICptc2dwLCBzaXplX3QgbXNnc3osCisJCQkgICBsb25nIG1zZ3R5cCwgaW50IG1zZ2ZsZykKK3sKKwlsb25nIGVyciwgbXR5cGU7CisKKwllcnIgPSAgZG9fbXNncmN2KG1zcWlkLCAmbXR5cGUsIG1zZ3AtPm10ZXh0LCBtc2dzeiwgbXNndHlwLCBtc2dmbGcpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChwdXRfdXNlcihtdHlwZSwgJm1zZ3AtPm10eXBlKSkKKwkJZXJyID0gLUVGQVVMVDsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyBpbnQgc3lzdmlwY19tc2dfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpCiB7CmRpZmYgLS1naXQgYS9pcGMvbXNndXRpbC5jIGIvaXBjL21zZ3V0aWwuYwppbmRleCAwOTkyNjE2Li5jODJjMjE1IDEwMDY0NAotLS0gYS9pcGMvbXNndXRpbC5jCisrKyBiL2lwYy9tc2d1dGlsLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAlpZiAoYWxlbiA+IERBVEFMRU5fTVNHKQogCQlhbGVuID0gREFUQUxFTl9NU0c7CiAKLQltc2cgPSAoc3RydWN0IG1zZ19tc2cgKilrbWFsbG9jKHNpemVvZigqbXNnKSArIGFsZW4sIEdGUF9LRVJORUwpOworCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpICsgYWxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1zZyA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIApAQCAtNTYsNyArNTYsNyBAQAogCQlhbGVuID0gbGVuOwogCQlpZiAoYWxlbiA+IERBVEFMRU5fU0VHKQogCQkJYWxlbiA9IERBVEFMRU5fU0VHOwotCQlzZWcgPSAoc3RydWN0IG1zZ19tc2dzZWcgKilrbWFsbG9jKHNpemVvZigqc2VnKSArIGFsZW4sCisJCXNlZyA9IGttYWxsb2Moc2l6ZW9mKCpzZWcpICsgYWxlbiwKIAkJCQkJCSBHRlBfS0VSTkVMKTsKIAkJaWYgKHNlZyA9PSBOVUxMKSB7CiAJCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IDBkYWZjYzQuLmQzZTEyZWYgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTE2MSw2ICsxNjEsNyBAQAogCX0KIAltdXRleF91bmxvY2soJnNlbV9pZHMobnMpLm11dGV4KTsKIAorCWlwY19maW5pX2lkcyhucy0+aWRzW0lQQ19TRU1fSURTXSk7CiAJa2ZyZWUobnMtPmlkc1tJUENfU0VNX0lEU10pOwogCW5zLT5pZHNbSVBDX1NFTV9JRFNdID0gTlVMTDsKIH0KQEAgLTEwNjksMTQgKzEwNzAsMTMgQEAKIAlpcGNfcmN1X2dldHJlZihzbWEpOwogCXNlbV91bmxvY2soc21hKTsKIAotCW5ldyA9IChzdHJ1Y3Qgc2VtX3VuZG8gKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlbV91bmRvKSArIHNpemVvZihzaG9ydCkqbnNlbXMsIEdGUF9LRVJORUwpOworCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZW1fdW5kbykgKyBzaXplb2Yoc2hvcnQpKm5zZW1zLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ldykgewogCQlpcGNfbG9ja19ieV9wdHIoJnNtYS0+c2VtX3Blcm0pOwogCQlpcGNfcmN1X3B1dHJlZihzbWEpOwogCQlzZW1fdW5sb2NrKHNtYSk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KLQltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHNlbV91bmRvKSArIHNpemVvZihzaG9ydCkqbnNlbXMpOwogCW5ldy0+c2VtYWRqID0gKHNob3J0ICopICZuZXdbMV07CiAJbmV3LT5zZW1pZCA9IHNlbWlkOwogCmRpZmYgLS1naXQgYS9pcGMvc2htLmMgYi9pcGMvc2htLmMKaW5kZXggYmZiZDMxNy4uNmQxNmJiNiAxMDA2NDQKLS0tIGEvaXBjL3NobS5jCisrKyBiL2lwYy9zaG0uYwpAQCAtMTE2LDYgKzExNiw3IEBACiAJfQogCW11dGV4X3VubG9jaygmc2htX2lkcyhucykubXV0ZXgpOwogCisJaXBjX2ZpbmlfaWRzKG5zLT5pZHNbSVBDX1NITV9JRFNdKTsKIAlrZnJlZShucy0+aWRzW0lQQ19TSE1fSURTXSk7CiAJbnMtPmlkc1tJUENfU0hNX0lEU10gPSBOVUxMOwogfQpAQCAtMTY3LDcgKzE2OCw3IEBACiBzdGF0aWMgdm9pZCBzaG1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNobWQpCiB7CiAJc2htX2luYyhzaG1fZmlsZV9ucyhzaG1kLT52bV9maWxlKSwKLQkJCXNobWQtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CisJCQlzaG1kLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CiB9CiAKIC8qCkBAIC0xODYsNyArMTg3LDcgQEAKIAlpZiAoIWlzX2ZpbGVfaHVnZXBhZ2VzKHNocC0+c2htX2ZpbGUpKQogCQlzaG1lbV9sb2NrKHNocC0+c2htX2ZpbGUsIDAsIHNocC0+bWxvY2tfdXNlcik7CiAJZWxzZQotCQl1c2VyX3NobV91bmxvY2soc2hwLT5zaG1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSwKKwkJdXNlcl9zaG1fdW5sb2NrKHNocC0+c2htX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSwKIAkJCQkJCXNocC0+bWxvY2tfdXNlcik7CiAJZnB1dCAoc2hwLT5zaG1fZmlsZSk7CiAJc2VjdXJpdHlfc2htX2ZyZWUoc2hwKTsKQEAgLTIwMiw3ICsyMDMsNyBAQAogc3RhdGljIHZvaWQgc2htX2Nsb3NlIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnNobWQpCiB7CiAJc3RydWN0IGZpbGUgKiBmaWxlID0gc2htZC0+dm1fZmlsZTsKLQlpbnQgaWQgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CisJaW50IGlkID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CiAJc3RydWN0IHNobWlkX2tlcm5lbCAqc2hwOwogCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpuczsKIApAQCAtMjMyLDcgKzIzMyw3IEBACiAJCXZtYS0+dm1fb3BzID0gJnNobV92bV9vcHM7CiAJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCiAJCQl2bWEtPnZtX2ZsYWdzICY9IH5WTV9NQVlXUklURTsKLQkJc2htX2luYyhzaG1fZmlsZV9ucyhmaWxlKSwgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwkJc2htX2luYyhzaG1fZmlsZV9ucyhmaWxlKSwgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0zMjksNyArMzMwLDcgQEAKIAlzaHAtPnNobV9uYXR0Y2ggPSAwOwogCXNocC0+aWQgPSBzaG1fYnVpbGRpZChucywgaWQsIHNocC0+c2htX3Blcm0uc2VxKTsKIAlzaHAtPnNobV9maWxlID0gZmlsZTsKLQlmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8gPSBzaHAtPmlkOworCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vID0gc2hwLT5pZDsKIAogCXNobV9maWxlX25zKGZpbGUpID0gZ2V0X2lwY19ucyhucyk7CiAKQEAgLTQ5NCw3ICs0OTUsNyBAQAogCQlpZighc2hwKQogCQkJY29udGludWU7CiAKLQkJaW5vZGUgPSBzaHAtPnNobV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaW5vZGUgPSBzaHAtPnNobV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJCWlmIChpc19maWxlX2h1Z2VwYWdlcyhzaHAtPnNobV9maWxlKSkgewogCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwpAQCAtODQyLDcgKzg0Myw3IEBACiAJfQogCQkKIAlmaWxlID0gc2hwLT5zaG1fZmlsZTsKLQlzaXplID0gaV9zaXplX3JlYWQoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXNpemUgPSBpX3NpemVfcmVhZChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzaHAtPnNobV9uYXR0Y2grKzsKIAlzaG1fdW5sb2NrKHNocCk7CiAKQEAgLTk0Nyw3ICs5NDgsNyBAQAogCQkJKHZtYS0+dm1fc3RhcnQgLSBhZGRyKS9QQUdFX1NJWkUgPT0gdm1hLT52bV9wZ29mZikgewogCiAKLQkJCXNpemUgPSB2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7CisJCQlzaXplID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7CiAJCQlkb19tdW5tYXAobW0sIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CiAJCQkvKgogCQkJICogV2UgZGlzY292ZXJlZCB0aGUgc2l6ZSBvZiB0aGUgc2htIHNlZ21lbnQsIHNvCmRpZmYgLS1naXQgYS9pcGMvdXRpbC5jIGIvaXBjL3V0aWwuYwppbmRleCA0MjQ3OWU0Li5hOWI3YTIyIDEwMDY0NAotLS0gYS9pcGMvdXRpbC5jCisrKyBiL2lwYy91dGlsLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogCSAqLwogCXJjdV9hc3NpZ25fcG9pbnRlcihpZHMtPmVudHJpZXMsIG5ldyk7CiAKLQlpcGNfcmN1X3B1dHJlZihvbGQpOworCV9faXBjX2ZpbmlfaWRzKGlkcywgb2xkKTsKIAlyZXR1cm4gbmV3c2l6ZTsKIH0KIApAQCAtNTE0LDYgKzUxNCwxMSBAQAogCWNvbnRhaW5lcl9vZihwdHIsIHN0cnVjdCBpcGNfcmN1X2hkciwgZGF0YSktPnJlZmNvdW50Kys7CiB9CiAKK3N0YXRpYyB2b2lkIGlwY19kb192ZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdmZyZWUoY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcGNfcmN1X3NjaGVkLCB3b3JrKSk7Cit9CisKIC8qKgogICogaXBjX3NjaGVkdWxlX2ZyZWUgLSBmcmVlIGlwYyArIHJjdSBzcGFjZQogICogQGhlYWQ6IFJDVSBjYWxsYmFjayBzdHJ1Y3R1cmUgZm9yIHF1ZXVlZCB3b3JrCkBAIC01MjgsNyArNTMzLDcgQEAKIAlzdHJ1Y3QgaXBjX3JjdV9zY2hlZCAqc2NoZWQgPQogCQkJY29udGFpbmVyX29mKCYoZ3JhY2UtPmRhdGFbMF0pLCBzdHJ1Y3QgaXBjX3JjdV9zY2hlZCwgZGF0YVswXSk7CiAKLQlJTklUX1dPUksoJnNjaGVkLT53b3JrLCB2ZnJlZSwgc2NoZWQpOworCUlOSVRfV09SSygmc2NoZWQtPndvcmssIGlwY19kb192ZnJlZSk7CiAJc2NoZWR1bGVfd29yaygmc2NoZWQtPndvcmspOwogfQogCmRpZmYgLS1naXQgYS9pcGMvdXRpbC5oIGIvaXBjL3V0aWwuaAppbmRleCBjOGZkNmI5Li5lM2FhMmM1IDEwMDY0NAotLS0gYS9pcGMvdXRpbC5oCisrKyBiL2lwYy91dGlsLmgKQEAgLTgzLDYgKzgzLDE4IEBACiB2b2lkIGlwY19yY3VfZ2V0cmVmKHZvaWQgKnB0cik7CiB2b2lkIGlwY19yY3VfcHV0cmVmKHZvaWQgKnB0cik7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lwY19maW5pX2lkcyhzdHJ1Y3QgaXBjX2lkcyAqaWRzLAorCQlzdHJ1Y3QgaXBjX2lkX2FyeSAqZW50cmllcykKK3sKKwlpZiAoZW50cmllcyAhPSAmaWRzLT5udWxsZW50cnkpCisJCWlwY19yY3VfcHV0cmVmKGVudHJpZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXBjX2ZpbmlfaWRzKHN0cnVjdCBpcGNfaWRzICppZHMpCit7CisJX19pcGNfZmluaV9pZHMoaWRzLCBpZHMtPmVudHJpZXMpOworfQorCiBzdHJ1Y3Qga2Vybl9pcGNfcGVybSogaXBjX2dldChzdHJ1Y3QgaXBjX2lkcyogaWRzLCBpbnQgaWQpOwogc3RydWN0IGtlcm5faXBjX3Blcm0qIGlwY19sb2NrKHN0cnVjdCBpcGNfaWRzKiBpZHMsIGludCBpZCk7CiB2b2lkIGlwY19sb2NrX2J5X3B0cihzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjcCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvS2NvbmZpZy5oeiBiL2tlcm5lbC9LY29uZmlnLmh6CmluZGV4IDI0OGUxYzMuLjRhZjE1ODAyIDEwMDY0NAotLS0gYS9rZXJuZWwvS2NvbmZpZy5oegorKysgYi9rZXJuZWwvS2NvbmZpZy5oegpAQCAtNyw3ICs3LDcgQEAKIAlkZWZhdWx0IEhaXzI1MAogCWhlbHAKIAkgQWxsb3dzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0aW1lciBmcmVxdWVuY3kuIEl0IGlzIGN1c3RvbWFyeQotCSB0byBoYXZlIHRoZSB0aW1lciBpbnRlcnJ1cHQgcnVuIGF0IDEwMDAgSFogYnV0IDEwMCBIWiBtYXkgYmUgbW9yZQorCSB0byBoYXZlIHRoZSB0aW1lciBpbnRlcnJ1cHQgcnVuIGF0IDEwMDAgSHogYnV0IDEwMCBIeiBtYXkgYmUgbW9yZQogCSBiZW5lZmljaWFsIGZvciBzZXJ2ZXJzIGFuZCBOVU1BIHN5c3RlbXMgdGhhdCBkbyBub3QgbmVlZCB0byBoYXZlCiAJIGEgZmFzdCByZXNwb25zZSBmb3IgdXNlciBpbnRlcmFjdGlvbiBhbmQgdGhhdCBtYXkgZXhwZXJpZW5jZSBidXMKIAkgY29udGVudGlvbiBhbmQgY2FjaGVsaW5lIGJvdW5jZXMgYXMgYSByZXN1bHQgb2YgdGltZXIgaW50ZXJydXB0cy4KQEAgLTE5LDIxICsxOSwzMCBAQAogCWNvbmZpZyBIWl8xMDAKIAkJYm9vbCAiMTAwIEhaIgogCWhlbHAKLQkgIDEwMCBIWiBpcyBhIHR5cGljYWwgY2hvaWNlIGZvciBzZXJ2ZXJzLCBTTVAgYW5kIE5VTUEgc3lzdGVtcworCSAgMTAwIEh6IGlzIGEgdHlwaWNhbCBjaG9pY2UgZm9yIHNlcnZlcnMsIFNNUCBhbmQgTlVNQSBzeXN0ZW1zCiAJICB3aXRoIGxvdHMgb2YgcHJvY2Vzc29ycyB0aGF0IG1heSBzaG93IHJlZHVjZWQgcGVyZm9ybWFuY2UgaWYKIAkgIHRvbyBtYW55IHRpbWVyIGludGVycnVwdHMgYXJlIG9jY3VycmluZy4KIAogCWNvbmZpZyBIWl8yNTAKIAkJYm9vbCAiMjUwIEhaIgogCWhlbHAKLQkgMjUwIEhaIGlzIGEgZ29vZCBjb21wcm9taXNlIGNob2ljZSBhbGxvd2luZyBzZXJ2ZXIgcGVyZm9ybWFuY2UKKwkgMjUwIEh6IGlzIGEgZ29vZCBjb21wcm9taXNlIGNob2ljZSBhbGxvd2luZyBzZXJ2ZXIgcGVyZm9ybWFuY2UKIAkgd2hpbGUgYWxzbyBzaG93aW5nIGdvb2QgaW50ZXJhY3RpdmUgcmVzcG9uc2l2ZW5lc3MgZXZlbgotCSBvbiBTTVAgYW5kIE5VTUEgc3lzdGVtcy4KKwkgb24gU01QIGFuZCBOVU1BIHN5c3RlbXMuIElmIHlvdSBhcmUgZ29pbmcgdG8gYmUgdXNpbmcgTlRTQyB2aWRlbworCSBvciBtdWx0aW1lZGlhLCBzZWxlY3RlZCAzMDBIeiBpbnN0ZWFkLgorCisJY29uZmlnIEhaXzMwMAorCQlib29sICIzMDAgSFoiCisJaGVscAorCSAzMDAgSHogaXMgYSBnb29kIGNvbXByb21pc2UgY2hvaWNlIGFsbG93aW5nIHNlcnZlciBwZXJmb3JtYW5jZQorCSB3aGlsZSBhbHNvIHNob3dpbmcgZ29vZCBpbnRlcmFjdGl2ZSByZXNwb25zaXZlbmVzcyBldmVuCisJIG9uIFNNUCBhbmQgTlVNQSBzeXN0ZW1zIGFuZCBleGFjdGx5IGRpdmlkaW5nIGJ5IGJvdGggUEFMIGFuZAorCSBOVFNDIGZyYW1lIHJhdGVzIGZvciB2aWRlbyBhbmQgbXVsdGltZWRpYSB3b3JrLgogCiAJY29uZmlnIEhaXzEwMDAKIAkJYm9vbCAiMTAwMCBIWiIKIAloZWxwCi0JIDEwMDAgSFogaXMgdGhlIHByZWZlcnJlZCBjaG9pY2UgZm9yIGRlc2t0b3Agc3lzdGVtcyBhbmQgb3RoZXIKKwkgMTAwMCBIeiBpcyB0aGUgcHJlZmVycmVkIGNob2ljZSBmb3IgZGVza3RvcCBzeXN0ZW1zIGFuZCBvdGhlcgogCSBzeXN0ZW1zIHJlcXVpcmluZyBmYXN0IGludGVyYWN0aXZlIHJlc3BvbnNlcyB0byBldmVudHMuCiAKIGVuZGNob2ljZQpAQCAtNDIsNSArNTEsNiBAQAogCWludAogCWRlZmF1bHQgMTAwIGlmIEhaXzEwMAogCWRlZmF1bHQgMjUwIGlmIEhaXzI1MAorCWRlZmF1bHQgMzAwIGlmIEhaXzMwMAogCWRlZmF1bHQgMTAwMCBpZiBIWl8xMDAwCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9hY2N0LmMgYi9rZXJuZWwvYWNjdC5jCmluZGV4IDBhYWQ1Y2EuLjcwZDBkODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hY2N0LmMKKysrIGIva2VybmVsL2FjY3QuYwpAQCAtODksNyArODksOCBAQAogCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwogfTsKIAotc3RhdGljIHN0cnVjdCBhY2N0X2dsYnMgYWNjdF9nbG9iYWxzIF9fY2FjaGVsaW5lX2FsaWduZWQgPSB7U1BJTl9MT0NLX1VOTE9DS0VEfTsKK3N0YXRpYyBzdHJ1Y3QgYWNjdF9nbGJzIGFjY3RfZ2xvYmFscyBfX2NhY2hlbGluZV9hbGlnbmVkID0KKwl7X19TUElOX0xPQ0tfVU5MT0NLRUQoYWNjdF9nbG9iYWxzLmxvY2spfTsKIAogLyoKICAqIENhbGxlZCB3aGVuZXZlciB0aGUgdGltZXIgc2F5cyB0byBjaGVjayB0aGUgZnJlZSBzcGFjZS4KQEAgLTExNyw3ICsxMTgsNyBAQAogCXNwaW5fdW5sb2NrKCZhY2N0X2dsb2JhbHMubG9jayk7CiAKIAkvKiBNYXkgYmxvY2sgKi8KLQlpZiAodmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeSwgJnNidWYpKQorCWlmICh2ZnNfc3RhdGZzKGZpbGUtPmZfcGF0aC5kZW50cnksICZzYnVmKSkKIAkJcmV0dXJuIHJlczsKIAlzdXNwZW5kID0gc2J1Zi5mX2Jsb2NrcyAqIFNVU1BFTkQ7CiAJcmVzdW1lID0gc2J1Zi5mX2Jsb2NrcyAqIFJFU1VNRTsKQEAgLTE5Myw3ICsxOTQsNyBAQAogCQlhZGRfdGltZXIoJmFjY3RfZ2xvYmFscy50aW1lcik7CiAJfQogCWlmIChvbGRfYWNjdCkgewotCQltbnRfdW5waW4ob2xkX2FjY3QtPmZfdmZzbW50KTsKKwkJbW50X3VucGluKG9sZF9hY2N0LT5mX3BhdGgubW50KTsKIAkJc3Bpbl91bmxvY2soJmFjY3RfZ2xvYmFscy5sb2NrKTsKIAkJZG9fYWNjdF9wcm9jZXNzKG9sZF9hY2N0KTsKIAkJZmlscF9jbG9zZShvbGRfYWNjdCwgTlVMTCk7CkBAIC0yMTEsNyArMjEyLDcgQEAKIAlpZiAoSVNfRVJSKGZpbGUpKQogCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKIAotCWlmICghU19JU1JFRyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCWlmICghU19JU1JFRyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CiAJCWZpbHBfY2xvc2UoZmlsZSwgTlVMTCk7CiAJCXJldHVybiAtRUFDQ0VTOwogCX0KQEAgLTIyOCwxMSArMjI5LDExIEBACiAJfQogCiAJc3Bpbl9sb2NrKCZhY2N0X2dsb2JhbHMubG9jayk7Ci0JbW50X3BpbihmaWxlLT5mX3Zmc21udCk7CisJbW50X3BpbihmaWxlLT5mX3BhdGgubW50KTsKIAlhY2N0X2ZpbGVfcmVvcGVuKGZpbGUpOwogCXNwaW5fdW5sb2NrKCZhY2N0X2dsb2JhbHMubG9jayk7CiAKLQltbnRwdXQoZmlsZS0+Zl92ZnNtbnQpOwkvKiBpdCdzIHBpbm5lZCwgbm93IGdpdmUgdXAgYWN0aXZlIHJlZmVyZW5jZSAqLworCW1udHB1dChmaWxlLT5mX3BhdGgubW50KTsgLyogaXQncyBwaW5uZWQsIG5vdyBnaXZlIHVwIGFjdGl2ZSByZWZlcmVuY2UgKi8KIAogCXJldHVybiAwOwogfQpAQCAtMjgyLDcgKzI4Myw3IEBACiB2b2lkIGFjY3RfYXV0b19jbG9zZV9tbnQoc3RydWN0IHZmc21vdW50ICptKQogewogCXNwaW5fbG9jaygmYWNjdF9nbG9iYWxzLmxvY2spOwotCWlmIChhY2N0X2dsb2JhbHMuZmlsZSAmJiBhY2N0X2dsb2JhbHMuZmlsZS0+Zl92ZnNtbnQgPT0gbSkKKwlpZiAoYWNjdF9nbG9iYWxzLmZpbGUgJiYgYWNjdF9nbG9iYWxzLmZpbGUtPmZfcGF0aC5tbnQgPT0gbSkKIAkJYWNjdF9maWxlX3Jlb3BlbihOVUxMKTsKIAlzcGluX3VubG9jaygmYWNjdF9nbG9iYWxzLmxvY2spOwogfQpAQCAtMjk4LDcgKzI5OSw3IEBACiB7CiAJc3Bpbl9sb2NrKCZhY2N0X2dsb2JhbHMubG9jayk7CiAJaWYgKGFjY3RfZ2xvYmFscy5maWxlICYmCi0JICAgIGFjY3RfZ2xvYmFscy5maWxlLT5mX3Zmc21udC0+bW50X3NiID09IHNiKSB7CisJICAgIGFjY3RfZ2xvYmFscy5maWxlLT5mX3BhdGgubW50LT5tbnRfc2IgPT0gc2IpIHsKIAkJYWNjdF9maWxlX3Jlb3BlbihOVUxMKTsKIAl9CiAJc3Bpbl91bmxvY2soJmFjY3RfZ2xvYmFscy5sb2NrKTsKQEAgLTQyNyw2ICs0MjgsNyBAQAogCXU2NCBlbGFwc2VkOwogCXU2NCBydW5fdGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMgdXB0aW1lOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAkvKgogCSAqIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBlbm91Z2ggZnJlZV9zcGFjZSB0byBjb250aW51ZQpAQCAtNDgzLDE2ICs0ODUsOSBAQAogCWFjLmFjX3BwaWQgPSBjdXJyZW50LT5wYXJlbnQtPnRnaWQ7CiAjZW5kaWYKIAotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JLyogRklYTUU6IFdob2V2ZXIgaXMgcmVzcG9uc2libGUgZm9yIGN1cnJlbnQtPnNpZ25hbCBsb2NraW5nIG5lZWRzCi0JICAgdG8gdXNlIHRoZSBzYW1lIGxvY2tpbmcgYWxsIG92ZXIgdGhlIGtlcm5lbCBhbmQgZG9jdW1lbnQgaXQgKi8KLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCWFjLmFjX3R0eSA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5ID8KLQkJb2xkX2VuY29kZV9kZXYodHR5X2Rldm51bShjdXJyZW50LT5zaWduYWwtPnR0eSkpIDogMDsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwotCiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJdHR5ID0gY3VycmVudC0+c2lnbmFsLT50dHk7CisJYWMuYWNfdHR5ID0gdHR5ID8gb2xkX2VuY29kZV9kZXYodHR5X2Rldm51bSh0dHkpKSA6IDA7CiAJYWMuYWNfdXRpbWUgPSBlbmNvZGVfY29tcF90KGppZmZpZXNfdG9fQUhaKGNwdXRpbWVfdG9famlmZmllcyhwYWNjdC0+YWNfdXRpbWUpKSk7CiAJYWMuYWNfc3RpbWUgPSBlbmNvZGVfY29tcF90KGppZmZpZXNfdG9fQUhaKGNwdXRpbWVfdG9famlmZmllcyhwYWNjdC0+YWNfc3RpbWUpKSk7CiAJYWMuYWNfZmxhZyA9IHBhY2N0LT5hY19mbGFnOwpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0LmMgYi9rZXJuZWwvYXVkaXQuYwppbmRleCA5ODEwNmY2Li5kOWI2OTBhIDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXQuYworKysgYi9rZXJuZWwvYXVkaXQuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9zZWxpbnV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgImF1ZGl0LmgiCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdGZpbHRlci5jIGIva2VybmVsL2F1ZGl0ZmlsdGVyLmMKaW5kZXggNGY0MGQ5Mi4uMmU4OTZmOCAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0ZmlsdGVyLmMKKysrIGIva2VybmVsL2F1ZGl0ZmlsdGVyLmMKQEAgLTYzNiwxMCArNjM2LDkgQEAKIAlzdHJ1Y3QgYXVkaXRfcnVsZSAqcnVsZTsKIAlpbnQgaTsKIAotCXJ1bGUgPSBrbWFsbG9jKHNpemVvZigqcnVsZSksIEdGUF9LRVJORUwpOworCXJ1bGUgPSBremFsbG9jKHNpemVvZigqcnVsZSksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghcnVsZSkpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChydWxlLCAwLCBzaXplb2YoKnJ1bGUpKTsKIAogCXJ1bGUtPmZsYWdzID0ga3J1bGUtPmZsYWdzIHwga3J1bGUtPmxpc3RucjsKIAlydWxlLT5hY3Rpb24gPSBrcnVsZS0+YWN0aW9uOwpkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0c2MuYyBiL2tlcm5lbC9hdWRpdHNjLmMKaW5kZXggNDJmMmYxMS4uMjk4ODk3NSAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0c2MuYworKysgYi9rZXJuZWwvYXVkaXRzYy5jCkBAIC02NCw2ICs2NCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VsaW51eC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KIAogI2luY2x1ZGUgImF1ZGl0LmgiCkBAIC03MzAsNyArNzMxLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJhdWRpdDogZnJlZWQgJWQgY29udGV4dHNcbiIsIGNvdW50KTsKIH0KIAotc3RhdGljIHZvaWQgYXVkaXRfbG9nX3Rhc2tfY29udGV4dChzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYikKK3ZvaWQgYXVkaXRfbG9nX3Rhc2tfY29udGV4dChzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYikKIHsKIAljaGFyICpjdHggPSBOVUxMOwogCXNzaXplX3QgbGVuID0gMDsKQEAgLTc1OSw2ICs3NjAsOCBAQAogCXJldHVybjsKIH0KIAorRVhQT1JUX1NZTUJPTChhdWRpdF9sb2dfdGFza19jb250ZXh0KTsKKwogc3RhdGljIHZvaWQgYXVkaXRfbG9nX3Rhc2tfaW5mbyhzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJY2hhciBuYW1lW3NpemVvZih0c2stPmNvbW0pXTsKQEAgLTc3OCw4ICs3ODEsOCBAQAogCQkJaWYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQ1VUQUJMRSkgJiYKIAkJCSAgICB2bWEtPnZtX2ZpbGUpIHsKIAkJCQlhdWRpdF9sb2dfZF9wYXRoKGFiLCAiZXhlPSIsCi0JCQkJCQkgdm1hLT52bV9maWxlLT5mX2RlbnRyeSwKLQkJCQkJCSB2bWEtPnZtX2ZpbGUtPmZfdmZzbW50KTsKKwkJCQkJCSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnksCisJCQkJCQkgdm1hLT52bV9maWxlLT5mX3BhdGgubW50KTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCXZtYSA9IHZtYS0+dm1fbmV4dDsKQEAgLTgyMywxMCArODI2LDEyIEBACiAJCQkJIGNvbnRleHQtPnJldHVybl9jb2RlKTsKIAogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlpZiAodHNrLT5zaWduYWwgJiYgdHNrLT5zaWduYWwtPnR0eSAmJiB0c2stPnNpZ25hbC0+dHR5LT5uYW1lKQogCQl0dHkgPSB0c2stPnNpZ25hbC0+dHR5LT5uYW1lOwogCWVsc2UKIAkJdHR5ID0gIihub25lKSI7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCWF1ZGl0X2xvZ19mb3JtYXQoYWIsCiAJCSAgIiBhMD0lbHggYTE9JWx4IGEyPSVseCBhMz0lbHggaXRlbXM9JWQiCiAJCSAgIiBwcGlkPSVkIHBpZD0lZCBhdWlkPSV1IHVpZD0ldSBnaWQ9JXUiCkBAIC0xNDg3LDYgKzE0OTIsOCBAQAogCXJldHVybiBjdHggPyBjdHgtPmxvZ2ludWlkIDogLTE7CiB9CiAKK0VYUE9SVF9TWU1CT0woYXVkaXRfZ2V0X2xvZ2ludWlkKTsKKwogLyoqCiAgKiBfX2F1ZGl0X21xX29wZW4gLSByZWNvcmQgYXVkaXQgZGF0YSBmb3IgYSBQT1NJWCBNUSBvcGVuCiAgKiBAb2ZsYWc6IG9wZW4gZmxhZwpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IDc1NTczZTUuLjY5NTJkZDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTY3OCw3ICs2NzgsNyBAQAogCQk/IC1FRkFVTFQgOiAwOwogfQogCi1sb25nIGNvbXBhdF9nZXRfYml0bWFwKHVuc2lnbmVkIGxvbmcgKm1hc2ssIGNvbXBhdF91bG9uZ190IF9fdXNlciAqdW1hc2ssCitsb25nIGNvbXBhdF9nZXRfYml0bWFwKHVuc2lnbmVkIGxvbmcgKm1hc2ssIGNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqdW1hc2ssCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGJpdG1hcF9zaXplKQogewogCWludCBpLCBqOwpAQCAtOTgyLDQgKzk4MiwzNyBAQAogCX0KIAlyZXR1cm4gc3lzX21vdmVfcGFnZXMocGlkLCBucl9wYWdlcywgcGFnZXMsIG5vZGVzLCBzdGF0dXMsIGZsYWdzKTsKIH0KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbWlncmF0ZV9wYWdlcyhjb21wYXRfcGlkX3QgcGlkLAorCQkJY29tcGF0X3Vsb25nX3QgbWF4bm9kZSwKKwkJCWNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqb2xkX25vZGVzLAorCQkJY29uc3QgY29tcGF0X3Vsb25nX3QgX191c2VyICpuZXdfbm9kZXMpCit7CisJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm9sZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm5ldyA9IE5VTEw7CisJbm9kZW1hc2tfdCB0bXBfbWFzazsKKwl1bnNpZ25lZCBsb25nIG5yX2JpdHM7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJbnJfYml0cyA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG1heG5vZGUgLSAxLCBNQVhfTlVNTk9ERVMpOworCXNpemUgPSBBTElHTihucl9iaXRzLCBCSVRTX1BFUl9MT05HKSAvIDg7CisJaWYgKG9sZF9ub2RlcykgeworCQlpZiAoY29tcGF0X2dldF9iaXRtYXAobm9kZXNfYWRkcih0bXBfbWFzayksIG9sZF9ub2RlcywgbnJfYml0cykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJb2xkID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobmV3X25vZGVzID8gc2l6ZSAqIDIgOiBzaXplKTsKKwkJaWYgKG5ld19ub2RlcykKKwkJCW5ldyA9IG9sZCArIHNpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCWlmIChjb3B5X3RvX3VzZXIob2xkLCBub2Rlc19hZGRyKHRtcF9tYXNrKSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKG5ld19ub2RlcykgeworCQlpZiAoY29tcGF0X2dldF9iaXRtYXAobm9kZXNfYWRkcih0bXBfbWFzayksIG5ld19ub2RlcywgbnJfYml0cykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKG5ldyA9PSBOVUxMKQorCQkJbmV3ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZSk7CisJCWlmIChjb3B5X3RvX3VzZXIobmV3LCBub2Rlc19hZGRyKHRtcF9tYXNrKSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHN5c19taWdyYXRlX3BhZ2VzKHBpZCwgbnJfYml0cyArIDEsIG9sZCwgbmV3KTsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbmZpZ3MuYyBiL2tlcm5lbC9jb25maWdzLmMKaW5kZXggZjllMzE5Ny4uOGZhMWZiMiAxMDA2NDQKLS0tIGEva2VybmVsL2NvbmZpZ3MuYworKysgYi9rZXJuZWwvY29uZmlncy5jCkBAIC03NSw3ICs3NSw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpa2NvbmZpZ19maWxlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlrY29uZmlnX2ZpbGVfb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5yZWFkID0gaWtjb25maWdfcmVhZF9jdXJyZW50LAogfTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCAzMmM5NjYyLi45MTI0NjY5IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC0xOSw3ICsxOSw3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGNwdV9hZGRfcmVtb3ZlX2xvY2spOwogc3RhdGljIERFRklORV9NVVRFWChjcHVfYml0bWFza19sb2NrKTsKIAotc3RhdGljIF9fY3B1aW5pdGRhdGEgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChjcHVfY2hhaW4pOworc3RhdGljIF9fY3B1aW5pdGRhdGEgUkFXX05PVElGSUVSX0hFQUQoY3B1X2NoYWluKTsKIAogLyogSWYgc2V0LCBjcHVfdXAgYW5kIGNwdV9kb3duIHdpbGwgcmV0dXJuIC1FQlVTWSBhbmQgZG8gbm90aGluZy4KICAqIFNob3VsZCBhbHdheXMgYmUgbWFuaXB1bGF0ZWQgdW5kZXIgY3B1X2FkZF9yZW1vdmVfbG9jawpAQCAtNTgsOCArNTgsOCBAQAogCQlyZWN1cnNpdmVfZGVwdGgtLTsKIAkJcmV0dXJuOwogCX0KLQltdXRleF91bmxvY2soJmNwdV9iaXRtYXNrX2xvY2spOwogCXJlY3Vyc2l2ZSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZjcHVfYml0bWFza19sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVubG9ja19jcHVfaG90cGx1Zyk7CiAKQEAgLTY4LDcgKzY4LDExIEBACiAvKiBOZWVkIHRvIGtub3cgYWJvdXQgQ1BVcyBnb2luZyB1cC9kb3duPyAqLwogaW50IF9fY3B1aW5pdCByZWdpc3Rlcl9jcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKIHsKLQlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmNwdV9jaGFpbiwgbmIpOworCWludCByZXQ7CisJbXV0ZXhfbG9jaygmY3B1X2FkZF9yZW1vdmVfbG9jayk7CisJcmV0ID0gcmF3X25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZjcHVfY2hhaW4sIG5iKTsKKwltdXRleF91bmxvY2soJmNwdV9hZGRfcmVtb3ZlX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKQEAgLTc3LDcgKzgxLDkgQEAKIAogdm9pZCB1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewotCWJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmNwdV9jaGFpbiwgbmIpOworCW11dGV4X2xvY2soJmNwdV9hZGRfcmVtb3ZlX2xvY2spOworCXJhd19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZjcHVfY2hhaW4sIG5iKTsKKwltdXRleF91bmxvY2soJmNwdV9hZGRfcmVtb3ZlX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcik7CiAKQEAgLTEyNiw3ICsxMzIsNyBAQAogCWlmICghY3B1X29ubGluZShjcHUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVyciA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdV9jaGFpbiwgQ1BVX0RPV05fUFJFUEFSRSwKKwllcnIgPSByYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfRE9XTl9QUkVQQVJFLAogCQkJCQkJKHZvaWQgKikobG9uZyljcHUpOwogCWlmIChlcnIgPT0gTk9USUZZX0JBRCkgewogCQlwcmludGsoIiVzOiBhdHRlbXB0IHRvIHRha2UgZG93biBDUFUgJXUgZmFpbGVkXG4iLApAQCAtMTQ0LDE4ICsxNTAsMTggQEAKIAlwID0gX19zdG9wX21hY2hpbmVfcnVuKHRha2VfY3B1X2Rvd24sIE5VTEwsIGNwdSk7CiAJbXV0ZXhfdW5sb2NrKCZjcHVfYml0bWFza19sb2NrKTsKIAotCWlmIChJU19FUlIocCkpIHsKKwlpZiAoSVNfRVJSKHApIHx8IGNwdV9vbmxpbmUoY3B1KSkgewogCQkvKiBDUFUgZGlkbid0IGRpZTogdGVsbCBldmVyeW9uZS4gIENhbid0IGNvbXBsYWluLiAqLwotCQlpZiAoYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfRE9XTl9GQUlMRUQsCisJCWlmIChyYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfRE9XTl9GQUlMRUQsCiAJCQkJKHZvaWQgKikobG9uZyljcHUpID09IE5PVElGWV9CQUQpCiAJCQlCVUcoKTsKIAotCQllcnIgPSBQVFJfRVJSKHApOwotCQlnb3RvIG91dF9hbGxvd2VkOwotCX0KLQotCWlmIChjcHVfb25saW5lKGNwdSkpCisJCWlmIChJU19FUlIocCkpIHsKKwkJCWVyciA9IFBUUl9FUlIocCk7CisJCQlnb3RvIG91dF9hbGxvd2VkOworCQl9CiAJCWdvdG8gb3V0X3RocmVhZDsKKwl9CiAKIAkvKiBXYWl0IGZvciBpdCB0byBzbGVlcCAobGVhdmluZyBpZGxlIHRhc2spLiAqLwogCXdoaWxlICghaWRsZV9jcHUoY3B1KSkKQEAgLTE2OSw3ICsxNzUsNyBAQAogCXB1dF9jcHUoKTsKIAogCS8qIENQVSBpcyBjb21wbGV0ZWx5IGRlYWQ6IHRlbGwgZXZlcnlvbmUuICBUb28gbGF0ZSB0byBjb21wbGFpbi4gKi8KLQlpZiAoYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfREVBRCwKKwlpZiAocmF3X25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdV9jaGFpbiwgQ1BVX0RFQUQsCiAJCQkodm9pZCAqKShsb25nKWNwdSkgPT0gTk9USUZZX0JBRCkKIAkJQlVHKCk7CiAKQEAgLTIwNiw3ICsyMTIsNyBAQAogCWlmIChjcHVfb25saW5lKGNwdSkgfHwgIWNwdV9wcmVzZW50KGNwdSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLCBDUFVfVVBfUFJFUEFSRSwgaGNwdSk7CisJcmV0ID0gcmF3X25vdGlmaWVyX2NhbGxfY2hhaW4oJmNwdV9jaGFpbiwgQ1BVX1VQX1BSRVBBUkUsIGhjcHUpOwogCWlmIChyZXQgPT0gTk9USUZZX0JBRCkgewogCQlwcmludGsoIiVzOiBhdHRlbXB0IHRvIGJyaW5nIHVwIENQVSAldSBmYWlsZWRcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBjcHUpOwpAQCAtMjIzLDExICsyMjksMTEgQEAKIAlCVUdfT04oIWNwdV9vbmxpbmUoY3B1KSk7CiAKIAkvKiBOb3cgY2FsbCBub3RpZmllciBpbiBwcmVwYXJhdGlvbi4gKi8KLQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9PTkxJTkUsIGhjcHUpOworCXJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjcHVfY2hhaW4sIENQVV9PTkxJTkUsIGhjcHUpOwogCiBvdXRfbm90aWZ5OgogCWlmIChyZXQgIT0gMCkKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLAorCQlyYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1X2NoYWluLAogCQkJCUNQVV9VUF9DQU5DRUxFRCwgaGNwdSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjY0LDExICsyNzAsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0JZXJyb3IgPSBzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGZpcnN0X2NwdSkpOwotCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBydW4gb24gQ1BVJWRcbiIsIGZpcnN0X2NwdSk7Ci0JCWdvdG8gb3V0OwotCX0KKwogCS8qIFdlIHRha2UgZG93biBhbGwgb2YgdGhlIG5vbi1ib290IENQVXMgaW4gb25lIHNob3QgdG8gYXZvaWQgcmFjZXMKIAkgKiB3aXRoIHRoZSB1c2Vyc3BhY2UgdHJ5aW5nIHRvIHVzZSB0aGUgQ1BVIGhvdHBsdWcgYXQgdGhlIHNhbWUgdGltZQogCSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDYzMTNjMzguLjIzMmFlZDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTQxMyw4ICs0MTMsOCBAQAogICoKICAqCiAgKiBXaGVuIHJlYWRpbmcvd3JpdGluZyB0byBhIGZpbGU6Ci0gKgktIHRoZSBjcHVzZXQgdG8gdXNlIGluIGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudC0+ZF9mc2RhdGEKLSAqCS0gdGhlICdjZnR5cGUnIG9mIHRoZSBmaWxlIGlzIGZpbGUtPmZfZGVudHJ5LT5kX2ZzZGF0YQorICoJLSB0aGUgY3B1c2V0IHRvIHVzZSBpbiBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudC0+ZF9mc2RhdGEKKyAqCS0gdGhlICdjZnR5cGUnIG9mIHRoZSBmaWxlIGlzIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfZnNkYXRhCiAgKi8KIAogc3RydWN0IGNmdHlwZSB7CkBAIC03MjksOSArNzI5LDExIEBACiAJfQogCiAJLyogUmVtYWluaW5nIGNoZWNrcyBkb24ndCBhcHBseSB0byByb290IGNwdXNldCAqLwotCWlmICgocGFyID0gY3VyLT5wYXJlbnQpID09IE5VTEwpCisJaWYgKGN1ciA9PSAmdG9wX2NwdXNldCkKIAkJcmV0dXJuIDA7CiAKKwlwYXIgPSBjdXItPnBhcmVudDsKKwogCS8qIFdlIG11c3QgYmUgYSBzdWJzZXQgb2Ygb3VyIHBhcmVudCBjcHVzZXQgKi8KIAlpZiAoIWlzX2NwdXNldF9zdWJzZXQodHJpYWwsIHBhcikpCiAJCXJldHVybiAtRUFDQ0VTOwpAQCAtMTA2MCwxMCArMTA2Miw3IEBACiAJY3B1X2V4Y2x1c2l2ZV9jaGFuZ2VkID0KIAkJKGlzX2NwdV9leGNsdXNpdmUoY3MpICE9IGlzX2NwdV9leGNsdXNpdmUoJnRyaWFsY3MpKTsKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JaWYgKHR1cm5pbmdfb24pCi0JCXNldF9iaXQoYml0LCAmY3MtPmZsYWdzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChiaXQsICZjcy0+ZmxhZ3MpOworCWNzLT5mbGFncyA9IHRyaWFsY3MuZmxhZ3M7CiAJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CiAKIAlpZiAoY3B1X2V4Y2x1c2l2ZV9jaGFuZ2VkKQpAQCAtMTI4MSwxOCArMTI4MCwxOSBAQAogCUZJTEVfVEFTS0xJU1QsCiB9IGNwdXNldF9maWxldHlwZV90OwogCi1zdGF0aWMgc3NpemVfdCBjcHVzZXRfY29tbW9uX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorc3RhdGljIHNzaXplX3QgY3B1c2V0X2NvbW1vbl9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKIAkJCQkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICp1bnVzZWRfcHBvcykKIHsKLQlzdHJ1Y3QgY3B1c2V0ICpjcyA9IF9fZF9jcyhmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQpOwotCXN0cnVjdCBjZnR5cGUgKmNmdCA9IF9fZF9jZnQoZmlsZS0+Zl9kZW50cnkpOworCXN0cnVjdCBjcHVzZXQgKmNzID0gX19kX2NzKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCWNwdXNldF9maWxldHlwZV90IHR5cGUgPSBjZnQtPnByaXZhdGU7CiAJY2hhciAqYnVmZmVyOwogCWNoYXIgKnBhdGhidWYgPSBOVUxMOwogCWludCByZXR2YWwgPSAwOwogCiAJLyogQ3J1ZGUgdXBwZXIgbGltaXQgb24gbGFyZ2VzdCBsZWdpdGltYXRlIGNwdWxpc3QgdXNlciBtaWdodCB3cml0ZS4gKi8KLQlpZiAobmJ5dGVzID4gMTAwICsgNiAqIE5SX0NQVVMpCisJaWYgKG5ieXRlcyA+IDEwMCArIDYgKiBtYXgoTlJfQ1BVUywgTUFYX05VTU5PREVTKSkKIAkJcmV0dXJuIC1FMkJJRzsKIAogCS8qICsxIGZvciBudWwtdGVybWluYXRvciAqLwpAQCAtMTM2Nyw3ICsxMzY3LDcgQEAKIAkJCQkJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKIHsKIAlzc2l6ZV90IHJldHZhbCA9IDA7Ci0Jc3RydWN0IGNmdHlwZSAqY2Z0ID0gX19kX2NmdChmaWxlLT5mX2RlbnRyeSk7CisJc3RydWN0IGNmdHlwZSAqY2Z0ID0gX19kX2NmdChmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAlpZiAoIWNmdCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE0MTcsOCArMTQxNyw4IEBACiBzdGF0aWMgc3NpemVfdCBjcHVzZXRfY29tbW9uX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGNmdHlwZSAqY2Z0ID0gX19kX2NmdChmaWxlLT5mX2RlbnRyeSk7Ci0Jc3RydWN0IGNwdXNldCAqY3MgPSBfX2RfY3MoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfcGF0aC5kZW50cnkpOworCXN0cnVjdCBjcHVzZXQgKmNzID0gX19kX2NzKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50KTsKIAljcHVzZXRfZmlsZXR5cGVfdCB0eXBlID0gY2Z0LT5wcml2YXRlOwogCWNoYXIgKnBhZ2U7CiAJc3NpemVfdCByZXR2YWwgPSAwOwpAQCAtMTQ3Niw3ICsxNDc2LDcgQEAKIAkJCQkJCQkJbG9mZl90ICpwcG9zKQogewogCXNzaXplX3QgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKKwlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCWlmICghY2Z0KQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTQ5OCw3ICsxNDk4LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JY2Z0ID0gX19kX2NmdChmaWxlLT5mX2RlbnRyeSk7CisJY2Z0ID0gX19kX2NmdChmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAlpZiAoIWNmdCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKGNmdC0+b3BlbikKQEAgLTE1MTEsNyArMTUxMSw3IEBACiAKIHN0YXRpYyBpbnQgY3B1c2V0X2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKKwlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCWlmIChjZnQtPnJlbGVhc2UpCiAJCXJldHVybiBjZnQtPnJlbGVhc2UoaW5vZGUsIGZpbGUpOwogCXJldHVybiAwOwpAQCAtMTUzMiw3ICsxNTMyLDcgQEAKIAlyZXR1cm4gc2ltcGxlX3JlbmFtZShvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3B1c2V0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNwdXNldF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWQgPSBjcHVzZXRfZmlsZV9yZWFkLAogCS53cml0ZSA9IGNwdXNldF9maWxlX3dyaXRlLAogCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLApAQCAtMTcwMCw3ICsxNzAwLDcgQEAKICAqLwogc3RhdGljIGludCBjcHVzZXRfdGFza3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKnVudXNlZCwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGNwdXNldCAqY3MgPSBfX2RfY3MoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgY3B1c2V0ICpjcyA9IF9fZF9jcyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudCk7CiAJc3RydWN0IGN0cl9zdHJ1Y3QgKmN0cjsKIAlwaWRfdCAqcGlkYXJyYXk7CiAJaW50IG5waWRzOwpAQCAtMjA0NSw3ICsyMDQ1LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpIHx8IGRlZmluZWQoQ09ORklHX01FTU9SWV9IT1RQTFVHKQogLyoKICAqIElmIGNvbW1vbl9jcHVfbWVtX2hvdHBsdWdfdW5wbHVnKCksIGJlbG93LCB1bnBsdWdzIGFueSBDUFVzCiAgKiBvciBtZW1vcnkgbm9kZXMsIHdlIG5lZWQgdG8gd2FsayBvdmVyIHRoZSBjcHVzZXQgaGllcmFyY2h5LApAQCAtMjEwOSw5ICsyMTA4LDcgQEAKIAltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKIAltdXRleF91bmxvY2soJm1hbmFnZV9tdXRleCk7CiB9Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyoKICAqIFRoZSB0b3BfY3B1c2V0IHRyYWNrcyB3aGF0IENQVXMgYW5kIE1lbW9yeSBOb2RlcyBhcmUgb25saW5lLAogICogcGVyaW9kLiAgVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gbWFrZSBjcHVzZXRzIHRyYW5zcGFyZW50CkBAIC0yMTI4LDcgKzIxMjUsNiBAQAogCWNvbW1vbl9jcHVfbWVtX2hvdHBsdWdfdW5wbHVnKCk7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRwogLyoKQEAgLTIzNDYsMzIgKzIzNDIsNDggQEAKIH0KIAogLyoqCi0gKiBjcHVzZXRfem9uZV9hbGxvd2VkIC0gQ2FuIHdlIGFsbG9jYXRlIG1lbW9yeSBvbiB6b25lIHoncyBtZW1vcnkgbm9kZT8KKyAqIGNwdXNldF96b25lX2FsbG93ZWRfc29mdHdhbGwgLSBDYW4gd2UgYWxsb2NhdGUgb24gem9uZSB6J3MgbWVtb3J5IG5vZGU/CiAgKiBAejogaXMgdGhpcyB6b25lIG9uIGFuIGFsbG93ZWQgbm9kZT8KLSAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MgKHdlIHVzZSBfX0dGUF9IQVJEV0FMTCkKKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKICAqCi0gKiBJZiB3ZSdyZSBpbiBpbnRlcnJ1cHQsIHllcywgd2UgY2FuIGFsd2F5cyBhbGxvY2F0ZS4gIElmIHpvbmUKKyAqIElmIHdlJ3JlIGluIGludGVycnVwdCwgeWVzLCB3ZSBjYW4gYWx3YXlzIGFsbG9jYXRlLiAgSWYKKyAqIF9fR0ZQX1RISVNOT0RFIGlzIHNldCwgeWVzLCB3ZSBjYW4gYWx3YXlzIGFsbG9jYXRlLiAgSWYgem9uZQogICogeidzIG5vZGUgaXMgaW4gb3VyIHRhc2tzIG1lbXNfYWxsb3dlZCwgeWVzLiAgSWYgaXQncyBub3QgYQogICogX19HRlBfSEFSRFdBTEwgcmVxdWVzdCBhbmQgdGhpcyB6b25lJ3Mgbm9kZXMgaXMgaW4gdGhlIG5lYXJlc3QKICAqIG1lbV9leGNsdXNpdmUgY3B1c2V0IGFuY2VzdG9yIHRvIHRoaXMgdGFza3MgY3B1c2V0LCB5ZXMuCiAgKiBPdGhlcndpc2UsIG5vLgogICoKKyAqIElmIF9fR0ZQX0hBUkRXQUxMIGlzIHNldCwgY3B1c2V0X3pvbmVfYWxsb3dlZF9zb2Z0d2FsbCgpCisgKiByZWR1Y2VzIHRvIGNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoKS4gIE90aGVyd2lzZSwKKyAqIGNwdXNldF96b25lX2FsbG93ZWRfc29mdHdhbGwoKSBtaWdodCBzbGVlcCwgYW5kIG1pZ2h0IGFsbG93IGEgem9uZQorICogZnJvbSBhbiBlbmNsb3NpbmcgY3B1c2V0LgorICoKKyAqIGNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoKSBvbmx5IGhhbmRsZXMgdGhlIHNpbXBsZXIgY2FzZSBvZgorICogaGFyZHdhbGwgY3B1c2V0cywgYW5kIG5ldmVyIHNsZWVwcy4KKyAqCisgKiBUaGUgX19HRlBfVEhJU05PREUgcGxhY2VtZW50IGxvZ2ljIGlzIHJlYWxseSBoYW5kbGVkIGVsc2V3aGVyZSwKKyAqIGJ5IGZvcmNpYmx5IHVzaW5nIGEgem9uZWxpc3Qgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgbm9kZSwgYW5kIGJ5CisgKiAoaW4gZ2V0X3BhZ2VfZnJvbV9mcmVlbGlzdCgpKSByZWZ1c2luZyB0byBjb25zaWRlciB0aGUgem9uZXMgZm9yCisgKiBhbnkgbm9kZSBvbiB0aGUgem9uZWxpc3QgZXhjZXB0IHRoZSBmaXJzdC4gIEJ5IHRoZSB0aW1lIGFueSBzdWNoCisgKiBjYWxscyBnZXQgdG8gdGhpcyByb3V0aW5lLCB3ZSBzaG91bGQganVzdCBzaHV0IHVwIGFuZCBzYXkgJ3llcycuCisgKgogICogR0ZQX1VTRVIgYWxsb2NhdGlvbnMgYXJlIG1hcmtlZCB3aXRoIHRoZSBfX0dGUF9IQVJEV0FMTCBiaXQsCiAgKiBhbmQgZG8gbm90IGFsbG93IGFsbG9jYXRpb25zIG91dHNpZGUgdGhlIGN1cnJlbnQgdGFza3MgY3B1c2V0LgogICogR0ZQX0tFUk5FTCBhbGxvY2F0aW9ucyBhcmUgbm90IHNvIG1hcmtlZCwgc28gY2FuIGVzY2FwZSB0byB0aGUKLSAqIG5lYXJlc3QgbWVtX2V4Y2x1c2l2ZSBhbmNlc3RvciBjcHVzZXQuCisgKiBuZWFyZXN0IGVuY2xvc2luZyBtZW1fZXhjbHVzaXZlIGFuY2VzdG9yIGNwdXNldC4KICAqCi0gKiBTY2FubmluZyB1cCBwYXJlbnQgY3B1c2V0cyByZXF1aXJlcyBjYWxsYmFja19tdXRleC4gIFRoZSBfX2FsbG9jX3BhZ2VzKCkKLSAqIHJvdXRpbmUgb25seSBjYWxscyBoZXJlIHdpdGggX19HRlBfSEFSRFdBTEwgYml0IF9ub3RfIHNldCBpZgotICogaXQncyBhIEdGUF9LRVJORUwgYWxsb2NhdGlvbiwgYW5kIGFsbCBub2RlcyBpbiB0aGUgY3VycmVudCB0YXNrcwotICogbWVtc19hbGxvd2VkIGNhbWUgdXAgZW1wdHkgb24gdGhlIGZpcnN0IHBhc3Mgb3ZlciB0aGUgem9uZWxpc3QuCi0gKiBTbyBvbmx5IEdGUF9LRVJORUwgYWxsb2NhdGlvbnMsIGlmIGFsbCBub2RlcyBpbiB0aGUgY3B1c2V0IGFyZQotICogc2hvcnQgb2YgbWVtb3J5LCBtaWdodCByZXF1aXJlIHRha2luZyB0aGUgY2FsbGJhY2tfbXV0ZXggbXV0ZXguCisgKiBTY2FubmluZyB1cCBwYXJlbnQgY3B1c2V0cyByZXF1aXJlcyBjYWxsYmFja19tdXRleC4gIFRoZQorICogX19hbGxvY19wYWdlcygpIHJvdXRpbmUgb25seSBjYWxscyBoZXJlIHdpdGggX19HRlBfSEFSRFdBTEwgYml0CisgKiBfbm90XyBzZXQgaWYgaXQncyBhIEdGUF9LRVJORUwgYWxsb2NhdGlvbiwgYW5kIGFsbCBub2RlcyBpbiB0aGUKKyAqIGN1cnJlbnQgdGFza3MgbWVtc19hbGxvd2VkIGNhbWUgdXAgZW1wdHkgb24gdGhlIGZpcnN0IHBhc3Mgb3ZlcgorICogdGhlIHpvbmVsaXN0LiAgU28gb25seSBHRlBfS0VSTkVMIGFsbG9jYXRpb25zLCBpZiBhbGwgbm9kZXMgaW4gdGhlCisgKiBjcHVzZXQgYXJlIHNob3J0IG9mIG1lbW9yeSwgbWlnaHQgcmVxdWlyZSB0YWtpbmcgdGhlIGNhbGxiYWNrX211dGV4CisgKiBtdXRleC4KICAqCiAgKiBUaGUgZmlyc3QgY2FsbCBoZXJlIGZyb20gbW0vcGFnZV9hbGxvYzpnZXRfcGFnZV9mcm9tX2ZyZWVsaXN0KCkKLSAqIGhhcyBfX0dGUF9IQVJEV0FMTCBzZXQgaW4gZ2ZwX21hc2ssIGVuZm9yY2luZyBoYXJkd2FsbCBjcHVzZXRzLCBzbwotICogbm8gYWxsb2NhdGlvbiBvbiBhIG5vZGUgb3V0c2lkZSB0aGUgY3B1c2V0IGlzIGFsbG93ZWQgKHVubGVzcyBpbgotICogaW50ZXJydXB0LCBvZiBjb3Vyc2UpLgorICogaGFzIF9fR0ZQX0hBUkRXQUxMIHNldCBpbiBnZnBfbWFzaywgZW5mb3JjaW5nIGhhcmR3YWxsIGNwdXNldHMsCisgKiBzbyBubyBhbGxvY2F0aW9uIG9uIGEgbm9kZSBvdXRzaWRlIHRoZSBjcHVzZXQgaXMgYWxsb3dlZCAodW5sZXNzCisgKiBpbiBpbnRlcnJ1cHQsIG9mIGNvdXJzZSkuCiAgKgogICogVGhlIHNlY29uZCBwYXNzIHRocm91Z2ggZ2V0X3BhZ2VfZnJvbV9mcmVlbGlzdCgpIGRvZXNuJ3QgZXZlbiBjYWxsCiAgKiBoZXJlIGZvciBHRlBfQVRPTUlDIGNhbGxzLiAgRm9yIHRob3NlIGNhbGxzLCB0aGUgX19hbGxvY19wYWdlcygpCkBAIC0yMzg0LDEyICsyMzk2LDEyIEBACiAgKglHRlBfVVNFUiAgICAgLSBvbmx5IG5vZGVzIGluIGN1cnJlbnQgdGFza3MgbWVtcyBhbGxvd2VkIG9rLgogICoKICAqIFJ1bGU6Ci0gKiAgICBEb24ndCBjYWxsIGNwdXNldF96b25lX2FsbG93ZWQoKSBpZiB5b3UgY2FuJ3Qgc2xlZXAsIHVubGVzcyB5b3UKKyAqICAgIERvbid0IGNhbGwgY3B1c2V0X3pvbmVfYWxsb3dlZF9zb2Z0d2FsbCBpZiB5b3UgY2FuJ3Qgc2xlZXAsIHVubGVzcyB5b3UKICAqICAgIHBhc3MgaW4gdGhlIF9fR0ZQX0hBUkRXQUxMIGZsYWcgc2V0IGluIGdmcF9mbGFnLCB3aGljaCBkaXNhYmxlcwogICogICAgdGhlIGNvZGUgdGhhdCBtaWdodCBzY2FuIHVwIGFuY2VzdG9yIGNwdXNldHMgYW5kIHNsZWVwLgotICoqLworICovCiAKLWludCBfX2NwdXNldF96b25lX2FsbG93ZWQoc3RydWN0IHpvbmUgKnosIGdmcF90IGdmcF9tYXNrKQoraW50IF9fY3B1c2V0X3pvbmVfYWxsb3dlZF9zb2Z0d2FsbChzdHJ1Y3Qgem9uZSAqeiwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJaW50IG5vZGU7CQkJLyogbm9kZSB0aGF0IHpvbmUgeiBpcyBvbiAqLwogCWNvbnN0IHN0cnVjdCBjcHVzZXQgKmNzOwkvKiBjdXJyZW50IGNwdXNldCBhbmNlc3RvcnMgKi8KQEAgLTI0MTksNiArMjQzMSw0MCBAQAogCXJldHVybiBhbGxvd2VkOwogfQogCisvKgorICogY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCAtIENhbiB3ZSBhbGxvY2F0ZSBvbiB6b25lIHoncyBtZW1vcnkgbm9kZT8KKyAqIEB6OiBpcyB0aGlzIHpvbmUgb24gYW4gYWxsb3dlZCBub2RlPworICogQGdmcF9tYXNrOiBtZW1vcnkgYWxsb2NhdGlvbiBmbGFncworICoKKyAqIElmIHdlJ3JlIGluIGludGVycnVwdCwgeWVzLCB3ZSBjYW4gYWx3YXlzIGFsbG9jYXRlLgorICogSWYgX19HRlBfVEhJU05PREUgaXMgc2V0LCB5ZXMsIHdlIGNhbiBhbHdheXMgYWxsb2NhdGUuICBJZiB6b25lCisgKiB6J3Mgbm9kZSBpcyBpbiBvdXIgdGFza3MgbWVtc19hbGxvd2VkLCB5ZXMuICAgT3RoZXJ3aXNlLCBuby4KKyAqCisgKiBUaGUgX19HRlBfVEhJU05PREUgcGxhY2VtZW50IGxvZ2ljIGlzIHJlYWxseSBoYW5kbGVkIGVsc2V3aGVyZSwKKyAqIGJ5IGZvcmNpYmx5IHVzaW5nIGEgem9uZWxpc3Qgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgbm9kZSwgYW5kIGJ5CisgKiAoaW4gZ2V0X3BhZ2VfZnJvbV9mcmVlbGlzdCgpKSByZWZ1c2luZyB0byBjb25zaWRlciB0aGUgem9uZXMgZm9yCisgKiBhbnkgbm9kZSBvbiB0aGUgem9uZWxpc3QgZXhjZXB0IHRoZSBmaXJzdC4gIEJ5IHRoZSB0aW1lIGFueSBzdWNoCisgKiBjYWxscyBnZXQgdG8gdGhpcyByb3V0aW5lLCB3ZSBzaG91bGQganVzdCBzaHV0IHVwIGFuZCBzYXkgJ3llcycuCisgKgorICogVW5saWtlIHRoZSBjcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKCkgdmFyaWFudCwgYWJvdmUsCisgKiB0aGlzIHZhcmlhbnQgcmVxdWlyZXMgdGhhdCB0aGUgem9uZSBiZSBpbiB0aGUgY3VycmVudCB0YXNrcworICogbWVtc19hbGxvd2VkIG9yIHRoYXQgd2UncmUgaW4gaW50ZXJydXB0LiAgSXQgZG9lcyBub3Qgc2NhbiB1cCB0aGUKKyAqIGNwdXNldCBoaWVyYXJjaHkgZm9yIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBtZW1fZXhjbHVzaXZlIGNwdXNldC4KKyAqIEl0IG5ldmVyIHNsZWVwcy4KKyAqLworCitpbnQgX19jcHVzZXRfem9uZV9hbGxvd2VkX2hhcmR3YWxsKHN0cnVjdCB6b25lICp6LCBnZnBfdCBnZnBfbWFzaykKK3sKKwlpbnQgbm9kZTsJCQkvKiBub2RlIHRoYXQgem9uZSB6IGlzIG9uICovCisKKwlpZiAoaW5faW50ZXJydXB0KCkgfHwgKGdmcF9tYXNrICYgX19HRlBfVEhJU05PREUpKQorCQlyZXR1cm4gMTsKKwlub2RlID0gem9uZV90b19uaWQoeik7CisJaWYgKG5vZGVfaXNzZXQobm9kZSwgY3VycmVudC0+bWVtc19hbGxvd2VkKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogY3B1c2V0X2xvY2sgLSBsb2NrIG91dCBhbnkgY2hhbmdlcyB0byBjcHVzZXQgc3RydWN0dXJlcwogICoKQEAgLTI2MTAsNyArMjY1Niw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfY3B1c2V0X3Nob3csIHBpZCk7CiB9CiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcHVzZXRfb3BlcmF0aW9ucyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcHVzZXRfb3BlcmF0aW9ucyA9IHsKIAkub3BlbgkJPSBjcHVzZXRfb3BlbiwKIAkucmVhZAkJPSBzZXFfcmVhZCwKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWxheWFjY3QuYyBiL2tlcm5lbC9kZWxheWFjY3QuYwppbmRleCAzNjc1MmYxLi43NjZkNTkxIDEwMDY0NAotLS0gYS9rZXJuZWwvZGVsYXlhY2N0LmMKKysrIGIva2VybmVsL2RlbGF5YWNjdC5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CiAKIGludCBkZWxheWFjY3Rfb24gX19yZWFkX21vc3RseSA9IDE7CS8qIERlbGF5IGFjY291bnRpbmcgdHVybmVkIG9uL29mZiAqLwota21lbV9jYWNoZV90ICpkZWxheWFjY3RfY2FjaGU7CitzdHJ1Y3Qga21lbV9jYWNoZSAqZGVsYXlhY2N0X2NhY2hlOwogCiBzdGF0aWMgaW50IF9faW5pdCBkZWxheWFjY3Rfc2V0dXBfZGlzYWJsZShjaGFyICpzdHIpCiB7CkBAIC00MSw3ICs0MSw3IEBACiAKIHZvaWQgX19kZWxheWFjY3RfdHNrX2luaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JdHNrLT5kZWxheXMgPSBrbWVtX2NhY2hlX3phbGxvYyhkZWxheWFjY3RfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwl0c2stPmRlbGF5cyA9IGttZW1fY2FjaGVfemFsbG9jKGRlbGF5YWNjdF9jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRzay0+ZGVsYXlzKQogCQlzcGluX2xvY2tfaW5pdCgmdHNrLT5kZWxheXMtPmxvY2spOwogfQpAQCAtNjYsNiArNjYsNyBAQAogewogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAlzNjQgbnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKGVuZCk7CiAJdHMgPSB0aW1lc3BlY19zdWIoKmVuZCwgKnN0YXJ0KTsKQEAgLTczLDEwICs3NCwxMCBAQAogCWlmIChucyA8IDApCiAJCXJldHVybjsKIAotCXNwaW5fbG9jaygmY3VycmVudC0+ZGVsYXlzLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+ZGVsYXlzLT5sb2NrLCBmbGFncyk7CiAJKnRvdGFsICs9IG5zOwogCSgqY291bnQpKys7Ci0Jc3Bpbl91bmxvY2soJmN1cnJlbnQtPmRlbGF5cy0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+ZGVsYXlzLT5sb2NrLCBmbGFncyk7CiB9CiAKIHZvaWQgX19kZWxheWFjY3RfYmxraW9fc3RhcnQodm9pZCkKQEAgLTEwNCw2ICsxMDUsNyBAQAogCXM2NCB0bXA7CiAJc3RydWN0IHRpbWVzcGVjIHRzOwogCXVuc2lnbmVkIGxvbmcgdDEsdDIsdDM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFRob3VnaCB0c2stPmRlbGF5cyBhY2Nlc3NlZCBsYXRlciwgZWFybHkgZXhpdCBhdm9pZHMKIAkgKiB1bm5lY2Vzc2FyeSByZXR1cm5pbmcgb2Ygb3RoZXIgZGF0YQpAQCAtMTM2LDE0ICsxMzgsMTQgQEAKIAogCS8qIHplcm8gWFhYX3RvdGFsLCBub24temVybyBYWFhfY291bnQgaW1wbGllcyBYWFggc3RhdCBvdmVyZmxvd2VkICovCiAKLQlzcGluX2xvY2soJnRzay0+ZGVsYXlzLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHNrLT5kZWxheXMtPmxvY2ssIGZsYWdzKTsKIAl0bXAgPSBkLT5ibGtpb19kZWxheV90b3RhbCArIHRzay0+ZGVsYXlzLT5ibGtpb19kZWxheTsKIAlkLT5ibGtpb19kZWxheV90b3RhbCA9ICh0bXAgPCBkLT5ibGtpb19kZWxheV90b3RhbCkgPyAwIDogdG1wOwogCXRtcCA9IGQtPnN3YXBpbl9kZWxheV90b3RhbCArIHRzay0+ZGVsYXlzLT5zd2FwaW5fZGVsYXk7CiAJZC0+c3dhcGluX2RlbGF5X3RvdGFsID0gKHRtcCA8IGQtPnN3YXBpbl9kZWxheV90b3RhbCkgPyAwIDogdG1wOwogCWQtPmJsa2lvX2NvdW50ICs9IHRzay0+ZGVsYXlzLT5ibGtpb19jb3VudDsKIAlkLT5zd2FwaW5fY291bnQgKz0gdHNrLT5kZWxheXMtPnN3YXBpbl9jb3VudDsKLQlzcGluX3VubG9jaygmdHNrLT5kZWxheXMtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+ZGVsYXlzLT5sb2NrLCBmbGFncyk7CiAKIGRvbmU6CiAJcmV0dXJuIDA7CkBAIC0xNTIsMTEgKzE1NCwxMiBAQAogX191NjQgX19kZWxheWFjY3RfYmxraW9fdGlja3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJX191NjQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2soJnRzay0+ZGVsYXlzLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHNrLT5kZWxheXMtPmxvY2ssIGZsYWdzKTsKIAlyZXQgPSBuc2VjX3RvX2Nsb2NrX3QodHNrLT5kZWxheXMtPmJsa2lvX2RlbGF5ICsKIAkJCQl0c2stPmRlbGF5cy0+c3dhcGluX2RlbGF5KTsKLQlzcGluX3VubG9jaygmdHNrLT5kZWxheXMtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+ZGVsYXlzLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2RtYS5jIGIva2VybmVsL2RtYS5jCmluZGV4IDIwMjA2NDQuLjkzN2IxM2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kbWEuYworKysgYi9rZXJuZWwvZG1hLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2RtYV9zaG93LCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19kbWFfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZG1hX29wZXJhdGlvbnMgPSB7CiAJLm9wZW4JCT0gcHJvY19kbWFfb3BlbiwKIAkucmVhZAkJPSBzZXFfcmVhZCwKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGYyNTBhNWUuLjEyMmZhZGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KQEAgLTQ4LDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAogZXh0ZXJuIHZvaWQgc2VtX2V4aXQgKHZvaWQpOwotZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGRfcmVhcGVyOwogCiBzdGF0aWMgdm9pZCBleGl0X21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHRzayk7CiAKQEAgLTEyOCw2ICsxMjgsNyBAQAogCWZsdXNoX3NpZ3F1ZXVlKCZ0c2stPnBlbmRpbmcpOwogCWlmIChzaWcpIHsKIAkJZmx1c2hfc2lncXVldWUoJnNpZy0+c2hhcmVkX3BlbmRpbmcpOworCQl0YXNrc3RhdHNfdGdpZF9mcmVlKHNpZyk7CiAJCV9fY2xlYW51cF9zaWduYWwoc2lnKTsKIAl9CiB9CkBAIC0xODgsMjEgKzE4OSwxOCBAQAogaW50IHNlc3Npb25fb2ZfcGdycChpbnQgcGdycCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0JaW50IHNpZCA9IC0xOworCWludCBzaWQgPSAwOwogCiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlkb19lYWNoX3Rhc2tfcGlkKHBncnAsIFBJRFRZUEVfUEdJRCwgcCkgewotCQlpZiAocC0+c2lnbmFsLT5zZXNzaW9uID4gMCkgewotCQkJc2lkID0gcC0+c2lnbmFsLT5zZXNzaW9uOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9IHdoaWxlX2VhY2hfdGFza19waWQocGdycCwgUElEVFlQRV9QR0lELCBwKTsKLQlwID0gZmluZF90YXNrX2J5X3BpZChwZ3JwKTsKLQlpZiAocCkKLQkJc2lkID0gcC0+c2lnbmFsLT5zZXNzaW9uOwotb3V0OgorCisJcCA9IGZpbmRfdGFza19ieV9waWRfdHlwZShQSURUWVBFX1BHSUQsIHBncnApOworCWlmIChwID09IE5VTEwpCisJCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHBncnApOworCWlmIChwICE9IE5VTEwpCisJCXNpZCA9IHByb2Nlc3Nfc2Vzc2lvbihwKTsKKwogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkKKwogCXJldHVybiBzaWQ7CiB9CiAKQEAgLTIyNCw4ICsyMjIsOCBAQAogCQkJCXx8IHAtPmV4aXRfc3RhdGUKIAkJCQl8fCBpc19pbml0KHAtPnJlYWxfcGFyZW50KSkKIAkJCWNvbnRpbnVlOwotCQlpZiAocHJvY2Vzc19ncm91cChwLT5yZWFsX3BhcmVudCkgIT0gcGdycAotCQkJICAgICYmIHAtPnJlYWxfcGFyZW50LT5zaWduYWwtPnNlc3Npb24gPT0gcC0+c2lnbmFsLT5zZXNzaW9uKSB7CisJCWlmIChwcm9jZXNzX2dyb3VwKHAtPnJlYWxfcGFyZW50KSAhPSBwZ3JwICYmCisJCSAgICBwcm9jZXNzX3Nlc3Npb24ocC0+cmVhbF9wYXJlbnQpID09IHByb2Nlc3Nfc2Vzc2lvbihwKSkgewogCQkJcmV0ID0gMDsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNTksNyArMjU3LDggQEAKIH0KIAogLyoqCi0gKiByZXBhcmVudF90b19pbml0IC0gUmVwYXJlbnQgdGhlIGNhbGxpbmcga2VybmVsIHRocmVhZCB0byB0aGUgaW5pdCB0YXNrLgorICogcmVwYXJlbnRfdG9faW5pdCAtIFJlcGFyZW50IHRoZSBjYWxsaW5nIGtlcm5lbCB0aHJlYWQgdG8gdGhlIGluaXQgdGFzaworICogb2YgdGhlIHBpZCBzcGFjZSB0aGF0IHRoZSB0aHJlYWQgYmVsb25ncyB0by4KICAqCiAgKiBJZiBhIGtlcm5lbCB0aHJlYWQgaXMgbGF1bmNoZWQgYXMgYSByZXN1bHQgb2YgYSBzeXN0ZW0gY2FsbCwgb3IgaWYKICAqIGl0IGV2ZXIgZXhpdHMsIGl0IHNob3VsZCBnZW5lcmFsbHkgcmVwYXJlbnQgaXRzZWxmIHRvIGluaXQgc28gdGhhdApAQCAtMjc3LDggKzI3Niw4IEBACiAJcHRyYWNlX3VubGluayhjdXJyZW50KTsKIAkvKiBSZXBhcmVudCB0byBpbml0ICovCiAJcmVtb3ZlX3BhcmVudChjdXJyZW50KTsKLQljdXJyZW50LT5wYXJlbnQgPSBjaGlsZF9yZWFwZXI7Ci0JY3VycmVudC0+cmVhbF9wYXJlbnQgPSBjaGlsZF9yZWFwZXI7CisJY3VycmVudC0+cGFyZW50ID0gY2hpbGRfcmVhcGVyKGN1cnJlbnQpOworCWN1cnJlbnQtPnJlYWxfcGFyZW50ID0gY2hpbGRfcmVhcGVyKGN1cnJlbnQpOwogCWFkZF9wYXJlbnQoY3VycmVudCk7CiAKIAkvKiBTZXQgdGhlIGV4aXQgc2lnbmFsIHRvIFNJR0NITEQgc28gd2Ugc2lnbmFsIGluaXQgb24gZXhpdCAqLwpAQCAtMzAxLDkgKzMwMCw5IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyOwogCi0JaWYgKGN1cnItPnNpZ25hbC0+c2Vzc2lvbiAhPSBzZXNzaW9uKSB7CisJaWYgKHByb2Nlc3Nfc2Vzc2lvbihjdXJyKSAhPSBzZXNzaW9uKSB7CiAJCWRldGFjaF9waWQoY3VyciwgUElEVFlQRV9TSUQpOwotCQljdXJyLT5zaWduYWwtPnNlc3Npb24gPSBzZXNzaW9uOworCQlzZXRfc2lnbmFsX3Nlc3Npb24oY3Vyci0+c2lnbmFsLCBzZXNzaW9uKTsKIAkJYXR0YWNoX3BpZChjdXJyLCBQSURUWVBFX1NJRCwgc2Vzc2lvbik7CiAJfQogCWlmIChwcm9jZXNzX2dyb3VwKGN1cnIpICE9IHBncnApIHsKQEAgLTMxMyw3ICszMTIsNyBAQAogCX0KIH0KIAotdm9pZCBzZXRfc3BlY2lhbF9waWRzKHBpZF90IHNlc3Npb24sIHBpZF90IHBncnApCitzdGF0aWMgdm9pZCBzZXRfc3BlY2lhbF9waWRzKHBpZF90IHNlc3Npb24sIHBpZF90IHBncnApCiB7CiAJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCV9fc2V0X3NwZWNpYWxfcGlkcyhzZXNzaW9uLCBwZ3JwKTsKQEAgLTM4Myw5ICszODIsNyBAQAogCWV4aXRfbW0oY3VycmVudCk7CiAKIAlzZXRfc3BlY2lhbF9waWRzKDEsIDEpOwotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JY3VycmVudC0+c2lnbmFsLT50dHkgPSBOVUxMOwotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKKwlwcm9jX2NsZWFyX3R0eShjdXJyZW50KTsKIAogCS8qIEJsb2NrIGFuZCBmbHVzaCBhbGwgc2lnbmFscyAqLwogCXNpZ2ZpbGxzZXQoJmJsb2NrZWQpOwpAQCAtNDI4LDcgKzQyNSw3IEBACiAJZm9yICg7OykgewogCQl1bnNpZ25lZCBsb25nIHNldDsKIAkJaSA9IGogKiBfX05GREJJVFM7Ci0JCWlmIChpID49IGZkdC0+bWF4X2Zkc2V0IHx8IGkgPj0gZmR0LT5tYXhfZmRzKQorCQlpZiAoaSA+PSBmZHQtPm1heF9mZHMpCiAJCQlicmVhazsKIAkJc2V0ID0gZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbaisrXTsKIAkJd2hpbGUgKHNldCkgewpAQCAtNDY5LDExICs0NjYsOSBAQAogCQkgKiB5b3UgY2FuIGZyZWUgZmlsZXMgaW1tZWRpYXRlbHkuCiAJCSAqLwogCQlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKLQkJaWYgKGZkdCA9PSAmZmlsZXMtPmZkdGFiKQotCQkJZmR0LT5mcmVlX2ZpbGVzID0gZmlsZXM7Ci0JCWVsc2UKKwkJaWYgKGZkdCAhPSAmZmlsZXMtPmZkdGFiKQogCQkJa21lbV9jYWNoZV9mcmVlKGZpbGVzX2NhY2hlcCwgZmlsZXMpOwotCQlmcmVlX2ZkdGFibGUoZmR0KTsKKwkJY2FsbF9yY3UoJmZkdC0+cmN1LCBmcmVlX2ZkdGFibGVfcmN1KTsKIAl9CiB9CiAKQEAgLTY0OCwxMCArNjQzLDExIEBACiAJICogb3V0c2lkZSwgc28gdGhlIGNoaWxkIHBncnAgaXMgbm93IG9ycGhhbmVkLgogCSAqLwogCWlmICgocHJvY2Vzc19ncm91cChwKSAhPSBwcm9jZXNzX2dyb3VwKGZhdGhlcikpICYmCi0JICAgIChwLT5zaWduYWwtPnNlc3Npb24gPT0gZmF0aGVyLT5zaWduYWwtPnNlc3Npb24pKSB7CisJICAgIChwcm9jZXNzX3Nlc3Npb24ocCkgPT0gcHJvY2Vzc19zZXNzaW9uKGZhdGhlcikpKSB7CiAJCWludCBwZ3JwID0gcHJvY2Vzc19ncm91cChwKTsKIAotCQlpZiAod2lsbF9iZWNvbWVfb3JwaGFuZWRfcGdycChwZ3JwLCBOVUxMKSAmJiBoYXNfc3RvcHBlZF9qb2JzKHBncnApKSB7CisJCWlmICh3aWxsX2JlY29tZV9vcnBoYW5lZF9wZ3JwKHBncnAsIE5VTEwpICYmCisJCSAgICBoYXNfc3RvcHBlZF9qb2JzKHBncnApKSB7CiAJCQlfX2tpbGxfcGdfaW5mbyhTSUdIVVAsIFNFTkRfU0lHX1BSSVYsIHBncnApOwogCQkJX19raWxsX3BnX2luZm8oU0lHQ09OVCwgU0VORF9TSUdfUFJJViwgcGdycCk7CiAJCX0KQEAgLTY2Miw3ICs2NTgsOCBAQAogICogV2hlbiB3ZSBkaWUsIHdlIHJlLXBhcmVudCBhbGwgb3VyIGNoaWxkcmVuLgogICogVHJ5IHRvIGdpdmUgdGhlbSB0byBhbm90aGVyIHRocmVhZCBpbiBvdXIgdGhyZWFkCiAgKiBncm91cCwgYW5kIGlmIG5vIHN1Y2ggbWVtYmVyIGV4aXN0cywgZ2l2ZSBpdCB0bwotICogdGhlIGdsb2JhbCBjaGlsZCByZWFwZXIgcHJvY2VzcyAoaWUgImluaXQiKQorICogdGhlIGNoaWxkIHJlYXBlciBwcm9jZXNzIChpZSAiaW5pdCIpIGluIG91ciBwaWQKKyAqIHNwYWNlLgogICovCiBzdGF0aWMgdm9pZAogZm9yZ2V0X29yaWdpbmFsX3BhcmVudChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZhdGhlciwgc3RydWN0IGxpc3RfaGVhZCAqdG9fcmVsZWFzZSkKQEAgLTY3Myw3ICs2NzAsNyBAQAogCWRvIHsKIAkJcmVhcGVyID0gbmV4dF90aHJlYWQocmVhcGVyKTsKIAkJaWYgKHJlYXBlciA9PSBmYXRoZXIpIHsKLQkJCXJlYXBlciA9IGNoaWxkX3JlYXBlcjsKKwkJCXJlYXBlciA9IGNoaWxkX3JlYXBlcihmYXRoZXIpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChyZWFwZXItPmV4aXRfc3RhdGUpOwpAQCAtNzg1LDcgKzc4Miw3IEBACiAJdCA9IHRzay0+cmVhbF9wYXJlbnQ7CiAJCiAJaWYgKChwcm9jZXNzX2dyb3VwKHQpICE9IHByb2Nlc3NfZ3JvdXAodHNrKSkgJiYKLQkgICAgKHQtPnNpZ25hbC0+c2Vzc2lvbiA9PSB0c2stPnNpZ25hbC0+c2Vzc2lvbikgJiYKKwkgICAgKHByb2Nlc3Nfc2Vzc2lvbih0KSA9PSBwcm9jZXNzX3Nlc3Npb24odHNrKSkgJiYKIAkgICAgd2lsbF9iZWNvbWVfb3JwaGFuZWRfcGdycChwcm9jZXNzX2dyb3VwKHRzayksIHRzaykgJiYKIAkgICAgaGFzX3N0b3BwZWRfam9icyhwcm9jZXNzX2dyb3VwKHRzaykpKSB7CiAJCV9fa2lsbF9wZ19pbmZvKFNJR0hVUCwgU0VORF9TSUdfUFJJViwgcHJvY2Vzc19ncm91cCh0c2spKTsKQEAgLTg0OSw5ICs4NDYsNyBAQAogZmFzdGNhbGwgTk9SRVRfVFlQRSB2b2lkIGRvX2V4aXQobG9uZyBjb2RlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQlzdHJ1Y3QgdGFza3N0YXRzICp0aWRzdGF0czsKIAlpbnQgZ3JvdXBfZGVhZDsKLQl1bnNpZ25lZCBpbnQgbXljcHU7CiAKIAlwcm9maWxlX3Rhc2tfZXhpdCh0c2spOwogCkBAIC04NjEsOCArODU2LDEzIEBACiAJCXBhbmljKCJBaWVlLCBraWxsaW5nIGludGVycnVwdCBoYW5kbGVyISIpOwogCWlmICh1bmxpa2VseSghdHNrLT5waWQpKQogCQlwYW5pYygiQXR0ZW1wdGVkIHRvIGtpbGwgdGhlIGlkbGUgdGFzayEiKTsKLQlpZiAodW5saWtlbHkodHNrID09IGNoaWxkX3JlYXBlcikpCi0JCXBhbmljKCJBdHRlbXB0ZWQgdG8ga2lsbCBpbml0ISIpOworCWlmICh1bmxpa2VseSh0c2sgPT0gY2hpbGRfcmVhcGVyKHRzaykpKSB7CisJCWlmICh0c2stPm5zcHJveHktPnBpZF9ucyAhPSAmaW5pdF9waWRfbnMpCisJCQl0c2stPm5zcHJveHktPnBpZF9ucy0+Y2hpbGRfcmVhcGVyID0gaW5pdF9waWRfbnMuY2hpbGRfcmVhcGVyOworCQllbHNlCisJCQlwYW5pYygiQXR0ZW1wdGVkIHRvIGtpbGwgaW5pdCEiKTsKKwl9CisKIAogCWlmICh1bmxpa2VseShjdXJyZW50LT5wdHJhY2UgJiBQVF9UUkFDRV9FWElUKSkgewogCQljdXJyZW50LT5wdHJhY2VfbWVzc2FnZSA9IGNvZGU7CkBAIC04ODksOCArODg5LDYgQEAKIAkJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCiAJCQkJcHJlZW1wdF9jb3VudCgpKTsKIAotCXRhc2tzdGF0c19leGl0X2FsbG9jKCZ0aWRzdGF0cywgJm15Y3B1KTsKLQogCWFjY3RfdXBkYXRlX2ludGVncmFscyh0c2spOwogCWlmICh0c2stPm1tKSB7CiAJCXVwZGF0ZV9oaXdhdGVyX3Jzcyh0c2stPm1tKTsKQEAgLTkxMCw4ICs5MDgsOCBAQAogI2VuZGlmCiAJaWYgKHVubGlrZWx5KHRzay0+YXVkaXRfY29udGV4dCkpCiAJCWF1ZGl0X2ZyZWUodHNrKTsKLQl0YXNrc3RhdHNfZXhpdF9zZW5kKHRzaywgdGlkc3RhdHMsIGdyb3VwX2RlYWQsIG15Y3B1KTsKLQl0YXNrc3RhdHNfZXhpdF9mcmVlKHRpZHN0YXRzKTsKKworCXRhc2tzdGF0c19leGl0KHRzaywgZ3JvdXBfZGVhZCk7CiAKIAlleGl0X21tKHRzayk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDdkYzYxNDAuLmZjNzIzZTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgpAQCAtODIsMjYgKzgzLDI2IEBACiAjaWZuZGVmIF9fSEFWRV9BUkNIX1RBU0tfU1RSVUNUX0FMTE9DQVRPUgogIyBkZWZpbmUgYWxsb2NfdGFza19zdHJ1Y3QoKQlrbWVtX2NhY2hlX2FsbG9jKHRhc2tfc3RydWN0X2NhY2hlcCwgR0ZQX0tFUk5FTCkKICMgZGVmaW5lIGZyZWVfdGFza19zdHJ1Y3QodHNrKQlrbWVtX2NhY2hlX2ZyZWUodGFza19zdHJ1Y3RfY2FjaGVwLCAodHNrKSkKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnRhc2tfc3RydWN0X2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqdGFza19zdHJ1Y3RfY2FjaGVwOwogI2VuZGlmCiAKIC8qIFNMQUIgY2FjaGUgZm9yIHNpZ25hbF9zdHJ1Y3Qgc3RydWN0dXJlcyAodHNrLT5zaWduYWwpICovCi1zdGF0aWMga21lbV9jYWNoZV90ICpzaWduYWxfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzaWduYWxfY2FjaGVwOwogCiAvKiBTTEFCIGNhY2hlIGZvciBzaWdoYW5kX3N0cnVjdCBzdHJ1Y3R1cmVzICh0c2stPnNpZ2hhbmQpICovCi1rbWVtX2NhY2hlX3QgKnNpZ2hhbmRfY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUgKnNpZ2hhbmRfY2FjaGVwOwogCiAvKiBTTEFCIGNhY2hlIGZvciBmaWxlc19zdHJ1Y3Qgc3RydWN0dXJlcyAodHNrLT5maWxlcykgKi8KLWttZW1fY2FjaGVfdCAqZmlsZXNfY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUgKmZpbGVzX2NhY2hlcDsKIAogLyogU0xBQiBjYWNoZSBmb3IgZnNfc3RydWN0IHN0cnVjdHVyZXMgKHRzay0+ZnMpICovCi1rbWVtX2NhY2hlX3QgKmZzX2NhY2hlcDsKK3N0cnVjdCBrbWVtX2NhY2hlICpmc19jYWNoZXA7CiAKIC8qIFNMQUIgY2FjaGUgZm9yIHZtX2FyZWFfc3RydWN0IHN0cnVjdHVyZXMgKi8KLWttZW1fY2FjaGVfdCAqdm1fYXJlYV9jYWNoZXA7CitzdHJ1Y3Qga21lbV9jYWNoZSAqdm1fYXJlYV9jYWNoZXA7CiAKIC8qIFNMQUIgY2FjaGUgZm9yIG1tX3N0cnVjdCBzdHJ1Y3R1cmVzICh0c2stPm1tKSAqLwotc3RhdGljIGttZW1fY2FjaGVfdCAqbW1fY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptbV9jYWNoZXA7CiAKIHZvaWQgZnJlZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewpAQCAtMjAyLDcgKzIwMyw3IEBACiAJc3RydWN0IG1lbXBvbGljeSAqcG9sOwogCiAJZG93bl93cml0ZSgmb2xkbW0tPm1tYXBfc2VtKTsKLQlmbHVzaF9jYWNoZV9tbShvbGRtbSk7CisJZmx1c2hfY2FjaGVfZHVwX21tKG9sZG1tKTsKIAkvKgogCSAqIE5vdCBsaW5rZWQgaW4geWV0IC0gbm8gZGVhZGxvY2sgcG90ZW50aWFsOgogCSAqLwpAQCAtMjM3LDcgKzIzOCw3IEBACiAJCQkJZ290byBmYWlsX25vbWVtOwogCQkJY2hhcmdlID0gbGVuOwogCQl9Ci0JCXRtcCA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwkJdG1wID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdG1wKQogCQkJZ290byBmYWlsX25vbWVtOwogCQkqdG1wID0gKm1wbnQ7CkBAIC0yNTIsNyArMjUzLDcgQEAKIAkJYW5vbl92bWFfbGluayh0bXApOwogCQlmaWxlID0gdG1wLT52bV9maWxlOwogCQlpZiAoZmlsZSkgewotCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJCQlnZXRfZmlsZShmaWxlKTsKIAkJCWlmICh0bXAtPnZtX2ZsYWdzICYgVk1fREVOWVdSSVRFKQogCQkJCWF0b21pY19kZWMoJmlub2RlLT5pX3dyaXRlY291bnQpOwpAQCAtMzE5LDcgKzMyMCw3IEBACiAKICBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0sobW1saXN0X2xvY2spOwogCi0jZGVmaW5lIGFsbG9jYXRlX21tKCkJKGttZW1fY2FjaGVfYWxsb2MobW1fY2FjaGVwLCBTTEFCX0tFUk5FTCkpCisjZGVmaW5lIGFsbG9jYXRlX21tKCkJKGttZW1fY2FjaGVfYWxsb2MobW1fY2FjaGVwLCBHRlBfS0VSTkVMKSkKICNkZWZpbmUgZnJlZV9tbShtbSkJKGttZW1fY2FjaGVfZnJlZShtbV9jYWNoZXAsIChtbSkpKQogCiAjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+CkBAIC00NDgsNyArNDQ5LDE2IEBACiAJCXRzay0+dmZvcmtfZG9uZSA9IE5VTEw7CiAJCWNvbXBsZXRlKHZmb3JrX2RvbmUpOwogCX0KLQlpZiAodHNrLT5jbGVhcl9jaGlsZF90aWQgJiYgYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPiAxKSB7CisKKwkvKgorCSAqIElmIHdlJ3JlIGV4aXRpbmcgbm9ybWFsbHksIGNsZWFyIGEgdXNlci1zcGFjZSB0aWQgZmllbGQgaWYKKwkgKiByZXF1ZXN0ZWQuICBXZSBsZWF2ZSB0aGlzIGFsb25lIHdoZW4gZHlpbmcgYnkgc2lnbmFsLCB0byBsZWF2ZQorCSAqIHRoZSB2YWx1ZSBpbnRhY3QgaW4gYSBjb3JlIGR1bXAsIGFuZCB0byBzYXZlIHRoZSB1bm5lY2Vzc2FyeQorCSAqIHRyb3VibGUgb3RoZXJ3aXNlLiAgVXNlcmxhbmQgb25seSB3YW50cyB0aGlzIGRvbmUgZm9yIGEgc3lzX2V4aXQuCisJICovCisJaWYgKHRzay0+Y2xlYXJfY2hpbGRfdGlkCisJICAgICYmICEodHNrLT5mbGFncyAmIFBGX1NJR05BTEVEKQorCSAgICAmJiBhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA+IDEpIHsKIAkJdTMyIF9fdXNlciAqIHRpZHB0ciA9IHRzay0+Y2xlYXJfY2hpbGRfdGlkOwogCQl0c2stPmNsZWFyX2NoaWxkX3RpZCA9IE5VTEw7CiAKQEAgLTQ3OSw2ICs0ODksMTAgQEAKIAogCW1lbWNweShtbSwgb2xkbW0sIHNpemVvZigqbW0pKTsKIAorCS8qIEluaXRpYWxpemluZyBmb3IgU3dhcCB0b2tlbiBzdHVmZiAqLworCW1tLT50b2tlbl9wcmlvcml0eSA9IDA7CisJbW0tPmxhc3RfaW50ZXJ2YWwgPSAwOworCiAJaWYgKCFtbV9pbml0KG1tKSkKIAkJZ290byBmYWlsX25vbWVtOwogCkBAIC01NDIsNiArNTU2LDEwIEBACiAJCWdvdG8gZmFpbF9ub21lbTsKIAogZ29vZF9tbToKKwkvKiBJbml0aWFsaXppbmcgZm9yIFN3YXAgdG9rZW4gc3R1ZmYgKi8KKwltbS0+dG9rZW5fcHJpb3JpdHkgPSAwOworCW1tLT5sYXN0X2ludGVydmFsID0gMDsKKwogCXRzay0+bW0gPSBtbTsKIAl0c2stPmFjdGl2ZV9tbSA9IG1tOwogCXJldHVybiAwOwpAQCAtNTk2LDcgKzYxNCw3IEBACiAKIHN0YXRpYyBpbnQgY291bnRfb3Blbl9maWxlcyhzdHJ1Y3QgZmR0YWJsZSAqZmR0KQogewotCWludCBzaXplID0gZmR0LT5tYXhfZmRzZXQ7CisJaW50IHNpemUgPSBmZHQtPm1heF9mZHM7CiAJaW50IGk7CiAKIAkvKiBGaW5kIHRoZSBsYXN0IG9wZW4gZmQgKi8KQEAgLTYxMyw3ICs2MzEsNyBAQAogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7CiAJc3RydWN0IGZkdGFibGUgKmZkdDsKIAotCW5ld2YgPSBrbWVtX2NhY2hlX2FsbG9jKGZpbGVzX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCW5ld2YgPSBrbWVtX2NhY2hlX2FsbG9jKGZpbGVzX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdmKQogCQlnb3RvIG91dDsKIApAQCAtNjIzLDEyICs2NDEsMTAgQEAKIAluZXdmLT5uZXh0X2ZkID0gMDsKIAlmZHQgPSAmbmV3Zi0+ZmR0YWI7CiAJZmR0LT5tYXhfZmRzID0gTlJfT1BFTl9ERUZBVUxUOwotCWZkdC0+bWF4X2Zkc2V0ID0gRU1CRURERURfRkRfU0VUX1NJWkU7CiAJZmR0LT5jbG9zZV9vbl9leGVjID0gKGZkX3NldCAqKSZuZXdmLT5jbG9zZV9vbl9leGVjX2luaXQ7CiAJZmR0LT5vcGVuX2ZkcyA9IChmZF9zZXQgKikmbmV3Zi0+b3Blbl9mZHNfaW5pdDsKIAlmZHQtPmZkID0gJm5ld2YtPmZkX2FycmF5WzBdOwogCUlOSVRfUkNVX0hFQUQoJmZkdC0+cmN1KTsKLQlmZHQtPmZyZWVfZmlsZXMgPSBOVUxMOwogCWZkdC0+bmV4dCA9IE5VTEw7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKG5ld2YtPmZkdCwgZmR0KTsKIG91dDoKQEAgLTY0NCw3ICs2NjAsNyBAQAogewogCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7CiAJc3RydWN0IGZpbGUgKipvbGRfZmRzLCAqKm5ld19mZHM7Ci0JaW50IG9wZW5fZmlsZXMsIHNpemUsIGksIGV4cGFuZDsKKwlpbnQgb3Blbl9maWxlcywgc2l6ZSwgaTsKIAlzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7CiAKIAkqZXJyb3JwID0gLUVOT01FTTsKQEAgLTY1NSwyNSArNjcxLDE0IEBACiAJc3Bpbl9sb2NrKCZvbGRmLT5maWxlX2xvY2spOwogCW9sZF9mZHQgPSBmaWxlc19mZHRhYmxlKG9sZGYpOwogCW5ld19mZHQgPSBmaWxlc19mZHRhYmxlKG5ld2YpOwotCXNpemUgPSBvbGRfZmR0LT5tYXhfZmRzZXQ7CiAJb3Blbl9maWxlcyA9IGNvdW50X29wZW5fZmlsZXMob2xkX2ZkdCk7Ci0JZXhwYW5kID0gMDsKIAogCS8qCi0JICogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbGFyZ2VyIGZkIGFycmF5IG9yIGZkIHNldC4KLQkgKiBOb3RlOiB3ZSdyZSBub3QgYSBjbG9uZSB0YXNrLCBzbyB0aGUgb3BlbiBjb3VudCB3b24ndCAgY2hhbmdlLgorCSAqIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIGxhcmdlciBmZCBhcnJheSBhbmQgZmQgc2V0LgorCSAqIE5vdGU6IHdlJ3JlIG5vdCBhIGNsb25lIHRhc2ssIHNvIHRoZSBvcGVuIGNvdW50IHdvbid0IGNoYW5nZS4KIAkgKi8KLQlpZiAob3Blbl9maWxlcyA+IG5ld19mZHQtPm1heF9mZHNldCkgewotCQluZXdfZmR0LT5tYXhfZmRzZXQgPSAwOwotCQlleHBhbmQgPSAxOwotCX0KIAlpZiAob3Blbl9maWxlcyA+IG5ld19mZHQtPm1heF9mZHMpIHsKIAkJbmV3X2ZkdC0+bWF4X2ZkcyA9IDA7Ci0JCWV4cGFuZCA9IDE7Ci0JfQotCi0JLyogaWYgdGhlIG9sZCBmZHNldCBnZXRzIGdyb3duIG5vdywgd2UnbGwgb25seSBjb3B5IHVwIHRvICJzaXplIiBmZHMgKi8KLQlpZiAoZXhwYW5kKSB7CiAJCXNwaW5fdW5sb2NrKCZvbGRmLT5maWxlX2xvY2spOwogCQlzcGluX2xvY2soJm5ld2YtPmZpbGVfbG9jayk7CiAJCSplcnJvcnAgPSBleHBhbmRfZmlsZXMobmV3Ziwgb3Blbl9maWxlcy0xKTsKQEAgLTY5Myw4ICs2OTgsMTAgQEAKIAlvbGRfZmRzID0gb2xkX2ZkdC0+ZmQ7CiAJbmV3X2ZkcyA9IG5ld19mZHQtPmZkOwogCi0JbWVtY3B5KG5ld19mZHQtPm9wZW5fZmRzLT5mZHNfYml0cywgb2xkX2ZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLCBvcGVuX2ZpbGVzLzgpOwotCW1lbWNweShuZXdfZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0cywgb2xkX2ZkdC0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHMsIG9wZW5fZmlsZXMvOCk7CisJbWVtY3B5KG5ld19mZHQtPm9wZW5fZmRzLT5mZHNfYml0cywKKwkJb2xkX2ZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLCBvcGVuX2ZpbGVzLzgpOworCW1lbWNweShuZXdfZmR0LT5jbG9zZV9vbl9leGVjLT5mZHNfYml0cywKKwkJb2xkX2ZkdC0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHMsIG9wZW5fZmlsZXMvOCk7CiAKIAlmb3IgKGkgPSBvcGVuX2ZpbGVzOyBpICE9IDA7IGktLSkgewogCQlzdHJ1Y3QgZmlsZSAqZiA9ICpvbGRfZmRzKys7CkBAIC03MTksMjIgKzcyNiwxOSBAQAogCS8qIFRoaXMgaXMgbG9uZyB3b3JkIGFsaWduZWQgdGh1cyBjb3VsZCB1c2UgYSBvcHRpbWl6ZWQgdmVyc2lvbiAqLyAKIAltZW1zZXQobmV3X2ZkcywgMCwgc2l6ZSk7IAogCi0JaWYgKG5ld19mZHQtPm1heF9mZHNldCA+IG9wZW5fZmlsZXMpIHsKLQkJaW50IGxlZnQgPSAobmV3X2ZkdC0+bWF4X2Zkc2V0LW9wZW5fZmlsZXMpLzg7CisJaWYgKG5ld19mZHQtPm1heF9mZHMgPiBvcGVuX2ZpbGVzKSB7CisJCWludCBsZWZ0ID0gKG5ld19mZHQtPm1heF9mZHMtb3Blbl9maWxlcykvODsKIAkJaW50IHN0YXJ0ID0gb3Blbl9maWxlcyAvICg4ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAogCQltZW1zZXQoJm5ld19mZHQtPm9wZW5fZmRzLT5mZHNfYml0c1tzdGFydF0sIDAsIGxlZnQpOwogCQltZW1zZXQoJm5ld19mZHQtPmNsb3NlX29uX2V4ZWMtPmZkc19iaXRzW3N0YXJ0XSwgMCwgbGVmdCk7CiAJfQogCi1vdXQ6CiAJcmV0dXJuIG5ld2Y7CiAKIG91dF9yZWxlYXNlOgotCWZyZWVfZmRzZXQgKG5ld19mZHQtPmNsb3NlX29uX2V4ZWMsIG5ld19mZHQtPm1heF9mZHNldCk7Ci0JZnJlZV9mZHNldCAobmV3X2ZkdC0+b3Blbl9mZHMsIG5ld19mZHQtPm1heF9mZHNldCk7Ci0JZnJlZV9mZF9hcnJheShuZXdfZmR0LT5mZCwgbmV3X2ZkdC0+bWF4X2Zkcyk7CiAJa21lbV9jYWNoZV9mcmVlKGZpbGVzX2NhY2hlcCwgbmV3Zik7CitvdXQ6CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTgzMCw3ICs4MzQsNiBAQAogCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1RIUkVBRCkgewogCQlhdG9taWNfaW5jKCZjdXJyZW50LT5zaWduYWwtPmNvdW50KTsKIAkJYXRvbWljX2luYygmY3VycmVudC0+c2lnbmFsLT5saXZlKTsKLQkJdGFza3N0YXRzX3RnaWRfYWxsb2MoY3VycmVudC0+c2lnbmFsKTsKIAkJcmV0dXJuIDA7CiAJfQogCXNpZyA9IGttZW1fY2FjaGVfYWxsb2Moc2lnbmFsX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CkBAIC04OTcsNyArOTAwLDYgQEAKIHZvaWQgX19jbGVhbnVwX3NpZ25hbChzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQogewogCWV4aXRfdGhyZWFkX2dyb3VwX2tleXMoc2lnKTsKLQl0YXNrc3RhdHNfdGdpZF9mcmVlKHNpZyk7CiAJa21lbV9jYWNoZV9mcmVlKHNpZ25hbF9jYWNoZXAsIHNpZyk7CiB9CiAKQEAgLTk4NCw2ICs5ODYsOCBAQAogCWlmICghcCkKIAkJZ290byBmb3JrX291dDsKIAorCXJ0X211dGV4X2luaXRfdGFzayhwKTsKKwogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwogCURFQlVHX0xPQ0tTX1dBUk5fT04oIXAtPmhhcmRpcnFzX2VuYWJsZWQpOwogCURFQlVHX0xPQ0tTX1dBUk5fT04oIXAtPnNvZnRpcnFzX2VuYWJsZWQpOwpAQCAtMTAzOCw2ICsxMDQyLDcgQEAKIAlwLT53Y2hhciA9IDA7CQkvKiBJL08gY291bnRlcjogYnl0ZXMgd3JpdHRlbiAqLwogCXAtPnN5c2NyID0gMDsJCS8qIEkvTyBjb3VudGVyOiByZWFkIHN5c2NhbGxzICovCiAJcC0+c3lzY3cgPSAwOwkJLyogSS9PIGNvdW50ZXI6IHdyaXRlIHN5c2NhbGxzICovCisJdGFza19pb19hY2NvdW50aW5nX2luaXQocCk7CiAJYWNjdF9jbGVhcl9pbnRlZ3JhbHMocCk7CiAKICAJcC0+aXRfdmlydF9leHBpcmVzID0gY3B1dGltZV96ZXJvOwpAQCAtMTA4OCw4ICsxMDkzLDYgQEAKIAlwLT5sb2NrZGVwX3JlY3Vyc2lvbiA9IDA7CiAjZW5kaWYKIAotCXJ0X211dGV4X2luaXRfdGFzayhwKTsKLQogI2lmZGVmIENPTkZJR19ERUJVR19NVVRFWEVTCiAJcC0+YmxvY2tlZF9vbiA9IE5VTEw7IC8qIG5vdCBibG9ja2VkIHlldCAqLwogI2VuZGlmCkBAIC0xMjQ0LDkgKzEyNDcsOSBAQAogCQlpZiAodGhyZWFkX2dyb3VwX2xlYWRlcihwKSkgewogCQkJcC0+c2lnbmFsLT50dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsKIAkJCXAtPnNpZ25hbC0+cGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7Ci0JCQlwLT5zaWduYWwtPnNlc3Npb24gPSBjdXJyZW50LT5zaWduYWwtPnNlc3Npb247CisJCQlzZXRfc2lnbmFsX3Nlc3Npb24ocC0+c2lnbmFsLCBwcm9jZXNzX3Nlc3Npb24oY3VycmVudCkpOwogCQkJYXR0YWNoX3BpZChwLCBQSURUWVBFX1BHSUQsIHByb2Nlc3NfZ3JvdXAocCkpOwotCQkJYXR0YWNoX3BpZChwLCBQSURUWVBFX1NJRCwgcC0+c2lnbmFsLT5zZXNzaW9uKTsKKwkJCWF0dGFjaF9waWQocCwgUElEVFlQRV9TSUQsIHByb2Nlc3Nfc2Vzc2lvbihwKSk7CiAKIAkJCWxpc3RfYWRkX3RhaWxfcmN1KCZwLT50YXNrcywgJmluaXRfdGFzay50YXNrcyk7CiAJCQlfX2dldF9jcHVfdmFyKHByb2Nlc3NfY291bnRzKSsrOwpAQCAtMTMwNCw3ICsxMzA3LDcgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOwogfQogCi1zdHJ1Y3QgcHRfcmVncyAqIF9fZGV2aW5pdCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgaWRsZV9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorbm9pbmxpbmUgc3RydWN0IHB0X3JlZ3MgKiBfX2RldmluaXQgX19hdHRyaWJ1dGVfXygod2VhaykpIGlkbGVfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAltZW1zZXQocmVncywgMCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CiAJcmV0dXJuIHJlZ3M7CkBAIC0xMzE2LDkgKzEzMTksOCBAQAogCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAKIAl0YXNrID0gY29weV9wcm9jZXNzKENMT05FX1ZNLCAwLCBpZGxlX3JlZ3MoJnJlZ3MpLCAwLCBOVUxMLCBOVUxMLCAwKTsKLQlpZiAoIXRhc2spCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWluaXRfaWRsZSh0YXNrLCBjcHUpOworCWlmICghSVNfRVJSKHRhc2spKQorCQlpbml0X2lkbGUodGFzaywgY3B1KTsKIAogCXJldHVybiB0YXNrOwogfQpAQCAtMTQxNSw3ICsxNDE3LDcgQEAKICNkZWZpbmUgQVJDSF9NSU5fTU1TVFJVQ1RfQUxJR04gMAogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHNpZ2hhbmRfY3Rvcih2b2lkICpkYXRhLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIHNpZ2hhbmRfY3Rvcih2b2lkICpkYXRhLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqc2lnaGFuZCA9IGRhdGE7CiAKQEAgLTE1MTEsMTcgKzE1MTMsMTggQEAKIH0KIAogLyoKLSAqIFVuc2hhcmUgdGhlIG5hbWVzcGFjZSBzdHJ1Y3R1cmUgaWYgaXQgaXMgYmVpbmcgc2hhcmVkCisgKiBVbnNoYXJlIHRoZSBtbnRfbmFtZXNwYWNlIHN0cnVjdHVyZSBpZiBpdCBpcyBiZWluZyBzaGFyZWQKICAqLwotc3RhdGljIGludCB1bnNoYXJlX25hbWVzcGFjZSh1bnNpZ25lZCBsb25nIHVuc2hhcmVfZmxhZ3MsIHN0cnVjdCBuYW1lc3BhY2UgKipuZXdfbnNwLCBzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpCitzdGF0aWMgaW50IHVuc2hhcmVfbW50X25hbWVzcGFjZSh1bnNpZ25lZCBsb25nIHVuc2hhcmVfZmxhZ3MsCisJCXN0cnVjdCBtbnRfbmFtZXNwYWNlICoqbmV3X25zcCwgc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKQogewotCXN0cnVjdCBuYW1lc3BhY2UgKm5zID0gY3VycmVudC0+bnNwcm94eS0+bmFtZXNwYWNlOworCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpucyA9IGN1cnJlbnQtPm5zcHJveHktPm1udF9uczsKIAogCWlmICgodW5zaGFyZV9mbGFncyAmIENMT05FX05FV05TKSAmJiBucykgewogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwogCi0JCSpuZXdfbnNwID0gZHVwX25hbWVzcGFjZShjdXJyZW50LCBuZXdfZnMgPyBuZXdfZnMgOiBjdXJyZW50LT5mcyk7CisJCSpuZXdfbnNwID0gZHVwX21udF9ucyhjdXJyZW50LCBuZXdfZnMgPyBuZXdfZnMgOiBjdXJyZW50LT5mcyk7CiAJCWlmICghKm5ld19uc3ApCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xNTMwLDE1ICsxNTMzLDEzIEBACiB9CiAKIC8qCi0gKiBVbnNoYXJpbmcgb2Ygc2lnaGFuZCBmb3IgdGFza3MgY3JlYXRlZCB3aXRoIENMT05FX1NJR0hBTkQgaXMgbm90Ci0gKiBzdXBwb3J0ZWQgeWV0CisgKiBVbnNoYXJpbmcgb2Ygc2lnaGFuZCBpcyBub3Qgc3VwcG9ydGVkIHlldAogICovCiBzdGF0aWMgaW50IHVuc2hhcmVfc2lnaGFuZCh1bnNpZ25lZCBsb25nIHVuc2hhcmVfZmxhZ3MsIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqKm5ld19zaWdocCkKIHsKIAlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKnNpZ2ggPSBjdXJyZW50LT5zaWdoYW5kOwogCi0JaWYgKCh1bnNoYXJlX2ZsYWdzICYgQ0xPTkVfU0lHSEFORCkgJiYKLQkgICAgKHNpZ2ggJiYgYXRvbWljX3JlYWQoJnNpZ2gtPmNvdW50KSA+IDEpKQorCWlmICgodW5zaGFyZV9mbGFncyAmIENMT05FX1NJR0hBTkQpICYmIGF0b21pY19yZWFkKCZzaWdoLT5jb3VudCkgPiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAllbHNlCiAJCXJldHVybiAwOwpAQCAtMTYxMSw4ICsxNjEyLDggQEAKIHsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgZnNfc3RydWN0ICpmcywgKm5ld19mcyA9IE5VTEw7Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbnMsICpuZXdfbnMgPSBOVUxMOwotCXN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqc2lnaCwgKm5ld19zaWdoID0gTlVMTDsKKwlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMsICpuZXdfbnMgPSBOVUxMOworCXN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqbmV3X3NpZ2ggPSBOVUxMOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCAqbmV3X21tID0gTlVMTCwgKmFjdGl2ZV9tbSA9IE5VTEw7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmQsICpuZXdfZmQgPSBOVUxMOwogCXN0cnVjdCBzZW1fdW5kb19saXN0ICpuZXdfdWxpc3QgPSBOVUxMOwpAQCAtMTYzMyw3ICsxNjM0LDcgQEAKIAkJZ290byBiYWRfdW5zaGFyZV9vdXQ7CiAJaWYgKChlcnIgPSB1bnNoYXJlX2ZzKHVuc2hhcmVfZmxhZ3MsICZuZXdfZnMpKSkKIAkJZ290byBiYWRfdW5zaGFyZV9jbGVhbnVwX3RocmVhZDsKLQlpZiAoKGVyciA9IHVuc2hhcmVfbmFtZXNwYWNlKHVuc2hhcmVfZmxhZ3MsICZuZXdfbnMsIG5ld19mcykpKQorCWlmICgoZXJyID0gdW5zaGFyZV9tbnRfbmFtZXNwYWNlKHVuc2hhcmVfZmxhZ3MsICZuZXdfbnMsIG5ld19mcykpKQogCQlnb3RvIGJhZF91bnNoYXJlX2NsZWFudXBfZnM7CiAJaWYgKChlcnIgPSB1bnNoYXJlX3NpZ2hhbmQodW5zaGFyZV9mbGFncywgJm5ld19zaWdoKSkpCiAJCWdvdG8gYmFkX3Vuc2hhcmVfY2xlYW51cF9uczsKQEAgLTE2NTcsNyArMTY1OCw3IEBACiAJCX0KIAl9CiAKLQlpZiAobmV3X2ZzIHx8IG5ld19ucyB8fCBuZXdfc2lnaCB8fCBuZXdfbW0gfHwgbmV3X2ZkIHx8IG5ld191bGlzdCB8fAorCWlmIChuZXdfZnMgfHwgbmV3X25zIHx8IG5ld19tbSB8fCBuZXdfZmQgfHwgbmV3X3VsaXN0IHx8CiAJCQkJbmV3X3V0cyB8fCBuZXdfaXBjKSB7CiAKIAkJdGFza19sb2NrKGN1cnJlbnQpOwpAQCAtMTY3NCwxNyArMTY3NSwxMSBAQAogCQl9CiAKIAkJaWYgKG5ld19ucykgewotCQkJbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5uYW1lc3BhY2U7Ci0JCQljdXJyZW50LT5uc3Byb3h5LT5uYW1lc3BhY2UgPSBuZXdfbnM7CisJCQlucyA9IGN1cnJlbnQtPm5zcHJveHktPm1udF9uczsKKwkJCWN1cnJlbnQtPm5zcHJveHktPm1udF9ucyA9IG5ld19uczsKIAkJCW5ld19ucyA9IG5zOwogCQl9CiAKLQkJaWYgKG5ld19zaWdoKSB7Ci0JCQlzaWdoID0gY3VycmVudC0+c2lnaGFuZDsKLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihjdXJyZW50LT5zaWdoYW5kLCBuZXdfc2lnaCk7Ci0JCQluZXdfc2lnaCA9IHNpZ2g7Ci0JCX0KLQogCQlpZiAobmV3X21tKSB7CiAJCQltbSA9IGN1cnJlbnQtPm1tOwogCQkJYWN0aXZlX21tID0gY3VycmVudC0+YWN0aXZlX21tOwpAQCAtMTc0Miw3ICsxNzM3LDcgQEAKIAogYmFkX3Vuc2hhcmVfY2xlYW51cF9uczoKIAlpZiAobmV3X25zKQotCQlwdXRfbmFtZXNwYWNlKG5ld19ucyk7CisJCXB1dF9tbnRfbnMobmV3X25zKTsKIAogYmFkX3Vuc2hhcmVfY2xlYW51cF9mczoKIAlpZiAobmV3X2ZzKQpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCBiMzY0ZTAwLi41YTczN2RlIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAvKgogICogR2V0IHBhcmFtZXRlcnMgd2hpY2ggYXJlIHRoZSBrZXlzIGZvciBhIGZ1dGV4LgogICoKLSAqIEZvciBzaGFyZWQgbWFwcGluZ3MsIGl0J3MgKHBhZ2UtPmluZGV4LCB2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorICogRm9yIHNoYXJlZCBtYXBwaW5ncywgaXQncyAocGFnZS0+aW5kZXgsIHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwKICAqIG9mZnNldF93aXRoaW5fcGFnZSkuICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgaXQncyAodWFkZHIsIGN1cnJlbnQtPm1tKS4KICAqIFdlIGNhbiB1c3VhbGx5IHdvcmsgb3V0IHRoZSBpbmRleCB3aXRob3V0IHN3YXBwaW5nIGluIHRoZSBwYWdlLgogICoKQEAgLTIyMyw3ICsyMjMsNyBAQAogCS8qCiAJICogTGluZWFyIGZpbGUgbWFwcGluZ3MgYXJlIGFsc28gc2ltcGxlLgogCSAqLwotCWtleS0+c2hhcmVkLmlub2RlID0gdm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlrZXktPnNoYXJlZC5pbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlrZXktPmJvdGgub2Zmc2V0Kys7IC8qIEJpdCAwIG9mIG9mZnNldCBpbmRpY2F0ZXMgaW5vZGUtYmFzZWQga2V5LiAqLwogCWlmIChsaWtlbHkoISh2bWEtPnZtX2ZsYWdzICYgVk1fTk9OTElORUFSKSkpIHsKIAkJa2V5LT5zaGFyZWQucGdvZmYgPSAoKChhZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCkKQEAgLTI4Miw5ICsyODIsOSBAQAogewogCWludCByZXQ7CiAKLQlpbmNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJcmV0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhkZXN0LCBmcm9tLCBzaXplb2YodTMyKSk7Ci0JZGVjX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlyZXR1cm4gcmV0ID8gLUVGQVVMVCA6IDA7CiB9CkBAIC0zMjQsMTIgKzMyNCwxMSBAQAogCWlmIChsaWtlbHkoY3VycmVudC0+cGlfc3RhdGVfY2FjaGUpKQogCQlyZXR1cm4gMDsKIAotCXBpX3N0YXRlID0ga21hbGxvYyhzaXplb2YoKnBpX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJcGlfc3RhdGUgPSBremFsbG9jKHNpemVvZigqcGlfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghcGlfc3RhdGUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtc2V0KHBpX3N0YXRlLCAwLCBzaXplb2YoKnBpX3N0YXRlKSk7CiAJSU5JVF9MSVNUX0hFQUQoJnBpX3N0YXRlLT5saXN0KTsKIAkvKiBwaV9tdXRleCBnZXRzIGluaXRpYWxpemVkIGxhdGVyICovCiAJcGlfc3RhdGUtPm93bmVyID0gTlVMTDsKQEAgLTU1Myw3ICs1NTIsNyBAQAogCSAqIGF0IHRoZSBlbmQgb2Ygd2FrZV91cF9hbGwoKSBkb2VzIG5vdCBwcmV2ZW50IHRoaXMgc3RvcmUgZnJvbQogCSAqIG1vdmluZy4KIAkgKi8KLQl3bWIoKTsKKwlzbXBfd21iKCk7CiAJcS0+bG9ja19wdHIgPSBOVUxMOwogfQogCkBAIC01ODUsOSArNTg0LDkgQEAKIAlpZiAoISh1dmFsICYgRlVURVhfT1dORVJfRElFRCkpIHsKIAkJbmV3dmFsID0gRlVURVhfV0FJVEVSUyB8IG5ld19vd25lci0+cGlkOwogCi0JCWluY19wcmVlbXB0X2NvdW50KCk7CisJCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwotCQlkZWNfcHJlZW1wdF9jb3VudCgpOworCQlwYWdlZmF1bHRfZW5hYmxlKCk7CiAJCWlmIChjdXJ2YWwgPT0gLUVGQVVMVCkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAoY3VydmFsICE9IHV2YWwpCkBAIC02MTgsOSArNjE3LDkgQEAKIAkgKiBUaGVyZSBpcyBubyB3YWl0ZXIsIHNvIHdlIHVubG9jayB0aGUgZnV0ZXguIFRoZSBvd25lciBkaWVkCiAJICogYml0IGhhcyBub3QgdG8gYmUgcHJlc2VydmVkIGhlcmUuIFdlIGFyZSB0aGUgb3duZXI6CiAJICovCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCW9sZHZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCAwKTsKLQlkZWNfcHJlZW1wdF9jb3VudCgpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAogCWlmIChvbGR2YWwgPT0gLUVGQVVMVCkKIAkJcmV0dXJuIG9sZHZhbDsKQEAgLTExNTgsOSArMTE1Nyw5IEBACiAJICovCiAJbmV3dmFsID0gY3VycmVudC0+cGlkOwogCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCAwLCBuZXd2YWwpOwotCWRlY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2VuYWJsZSgpOwogCiAJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKIAkJZ290byB1YWRkcl9mYXVsdGVkOwpAQCAtMTE4Myw5ICsxMTgyLDkgQEAKIAl1dmFsID0gY3VydmFsOwogCW5ld3ZhbCA9IHV2YWwgfCBGVVRFWF9XQUlURVJTOwogCi0JaW5jX3ByZWVtcHRfY291bnQoKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwotCWRlY19wcmVlbXB0X2NvdW50KCk7CisJcGFnZWZhdWx0X2VuYWJsZSgpOwogCiAJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKIAkJZ290byB1YWRkcl9mYXVsdGVkOwpAQCAtMTIxNSwxMCArMTIxNCwxMCBAQAogCQkJbmV3dmFsID0gY3VycmVudC0+cGlkIHwKIAkJCQlGVVRFWF9PV05FUl9ESUVEIHwgRlVURVhfV0FJVEVSUzsKIAotCQkJaW5jX3ByZWVtcHRfY291bnQoKTsKKwkJCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJCQljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwKIAkJCQkJCQkgICAgICAgdXZhbCwgbmV3dmFsKTsKLQkJCWRlY19wcmVlbXB0X2NvdW50KCk7CisJCQlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAkJCWlmICh1bmxpa2VseShjdXJ2YWwgPT0gLUVGQVVMVCkpCiAJCQkJZ290byB1YWRkcl9mYXVsdGVkOwpAQCAtMTM5MCw5ICsxMzg5LDkgQEAKIAkgKiBhbnlvbmUgZWxzZSB1cDoKIAkgKi8KIAlpZiAoISh1dmFsICYgRlVURVhfT1dORVJfRElFRCkpIHsKLQkJaW5jX3ByZWVtcHRfY291bnQoKTsKKwkJcGFnZWZhdWx0X2Rpc2FibGUoKTsKIAkJdXZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCBjdXJyZW50LT5waWQsIDApOwotCQlkZWNfcHJlZW1wdF9jb3VudCgpOworCQlwYWdlZmF1bHRfZW5hYmxlKCk7CiAJfQogCiAJaWYgKHVubGlrZWx5KHV2YWwgPT0gLUVGQVVMVCkpCkBAIC0xNDkzLDcgKzE0OTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1dGV4X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdXRleF9mb3BzID0gewogCS5yZWxlYXNlCT0gZnV0ZXhfY2xvc2UsCiAJLnBvbGwJCT0gZnV0ZXhfcG9sbCwKIH07CkBAIC0xNTA3LDYgKzE1MDYsMTMgQEAKIAlzdHJ1Y3QgZnV0ZXhfcSAqcTsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlpbnQgcmV0LCBlcnI7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJpbnRrX2ludGVydmFsOworCisJaWYgKHByaW50a190aW1lZF9yYXRlbGltaXQoJnByaW50a19pbnRlcnZhbCwgNjAgKiA2MCAqIDEwMDApKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlByb2Nlc3MgYCVzJyB1c2VkIEZVVEVYX0ZELCB3aGljaCAiCisJCSAgICAJIndpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwgaW4gSnVuZSAyMDA3XG4iLAorCQkJY3VycmVudC0+Y29tbSk7CisJfQogCiAJcmV0ID0gLUVJTlZBTDsKIAlpZiAoIXZhbGlkX3NpZ25hbChzaWduYWwpKQpAQCAtMTUyMiw5ICsxNTI4LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCWZpbHAtPmZfb3AgPSAmZnV0ZXhfZm9wczsKLQlmaWxwLT5mX3Zmc21udCA9IG1udGdldChmdXRleF9tbnQpOwotCWZpbHAtPmZfZGVudHJ5ID0gZGdldChmdXRleF9tbnQtPm1udF9yb290KTsKLQlmaWxwLT5mX21hcHBpbmcgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWZpbHAtPmZfcGF0aC5tbnQgPSBtbnRnZXQoZnV0ZXhfbW50KTsKKwlmaWxwLT5mX3BhdGguZGVudHJ5ID0gZGdldChmdXRleF9tbnQtPm1udF9yb290KTsKKwlmaWxwLT5mX21hcHBpbmcgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAKIAlpZiAoc2lnbmFsKSB7CiAJCWVyciA9IF9fZl9zZXRvd24oZmlscCwgdGFza19waWQoY3VycmVudCksIFBJRFRZUEVfUElELCAxKTsKQEAgLTE4NTEsMTAgKzE4NTcsMTYgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBpOworCWludCBpID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZnV0ZXhfZnNfdHlwZSk7CiAKLQlyZWdpc3Rlcl9maWxlc3lzdGVtKCZmdXRleF9mc190eXBlKTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisKIAlmdXRleF9tbnQgPSBrZXJuX21vdW50KCZmdXRleF9mc190eXBlKTsKKwlpZiAoSVNfRVJSKGZ1dGV4X21udCkpIHsKKwkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZmdXRleF9mc190eXBlKTsKKwkJcmV0dXJuIFBUUl9FUlIoZnV0ZXhfbW50KTsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmdXRleF9xdWV1ZXMpOyBpKyspIHsKIAkJSU5JVF9MSVNUX0hFQUQoJmZ1dGV4X3F1ZXVlc1tpXS5jaGFpbik7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2NoaXAuYyBiL2tlcm5lbC9pcnEvY2hpcC5jCmluZGV4IDExYzk5NjkuLmViZmQyNGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvY2hpcC5jCkBAIC0yMzMsNiArMjMzLDggQEAKIAkJY2hpcC0+c2h1dGRvd24gPSBjaGlwLT5kaXNhYmxlOwogCWlmICghY2hpcC0+bmFtZSkKIAkJY2hpcC0+bmFtZSA9IGNoaXAtPnR5cGVuYW1lOworCWlmICghY2hpcC0+ZW5kKQorCQljaGlwLT5lbmQgPSBkdW1teV9pcnFfY2hpcC5lbmQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2Fja19pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgaXJxKQpAQCAtNDk5LDcgKzUwMSw4IEBACiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiB2b2lkCi1fX3NldF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlLCBpbnQgaXNfY2hhaW5lZCkKK19fc2V0X2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUsIGludCBpc19jaGFpbmVkLAorCQkgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC01NDAsNiArNTQzLDcgQEAKIAkJZGVzYy0+ZGVwdGggPSAxOwogCX0KIAlkZXNjLT5oYW5kbGVfaXJxID0gaGFuZGxlOworCWRlc2MtPm5hbWUgPSBuYW1lOwogCiAJaWYgKGhhbmRsZSAhPSBoYW5kbGVfYmFkX2lycSAmJiBpc19jaGFpbmVkKSB7CiAJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX0RJU0FCTEVEOwpAQCAtNTU1LDMwICs1NTksMTMgQEAKIAkJCSBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlKQogewogCXNldF9pcnFfY2hpcChpcnEsIGNoaXApOwotCV9fc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlLCAwKTsKKwlfX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZSwgMCwgTlVMTCk7CiB9CiAKLS8qCi0gKiBHZXQgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIHRoZSBoaWdobGV2ZWwgaGFuZGxlciwgZm9yCi0gKiAvcHJvYy9pbnRlcnJ1cHRzIG91dHB1dDoKLSAqLwotY29uc3QgY2hhciAqCi1oYW5kbGVfaXJxX25hbWUoaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZSkKK3ZvaWQKK3NldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfY2hpcCAqY2hpcCwKKwkJCSAgICAgIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JaWYgKGhhbmRsZSA9PSBoYW5kbGVfbGV2ZWxfaXJxKQotCQlyZXR1cm4gImxldmVsICAiOwotCWlmIChoYW5kbGUgPT0gaGFuZGxlX2Zhc3Rlb2lfaXJxKQotCQlyZXR1cm4gImZhc3Rlb2kiOwotCWlmIChoYW5kbGUgPT0gaGFuZGxlX2VkZ2VfaXJxKQotCQlyZXR1cm4gImVkZ2UgICAiOwotCWlmIChoYW5kbGUgPT0gaGFuZGxlX3NpbXBsZV9pcnEpCi0JCXJldHVybiAic2ltcGxlICI7Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmIChoYW5kbGUgPT0gaGFuZGxlX3BlcmNwdV9pcnEpCi0JCXJldHVybiAicGVyY3B1ICI7Ci0jZW5kaWYKLQlpZiAoaGFuZGxlID09IGhhbmRsZV9iYWRfaXJxKQotCQlyZXR1cm4gImJhZCAgICAiOwotCi0JcmV0dXJuIE5VTEw7CisJc2V0X2lycV9jaGlwKGlycSwgY2hpcCk7CisJX19zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGUsIDAsIG5hbWUpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9oYW5kbGUuYyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKaW5kZXggNDJhYTZmMS4uYWZmMWYwZiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9oYW5kbGUuYworKysgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCkBAIC01NCw3ICs1NCw3IEBACiAJCS5jaGlwID0gJm5vX2lycV9jaGlwLAogCQkuaGFuZGxlX2lycSA9IGhhbmRsZV9iYWRfaXJxLAogCQkuZGVwdGggPSAxLAotCQkubG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkJLmxvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChpcnFfZGVzYy0+bG9jayksCiAjaWZkZWYgQ09ORklHX1NNUAogCQkuYWZmaW5pdHkgPSBDUFVfTUFTS19BTEwKICNlbmRpZgpAQCAtMjMxLDEwICsyMzEsMTAgQEAKIAkJc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogCiAJCWFjdGlvbl9yZXQgPSBoYW5kbGVfSVJRX2V2ZW50KGlycSwgYWN0aW9uKTsKLQotCQlzcGluX2xvY2soJmRlc2MtPmxvY2spOwogCQlpZiAoIW5vaXJxZGVidWcpCiAJCQlub3RlX2ludGVycnVwdChpcnEsIGRlc2MsIGFjdGlvbl9yZXQpOworCisJCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CiAJCWlmIChsaWtlbHkoIShkZXNjLT5zdGF0dXMgJiBJUlFfUEVORElORykpKQogCQkJYnJlYWs7CiAJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX1BFTkRJTkc7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21hbmFnZS5jIGIva2VybmVsL2lycS9tYW5hZ2UuYwppbmRleCA2ODc5MjAyLi5iMzg1ODc4IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTIxNiw2ICsyMTYsNyBAQAogewogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwogCXN0cnVjdCBpcnFhY3Rpb24gKm9sZCwgKipwOworCWNvbnN0IGNoYXIgKm9sZF9uYW1lID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzaGFyZWQgPSAwOwogCkBAIC0yNTUsOCArMjU2LDEwIEBACiAJCSAqIHNldCB0aGUgdHJpZ2dlciB0eXBlIG11c3QgbWF0Y2guCiAJCSAqLwogCQlpZiAoISgob2xkLT5mbGFncyAmIG5ldy0+ZmxhZ3MpICYgSVJRRl9TSEFSRUQpIHx8Ci0JCSAgICAoKG9sZC0+ZmxhZ3MgXiBuZXctPmZsYWdzKSAmIElSUUZfVFJJR0dFUl9NQVNLKSkKKwkJICAgICgob2xkLT5mbGFncyBeIG5ldy0+ZmxhZ3MpICYgSVJRRl9UUklHR0VSX01BU0spKSB7CisJCQlvbGRfbmFtZSA9IG9sZC0+bmFtZTsKIAkJCWdvdG8gbWlzbWF0Y2g7CisJCX0KIAogI2lmIGRlZmluZWQoQ09ORklHX0lSUV9QRVJfQ1BVKQogCQkvKiBBbGwgaGFuZGxlcnMgbXVzdCBhZ3JlZSBvbiBwZXItY3B1bmVzcyAqLwpAQCAtMzIyLDExICszMjUsMTMgQEAKIAlyZXR1cm4gMDsKIAogbWlzbWF0Y2g6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCWlmICghKG5ldy0+ZmxhZ3MgJiBJUlFGX1BST0JFX1NIQVJFRCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJJUlEgaGFuZGxlciB0eXBlIG1pc21hdGNoIGZvciBJUlEgJWRcbiIsIGlycSk7CisJCWlmIChvbGRfbmFtZSkKKwkJCXByaW50ayhLRVJOX0VSUiAiY3VycmVudCBoYW5kbGVyOiAlc1xuIiwgb2xkX25hbWUpOwogCQlkdW1wX3N0YWNrKCk7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gLUVCVVNZOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3Byb2MuYyBiL2tlcm5lbC9pcnEvcHJvYy5jCmluZGV4IDlhMzUyNjYuLjYxZjVjNzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvcHJvYy5jCisrKyBiL2tlcm5lbC9pcnEvcHJvYy5jCkBAIC01NCw3ICs1NCw4IEBACiAJdW5zaWduZWQgaW50IGlycSA9IChpbnQpKGxvbmcpZGF0YSwgZnVsbF9jb3VudCA9IGNvdW50LCBlcnI7CiAJY3B1bWFza190IG5ld192YWx1ZSwgdG1wOwogCi0JaWYgKCFpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eSB8fCBub19pcnFfYWZmaW5pdHkpCisJaWYgKCFpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eSB8fCBub19pcnFfYWZmaW5pdHkgfHwKKwkJCQlDSEVDS19JUlFfUEVSX0NQVShpcnFfZGVzY1tpcnFdLnN0YXR1cykpCiAJCXJldHVybiAtRUlPOwogCiAJZXJyID0gY3B1bWFza19wYXJzZV91c2VyKGJ1ZmZlciwgY291bnQsIG5ld192YWx1ZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwva2FsbHN5bXMuYyBiL2tlcm5lbC9rYWxsc3ltcy5jCmluZGV4IGVlYWMzZTMuLjZmMjk0ZmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rYWxsc3ltcy5jCisrKyBiL2tlcm5lbC9rYWxsc3ltcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIGZvciBjb25kX3Jlc2NoZWQgKi8KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIApAQCAtMzAsMTQgKzMxLDE0IEBACiAjZW5kaWYKIAogLyogVGhlc2Ugd2lsbCBiZSByZS1saW5rZWQgYWdhaW5zdCB0aGVpciByZWFsIHZhbHVlcyBkdXJpbmcgdGhlIHNlY29uZCBsaW5rIHN0YWdlICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBrYWxsc3ltc19hZGRyZXNzZXNbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBrYWxsc3ltc19udW1fc3ltcyBfX2F0dHJpYnV0ZV9fKCh3ZWFrLHNlY3Rpb24oImRhdGEiKSkpOwotZXh0ZXJuIHU4IGthbGxzeW1zX25hbWVzW10gX19hdHRyaWJ1dGVfXygod2VhaykpOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcga2FsbHN5bXNfYWRkcmVzc2VzW10gX19hdHRyaWJ1dGVfXygod2VhaykpOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcga2FsbHN5bXNfbnVtX3N5bXMgX19hdHRyaWJ1dGVfXygod2VhaykpOworZXh0ZXJuIGNvbnN0IHU4IGthbGxzeW1zX25hbWVzW10gX19hdHRyaWJ1dGVfXygod2VhaykpOwogCi1leHRlcm4gdTgga2FsbHN5bXNfdG9rZW5fdGFibGVbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7Ci1leHRlcm4gdTE2IGthbGxzeW1zX3Rva2VuX2luZGV4W10gX19hdHRyaWJ1dGVfXygod2VhaykpOworZXh0ZXJuIGNvbnN0IHU4IGthbGxzeW1zX3Rva2VuX3RhYmxlW10gX19hdHRyaWJ1dGVfXygod2VhaykpOworZXh0ZXJuIGNvbnN0IHUxNiBrYWxsc3ltc190b2tlbl9pbmRleFtdIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcga2FsbHN5bXNfbWFya2Vyc1tdIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIGthbGxzeW1zX21hcmtlcnNbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2tlcm5lbF9pbml0dGV4dCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CkBAIC04Myw3ICs4NCw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGthbGxzeW1zX2V4cGFuZF9zeW1ib2wodW5zaWduZWQgaW50IG9mZiwgY2hhciAqcmVzdWx0KQogewogCWludCBsZW4sIHNraXBwZWRfZmlyc3QgPSAwOwotCXU4ICp0cHRyLCAqZGF0YTsKKwljb25zdCB1OCAqdHB0ciwgKmRhdGE7CiAKIAkvKiBnZXQgdGhlIGNvbXByZXNzZWQgc3ltYm9sIGxlbmd0aCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgYnl0ZSAqLwogCWRhdGEgPSAma2FsbHN5bXNfbmFtZXNbb2ZmXTsKQEAgLTEzMSw3ICsxMzIsNyBAQAogICoga2FsbHN5bXMgYXJyYXkgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3N5bWJvbF9vZmZzZXQodW5zaWduZWQgbG9uZyBwb3MpCiB7Ci0JdTggKm5hbWU7CisJY29uc3QgdTggKm5hbWU7CiAJaW50IGk7CiAKIAkvKiB1c2UgdGhlIGNsb3Nlc3QgbWFya2VyIHdlIGhhdmUuIFdlIGhhdmUgbWFya2VycyBldmVyeSAyNTYgcG9zaXRpb25zLApAQCAtMzAxLDEzICszMDIsNiBAQAogCWNoYXIgbmFtZVtLU1lNX05BTUVfTEVOKzFdOwogfTsKIAotLyogT25seSBsYWJlbCBpdCAiZ2xvYmFsIiBpZiBpdCBpcyBleHBvcnRlZC4gKi8KLXN0YXRpYyB2b2lkIHVwY2FzZV9pZl9nbG9iYWwoc3RydWN0IGthbGxzeW1faXRlciAqaXRlcikKLXsKLQlpZiAoaXNfZXhwb3J0ZWQoaXRlci0+bmFtZSwgaXRlci0+b3duZXIpKQotCQlpdGVyLT50eXBlICs9ICdBJyAtICdhJzsKLX0KLQogc3RhdGljIGludCBnZXRfa3N5bWJvbF9tb2Qoc3RydWN0IGthbGxzeW1faXRlciAqaXRlcikKIHsKIAlpdGVyLT5vd25lciA9IG1vZHVsZV9nZXRfa2FsbHN5bShpdGVyLT5wb3MgLSBrYWxsc3ltc19udW1fc3ltcywKQEAgLTMxNiw3ICszMTAsMTAgQEAKIAlpZiAoaXRlci0+b3duZXIgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQl1cGNhc2VfaWZfZ2xvYmFsKGl0ZXIpOworCS8qIExhYmVsIGl0ICJnbG9iYWwiIGlmIGl0IGlzIGV4cG9ydGVkLCAibG9jYWwiIGlmIG5vdCBleHBvcnRlZC4gKi8KKwlpdGVyLT50eXBlID0gaXNfZXhwb3J0ZWQoaXRlci0+bmFtZSwgaXRlci0+b3duZXIpCisJCT8gdG91cHBlcihpdGVyLT50eXBlKSA6IHRvbG93ZXIoaXRlci0+dHlwZSk7CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtNDAxLDcgKzM5OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMga2FsbHN5bXNfb3AgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGthbGxzeW1zX29wID0gewogCS5zdGFydCA9IHNfc3RhcnQsCiAJLm5leHQgPSBzX25leHQsCiAJLnN0b3AgPSBzX3N0b3AsCkBAIC00MzYsNyArNDMzLDcgQEAKIAlyZXR1cm4gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrYWxsc3ltc19vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2FsbHN5bXNfb3BlcmF0aW9ucyA9IHsKIAkub3BlbiA9IGthbGxzeW1zX29wZW4sCiAJLnJlYWQgPSBzZXFfcmVhZCwKIAkubGxzZWVrID0gc2VxX2xzZWVrLApkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjLmMgYi9rZXJuZWwva2V4ZWMuYwppbmRleCBmY2RkNWQyLi4yYTU5YzhhIDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTEwOCwxMSArMTEwLDEwIEBACiAKIAkvKiBBbGxvY2F0ZSBhIGNvbnRyb2xsaW5nIHN0cnVjdHVyZSAqLwogCXJlc3VsdCA9IC1FTk9NRU07Ci0JaW1hZ2UgPSBrbWFsbG9jKHNpemVvZigqaW1hZ2UpLCBHRlBfS0VSTkVMKTsKKwlpbWFnZSA9IGt6YWxsb2Moc2l6ZW9mKCppbWFnZSksIEdGUF9LRVJORUwpOwogCWlmICghaW1hZ2UpCiAJCWdvdG8gb3V0OwogCi0JbWVtc2V0KGltYWdlLCAwLCBzaXplb2YoKmltYWdlKSk7CiAJaW1hZ2UtPmhlYWQgPSAwOwogCWltYWdlLT5lbnRyeSA9ICZpbWFnZS0+aGVhZDsKIAlpbWFnZS0+bGFzdF9lbnRyeSA9ICZpbWFnZS0+aGVhZDsKQEAgLTg1MSw2ICs4NTIsNyBAQAogCQkJbWVtc2V0KHB0ciArIHVjaHVuaywgMCwgbWNodW5rIC0gdWNodW5rKTsKIAkJfQogCQlyZXN1bHQgPSBjb3B5X2Zyb21fdXNlcihwdHIsIGJ1ZiwgdWNodW5rKTsKKwkJa2V4ZWNfZmx1c2hfaWNhY2hlX3BhZ2UocGFnZSk7CiAJCWt1bm1hcChwYWdlKTsKIAkJaWYgKHJlc3VsdCkgewogCQkJcmVzdWx0ID0gKHJlc3VsdCA8IDApID8gcmVzdWx0IDogLUVJTzsKQEAgLTEwNjcsNiArMTA2OSw2MCBAQAogCX0KIH0KIAorc3RhdGljIHUzMiAqYXBwZW5kX2VsZl9ub3RlKHUzMiAqYnVmLCBjaGFyICpuYW1lLCB1bnNpZ25lZCB0eXBlLCB2b2lkICpkYXRhLAorCQkJICAgIHNpemVfdCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgZWxmX25vdGUgbm90ZTsKKworCW5vdGUubl9uYW1lc3ogPSBzdHJsZW4obmFtZSkgKyAxOworCW5vdGUubl9kZXNjc3ogPSBkYXRhX2xlbjsKKwlub3RlLm5fdHlwZSAgID0gdHlwZTsKKwltZW1jcHkoYnVmLCAmbm90ZSwgc2l6ZW9mKG5vdGUpKTsKKwlidWYgKz0gKHNpemVvZihub3RlKSArIDMpLzQ7CisJbWVtY3B5KGJ1ZiwgbmFtZSwgbm90ZS5uX25hbWVzeik7CisJYnVmICs9IChub3RlLm5fbmFtZXN6ICsgMykvNDsKKwltZW1jcHkoYnVmLCBkYXRhLCBub3RlLm5fZGVzY3N6KTsKKwlidWYgKz0gKG5vdGUubl9kZXNjc3ogKyAzKS80OworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgZmluYWxfbm90ZSh1MzIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZWxmX25vdGUgbm90ZTsKKworCW5vdGUubl9uYW1lc3ogPSAwOworCW5vdGUubl9kZXNjc3ogPSAwOworCW5vdGUubl90eXBlICAgPSAwOworCW1lbWNweShidWYsICZub3RlLCBzaXplb2Yobm90ZSkpOworfQorCit2b2lkIGNyYXNoX3NhdmVfY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQoreworCXN0cnVjdCBlbGZfcHJzdGF0dXMgcHJzdGF0dXM7CisJdTMyICpidWY7CisKKwlpZiAoKGNwdSA8IDApIHx8IChjcHUgPj0gTlJfQ1BVUykpCisJCXJldHVybjsKKworCS8qIFVzaW5nIEVMRiBub3RlcyBoZXJlIGlzIG9wcG9ydHVuaXN0aWMuCisJICogSSBuZWVkIGEgd2VsbCBkZWZpbmVkIHN0cnVjdHVyZSBmb3JtYXQKKwkgKiBmb3IgdGhlIGRhdGEgSSBwYXNzLCBhbmQgSSBuZWVkIHRhZ3MKKwkgKiBvbiB0aGUgZGF0YSB0byBpbmRpY2F0ZSB3aGF0IGluZm9ybWF0aW9uIEkgaGF2ZQorCSAqIHNxdWlycmVsbGVkIGF3YXkuICBFTEYgbm90ZXMgaGFwcGVuIHRvIHByb3ZpZGUKKwkgKiBhbGwgb2YgdGhhdCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZlbnQgc29tZXRoaW5nIG5ldy4KKwkgKi8KKwlidWYgPSAodTMyKilwZXJfY3B1X3B0cihjcmFzaF9ub3RlcywgY3B1KTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCW1lbXNldCgmcHJzdGF0dXMsIDAsIHNpemVvZihwcnN0YXR1cykpOworCXByc3RhdHVzLnByX3BpZCA9IGN1cnJlbnQtPnBpZDsKKwllbGZfY29yZV9jb3B5X3JlZ3MoJnByc3RhdHVzLnByX3JlZywgcmVncyk7CisJYnVmID0gYXBwZW5kX2VsZl9ub3RlKGJ1ZiwgIkNPUkUiLCBOVF9QUlNUQVRVUywgJnByc3RhdHVzLAorCQkJCXNpemVvZihwcnN0YXR1cykpOworCWZpbmFsX25vdGUoYnVmKTsKK30KKwogc3RhdGljIGludCBfX2luaXQgY3Jhc2hfbm90ZXNfbWVtb3J5X2luaXQodm9pZCkKIHsKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHNhdmluZyBjcHUgcmVnaXN0ZXJzLiAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2ttb2QuYyBiL2tlcm5lbC9rbW9kLmMKaW5kZXggYmI0ZTI5ZC4uM2E3Mzc5YSAxMDA2NDQKLS0tIGEva2VybmVsL2ttb2QuYworKysgYi9rZXJuZWwva21vZC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpAQCAtMTE0LDYgKzExNCw3IEBACiAjZW5kaWYgLyogQ09ORklHX0tNT0QgKi8KIAogc3RydWN0IHN1YnByb2Nlc3NfaW5mbyB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRlOwogCWNoYXIgKnBhdGg7CiAJY2hhciAqKmFyZ3Y7CkBAIC0yMjEsOSArMjIyLDEwIEBACiB9CiAKIC8qIFRoaXMgaXMgcnVuIGJ5IGtoZWxwZXIgdGhyZWFkICAqLwotc3RhdGljIHZvaWQgX19jYWxsX3VzZXJtb2RlaGVscGVyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBfX2NhbGxfdXNlcm1vZGVoZWxwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKnN1Yl9pbmZvID0gZGF0YTsKKwlzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICpzdWJfaW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvLCB3b3JrKTsKIAlwaWRfdCBwaWQ7CiAJaW50IHdhaXQgPSBzdWJfaW5mby0+d2FpdDsKIApAQCAtMjY0LDYgKzI2Niw4IEBACiB7CiAJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soZG9uZSk7CiAJc3RydWN0IHN1YnByb2Nlc3NfaW5mbyBzdWJfaW5mbyA9IHsKKwkJLndvcmsJCT0gX19XT1JLX0lOSVRJQUxJWkVSKHN1Yl9pbmZvLndvcmssCisJCQkJCQkgICAgIF9fY2FsbF91c2VybW9kZWhlbHBlciksCiAJCS5jb21wbGV0ZQk9ICZkb25lLAogCQkucGF0aAkJPSBwYXRoLAogCQkuYXJndgkJPSBhcmd2LApAQCAtMjcyLDcgKzI3Niw2IEBACiAJCS53YWl0CQk9IHdhaXQsCiAJCS5yZXR2YWwJCT0gMCwKIAl9OwotCURFQ0xBUkVfV09SSyh3b3JrLCBfX2NhbGxfdXNlcm1vZGVoZWxwZXIsICZzdWJfaW5mbyk7CiAKIAlpZiAoIWtoZWxwZXJfd3EpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0yODAsNyArMjgzLDcgQEAKIAlpZiAocGF0aFswXSA9PSAnXDAnKQogCQlyZXR1cm4gMDsKIAotCXF1ZXVlX3dvcmsoa2hlbHBlcl93cSwgJndvcmspOworCXF1ZXVlX3dvcmsoa2hlbHBlcl93cSwgJnN1Yl9pbmZvLndvcmspOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRvbmUpOwogCXJldHVybiBzdWJfaW5mby5yZXR2YWw7CiB9CkBAIC0yOTEsNiArMjk0LDggQEAKIHsKIAlERUNMQVJFX0NPTVBMRVRJT04oZG9uZSk7CiAJc3RydWN0IHN1YnByb2Nlc3NfaW5mbyBzdWJfaW5mbyA9IHsKKwkJLndvcmsJCT0gX19XT1JLX0lOSVRJQUxJWkVSKHN1Yl9pbmZvLndvcmssCisJCQkJCQkgICAgIF9fY2FsbF91c2VybW9kZWhlbHBlciksCiAJCS5jb21wbGV0ZQk9ICZkb25lLAogCQkucGF0aAkJPSBwYXRoLAogCQkuYXJndgkJPSBhcmd2LApAQCAtMjk4LDcgKzMwMyw2IEBACiAJCS5yZXR2YWwJCT0gMCwKIAl9OwogCXN0cnVjdCBmaWxlICpmOwotCURFQ0xBUkVfV09SSyh3b3JrLCBfX2NhbGxfdXNlcm1vZGVoZWxwZXIsICZzdWJfaW5mbyk7CiAKIAlpZiAoIWtoZWxwZXJfd3EpCiAJCXJldHVybiAtRUJVU1k7CkBAIC0zMDcsMTggKzMxMSwxOCBAQAogCQlyZXR1cm4gMDsKIAogCWYgPSBjcmVhdGVfd3JpdGVfcGlwZSgpOwotCWlmICghZikKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKElTX0VSUihmKSkKKwkJcmV0dXJuIFBUUl9FUlIoZik7CiAJKmZpbHAgPSBmOwogCiAJZiA9IGNyZWF0ZV9yZWFkX3BpcGUoZik7Ci0JaWYgKCFmKSB7CisJaWYgKElTX0VSUihmKSkgewogCQlmcmVlX3dyaXRlX3BpcGUoKmZpbHApOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIFBUUl9FUlIoZik7CiAJfQogCXN1Yl9pbmZvLnN0ZGluID0gZjsKIAotCXF1ZXVlX3dvcmsoa2hlbHBlcl93cSwgJndvcmspOworCXF1ZXVlX3dvcmsoa2hlbHBlcl93cSwgJnN1Yl9pbmZvLndvcmspOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRvbmUpOwogCXJldHVybiBzdWJfaW5mby5yZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwva3Byb2Jlcy5jIGIva2VybmVsL2twcm9iZXMuYwppbmRleCA2MTBjODM3Li4xN2VjNGFmIDEwMDY0NAotLS0gYS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CkBAIC04Myw5ICs4NCwzNiBAQAogCWtwcm9iZV9vcGNvZGVfdCAqaW5zbnM7CQkvKiBQYWdlIG9mIGluc3RydWN0aW9uIHNsb3RzICovCiAJY2hhciBzbG90X3VzZWRbSU5TTlNfUEVSX1BBR0VdOwogCWludCBudXNlZDsKKwlpbnQgbmdhcmJhZ2U7CiB9OwogCiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQga3Byb2JlX2luc25fcGFnZXM7CitzdGF0aWMgaW50IGtwcm9iZV9nYXJiYWdlX3Nsb3RzOworc3RhdGljIGludCBjb2xsZWN0X2dhcmJhZ2Vfc2xvdHModm9pZCk7CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGNoZWNrX3NhZmV0eSh2b2lkKQoreworCWludCByZXQgPSAwOworI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpICYmIGRlZmluZWQoQ09ORklHX1BNKQorCXJldCA9IGZyZWV6ZV9wcm9jZXNzZXMoKTsKKwlpZiAocmV0ID09IDApIHsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICpwLCAqcTsKKwkJZG9fZWFjaF90aHJlYWQocCwgcSkgeworCQkJaWYgKHAgIT0gY3VycmVudCAmJiBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcgJiYKKwkJCSAgICBwLT5waWQgIT0gMCkgeworCQkJCXByaW50aygiQ2hlY2sgZmFpbGVkOiAlcyBpcyBydW5uaW5nXG4iLHAtPmNvbW0pOworCQkJCXJldCA9IC0xOworCQkJCWdvdG8gbG9vcF9lbmQ7CisJCQl9CisJCX0gd2hpbGVfZWFjaF90aHJlYWQocCwgcSk7CisJfQorbG9vcF9lbmQ6CisJdGhhd19wcm9jZXNzZXMoKTsKKyNlbHNlCisJc3luY2hyb25pemVfc2NoZWQoKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CiAKIC8qKgogICogZ2V0X2luc25fc2xvdCgpIC0gRmluZCBhIHNsb3Qgb24gYW4gZXhlY3V0YWJsZSBwYWdlIGZvciBhbiBpbnN0cnVjdGlvbi4KQEAgLTk2LDYgKzEyNCw3IEBACiAJc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgKmtpcDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwogCisgICAgICByZXRyeToKIAlobGlzdF9mb3JfZWFjaChwb3MsICZrcHJvYmVfaW5zbl9wYWdlcykgewogCQlraXAgPSBobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlLCBobGlzdCk7CiAJCWlmIChraXAtPm51c2VkIDwgSU5TTlNfUEVSX1BBR0UpIHsKQEAgLTExMiw3ICsxNDEsMTEgQEAKIAkJfQogCX0KIAotCS8qIEFsbCBvdXQgb2Ygc3BhY2UuICBOZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHBhZ2UuIFVzZSBzbG90IDAuKi8KKwkvKiBJZiB0aGVyZSBhcmUgYW55IGdhcmJhZ2Ugc2xvdHMsIGNvbGxlY3QgaXQgYW5kIHRyeSBhZ2Fpbi4gKi8KKwlpZiAoa3Byb2JlX2dhcmJhZ2Vfc2xvdHMgJiYgY29sbGVjdF9nYXJiYWdlX3Nsb3RzKCkgPT0gMCkgeworCQlnb3RvIHJldHJ5OworCX0KKwkvKiBBbGwgb3V0IG9mIHNwYWNlLiAgTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBwYWdlLiBVc2Ugc2xvdCAwLiAqLwogCWtpcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFraXApIHsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMzMsMTAgKzE2Niw2MiBAQAogCW1lbXNldChraXAtPnNsb3RfdXNlZCwgMCwgSU5TTlNfUEVSX1BBR0UpOwogCWtpcC0+c2xvdF91c2VkWzBdID0gMTsKIAlraXAtPm51c2VkID0gMTsKKwlraXAtPm5nYXJiYWdlID0gMDsKIAlyZXR1cm4ga2lwLT5pbnNuczsKIH0KIAotdm9pZCBfX2twcm9iZXMgZnJlZV9pbnNuX3Nsb3Qoa3Byb2JlX29wY29kZV90ICpzbG90KQorLyogUmV0dXJuIDEgaWYgYWxsIGdhcmJhZ2VzIGFyZSBjb2xsZWN0ZWQsIG90aGVyd2lzZSAwLiAqLworc3RhdGljIGludCBfX2twcm9iZXMgY29sbGVjdF9vbmVfc2xvdChzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwLCBpbnQgaWR4KQoreworCWtpcC0+c2xvdF91c2VkW2lkeF0gPSAwOworCWtpcC0+bnVzZWQtLTsKKwlpZiAoa2lwLT5udXNlZCA9PSAwKSB7CisJCS8qCisJCSAqIFBhZ2UgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIEZyZWUgaXQgdW5sZXNzCisJCSAqIGl0J3MgdGhlIGxhc3Qgb25lLiAgV2Uga2VlcCB0aGUgbGFzdCBvbmUKKwkJICogc28gYXMgbm90IHRvIGhhdmUgdG8gc2V0IGl0IHVwIGFnYWluIHRoZQorCQkgKiBuZXh0IHRpbWUgc29tZWJvZHkgaW5zZXJ0cyBhIHByb2JlLgorCQkgKi8KKwkJaGxpc3RfZGVsKCZraXAtPmhsaXN0KTsKKwkJaWYgKGhsaXN0X2VtcHR5KCZrcHJvYmVfaW5zbl9wYWdlcykpIHsKKwkJCUlOSVRfSExJU1RfTk9ERSgma2lwLT5obGlzdCk7CisJCQlobGlzdF9hZGRfaGVhZCgma2lwLT5obGlzdCwKKwkJCQkgICAgICAgJmtwcm9iZV9pbnNuX3BhZ2VzKTsKKwkJfSBlbHNlIHsKKwkJCW1vZHVsZV9mcmVlKE5VTEwsIGtpcC0+aW5zbnMpOworCQkJa2ZyZWUoa2lwKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19rcHJvYmVzIGNvbGxlY3RfZ2FyYmFnZV9zbG90cyh2b2lkKQoreworCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvcywgKm5leHQ7CisKKwkvKiBFbnN1cmUgbm8tb25lIGlzIHByZWVwbXRlZCBvbiB0aGUgZ2FyYmFnZXMgKi8KKwlpZiAoY2hlY2tfc2FmZXR5KCkgIT0gMCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlobGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJmtwcm9iZV9pbnNuX3BhZ2VzKSB7CisJCWludCBpOworCQlraXAgPSBobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlLCBobGlzdCk7CisJCWlmIChraXAtPm5nYXJiYWdlID09IDApCisJCQljb250aW51ZTsKKwkJa2lwLT5uZ2FyYmFnZSA9IDA7CS8qIHdlIHdpbGwgY29sbGVjdCBhbGwgZ2FyYmFnZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IElOU05TX1BFUl9QQUdFOyBpKyspIHsKKwkJCWlmIChraXAtPnNsb3RfdXNlZFtpXSA9PSAtMSAmJgorCQkJICAgIGNvbGxlY3Rfb25lX3Nsb3Qoa2lwLCBpKSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlrcHJvYmVfZ2FyYmFnZV9zbG90cyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19rcHJvYmVzIGZyZWVfaW5zbl9zbG90KGtwcm9iZV9vcGNvZGVfdCAqIHNsb3QsIGludCBkaXJ0eSkKIHsKIAlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CkBAIC0xNDYsMjggKzIzMSwxOCBAQAogCQlpZiAoa2lwLT5pbnNucyA8PSBzbG90ICYmCiAJCSAgICBzbG90IDwga2lwLT5pbnNucyArIChJTlNOU19QRVJfUEFHRSAqIE1BWF9JTlNOX1NJWkUpKSB7CiAJCQlpbnQgaSA9IChzbG90IC0ga2lwLT5pbnNucykgLyBNQVhfSU5TTl9TSVpFOwotCQkJa2lwLT5zbG90X3VzZWRbaV0gPSAwOwotCQkJa2lwLT5udXNlZC0tOwotCQkJaWYgKGtpcC0+bnVzZWQgPT0gMCkgewotCQkJCS8qCi0JCQkJICogUGFnZSBpcyBubyBsb25nZXIgaW4gdXNlLiAgRnJlZSBpdCB1bmxlc3MKLQkJCQkgKiBpdCdzIHRoZSBsYXN0IG9uZS4gIFdlIGtlZXAgdGhlIGxhc3Qgb25lCi0JCQkJICogc28gYXMgbm90IHRvIGhhdmUgdG8gc2V0IGl0IHVwIGFnYWluIHRoZQotCQkJCSAqIG5leHQgdGltZSBzb21lYm9keSBpbnNlcnRzIGEgcHJvYmUuCi0JCQkJICovCi0JCQkJaGxpc3RfZGVsKCZraXAtPmhsaXN0KTsKLQkJCQlpZiAoaGxpc3RfZW1wdHkoJmtwcm9iZV9pbnNuX3BhZ2VzKSkgewotCQkJCQlJTklUX0hMSVNUX05PREUoJmtpcC0+aGxpc3QpOwotCQkJCQlobGlzdF9hZGRfaGVhZCgma2lwLT5obGlzdCwKLQkJCQkJCSZrcHJvYmVfaW5zbl9wYWdlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9kdWxlX2ZyZWUoTlVMTCwga2lwLT5pbnNucyk7Ci0JCQkJCWtmcmVlKGtpcCk7Ci0JCQkJfQorCQkJaWYgKGRpcnR5KSB7CisJCQkJa2lwLT5zbG90X3VzZWRbaV0gPSAtMTsKKwkJCQlraXAtPm5nYXJiYWdlKys7CisJCQl9IGVsc2UgeworCQkJCWNvbGxlY3Rfb25lX3Nsb3Qoa2lwLCBpKTsKIAkJCX0KLQkJCXJldHVybjsKKwkJCWJyZWFrOwogCQl9CiAJfQorCWlmIChkaXJ0eSAmJiAoKytrcHJvYmVfZ2FyYmFnZV9zbG90cyA+IElOU05TX1BFUl9QQUdFKSkgeworCQljb2xsZWN0X2dhcmJhZ2Vfc2xvdHMoKTsKKwl9CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEva2VybmVsL2t0aHJlYWQuYyBiL2tlcm5lbC9rdGhyZWFkLmMKaW5kZXggNGY5YzYwZS4uMWRiOGM3MiAxMDA2NDQKLS0tIGEva2VybmVsL2t0aHJlYWQuYworKysgYi9rZXJuZWwva3RocmVhZC5jCkBAIC0zMSw2ICszMSw4IEBACiAJLyogUmVzdWx0IHBhc3NlZCBiYWNrIHRvIGt0aHJlYWRfY3JlYXRlKCkgZnJvbSBrZXZlbnRkLiAqLwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcmVzdWx0OwogCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIH07CiAKIHN0cnVjdCBrdGhyZWFkX3N0b3BfaW5mbwpAQCAtMTExLDkgKzExMywxMCBAQAogfQogCiAvKiBXZSBhcmUga2V2ZW50ZDogY3JlYXRlIGEgdGhyZWFkLiAqLwotc3RhdGljIHZvaWQga2V2ZW50ZF9jcmVhdGVfa3RocmVhZCh2b2lkICpfY3JlYXRlKQorc3RhdGljIHZvaWQga2V2ZW50ZF9jcmVhdGVfa3RocmVhZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGt0aHJlYWRfY3JlYXRlX2luZm8gKmNyZWF0ZSA9IF9jcmVhdGU7CisJc3RydWN0IGt0aHJlYWRfY3JlYXRlX2luZm8gKmNyZWF0ZSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qga3RocmVhZF9jcmVhdGVfaW5mbywgd29yayk7CiAJaW50IHBpZDsKIAogCS8qIFdlIHdhbnQgb3VyIG93biBzaWduYWwgaGFuZGxlciAod2UgdGFrZSBubyBzaWduYWxzIGJ5IGRlZmF1bHQpLiAqLwpAQCAtMTU0LDIwICsxNTcsMjAgQEAKIAkJCQkgICAuLi4pCiB7CiAJc3RydWN0IGt0aHJlYWRfY3JlYXRlX2luZm8gY3JlYXRlOwotCURFQ0xBUkVfV09SSyh3b3JrLCBrZXZlbnRkX2NyZWF0ZV9rdGhyZWFkLCAmY3JlYXRlKTsKIAogCWNyZWF0ZS50aHJlYWRmbiA9IHRocmVhZGZuOwogCWNyZWF0ZS5kYXRhID0gZGF0YTsKIAlpbml0X2NvbXBsZXRpb24oJmNyZWF0ZS5zdGFydGVkKTsKIAlpbml0X2NvbXBsZXRpb24oJmNyZWF0ZS5kb25lKTsKKwlJTklUX1dPUksoJmNyZWF0ZS53b3JrLCBrZXZlbnRkX2NyZWF0ZV9rdGhyZWFkKTsKIAogCS8qCiAJICogVGhlIHdvcmtxdWV1ZSBuZWVkcyB0byBzdGFydCB1cCBmaXJzdDoKIAkgKi8KIAlpZiAoIWhlbHBlcl93cSkKLQkJd29yay5mdW5jKHdvcmsuZGF0YSk7CisJCWNyZWF0ZS53b3JrLmZ1bmMoJmNyZWF0ZS53b3JrKTsKIAllbHNlIHsKLQkJcXVldWVfd29yayhoZWxwZXJfd3EsICZ3b3JrKTsKKwkJcXVldWVfd29yayhoZWxwZXJfd3EsICZjcmVhdGUud29yayk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNyZWF0ZS5kb25lKTsKIAl9CiAJaWYgKCFJU19FUlIoY3JlYXRlLnJlc3VsdCkpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sYXRlbmN5LmMgYi9rZXJuZWwvbGF0ZW5jeS5jCmluZGV4IDI1OGYyNTUuLmU2M2ZjYWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sYXRlbmN5LmMKKysrIGIva2VybmVsL2xhdGVuY3kuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKIHN0cnVjdCBsYXRlbmN5X2luZm8gewpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggODA1YTMyMi4uMDFlNzUwNSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC00MywxMyArNDMsNDkgQEAKICNpbmNsdWRlICJsb2NrZGVwX2ludGVybmFscy5oIgogCiAvKgotICogaGFzaF9sb2NrOiBwcm90ZWN0cyB0aGUgbG9ja2RlcCBoYXNoZXMgYW5kIGNsYXNzL2xpc3QvaGFzaCBhbGxvY2F0b3JzLgorICogbG9ja2RlcF9sb2NrOiBwcm90ZWN0cyB0aGUgbG9ja2RlcCBncmFwaCwgdGhlIGhhc2hlcyBhbmQgdGhlCisgKiAgICAgICAgICAgICAgIGNsYXNzL2xpc3QvaGFzaCBhbGxvY2F0b3JzLgogICoKICAqIFRoaXMgaXMgb25lIG9mIHRoZSByYXJlIGV4Y2VwdGlvbnMgd2hlcmUgaXQncyBqdXN0aWZpZWQKICAqIHRvIHVzZSBhIHJhdyBzcGlubG9jayAtIHdlIHJlYWxseSBkb250IHdhbnQgdGhlIHNwaW5sb2NrCi0gKiBjb2RlIHRvIHJlY3Vyc2UgYmFjayBpbnRvIHRoZSBsb2NrZGVwIGNvZGUuCisgKiBjb2RlIHRvIHJlY3Vyc2UgYmFjayBpbnRvIHRoZSBsb2NrZGVwIGNvZGUuLi4KICAqLwotc3RhdGljIHJhd19zcGlubG9ja190IGhhc2hfbG9jayA9IChyYXdfc3BpbmxvY2tfdClfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgcmF3X3NwaW5sb2NrX3QgbG9ja2RlcF9sb2NrID0gKHJhd19zcGlubG9ja190KV9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRDsKKworc3RhdGljIGludCBncmFwaF9sb2NrKHZvaWQpCit7CisJX19yYXdfc3Bpbl9sb2NrKCZsb2NrZGVwX2xvY2spOworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgaWYgYW5vdGhlciBDUFUgZGV0ZWN0ZWQgYSBidWcgd2hpbGUKKwkgKiB3YWxraW5nIHRoZSBncmFwaCB3ZSBkb250IGNoYW5nZSBpdCAod2hpbGUgdGhlIG90aGVyCisJICogQ1BVIGlzIGJ1c3kgcHJpbnRpbmcgb3V0IHN0dWZmIHdpdGggdGhlIGdyYXBoIGxvY2sKKwkgKiBkcm9wcGVkIGFscmVhZHkpCisJICovCisJaWYgKCFkZWJ1Z19sb2NrcykgeworCQlfX3Jhd19zcGluX3VubG9jaygmbG9ja2RlcF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBncmFwaF91bmxvY2sodm9pZCkKK3sKKwlfX3Jhd19zcGluX3VubG9jaygmbG9ja2RlcF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFR1cm4gbG9jayBkZWJ1Z2dpbmcgb2ZmIGFuZCByZXR1cm4gd2l0aCAwIGlmIGl0IHdhcyBvZmYgYWxyZWFkeSwKKyAqIGFuZCBhbHNvIHJlbGVhc2UgdGhlIGdyYXBoIGxvY2s6CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRlYnVnX2xvY2tzX29mZl9ncmFwaF91bmxvY2sodm9pZCkKK3sKKwlpbnQgcmV0ID0gZGVidWdfbG9ja3Nfb2ZmKCk7CisKKwlfX3Jhd19zcGluX3VubG9jaygmbG9ja2RlcF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CiAKIHN0YXRpYyBpbnQgbG9ja2RlcF9pbml0aWFsaXplZDsKIApAQCAtNTcsMTQgKzkzLDE1IEBACiBzdGF0aWMgc3RydWN0IGxvY2tfbGlzdCBsaXN0X2VudHJpZXNbTUFYX0xPQ0tERVBfRU5UUklFU107CiAKIC8qCi0gKiBBbGxvY2F0ZSBhIGxvY2tkZXAgZW50cnkuIChhc3N1bWVzIGhhc2hfbG9jayBoZWxkLCByZXR1cm5zCisgKiBBbGxvY2F0ZSBhIGxvY2tkZXAgZW50cnkuIChhc3N1bWVzIHRoZSBncmFwaF9sb2NrIGhlbGQsIHJldHVybnMKICAqIHdpdGggTlVMTCBvbiBmYWlsdXJlKQogICovCiBzdGF0aWMgc3RydWN0IGxvY2tfbGlzdCAqYWxsb2NfbGlzdF9lbnRyeSh2b2lkKQogewogCWlmIChucl9saXN0X2VudHJpZXMgPj0gTUFYX0xPQ0tERVBfRU5UUklFUykgewotCQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQkJZGVidWdfbG9ja3Nfb2ZmKCk7CisJCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpKQorCQkJcmV0dXJuIE5VTEw7CisKIAkJcHJpbnRrKCJCVUc6IE1BWF9MT0NLREVQX0VOVFJJRVMgdG9vIGxvdyFcbiIpOwogCQlwcmludGsoInR1cm5pbmcgb2ZmIHRoZSBsb2NraW5nIGNvcnJlY3RuZXNzIHZhbGlkYXRvci5cbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTE0MCwyMSArMTc3LDEyIEBACiAKIEVYUE9SVF9TWU1CT0wobG9ja2RlcF9vbik7CiAKLWludCBsb2NrZGVwX2ludGVybmFsKHZvaWQpCi17Ci0JcmV0dXJuIGN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uICE9IDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0wobG9ja2RlcF9pbnRlcm5hbCk7Ci0KIC8qCiAgKiBEZWJ1Z2dpbmcgc3dpdGNoZXM6CiAgKi8KIAogI2RlZmluZSBWRVJCT1NFCQkJMAotI2lmZGVmIFZFUkJPU0UKLSMgZGVmaW5lIFZFUllfVkVSQk9TRQkJMAotI2VuZGlmCisjZGVmaW5lIFZFUllfVkVSQk9TRQkJMAogCiAjaWYgVkVSQk9TRQogIyBkZWZpbmUgSEFSRElSUV9WRVJCT1NFCTEKQEAgLTE3OSw4ICsyMDcsOCBAQAogCQkJIXN0cmNtcChjbGFzcy0+bmFtZSwgIiZzdHJ1Y3QtPmxvY2tmaWVsZCIpKQogCQlyZXR1cm4gMTsKICNlbmRpZgotCS8qIEFsbG93IGV2ZXJ5dGhpbmcgZWxzZS4gMCB3b3VsZCBiZSBmaWx0ZXIgZXZlcnl0aGluZyBlbHNlICovCi0JcmV0dXJuIDE7CisJLyogRmlsdGVyIGV2ZXJ5dGhpbmcgZWxzZS4gMSB3b3VsZCBiZSB0byBhbGxvdyBldmVyeXRoaW5nIGVsc2UgKi8KKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCkBAIC0yMTQsNyArMjQyLDcgQEAKIAogLyoKICAqIFN0YWNrLXRyYWNlOiB0aWdodGx5IHBhY2tlZCBhcnJheSBvZiBzdGFjayBiYWNrdHJhY2UKLSAqIGFkZHJlc3Nlcy4gUHJvdGVjdGVkIGJ5IHRoZSBoYXNoX2xvY2suCisgKiBhZGRyZXNzZXMuIFByb3RlY3RlZCBieSB0aGUgZ3JhcGhfbG9jay4KICAqLwogdW5zaWduZWQgbG9uZyBucl9zdGFja190cmFjZV9lbnRyaWVzOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RhY2tfdHJhY2VbTUFYX1NUQUNLX1RSQUNFX0VOVFJJRVNdOwpAQCAtMjI4LDI1ICsyNTYsMjAgQEAKIAl0cmFjZS0+c2tpcCA9IDM7CiAJdHJhY2UtPmFsbF9jb250ZXh0cyA9IDA7CiAKLQkvKiBNYWtlIHN1cmUgdG8gbm90IHJlY3Vyc2UgaW4gY2FzZSB0aGUgdGhlIHVud2luZGVyIG5lZWRzIHRvIHRhawotZQkgICBsb2Nrcy4gKi8KLQlsb2NrZGVwX29mZigpOwogCXNhdmVfc3RhY2tfdHJhY2UodHJhY2UsIE5VTEwpOwotCWxvY2tkZXBfb24oKTsKIAogCXRyYWNlLT5tYXhfZW50cmllcyA9IHRyYWNlLT5ucl9lbnRyaWVzOwogCiAJbnJfc3RhY2tfdHJhY2VfZW50cmllcyArPSB0cmFjZS0+bnJfZW50cmllczsKLQlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTihucl9zdGFja190cmFjZV9lbnRyaWVzID4gTUFYX1NUQUNLX1RSQUNFX0VOVFJJRVMpKQotCQlyZXR1cm4gMDsKIAogCWlmIChucl9zdGFja190cmFjZV9lbnRyaWVzID09IE1BWF9TVEFDS19UUkFDRV9FTlRSSUVTKSB7Ci0JCV9fcmF3X3NwaW5fdW5sb2NrKCZoYXNoX2xvY2spOwotCQlpZiAoZGVidWdfbG9ja3Nfb2ZmKCkpIHsKLQkJCXByaW50aygiQlVHOiBNQVhfU1RBQ0tfVFJBQ0VfRU5UUklFUyB0b28gbG93IVxuIik7Ci0JCQlwcmludGsoInR1cm5pbmcgb2ZmIHRoZSBsb2NraW5nIGNvcnJlY3RuZXNzIHZhbGlkYXRvci5cbiIpOwotCQkJZHVtcF9zdGFjaygpOwotCQl9CisJCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpKQorCQkJcmV0dXJuIDA7CisKKwkJcHJpbnRrKCJCVUc6IE1BWF9TVEFDS19UUkFDRV9FTlRSSUVTIHRvbyBsb3chXG4iKTsKKwkJcHJpbnRrKCJ0dXJuaW5nIG9mZiB0aGUgbG9ja2luZyBjb3JyZWN0bmVzcyB2YWxpZGF0b3IuXG4iKTsKKwkJZHVtcF9zdGFjaygpOworCiAJCXJldHVybiAwOwogCX0KIApAQCAtMzU3LDcgKzM4MCw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X2xvY2tfbmFtZShzdHJ1Y3QgbG9ja19jbGFzcyAqY2xhc3MpCiB7Ci0JY2hhciBzdHJbMTI4XSwgYzEsIGMyLCBjMywgYzQ7CisJY2hhciBzdHJbS1NZTV9OQU1FX0xFTiArIDFdLCBjMSwgYzIsIGMzLCBjNDsKIAljb25zdCBjaGFyICpuYW1lOwogCiAJZ2V0X3VzYWdlX2NoYXJzKGNsYXNzLCAmYzEsICZjMiwgJmMzLCAmYzQpOwpAQCAtMzc5LDcgKzQwMiw3IEBACiBzdGF0aWMgdm9pZCBwcmludF9sb2NrZGVwX2NhY2hlKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaykKIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWNoYXIgc3RyWzEyOF07CisJY2hhciBzdHJbS1NZTV9OQU1FX0xFTiArIDFdOwogCiAJbmFtZSA9IGxvY2stPm5hbWU7CiAJaWYgKCFuYW1lKQpAQCAtNDQ5LDcgKzQ3Miw5IEBACiAJcHJpbnRfbG9ja19jbGFzc19oZWFkZXIoY2xhc3MsIGRlcHRoKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZjbGFzcy0+bG9ja3NfYWZ0ZXIsIGVudHJ5KSB7Ci0JCURFQlVHX0xPQ0tTX1dBUk5fT04oIWVudHJ5LT5jbGFzcyk7CisJCWlmIChERUJVR19MT0NLU19XQVJOX09OKCFlbnRyeS0+Y2xhc3MpKQorCQkJcmV0dXJuOworCiAJCXByaW50X2xvY2tfZGVwZW5kZW5jaWVzKGVudHJ5LT5jbGFzcywgZGVwdGggKyAxKTsKIAogCQlwcmludGsoIiUqcyAuLi4gYWNxdWlyZWQgYXQ6XG4iLGRlcHRoLCIiKTsKQEAgLTQ3NCw3ICs0OTksOCBAQAogCQlyZXR1cm4gMDsKIAogCWVudHJ5LT5jbGFzcyA9IHRoaXM7Ci0Jc2F2ZV90cmFjZSgmZW50cnktPnRyYWNlKTsKKwlpZiAoIXNhdmVfdHJhY2UoJmVudHJ5LT50cmFjZSkpCisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBTaW5jZSB3ZSBuZXZlciByZW1vdmUgZnJvbSB0aGUgZGVwZW5kZW5jeSBsaXN0LCB0aGUgbGlzdCBjYW4KQEAgLTUzMiw5ICs1NTgsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7CiAKLQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQlkZWJ1Z19sb2Nrc19vZmYoKTsKLQlpZiAoZGVidWdfbG9ja3Nfc2lsZW50KQorCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpIHx8IGRlYnVnX2xvY2tzX3NpbGVudCkKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CkBAIC01NjMsNyArNTg3LDkgQEAKIAkJcmV0dXJuIDA7CiAKIAl0aGlzLmNsYXNzID0gY2hlY2tfc291cmNlLT5jbGFzczsKLQlzYXZlX3RyYWNlKCZ0aGlzLnRyYWNlKTsKKwlpZiAoIXNhdmVfdHJhY2UoJnRoaXMudHJhY2UpKQorCQlyZXR1cm4gMDsKKwogCXByaW50X2NpcmN1bGFyX2J1Z19lbnRyeSgmdGhpcywgMCk7CiAKIAlwcmludGsoIlxub3RoZXIgaW5mbyB0aGF0IG1pZ2h0IGhlbHAgdXMgZGVidWcgdGhpczpcblxuIik7CkBAIC01NzUsMTAgKzYwMSwxNCBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIFJFQ1VSU0lPTl9MSU1JVCA0MAorCiBzdGF0aWMgaW50IG5vaW5saW5lIHByaW50X2luZmluaXRlX3JlY3Vyc2lvbl9idWcodm9pZCkKIHsKLQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQlERUJVR19MT0NLU19XQVJOX09OKDEpOworCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpKQorCQlyZXR1cm4gMDsKKworCVdBUk5fT04oMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU5NSw3ICs2MjUsNyBAQAogCWRlYnVnX2F0b21pY19pbmMoJm5yX2N5Y2xpY19jaGVja19yZWN1cnNpb25zKTsKIAlpZiAoZGVwdGggPiBtYXhfcmVjdXJzaW9uX2RlcHRoKQogCQltYXhfcmVjdXJzaW9uX2RlcHRoID0gZGVwdGg7Ci0JaWYgKGRlcHRoID49IDIwKQorCWlmIChkZXB0aCA+PSBSRUNVUlNJT05fTElNSVQpCiAJCXJldHVybiBwcmludF9pbmZpbml0ZV9yZWN1cnNpb25fYnVnKCk7CiAJLyoKIAkgKiBDaGVjayB0aGlzIGxvY2sncyBkZXBlbmRlbmN5IGxpc3Q6CkBAIC02NDUsNyArNjc1LDcgQEAKIAogCWlmIChkZXB0aCA+IG1heF9yZWN1cnNpb25fZGVwdGgpCiAJCW1heF9yZWN1cnNpb25fZGVwdGggPSBkZXB0aDsKLQlpZiAoZGVwdGggPj0gMjApCisJaWYgKGRlcHRoID49IFJFQ1VSU0lPTl9MSU1JVCkKIAkJcmV0dXJuIHByaW50X2luZmluaXRlX3JlY3Vyc2lvbl9idWcoKTsKIAogCWRlYnVnX2F0b21pY19pbmMoJm5yX2ZpbmRfdXNhZ2VfZm9yd2FyZHNfY2hlY2tzKTsKQEAgLTY4NCw3ICs3MTQsNyBAQAogCiAJaWYgKGRlcHRoID4gbWF4X3JlY3Vyc2lvbl9kZXB0aCkKIAkJbWF4X3JlY3Vyc2lvbl9kZXB0aCA9IGRlcHRoOwotCWlmIChkZXB0aCA+PSAyMCkKKwlpZiAoZGVwdGggPj0gUkVDVVJTSU9OX0xJTUlUKQogCQlyZXR1cm4gcHJpbnRfaW5maW5pdGVfcmVjdXJzaW9uX2J1ZygpOwogCiAJZGVidWdfYXRvbWljX2luYygmbnJfZmluZF91c2FnZV9iYWNrd2FyZHNfY2hlY2tzKTsKQEAgLTcxMyw5ICs3NDMsNyBAQAogCQkJIGVudW0gbG9ja191c2FnZV9iaXQgYml0MiwKIAkJCSBjb25zdCBjaGFyICppcnFjbGFzcykKIHsKLQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQlkZWJ1Z19sb2Nrc19vZmYoKTsKLQlpZiAoZGVidWdfbG9ja3Nfc2lsZW50KQorCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpIHx8IGRlYnVnX2xvY2tzX3NpbGVudCkKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKQEAgLTc5Niw5ICs4MjQsNyBAQAogcHJpbnRfZGVhZGxvY2tfYnVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vyciwgc3RydWN0IGhlbGRfbG9jayAqcHJldiwKIAkJICAgc3RydWN0IGhlbGRfbG9jayAqbmV4dCkKIHsKLQlkZWJ1Z19sb2Nrc19vZmYoKTsKLQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQlpZiAoZGVidWdfbG9ja3Nfc2lsZW50KQorCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpIHx8IGRlYnVnX2xvY2tzX3NpbGVudCkKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKQEAgLTk2NCwyNyArOTkwLDI0IEBACiAJCQkgICAgICAgJnByZXYtPmNsYXNzLT5sb2Nrc19hZnRlciwgbmV4dC0+YWNxdWlyZV9pcCk7CiAJaWYgKCFyZXQpCiAJCXJldHVybiAwOwotCS8qCi0JICogUmV0dXJuIHZhbHVlIG9mIDIgc2lnbmFscyAnZGVwZW5kZW5jeSBhbHJlYWR5IGFkZGVkJywKLQkgKiBpbiB0aGF0IGNhc2Ugd2UgZG9udCBoYXZlIHRvIGFkZCB0aGUgYmFja2xpbmsgZWl0aGVyLgotCSAqLwotCWlmIChyZXQgPT0gMikKLQkJcmV0dXJuIDI7CisKIAlyZXQgPSBhZGRfbG9ja190b19saXN0KG5leHQtPmNsYXNzLCBwcmV2LT5jbGFzcywKIAkJCSAgICAgICAmbmV4dC0+Y2xhc3MtPmxvY2tzX2JlZm9yZSwgbmV4dC0+YWNxdWlyZV9pcCk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBEZWJ1Z2dpbmcgcHJpbnRvdXRzOgogCSAqLwogCWlmICh2ZXJib3NlKHByZXYtPmNsYXNzKSB8fCB2ZXJib3NlKG5leHQtPmNsYXNzKSkgewotCQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKKwkJZ3JhcGhfdW5sb2NrKCk7CiAJCXByaW50aygiXG4gbmV3IGRlcGVuZGVuY3k6ICIpOwogCQlwcmludF9sb2NrX25hbWUocHJldi0+Y2xhc3MpOwogCQlwcmludGsoIiA9PiAiKTsKIAkJcHJpbnRfbG9ja19uYW1lKG5leHQtPmNsYXNzKTsKIAkJcHJpbnRrKCJcbiIpOwogCQlkdW1wX3N0YWNrKCk7Ci0JCV9fcmF3X3NwaW5fbG9jaygmaGFzaF9sb2NrKTsKKwkJcmV0dXJuIGdyYXBoX2xvY2soKTsKIAl9CiAJcmV0dXJuIDE7CiB9CkBAIC0xMDIzLDcgKzEwNDYsOCBAQAogCQkgKiBhZGRlZDoKIAkJICovCiAJCWlmIChobG9jay0+cmVhZCAhPSAyKSB7Ci0JCQljaGVja19wcmV2X2FkZChjdXJyLCBobG9jaywgbmV4dCk7CisJCQlpZiAoIWNoZWNrX3ByZXZfYWRkKGN1cnIsIGhsb2NrLCBuZXh0KSkKKwkJCQlyZXR1cm4gMDsKIAkJCS8qCiAJCQkgKiBTdG9wIGFmdGVyIHRoZSBmaXJzdCBub24tdHJ5bG9jayBlbnRyeSwKIAkJCSAqIGFzIG5vbi10cnlsb2NrIGVudHJpZXMgaGF2ZSBhZGRlZCB0aGVpcgpAQCAtMTA0OCw4ICsxMDcyLDEwIEBACiAJfQogCXJldHVybiAxOwogb3V0X2J1ZzoKLQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQlERUJVR19MT0NLU19XQVJOX09OKDEpOworCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpKQorCQlyZXR1cm4gMDsKKworCVdBUk5fT04oMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNzksNyArMTEwNSw4IEBACiAJICovCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJc3RhcnQgPSAodW5zaWduZWQgbG9uZykgJl9fcGVyX2NwdV9zdGFydCArIHBlcl9jcHVfb2Zmc2V0KGkpOwotCQllbmQgICA9ICh1bnNpZ25lZCBsb25nKSAmX19wZXJfY3B1X2VuZCAgICsgcGVyX2NwdV9vZmZzZXQoaSk7CisJCWVuZCAgID0gKHVuc2lnbmVkIGxvbmcpICZfX3Blcl9jcHVfc3RhcnQgKyBQRVJDUFVfRU5PVUdIX1JPT00KKwkJCQkJKyBwZXJfY3B1X29mZnNldChpKTsKIAogCQlpZiAoKGFkZHIgPj0gc3RhcnQpICYmIChhZGRyIDwgZW5kKSkKIAkJCXJldHVybiAxOwpAQCAtMTE3NCwxMSArMTIwMSwxMiBAQAogICogaXRzZWxmLCBzbyBhY3R1YWwgbG9va3VwIG9mIHRoZSBoYXNoIHNob3VsZCBiZSBvbmNlIHBlciBsb2NrIG9iamVjdC4KICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbG9ja19jbGFzcyAqCi1yZWdpc3Rlcl9sb2NrX2NsYXNzKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgdW5zaWduZWQgaW50IHN1YmNsYXNzKQorcmVnaXN0ZXJfbG9ja19jbGFzcyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGludCBzdWJjbGFzcywgaW50IGZvcmNlKQogewogCXN0cnVjdCBsb2NrZGVwX3N1YmNsYXNzX2tleSAqa2V5OwogCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hfaGVhZDsKIAlzdHJ1Y3QgbG9ja19jbGFzcyAqY2xhc3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWNsYXNzID0gbG9va191cF9sb2NrX2NsYXNzKGxvY2ssIHN1YmNsYXNzKTsKIAlpZiAobGlrZWx5KGNsYXNzKSkKQEAgLTEyMDAsNyArMTIyOCwxMSBAQAogCWtleSA9IGxvY2stPmtleS0+c3Via2V5cyArIHN1YmNsYXNzOwogCWhhc2hfaGVhZCA9IGNsYXNzaGFzaGVudHJ5KGtleSk7CiAKLQlfX3Jhd19zcGluX2xvY2soJmhhc2hfbG9jayk7CisJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoIWdyYXBoX2xvY2soKSkgeworCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJLyoKIAkgKiBXZSBoYXZlIHRvIGRvIHRoZSBoYXNoLXdhbGsgYWdhaW4sIHRvIGF2b2lkIHJhY2VzCiAJICogd2l0aCBhbm90aGVyIENQVToKQEAgLTEyMTMsOCArMTI0NSwxMiBAQAogCSAqIHRoZSBoYXNoOgogCSAqLwogCWlmIChucl9sb2NrX2NsYXNzZXMgPj0gTUFYX0xPQ0tERVBfS0VZUykgewotCQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQkJZGVidWdfbG9ja3Nfb2ZmKCk7CisJCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpKSB7CisJCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwogCQlwcmludGsoIkJVRzogTUFYX0xPQ0tERVBfS0VZUyB0b28gbG93IVxuIik7CiAJCXByaW50aygidHVybmluZyBvZmYgdGhlIGxvY2tpbmcgY29ycmVjdG5lc3MgdmFsaWRhdG9yLlxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMTIzNSwxOCArMTI3MSwyNiBAQAogCWxpc3RfYWRkX3RhaWxfcmN1KCZjbGFzcy0+aGFzaF9lbnRyeSwgaGFzaF9oZWFkKTsKIAogCWlmICh2ZXJib3NlKGNsYXNzKSkgewotCQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKKwkJZ3JhcGhfdW5sb2NrKCk7CisJCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKIAkJcHJpbnRrKCJcbm5ldyBjbGFzcyAlcDogJXMiLCBjbGFzcy0+a2V5LCBjbGFzcy0+bmFtZSk7CiAJCWlmIChjbGFzcy0+bmFtZV92ZXJzaW9uID4gMSkKIAkJCXByaW50aygiIyVkIiwgY2xhc3MtPm5hbWVfdmVyc2lvbik7CiAJCXByaW50aygiXG4iKTsKIAkJZHVtcF9zdGFjaygpOwotCQlfX3Jhd19zcGluX2xvY2soJmhhc2hfbG9jayk7CisKKwkJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJaWYgKCFncmFwaF9sb2NrKCkpIHsKKwkJCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCX0KIG91dF91bmxvY2tfc2V0OgotCV9fcmF3X3NwaW5fdW5sb2NrKCZoYXNoX2xvY2spOworCWdyYXBoX3VubG9jaygpOworCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKLQlpZiAoIXN1YmNsYXNzKQorCWlmICghc3ViY2xhc3MgfHwgZm9yY2UpCiAJCWxvY2stPmNsYXNzX2NhY2hlID0gY2xhc3M7CiAKIAlERUJVR19MT0NLU19XQVJOX09OKGNsYXNzLT5zdWJjbGFzcyAhPSBzdWJjbGFzcyk7CkBAIC0xMjU5LDcgKzEzMDMsNyBAQAogICogYWRkIGl0IGFuZCByZXR1cm4gMCAtIGluIHRoaXMgY2FzZSB0aGUgbmV3IGRlcGVuZGVuY3kgY2hhaW4gaXMKICAqIHZhbGlkYXRlZC4gSWYgdGhlIGtleSBpcyBhbHJlYWR5IGhhc2hlZCwgcmV0dXJuIDEuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGxvb2t1cF9jaGFpbl9jYWNoZSh1NjQgY2hhaW5fa2V5KQorc3RhdGljIGlubGluZSBpbnQgbG9va3VwX2NoYWluX2NhY2hlKHU2NCBjaGFpbl9rZXksIHN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2hlYWQgPSBjaGFpbmhhc2hlbnRyeShjaGFpbl9rZXkpOwogCXN0cnVjdCBsb2NrX2NoYWluICpjaGFpbjsKQEAgLTEyNzMsMzQgKzEzMTcsMzIgQEAKIAkJaWYgKGNoYWluLT5jaGFpbl9rZXkgPT0gY2hhaW5fa2V5KSB7CiBjYWNoZV9oaXQ6CiAJCQlkZWJ1Z19hdG9taWNfaW5jKCZjaGFpbl9sb29rdXBfaGl0cyk7Ci0JCQkvKgotCQkJICogSW4gdGhlIGRlYnVnZ2luZyBjYXNlLCBmb3JjZSByZWR1bmRhbnQgY2hlY2tpbmcKLQkJCSAqIGJ5IHJldHVybmluZyAxOgotCQkJICovCi0jaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tERVAKLQkJCV9fcmF3X3NwaW5fbG9jaygmaGFzaF9sb2NrKTsKLQkJCXJldHVybiAxOwotI2VuZGlmCisJCQlpZiAodmVyeV92ZXJib3NlKGNsYXNzKSkKKwkJCQlwcmludGsoIlxuaGFzaCBjaGFpbiBhbHJlYWR5IGNhY2hlZCwga2V5OiAlMDE2THggdGFpbCBjbGFzczogWyVwXSAlc1xuIiwgY2hhaW5fa2V5LCBjbGFzcy0+a2V5LCBjbGFzcy0+bmFtZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KKwlpZiAodmVyeV92ZXJib3NlKGNsYXNzKSkKKwkJcHJpbnRrKCJcbm5ldyBoYXNoIGNoYWluLCBrZXk6ICUwMTZMeCB0YWlsIGNsYXNzOiBbJXBdICVzXG4iLCBjaGFpbl9rZXksIGNsYXNzLT5rZXksIGNsYXNzLT5uYW1lKTsKIAkvKgogCSAqIEFsbG9jYXRlIGEgbmV3IGNoYWluIGVudHJ5IGZyb20gdGhlIHN0YXRpYyBhcnJheSwgYW5kIGFkZAogCSAqIGl0IHRvIHRoZSBoYXNoOgogCSAqLwotCV9fcmF3X3NwaW5fbG9jaygmaGFzaF9sb2NrKTsKKwlpZiAoIWdyYXBoX2xvY2soKSkKKwkJcmV0dXJuIDA7CiAJLyoKIAkgKiBXZSBoYXZlIHRvIHdhbGsgdGhlIGNoYWluIGFnYWluIGxvY2tlZCAtIHRvIGF2b2lkIGR1cGxpY2F0ZXM6CiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFpbiwgaGFzaF9oZWFkLCBlbnRyeSkgewogCQlpZiAoY2hhaW4tPmNoYWluX2tleSA9PSBjaGFpbl9rZXkpIHsKLQkJCV9fcmF3X3NwaW5fdW5sb2NrKCZoYXNoX2xvY2spOworCQkJZ3JhcGhfdW5sb2NrKCk7CiAJCQlnb3RvIGNhY2hlX2hpdDsKIAkJfQogCX0KIAlpZiAodW5saWtlbHkobnJfbG9ja19jaGFpbnMgPj0gTUFYX0xPQ0tERVBfQ0hBSU5TKSkgewotCQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQkJZGVidWdfbG9ja3Nfb2ZmKCk7CisJCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpKQorCQkJcmV0dXJuIDA7CisKIAkJcHJpbnRrKCJCVUc6IE1BWF9MT0NLREVQX0NIQUlOUyB0b28gbG93IVxuIik7CiAJCXByaW50aygidHVybmluZyBvZmYgdGhlIGxvY2tpbmcgY29ycmVjdG5lc3MgdmFsaWRhdG9yLlxuIik7CiAJCXJldHVybiAwOwpAQCAtMTM3Niw5ICsxNDE4LDcgQEAKIAkJCXN0cnVjdCBoZWxkX2xvY2sgKnRoaXMsIGludCBmb3J3YXJkcywKIAkJCWNvbnN0IGNoYXIgKmlycWNsYXNzKQogewotCV9fcmF3X3NwaW5fdW5sb2NrKCZoYXNoX2xvY2spOwotCWRlYnVnX2xvY2tzX29mZigpOwotCWlmIChkZWJ1Z19sb2Nrc19zaWxlbnQpCisJaWYgKCFkZWJ1Z19sb2Nrc19vZmZfZ3JhcGhfdW5sb2NrKCkgfHwgZGVidWdfbG9ja3Nfc2lsZW50KQogCQlyZXR1cm4gMDsKIAogCXByaW50aygiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwpAQCAtMTQ0OCw3ICsxNDg4LDcgQEAKIAlyZXR1cm4gcHJpbnRfaXJxX2ludmVyc2lvbl9idWcoY3VyciwgYmFja3dhcmRzX21hdGNoLCB0aGlzLCAwLCBpcnFjbGFzcyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9pcnF0cmFjZV9ldmVudHMoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQordm9pZCBwcmludF9pcnF0cmFjZV9ldmVudHMoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQogewogCXByaW50aygiaXJxIGV2ZW50IHN0YW1wOiAldVxuIiwgY3Vyci0+aXJxX2V2ZW50cyk7CiAJcHJpbnRrKCJoYXJkaXJxcyBsYXN0ICBlbmFibGVkIGF0ICgldSk6ICIsIGN1cnItPmhhcmRpcnFfZW5hYmxlX2V2ZW50KTsKQEAgLTE0NjEsMTkgKzE1MDEsMTMgQEAKIAlwcmludF9pcF9zeW0oY3Vyci0+c29mdGlycV9kaXNhYmxlX2lwKTsKIH0KIAotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9pcnF0cmFjZV9ldmVudHMoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQotewotfQogI2VuZGlmCiAKIHN0YXRpYyBpbnQKIHByaW50X3VzYWdlX2J1ZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIsIHN0cnVjdCBoZWxkX2xvY2sgKnRoaXMsCiAJCWVudW0gbG9ja191c2FnZV9iaXQgcHJldl9iaXQsIGVudW0gbG9ja191c2FnZV9iaXQgbmV3X2JpdCkKIHsKLQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQlkZWJ1Z19sb2Nrc19vZmYoKTsKLQlpZiAoZGVidWdfbG9ja3Nfc2lsZW50KQorCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpIHx8IGRlYnVnX2xvY2tzX3NpbGVudCkKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKQEAgLTE1MzQsMTIgKzE1NjgsMTMgQEAKIAlpZiAobGlrZWx5KHRoaXMtPmNsYXNzLT51c2FnZV9tYXNrICYgbmV3X21hc2spKQogCQlyZXR1cm4gMTsKIAotCV9fcmF3X3NwaW5fbG9jaygmaGFzaF9sb2NrKTsKKwlpZiAoIWdyYXBoX2xvY2soKSkKKwkJcmV0dXJuIDA7CiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UgZGlkbnQgcmFjZToKIAkgKi8KIAlpZiAodW5saWtlbHkodGhpcy0+Y2xhc3MtPnVzYWdlX21hc2sgJiBuZXdfbWFzaykpIHsKLQkJX19yYXdfc3Bpbl91bmxvY2soJmhhc2hfbG9jayk7CisJCWdyYXBoX3VubG9jaygpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTE3MjUsMTUgKzE3NjAsMTYgQEAKIAkJZGVidWdfYXRvbWljX2RlYygmbnJfdW51c2VkX2xvY2tzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGVidWdfbG9ja3Nfb2ZmKCk7CisJCWlmICghZGVidWdfbG9ja3Nfb2ZmX2dyYXBoX3VubG9jaygpKQorCQkJcmV0dXJuIDA7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybiAwOwogCX0KIAotCV9fcmF3X3NwaW5fdW5sb2NrKCZoYXNoX2xvY2spOworCWdyYXBoX3VubG9jaygpOwogCiAJLyoKLQkgKiBXZSBtdXN0IHByaW50ayBvdXRzaWRlIG9mIHRoZSBoYXNoX2xvY2s6CisJICogV2UgbXVzdCBwcmludGsgb3V0c2lkZSBvZiB0aGUgZ3JhcGhfbG9jazoKIAkgKi8KIAlpZiAocmV0ID09IDIpIHsKIAkJcHJpbnRrKCJcbm1hcmtlZCBsb2NrIGFzIHslc306XG4iLCB1c2FnZV9zdHJbbmV3X2JpdF0pOwpAQCAtMTkzNCw3ICsxOTcwLDcgQEAKICAqIEluaXRpYWxpemUgYSBsb2NrIGluc3RhbmNlJ3MgbG9jay1jbGFzcyBtYXBwaW5nIGluZm86CiAgKi8KIHZvaWQgbG9ja2RlcF9pbml0X21hcChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCi0JCSAgICAgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5KQorCQkgICAgICBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSwgaW50IHN1YmNsYXNzKQogewogCWlmICh1bmxpa2VseSghZGVidWdfbG9ja3MpKQogCQlyZXR1cm47CkBAIC0xOTU0LDYgKzE5OTAsOCBAQAogCWxvY2stPm5hbWUgPSBuYW1lOwogCWxvY2stPmtleSA9IGtleTsKIAlsb2NrLT5jbGFzc19jYWNoZSA9IE5VTEw7CisJaWYgKHN1YmNsYXNzKQorCQlyZWdpc3Rlcl9sb2NrX2NsYXNzKGxvY2ssIHN1YmNsYXNzLCAxKTsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwobG9ja2RlcF9pbml0X21hcCk7CkBAIC0xOTkyLDcgKzIwMzAsNyBAQAogCSAqIE5vdCBjYWNoZWQgeWV0IG9yIHN1YmNsYXNzPwogCSAqLwogCWlmICh1bmxpa2VseSghY2xhc3MpKSB7Ci0JCWNsYXNzID0gcmVnaXN0ZXJfbG9ja19jbGFzcyhsb2NrLCBzdWJjbGFzcyk7CisJCWNsYXNzID0gcmVnaXN0ZXJfbG9ja19jbGFzcyhsb2NrLCBzdWJjbGFzcywgMCk7CiAJCWlmICghY2xhc3MpCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC0yMTI5LDkgKzIxNjcsOSBAQAogCSAqIFdlIGxvb2sgdXAgdGhlIGNoYWluX2tleSBhbmQgZG8gdGhlIE8oTl4yKSBjaGVjayBhbmQgdXBkYXRlIG9mCiAJICogdGhlIGRlcGVuZGVuY2llcyBvbmx5IGlmIHRoaXMgaXMgYSBuZXcgZGVwZW5kZW5jeSBjaGFpbi4KIAkgKiAoSWYgbG9va3VwX2NoYWluX2NhY2hlKCkgcmV0dXJucyB3aXRoIDEgaXQgYWNxdWlyZXMKLQkgKiBoYXNoX2xvY2sgZm9yIHVzKQorCSAqIGdyYXBoX2xvY2sgZm9yIHVzKQogCSAqLwotCWlmICghdHJ5bG9jayAmJiAoY2hlY2sgPT0gMikgJiYgbG9va3VwX2NoYWluX2NhY2hlKGNoYWluX2tleSkpIHsKKwlpZiAoIXRyeWxvY2sgJiYgKGNoZWNrID09IDIpICYmIGxvb2t1cF9jaGFpbl9jYWNoZShjaGFpbl9rZXksIGNsYXNzKSkgewogCQkvKgogCQkgKiBDaGVjayB3aGV0aGVyIGxhc3QgaGVsZCBsb2NrOgogCQkgKgpAQCAtMjE2Miw3ICsyMjAwLDcgQEAKIAkJaWYgKCFjaGFpbl9oZWFkICYmIHJldCAhPSAyKQogCQkJaWYgKCFjaGVja19wcmV2c19hZGQoY3VyciwgaGxvY2spKQogCQkJCXJldHVybiAwOwotCQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKKwkJZ3JhcGhfdW5sb2NrKCk7CiAJfQogCWN1cnItPmxvY2tkZXBfZGVwdGgrKzsKIAljaGVja19jaGFpbl9rZXkoY3Vycik7CkBAIC0yNDI1LDYgKzI0NjMsNyBAQAogdm9pZCBsb2NrZGVwX3Jlc2V0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKIAogCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY3VycmVudC0+Y3Vycl9jaGFpbl9rZXkgPSAwOwpAQCAtMjQzNSw2ICsyNDc0LDggQEAKIAlucl9zb2Z0aXJxX2NoYWlucyA9IDA7CiAJbnJfcHJvY2Vzc19jaGFpbnMgPSAwOwogCWRlYnVnX2xvY2tzID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgQ0hBSU5IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoY2hhaW5oYXNoX3RhYmxlICsgaSk7CiAJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIApAQCAtMjQ3MSw3ICsyNTEyLDcgQEAKIAlpbnQgaTsKIAogCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JX19yYXdfc3Bpbl9sb2NrKCZoYXNoX2xvY2spOworCWdyYXBoX2xvY2soKTsKIAogCS8qCiAJICogVW5oYXNoIGFsbCBjbGFzc2VzIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IHRoaXMgbW9kdWxlOgpAQCAtMjQ4NSw3ICsyNTI2LDcgQEAKIAkJCQl6YXBfY2xhc3MoY2xhc3MpOwogCX0KIAotCV9fcmF3X3NwaW5fdW5sb2NrKCZoYXNoX2xvY2spOworCWdyYXBoX3VubG9jaygpOwogCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKQEAgLTI1MTMsMjAgKzI1NTQsMjAgQEAKIAkgKiBEZWJ1ZyBjaGVjazogaW4gdGhlIGVuZCBhbGwgbWFwcGVkIGNsYXNzZXMgc2hvdWxkCiAJICogYmUgZ29uZS4KIAkgKi8KLQlfX3Jhd19zcGluX2xvY2soJmhhc2hfbG9jayk7CisJZ3JhcGhfbG9jaygpOwogCWZvciAoaSA9IDA7IGkgPCBDTEFTU0hBU0hfU0laRTsgaSsrKSB7CiAJCWhlYWQgPSBjbGFzc2hhc2hfdGFibGUgKyBpOwogCQlpZiAobGlzdF9lbXB0eShoZWFkKSkKIAkJCWNvbnRpbnVlOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2xhc3MsIG5leHQsIGhlYWQsIGhhc2hfZW50cnkpIHsKIAkJCWlmICh1bmxpa2VseShjbGFzcyA9PSBsb2NrLT5jbGFzc19jYWNoZSkpIHsKLQkJCQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKLQkJCQlERUJVR19MT0NLU19XQVJOX09OKDEpOworCQkJCWlmIChkZWJ1Z19sb2Nrc19vZmZfZ3JhcGhfdW5sb2NrKCkpCisJCQkJCVdBUk5fT04oMSk7CiAJCQkJZ290byBvdXRfcmVzdG9yZTsKIAkJCX0KIAkJfQogCX0KLQlfX3Jhd19zcGluX3VubG9jaygmaGFzaF9sb2NrKTsKKwlncmFwaF91bmxvY2soKTsKIAogb3V0X3Jlc3RvcmU6CiAJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTI2NDAsNiArMjY4MSw3IEBACiAJfQogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKTsKIAogc3RhdGljIHZvaWQgcHJpbnRfaGVsZF9sb2Nrc19idWcoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQogewpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXBfaW50ZXJuYWxzLmggYi9rZXJuZWwvbG9ja2RlcF9pbnRlcm5hbHMuaAppbmRleCBlYWIwNDNjLi44Y2UwOWJjIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcF9pbnRlcm5hbHMuaAorKysgYi9rZXJuZWwvbG9ja2RlcF9pbnRlcm5hbHMuaApAQCAtMjAsNyArMjAsNyBAQAogI2RlZmluZSBNQVhfTE9DS0RFUF9LRVlTX0JJVFMJMTEKICNkZWZpbmUgTUFYX0xPQ0tERVBfS0VZUwkoMVVMIDw8IE1BWF9MT0NLREVQX0tFWVNfQklUUykKIAotI2RlZmluZSBNQVhfTE9DS0RFUF9DSEFJTlNfQklUUwkxMworI2RlZmluZSBNQVhfTE9DS0RFUF9DSEFJTlNfQklUUwkxNAogI2RlZmluZSBNQVhfTE9DS0RFUF9DSEFJTlMJKDFVTCA8PCBNQVhfTE9DS0RFUF9DSEFJTlNfQklUUykKIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NrZGVwX3Byb2MuYyBiL2tlcm5lbC9sb2NrZGVwX3Byb2MuYwppbmRleCBmNmU3MmVhLi5iNTU0YjQwIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcF9wcm9jLmMKKysrIGIva2VybmVsL2xvY2tkZXBfcHJvYy5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb2NrZGVwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbG9ja2RlcF9vcHMgPSB7CiAJLnN0YXJ0CT0gbF9zdGFydCwKIAkubmV4dAk9IGxfbmV4dCwKIAkuc3RvcAk9IGxfc3RvcCwKQEAgLTEzNSw3ICsxMzUsNyBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfbG9ja2RlcF9vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19sb2NrZGVwX29wZXJhdGlvbnMgPSB7CiAJLm9wZW4JCT0gbG9ja2RlcF9vcGVuLAogCS5yZWFkCQk9IHNlcV9yZWFkLAogCS5sbHNlZWsJCT0gc2VxX2xzZWVrLApAQCAtMzE5LDcgKzMxOSw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGxvY2tkZXBfc3RhdHNfc2hvdywgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfbG9ja2RlcF9zdGF0c19vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19sb2NrZGVwX3N0YXRzX29wZXJhdGlvbnMgPSB7CiAJLm9wZW4JCT0gbG9ja2RlcF9zdGF0c19vcGVuLAogCS5yZWFkCQk9IHNlcV9yZWFkLAogCS5sbHNlZWsJCT0gc2VxX2xzZWVrLApkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IDY3MDA5YmQuLmI1NjVlYWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTM0LDEwICszNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3Zlcm1hZ2ljLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNzkwLDYgKzc5MCwxOSBAQAogCS5zaG93ID0gc2hvd19yZWZjbnQsCiB9OwogCit2b2lkIG1vZHVsZV9wdXQoc3RydWN0IG1vZHVsZSAqbW9kdWxlKQoreworCWlmIChtb2R1bGUpIHsKKwkJdW5zaWduZWQgaW50IGNwdSA9IGdldF9jcHUoKTsKKwkJbG9jYWxfZGVjKCZtb2R1bGUtPnJlZltjcHVdLmNvdW50KTsKKwkJLyogTWF5YmUgdGhleSdyZSB3YWl0aW5nIGZvciB1cyB0byBkcm9wIHJlZmVyZW5jZT8gKi8KKwkJaWYgKHVubGlrZWx5KCFtb2R1bGVfaXNfbGl2ZShtb2R1bGUpKSkKKwkJCXdha2VfdXBfcHJvY2Vzcyhtb2R1bGUtPndhaXRlcik7CisJCXB1dF9jcHUoKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKG1vZHVsZV9wdXQpOworCiAjZWxzZSAvKiAhQ09ORklHX01PRFVMRV9VTkxPQUQgKi8KIHN0YXRpYyB2b2lkIHByaW50X3VubG9hZF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IG1vZHVsZSAqbW9kKQogewpAQCAtODExLDkgKzgyNCwzNCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19NT0RVTEVfVU5MT0FEICovCiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5pdHN0YXRlKHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptYXR0ciwKKwkJCSAgIHN0cnVjdCBtb2R1bGUgKm1vZCwgY2hhciAqYnVmZmVyKQoreworCWNvbnN0IGNoYXIgKnN0YXRlID0gInVua25vd24iOworCisJc3dpdGNoIChtb2QtPnN0YXRlKSB7CisJY2FzZSBNT0RVTEVfU1RBVEVfTElWRToKKwkJc3RhdGUgPSAibGl2ZSI7CisJCWJyZWFrOworCWNhc2UgTU9EVUxFX1NUQVRFX0NPTUlORzoKKwkJc3RhdGUgPSAiY29taW5nIjsKKwkJYnJlYWs7CisJY2FzZSBNT0RVTEVfU1RBVEVfR09JTkc6CisJCXN0YXRlID0gImdvaW5nIjsKKwkJYnJlYWs7CisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSBpbml0c3RhdGUgPSB7CisJLmF0dHIgPSB7IC5uYW1lID0gImluaXRzdGF0ZSIsIC5tb2RlID0gMDQ0NCwgLm93bmVyID0gVEhJU19NT0RVTEUgfSwKKwkuc2hvdyA9IHNob3dfaW5pdHN0YXRlLAorfTsKKwogc3RhdGljIHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptb2RpbmZvX2F0dHJzW10gPSB7CiAJJm1vZGluZm9fdmVyc2lvbiwKIAkmbW9kaW5mb19zcmN2ZXJzaW9uLAorCSZpbml0c3RhdGUsCiAjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKIAkmcmVmY250LAogI2VuZGlmCkBAIC0xMDg2LDIyICsxMTI0LDM1IEBACiAJCWdvdG8gb3V0OwogCWtvYmpfc2V0X2tzZXRfcygmbW9kLT5ta29iaiwgbW9kdWxlX3N1YnN5cyk7CiAJbW9kLT5ta29iai5tb2QgPSBtb2Q7Ci0JZXJyID0ga29iamVjdF9yZWdpc3RlcigmbW9kLT5ta29iai5rb2JqKTsKKworCS8qIGRlbGF5IHVldmVudCB1bnRpbCBmdWxsIHN5c2ZzIHBvcHVsYXRpb24gKi8KKwlrb2JqZWN0X2luaXQoJm1vZC0+bWtvYmoua29iaik7CisJZXJyID0ga29iamVjdF9hZGQoJm1vZC0+bWtvYmoua29iaik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKKwltb2QtPmRyaXZlcnNfZGlyID0ga29iamVjdF9hZGRfZGlyKCZtb2QtPm1rb2JqLmtvYmosICJkcml2ZXJzIik7CisJaWYgKCFtb2QtPmRyaXZlcnNfZGlyKQorCQlnb3RvIG91dF91bnJlZzsKKwogCWVyciA9IG1vZHVsZV9wYXJhbV9zeXNmc19zZXR1cChtb2QsIGtwYXJhbSwgbnVtX3BhcmFtcyk7CiAJaWYgKGVycikKLQkJZ290byBvdXRfdW5yZWc7CisJCWdvdG8gb3V0X3VucmVnX2RyaXZlcnM7CiAKIAllcnIgPSBtb2R1bGVfYWRkX21vZGluZm9fYXR0cnMobW9kKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF91bnJlZzsKKwkJZ290byBvdXRfdW5yZWdfcGFyYW07CiAKKwlrb2JqZWN0X3VldmVudCgmbW9kLT5ta29iai5rb2JqLCBLT0JKX0FERCk7CiAJcmV0dXJuIDA7CiAKK291dF91bnJlZ19kcml2ZXJzOgorCWtvYmplY3RfdW5yZWdpc3Rlcihtb2QtPmRyaXZlcnNfZGlyKTsKK291dF91bnJlZ19wYXJhbToKKwltb2R1bGVfcGFyYW1fc3lzZnNfcmVtb3ZlKG1vZCk7CiBvdXRfdW5yZWc6Ci0Ja29iamVjdF91bnJlZ2lzdGVyKCZtb2QtPm1rb2JqLmtvYmopOworCWtvYmplY3RfZGVsKCZtb2QtPm1rb2JqLmtvYmopOworCWtvYmplY3RfcHV0KCZtb2QtPm1rb2JqLmtvYmopOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xMTEwLDYgKzExNjEsNyBAQAogewogCW1vZHVsZV9yZW1vdmVfbW9kaW5mb19hdHRycyhtb2QpOwogCW1vZHVsZV9wYXJhbV9zeXNmc19yZW1vdmUobW9kKTsKKwlrb2JqZWN0X3VucmVnaXN0ZXIobW9kLT5kcml2ZXJzX2Rpcik7CiAKIAlrb2JqZWN0X3VucmVnaXN0ZXIoJm1vZC0+bWtvYmoua29iaik7CiB9CkBAIC0xMzQyLDcgKzEzOTQsNyBAQAogCiAJaWYgKCFsaWNlbnNlX2lzX2dwbF9jb21wYXRpYmxlKGxpY2Vuc2UpKSB7CiAJCWlmICghKHRhaW50ZWQgJiBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1vZHVsZSBsaWNlbnNlICclcycgdGFpbnRzIgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1vZHVsZSBsaWNlbnNlICclcycgdGFpbnRzICIKIAkJCQkia2VybmVsLlxuIiwgbW9kLT5uYW1lLCBsaWNlbnNlKTsKIAkJYWRkX3RhaW50X21vZHVsZShtb2QsIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSk7CiAJfQpAQCAtMTcxOCw3ICsxNzcwLDcgQEAKIAlzZXRfbGljZW5zZShtb2QsIGdldF9tb2RpbmZvKHNlY2hkcnMsIGluZm9pbmRleCwgImxpY2Vuc2UiKSk7CiAKIAlpZiAoc3RyY21wKG1vZC0+bmFtZSwgIm5kaXN3cmFwcGVyIikgPT0gMCkKLQkJYWRkX3RhaW50X21vZHVsZShtb2QsIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSk7CisJCWFkZF90YWludChUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUpOwogCWlmIChzdHJjbXAobW9kLT5uYW1lLCAiZHJpdmVybG9hZGVyIikgPT0gMCkKIAkJYWRkX3RhaW50X21vZHVsZShtb2QsIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSk7CiAKQEAgLTIxODIsNyArMjIzNCw3IEBACiAgICBXaGVyZSByZWZjb3VudCBpcyBhIG51bWJlciBvciAtLCBhbmQgZGVwcyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0CiAgICBvZiBkZXBlbmRzIG9yIC0uCiAqLwotc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vZHVsZXNfb3AgPSB7Citjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbW9kdWxlc19vcCA9IHsKIAkuc3RhcnQJPSBtX3N0YXJ0LAogCS5uZXh0CT0gbV9uZXh0LAogCS5zdG9wCT0gbV9zdG9wLApAQCAtMjI3NSwxMSArMjMyNywxNCBAQAogCiB2b2lkIG1vZHVsZV9hZGRfZHJpdmVyKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKKwlpbnQgbm9fd2FybjsKKwogCWlmICghbW9kIHx8ICFkcnYpCiAJCXJldHVybjsKIAotCS8qIERvbid0IGNoZWNrIHJldHVybiBjb2RlOyB0aGlzIGNhbGwgaXMgaWRlbXBvdGVudCAqLwotCXN5c2ZzX2NyZWF0ZV9saW5rKCZkcnYtPmtvYmosICZtb2QtPm1rb2JqLmtvYmosICJtb2R1bGUiKTsKKwkvKiBEb24ndCBjaGVjayByZXR1cm4gY29kZXM7IHRoZXNlIGNhbGxzIGFyZSBpZGVtcG90ZW50ICovCisJbm9fd2FybiA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkcnYtPmtvYmosICZtb2QtPm1rb2JqLmtvYmosICJtb2R1bGUiKTsKKwlub193YXJuID0gc3lzZnNfY3JlYXRlX2xpbmsobW9kLT5kcml2ZXJzX2RpciwgJmRydi0+a29iaiwgZHJ2LT5uYW1lKTsKIH0KIEVYUE9SVF9TWU1CT0wobW9kdWxlX2FkZF9kcml2ZXIpOwogCkBAIC0yMjg4LDYgKzIzNDMsOCBAQAogCWlmICghZHJ2KQogCQlyZXR1cm47CiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmRydi0+a29iaiwgIm1vZHVsZSIpOworCWlmIChkcnYtPm93bmVyICYmIGRydi0+b3duZXItPmRyaXZlcnNfZGlyKQorCQlzeXNmc19yZW1vdmVfbGluayhkcnYtPm93bmVyLT5kcml2ZXJzX2RpciwgZHJ2LT5uYW1lKTsKIH0KIEVYUE9SVF9TWU1CT0wobW9kdWxlX3JlbW92ZV9kcml2ZXIpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXgtZGVidWcuYyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCmluZGV4IGUzMjAzYzYuLjg0MTUzOWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCisrKyBiL2tlcm5lbC9tdXRleC1kZWJ1Zy5jCkBAIC03Nyw2ICs3Nyw5IEBACiAKIHZvaWQgZGVidWdfbXV0ZXhfdW5sb2NrKHN0cnVjdCBtdXRleCAqbG9jaykKIHsKKwlpZiAodW5saWtlbHkoIWRlYnVnX2xvY2tzKSkKKwkJcmV0dXJuOworCiAJREVCVUdfTE9DS1NfV0FSTl9PTihsb2NrLT5vd25lciAhPSBjdXJyZW50X3RocmVhZF9pbmZvKCkpOwogCURFQlVHX0xPQ0tTX1dBUk5fT04obG9jay0+bWFnaWMgIT0gbG9jayk7CiAJREVCVUdfTE9DS1NfV0FSTl9PTighbG9jay0+d2FpdF9saXN0LnByZXYgJiYgIWxvY2stPndhaXRfbGlzdC5uZXh0KTsKQEAgLTkxLDcgKzk0LDcgQEAKIAkgKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCByZWluaXRpYWxpemluZyBhIGhlbGQgbG9jazoKIAkgKi8KIAlkZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZCgodm9pZCAqKWxvY2ssIHNpemVvZigqbG9jaykpOwotCWxvY2tkZXBfaW5pdF9tYXAoJmxvY2stPmRlcF9tYXAsIG5hbWUsIGtleSk7CisJbG9ja2RlcF9pbml0X21hcCgmbG9jay0+ZGVwX21hcCwgbmFtZSwga2V5LCAwKTsKICNlbmRpZgogCWxvY2stPm93bmVyID0gTlVMTDsKIAlsb2NrLT5tYWdpYyA9IGxvY2s7CmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXguYyBiL2tlcm5lbC9tdXRleC5jCmluZGV4IDhjNzFjZjcuLmU3Y2JiYjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC5jCisrKyBiL2tlcm5lbC9tdXRleC5jCkBAIC0yMDYsNiArMjA2LDE1IEBACiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKG11dGV4X2xvY2tfbmVzdGVkKTsKKworaW50IF9fc2NoZWQKK211dGV4X2xvY2tfaW50ZXJydXB0aWJsZV9uZXN0ZWQoc3RydWN0IG11dGV4ICpsb2NrLCB1bnNpZ25lZCBpbnQgc3ViY2xhc3MpCit7CisJbWlnaHRfc2xlZXAoKTsKKwlyZXR1cm4gX19tdXRleF9sb2NrX2NvbW1vbihsb2NrLCBUQVNLX0lOVEVSUlVQVElCTEUsIHN1YmNsYXNzKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX25lc3RlZCk7CiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3Byb3h5LmMgYi9rZXJuZWwvbnNwcm94eS5jCmluZGV4IDZlYmRiODIuLmY1YjllZTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9uc3Byb3h5LmMKKysrIGIva2VybmVsL25zcHJveHkuYwpAQCAtMTcsOCArMTcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdF90YXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CiAKIHN0cnVjdCBuc3Byb3h5IGluaXRfbnNwcm94eSA9IElOSVRfTlNQUk9YWShpbml0X25zcHJveHkpOwogCkBAIC00NCwxMSArNDUsOSBAQAogewogCXN0cnVjdCBuc3Byb3h5ICpuczsKIAotCW5zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5zcHJveHkpLCBHRlBfS0VSTkVMKTsKLQlpZiAobnMpIHsKLQkJbWVtY3B5KG5zLCBvcmlnLCBzaXplb2Yoc3RydWN0IG5zcHJveHkpKTsKKwlucyA9IGttZW1kdXAob3JpZywgc2l6ZW9mKHN0cnVjdCBuc3Byb3h5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5zKQogCQlhdG9taWNfc2V0KCZucy0+Y291bnQsIDEpOwotCX0KIAlyZXR1cm4gbnM7CiB9CiAKQEAgLTYyLDEyICs2MSwxNCBAQAogCXN0cnVjdCBuc3Byb3h5ICpucyA9IGNsb25lX25hbWVzcGFjZXMob3JpZyk7CiAKIAlpZiAobnMpIHsKLQkJaWYgKG5zLT5uYW1lc3BhY2UpCi0JCQlnZXRfbmFtZXNwYWNlKG5zLT5uYW1lc3BhY2UpOworCQlpZiAobnMtPm1udF9ucykKKwkJCWdldF9tbnRfbnMobnMtPm1udF9ucyk7CiAJCWlmIChucy0+dXRzX25zKQogCQkJZ2V0X3V0c19ucyhucy0+dXRzX25zKTsKIAkJaWYgKG5zLT5pcGNfbnMpCiAJCQlnZXRfaXBjX25zKG5zLT5pcGNfbnMpOworCQlpZiAobnMtPnBpZF9ucykKKwkJCWdldF9waWRfbnMobnMtPnBpZF9ucyk7CiAJfQogCiAJcmV0dXJuIG5zOwpAQCAtOTksNyArMTAwLDcgQEAKIAogCXRzay0+bnNwcm94eSA9IG5ld19uczsKIAotCWVyciA9IGNvcHlfbmFtZXNwYWNlKGZsYWdzLCB0c2spOworCWVyciA9IGNvcHlfbW50X25zKGZsYWdzLCB0c2spOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X25zOwogCkBAIC0xMTEsMTYgKzExMiwyMyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2lwYzsKIAorCWVyciA9IGNvcHlfcGlkX25zKGZsYWdzLCB0c2spOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3BpZDsKKwogb3V0OgogCXB1dF9uc3Byb3h5KG9sZF9ucyk7CiAJcmV0dXJuIGVycjsKIAorb3V0X3BpZDoKKwlpZiAobmV3X25zLT5pcGNfbnMpCisJCXB1dF9pcGNfbnMobmV3X25zLT5pcGNfbnMpOwogb3V0X2lwYzoKIAlpZiAobmV3X25zLT51dHNfbnMpCiAJCXB1dF91dHNfbnMobmV3X25zLT51dHNfbnMpOwogb3V0X3V0czoKLQlpZiAobmV3X25zLT5uYW1lc3BhY2UpCi0JCXB1dF9uYW1lc3BhY2UobmV3X25zLT5uYW1lc3BhY2UpOworCWlmIChuZXdfbnMtPm1udF9ucykKKwkJcHV0X21udF9ucyhuZXdfbnMtPm1udF9ucyk7CiBvdXRfbnM6CiAJdHNrLT5uc3Byb3h5ID0gb2xkX25zOwogCWtmcmVlKG5ld19ucyk7CkBAIC0xMjksMTEgKzEzNywxMyBAQAogCiB2b2lkIGZyZWVfbnNwcm94eShzdHJ1Y3QgbnNwcm94eSAqbnMpCiB7Ci0JCWlmIChucy0+bmFtZXNwYWNlKQotCQkJcHV0X25hbWVzcGFjZShucy0+bmFtZXNwYWNlKTsKLQkJaWYgKG5zLT51dHNfbnMpCi0JCQlwdXRfdXRzX25zKG5zLT51dHNfbnMpOwotCQlpZiAobnMtPmlwY19ucykKLQkJCXB1dF9pcGNfbnMobnMtPmlwY19ucyk7Ci0JCWtmcmVlKG5zKTsKKwlpZiAobnMtPm1udF9ucykKKwkJcHV0X21udF9ucyhucy0+bW50X25zKTsKKwlpZiAobnMtPnV0c19ucykKKwkJcHV0X3V0c19ucyhucy0+dXRzX25zKTsKKwlpZiAobnMtPmlwY19ucykKKwkJcHV0X2lwY19ucyhucy0+aXBjX25zKTsKKwlpZiAobnMtPnBpZF9ucykKKwkJcHV0X3BpZF9ucyhucy0+cGlkX25zKTsKKwlrZnJlZShucyk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvcGlkLmMgYi9rZXJuZWwvcGlkLmMKaW5kZXggYjkxNDM5Mi4uMmVmZTlkOCAxMDA2NDQKLS0tIGEva2VybmVsL3BpZC5jCisrKyBiL2tlcm5lbC9waWQuYwpAQCAtMjYsMTIgKzI2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvcHNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgogCiAjZGVmaW5lIHBpZF9oYXNoZm4obnIpIGhhc2hfbG9uZygodW5zaWduZWQgbG9uZyluciwgcGlkaGFzaF9zaGlmdCkKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCAqcGlkX2hhc2g7CiBzdGF0aWMgaW50IHBpZGhhc2hfc2hpZnQ7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpwaWRfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwaWRfY2FjaGVwOwogCiBpbnQgcGlkX21heCA9IFBJRF9NQVhfREVGQVVMVDsKIApAQCAtNDMsOSArNDMsMTAgQEAKICNkZWZpbmUgQklUU19QRVJfUEFHRQkJKFBBR0VfU0laRSo4KQogI2RlZmluZSBCSVRTX1BFUl9QQUdFX01BU0sJKEJJVFNfUEVSX1BBR0UtMSkKIAotc3RhdGljIGlubGluZSBpbnQgbWtfcGlkKHN0cnVjdCBwc3BhY2UgKnBzcGFjZSwgc3RydWN0IHBpZG1hcCAqbWFwLCBpbnQgb2ZmKQorc3RhdGljIGlubGluZSBpbnQgbWtfcGlkKHN0cnVjdCBwaWRfbmFtZXNwYWNlICpwaWRfbnMsCisJCXN0cnVjdCBwaWRtYXAgKm1hcCwgaW50IG9mZikKIHsKLQlyZXR1cm4gKG1hcCAtIHBzcGFjZS0+cGlkbWFwKSpCSVRTX1BFUl9QQUdFICsgb2ZmOworCXJldHVybiAobWFwIC0gcGlkX25zLT5waWRtYXApKkJJVFNfUEVSX1BBR0UgKyBvZmY7CiB9CiAKICNkZWZpbmUgZmluZF9uZXh0X29mZnNldChtYXAsIG9mZikJCQkJCVwKQEAgLTU3LDExICs1OCwxNSBAQAogICogdmFsdWUgZG9lcyBub3QgY2F1c2UgbG90cyBvZiBiaXRtYXBzIHRvIGJlIGFsbG9jYXRlZCwgYnV0CiAgKiB0aGUgc2NoZW1lIHNjYWxlcyB0byB1cCB0byA0IG1pbGxpb24gUElEcywgcnVudGltZS4KICAqLwotc3RydWN0IHBzcGFjZSBpbml0X3BzcGFjZSA9IHsKK3N0cnVjdCBwaWRfbmFtZXNwYWNlIGluaXRfcGlkX25zID0geworCS5rcmVmID0geworCQkucmVmY291bnQgICAgICAgPSBBVE9NSUNfSU5JVCgyKSwKKwl9LAogCS5waWRtYXAgPSB7CiAJCVsgMCAuLi4gUElETUFQX0VOVFJJRVMtMV0gPSB7IEFUT01JQ19JTklUKEJJVFNfUEVSX1BBR0UpLCBOVUxMIH0KIAl9LAotCS5sYXN0X3BpZCA9IDAKKwkubGFzdF9waWQgPSAwLAorCS5jaGlsZF9yZWFwZXIgPSAmaW5pdF90YXNrCiB9OwogCiAvKgpAQCAtODAsMjUgKzg1LDI1IEBACiAKIHN0YXRpYyAgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKHBpZG1hcF9sb2NrKTsKIAotc3RhdGljIGZhc3RjYWxsIHZvaWQgZnJlZV9waWRtYXAoc3RydWN0IHBzcGFjZSAqcHNwYWNlLCBpbnQgcGlkKQorc3RhdGljIGZhc3RjYWxsIHZvaWQgZnJlZV9waWRtYXAoc3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9ucywgaW50IHBpZCkKIHsKLQlzdHJ1Y3QgcGlkbWFwICptYXAgPSBwc3BhY2UtPnBpZG1hcCArIHBpZCAvIEJJVFNfUEVSX1BBR0U7CisJc3RydWN0IHBpZG1hcCAqbWFwID0gcGlkX25zLT5waWRtYXAgKyBwaWQgLyBCSVRTX1BFUl9QQUdFOwogCWludCBvZmZzZXQgPSBwaWQgJiBCSVRTX1BFUl9QQUdFX01BU0s7CiAKIAljbGVhcl9iaXQob2Zmc2V0LCBtYXAtPnBhZ2UpOwogCWF0b21pY19pbmMoJm1hcC0+bnJfZnJlZSk7CiB9CiAKLXN0YXRpYyBpbnQgYWxsb2NfcGlkbWFwKHN0cnVjdCBwc3BhY2UgKnBzcGFjZSkKK3N0YXRpYyBpbnQgYWxsb2NfcGlkbWFwKHN0cnVjdCBwaWRfbmFtZXNwYWNlICpwaWRfbnMpCiB7Ci0JaW50IGksIG9mZnNldCwgbWF4X3NjYW4sIHBpZCwgbGFzdCA9IHBzcGFjZS0+bGFzdF9waWQ7CisJaW50IGksIG9mZnNldCwgbWF4X3NjYW4sIHBpZCwgbGFzdCA9IHBpZF9ucy0+bGFzdF9waWQ7CiAJc3RydWN0IHBpZG1hcCAqbWFwOwogCiAJcGlkID0gbGFzdCArIDE7CiAJaWYgKHBpZCA+PSBwaWRfbWF4KQogCQlwaWQgPSBSRVNFUlZFRF9QSURTOwogCW9mZnNldCA9IHBpZCAmIEJJVFNfUEVSX1BBR0VfTUFTSzsKLQltYXAgPSAmcHNwYWNlLT5waWRtYXBbcGlkL0JJVFNfUEVSX1BBR0VdOworCW1hcCA9ICZwaWRfbnMtPnBpZG1hcFtwaWQvQklUU19QRVJfUEFHRV07CiAJbWF4X3NjYW4gPSAocGlkX21heCArIEJJVFNfUEVSX1BBR0UgLSAxKS9CSVRTX1BFUl9QQUdFIC0gIW9mZnNldDsKIAlmb3IgKGkgPSAwOyBpIDw9IG1heF9zY2FuOyArK2kpIHsKIAkJaWYgKHVubGlrZWx5KCFtYXAtPnBhZ2UpKSB7CkBAIC0xMjAsMTEgKzEyNSwxMSBAQAogCQkJZG8gewogCQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChvZmZzZXQsIG1hcC0+cGFnZSkpIHsKIAkJCQkJYXRvbWljX2RlYygmbWFwLT5ucl9mcmVlKTsKLQkJCQkJcHNwYWNlLT5sYXN0X3BpZCA9IHBpZDsKKwkJCQkJcGlkX25zLT5sYXN0X3BpZCA9IHBpZDsKIAkJCQkJcmV0dXJuIHBpZDsKIAkJCQl9CiAJCQkJb2Zmc2V0ID0gZmluZF9uZXh0X29mZnNldChtYXAsIG9mZnNldCk7Ci0JCQkJcGlkID0gbWtfcGlkKHBzcGFjZSwgbWFwLCBvZmZzZXQpOworCQkJCXBpZCA9IG1rX3BpZChwaWRfbnMsIG1hcCwgb2Zmc2V0KTsKIAkJCS8qCiAJCQkgKiBmaW5kX25leHRfb2Zmc2V0KCkgZm91bmQgYSBiaXQsIHRoZSBwaWQgZnJvbSBpdAogCQkJICogaXMgaW4tYm91bmRzLCBhbmQgaWYgd2UgZmVsbCBiYWNrIHRvIHRoZSBsYXN0CkBAIC0xMzUsMzQgKzE0MCwzNCBAQAogCQkJCQkoaSAhPSBtYXhfc2NhbiB8fCBwaWQgPCBsYXN0IHx8CiAJCQkJCSAgICAhKChsYXN0KzEpICYgQklUU19QRVJfUEFHRV9NQVNLKSkpOwogCQl9Ci0JCWlmIChtYXAgPCAmcHNwYWNlLT5waWRtYXBbKHBpZF9tYXgtMSkvQklUU19QRVJfUEFHRV0pIHsKKwkJaWYgKG1hcCA8ICZwaWRfbnMtPnBpZG1hcFsocGlkX21heC0xKS9CSVRTX1BFUl9QQUdFXSkgewogCQkJKyttYXA7CiAJCQlvZmZzZXQgPSAwOwogCQl9IGVsc2UgewotCQkJbWFwID0gJnBzcGFjZS0+cGlkbWFwWzBdOworCQkJbWFwID0gJnBpZF9ucy0+cGlkbWFwWzBdOwogCQkJb2Zmc2V0ID0gUkVTRVJWRURfUElEUzsKIAkJCWlmICh1bmxpa2VseShsYXN0ID09IG9mZnNldCkpCiAJCQkJYnJlYWs7CiAJCX0KLQkJcGlkID0gbWtfcGlkKHBzcGFjZSwgbWFwLCBvZmZzZXQpOworCQlwaWQgPSBta19waWQocGlkX25zLCBtYXAsIG9mZnNldCk7CiAJfQogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBuZXh0X3BpZG1hcChzdHJ1Y3QgcHNwYWNlICpwc3BhY2UsIGludCBsYXN0KQorc3RhdGljIGludCBuZXh0X3BpZG1hcChzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGlkX25zLCBpbnQgbGFzdCkKIHsKIAlpbnQgb2Zmc2V0OwogCXN0cnVjdCBwaWRtYXAgKm1hcCwgKmVuZDsKIAogCW9mZnNldCA9IChsYXN0ICsgMSkgJiBCSVRTX1BFUl9QQUdFX01BU0s7Ci0JbWFwID0gJnBzcGFjZS0+cGlkbWFwWyhsYXN0ICsgMSkvQklUU19QRVJfUEFHRV07Ci0JZW5kID0gJnBzcGFjZS0+cGlkbWFwW1BJRE1BUF9FTlRSSUVTXTsKKwltYXAgPSAmcGlkX25zLT5waWRtYXBbKGxhc3QgKyAxKS9CSVRTX1BFUl9QQUdFXTsKKwllbmQgPSAmcGlkX25zLT5waWRtYXBbUElETUFQX0VOVFJJRVNdOwogCWZvciAoOyBtYXAgPCBlbmQ7IG1hcCsrLCBvZmZzZXQgPSAwKSB7CiAJCWlmICh1bmxpa2VseSghbWFwLT5wYWdlKSkKIAkJCWNvbnRpbnVlOwogCQlvZmZzZXQgPSBmaW5kX25leHRfYml0KChtYXApLT5wYWdlLCBCSVRTX1BFUl9QQUdFLCBvZmZzZXQpOwogCQlpZiAob2Zmc2V0IDwgQklUU19QRVJfUEFHRSkKLQkJCXJldHVybiBta19waWQocHNwYWNlLCBtYXAsIG9mZnNldCk7CisJCQlyZXR1cm4gbWtfcGlkKHBpZF9ucywgbWFwLCBvZmZzZXQpOwogCX0KIAlyZXR1cm4gLTE7CiB9CkBAIC0xOTIsNyArMTk3LDcgQEAKIAlobGlzdF9kZWxfcmN1KCZwaWQtPnBpZF9jaGFpbik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlkbWFwX2xvY2ssIGZsYWdzKTsKIAotCWZyZWVfcGlkbWFwKCZpbml0X3BzcGFjZSwgcGlkLT5ucik7CisJZnJlZV9waWRtYXAoY3VycmVudC0+bnNwcm94eS0+cGlkX25zLCBwaWQtPm5yKTsKIAljYWxsX3JjdSgmcGlkLT5yY3UsIGRlbGF5ZWRfcHV0X3BpZCk7CiB9CiAKQEAgLTIwNiw3ICsyMTEsNyBAQAogCWlmICghcGlkKQogCQlnb3RvIG91dDsKIAotCW5yID0gYWxsb2NfcGlkbWFwKCZpbml0X3BzcGFjZSk7CisJbnIgPSBhbGxvY19waWRtYXAoY3VycmVudC0+bnNwcm94eS0+cGlkX25zKTsKIAlpZiAobnIgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCkBAIC0zNDgsMTMgKzM1MywzMyBAQAogCQlwaWQgPSBmaW5kX3BpZChucik7CiAJCWlmIChwaWQpCiAJCQlicmVhazsKLQkJbnIgPSBuZXh0X3BpZG1hcCgmaW5pdF9wc3BhY2UsIG5yKTsKKwkJbnIgPSBuZXh0X3BpZG1hcChjdXJyZW50LT5uc3Byb3h5LT5waWRfbnMsIG5yKTsKIAl9IHdoaWxlIChuciA+IDApOwogCiAJcmV0dXJuIHBpZDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZpbmRfZ2V0X3BpZCk7CiAKK2ludCBjb3B5X3BpZF9ucyhpbnQgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpvbGRfbnMgPSB0c2stPm5zcHJveHktPnBpZF9uczsKKwlpbnQgZXJyID0gMDsKKworCWlmICghb2xkX25zKQorCQlyZXR1cm4gMDsKKworCWdldF9waWRfbnMob2xkX25zKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGZyZWVfcGlkX25zKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKKworCW5zID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBwaWRfbmFtZXNwYWNlLCBrcmVmKTsKKwlrZnJlZShucyk7Cit9CisKIC8qCiAgKiBUaGUgcGlkIGhhc2ggdGFibGUgaXMgc2NhbGVkIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mIG1lbW9yeSBpbiB0aGUKICAqIG1hY2hpbmUuICBGcm9tIGEgbWluaW11bSBvZiAxNiBzbG90cyB1cCB0byA0MDk2IHNsb3RzIGF0IG9uZSBnaWdhYnl0ZSBvcgpAQCAtMzgyLDEwICs0MDcsMTAgQEAKIAogdm9pZCBfX2luaXQgcGlkbWFwX2luaXQodm9pZCkKIHsKLQlpbml0X3BzcGFjZS5waWRtYXBbMF0ucGFnZSA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpbml0X3BpZF9ucy5waWRtYXBbMF0ucGFnZSA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAkvKiBSZXNlcnZlIFBJRCAwLiBXZSBuZXZlciBjYWxsIGZyZWVfcGlkbWFwKDApICovCi0Jc2V0X2JpdCgwLCBpbml0X3BzcGFjZS5waWRtYXBbMF0ucGFnZSk7Ci0JYXRvbWljX2RlYygmaW5pdF9wc3BhY2UucGlkbWFwWzBdLm5yX2ZyZWUpOworCXNldF9iaXQoMCwgaW5pdF9waWRfbnMucGlkbWFwWzBdLnBhZ2UpOworCWF0b21pY19kZWMoJmluaXRfcGlkX25zLnBpZG1hcFswXS5ucl9mcmVlKTsKIAogCXBpZF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicGlkIiwgc2l6ZW9mKHN0cnVjdCBwaWQpLAogCQkJCQlfX2FsaWdub2ZfXyhzdHJ1Y3QgcGlkKSwKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCmluZGV4IDQ3OWIxNmIuLjdjM2UxZTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKKysrIGIva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYwpAQCAtODgsNiArODgsMTkgQEAKIH0KIAogLyoKKyAqIERpdmlkZSBhbmQgbGltaXQgdGhlIHJlc3VsdCB0byByZXMgPj0gMQorICoKKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgc2lnbmFsIGRlbGl2ZXJ5IHN0YXJ2YXRpb24sIHdoZW4gdGhlIHJlc3VsdCBvZgorICogdGhlIGRpdmlzaW9uIHdvdWxkIGJlIHJvdW5kZWQgZG93biB0byAwLgorICovCitzdGF0aWMgaW5saW5lIGNwdXRpbWVfdCBjcHV0aW1lX2Rpdl9ub25femVybyhjcHV0aW1lX3QgdGltZSwgdW5zaWduZWQgbG9uZyBkaXYpCit7CisJY3B1dGltZV90IHJlcyA9IGNwdXRpbWVfZGl2KHRpbWUsIGRpdik7CisKKwlyZXR1cm4gbWF4X3QoY3B1dGltZV90LCByZXMsIDEpOworfQorCisvKgogICogVXBkYXRlIGV4cGlyeSB0aW1lIGZyb20gaW5jcmVtZW50LCBhbmQgaW5jcmVhc2Ugb3ZlcnJ1biBjb3VudCwKICAqIGdpdmVuIHRoZSBjdXJyZW50IGNsb2NrIHNhbXBsZS4KICAqLwpAQCAtNDgzLDggKzQ5Niw4IEBACiAJCUJVRygpOwogCQlicmVhazsKIAljYXNlIENQVUNMT0NLX1BST0Y6Ci0JCWxlZnQgPSBjcHV0aW1lX2RpdihjcHV0aW1lX3N1YihleHBpcmVzLmNwdSwgdmFsLmNwdSksCi0JCQkJICAgbnRocmVhZHMpOworCQlsZWZ0ID0gY3B1dGltZV9kaXZfbm9uX3plcm8oY3B1dGltZV9zdWIoZXhwaXJlcy5jcHUsIHZhbC5jcHUpLAorCQkJCSAgICAgICBudGhyZWFkcyk7CiAJCWRvIHsKIAkJCWlmIChsaWtlbHkoISh0LT5mbGFncyAmIFBGX0VYSVRJTkcpKSkgewogCQkJCXRpY2tzID0gY3B1dGltZV9hZGQocHJvZl90aWNrcyh0KSwgbGVmdCk7CkBAIC00OTgsOCArNTExLDggQEAKIAkJfSB3aGlsZSAodCAhPSBwKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVDTE9DS19WSVJUOgotCQlsZWZ0ID0gY3B1dGltZV9kaXYoY3B1dGltZV9zdWIoZXhwaXJlcy5jcHUsIHZhbC5jcHUpLAotCQkJCSAgIG50aHJlYWRzKTsKKwkJbGVmdCA9IGNwdXRpbWVfZGl2X25vbl96ZXJvKGNwdXRpbWVfc3ViKGV4cGlyZXMuY3B1LCB2YWwuY3B1KSwKKwkJCQkgICAgICAgbnRocmVhZHMpOwogCQlkbyB7CiAJCQlpZiAobGlrZWx5KCEodC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSkpIHsKIAkJCQl0aWNrcyA9IGNwdXRpbWVfYWRkKHZpcnRfdGlja3ModCksIGxlZnQpOwpAQCAtNTE1LDYgKzUyOCw3IEBACiAJY2FzZSBDUFVDTE9DS19TQ0hFRDoKIAkJbnNsZWZ0ID0gZXhwaXJlcy5zY2hlZCAtIHZhbC5zY2hlZDsKIAkJZG9fZGl2KG5zbGVmdCwgbnRocmVhZHMpOworCQluc2xlZnQgPSBtYXhfdCh1bnNpZ25lZCBsb25nIGxvbmcsIG5zbGVmdCwgMSk7CiAJCWRvIHsKIAkJCWlmIChsaWtlbHkoISh0LT5mbGFncyAmIFBGX0VYSVRJTkcpKSkgewogCQkJCW5zID0gdC0+c2NoZWRfdGltZSArIG5zbGVmdDsKQEAgLTExNTksMTIgKzExNzMsMTMgQEAKIAogCQlwcm9mX2xlZnQgPSBjcHV0aW1lX3N1Yihwcm9mX2V4cGlyZXMsIHV0aW1lKTsKIAkJcHJvZl9sZWZ0ID0gY3B1dGltZV9zdWIocHJvZl9sZWZ0LCBzdGltZSk7Ci0JCXByb2ZfbGVmdCA9IGNwdXRpbWVfZGl2KHByb2ZfbGVmdCwgbnRocmVhZHMpOworCQlwcm9mX2xlZnQgPSBjcHV0aW1lX2Rpdl9ub25femVybyhwcm9mX2xlZnQsIG50aHJlYWRzKTsKIAkJdmlydF9sZWZ0ID0gY3B1dGltZV9zdWIodmlydF9leHBpcmVzLCB1dGltZSk7Ci0JCXZpcnRfbGVmdCA9IGNwdXRpbWVfZGl2KHZpcnRfbGVmdCwgbnRocmVhZHMpOworCQl2aXJ0X2xlZnQgPSBjcHV0aW1lX2Rpdl9ub25femVybyh2aXJ0X2xlZnQsIG50aHJlYWRzKTsKIAkJaWYgKHNjaGVkX2V4cGlyZXMpIHsKIAkJCXNjaGVkX2xlZnQgPSBzY2hlZF9leHBpcmVzIC0gc2NoZWRfdGltZTsKIAkJCWRvX2RpdihzY2hlZF9sZWZ0LCBudGhyZWFkcyk7CisJCQlzY2hlZF9sZWZ0ID0gbWF4X3QodW5zaWduZWQgbG9uZyBsb25nLCBzY2hlZF9sZWZ0LCAxKTsKIAkJfSBlbHNlIHsKIAkJCXNjaGVkX2xlZnQgPSAwOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKaW5kZXggOWNiYjVkMS4uNWZlODdkZSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwpAQCAtNzAsNyArNzAsNyBAQAogLyoKICAqIExldHMga2VlcCBvdXIgdGltZXJzIGluIGEgc2xhYiBjYWNoZSA6LSkKICAqLwotc3RhdGljIGttZW1fY2FjaGVfdCAqcG9zaXhfdGltZXJzX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwb3NpeF90aW1lcnNfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGlkciBwb3NpeF90aW1lcnNfaWQ7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlkcl9sb2NrKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwppbmRleCA4MjUwNjhjLi5lZDI5NjIyIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZworKysgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwpAQCAtMjAsMTMgKzIwLDE0IEBACiAJICBzZW5kaW5nIHRoZSBwcm9jZXNzb3IgdG8gc2xlZXAgYW5kIHNhdmluZyBwb3dlci4KIAogY29uZmlnIFBNX0xFR0FDWQotCWJvb2wgIkxlZ2FjeSBQb3dlciBNYW5hZ2VtZW50IEFQSSIKKwlib29sICJMZWdhY3kgUG93ZXIgTWFuYWdlbWVudCBBUEkgKERFUFJFQ0FURUQpIgogCWRlcGVuZHMgb24gUE0KLQlkZWZhdWx0IHkKKwlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCi0JICAgU3VwcG9ydCBmb3IgcG1fcmVnaXN0ZXIoKSBhbmQgZnJpZW5kcy4KKwkgICBTdXBwb3J0IGZvciBwbV9yZWdpc3RlcigpIGFuZCBmcmllbmRzLiAgVGhpcyBvbGQgQVBJIGlzIG9ic29sZXRlZAorCSAgIGJ5IHRoZSBkcml2ZXIgbW9kZWwuCiAKLQkgICBJZiB1bnN1cmUsIHNheSBZLgorCSAgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBQTV9ERUJVRwogCWJvb2wgIlBvd2VyIE1hbmFnZW1lbnQgRGVidWcgU3VwcG9ydCIKQEAgLTc4LDcgKzc5LDcgQEAKIAogY29uZmlnIFNPRlRXQVJFX1NVU1BFTkQKIAlib29sICJTb2Z0d2FyZSBTdXNwZW5kIgotCWRlcGVuZHMgb24gUE0gJiYgU1dBUCAmJiAoKFg4NiAmJiAoIVNNUCB8fCBTVVNQRU5EX1NNUCkgJiYgIVg4Nl9QQUUpIHx8ICgoRlJWIHx8IFBQQzMyKSAmJiAhU01QKSkKKwlkZXBlbmRzIG9uIFBNICYmIFNXQVAgJiYgKChYODYgJiYgKCFTTVAgfHwgU1VTUEVORF9TTVApKSB8fCAoKEZSViB8fCBQUEMzMikgJiYgIVNNUCkpCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHRoZSBwb3NzaWJpbGl0eSBvZiBzdXNwZW5kaW5nIHRoZSBtYWNoaW5lLgogCSAgSXQgZG9lc24ndCBuZWVkIEFDUEkgb3IgQVBNLgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2Rpc2suYyBiL2tlcm5lbC9wb3dlci9kaXNrLmMKaW5kZXggZDNhMTU4YS4uODhmYzVkNyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2Rpc2suYworKysgYi9rZXJuZWwvcG93ZXIvZGlzay5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSAicG93ZXIuaCIKIApAQCAtMjcsNiArMjgsMjMgQEAKIHN0YXRpYyBpbnQgbm9yZXN1bWUgPSAwOwogY2hhciByZXN1bWVfZmlsZVsyNTZdID0gQ09ORklHX1BNX1NURF9QQVJUSVRJT047CiBkZXZfdCBzd3N1c3BfcmVzdW1lX2RldmljZTsKK3NlY3Rvcl90IHN3c3VzcF9yZXN1bWVfYmxvY2s7CisKKy8qKgorICoJcGxhdGZvcm1fcHJlcGFyZSAtIHByZXBhcmUgdGhlIG1hY2hpbmUgZm9yIGhpYmVybmF0aW9uIHVzaW5nIHRoZQorICoJcGxhdGZvcm0gZHJpdmVyIGlmIHNvIGNvbmZpZ3VyZWQgYW5kIHJldHVybiBhbiBlcnJvciBjb2RlIGlmIGl0IGZhaWxzCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgcGxhdGZvcm1fcHJlcGFyZSh2b2lkKQoreworCWludCBlcnJvciA9IDA7CisKKwlpZiAocG1fZGlza19tb2RlID09IFBNX0RJU0tfUExBVEZPUk0pIHsKKwkJaWYgKHBtX29wcyAmJiBwbV9vcHMtPnByZXBhcmUpCisJCQllcnJvciA9IHBtX29wcy0+cHJlcGFyZShQTV9TVVNQRU5EX0RJU0spOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CiAKIC8qKgogICoJcG93ZXJfZG93biAtIFNodXQgbWFjaGluZSBkb3duIGZvciBoaWJlcm5hdGUuCkBAIC00MCwxMyArNTgsMTMgQEAKIAogc3RhdGljIHZvaWQgcG93ZXJfZG93bihzdXNwZW5kX2Rpc2tfbWV0aG9kX3QgbW9kZSkKIHsKLQlpbnQgZXJyb3IgPSAwOwotCiAJc3dpdGNoKG1vZGUpIHsKIAljYXNlIFBNX0RJU0tfUExBVEZPUk06Ci0JCWtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKFNZU1RFTV9TVVNQRU5EX0RJU0spOwotCQllcnJvciA9IHBtX29wcy0+ZW50ZXIoUE1fU1VTUEVORF9ESVNLKTsKLQkJYnJlYWs7CisJCWlmIChwbV9vcHMgJiYgcG1fb3BzLT5lbnRlcikgeworCQkJa2VybmVsX3NodXRkb3duX3ByZXBhcmUoU1lTVEVNX1NVU1BFTkRfRElTSyk7CisJCQlwbV9vcHMtPmVudGVyKFBNX1NVU1BFTkRfRElTSyk7CisJCQlicmVhazsKKwkJfQogCWNhc2UgUE1fRElTS19TSFVURE9XTjoKIAkJa2VybmVsX3Bvd2VyX29mZigpOwogCQlicmVhazsKQEAgLTcxLDcgKzg5LDcgQEAKIAogc3RhdGljIGludCBwcmVwYXJlX3Byb2Nlc3Nlcyh2b2lkKQogewotCWludCBlcnJvcjsKKwlpbnQgZXJyb3IgPSAwOwogCiAJcG1fcHJlcGFyZV9jb25zb2xlKCk7CiAKQEAgLTg0LDEyICsxMDIsMjQgQEAKIAkJZ290byB0aGF3OwogCX0KIAorCWlmIChwbV9kaXNrX21vZGUgPT0gUE1fRElTS19URVNUUFJPQykgeworCQlwcmludGsoInN3c3VzcCBkZWJ1ZzogV2FpdGluZyBmb3IgNSBzZWNvbmRzLlxuIik7CisJCW1kZWxheSg1MDAwKTsKKwkJZ290byB0aGF3OworCX0KKworCWVycm9yID0gcGxhdGZvcm1fcHJlcGFyZSgpOworCWlmIChlcnJvcikKKwkJZ290byB0aGF3OworCiAJLyogRnJlZSBtZW1vcnkgYmVmb3JlIHNodXR0aW5nIGRvd24gZGV2aWNlcy4gKi8KIAlpZiAoIShlcnJvciA9IHN3c3VzcF9zaHJpbmtfbWVtb3J5KCkpKQogCQlyZXR1cm4gMDsKLXRoYXc6CisKKwlwbGF0Zm9ybV9maW5pc2goKTsKKyB0aGF3OgogCXRoYXdfcHJvY2Vzc2VzKCk7Ci1lbmFibGVfY3B1czoKKyBlbmFibGVfY3B1czoKIAllbmFibGVfbm9uYm9vdF9jcHVzKCk7CiAJcG1fcmVzdG9yZV9jb25zb2xlKCk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTIwLDEzICsxNTAsMjEgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAorCWlmIChwbV9kaXNrX21vZGUgPT0gUE1fRElTS19URVNUUFJPQykKKwkJcmV0dXJuIDA7CisKIAlzdXNwZW5kX2NvbnNvbGUoKTsKIAllcnJvciA9IGRldmljZV9zdXNwZW5kKFBNU0dfRlJFRVpFKTsKIAlpZiAoZXJyb3IpIHsKIAkJcmVzdW1lX2NvbnNvbGUoKTsKIAkJcHJpbnRrKCJTb21lIGRldmljZXMgZmFpbGVkIHRvIHN1c3BlbmRcbiIpOwotCQl1bnByZXBhcmVfcHJvY2Vzc2VzKCk7Ci0JCXJldHVybiBlcnJvcjsKKwkJZ290byBUaGF3OworCX0KKworCWlmIChwbV9kaXNrX21vZGUgPT0gUE1fRElTS19URVNUKSB7CisJCXByaW50aygic3dzdXNwIGRlYnVnOiBXYWl0aW5nIGZvciA1IHNlY29uZHMuXG4iKTsKKwkJbWRlbGF5KDUwMDApOworCQlnb3RvIERvbmU7CiAJfQogCiAJcHJfZGVidWcoIlBNOiBzbmFwc2hvdHRpbmcgbWVtb3J5LlxuIik7CkBAIC0xNDMsMTYgKzE4MSwxNyBAQAogCQkJcG93ZXJfZG93bihwbV9kaXNrX21vZGUpOwogCQllbHNlIHsKIAkJCXN3c3VzcF9mcmVlKCk7Ci0JCQl1bnByZXBhcmVfcHJvY2Vzc2VzKCk7Ci0JCQlyZXR1cm4gZXJyb3I7CisJCQlnb3RvIFRoYXc7CiAJCX0KLQl9IGVsc2UKKwl9IGVsc2UgewogCQlwcl9kZWJ1ZygiUE06IEltYWdlIHJlc3RvcmVkIHN1Y2Nlc3NmdWxseS5cbiIpOworCX0KIAogCXN3c3VzcF9mcmVlKCk7CiAgRG9uZToKIAlkZXZpY2VfcmVzdW1lKCk7CiAJcmVzdW1lX2NvbnNvbGUoKTsKKyBUaGF3OgogCXVucHJlcGFyZV9wcm9jZXNzZXMoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xNzQsMTAgKzIxMywxMCBAQAogewogCWludCBlcnJvcjsKIAotCWRvd24oJnBtX3NlbSk7CisJbXV0ZXhfbG9jaygmcG1fbXV0ZXgpOwogCWlmICghc3dzdXNwX3Jlc3VtZV9kZXZpY2UpIHsKIAkJaWYgKCFzdHJsZW4ocmVzdW1lX2ZpbGUpKSB7Ci0JCQl1cCgmcG1fc2VtKTsKKwkJCW11dGV4X3VubG9jaygmcG1fbXV0ZXgpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIAkJc3dzdXNwX3Jlc3VtZV9kZXZpY2UgPSBuYW1lX3RvX2Rldl90KHJlc3VtZV9maWxlKTsKQEAgLTE5Miw3ICsyMzEsNyBAQAogCQkgKiBGSVhNRTogSWYgbm9yZXN1bWUgaXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHBhcnRpdGlvbgogCQkgKiBhbmQgcmVzZXQgaXQgYmFjayB0byBub3JtYWwgc3dhcCBzcGFjZS4KIAkJICovCi0JCXVwKCZwbV9zZW0pOworCQltdXRleF91bmxvY2soJnBtX211dGV4KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMzYsNyArMjc1LDcgQEAKIAl1bnByZXBhcmVfcHJvY2Vzc2VzKCk7CiAgRG9uZToKIAkvKiBGb3Igc3VjY2VzcyBjYXNlLCB0aGUgc3VzcGVuZCBwYXRoIHdpbGwgcmVsZWFzZSB0aGUgbG9jayAqLwotCXVwKCZwbV9zZW0pOworCW11dGV4X3VubG9jaygmcG1fbXV0ZXgpOwogCXByX2RlYnVnKCJQTTogUmVzdW1lIGZyb20gZGlzayBmYWlsZWQuXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0OSw2ICsyODgsOCBAQAogCVtQTV9ESVNLX1BMQVRGT1JNXQk9ICJwbGF0Zm9ybSIsCiAJW1BNX0RJU0tfU0hVVERPV05dCT0gInNodXRkb3duIiwKIAlbUE1fRElTS19SRUJPT1RdCT0gInJlYm9vdCIsCisJW1BNX0RJU0tfVEVTVF0JCT0gInRlc3QiLAorCVtQTV9ESVNLX1RFU1RQUk9DXQk9ICJ0ZXN0cHJvYyIsCiB9OwogCiAvKioKQEAgLTI5NSw3ICszMzYsNyBAQAogCXAgPSBtZW1jaHIoYnVmLCAnXG4nLCBuKTsKIAlsZW4gPSBwID8gcCAtIGJ1ZiA6IG47CiAKLQlkb3duKCZwbV9zZW0pOworCW11dGV4X2xvY2soJnBtX211dGV4KTsKIAlmb3IgKGkgPSBQTV9ESVNLX0ZJUk1XQVJFOyBpIDwgUE1fRElTS19NQVg7IGkrKykgewogCQlpZiAoIXN0cm5jbXAoYnVmLCBwbV9kaXNrX21vZGVzW2ldLCBsZW4pKSB7CiAJCQltb2RlID0gaTsKQEAgLTMwMywyMSArMzQ0LDIzIEBACiAJCX0KIAl9CiAJaWYgKG1vZGUpIHsKLQkJaWYgKG1vZGUgPT0gUE1fRElTS19TSFVURE9XTiB8fCBtb2RlID09IFBNX0RJU0tfUkVCT09UKQorCQlpZiAobW9kZSA9PSBQTV9ESVNLX1NIVVRET1dOIHx8IG1vZGUgPT0gUE1fRElTS19SRUJPT1QgfHwKKwkJICAgICBtb2RlID09IFBNX0RJU0tfVEVTVCB8fCBtb2RlID09IFBNX0RJU0tfVEVTVFBST0MpIHsKIAkJCXBtX2Rpc2tfbW9kZSA9IG1vZGU7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJaWYgKHBtX29wcyAmJiBwbV9vcHMtPmVudGVyICYmCiAJCQkgICAgKG1vZGUgPT0gcG1fb3BzLT5wbV9kaXNrX21vZGUpKQogCQkJCXBtX2Rpc2tfbW9kZSA9IG1vZGU7CiAJCQllbHNlCiAJCQkJZXJyb3IgPSAtRUlOVkFMOwogCQl9Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJZXJyb3IgPSAtRUlOVkFMOworCX0KIAogCXByX2RlYnVnKCJQTTogc3VzcGVuZC10by1kaXNrIG1vZGUgc2V0IHRvICclcydcbiIsCiAJCSBwbV9kaXNrX21vZGVzW21vZGVdKTsKLQl1cCgmcG1fc2VtKTsKKwltdXRleF91bmxvY2soJnBtX211dGV4KTsKIAlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IG47CiB9CiAKQEAgLTM0MiwxNCArMzg1LDE0IEBACiAJaWYgKG1haiAhPSBNQUpPUihyZXMpIHx8IG1pbiAhPSBNSU5PUihyZXMpKQogCQlnb3RvIG91dDsKIAotCWRvd24oJnBtX3NlbSk7CisJbXV0ZXhfbG9jaygmcG1fbXV0ZXgpOwogCXN3c3VzcF9yZXN1bWVfZGV2aWNlID0gcmVzOwotCXVwKCZwbV9zZW0pOworCW11dGV4X3VubG9jaygmcG1fbXV0ZXgpOwogCXByaW50aygiQXR0ZW1wdGluZyBtYW51YWwgcmVzdW1lXG4iKTsKIAlub3Jlc3VtZSA9IDA7CiAJc29mdHdhcmVfcmVzdW1lKCk7CiAJcmV0ID0gbjsKLW91dDoKKyBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDA0LDYgKzQ0NywxOSBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW50IF9faW5pdCByZXN1bWVfb2Zmc2V0X3NldHVwKGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0OworCisJaWYgKG5vcmVzdW1lKQorCQlyZXR1cm4gMTsKKworCWlmIChzc2NhbmYoc3RyLCAiJWxsdSIsICZvZmZzZXQpID09IDEpCisJCXN3c3VzcF9yZXN1bWVfYmxvY2sgPSBvZmZzZXQ7CisKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBfX2luaXQgbm9yZXN1bWVfc2V0dXAoY2hhciAqc3RyKQogewogCW5vcmVzdW1lID0gMTsKQEAgLTQxMSw0ICs0NjcsNSBAQAogfQogCiBfX3NldHVwKCJub3Jlc3VtZSIsIG5vcmVzdW1lX3NldHVwKTsKK19fc2V0dXAoInJlc3VtZV9vZmZzZXQ9IiwgcmVzdW1lX29mZnNldF9zZXR1cCk7CiBfX3NldHVwKCJyZXN1bWU9IiwgcmVzdW1lX3NldHVwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDg3MzIyOGMuLmZmM2E2MTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtOCw2ICs4LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0xOCwxNiArMTksMTcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVzdW1lLXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSAicG93ZXIuaCIKIAogLypUaGlzIGlzIGp1c3QgYW4gYXJiaXRyYXJ5IG51bWJlciAqLwogI2RlZmluZSBGUkVFX1BBR0VfTlVNQkVSICgxMDApCiAKLURFQ0xBUkVfTVVURVgocG1fc2VtKTsKK0RFRklORV9NVVRFWChwbV9tdXRleCk7CiAKIHN0cnVjdCBwbV9vcHMgKnBtX29wczsKLXN1c3BlbmRfZGlza19tZXRob2RfdCBwbV9kaXNrX21vZGUgPSBQTV9ESVNLX1NIVVRET1dOOworc3VzcGVuZF9kaXNrX21ldGhvZF90IHBtX2Rpc2tfbW9kZSA9IFBNX0RJU0tfUExBVEZPUk07CiAKIC8qKgogICoJcG1fc2V0X29wcyAtIFNldCB0aGUgZ2xvYmFsIHBvd2VyIG1ldGhvZCB0YWJsZS4gCkBAIC0zNiw5ICszOCw5IEBACiAKIHZvaWQgcG1fc2V0X29wcyhzdHJ1Y3QgcG1fb3BzICogb3BzKQogewotCWRvd24oJnBtX3NlbSk7CisJbXV0ZXhfbG9jaygmcG1fbXV0ZXgpOwogCXBtX29wcyA9IG9wczsKLQl1cCgmcG1fc2VtKTsKKwltdXRleF91bmxvY2soJnBtX211dGV4KTsKIH0KIAogCkBAIC0xODIsNyArMTg0LDcgQEAKIAogCWlmICghdmFsaWRfc3RhdGUoc3RhdGUpKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoZG93bl90cnlsb2NrKCZwbV9zZW0pKQorCWlmICghbXV0ZXhfdHJ5bG9jaygmcG1fbXV0ZXgpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKHN0YXRlID09IFBNX1NVU1BFTkRfRElTSykgewpAQCAtMjAwLDcgKzIwMiw3IEBACiAJcHJfZGVidWcoIlBNOiBGaW5pc2hpbmcgd2FrZXVwLlxuIik7CiAJc3VzcGVuZF9maW5pc2goc3RhdGUpOwogIFVubG9jazoKLQl1cCgmcG1fc2VtKTsKKwltdXRleF91bmxvY2soJnBtX211dGV4KTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTIyOSw3ICsyMzEsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi0KK0VYUE9SVF9TWU1CT0wocG1fc3VzcGVuZCk7CiAKIGRlY2xfc3Vic3lzKHBvd2VyLE5VTEwsTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wb3dlci5oIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmgKaW5kZXggYmZlOTk5ZjcuLmViNDYxYjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wb3dlci5oCisrKyBiL2tlcm5lbC9wb3dlci9wb3dlci5oCkBAIC0yMiw3ICsyMiw5IEBACiAJcmV0dXJuIC1FUEVSTTsKIH0KICNlbmRpZgotZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgcG1fc2VtOworCitleHRlcm4gc3RydWN0IG11dGV4IHBtX211dGV4OworCiAjZGVmaW5lIHBvd2VyX2F0dHIoX25hbWUpIFwKIHN0YXRpYyBzdHJ1Y3Qgc3Vic3lzX2F0dHJpYnV0ZSBfbmFtZSMjX2F0dHIgPSB7CVwKIAkuYXR0cgk9IHsJCQkJXApAQCAtNDIsNiArNDQsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW1hZ2Vfc2l6ZTsKIGV4dGVybiBpbnQgaW5fc3VzcGVuZDsKIGV4dGVybiBkZXZfdCBzd3N1c3BfcmVzdW1lX2RldmljZTsKK2V4dGVybiBzZWN0b3JfdCBzd3N1c3BfcmVzdW1lX2Jsb2NrOwogCiBleHRlcm4gYXNtbGlua2FnZSBpbnQgc3dzdXNwX2FyY2hfc3VzcGVuZCh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIGludCBzd3N1c3BfYXJjaF9yZXN1bWUodm9pZCk7CkBAIC0xMDIsOCArMTA1LDE4IEBACiBleHRlcm4gdW5zaWduZWQgaW50IHNuYXBzaG90X2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpOwogZXh0ZXJuIGludCBzbmFwc2hvdF9yZWFkX25leHQoc3RydWN0IHNuYXBzaG90X2hhbmRsZSAqaGFuZGxlLCBzaXplX3QgY291bnQpOwogZXh0ZXJuIGludCBzbmFwc2hvdF93cml0ZV9uZXh0KHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSwgc2l6ZV90IGNvdW50KTsKK2V4dGVybiB2b2lkIHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7CiBleHRlcm4gaW50IHNuYXBzaG90X2ltYWdlX2xvYWRlZChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpOwotZXh0ZXJuIHZvaWQgc25hcHNob3RfZnJlZV91bnVzZWRfbWVtb3J5KHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgdGhlIHZhbHVlcyBuZWVkZWQgZm9yIHRoZSBpZGVudGlmaWNhdGlvbgorICogb2YgdGhlIHJlc3VtZSBzd2FwIGFyZWEgZnJvbSBhIHVzZXIgc3BhY2UgdG8gdGhlIGtlcm5lbCB2aWEgdGhlCisgKiBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBIGlvY3RsCisgKi8KK3N0cnVjdCByZXN1bWVfc3dhcF9hcmVhIHsKKwlsb2ZmX3Qgb2Zmc2V0OworCXVfaW50MzJfdCBkZXY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjZGVmaW5lIFNOQVBTSE9UX0lPQ19NQUdJQwknMycKICNkZWZpbmUgU05BUFNIT1RfRlJFRVpFCQkJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMSkKQEAgLTExNyw3ICsxMzAsMTQgQEAKICNkZWZpbmUgU05BUFNIT1RfRlJFRV9TV0FQX1BBR0VTCV9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDkpCiAjZGVmaW5lIFNOQVBTSE9UX1NFVF9TV0FQX0ZJTEUJCV9JT1coU05BUFNIT1RfSU9DX01BR0lDLCAxMCwgdW5zaWduZWQgaW50KQogI2RlZmluZSBTTkFQU0hPVF9TMlJBTQkJCV9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDExKQotI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlIJMTEKKyNkZWZpbmUgU05BUFNIT1RfUE1PUFMJCQlfSU9XKFNOQVBTSE9UX0lPQ19NQUdJQywgMTIsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgU05BUFNIT1RfU0VUX1NXQVBfQVJFQQkJX0lPVyhTTkFQU0hPVF9JT0NfTUFHSUMsIDEzLCBcCisJCQkJCQkJc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEpCisjZGVmaW5lIFNOQVBTSE9UX0lPQ19NQVhOUgkxMworCisjZGVmaW5lIFBNT1BTX1BSRVBBUkUJMQorI2RlZmluZSBQTU9QU19FTlRFUgkyCisjZGVmaW5lIFBNT1BTX0ZJTklTSAkzCiAKIC8qKgogICoJVGhlIGJpdG1hcCBpcyB1c2VkIGZvciB0cmFjaW5nIGFsbG9jYXRlZCBzd2FwIHBhZ2VzCkBAIC0xNDEsNyArMTYxLDcgQEAKIAogZXh0ZXJuIHZvaWQgZnJlZV9iaXRtYXAoc3RydWN0IGJpdG1hcF9wYWdlICpiaXRtYXApOwogZXh0ZXJuIHN0cnVjdCBiaXRtYXBfcGFnZSAqYWxsb2NfYml0bWFwKHVuc2lnbmVkIGludCBucl9iaXRzKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGFsbG9jX3N3YXBfcGFnZShpbnQgc3dhcCwgc3RydWN0IGJpdG1hcF9wYWdlICpiaXRtYXApOworZXh0ZXJuIHNlY3Rvcl90IGFsbG9jX3N3YXBkZXZfYmxvY2soaW50IHN3YXAsIHN0cnVjdCBiaXRtYXBfcGFnZSAqYml0bWFwKTsKIGV4dGVybiB2b2lkIGZyZWVfYWxsX3N3YXBfcGFnZXMoaW50IHN3YXAsIHN0cnVjdCBiaXRtYXBfcGFnZSAqYml0bWFwKTsKIAogZXh0ZXJuIGludCBzd3N1c3BfY2hlY2sodm9pZCk7CkBAIC0xNTMsMyArMTczLDcgQEAKIGV4dGVybiBpbnQgc3dzdXNwX3dyaXRlKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3dzdXNwX2Nsb3NlKHZvaWQpOwogZXh0ZXJuIGludCBzdXNwZW5kX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSk7CisKK3N0cnVjdCB0aW1ldmFsOworZXh0ZXJuIHZvaWQgc3dzdXNwX3Nob3dfc3BlZWQoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV2YWwgKiwKKwkJCQl1bnNpZ25lZCBpbnQsIGNoYXIgKik7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcG93ZXJvZmYuYyBiL2tlcm5lbC9wb3dlci9wb3dlcm9mZi5jCmluZGV4IGYxZjkwMGEuLjY3OGVjNzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wb3dlcm9mZi5jCisrKyBiL2tlcm5lbC9wb3dlci9wb3dlcm9mZi5jCkBAIC0xNiwxMiArMTYsMTIgQEAKICAqIGNhbGxiYWNrIHdlIHVzZS4KICAqLwogCi1zdGF0aWMgdm9pZCBkb19wb3dlcm9mZih2b2lkICpkdW1teSkKK3N0YXRpYyB2b2lkIGRvX3Bvd2Vyb2ZmKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCiB7CiAJa2VybmVsX3Bvd2VyX29mZigpOwogfQogCi1zdGF0aWMgREVDTEFSRV9XT1JLKHBvd2Vyb2ZmX3dvcmssIGRvX3Bvd2Vyb2ZmLCBOVUxMKTsKK3N0YXRpYyBERUNMQVJFX1dPUksocG93ZXJvZmZfd29yaywgZG9fcG93ZXJvZmYpOwogCiBzdGF0aWMgdm9pZCBoYW5kbGVfcG93ZXJvZmYoaW50IGtleSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMgYi9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jCmluZGV4IDcyZTcyZDIuLjZkNTY2YmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKKysrIGIva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYwpAQCAtMTMsMjAgKzEzLDIyIEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAvKiAKICAqIFRpbWVvdXQgZm9yIHN0b3BwaW5nIHByb2Nlc3NlcwogICovCiAjZGVmaW5lIFRJTUVPVVQJKDIwICogSFopCiAKKyNkZWZpbmUgRlJFRVpFUl9LRVJORUxfVEhSRUFEUyAwCisjZGVmaW5lIEZSRUVaRVJfVVNFUl9TUEFDRSAxCiAKIHN0YXRpYyBpbmxpbmUgaW50IGZyZWV6ZWFibGUoc3RydWN0IHRhc2tfc3RydWN0ICogcCkKIHsKIAlpZiAoKHAgPT0gY3VycmVudCkgfHwgCiAJICAgIChwLT5mbGFncyAmIFBGX05PRlJFRVpFKSB8fAogCSAgICAocC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkgfHwKLQkgICAgKHAtPmV4aXRfc3RhdGUgPT0gRVhJVF9ERUFEKSB8fAotCSAgICAocC0+c3RhdGUgPT0gVEFTS19TVE9QUEVEKSkKKwkgICAgKHAtPmV4aXRfc3RhdGUgPT0gRVhJVF9ERUFEKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CkBAIC0zOSw3ICs0MSw2IEBACiAJbG9uZyBzYXZlOwogCXNhdmUgPSBjdXJyZW50LT5zdGF0ZTsKIAlwcl9kZWJ1ZygiJXMgZW50ZXJlZCByZWZyaWdlcmF0b3JcbiIsIGN1cnJlbnQtPmNvbW0pOwotCXByaW50aygiPSIpOwogCiAJZnJvemVuX3Byb2Nlc3MoY3VycmVudCk7CiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CkBAIC01OSwxMCArNjAsMTYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFmcmVlemluZyhwKSkgewotCQlmcmVlemUocCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JCXNpZ25hbF93YWtlX3VwKHAsIDApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCXJtYigpOworCQlpZiAoIWZyb3plbihwKSkgeworCQkJaWYgKHAtPnN0YXRlID09IFRBU0tfU1RPUFBFRCkKKwkJCQlmb3JjZV9zaWdfc3BlY2lmaWMoU0lHU1RPUCwgcCk7CisKKwkJCWZyZWV6ZShwKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCQlzaWduYWxfd2FrZV91cChwLCBwLT5zdGF0ZSA9PSBUQVNLX1NUT1BQRUQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQl9CiAJfQogfQogCkBAIC03OSw5NiArODYsMTM0IEBACiAJfQogfQogCi0vKiAwID0gc3VjY2VzcywgZWxzZSAjIG9mIHByb2Nlc3NlcyB0aGF0IHdlIGZhaWxlZCB0byBzdG9wICovCi1pbnQgZnJlZXplX3Byb2Nlc3Nlcyh2b2lkKQorc3RhdGljIGlubGluZSBpbnQgaXNfdXNlcl9zcGFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JaW50IHRvZG8sIG5yX3VzZXIsIHVzZXJfZnJvemVuOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCXJldHVybiBwLT5tbSAmJiAhKHAtPmZsYWdzICYgUEZfQk9SUk9XRURfTU0pOworfQogCi0JcHJpbnRrKCAiU3RvcHBpbmcgdGFza3M6ICIgKTsKLQlzdGFydF90aW1lID0gamlmZmllczsKLQl1c2VyX2Zyb3plbiA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHRyeV90b19mcmVlemVfdGFza3MoaW50IGZyZWV6ZV91c2VyX3NwYWNlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CisJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKKwl1bnNpZ25lZCBpbnQgdG9kbzsKKworCWVuZF90aW1lID0gamlmZmllcyArIFRJTUVPVVQ7CiAJZG8gewotCQlucl91c2VyID0gdG9kbyA9IDA7CisJCXRvZG8gPSAwOwogCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCQlkb19lYWNoX3RocmVhZChnLCBwKSB7CiAJCQlpZiAoIWZyZWV6ZWFibGUocCkpCiAJCQkJY29udGludWU7CisKIAkJCWlmIChmcm96ZW4ocCkpCiAJCQkJY29udGludWU7CisKIAkJCWlmIChwLT5zdGF0ZSA9PSBUQVNLX1RSQUNFRCAmJiBmcm96ZW4ocC0+cGFyZW50KSkgewogCQkJCWNhbmNlbF9mcmVlemluZyhwKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmIChwLT5tbSAmJiAhKHAtPmZsYWdzICYgUEZfQk9SUk9XRURfTU0pKSB7Ci0JCQkJLyogVGhlIHRhc2sgaXMgYSB1c2VyLXNwYWNlIG9uZS4KLQkJCQkgKiBGcmVlemUgaXQgdW5sZXNzIHRoZXJlJ3MgYSB2Zm9yayBjb21wbGV0aW9uCi0JCQkJICogcGVuZGluZworCQkJaWYgKGlzX3VzZXJfc3BhY2UocCkpIHsKKwkJCQlpZiAoIWZyZWV6ZV91c2VyX3NwYWNlKQorCQkJCQljb250aW51ZTsKKworCQkJCS8qIEZyZWV6ZSB0aGUgdGFzayB1bmxlc3MgdGhlcmUgaXMgYSB2Zm9yaworCQkJCSAqIGNvbXBsZXRpb24gcGVuZGluZwogCQkJCSAqLwogCQkJCWlmICghcC0+dmZvcmtfZG9uZSkKIAkJCQkJZnJlZXplX3Byb2Nlc3MocCk7Ci0JCQkJbnJfdXNlcisrOwogCQkJfSBlbHNlIHsKLQkJCQkvKiBGcmVlemUgb25seSBpZiB0aGUgdXNlciBzcGFjZSBpcyBmcm96ZW4gKi8KLQkJCQlpZiAodXNlcl9mcm96ZW4pCi0JCQkJCWZyZWV6ZV9wcm9jZXNzKHApOwotCQkJCXRvZG8rKzsKKwkJCQlpZiAoZnJlZXplX3VzZXJfc3BhY2UpCisJCQkJCWNvbnRpbnVlOworCisJCQkJZnJlZXplX3Byb2Nlc3MocCk7CiAJCQl9CisJCQl0b2RvKys7CiAJCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJdG9kbyArPSBucl91c2VyOwotCQlpZiAoIXVzZXJfZnJvemVuICYmICFucl91c2VyKSB7Ci0JCQlzeXNfc3luYygpOwotCQkJc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0JCX0KLQkJdXNlcl9mcm96ZW4gPSAhbnJfdXNlcjsKIAkJeWllbGQoKTsJCQkvKiBZaWVsZCBpcyBva2F5IGhlcmUgKi8KLQkJaWYgKHRvZG8gJiYgdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydF90aW1lICsgVElNRU9VVCkpCisJCWlmICh0b2RvICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgZW5kX3RpbWUpKQogCQkJYnJlYWs7Ci0JfSB3aGlsZSh0b2RvKTsKKwl9IHdoaWxlICh0b2RvKTsKIAotCS8qIFRoaXMgZG9lcyBub3QgdW5mcmVlemUgcHJvY2Vzc2VzIHRoYXQgYXJlIGFscmVhZHkgZnJvemVuCi0JICogKHdlIGhhdmUgc2xpZ2h0bHkgdWdseSBjYWxsaW5nIGNvbnZlbnRpb24gaW4gdGhhdCByZXNwZWN0LAotCSAqIGFuZCBjYWxsZXIgbXVzdCBjYWxsIHRoYXdfcHJvY2Vzc2VzKCkgaWYgc29tZXRoaW5nIGZhaWxzKSwKLQkgKiBidXQgaXQgY2xlYW5zIHVwIGxlZnRvdmVyIFBGX0ZSRUVaRSByZXF1ZXN0cy4KLQkgKi8KIAlpZiAodG9kbykgewotCQlwcmludGsoICJcbiIgKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIgc3RvcHBpbmcgdGFza3MgdGltZWQgb3V0ICIKLQkJCSJhZnRlciAlZCBzZWNvbmRzICglZCB0YXNrcyByZW1haW5pbmcpOlxuIiwKLQkJCVRJTUVPVVQgLyBIWiwgdG9kbyk7CisJCS8qIFRoaXMgZG9lcyBub3QgdW5mcmVlemUgcHJvY2Vzc2VzIHRoYXQgYXJlIGFscmVhZHkgZnJvemVuCisJCSAqICh3ZSBoYXZlIHNsaWdodGx5IHVnbHkgY2FsbGluZyBjb252ZW50aW9uIGluIHRoYXQgcmVzcGVjdCwKKwkJICogYW5kIGNhbGxlciBtdXN0IGNhbGwgdGhhd19wcm9jZXNzZXMoKSBpZiBzb21ldGhpbmcgZmFpbHMpLAorCQkgKiBidXQgaXQgY2xlYW5zIHVwIGxlZnRvdmVyIFBGX0ZSRUVaRSByZXF1ZXN0cy4KKwkJICovCisJCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdG9wcGluZyAlcyB0aW1lZCBvdXQgYWZ0ZXIgJWQgc2Vjb25kcyAiCisJCQkJIiglZCB0YXNrcyByZWZ1c2luZyB0byBmcmVlemUpOlxuIiwKKwkJCQlmcmVlemVfdXNlcl9zcGFjZSA/ICJ1c2VyIHNwYWNlIHByb2Nlc3NlcyIgOgorCQkJCQkia2VybmVsIHRocmVhZHMiLAorCQkJCVRJTUVPVVQgLyBIWiwgdG9kbyk7CiAJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKKwkJCWlmIChpc191c2VyX3NwYWNlKHApID09ICFmcmVlemVfdXNlcl9zcGFjZSkKKwkJCQljb250aW51ZTsKKwogCQkJaWYgKGZyZWV6ZWFibGUocCkgJiYgIWZyb3plbihwKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIiAgJXNcbiIsIHAtPmNvbW0pOworCQkJCXByaW50ayhLRVJOX0VSUiAiICVzXG4iLCBwLT5jb21tKTsKKwogCQkJY2FuY2VsX2ZyZWV6aW5nKHApOwogCQl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOwogCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JCXJldHVybiB0b2RvOwogCX0KIAotCXByaW50ayggInxcbiIgKTsKKwlyZXR1cm4gdG9kbzsKK30KKworLyoqCisgKglmcmVlemVfcHJvY2Vzc2VzIC0gdGVsbCBwcm9jZXNzZXMgdG8gZW50ZXIgdGhlIHJlZnJpZ2VyYXRvcgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzLCBvciB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyB0aGF0IGRpZG4ndCBmcmVlemUsCisgKglhbHRob3VnaCB0aGV5IHdlcmUgdG9sZCB0by4KKyAqLworaW50IGZyZWV6ZV9wcm9jZXNzZXModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbnJfdW5mcm96ZW47CisKKwlwcmludGsoIlN0b3BwaW5nIHRhc2tzIC4uLiAiKTsKKwlucl91bmZyb3plbiA9IHRyeV90b19mcmVlemVfdGFza3MoRlJFRVpFUl9VU0VSX1NQQUNFKTsKKwlpZiAobnJfdW5mcm96ZW4pCisJCXJldHVybiBucl91bmZyb3plbjsKKworCXN5c19zeW5jKCk7CisJbnJfdW5mcm96ZW4gPSB0cnlfdG9fZnJlZXplX3Rhc2tzKEZSRUVaRVJfS0VSTkVMX1RIUkVBRFMpOworCWlmIChucl91bmZyb3plbikKKwkJcmV0dXJuIG5yX3VuZnJvemVuOworCisJcHJpbnRrKCJkb25lLlxuIik7CiAJQlVHX09OKGluX2F0b21pYygpKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB0aGF3X3Byb2Nlc3Nlcyh2b2lkKQorc3RhdGljIHZvaWQgdGhhd190YXNrcyhpbnQgdGhhd191c2VyX3NwYWNlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CiAKLQlwcmludGsoICJSZXN0YXJ0aW5nIHRhc2tzLi4uIiApOwogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJZG9fZWFjaF90aHJlYWQoZywgcCkgewogCQlpZiAoIWZyZWV6ZWFibGUocCkpCiAJCQljb250aW51ZTsKLQkJaWYgKCF0aGF3X3Byb2Nlc3MocCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICIgU3RyYW5nZSwgJXMgbm90IHN0b3BwZWRcbiIsIHAtPmNvbW0gKTsKLQl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOwogCisJCWlmIChpc191c2VyX3NwYWNlKHApID09ICF0aGF3X3VzZXJfc3BhY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoIXRoYXdfcHJvY2VzcyhwKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBTdHJhbmdlLCAlcyBub3Qgc3RvcHBlZFxuIiwKKwkJCQlwLT5jb21tICk7CisJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Cit9CisKK3ZvaWQgdGhhd19wcm9jZXNzZXModm9pZCkKK3sKKwlwcmludGsoIlJlc3RhcnRpbmcgdGFza3MgLi4uICIpOworCXRoYXdfdGFza3MoRlJFRVpFUl9LRVJORUxfVEhSRUFEUyk7CisJdGhhd190YXNrcyhGUkVFWkVSX1VTRVJfU1BBQ0UpOwogCXNjaGVkdWxlKCk7Ci0JcHJpbnRrKCAiIGRvbmVcbiIgKTsKKwlwcmludGsoImRvbmUuXG4iKTsKIH0KIAogRVhQT1JUX1NZTUJPTChyZWZyaWdlcmF0b3IpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwppbmRleCA5OWY5YjdkLi5jMDI0NjA2IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYworKysgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwpAQCAtMSwxNSArMSwxNSBAQAogLyoKICAqIGxpbnV4L2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCiAgKgotICogVGhpcyBmaWxlIHByb3ZpZGUgc3lzdGVtIHNuYXBzaG90L3Jlc3RvcmUgZnVuY3Rpb25hbGl0eS4KKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBzeXN0ZW0gc25hcHNob3QvcmVzdG9yZSBmdW5jdGlvbmFsaXR5IGZvciBzd3N1c3AuCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4KICAqCi0gKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLCBhbmQgaXMgYmFzZWQgb24gc3dzdXNwLmMuCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgogICoKICAqLwogCi0KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTM0LDEzNyArMzQsMjQgQEAKIAogI2luY2x1ZGUgInBvd2VyLmgiCiAKLS8qIExpc3Qgb2YgUEJFcyB1c2VkIGZvciBjcmVhdGluZyBhbmQgcmVzdG9yaW5nIHRoZSBzdXNwZW5kIGltYWdlICovCisvKiBMaXN0IG9mIFBCRXMgbmVlZGVkIGZvciByZXN0b3JpbmcgdGhlIHBhZ2VzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgYmVmb3JlCisgKiB0aGUgc3VzcGVuZCBhbmQgaW5jbHVkZWQgaW4gdGhlIHN1c3BlbmQgaW1hZ2UsIGJ1dCBoYXZlIGFsc28gYmVlbgorICogYWxsb2NhdGVkIGJ5IHRoZSAicmVzdW1lIiBrZXJuZWwsIHNvIHRoZWlyIGNvbnRlbnRzIGNhbm5vdCBiZSB3cml0dGVuCisgKiBkaXJlY3RseSB0byB0aGVpciAib3JpZ2luYWwiIHBhZ2UgZnJhbWVzLgorICovCiBzdHJ1Y3QgcGJlICpyZXN0b3JlX3BibGlzdDsKIAotc3RhdGljIHVuc2lnbmVkIGludCBucl9jb3B5X3BhZ2VzOwotc3RhdGljIHVuc2lnbmVkIGludCBucl9tZXRhX3BhZ2VzOworLyogUG9pbnRlciB0byBhbiBhdXhpbGlhcnkgYnVmZmVyICgxIHBhZ2UpICovCiBzdGF0aWMgdm9pZCAqYnVmZmVyOwogCi0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLXVuc2lnbmVkIGludCBjb3VudF9oaWdobWVtX3BhZ2VzKHZvaWQpCi17Ci0Jc3RydWN0IHpvbmUgKnpvbmU7Ci0JdW5zaWduZWQgbG9uZyB6b25lX3BmbjsKLQl1bnNpZ25lZCBpbnQgbiA9IDA7Ci0KLQlmb3JfZWFjaF96b25lICh6b25lKQotCQlpZiAoaXNfaGlnaG1lbSh6b25lKSkgewotCQkJbWFya19mcmVlX3BhZ2VzKHpvbmUpOwotCQkJZm9yICh6b25lX3BmbiA9IDA7IHpvbmVfcGZuIDwgem9uZS0+c3Bhbm5lZF9wYWdlczsgem9uZV9wZm4rKykgewotCQkJCXN0cnVjdCBwYWdlICpwYWdlOwotCQkJCXVuc2lnbmVkIGxvbmcgcGZuID0gem9uZV9wZm4gKyB6b25lLT56b25lX3N0YXJ0X3BmbjsKLQkJCQlpZiAoIXBmbl92YWxpZChwZm4pKQotCQkJCQljb250aW51ZTsKLQkJCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQkJCQlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoUGFnZU5vc2F2ZUZyZWUocGFnZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCW4rKzsKLQkJCX0KLQkJfQotCXJldHVybiBuOwotfQotCi1zdHJ1Y3QgaGlnaG1lbV9wYWdlIHsKLQljaGFyICpkYXRhOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBoaWdobWVtX3BhZ2UgKm5leHQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGhpZ2htZW1fcGFnZSAqaGlnaG1lbV9jb3B5OwotCi1zdGF0aWMgaW50IHNhdmVfaGlnaG1lbV96b25lKHN0cnVjdCB6b25lICp6b25lKQotewotCXVuc2lnbmVkIGxvbmcgem9uZV9wZm47Ci0JbWFya19mcmVlX3BhZ2VzKHpvbmUpOwotCWZvciAoem9uZV9wZm4gPSAwOyB6b25lX3BmbiA8IHpvbmUtPnNwYW5uZWRfcGFnZXM7ICsrem9uZV9wZm4pIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXN0cnVjdCBoaWdobWVtX3BhZ2UgKnNhdmU7Ci0JCXZvaWQgKmthZGRyOwotCQl1bnNpZ25lZCBsb25nIHBmbiA9IHpvbmVfcGZuICsgem9uZS0+em9uZV9zdGFydF9wZm47Ci0KLQkJaWYgKCEocGZuJTEwMDAwKSkKLQkJCXByaW50aygiLiIpOwotCQlpZiAoIXBmbl92YWxpZChwZm4pKQotCQkJY29udGludWU7Ci0JCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwotCQkvKgotCQkgKiBUaGlzIGNvbmRpdGlvbiByZXN1bHRzIGZyb20gcnZtYWxsb2MoKSBzYW5zIHZtYWxsb2NfMzIoKQotCQkgKiBhbmQgYXJjaGl0ZWN0dXJhbCBtZW1vcnkgcmVzZXJ2YXRpb25zLiBUaGlzIHNob3VsZCBiZQotCQkgKiBjb3JyZWN0ZWQgZXZlbnR1YWxseSB3aGVuIHRoZSBjYXNlcyBnaXZpbmcgcmlzZSB0byB0aGlzCi0JCSAqIGFyZSBiZXR0ZXIgdW5kZXJzdG9vZC4KLQkJICovCi0JCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCi0JCQljb250aW51ZTsKLQkJQlVHX09OKFBhZ2VOb3NhdmUocGFnZSkpOwotCQlpZiAoUGFnZU5vc2F2ZUZyZWUocGFnZSkpCi0JCQljb250aW51ZTsKLQkJc2F2ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWdobWVtX3BhZ2UpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFzYXZlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXNhdmUtPm5leHQgPSBoaWdobWVtX2NvcHk7Ci0JCXNhdmUtPnBhZ2UgPSBwYWdlOwotCQlzYXZlLT5kYXRhID0gKHZvaWQgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwotCQlpZiAoIXNhdmUtPmRhdGEpIHsKLQkJCWtmcmVlKHNhdmUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JCW1lbWNweShzYXZlLT5kYXRhLCBrYWRkciwgUEFHRV9TSVpFKTsKLQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwotCQloaWdobWVtX2NvcHkgPSBzYXZlOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHNhdmVfaGlnaG1lbSh2b2lkKQotewotCXN0cnVjdCB6b25lICp6b25lOwotCWludCByZXMgPSAwOwotCi0JcHJfZGVidWcoInN3c3VzcDogU2F2aW5nIEhpZ2htZW0iKTsKLQlkcmFpbl9sb2NhbF9wYWdlcygpOwotCWZvcl9lYWNoX3pvbmUgKHpvbmUpIHsKLQkJaWYgKGlzX2hpZ2htZW0oem9uZSkpCi0JCQlyZXMgPSBzYXZlX2hpZ2htZW1fem9uZSh6b25lKTsKLQkJaWYgKHJlcykKLQkJCXJldHVybiByZXM7Ci0JfQotCXByaW50aygiXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHJlc3RvcmVfaGlnaG1lbSh2b2lkKQotewotCXByaW50aygic3dzdXNwOiBSZXN0b3JpbmcgSGlnaG1lbVxuIik7Ci0Jd2hpbGUgKGhpZ2htZW1fY29weSkgewotCQlzdHJ1Y3QgaGlnaG1lbV9wYWdlICpzYXZlID0gaGlnaG1lbV9jb3B5OwotCQl2b2lkICprYWRkcjsKLQkJaGlnaG1lbV9jb3B5ID0gc2F2ZS0+bmV4dDsKLQotCQlrYWRkciA9IGttYXBfYXRvbWljKHNhdmUtPnBhZ2UsIEtNX1VTRVIwKTsKLQkJbWVtY3B5KGthZGRyLCBzYXZlLT5kYXRhLCBQQUdFX1NJWkUpOwotCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0JCWZyZWVfcGFnZSgobG9uZykgc2F2ZS0+ZGF0YSk7Ci0JCWtmcmVlKHNhdmUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjb3VudF9oaWdobWVtX3BhZ2VzKHZvaWQpIHtyZXR1cm4gMDt9Ci1zdGF0aWMgaW5saW5lIGludCBzYXZlX2hpZ2htZW0odm9pZCkge3JldHVybiAwO30KLXN0YXRpYyBpbmxpbmUgaW50IHJlc3RvcmVfaGlnaG1lbSh2b2lkKSB7cmV0dXJuIDA7fQotI2VuZGlmCi0KIC8qKgogICoJQHNhZmVfbmVlZGVkIC0gb24gcmVzdW1lLCBmb3Igc3RvcmluZyB0aGUgUEJFIGxpc3QgYW5kIHRoZSBpbWFnZSwKICAqCXdlIGNhbiBvbmx5IHVzZSBtZW1vcnkgcGFnZXMgdGhhdCBkbyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgcGFnZXMKLSAqCXVzZWQgYmVmb3JlIHN1c3BlbmQuCisgKgl1c2VkIGJlZm9yZSBzdXNwZW5kLiAgVGhlIHVuc2FmZSBwYWdlcyBoYXZlIFBhZ2VOb3NhdmVGcmVlIHNldAorICoJYW5kIHdlIGNvdW50IHRoZW0gdXNpbmcgdW5zYWZlX3BhZ2VzLgogICoKLSAqCVRoZSB1bnNhZmUgcGFnZXMgYXJlIG1hcmtlZCB3aXRoIHRoZSBQR19ub3NhdmVfZnJlZSBmbGFnCi0gKglhbmQgd2UgY291bnQgdGhlbSB1c2luZyB1bnNhZmVfcGFnZXMKKyAqCUVhY2ggYWxsb2NhdGVkIGltYWdlIHBhZ2UgaXMgbWFya2VkIGFzIFBhZ2VOb3NhdmUgYW5kIFBhZ2VOb3NhdmVGcmVlCisgKglzbyB0aGF0IHN3c3VzcF9mcmVlKCkgY2FuIHJlbGVhc2UgaXQuCiAgKi8KIAogI2RlZmluZSBQR19BTlkJCTAKQEAgLTE3NCw3ICs2MSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWxsb2NhdGVkX3Vuc2FmZV9wYWdlczsKIAotc3RhdGljIHZvaWQgKmFsbG9jX2ltYWdlX3BhZ2UoZ2ZwX3QgZ2ZwX21hc2ssIGludCBzYWZlX25lZWRlZCkKK3N0YXRpYyB2b2lkICpnZXRfaW1hZ2VfcGFnZShnZnBfdCBnZnBfbWFzaywgaW50IHNhZmVfbmVlZGVkKQogewogCXZvaWQgKnJlczsKIApAQCAtMTk1LDIwICs4MiwzOSBAQAogCiB1bnNpZ25lZCBsb25nIGdldF9zYWZlX3BhZ2UoZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nKWFsbG9jX2ltYWdlX3BhZ2UoZ2ZwX21hc2ssIFBHX1NBRkUpOworCXJldHVybiAodW5zaWduZWQgbG9uZylnZXRfaW1hZ2VfcGFnZShnZnBfbWFzaywgUEdfU0FGRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfaW1hZ2VfcGFnZShnZnBfdCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXBhZ2UgPSBhbGxvY19wYWdlKGdmcF9tYXNrKTsKKwlpZiAocGFnZSkgeworCQlTZXRQYWdlTm9zYXZlKHBhZ2UpOworCQlTZXRQYWdlTm9zYXZlRnJlZShwYWdlKTsKKwl9CisJcmV0dXJuIHBhZ2U7CiB9CiAKIC8qKgogICoJZnJlZV9pbWFnZV9wYWdlIC0gZnJlZSBwYWdlIHJlcHJlc2VudGVkIGJ5IEBhZGRyLCBhbGxvY2F0ZWQgd2l0aAotICoJYWxsb2NfaW1hZ2VfcGFnZSAocGFnZSBmbGFncyBzZXQgYnkgaXQgbXVzdCBiZSBjbGVhcmVkKQorICoJZ2V0X2ltYWdlX3BhZ2UgKHBhZ2UgZmxhZ3Mgc2V0IGJ5IGl0IG11c3QgYmUgY2xlYXJlZCkKICAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9pbWFnZV9wYWdlKHZvaWQgKmFkZHIsIGludCBjbGVhcl9ub3NhdmVfZnJlZSkKIHsKLQlDbGVhclBhZ2VOb3NhdmUodmlydF90b19wYWdlKGFkZHIpKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCUJVR19PTighdmlydF9hZGRyX3ZhbGlkKGFkZHIpKTsKKworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CisKKwlDbGVhclBhZ2VOb3NhdmUocGFnZSk7CiAJaWYgKGNsZWFyX25vc2F2ZV9mcmVlKQotCQlDbGVhclBhZ2VOb3NhdmVGcmVlKHZpcnRfdG9fcGFnZShhZGRyKSk7Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIpOworCQlDbGVhclBhZ2VOb3NhdmVGcmVlKHBhZ2UpOworCisJX19mcmVlX3BhZ2UocGFnZSk7CiB9CiAKIC8qIHN0cnVjdCBsaW5rZWRfcGFnZSBpcyB1c2VkIHRvIGJ1aWxkIGNoYWlucyBvZiBwYWdlcyAqLwpAQCAtMjY5LDcgKzE3NSw3IEBACiAJaWYgKExJTktFRF9QQUdFX0RBVEFfU0laRSAtIGNhLT51c2VkX3NwYWNlIDwgc2l6ZSkgewogCQlzdHJ1Y3QgbGlua2VkX3BhZ2UgKmxwOwogCi0JCWxwID0gYWxsb2NfaW1hZ2VfcGFnZShjYS0+Z2ZwX21hc2ssIGNhLT5zYWZlX25lZWRlZCk7CisJCWxwID0gZ2V0X2ltYWdlX3BhZ2UoY2EtPmdmcF9tYXNrLCBjYS0+c2FmZV9uZWVkZWQpOwogCQlpZiAoIWxwKQogCQkJcmV0dXJuIE5VTEw7CiAKQEAgLTQ0Niw4ICszNTIsOCBAQAogCiAJLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHpvbmVzICovCiAJbnIgPSAwOwotCWZvcl9lYWNoX3pvbmUgKHpvbmUpCi0JCWlmIChwb3B1bGF0ZWRfem9uZSh6b25lKSAmJiAhaXNfaGlnaG1lbSh6b25lKSkKKwlmb3JfZWFjaF96b25lKHpvbmUpCisJCWlmIChwb3B1bGF0ZWRfem9uZSh6b25lKSkKIAkJCW5yKys7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgbGlzdCBvZiB6b25lcyBiaXRtYXAgb2JqZWN0cyAqLwpAQCAtNDU5LDEwICszNjUsMTAgQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSB6b25lIGJpdG1hcCBvYmplY3RzICovCi0JZm9yX2VhY2hfem9uZSAoem9uZSkgeworCWZvcl9lYWNoX3pvbmUoem9uZSkgewogCQl1bnNpZ25lZCBsb25nIHBmbjsKIAotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpIHx8IGlzX2hpZ2htZW0oem9uZSkpCisJCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCiAJCQljb250aW51ZTsKIAogCQl6b25lX2JtLT5zdGFydF9wZm4gPSB6b25lLT56b25lX3N0YXJ0X3BmbjsKQEAgLTQ4MSw3ICszODcsNyBAQAogCQl3aGlsZSAoYmIpIHsKIAkJCXVuc2lnbmVkIGxvbmcgKnB0cjsKIAotCQkJcHRyID0gYWxsb2NfaW1hZ2VfcGFnZShnZnBfbWFzaywgc2FmZV9uZWVkZWQpOworCQkJcHRyID0gZ2V0X2ltYWdlX3BhZ2UoZ2ZwX21hc2ssIHNhZmVfbmVlZGVkKTsKIAkJCWJiLT5kYXRhID0gcHRyOwogCQkJaWYgKCFwdHIpCiAJCQkJZ290byBGcmVlOwpAQCAtNTA1LDcgKzQxMSw3IEBACiAJbWVtb3J5X2JtX3Bvc2l0aW9uX3Jlc2V0KGJtKTsKIAlyZXR1cm4gMDsKIAotRnJlZToKKyBGcmVlOgogCWJtLT5wX2xpc3QgPSBjYS5jaGFpbjsKIAltZW1vcnlfYm1fZnJlZShibSwgUEdfVU5TQUZFX0NMRUFSKTsKIAlyZXR1cm4gLUVOT01FTTsKQEAgLTY1MSw3ICs1NTcsNyBAQAogCW1lbW9yeV9ibV9wb3NpdGlvbl9yZXNldChibSk7CiAJcmV0dXJuIEJNX0VORF9PRl9NQVA7CiAKLVJldHVybl9wZm46CisgUmV0dXJuX3BmbjoKIAlibS0+Y3VyLmNodW5rID0gY2h1bms7CiAJYm0tPmN1ci5iaXQgPSBiaXQ7CiAJcmV0dXJuIGJiLT5zdGFydF9wZm4gKyBjaHVuayAqIEJNX0JJVFNfUEVSX0NIVU5LICsgYml0OwpAQCAtNjY5LDkgKzU3NSw4MSBAQAogCiAJcmVzID0gRElWX1JPVU5EX1VQKHpvbmUtPnNwYW5uZWRfcGFnZXMsIEJNX0JJVFNfUEVSX0JMT0NLKTsKIAlyZXMgKz0gRElWX1JPVU5EX1VQKHJlcyAqIHNpemVvZihzdHJ1Y3QgYm1fYmxvY2spLCBQQUdFX1NJWkUpOwotCXJldHVybiByZXM7CisJcmV0dXJuIDIgKiByZXM7CiB9CiAKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorLyoqCisgKgljb3VudF9mcmVlX2hpZ2htZW1fcGFnZXMgLSBjb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgZnJlZSBoaWdobWVtCisgKglwYWdlcywgc3lzdGVtLXdpZGUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBjb3VudF9mcmVlX2hpZ2htZW1fcGFnZXModm9pZCkKK3sKKwlzdHJ1Y3Qgem9uZSAqem9uZTsKKwl1bnNpZ25lZCBpbnQgY250ID0gMDsKKworCWZvcl9lYWNoX3pvbmUoem9uZSkKKwkJaWYgKHBvcHVsYXRlZF96b25lKHpvbmUpICYmIGlzX2hpZ2htZW0oem9uZSkpCisJCQljbnQgKz0gem9uZS0+ZnJlZV9wYWdlczsKKworCXJldHVybiBjbnQ7Cit9CisKKy8qKgorICoJc2F2ZWFibGVfaGlnaG1lbV9wYWdlIC0gRGV0ZXJtaW5lIHdoZXRoZXIgYSBoaWdobWVtIHBhZ2Ugc2hvdWxkIGJlCisgKglpbmNsdWRlZCBpbiB0aGUgc3VzcGVuZCBpbWFnZS4KKyAqCisgKglXZSBzaG91bGQgc2F2ZSB0aGUgcGFnZSBpZiBpdCBpc24ndCBOb3NhdmUgb3IgTm9zYXZlRnJlZSwgb3IgUmVzZXJ2ZWQsCisgKglhbmQgaXQgaXNuJ3QgYSBwYXJ0IG9mIGEgZnJlZSBjaHVuayBvZiBwYWdlcy4KKyAqLworCitzdGF0aWMgc3RydWN0IHBhZ2UgKnNhdmVhYmxlX2hpZ2htZW1fcGFnZSh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmICghcGZuX3ZhbGlkKHBmbikpCisJCXJldHVybiBOVUxMOworCisJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisKKwlCVUdfT04oIVBhZ2VIaWdoTWVtKHBhZ2UpKTsKKworCWlmIChQYWdlTm9zYXZlKHBhZ2UpIHx8IFBhZ2VSZXNlcnZlZChwYWdlKSB8fCBQYWdlTm9zYXZlRnJlZShwYWdlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcGFnZTsKK30KKworLyoqCisgKgljb3VudF9oaWdobWVtX3BhZ2VzIC0gY29tcHV0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHNhdmVhYmxlIGhpZ2htZW0KKyAqCXBhZ2VzLgorICovCisKK3Vuc2lnbmVkIGludCBjb3VudF9oaWdobWVtX3BhZ2VzKHZvaWQpCit7CisJc3RydWN0IHpvbmUgKnpvbmU7CisJdW5zaWduZWQgaW50IG4gPSAwOworCisJZm9yX2VhY2hfem9uZSh6b25lKSB7CisJCXVuc2lnbmVkIGxvbmcgcGZuLCBtYXhfem9uZV9wZm47CisKKwkJaWYgKCFpc19oaWdobWVtKHpvbmUpKQorCQkJY29udGludWU7CisKKwkJbWFya19mcmVlX3BhZ2VzKHpvbmUpOworCQltYXhfem9uZV9wZm4gPSB6b25lLT56b25lX3N0YXJ0X3BmbiArIHpvbmUtPnNwYW5uZWRfcGFnZXM7CisJCWZvciAocGZuID0gem9uZS0+em9uZV9zdGFydF9wZm47IHBmbiA8IG1heF96b25lX3BmbjsgcGZuKyspCisJCQlpZiAoc2F2ZWFibGVfaGlnaG1lbV9wYWdlKHBmbikpCisJCQkJbisrOworCX0KKwlyZXR1cm4gbjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgKnNhdmVhYmxlX2hpZ2htZW1fcGFnZSh1bnNpZ25lZCBsb25nIHBmbikgeyByZXR1cm4gTlVMTDsgfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY291bnRfaGlnaG1lbV9wYWdlcyh2b2lkKSB7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KKwogLyoqCiAgKglwZm5faXNfbm9zYXZlIC0gY2hlY2sgaWYgZ2l2ZW4gcGZuIGlzIGluIHRoZSAnbm9zYXZlJyBzZWN0aW9uCiAgKi8KQEAgLTY4NCwxMiArNjYyLDEyIEBACiB9CiAKIC8qKgotICoJc2F2ZWFibGUgLSBEZXRlcm1pbmUgd2hldGhlciBhIHBhZ2Ugc2hvdWxkIGJlIGNsb25lZCBvciBub3QuCi0gKglAcGZuOglUaGUgcGFnZQorICoJc2F2ZWFibGUgLSBEZXRlcm1pbmUgd2hldGhlciBhIG5vbi1oaWdobWVtIHBhZ2Ugc2hvdWxkIGJlIGluY2x1ZGVkIGluCisgKgl0aGUgc3VzcGVuZCBpbWFnZS4KICAqCi0gKglXZSBzYXZlIGEgcGFnZSBpZiBpdCBpc24ndCBOb3NhdmUsIGFuZCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIHBhZ2VzCi0gKglzdGF0aWNhbGx5IGRlZmluZWQgYXMgJ3Vuc2F2ZWFibGUnLCBhbmQgaXQKLSAqCWlzbid0IGEgcGFydCBvZiBhIGZyZWUgY2h1bmsgb2YgcGFnZXMuCisgKglXZSBzaG91bGQgc2F2ZSB0aGUgcGFnZSBpZiBpdCBpc24ndCBOb3NhdmUsIGFuZCBpcyBub3QgaW4gdGhlIHJhbmdlCisgKglvZiBwYWdlcyBzdGF0aWNhbGx5IGRlZmluZWQgYXMgJ3Vuc2F2ZWFibGUnLCBhbmQgaXQgaXNuJ3QgYSBwYXJ0IG9mCisgKglhIGZyZWUgY2h1bmsgb2YgcGFnZXMuCiAgKi8KIAogc3RhdGljIHN0cnVjdCBwYWdlICpzYXZlYWJsZV9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKQpAQCAtNzAxLDc2ICs2NzksMTMwIEBACiAKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKIAotCWlmIChQYWdlTm9zYXZlKHBhZ2UpKQorCUJVR19PTihQYWdlSGlnaE1lbShwYWdlKSk7CisKKwlpZiAoUGFnZU5vc2F2ZShwYWdlKSB8fCBQYWdlTm9zYXZlRnJlZShwYWdlKSkKIAkJcmV0dXJuIE5VTEw7CisKIAlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpICYmIHBmbl9pc19ub3NhdmUocGZuKSkKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKFBhZ2VOb3NhdmVGcmVlKHBhZ2UpKQotCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwYWdlOwogfQogCisvKioKKyAqCWNvdW50X2RhdGFfcGFnZXMgLSBjb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2F2ZWFibGUgbm9uLWhpZ2htZW0KKyAqCXBhZ2VzLgorICovCisKIHVuc2lnbmVkIGludCBjb3VudF9kYXRhX3BhZ2VzKHZvaWQpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJdW5zaWduZWQgbG9uZyBwZm4sIG1heF96b25lX3BmbjsKIAl1bnNpZ25lZCBpbnQgbiA9IDA7CiAKLQlmb3JfZWFjaF96b25lICh6b25lKSB7CisJZm9yX2VhY2hfem9uZSh6b25lKSB7CiAJCWlmIChpc19oaWdobWVtKHpvbmUpKQogCQkJY29udGludWU7CisKIAkJbWFya19mcmVlX3BhZ2VzKHpvbmUpOwogCQltYXhfem9uZV9wZm4gPSB6b25lLT56b25lX3N0YXJ0X3BmbiArIHpvbmUtPnNwYW5uZWRfcGFnZXM7CiAJCWZvciAocGZuID0gem9uZS0+em9uZV9zdGFydF9wZm47IHBmbiA8IG1heF96b25lX3BmbjsgcGZuKyspCi0JCQluICs9ICEhc2F2ZWFibGVfcGFnZShwZm4pOworCQkJaWYoc2F2ZWFibGVfcGFnZShwZm4pKQorCQkJCW4rKzsKIAl9CiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2RhdGFfcGFnZShsb25nICpkc3QsIGxvbmcgKnNyYykKKy8qIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIGNvcHlfcGFnZSBhbmQgbWVtY3B5IGFyZSBub3QgdXNhYmxlIGZvciBjb3B5aW5nCisgKiB0YXNrIHN0cnVjdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19jb3B5X3BhZ2UobG9uZyAqZHN0LCBsb25nICpzcmMpCiB7CiAJaW50IG47CiAKLQkvKiBjb3B5X3BhZ2UgYW5kIG1lbWNweSBhcmUgbm90IHVzYWJsZSBmb3IgY29weWluZyB0YXNrIHN0cnVjdHMuICovCiAJZm9yIChuID0gUEFHRV9TSVpFIC8gc2l6ZW9mKGxvbmcpOyBuOyBuLS0pCiAJCSpkc3QrKyA9ICpzcmMrKzsKIH0KIAorI2lmZGVmIENPTkZJR19ISUdITUVNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICoKK3BhZ2VfaXNfc2F2ZWFibGUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXJldHVybiBpc19oaWdobWVtKHpvbmUpID8KKwkJCXNhdmVhYmxlX2hpZ2htZW1fcGFnZShwZm4pIDogc2F2ZWFibGVfcGFnZShwZm4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NvcHlfZGF0YV9wYWdlKHVuc2lnbmVkIGxvbmcgZHN0X3BmbiwgdW5zaWduZWQgbG9uZyBzcmNfcGZuKQoreworCXN0cnVjdCBwYWdlICpzX3BhZ2UsICpkX3BhZ2U7CisJdm9pZCAqc3JjLCAqZHN0OworCisJc19wYWdlID0gcGZuX3RvX3BhZ2Uoc3JjX3Bmbik7CisJZF9wYWdlID0gcGZuX3RvX3BhZ2UoZHN0X3Bmbik7CisJaWYgKFBhZ2VIaWdoTWVtKHNfcGFnZSkpIHsKKwkJc3JjID0ga21hcF9hdG9taWMoc19wYWdlLCBLTV9VU0VSMCk7CisJCWRzdCA9IGttYXBfYXRvbWljKGRfcGFnZSwgS01fVVNFUjEpOworCQlkb19jb3B5X3BhZ2UoZHN0LCBzcmMpOworCQlrdW5tYXBfYXRvbWljKHNyYywgS01fVVNFUjApOworCQlrdW5tYXBfYXRvbWljKGRzdCwgS01fVVNFUjEpOworCX0gZWxzZSB7CisJCXNyYyA9IHBhZ2VfYWRkcmVzcyhzX3BhZ2UpOworCQlpZiAoUGFnZUhpZ2hNZW0oZF9wYWdlKSkgeworCQkJLyogUGFnZSBwb2ludGVkIHRvIGJ5IHNyYyBtYXkgY29udGFpbiBzb21lIGtlcm5lbAorCQkJICogZGF0YSBtb2RpZmllZCBieSBrbWFwX2F0b21pYygpCisJCQkgKi8KKwkJCWRvX2NvcHlfcGFnZShidWZmZXIsIHNyYyk7CisJCQlkc3QgPSBrbWFwX2F0b21pYyhwZm5fdG9fcGFnZShkc3RfcGZuKSwgS01fVVNFUjApOworCQkJbWVtY3B5KGRzdCwgYnVmZmVyLCBQQUdFX1NJWkUpOworCQkJa3VubWFwX2F0b21pYyhkc3QsIEtNX1VTRVIwKTsKKwkJfSBlbHNlIHsKKwkJCWRzdCA9IHBhZ2VfYWRkcmVzcyhkX3BhZ2UpOworCQkJZG9fY29weV9wYWdlKGRzdCwgc3JjKTsKKwkJfQorCX0KK30KKyNlbHNlCisjZGVmaW5lIHBhZ2VfaXNfc2F2ZWFibGUoem9uZSwgcGZuKQlzYXZlYWJsZV9wYWdlKHBmbikKKworc3RhdGljIGlubGluZSB2b2lkCitjb3B5X2RhdGFfcGFnZSh1bnNpZ25lZCBsb25nIGRzdF9wZm4sIHVuc2lnbmVkIGxvbmcgc3JjX3BmbikKK3sKKwlkb19jb3B5X3BhZ2UocGFnZV9hZGRyZXNzKHBmbl90b19wYWdlKGRzdF9wZm4pKSwKKwkJCXBhZ2VfYWRkcmVzcyhwZm5fdG9fcGFnZShzcmNfcGZuKSkpOworfQorI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCisKIHN0YXRpYyB2b2lkCiBjb3B5X2RhdGFfcGFnZXMoc3RydWN0IG1lbW9yeV9iaXRtYXAgKmNvcHlfYm0sIHN0cnVjdCBtZW1vcnlfYml0bWFwICpvcmlnX2JtKQogewogCXN0cnVjdCB6b25lICp6b25lOwogCXVuc2lnbmVkIGxvbmcgcGZuOwogCi0JZm9yX2VhY2hfem9uZSAoem9uZSkgeworCWZvcl9lYWNoX3pvbmUoem9uZSkgewogCQl1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbjsKIAotCQlpZiAoaXNfaGlnaG1lbSh6b25lKSkKLQkJCWNvbnRpbnVlOwotCiAJCW1hcmtfZnJlZV9wYWdlcyh6b25lKTsKIAkJbWF4X3pvbmVfcGZuID0gem9uZS0+em9uZV9zdGFydF9wZm4gKyB6b25lLT5zcGFubmVkX3BhZ2VzOwogCQlmb3IgKHBmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuOyBwZm4gPCBtYXhfem9uZV9wZm47IHBmbisrKQotCQkJaWYgKHNhdmVhYmxlX3BhZ2UocGZuKSkKKwkJCWlmIChwYWdlX2lzX3NhdmVhYmxlKHpvbmUsIHBmbikpCiAJCQkJbWVtb3J5X2JtX3NldF9iaXQob3JpZ19ibSwgcGZuKTsKIAl9CiAJbWVtb3J5X2JtX3Bvc2l0aW9uX3Jlc2V0KG9yaWdfYm0pOwogCW1lbW9yeV9ibV9wb3NpdGlvbl9yZXNldChjb3B5X2JtKTsKIAlkbyB7CiAJCXBmbiA9IG1lbW9yeV9ibV9uZXh0X3BmbihvcmlnX2JtKTsKLQkJaWYgKGxpa2VseShwZm4gIT0gQk1fRU5EX09GX01BUCkpIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlOwotCQkJdm9pZCAqc3JjOwotCi0JCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQkJCXNyYyA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQkJCXBhZ2UgPSBwZm5fdG9fcGFnZShtZW1vcnlfYm1fbmV4dF9wZm4oY29weV9ibSkpOwotCQkJY29weV9kYXRhX3BhZ2UocGFnZV9hZGRyZXNzKHBhZ2UpLCBzcmMpOwotCQl9CisJCWlmIChsaWtlbHkocGZuICE9IEJNX0VORF9PRl9NQVApKQorCQkJY29weV9kYXRhX3BhZ2UobWVtb3J5X2JtX25leHRfcGZuKGNvcHlfYm0pLCBwZm4pOwogCX0gd2hpbGUgKHBmbiAhPSBCTV9FTkRfT0ZfTUFQKTsKIH0KIAorLyogVG90YWwgbnVtYmVyIG9mIGltYWdlIHBhZ2VzICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5yX2NvcHlfcGFnZXM7CisvKiBOdW1iZXIgb2YgcGFnZXMgbmVlZGVkIGZvciBzYXZpbmcgdGhlIG9yaWdpbmFsIHBmbnMgb2YgdGhlIGltYWdlIHBhZ2VzICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5yX21ldGFfcGFnZXM7CisKIC8qKgogICoJc3dzdXNwX2ZyZWUgLSBmcmVlIHBhZ2VzIGFsbG9jYXRlZCBmb3IgdGhlIHN1c3BlbmQuCiAgKgpAQCAtNzkyLDcgKzgyNCw3IEBACiAJCQkJaWYgKFBhZ2VOb3NhdmUocGFnZSkgJiYgUGFnZU5vc2F2ZUZyZWUocGFnZSkpIHsKIAkJCQkJQ2xlYXJQYWdlTm9zYXZlKHBhZ2UpOwogCQkJCQlDbGVhclBhZ2VOb3NhdmVGcmVlKHBhZ2UpOwotCQkJCQlmcmVlX3BhZ2UoKGxvbmcpIHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJCQkJCV9fZnJlZV9wYWdlKHBhZ2UpOwogCQkJCX0KIAkJCX0KIAl9CkBAIC04MDIsMzQgKzgzNCwxMDggQEAKIAlidWZmZXIgPSBOVUxMOwogfQogCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKy8qKgorICAqCWNvdW50X3BhZ2VzX2Zvcl9oaWdobWVtIC0gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIG5vbi1oaWdobWVtIHBhZ2VzCisgICoJdGhhdCB3aWxsIGJlIG5lY2Vzc2FyeSBmb3IgY3JlYXRpbmcgY29waWVzIG9mIGhpZ2htZW0gcGFnZXMuCisgICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY291bnRfcGFnZXNfZm9yX2hpZ2htZW0odW5zaWduZWQgaW50IG5yX2hpZ2htZW0pCit7CisJdW5zaWduZWQgaW50IGZyZWVfaGlnaG1lbSA9IGNvdW50X2ZyZWVfaGlnaG1lbV9wYWdlcygpOworCisJaWYgKGZyZWVfaGlnaG1lbSA+PSBucl9oaWdobWVtKQorCQlucl9oaWdobWVtID0gMDsKKwllbHNlCisJCW5yX2hpZ2htZW0gLT0gZnJlZV9oaWdobWVtOworCisJcmV0dXJuIG5yX2hpZ2htZW07Cit9CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGludAorY291bnRfcGFnZXNfZm9yX2hpZ2htZW0odW5zaWduZWQgaW50IG5yX2hpZ2htZW0pIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfSElHSE1FTSAqLwogCiAvKioKLSAqCWVub3VnaF9mcmVlX21lbSAtIE1ha2Ugc3VyZSB3ZSBlbm91Z2ggZnJlZSBtZW1vcnkgdG8gc25hcHNob3QuCi0gKgotICoJUmV0dXJucyBUUlVFIG9yIEZBTFNFIGFmdGVyIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCi0gKglmcmVlIHBhZ2VzLgorICoJZW5vdWdoX2ZyZWVfbWVtIC0gTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGZyZWUgbWVtb3J5IGZvciB0aGUKKyAqCXNuYXBzaG90IGltYWdlLgogICovCiAKLXN0YXRpYyBpbnQgZW5vdWdoX2ZyZWVfbWVtKHVuc2lnbmVkIGludCBucl9wYWdlcykKK3N0YXRpYyBpbnQgZW5vdWdoX2ZyZWVfbWVtKHVuc2lnbmVkIGludCBucl9wYWdlcywgdW5zaWduZWQgaW50IG5yX2hpZ2htZW0pCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJdW5zaWduZWQgaW50IGZyZWUgPSAwLCBtZXRhID0gMDsKIAotCWZvcl9lYWNoX3pvbmUgKHpvbmUpCi0JCWlmICghaXNfaGlnaG1lbSh6b25lKSkgeworCWZvcl9lYWNoX3pvbmUoem9uZSkgeworCQltZXRhICs9IHNuYXBzaG90X2FkZGl0aW9uYWxfcGFnZXMoem9uZSk7CisJCWlmICghaXNfaGlnaG1lbSh6b25lKSkKIAkJCWZyZWUgKz0gem9uZS0+ZnJlZV9wYWdlczsKLQkJCW1ldGEgKz0gc25hcHNob3RfYWRkaXRpb25hbF9wYWdlcyh6b25lKTsKLQkJfQorCX0KIAotCXByX2RlYnVnKCJzd3N1c3A6IHBhZ2VzIG5lZWRlZDogJXUgKyAldSArICV1LCBhdmFpbGFibGUgcGFnZXM6ICV1XG4iLAorCW5yX3BhZ2VzICs9IGNvdW50X3BhZ2VzX2Zvcl9oaWdobWVtKG5yX2hpZ2htZW0pOworCXByX2RlYnVnKCJzd3N1c3A6IE5vcm1hbCBwYWdlcyBuZWVkZWQ6ICV1ICsgJXUgKyAldSwgYXZhaWxhYmxlIHBhZ2VzOiAldVxuIiwKIAkJbnJfcGFnZXMsIFBBR0VTX0ZPUl9JTywgbWV0YSwgZnJlZSk7CiAKIAlyZXR1cm4gZnJlZSA+IG5yX3BhZ2VzICsgUEFHRVNfRk9SX0lPICsgbWV0YTsKIH0KIAorI2lmZGVmIENPTkZJR19ISUdITUVNCisvKioKKyAqCWdldF9oaWdobWVtX2J1ZmZlciAtIGlmIHRoZXJlIGFyZSBzb21lIGhpZ2htZW0gcGFnZXMgaW4gdGhlIHN1c3BlbmQKKyAqCWltYWdlLCB3ZSBtYXkgbmVlZCB0aGUgYnVmZmVyIHRvIGNvcHkgdGhlbSBhbmQvb3IgbG9hZCB0aGVpciBkYXRhLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9oaWdobWVtX2J1ZmZlcihpbnQgc2FmZV9uZWVkZWQpCit7CisJYnVmZmVyID0gZ2V0X2ltYWdlX3BhZ2UoR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTEQsIHNhZmVfbmVlZGVkKTsKKwlyZXR1cm4gYnVmZmVyID8gMCA6IC1FTk9NRU07Cit9CisKKy8qKgorICoJYWxsb2NfaGlnaG1lbV9pbWFnZV9wYWdlcyAtIGFsbG9jYXRlIHNvbWUgaGlnaG1lbSBwYWdlcyBmb3IgdGhlIGltYWdlLgorICoJVHJ5IHRvIGFsbG9jYXRlIGFzIG1hbnkgcGFnZXMgYXMgbmVlZGVkLCBidXQgaWYgdGhlIG51bWJlciBvZiBmcmVlCisgKgloaWdobWVtIHBhZ2VzIGlzIGxlc3NlciB0aGFuIHRoYXQsIGFsbG9jYXRlIHRoZW0gYWxsLgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CithbGxvY19oaWdobWVtX2ltYWdlX3BhZ2VzKHN0cnVjdCBtZW1vcnlfYml0bWFwICpibSwgdW5zaWduZWQgaW50IG5yX2hpZ2htZW0pCit7CisJdW5zaWduZWQgaW50IHRvX2FsbG9jID0gY291bnRfZnJlZV9oaWdobWVtX3BhZ2VzKCk7CisKKwlpZiAodG9fYWxsb2MgPiBucl9oaWdobWVtKQorCQl0b19hbGxvYyA9IG5yX2hpZ2htZW07CisKKwlucl9oaWdobWVtIC09IHRvX2FsbG9jOworCXdoaWxlICh0b19hbGxvYy0tID4gMCkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQlwYWdlID0gYWxsb2NfaW1hZ2VfcGFnZShfX0dGUF9ISUdITUVNKTsKKwkJbWVtb3J5X2JtX3NldF9iaXQoYm0sIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKKwl9CisJcmV0dXJuIG5yX2hpZ2htZW07Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZ2V0X2hpZ2htZW1fYnVmZmVyKGludCBzYWZlX25lZWRlZCkgeyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorYWxsb2NfaGlnaG1lbV9pbWFnZV9wYWdlcyhzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0sIHVuc2lnbmVkIGludCBuKSB7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KKworLyoqCisgKglzd3N1c3BfYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdXNwZW5kIGltYWdlCisgKgorICoJV2UgZmlyc3QgdHJ5IHRvIGFsbG9jYXRlIGFzIG1hbnkgaGlnaG1lbSBwYWdlcyBhcyB0aGVyZSBhcmUKKyAqCXNhdmVhYmxlIGhpZ2htZW0gcGFnZXMgaW4gdGhlIHN5c3RlbS4gIElmIHRoYXQgZmFpbHMsIHdlIGFsbG9jYXRlCisgKglub24taGlnaG1lbSBwYWdlcyBmb3IgdGhlIGNvcGllcyBvZiB0aGUgcmVtYWluaW5nIGhpZ2htZW0gb25lcy4KKyAqCisgKglJbiB0aGlzIGFwcHJvYWNoIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBjb3BpZXMgb2YgaGlnaG1lbSBwYWdlcyB3aWxsCisgKglhbHNvIGJlIGxvY2F0ZWQgaW4gdGhlIGhpZ2ggbWVtb3J5LCBiZWNhdXNlIG9mIHRoZSB3YXkgaW4gd2hpY2gKKyAqCWNvcHlfZGF0YV9wYWdlcygpIHdvcmtzLgorICovCisKIHN0YXRpYyBpbnQKIHN3c3VzcF9hbGxvYyhzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqb3JpZ19ibSwgc3RydWN0IG1lbW9yeV9iaXRtYXAgKmNvcHlfYm0sCi0JCXVuc2lnbmVkIGludCBucl9wYWdlcykKKwkJdW5zaWduZWQgaW50IG5yX3BhZ2VzLCB1bnNpZ25lZCBpbnQgbnJfaGlnaG1lbSkKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTg0MSw0NiArOTQ3LDYxIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIEZyZWU7CiAKKwlpZiAobnJfaGlnaG1lbSA+IDApIHsKKwkJZXJyb3IgPSBnZXRfaGlnaG1lbV9idWZmZXIoUEdfQU5ZKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBGcmVlOworCisJCW5yX3BhZ2VzICs9IGFsbG9jX2hpZ2htZW1faW1hZ2VfcGFnZXMoY29weV9ibSwgbnJfaGlnaG1lbSk7CisJfQogCXdoaWxlIChucl9wYWdlcy0tID4gMCkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTEQpOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX2ltYWdlX3BhZ2UoR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTEQpOworCiAJCWlmICghcGFnZSkKIAkJCWdvdG8gRnJlZTsKIAotCQlTZXRQYWdlTm9zYXZlKHBhZ2UpOwotCQlTZXRQYWdlTm9zYXZlRnJlZShwYWdlKTsKIAkJbWVtb3J5X2JtX3NldF9iaXQoY29weV9ibSwgcGFnZV90b19wZm4ocGFnZSkpOwogCX0KIAlyZXR1cm4gMDsKIAotRnJlZToKKyBGcmVlOgogCXN3c3VzcF9mcmVlKCk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLS8qIE1lbW9yeSBiaXRtYXAgdXNlZCBmb3IgbWFya2luZyBzYXZlYWJsZSBwYWdlcyAqLworLyogTWVtb3J5IGJpdG1hcCB1c2VkIGZvciBtYXJraW5nIHNhdmVhYmxlIHBhZ2VzIChkdXJpbmcgc3VzcGVuZCkgb3IgdGhlCisgKiBzdXNwZW5kIGltYWdlIHBhZ2VzIChkdXJpbmcgcmVzdW1lKQorICovCiBzdGF0aWMgc3RydWN0IG1lbW9yeV9iaXRtYXAgb3JpZ19ibTsKLS8qIE1lbW9yeSBiaXRtYXAgdXNlZCBmb3IgbWFya2luZyBhbGxvY2F0ZWQgcGFnZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvcGllcwotICogb2Ygc2F2ZWFibGUgcGFnZXMKKy8qIE1lbW9yeSBiaXRtYXAgdXNlZCBvbiBzdXNwZW5kIGZvciBtYXJraW5nIGFsbG9jYXRlZCBwYWdlcyB0aGF0IHdpbGwgY29udGFpbgorICogdGhlIGNvcGllcyBvZiBzYXZlYWJsZSBwYWdlcy4gIER1cmluZyByZXN1bWUgaXQgaXMgaW5pdGlhbGx5IHVzZWQgZm9yCisgKiBtYXJraW5nIHRoZSBzdXNwZW5kIGltYWdlIHBhZ2VzLCBidXQgdGhlbiBpdHMgc2V0IGJpdHMgYXJlIGR1cGxpY2F0ZWQgaW4KKyAqIEBvcmlnX2JtIGFuZCBpdCBpcyByZWxlYXNlZC4gIE5leHQsIG9uIHN5c3RlbXMgd2l0aCBoaWdoIG1lbW9yeSwgaXQgbWF5IGJlCisgKiB1c2VkIGZvciBtYXJraW5nICJzYWZlIiBoaWdobWVtIHBhZ2VzLCBidXQgaXQgaGFzIHRvIGJlIHJlaW5pdGlhbGl6ZWQgZm9yCisgKiB0aGlzIHB1cnBvc2UuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbWVtb3J5X2JpdG1hcCBjb3B5X2JtOwogCiBhc21saW5rYWdlIGludCBzd3N1c3Bfc2F2ZSh2b2lkKQogewotCXVuc2lnbmVkIGludCBucl9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbnJfcGFnZXMsIG5yX2hpZ2htZW07CiAKLQlwcl9kZWJ1Zygic3dzdXNwOiBjcml0aWNhbCBzZWN0aW9uOiBcbiIpOworCXByaW50aygic3dzdXNwOiBjcml0aWNhbCBzZWN0aW9uOiBcbiIpOwogCiAJZHJhaW5fbG9jYWxfcGFnZXMoKTsKIAlucl9wYWdlcyA9IGNvdW50X2RhdGFfcGFnZXMoKTsKLQlwcmludGsoInN3c3VzcDogTmVlZCB0byBjb3B5ICV1IHBhZ2VzXG4iLCBucl9wYWdlcyk7CisJbnJfaGlnaG1lbSA9IGNvdW50X2hpZ2htZW1fcGFnZXMoKTsKKwlwcmludGsoInN3c3VzcDogTmVlZCB0byBjb3B5ICV1IHBhZ2VzXG4iLCBucl9wYWdlcyArIG5yX2hpZ2htZW0pOwogCi0JaWYgKCFlbm91Z2hfZnJlZV9tZW0obnJfcGFnZXMpKSB7CisJaWYgKCFlbm91Z2hfZnJlZV9tZW0obnJfcGFnZXMsIG5yX2hpZ2htZW0pKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic3dzdXNwOiBOb3QgZW5vdWdoIGZyZWUgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKHN3c3VzcF9hbGxvYygmb3JpZ19ibSwgJmNvcHlfYm0sIG5yX3BhZ2VzKSkKKwlpZiAoc3dzdXNwX2FsbG9jKCZvcmlnX2JtLCAmY29weV9ibSwgbnJfcGFnZXMsIG5yX2hpZ2htZW0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3dzdXNwOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAkvKiBEdXJpbmcgYWxsb2NhdGluZyBvZiBzdXNwZW5kIHBhZ2VkaXIsIG5ldyBjb2xkIHBhZ2VzIG1heSBhcHBlYXIuCiAJICogS2lsbCB0aGVtLgpAQCAtODk0LDEwICsxMDE1LDEyIEBACiAJICogdG91Y2ggc3dhcCBzcGFjZSEgRXhjZXB0IHdlIG11c3Qgd3JpdGUgb3V0IG91ciBpbWFnZSBvZiBjb3Vyc2UuCiAJICovCiAKKwlucl9wYWdlcyArPSBucl9oaWdobWVtOwogCW5yX2NvcHlfcGFnZXMgPSBucl9wYWdlczsKLQlucl9tZXRhX3BhZ2VzID0gKG5yX3BhZ2VzICogc2l6ZW9mKGxvbmcpICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlucl9tZXRhX3BhZ2VzID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzICogc2l6ZW9mKGxvbmcpLCBQQUdFX1NJWkUpOwogCiAJcHJpbnRrKCJzd3N1c3A6IGNyaXRpY2FsIHNlY3Rpb24vOiBkb25lICglZCBwYWdlcyBjb3BpZWQpXG4iLCBucl9wYWdlcyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTYwLDcgKzEwODMsNyBAQAogCiAJaWYgKCFidWZmZXIpIHsKIAkJLyogVGhpcyBtYWtlcyB0aGUgYnVmZmVyIGJlIGZyZWVkIGJ5IHN3c3VzcF9mcmVlKCkgKi8KLQkJYnVmZmVyID0gYWxsb2NfaW1hZ2VfcGFnZShHRlBfQVRPTUlDLCBQR19BTlkpOworCQlidWZmZXIgPSBnZXRfaW1hZ2VfcGFnZShHRlBfQVRPTUlDLCBQR19BTlkpOwogCQlpZiAoIWJ1ZmZlcikKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTk3NSw5ICsxMDk4LDIzIEBACiAJCQltZW1zZXQoYnVmZmVyLCAwLCBQQUdFX1NJWkUpOwogCQkJcGFja19wZm5zKGJ1ZmZlciwgJm9yaWdfYm0pOwogCQl9IGVsc2UgewotCQkJdW5zaWduZWQgbG9uZyBwZm4gPSBtZW1vcnlfYm1fbmV4dF9wZm4oJmNvcHlfYm0pOworCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQkJCWhhbmRsZS0+YnVmZmVyID0gcGFnZV9hZGRyZXNzKHBmbl90b19wYWdlKHBmbikpOworCQkJcGFnZSA9IHBmbl90b19wYWdlKG1lbW9yeV9ibV9uZXh0X3BmbigmY29weV9ibSkpOworCQkJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCQkJLyogSGlnaG1lbSBwYWdlcyBhcmUgY29waWVkIHRvIHRoZSBidWZmZXIsCisJCQkJICogYmVjYXVzZSB3ZSBjYW4ndCByZXR1cm4gd2l0aCBhIGttYXBwZWQKKwkJCQkgKiBoaWdobWVtIHBhZ2UgKHdlIG1heSBub3QgYmUgY2FsbGVkIGFnYWluKS4KKwkJCQkgKi8KKwkJCQl2b2lkICprYWRkcjsKKworCQkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJCW1lbWNweShidWZmZXIsIGthZGRyLCBQQUdFX1NJWkUpOworCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQloYW5kbGUtPmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJCX0gZWxzZSB7CisJCQkJaGFuZGxlLT5idWZmZXIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCQl9CiAJCX0KIAkJaGFuZGxlLT5wcmV2ID0gaGFuZGxlLT5jdXI7CiAJfQpAQCAtMTAwNSw3ICsxMTQyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHBmbiwgbWF4X3pvbmVfcGZuOwogCiAJLyogQ2xlYXIgcGFnZSBmbGFncyAqLwotCWZvcl9lYWNoX3pvbmUgKHpvbmUpIHsKKwlmb3JfZWFjaF96b25lKHpvbmUpIHsKIAkJbWF4X3pvbmVfcGZuID0gem9uZS0+em9uZV9zdGFydF9wZm4gKyB6b25lLT5zcGFubmVkX3BhZ2VzOwogCQlmb3IgKHBmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuOyBwZm4gPCBtYXhfem9uZV9wZm47IHBmbisrKQogCQkJaWYgKHBmbl92YWxpZChwZm4pKQpAQCAtMTEwMSw2ICsxMjM4LDIxOCBAQAogCX0KIH0KIAorLyogTGlzdCBvZiAic2FmZSIgcGFnZXMgdGhhdCBtYXkgYmUgdXNlZCB0byBzdG9yZSBkYXRhIGxvYWRlZCBmcm9tIHRoZSBzdXNwZW5kCisgKiBpbWFnZQorICovCitzdGF0aWMgc3RydWN0IGxpbmtlZF9wYWdlICpzYWZlX3BhZ2VzX2xpc3Q7CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorLyogc3RydWN0IGhpZ2htZW1fcGJlIGlzIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBsaXN0IG9mIGhpZ2htZW0gcGFnZXMgdGhhdAorICogc2hvdWxkIGJlIHJlc3RvcmVkIGF0b21pY2FsbHkgZHVyaW5nIHRoZSByZXN1bWUgZnJvbSBkaXNrLCBiZWNhdXNlIHRoZSBwYWdlCisgKiBmcmFtZXMgdGhleSBoYXZlIG9jY3VwaWVkIGJlZm9yZSB0aGUgc3VzcGVuZCBhcmUgaW4gdXNlLgorICovCitzdHJ1Y3QgaGlnaG1lbV9wYmUgeworCXN0cnVjdCBwYWdlICpjb3B5X3BhZ2U7CS8qIGRhdGEgaXMgaGVyZSBub3cgKi8KKwlzdHJ1Y3QgcGFnZSAqb3JpZ19wYWdlOwkvKiBkYXRhIHdhcyBoZXJlIGJlZm9yZSB0aGUgc3VzcGVuZCAqLworCXN0cnVjdCBoaWdobWVtX3BiZSAqbmV4dDsKK307CisKKy8qIExpc3Qgb2YgaGlnaG1lbSBQQkVzIG5lZWRlZCBmb3IgcmVzdG9yaW5nIHRoZSBoaWdobWVtIHBhZ2VzIHRoYXQgd2VyZQorICogYWxsb2NhdGVkIGJlZm9yZSB0aGUgc3VzcGVuZCBhbmQgaW5jbHVkZWQgaW4gdGhlIHN1c3BlbmQgaW1hZ2UsIGJ1dCBoYXZlCisgKiBhbHNvIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSAicmVzdW1lIiBrZXJuZWwsIHNvIHRoZWlyIGNvbnRlbnRzIGNhbm5vdCBiZQorICogd3JpdHRlbiBkaXJlY3RseSB0byB0aGVpciAib3JpZ2luYWwiIHBhZ2UgZnJhbWVzLgorICovCitzdGF0aWMgc3RydWN0IGhpZ2htZW1fcGJlICpoaWdobWVtX3BibGlzdDsKKworLyoqCisgKgljb3VudF9oaWdobWVtX2ltYWdlX3BhZ2VzIC0gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGhpZ2htZW0gcGFnZXMgaW4gdGhlCisgKglzdXNwZW5kIGltYWdlLiAgVGhlIGJpdHMgaW4gdGhlIG1lbW9yeSBiaXRtYXAgQGJtIHRoYXQgY29ycmVzcG9uZCB0byB0aGUKKyAqCWltYWdlIHBhZ2VzIGFyZSBhc3N1bWVkIHRvIGJlIHNldC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50X2hpZ2htZW1faW1hZ2VfcGFnZXMoc3RydWN0IG1lbW9yeV9iaXRtYXAgKmJtKQoreworCXVuc2lnbmVkIGxvbmcgcGZuOworCXVuc2lnbmVkIGludCBjbnQgPSAwOworCisJbWVtb3J5X2JtX3Bvc2l0aW9uX3Jlc2V0KGJtKTsKKwlwZm4gPSBtZW1vcnlfYm1fbmV4dF9wZm4oYm0pOworCXdoaWxlIChwZm4gIT0gQk1fRU5EX09GX01BUCkgeworCQlpZiAoUGFnZUhpZ2hNZW0ocGZuX3RvX3BhZ2UocGZuKSkpCisJCQljbnQrKzsKKworCQlwZm4gPSBtZW1vcnlfYm1fbmV4dF9wZm4oYm0pOworCX0KKwlyZXR1cm4gY250OworfQorCisvKioKKyAqCXByZXBhcmVfaGlnaG1lbV9pbWFnZSAtIHRyeSB0byBhbGxvY2F0ZSBhcyBtYW55IGhpZ2htZW0gcGFnZXMgYXMKKyAqCXRoZXJlIGFyZSBoaWdobWVtIGltYWdlIHBhZ2VzIChAbnJfaGlnaG1lbV9wIHBvaW50cyB0byB0aGUgdmFyaWFibGUKKyAqCWNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBoaWdobWVtIGltYWdlIHBhZ2VzKS4gIFRoZSBwYWdlcyB0aGF0IGFyZQorICoJInNhZmUiIChpZS4gd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc3VzcGVuZCBpbWFnZSBpcworICoJcmVzdG9yZWQpIGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcgYml0cyBzZXQgaW4gQGJtIChpdCBtdXN0IGJlCisgKgl1bml0aWFsaXplZCkuCisgKgorICoJTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBpZiB0aGVyZSBhcmUgbm8gaGlnaG1lbQorICoJaW1hZ2UgcGFnZXMuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBzYWZlX2hpZ2htZW1fcGFnZXM7CisKK3N0YXRpYyBzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqc2FmZV9oaWdobWVtX2JtOworCitzdGF0aWMgaW50CitwcmVwYXJlX2hpZ2htZW1faW1hZ2Uoc3RydWN0IG1lbW9yeV9iaXRtYXAgKmJtLCB1bnNpZ25lZCBpbnQgKm5yX2hpZ2htZW1fcCkKK3sKKwl1bnNpZ25lZCBpbnQgdG9fYWxsb2M7CisKKwlpZiAobWVtb3J5X2JtX2NyZWF0ZShibSwgR0ZQX0FUT01JQywgUEdfU0FGRSkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGdldF9oaWdobWVtX2J1ZmZlcihQR19TQUZFKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0b19hbGxvYyA9IGNvdW50X2ZyZWVfaGlnaG1lbV9wYWdlcygpOworCWlmICh0b19hbGxvYyA+ICpucl9oaWdobWVtX3ApCisJCXRvX2FsbG9jID0gKm5yX2hpZ2htZW1fcDsKKwllbHNlCisJCSpucl9oaWdobWVtX3AgPSB0b19hbGxvYzsKKworCXNhZmVfaGlnaG1lbV9wYWdlcyA9IDA7CisJd2hpbGUgKHRvX2FsbG9jLS0gPiAwKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCXBhZ2UgPSBhbGxvY19wYWdlKF9fR0ZQX0hJR0hNRU0pOworCQlpZiAoIVBhZ2VOb3NhdmVGcmVlKHBhZ2UpKSB7CisJCQkvKiBUaGUgcGFnZSBpcyAic2FmZSIsIHNldCBpdHMgYml0IHRoZSBiaXRtYXAgKi8KKwkJCW1lbW9yeV9ibV9zZXRfYml0KGJtLCBwYWdlX3RvX3BmbihwYWdlKSk7CisJCQlzYWZlX2hpZ2htZW1fcGFnZXMrKzsKKwkJfQorCQkvKiBNYXJrIHRoZSBwYWdlIGFzIGFsbG9jYXRlZCAqLworCQlTZXRQYWdlTm9zYXZlKHBhZ2UpOworCQlTZXRQYWdlTm9zYXZlRnJlZShwYWdlKTsKKwl9CisJbWVtb3J5X2JtX3Bvc2l0aW9uX3Jlc2V0KGJtKTsKKwlzYWZlX2hpZ2htZW1fYm0gPSBibTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglnZXRfaGlnaG1lbV9wYWdlX2J1ZmZlciAtIGZvciBnaXZlbiBoaWdobWVtIGltYWdlIHBhZ2UgZmluZCB0aGUgYnVmZmVyCisgKgl0aGF0IHN1c3BlbmRfd3JpdGVfbmV4dCgpIHNob3VsZCBzZXQgZm9yIGl0cyBjYWxsZXIgdG8gd3JpdGUgdG8uCisgKgorICoJSWYgdGhlIHBhZ2UgaXMgdG8gYmUgc2F2ZWQgdG8gaXRzICJvcmlnaW5hbCIgcGFnZSBmcmFtZSBvciBhIGNvcHkgb2YKKyAqCXRoZSBwYWdlIGlzIHRvIGJlIG1hZGUgaW4gdGhlIGhpZ2htZW0sIEBidWZmZXIgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsCisgKgl0aGUgY29weSBvZiB0aGUgcGFnZSBpcyB0byBiZSBtYWRlIGluIG5vcm1hbCBtZW1vcnksIHNvIHRoZSBhZGRyZXNzIG9mCisgKgl0aGUgY29weSBpcyByZXR1cm5lZC4KKyAqCisgKglJZiBAYnVmZmVyIGlzIHJldHVybmVkLCB0aGUgY2FsbGVyIG9mIHN1c3BlbmRfd3JpdGVfbmV4dCgpIHdpbGwgd3JpdGUKKyAqCXRoZSBwYWdlJ3MgY29udGVudHMgdG8gQGJ1ZmZlciwgc28gdGhleSB3aWxsIGhhdmUgdG8gYmUgY29waWVkIHRvIHRoZQorICoJcmlnaHQgbG9jYXRpb24gb24gdGhlIG5leHQgY2FsbCB0byBzdXNwZW5kX3dyaXRlX25leHQoKSBhbmQgaXQgaXMgZG9uZQorICoJd2l0aCB0aGUgaGVscCBvZiBjb3B5X2xhc3RfaGlnaG1lbV9wYWdlKCkuICBGb3IgdGhpcyBwdXJwb3NlLCBpZgorICoJQGJ1ZmZlciBpcyByZXR1cm5lZCwgQGxhc3RfaGlnaG1lbSBwYWdlIGlzIHNldCB0byB0aGUgcGFnZSB0byB3aGljaAorICoJdGhlIGRhdGEgd2lsbCBoYXZlIHRvIGJlIGNvcGllZCBmcm9tIEBidWZmZXIuCisgKi8KKworc3RhdGljIHN0cnVjdCBwYWdlICpsYXN0X2hpZ2htZW1fcGFnZTsKKworc3RhdGljIHZvaWQgKgorZ2V0X2hpZ2htZW1fcGFnZV9idWZmZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBjaGFpbl9hbGxvY2F0b3IgKmNhKQoreworCXN0cnVjdCBoaWdobWVtX3BiZSAqcGJlOworCXZvaWQgKmthZGRyOworCisJaWYgKFBhZ2VOb3NhdmUocGFnZSkgJiYgUGFnZU5vc2F2ZUZyZWUocGFnZSkpIHsKKwkJLyogV2UgaGF2ZSBhbGxvY2F0ZWQgdGhlICJvcmlnaW5hbCIgcGFnZSBmcmFtZSBhbmQgd2UgY2FuCisJCSAqIHVzZSBpdCBkaXJlY3RseSB0byBzdG9yZSB0aGUgbG9hZGVkIHBhZ2UuCisJCSAqLworCQlsYXN0X2hpZ2htZW1fcGFnZSA9IHBhZ2U7CisJCXJldHVybiBidWZmZXI7CisJfQorCS8qIFRoZSAib3JpZ2luYWwiIHBhZ2UgZnJhbWUgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCBhbmQgd2UgaGF2ZSB0bworCSAqIHVzZSBhICJzYWZlIiBwYWdlIGZyYW1lIHRvIHN0b3JlIHRoZSBsb2FkZWQgcGFnZS4KKwkgKi8KKwlwYmUgPSBjaGFpbl9hbGxvYyhjYSwgc2l6ZW9mKHN0cnVjdCBoaWdobWVtX3BiZSkpOworCWlmICghcGJlKSB7CisJCXN3c3VzcF9mcmVlKCk7CisJCXJldHVybiBOVUxMOworCX0KKwlwYmUtPm9yaWdfcGFnZSA9IHBhZ2U7CisJaWYgKHNhZmVfaGlnaG1lbV9wYWdlcyA+IDApIHsKKwkJc3RydWN0IHBhZ2UgKnRtcDsKKworCQkvKiBDb3B5IG9mIHRoZSBwYWdlIHdpbGwgYmUgc3RvcmVkIGluIGhpZ2ggbWVtb3J5ICovCisJCWthZGRyID0gYnVmZmVyOworCQl0bXAgPSBwZm5fdG9fcGFnZShtZW1vcnlfYm1fbmV4dF9wZm4oc2FmZV9oaWdobWVtX2JtKSk7CisJCXNhZmVfaGlnaG1lbV9wYWdlcy0tOworCQlsYXN0X2hpZ2htZW1fcGFnZSA9IHRtcDsKKwkJcGJlLT5jb3B5X3BhZ2UgPSB0bXA7CisJfSBlbHNlIHsKKwkJLyogQ29weSBvZiB0aGUgcGFnZSB3aWxsIGJlIHN0b3JlZCBpbiBub3JtYWwgbWVtb3J5ICovCisJCWthZGRyID0gc2FmZV9wYWdlc19saXN0OworCQlzYWZlX3BhZ2VzX2xpc3QgPSBzYWZlX3BhZ2VzX2xpc3QtPm5leHQ7CisJCXBiZS0+Y29weV9wYWdlID0gdmlydF90b19wYWdlKGthZGRyKTsKKwl9CisJcGJlLT5uZXh0ID0gaGlnaG1lbV9wYmxpc3Q7CisJaGlnaG1lbV9wYmxpc3QgPSBwYmU7CisJcmV0dXJuIGthZGRyOworfQorCisvKioKKyAqCWNvcHlfbGFzdF9oaWdobWVtX3BhZ2UgLSBjb3B5IHRoZSBjb250ZW50cyBvZiBhIGhpZ2htZW0gaW1hZ2UgZnJvbQorICoJQGJ1ZmZlciwgd2hlcmUgdGhlIGNhbGxlciBvZiBzbmFwc2hvdF93cml0ZV9uZXh0KCkgaGFzIHBsYWNlIHRoZW0sCisgKgl0byB0aGUgcmlnaHQgbG9jYXRpb24gcmVwcmVzZW50ZWQgYnkgQGxhc3RfaGlnaG1lbV9wYWdlIC4KKyAqLworCitzdGF0aWMgdm9pZCBjb3B5X2xhc3RfaGlnaG1lbV9wYWdlKHZvaWQpCit7CisJaWYgKGxhc3RfaGlnaG1lbV9wYWdlKSB7CisJCXZvaWQgKmRzdDsKKworCQlkc3QgPSBrbWFwX2F0b21pYyhsYXN0X2hpZ2htZW1fcGFnZSwgS01fVVNFUjApOworCQltZW1jcHkoZHN0LCBidWZmZXIsIFBBR0VfU0laRSk7CisJCWt1bm1hcF9hdG9taWMoZHN0LCBLTV9VU0VSMCk7CisJCWxhc3RfaGlnaG1lbV9wYWdlID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxhc3RfaGlnaG1lbV9wYWdlX2NvcGllZCh2b2lkKQoreworCXJldHVybiAhbGFzdF9oaWdobWVtX3BhZ2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2hpZ2htZW1fZGF0YSh2b2lkKQoreworCWlmIChzYWZlX2hpZ2htZW1fYm0pCisJCW1lbW9yeV9ibV9mcmVlKHNhZmVfaGlnaG1lbV9ibSwgUEdfVU5TQUZFX0NMRUFSKTsKKworCWlmIChidWZmZXIpCisJCWZyZWVfaW1hZ2VfcGFnZShidWZmZXIsIFBHX1VOU0FGRV9DTEVBUik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZ2V0X3NhZmVfd3JpdGVfYnVmZmVyKHZvaWQpIHsgcmV0dXJuIDA7IH0KKworc3RhdGljIHVuc2lnbmVkIGludAorY291bnRfaGlnaG1lbV9pbWFnZV9wYWdlcyhzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0pIHsgcmV0dXJuIDA7IH0KKworc3RhdGljIGlubGluZSBpbnQKK3ByZXBhcmVfaGlnaG1lbV9pbWFnZShzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0sIHVuc2lnbmVkIGludCAqbnJfaGlnaG1lbV9wKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorZ2V0X2hpZ2htZW1fcGFnZV9idWZmZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBjaGFpbl9hbGxvY2F0b3IgKmNhKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9sYXN0X2hpZ2htZW1fcGFnZSh2b2lkKSB7fQorc3RhdGljIGlubGluZSBpbnQgbGFzdF9oaWdobWVtX3BhZ2VfY29waWVkKHZvaWQpIHsgcmV0dXJuIDE7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2hpZ2htZW1fZGF0YSh2b2lkKSB7fQorI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCisKIC8qKgogICoJcHJlcGFyZV9pbWFnZSAtIHVzZSB0aGUgbWVtb3J5IGJpdG1hcCBAYm0gdG8gbWFyayB0aGUgcGFnZXMgdGhhdCB3aWxsCiAgKgliZSBvdmVyd3JpdHRlbiBpbiB0aGUgcHJvY2VzcyBvZiByZXN0b3JpbmcgdGhlIHN5c3RlbSBtZW1vcnkgc3RhdGUKQEAgLTExMTAsMjAgKzE0NTksMjUgQEAKICAqCVRoZSBpZGVhIGlzIHRvIGFsbG9jYXRlIGEgbmV3IG1lbW9yeSBiaXRtYXAgZmlyc3QgYW5kIHRoZW4gYWxsb2NhdGUKICAqCWFzIG1hbnkgcGFnZXMgYXMgbmVlZGVkIGZvciB0aGUgaW1hZ2UgZGF0YSwgYnV0IG5vdCB0byBhc3NpZ24gdGhlc2UKICAqCXBhZ2VzIHRvIHNwZWNpZmljIHRhc2tzIGluaXRpYWxseS4gIEluc3RlYWQsIHdlIGp1c3QgbWFyayB0aGVtIGFzCi0gKglhbGxvY2F0ZWQgYW5kIGNyZWF0ZSBhIGxpc3Qgb2YgInNhZmUiIHBhZ2VzIHRoYXQgd2lsbCBiZSB1c2VkIGxhdGVyLgorICoJYWxsb2NhdGVkIGFuZCBjcmVhdGUgYSBsaXN0cyBvZiAic2FmZSIgcGFnZXMgdGhhdCB3aWxsIGJlIHVzZWQKKyAqCWxhdGVyLiAgT24gc3lzdGVtcyB3aXRoIGhpZ2ggbWVtb3J5IGEgbGlzdCBvZiAic2FmZSIgaGlnaG1lbSBwYWdlcyBpcworICoJYWxzbyBjcmVhdGVkLgogICovCiAKICNkZWZpbmUgUEJFU19QRVJfTElOS0VEX1BBR0UJKExJTktFRF9QQUdFX0RBVEFfU0laRSAvIHNpemVvZihzdHJ1Y3QgcGJlKSkKIAotc3RhdGljIHN0cnVjdCBsaW5rZWRfcGFnZSAqc2FmZV9wYWdlc19saXN0OwotCiBzdGF0aWMgaW50CiBwcmVwYXJlX2ltYWdlKHN0cnVjdCBtZW1vcnlfYml0bWFwICpuZXdfYm0sIHN0cnVjdCBtZW1vcnlfYml0bWFwICpibSkKIHsKLQl1bnNpZ25lZCBpbnQgbnJfcGFnZXM7CisJdW5zaWduZWQgaW50IG5yX3BhZ2VzLCBucl9oaWdobWVtOwogCXN0cnVjdCBsaW5rZWRfcGFnZSAqc3BfbGlzdCwgKmxwOwogCWludCBlcnJvcjsKIAorCS8qIElmIHRoZXJlIGlzIG5vIGhpZ2htZW0sIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgbmVjZXNzYXJ5ICovCisJZnJlZV9pbWFnZV9wYWdlKGJ1ZmZlciwgUEdfVU5TQUZFX0NMRUFSKTsKKwlidWZmZXIgPSBOVUxMOworCisJbnJfaGlnaG1lbSA9IGNvdW50X2hpZ2htZW1faW1hZ2VfcGFnZXMoYm0pOwogCWVycm9yID0gbWFya191bnNhZmVfcGFnZXMoYm0pOwogCWlmIChlcnJvcikKIAkJZ290byBGcmVlOwpAQCAtMTEzNCw2ICsxNDg4LDExIEBACiAKIAlkdXBsaWNhdGVfbWVtb3J5X2JpdG1hcChuZXdfYm0sIGJtKTsKIAltZW1vcnlfYm1fZnJlZShibSwgUEdfVU5TQUZFX0tFRVApOworCWlmIChucl9oaWdobWVtID4gMCkgeworCQllcnJvciA9IHByZXBhcmVfaGlnaG1lbV9pbWFnZShibSwgJm5yX2hpZ2htZW0pOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIEZyZWU7CisJfQogCS8qIFJlc2VydmUgc29tZSBzYWZlIHBhZ2VzIGZvciBwb3RlbnRpYWwgbGF0ZXIgdXNlLgogCSAqCiAJICogTk9URTogVGhpcyB3YXkgd2UgbWFrZSBzdXJlIHRoZXJlIHdpbGwgYmUgZW5vdWdoIHNhZmUgcGFnZXMgZm9yIHRoZQpAQCAtMTE0MiwxMCArMTUwMSwxMCBAQAogCSAqLwogCXNwX2xpc3QgPSBOVUxMOwogCS8qIG5yX2NvcHlfcGFnZXMgY2Fubm90IGJlIGxlc3NlciB0aGFuIGFsbG9jYXRlZF91bnNhZmVfcGFnZXMgKi8KLQlucl9wYWdlcyA9IG5yX2NvcHlfcGFnZXMgLSBhbGxvY2F0ZWRfdW5zYWZlX3BhZ2VzOworCW5yX3BhZ2VzID0gbnJfY29weV9wYWdlcyAtIG5yX2hpZ2htZW0gLSBhbGxvY2F0ZWRfdW5zYWZlX3BhZ2VzOwogCW5yX3BhZ2VzID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBQQkVTX1BFUl9MSU5LRURfUEFHRSk7CiAJd2hpbGUgKG5yX3BhZ2VzID4gMCkgewotCQlscCA9IGFsbG9jX2ltYWdlX3BhZ2UoR0ZQX0FUT01JQywgUEdfU0FGRSk7CisJCWxwID0gZ2V0X2ltYWdlX3BhZ2UoR0ZQX0FUT01JQywgUEdfU0FGRSk7CiAJCWlmICghbHApIHsKIAkJCWVycm9yID0gLUVOT01FTTsKIAkJCWdvdG8gRnJlZTsKQEAgLTExNTYsNyArMTUxNSw3IEBACiAJfQogCS8qIFByZWFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGltYWdlICovCiAJc2FmZV9wYWdlc19saXN0ID0gTlVMTDsKLQlucl9wYWdlcyA9IG5yX2NvcHlfcGFnZXMgLSBhbGxvY2F0ZWRfdW5zYWZlX3BhZ2VzOworCW5yX3BhZ2VzID0gbnJfY29weV9wYWdlcyAtIG5yX2hpZ2htZW0gLSBhbGxvY2F0ZWRfdW5zYWZlX3BhZ2VzOwogCXdoaWxlIChucl9wYWdlcyA+IDApIHsKIAkJbHAgPSAoc3RydWN0IGxpbmtlZF9wYWdlICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwogCQlpZiAoIWxwKSB7CkBAIC0xMTgxLDcgKzE1NDAsNyBAQAogCX0KIAlyZXR1cm4gMDsKIAotRnJlZToKKyBGcmVlOgogCXN3c3VzcF9mcmVlKCk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTE5Niw2ICsxNTU1LDkgQEAKIAlzdHJ1Y3QgcGJlICpwYmU7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShtZW1vcnlfYm1fbmV4dF9wZm4oYm0pKTsKIAorCWlmIChQYWdlSGlnaE1lbShwYWdlKSkKKwkJcmV0dXJuIGdldF9oaWdobWVtX3BhZ2VfYnVmZmVyKHBhZ2UsIGNhKTsKKwogCWlmIChQYWdlTm9zYXZlKHBhZ2UpICYmIFBhZ2VOb3NhdmVGcmVlKHBhZ2UpKQogCQkvKiBXZSBoYXZlIGFsbG9jYXRlZCB0aGUgIm9yaWdpbmFsIiBwYWdlIGZyYW1lIGFuZCB3ZSBjYW4KIAkJICogdXNlIGl0IGRpcmVjdGx5IHRvIHN0b3JlIHRoZSBsb2FkZWQgcGFnZS4KQEAgLTEyMTAsMTIgKzE1NzIsMTIgQEAKIAkJc3dzdXNwX2ZyZWUoKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXBiZS0+b3JpZ19hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpOwotCXBiZS0+YWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXNhZmVfcGFnZXNfbGlzdDsKKwlwYmUtPm9yaWdfYWRkcmVzcyA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlwYmUtPmFkZHJlc3MgPSBzYWZlX3BhZ2VzX2xpc3Q7CiAJc2FmZV9wYWdlc19saXN0ID0gc2FmZV9wYWdlc19saXN0LT5uZXh0OwogCXBiZS0+bmV4dCA9IHJlc3RvcmVfcGJsaXN0OwogCXJlc3RvcmVfcGJsaXN0ID0gcGJlOwotCXJldHVybiAodm9pZCAqKXBiZS0+YWRkcmVzczsKKwlyZXR1cm4gcGJlLT5hZGRyZXNzOwogfQogCiAvKioKQEAgLTEyNDksMTQgKzE2MTEsMTYgQEAKIAlpZiAoaGFuZGxlLT5wcmV2ICYmIGhhbmRsZS0+Y3VyID4gbnJfbWV0YV9wYWdlcyArIG5yX2NvcHlfcGFnZXMpCiAJCXJldHVybiAwOwogCi0JaWYgKCFidWZmZXIpIHsKLQkJLyogVGhpcyBtYWtlcyB0aGUgYnVmZmVyIGJlIGZyZWVkIGJ5IHN3c3VzcF9mcmVlKCkgKi8KLQkJYnVmZmVyID0gYWxsb2NfaW1hZ2VfcGFnZShHRlBfQVRPTUlDLCBQR19BTlkpOworCWlmIChoYW5kbGUtPm9mZnNldCA9PSAwKSB7CisJCWlmICghYnVmZmVyKQorCQkJLyogVGhpcyBtYWtlcyB0aGUgYnVmZmVyIGJlIGZyZWVkIGJ5IHN3c3VzcF9mcmVlKCkgKi8KKwkJCWJ1ZmZlciA9IGdldF9pbWFnZV9wYWdlKEdGUF9BVE9NSUMsIFBHX0FOWSk7CisKIAkJaWYgKCFidWZmZXIpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JaWYgKCFoYW5kbGUtPm9mZnNldCkKKwogCQloYW5kbGUtPmJ1ZmZlciA9IGJ1ZmZlcjsKKwl9CiAJaGFuZGxlLT5zeW5jX3JlYWQgPSAxOwogCWlmIChoYW5kbGUtPnByZXYgPCBoYW5kbGUtPmN1cikgewogCQlpZiAoaGFuZGxlLT5wcmV2ID09IDApIHsKQEAgLTEyODQsOCArMTY0OCwxMCBAQAogCQkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJfSBlbHNlIHsKKwkJCWNvcHlfbGFzdF9oaWdobWVtX3BhZ2UoKTsKIAkJCWhhbmRsZS0+YnVmZmVyID0gZ2V0X2J1ZmZlcigmb3JpZ19ibSwgJmNhKTsKLQkJCWhhbmRsZS0+c3luY19yZWFkID0gMDsKKwkJCWlmIChoYW5kbGUtPmJ1ZmZlciAhPSBidWZmZXIpCisJCQkJaGFuZGxlLT5zeW5jX3JlYWQgPSAwOwogCQl9CiAJCWhhbmRsZS0+cHJldiA9IGhhbmRsZS0+Y3VyOwogCX0KQEAgLTEzMDEsMTUgKzE2NjcsNzMgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKKy8qKgorICoJc25hcHNob3Rfd3JpdGVfZmluYWxpemUgLSBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCBjYWxsIHRvCisgKglzbmFwc2hvdF93cml0ZV9uZXh0KCkgaW4gY2FzZSB0aGUgbGFzdCBwYWdlIGluIHRoZSBpbWFnZSBoYXBwZW5zCisgKgl0byBiZSBhIGhpZ2htZW0gcGFnZSBhbmQgaXRzIGNvbnRlbnRzIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlCisgKgloaWdobWVtLiAgQWRkaXRpb25hbGx5LCBpdCByZWxlYXNlcyB0aGUgbWVtb3J5IHRoYXQgd2lsbCBub3QgYmUKKyAqCXVzZWQgYW55IG1vcmUuCisgKi8KKwordm9pZCBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZShzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpCit7CisJY29weV9sYXN0X2hpZ2htZW1fcGFnZSgpOworCS8qIEZyZWUgb25seSBpZiB3ZSBoYXZlIGxvYWRlZCB0aGUgaW1hZ2UgZW50aXJlbHkgKi8KKwlpZiAoaGFuZGxlLT5wcmV2ICYmIGhhbmRsZS0+Y3VyID4gbnJfbWV0YV9wYWdlcyArIG5yX2NvcHlfcGFnZXMpIHsKKwkJbWVtb3J5X2JtX2ZyZWUoJm9yaWdfYm0sIFBHX1VOU0FGRV9DTEVBUik7CisJCWZyZWVfaGlnaG1lbV9kYXRhKCk7CisJfQorfQorCiBpbnQgc25hcHNob3RfaW1hZ2VfbG9hZGVkKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSkKIHsKLQlyZXR1cm4gISghbnJfY29weV9wYWdlcyB8fAorCXJldHVybiAhKCFucl9jb3B5X3BhZ2VzIHx8ICFsYXN0X2hpZ2htZW1fcGFnZV9jb3BpZWQoKSB8fAogCQkJaGFuZGxlLT5jdXIgPD0gbnJfbWV0YV9wYWdlcyArIG5yX2NvcHlfcGFnZXMpOwogfQogCi12b2lkIHNuYXBzaG90X2ZyZWVfdW51c2VkX21lbW9yeShzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKy8qIEFzc3VtZXMgdGhhdCBAYnVmIGlzIHJlYWR5IGFuZCBwb2ludHMgdG8gYSAic2FmZSIgcGFnZSAqLworc3RhdGljIGlubGluZSB2b2lkCitzd2FwX3R3b19wYWdlc19kYXRhKHN0cnVjdCBwYWdlICpwMSwgc3RydWN0IHBhZ2UgKnAyLCB2b2lkICpidWYpCiB7Ci0JLyogRnJlZSBvbmx5IGlmIHdlIGhhdmUgbG9hZGVkIHRoZSBpbWFnZSBlbnRpcmVseSAqLwotCWlmIChoYW5kbGUtPnByZXYgJiYgaGFuZGxlLT5jdXIgPiBucl9tZXRhX3BhZ2VzICsgbnJfY29weV9wYWdlcykKLQkJbWVtb3J5X2JtX2ZyZWUoJm9yaWdfYm0sIFBHX1VOU0FGRV9DTEVBUik7CisJdm9pZCAqa2FkZHIxLCAqa2FkZHIyOworCisJa2FkZHIxID0ga21hcF9hdG9taWMocDEsIEtNX1VTRVIwKTsKKwlrYWRkcjIgPSBrbWFwX2F0b21pYyhwMiwgS01fVVNFUjEpOworCW1lbWNweShidWYsIGthZGRyMSwgUEFHRV9TSVpFKTsKKwltZW1jcHkoa2FkZHIxLCBrYWRkcjIsIFBBR0VfU0laRSk7CisJbWVtY3B5KGthZGRyMiwgYnVmLCBQQUdFX1NJWkUpOworCWt1bm1hcF9hdG9taWMoa2FkZHIxLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhrYWRkcjIsIEtNX1VTRVIxKTsKIH0KKworLyoqCisgKglyZXN0b3JlX2hpZ2htZW0gLSBmb3IgZWFjaCBoaWdobWVtIHBhZ2UgdGhhdCB3YXMgYWxsb2NhdGVkIGJlZm9yZQorICoJdGhlIHN1c3BlbmQgYW5kIGluY2x1ZGVkIGluIHRoZSBzdXNwZW5kIGltYWdlLCBhbmQgYWxzbyBoYXMgYmVlbgorICoJYWxsb2NhdGVkIGJ5IHRoZSAicmVzdW1lIiBrZXJuZWwgc3dhcCBpdHMgY3VycmVudCAoaWUuICJiZWZvcmUKKyAqCXJlc3VtZSIpIGNvbnRlbnRzIHdpdGggdGhlIHByZXZpb3VzIChpZS4gImJlZm9yZSBzdXNwZW5kIikgb25lLgorICoKKyAqCUlmIHRoZSByZXN1bWUgZXZlbnR1YWxseSBmYWlscywgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBvbmNlCisgKglhZ2FpbiBhbmQgcmVzdG9yZSB0aGUgImJlZm9yZSByZXN1bWUiIGhpZ2htZW0gc3RhdGUuCisgKi8KKworaW50IHJlc3RvcmVfaGlnaG1lbSh2b2lkKQoreworCXN0cnVjdCBoaWdobWVtX3BiZSAqcGJlID0gaGlnaG1lbV9wYmxpc3Q7CisJdm9pZCAqYnVmOworCisJaWYgKCFwYmUpCisJCXJldHVybiAwOworCisJYnVmID0gZ2V0X2ltYWdlX3BhZ2UoR0ZQX0FUT01JQywgUEdfU0FGRSk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJd2hpbGUgKHBiZSkgeworCQlzd2FwX3R3b19wYWdlc19kYXRhKHBiZS0+Y29weV9wYWdlLCBwYmUtPm9yaWdfcGFnZSwgYnVmKTsKKwkJcGJlID0gcGJlLT5uZXh0OworCX0KKwlmcmVlX2ltYWdlX3BhZ2UoYnVmLCBQR19VTlNBRkVfQ0xFQVIpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3dhcC5jIGIva2VybmVsL3Bvd2VyL3N3YXAuYwppbmRleCA5YjJlZTUzLi5mMTMzZDRhIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3dhcC5jCisrKyBiL2tlcm5lbC9wb3dlci9zd2FwLmMKQEAgLTM0LDE3NyArMzQsNzcgQEAKICNkZWZpbmUgU1dTVVNQX1NJRwkiUzFTVVNQRU5EIgogCiBzdGF0aWMgc3RydWN0IHN3c3VzcF9oZWFkZXIgewotCWNoYXIgcmVzZXJ2ZWRbUEFHRV9TSVpFIC0gMjAgLSBzaXplb2Yoc3dwX2VudHJ5X3QpXTsKLQlzd3BfZW50cnlfdCBpbWFnZTsKKwljaGFyIHJlc2VydmVkW1BBR0VfU0laRSAtIDIwIC0gc2l6ZW9mKHNlY3Rvcl90KV07CisJc2VjdG9yX3QgaW1hZ2U7CiAJY2hhcglvcmlnX3NpZ1sxMF07CiAJY2hhcglzaWdbMTBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoUEFHRV9TSVpFKSkpIHN3c3VzcF9oZWFkZXI7CiAKIC8qCi0gKiBTYXZpbmcgcGFydC4uLgorICogR2VuZXJhbCB0aGluZ3MKICAqLwogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgcm9vdF9zd2FwID0gMHhmZmZmOworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKnJlc3VtZV9iZGV2OwogCi1zdGF0aWMgaW50IG1hcmtfc3dhcGZpbGVzKHN3cF9lbnRyeV90IHN0YXJ0KQorLyoqCisgKglzdWJtaXQgLSBzdWJtaXQgQklPIHJlcXVlc3QuCisgKglAcnc6CVJFQUQgb3IgV1JJVEUuCisgKglAb2ZmCXBoeXNpY2FsIG9mZnNldCBvZiBwYWdlLgorICoJQHBhZ2U6CXBhZ2Ugd2UncmUgcmVhZGluZyBvciB3cml0aW5nLgorICoJQGJpb19jaGFpbjogbGlzdCBvZiBwZW5kaW5nIGJpb2QgKGZvciBhc3luYyByZWFkaW5nKQorICoKKyAqCVN0cmFpZ2h0IGZyb20gdGhlIHRleHRib29rIC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGJpby4KKyAqCUlmIHdlJ3JlIHJlYWRpbmcsIG1ha2Ugc3VyZSB0aGUgcGFnZSBpcyBtYXJrZWQgYXMgZGlydHkuCisgKglUaGVuIHN1Ym1pdCBpdCBhbmQsIGlmIEBiaW9fY2hhaW4gPT0gTlVMTCwgd2FpdC4KKyAqLworc3RhdGljIGludCBzdWJtaXQoaW50IHJ3LCBwZ29mZl90IHBhZ2Vfb2ZmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCBiaW8gKipiaW9fY2hhaW4pCiB7Ci0JaW50IGVycm9yOworCXN0cnVjdCBiaW8gKmJpbzsKIAotCXJ3X3N3YXBfcGFnZV9zeW5jKFJFQUQsIHN3cF9lbnRyeShyb290X3N3YXAsIDApLAotCQkJICB2aXJ0X3RvX3BhZ2UoKHVuc2lnbmVkIGxvbmcpJnN3c3VzcF9oZWFkZXIpLCBOVUxMKTsKLQlpZiAoIW1lbWNtcCgiU1dBUC1TUEFDRSIsc3dzdXNwX2hlYWRlci5zaWcsIDEwKSB8fAotCSAgICAhbWVtY21wKCJTV0FQU1BBQ0UyIixzd3N1c3BfaGVhZGVyLnNpZywgMTApKSB7Ci0JCW1lbWNweShzd3N1c3BfaGVhZGVyLm9yaWdfc2lnLHN3c3VzcF9oZWFkZXIuc2lnLCAxMCk7Ci0JCW1lbWNweShzd3N1c3BfaGVhZGVyLnNpZyxTV1NVU1BfU0lHLCAxMCk7Ci0JCXN3c3VzcF9oZWFkZXIuaW1hZ2UgPSBzdGFydDsKLQkJZXJyb3IgPSByd19zd2FwX3BhZ2Vfc3luYyhXUklURSwgc3dwX2VudHJ5KHJvb3Rfc3dhcCwgMCksCi0JCQkJdmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKSZzd3N1c3BfaGVhZGVyKSwKLQkJCQlOVUxMKTsKKwliaW8gPSBiaW9fYWxsb2MoX19HRlBfV0FJVCB8IF9fR0ZQX0hJR0gsIDEpOworCWlmICghYmlvKQorCQlyZXR1cm4gLUVOT01FTTsKKwliaW8tPmJpX3NlY3RvciA9IHBhZ2Vfb2ZmICogKFBBR0VfU0laRSA+PiA5KTsKKwliaW8tPmJpX2JkZXYgPSByZXN1bWVfYmRldjsKKwliaW8tPmJpX2VuZF9pbyA9IGVuZF9zd2FwX2Jpb19yZWFkOworCisJaWYgKGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfU0laRSwgMCkgPCBQQUdFX1NJWkUpIHsKKwkJcHJpbnRrKCJzd3N1c3A6IEVSUk9SOiBhZGRpbmcgcGFnZSB0byBiaW8gYXQgJWxkXG4iLCBwYWdlX29mZik7CisJCWJpb19wdXQoYmlvKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbG9ja19wYWdlKHBhZ2UpOworCWJpb19nZXQoYmlvKTsKKworCWlmIChiaW9fY2hhaW4gPT0gTlVMTCkgeworCQlzdWJtaXRfYmlvKHJ3IHwgKDEgPDwgQklPX1JXX1NZTkMpLCBiaW8pOworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlpZiAocncgPT0gUkVBRCkKKwkJCWJpb19zZXRfcGFnZXNfZGlydHkoYmlvKTsKKwkJYmlvX3B1dChiaW8pOwogCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJzd3N1c3A6IFBhcnRpdGlvbiBpcyBub3Qgc3dhcCBzcGFjZS5cbiIpOwotCQllcnJvciA9IC1FTk9ERVY7CisJCWlmIChydyA9PSBSRUFEKQorCQkJZ2V0X3BhZ2UocGFnZSk7CS8qIFRoZXNlIHBhZ2VzIGFyZSBmcmVlZCBsYXRlciAqLworCQliaW8tPmJpX3ByaXZhdGUgPSAqYmlvX2NoYWluOworCQkqYmlvX2NoYWluID0gYmlvOworCQlzdWJtaXRfYmlvKHJ3IHwgKDEgPDwgQklPX1JXX1NZTkMpLCBiaW8pOwogCX0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICoJc3dzdXNwX3N3YXBfY2hlY2sgLSBjaGVjayBpZiB0aGUgcmVzdW1lIGRldmljZSBpcyBhIHN3YXAgZGV2aWNlCi0gKglhbmQgZ2V0IGl0cyBpbmRleCAoaWYgc28pCi0gKi8KLQotc3RhdGljIGludCBzd3N1c3Bfc3dhcF9jaGVjayh2b2lkKSAvKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgc2F2aW5nIGltYWdlICovCi17Ci0JaW50IHJlcyA9IHN3YXBfdHlwZV9vZihzd3N1c3BfcmVzdW1lX2RldmljZSk7Ci0KLQlpZiAocmVzID49IDApIHsKLQkJcm9vdF9zd2FwID0gcmVzOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqCi0gKgl3cml0ZV9wYWdlIC0gV3JpdGUgb25lIHBhZ2UgdG8gZ2l2ZW4gc3dhcCBsb2NhdGlvbi4KLSAqCUBidWY6CQlBZGRyZXNzIHdlJ3JlIHdyaXRpbmcuCi0gKglAb2Zmc2V0OglPZmZzZXQgb2YgdGhlIHN3YXAgcGFnZSB3ZSdyZSB3cml0aW5nIHRvLgotICoJQGJpb19jaGFpbjoJTGluayB0aGUgbmV4dCB3cml0ZSBCSU8gaGVyZQotICovCi0KLXN0YXRpYyBpbnQgd3JpdGVfcGFnZSh2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdHJ1Y3QgYmlvICoqYmlvX2NoYWluKQotewotCXN3cF9lbnRyeV90IGVudHJ5OwotCWludCBlcnJvciA9IC1FTk9TUEM7Ci0KLQlpZiAob2Zmc2V0KSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKGJ1Zik7Ci0KLQkJaWYgKGJpb19jaGFpbikgewotCQkJLyoKLQkJCSAqIFdoZXRoZXIgb3Igbm90IHdlIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgYSBjb3B5IHBhZ2UsCi0JCQkgKiB3ZSB0YWtlIGEgcmVmIG9uIHRoZSBwYWdlIGhlcmUuICBJdCBnZXRzIHVuZG9uZSBpbgotCQkJICogd2FpdF9vbl9iaW9fY2hhaW4oKS4KLQkJCSAqLwotCQkJc3RydWN0IHBhZ2UgKnBhZ2VfY29weTsKLQkJCXBhZ2VfY29weSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7Ci0JCQlpZiAocGFnZV9jb3B5ID09IE5VTEwpIHsKLQkJCQlXQVJOX09OX09OQ0UoMSk7Ci0JCQkJYmlvX2NoYWluID0gTlVMTDsJLyogR28gc3luY2hyb25vdXMgKi8KLQkJCQlnZXRfcGFnZShwYWdlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhwYWdlX2NvcHkpLAotCQkJCQlwYWdlX2FkZHJlc3MocGFnZSksIFBBR0VfU0laRSk7Ci0JCQkJcGFnZSA9IHBhZ2VfY29weTsKLQkJCX0KLQkJfQotCQllbnRyeSA9IHN3cF9lbnRyeShyb290X3N3YXAsIG9mZnNldCk7Ci0JCWVycm9yID0gcndfc3dhcF9wYWdlX3N5bmMoV1JJVEUsIGVudHJ5LCBwYWdlLCBiaW9fY2hhaW4pOwotCX0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKglUaGUgc3dhcCBtYXAgaXMgYSBkYXRhIHN0cnVjdHVyZSB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGVhY2ggcGFnZQotICoJd3JpdHRlbiB0byBhIHN3YXAgcGFydGl0aW9uLiAgSXQgY29uc2lzdHMgb2YgbWFueSBzd2FwX21hcF9wYWdlCi0gKglzdHJ1Y3R1cmVzIHRoYXQgY29udGFpbiBlYWNoIGFuIGFycmF5IG9mIE1BUF9QQUdFX1NJWkUgc3dhcCBlbnRyaWVzLgotICoJVGhlc2Ugc3RydWN0dXJlcyBhcmUgc3RvcmVkIG9uIHRoZSBzd2FwIGFuZCBsaW5rZWQgdG9nZXRoZXIgd2l0aCB0aGUKLSAqCWhlbHAgb2YgdGhlIC5uZXh0X3N3YXAgbWVtYmVyLgotICoKLSAqCVRoZSBzd2FwIG1hcCBpcyBjcmVhdGVkIGR1cmluZyBzdXNwZW5kLiAgVGhlIHN3YXAgbWFwIHBhZ2VzIGFyZQotICoJYWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQgb25lIGF0IGEgdGltZSwgc28gd2Ugb25seSBuZWVkIG9uZSBtZW1vcnkKLSAqCXBhZ2UgdG8gc2V0IHVwIHRoZSBlbnRpcmUgc3RydWN0dXJlLgotICoKLSAqCUR1cmluZyByZXN1bWUgd2UgYWxzbyBvbmx5IG5lZWQgdG8gdXNlIG9uZSBzd2FwX21hcF9wYWdlIHN0cnVjdHVyZQotICoJYXQgYSB0aW1lLgotICovCi0KLSNkZWZpbmUgTUFQX1BBR0VfRU5UUklFUwkoUEFHRV9TSVpFIC8gc2l6ZW9mKGxvbmcpIC0gMSkKLQotc3RydWN0IHN3YXBfbWFwX3BhZ2UgewotCXVuc2lnbmVkIGxvbmcJCWVudHJpZXNbTUFQX1BBR0VfRU5UUklFU107Ci0JdW5zaWduZWQgbG9uZwkJbmV4dF9zd2FwOwotfTsKLQotLyoqCi0gKglUaGUgc3dhcF9tYXBfaGFuZGxlIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBoYW5kbGluZyBzd2FwIGluCi0gKglhIGZpbGUtYWxpa2Ugd2F5Ci0gKi8KLQotc3RydWN0IHN3YXBfbWFwX2hhbmRsZSB7Ci0Jc3RydWN0IHN3YXBfbWFwX3BhZ2UgKmN1cjsKLQl1bnNpZ25lZCBsb25nIGN1cl9zd2FwOwotCXN0cnVjdCBiaXRtYXBfcGFnZSAqYml0bWFwOwotCXVuc2lnbmVkIGludCBrOwotfTsKLQotc3RhdGljIHZvaWQgcmVsZWFzZV9zd2FwX3dyaXRlcihzdHJ1Y3Qgc3dhcF9tYXBfaGFuZGxlICpoYW5kbGUpCi17Ci0JaWYgKGhhbmRsZS0+Y3VyKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpaGFuZGxlLT5jdXIpOwotCWhhbmRsZS0+Y3VyID0gTlVMTDsKLQlpZiAoaGFuZGxlLT5iaXRtYXApCi0JCWZyZWVfYml0bWFwKGhhbmRsZS0+Yml0bWFwKTsKLQloYW5kbGUtPmJpdG1hcCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNob3dfc3BlZWQoc3RydWN0IHRpbWV2YWwgKnN0YXJ0LCBzdHJ1Y3QgdGltZXZhbCAqc3RvcCwKLQkJCXVuc2lnbmVkIG5yX3BhZ2VzLCBjaGFyICptc2cpCi17Ci0JczY0IGVsYXBzZWRfY2VudGlzZWNzNjQ7Ci0JaW50IGNlbnRpc2VjczsKLQlpbnQgazsKLQlpbnQga3BzOwotCi0JZWxhcHNlZF9jZW50aXNlY3M2NCA9IHRpbWV2YWxfdG9fbnMoc3RvcCkgLSB0aW1ldmFsX3RvX25zKHN0YXJ0KTsKLQlkb19kaXYoZWxhcHNlZF9jZW50aXNlY3M2NCwgTlNFQ19QRVJfU0VDIC8gMTAwKTsKLQljZW50aXNlY3MgPSBlbGFwc2VkX2NlbnRpc2VjczY0OwotCWlmIChjZW50aXNlY3MgPT0gMCkKLQkJY2VudGlzZWNzID0gMTsJLyogYXZvaWQgZGl2LWJ5LXplcm8gKi8KLQlrID0gbnJfcGFnZXMgKiAoUEFHRV9TSVpFIC8gMTAyNCk7Ci0Ja3BzID0gKGsgKiAxMDApIC8gY2VudGlzZWNzOwotCXByaW50aygiJXMgJWQga2J5dGVzIGluICVkLiUwMmQgc2Vjb25kcyAoJWQuJTAyZCBNQi9zKVxuIiwgbXNnLCBrLAotCQkJY2VudGlzZWNzIC8gMTAwLCBjZW50aXNlY3MgJSAxMDAsCi0JCQlrcHMgLyAxMDAwLCAoa3BzICUgMTAwMCkgLyAxMCk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3N3YXBfd3JpdGVyKHN0cnVjdCBzd2FwX21hcF9oYW5kbGUgKmhhbmRsZSkKLXsKLQloYW5kbGUtPmN1ciA9IChzdHJ1Y3Qgc3dhcF9tYXBfcGFnZSAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWhhbmRsZS0+Y3VyKQotCQlyZXR1cm4gLUVOT01FTTsKLQloYW5kbGUtPmJpdG1hcCA9IGFsbG9jX2JpdG1hcChjb3VudF9zd2FwX3BhZ2VzKHJvb3Rfc3dhcCwgMCkpOwotCWlmICghaGFuZGxlLT5iaXRtYXApIHsKLQkJcmVsZWFzZV9zd2FwX3dyaXRlcihoYW5kbGUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JaGFuZGxlLT5jdXJfc3dhcCA9IGFsbG9jX3N3YXBfcGFnZShyb290X3N3YXAsIGhhbmRsZS0+Yml0bWFwKTsKLQlpZiAoIWhhbmRsZS0+Y3VyX3N3YXApIHsKLQkJcmVsZWFzZV9zd2FwX3dyaXRlcihoYW5kbGUpOwotCQlyZXR1cm4gLUVOT1NQQzsKLQl9Ci0JaGFuZGxlLT5rID0gMDsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBiaW9fcmVhZF9wYWdlKHBnb2ZmX3QgcGFnZV9vZmYsIHZvaWQgKmFkZHIsIHN0cnVjdCBiaW8gKipiaW9fY2hhaW4pCit7CisJcmV0dXJuIHN1Ym1pdChSRUFELCBwYWdlX29mZiwgdmlydF90b19wYWdlKGFkZHIpLCBiaW9fY2hhaW4pOworfQorCitzdGF0aWMgaW50IGJpb193cml0ZV9wYWdlKHBnb2ZmX3QgcGFnZV9vZmYsIHZvaWQgKmFkZHIsIHN0cnVjdCBiaW8gKipiaW9fY2hhaW4pCit7CisJcmV0dXJuIHN1Ym1pdChXUklURSwgcGFnZV9vZmYsIHZpcnRfdG9fcGFnZShhZGRyKSwgYmlvX2NoYWluKTsKK30KKwogc3RhdGljIGludCB3YWl0X29uX2Jpb19jaGFpbihzdHJ1Y3QgYmlvICoqYmlvX2NoYWluKQogewogCXN0cnVjdCBiaW8gKmJpbzsKQEAgLTIzMywxNSArMTMzLDE1NSBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBTYXZpbmcgcGFydAorICovCisKK3N0YXRpYyBpbnQgbWFya19zd2FwZmlsZXMoc2VjdG9yX3Qgc3RhcnQpCit7CisJaW50IGVycm9yOworCisJYmlvX3JlYWRfcGFnZShzd3N1c3BfcmVzdW1lX2Jsb2NrLCAmc3dzdXNwX2hlYWRlciwgTlVMTCk7CisJaWYgKCFtZW1jbXAoIlNXQVAtU1BBQ0UiLHN3c3VzcF9oZWFkZXIuc2lnLCAxMCkgfHwKKwkgICAgIW1lbWNtcCgiU1dBUFNQQUNFMiIsc3dzdXNwX2hlYWRlci5zaWcsIDEwKSkgeworCQltZW1jcHkoc3dzdXNwX2hlYWRlci5vcmlnX3NpZyxzd3N1c3BfaGVhZGVyLnNpZywgMTApOworCQltZW1jcHkoc3dzdXNwX2hlYWRlci5zaWcsU1dTVVNQX1NJRywgMTApOworCQlzd3N1c3BfaGVhZGVyLmltYWdlID0gc3RhcnQ7CisJCWVycm9yID0gYmlvX3dyaXRlX3BhZ2Uoc3dzdXNwX3Jlc3VtZV9ibG9jaywKKwkJCQkJJnN3c3VzcF9oZWFkZXIsIE5VTEwpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAic3dzdXNwOiBTd2FwIGhlYWRlciBub3QgZm91bmQhXG4iKTsKKwkJZXJyb3IgPSAtRU5PREVWOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc3dzdXNwX3N3YXBfY2hlY2sgLSBjaGVjayBpZiB0aGUgcmVzdW1lIGRldmljZSBpcyBhIHN3YXAgZGV2aWNlCisgKglhbmQgZ2V0IGl0cyBpbmRleCAoaWYgc28pCisgKi8KKworc3RhdGljIGludCBzd3N1c3Bfc3dhcF9jaGVjayh2b2lkKSAvKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgc2F2aW5nIGltYWdlICovCit7CisJaW50IHJlczsKKworCXJlcyA9IHN3YXBfdHlwZV9vZihzd3N1c3BfcmVzdW1lX2RldmljZSwgc3dzdXNwX3Jlc3VtZV9ibG9jayk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyb290X3N3YXAgPSByZXM7CisJcmVzdW1lX2JkZXYgPSBvcGVuX2J5X2Rldm51bShzd3N1c3BfcmVzdW1lX2RldmljZSwgRk1PREVfV1JJVEUpOworCWlmIChJU19FUlIocmVzdW1lX2JkZXYpKQorCQlyZXR1cm4gUFRSX0VSUihyZXN1bWVfYmRldik7CisKKwlyZXMgPSBzZXRfYmxvY2tzaXplKHJlc3VtZV9iZGV2LCBQQUdFX1NJWkUpOworCWlmIChyZXMgPCAwKQorCQlibGtkZXZfcHV0KHJlc3VtZV9iZGV2KTsKKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICoJd3JpdGVfcGFnZSAtIFdyaXRlIG9uZSBwYWdlIHRvIGdpdmVuIHN3YXAgbG9jYXRpb24uCisgKglAYnVmOgkJQWRkcmVzcyB3ZSdyZSB3cml0aW5nLgorICoJQG9mZnNldDoJT2Zmc2V0IG9mIHRoZSBzd2FwIHBhZ2Ugd2UncmUgd3JpdGluZyB0by4KKyAqCUBiaW9fY2hhaW46CUxpbmsgdGhlIG5leHQgd3JpdGUgQklPIGhlcmUKKyAqLworCitzdGF0aWMgaW50IHdyaXRlX3BhZ2Uodm9pZCAqYnVmLCBzZWN0b3JfdCBvZmZzZXQsIHN0cnVjdCBiaW8gKipiaW9fY2hhaW4pCit7CisJdm9pZCAqc3JjOworCisJaWYgKCFvZmZzZXQpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGJpb19jaGFpbikgeworCQlzcmMgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShfX0dGUF9XQUlUIHwgX19HRlBfSElHSCk7CisJCWlmIChzcmMpIHsKKwkJCW1lbWNweShzcmMsIGJ1ZiwgUEFHRV9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCVdBUk5fT05fT05DRSgxKTsKKwkJCWJpb19jaGFpbiA9IE5VTEw7CS8qIEdvIHN5bmNocm9ub3VzICovCisJCQlzcmMgPSBidWY7CisJCX0KKwl9IGVsc2UgeworCQlzcmMgPSBidWY7CisJfQorCXJldHVybiBiaW9fd3JpdGVfcGFnZShvZmZzZXQsIHNyYywgYmlvX2NoYWluKTsKK30KKworLyoKKyAqCVRoZSBzd2FwIG1hcCBpcyBhIGRhdGEgc3RydWN0dXJlIHVzZWQgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZWFjaCBwYWdlCisgKgl3cml0dGVuIHRvIGEgc3dhcCBwYXJ0aXRpb24uICBJdCBjb25zaXN0cyBvZiBtYW55IHN3YXBfbWFwX3BhZ2UKKyAqCXN0cnVjdHVyZXMgdGhhdCBjb250YWluIGVhY2ggYW4gYXJyYXkgb2YgTUFQX1BBR0VfU0laRSBzd2FwIGVudHJpZXMuCisgKglUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBzdG9yZWQgb24gdGhlIHN3YXAgYW5kIGxpbmtlZCB0b2dldGhlciB3aXRoIHRoZQorICoJaGVscCBvZiB0aGUgLm5leHRfc3dhcCBtZW1iZXIuCisgKgorICoJVGhlIHN3YXAgbWFwIGlzIGNyZWF0ZWQgZHVyaW5nIHN1c3BlbmQuICBUaGUgc3dhcCBtYXAgcGFnZXMgYXJlCisgKglhbGxvY2F0ZWQgYW5kIHBvcHVsYXRlZCBvbmUgYXQgYSB0aW1lLCBzbyB3ZSBvbmx5IG5lZWQgb25lIG1lbW9yeQorICoJcGFnZSB0byBzZXQgdXAgdGhlIGVudGlyZSBzdHJ1Y3R1cmUuCisgKgorICoJRHVyaW5nIHJlc3VtZSB3ZSBhbHNvIG9ubHkgbmVlZCB0byB1c2Ugb25lIHN3YXBfbWFwX3BhZ2Ugc3RydWN0dXJlCisgKglhdCBhIHRpbWUuCisgKi8KKworI2RlZmluZSBNQVBfUEFHRV9FTlRSSUVTCShQQUdFX1NJWkUgLyBzaXplb2Yoc2VjdG9yX3QpIC0gMSkKKworc3RydWN0IHN3YXBfbWFwX3BhZ2UgeworCXNlY3Rvcl90IGVudHJpZXNbTUFQX1BBR0VfRU5UUklFU107CisJc2VjdG9yX3QgbmV4dF9zd2FwOworfTsKKworLyoqCisgKglUaGUgc3dhcF9tYXBfaGFuZGxlIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBoYW5kbGluZyBzd2FwIGluCisgKglhIGZpbGUtYWxpa2Ugd2F5CisgKi8KKworc3RydWN0IHN3YXBfbWFwX2hhbmRsZSB7CisJc3RydWN0IHN3YXBfbWFwX3BhZ2UgKmN1cjsKKwlzZWN0b3JfdCBjdXJfc3dhcDsKKwlzdHJ1Y3QgYml0bWFwX3BhZ2UgKmJpdG1hcDsKKwl1bnNpZ25lZCBpbnQgazsKK307CisKK3N0YXRpYyB2b2lkIHJlbGVhc2Vfc3dhcF93cml0ZXIoc3RydWN0IHN3YXBfbWFwX2hhbmRsZSAqaGFuZGxlKQoreworCWlmIChoYW5kbGUtPmN1cikKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWhhbmRsZS0+Y3VyKTsKKwloYW5kbGUtPmN1ciA9IE5VTEw7CisJaWYgKGhhbmRsZS0+Yml0bWFwKQorCQlmcmVlX2JpdG1hcChoYW5kbGUtPmJpdG1hcCk7CisJaGFuZGxlLT5iaXRtYXAgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGdldF9zd2FwX3dyaXRlcihzdHJ1Y3Qgc3dhcF9tYXBfaGFuZGxlICpoYW5kbGUpCit7CisJaGFuZGxlLT5jdXIgPSAoc3RydWN0IHN3YXBfbWFwX3BhZ2UgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFoYW5kbGUtPmN1cikKKwkJcmV0dXJuIC1FTk9NRU07CisJaGFuZGxlLT5iaXRtYXAgPSBhbGxvY19iaXRtYXAoY291bnRfc3dhcF9wYWdlcyhyb290X3N3YXAsIDApKTsKKwlpZiAoIWhhbmRsZS0+Yml0bWFwKSB7CisJCXJlbGVhc2Vfc3dhcF93cml0ZXIoaGFuZGxlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWhhbmRsZS0+Y3VyX3N3YXAgPSBhbGxvY19zd2FwZGV2X2Jsb2NrKHJvb3Rfc3dhcCwgaGFuZGxlLT5iaXRtYXApOworCWlmICghaGFuZGxlLT5jdXJfc3dhcCkgeworCQlyZWxlYXNlX3N3YXBfd3JpdGVyKGhhbmRsZSk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwloYW5kbGUtPmsgPSAwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHN3YXBfd3JpdGVfcGFnZShzdHJ1Y3Qgc3dhcF9tYXBfaGFuZGxlICpoYW5kbGUsIHZvaWQgKmJ1ZiwKIAkJCQlzdHJ1Y3QgYmlvICoqYmlvX2NoYWluKQogewogCWludCBlcnJvciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc2VjdG9yX3Qgb2Zmc2V0OwogCiAJaWYgKCFoYW5kbGUtPmN1cikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0Jb2Zmc2V0ID0gYWxsb2Nfc3dhcF9wYWdlKHJvb3Rfc3dhcCwgaGFuZGxlLT5iaXRtYXApOworCW9mZnNldCA9IGFsbG9jX3N3YXBkZXZfYmxvY2socm9vdF9zd2FwLCBoYW5kbGUtPmJpdG1hcCk7CiAJZXJyb3IgPSB3cml0ZV9wYWdlKGJ1Ziwgb2Zmc2V0LCBiaW9fY2hhaW4pOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwpAQCAtMjUwLDcgKzI5MCw3IEBACiAJCWVycm9yID0gd2FpdF9vbl9iaW9fY2hhaW4oYmlvX2NoYWluKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7Ci0JCW9mZnNldCA9IGFsbG9jX3N3YXBfcGFnZShyb290X3N3YXAsIGhhbmRsZS0+Yml0bWFwKTsKKwkJb2Zmc2V0ID0gYWxsb2Nfc3dhcGRldl9ibG9jayhyb290X3N3YXAsIGhhbmRsZS0+Yml0bWFwKTsKIAkJaWYgKCFvZmZzZXQpCiAJCQlyZXR1cm4gLUVOT1NQQzsKIAkJaGFuZGxlLT5jdXItPm5leHRfc3dhcCA9IG9mZnNldDsKQEAgLTI2MSw3ICszMDEsNyBAQAogCQloYW5kbGUtPmN1cl9zd2FwID0gb2Zmc2V0OwogCQloYW5kbGUtPmsgPSAwOwogCX0KLW91dDoKKyBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0zMTUsNyArMzU1LDcgQEAKIAkJZXJyb3IgPSBlcnIyOwogCWlmICghZXJyb3IpCiAJCXByaW50aygiXGJcYlxiXGJkb25lXG4iKTsKLQlzaG93X3NwZWVkKCZzdGFydCwgJnN0b3AsIG5yX3RvX3dyaXRlLCAiV3JvdGUiKTsKKwlzd3N1c3Bfc2hvd19zcGVlZCgmc3RhcnQsICZzdG9wLCBucl90b193cml0ZSwgIldyb3RlIik7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0zNTAsOTkgKzM5MCw1MCBAQAogCXN0cnVjdCBzd3N1c3BfaW5mbyAqaGVhZGVyOwogCWludCBlcnJvcjsKIAotCWlmICgoZXJyb3IgPSBzd3N1c3Bfc3dhcF9jaGVjaygpKSkgeworCWVycm9yID0gc3dzdXNwX3N3YXBfY2hlY2soKTsKKwlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IENhbm5vdCBmaW5kIHN3YXAgZGV2aWNlLCB0cnkgIgogCQkJCSJzd2Fwb24gLWEuXG4iKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIAltZW1zZXQoJnNuYXBzaG90LCAwLCBzaXplb2Yoc3RydWN0IHNuYXBzaG90X2hhbmRsZSkpOwogCWVycm9yID0gc25hcHNob3RfcmVhZF9uZXh0KCZzbmFwc2hvdCwgUEFHRV9TSVpFKTsKLQlpZiAoZXJyb3IgPCBQQUdFX1NJWkUpCi0JCXJldHVybiBlcnJvciA8IDAgPyBlcnJvciA6IC1FRkFVTFQ7CisJaWYgKGVycm9yIDwgUEFHRV9TSVpFKSB7CisJCWlmIChlcnJvciA+PSAwKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCisJCWdvdG8gb3V0OworCX0KIAloZWFkZXIgPSAoc3RydWN0IHN3c3VzcF9pbmZvICopZGF0YV9vZihzbmFwc2hvdCk7CiAJaWYgKCFlbm91Z2hfc3dhcChoZWFkZXItPnBhZ2VzKSkgewogCQlwcmludGsoS0VSTl9FUlIgInN3c3VzcDogTm90IGVub3VnaCBmcmVlIHN3YXBcbiIpOwotCQlyZXR1cm4gLUVOT1NQQzsKKwkJZXJyb3IgPSAtRU5PU1BDOworCQlnb3RvIG91dDsKIAl9CiAJZXJyb3IgPSBnZXRfc3dhcF93cml0ZXIoJmhhbmRsZSk7CiAJaWYgKCFlcnJvcikgewotCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gaGFuZGxlLmN1cl9zd2FwOworCQlzZWN0b3JfdCBzdGFydCA9IGhhbmRsZS5jdXJfc3dhcDsKKwogCQllcnJvciA9IHN3YXBfd3JpdGVfcGFnZSgmaGFuZGxlLCBoZWFkZXIsIE5VTEwpOwogCQlpZiAoIWVycm9yKQogCQkJZXJyb3IgPSBzYXZlX2ltYWdlKCZoYW5kbGUsICZzbmFwc2hvdCwKIAkJCQkJaGVhZGVyLT5wYWdlcyAtIDEpOworCiAJCWlmICghZXJyb3IpIHsKIAkJCWZsdXNoX3N3YXBfd3JpdGVyKCZoYW5kbGUpOwogCQkJcHJpbnRrKCJTIik7Ci0JCQllcnJvciA9IG1hcmtfc3dhcGZpbGVzKHN3cF9lbnRyeShyb290X3N3YXAsIHN0YXJ0KSk7CisJCQllcnJvciA9IG1hcmtfc3dhcGZpbGVzKHN0YXJ0KTsKIAkJCXByaW50aygifFxuIik7CiAJCX0KIAl9CiAJaWYgKGVycm9yKQogCQlmcmVlX2FsbF9zd2FwX3BhZ2VzKHJvb3Rfc3dhcCwgaGFuZGxlLmJpdG1hcCk7CiAJcmVsZWFzZV9zd2FwX3dyaXRlcigmaGFuZGxlKTsKKyBvdXQ6CisJc3dzdXNwX2Nsb3NlKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZSAqcmVzdW1lX2JkZXY7Ci0KLS8qKgotICoJc3VibWl0IC0gc3VibWl0IEJJTyByZXF1ZXN0LgotICoJQHJ3OglSRUFEIG9yIFdSSVRFLgotICoJQG9mZglwaHlzaWNhbCBvZmZzZXQgb2YgcGFnZS4KLSAqCUBwYWdlOglwYWdlIHdlJ3JlIHJlYWRpbmcgb3Igd3JpdGluZy4KLSAqCUBiaW9fY2hhaW46IGxpc3Qgb2YgcGVuZGluZyBiaW9kIChmb3IgYXN5bmMgcmVhZGluZykKLSAqCi0gKglTdHJhaWdodCBmcm9tIHRoZSB0ZXh0Ym9vayAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBiaW8uCi0gKglJZiB3ZSdyZSByZWFkaW5nLCBtYWtlIHN1cmUgdGhlIHBhZ2UgaXMgbWFya2VkIGFzIGRpcnR5LgotICoJVGhlbiBzdWJtaXQgaXQgYW5kLCBpZiBAYmlvX2NoYWluID09IE5VTEwsIHdhaXQuCi0gKi8KLXN0YXRpYyBpbnQgc3VibWl0KGludCBydywgcGdvZmZfdCBwYWdlX29mZiwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQlzdHJ1Y3QgYmlvICoqYmlvX2NoYWluKQotewotCXN0cnVjdCBiaW8gKmJpbzsKLQotCWJpbyA9IGJpb19hbGxvYyhHRlBfQVRPTUlDLCAxKTsKLQlpZiAoIWJpbykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JYmlvLT5iaV9zZWN0b3IgPSBwYWdlX29mZiAqIChQQUdFX1NJWkUgPj4gOSk7Ci0JYmlvLT5iaV9iZGV2ID0gcmVzdW1lX2JkZXY7Ci0JYmlvLT5iaV9lbmRfaW8gPSBlbmRfc3dhcF9iaW9fcmVhZDsKLQotCWlmIChiaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBQQUdFX1NJWkUsIDApIDwgUEFHRV9TSVpFKSB7Ci0JCXByaW50aygic3dzdXNwOiBFUlJPUjogYWRkaW5nIHBhZ2UgdG8gYmlvIGF0ICVsZFxuIiwgcGFnZV9vZmYpOwotCQliaW9fcHV0KGJpbyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWxvY2tfcGFnZShwYWdlKTsKLQliaW9fZ2V0KGJpbyk7Ci0KLQlpZiAoYmlvX2NoYWluID09IE5VTEwpIHsKLQkJc3VibWl0X2JpbyhydyB8ICgxIDw8IEJJT19SV19TWU5DKSwgYmlvKTsKLQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQkJaWYgKHJ3ID09IFJFQUQpCi0JCQliaW9fc2V0X3BhZ2VzX2RpcnR5KGJpbyk7Ci0JCWJpb19wdXQoYmlvKTsKLQl9IGVsc2UgewotCQlnZXRfcGFnZShwYWdlKTsKLQkJYmlvLT5iaV9wcml2YXRlID0gKmJpb19jaGFpbjsKLQkJKmJpb19jaGFpbiA9IGJpbzsKLQkJc3VibWl0X2JpbyhydyB8ICgxIDw8IEJJT19SV19TWU5DKSwgYmlvKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmlvX3JlYWRfcGFnZShwZ29mZl90IHBhZ2Vfb2ZmLCB2b2lkICphZGRyLCBzdHJ1Y3QgYmlvICoqYmlvX2NoYWluKQotewotCXJldHVybiBzdWJtaXQoUkVBRCwgcGFnZV9vZmYsIHZpcnRfdG9fcGFnZShhZGRyKSwgYmlvX2NoYWluKTsKLX0KLQotc3RhdGljIGludCBiaW9fd3JpdGVfcGFnZShwZ29mZl90IHBhZ2Vfb2ZmLCB2b2lkICphZGRyKQotewotCXJldHVybiBzdWJtaXQoV1JJVEUsIHBhZ2Vfb2ZmLCB2aXJ0X3RvX3BhZ2UoYWRkciksIE5VTEwpOwotfQotCiAvKioKICAqCVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFsbG93IHVzIHRvIHJlYWQgZGF0YSB1c2luZyBhIHN3YXAgbWFwCiAgKglpbiBhIGZpbGUtYWxpa2Ugd2F5CkBAIC00NTUsMTcgKzQ0NiwxOCBAQAogCWhhbmRsZS0+Y3VyID0gTlVMTDsKIH0KIAotc3RhdGljIGludCBnZXRfc3dhcF9yZWFkZXIoc3RydWN0IHN3YXBfbWFwX2hhbmRsZSAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd3BfZW50cnlfdCBzdGFydCkKK3N0YXRpYyBpbnQgZ2V0X3N3YXBfcmVhZGVyKHN0cnVjdCBzd2FwX21hcF9oYW5kbGUgKmhhbmRsZSwgc2VjdG9yX3Qgc3RhcnQpCiB7CiAJaW50IGVycm9yOwogCi0JaWYgKCFzd3Bfb2Zmc2V0KHN0YXJ0KSkKKwlpZiAoIXN0YXJ0KQogCQlyZXR1cm4gLUVJTlZBTDsKLQloYW5kbGUtPmN1ciA9IChzdHJ1Y3Qgc3dhcF9tYXBfcGFnZSAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKworCWhhbmRsZS0+Y3VyID0gKHN0cnVjdCBzd2FwX21hcF9wYWdlICopZ2V0X3plcm9lZF9wYWdlKF9fR0ZQX1dBSVQgfCBfX0dGUF9ISUdIKTsKIAlpZiAoIWhhbmRsZS0+Y3VyKQogCQlyZXR1cm4gLUVOT01FTTsKLQllcnJvciA9IGJpb19yZWFkX3BhZ2Uoc3dwX29mZnNldChzdGFydCksIGhhbmRsZS0+Y3VyLCBOVUxMKTsKKworCWVycm9yID0gYmlvX3JlYWRfcGFnZShzdGFydCwgaGFuZGxlLT5jdXIsIE5VTEwpOwogCWlmIChlcnJvcikgewogCQlyZWxlYXNlX3N3YXBfcmVhZGVyKGhhbmRsZSk7CiAJCXJldHVybiBlcnJvcjsKQEAgLTQ3Nyw3ICs0NjksNyBAQAogc3RhdGljIGludCBzd2FwX3JlYWRfcGFnZShzdHJ1Y3Qgc3dhcF9tYXBfaGFuZGxlICpoYW5kbGUsIHZvaWQgKmJ1ZiwKIAkJCQlzdHJ1Y3QgYmlvICoqYmlvX2NoYWluKQogewotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXNlY3Rvcl90IG9mZnNldDsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoIWhhbmRsZS0+Y3VyKQpAQCAtNTQ2LDExICs1MzgsMTEgQEAKIAkJZXJyb3IgPSBlcnIyOwogCWlmICghZXJyb3IpIHsKIAkJcHJpbnRrKCJcYlxiXGJcYmRvbmVcbiIpOwotCQlzbmFwc2hvdF9mcmVlX3VudXNlZF9tZW1vcnkoc25hcHNob3QpOworCQlzbmFwc2hvdF93cml0ZV9maW5hbGl6ZShzbmFwc2hvdCk7CiAJCWlmICghc25hcHNob3RfaW1hZ2VfbG9hZGVkKHNuYXBzaG90KSkKIAkJCWVycm9yID0gLUVOT0RBVEE7CiAJfQotCXNob3dfc3BlZWQoJnN0YXJ0LCAmc3RvcCwgbnJfdG9fcmVhZCwgIlJlYWQiKTsKKwlzd3N1c3Bfc2hvd19zcGVlZCgmc3RhcnQsICZzdG9wLCBucl90b19yZWFkLCAiUmVhZCIpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNTk5LDEyICs1OTEsMTYgQEAKIAlpZiAoIUlTX0VSUihyZXN1bWVfYmRldikpIHsKIAkJc2V0X2Jsb2Nrc2l6ZShyZXN1bWVfYmRldiwgUEFHRV9TSVpFKTsKIAkJbWVtc2V0KCZzd3N1c3BfaGVhZGVyLCAwLCBzaXplb2Yoc3dzdXNwX2hlYWRlcikpOwotCQlpZiAoKGVycm9yID0gYmlvX3JlYWRfcGFnZSgwLCAmc3dzdXNwX2hlYWRlciwgTlVMTCkpKQorCQllcnJvciA9IGJpb19yZWFkX3BhZ2Uoc3dzdXNwX3Jlc3VtZV9ibG9jaywKKwkJCQkJJnN3c3VzcF9oZWFkZXIsIE5VTEwpOworCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CisKIAkJaWYgKCFtZW1jbXAoU1dTVVNQX1NJRywgc3dzdXNwX2hlYWRlci5zaWcsIDEwKSkgewogCQkJbWVtY3B5KHN3c3VzcF9oZWFkZXIuc2lnLCBzd3N1c3BfaGVhZGVyLm9yaWdfc2lnLCAxMCk7CiAJCQkvKiBSZXNldCBzd2FwIHNpZ25hdHVyZSBub3cgKi8KLQkJCWVycm9yID0gYmlvX3dyaXRlX3BhZ2UoMCwgJnN3c3VzcF9oZWFkZXIpOworCQkJZXJyb3IgPSBiaW9fd3JpdGVfcGFnZShzd3N1c3BfcmVzdW1lX2Jsb2NrLAorCQkJCQkJJnN3c3VzcF9oZWFkZXIsIE5VTEwpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zd3N1c3AuYyBiL2tlcm5lbC9wb3dlci9zd3N1c3AuYwppbmRleCAwYjY2NjU5Li4zMWFhMDM5IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKKysrIGIva2VybmVsL3Bvd2VyL3N3c3VzcC5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAogI2luY2x1ZGUgInBvd2VyLmgiCiAKQEAgLTY0LDEwICs2NSw4IEBACiAKICNpZmRlZiBDT05GSUdfSElHSE1FTQogdW5zaWduZWQgaW50IGNvdW50X2hpZ2htZW1fcGFnZXModm9pZCk7Ci1pbnQgc2F2ZV9oaWdobWVtKHZvaWQpOwogaW50IHJlc3RvcmVfaGlnaG1lbSh2b2lkKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBzYXZlX2hpZ2htZW0odm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgcmVzdG9yZV9oaWdobWVtKHZvaWQpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNvdW50X2hpZ2htZW1fcGFnZXModm9pZCkgeyByZXR1cm4gMDsgfQogI2VuZGlmCkBAIC0xMzQsMTggKzEzMywxOCBAQAogCXJldHVybiAwOwogfQogCi11bnNpZ25lZCBsb25nIGFsbG9jX3N3YXBfcGFnZShpbnQgc3dhcCwgc3RydWN0IGJpdG1hcF9wYWdlICpiaXRtYXApCitzZWN0b3JfdCBhbGxvY19zd2FwZGV2X2Jsb2NrKGludCBzd2FwLCBzdHJ1Y3QgYml0bWFwX3BhZ2UgKmJpdG1hcCkKIHsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAogCW9mZnNldCA9IHN3cF9vZmZzZXQoZ2V0X3N3YXBfcGFnZV9vZl90eXBlKHN3YXApKTsKIAlpZiAob2Zmc2V0KSB7Ci0JCWlmIChiaXRtYXBfc2V0KGJpdG1hcCwgb2Zmc2V0KSkgeworCQlpZiAoYml0bWFwX3NldChiaXRtYXAsIG9mZnNldCkpCiAJCQlzd2FwX2ZyZWUoc3dwX2VudHJ5KHN3YXAsIG9mZnNldCkpOwotCQkJb2Zmc2V0ID0gMDsKLQkJfQorCQllbHNlCisJCQlyZXR1cm4gc3dhcGRldl9ibG9jayhzd2FwLCBvZmZzZXQpOwogCX0KLQlyZXR1cm4gb2Zmc2V0OworCXJldHVybiAwOwogfQogCiB2b2lkIGZyZWVfYWxsX3N3YXBfcGFnZXMoaW50IHN3YXAsIHN0cnVjdCBiaXRtYXBfcGFnZSAqYml0bWFwKQpAQCAtMTY2LDYgKzE2NSwzNCBAQAogfQogCiAvKioKKyAqCXN3c3VzcF9zaG93X3NwZWVkIC0gcHJpbnQgdGhlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIHR3byBldmVudHMgcmVwcmVzZW50ZWQgYnkKKyAqCUBzdGFydCBhbmQgQHN0b3AKKyAqCisgKglAbnJfcGFnZXMgLQludW1iZXIgb2YgcGFnZXMgcHJvY2Vzc2VkIGJldHdlZW4gQHN0YXJ0IGFuZCBAc3RvcAorICoJQG1zZyAtCQlpbnRyb2R1Y3RvcnkgbWVzc2FnZSB0byBwcmludAorICovCisKK3ZvaWQgc3dzdXNwX3Nob3dfc3BlZWQoc3RydWN0IHRpbWV2YWwgKnN0YXJ0LCBzdHJ1Y3QgdGltZXZhbCAqc3RvcCwKKwkJCXVuc2lnbmVkIG5yX3BhZ2VzLCBjaGFyICptc2cpCit7CisJczY0IGVsYXBzZWRfY2VudGlzZWNzNjQ7CisJaW50IGNlbnRpc2VjczsKKwlpbnQgazsKKwlpbnQga3BzOworCisJZWxhcHNlZF9jZW50aXNlY3M2NCA9IHRpbWV2YWxfdG9fbnMoc3RvcCkgLSB0aW1ldmFsX3RvX25zKHN0YXJ0KTsKKwlkb19kaXYoZWxhcHNlZF9jZW50aXNlY3M2NCwgTlNFQ19QRVJfU0VDIC8gMTAwKTsKKwljZW50aXNlY3MgPSBlbGFwc2VkX2NlbnRpc2VjczY0OworCWlmIChjZW50aXNlY3MgPT0gMCkKKwkJY2VudGlzZWNzID0gMTsJLyogYXZvaWQgZGl2LWJ5LXplcm8gKi8KKwlrID0gbnJfcGFnZXMgKiAoUEFHRV9TSVpFIC8gMTAyNCk7CisJa3BzID0gKGsgKiAxMDApIC8gY2VudGlzZWNzOworCXByaW50aygiJXMgJWQga2J5dGVzIGluICVkLiUwMmQgc2Vjb25kcyAoJWQuJTAyZCBNQi9zKVxuIiwgbXNnLCBrLAorCQkJY2VudGlzZWNzIC8gMTAwLCBjZW50aXNlY3MgJSAxMDAsCisJCQlrcHMgLyAxMDAwLCAoa3BzICUgMTAwMCkgLyAxMCk7Cit9CisKKy8qKgogICoJc3dzdXNwX3Nocmlua19tZW1vcnkgLSAgVHJ5IHRvIGZyZWUgYXMgbXVjaCBtZW1vcnkgYXMgbmVlZGVkCiAgKgogICoJLi4uIGJ1dCBkbyBub3QgT09NLWtpbGwgYW55b25lCkBAIC0xODQsMjMgKzIxMSwzNyBAQAogCiBpbnQgc3dzdXNwX3Nocmlua19tZW1vcnkodm9pZCkKIHsKLQlsb25nIHNpemUsIHRtcDsKKwlsb25nIHRtcDsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzID0gMDsKIAl1bnNpZ25lZCBpbnQgaSA9IDA7CiAJY2hhciAqcCA9ICItXFx8LyI7CisJc3RydWN0IHRpbWV2YWwgc3RhcnQsIHN0b3A7CiAKIAlwcmludGsoIlNocmlua2luZyBtZW1vcnkuLi4gICIpOworCWRvX2dldHRpbWVvZmRheSgmc3RhcnQpOwogCWRvIHsKLQkJc2l6ZSA9IDIgKiBjb3VudF9oaWdobWVtX3BhZ2VzKCk7Ci0JCXNpemUgKz0gc2l6ZSAvIDUwICsgY291bnRfZGF0YV9wYWdlcygpICsgUEFHRVNfRk9SX0lPOworCQlsb25nIHNpemUsIGhpZ2htZW1fc2l6ZTsKKworCQloaWdobWVtX3NpemUgPSBjb3VudF9oaWdobWVtX3BhZ2VzKCk7CisJCXNpemUgPSBjb3VudF9kYXRhX3BhZ2VzKCkgKyBQQUdFU19GT1JfSU87CiAJCXRtcCA9IHNpemU7CisJCXNpemUgKz0gaGlnaG1lbV9zaXplOwogCQlmb3JfZWFjaF96b25lICh6b25lKQotCQkJaWYgKCFpc19oaWdobWVtKHpvbmUpICYmIHBvcHVsYXRlZF96b25lKHpvbmUpKSB7Ci0JCQkJdG1wIC09IHpvbmUtPmZyZWVfcGFnZXM7Ci0JCQkJdG1wICs9IHpvbmUtPmxvd21lbV9yZXNlcnZlW1pPTkVfTk9STUFMXTsKLQkJCQl0bXAgKz0gc25hcHNob3RfYWRkaXRpb25hbF9wYWdlcyh6b25lKTsKKwkJCWlmIChwb3B1bGF0ZWRfem9uZSh6b25lKSkgeworCQkJCWlmIChpc19oaWdobWVtKHpvbmUpKSB7CisJCQkJCWhpZ2htZW1fc2l6ZSAtPSB6b25lLT5mcmVlX3BhZ2VzOworCQkJCX0gZWxzZSB7CisJCQkJCXRtcCAtPSB6b25lLT5mcmVlX3BhZ2VzOworCQkJCQl0bXAgKz0gem9uZS0+bG93bWVtX3Jlc2VydmVbWk9ORV9OT1JNQUxdOworCQkJCQl0bXAgKz0gc25hcHNob3RfYWRkaXRpb25hbF9wYWdlcyh6b25lKTsKKwkJCQl9CiAJCQl9CisKKwkJaWYgKGhpZ2htZW1fc2l6ZSA8IDApCisJCQloaWdobWVtX3NpemUgPSAwOworCisJCXRtcCArPSBoaWdobWVtX3NpemU7CiAJCWlmICh0bXAgPiAwKSB7CiAJCQl0bXAgPSBfX3Nocmlua19tZW1vcnkodG1wKTsKIAkJCWlmICghdG1wKQpAQCAtMjEyLDcgKzI1Myw5IEBACiAJCX0KIAkJcHJpbnRrKCJcYiVjIiwgcFtpKyslNF0pOwogCX0gd2hpbGUgKHRtcCA+IDApOworCWRvX2dldHRpbWVvZmRheSgmc3RvcCk7CiAJcHJpbnRrKCJcYmRvbmUgKCVsdSBwYWdlcyBmcmVlZClcbiIsIHBhZ2VzKTsKKwlzd3N1c3Bfc2hvd19zcGVlZCgmc3RhcnQsICZzdG9wLCBwYWdlcywgIkZyZWVkIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIyMyw2ICsyNjYsNyBAQAogCiAJaWYgKChlcnJvciA9IGFyY2hfcHJlcGFyZV9zdXNwZW5kKCkpKQogCQlyZXR1cm4gZXJyb3I7CisKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCS8qIEF0IHRoaXMgcG9pbnQsIGRldmljZV9zdXNwZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBidXQgKm5vdCoKIAkgKiBkZXZpY2VfcG93ZXJfZG93bigpLiBXZSAqbXVzdCogZGV2aWNlX3Bvd2VyX2Rvd24oKSBub3cuCkBAIC0yMzUsMjMgKzI3OSwxNiBAQAogCQlnb3RvIEVuYWJsZV9pcnFzOwogCX0KIAotCWlmICgoZXJyb3IgPSBzYXZlX2hpZ2htZW0oKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IE5vdCBlbm91Z2ggZnJlZSBwYWdlcyBmb3IgaGlnaG1lbVxuIik7Ci0JCWdvdG8gUmVzdG9yZV9oaWdobWVtOwotCX0KLQogCXNhdmVfcHJvY2Vzc29yX3N0YXRlKCk7CiAJaWYgKChlcnJvciA9IHN3c3VzcF9hcmNoX3N1c3BlbmQoKSkpCiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWQgc3VzcGVuZGluZ1xuIiwgZXJyb3IpOwogCS8qIFJlc3RvcmUgY29udHJvbCBmbG93IG1hZ2ljYWxseSBhcHBlYXJzIGhlcmUgKi8KIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwotUmVzdG9yZV9oaWdobWVtOgotCXJlc3RvcmVfaGlnaG1lbSgpOwogCS8qIE5PVEU6ICBkZXZpY2VfcG93ZXJfdXAoKSBpcyBqdXN0IGEgcmVzdW1lKCkgZm9yIGRldmljZXMKIAkgKiB0aGF0IHN1c3BlbmRlZCB3aXRoIGlycXMgb2ZmIC4uLiBubyBvdmVyYWxsIHBvd2VydXAuCiAJICovCiAJZGV2aWNlX3Bvd2VyX3VwKCk7Ci1FbmFibGVfaXJxczoKKyBFbmFibGVfaXJxczoKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMjY4LDE4ICszMDUsMjMgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJTb21lIGRldmljZXMgZmFpbGVkIHRvIHBvd2VyIGRvd24sIHZlcnkgYmFkXG4iKTsKIAkvKiBXZSdsbCBpZ25vcmUgc2F2ZWQgc3RhdGUsIGJ1dCB0aGlzIGdldHMgcHJlZW1wdCBjb3VudCAoZXRjKSByaWdodCAqLwogCXNhdmVfcHJvY2Vzc29yX3N0YXRlKCk7Ci0JZXJyb3IgPSBzd3N1c3BfYXJjaF9yZXN1bWUoKTsKLQkvKiBDb2RlIGJlbG93IGlzIG9ubHkgZXZlciByZWFjaGVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gT3RoZXJ3aXNlCi0JICogZXhlY3V0aW9uIGNvbnRpbnVlcyBhdCBwbGFjZSB3aGVyZSBzd3N1c3BfYXJjaF9zdXNwZW5kIHdhcyBjYWxsZWQKLSAgICAgICAgICovCi0JQlVHX09OKCFlcnJvcik7CisJZXJyb3IgPSByZXN0b3JlX2hpZ2htZW0oKTsKKwlpZiAoIWVycm9yKSB7CisJCWVycm9yID0gc3dzdXNwX2FyY2hfcmVzdW1lKCk7CisJCS8qIFRoZSBjb2RlIGJlbG93IGlzIG9ubHkgZXZlciByZWFjaGVkIGluIGNhc2Ugb2YgYSBmYWlsdXJlLgorCQkgKiBPdGhlcndpc2UgZXhlY3V0aW9uIGNvbnRpbnVlcyBhdCBwbGFjZSB3aGVyZQorCQkgKiBzd3N1c3BfYXJjaF9zdXNwZW5kKCkgd2FzIGNhbGxlZAorICAgICAgICAJICovCisJCUJVR19PTighZXJyb3IpOworCQkvKiBUaGlzIGNhbGwgdG8gcmVzdG9yZV9oaWdobWVtKCkgdW5kb3MgdGhlIHByZXZpb3VzIG9uZSAqLworCQlyZXN0b3JlX2hpZ2htZW0oKTsKKwl9CiAJLyogVGhlIG9ubHkgcmVhc29uIHdoeSBzd3N1c3BfYXJjaF9yZXN1bWUoKSBjYW4gZmFpbCBpcyBtZW1vcnkgYmVpbmcKIAkgKiB2ZXJ5IHRpZ2h0LCBzbyB3ZSBoYXZlIHRvIGZyZWUgaXQgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQKIAkgKiBzdWJzZXF1ZW50IGZhaWx1cmVzCiAJICovCiAJc3dzdXNwX2ZyZWUoKTsKIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwotCXJlc3RvcmVfaGlnaG1lbSgpOwogCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIAlkZXZpY2VfcG93ZXJfdXAoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvdXNlci5jIGIva2VybmVsL3Bvd2VyL3VzZXIuYwppbmRleCBkOTkxZDNiLi44OTQ0M2I4IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvdXNlci5jCisrKyBiL2tlcm5lbC9wb3dlci91c2VyLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KQEAgLTIxLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC01NCw3ICs1Niw4IEBACiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKIAltZW1zZXQoJmRhdGEtPmhhbmRsZSwgMCwgc2l6ZW9mKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUpKTsKIAlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKSB7Ci0JCWRhdGEtPnN3YXAgPSBzd3N1c3BfcmVzdW1lX2RldmljZSA/IHN3YXBfdHlwZV9vZihzd3N1c3BfcmVzdW1lX2RldmljZSkgOiAtMTsKKwkJZGF0YS0+c3dhcCA9IHN3c3VzcF9yZXN1bWVfZGV2aWNlID8KKwkJCQlzd2FwX3R5cGVfb2Yoc3dzdXNwX3Jlc3VtZV9kZXZpY2UsIDApIDogLTE7CiAJCWRhdGEtPm1vZGUgPSBPX1JET05MWTsKIAl9IGVsc2UgewogCQlkYXRhLT5zd2FwID0gLTE7CkBAIC03NiwxMCArNzksMTAgQEAKIAlmcmVlX2FsbF9zd2FwX3BhZ2VzKGRhdGEtPnN3YXAsIGRhdGEtPmJpdG1hcCk7CiAJZnJlZV9iaXRtYXAoZGF0YS0+Yml0bWFwKTsKIAlpZiAoZGF0YS0+ZnJvemVuKSB7Ci0JCWRvd24oJnBtX3NlbSk7CisJCW11dGV4X2xvY2soJnBtX211dGV4KTsKIAkJdGhhd19wcm9jZXNzZXMoKTsKIAkJZW5hYmxlX25vbmJvb3RfY3B1cygpOwotCQl1cCgmcG1fc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwbV9tdXRleCk7CiAJfQogCWF0b21pY19pbmMoJmRldmljZV9hdmFpbGFibGUpOwogCXJldHVybiAwOwpAQCAtMTI0LDcgKzEyNyw4IEBACiB7CiAJaW50IGVycm9yID0gMDsKIAlzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YTsKLQlsb2ZmX3Qgb2Zmc2V0LCBhdmFpbDsKKwlsb2ZmX3QgYXZhaWw7CisJc2VjdG9yX3Qgb2Zmc2V0OwogCiAJaWYgKF9JT0NfVFlQRShjbWQpICE9IFNOQVBTSE9UX0lPQ19NQUdJQykKIAkJcmV0dXJuIC1FTk9UVFk7CkBAIC0xNDAsNyArMTQ0LDcgQEAKIAljYXNlIFNOQVBTSE9UX0ZSRUVaRToKIAkJaWYgKGRhdGEtPmZyb3plbikKIAkJCWJyZWFrOwotCQlkb3duKCZwbV9zZW0pOworCQltdXRleF9sb2NrKCZwbV9tdXRleCk7CiAJCWVycm9yID0gZGlzYWJsZV9ub25ib290X2NwdXMoKTsKIAkJaWYgKCFlcnJvcikgewogCQkJZXJyb3IgPSBmcmVlemVfcHJvY2Vzc2VzKCk7CkBAIC0xNTAsNyArMTU0LDcgQEAKIAkJCQllcnJvciA9IC1FQlVTWTsKIAkJCX0KIAkJfQotCQl1cCgmcG1fc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwbV9tdXRleCk7CiAJCWlmICghZXJyb3IpCiAJCQlkYXRhLT5mcm96ZW4gPSAxOwogCQlicmVhazsKQEAgLTE1OCwxMCArMTYyLDEwIEBACiAJY2FzZSBTTkFQU0hPVF9VTkZSRUVaRToKIAkJaWYgKCFkYXRhLT5mcm96ZW4pCiAJCQlicmVhazsKLQkJZG93bigmcG1fc2VtKTsKKwkJbXV0ZXhfbG9jaygmcG1fbXV0ZXgpOwogCQl0aGF3X3Byb2Nlc3NlcygpOwogCQllbmFibGVfbm9uYm9vdF9jcHVzKCk7Ci0JCXVwKCZwbV9zZW0pOworCQltdXRleF91bmxvY2soJnBtX211dGV4KTsKIAkJZGF0YS0+ZnJvemVuID0gMDsKIAkJYnJlYWs7CiAKQEAgLTE3MCw3ICsxNzQsNyBAQAogCQkJZXJyb3IgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQotCQlkb3duKCZwbV9zZW0pOworCQltdXRleF9sb2NrKCZwbV9tdXRleCk7CiAJCS8qIEZyZWUgbWVtb3J5IGJlZm9yZSBzaHV0dGluZyBkb3duIGRldmljZXMuICovCiAJCWVycm9yID0gc3dzdXNwX3Nocmlua19tZW1vcnkoKTsKIAkJaWYgKCFlcnJvcikgewpAQCAtMTgzLDcgKzE4Nyw3IEBACiAJCQl9CiAJCQlyZXN1bWVfY29uc29sZSgpOwogCQl9Ci0JCXVwKCZwbV9zZW0pOworCQltdXRleF91bmxvY2soJnBtX211dGV4KTsKIAkJaWYgKCFlcnJvcikKIAkJCWVycm9yID0gcHV0X3VzZXIoaW5fc3VzcGVuZCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOwogCQlpZiAoIWVycm9yKQpAQCAtMTkxLDEzICsxOTUsMTMgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNOQVBTSE9UX0FUT01JQ19SRVNUT1JFOgorCQlzbmFwc2hvdF93cml0ZV9maW5hbGl6ZSgmZGF0YS0+aGFuZGxlKTsKIAkJaWYgKGRhdGEtPm1vZGUgIT0gT19XUk9OTFkgfHwgIWRhdGEtPmZyb3plbiB8fAogCQkgICAgIXNuYXBzaG90X2ltYWdlX2xvYWRlZCgmZGF0YS0+aGFuZGxlKSkgewogCQkJZXJyb3IgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQotCQlzbmFwc2hvdF9mcmVlX3VudXNlZF9tZW1vcnkoJmRhdGEtPmhhbmRsZSk7Ci0JCWRvd24oJnBtX3NlbSk7CisJCW11dGV4X2xvY2soJnBtX211dGV4KTsKIAkJcG1fcHJlcGFyZV9jb25zb2xlKCk7CiAJCXN1c3BlbmRfY29uc29sZSgpOwogCQllcnJvciA9IGRldmljZV9zdXNwZW5kKFBNU0dfUFJFVEhBVyk7CkBAIC0yMDcsNyArMjExLDcgQEAKIAkJfQogCQlyZXN1bWVfY29uc29sZSgpOwogCQlwbV9yZXN0b3JlX2NvbnNvbGUoKTsKLQkJdXAoJnBtX3NlbSk7CisJCW11dGV4X3VubG9jaygmcG1fbXV0ZXgpOwogCQlicmVhazsKIAogCWNhc2UgU05BUFNIT1RfRlJFRToKQEAgLTIzOCwxMCArMjQyLDEwIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJb2Zmc2V0ID0gYWxsb2Nfc3dhcF9wYWdlKGRhdGEtPnN3YXAsIGRhdGEtPmJpdG1hcCk7CisJCW9mZnNldCA9IGFsbG9jX3N3YXBkZXZfYmxvY2soZGF0YS0+c3dhcCwgZGF0YS0+Yml0bWFwKTsKIAkJaWYgKG9mZnNldCkgewogCQkJb2Zmc2V0IDw8PSBQQUdFX1NISUZUOwotCQkJZXJyb3IgPSBwdXRfdXNlcihvZmZzZXQsIChsb2ZmX3QgX191c2VyICopYXJnKTsKKwkJCWVycm9yID0gcHV0X3VzZXIob2Zmc2V0LCAoc2VjdG9yX3QgX191c2VyICopYXJnKTsKIAkJfSBlbHNlIHsKIAkJCWVycm9yID0gLUVOT1NQQzsKIAkJfQpAQCAtMjY0LDcgKzI2OCw3IEBACiAJCQkgKiBzbyB3ZSBuZWVkIHRvIHJlY29kZSB0aGVtCiAJCQkgKi8KIAkJCWlmIChvbGRfZGVjb2RlX2RldihhcmcpKSB7Ci0JCQkJZGF0YS0+c3dhcCA9IHN3YXBfdHlwZV9vZihvbGRfZGVjb2RlX2RldihhcmcpKTsKKwkJCQlkYXRhLT5zd2FwID0gc3dhcF90eXBlX29mKG9sZF9kZWNvZGVfZGV2KGFyZyksIDApOwogCQkJCWlmIChkYXRhLT5zd2FwIDwgMCkKIAkJCQkJZXJyb3IgPSAtRU5PREVWOwogCQkJfSBlbHNlIHsKQEAgLTI4Miw3ICsyODYsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoZG93bl90cnlsb2NrKCZwbV9zZW0pKSB7CisJCWlmICghbXV0ZXhfdHJ5bG9jaygmcG1fbXV0ZXgpKSB7CiAJCQllcnJvciA9IC1FQlVTWTsKIAkJCWJyZWFrOwogCQl9CkBAIC0zMDksOCArMzEzLDY2IEBACiAJCWlmIChwbV9vcHMtPmZpbmlzaCkKIAkJCXBtX29wcy0+ZmluaXNoKFBNX1NVU1BFTkRfTUVNKTsKIAotT3V0UzM6Ci0JCXVwKCZwbV9zZW0pOworIE91dFMzOgorCQltdXRleF91bmxvY2soJnBtX211dGV4KTsKKwkJYnJlYWs7CisKKwljYXNlIFNOQVBTSE9UX1BNT1BTOgorCQlzd2l0Y2ggKGFyZykgeworCisJCWNhc2UgUE1PUFNfUFJFUEFSRToKKwkJCWlmIChwbV9vcHMtPnByZXBhcmUpIHsKKwkJCQllcnJvciA9IHBtX29wcy0+cHJlcGFyZShQTV9TVVNQRU5EX0RJU0spOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQTU9QU19FTlRFUjoKKwkJCWtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKFNZU1RFTV9TVVNQRU5EX0RJU0spOworCQkJZXJyb3IgPSBwbV9vcHMtPmVudGVyKFBNX1NVU1BFTkRfRElTSyk7CisJCQlicmVhazsKKworCQljYXNlIFBNT1BTX0ZJTklTSDoKKwkJCWlmIChwbV9vcHMgJiYgcG1fb3BzLT5maW5pc2gpIHsKKwkJCQlwbV9vcHMtPmZpbmlzaChQTV9TVVNQRU5EX0RJU0spOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiU05BUFNIT1RfUE1PUFM6IGludmFsaWQgYXJndW1lbnQgJWxkXG4iLCBhcmcpOworCQkJZXJyb3IgPSAtRUlOVkFMOworCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNOQVBTSE9UX1NFVF9TV0FQX0FSRUE6CisJCWlmIChkYXRhLT5iaXRtYXApIHsKKwkJCWVycm9yID0gLUVQRVJNOworCQl9IGVsc2UgeworCQkJc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEgc3dhcF9hcmVhOworCQkJZGV2X3Qgc3dkZXY7CisKKwkJCWVycm9yID0gY29weV9mcm9tX3VzZXIoJnN3YXBfYXJlYSwgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEpKTsKKwkJCWlmIChlcnJvcikgeworCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVzZXIgc3BhY2UgZW5jb2RlcyBkZXZpY2UgdHlwZXMgYXMgdHdvLWJ5dGUgdmFsdWVzLAorCQkJICogc28gd2UgbmVlZCB0byByZWNvZGUgdGhlbQorCQkJICovCisJCQlzd2RldiA9IG9sZF9kZWNvZGVfZGV2KHN3YXBfYXJlYS5kZXYpOworCQkJaWYgKHN3ZGV2KSB7CisJCQkJb2Zmc2V0ID0gc3dhcF9hcmVhLm9mZnNldDsKKwkJCQlkYXRhLT5zd2FwID0gc3dhcF90eXBlX29mKHN3ZGV2LCBvZmZzZXQpOworCQkJCWlmIChkYXRhLT5zd2FwIDwgMCkKKwkJCQkJZXJyb3IgPSAtRU5PREVWOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhLT5zd2FwID0gLTE7CisJCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJfQorCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTMyMSw3ICszODMsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc25hcHNob3RfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNuYXBzaG90X2ZvcHMgPSB7CiAJLm9wZW4gPSBzbmFwc2hvdF9vcGVuLAogCS5yZWxlYXNlID0gc25hcHNob3RfcmVsZWFzZSwKIAkucmVhZCA9IHNuYXBzaG90X3JlYWQsCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggZjdkNDI3ZS4uMTg1YmI0NSAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtNTIsOCArNTMsNiBAQAogCURFRkFVTFRfQ09OU09MRV9MT0dMRVZFTCwJLyogZGVmYXVsdF9jb25zb2xlX2xvZ2xldmVsICovCiB9OwogCi1FWFBPUlRfVU5VU0VEX1NZTUJPTChjb25zb2xlX3ByaW50ayk7ICAvKiAgSnVuZSAyMDA2ICAqLwotCiAvKgogICogTG93IGxldmVyIGRyaXZlcnMgbWF5IG5lZWQgdGhhdCB0byBrbm93IGlmIHRoZXkgY2FuIHNjaGVkdWxlIGluCiAgKiB0aGVpciB1bmJsYW5rKCkgY2FsbGJhY2sgb3Igbm90LiBTbyBsZXQncyBleHBvcnQgaXQuCkBAIC0zMzQsMTMgKzMzMywyNSBAQAogCX0KIH0KIAorc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGlnbm9yZV9sb2dsZXZlbDsKKworaW50IF9faW5pdCBpZ25vcmVfbG9nbGV2ZWxfc2V0dXAoY2hhciAqc3RyKQoreworCWlnbm9yZV9sb2dsZXZlbCA9IDE7CisJcHJpbnRrKEtFUk5fSU5GTyAiZGVidWc6IGlnbm9yaW5nIGxvZ2xldmVsIHNldHRpbmcuXG4iKTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJpZ25vcmVfbG9nbGV2ZWwiLCBpZ25vcmVfbG9nbGV2ZWxfc2V0dXApOworCiAvKgogICogV3JpdGUgb3V0IGNoYXJzIGZyb20gc3RhcnQgdG8gZW5kIC0gMSBpbmNsdXNpdmUKICAqLwogc3RhdGljIHZvaWQgX2NhbGxfY29uc29sZV9kcml2ZXJzKHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkJdW5zaWduZWQgbG9uZyBlbmQsIGludCBtc2dfbG9nX2xldmVsKQogewotCWlmIChtc2dfbG9nX2xldmVsIDwgY29uc29sZV9sb2dsZXZlbCAmJgorCWlmICgobXNnX2xvZ19sZXZlbCA8IGNvbnNvbGVfbG9nbGV2ZWwgfHwgaWdub3JlX2xvZ2xldmVsKSAmJgogCQkJY29uc29sZV9kcml2ZXJzICYmIHN0YXJ0ICE9IGVuZCkgewogCQlpZiAoKHN0YXJ0ICYgTE9HX0JVRl9NQVNLKSA+IChlbmQgJiBMT0dfQlVGX01BU0spKSB7CiAJCQkvKiB3cmFwcGVkIHdyaXRlICovCkBAIC02MzAsMTIgKzY0MSw3IEBACiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfc3lzbG9nKGludCB0eXBlLCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgbGVuKQogewotCXJldHVybiAwOwotfQotCi1pbnQgZG9fc3lzbG9nKGludCB0eXBlLCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgbGVuKQotewotCXJldHVybiAwOworCXJldHVybiAtRU5PU1lTOwogfQogCiBzdGF0aWMgdm9pZCBjYWxsX2NvbnNvbGVfZHJpdmVycyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKQEAgLTc3Niw3ICs3ODIsNiBAQAogewogCXJldHVybiBjb25zb2xlX2xvY2tlZDsKIH0KLUVYUE9SVF9VTlVTRURfU1lNQk9MKGlzX2NvbnNvbGVfbG9ja2VkKTsgIC8qICBKdW5lIDIwMDYgICovCiAKIC8qKgogICogcmVsZWFzZV9jb25zb2xlX3NlbSAtIHVubG9jayB0aGUgY29uc29sZSBzeXN0ZW0KQEAgLTExMDEsMyArMTEwNiwyMyBAQAogCQkJCXByaW50a19yYXRlbGltaXRfYnVyc3QpOwogfQogRVhQT1JUX1NZTUJPTChwcmludGtfcmF0ZWxpbWl0KTsKKworLyoqCisgKiBwcmludGtfdGltZWRfcmF0ZWxpbWl0IC0gY2FsbGVyLWNvbnRyb2xsZWQgcHJpbnRrIHJhdGVsaW1pdGluZworICogQGNhbGxlcl9qaWZmaWVzOiBwb2ludGVyIHRvIGNhbGxlcidzIHN0YXRlCisgKiBAaW50ZXJ2YWxfbXNlY3M6IG1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiBwcmludHMKKyAqCisgKiBwcmludGtfdGltZWRfcmF0ZWxpbWl0KCkgcmV0dXJucyB0cnVlIGlmIG1vcmUgdGhhbiBAaW50ZXJ2YWxfbXNlY3MKKyAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSBwcmludGtfdGltZWRfcmF0ZWxpbWl0KCkKKyAqIHJldHVybmVkIHRydWUuCisgKi8KK2Jvb2wgcHJpbnRrX3RpbWVkX3JhdGVsaW1pdCh1bnNpZ25lZCBsb25nICpjYWxsZXJfamlmZmllcywKKwkJCXVuc2lnbmVkIGludCBpbnRlcnZhbF9tc2VjcykKK3sKKwlpZiAoKmNhbGxlcl9qaWZmaWVzID09IDAgfHwgdGltZV9hZnRlcihqaWZmaWVzLCAqY2FsbGVyX2ppZmZpZXMpKSB7CisJCSpjYWxsZXJfamlmZmllcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGludGVydmFsX21zZWNzKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0wocHJpbnRrX3RpbWVkX3JhdGVsaW1pdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCBmOTQwYjQ2Li5mYjVlMDNkIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogc3RhdGljIGF0b21pY190ICpwcm9mX2J1ZmZlcjsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHByb2ZfbGVuLCBwcm9mX3NoaWZ0Owotc3RhdGljIGludCBwcm9mX29uIF9fcmVhZF9tb3N0bHk7CitpbnQgcHJvZl9vbiBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGNwdW1hc2tfdCBwcm9mX2NwdV9tYXNrID0gQ1BVX01BU0tfQUxMOwogI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcHJvZmlsZV9oaXQgKlsyXSwgY3B1X3Byb2ZpbGVfaGl0cyk7CkBAIC01MSw5ICs1MSwxOSBAQAogc3RhdGljIGludCBfX2luaXQgcHJvZmlsZV9zZXR1cChjaGFyICogc3RyKQogewogCXN0YXRpYyBjaGFyIF9faW5pdGRhdGEgc2NoZWRzdHJbXSA9ICJzY2hlZHVsZSI7CisJc3RhdGljIGNoYXIgX19pbml0ZGF0YSBzbGVlcHN0cltdID0gInNsZWVwIjsKIAlpbnQgcGFyOwogCi0JaWYgKCFzdHJuY21wKHN0ciwgc2NoZWRzdHIsIHN0cmxlbihzY2hlZHN0cikpKSB7CisJaWYgKCFzdHJuY21wKHN0ciwgc2xlZXBzdHIsIHN0cmxlbihzbGVlcHN0cikpKSB7CisJCXByb2Zfb24gPSBTTEVFUF9QUk9GSUxJTkc7CisJCWlmIChzdHJbc3RybGVuKHNsZWVwc3RyKV0gPT0gJywnKQorCQkJc3RyICs9IHN0cmxlbihzbGVlcHN0cikgKyAxOworCQlpZiAoZ2V0X29wdGlvbigmc3RyLCAmcGFyKSkKKwkJCXByb2Zfc2hpZnQgPSBwYXI7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJrZXJuZWwgc2xlZXAgcHJvZmlsaW5nIGVuYWJsZWQgKHNoaWZ0OiAlbGQpXG4iLAorCQkJcHJvZl9zaGlmdCk7CisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsIHNsZWVwc3RyLCBzdHJsZW4oc2xlZXBzdHIpKSkgewogCQlwcm9mX29uID0gU0NIRURfUFJPRklMSU5HOwogCQlpZiAoc3RyW3N0cmxlbihzY2hlZHN0cildID09ICcsJykKIAkJCXN0ciArPSBzdHJsZW4oc2NoZWRzdHIpICsgMTsKQEAgLTIwNCw3ICsyMTQsOCBAQAogICogcG9zaXRpb25zIHRvIHdoaWNoIGhpdHMgYXJlIGFjY291bnRlZCBkdXJpbmcgc2hvcnQgaW50ZXJ2YWxzIChlLmcuCiAgKiBzZXZlcmFsIHNlY29uZHMpIGlzIHVzdWFsbHkgdmVyeSBzbWFsbC4gRXhjbHVzaW9uIGZyb20gYnVmZmVyCiAgKiBmbGlwcGluZyBpcyBwcm92aWRlZCBieSBpbnRlcnJ1cHQgZGlzYWJsZW1lbnQgKG5vdGUgdGhhdCBmb3IKLSAqIFNDSEVEX1BST0ZJTElORyBwcm9maWxlX2hpdCgpIG1heSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQpLgorICogU0NIRURfUFJPRklMSU5HIG9yIFNMRUVQX1BST0ZJTElORyBwcm9maWxlX2hpdCgpIG1heSBiZSBjYWxsZWQgZnJvbQorICogcHJvY2VzcyBjb250ZXh0KS4KICAqIFRoZSBoYXNoIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGxpZ2h0d2VpZ2h0IGFzIG9wcG9zZWQgdG8gc3Ryb25nLAogICogYW5kIHdhcyB2YWd1ZWx5IGluc3BpcmVkIGJ5IHBwYzY0IGZpcm13YXJlLXN1cHBvcnRlZCBpbnZlcnRlZAogICogcGFnZXRhYmxlIGhhc2ggZnVuY3Rpb25zLCBidXQgdXNlcyBhIGZ1bGwgaGFzaHRhYmxlIGZ1bGwgb2YgZmluaXRlCkBAIC0yNTcsNyArMjY4LDcgQEAKIAltdXRleF91bmxvY2soJnByb2ZpbGVfZmxpcF9tdXRleCk7CiB9CiAKLXZvaWQgcHJvZmlsZV9oaXQoaW50IHR5cGUsIHZvaWQgKl9fcGMpCit2b2lkIHByb2ZpbGVfaGl0cyhpbnQgdHlwZSwgdm9pZCAqX19wYywgdW5zaWduZWQgaW50IG5yX2hpdHMpCiB7CiAJdW5zaWduZWQgbG9uZyBwcmltYXJ5LCBzZWNvbmRhcnksIGZsYWdzLCBwYyA9ICh1bnNpZ25lZCBsb25nKV9fcGM7CiAJaW50IGksIGosIGNwdTsKQEAgLTI3NCwyMSArMjg1LDMxIEBACiAJCXB1dF9jcHUoKTsKIAkJcmV0dXJuOwogCX0KKwkvKgorCSAqIFdlIGJ1ZmZlciB0aGUgZ2xvYmFsIHByb2ZpbGVyIGJ1ZmZlciBpbnRvIGEgcGVyLUNQVQorCSAqIHF1ZXVlIGFuZCB0aHVzIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGdsb2JhbCAoYW5kIHBvc3NpYmx5CisJICogTlVNQS1hbGllbikgYWNjZXNzZXMuIFRoZSB3cml0ZS1xdWV1ZSBpcyBzZWxmLWNvYWxlc2Npbmc6CisJICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWRvIHsKIAkJZm9yIChqID0gMDsgaiA8IFBST0ZJTEVfR1JQU1o7ICsraikgewogCQkJaWYgKGhpdHNbaSArIGpdLnBjID09IHBjKSB7Ci0JCQkJaGl0c1tpICsgal0uaGl0cysrOworCQkJCWhpdHNbaSArIGpdLmhpdHMgKz0gbnJfaGl0czsKIAkJCQlnb3RvIG91dDsKIAkJCX0gZWxzZSBpZiAoIWhpdHNbaSArIGpdLmhpdHMpIHsKIAkJCQloaXRzW2kgKyBqXS5wYyA9IHBjOwotCQkJCWhpdHNbaSArIGpdLmhpdHMgPSAxOworCQkJCWhpdHNbaSArIGpdLmhpdHMgPSBucl9oaXRzOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9CiAJCWkgPSAoaSArIHNlY29uZGFyeSkgJiAoTlJfUFJPRklMRV9ISVQgLSAxKTsKIAl9IHdoaWxlIChpICE9IHByaW1hcnkpOwotCWF0b21pY19pbmMoJnByb2ZfYnVmZmVyW3BjXSk7CisKKwkvKgorCSAqIEFkZCB0aGUgY3VycmVudCBoaXQocykgYW5kIGZsdXNoIHRoZSB3cml0ZS1xdWV1ZSBvdXQKKwkgKiB0byB0aGUgZ2xvYmFsIGJ1ZmZlcjoKKwkgKi8KKwlhdG9taWNfYWRkKG5yX2hpdHMsICZwcm9mX2J1ZmZlcltwY10pOwogCWZvciAoaSA9IDA7IGkgPCBOUl9QUk9GSUxFX0hJVDsgKytpKSB7CiAJCWF0b21pY19hZGQoaGl0c1tpXS5oaXRzLCAmcHJvZl9idWZmZXJbaGl0c1tpXS5wY10pOwogCQloaXRzW2ldLnBjID0gaGl0c1tpXS5oaXRzID0gMDsKQEAgLTI5OCw3ICszMTksNiBAQAogCXB1dF9jcHUoKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIGludCBfX2RldmluaXQgcHJvZmlsZV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICppbmZvLAogCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqX19jcHUpCiB7CkBAIC0zNTEsMTkgKzM3MSwxOSBAQAogCX0KIAlyZXR1cm4gTk9USUZZX09LOwogfQotI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogI2Vsc2UgLyogIUNPTkZJR19TTVAgKi8KICNkZWZpbmUgcHJvZmlsZV9mbGlwX2J1ZmZlcnMoKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBwcm9maWxlX2Rpc2NhcmRfZmxpcF9idWZmZXJzKCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBwcm9maWxlX2NwdV9jYWxsYmFjawkJTlVMTAogCi12b2lkIHByb2ZpbGVfaGl0KGludCB0eXBlLCB2b2lkICpfX3BjKQordm9pZCBwcm9maWxlX2hpdHMoaW50IHR5cGUsIHZvaWQgKl9fcGMsIHVuc2lnbmVkIGludCBucl9oaXRzKQogewogCXVuc2lnbmVkIGxvbmcgcGM7CiAKIAlpZiAocHJvZl9vbiAhPSB0eXBlIHx8ICFwcm9mX2J1ZmZlcikKIAkJcmV0dXJuOwogCXBjID0gKCh1bnNpZ25lZCBsb25nKV9fcGMgLSAodW5zaWduZWQgbG9uZylfc3RleHQpID4+IHByb2Zfc2hpZnQ7Ci0JYXRvbWljX2luYygmcHJvZl9idWZmZXJbbWluKHBjLCBwcm9mX2xlbiAtIDEpXSk7CisJYXRvbWljX2FkZChucl9oaXRzLCAmcHJvZl9idWZmZXJbbWluKHBjLCBwcm9mX2xlbiAtIDEpXSk7CiB9CiAjZW5kaWYgLyogIUNPTkZJR19TTVAgKi8KIApAQCAtNDQyLDcgKzQ2Miw4IEBACiAJcmVhZCA9IDA7CiAKIAl3aGlsZSAocCA8IHNpemVvZih1bnNpZ25lZCBpbnQpICYmIGNvdW50ID4gMCkgewotCQlwdXRfdXNlcigqKChjaGFyICopKCZzYW1wbGVfc3RlcCkrcCksYnVmKTsKKwkJaWYgKHB1dF91c2VyKCooKGNoYXIgKikoJnNhbXBsZV9zdGVwKStwKSxidWYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWJ1ZisrOyBwKys7IGNvdW50LS07IHJlYWQrKzsKIAl9CiAJcG50ID0gKGNoYXIgKilwcm9mX2J1ZmZlciArIHAgLSBzaXplb2YoYXRvbWljX3QpOwpAQCAtNDgwLDcgKzUwMSw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Byb2ZpbGVfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcHJvZmlsZV9vcGVyYXRpb25zID0gewogCS5yZWFkCQk9IHJlYWRfcHJvZmlsZSwKIAkud3JpdGUJCT0gd3JpdGVfcHJvZmlsZSwKIH07CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1cGRhdGUuYyBiL2tlcm5lbC9yY3VwZGF0ZS5jCmluZGV4IDI2YmI1ZmYuLjM1NTRiNzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwZGF0ZS5jCisrKyBiL2tlcm5lbC9yY3VwZGF0ZS5jCkBAIC0yMzUsMTIgKzIzNSwxNCBAQAogCiAJbGlzdCA9IHJkcC0+ZG9uZWxpc3Q7CiAJd2hpbGUgKGxpc3QpIHsKLQkJbmV4dCA9IHJkcC0+ZG9uZWxpc3QgPSBsaXN0LT5uZXh0OworCQluZXh0ID0gbGlzdC0+bmV4dDsKKwkJcHJlZmV0Y2gobmV4dCk7CiAJCWxpc3QtPmZ1bmMobGlzdCk7CiAJCWxpc3QgPSBuZXh0OwogCQlpZiAoKytjb3VudCA+PSByZHAtPmJsaW1pdCkKIAkJCWJyZWFrOwogCX0KKwlyZHAtPmRvbmVsaXN0ID0gbGlzdDsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJcmRwLT5xbGVuIC09IGNvdW50OwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggZTJiZGExOC4uYzUyZjk4MSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC00MDEsNyArNDAxLDcgQEAKIAljbGVhbnVwX3NyY3Vfc3RydWN0KCZzcmN1X2N0bCk7CiB9CiAKLXN0YXRpYyBpbnQgc3JjdV90b3J0dXJlX3JlYWRfbG9jayh2b2lkKQorc3RhdGljIGludCBzcmN1X3RvcnR1cmVfcmVhZF9sb2NrKHZvaWQpIF9fYWNxdWlyZXMoJnNyY3VfY3RsKQogewogCXJldHVybiBzcmN1X3JlYWRfbG9jaygmc3JjdV9jdGwpOwogfQpAQCAtNDE5LDcgKzQxOSw3IEBACiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShsb25nZGVsYXkpOwogfQogCi1zdGF0aWMgdm9pZCBzcmN1X3RvcnR1cmVfcmVhZF91bmxvY2soaW50IGlkeCkKK3N0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9yZWFkX3VubG9jayhpbnQgaWR4KSBfX3JlbGVhc2VzKCZzcmN1X2N0bCkKIHsKIAlzcmN1X3JlYWRfdW5sb2NrKCZzcmN1X2N0bCwgaWR4KTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9yZWxheS5jIGIva2VybmVsL3JlbGF5LmMKaW5kZXggZjA0YmJkYi4uYTQ3MDFlNyAxMDA2NDQKLS0tIGEva2VybmVsL3JlbGF5LmMKKysrIGIva2VybmVsL3JlbGF5LmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogICovCiBzdHJ1Y3QgcmNoYW5fYnVmICpyZWxheV9jcmVhdGVfYnVmKHN0cnVjdCByY2hhbiAqY2hhbikKIHsKLQlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcmNoYW5fYnVmKSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJjaGFuX2J1ZiksIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMzA4LDkgKzMwOCwxMCBAQAogICoJcmVhc29uIHdha2luZyBpcyBkZWZlcnJlZCBpcyB0aGF0IGNhbGxpbmcgZGlyZWN0bHkgZnJvbSB3cml0ZQogICoJY2F1c2VzIHByb2JsZW1zIGlmIHlvdSdyZSB3cml0aW5nIGZyb20gc2F5IHRoZSBzY2hlZHVsZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHdha2V1cF9yZWFkZXJzKHZvaWQgKnByaXZhdGUpCitzdGF0aWMgdm9pZCB3YWtldXBfcmVhZGVycyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gcHJpdmF0ZTsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJjaGFuX2J1Ziwgd2FrZV9yZWFkZXJzLndvcmspOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYnVmLT5yZWFkX3dhaXQpOwogfQogCkBAIC0zMjgsNyArMzI5LDcgQEAKIAlpZiAoaW5pdCkgewogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZidWYtPnJlYWRfd2FpdCk7CiAJCWtyZWZfaW5pdCgmYnVmLT5rcmVmKTsKLQkJSU5JVF9XT1JLKCZidWYtPndha2VfcmVhZGVycywgTlVMTCwgTlVMTCk7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZidWYtPndha2VfcmVhZGVycywgTlVMTCk7CiAJfSBlbHNlIHsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmYnVmLT53YWtlX3JlYWRlcnMpOwogCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwpAQCAtNDc4LDcgKzQ3OSw3IEBACiAJaWYgKCEoc3ViYnVmX3NpemUgJiYgbl9zdWJidWZzKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQljaGFuID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJjaGFuKSwgR0ZQX0tFUk5FTCk7CisJY2hhbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByY2hhbiksIEdGUF9LRVJORUwpOwogCWlmICghY2hhbikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTU0OSw3ICs1NTAsOCBAQAogCQkJYnVmLT5wYWRkaW5nW29sZF9zdWJidWZdOwogCQlzbXBfbWIoKTsKIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmJ1Zi0+cmVhZF93YWl0KSkgewotCQkJUFJFUEFSRV9XT1JLKCZidWYtPndha2VfcmVhZGVycywgd2FrZXVwX3JlYWRlcnMsIGJ1Zik7CisJCQlQUkVQQVJFX0RFTEFZRURfV09SSygmYnVmLT53YWtlX3JlYWRlcnMsCisJCQkJCSAgICAgd2FrZXVwX3JlYWRlcnMpOwogCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZidWYtPndha2VfcmVhZGVycywgMSk7CiAJCX0KIAl9CkBAIC05NTcsNyArOTU5LDcgQEAKIAlpZiAoIWRlc2MtPmNvdW50KQogCQlyZXR1cm4gMDsKIAotCW11dGV4X2xvY2soJmZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF9sb2NrKCZmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKIAlkbyB7CiAJCWlmICghcmVsYXlfZmlsZV9yZWFkX2F2YWlsKGJ1ZiwgKnBwb3MpKQogCQkJYnJlYWs7CkBAIC05NzcsNyArOTc5LDcgQEAKIAkJCSpwcG9zID0gcmVsYXlfZmlsZV9yZWFkX2VuZF9wb3MoYnVmLCByZWFkX3N0YXJ0LCByZXQpOwogCQl9CiAJfSB3aGlsZSAoZGVzYy0+Y291bnQgJiYgcmV0KTsKLQltdXRleF91bmxvY2soJmZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF91bmxvY2soJmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwogCiAJcmV0dXJuIGRlc2MtPndyaXR0ZW47CiB9CkBAIC0xMDExLDcgKzEwMTMsNyBAQAogCQkJCSAgICAgICBhY3RvciwgJmRlc2MpOwogfQogCi1zdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlbGF5X2ZpbGVfb3BlcmF0aW9ucyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVsYXlfZmlsZV9vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IHJlbGF5X2ZpbGVfb3BlbiwKIAkucG9sbAkJPSByZWxheV9maWxlX3BvbGwsCiAJLm1tYXAJCT0gcmVsYXlfZmlsZV9tbWFwLApkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCA2ZGU2MGMxLi43YjlhNDk3IDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtODgsNyArODgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJlc291cmNlX29wID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByZXNvdXJjZV9vcCA9IHsKIAkuc3RhcnQJPSByX3N0YXJ0LAogCS5uZXh0CT0gcl9uZXh0LAogCS5zdG9wCT0gcl9zdG9wLApAQCAtMTE1LDE0ICsxMTUsMTQgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2lvcG9ydHNfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW9wb3J0c19vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IGlvcG9ydHNfb3BlbiwKIAkucmVhZAkJPSBzZXFfcmVhZCwKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKIAkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19pb21lbV9vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19pb21lbV9vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IGlvbWVtX29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYyBiL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCmluZGV4IDZkY2VhOWQuLjAxNWZjNjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCisrKyBiL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgInJ0bXV0ZXguaCIKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCAwOTRiNTY4Li41Y2Q4MzNiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTE2MCwxNSArMTYwLDYgQEAKICNkZWZpbmUgVEFTS19QUkVFTVBUU19DVVJSKHAsIHJxKSBcCiAJKChwKS0+cHJpbyA8IChycSktPmN1cnItPnByaW8pCiAKLS8qCi0gKiB0YXNrX3RpbWVzbGljZSgpIHNjYWxlcyB1c2VyLW5pY2UgdmFsdWVzIFsgLTIwIC4uLiAwIC4uLiAxOSBdCi0gKiB0byB0aW1lIHNsaWNlIHZhbHVlczogWzgwMG1zIC4uLiAxMDBtcyAuLi4gNW1zXQotICoKLSAqIFRoZSBoaWdoZXIgYSB0aHJlYWQncyBwcmlvcml0eSwgdGhlIGJpZ2dlciB0aW1lc2xpY2VzCi0gKiBpdCBnZXRzIGR1cmluZyBvbmUgcm91bmQgb2YgZXhlY3V0aW9uLiBCdXQgZXZlbiB0aGUgbG93ZXN0Ci0gKiBwcmlvcml0eSB0aHJlYWQgZ2V0cyBNSU5fVElNRVNMSUNFIHdvcnRoIG9mIGV4ZWN1dGlvbiB0aW1lLgotICovCi0KICNkZWZpbmUgU0NBTEVfUFJJTyh4LCBwcmlvKSBcCiAJbWF4KHggKiAoTUFYX1BSSU8gLSBwcmlvKSAvIChNQVhfVVNFUl9QUklPIC8gMiksIE1JTl9USU1FU0xJQ0UpCiAKQEAgLTE4MCw2ICsxNzEsMTUgQEAKIAkJcmV0dXJuIFNDQUxFX1BSSU8oREVGX1RJTUVTTElDRSwgc3RhdGljX3ByaW8pOwogfQogCisvKgorICogdGFza190aW1lc2xpY2UoKSBzY2FsZXMgdXNlci1uaWNlIHZhbHVlcyBbIC0yMCAuLi4gMCAuLi4gMTkgXQorICogdG8gdGltZSBzbGljZSB2YWx1ZXM6IFs4MDBtcyAuLi4gMTAwbXMgLi4uIDVtc10KKyAqCisgKiBUaGUgaGlnaGVyIGEgdGhyZWFkJ3MgcHJpb3JpdHksIHRoZSBiaWdnZXIgdGltZXNsaWNlcworICogaXQgZ2V0cyBkdXJpbmcgb25lIHJvdW5kIG9mIGV4ZWN1dGlvbi4gQnV0IGV2ZW4gdGhlIGxvd2VzdAorICogcHJpb3JpdHkgdGhyZWFkIGdldHMgTUlOX1RJTUVTTElDRSB3b3J0aCBvZiBleGVjdXRpb24gdGltZS4KKyAqLworCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0YXNrX3RpbWVzbGljZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJcmV0dXJuIHN0YXRpY19wcmlvX3RpbWVzbGljZShwLT5zdGF0aWNfcHJpbyk7CkBAIC0yMjUsOCArMjI1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBucl91bmludGVycnVwdGlibGU7CiAKIAl1bnNpZ25lZCBsb25nIGV4cGlyZWRfdGltZXN0YW1wOwotCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXBfbGFzdF90aWNrOworCS8qIENhY2hlZCB0aW1lc3RhbXAgc2V0IGJ5IHVwZGF0ZV9jcHVfY2xvY2soKSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBtb3N0X3JlY2VudF90aW1lc3RhbXA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyLCAqaWRsZTsKKwl1bnNpZ25lZCBsb25nIG5leHRfYmFsYW5jZTsKIAlzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2X21tOwogCXN0cnVjdCBwcmlvX2FycmF5ICphY3RpdmUsICpleHBpcmVkLCBhcnJheXNbMl07CiAJaW50IGJlc3RfZXhwaXJlZF9wcmlvOwpAQCAtNDI2LDcgKzQyOCw3IEBACiAgKiBidW1wIHRoaXMgdXAgd2hlbiBjaGFuZ2luZyB0aGUgb3V0cHV0IGZvcm1hdCBvciB0aGUgbWVhbmluZyBvZiBhbiBleGlzdGluZwogICogZm9ybWF0LCBzbyB0aGF0IHRvb2xzIGNhbiBhZGFwdCAob3IgYWJvcnQpCiAgKi8KLSNkZWZpbmUgU0NIRURTVEFUX1ZFUlNJT04gMTIKKyNkZWZpbmUgU0NIRURTVEFUX1ZFUlNJT04gMTQKIAogc3RhdGljIGludCBzaG93X3NjaGVkc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKQEAgLTQ2NCw3ICs0NjYsOCBAQAogCQkJc2VxX3ByaW50ZihzZXEsICJkb21haW4lZCAlcyIsIGRjbnQrKywgbWFza19zdHIpOwogCQkJZm9yIChpdHlwZSA9IFNDSEVEX0lETEU7IGl0eXBlIDwgTUFYX0lETEVfVFlQRVM7CiAJCQkJCWl0eXBlKyspIHsKLQkJCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1IiwKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgIgorCQkJCQkJIiVsdSIsCiAJCQkJICAgIHNkLT5sYl9jbnRbaXR5cGVdLAogCQkJCSAgICBzZC0+bGJfYmFsYW5jZWRbaXR5cGVdLAogCQkJCSAgICBzZC0+bGJfZmFpbGVkW2l0eXBlXSwKQEAgLTQ3NCwxMSArNDc3LDEzIEBACiAJCQkJICAgIHNkLT5sYl9ub2J1c3lxW2l0eXBlXSwKIAkJCQkgICAgc2QtPmxiX25vYnVzeWdbaXR5cGVdKTsKIAkJCX0KLQkJCXNlcV9wcmludGYoc2VxLCAiICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1XG4iLAorCQkJc2VxX3ByaW50ZihzZXEsICIgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUiCisJCQkgICAgIiAlbHUgJWx1ICVsdVxuIiwKIAkJCSAgICBzZC0+YWxiX2NudCwgc2QtPmFsYl9mYWlsZWQsIHNkLT5hbGJfcHVzaGVkLAogCQkJICAgIHNkLT5zYmVfY250LCBzZC0+c2JlX2JhbGFuY2VkLCBzZC0+c2JlX3B1c2hlZCwKIAkJCSAgICBzZC0+c2JmX2NudCwgc2QtPnNiZl9iYWxhbmNlZCwgc2QtPnNiZl9wdXNoZWQsCi0JCQkgICAgc2QtPnR0d3Vfd2FrZV9yZW1vdGUsIHNkLT50dHd1X21vdmVfYWZmaW5lLCBzZC0+dHR3dV9tb3ZlX2JhbGFuY2UpOworCQkJICAgIHNkLT50dHd1X3dha2VfcmVtb3RlLCBzZC0+dHR3dV9tb3ZlX2FmZmluZSwKKwkJCSAgICBzZC0+dHR3dV9tb3ZlX2JhbGFuY2UpOwogCQl9CiAJCXByZWVtcHRfZW5hYmxlKCk7CiAjZW5kaWYKQEAgLTUwNSw3ICs1MTAsNyBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zY2hlZHN0YXRfb3BlcmF0aW9ucyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zY2hlZHN0YXRfb3BlcmF0aW9ucyA9IHsKIAkub3BlbiAgICA9IHNjaGVkc3RhdF9vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCkBAIC01NDcsNyArNTUyLDcgQEAKICNlbmRpZgogCiAvKgotICogcnFfbG9jayAtIGxvY2sgYSBnaXZlbiBydW5xdWV1ZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICogdGhpc19ycV9sb2NrIC0gbG9jayB0aGlzIHJ1bnF1ZXVlIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJxICp0aGlzX3JxX2xvY2sodm9pZCkKIAlfX2FjcXVpcmVzKHJxLT5sb2NrKQpAQCAtOTM4LDE4ICs5NDMsMzEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbm93OwogCisJaWYgKHJ0X3Rhc2socCkpCisJCWdvdG8gb3V0OworCiAJbm93ID0gc2NoZWRfY2xvY2soKTsKICNpZmRlZiBDT05GSUdfU01QCiAJaWYgKCFsb2NhbCkgewogCQkvKiBDb21wZW5zYXRlIGZvciBkcmlmdGluZyBzY2hlZF9jbG9jayAqLwogCQlzdHJ1Y3QgcnEgKnRoaXNfcnEgPSB0aGlzX3JxKCk7Ci0JCW5vdyA9IChub3cgLSB0aGlzX3JxLT50aW1lc3RhbXBfbGFzdF90aWNrKQotCQkJKyBycS0+dGltZXN0YW1wX2xhc3RfdGljazsKKwkJbm93ID0gKG5vdyAtIHRoaXNfcnEtPm1vc3RfcmVjZW50X3RpbWVzdGFtcCkKKwkJCSsgcnEtPm1vc3RfcmVjZW50X3RpbWVzdGFtcDsKIAl9CiAjZW5kaWYKIAotCWlmICghcnRfdGFzayhwKSkKLQkJcC0+cHJpbyA9IHJlY2FsY190YXNrX3ByaW8ocCwgbm93KTsKKwkvKgorCSAqIFNsZWVwIHRpbWUgaXMgaW4gdW5pdHMgb2YgbmFub3NlY3MsIHNvIHNoaWZ0IGJ5IDIwIHRvIGdldCBhCisJICogbWlsbGlzZWNvbmRzLXJhbmdlIGVzdGltYXRpb24gb2YgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIHRhc2sKKwkgKiBzcGVudCBzbGVlcGluZzoKKwkgKi8KKwlpZiAodW5saWtlbHkocHJvZl9vbiA9PSBTTEVFUF9QUk9GSUxJTkcpKSB7CisJCWlmIChwLT5zdGF0ZSA9PSBUQVNLX1VOSU5URVJSVVBUSUJMRSkKKwkJCXByb2ZpbGVfaGl0cyhTTEVFUF9QUk9GSUxJTkcsICh2b2lkICopZ2V0X3djaGFuKHApLAorCQkJCSAgICAgKG5vdyAtIHAtPnRpbWVzdGFtcCkgPj4gMjApOworCX0KKworCXAtPnByaW8gPSByZWNhbGNfdGFza19wcmlvKHAsIG5vdyk7CiAKIAkvKgogCSAqIFRoaXMgY2hlY2tzIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiB1bmludGVycnVwdGlibGUgdGFzawpAQCAtOTc0LDcgKzk5Miw3IEBACiAJCX0KIAl9CiAJcC0+dGltZXN0YW1wID0gbm93OwotCitvdXQ6CiAJX19hY3RpdmF0ZV90YXNrKHAsIHJxKTsKIH0KIApAQCAtMTQzOSw3ICsxNDU3LDkgQEAKIAogCQlpZiAodGhpc19zZC0+ZmxhZ3MgJiBTRF9XQUtFX0FGRklORSkgewogCQkJdW5zaWduZWQgbG9uZyB0bCA9IHRoaXNfbG9hZDsKLQkJCXVuc2lnbmVkIGxvbmcgdGxfcGVyX3Rhc2sgPSBjcHVfYXZnX2xvYWRfcGVyX3Rhc2sodGhpc19jcHUpOworCQkJdW5zaWduZWQgbG9uZyB0bF9wZXJfdGFzazsKKworCQkJdGxfcGVyX3Rhc2sgPSBjcHVfYXZnX2xvYWRfcGVyX3Rhc2sodGhpc19jcHUpOwogCiAJCQkvKgogCQkJICogSWYgc3luYyB3YWtldXAgdGhlbiBzdWJ0cmFjdCB0aGUgKG1heGltdW0gcG9zc2libGUpCkBAIC0xNjc3LDggKzE2OTcsOCBAQAogCQkgKiBOb3QgdGhlIGxvY2FsIENQVSAtIG11c3QgYWRqdXN0IHRpbWVzdGFtcC4gVGhpcyBzaG91bGQKIAkJICogZ2V0IG9wdGltaXNlZCBhd2F5IGluIHRoZSAhQ09ORklHX1NNUCBjYXNlLgogCQkgKi8KLQkJcC0+dGltZXN0YW1wID0gKHAtPnRpbWVzdGFtcCAtIHRoaXNfcnEtPnRpbWVzdGFtcF9sYXN0X3RpY2spCi0JCQkJCSsgcnEtPnRpbWVzdGFtcF9sYXN0X3RpY2s7CisJCXAtPnRpbWVzdGFtcCA9IChwLT50aW1lc3RhbXAgLSB0aGlzX3JxLT5tb3N0X3JlY2VudF90aW1lc3RhbXApCisJCQkJCSsgcnEtPm1vc3RfcmVjZW50X3RpbWVzdGFtcDsKIAkJX19hY3RpdmF0ZV90YXNrKHAsIHJxKTsKIAkJaWYgKFRBU0tfUFJFRU1QVFNfQ1VSUihwLCBycSkpCiAJCQlyZXNjaGVkX3Rhc2socnEtPmN1cnIpOwpAQCAtMTk0MSw2ICsxOTYxLDcgQEAKIAlfX2FjcXVpcmVzKHJxMS0+bG9jaykKIAlfX2FjcXVpcmVzKHJxMi0+bG9jaykKIHsKKwlCVUdfT04oIWlycXNfZGlzYWJsZWQoKSk7CiAJaWYgKHJxMSA9PSBycTIpIHsKIAkJc3Bpbl9sb2NrKCZycTEtPmxvY2spOwogCQlfX2FjcXVpcmUocnEyLT5sb2NrKTsJLyogRmFrZSBpdCBvdXQgOykgKi8KQEAgLTE5ODAsNiArMjAwMSwxMSBAQAogCV9fYWNxdWlyZXMoYnVzaWVzdC0+bG9jaykKIAlfX2FjcXVpcmVzKHRoaXNfcnEtPmxvY2spCiB7CisJaWYgKHVubGlrZWx5KCFpcnFzX2Rpc2FibGVkKCkpKSB7CisJCS8qIHByaW50aygpIGRvZXNuJ3Qgd29yayBnb29kIHVuZGVyIHJxLT5sb2NrICovCisJCXNwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKKwkJQlVHX09OKDEpOworCX0KIAlpZiAodW5saWtlbHkoIXNwaW5fdHJ5bG9jaygmYnVzaWVzdC0+bG9jaykpKSB7CiAJCWlmIChidXNpZXN0IDwgdGhpc19ycSkgewogCQkJc3Bpbl91bmxvY2soJnRoaXNfcnEtPmxvY2spOwpAQCAtMjA1MCw4ICsyMDc2LDggQEAKIAlzZXRfdGFza19jcHUocCwgdGhpc19jcHUpOwogCWluY19ucl9ydW5uaW5nKHAsIHRoaXNfcnEpOwogCWVucXVldWVfdGFzayhwLCB0aGlzX2FycmF5KTsKLQlwLT50aW1lc3RhbXAgPSAocC0+dGltZXN0YW1wIC0gc3JjX3JxLT50aW1lc3RhbXBfbGFzdF90aWNrKQotCQkJCSsgdGhpc19ycS0+dGltZXN0YW1wX2xhc3RfdGljazsKKwlwLT50aW1lc3RhbXAgPSAocC0+dGltZXN0YW1wIC0gc3JjX3JxLT5tb3N0X3JlY2VudF90aW1lc3RhbXApCisJCQkJKyB0aGlzX3JxLT5tb3N0X3JlY2VudF90aW1lc3RhbXA7CiAJLyoKIAkgKiBOb3RlIHRoYXQgaWRsZSB0aHJlYWRzIGhhdmUgYSBwcmlvIG9mIE1BWF9QUklPLCBmb3IgdGhpcyB0ZXN0CiAJICogdG8gYmUgYWx3YXlzIHRydWUgZm9yIHRoZW0uCkBAIC0yMDg3LDEwICsyMTEzLDE1IEBACiAJICogMikgdG9vIG1hbnkgYmFsYW5jZSBhdHRlbXB0cyBoYXZlIGZhaWxlZC4KIAkgKi8KIAotCWlmIChzZC0+bnJfYmFsYW5jZV9mYWlsZWQgPiBzZC0+Y2FjaGVfbmljZV90cmllcykKKwlpZiAoc2QtPm5yX2JhbGFuY2VfZmFpbGVkID4gc2QtPmNhY2hlX25pY2VfdHJpZXMpIHsKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCQlpZiAodGFza19ob3QocCwgcnEtPm1vc3RfcmVjZW50X3RpbWVzdGFtcCwgc2QpKQorCQkJc2NoZWRzdGF0X2luYyhzZCwgbGJfaG90X2dhaW5lZFtpZGxlXSk7CisjZW5kaWYKIAkJcmV0dXJuIDE7CisJfQogCi0JaWYgKHRhc2tfaG90KHAsIHJxLT50aW1lc3RhbXBfbGFzdF90aWNrLCBzZCkpCisJaWYgKHRhc2tfaG90KHAsIHJxLT5tb3N0X3JlY2VudF90aW1lc3RhbXAsIHNkKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CkBAIC0yMTg4LDExICsyMjE5LDYgQEAKIAkJZ290byBza2lwX2JpdG1hcDsKIAl9CiAKLSNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCWlmICh0YXNrX2hvdCh0bXAsIGJ1c2llc3QtPnRpbWVzdGFtcF9sYXN0X3RpY2ssIHNkKSkKLQkJc2NoZWRzdGF0X2luYyhzZCwgbGJfaG90X2dhaW5lZFtpZGxlXSk7Ci0jZW5kaWYKLQogCXB1bGxfdGFzayhidXNpZXN0LCBhcnJheSwgdG1wLCB0aGlzX3JxLCBkc3RfYXJyYXksIHRoaXNfY3B1KTsKIAlwdWxsZWQrKzsKIAlyZW1fbG9hZF9tb3ZlIC09IHRtcC0+bG9hZF93ZWlnaHQ7CkBAIC0yMjMwLDcgKzIyNTYsNyBAQAogc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCAqCiBmaW5kX2J1c2llc3RfZ3JvdXAoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCB0aGlzX2NwdSwKIAkJICAgdW5zaWduZWQgbG9uZyAqaW1iYWxhbmNlLCBlbnVtIGlkbGVfdHlwZSBpZGxlLCBpbnQgKnNkX2lkbGUsCi0JCSAgIGNwdW1hc2tfdCAqY3B1cykKKwkJICAgY3B1bWFza190ICpjcHVzLCBpbnQgKmJhbGFuY2UpCiB7CiAJc3RydWN0IHNjaGVkX2dyb3VwICpidXNpZXN0ID0gTlVMTCwgKnRoaXMgPSBOVUxMLCAqZ3JvdXAgPSBzZC0+Z3JvdXBzOwogCXVuc2lnbmVkIGxvbmcgbWF4X2xvYWQsIGF2Z19sb2FkLCB0b3RhbF9sb2FkLCB0aGlzX2xvYWQsIHRvdGFsX3B3cjsKQEAgLTIyNTksMTAgKzIyODUsMTQgQEAKIAkJdW5zaWduZWQgbG9uZyBsb2FkLCBncm91cF9jYXBhY2l0eTsKIAkJaW50IGxvY2FsX2dyb3VwOwogCQlpbnQgaTsKKwkJdW5zaWduZWQgaW50IGJhbGFuY2VfY3B1ID0gLTEsIGZpcnN0X2lkbGVfY3B1ID0gMDsKIAkJdW5zaWduZWQgbG9uZyBzdW1fbnJfcnVubmluZywgc3VtX3dlaWdodGVkX2xvYWQ7CiAKIAkJbG9jYWxfZ3JvdXAgPSBjcHVfaXNzZXQodGhpc19jcHUsIGdyb3VwLT5jcHVtYXNrKTsKIAorCQlpZiAobG9jYWxfZ3JvdXApCisJCQliYWxhbmNlX2NwdSA9IGZpcnN0X2NwdShncm91cC0+Y3B1bWFzayk7CisKIAkJLyogVGFsbHkgdXAgdGhlIGxvYWQgb2YgYWxsIENQVXMgaW4gdGhlIGdyb3VwICovCiAJCXN1bV93ZWlnaHRlZF9sb2FkID0gc3VtX25yX3J1bm5pbmcgPSBhdmdfbG9hZCA9IDA7CiAKQEAgLTIyNzgsOSArMjMwOCwxNCBAQAogCQkJCSpzZF9pZGxlID0gMDsKIAogCQkJLyogQmlhcyBiYWxhbmNpbmcgdG93YXJkIGNwdXMgb2Ygb3VyIGRvbWFpbiAqLwotCQkJaWYgKGxvY2FsX2dyb3VwKQorCQkJaWYgKGxvY2FsX2dyb3VwKSB7CisJCQkJaWYgKGlkbGVfY3B1KGkpICYmICFmaXJzdF9pZGxlX2NwdSkgeworCQkJCQlmaXJzdF9pZGxlX2NwdSA9IDE7CisJCQkJCWJhbGFuY2VfY3B1ID0gaTsKKwkJCQl9CisKIAkJCQlsb2FkID0gdGFyZ2V0X2xvYWQoaSwgbG9hZF9pZHgpOwotCQkJZWxzZQorCQkJfSBlbHNlCiAJCQkJbG9hZCA9IHNvdXJjZV9sb2FkKGksIGxvYWRfaWR4KTsKIAogCQkJYXZnX2xvYWQgKz0gbG9hZDsKQEAgLTIyODgsNiArMjMyMywxNiBAQAogCQkJc3VtX3dlaWdodGVkX2xvYWQgKz0gcnEtPnJhd193ZWlnaHRlZF9sb2FkOwogCQl9CiAKKwkJLyoKKwkJICogRmlyc3QgaWRsZSBjcHUgb3IgdGhlIGZpcnN0IGNwdShidXNpZXN0KSBpbiB0aGlzIHNjaGVkIGdyb3VwCisJCSAqIGlzIGVsaWdpYmxlIGZvciBkb2luZyBsb2FkIGJhbGFuY2luZyBhdCB0aGlzIGFuZCBhYm92ZQorCQkgKiBkb21haW5zLgorCQkgKi8KKwkJaWYgKGxvY2FsX2dyb3VwICYmIGJhbGFuY2VfY3B1ICE9IHRoaXNfY3B1ICYmIGJhbGFuY2UpIHsKKwkJCSpiYWxhbmNlID0gMDsKKwkJCWdvdG8gcmV0OworCQl9CisKIAkJdG90YWxfbG9hZCArPSBhdmdfbG9hZDsKIAkJdG90YWxfcHdyICs9IGdyb3VwLT5jcHVfcG93ZXI7CiAKQEAgLTI0NDcsMTggKzI0OTIsMjEgQEAKIAkJcHdyX25vdyAvPSBTQ0hFRF9MT0FEX1NDQUxFOwogCiAJCS8qIEFtb3VudCBvZiBsb2FkIHdlJ2Qgc3VidHJhY3QgKi8KLQkJdG1wID0gYnVzaWVzdF9sb2FkX3Blcl90YXNrKlNDSEVEX0xPQURfU0NBTEUvYnVzaWVzdC0+Y3B1X3Bvd2VyOworCQl0bXAgPSBidXNpZXN0X2xvYWRfcGVyX3Rhc2sgKiBTQ0hFRF9MT0FEX1NDQUxFIC8KKwkJCWJ1c2llc3QtPmNwdV9wb3dlcjsKIAkJaWYgKG1heF9sb2FkID4gdG1wKQogCQkJcHdyX21vdmUgKz0gYnVzaWVzdC0+Y3B1X3Bvd2VyICoKIAkJCQltaW4oYnVzaWVzdF9sb2FkX3Blcl90YXNrLCBtYXhfbG9hZCAtIHRtcCk7CiAKIAkJLyogQW1vdW50IG9mIGxvYWQgd2UnZCBhZGQgKi8KLQkJaWYgKG1heF9sb2FkKmJ1c2llc3QtPmNwdV9wb3dlciA8Ci0JCQkJYnVzaWVzdF9sb2FkX3Blcl90YXNrKlNDSEVEX0xPQURfU0NBTEUpCi0JCQl0bXAgPSBtYXhfbG9hZCpidXNpZXN0LT5jcHVfcG93ZXIvdGhpcy0+Y3B1X3Bvd2VyOworCQlpZiAobWF4X2xvYWQgKiBidXNpZXN0LT5jcHVfcG93ZXIgPAorCQkJCWJ1c2llc3RfbG9hZF9wZXJfdGFzayAqIFNDSEVEX0xPQURfU0NBTEUpCisJCQl0bXAgPSBtYXhfbG9hZCAqIGJ1c2llc3QtPmNwdV9wb3dlciAvIHRoaXMtPmNwdV9wb3dlcjsKIAkJZWxzZQotCQkJdG1wID0gYnVzaWVzdF9sb2FkX3Blcl90YXNrKlNDSEVEX0xPQURfU0NBTEUvdGhpcy0+Y3B1X3Bvd2VyOwotCQlwd3JfbW92ZSArPSB0aGlzLT5jcHVfcG93ZXIqbWluKHRoaXNfbG9hZF9wZXJfdGFzaywgdGhpc19sb2FkICsgdG1wKTsKKwkJCXRtcCA9IGJ1c2llc3RfbG9hZF9wZXJfdGFzayAqIFNDSEVEX0xPQURfU0NBTEUgLworCQkJCXRoaXMtPmNwdV9wb3dlcjsKKwkJcHdyX21vdmUgKz0gdGhpcy0+Y3B1X3Bvd2VyICoKKwkJCW1pbih0aGlzX2xvYWRfcGVyX3Rhc2ssIHRoaXNfbG9hZCArIHRtcCk7CiAJCXB3cl9tb3ZlIC89IFNDSEVEX0xPQURfU0NBTEU7CiAKIAkJLyogTW92ZSBpZiB3ZSBnYWluIHRocm91Z2hwdXQgKi8KQEAgLTI0NzksOCArMjUyNyw4IEBACiAJCSppbWJhbGFuY2UgPSBtaW5fbG9hZF9wZXJfdGFzazsKIAkJcmV0dXJuIGdyb3VwX21pbjsKIAl9Ci1yZXQ6CiAjZW5kaWYKK3JldDoKIAkqaW1iYWxhbmNlID0gMDsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTI1MjksMTcgKzI1NzcsMTcgQEAKIC8qCiAgKiBDaGVjayB0aGlzX2NwdSB0byBlbnN1cmUgaXQgaXMgYmFsYW5jZWQgd2l0aGluIGRvbWFpbi4gQXR0ZW1wdCB0byBtb3ZlCiAgKiB0YXNrcyBpZiB0aGVyZSBpcyBhbiBpbWJhbGFuY2UuCi0gKgotICogQ2FsbGVkIHdpdGggdGhpc19ycSB1bmxvY2tlZC4KICAqLwogc3RhdGljIGludCBsb2FkX2JhbGFuY2UoaW50IHRoaXNfY3B1LCBzdHJ1Y3QgcnEgKnRoaXNfcnEsCi0JCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgZW51bSBpZGxlX3R5cGUgaWRsZSkKKwkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBlbnVtIGlkbGVfdHlwZSBpZGxlLAorCQkJaW50ICpiYWxhbmNlKQogewogCWludCBucl9tb3ZlZCwgYWxsX3Bpbm5lZCA9IDAsIGFjdGl2ZV9iYWxhbmNlID0gMCwgc2RfaWRsZSA9IDA7CiAJc3RydWN0IHNjaGVkX2dyb3VwICpncm91cDsKIAl1bnNpZ25lZCBsb25nIGltYmFsYW5jZTsKIAlzdHJ1Y3QgcnEgKmJ1c2llc3Q7CiAJY3B1bWFza190IGNwdXMgPSBDUFVfTUFTS19BTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qCiAJICogV2hlbiBwb3dlciBzYXZpbmdzIHBvbGljeSBpcyBlbmFibGVkIGZvciB0aGUgcGFyZW50IGRvbWFpbiwgaWRsZQpAQCAtMjU1NSw3ICsyNjAzLDExIEBACiAKIHJlZG86CiAJZ3JvdXAgPSBmaW5kX2J1c2llc3RfZ3JvdXAoc2QsIHRoaXNfY3B1LCAmaW1iYWxhbmNlLCBpZGxlLCAmc2RfaWRsZSwKLQkJCQkJCQkmY3B1cyk7CisJCQkJICAgJmNwdXMsIGJhbGFuY2UpOworCisJaWYgKCpiYWxhbmNlID09IDApCisJCWdvdG8gb3V0X2JhbGFuY2VkOworCiAJaWYgKCFncm91cCkgewogCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9ub2J1c3lnW2lkbGVdKTsKIAkJZ290byBvdXRfYmFsYW5jZWQ7CkBAIC0yNTc5LDExICsyNjMxLDEzIEBACiAJCSAqIHN0aWxsIHVuYmFsYW5jZWQuIG5yX21vdmVkIHNpbXBseSBzdGF5cyB6ZXJvLCBzbyBpdCBpcwogCQkgKiBjb3JyZWN0bHkgdHJlYXRlZCBhcyBhbiBpbWJhbGFuY2UuCiAJCSAqLworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCWRvdWJsZV9ycV9sb2NrKHRoaXNfcnEsIGJ1c2llc3QpOwogCQlucl9tb3ZlZCA9IG1vdmVfdGFza3ModGhpc19ycSwgdGhpc19jcHUsIGJ1c2llc3QsCiAJCQkJICAgICAgbWludXNfMV9vcl96ZXJvKGJ1c2llc3QtPm5yX3J1bm5pbmcpLAogCQkJCSAgICAgIGltYmFsYW5jZSwgc2QsIGlkbGUsICZhbGxfcGlubmVkKTsKIAkJZG91YmxlX3JxX3VubG9jayh0aGlzX3JxLCBidXNpZXN0KTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJCS8qIEFsbCB0YXNrcyBvbiB0aGlzIHJ1bnF1ZXVlIHdlcmUgcGlubmVkIGJ5IENQVSBhZmZpbml0eSAqLwogCQlpZiAodW5saWtlbHkoYWxsX3Bpbm5lZCkpIHsKQEAgLTI2MDAsMTMgKzI2NTQsMTMgQEAKIAogCQlpZiAodW5saWtlbHkoc2QtPm5yX2JhbGFuY2VfZmFpbGVkID4gc2QtPmNhY2hlX25pY2VfdHJpZXMrMikpIHsKIAotCQkJc3Bpbl9sb2NrKCZidXNpZXN0LT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZidXNpZXN0LT5sb2NrLCBmbGFncyk7CiAKIAkJCS8qIGRvbid0IGtpY2sgdGhlIG1pZ3JhdGlvbl90aHJlYWQsIGlmIHRoZSBjdXJyCiAJCQkgKiB0YXNrIG9uIGJ1c2llc3QgY3B1IGNhbid0IGJlIG1vdmVkIHRvIHRoaXNfY3B1CiAJCQkgKi8KIAkJCWlmICghY3B1X2lzc2V0KHRoaXNfY3B1LCBidXNpZXN0LT5jdXJyLT5jcHVzX2FsbG93ZWQpKSB7Ci0JCQkJc3Bpbl91bmxvY2soJmJ1c2llc3QtPmxvY2spOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1c2llc3QtPmxvY2ssIGZsYWdzKTsKIAkJCQlhbGxfcGlubmVkID0gMTsKIAkJCQlnb3RvIG91dF9vbmVfcGlubmVkOwogCQkJfQpAQCAtMjYxNiw3ICsyNjcwLDcgQEAKIAkJCQlidXNpZXN0LT5wdXNoX2NwdSA9IHRoaXNfY3B1OwogCQkJCWFjdGl2ZV9iYWxhbmNlID0gMTsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrKCZidXNpZXN0LT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1c2llc3QtPmxvY2ssIGZsYWdzKTsKIAkJCWlmIChhY3RpdmVfYmFsYW5jZSkKIAkJCQl3YWtlX3VwX3Byb2Nlc3MoYnVzaWVzdC0+bWlncmF0aW9uX3RocmVhZCk7CiAKQEAgLTI2OTUsNyArMjc0OSw3IEBACiAJc2NoZWRzdGF0X2luYyhzZCwgbGJfY250W05FV0xZX0lETEVdKTsKIHJlZG86CiAJZ3JvdXAgPSBmaW5kX2J1c2llc3RfZ3JvdXAoc2QsIHRoaXNfY3B1LCAmaW1iYWxhbmNlLCBORVdMWV9JRExFLAotCQkJCSZzZF9pZGxlLCAmY3B1cyk7CisJCQkJICAgJnNkX2lkbGUsICZjcHVzLCBOVUxMKTsKIAlpZiAoIWdyb3VwKSB7CiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeWdbTkVXTFlfSURMRV0pOwogCQlnb3RvIG91dF9iYWxhbmNlZDsKQEAgLTI3NTUsMTQgKzI4MDksMjggQEAKIHN0YXRpYyB2b2lkIGlkbGVfYmFsYW5jZShpbnQgdGhpc19jcHUsIHN0cnVjdCBycSAqdGhpc19ycSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwlpbnQgcHVsbGVkX3Rhc2sgPSAwOworCXVuc2lnbmVkIGxvbmcgbmV4dF9iYWxhbmNlID0gamlmZmllcyArIDYwICogIEhaOwogCiAJZm9yX2VhY2hfZG9tYWluKHRoaXNfY3B1LCBzZCkgewogCQlpZiAoc2QtPmZsYWdzICYgU0RfQkFMQU5DRV9ORVdJRExFKSB7CiAJCQkvKiBJZiB3ZSd2ZSBwdWxsZWQgdGFza3Mgb3ZlciBzdG9wIHNlYXJjaGluZzogKi8KLQkJCWlmIChsb2FkX2JhbGFuY2VfbmV3aWRsZSh0aGlzX2NwdSwgdGhpc19ycSwgc2QpKQorCQkJcHVsbGVkX3Rhc2sgPSBsb2FkX2JhbGFuY2VfbmV3aWRsZSh0aGlzX2NwdSwKKwkJCQkJCQl0aGlzX3JxLCBzZCk7CisJCQlpZiAodGltZV9hZnRlcihuZXh0X2JhbGFuY2UsCisJCQkJICBzZC0+bGFzdF9iYWxhbmNlICsgc2QtPmJhbGFuY2VfaW50ZXJ2YWwpKQorCQkJCW5leHRfYmFsYW5jZSA9IHNkLT5sYXN0X2JhbGFuY2UKKwkJCQkJCSsgc2QtPmJhbGFuY2VfaW50ZXJ2YWw7CisJCQlpZiAocHVsbGVkX3Rhc2spCiAJCQkJYnJlYWs7CiAJCX0KIAl9CisJaWYgKCFwdWxsZWRfdGFzaykKKwkJLyoKKwkJICogV2UgYXJlIGdvaW5nIGlkbGUuIG5leHRfYmFsYW5jZSBtYXkgYmUgc2V0IGJhc2VkIG9uCisJCSAqIGEgYnVzeSBwcm9jZXNzb3IuIFNvIHJlc2V0IG5leHRfYmFsYW5jZS4KKwkJICovCisJCXRoaXNfcnEtPm5leHRfYmFsYW5jZSA9IG5leHRfYmFsYW5jZTsKIH0KIAogLyoKQEAgLTI4MTUsMjYgKzI4ODMsOSBAQAogCXNwaW5fdW5sb2NrKCZ0YXJnZXRfcnEtPmxvY2spOwogfQogCi0vKgotICogcmViYWxhbmNlX3RpY2sgd2lsbCBnZXQgY2FsbGVkIGV2ZXJ5IHRpbWVyIHRpY2ssIG9uIGV2ZXJ5IENQVS4KLSAqCi0gKiBJdCBjaGVja3MgZWFjaCBzY2hlZHVsaW5nIGRvbWFpbiB0byBzZWUgaWYgaXQgaXMgZHVlIHRvIGJlIGJhbGFuY2VkLAotICogYW5kIGluaXRpYXRlcyBhIGJhbGFuY2luZyBvcGVyYXRpb24gaWYgc28uCi0gKgotICogQmFsYW5jaW5nIHBhcmFtZXRlcnMgYXJlIHNldCB1cCBpbiBhcmNoX2luaXRfc2NoZWRfZG9tYWlucy4KLSAqLwotCi0vKiBEb24ndCBoYXZlIGFsbCBiYWxhbmNpbmcgb3BlcmF0aW9ucyBnb2luZyBvZmYgYXQgb25jZTogKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjcHVfb2Zmc2V0KGludCBjcHUpCitzdGF0aWMgdm9pZCB1cGRhdGVfbG9hZChzdHJ1Y3QgcnEgKnRoaXNfcnEpCiB7Ci0JcmV0dXJuIGppZmZpZXMgKyBjcHUgKiBIWiAvIE5SX0NQVVM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWJhbGFuY2VfdGljayhpbnQgdGhpc19jcHUsIHN0cnVjdCBycSAqdGhpc19ycSwgZW51bSBpZGxlX3R5cGUgaWRsZSkKLXsKLQl1bnNpZ25lZCBsb25nIHRoaXNfbG9hZCwgaW50ZXJ2YWwsIGogPSBjcHVfb2Zmc2V0KHRoaXNfY3B1KTsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwl1bnNpZ25lZCBsb25nIHRoaXNfbG9hZDsKIAlpbnQgaSwgc2NhbGU7CiAKIAl0aGlzX2xvYWQgPSB0aGlzX3JxLT5yYXdfd2VpZ2h0ZWRfbG9hZDsKQEAgLTI4NTQsNiArMjkwNSwzMiBAQAogCQkJbmV3X2xvYWQgKz0gc2NhbGUtMTsKIAkJdGhpc19ycS0+Y3B1X2xvYWRbaV0gPSAob2xkX2xvYWQqKHNjYWxlLTEpICsgbmV3X2xvYWQpIC8gc2NhbGU7CiAJfQorfQorCisvKgorICogcnVuX3JlYmFsYW5jZV9kb21haW5zIGlzIHRyaWdnZXJlZCB3aGVuIG5lZWRlZCBmcm9tIHRoZSBzY2hlZHVsZXIgdGljay4KKyAqCisgKiBJdCBjaGVja3MgZWFjaCBzY2hlZHVsaW5nIGRvbWFpbiB0byBzZWUgaWYgaXQgaXMgZHVlIHRvIGJlIGJhbGFuY2VkLAorICogYW5kIGluaXRpYXRlcyBhIGJhbGFuY2luZyBvcGVyYXRpb24gaWYgc28uCisgKgorICogQmFsYW5jaW5nIHBhcmFtZXRlcnMgYXJlIHNldCB1cCBpbiBhcmNoX2luaXRfc2NoZWRfZG9tYWlucy4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhiYWxhbmNpbmcpOworCitzdGF0aWMgdm9pZCBydW5fcmViYWxhbmNlX2RvbWFpbnMoc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoKQoreworCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKSwgYmFsYW5jZSA9IDE7CisJc3RydWN0IHJxICp0aGlzX3JxID0gY3B1X3JxKHRoaXNfY3B1KTsKKwl1bnNpZ25lZCBsb25nIGludGVydmFsOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCS8qCisJICogV2UgYXJlIGlkbGUgaWYgdGhlcmUgYXJlIG5vIHByb2Nlc3NlcyBydW5uaW5nLiBUaGlzCisJICogaXMgdmFsaWQgZXZlbiBpZiB3ZSBhcmUgdGhlIGlkbGUgcHJvY2VzcyAoU01UKS4KKwkgKi8KKwllbnVtIGlkbGVfdHlwZSBpZGxlID0gIXRoaXNfcnEtPm5yX3J1bm5pbmcgPworCQkJCVNDSEVEX0lETEUgOiBOT1RfSURMRTsKKwkvKiBFYXJsaWVzdCB0aW1lIHdoZW4gd2UgaGF2ZSB0byBjYWxsIHJ1bl9yZWJhbGFuY2VfZG9tYWlucyBhZ2FpbiAqLworCXVuc2lnbmVkIGxvbmcgbmV4dF9iYWxhbmNlID0gamlmZmllcyArIDYwKkhaOwogCiAJZm9yX2VhY2hfZG9tYWluKHRoaXNfY3B1LCBzZCkgewogCQlpZiAoIShzZC0+ZmxhZ3MgJiBTRF9MT0FEX0JBTEFOQ0UpKQpAQCAtMjg2OCw4ICsyOTQ1LDEzIEBACiAJCWlmICh1bmxpa2VseSghaW50ZXJ2YWwpKQogCQkJaW50ZXJ2YWwgPSAxOwogCi0JCWlmIChqIC0gc2QtPmxhc3RfYmFsYW5jZSA+PSBpbnRlcnZhbCkgewotCQkJaWYgKGxvYWRfYmFsYW5jZSh0aGlzX2NwdSwgdGhpc19ycSwgc2QsIGlkbGUpKSB7CisJCWlmIChzZC0+ZmxhZ3MgJiBTRF9TRVJJQUxJWkUpIHsKKwkJCWlmICghc3Bpbl90cnlsb2NrKCZiYWxhbmNpbmcpKQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgc2QtPmxhc3RfYmFsYW5jZSArIGludGVydmFsKSkgeworCQkJaWYgKGxvYWRfYmFsYW5jZSh0aGlzX2NwdSwgdGhpc19ycSwgc2QsIGlkbGUsICZiYWxhbmNlKSkgewogCQkJCS8qCiAJCQkJICogV2UndmUgcHVsbGVkIHRhc2tzIG92ZXIgc28gZWl0aGVyIHdlJ3JlIG5vCiAJCQkJICogbG9uZ2VyIGlkbGUsIG9yIG9uZSBvZiBvdXIgU01UIHNpYmxpbmdzIGlzCkBAIC0yODc3LDM5ICsyOTU5LDQ4IEBACiAJCQkJICovCiAJCQkJaWRsZSA9IE5PVF9JRExFOwogCQkJfQotCQkJc2QtPmxhc3RfYmFsYW5jZSArPSBpbnRlcnZhbDsKKwkJCXNkLT5sYXN0X2JhbGFuY2UgPSBqaWZmaWVzOwogCQl9CisJCWlmIChzZC0+ZmxhZ3MgJiBTRF9TRVJJQUxJWkUpCisJCQlzcGluX3VubG9jaygmYmFsYW5jaW5nKTsKK291dDoKKwkJaWYgKHRpbWVfYWZ0ZXIobmV4dF9iYWxhbmNlLCBzZC0+bGFzdF9iYWxhbmNlICsgaW50ZXJ2YWwpKQorCQkJbmV4dF9iYWxhbmNlID0gc2QtPmxhc3RfYmFsYW5jZSArIGludGVydmFsOworCisJCS8qCisJCSAqIFN0b3AgdGhlIGxvYWQgYmFsYW5jZSBhdCB0aGlzIGxldmVsLiBUaGVyZSBpcyBhbm90aGVyCisJCSAqIENQVSBpbiBvdXIgc2NoZWQgZ3JvdXAgd2hpY2ggaXMgZG9pbmcgbG9hZCBiYWxhbmNpbmcgbW9yZQorCQkgKiBhY3RpdmVseS4KKwkJICovCisJCWlmICghYmFsYW5jZSkKKwkJCWJyZWFrOwogCX0KKwl0aGlzX3JxLT5uZXh0X2JhbGFuY2UgPSBuZXh0X2JhbGFuY2U7CiB9CiAjZWxzZQogLyoKICAqIG9uIFVQIHdlIGRvIG5vdCBuZWVkIHRvIGJhbGFuY2UgYmV0d2VlbiBDUFVzOgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmViYWxhbmNlX3RpY2soaW50IGNwdSwgc3RydWN0IHJxICpycSwgZW51bSBpZGxlX3R5cGUgaWRsZSkKLXsKLX0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGxlX2JhbGFuY2UoaW50IGNwdSwgc3RydWN0IHJxICpycSkKIHsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCB3YWtlX3ByaW9yaXR5X3NsZWVwZXIoc3RydWN0IHJxICpycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWtlX3ByaW9yaXR5X3NsZWVwZXIoc3RydWN0IHJxICpycSkKIHsKLQlpbnQgcmV0ID0gMDsKLQogI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKKwlpZiAoIXJxLT5ucl9ydW5uaW5nKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2soJnJxLT5sb2NrKTsKIAkvKgogCSAqIElmIGFuIFNNVCBzaWJsaW5nIHRhc2sgaGFzIGJlZW4gcHV0IHRvIHNsZWVwIGZvciBwcmlvcml0eQogCSAqIHJlYXNvbnMgcmVzY2hlZHVsZSB0aGUgaWRsZSB0YXNrIHRvIHNlZSBpZiBpdCBjYW4gbm93IHJ1bi4KIAkgKi8KLQlpZiAocnEtPm5yX3J1bm5pbmcpIHsKKwlpZiAocnEtPm5yX3J1bm5pbmcpCiAJCXJlc2NoZWRfdGFzayhycS0+aWRsZSk7Ci0JCXJldCA9IDE7Ci0JfQogCXNwaW5fdW5sb2NrKCZycS0+bG9jayk7CiAjZW5kaWYKLQlyZXR1cm4gcmV0OwogfQogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga2VybmVsX3N0YXQsIGtzdGF0KTsKQEAgLTI5MjMsNyArMzAxNCw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHVwZGF0ZV9jcHVfY2xvY2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcnEgKnJxLCB1bnNpZ25lZCBsb25nIGxvbmcgbm93KQogewotCXAtPnNjaGVkX3RpbWUgKz0gbm93IC0gbWF4KHAtPnRpbWVzdGFtcCwgcnEtPnRpbWVzdGFtcF9sYXN0X3RpY2spOworCXAtPnNjaGVkX3RpbWUgKz0gbm93IC0gcC0+bGFzdF9yYW47CisJcC0+bGFzdF9yYW4gPSBycS0+bW9zdF9yZWNlbnRfdGltZXN0YW1wID0gbm93OwogfQogCiAvKgpAQCAtMjkzNiw4ICszMDI4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCW5zID0gbWF4KHAtPnRpbWVzdGFtcCwgdGFza19ycShwKS0+dGltZXN0YW1wX2xhc3RfdGljayk7Ci0JbnMgPSBwLT5zY2hlZF90aW1lICsgc2NoZWRfY2xvY2soKSAtIG5zOworCW5zID0gcC0+c2NoZWRfdGltZSArIHNjaGVkX2Nsb2NrKCkgLSBwLT5sYXN0X3JhbjsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAlyZXR1cm4gbnM7CkBAIC0zMDM3LDM1ICszMTI4LDEyIEBACiAJCWNwdXN0YXQtPnN0ZWFsID0gY3B1dGltZTY0X2FkZChjcHVzdGF0LT5zdGVhbCwgdG1wKTsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYnkgdGhlIHRpbWVyIGNvZGUsIHdpdGggSFogZnJlcXVlbmN5LgotICogV2UgY2FsbCBpdCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCi0gKgotICogSXQgYWxzbyBnZXRzIGNhbGxlZCBieSB0aGUgZm9yayBjb2RlLCB3aGVuIGNoYW5naW5nIHRoZSBwYXJlbnQncwotICogdGltZXNsaWNlcy4KLSAqLwotdm9pZCBzY2hlZHVsZXJfdGljayh2b2lkKQorc3RhdGljIHZvaWQgdGFza19ydW5uaW5nX3RpY2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXVuc2lnbmVkIGxvbmcgbG9uZyBub3cgPSBzY2hlZF9jbG9jaygpOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7Ci0KLQl1cGRhdGVfY3B1X2Nsb2NrKHAsIHJxLCBub3cpOwotCi0JcnEtPnRpbWVzdGFtcF9sYXN0X3RpY2sgPSBub3c7Ci0KLQlpZiAocCA9PSBycS0+aWRsZSkgewotCQlpZiAod2FrZV9wcmlvcml0eV9zbGVlcGVyKHJxKSkKLQkJCWdvdG8gb3V0OwotCQlyZWJhbGFuY2VfdGljayhjcHUsIHJxLCBTQ0hFRF9JRExFKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRhc2sgbWlnaHQgaGF2ZSBleHBpcmVkIGFscmVhZHksIGJ1dCBub3Qgc2NoZWR1bGVkIG9mZiB5ZXQgKi8KIAlpZiAocC0+YXJyYXkgIT0gcnEtPmFjdGl2ZSkgeworCQkvKiBUYXNrIGhhcyBleHBpcmVkIGJ1dCB3YXMgbm90IHNjaGVkdWxlZCB5ZXQgKi8KIAkJc2V0X3Rza19uZWVkX3Jlc2NoZWQocCk7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAJfQogCXNwaW5fbG9jaygmcnEtPmxvY2spOwogCS8qCkBAIC0zMTMzLDggKzMyMDEsMzQgQEAKIAl9CiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZycS0+bG9jayk7Ci1vdXQ6Ci0JcmViYWxhbmNlX3RpY2soY3B1LCBycSwgTk9UX0lETEUpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBieSB0aGUgdGltZXIgY29kZSwgd2l0aCBIWiBmcmVxdWVuY3kuCisgKiBXZSBjYWxsIGl0IHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqCisgKiBJdCBhbHNvIGdldHMgY2FsbGVkIGJ5IHRoZSBmb3JrIGNvZGUsIHdoZW4gY2hhbmdpbmcgdGhlIHBhcmVudCdzCisgKiB0aW1lc2xpY2VzLgorICovCit2b2lkIHNjaGVkdWxlcl90aWNrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG5vdyA9IHNjaGVkX2Nsb2NrKCk7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gY3VycmVudDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKKworCXVwZGF0ZV9jcHVfY2xvY2socCwgcnEsIG5vdyk7CisKKwlpZiAocCA9PSBycS0+aWRsZSkKKwkJLyogVGFzayBvbiB0aGUgaWRsZSBxdWV1ZSAqLworCQl3YWtlX3ByaW9yaXR5X3NsZWVwZXIocnEpOworCWVsc2UKKwkJdGFza19ydW5uaW5nX3RpY2socnEsIHApOworI2lmZGVmIENPTkZJR19TTVAKKwl1cGRhdGVfbG9hZChycSk7CisJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcnEtPm5leHRfYmFsYW5jZSkpCisJCXJhaXNlX3NvZnRpcnEoU0NIRURfU09GVElSUSk7CisjZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKQEAgLTMyODAsNyArMzM3NCw4IEBACiAJLyoKIAkgKiBTcGlubG9jayBjb3VudCBvdmVyZmxvd2luZyBzb29uPwogCSAqLwotCURFQlVHX0xPQ0tTX1dBUk5fT04oKHByZWVtcHRfY291bnQoKSAmIFBSRUVNUFRfTUFTSykgPj0gUFJFRU1QVF9NQVNLLTEwKTsKKwlERUJVR19MT0NLU19XQVJOX09OKChwcmVlbXB0X2NvdW50KCkgJiBQUkVFTVBUX01BU0spID49CisJCQkJUFJFRU1QVF9NQVNLIC0gMTApOwogfQogRVhQT1JUX1NZTUJPTChhZGRfcHJlZW1wdF9jb3VudCk7CiAKQEAgLTMzMzMsNiArMzQyOCw5IEBACiAJCXByaW50ayhLRVJOX0VSUiAiQlVHOiBzY2hlZHVsaW5nIHdoaWxlIGF0b21pYzogIgogCQkJIiVzLzB4JTA4eC8lZFxuIiwKIAkJCWN1cnJlbnQtPmNvbW0sIHByZWVtcHRfY291bnQoKSwgY3VycmVudC0+cGlkKTsKKwkJZGVidWdfc2hvd19oZWxkX2xvY2tzKGN1cnJlbnQpOworCQlpZiAoaXJxc19kaXNhYmxlZCgpKQorCQkJcHJpbnRfaXJxdHJhY2VfZXZlbnRzKGN1cnJlbnQpOwogCQlkdW1wX3N0YWNrKCk7CiAJfQogCXByb2ZpbGVfaGl0KFNDSEVEX1BST0ZJTElORywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKQEAgLTQ4MDQsMTggKzQ5MDIsMTggQEAKIAkJc2hvd19zdGFjayhwLCBOVUxMKTsKIH0KIAotdm9pZCBzaG93X3N0YXRlKHZvaWQpCit2b2lkIHNob3dfc3RhdGVfZmlsdGVyKHVuc2lnbmVkIGxvbmcgc3RhdGVfZmlsdGVyKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CiAKICNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKIAlwcmludGsoIlxuIgotCSAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nXG4iKTsKLQlwcmludGsoIiAgdGFzayAgICAgICAgICAgICBQQyAgICAgIHBpZCBmYXRoZXIgY2hpbGQgeW91bmdlciBvbGRlclxuIik7CisJICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdcbiIpOworCXByaW50aygiICB0YXNrICAgICAgICAgICAgIFBDICAgIHN0YWNrICAgcGlkIGZhdGhlciBjaGlsZCB5b3VuZ2VyIG9sZGVyXG4iKTsKICNlbHNlCiAJcHJpbnRrKCJcbiIKLQkgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nXG4iKTsKLQlwcmludGsoIiAgdGFzayAgICAgICAgICAgICAgICAgUEMgICAgICAgICAgcGlkIGZhdGhlciBjaGlsZCB5b3VuZ2VyIG9sZGVyXG4iKTsKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUgICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nXG4iKTsKKwlwcmludGsoIiAgdGFzayAgICAgICAgICAgICAgICAgUEMgICAgICAgIHN0YWNrICAgcGlkIGZhdGhlciBjaGlsZCB5b3VuZ2VyIG9sZGVyXG4iKTsKICNlbmRpZgogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJZG9fZWFjaF90aHJlYWQoZywgcCkgewpAQCAtNDgyNCwxMSArNDkyMiwxNiBAQAogCQkgKiBjb25zb2xlIG1pZ2h0IHRha2UgYWxvdCBvZiB0aW1lOgogCQkgKi8KIAkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci0JCXNob3dfdGFzayhwKTsKKwkJaWYgKHAtPnN0YXRlICYgc3RhdGVfZmlsdGVyKQorCQkJc2hvd190YXNrKHApOwogCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7CiAKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JZGVidWdfc2hvd19hbGxfbG9ja3MoKTsKKwkvKgorCSAqIE9ubHkgc2hvdyBsb2NrcyBpZiBhbGwgdGFza3MgYXJlIGR1bXBlZDoKKwkgKi8KKwlpZiAoc3RhdGVfZmlsdGVyID09IC0xKQorCQlkZWJ1Z19zaG93X2FsbF9sb2NrcygpOwogfQogCiAvKioKQEAgLTQ5NzMsOCArNTA3Niw4IEBACiAJCSAqIGFmdGVyd2FyZHMsIGFuZCBwcmV0ZW5kaW5nIGl0IHdhcyBhIGxvY2FsIGFjdGl2YXRlLgogCQkgKiBUaGlzIHdheSBpcyBjbGVhbmVyIGFuZCBsb2dpY2FsbHkgY29ycmVjdC4KIAkJICovCi0JCXAtPnRpbWVzdGFtcCA9IHAtPnRpbWVzdGFtcCAtIHJxX3NyYy0+dGltZXN0YW1wX2xhc3RfdGljawotCQkJCSsgcnFfZGVzdC0+dGltZXN0YW1wX2xhc3RfdGljazsKKwkJcC0+dGltZXN0YW1wID0gcC0+dGltZXN0YW1wIC0gcnFfc3JjLT5tb3N0X3JlY2VudF90aW1lc3RhbXAKKwkJCQkrIHJxX2Rlc3QtPm1vc3RfcmVjZW50X3RpbWVzdGFtcDsKIAkJZGVhY3RpdmF0ZV90YXNrKHAsIHJxX3NyYyk7CiAJCV9fYWN0aXZhdGVfdGFzayhwLCBycV9kZXN0KTsKIAkJaWYgKFRBU0tfUFJFRU1QVFNfQ1VSUihwLCBycV9kZXN0KSkKQEAgLTUwNTAsNyArNTE1MywxMCBAQAogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0vKiBGaWd1cmUgb3V0IHdoZXJlIHRhc2sgb24gZGVhZCBDUFUgc2hvdWxkIGdvLCB1c2UgZm9yY2UgaWYgbmVjY2Vzc2FyeS4gKi8KKy8qCisgKiBGaWd1cmUgb3V0IHdoZXJlIHRhc2sgb24gZGVhZCBDUFUgc2hvdWxkIGdvLCB1c2UgZm9yY2UgaWYgbmVjY2Vzc2FyeS4KKyAqIE5PVEU6IGludGVycnVwdHMgc2hvdWxkIGJlIGRpc2FibGVkIGJ5IHRoZSBjYWxsZXIKKyAqLwogc3RhdGljIHZvaWQgbW92ZV90YXNrX29mZl9kZWFkX2NwdShpbnQgZGVhZF9jcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTE3MCw2ICs1Mjc2LDcgQEAKIAltbWRyb3AobW0pOwogfQogCisvKiBjYWxsZWQgdW5kZXIgcnEtPmxvY2sgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzICovCiBzdGF0aWMgdm9pZCBtaWdyYXRlX2RlYWQodW5zaWduZWQgaW50IGRlYWRfY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IHJxICpycSA9IGNwdV9ycShkZWFkX2NwdSk7CkBAIC01MTg2LDEwICs1MjkzLDExIEBACiAJICogRHJvcCBsb2NrIGFyb3VuZCBtaWdyYXRpb247IGlmIHNvbWVvbmUgZWxzZSBtb3ZlcyBpdCwKIAkgKiB0aGF0J3MgT0suICBObyB0YXNrIGNhbiBiZSBhZGRlZCB0byB0aGlzIENQVSwgc28gaXRlcmF0aW9uIGlzCiAJICogZmluZS4KKwkgKiBOT1RFOiBpbnRlcnJ1cHRzIHNob3VsZCBiZSBsZWZ0IGRpc2FibGVkICAtLWRldkAKIAkgKi8KLQlzcGluX3VubG9ja19pcnEoJnJxLT5sb2NrKTsKKwlzcGluX3VubG9jaygmcnEtPmxvY2spOwogCW1vdmVfdGFza19vZmZfZGVhZF9jcHUoZGVhZF9jcHUsIHApOwotCXNwaW5fbG9ja19pcnEoJnJxLT5sb2NrKTsKKwlzcGluX2xvY2soJnJxLT5sb2NrKTsKIAogCXB1dF90YXNrX3N0cnVjdChwKTsKIH0KQEAgLTUzNDIsMTYgKzU0NTAsMTkgQEAKIAkJaWYgKCEoc2QtPmZsYWdzICYgU0RfTE9BRF9CQUxBTkNFKSkgewogCQkJcHJpbnRrKCJkb2VzIG5vdCBsb2FkLWJhbGFuY2VcbiIpOwogCQkJaWYgKHNkLT5wYXJlbnQpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogIVNEX0xPQURfQkFMQU5DRSBkb21haW4gaGFzIHBhcmVudCIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6ICFTRF9MT0FEX0JBTEFOQ0UgZG9tYWluIgorCQkJCQkJIiBoYXMgcGFyZW50Iik7CiAJCQlicmVhazsKIAkJfQogCiAJCXByaW50aygic3BhbiAlc1xuIiwgc3RyKTsKIAogCQlpZiAoIWNwdV9pc3NldChjcHUsIHNkLT5zcGFuKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IGRvbWFpbi0+c3BhbiBkb2VzIG5vdCBjb250YWluIENQVSVkXG4iLCBjcHUpOworCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogZG9tYWluLT5zcGFuIGRvZXMgbm90IGNvbnRhaW4gIgorCQkJCQkiQ1BVJWRcbiIsIGNwdSk7CiAJCWlmICghY3B1X2lzc2V0KGNwdSwgZ3JvdXAtPmNwdW1hc2spKQotCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogZG9tYWluLT5ncm91cHMgZG9lcyBub3QgY29udGFpbiBDUFUlZFxuIiwgY3B1KTsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IGRvbWFpbi0+Z3JvdXBzIGRvZXMgbm90IGNvbnRhaW4iCisJCQkJCSIgQ1BVJWRcbiIsIGNwdSk7CiAKIAkJcHJpbnRrKEtFUk5fREVCVUcpOwogCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWwgKyAyOyBpKyspCkBAIC01MzY2LDcgKzU0NzcsOCBAQAogCiAJCQlpZiAoIWdyb3VwLT5jcHVfcG93ZXIpIHsKIAkJCQlwcmludGsoIlxuIik7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogZG9tYWluLT5jcHVfcG93ZXIgbm90IHNldFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogZG9tYWluLT5jcHVfcG93ZXIgbm90ICIKKwkJCQkJCSJzZXRcbiIpOwogCQkJfQogCiAJCQlpZiAoIWNwdXNfd2VpZ2h0KGdyb3VwLT5jcHVtYXNrKSkgewpAQCAtNTM4OSwxNSArNTUwMSwxNyBAQAogCQlwcmludGsoIlxuIik7CiAKIAkJaWYgKCFjcHVzX2VxdWFsKHNkLT5zcGFuLCBncm91cG1hc2spKQotCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogZ3JvdXBzIGRvbid0IHNwYW4gZG9tYWluLT5zcGFuXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IGdyb3VwcyBkb24ndCBzcGFuICIKKwkJCQkJImRvbWFpbi0+c3BhblxuIik7CiAKIAkJbGV2ZWwrKzsKIAkJc2QgPSBzZC0+cGFyZW50OworCQlpZiAoIXNkKQorCQkJY29udGludWU7CiAKLQkJaWYgKHNkKSB7Ci0JCQlpZiAoIWNwdXNfc3Vic2V0KGdyb3VwbWFzaywgc2QtPnNwYW4pKQotCQkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IHBhcmVudCBzcGFuIGlzIG5vdCBhIHN1cGVyc2V0IG9mIGRvbWFpbi0+c3BhblxuIik7Ci0JCX0KKwkJaWYgKCFjcHVzX3N1YnNldChncm91cG1hc2ssIHNkLT5zcGFuKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IHBhcmVudCBzcGFuIGlzIG5vdCBhIHN1cGVyc2V0ICIKKwkJCQkib2YgZG9tYWluLT5zcGFuXG4iKTsKIAogCX0gd2hpbGUgKHNkKTsKIH0KQEAgLTU1MTEsMjggKzU2MjUsMjcgQEAKIF9fc2V0dXAgKCJpc29sY3B1cz0iLCBpc29sYXRlZF9jcHVfc2V0dXApOwogCiAvKgotICogaW5pdF9zY2hlZF9idWlsZF9ncm91cHMgdGFrZXMgYW4gYXJyYXkgb2YgZ3JvdXBzLCB0aGUgY3B1bWFzayB3ZSB3aXNoCi0gKiB0byBzcGFuLCBhbmQgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gd2hpY2ggaWRlbnRpZmllcyB3aGF0IGdyb3VwIGEgQ1BVCi0gKiBiZWxvbmdzIHRvLiBUaGUgcmV0dXJuIHZhbHVlIG9mIGdyb3VwX2ZuIG11c3QgYmUgYSB2YWxpZCBpbmRleCBpbnRvIHRoZQotICogZ3JvdXBzW10gYXJyYXksIGFuZCBtdXN0IGJlID49IDAgYW5kIDwgTlJfQ1BVUyAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2UKLSAqIGtlZXAgdHJhY2sgb2YgZ3JvdXBzIGNvdmVyZWQgd2l0aCBhIGNwdW1hc2tfdCkuCisgKiBpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyB0YWtlcyB0aGUgY3B1bWFzayB3ZSB3aXNoIHRvIHNwYW4sIGFuZCBhIHBvaW50ZXIKKyAqIHRvIGEgZnVuY3Rpb24gd2hpY2ggaWRlbnRpZmllcyB3aGF0IGdyb3VwKGFsb25nIHdpdGggc2NoZWQgZ3JvdXApIGEgQ1BVCisgKiBiZWxvbmdzIHRvLiBUaGUgcmV0dXJuIHZhbHVlIG9mIGdyb3VwX2ZuIG11c3QgYmUgYSA+PSAwIGFuZCA8IE5SX0NQVVMKKyAqIChkdWUgdG8gdGhlIGZhY3QgdGhhdCB3ZSBrZWVwIHRyYWNrIG9mIGdyb3VwcyBjb3ZlcmVkIHdpdGggYSBjcHVtYXNrX3QpLgogICoKICAqIGluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzIHdpbGwgYnVpbGQgYSBjaXJjdWxhciBsaW5rZWQgbGlzdCBvZiB0aGUgZ3JvdXBzCiAgKiBjb3ZlcmVkIGJ5IHRoZSBnaXZlbiBzcGFuLCBhbmQgd2lsbCBzZXQgZWFjaCBncm91cCdzIC0+Y3B1bWFzayBjb3JyZWN0bHksCiAgKiBhbmQgLT5jcHVfcG93ZXIgdG8gMC4KICAqLwogc3RhdGljIHZvaWQKLWluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKHN0cnVjdCBzY2hlZF9ncm91cCBncm91cHNbXSwgY3B1bWFza190IHNwYW4sCi0JCQljb25zdCBjcHVtYXNrX3QgKmNwdV9tYXAsCi0JCQlpbnQgKCpncm91cF9mbikoaW50IGNwdSwgY29uc3QgY3B1bWFza190ICpjcHVfbWFwKSkKK2luaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKGNwdW1hc2tfdCBzcGFuLCBjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXAsCisJCQlpbnQgKCpncm91cF9mbikoaW50IGNwdSwgY29uc3QgY3B1bWFza190ICpjcHVfbWFwLAorCQkJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipzZykpCiB7CiAJc3RydWN0IHNjaGVkX2dyb3VwICpmaXJzdCA9IE5VTEwsICpsYXN0ID0gTlVMTDsKIAljcHVtYXNrX3QgY292ZXJlZCA9IENQVV9NQVNLX05PTkU7CiAJaW50IGk7CiAKIAlmb3JfZWFjaF9jcHVfbWFzayhpLCBzcGFuKSB7Ci0JCWludCBncm91cCA9IGdyb3VwX2ZuKGksIGNwdV9tYXApOwotCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnID0gJmdyb3Vwc1tncm91cF07CisJCXN0cnVjdCBzY2hlZF9ncm91cCAqc2c7CisJCWludCBncm91cCA9IGdyb3VwX2ZuKGksIGNwdV9tYXAsICZzZyk7CiAJCWludCBqOwogCiAJCWlmIChjcHVfaXNzZXQoaSwgY292ZXJlZCkpCkBAIC01NTQyLDcgKzU2NTUsNyBAQAogCQlzZy0+Y3B1X3Bvd2VyID0gMDsKIAogCQlmb3JfZWFjaF9jcHVfbWFzayhqLCBzcGFuKSB7Ci0JCQlpZiAoZ3JvdXBfZm4oaiwgY3B1X21hcCkgIT0gZ3JvdXApCisJCQlpZiAoZ3JvdXBfZm4oaiwgY3B1X21hcCwgTlVMTCkgIT0gZ3JvdXApCiAJCQkJY29udGludWU7CiAKIAkJCWNwdV9zZXQoaiwgY292ZXJlZCk7CkBAIC01NzE2LDggKzU4MjksOSBAQAogICovCiBzdGF0aWMgdm9pZCB0b3VjaF9jYWNoZSh2b2lkICpfX2NhY2hlLCB1bnNpZ25lZCBsb25nIF9fc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSBfX3NpemUvc2l6ZW9mKGxvbmcpLCBjaHVuazEgPSBzaXplLzMsCi0JCQljaHVuazIgPSAyKnNpemUvMzsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBfX3NpemUgLyBzaXplb2YobG9uZyk7CisJdW5zaWduZWQgbG9uZyBjaHVuazEgPSBzaXplIC8gMzsKKwl1bnNpZ25lZCBsb25nIGNodW5rMiA9IDIgKiBzaXplIC8gMzsKIAl1bnNpZ25lZCBsb25nICpjYWNoZSA9IF9fY2FjaGU7CiAJaW50IGk7CiAKQEAgLTU4MjYsMTEgKzU5NDAsMTEgQEAKIAkgKi8KIAltZWFzdXJlX29uZShjYWNoZSwgc2l6ZSwgY3B1MSwgY3B1Mik7CiAJZm9yIChpID0gMDsgaSA8IElURVJBVElPTlM7IGkrKykKLQkJY29zdDEgKz0gbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUgLSBpKjEwMjQsIGNwdTEsIGNwdTIpOworCQljb3N0MSArPSBtZWFzdXJlX29uZShjYWNoZSwgc2l6ZSAtIGkgKiAxMDI0LCBjcHUxLCBjcHUyKTsKIAogCW1lYXN1cmVfb25lKGNhY2hlLCBzaXplLCBjcHUyLCBjcHUxKTsKIAlmb3IgKGkgPSAwOyBpIDwgSVRFUkFUSU9OUzsgaSsrKQotCQljb3N0MSArPSBtZWFzdXJlX29uZShjYWNoZSwgc2l6ZSAtIGkqMTAyNCwgY3B1MiwgY3B1MSk7CisJCWNvc3QxICs9IG1lYXN1cmVfb25lKGNhY2hlLCBzaXplIC0gaSAqIDEwMjQsIGNwdTIsIGNwdTEpOwogCiAJLyoKIAkgKiAoV2UgbWVhc3VyZSB0aGUgbm9uLW1pZ3JhdGluZyBbY2FjaGVkXSBjb3N0IG9uIGJvdGgKQEAgLTU4NDAsMTcgKzU5NTQsMTcgQEAKIAogCW1lYXN1cmVfb25lKGNhY2hlLCBzaXplLCBjcHUxLCBjcHUxKTsKIAlmb3IgKGkgPSAwOyBpIDwgSVRFUkFUSU9OUzsgaSsrKQotCQljb3N0MiArPSBtZWFzdXJlX29uZShjYWNoZSwgc2l6ZSAtIGkqMTAyNCwgY3B1MSwgY3B1MSk7CisJCWNvc3QyICs9IG1lYXN1cmVfb25lKGNhY2hlLCBzaXplIC0gaSAqIDEwMjQsIGNwdTEsIGNwdTEpOwogCiAJbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUsIGNwdTIsIGNwdTIpOwogCWZvciAoaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspCi0JCWNvc3QyICs9IG1lYXN1cmVfb25lKGNhY2hlLCBzaXplIC0gaSoxMDI0LCBjcHUyLCBjcHUyKTsKKwkJY29zdDIgKz0gbWVhc3VyZV9vbmUoY2FjaGUsIHNpemUgLSBpICogMTAyNCwgY3B1MiwgY3B1Mik7CiAKIAkvKgogCSAqIEdldCB0aGUgcGVyLWl0ZXJhdGlvbiBtaWdyYXRpb24gY29zdDoKIAkgKi8KLQlkb19kaXYoY29zdDEsIDIqSVRFUkFUSU9OUyk7Ci0JZG9fZGl2KGNvc3QyLCAyKklURVJBVElPTlMpOworCWRvX2Rpdihjb3N0MSwgMiAqIElURVJBVElPTlMpOworCWRvX2Rpdihjb3N0MiwgMiAqIElURVJBVElPTlMpOwogCiAJcmV0dXJuIGNvc3QxIC0gY29zdDI7CiB9CkBAIC01ODg4LDcgKzYwMDIsNyBAQAogCSAqLwogCWNhY2hlID0gdm1hbGxvYyhtYXhfc2l6ZSk7CiAJaWYgKCFjYWNoZSkgewotCQlwcmludGsoImNvdWxkIG5vdCB2bWFsbG9jICVkIGJ5dGVzIGZvciBjYWNoZSFcbiIsIDIqbWF4X3NpemUpOworCQlwcmludGsoImNvdWxkIG5vdCB2bWFsbG9jICVkIGJ5dGVzIGZvciBjYWNoZSFcbiIsIDIgKiBtYXhfc2l6ZSk7CiAJCXJldHVybiAxMDAwMDAwOyAvKiByZXR1cm4gMSBtc2VjIG9uIHZlcnkgc21hbGwgYm94ZW4gKi8KIAl9CiAKQEAgLTU5MTMsNyArNjAyNyw4IEBACiAJCWF2Z19mbHVjdCA9IChhdmdfZmx1Y3QgKyBmbHVjdCkvMjsKIAogCQlpZiAobWlncmF0aW9uX2RlYnVnKQotCQkJcHJpbnRrKCItPiBbJWRdWyVkXVslN2RdICUzbGQuJWxkIFslM2xkLiVsZF0gKCVsZCk6ICglOExkICU4TGQpXG4iLAorCQkJcHJpbnRrKCItPiBbJWRdWyVkXVslN2RdICUzbGQuJWxkIFslM2xkLiVsZF0gKCVsZCk6ICIKKwkJCQkiKCU4TGQgJThMZClcbiIsCiAJCQkJY3B1MSwgY3B1Miwgc2l6ZSwKIAkJCQkobG9uZyljb3N0IC8gMTAwMDAwMCwKIAkJCQkoKGxvbmcpY29zdCAvIDEwMDAwMCkgJSAxMCwKQEAgLTYwMDgsMjAgKzYxMjMsMTggQEAKIAkJCS0xCiAjZW5kaWYKIAkJKTsKLQlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7Ci0JCWlmIChudW1fb25saW5lX2NwdXMoKSA+IDEpIHsKLQkJCXByaW50aygibWlncmF0aW9uX2Nvc3Q9Iik7Ci0JCQlmb3IgKGRpc3RhbmNlID0gMDsgZGlzdGFuY2UgPD0gbWF4X2Rpc3RhbmNlOyBkaXN0YW5jZSsrKSB7Ci0JCQkJaWYgKGRpc3RhbmNlKQotCQkJCQlwcmludGsoIiwiKTsKLQkJCQlwcmludGsoIiVsZCIsIChsb25nKW1pZ3JhdGlvbl9jb3N0W2Rpc3RhbmNlXSAvIDEwMDApOwotCQkJfQotCQkJcHJpbnRrKCJcbiIpOworCWlmIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcgJiYgbnVtX29ubGluZV9jcHVzKCkgPiAxKSB7CisJCXByaW50aygibWlncmF0aW9uX2Nvc3Q9Iik7CisJCWZvciAoZGlzdGFuY2UgPSAwOyBkaXN0YW5jZSA8PSBtYXhfZGlzdGFuY2U7IGRpc3RhbmNlKyspIHsKKwkJCWlmIChkaXN0YW5jZSkKKwkJCQlwcmludGsoIiwiKTsKKwkJCXByaW50aygiJWxkIiwgKGxvbmcpbWlncmF0aW9uX2Nvc3RbZGlzdGFuY2VdIC8gMTAwMCk7CiAJCX0KKwkJcHJpbnRrKCJcbiIpOwogCX0KIAlqMSA9IGppZmZpZXM7CiAJaWYgKG1pZ3JhdGlvbl9kZWJ1ZykKLQkJcHJpbnRrKCJtaWdyYXRpb246ICVsZCBzZWNvbmRzXG4iLCAoajEtajApL0haKTsKKwkJcHJpbnRrKCJtaWdyYXRpb246ICVsZCBzZWNvbmRzXG4iLCAoajEtajApIC8gSFopOwogCiAJLyoKIAkgKiBNb3ZlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIENQVS4gTlVNQS1RIGdldHMgY29uZnVzZWQKQEAgLTYxMTgsMTAgKzYyMzEsMTMgQEAKICAqLwogI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluLCBjcHVfZG9tYWlucyk7Ci1zdGF0aWMgc3RydWN0IHNjaGVkX2dyb3VwIHNjaGVkX2dyb3VwX2NwdXNbTlJfQ1BVU107CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2dyb3VwLCBzY2hlZF9ncm91cF9jcHVzKTsKIAotc3RhdGljIGludCBjcHVfdG9fY3B1X2dyb3VwKGludCBjcHUsIGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKK3N0YXRpYyBpbnQgY3B1X3RvX2NwdV9ncm91cChpbnQgY3B1LCBjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXAsCisJCQkgICAgc3RydWN0IHNjaGVkX2dyb3VwICoqc2cpCiB7CisJaWYgKHNnKQorCQkqc2cgPSAmcGVyX2NwdShzY2hlZF9ncm91cF9jcHVzLCBjcHUpOwogCXJldHVybiBjcHU7CiB9CiAjZW5kaWYKQEAgLTYxMzEsMzkgKzYyNDcsNTIgQEAKICAqLwogI2lmZGVmIENPTkZJR19TQ0hFRF9NQwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIGNvcmVfZG9tYWlucyk7Ci1zdGF0aWMgc3RydWN0IHNjaGVkX2dyb3VwIHNjaGVkX2dyb3VwX2NvcmVbTlJfQ1BVU107CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2dyb3VwLCBzY2hlZF9ncm91cF9jb3JlKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0NIRURfTUMpICYmIGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkKLXN0YXRpYyBpbnQgY3B1X3RvX2NvcmVfZ3JvdXAoaW50IGNwdSwgY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQorc3RhdGljIGludCBjcHVfdG9fY29yZV9ncm91cChpbnQgY3B1LCBjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXAsCisJCQkgICAgIHN0cnVjdCBzY2hlZF9ncm91cCAqKnNnKQogeworCWludCBncm91cDsKIAljcHVtYXNrX3QgbWFzayA9IGNwdV9zaWJsaW5nX21hcFtjcHVdOwogCWNwdXNfYW5kKG1hc2ssIG1hc2ssICpjcHVfbWFwKTsKLQlyZXR1cm4gZmlyc3RfY3B1KG1hc2spOworCWdyb3VwID0gZmlyc3RfY3B1KG1hc2spOworCWlmIChzZykKKwkJKnNnID0gJnBlcl9jcHUoc2NoZWRfZ3JvdXBfY29yZSwgZ3JvdXApOworCXJldHVybiBncm91cDsKIH0KICNlbGlmIGRlZmluZWQoQ09ORklHX1NDSEVEX01DKQotc3RhdGljIGludCBjcHVfdG9fY29yZV9ncm91cChpbnQgY3B1LCBjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCitzdGF0aWMgaW50IGNwdV90b19jb3JlX2dyb3VwKGludCBjcHUsIGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCwKKwkJCSAgICAgc3RydWN0IHNjaGVkX2dyb3VwICoqc2cpCiB7CisJaWYgKHNnKQorCQkqc2cgPSAmcGVyX2NwdShzY2hlZF9ncm91cF9jb3JlLCBjcHUpOwogCXJldHVybiBjcHU7CiB9CiAjZW5kaWYKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIHBoeXNfZG9tYWlucyk7Ci1zdGF0aWMgc3RydWN0IHNjaGVkX2dyb3VwIHNjaGVkX2dyb3VwX3BoeXNbTlJfQ1BVU107CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2dyb3VwLCBzY2hlZF9ncm91cF9waHlzKTsKIAotc3RhdGljIGludCBjcHVfdG9fcGh5c19ncm91cChpbnQgY3B1LCBjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCitzdGF0aWMgaW50IGNwdV90b19waHlzX2dyb3VwKGludCBjcHUsIGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCwKKwkJCSAgICAgc3RydWN0IHNjaGVkX2dyb3VwICoqc2cpCiB7CisJaW50IGdyb3VwOwogI2lmZGVmIENPTkZJR19TQ0hFRF9NQwogCWNwdW1hc2tfdCBtYXNrID0gY3B1X2NvcmVncm91cF9tYXAoY3B1KTsKIAljcHVzX2FuZChtYXNrLCBtYXNrLCAqY3B1X21hcCk7Ci0JcmV0dXJuIGZpcnN0X2NwdShtYXNrKTsKKwlncm91cCA9IGZpcnN0X2NwdShtYXNrKTsKICNlbGlmIGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkKIAljcHVtYXNrX3QgbWFzayA9IGNwdV9zaWJsaW5nX21hcFtjcHVdOwogCWNwdXNfYW5kKG1hc2ssIG1hc2ssICpjcHVfbWFwKTsKLQlyZXR1cm4gZmlyc3RfY3B1KG1hc2spOworCWdyb3VwID0gZmlyc3RfY3B1KG1hc2spOwogI2Vsc2UKLQlyZXR1cm4gY3B1OworCWdyb3VwID0gY3B1OwogI2VuZGlmCisJaWYgKHNnKQorCQkqc2cgPSAmcGVyX2NwdShzY2hlZF9ncm91cF9waHlzLCBncm91cCk7CisJcmV0dXJuIGdyb3VwOwogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKQEAgLTYxNzYsMTIgKzYzMDUsMjIgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipzY2hlZF9ncm91cF9ub2Rlc19ieWNwdVtOUl9DUFVTXTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIGFsbG5vZGVzX2RvbWFpbnMpOwotc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCAqc2NoZWRfZ3JvdXBfYWxsbm9kZXNfYnljcHVbTlJfQ1BVU107CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2dyb3VwLCBzY2hlZF9ncm91cF9hbGxub2Rlcyk7CiAKLXN0YXRpYyBpbnQgY3B1X3RvX2FsbG5vZGVzX2dyb3VwKGludCBjcHUsIGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKK3N0YXRpYyBpbnQgY3B1X3RvX2FsbG5vZGVzX2dyb3VwKGludCBjcHUsIGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCwKKwkJCQkgc3RydWN0IHNjaGVkX2dyb3VwICoqc2cpCiB7Ci0JcmV0dXJuIGNwdV90b19ub2RlKGNwdSk7CisJY3B1bWFza190IG5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKGNwdV90b19ub2RlKGNwdSkpOworCWludCBncm91cDsKKworCWNwdXNfYW5kKG5vZGVtYXNrLCBub2RlbWFzaywgKmNwdV9tYXApOworCWdyb3VwID0gZmlyc3RfY3B1KG5vZGVtYXNrKTsKKworCWlmIChzZykKKwkJKnNnID0gJnBlcl9jcHUoc2NoZWRfZ3JvdXBfYWxsbm9kZXMsIGdyb3VwKTsKKwlyZXR1cm4gZ3JvdXA7CiB9CisKIHN0YXRpYyB2b2lkIGluaXRfbnVtYV9zY2hlZF9ncm91cHNfcG93ZXIoc3RydWN0IHNjaGVkX2dyb3VwICpncm91cF9oZWFkKQogewogCXN0cnVjdCBzY2hlZF9ncm91cCAqc2cgPSBncm91cF9oZWFkOwpAQCAtNjIxNywxNiArNjM1Niw5IEBACiAJaW50IGNwdSwgaTsKIAogCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKmNwdV9tYXApIHsKLQkJc3RydWN0IHNjaGVkX2dyb3VwICpzY2hlZF9ncm91cF9hbGxub2RlcwotCQkJPSBzY2hlZF9ncm91cF9hbGxub2Rlc19ieWNwdVtjcHVdOwogCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipzY2hlZF9ncm91cF9ub2RlcwogCQkJPSBzY2hlZF9ncm91cF9ub2Rlc19ieWNwdVtjcHVdOwogCi0JCWlmIChzY2hlZF9ncm91cF9hbGxub2RlcykgewotCQkJa2ZyZWUoc2NoZWRfZ3JvdXBfYWxsbm9kZXMpOwotCQkJc2NoZWRfZ3JvdXBfYWxsbm9kZXNfYnljcHVbY3B1XSA9IE5VTEw7Ci0JCX0KLQogCQlpZiAoIXNjaGVkX2dyb3VwX25vZGVzKQogCQkJY29udGludWU7CiAKQEAgLTYzMjAsNyArNjQ1Miw3IEBACiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAjaWZkZWYgQ09ORklHX05VTUEKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipzY2hlZF9ncm91cF9ub2RlcyA9IE5VTEw7Ci0Jc3RydWN0IHNjaGVkX2dyb3VwICpzY2hlZF9ncm91cF9hbGxub2RlcyA9IE5VTEw7CisJaW50IHNkX2FsbG5vZGVzID0gMDsKIAogCS8qCiAJICogQWxsb2NhdGUgdGhlIHBlci1ub2RlIGxpc3Qgb2Ygc2NoZWQgZ3JvdXBzCkBAIC02MzM4LDcgKzY0NzAsNiBAQAogCSAqIFNldCB1cCBkb21haW5zIGZvciBjcHVzIHNwZWNpZmllZCBieSB0aGUgY3B1X21hcC4KIAkgKi8KIAlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B1X21hcCkgewotCQlpbnQgZ3JvdXA7CiAJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gTlVMTCwgKnA7CiAJCWNwdW1hc2tfdCBub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhjcHVfdG9fbm9kZShpKSk7CiAKQEAgLTYzNDcsMjYgKzY0NzgsMTIgQEAKICNpZmRlZiBDT05GSUdfTlVNQQogCQlpZiAoY3B1c193ZWlnaHQoKmNwdV9tYXApCiAJCQkJPiBTRF9OT0RFU19QRVJfRE9NQUlOKmNwdXNfd2VpZ2h0KG5vZGVtYXNrKSkgewotCQkJaWYgKCFzY2hlZF9ncm91cF9hbGxub2RlcykgewotCQkJCXNjaGVkX2dyb3VwX2FsbG5vZGVzCi0JCQkJCT0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApCi0JCQkJCQkgIAkqIE1BWF9OVU1OT0RFUywKLQkJCQkJCSAgR0ZQX0tFUk5FTCwKLQkJCQkJCSAgY3B1X3RvX25vZGUoaSkpOwotCQkJCWlmICghc2NoZWRfZ3JvdXBfYWxsbm9kZXMpIHsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkiQ2FuIG5vdCBhbGxvYyBhbGxub2RlcyBzY2hlZCBncm91cFxuIik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCXNjaGVkX2dyb3VwX2FsbG5vZGVzX2J5Y3B1W2ldCi0JCQkJCQk9IHNjaGVkX2dyb3VwX2FsbG5vZGVzOwotCQkJfQogCQkJc2QgPSAmcGVyX2NwdShhbGxub2Rlc19kb21haW5zLCBpKTsKIAkJCSpzZCA9IFNEX0FMTE5PREVTX0lOSVQ7CiAJCQlzZC0+c3BhbiA9ICpjcHVfbWFwOwotCQkJZ3JvdXAgPSBjcHVfdG9fYWxsbm9kZXNfZ3JvdXAoaSwgY3B1X21hcCk7Ci0JCQlzZC0+Z3JvdXBzID0gJnNjaGVkX2dyb3VwX2FsbG5vZGVzW2dyb3VwXTsKKwkJCWNwdV90b19hbGxub2Rlc19ncm91cChpLCBjcHVfbWFwLCAmc2QtPmdyb3Vwcyk7CiAJCQlwID0gc2Q7CisJCQlzZF9hbGxub2RlcyA9IDE7CiAJCX0gZWxzZQogCQkJcCA9IE5VTEw7CiAKQEAgLTYzODEsMzYgKzY0OTgsMzMgQEAKIAogCQlwID0gc2Q7CiAJCXNkID0gJnBlcl9jcHUocGh5c19kb21haW5zLCBpKTsKLQkJZ3JvdXAgPSBjcHVfdG9fcGh5c19ncm91cChpLCBjcHVfbWFwKTsKIAkJKnNkID0gU0RfQ1BVX0lOSVQ7CiAJCXNkLT5zcGFuID0gbm9kZW1hc2s7CiAJCXNkLT5wYXJlbnQgPSBwOwogCQlpZiAocCkKIAkJCXAtPmNoaWxkID0gc2Q7Ci0JCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfcGh5c1tncm91cF07CisJCWNwdV90b19waHlzX2dyb3VwKGksIGNwdV9tYXAsICZzZC0+Z3JvdXBzKTsKIAogI2lmZGVmIENPTkZJR19TQ0hFRF9NQwogCQlwID0gc2Q7CiAJCXNkID0gJnBlcl9jcHUoY29yZV9kb21haW5zLCBpKTsKLQkJZ3JvdXAgPSBjcHVfdG9fY29yZV9ncm91cChpLCBjcHVfbWFwKTsKIAkJKnNkID0gU0RfTUNfSU5JVDsKIAkJc2QtPnNwYW4gPSBjcHVfY29yZWdyb3VwX21hcChpKTsKIAkJY3B1c19hbmQoc2QtPnNwYW4sIHNkLT5zcGFuLCAqY3B1X21hcCk7CiAJCXNkLT5wYXJlbnQgPSBwOwogCQlwLT5jaGlsZCA9IHNkOwotCQlzZC0+Z3JvdXBzID0gJnNjaGVkX2dyb3VwX2NvcmVbZ3JvdXBdOworCQljcHVfdG9fY29yZV9ncm91cChpLCBjcHVfbWFwLCAmc2QtPmdyb3Vwcyk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKIAkJcCA9IHNkOwogCQlzZCA9ICZwZXJfY3B1KGNwdV9kb21haW5zLCBpKTsKLQkJZ3JvdXAgPSBjcHVfdG9fY3B1X2dyb3VwKGksIGNwdV9tYXApOwogCQkqc2QgPSBTRF9TSUJMSU5HX0lOSVQ7CiAJCXNkLT5zcGFuID0gY3B1X3NpYmxpbmdfbWFwW2ldOwogCQljcHVzX2FuZChzZC0+c3Bhbiwgc2QtPnNwYW4sICpjcHVfbWFwKTsKIAkJc2QtPnBhcmVudCA9IHA7CiAJCXAtPmNoaWxkID0gc2Q7Ci0JCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfY3B1c1tncm91cF07CisJCWNwdV90b19jcHVfZ3JvdXAoaSwgY3B1X21hcCwgJnNkLT5ncm91cHMpOwogI2VuZGlmCiAJfQogCkBAIC02NDIyLDggKzY1MzYsNyBAQAogCQlpZiAoaSAhPSBmaXJzdF9jcHUodGhpc19zaWJsaW5nX21hcCkpCiAJCQljb250aW51ZTsKIAotCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzY2hlZF9ncm91cF9jcHVzLCB0aGlzX3NpYmxpbmdfbWFwLAotCQkJCQljcHVfbWFwLCAmY3B1X3RvX2NwdV9ncm91cCk7CisJCWluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKHRoaXNfc2libGluZ19tYXAsIGNwdV9tYXAsICZjcHVfdG9fY3B1X2dyb3VwKTsKIAl9CiAjZW5kaWYKIApAQCAtNjQzNCw4ICs2NTQ3LDcgQEAKIAkJY3B1c19hbmQodGhpc19jb3JlX21hcCwgdGhpc19jb3JlX21hcCwgKmNwdV9tYXApOwogCQlpZiAoaSAhPSBmaXJzdF9jcHUodGhpc19jb3JlX21hcCkpCiAJCQljb250aW51ZTsKLQkJaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc2NoZWRfZ3JvdXBfY29yZSwgdGhpc19jb3JlX21hcCwKLQkJCQkJY3B1X21hcCwgJmNwdV90b19jb3JlX2dyb3VwKTsKKwkJaW5pdF9zY2hlZF9idWlsZF9ncm91cHModGhpc19jb3JlX21hcCwgY3B1X21hcCwgJmNwdV90b19jb3JlX2dyb3VwKTsKIAl9CiAjZW5kaWYKIApAQCAtNjQ0OCwxNSArNjU2MCwxMyBAQAogCQlpZiAoY3B1c19lbXB0eShub2RlbWFzaykpCiAJCQljb250aW51ZTsKIAotCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzY2hlZF9ncm91cF9waHlzLCBub2RlbWFzaywKLQkJCQkJY3B1X21hcCwgJmNwdV90b19waHlzX2dyb3VwKTsKKwkJaW5pdF9zY2hlZF9idWlsZF9ncm91cHMobm9kZW1hc2ssIGNwdV9tYXAsICZjcHVfdG9fcGh5c19ncm91cCk7CiAJfQogCiAjaWZkZWYgQ09ORklHX05VTUEKIAkvKiBTZXQgdXAgbm9kZSBncm91cHMgKi8KLQlpZiAoc2NoZWRfZ3JvdXBfYWxsbm9kZXMpCi0JCWluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKHNjaGVkX2dyb3VwX2FsbG5vZGVzLCAqY3B1X21hcCwKLQkJCQkJY3B1X21hcCwgJmNwdV90b19hbGxub2Rlc19ncm91cCk7CisJaWYgKHNkX2FsbG5vZGVzKQorCQlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcygqY3B1X21hcCwgY3B1X21hcCwgJmNwdV90b19hbGxub2Rlc19ncm91cCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKIAkJLyogU2V0IHVwIG5vZGUgZ3JvdXBzICovCkBAIC02NTQ4LDEwICs2NjU4LDEwIEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKQogCQlpbml0X251bWFfc2NoZWRfZ3JvdXBzX3Bvd2VyKHNjaGVkX2dyb3VwX25vZGVzW2ldKTsKIAotCWlmIChzY2hlZF9ncm91cF9hbGxub2RlcykgewotCQlpbnQgZ3JvdXAgPSBjcHVfdG9fYWxsbm9kZXNfZ3JvdXAoZmlyc3RfY3B1KCpjcHVfbWFwKSwgY3B1X21hcCk7Ci0JCXN0cnVjdCBzY2hlZF9ncm91cCAqc2cgPSAmc2NoZWRfZ3JvdXBfYWxsbm9kZXNbZ3JvdXBdOworCWlmIChzZF9hbGxub2RlcykgeworCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOwogCisJCWNwdV90b19hbGxub2Rlc19ncm91cChmaXJzdF9jcHUoKmNwdV9tYXApLCBjcHVfbWFwLCAmc2cpOwogCQlpbml0X251bWFfc2NoZWRfZ3JvdXBzX3Bvd2VyKHNnKTsKIAl9CiAjZW5kaWYKQEAgLTY3MjMsOCArNjgzMyw2IEBACiAJICAgIHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdzX3N0b3JlKTsKICNlbmRpZgogCi0KLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIC8qCiAgKiBGb3JjZSBhIHJlaW5pdGlhbGl6YXRpb24gb2YgdGhlIHNjaGVkIGRvbWFpbnMgaGllcmFyY2h5LiAgVGhlIGRvbWFpbnMKICAqIGFuZCBncm91cHMgY2Fubm90IGJlIHVwZGF0ZWQgaW4gcGxhY2Ugd2l0aG91dCByYWNpbmcgd2l0aCB0aGUgYmFsYW5jaW5nCkBAIC02NzU3LDcgKzY4NjUsNiBAQAogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KLSNlbmRpZgogCiB2b2lkIF9faW5pdCBzY2hlZF9pbml0X3NtcCh2b2lkKQogewpAQCAtNjgzMyw2ICs2OTQwLDEwIEBACiAKIAlzZXRfbG9hZF93ZWlnaHQoJmluaXRfdGFzayk7CiAKKyNpZmRlZiBDT05GSUdfU01QCisJb3Blbl9zb2Z0aXJxKFNDSEVEX1NPRlRJUlEsIHJ1bl9yZWJhbGFuY2VfZG9tYWlucywgTlVMTCk7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCiAJcGxpc3RfaGVhZF9pbml0KCZpbml0X3Rhc2sucGlfd2FpdGVycywgJmluaXRfdGFzay5waV9sb2NrKTsKICNlbmRpZgpAQCAtNjg2Nyw2ICs2OTc4LDkgQEAKIAkJCQkiIGNvbnRleHQgYXQgJXM6JWRcbiIsIGZpbGUsIGxpbmUpOwogCQlwcmludGsoImluX2F0b21pYygpOiVkLCBpcnFzX2Rpc2FibGVkKCk6JWRcbiIsCiAJCQlpbl9hdG9taWMoKSwgaXJxc19kaXNhYmxlZCgpKTsKKwkJZGVidWdfc2hvd19oZWxkX2xvY2tzKGN1cnJlbnQpOworCQlpZiAoaXJxc19kaXNhYmxlZCgpKQorCQkJcHJpbnRfaXJxdHJhY2VfZXZlbnRzKGN1cnJlbnQpOwogCQlkdW1wX3N0YWNrKCk7CiAJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggN2VkOGQ1My4uNTYzMDI1NSAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisKICNpbmNsdWRlIDxhc20vcGFyYW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KQEAgLTMzLDcgKzM3LDcgQEAKICAqIFNMQUIgY2FjaGVzIGZvciBzaWduYWwgYml0cy4KICAqLwogCi1zdGF0aWMga21lbV9jYWNoZV90ICpzaWdxdWV1ZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNpZ3F1ZXVlX2NhY2hlcDsKIAogLyoKICAqIEluIFBPU0lYIGEgc2lnbmFsIGlzIHNlbnQgZWl0aGVyIHRvIGEgc3BlY2lmaWMgdGhyZWFkIChMaW51eCB0YXNrKQpAQCAtMjY3LDE4ICsyNzEsMjUgQEAKIAkJCQkJIGludCBvdmVycmlkZV9ybGltaXQpCiB7CiAJc3RydWN0IHNpZ3F1ZXVlICpxID0gTlVMTDsKKwlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXI7CiAKLQlhdG9taWNfaW5jKCZ0LT51c2VyLT5zaWdwZW5kaW5nKTsKKwkvKgorCSAqIEluIG9yZGVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggInN3aXRjaF91c2VyKCkiLCB3ZSB3YW50IHRvIG1ha2UKKwkgKiBzdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgcmUtbG9hZCAidC0+dXNlciIKKwkgKi8KKwl1c2VyID0gdC0+dXNlcjsKKwliYXJyaWVyKCk7CisJYXRvbWljX2luYygmdXNlci0+c2lncGVuZGluZyk7CiAJaWYgKG92ZXJyaWRlX3JsaW1pdCB8fAotCSAgICBhdG9taWNfcmVhZCgmdC0+dXNlci0+c2lncGVuZGluZykgPD0KKwkgICAgYXRvbWljX3JlYWQoJnVzZXItPnNpZ3BlbmRpbmcpIDw9CiAJCQl0LT5zaWduYWwtPnJsaW1bUkxJTUlUX1NJR1BFTkRJTkddLnJsaW1fY3VyKQogCQlxID0ga21lbV9jYWNoZV9hbGxvYyhzaWdxdWV1ZV9jYWNoZXAsIGZsYWdzKTsKIAlpZiAodW5saWtlbHkocSA9PSBOVUxMKSkgewotCQlhdG9taWNfZGVjKCZ0LT51c2VyLT5zaWdwZW5kaW5nKTsKKwkJYXRvbWljX2RlYygmdXNlci0+c2lncGVuZGluZyk7CiAJfSBlbHNlIHsKIAkJSU5JVF9MSVNUX0hFQUQoJnEtPmxpc3QpOwogCQlxLT5mbGFncyA9IDA7Ci0JCXEtPnVzZXIgPSBnZXRfdWlkKHQtPnVzZXIpOworCQlxLT51c2VyID0gZ2V0X3VpZCh1c2VyKTsKIAl9CiAJcmV0dXJuKHEpOwogfQpAQCAtNTc1LDcgKzU4Niw3IEBACiAJZXJyb3IgPSAtRVBFUk07CiAJaWYgKChpbmZvID09IFNFTkRfU0lHX05PSU5GTyB8fCAoIWlzX3NpX3NwZWNpYWwoaW5mbykgJiYgU0lfRlJPTVVTRVIoaW5mbykpKQogCSAgICAmJiAoKHNpZyAhPSBTSUdDT05UKSB8fAotCQkoY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uICE9IHQtPnNpZ25hbC0+c2Vzc2lvbikpCisJCShwcm9jZXNzX3Nlc3Npb24oY3VycmVudCkgIT0gcHJvY2Vzc19zZXNzaW9uKHQpKSkKIAkgICAgJiYgKGN1cnJlbnQtPmV1aWQgXiB0LT5zdWlkKSAmJiAoY3VycmVudC0+ZXVpZCBeIHQtPnVpZCkKIAkgICAgJiYgKGN1cnJlbnQtPnVpZCBeIHQtPnN1aWQpICYmIChjdXJyZW50LT51aWQgXiB0LT51aWQpCiAJICAgICYmICFjYXBhYmxlKENBUF9LSUxMKSkKQEAgLTExMjYsOCArMTEzNyw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1pbnQKLWtpbGxfcHJvY19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBwaWRfdCBwaWQpCitzdGF0aWMgaW50IGtpbGxfcHJvY19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBwaWRfdCBwaWQpCiB7CiAJaW50IGVycm9yOwogCXJjdV9yZWFkX2xvY2soKTsKQEAgLTE2OTUsNyArMTcwNSw5IEBACiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAl9CiAKLQlzY2hlZHVsZSgpOworCWRvIHsKKwkJc2NoZWR1bGUoKTsKKwl9IHdoaWxlICh0cnlfdG9fZnJlZXplKCkpOwogCS8qCiAJICogTm93IHdlIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCBjb250aW51ZWQuCiAJICovCkBAIC0xODcwLDggKzE4ODIsMTIgQEAKIAkJaWYgKHNpZ19rZXJuZWxfaWdub3JlKHNpZ25yKSkgLyogRGVmYXVsdCBpcyBub3RoaW5nLiAqLwogCQkJY29udGludWU7CiAKLQkJLyogSW5pdCBnZXRzIG5vIHNpZ25hbHMgaXQgZG9lc24ndCB3YW50LiAgKi8KLQkJaWYgKGN1cnJlbnQgPT0gY2hpbGRfcmVhcGVyKQorCQkvKgorCQkgKiBJbml0IG9mIGEgcGlkIHNwYWNlIGdldHMgbm8gc2lnbmFscyBpdCBkb2Vzbid0IHdhbnQgZnJvbQorCQkgKiB3aXRoaW4gdGhhdCBwaWQgc3BhY2UuIEl0IGNhbiBvZiBjb3Vyc2UgZ2V0IHNpZ25hbHMgZnJvbQorCQkgKiBpdHMgcGFyZW50IHBpZCBzcGFjZS4KKwkJICovCisJCWlmIChjdXJyZW50ID09IGNoaWxkX3JlYXBlcihjdXJyZW50KSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChzaWdfa2VybmVsX3N0b3Aoc2lnbnIpKSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCBiZjI1MDE1Li45MThlNTJkIDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTU3NCw4ICs1NzQsNiBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9VUF9QUkVQQVJFOgotCQlCVUdfT04ocGVyX2NwdSh0YXNrbGV0X3ZlYywgaG90Y3B1KS5saXN0KTsKLQkJQlVHX09OKHBlcl9jcHUodGFza2xldF9oaV92ZWMsIGhvdGNwdSkubGlzdCk7CiAJCXAgPSBrdGhyZWFkX2NyZWF0ZShrc29mdGlycWQsIGhjcHUsICJrc29mdGlycWQvJWQiLCBob3RjcHUpOwogCQlpZiAoSVNfRVJSKHApKSB7CiAJCQlwcmludGsoImtzb2Z0aXJxZCBmb3IgJWkgZmFpbGVkXG4iLCBob3RjcHUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NwaW5sb2NrLmMgYi9rZXJuZWwvc3BpbmxvY2suYwppbmRleCA0NzZjMzc0Li4yYzZjMmJmIDEwMDY0NAotLS0gYS9rZXJuZWwvc3BpbmxvY2suYworKysgYi9rZXJuZWwvc3BpbmxvY2suYwpAQCAtMjkzLDYgKzI5MywyNyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKF9zcGluX2xvY2tfbmVzdGVkKTsKK3Vuc2lnbmVkIGxvbmcgX19sb2NrZnVuYyBfc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKHNwaW5sb2NrX3QgKmxvY2ssIGludCBzdWJjbGFzcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOworCXNwaW5fYWNxdWlyZSgmbG9jay0+ZGVwX21hcCwgc3ViY2xhc3MsIDAsIF9SRVRfSVBfKTsKKwkvKgorCSAqIE9uIGxvY2tkZXAgd2UgZG9udCB3YW50IHRoZSBoYW5kLWNvZGVkIGlycS1lbmFibGUgb2YKKwkgKiBfcmF3X3NwaW5fbG9ja19mbGFncygpIGNvZGUsIGJlY2F1c2UgbG9ja2RlcCBhc3N1bWVzCisJICogdGhhdCBpbnRlcnJ1cHRzIGFyZSBub3QgcmUtZW5hYmxlZCBkdXJpbmcgbG9jay1hY3F1aXJlOgorCSAqLworI2lmZGVmIENPTkZJR19QUk9WRV9TUElOX0xPQ0tJTkcKKwlfcmF3X3NwaW5fbG9jayhsb2NrKTsKKyNlbHNlCisJX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgJmZsYWdzKTsKKyNlbmRpZgorCXJldHVybiBmbGFnczsKK30KKworRVhQT1JUX1NZTUJPTChfc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCA5ODQ4OWQ4Li5jNzY3NWMxIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC04ODAsNyArODgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZGVmZXJyZWRfY2FkKHZvaWQgKmR1bW15KQorc3RhdGljIHZvaWQgZGVmZXJyZWRfY2FkKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCiB7CiAJa2VybmVsX3Jlc3RhcnQoTlVMTCk7CiB9CkBAIC04OTIsNyArODkyLDcgQEAKICAqLwogdm9pZCBjdHJsX2FsdF9kZWwodm9pZCkKIHsKLQlzdGF0aWMgREVDTEFSRV9XT1JLKGNhZF93b3JrLCBkZWZlcnJlZF9jYWQsIE5VTEwpOworCXN0YXRpYyBERUNMQVJFX1dPUksoY2FkX3dvcmssIGRlZmVycmVkX2NhZCk7CiAKIAlpZiAoQ19BX0QpCiAJCXNjaGVkdWxlX3dvcmsoJmNhZF93b3JrKTsKQEAgLTExMDIsMTQgKzExMDIsMTQgQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0dWlkKHVpZF90IHVpZCkKIHsKIAlpbnQgb2xkX2V1aWQgPSBjdXJyZW50LT5ldWlkOwotCWludCBvbGRfcnVpZCwgb2xkX3N1aWQsIG5ld19ydWlkLCBuZXdfc3VpZDsKKwlpbnQgb2xkX3J1aWQsIG9sZF9zdWlkLCBuZXdfc3VpZDsKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc2VjdXJpdHlfdGFza19zZXR1aWQodWlkLCAodWlkX3QpLTEsICh1aWRfdCktMSwgTFNNX1NFVElEX0lEKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0Jb2xkX3J1aWQgPSBuZXdfcnVpZCA9IGN1cnJlbnQtPnVpZDsKKwlvbGRfcnVpZCA9IGN1cnJlbnQtPnVpZDsKIAlvbGRfc3VpZCA9IGN1cnJlbnQtPnN1aWQ7CiAJbmV3X3N1aWQgPSBvbGRfc3VpZDsKIAkKQEAgLTEzODEsNyArMTM4MSw3IEBACiAKIAlpZiAocC0+cmVhbF9wYXJlbnQgPT0gZ3JvdXBfbGVhZGVyKSB7CiAJCWVyciA9IC1FUEVSTTsKLQkJaWYgKHAtPnNpZ25hbC0+c2Vzc2lvbiAhPSBncm91cF9sZWFkZXItPnNpZ25hbC0+c2Vzc2lvbikKKwkJaWYgKHByb2Nlc3Nfc2Vzc2lvbihwKSAhPSBwcm9jZXNzX3Nlc3Npb24oZ3JvdXBfbGVhZGVyKSkKIAkJCWdvdG8gb3V0OwogCQllcnIgPSAtRUFDQ0VTOwogCQlpZiAocC0+ZGlkX2V4ZWMpCkBAIC0xMzk3LDE2ICsxMzk3LDEzIEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKHBnaWQgIT0gcGlkKSB7Ci0JCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICpnID0KKwkJCWZpbmRfdGFza19ieV9waWRfdHlwZShQSURUWVBFX1BHSUQsIHBnaWQpOwogCi0JCWRvX2VhY2hfdGFza19waWQocGdpZCwgUElEVFlQRV9QR0lELCBwKSB7Ci0JCQlpZiAocC0+c2lnbmFsLT5zZXNzaW9uID09IGdyb3VwX2xlYWRlci0+c2lnbmFsLT5zZXNzaW9uKQotCQkJCWdvdG8gb2tfcGdpZDsKLQkJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKHBnaWQsIFBJRFRZUEVfUEdJRCwgcCk7Ci0JCWdvdG8gb3V0OworCQlpZiAoIWcgfHwgcHJvY2Vzc19zZXNzaW9uKGcpICE9IHByb2Nlc3Nfc2Vzc2lvbihncm91cF9sZWFkZXIpKQorCQkJZ290byBvdXQ7CiAJfQogCi1va19wZ2lkOgogCWVyciA9IHNlY3VyaXR5X3Rhc2tfc2V0cGdpZChwLCBwZ2lkKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTE0NTksNyArMTQ1Niw3IEBACiBhc21saW5rYWdlIGxvbmcgc3lzX2dldHNpZChwaWRfdCBwaWQpCiB7CiAJaWYgKCFwaWQpCi0JCXJldHVybiBjdXJyZW50LT5zaWduYWwtPnNlc3Npb247CisJCXJldHVybiBwcm9jZXNzX3Nlc3Npb24oY3VycmVudCk7CiAJZWxzZSB7CiAJCWludCByZXR2YWw7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKQEAgLTE0NzEsNyArMTQ2OCw3IEBACiAJCWlmIChwKSB7CiAJCQlyZXR2YWwgPSBzZWN1cml0eV90YXNrX2dldHNpZChwKTsKIAkJCWlmICghcmV0dmFsKQotCQkJCXJldHZhbCA9IHAtPnNpZ25hbC0+c2Vzc2lvbjsKKwkJCQlyZXR2YWwgPSBwcm9jZXNzX3Nlc3Npb24ocCk7CiAJCX0KIAkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCQlyZXR1cm4gcmV0dmFsOwpAQCAtMTQ4NCw3ICsxNDgxLDYgQEAKIAlwaWRfdCBzZXNzaW9uOwogCWludCBlcnIgPSAtRVBFUk07CiAKLQltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwogCXdyaXRlX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKIAogCS8qIEZhaWwgaWYgSSBhbSBhbHJlYWR5IGEgc2Vzc2lvbiBsZWFkZXIgKi8KQEAgLTE1MDQsMTIgKzE1MDAsMTUgQEAKIAogCWdyb3VwX2xlYWRlci0+c2lnbmFsLT5sZWFkZXIgPSAxOwogCV9fc2V0X3NwZWNpYWxfcGlkcyhzZXNzaW9uLCBzZXNzaW9uKTsKKworCXNwaW5fbG9jaygmZ3JvdXBfbGVhZGVyLT5zaWdoYW5kLT5zaWdsb2NrKTsKIAlncm91cF9sZWFkZXItPnNpZ25hbC0+dHR5ID0gTlVMTDsKIAlncm91cF9sZWFkZXItPnNpZ25hbC0+dHR5X29sZF9wZ3JwID0gMDsKKwlzcGluX3VubG9jaygmZ3JvdXBfbGVhZGVyLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwogCWVyciA9IHByb2Nlc3NfZ3JvdXAoZ3JvdXBfbGVhZGVyKTsKIG91dDoKIAl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKLQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3N5c19uaS5jIGIva2VybmVsL3N5c19uaS5jCmluZGV4IDdhM2IyZTc1Li5kNzMwNmQwIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzX25pLmMKKysrIGIva2VybmVsL3N5c19uaS5jCkBAIC00OSw2ICs0OSw3IEBACiBjb25kX3N5c2NhbGwoc3lzX2Vwb2xsX2NyZWF0ZSk7CiBjb25kX3N5c2NhbGwoc3lzX2Vwb2xsX2N0bCk7CiBjb25kX3N5c2NhbGwoc3lzX2Vwb2xsX3dhaXQpOworY29uZF9zeXNjYWxsKHN5c19lcG9sbF9wd2FpdCk7CiBjb25kX3N5c2NhbGwoc3lzX3NlbWdldCk7CiBjb25kX3N5c2NhbGwoc3lzX3NlbW9wKTsKIGNvbmRfc3lzY2FsbChzeXNfc2VtdGltZWRvcCk7CkBAIC0xMzQsNiArMTM1LDcgQEAKIGNvbmRfc3lzY2FsbChzeXNfbXJlbWFwKTsKIGNvbmRfc3lzY2FsbChzeXNfcmVtYXBfZmlsZV9wYWdlcyk7CiBjb25kX3N5c2NhbGwoY29tcGF0X3N5c19tb3ZlX3BhZ2VzKTsKK2NvbmRfc3lzY2FsbChjb21wYXRfc3lzX21pZ3JhdGVfcGFnZXMpOwogCiAvKiBibG9jay1sYXllciBkZXBlbmRlbnQgKi8KIGNvbmRfc3lzY2FsbChzeXNfYmRmbHVzaCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggODAyMGZiMi4uNjAwYjMzMyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtNTQsNiArNTQsNyBAQAogCiAjaWZkZWYgQ09ORklHX1g4NgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpCkBAIC02NCw3ICs2NSw2IEBACiBleHRlcm4gaW50IHN5c2N0bF9vdmVyY29tbWl0X3JhdGlvOwogZXh0ZXJuIGludCBzeXNjdGxfcGFuaWNfb25fb29tOwogZXh0ZXJuIGludCBtYXhfdGhyZWFkczsKLWV4dGVybiBpbnQgc3lzcnFfZW5hYmxlZDsKIGV4dGVybiBpbnQgY29yZV91c2VzX3BpZDsKIGV4dGVybiBpbnQgc3VpZF9kdW1wYWJsZTsKIGV4dGVybiBjaGFyIGNvcmVfcGF0dGVybltdOwpAQCAtOTEsNyArOTEsOSBAQAogZXh0ZXJuIGludCBzZ19iaWdfYnVmZjsKICNlbmRpZgogI2lmZGVmIENPTkZJR19TWVNWSVBDCi1zdGF0aWMgaW50IHByb2NfZG9faXBjX3N0cmluZyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorc3RhdGljIGludCBwcm9jX2lwY19kb2ludHZlYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgaW50IHByb2NfaXBjX2RvdWxvbmd2ZWNfbWlubWF4KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKICNlbmRpZgogCkBAIC0xMzAsMTQgKzEzMiwyNiBAQAogCiAjaWZkZWYgQ09ORklHX1NZU0NUTF9TWVNDQUxMCiBzdGF0aWMgaW50IHBhcnNlX3RhYmxlKGludCBfX3VzZXIgKiwgaW50LCB2b2lkIF9fdXNlciAqLCBzaXplX3QgX191c2VyICosCi0JCXZvaWQgX191c2VyICosIHNpemVfdCwgY3RsX3RhYmxlICosIHZvaWQgKiopOworCQl2b2lkIF9fdXNlciAqLCBzaXplX3QsIGN0bF90YWJsZSAqKTsKICNlbmRpZgogCiBzdGF0aWMgaW50IHByb2NfZG9fdXRzX3N0cmluZyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKTsKIAorc3RhdGljIGludCBzeXNjdGxfdXRzX3N0cmluZyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKKwkJICB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pOworCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKK3N0YXRpYyBpbnQgc3lzY3RsX2lwY19kYXRhKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorCQkgIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCSAgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbik7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTAogc3RhdGljIGludCBwcm9jX2RvX2NhZF9waWQoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CisjZW5kaWYKIAogc3RhdGljIGN0bF90YWJsZSByb290X3RhYmxlW107CiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgcm9vdF90YWJsZV9oZWFkZXIgPQpAQCAtMTYwLDYgKzE3NCw0MCBAQAogaW50IHN5c2N0bF9sZWdhY3lfdmFfbGF5b3V0OwogI2VuZGlmCiAKK3N0YXRpYyB2b2lkICpnZXRfdXRzKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSkKK3sKKwljaGFyICp3aGljaCA9IHRhYmxlLT5kYXRhOworI2lmZGVmIENPTkZJR19VVFNfTlMKKwlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqdXRzX25zID0gY3VycmVudC0+bnNwcm94eS0+dXRzX25zOworCXdoaWNoID0gKHdoaWNoIC0gKGNoYXIgKikmaW5pdF91dHNfbnMpICsgKGNoYXIgKil1dHNfbnM7CisjZW5kaWYKKwlpZiAoIXdyaXRlKQorCQlkb3duX3JlYWQoJnV0c19zZW0pOworCWVsc2UKKwkJZG93bl93cml0ZSgmdXRzX3NlbSk7CisJcmV0dXJuIHdoaWNoOworfQorCitzdGF0aWMgdm9pZCBwdXRfdXRzKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgdm9pZCAqd2hpY2gpCit7CisJaWYgKCF3cml0ZSkKKwkJdXBfcmVhZCgmdXRzX3NlbSk7CisJZWxzZQorCQl1cF93cml0ZSgmdXRzX3NlbSk7Cit9CisKKyNpZmRlZiBDT05GSUdfU1lTVklQQworc3RhdGljIHZvaWQgKmdldF9pcGMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlKQoreworCWNoYXIgKndoaWNoID0gdGFibGUtPmRhdGE7CisJc3RydWN0IGlwY19uYW1lc3BhY2UgKmlwY19ucyA9IGN1cnJlbnQtPm5zcHJveHktPmlwY19uczsKKwl3aGljaCA9ICh3aGljaCAtIChjaGFyICopJmluaXRfaXBjX25zKSArIChjaGFyICopaXBjX25zOworCXJldHVybiB3aGljaDsKK30KKyNlbHNlCisjZGVmaW5lIGdldF9pcGMoVCxXKSAoKFQpLT5kYXRhKQorI2VuZGlmCisKIC8qIC9wcm9jIGRlY2xhcmF0aW9uczogKi8KIAogI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTApAQCAtMTY4LDcgKzIxNiw3IEBACiBzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlc3lzKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogc3RhdGljIGludCBwcm9jX29wZW5zeXMoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogCi1zdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3lzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zeXNfZmlsZV9vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IHByb2Nfb3BlbnN5cywKIAkucmVhZAkJPSBwcm9jX3JlYWRzeXMsCiAJLndyaXRlCQk9IHByb2Nfd3JpdGVzeXMsCkBAIC0yMjYsNyArMjc0LDYgQEAKIH07CiAKIHN0YXRpYyBjdGxfdGFibGUga2Vybl90YWJsZVtdID0gewotI2lmbmRlZiBDT05GSUdfVVRTX05TCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX09TVFlQRSwKIAkJLnByb2NuYW1lCT0gIm9zdHlwZSIsCkBAIC0yMzQsNyArMjgxLDcgQEAKIAkJLm1heGxlbgkJPSBzaXplb2YoaW5pdF91dHNfbnMubmFtZS5zeXNuYW1lKSwKIAkJLm1vZGUJCT0gMDQ0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX3V0c19zdHJpbmcsCi0JCS5zdHJhdGVneQk9ICZzeXNjdGxfc3RyaW5nLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3V0c19zdHJpbmcsCiAJfSwKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fT1NSRUxFQVNFLApAQCAtMjQzLDcgKzI5MCw3IEBACiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGluaXRfdXRzX25zLm5hbWUucmVsZWFzZSksCiAJCS5tb2RlCQk9IDA0NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb191dHNfc3RyaW5nLAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF91dHNfc3RyaW5nLAogCX0sCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX1ZFUlNJT04sCkBAIC0yNTIsNyArMjk5LDcgQEAKIAkJLm1heGxlbgkJPSBzaXplb2YoaW5pdF91dHNfbnMubmFtZS52ZXJzaW9uKSwKIAkJLm1vZGUJCT0gMDQ0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX3V0c19zdHJpbmcsCi0JCS5zdHJhdGVneQk9ICZzeXNjdGxfc3RyaW5nLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3V0c19zdHJpbmcsCiAJfSwKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fTk9ERU5BTUUsCkBAIC0yNjEsNyArMzA4LDcgQEAKIAkJLm1heGxlbgkJPSBzaXplb2YoaW5pdF91dHNfbnMubmFtZS5ub2RlbmFtZSksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb191dHNfc3RyaW5nLAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF91dHNfc3RyaW5nLAogCX0sCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX0RPTUFJTk5BTUUsCkBAIC0yNzAsNTYgKzMxNyw4IEBACiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGluaXRfdXRzX25zLm5hbWUuZG9tYWlubmFtZSksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb191dHNfc3RyaW5nLAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF91dHNfc3RyaW5nLAogCX0sCi0jZWxzZSAgLyogIUNPTkZJR19VVFNfTlMgKi8KLQl7Ci0JCS5jdGxfbmFtZQk9IEtFUk5fT1NUWVBFLAotCQkucHJvY25hbWUJPSAib3N0eXBlIiwKLQkJLmRhdGEJCT0gTlVMTCwKLQkJLyogY291bGQgbWF5YmUgdXNlIF9fTkVXX1VUU19MRU4gaGVyZT8gKi8KLQkJLm1heGxlbgkJPSBGSUVMRF9TSVpFT0Yoc3RydWN0IG5ld191dHNuYW1lLCBzeXNuYW1lKSwKLQkJLm1vZGUJCT0gMDQ0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX3V0c19zdHJpbmcsCi0JCS5zdHJhdGVneQk9ICZzeXNjdGxfc3RyaW5nLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBLRVJOX09TUkVMRUFTRSwKLQkJLnByb2NuYW1lCT0gIm9zcmVsZWFzZSIsCi0JCS5kYXRhCQk9IE5VTEwsCi0JCS5tYXhsZW4JCT0gRklFTERfU0laRU9GKHN0cnVjdCBuZXdfdXRzbmFtZSwgcmVsZWFzZSksCi0JCS5tb2RlCQk9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb191dHNfc3RyaW5nLAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gS0VSTl9WRVJTSU9OLAotCQkucHJvY25hbWUJPSAidmVyc2lvbiIsCi0JCS5kYXRhCQk9IE5VTEwsCi0JCS5tYXhsZW4JCT0gRklFTERfU0laRU9GKHN0cnVjdCBuZXdfdXRzbmFtZSwgdmVyc2lvbiksCi0JCS5tb2RlCQk9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb191dHNfc3RyaW5nLAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gS0VSTl9OT0RFTkFNRSwKLQkJLnByb2NuYW1lCT0gImhvc3RuYW1lIiwKLQkJLmRhdGEJCT0gTlVMTCwKLQkJLm1heGxlbgkJPSBGSUVMRF9TSVpFT0Yoc3RydWN0IG5ld191dHNuYW1lLCBub2RlbmFtZSksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb191dHNfc3RyaW5nLAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gS0VSTl9ET01BSU5OQU1FLAotCQkucHJvY25hbWUJPSAiZG9tYWlubmFtZSIsCi0JCS5kYXRhCQk9IE5VTEwsCi0JCS5tYXhsZW4JCT0gRklFTERfU0laRU9GKHN0cnVjdCBuZXdfdXRzbmFtZSwgZG9tYWlubmFtZSksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb191dHNfc3RyaW5nLAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZywKLQl9LAotI2VuZGlmIC8qICFDT05GSUdfVVRTX05TICovCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX1BBTklDLAogCQkucHJvY25hbWUJPSAicGFuaWMiLApAQCAtNDc4LDcwICs0NzcsNzggQEAKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fU0hNTUFYLAogCQkucHJvY25hbWUJPSAic2htbWF4IiwKLQkJLmRhdGEJCT0gTlVMTCwKLQkJLm1heGxlbgkJPSBzaXplb2YgKHNpemVfdCksCisJCS5kYXRhCQk9ICZpbml0X2lwY19ucy5zaG1fY3RsbWF4LAorCQkubWF4bGVuCQk9IHNpemVvZiAoaW5pdF9pcGNfbnMuc2htX2N0bG1heCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19pcGNfc3RyaW5nLAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfaXBjX2RvdWxvbmd2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSBzeXNjdGxfaXBjX2RhdGEsCiAJfSwKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fU0hNQUxMLAogCQkucHJvY25hbWUJPSAic2htYWxsIiwKLQkJLmRhdGEJCT0gTlVMTCwKLQkJLm1heGxlbgkJPSBzaXplb2YgKHNpemVfdCksCisJCS5kYXRhCQk9ICZpbml0X2lwY19ucy5zaG1fY3RsYWxsLAorCQkubWF4bGVuCQk9IHNpemVvZiAoaW5pdF9pcGNfbnMuc2htX2N0bGFsbCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19pcGNfc3RyaW5nLAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfaXBjX2RvdWxvbmd2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSBzeXNjdGxfaXBjX2RhdGEsCiAJfSwKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fU0hNTU5JLAogCQkucHJvY25hbWUJPSAic2htbW5pIiwKLQkJLmRhdGEJCT0gTlVMTCwKLQkJLm1heGxlbgkJPSBzaXplb2YgKGludCksCisJCS5kYXRhCQk9ICZpbml0X2lwY19ucy5zaG1fY3RsbW5pLAorCQkubWF4bGVuCQk9IHNpemVvZiAoaW5pdF9pcGNfbnMuc2htX2N0bG1uaSksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19pcGNfc3RyaW5nLAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfaXBjX2RvaW50dmVjLAorCQkuc3RyYXRlZ3kJPSBzeXNjdGxfaXBjX2RhdGEsCiAJfSwKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fTVNHTUFYLAogCQkucHJvY25hbWUJPSAibXNnbWF4IiwKLQkJLmRhdGEJCT0gTlVMTCwKLQkJLm1heGxlbgkJPSBzaXplb2YgKGludCksCisJCS5kYXRhCQk9ICZpbml0X2lwY19ucy5tc2dfY3RsbWF4LAorCQkubWF4bGVuCQk9IHNpemVvZiAoaW5pdF9pcGNfbnMubXNnX2N0bG1heCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19pcGNfc3RyaW5nLAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfaXBjX2RvaW50dmVjLAorCQkuc3RyYXRlZ3kJPSBzeXNjdGxfaXBjX2RhdGEsCiAJfSwKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fTVNHTU5JLAogCQkucHJvY25hbWUJPSAibXNnbW5pIiwKLQkJLmRhdGEJCT0gTlVMTCwKLQkJLm1heGxlbgkJPSBzaXplb2YgKGludCksCisJCS5kYXRhCQk9ICZpbml0X2lwY19ucy5tc2dfY3RsbW5pLAorCQkubWF4bGVuCQk9IHNpemVvZiAoaW5pdF9pcGNfbnMubXNnX2N0bG1uaSksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19pcGNfc3RyaW5nLAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfaXBjX2RvaW50dmVjLAorCQkuc3RyYXRlZ3kJPSBzeXNjdGxfaXBjX2RhdGEsCiAJfSwKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fTVNHTU5CLAogCQkucHJvY25hbWUJPSAgIm1zZ21uYiIsCi0JCS5kYXRhCQk9IE5VTEwsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mIChpbnQpLAorCQkuZGF0YQkJPSAmaW5pdF9pcGNfbnMubXNnX2N0bG1uYiwKKwkJLm1heGxlbgkJPSBzaXplb2YgKGluaXRfaXBjX25zLm1zZ19jdGxtbmIpLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9faXBjX3N0cmluZywKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2lwY19kb2ludHZlYywKKwkJLnN0cmF0ZWd5CT0gc3lzY3RsX2lwY19kYXRhLAogCX0sCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX1NFTSwKIAkJLnByb2NuYW1lCT0gInNlbSIsCi0JCS5kYXRhCQk9IE5VTEwsCisJCS5kYXRhCQk9ICZpbml0X2lwY19ucy5zZW1fY3RscywKIAkJLm1heGxlbgkJPSA0KnNpemVvZiAoaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvX2lwY19zdHJpbmcsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19pcGNfZG9pbnR2ZWMsCisJCS5zdHJhdGVneQk9IHN5c2N0bF9pcGNfZGF0YSwKIAl9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX1NZU1JRLAogCQkucHJvY25hbWUJPSAic3lzcnEiLAotCQkuZGF0YQkJPSAmc3lzcnFfZW5hYmxlZCwKKwkJLmRhdGEJCT0gJl9fc3lzcnFfZW5hYmxlZCwKIAkJLm1heGxlbgkJPSBzaXplb2YgKGludCksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST0NfU1lTQ1RMCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX0NBRFBJRCwKIAkJLnByb2NuYW1lCT0gImNhZF9waWQiLApAQCAtNTUwLDYgKzU1Nyw3IEBACiAJCS5tb2RlCQk9IDA2MDAsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb19jYWRfcGlkLAogCX0sCisjZW5kaWYKIAl7CiAJCS5jdGxfbmFtZQk9IEtFUk5fTUFYX1RIUkVBRFMsCiAJCS5wcm9jbmFtZQk9ICJ0aHJlYWRzLW1heCIsCkBAIC03MDMsNiArNzExLDE0IEBACiAJCS5tb2RlCQk9IDA0NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJrc3RhY2tfZGVwdGhfdG9fcHJpbnQiLAorCQkuZGF0YQkJPSAma3N0YWNrX2RlcHRoX3RvX3ByaW50LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX01NVSkKIAl7CkBAIC05NzMsMTcgKzk4OSw2IEBACiAJCS5leHRyYTEJCT0gJnplcm8sCiAJfSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19TV0FQCi0JewotCQkuY3RsX25hbWUJPSBWTV9TV0FQX1RPS0VOX1RJTUVPVVQsCi0JCS5wcm9jbmFtZQk9ICJzd2FwX3Rva2VuX3RpbWVvdXQiLAotCQkuZGF0YQkJPSAmc3dhcF90b2tlbl9kZWZhdWx0X3RpbWVvdXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHN3YXBfdG9rZW5fZGVmYXVsdF90aW1lb3V0KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKLQl9LAotI2VuZGlmCiAjaWZkZWYgQ09ORklHX05VTUEKIAl7CiAJCS5jdGxfbmFtZQk9IFZNX1pPTkVfUkVDTEFJTV9NT0RFLApAQCAtMTIzNyw3ICsxMjQyLDYgQEAKIAlkbyB7CiAJCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkID0KIAkJCWxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciwgY3RsX2VudHJ5KTsKLQkJdm9pZCAqY29udGV4dCA9IE5VTEw7CiAKIAkJaWYgKCF1c2VfdGFibGUoaGVhZCkpCiAJCQljb250aW51ZTsKQEAgLTEyNDUsOSArMTI0OSw3IEBACiAJCXNwaW5fdW5sb2NrKCZzeXNjdGxfbG9jayk7CiAKIAkJZXJyb3IgPSBwYXJzZV90YWJsZShuYW1lLCBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIAotCQkJCQluZXd2YWwsIG5ld2xlbiwgaGVhZC0+Y3RsX3RhYmxlLAotCQkJCQkmY29udGV4dCk7Ci0JCWtmcmVlKGNvbnRleHQpOworCQkJCQluZXd2YWwsIG5ld2xlbiwgaGVhZC0+Y3RsX3RhYmxlKTsKIAogCQlzcGluX2xvY2soJnN5c2N0bF9sb2NrKTsKIAkJdW51c2VfdGFibGUoaGVhZCk7CkBAIC0xMzAzLDcgKzEzMDUsNyBAQAogc3RhdGljIGludCBwYXJzZV90YWJsZShpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJICAgICAgIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCSAgICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLAotCQkgICAgICAgY3RsX3RhYmxlICp0YWJsZSwgdm9pZCAqKmNvbnRleHQpCisJCSAgICAgICBjdGxfdGFibGUgKnRhYmxlKQogewogCWludCBuOwogcmVwZWF0OgpAQCAtMTMxMSw3ICsxMzEzLDkgQEAKIAkJcmV0dXJuIC1FTk9URElSOwogCWlmIChnZXRfdXNlcihuLCBuYW1lKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JZm9yICggOyB0YWJsZS0+Y3RsX25hbWU7IHRhYmxlKyspIHsKKwlmb3IgKCA7IHRhYmxlLT5jdGxfbmFtZSB8fCB0YWJsZS0+cHJvY25hbWU7IHRhYmxlKyspIHsKKwkJaWYgKCF0YWJsZS0+Y3RsX25hbWUpCisJCQljb250aW51ZTsKIAkJaWYgKG4gPT0gdGFibGUtPmN0bF9uYW1lIHx8IHRhYmxlLT5jdGxfbmFtZSA9PSBDVExfQU5ZKSB7CiAJCQlpbnQgZXJyb3I7CiAJCQlpZiAodGFibGUtPmNoaWxkKSB7CkBAIC0xMzIxLDcgKzEzMjUsNyBAQAogCQkJCQllcnJvciA9IHRhYmxlLT5zdHJhdGVneSgKIAkJCQkJCXRhYmxlLCBuYW1lLCBubGVuLAogCQkJCQkJb2xkdmFsLCBvbGRsZW5wLAotCQkJCQkJbmV3dmFsLCBuZXdsZW4sIGNvbnRleHQpOworCQkJCQkJbmV3dmFsLCBuZXdsZW4pOwogCQkJCQlpZiAoZXJyb3IpCiAJCQkJCQlyZXR1cm4gZXJyb3I7CiAJCQkJfQpAQCAtMTMzMiw3ICsxMzM2LDcgQEAKIAkJCX0KIAkJCWVycm9yID0gZG9fc3lzY3RsX3N0cmF0ZWd5KHRhYmxlLCBuYW1lLCBubGVuLAogCQkJCQkJICAgb2xkdmFsLCBvbGRsZW5wLAotCQkJCQkJICAgbmV3dmFsLCBuZXdsZW4sIGNvbnRleHQpOworCQkJCQkJICAgbmV3dmFsLCBuZXdsZW4pOwogCQkJcmV0dXJuIGVycm9yOwogCQl9CiAJfQpAQCAtMTM0Myw3ICsxMzQ3LDcgQEAKIGludCBkb19zeXNjdGxfc3RyYXRlZ3kgKGN0bF90YWJsZSAqdGFibGUsIAogCQkJaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAotCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgdm9pZCAqKmNvbnRleHQpCisJCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWludCBvcCA9IDAsIHJjOwogCXNpemVfdCBsZW47CkBAIC0xMzU3LDcgKzEzNjEsNyBAQAogCiAJaWYgKHRhYmxlLT5zdHJhdGVneSkgewogCQlyYyA9IHRhYmxlLT5zdHJhdGVneSh0YWJsZSwgbmFtZSwgbmxlbiwgb2xkdmFsLCBvbGRsZW5wLAotCQkJCSAgICAgbmV3dmFsLCBuZXdsZW4sIGNvbnRleHQpOworCQkJCSAgICAgbmV3dmFsLCBuZXdsZW4pOwogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwogCQlpZiAocmMgPiAwKQpAQCAtMTUyOCw3ICsxNTMyLDcgQEAKIAlpbnQgbGVuOwogCW1vZGVfdCBtb2RlOwogCQotCWZvciAoOyB0YWJsZS0+Y3RsX25hbWU7IHRhYmxlKyspIHsKKwlmb3IgKDsgdGFibGUtPmN0bF9uYW1lIHx8IHRhYmxlLT5wcm9jbmFtZTsgdGFibGUrKykgewogCQkvKiBDYW4ndCBkbyBhbnl0aGluZyB3aXRob3V0IGEgcHJvYyBuYW1lLiAqLwogCQlpZiAoIXRhYmxlLT5wcm9jbmFtZSkKIAkJCWNvbnRpbnVlOwpAQCAtMTU3NSw3ICsxNTc5LDcgQEAKIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfcHJvY190YWJsZShjdGxfdGFibGUgKiB0YWJsZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290KQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGU7Ci0JZm9yICg7IHRhYmxlLT5jdGxfbmFtZTsgdGFibGUrKykgeworCWZvciAoOyB0YWJsZS0+Y3RsX25hbWUgfHwgdGFibGUtPnByb2NuYW1lOyB0YWJsZSsrKSB7CiAJCWlmICghKGRlID0gdGFibGUtPmRlKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoZGUtPm1vZGUgJiBTX0lGRElSKSB7CkBAIC0xNjEwLDcgKzE2MTQsNyBAQAogCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgb3A7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKIAlzaXplX3QgcmVzOwogCXNzaXplX3QgZXJyb3IgPSAtRU5PVERJUjsKQEAgLTE3NDksNjYgKzE3NTMsMTcgQEAKICAqCVNwZWNpYWwgY2FzZSBvZiBkb3N0cmluZyBmb3IgdGhlIFVUUyBzdHJ1Y3R1cmUuIFRoaXMgaGFzIGxvY2tzCiAgKgl0byBvYnNlcnZlLiBTaG91bGQgdGhpcyBiZSBpbiBrZXJuZWwvc3lzLmMgPz8/PwogICovCi0gCi0jaWZuZGVmIENPTkZJR19VVFNfTlMKKwogc3RhdGljIGludCBwcm9jX2RvX3V0c19zdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgcjsKLQotCWlmICghd3JpdGUpIHsKLQkJZG93bl9yZWFkKCZ1dHNfc2VtKTsKLQkJcj1wcm9jX2Rvc3RyaW5nKHRhYmxlLDAsZmlscCxidWZmZXIsbGVucCwgcHBvcyk7Ci0JCXVwX3JlYWQoJnV0c19zZW0pOwotCX0gZWxzZSB7Ci0JCWRvd25fd3JpdGUoJnV0c19zZW0pOwotCQlyPXByb2NfZG9zdHJpbmcodGFibGUsMSxmaWxwLGJ1ZmZlcixsZW5wLCBwcG9zKTsKLQkJdXBfd3JpdGUoJnV0c19zZW0pOwotCX0KKwl2b2lkICp3aGljaDsKKwl3aGljaCA9IGdldF91dHModGFibGUsIHdyaXRlKTsKKwlyID0gX3Byb2NfZG9fc3RyaW5nKHdoaWNoLCB0YWJsZS0+bWF4bGVuLHdyaXRlLGZpbHAsYnVmZmVyLGxlbnAsIHBwb3MpOworCXB1dF91dHModGFibGUsIHdyaXRlLCB3aGljaCk7CiAJcmV0dXJuIHI7CiB9Ci0jZWxzZSAvKiAhQ09ORklHX1VUU19OUyAqLwotc3RhdGljIGludCBwcm9jX2RvX3V0c19zdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgcjsKLQlzdHJ1Y3QgdXRzX25hbWVzcGFjZSogdXRzX25zID0gY3VycmVudC0+bnNwcm94eS0+dXRzX25zOwotCWNoYXIqIHdoaWNoOwotCi0Jc3dpdGNoICh0YWJsZS0+Y3RsX25hbWUpIHsKLQljYXNlIEtFUk5fT1NUWVBFOgotCQl3aGljaCA9IHV0c19ucy0+bmFtZS5zeXNuYW1lOwotCQlicmVhazsKLQljYXNlIEtFUk5fTk9ERU5BTUU6Ci0JCXdoaWNoID0gdXRzX25zLT5uYW1lLm5vZGVuYW1lOwotCQlicmVhazsKLQljYXNlIEtFUk5fT1NSRUxFQVNFOgotCQl3aGljaCA9IHV0c19ucy0+bmFtZS5yZWxlYXNlOwotCQlicmVhazsKLQljYXNlIEtFUk5fVkVSU0lPTjoKLQkJd2hpY2ggPSB1dHNfbnMtPm5hbWUudmVyc2lvbjsKLQkJYnJlYWs7Ci0JY2FzZSBLRVJOX0RPTUFJTk5BTUU6Ci0JCXdoaWNoID0gdXRzX25zLT5uYW1lLmRvbWFpbm5hbWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXIgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoIXdyaXRlKSB7Ci0JCWRvd25fcmVhZCgmdXRzX3NlbSk7Ci0JCXI9X3Byb2NfZG9fc3RyaW5nKHdoaWNoLHRhYmxlLT5tYXhsZW4sMCxmaWxwLGJ1ZmZlcixsZW5wLCBwcG9zKTsKLQkJdXBfcmVhZCgmdXRzX3NlbSk7Ci0JfSBlbHNlIHsKLQkJZG93bl93cml0ZSgmdXRzX3NlbSk7Ci0JCXI9X3Byb2NfZG9fc3RyaW5nKHdoaWNoLHRhYmxlLT5tYXhsZW4sMSxmaWxwLGJ1ZmZlcixsZW5wLCBwcG9zKTsKLQkJdXBfd3JpdGUoJnV0c19zZW0pOwotCX0KLSBvdXQ6Ci0JcmV0dXJuIHI7Ci19Ci0jZW5kaWYgLyogIUNPTkZJR19VVFNfTlMgKi8KIAogc3RhdGljIGludCBkb19wcm9jX2RvaW50dmVjX2NvbnYoaW50ICpuZWdwLCB1bnNpZ25lZCBsb25nICpsdmFscCwKIAkJCQkgaW50ICp2YWxwLApAQCAtMTg4MCw3ICsxODM1LDcgQEAKIAkJCXAgPSBidWY7CiAJCQlpZiAoKnAgPT0gJy0nICYmIGxlZnQgPiAxKSB7CiAJCQkJbmVnID0gMTsKLQkJCQlsZWZ0LS0sIHArKzsKKwkJCQlwKys7CiAJCQl9CiAJCQlpZiAoKnAgPCAnMCcgfHwgKnAgPiAnOScpCiAJCQkJYnJlYWs7CkBAIC0xOTcyLDkgKzE5MjcsNiBAQAogCiAjZGVmaW5lIE9QX1NFVAkwCiAjZGVmaW5lIE9QX0FORAkxCi0jZGVmaW5lIE9QX09SCTIKLSNkZWZpbmUgT1BfTUFYCTMKLSNkZWZpbmUgT1BfTUlOCTQKIAogc3RhdGljIGludCBkb19wcm9jX2RvaW50dmVjX2JzZXRfY29udihpbnQgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKmx2YWxwLAogCQkJCSAgICAgIGludCAqdmFscCwKQEAgLTE5ODYsMTMgKzE5MzgsNiBAQAogCQlzd2l0Y2gob3ApIHsKIAkJY2FzZSBPUF9TRVQ6CSp2YWxwID0gdmFsOyBicmVhazsKIAkJY2FzZSBPUF9BTkQ6CSp2YWxwICY9IHZhbDsgYnJlYWs7Ci0JCWNhc2UgT1BfT1I6CSp2YWxwIHw9IHZhbDsgYnJlYWs7Ci0JCWNhc2UgT1BfTUFYOglpZigqdmFscCA8IHZhbCkKLQkJCQkJKnZhbHAgPSB2YWw7Ci0JCQkJYnJlYWs7Ci0JCWNhc2UgT1BfTUlOOglpZigqdmFscCA+IHZhbCkKLQkJCQkqdmFscCA9IHZhbDsKLQkJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7CiAJCWludCB2YWwgPSAqdmFscDsKQEAgLTIxMzEsNyArMjA3Niw3IEBACiAJCQlwID0gYnVmOwogCQkJaWYgKCpwID09ICctJyAmJiBsZWZ0ID4gMSkgewogCQkJCW5lZyA9IDE7Ci0JCQkJbGVmdC0tLCBwKys7CisJCQkJcCsrOwogCQkJfQogCQkJaWYgKCpwIDwgJzAnIHx8ICpwID4gJzknKQogCQkJCWJyZWFrOwpAQCAtMjM4Nyw0NiArMjMzMiwyNCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NZU1ZJUEMKLXN0YXRpYyBpbnQgcHJvY19kb19pcGNfc3RyaW5nKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQorc3RhdGljIGludCBwcm9jX2lwY19kb2ludHZlYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewotCXZvaWQgKmRhdGE7Ci0Jc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zOwotCi0JbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnM7Ci0KLQlzd2l0Y2ggKHRhYmxlLT5jdGxfbmFtZSkgewotCWNhc2UgS0VSTl9TSE1NQVg6Ci0JCWRhdGEgPSAmbnMtPnNobV9jdGxtYXg7Ci0JCWdvdG8gcHJvY19taW5tYXg7Ci0JY2FzZSBLRVJOX1NITUFMTDoKLQkJZGF0YSA9ICZucy0+c2htX2N0bGFsbDsKLQkJZ290byBwcm9jX21pbm1heDsKLQljYXNlIEtFUk5fU0hNTU5JOgotCQlkYXRhID0gJm5zLT5zaG1fY3RsbW5pOwotCQlicmVhazsKLQljYXNlIEtFUk5fTVNHTUFYOgotCQlkYXRhID0gJm5zLT5tc2dfY3RsbWF4OwotCQlicmVhazsKLQljYXNlIEtFUk5fTVNHTU5JOgotCQlkYXRhID0gJm5zLT5tc2dfY3RsbW5pOwotCQlicmVhazsKLQljYXNlIEtFUk5fTVNHTU5COgotCQlkYXRhID0gJm5zLT5tc2dfY3RsbW5iOwotCQlicmVhazsKLQljYXNlIEtFUk5fU0VNOgotCQlkYXRhID0gJm5zLT5zZW1fY3RsczsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIF9fZG9fcHJvY19kb2ludHZlYyhkYXRhLCB0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwKKwl2b2lkICp3aGljaDsKKwl3aGljaCA9IGdldF9pcGModGFibGUsIHdyaXRlKTsKKwlyZXR1cm4gX19kb19wcm9jX2RvaW50dmVjKHdoaWNoLCB0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwKIAkJCWxlbnAsIHBwb3MsIE5VTEwsIE5VTEwpOwotcHJvY19taW5tYXg6Ci0JcmV0dXJuIF9fZG9fcHJvY19kb3Vsb25ndmVjX21pbm1heChkYXRhLCB0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwKK30KKworc3RhdGljIGludCBwcm9jX2lwY19kb3Vsb25ndmVjX21pbm1heChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXZvaWQgKndoaWNoOworCXdoaWNoID0gZ2V0X2lwYyh0YWJsZSwgd3JpdGUpOworCXJldHVybiBfX2RvX3Byb2NfZG91bG9uZ3ZlY19taW5tYXgod2hpY2gsIHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLAogCQkJbGVucCwgcHBvcywgMWwsIDFsKTsKIH0KKwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgcHJvY19kb19jYWRfcGlkKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC0yNDcxLDYgKzIzOTQsMTcgQEAKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KK3N0YXRpYyBpbnQgcHJvY19pcGNfZG9pbnR2ZWMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CitzdGF0aWMgaW50IHByb2NfaXBjX2RvdWxvbmd2ZWNfbWlubWF4KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsCisJCXNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRU5PU1lTOworfQogI2VuZGlmCiAKIGludCBwcm9jX2RvaW50dmVjKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC0yNTM1LDcgKzI0NjksNyBAQAogLyogVGhlIGdlbmVyaWMgc3RyaW5nIHN0cmF0ZWd5IHJvdXRpbmU6ICovCiBpbnQgc3lzY3RsX3N0cmluZyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJICB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAotCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJaWYgKCF0YWJsZS0+ZGF0YSB8fCAhdGFibGUtPm1heGxlbikgCiAJCXJldHVybiAtRU5PVERJUjsKQEAgLTI1ODEsNyArMjUxNSw3IEBACiAgKi8KIGludCBzeXNjdGxfaW50dmVjKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAogCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAotCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCB2b2lkICoqY29udGV4dCkKKwkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKIAogCWlmIChuZXd2YWwgJiYgbmV3bGVuKSB7CkBAIC0yNjE3LDcgKzI1NTEsNyBAQAogLyogU3RyYXRlZ3kgZnVuY3Rpb24gdG8gY29udmVydCBqaWZmaWVzIHRvIHNlY29uZHMgKi8gCiBpbnQgc3lzY3RsX2ppZmZpZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCi0JCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWlmIChvbGR2YWwpIHsKIAkJc2l6ZV90IG9sZW47CkBAIC0yNjQ1LDcgKzI1NzksNyBAQAogLyogU3RyYXRlZ3kgZnVuY3Rpb24gdG8gY29udmVydCBqaWZmaWVzIHRvIHNlY29uZHMgKi8gCiBpbnQgc3lzY3RsX21zX2ppZmZpZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCi0JCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWlmIChvbGR2YWwpIHsKIAkJc2l6ZV90IG9sZW47CkBAIC0yNjcwLDUwICsyNjA0LDE0MCBAQAogCXJldHVybiAxOwogfQogCisKKy8qIFRoZSBnZW5lcmljIHN0cmluZyBzdHJhdGVneSByb3V0aW5lOiAqLworc3RhdGljIGludCBzeXNjdGxfdXRzX3N0cmluZyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKKwkJICB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCit7CisJc3RydWN0IGN0bF90YWJsZSB1dHNfdGFibGU7CisJaW50IHIsIHdyaXRlOworCXdyaXRlID0gbmV3dmFsICYmIG5ld2xlbjsKKwltZW1jcHkoJnV0c190YWJsZSwgdGFibGUsIHNpemVvZih1dHNfdGFibGUpKTsKKwl1dHNfdGFibGUuZGF0YSA9IGdldF91dHModGFibGUsIHdyaXRlKTsKKwlyID0gc3lzY3RsX3N0cmluZygmdXRzX3RhYmxlLCBuYW1lLCBubGVuLAorCQlvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuKTsKKwlwdXRfdXRzKHRhYmxlLCB3cml0ZSwgdXRzX3RhYmxlLmRhdGEpOworCXJldHVybiByOworfQorCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKKy8qIFRoZSBnZW5lcmljIHN5c2N0bCBpcGMgZGF0YSByb3V0aW5lLiAqLworc3RhdGljIGludCBzeXNjdGxfaXBjX2RhdGEoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCisJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCit7CisJc2l6ZV90IGxlbjsKKwl2b2lkICpkYXRhOworCisJLyogR2V0IG91dCBvZiBJIGRvbid0IGhhdmUgYSB2YXJpYWJsZSAqLworCWlmICghdGFibGUtPmRhdGEgfHwgIXRhYmxlLT5tYXhsZW4pCisJCXJldHVybiAtRU5PVERJUjsKKworCWRhdGEgPSBnZXRfaXBjKHRhYmxlLCAxKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PVERJUjsKKworCWlmIChvbGR2YWwgJiYgb2xkbGVucCkgeworCQlpZiAoZ2V0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAobGVuKSB7CisJCQlpZiAobGVuID4gdGFibGUtPm1heGxlbikKKwkJCQlsZW4gPSB0YWJsZS0+bWF4bGVuOworCQkJaWYgKGNvcHlfdG9fdXNlcihvbGR2YWwsIGRhdGEsIGxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAocHV0X3VzZXIobGVuLCBvbGRsZW5wKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCWlmIChuZXd2YWwgJiYgbmV3bGVuKSB7CisJCWlmIChuZXdsZW4gPiB0YWJsZS0+bWF4bGVuKQorCQkJbmV3bGVuID0gdGFibGUtPm1heGxlbjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgbmV3dmFsLCBuZXdsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKICNlbHNlIC8qIENPTkZJR19TWVNDVExfU1lTQ0FMTCAqLwogCiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfc3lzY3RsKHN0cnVjdCBfX3N5c2N0bF9hcmdzIF9fdXNlciAqYXJncykKIHsKIAlzdGF0aWMgaW50IG1zZ19jb3VudDsKKwlzdHJ1Y3QgX19zeXNjdGxfYXJncyB0bXA7CisJaW50IG5hbWVbQ1RMX01BWE5BTUVdOworCWludCBpOworCisJLyogUmVhZCBpbiB0aGUgc3lzY3RsIG5hbWUgZm9yIGJldHRlciBkZWJ1ZyBtZXNzYWdlIGxvZ2dpbmcgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgYXJncywgc2l6ZW9mKHRtcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodG1wLm5sZW4gPD0gMCB8fCB0bXAubmxlbiA+PSBDVExfTUFYTkFNRSkKKwkJcmV0dXJuIC1FTk9URElSOworCWZvciAoaSA9IDA7IGkgPCB0bXAubmxlbjsgaSsrKQorCQlpZiAoZ2V0X3VzZXIobmFtZVtpXSwgdG1wLm5hbWUgKyBpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJLyogSWdub3JlIGFjY2Vzc2VzIHRvIGtlcm5lbC52ZXJzaW9uICovCisJaWYgKCh0bXAubmxlbiA9PSAyKSAmJiAobmFtZVswXSA9PSBDVExfS0VSTikgJiYgKG5hbWVbMV0gPT0gS0VSTl9WRVJTSU9OKSkKKwkJZ290byBvdXQ7CiAKIAlpZiAobXNnX2NvdW50IDwgNSkgewogCQltc2dfY291bnQrKzsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkJIndhcm5pbmc6IHByb2Nlc3MgYCVzJyB1c2VkIHRoZSByZW1vdmVkIHN5c2N0bCAiCi0JCQkic3lzdGVtIGNhbGxcbiIsIGN1cnJlbnQtPmNvbW0pOworCQkJInN5c3RlbSBjYWxsIHdpdGggIiwgY3VycmVudC0+Y29tbSk7CisJCWZvciAoaSA9IDA7IGkgPCB0bXAubmxlbjsgaSsrKQorCQkJcHJpbnRrKCIlZC4iLCBuYW1lW2ldKTsKKwkJcHJpbnRrKCJcbiIpOwogCX0KK291dDoKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAogaW50IHN5c2N0bF9zdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCSAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCB2b2lkICoqY29udGV4dCkKKwkJICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCXJldHVybiAtRU5PU1lTOwogfQogCiBpbnQgc3lzY3RsX2ludHZlYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgdm9pZCAqKmNvbnRleHQpCisJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKIGludCBzeXNjdGxfamlmZmllcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgdm9pZCAqKmNvbnRleHQpCisJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKIGludCBzeXNjdGxfbXNfamlmZmllcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgdm9pZCAqKmNvbnRleHQpCisJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKK3N0YXRpYyBpbnQgc3lzY3RsX3V0c19zdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCisJCSAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKKwkJICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQoreworCXJldHVybiAtRU5PU1lTOworfQorc3RhdGljIGludCBzeXNjdGxfaXBjX2RhdGEoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCisJCXZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTF9TWVNDQUxMICovCiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvdGFza3N0YXRzLmMgYi9rZXJuZWwvdGFza3N0YXRzLmMKaW5kZXggNWQ2YThjNS4uNGMzNDc2ZiAxMDA2NDQKLS0tIGEva2VybmVsL3Rhc2tzdGF0cy5jCisrKyBiL2tlcm5lbC90YXNrc3RhdHMuYwpAQCAtMzQsNyArMzQsNyBAQAogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoX191MzIsIHRhc2tzdGF0c19zZXFudW0pID0geyAwIH07CiBzdGF0aWMgaW50IGZhbWlseV9yZWdpc3RlcmVkOwota21lbV9jYWNoZV90ICp0YXNrc3RhdHNfY2FjaGU7CitzdHJ1Y3Qga21lbV9jYWNoZSAqdGFza3N0YXRzX2NhY2hlOwogCiBzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGZhbWlseSA9IHsKIAkuaWQJCT0gR0VOTF9JRF9HRU5FUkFURSwKQEAgLTY5LDcgKzY5LDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgcHJlcGFyZV9yZXBseShzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLCB1OCBjbWQsIHN0cnVjdCBza19idWZmICoqc2ticCwKLQkJCXZvaWQgKipyZXBseXAsIHNpemVfdCBzaXplKQorCQkJCXNpemVfdCBzaXplKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJdm9pZCAqcmVwbHk7CkBAIC03Nyw3ICs3Nyw3IEBACiAJLyoKIAkgKiBJZiBuZXcgYXR0cmlidXRlcyBhcmUgYWRkZWQsIHBsZWFzZSByZXZpc2l0IHRoaXMgYWxsb2NhdGlvbgogCSAqLwotCXNrYiA9IG5sbXNnX25ldyhnZW5sbXNnX3RvdGFsX3NpemUoc2l6ZSksIEdGUF9LRVJORUwpOworCXNrYiA9IGdlbmxtc2dfbmV3KHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghc2tiKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtODUsMjAgKzg1LDE1IEBACiAJCWludCBzZXEgPSBnZXRfY3B1X3Zhcih0YXNrc3RhdHNfc2VxbnVtKSsrOwogCQlwdXRfY3B1X3Zhcih0YXNrc3RhdHNfc2VxbnVtKTsKIAotCQlyZXBseSA9IGdlbmxtc2dfcHV0KHNrYiwgMCwgc2VxLAotCQkJCWZhbWlseS5pZCwgMCwgMCwKLQkJCQljbWQsIGZhbWlseS52ZXJzaW9uKTsKKwkJcmVwbHkgPSBnZW5sbXNnX3B1dChza2IsIDAsIHNlcSwgJmZhbWlseSwgMCwgY21kKTsKIAl9IGVsc2UKLQkJcmVwbHkgPSBnZW5sbXNnX3B1dChza2IsIGluZm8tPnNuZF9waWQsIGluZm8tPnNuZF9zZXEsCi0JCQkJZmFtaWx5LmlkLCAwLCAwLAotCQkJCWNtZCwgZmFtaWx5LnZlcnNpb24pOworCQlyZXBseSA9IGdlbmxtc2dfcHV0X3JlcGx5KHNrYiwgaW5mbywgJmZhbWlseSwgMCwgY21kKTsKIAlpZiAocmVwbHkgPT0gTlVMTCkgewogCQlubG1zZ19mcmVlKHNrYik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCSpza2JwID0gc2tiOwotCSpyZXBseXAgPSByZXBseTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIzLDEwICsxMTgsMTAgQEAKIC8qCiAgKiBTZW5kIHRhc2tzdGF0cyBkYXRhIGluIEBza2IgdG8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIEBjcHUncyBleGl0IGRhdGEKICAqLwotc3RhdGljIHZvaWQgc2VuZF9jcHVfbGlzdGVuZXJzKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgdm9pZCBzZW5kX2NwdV9saXN0ZW5lcnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IGxpc3RlbmVyX2xpc3QgKmxpc3RlbmVycykKIHsKIAlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubGhkciA9IG5sbXNnX2RhdGEoKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YSk7Ci0Jc3RydWN0IGxpc3RlbmVyX2xpc3QgKmxpc3RlbmVyczsKIAlzdHJ1Y3QgbGlzdGVuZXIgKnMsICp0bXA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYl9uZXh0LCAqc2tiX2N1ciA9IHNrYjsKIAl2b2lkICpyZXBseSA9IGdlbmxtc2dfZGF0YShnZW5saGRyKTsKQEAgLTEzOSw3ICsxMzQsNiBAQAogCX0KIAogCXJjID0gMDsKLQlsaXN0ZW5lcnMgPSAmcGVyX2NwdShsaXN0ZW5lcl9hcnJheSwgY3B1KTsKIAlkb3duX3JlYWQoJmxpc3RlbmVycy0+c2VtKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZsaXN0ZW5lcnMtPmxpc3QsIGxpc3QpIHsKIAkJc2tiX25leHQgPSBOVUxMOwpAQCAtMTc0LDI0ICsxNjgsMjMgQEAKIAl1cF93cml0ZSgmbGlzdGVuZXJzLT5zZW0pOwogfQogCi1zdGF0aWMgaW50IGZpbGxfcGlkKHBpZF90IHBpZCwgc3RydWN0IHRhc2tfc3RydWN0ICpwaWR0c2ssCitzdGF0aWMgaW50IGZpbGxfcGlkKHBpZF90IHBpZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzKQogewogCWludCByYyA9IDA7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBwaWR0c2s7CiAKLQlpZiAoIXBpZHRzaykgewotCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWlmICghdHNrKSB7CisJCXJjdV9yZWFkX2xvY2soKTsKIAkJdHNrID0gZmluZF90YXNrX2J5X3BpZChwaWQpOwotCQlpZiAoIXRzaykgewotCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlpZiAodHNrKQorCQkJZ2V0X3Rhc2tfc3RydWN0KHRzayk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlpZiAoIXRzaykKIAkJCXJldHVybiAtRVNSQ0g7Ci0JCX0KLQkJZ2V0X3Rhc2tfc3RydWN0KHRzayk7Ci0JCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAl9IGVsc2UKIAkJZ2V0X3Rhc2tfc3RydWN0KHRzayk7CiAKKwltZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKIAkvKgogCSAqIEVhY2ggYWNjb3VudGluZyBzdWJzeXN0ZW0gYWRkcyBjYWxscyB0byBpdHMgZnVuY3Rpb25zIHRvCiAJICogZmlsbCBpbiByZWxldmFudCBwYXJ0cyBvZiBzdHJ1Y3QgdGFza3N0c2F0cyBhcyBmb2xsb3dzCkBAIC0yMTQsMzkgKzIwNywzMiBAQAogCiB9CiAKLXN0YXRpYyBpbnQgZmlsbF90Z2lkKHBpZF90IHRnaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGdpZHRzaywKK3N0YXRpYyBpbnQgZmlsbF90Z2lkKHBpZF90IHRnaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqZmlyc3QsCiAJCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCAqZmlyc3Q7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRVNSQ0g7CiAKIAkvKgogCSAqIEFkZCBhZGRpdGlvbmFsIHN0YXRzIGZyb20gbGl2ZSB0YXNrcyBleGNlcHQgem9tYmllIHRocmVhZCBncm91cAogCSAqIGxlYWRlcnMgd2hvIGFyZSBhbHJlYWR5IGNvdW50ZWQgd2l0aCB0aGUgZGVhZCB0YXNrcwogCSAqLwotCWZpcnN0ID0gdGdpZHRzazsKLQlpZiAoIWZpcnN0KSB7Ci0JCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCWlmICghZmlyc3QpCiAJCWZpcnN0ID0gZmluZF90YXNrX2J5X3BpZCh0Z2lkKTsKLQkJaWYgKCFmaXJzdCkgewotCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCQkJcmV0dXJuIC1FU1JDSDsKLQkJfQotCQlnZXRfdGFza19zdHJ1Y3QoZmlyc3QpOwotCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JfSBlbHNlCi0JCWdldF90YXNrX3N0cnVjdChmaXJzdCk7CiAKLQkvKiBTdGFydCB3aXRoIHN0YXRzIGZyb20gZGVhZCB0YXNrcyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZmaXJzdC0+c2lnbmFsLT5zdGF0c19sb2NrLCBmbGFncyk7CisJaWYgKCFmaXJzdCB8fCAhbG9ja190YXNrX3NpZ2hhbmQoZmlyc3QsICZmbGFncykpCisJCWdvdG8gb3V0OworCiAJaWYgKGZpcnN0LT5zaWduYWwtPnN0YXRzKQogCQltZW1jcHkoc3RhdHMsIGZpcnN0LT5zaWduYWwtPnN0YXRzLCBzaXplb2YoKnN0YXRzKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlyc3QtPnNpZ25hbC0+c3RhdHNfbG9jaywgZmxhZ3MpOworCWVsc2UKKwkJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CiAKIAl0c2sgPSBmaXJzdDsKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWRvIHsKLQkJaWYgKHRzay0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSAmJiB0aHJlYWRfZ3JvdXBfbGVhZGVyKHRzaykpCisJCWlmICh0c2stPmV4aXRfc3RhdGUpCiAJCQljb250aW51ZTsKIAkJLyoKIAkJICogQWNjb3VudGluZyBzdWJzeXN0ZW0gY2FuIGNhbGwgaXRzIGZ1bmN0aW9ucyBoZXJlIHRvCkBAIC0yNTcsMTUgKzI0MywxOCBAQAogCQlkZWxheWFjY3RfYWRkX3RzayhzdGF0cywgdHNrKTsKIAogCX0gd2hpbGVfZWFjaF90aHJlYWQoZmlyc3QsIHRzayk7Ci0JcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCXN0YXRzLT52ZXJzaW9uID0gVEFTS1NUQVRTX1ZFUlNJT047CiAKKwl1bmxvY2tfdGFza19zaWdoYW5kKGZpcnN0LCAmZmxhZ3MpOworCXJjID0gMDsKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXN0YXRzLT52ZXJzaW9uID0gVEFTS1NUQVRTX1ZFUlNJT047CiAJLyoKIAkgKiBBY2NvdW50aW5nIHN1YnN5dGVtcyBjYW4gYWxzbyBhZGQgY2FsbHMgaGVyZSB0byBtb2RpZnkKIAkgKiBmaWVsZHMgb2YgdGFza3N0YXRzLgogCSAqLwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiAKQEAgLTI3Myw3ICsyNjIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHNrLT5zaWduYWwtPnN0YXRzX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiAJaWYgKCF0c2stPnNpZ25hbC0+c3RhdHMpCiAJCWdvdG8gcmV0OwogCkBAIC0yODUsNyArMjc0LDcgQEAKIAkgKi8KIAlkZWxheWFjY3RfYWRkX3Rzayh0c2stPnNpZ25hbC0+c3RhdHMsIHRzayk7CiByZXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNrLT5zaWduYWwtPnN0YXRzX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIAlyZXR1cm47CiB9CiAKQEAgLTM1NiwxNCArMzQ1LDM2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHN0cnVjdCB0YXNrc3RhdHMgKm1rX3JlcGx5KHN0cnVjdCBza19idWZmICpza2IsIGludCB0eXBlLCB1MzIgcGlkKQoreworCXN0cnVjdCBubGF0dHIgKm5hLCAqcmV0OworCWludCBhZ2dyOworCisJYWdnciA9ICh0eXBlID09IFRBU0tTVEFUU19UWVBFX1BJRCkKKwkJCT8gVEFTS1NUQVRTX1RZUEVfQUdHUl9QSUQKKwkJCTogVEFTS1NUQVRTX1RZUEVfQUdHUl9UR0lEOworCisJbmEgPSBubGFfbmVzdF9zdGFydChza2IsIGFnZ3IpOworCWlmICghbmEpCisJCWdvdG8gZXJyOworCWlmIChubGFfcHV0KHNrYiwgdHlwZSwgc2l6ZW9mKHBpZCksICZwaWQpIDwgMCkKKwkJZ290byBlcnI7CisJcmV0ID0gbmxhX3Jlc2VydmUoc2tiLCBUQVNLU1RBVFNfVFlQRV9TVEFUUywgc2l6ZW9mKHN0cnVjdCB0YXNrc3RhdHMpKTsKKwlpZiAoIXJldCkKKwkJZ290byBlcnI7CisJbmxhX25lc3RfZW5kKHNrYiwgbmEpOworCisJcmV0dXJuIG5sYV9kYXRhKHJldCk7CitlcnI6CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgdGFza3N0YXRzX3VzZXJfY21kKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJaW50IHJjID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmVwX3NrYjsKLQlzdHJ1Y3QgdGFza3N0YXRzIHN0YXRzOwotCXZvaWQgKnJlcGx5OworCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzOwogCXNpemVfdCBzaXplOwotCXN0cnVjdCBubGF0dHIgKm5hOwogCWNwdW1hc2tfdCBtYXNrOwogCiAJcmMgPSBwYXJzZShpbmZvLT5hdHRyc1tUQVNLU1RBVFNfQ01EX0FUVFJfUkVHSVNURVJfQ1BVTUFTS10sICZtYXNrKTsKQEAgLTM4NCwxNDYgKzM5NSwxMjIgQEAKIAlzaXplID0gbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUzMikpICsKIAkJbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCB0YXNrc3RhdHMpKSArIG5sYV90b3RhbF9zaXplKDApOwogCi0JbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JcmMgPSBwcmVwYXJlX3JlcGx5KGluZm8sIFRBU0tTVEFUU19DTURfTkVXLCAmcmVwX3NrYiwgJnJlcGx5LCBzaXplKTsKKwlyYyA9IHByZXBhcmVfcmVwbHkoaW5mbywgVEFTS1NUQVRTX0NNRF9ORVcsICZyZXBfc2tiLCBzaXplKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKKwlyYyA9IC1FSU5WQUw7CiAJaWYgKGluZm8tPmF0dHJzW1RBU0tTVEFUU19DTURfQVRUUl9QSURdKSB7CiAJCXUzMiBwaWQgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tUQVNLU1RBVFNfQ01EX0FUVFJfUElEXSk7Ci0JCXJjID0gZmlsbF9waWQocGlkLCBOVUxMLCAmc3RhdHMpOwotCQlpZiAocmMgPCAwKQorCQlzdGF0cyA9IG1rX3JlcGx5KHJlcF9za2IsIFRBU0tTVEFUU19UWVBFX1BJRCwgcGlkKTsKKwkJaWYgKCFzdGF0cykKIAkJCWdvdG8gZXJyOwogCi0JCW5hID0gbmxhX25lc3Rfc3RhcnQocmVwX3NrYiwgVEFTS1NUQVRTX1RZUEVfQUdHUl9QSUQpOwotCQlOTEFfUFVUX1UzMihyZXBfc2tiLCBUQVNLU1RBVFNfVFlQRV9QSUQsIHBpZCk7Ci0JCU5MQV9QVVRfVFlQRShyZXBfc2tiLCBzdHJ1Y3QgdGFza3N0YXRzLCBUQVNLU1RBVFNfVFlQRV9TVEFUUywKLQkJCQlzdGF0cyk7CisJCXJjID0gZmlsbF9waWQocGlkLCBOVUxMLCBzdGF0cyk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycjsKIAl9IGVsc2UgaWYgKGluZm8tPmF0dHJzW1RBU0tTVEFUU19DTURfQVRUUl9UR0lEXSkgewogCQl1MzIgdGdpZCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW1RBU0tTVEFUU19DTURfQVRUUl9UR0lEXSk7Ci0JCXJjID0gZmlsbF90Z2lkKHRnaWQsIE5VTEwsICZzdGF0cyk7Ci0JCWlmIChyYyA8IDApCisJCXN0YXRzID0gbWtfcmVwbHkocmVwX3NrYiwgVEFTS1NUQVRTX1RZUEVfVEdJRCwgdGdpZCk7CisJCWlmICghc3RhdHMpCiAJCQlnb3RvIGVycjsKIAotCQluYSA9IG5sYV9uZXN0X3N0YXJ0KHJlcF9za2IsIFRBU0tTVEFUU19UWVBFX0FHR1JfVEdJRCk7Ci0JCU5MQV9QVVRfVTMyKHJlcF9za2IsIFRBU0tTVEFUU19UWVBFX1RHSUQsIHRnaWQpOwotCQlOTEFfUFVUX1RZUEUocmVwX3NrYiwgc3RydWN0IHRhc2tzdGF0cywgVEFTS1NUQVRTX1RZUEVfU1RBVFMsCi0JCQkJc3RhdHMpOwotCX0gZWxzZSB7Ci0JCXJjID0gLUVJTlZBTDsKKwkJcmMgPSBmaWxsX3RnaWQodGdpZCwgTlVMTCwgc3RhdHMpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBlcnI7CisJfSBlbHNlCiAJCWdvdG8gZXJyOwotCX0KLQotCW5sYV9uZXN0X2VuZChyZXBfc2tiLCBuYSk7CiAKIAlyZXR1cm4gc2VuZF9yZXBseShyZXBfc2tiLCBpbmZvLT5zbmRfcGlkKTsKLQotbmxhX3B1dF9mYWlsdXJlOgotCXJldHVybiBnZW5sbXNnX2NhbmNlbChyZXBfc2tiLCByZXBseSk7CiBlcnI6CiAJbmxtc2dfZnJlZShyZXBfc2tiKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXZvaWQgdGFza3N0YXRzX2V4aXRfYWxsb2Moc3RydWN0IHRhc2tzdGF0cyAqKnB0aWRzdGF0cywgdW5zaWduZWQgaW50ICpteWNwdSkKK3N0YXRpYyBzdHJ1Y3QgdGFza3N0YXRzICp0YXNrc3RhdHNfdGdpZF9hbGxvYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlzdHJ1Y3QgbGlzdGVuZXJfbGlzdCAqbGlzdGVuZXJzOwotCXN0cnVjdCB0YXNrc3RhdHMgKnRtcDsKLQkvKgotCSAqIFRoaXMgaXMgdGhlIGNwdSBvbiB3aGljaCB0aGUgdGFzayBpcyBleGl0aW5nIGN1cnJlbnRseSBhbmQgd2lsbAotCSAqIGJlIHRoZSBvbmUgZm9yIHdoaWNoIHRoZSBleGl0IGV2ZW50IGlzIHNlbnQsIGV2ZW4gaWYgdGhlIGNwdQotCSAqIG9uIHdoaWNoIHRoaXMgZnVuY3Rpb24gaXMgcnVubmluZyBjaGFuZ2VzIGxhdGVyLgotCSAqLwotCSpteWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyA9IHRzay0+c2lnbmFsOworCXN0cnVjdCB0YXNrc3RhdHMgKnN0YXRzOwogCi0JKnB0aWRzdGF0cyA9IE5VTEw7Ci0JdG1wID0ga21lbV9jYWNoZV96YWxsb2ModGFza3N0YXRzX2NhY2hlLCBTTEFCX0tFUk5FTCk7Ci0JaWYgKCF0bXApCi0JCXJldHVybjsKKwlpZiAoc2lnLT5zdGF0cyB8fCB0aHJlYWRfZ3JvdXBfZW1wdHkodHNrKSkKKwkJZ290byByZXQ7CiAKLQlsaXN0ZW5lcnMgPSAmcGVyX2NwdShsaXN0ZW5lcl9hcnJheSwgKm15Y3B1KTsKLQlkb3duX3JlYWQoJmxpc3RlbmVycy0+c2VtKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmxpc3RlbmVycy0+bGlzdCkpIHsKLQkJKnB0aWRzdGF0cyA9IHRtcDsKLQkJdG1wID0gTlVMTDsKKwkvKiBObyBwcm9ibGVtIGlmIGttZW1fY2FjaGVfemFsbG9jKCkgZmFpbHMgKi8KKwlzdGF0cyA9IGttZW1fY2FjaGVfemFsbG9jKHRhc2tzdGF0c19jYWNoZSwgR0ZQX0tFUk5FTCk7CisKKwlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghc2lnLT5zdGF0cykgeworCQlzaWctPnN0YXRzID0gc3RhdHM7CisJCXN0YXRzID0gTlVMTDsKIAl9Ci0JdXBfcmVhZCgmbGlzdGVuZXJzLT5zZW0pOwotCWtmcmVlKHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJaWYgKHN0YXRzKQorCQlrbWVtX2NhY2hlX2ZyZWUodGFza3N0YXRzX2NhY2hlLCBzdGF0cyk7CityZXQ6CisJcmV0dXJuIHNpZy0+c3RhdHM7CiB9CiAKIC8qIFNlbmQgcGlkIGRhdGEgb3V0IG9uIGV4aXQgKi8KLXZvaWQgdGFza3N0YXRzX2V4aXRfc2VuZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHRhc2tzdGF0cyAqdGlkc3RhdHMsCi0JCQlpbnQgZ3JvdXBfZGVhZCwgdW5zaWduZWQgaW50IG15Y3B1KQordm9pZCB0YXNrc3RhdHNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGdyb3VwX2RlYWQpCiB7CiAJaW50IHJjOworCXN0cnVjdCBsaXN0ZW5lcl9saXN0ICpsaXN0ZW5lcnM7CisJc3RydWN0IHRhc2tzdGF0cyAqc3RhdHM7CiAJc3RydWN0IHNrX2J1ZmYgKnJlcF9za2I7Ci0Jdm9pZCAqcmVwbHk7CiAJc2l6ZV90IHNpemU7CiAJaW50IGlzX3RocmVhZF9ncm91cDsKLQlzdHJ1Y3QgbmxhdHRyICpuYTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFmYW1pbHlfcmVnaXN0ZXJlZCB8fCAhdGlkc3RhdHMpCisJaWYgKCFmYW1pbHlfcmVnaXN0ZXJlZCkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRzay0+c2lnbmFsLT5zdGF0c19sb2NrLCBmbGFncyk7Ci0JaXNfdGhyZWFkX2dyb3VwID0gdHNrLT5zaWduYWwtPnN0YXRzID8gMSA6IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNrLT5zaWduYWwtPnN0YXRzX2xvY2ssIGZsYWdzKTsKLQotCXJjID0gMDsKIAkvKgogCSAqIFNpemUgaW5jbHVkZXMgc3BhY2UgZm9yIG5lc3RlZCBhdHRyaWJ1dGVzCiAJICovCiAJc2l6ZSA9IG5sYV90b3RhbF9zaXplKHNpemVvZih1MzIpKSArCiAJCW5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgdGFza3N0YXRzKSkgKyBubGFfdG90YWxfc2l6ZSgwKTsKIAotCWlmIChpc190aHJlYWRfZ3JvdXApCi0JCXNpemUgPSAyICogc2l6ZTsJLyogUElEICsgU1RBVFMgKyBUR0lEICsgU1RBVFMgKi8KKwlpc190aHJlYWRfZ3JvdXAgPSAhIXRhc2tzdGF0c190Z2lkX2FsbG9jKHRzayk7CisJaWYgKGlzX3RocmVhZF9ncm91cCkgeworCQkvKiBQSUQgKyBTVEFUUyArIFRHSUQgKyBTVEFUUyAqLworCQlzaXplID0gMiAqIHNpemU7CisJCS8qIGZpbGwgdGhlIHRzay0+c2lnbmFsLT5zdGF0cyBzdHJ1Y3R1cmUgKi8KKwkJZmlsbF90Z2lkX2V4aXQodHNrKTsKKwl9CiAKLQlyYyA9IHByZXBhcmVfcmVwbHkoTlVMTCwgVEFTS1NUQVRTX0NNRF9ORVcsICZyZXBfc2tiLCAmcmVwbHksIHNpemUpOworCWxpc3RlbmVycyA9ICZfX3Jhd19nZXRfY3B1X3ZhcihsaXN0ZW5lcl9hcnJheSk7CisJaWYgKGxpc3RfZW1wdHkoJmxpc3RlbmVycy0+bGlzdCkpCisJCXJldHVybjsKKworCXJjID0gcHJlcGFyZV9yZXBseShOVUxMLCBUQVNLU1RBVFNfQ01EX05FVywgJnJlcF9za2IsIHNpemUpOwogCWlmIChyYyA8IDApCi0JCWdvdG8gcmV0OworCQlyZXR1cm47CiAKLQlyYyA9IGZpbGxfcGlkKHRzay0+cGlkLCB0c2ssIHRpZHN0YXRzKTsKKwlzdGF0cyA9IG1rX3JlcGx5KHJlcF9za2IsIFRBU0tTVEFUU19UWVBFX1BJRCwgdHNrLT5waWQpOworCWlmICghc3RhdHMpCisJCWdvdG8gZXJyOworCisJcmMgPSBmaWxsX3BpZCh0c2stPnBpZCwgdHNrLCBzdGF0cyk7CiAJaWYgKHJjIDwgMCkKLQkJZ290byBlcnJfc2tiOwotCi0JbmEgPSBubGFfbmVzdF9zdGFydChyZXBfc2tiLCBUQVNLU1RBVFNfVFlQRV9BR0dSX1BJRCk7Ci0JTkxBX1BVVF9VMzIocmVwX3NrYiwgVEFTS1NUQVRTX1RZUEVfUElELCAodTMyKXRzay0+cGlkKTsKLQlOTEFfUFVUX1RZUEUocmVwX3NrYiwgc3RydWN0IHRhc2tzdGF0cywgVEFTS1NUQVRTX1RZUEVfU1RBVFMsCi0JCQkqdGlkc3RhdHMpOwotCW5sYV9uZXN0X2VuZChyZXBfc2tiLCBuYSk7Ci0KLQlpZiAoIWlzX3RocmVhZF9ncm91cCkKLQkJZ290byBzZW5kOworCQlnb3RvIGVycjsKIAogCS8qCi0JICogdHNrIGhhcy9oYWQgYSB0aHJlYWQgZ3JvdXAgc28gZmlsbCB0aGUgdHNrLT5zaWduYWwtPnN0YXRzIHN0cnVjdHVyZQogCSAqIERvZXNuJ3QgbWF0dGVyIGlmIHRzayBpcyB0aGUgbGVhZGVyIG9yIHRoZSBsYXN0IGdyb3VwIG1lbWJlciBsZWF2aW5nCiAJICovCi0KLQlmaWxsX3RnaWRfZXhpdCh0c2spOwotCWlmICghZ3JvdXBfZGVhZCkKKwlpZiAoIWlzX3RocmVhZF9ncm91cCB8fCAhZ3JvdXBfZGVhZCkKIAkJZ290byBzZW5kOwogCi0JbmEgPSBubGFfbmVzdF9zdGFydChyZXBfc2tiLCBUQVNLU1RBVFNfVFlQRV9BR0dSX1RHSUQpOwotCU5MQV9QVVRfVTMyKHJlcF9za2IsIFRBU0tTVEFUU19UWVBFX1RHSUQsICh1MzIpdHNrLT50Z2lkKTsKLQkvKiBObyBsb2NraW5nIG5lZWRlZCBmb3IgdHNrLT5zaWduYWwtPnN0YXRzIHNpbmNlIGdyb3VwIGlzIGRlYWQgKi8KLQlOTEFfUFVUX1RZUEUocmVwX3NrYiwgc3RydWN0IHRhc2tzdGF0cywgVEFTS1NUQVRTX1RZUEVfU1RBVFMsCi0JCQkqdHNrLT5zaWduYWwtPnN0YXRzKTsKLQlubGFfbmVzdF9lbmQocmVwX3NrYiwgbmEpOworCXN0YXRzID0gbWtfcmVwbHkocmVwX3NrYiwgVEFTS1NUQVRTX1RZUEVfVEdJRCwgdHNrLT50Z2lkKTsKKwlpZiAoIXN0YXRzKQorCQlnb3RvIGVycjsKKworCW1lbWNweShzdGF0cywgdHNrLT5zaWduYWwtPnN0YXRzLCBzaXplb2YoKnN0YXRzKSk7CiAKIHNlbmQ6Ci0Jc2VuZF9jcHVfbGlzdGVuZXJzKHJlcF9za2IsIG15Y3B1KTsKKwlzZW5kX2NwdV9saXN0ZW5lcnMocmVwX3NrYiwgbGlzdGVuZXJzKTsKIAlyZXR1cm47Ci0KLW5sYV9wdXRfZmFpbHVyZToKLQlnZW5sbXNnX2NhbmNlbChyZXBfc2tiLCByZXBseSk7Ci0JZ290byByZXQ7Ci1lcnJfc2tiOgorZXJyOgogCW5sbXNnX2ZyZWUocmVwX3NrYik7Ci1yZXQ6Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgc3RydWN0IGdlbmxfb3BzIHRhc2tzdGF0c19vcHMgPSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwppbmRleCA3NGVjYTU5Li4yMjUwNGFmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCS8qIGNoZWNrIGlmIGNsb2Nrc291cmNlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLwogCWlmIChpc19yZWdpc3RlcmVkX3NvdXJjZShjKSkgewogCQlwcmludGsoInJlZ2lzdGVyX2Nsb2Nrc291cmNlOiBDYW5ub3QgcmVnaXN0ZXIgJXMuICIKLQkJCSJBbHJlYWR5IHJlZ2lzdGVyZWQhIiwgYy0+bmFtZSk7CisJCSAgICAgICAiQWxyZWFkeSByZWdpc3RlcmVkISIsIGMtPm5hbWUpOwogCQlyZXQgPSAtRUJVU1k7CiAJfSBlbHNlIHsKIAkJLyogcmVnaXN0ZXIgaXQgKi8KQEAgLTE4Niw2ICsxODYsNyBAQAogfQogRVhQT1JUX1NZTUJPTChjbG9ja3NvdXJjZV9yZXNlbGVjdCk7CiAKKyNpZmRlZiBDT05GSUdfU1lTRlMKIC8qKgogICogc3lzZnNfc2hvd19jdXJyZW50X2Nsb2Nrc291cmNlcyAtIHN5c2ZzIGludGVyZmFjZSBmb3IgY3VycmVudCBjbG9ja3NvdXJjZQogICogQGRldjoJdW51c2VkCkBAIC0yNzUsMTAgKzI3NiwxMCBAQAogICogU3lzZnMgc2V0dXAgYml0czoKICAqLwogc3RhdGljIFNZU0RFVl9BVFRSKGN1cnJlbnRfY2xvY2tzb3VyY2UsIDA2MDAsIHN5c2ZzX3Nob3dfY3VycmVudF9jbG9ja3NvdXJjZXMsCi0JCQlzeXNmc19vdmVycmlkZV9jbG9ja3NvdXJjZSk7CisJCSAgIHN5c2ZzX292ZXJyaWRlX2Nsb2Nrc291cmNlKTsKIAogc3RhdGljIFNZU0RFVl9BVFRSKGF2YWlsYWJsZV9jbG9ja3NvdXJjZSwgMDYwMCwKLQkJCXN5c2ZzX3Nob3dfYXZhaWxhYmxlX2Nsb2Nrc291cmNlcywgTlVMTCk7CisJCSAgIHN5c2ZzX3Nob3dfYXZhaWxhYmxlX2Nsb2Nrc291cmNlcywgTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGNsb2Nrc291cmNlX3N5c2NsYXNzID0gewogCXNldF9rc2V0X25hbWUoImNsb2Nrc291cmNlIiksCkBAIC0zMDcsNiArMzA4LDcgQEAKIH0KIAogZGV2aWNlX2luaXRjYWxsKGluaXRfY2xvY2tzb3VyY2Vfc3lzZnMpOworI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLwogCiAvKioKICAqIGJvb3Rfb3ZlcnJpZGVfY2xvY2tzb3VyY2UgLSBib290IGNsb2NrIG92ZXJyaWRlCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9qaWZmaWVzLmMgYi9rZXJuZWwvdGltZS9qaWZmaWVzLmMKaW5kZXggMTI2YmIzMC4uYTk5YjJhNiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvamlmZmllcy5jCisrKyBiL2tlcm5lbC90aW1lL2ppZmZpZXMuYwpAQCAtNTcsNyArNTcsNyBAQAogCiBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfamlmZmllcyA9IHsKIAkubmFtZQkJPSAiamlmZmllcyIsCi0JLnJhdGluZwkJPSAwLCAvKiBsb3dlc3QgcmF0aW5nKi8KKwkucmF0aW5nCQk9IDEsIC8qIGxvd2VzdCB2YWxpZCByYXRpbmcqLwogCS5yZWFkCQk9IGppZmZpZXNfcmVhZCwKIAkubWFzawkJPSAweGZmZmZmZmZmLCAvKjMyYml0cyovCiAJLm11bHQJCT0gTlNFQ19QRVJfSklGRlkgPDwgSklGRklFU19TSElGVCwgLyogZGV0YWlscyBhYm92ZSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvbnRwLmMgYi9rZXJuZWwvdGltZS9udHAuYwppbmRleCA0NzE5NWZhLi4zYWZlYWEzIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9udHAuYworKysgYi9rZXJuZWwvdGltZS9udHAuYwpAQCAtMTYxLDkgKzE2MSw5IEBACiAJCQl0aW1lX2FkanVzdCArPSBNQVhfVElDS0FESjsKIAkJCXRpY2tfbGVuZ3RoIC09IE1BWF9USUNLQURKX1NDQUxFRDsKIAkJfSBlbHNlIHsKLQkJCXRpbWVfYWRqdXN0ID0gMDsKIAkJCXRpY2tfbGVuZ3RoICs9IChzNjQpKHRpbWVfYWRqdXN0ICogTlNFQ19QRVJfVVNFQyAvCiAJCQkJCSAgICAgSFopIDw8IFRJQ0tfTEVOR1RIX1NISUZUOworCQkJdGltZV9hZGp1c3QgPSAwOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCBjMWM3ZmJjLi5mZWRkZjgxIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtODAsNiArODAsMTM4IEBACiBFWFBPUlRfU1lNQk9MKGJvb3RfdHZlY19iYXNlcyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodHZlY19iYXNlX3QgKiwgdHZlY19iYXNlcykgPSAmYm9vdF90dmVjX2Jhc2VzOwogCisvKioKKyAqIF9fcm91bmRfamlmZmllcyAtIGZ1bmN0aW9uIHRvIHJvdW5kIGppZmZpZXMgdG8gYSBmdWxsIHNlY29uZAorICogQGo6IHRoZSB0aW1lIGluIChhYnNvbHV0ZSkgamlmZmllcyB0aGF0IHNob3VsZCBiZSByb3VuZGVkCisgKiBAY3B1OiB0aGUgcHJvY2Vzc29yIG51bWJlciBvbiB3aGljaCB0aGUgdGltZW91dCB3aWxsIGhhcHBlbgorICoKKyAqIF9fcm91bmRfamlmZmllcyByb3VuZHMgYW4gYWJzb2x1dGUgdGltZSBpbiB0aGUgZnV0dXJlIChpbiBqaWZmaWVzKQorICogdXAgb3IgZG93biB0byAoYXBwcm94aW1hdGVseSkgZnVsbCBzZWNvbmRzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGltZXJzCisgKiBmb3Igd2hpY2ggdGhlIGV4YWN0IHRpbWUgdGhleSBmaXJlIGRvZXMgbm90IG1hdHRlciB0b28gbXVjaCwgYXMgbG9uZyBhcworICogdGhleSBmaXJlIGFwcHJveGltYXRlbHkgZXZlcnkgWCBzZWNvbmRzLgorICoKKyAqIEJ5IHJvdW5kaW5nIHRoZXNlIHRpbWVycyB0byB3aG9sZSBzZWNvbmRzLCBhbGwgc3VjaCB0aW1lcnMgd2lsbCBmaXJlCisgKiBhdCB0aGUgc2FtZSB0aW1lLCByYXRoZXIgdGhhbiBhdCB2YXJpb3VzIHRpbWVzIHNwcmVhZCBvdXQuIFRoZSBnb2FsCisgKiBvZiB0aGlzIGlzIHRvIGhhdmUgdGhlIENQVSB3YWtlIHVwIGxlc3MsIHdoaWNoIHNhdmVzIHBvd2VyLgorICoKKyAqIFRoZSBleGFjdCByb3VuZGluZyBpcyBza2V3ZWQgZm9yIGVhY2ggcHJvY2Vzc29yIHRvIGF2b2lkIGFsbAorICogcHJvY2Vzc29ycyBmaXJpbmcgYXQgdGhlIGV4YWN0IHNhbWUgdGltZSwgd2hpY2ggY291bGQgbGVhZAorICogdG8gbG9jayBjb250ZW50aW9uIG9yIHNwdXJpb3VzIGNhY2hlIGxpbmUgYm91bmNpbmcuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcm91bmRlZCB2ZXJzaW9uIG9mIHRoZSAiaiIgcGFyYW1ldGVyLgorICovCit1bnNpZ25lZCBsb25nIF9fcm91bmRfamlmZmllcyh1bnNpZ25lZCBsb25nIGosIGludCBjcHUpCit7CisJaW50IHJlbTsKKwl1bnNpZ25lZCBsb25nIG9yaWdpbmFsID0gajsKKworCS8qCisJICogV2UgZG9uJ3Qgd2FudCBhbGwgY3B1cyBmaXJpbmcgdGhlaXIgdGltZXJzIGF0IG9uY2UgaGl0dGluZyB0aGUKKwkgKiBzYW1lIGxvY2sgb3IgY2FjaGVsaW5lcywgc28gd2Ugc2tldyBlYWNoIGV4dHJhIGNwdSB3aXRoIGFuIGV4dHJhCisJICogMyBqaWZmaWVzLiBUaGlzIDMgamlmZmllcyBjYW1lIG9yaWdpbmFsbHkgZnJvbSB0aGUgbW0vIGNvZGUgd2hpY2gKKwkgKiBhbHJlYWR5IGRpZCB0aGlzLgorCSAqIFRoZSBza2V3IGlzIGRvbmUgYnkgYWRkaW5nIDMqY3B1bnIsIHRoZW4gcm91bmQsIHRoZW4gc3VidHJhY3QgdGhpcworCSAqIGV4dHJhIG9mZnNldCBhZ2Fpbi4KKwkgKi8KKwlqICs9IGNwdSAqIDM7CisKKwlyZW0gPSBqICUgSFo7CisKKwkvKgorCSAqIElmIHRoZSB0YXJnZXQgamlmZmllIGlzIGp1c3QgYWZ0ZXIgYSB3aG9sZSBzZWNvbmQgKHdoaWNoIGNhbiBoYXBwZW4KKwkgKiBkdWUgdG8gZGVsYXlzIG9mIHRoZSB0aW1lciBpcnEsIGxvbmcgaXJxIG9mZiB0aW1lcyBldGMgZXRjKSB0aGVuCisJICogd2Ugc2hvdWxkIHJvdW5kIGRvd24gdG8gdGhlIHdob2xlIHNlY29uZCwgbm90IHVwLiBVc2UgMS80dGggc2Vjb25kCisJICogYXMgY3V0b2ZmIGZvciB0aGlzIHJvdW5kaW5nIGFzIGFuIGV4dHJlbWUgdXBwZXIgYm91bmQgZm9yIHRoaXMuCisJICovCisJaWYgKHJlbSA8IEhaLzQpIC8qIHJvdW5kIGRvd24gKi8KKwkJaiA9IGogLSByZW07CisJZWxzZSAvKiByb3VuZCB1cCAqLworCQlqID0gaiAtIHJlbSArIEhaOworCisJLyogbm93IHRoYXQgd2UgaGF2ZSByb3VuZGVkLCBzdWJ0cmFjdCB0aGUgZXh0cmEgc2tldyBhZ2FpbiAqLworCWogLT0gY3B1ICogMzsKKworCWlmIChqIDw9IGppZmZpZXMpIC8qIHJvdW5kaW5nIGF0ZSBvdXIgdGltZW91dCBlbnRpcmVseTsgKi8KKwkJcmV0dXJuIG9yaWdpbmFsOworCXJldHVybiBqOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19yb3VuZF9qaWZmaWVzKTsKKworLyoqCisgKiBfX3JvdW5kX2ppZmZpZXNfcmVsYXRpdmUgLSBmdW5jdGlvbiB0byByb3VuZCBqaWZmaWVzIHRvIGEgZnVsbCBzZWNvbmQKKyAqIEBqOiB0aGUgdGltZSBpbiAocmVsYXRpdmUpIGppZmZpZXMgdGhhdCBzaG91bGQgYmUgcm91bmRlZAorICogQGNwdTogdGhlIHByb2Nlc3NvciBudW1iZXIgb24gd2hpY2ggdGhlIHRpbWVvdXQgd2lsbCBoYXBwZW4KKyAqCisgKiBfX3JvdW5kX2ppZmZpZXNfcmVsYXRpdmUgcm91bmRzIGEgdGltZSBkZWx0YSAgaW4gdGhlIGZ1dHVyZSAoaW4gamlmZmllcykKKyAqIHVwIG9yIGRvd24gdG8gKGFwcHJveGltYXRlbHkpIGZ1bGwgc2Vjb25kcy4gVGhpcyBpcyB1c2VmdWwgZm9yIHRpbWVycworICogZm9yIHdoaWNoIHRoZSBleGFjdCB0aW1lIHRoZXkgZmlyZSBkb2VzIG5vdCBtYXR0ZXIgdG9vIG11Y2gsIGFzIGxvbmcgYXMKKyAqIHRoZXkgZmlyZSBhcHByb3hpbWF0ZWx5IGV2ZXJ5IFggc2Vjb25kcy4KKyAqCisgKiBCeSByb3VuZGluZyB0aGVzZSB0aW1lcnMgdG8gd2hvbGUgc2Vjb25kcywgYWxsIHN1Y2ggdGltZXJzIHdpbGwgZmlyZQorICogYXQgdGhlIHNhbWUgdGltZSwgcmF0aGVyIHRoYW4gYXQgdmFyaW91cyB0aW1lcyBzcHJlYWQgb3V0LiBUaGUgZ29hbAorICogb2YgdGhpcyBpcyB0byBoYXZlIHRoZSBDUFUgd2FrZSB1cCBsZXNzLCB3aGljaCBzYXZlcyBwb3dlci4KKyAqCisgKiBUaGUgZXhhY3Qgcm91bmRpbmcgaXMgc2tld2VkIGZvciBlYWNoIHByb2Nlc3NvciB0byBhdm9pZCBhbGwKKyAqIHByb2Nlc3NvcnMgZmlyaW5nIGF0IHRoZSBleGFjdCBzYW1lIHRpbWUsIHdoaWNoIGNvdWxkIGxlYWQKKyAqIHRvIGxvY2sgY29udGVudGlvbiBvciBzcHVyaW91cyBjYWNoZSBsaW5lIGJvdW5jaW5nLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHJvdW5kZWQgdmVyc2lvbiBvZiB0aGUgImoiIHBhcmFtZXRlci4KKyAqLwordW5zaWduZWQgbG9uZyBfX3JvdW5kX2ppZmZpZXNfcmVsYXRpdmUodW5zaWduZWQgbG9uZyBqLCBpbnQgY3B1KQoreworCS8qCisJICogSW4gdGhlb3J5IHRoZSBmb2xsb3dpbmcgY29kZSBjYW4gc2tpcCBhIGppZmZ5IGluIGNhc2UgamlmZmllcworCSAqIGluY3JlbWVudHMgcmlnaHQgYmV0d2VlbiB0aGUgYWRkaXRpb24gYW5kIHRoZSBsYXRlciBzdWJ0cmFjdGlvbi4KKwkgKiBIb3dldmVyIHNpbmNlIHRoZSBlbnRpcmUgcG9pbnQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byB1c2UgYXBwcm94aW1hdGUKKwkgKiB0aW1lb3V0cywgaXQncyBlbnRpcmVseSBvayB0byBub3QgaGFuZGxlIHRoYXQuCisJICovCisJcmV0dXJuICBfX3JvdW5kX2ppZmZpZXMoaiArIGppZmZpZXMsIGNwdSkgLSBqaWZmaWVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19yb3VuZF9qaWZmaWVzX3JlbGF0aXZlKTsKKworLyoqCisgKiByb3VuZF9qaWZmaWVzIC0gZnVuY3Rpb24gdG8gcm91bmQgamlmZmllcyB0byBhIGZ1bGwgc2Vjb25kCisgKiBAajogdGhlIHRpbWUgaW4gKGFic29sdXRlKSBqaWZmaWVzIHRoYXQgc2hvdWxkIGJlIHJvdW5kZWQKKyAqCisgKiByb3VuZF9qaWZmaWVzIHJvdW5kcyBhbiBhYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgKGluIGppZmZpZXMpCisgKiB1cCBvciBkb3duIHRvIChhcHByb3hpbWF0ZWx5KSBmdWxsIHNlY29uZHMuIFRoaXMgaXMgdXNlZnVsIGZvciB0aW1lcnMKKyAqIGZvciB3aGljaCB0aGUgZXhhY3QgdGltZSB0aGV5IGZpcmUgZG9lcyBub3QgbWF0dGVyIHRvbyBtdWNoLCBhcyBsb25nIGFzCisgKiB0aGV5IGZpcmUgYXBwcm94aW1hdGVseSBldmVyeSBYIHNlY29uZHMuCisgKgorICogQnkgcm91bmRpbmcgdGhlc2UgdGltZXJzIHRvIHdob2xlIHNlY29uZHMsIGFsbCBzdWNoIHRpbWVycyB3aWxsIGZpcmUKKyAqIGF0IHRoZSBzYW1lIHRpbWUsIHJhdGhlciB0aGFuIGF0IHZhcmlvdXMgdGltZXMgc3ByZWFkIG91dC4gVGhlIGdvYWwKKyAqIG9mIHRoaXMgaXMgdG8gaGF2ZSB0aGUgQ1BVIHdha2UgdXAgbGVzcywgd2hpY2ggc2F2ZXMgcG93ZXIuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcm91bmRlZCB2ZXJzaW9uIG9mIHRoZSAiaiIgcGFyYW1ldGVyLgorICovCit1bnNpZ25lZCBsb25nIHJvdW5kX2ppZmZpZXModW5zaWduZWQgbG9uZyBqKQoreworCXJldHVybiBfX3JvdW5kX2ppZmZpZXMoaiwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyb3VuZF9qaWZmaWVzKTsKKworLyoqCisgKiByb3VuZF9qaWZmaWVzX3JlbGF0aXZlIC0gZnVuY3Rpb24gdG8gcm91bmQgamlmZmllcyB0byBhIGZ1bGwgc2Vjb25kCisgKiBAajogdGhlIHRpbWUgaW4gKHJlbGF0aXZlKSBqaWZmaWVzIHRoYXQgc2hvdWxkIGJlIHJvdW5kZWQKKyAqCisgKiByb3VuZF9qaWZmaWVzX3JlbGF0aXZlIHJvdW5kcyBhIHRpbWUgZGVsdGEgIGluIHRoZSBmdXR1cmUgKGluIGppZmZpZXMpCisgKiB1cCBvciBkb3duIHRvIChhcHByb3hpbWF0ZWx5KSBmdWxsIHNlY29uZHMuIFRoaXMgaXMgdXNlZnVsIGZvciB0aW1lcnMKKyAqIGZvciB3aGljaCB0aGUgZXhhY3QgdGltZSB0aGV5IGZpcmUgZG9lcyBub3QgbWF0dGVyIHRvbyBtdWNoLCBhcyBsb25nIGFzCisgKiB0aGV5IGZpcmUgYXBwcm94aW1hdGVseSBldmVyeSBYIHNlY29uZHMuCisgKgorICogQnkgcm91bmRpbmcgdGhlc2UgdGltZXJzIHRvIHdob2xlIHNlY29uZHMsIGFsbCBzdWNoIHRpbWVycyB3aWxsIGZpcmUKKyAqIGF0IHRoZSBzYW1lIHRpbWUsIHJhdGhlciB0aGFuIGF0IHZhcmlvdXMgdGltZXMgc3ByZWFkIG91dC4gVGhlIGdvYWwKKyAqIG9mIHRoaXMgaXMgdG8gaGF2ZSB0aGUgQ1BVIHdha2UgdXAgbGVzcywgd2hpY2ggc2F2ZXMgcG93ZXIuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcm91bmRlZCB2ZXJzaW9uIG9mIHRoZSAiaiIgcGFyYW1ldGVyLgorICovCit1bnNpZ25lZCBsb25nIHJvdW5kX2ppZmZpZXNfcmVsYXRpdmUodW5zaWduZWQgbG9uZyBqKQoreworCXJldHVybiBfX3JvdW5kX2ppZmZpZXNfcmVsYXRpdmUoaiwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKTsKKworCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3J1bm5pbmdfdGltZXIodHZlY19iYXNlX3QgKmJhc2UsCiAJCQkJCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIHsKQEAgLTcxNCw3ICs4NDYsNyBAQAogCQljbG9jayA9IG5ldzsKIAkJY2xvY2stPmN5Y2xlX2xhc3QgPSBub3c7CiAJCXByaW50ayhLRVJOX0lORk8gIlRpbWU6ICVzIGNsb2Nrc291cmNlIGhhcyBiZWVuIGluc3RhbGxlZC5cbiIsCi0JCQkJCWNsb2NrLT5uYW1lKTsKKwkJICAgICAgIGNsb2NrLT5uYW1lKTsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlIGlmIChjbG9jay0+dXBkYXRlX2NhbGxiYWNrKSB7CiAJCXJldHVybiBjbG9jay0+dXBkYXRlX2NhbGxiYWNrKCk7CkBAIC03MjIsNyArODU0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAjZWxzZQotI2RlZmluZSBjaGFuZ2VfY2xvY2tzb3VyY2UoKSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IGNoYW5nZV9jbG9ja3NvdXJjZSh2b2lkKQoreworCXJldHVybiAwOworfQogI2VuZGlmCiAKIC8qKgpAQCAtODIwLDcgKzk1NSw4IEBACiAgKiBJZiB0aGUgZXJyb3IgaXMgYWxyZWFkeSBsYXJnZXIsIHdlIGxvb2sgYWhlYWQgZXZlbiBmdXJ0aGVyCiAgKiB0byBjb21wZW5zYXRlIGZvciBsYXRlIG9yIGxvc3QgYWRqdXN0bWVudHMuCiAgKi8KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGNsb2Nrc291cmNlX2JpZ2FkanVzdChzNjQgZXJyb3IsIHM2NCAqaW50ZXJ2YWwsIHM2NCAqb2Zmc2V0KQorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgY2xvY2tzb3VyY2VfYmlnYWRqdXN0KHM2NCBlcnJvciwgczY0ICppbnRlcnZhbCwKKwkJCQkJCSBzNjQgKm9mZnNldCkKIHsKIAlzNjQgdGlja19lcnJvciwgaTsKIAl1MzIgbG9va19haGVhZCwgYWRqOwpAQCAtODQ0LDcgKzk4MCw4IEBACiAJICogTm93IGNhbGN1bGF0ZSB0aGUgZXJyb3IgaW4gKDEgPDwgbG9va19haGVhZCkgdGlja3MsIGJ1dCBmaXJzdAogCSAqIHJlbW92ZSB0aGUgc2luZ2xlIGxvb2sgYWhlYWQgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgZXJyb3IuCiAJICovCi0JdGlja19lcnJvciA9IGN1cnJlbnRfdGlja19sZW5ndGgoKSA+PiAoVElDS19MRU5HVEhfU0hJRlQgLSBjbG9jay0+c2hpZnQgKyAxKTsKKwl0aWNrX2Vycm9yID0gY3VycmVudF90aWNrX2xlbmd0aCgpID4+CisJCShUSUNLX0xFTkdUSF9TSElGVCAtIGNsb2NrLT5zaGlmdCArIDEpOwogCXRpY2tfZXJyb3IgLT0gY2xvY2stPnh0aW1lX2ludGVydmFsID4+IDE7CiAJZXJyb3IgPSAoKGVycm9yIC0gdGlja19lcnJvcikgPj4gbG9va19haGVhZCkgKyB0aWNrX2Vycm9yOwogCkBAIC04OTYsNyArMTAzMyw4IEBACiAJY2xvY2stPm11bHQgKz0gYWRqOwogCWNsb2NrLT54dGltZV9pbnRlcnZhbCArPSBpbnRlcnZhbDsKIAljbG9jay0+eHRpbWVfbnNlYyAtPSBvZmZzZXQ7Ci0JY2xvY2stPmVycm9yIC09IChpbnRlcnZhbCAtIG9mZnNldCkgPDwgKFRJQ0tfTEVOR1RIX1NISUZUIC0gY2xvY2stPnNoaWZ0KTsKKwljbG9jay0+ZXJyb3IgLT0gKGludGVydmFsIC0gb2Zmc2V0KSA8PAorCQkJKFRJQ0tfTEVOR1RIX1NISUZUIC0gY2xvY2stPnNoaWZ0KTsKIH0KIAogLyoqCkBAIC0xMDA4LDExICsxMTQ2LDE1IEBACiAJdW5zaWduZWQgbG9uZyBhY3RpdmVfdGFza3M7IC8qIGZpeGVkLXBvaW50ICovCiAJc3RhdGljIGludCBjb3VudCA9IExPQURfRlJFUTsKIAotCWFjdGl2ZV90YXNrcyA9IGNvdW50X2FjdGl2ZV90YXNrcygpOwotCWZvciAoY291bnQgLT0gdGlja3M7IGNvdW50IDwgMDsgY291bnQgKz0gTE9BRF9GUkVRKSB7Ci0JCUNBTENfTE9BRChhdmVucnVuWzBdLCBFWFBfMSwgYWN0aXZlX3Rhc2tzKTsKLQkJQ0FMQ19MT0FEKGF2ZW5ydW5bMV0sIEVYUF81LCBhY3RpdmVfdGFza3MpOwotCQlDQUxDX0xPQUQoYXZlbnJ1blsyXSwgRVhQXzE1LCBhY3RpdmVfdGFza3MpOworCWNvdW50IC09IHRpY2tzOworCWlmICh1bmxpa2VseShjb3VudCA8IDApKSB7CisJCWFjdGl2ZV90YXNrcyA9IGNvdW50X2FjdGl2ZV90YXNrcygpOworCQlkbyB7CisJCQlDQUxDX0xPQUQoYXZlbnJ1blswXSwgRVhQXzEsIGFjdGl2ZV90YXNrcyk7CisJCQlDQUxDX0xPQUQoYXZlbnJ1blsxXSwgRVhQXzUsIGFjdGl2ZV90YXNrcyk7CisJCQlDQUxDX0xPQUQoYXZlbnJ1blsyXSwgRVhQXzE1LCBhY3RpdmVfdGFza3MpOworCQkJY291bnQgKz0gTE9BRF9GUkVROworCQl9IHdoaWxlIChjb3VudCA8IDApOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RzYWNjdC5jIGIva2VybmVsL3RzYWNjdC5jCmluZGV4IGRiNDQzMjIuLmJhYWNjMzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90c2FjY3QuYworKysgYi9rZXJuZWwvdHNhY2N0LmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogCS8qIGNhbGN1bGF0ZSB0YXNrIGVsYXBzZWQgdGltZSBpbiB0aW1lc3BlYyAqLwogCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ1cHRpbWUpOwotCXRzID0gdGltZXNwZWNfc3ViKHVwdGltZSwgY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5zdGFydF90aW1lKTsKKwl0cyA9IHRpbWVzcGVjX3N1Yih1cHRpbWUsIHRzay0+c3RhcnRfdGltZSk7CiAJLyogcmViYXNlIGVsYXBzZWQgdGltZSB0byB1c2VjICovCiAJYWNfZXRpbWUgPSB0aW1lc3BlY190b19ucygmdHMpOwogCWRvX2RpdihhY19ldGltZSwgTlNFQ19QRVJfVVNFQyk7CkBAIC01OCw3ICs1OCwxMCBAQAogCXN0YXRzLT5hY191aWQJID0gdHNrLT51aWQ7CiAJc3RhdHMtPmFjX2dpZAkgPSB0c2stPmdpZDsKIAlzdGF0cy0+YWNfcGlkCSA9IHRzay0+cGlkOwotCXN0YXRzLT5hY19wcGlkCSA9ICh0c2stPnBhcmVudCkgPyB0c2stPnBhcmVudC0+cGlkIDogMDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJc3RhdHMtPmFjX3BwaWQJID0gcGlkX2FsaXZlKHRzaykgPworCQkJCXJjdV9kZXJlZmVyZW5jZSh0c2stPnJlYWxfcGFyZW50KS0+dGdpZCA6IDA7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJc3RhdHMtPmFjX3V0aW1lCSA9IGNwdXRpbWVfdG9fbXNlY3ModHNrLT51dGltZSkgKiBVU0VDX1BFUl9NU0VDOwogCXN0YXRzLT5hY19zdGltZQkgPSBjcHV0aW1lX3RvX21zZWNzKHRzay0+c3RpbWUpICogVVNFQ19QRVJfTVNFQzsKIAlzdGF0cy0+YWNfbWluZmx0ID0gdHNrLT5taW5fZmx0OwpAQCAtNzcsMTggKzgwLDMxIEBACiAgKi8KIHZvaWQgeGFjY3RfYWRkX3RzayhzdHJ1Y3QgdGFza3N0YXRzICpzdGF0cywgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogeworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCiAJLyogY29udmVydCBwYWdlcy1qaWZmaWVzIHRvIE1ieXRlLXVzZWMgKi8KIAlzdGF0cy0+Y29yZW1lbSA9IGppZmZpZXNfdG9fdXNlY3MocC0+YWNjdF9yc3NfbWVtMSkgKiBQQUdFX1NJWkUgLyBNQjsKIAlzdGF0cy0+dmlydG1lbSA9IGppZmZpZXNfdG9fdXNlY3MocC0+YWNjdF92bV9tZW0xKSAqIFBBR0VfU0laRSAvIE1COwotCWlmIChwLT5tbSkgeworCW1tID0gZ2V0X3Rhc2tfbW0ocCk7CisJaWYgKG1tKSB7CiAJCS8qIGFkanVzdCB0byBLQiB1bml0ICovCi0JCXN0YXRzLT5oaXdhdGVyX3JzcyAgID0gcC0+bW0tPmhpd2F0ZXJfcnNzICogUEFHRV9TSVpFIC8gS0I7Ci0JCXN0YXRzLT5oaXdhdGVyX3ZtICAgID0gcC0+bW0tPmhpd2F0ZXJfdm0gKiBQQUdFX1NJWkUgLyBLQjsKKwkJc3RhdHMtPmhpd2F0ZXJfcnNzICAgPSBtbS0+aGl3YXRlcl9yc3MgKiBQQUdFX1NJWkUgLyBLQjsKKwkJc3RhdHMtPmhpd2F0ZXJfdm0gICAgPSBtbS0+aGl3YXRlcl92bSAqIFBBR0VfU0laRSAvIEtCOworCQltbXB1dChtbSk7CiAJfQogCXN0YXRzLT5yZWFkX2NoYXIJPSBwLT5yY2hhcjsKIAlzdGF0cy0+d3JpdGVfY2hhcgk9IHAtPndjaGFyOwogCXN0YXRzLT5yZWFkX3N5c2NhbGxzCT0gcC0+c3lzY3I7CiAJc3RhdHMtPndyaXRlX3N5c2NhbGxzCT0gcC0+c3lzY3c7CisjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORworCXN0YXRzLT5yZWFkX2J5dGVzCT0gcC0+aW9hYy5yZWFkX2J5dGVzOworCXN0YXRzLT53cml0ZV9ieXRlcwk9IHAtPmlvYWMud3JpdGVfYnl0ZXM7CisJc3RhdHMtPmNhbmNlbGxlZF93cml0ZV9ieXRlcyA9IHAtPmlvYWMuY2FuY2VsbGVkX3dyaXRlX2J5dGVzOworI2Vsc2UKKwlzdGF0cy0+cmVhZF9ieXRlcwk9IDA7CisJc3RhdHMtPndyaXRlX2J5dGVzCT0gMDsKKwlzdGF0cy0+Y2FuY2VsbGVkX3dyaXRlX2J5dGVzID0gMDsKKyNlbmRpZgogfQogI3VuZGVmIEtCCiAjdW5kZWYgTUIKZGlmZiAtLWdpdCBhL2tlcm5lbC91bndpbmQuYyBiL2tlcm5lbC91bndpbmQuYwppbmRleCAyZTIzNjg2Li4wOWMyNjEzIDEwMDY0NAotLS0gYS9rZXJuZWwvdW53aW5kLmMKKysrIGIva2VybmVsL3Vud2luZC5jCkBAIC0xMSwxMyArMTEsMTYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3Vud2luZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKLWV4dGVybiBjaGFyIF9fc3RhcnRfdW53aW5kW10sIF9fZW5kX3Vud2luZFtdOworZXh0ZXJuIGNvbnN0IGNoYXIgX19zdGFydF91bndpbmRbXSwgX19lbmRfdW53aW5kW107CitleHRlcm4gY29uc3QgdTggX19zdGFydF91bndpbmRfaGRyW10sIF9fZW5kX3Vud2luZF9oZHJbXTsKIAogI2RlZmluZSBNQVhfU1RBQ0tfREVQVEggOAogCkBAIC05Miw2ICs5NSw3IEBACiAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bGViMTI4X3Q7CiB0eXBlZGVmICAgc2lnbmVkIGxvbmcgc2xlYjEyOF90OworI2RlZmluZSBzbGViMTI4YWJzIF9fYnVpbHRpbl9sYWJzCiAKIHN0YXRpYyBzdHJ1Y3QgdW53aW5kX3RhYmxlIHsKIAlzdHJ1Y3QgewpAQCAtMTAwLDYgKzEwNCw4IEBACiAJfSBjb3JlLCBpbml0OwogCWNvbnN0IHZvaWQgKmFkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBzaXplOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlcjsKKwl1bnNpZ25lZCBsb25nIGhkcnN6OwogCXN0cnVjdCB1bndpbmRfdGFibGUgKmxpbms7CiAJY29uc3QgY2hhciAqbmFtZTsKIH0gcm9vdF90YWJsZTsKQEAgLTEzMSw2ICsxMzcsMTcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjZmEgYmFkQ0ZBID0geyBBUlJBWV9TSVpFKHJlZ19pbmZvKSwgMSB9OwogCitzdGF0aWMgdW5zaWduZWQgdW53aW5kX2RlYnVnOworc3RhdGljIGludCBfX2luaXQgdW53aW5kX2RlYnVnX3NldHVwKGNoYXIgKnMpCit7CisJdW53aW5kX2RlYnVnID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJ1bndpbmRfZGVidWc9IiwgdW53aW5kX2RlYnVnX3NldHVwKTsKKyNkZWZpbmUgZHByaW50ayhsdmwsIGZtdCwgYXJncy4uLikgXAorCSgodm9pZCkobHZsID4gdW53aW5kX2RlYnVnIFwKKwkgfHwgcHJpbnRrKEtFUk5fREVCVUcgInVud2luZDogIiBmbXQgIlxuIiwgIyNhcmdzKSkpCisKIHN0YXRpYyBzdHJ1Y3QgdW53aW5kX3RhYmxlICpmaW5kX3RhYmxlKHVuc2lnbmVkIGxvbmcgcGMpCiB7CiAJc3RydWN0IHVud2luZF90YWJsZSAqdGFibGU7CkBAIC0xNDUsNiArMTYyLDEyIEBACiAJcmV0dXJuIHRhYmxlOwogfQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3BvaW50ZXIoY29uc3QgdTggKipwTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcHRyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRleHRfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRhdGFfYmFzZSk7CisKIHN0YXRpYyB2b2lkIGluaXRfdW53aW5kX3RhYmxlKHN0cnVjdCB1bndpbmRfdGFibGUgKnRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvcmVfc3RhcnQsCkBAIC0xNTIsMTQgKzE3NSwzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW5pdF9zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW5pdF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdGFibGVfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqaGVhZGVyX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBoZWFkZXJfc2l6ZSkKIHsKKwljb25zdCB1OCAqcHRyID0gaGVhZGVyX3N0YXJ0ICsgNDsKKwljb25zdCB1OCAqZW5kID0gaGVhZGVyX3N0YXJ0ICsgaGVhZGVyX3NpemU7CisKIAl0YWJsZS0+Y29yZS5wYyA9ICh1bnNpZ25lZCBsb25nKWNvcmVfc3RhcnQ7CiAJdGFibGUtPmNvcmUucmFuZ2UgPSBjb3JlX3NpemU7CiAJdGFibGUtPmluaXQucGMgPSAodW5zaWduZWQgbG9uZylpbml0X3N0YXJ0OwogCXRhYmxlLT5pbml0LnJhbmdlID0gaW5pdF9zaXplOwogCXRhYmxlLT5hZGRyZXNzID0gdGFibGVfc3RhcnQ7CiAJdGFibGUtPnNpemUgPSB0YWJsZV9zaXplOworCS8qIFNlZSBpZiB0aGUgbGlua2VyIHByb3ZpZGVkIHRhYmxlIGxvb2tzIHZhbGlkLiAqLworCWlmIChoZWFkZXJfc2l6ZSA8PSA0CisJICAgIHx8IGhlYWRlcl9zdGFydFswXSAhPSAxCisJICAgIHx8ICh2b2lkICopcmVhZF9wb2ludGVyKCZwdHIsIGVuZCwgaGVhZGVyX3N0YXJ0WzFdLCAwLCAwKQorCSAgICAgICAhPSB0YWJsZV9zdGFydAorCSAgICB8fCAhcmVhZF9wb2ludGVyKCZwdHIsIGVuZCwgaGVhZGVyX3N0YXJ0WzJdLCAwLCAwKQorCSAgICB8fCAhcmVhZF9wb2ludGVyKCZwdHIsIGVuZCwgaGVhZGVyX3N0YXJ0WzNdLCAwLAorCSAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWhlYWRlcl9zdGFydCkKKwkgICAgfHwgIXJlYWRfcG9pbnRlcigmcHRyLCBlbmQsIGhlYWRlcl9zdGFydFszXSwgMCwKKwkgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyloZWFkZXJfc3RhcnQpKQorCQloZWFkZXJfc3RhcnQgPSBOVUxMOworCXRhYmxlLT5oZHJzeiA9IGhlYWRlcl9zaXplOworCXNtcF93bWIoKTsKKwl0YWJsZS0+aGVhZGVyID0gaGVhZGVyX3N0YXJ0OwogCXRhYmxlLT5saW5rID0gTlVMTDsKIAl0YWJsZS0+bmFtZSA9IG5hbWU7CiB9CkBAIC0xNjksNyArMjExLDE0NCBAQAogCWluaXRfdW53aW5kX3RhYmxlKCZyb290X3RhYmxlLCAia2VybmVsIiwKIAkgICAgICAgICAgICAgICAgICBfdGV4dCwgX2VuZCAtIF90ZXh0LAogCSAgICAgICAgICAgICAgICAgIE5VTEwsIDAsCi0JICAgICAgICAgICAgICAgICAgX19zdGFydF91bndpbmQsIF9fZW5kX3Vud2luZCAtIF9fc3RhcnRfdW53aW5kKTsKKwkgICAgICAgICAgICAgICAgICBfX3N0YXJ0X3Vud2luZCwgX19lbmRfdW53aW5kIC0gX19zdGFydF91bndpbmQsCisJICAgICAgICAgICAgICAgICAgX19zdGFydF91bndpbmRfaGRyLCBfX2VuZF91bndpbmRfaGRyIC0gX19zdGFydF91bndpbmRfaGRyKTsKK30KKworc3RhdGljIGNvbnN0IHUzMiBiYWRfY2llLCBub3RfZmRlOworc3RhdGljIGNvbnN0IHUzMiAqY2llX2Zvcl9mZGUoY29uc3QgdTMyICpmZGUsIGNvbnN0IHN0cnVjdCB1bndpbmRfdGFibGUgKik7CitzdGF0aWMgc2lnbmVkIGZkZV9wb2ludGVyX3R5cGUoY29uc3QgdTMyICpjaWUpOworCitzdHJ1Y3QgZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBmZGU7Cit9OworCitzdGF0aWMgaW50IGNtcF9laF9mcmFtZV9oZHJfdGFibGVfZW50cmllcyhjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJY29uc3Qgc3RydWN0IGVoX2ZyYW1lX2hkcl90YWJsZV9lbnRyeSAqZTEgPSBwMTsKKwljb25zdCBzdHJ1Y3QgZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJ5ICplMiA9IHAyOworCisJcmV0dXJuIChlMS0+c3RhcnQgPiBlMi0+c3RhcnQpIC0gKGUxLT5zdGFydCA8IGUyLT5zdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN3YXBfZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJpZXModm9pZCAqcDEsIHZvaWQgKnAyLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgZWhfZnJhbWVfaGRyX3RhYmxlX2VudHJ5ICplMSA9IHAxOworCXN0cnVjdCBlaF9mcmFtZV9oZHJfdGFibGVfZW50cnkgKmUyID0gcDI7CisJdW5zaWduZWQgbG9uZyB2OworCisJdiA9IGUxLT5zdGFydDsKKwllMS0+c3RhcnQgPSBlMi0+c3RhcnQ7CisJZTItPnN0YXJ0ID0gdjsKKwl2ID0gZTEtPmZkZTsKKwllMS0+ZmRlID0gZTItPmZkZTsKKwllMi0+ZmRlID0gdjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3Vud2luZF90YWJsZShzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWJsZSwKKwkJCQkJdm9pZCAqKCphbGxvYykodW5zaWduZWQgbG9uZykpCit7CisJY29uc3QgdTggKnB0cjsKKwl1bnNpZ25lZCBsb25nIHRhYmxlU2l6ZSA9IHRhYmxlLT5zaXplLCBoZHJTaXplOworCXVuc2lnbmVkIG47CisJY29uc3QgdTMyICpmZGU7CisJc3RydWN0IHsKKwkJdTggdmVyc2lvbjsKKwkJdTggZWhfZnJhbWVfcHRyX2VuYzsKKwkJdTggZmRlX2NvdW50X2VuYzsKKwkJdTggdGFibGVfZW5jOworCQl1bnNpZ25lZCBsb25nIGVoX2ZyYW1lX3B0cjsKKwkJdW5zaWduZWQgaW50IGZkZV9jb3VudDsKKwkJc3RydWN0IGVoX2ZyYW1lX2hkcl90YWJsZV9lbnRyeSB0YWJsZVtdOworCX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpICpoZWFkZXI7CisKKwlpZiAodGFibGUtPmhlYWRlcikKKwkJcmV0dXJuOworCisJaWYgKHRhYmxlLT5oZHJzeikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiLmVoX2ZyYW1lX2hkciBmb3IgJyVzJyBwcmVzZW50IGJ1dCB1bnVzYWJsZVxuIiwKKwkJICAgICAgIHRhYmxlLT5uYW1lKTsKKworCWlmICh0YWJsZVNpemUgJiAoc2l6ZW9mKCpmZGUpIC0gMSkpCisJCXJldHVybjsKKworCWZvciAoZmRlID0gdGFibGUtPmFkZHJlc3MsIG4gPSAwOworCSAgICAgdGFibGVTaXplID4gc2l6ZW9mKCpmZGUpICYmIHRhYmxlU2l6ZSAtIHNpemVvZigqZmRlKSA+PSAqZmRlOworCSAgICAgdGFibGVTaXplIC09IHNpemVvZigqZmRlKSArICpmZGUsIGZkZSArPSAxICsgKmZkZSAvIHNpemVvZigqZmRlKSkgeworCQljb25zdCB1MzIgKmNpZSA9IGNpZV9mb3JfZmRlKGZkZSwgdGFibGUpOworCQlzaWduZWQgcHRyVHlwZTsKKworCQlpZiAoY2llID09ICZub3RfZmRlKQorCQkJY29udGludWU7CisJCWlmIChjaWUgPT0gTlVMTAorCQkgICAgfHwgY2llID09ICZiYWRfY2llCisJCSAgICB8fCAocHRyVHlwZSA9IGZkZV9wb2ludGVyX3R5cGUoY2llKSkgPCAwKQorCQkJcmV0dXJuOworCQlwdHIgPSAoY29uc3QgdTggKikoZmRlICsgMik7CisJCWlmICghcmVhZF9wb2ludGVyKCZwdHIsCisJCSAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGUsCisJCSAgICAgICAgICAgICAgICAgIHB0clR5cGUsIDAsIDApKQorCQkJcmV0dXJuOworCQkrK247CisJfQorCisJaWYgKHRhYmxlU2l6ZSB8fCAhbikKKwkJcmV0dXJuOworCisJaGRyU2l6ZSA9IDQgKyBzaXplb2YodW5zaWduZWQgbG9uZykgKyBzaXplb2YodW5zaWduZWQgaW50KQorCSAgICAgICAgKyAyICogbiAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlkcHJpbnRrKDIsICJCaW5hcnkgbG9va3VwIHRhYmxlIHNpemUgZm9yICVzOiAlbHUgYnl0ZXMiLCB0YWJsZS0+bmFtZSwgaGRyU2l6ZSk7CisJaGVhZGVyID0gYWxsb2MoaGRyU2l6ZSk7CisJaWYgKCFoZWFkZXIpCisJCXJldHVybjsKKwloZWFkZXItPnZlcnNpb24gICAgICAgICAgPSAxOworCWhlYWRlci0+ZWhfZnJhbWVfcHRyX2VuYyA9IERXX0VIX1BFX2Fic3xEV19FSF9QRV9uYXRpdmU7CisJaGVhZGVyLT5mZGVfY291bnRfZW5jICAgID0gRFdfRUhfUEVfYWJzfERXX0VIX1BFX2RhdGE0OworCWhlYWRlci0+dGFibGVfZW5jICAgICAgICA9IERXX0VIX1BFX2Fic3xEV19FSF9QRV9uYXRpdmU7CisJcHV0X3VuYWxpZ25lZCgodW5zaWduZWQgbG9uZyl0YWJsZS0+YWRkcmVzcywgJmhlYWRlci0+ZWhfZnJhbWVfcHRyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2YodHlwZW9mKCpoZWFkZXIpLCBmZGVfY291bnQpCisJICAgICAgICAgICAgICUgX19hbGlnbm9mKHR5cGVvZihoZWFkZXItPmZkZV9jb3VudCkpKTsKKwloZWFkZXItPmZkZV9jb3VudCAgICAgICAgPSBuOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHR5cGVvZigqaGVhZGVyKSwgdGFibGUpCisJICAgICAgICAgICAgICUgX19hbGlnbm9mKHR5cGVvZigqaGVhZGVyLT50YWJsZSkpKTsKKwlmb3IgKGZkZSA9IHRhYmxlLT5hZGRyZXNzLCB0YWJsZVNpemUgPSB0YWJsZS0+c2l6ZSwgbiA9IDA7CisJICAgICB0YWJsZVNpemU7CisJICAgICB0YWJsZVNpemUgLT0gc2l6ZW9mKCpmZGUpICsgKmZkZSwgZmRlICs9IDEgKyAqZmRlIC8gc2l6ZW9mKCpmZGUpKSB7CisJCWNvbnN0IHUzMiAqY2llID0gZmRlICsgMSAtIGZkZVsxXSAvIHNpemVvZigqZmRlKTsKKworCQlpZiAoIWZkZVsxXSkKKwkJCWNvbnRpbnVlOyAvKiB0aGlzIGlzIGEgQ0lFICovCisJCXB0ciA9IChjb25zdCB1OCAqKShmZGUgKyAyKTsKKwkJaGVhZGVyLT50YWJsZVtuXS5zdGFydCA9IHJlYWRfcG9pbnRlcigmcHRyLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRlX3BvaW50ZXJfdHlwZShjaWUpLCAwLCAwKTsKKwkJaGVhZGVyLT50YWJsZVtuXS5mZGUgPSAodW5zaWduZWQgbG9uZylmZGU7CisJCSsrbjsKKwl9CisJV0FSTl9PTihuICE9IGhlYWRlci0+ZmRlX2NvdW50KTsKKworCXNvcnQoaGVhZGVyLT50YWJsZSwKKwkgICAgIG4sCisJICAgICBzaXplb2YoKmhlYWRlci0+dGFibGUpLAorCSAgICAgY21wX2VoX2ZyYW1lX2hkcl90YWJsZV9lbnRyaWVzLAorCSAgICAgc3dhcF9laF9mcmFtZV9oZHJfdGFibGVfZW50cmllcyk7CisKKwl0YWJsZS0+aGRyc3ogPSBoZHJTaXplOworCXNtcF93bWIoKTsKKwl0YWJsZS0+aGVhZGVyID0gKGNvbnN0IHZvaWQgKiloZWFkZXI7Cit9CisKK3N0YXRpYyB2b2lkICpfX2luaXQgYmFsbG9jKHVuc2lnbmVkIGxvbmcgc3opCit7CisJcmV0dXJuIF9fYWxsb2NfYm9vdG1lbV9ub3BhbmljKHN6LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgaW50KSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19wYShNQVhfRE1BX0FERFJFU1MpKTsKK30KKwordm9pZCBfX2luaXQgdW53aW5kX3NldHVwKHZvaWQpCit7CisJc2V0dXBfdW53aW5kX3RhYmxlKCZyb290X3RhYmxlLCBiYWxsb2MpOwogfQogCiAjaWZkZWYgQ09ORklHX01PRFVMRVMKQEAgLTE5Myw3ICszNzIsOCBAQAogCWluaXRfdW53aW5kX3RhYmxlKHRhYmxlLCBtb2R1bGUtPm5hbWUsCiAJICAgICAgICAgICAgICAgICAgbW9kdWxlLT5tb2R1bGVfY29yZSwgbW9kdWxlLT5jb3JlX3NpemUsCiAJICAgICAgICAgICAgICAgICAgbW9kdWxlLT5tb2R1bGVfaW5pdCwgbW9kdWxlLT5pbml0X3NpemUsCi0JICAgICAgICAgICAgICAgICAgdGFibGVfc3RhcnQsIHRhYmxlX3NpemUpOworCSAgICAgICAgICAgICAgICAgIHRhYmxlX3N0YXJ0LCB0YWJsZV9zaXplLAorCSAgICAgICAgICAgICAgICAgIE5VTEwsIDApOwogCiAJaWYgKGxhc3RfdGFibGUpCiAJCWxhc3RfdGFibGUtPmxpbmsgPSB0YWJsZTsKQEAgLTMwMyw5ICs0ODMsMzEgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBjb25zdCB1MzIgKmNpZV9mb3JfZmRlKGNvbnN0IHUzMiAqZmRlLCBjb25zdCBzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWJsZSkKK3sKKwljb25zdCB1MzIgKmNpZTsKKworCWlmICghKmZkZSB8fCAoKmZkZSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCisJCXJldHVybiAmYmFkX2NpZTsKKwlpZiAoIWZkZVsxXSkKKwkJcmV0dXJuICZub3RfZmRlOyAvKiB0aGlzIGlzIGEgQ0lFICovCisJaWYgKChmZGVbMV0gJiAoc2l6ZW9mKCpmZGUpIC0gMSkpCisJICAgIHx8IGZkZVsxXSA+ICh1bnNpZ25lZCBsb25nKShmZGUgKyAxKSAtICh1bnNpZ25lZCBsb25nKXRhYmxlLT5hZGRyZXNzKQorCQlyZXR1cm4gTlVMTDsgLyogdGhpcyBpcyBub3QgYSB2YWxpZCBGREUgKi8KKwljaWUgPSBmZGUgKyAxIC0gZmRlWzFdIC8gc2l6ZW9mKCpmZGUpOworCWlmICgqY2llIDw9IHNpemVvZigqY2llKSArIDQKKwkgICAgfHwgKmNpZSA+PSBmZGVbMV0gLSBzaXplb2YoKmZkZSkKKwkgICAgfHwgKCpjaWUgJiAoc2l6ZW9mKCpjaWUpIC0gMSkpCisJICAgIHx8IGNpZVsxXSkKKwkJcmV0dXJuIE5VTEw7IC8qIHRoaXMgaXMgbm90IGEgKHZhbGlkKSBDSUUgKi8KKwlyZXR1cm4gY2llOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3BvaW50ZXIoY29uc3QgdTggKipwTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcHRyVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcHRyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRleHRfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRhdGFfYmFzZSkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKIAl1bmlvbiB7CkBAIC0zMTcsMTMgKzUxOSwxNyBAQAogCQljb25zdCB1bnNpZ25lZCBsb25nICpwdWw7CiAJfSBwdHI7CiAKLQlpZiAocHRyVHlwZSA8IDAgfHwgcHRyVHlwZSA9PSBEV19FSF9QRV9vbWl0KQorCWlmIChwdHJUeXBlIDwgMCB8fCBwdHJUeXBlID09IERXX0VIX1BFX29taXQpIHsKKwkJZHByaW50aygxLCAiSW52YWxpZCBwb2ludGVyIGVuY29kaW5nICUwMlggKCVwLCVwKS4iLCBwdHJUeXBlLCAqcExvYywgZW5kKTsKIAkJcmV0dXJuIDA7CisJfQogCXB0ci5wOCA9ICpwTG9jOwogCXN3aXRjaChwdHJUeXBlICYgRFdfRUhfUEVfRk9STSkgewogCWNhc2UgRFdfRUhfUEVfZGF0YTI6Ci0JCWlmIChlbmQgPCAoY29uc3Qgdm9pZCAqKShwdHIucDE2dSArIDEpKQorCQlpZiAoZW5kIDwgKGNvbnN0IHZvaWQgKikocHRyLnAxNnUgKyAxKSkgeworCQkJZHByaW50aygxLCAiRGF0YTE2IG92ZXJydW4gKCVwLCVwKS4iLCBwdHIucDgsIGVuZCk7CiAJCQlyZXR1cm4gMDsKKwkJfQogCQlpZihwdHJUeXBlICYgRFdfRUhfUEVfc2lnbmVkKQogCQkJdmFsdWUgPSBnZXRfdW5hbGlnbmVkKHB0ci5wMTZzKyspOwogCQllbHNlCkBAIC0zMzEsOCArNTM3LDEwIEBACiAJCWJyZWFrOwogCWNhc2UgRFdfRUhfUEVfZGF0YTQ6CiAjaWZkZWYgQ09ORklHXzY0QklUCi0JCWlmIChlbmQgPCAoY29uc3Qgdm9pZCAqKShwdHIucDMydSArIDEpKQorCQlpZiAoZW5kIDwgKGNvbnN0IHZvaWQgKikocHRyLnAzMnUgKyAxKSkgeworCQkJZHByaW50aygxLCAiRGF0YTMyIG92ZXJydW4gKCVwLCVwKS4iLCBwdHIucDgsIGVuZCk7CiAJCQlyZXR1cm4gMDsKKwkJfQogCQlpZihwdHJUeXBlICYgRFdfRUhfUEVfc2lnbmVkKQogCQkJdmFsdWUgPSBnZXRfdW5hbGlnbmVkKHB0ci5wMzJzKyspOwogCQllbHNlCkBAIC0zNDQsOCArNTUyLDEwIEBACiAJCUJVSUxEX0JVR19PTihzaXplb2YodTMyKSAhPSBzaXplb2YodmFsdWUpKTsKICNlbmRpZgogCWNhc2UgRFdfRUhfUEVfbmF0aXZlOgotCQlpZiAoZW5kIDwgKGNvbnN0IHZvaWQgKikocHRyLnB1bCArIDEpKQorCQlpZiAoZW5kIDwgKGNvbnN0IHZvaWQgKikocHRyLnB1bCArIDEpKSB7CisJCQlkcHJpbnRrKDEsICJEYXRhVUwgb3ZlcnJ1biAoJXAsJXApLiIsIHB0ci5wOCwgZW5kKTsKIAkJCXJldHVybiAwOworCQl9CiAJCXZhbHVlID0gZ2V0X3VuYWxpZ25lZChwdHIucHVsKyspOwogCQlicmVhazsKIAljYXNlIERXX0VIX1BFX2xlYjEyODoKQEAgLTM1MywxMCArNTYzLDE0IEBACiAJCXZhbHVlID0gcHRyVHlwZSAmIERXX0VIX1BFX3NpZ25lZAogCQkgICAgICAgID8gZ2V0X3NsZWIxMjgoJnB0ci5wOCwgZW5kKQogCQkgICAgICAgIDogZ2V0X3VsZWIxMjgoJnB0ci5wOCwgZW5kKTsKLQkJaWYgKChjb25zdCB2b2lkICopcHRyLnA4ID4gZW5kKQorCQlpZiAoKGNvbnN0IHZvaWQgKilwdHIucDggPiBlbmQpIHsKKwkJCWRwcmludGsoMSwgIkRhdGFMRUIgb3ZlcnJ1biAoJXAsJXApLiIsIHB0ci5wOCwgZW5kKTsKIAkJCXJldHVybiAwOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCWRwcmludGsoMiwgIkNhbm5vdCBkZWNvZGUgcG9pbnRlciB0eXBlICUwMlggKCVwLCVwKS4iLAorCQkgICAgICAgIHB0clR5cGUsIHB0ci5wOCwgZW5kKTsKIAkJcmV0dXJuIDA7CiAJfQogCXN3aXRjaChwdHJUeXBlICYgRFdfRUhfUEVfQURKVVNUKSB7CkBAIC0zNjUsMTIgKzU3OSwzMyBAQAogCWNhc2UgRFdfRUhfUEVfcGNyZWw6CiAJCXZhbHVlICs9ICh1bnNpZ25lZCBsb25nKSpwTG9jOwogCQlicmVhazsKKwljYXNlIERXX0VIX1BFX3RleHRyZWw6CisJCWlmIChsaWtlbHkodGV4dF9iYXNlKSkgeworCQkJdmFsdWUgKz0gdGV4dF9iYXNlOworCQkJYnJlYWs7CisJCX0KKwkJZHByaW50aygyLCAiVGV4dC1yZWxhdGl2ZSBlbmNvZGluZyAlMDJYICglcCwlcCksIGJ1dCB6ZXJvIHRleHQgYmFzZS4iLAorCQkgICAgICAgIHB0clR5cGUsICpwTG9jLCBlbmQpOworCQlyZXR1cm4gMDsKKwljYXNlIERXX0VIX1BFX2RhdGFyZWw6CisJCWlmIChsaWtlbHkoZGF0YV9iYXNlKSkgeworCQkJdmFsdWUgKz0gZGF0YV9iYXNlOworCQkJYnJlYWs7CisJCX0KKwkJZHByaW50aygyLCAiRGF0YS1yZWxhdGl2ZSBlbmNvZGluZyAlMDJYICglcCwlcCksIGJ1dCB6ZXJvIGRhdGEgYmFzZS4iLAorCQkgICAgICAgIHB0clR5cGUsICpwTG9jLCBlbmQpOworCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgorCQlkcHJpbnRrKDIsICJDYW5ub3QgYWRqdXN0IHBvaW50ZXIgdHlwZSAlMDJYICglcCwlcCkuIiwKKwkJICAgICAgICBwdHJUeXBlLCAqcExvYywgZW5kKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICgocHRyVHlwZSAmIERXX0VIX1BFX2luZGlyZWN0KQotCSAgICAmJiBfX2dldF91c2VyKHZhbHVlLCAodW5zaWduZWQgbG9uZyAqKXZhbHVlKSkKKwkgICAgJiYgcHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcgKil2YWx1ZSwgdmFsdWUpKSB7CisJCWRwcmludGsoMSwgIkNhbm5vdCByZWFkIGluZGlyZWN0IHZhbHVlICVseCAoJXAsJXApLiIsCisJCSAgICAgICAgdmFsdWUsICpwTG9jLCBlbmQpOwogCQlyZXR1cm4gMDsKKwl9CiAJKnBMb2MgPSBwdHIucDg7CiAKIAlyZXR1cm4gdmFsdWU7CkBAIC00MTMsNyArNjQ4LDggQEAKIAkJCWNhc2UgJ1AnOiB7CiAJCQkJCXNpZ25lZCBwdHJUeXBlID0gKnB0cisrOwogCi0JCQkJCWlmICghcmVhZF9wb2ludGVyKCZwdHIsIGVuZCwgcHRyVHlwZSkgfHwgcHRyID4gZW5kKQorCQkJCQlpZiAoIXJlYWRfcG9pbnRlcigmcHRyLCBlbmQsIHB0clR5cGUsIDAsIDApCisJCQkJCSAgICB8fCBwdHIgPiBlbmQpCiAJCQkJCQlyZXR1cm4gLTE7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtNDczLDcgKzcwOSw4IEBACiAJCQljYXNlIERXX0NGQV9ub3A6CiAJCQkJYnJlYWs7CiAJCQljYXNlIERXX0NGQV9zZXRfbG9jOgotCQkJCWlmICgoc3RhdGUtPmxvYyA9IHJlYWRfcG9pbnRlcigmcHRyLnA4LCBlbmQsIHB0clR5cGUpKSA9PSAwKQorCQkJCXN0YXRlLT5sb2MgPSByZWFkX3BvaW50ZXIoJnB0ci5wOCwgZW5kLCBwdHJUeXBlLCAwLCAwKTsKKwkJCQlpZiAoc3RhdGUtPmxvYyA9PSAwKQogCQkJCQlyZXN1bHQgPSAwOwogCQkJCWJyZWFrOwogCQkJY2FzZSBEV19DRkFfYWR2YW5jZV9sb2MxOgpAQCAtNTE5LDggKzc1NiwxMCBAQAogCQkJCQlzdGF0ZS0+bGFiZWwgPSBOVUxMOwogCQkJCQlyZXR1cm4gMTsKIAkJCQl9Ci0JCQkJaWYgKHN0YXRlLT5zdGFja0RlcHRoID49IE1BWF9TVEFDS19ERVBUSCkKKwkJCQlpZiAoc3RhdGUtPnN0YWNrRGVwdGggPj0gTUFYX1NUQUNLX0RFUFRIKSB7CisJCQkJCWRwcmludGsoMSwgIlN0YXRlIHN0YWNrIG92ZXJmbG93ICglcCwlcCkuIiwgcHRyLnA4LCBlbmQpOwogCQkJCQlyZXR1cm4gMDsKKwkJCQl9CiAJCQkJc3RhdGUtPnN0YWNrW3N0YXRlLT5zdGFja0RlcHRoKytdID0gcHRyLnA4OwogCQkJCWJyZWFrOwogCQkJY2FzZSBEV19DRkFfcmVzdG9yZV9zdGF0ZToKQEAgLTUzNSw4ICs3NzQsMTAgQEAKIAkJCQkJcmVzdWx0ID0gcHJvY2Vzc0NGSShzdGFydCwgZW5kLCAwLCBwdHJUeXBlLCBzdGF0ZSk7CiAJCQkJCXN0YXRlLT5sb2MgPSBsb2M7CiAJCQkJCXN0YXRlLT5sYWJlbCA9IGxhYmVsOwotCQkJCX0gZWxzZQorCQkJCX0gZWxzZSB7CisJCQkJCWRwcmludGsoMSwgIlN0YXRlIHN0YWNrIHVuZGVyZmxvdyAoJXAsJXApLiIsIHB0ci5wOCwgZW5kKTsKIAkJCQkJcmV0dXJuIDA7CisJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBEV19DRkFfZGVmX2NmYToKIAkJCQlzdGF0ZS0+Y2ZhLnJlZyA9IGdldF91bGViMTI4KCZwdHIucDgsIGVuZCk7CkBAIC01NjgsNiArODA5LDcgQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgRFdfQ0ZBX0dOVV93aW5kb3dfc2F2ZToKIAkJCWRlZmF1bHQ6CisJCQkJZHByaW50aygxLCAiVW5yZWNvZ25pemVkIENGSSBvcCAlMDJYICglcCwlcCkuIiwgcHRyLnA4Wy0xXSwgcHRyLnA4IC0gMSwgZW5kKTsKIAkJCQlyZXN1bHQgPSAwOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNTgzLDEyICs4MjUsMTcgQEAKIAkJCXNldF9ydWxlKCpwdHIucDgrKyAmIDB4M2YsIE5vd2hlcmUsIDAsIHN0YXRlKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChwdHIucDggPiBlbmQpCisJCWlmIChwdHIucDggPiBlbmQpIHsKKwkJCWRwcmludGsoMSwgIkRhdGEgb3ZlcnJ1biAoJXAsJXApLiIsIHB0ci5wOCwgZW5kKTsKIAkJCXJlc3VsdCA9IDA7CisJCX0KIAkJaWYgKHJlc3VsdCAmJiB0YXJnZXRMb2MgIT0gMCAmJiB0YXJnZXRMb2MgPCBzdGF0ZS0+bG9jKQogCQkJcmV0dXJuIDE7CiAJfQogCisJaWYgKHJlc3VsdCAmJiBwdHIucDggPCBlbmQpCisJCWRwcmludGsoMSwgIkRhdGEgdW5kZXJydW4gKCVwLCVwKS4iLCBwdHIucDgsIGVuZCk7CisKIAlyZXR1cm4gcmVzdWx0CiAJICAgJiYgcHRyLnA4ID09IGVuZAogCSAgICYmICh0YXJnZXRMb2MgPT0gMApAQCAtNjA1LDU0ICs4NTIsMTIyIEBACiAjZGVmaW5lIEZSQU1FX1JFRyhyLCB0KSAoKCh0ICopZnJhbWUpW3JlZ19pbmZvW3JdLm9mZnNdKQogCWNvbnN0IHUzMiAqZmRlID0gTlVMTCwgKmNpZSA9IE5VTEw7CiAJY29uc3QgdTggKnB0ciA9IE5VTEwsICplbmQgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcGMgPSBVTldfUEMoZnJhbWUpIC0gZnJhbWUtPmNhbGxfZnJhbWU7CisJdW5zaWduZWQgbG9uZyBwYyA9IFVOV19QQyhmcmFtZSkgLSBmcmFtZS0+Y2FsbF9mcmFtZSwgc3A7CiAJdW5zaWduZWQgbG9uZyBzdGFydExvYyA9IDAsIGVuZExvYyA9IDAsIGNmYTsKIAl1bnNpZ25lZCBpOwogCXNpZ25lZCBwdHJUeXBlID0gLTE7CiAJdWxlYjEyOF90IHJldEFkZHJSZWcgPSAwOwotCXN0cnVjdCB1bndpbmRfdGFibGUgKnRhYmxlOworCWNvbnN0IHN0cnVjdCB1bndpbmRfdGFibGUgKnRhYmxlOwogCXN0cnVjdCB1bndpbmRfc3RhdGUgc3RhdGU7CiAKIAlpZiAoVU5XX1BDKGZyYW1lKSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoKHRhYmxlID0gZmluZF90YWJsZShwYykpICE9IE5VTEwKIAkgICAgJiYgISh0YWJsZS0+c2l6ZSAmIChzaXplb2YoKmZkZSkgLSAxKSkpIHsKLQkJdW5zaWduZWQgbG9uZyB0YWJsZVNpemUgPSB0YWJsZS0+c2l6ZTsKKwkJY29uc3QgdTggKmhkciA9IHRhYmxlLT5oZWFkZXI7CisJCXVuc2lnbmVkIGxvbmcgdGFibGVTaXplOwogCi0JCWZvciAoZmRlID0gdGFibGUtPmFkZHJlc3M7Ci0JCSAgICAgdGFibGVTaXplID4gc2l6ZW9mKCpmZGUpICYmIHRhYmxlU2l6ZSAtIHNpemVvZigqZmRlKSA+PSAqZmRlOwotCQkgICAgIHRhYmxlU2l6ZSAtPSBzaXplb2YoKmZkZSkgKyAqZmRlLAotCQkgICAgIGZkZSArPSAxICsgKmZkZSAvIHNpemVvZigqZmRlKSkgewotCQkJaWYgKCEqZmRlIHx8ICgqZmRlICYgKHNpemVvZigqZmRlKSAtIDEpKSkKLQkJCQlicmVhazsKLQkJCWlmICghZmRlWzFdKQotCQkJCWNvbnRpbnVlOyAvKiB0aGlzIGlzIGEgQ0lFICovCi0JCQlpZiAoKGZkZVsxXSAmIChzaXplb2YoKmZkZSkgLSAxKSkKLQkJCSAgICB8fCBmZGVbMV0gPiAodW5zaWduZWQgbG9uZykoZmRlICsgMSkKLQkJCSAgICAgICAgICAgICAgICAtICh1bnNpZ25lZCBsb25nKXRhYmxlLT5hZGRyZXNzKQotCQkJCWNvbnRpbnVlOyAvKiB0aGlzIGlzIG5vdCBhIHZhbGlkIEZERSAqLwotCQkJY2llID0gZmRlICsgMSAtIGZkZVsxXSAvIHNpemVvZigqZmRlKTsKLQkJCWlmICgqY2llIDw9IHNpemVvZigqY2llKSArIDQKLQkJCSAgICB8fCAqY2llID49IGZkZVsxXSAtIHNpemVvZigqZmRlKQotCQkJICAgIHx8ICgqY2llICYgKHNpemVvZigqY2llKSAtIDEpKQotCQkJICAgIHx8IGNpZVsxXQotCQkJICAgIHx8IChwdHJUeXBlID0gZmRlX3BvaW50ZXJfdHlwZShjaWUpKSA8IDApIHsKLQkJCQljaWUgPSBOVUxMOyAvKiB0aGlzIGlzIG5vdCBhICh2YWxpZCkgQ0lFICovCi0JCQkJY29udGludWU7CisJCXNtcF9ybWIoKTsKKwkJaWYgKGhkciAmJiBoZHJbMF0gPT0gMSkgeworCQkJc3dpdGNoKGhkclszXSAmIERXX0VIX1BFX0ZPUk0pIHsKKwkJCWNhc2UgRFdfRUhfUEVfbmF0aXZlOiB0YWJsZVNpemUgPSBzaXplb2YodW5zaWduZWQgbG9uZyk7IGJyZWFrOworCQkJY2FzZSBEV19FSF9QRV9kYXRhMjogdGFibGVTaXplID0gMjsgYnJlYWs7CisJCQljYXNlIERXX0VIX1BFX2RhdGE0OiB0YWJsZVNpemUgPSA0OyBicmVhazsKKwkJCWNhc2UgRFdfRUhfUEVfZGF0YTg6IHRhYmxlU2l6ZSA9IDg7IGJyZWFrOworCQkJZGVmYXVsdDogdGFibGVTaXplID0gMDsgYnJlYWs7CiAJCQl9CisJCQlwdHIgPSBoZHIgKyA0OworCQkJZW5kID0gaGRyICsgdGFibGUtPmhkcnN6OworCQkJaWYgKHRhYmxlU2l6ZQorCQkJICAgICYmIHJlYWRfcG9pbnRlcigmcHRyLCBlbmQsIGhkclsxXSwgMCwgMCkKKwkJCSAgICAgICA9PSAodW5zaWduZWQgbG9uZyl0YWJsZS0+YWRkcmVzcworCQkJICAgICYmIChpID0gcmVhZF9wb2ludGVyKCZwdHIsIGVuZCwgaGRyWzJdLCAwLCAwKSkgPiAwCisJCQkgICAgJiYgaSA9PSAoZW5kIC0gcHRyKSAvICgyICogdGFibGVTaXplKQorCQkJICAgICYmICEoKGVuZCAtIHB0cikgJSAoMiAqIHRhYmxlU2l6ZSkpKSB7CisJCQkJZG8geworCQkJCQljb25zdCB1OCAqY3VyID0gcHRyICsgKGkgLyAyKSAqICgyICogdGFibGVTaXplKTsKKworCQkJCQlzdGFydExvYyA9IHJlYWRfcG9pbnRlcigmY3VyLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBjdXIgKyB0YWJsZVNpemUsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGhkclszXSwgMCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaGRyKTsKKwkJCQkJaWYgKHBjIDwgc3RhcnRMb2MpCisJCQkJCQlpIC89IDI7CisJCQkJCWVsc2UgeworCQkJCQkJcHRyID0gY3VyIC0gdGFibGVTaXplOworCQkJCQkJaSA9IChpICsgMSkgLyAyOworCQkJCQl9CisJCQkJfSB3aGlsZSAoc3RhcnRMb2MgJiYgaSA+IDEpOworCQkJCWlmIChpID09IDEKKwkJCQkgICAgJiYgKHN0YXJ0TG9jID0gcmVhZF9wb2ludGVyKCZwdHIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKyB0YWJsZVNpemUsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHJbM10sIDAsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyloZHIpKSAhPSAwCisJCQkJICAgICYmIHBjID49IHN0YXJ0TG9jKQorCQkJCQlmZGUgPSAodm9pZCAqKXJlYWRfcG9pbnRlcigmcHRyLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKyB0YWJsZVNpemUsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkclszXSwgMCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaGRyKTsKKwkJCX0KKwkJfQorCQlpZihoZHIgJiYgIWZkZSkKKwkJCWRwcmludGsoMywgIkJpbmFyeSBsb29rdXAgZm9yICVseCBmYWlsZWQuIiwgcGMpOworCisJCWlmIChmZGUgIT0gTlVMTCkgeworCQkJY2llID0gY2llX2Zvcl9mZGUoZmRlLCB0YWJsZSk7CiAJCQlwdHIgPSAoY29uc3QgdTggKikoZmRlICsgMik7Ci0JCQlzdGFydExvYyA9IHJlYWRfcG9pbnRlcigmcHRyLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHU4ICopKGZkZSArIDEpICsgKmZkZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHB0clR5cGUpOwotCQkJZW5kTG9jID0gc3RhcnRMb2MKLQkJCSAgICAgICAgICsgcmVhZF9wb2ludGVyKCZwdHIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdTggKikoZmRlICsgMSkgKyAqZmRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgcHRyVHlwZSAmIERXX0VIX1BFX2luZGlyZWN0Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgICA/IHB0clR5cGUKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIDogcHRyVHlwZSAmIChEV19FSF9QRV9GT1JNfERXX0VIX1BFX3NpZ25lZCkpOwotCQkJaWYgKHBjID49IHN0YXJ0TG9jICYmIHBjIDwgZW5kTG9jKQotCQkJCWJyZWFrOwotCQkJY2llID0gTlVMTDsKKwkJCWlmKGNpZSAhPSBOVUxMCisJCQkgICAmJiBjaWUgIT0gJmJhZF9jaWUKKwkJCSAgICYmIGNpZSAhPSAmbm90X2ZkZQorCQkJICAgJiYgKHB0clR5cGUgPSBmZGVfcG9pbnRlcl90eXBlKGNpZSkpID49IDAKKwkJCSAgICYmIHJlYWRfcG9pbnRlcigmcHRyLAorCQkJICAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGUsCisJCQkgICAgICAgICAgICAgICAgICAgcHRyVHlwZSwgMCwgMCkgPT0gc3RhcnRMb2MpIHsKKwkJCQlpZiAoIShwdHJUeXBlICYgRFdfRUhfUEVfaW5kaXJlY3QpKQorCQkJCQlwdHJUeXBlICY9IERXX0VIX1BFX0ZPUk18RFdfRUhfUEVfc2lnbmVkOworCQkJCWVuZExvYyA9IHN0YXJ0TG9jCisJCQkJICAgICAgICAgKyByZWFkX3BvaW50ZXIoJnB0ciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdTggKikoZmRlICsgMSkgKyAqZmRlLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHB0clR5cGUsIDAsIDApOworCQkJCWlmKHBjID49IGVuZExvYykKKwkJCQkJZmRlID0gTlVMTDsKKwkJCX0gZWxzZQorCQkJCWZkZSA9IE5VTEw7CisJCQlpZighZmRlKQorCQkJCWRwcmludGsoMSwgIkJpbmFyeSBsb29rdXAgcmVzdWx0IGZvciAlbHggZGlzY2FyZGVkLiIsIHBjKTsKKwkJfQorCQlpZiAoZmRlID09IE5VTEwpIHsKKwkJCWZvciAoZmRlID0gdGFibGUtPmFkZHJlc3MsIHRhYmxlU2l6ZSA9IHRhYmxlLT5zaXplOworCQkJICAgICBjaWUgPSBOVUxMLCB0YWJsZVNpemUgPiBzaXplb2YoKmZkZSkKKwkJCSAgICAgJiYgdGFibGVTaXplIC0gc2l6ZW9mKCpmZGUpID49ICpmZGU7CisJCQkgICAgIHRhYmxlU2l6ZSAtPSBzaXplb2YoKmZkZSkgKyAqZmRlLAorCQkJICAgICBmZGUgKz0gMSArICpmZGUgLyBzaXplb2YoKmZkZSkpIHsKKwkJCQljaWUgPSBjaWVfZm9yX2ZkZShmZGUsIHRhYmxlKTsKKwkJCQlpZiAoY2llID09ICZiYWRfY2llKSB7CisJCQkJCWNpZSA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoY2llID09IE5VTEwKKwkJCQkgICAgfHwgY2llID09ICZub3RfZmRlCisJCQkJICAgIHx8IChwdHJUeXBlID0gZmRlX3BvaW50ZXJfdHlwZShjaWUpKSA8IDApCisJCQkJCWNvbnRpbnVlOworCQkJCXB0ciA9IChjb25zdCB1OCAqKShmZGUgKyAyKTsKKwkJCQlzdGFydExvYyA9IHJlYWRfcG9pbnRlcigmcHRyLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1OCAqKShmZGUgKyAxKSArICpmZGUsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgcHRyVHlwZSwgMCwgMCk7CisJCQkJaWYgKCFzdGFydExvYykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCEocHRyVHlwZSAmIERXX0VIX1BFX2luZGlyZWN0KSkKKwkJCQkJcHRyVHlwZSAmPSBEV19FSF9QRV9GT1JNfERXX0VIX1BFX3NpZ25lZDsKKwkJCQllbmRMb2MgPSBzdGFydExvYworCQkJCSAgICAgICAgICsgcmVhZF9wb2ludGVyKCZwdHIsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHU4ICopKGZkZSArIDEpICsgKmZkZSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwdHJUeXBlLCAwLCAwKTsKKwkJCQlpZiAocGMgPj0gc3RhcnRMb2MgJiYgcGMgPCBlbmRMb2MpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYoIWZkZSkKKwkJCQlkcHJpbnRrKDMsICJMaW5lYXIgbG9va3VwIGZvciAlbHggZmFpbGVkLiIsIHBjKTsKIAkJfQogCX0KIAlpZiAoY2llICE9IE5VTEwpIHsKQEAgLTY4Niw2ICsxMDAxLDggQEAKIAkJCWlmIChwdHIgPj0gZW5kIHx8ICpwdHIpCiAJCQkJY2llID0gTlVMTDsKIAkJfQorCQlpZighY2llKQorCQkJZHByaW50aygxLCAiQ0lFIHVudXNhYmxlICglcCwlcCkuIiwgcHRyLCBlbmQpOwogCQkrK3B0cjsKIAl9CiAJaWYgKGNpZSAhPSBOVUxMKSB7CkBAIC02OTUsMTcgKzEwMTIsMjcgQEAKIAkJc3RhdGUuZGF0YUFsaWduID0gZ2V0X3NsZWIxMjgoJnB0ciwgZW5kKTsKIAkJaWYgKHN0YXRlLmNvZGVBbGlnbiA9PSAwIHx8IHN0YXRlLmRhdGFBbGlnbiA9PSAwIHx8IHB0ciA+PSBlbmQpCiAJCQljaWUgPSBOVUxMOwotCQllbHNlIHsKKwkJZWxzZSBpZiAoVU5XX1BDKGZyYW1lKSAlIHN0YXRlLmNvZGVBbGlnbgorCQkgICAgICAgICB8fCBVTldfU1AoZnJhbWUpICUgc2xlYjEyOGFicyhzdGF0ZS5kYXRhQWxpZ24pKSB7CisJCQlkcHJpbnRrKDEsICJJbnB1dCBwb2ludGVyKHMpIG1pc2FsaWduZWQgKCVseCwlbHgpLiIsCisJCQkgICAgICAgIFVOV19QQyhmcmFtZSksIFVOV19TUChmcmFtZSkpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfSBlbHNlIHsKIAkJCXJldEFkZHJSZWcgPSBzdGF0ZS52ZXJzaW9uIDw9IDEgPyAqcHRyKysgOiBnZXRfdWxlYjEyOCgmcHRyLCBlbmQpOwogCQkJLyogc2tpcCBhdWdtZW50YXRpb24gKi8KLQkJCWlmICgoKGNvbnN0IGNoYXIgKikoY2llICsgMikpWzFdID09ICd6JykKLQkJCQlwdHIgKz0gZ2V0X3VsZWIxMjgoJnB0ciwgZW5kKTsKKwkJCWlmICgoKGNvbnN0IGNoYXIgKikoY2llICsgMikpWzFdID09ICd6JykgeworCQkJCXVsZWIxMjhfdCBhdWdTaXplID0gZ2V0X3VsZWIxMjgoJnB0ciwgZW5kKTsKKworCQkJCXB0ciArPSBhdWdTaXplOworCQkJfQogCQkJaWYgKHB0ciA+IGVuZAogCQkJICAgfHwgcmV0QWRkclJlZyA+PSBBUlJBWV9TSVpFKHJlZ19pbmZvKQogCQkJICAgfHwgUkVHX0lOVkFMSUQocmV0QWRkclJlZykKIAkJCSAgIHx8IHJlZ19pbmZvW3JldEFkZHJSZWddLndpZHRoICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKIAkJCQljaWUgPSBOVUxMOwogCQl9CisJCWlmKCFjaWUpCisJCQlkcHJpbnRrKDEsICJDSUUgdmFsaWRhdGlvbiBmYWlsZWQgKCVwLCVwKS4iLCBwdHIsIGVuZCk7CiAJfQogCWlmIChjaWUgIT0gTlVMTCkgewogCQlzdGF0ZS5jaWVTdGFydCA9IHB0cjsKQEAgLTcxOSwxMyArMTA0NiwxNSBAQAogCQkJaWYgKChwdHIgKz0gYXVnU2l6ZSkgPiBlbmQpCiAJCQkJZmRlID0gTlVMTDsKIAkJfQorCQlpZighZmRlKQorCQkJZHByaW50aygxLCAiRkRFIHZhbGlkYXRpb24gZmFpbGVkICglcCwlcCkuIiwgcHRyLCBlbmQpOwogCX0KIAlpZiAoY2llID09IE5VTEwgfHwgZmRlID09IE5VTEwpIHsKICNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgogCQl1bnNpZ25lZCBsb25nIHRvcCwgYm90dG9tOwotI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorCQlpZiAoKFVOV19TUChmcmFtZSkgfCBVTldfRlAoZnJhbWUpKSAlIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCXJldHVybiAtRVBFUk07CiAJCXRvcCA9IFNUQUNLX1RPUChmcmFtZS0+dGFzayk7CiAJCWJvdHRvbSA9IFNUQUNLX0JPVFRPTShmcmFtZS0+dGFzayk7CiAjIGlmIEZSQU1FX1JFVEFERFJfT0ZGU0VUIDwgMApAQCAtNzQxLDE4ICsxMDcwLDE5IEBACiAJCSAgICAgICAgJiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIC0gMSkpKSB7CiAJCQl1bnNpZ25lZCBsb25nIGxpbms7CiAKLQkJCWlmICghX19nZXRfdXNlcihsaW5rLAorCQkJaWYgKCFwcm9iZV9rZXJuZWxfYWRkcmVzcygKIAkJCSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyAqKShVTldfRlAoZnJhbWUpCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGUkFNRV9MSU5LX09GRlNFVCkpCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGUkFNRV9MSU5LX09GRlNFVCksCisJCQkJCQkgIGxpbmspCiAjIGlmIEZSQU1FX1JFVEFERFJfT0ZGU0VUIDwgMAogCQkJICAgJiYgbGluayA+IGJvdHRvbSAmJiBsaW5rIDwgVU5XX0ZQKGZyYW1lKQogIyBlbHNlCiAJCQkgICAmJiBsaW5rID4gVU5XX0ZQKGZyYW1lKSAmJiBsaW5rIDwgYm90dG9tCiAjIGVuZGlmCiAJCQkgICAmJiAhKGxpbmsgJiAoc2l6ZW9mKGxpbmspIC0gMSkpCi0JCQkgICAmJiAhX19nZXRfdXNlcihVTldfUEMoZnJhbWUpLAorCQkJICAgJiYgIXByb2JlX2tlcm5lbF9hZGRyZXNzKAogCQkJICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgKikoVU5XX0ZQKGZyYW1lKQotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGUkFNRV9SRVRBRERSX09GRlNFVCkpKSB7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZSQU1FX1JFVEFERFJfT0ZGU0VUKSwgVU5XX1BDKGZyYW1lKSkpIHsKIAkJCQlVTldfU1AoZnJhbWUpID0gVU5XX0ZQKGZyYW1lKSArIEZSQU1FX1JFVEFERFJfT0ZGU0VUCiAjIGlmIEZSQU1FX1JFVEFERFJfT0ZGU0VUIDwgMAogCQkJCQktCkBAIC03NzUsOCArMTEwNSwxMSBAQAogCSAgIHx8IHN0YXRlLnJlZ3NbcmV0QWRkclJlZ10ud2hlcmUgPT0gTm93aGVyZQogCSAgIHx8IHN0YXRlLmNmYS5yZWcgPj0gQVJSQVlfU0laRShyZWdfaW5mbykKIAkgICB8fCByZWdfaW5mb1tzdGF0ZS5jZmEucmVnXS53aWR0aCAhPSBzaXplb2YodW5zaWduZWQgbG9uZykKLQkgICB8fCBzdGF0ZS5jZmEub2ZmcyAlIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkgICB8fCBGUkFNRV9SRUcoc3RhdGUuY2ZhLnJlZywgdW5zaWduZWQgbG9uZykgJSBzaXplb2YodW5zaWduZWQgbG9uZykKKwkgICB8fCBzdGF0ZS5jZmEub2ZmcyAlIHNpemVvZih1bnNpZ25lZCBsb25nKSkgeworCQlkcHJpbnRrKDEsICJVbnVzYWJsZSB1bndpbmQgaW5mbyAoJXAsJXApLiIsIHB0ciwgZW5kKTsKIAkJcmV0dXJuIC1FSU87CisJfQogCS8qIHVwZGF0ZSBmcmFtZSAqLwogI2lmbmRlZiBDT05GSUdfQVNfQ0ZJX1NJR05BTF9GUkFNRQogCWlmKGZyYW1lLT5jYWxsX2ZyYW1lCkBAIC03OTUsMTAgKzExMjgsMTQgQEAKICNlbHNlCiAjIGRlZmluZSBDQVNFUyBDQVNFKDgpOyBDQVNFKDE2KTsgQ0FTRSgzMik7IENBU0UoNjQpCiAjZW5kaWYKKwlwYyA9IFVOV19QQyhmcmFtZSk7CisJc3AgPSBVTldfU1AoZnJhbWUpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRlLnJlZ3MpOyArK2kpIHsKIAkJaWYgKFJFR19JTlZBTElEKGkpKSB7CiAJCQlpZiAoc3RhdGUucmVnc1tpXS53aGVyZSA9PSBOb3doZXJlKQogCQkJCWNvbnRpbnVlOworCQkJZHByaW50aygxLCAiQ2Fubm90IHJlc3RvcmUgcmVnaXN0ZXIgJXUgKCVkKS4iLAorCQkJICAgICAgICBpLCBzdGF0ZS5yZWdzW2ldLndoZXJlKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCXN3aXRjaChzdGF0ZS5yZWdzW2ldLndoZXJlKSB7CkBAIC04MDcsOCArMTE0NCwxMSBAQAogCQljYXNlIFJlZ2lzdGVyOgogCQkJaWYgKHN0YXRlLnJlZ3NbaV0udmFsdWUgPj0gQVJSQVlfU0laRShyZWdfaW5mbykKIAkJCSAgIHx8IFJFR19JTlZBTElEKHN0YXRlLnJlZ3NbaV0udmFsdWUpCi0JCQkgICB8fCByZWdfaW5mb1tpXS53aWR0aCA+IHJlZ19pbmZvW3N0YXRlLnJlZ3NbaV0udmFsdWVdLndpZHRoKQorCQkJICAgfHwgcmVnX2luZm9baV0ud2lkdGggPiByZWdfaW5mb1tzdGF0ZS5yZWdzW2ldLnZhbHVlXS53aWR0aCkgeworCQkJCWRwcmludGsoMSwgIkNhbm5vdCByZXN0b3JlIHJlZ2lzdGVyICV1IGZyb20gcmVnaXN0ZXIgJWx1LiIsCisJCQkJICAgICAgICBpLCBzdGF0ZS5yZWdzW2ldLnZhbHVlKTsKIAkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KIAkJCXN3aXRjaChyZWdfaW5mb1tzdGF0ZS5yZWdzW2ldLnZhbHVlXS53aWR0aCkgewogI2RlZmluZSBDQVNFKG4pIFwKIAkJCWNhc2Ugc2l6ZW9mKHUjI24pOiBcCkBAIC04MTgsNiArMTE1OCw5IEBACiAJCQlDQVNFUzsKICN1bmRlZiBDQVNFCiAJCQlkZWZhdWx0OgorCQkJCWRwcmludGsoMSwgIlVuc3VwcG9ydGVkIHJlZ2lzdGVyIHNpemUgJXUgKCVsdSkuIiwKKwkJCQkgICAgICAgIHJlZ19pbmZvW3N0YXRlLnJlZ3NbaV0udmFsdWVdLndpZHRoLAorCQkJCSAgICAgICAgc3RhdGUucmVnc1tpXS52YWx1ZSk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAJCQlicmVhazsKQEAgLTg0MiwxMiArMTE4NSwxNyBAQAogCQkJQ0FTRVM7CiAjdW5kZWYgQ0FTRQogCQkJZGVmYXVsdDoKKwkJCQlkcHJpbnRrKDEsICJVbnN1cHBvcnRlZCByZWdpc3RlciBzaXplICV1ICgldSkuIiwKKwkJCQkgICAgICAgIHJlZ19pbmZvW2ldLndpZHRoLCBpKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFZhbHVlOgotCQkJaWYgKHJlZ19pbmZvW2ldLndpZHRoICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCWlmIChyZWdfaW5mb1tpXS53aWR0aCAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpIHsKKwkJCQlkcHJpbnRrKDEsICJVbnN1cHBvcnRlZCB2YWx1ZSBzaXplICV1ICgldSkuIiwKKwkJCQkgICAgICAgIHJlZ19pbmZvW2ldLndpZHRoLCBpKTsKIAkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KIAkJCUZSQU1FX1JFRyhpLCB1bnNpZ25lZCBsb25nKSA9IGNmYSArIHN0YXRlLnJlZ3NbaV0udmFsdWUKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdGUuZGF0YUFsaWduOwogCQkJYnJlYWs7CkBAIC04NTksMTUgKzEyMDcsMjAgQEAKIAkJCQkgICAgJSBzaXplb2YodW5zaWduZWQgbG9uZykKIAkJCQkgICAgfHwgYWRkciA8IHN0YXJ0TG9jCiAJCQkJICAgIHx8IGFkZHIgKyBzaXplb2YodW5zaWduZWQgbG9uZykgPCBhZGRyCi0JCQkJICAgIHx8IGFkZHIgKyBzaXplb2YodW5zaWduZWQgbG9uZykgPiBlbmRMb2MpCisJCQkJICAgIHx8IGFkZHIgKyBzaXplb2YodW5zaWduZWQgbG9uZykgPiBlbmRMb2MpIHsKKwkJCQkJZHByaW50aygxLCAiQmFkIG1lbW9yeSBsb2NhdGlvbiAlbHggKCVseCkuIiwKKwkJCQkJICAgICAgICBhZGRyLCBzdGF0ZS5yZWdzW2ldLnZhbHVlKTsKIAkJCQkJcmV0dXJuIC1FSU87CisJCQkJfQogCQkJCXN3aXRjaChyZWdfaW5mb1tpXS53aWR0aCkgewogI2RlZmluZSBDQVNFKG4pICAgICBjYXNlIHNpemVvZih1IyNuKTogXAotCQkJCQlfX2dldF91c2VyKEZSQU1FX1JFRyhpLCB1IyNuKSwgKHUjI24gKilhZGRyKTsgXAorCQkJCQlwcm9iZV9rZXJuZWxfYWRkcmVzcygodSMjbiAqKWFkZHIsIEZSQU1FX1JFRyhpLCB1IyNuKSk7IFwKIAkJCQkJYnJlYWsKIAkJCQlDQVNFUzsKICN1bmRlZiBDQVNFCiAJCQkJZGVmYXVsdDoKKwkJCQkJZHByaW50aygxLCAiVW5zdXBwb3J0ZWQgbWVtb3J5IHNpemUgJXUgKCV1KS4iLAorCQkJCQkgICAgICAgIHJlZ19pbmZvW2ldLndpZHRoLCBpKTsKIAkJCQkJcmV0dXJuIC1FSU87CiAJCQkJfQogCQkJfQpAQCAtODc1LDYgKzEyMjgsMTcgQEAKIAkJfQogCX0KIAorCWlmIChVTldfUEMoZnJhbWUpICUgc3RhdGUuY29kZUFsaWduCisJICAgIHx8IFVOV19TUChmcmFtZSkgJSBzbGViMTI4YWJzKHN0YXRlLmRhdGFBbGlnbikpIHsKKwkJZHByaW50aygxLCAiT3V0cHV0IHBvaW50ZXIocykgbWlzYWxpZ25lZCAoJWx4LCVseCkuIiwKKwkJICAgICAgICBVTldfUEMoZnJhbWUpLCBVTldfU1AoZnJhbWUpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChwYyA9PSBVTldfUEMoZnJhbWUpICYmIHNwID09IFVOV19TUChmcmFtZSkpIHsKKwkJZHByaW50aygxLCAiTm8gcHJvZ3Jlc3MgKCVseCwlbHgpLiIsIHBjLCBzcCk7CisJCXJldHVybiAtRUlPOworCX0KKwogCXJldHVybiAwOwogI3VuZGVmIENBU0VTCiAjdW5kZWYgRlJBTUVfUkVHCmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuYwppbmRleCA2NDA4YzA0Li40ODY5NTYzIDEwMDY0NAotLS0gYS9rZXJuZWwvdXNlci5jCisrKyBiL2tlcm5lbC91c2VyLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNkZWZpbmUgX191aWRoYXNoZm4odWlkKQkoKCh1aWQgPj4gVUlESEFTSF9CSVRTKSArIHVpZCkgJiBVSURIQVNIX01BU0spCiAjZGVmaW5lIHVpZGhhc2hlbnRyeSh1aWQpCSh1aWRoYXNoX3RhYmxlICsgX191aWRoYXNoZm4oKHVpZCkpKQogCi1zdGF0aWMga21lbV9jYWNoZV90ICp1aWRfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp1aWRfY2FjaGVwOwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdWlkaGFzaF90YWJsZVtVSURIQVNIX1NaXTsKIAogLyoKQEAgLTEzMiw3ICsxMzIsNyBAQAogCWlmICghdXApIHsKIAkJc3RydWN0IHVzZXJfc3RydWN0ICpuZXc7CiAKLQkJbmV3ID0ga21lbV9jYWNoZV9hbGxvYyh1aWRfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJCW5ldyA9IGttZW1fY2FjaGVfYWxsb2ModWlkX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbmV3KQogCQkJcmV0dXJuIE5VTEw7CiAJCW5ldy0+dWlkID0gdWlkOwpAQCAtMTg3LDYgKzE4NywxNyBAQAogCWF0b21pY19kZWMoJm9sZF91c2VyLT5wcm9jZXNzZXMpOwogCXN3aXRjaF91aWRfa2V5cmluZyhuZXdfdXNlcik7CiAJY3VycmVudC0+dXNlciA9IG5ld191c2VyOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHN5bmNocm9uaXplIHdpdGggX19zaWdxdWV1ZV9hbGxvYygpCisJICogZG9pbmcgYSBnZXRfdWlkKHAtPnVzZXIpLi4gSWYgdGhhdCBzYXcgdGhlIG9sZAorCSAqIHVzZXIgdmFsdWUsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBoYXMgZXhpdGVkCisJICogaXRzIGNyaXRpY2FsIHJlZ2lvbiBiZWZvcmUgd2UgY2FuIGZyZWUgdGhlIG9sZAorCSAqIHN0cnVjdHVyZS4KKwkgKi8KKwlzbXBfbWIoKTsKKwlzcGluX3VubG9ja193YWl0KCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwogCWZyZWVfdWlkKG9sZF91c2VyKTsKIAlzdWlkX2tleXMoY3VycmVudCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggM2RmOWJmYy4uZGI0OTg4NiAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtMjksNiArMjksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KIAogLyoKICAqIFRoZSBwZXItQ1BVIHdvcmtxdWV1ZSAoaWYgc2luZ2xlIHRocmVhZCwgd2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QKQEAgLTU1LDYgKzU4LDggQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZDsKIAogCWludCBydW5fZGVwdGg7CQkvKiBEZXRlY3QgcnVuX3dvcmtxdWV1ZSgpIHJlY3Vyc2lvbiBkZXB0aCAqLworCisJaW50IGZyZWV6ZWFibGU7CQkvKiBGcmVlemUgdGhlIHRocmVhZCBkdXJpbmcgc3VzcGVuZCAqLwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIC8qCkBAIC04MCw2ICs4NSw5OSBAQAogCXJldHVybiBsaXN0X2VtcHR5KCZ3cS0+bGlzdCk7CiB9CiAKKy8qCisgKiBTZXQgdGhlIHdvcmtxdWV1ZSBvbiB3aGljaCBhIHdvcmsgaXRlbSBpcyB0byBiZSBydW4KKyAqIC0gTXVzdCAqb25seSogYmUgY2FsbGVkIGlmIHRoZSBwZW5kaW5nIGZsYWcgaXMgc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfd3FfZGF0YShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIHZvaWQgKndxKQoreworCXVuc2lnbmVkIGxvbmcgbmV3OworCisJQlVHX09OKCF3b3JrX3BlbmRpbmcod29yaykpOworCisJbmV3ID0gKHVuc2lnbmVkIGxvbmcpIHdxIHwgKDFVTCA8PCBXT1JLX1NUUlVDVF9QRU5ESU5HKTsKKwluZXcgfD0gd29yay0+bWFuYWdlbWVudCAmIFdPUktfU1RSVUNUX0ZMQUdfTUFTSzsKKwl3b3JrLT5tYW5hZ2VtZW50ID0gbmV3OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmdldF93cV9kYXRhKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlyZXR1cm4gKHZvaWQgKikgKHdvcmstPm1hbmFnZW1lbnQgJiBXT1JLX1NUUlVDVF9XUV9EQVRBX01BU0spOworfQorCitzdGF0aWMgaW50IF9fcnVuX3dvcmsoc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3EsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN3cS0+bG9jaywgZmxhZ3MpOworCS8qCisJICogV2UgbmVlZCB0byByZS12YWxpZGF0ZSB0aGUgd29yayBpbmZvIGFmdGVyIHdlJ3ZlIGdvdHRlbgorCSAqIHRoZSBjcHVfd29ya3F1ZXVlIGxvY2suIFdlIGNhbiBydW4gdGhlIHdvcmsgbm93IGlmZjoKKwkgKgorCSAqICAtIHRoZSB3cV9kYXRhIHN0aWxsIG1hdGNoZXMgdGhlIGNwdV93b3JrcXVldWVfc3RydWN0CisJICogIC0gQU5EIHRoZSB3b3JrIGlzIHN0aWxsIG1hcmtlZCBwZW5kaW5nCisJICogIC0gQU5EIHRoZSB3b3JrIGlzIHN0aWxsIG9uIGEgbGlzdCAod2hpY2ggd2lsbCBiZSB0aGlzCisJICogICAgd29ya3F1ZXVlX3N0cnVjdCBsaXN0KQorCSAqCisJICogQWxsIHRoZXNlIGNvbmRpdGlvbnMgYXJlIGltcG9ydGFudCwgYmVjYXVzZSB3ZQorCSAqIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoZSB3b3JrIGJlaW5nIHJ1biByaWdodAorCSAqIG5vdyBvbiBhbm90aGVyIENQVSAoYWxsIGJ1dCB0aGUgbGFzdCBvbmUgbWlnaHQgYmUKKwkgKiB0cnVlIGlmIGl0J3MgY3VycmVudGx5IHJ1bm5pbmcgYW5kIGhhcyBub3QgYmVlbgorCSAqIHJlbGVhc2VkIHlldCwgZm9yIGV4YW1wbGUpLgorCSAqLworCWlmIChnZXRfd3FfZGF0YSh3b3JrKSA9PSBjd3EKKwkgICAgJiYgd29ya19wZW5kaW5nKHdvcmspCisJICAgICYmICFsaXN0X2VtcHR5KCZ3b3JrLT5lbnRyeSkpIHsKKwkJd29ya19mdW5jX3QgZiA9IHdvcmstPmZ1bmM7CisJCWxpc3RfZGVsX2luaXQoJndvcmstPmVudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3dxLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKCF0ZXN0X2JpdChXT1JLX1NUUlVDVF9OT0FVVE9SRUwsICZ3b3JrLT5tYW5hZ2VtZW50KSkKKwkJCXdvcmtfcmVsZWFzZSh3b3JrKTsKKwkJZih3b3JrKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3dxLT5sb2NrLCBmbGFncyk7CisJCWN3cS0+cmVtb3ZlX3NlcXVlbmNlKys7CisJCXdha2VfdXAoJmN3cS0+d29ya19kb25lKTsKKwkJcmV0ID0gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3dxLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBydW5fc2NoZWR1bGVkX3dvcmsgLSBydW4gc2NoZWR1bGVkIHdvcmsgc3luY2hyb25vdXNseQorICogQHdvcms6IHdvcmsgdG8gcnVuCisgKgorICogVGhpcyBjaGVja3MgaWYgdGhlIHdvcmsgd2FzIHBlbmRpbmcsIGFuZCBydW5zIGl0CisgKiBzeW5jaHJvbm91c2x5IGlmIHNvLiBJdCByZXR1cm5zIGEgYm9vbGVhbiB0byBpbmRpY2F0ZQorICogd2hldGhlciBpdCBoYWQgYW55IHNjaGVkdWxlZCB3b3JrIHRvIHJ1biBvciBub3QuCisgKgorICogTk9URSEgVGhpcyBfb25seV8gd29ya3MgZm9yIG5vcm1hbCB3b3JrX3N0cnVjdHMuIFlvdQorICogQ0FOTk9UIHVzZSB0aGlzIGZvciBkZWxheWVkIHdvcmssIGJlY2F1c2UgdGhlIHdxIGRhdGEKKyAqIGZvciBkZWxheWVkIHdvcmsgd2lsbCBub3QgcG9pbnQgcHJvcGVybHkgdG8gdGhlIHBlci0KKyAqIENQVSB3b3JrcXVldWUgc3RydWN0LCBidXQgd2lsbCBjaGFuZ2UhCisgKi8KK2ludCBmYXN0Y2FsbCBydW5fc2NoZWR1bGVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWZvciAoOzspIHsKKwkJc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3E7CisKKwkJaWYgKCF3b3JrX3BlbmRpbmcod29yaykpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGxpc3RfZW1wdHkoJndvcmstPmVudHJ5KSkKKwkJCXJldHVybiAwOworCQkvKiBOT1RFISBUaGlzIGRlcGVuZHMgaW50aW1hdGVseSBvbiBfX3F1ZXVlX3dvcmshICovCisJCWN3cSA9IGdldF93cV9kYXRhKHdvcmspOworCQlpZiAoIWN3cSkKKwkJCXJldHVybiAwOworCQlpZiAoX19ydW5fd29yayhjd3EsIHdvcmspKQorCQkJcmV0dXJuIDE7CisJfQorfQorRVhQT1JUX1NZTUJPTChydW5fc2NoZWR1bGVkX3dvcmspOworCiAvKiBQcmVlbXB0IG11c3QgYmUgZGlzYWJsZWQuICovCiBzdGF0aWMgdm9pZCBfX3F1ZXVlX3dvcmsoc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3EsCiAJCQkgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtODcsNyArMTg1LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmN3cS0+bG9jaywgZmxhZ3MpOwotCXdvcmstPndxX2RhdGEgPSBjd3E7CisJc2V0X3dxX2RhdGEod29yaywgY3dxKTsKIAlsaXN0X2FkZF90YWlsKCZ3b3JrLT5lbnRyeSwgJmN3cS0+d29ya2xpc3QpOwogCWN3cS0+aW5zZXJ0X3NlcXVlbmNlKys7CiAJd2FrZV91cCgmY3dxLT5tb3JlX3dvcmspOwpAQCAtOTksNyArMTk3LDcgQEAKICAqIEB3cTogd29ya3F1ZXVlIHRvIHVzZQogICogQHdvcms6IHdvcmsgdG8gcXVldWUKICAqCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQuCisgKiBSZXR1cm5zIDAgaWYgQHdvcmsgd2FzIGFscmVhZHkgb24gYSBxdWV1ZSwgbm9uLXplcm8gb3RoZXJ3aXNlLgogICoKICAqIFdlIHF1ZXVlIHRoZSB3b3JrIHRvIHRoZSBDUFUgaXQgd2FzIHN1Ym1pdHRlZCwgYnV0IHRoZXJlIGlzIG5vCiAgKiBndWFyYW50ZWUgdGhhdCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGF0IENQVS4KQEAgLTEwOCw3ICsyMDYsNyBAQAogewogCWludCByZXQgPSAwLCBjcHUgPSBnZXRfY3B1KCk7CiAKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJndvcmstPnBlbmRpbmcpKSB7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFdPUktfU1RSVUNUX1BFTkRJTkcsICZ3b3JrLT5tYW5hZ2VtZW50KSkgewogCQlpZiAodW5saWtlbHkoaXNfc2luZ2xlX3RocmVhZGVkKHdxKSkpCiAJCQljcHUgPSBzaW5nbGV0aHJlYWRfY3B1OwogCQlCVUdfT04oIWxpc3RfZW1wdHkoJndvcmstPmVudHJ5KSk7CkBAIC0xMjIsMzggKzIyMCw0MiBAQAogCiBzdGF0aWMgdm9pZCBkZWxheWVkX3dvcmtfdGltZXJfZm4odW5zaWduZWQgbG9uZyBfX2RhdGEpCiB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrID0gKHN0cnVjdCB3b3JrX3N0cnVjdCAqKV9fZGF0YTsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSB3b3JrLT53cV9kYXRhOworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gKHN0cnVjdCBkZWxheWVkX3dvcmsgKilfX2RhdGE7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxID0gZ2V0X3dxX2RhdGEoJmR3b3JrLT53b3JrKTsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJaWYgKHVubGlrZWx5KGlzX3NpbmdsZV90aHJlYWRlZCh3cSkpKQogCQljcHUgPSBzaW5nbGV0aHJlYWRfY3B1OwogCi0JX19xdWV1ZV93b3JrKHBlcl9jcHVfcHRyKHdxLT5jcHVfd3EsIGNwdSksIHdvcmspOworCV9fcXVldWVfd29yayhwZXJfY3B1X3B0cih3cS0+Y3B1X3dxLCBjcHUpLCAmZHdvcmstPndvcmspOwogfQogCiAvKioKICAqIHF1ZXVlX2RlbGF5ZWRfd29yayAtIHF1ZXVlIHdvcmsgb24gYSB3b3JrcXVldWUgYWZ0ZXIgZGVsYXkKICAqIEB3cTogd29ya3F1ZXVlIHRvIHVzZQotICogQHdvcms6IHdvcmsgdG8gcXVldWUKKyAqIEB3b3JrOiBkZWxheWFibGUgd29yayB0byBxdWV1ZQogICogQGRlbGF5OiBudW1iZXIgb2YgamlmZmllcyB0byB3YWl0IGJlZm9yZSBxdWV1ZWluZwogICoKLSAqIFJldHVybnMgbm9uLXplcm8gaWYgaXQgd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZC4KKyAqIFJldHVybnMgMCBpZiBAd29yayB3YXMgYWxyZWFkeSBvbiBhIHF1ZXVlLCBub24temVybyBvdGhlcndpc2UuCiAgKi8KIGludCBmYXN0Y2FsbCBxdWV1ZV9kZWxheWVkX3dvcmsoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAotCQkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KQorCQkJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJndvcmstPnRpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9ICZkd29yay0+dGltZXI7CisJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrID0gJmR3b3JrLT53b3JrOwogCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICZ3b3JrLT5wZW5kaW5nKSkgeworCWlmIChkZWxheSA9PSAwKQorCQlyZXR1cm4gcXVldWVfd29yayh3cSwgd29yayk7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoV09SS19TVFJVQ1RfUEVORElORywgJndvcmstPm1hbmFnZW1lbnQpKSB7CiAJCUJVR19PTih0aW1lcl9wZW5kaW5nKHRpbWVyKSk7CiAJCUJVR19PTighbGlzdF9lbXB0eSgmd29yay0+ZW50cnkpKTsKIAogCQkvKiBUaGlzIHN0b3JlcyB3cSBmb3IgdGhlIG1vbWVudCwgZm9yIHRoZSB0aW1lcl9mbiAqLwotCQl3b3JrLT53cV9kYXRhID0gd3E7CisJCXNldF93cV9kYXRhKHdvcmssIHdxKTsKIAkJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgZGVsYXk7Ci0JCXRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpd29yazsKKwkJdGltZXItPmRhdGEgPSAodW5zaWduZWQgbG9uZylkd29yazsKIAkJdGltZXItPmZ1bmN0aW9uID0gZGVsYXllZF93b3JrX3RpbWVyX2ZuOwogCQlhZGRfdGltZXIodGltZXIpOwogCQlyZXQgPSAxOwpAQCAtMTY5LDIyICsyNzEsMjMgQEAKICAqIEB3b3JrOiB3b3JrIHRvIHF1ZXVlCiAgKiBAZGVsYXk6IG51bWJlciBvZiBqaWZmaWVzIHRvIHdhaXQgYmVmb3JlIHF1ZXVlaW5nCiAgKgotICogUmV0dXJucyBub24temVybyBpZiBpdCB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLgorICogUmV0dXJucyAwIGlmIEB3b3JrIHdhcyBhbHJlYWR5IG9uIGEgcXVldWUsIG5vbi16ZXJvIG90aGVyd2lzZS4KICAqLwogaW50IHF1ZXVlX2RlbGF5ZWRfd29ya19vbihpbnQgY3B1LCBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsCi0JCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCisJCQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaywgdW5zaWduZWQgbG9uZyBkZWxheSkKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSAmd29yay0+dGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJmR3b3JrLT50aW1lcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsgPSAmZHdvcmstPndvcms7CiAKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJndvcmstPnBlbmRpbmcpKSB7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFdPUktfU1RSVUNUX1BFTkRJTkcsICZ3b3JrLT5tYW5hZ2VtZW50KSkgewogCQlCVUdfT04odGltZXJfcGVuZGluZyh0aW1lcikpOwogCQlCVUdfT04oIWxpc3RfZW1wdHkoJndvcmstPmVudHJ5KSk7CiAKIAkJLyogVGhpcyBzdG9yZXMgd3EgZm9yIHRoZSBtb21lbnQsIGZvciB0aGUgdGltZXJfZm4gKi8KLQkJd29yay0+d3FfZGF0YSA9IHdxOworCQlzZXRfd3FfZGF0YSh3b3JrLCB3cSk7CiAJCXRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIGRlbGF5OwotCQl0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKXdvcms7CisJCXRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZHdvcms7CiAJCXRpbWVyLT5mdW5jdGlvbiA9IGRlbGF5ZWRfd29ya190aW1lcl9mbjsKIAkJYWRkX3RpbWVyX29uKHRpbWVyLCBjcHUpOwogCQlyZXQgPSAxOwpAQCAtMjEyLDE1ICszMTUsMjYgQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmN3cS0+d29ya2xpc3QpKSB7CiAJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9IGxpc3RfZW50cnkoY3dxLT53b3JrbGlzdC5uZXh0LAogCQkJCQkJc3RydWN0IHdvcmtfc3RydWN0LCBlbnRyeSk7Ci0JCXZvaWQgKCpmKSAodm9pZCAqKSA9IHdvcmstPmZ1bmM7Ci0JCXZvaWQgKmRhdGEgPSB3b3JrLT5kYXRhOworCQl3b3JrX2Z1bmNfdCBmID0gd29yay0+ZnVuYzsKIAogCQlsaXN0X2RlbF9pbml0KGN3cS0+d29ya2xpc3QubmV4dCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN3cS0+bG9jaywgZmxhZ3MpOwogCi0JCUJVR19PTih3b3JrLT53cV9kYXRhICE9IGN3cSk7Ci0JCWNsZWFyX2JpdCgwLCAmd29yay0+cGVuZGluZyk7Ci0JCWYoZGF0YSk7CisJCUJVR19PTihnZXRfd3FfZGF0YSh3b3JrKSAhPSBjd3EpOworCQlpZiAoIXRlc3RfYml0KFdPUktfU1RSVUNUX05PQVVUT1JFTCwgJndvcmstPm1hbmFnZW1lbnQpKQorCQkJd29ya19yZWxlYXNlKHdvcmspOworCQlmKHdvcmspOworCisJCWlmICh1bmxpa2VseShpbl9hdG9taWMoKSB8fCBsb2NrZGVwX2RlcHRoKGN1cnJlbnQpID4gMCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQlVHOiB3b3JrcXVldWUgbGVha2VkIGxvY2sgb3IgYXRvbWljOiAiCisJCQkJCSIlcy8weCUwOHgvJWRcbiIsCisJCQkJCWN1cnJlbnQtPmNvbW0sIHByZWVtcHRfY291bnQoKSwKKwkJCQkgICAgICAgCWN1cnJlbnQtPnBpZCk7CisJCQlwcmludGsoS0VSTl9FUlIgIiAgICBsYXN0IGZ1bmN0aW9uOiAiKTsKKwkJCXByaW50X3N5bWJvbCgiJXNcbiIsICh1bnNpZ25lZCBsb25nKWYpOworCQkJZGVidWdfc2hvd19oZWxkX2xvY2tzKGN1cnJlbnQpOworCQkJZHVtcF9zdGFjaygpOworCQl9CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmN3cS0+bG9jaywgZmxhZ3MpOwogCQljd3EtPnJlbW92ZV9zZXF1ZW5jZSsrOwpAQCAtMjM3LDcgKzM1MSw4IEBACiAJc3RydWN0IGtfc2lnYWN0aW9uIHNhOwogCXNpZ3NldF90IGJsb2NrZWQ7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKwlpZiAoIWN3cS0+ZnJlZXplYWJsZSkKKwkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC01KTsKIApAQCAtMjYwLDYgKzM3NSw5IEBACiAKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWlmIChjd3EtPmZyZWV6ZWFibGUpCisJCQl0cnlfdG9fZnJlZXplKCk7CisKIAkJYWRkX3dhaXRfcXVldWUoJmN3cS0+bW9yZV93b3JrLCAmd2FpdCk7CiAJCWlmIChsaXN0X2VtcHR5KCZjd3EtPndvcmtsaXN0KSkKIAkJCXNjaGVkdWxlKCk7CkBAIC0zMzYsNyArNDU0LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGZsdXNoX3dvcmtxdWV1ZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNyZWF0ZV93b3JrcXVldWVfdGhyZWFkKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKLQkJCQkJCSAgIGludCBjcHUpCisJCQkJCQkgICBpbnQgY3B1LCBpbnQgZnJlZXplYWJsZSkKIHsKIAlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSA9IHBlcl9jcHVfcHRyKHdxLT5jcHVfd3EsIGNwdSk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwpAQCAtMzQ2LDYgKzQ2NCw3IEBACiAJY3dxLT50aHJlYWQgPSBOVUxMOwogCWN3cS0+aW5zZXJ0X3NlcXVlbmNlID0gMDsKIAljd3EtPnJlbW92ZV9zZXF1ZW5jZSA9IDA7CisJY3dxLT5mcmVlemVhYmxlID0gZnJlZXplYWJsZTsKIAlJTklUX0xJU1RfSEVBRCgmY3dxLT53b3JrbGlzdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY3dxLT5tb3JlX3dvcmspOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN3cS0+d29ya19kb25lKTsKQEAgLTM2MSw3ICs0ODAsNyBAQAogfQogCiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqX19jcmVhdGVfd29ya3F1ZXVlKGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICBpbnQgc2luZ2xldGhyZWFkKQorCQkJCQkgICAgaW50IHNpbmdsZXRocmVhZCwgaW50IGZyZWV6ZWFibGUpCiB7CiAJaW50IGNwdSwgZGVzdHJveSA9IDA7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwpAQCAtMzgxLDcgKzUwMCw3IEBACiAJbXV0ZXhfbG9jaygmd29ya3F1ZXVlX211dGV4KTsKIAlpZiAoc2luZ2xldGhyZWFkKSB7CiAJCUlOSVRfTElTVF9IRUFEKCZ3cS0+bGlzdCk7Ci0JCXAgPSBjcmVhdGVfd29ya3F1ZXVlX3RocmVhZCh3cSwgc2luZ2xldGhyZWFkX2NwdSk7CisJCXAgPSBjcmVhdGVfd29ya3F1ZXVlX3RocmVhZCh3cSwgc2luZ2xldGhyZWFkX2NwdSwgZnJlZXplYWJsZSk7CiAJCWlmICghcCkKIAkJCWRlc3Ryb3kgPSAxOwogCQllbHNlCkBAIC0zODksNyArNTA4LDcgQEAKIAl9IGVsc2UgewogCQlsaXN0X2FkZCgmd3EtPmxpc3QsICZ3b3JrcXVldWVzKTsKIAkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJCXAgPSBjcmVhdGVfd29ya3F1ZXVlX3RocmVhZCh3cSwgY3B1KTsKKwkJCXAgPSBjcmVhdGVfd29ya3F1ZXVlX3RocmVhZCh3cSwgY3B1LCBmcmVlemVhYmxlKTsKIAkJCWlmIChwKSB7CiAJCQkJa3RocmVhZF9iaW5kKHAsIGNwdSk7CiAJCQkJd2FrZV91cF9wcm9jZXNzKHApOwpAQCAtNDY4LDM4ICs1ODcsMzcgQEAKIAogLyoqCiAgKiBzY2hlZHVsZV9kZWxheWVkX3dvcmsgLSBwdXQgd29yayB0YXNrIGluIGdsb2JhbCB3b3JrcXVldWUgYWZ0ZXIgZGVsYXkKLSAqIEB3b3JrOiBqb2IgdG8gYmUgZG9uZQotICogQGRlbGF5OiBudW1iZXIgb2YgamlmZmllcyB0byB3YWl0CisgKiBAZHdvcms6IGpvYiB0byBiZSBkb25lCisgKiBAZGVsYXk6IG51bWJlciBvZiBqaWZmaWVzIHRvIHdhaXQgb3IgMCBmb3IgaW1tZWRpYXRlIGV4ZWN1dGlvbgogICoKICAqIEFmdGVyIHdhaXRpbmcgZm9yIGEgZ2l2ZW4gdGltZSB0aGlzIHB1dHMgYSBqb2IgaW4gdGhlIGtlcm5lbC1nbG9iYWwKICAqIHdvcmtxdWV1ZS4KICAqLwotaW50IGZhc3RjYWxsIHNjaGVkdWxlX2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCitpbnQgZmFzdGNhbGwgc2NoZWR1bGVfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KQogewotCXJldHVybiBxdWV1ZV9kZWxheWVkX3dvcmsoa2V2ZW50ZF93cSwgd29yaywgZGVsYXkpOworCXJldHVybiBxdWV1ZV9kZWxheWVkX3dvcmsoa2V2ZW50ZF93cSwgZHdvcmssIGRlbGF5KTsKIH0KIEVYUE9SVF9TWU1CT0woc2NoZWR1bGVfZGVsYXllZF93b3JrKTsKIAogLyoqCiAgKiBzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24gLSBxdWV1ZSB3b3JrIGluIGdsb2JhbCB3b3JrcXVldWUgb24gQ1BVIGFmdGVyIGRlbGF5CiAgKiBAY3B1OiBjcHUgdG8gdXNlCi0gKiBAd29yazogam9iIHRvIGJlIGRvbmUKKyAqIEBkd29yazogam9iIHRvIGJlIGRvbmUKICAqIEBkZWxheTogbnVtYmVyIG9mIGppZmZpZXMgdG8gd2FpdAogICoKICAqIEFmdGVyIHdhaXRpbmcgZm9yIGEgZ2l2ZW4gdGltZSB0aGlzIHB1dHMgYSBqb2IgaW4gdGhlIGtlcm5lbC1nbG9iYWwKICAqIHdvcmtxdWV1ZSBvbiB0aGUgc3BlY2lmaWVkIENQVS4KICAqLwogaW50IHNjaGVkdWxlX2RlbGF5ZWRfd29ya19vbihpbnQgY3B1LAotCQkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KQorCQkJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7Ci0JcmV0dXJuIHF1ZXVlX2RlbGF5ZWRfd29ya19vbihjcHUsIGtldmVudGRfd3EsIHdvcmssIGRlbGF5KTsKKwlyZXR1cm4gcXVldWVfZGVsYXllZF93b3JrX29uKGNwdSwga2V2ZW50ZF93cSwgZHdvcmssIGRlbGF5KTsKIH0KIEVYUE9SVF9TWU1CT0woc2NoZWR1bGVfZGVsYXllZF93b3JrX29uKTsKIAogLyoqCiAgKiBzY2hlZHVsZV9vbl9lYWNoX2NwdSAtIGNhbGwgYSBmdW5jdGlvbiBvbiBlYWNoIG9ubGluZSBDUFUgZnJvbSBrZXZlbnRkCiAgKiBAZnVuYzogdGhlIGZ1bmN0aW9uIHRvIGNhbGwKLSAqIEBpbmZvOiBhIHBvaW50ZXIgdG8gcGFzcyB0byBmdW5jKCkKICAqCiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4KICAqIFJldHVybnMgLXZlIGVycm5vIG9uIGZhaWx1cmUuCkBAIC01MDgsNyArNjI2LDcgQEAKICAqCiAgKiBzY2hlZHVsZV9vbl9lYWNoX2NwdSgpIGlzIHZlcnkgc2xvdy4KICAqLwotaW50IHNjaGVkdWxlX29uX2VhY2hfY3B1KHZvaWQgKCpmdW5jKSh2b2lkICppbmZvKSwgdm9pZCAqaW5mbykKK2ludCBzY2hlZHVsZV9vbl9lYWNoX2NwdSh3b3JrX2Z1bmNfdCBmdW5jKQogewogCWludCBjcHU7CiAJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrczsKQEAgLTUxOSw3ICs2MzcsNyBAQAogCiAJbXV0ZXhfbG9jaygmd29ya3F1ZXVlX211dGV4KTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlJTklUX1dPUksocGVyX2NwdV9wdHIod29ya3MsIGNwdSksIGZ1bmMsIGluZm8pOworCQlJTklUX1dPUksocGVyX2NwdV9wdHIod29ya3MsIGNwdSksIGZ1bmMpOwogCQlfX3F1ZXVlX3dvcmsocGVyX2NwdV9wdHIoa2V2ZW50ZF93cS0+Y3B1X3dxLCBjcHUpLAogCQkJCXBlcl9jcHVfcHRyKHdvcmtzLCBjcHUpKTsKIAl9CkBAIC01MzksMTIgKzY1NywxMiBAQAogICogY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29ya3F1ZXVlIC0gcmVsaWFibHkga2lsbCBvZmYgYSBkZWxheWVkCiAgKgkJCXdvcmsgd2hvc2UgaGFuZGxlciByZWFybXMgdGhlIGRlbGF5ZWQgd29yay4KICAqIEB3cTogICB0aGUgY29udHJvbGxpbmcgd29ya3F1ZXVlIHN0cnVjdHVyZQotICogQHdvcms6IHRoZSBkZWxheWVkIHdvcmsgc3RydWN0CisgKiBAZHdvcms6IHRoZSBkZWxheWVkIHdvcmsgc3RydWN0CiAgKi8KIHZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29ya3F1ZXVlKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKLQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorCQkJCSAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKIHsKLQl3aGlsZSAoIWNhbmNlbF9kZWxheWVkX3dvcmsod29yaykpCisJd2hpbGUgKCFjYW5jZWxfZGVsYXllZF93b3JrKGR3b3JrKSkKIAkJZmx1c2hfd29ya3F1ZXVlKHdxKTsKIH0KIEVYUE9SVF9TWU1CT0woY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29ya3F1ZXVlKTsKQEAgLTU1MiwxOCArNjcwLDE3IEBACiAvKioKICAqIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsgLSByZWxpYWJseSBraWxsIG9mZiBhIGRlbGF5ZWQga2V2ZW50ZAogICoJCQl3b3JrIHdob3NlIGhhbmRsZXIgcmVhcm1zIHRoZSBkZWxheWVkIHdvcmsuCi0gKiBAd29yazogdGhlIGRlbGF5ZWQgd29yayBzdHJ1Y3QKKyAqIEBkd29yazogdGhlIGRlbGF5ZWQgd29yayBzdHJ1Y3QKICAqLwotdm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3ZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKIHsKLQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrcXVldWUoa2V2ZW50ZF93cSwgd29yayk7CisJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29ya3F1ZXVlKGtldmVudGRfd3EsIGR3b3JrKTsKIH0KIEVYUE9SVF9TWU1CT0woY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayk7CiAKIC8qKgogICogZXhlY3V0ZV9pbl9wcm9jZXNzX2NvbnRleHQgLSByZWxpYWJseSBleGVjdXRlIHRoZSByb3V0aW5lIHdpdGggdXNlciBjb250ZXh0CiAgKiBAZm46CQl0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZQotICogQGRhdGE6CWRhdGEgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KICAqIEBldzoJCWd1YXJhbnRlZWQgc3RvcmFnZSBmb3IgdGhlIGV4ZWN1dGUgd29yayBzdHJ1Y3R1cmUgKG11c3QKICAqCQliZSBhdmFpbGFibGUgd2hlbiB0aGUgd29yayBleGVjdXRlcykKICAqCkBAIC01NzMsMTUgKzY5MCwxNCBAQAogICogUmV0dXJuczoJMCAtIGZ1bmN0aW9uIHdhcyBleGVjdXRlZAogICoJCTEgLSBmdW5jdGlvbiB3YXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24KICAqLwotaW50IGV4ZWN1dGVfaW5fcHJvY2Vzc19jb250ZXh0KHZvaWQgKCpmbikodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEsCi0JCQkgICAgICAgc3RydWN0IGV4ZWN1dGVfd29yayAqZXcpCitpbnQgZXhlY3V0ZV9pbl9wcm9jZXNzX2NvbnRleHQod29ya19mdW5jX3QgZm4sIHN0cnVjdCBleGVjdXRlX3dvcmsgKmV3KQogewogCWlmICghaW5faW50ZXJydXB0KCkpIHsKLQkJZm4oZGF0YSk7CisJCWZuKCZldy0+d29yayk7CiAJCXJldHVybiAwOwogCX0KIAotCUlOSVRfV09SSygmZXctPndvcmssIGZuLCBkYXRhKTsKKwlJTklUX1dPUksoJmV3LT53b3JrLCBmbik7CiAJc2NoZWR1bGVfd29yaygmZXctPndvcmspOwogCiAJcmV0dXJuIDE7CkBAIC02MDksNyArNzI1LDYgQEAKIAogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAvKiBUYWtlIHRoZSB3b3JrIGZyb20gdGhpcyAoZG93bmVkKSBDUFUuICovCiBzdGF0aWMgdm9pZCB0YWtlX292ZXJfd29yayhzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsIHVuc2lnbmVkIGludCBjcHUpCiB7CkBAIC02NDIsNyArNzU3LDcgQEAKIAkJbXV0ZXhfbG9jaygmd29ya3F1ZXVlX211dGV4KTsKIAkJLyogQ3JlYXRlIGEgbmV3IHdvcmtxdWV1ZSB0aHJlYWQgZm9yIGl0LiAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdxLCAmd29ya3F1ZXVlcywgbGlzdCkgewotCQkJaWYgKCFjcmVhdGVfd29ya3F1ZXVlX3RocmVhZCh3cSwgaG90Y3B1KSkgeworCQkJaWYgKCFjcmVhdGVfd29ya3F1ZXVlX3RocmVhZCh3cSwgaG90Y3B1LCAwKSkgewogCQkJCXByaW50aygid29ya3F1ZXVlIGZvciAlaSBmYWlsZWRcbiIsIGhvdGNwdSk7CiAJCQkJcmV0dXJuIE5PVElGWV9CQUQ7CiAJCQl9CkBAIC02OTIsNyArODA3LDYgQEAKIAogCXJldHVybiBOT1RJRllfT0s7CiB9Ci0jZW5kaWYKIAogdm9pZCBpbml0X3dvcmtxdWV1ZXModm9pZCkKIHsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnIGIvbGliL0tjb25maWcKaW5kZXggNzM0Y2U5NS4uOWIwMzU4MSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcKKysrIGIvbGliL0tjb25maWcKQEAgLTQsNiArNCw5IEBACiAKIG1lbnUgIkxpYnJhcnkgcm91dGluZXMiCiAKK2NvbmZpZyBCSVRSRVZFUlNFCisJdHJpc3RhdGUKKwogY29uZmlnIENSQ19DQ0lUVAogCXRyaXN0YXRlICJDUkMtQ0NJVFQgZnVuY3Rpb25zIgogCWhlbHAKQEAgLTIzLDYgKzI2LDcgQEAKIGNvbmZpZyBDUkMzMgogCXRyaXN0YXRlICJDUkMzMiBmdW5jdGlvbnMiCiAJZGVmYXVsdCB5CisJc2VsZWN0IEJJVFJFVkVSU0UKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBpcyBwcm92aWRlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgbm8gaW4ta2VybmVsLXRyZWUKIAkgIG1vZHVsZXMgcmVxdWlyZSBDUkMzMiBmdW5jdGlvbnMsIGJ1dCBhIG1vZHVsZSBidWlsdCBvdXRzaWRlIHRoZQpAQCAtOTcsNCArMTAxLDkgQEAKIGNvbmZpZyBQTElTVAogCWJvb2xlYW4KIAorY29uZmlnIElPTUFQX0NPUFkKKwlib29sZWFuCisJZGVwZW5kcyBvbiAhVU1MCisJZGVmYXVsdCB5CisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggNzc0OTFlMy4uODE4ZTQ1OCAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTEsNiArMSw3IEBACiAKIGNvbmZpZyBQUklOVEtfVElNRQogCWJvb2wgIlNob3cgdGltaW5nIGluZm9ybWF0aW9uIG9uIHByaW50a3MiCisJZGVwZW5kcyBvbiBQUklOVEsKIAloZWxwCiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gY2F1c2VzIHRpbWluZyBpbmZvcm1hdGlvbiB0byBiZQogCSAgaW5jbHVkZWQgaW4gcHJpbnRrIG91dHB1dC4gIFRoaXMgYWxsb3dzIHlvdSB0byBtZWFzdXJlCkBAIC00Niw2ICs0NywzMCBAQAogCSAgeW91IHJlYWxseSBuZWVkIGl0LCBhbmQgd2hhdCB0aGUgbWVyZ2UgcGxhbiB0byB0aGUgbWFpbmxpbmUga2VybmVsIGZvcgogCSAgeW91ciBtb2R1bGUgaXMuCiAKK2NvbmZpZyBERUJVR19GUworCWJvb2wgIkRlYnVnIEZpbGVzeXN0ZW0iCisJZGVwZW5kcyBvbiBTWVNGUworCWhlbHAKKwkgIGRlYnVnZnMgaXMgYSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRoYXQga2VybmVsIGRldmVsb3BlcnMgdXNlIHRvIHB1dAorCSAgZGVidWdnaW5nIGZpbGVzIGludG8uICBFbmFibGUgdGhpcyBvcHRpb24gdG8gYmUgYWJsZSB0byByZWFkIGFuZAorCSAgd3JpdGUgdG8gdGhlc2UgZmlsZXMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRUFERVJTX0NIRUNLCisJYm9vbCAiUnVuICdtYWtlIGhlYWRlcnNfY2hlY2snIHdoZW4gYnVpbGRpbmcgdm1saW51eCIKKwlkZXBlbmRzIG9uICFVTUwKKwloZWxwCisJICBUaGlzIG9wdGlvbiB3aWxsIGV4dHJhY3QgdGhlIHVzZXItdmlzaWJsZSBrZXJuZWwgaGVhZGVycyB3aGVuZXZlcgorCSAgYnVpbGRpbmcgdGhlIGtlcm5lbCwgYW5kIHdpbGwgcnVuIGJhc2ljIHNhbml0eSBjaGVja3Mgb24gdGhlbSB0bworCSAgZW5zdXJlIHRoYXQgZXhwb3J0ZWQgZmlsZXMgZG8gbm90IGF0dGVtcHQgdG8gaW5jbHVkZSBmaWxlcyB3aGljaAorCSAgd2VyZSBub3QgZXhwb3J0ZWQsIGV0Yy4KKworCSAgSWYgeW91J3JlIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGhlYWRlciBmaWxlcyB3aGljaCBhcmUKKwkgIHJlbGV2YW50IGZvciB1c2Vyc3BhY2UsIHNheSAnWScsIGFuZCBjaGVjayB0aGUgaGVhZGVycworCSAgZXhwb3J0ZWQgdG8gJChJTlNUQUxMX0hEUl9QQVRIKSAodXN1YWxseSAndXNyL2luY2x1ZGUnIGluCisJICB5b3VyIGJ1aWxkIHRyZWUpLCB0byBtYWtlIHN1cmUgdGhleSdyZSBzdWl0YWJsZS4KKwogY29uZmlnIERFQlVHX0tFUk5FTAogCWJvb2wgIktlcm5lbCBkZWJ1Z2dpbmciCiAJaGVscApAQCAtMjg0LDcgKzMwOSw3IEBACiBjb25maWcgREVCVUdfQlVHVkVSQk9TRQogCWJvb2wgIlZlcmJvc2UgQlVHKCkgcmVwb3J0aW5nIChhZGRzIDcwSykiIGlmIERFQlVHX0tFUk5FTCAmJiBFTUJFRERFRAogCWRlcGVuZHMgb24gQlVHCi0JZGVwZW5kcyBvbiBBUk0gfHwgQVJNMjYgfHwgQVZSMzIgfHwgTTMyUiB8fCBNNjhLIHx8IFNQQVJDMzIgfHwgU1BBUkM2NCB8fCBYODZfMzIgfHwgRlJWIHx8IFNVUEVSSAorCWRlcGVuZHMgb24gQVJNIHx8IEFSTTI2IHx8IEFWUjMyIHx8IE0zMlIgfHwgTTY4SyB8fCBTUEFSQzMyIHx8IFNQQVJDNjQgfHwgRlJWIHx8IFNVUEVSSCB8fCBHRU5FUklDX0JVRwogCWRlZmF1bHQgIUVNQkVEREVECiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBtYWtlIEJVRygpIHBhbmljcyBvdXRwdXQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKQEAgLTMwMSwxNiArMzI2LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIERFQlVHX0ZTCi0JYm9vbCAiRGVidWcgRmlsZXN5c3RlbSIKLQlkZXBlbmRzIG9uIFNZU0ZTCi0JaGVscAotCSAgZGVidWdmcyBpcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyB1c2UgdG8gcHV0Ci0JICBkZWJ1Z2dpbmcgZmlsZXMgaW50by4gIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBiZSBhYmxlIHRvIHJlYWQgYW5kCi0JICB3cml0ZSB0byB0aGVzZSBmaWxlcy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIERFQlVHX1ZNCiAJYm9vbCAiRGVidWcgVk0iCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTM0MSw3ICszNTYsNyBAQAogCiBjb25maWcgVU5XSU5EX0lORk8KIAlib29sICJDb21waWxlIHRoZSBrZXJuZWwgd2l0aCBmcmFtZSB1bndpbmQgaW5mb3JtYXRpb24iCi0JZGVwZW5kcyBvbiAhSUE2NCAmJiAhUEFSSVNDCisJZGVwZW5kcyBvbiAhSUE2NCAmJiAhUEFSSVNDICYmICFBUk0KIAlkZXBlbmRzIG9uICFNT0RVTEVTIHx8ICEoTUlQUyB8fCBQUEMgfHwgU1VQRVJIIHx8IFY4NTApCiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUgdGhlIHJlc3VsdGluZyBrZXJuZWwgaW1hZ2Ugd2lsbCBiZSBzbGlnaHRseSBsYXJnZXIKQEAgLTM3MSwyMCArMzg2LDYgQEAKIAkgIGJlY29tZSB0aGUgZGVmYXVsdCBpbiB0aGUgZnV0dXJlLCB1bnRpbCB0aGVuIHRoaXMgb3B0aW9uIGlzIHRoZXJlIHRvCiAJICB0ZXN0IGdjYyBmb3IgdGhpcy4KIAotY29uZmlnIEhFQURFUlNfQ0hFQ0sKLQlib29sICJSdW4gJ21ha2UgaGVhZGVyc19jaGVjaycgd2hlbiBidWlsZGluZyB2bWxpbnV4IgotCWRlcGVuZHMgb24gIVVNTAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHdpbGwgZXh0cmFjdCB0aGUgdXNlci12aXNpYmxlIGtlcm5lbCBoZWFkZXJzIHdoZW5ldmVyCi0JICBidWlsZGluZyB0aGUga2VybmVsLCBhbmQgd2lsbCBydW4gYmFzaWMgc2FuaXR5IGNoZWNrcyBvbiB0aGVtIHRvCi0JICBlbnN1cmUgdGhhdCBleHBvcnRlZCBmaWxlcyBkbyBub3QgYXR0ZW1wdCB0byBpbmNsdWRlIGZpbGVzIHdoaWNoCi0JICB3ZXJlIG5vdCBleHBvcnRlZCwgZXRjLgotCi0JICBJZiB5b3UncmUgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaGVhZGVyIGZpbGVzIHdoaWNoIGFyZQotCSAgcmVsZXZhbnQgZm9yIHVzZXJzcGFjZSwgc2F5ICdZJywgYW5kIGNoZWNrIHRoZSBoZWFkZXJzCi0JICBleHBvcnRlZCB0byAkKElOU1RBTExfSERSX1BBVEgpICh1c3VhbGx5ICd1c3IvaW5jbHVkZScgaW4KLQkgIHlvdXIgYnVpbGQgdHJlZSksIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIHN1aXRhYmxlLgotCiBjb25maWcgUkNVX1RPUlRVUkVfVEVTVAogCXRyaXN0YXRlICJ0b3J0dXJlIHRlc3RzIGZvciBSQ1UiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTQwMSw2ICs0MDIsNyBAQAogCiBjb25maWcgTEtEVE0KIAl0cmlzdGF0ZSAiTGludXggS2VybmVsIER1bXAgVGVzdCBUb29sIE1vZHVsZSIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAogCWRlcGVuZHMgb24gS1BST0JFUwogCWRlZmF1bHQgbgogCWhlbHAKQEAgLTQxMiwzICs0MTQsMzYgQEAKIAogCURvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGUgbW9kdWxlIGNhbiBiZSBmb3VuZCBpbgogCWRyaXZlcnMvbWlzYy9sa2R0bS5jCisKK2NvbmZpZyBGQVVMVF9JTkpFQ1RJT04KKwlib29sICJGYXVsdC1pbmplY3Rpb24gZnJhbWV3b3JrIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJZGVwZW5kcyBvbiBTVEFDS1RSQUNFCisJc2VsZWN0IEZSQU1FX1BPSU5URVIKKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBmcmFtZXdvcmsuCisJICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vLgorCitjb25maWcgRkFJTFNMQUIKKwlib29sICJGYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3Iga21hbGxvYyIKKwlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTgorCWhlbHAKKwkgIFByb3ZpZGUgZmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdHkgZm9yIGttYWxsb2MuCisKK2NvbmZpZyBGQUlMX1BBR0VfQUxMT0MKKwlib29sICJGYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0aXkgZm9yIGFsbG9jX3BhZ2VzKCkiCisJZGVwZW5kcyBvbiBGQVVMVF9JTkpFQ1RJT04KKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBhbGxvY19wYWdlcygpLgorCitjb25maWcgRkFJTF9NQUtFX1JFUVVFU1QKKwlib29sICJGYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3IgZGlzayBJTyIKKwlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTgorCWhlbHAKKwkgIFByb3ZpZGUgZmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdHkgZm9yIGRpc2sgSU8uCisKK2NvbmZpZyBGQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKKwlib29sICJEZWJ1Z2ZzIGVudHJpZXMgZm9yIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXRpZXMiCisJZGVwZW5kcyBvbiBGQVVMVF9JTkpFQ1RJT04gJiYgU1lTRlMgJiYgREVCVUdfRlMKKwloZWxwCisJICBFbmFibGUgY29uZmlndXJhdGlvbiBvZiBmYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0aWVzIHZpYSBkZWJ1Z2ZzLgpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IDU5MDcwZGIuLjc3YjRiYWQgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTUsMjcgKzUsMjggQEAKIGxpYi15IDo9IGN0eXBlLm8gc3RyaW5nLm8gdnNwcmludGYubyBjbWRsaW5lLm8gXAogCSBidXN0X3NwaW5sb2Nrcy5vIHJidHJlZS5vIHJhZGl4LXRyZWUubyBkdW1wX3N0YWNrLm8gXAogCSBpZHIubyBkaXY2NC5vIGludF9zcXJ0Lm8gYml0bWFwLm8gZXh0YWJsZS5vIHByaW9fdHJlZS5vIFwKLQkgc2hhMS5vIGlycV9yZWdzLm8gY2FydGFfcmFuZG9tMzIubworCSBzaGExLm8gaXJxX3JlZ3MubyByZWNpcHJvY2FsX2Rpdi5vCiAKIGxpYi0kKENPTkZJR19NTVUpICs9IGlvcmVtYXAubwogbGliLSQoQ09ORklHX1NNUCkgKz0gY3B1bWFzay5vCiAKIGxpYi15CSs9IGtvYmplY3QubyBrcmVmLm8ga29iamVjdF91ZXZlbnQubyBrbGlzdC5vCiAKLW9iai15ICs9IHNvcnQubyBwYXJzZXIubyBoYWxmbWQ0Lm8gaW9tYXBfY29weS5vIGRlYnVnX2xvY2tzLm8KK29iai15ICs9IHNvcnQubyBwYXJzZXIubyBoYWxmbWQ0Lm8gZGVidWdfbG9ja3MubyByYW5kb20zMi5vCiAKIGlmZXEgKCQoQ09ORklHX0RFQlVHX0tPQkpFQ1QpLHkpCiBDRkxBR1Nfa29iamVjdC5vICs9IC1EREVCVUcKIENGTEFHU19rb2JqZWN0X3VldmVudC5vICs9IC1EREVCVUcKIGVuZGlmCiAKK29iai0kKENPTkZJR19JT01BUF9DT1BZKSArPSBpb21hcF9jb3B5Lm8KIG9iai0kKENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMpICs9IGxvY2tpbmctc2VsZnRlc3Qubwogb2JqLSQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKSArPSBzcGlubG9ja19kZWJ1Zy5vCiBsaWItJChDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSykgKz0gcndzZW0tc3BpbmxvY2subwogbGliLSQoQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNKSArPSByd3NlbS5vCiBsaWItJChDT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTKSArPSBzZW1hcGhvcmUtc2xlZXBlcnMubwogbGliLSQoQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVCkgKz0gZmluZF9uZXh0X2JpdC5vCi1saWItJChDT05GSUdfR0VORVJJQ19IV0VJR0hUKSArPSBod2VpZ2h0Lm8KK29iai0kKENPTkZJR19HRU5FUklDX0hXRUlHSFQpICs9IGh3ZWlnaHQubwogb2JqLSQoQ09ORklHX0xPQ0tfS0VSTkVMKSArPSBrZXJuZWxfbG9jay5vCiBvYmotJChDT05GSUdfUExJU1QpICs9IHBsaXN0Lm8KIG9iai0kKENPTkZJR19ERUJVR19QUkVFTVBUKSArPSBzbXBfcHJvY2Vzc29yX2lkLm8KQEAgLTM1LDYgKzM2LDcgQEAKICAgbGliLXkgKz0gZGVjX2FuZF9sb2NrLm8KIGVuZGlmCiAKK29iai0kKENPTkZJR19CSVRSRVZFUlNFKSArPSBiaXRyZXYubwogb2JqLSQoQ09ORklHX0NSQ19DQ0lUVCkJKz0gY3JjLWNjaXR0Lm8KIG9iai0kKENPTkZJR19DUkMxNikJKz0gY3JjMTYubwogb2JqLSQoQ09ORklHX0NSQzMyKQkrPSBjcmMzMi5vCkBAIC01NCw2ICs1Niw5IEBACiBvYmotJChDT05GSUdfQVVESVRfR0VORVJJQykgKz0gYXVkaXQubwogCiBvYmotJChDT05GSUdfU1dJT1RMQikgKz0gc3dpb3RsYi5vCitvYmotJChDT05GSUdfRkFVTFRfSU5KRUNUSU9OKSArPSBmYXVsdC1pbmplY3QubworCitsaWItJChDT05GSUdfR0VORVJJQ19CVUcpICs9IGJ1Zy5vCiAKIGhvc3Rwcm9ncy15CTo9IGdlbl9jcmMzMnRhYmxlCiBjbGVhbi1maWxlcwk6PSBjcmMzMnRhYmxlLmgKZGlmZiAtLWdpdCBhL2xpYi9iaXRyZXYuYyBiL2xpYi9iaXRyZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODlhZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2JpdHJldi5jCkBAIC0wLDAgKzEsNTggQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgorCitNT0RVTEVfQVVUSE9SKCJBa2lub2J1IE1pdGEgPGFraW5vYnUubWl0YUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJpdCBvcmRlcmluZyByZXZlcnNhbCBmdW5jdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworY29uc3QgdTggYnl0ZV9yZXZfdGFibGVbMjU2XSA9IHsKKwkweDAwLCAweDgwLCAweDQwLCAweGMwLCAweDIwLCAweGEwLCAweDYwLCAweGUwLAorCTB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsCisJMHgwOCwgMHg4OCwgMHg0OCwgMHhjOCwgMHgyOCwgMHhhOCwgMHg2OCwgMHhlOCwKKwkweDE4LCAweDk4LCAweDU4LCAweGQ4LCAweDM4LCAweGI4LCAweDc4LCAweGY4LAorCTB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsCisJMHgxNCwgMHg5NCwgMHg1NCwgMHhkNCwgMHgzNCwgMHhiNCwgMHg3NCwgMHhmNCwKKwkweDBjLCAweDhjLCAweDRjLCAweGNjLCAweDJjLCAweGFjLCAweDZjLCAweGVjLAorCTB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsCisJMHgwMiwgMHg4MiwgMHg0MiwgMHhjMiwgMHgyMiwgMHhhMiwgMHg2MiwgMHhlMiwKKwkweDEyLCAweDkyLCAweDUyLCAweGQyLCAweDMyLCAweGIyLCAweDcyLCAweGYyLAorCTB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsCisJMHgxYSwgMHg5YSwgMHg1YSwgMHhkYSwgMHgzYSwgMHhiYSwgMHg3YSwgMHhmYSwKKwkweDA2LCAweDg2LCAweDQ2LCAweGM2LCAweDI2LCAweGE2LCAweDY2LCAweGU2LAorCTB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsCisJMHgwZSwgMHg4ZSwgMHg0ZSwgMHhjZSwgMHgyZSwgMHhhZSwgMHg2ZSwgMHhlZSwKKwkweDFlLCAweDllLCAweDVlLCAweGRlLCAweDNlLCAweGJlLCAweDdlLCAweGZlLAorCTB4MDEsIDB4ODEsIDB4NDEsIDB4YzEsIDB4MjEsIDB4YTEsIDB4NjEsIDB4ZTEsCisJMHgxMSwgMHg5MSwgMHg1MSwgMHhkMSwgMHgzMSwgMHhiMSwgMHg3MSwgMHhmMSwKKwkweDA5LCAweDg5LCAweDQ5LCAweGM5LCAweDI5LCAweGE5LCAweDY5LCAweGU5LAorCTB4MTksIDB4OTksIDB4NTksIDB4ZDksIDB4MzksIDB4YjksIDB4NzksIDB4ZjksCisJMHgwNSwgMHg4NSwgMHg0NSwgMHhjNSwgMHgyNSwgMHhhNSwgMHg2NSwgMHhlNSwKKwkweDE1LCAweDk1LCAweDU1LCAweGQ1LCAweDM1LCAweGI1LCAweDc1LCAweGY1LAorCTB4MGQsIDB4OGQsIDB4NGQsIDB4Y2QsIDB4MmQsIDB4YWQsIDB4NmQsIDB4ZWQsCisJMHgxZCwgMHg5ZCwgMHg1ZCwgMHhkZCwgMHgzZCwgMHhiZCwgMHg3ZCwgMHhmZCwKKwkweDAzLCAweDgzLCAweDQzLCAweGMzLCAweDIzLCAweGEzLCAweDYzLCAweGUzLAorCTB4MTMsIDB4OTMsIDB4NTMsIDB4ZDMsIDB4MzMsIDB4YjMsIDB4NzMsIDB4ZjMsCisJMHgwYiwgMHg4YiwgMHg0YiwgMHhjYiwgMHgyYiwgMHhhYiwgMHg2YiwgMHhlYiwKKwkweDFiLCAweDliLCAweDViLCAweGRiLCAweDNiLCAweGJiLCAweDdiLCAweGZiLAorCTB4MDcsIDB4ODcsIDB4NDcsIDB4YzcsIDB4MjcsIDB4YTcsIDB4NjcsIDB4ZTcsCisJMHgxNywgMHg5NywgMHg1NywgMHhkNywgMHgzNywgMHhiNywgMHg3NywgMHhmNywKKwkweDBmLCAweDhmLCAweDRmLCAweGNmLCAweDJmLCAweGFmLCAweDZmLCAweGVmLAorCTB4MWYsIDB4OWYsIDB4NWYsIDB4ZGYsIDB4M2YsIDB4YmYsIDB4N2YsIDB4ZmYsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoYnl0ZV9yZXZfdGFibGUpOworCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHUxNiBiaXRyZXYxNih1MTYgeCkKK3sKKwlyZXR1cm4gKGJpdHJldjgoeCAmIDB4ZmYpIDw8IDgpIHwgYml0cmV2OCh4ID4+IDgpOworfQorCisvKioKKyAqIGJpdHJldjMyIC0gcmV2ZXJzZSB0aGUgb3JkZXIgb2YgYml0cyBpbiBhIHUzMiB2YWx1ZQorICogQHg6IHZhbHVlIHRvIGJlIGJpdC1yZXZlcnNlZAorICovCit1MzIgYml0cmV2MzIodTMyIHgpCit7CisJcmV0dXJuIChiaXRyZXYxNih4ICYgMHhmZmZmKSA8PCAxNikgfCBiaXRyZXYxNih4ID4+IDE2KTsKK30KK0VYUE9SVF9TWU1CT0woYml0cmV2MzIpOwpkaWZmIC0tZ2l0IGEvbGliL2J1Zy5jIGIvbGliL2J1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGI1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYnVnLmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgIEdlbmVyaWMgc3VwcG9ydCBmb3IgQlVHKCkKKworICBUaGlzIHJlc3BlY3RzIHRoZSBmb2xsb3dpbmcgY29uZmlnIG9wdGlvbnM6CisKKyAgQ09ORklHX0JVRyAtIGVtaXQgQlVHIHRyYXBzLiAgTm90aGluZyBoYXBwZW5zIHdpdGhvdXQgdGhpcy4KKyAgQ09ORklHX0dFTkVSSUNfQlVHIC0gZW5hYmxlIHRoaXMgY29kZS4KKyAgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgLSBlbWl0IGZ1bGwgZmlsZStsaW5lIGluZm9ybWF0aW9uIGZvciBlYWNoIEJVRworCisgIENPTkZJR19CVUcgYW5kIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGFyZSBwb3RlbnRpYWxseSB1c2VyLXNldHRhYmxlCisgICh0aG91Z2ggdGhleSdyZSBnZW5lcmFsbHkgYWx3YXlzIG9uKS4KKworICBDT05GSUdfR0VORVJJQ19CVUcgaXMgc2V0IGJ5IGVhY2ggYXJjaGl0ZWN0dXJlIHVzaW5nIHRoaXMgY29kZS4KKworICBUbyB1c2UgdGhpcywgeW91ciBhcmNoaXRlY3R1cmUgbXVzdDoKKworICAxLiBTZXQgdXAgdGhlIGNvbmZpZyBvcHRpb25zOgorICAgICAtIEVuYWJsZSBDT05GSUdfR0VORVJJQ19CVUcgaWYgQ09ORklHX0JVRworCisgIDIuIEltcGxlbWVudCBCVUcgKGFuZCBvcHRpb25hbGx5IEJVR19PTiwgV0FSTiwgV0FSTl9PTikKKyAgICAgLSBEZWZpbmUgSEFWRV9BUkNIX0JVRworICAgICAtIEltcGxlbWVudCBCVUcoKSB0byBnZW5lcmF0ZSBhIGZhdWx0aW5nIGluc3RydWN0aW9uCisgICAgIC0gTk9URTogc3RydWN0IGJ1Z19lbnRyeSBkb2VzIG5vdCBoYXZlICJmaWxlIiBvciAibGluZSIgZW50cmllcworICAgICAgIHdoZW4gQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IGVuYWJsZWQsIHNvIHlvdSBtdXN0IGdlbmVyYXRlCisgICAgICAgdGhlIHZhbHVlcyBhY2NvcmRpbmdseS4KKworICAzLiBJbXBsZW1lbnQgdGhlIHRyYXAKKyAgICAgLSBJbiB0aGUgaWxsZWdhbCBpbnN0cnVjdGlvbiB0cmFwIGhhbmRsZXIgKHR5cGljYWxseSksIHZlcmlmeQorICAgICAgIHRoYXQgdGhlIGZhdWx0IHdhcyBpbiBrZXJuZWwgbW9kZSwgYW5kIGNhbGwgcmVwb3J0X2J1ZygpCisgICAgIC0gcmVwb3J0X2J1ZygpIHdpbGwgcmV0dXJuIHdoZXRoZXIgaXQgd2FzIGEgZmFsc2UgYWxhcm0sIGEgd2FybmluZywKKyAgICAgICBvciBhbiBhY3R1YWwgYnVnLgorICAgICAtIFlvdSBtdXN0IGltcGxlbWVudCB0aGUgaXNfdmFsaWRfYnVnYWRkcihidWdhZGRyKSBjYWxsYmFjayB3aGljaAorICAgICAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZWlwIGlzIGEgcmVhbCBrZXJuZWwgYWRkcmVzcywgYW5kIGl0IHBvaW50cworICAgICAgIHRvIHRoZSBleHBlY3RlZCBCVUcgdHJhcCBpbnN0cnVjdGlvbi4KKworICAgIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4gMjAwNgorICovCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorCitleHRlcm4gY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSBfX3N0YXJ0X19fYnVnX3RhYmxlW10sIF9fc3RvcF9fX2J1Z190YWJsZVtdOworCisjaWZkZWYgQ09ORklHX01PRFVMRVMKK3N0YXRpYyBMSVNUX0hFQUQobW9kdWxlX2J1Z19saXN0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBidWdfZW50cnkgKm1vZHVsZV9maW5kX2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2QsICZtb2R1bGVfYnVnX2xpc3QsIGJ1Z19saXN0KSB7CisJCWNvbnN0IHN0cnVjdCBidWdfZW50cnkgKmJ1ZyA9IG1vZC0+YnVnX3RhYmxlOworCQl1bnNpZ25lZCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBtb2QtPm51bV9idWdzOyArK2ksICsrYnVnKQorCQkJaWYgKGJ1Z2FkZHIgPT0gYnVnLT5idWdfYWRkcikKKwkJCQlyZXR1cm4gYnVnOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworaW50IG1vZHVsZV9idWdfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwgY29uc3QgRWxmX1NoZHIgKnNlY2hkcnMsCisJCQlzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJY2hhciAqc2Vjc3RyaW5nczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCW1vZC0+YnVnX3RhYmxlID0gTlVMTDsKKwltb2QtPm51bV9idWdzID0gMDsKKworCS8qIEZpbmQgdGhlIF9fYnVnX3RhYmxlIHNlY3Rpb24sIGlmIHByZXNlbnQgKi8KKwlzZWNzdHJpbmdzID0gKGNoYXIgKiloZHIgKyBzZWNoZHJzW2hkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OworCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgeworCQlpZiAoc3RyY21wKHNlY3N0cmluZ3Mrc2VjaGRyc1tpXS5zaF9uYW1lLCAiX19idWdfdGFibGUiKSkKKwkJCWNvbnRpbnVlOworCQltb2QtPmJ1Z190YWJsZSA9ICh2b2lkICopIHNlY2hkcnNbaV0uc2hfYWRkcjsKKwkJbW9kLT5udW1fYnVncyA9IHNlY2hkcnNbaV0uc2hfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBTdHJpY3RseSBzcGVha2luZyB0aGlzIHNob3VsZCBoYXZlIGEgc3BpbmxvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0CisJICogdHJhdmVyc2FscywgYnV0IHNpbmNlIHdlIG9ubHkgdHJhdmVyc2Ugb24gQlVHKClzLCBhIHNwaW5sb2NrCisJICogY291bGQgcG90ZW50aWFsbHkgbGVhZCB0byBkZWFkbG9jayBhbmQgdGh1cyBiZSBjb3VudGVyLXByb2R1Y3RpdmUuCisJICovCisJbGlzdF9hZGQoJm1vZC0+YnVnX2xpc3QsICZtb2R1bGVfYnVnX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbW9kdWxlX2J1Z19jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlsaXN0X2RlbCgmbW9kLT5idWdfbGlzdCk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSAqbW9kdWxlX2ZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcikKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCitjb25zdCBzdHJ1Y3QgYnVnX2VudHJ5ICpmaW5kX2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpCit7CisJY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSAqYnVnOworCisJZm9yIChidWcgPSBfX3N0YXJ0X19fYnVnX3RhYmxlOyBidWcgPCBfX3N0b3BfX19idWdfdGFibGU7ICsrYnVnKQorCQlpZiAoYnVnYWRkciA9PSBidWctPmJ1Z19hZGRyKQorCQkJcmV0dXJuIGJ1ZzsKKworCXJldHVybiBtb2R1bGVfZmluZF9idWcoYnVnYWRkcik7Cit9CisKK2VudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcikKK3sKKwljb25zdCBzdHJ1Y3QgYnVnX2VudHJ5ICpidWc7CisJY29uc3QgY2hhciAqZmlsZTsKKwl1bnNpZ25lZCBsaW5lLCB3YXJuaW5nOworCisJaWYgKCFpc192YWxpZF9idWdhZGRyKGJ1Z2FkZHIpKQorCQlyZXR1cm4gQlVHX1RSQVBfVFlQRV9OT05FOworCisJYnVnID0gZmluZF9idWcoYnVnYWRkcik7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiLS0tLS0tLS0tLS0tWyBjdXQgaGVyZSBdLS0tLS0tLS0tLS0tXG4iKTsKKworCWZpbGUgPSBOVUxMOworCWxpbmUgPSAwOworCXdhcm5pbmcgPSAwOworCisJaWYgKGJ1ZykgeworI2lmZGVmIENPTkZJR19ERUJVR19CVUdWRVJCT1NFCisJCWZpbGUgPSBidWctPmZpbGU7CisJCWxpbmUgPSBidWctPmxpbmU7CisjZW5kaWYKKwkJd2FybmluZyA9IChidWctPmZsYWdzICYgQlVHRkxBR19XQVJOSU5HKSAhPSAwOworCX0KKworCWlmICh3YXJuaW5nKSB7CisJCS8qIHRoaXMgaXMgYSBXQVJOX09OIHJhdGhlciB0aGFuIEJVRy9CVUdfT04gKi8KKwkJaWYgKGZpbGUpCisJCQlwcmludGsoS0VSTl9FUlIgIkJhZG5lc3MgYXQgJXM6JXVcbiIsCisJCQkgICAgICAgZmlsZSwgbGluZSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiQmFkbmVzcyBhdCAlcCAiCisJCQkgICAgICAgIlt2ZXJib3NlIGRlYnVnIGluZm8gdW5hdmFpbGFibGVdXG4iLAorCQkJICAgICAgICh2b2lkICopYnVnYWRkcik7CisKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm4gQlVHX1RSQVBfVFlQRV9XQVJOOworCX0KKworCWlmIChmaWxlKQorCQlwcmludGsoS0VSTl9DUklUICJrZXJuZWwgQlVHIGF0ICVzOiV1IVxuIiwKKwkJICAgICAgIGZpbGUsIGxpbmUpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiS2VybmVsIEJVRyBhdCAlcCAiCisJCSAgICAgICAiW3ZlcmJvc2UgZGVidWcgaW5mbyB1bmF2YWlsYWJsZV1cbiIsCisJCSAgICAgICAodm9pZCAqKWJ1Z2FkZHIpOworCisJcmV0dXJuIEJVR19UUkFQX1RZUEVfQlVHOworfQpkaWZmIC0tZ2l0IGEvbGliL2NhcnRhX3JhbmRvbTMyLmMgYi9saWIvY2FydGFfcmFuZG9tMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4MmRmNy4uMDAwMDAwMAotLS0gYS9saWIvY2FydGFfcmFuZG9tMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgotICoJQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gKiAwMjExMS0xMzA3IFVTQQotICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotLyoKLSAqIEZhc3QsIHNpbXBsZSwgeWV0IGRlY2VudCBxdWFsaXR5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGJhc2VkIG9uCi0gKiBhIHBhcGVyIGJ5IERhdmlkIEcuIENhcnRhICgiVHdvIEZhc3QgSW1wbGVtZW50YXRpb25zIG9mIHRoZQotICogYE1pbmltYWwgU3RhbmRhcmQnIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yLCIgQ29tbXVuaWNhdGlvbnMgb2YgdGhlCi0gKiBBQ00sIEphbnVhcnksIDE5OTApLgotICovCi11NjQgY2FydGFfcmFuZG9tMzIgKHU2NCBzZWVkKQotewotIyAgICAgICBkZWZpbmUgQSAxNjgwNwotIyAgICAgICBkZWZpbmUgTSAoKHUzMikgMSA8PCAzMSkKLSAgICAgICAgdTY0IHMsIHByb2QgPSBBICogc2VlZCwgcCwgcTsKLQotICAgICAgICBwID0gKHByb2QgPj4gMzEpICYgKE0gLSAxKTsKLSAgICAgICAgcSA9IChwcm9kID4+ICAwKSAmIChNIC0gMSk7Ci0gICAgICAgIHMgPSBwICsgcTsKLSAgICAgICAgaWYgKHMgPj0gTSkKLSAgICAgICAgICAgICAgICBzIC09IE0gLSAxOwotICAgICAgICByZXR1cm4gczsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGNhcnRhX3JhbmRvbTMyKTsKZGlmZiAtLWdpdCBhL2xpYi9jbWRsaW5lLmMgYi9saWIvY21kbGluZS5jCmluZGV4IDAzMzFlZDgyLi44YTViNTMwIDEwMDY0NAotLS0gYS9saWIvY21kbGluZS5jCisrKyBiL2xpYi9jbWRsaW5lLmMKQEAgLTE2LDYgKzE2LDIzIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKKy8qCisgKglJZiBhIGh5cGhlbiB3YXMgZm91bmQgaW4gZ2V0X29wdGlvbiwgdGhpcyB3aWxsIGhhbmRsZSB0aGUKKyAqCXJhbmdlIG9mIG51bWJlcnMsIE0tTi4gIFRoaXMgd2lsbCBleHBhbmQgdGhlIHJhbmdlIGFuZCBpbnNlcnQKKyAqCXRoZSB2YWx1ZXNbTSwgTSsxLCAuLi4sIE5dIGludG8gdGhlIGludHMgYXJyYXkgaW4gZ2V0X29wdGlvbnMuCisgKi8KKworc3RhdGljIGludCBnZXRfcmFuZ2UoY2hhciAqKnN0ciwgaW50ICpwaW50KQoreworCWludCB4LCBpbmNfY291bnRlciwgdXBwZXJfcmFuZ2U7CisKKwkoKnN0cikrKzsKKwl1cHBlcl9yYW5nZSA9IHNpbXBsZV9zdHJ0b2woKCpzdHIpLCBOVUxMLCAwKTsKKwlpbmNfY291bnRlciA9IHVwcGVyX3JhbmdlIC0gKnBpbnQ7CisJZm9yICh4ID0gKnBpbnQ7IHggPCB1cHBlcl9yYW5nZTsgeCsrKQorCQkqcGludCsrID0geDsKKwlyZXR1cm4gaW5jX2NvdW50ZXI7Cit9CiAKIC8qKgogICoJZ2V0X29wdGlvbiAtIFBhcnNlIGludGVnZXIgZnJvbSBhbiBvcHRpb24gc3RyaW5nCkBAIC0yOSw2ICs0Niw3IEBACiAgKgkwIDogbm8gaW50IGluIHN0cmluZwogICoJMSA6IGludCBmb3VuZCwgbm8gc3Vic2VxdWVudCBjb21tYQogICoJMiA6IGludCBmb3VuZCBpbmNsdWRpbmcgYSBzdWJzZXF1ZW50IGNvbW1hCisgKgkzIDogaHlwaGVuIGZvdW5kIHRvIGRlbm90ZSBhIHJhbmdlCiAgKi8KIAogaW50IGdldF9vcHRpb24gKGNoYXIgKipzdHIsIGludCAqcGludCkKQEAgLTQ0LDYgKzYyLDggQEAKIAkJKCpzdHIpKys7CiAJCXJldHVybiAyOwogCX0KKwlpZiAoKipzdHIgPT0gJy0nKQorCQlyZXR1cm4gMzsKIAogCXJldHVybiAxOwogfQpAQCAtNTUsNyArNzUsOCBAQAogICoJQGludHM6IGludGVnZXIgYXJyYXkKICAqCiAgKglUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIHN0cmluZyBjb250YWluaW5nIGEgY29tbWEtc2VwYXJhdGVkCi0gKglsaXN0IG9mIGludGVnZXJzLiAgVGhlIHBhcnNlIGhhbHRzIHdoZW4gdGhlIGFycmF5IGlzCisgKglsaXN0IG9mIGludGVnZXJzLCBhIGh5cGhlbi1zZXBhcmF0ZWQgcmFuZ2Ugb2YgX3Bvc2l0aXZlXyBpbnRlZ2VycywKKyAqCW9yIGEgY29tYmluYXRpb24gb2YgYm90aC4gIFRoZSBwYXJzZSBoYWx0cyB3aGVuIHRoZSBhcnJheSBpcwogICoJZnVsbCwgb3Igd2hlbiBubyBtb3JlIG51bWJlcnMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZQogICoJc3RyaW5nLgogICoKQEAgLTcyLDYgKzkzLDE4IEBACiAJCXJlcyA9IGdldF9vcHRpb24gKChjaGFyICoqKSZzdHIsIGludHMgKyBpKTsKIAkJaWYgKHJlcyA9PSAwKQogCQkJYnJlYWs7CisJCWlmIChyZXMgPT0gMykgeworCQkJaW50IHJhbmdlX251bXM7CisJCQlyYW5nZV9udW1zID0gZ2V0X3JhbmdlKChjaGFyICoqKSZzdHIsIGludHMgKyBpKTsKKwkJCWlmIChyYW5nZV9udW1zIDwgMCkKKwkJCQlicmVhazsKKwkJCS8qCisJCQkgKiBEZWNyZW1lbnQgdGhlIHJlc3VsdCBieSBvbmUgdG8gbGVhdmUgb3V0IHRoZQorCQkJICogbGFzdCBudW1iZXIgaW4gdGhlIHJhbmdlLiAgVGhlIG5leHQgaXRlcmF0aW9uCisJCQkgKiB3aWxsIGhhbmRsZSB0aGUgdXBwZXIgbnVtYmVyIGluIHRoZSByYW5nZQorCQkJICovCisJCQlpICs9IChyYW5nZV9udW1zIC0gMSk7CisJCX0KIAkJaSsrOwogCQlpZiAocmVzID09IDEpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2xpYi9jcHVtYXNrLmMgYi9saWIvY3B1bWFzay5jCmluZGV4IDdhMmE3M2YuLjNhNjdkYzUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHVtYXNrLmMKKysrIGIvbGliL2NwdW1hc2suYwpAQCAtNDMsMTkgKzQzLDMgQEAKIAlyZXR1cm4gY3B1OwogfQogRVhQT1JUX1NZTUJPTChfX2FueV9vbmxpbmVfY3B1KTsKLQotI2lmIE1BWF9OVU1OT0RFUyA+IDEKLS8qCi0gKiBGaW5kIHRoZSBoaWdoZXN0IHBvc3NpYmxlIG5vZGUgaWQuCi0gKi8KLWludCBoaWdoZXN0X3Bvc3NpYmxlX25vZGVfaWQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbm9kZTsKLQl1bnNpZ25lZCBpbnQgaGlnaGVzdCA9IDA7Ci0KLQlmb3JfZWFjaF9ub2RlX21hc2sobm9kZSwgbm9kZV9wb3NzaWJsZV9tYXApCi0JCWhpZ2hlc3QgPSBub2RlOwotCXJldHVybiBoaWdoZXN0OwotfQotRVhQT1JUX1NZTUJPTChoaWdoZXN0X3Bvc3NpYmxlX25vZGVfaWQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3JjMzIuYyBiL2xpYi9jcmMzMi5jCmluZGV4IDI4NWZkOWIuLmJmYzMzMzEgMTAwNjQ0Ci0tLSBhL2xpYi9jcmMzMi5jCisrKyBiL2xpYi9jcmMzMi5jCkBAIC0yMzUsMjMgKzIzNSw4IEBACiB9CiAjZW5kaWYKIAotLyoqCi0gKiBiaXRyZXZlcnNlIC0gcmV2ZXJzZSB0aGUgb3JkZXIgb2YgYml0cyBpbiBhIHUzMiB2YWx1ZQotICogQHg6IHZhbHVlIHRvIGJlIGJpdC1yZXZlcnNlZAotICovCi11MzIgYml0cmV2ZXJzZSh1MzIgeCkKLXsKLQl4ID0gKHggPj4gMTYpIHwgKHggPDwgMTYpOwotCXggPSAoeCA+PiA4ICYgMHgwMGZmMDBmZikgfCAoeCA8PCA4ICYgMHhmZjAwZmYwMCk7Ci0JeCA9ICh4ID4+IDQgJiAweDBmMGYwZjBmKSB8ICh4IDw8IDQgJiAweGYwZjBmMGYwKTsKLQl4ID0gKHggPj4gMiAmIDB4MzMzMzMzMzMpIHwgKHggPDwgMiAmIDB4Y2NjY2NjY2MpOwotCXggPSAoeCA+PiAxICYgMHg1NTU1NTU1NSkgfCAoeCA8PCAxICYgMHhhYWFhYWFhYSk7Ci0JcmV0dXJuIHg7Ci19Ci0KIEVYUE9SVF9TWU1CT0woY3JjMzJfbGUpOwogRVhQT1JUX1NZTUJPTChjcmMzMl9iZSk7Ci1FWFBPUlRfU1lNQk9MKGJpdHJldmVyc2UpOwogCiAvKgogICogQSBicmllZiBDUkMgdHV0b3JpYWwuCkBAIC00MDAsMTAgKzM4NSw3IEBACiBzdGF0aWMgdm9pZCBieXRlcmV2ZXJzZSh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CiAJd2hpbGUgKGxlbi0tKSB7Ci0JCXVuc2lnbmVkIGNoYXIgeCA9ICpidWY7Ci0JCXggPSAoeCA+PiA0KSB8ICh4IDw8IDQpOwotCQl4ID0gKHggPj4gMiAmIDB4MzMpIHwgKHggPDwgMiAmIDB4Y2MpOwotCQl4ID0gKHggPj4gMSAmIDB4NTUpIHwgKHggPDwgMSAmIDB4YWEpOworCQl1bnNpZ25lZCBjaGFyIHggPSBiaXRyZXY4KCpidWYpOwogCQkqYnVmKysgPSB4OwogCX0KIH0KQEAgLTQ2MCwxMSArNDQyLDExIEBACiAJLyogTm93IHN3YXAgaXQgYXJvdW5kIGZvciB0aGUgb3RoZXIgdGVzdCAqLwogCiAJYnl0ZXJldmVyc2UoYnVmLCBsZW4gKyA0KTsKLQlpbml0ID0gYml0cmV2ZXJzZShpbml0KTsKLQljcmMyID0gYml0cmV2ZXJzZShjcmMxKTsKLQlpZiAoY3JjMSAhPSBiaXRyZXZlcnNlKGNyYzIpKQorCWluaXQgPSBiaXRyZXYzMihpbml0KTsKKwljcmMyID0gYml0cmV2MzIoY3JjMSk7CisJaWYgKGNyYzEgIT0gYml0cmV2MzIoY3JjMikpCiAJCXByaW50ZigiXG5CaXQgcmV2ZXJzYWwgZmFpbDogMHglMDh4IC0+IDB4JTA4eCAtPiAweCUwOHhcbiIsCi0JCSAgICAgICBjcmMxLCBjcmMyLCBiaXRyZXZlcnNlKGNyYzIpKTsKKwkJICAgICAgIGNyYzEsIGNyYzIsIGJpdHJldjMyKGNyYzIpKTsKIAljcmMxID0gY3JjMzJfbGUoaW5pdCwgYnVmLCBsZW4pOwogCWlmIChjcmMxICE9IGNyYzIpCiAJCXByaW50ZigiXG5DUkMgZW5kaWFubmVzcyBmYWlsOiAweCUwOHggIT0gMHglMDh4XG4iLCBjcmMxLApkaWZmIC0tZ2l0IGEvbGliL2ZhdWx0LWluamVjdC5jIGIvbGliL2ZhdWx0LWluamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDNjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZmF1bHQtaW5qZWN0LmMKQEAgLTAsMCArMSwzMzYgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KKworLyoKKyAqIHNldHVwX2ZhdWx0X2F0dHIoKSBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdmFyaW91cyBfX3NldHVwIGhhbmRsZXJzLCBzbyBpdAorICogcmV0dXJucyAwIG9uIGVycm9yLCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBfX3NldHVwIGhhbmRsZXJzIGRvLgorICovCitpbnQgX19pbml0IHNldHVwX2ZhdWx0X2F0dHIoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIHByb2JhYmlsaXR5OworCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CisJaW50IHRpbWVzOworCWludCBzcGFjZTsKKworCS8qICI8aW50ZXJ2YWw+LDxwcm9iYWJpbGl0eT4sPHNwYWNlPiw8dGltZXM+IiAqLworCWlmIChzc2NhbmYoc3RyLCAiJWx1LCVsdSwlZCwlZCIsCisJCQkmaW50ZXJ2YWwsICZwcm9iYWJpbGl0eSwgJnNwYWNlLCAmdGltZXMpIDwgNCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiRkFVTFRfSU5KRUNUSU9OOiBmYWlsZWQgdG8gcGFyc2UgYXJndW1lbnRzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXR0ci0+cHJvYmFiaWxpdHkgPSBwcm9iYWJpbGl0eTsKKwlhdHRyLT5pbnRlcnZhbCA9IGludGVydmFsOworCWF0b21pY19zZXQoJmF0dHItPnRpbWVzLCB0aW1lcyk7CisJYXRvbWljX3NldCgmYXR0ci0+c3BhY2UsIHNwYWNlKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmYWlsX2R1bXAoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpCit7CisJaWYgKGF0dHItPnZlcmJvc2UgPiAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIkZBVUxUX0lOSkVDVElPTjogZm9yY2luZyBhIGZhaWx1cmVcbiIpOworCWlmIChhdHRyLT52ZXJib3NlID4gMSkKKwkJZHVtcF9zdGFjaygpOworfQorCisjZGVmaW5lIGF0b21pY19kZWNfbm90X3plcm8odikJCWF0b21pY19hZGRfdW5sZXNzKCh2KSwgLTEsIDApCisKK3N0YXRpYyBib29sIGZhaWxfdGFzayhzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0ciwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiAhaW5faW50ZXJydXB0KCkgJiYgdGFzay0+bWFrZV9pdF9mYWlsOworfQorCisjZGVmaW5lIE1BWF9TVEFDS19UUkFDRV9ERVBUSCAzMgorCisjaWZkZWYgQ09ORklHX1NUQUNLX1VOV0lORAorCitzdGF0aWMgYXNtbGlua2FnZSBpbnQgZmFpbF9zdGFja3RyYWNlX2NhbGxiYWNrKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbywKKwkJCQkJCXZvaWQgKmFyZykKK3sKKwlpbnQgZGVwdGg7CisJc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIgPSBhcmc7CisJYm9vbCBmb3VuZCA9IChhdHRyLT5yZXF1aXJlX3N0YXJ0ID09IDAgJiYgYXR0ci0+cmVxdWlyZV9lbmQgPT0gVUxPTkdfTUFYKTsKKworCWZvciAoZGVwdGggPSAwOyBkZXB0aCA8IGF0dHItPnN0YWNrdHJhY2VfZGVwdGgKKwkJCSYmIHVud2luZChpbmZvKSA9PSAwICYmIFVOV19QQyhpbmZvKTsgZGVwdGgrKykgeworCQlpZiAoYXJjaF91bndfdXNlcl9tb2RlKGluZm8pKQorCQkJYnJlYWs7CisJCWlmIChhdHRyLT5yZWplY3Rfc3RhcnQgPD0gVU5XX1BDKGluZm8pICYmCisJCQkgICAgICAgVU5XX1BDKGluZm8pIDwgYXR0ci0+cmVqZWN0X2VuZCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGF0dHItPnJlcXVpcmVfc3RhcnQgPD0gVU5XX1BDKGluZm8pICYmCisJCQkgICAgICAgVU5XX1BDKGluZm8pIDwgYXR0ci0+cmVxdWlyZV9lbmQpCisJCQlmb3VuZCA9IHRydWU7CisJfQorCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGJvb2wgZmFpbF9zdGFja3RyYWNlKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQoreworCXN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyBpbmZvOworCisJcmV0dXJuIHVud2luZF9pbml0X3J1bm5pbmcoJmluZm8sIGZhaWxfc3RhY2t0cmFjZV9jYWxsYmFjaywgYXR0cik7Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NUQUNLVFJBQ0UpCisKK3N0YXRpYyBib29sIGZhaWxfc3RhY2t0cmFjZShzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3Qgc3RhY2tfdHJhY2UgdHJhY2U7CisJaW50IGRlcHRoID0gYXR0ci0+c3RhY2t0cmFjZV9kZXB0aDsKKwl1bnNpZ25lZCBsb25nIGVudHJpZXNbTUFYX1NUQUNLX1RSQUNFX0RFUFRIXTsKKwlpbnQgbjsKKwlib29sIGZvdW5kID0gKGF0dHItPnJlcXVpcmVfc3RhcnQgPT0gMCAmJiBhdHRyLT5yZXF1aXJlX2VuZCA9PSBVTE9OR19NQVgpOworCisJaWYgKGRlcHRoID09IDApCisJCXJldHVybiBmb3VuZDsKKworCXRyYWNlLm5yX2VudHJpZXMgPSAwOworCXRyYWNlLmVudHJpZXMgPSBlbnRyaWVzOworCXRyYWNlLm1heF9lbnRyaWVzID0gZGVwdGg7CisJdHJhY2Uuc2tpcCA9IDE7CisJdHJhY2UuYWxsX2NvbnRleHRzID0gMDsKKworCXNhdmVfc3RhY2tfdHJhY2UoJnRyYWNlLCBOVUxMKTsKKwlmb3IgKG4gPSAwOyBuIDwgdHJhY2UubnJfZW50cmllczsgbisrKSB7CisJCWlmIChhdHRyLT5yZWplY3Rfc3RhcnQgPD0gZW50cmllc1tuXSAmJgorCQkJICAgICAgIGVudHJpZXNbbl0gPCBhdHRyLT5yZWplY3RfZW5kKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXR0ci0+cmVxdWlyZV9zdGFydCA8PSBlbnRyaWVzW25dICYmCisJCQkgICAgICAgZW50cmllc1tuXSA8IGF0dHItPnJlcXVpcmVfZW5kKQorCQkJZm91bmQgPSB0cnVlOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBmYWlsX3N0YWNrdHJhY2Uoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpCit7CisJc3RhdGljIGJvb2wgZmlyc3R0aW1lID0gdHJ1ZTsKKworCWlmIChmaXJzdHRpbWUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkiVGhpcyBhcmNoaXRlY3R1cmUgZG9lcyBub3QgaW1wbGVtZW50IHNhdmVfc3RhY2tfdHJhY2UoKVxuIik7CisJCWZpcnN0dGltZSA9IGZhbHNlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNlbmRpZgorCisvKgorICogVGhpcyBjb2RlIGlzIHN0b2xlbiBmcm9tIGZhaWxtYWxsb2MtMS4wCisgKiBodHRwOi8vd3d3Lm5vbmdudS5vcmcvZmFpbG1hbGxvYy8KKyAqLworCitib29sIHNob3VsZF9mYWlsKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyLCBzc2l6ZV90IHNpemUpCit7CisJaWYgKGF0dHItPnRhc2tfZmlsdGVyICYmICFmYWlsX3Rhc2soYXR0ciwgY3VycmVudCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChhdG9taWNfcmVhZCgmYXR0ci0+dGltZXMpID09IDApCisJCXJldHVybiBmYWxzZTsKKworCWlmIChhdG9taWNfcmVhZCgmYXR0ci0+c3BhY2UpID4gc2l6ZSkgeworCQlhdG9taWNfc3ViKHNpemUsICZhdHRyLT5zcGFjZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoYXR0ci0+aW50ZXJ2YWwgPiAxKSB7CisJCWF0dHItPmNvdW50Kys7CisJCWlmIChhdHRyLT5jb3VudCAlIGF0dHItPmludGVydmFsKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChhdHRyLT5wcm9iYWJpbGl0eSA8PSByYW5kb20zMigpICUgMTAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoIWZhaWxfc3RhY2t0cmFjZShhdHRyKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZmFpbF9kdW1wKGF0dHIpOworCisJaWYgKGF0b21pY19yZWFkKCZhdHRyLT50aW1lcykgIT0gLTEpCisJCWF0b21pY19kZWNfbm90X3plcm8oJmF0dHItPnRpbWVzKTsKKworCXJldHVybiB0cnVlOworfQorCisjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUworCitzdGF0aWMgdm9pZCBkZWJ1Z2ZzX3VsX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCSoodW5zaWduZWQgbG9uZyAqKWRhdGEgPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnZnNfdWxfc2V0X01BWF9TVEFDS19UUkFDRV9ERVBUSCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCSoodW5zaWduZWQgbG9uZyAqKWRhdGEgPQorCQl2YWwgPCBNQVhfU1RBQ0tfVFJBQ0VfREVQVEggPworCQl2YWwgOiBNQVhfU1RBQ0tfVFJBQ0VfREVQVEg7Cit9CisKK3N0YXRpYyB1NjQgZGVidWdmc191bF9nZXQodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopZGF0YTsKK30KKworREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc191bCwgZGVidWdmc191bF9nZXQsIGRlYnVnZnNfdWxfc2V0LCAiJWxsdVxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV91bChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3VsKTsKK30KKworREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc191bF9NQVhfU1RBQ0tfVFJBQ0VfREVQVEgsIGRlYnVnZnNfdWxfZ2V0LAorCQkJZGVidWdmc191bF9zZXRfTUFYX1NUQUNLX1RSQUNFX0RFUFRILCAiJWxsdVxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV91bF9NQVhfU1RBQ0tfVFJBQ0VfREVQVEgoCisJY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLAorCQkJCSAgICZmb3BzX3VsX01BWF9TVEFDS19UUkFDRV9ERVBUSCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnZnNfYXRvbWljX3Rfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJYXRvbWljX3NldCgoYXRvbWljX3QgKilkYXRhLCB2YWwpOworfQorCitzdGF0aWMgdTY0IGRlYnVnZnNfYXRvbWljX3RfZ2V0KHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGF0b21pY19yZWFkKChhdG9taWNfdCAqKWRhdGEpOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX2F0b21pY190LCBkZWJ1Z2ZzX2F0b21pY190X2dldCwKKwkJCWRlYnVnZnNfYXRvbWljX3Rfc2V0LCAiJWxsZFxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9hdG9taWNfdChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGF0b21pY190ICp2YWx1ZSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLCAmZm9wc19hdG9taWNfdCk7Cit9CisKK3ZvaWQgY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQoreworCWRlYnVnZnNfcmVtb3ZlKGF0dHItPmRlbnRyaWVzLnByb2JhYmlsaXR5X2ZpbGUpOworCWF0dHItPmRlbnRyaWVzLnByb2JhYmlsaXR5X2ZpbGUgPSBOVUxMOworCisJZGVidWdmc19yZW1vdmUoYXR0ci0+ZGVudHJpZXMuaW50ZXJ2YWxfZmlsZSk7CisJYXR0ci0+ZGVudHJpZXMuaW50ZXJ2YWxfZmlsZSA9IE5VTEw7CisKKwlkZWJ1Z2ZzX3JlbW92ZShhdHRyLT5kZW50cmllcy50aW1lc19maWxlKTsKKwlhdHRyLT5kZW50cmllcy50aW1lc19maWxlID0gTlVMTDsKKworCWRlYnVnZnNfcmVtb3ZlKGF0dHItPmRlbnRyaWVzLnNwYWNlX2ZpbGUpOworCWF0dHItPmRlbnRyaWVzLnNwYWNlX2ZpbGUgPSBOVUxMOworCisJZGVidWdmc19yZW1vdmUoYXR0ci0+ZGVudHJpZXMudmVyYm9zZV9maWxlKTsKKwlhdHRyLT5kZW50cmllcy52ZXJib3NlX2ZpbGUgPSBOVUxMOworCisJZGVidWdmc19yZW1vdmUoYXR0ci0+ZGVudHJpZXMudGFza19maWx0ZXJfZmlsZSk7CisJYXR0ci0+ZGVudHJpZXMudGFza19maWx0ZXJfZmlsZSA9IE5VTEw7CisKKwlkZWJ1Z2ZzX3JlbW92ZShhdHRyLT5kZW50cmllcy5zdGFja3RyYWNlX2RlcHRoX2ZpbGUpOworCWF0dHItPmRlbnRyaWVzLnN0YWNrdHJhY2VfZGVwdGhfZmlsZSA9IE5VTEw7CisKKwlkZWJ1Z2ZzX3JlbW92ZShhdHRyLT5kZW50cmllcy5yZXF1aXJlX3N0YXJ0X2ZpbGUpOworCWF0dHItPmRlbnRyaWVzLnJlcXVpcmVfc3RhcnRfZmlsZSA9IE5VTEw7CisKKwlkZWJ1Z2ZzX3JlbW92ZShhdHRyLT5kZW50cmllcy5yZXF1aXJlX2VuZF9maWxlKTsKKwlhdHRyLT5kZW50cmllcy5yZXF1aXJlX2VuZF9maWxlID0gTlVMTDsKKworCWRlYnVnZnNfcmVtb3ZlKGF0dHItPmRlbnRyaWVzLnJlamVjdF9zdGFydF9maWxlKTsKKwlhdHRyLT5kZW50cmllcy5yZWplY3Rfc3RhcnRfZmlsZSA9IE5VTEw7CisKKwlkZWJ1Z2ZzX3JlbW92ZShhdHRyLT5kZW50cmllcy5yZWplY3RfZW5kX2ZpbGUpOworCWF0dHItPmRlbnRyaWVzLnJlamVjdF9lbmRfZmlsZSA9IE5VTEw7CisKKwlpZiAoYXR0ci0+ZGVudHJpZXMuZGlyKQorCQlXQVJOX09OKCFzaW1wbGVfZW1wdHkoYXR0ci0+ZGVudHJpZXMuZGlyKSk7CisKKwlkZWJ1Z2ZzX3JlbW92ZShhdHRyLT5kZW50cmllcy5kaXIpOworCWF0dHItPmRlbnRyaWVzLmRpciA9IE5VTEw7Cit9CisKK2ludCBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJbW9kZV90IG1vZGUgPSBTX0lGUkVHIHwgU19JUlVTUiB8IFNfSVdVU1I7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCisJbWVtc2V0KCZhdHRyLT5kZW50cmllcywgMCwgc2l6ZW9mKGF0dHItPmRlbnRyaWVzKSk7CisKKwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgTlVMTCk7CisJaWYgKCFkaXIpCisJCWdvdG8gZmFpbDsKKwlhdHRyLT5kZW50cmllcy5kaXIgPSBkaXI7CisKKwlhdHRyLT5kZW50cmllcy5wcm9iYWJpbGl0eV9maWxlID0KKwkJZGVidWdmc19jcmVhdGVfdWwoInByb2JhYmlsaXR5IiwgbW9kZSwgZGlyLCAmYXR0ci0+cHJvYmFiaWxpdHkpOworCisJYXR0ci0+ZGVudHJpZXMuaW50ZXJ2YWxfZmlsZSA9CisJCWRlYnVnZnNfY3JlYXRlX3VsKCJpbnRlcnZhbCIsIG1vZGUsIGRpciwgJmF0dHItPmludGVydmFsKTsKKworCWF0dHItPmRlbnRyaWVzLnRpbWVzX2ZpbGUgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV9hdG9taWNfdCgidGltZXMiLCBtb2RlLCBkaXIsICZhdHRyLT50aW1lcyk7CisKKwlhdHRyLT5kZW50cmllcy5zcGFjZV9maWxlID0KKwkJZGVidWdmc19jcmVhdGVfYXRvbWljX3QoInNwYWNlIiwgbW9kZSwgZGlyLCAmYXR0ci0+c3BhY2UpOworCisJYXR0ci0+ZGVudHJpZXMudmVyYm9zZV9maWxlID0KKwkJZGVidWdmc19jcmVhdGVfdWwoInZlcmJvc2UiLCBtb2RlLCBkaXIsICZhdHRyLT52ZXJib3NlKTsKKworCWF0dHItPmRlbnRyaWVzLnRhc2tfZmlsdGVyX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJ0YXNrLWZpbHRlciIsCisJCQkJCQltb2RlLCBkaXIsICZhdHRyLT50YXNrX2ZpbHRlcik7CisKKwlhdHRyLT5kZW50cmllcy5zdGFja3RyYWNlX2RlcHRoX2ZpbGUgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV91bF9NQVhfU1RBQ0tfVFJBQ0VfREVQVEgoCisJCQkic3RhY2t0cmFjZS1kZXB0aCIsIG1vZGUsIGRpciwgJmF0dHItPnN0YWNrdHJhY2VfZGVwdGgpOworCisJYXR0ci0+ZGVudHJpZXMucmVxdWlyZV9zdGFydF9maWxlID0KKwkJZGVidWdmc19jcmVhdGVfdWwoInJlcXVpcmUtc3RhcnQiLCBtb2RlLCBkaXIsICZhdHRyLT5yZXF1aXJlX3N0YXJ0KTsKKworCWF0dHItPmRlbnRyaWVzLnJlcXVpcmVfZW5kX2ZpbGUgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV91bCgicmVxdWlyZS1lbmQiLCBtb2RlLCBkaXIsICZhdHRyLT5yZXF1aXJlX2VuZCk7CisKKwlhdHRyLT5kZW50cmllcy5yZWplY3Rfc3RhcnRfZmlsZSA9CisJCWRlYnVnZnNfY3JlYXRlX3VsKCJyZWplY3Qtc3RhcnQiLCBtb2RlLCBkaXIsICZhdHRyLT5yZWplY3Rfc3RhcnQpOworCisJYXR0ci0+ZGVudHJpZXMucmVqZWN0X2VuZF9maWxlID0KKwkJZGVidWdmc19jcmVhdGVfdWwoInJlamVjdC1lbmQiLCBtb2RlLCBkaXIsICZhdHRyLT5yZWplY3RfZW5kKTsKKworCisJaWYgKCFhdHRyLT5kZW50cmllcy5wcm9iYWJpbGl0eV9maWxlIHx8ICFhdHRyLT5kZW50cmllcy5pbnRlcnZhbF9maWxlCisJICAgIHx8ICFhdHRyLT5kZW50cmllcy50aW1lc19maWxlIHx8ICFhdHRyLT5kZW50cmllcy5zcGFjZV9maWxlCisJICAgIHx8ICFhdHRyLT5kZW50cmllcy52ZXJib3NlX2ZpbGUgfHwgIWF0dHItPmRlbnRyaWVzLnRhc2tfZmlsdGVyX2ZpbGUKKwkgICAgfHwgIWF0dHItPmRlbnRyaWVzLnN0YWNrdHJhY2VfZGVwdGhfZmlsZQorCSAgICB8fCAhYXR0ci0+ZGVudHJpZXMucmVxdWlyZV9zdGFydF9maWxlCisJICAgIHx8ICFhdHRyLT5kZW50cmllcy5yZXF1aXJlX2VuZF9maWxlCisJICAgIHx8ICFhdHRyLT5kZW50cmllcy5yZWplY3Rfc3RhcnRfZmlsZQorCSAgICB8fCAhYXR0ci0+ZGVudHJpZXMucmVqZWN0X2VuZF9maWxlCisJICAgICkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIDA7CitmYWlsOgorCWNsZWFudXBfZmF1bHRfYXR0cl9kZW50cmllcyhhdHRyKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCAxNmQyMTQzLi43MTg1MzUzIDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmlkcl9sYXllcl9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaWRyX2xheWVyX2NhY2hlOwogCiBzdGF0aWMgc3RydWN0IGlkcl9sYXllciAqYWxsb2NfbGF5ZXIoc3RydWN0IGlkciAqaWRwKQogewpAQCAtNDQ1LDcgKzQ0NSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlkcl9yZXBsYWNlKTsKIAotc3RhdGljIHZvaWQgaWRyX2NhY2hlX2N0b3Iodm9pZCAqIGlkcl9sYXllciwga21lbV9jYWNoZV90ICppZHJfbGF5ZXJfY2FjaGUsCitzdGF0aWMgdm9pZCBpZHJfY2FjaGVfY3Rvcih2b2lkICogaWRyX2xheWVyLCBzdHJ1Y3Qga21lbV9jYWNoZSAqaWRyX2xheWVyX2NhY2hlLAogCQl1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCW1lbXNldChpZHJfbGF5ZXIsIDAsIHNpemVvZihzdHJ1Y3QgaWRyX2xheWVyKSk7CmRpZmYgLS1naXQgYS9saWIvaW9tYXAuYyBiL2xpYi9pb21hcC5jCmluZGV4IDU1Njg5YzUuLmQ2Y2NkZDggMTAwNjQ0Ci0tLSBhL2xpYi9pb21hcC5jCisrKyBiL2xpYi9pb21hcC5jCkBAIC01MCw2ICs1MCwxNiBAQAogCX0JCQkJCQkJXAogfSB3aGlsZSAoMCkKIAorI2lmbmRlZiBwaW9fcmVhZDE2YmUKKyNkZWZpbmUgcGlvX3JlYWQxNmJlKHBvcnQpIHN3YWIxNihpbncocG9ydCkpCisjZGVmaW5lIHBpb19yZWFkMzJiZShwb3J0KSBzd2FiMzIoaW5sKHBvcnQpKQorI2VuZGlmCisKKyNpZm5kZWYgbW1pb19yZWFkMTZiZQorI2RlZmluZSBtbWlvX3JlYWQxNmJlKGFkZHIpIGJlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KGFkZHIpKQorI2RlZmluZSBtbWlvX3JlYWQzMmJlKGFkZHIpIGJlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKGFkZHIpKQorI2VuZGlmCisKIHVuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQ4KHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAlJT19DT05EKGFkZHIsIHJldHVybiBpbmIocG9ydCksIHJldHVybiByZWFkYihhZGRyKSk7CkBAIC02MCw3ICs3MCw3IEBACiB9CiB1bnNpZ25lZCBpbnQgZmFzdGNhbGwgaW9yZWFkMTZiZSh2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JSU9fQ09ORChhZGRyLCByZXR1cm4gaW53KHBvcnQpLCByZXR1cm4gYmUxNl90b19jcHUoX19yYXdfcmVhZHcoYWRkcikpKTsKKwlJT19DT05EKGFkZHIsIHJldHVybiBwaW9fcmVhZDE2YmUocG9ydCksIHJldHVybiBtbWlvX3JlYWQxNmJlKGFkZHIpKTsKIH0KIHVuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQzMih2b2lkIF9faW9tZW0gKmFkZHIpCiB7CkBAIC02OCw3ICs3OCw3IEBACiB9CiB1bnNpZ25lZCBpbnQgZmFzdGNhbGwgaW9yZWFkMzJiZSh2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JSU9fQ09ORChhZGRyLCByZXR1cm4gaW5sKHBvcnQpLCByZXR1cm4gYmUzMl90b19jcHUoX19yYXdfcmVhZGwoYWRkcikpKTsKKwlJT19DT05EKGFkZHIsIHJldHVybiBwaW9fcmVhZDMyYmUocG9ydCksIHJldHVybiBtbWlvX3JlYWQzMmJlKGFkZHIpKTsKIH0KIEVYUE9SVF9TWU1CT0woaW9yZWFkOCk7CiBFWFBPUlRfU1lNQk9MKGlvcmVhZDE2KTsKQEAgLTc2LDYgKzg2LDE2IEBACiBFWFBPUlRfU1lNQk9MKGlvcmVhZDMyKTsKIEVYUE9SVF9TWU1CT0woaW9yZWFkMzJiZSk7CiAKKyNpZm5kZWYgcGlvX3dyaXRlMTZiZQorI2RlZmluZSBwaW9fd3JpdGUxNmJlKHZhbCxwb3J0KSBvdXR3KHN3YWIxNih2YWwpLHBvcnQpCisjZGVmaW5lIHBpb193cml0ZTMyYmUodmFsLHBvcnQpIG91dGwoc3dhYjMyKHZhbCkscG9ydCkKKyNlbmRpZgorCisjaWZuZGVmIG1taW9fd3JpdGUxNmJlCisjZGVmaW5lIG1taW9fd3JpdGUxNmJlKHZhbCxwb3J0KSBfX3Jhd193cml0ZXcoYmUxNl90b19jcHUodmFsKSxwb3J0KQorI2RlZmluZSBtbWlvX3dyaXRlMzJiZSh2YWwscG9ydCkgX19yYXdfd3JpdGVsKGJlMzJfdG9fY3B1KHZhbCkscG9ydCkKKyNlbmRpZgorCiB2b2lkIGZhc3RjYWxsIGlvd3JpdGU4KHU4IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQogewogCUlPX0NPTkQoYWRkciwgb3V0Yih2YWwscG9ydCksIHdyaXRlYih2YWwsIGFkZHIpKTsKQEAgLTg2LDcgKzEwNiw3IEBACiB9CiB2b2lkIGZhc3RjYWxsIGlvd3JpdGUxNmJlKHUxNiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlJT19DT05EKGFkZHIsIG91dHcodmFsLHBvcnQpLCBfX3Jhd193cml0ZXcoY3B1X3RvX2JlMTYodmFsKSwgYWRkcikpOworCUlPX0NPTkQoYWRkciwgcGlvX3dyaXRlMTZiZSh2YWwscG9ydCksIG1taW9fd3JpdGUxNmJlKHZhbCwgYWRkcikpOwogfQogdm9pZCBmYXN0Y2FsbCBpb3dyaXRlMzIodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQogewpAQCAtOTQsNyArMTE0LDcgQEAKIH0KIHZvaWQgZmFzdGNhbGwgaW93cml0ZTMyYmUodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQogewotCUlPX0NPTkQoYWRkciwgb3V0bCh2YWwscG9ydCksIF9fcmF3X3dyaXRlbChjcHVfdG9fYmUzMih2YWwpLCBhZGRyKSk7CisJSU9fQ09ORChhZGRyLCBwaW9fd3JpdGUzMmJlKHZhbCxwb3J0KSwgbW1pb193cml0ZTMyYmUodmFsLCBhZGRyKSk7CiB9CiBFWFBPUlRfU1lNQk9MKGlvd3JpdGU4KTsKIEVYUE9SVF9TWU1CT0woaW93cml0ZTE2KTsKQEAgLTEwOCw2ICsxMjgsNyBAQAogICogY29udmVydCB0byBDUFUgYnl0ZSBvcmRlci4gV2Ugd3JpdGUgaW4gIklPIGJ5dGUKICAqIG9yZGVyIiAod2UgYWxzbyBkb24ndCBoYXZlIElPIGJhcnJpZXJzKS4KICAqLworI2lmbmRlZiBtbWlvX2luc2IKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbWlvX2luc2Iodm9pZCBfX2lvbWVtICphZGRyLCB1OCAqZHN0LCBpbnQgY291bnQpCiB7CiAJd2hpbGUgKC0tY291bnQgPj0gMCkgewpAQCAtMTMyLDcgKzE1Myw5IEBACiAJCWRzdCsrOwogCX0KIH0KKyNlbmRpZgogCisjaWZuZGVmIG1taW9fb3V0c2IKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbWlvX291dHNiKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3QgdTggKnNyYywgaW50IGNvdW50KQogewogCXdoaWxlICgtLWNvdW50ID49IDApIHsKQEAgLTE1NCw2ICsxNzcsNyBAQAogCQlzcmMrKzsKIAl9CiB9CisjZW5kaWYKIAogdm9pZCBmYXN0Y2FsbCBpb3JlYWQ4X3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKZGlmZiAtLWdpdCBhL2xpYi9pb3JlbWFwLmMgYi9saWIvaW9yZW1hcC5jCmluZGV4IDk5ZmEyNzcuLmE5ZTQ0MTUgMTAwNjQ0Ci0tLSBhL2xpYi9pb3JlbWFwLmMKKysrIGIvbGliL2lvcmVtYXAuYwpAQCAtNSw3ICs1LDYgQEAKICAqCiAgKiAoQykgQ29weXJpZ2h0IDE5OTUgMTk5NiBMaW51cyBUb3J2YWxkcwogICovCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIApkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3QuYyBiL2xpYi9rb2JqZWN0LmMKaW5kZXggMTY5OWViOS4uN2NlNmRjMSAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3QuYworKysgYi9saWIva29iamVjdC5jCkBAIC0xMTEsMTQgKzExMSwxNCBAQAogCWxlbiA9IGdldF9rb2JqX3BhdGhfbGVuZ3RoKGtvYmopOwogCWlmIChsZW4gPT0gMCkKIAkJcmV0dXJuIE5VTEw7Ci0JcGF0aCA9IGttYWxsb2MobGVuLCBnZnBfbWFzayk7CisJcGF0aCA9IGt6YWxsb2MobGVuLCBnZnBfbWFzayk7CiAJaWYgKCFwYXRoKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQocGF0aCwgMHgwMCwgbGVuKTsKIAlmaWxsX2tvYmpfcGF0aChrb2JqLCBwYXRoLCBsZW4pOwogCiAJcmV0dXJuIHBhdGg7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChrb2JqZWN0X2dldF9wYXRoKTsKIAogLyoqCiAgKglrb2JqZWN0X2luaXQgLSBpbml0aWFsaXplIG9iamVjdC4KQEAgLTMxMCw2ICszMTAsNTYgQEAKIH0KIAogLyoqCisgKglrb2JqZWN0X21vdmUgLSBtb3ZlIG9iamVjdCB0byBhbm90aGVyIHBhcmVudAorICoJQGtvYmo6CW9iamVjdCBpbiBxdWVzdGlvbi4KKyAqCUBuZXdfcGFyZW50OiBvYmplY3QncyBuZXcgcGFyZW50CisgKi8KKworaW50IGtvYmplY3RfbW92ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmplY3QgKm5ld19wYXJlbnQpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBrb2JqZWN0ICpvbGRfcGFyZW50OworCWNvbnN0IGNoYXIgKmRldnBhdGggPSBOVUxMOworCWNoYXIgKmRldnBhdGhfc3RyaW5nID0gTlVMTDsKKwljaGFyICplbnZwWzJdOworCisJa29iaiA9IGtvYmplY3RfZ2V0KGtvYmopOworCWlmICgha29iaikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbmV3X3BhcmVudCA9IGtvYmplY3RfZ2V0KG5ld19wYXJlbnQpOworCWlmICghbmV3X3BhcmVudCkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkvKiBvbGQgb2JqZWN0IHBhdGggKi8KKwlkZXZwYXRoID0ga29iamVjdF9nZXRfcGF0aChrb2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldnBhdGgpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJZGV2cGF0aF9zdHJpbmcgPSBrbWFsbG9jKHN0cmxlbihkZXZwYXRoKSArIDE1LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldnBhdGhfc3RyaW5nKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXNwcmludGYoZGV2cGF0aF9zdHJpbmcsICJERVZQQVRIX09MRD0lcyIsIGRldnBhdGgpOworCWVudnBbMF0gPSBkZXZwYXRoX3N0cmluZzsKKwllbnZwWzFdID0gTlVMTDsKKwllcnJvciA9IHN5c2ZzX21vdmVfZGlyKGtvYmosIG5ld19wYXJlbnQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJb2xkX3BhcmVudCA9IGtvYmotPnBhcmVudDsKKwlrb2JqLT5wYXJlbnQgPSBuZXdfcGFyZW50OworCWtvYmplY3RfcHV0KG9sZF9wYXJlbnQpOworCWtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBLT0JKX01PVkUsIGVudnApOworb3V0OgorCWtvYmplY3RfcHV0KGtvYmopOworCWtmcmVlKGRldnBhdGhfc3RyaW5nKTsKKwlrZnJlZShkZXZwYXRoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgogICoJa29iamVjdF9kZWwgLSB1bmxpbmsga29iamVjdCBmcm9tIGhpZXJhcmNoeS4KICAqIAlAa29iajoJb2JqZWN0LgogICovCmRpZmYgLS1naXQgYS9saWIva29iamVjdF91ZXZlbnQuYyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCmluZGV4IDdmMjBlN2IuLmExOTIyNzYgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0X3VldmVudC5jCisrKyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCkBAIC01MCwxOCArNTAsMjIgQEAKIAkJcmV0dXJuICJvZmZsaW5lIjsKIAljYXNlIEtPQkpfT05MSU5FOgogCQlyZXR1cm4gIm9ubGluZSI7CisJY2FzZSBLT0JKX01PVkU6CisJCXJldHVybiAibW92ZSI7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQogfQogCiAvKioKLSAqIGtvYmplY3RfdWV2ZW50IC0gbm90aWZ5IHVzZXJzcGFjZSBieSBlbmRpbmcgYW4gdWV2ZW50CisgKiBrb2JqZWN0X3VldmVudF9lbnYgLSBzZW5kIGFuIHVldmVudCB3aXRoIGVudmlyb25tZW50YWwgZGF0YQogICoKLSAqIEBhY3Rpb246IGFjdGlvbiB0aGF0IGlzIGhhcHBlbmluZyAodXN1YWxseSBLT0JKX0FERCBhbmQgS09CSl9SRU1PVkUpCisgKiBAYWN0aW9uOiBhY3Rpb24gdGhhdCBpcyBoYXBwZW5pbmcgKHVzdWFsbHkgS09CSl9NT1ZFKQogICogQGtvYmo6IHN0cnVjdCBrb2JqZWN0IHRoYXQgdGhlIGFjdGlvbiBpcyBoYXBwZW5pbmcgdG8KKyAqIEBlbnZwX2V4dDogcG9pbnRlciB0byBlbnZpcm9ubWVudGFsIGRhdGEKICAqLwotdm9pZCBrb2JqZWN0X3VldmVudChzdHJ1Y3Qga29iamVjdCAqa29iaiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24pCit2b2lkIGtvYmplY3RfdWV2ZW50X2VudihzdHJ1Y3Qga29iamVjdCAqa29iaiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24sCisJCQljaGFyICplbnZwX2V4dFtdKQogewogCWNoYXIgKiplbnZwOwogCWNoYXIgKmJ1ZmZlcjsKQEAgLTc2LDYgKzgwLDcgQEAKIAljaGFyICpzZXFfYnVmZjsKIAlpbnQgaSA9IDA7CiAJaW50IHJldHZhbDsKKwlpbnQgajsKIAogCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMTM0LDcgKzEzOSw4IEBACiAJc2NyYXRjaCArPSBzcHJpbnRmIChzY3JhdGNoLCAiREVWUEFUSD0lcyIsIGRldnBhdGgpICsgMTsKIAllbnZwIFtpKytdID0gc2NyYXRjaDsKIAlzY3JhdGNoICs9IHNwcmludGYoc2NyYXRjaCwgIlNVQlNZU1RFTT0lcyIsIHN1YnN5c3RlbSkgKyAxOwotCisJZm9yIChqID0gMDsgZW52cF9leHQgJiYgZW52cF9leHRbal07IGorKykKKwkJZW52cFtpKytdID0gZW52cF9leHRbal07CiAJLyoganVzdCByZXNlcnZlIHRoZSBzcGFjZSwgb3ZlcndyaXRlIGl0IGFmdGVyIGtzZXQgY2FsbCBoYXMgcmV0dXJuZWQgKi8KIAllbnZwW2krK10gPSBzZXFfYnVmZiA9IHNjcmF0Y2g7CiAJc2NyYXRjaCArPSBzdHJsZW4oIlNFUU5VTT0xODQ0Njc0NDA3MzcwOTU1MTYxNiIpICsgMTsKQEAgLTIwMCw2ICsyMDYsMjAgQEAKIAlrZnJlZShlbnZwKTsKIAlyZXR1cm47CiB9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGtvYmplY3RfdWV2ZW50X2Vudik7CisKKy8qKgorICoga29iamVjdF91ZXZlbnQgLSBub3RpZnkgdXNlcnNwYWNlIGJ5IGVuZGluZyBhbiB1ZXZlbnQKKyAqCisgKiBAYWN0aW9uOiBhY3Rpb24gdGhhdCBpcyBoYXBwZW5pbmcgKHVzdWFsbHkgS09CSl9BREQgYW5kIEtPQkpfUkVNT1ZFKQorICogQGtvYmo6IHN0cnVjdCBrb2JqZWN0IHRoYXQgdGhlIGFjdGlvbiBpcyBoYXBwZW5pbmcgdG8KKyAqLwordm9pZCBrb2JqZWN0X3VldmVudChzdHJ1Y3Qga29iamVjdCAqa29iaiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24pCit7CisJa29iamVjdF91ZXZlbnRfZW52KGtvYmosIGFjdGlvbiwgTlVMTCk7Cit9CisKIEVYUE9SVF9TWU1CT0xfR1BMKGtvYmplY3RfdWV2ZW50KTsKIAogLyoqCmRpZmYgLS1naXQgYS9saWIvbGlzdF9kZWJ1Zy5jIGIvbGliL2xpc3RfZGVidWcuYwppbmRleCA3YmE5ZDgyLi40MzUwYmE5IDEwMDY0NAotLS0gYS9saWIvbGlzdF9kZWJ1Zy5jCisrKyBiL2xpYi9saXN0X2RlYnVnLmMKQEAgLTIxLDEzICsyMSwxNSBAQAogCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCkKIHsKIAlpZiAodW5saWtlbHkobmV4dC0+cHJldiAhPSBwcmV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgImxpc3RfYWRkIGNvcnJ1cHRpb24uIG5leHQtPnByZXYgc2hvdWxkIGJlICVwLCBidXQgd2FzICVwXG4iLAotCQkJcHJldiwgbmV4dC0+cHJldik7CisJCXByaW50ayhLRVJOX0VSUiAibGlzdF9hZGQgY29ycnVwdGlvbi4gbmV4dC0+cHJldiBzaG91bGQgYmUgIgorCQkJInByZXYgKCVwKSwgYnV0IHdhcyAlcC4gKG5leHQ9JXApLlxuIiwKKwkJCXByZXYsIG5leHQtPnByZXYsIG5leHQpOwogCQlCVUcoKTsKIAl9CiAJaWYgKHVubGlrZWx5KHByZXYtPm5leHQgIT0gbmV4dCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsaXN0X2FkZCBjb3JydXB0aW9uLiBwcmV2LT5uZXh0IHNob3VsZCBiZSAlcCwgYnV0IHdhcyAlcFxuIiwKLQkJCW5leHQsIHByZXYtPm5leHQpOworCQlwcmludGsoS0VSTl9FUlIgImxpc3RfYWRkIGNvcnJ1cHRpb24uIHByZXYtPm5leHQgc2hvdWxkIGJlICIKKwkJCSJuZXh0ICglcCksIGJ1dCB3YXMgJXAuIChwcmV2PSVwKS5cbiIsCisJCQluZXh0LCBwcmV2LT5uZXh0LCBwcmV2KTsKIAkJQlVHKCk7CiAJfQogCW5leHQtPnByZXYgPSBuZXc7CmRpZmYgLS1naXQgYS9saWIvbG9ja2luZy1zZWxmdGVzdC5jIGIvbGliL2xvY2tpbmctc2VsZnRlc3QuYwppbmRleCA3OTQ1Nzg3Li4yODAzMzJjIDEwMDY0NAotLS0gYS9saWIvbG9ja2luZy1zZWxmdGVzdC5jCisrKyBiL2xpYi9sb2NraW5nLXNlbGZ0ZXN0LmMKQEAgLTk2Myw3ICs5NjMsOSBAQAogCQkJcHJpbnRrKCJmYWlsZWR8Iik7CiAJCX0gZWxzZSB7CiAJCQl1bmV4cGVjdGVkX3Rlc3RjYXNlX2ZhaWx1cmVzKys7CisKIAkJCXByaW50aygiRkFJTEVEfCIpOworCQkJZHVtcF9zdGFjaygpOwogCQl9CiAJfSBlbHNlIHsKIAkJdGVzdGNhc2Vfc3VjY2Vzc2VzKys7CmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCBhYTliZmQwLi5kNjlkZGJlIDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTIsNiArMiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTW9tY2hpbCBWZWxpa292CiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcKICAqIENvcHlyaWdodCAoQykgMjAwNSBTR0ksIENocmlzdG9waCBMYW1ldGVyIDxjbGFtZXRlckBzZ2kuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2IE5pY2sgUGlnZ2luCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTMwLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC00NSw3ICs0Nyw5IEBACiAJKChSQURJWF9UUkVFX01BUF9TSVpFICsgQklUU19QRVJfTE9ORyAtIDEpIC8gQklUU19QRVJfTE9ORykKIAogc3RydWN0IHJhZGl4X3RyZWVfbm9kZSB7CisJdW5zaWduZWQgaW50CWhlaWdodDsJCS8qIEhlaWdodCBmcm9tIHRoZSBib3R0b20gKi8KIAl1bnNpZ25lZCBpbnQJY291bnQ7CisJc3RydWN0IHJjdV9oZWFkCXJjdV9oZWFkOwogCXZvaWQJCSpzbG90c1tSQURJWF9UUkVFX01BUF9TSVpFXTsKIAl1bnNpZ25lZCBsb25nCXRhZ3NbUkFESVhfVFJFRV9NQVhfVEFHU11bUkFESVhfVFJFRV9UQUdfTE9OR1NdOwogfTsKQEAgLTYzLDcgKzY3LDcgQEAKIC8qCiAgKiBSYWRpeCB0cmVlIG5vZGUgY2FjaGUuCiAgKi8KLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnJhZGl4X3RyZWVfbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJhZGl4X3RyZWVfbm9kZV9jYWNoZXA7CiAKIC8qCiAgKiBQZXItY3B1IHBvb2wgb2YgcHJlbG9hZGVkIG5vZGVzCkBAIC0xMDAsMTMgKzEwNCwyMSBAQAogCQkJcnRwLT5uci0tOwogCQl9CiAJfQorCUJVR19PTihyYWRpeF90cmVlX2lzX2RpcmVjdF9wdHIocmV0KSk7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgcmFkaXhfdHJlZV9ub2RlX3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlID0KKwkJCWNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlLCByY3VfaGVhZCk7CisJa21lbV9jYWNoZV9mcmVlKHJhZGl4X3RyZWVfbm9kZV9jYWNoZXAsIG5vZGUpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQKIHJhZGl4X3RyZWVfbm9kZV9mcmVlKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUpCiB7Ci0Ja21lbV9jYWNoZV9mcmVlKHJhZGl4X3RyZWVfbm9kZV9jYWNoZXAsIG5vZGUpOworCWNhbGxfcmN1KCZub2RlLT5yY3VfaGVhZCwgcmFkaXhfdHJlZV9ub2RlX3JjdV9mcmVlKTsKIH0KIAogLyoKQEAgLTIyMiwxMSArMjM0LDEyIEBACiAJfQogCiAJZG8geworCQl1bnNpZ25lZCBpbnQgbmV3aGVpZ2h0OwogCQlpZiAoIShub2RlID0gcmFkaXhfdHJlZV9ub2RlX2FsbG9jKHJvb3QpKSkKIAkJCXJldHVybiAtRU5PTUVNOwogCiAJCS8qIEluY3JlYXNlIHRoZSBoZWlnaHQuICAqLwotCQlub2RlLT5zbG90c1swXSA9IHJvb3QtPnJub2RlOworCQlub2RlLT5zbG90c1swXSA9IHJhZGl4X3RyZWVfZGlyZWN0X3RvX3B0cihyb290LT5ybm9kZSk7CiAKIAkJLyogUHJvcGFnYXRlIHRoZSBhZ2dyZWdhdGVkIHRhZyBpbmZvIGludG8gdGhlIG5ldyByb290ICovCiAJCWZvciAodGFnID0gMDsgdGFnIDwgUkFESVhfVFJFRV9NQVhfVEFHUzsgdGFnKyspIHsKQEAgLTIzNCw5ICsyNDcsMTEgQEAKIAkJCQl0YWdfc2V0KG5vZGUsIHRhZywgMCk7CiAJCX0KIAorCQluZXdoZWlnaHQgPSByb290LT5oZWlnaHQrMTsKKwkJbm9kZS0+aGVpZ2h0ID0gbmV3aGVpZ2h0OwogCQlub2RlLT5jb3VudCA9IDE7Ci0JCXJvb3QtPnJub2RlID0gbm9kZTsKLQkJcm9vdC0+aGVpZ2h0Kys7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihyb290LT5ybm9kZSwgbm9kZSk7CisJCXJvb3QtPmhlaWdodCA9IG5ld2hlaWdodDsKIAl9IHdoaWxlIChoZWlnaHQgPiByb290LT5oZWlnaHQpOwogb3V0OgogCXJldHVybiAwOwpAQCAtMjU4LDYgKzI3Myw4IEBACiAJaW50IG9mZnNldDsKIAlpbnQgZXJyb3I7CiAKKwlCVUdfT04ocmFkaXhfdHJlZV9pc19kaXJlY3RfcHRyKGl0ZW0pKTsKKwogCS8qIE1ha2Ugc3VyZSB0aGUgdHJlZSBpcyBoaWdoIGVub3VnaC4gICovCiAJaWYgKGluZGV4ID4gcmFkaXhfdHJlZV9tYXhpbmRleChyb290LT5oZWlnaHQpKSB7CiAJCWVycm9yID0gcmFkaXhfdHJlZV9leHRlbmQocm9vdCwgaW5kZXgpOwpAQCAtMjc1LDExICsyOTIsMTIgQEAKIAkJCS8qIEhhdmUgdG8gYWRkIGEgY2hpbGQgbm9kZS4gICovCiAJCQlpZiAoIShzbG90ID0gcmFkaXhfdHJlZV9ub2RlX2FsbG9jKHJvb3QpKSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXNsb3QtPmhlaWdodCA9IGhlaWdodDsKIAkJCWlmIChub2RlKSB7Ci0JCQkJbm9kZS0+c2xvdHNbb2Zmc2V0XSA9IHNsb3Q7CisJCQkJcmN1X2Fzc2lnbl9wb2ludGVyKG5vZGUtPnNsb3RzW29mZnNldF0sIHNsb3QpOwogCQkJCW5vZGUtPmNvdW50Kys7CiAJCQl9IGVsc2UKLQkJCQlyb290LT5ybm9kZSA9IHNsb3Q7CisJCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHJvb3QtPnJub2RlLCBzbG90KTsKIAkJfQogCiAJCS8qIEdvIGEgbGV2ZWwgZG93biAqLwpAQCAtMjk1LDExICszMTMsMTEgQEAKIAogCWlmIChub2RlKSB7CiAJCW5vZGUtPmNvdW50Kys7Ci0JCW5vZGUtPnNsb3RzW29mZnNldF0gPSBpdGVtOworCQlyY3VfYXNzaWduX3BvaW50ZXIobm9kZS0+c2xvdHNbb2Zmc2V0XSwgaXRlbSk7CiAJCUJVR19PTih0YWdfZ2V0KG5vZGUsIDAsIG9mZnNldCkpOwogCQlCVUdfT04odGFnX2dldChub2RlLCAxLCBvZmZzZXQpKTsKIAl9IGVsc2UgewotCQlyb290LT5ybm9kZSA9IGl0ZW07CisJCXJjdV9hc3NpZ25fcG9pbnRlcihyb290LT5ybm9kZSwgcmFkaXhfdHJlZV9wdHJfdG9fZGlyZWN0KGl0ZW0pKTsKIAkJQlVHX09OKHJvb3RfdGFnX2dldChyb290LCAwKSk7CiAJCUJVR19PTihyb290X3RhZ19nZXQocm9vdCwgMSkpOwogCX0KQEAgLTMwOCw0OCArMzI2LDUzIEBACiB9CiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfaW5zZXJ0KTsKIAotc3RhdGljIGlubGluZSB2b2lkICoqX19sb29rdXBfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgaW5kZXgpCi17Ci0JdW5zaWduZWQgaW50IGhlaWdodCwgc2hpZnQ7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqKnNsb3Q7Ci0KLQloZWlnaHQgPSByb290LT5oZWlnaHQ7Ci0KLQlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGhlaWdodCA9PSAwICYmIHJvb3QtPnJub2RlKQotCQlyZXR1cm4gKHZvaWQgKiopJnJvb3QtPnJub2RlOwotCi0Jc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7Ci0Jc2xvdCA9ICZyb290LT5ybm9kZTsKLQotCXdoaWxlIChoZWlnaHQgPiAwKSB7Ci0JCWlmICgqc2xvdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqKQotCQkJKCgqc2xvdCktPnNsb3RzICsKLQkJCQkoKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0spKTsKLQkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7Ci0JCWhlaWdodC0tOwotCX0KLQotCXJldHVybiAodm9pZCAqKilzbG90OwotfQotCiAvKioKICAqCXJhZGl4X3RyZWVfbG9va3VwX3Nsb3QgICAgLSAgICBsb29rdXAgYSBzbG90IGluIGEgcmFkaXggdHJlZQogICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKICAqCUBpbmRleDoJCWluZGV4IGtleQogICoKLSAqCUxvb2t1cCB0aGUgc2xvdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwb3NpdGlvbiBAaW5kZXggaW4gdGhlIHJhZGl4IHRyZWUKLSAqCUByb290LiBUaGlzIGlzIHVzZWZ1bCBmb3IgdXBkYXRlLWlmLWV4aXN0cyBvcGVyYXRpb25zLgorICoJUmV0dXJuczogIHRoZSBzbG90IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvc2l0aW9uIEBpbmRleCBpbiB0aGUKKyAqCXJhZGl4IHRyZWUgQHJvb3QuIFRoaXMgaXMgdXNlZnVsIGZvciB1cGRhdGUtaWYtZXhpc3RzIG9wZXJhdGlvbnMuCisgKgorICoJVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2ssIGl0IG11c3QgYmUKKyAqCWV4Y2x1ZGVkIGZyb20gd3JpdGVycywgYXMgbXVzdCB0aGUgcmV0dXJuZWQgc2xvdCBmb3Igc3Vic2VxdWVudAorICoJdXNlIGJ5IHJhZGl4X3RyZWVfZGVyZWZfc2xvdCgpIGFuZCByYWRpeF90cmVlX3JlcGxhY2Ugc2xvdC4KKyAqCUNhbGxlciBtdXN0IGhvbGQgdHJlZSB3cml0ZSBsb2NrZWQgYWNyb3NzIHNsb3QgbG9va3VwIGFuZAorICoJcmVwbGFjZS4KICAqLwogdm9pZCAqKnJhZGl4X3RyZWVfbG9va3VwX3Nsb3Qoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBpbmRleCkKIHsKLQlyZXR1cm4gX19sb29rdXBfc2xvdChyb290LCBpbmRleCk7CisJdW5zaWduZWQgaW50IGhlaWdodCwgc2hpZnQ7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwgKipzbG90OworCisJbm9kZSA9IHJvb3QtPnJub2RlOworCWlmIChub2RlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKHJhZGl4X3RyZWVfaXNfZGlyZWN0X3B0cihub2RlKSkgeworCQlpZiAoaW5kZXggPiAwKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAodm9pZCAqKikmcm9vdC0+cm5vZGU7CisJfQorCisJaGVpZ2h0ID0gbm9kZS0+aGVpZ2h0OworCWlmIChpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgoaGVpZ2h0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzaGlmdCA9IChoZWlnaHQtMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKKworCWRvIHsKKwkJc2xvdCA9IChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqKQorCQkJKG5vZGUtPnNsb3RzICsgKChpbmRleD4+c2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSykpOworCQlub2RlID0gKnNsb3Q7CisJCWlmIChub2RlID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKKwkJaGVpZ2h0LS07CisJfSB3aGlsZSAoaGVpZ2h0ID4gMCk7CisKKwlyZXR1cm4gKHZvaWQgKiopc2xvdDsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9sb29rdXBfc2xvdCk7CiAKQEAgLTM1OSwxMyArMzgyLDQ1IEBACiAgKglAaW5kZXg6CQlpbmRleCBrZXkKICAqCiAgKglMb29rdXAgdGhlIGl0ZW0gYXQgdGhlIHBvc2l0aW9uIEBpbmRleCBpbiB0aGUgcmFkaXggdHJlZSBAcm9vdC4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdW5kZXIgcmN1X3JlYWRfbG9jaywgaG93ZXZlciB0aGUgY2FsbGVyCisgKgltdXN0IG1hbmFnZSBsaWZldGltZXMgb2YgbGVhZiBub2RlcyAoZWcuIFJDVSBtYXkgYWxzbyBiZSB1c2VkIHRvIGZyZWUKKyAqCXRoZW0gc2FmZWx5KS4gTm8gUkNVIGJhcnJpZXJzIGFyZSByZXF1aXJlZCB0byBhY2Nlc3Mgb3IgbW9kaWZ5IHRoZQorICoJcmV0dXJuZWQgaXRlbSwgaG93ZXZlci4KICAqLwogdm9pZCAqcmFkaXhfdHJlZV9sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBpbmRleCkKIHsKLQl2b2lkICoqc2xvdDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLCAqKnNsb3Q7CiAKLQlzbG90ID0gX19sb29rdXBfc2xvdChyb290LCBpbmRleCk7Ci0JcmV0dXJuIHNsb3QgIT0gTlVMTCA/ICpzbG90IDogTlVMTDsKKwlub2RlID0gcmN1X2RlcmVmZXJlbmNlKHJvb3QtPnJub2RlKTsKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChyYWRpeF90cmVlX2lzX2RpcmVjdF9wdHIobm9kZSkpIHsKKwkJaWYgKGluZGV4ID4gMCkKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gcmFkaXhfdHJlZV9kaXJlY3RfdG9fcHRyKG5vZGUpOworCX0KKworCWhlaWdodCA9IG5vZGUtPmhlaWdodDsKKwlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdodCkpCisJCXJldHVybiBOVUxMOworCisJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CisKKwlkbyB7CisJCXNsb3QgPSAoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqKikKKwkJCShub2RlLT5zbG90cyArICgoaW5kZXg+PnNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0spKTsKKwkJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZSgqc2xvdCk7CisJCWlmIChub2RlID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKKwkJaGVpZ2h0LS07CisJfSB3aGlsZSAoaGVpZ2h0ID4gMCk7CisKKwlyZXR1cm4gbm9kZTsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9sb29rdXApOwogCkBAIC00OTUsMjcgKzU1MCwzMCBAQAogCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgaW50IHRhZykKIHsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7CiAJaW50IHNhd191bnNldF90YWcgPSAwOwogCi0JaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OwotCWlmIChpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgoaGVpZ2h0KSkKLQkJcmV0dXJuIDA7Ci0KIAkvKiBjaGVjayB0aGUgcm9vdCdzIHRhZyBiaXQgKi8KIAlpZiAoIXJvb3RfdGFnX2dldChyb290LCB0YWcpKQogCQlyZXR1cm4gMDsKIAotCWlmIChoZWlnaHQgPT0gMCkKLQkJcmV0dXJuIDE7CisJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShyb290LT5ybm9kZSk7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocmFkaXhfdHJlZV9pc19kaXJlY3RfcHRyKG5vZGUpKQorCQlyZXR1cm4gKGluZGV4ID09IDApOworCisJaGVpZ2h0ID0gbm9kZS0+aGVpZ2h0OworCWlmIChpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgoaGVpZ2h0KSkKKwkJcmV0dXJuIDA7CiAKIAlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwotCXNsb3QgPSByb290LT5ybm9kZTsKIAogCWZvciAoIDsgOyApIHsKIAkJaW50IG9mZnNldDsKIAotCQlpZiAoc2xvdCA9PSBOVUxMKQorCQlpZiAobm9kZSA9PSBOVUxMKQogCQkJcmV0dXJuIDA7CiAKIAkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7CkBAIC01MjQsMTUgKzU4MiwxNSBAQAogCQkgKiBUaGlzIGlzIGp1c3QgYSBkZWJ1ZyBjaGVjay4gIExhdGVyLCB3ZSBjYW4gYmFsZSBhcyBzb29uIGFzCiAJCSAqIHdlIHNlZSBhbiB1bnNldCB0YWcuCiAJCSAqLwotCQlpZiAoIXRhZ19nZXQoc2xvdCwgdGFnLCBvZmZzZXQpKQorCQlpZiAoIXRhZ19nZXQobm9kZSwgdGFnLCBvZmZzZXQpKQogCQkJc2F3X3Vuc2V0X3RhZyA9IDE7CiAJCWlmIChoZWlnaHQgPT0gMSkgewotCQkJaW50IHJldCA9IHRhZ19nZXQoc2xvdCwgdGFnLCBvZmZzZXQpOworCQkJaW50IHJldCA9IHRhZ19nZXQobm9kZSwgdGFnLCBvZmZzZXQpOwogCiAJCQlCVUdfT04ocmV0ICYmIHNhd191bnNldF90YWcpOwogCQkJcmV0dXJuICEhcmV0OwogCQl9Ci0JCXNsb3QgPSBzbG90LT5zbG90c1tvZmZzZXRdOworCQlub2RlID0gcmN1X2RlcmVmZXJlbmNlKG5vZGUtPnNsb3RzW29mZnNldF0pOwogCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKIAkJaGVpZ2h0LS07CiAJfQpAQCAtNTQxLDQ3ICs1OTksNDUgQEAKICNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1fX2xvb2t1cChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoqcmVzdWx0cywgdW5zaWduZWQgbG9uZyBpbmRleCwKK19fbG9va3VwKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3QsIHZvaWQgKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nIGluZGV4LAogCXVuc2lnbmVkIGludCBtYXhfaXRlbXMsIHVuc2lnbmVkIGxvbmcgKm5leHRfaW5kZXgpCiB7CiAJdW5zaWduZWQgaW50IG5yX2ZvdW5kID0gMDsKIAl1bnNpZ25lZCBpbnQgc2hpZnQsIGhlaWdodDsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OwogCXVuc2lnbmVkIGxvbmcgaTsKIAotCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKLQlpZiAoaGVpZ2h0ID09IDApIHsKLQkJaWYgKHJvb3QtPnJub2RlICYmIGluZGV4ID09IDApCi0JCQlyZXN1bHRzW25yX2ZvdW5kKytdID0gcm9vdC0+cm5vZGU7CisJaGVpZ2h0ID0gc2xvdC0+aGVpZ2h0OworCWlmIChoZWlnaHQgPT0gMCkKIAkJZ290byBvdXQ7Ci0JfQotCiAJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7Ci0Jc2xvdCA9IHJvb3QtPnJub2RlOwogCiAJZm9yICggOyBoZWlnaHQgPiAxOyBoZWlnaHQtLSkgewotCi0JCWZvciAoaSA9IChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLIDsKLQkJCQlpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsrKSB7CisJCWkgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKKwkJZm9yICg7OykgewogCQkJaWYgKHNsb3QtPnNsb3RzW2ldICE9IE5VTEwpCiAJCQkJYnJlYWs7CiAJCQlpbmRleCAmPSB+KCgxVUwgPDwgc2hpZnQpIC0gMSk7CiAJCQlpbmRleCArPSAxVUwgPDwgc2hpZnQ7CiAJCQlpZiAoaW5kZXggPT0gMCkKIAkJCQlnb3RvIG91dDsJLyogMzItYml0IHdyYXBhcm91bmQgKi8KKwkJCWkrKzsKKwkJCWlmIChpID09IFJBRElYX1RSRUVfTUFQX1NJWkUpCisJCQkJZ290byBvdXQ7CiAJCX0KLQkJaWYgKGkgPT0gUkFESVhfVFJFRV9NQVBfU0laRSkKLQkJCWdvdG8gb3V0OwogCiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwotCQlzbG90ID0gc2xvdC0+c2xvdHNbaV07CisJCXNsb3QgPSByY3VfZGVyZWZlcmVuY2Uoc2xvdC0+c2xvdHNbaV0pOworCQlpZiAoc2xvdCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CiAJfQogCiAJLyogQm90dG9tIGxldmVsOiBncmFiIHNvbWUgaXRlbXMgKi8KIAlmb3IgKGkgPSBpbmRleCAmIFJBRElYX1RSRUVfTUFQX01BU0s7IGkgPCBSQURJWF9UUkVFX01BUF9TSVpFOyBpKyspIHsKKwkJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKIAkJaW5kZXgrKzsKLQkJaWYgKHNsb3QtPnNsb3RzW2ldKSB7Ci0JCQlyZXN1bHRzW25yX2ZvdW5kKytdID0gc2xvdC0+c2xvdHNbaV07CisJCW5vZGUgPSBzbG90LT5zbG90c1tpXTsKKwkJaWYgKG5vZGUpIHsKKwkJCXJlc3VsdHNbbnJfZm91bmQrK10gPSByY3VfZGVyZWZlcmVuY2Uobm9kZSk7CiAJCQlpZiAobnJfZm91bmQgPT0gbWF4X2l0ZW1zKQogCQkJCWdvdG8gb3V0OwogCQl9CkBAIC02MDMsMjggKzY1OSw1MSBAQAogICoJKkByZXN1bHRzLgogICoKICAqCVRoZSBpbXBsZW1lbnRhdGlvbiBpcyBuYWl2ZS4KKyAqCisgKglMaWtlIHJhZGl4X3RyZWVfbG9va3VwLCByYWRpeF90cmVlX2dhbmdfbG9va3VwIG1heSBiZSBjYWxsZWQgdW5kZXIKKyAqCXJjdV9yZWFkX2xvY2suIEluIHRoaXMgY2FzZSwgcmF0aGVyIHRoYW4gdGhlIHJldHVybmVkIHJlc3VsdHMgYmVpbmcKKyAqCWFuIGF0b21pYyBzbmFwc2hvdCBvZiB0aGUgdHJlZSBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lLCB0aGUgc2VtYW50aWNzCisgKglvZiBhbiBSQ1UgcHJvdGVjdGVkIGdhbmcgbG9va3VwIGFyZSBhcyB0aG91Z2ggbXVsdGlwbGUgcmFkaXhfdHJlZV9sb29rdXBzCisgKgloYXZlIGJlZW4gaXNzdWVkIGluIGluZGl2aWR1YWwgbG9ja3MsIGFuZCByZXN1bHRzIHN0b3JlZCBpbiAncmVzdWx0cycuCiAgKi8KIHVuc2lnbmVkIGludAogcmFkaXhfdHJlZV9nYW5nX2xvb2t1cChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoqcmVzdWx0cywKIAkJCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsIHVuc2lnbmVkIGludCBtYXhfaXRlbXMpCiB7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBtYXhfaW5kZXggPSByYWRpeF90cmVlX21heGluZGV4KHJvb3QtPmhlaWdodCk7CisJdW5zaWduZWQgbG9uZyBtYXhfaW5kZXg7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKIAl1bnNpZ25lZCBsb25nIGN1cl9pbmRleCA9IGZpcnN0X2luZGV4OwotCXVuc2lnbmVkIGludCByZXQgPSAwOworCXVuc2lnbmVkIGludCByZXQ7CiAKKwlub2RlID0gcmN1X2RlcmVmZXJlbmNlKHJvb3QtPnJub2RlKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAwOworCisJaWYgKHJhZGl4X3RyZWVfaXNfZGlyZWN0X3B0cihub2RlKSkgeworCQlpZiAoZmlyc3RfaW5kZXggPiAwKQorCQkJcmV0dXJuIDA7CisJCW5vZGUgPSByYWRpeF90cmVlX2RpcmVjdF90b19wdHIobm9kZSk7CisJCXJlc3VsdHNbMF0gPSByY3VfZGVyZWZlcmVuY2Uobm9kZSk7CisJCXJldHVybiAxOworCX0KKworCW1heF9pbmRleCA9IHJhZGl4X3RyZWVfbWF4aW5kZXgobm9kZS0+aGVpZ2h0KTsKKworCXJldCA9IDA7CiAJd2hpbGUgKHJldCA8IG1heF9pdGVtcykgewogCQl1bnNpZ25lZCBpbnQgbnJfZm91bmQ7CiAJCXVuc2lnbmVkIGxvbmcgbmV4dF9pbmRleDsJLyogSW5kZXggb2YgbmV4dCBzZWFyY2ggKi8KIAogCQlpZiAoY3VyX2luZGV4ID4gbWF4X2luZGV4KQogCQkJYnJlYWs7Ci0JCW5yX2ZvdW5kID0gX19sb29rdXAocm9vdCwgcmVzdWx0cyArIHJldCwgY3VyX2luZGV4LAorCQlucl9mb3VuZCA9IF9fbG9va3VwKG5vZGUsIHJlc3VsdHMgKyByZXQsIGN1cl9pbmRleCwKIAkJCQkJbWF4X2l0ZW1zIC0gcmV0LCAmbmV4dF9pbmRleCk7CiAJCXJldCArPSBucl9mb3VuZDsKIAkJaWYgKG5leHRfaW5kZXggPT0gMCkKIAkJCWJyZWFrOwogCQljdXJfaW5kZXggPSBuZXh0X2luZGV4OwogCX0KKwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfZ2FuZ19sb29rdXApOwpAQCAtNjM0LDU1ICs3MTMsNjQgQEAKICAqIG9wZW4tY29kaW5nIHRoZSBzZWFyY2guCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQKLV9fbG9va3VwX3RhZyhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoqcmVzdWx0cywgdW5zaWduZWQgbG9uZyBpbmRleCwKK19fbG9va3VwX3RhZyhzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90LCB2b2lkICoqcmVzdWx0cywgdW5zaWduZWQgbG9uZyBpbmRleCwKIAl1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zLCB1bnNpZ25lZCBsb25nICpuZXh0X2luZGV4LCB1bnNpZ25lZCBpbnQgdGFnKQogewogCXVuc2lnbmVkIGludCBucl9mb3VuZCA9IDA7Ci0JdW5zaWduZWQgaW50IHNoaWZ0OwotCXVuc2lnbmVkIGludCBoZWlnaHQgPSByb290LT5oZWlnaHQ7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQsIGhlaWdodDsKIAotCWlmIChoZWlnaHQgPT0gMCkgewotCQlpZiAocm9vdC0+cm5vZGUgJiYgaW5kZXggPT0gMCkKLQkJCXJlc3VsdHNbbnJfZm91bmQrK10gPSByb290LT5ybm9kZTsKKwloZWlnaHQgPSBzbG90LT5oZWlnaHQ7CisJaWYgKGhlaWdodCA9PSAwKQogCQlnb3RvIG91dDsKLQl9CisJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAKLQlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwotCXNsb3QgPSByb290LT5ybm9kZTsKKwl3aGlsZSAoaGVpZ2h0ID4gMCkgeworCQl1bnNpZ25lZCBsb25nIGkgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSyA7CiAKLQlkbyB7Ci0JCXVuc2lnbmVkIGxvbmcgaSA9IChpbmRleCA+PiBzaGlmdCkgJiBSQURJWF9UUkVFX01BUF9NQVNLOwotCi0JCWZvciAoIDsgaSA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGkrKykgewotCQkJaWYgKHRhZ19nZXQoc2xvdCwgdGFnLCBpKSkgewotCQkJCUJVR19PTihzbG90LT5zbG90c1tpXSA9PSBOVUxMKTsKKwkJZm9yICg7OykgeworCQkJaWYgKHRhZ19nZXQoc2xvdCwgdGFnLCBpKSkKIAkJCQlicmVhazsKLQkJCX0KIAkJCWluZGV4ICY9IH4oKDFVTCA8PCBzaGlmdCkgLSAxKTsKIAkJCWluZGV4ICs9IDFVTCA8PCBzaGlmdDsKIAkJCWlmIChpbmRleCA9PSAwKQogCQkJCWdvdG8gb3V0OwkvKiAzMi1iaXQgd3JhcGFyb3VuZCAqLworCQkJaSsrOworCQkJaWYgKGkgPT0gUkFESVhfVFJFRV9NQVBfU0laRSkKKwkJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAoaSA9PSBSQURJWF9UUkVFX01BUF9TSVpFKQotCQkJZ290byBvdXQ7CiAJCWhlaWdodC0tOwogCQlpZiAoaGVpZ2h0ID09IDApIHsJLyogQm90dG9tIGxldmVsOiBncmFiIHNvbWUgaXRlbXMgKi8KIAkJCXVuc2lnbmVkIGxvbmcgaiA9IGluZGV4ICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKIAogCQkJZm9yICggOyBqIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaisrKSB7CisJCQkJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKIAkJCQlpbmRleCsrOwotCQkJCWlmICh0YWdfZ2V0KHNsb3QsIHRhZywgaikpIHsKLQkJCQkJQlVHX09OKHNsb3QtPnNsb3RzW2pdID09IE5VTEwpOwotCQkJCQlyZXN1bHRzW25yX2ZvdW5kKytdID0gc2xvdC0+c2xvdHNbal07CisJCQkJaWYgKCF0YWdfZ2V0KHNsb3QsIHRhZywgaikpCisJCQkJCWNvbnRpbnVlOworCQkJCW5vZGUgPSBzbG90LT5zbG90c1tqXTsKKwkJCQkvKgorCQkJCSAqIEV2ZW4gdGhvdWdoIHRoZSB0YWcgd2FzIGZvdW5kIHNldCwgd2UgbmVlZCB0bworCQkJCSAqIHJlY2hlY2sgdGhhdCB3ZSBoYXZlIGEgbm9uLU5VTEwgbm9kZSwgYmVjYXVzZQorCQkJCSAqIGlmIHRoaXMgbG9va3VwIGlzIGxvY2tsZXNzLCBpdCBtYXkgaGF2ZSBiZWVuCisJCQkJICogc3Vic2VxdWVudGx5IGRlbGV0ZWQuCisJCQkJICoKKwkJCQkgKiBTaW1pbGFyIGNhcmUgbXVzdCBiZSB0YWtlbiBpbiBhbnkgcGxhY2UgdGhhdAorCQkJCSAqIGxvb2t1cCAtPnNsb3RzW3hdIHdpdGhvdXQgYSBsb2NrIChpZS4gY2FuJ3QKKwkJCQkgKiByZWx5IG9uIGl0cyB2YWx1ZSByZW1haW5pbmcgdGhlIHNhbWUpLgorCQkJCSAqLworCQkJCWlmIChub2RlKSB7CisJCQkJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2Uobm9kZSk7CisJCQkJCXJlc3VsdHNbbnJfZm91bmQrK10gPSBub2RlOwogCQkJCQlpZiAobnJfZm91bmQgPT0gbWF4X2l0ZW1zKQogCQkJCQkJZ290byBvdXQ7CiAJCQkJfQogCQkJfQogCQl9CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwotCQlzbG90ID0gc2xvdC0+c2xvdHNbaV07Ci0JfSB3aGlsZSAoaGVpZ2h0ID4gMCk7CisJCXNsb3QgPSByY3VfZGVyZWZlcmVuY2Uoc2xvdC0+c2xvdHNbaV0pOworCQlpZiAoc2xvdCA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQogb3V0OgogCSpuZXh0X2luZGV4ID0gaW5kZXg7CiAJcmV0dXJuIG5yX2ZvdW5kOwpAQCAtNzA2LDI3ICs3OTQsNDQgQEAKIAkJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcywKIAkJdW5zaWduZWQgaW50IHRhZykKIHsKLQljb25zdCB1bnNpZ25lZCBsb25nIG1heF9pbmRleCA9IHJhZGl4X3RyZWVfbWF4aW5kZXgocm9vdC0+aGVpZ2h0KTsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOworCXVuc2lnbmVkIGxvbmcgbWF4X2luZGV4OwogCXVuc2lnbmVkIGxvbmcgY3VyX2luZGV4ID0gZmlyc3RfaW5kZXg7Ci0JdW5zaWduZWQgaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IHJldDsKIAogCS8qIGNoZWNrIHRoZSByb290J3MgdGFnIGJpdCAqLwogCWlmICghcm9vdF90YWdfZ2V0KHJvb3QsIHRhZykpCiAJCXJldHVybiAwOwogCisJbm9kZSA9IHJjdV9kZXJlZmVyZW5jZShyb290LT5ybm9kZSk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gMDsKKworCWlmIChyYWRpeF90cmVlX2lzX2RpcmVjdF9wdHIobm9kZSkpIHsKKwkJaWYgKGZpcnN0X2luZGV4ID4gMCkKKwkJCXJldHVybiAwOworCQlub2RlID0gcmFkaXhfdHJlZV9kaXJlY3RfdG9fcHRyKG5vZGUpOworCQlyZXN1bHRzWzBdID0gcmN1X2RlcmVmZXJlbmNlKG5vZGUpOworCQlyZXR1cm4gMTsKKwl9CisKKwltYXhfaW5kZXggPSByYWRpeF90cmVlX21heGluZGV4KG5vZGUtPmhlaWdodCk7CisKKwlyZXQgPSAwOwogCXdoaWxlIChyZXQgPCBtYXhfaXRlbXMpIHsKIAkJdW5zaWduZWQgaW50IG5yX2ZvdW5kOwogCQl1bnNpZ25lZCBsb25nIG5leHRfaW5kZXg7CS8qIEluZGV4IG9mIG5leHQgc2VhcmNoICovCiAKIAkJaWYgKGN1cl9pbmRleCA+IG1heF9pbmRleCkKIAkJCWJyZWFrOwotCQlucl9mb3VuZCA9IF9fbG9va3VwX3RhZyhyb290LCByZXN1bHRzICsgcmV0LCBjdXJfaW5kZXgsCisJCW5yX2ZvdW5kID0gX19sb29rdXBfdGFnKG5vZGUsIHJlc3VsdHMgKyByZXQsIGN1cl9pbmRleCwKIAkJCQkJbWF4X2l0ZW1zIC0gcmV0LCAmbmV4dF9pbmRleCwgdGFnKTsKIAkJcmV0ICs9IG5yX2ZvdW5kOwogCQlpZiAobmV4dF9pbmRleCA9PSAwKQogCQkJYnJlYWs7CiAJCWN1cl9pbmRleCA9IG5leHRfaW5kZXg7CiAJfQorCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWcpOwpAQCAtNzQyLDggKzg0NywxOSBAQAogCQkJcm9vdC0+cm5vZGUtPmNvdW50ID09IDEgJiYKIAkJCXJvb3QtPnJub2RlLT5zbG90c1swXSkgewogCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICp0b19mcmVlID0gcm9vdC0+cm5vZGU7CisJCXZvaWQgKm5ld3B0cjsKIAotCQlyb290LT5ybm9kZSA9IHRvX2ZyZWUtPnNsb3RzWzBdOworCQkvKgorCQkgKiBXZSBkb24ndCBuZWVkIHJjdV9hc3NpZ25fcG9pbnRlcigpLCBzaW5jZSB3ZSBhcmUgc2ltcGx5CisJCSAqIG1vdmluZyB0aGUgbm9kZSBmcm9tIG9uZSBwYXJ0IG9mIHRoZSB0cmVlIHRvIGFub3RoZXIuIElmCisJCSAqIGl0IHdhcyBzYWZlIHRvIGRlcmVmZXJlbmNlIHRoZSBvbGQgcG9pbnRlciB0byBpdAorCQkgKiAodG9fZnJlZS0+c2xvdHNbMF0pLCBpdCB3aWxsIGJlIHNhZmUgdG8gZGVyZWZlcmVuY2UgdGhlIG5ldworCQkgKiBvbmUgKHJvb3QtPnJub2RlKS4KKwkJICovCisJCW5ld3B0ciA9IHRvX2ZyZWUtPnNsb3RzWzBdOworCQlpZiAocm9vdC0+aGVpZ2h0ID09IDEpCisJCQluZXdwdHIgPSByYWRpeF90cmVlX3B0cl90b19kaXJlY3QobmV3cHRyKTsKKwkJcm9vdC0+cm5vZGUgPSBuZXdwdHI7CiAJCXJvb3QtPmhlaWdodC0tOwogCQkvKiBtdXN0IG9ubHkgZnJlZSB6ZXJvZWQgbm9kZXMgaW50byB0aGUgc2xhYiAqLwogCQl0YWdfY2xlYXIodG9fZnJlZSwgMCwgMCk7CkBAIC03NjcsNiArODgzLDcgQEAKIHsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9wYXRoIHBhdGhbUkFESVhfVFJFRV9NQVhfUEFUSF0sICpwYXRocCA9IHBhdGg7CiAJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdCA9IE5VTEw7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqdG9fZnJlZTsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKIAlpbnQgdGFnOwogCWludCBvZmZzZXQ7CkBAIC03NzcsNiArODk0LDcgQEAKIAogCXNsb3QgPSByb290LT5ybm9kZTsKIAlpZiAoaGVpZ2h0ID09IDAgJiYgcm9vdC0+cm5vZGUpIHsKKwkJc2xvdCA9IHJhZGl4X3RyZWVfZGlyZWN0X3RvX3B0cihzbG90KTsKIAkJcm9vdF90YWdfY2xlYXJfYWxsKHJvb3QpOwogCQlyb290LT5ybm9kZSA9IE5VTEw7CiAJCWdvdG8gb3V0OwpAQCAtODA5LDEwICs5MjcsMTcgQEAKIAkJCXJhZGl4X3RyZWVfdGFnX2NsZWFyKHJvb3QsIGluZGV4LCB0YWcpOwogCX0KIAorCXRvX2ZyZWUgPSBOVUxMOwogCS8qIE5vdyBmcmVlIHRoZSBub2RlcyB3ZSBkbyBub3QgbmVlZCBhbnltb3JlICovCiAJd2hpbGUgKHBhdGhwLT5ub2RlKSB7CiAJCXBhdGhwLT5ub2RlLT5zbG90c1twYXRocC0+b2Zmc2V0XSA9IE5VTEw7CiAJCXBhdGhwLT5ub2RlLT5jb3VudC0tOworCQkvKgorCQkgKiBRdWV1ZSB0aGUgbm9kZSBmb3IgZGVmZXJyZWQgZnJlZWluZyBhZnRlciB0aGUKKwkJICogbGFzdCByZWZlcmVuY2UgdG8gaXQgZGlzYXBwZWFycyAoc2V0IE5VTEwsIGFib3ZlKS4KKwkJICovCisJCWlmICh0b19mcmVlKQorCQkJcmFkaXhfdHJlZV9ub2RlX2ZyZWUodG9fZnJlZSk7CiAKIAkJaWYgKHBhdGhwLT5ub2RlLT5jb3VudCkgewogCQkJaWYgKHBhdGhwLT5ub2RlID09IHJvb3QtPnJub2RlKQpAQCAtODIxLDEzICs5NDYsMTUgQEAKIAkJfQogCiAJCS8qIE5vZGUgd2l0aCB6ZXJvIHNsb3RzIGluIHVzZSBzbyBmcmVlIGl0ICovCi0JCXJhZGl4X3RyZWVfbm9kZV9mcmVlKHBhdGhwLT5ub2RlKTsKLQorCQl0b19mcmVlID0gcGF0aHAtPm5vZGU7CiAJCXBhdGhwLS07CisKIAl9CiAJcm9vdF90YWdfY2xlYXJfYWxsKHJvb3QpOwogCXJvb3QtPmhlaWdodCA9IDA7CiAJcm9vdC0+cm5vZGUgPSBOVUxMOworCWlmICh0b19mcmVlKQorCQlyYWRpeF90cmVlX25vZGVfZnJlZSh0b19mcmVlKTsKIAogb3V0OgogCXJldHVybiBzbG90OwpAQCAtODQ2LDcgKzk3Myw3IEBACiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfdGFnZ2VkKTsKIAogc3RhdGljIHZvaWQKLXJhZGl4X3RyZWVfbm9kZV9jdG9yKHZvaWQgKm5vZGUsIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorcmFkaXhfdHJlZV9ub2RlX2N0b3Iodm9pZCAqbm9kZSwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAltZW1zZXQobm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCByYWRpeF90cmVlX25vZGUpKTsKIH0KQEAgLTg2OSw3ICs5OTYsNiBAQAogCQloZWlnaHRfdG9fbWF4aW5kZXhbaV0gPSBfX21heGluZGV4KGkpOwogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgaW50IHJhZGl4X3RyZWVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaGNwdSkKQEAgLTg4OSw3ICsxMDE1LDYgQEAKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE5PVElGWV9PSzsKIH0KLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAogdm9pZCBfX2luaXQgcmFkaXhfdHJlZV9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9saWIvcmFuZG9tMzIuYyBiL2xpYi9yYW5kb20zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjN2Y4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmFuZG9tMzIuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAgVGhpcyBpcyBhIG1heGltYWxseSBlcXVpZGlzdHJpYnV0ZWQgY29tYmluZWQgVGF1c3dvcnRoZSBnZW5lcmF0b3IKKyAgYmFzZWQgb24gY29kZSBmcm9tIEdOVSBTY2llbnRpZmljIExpYnJhcnkgMS41ICgzMCBKdW4gMjAwNCkKKworICAgeF9uID0gKHMxX24gXiBzMl9uIF4gczNfbikKKworICAgczFfe24rMX0gPSAoKChzMV9uICYgNDI5NDk2NzI5NCkgPDwxMikgXiAoKChzMV9uIDw8MTMpIF4gczFfbikgPj4xOSkpCisgICBzMl97bisxfSA9ICgoKHMyX24gJiA0Mjk0OTY3Mjg4KSA8PCA0KSBeICgoKHMyX24gPDwgMikgXiBzMl9uKSA+PjI1KSkKKyAgIHMzX3tuKzF9ID0gKCgoczNfbiAmIDQyOTQ5NjcyODApIDw8MTcpIF4gKCgoczNfbiA8PCAzKSBeIHMzX24pID4+MTEpKQorCisgICBUaGUgcGVyaW9kIG9mIHRoaXMgZ2VuZXJhdG9yIGlzIGFib3V0IDJeODguCisKKyAgIEZyb206IFAuIEwnRWN1eWVyLCAiTWF4aW1hbGx5IEVxdWlkaXN0cmlidXRlZCBDb21iaW5lZCBUYXVzd29ydGhlCisgICBHZW5lcmF0b3JzIiwgTWF0aGVtYXRpY3Mgb2YgQ29tcHV0YXRpb24sIDY1LCAyMTMgKDE5OTYpLCAyMDMtLTIxMy4KKworICAgVGhpcyBpcyBhdmFpbGFibGUgb24gdGhlIG5ldCBmcm9tIEwnRWN1eWVyJ3MgaG9tZSBwYWdlLAorCisgICBodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvfmxlY3V5ZXIvbXlmdHAvcGFwZXJzL3RhdXNtZS5wcworICAgZnRwOi8vZnRwLmlyby51bW9udHJlYWwuY2EvcHViL3NpbXVsYXRpb24vbGVjdXllci9wYXBlcnMvdGF1c21lLnBzCisKKyAgIFRoZXJlIGlzIGFuIGVycmF0dW0gaW4gdGhlIHBhcGVyICJUYWJsZXMgb2YgTWF4aW1hbGx5CisgICBFcXVpZGlzdHJpYnV0ZWQgQ29tYmluZWQgTEZTUiBHZW5lcmF0b3JzIiwgTWF0aGVtYXRpY3Mgb2YKKyAgIENvbXB1dGF0aW9uLCA2OCwgMjI1ICgxOTk5KSwgMjYxLS0yNjk6CisgICBodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvfmxlY3V5ZXIvbXlmdHAvcGFwZXJzL3RhdXNtZTIucHMKKworICAgICAgICAuLi4gdGhlIGtfaiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2Ygel9qIG11c3QgYmUgbm9uLQorICAgICAgICB6ZXJvLCBmb3IgZWFjaCBqLiAoTm90ZTogdGhpcyByZXN0cmljdGlvbiBhbHNvIGFwcGxpZXMgdG8gdGhlCisgICAgICAgIGNvbXB1dGVyIGNvZGUgZ2l2ZW4gaW4gWzRdLCBidXQgd2FzIG1pc3Rha2VubHkgbm90IG1lbnRpb25lZCBpbgorICAgICAgICB0aGF0IHBhcGVyLikKKworICAgVGhpcyBhZmZlY3RzIHRoZSBzZWVkaW5nIHByb2NlZHVyZSBieSBpbXBvc2luZyB0aGUgcmVxdWlyZW1lbnQKKyAgIHMxID4gMSwgczIgPiA3LCBzMyA+IDE1LgorCisqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKK3N0cnVjdCBybmRfc3RhdGUgeworCXUzMiBzMSwgczIsIHMzOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBybmRfc3RhdGUsIG5ldF9yYW5kX3N0YXRlKTsKKworc3RhdGljIHUzMiBfX3JhbmRvbTMyKHN0cnVjdCBybmRfc3RhdGUgKnN0YXRlKQoreworI2RlZmluZSBUQVVTV09SVEhFKHMsYSxiLGMsZCkgKChzJmMpPDxkKSBeICgoKHMgPDxhKSBeIHMpPj5iKQorCisJc3RhdGUtPnMxID0gVEFVU1dPUlRIRShzdGF0ZS0+czEsIDEzLCAxOSwgNDI5NDk2NzI5NFVMLCAxMik7CisJc3RhdGUtPnMyID0gVEFVU1dPUlRIRShzdGF0ZS0+czIsIDIsIDI1LCA0Mjk0OTY3Mjg4VUwsIDQpOworCXN0YXRlLT5zMyA9IFRBVVNXT1JUSEUoc3RhdGUtPnMzLCAzLCAxMSwgNDI5NDk2NzI4MFVMLCAxNyk7CisKKwlyZXR1cm4gKHN0YXRlLT5zMSBeIHN0YXRlLT5zMiBeIHN0YXRlLT5zMyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2V0X3JhbmRvbTMyKHN0cnVjdCBybmRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBsb25nIHMpCit7CisJaWYgKHMgPT0gMCkKKwkJcyA9IDE7ICAgICAgLyogZGVmYXVsdCBzZWVkIGlzIDEgKi8KKworI2RlZmluZSBMQ0cobikgKDY5MDY5ICogbikKKwlzdGF0ZS0+czEgPSBMQ0cocyk7CisJc3RhdGUtPnMyID0gTENHKHN0YXRlLT5zMSk7CisJc3RhdGUtPnMzID0gTENHKHN0YXRlLT5zMik7CisKKwkvKiAid2FybSBpdCB1cCIgKi8KKwlfX3JhbmRvbTMyKHN0YXRlKTsKKwlfX3JhbmRvbTMyKHN0YXRlKTsKKwlfX3JhbmRvbTMyKHN0YXRlKTsKKwlfX3JhbmRvbTMyKHN0YXRlKTsKKwlfX3JhbmRvbTMyKHN0YXRlKTsKKwlfX3JhbmRvbTMyKHN0YXRlKTsKK30KKworLyoqCisgKglyYW5kb20zMiAtIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICoKKyAqCUEgMzIgYml0IHBzZXVkby1yYW5kb20gbnVtYmVyIGlzIGdlbmVyYXRlZCB1c2luZyBhIGZhc3QKKyAqCWFsZ29yaXRobSBzdWl0YWJsZSBmb3Igc2ltdWxhdGlvbi4gVGhpcyBhbGdvcml0aG0gaXMgTk9UCisgKgljb25zaWRlcmVkIHNhZmUgZm9yIGNyeXB0b2dyYXBoaWMgdXNlLgorICovCit1MzIgcmFuZG9tMzIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHI7CisJc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUgPSAmZ2V0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOworCXIgPSBfX3JhbmRvbTMyKHN0YXRlKTsKKwlwdXRfY3B1X3ZhcihzdGF0ZSk7CisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MKHJhbmRvbTMyKTsKKworLyoqCisgKglzcmFuZG9tMzIgLSBhZGQgZW50cm9weSB0byBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqCUBzZWVkOiBzZWVkIHZhbHVlCisgKgorICoJQWRkIHNvbWUgYWRkaXRpb25hbCBzZWVkaW5nIHRvIHRoZSByYW5kb20zMigpIHBvb2wuCisgKglOb3RlOiB0aGlzIHBvb2wgaXMgcGVyIGNwdSBzbyBpdCBvbmx5IGFmZmVjdHMgY3VycmVudCBDUFUuCisgKi8KK3ZvaWQgc3JhbmRvbTMyKHUzMiBlbnRyb3B5KQoreworCXN0cnVjdCBybmRfc3RhdGUgKnN0YXRlID0gJmdldF9jcHVfdmFyKG5ldF9yYW5kX3N0YXRlKTsKKwlfX3NldF9yYW5kb20zMihzdGF0ZSwgc3RhdGUtPnMxIF4gZW50cm9weSk7CisJcHV0X2NwdV92YXIoc3RhdGUpOworfQorRVhQT1JUX1NZTUJPTChzcmFuZG9tMzIpOworCisvKgorICoJR2VuZXJhdGUgc29tZSBpbml0aWFsbHkgd2VhayBzZWVkaW5nIHZhbHVlcyB0byBhbGxvdworICoJdG8gc3RhcnQgdGhlIHJhbmRvbTMyKCkgZW5naW5lLgorICovCitzdGF0aWMgaW50IF9faW5pdCByYW5kb20zMl9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlzdHJ1Y3Qgcm5kX3N0YXRlICpzdGF0ZSA9ICZwZXJfY3B1KG5ldF9yYW5kX3N0YXRlLGkpOworCQlfX3NldF9yYW5kb20zMihzdGF0ZSwgaSArIGppZmZpZXMpOworCX0KKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNhbGwocmFuZG9tMzJfaW5pdCk7CisKKy8qCisgKglHZW5lcmF0ZSBiZXR0ZXIgdmFsdWVzIGFmdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgKglpcyBmdWxseSBpbml0YWxpemVkLgorICovCitzdGF0aWMgaW50IF9faW5pdCByYW5kb20zMl9yZXNlZWQodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHNlZWQ7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlzdHJ1Y3Qgcm5kX3N0YXRlICpzdGF0ZSA9ICZwZXJfY3B1KG5ldF9yYW5kX3N0YXRlLGkpOworCisJCWdldF9yYW5kb21fYnl0ZXMoJnNlZWQsIHNpemVvZihzZWVkKSk7CisJCV9fc2V0X3JhbmRvbTMyKHN0YXRlLCBzZWVkKTsKKwl9CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHJhbmRvbTMyX3Jlc2VlZCk7CmRpZmYgLS1naXQgYS9saWIvcmVjaXByb2NhbF9kaXYuYyBiL2xpYi9yZWNpcHJvY2FsX2Rpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhM2JkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmVjaXByb2NhbF9kaXYuYwpAQCAtMCwwICsxLDkgQEAKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWNpcHJvY2FsX2Rpdi5oPgorCit1MzIgcmVjaXByb2NhbF92YWx1ZSh1MzIgaykKK3sKKwl1NjQgdmFsID0gKDFMTCA8PCAzMikgKyAoayAtIDEpOworCWRvX2Rpdih2YWwsIGspOworCXJldHVybiAodTMyKXZhbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9yd3NlbS1zcGlubG9jay5jIGIvbGliL3J3c2VtLXNwaW5sb2NrLmMKaW5kZXggZGI0ZmVkNy4uYzRjZmQ2YyAxMDA2NDQKLS0tIGEvbGliL3J3c2VtLXNwaW5sb2NrLmMKKysrIGIvbGliL3J3c2VtLXNwaW5sb2NrLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAkgKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCByZWluaXRpYWxpemluZyBhIGhlbGQgc2VtYXBob3JlOgogCSAqLwogCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKCh2b2lkICopc2VtLCBzaXplb2YoKnNlbSkpOwotCWxvY2tkZXBfaW5pdF9tYXAoJnNlbS0+ZGVwX21hcCwgbmFtZSwga2V5KTsKKwlsb2NrZGVwX2luaXRfbWFwKCZzZW0tPmRlcF9tYXAsIG5hbWUsIGtleSwgMCk7CiAjZW5kaWYKIAlzZW0tPmFjdGl2aXR5ID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmc2VtLT53YWl0X2xvY2spOwpkaWZmIC0tZ2l0IGEvbGliL3J3c2VtLmMgYi9saWIvcndzZW0uYwppbmRleCA5MDFkMGU3Li5jZGI0ZTNkIDEwMDY0NAotLS0gYS9saWIvcndzZW0uYworKysgYi9saWIvcndzZW0uYwpAQCAtMTksNyArMTksNyBAQAogCSAqIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IHJlaW5pdGlhbGl6aW5nIGEgaGVsZCBzZW1hcGhvcmU6CiAJICovCiAJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoKHZvaWQgKilzZW0sIHNpemVvZigqc2VtKSk7Ci0JbG9ja2RlcF9pbml0X21hcCgmc2VtLT5kZXBfbWFwLCBuYW1lLCBrZXkpOworCWxvY2tkZXBfaW5pdF9tYXAoJnNlbS0+ZGVwX21hcCwgbmFtZSwga2V5LCAwKTsKICNlbmRpZgogCXNlbS0+Y291bnQgPSBSV1NFTV9VTkxPQ0tFRF9WQUxVRTsKIAlzcGluX2xvY2tfaW5pdCgmc2VtLT53YWl0X2xvY2spOwpkaWZmIC0tZ2l0IGEvbGliL3NwaW5sb2NrX2RlYnVnLmMgYi9saWIvc3BpbmxvY2tfZGVidWcuYwppbmRleCBkYWZhZjFkLi40NzlmZDQ2IDEwMDY0NAotLS0gYS9saWIvc3BpbmxvY2tfZGVidWcuYworKysgYi9saWIvc3BpbmxvY2tfZGVidWcuYwpAQCAtNyw2ICs3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ubWkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0yMCw3ICsyMSw3IEBACiAJICogTWFrZSBzdXJlIHdlIGFyZSBub3QgcmVpbml0aWFsaXppbmcgYSBoZWxkIGxvY2s6CiAJICovCiAJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoKHZvaWQgKilsb2NrLCBzaXplb2YoKmxvY2spKTsKLQlsb2NrZGVwX2luaXRfbWFwKCZsb2NrLT5kZXBfbWFwLCBuYW1lLCBrZXkpOworCWxvY2tkZXBfaW5pdF9tYXAoJmxvY2stPmRlcF9tYXAsIG5hbWUsIGtleSwgMCk7CiAjZW5kaWYKIAlsb2NrLT5yYXdfbG9jayA9IChyYXdfc3BpbmxvY2tfdClfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQ7CiAJbG9jay0+bWFnaWMgPSBTUElOTE9DS19NQUdJQzsKQEAgLTM4LDcgKzM5LDcgQEAKIAkgKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCByZWluaXRpYWxpemluZyBhIGhlbGQgbG9jazoKIAkgKi8KIAlkZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZCgodm9pZCAqKWxvY2ssIHNpemVvZigqbG9jaykpOwotCWxvY2tkZXBfaW5pdF9tYXAoJmxvY2stPmRlcF9tYXAsIG5hbWUsIGtleSk7CisJbG9ja2RlcF9pbml0X21hcCgmbG9jay0+ZGVwX21hcCwgbmFtZSwga2V5LCAwKTsKICNlbmRpZgogCWxvY2stPnJhd19sb2NrID0gKHJhd19yd2xvY2tfdCkgX19SQVdfUldfTE9DS19VTkxPQ0tFRDsKIAlsb2NrLT5tYWdpYyA9IFJXTE9DS19NQUdJQzsKQEAgLTExNyw2ICsxMTgsOSBAQAogCQkJCXJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGN1cnJlbnQtPmNvbW0sCiAJCQkJY3VycmVudC0+cGlkLCBsb2NrKTsKIAkJCWR1bXBfc3RhY2soKTsKKyNpZmRlZiBDT05GSUdfU01QCisJCQl0cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlKCk7CisjZW5kaWYKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9zdHJpbmcuYyBiL2xpYi9zdHJpbmcuYwppbmRleCA2MzA3NzI2Ny4uYTQ4NWQ3NSAxMDA2NDQKLS0tIGEvbGliL3N0cmluZy5jCisrKyBiL2xpYi9zdHJpbmcuYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAJCXJldHVybiBzOwogCiAJZW5kID0gcyArIHNpemUgLSAxOwotCXdoaWxlIChlbmQgIT0gcyAmJiBpc3NwYWNlKCplbmQpKQorCXdoaWxlIChlbmQgPj0gcyAmJiBpc3NwYWNlKCplbmQpKQogCQllbmQtLTsKIAkqKGVuZCArIDEpID0gJ1wwJzsKIApkaWZmIC0tZ2l0IGEvbGliL3RleHRzZWFyY2guYyBiL2xpYi90ZXh0c2VhcmNoLmMKaW5kZXggMmNiNGE0My4uOThiY2FkYyAxMDA2NDQKLS0tIGEvbGliL3RleHRzZWFyY2guYworKysgYi9saWIvdGV4dHNlYXJjaC5jCkBAIC00MCw3ICs0MCw3IEBACiAgKiAgICAgICBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgKiAgICgzKSBVc2VyIHN0YXJ0cyB0aGUgc2VhcmNoKGVzKSBieSBjYWxsaW5nIF9maW5kKCkgb3IgX25leHQoKSB0bwogICogICAgICAgZmV0Y2ggc3Vic2VxdWVudCBvY2N1cnJlbmNlcy4gQSBzdGF0ZSB2YXJpYWJsZSBpcyBwcm92aWRlZAotICogICAgICAgdG8gdGhlIGFsZ29yaWh0bSB0byBzdG9yZSBwZXJzaXN0YW50IHZhcmlhYmxlcy4KKyAqICAgICAgIHRvIHRoZSBhbGdvcmlodG0gdG8gc3RvcmUgcGVyc2lzdGVudCB2YXJpYWJsZXMuCiAgKiAgICg0KSBDb3JlIGV2ZW50dWFsbHkgcmVzZXRzIHRoZSBzZWFyY2ggb2Zmc2V0IGFuZCBmb3J3YXJkcyB0aGUgZmluZCgpCiAgKiAgICAgICByZXF1ZXN0IHRvIHRoZSBhbGdvcml0aG0uCiAgKiAgICg1KSBBbGdvcml0aG0gY2FsbHMgZ2V0X25leHRfYmxvY2soKSBwcm92aWRlZCBieSB0aGUgdXNlciBjb250aW5vdXNseQpkaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZQppbmRleCAxMmIzYTRlLi5mM2MwNzdlIDEwMDY0NAotLS0gYS9tbS9NYWtlZmlsZQorKysgYi9tbS9NYWtlZmlsZQpAQCAtMTAsNyArMTAsOCBAQAogb2JqLXkJCQk6PSBib290bWVtLm8gZmlsZW1hcC5vIG1lbXBvb2wubyBvb21fa2lsbC5vIGZhZHZpc2UubyBcCiAJCQkgICBwYWdlX2FsbG9jLm8gcGFnZS13cml0ZWJhY2subyBwZGZsdXNoLm8gXAogCQkJICAgcmVhZGFoZWFkLm8gc3dhcC5vIHRydW5jYXRlLm8gdm1zY2FuLm8gXAotCQkJICAgcHJpb190cmVlLm8gdXRpbC5vIG1tem9uZS5vIHZtc3RhdC5vICQobW11LXkpCisJCQkgICBwcmlvX3RyZWUubyB1dGlsLm8gbW16b25lLm8gdm1zdGF0Lm8gYmFja2luZy1kZXYubyBcCisJCQkgICAkKG1tdS15KQogCiBpZmVxICgkKENPTkZJR19NTVUpJChDT05GSUdfQkxPQ0spLHl5KQogb2JqLXkJCQkrPSBib3VuY2UubwpkaWZmIC0tZ2l0IGEvbW0vYWxsb2NwZXJjcHUuYyBiL21tL2FsbG9jcGVyY3B1LmMKaW5kZXggZWFhOWFiZS4uYjI0ODZjZiAxMDA2NDQKLS0tIGEvbW0vYWxsb2NwZXJjcHUuYworKysgYi9tbS9hbGxvY3BlcmNwdS5jCkBAIC0xNywxMCArMTcsOSBAQAogdm9pZCBwZXJjcHVfZGVwb3B1bGF0ZSh2b2lkICpfX3BkYXRhLCBpbnQgY3B1KQogewogCXN0cnVjdCBwZXJjcHVfZGF0YSAqcGRhdGEgPSBfX3BlcmNwdV9kaXNndWlzZShfX3BkYXRhKTsKLQlpZiAocGRhdGEtPnB0cnNbY3B1XSkgewotCQlrZnJlZShwZGF0YS0+cHRyc1tjcHVdKTsKLQkJcGRhdGEtPnB0cnNbY3B1XSA9IE5VTEw7Ci0JfQorCisJa2ZyZWUocGRhdGEtPnB0cnNbY3B1XSk7CisJcGRhdGEtPnB0cnNbY3B1XSA9IE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfZGVwb3B1bGF0ZSk7CiAKQEAgLTEyMyw2ICsxMjIsOCBAQAogICovCiB2b2lkIHBlcmNwdV9mcmVlKHZvaWQgKl9fcGRhdGEpCiB7CisJaWYgKHVubGlrZWx5KCFfX3BkYXRhKSkKKwkJcmV0dXJuOwogCV9fcGVyY3B1X2RlcG9wdWxhdGVfbWFzayhfX3BkYXRhLCAmY3B1X3Bvc3NpYmxlX21hcCk7CiAJa2ZyZWUoX19wZXJjcHVfZGlzZ3Vpc2UoX19wZGF0YSkpOwogfQpkaWZmIC0tZ2l0IGEvbW0vYmFja2luZy1kZXYuYyBiL21tL2JhY2tpbmctZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwYTI4MQotLS0gL2Rldi9udWxsCisrKyBiL21tL2JhY2tpbmctZGV2LmMKQEAgLTAsMCArMSw2OSBAQAorCisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgY29uZ2VzdGlvbl93cWhbMl0gPSB7CisJCV9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKGNvbmdlc3Rpb25fd3FoWzBdKSwKKwkJX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIoY29uZ2VzdGlvbl93cWhbMV0pCisJfTsKKworCit2b2lkIGNsZWFyX2JkaV9jb25nZXN0ZWQoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwgaW50IHJ3KQoreworCWVudW0gYmRpX3N0YXRlIGJpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoID0gJmNvbmdlc3Rpb25fd3FoW3J3XTsKKworCWJpdCA9IChydyA9PSBXUklURSkgPyBCRElfd3JpdGVfY29uZ2VzdGVkIDogQkRJX3JlYWRfY29uZ2VzdGVkOworCWNsZWFyX2JpdChiaXQsICZiZGktPnN0YXRlKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKHdxaCkpCisJCXdha2VfdXAod3FoKTsKK30KK0VYUE9SVF9TWU1CT0woY2xlYXJfYmRpX2Nvbmdlc3RlZCk7CisKK3ZvaWQgc2V0X2JkaV9jb25nZXN0ZWQoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwgaW50IHJ3KQoreworCWVudW0gYmRpX3N0YXRlIGJpdDsKKworCWJpdCA9IChydyA9PSBXUklURSkgPyBCRElfd3JpdGVfY29uZ2VzdGVkIDogQkRJX3JlYWRfY29uZ2VzdGVkOworCXNldF9iaXQoYml0LCAmYmRpLT5zdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNldF9iZGlfY29uZ2VzdGVkKTsKKworLyoqCisgKiBjb25nZXN0aW9uX3dhaXQgLSB3YWl0IGZvciBhIGJhY2tpbmdfZGV2IHRvIGJlY29tZSB1bmNvbmdlc3RlZAorICogQHJ3OiBSRUFEIG9yIFdSSVRFCisgKiBAdGltZW91dDogdGltZW91dCBpbiBqaWZmaWVzCisgKgorICogV2FpdHMgZm9yIHVwIHRvIEB0aW1lb3V0IGppZmZpZXMgZm9yIGEgYmFja2luZ19kZXYgKGFueSBiYWNraW5nX2RldikgdG8gZXhpdAorICogd3JpdGUgY29uZ2VzdGlvbi4gIElmIG5vIGJhY2tpbmdfZGV2cyBhcmUgY29uZ2VzdGVkIHRoZW4ganVzdCB3YWl0IGZvciB0aGUKKyAqIG5leHQgd3JpdGUgdG8gYmUgY29tcGxldGVkLgorICovCitsb25nIGNvbmdlc3Rpb25fd2FpdChpbnQgcncsIGxvbmcgdGltZW91dCkKK3sKKwlsb25nIHJldDsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd3FoID0gJmNvbmdlc3Rpb25fd3FoW3J3XTsKKworCXByZXBhcmVfdG9fd2FpdCh3cWgsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcmV0ID0gaW9fc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwlmaW5pc2hfd2FpdCh3cWgsICZ3YWl0KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjb25nZXN0aW9uX3dhaXQpOworCisvKioKKyAqIGNvbmdlc3Rpb25fZW5kIC0gd2FrZSB1cCBzbGVlcGVycyBvbiBhIGNvbmdlc3RlZCBiYWNraW5nX2Rldl9pbmZvCisgKiBAcnc6IFJFQUQgb3IgV1JJVEUKKyAqLwordm9pZCBjb25nZXN0aW9uX2VuZChpbnQgcncpCit7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCA9ICZjb25nZXN0aW9uX3dxaFtyd107CisKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSh3cWgpKQorCQl3YWtlX3VwKHdxaCk7Cit9CitFWFBPUlRfU1lNQk9MKGNvbmdlc3Rpb25fZW5kKTsKZGlmZiAtLWdpdCBhL21tL2Jvb3RtZW0uYyBiL21tL2Jvb3RtZW0uYwppbmRleCBkNTMxMTJmYy4uMDBhOTY5NyAxMDA2NDQKLS0tIGEvbW0vYm9vdG1lbS5jCisrKyBiL21tL2Jvb3RtZW0uYwpAQCAtMjcsOCArMjcsNiBAQAogdW5zaWduZWQgbG9uZyBtaW5fbG93X3BmbjsKIHVuc2lnbmVkIGxvbmcgbWF4X3BmbjsKIAotRVhQT1JUX1VOVVNFRF9TWU1CT0wobWF4X3Bmbik7ICAvKiAgSnVuZSAyMDA2ICAqLwotCiBzdGF0aWMgTElTVF9IRUFEKGJkYXRhX2xpc3QpOwogI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCiAvKgpAQCAtMTk2LDYgKzE5NCwxMCBAQAogCWlmIChsaW1pdCAmJiBiZGF0YS0+bm9kZV9ib290X3N0YXJ0ID49IGxpbWl0KQogCQlyZXR1cm4gTlVMTDsKIAorCS8qIG9uIG5vZGVzIHdpdGhvdXQgbWVtb3J5IC0gYm9vdG1lbV9tYXAgaXMgTlVMTCAqLworCWlmICghYmRhdGEtPm5vZGVfYm9vdG1lbV9tYXApCisJCXJldHVybiBOVUxMOworCiAJZW5kX3BmbiA9IGJkYXRhLT5ub2RlX2xvd19wZm47CiAJbGltaXQgPSBQRk5fRE9XTihsaW1pdCk7CiAJaWYgKGxpbWl0ICYmIGVuZF9wZm4gPiBsaW1pdCkKZGlmZiAtLWdpdCBhL21tL2ZhZHZpc2UuYyBiL21tL2ZhZHZpc2UuYwppbmRleCAxNjhjNzhhLi4wZGY0Yzg5IDEwMDY0NAotLS0gYS9tbS9mYWR2aXNlLmMKKysrIGIvbW0vZmFkdmlzZS5jCkBAIC0zOCw3ICszOCw3IEBACiAJaWYgKCFmaWxlKQogCQlyZXR1cm4gLUVCQURGOwogCi0JaWYgKFNfSVNGSUZPKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJaWYgKFNfSVNGSUZPKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpIHsKIAkJcmV0ID0gLUVTUElQRTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDM0NjRiNjguLjgzMzJjNzcgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTc1LDggKzc1LDggQEAKICAqICAtPm1tYXBfc2VtCiAgKiAgICAtPmxvY2tfcGFnZQkJKGFjY2Vzc19wcm9jZXNzX3ZtKQogICoKLSAqICAtPm1tYXBfc2VtCi0gKiAgICAtPmlfbXV0ZXgJCQkobXN5bmMpCisgKiAgLT5pX211dGV4CQkJKGdlbmVyaWNfZmlsZV9idWZmZXJlZF93cml0ZSkKKyAqICAgIC0+bW1hcF9zZW0JCShmYXVsdF9pbl9wYWdlc19yZWFkYWJsZS0+ZG9fcGFnZV9mYXVsdCkKICAqCiAgKiAgLT5pX211dGV4CiAgKiAgICAtPmlfYWxsb2Nfc2VtICAgICAgICAgICAgICh2YXJpb3VzKQpAQCAtNDY3LDI1ICs0NjcsMTUgQEAKIH0KIAogI2lmZGVmIENPTkZJR19OVU1BCi1zdHJ1Y3QgcGFnZSAqcGFnZV9jYWNoZV9hbGxvYyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqeCkKK3N0cnVjdCBwYWdlICpfX3BhZ2VfY2FjaGVfYWxsb2MoZ2ZwX3QgZ2ZwKQogewogCWlmIChjcHVzZXRfZG9fcGFnZV9tZW1fc3ByZWFkKCkpIHsKIAkJaW50IG4gPSBjcHVzZXRfbWVtX3NwcmVhZF9ub2RlKCk7Ci0JCXJldHVybiBhbGxvY19wYWdlc19ub2RlKG4sIG1hcHBpbmdfZ2ZwX21hc2soeCksIDApOworCQlyZXR1cm4gYWxsb2NfcGFnZXNfbm9kZShuLCBnZnAsIDApOwogCX0KLQlyZXR1cm4gYWxsb2NfcGFnZXMobWFwcGluZ19nZnBfbWFzayh4KSwgMCk7CisJcmV0dXJuIGFsbG9jX3BhZ2VzKGdmcCwgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHBhZ2VfY2FjaGVfYWxsb2MpOwotCi1zdHJ1Y3QgcGFnZSAqcGFnZV9jYWNoZV9hbGxvY19jb2xkKHN0cnVjdCBhZGRyZXNzX3NwYWNlICp4KQotewotCWlmIChjcHVzZXRfZG9fcGFnZV9tZW1fc3ByZWFkKCkpIHsKLQkJaW50IG4gPSBjcHVzZXRfbWVtX3NwcmVhZF9ub2RlKCk7Ci0JCXJldHVybiBhbGxvY19wYWdlc19ub2RlKG4sIG1hcHBpbmdfZ2ZwX21hc2soeCl8X19HRlBfQ09MRCwgMCk7Ci0JfQotCXJldHVybiBhbGxvY19wYWdlcyhtYXBwaW5nX2dmcF9tYXNrKHgpfF9fR0ZQX0NPTEQsIDApOwotfQotRVhQT1JUX1NZTUJPTChwYWdlX2NhY2hlX2FsbG9jX2NvbGQpOworRVhQT1JUX1NZTUJPTChfX3BhZ2VfY2FjaGVfYWxsb2MpOwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19zbGVlcF9vbl9wYWdlX2xvY2sodm9pZCAqd29yZCkKQEAgLTgyNiw3ICs4MTYsNiBAQAogZ3JhYl9jYWNoZV9wYWdlX25vd2FpdChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgdW5zaWduZWQgbG9uZyBpbmRleCkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgaW5kZXgpOwotCWdmcF90IGdmcF9tYXNrOwogCiAJaWYgKHBhZ2UpIHsKIAkJaWYgKCFUZXN0U2V0UGFnZUxvY2tlZChwYWdlKSkKQEAgLTgzNCw5ICs4MjMsOCBAQAogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlnZnBfbWFzayA9IG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJiB+X19HRlBfRlM7Ci0JcGFnZSA9IGFsbG9jX3BhZ2VzKGdmcF9tYXNrLCAwKTsKLQlpZiAocGFnZSAmJiBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsIGdmcF9tYXNrKSkgeworCXBhZ2UgPSBfX3BhZ2VfY2FjaGVfYWxsb2MobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmIH5fX0dGUF9GUyk7CisJaWYgKHBhZ2UgJiYgYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIG1hcHBpbmcsIGluZGV4LCBHRlBfS0VSTkVMKSkgewogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCXBhZ2UgPSBOVUxMOwogCX0KQEAgLTExOTMsOCArMTE4MSw2IEBACiAJCWlmIChwb3MgPCBzaXplKSB7CiAJCQlyZXR2YWwgPSBnZW5lcmljX2ZpbGVfZGlyZWN0X0lPKFJFQUQsIGlvY2IsCiAJCQkJCQlpb3YsIHBvcywgbnJfc2Vncyk7Ci0JCQlpZiAocmV0dmFsID4gMCAmJiAhaXNfc3luY19raW9jYihpb2NiKSkKLQkJCQlyZXR2YWwgPSAtRUlPQ0JRVUVVRUQ7CiAJCQlpZiAocmV0dmFsID4gMCkKIAkJCQkqcHBvcyA9IHBvcyArIHJldHZhbDsKIAkJfQpAQCAtMTQ1Nyw3ICsxNDQzLDYgQEAKIAkgKiBlZmZlY3QuCiAJICovCiAJZXJyb3IgPSBwYWdlX2NhY2hlX3JlYWQoZmlsZSwgcGdvZmYpOwotCWdyYWJfc3dhcF90b2tlbigpOwogCiAJLyoKIAkgKiBUaGUgcGFnZSB3ZSB3YW50IGhhcyBub3cgYmVlbiBhZGRlZCB0byB0aGUgcGFnZSBjYWNoZS4KQEAgLTE4ODQsMTEgKzE4NjksMTAgQEAKICAqCWlmIHN1aWQgb3IgKHNnaWQgYW5kIHhncnApCiAgKgkJcmVtb3ZlIHByaXZzCiAgKi8KLWludCByZW1vdmVfc3VpZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCitpbnQgc2hvdWxkX3JlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAltb2RlX3QgbW9kZSA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlOwogCWludCBraWxsID0gMDsKLQlpbnQgcmVzdWx0ID0gMDsKIAogCS8qIHN1aWQgYWx3YXlzIG11c3QgYmUga2lsbGVkICovCiAJaWYgKHVubGlrZWx5KG1vZGUgJiBTX0lTVUlEKSkKQEAgLTE5MDEsMTMgKzE4ODUsMjkgQEAKIAlpZiAodW5saWtlbHkoKG1vZGUgJiBTX0lTR0lEKSAmJiAobW9kZSAmIFNfSVhHUlApKSkKIAkJa2lsbCB8PSBBVFRSX0tJTExfU0dJRDsKIAotCWlmICh1bmxpa2VseShraWxsICYmICFjYXBhYmxlKENBUF9GU0VUSUQpKSkgewotCQlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisJaWYgKHVubGlrZWx5KGtpbGwgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpKQorCQlyZXR1cm4ga2lsbDsKIAotCQluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfRk9SQ0UgfCBraWxsOwotCQlyZXN1bHQgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc2hvdWxkX3JlbW92ZV9zdWlkKTsKKworaW50IF9fcmVtb3ZlX3N1aWQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQga2lsbCkKK3sKKwlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisKKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfRk9SQ0UgfCBraWxsOworCXJldHVybiBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKK30KKworaW50IHJlbW92ZV9zdWlkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQga2lsbCA9IHNob3VsZF9yZW1vdmVfc3VpZChkZW50cnkpOworCisJaWYgKHVubGlrZWx5KGtpbGwpKQorCQlyZXR1cm4gX19yZW1vdmVfc3VpZChkZW50cnksIGtpbGwpOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHJlbW92ZV9zdWlkKTsKIApAQCAtMjA0NSwxNSArMjA0NSwxNCBAQAogCSAqIFN5bmMgdGhlIGZzIG1ldGFkYXRhIGJ1dCBub3QgdGhlIG1pbm9yIGlub2RlIGNoYW5nZXMgYW5kCiAJICogb2YgY291cnNlIG5vdCB0aGUgZGF0YSBhcyB3ZSBkaWQgZGlyZWN0IERNQSBmb3IgdGhlIElPLgogCSAqIGlfbXV0ZXggaXMgaGVsZCwgd2hpY2ggcHJvdGVjdHMgZ2VuZXJpY19vc3luY19pbm9kZSgpIGZyb20KLQkgKiBsaXZlbG9ja2luZy4KKwkgKiBsaXZlbG9ja2luZy4gIEFJTyBPX0RJUkVDVCBvcHMgYXR0ZW1wdCB0byBzeW5jIG1ldGFkYXRhIGhlcmUuCiAJICovCi0JaWYgKHdyaXR0ZW4gPj0gMCAmJiAoKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpIHx8IElTX1NZTkMoaW5vZGUpKSkgeworCWlmICgod3JpdHRlbiA+PSAwIHx8IHdyaXR0ZW4gPT0gLUVJT0NCUVVFVUVEKSAmJgorCSAgICAoKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpIHx8IElTX1NZTkMoaW5vZGUpKSkgewogCQlpbnQgZXJyID0gZ2VuZXJpY19vc3luY19pbm9kZShpbm9kZSwgbWFwcGluZywgT1NZTkNfTUVUQURBVEEpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXdyaXR0ZW4gPSBlcnI7CiAJfQotCWlmICh3cml0dGVuID09IGNvdW50ICYmICFpc19zeW5jX2tpb2NiKGlvY2IpKQotCQl3cml0dGVuID0gLUVJT0NCUVVFVUVEOwogCXJldHVybiB3cml0dGVuOwogfQogRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKTsKQEAgLTIyMjIsNyArMjIyMSw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwotCWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlICogbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIG1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CiAJc2l6ZV90IG9jb3VudDsJCS8qIG9yaWdpbmFsIGNvdW50ICovCiAJc2l6ZV90IGNvdW50OwkJLyogYWZ0ZXIgZmlsZSBsaW1pdCBjaGVja3MgKi8KIAlzdHJ1Y3QgaW5vZGUgCSppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CkBAIC0yMjY3LDcgKzIyNjYsNyBAQAogCWlmIChjb3VudCA9PSAwKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHJlbW92ZV9zdWlkKGZpbGUtPmZfZGVudHJ5KTsKKwllcnIgPSByZW1vdmVfc3VpZChmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMjI3NSw4ICsyMjc0LDExIEBACiAKIAkvKiBjb2FsZXNjZSB0aGUgaW92ZWNzIGFuZCBnbyBkaXJlY3QtdG8tQklPIGZvciBPX0RJUkVDVCAqLwogCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKSB7Ci0JCXdyaXR0ZW4gPSBnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKGlvY2IsIGlvdiwKLQkJCQkmbnJfc2VncywgcG9zLCBwcG9zLCBjb3VudCwgb2NvdW50KTsKKwkJbG9mZl90IGVuZGJ5dGU7CisJCXNzaXplX3Qgd3JpdHRlbl9idWZmZXJlZDsKKworCQl3cml0dGVuID0gZ2VuZXJpY19maWxlX2RpcmVjdF93cml0ZShpb2NiLCBpb3YsICZucl9zZWdzLCBwb3MsCisJCQkJCQkJcHBvcywgY291bnQsIG9jb3VudCk7CiAJCWlmICh3cml0dGVuIDwgMCB8fCB3cml0dGVuID09IGNvdW50KQogCQkJZ290byBvdXQ7CiAJCS8qCkBAIC0yMjg1LDEwICsyMjg3LDQ2IEBACiAJCSAqLwogCQlwb3MgKz0gd3JpdHRlbjsKIAkJY291bnQgLT0gd3JpdHRlbjsKLQl9CisJCXdyaXR0ZW5fYnVmZmVyZWQgPSBnZW5lcmljX2ZpbGVfYnVmZmVyZWRfd3JpdGUoaW9jYiwgaW92LAorCQkJCQkJbnJfc2VncywgcG9zLCBwcG9zLCBjb3VudCwKKwkJCQkJCXdyaXR0ZW4pOworCQkvKgorCQkgKiBJZiBnZW5lcmljX2ZpbGVfYnVmZmVyZWRfd3JpdGUoKSByZXR1bmVkIGEgc3luY2hyb25vdXMgZXJyb3IKKwkJICogdGhlbiB3ZSB3YW50IHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdlcmUKKwkJICogZGlyZWN0LXdyaXR0ZW4sIG9yIHRoZSBlcnJvciBjb2RlIGlmIHRoYXQgd2FzIHplcm8uICBOb3RlCisJCSAqIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gbm9ybWFsIGRpcmVjdC1pbyBzZW1hbnRpY3MsIHdoaWNoCisJCSAqIHdpbGwgcmV0dXJuIC1FRk9PIGV2ZW4gaWYgc29tZSBieXRlcyB3ZXJlIHdyaXR0ZW4uCisJCSAqLworCQlpZiAod3JpdHRlbl9idWZmZXJlZCA8IDApIHsKKwkJCWVyciA9IHdyaXR0ZW5fYnVmZmVyZWQ7CisJCQlnb3RvIG91dDsKKwkJfQogCi0Jd3JpdHRlbiA9IGdlbmVyaWNfZmlsZV9idWZmZXJlZF93cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MsCi0JCQlwb3MsIHBwb3MsIGNvdW50LCB3cml0dGVuKTsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgcGFnZSBjYWNoZSBwYWdlcyBhcmUgd3JpdHRlbiB0bworCQkgKiBkaXNrIGFuZCBpbnZhbGlkYXRlZCB0byBwcmVzZXJ2ZSB0aGUgZXhwZWN0ZWQgT19ESVJFQ1QKKwkJICogc2VtYW50aWNzLgorCQkgKi8KKwkJZW5kYnl0ZSA9IHBvcyArIHdyaXR0ZW5fYnVmZmVyZWQgLSB3cml0dGVuIC0gMTsKKwkJZXJyID0gZG9fc3luY19maWxlX3JhbmdlKGZpbGUsIHBvcywgZW5kYnl0ZSwKKwkJCQkJIFNZTkNfRklMRV9SQU5HRV9XQUlUX0JFRk9SRXwKKwkJCQkJIFNZTkNfRklMRV9SQU5HRV9XUklURXwKKwkJCQkJIFNZTkNfRklMRV9SQU5HRV9XQUlUX0FGVEVSKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQl3cml0dGVuID0gd3JpdHRlbl9idWZmZXJlZDsKKwkJCWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhtYXBwaW5nLAorCQkJCQkJIHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZULAorCQkJCQkJIGVuZGJ5dGUgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgZG9uJ3Qga25vdyBob3cgbXVjaCB3ZSB3cm90ZSwgc28ganVzdCByZXR1cm4KKwkJCSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggd2VyZSBkaXJlY3Qtd3JpdHRlbgorCQkJICovCisJCX0KKwl9IGVsc2UgeworCQl3cml0dGVuID0gZ2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywKKwkJCQlwb3MsIHBwb3MsIGNvdW50LCB3cml0dGVuKTsKKwl9CiBvdXQ6CiAJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IE5VTEw7CiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogZXJyOwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcF94aXAuYyBiL21tL2ZpbGVtYXBfeGlwLmMKaW5kZXggYjRmZDBkNy4uOGQ2Njc2MTcgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXBfeGlwLmMKKysrIGIvbW0vZmlsZW1hcF94aXAuYwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJaWYgKGNvdW50ID09IDApCiAJCWdvdG8gb3V0X2JhY2tpbmc7CiAKLQlyZXQgPSByZW1vdmVfc3VpZChmaWxwLT5mX2RlbnRyeSk7CisJcmV0ID0gcmVtb3ZlX3N1aWQoZmlscC0+Zl9wYXRoLmRlbnRyeSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfYmFja2luZzsKIApkaWZmIC0tZ2l0IGEvbW0vZnJlbWFwLmMgYi9tbS9mcmVtYXAuYwppbmRleCA3YTlkMGY1Li5iNzdhMDAyIDEwMDY0NAotLS0gYS9tbS9mcmVtYXAuYworKysgYi9tbS9mcmVtYXAuYwpAQCAtMTAxLDcgKzEwMSw2IEBACiB7CiAJaW50IGVyciA9IC1FTk9NRU07CiAJcHRlX3QgKnB0ZTsKLQlwdGVfdCBwdGVfdmFsOwogCXNwaW5sb2NrX3QgKnB0bDsKIAogCXB0ZSA9IGdldF9sb2NrZWRfcHRlKG1tLCBhZGRyLCAmcHRsKTsKQEAgLTExNCw3ICsxMTMsNiBAQAogCX0KIAogCXNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSwgcGdvZmZfdG9fcHRlKHBnb2ZmKSk7Ci0JcHRlX3ZhbCA9ICpwdGU7CiAJLyoKIAkgKiBXZSBkb24ndCBuZWVkIHRvIHJ1biB1cGRhdGVfbW11X2NhY2hlKCkgaGVyZSBiZWNhdXNlIHRoZSAiZmlsZSBwdGUiCiAJICogYmVpbmcgaW5zdGFsbGVkIGJ5IGluc3RhbGxfZmlsZV9wdGUoKSBpcyBub3QgYSByZWFsIHB0ZSAtIGl0J3MgYQpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IDJkYmVjOTAuLmNiMzYyZjcgMTAwNjQ0Ci0tLSBhL21tL2h1Z2V0bGIuYworKysgYi9tbS9odWdldGxiLmMKQEAgLTQ0LDE0ICs0NCwxNCBAQAogfQogCiBzdGF0aWMgdm9pZCBjb3B5X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqZHN0LCBzdHJ1Y3QgcGFnZSAqc3JjLAotCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyKQorCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlpbnQgaTsKIAogCW1pZ2h0X3NsZWVwKCk7CiAJZm9yIChpID0gMDsgaSA8IEhQQUdFX1NJWkUvUEFHRV9TSVpFOyBpKyspIHsKIAkJY29uZF9yZXNjaGVkKCk7Ci0JCWNvcHlfdXNlcl9oaWdocGFnZShkc3QgKyBpLCBzcmMgKyBpLCBhZGRyICsgaSpQQUdFX1NJWkUpOworCQljb3B5X3VzZXJfaGlnaHBhZ2UoZHN0ICsgaSwgc3JjICsgaSwgYWRkciArIGkqUEFHRV9TSVpFLCB2bWEpOwogCX0KIH0KIApAQCAtNzMsNyArNzMsNyBAQAogCiAJZm9yICh6ID0gem9uZWxpc3QtPnpvbmVzOyAqejsgeisrKSB7CiAJCW5pZCA9IHpvbmVfdG9fbmlkKCp6KTsKLQkJaWYgKGNwdXNldF96b25lX2FsbG93ZWQoKnosIEdGUF9ISUdIVVNFUikgJiYKKwkJaWYgKGNwdXNldF96b25lX2FsbG93ZWRfc29mdHdhbGwoKnosIEdGUF9ISUdIVVNFUikgJiYKIAkJICAgICFsaXN0X2VtcHR5KCZodWdlcGFnZV9mcmVlbGlzdHNbbmlkXSkpCiAJCQlicmVhazsKIAl9CkBAIC0xMDksNyArMTA5LDcgQEAKIAlpZiAobmlkID09IE1BWF9OVU1OT0RFUykKIAkJbmlkID0gZmlyc3Rfbm9kZShub2RlX29ubGluZV9tYXApOwogCWlmIChwYWdlKSB7Ci0JCXBhZ2VbMV0ubHJ1Lm5leHQgPSAodm9pZCAqKWZyZWVfaHVnZV9wYWdlOwkvKiBkdG9yICovCisJCXNldF9jb21wb3VuZF9wYWdlX2R0b3IocGFnZSwgZnJlZV9odWdlX3BhZ2UpOwogCQlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7CiAJCW5yX2h1Z2VfcGFnZXMrKzsKIAkJbnJfaHVnZV9wYWdlc19ub2RlW3BhZ2VfdG9fbmlkKHBhZ2UpXSsrOwpAQCAtMzQ0LDcgKzM0NCw2IEBACiAJCQllbnRyeSA9ICpzcmNfcHRlOwogCQkJcHRlcGFnZSA9IHB0ZV9wYWdlKGVudHJ5KTsKIAkJCWdldF9wYWdlKHB0ZXBhZ2UpOwotCQkJYWRkX21tX2NvdW50ZXIoZHN0LCBmaWxlX3JzcywgSFBBR0VfU0laRSAvIFBBR0VfU0laRSk7CiAJCQlzZXRfaHVnZV9wdGVfYXQoZHN0LCBhZGRyLCBkc3RfcHRlLCBlbnRyeSk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJnNyYy0+cGFnZV90YWJsZV9sb2NrKTsKQEAgLTM2NSw2ICszNjQsMTEgQEAKIAlwdGVfdCBwdGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IHBhZ2UgKnRtcDsKKwkvKgorCSAqIEEgcGFnZSBnYXRoZXJpbmcgbGlzdCwgcHJvdGVjdGVkIGJ5IHBlciBmaWxlIGlfbW1hcF9sb2NrLiBUaGUKKwkgKiBsb2NrIGlzIHVzZWQgdG8gYXZvaWQgbGlzdCBjb3JydXB0aW9uIGZyb20gbXVsdGlwbGUgdW5tYXBwaW5nCisJICogb2YgdGhlIHNhbWUgcGFnZSBzaW5jZSB3ZSBhcmUgdXNpbmcgcGFnZS0+bHJ1LgorCSAqLwogCUxJU1RfSEVBRChwYWdlX2xpc3QpOwogCiAJV0FSTl9PTighaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpOwpAQCAtMzcyLDI0ICszNzYsMjEgQEAKIAlCVUdfT04oZW5kICYgfkhQQUdFX01BU0spOwogCiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQotCS8qIFVwZGF0ZSBoaWdoIHdhdGVybWFyayBiZWZvcmUgd2UgbG93ZXIgcnNzICovCi0JdXBkYXRlX2hpd2F0ZXJfcnNzKG1tKTsKLQogCWZvciAoYWRkcmVzcyA9IHN0YXJ0OyBhZGRyZXNzIDwgZW5kOyBhZGRyZXNzICs9IEhQQUdFX1NJWkUpIHsKIAkJcHRlcCA9IGh1Z2VfcHRlX29mZnNldChtbSwgYWRkcmVzcyk7CiAJCWlmICghcHRlcCkKIAkJCWNvbnRpbnVlOwogCisJCWlmIChodWdlX3BtZF91bnNoYXJlKG1tLCAmYWRkcmVzcywgcHRlcCkpCisJCQljb250aW51ZTsKKwogCQlwdGUgPSBodWdlX3B0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgYWRkcmVzcywgcHRlcCk7CiAJCWlmIChwdGVfbm9uZShwdGUpKQogCQkJY29udGludWU7CiAKIAkJcGFnZSA9IHB0ZV9wYWdlKHB0ZSk7CiAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZwYWdlX2xpc3QpOwotCQlhZGRfbW1fY291bnRlcihtbSwgZmlsZV9yc3MsIChpbnQpIC0oSFBBR0VfU0laRSAvIFBBR0VfU0laRSkpOwogCX0KLQogCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlmbHVzaF90bGJfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFnZSwgdG1wLCAmcGFnZV9saXN0LCBscnUpIHsKQEAgLTQ0MSw3ICs0NDIsNyBAQAogCX0KIAogCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQljb3B5X2h1Z2VfcGFnZShuZXdfcGFnZSwgb2xkX3BhZ2UsIGFkZHJlc3MpOworCWNvcHlfaHVnZV9wYWdlKG5ld19wYWdlLCBvbGRfcGFnZSwgYWRkcmVzcywgdm1hKTsKIAlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCiAJcHRlcCA9IGh1Z2VfcHRlX29mZnNldChtbSwgYWRkcmVzcyAmIEhQQUdFX01BU0spOwpAQCAtNDc4LDYgKzQ3OSw5IEBACiByZXRyeToKIAlwYWdlID0gZmluZF9sb2NrX3BhZ2UobWFwcGluZywgaWR4KTsKIAlpZiAoIXBhZ2UpIHsKKwkJc2l6ZSA9IGlfc2l6ZV9yZWFkKG1hcHBpbmctPmhvc3QpID4+IEhQQUdFX1NISUZUOworCQlpZiAoaWR4ID49IHNpemUpCisJCQlnb3RvIG91dDsKIAkJaWYgKGh1Z2V0bGJfZ2V0X3F1b3RhKG1hcHBpbmcpKQogCQkJZ290byBvdXQ7CiAJCXBhZ2UgPSBhbGxvY19odWdlX3BhZ2Uodm1hLCBhZGRyZXNzKTsKQEAgLTUxMiw3ICs1MTYsNiBAQAogCWlmICghcHRlX25vbmUoKnB0ZXApKQogCQlnb3RvIGJhY2tvdXQ7CiAKLQlhZGRfbW1fY291bnRlcihtbSwgZmlsZV9yc3MsIEhQQUdFX1NJWkUgLyBQQUdFX1NJWkUpOwogCW5ld19wdGUgPSBtYWtlX2h1Z2VfcHRlKHZtYSwgcGFnZSwgKCh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCiAJCQkJJiYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpKSk7CiAJc2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdGVwLCBuZXdfcHRlKTsKQEAgLTY1MCwxMSArNjUzLDE0IEBACiAJQlVHX09OKGFkZHJlc3MgPj0gZW5kKTsKIAlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZCk7CiAKKwlzcGluX2xvY2soJnZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nLT5pX21tYXBfbG9jayk7CiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlmb3IgKDsgYWRkcmVzcyA8IGVuZDsgYWRkcmVzcyArPSBIUEFHRV9TSVpFKSB7CiAJCXB0ZXAgPSBodWdlX3B0ZV9vZmZzZXQobW0sIGFkZHJlc3MpOwogCQlpZiAoIXB0ZXApCiAJCQljb250aW51ZTsKKwkJaWYgKGh1Z2VfcG1kX3Vuc2hhcmUobW0sICZhZGRyZXNzLCBwdGVwKSkKKwkJCWNvbnRpbnVlOwogCQlpZiAoIXB0ZV9ub25lKCpwdGVwKSkgewogCQkJcHRlID0gaHVnZV9wdGVwX2dldF9hbmRfY2xlYXIobW0sIGFkZHJlc3MsIHB0ZXApOwogCQkJcHRlID0gcHRlX21raHVnZShwdGVfbW9kaWZ5KHB0ZSwgbmV3cHJvdCkpOwpAQCAtNjYzLDYgKzY2OSw3IEBACiAJCX0KIAl9CiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXNwaW5fdW5sb2NrKCZ2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZy0+aV9tbWFwX2xvY2spOwogCiAJZmx1c2hfdGxiX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCk7CiB9CmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IGI1YTRhYWQuLmMwMGJhYzYgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC0xMTEwLDIzICsxMTEwLDI5IEBACiB7CiAJcHRlX3QgKnB0ZTsKIAlzcGlubG9ja190ICpwdGw7CisJaW50IGVyciA9IDA7CiAKIAlwdGUgPSBwdGVfYWxsb2NfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJnB0bCk7CiAJaWYgKCFwdGUpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gLUVBR0FJTjsKIAlhcmNoX2VudGVyX2xhenlfbW11X21vZGUoKTsKIAlkbyB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gWkVST19QQUdFKGFkZHIpOwogCQlwdGVfdCB6ZXJvX3B0ZSA9IHB0ZV93cnByb3RlY3QobWtfcHRlKHBhZ2UsIHByb3QpKTsKKworCQlpZiAodW5saWtlbHkoIXB0ZV9ub25lKCpwdGUpKSkgeworCQkJZXJyID0gLUVFWElTVDsKKwkJCXB0ZSsrOworCQkJYnJlYWs7CisJCX0KIAkJcGFnZV9jYWNoZV9nZXQocGFnZSk7CiAJCXBhZ2VfYWRkX2ZpbGVfcm1hcChwYWdlKTsKIAkJaW5jX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKLQkJQlVHX09OKCFwdGVfbm9uZSgqcHRlKSk7CiAJCXNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSwgemVyb19wdGUpOwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwogCWFyY2hfbGVhdmVfbGF6eV9tbXVfbW9kZSgpOwogCXB0ZV91bm1hcF91bmxvY2socHRlIC0gMSwgcHRsKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB6ZXJvbWFwX3BtZF9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHVkX3QgKnB1ZCwKQEAgLTExMzQsMTYgKzExNDAsMTggQEAKIHsKIAlwbWRfdCAqcG1kOwogCXVuc2lnbmVkIGxvbmcgbmV4dDsKKwlpbnQgZXJyOwogCiAJcG1kID0gcG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIpOwogCWlmICghcG1kKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIC1FQUdBSU47CiAJZG8gewogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7Ci0JCWlmICh6ZXJvbWFwX3B0ZV9yYW5nZShtbSwgcG1kLCBhZGRyLCBuZXh0LCBwcm90KSkKLQkJCXJldHVybiAtRU5PTUVNOworCQllcnIgPSB6ZXJvbWFwX3B0ZV9yYW5nZShtbSwgcG1kLCBhZGRyLCBuZXh0LCBwcm90KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOwogCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHplcm9tYXBfcHVkX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkLApAQCAtMTE1MSwxNiArMTE1OSwxOCBAQAogewogCXB1ZF90ICpwdWQ7CiAJdW5zaWduZWQgbG9uZyBuZXh0OworCWludCBlcnI7CiAKIAlwdWQgPSBwdWRfYWxsb2MobW0sIHBnZCwgYWRkcik7CiAJaWYgKCFwdWQpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gLUVBR0FJTjsKIAlkbyB7CiAJCW5leHQgPSBwdWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKLQkJaWYgKHplcm9tYXBfcG1kX3JhbmdlKG1tLCBwdWQsIGFkZHIsIG5leHQsIHByb3QpKQotCQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IHplcm9tYXBfcG1kX3JhbmdlKG1tLCBwdWQsIGFkZHIsIG5leHQsIHByb3QpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CiAJfSB3aGlsZSAocHVkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHplcm9tYXBfcGFnZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKQEAgLTE0MzEsNyArMTQ0MSw3IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNvd191c2VyX3BhZ2Uoc3RydWN0IHBhZ2UgKmRzdCwgc3RydWN0IHBhZ2UgKnNyYywgdW5zaWduZWQgbG9uZyB2YSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3dfdXNlcl9wYWdlKHN0cnVjdCBwYWdlICpkc3QsIHN0cnVjdCBwYWdlICpzcmMsIHVuc2lnbmVkIGxvbmcgdmEsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCS8qCiAJICogSWYgdGhlIHNvdXJjZSBwYWdlIHdhcyBhIFBGTiBtYXBwaW5nLCB3ZSBkb24ndCBoYXZlCkBAIC0xNDUyLDEwICsxNDYyLDExIEBACiAJCWlmIChfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKGthZGRyLCB1YWRkciwgUEFHRV9TSVpFKSkKIAkJCW1lbXNldChrYWRkciwgMCwgUEFHRV9TSVpFKTsKIAkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlmbHVzaF9kY2FjaGVfcGFnZShkc3QpOwogCQlyZXR1cm47Ci0JCQorCiAJfQotCWNvcHlfdXNlcl9oaWdocGFnZShkc3QsIHNyYywgdmEpOworCWNvcHlfdXNlcl9oaWdocGFnZShkc3QsIHNyYywgdmEsIHZtYSk7CiB9CiAKIC8qCkBAIC0xNTY2LDcgKzE1NzcsNyBAQAogCQluZXdfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBhZGRyZXNzKTsKIAkJaWYgKCFuZXdfcGFnZSkKIAkJCWdvdG8gb29tOwotCQljb3dfdXNlcl9wYWdlKG5ld19wYWdlLCBvbGRfcGFnZSwgYWRkcmVzcyk7CisJCWNvd191c2VyX3BhZ2UobmV3X3BhZ2UsIG9sZF9wYWdlLCBhZGRyZXNzLCB2bWEpOwogCX0KIAogCS8qCkBAIC0xOTAxLDcgKzE5MTIsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfVU5VU0VEX1NZTUJPTCh2bXRydW5jYXRlX3JhbmdlKTsgIC8qICBKdW5lIDIwMDYgICovCiAKIC8qKgogICogc3dhcGluX3JlYWRhaGVhZCAtIHN3YXAgaW4gcGFnZXMgaW4gaG9wZSB3ZSBuZWVkIHRoZW0gc29vbgpAQCAtMTk5MCw2ICsyMDAwLDcgQEAKIAlkZWxheWFjY3Rfc2V0X2ZsYWcoREVMQVlBQ0NUX1BGX1NXQVBJTik7CiAJcGFnZSA9IGxvb2t1cF9zd2FwX2NhY2hlKGVudHJ5KTsKIAlpZiAoIXBhZ2UpIHsKKwkJZ3JhYl9zd2FwX3Rva2VuKCk7IC8qIENvbnRlbmQgZm9yIHRva2VuIF9iZWZvcmVfIHJlYWQtaW4gKi8KICAJCXN3YXBpbl9yZWFkYWhlYWQoZW50cnksIGFkZHJlc3MsIHZtYSk7CiAgCQlwYWdlID0gcmVhZF9zd2FwX2NhY2hlX2FzeW5jKGVudHJ5LCB2bWEsIGFkZHJlc3MpOwogCQlpZiAoIXBhZ2UpIHsKQEAgLTIwMDcsNyArMjAxOCw2IEBACiAJCS8qIEhhZCB0byByZWFkIHRoZSBwYWdlIGZyb20gc3dhcCBhcmVhOiBNYWpvciBmYXVsdCAqLwogCQlyZXQgPSBWTV9GQVVMVF9NQUpPUjsKIAkJY291bnRfdm1fZXZlbnQoUEdNQUpGQVVMVCk7Ci0JCWdyYWJfc3dhcF90b2tlbigpOwogCX0KIAogCWRlbGF5YWNjdF9jbGVhcl9mbGFnKERFTEFZQUNDVF9QRl9TV0FQSU4pOwpAQCAtMjE5MCw3ICsyMjAwLDcgQEAKIAkJCXBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgYWRkcmVzcyk7CiAJCQlpZiAoIXBhZ2UpCiAJCQkJZ290byBvb207Ci0JCQljb3B5X3VzZXJfaGlnaHBhZ2UocGFnZSwgbmV3X3BhZ2UsIGFkZHJlc3MpOworCQkJY29weV91c2VyX2hpZ2hwYWdlKHBhZ2UsIG5ld19wYWdlLCBhZGRyZXNzLCB2bWEpOwogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG5ld19wYWdlKTsKIAkJCW5ld19wYWdlID0gcGFnZTsKIAkJCWFub24gPSAxOwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5X2hvdHBsdWcuYyBiL21tL21lbW9yeV9ob3RwbHVnLmMKaW5kZXggZmQ2NzhhNi4uMGMwNTVhMDkgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtNzIsNyArNzIsNiBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAJbWVtbWFwX2luaXRfem9uZShucl9wYWdlcywgbmlkLCB6b25lX3R5cGUsIHBoeXNfc3RhcnRfcGZuKTsKLQl6b25ldGFibGVfYWRkKHpvbmUsIG5pZCwgem9uZV90eXBlLCBwaHlzX3N0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IDYxN2ZiMzEuLmRhOTQ2MzkgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC0xNDEsOSArMTQxLDExIEBACiAJZW51bSB6b25lX3R5cGUgazsKIAogCW1heCA9IDEgKyBNQVhfTlJfWk9ORVMgKiBub2Rlc193ZWlnaHQoKm5vZGVzKTsKKwltYXgrKzsJCQkvKiBzcGFjZSBmb3IgemxjYWNoZV9wdHIgKHNlZSBtbXpvbmUuaCkgKi8KIAl6bCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB6b25lICopICogbWF4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXpsKQogCQlyZXR1cm4gTlVMTDsKKwl6bC0+emxjYWNoZV9wdHIgPSBOVUxMOwogCW51bSA9IDA7CiAJLyogRmlyc3QgcHV0IGluIHRoZSBoaWdoZXN0IHpvbmVzIGZyb20gYWxsIG5vZGVzLCB0aGVuIGFsbCB0aGUgbmV4dCAKIAkgICBsb3dlciB6b25lcyBldGMuIEF2b2lkIGVtcHR5IHpvbmVzIGJlY2F1c2UgdGhlIG1lbW9yeSBhbGxvY2F0b3IKQEAgLTIxOSw3ICsyMjEsNyBAQAogCW9yaWdfcHRlID0gcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayh2bWEtPnZtX21tLCBwbWQsIGFkZHIsICZwdGwpOwogCWRvIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXVuc2lnbmVkIGludCBuaWQ7CisJCWludCBuaWQ7CiAKIAkJaWYgKCFwdGVfcHJlc2VudCgqcHRlKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTMyNCw3ICsxMzI2LDcgQEAKIAlhdG9taWNfc2V0KCZuZXctPnJlZmNudCwgMSk7CiAJaWYgKG5ldy0+cG9saWN5ID09IE1QT0xfQklORCkgewogCQlpbnQgc3ogPSBrc2l6ZShvbGQtPnYuem9uZWxpc3QpOwotCQluZXctPnYuem9uZWxpc3QgPSBrbWVtZHVwKG9sZC0+di56b25lbGlzdCwgc3osIFNMQUJfS0VSTkVMKTsKKwkJbmV3LT52LnpvbmVsaXN0ID0ga21lbWR1cChvbGQtPnYuem9uZWxpc3QsIHN6LCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFuZXctPnYuem9uZWxpc3QpIHsKIAkJCWttZW1fY2FjaGVfZnJlZShwb2xpY3lfY2FjaGUsIG5ldyk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTE3MDUsOCArMTcwNyw4IEBACiAgKiBEaXNwbGF5IHBhZ2VzIGFsbG9jYXRlZCBwZXIgbm9kZSBhbmQgbWVtb3J5IHBvbGljeSB2aWEgL3Byb2MuCiAgKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgKnBvbGljeV90eXBlc1tdID0geyAiZGVmYXVsdCIsICJwcmVmZXIiLCAiYmluZCIsCi0JCQkJICAgICAgImludGVybGVhdmUiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBvbGljeV90eXBlc1tdID0KKwl7ICJkZWZhdWx0IiwgInByZWZlciIsICJiaW5kIiwgImludGVybGVhdmUiIH07CiAKIC8qCiAgKiBDb252ZXJ0IGEgbWVtcG9saWN5IGludG8gYSBzdHJpbmcuCkBAIC0xODU1LDcgKzE4NTcsNyBAQAogCiAJaWYgKGZpbGUpIHsKIAkJc2VxX3ByaW50ZihtLCAiIGZpbGU9Iik7Ci0JCXNlcV9wYXRoKG0sIGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSwgIlxuXHQ9ICIpOworCQlzZXFfcGF0aChtLCBmaWxlLT5mX3BhdGgubW50LCBmaWxlLT5mX3BhdGguZGVudHJ5LCAiXG5cdD0gIik7CiAJfSBlbHNlIGlmICh2bWEtPnZtX3N0YXJ0IDw9IG1tLT5icmsgJiYgdm1hLT52bV9lbmQgPj0gbW0tPnN0YXJ0X2JyaykgewogCQlzZXFfcHJpbnRmKG0sICIgaGVhcCIpOwogCX0gZWxzZSBpZiAodm1hLT52bV9zdGFydCA8PSBtbS0+c3RhcnRfc3RhY2sgJiYKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCBiYTI0NTNmLi5lOWIxNjFiIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC0yOTQsNyArMjk0LDcgQEAKIHN0YXRpYyBpbnQgbWlncmF0ZV9wYWdlX21vdmVfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN0cnVjdCBwYWdlICoqcmFkaXhfcG9pbnRlcjsKKwl2b2lkICoqcHNsb3Q7CiAKIAlpZiAoIW1hcHBpbmcpIHsKIAkJLyogQW5vbnltb3VzIHBhZ2UgKi8KQEAgLTMwNSwxMiArMzA1LDExIEBACiAKIAl3cml0ZV9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKIAotCXJhZGl4X3BvaW50ZXIgPSAoc3RydWN0IHBhZ2UgKiopcmFkaXhfdHJlZV9sb29rdXBfc2xvdCgKLQkJCQkJCSZtYXBwaW5nLT5wYWdlX3RyZWUsCi0JCQkJCQlwYWdlX2luZGV4KHBhZ2UpKTsKKwlwc2xvdCA9IHJhZGl4X3RyZWVfbG9va3VwX3Nsb3QoJm1hcHBpbmctPnBhZ2VfdHJlZSwKKyAJCQkJCXBhZ2VfaW5kZXgocGFnZSkpOwogCiAJaWYgKHBhZ2VfY291bnQocGFnZSkgIT0gMiArICEhUGFnZVByaXZhdGUocGFnZSkgfHwKLQkJCSpyYWRpeF9wb2ludGVyICE9IHBhZ2UpIHsKKwkJCShzdHJ1Y3QgcGFnZSAqKXJhZGl4X3RyZWVfZGVyZWZfc2xvdChwc2xvdCkgIT0gcGFnZSkgewogCQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC0zMTgsNyArMzE3LDcgQEAKIAkvKgogCSAqIE5vdyB3ZSBrbm93IHRoYXQgbm8gb25lIGVsc2UgaXMgbG9va2luZyBhdCB0aGUgcGFnZS4KIAkgKi8KLQlnZXRfcGFnZShuZXdwYWdlKTsKKwlnZXRfcGFnZShuZXdwYWdlKTsJLyogYWRkIGNhY2hlIHJlZmVyZW5jZSAqLwogI2lmZGVmIENPTkZJR19TV0FQCiAJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKIAkJU2V0UGFnZVN3YXBDYWNoZShuZXdwYWdlKTsKQEAgLTMyNiw4ICszMjUsMTQgQEAKIAl9CiAjZW5kaWYKIAotCSpyYWRpeF9wb2ludGVyID0gbmV3cGFnZTsKKwlyYWRpeF90cmVlX3JlcGxhY2Vfc2xvdChwc2xvdCwgbmV3cGFnZSk7CisKKwkvKgorCSAqIERyb3AgY2FjaGUgcmVmZXJlbmNlIGZyb20gb2xkIHBhZ2UuCisJICogV2Uga25vdyB0aGlzIGlzbid0IHRoZSBsYXN0IHJlZmVyZW5jZS4KKwkgKi8KIAlfX3B1dF9wYWdlKHBhZ2UpOworCiAJd3JpdGVfdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtOTUyLDcgKzk1Nyw4IEBACiAJCQkJZ290byBvdXQ7CiAKIAkJCXBtW2ldLm5vZGUgPSBub2RlOwotCQl9CisJCX0gZWxzZQorCQkJcG1baV0ubm9kZSA9IDA7CS8qIGFueXRoaW5nIHRvIG5vdCBtYXRjaCBNQVhfTlVNTk9ERVMgKi8KIAl9CiAJLyogRW5kIG1hcmtlciAqLwogCXBtW25yX3BhZ2VzXS5ub2RlID0gTUFYX05VTU5PREVTOwpkaWZmIC0tZ2l0IGEvbW0vbWxvY2suYyBiL21tL21sb2NrLmMKaW5kZXggYjkwYzU5NS4uMzQ0NmI3ZSAxMDA2NDQKLS0tIGEvbW0vbWxvY2suYworKysgYi9tbS9tbG9jay5jCkBAIC02NSw3ICs2NSw3IEBACiAJCQlyZXQgPSBtYWtlX3BhZ2VzX3ByZXNlbnQoc3RhcnQsIGVuZCk7CiAJfQogCi0Jdm1hLT52bV9tbS0+bG9ja2VkX3ZtIC09IHBhZ2VzOworCW1tLT5sb2NrZWRfdm0gLT0gcGFnZXM7CiBvdXQ6CiAJaWYgKHJldCA9PSAtRU5PTUVNKQogCQlyZXQgPSAtRUFHQUlOOwpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IGVlYThlZWYuLjk3MTczMzcgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCiB7CiAJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9ERU5ZV1JJVEUpCi0JCWF0b21pY19pbmMoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3dyaXRlY291bnQpOworCQlhdG9taWNfaW5jKCZmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3dyaXRlY291bnQpOwogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKQogCQltYXBwaW5nLT5pX21tYXBfd3JpdGFibGUtLTsKIApAQCAtMzk5LDcgKzM5OSw3IEBACiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCiAJCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fREVOWVdSSVRFKQotCQkJYXRvbWljX2RlYygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfd3JpdGVjb3VudCk7CisJCQlhdG9taWNfZGVjKCZmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3dyaXRlY291bnQpOwogCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkKIAkJCW1hcHBpbmctPmlfbW1hcF93cml0YWJsZSsrOwogCkBAIC05MDAsMTcgKzkwMCw2IEBACiAJaW50IGFjY291bnRhYmxlID0gMTsKIAl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwLCByZXFwcm90ID0gcHJvdDsKIAotCWlmIChmaWxlKSB7Ci0JCWlmIChpc19maWxlX2h1Z2VwYWdlcyhmaWxlKSkKLQkJCWFjY291bnRhYmxlID0gMDsKLQotCQlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPm1tYXApCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQlpZiAoKHByb3QgJiBQUk9UX0VYRUMpICYmCi0JCSAgICAoZmlsZS0+Zl92ZnNtbnQtPm1udF9mbGFncyAmIE1OVF9OT0VYRUMpKQotCQkJcmV0dXJuIC1FUEVSTTsKLQl9CiAJLyoKIAkgKiBEb2VzIHRoZSBhcHBsaWNhdGlvbiBleHBlY3QgUFJPVF9SRUFEIHRvIGltcGx5IFBST1RfRVhFQz8KIAkgKgpAQCAtOTE4LDcgKzkwNyw3IEBACiAJICogIG1vdW50ZWQsIGluIHdoaWNoIGNhc2Ugd2UgZG9udCBhZGQgUFJPVF9FWEVDLikKIAkgKi8KIAlpZiAoKHByb3QgJiBQUk9UX1JFQUQpICYmIChjdXJyZW50LT5wZXJzb25hbGl0eSAmIFJFQURfSU1QTElFU19FWEVDKSkKLQkJaWYgKCEoZmlsZSAmJiAoZmlsZS0+Zl92ZnNtbnQtPm1udF9mbGFncyAmIE1OVF9OT0VYRUMpKSkKKwkJaWYgKCEoZmlsZSAmJiAoZmlsZS0+Zl9wYXRoLm1udC0+bW50X2ZsYWdzICYgTU5UX05PRVhFQykpKQogCQkJcHJvdCB8PSBQUk9UX0VYRUM7CiAKIAlpZiAoIWxlbikKQEAgLTk3MSw3ICs5NjAsNyBAQAogCQkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JaW5vZGUgPSBmaWxlID8gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUgOiBOVUxMOworCWlub2RlID0gZmlsZSA/IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUgOiBOVUxMOwogCiAJaWYgKGZpbGUpIHsKIAkJc3dpdGNoIChmbGFncyAmIE1BUF9UWVBFKSB7CkBAIC0xMDAwLDYgKzk4OSwxNiBAQAogCQljYXNlIE1BUF9QUklWQVRFOgogCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCiAJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQlpZiAoZmlsZS0+Zl9wYXRoLm1udC0+bW50X2ZsYWdzICYgTU5UX05PRVhFQykgeworCQkJCWlmICh2bV9mbGFncyAmIFZNX0VYRUMpCisJCQkJCXJldHVybiAtRVBFUk07CisJCQkJdm1fZmxhZ3MgJj0gflZNX01BWUVYRUM7CisJCQl9CisJCQlpZiAoaXNfZmlsZV9odWdlcGFnZXMoZmlsZSkpCisJCQkJYWNjb3VudGFibGUgPSAwOworCisJCQlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPm1tYXApCisJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMTM4MCw3ICsxMzc5LDcgQEAKIAkJICogQ2hlY2sgaWYgdGhlIGdpdmVuIHJhbmdlIGlzIGh1Z2VwYWdlIGFsaWduZWQsIGFuZAogCQkgKiBjYW4gYmUgbWFkZSBzdWl0YWJsZSBmb3IgaHVnZXBhZ2VzLgogCQkgKi8KLQkJcmV0ID0gcHJlcGFyZV9odWdlcGFnZV9yYW5nZShhZGRyLCBsZW4pOworCQlyZXQgPSBwcmVwYXJlX2h1Z2VwYWdlX3JhbmdlKGFkZHIsIGxlbiwgcGdvZmYpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIEVuc3VyZSB0aGF0IGEgbm9ybWFsIHJlcXVlc3QgaXMgbm90IGZhbGxpbmcgaW4gYQpAQCAtMTczNyw3ICsxNzM2LDcgQEAKIAlpZiAobW0tPm1hcF9jb3VudCA+PSBzeXNjdGxfbWF4X21hcF9jb3VudCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQluZXcgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJbmV3ID0ga21lbV9jYWNoZV9hbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXcpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xODgxLDYgKzE4ODAsOSBAQAogCWlmICgoYWRkciArIGxlbikgPiBUQVNLX1NJWkUgfHwgKGFkZHIgKyBsZW4pIDwgYWRkcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoaXNfaHVnZXBhZ2Vfb25seV9yYW5nZShtbSwgYWRkciwgbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlmbGFncyA9IFZNX0RBVEFfREVGQVVMVF9GTEFHUyB8IFZNX0FDQ09VTlQgfCBtbS0+ZGVmX2ZsYWdzOwogCiAJZXJyb3IgPSBhcmNoX21tYXBfY2hlY2soYWRkciwgbGVuLCBmbGFncyk7CkBAIC0yMDU1LDcgKzIwNTcsNyBAQAogCQkgICAgdm1hX3N0YXJ0IDwgbmV3X3ZtYS0+dm1fZW5kKQogCQkJKnZtYXAgPSBuZXdfdm1hOwogCX0gZWxzZSB7Ci0JCW5ld192bWEgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJCW5ld192bWEgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG5ld192bWEpIHsKIAkJCSpuZXdfdm1hID0gKnZtYTsKIAkJCXBvbCA9IG1wb2xfY29weSh2bWFfcG9saWN5KHZtYSkpOwpkaWZmIC0tZ2l0IGEvbW0vbW16b25lLmMgYi9tbS9tbXpvbmUuYwppbmRleCBmZWJlYTFjLi5lYjU4Mzg2IDEwMDY0NAotLS0gYS9tbS9tbXpvbmUuYworKysgYi9tbS9tbXpvbmUuYwpAQCAtMTQsOCArMTQsNiBAQAogCXJldHVybiBOT0RFX0RBVEEoZmlyc3Rfb25saW5lX25vZGUpOwogfQogCi1FWFBPUlRfVU5VU0VEX1NZTUJPTChmaXJzdF9vbmxpbmVfcGdkYXQpOyAgLyogIEp1bmUgMjAwNiAgKi8KLQogc3RydWN0IHBnbGlzdF9kYXRhICpuZXh0X29ubGluZV9wZ2RhdChzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KQogewogCWludCBuaWQgPSBuZXh0X29ubGluZV9ub2RlKHBnZGF0LT5ub2RlX2lkKTsKQEAgLTI0LDggKzIyLDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIE5PREVfREFUQShuaWQpOwogfQotRVhQT1JUX1VOVVNFRF9TWU1CT0wobmV4dF9vbmxpbmVfcGdkYXQpOyAgLyogIEp1bmUgMjAwNiAgKi8KLQogCiAvKgogICogbmV4dF96b25lIC0gaGVscGVyIG1hZ2ljIGZvciBmb3JfZWFjaF96b25lKCkKQEAgLTQ1LDUgKzQxLDQgQEAKIAl9CiAJcmV0dXJuIHpvbmU7CiB9Ci1FWFBPUlRfVU5VU0VEX1NZTUJPTChuZXh0X3pvbmUpOyAgLyogIEp1bmUgMjAwNiAgKi8KIApkaWZmIC0tZ2l0IGEvbW0vbm9tbXUuYyBiL21tL25vbW11LmMKaW5kZXggOGJkZGU5NS4uMjNmYjAzMyAxMDA2NDQKLS0tIGEvbW0vbm9tbXUuYworKysgYi9tbS9ub21tdS5jCkBAIC00OTcsMTUgKzQ5NywxNyBAQAogCSAgICAoZmxhZ3MgJiBNQVBfVFlQRSkgIT0gTUFQX1NIQVJFRCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoUEFHRV9BTElHTihsZW4pID09IDApCi0JCXJldHVybiBhZGRyOwotCi0JaWYgKGxlbiA+IFRBU0tfU0laRSkKKwlpZiAoIWxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBDYXJlZnVsIGFib3V0IG92ZXJmbG93cy4uICovCisJbGVuID0gUEFHRV9BTElHTihsZW4pOworCWlmICghbGVuIHx8IGxlbiA+IFRBU0tfU0laRSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAkvKiBvZmZzZXQgb3ZlcmZsb3c/ICovCiAJaWYgKChwZ29mZiArIChsZW4gPj4gUEFHRV9TSElGVCkpIDwgcGdvZmYpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVPVkVSRkxPVzsKIAogCWlmIChmaWxlKSB7CiAJCS8qIHZhbGlkYXRlIGZpbGUgbWFwcGluZyByZXF1ZXN0cyAqLwpAQCAtNTIxLDcgKzUyMyw3IEBACiAJCSAqLwogCQltYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCQlpZiAoIW1hcHBpbmcpCi0JCQltYXBwaW5nID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKwkJCW1hcHBpbmcgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAKIAkJY2FwYWJpbGl0aWVzID0gMDsKIAkJaWYgKG1hcHBpbmcgJiYgbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbykKQEAgLTUzMCw3ICs1MzIsNyBAQAogCQlpZiAoIWNhcGFiaWxpdGllcykgewogCQkJLyogbm8gZXhwbGljaXQgY2FwYWJpbGl0aWVzIHNldCwgc28gYXNzdW1lIHNvbWUKIAkJCSAqIGRlZmF1bHRzICovCi0JCQlzd2l0Y2ggKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwkJCXN3aXRjaCAoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CiAJCQljYXNlIFNfSUZSRUc6CiAJCQljYXNlIFNfSUZCTEs6CiAJCQkJY2FwYWJpbGl0aWVzID0gQkRJX0NBUF9NQVBfQ09QWTsKQEAgLTU2MSwxMSArNTYzLDExIEBACiAJCQkgICAgIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCiAJCQkJcmV0dXJuIC1FQUNDRVM7CiAKLQkJCWlmIChJU19BUFBFTkQoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpICYmCisJCQlpZiAoSVNfQVBQRU5EKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpICYmCiAJCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKIAkJCQlyZXR1cm4gLUVBQ0NFUzsKIAotCQkJaWYgKGxvY2tzX3ZlcmlmeV9sb2NrZWQoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKQorCQkJaWYgKGxvY2tzX3ZlcmlmeV9sb2NrZWQoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpCiAJCQkJcmV0dXJuIC1FQUdBSU47CiAKIAkJCWlmICghKGNhcGFiaWxpdGllcyAmIEJESV9DQVBfTUFQX0RJUkVDVCkpCkBAIC01OTYsNyArNTk4LDcgQEAKIAogCQkvKiBoYW5kbGUgZXhlY3V0YWJsZSBtYXBwaW5ncyBhbmQgaW1wbGllZCBleGVjdXRhYmxlCiAJCSAqIG1hcHBpbmdzICovCi0JCWlmIChmaWxlLT5mX3Zmc21udC0+bW50X2ZsYWdzICYgTU5UX05PRVhFQykgeworCQlpZiAoZmlsZS0+Zl9wYXRoLm1udC0+bW50X2ZsYWdzICYgTU5UX05PRVhFQykgewogCQkJaWYgKHByb3QgJiBQUk9UX0VYRUMpCiAJCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQpAQCAtODA2LDEwICs4MDgsOSBAQAogCXZtX2ZsYWdzID0gZGV0ZXJtaW5lX3ZtX2ZsYWdzKGZpbGUsIHByb3QsIGZsYWdzLCBjYXBhYmlsaXRpZXMpOwogCiAJLyogd2UncmUgZ29pbmcgdG8gbmVlZCB0byByZWNvcmQgdGhlIG1hcHBpbmcgaWYgaXQgd29ya3MgKi8KLQl2bWwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwl2bWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZtbCkKIAkJZ290byBlcnJvcl9nZXR0aW5nX3ZtbDsKLQltZW1zZXQodm1sLCAwLCBzaXplb2YoKnZtbCkpOwogCiAJZG93bl93cml0ZSgmbm9tbXVfdm1hX3NlbSk7CiAKQEAgLTgzMiw3ICs4MzMsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQkvKiBzZWFyY2ggZm9yIG92ZXJsYXBwaW5nIG1hcHBpbmdzIG9uIHRoZSBzYW1lIGZpbGUgKi8KLQkJCWlmICh2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlICE9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKQorCQkJaWYgKHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSAhPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAodm1hLT52bV9wZ29mZiA+PSBwZ29mZiArIHBnbGVuKQpAQCAtODg1LDExICs4ODYsMTAgQEAKIAl9CiAKIAkvKiB3ZSdyZSBnb2luZyB0byBuZWVkIGEgVk1BIHN0cnVjdCBhcyB3ZWxsICovCi0Jdm1hID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtX2FyZWFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJdm1hID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZtX2FyZWFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bWEpCiAJCWdvdG8gZXJyb3JfZ2V0dGluZ192bWE7CiAKLQltZW1zZXQodm1hLCAwLCBzaXplb2YoKnZtYSkpOwogCUlOSVRfTElTVF9IRUFEKCZ2bWEtPmFub25fdm1hX25vZGUpOwogCWF0b21pY19zZXQoJnZtYS0+dm1fdXNhZ2UsIDEpOwogCWlmIChmaWxlKQpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggMjBmNDFiMC4uNjRjZjNjMiAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKiAga2VybmVsIHN1YnN5c3RlbXMgYW5kIGhpbnRzIGFzIHRvIHdoZXJlIHRvIGZpbmQgb3V0IHdoYXQgdGhpbmdzIGRvLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9vb20uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgpAQCAtMTc2LDcgKzE3Nyw3IEBACiAJbm9kZW1hc2tfdCBub2RlcyA9IG5vZGVfb25saW5lX21hcDsKIAogCWZvciAoeiA9IHpvbmVsaXN0LT56b25lczsgKno7IHorKykKLQkJaWYgKGNwdXNldF96b25lX2FsbG93ZWQoKnosIGdmcF9tYXNrKSkKKwkJaWYgKGNwdXNldF96b25lX2FsbG93ZWRfc29mdHdhbGwoKnosIGdmcF9tYXNrKSkKIAkJCW5vZGVfY2xlYXIoem9uZV90b19uaWQoKnopLCBub2Rlcyk7CiAJCWVsc2UKIAkJCXJldHVybiBDT05TVFJBSU5UX0NQVVNFVDsKQEAgLTI2Myw3ICsyNjQsNyBAQAogICogZmxhZyB0aG91Z2ggaXQncyB1bmxpa2VseSB0aGF0ICB3ZSBzZWxlY3QgYSBwcm9jZXNzIHdpdGggQ0FQX1NZU19SQVdfSU8KICAqIHNldC4KICAqLwotc3RhdGljIHZvaWQgX19vb21fa2lsbF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY29uc3QgY2hhciAqbWVzc2FnZSkKK3N0YXRpYyB2b2lkIF9fb29tX2tpbGxfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCB2ZXJib3NlKQogewogCWlmIChpc19pbml0KHApKSB7CiAJCVdBUk5fT04oMSk7CkBAIC0yNzcsMTAgKzI3OCw4IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAobWVzc2FnZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBLaWxsZWQgcHJvY2VzcyAlZCAoJXMpLlxuIiwKLQkJCQltZXNzYWdlLCBwLT5waWQsIHAtPmNvbW0pOwotCX0KKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fRVJSICJLaWxsZWQgcHJvY2VzcyAlZCAoJXMpXG4iLCBwLT5waWQsIHAtPmNvbW0pOwogCiAJLyoKIAkgKiBXZSBnaXZlIG91ciBzYWNyaWZpY2lhbCBsYW1iIGhpZ2ggcHJpb3JpdHkgYW5kIGFjY2VzcyB0bwpAQCAtMjkzLDcgKzI5Miw3IEBACiAJZm9yY2Vfc2lnKFNJR0tJTEwsIHApOwogfQogCi1zdGF0aWMgaW50IG9vbV9raWxsX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBjaGFyICptZXNzYWdlKQorc3RhdGljIGludCBvb21fa2lsbF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpxOwpAQCAtMzEyLDE1ICszMTEsMjUgQEAKIAlpZiAobW0gPT0gTlVMTCkKIAkJcmV0dXJuIDE7CiAKLQlfX29vbV9raWxsX3Rhc2socCwgbWVzc2FnZSk7CisJLyoKKwkgKiBEb24ndCBraWxsIHRoZSBwcm9jZXNzIGlmIGFueSB0aHJlYWRzIGFyZSBzZXQgdG8gT09NX0RJU0FCTEUKKwkgKi8KKwlkb19lYWNoX3RocmVhZChnLCBxKSB7CisJCWlmIChxLT5tbSA9PSBtbSAmJiBwLT5vb21raWxsYWRqID09IE9PTV9ESVNBQkxFKQorCQkJcmV0dXJuIDE7CisJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBxKTsKKworCV9fb29tX2tpbGxfdGFzayhwLCAxKTsKKwogCS8qCiAJICoga2lsbCBhbGwgcHJvY2Vzc2VzIHRoYXQgc2hhcmUgdGhlIC0+bW0gKGkuZS4gYWxsIHRocmVhZHMpLAotCSAqIGJ1dCBhcmUgaW4gYSBkaWZmZXJlbnQgdGhyZWFkIGdyb3VwCisJICogYnV0IGFyZSBpbiBhIGRpZmZlcmVudCB0aHJlYWQgZ3JvdXAuIERvbid0IGxldCB0aGVtIGhhdmUgYWNjZXNzCisJICogdG8gbWVtb3J5IHJlc2VydmVzIHRob3VnaCwgb3RoZXJ3aXNlIHdlIG1pZ2h0IGRlcGxldGUgYWxsIG1lbW9yeS4KIAkgKi8KLQlkb19lYWNoX3RocmVhZChnLCBxKQorCWRvX2VhY2hfdGhyZWFkKGcsIHEpIHsKIAkJaWYgKHEtPm1tID09IG1tICYmIHEtPnRnaWQgIT0gcC0+dGdpZCkKLQkJCV9fb29tX2tpbGxfdGFzayhxLCBtZXNzYWdlKTsKLQl3aGlsZV9lYWNoX3RocmVhZChnLCBxKTsKKwkJCWZvcmNlX3NpZyhTSUdLSUxMLCBwKTsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMzYsMjEgKzM0NSwyMiBAQAogCSAqIGl0cyBjaGlsZHJlbiBvciB0aHJlYWRzLCBqdXN0IHNldCBUSUZfTUVNRElFIHNvIGl0IGNhbiBkaWUgcXVpY2tseQogCSAqLwogCWlmIChwLT5mbGFncyAmIFBGX0VYSVRJTkcpIHsKLQkJX19vb21fa2lsbF90YXNrKHAsIE5VTEwpOworCQlfX29vbV9raWxsX3Rhc2socCwgMCk7CiAJCXJldHVybiAwOwogCX0KIAotCXByaW50ayhLRVJOX0VSUiAiT3V0IG9mIE1lbW9yeTogS2lsbCBwcm9jZXNzICVkICglcykgc2NvcmUgJWxpIgotCQkJIiBhbmQgY2hpbGRyZW4uXG4iLCBwLT5waWQsIHAtPmNvbW0sIHBvaW50cyk7CisJcHJpbnRrKEtFUk5fRVJSICIlczoga2lsbCBwcm9jZXNzICVkICglcykgc2NvcmUgJWxpIG9yIGEgY2hpbGRcbiIsCisJCQkJCW1lc3NhZ2UsIHAtPnBpZCwgcC0+Y29tbSwgcG9pbnRzKTsKKwogCS8qIFRyeSB0byBraWxsIGEgY2hpbGQgZmlyc3QgKi8KIAlsaXN0X2Zvcl9lYWNoKHRzaywgJnAtPmNoaWxkcmVuKSB7CiAJCWMgPSBsaXN0X2VudHJ5KHRzaywgc3RydWN0IHRhc2tfc3RydWN0LCBzaWJsaW5nKTsKIAkJaWYgKGMtPm1tID09IHAtPm1tKQogCQkJY29udGludWU7Ci0JCWlmICghb29tX2tpbGxfdGFzayhjLCBtZXNzYWdlKSkKKwkJaWYgKCFvb21fa2lsbF90YXNrKGMpKQogCQkJcmV0dXJuIDA7CiAJfQotCXJldHVybiBvb21fa2lsbF90YXNrKHAsIG1lc3NhZ2UpOworCXJldHVybiBvb21fa2lsbF90YXNrKHApOwogfQogCiBzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChvb21fbm90aWZ5X2xpc3QpOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggYTBmMzM5MC4uMjM3MTA3YyAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvcm1hcC5oPgpAQCAtMjIyLDcgKzIyMyw3IEBACiAJCQlpZiAocGFnZXNfd3JpdHRlbiA+PSB3cml0ZV9jaHVuaykKIAkJCQlicmVhazsJCS8qIFdlJ3ZlIGRvbmUgb3VyIGR1dHkgKi8KIAkJfQotCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CisJCWNvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOwogCX0KIAogCWlmIChucl9yZWNsYWltYWJsZSArIGdsb2JhbF9wYWdlX3N0YXRlKE5SX1dSSVRFQkFDSykKQEAgLTMxNCw3ICszMTUsNyBAQAogICAgICAgICAgICAgICAgIGlmIChnbG9iYWxfcGFnZV9zdGF0ZShOUl9VTlNUQUJMRV9ORlMpICsKIAkJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1dSSVRFQkFDSykgPD0gZGlydHlfdGhyZXNoKQogICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAgICAgICAgIGJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKKyAgICAgICAgICAgICAgICBjb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKICAgICAgICAgfQogfQogCkBAIC0zNTEsNyArMzUyLDcgQEAKIAkJbWluX3BhZ2VzIC09IE1BWF9XUklURUJBQ0tfUEFHRVMgLSB3YmMubnJfdG9fd3JpdGU7CiAJCWlmICh3YmMubnJfdG9fd3JpdGUgPiAwIHx8IHdiYy5wYWdlc19za2lwcGVkID4gMCkgewogCQkJLyogV3JvdGUgbGVzcyB0aGFuIGV4cGVjdGVkICovCi0JCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CisJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAkJCWlmICghd2JjLmVuY291bnRlcmVkX2Nvbmdlc3Rpb24pCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTQyMiw3ICs0MjMsNyBAQAogCQl3cml0ZWJhY2tfaW5vZGVzKCZ3YmMpOwogCQlpZiAod2JjLm5yX3RvX3dyaXRlID4gMCkgewogCQkJaWYgKHdiYy5lbmNvdW50ZXJlZF9jb25nZXN0aW9uKQotCQkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKKwkJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAkJCWVsc2UKIAkJCQlicmVhazsJLyogQWxsIHRoZSBvbGQgZGF0YSBpcyB3cml0dGVuICovCiAJCX0KQEAgLTc2MSwyMyArNzYyLDI0IEBACiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzI7CiAKLQkJaWYgKG1hcHBpbmcpIHsKLQkJCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCQkJbWFwcGluZzIgPSBwYWdlX21hcHBpbmcocGFnZSk7Ci0JCQlpZiAobWFwcGluZzIpIHsgLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLwotCQkJCUJVR19PTihtYXBwaW5nMiAhPSBtYXBwaW5nKTsKLQkJCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkKLQkJCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsCi0JCQkJCQkJCU5SX0ZJTEVfRElSVFkpOwotCQkJCXJhZGl4X3RyZWVfdGFnX3NldCgmbWFwcGluZy0+cGFnZV90cmVlLAotCQkJCQlwYWdlX2luZGV4KHBhZ2UpLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKTsKKwkJaWYgKCFtYXBwaW5nKQorCQkJcmV0dXJuIDE7CisKKwkJd3JpdGVfbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCW1hcHBpbmcyID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCQlpZiAobWFwcGluZzIpIHsgLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLworCQkJQlVHX09OKG1hcHBpbmcyICE9IG1hcHBpbmcpOworCQkJaWYgKG1hcHBpbmdfY2FwX2FjY291bnRfZGlydHkobWFwcGluZykpIHsKKwkJCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9ESVJUWSk7CisJCQkJdGFza19pb19hY2NvdW50X3dyaXRlKFBBR0VfQ0FDSEVfU0laRSk7CiAJCQl9Ci0JCQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCQkJaWYgKG1hcHBpbmctPmhvc3QpIHsKLQkJCQkvKiAhUGFnZUFub24gJiYgIXN3YXBwZXJfc3BhY2UgKi8KLQkJCQlfX21hcmtfaW5vZGVfZGlydHkobWFwcGluZy0+aG9zdCwKLQkJCQkJCQlJX0RJUlRZX1BBR0VTKTsKLQkJCX0KKwkJCXJhZGl4X3RyZWVfdGFnX3NldCgmbWFwcGluZy0+cGFnZV90cmVlLAorCQkJCXBhZ2VfaW5kZXgocGFnZSksIFBBR0VDQUNIRV9UQUdfRElSVFkpOworCQl9CisJCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCWlmIChtYXBwaW5nLT5ob3N0KSB7CisJCQkvKiAhUGFnZUFub24gJiYgIXN3YXBwZXJfc3BhY2UgKi8KKwkJCV9fbWFya19pbm9kZV9kaXJ0eShtYXBwaW5nLT5ob3N0LCBJX0RJUlRZX1BBR0VTKTsKIAkJfQogCQlyZXR1cm4gMTsKIAl9CkBAIC04NTEsMjcgKzg1MywyNiBAQAogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAobWFwcGluZykgewotCQl3cml0ZV9sb2NrX2lycXNhdmUoJm1hcHBpbmctPnRyZWVfbG9jaywgZmxhZ3MpOwotCQlpZiAoVGVzdENsZWFyUGFnZURpcnR5KHBhZ2UpKSB7Ci0JCQlyYWRpeF90cmVlX3RhZ19jbGVhcigmbWFwcGluZy0+cGFnZV90cmVlLAotCQkJCQkJcGFnZV9pbmRleChwYWdlKSwKLQkJCQkJCVBBR0VDQUNIRV9UQUdfRElSVFkpOwotCQkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1hcHBpbmctPnRyZWVfbG9jaywgZmxhZ3MpOwotCQkJLyoKLQkJCSAqIFdlIGNhbiBjb250aW51ZSB0byB1c2UgYG1hcHBpbmcnIGhlcmUgYmVjYXVzZSB0aGUKLQkJCSAqIHBhZ2UgaXMgbG9ja2VkLCB3aGljaCBwaW5zIHRoZSBhZGRyZXNzX3NwYWNlCi0JCQkgKi8KLQkJCWlmIChtYXBwaW5nX2NhcF9hY2NvdW50X2RpcnR5KG1hcHBpbmcpKSB7Ci0JCQkJcGFnZV9ta2NsZWFuKHBhZ2UpOwotCQkJCWRlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9ESVJUWSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMTsKLQkJfQorCWlmICghbWFwcGluZykKKwkJcmV0dXJuIFRlc3RDbGVhclBhZ2VEaXJ0eShwYWdlKTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWFwcGluZy0+dHJlZV9sb2NrLCBmbGFncyk7CisJaWYgKFRlc3RDbGVhclBhZ2VEaXJ0eShwYWdlKSkgeworCQlyYWRpeF90cmVlX3RhZ19jbGVhcigmbWFwcGluZy0+cGFnZV90cmVlLAorCQkJCXBhZ2VfaW5kZXgocGFnZSksIFBBR0VDQUNIRV9UQUdfRElSVFkpOwogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbWFwcGluZy0+dHJlZV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOworCQkvKgorCQkgKiBXZSBjYW4gY29udGludWUgdG8gdXNlIGBtYXBwaW5nJyBoZXJlIGJlY2F1c2UgdGhlCisJCSAqIHBhZ2UgaXMgbG9ja2VkLCB3aGljaCBwaW5zIHRoZSBhZGRyZXNzX3NwYWNlCisJCSAqLworCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgeworCQkJcGFnZV9ta2NsZWFuKHBhZ2UpOworCQkJZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKKwkJfQorCQlyZXR1cm4gMTsKIAl9Ci0JcmV0dXJuIFRlc3RDbGVhclBhZ2VEaXJ0eShwYWdlKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbWFwcGluZy0+dHJlZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHRlc3RfY2xlYXJfcGFnZV9kaXJ0eSk7CiAKQEAgLTg5MywxNyArODk0LDE3IEBACiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CiAKLQlpZiAobWFwcGluZykgewotCQlpZiAoVGVzdENsZWFyUGFnZURpcnR5KHBhZ2UpKSB7Ci0JCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgewotCQkJCXBhZ2VfbWtjbGVhbihwYWdlKTsKLQkJCQlkZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOwotCQkJfQotCQkJcmV0dXJuIDE7CisJaWYgKCFtYXBwaW5nKQorCQlyZXR1cm4gVGVzdENsZWFyUGFnZURpcnR5KHBhZ2UpOworCisJaWYgKFRlc3RDbGVhclBhZ2VEaXJ0eShwYWdlKSkgeworCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgeworCQkJcGFnZV9ta2NsZWFuKHBhZ2UpOworCQkJZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKIAkJfQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIDE7CiAJfQotCXJldHVybiBUZXN0Q2xlYXJQYWdlRGlydHkocGFnZSk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKTsKIApAQCAtOTU2LDE1ICs5NTcsNiBAQAogRVhQT1JUX1NZTUJPTCh0ZXN0X3NldF9wYWdlX3dyaXRlYmFjayk7CiAKIC8qCi0gKiBXYWtlcyB1cCB0YXNrcyB0aGF0IGFyZSBiZWluZyB0aHJvdHRsZWQgZHVlIHRvIHdyaXRlYmFjayBjb25nZXN0aW9uCi0gKi8KLXZvaWQgd3JpdGViYWNrX2Nvbmdlc3Rpb25fZW5kKHZvaWQpCi17Ci0JYmxrX2Nvbmdlc3Rpb25fZW5kKFdSSVRFKTsKLX0KLUVYUE9SVF9TWU1CT0wod3JpdGViYWNrX2Nvbmdlc3Rpb25fZW5kKTsKLQotLyoKICAqIFJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgcGFnZXMgaW4gdGhlIG1hcHBpbmcgYXJlIG1hcmdlZCB3aXRoIHRoZQogICogcGFzc2VkIHRhZy4KICAqLwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDQwZGI5NmEuLjhjMWExMTYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KIAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgpAQCAtODIsMTQgKzg0LDcgQEAKIAogRVhQT1JUX1NZTUJPTCh0b3RhbHJhbV9wYWdlcyk7CiAKLS8qCi0gKiBVc2VkIGJ5IHBhZ2Vfem9uZSgpIHRvIGxvb2sgdXAgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cnVjdCB6b25lIHdob3NlCi0gKiBpZCBpcyBlbmNvZGVkIGluIHRoZSB1cHBlciBiaXRzIG9mIHBhZ2UtPmZsYWdzCi0gKi8KLXN0cnVjdCB6b25lICp6b25lX3RhYmxlWzEgPDwgWk9ORVRBQkxFX1NISUZUXSBfX3JlYWRfbW9zdGx5OwotRVhQT1JUX1NZTUJPTCh6b25lX3RhYmxlKTsKLQotc3RhdGljIGNoYXIgKnpvbmVfbmFtZXNbTUFYX05SX1pPTkVTXSA9IHsKK3N0YXRpYyBjaGFyICogY29uc3Qgem9uZV9uYW1lc1tNQVhfTlJfWk9ORVNdID0gewogCSAiRE1BIiwKICNpZmRlZiBDT05GSUdfWk9ORV9ETUEzMgogCSAiRE1BMzIiLApAQCAtMjM2LDcgKzIzMSw3IEBACiAJaW50IGk7CiAJaW50IG5yX3BhZ2VzID0gMSA8PCBvcmRlcjsKIAotCXBhZ2VbMV0ubHJ1Lm5leHQgPSAodm9pZCAqKWZyZWVfY29tcG91bmRfcGFnZTsJLyogc2V0IGR0b3IgKi8KKwlzZXRfY29tcG91bmRfcGFnZV9kdG9yKHBhZ2UsIGZyZWVfY29tcG91bmRfcGFnZSk7CiAJcGFnZVsxXS5scnUucHJldiA9ICh2b2lkICopb3JkZXI7CiAJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnAgPSBwYWdlICsgaTsKQEAgLTQ4NSw3ICs0ODAsNyBAQAogCXNwaW5fbG9jaygmem9uZS0+bG9jayk7CiAJem9uZS0+YWxsX3VucmVjbGFpbWFibGUgPSAwOwogCXpvbmUtPnBhZ2VzX3NjYW5uZWQgPSAwOwotCV9fZnJlZV9vbmVfcGFnZShwYWdlLCB6b25lICxvcmRlcik7CisJX19mcmVlX29uZV9wYWdlKHBhZ2UsIHpvbmUsIG9yZGVyKTsKIAlzcGluX3VubG9jaygmem9uZS0+bG9jayk7CiB9CiAKQEAgLTYwNCw2ICs1OTksOCBAQAogCQkJMSA8PCBQR19jaGVja2VkIHwgMSA8PCBQR19tYXBwZWR0b2Rpc2spOwogCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CiAJc2V0X3BhZ2VfcmVmY291bnRlZChwYWdlKTsKKworCWFyY2hfYWxsb2NfcGFnZShwYWdlLCBvcmRlcik7CiAJa2VybmVsX21hcF9wYWdlcyhwYWdlLCAxIDw8IG9yZGVyLCAxKTsKIAogCWlmIChnZnBfZmxhZ3MgJiBfX0dGUF9aRVJPKQpAQCAtNjg5LDkgKzY4NiwxNSBAQAogCiAJCQlwY3AgPSAmcHNldC0+cGNwW2ldOwogCQkJaWYgKHBjcC0+Y291bnQpIHsKKwkJCQlpbnQgdG9fZHJhaW47CisKIAkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCQkJZnJlZV9wYWdlc19idWxrKHpvbmUsIHBjcC0+Y291bnQsICZwY3AtPmxpc3QsIDApOwotCQkJCXBjcC0+Y291bnQgPSAwOworCQkJCWlmIChwY3AtPmNvdW50ID49IHBjcC0+YmF0Y2gpCisJCQkJCXRvX2RyYWluID0gcGNwLT5iYXRjaDsKKwkJCQllbHNlCisJCQkJCXRvX2RyYWluID0gcGNwLT5jb3VudDsKKwkJCQlmcmVlX3BhZ2VzX2J1bGsoem9uZSwgdG9fZHJhaW4sICZwY3AtPmxpc3QsIDApOworCQkJCXBjcC0+Y291bnQgLT0gdG9fZHJhaW47CiAJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQkJfQogCQl9CkBAIC02OTksNyArNzAyLDYgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKQogc3RhdGljIHZvaWQgX19kcmFpbl9wYWdlcyh1bnNpZ25lZCBpbnQgY3B1KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC03MjEsNyArNzIzLDYgQEAKIAkJfQogCX0KIH0KLSNlbmRpZiAvKiBDT05GSUdfUE0gfHwgQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKICNpZmRlZiBDT05GSUdfUE0KIApAQCAtODUyLDcgKzg1Myw3IEBACiAJCXBjcCA9ICZ6b25lX3BjcCh6b25lLCBjcHUpLT5wY3BbY29sZF07CiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJaWYgKCFwY3AtPmNvdW50KSB7Ci0JCQlwY3AtPmNvdW50ICs9IHJtcXVldWVfYnVsayh6b25lLCAwLAorCQkJcGNwLT5jb3VudCA9IHJtcXVldWVfYnVsayh6b25lLCAwLAogCQkJCQkJcGNwLT5iYXRjaCwgJnBjcC0+bGlzdCk7CiAJCQlpZiAodW5saWtlbHkoIXBjcC0+Y291bnQpKQogCQkJCWdvdG8gZmFpbGVkOwpAQCAtODkyLDYgKzg5Myw5MSBAQAogI2RlZmluZSBBTExPQ19ISUdICQkweDIwIC8qIF9fR0ZQX0hJR0ggc2V0ICovCiAjZGVmaW5lIEFMTE9DX0NQVVNFVAkJMHg0MCAvKiBjaGVjayBmb3IgY29ycmVjdCBjcHVzZXQgKi8KIAorI2lmZGVmIENPTkZJR19GQUlMX1BBR0VfQUxMT0MKKworc3RhdGljIHN0cnVjdCBmYWlsX3BhZ2VfYWxsb2NfYXR0ciB7CisJc3RydWN0IGZhdWx0X2F0dHIgYXR0cjsKKworCXUzMiBpZ25vcmVfZ2ZwX2hpZ2htZW07CisJdTMyIGlnbm9yZV9nZnBfd2FpdDsKKworI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKKworCXN0cnVjdCBkZW50cnkgKmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlOworCXN0cnVjdCBkZW50cnkgKmlnbm9yZV9nZnBfd2FpdF9maWxlOworCisjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLworCit9IGZhaWxfcGFnZV9hbGxvYyA9IHsKKwkuYXR0ciA9IEZBVUxUX0FUVFJfSU5JVElBTElaRVIsCisJLmlnbm9yZV9nZnBfd2FpdCA9IDEsCisJLmlnbm9yZV9nZnBfaGlnaG1lbSA9IDEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9mYWlsX3BhZ2VfYWxsb2MoY2hhciAqc3RyKQoreworCXJldHVybiBzZXR1cF9mYXVsdF9hdHRyKCZmYWlsX3BhZ2VfYWxsb2MuYXR0ciwgc3RyKTsKK30KK19fc2V0dXAoImZhaWxfcGFnZV9hbGxvYz0iLCBzZXR1cF9mYWlsX3BhZ2VfYWxsb2MpOworCitzdGF0aWMgaW50IHNob3VsZF9mYWlsX2FsbG9jX3BhZ2UoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcikKK3sKKwlpZiAoZ2ZwX21hc2sgJiBfX0dGUF9OT0ZBSUwpCisJCXJldHVybiAwOworCWlmIChmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtICYmIChnZnBfbWFzayAmIF9fR0ZQX0hJR0hNRU0pKQorCQlyZXR1cm4gMDsKKwlpZiAoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfd2FpdCAmJiAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2hvdWxkX2ZhaWwoJmZhaWxfcGFnZV9hbGxvYy5hdHRyLCAxIDw8IG9yZGVyKTsKK30KKworI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKKworc3RhdGljIGludCBfX2luaXQgZmFpbF9wYWdlX2FsbG9jX2RlYnVnZnModm9pZCkKK3sKKwltb2RlX3QgbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JV1VTUjsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7CisJaW50IGVycjsKKworCWVyciA9IGluaXRfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbF9wYWdlX2FsbG9jLmF0dHIsCisJCQkJICAgICAgICJmYWlsX3BhZ2VfYWxsb2MiKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWRpciA9IGZhaWxfcGFnZV9hbGxvYy5hdHRyLmRlbnRyaWVzLmRpcjsKKworCWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX3dhaXRfZmlsZSA9CisJCWRlYnVnZnNfY3JlYXRlX2Jvb2woImlnbm9yZS1nZnAtd2FpdCIsIG1vZGUsIGRpciwKKwkJCQkgICAgICAmZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfd2FpdCk7CisKKwlmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpZ25vcmUtZ2ZwLWhpZ2htZW0iLCBtb2RlLCBkaXIsCisJCQkJICAgICAgJmZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW0pOworCisJaWYgKCFmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF93YWl0X2ZpbGUgfHwKKwkJCSFmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZGVidWdmc19yZW1vdmUoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfd2FpdF9maWxlKTsKKwkJZGVidWdmc19yZW1vdmUoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlKTsKKwkJY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsX3BhZ2VfYWxsb2MuYXR0cik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworbGF0ZV9pbml0Y2FsbChmYWlsX3BhZ2VfYWxsb2NfZGVidWdmcyk7CisKKyNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTICovCisKKyNlbHNlIC8qIENPTkZJR19GQUlMX1BBR0VfQUxMT0MgKi8KKworc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX2ZhaWxfYWxsb2NfcGFnZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX0ZBSUxfUEFHRV9BTExPQyAqLworCiAvKgogICogUmV0dXJuIDEgaWYgZnJlZSBwYWdlcyBhcmUgYWJvdmUgJ21hcmsnLiBUaGlzIHRha2VzIGludG8gYWNjb3VudCB0aGUgb3JkZXIKICAqIG9mIHRoZSBhbGxvY2F0aW9uLgpAQCAtOTI0LDMxICsxMDEwLDE2MCBAQAogCXJldHVybiAxOwogfQogCisjaWZkZWYgQ09ORklHX05VTUEKIC8qCi0gKiBnZXRfcGFnZV9mcm9tX2ZyZWVsaWVzdCBnb2VzIHRocm91Z2ggdGhlIHpvbmVsaXN0IHRyeWluZyB0byBhbGxvY2F0ZQorICogemxjX3NldHVwIC0gU2V0dXAgZm9yICJ6b25lbGlzdCBjYWNoZSIuICBVc2VzIGNhY2hlZCB6b25lIGRhdGEgdG8KKyAqIHNraXAgb3ZlciB6b25lcyB0aGF0IGFyZSBub3QgYWxsb3dlZCBieSB0aGUgY3B1c2V0LCBvciB0aGF0IGhhdmUKKyAqIGJlZW4gcmVjZW50bHkgKGluIGxhc3Qgc2Vjb25kKSBmb3VuZCB0byBiZSBuZWFybHkgZnVsbC4gIFNlZSBmdXJ0aGVyCisgKiBjb21tZW50cyBpbiBtbXpvbmUuaC4gIFJlZHVjZXMgY2FjaGUgZm9vdHByaW50IG9mIHpvbmVsaXN0IHNjYW5zCisgKiB0aGF0IGhhdmUgdG8gc2tpcCBvdmVyIGFsb3Qgb2YgZnVsbCBvciB1bmFsbG93ZWQgem9uZXMuCisgKgorICogSWYgdGhlIHpvbmVsaXN0IGNhY2hlIGlzIHByZXNlbnQgaW4gdGhlIHBhc3NlZCBpbiB6b25lbGlzdCwgdGhlbgorICogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG93ZWQgbm9kZSBtYXNrIChlaXRoZXIgdGhlIGN1cnJlbnQKKyAqIHRhc2tzIG1lbXNfYWxsb3dlZCwgb3Igbm9kZV9vbmxpbmVfbWFwLikKKyAqCisgKiBJZiB0aGUgem9uZWxpc3QgY2FjaGUgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB6b25lbGlzdCwgZG9lcworICogbm90aGluZyBhbmQgcmV0dXJucyBOVUxMLgorICoKKyAqIElmIHRoZSBmdWxsem9uZXMgQklUTUFQIGluIHRoZSB6b25lbGlzdCBjYWNoZSBpcyBzdGFsZSAobW9yZSB0aGFuCisgKiBhIHNlY29uZCBzaW5jZSBsYXN0IHphcCdkKSB0aGVuIHdlIHphcCBpdCBvdXQgKGNsZWFyIGl0cyBiaXRzLikKKyAqCisgKiBXZSBob2xkIG9mZiBldmVuIGNhbGxpbmcgemxjX3NldHVwLCB1bnRpbCBhZnRlciB3ZSd2ZSBjaGVja2VkIHRoZQorICogZmlyc3Qgem9uZSBpbiB0aGUgem9uZWxpc3QsIG9uIHRoZSB0aGVvcnkgdGhhdCBtb3N0IGFsbG9jYXRpb25zIHdpbGwKKyAqIGJlIHNhdGlzZmllZCBmcm9tIHRoYXQgZmlyc3Qgem9uZSwgc28gYmVzdCB0byBleGFtaW5lIHRoYXQgem9uZSBhcworICogcXVpY2tseSBhcyB3ZSBjYW4uCisgKi8KK3N0YXRpYyBub2RlbWFza190ICp6bGNfc2V0dXAoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgaW50IGFsbG9jX2ZsYWdzKQoreworCXN0cnVjdCB6b25lbGlzdF9jYWNoZSAqemxjOwkvKiBjYWNoZWQgem9uZWxpc3Qgc3BlZWR1cCBpbmZvICovCisJbm9kZW1hc2tfdCAqYWxsb3dlZG5vZGVzOwkvKiB6b25lbGlzdF9jYWNoZSBhcHByb3hpbWF0aW9uICovCisKKwl6bGMgPSB6b25lbGlzdC0+emxjYWNoZV9wdHI7CisJaWYgKCF6bGMpCisJCXJldHVybiBOVUxMOworCisJaWYgKGppZmZpZXMgLSB6bGMtPmxhc3RfZnVsbF96YXAgPiAxICogSFopIHsKKwkJYml0bWFwX3plcm8oemxjLT5mdWxsem9uZXMsIE1BWF9aT05FU19QRVJfWk9ORUxJU1QpOworCQl6bGMtPmxhc3RfZnVsbF96YXAgPSBqaWZmaWVzOworCX0KKworCWFsbG93ZWRub2RlcyA9ICFpbl9pbnRlcnJ1cHQoKSAmJiAoYWxsb2NfZmxhZ3MgJiBBTExPQ19DUFVTRVQpID8KKwkJCQkJJmNwdXNldF9jdXJyZW50X21lbXNfYWxsb3dlZCA6CisJCQkJCSZub2RlX29ubGluZV9tYXA7CisJcmV0dXJuIGFsbG93ZWRub2RlczsKK30KKworLyoKKyAqIEdpdmVuICd6JyBzY2FubmluZyBhIHpvbmVsaXN0LCBydW4gYSBjb3VwbGUgb2YgcXVpY2sgY2hlY2tzIHRvIHNlZQorICogaWYgaXQgaXMgd29ydGggbG9va2luZyBhdCBmdXJ0aGVyIGZvciBmcmVlIG1lbW9yeToKKyAqICAxKSBDaGVjayB0aGF0IHRoZSB6b25lIGlzbid0IHRob3VnaHQgdG8gYmUgZnVsbCAoZG9lc24ndCBoYXZlIGl0cworICogICAgIGJpdCBzZXQgaW4gdGhlIHpvbmVsaXN0X2NhY2hlIGZ1bGx6b25lcyBCSVRNQVApLgorICogIDIpIENoZWNrIHRoYXQgdGhlIHpvbmVzIG5vZGUgKG9idGFpbmVkIGZyb20gdGhlIHpvbmVsaXN0X2NhY2hlCisgKiAgICAgel90b19uW10gbWFwcGluZykgaXMgYWxsb3dlZCBpbiB0aGUgcGFzc2VkIGluIGFsbG93ZWRub2RlcyBtYXNrLgorICogUmV0dXJuIHRydWUgKG5vbi16ZXJvKSBpZiB6b25lIGlzIHdvcnRoIGxvb2tpbmcgYXQgZnVydGhlciwgb3IKKyAqIGVsc2UgcmV0dXJuIGZhbHNlICh6ZXJvKSBpZiBpdCBpcyBub3QuCisgKgorICogVGhpcyBjaGVjayAtaWdub3Jlcy0gdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdmFyaW91cyB3YXRlcm1hcmtzLAorICogc3VjaCBhcyBHRlBfSElHSCwgR0ZQX0FUT01JQywgUEZfTUVNQUxMT0MsIC4uLiAgSWYgYSB6b25lIGlzCisgKiBmb3VuZCB0byBiZSBmdWxsIGZvciBhbnkgdmFyaWF0aW9uIG9mIHRoZXNlIHdhdGVybWFya3MsIGl0IHdpbGwKKyAqIGJlIGNvbnNpZGVyZWQgZnVsbCBmb3IgdXAgdG8gb25lIHNlY29uZCBieSBhbGwgcmVxdWVzdHMsIHVubGVzcworICogd2UgYXJlIHNvIGxvdyBvbiBtZW1vcnkgb24gYWxsIGFsbG93ZWQgbm9kZXMgdGhhdCB3ZSBhcmUgZm9yY2VkCisgKiBpbnRvIHRoZSBzZWNvbmQgc2NhbiBvZiB0aGUgem9uZWxpc3QuCisgKgorICogSW4gdGhlIHNlY29uZCBzY2FuIHdlIGlnbm9yZSB0aGlzIHpvbmVsaXN0IGNhY2hlIGFuZCBleGFjdGx5CisgKiBhcHBseSB0aGUgd2F0ZXJtYXJrcyB0byBhbGwgem9uZXMsIGV2ZW4gaXQgaXMgc2xvd2VyIHRvIGRvIHNvLgorICogV2UgYXJlIGxvdyBvbiBtZW1vcnkgaW4gdGhlIHNlY29uZCBzY2FuLCBhbmQgc2hvdWxkIGxlYXZlIG5vIHN0b25lCisgKiB1bnR1cm5lZCBsb29raW5nIGZvciBhIGZyZWUgcGFnZS4KKyAqLworc3RhdGljIGludCB6bGNfem9uZV93b3J0aF90cnlpbmcoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgc3RydWN0IHpvbmUgKip6LAorCQkJCQkJbm9kZW1hc2tfdCAqYWxsb3dlZG5vZGVzKQoreworCXN0cnVjdCB6b25lbGlzdF9jYWNoZSAqemxjOwkvKiBjYWNoZWQgem9uZWxpc3Qgc3BlZWR1cCBpbmZvICovCisJaW50IGk7CQkJCS8qIGluZGV4IG9mICp6IGluIHpvbmVsaXN0IHpvbmVzICovCisJaW50IG47CQkJCS8qIG5vZGUgdGhhdCB6b25lICp6IGlzIG9uICovCisKKwl6bGMgPSB6b25lbGlzdC0+emxjYWNoZV9wdHI7CisJaWYgKCF6bGMpCisJCXJldHVybiAxOworCisJaSA9IHogLSB6b25lbGlzdC0+em9uZXM7CisJbiA9IHpsYy0+el90b19uW2ldOworCisJLyogVGhpcyB6b25lIGlzIHdvcnRoIHRyeWluZyBpZiBpdCBpcyBhbGxvd2VkIGJ1dCBub3QgZnVsbCAqLworCXJldHVybiBub2RlX2lzc2V0KG4sICphbGxvd2Vkbm9kZXMpICYmICF0ZXN0X2JpdChpLCB6bGMtPmZ1bGx6b25lcyk7Cit9CisKKy8qCisgKiBHaXZlbiAneicgc2Nhbm5pbmcgYSB6b25lbGlzdCwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbgorICogemxjLT5mdWxsem9uZXMsIHNvIHRoYXQgc3Vic2VxdWVudCBhdHRlbXB0cyB0byBhbGxvY2F0ZSBhIHBhZ2UKKyAqIGZyb20gdGhhdCB6b25lIGRvbid0IHdhc3RlIHRpbWUgcmUtZXhhbWluaW5nIGl0LgorICovCitzdGF0aWMgdm9pZCB6bGNfbWFya196b25lX2Z1bGwoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgc3RydWN0IHpvbmUgKip6KQoreworCXN0cnVjdCB6b25lbGlzdF9jYWNoZSAqemxjOwkvKiBjYWNoZWQgem9uZWxpc3Qgc3BlZWR1cCBpbmZvICovCisJaW50IGk7CQkJCS8qIGluZGV4IG9mICp6IGluIHpvbmVsaXN0IHpvbmVzICovCisKKwl6bGMgPSB6b25lbGlzdC0+emxjYWNoZV9wdHI7CisJaWYgKCF6bGMpCisJCXJldHVybjsKKworCWkgPSB6IC0gem9uZWxpc3QtPnpvbmVzOworCisJc2V0X2JpdChpLCB6bGMtPmZ1bGx6b25lcyk7Cit9CisKKyNlbHNlCS8qIENPTkZJR19OVU1BICovCisKK3N0YXRpYyBub2RlbWFza190ICp6bGNfc2V0dXAoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgaW50IGFsbG9jX2ZsYWdzKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHpsY196b25lX3dvcnRoX3RyeWluZyhzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LCBzdHJ1Y3Qgem9uZSAqKnosCisJCQkJbm9kZW1hc2tfdCAqYWxsb3dlZG5vZGVzKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB6bGNfbWFya196b25lX2Z1bGwoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgc3RydWN0IHpvbmUgKip6KQoreworfQorI2VuZGlmCS8qIENPTkZJR19OVU1BICovCisKKy8qCisgKiBnZXRfcGFnZV9mcm9tX2ZyZWVsaXN0IGdvZXMgdGhyb3VnaCB0aGUgem9uZWxpc3QgdHJ5aW5nIHRvIGFsbG9jYXRlCiAgKiBhIHBhZ2UuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqCiBnZXRfcGFnZV9mcm9tX2ZyZWVsaXN0KGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsCiAJCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsIGludCBhbGxvY19mbGFncykKIHsKLQlzdHJ1Y3Qgem9uZSAqKnogPSB6b25lbGlzdC0+em9uZXM7CisJc3RydWN0IHpvbmUgKip6OwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKLQlpbnQgY2xhc3N6b25lX2lkeCA9IHpvbmVfaWR4KCp6KTsKKwlpbnQgY2xhc3N6b25lX2lkeCA9IHpvbmVfaWR4KHpvbmVsaXN0LT56b25lc1swXSk7CiAJc3RydWN0IHpvbmUgKnpvbmU7CisJbm9kZW1hc2tfdCAqYWxsb3dlZG5vZGVzID0gTlVMTDsvKiB6b25lbGlzdF9jYWNoZSBhcHByb3hpbWF0aW9uICovCisJaW50IHpsY19hY3RpdmUgPSAwOwkJLyogc2V0IGlmIHVzaW5nIHpvbmVsaXN0X2NhY2hlICovCisJaW50IGRpZF96bGNfc2V0dXAgPSAwOwkJLyoganVzdCBjYWxsIHpsY19zZXR1cCgpIG9uZSB0aW1lICovCiAKK3pvbmVsaXN0X3NjYW46CiAJLyoKLQkgKiBHbyB0aHJvdWdoIHRoZSB6b25lbGlzdCBvbmNlLCBsb29raW5nIGZvciBhIHpvbmUgd2l0aCBlbm91Z2ggZnJlZS4KKwkgKiBTY2FuIHpvbmVsaXN0LCBsb29raW5nIGZvciBhIHpvbmUgd2l0aCBlbm91Z2ggZnJlZS4KIAkgKiBTZWUgYWxzbyBjcHVzZXRfem9uZV9hbGxvd2VkKCkgY29tbWVudCBpbiBrZXJuZWwvY3B1c2V0LmMuCiAJICovCisJeiA9IHpvbmVsaXN0LT56b25lczsKKwogCWRvIHsKKwkJaWYgKE5VTUFfQlVJTEQgJiYgemxjX2FjdGl2ZSAmJgorCQkJIXpsY196b25lX3dvcnRoX3RyeWluZyh6b25lbGlzdCwgeiwgYWxsb3dlZG5vZGVzKSkKKwkJCQljb250aW51ZTsKIAkJem9uZSA9ICp6OwogCQlpZiAodW5saWtlbHkoTlVNQV9CVUlMRCAmJiAoZ2ZwX21hc2sgJiBfX0dGUF9USElTTk9ERSkgJiYKIAkJCXpvbmUtPnpvbmVfcGdkYXQgIT0gem9uZWxpc3QtPnpvbmVzWzBdLT56b25lX3BnZGF0KSkKIAkJCQlicmVhazsKIAkJaWYgKChhbGxvY19mbGFncyAmIEFMTE9DX0NQVVNFVCkgJiYKLQkJCQkhY3B1c2V0X3pvbmVfYWxsb3dlZCh6b25lLCBnZnBfbWFzaykpCi0JCQljb250aW51ZTsKKwkJCSFjcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKHpvbmUsIGdmcF9tYXNrKSkKKwkJCQlnb3RvIHRyeV9uZXh0X3pvbmU7CiAKIAkJaWYgKCEoYWxsb2NfZmxhZ3MgJiBBTExPQ19OT19XQVRFUk1BUktTKSkgewogCQkJdW5zaWduZWQgbG9uZyBtYXJrOwpAQCAtOTU4LDE4ICsxMTczLDM0IEBACiAJCQkJbWFyayA9IHpvbmUtPnBhZ2VzX2xvdzsKIAkJCWVsc2UKIAkJCQltYXJrID0gem9uZS0+cGFnZXNfaGlnaDsKLQkJCWlmICghem9uZV93YXRlcm1hcmtfb2soem9uZSAsIG9yZGVyLCBtYXJrLAotCQkJCSAgICBjbGFzc3pvbmVfaWR4LCBhbGxvY19mbGFncykpCisJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCBtYXJrLAorCQkJCSAgICBjbGFzc3pvbmVfaWR4LCBhbGxvY19mbGFncykpIHsKIAkJCQlpZiAoIXpvbmVfcmVjbGFpbV9tb2RlIHx8CiAJCQkJICAgICF6b25lX3JlY2xhaW0oem9uZSwgZ2ZwX21hc2ssIG9yZGVyKSkKLQkJCQkJY29udGludWU7CisJCQkJCWdvdG8gdGhpc196b25lX2Z1bGw7CisJCQl9CiAJCX0KIAogCQlwYWdlID0gYnVmZmVyZWRfcm1xdWV1ZSh6b25lbGlzdCwgem9uZSwgb3JkZXIsIGdmcF9tYXNrKTsKLQkJaWYgKHBhZ2UpIHsKKwkJaWYgKHBhZ2UpCiAJCQlicmVhazsKK3RoaXNfem9uZV9mdWxsOgorCQlpZiAoTlVNQV9CVUlMRCkKKwkJCXpsY19tYXJrX3pvbmVfZnVsbCh6b25lbGlzdCwgeik7Cit0cnlfbmV4dF96b25lOgorCQlpZiAoTlVNQV9CVUlMRCAmJiAhZGlkX3psY19zZXR1cCkgeworCQkJLyogd2UgZG8gemxjX3NldHVwIGFmdGVyIHRoZSBmaXJzdCB6b25lIGlzIHRyaWVkICovCisJCQlhbGxvd2Vkbm9kZXMgPSB6bGNfc2V0dXAoem9uZWxpc3QsIGFsbG9jX2ZsYWdzKTsKKwkJCXpsY19hY3RpdmUgPSAxOworCQkJZGlkX3psY19zZXR1cCA9IDE7CiAJCX0KIAl9IHdoaWxlICgqKCsreikgIT0gTlVMTCk7CisKKwlpZiAodW5saWtlbHkoTlVNQV9CVUlMRCAmJiBwYWdlID09IE5VTEwgJiYgemxjX2FjdGl2ZSkpIHsKKwkJLyogRGlzYWJsZSB6bGMgY2FjaGUgZm9yIHNlY29uZCB6b25lbGlzdCBzY2FuICovCisJCXpsY19hY3RpdmUgPSAwOworCQlnb3RvIHpvbmVsaXN0X3NjYW47CisJfQogCXJldHVybiBwYWdlOwogfQogCkBAIC05OTEsNiArMTIyMiw5IEBACiAKIAltaWdodF9zbGVlcF9pZih3YWl0KTsKIAorCWlmIChzaG91bGRfZmFpbF9hbGxvY19wYWdlKGdmcF9tYXNrLCBvcmRlcikpCisJCXJldHVybiBOVUxMOworCiByZXN0YXJ0OgogCXogPSB6b25lbGlzdC0+em9uZXM7ICAvKiB0aGUgbGlzdCBvZiB6b25lcyBzdWl0YWJsZSBmb3IgZ2ZwX21hc2sgKi8KIApAQCAtMTAwNCw5ICsxMjM4LDE5IEBACiAJaWYgKHBhZ2UpCiAJCWdvdG8gZ290X3BnOwogCi0JZG8geworCS8qCisJICogR0ZQX1RISVNOT0RFIChtZWFuaW5nIF9fR0ZQX1RISVNOT0RFLCBfX0dGUF9OT1JFVFJZIGFuZAorCSAqIF9fR0ZQX05PV0FSTiBzZXQpIHNob3VsZCBub3QgY2F1c2UgcmVjbGFpbSBzaW5jZSB0aGUgc3Vic3lzdGVtCisJICogKGYuZS4gc2xhYikgdXNpbmcgR0ZQX1RISVNOT0RFIG1heSBjaG9vc2UgdG8gdHJpZ2dlciByZWNsYWltCisJICogdXNpbmcgYSBsYXJnZXIgc2V0IG9mIG5vZGVzIGFmdGVyIGl0IGhhcyBlc3RhYmxpc2hlZCB0aGF0IHRoZQorCSAqIGFsbG93ZWQgcGVyIG5vZGUgcXVldWVzIGFyZSBlbXB0eSBhbmQgdGhhdCBub2RlcyBhcmUKKwkgKiBvdmVyIGFsbG9jYXRlZC4KKwkgKi8KKwlpZiAoTlVNQV9CVUlMRCAmJiAoZ2ZwX21hc2sgJiBHRlBfVEhJU05PREUpID09IEdGUF9USElTTk9ERSkKKwkJZ290byBub3BhZ2U7CisKKwlmb3IgKHogPSB6b25lbGlzdC0+em9uZXM7ICp6OyB6KyspCiAJCXdha2V1cF9rc3dhcGQoKnosIG9yZGVyKTsKLQl9IHdoaWxlICgqKCsreikpOwogCiAJLyoKIAkgKiBPSywgd2UncmUgYmVsb3cgdGhlIGtzd2FwZCB3YXRlcm1hcmsgYW5kIGhhdmUga2lja2VkIGJhY2tncm91bmQKQEAgLTEwNDAsNiArMTI4NCw3IEBACiAKIAkvKiBUaGlzIGFsbG9jYXRpb24gc2hvdWxkIGFsbG93IGZ1dHVyZSBtZW1vcnkgZnJlZWluZy4gKi8KIAorcmViYWxhbmNlOgogCWlmICgoKHAtPmZsYWdzICYgUEZfTUVNQUxMT0MpIHx8IHVubGlrZWx5KHRlc3RfdGhyZWFkX2ZsYWcoVElGX01FTURJRSkpKQogCQkJJiYgIWluX2ludGVycnVwdCgpKSB7CiAJCWlmICghKGdmcF9tYXNrICYgX19HRlBfTk9NRU1BTExPQykpIHsKQEAgLTEwNTAsNyArMTI5NSw3IEBACiAJCQlpZiAocGFnZSkKIAkJCQlnb3RvIGdvdF9wZzsKIAkJCWlmIChnZnBfbWFzayAmIF9fR0ZQX05PRkFJTCkgewotCQkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwkJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAkJCQlnb3RvIG5vZmFpbF9hbGxvYzsKIAkJCX0KIAkJfQpAQCAtMTA2MSw3ICsxMzA2LDYgQEAKIAlpZiAoIXdhaXQpCiAJCWdvdG8gbm9wYWdlOwogCi1yZWJhbGFuY2U6CiAJY29uZF9yZXNjaGVkKCk7CiAKIAkvKiBXZSBub3cgZ28gaW50byBzeW5jaHJvbm91cyByZWNsYWltICovCkBAIC0xMTEzLDcgKzEzNTcsNyBAQAogCQkJZG9fcmV0cnkgPSAxOwogCX0KIAlpZiAoZG9fcmV0cnkpIHsKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOworCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKIAkJZ290byByZWJhbGFuY2U7CiAJfQogCkBAIC0xMjYxLDcgKzE1MDUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHNob3dfbm9kZShzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKIAlpZiAoTlVNQV9CVUlMRCkKLQkJcHJpbnRrKCJOb2RlICVsZCAiLCB6b25lX3RvX25pZCh6b25lKSk7CisJCXByaW50aygiTm9kZSAlZCAiLCB6b25lX3RvX25pZCh6b25lKSk7CiB9CiAKIHZvaWQgc2lfbWVtaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqdmFsKQpAQCAtMTU0MSw2ICsxNzg1LDI0IEBACiAJfQogfQogCisvKiBDb25zdHJ1Y3QgdGhlIHpvbmVsaXN0IHBlcmZvcm1hbmNlIGNhY2hlIC0gc2VlIGZ1cnRoZXIgbW16b25lLmggKi8KK3N0YXRpYyB2b2lkIF9fbWVtaW5pdCBidWlsZF96b25lbGlzdF9jYWNoZShwZ19kYXRhX3QgKnBnZGF0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3Q7CisJCXN0cnVjdCB6b25lbGlzdF9jYWNoZSAqemxjOworCQlzdHJ1Y3Qgem9uZSAqKno7CisKKwkJem9uZWxpc3QgPSBwZ2RhdC0+bm9kZV96b25lbGlzdHMgKyBpOworCQl6b25lbGlzdC0+emxjYWNoZV9wdHIgPSB6bGMgPSAmem9uZWxpc3QtPnpsY2FjaGU7CisJCWJpdG1hcF96ZXJvKHpsYy0+ZnVsbHpvbmVzLCBNQVhfWk9ORVNfUEVSX1pPTkVMSVNUKTsKKwkJZm9yICh6ID0gem9uZWxpc3QtPnpvbmVzOyAqejsgeisrKQorCQkJemxjLT56X3RvX25beiAtIHpvbmVsaXN0LT56b25lc10gPSB6b25lX3RvX25pZCgqeik7CisJfQorfQorCiAjZWxzZQkvKiBDT05GSUdfTlVNQSAqLwogCiBzdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCkBAIC0xNTc4LDE0ICsxODQwLDI2IEBACiAJfQogfQogCisvKiBub24tTlVNQSB2YXJpYW50IG9mIHpvbmVsaXN0IHBlcmZvcm1hbmNlIGNhY2hlIC0ganVzdCBOVUxMIHpsY2FjaGVfcHRyICovCitzdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RfY2FjaGUocGdfZGF0YV90ICpwZ2RhdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykKKwkJcGdkYXQtPm5vZGVfem9uZWxpc3RzW2ldLnpsY2FjaGVfcHRyID0gTlVMTDsKK30KKwogI2VuZGlmCS8qIENPTkZJR19OVU1BICovCiAKIC8qIHJldHVybiB2YWx1ZXMgaW50IC4uLi5qdXN0IGZvciBzdG9wX21hY2hpbmVfcnVuKCkgKi8KIHN0YXRpYyBpbnQgX19tZW1pbml0IF9fYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkICpkdW1teSkKIHsKIAlpbnQgbmlkOwotCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewogCQlidWlsZF96b25lbGlzdHMoTk9ERV9EQVRBKG5pZCkpOworCQlidWlsZF96b25lbGlzdF9jYWNoZShOT0RFX0RBVEEobmlkKSk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xNjg4LDYgKzE5NjIsOCBAQAogCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgewogCQlpZiAoIWVhcmx5X3Bmbl92YWxpZChwZm4pKQogCQkJY29udGludWU7CisJCWlmICghZWFybHlfcGZuX2luX25pZChwZm4sIG5pZCkpCisJCQljb250aW51ZTsKIAkJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CiAJCXNldF9wYWdlX2xpbmtzKHBhZ2UsIHpvbmUsIG5pZCwgcGZuKTsKIAkJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOwpAQCAtMTcxMiwyMCArMTk4OCw2IEBACiAJfQogfQogCi0jZGVmaW5lIFpPTkVUQUJMRV9JTkRFWCh4LCB6b25lX25yKQkoKHggPDwgWk9ORVNfU0hJRlQpIHwgem9uZV9ucikKLXZvaWQgem9uZXRhYmxlX2FkZChzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG5pZCwgZW51bSB6b25lX3R5cGUgemlkLAotCQl1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXVuc2lnbmVkIGxvbmcgc251bSA9IHBmbl90b19zZWN0aW9uX25yKHBmbik7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBwZm5fdG9fc2VjdGlvbl9ucihwZm4gKyBzaXplKTsKLQotCWlmIChGTEFHU19IQVNfTk9ERSkKLQkJem9uZV90YWJsZVtaT05FVEFCTEVfSU5ERVgobmlkLCB6aWQpXSA9IHpvbmU7Ci0JZWxzZQotCQlmb3IgKDsgc251bSA8PSBlbmQ7IHNudW0rKykKLQkJCXpvbmVfdGFibGVbWk9ORVRBQkxFX0lOREVYKHNudW0sIHppZCldID0gem9uZTsKLX0KLQogI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1NQVBfSU5JVAogI2RlZmluZSBtZW1tYXBfaW5pdChzaXplLCBuaWQsIHpvbmUsIHN0YXJ0X3BmbikgXAogCW1lbW1hcF9pbml0X3pvbmUoKHNpemUpLCAobmlkKSwgKHpvbmUpLCAoc3RhcnRfcGZuKSkKQEAgLTE4NzgsMTYgKzIxNDAsMTYgQEAKIAlpbnQgcmV0ID0gTk9USUZZX09LOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBDUFVfVVBfUFJFUEFSRToKLQkJCWlmIChwcm9jZXNzX3pvbmVzKGNwdSkpCi0JCQkJcmV0ID0gTk9USUZZX0JBRDsKLQkJCWJyZWFrOwotCQljYXNlIENQVV9VUF9DQU5DRUxFRDoKLQkJY2FzZSBDUFVfREVBRDoKLQkJCWZyZWVfem9uZV9wYWdlc2V0cyhjcHUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwljYXNlIENQVV9VUF9QUkVQQVJFOgorCQlpZiAocHJvY2Vzc196b25lcyhjcHUpKQorCQkJcmV0ID0gTk9USUZZX0JBRDsKKwkJYnJlYWs7CisJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJY2FzZSBDUFVfREVBRDoKKwkJZnJlZV96b25lX3BhZ2VzZXRzKGNwdSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMjI1OCw3ICsyNTIwLDcgQEAKIAogCS8qIEFjY291bnQgZm9yIHJhbmdlcyBwYXN0IHBoeXNpY2FsIG1lbW9yeSBvbiB0aGlzIG5vZGUgKi8KIAlpZiAocmFuZ2VfZW5kX3BmbiA+IHByZXZfZW5kX3BmbikKLQkJaG9sZV9wYWdlcyA9IHJhbmdlX2VuZF9wZm4gLQorCQlob2xlX3BhZ2VzICs9IHJhbmdlX2VuZF9wZm4gLQogCQkJCW1heChyYW5nZV9zdGFydF9wZm4sIHByZXZfZW5kX3Bmbik7CiAKIAlyZXR1cm4gaG9sZV9wYWdlczsKQEAgLTI0MDQsNyArMjY2Niw3IEBACiAJCXpvbmUtPnpvbmVfcGdkYXQgPSBwZ2RhdDsKIAkJem9uZS0+ZnJlZV9wYWdlcyA9IDA7CiAKLQkJem9uZS0+dGVtcF9wcmlvcml0eSA9IHpvbmUtPnByZXZfcHJpb3JpdHkgPSBERUZfUFJJT1JJVFk7CisJCXpvbmUtPnByZXZfcHJpb3JpdHkgPSBERUZfUFJJT1JJVFk7CiAKIAkJem9uZV9wY3BfaW5pdCh6b25lKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnpvbmUtPmFjdGl2ZV9saXN0KTsKQEAgLTI0MTgsNyArMjY4MCw2IEBACiAJCWlmICghc2l6ZSkKIAkJCWNvbnRpbnVlOwogCi0JCXpvbmV0YWJsZV9hZGQoem9uZSwgbmlkLCBqLCB6b25lX3N0YXJ0X3Bmbiwgc2l6ZSk7CiAJCXJldCA9IGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoem9uZSwgem9uZV9zdGFydF9wZm4sIHNpemUpOwogCQlCVUdfT04ocmV0KTsKIAkJem9uZV9zdGFydF9wZm4gKz0gc2l6ZTsKQEAgLTI2MDksNiArMjg3MCw5IEBACiB7CiAJaW50IGk7CiAKKwkvKiBSZWdpb25zIGluIHRoZSBlYXJseV9ub2RlX21hcCBjYW4gYmUgaW4gYW55IG9yZGVyICovCisJc29ydF9ub2RlX21hcCgpOworCiAJLyogQXNzdW1pbmcgYSBzb3J0ZWQgbWFwLCB0aGUgZmlyc3QgcmFuZ2UgZm91bmQgaGFzIHRoZSBzdGFydGluZyBwZm4gKi8KIAlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkKGksIG5pZCkKIAkJcmV0dXJuIGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbjsKQEAgLTI2NzcsOSArMjk0MSw2IEBACiAJCQltYXgobWF4X3pvbmVfcGZuW2ldLCBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltpXSk7CiAJfQogCi0JLyogUmVnaW9ucyBpbiB0aGUgZWFybHlfbm9kZV9tYXAgY2FuIGJlIGluIGFueSBvcmRlciAqLwotCXNvcnRfbm9kZV9tYXAoKTsKLQogCS8qIFByaW50IG91dCB0aGUgem9uZSByYW5nZXMgKi8KIAlwcmludGsoIlpvbmUgUEZOIHJhbmdlczpcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykKQEAgLTI3MzMsNyArMjk5NCw2IEBACiAJCQlfX3BhKFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZULCBOVUxMKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIGludCBwYWdlX2FsbG9jX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKQEAgLTI3NDgsNyArMzAwOCw2IEBACiAJfQogCXJldHVybiBOT1RJRllfT0s7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIHZvaWQgX19pbml0IHBhZ2VfYWxsb2NfaW5pdCh2b2lkKQogewpAQCAtMzA1Miw3ICszMzExLDcgQEAKIAkvKiBhbGxvdyB0aGUga2VybmVsIGNtZGxpbmUgdG8gaGF2ZSBhIHNheSAqLwogCWlmICghbnVtZW50cmllcykgewogCQkvKiByb3VuZCBhcHBsaWNhYmxlIG1lbW9yeSBzaXplIHVwIHRvIG5lYXJlc3QgbWVnYWJ5dGUgKi8KLQkJbnVtZW50cmllcyA9IChmbGFncyAmIEhBU0hfSElHSE1FTSkgPyBucl9hbGxfcGFnZXMgOiBucl9rZXJuZWxfcGFnZXM7CisJCW51bWVudHJpZXMgPSBucl9rZXJuZWxfcGFnZXM7CiAJCW51bWVudHJpZXMgKz0gKDFVTCA8PCAoMjAgLSBQQUdFX1NISUZUKSkgLSAxOwogCQludW1lbnRyaWVzID4+PSAyMCAtIFBBR0VfU0hJRlQ7CiAJCW51bWVudHJpZXMgPDw9IDIwIC0gUEFHRV9TSElGVDsKQEAgLTMwNzQsNyArMzMzMyw3IEBACiAJaWYgKG51bWVudHJpZXMgPiBtYXgpCiAJCW51bWVudHJpZXMgPSBtYXg7CiAKLQlsb2cycXR5ID0gbG9uZ19sb2cyKG51bWVudHJpZXMpOworCWxvZzJxdHkgPSBpbG9nMihudW1lbnRyaWVzKTsKIAogCWRvIHsKIAkJc2l6ZSA9IGJ1Y2tldHNpemUgPDwgbG9nMnF0eTsKQEAgLTMwOTYsNyArMzM1NSw3IEBACiAJcHJpbnRrKCIlcyBoYXNoIHRhYmxlIGVudHJpZXM6ICVkIChvcmRlcjogJWQsICVsdSBieXRlcylcbiIsCiAJICAgICAgIHRhYmxlbmFtZSwKIAkgICAgICAgKDFVIDw8IGxvZzJxdHkpLAotCSAgICAgICBsb25nX2xvZzIoc2l6ZSkgLSBQQUdFX1NISUZULAorCSAgICAgICBpbG9nMihzaXplKSAtIFBBR0VfU0hJRlQsCiAJICAgICAgIHNpemUpOwogCiAJaWYgKF9oYXNoX3NoaWZ0KQpAQCAtMzExOSwzICszMzc4LDE5IEBACiBFWFBPUlRfU1lNQk9MKHBmbl90b19wYWdlKTsKIEVYUE9SVF9TWU1CT0wocGFnZV90b19wZm4pOwogI2VuZGlmIC8qIENPTkZJR19PVVRfT0ZfTElORV9QRk5fVE9fUEFHRSAqLworCisjaWYgTUFYX05VTU5PREVTID4gMQorLyoKKyAqIEZpbmQgdGhlIGhpZ2hlc3QgcG9zc2libGUgbm9kZSBpZC4KKyAqLworaW50IGhpZ2hlc3RfcG9zc2libGVfbm9kZV9pZCh2b2lkKQoreworCXVuc2lnbmVkIGludCBub2RlOworCXVuc2lnbmVkIGludCBoaWdoZXN0ID0gMDsKKworCWZvcl9lYWNoX25vZGVfbWFzayhub2RlLCBub2RlX3Bvc3NpYmxlX21hcCkKKwkJaGlnaGVzdCA9IG5vZGU7CisJcmV0dXJuIGhpZ2hlc3Q7Cit9CitFWFBPUlRfU1lNQk9MKGhpZ2hlc3RfcG9zc2libGVfbm9kZV9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL21tL3BhZ2VfaW8uYyBiL21tL3BhZ2VfaW8uYwppbmRleCBkNDg0MGVjLi5kYmZmZWMwIDEwMDY0NAotLS0gYS9tbS9wYWdlX2lvLmMKKysrIGIvbW0vcGFnZV9pby5jCkBAIC0xNDcsNDggKzE0NywzIEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KLQotI2lmZGVmIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5ECi0vKgotICogQSBzY3J1ZmZ5IHV0aWxpdHkgZnVuY3Rpb24gdG8gcmVhZCBvciB3cml0ZSBhbiBhcmJpdHJhcnkgc3dhcCBwYWdlCi0gKiBhbmQgd2FpdCBvbiB0aGUgSS9PLiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgYSByZWYgb24gdGhlIHBhZ2UuCi0gKgotICogV2UgdXNlIGVuZF9zd2FwX2Jpb19yZWFkKCkgZXZlbiBmb3Igd3JpdGVzLCBiZWNhdXNlIGl0IGhhcHBlbnMgdG8gZG8gd2hhdAotICogd2Ugd2FudC4KLSAqLwotaW50IHJ3X3N3YXBfcGFnZV9zeW5jKGludCBydywgc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJc3RydWN0IGJpbyAqKmJpb19jaGFpbikKLXsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IHJldCA9IDA7Ci0JaW50IGJpb19ydzsKLQotCWxvY2tfcGFnZShwYWdlKTsKLQotCWJpbyA9IGdldF9zd2FwX2JpbyhHRlBfS0VSTkVMLCBlbnRyeS52YWwsIHBhZ2UsIGVuZF9zd2FwX2Jpb19yZWFkKTsKLQlpZiAoYmlvID09IE5VTEwpIHsKLQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWJpb19ydyA9IHJ3OwotCWlmICghYmlvX2NoYWluKQotCQliaW9fcncgfD0gKDEgPDwgQklPX1JXX1NZTkMpOwotCWlmIChiaW9fY2hhaW4pCi0JCWJpb19nZXQoYmlvKTsKLQlzdWJtaXRfYmlvKGJpb19ydywgYmlvKTsKLQlpZiAoYmlvX2NoYWluID09IE5VTEwpIHsKLQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQotCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBQYWdlRXJyb3IocGFnZSkpCi0JCQlyZXQgPSAtRUlPOwotCX0KLQlpZiAoYmlvX2NoYWluKSB7Ci0JCWJpby0+YmlfcHJpdmF0ZSA9ICpiaW9fY2hhaW47Ci0JCSpiaW9fY2hhaW4gPSBiaW87Ci0JfQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21tL3BkZmx1c2guYyBiL21tL3BkZmx1c2guYwppbmRleCBiMDIxMDJmLi44Y2UwOTAwIDEwMDY0NAotLS0gYS9tbS9wZGZsdXNoLmMKKysrIGIvbW0vcGRmbHVzaC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CS8vIFByb3RvdHlwZXMgcGRmbHVzaF9vcGVyYXRpb24oKQogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKIAogLyoKZGlmZiAtLWdpdCBhL21tL3JlYWRhaGVhZC5jIGIvbW0vcmVhZGFoZWFkLmMKaW5kZXggMWJhNzM2YS4uMGY1MzllOCAxMDA2NDQKLS0tIGEvbW0vcmVhZGFoZWFkLmMKKysrIGIvbW0vcmVhZGFoZWFkLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAKIHZvaWQgZGVmYXVsdF91bnBsdWdfaW9fZm4oc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwgc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0xNDgsMTUgKzE0OSwxMCBAQAogCQlpZiAoIXBhZ2V2ZWNfYWRkKCZscnVfcHZlYywgcGFnZSkpCiAJCQlfX3BhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOwogCQlpZiAocmV0KSB7Ci0JCQl3aGlsZSAoIWxpc3RfZW1wdHkocGFnZXMpKSB7Ci0JCQkJc3RydWN0IHBhZ2UgKnZpY3RpbTsKLQotCQkJCXZpY3RpbSA9IGxpc3RfdG9fcGFnZShwYWdlcyk7Ci0JCQkJbGlzdF9kZWwoJnZpY3RpbS0+bHJ1KTsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UodmljdGltKTsKLQkJCX0KKwkJCXB1dF9wYWdlc19saXN0KHBhZ2VzKTsKIAkJCWJyZWFrOwogCQl9CisJCXRhc2tfaW9fYWNjb3VudF9yZWFkKFBBR0VfQ0FDSEVfU0laRSk7CiAJfQogCXBhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOwogCXJldHVybiByZXQ7CkBAIC0xNzMsNiArMTY5LDggQEAKIAogCWlmIChtYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2VzKSB7CiAJCXJldCA9IG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZXMoZmlscCwgbWFwcGluZywgcGFnZXMsIG5yX3BhZ2VzKTsKKwkJLyogQ2xlYW4gdXAgdGhlIHJlbWFpbmluZyBwYWdlcyAqLworCQlwdXRfcGFnZXNfbGlzdChwYWdlcyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNDU0LDcgKzQ1Miw3IEBACiAgKgogICogTm90ZSB0aGF0IEBmaWxwIGlzIHB1cmVseSB1c2VkIGZvciBwYXNzaW5nIG9uIHRvIHRoZSAtPnJlYWRwYWdlW3NdKCkKICAqIGhhbmRsZXI6IGl0IG1heSByZWZlciB0byBhIGRpZmZlcmVudCBmaWxlIGZyb20gQG1hcHBpbmcgKHNvIHdlIG1heSBub3QgdXNlCi0gKiBAZmlscC0+Zl9tYXBwaW5nIG9yIEBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSBoZXJlKS4KKyAqIEBmaWxwLT5mX21hcHBpbmcgb3IgQGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUgaGVyZSkuCiAgKiBBbHNvLCBAcmEgbWF5IG5vdCBiZSBlcXVhbCB0byAmQGZpbHAtPmZfcmEuCiAgKgogICovCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggYTkxMzZkOC4uZDhhODQyYSAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtMjEsMjcgKzIxLDIxIEBACiAgKiBMb2NrIG9yZGVyaW5nIGluIG1tOgogICoKICAqIGlub2RlLT5pX211dGV4CSh3aGlsZSB3cml0aW5nIG9yIHRydW5jYXRpbmcsIG5vdCByZWFkaW5nIG9yIGZhdWx0aW5nKQotICogICBpbm9kZS0+aV9hbGxvY19zZW0KLSAqCi0gKiBXaGVuIGEgcGFnZSBmYXVsdCBvY2N1cnMgaW4gd3JpdGluZyBmcm9tIHVzZXIgdG8gZmlsZSwgZG93bl9yZWFkCi0gKiBvZiBtbWFwX3NlbSBuZXN0cyB3aXRoaW4gaV9tdXRleDsgaW4gc3lzX21zeW5jLCBpX211dGV4IG5lc3RzIHdpdGhpbgotICogZG93bl9yZWFkIG9mIG1tYXBfc2VtOyBpX211dGV4IGFuZCBkb3duX3dyaXRlIG9mIG1tYXBfc2VtIGFyZSBuZXZlcgotICogdGFrZW4gdG9nZXRoZXI7IGluIHRydW5jYXRpb24sIGlfbXV0ZXggaXMgdGFrZW4gb3V0ZXJtb3N0LgotICoKLSAqIG1tLT5tbWFwX3NlbQotICogICBwYWdlLT5mbGFncyBQR19sb2NrZWQgKGxvY2tfcGFnZSkKLSAqICAgICBtYXBwaW5nLT5pX21tYXBfbG9jawotICogICAgICAgYW5vbl92bWEtPmxvY2sKLSAqICAgICAgICAgbW0tPnBhZ2VfdGFibGVfbG9jayBvciBwdGVfbG9jawotICogICAgICAgICAgIHpvbmUtPmxydV9sb2NrIChpbiBtYXJrX3BhZ2VfYWNjZXNzZWQsIGlzb2xhdGVfbHJ1X3BhZ2UpCi0gKiAgICAgICAgICAgc3dhcF9sb2NrIChpbiBzd2FwX2R1cGxpY2F0ZSwgc3dhcF9pbmZvX2dldCkKLSAqICAgICAgICAgICAgIG1tbGlzdF9sb2NrIChpbiBtbXB1dCwgZHJhaW5fbW1saXN0IGFuZCBvdGhlcnMpCi0gKiAgICAgICAgICAgICBtYXBwaW5nLT5wcml2YXRlX2xvY2sgKGluIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycykKLSAqICAgICAgICAgICAgIGlub2RlX2xvY2sgKGluIHNldF9wYWdlX2RpcnR5J3MgX19tYXJrX2lub2RlX2RpcnR5KQotICogICAgICAgICAgICAgICBzYl9sb2NrICh3aXRoaW4gaW5vZGVfbG9jayBpbiBmcy9mcy13cml0ZWJhY2suYykKLSAqICAgICAgICAgICAgICAgbWFwcGluZy0+dHJlZV9sb2NrICh3aWRlbHkgdXNlZCwgaW4gc2V0X3BhZ2VfZGlydHksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhcmNoLWRlcGVuZGVudCBmbHVzaF9kY2FjaGVfbW1hcF9sb2NrLAotICogICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIGlub2RlX2xvY2sgaW4gX19zeW5jX3NpbmdsZV9pbm9kZSkKKyAqICAgaW5vZGUtPmlfYWxsb2Nfc2VtICh2bXRydW5jYXRlX3JhbmdlKQorICogICBtbS0+bW1hcF9zZW0KKyAqICAgICBwYWdlLT5mbGFncyBQR19sb2NrZWQgKGxvY2tfcGFnZSkKKyAqICAgICAgIG1hcHBpbmctPmlfbW1hcF9sb2NrCisgKiAgICAgICAgIGFub25fdm1hLT5sb2NrCisgKiAgICAgICAgICAgbW0tPnBhZ2VfdGFibGVfbG9jayBvciBwdGVfbG9jaworICogICAgICAgICAgICAgem9uZS0+bHJ1X2xvY2sgKGluIG1hcmtfcGFnZV9hY2Nlc3NlZCwgaXNvbGF0ZV9scnVfcGFnZSkKKyAqICAgICAgICAgICAgIHN3YXBfbG9jayAoaW4gc3dhcF9kdXBsaWNhdGUsIHN3YXBfaW5mb19nZXQpCisgKiAgICAgICAgICAgICAgIG1tbGlzdF9sb2NrIChpbiBtbXB1dCwgZHJhaW5fbW1saXN0IGFuZCBvdGhlcnMpCisgKiAgICAgICAgICAgICAgIG1hcHBpbmctPnByaXZhdGVfbG9jayAoaW4gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKQorICogICAgICAgICAgICAgICBpbm9kZV9sb2NrIChpbiBzZXRfcGFnZV9kaXJ0eSdzIF9fbWFya19pbm9kZV9kaXJ0eSkKKyAqICAgICAgICAgICAgICAgICBzYl9sb2NrICh3aXRoaW4gaW5vZGVfbG9jayBpbiBmcy9mcy13cml0ZWJhY2suYykKKyAqICAgICAgICAgICAgICAgICBtYXBwaW5nLT50cmVlX2xvY2sgKHdpZGVseSB1c2VkLCBpbiBzZXRfcGFnZV9kaXJ0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYXJjaC1kZXBlbmRlbnQgZmx1c2hfZGNhY2hlX21tYXBfbG9jaywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIGlub2RlX2xvY2sgaW4gX19zeW5jX3NpbmdsZV9pbm9kZSkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IGJiOGNhN2UuLjRiYjI4ZDIgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KQEAgLTE3Niw3ICsxNzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc2htZW1fb3BzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgc2htZW1fYW9wczsKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNobWVtX2ZpbGVfb3BlcmF0aW9uczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNobWVtX2ZpbGVfb3BlcmF0aW9uczsKIHN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKQEAgLTExMzEsNyArMTEzMiw3IEBACiAJCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOwogCQkJaWYgKGVycm9yID09IC1FTk9NRU0pIHsKIAkJCQkvKiBsZXQga3N3YXBkIHJlZnJlc2ggem9uZSBmb3IgR0ZQX0FUT01JQ3MgKi8KLQkJCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CisJCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi81MCk7CiAJCQl9CiAJCQlnb3RvIHJlcGVhdDsKIAkJfQpAQCAtMTIyNCw3ICsxMjI1LDcgQEAKIAogc3RydWN0IHBhZ2UgKnNobWVtX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgKnR5cGUpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBpZHg7CiAJaW50IGVycm9yOwpAQCAtMTI0Nyw3ICsxMjQ4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCXBncHJvdF90IHByb3QsIHVuc2lnbmVkIGxvbmcgcGdvZmYsIGludCBub25ibG9jaykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKIAllbnVtIHNncF90eXBlIHNncCA9IG5vbmJsb2NrPyBTR1BfUVVJQ0s6IFNHUF9DQUNIRTsKIAl1bnNpZ25lZCBsb25nIHNpemU7CkBAIC0xMjkyLDE0ICsxMjkzLDE0IEBACiAjaWZkZWYgQ09ORklHX05VTUEKIGludCBzaG1lbV9zZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpuZXcpCiB7Ci0Jc3RydWN0IGlub2RlICppID0gdm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmkgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJcmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koJlNITUVNX0koaSktPnBvbGljeSwgdm1hLCBuZXcpOwogfQogCiBzdHJ1Y3QgbWVtcG9saWN5ICoKIHNobWVtX2dldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmkgPSB2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAl1bnNpZ25lZCBsb25nIGlkeDsKIAogCWlkeCA9ICgoYWRkciAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpICsgdm1hLT52bV9wZ29mZjsKQEAgLTEzMDksNyArMTMxMCw3IEBACiAKIGludCBzaG1lbV9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbG9jaywgc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IFNITUVNX0koaW5vZGUpOwogCWludCByZXR2YWwgPSAtRU5PTUVNOwogCkBAIC0xMzYyLDYgKzEzNjMsNyBAQAogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZzaG1lbV9hb3BzOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnNobWVtX2JhY2tpbmdfZGV2X2luZm87CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGdldF9zZWNvbmRzKCk7CiAJCWluZm8gPSBTSE1FTV9JKGlub2RlKTsKIAkJbWVtc2V0KGluZm8sIDAsIChjaGFyICopaW5vZGUgLSAoY2hhciAqKWluZm8pOwogCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CkBAIC0xNDIwLDcgKzE0MjIsNyBAQAogc3RhdGljIHNzaXplX3QKIHNobWVtX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlsb2ZmX3QJCXBvczsKIAl1bnNpZ25lZCBsb25nCXdyaXR0ZW47CiAJc3NpemVfdAkJZXJyOwpAQCAtMTQ0MCw3ICsxNDQyLDcgQEAKIAlpZiAoZXJyIHx8ICFjb3VudCkKIAkJZ290byBvdXQ7CiAKLQllcnIgPSByZW1vdmVfc3VpZChmaWxlLT5mX2RlbnRyeSk7CisJZXJyID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTE1MjIsNyArMTUyNCw3IEBACiAKIHN0YXRpYyB2b2lkIGRvX3NobWVtX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90ICpwcG9zLCByZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgcmVhZF9hY3Rvcl90IGFjdG9yKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAJdW5zaWduZWQgbG9uZyBpbmRleCwgb2Zmc2V0OwogCkBAIC0xOTQxLDcgKzE5NDMsNyBAQAogCXJldHVybiBzZWN1cml0eV9pbm9kZV9zZXRzZWN1cml0eShpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKIH0KIAotc3RydWN0IHhhdHRyX2hhbmRsZXIgc2htZW1feGF0dHJfc2VjdXJpdHlfaGFuZGxlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBzaG1lbV94YXR0cl9zZWN1cml0eV9oYW5kbGVyID0gewogCS5wcmVmaXggPSBYQVRUUl9TRUNVUklUWV9QUkVGSVgsCiAJLmxpc3QgICA9IHNobWVtX3hhdHRyX3NlY3VyaXR5X2xpc3QsCiAJLmdldCAgICA9IHNobWVtX3hhdHRyX3NlY3VyaXR5X2dldCwKQEAgLTE5NTYsNiArMTk1OCw4NSBAQAogfTsKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2htZW1fZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKK30KKworc3RhdGljIGludCBzaG1lbV9tYXRjaChzdHJ1Y3QgaW5vZGUgKmlubywgdm9pZCAqdmZoKQoreworCV9fdTMyICpmaCA9IHZmaDsKKwlfX3U2NCBpbnVtID0gZmhbMl07CisJaW51bSA9IChpbnVtIDw8IDMyKSB8IGZoWzFdOworCXJldHVybiBpbm8tPmlfaW5vID09IGludW0gJiYgZmhbMF0gPT0gaW5vLT5pX2dlbmVyYXRpb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzaG1lbV9nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZmaCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZSA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlfX3UzMiAqZmggPSB2Zmg7CisJX191NjQgaW51bSA9IGZoWzJdOworCWludW0gPSAoaW51bSA8PCAzMikgfCBmaFsxXTsKKworCWlub2RlID0gaWxvb2t1cDUoc2IsICh1bnNpZ25lZCBsb25nKShpbnVtK2ZoWzBdKSwgc2htZW1fbWF0Y2gsIHZmaCk7CisJaWYgKGlub2RlKSB7CisJCWRlID0gZF9maW5kX2FsaWFzKGlub2RlKTsKKwkJaXB1dChpbm9kZSk7CisJfQorCisJcmV0dXJuIGRlPyBkZTogRVJSX1BUUigtRVNUQUxFKTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnNobWVtX2RlY29kZV9maChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBfX3UzMiAqZmgsCisJCWludCBsZW4sIGludCB0eXBlLAorCQlpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJCXZvaWQgKmNvbnRleHQpCit7CisJaWYgKGxlbiA8IDMpCisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCisJcmV0dXJuIHNiLT5zX2V4cG9ydF9vcC0+ZmluZF9leHBvcnRlZF9kZW50cnkoc2IsIGZoLCBOVUxMLCBhY2NlcHRhYmxlLAorCQkJCQkJCWNvbnRleHQpOworfQorCitzdGF0aWMgaW50IHNobWVtX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICpmaCwgaW50ICpsZW4sCisJCQkJaW50IGNvbm5lY3RhYmxlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlpZiAoKmxlbiA8IDMpCisJCXJldHVybiAyNTU7CisKKwlpZiAoaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKSB7CisJCS8qIFVuZm9ydHVuYXRlbHkgaW5zZXJ0X2lub2RlX2hhc2ggaXMgbm90IGlkZW1wb3RlbnQsCisJCSAqIHNvIGFzIHdlIGhhc2ggaW5vZGVzIGhlcmUgcmF0aGVyIHRoYW4gYXQgY3JlYXRpb24KKwkJICogdGltZSwgd2UgbmVlZCBhIGxvY2sgdG8gZW5zdXJlIHdlIG9ubHkgdHJ5CisJCSAqIHRvIGRvIGl0IG9uY2UKKwkJICovCisJCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisJCXNwaW5fbG9jaygmbG9jayk7CisJCWlmIChobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpCisJCQlfX2luc2VydF9pbm9kZV9oYXNoKGlub2RlLAorCQkJCQkgICAgaW5vZGUtPmlfaW5vICsgaW5vZGUtPmlfZ2VuZXJhdGlvbik7CisJCXNwaW5fdW5sb2NrKCZsb2NrKTsKKwl9CisKKwlmaFswXSA9IGlub2RlLT5pX2dlbmVyYXRpb247CisJZmhbMV0gPSBpbm9kZS0+aV9pbm87CisJZmhbMl0gPSAoKF9fdTY0KWlub2RlLT5pX2lubykgPj4gMzI7CisKKwkqbGVuID0gMzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBzaG1lbV9leHBvcnRfb3BzID0geworCS5nZXRfcGFyZW50ICAgICA9IHNobWVtX2dldF9wYXJlbnQsCisJLmdldF9kZW50cnkgICAgID0gc2htZW1fZ2V0X2RlbnRyeSwKKwkuZW5jb2RlX2ZoICAgICAgPSBzaG1lbV9lbmNvZGVfZmgsCisJLmRlY29kZV9maCAgICAgID0gc2htZW1fZGVjb2RlX2ZoLAorfTsKKwogc3RhdGljIGludCBzaG1lbV9wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIGludCAqbW9kZSwgdWlkX3QgKnVpZCwKIAlnaWRfdCAqZ2lkLCB1bnNpZ25lZCBsb25nICpibG9ja3MsIHVuc2lnbmVkIGxvbmcgKmlub2RlcywKIAlpbnQgKnBvbGljeSwgbm9kZW1hc2tfdCAqcG9saWN5X25vZGVzKQpAQCAtMjEyOCw2ICsyMjA5LDcgQEAKIAkJCQkJJmlub2RlcywgJnBvbGljeSwgJnBvbGljeV9ub2RlcykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJc2ItPnNfZXhwb3J0X29wID0gJnNobWVtX2V4cG9ydF9vcHM7CiAjZWxzZQogCXNiLT5zX2ZsYWdzIHw9IE1TX05PVVNFUjsKICNlbmRpZgpAQCAtMjE4MSw3ICsyMjYzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnNobWVtX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKnA7Ci0JcCA9IChzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2Moc2htZW1faW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJcCA9IChzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2Moc2htZW1faW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXApCiAJCXJldHVybiBOVUxMOwogCXJldHVybiAmcC0+dmZzX2lub2RlOwpAQCAtMjIzNyw3ICsyMzE5LDcgQEAKIAkubWlncmF0ZXBhZ2UJPSBtaWdyYXRlX3BhZ2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaG1lbV9maWxlX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaG1lbV9maWxlX29wZXJhdGlvbnMgPSB7CiAJLm1tYXAJCT0gc2htZW1fbW1hcCwKICNpZmRlZiBDT05GSUdfVE1QRlMKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCkBAIC0yNDExLDggKzI0OTMsOCBAQAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJaW5vZGUtPmlfc2l6ZSA9IHNpemU7CiAJaW5vZGUtPmlfbmxpbmsgPSAwOwkvKiBJdCBpcyB1bmxpbmtlZCAqLwotCWZpbGUtPmZfdmZzbW50ID0gbW50Z2V0KHNobV9tbnQpOwotCWZpbGUtPmZfZGVudHJ5ID0gZGVudHJ5OworCWZpbGUtPmZfcGF0aC5tbnQgPSBtbnRnZXQoc2htX21udCk7CisJZmlsZS0+Zl9wYXRoLmRlbnRyeSA9IGRlbnRyeTsKIAlmaWxlLT5mX21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCWZpbGUtPmZfb3AgPSAmc2htZW1fZmlsZV9vcGVyYXRpb25zOwogCWZpbGUtPmZfbW9kZSA9IEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRDsKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCAyNjY0NDlkLi45MDk5NzVmIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC0xMDMsMTIgKzEwMywxNCBAQAogI2luY2x1ZGUJPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUJPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZQk8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZQk8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUJPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZQk8bGludXgvbWVtcG9saWN5Lmg+CiAjaW5jbHVkZQk8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlCTxsaW51eC9mYXVsdC1pbmplY3QuaD4KICNpbmNsdWRlCTxsaW51eC9ydG11dGV4Lmg+CisjaW5jbHVkZQk8bGludXgvcmVjaXByb2NhbF9kaXYuaD4KIAotI2luY2x1ZGUJPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZQk8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlCTxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlCTxhc20vcGFnZS5oPgpAQCAtMzEzLDcgKzMxNSw3IEBACiBzdGF0aWMgdm9pZCBmcmVlX2Jsb2NrKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHZvaWQgKipvYmpwcCwgaW50IGxlbiwKIAkJCWludCBub2RlKTsKIHN0YXRpYyBpbnQgZW5hYmxlX2NwdWNhY2hlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXApOwotc3RhdGljIHZvaWQgY2FjaGVfcmVhcCh2b2lkICp1bnVzZWQpOworc3RhdGljIHZvaWQgY2FjaGVfcmVhcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCk7CiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY29tcGxldGVseSBvcHRpbWl6ZWQgYXdheSBpZiBhIGNvbnN0YW50IGlzIHBhc3NlZCB0bwpAQCAtMzg1LDYgKzM4Nyw3IEBACiAJdW5zaWduZWQgaW50IHNoYXJlZDsKIAogCXVuc2lnbmVkIGludCBidWZmZXJfc2l6ZTsKKwl1MzIgcmVjaXByb2NhbF9idWZmZXJfc2l6ZTsKIC8qIDMpIHRvdWNoZWQgYnkgZXZlcnkgYWxsb2MgJiBmcmVlIGZyb20gdGhlIGJhY2tlbmQgKi8KIAlzdHJ1Y3Qga21lbV9saXN0MyAqbm9kZWxpc3RzW01BWF9OVU1OT0RFU107CiAKQEAgLTYyNiwxMCArNjI5LDE3IEBACiAJcmV0dXJuIHNsYWItPnNfbWVtICsgY2FjaGUtPmJ1ZmZlcl9zaXplICogaWR4OwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvYmpfdG9faW5kZXgoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLAotCQkJCQlzdHJ1Y3Qgc2xhYiAqc2xhYiwgdm9pZCAqb2JqKQorLyoKKyAqIFdlIHdhbnQgdG8gYXZvaWQgYW4gZXhwZW5zaXZlIGRpdmlkZSA6IChvZmZzZXQgLyBjYWNoZS0+YnVmZmVyX3NpemUpCisgKiAgIFVzaW5nIHRoZSBmYWN0IHRoYXQgYnVmZmVyX3NpemUgaXMgYSBjb25zdGFudCBmb3IgYSBwYXJ0aWN1bGFyIGNhY2hlLAorICogICB3ZSBjYW4gcmVwbGFjZSAob2Zmc2V0IC8gY2FjaGUtPmJ1ZmZlcl9zaXplKSBieQorICogICByZWNpcHJvY2FsX2RpdmlkZShvZmZzZXQsIGNhY2hlLT5yZWNpcHJvY2FsX2J1ZmZlcl9zaXplKQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvYmpfdG9faW5kZXgoY29uc3Qgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2xhYiAqc2xhYiwgdm9pZCAqb2JqKQogewotCXJldHVybiAodW5zaWduZWQpKG9iaiAtIHNsYWItPnNfbWVtKSAvIGNhY2hlLT5idWZmZXJfc2l6ZTsKKwl1MzIgb2Zmc2V0ID0gKG9iaiAtIHNsYWItPnNfbWVtKTsKKwlyZXR1cm4gcmVjaXByb2NhbF9kaXZpZGUob2Zmc2V0LCBjYWNoZS0+cmVjaXByb2NhbF9idWZmZXJfc2l6ZSk7CiB9CiAKIC8qCkBAIC03MzAsNyArNzQwLDEwIEBACiB9CiAjZW5kaWYKIAotLyogR3VhcmQgYWNjZXNzIHRvIHRoZSBjYWNoZS1jaGFpbi4gKi8KKy8qCisgKiAxLiBHdWFyZCBhY2Nlc3MgdG8gdGhlIGNhY2hlLWNoYWluLgorICogMi4gUHJvdGVjdCBzYW5pdHkgb2YgY3B1X29ubGluZV9tYXAgYWdhaW5zdCBjcHUgaG90cGx1ZyBldmVudHMKKyAqLwogc3RhdGljIERFRklORV9NVVRFWChjYWNoZV9jaGFpbl9tdXRleCk7CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjYWNoZV9jaGFpbjsKIApAQCAtNzUzLDcgKzc2Niw3IEBACiAJcmV0dXJuIGdfY3B1Y2FjaGVfdXAgPT0gRlVMTDsKIH0KIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB3b3JrX3N0cnVjdCwgcmVhcF93b3JrKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZGVsYXllZF93b3JrLCByZWFwX3dvcmspOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnJheV9jYWNoZSAqY3B1X2NhY2hlX2dldChzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwKQogewpAQCAtODY2LDYgKzg3OSwyMiBAQAogCWR1bXBfc3RhY2soKTsKIH0KIAorLyoKKyAqIEJ5IGRlZmF1bHQgb24gTlVNQSB3ZSB1c2UgYWxpZW4gY2FjaGVzIHRvIHN0YWdlIHRoZSBmcmVlaW5nIG9mCisgKiBvYmplY3RzIGFsbG9jYXRlZCBmcm9tIG90aGVyIG5vZGVzLiBUaGlzIGNhdXNlcyBtYXNzaXZlIG1lbW9yeQorICogaW5lZmZpY2llbmNpZXMgd2hlbiB1c2luZyBmYWtlIE5VTUEgc2V0dXAgdG8gc3BsaXQgbWVtb3J5IGludG8gYQorICogbGFyZ2UgbnVtYmVyIG9mIHNtYWxsIG5vZGVzLCBzbyBpdCBjYW4gYmUgZGlzYWJsZWQgb24gdGhlIGNvbW1hbmQKKyAqIGxpbmUKKyAgKi8KKworc3RhdGljIGludCB1c2VfYWxpZW5fY2FjaGVzIF9fcmVhZF9tb3N0bHkgPSAxOworc3RhdGljIGludCBfX2luaXQgbm9hbGllbmNhY2hlX3NldHVwKGNoYXIgKnMpCit7CisJdXNlX2FsaWVuX2NhY2hlcyA9IDA7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJub2FsaWVuY2FjaGUiLCBub2FsaWVuY2FjaGVfc2V0dXApOworCiAjaWZkZWYgQ09ORklHX05VTUEKIC8qCiAgKiBTcGVjaWFsIHJlYXBpbmcgZnVuY3Rpb25zIGZvciBOVU1BIHN5c3RlbXMgY2FsbGVkIGZyb20gY2FjaGVfcmVhcCgpLgpAQCAtODgzLDcgKzkxMiw3IEBACiAJaWYgKG5vZGUgPT0gTUFYX05VTU5PREVTKQogCQlub2RlID0gZmlyc3Rfbm9kZShub2RlX29ubGluZV9tYXApOwogCi0JX19nZXRfY3B1X3ZhcihyZWFwX25vZGUpID0gbm9kZTsKKwlwZXJfY3B1KHJlYXBfbm9kZSwgY3B1KSA9IG5vZGU7CiB9CiAKIHN0YXRpYyB2b2lkIG5leHRfcmVhcF9ub2RlKHZvaWQpCkBAIC05MTYsMTcgKzk0NSwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc3RhcnRfY3B1X3RpbWVyKGludCBjcHUpCiB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICpyZWFwX3dvcmsgPSAmcGVyX2NwdShyZWFwX3dvcmssIGNwdSk7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqcmVhcF93b3JrID0gJnBlcl9jcHUocmVhcF93b3JrLCBjcHUpOwogCiAJLyoKIAkgKiBXaGVuIHRoaXMgZ2V0cyBjYWxsZWQgZnJvbSBkb19pbml0Y2FsbHMgdmlhIGNwdWNhY2hlX2luaXQoKSwKIAkgKiBpbml0X3dvcmtxdWV1ZXMoKSBoYXMgYWxyZWFkeSBydW4sIHNvIGtldmVudGQgd2lsbCBiZSBzZXR1cAogCSAqIGF0IHRoYXQgdGltZS4KIAkgKi8KLQlpZiAoa2V2ZW50ZF91cCgpICYmIHJlYXBfd29yay0+ZnVuYyA9PSBOVUxMKSB7CisJaWYgKGtldmVudGRfdXAoKSAmJiByZWFwX3dvcmstPndvcmsuZnVuYyA9PSBOVUxMKSB7CiAJCWluaXRfcmVhcF9ub2RlKGNwdSk7Ci0JCUlOSVRfV09SSyhyZWFwX3dvcmssIGNhY2hlX3JlYXAsIE5VTEwpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmtfb24oY3B1LCByZWFwX3dvcmssIEhaICsgMyAqIGNwdSk7CisJCUlOSVRfREVMQVlFRF9XT1JLKHJlYXBfd29yaywgY2FjaGVfcmVhcCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29ya19vbihjcHUsIHJlYXBfd29yaywKKwkJCQkJX19yb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaLCBjcHUpKTsKIAl9CiB9CiAKQEAgLTk5Niw3ICsxMDI2LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpfX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19fX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKIAkJIGdmcF90IGZsYWdzLCBpbnQgbm9kZWlkKQogewogCXJldHVybiBOVUxMOwpAQCAtMTAwNCw3ICsxMDM0LDcgQEAKIAogI2Vsc2UJLyogQ09ORklHX05VTUEgKi8KIAotc3RhdGljIHZvaWQgKl9fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCwgaW50KTsKK3N0YXRpYyB2b2lkICpfX19fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCwgaW50KTsKIHN0YXRpYyB2b2lkICphbHRlcm5hdGVfbm9kZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGxvY19hbGllbl9jYWNoZShpbnQgbm9kZSwgaW50IGxpbWl0KQpAQCAtMTExNCw3ICsxMTQ0LDcgQEAKIAkgKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBmcmVlaW5nIGEgb2JqZWN0IGZyb20gYW5vdGhlciBub2RlIHRvIHRoZSBhcnJheQogCSAqIGNhY2hlIG9uIHRoaXMgY3B1LgogCSAqLwotCWlmIChsaWtlbHkoc2xhYnAtPm5vZGVpZCA9PSBub2RlKSkKKwlpZiAobGlrZWx5KHNsYWJwLT5ub2RlaWQgPT0gbm9kZSkgfHwgdW5saWtlbHkoIXVzZV9hbGllbl9jYWNoZXMpKQogCQlyZXR1cm4gMDsKIAogCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbm9kZV07CkBAIC0xMTkyLDcgKzEyMjIsNyBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhY2hlcCwgJmNhY2hlX2NoYWluLCBuZXh0KSB7CiAJCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKm5jOwogCQkJc3RydWN0IGFycmF5X2NhY2hlICpzaGFyZWQ7Ci0JCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGllbjsKKwkJCXN0cnVjdCBhcnJheV9jYWNoZSAqKmFsaWVuID0gTlVMTDsKIAogCQkJbmMgPSBhbGxvY19hcnJheWNhY2hlKG5vZGUsIGNhY2hlcC0+bGltaXQsCiAJCQkJCQljYWNoZXAtPmJhdGNoY291bnQpOwpAQCAtMTIwNCw5ICsxMjM0LDExIEBACiAJCQlpZiAoIXNoYXJlZCkKIAkJCQlnb3RvIGJhZDsKIAotCQkJYWxpZW4gPSBhbGxvY19hbGllbl9jYWNoZShub2RlLCBjYWNoZXAtPmxpbWl0KTsKLQkJCWlmICghYWxpZW4pCi0JCQkJZ290byBiYWQ7CisJCQlpZiAodXNlX2FsaWVuX2NhY2hlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGllbiA9IGFsbG9jX2FsaWVuX2NhY2hlKG5vZGUsIGNhY2hlcC0+bGltaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsaWVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCQkJY2FjaGVwLT5hcnJheVtjcHVdID0gbmM7CiAJCQlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW25vZGVdOwogCQkJQlVHX09OKCFsMyk7CkBAIC0xMjMwLDEyICsxMjYyLDE4IEBACiAJCQlrZnJlZShzaGFyZWQpOwogCQkJZnJlZV9hbGllbl9jYWNoZShhbGllbik7CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX09OTElORToKKwkJbXV0ZXhfdW5sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJCXN0YXJ0X2NwdV90aW1lcihjcHUpOwogCQlicmVhazsKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwljYXNlIENQVV9ET1dOX1BSRVBBUkU6CisJCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CisJCW11dGV4X3VubG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOworCQlicmVhazsKIAljYXNlIENQVV9ERUFEOgogCQkvKgogCQkgKiBFdmVuIGlmIGFsbCB0aGUgY3B1cyBvZiBhIG5vZGUgYXJlIGRvd24sIHdlIGRvbid0IGZyZWUgdGhlCkBAIC0xMjQ2LDggKzEyODQsOCBAQAogCQkgKiBnZXRzIGRlc3Ryb3llZCBhdCBrbWVtX2NhY2hlX2Rlc3Ryb3koKS4KIAkJICovCiAJCS8qIGZhbGwgdGhydSAqLworI2VuZGlmCiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWNoZXAsICZjYWNoZV9jaGFpbiwgbmV4dCkgewogCQkJc3RydWN0IGFycmF5X2NhY2hlICpuYzsKIAkJCXN0cnVjdCBhcnJheV9jYWNoZSAqc2hhcmVkOwpAQCAtMTMwOCwxMSArMTM0Niw5IEBACiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJCWJyZWFrOwotI2VuZGlmCiAJfQogCXJldHVybiBOT1RJRllfT0s7CiBiYWQ6Ci0JbXV0ZXhfdW5sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJcmV0dXJuIE5PVElGWV9CQUQ7CiB9CiAKQEAgLTE0MDAsNiArMTQzNiw4IEBACiAKIAljYWNoZV9jYWNoZS5idWZmZXJfc2l6ZSA9IEFMSUdOKGNhY2hlX2NhY2hlLmJ1ZmZlcl9zaXplLAogCQkJCQljYWNoZV9saW5lX3NpemUoKSk7CisJY2FjaGVfY2FjaGUucmVjaXByb2NhbF9idWZmZXJfc2l6ZSA9CisJCXJlY2lwcm9jYWxfdmFsdWUoY2FjaGVfY2FjaGUuYnVmZmVyX3NpemUpOwogCiAJZm9yIChvcmRlciA9IDA7IG9yZGVyIDwgTUFYX09SREVSOyBvcmRlcisrKSB7CiAJCWNhY2hlX2VzdGltYXRlKG9yZGVyLCBjYWNoZV9jYWNoZS5idWZmZXJfc2l6ZSwKQEAgLTE1ODAsMTIgKzE2MTgsNyBAQAogCWZsYWdzIHw9IF9fR0ZQX0NPTVA7CiAjZW5kaWYKIAotCS8qCi0JICogVW5kZXIgTlVNQSB3ZSB3YW50IG1lbW9yeSBvbiB0aGUgaW5kaWNhdGVkIG5vZGUuIFdlIHdpbGwgaGFuZGxlCi0JICogdGhlIG5lZWRlZCBmYWxsYmFjayBvdXJzZWx2ZXMgc2luY2Ugd2Ugd2FudCB0byBzZXJ2ZSBmcm9tIG91cgotCSAqIHBlciBub2RlIG9iamVjdCBsaXN0cyBmaXJzdCBmb3Igb3RoZXIgbm9kZXMuCi0JICovCi0JZmxhZ3MgfD0gY2FjaGVwLT5nZnBmbGFncyB8IEdGUF9USElTTk9ERTsKKwlmbGFncyB8PSBjYWNoZXAtPmdmcGZsYWdzOwogCiAJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZWlkLCBmbGFncywgY2FjaGVwLT5nZnBvcmRlcik7CiAJaWYgKCFwYWdlKQpAQCAtMjA5OCwxNSArMjEzMSwxMiBAQAogCX0KIAogCS8qCi0JICogUHJldmVudCBDUFVzIGZyb20gY29taW5nIGFuZCBnb2luZy4KLQkgKiBsb2NrX2NwdV9ob3RwbHVnKCkgbmVzdHMgb3V0c2lkZSBjYWNoZV9jaGFpbl9tdXRleAorCSAqIFdlIHVzZSBjYWNoZV9jaGFpbl9tdXRleCB0byBlbnN1cmUgYSBjb25zaXN0ZW50IHZpZXcgb2YKKwkgKiBjcHVfb25saW5lX21hcCBhcyB3ZWxsLiAgUGxlYXNlIHNlZSBjcHV1cF9jYWxsYmFjawogCSAqLwotCWxvY2tfY3B1X2hvdHBsdWcoKTsKLQogCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGMsICZjYWNoZV9jaGFpbiwgbmV4dCkgewotCQltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJCWNoYXIgdG1wOwogCQlpbnQgcmVzOwogCkBAIC0yMTE1LDkgKzIxNDUsNyBAQAogCQkgKiBkZXN0cm95IGl0cyBzbGFiIGNhY2hlIGFuZCBuby1vbmUgZWxzZSByZXVzZXMgdGhlIHZtYWxsb2MKIAkJICogYXJlYSBvZiB0aGUgbW9kdWxlLiAgUHJpbnQgYSB3YXJuaW5nLgogCQkgKi8KLQkJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JCXJlcyA9IF9fZ2V0X3VzZXIodG1wLCBwYy0+bmFtZSk7Ci0JCXNldF9mcyhvbGRfZnMpOworCQlyZXMgPSBwcm9iZV9rZXJuZWxfYWRkcmVzcyhwYy0+bmFtZSwgdG1wKTsKIAkJaWYgKHJlcykgewogCQkJcHJpbnRrKCJTTEFCOiBjYWNoZSB3aXRoIHNpemUgJWQgaGFzIGxvc3QgaXRzIG5hbWVcbiIsCiAJCQkgICAgICAgcGMtPmJ1ZmZlcl9zaXplKTsKQEAgLTIxOTcsMjUgKzIyMjUsMjQgQEAKIAlpZiAoZmxhZ3MgJiBTTEFCX1JFRF9aT05FIHx8IGZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKQogCQlyYWxpZ24gPSBCWVRFU19QRVJfV09SRDsKIAotCS8qIDIpIGFyY2ggbWFuZGF0ZWQgYWxpZ25tZW50OiBkaXNhYmxlcyBkZWJ1ZyBpZiBuZWNlc3NhcnkgKi8KKwkvKiAyKSBhcmNoIG1hbmRhdGVkIGFsaWdubWVudCAqLwogCWlmIChyYWxpZ24gPCBBUkNIX1NMQUJfTUlOQUxJR04pIHsKIAkJcmFsaWduID0gQVJDSF9TTEFCX01JTkFMSUdOOwotCQlpZiAocmFsaWduID4gQllURVNfUEVSX1dPUkQpCi0JCQlmbGFncyAmPSB+KFNMQUJfUkVEX1pPTkUgfCBTTEFCX1NUT1JFX1VTRVIpOwogCX0KLQkvKiAzKSBjYWxsZXIgbWFuZGF0ZWQgYWxpZ25tZW50OiBkaXNhYmxlcyBkZWJ1ZyBpZiBuZWNlc3NhcnkgKi8KKwkvKiAzKSBjYWxsZXIgbWFuZGF0ZWQgYWxpZ25tZW50ICovCiAJaWYgKHJhbGlnbiA8IGFsaWduKSB7CiAJCXJhbGlnbiA9IGFsaWduOwotCQlpZiAocmFsaWduID4gQllURVNfUEVSX1dPUkQpCi0JCQlmbGFncyAmPSB+KFNMQUJfUkVEX1pPTkUgfCBTTEFCX1NUT1JFX1VTRVIpOwogCX0KKwkvKiBkaXNhYmxlIGRlYnVnIGlmIG5lY2Vzc2FyeSAqLworCWlmIChyYWxpZ24gPiBCWVRFU19QRVJfV09SRCkKKwkJZmxhZ3MgJj0gfihTTEFCX1JFRF9aT05FIHwgU0xBQl9TVE9SRV9VU0VSKTsKIAkvKgogCSAqIDQpIFN0b3JlIGl0LgogCSAqLwogCWFsaWduID0gcmFsaWduOwogCiAJLyogR2V0IGNhY2hlJ3MgZGVzY3JpcHRpb24gb2JqLiAqLwotCWNhY2hlcCA9IGttZW1fY2FjaGVfemFsbG9jKCZjYWNoZV9jYWNoZSwgU0xBQl9LRVJORUwpOworCWNhY2hlcCA9IGttZW1fY2FjaGVfemFsbG9jKCZjYWNoZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYWNoZXApCiAJCWdvdG8gb29wczsKIApAQCAtMjI5Nyw2ICsyMzI0LDcgQEAKIAlpZiAoZmxhZ3MgJiBTTEFCX0NBQ0hFX0RNQSkKIAkJY2FjaGVwLT5nZnBmbGFncyB8PSBHRlBfRE1BOwogCWNhY2hlcC0+YnVmZmVyX3NpemUgPSBzaXplOworCWNhY2hlcC0+cmVjaXByb2NhbF9idWZmZXJfc2l6ZSA9IHJlY2lwcm9jYWxfdmFsdWUoc2l6ZSk7CiAKIAlpZiAoZmxhZ3MgJiBDRkxHU19PRkZfU0xBQikgewogCQljYWNoZXAtPnNsYWJwX2NhY2hlID0ga21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNsYWJfc2l6ZSwgMHUpOwpAQCAtMjMyNiw3ICsyMzU0LDYgQEAKIAkJcGFuaWMoImttZW1fY2FjaGVfY3JlYXRlKCk6IGZhaWxlZCB0byBjcmVhdGUgc2xhYiBgJXMnXG4iLAogCQkgICAgICBuYW1lKTsKIAltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIAlyZXR1cm4gY2FjaGVwOwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2NyZWF0ZSk7CkBAIC0yNDQ0LDYgKzI0NzEsNyBAQAogCXJldHVybiBucl9mcmVlZDsKIH0KIAorLyogQ2FsbGVkIHdpdGggY2FjaGVfY2hhaW5fbXV0ZXggaGVsZCB0byBwcm90ZWN0IGFnYWluc3QgY3B1IGhvdHBsdWcgKi8KIHN0YXRpYyBpbnQgX19jYWNoZV9zaHJpbmsoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCkKIHsKIAlpbnQgcmV0ID0gMCwgaSA9IDA7CkBAIC0yNDc0LDkgKzI1MDIsMTMgQEAKICAqLwogaW50IGttZW1fY2FjaGVfc2hyaW5rKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXApCiB7CisJaW50IHJldDsKIAlCVUdfT04oIWNhY2hlcCB8fCBpbl9pbnRlcnJ1cHQoKSk7CiAKLQlyZXR1cm4gX19jYWNoZV9zaHJpbmsoY2FjaGVwKTsKKwltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CisJcmV0ID0gX19jYWNoZV9zaHJpbmsoY2FjaGVwKTsKKwltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX3Nocmluayk7CiAKQEAgLTI1MDAsMjMgKzI1MzIsMTYgQEAKIHsKIAlCVUdfT04oIWNhY2hlcCB8fCBpbl9pbnRlcnJ1cHQoKSk7CiAKLQkvKiBEb24ndCBsZXQgQ1BVcyB0byBjb21lIGFuZCBnbyAqLwotCWxvY2tfY3B1X2hvdHBsdWcoKTsKLQogCS8qIEZpbmQgdGhlIGNhY2hlIGluIHRoZSBjaGFpbiBvZiBjYWNoZXMuICovCiAJbXV0ZXhfbG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogCS8qCiAJICogdGhlIGNoYWluIGlzIG5ldmVyIGVtcHR5LCBjYWNoZV9jYWNoZSBpcyBuZXZlciBkZXN0cm95ZWQKIAkgKi8KIAlsaXN0X2RlbCgmY2FjaGVwLT5uZXh0KTsKLQltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKLQogCWlmIChfX2NhY2hlX3NocmluayhjYWNoZXApKSB7CiAJCXNsYWJfZXJyb3IoY2FjaGVwLCAiQ2FuJ3QgZnJlZSBhbGwgb2JqZWN0cyIpOwotCQltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJCWxpc3RfYWRkKCZjYWNoZXAtPm5leHQsICZjYWNoZV9jaGFpbik7CiAJCW11dGV4X3VubG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwotCQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjUyNCw3ICsyNTQ5LDcgQEAKIAkJc3luY2hyb25pemVfcmN1KCk7CiAKIAlfX2ttZW1fY2FjaGVfZGVzdHJveShjYWNoZXApOwotCXVubG9ja19jcHVfaG90cGx1ZygpOworCW11dGV4X3VubG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2Rlc3Ryb3kpOwogCkBAIC0yNTQ4LDcgKzI1NzMsNyBAQAogCWlmIChPRkZfU0xBQihjYWNoZXApKSB7CiAJCS8qIFNsYWIgbWFuYWdlbWVudCBvYmogaXMgb2ZmLXNsYWIuICovCiAJCXNsYWJwID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNhY2hlcC0+c2xhYnBfY2FjaGUsCi0JCQkJCSAgICAgIGxvY2FsX2ZsYWdzLCBub2RlaWQpOworCQkJCQkgICAgICBsb2NhbF9mbGFncyAmIH5HRlBfVEhJU05PREUsIG5vZGVpZCk7CiAJCWlmICghc2xhYnApCiAJCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UgewpAQCAtMjYxOCw3ICsyNjQzLDcgQEAKIAogc3RhdGljIHZvaWQga21lbV9mbGFnY2hlY2soc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCiB7Ci0JaWYgKGZsYWdzICYgU0xBQl9ETUEpCisJaWYgKGZsYWdzICYgR0ZQX0RNQSkKIAkJQlVHX09OKCEoY2FjaGVwLT5nZnBmbGFncyAmIEdGUF9ETUEpKTsKIAllbHNlCiAJCUJVR19PTihjYWNoZXAtPmdmcGZsYWdzICYgR0ZQX0RNQSk7CkBAIC0yNjg5LDEwICsyNzE0LDEwIEBACiAgKiBHcm93IChieSAxKSB0aGUgbnVtYmVyIG9mIHNsYWJzIHdpdGhpbiBhIGNhY2hlLiAgVGhpcyBpcyBjYWxsZWQgYnkKICAqIGttZW1fY2FjaGVfYWxsb2MoKSB3aGVuIHRoZXJlIGFyZSBubyBhY3RpdmUgb2JqcyBsZWZ0IGluIGEgY2FjaGUuCiAgKi8KLXN0YXRpYyBpbnQgY2FjaGVfZ3JvdyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncywgaW50IG5vZGVpZCkKK3N0YXRpYyBpbnQgY2FjaGVfZ3JvdyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAorCQlnZnBfdCBmbGFncywgaW50IG5vZGVpZCwgdm9pZCAqb2JqcCkKIHsKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7Ci0Jdm9pZCAqb2JqcDsKIAlzaXplX3Qgb2Zmc2V0OwogCWdmcF90IGxvY2FsX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcgY3Rvcl9mbGFnczsKQEAgLTI3MDIsMTIgKzI3MjcsMTIgQEAKIAkgKiBCZSBsYXp5IGFuZCBvbmx5IGNoZWNrIGZvciB2YWxpZCBmbGFncyBoZXJlLCAga2VlcGluZyBpdCBvdXQgb2YgdGhlCiAJICogY3JpdGljYWwgcGF0aCBpbiBrbWVtX2NhY2hlX2FsbG9jKCkuCiAJICovCi0JQlVHX09OKGZsYWdzICYgfihTTEFCX0RNQSB8IFNMQUJfTEVWRUxfTUFTSyB8IFNMQUJfTk9fR1JPVykpOwotCWlmIChmbGFncyAmIFNMQUJfTk9fR1JPVykKKwlCVUdfT04oZmxhZ3MgJiB+KEdGUF9ETUEgfCBHRlBfTEVWRUxfTUFTSyB8IF9fR0ZQX05PX0dST1cpKTsKKwlpZiAoZmxhZ3MgJiBfX0dGUF9OT19HUk9XKQogCQlyZXR1cm4gMDsKIAogCWN0b3JfZmxhZ3MgPSBTTEFCX0NUT1JfQ09OU1RSVUNUT1I7Ci0JbG9jYWxfZmxhZ3MgPSAoZmxhZ3MgJiBTTEFCX0xFVkVMX01BU0spOworCWxvY2FsX2ZsYWdzID0gKGZsYWdzICYgR0ZQX0xFVkVMX01BU0spOwogCWlmICghKGxvY2FsX2ZsYWdzICYgX19HRlBfV0FJVCkpCiAJCS8qCiAJCSAqIE5vdCBhbGxvd2VkIHRvIHNsZWVwLiAgTmVlZCB0byB0ZWxsIGEgY29uc3RydWN0b3IgYWJvdXQKQEAgLTI3NDQsMTIgKzI3NjksMTQgQEAKIAkgKiBHZXQgbWVtIGZvciB0aGUgb2Jqcy4gIEF0dGVtcHQgdG8gYWxsb2NhdGUgYSBwaHlzaWNhbCBwYWdlIGZyb20KIAkgKiAnbm9kZWlkJy4KIAkgKi8KLQlvYmpwID0ga21lbV9nZXRwYWdlcyhjYWNoZXAsIGZsYWdzLCBub2RlaWQpOworCWlmICghb2JqcCkKKwkJb2JqcCA9IGttZW1fZ2V0cGFnZXMoY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKIAlpZiAoIW9ianApCiAJCWdvdG8gZmFpbGVkOwogCiAJLyogR2V0IHNsYWIgbWFuYWdlbWVudC4gKi8KLQlzbGFicCA9IGFsbG9jX3NsYWJtZ210KGNhY2hlcCwgb2JqcCwgb2Zmc2V0LCBsb2NhbF9mbGFncywgbm9kZWlkKTsKKwlzbGFicCA9IGFsbG9jX3NsYWJtZ210KGNhY2hlcCwgb2JqcCwgb2Zmc2V0LAorCQkJbG9jYWxfZmxhZ3MgJiB+R0ZQX1RISVNOT0RFLCBub2RlaWQpOwogCWlmICghc2xhYnApCiAJCWdvdG8gb3BwczE7CiAKQEAgLTI5ODcsNyArMzAxNCw3IEBACiAKIAlpZiAodW5saWtlbHkoIWFjLT5hdmFpbCkpIHsKIAkJaW50IHg7Ci0JCXggPSBjYWNoZV9ncm93KGNhY2hlcCwgZmxhZ3MsIG5vZGUpOworCQl4ID0gY2FjaGVfZ3JvdyhjYWNoZXAsIGZsYWdzIHwgR0ZQX1RISVNOT0RFLCBub2RlLCBOVUxMKTsKIAogCQkvKiBjYWNoZV9ncm93IGNhbiByZWVuYWJsZSBpbnRlcnJ1cHRzLCB0aGVuIGFjIGNvdWxkIGNoYW5nZS4gKi8KIAkJYWMgPSBjcHVfY2FjaGVfZ2V0KGNhY2hlcCk7CkBAIC0zMDYzLDE4ICszMDkwLDEwMSBAQAogCiAJCWNhY2hlcC0+Y3RvcihvYmpwLCBjYWNoZXAsIGN0b3JfZmxhZ3MpOwogCX0KKyNpZiBBUkNIX1NMQUJfTUlOQUxJR04KKwlpZiAoKHUzMilvYmpwICYgKEFSQ0hfU0xBQl9NSU5BTElHTi0xKSkgeworCQlwcmludGsoS0VSTl9FUlIgIjB4JXA6IG5vdCBhbGlnbmVkIHRvIEFSQ0hfU0xBQl9NSU5BTElHTj0lZFxuIiwKKwkJICAgICAgIG9ianAsIEFSQ0hfU0xBQl9NSU5BTElHTik7CisJfQorI2VuZGlmCiAJcmV0dXJuIG9ianA7CiB9CiAjZWxzZQogI2RlZmluZSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGEsYixvYmpwLGQpIChvYmpwKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfRkFJTFNMQUIKKworc3RhdGljIHN0cnVjdCBmYWlsc2xhYl9hdHRyIHsKKworCXN0cnVjdCBmYXVsdF9hdHRyIGF0dHI7CisKKwl1MzIgaWdub3JlX2dmcF93YWl0OworI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKKwlzdHJ1Y3QgZGVudHJ5ICppZ25vcmVfZ2ZwX3dhaXRfZmlsZTsKKyNlbmRpZgorCit9IGZhaWxzbGFiID0geworCS5hdHRyID0gRkFVTFRfQVRUUl9JTklUSUFMSVpFUiwKKwkuaWdub3JlX2dmcF93YWl0ID0gMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2ZhaWxzbGFiKGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gc2V0dXBfZmF1bHRfYXR0cigmZmFpbHNsYWIuYXR0ciwgc3RyKTsKK30KK19fc2V0dXAoImZhaWxzbGFiPSIsIHNldHVwX2ZhaWxzbGFiKTsKKworc3RhdGljIGludCBzaG91bGRfZmFpbHNsYWIoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCit7CisJaWYgKGNhY2hlcCA9PSAmY2FjaGVfY2FjaGUpCisJCXJldHVybiAwOworCWlmIChmbGFncyAmIF9fR0ZQX05PRkFJTCkKKwkJcmV0dXJuIDA7CisJaWYgKGZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdCAmJiAoZmxhZ3MgJiBfX0dGUF9XQUlUKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2hvdWxkX2ZhaWwoJmZhaWxzbGFiLmF0dHIsIG9ial9zaXplKGNhY2hlcCkpOworfQorCisjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUworCitzdGF0aWMgaW50IF9faW5pdCBmYWlsc2xhYl9kZWJ1Z2ZzKHZvaWQpCit7CisJbW9kZV90IG1vZGUgPSBTX0lGUkVHIHwgU19JUlVTUiB8IFNfSVdVU1I7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnI7CisKKyAgICAgICAJZXJyID0gaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsc2xhYi5hdHRyLCAiZmFpbHNsYWIiKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWRpciA9IGZhaWxzbGFiLmF0dHIuZGVudHJpZXMuZGlyOworCisJZmFpbHNsYWIuaWdub3JlX2dmcF93YWl0X2ZpbGUgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpZ25vcmUtZ2ZwLXdhaXQiLCBtb2RlLCBkaXIsCisJCQkJICAgICAgJmZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdCk7CisKKwlpZiAoIWZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdF9maWxlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWRlYnVnZnNfcmVtb3ZlKGZhaWxzbGFiLmlnbm9yZV9nZnBfd2FpdF9maWxlKTsKKwkJY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsc2xhYi5hdHRyKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitsYXRlX2luaXRjYWxsKGZhaWxzbGFiX2RlYnVnZnMpOworCisjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLworCisjZWxzZSAvKiBDT05GSUdfRkFJTFNMQUIgKi8KKworc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX2ZhaWxzbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX0ZBSUxTTEFCICovCisKIHN0YXRpYyBpbmxpbmUgdm9pZCAqX19fX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQogewogCXZvaWQgKm9ianA7CiAJc3RydWN0IGFycmF5X2NhY2hlICphYzsKIAogCWNoZWNrX2lycV9vZmYoKTsKKworCWlmIChzaG91bGRfZmFpbHNsYWIoY2FjaGVwLCBmbGFncykpCisJCXJldHVybiBOVUxMOworCiAJYWMgPSBjcHVfY2FjaGVfZ2V0KGNhY2hlcCk7CiAJaWYgKGxpa2VseShhYy0+YXZhaWwpKSB7CiAJCVNUQVRTX0lOQ19BTExPQ0hJVChjYWNoZXApOwpAQCAtMzEwNSwxMCArMzIxNSwxMCBAQAogCQlvYmpwID0gX19fX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOwogCS8qCiAJICogV2UgbWF5IGp1c3QgaGF2ZSBydW4gb3V0IG9mIG1lbW9yeSBvbiB0aGUgbG9jYWwgbm9kZS4KLQkgKiBfX2NhY2hlX2FsbG9jX25vZGUoKSBrbm93cyBob3cgdG8gbG9jYXRlIG1lbW9yeSBvbiBvdGhlciBub2RlcworCSAqIF9fX19jYWNoZV9hbGxvY19ub2RlKCkga25vd3MgaG93IHRvIGxvY2F0ZSBtZW1vcnkgb24gb3RoZXIgbm9kZXMKIAkgKi8KICAJaWYgKE5VTUFfQlVJTEQgJiYgIW9ianApCi0gCQlvYmpwID0gX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG51bWFfbm9kZV9pZCgpKTsKKyAJCW9ianAgPSBfX19fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCBudW1hX25vZGVfaWQoKSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoc2F2ZV9mbGFncyk7CiAJb2JqcCA9IGNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYWZ0ZXIoY2FjaGVwLCBmbGFncywgb2JqcCwKIAkJCQkJICAgIGNhbGxlcik7CkBAIC0zMTM1LDE1ICszMjQ1LDE3IEBACiAJZWxzZSBpZiAoY3VycmVudC0+bWVtcG9saWN5KQogCQluaWRfYWxsb2MgPSBzbGFiX25vZGUoY3VycmVudC0+bWVtcG9saWN5KTsKIAlpZiAobmlkX2FsbG9jICE9IG5pZF9oZXJlKQotCQlyZXR1cm4gX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG5pZF9hbGxvYyk7CisJCXJldHVybiBfX19fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCBuaWRfYWxsb2MpOwogCXJldHVybiBOVUxMOwogfQogCiAvKgogICogRmFsbGJhY2sgZnVuY3Rpb24gaWYgdGhlcmUgd2FzIG5vIG1lbW9yeSBhdmFpbGFibGUgYW5kIG5vIG9iamVjdHMgb24gYQotICogY2VydGFpbiBub2RlIGFuZCB3ZSBhcmUgYWxsb3dlZCB0byBmYWxsIGJhY2suIFdlIG1pbWljayB0aGUgYmVoYXZpb3Igb2YKLSAqIHRoZSBwYWdlIGFsbG9jYXRvci4gV2UgZmFsbCBiYWNrIGFjY29yZGluZyB0byBhIHpvbmVsaXN0IGRldGVybWluZWQgYnkKLSAqIHRoZSBwb2xpY3kgbGF5ZXIgd2hpbGUgb2JleWluZyBjcHVzZXQgY29uc3RyYWludHMuCisgKiBjZXJ0YWluIG5vZGUgYW5kIGZhbGwgYmFjayBpcyBwZXJtaXR0ZWQuIEZpcnN0IHdlIHNjYW4gYWxsIHRoZQorICogYXZhaWxhYmxlIG5vZGVsaXN0cyBmb3IgYXZhaWxhYmxlIG9iamVjdHMuIElmIHRoYXQgZmFpbHMgdGhlbiB3ZQorICogcGVyZm9ybSBhbiBhbGxvY2F0aW9uIHdpdGhvdXQgc3BlY2lmeWluZyBhIG5vZGUuIFRoaXMgYWxsb3dzIHRoZSBwYWdlCisgKiBhbGxvY2F0b3IgdG8gZG8gaXRzIHJlY2xhaW0gLyBmYWxsYmFjayBtYWdpYy4gV2UgdGhlbiBpbnNlcnQgdGhlCisgKiBzbGFiIGludG8gdGhlIHByb3BlciBub2RlbGlzdCBhbmQgdGhlbiBhbGxvY2F0ZSBmcm9tIGl0LgogICovCiB2b2lkICpmYWxsYmFja19hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIGdmcF90IGZsYWdzKQogewpAQCAtMzE1MSwyMCArMzI2Myw2NSBAQAogCQkJCQktPm5vZGVfem9uZWxpc3RzW2dmcF96b25lKGZsYWdzKV07CiAJc3RydWN0IHpvbmUgKip6OwogCXZvaWQgKm9iaiA9IE5VTEw7CisJaW50IG5pZDsKKwlnZnBfdCBsb2NhbF9mbGFncyA9IChmbGFncyAmIEdGUF9MRVZFTF9NQVNLKTsKIAotCWZvciAoeiA9IHpvbmVsaXN0LT56b25lczsgKnogJiYgIW9iajsgeisrKQotCQlpZiAoem9uZV9pZHgoKnopIDw9IFpPTkVfTk9STUFMICYmCi0JCQkJY3B1c2V0X3pvbmVfYWxsb3dlZCgqeiwgZmxhZ3MpKQotCQkJb2JqID0gX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlLAotCQkJCQlmbGFncyB8IF9fR0ZQX1RISVNOT0RFLAotCQkJCQl6b25lX3RvX25pZCgqeikpOworcmV0cnk6CisJLyoKKwkgKiBMb29rIHRocm91Z2ggYWxsb3dlZCBub2RlcyBmb3Igb2JqZWN0cyBhdmFpbGFibGUKKwkgKiBmcm9tIGV4aXN0aW5nIHBlciBub2RlIHF1ZXVlcy4KKwkgKi8KKwlmb3IgKHogPSB6b25lbGlzdC0+em9uZXM7ICp6ICYmICFvYmo7IHorKykgeworCQluaWQgPSB6b25lX3RvX25pZCgqeik7CisKKwkJaWYgKGNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoKnosIGZsYWdzKSAmJgorCQkJY2FjaGUtPm5vZGVsaXN0c1tuaWRdICYmCisJCQljYWNoZS0+bm9kZWxpc3RzW25pZF0tPmZyZWVfb2JqZWN0cykKKwkJCQlvYmogPSBfX19fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZSwKKwkJCQkJZmxhZ3MgfCBHRlBfVEhJU05PREUsIG5pZCk7CisJfQorCisJaWYgKCFvYmopIHsKKwkJLyoKKwkJICogVGhpcyBhbGxvY2F0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIHdpdGhpbiB0aGUgY29uc3RyYWludHMKKwkJICogb2YgdGhlIGN1cnJlbnQgY3B1c2V0IC8gbWVtb3J5IHBvbGljeSByZXF1aXJlbWVudHMuCisJCSAqIFdlIG1heSB0cmlnZ2VyIHZhcmlvdXMgZm9ybXMgb2YgcmVjbGFpbSBvbiB0aGUgYWxsb3dlZAorCQkgKiBzZXQgYW5kIGdvIGludG8gbWVtb3J5IHJlc2VydmVzIGlmIG5lY2Vzc2FyeS4KKwkJICovCisJCWlmIChsb2NhbF9mbGFncyAmIF9fR0ZQX1dBSVQpCisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWttZW1fZmxhZ2NoZWNrKGNhY2hlLCBmbGFncyk7CisJCW9iaiA9IGttZW1fZ2V0cGFnZXMoY2FjaGUsIGZsYWdzLCAtMSk7CisJCWlmIChsb2NhbF9mbGFncyAmIF9fR0ZQX1dBSVQpCisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlpZiAob2JqKSB7CisJCQkvKgorCQkJICogSW5zZXJ0IGludG8gdGhlIGFwcHJvcHJpYXRlIHBlciBub2RlIHF1ZXVlcworCQkJICovCisJCQluaWQgPSBwYWdlX3RvX25pZCh2aXJ0X3RvX3BhZ2Uob2JqKSk7CisJCQlpZiAoY2FjaGVfZ3JvdyhjYWNoZSwgZmxhZ3MsIG5pZCwgb2JqKSkgeworCQkJCW9iaiA9IF9fX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlLAorCQkJCQlmbGFncyB8IEdGUF9USElTTk9ERSwgbmlkKTsKKwkJCQlpZiAoIW9iaikKKwkJCQkJLyoKKwkJCQkJICogQW5vdGhlciBwcm9jZXNzb3IgbWF5IGFsbG9jYXRlIHRoZQorCQkJCQkgKiBvYmplY3RzIGluIHRoZSBzbGFiIHNpbmNlIHdlIGFyZQorCQkJCQkgKiBub3QgaG9sZGluZyBhbnkgbG9ja3MuCisJCQkJCSAqLworCQkJCQlnb3RvIHJldHJ5OworCQkJfSBlbHNlIHsKKwkJCQlrbWVtX2ZyZWVwYWdlcyhjYWNoZSwgb2JqKTsKKwkJCQlvYmogPSBOVUxMOworCQkJfQorCQl9CisJfQogCXJldHVybiBvYmo7CiB9CiAKIC8qCiAgKiBBIGludGVyZmFjZSB0byBlbmFibGUgc2xhYiBjcmVhdGlvbiBvbiBub2RlaWQKICAqLwotc3RhdGljIHZvaWQgKl9fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncywKK3N0YXRpYyB2b2lkICpfX19fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncywKIAkJCQlpbnQgbm9kZWlkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwpAQCAtMzIxMyw3ICszMzcwLDcgQEAKIAogbXVzdF9ncm93OgogCXNwaW5fdW5sb2NrKCZsMy0+bGlzdF9sb2NrKTsKLQl4ID0gY2FjaGVfZ3JvdyhjYWNoZXAsIGZsYWdzLCBub2RlaWQpOworCXggPSBjYWNoZV9ncm93KGNhY2hlcCwgZmxhZ3MgfCBHRlBfVEhJU05PREUsIG5vZGVpZCwgTlVMTCk7CiAJaWYgKHgpCiAJCWdvdG8gcmV0cnk7CiAKQEAgLTMzOTYsNyArMzU1Myw3IEBACiAgKgogICogQ3VycmVudGx5IG9ubHkgdXNlZCBmb3IgZGVudHJ5IHZhbGlkYXRpb24uCiAgKi8KLWludCBmYXN0Y2FsbCBrbWVtX3B0cl92YWxpZGF0ZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB2b2lkICpwdHIpCitpbnQgZmFzdGNhbGwga21lbV9wdHJfdmFsaWRhdGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgY29uc3Qgdm9pZCAqcHRyKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXB0cjsKIAl1bnNpZ25lZCBsb25nIG1pbl9hZGRyID0gUEFHRV9PRkZTRVQ7CkBAIC0zNDMxLDM1ICszNTg4LDU5IEBACiAgKiBAZmxhZ3M6IFNlZSBrbWFsbG9jKCkuCiAgKiBAbm9kZWlkOiBub2RlIG51bWJlciBvZiB0aGUgdGFyZ2V0IG5vZGUuCiAgKgotICogSWRlbnRpY2FsIHRvIGttZW1fY2FjaGVfYWxsb2MsIGV4Y2VwdCB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgc2xvdwotICogYW5kIGNhbiBzbGVlcC4gQW5kIGl0IHdpbGwgYWxsb2NhdGUgbWVtb3J5IG9uIHRoZSBnaXZlbiBub2RlLCB3aGljaAotICogY2FuIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIGZvciBjcHUgYm91bmQgc3RydWN0dXJlcy4KLSAqIE5ldyBhbmQgaW1wcm92ZWQ6IGl0IHdpbGwgbm93IG1ha2Ugc3VyZSB0aGF0IHRoZSBvYmplY3QgZ2V0cwotICogcHV0IG9uIHRoZSBjb3JyZWN0IG5vZGUgbGlzdCBzbyB0aGF0IHRoZXJlIGlzIG5vIGZhbHNlIHNoYXJpbmcuCisgKiBJZGVudGljYWwgdG8ga21lbV9jYWNoZV9hbGxvYyBidXQgaXQgd2lsbCBhbGxvY2F0ZSBtZW1vcnkgb24gdGhlIGdpdmVuCisgKiBub2RlLCB3aGljaCBjYW4gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UgZm9yIGNwdSBib3VuZCBzdHJ1Y3R1cmVzLgorICoKKyAqIEZhbGxiYWNrIHRvIG90aGVyIG5vZGUgaXMgcG9zc2libGUgaWYgX19HRlBfVEhJU05PREUgaXMgbm90IHNldC4KICAqLwotdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzLCBpbnQgbm9kZWlkKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKK19fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncywKKwkJaW50IG5vZGVpZCwgdm9pZCAqY2FsbGVyKQogewogCXVuc2lnbmVkIGxvbmcgc2F2ZV9mbGFnczsKLQl2b2lkICpwdHI7CisJdm9pZCAqcHRyID0gTlVMTDsKIAogCWNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYmVmb3JlKGNhY2hlcCwgZmxhZ3MpOwogCWxvY2FsX2lycV9zYXZlKHNhdmVfZmxhZ3MpOwogCi0JaWYgKG5vZGVpZCA9PSAtMSB8fCBub2RlaWQgPT0gbnVtYV9ub2RlX2lkKCkgfHwKLQkJCSFjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdKQotCQlwdHIgPSBfX19fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7Ci0JZWxzZQotCQlwdHIgPSBfX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShzYXZlX2ZsYWdzKTsKKwlpZiAodW5saWtlbHkobm9kZWlkID09IC0xKSkKKwkJbm9kZWlkID0gbnVtYV9ub2RlX2lkKCk7CiAKLQlwdHIgPSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGNhY2hlcCwgZmxhZ3MsIHB0ciwKLQkJCQkJICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwlpZiAobGlrZWx5KGNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0pKSB7CisJCWlmIChub2RlaWQgPT0gbnVtYV9ub2RlX2lkKCkpIHsKKwkJCS8qCisJCQkgKiBVc2UgdGhlIGxvY2FsbHkgY2FjaGVkIG9iamVjdHMgaWYgcG9zc2libGUuCisJCQkgKiBIb3dldmVyIF9fX19jYWNoZV9hbGxvYyBkb2VzIG5vdCBhbGxvdyBmYWxsYmFjaworCQkJICogdG8gb3RoZXIgbm9kZXMuIEl0IG1heSBmYWlsIHdoaWxlIHdlIHN0aWxsIGhhdmUKKwkJCSAqIG9iamVjdHMgb24gb3RoZXIgbm9kZXMgYXZhaWxhYmxlLgorCQkJICovCisJCQlwdHIgPSBfX19fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CisJCX0KKwkJaWYgKCFwdHIpIHsKKwkJCS8qIF9fX2NhY2hlX2FsbG9jX25vZGUgY2FuIGZhbGwgYmFjayB0byBvdGhlciBub2RlcyAqLworCQkJcHRyID0gX19fX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vZGUgbm90IGJvb3RzdHJhcHBlZCB5ZXQgKi8KKwkJaWYgKCEoZmxhZ3MgJiBfX0dGUF9USElTTk9ERSkpCisJCQlwdHIgPSBmYWxsYmFja19hbGxvYyhjYWNoZXAsIGZsYWdzKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShzYXZlX2ZsYWdzKTsKKwlwdHIgPSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGNhY2hlcCwgZmxhZ3MsIHB0ciwgY2FsbGVyKTsKIAogCXJldHVybiBwdHI7CiB9CisKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncywgaW50IG5vZGVpZCkKK3sKKwlyZXR1cm4gX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCwKKwkJCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Cit9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZSk7CiAKLXZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKgorX19kb19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSwgdm9pZCAqY2FsbGVyKQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CiAKQEAgLTM0NjgsOCArMzY0OSwyOSBAQAogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG5vZGUpOwogfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX1NMQUIKK3ZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJcmV0dXJuIF9fZG9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCBub2RlLAorCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KIEVYUE9SVF9TWU1CT0woX19rbWFsbG9jX25vZGUpOwotI2VuZGlmCisKK3ZvaWQgKl9fa21hbGxvY19ub2RlX3RyYWNrX2NhbGxlcihzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsCisJCWludCBub2RlLCB2b2lkICpjYWxsZXIpCit7CisJcmV0dXJuIF9fZG9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCBub2RlLCBjYWxsZXIpOworfQorRVhQT1JUX1NZTUJPTChfX2ttYWxsb2Nfbm9kZV90cmFja19jYWxsZXIpOworI2Vsc2UKK3ZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJcmV0dXJuIF9fZG9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCBub2RlLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0woX19rbWFsbG9jX25vZGUpOworI2VuZGlmIC8qIENPTkZJR19ERUJVR19TTEFCICovCisjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAogLyoqCiAgKiBfX2RvX2ttYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkKQEAgLTM1ODAsMTMgKzM3ODIsMTUgQEAKIAlpbnQgbm9kZTsKIAlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CiAJc3RydWN0IGFycmF5X2NhY2hlICpuZXdfc2hhcmVkOwotCXN0cnVjdCBhcnJheV9jYWNoZSAqKm5ld19hbGllbjsKKwlzdHJ1Y3QgYXJyYXlfY2FjaGUgKipuZXdfYWxpZW4gPSBOVUxMOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCi0JCW5ld19hbGllbiA9IGFsbG9jX2FsaWVuX2NhY2hlKG5vZGUsIGNhY2hlcC0+bGltaXQpOwotCQlpZiAoIW5ld19hbGllbikKLQkJCWdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICBpZiAodXNlX2FsaWVuX2NhY2hlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FsaWVuID0gYWxsb2NfYWxpZW5fY2FjaGUobm9kZSwgY2FjaGVwLT5saW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld19hbGllbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KIAogCQluZXdfc2hhcmVkID0gYWxsb2NfYXJyYXljYWNoZShub2RlLAogCQkJCWNhY2hlcC0+c2hhcmVkKmNhY2hlcC0+YmF0Y2hjb3VudCwKQEAgLTM4MTIsNyArNDAxNiw3IEBACiAgKiBJZiB3ZSBjYW5ub3QgYWNxdWlyZSB0aGUgY2FjaGUgY2hhaW4gbXV0ZXggdGhlbiBqdXN0IGdpdmUgdXAgLSB3ZSdsbCB0cnkKICAqIGFnYWluIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbi4KICAqLwotc3RhdGljIHZvaWQgY2FjaGVfcmVhcCh2b2lkICp1bnVzZWQpCitzdGF0aWMgdm9pZCBjYWNoZV9yZWFwKHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpzZWFyY2hwOwogCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKQEAgLTM4MjEsNyArNDAyNSw3IEBACiAJaWYgKCFtdXRleF90cnlsb2NrKCZjYWNoZV9jaGFpbl9tdXRleCkpIHsKIAkJLyogR2l2ZSB1cC4gU2V0dXAgdGhlIG5leHQgaXRlcmF0aW9uLiAqLwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJl9fZ2V0X2NwdV92YXIocmVhcF93b3JrKSwKLQkJCQkgICAgICBSRUFQVElNRU9VVF9DUFVDKTsKKwkJCQkgICAgICByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKFJFQVBUSU1FT1VUX0NQVUMpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzg2Nyw3ICs0MDcxLDggQEAKIAluZXh0X3JlYXBfbm9kZSgpOwogCXJlZnJlc2hfY3B1X3ZtX3N0YXRzKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJLyogU2V0IHVwIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmX19nZXRfY3B1X3ZhcihyZWFwX3dvcmspLCBSRUFQVElNRU9VVF9DUFVDKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJl9fZ2V0X2NwdV92YXIocmVhcF93b3JrKSwKKwkJcm91bmRfamlmZmllc19yZWxhdGl2ZShSRUFQVElNRU9VVF9DUFVDKSk7CiB9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtNDAzNSw3ICs0MjQwLDcgQEAKICAqICsgZnVydGhlciB2YWx1ZXMgb24gU01QIGFuZCB3aXRoIHN0YXRpc3RpY3MgZW5hYmxlZAogICovCiAKLXN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzbGFiaW5mb19vcCA9IHsKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzbGFiaW5mb19vcCA9IHsKIAkuc3RhcnQgPSBzX3N0YXJ0LAogCS5uZXh0ID0gc19uZXh0LAogCS5zdG9wID0gc19zdG9wLApAQCAtNDIzMyw3ICs0NDM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHNlcV9vcGVyYXRpb25zIHNsYWJzdGF0c19vcCA9IHsKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzbGFic3RhdHNfb3AgPSB7CiAJLnN0YXJ0ID0gbGVha3Nfc3RhcnQsCiAJLm5leHQgPSBzX25leHQsCiAJLnN0b3AgPSBzX3N0b3AsCmRpZmYgLS1naXQgYS9tbS9zbG9iLmMgYi9tbS9zbG9iLmMKaW5kZXggNTQyMzk0MS4uMmU5MjM2ZSAxMDA2NDQKLS0tIGEvbW0vc2xvYi5jCisrKyBiL21tL3Nsb2IuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJcmV0dXJuIG9yZGVyOwogfQogCi12b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBnZnApCit2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGdmcCkKIHsKIAlzbG9iX3QgKm07CiAJYmlnYmxvY2tfdCAqYmI7CkBAIC0xODYsOCArMTg2LDcgQEAKIAlzbG9iX2ZyZWUoYmIsIHNpemVvZihiaWdibG9ja190KSk7CiAJcmV0dXJuIDA7CiB9Ci0KLUVYUE9SVF9TWU1CT0woa21hbGxvYyk7CitFWFBPUlRfU1lNQk9MKF9fa21hbGxvYyk7CiAKIHZvaWQga2ZyZWUoY29uc3Qgdm9pZCAqYmxvY2spCiB7CkBAIC0zMjksNiArMzI4LDE3IEBACiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2xvYl90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKAogCSh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlrbWVtX2NhY2hlX2luaXQsIDAsIDApOwogCitpbnQga21lbV9jYWNoZV9zaHJpbmsoc3RydWN0IGttZW1fY2FjaGUgKmQpCit7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfc2hyaW5rKTsKKworaW50IGttZW1fcHRyX3ZhbGlkYXRlKHN0cnVjdCBrbWVtX2NhY2hlICphLCBjb25zdCB2b2lkICpiKQoreworCXJldHVybiAwOworfQorCiB2b2lkIGttZW1fY2FjaGVfaW5pdCh2b2lkKQogewogCXZvaWQgKnAgPSBzbG9iX2FsbG9jKFBBR0VfU0laRSwgMCwgUEFHRV9TSVpFLTEpOwpkaWZmIC0tZ2l0IGEvbW0vc3BhcnNlLmMgYi9tbS9zcGFyc2UuYwppbmRleCA4NmM1MmFiLi5hYzI2ZWIwIDEwMDY0NAotLS0gYS9tbS9zcGFyc2UuYworKysgYi9tbS9zcGFyc2UuYwpAQCAtMjQsNiArMjQsMjUgQEAKICNlbmRpZgogRVhQT1JUX1NZTUJPTChtZW1fc2VjdGlvbik7CiAKKyNpZmRlZiBOT0RFX05PVF9JTl9QQUdFX0ZMQUdTCisvKgorICogSWYgd2UgZGlkIG5vdCBzdG9yZSB0aGUgbm9kZSBudW1iZXIgaW4gdGhlIHBhZ2UgdGhlbiB3ZSBoYXZlIHRvCisgKiBkbyBhIGxvb2t1cCBpbiB0aGUgc2VjdGlvbl90b19ub2RlX3RhYmxlIGluIG9yZGVyIHRvIGZpbmQgd2hpY2gKKyAqIG5vZGUgdGhlIHBhZ2UgYmVsb25ncyB0by4KKyAqLworI2lmIE1BWF9OVU1OT0RFUyA8PSAyNTYKK3N0YXRpYyB1OCBzZWN0aW9uX3RvX25vZGVfdGFibGVbTlJfTUVNX1NFQ1RJT05TXSBfX2NhY2hlbGluZV9hbGlnbmVkOworI2Vsc2UKK3N0YXRpYyB1MTYgc2VjdGlvbl90b19ub2RlX3RhYmxlW05SX01FTV9TRUNUSU9OU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKKyNlbmRpZgorCitpbnQgcGFnZV90b19uaWQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIHNlY3Rpb25fdG9fbm9kZV90YWJsZVtwYWdlX3RvX3NlY3Rpb24ocGFnZSldOworfQorRVhQT1JUX1NZTUJPTChwYWdlX3RvX25pZCk7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19TUEFSU0VNRU1fRVhUUkVNRQogc3RhdGljIHN0cnVjdCBtZW1fc2VjdGlvbiAqc3BhcnNlX2luZGV4X2FsbG9jKGludCBuaWQpCiB7CkBAIC00OSw2ICs2OCwxMCBAQAogCXN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbjsKIAlpbnQgcmV0ID0gMDsKIAorI2lmZGVmIE5PREVfTk9UX0lOX1BBR0VfRkxBR1MKKwlzZWN0aW9uX3RvX25vZGVfdGFibGVbc2VjdGlvbl9ucl0gPSBuaWQ7CisjZW5kaWYKKwogCWlmIChtZW1fc2VjdGlvbltyb290XSkKIAkJcmV0dXJuIC1FRVhJU1Q7CiAKQEAgLTIxMSw3ICsyMzQsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlLCAqcmV0OwogCXVuc2lnbmVkIGxvbmcgbWVtbWFwX3NpemUgPSBzaXplb2Yoc3RydWN0IHBhZ2UpICogbnJfcGFnZXM7CiAKLQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKG1lbW1hcF9zaXplKSk7CisJcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfTk9XQVJOLCBnZXRfb3JkZXIobWVtbWFwX3NpemUpKTsKIAlpZiAocGFnZSkKIAkJZ290byBnb3RfbWFwX3BhZ2U7CiAKZGlmZiAtLWdpdCBhL21tL3N3YXAuYyBiL21tL3N3YXAuYwppbmRleCAyZTBlODcxLi4yZWQ3YmUzIDEwMDY0NAotLS0gYS9tbS9zd2FwLmMKKysrIGIvbW0vc3dhcC5jCkBAIC01Nyw5ICs1Nyw5IEBACiB7CiAJcGFnZSA9IChzdHJ1Y3QgcGFnZSAqKXBhZ2VfcHJpdmF0ZShwYWdlKTsKIAlpZiAocHV0X3BhZ2VfdGVzdHplcm8ocGFnZSkpIHsKLQkJdm9pZCAoKmR0b3IpKHN0cnVjdCBwYWdlICpwYWdlKTsKKwkJY29tcG91bmRfcGFnZV9kdG9yICpkdG9yOwogCi0JCWR0b3IgPSAodm9pZCAoKikoc3RydWN0IHBhZ2UgKikpcGFnZVsxXS5scnUubmV4dDsKKwkJZHRvciA9IGdldF9jb21wb3VuZF9wYWdlX2R0b3IocGFnZSk7CiAJCSgqZHRvcikocGFnZSk7CiAJfQogfQpAQCAtMjE2LDcgKzIxNiw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfTlVNQQotc3RhdGljIHZvaWQgbHJ1X2FkZF9kcmFpbl9wZXJfY3B1KHZvaWQgKmR1bW15KQorc3RhdGljIHZvaWQgbHJ1X2FkZF9kcmFpbl9wZXJfY3B1KHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCiB7CiAJbHJ1X2FkZF9kcmFpbigpOwogfQpAQCAtMjI2LDcgKzIyNiw3IEBACiAgKi8KIGludCBscnVfYWRkX2RyYWluX2FsbCh2b2lkKQogewotCXJldHVybiBzY2hlZHVsZV9vbl9lYWNoX2NwdShscnVfYWRkX2RyYWluX3Blcl9jcHUsIE5VTEwpOworCXJldHVybiBzY2hlZHVsZV9vbl9lYWNoX2NwdShscnVfYWRkX2RyYWluX3Blcl9jcHUpOwogfQogCiAjZWxzZQpAQCAtNTE0LDUgKzUxNCw3IEBACiAJICogUmlnaHQgbm93IG90aGVyIHBhcnRzIG9mIHRoZSBzeXN0ZW0gbWVhbnMgdGhhdCB3ZQogCSAqIF9yZWFsbHlfIGRvbid0IHdhbnQgdG8gY2x1c3RlciBtdWNoIG1vcmUKIAkgKi8KKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAlob3RjcHVfbm90aWZpZXIoY3B1X3N3YXBfY2FsbGJhY2ssIDApOworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCBhMTVkZWY2Li5iOWZjMGU1ZCAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC00MjcsMzQgKzQyNyw0OCBAQAogCiAjaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKIC8qCi0gKiBGaW5kIHRoZSBzd2FwIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byBnaXZlbiBkZXZpY2UgKGlmIGFueSkKKyAqIEZpbmQgdGhlIHN3YXAgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGdpdmVuIGRldmljZSAoaWYgYW55KS4KICAqCi0gKiBUaGlzIGlzIG5lZWRlZCBmb3Igc29mdHdhcmUgc3VzcGVuZCBhbmQgaXMgZG9uZSBpbiBzdWNoIGEgd2F5IHRoYXQgaW5vZGUKLSAqIGFsaWFzaW5nIGlzIGFsbG93ZWQuCisgKiBAb2Zmc2V0IC0gbnVtYmVyIG9mIHRoZSBQQUdFX1NJWkUtc2l6ZWQgYmxvY2sgb2YgdGhlIGRldmljZSwgc3RhcnRpbmcKKyAqIGZyb20gMCwgaW4gd2hpY2ggdGhlIHN3YXAgaGVhZGVyIGlzIGV4cGVjdGVkIHRvIGJlIGxvY2F0ZWQuCisgKgorICogVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzdXNwZW5kIHRvIGRpc2sgKGFrYSBzd3N1c3ApLgogICovCi1pbnQgc3dhcF90eXBlX29mKGRldl90IGRldmljZSkKK2ludCBzd2FwX3R5cGVfb2YoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpCiB7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IE5VTEw7CiAJaW50IGk7CiAKKwlpZiAoZGV2aWNlKQorCQliZGV2ID0gYmRnZXQoZGV2aWNlKTsKKwogCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfc3dhcGZpbGVzOyBpKyspIHsKLQkJc3RydWN0IGlub2RlICppbm9kZTsKKwkJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHN3YXBfaW5mbyArIGk7CiAKLQkJaWYgKCEoc3dhcF9pbmZvW2ldLmZsYWdzICYgU1dQX1dSSVRFT0spKQorCQlpZiAoIShzaXMtPmZsYWdzICYgU1dQX1dSSVRFT0spKQogCQkJY29udGludWU7CiAKLQkJaWYgKCFkZXZpY2UpIHsKKwkJaWYgKCFiZGV2KSB7CiAJCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAkJCXJldHVybiBpOwogCQl9Ci0JCWlub2RlID0gc3dhcF9pbmZvW2ldLnN3YXBfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7Ci0JCWlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpICYmCi0JCSAgICBkZXZpY2UgPT0gTUtERVYoaW1ham9yKGlub2RlKSwgaW1pbm9yKGlub2RlKSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwotCQkJcmV0dXJuIGk7CisJCWlmIChiZGV2ID09IHNpcy0+YmRldikgeworCQkJc3RydWN0IHN3YXBfZXh0ZW50ICpzZTsKKworCQkJc2UgPSBsaXN0X2VudHJ5KHNpcy0+ZXh0ZW50X2xpc3QubmV4dCwKKwkJCQkJc3RydWN0IHN3YXBfZXh0ZW50LCBsaXN0KTsKKwkJCWlmIChzZS0+c3RhcnRfYmxvY2sgPT0gb2Zmc2V0KSB7CisJCQkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CisJCQkJYmRwdXQoYmRldik7CisJCQkJcmV0dXJuIGk7CisJCQl9CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CisJaWYgKGJkZXYpCisJCWJkcHV0KGJkZXYpOworCiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTkzMSw2ICs5NDUsMjMgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAorLyoKKyAqIEdldCB0aGUgKFBBR0VfU0laRSkgYmxvY2sgY29ycmVzcG9uZGluZyB0byBnaXZlbiBvZmZzZXQgb24gdGhlIHN3YXBkZXYKKyAqIGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gaW5kZXggaW4gc3dhcF9pbmZvIChzd2FwIHR5cGUpLgorICovCitzZWN0b3JfdCBzd2FwZGV2X2Jsb2NrKGludCBzd2FwX3R5cGUsIHBnb2ZmX3Qgb2Zmc2V0KQoreworCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXM7CisKKwlpZiAoc3dhcF90eXBlID49IG5yX3N3YXBmaWxlcykKKwkJcmV0dXJuIDA7CisKKwlzaXMgPSBzd2FwX2luZm8gKyBzd2FwX3R5cGU7CisJcmV0dXJuIChzaXMtPmZsYWdzICYgU1dQX1dSSVRFT0spID8gbWFwX3N3YXBfcGFnZShzaXMsIG9mZnNldCkgOiAwOworfQorI2VuZGlmIC8qIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EICovCisKIC8qCiAgKiBGcmVlIGFsbCBvZiBhIHN3YXBkZXYncyBleHRlbnQgaW5mb3JtYXRpb24KICAqLwpAQCAtMTI3NCwxMCArMTMwNSwxMyBAQAogCiAJbXV0ZXhfbG9jaygmc3dhcG9uX211dGV4KTsKIAorCWlmICghbCkKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwogCWZvciAoaSA9IDA7IGkgPCBucl9zd2FwZmlsZXM7IGkrKywgcHRyKyspIHsKIAkJaWYgKCEocHRyLT5mbGFncyAmIFNXUF9VU0VEKSB8fCAhcHRyLT5zd2FwX21hcCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIWwtLSkKKwkJaWYgKCEtLWwpCiAJCQlyZXR1cm4gcHRyOwogCX0KIApAQCAtMTI4NiwxMCArMTMyMCwxNyBAQAogCiBzdGF0aWMgdm9pZCAqc3dhcF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc3dhcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnB0ciA9IHY7CisJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnB0cjsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZW5kcHRyID0gc3dhcF9pbmZvICsgbnJfc3dhcGZpbGVzOwogCi0JZm9yICgrK3B0cjsgcHRyIDwgZW5kcHRyOyBwdHIrKykgeworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJcHRyID0gc3dhcF9pbmZvOworCWVsc2UgeworCQlwdHIgPSB2OworCQlwdHIrKzsKKwl9CisKKwlmb3IgKDsgcHRyIDwgZW5kcHRyOyBwdHIrKykgewogCQlpZiAoIShwdHItPmZsYWdzICYgU1dQX1VTRUQpIHx8ICFwdHItPnN3YXBfbWFwKQogCQkJY29udGludWU7CiAJCSsrKnBvczsKQEAgLTEzMTAsMTQgKzEzNTEsMTYgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlpbnQgbGVuOwogCi0JaWYgKHYgPT0gc3dhcF9pbmZvKQotCQlzZXFfcHV0cyhzd2FwLCAiRmlsZW5hbWVcdFx0XHRcdFR5cGVcdFx0U2l6ZVx0VXNlZFx0UHJpb3JpdHlcbiIpOworCWlmIChwdHIgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXNlcV9wdXRzKHN3YXAsIkZpbGVuYW1lXHRcdFx0XHRUeXBlXHRcdFNpemVcdFVzZWRcdFByaW9yaXR5XG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJZmlsZSA9IHB0ci0+c3dhcF9maWxlOwotCWxlbiA9IHNlcV9wYXRoKHN3YXAsIGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSwgIiBcdFxuXFwiKTsKKwlsZW4gPSBzZXFfcGF0aChzd2FwLCBmaWxlLT5mX3BhdGgubW50LCBmaWxlLT5mX3BhdGguZGVudHJ5LCAiIFx0XG5cXCIpOwogCXNlcV9wcmludGYoc3dhcCwgIiUqcyVzXHQldVx0JXVcdCVkXG4iLAogCQkgICAgICAgbGVuIDwgNDAgPyA0MCAtIGxlbiA6IDEsICIgIiwKLQkJICAgICAgIFNfSVNCTEsoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgPworCQkgICAgICAgU19JU0JMSyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpID8KIAkJCQkicGFydGl0aW9uIiA6ICJmaWxlXHQiLAogCQkgICAgICAgcHRyLT5wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDEwKSwKIAkJICAgICAgIHB0ci0+aW51c2VfcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksCkBAIC0xMzI1LDcgKzEzNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHN3YXBzX29wID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzd2Fwc19vcCA9IHsKIAkuc3RhcnQgPQlzd2FwX3N0YXJ0LAogCS5uZXh0ID0JCXN3YXBfbmV4dCwKIAkuc3RvcCA9CQlzd2FwX3N0b3AsCkBAIC0xMzM3LDcgKzEzODAsNyBAQAogCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc3dhcHNfb3ApOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N3YXBzX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N3YXBzX29wZXJhdGlvbnMgPSB7CiAJLm9wZW4JCT0gc3dhcHNfb3BlbiwKIAkucmVhZAkJPSBzZXFfcmVhZCwKIAkubGxzZWVrCQk9IHNlcV9sc2VlaywKQEAgLTE1NDAsNiArMTU4MywxMSBAQAogCQllcnJvciA9IC1FSU5WQUw7CiAJCWlmICghbWF4cGFnZXMpCiAJCQlnb3RvIGJhZF9zd2FwOworCQlpZiAoc3dhcGZpbGVzaXplICYmIG1heHBhZ2VzID4gc3dhcGZpbGVzaXplKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIlN3YXAgYXJlYSBzaG9ydGVyIHRoYW4gc2lnbmF0dXJlIGluZGljYXRlc1xuIik7CisJCQlnb3RvIGJhZF9zd2FwOworCQl9CiAJCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQkJZ290byBiYWRfc3dhcDsKIAkJaWYgKHN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzID4gTUFYX1NXQVBfQkFEUEFHRVMpCkBAIC0xNTY3LDEyICsxNjE1LDYgQEAKIAkJCWdvdG8gYmFkX3N3YXA7CiAJfQogCi0JaWYgKHN3YXBmaWxlc2l6ZSAmJiBtYXhwYWdlcyA+IHN3YXBmaWxlc2l6ZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiU3dhcCBhcmVhIHNob3J0ZXIgdGhhbiBzaWduYXR1cmUgaW5kaWNhdGVzXG4iKTsKLQkJZXJyb3IgPSAtRUlOVkFMOwotCQlnb3RvIGJhZF9zd2FwOwotCX0KIAlpZiAobnJfZ29vZF9wYWdlcykgewogCQlwLT5zd2FwX21hcFswXSA9IFNXQVBfTUFQX0JBRDsKIAkJcC0+bWF4ID0gbWF4cGFnZXM7CmRpZmYgLS1naXQgYS9tbS90aHJhc2guYyBiL21tL3RocmFzaC5jCmluZGV4IGY0YzU2MGIuLjllZjkwNzEgMTAwNjQ0Ci0tLSBhL21tL3RocmFzaC5jCisrKyBiL21tL3RocmFzaC5jCkBAIC03LDEwMCArNyw3NCBAQAogICoKICAqIFNpbXBsZSB0b2tlbiBiYXNlZCB0aHJhc2hpbmcgcHJvdGVjdGlvbiwgdXNpbmcgdGhlIGFsZ29yaXRobQogICogZGVzY3JpYmVkIGluOiAgaHR0cDovL3d3dy5jcy53bS5lZHUvfnNqaWFuZy90b2tlbi5wZGYKKyAqCisgKiBTZXAgMjAwNiwgQXNod2luIENoYXVndWxlIDxhc2h3aW4uY2hhdWd1bGVAY2VsdW5pdGUuY29tPgorICogSW1wcm92ZWQgYWxnb3JpdGhtIHRvIHBhc3MgdG9rZW46CisgKiBFYWNoIHRhc2sgaGFzIGEgcHJpb3JpdHkgd2hpY2ggaXMgaW5jcmVtZW50ZWQgaWYgaXQgY29udGVuZGVkCisgKiBmb3IgdGhlIHRva2VuIGluIGFuIGludGVydmFsIGxlc3MgdGhhbiBpdHMgcHJldmlvdXMgYXR0ZW1wdC4KKyAqIElmIHRoZSB0b2tlbiBpcyBhY3F1aXJlZCwgdGhhdCB0YXNrJ3MgcHJpb3JpdHkgaXMgYm9vc3RlZCB0byBwcmV2ZW50CisgKiB0aGUgdG9rZW4gZnJvbSBib3VuY2luZyBhcm91bmQgdG9vIG9mdGVuIGFuZCB0byBsZXQgdGhlIHRhc2sgbWFrZQorICogc29tZSBwcm9ncmVzcyBpbiBpdHMgZXhlY3V0aW9uLgogICovCisKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX3Rva2VuX2xvY2spOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3dhcF90b2tlbl90aW1lb3V0Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3dhcF90b2tlbl9jaGVjazsKLXN0cnVjdCBtbV9zdHJ1Y3QgKiBzd2FwX3Rva2VuX21tID0gJmluaXRfbW07CitzdHJ1Y3QgbW1fc3RydWN0ICpzd2FwX3Rva2VuX21tOworc3RhdGljIHVuc2lnbmVkIGludCBnbG9iYWxfZmF1bHRzOwogCi0jZGVmaW5lIFNXQVBfVE9LRU5fQ0hFQ0tfSU5URVJWQUwgKEhaICogMikKLSNkZWZpbmUgU1dBUF9UT0tFTl9USU1FT1VUCSgzMDAgKiBIWikKLS8qCi0gKiBDdXJyZW50bHkgZGlzYWJsZWQ7IE5lZWRzIGZ1cnRoZXIgY29kZSB0byB3b3JrIGF0IEhaICogMzAwLgotICovCi11bnNpZ25lZCBsb25nIHN3YXBfdG9rZW5fZGVmYXVsdF90aW1lb3V0ID0gU1dBUF9UT0tFTl9USU1FT1VUOwotCi0vKgotICogVGFrZSB0aGUgdG9rZW4gYXdheSBpZiB0aGUgcHJvY2VzcyBoYWQgbm8gcGFnZSBmYXVsdHMKLSAqIGluIHRoZSBsYXN0IGludGVydmFsLCBvciBpZiBpdCBoYXMgaGVsZCB0aGUgdG9rZW4gZm9yCi0gKiB0b28gbG9uZy4KLSAqLwotI2RlZmluZSBTV0FQX1RPS0VOX0VOT1VHSF9SU1MgMQotI2RlZmluZSBTV0FQX1RPS0VOX1RJTUVEX09VVCAyCi1zdGF0aWMgaW50IHNob3VsZF9yZWxlYXNlX3N3YXBfdG9rZW4oc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JaW50IHJldCA9IDA7Ci0JaWYgKCFtbS0+cmVjZW50X3BhZ2VpbikKLQkJcmV0ID0gU1dBUF9UT0tFTl9FTk9VR0hfUlNTOwotCWVsc2UgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3dhcF90b2tlbl90aW1lb3V0KSkKLQkJcmV0ID0gU1dBUF9UT0tFTl9USU1FRF9PVVQ7Ci0JbW0tPnJlY2VudF9wYWdlaW4gPSAwOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBUcnkgdG8gZ3JhYiB0aGUgc3dhcG91dCBwcm90ZWN0aW9uIHRva2VuLiAgV2Ugb25seSB0cnkgdG8KLSAqIGdyYWIgaXQgb25jZSBldmVyeSBUT0tFTl9DSEVDS19JTlRFUlZBTCwgYm90aCB0byBwcmV2ZW50Ci0gKiBTTVAgbG9jayBjb250ZW50aW9uIGFuZCB0byBjaGVjayB0aGF0IHRoZSBwcm9jZXNzIHRoYXQgaGVsZAotICogdGhlIHRva2VuIGJlZm9yZSBpcyBubyBsb25nZXIgdGhyYXNoaW5nLgotICovCiB2b2lkIGdyYWJfc3dhcF90b2tlbih2b2lkKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCWludCByZWFzb247CisJaW50IGN1cnJlbnRfaW50ZXJ2YWw7CiAKLQkvKiBXZSBoYXZlIHRoZSB0b2tlbi4gTGV0IG90aGVycyBrbm93IHdlIHN0aWxsIG5lZWQgaXQuICovCi0JaWYgKGhhc19zd2FwX3Rva2VuKGN1cnJlbnQtPm1tKSkgewotCQljdXJyZW50LT5tbS0+cmVjZW50X3BhZ2VpbiA9IDE7Ci0JCWlmICh1bmxpa2VseSghc3dhcF90b2tlbl9kZWZhdWx0X3RpbWVvdXQpKQotCQkJZGlzYWJsZV9zd2FwX3Rva2VuKCk7CisJZ2xvYmFsX2ZhdWx0cysrOworCisJY3VycmVudF9pbnRlcnZhbCA9IGdsb2JhbF9mYXVsdHMgLSBjdXJyZW50LT5tbS0+ZmF1bHRzdGFtcDsKKworCWlmICghc3Bpbl90cnlsb2NrKCZzd2FwX3Rva2VuX2xvY2spKQogCQlyZXR1cm47CisKKwkvKiBGaXJzdCBjb21lIGZpcnN0IHNlcnZlZCAqLworCWlmIChzd2FwX3Rva2VuX21tID09IE5VTEwpIHsKKwkJY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5ID0gY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5ICsgMjsKKwkJc3dhcF90b2tlbl9tbSA9IGN1cnJlbnQtPm1tOworCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzd2FwX3Rva2VuX2NoZWNrKSkgewotCi0JCWlmICghc3dhcF90b2tlbl9kZWZhdWx0X3RpbWVvdXQpIHsKLQkJCXN3YXBfdG9rZW5fY2hlY2sgPSBqaWZmaWVzICsgU1dBUF9UT0tFTl9DSEVDS19JTlRFUlZBTDsKLQkJCXJldHVybjsKKwlpZiAoY3VycmVudC0+bW0gIT0gc3dhcF90b2tlbl9tbSkgeworCQlpZiAoY3VycmVudF9pbnRlcnZhbCA8IGN1cnJlbnQtPm1tLT5sYXN0X2ludGVydmFsKQorCQkJY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5Kys7CisJCWVsc2UgeworCQkJY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5LS07CisJCQlpZiAodW5saWtlbHkoY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5IDwgMCkpCisJCQkJY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5ID0gMDsKIAkJfQotCi0JCS8qIC4uLiBvciBpZiB3ZSByZWNlbnRseSBoZWxkIHRoZSB0b2tlbi4gKi8KLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGN1cnJlbnQtPm1tLT5zd2FwX3Rva2VuX3RpbWUpKQotCQkJcmV0dXJuOwotCi0JCWlmICghc3Bpbl90cnlsb2NrKCZzd2FwX3Rva2VuX2xvY2spKQotCQkJcmV0dXJuOwotCi0JCXN3YXBfdG9rZW5fY2hlY2sgPSBqaWZmaWVzICsgU1dBUF9UT0tFTl9DSEVDS19JTlRFUlZBTDsKLQotCQltbSA9IHN3YXBfdG9rZW5fbW07Ci0JCWlmICgocmVhc29uID0gc2hvdWxkX3JlbGVhc2Vfc3dhcF90b2tlbihtbSkpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGVsaWdpYmxlID0gamlmZmllczsKLQkJCWlmIChyZWFzb24gPT0gU1dBUF9UT0tFTl9USU1FRF9PVVQpIHsKLQkJCQllbGlnaWJsZSArPSBzd2FwX3Rva2VuX2RlZmF1bHRfdGltZW91dDsKLQkJCX0KLQkJCW1tLT5zd2FwX3Rva2VuX3RpbWUgPSBlbGlnaWJsZTsKLQkJCXN3YXBfdG9rZW5fdGltZW91dCA9IGppZmZpZXMgKyBzd2FwX3Rva2VuX2RlZmF1bHRfdGltZW91dDsKKwkJLyogQ2hlY2sgaWYgd2UgZGVzZXJ2ZSB0aGUgdG9rZW4gKi8KKwkJaWYgKGN1cnJlbnQtPm1tLT50b2tlbl9wcmlvcml0eSA+CisJCQkJc3dhcF90b2tlbl9tbS0+dG9rZW5fcHJpb3JpdHkpIHsKKwkJCWN1cnJlbnQtPm1tLT50b2tlbl9wcmlvcml0eSArPSAyOwogCQkJc3dhcF90b2tlbl9tbSA9IGN1cnJlbnQtPm1tOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZzd2FwX3Rva2VuX2xvY2spOworCX0gZWxzZSB7CisJCS8qIFRva2VuIGhvbGRlciBjYW1lIGluIGFnYWluISAqLworCQljdXJyZW50LT5tbS0+dG9rZW5fcHJpb3JpdHkgKz0gMjsKIAl9Ci0JcmV0dXJuOworCitvdXQ6CisJY3VycmVudC0+bW0tPmZhdWx0c3RhbXAgPSBnbG9iYWxfZmF1bHRzOworCWN1cnJlbnQtPm1tLT5sYXN0X2ludGVydmFsID0gY3VycmVudF9pbnRlcnZhbDsKKwlzcGluX3VubG9jaygmc3dhcF90b2tlbl9sb2NrKTsKK3JldHVybjsKIH0KIAogLyogQ2FsbGVkIG9uIHByb2Nlc3MgZXhpdC4gKi8KIHZvaWQgX19wdXRfc3dhcF90b2tlbihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlzcGluX2xvY2soJnN3YXBfdG9rZW5fbG9jayk7Ci0JaWYgKGxpa2VseShtbSA9PSBzd2FwX3Rva2VuX21tKSkgewotCQltbS0+c3dhcF90b2tlbl90aW1lID0gamlmZmllcyArIFNXQVBfVE9LRU5fQ0hFQ0tfSU5URVJWQUw7Ci0JCXN3YXBfdG9rZW5fbW0gPSAmaW5pdF9tbTsKLQkJc3dhcF90b2tlbl9jaGVjayA9IGppZmZpZXM7Ci0JfQorCWlmIChsaWtlbHkobW0gPT0gc3dhcF90b2tlbl9tbSkpCisJCXN3YXBfdG9rZW5fbW0gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZzd2FwX3Rva2VuX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvbW0vdGlueS1zaG1lbS5jIGIvbW0vdGlueS1zaG1lbS5jCmluZGV4IDVmMmNiZjAuLmM3ZjZlMTkgMTAwNjQ0Ci0tLSBhL21tL3Rpbnktc2htZW0uYworKysgYi9tbS90aW55LXNobWVtLmMKQEAgLTc5LDggKzc5LDggQEAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCWlub2RlLT5pX25saW5rID0gMDsJLyogSXQgaXMgdW5saW5rZWQgKi8KIAotCWZpbGUtPmZfdmZzbW50ID0gbW50Z2V0KHNobV9tbnQpOwotCWZpbGUtPmZfZGVudHJ5ID0gZGVudHJ5OworCWZpbGUtPmZfcGF0aC5tbnQgPSBtbnRnZXQoc2htX21udCk7CisJZmlsZS0+Zl9wYXRoLmRlbnRyeSA9IGRlbnRyeTsKIAlmaWxlLT5mX21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCWZpbGUtPmZfb3AgPSAmcmFtZnNfZmlsZV9vcGVyYXRpb25zOwogCWZpbGUtPmZfbW9kZSA9IEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRDsKZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jCmluZGV4IDExY2E0ODAuLjliZmI4ZTggMTAwNjQ0Ci0tLSBhL21tL3RydW5jYXRlLmMKKysrIGIvbW0vdHJ1bmNhdGUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CisjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CS8qIGdyci4gdHJ5X3RvX3JlbGVhc2VfcGFnZSwKIAkJCQkgICBkb19pbnZhbGlkYXRlcGFnZSAqLwogCkBAIC02OSw3ICs3MCw4IEBACiAJaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKQogCQlkb19pbnZhbGlkYXRlcGFnZShwYWdlLCAwKTsKIAotCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJaWYgKHRlc3RfY2xlYXJfcGFnZV9kaXJ0eShwYWdlKSkKKwkJdGFza19pb19hY2NvdW50X2NhbmNlbGxlZF93cml0ZShQQUdFX0NBQ0hFX1NJWkUpOwogCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwogCUNsZWFyUGFnZU1hcHBlZFRvRGlzayhwYWdlKTsKIAlyZW1vdmVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UpOwpAQCAtOTYsNyArOTgsNiBAQAogCQlyZXR1cm4gMDsKIAogCXJldCA9IHJlbW92ZV9tYXBwaW5nKG1hcHBpbmcsIHBhZ2UpOwotCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCA3NTBhYjZlLi44Njg5N2VlIDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC0xNjAsMTMgKzE2MCwxNSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0cnVjdCB2bV9zdHJ1Y3QgKl9fZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIGludCBub2RlKQorc3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKl9fZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJCQkJICAgIGludCBub2RlLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcCwgKmFyZWE7CiAJdW5zaWduZWQgbG9uZyBhbGlnbiA9IDE7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCisJQlVHX09OKGluX2ludGVycnVwdCgpKTsKIAlpZiAoZmxhZ3MgJiBWTV9JT1JFTUFQKSB7CiAJCWludCBiaXQgPSBmbHMoc2l6ZSk7CiAKQEAgLTE3OSwxNiArMTgxLDEzIEBACiAJfQogCWFkZHIgPSBBTElHTihzdGFydCwgYWxpZ24pOwogCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCWlmICh1bmxpa2VseSghc2l6ZSkpCisJCXJldHVybiBOVUxMOwogCi0JYXJlYSA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmFyZWEpLCBHRlBfS0VSTkVMLCBub2RlKTsKKwlhcmVhID0ga21hbGxvY19ub2RlKHNpemVvZigqYXJlYSksIGdmcF9tYXNrICYgR0ZQX0xFVkVMX01BU0ssIG5vZGUpOwogCWlmICh1bmxpa2VseSghYXJlYSkpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKHVubGlrZWx5KCFzaXplKSkgewotCQlrZnJlZSAoYXJlYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQogCS8qCiAJICogV2UgYWx3YXlzIGFsbG9jYXRlIGEgZ3VhcmQgcGFnZS4KIAkgKi8KQEAgLTIzNiw3ICsyMzUsNyBAQAogc3RydWN0IHZtX3N0cnVjdCAqX19nZXRfdm1fYXJlYSh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0JcmV0dXJuIF9fZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCBmbGFncywgc3RhcnQsIGVuZCwgLTEpOworCXJldHVybiBfX2dldF92bV9hcmVhX25vZGUoc2l6ZSwgZmxhZ3MsIHN0YXJ0LCBlbmQsIC0xLCBHRlBfS0VSTkVMKTsKIH0KIAogLyoqCkBAIC0yNTMsOSArMjUyLDExIEBACiAJcmV0dXJuIF9fZ2V0X3ZtX2FyZWEoc2l6ZSwgZmxhZ3MsIFZNQUxMT0NfU1RBUlQsIFZNQUxMT0NfRU5EKTsKIH0KIAotc3RydWN0IHZtX3N0cnVjdCAqZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBub2RlKQorc3RydWN0IHZtX3N0cnVjdCAqZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJICAgaW50IG5vZGUsIGdmcF90IGdmcF9tYXNrKQogewotCXJldHVybiBfX2dldF92bV9hcmVhX25vZGUoc2l6ZSwgZmxhZ3MsIFZNQUxMT0NfU1RBUlQsIFZNQUxMT0NfRU5ELCBub2RlKTsKKwlyZXR1cm4gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIGZsYWdzLCBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCwgbm9kZSwKKwkJCQkgIGdmcF9tYXNrKTsKIH0KIAogLyogQ2FsbGVyIG11c3QgaG9sZCB2bWxpc3RfbG9jayAqLwpAQCAtNDI4LDggKzQyOSwxMSBAQAogCWlmIChhcnJheV9zaXplID4gUEFHRV9TSVpFKSB7CiAJCXBhZ2VzID0gX192bWFsbG9jX25vZGUoYXJyYXlfc2l6ZSwgZ2ZwX21hc2ssIFBBR0VfS0VSTkVMLCBub2RlKTsKIAkJYXJlYS0+ZmxhZ3MgfD0gVk1fVlBBR0VTOwotCX0gZWxzZQotCQlwYWdlcyA9IGttYWxsb2Nfbm9kZShhcnJheV9zaXplLCAoZ2ZwX21hc2sgJiB+X19HRlBfSElHSE1FTSksIG5vZGUpOworCX0gZWxzZSB7CisJCXBhZ2VzID0ga21hbGxvY19ub2RlKGFycmF5X3NpemUsCisJCQkJKGdmcF9tYXNrICYgfihfX0dGUF9ISUdITUVNIHwgX19HRlBfWkVSTykpLAorCQkJCW5vZGUpOworCX0KIAlhcmVhLT5wYWdlcyA9IHBhZ2VzOwogCWlmICghYXJlYS0+cGFnZXMpIHsKIAkJcmVtb3ZlX3ZtX2FyZWEoYXJlYS0+YWRkcik7CkBAIC00ODQsNyArNDg4LDcgQEAKIAlpZiAoIXNpemUgfHwgKHNpemUgPj4gUEFHRV9TSElGVCkgPiBudW1fcGh5c3BhZ2VzKQogCQlyZXR1cm4gTlVMTDsKIAotCWFyZWEgPSBnZXRfdm1fYXJlYV9ub2RlKHNpemUsIFZNX0FMTE9DLCBub2RlKTsKKwlhcmVhID0gZ2V0X3ZtX2FyZWFfbm9kZShzaXplLCBWTV9BTExPQywgbm9kZSwgZ2ZwX21hc2spOwogCWlmICghYXJlYSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTUyNSwxMSArNTI5LDEyIEBACiAJdm9pZCAqcmV0OwogCiAJcmV0ID0gX192bWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNIHwgX19HRlBfWkVSTywgUEFHRV9LRVJORUwpOwotCXdyaXRlX2xvY2soJnZtbGlzdF9sb2NrKTsKLQlhcmVhID0gX19maW5kX3ZtX2FyZWEocmV0KTsKLQlhcmVhLT5mbGFncyB8PSBWTV9VU0VSTUFQOwotCXdyaXRlX3VubG9jaygmdm1saXN0X2xvY2spOwotCisJaWYgKHJldCkgeworCQl3cml0ZV9sb2NrKCZ2bWxpc3RfbG9jayk7CisJCWFyZWEgPSBfX2ZpbmRfdm1fYXJlYShyZXQpOworCQlhcmVhLT5mbGFncyB8PSBWTV9VU0VSTUFQOworCQl3cml0ZV91bmxvY2soJnZtbGlzdF9sb2NrKTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wodm1hbGxvY191c2VyKTsKQEAgLTU5OCwxMSArNjAzLDEyIEBACiAJdm9pZCAqcmV0OwogCiAJcmV0ID0gX192bWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBQQUdFX0tFUk5FTCk7Ci0Jd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOwotCWFyZWEgPSBfX2ZpbmRfdm1fYXJlYShyZXQpOwotCWFyZWEtPmZsYWdzIHw9IFZNX1VTRVJNQVA7Ci0Jd3JpdGVfdW5sb2NrKCZ2bWxpc3RfbG9jayk7Ci0KKwlpZiAocmV0KSB7CisJCXdyaXRlX2xvY2soJnZtbGlzdF9sb2NrKTsKKwkJYXJlYSA9IF9fZmluZF92bV9hcmVhKHJldCk7CisJCWFyZWEtPmZsYWdzIHw9IFZNX1VTRVJNQVA7CisJCXdyaXRlX3VubG9jaygmdm1saXN0X2xvY2spOworCX0KIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTCh2bWFsbG9jXzMyX3VzZXIpOwpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBlY2E3MDMxLi5lOTgxM2IwIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CkBAIC0zNzgsNiArMzc5LDEyIEBACiAJcmV0dXJuIFBBR0VfQ0xFQU47CiB9CiAKKy8qCisgKiBBdHRlbXB0IHRvIGRldGFjaCBhIGxvY2tlZCBwYWdlIGZyb20gaXRzIC0+bWFwcGluZy4gIElmIGl0IGlzIGRpcnR5IG9yIGlmCisgKiBzb21lb25lIGVsc2UgaGFzIGEgcmVmIG9uIHRoZSBwYWdlLCBhYm9ydCBhbmQgcmV0dXJuIDAuICBJZiBpdCB3YXMKKyAqIHN1Y2Nlc3NmdWxseSBkZXRhY2hlZCwgcmV0dXJuIDEuICBBc3N1bWVzIHRoZSBjYWxsZXIgaGFzIGEgc2luZ2xlIHJlZiBvbgorICogdGhpcyBwYWdlLgorICovCiBpbnQgcmVtb3ZlX21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBwYWdlICpwYWdlKQogewogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CkBAIC03MTcsNiArNzI0LDIwIEBACiAJcmV0dXJuIG5yX3JlY2xhaW1lZDsKIH0KIAorLyoKKyAqIFdlIGFyZSBhYm91dCB0byBzY2FuIHRoaXMgem9uZSBhdCBhIGNlcnRhaW4gcHJpb3JpdHkgbGV2ZWwuICBJZiB0aGF0IHByaW9yaXR5CisgKiBsZXZlbCBpcyBzbWFsbGVyIChpZTogbW9yZSB1cmdlbnQpIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGVuIG5vdGUKKyAqIHRoYXQgcHJpb3JpdHkgbGV2ZWwgd2l0aGluIHRoZSB6b25lLiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgd2hlbiB0aGUgbmV4dAorICogcHJvY2VzcyBjb21lcyBpbiB0byBzY2FuIHRoaXMgem9uZSwgaXQgd2lsbCBpbW1lZGlhdGVseSBzdGFydCBvdXQgYXQgdGhpcworICogcHJpb3JpdHkgbGV2ZWwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGJ1aWxkIHVwIGl0cyBvd24gc2Nhbm5pbmcgcHJpb3JpdHkuCisgKiBIZXJlLCB0aGlzIHByaW9yaXR5IGFmZmVjdHMgb25seSB0aGUgcmVjbGFpbS1tYXBwZWQgdGhyZXNob2xkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbm90ZV96b25lX3NjYW5uaW5nX3ByaW9yaXR5KHN0cnVjdCB6b25lICp6b25lLCBpbnQgcHJpb3JpdHkpCit7CisJaWYgKHByaW9yaXR5IDwgem9uZS0+cHJldl9wcmlvcml0eSkKKwkJem9uZS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OworfQorCiBzdGF0aWMgaW5saW5lIGludCB6b25lX2lzX25lYXJfb29tKHN0cnVjdCB6b25lICp6b25lKQogewogCXJldHVybiB6b25lLT5wYWdlc19zY2FubmVkID49ICh6b25lLT5ucl9hY3RpdmUgKyB6b25lLT5ucl9pbmFjdGl2ZSkqMzsKQEAgLTc0MCw3ICs3NjEsNyBAQAogICogQnV0IHdlIGhhZCB0byBhbHRlciBwYWdlLT5mbGFncyBhbnl3YXkuCiAgKi8KIHN0YXRpYyB2b2lkIHNocmlua19hY3RpdmVfbGlzdCh1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBzdHJ1Y3Qgem9uZSAqem9uZSwKLQkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKKwkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYywgaW50IHByaW9yaXR5KQogewogCXVuc2lnbmVkIGxvbmcgcGdtb3ZlZDsKIAlpbnQgcGdkZWFjdGl2YXRlID0gMDsKQEAgLTc2NCw3ICs3ODUsNyBAQAogCQkgKiBgZGlzdHJlc3MnIGlzIGEgbWVhc3VyZSBvZiBob3cgbXVjaCB0cm91YmxlIHdlJ3JlIGhhdmluZwogCQkgKiByZWNsYWltaW5nIHBhZ2VzLiAgMCAtPiBubyBwcm9ibGVtcy4gIDEwMCAtPiBncmVhdCB0cm91YmxlLgogCQkgKi8KLQkJZGlzdHJlc3MgPSAxMDAgPj4gem9uZS0+cHJldl9wcmlvcml0eTsKKwkJZGlzdHJlc3MgPSAxMDAgPj4gbWluKHpvbmUtPnByZXZfcHJpb3JpdHksIHByaW9yaXR5KTsKIAogCQkvKgogCQkgKiBUaGUgcG9pbnQgb2YgdGhpcyBhbGdvcml0aG0gaXMgdG8gZGVjaWRlIHdoZW4gdG8gc3RhcnQKQEAgLTkxNiw3ICs5MzcsNyBAQAogCQkJbnJfdG9fc2NhbiA9IG1pbihucl9hY3RpdmUsCiAJCQkJCSh1bnNpZ25lZCBsb25nKXNjLT5zd2FwX2NsdXN0ZXJfbWF4KTsKIAkJCW5yX2FjdGl2ZSAtPSBucl90b19zY2FuOwotCQkJc2hyaW5rX2FjdGl2ZV9saXN0KG5yX3RvX3NjYW4sIHpvbmUsIHNjKTsKKwkJCXNocmlua19hY3RpdmVfbGlzdChucl90b19zY2FuLCB6b25lLCBzYywgcHJpb3JpdHkpOwogCQl9CiAKIAkJaWYgKG5yX2luYWN0aXZlKSB7CkBAIC05NjMsMTIgKzk4NCwxMCBAQAogCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQogCQkJY29udGludWU7CiAKLQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIF9fR0ZQX0hBUkRXQUxMKSkKKwkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkX2hhcmR3YWxsKHpvbmUsIEdGUF9LRVJORUwpKQogCQkJY29udGludWU7CiAKLQkJem9uZS0+dGVtcF9wcmlvcml0eSA9IHByaW9yaXR5OwotCQlpZiAoem9uZS0+cHJldl9wcmlvcml0eSA+IHByaW9yaXR5KQotCQkJem9uZS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OworCQlub3RlX3pvbmVfc2Nhbm5pbmdfcHJpb3JpdHkoem9uZSwgcHJpb3JpdHkpOwogCiAJCWlmICh6b25lLT5hbGxfdW5yZWNsYWltYWJsZSAmJiBwcmlvcml0eSAhPSBERUZfUFJJT1JJVFkpCiAJCQljb250aW51ZTsJLyogTGV0IGtzd2FwZCBwb2xsIGl0ICovCkBAIC0xMDE1LDEwICsxMDM0LDkgQEAKIAlmb3IgKGkgPSAwOyB6b25lc1tpXSAhPSBOVUxMOyBpKyspIHsKIAkJc3RydWN0IHpvbmUgKnpvbmUgPSB6b25lc1tpXTsKIAotCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgX19HRlBfSEFSRFdBTEwpKQorCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoem9uZSwgR0ZQX0tFUk5FTCkpCiAJCQljb250aW51ZTsKIAotCQl6b25lLT50ZW1wX3ByaW9yaXR5ID0gREVGX1BSSU9SSVRZOwogCQlscnVfcGFnZXMgKz0gem9uZS0+bnJfYWN0aXZlICsgem9uZS0+bnJfaW5hY3RpdmU7CiAJfQogCkBAIC0xMDUzLDE5ICsxMDcxLDI4IEBACiAKIAkJLyogVGFrZSBhIG5hcCwgd2FpdCBmb3Igc29tZSB3cml0ZWJhY2sgdG8gY29tcGxldGUgKi8KIAkJaWYgKHNjLm5yX3NjYW5uZWQgJiYgcHJpb3JpdHkgPCBERUZfUFJJT1JJVFkgLSAyKQotCQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CiAJfQogCS8qIHRvcCBwcmlvcml0eSBzaHJpbmtfY2FjaGVzIHN0aWxsIGhhZCBtb3JlIHRvIGRvPyBkb24ndCBPT00sIHRoZW4gKi8KIAlpZiAoIXNjLmFsbF91bnJlY2xhaW1hYmxlKQogCQlyZXQgPSAxOwogb3V0OgorCS8qCisJICogTm93IHRoYXQgd2UndmUgc2Nhbm5lZCBhbGwgdGhlIHpvbmVzIGF0IHRoaXMgcHJpb3JpdHkgbGV2ZWwsIG5vdGUKKwkgKiB0aGF0IGxldmVsIHdpdGhpbiB0aGUgem9uZSBzbyB0aGF0IHRoZSBuZXh0IHRocmVhZCB3aGljaCBwZXJmb3JtcworCSAqIHNjYW5uaW5nIG9mIHRoaXMgem9uZSB3aWxsIGltbWVkaWF0ZWx5IHN0YXJ0IG91dCBhdCB0aGlzIHByaW9yaXR5CisJICogbGV2ZWwuICBUaGlzIGFmZmVjdHMgb25seSB0aGUgZGVjaXNpb24gd2hldGhlciBvciBub3QgdG8gYnJpbmcKKwkgKiBtYXBwZWQgcGFnZXMgb250byB0aGUgaW5hY3RpdmUgbGlzdC4KKwkgKi8KKwlpZiAocHJpb3JpdHkgPCAwKQorCQlwcmlvcml0eSA9IDA7CiAJZm9yIChpID0gMDsgem9uZXNbaV0gIT0gMDsgaSsrKSB7CiAJCXN0cnVjdCB6b25lICp6b25lID0gem9uZXNbaV07CiAKLQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIF9fR0ZQX0hBUkRXQUxMKSkKKwkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkX2hhcmR3YWxsKHpvbmUsIEdGUF9LRVJORUwpKQogCQkJY29udGludWU7CiAKLQkJem9uZS0+cHJldl9wcmlvcml0eSA9IHpvbmUtPnRlbXBfcHJpb3JpdHk7CisJCXpvbmUtPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTExMDUsNiArMTEzMiwxMSBAQAogCQkuc3dhcF9jbHVzdGVyX21heCA9IFNXQVBfQ0xVU1RFUl9NQVgsCiAJCS5zd2FwcGluZXNzID0gdm1fc3dhcHBpbmVzcywKIAl9OworCS8qCisJICogdGVtcF9wcmlvcml0eSBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBzY2FubmluZyBwcmlvcml0eSBhdCB3aGljaAorCSAqIHRoaXMgem9uZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlZmlsbGVkIHRvIGZyZWVfcGFnZXMgPT0gcGFnZXNfaGlnaC4KKwkgKi8KKwlpbnQgdGVtcF9wcmlvcml0eVtNQVhfTlJfWk9ORVNdOwogCiBsb29wX2FnYWluOgogCXRvdGFsX3NjYW5uZWQgPSAwOwpAQCAtMTExMiwxMSArMTE0NCw4IEBACiAJc2MubWF5X3dyaXRlcGFnZSA9ICFsYXB0b3BfbW9kZTsKIAljb3VudF92bV9ldmVudChQQUdFT1VUUlVOKTsKIAotCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bnJfem9uZXM7IGkrKykgewotCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKLQotCQl6b25lLT50ZW1wX3ByaW9yaXR5ID0gREVGX1BSSU9SSVRZOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgcGdkYXQtPm5yX3pvbmVzOyBpKyspCisJCXRlbXBfcHJpb3JpdHlbaV0gPSBERUZfUFJJT1JJVFk7CiAKIAlmb3IgKHByaW9yaXR5ID0gREVGX1BSSU9SSVRZOyBwcmlvcml0eSA+PSAwOyBwcmlvcml0eS0tKSB7CiAJCWludCBlbmRfem9uZSA9IDA7CS8qIEluY2x1c2l2ZS4gIDAgPSBaT05FX0RNQSAqLwpAQCAtMTE0NCwxMSArMTE3MywxMiBAQAogCQkJaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwgem9uZS0+cGFnZXNfaGlnaCwKIAkJCQkJICAgICAgIDAsIDApKSB7CiAJCQkJZW5kX3pvbmUgPSBpOwotCQkJCWdvdG8gc2NhbjsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQotCQlnb3RvIG91dDsKLXNjYW46CisJCWlmIChpIDwgMCkKKwkJCWdvdG8gb3V0OworCiAJCWZvciAoaSA9IDA7IGkgPD0gZW5kX3pvbmU7IGkrKykgewogCQkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7CiAKQEAgLTExNzcsMTAgKzEyMDcsOSBAQAogCQkJaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwgem9uZS0+cGFnZXNfaGlnaCwKIAkJCQkJICAgICAgIGVuZF96b25lLCAwKSkKIAkJCQlhbGxfem9uZXNfb2sgPSAwOwotCQkJem9uZS0+dGVtcF9wcmlvcml0eSA9IHByaW9yaXR5OwotCQkJaWYgKHpvbmUtPnByZXZfcHJpb3JpdHkgPiBwcmlvcml0eSkKLQkJCQl6b25lLT5wcmV2X3ByaW9yaXR5ID0gcHJpb3JpdHk7CisJCQl0ZW1wX3ByaW9yaXR5W2ldID0gcHJpb3JpdHk7CiAJCQlzYy5ucl9zY2FubmVkID0gMDsKKwkJCW5vdGVfem9uZV9zY2FubmluZ19wcmlvcml0eSh6b25lLCBwcmlvcml0eSk7CiAJCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsICZzYyk7CiAJCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7CiAJCQlucl9zbGFiID0gc2hyaW5rX3NsYWIoc2MubnJfc2Nhbm5lZCwgR0ZQX0tFUk5FTCwKQEAgLTEyMDgsNyArMTIzNyw3IEBACiAJCSAqIGFub3RoZXIgcGFzcyBhY3Jvc3MgdGhlIHpvbmVzLgogCQkgKi8KIAkJaWYgKHRvdGFsX3NjYW5uZWQgJiYgcHJpb3JpdHkgPCBERUZfUFJJT1JJVFkgLSAyKQotCQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CiAKIAkJLyoKIAkJICogV2UgZG8gdGhpcyBzbyBrc3dhcGQgZG9lc24ndCBidWlsZCB1cCBsYXJnZSBwcmlvcml0aWVzIGZvcgpAQCAtMTIyMCwxMyArMTI0OSwyMSBAQAogCQkJYnJlYWs7CiAJfQogb3V0OgorCS8qCisJICogTm90ZSB3aXRoaW4gZWFjaCB6b25lIHRoZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB0aGlzIHpvbmUgd2FzCisJICogYnJvdWdodCBpbnRvIGEgaGFwcHkgc3RhdGUuICBTbyB0aGF0IHRoZSBuZXh0IHRocmVhZCB3aGljaCBzY2FucyB0aGlzCisJICogem9uZSB3aWxsIHN0YXJ0IG91dCBhdCB0aGF0IHByaW9yaXR5IGxldmVsLgorCSAqLwogCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bnJfem9uZXM7IGkrKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKIAotCQl6b25lLT5wcmV2X3ByaW9yaXR5ID0gem9uZS0+dGVtcF9wcmlvcml0eTsKKwkJem9uZS0+cHJldl9wcmlvcml0eSA9IHRlbXBfcHJpb3JpdHlbaV07CiAJfQogCWlmICghYWxsX3pvbmVzX29rKSB7CiAJCWNvbmRfcmVzY2hlZCgpOworCisJCXRyeV90b19mcmVlemUoKTsKKwogCQlnb3RvIGxvb3BfYWdhaW47CiAJfQogCkBAIC0xMzE3LDcgKzEzNTQsNyBAQAogCQlyZXR1cm47CiAJaWYgKHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyIDwgb3JkZXIpCiAJCXBnZGF0LT5rc3dhcGRfbWF4X29yZGVyID0gb3JkZXI7Ci0JaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkKHpvbmUsIF9fR0ZQX0hBUkRXQUxMKSkKKwlpZiAoIWNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoem9uZSwgR0ZQX0tFUk5FTCkpCiAJCXJldHVybjsKIAlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJnBnZGF0LT5rc3dhcGRfd2FpdCkpCiAJCXJldHVybjsKQEAgLTEzNTIsNyArMTM4OSw3IEBACiAJCQlpZiAoem9uZS0+bnJfc2Nhbl9hY3RpdmUgPj0gbnJfcGFnZXMgfHwgcGFzcyA+IDMpIHsKIAkJCQl6b25lLT5ucl9zY2FuX2FjdGl2ZSA9IDA7CiAJCQkJbnJfdG9fc2NhbiA9IG1pbihucl9wYWdlcywgem9uZS0+bnJfYWN0aXZlKTsKLQkJCQlzaHJpbmtfYWN0aXZlX2xpc3QobnJfdG9fc2Nhbiwgem9uZSwgc2MpOworCQkJCXNocmlua19hY3RpdmVfbGlzdChucl90b19zY2FuLCB6b25lLCBzYywgcHJpbyk7CiAJCQl9CiAJCX0KIApAQCAtMTQ1Miw3ICsxNDg5LDcgQEAKIAkJCQlnb3RvIG91dDsKIAogCQkJaWYgKHNjLm5yX3NjYW5uZWQgJiYgcHJpbyA8IERFRl9QUklPUklUWSAtIDIpCi0JCQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFogLyAxMCk7CisJCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWiAvIDEwKTsKIAkJfQogCiAJCWxydV9wYWdlcyA9IDA7CkBAIC0xNDc2LDcgKzE1MTMsNiBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIC8qIEl0J3Mgb3B0aW1hbCB0byBrZWVwIGtzd2FwZHMgb24gdGhlIHNhbWUgQ1BVcyBhcyB0aGVpciBtZW1vcnksIGJ1dAogICAgbm90IHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcy4gIFNvIGlmIHRoZSBsYXN0IGNwdSBpbiBhIG5vZGUgZ29lcwogICAgYXdheSwgd2UgZ2V0IGNoYW5nZWQgdG8gcnVuIGFueXdoZXJlOiBhcyB0aGUgZmlyc3Qgb25lIGNvbWVzIGJhY2ssCkBAIC0xNDk3LDcgKzE1MzMsNiBAQAogCX0KIAlyZXR1cm4gTk9USUZZX09LOwogfQotI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiAvKgogICogVGhpcyBrc3dhcGQgc3RhcnQgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgaW5pdCBhbmQgbm9kZS1ob3QtYWRkLgpAQCAtMTYwOCw2ICsxNjQzLDcgQEAKIAkJICovCiAJCXByaW9yaXR5ID0gWk9ORV9SRUNMQUlNX1BSSU9SSVRZOwogCQlkbyB7CisJCQlub3RlX3pvbmVfc2Nhbm5pbmdfcHJpb3JpdHkoem9uZSwgcHJpb3JpdHkpOwogCQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOwogCQkJcHJpb3JpdHktLTsKIAkJfSB3aGlsZSAocHJpb3JpdHkgPj0gMCAmJiBucl9yZWNsYWltZWQgPCBucl9wYWdlcyk7CmRpZmYgLS1naXQgYS9tbS92bXN0YXQuYyBiL21tL3Ztc3RhdC5jCmluZGV4IDQ1YjEyNGUuLmRjMDA1YTAgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5jCkBAIC00MzAsNyArNDMwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHNlcV9vcGVyYXRpb25zIGZyYWdtZW50YXRpb25fb3AgPSB7Citjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZnJhZ21lbnRhdGlvbl9vcCA9IHsKIAkuc3RhcnQJPSBmcmFnX3N0YXJ0LAogCS5uZXh0CT0gZnJhZ19uZXh0LAogCS5zdG9wCT0gZnJhZ19zdG9wLApAQCAtNDUyLDcgKzQ1Miw3IEBACiAjZGVmaW5lIFRFWFRTX0ZPUl9aT05FUyh4eCkgeHggIl9kbWEiLCBURVhUX0ZPUl9ETUEzMih4eCkgeHggIl9ub3JtYWwiLCBcCiAJCQkJCVRFWFRfRk9SX0hJR0hNRU0oeHgpCiAKLXN0YXRpYyBjaGFyICp2bXN0YXRfdGV4dFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXN0YXRfdGV4dFtdID0gewogCS8qIFpvbmVkIFZNIGNvdW50ZXJzICovCiAJIm5yX2Fub25fcGFnZXMiLAogCSJucl9tYXBwZWQiLApAQCAtNTg3LDExICs1ODcsOSBAQAogCQlzZXFfcHJpbnRmKG0sCiAJCQkgICAiXG4gIGFsbF91bnJlY2xhaW1hYmxlOiAldSIKIAkJCSAgICJcbiAgcHJldl9wcmlvcml0eTogICAgICVpIgotCQkJICAgIlxuICB0ZW1wX3ByaW9yaXR5OiAgICAgJWkiCiAJCQkgICAiXG4gIHN0YXJ0X3BmbjogICAgICAgICAlbHUiLAogCQkJICAgem9uZS0+YWxsX3VucmVjbGFpbWFibGUsCiAJCQkgICB6b25lLT5wcmV2X3ByaW9yaXR5LAotCQkJICAgem9uZS0+dGVtcF9wcmlvcml0eSwKIAkJCSAgIHpvbmUtPnpvbmVfc3RhcnRfcGZuKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+bG9jaywgZmxhZ3MpOwogCQlzZXFfcHV0YyhtLCAnXG4nKTsKQEAgLTU5OSw3ICs1OTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgem9uZWluZm9fb3AgPSB7Citjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgem9uZWluZm9fb3AgPSB7CiAJLnN0YXJ0CT0gZnJhZ19zdGFydCwgLyogaXRlcmF0ZSBvdmVyIGFsbCB6b25lcy4gVGhlIHNhbWUgYXMgaW4KIAkJCSAgICAgICAqIGZyYWdtZW50YXRpb24uICovCiAJLm5leHQJPSBmcmFnX25leHQsCkBAIC02NjIsNyArNjYwLDcgQEAKIAltLT5wcml2YXRlID0gTlVMTDsKIH0KIAotc3RydWN0IHNlcV9vcGVyYXRpb25zIHZtc3RhdF9vcCA9IHsKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB2bXN0YXRfb3AgPSB7CiAJLnN0YXJ0CT0gdm1zdGF0X3N0YXJ0LAogCS5uZXh0CT0gdm1zdGF0X25leHQsCiAJLnN0b3AJPSB2bXN0YXRfc3RvcCwKQEAgLTY4MSwxMyArNjc5LDEzIEBACiAJCXZvaWQgKmhjcHUpCiB7CiAJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBDUFVfVVBfUFJFUEFSRToKLQkJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JCWNhc2UgQ1BVX0RFQUQ6Ci0JCQlyZWZyZXNoX3pvbmVfc3RhdF90aHJlc2hvbGRzKCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CisJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJY2FzZSBDUFVfREVBRDoKKwkJcmVmcmVzaF96b25lX3N0YXRfdGhyZXNob2xkcygpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KZGlmZiAtLWdpdCBhL25ldC84MDIvaGlwcGkuYyBiL25ldC84MDIvaGlwcGkuYwppbmRleCA2ZDdmZWQzLi41NzllMmRkIDEwMDY0NAotLS0gYS9uZXQvODAyL2hpcHBpLmMKKysrIGIvbmV0LzgwMi9oaXBwaS5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bmV0L2FycC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IGE4MWFjYTQuLjdkZmM5NDkgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC02Myw2ICs2Myw3IEBACiBpZiBJTkVUCiBzb3VyY2UgIm5ldC9pcHY0L0tjb25maWciCiBzb3VyY2UgIm5ldC9pcHY2L0tjb25maWciCitzb3VyY2UgIm5ldC9uZXRsYWJlbC9LY29uZmlnIgogCiBlbmRpZiAjIGlmIElORVQKIApAQCAtNzQsNyArNzUsNyBAQAogCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KIAogbWVudWNvbmZpZyBORVRGSUxURVIKLQlib29sICJOZXR3b3JrIHBhY2tldCBmaWx0ZXJpbmcgKHJlcGxhY2VzIGlwY2hhaW5zKSIKKwlib29sICJOZXR3b3JrIHBhY2tldCBmaWx0ZXJpbmcgZnJhbWV3b3JrIChOZXRmaWx0ZXIpIgogCS0tLWhlbHAtLS0KIAkgIE5ldGZpbHRlciBpcyBhIGZyYW1ld29yayBmb3IgZmlsdGVyaW5nIGFuZCBtYW5nbGluZyBuZXR3b3JrIHBhY2tldHMKIAkgIHRoYXQgcGFzcyB0aHJvdWdoIHlvdXIgTGludXggYm94LgpAQCAtMTc0LDMzICsxNzUsNiBAQAogc291cmNlICJkcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3gyNS9LY29uZmlnIgogc291cmNlICJuZXQvbGFwYi9LY29uZmlnIgotCi1jb25maWcgTkVUX0RJVkVSVAotCWJvb2wgIkZyYW1lIERpdmVydGVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIEJST0tFTgotCS0tLWhlbHAtLS0KLQkgIFRoZSBGcmFtZSBEaXZlcnRlciBhbGxvd3MgeW91IHRvIGRpdmVydCBwYWNrZXRzIGZyb20gdGhlCi0JICBuZXR3b3JrLCB0aGF0IGFyZSBub3QgYWltZWQgYXQgdGhlIGludGVyZmFjZSByZWNlaXZpbmcgaXQgKGluCi0JICBwcm9taXNjLiBtb2RlKS4gVHlwaWNhbGx5LCBhIExpbnV4IGJveCBzZXR1cCBhcyBhbiBFdGhlcm5ldCBicmlkZ2UKLQkgIHdpdGggdGhlIEZyYW1lcyBEaXZlcnRlciBvbiwgY2FuIGRvIHNvbWUgKnJlYWxseSogdHJhbnNwYXJlbnQgd3d3Ci0JICBjYWNoaW5nIHVzaW5nIGEgU3F1aWQgcHJveHkgZm9yIGV4YW1wbGUuCi0KLQkgIFRoaXMgaXMgdmVyeSB1c2VmdWwgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgeW91ciByb3V0ZXIncwotCSAgY29uZmlnIChvciBpZiB5b3Ugc2ltcGx5IGRvbid0IGhhdmUgYWNjZXNzIHRvIGl0KS4KLQotCSAgVGhlIG90aGVyIHBvc3NpYmxlIHVzYWdlcyBvZiBkaXZlcnRpbmcgRXRoZXJuZXQgRnJhbWVzIGFyZQotCSAgbnVtYmVyb3VzOgotCSAgLSByZXJvdXRlIHNtdHAgdHJhZmZpYyB0byBhbm90aGVyIGludGVyZmFjZQotCSAgLSB0cmFmZmljLXNoYXBlIGNlcnRhaW4gbmV0d29yayBzdHJlYW1zCi0JICAtIHRyYW5zcGFyZW50bHkgcHJveHkgc210cCBjb25uZWN0aW9ucwotCSAgLSBldGMuLi4KLQotCSAgRm9yIG1vcmUgaW5mb3JtYXRpb25zLCBwbGVhc2UgcmVmZXIgdG86Ci0JICA8aHR0cDovL2RpdmVydGVyLnNvdXJjZWZvcmdlLm5ldC8+Ci0JICA8aHR0cDovL3BlcnNvLndhbmFkb28uZnIvbWFncGllL0V0aGVyRGl2ZXJ0Lmh0bWw+Ci0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIHNvdXJjZSAibmV0L2Vjb25ldC9LY29uZmlnIgogc291cmNlICJuZXQvd2Fucm91dGVyL0tjb25maWciCiBzb3VyY2UgIm5ldC9zY2hlZC9LY29uZmlnIgpAQCAtMjQ5LDggKzIyMyw2IEBACiBjb25maWcgV0lSRUxFU1NfRVhUCiAJYm9vbAogCi1zb3VyY2UgIm5ldC9uZXRsYWJlbC9LY29uZmlnIgotCiBjb25maWcgRklCX1JVTEVTCiAJYm9vbAogCmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL2RkcC5jIGIvbmV0L2FwcGxldGFsay9kZHAuYwppbmRleCA3MDhlMmUwLi4zYTcwNTIyIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2RkcC5jCisrKyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwX3N0YXRlcy5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CisjaW5jbHVkZSAiLi4vY29yZS9rbWFwX3NrYi5oIgogCiBzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKmRkcF9kbCwgKmFhcnBfZGw7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBhdGFsa19kZ3JhbV9vcHM7CkBAIC0xNTg0LDcgKzE1ODUsNiBAQAogCiAJaWYgKHVzYXQtPnNhdF9hZGRyLnNfbmV0IHx8IHVzYXQtPnNhdF9hZGRyLnNfbm9kZSA9PSBBVEFERFJfQU5ZTk9ERSkgewogCQlydCA9IGF0cnRyX2ZpbmQoJnVzYXQtPnNhdF9hZGRyKTsKLQkJZGV2ID0gcnQtPmRldjsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgYXRhbGtfYWRkciBhdF9oaW50OwogCkBAIC0xNTkyLDcgKzE1OTIsNiBAQAogCQlhdF9oaW50LnNfbmV0ICA9IGF0LT5zcmNfbmV0OwogCiAJCXJ0ID0gYXRydHJfZmluZCgmYXRfaGludCk7Ci0JCWRldiA9IHJ0LT5kZXY7CiAJfQogCWlmICghcnQpCiAJCXJldHVybiAtRU5FVFVOUkVBQ0g7CmRpZmYgLS1naXQgYS9uZXQvYXRtL01ha2VmaWxlIGIvbmV0L2F0bS9NYWtlZmlsZQppbmRleCA4OTY1NmQ2Li5jYzUwYmQxIDEwMDY0NAotLS0gYS9uZXQvYXRtL01ha2VmaWxlCisrKyBiL25ldC9hdG0vTWFrZWZpbGUKQEAgLTcsMTAgKzcsNyBAQAogCiBvYmotJChDT05GSUdfQVRNKSArPSBhdG0ubwogb2JqLSQoQ09ORklHX0FUTV9DTElQKSArPSBjbGlwLm8KLWF0bS0kKHN1YnN0IG0seSwkKENPTkZJR19BVE1fQ0xJUCkpICs9IGlwY29tbW9uLm8KIG9iai0kKENPTkZJR19BVE1fQlIyNjg0KSArPSBicjI2ODQubwotYXRtLSQoc3Vic3QgbSx5LCQoQ09ORklHX0FUTV9CUjI2ODQpKSArPSBpcGNvbW1vbi5vCi1hdG0tJChzdWJzdCBtLHksJChDT05GSUdfTkVUX1NDSF9BVE0pKSArPSBpcGNvbW1vbi5vCiBhdG0tJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiAKIG9iai0kKENPTkZJR19BVE1fTEFORSkgKz0gbGVjLm8KZGlmZiAtLWdpdCBhL25ldC9hdG0vYXRtX3N5c2ZzLmMgYi9uZXQvYXRtL2F0bV9zeXNmcy5jCmluZGV4IGMwYTRhZTIuLjYyZjZlZDEgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vYXRtX3N5c2ZzLmMKKysrIGIvbmV0L2F0bS9hdG1fc3lzZnMuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiBpbnQgYXRtX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBhdG1fZGV2ICphZGV2KQogewogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPSAmYWRldi0+Y2xhc3NfZGV2OwotCWludCBpLCBlcnI7CisJaW50IGksIGosIGVycjsKIAogCWNkZXYtPmNsYXNzID0gJmF0bV9jbGFzczsKIAljbGFzc19zZXRfZGV2ZGF0YShjZGV2LCBhZGV2KTsKQEAgLTE1MSwxMCArMTUxLDE5IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlmb3IgKGkgPSAwOyBhdG1fYXR0cnNbaV07IGkrKykKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNkZXYsIGF0bV9hdHRyc1tpXSk7CisJZm9yIChpID0gMDsgYXRtX2F0dHJzW2ldOyBpKyspIHsKKwkJZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNkZXYsIGF0bV9hdHRyc1tpXSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisJfQogCiAJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNkZXYsIGF0bV9hdHRyc1tqXSk7CisJY2xhc3NfZGV2aWNlX2RlbChjZGV2KTsKKwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIGF0bV91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBhdG1fZGV2ICphZGV2KQpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9icjI2ODQuYyBiL25ldC9hdG0vYnIyNjg0LmMKaW5kZXggZDAwY2NhOS4uODNhMWMxYiAxMDA2NDQKLS0tIGEvbmV0L2F0bS9icjI2ODQuYworKysgYi9uZXQvYXRtL2JyMjY4NC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvYXRtYnIyNjg0Lmg+CiAKICNpbmNsdWRlICJjb21tb24uaCIKLSNpbmNsdWRlICJpcGNvbW1vbi5oIgogCiAvKgogICogRGVmaW5lIHRoaXMgdG8gdXNlIGEgdmVyc2lvbiBvZiB0aGUgY29kZSB3aGljaCBpbnRlcmFjdHMgd2l0aCB0aGUgaGlnaGVyCkBAIC0zNzIsNyArMzcxLDcgQEAKIAogLyogUmV0dXJucyAxIGlmIHBhY2tldCBzaG91bGQgYmUgZHJvcHBlZCAqLwogc3RhdGljIGlubGluZSBpbnQKLXBhY2tldF9mYWlsc19maWx0ZXIodTE2IHR5cGUsIHN0cnVjdCBicjI2ODRfdmNjICpicnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3BhY2tldF9mYWlsc19maWx0ZXIoX19iZTE2IHR5cGUsIHN0cnVjdCBicjI2ODRfdmNjICpicnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoYnJ2Y2MtPmZpbHRlci5uZXRtYXNrID09IDApCiAJCXJldHVybiAwOwkJCS8qIG5vIGZpbHRlciBpbiBwbGFjZSAqLwpAQCAtNTAwLDExICs0OTksMTIgQEAKICovCiAJaW50IGVycjsKIAlzdHJ1Y3QgYnIyNjg0X3ZjYyAqYnJ2Y2M7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBjb3B5OwogCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcnE7CiAJc3RydWN0IGJyMjY4NF9kZXYgKmJyZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OwogCXN0cnVjdCBhdG1fYmFja2VuZF9icjI2ODQgYmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmYmUsIGFyZywgc2l6ZW9mIGJlKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC01NTQsMTIgKzU1NCwzMCBAQAogCWJydmNjLT5vbGRfcHVzaCA9IGF0bXZjYy0+cHVzaDsKIAliYXJyaWVyKCk7CiAJYXRtdmNjLT5wdXNoID0gYnIyNjg0X3B1c2g7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY29weSk7Ci0Jc2tiX21pZ3JhdGUoJnNrX2F0bShhdG12Y2MpLT5za19yZWNlaXZlX3F1ZXVlLCAmY29weSk7Ci0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY29weSkpICE9IE5VTEwpIHsKKworCXJxID0gJnNrX2F0bShhdG12Y2MpLT5za19yZWNlaXZlX3F1ZXVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJxLT5sb2NrLCBmbGFncyk7CisJaWYgKHNrYl9xdWV1ZV9lbXB0eShycSkpIHsKKwkJc2tiID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgbGlzdC4gICovCisJCXJxLT5wcmV2LT5uZXh0ID0gTlVMTDsKKwkJc2tiID0gcnEtPm5leHQ7CisJfQorCXJxLT5wcmV2ID0gcnEtPm5leHQgPSAoc3RydWN0IHNrX2J1ZmYgKilycTsKKwlycS0+cWxlbiA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlIChza2IpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBza2ItPm5leHQ7CisKKwkJc2tiLT5uZXh0ID0gc2tiLT5wcmV2ID0gTlVMTDsKIAkJQlJQUklWKHNrYi0+ZGV2KS0+c3RhdHMucnhfYnl0ZXMgLT0gc2tiLT5sZW47CiAJCUJSUFJJVihza2ItPmRldiktPnN0YXRzLnJ4X3BhY2tldHMtLTsKIAkJYnIyNjg0X3B1c2goYXRtdmNjLCBza2IpOworCisJCXNrYiA9IG5leHQ7CiAJfQogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2NsaXAuYyBiL25ldC9hdG0vY2xpcC5jCmluZGV4IDdhZjJjNDEuLjVmOGExZDIgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY2xpcC5jCisrKyBiL25ldC9hdG0vY2xpcC5jCkBAIC0zOCw3ICszOCw2IEBACiAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJyZXNvdXJjZXMuaCIKLSNpbmNsdWRlICJpcGNvbW1vbi5oIgogI2luY2x1ZGUgPG5ldC9hdG1jbGlwLmg+CiAKIApAQCAtNTQsNyArNTMsNyBAQAogc3RhdGljIHN0cnVjdCBuZWlnaF90YWJsZSBjbGlwX3RibDsKIHN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBpZGxlX3RpbWVyOwogCi1zdGF0aWMgaW50IHRvX2F0bWFycGQoZW51bSBhdG1hcnBfY3RybF90eXBlIHR5cGUsIGludCBpdGYsIHVuc2lnbmVkIGxvbmcgaXApCitzdGF0aWMgaW50IHRvX2F0bWFycGQoZW51bSBhdG1hcnBfY3RybF90eXBlIHR5cGUsIGludCBpdGYsIF9fYmUzMiBpcCkKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJc3RydWN0IGF0bWFycF9jdHJsICpjdHJsOwpAQCAtMjIwLDcgKzIxOSw3IEBACiAJICAgIHx8IG1lbWNtcChza2ItPmRhdGEsIGxsY19vdWksIHNpemVvZiAobGxjX291aSkpKQogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCWVsc2UgewotCQlza2ItPnByb3RvY29sID0gKCh1MTYgKikgc2tiLT5kYXRhKVszXTsKKwkJc2tiLT5wcm90b2NvbCA9ICgoX19iZTE2ICopIHNrYi0+ZGF0YSlbM107CiAJCXNrYl9wdWxsKHNrYiwgUkZDMTQ4M0xMQ19MRU4pOwogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApKSB7CiAJCQlQUklWKHNrYi0+ZGV2KS0+c3RhdHMucnhfcGFja2V0cysrOwpAQCAtNDMwLDcgKzQyOSw3IEBACiAKIAkJaGVyZSA9IHNrYl9wdXNoKHNrYiwgUkZDMTQ4M0xMQ19MRU4pOwogCQltZW1jcHkoaGVyZSwgbGxjX291aSwgc2l6ZW9mKGxsY19vdWkpKTsKLQkJKCh1MTYgKikgaGVyZSlbM10gPSBza2ItPnByb3RvY29sOworCQkoKF9fYmUxNiAqKSBoZXJlKVszXSA9IHNrYi0+cHJvdG9jb2w7CiAJfQogCWF0b21pY19hZGQoc2tiLT50cnVlc2l6ZSwgJnNrX2F0bSh2Y2MpLT5za193bWVtX2FsbG9jKTsKIAlBVE1fU0tCKHNrYiktPmF0bV9vcHRpb25zID0gdmNjLT5hdG1fb3B0aW9uczsKQEAgLTQ2OSw4ICs0NjgsOSBAQAogc3RhdGljIGludCBjbGlwX21raXAoc3RydWN0IGF0bV92Y2MgKnZjYywgaW50IHRpbWVvdXQpCiB7CiAJc3RydWN0IGNsaXBfdmNjICpjbGlwX3ZjYzsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGNvcHk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCF2Y2MtPnB1c2gpCiAJCXJldHVybiAtRUJBREZEOwpAQCAtNDkwLDEwICs0OTAsMjYgQEAKIAljbGlwX3ZjYy0+b2xkX3BvcCA9IHZjYy0+cG9wOwogCXZjYy0+cHVzaCA9IGNsaXBfcHVzaDsKIAl2Y2MtPnBvcCA9IGNsaXBfcG9wOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvcHkpOwotCXNrYl9taWdyYXRlKCZza19hdG0odmNjKS0+c2tfcmVjZWl2ZV9xdWV1ZSwgJmNvcHkpOworCisJcnEgPSAmc2tfYXRtKHZjYyktPnNrX3JlY2VpdmVfcXVldWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnEtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KHJxKSkgeworCQlza2IgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIE5VTEwgdGVybWluYXRlIHRoZSBsaXN0LiAgKi8KKwkJcnEtPnByZXYtPm5leHQgPSBOVUxMOworCQlza2IgPSBycS0+bmV4dDsKKwl9CisJcnEtPnByZXYgPSBycS0+bmV4dCA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXJxOworCXJxLT5xbGVuID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycS0+bG9jaywgZmxhZ3MpOworCiAJLyogcmUtcHJvY2VzcyBldmVyeXRoaW5nIHJlY2VpdmVkIGJldHdlZW4gY29ubmVjdGlvbiBzZXR1cCBhbmQgTUtJUCAqLwotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNvcHkpKSAhPSBOVUxMKQorCXdoaWxlIChza2IpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBza2ItPm5leHQ7CisKKwkJc2tiLT5uZXh0ID0gc2tiLT5wcmV2ID0gTlVMTDsKIAkJaWYgKCFjbGlwX2RldnMpIHsKIAkJCWF0bV9yZXR1cm4odmNjLCBza2ItPnRydWVzaXplKTsKIAkJCWtmcmVlX3NrYihza2IpOwpAQCAtNTA2LDEwICs1MjIsMTMgQEAKIAkJCVBSSVYoc2tiLT5kZXYpLT5zdGF0cy5yeF9ieXRlcyAtPSBsZW47CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJfQorCisJCXNrYiA9IG5leHQ7CisJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNsaXBfc2V0ZW50cnkoc3RydWN0IGF0bV92Y2MgKnZjYywgdTMyIGlwKQorc3RhdGljIGludCBjbGlwX3NldGVudHJ5KHN0cnVjdCBhdG1fdmNjICp2Y2MsIF9fYmUzMiBpcCkKIHsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKIAlzdHJ1Y3QgYXRtYXJwX2VudHJ5ICplbnRyeTsKQEAgLTc1Miw3ICs3NzEsNyBAQAogCQllcnIgPSBjbGlwX21raXAodmNjLCBhcmcpOwogCQlicmVhazsKIAljYXNlIEFUTUFSUF9TRVRFTlRSWToKLQkJZXJyID0gY2xpcF9zZXRlbnRyeSh2Y2MsIGFyZyk7CisJCWVyciA9IGNsaXBfc2V0ZW50cnkodmNjLCAoX19mb3JjZSBfX2JlMzIpYXJnKTsKIAkJYnJlYWs7CiAJY2FzZSBBVE1BUlBfRU5DQVA6CiAJCWVyciA9IGNsaXBfZW5jYXAodmNjLCBhcmcpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9pcGNvbW1vbi5jIGIvbmV0L2F0bS9pcGNvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDNkZTQyLi4wMDAwMDAwCi0tLSBhL25ldC9hdG0vaXBjb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIG5ldC9hdG0vaXBjb21tb24uYyAtIENvbW1vbiBpdGVtcyBmb3IgYWxsIHdheXMgb2YgZG9pbmcgSVAgb3ZlciBBVE0gKi8KLQotLyogV3JpdHRlbiAxOTk2LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KLQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG1jbGlwLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLSNpbmNsdWRlICJpcGNvbW1vbi5oIgotCi0KLSNpZiAwCi0jZGVmaW5lIERQUklOVEsoZm9ybWF0LGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCwjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBEUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQotI2VuZGlmCi0KLQotLyoKLSAqIHNrYl9taWdyYXRlIGFwcGVuZHMgdGhlIGxpc3QgYXQgImZyb20iIHRvICJ0byIsIGVtcHR5aW5nICJmcm9tIiBpbiB0aGUKLSAqIHByb2Nlc3MuIHNrYl9taWdyYXRlIGlzIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gYWxsIG90aGVyIHNrYiBvcGVyYXRpb25zIG9uCi0gKiAiZnJvbSIgYW5kICJ0byIuIE5vdGUgdGhhdCBpdCBsb2NrcyBib3RoIGxpc3RzIGF0IHRoZSBzYW1lIHRpbWUsIHNvIHRvIGRlYWwKLSAqIHdpdGggdGhlIGxvY2sgb3JkZXJpbmcsIHRoZSBsb2NrcyBhcmUgdGFrZW4gaW4gYWRkcmVzcyBvcmRlci4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBsaXZlIGluIHNrYnVmZi5jIG9yIHNrYnVmZi5oLgotICovCi0KLQotdm9pZCBza2JfbWlncmF0ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpmcm9tLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp0bykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBza19idWZmICpza2JfZnJvbSA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBmcm9tOwotCXN0cnVjdCBza19idWZmICpza2JfdG8gPSAoc3RydWN0IHNrX2J1ZmYgKikgdG87Ci0Jc3RydWN0IHNrX2J1ZmYgKnByZXY7Ci0KLQlpZiAoKHVuc2lnbmVkIGxvbmcpIGZyb20gPCAodW5zaWduZWQgbG9uZykgdG8pIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZyb20tPmxvY2ssIGZsYWdzKTsKLQkJc3Bpbl9sb2NrX25lc3RlZCgmdG8tPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdG8tPmxvY2ssIGZsYWdzKTsKLQkJc3Bpbl9sb2NrX25lc3RlZCgmZnJvbS0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwotCX0KLQlwcmV2ID0gZnJvbS0+cHJldjsKLQlmcm9tLT5uZXh0LT5wcmV2ID0gdG8tPnByZXY7Ci0JcHJldi0+bmV4dCA9IHNrYl90bzsKLQl0by0+cHJldi0+bmV4dCA9IGZyb20tPm5leHQ7Ci0JdG8tPnByZXYgPSBmcm9tLT5wcmV2OwotCXRvLT5xbGVuICs9IGZyb20tPnFsZW47Ci0Jc3Bpbl91bmxvY2soJnRvLT5sb2NrKTsKLQlmcm9tLT5wcmV2ID0gc2tiX2Zyb207Ci0JZnJvbS0+bmV4dCA9IHNrYl9mcm9tOwotCWZyb20tPnFsZW4gPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyb20tPmxvY2ssIGZsYWdzKTsKLX0KLQotCi1FWFBPUlRfU1lNQk9MKHNrYl9taWdyYXRlKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vaXBjb21tb24uaCBiL25ldC9hdG0vaXBjb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyMTY1Zi4uMDAwMDAwMAotLS0gYS9uZXQvYXRtL2lwY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBuZXQvYXRtL2lwY29tbW9uLmggLSBDb21tb24gaXRlbXMgZm9yIGFsbCB3YXlzIG9mIGRvaW5nIElQIG92ZXIgQVRNICovCi0KLS8qIFdyaXR0ZW4gMTk5Ni0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCi0KLQotI2lmbmRlZiBORVRfQVRNX0lQQ09NTU9OX0gKLSNkZWZpbmUgTkVUX0FUTV9JUENPTU1PTl9ICi0KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgotCi0vKgotICogQXBwZW5kcyBhbGwgc2ticyBmcm9tICJmcm9tIiB0byAidG8iLiBUaGUgb3BlcmF0aW9uIGlzIGF0b21pYyB3aXRoIHJlc3BlY3QKLSAqIHRvIGFsbCBvdGhlciBza2Igb3BlcmF0aW9ucyBvbiAiZnJvbSIgb3IgInRvIi4KLSAqLwotCi12b2lkIHNrYl9taWdyYXRlKHN0cnVjdCBza19idWZmX2hlYWQgKmZyb20sc3RydWN0IHNrX2J1ZmZfaGVhZCAqdG8pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9hdG0vbGVjLmMgYi9uZXQvYXRtL2xlYy5jCmluZGV4IDY2YzU3YzEuLjNmYzBhYmUgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbGVjLmMKKysrIGIvbmV0L2F0bS9sZWMuYwpAQCAtMjA0LDkgKzIwNCw5IEBACiAJbWVtc2V0KHJkZXNjLCAwLCBFVEhfQUxFTik7CiAJLyogb2Zmc2V0IDQgY29tZXMgZnJvbSBMQU4gZGVzdGluYXRpb24gZmllbGQgaW4gTEUgY29udHJvbCBmcmFtZXMgKi8KIAlpZiAodHJoLT5yY2YgJiBodG9ucygodWludDE2X3QpIFRSX1JDRl9ESVJfQklUKSkKLQkJbWVtY3B5KCZyZGVzY1s0XSwgJnRyaC0+cnNlZ1tudW1fcmRzYyAtIDJdLCBzaXplb2YodWludDE2X3QpKTsKKwkJbWVtY3B5KCZyZGVzY1s0XSwgJnRyaC0+cnNlZ1tudW1fcmRzYyAtIDJdLCBzaXplb2YoX19iZTE2KSk7CiAJZWxzZSB7Ci0JCW1lbWNweSgmcmRlc2NbNF0sICZ0cmgtPnJzZWdbMV0sIHNpemVvZih1aW50MTZfdCkpOworCQltZW1jcHkoJnJkZXNjWzRdLCAmdHJoLT5yc2VnWzFdLCBzaXplb2YoX19iZTE2KSk7CiAJCXJkZXNjWzVdID0gKChudG9ocyh0cmgtPnJzZWdbMF0pICYgMHgwMDBmKSB8IChyZGVzY1s1XSAmIDB4ZjApKTsKIAl9CiAKQEAgLTc3NSw3ICs3NzUsNyBAQAogCQl1bnNpZ25lZCBjaGFyICpzcmMsICpkc3Q7CiAKIAkJYXRtX3JldHVybih2Y2MsIHNrYi0+dHJ1ZXNpemUpOwotCQlpZiAoKih1aW50MTZfdCAqKSBza2ItPmRhdGEgPT0gaHRvbnMocHJpdi0+bGVjaWQpIHx8CisJCWlmICgqKF9fYmUxNiAqKSBza2ItPmRhdGEgPT0gaHRvbnMocHJpdi0+bGVjaWQpIHx8CiAJCSAgICAhcHJpdi0+bGVjZCB8fCAhKGRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CiAJCQkvKgogCQkJICogUHJvYmFibHkgbG9vcGluZyBiYWNrLCBvciBpZiBsZWNkIGlzIG1pc3NpbmcsCkBAIC0xMzIxLDExICsxMzIxLDEwIEBACiAJCWlmICh0YWJsZSA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwogCi0JCSp0bHZzID0ga21hbGxvYyh0YWJsZS0+c2l6ZW9mdGx2cywgR0ZQX0FUT01JQyk7CisJCSp0bHZzID0ga21lbWR1cCh0YWJsZS0+dGx2cywgdGFibGUtPnNpemVvZnRsdnMsIEdGUF9BVE9NSUMpOwogCQlpZiAoKnRsdnMgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAotCQltZW1jcHkoKnRsdnMsIHRhYmxlLT50bHZzLCB0YWJsZS0+c2l6ZW9mdGx2cyk7CiAJCSpzaXplb2Z0bHZzID0gdGFibGUtPnNpemVvZnRsdnM7CiAKIAkJcmV0dXJuIDA7CkBAIC0xMzY0LDExICsxMzYzLDEwIEBACiAKIAlrZnJlZShwcml2LT50bHZzKTsJLyogTlVMTCBpZiB0aGVyZSB3YXMgbm8gcHJldmlvdXMgYXNzb2NpYXRpb24gKi8KIAotCXByaXYtPnRsdnMgPSBrbWFsbG9jKHNpemVvZnRsdnMsIEdGUF9LRVJORUwpOworCXByaXYtPnRsdnMgPSBrbWVtZHVwKHRsdnMsIHNpemVvZnRsdnMsIEdGUF9LRVJORUwpOwogCWlmIChwcml2LT50bHZzID09IE5VTEwpCiAJCXJldHVybiAoMCk7CiAJcHJpdi0+c2l6ZW9mdGx2cyA9IHNpemVvZnRsdnM7Ci0JbWVtY3B5KHByaXYtPnRsdnMsIHRsdnMsIHNpemVvZnRsdnMpOwogCiAJc2tiID0gYWxsb2Nfc2tiKHNpemVvZnRsdnMsIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKQEAgLTE0MDksMTIgKzE0MDcsMTAgQEAKIAogCWtmcmVlKGVudHJ5LT50bHZzKTsKIAotCWVudHJ5LT50bHZzID0ga21hbGxvYyhzaXplb2Z0bHZzLCBHRlBfS0VSTkVMKTsKKwllbnRyeS0+dGx2cyA9IGttZW1kdXAodGx2cywgc2l6ZW9mdGx2cywgR0ZQX0tFUk5FTCk7CiAJaWYgKGVudHJ5LT50bHZzID09IE5VTEwpCiAJCXJldHVybjsKLQogCWVudHJ5LT5zaXplb2Z0bHZzID0gc2l6ZW9mdGx2czsKLQltZW1jcHkoZW50cnktPnRsdnMsIHRsdnMsIHNpemVvZnRsdnMpOwogI2VuZGlmCiAjaWYgMAogCXByaW50aygibGVjLmM6IGxhbmUyX2Fzc29jaWF0ZV9pbmQoKVxuIik7CkBAIC0xNDU4LDcgKzE0NTQsNyBAQAogCiAjZGVmaW5lIExFQ19BUlBfUkVGUkVTSF9JTlRFUlZBTCAoMypIWikKIAotc3RhdGljIHZvaWQgbGVjX2FycF9jaGVja19leHBpcmUodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBsZWNfYXJwX2NoZWNrX2V4cGlyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgbGVjX2FycF9leHBpcmVfYXJwKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qIApAQCAtMTQ4MSw3ICsxNDc3LDcgQEAKICAgICAgICAgSU5JVF9ITElTVF9IRUFEKCZwcml2LT5sZWNfbm9fZm9yd2FyZCk7CiAgICAgICAgIElOSVRfSExJU1RfSEVBRCgmcHJpdi0+bWNhc3RfZndkcyk7CiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxlY19hcnBfbG9jayk7Ci0JSU5JVF9XT1JLKCZwcml2LT5sZWNfYXJwX3dvcmssIGxlY19hcnBfY2hlY2tfZXhwaXJlLCBwcml2KTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+bGVjX2FycF93b3JrLCBsZWNfYXJwX2NoZWNrX2V4cGlyZSk7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5sZWNfYXJwX3dvcmssIExFQ19BUlBfUkVGUkVTSF9JTlRFUlZBTCk7CiB9CiAKQEAgLTE4NzksMTAgKzE4NzUsMTEgQEAKICAqICAgICAgIHRvIEVTSV9GT1JXQVJEX0RJUkVDVC4gVGhpcyBjYXVzZXMgdGhlIGZsdXNoIHBlcmlvZCB0byBlbmQKICAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb2dyZXNzIG9mIHRoZSBmbHVzaCBwcm90b2NvbC4KICAqLwotc3RhdGljIHZvaWQgbGVjX2FycF9jaGVja19leHBpcmUodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGxlY19hcnBfY2hlY2tfZXhwaXJlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBsZWNfcHJpdiAqcHJpdiA9IGRhdGE7CisJc3RydWN0IGxlY19wcml2ICpwcml2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBsZWNfcHJpdiwgbGVjX2FycF93b3JrLndvcmspOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbmV4dDsKIAlzdHJ1Y3QgbGVjX2FycF90YWJsZSAqZW50cnk7CiAJdW5zaWduZWQgbG9uZyBub3c7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2xlYy5oIGIvbmV0L2F0bS9sZWMuaAppbmRleCA4NzdmNTA5Li45OTEzNmJhIDEwMDY0NAotLS0gYS9uZXQvYXRtL2xlYy5oCisrKyBiL25ldC9hdG0vbGVjLmgKQEAgLTE0LDE0ICsxNCwxNCBAQAogI2RlZmluZSBMRUNfSEVBREVSX0xFTiAxNgogCiBzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzIHsKLQl1bnNpZ25lZCBzaG9ydCBsZV9oZWFkZXI7CisJX19iZTE2IGxlX2hlYWRlcjsKIAl1bnNpZ25lZCBjaGFyIGhfZGVzdFtFVEhfQUxFTl07CiAJdW5zaWduZWQgY2hhciBoX3NvdXJjZVtFVEhfQUxFTl07Ci0JdW5zaWduZWQgc2hvcnQgaF90eXBlOworCV9fYmUxNiBoX3R5cGU7CiB9OwogCiBzdHJ1Y3QgbGVjZGF0YWhkcl84MDI1IHsKLQl1bnNpZ25lZCBzaG9ydCBsZV9oZWFkZXI7CisJX19iZTE2IGxlX2hlYWRlcjsKIAl1bnNpZ25lZCBjaGFyIGFjX3BhZDsKIAl1bnNpZ25lZCBjaGFyIGZjOwogCXVuc2lnbmVkIGNoYXIgaF9kZXN0W0VUSF9BTEVOXTsKQEAgLTkyLDcgKzkyLDcgQEAKIAlzcGlubG9ja190IGxlY19hcnBfbG9jazsKIAlzdHJ1Y3QgYXRtX3ZjYyAqbWNhc3RfdmNjOwkJLyogRGVmYXVsdCBNdWx0aWNhc3QgU2VuZCBWQ0MgKi8KIAlzdHJ1Y3QgYXRtX3ZjYyAqbGVjZDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGVjX2FycF93b3JrOwkvKiBDMTAgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGxlY19hcnBfd29yazsJLyogQzEwICovCiAJdW5zaWduZWQgaW50IG1heGltdW1fdW5rbm93bl9mcmFtZV9jb3VudDsKIAkJCQkJCS8qCiAJCQkJCQkgKiBXaXRoaW4gdGhlIHBlcmlvZCBvZiB0aW1lIGRlZmluZWQgYnkgdGhpcyB2YXJpYWJsZSwgdGhlIGNsaWVudCB3aWxsIHNlbmQKZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBjLmMgYi9uZXQvYXRtL21wYy5jCmluZGV4IDBkMmI5OTQuLmMxOGY3MzcgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBjLmMKKysrIGIvbmV0L2F0bS9tcGMuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAvKgogICogT3ZlcndyaXRlcyB0aGUgb2xkIGVudHJ5IG9yIG1ha2VzIGEgbmV3IG9uZS4KICAqLwotc3RydWN0IGF0bV9tcG9hX3FvcyAqYXRtX21wb2FfYWRkX3Fvcyh1aW50MzJfdCBkc3RfaXAsIHN0cnVjdCBhdG1fcW9zICpxb3MpCitzdHJ1Y3QgYXRtX21wb2FfcW9zICphdG1fbXBvYV9hZGRfcW9zKF9fYmUzMiBkc3RfaXAsIHN0cnVjdCBhdG1fcW9zICpxb3MpCiB7CiAJc3RydWN0IGF0bV9tcG9hX3FvcyAqZW50cnk7CiAKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCXJldHVybiBlbnRyeTsKIH0KIAotc3RydWN0IGF0bV9tcG9hX3FvcyAqYXRtX21wb2Ffc2VhcmNoX3Fvcyh1aW50MzJfdCBkc3RfaXApCitzdHJ1Y3QgYXRtX21wb2FfcW9zICphdG1fbXBvYV9zZWFyY2hfcW9zKF9fYmUzMiBkc3RfaXApCiB7CiAJc3RydWN0IGF0bV9tcG9hX3FvcyAqcW9zOwogCkBAIC00NjAsMTEgKzQ2MCwxMSBAQAogCWluX2NhY2hlX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAljaGFyICpidWZmOwotCXVpbnQzMl90IGlwYWRkciA9IDA7CisJX19iZTMyIGlwYWRkciA9IDA7CiAKIAlzdGF0aWMgc3RydWN0IHsKIAkJc3RydWN0IGxsY19zbmFwX2hkciBoZHI7Ci0JCXVpbnQzMl90IHRhZzsKKwkJX19iZTMyIHRhZzsKIAl9IHRhZ2dlZF9sbGNfc25hcF9oZHIgPSB7CiAJCXsweGFhLCAweGFhLCAweDAzLCB7MHgwMCwgMHgwMCwgMHgwMH0sIHsweDg4LCAweDRjfX0sCiAJCTAKQEAgLTU1OSw3ICs1NTksNyBAQAogCXN0cnVjdCBtcG9hX2NsaWVudCAqbXBjOwogCXN0cnVjdCBhdG1tcGNfaW9jIGlvY19kYXRhOwogCWluX2NhY2hlX2VudHJ5ICppbl9lbnRyeTsKLQl1aW50MzJfdCAgaXBhZGRyOworCV9fYmUzMiAgaXBhZGRyOwogCiAJYnl0ZXNfbGVmdCA9IGNvcHlfZnJvbV91c2VyKCZpb2NfZGF0YSwgYXJnLCBzaXplb2Yoc3RydWN0IGF0bW1wY19pb2MpKTsKIAlpZiAoYnl0ZXNfbGVmdCAhPSAwKSB7CkBAIC02MzgsNyArNjM4LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKIAllZ19jYWNoZV9lbnRyeSAqZWc7CiAJc3RydWN0IG1wb2FfY2xpZW50ICptcGM7Ci0JdWludDMyX3QgdGFnOworCV9fYmUzMiB0YWc7CiAJY2hhciAqdG1wOwogCQogCWRkcHJpbnRrKCJtcG9hOiAoJXMpIG1wY19wdXNoOlxuIiwgZGV2LT5uYW1lKTsKQEAgLTY4Myw3ICs2ODMsNyBAQAogCX0KIAogCXRtcCA9IHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgbGxjX3NuYXBfaGRyKTsKLQl0YWcgPSAqKHVpbnQzMl90ICopdG1wOworCXRhZyA9ICooX19iZTMyICopdG1wOwogCiAJZWcgPSBtcGMtPmVnX29wcy0+Z2V0X2J5X3RhZyh0YWcsIG1wYyk7CiAJaWYgKGVnID09IE5VTEwpIHsKQEAgLTEwMjksNyArMTAyOSw3IEBACiAKIHN0YXRpYyB2b2lkIE1QT0FfdHJpZ2dlcl9yY3ZkKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCiB7Ci0JdWludDMyX3QgZHN0X2lwID0gbXNnLT5jb250ZW50LmluX2luZm8uaW5fZHN0X2lwOworCV9fYmUzMiBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7CiAJaW5fY2FjaGVfZW50cnkgKmVudHJ5OwogCiAJZW50cnkgPSBtcGMtPmluX29wcy0+Z2V0KGRzdF9pcCwgbXBjKTsKQEAgLTEwNjYsNyArMTA2Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNoZWNrX3Fvc19hbmRfb3Blbl9zaG9ydGN1dChzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50LCBpbl9jYWNoZV9lbnRyeSAqZW50cnkpCiB7Ci0JdWludDMyX3QgZHN0X2lwID0gbXNnLT5jb250ZW50LmluX2luZm8uaW5fZHN0X2lwOworCV9fYmUzMiBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7CiAJc3RydWN0IGF0bV9tcG9hX3FvcyAqcW9zID0gYXRtX21wb2Ffc2VhcmNoX3Fvcyhkc3RfaXApOwogCWVnX2NhY2hlX2VudHJ5ICplZ19lbnRyeSA9IGNsaWVudC0+ZWdfb3BzLT5nZXRfYnlfc3JjX2lwKGRzdF9pcCwgY2xpZW50KTsKIApAQCAtMTEwMiw3ICsxMTAyLDcgQEAKIAogc3RhdGljIHZvaWQgTVBPQV9yZXNfcmVwbHlfcmN2ZChzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqbXBjKQogewotCXVpbnQzMl90IGRzdF9pcCA9IG1zZy0+Y29udGVudC5pbl9pbmZvLmluX2RzdF9pcDsKKwlfX2JlMzIgZHN0X2lwID0gbXNnLT5jb250ZW50LmluX2luZm8uaW5fZHN0X2lwOwogCWluX2NhY2hlX2VudHJ5ICplbnRyeSA9IG1wYy0+aW5fb3BzLT5nZXQoZHN0X2lwLCBtcGMpOwogCiAJZHByaW50aygibXBvYTogKCVzKSBNUE9BX3Jlc19yZXBseV9yY3ZkOiBpcCAldS4ldS4ldS4ldVxuIiwgbXBjLT5kZXYtPm5hbWUsIE5JUFFVQUQoZHN0X2lwKSk7CkBAIC0xMTQ4LDggKzExNDgsOCBAQAogCiBzdGF0aWMgdm9pZCBpbmdyZXNzX3B1cmdlX3JjdmQoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKIHsKLQl1aW50MzJfdCBkc3RfaXAgPSBtc2ctPmNvbnRlbnQuaW5faW5mby5pbl9kc3RfaXA7Ci0JdWludDMyX3QgbWFzayA9IG1zZy0+aXBfbWFzazsKKwlfX2JlMzIgZHN0X2lwID0gbXNnLT5jb250ZW50LmluX2luZm8uaW5fZHN0X2lwOworCV9fYmUzMiBtYXNrID0gbXNnLT5pcF9tYXNrOwogCWluX2NhY2hlX2VudHJ5ICplbnRyeSA9IG1wYy0+aW5fb3BzLT5nZXRfd2l0aF9tYXNrKGRzdF9pcCwgbXBjLCBtYXNrKTsKIAogCWlmKGVudHJ5ID09IE5VTEwpewpAQCAtMTE3Myw3ICsxMTczLDcgQEAKIAogc3RhdGljIHZvaWQgZWdyZXNzX3B1cmdlX3JjdmQoc3RydWN0IGtfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKIHsKLQl1aW50MzJfdCBjYWNoZV9pZCA9IG1zZy0+Y29udGVudC5lZ19pbmZvLmNhY2hlX2lkOworCV9fYmUzMiBjYWNoZV9pZCA9IG1zZy0+Y29udGVudC5lZ19pbmZvLmNhY2hlX2lkOwogCWVnX2NhY2hlX2VudHJ5ICplbnRyeSA9IG1wYy0+ZWdfb3BzLT5nZXRfYnlfY2FjaGVfaWQoY2FjaGVfaWQsIG1wYyk7CiAJCiAJaWYgKGVudHJ5ID09IE5VTEwpIHsKQEAgLTEzMjIsMTMgKzEzMjIsMTIgQEAKIAlpZihjbGllbnQtPm51bWJlcl9vZl9tcHNfbWFjcykKIAkJa2ZyZWUoY2xpZW50LT5tcHNfbWFjcyk7CiAJY2xpZW50LT5udW1iZXJfb2ZfbXBzX21hY3MgPSAwOwotCWNsaWVudC0+bXBzX21hY3MgPSBrbWFsbG9jKEVUSF9BTEVOLEdGUF9LRVJORUwpOworCWNsaWVudC0+bXBzX21hY3MgPSBrbWVtZHVwKG1zZy0+TVBTX2N0cmwsIEVUSF9BTEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2xpZW50LT5tcHNfbWFjcyA9PSBOVUxMKSB7CiAJCXByaW50aygibXBvYTogc2V0X21wc19tYWNfYWRkcl9yY3ZkOiBvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuOwogCX0KIAljbGllbnQtPm51bWJlcl9vZl9tcHNfbWFjcyA9IDE7Ci0JbWVtY3B5KGNsaWVudC0+bXBzX21hY3MsIG1zZy0+TVBTX2N0cmwsIEVUSF9BTEVOKTsKIAkKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9uZXQvYXRtL21wYy5oIGIvbmV0L2F0bS9tcGMuaAppbmRleCAzYzc5ODFhLi41MWY0NjBkIDEwMDY0NAotLS0gYS9uZXQvYXRtL21wYy5oCisrKyBiL25ldC9hdG0vbXBjLmgKQEAgLTM2LDE0ICszNiwxNCBAQAogCiBzdHJ1Y3QgYXRtX21wb2FfcW9zIHsKICAgICAgICAgc3RydWN0IGF0bV9tcG9hX3FvcyAqbmV4dDsKLSAgICAgICAgdWludDMyX3QgaXBhZGRyOworICAgICAgICBfX2JlMzIgaXBhZGRyOwogICAgICAgICBzdHJ1Y3QgYXRtX3FvcyBxb3M7CiB9OwogCiAKIC8qIE1QT0EgUW9TIG9wZXJhdGlvbnMgKi8KLXN0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX2FkZF9xb3ModWludDMyX3QgZHN0X2lwLCBzdHJ1Y3QgYXRtX3FvcyAqcW9zKTsKLXN0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX3NlYXJjaF9xb3ModWludDMyX3QgZHN0X2lwKTsKK3N0cnVjdCBhdG1fbXBvYV9xb3MgKmF0bV9tcG9hX2FkZF9xb3MoX19iZTMyIGRzdF9pcCwgc3RydWN0IGF0bV9xb3MgKnFvcyk7CitzdHJ1Y3QgYXRtX21wb2FfcW9zICphdG1fbXBvYV9zZWFyY2hfcW9zKF9fYmUzMiBkc3RfaXApOwogaW50IGF0bV9tcG9hX2RlbGV0ZV9xb3Moc3RydWN0IGF0bV9tcG9hX3FvcyAqcW9zKTsKIAogLyogRGlzcGxheSBRb1MgZW50cmllcy4gVGhpcyBpcyBmb3IgdGhlIHByb2NmcyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcG9hX2NhY2hlcy5jIGIvbmV0L2F0bS9tcG9hX2NhY2hlcy5jCmluZGV4IGZiZjEzY2QuLjY5N2EwODEgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBvYV9jYWNoZXMuYworKysgYi9uZXQvYXRtL21wb2FfY2FjaGVzLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUgZGRwcmludGsoZm9ybWF0LGFyZ3MuLi4pCiAjZW5kaWYKIAotc3RhdGljIGluX2NhY2hlX2VudHJ5ICppbl9jYWNoZV9nZXQodWludDMyX3QgZHN0X2lwLAorc3RhdGljIGluX2NhY2hlX2VudHJ5ICppbl9jYWNoZV9nZXQoX19iZTMyIGRzdF9pcCwKIAkJCQkgICAgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpCiB7CiAJaW5fY2FjaGVfZW50cnkgKmVudHJ5OwpAQCAtNDIsOSArNDIsOSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5fY2FjaGVfZW50cnkgKmluX2NhY2hlX2dldF93aXRoX21hc2sodWludDMyX3QgZHN0X2lwLAorc3RhdGljIGluX2NhY2hlX2VudHJ5ICppbl9jYWNoZV9nZXRfd2l0aF9tYXNrKF9fYmUzMiBkc3RfaXAsCiAJCQkJCSAgICAgIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50LAotCQkJCQkgICAgICB1aW50MzJfdCBtYXNrKQorCQkJCQkgICAgICBfX2JlMzIgbWFzaykKIHsKIAlpbl9jYWNoZV9lbnRyeSAqZW50cnk7CiAKQEAgLTg0LDEwICs4NCwxMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5fY2FjaGVfZW50cnkgKmluX2NhY2hlX2FkZF9lbnRyeSh1aW50MzJfdCBkc3RfaXAsCitzdGF0aWMgaW5fY2FjaGVfZW50cnkgKmluX2NhY2hlX2FkZF9lbnRyeShfX2JlMzIgZHN0X2lwLAogCQkJCQkgIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KQogewotCWluX2NhY2hlX2VudHJ5KiBlbnRyeSA9IGttYWxsb2Moc2l6ZW9mKGluX2NhY2hlX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaW5fY2FjaGVfZW50cnkgKmVudHJ5ID0ga3phbGxvYyhzaXplb2YoaW5fY2FjaGVfZW50cnkpLCBHRlBfS0VSTkVMKTsKIAogCWlmIChlbnRyeSA9PSBOVUxMKSB7CiAJCXByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbmV3X2luX2NhY2hlX2VudHJ5OiBvdXQgb2YgbWVtb3J5XG4iKTsKQEAgLTk1LDcgKzk1LDYgQEAKIAl9CiAKIAlkcHJpbnRrKCJtcG9hOiBtcG9hX2NhY2hlcy5jOiBhZGRpbmcgYW4gaW5ncmVzcyBlbnRyeSwgaXAgPSAldS4ldS4ldS4ldVxuIiwgTklQUVVBRChkc3RfaXApKTsKLQltZW1zZXQoZW50cnksMCxzaXplb2YoaW5fY2FjaGVfZW50cnkpKTsKIAogCWF0b21pY19zZXQoJmVudHJ5LT51c2UsIDEpOwogCWRwcmludGsoIm1wb2E6IG1wb2FfY2FjaGVzLmM6IG5ld19pbl9jYWNoZV9lbnRyeTogYWJvdXQgdG8gbG9ja1xuIik7CkBAIC0zMTksNyArMzE4LDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfZ2V0X2J5X2NhY2hlX2lkKHVpbnQzMl90IGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKK3N0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfZ2V0X2J5X2NhY2hlX2lkKF9fYmUzMiBjYWNoZV9pZCwgc3RydWN0IG1wb2FfY2xpZW50ICptcGMpCiB7CiAJZWdfY2FjaGVfZW50cnkgKmVudHJ5OwogCkBAIC0zMzksNyArMzM4LDcgQEAKIH0KIAogLyogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQgc2luY2UgaXQgc2F2ZXMgQ1BVIGZsYWdzICovCi1zdGF0aWMgZWdfY2FjaGVfZW50cnkgKmVnX2NhY2hlX2dldF9ieV90YWcodWludDMyX3QgdGFnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKK3N0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfZ2V0X2J5X3RhZyhfX2JlMzIgdGFnLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWVnX2NhY2hlX2VudHJ5ICplbnRyeTsKQEAgLTM4MCw3ICszNzksNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgZWdfY2FjaGVfZW50cnkgKmVnX2NhY2hlX2dldF9ieV9zcmNfaXAodWludDMyX3QgaXBhZGRyLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKK3N0YXRpYyBlZ19jYWNoZV9lbnRyeSAqZWdfY2FjaGVfZ2V0X2J5X3NyY19pcChfX2JlMzIgaXBhZGRyLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKm1wYykKIHsKIAllZ19jYWNoZV9lbnRyeSAqZW50cnk7CiAKQEAgLTQ0Nyw3ICs0NDYsNyBAQAogCiBzdGF0aWMgZWdfY2FjaGVfZW50cnkgKmVnX2NhY2hlX2FkZF9lbnRyeShzdHJ1Y3Qga19tZXNzYWdlICptc2csIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KQogewotCWVnX2NhY2hlX2VudHJ5ICplbnRyeSA9IGttYWxsb2Moc2l6ZW9mKGVnX2NhY2hlX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJZWdfY2FjaGVfZW50cnkgKmVudHJ5ID0ga3phbGxvYyhzaXplb2YoZWdfY2FjaGVfZW50cnkpLCBHRlBfS0VSTkVMKTsKIAogCWlmIChlbnRyeSA9PSBOVUxMKSB7CiAJCXByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbmV3X2VnX2NhY2hlX2VudHJ5OiBvdXQgb2YgbWVtb3J5XG4iKTsKQEAgLTQ1NSw3ICs0NTQsNiBAQAogCX0KIAogCWRwcmludGsoIm1wb2E6IG1wb2FfY2FjaGVzLmM6IGFkZGluZyBhbiBlZ3Jlc3MgZW50cnksIGlwID0gJXUuJXUuJXUuJXUsIHRoaXMgc2hvdWxkIGJlIG91ciBJUFxuIiwgTklQUVVBRChtc2ctPmNvbnRlbnQuZWdfaW5mby5lZ19kc3RfaXApKTsKLQltZW1zZXQoZW50cnksIDAsIHNpemVvZihlZ19jYWNoZV9lbnRyeSkpOwogCiAJYXRvbWljX3NldCgmZW50cnktPnVzZSwgMSk7CiAJZHByaW50aygibXBvYTogbXBvYV9jYWNoZXMuYzogbmV3X2VnX2NhY2hlX2VudHJ5OiBhYm91dCB0byBsb2NrXG4iKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBvYV9jYWNoZXMuaCBiL25ldC9hdG0vbXBvYV9jYWNoZXMuaAppbmRleCA2Yzk4ODZhLi44NGRlOTc3IDEwMDY0NAotLS0gYS9uZXQvYXRtL21wb2FfY2FjaGVzLmgKKysrIGIvbmV0L2F0bS9tcG9hX2NhY2hlcy5oCkBAIC0yOSwxMiArMjksMTIgQEAKIH0gaW5fY2FjaGVfZW50cnk7CiAKIHN0cnVjdCBpbl9jYWNoZV9vcHN7Ci0gICAgICAgIGluX2NhY2hlX2VudHJ5ICooKmFkZF9lbnRyeSkodWludDMyX3QgZHN0X2lwLAorICAgICAgICBpbl9jYWNoZV9lbnRyeSAqKCphZGRfZW50cnkpKF9fYmUzMiBkc3RfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKLSAgICAgICAgaW5fY2FjaGVfZW50cnkgKigqZ2V0KSh1aW50MzJfdCBkc3RfaXAsIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKLSAgICAgICAgaW5fY2FjaGVfZW50cnkgKigqZ2V0X3dpdGhfbWFzaykodWludDMyX3QgZHN0X2lwLCAKKyAgICAgICAgaW5fY2FjaGVfZW50cnkgKigqZ2V0KShfX2JlMzIgZHN0X2lwLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIGluX2NhY2hlX2VudHJ5ICooKmdldF93aXRoX21hc2spKF9fYmUzMiBkc3RfaXAsCiAJCQkJCSBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHVpbnQzMl90IG1hc2spOworCQkJCQkgX19iZTMyIG1hc2spOwogICAgICAgICBpbl9jYWNoZV9lbnRyeSAqKCpnZXRfYnlfdmNjKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOwogICAgICAgICB2b2lkICAgICAgICAgICAgKCpwdXQpKGluX2NhY2hlX2VudHJ5ICplbnRyeSk7CkBAIC01NiwxNyArNTYsMTcgQEAKICAgICAgICAgc3RydWN0IGF0bV92Y2MgICAgICAgKnNob3J0Y3V0OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBwYWNrZXRzX3JjdmQ7CiAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgIGVudHJ5X3N0YXRlOwotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBsYXRlc3RfaXBfYWRkcjsgICAgLyogVGhlIHNyYyBJUCBhZGRyZXNzIG9mIHRoZSBsYXN0IHBhY2tldCAqLworICAgICAgICBfX2JlMzIgICAgICAgICAgICAgbGF0ZXN0X2lwX2FkZHI7ICAgIC8qIFRoZSBzcmMgSVAgYWRkcmVzcyBvZiB0aGUgbGFzdCBwYWNrZXQgKi8KICAgICAgICAgc3RydWN0IGVnX2N0cmxfaW5mbyAgY3RybF9pbmZvOwogICAgICAgICBhdG9taWNfdCAgICAgICAgICAgICB1c2U7CiB9IGVnX2NhY2hlX2VudHJ5OwogCiBzdHJ1Y3QgZWdfY2FjaGVfb3BzewogICAgICAgICBlZ19jYWNoZV9lbnRyeSAqKCphZGRfZW50cnkpKHN0cnVjdCBrX21lc3NhZ2UgKm1zZywgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOwotICAgICAgICBlZ19jYWNoZV9lbnRyeSAqKCpnZXRfYnlfY2FjaGVfaWQpKHVpbnQzMl90IGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7Ci0gICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV90YWcpKHVpbnQzMl90IGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV9jYWNoZV9pZCkoX19iZTMyIGNhY2hlX2lkLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CisgICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV90YWcpKF9fYmUzMiBjYWNoZV9pZCwgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOwogICAgICAgICBlZ19jYWNoZV9lbnRyeSAqKCpnZXRfYnlfdmNjKShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7Ci0gICAgICAgIGVnX2NhY2hlX2VudHJ5ICooKmdldF9ieV9zcmNfaXApKHVpbnQzMl90IGlwYWRkciwgc3RydWN0IG1wb2FfY2xpZW50ICpjbGllbnQpOworICAgICAgICBlZ19jYWNoZV9lbnRyeSAqKCpnZXRfYnlfc3JjX2lwKShfX2JlMzIgaXBhZGRyLCBzdHJ1Y3QgbXBvYV9jbGllbnQgKmNsaWVudCk7CiAgICAgICAgIHZvaWQgICAgICAgICAgICAoKnB1dCkoZWdfY2FjaGVfZW50cnkgKmVudHJ5KTsKICAgICAgICAgdm9pZCAgICAgICAgICAgICgqcmVtb3ZlX2VudHJ5KShlZ19jYWNoZV9lbnRyeSAqZW50cnksIHN0cnVjdCBtcG9hX2NsaWVudCAqY2xpZW50KTsKICAgICAgICAgdm9pZCAgICAgICAgICAgICgqdXBkYXRlKShlZ19jYWNoZV9lbnRyeSAqZW50cnksIHVpbnQxNl90IGhvbGRpbmdfdGltZSk7CmRpZmYgLS1naXQgYS9uZXQvYXRtL21wb2FfcHJvYy5jIGIvbmV0L2F0bS9tcG9hX3Byb2MuYwppbmRleCBkMzdiODkxLi4zODQ0Yzg1IDEwMDY0NAotLS0gYS9uZXQvYXRtL21wb2FfcHJvYy5jCisrKyBiL25ldC9hdG0vbXBvYV9wcm9jLmMKQEAgLTIzMSwxNCArMjMxLDE0IEBACiAgICAgICAgICAqLwogICAgICAgICB1bnNpZ25lZCBjaGFyIGlwWzRdOyAKIAlpbnQgdHhfcGNyLCB0eF9zZHUsIHJ4X3Bjciwgcnhfc2R1OwotICAgICAgICB1aW50MzJfdCBpcGFkZHI7CisgICAgICAgIF9fYmUzMiBpcGFkZHI7CiAJc3RydWN0IGF0bV9xb3MgcW9zOyAKICAgICAgICAgCiAgICAgICAgIG1lbXNldCgmcW9zLCAwLCBzaXplb2Yoc3RydWN0IGF0bV9xb3MpKTsKIAogCWlmIChzc2NhbmYoYnVmZiwgImRlbCAlaGh1LiVoaHUuJWhodS4laGh1IiwKIAkJCWlwLCBpcCsxLCBpcCsyLCBpcCszKSA9PSA0KSB7Ci0JCWlwYWRkciA9ICoodWludDMyX3QgKilpcDsKKwkJaXBhZGRyID0gKihfX2JlMzIgKilpcDsKIAkJcmV0dXJuIGF0bV9tcG9hX2RlbGV0ZV9xb3MoYXRtX21wb2Ffc2VhcmNoX3FvcyhpcGFkZHIpKTsKIAl9CiAKQEAgLTI1MCw3ICsyNTAsNyBAQAogCQlpcCwgaXArMSwgaXArMiwgaXArMywgJnR4X3BjciwgJnR4X3NkdSwgJnJ4X3BjciwgJnJ4X3NkdSkgIT0gOCkKIAkJcmV0dXJuIDA7CiAKLSAgICAgICAgaXBhZGRyID0gKih1aW50MzJfdCAqKWlwOworICAgICAgICBpcGFkZHIgPSAqKF9fYmUzMiAqKWlwOwogCXFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPSBBVE1fQ0JSOwogCXFvcy50eHRwLm1heF9wY3IgPSB0eF9wY3I7CiAJcW9zLnR4dHAubWF4X3NkdSA9IHR4X3NkdTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vcHJvYy5jIGIvbmV0L2F0bS9wcm9jLmMKaW5kZXggOTFmZTVmNS4uNzM5ODY2YiAxMDA2NDQKLS0tIGEvbmV0L2F0bS9wcm9jLmMKKysrIGIvbmV0L2F0bS9wcm9jLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogCWlmIChjb3VudCA9PSAwKSByZXR1cm4gMDsKIAlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZSkgcmV0dXJuIC1FTk9NRU07Ci0JZGV2ID0gUERFKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKKwlkZXYgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJaWYgKCFkZXYtPm9wcy0+cHJvY19yZWFkKQogCQlsZW5ndGggPSAtRUlOVkFMOwogCWVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYWZfYXgyNS5jIGIvbmV0L2F4MjUvYWZfYXgyNS5jCmluZGV4IDAwMDY5NWMuLjZjYWJmNmQgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2FmX2F4MjUuYworKysgYi9uZXQvYXgyNS9hZl9heDI1LmMKQEAgLTkwNiwxMyArOTA2LDEzIEBACiAJYXgyNS0+c291cmNlX2FkZHIgPSBvYXgyNS0+c291cmNlX2FkZHI7CiAKIAlpZiAob2F4MjUtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKLQkJaWYgKChheDI1LT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWF4MjUtPmRpZ2lwZWF0ID0ga21lbWR1cChvYXgyNS0+ZGlnaXBlYXQsIHNpemVvZihheDI1X2RpZ2kpLAorCQkJCQkgR0ZQX0FUT01JQyk7CisJCWlmIChheDI1LT5kaWdpcGVhdCA9PSBOVUxMKSB7CiAJCQlza19mcmVlKHNrKTsKIAkJCWF4MjVfY2JfcHV0KGF4MjUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQotCQltZW1jcHkoYXgyNS0+ZGlnaXBlYXQsIG9heDI1LT5kaWdpcGVhdCwgc2l6ZW9mKGF4MjVfZGlnaSkpOwogCX0KIAogCXNrLT5za19wcm90aW5mbyA9IGF4MjU7CmRpZmYgLS1naXQgYS9uZXQvYXgyNS9heDI1X2FkZHIuYyBiL25ldC9heDI1L2F4MjVfYWRkci5jCmluZGV4IDVmMDg5NmEuLjk3YTQ5YzcgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfYWRkci5jCisrKyBiL25ldC9heDI1L2F4MjVfYWRkci5jCkBAIC0yOSwxNyArMjksMjYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogLyoKLSAqCVRoZSBudWxsIGFkZHJlc3MgaXMgZGVmaW5lZCBhcyBhIGNhbGxzaWduIG9mIGFsbCBzcGFjZXMgd2l0aCBhbgotICoJU1NJRCBvZiB6ZXJvLgorICogVGhlIGRlZmF1bHQgYnJvYWRjYXN0IGFkZHJlc3Mgb2YgYW4gaW50ZXJmYWNlIGlzIFFTVC0wOyB0aGUgZGVmYXVsdCBhZGRyZXNzCisgKiBpcyBMSU5VWC0xLiAgVGhlIG51bGwgYWRkcmVzcyBpcyBkZWZpbmVkIGFzIGEgY2FsbHNpZ24gb2YgYWxsIHNwYWNlcyB3aXRoCisgKiBhbiBTU0lEIG9mIHplcm8uCiAgKi8KLWF4MjVfYWRkcmVzcyBudWxsX2F4MjVfYWRkcmVzcyA9IHt7MHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHgwMH19OwogCitjb25zdCBheDI1X2FkZHJlc3MgYXgyNV9iY2FzdCA9CisJe3snUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAwIDw8IDF9fTsKK2NvbnN0IGF4MjVfYWRkcmVzcyBheDI1X2RlZmFkZHIgPQorCXt7J0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwgMSA8PCAxfX07Citjb25zdCBheDI1X2FkZHJlc3MgbnVsbF9heDI1X2FkZHJlc3MgPQorCXt7JyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgMCA8PCAxfX07CisKK0VYUE9SVF9TWU1CT0xfR1BMKGF4MjVfYmNhc3QpOworRVhQT1JUX1NZTUJPTF9HUEwoYXgyNV9kZWZhZGRyKTsKIEVYUE9SVF9TWU1CT0wobnVsbF9heDI1X2FkZHJlc3MpOwogCiAvKgogICoJYXgyNSAtPiBhc2NpaSBjb252ZXJzaW9uCiAgKi8KLWNoYXIgKmF4MmFzYyhjaGFyICpidWYsIGF4MjVfYWRkcmVzcyAqYSkKK2NoYXIgKmF4MmFzYyhjaGFyICpidWYsIGNvbnN0IGF4MjVfYWRkcmVzcyAqYSkKIHsKIAljaGFyIGMsICpzOwogCWludCBuOwpAQCAtNzIsOSArODEsOSBAQAogLyoKICAqCWFzY2lpIC0+IGF4MjUgY29udmVyc2lvbgogICovCi12b2lkIGFzYzJheChheDI1X2FkZHJlc3MgKmFkZHIsIGNoYXIgKmNhbGxzaWduKQordm9pZCBhc2MyYXgoYXgyNV9hZGRyZXNzICphZGRyLCBjb25zdCBjaGFyICpjYWxsc2lnbikKIHsKLQljaGFyICpzOworCWNvbnN0IGNoYXIgKnM7CiAJaW50IG47CiAKIAlmb3IgKHMgPSBjYWxsc2lnbiwgbiA9IDA7IG4gPCA2OyBuKyspIHsKQEAgLTEwNyw3ICsxMTYsNyBAQAogLyoKICAqCUNvbXBhcmUgdHdvIGF4LjI1IGFkZHJlc3NlcwogICovCi1pbnQgYXgyNWNtcChheDI1X2FkZHJlc3MgKmEsIGF4MjVfYWRkcmVzcyAqYikKK2ludCBheDI1Y21wKGNvbnN0IGF4MjVfYWRkcmVzcyAqYSwgY29uc3QgYXgyNV9hZGRyZXNzICpiKQogewogCWludCBjdCA9IDA7CiAKQEAgLTEyOCw3ICsxMzcsNyBAQAogLyoKICAqCUNvbXBhcmUgdHdvIEFYLjI1IGRpZ2lwZWF0ZXIgcGF0aHMuCiAgKi8KLWludCBheDI1ZGlnaWNtcChheDI1X2RpZ2kgKmRpZ2kxLCBheDI1X2RpZ2kgKmRpZ2kyKQoraW50IGF4MjVkaWdpY21wKGNvbnN0IGF4MjVfZGlnaSAqZGlnaTEsIGNvbnN0IGF4MjVfZGlnaSAqZGlnaTIpCiB7CiAJaW50IGk7CiAKQEAgLTE0OSw3ICsxNTgsOSBAQAogICoJR2l2ZW4gYW4gQVguMjUgYWRkcmVzcyBwdWxsIG9mIHRvLCBmcm9tLCBkaWdpIGxpc3QsIGNvbW1hbmQvcmVzcG9uc2UgYW5kIHRoZSBzdGFydCBvZiBkYXRhCiAgKgogICovCi11bnNpZ25lZCBjaGFyICpheDI1X2FkZHJfcGFyc2UodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBheDI1X2FkZHJlc3MgKnNyYywgYXgyNV9hZGRyZXNzICpkZXN0LCBheDI1X2RpZ2kgKmRpZ2ksIGludCAqZmxhZ3MsIGludCAqZGFtYSkKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKmF4MjVfYWRkcl9wYXJzZShjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sCisJYXgyNV9hZGRyZXNzICpzcmMsIGF4MjVfYWRkcmVzcyAqZGVzdCwgYXgyNV9kaWdpICpkaWdpLCBpbnQgKmZsYWdzLAorCWludCAqZGFtYSkKIHsKIAlpbnQgZCA9IDA7CiAKQEAgLTIwNCw3ICsyMTUsOCBAQAogLyoKICAqCUFzc2VtYmxlIGFuIEFYLjI1IGhlYWRlciBmcm9tIHRoZSBiaXRzCiAgKi8KLWludCBheDI1X2FkZHJfYnVpbGQodW5zaWduZWQgY2hhciAqYnVmLCBheDI1X2FkZHJlc3MgKnNyYywgYXgyNV9hZGRyZXNzICpkZXN0LCBheDI1X2RpZ2kgKmQsIGludCBmbGFnLCBpbnQgbW9kdWx1cykKK2ludCBheDI1X2FkZHJfYnVpbGQodW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBheDI1X2FkZHJlc3MgKnNyYywKKwljb25zdCBheDI1X2FkZHJlc3MgKmRlc3QsIGNvbnN0IGF4MjVfZGlnaSAqZCwgaW50IGZsYWcsIGludCBtb2R1bHVzKQogewogCWludCBsZW4gPSAwOwogCWludCBjdCAgPSAwOwpAQCAtMjYxLDcgKzI3Myw3IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotaW50IGF4MjVfYWRkcl9zaXplKGF4MjVfZGlnaSAqZHApCitpbnQgYXgyNV9hZGRyX3NpemUoY29uc3QgYXgyNV9kaWdpICpkcCkKIHsKIAlpZiAoZHAgPT0gTlVMTCkKIAkJcmV0dXJuIDIgKiBBWDI1X0FERFJfTEVOOwpAQCAtMjcyLDcgKzI4NCw3IEBACiAvKgogICoJUmV2ZXJzZSBEaWdpcGVhdCBMaXN0LiBNYXkgbm90IHBhc3MgYm90aCBwYXJhbWV0ZXJzIGFzIHNhbWUgc3RydWN0CiAgKi8KLXZvaWQgYXgyNV9kaWdpX2ludmVydChheDI1X2RpZ2kgKmluLCBheDI1X2RpZ2kgKm91dCkKK3ZvaWQgYXgyNV9kaWdpX2ludmVydChjb25zdCBheDI1X2RpZ2kgKmluLCBheDI1X2RpZ2kgKm91dCkKIHsKIAlpbnQgY3Q7CiAKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfb3V0LmMgYi9uZXQvYXgyNS9heDI1X291dC5jCmluZGV4IGQ3NzM2ZTUuLmY4NDA0N2QgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfb3V0LmMKKysrIGIvbmV0L2F4MjUvYXgyNV9vdXQuYwpAQCAtNzAsMTEgKzcwLDExIEBACiAJYXgyNS0+ZGVzdF9hZGRyICAgPSAqZGVzdDsKIAogCWlmIChkaWdpICE9IE5VTEwpIHsKLQkJaWYgKChheDI1LT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWF4MjUtPmRpZ2lwZWF0ID0ga21lbWR1cChkaWdpLCBzaXplb2YoKmRpZ2kpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGF4MjUtPmRpZ2lwZWF0ID09IE5VTEwpIHsKIAkJCWF4MjVfY2JfcHV0KGF4MjUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJbWVtY3B5KGF4MjUtPmRpZ2lwZWF0LCBkaWdpLCBzaXplb2YoYXgyNV9kaWdpKSk7CiAJfQogCiAJc3dpdGNoIChheDI1LT5heDI1X2Rldi0+dmFsdWVzW0FYMjVfVkFMVUVTX1BST1RPQ09MXSkgewpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jIGIvbmV0L2F4MjUvYXgyNV9yb3V0ZS5jCmluZGV4IDUxYjdiZGEuLjg1ODAzNTYgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfcm91dGUuYworKysgYi9uZXQvYXgyNS9heDI1X3JvdXRlLmMKQEAgLTQzMiwxMSArNDMyLDEyIEBACiAJfQogCiAJaWYgKGF4MjVfcnQtPmRpZ2lwZWF0ICE9IE5VTEwpIHsKLQkJaWYgKChheDI1LT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKGF4MjVfZGlnaSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWF4MjUtPmRpZ2lwZWF0ID0ga21lbWR1cChheDI1X3J0LT5kaWdpcGVhdCwgc2l6ZW9mKGF4MjVfZGlnaSksCisJCQkJCSBHRlBfQVRPTUlDKTsKKwkJaWYgKGF4MjUtPmRpZ2lwZWF0ID09IE5VTEwpIHsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIHB1dDsKIAkJfQotCQltZW1jcHkoYXgyNS0+ZGlnaXBlYXQsIGF4MjVfcnQtPmRpZ2lwZWF0LCBzaXplb2YoYXgyNV9kaWdpKSk7CiAJCWF4MjVfYWRqdXN0X3BhdGgoYWRkciwgYXgyNS0+ZGlnaXBlYXQpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvc3lzY3RsX25ldF9heDI1LmMgYi9uZXQvYXgyNS9zeXNjdGxfbmV0X2F4MjUuYwppbmRleCA4NjdkNDI1Li5kMjNhMjdmIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9zeXNjdGxfbmV0X2F4MjUuYworKysgYi9uZXQvYXgyNS9zeXNjdGxfbmV0X2F4MjUuYwpAQCAtMjA5LDcgKzIwOSw5IEBACiAJfQogCiAJZm9yIChuID0gMCwgYXgyNV9kZXYgPSBheDI1X2Rldl9saXN0OyBheDI1X2RldiAhPSBOVUxMOyBheDI1X2RldiA9IGF4MjVfZGV2LT5uZXh0KSB7Ci0JCWN0bF90YWJsZSAqY2hpbGQgPSBrbWFsbG9jKHNpemVvZihheDI1X3BhcmFtX3RhYmxlKSwgR0ZQX0FUT01JQyk7CisJCXN0cnVjdCBjdGxfdGFibGUgKmNoaWxkID0ga21lbWR1cChheDI1X3BhcmFtX3RhYmxlLAorCQkJCQkJICBzaXplb2YoYXgyNV9wYXJhbV90YWJsZSksCisJCQkJCQkgIEdGUF9BVE9NSUMpOwogCQlpZiAoIWNoaWxkKSB7CiAJCQl3aGlsZSAobi0tKQogCQkJCWtmcmVlKGF4MjVfdGFibGVbbl0uY2hpbGQpOwpAQCAtMjE3LDcgKzIxOSw2IEBACiAJCQlzcGluX3VubG9ja19iaCgmYXgyNV9kZXZfbG9jayk7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtY3B5KGNoaWxkLCBheDI1X3BhcmFtX3RhYmxlLCBzaXplb2YoYXgyNV9wYXJhbV90YWJsZSkpOwogCQlheDI1X3RhYmxlW25dLmNoaWxkID0gYXgyNV9kZXYtPnN5c3RhYmxlID0gY2hpbGQ7CiAJCWF4MjVfdGFibGVbbl0uY3RsX25hbWUgICAgID0gbiArIDE7CiAJCWF4MjVfdGFibGVbbl0ucHJvY25hbWUgICAgID0gYXgyNV9kZXYtPmRldi0+bmFtZTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCmluZGV4IDMwNWEwOTkuLjY3ZGY5OWUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKKysrIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpAQCAtNDgsNDEgKzQ4LDU2IEBACiAjZGVmaW5lIEJUX0RCRyhELi4uKQogI2VuZGlmCiAKLSNkZWZpbmUgVkVSU0lPTiAiMi4xMCIKKyNkZWZpbmUgVkVSU0lPTiAiMi4xMSIKIAogLyogQmx1ZXRvb3RoIHNvY2tldHMgKi8KICNkZWZpbmUgQlRfTUFYX1BST1RPCTgKIHN0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqYnRfcHJvdG9bQlRfTUFYX1BST1RPXTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGJ0X3Byb3RvX2xvY2spOwogCiBpbnQgYnRfc29ja19yZWdpc3RlcihpbnQgcHJvdG8sIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5ICpvcHMpCiB7CisJaW50IGVyciA9IDA7CisKIAlpZiAocHJvdG8gPCAwIHx8IHByb3RvID49IEJUX01BWF9QUk9UTykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoYnRfcHJvdG9bcHJvdG9dKQotCQlyZXR1cm4gLUVFWElTVDsKKwl3cml0ZV9sb2NrKCZidF9wcm90b19sb2NrKTsKIAotCWJ0X3Byb3RvW3Byb3RvXSA9IG9wczsKLQlyZXR1cm4gMDsKKwlpZiAoYnRfcHJvdG9bcHJvdG9dKQorCQllcnIgPSAtRUVYSVNUOworCWVsc2UKKwkJYnRfcHJvdG9bcHJvdG9dID0gb3BzOworCisJd3JpdGVfdW5sb2NrKCZidF9wcm90b19sb2NrKTsKKworCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfcmVnaXN0ZXIpOwogCiBpbnQgYnRfc29ja191bnJlZ2lzdGVyKGludCBwcm90bykKIHsKKwlpbnQgZXJyID0gMDsKKwogCWlmIChwcm90byA8IDAgfHwgcHJvdG8gPj0gQlRfTUFYX1BST1RPKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghYnRfcHJvdG9bcHJvdG9dKQotCQlyZXR1cm4gLUVOT0VOVDsKKwl3cml0ZV9sb2NrKCZidF9wcm90b19sb2NrKTsKIAotCWJ0X3Byb3RvW3Byb3RvXSA9IE5VTEw7Ci0JcmV0dXJuIDA7CisJaWYgKCFidF9wcm90b1twcm90b10pCisJCWVyciA9IC1FTk9FTlQ7CisJZWxzZQorCQlidF9wcm90b1twcm90b10gPSBOVUxMOworCisJd3JpdGVfdW5sb2NrKCZidF9wcm90b19sb2NrKTsKKworCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKGJ0X3NvY2tfdW5yZWdpc3Rlcik7CiAKIHN0YXRpYyBpbnQgYnRfc29ja19jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvKQogewotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAKIAlpZiAocHJvdG8gPCAwIHx8IHByb3RvID49IEJUX01BWF9QUk9UTykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05MiwxMSArMTA3LDE4IEBACiAJCXJlcXVlc3RfbW9kdWxlKCJidC1wcm90by0lZCIsIHByb3RvKTsKIAl9CiAjZW5kaWYKKwogCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisKKwlyZWFkX2xvY2soJmJ0X3Byb3RvX2xvY2spOworCiAJaWYgKGJ0X3Byb3RvW3Byb3RvXSAmJiB0cnlfbW9kdWxlX2dldChidF9wcm90b1twcm90b10tPm93bmVyKSkgewogCQllcnIgPSBidF9wcm90b1twcm90b10tPmNyZWF0ZShzb2NrLCBwcm90byk7CiAJCW1vZHVsZV9wdXQoYnRfcHJvdG9bcHJvdG9dLT5vd25lcik7CiAJfQorCisJcmVhZF91bmxvY2soJmJ0X3Byb3RvX2xvY2spOworCiAJcmV0dXJuIGVycjsgCiB9CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmggYi9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oCmluZGV4IGJiYjFlZDcuLjBiNmNkMGUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmgKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaApAQCAtOTUsMTQgKzk1LDE0IEBACiBzdHJ1Y3QgYm5lcF9zZXRfZmlsdGVyX3JlcSB7CiAJX191OCAgdHlwZTsKIAlfX3U4ICBjdHJsOwotCV9fdTE2IGxlbjsKKwlfX2JlMTYgbGVuOwogCV9fdTggIGxpc3RbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgYm5lcF9jb250cm9sX3JzcCB7CiAJX191OCAgdHlwZTsKIAlfX3U4ICBjdHJsOwotCV9fdTE2IHJlc3A7CisJX19iZTE2IHJlc3A7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgYm5lcF9leHRfaGRyIHsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCmluZGV4IDIzMTJkMDUuLjdiYTY0NzAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtMTE3LDE4ICsxMTcsMTggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBibmVwX3NldF9kZWZhdWx0X3Byb3RvX2ZpbHRlcihzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzKQogewogCS8qIChJUHY0LCBBUlApICAqLwotCXMtPnByb3RvX2ZpbHRlclswXS5zdGFydCA9IGh0b25zKDB4MDgwMCk7Ci0Jcy0+cHJvdG9fZmlsdGVyWzBdLmVuZCAgID0gaHRvbnMoMHgwODA2KTsKKwlzLT5wcm90b19maWx0ZXJbMF0uc3RhcnQgPSBFVEhfUF9JUDsKKwlzLT5wcm90b19maWx0ZXJbMF0uZW5kICAgPSBFVEhfUF9BUlA7CiAJLyogKFJBUlAsIEFwcGxlVGFsaykgKi8KLQlzLT5wcm90b19maWx0ZXJbMV0uc3RhcnQgPSBodG9ucygweDgwMzUpOwotCXMtPnByb3RvX2ZpbHRlclsxXS5lbmQgICA9IGh0b25zKDB4ODBGMyk7CisJcy0+cHJvdG9fZmlsdGVyWzFdLnN0YXJ0ID0gRVRIX1BfUkFSUDsKKwlzLT5wcm90b19maWx0ZXJbMV0uZW5kICAgPSBFVEhfUF9BQVJQOwogCS8qIChJUFgsIElQdjYpICovCi0Jcy0+cHJvdG9fZmlsdGVyWzJdLnN0YXJ0ID0gaHRvbnMoMHg4MTM3KTsKLQlzLT5wcm90b19maWx0ZXJbMl0uZW5kICAgPSBodG9ucygweDg2REQpOworCXMtPnByb3RvX2ZpbHRlclsyXS5zdGFydCA9IEVUSF9QX0lQWDsKKwlzLT5wcm90b19maWx0ZXJbMl0uZW5kICAgPSBFVEhfUF9JUFY2OwogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgYm5lcF9jdHJsX3NldF9uZXRmaWx0ZXIoc3RydWN0IGJuZXBfc2Vzc2lvbiAqcywgdTE2ICpkYXRhLCBpbnQgbGVuKQorc3RhdGljIGludCBibmVwX2N0cmxfc2V0X25ldGZpbHRlcihzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzLCBfX2JlMTYgKmRhdGEsIGludCBsZW4pCiB7CiAJaW50IG47CiAKQEAgLTE1MCw4ICsxNTAsOCBAQAogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlmW2ldLnN0YXJ0ID0gZ2V0X3VuYWxpZ25lZChkYXRhKyspOwotCQkJZltpXS5lbmQgICA9IGdldF91bmFsaWduZWQoZGF0YSsrKTsKKwkJCWZbaV0uc3RhcnQgPSBudG9ocyhnZXRfdW5hbGlnbmVkKGRhdGErKykpOworCQkJZltpXS5lbmQgICA9IG50b2hzKGdldF91bmFsaWduZWQoZGF0YSsrKSk7CiAKIAkJCUJUX0RCRygicHJvdG8gZmlsdGVyIHN0YXJ0ICVkIGVuZCAlZCIsCiAJCQkJZltpXS5zdGFydCwgZltpXS5lbmQpOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJaWYgKGxlbiA8IDIpCiAJCXJldHVybiAtRUlMU0VROwogCi0JbiA9IG50b2hzKGdldF91bmFsaWduZWQoKHUxNiAqKSBkYXRhKSk7IAorCW4gPSBudG9ocyhnZXRfdW5hbGlnbmVkKChfX2JlMTYgKikgZGF0YSkpOwogCWRhdGEgKz0gMjsgbGVuIC09IDI7CiAKIAlpZiAobGVuIDwgbikKQEAgLTMzMiw3ICszMzIsNyBAQAogCWlmICghc2tiX3B1bGwoc2tiLCBfX2JuZXBfcnhfaGxlblt0eXBlICYgQk5FUF9UWVBFX01BU0tdKSkKIAkJZ290byBiYWRmcmFtZTsKIAotCXMtPmVoLmhfcHJvdG8gPSBnZXRfdW5hbGlnbmVkKCh1MTYgKikgKHNrYi0+ZGF0YSAtIDIpKTsKKwlzLT5laC5oX3Byb3RvID0gZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopIChza2ItPmRhdGEgLSAyKSk7CiAKIAlpZiAodHlwZSAmIEJORVBfRVhUX0hFQURFUikgewogCQlpZiAoYm5lcF9yeF9leHRlbnNpb24ocywgc2tiKSA8IDApCkBAIC0zNDMsNyArMzQzLDcgQEAKIAlpZiAobnRvaHMocy0+ZWguaF9wcm90bykgPT0gMHg4MTAwKSB7CiAJCWlmICghc2tiX3B1bGwoc2tiLCA0KSkKIAkJCWdvdG8gYmFkZnJhbWU7Ci0JCXMtPmVoLmhfcHJvdG8gPSBnZXRfdW5hbGlnbmVkKCh1MTYgKikgKHNrYi0+ZGF0YSAtIDIpKTsKKwkJcy0+ZWguaF9wcm90byA9IGdldF91bmFsaWduZWQoKF9fYmUxNiAqKSAoc2tiLT5kYXRhIC0gMikpOwogCX0KIAkKIAkvKiBXZSBoYXZlIHRvIGFsbG9jIG5ldyBza2IgYW5kIGNvcHkgZGF0YSBoZXJlIDooLiBCZWNhdXNlIG9yaWdpbmFsIHNrYgpAQCAtMzY1LDcgKzM2NSw3IEBACiAJY2FzZSBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFk6CiAJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4pLCBzLT5laC5oX2Rlc3QsIEVUSF9BTEVOKTsKIAkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4pOwotCQlwdXRfdW5hbGlnbmVkKHMtPmVoLmhfcHJvdG8sICh1MTYgKikgX19za2JfcHV0KG5za2IsIDIpKTsKKwkJcHV0X3VuYWxpZ25lZChzLT5laC5oX3Byb3RvLCAoX19iZTE2ICopIF9fc2tiX3B1dChuc2tiLCAyKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCTkVQX0NPTVBSRVNTRURfRFNUX09OTFk6CkBAIC0zNzUsNyArMzc1LDcgQEAKIAogCWNhc2UgQk5FUF9HRU5FUkFMOgogCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOICogMiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4gKiAyKTsKLQkJcHV0X3VuYWxpZ25lZChzLT5laC5oX3Byb3RvLCAodTE2ICopIF9fc2tiX3B1dChuc2tiLCAyKSk7CisJCXB1dF91bmFsaWduZWQocy0+ZWguaF9wcm90bywgKF9fYmUxNiAqKSBfX3NrYl9wdXQobnNrYiwgMikpOwogCQlicmVhazsKIAl9CiAKQEAgLTUyOCwxMiArNTI4LDEwIEBACiAJCXJldHVybiBOVUxMOwogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCBkc3QpOwotCWlmICghY29ubikKLQkJcmV0dXJuIE5VTEw7CiAKIAloY2lfZGV2X3B1dChoZGV2KTsKIAotCXJldHVybiAmY29ubi0+ZGV2OworCXJldHVybiBjb25uID8gJmNvbm4tPmRldiA6IE5VTEw7CiB9CiAKIGludCBibmVwX2FkZF9jb25uZWN0aW9uKHN0cnVjdCBibmVwX2Nvbm5hZGRfcmVxICpyZXEsIHN0cnVjdCBzb2NrZXQgKnNvY2spCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMKaW5kZXggN2Y3YjI3ZC4uNjdhMDAyYSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL25ldGRldi5jCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9uZXRkZXYuYwpAQCAtMTU4LDE0ICsxNTgsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdTE2IGJuZXBfbmV0X2V0aF9wcm90byhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBldGhoZHIgKmVoID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXUxNiBwcm90byA9IG50b2hzKGVoLT5oX3Byb3RvKTsKIAkKLQlpZiAobnRvaHMoZWgtPmhfcHJvdG8pID49IDE1MzYpCi0JCXJldHVybiBlaC0+aF9wcm90bzsKKwlpZiAocHJvdG8gPj0gMTUzNikKKwkJcmV0dXJuIHByb3RvOwogCQkKLQlpZiAoZ2V0X3VuYWxpZ25lZCgodTE2ICopIHNrYi0+ZGF0YSkgPT0gMHhGRkZGKQotCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzMpOworCWlmIChnZXRfdW5hbGlnbmVkKChfX2JlMTYgKikgc2tiLT5kYXRhKSA9PSBodG9ucygweEZGRkYpKQorCQlyZXR1cm4gRVRIX1BfODAyXzM7CiAJCQotCXJldHVybiBodG9ucyhFVEhfUF84MDJfMik7CisJcmV0dXJuIEVUSF9QXzgwMl8yOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBibmVwX25ldF9wcm90b19maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvc29jay5jCmluZGV4IDI4YzU1ODMuLjU1NjNkYjEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL3NvY2suYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTQ2LDI0ICsxNDcsNTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBpbnQgYm5lcF9zb2NrX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZiAoY21kID09IEJORVBHRVRDT05OTElTVCkgeworCQlzdHJ1Y3QgYm5lcF9jb25ubGlzdF9yZXEgY2w7CisJCXVpbnQzMl90IHVjaTsKKwkJaW50IGVycjsKKworCQlpZiAoZ2V0X3VzZXIoY2wuY251bSwgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpIHx8CisJCQkJZ2V0X3VzZXIodWNpLCAodTMyIF9fdXNlciAqKSAoYXJnICsgNCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY2wuY2kgPSBjb21wYXRfcHRyKHVjaSk7CisKKwkJaWYgKGNsLmNudW0gPD0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQorCQllcnIgPSBibmVwX2dldF9jb25ubGlzdCgmY2wpOworCisJCWlmICghZXJyICYmIHB1dF91c2VyKGNsLmNudW0sICh1aW50MzJfdCBfX3VzZXIgKikgYXJnKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gYm5lcF9zb2NrX2lvY3RsKHNvY2ssIGNtZCwgYXJnKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBibmVwX3NvY2tfb3BzID0gewotCS5mYW1pbHkgICAgID0gUEZfQkxVRVRPT1RILAotCS5vd25lciAgICAgID0gVEhJU19NT0RVTEUsCi0JLnJlbGVhc2UgICAgPSBibmVwX3NvY2tfcmVsZWFzZSwKLQkuaW9jdGwgICAgICA9IGJuZXBfc29ja19pb2N0bCwKLQkuYmluZCAgICAgICA9IHNvY2tfbm9fYmluZCwKLQkuZ2V0bmFtZSAgICA9IHNvY2tfbm9fZ2V0bmFtZSwKLQkuc2VuZG1zZyAgICA9IHNvY2tfbm9fc2VuZG1zZywKLQkucmVjdm1zZyAgICA9IHNvY2tfbm9fcmVjdm1zZywKLQkucG9sbCAgICAgICA9IHNvY2tfbm9fcG9sbCwKLQkubGlzdGVuICAgICA9IHNvY2tfbm9fbGlzdGVuLAotCS5zaHV0ZG93biAgID0gc29ja19ub19zaHV0ZG93biwKLQkuc2V0c29ja29wdCA9IHNvY2tfbm9fc2V0c29ja29wdCwKLQkuZ2V0c29ja29wdCA9IHNvY2tfbm9fZ2V0c29ja29wdCwKLQkuY29ubmVjdCAgICA9IHNvY2tfbm9fY29ubmVjdCwKLQkuc29ja2V0cGFpciA9IHNvY2tfbm9fc29ja2V0cGFpciwKLQkuYWNjZXB0ICAgICA9IHNvY2tfbm9fYWNjZXB0LAotCS5tbWFwICAgICAgID0gc29ja19ub19tbWFwCisJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gYm5lcF9zb2NrX3JlbGVhc2UsCisJLmlvY3RsCQk9IGJuZXBfc29ja19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGJuZXBfc29ja19jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkuYmluZAkJPSBzb2NrX25vX2JpbmQsCisJLmdldG5hbWUJPSBzb2NrX25vX2dldG5hbWUsCisJLnNlbmRtc2cJPSBzb2NrX25vX3NlbmRtc2csCisJLnJlY3Ztc2cJPSBzb2NrX25vX3JlY3Ztc2csCisJLnBvbGwJCT0gc29ja19ub19wb2xsLAorCS5saXN0ZW4JCT0gc29ja19ub19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKKwkuY29ubmVjdAk9IHNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcAogfTsKIAogc3RhdGljIHN0cnVjdCBwcm90byBibmVwX3Byb3RvID0gewpAQCAtMTgxLDcgKzIxNCw3IEBACiAJaWYgKHNvY2stPnR5cGUgIT0gU09DS19SQVcpCiAJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOwogCi0Jc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIEdGUF9LRVJORUwsICZibmVwX3Byb3RvLCAxKTsKKwlzayA9IHNrX2FsbG9jKFBGX0JMVUVUT09USCwgR0ZQX0FUT01JQywgJmJuZXBfcHJvdG8sIDEpOwogCWlmICghc2spCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvc29jay5jIGIvbmV0L2JsdWV0b290aC9jbXRwL3NvY2suYwppbmRleCAxMGFkN2ZkLi41MzI5NWQzIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2NtdHAvc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9zb2NrLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogCiAjaW5jbHVkZSA8bGludXgvaXNkbi9jYXBpbGxpLmg+CkBAIC0xMzcsMTEgKzEzOCw0MyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGludCBjbXRwX3NvY2tfY29tcGF0X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWlmIChjbWQgPT0gQ01UUEdFVENPTk5MSVNUKSB7CisJCXN0cnVjdCBjbXRwX2Nvbm5saXN0X3JlcSBjbDsKKwkJdWludDMyX3QgdWNpOworCQlpbnQgZXJyOworCisJCWlmIChnZXRfdXNlcihjbC5jbnVtLCAodWludDMyX3QgX191c2VyICopIGFyZykgfHwKKwkJCQlnZXRfdXNlcih1Y2ksICh1MzIgX191c2VyICopIChhcmcgKyA0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQljbC5jaSA9IGNvbXBhdF9wdHIodWNpKTsKKworCQlpZiAoY2wuY251bSA8PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCisJCWVyciA9IGNtdHBfZ2V0X2Nvbm5saXN0KCZjbCk7CisKKwkJaWYgKCFlcnIgJiYgcHV0X3VzZXIoY2wuY251bSwgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpKQorCQkJZXJyID0gLUVGQVVMVDsKKworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBjbXRwX3NvY2tfaW9jdGwoc29jaywgY21kLCBhcmcpOworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIGNtdHBfc29ja19vcHMgPSB7CiAJLmZhbWlseQkJPSBQRl9CTFVFVE9PVEgsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5yZWxlYXNlCT0gY210cF9zb2NrX3JlbGVhc2UsCiAJLmlvY3RsCQk9IGNtdHBfc29ja19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGNtdHBfc29ja19jb21wYXRfaW9jdGwsCisjZW5kaWYKIAkuYmluZAkJPSBzb2NrX25vX2JpbmQsCiAJLmdldG5hbWUJPSBzb2NrX25vX2dldG5hbWUsCiAJLnNlbmRtc2cJPSBzb2NrX25vX3NlbmRtc2csCkBAIC0xNzIsNyArMjA1LDcgQEAKIAlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1JBVykKIAkJcmV0dXJuIC1FU09DS1ROT1NVUFBPUlQ7CiAKLQlzayA9IHNrX2FsbG9jKFBGX0JMVUVUT09USCwgR0ZQX0tFUk5FTCwgJmNtdHBfcHJvdG8sIDEpOworCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfQVRPTUlDLCAmY210cF9wcm90bywgMSk7CiAJaWYgKCFzaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwppbmRleCA5MGUzYTI4Li42Y2Q1NzExIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCkBAIC01MSw3ICs1MSw3IEBACiAjZGVmaW5lIEJUX0RCRyhELi4uKQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGhjaV9hY2xfY29ubmVjdChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCit2b2lkIGhjaV9hY2xfY29ubmVjdChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OwogCXN0cnVjdCBpbnF1aXJ5X2VudHJ5ICppZTsKQEAgLTYzLDYgKzYzLDggQEAKIAljb25uLT5vdXQgICA9IDE7CiAJY29ubi0+bGlua19tb2RlID0gSENJX0xNX01BU1RFUjsKIAorCWNvbm4tPmF0dGVtcHQrKzsKKwogCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOwogCWJhY3B5KCZjcC5iZGFkZHIsICZjb25uLT5kc3QpOwogCWNwLnBzY2FuX3JlcF9tb2RlID0gMHgwMjsKQEAgLTgwLDcgKzgyLDcgQEAKIAkJY3Aucm9sZV9zd2l0Y2gJPSAweDAxOwogCWVsc2UKIAkJY3Aucm9sZV9zd2l0Y2gJPSAweDAwOwotCQkKKwogCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9DUkVBVEVfQ09OTiwgc2l6ZW9mKGNwKSwgJmNwKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYyBiL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKaW5kZXggZDQzZDBjOC4uYmI5NGU2ZCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCkBAIC01Nyw2ICs1Nyw3IEBACiBzdGF0aWMgdm9pZCBoY2lfY2NfbGlua19jdGwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9jZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfX3U4IHN0YXR1czsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKnBlbmQ7CiAKIAlCVF9EQkcoIiVzIG9jZiAweCV4IiwgaGRldi0+bmFtZSwgb2NmKTsKIApAQCAtNzEsNiArNzIsMTUgQEAKIAkJCWNsZWFyX2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKTsKIAkJCWhjaV9yZXFfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKIAkJfQorCisJCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCQlwZW5kID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfc3RhdGUoaGRldiwgQUNMX0xJTkssIEJUX0NPTk5FQ1QyKTsKKwkJaWYgKHBlbmQpCisJCQloY2lfYWNsX2Nvbm5lY3QocGVuZCk7CisKKwkJaGNpX2Rldl91bmxvY2soaGRldik7CisKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNDE0LDkgKzQyNCwxMiBAQAogCiAJaWYgKHN0YXR1cykgewogCQlpZiAoY29ubiAmJiBjb25uLT5zdGF0ZSA9PSBCVF9DT05ORUNUKSB7Ci0JCQljb25uLT5zdGF0ZSA9IEJUX0NMT1NFRDsKLQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBzdGF0dXMpOwotCQkJaGNpX2Nvbm5fZGVsKGNvbm4pOworCQkJaWYgKHN0YXR1cyAhPSAweDBjIHx8IGNvbm4tPmF0dGVtcHQgPiAyKSB7CisJCQkJY29ubi0+c3RhdGUgPSBCVF9DTE9TRUQ7CisJCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCQkJaGNpX2Nvbm5fZGVsKGNvbm4pOworCQkJfSBlbHNlCisJCQkJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNUMjsKIAkJfQogCX0gZWxzZSB7CiAJCWlmICghY29ubikgewpAQCAtNTYyLDExICs1NzUsMjAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfaW5xdWlyeV9jb21wbGV0ZV9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJX191OCBzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisJc3RydWN0IGhjaV9jb25uICpwZW5kOwogCiAJQlRfREJHKCIlcyBzdGF0dXMgJWQiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOwogCiAJY2xlYXJfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpOwogCWhjaV9yZXFfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCXBlbmQgPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9zdGF0ZShoZGV2LCBBQ0xfTElOSywgQlRfQ09OTkVDVDIpOworCWlmIChwZW5kKQorCQloY2lfYWNsX2Nvbm5lY3QocGVuZCk7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KIAogLyogSW5xdWlyeSBSZXN1bHQgKi8KQEAgLTcyOCw3ICs3NTAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9jb25uX2NvbXBsZXRlX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaGNpX2V2X2Nvbm5fY29tcGxldGUgKmV2ID0gKHN0cnVjdCBoY2lfZXZfY29ubl9jb21wbGV0ZSAqKSBza2ItPmRhdGE7Ci0Jc3RydWN0IGhjaV9jb25uICpjb25uOworCXN0cnVjdCBoY2lfY29ubiAqY29ubiwgKnBlbmQ7CiAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKQEAgLTgwMSw2ICs4MjMsMTAgQEAKIAlpZiAoZXYtPnN0YXR1cykKIAkJaGNpX2Nvbm5fZGVsKGNvbm4pOwogCisJcGVuZCA9IGhjaV9jb25uX2hhc2hfbG9va3VwX3N0YXRlKGhkZXYsIEFDTF9MSU5LLCBCVF9DT05ORUNUMik7CisJaWYgKHBlbmQpCisJCWhjaV9hY2xfY29ubmVjdChwZW5kKTsKKwogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKaW5kZXggMWEzNWQzNC4uZGJmOThjNCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpAQCAtMTIwLDEwICsxMjAsMTMgQEAKIAkJCWlmICghaGNpX3Rlc3RfYml0KGV2dCwgJmZsdC0+ZXZlbnRfbWFzaykpCiAJCQkJY29udGludWU7CiAKLQkJCWlmIChmbHQtPm9wY29kZSAmJiAoKGV2dCA9PSBIQ0lfRVZfQ01EX0NPTVBMRVRFICYmIAotCQkJCQlmbHQtPm9wY29kZSAhPSAqKF9fdTE2ICopKHNrYi0+ZGF0YSArIDMpKSB8fAotCQkJCQkoZXZ0ID09IEhDSV9FVl9DTURfU1RBVFVTICYmIAotCQkJCQlmbHQtPm9wY29kZSAhPSAqKF9fdTE2ICopKHNrYi0+ZGF0YSArIDQpKSkpCisJCQlpZiAoZmx0LT5vcGNvZGUgJiYKKwkJCSAgICAoKGV2dCA9PSBIQ0lfRVZfQ01EX0NPTVBMRVRFICYmCisJCQkgICAgICBmbHQtPm9wY29kZSAhPQorCQkJICAgICAgZ2V0X3VuYWxpZ25lZCgoX19sZTE2ICopKHNrYi0+ZGF0YSArIDMpKSkgfHwKKwkJCSAgICAgKGV2dCA9PSBIQ0lfRVZfQ01EX1NUQVRVUyAmJgorCQkJICAgICAgZmx0LT5vcGNvZGUgIT0KKwkJCSAgICAgIGdldF91bmFsaWduZWQoKF9fbGUxNiAqKShza2ItPmRhdGEgKyA0KSkpKSkKIAkJCQljb250aW51ZTsKIAkJfQogCkBAIC02MTgsNyArNjIxLDcgQEAKIAogCXNvY2stPm9wcyA9ICZoY2lfc29ja19vcHM7CiAKLQlzayA9IHNrX2FsbG9jKFBGX0JMVUVUT09USCwgR0ZQX0tFUk5FTCwgJmhjaV9za19wcm90bywgMSk7CisJc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIEdGUF9BVE9NSUMsICZoY2lfc2tfcHJvdG8sIDEpOwogCWlmICghc2spCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jIGIvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYwppbmRleCA5ODliMjJkLi5kNGM5MzU2IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMKQEAgLTIzNywxNSArMjM3LDE5IEBACiAJa2ZyZWUoZGF0YSk7CiB9CiAKLXN0YXRpYyB2b2lkIGFkZF9jb25uKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBhZGRfY29ubihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGhjaV9jb25uICpjb25uID0gZGF0YTsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhjaV9jb25uLCB3b3JrKTsKIAlpbnQgaTsKIAotCWRldmljZV9yZWdpc3RlcigmY29ubi0+ZGV2KTsKKwlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZjb25uLT5kZXYpIDwgMCkgeworCQlCVF9FUlIoIkZhaWxlZCB0byByZWdpc3RlciBjb25uZWN0aW9uIGRldmljZSIpOworCQlyZXR1cm47CisJfQogCiAJZm9yIChpID0gMDsgY29ubl9hdHRyc1tpXTsgaSsrKQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNvbm4tPmRldiwgY29ubl9hdHRyc1tpXSk7CisJCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJmNvbm4tPmRldiwgY29ubl9hdHRyc1tpXSkgPCAwKQorCQkJQlRfRVJSKCJGYWlsZWQgdG8gY3JlYXRlIGNvbm5lY3Rpb24gYXR0cmlidXRlIik7CiB9CiAKIHZvaWQgaGNpX2Nvbm5fYWRkX3N5c2ZzKHN0cnVjdCBoY2lfY29ubiAqY29ubikKQEAgLTI1NSw3ICsyNTksOSBAQAogCiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKLQljb25uLT5kZXYucGFyZW50ICA9ICZoZGV2LT5kZXY7CisJY29ubi0+ZGV2LmJ1cyA9ICZidF9idXM7CisJY29ubi0+ZGV2LnBhcmVudCA9ICZoZGV2LT5kZXY7CisKIAljb25uLT5kZXYucmVsZWFzZSA9IGJ0X3JlbGVhc2U7CiAKIAlzbnByaW50Zihjb25uLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwKQEAgLTI2NiwxNCArMjcyLDE0IEBACiAKIAlkZXZfc2V0X2RydmRhdGEoJmNvbm4tPmRldiwgY29ubik7CiAKLQlJTklUX1dPUksoJmNvbm4tPndvcmssIGFkZF9jb25uLCAodm9pZCAqKSBjb25uKTsKKwlJTklUX1dPUksoJmNvbm4tPndvcmssIGFkZF9jb25uKTsKIAogCXNjaGVkdWxlX3dvcmsoJmNvbm4tPndvcmspOwogfQogCi1zdGF0aWMgdm9pZCBkZWxfY29ubih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZGVsX2Nvbm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IGRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBoY2lfY29ubiwgd29yayk7CiAJZGV2aWNlX2RlbCgmY29ubi0+ZGV2KTsKIH0KIApAQCAtMjgxLDcgKzI4Nyw3IEBACiB7CiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKLQlJTklUX1dPUksoJmNvbm4tPndvcmssIGRlbF9jb25uLCAodm9pZCAqKSBjb25uKTsKKwlJTklUX1dPUksoJmNvbm4tPndvcmssIGRlbF9jb25uKTsKIAogCXNjaGVkdWxlX3dvcmsoJmNvbm4tPndvcmspOwogfQpAQCAtMjk1LDExICszMDEsNyBAQAogCUJUX0RCRygiJXAgbmFtZSAlcyB0eXBlICVkIiwgaGRldiwgaGRldi0+bmFtZSwgaGRldi0+dHlwZSk7CiAKIAlkZXYtPmNsYXNzID0gYnRfY2xhc3M7Ci0KLQlpZiAoaGRldi0+cGFyZW50KQotCQlkZXYtPnBhcmVudCA9IGhkZXYtPnBhcmVudDsKLQllbHNlCi0JCWRldi0+cGFyZW50ID0gJmJ0X3BsYXRmb3JtLT5kZXY7CisJZGV2LT5wYXJlbnQgPSBoZGV2LT5wYXJlbnQ7CiAKIAlzdHJsY3B5KGRldi0+YnVzX2lkLCBoZGV2LT5uYW1lLCBCVVNfSURfU0laRSk7CiAKQEAgLTMxMiw3ICszMTQsOCBAQAogCQlyZXR1cm4gZXJyOwogCiAJZm9yIChpID0gMDsgYnRfYXR0cnNbaV07IGkrKykKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgYnRfYXR0cnNbaV0pOworCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgYnRfYXR0cnNbaV0pIDwgMCkKKwkJCUJUX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2UgYXR0cmlidXRlIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IDAzYjVkYWQuLjY2NzgyMDEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtNTA3LDE1ICs1MDcsMTMgQEAKIAogCWhpZHBfZGVsX3RpbWVyKHNlc3Npb24pOwogCi0JaWYgKGludHJfc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKLQkJd2FpdF9ldmVudF90aW1lb3V0KCooY3RybF9zay0+c2tfc2xlZXApLCAoY3RybF9zay0+c2tfc3RhdGUgPT0gQlRfQ0xPU0VEKSwgSFopOworCWZwdXQoc2Vzc2lvbi0+aW50cl9zb2NrLT5maWxlKTsKKworCXdhaXRfZXZlbnRfdGltZW91dCgqKGN0cmxfc2stPnNrX3NsZWVwKSwKKwkJKGN0cmxfc2stPnNrX3N0YXRlID09IEJUX0NMT1NFRCksIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CiAKIAlmcHV0KHNlc3Npb24tPmN0cmxfc29jay0+ZmlsZSk7CiAKLQl3YWl0X2V2ZW50X3RpbWVvdXQoKihpbnRyX3NrLT5za19zbGVlcCksIChpbnRyX3NrLT5za19zdGF0ZSA9PSBCVF9DTE9TRUQpLCBIWik7Ci0KLQlmcHV0KHNlc3Npb24tPmludHJfc29jay0+ZmlsZSk7Ci0KIAlfX2hpZHBfdW5saW5rX3Nlc3Npb24oc2Vzc2lvbik7CiAKIAlpZiAoc2Vzc2lvbi0+aW5wdXQpIHsKQEAgLTU0MSwxMiArNTM5LDEwIEBACiAJCXJldHVybiBOVUxMOwogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCBkc3QpOwotCWlmICghY29ubikKLQkJcmV0dXJuIE5VTEw7CiAKIAloY2lfZGV2X3B1dChoZGV2KTsKIAotCXJldHVybiAmY29ubi0+ZGV2OworCXJldHVybiBjb25uID8gJmNvbm4tPmRldiA6IE5VTEw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoaWRwX3NldHVwX2lucHV0KHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXEpCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jIGIvbmV0L2JsdWV0b290aC9oaWRwL3NvY2suYwppbmRleCAwOTk2NDZlLi40MDdmYmE0IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hpZHAvc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGlkcC9zb2NrLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgImhpZHAuaCIKQEAgLTE0MywxMSArMTQ0LDg4IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdHJ1Y3QgY29tcGF0X2hpZHBfY29ubmFkZF9yZXEgeworCWludCAgIGN0cmxfc29jazsJLy8gQ29ubmVjdGVkIGNvbnRyb2wgc29ja2V0CisJaW50ICAgaW50cl9zb2NrOwkvLyBDb25udGV0ZWQgaW50ZXJydXB0IHNvY2tldAorCV9fdTE2IHBhcnNlcjsKKwlfX3UxNiByZF9zaXplOworCWNvbXBhdF91cHRyX3QgcmRfZGF0YTsKKwlfX3U4ICBjb3VudHJ5OworCV9fdTggIHN1YmNsYXNzOworCV9fdTE2IHZlbmRvcjsKKwlfX3UxNiBwcm9kdWN0OworCV9fdTE2IHZlcnNpb247CisJX191MzIgZmxhZ3M7CisJX191MzIgaWRsZV90bzsKKwljaGFyICBuYW1lWzEyOF07Cit9OworCitzdGF0aWMgaW50IGhpZHBfc29ja19jb21wYXRfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKGNtZCA9PSBISURQR0VUQ09OTkxJU1QpIHsKKwkJc3RydWN0IGhpZHBfY29ubmxpc3RfcmVxIGNsOworCQl1aW50MzJfdCB1Y2k7CisJCWludCBlcnI7CisKKwkJaWYgKGdldF91c2VyKGNsLmNudW0sICh1aW50MzJfdCBfX3VzZXIgKikgYXJnKSB8fAorCQkJCWdldF91c2VyKHVjaSwgKHUzMiBfX3VzZXIgKikgKGFyZyArIDQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWNsLmNpID0gY29tcGF0X3B0cih1Y2kpOworCisJCWlmIChjbC5jbnVtIDw9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQllcnIgPSBoaWRwX2dldF9jb25ubGlzdCgmY2wpOworCisJCWlmICghZXJyICYmIHB1dF91c2VyKGNsLmNudW0sICh1aW50MzJfdCBfX3VzZXIgKikgYXJnKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgaWYgKGNtZCA9PSBISURQQ09OTkFERCkgeworCQlzdHJ1Y3QgY29tcGF0X2hpZHBfY29ubmFkZF9yZXEgY2E7CisJCXN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxIF9fdXNlciAqdWNhOworCisJCXVjYSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdWNhKSk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjYSwgKHZvaWQgKikgYXJnLCBzaXplb2YoY2EpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChwdXRfdXNlcihjYS5jdHJsX3NvY2ssICZ1Y2EtPmN0cmxfc29jaykgfHwKKwkJCQlwdXRfdXNlcihjYS5pbnRyX3NvY2ssICZ1Y2EtPmludHJfc29jaykgfHwKKwkJCQlwdXRfdXNlcihjYS5wYXJzZXIsICZ1Y2EtPnBhcnNlcikgfHwKKwkJCQlwdXRfdXNlcihjYS5yZF9zaXplLCAmdWNhLT5wYXJzZXIpIHx8CisJCQkJcHV0X3VzZXIoY29tcGF0X3B0cihjYS5yZF9kYXRhKSwgJnVjYS0+cmRfZGF0YSkgfHwKKwkJCQlwdXRfdXNlcihjYS5jb3VudHJ5LCAmdWNhLT5jb3VudHJ5KSB8fAorCQkJCXB1dF91c2VyKGNhLnN1YmNsYXNzLCAmdWNhLT5zdWJjbGFzcykgfHwKKwkJCQlwdXRfdXNlcihjYS52ZW5kb3IsICZ1Y2EtPnZlbmRvcikgfHwKKwkJCQlwdXRfdXNlcihjYS5wcm9kdWN0LCAmdWNhLT5wcm9kdWN0KSB8fAorCQkJCXB1dF91c2VyKGNhLnZlcnNpb24sICZ1Y2EtPnZlcnNpb24pIHx8CisJCQkJcHV0X3VzZXIoY2EuZmxhZ3MsICZ1Y2EtPmZsYWdzKSB8fAorCQkJCXB1dF91c2VyKGNhLmlkbGVfdG8sICZ1Y2EtPmlkbGVfdG8pIHx8CisJCQkJY29weV90b191c2VyKCZ1Y2EtPm5hbWVbMF0sICZjYS5uYW1lWzBdLCAxMjgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCQlhcmcgPSAodW5zaWduZWQgbG9uZykgdWNhOworCisJCS8qIEZhbGwgdGhyb3VnaC4gV2UgZG9uJ3QgYWN0dWFsbHkgd3JpdGUgYmFjayBhbnkgX2NoYW5nZXNfCisJCSAgIHRvIHRoZSBzdHJ1Y3R1cmUgYW55d2F5LCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gY29weSBiYWNrCisJCSAgIGludG8gdGhlIG9yaWdpbmFsIGNvbXBhdCB2ZXJzaW9uICovCisJfQorCisJcmV0dXJuIGhpZHBfc29ja19pb2N0bChzb2NrLCBjbWQsIGFyZyk7Cit9CisjZW5kaWYKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgaGlkcF9zb2NrX29wcyA9IHsKIAkuZmFtaWx5CQk9IFBGX0JMVUVUT09USCwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLnJlbGVhc2UJPSBoaWRwX3NvY2tfcmVsZWFzZSwKIAkuaW9jdGwJCT0gaGlkcF9zb2NrX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gaGlkcF9zb2NrX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogCS5iaW5kCQk9IHNvY2tfbm9fYmluZCwKIAkuZ2V0bmFtZQk9IHNvY2tfbm9fZ2V0bmFtZSwKIAkuc2VuZG1zZwk9IHNvY2tfbm9fc2VuZG1zZywKQEAgLTE3OCw3ICsyNTYsNyBAQAogCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUkFXKQogCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKIAotCXNrID0gc2tfYWxsb2MoUEZfQkxVRVRPT1RILCBHRlBfS0VSTkVMLCAmaGlkcF9wcm90bywgMSk7CisJc2sgPSBza19hbGxvYyhQRl9CTFVFVE9PVEgsIEdGUF9BVE9NSUMsICZoaWRwX3Byb3RvLCAxKTsKIAlpZiAoIXNrKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcC5jIGIvbmV0L2JsdWV0b290aC9sMmNhcC5jCmluZGV4IGQ1NmY2MGIuLjI5YThmYTQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXAuYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKQEAgLTU1OSw3ICs1NTksNyBAQAogCiAJc29jay0+b3BzID0gJmwyY2FwX3NvY2tfb3BzOwogCi0Jc2sgPSBsMmNhcF9zb2NrX2FsbG9jKHNvY2ssIHByb3RvY29sLCBHRlBfS0VSTkVMKTsKKwlzayA9IGwyY2FwX3NvY2tfYWxsb2Moc29jaywgcHJvdG9jb2wsIEdGUF9BVE9NSUMpOwogCWlmICghc2spCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC03NzAsNyArNzcwLDcgQEAKIAlsb25nIHRpbWVvOwogCWludCBlcnIgPSAwOwogCi0JbG9ja19zb2NrKHNrKTsKKwlsb2NrX3NvY2tfbmVzdGVkKHNrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKIAlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0xJU1RFTikgewogCQllcnIgPSAtRUJBREZEOwpAQCAtNzkyLDcgKzc5Miw3IEBACiAKIAkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKLQkJbG9ja19zb2NrKHNrKTsKKwkJbG9ja19zb2NrX25lc3RlZChzaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwogCiAJCWlmIChzay0+c2tfc3RhdGUgIT0gQlRfTElTVEVOKSB7CiAJCQllcnIgPSAtRUJBREZEOwpAQCAtMTM1MywxMiArMTM1MywxMiBAQAogCiAJLyogQ29uZmlndXJlIG91dHB1dCBvcHRpb25zIGFuZCBsZXQgdGhlIG90aGVyIHNpZGUga25vdwogCSAqIHdoaWNoIG9uZXMgd2UgZG9uJ3QgbGlrZS4gKi8KLQlpZiAocGktPmNvbmZfbXR1IDwgcGktPm9tdHUpIHsKLQkJbDJjYXBfYWRkX2NvbmZfb3B0KHB0ciwgTDJDQVBfQ09ORl9NVFUsIDIsIHBpLT5vbXR1KTsKKwlpZiAocGktPmNvbmZfbXR1IDwgcGktPm9tdHUpCiAJCXJlc3VsdCA9IEwyQ0FQX0NPTkZfVU5BQ0NFUFQ7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXBpLT5vbXR1ID0gcGktPmNvbmZfbXR1OwotCX0KKworCWwyY2FwX2FkZF9jb25mX29wdChwdHIsIEwyQ0FQX0NPTkZfTVRVLCAyLCBwaS0+b210dSk7CiAKIAlCVF9EQkcoInNrICVwIHJlc3VsdCAlZCIsIHNrLCByZXN1bHQpOwogCXJldHVybiByZXN1bHQ7CkBAIC0xNTMzLDYgKzE1MzMsOSBAQAogCWlmICghKHNrID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZCgmY29ubi0+Y2hhbl9saXN0LCBkY2lkKSkpCiAJCXJldHVybiAtRU5PRU5UOwogCisJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9ESVNDT05OKQorCQlnb3RvIHVubG9jazsKKwogCWwyY2FwX3BhcnNlX2NvbmZfcmVxKHNrLCByZXEtPmRhdGEsIGNtZC0+bGVuIC0gc2l6ZW9mKCpyZXEpKTsKIAogCWlmIChmbGFncyAmIDB4MDAwMSkgewpAQCAtMjIxNiw3ICsyMjE5LDggQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQljbGFzc19jcmVhdGVfZmlsZShidF9jbGFzcywgJmNsYXNzX2F0dHJfbDJjYXApOworCWlmIChjbGFzc19jcmVhdGVfZmlsZShidF9jbGFzcywgJmNsYXNzX2F0dHJfbDJjYXApIDwgMCkKKwkJQlRfRVJSKCJGYWlsZWQgdG8gY3JlYXRlIEwyQ0FQIGluZm8gZmlsZSIpOwogCiAJQlRfSU5GTygiTDJDQVAgdmVyICVzIiwgVkVSU0lPTik7CiAJQlRfSU5GTygiTDJDQVAgc29ja2V0IGxheWVyIGluaXRpYWxpemVkIik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKaW5kZXggNDY4ZGYzYi4uMjc4Yzg2NyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYwpAQCAtODU0LDcgKzg1NCw3IEBACiAJcnBuLT5mbG93X2N0cmwgICAgID0gZmxvd19jdHJsX3NldHRpbmdzOwogCXJwbi0+eG9uX2NoYXIgICAgICA9IHhvbl9jaGFyOwogCXJwbi0+eG9mZl9jaGFyICAgICA9IHhvZmZfY2hhcjsKLQlycG4tPnBhcmFtX21hc2sgICAgPSBwYXJhbV9tYXNrOworCXJwbi0+cGFyYW1fbWFzayAgICA9IGNwdV90b19sZTE2KHBhcmFtX21hc2spOwogCiAJKnB0ciA9IF9fZmNzKGJ1Zik7IHB0cisrOwogCkBAIC0xMDE4LDcgKzEwMTgsNyBAQAogCiAJaWYgKGxlbiA+IDEyNykgewogCQloZHIgPSAodm9pZCAqKSBza2JfcHVzaChza2IsIDQpOwotCQlwdXRfdW5hbGlnbmVkKGh0b2JzKF9fbGVuMTYobGVuKSksICh1MTYgKikgJmhkci0+bGVuKTsKKwkJcHV0X3VuYWxpZ25lZChodG9icyhfX2xlbjE2KGxlbikpLCAoX19sZTE2ICopICZoZHItPmxlbik7CiAJfSBlbHNlIHsKIAkJaGRyID0gKHZvaWQgKikgc2tiX3B1c2goc2tiLCAzKTsKIAkJaGRyLT5sZW4gPSBfX2xlbjgobGVuKTsKQEAgLTEzNDMsNyArMTM0Myw3IEBACiAJLyogQ2hlY2sgZm9yIHNhbmUgdmFsdWVzLCBpZ25vcmUvYWNjZXB0IGJpdF9yYXRlLCA4IGJpdHMsIDEgc3RvcCBiaXQsCiAJICogbm8gcGFyaXR5LCBubyBmbG93IGNvbnRyb2wgbGluZXMsIG5vcm1hbCBYT04vWE9GRiBjaGFycyAqLwogCi0JaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fQklUUkFURSkgeworCWlmIChycG4tPnBhcmFtX21hc2sgJiBjcHVfdG9fbGUxNihSRkNPTU1fUlBOX1BNX0JJVFJBVEUpKSB7CiAJCWJpdF9yYXRlID0gcnBuLT5iaXRfcmF0ZTsKIAkJaWYgKGJpdF9yYXRlICE9IFJGQ09NTV9SUE5fQlJfMTE1MjAwKSB7CiAJCQlCVF9EQkcoIlJQTiBiaXQgcmF0ZSBtaXNtYXRjaCAweCV4IiwgYml0X3JhdGUpOwpAQCAtMTM1Miw3ICsxMzUyLDcgQEAKIAkJfQogCX0KIAotCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX0RBVEEpIHsKKwlpZiAocnBuLT5wYXJhbV9tYXNrICYgY3B1X3RvX2xlMTYoUkZDT01NX1JQTl9QTV9EQVRBKSkgewogCQlkYXRhX2JpdHMgPSBfX2dldF9ycG5fZGF0YV9iaXRzKHJwbi0+bGluZV9zZXR0aW5ncyk7CiAJCWlmIChkYXRhX2JpdHMgIT0gUkZDT01NX1JQTl9EQVRBXzgpIHsKIAkJCUJUX0RCRygiUlBOIGRhdGEgYml0cyBtaXNtYXRjaCAweCV4IiwgZGF0YV9iaXRzKTsKQEAgLTEzNjEsNyArMTM2MSw3IEBACiAJCX0KIAl9CiAKLQlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9TVE9QKSB7CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIGNwdV90b19sZTE2KFJGQ09NTV9SUE5fUE1fU1RPUCkpIHsKIAkJc3RvcF9iaXRzID0gX19nZXRfcnBuX3N0b3BfYml0cyhycG4tPmxpbmVfc2V0dGluZ3MpOwogCQlpZiAoc3RvcF9iaXRzICE9IFJGQ09NTV9SUE5fU1RPUF8xKSB7CiAJCQlCVF9EQkcoIlJQTiBzdG9wIGJpdHMgbWlzbWF0Y2ggMHgleCIsIHN0b3BfYml0cyk7CkBAIC0xMzcwLDcgKzEzNzAsNyBAQAogCQl9CiAJfQogCi0JaWYgKHJwbi0+cGFyYW1fbWFzayAmIFJGQ09NTV9SUE5fUE1fUEFSSVRZKSB7CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIGNwdV90b19sZTE2KFJGQ09NTV9SUE5fUE1fUEFSSVRZKSkgewogCQlwYXJpdHkgPSBfX2dldF9ycG5fcGFyaXR5KHJwbi0+bGluZV9zZXR0aW5ncyk7CiAJCWlmIChwYXJpdHkgIT0gUkZDT01NX1JQTl9QQVJJVFlfTk9ORSkgewogCQkJQlRfREJHKCJSUE4gcGFyaXR5IG1pc21hdGNoIDB4JXgiLCBwYXJpdHkpOwpAQCAtMTM3OSw3ICsxMzc5LDcgQEAKIAkJfQogCX0KIAotCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX0ZMT1cpIHsKKwlpZiAocnBuLT5wYXJhbV9tYXNrICYgY3B1X3RvX2xlMTYoUkZDT01NX1JQTl9QTV9GTE9XKSkgewogCQlmbG93X2N0cmwgPSBycG4tPmZsb3dfY3RybDsKIAkJaWYgKGZsb3dfY3RybCAhPSBSRkNPTU1fUlBOX0ZMT1dfTk9ORSkgewogCQkJQlRfREJHKCJSUE4gZmxvdyBjdHJsIG1pc21hdGNoIDB4JXgiLCBmbG93X2N0cmwpOwpAQCAtMTM4OCw3ICsxMzg4LDcgQEAKIAkJfQogCX0KIAotCWlmIChycG4tPnBhcmFtX21hc2sgJiBSRkNPTU1fUlBOX1BNX1hPTikgeworCWlmIChycG4tPnBhcmFtX21hc2sgJiBjcHVfdG9fbGUxNihSRkNPTU1fUlBOX1BNX1hPTikpIHsKIAkJeG9uX2NoYXIgPSBycG4tPnhvbl9jaGFyOwogCQlpZiAoeG9uX2NoYXIgIT0gUkZDT01NX1JQTl9YT05fQ0hBUikgewogCQkJQlRfREJHKCJSUE4gWE9OIGNoYXIgbWlzbWF0Y2ggMHgleCIsIHhvbl9jaGFyKTsKQEAgLTEzOTcsNyArMTM5Nyw3IEBACiAJCX0KIAl9CiAKLQlpZiAocnBuLT5wYXJhbV9tYXNrICYgUkZDT01NX1JQTl9QTV9YT0ZGKSB7CisJaWYgKHJwbi0+cGFyYW1fbWFzayAmIGNwdV90b19sZTE2KFJGQ09NTV9SUE5fUE1fWE9GRikpIHsKIAkJeG9mZl9jaGFyID0gcnBuLT54b2ZmX2NoYXI7CiAJCWlmICh4b2ZmX2NoYXIgIT0gUkZDT01NX1JQTl9YT0ZGX0NIQVIpIHsKIAkJCUJUX0RCRygiUlBOIFhPRkYgY2hhciBtaXNtYXRjaCAweCV4IiwgeG9mZl9jaGFyKTsKQEAgLTIwNTgsNyArMjA1OCw4IEBACiAKIAlrZXJuZWxfdGhyZWFkKHJmY29tbV9ydW4sIE5VTEwsIENMT05FX0tFUk5FTCk7CiAKLQljbGFzc19jcmVhdGVfZmlsZShidF9jbGFzcywgJmNsYXNzX2F0dHJfcmZjb21tX2RsYyk7CisJaWYgKGNsYXNzX2NyZWF0ZV9maWxlKGJ0X2NsYXNzLCAmY2xhc3NfYXR0cl9yZmNvbW1fZGxjKSA8IDApCisJCUJUX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBSRkNPTU0gaW5mbyBmaWxlIik7CiAKIAlyZmNvbW1faW5pdF9zb2NrZXRzKCk7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwppbmRleCAyMjBmZWUwLi41NDRkNjViIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCkBAIC0zMzYsNyArMzM2LDggQEAKIAogCXNvY2stPm9wcyA9ICZyZmNvbW1fc29ja19vcHM7CiAKLQlpZiAoIShzayA9IHJmY29tbV9zb2NrX2FsbG9jKHNvY2ssIHByb3RvY29sLCBHRlBfS0VSTkVMKSkpCisJc2sgPSByZmNvbW1fc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0FUT01JQyk7CisJaWYgKCFzaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZmNvbW1fc29ja19pbml0KHNrLCBOVUxMKTsKQEAgLTk0NCw3ICs5NDUsOCBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwogCi0JY2xhc3NfY3JlYXRlX2ZpbGUoYnRfY2xhc3MsICZjbGFzc19hdHRyX3JmY29tbSk7CisJaWYgKGNsYXNzX2NyZWF0ZV9maWxlKGJ0X2NsYXNzLCAmY2xhc3NfYXR0cl9yZmNvbW0pIDwgMCkKKwkJQlRfRVJSKCJGYWlsZWQgdG8gY3JlYXRlIFJGQ09NTSBpbmZvIGZpbGUiKTsKIAogCUJUX0lORk8oIlJGQ09NTSBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwppbmRleCAxOTU4YWQxLi5lMGUwZDA5IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwpAQCAtMTcyLDEyICsxNzIsMTAgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssICZkZXYtPmRzdCk7Ci0JaWYgKCFjb25uKQotCQlyZXR1cm4gTlVMTDsKIAogCWhjaV9kZXZfcHV0KGhkZXYpOwogCi0JcmV0dXJuICZjb25uLT5kZXY7CisJcmV0dXJuIGNvbm4gPyAmY29ubi0+ZGV2IDogTlVMTDsKIH0KIAogc3RhdGljIGludCByZmNvbW1fZGV2X2FkZChzdHJ1Y3QgcmZjb21tX2Rldl9yZXEgKnJlcSwgc3RydWN0IHJmY29tbV9kbGMgKmRsYykKQEAgLTc1NCw5ICs3NTIsOSBAQAogCXJldHVybiAtRU5PSU9DVExDTUQ7CiB9CiAKLXN0YXRpYyB2b2lkIHJmY29tbV90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZCkKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7Ci0Jc3RydWN0IHRlcm1pb3MgKm5ldyA9IChzdHJ1Y3QgdGVybWlvcyAqKSB0dHktPnRlcm1pb3M7CisJc3RydWN0IGt0ZXJtaW9zICpuZXcgPSB0dHktPnRlcm1pb3M7CiAJaW50IG9sZF9iYXVkX3JhdGUgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUob2xkKTsKIAlpbnQgbmV3X2JhdWRfcmF0ZSA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShuZXcpOwogCkBAIC03NjcsNiArNzY1LDkgQEAKIAogCUJUX0RCRygidHR5ICVwIHRlcm1pb3MgJXAiLCB0dHksIG9sZCk7CiAKKwlpZiAoIWRldiB8fCAhZGV2LT5kbGMgfHwgIWRldi0+ZGxjLT5zZXNzaW9uKQorCQlyZXR1cm47CisKIAkvKiBIYW5kbGUgdHVybmluZyBvZmYgQ1JUU0NUUyAqLwogCWlmICgob2xkLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgIShuZXctPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgCiAJCUJUX0RCRygiVHVybmluZyBvZmYgQ1JUU0NUUyB1bnN1cHBvcnRlZCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9zY28uYyBiL25ldC9ibHVldG9vdGgvc2NvLmMKaW5kZXggNzcxNGEyZS4uNWQxM2Q0ZiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9zY28uYworKysgYi9uZXQvYmx1ZXRvb3RoL3Njby5jCkBAIC00NTIsNyArNDUyLDggQEAKIAogCXNvY2stPm9wcyA9ICZzY29fc29ja19vcHM7CiAKLQlpZiAoIShzayA9IHNjb19zb2NrX2FsbG9jKHNvY2ssIHByb3RvY29sLCBHRlBfS0VSTkVMKSkpCisJc2sgPSBzY29fc29ja19hbGxvYyhzb2NrLCBwcm90b2NvbCwgR0ZQX0FUT01JQyk7CisJaWYgKCFzaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzY29fc29ja19pbml0KHNrLCBOVUxMKTsKQEAgLTk2Nyw3ICs5NjgsOCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWNsYXNzX2NyZWF0ZV9maWxlKGJ0X2NsYXNzLCAmY2xhc3NfYXR0cl9zY28pOworCWlmIChjbGFzc19jcmVhdGVfZmlsZShidF9jbGFzcywgJmNsYXNzX2F0dHJfc2NvKSA8IDApCisJCUJUX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBTQ08gaW5mbyBmaWxlIik7CiAKIAlCVF9JTkZPKCJTQ08gKFZvaWNlIExpbmspIHZlciAlcyIsIFZFUlNJT04pOwogCUJUX0lORk8oIlNDTyBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZmRiLmMgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCmluZGV4IDNhNzNiOGMuLjhjYTQ0OGQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZmRiLmMKKysrIGIvbmV0L2JyaWRnZS9icl9mZGIuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlICJicl9wcml2YXRlLmgiCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmJyX2ZkYl9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpicl9mZGJfY2FjaGUgX19yZWFkX21vc3RseTsKIHN0YXRpYyBpbnQgZmRiX2luc2VydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnNvdXJjZSwKIAkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcik7CiAKQEAgLTEyOCw3ICsxMjgsMTAgQEAKIAltb2RfdGltZXIoJmJyLT5nY190aW1lciwgamlmZmllcyArIEhaLzEwKTsKIH0KIAotdm9pZCBicl9mZGJfZGVsZXRlX2J5X3BvcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQorCit2b2lkIGJyX2ZkYl9kZWxldGVfYnlfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJICAgaW50IGRvX2FsbCkKIHsKIAlpbnQgaTsKIApAQCAtMTQyLDYgKzE0NSw4IEBACiAJCQlpZiAoZi0+ZHN0ICE9IHApIAogCQkJCWNvbnRpbnVlOwogCisJCQlpZiAoZi0+aXNfc3RhdGljICYmICFkb19hbGwpCisJCQkJY29udGludWU7CiAJCQkvKgogCQkJICogaWYgbXVsdGlwbGUgcG9ydHMgYWxsIGhhdmUgdGhlIHNhbWUgZGV2aWNlIGFkZHJlc3MKIAkJCSAqIHRoZW4gd2hlbiBvbmUgcG9ydCBpcyBkZWxldGVkLCBhc3NpZ24KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaWYuYyBiL25ldC9icmlkZ2UvYnJfaWYuYwppbmRleCBiMTIxMWQ1MzQuLjU1YmIyNjMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX2lmLmMKQEAgLTc3LDEyICs3NywxNiBAQAogICogQ2FsbGVkIGZyb20gd29yayBxdWV1ZSB0byBhbGxvdyBmb3IgY2FsbGluZyBmdW5jdGlvbnMgdGhhdAogICogbWlnaHQgc2xlZXAgKHN1Y2ggYXMgc3BlZWQgY2hlY2spLCBhbmQgdG8gZGVib3VuY2UuCiAgKi8KLXN0YXRpYyB2b2lkIHBvcnRfY2Fycmllcl9jaGVjayh2b2lkICphcmcpCitzdGF0aWMgdm9pZCBwb3J0X2NhcnJpZXJfY2hlY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhcmc7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKIAorCWRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0LAorCQkJICAgY2Fycmllcl9jaGVjay53b3JrKS0+ZGV2OworCXdvcmtfcmVsZWFzZSh3b3JrKTsKKwogCXJ0bmxfbG9jaygpOwogCXAgPSBkZXYtPmJyX3BvcnQ7CiAJaWYgKCFwKQpAQCAtMTYzLDcgKzE2Nyw3IEBACiAJYnJfc3RwX2Rpc2FibGVfcG9ydChwKTsKIAlzcGluX3VubG9ja19iaCgmYnItPmxvY2spOwogCi0JYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KGJyLCBwKTsKKwlicl9mZGJfZGVsZXRlX2J5X3BvcnQoYnIsIHAsIDEpOwogCiAJbGlzdF9kZWxfcmN1KCZwLT5saXN0KTsKIApAQCAtMjc2LDcgKzI4MCw3IEBACiAJcC0+cG9ydF9ubyA9IGluZGV4OwogCWJyX2luaXRfcG9ydChwKTsKIAlwLT5zdGF0ZSA9IEJSX1NUQVRFX0RJU0FCTEVEOwotCUlOSVRfV09SSygmcC0+Y2Fycmllcl9jaGVjaywgcG9ydF9jYXJyaWVyX2NoZWNrLCBkZXYpOworCUlOSVRfREVMQVlFRF9XT1JLX05BUigmcC0+Y2Fycmllcl9jaGVjaywgcG9ydF9jYXJyaWVyX2NoZWNrKTsKIAlicl9zdHBfcG9ydF90aW1lcl9pbml0KHApOwogCiAJa29iamVjdF9pbml0KCZwLT5rb2JqKTsKQEAgLTQ0OCw3ICs0NTIsNyBAQAogCiAJcmV0dXJuIDA7CiBlcnIyOgotCWJyX2ZkYl9kZWxldGVfYnlfcG9ydChiciwgcCk7CisJYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KGJyLCBwLCAxKTsKIGVycjE6CiAJa29iamVjdF9kZWwoJnAtPmtvYmopOwogZXJyMDoKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaW9jdGwuYyBiL25ldC9icmlkZ2UvYnJfaW9jdGwuYwppbmRleCA0ZTQxMTlhLi40YzYxYTdlIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lvY3RsLmMKKysrIGIvbmV0L2JyaWRnZS9icl9pb2N0bC5jCkBAIC01OCwxMiArNTgsMTMgQEAKIHsKIAlpbnQgbnVtOwogCXZvaWQgKmJ1ZjsKLQlzaXplX3Qgc2l6ZSA9IG1heG51bSAqIHNpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpOworCXNpemVfdCBzaXplOwogCi0JaWYgKHNpemUgPiBQQUdFX1NJWkUpIHsKLQkJc2l6ZSA9IFBBR0VfU0laRTsKKwkvKiBDbGFtcCBzaXplIHRvIFBBR0VfU0laRSwgdGVzdCBtYXhudW0gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKwlpZiAobWF4bnVtID4gUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpKQogCQltYXhudW0gPSBQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBfX2ZkYl9lbnRyeSk7Ci0JfQorCisJc2l6ZSA9IG1heG51bSAqIHNpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpOwogCiAJYnVmID0ga21hbGxvYyhzaXplLCBHRlBfVVNFUik7CiAJaWYgKCFidWYpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwppbmRleCBhYzE4MWJlLi5lYTMzMzdhIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKQEAgLTM0LDEzICszNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2luX3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgogCiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgogI2lmZGVmIENPTkZJR19TWVNDVEwKICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KQEAgLTYxLDkgKzYxLDYgQEAKICNkZWZpbmUgYnJuZl9maWx0ZXJfdmxhbl90YWdnZWQgMQogI2VuZGlmCiAKLWludCBicm5mX2RlZmVycmVkX2hvb2tzOwotRVhQT1JUX1NZTUJPTF9HUEwoYnJuZl9kZWZlcnJlZF9ob29rcyk7Ci0KIHN0YXRpYyBfX2JlMTYgaW5saW5lIHZsYW5fcHJvdG8oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gdmxhbl9ldGhfaGRyKHNrYiktPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CkBAIC0yMjIsMTAgKzIxOSwxNCBAQAogICoKICAqIE90aGVyd2lzZSwgdGhlIHBhY2tldCBpcyBjb25zaWRlcmVkIHRvIGJlIHJvdXRlZCBhbmQgd2UganVzdAogICogY2hhbmdlIHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBzbyB0aGF0IHRoZSBwYWNrZXQgd2lsbAotICogbGF0ZXIgYmUgcGFzc2VkIHVwIHRvIHRoZSBJUCBzdGFjayB0byBiZSByb3V0ZWQuCisgKiBsYXRlciBiZSBwYXNzZWQgdXAgdG8gdGhlIElQIHN0YWNrIHRvIGJlIHJvdXRlZC4gRm9yIGEgcmVkaXJlY3RlZAorICogcGFja2V0LCBpcF9yb3V0ZV9pbnB1dCgpIHdpbGwgZ2l2ZSBiYWNrIHRoZSBsb2NhbGhvc3QgYXMgb3V0cHV0IGRldmljZSwKKyAqIHdoaWNoIGRpZmZlcnMgZnJvbSB0aGUgYnJpZGdlIGRldmljZS4KICAqCiAgKiBMZXQgdXMgbm93IGNvbnNpZGVyIHRoZSBjYXNlIHRoYXQgaXBfcm91dGVfaW5wdXQoKSBmYWlsczoKICAqCisgKiBUaGlzIGNhbiBiZSBiZWNhdXNlIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIG1hcnRpYW4sIGluIHdoaWNoIGNhc2UKKyAqIHRoZSBwYWNrZXQgd2lsbCBiZSBkcm9wcGVkLgogICogQWZ0ZXIgYSAiZWNobyAnMCcgPiAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZCIgaXBfcm91dGVfaW5wdXQoKQogICogd2lsbCBmYWlsLCB3aGlsZSBfX2lwX3JvdXRlX291dHB1dF9rZXkoKSB3aWxsIHJldHVybiBzdWNjZXNzLiBUaGUgc291cmNlCiAgKiBhZGRyZXNzIGZvciBfX2lwX3JvdXRlX291dHB1dF9rZXkoKSBpcyBzZXQgdG8gemVybywgc28gX19pcF9yb3V0ZV9vdXRwdXRfa2V5CkBAIC0yMzgsNyArMjM5LDggQEAKICAqCiAgKiAtLUxlbm5lcnQsIDIwMDIwNDExCiAgKiAtLUJhcnQsIDIwMDIwNDE2ICh1cGRhdGVkKQotICogLS1CYXJ0LCAyMDAyMTAwNyAodXBkYXRlZCkgKi8KKyAqIC0tQmFydCwgMjAwMjEwMDcgKHVwZGF0ZWQpCisgKiAtLUJhcnQsIDIwMDYyNzExICh1cGRhdGVkKSAqLwogc3RhdGljIGludCBicl9uZl9wcmVfcm91dGluZ19maW5pc2hfYnJpZGdlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgewpAQCAtMjY1LDE1ICsyNjcsMTUgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKIAlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlOworCWludCBlcnI7CiAKIAlpZiAobmZfYnJpZGdlLT5tYXNrICYgQlJORl9QS1RfVFlQRSkgewogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKIAkJbmZfYnJpZGdlLT5tYXNrIF49IEJSTkZfUEtUX1RZUEU7CiAJfQogCW5mX2JyaWRnZS0+bWFzayBePSBCUk5GX05GX0JSSURHRV9QUkVST1VUSU5HOwotCiAJaWYgKGRuYXRfdG9va19wbGFjZShza2IpKSB7Ci0JCWlmIChpcF9yb3V0ZV9pbnB1dChza2IsIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIGlwaC0+dG9zLCBkZXYpKSB7CisJCWlmICgoZXJyID0gaXBfcm91dGVfaW5wdXQoc2tiLCBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLCBpcGgtPnRvcywgZGV2KSkpIHsKIAkJCXN0cnVjdCBydGFibGUgKnJ0OwogCQkJc3RydWN0IGZsb3dpIGZsID0gewogCQkJCS5ubF91ID0gewpAQCAtMjg0LDE5ICsyODYsMzMgQEAKIAkJCQl9LAogCQkJCS5wcm90byA9IDAsCiAJCQl9OworCQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gaW5fZGV2X2dldChkZXYpOworCisJCQkvKiBJZiBlcnIgZXF1YWxzIC1FSE9TVFVOUkVBQ0ggdGhlIGVycm9yIGlzIGR1ZSB0byBhCisJCQkgKiBtYXJ0aWFuIGRlc3RpbmF0aW9uIG9yIGR1ZSB0byB0aGUgZmFjdCB0aGF0CisJCQkgKiBmb3J3YXJkaW5nIGlzIGRpc2FibGVkLiBGb3IgbW9zdCBtYXJ0aWFuIHBhY2tldHMsCisJCQkgKiBpcF9yb3V0ZV9vdXRwdXRfa2V5KCkgd2lsbCBmYWlsLiBJdCB3b24ndCBmYWlsIGZvciAyIHR5cGVzIG9mCisJCQkgKiBtYXJ0aWFuIGRlc3RpbmF0aW9uczogbG9vcGJhY2sgZGVzdGluYXRpb25zIGFuZCBkZXN0aW5hdGlvbgorCQkJICogMC4wLjAuMC4gSW4gYm90aCBjYXNlcyB0aGUgcGFja2V0IHdpbGwgYmUgZHJvcHBlZCBiZWNhdXNlIHRoZQorCQkJICogZGVzdGluYXRpb24gaXMgdGhlIGxvb3BiYWNrIGRldmljZSBhbmQgbm90IHRoZSBicmlkZ2UuICovCisJCQlpZiAoZXJyICE9IC1FSE9TVFVOUkVBQ0ggfHwgIWluX2RldiB8fCBJTl9ERVZfRk9SV0FSRChpbl9kZXYpKQorCQkJCWdvdG8gZnJlZV9za2I7CiAKIAkJCWlmICghaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpIHsKIAkJCQkvKiAtIEJyaWRnZWQtYW5kLUROQVQnZWQgdHJhZmZpYyBkb2Vzbid0Ci0JCQkJICogICByZXF1aXJlIGlwX2ZvcndhcmRpbmcuCi0JCQkJICogLSBEZWFsIHdpdGggcmVkaXJlY3RlZCB0cmFmZmljLiAqLwotCQkJCWlmICgoKHN0cnVjdCBkc3RfZW50cnkgKilydCktPmRldiA9PSBkZXYgfHwKLQkJCQkgICAgcnQtPnJ0X3R5cGUgPT0gUlROX0xPQ0FMKSB7CisJCQkJICogICByZXF1aXJlIGlwX2ZvcndhcmRpbmcuICovCisJCQkJaWYgKCgoc3RydWN0IGRzdF9lbnRyeSAqKXJ0KS0+ZGV2ID09IGRldikgewogCQkJCQlza2ItPmRzdCA9IChzdHJ1Y3QgZHN0X2VudHJ5ICopcnQ7CiAJCQkJCWdvdG8gYnJpZGdlZF9kbmF0OwogCQkJCX0KKwkJCQkvKiB3ZSBhcmUgc3VyZSB0aGF0IGZvcndhcmRpbmcgaXMgZGlzYWJsZWQsIHNvIHByaW50aW5nCisJCQkJICogdGhpcyBtZXNzYWdlIGlzIG5vIHByb2JsZW0uIE5vdGUgdGhhdCB0aGUgcGFja2V0IGNvdWxkCisJCQkJICogc3RpbGwgaGF2ZSBhIG1hcnRpYW4gZGVzdGluYXRpb24gYWRkcmVzcywgaW4gd2hpY2ggY2FzZQorCQkJCSAqIHRoZSBwYWNrZXQgY291bGQgYmUgZHJvcHBlZCBldmVuIGlmIGZvcndhcmRpbmcgd2VyZSBlbmFibGVkICovCiAJCQkJX19icl9kbmF0X2NvbXBsYWluKCk7CiAJCQkJZHN0X3JlbGVhc2UoKHN0cnVjdCBkc3RfZW50cnkgKilydCk7CiAJCQl9CitmcmVlX3NrYjoKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7CkBAIC0zODEsNyArMzk3LDcgQEAKIAkJY2FzZSBJUFY2X1RMVl9KVU1CTzoKIAkJCWlmIChza2ItPm5oLnJhd1tvZmYgKyAxXSAhPSA0IHx8IChvZmYgJiAzKSAhPSAyKQogCQkJCWdvdG8gYmFkOwotCQkJcGt0X2xlbiA9IG50b2hsKCoodTMyICopIChza2ItPm5oLnJhdyArIG9mZiArIDIpKTsKKwkJCXBrdF9sZW4gPSBudG9obCgqKF9fYmUzMiAqKSAoc2tiLT5uaC5yYXcgKyBvZmYgKyAyKSk7CiAJCQlpZiAocGt0X2xlbiA8PSBJUFY2X01BWFBMRU4gfHwKIAkJCSAgICBza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikKIAkJCQlnb3RvIGJhZDsKQEAgLTY2NiwxMTAgKzY4Miw1MCBAQAogCXJldHVybiBORl9TVE9MRU47CiB9CiAKLS8qIFBGX0JSSURHRS9MT0NBTF9PVVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGJyX25mX2xvY2FsX291dF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKLQkJc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOwotCQlza2ItPm5oLnJhdyAtPSBWTEFOX0hMRU47Ci0JfQotCi0JTkZfSE9PS19USFJFU0goUEZfQlJJREdFLCBORl9CUl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kZXYsCi0JCSAgICAgICBicl9mb3J3YXJkX2ZpbmlzaCwgTkZfQlJfUFJJX0ZJUlNUICsgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBzZWVzIGJvdGggbG9jYWxseSBvcmlnaW5hdGVkIElQIHBhY2tldHMgYW5kIGZvcndhcmRlZAorLyogUEZfQlJJREdFL0xPQ0FMX09VVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VlcyBib3RoIGxvY2FsbHkgb3JpZ2luYXRlZCBJUCBwYWNrZXRzIGFuZCBmb3J3YXJkZWQKICAqIElQIHBhY2tldHMgKGluIGJvdGggY2FzZXMgdGhlIGRlc3RpbmF0aW9uIGRldmljZSBpcyBhIGJyaWRnZQogICogZGV2aWNlKS4gSXQgYWxzbyBzZWVzIGJyaWRnZWQtYW5kLUROQVQnZWQgcGFja2V0cy4KLSAqIFRvIGJlIGFibGUgdG8gZmlsdGVyIG9uIHRoZSBwaHlzaWNhbCBicmlkZ2UgZGV2aWNlcyAod2l0aCB0aGUgcGh5c2RldgotICogbW9kdWxlKSwgd2Ugc3RlYWwgcGFja2V0cyBkZXN0aW5lZCB0byBhIGJyaWRnZSBkZXZpY2UgYXdheSBmcm9tIHRoZQotICogUEZfSU5FVC9GT1JXQVJEIGFuZCBQRl9JTkVUL09VVFBVVCBob29rIGZ1bmN0aW9ucywgYW5kIGdpdmUgdGhlbSBiYWNrIGxhdGVyLAotICogd2hlbiB3ZSBoYXZlIGRldGVybWluZWQgdGhlIHJlYWwgb3V0cHV0IGRldmljZS4gVGhpcyBpcyBkb25lIGluIGhlcmUuCiAgKgogICogSWYgKG5mX2JyaWRnZS0+bWFzayAmIEJSTkZfQlJJREdFRF9ETkFUKSB0aGVuIHRoZSBwYWNrZXQgaXMgYnJpZGdlZAogICogYW5kIHdlIGZha2UgdGhlIFBGX0JSSURHRS9GT1JXQVJEIGhvb2suIFRoZSBmdW5jdGlvbiBicl9uZl9mb3J3YXJkKCkKICAqIHdpbGwgdGhlbiBmYWtlIHRoZSBQRl9JTkVUL0ZPUldBUkQgaG9vay4gYnJfbmZfbG9jYWxfb3V0KCkgaGFzIHByaW9yaXR5CiAgKiBORl9CUl9QUklfRklSU1QsIHNvIG5vIHJlbGV2YW50IFBGX0JSSURHRS9JTlBVVCBmdW5jdGlvbnMgaGF2ZSBiZWVuIG5vcgogICogd2lsbCBiZSBleGVjdXRlZC4KLSAqIE90aGVyd2lzZSwgaWYgbmZfYnJpZGdlLT5waHlzaW5kZXYgaXMgTlVMTCwgdGhlIGJyaWRnZS1uZiBjb2RlIG5ldmVyIHRvdWNoZWQKLSAqIHRoaXMgcGFja2V0IGJlZm9yZSwgYW5kIHNvIHRoZSBwYWNrZXQgd2FzIGxvY2FsbHkgb3JpZ2luYXRlZC4gV2UgZmFrZQotICogdGhlIFBGX0lORVQvTE9DQUxfT1VUIGhvb2suCi0gKiBGaW5hbGx5LCBpZiBuZl9icmlkZ2UtPnBoeXNpbmRldiBpc24ndCBOVUxMLCB0aGVuIHRoZSBwYWNrZXQgd2FzIElQIHJvdXRlZCwKLSAqIHNvIHdlIGZha2UgdGhlIFBGX0lORVQvRk9SV0FSRCBob29rLiBpcF9zYWJvdGFnZV9vdXQoKSBtYWtlcyBzdXJlCi0gKiBldmVuIHJvdXRlZCBwYWNrZXRzIHRoYXQgZGlkbid0IGFycml2ZSBvbiBhIGJyaWRnZSBpbnRlcmZhY2UgaGF2ZSB0aGVpcgotICogbmZfYnJpZGdlLT5waHlzaW5kZXYgc2V0LiAqLworICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGJyX25mX2xvY2FsX291dCh1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCQkJICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsaW5kZXYsICpyZWFsb3V0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsaW5kZXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOwogCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOwotCWludCBwZjsKIAogCWlmICghc2tiLT5uZl9icmlkZ2UpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgfHwgSVNfVkxBTl9JUChza2IpKQotCQlwZiA9IFBGX0lORVQ7Ci0JZWxzZQotCQlwZiA9IFBGX0lORVQ2OwotCiAJbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7Ci0JbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID0gc2tiLT5kZXY7Ci0JcmVhbGluZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CisJaWYgKCEobmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEX0ROQVQpKQorCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJLyogQnJpZGdlZCwgdGFrZSBQRl9CUklER0UvRk9SV0FSRC4KIAkgKiAoc2VlIGJpZyBub3RlIGluIGZyb250IG9mIGJyX25mX3ByZV9yb3V0aW5nX2ZpbmlzaCkgKi8KLQlpZiAobmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEX0ROQVQpIHsKLQkJaWYgKG5mX2JyaWRnZS0+bWFzayAmIEJSTkZfUEtUX1RZUEUpIHsKLQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotCQkJbmZfYnJpZGdlLT5tYXNrIF49IEJSTkZfUEtUX1RZUEU7Ci0JCX0KLQkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7Ci0JCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7Ci0JCQlza2ItPm5oLnJhdyAtPSBWTEFOX0hMRU47Ci0JCX0KKwluZl9icmlkZ2UtPnBoeXNvdXRkZXYgPSBza2ItPmRldjsKKwlyZWFsaW5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldjsKIAotCQlORl9IT09LKFBGX0JSSURHRSwgTkZfQlJfRk9SV0FSRCwgc2tiLCByZWFsaW5kZXYsCi0JCQlza2ItPmRldiwgYnJfZm9yd2FyZF9maW5pc2gpOwotCQlnb3RvIG91dDsKKwlpZiAobmZfYnJpZGdlLT5tYXNrICYgQlJORl9QS1RfVFlQRSkgeworCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwkJbmZfYnJpZGdlLT5tYXNrIF49IEJSTkZfUEtUX1RZUEU7CiAJfQotCXJlYWxvdXRkZXYgPSBicmlkZ2VfcGFyZW50KHNrYi0+ZGV2KTsKLQlpZiAoIXJlYWxvdXRkZXYpCi0JCXJldHVybiBORl9EUk9QOwotCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCi0JLyogaXB0YWJsZXMgc2hvdWxkIG1hdGNoIC1vIGJyMC54ICovCi0JaWYgKG5mX2JyaWRnZS0+bmV0b3V0ZGV2KQotCQlyZWFsb3V0ZGV2ID0gbmZfYnJpZGdlLT5uZXRvdXRkZXY7Ci0jZW5kaWYKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKLQkJc2tiX3B1bGwoc2tiLCBWTEFOX0hMRU4pOwotCQkoKnBza2IpLT5uaC5yYXcgKz0gVkxBTl9ITEVOOwotCX0KLQkvKiBJUCBmb3J3YXJkZWQgdHJhZmZpYyBoYXMgYSBwaHlzaW5kZXYsIGxvY2FsbHkKLQkgKiBnZW5lcmF0ZWQgdHJhZmZpYyBoYXNuJ3QuICovCi0JaWYgKHJlYWxpbmRldiAhPSBOVUxMKSB7Ci0JCWlmICghKG5mX2JyaWRnZS0+bWFzayAmIEJSTkZfRE9OVF9UQUtFX1BBUkVOVCkpIHsKLQkJCXN0cnVjdCBuZXRfZGV2aWNlICpwYXJlbnQgPSBicmlkZ2VfcGFyZW50KHJlYWxpbmRldik7Ci0JCQlpZiAocGFyZW50KQotCQkJCXJlYWxpbmRldiA9IHBhcmVudDsKLQkJfQotCi0JCU5GX0hPT0tfVEhSRVNIKHBmLCBORl9JUF9GT1JXQVJELCBza2IsIHJlYWxpbmRldiwKLQkJCSAgICAgICByZWFsb3V0ZGV2LCBicl9uZl9sb2NhbF9vdXRfZmluaXNoLAotCQkJICAgICAgIE5GX0lQX1BSSV9CUklER0VfU0FCT1RBR0VfRk9SV0FSRCArIDEpOwotCX0gZWxzZSB7Ci0JCU5GX0hPT0tfVEhSRVNIKHBmLCBORl9JUF9MT0NBTF9PVVQsIHNrYiwgcmVhbGluZGV2LAotCQkJICAgICAgIHJlYWxvdXRkZXYsIGJyX25mX2xvY2FsX291dF9maW5pc2gsCi0JCQkgICAgICAgTkZfSVBfUFJJX0JSSURHRV9TQUJPVEFHRV9MT0NBTF9PVVQgKyAxKTsKKwkJc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOworCQlza2ItPm5oLnJhdyAtPSBWTEFOX0hMRU47CiAJfQogCi1vdXQ6CisJTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX0ZPUldBUkQsIHNrYiwgcmVhbGluZGV2LCBza2ItPmRldiwKKwkJYnJfZm9yd2FyZF9maW5pc2gpOwogCXJldHVybiBORl9TVE9MRU47CiB9CiAKQEAgLTg3NSw2OSArODMxLDYgQEAKIAlyZXR1cm4gTkZfQUNDRVBUOwogfQogCi0vKiBQb3N0cG9uZSBleGVjdXRpb24gb2YgUEZfSU5FVCg2KS9GT1JXQVJELCBQRl9JTkVUKDYpL0xPQ0FMX09VVAotICogYW5kIFBGX0lORVQoNikvUE9TVF9ST1VUSU5HIHVudGlsIHdlIGhhdmUgZG9uZSB0aGUgZm9yd2FyZGluZwotICogZGVjaXNpb24gaW4gdGhlIGJyaWRnZSBjb2RlIGFuZCBoYXZlIGRldGVybWluZWQgbmZfYnJpZGdlLT5waHlzb3V0ZGV2LiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpcF9zYWJvdGFnZV9vdXQodW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7Ci0KLQlpZiAoKG91dC0+aGFyZF9zdGFydF94bWl0ID09IGJyX2Rldl94bWl0ICYmCi0JICAgICBva2ZuICE9IGJyX25mX2ZvcndhcmRfZmluaXNoICYmCi0JICAgICBva2ZuICE9IGJyX25mX2xvY2FsX291dF9maW5pc2ggJiYgb2tmbiAhPSBicl9uZl9kZXZfcXVldWVfeG1pdCkKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKLQkgICAgfHwgKChvdXQtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pICYmCi0JCVZMQU5fREVWX0lORk8ob3V0KS0+cmVhbF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9PSBicl9kZXZfeG1pdCkKLSNlbmRpZgotCSAgICApIHsKLQkJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7Ci0KLQkJaWYgKCFza2ItPm5mX2JyaWRnZSkgewotI2lmZGVmIENPTkZJR19TWVNDVEwKLQkJCS8qIFRoaXMgY29kZSBpcyBleGVjdXRlZCB3aGlsZSBpbiB0aGUgSVAodjYpIHN0YWNrLAotCQkJICAgdGhlIHZlcnNpb24gc2hvdWxkIGJlIDQgb3IgNi4gV2UgY2FuJ3QgdXNlCi0JCQkgICBza2ItPnByb3RvY29sIGJlY2F1c2UgdGhhdCBpc24ndCBzZXQgb24KLQkJCSAgIFBGX0lORVQoNikvTE9DQUxfT1VULiAqLwotCQkJc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOwotCi0JCQlpZiAoaXAtPnZlcnNpb24gPT0gNCAmJiAhYnJuZl9jYWxsX2lwdGFibGVzKQotCQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JCQllbHNlIGlmIChpcC0+dmVyc2lvbiA9PSA2ICYmICFicm5mX2NhbGxfaXA2dGFibGVzKQotCQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JCQllbHNlIGlmICghYnJuZl9kZWZlcnJlZF9ob29rcykKLQkJCQlyZXR1cm4gTkZfQUNDRVBUOwotI2VuZGlmCi0JCQlpZiAoaG9vayA9PSBORl9JUF9QT1NUX1JPVVRJTkcpCi0JCQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQkJCWlmICghbmZfYnJpZGdlX2FsbG9jKHNrYikpCi0JCQkJcmV0dXJuIE5GX0RST1A7Ci0JCX0KLQotCQluZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKLQotCQkvKiBUaGlzIGZyYW1lIHdpbGwgYXJyaXZlIG9uIFBGX0JSSURHRS9MT0NBTF9PVVQgYW5kIHdlCi0JCSAqIHdpbGwgbmVlZCB0aGUgaW5kZXYgdGhlbi4gRm9yIGEgYnJvdXRlciwgdGhlIHJlYWwgaW5kZXYKLQkJICogY2FuIGJlIGEgYnJpZGdlIHBvcnQsIHNvIHdlIG1ha2Ugc3VyZSBicl9uZl9sb2NhbF9vdXQoKQotCQkgKiBkb2Vzbid0IHVzZSB0aGUgYnJpZGdlIHBhcmVudCBvZiB0aGUgaW5kZXYgYnkgdXNpbmcKLQkJICogdGhlIEJSTkZfRE9OVF9UQUtFX1BBUkVOVCBtYXNrLiAqLwotCQlpZiAoaG9vayA9PSBORl9JUF9GT1JXQVJEICYmIG5mX2JyaWRnZS0+cGh5c2luZGV2ID09IE5VTEwpIHsKLQkJCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX0RPTlRfVEFLRV9QQVJFTlQ7Ci0JCQluZl9icmlkZ2UtPnBoeXNpbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWluOwotCQl9Ci0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCi0JCS8qIHRoZSBpcHRhYmxlcyBvdXRkZXYgaXMgYnIwLngsIG5vdCBicjAgKi8KLQkJaWYgKG91dC0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikKLQkJCW5mX2JyaWRnZS0+bmV0b3V0ZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopb3V0OwotI2VuZGlmCi0JCXJldHVybiBORl9TVE9QOwotCX0KLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KIC8qIEZvciBicl9uZl9sb2NhbF9vdXQgd2UgbmVlZCAocHJpbyA9IE5GX0JSX1BSSV9GSVJTVCksIHRvIGluc3VyZSB0aGF0IGlubm9jZW50CiAgKiBQRl9CUklER0UvTkZfQlJfTE9DQUxfT1VUIGZ1bmN0aW9ucyBkb24ndCBnZXQgYnJpZGdlZCB0cmFmZmljIGFzIGlucHV0LgogICogRm9yIGJyX25mX3Bvc3Rfcm91dGluZywgd2UgbmVlZCAocHJpbyA9IE5GX0JSX1BSSV9MQVNUKSwgYmVjYXVzZQpAQCAtOTgzLDM2ICs4NzYsNiBAQAogCSAgLnBmID0gUEZfSU5FVDYsCiAJICAuaG9va251bSA9IE5GX0lQNl9QUkVfUk9VVElORywKIAkgIC5wcmlvcml0eSA9IE5GX0lQNl9QUklfRklSU1QsIH0sCi0JeyAuaG9vayA9IGlwX3NhYm90YWdlX291dCwKLQkgIC5vd25lciA9IFRISVNfTU9EVUxFLAotCSAgLnBmID0gUEZfSU5FVCwKLQkgIC5ob29rbnVtID0gTkZfSVBfRk9SV0FSRCwKLQkgIC5wcmlvcml0eSA9IE5GX0lQX1BSSV9CUklER0VfU0FCT1RBR0VfRk9SV0FSRCwgfSwKLQl7IC5ob29rID0gaXBfc2Fib3RhZ2Vfb3V0LAotCSAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JICAucGYgPSBQRl9JTkVUNiwKLQkgIC5ob29rbnVtID0gTkZfSVA2X0ZPUldBUkQsCi0JICAucHJpb3JpdHkgPSBORl9JUDZfUFJJX0JSSURHRV9TQUJPVEFHRV9GT1JXQVJELCB9LAotCXsgLmhvb2sgPSBpcF9zYWJvdGFnZV9vdXQsCi0JICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkgIC5wZiA9IFBGX0lORVQsCi0JICAuaG9va251bSA9IE5GX0lQX0xPQ0FMX09VVCwKLQkgIC5wcmlvcml0eSA9IE5GX0lQX1BSSV9CUklER0VfU0FCT1RBR0VfTE9DQUxfT1VULCB9LAotCXsgLmhvb2sgPSBpcF9zYWJvdGFnZV9vdXQsCi0JICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkgIC5wZiA9IFBGX0lORVQ2LAotCSAgLmhvb2tudW0gPSBORl9JUDZfTE9DQUxfT1VULAotCSAgLnByaW9yaXR5ID0gTkZfSVA2X1BSSV9CUklER0VfU0FCT1RBR0VfTE9DQUxfT1VULCB9LAotCXsgLmhvb2sgPSBpcF9zYWJvdGFnZV9vdXQsCi0JICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkgIC5wZiA9IFBGX0lORVQsCi0JICAuaG9va251bSA9IE5GX0lQX1BPU1RfUk9VVElORywKLQkgIC5wcmlvcml0eSA9IE5GX0lQX1BSSV9GSVJTVCwgfSwKLQl7IC5ob29rID0gaXBfc2Fib3RhZ2Vfb3V0LAotCSAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JICAucGYgPSBQRl9JTkVUNiwKLQkgIC5ob29rbnVtID0gTkZfSVA2X1BPU1RfUk9VVElORywKLQkgIC5wcmlvcml0eSA9IE5GX0lQNl9QUklfRklSU1QsIH0sCiB9OwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYwppbmRleCA4ZjY2MTE5Li5hOTEzOTY4IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYwpAQCAtMTUsNiArMTUsMTggQEAKICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKIAorc3RhdGljIGlubGluZSBzaXplX3QgYnJfbmxtc2dfc2l6ZSh2b2lkKQoreworCXJldHVybiBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoSUZOQU1TSVopIC8qIElGTEFfSUZOQU1FICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoTUFYX0FERFJfTEVOKSAvKiBJRkxBX0FERFJFU1MgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX01BU1RFUiAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfTVRVICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZMQV9MSU5LICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMSkgLyogSUZMQV9PUEVSU1RBVEUgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgxKTsgLyogSUZMQV9QUk9USU5GTyAqLworfQorCiAvKgogICogQ3JlYXRlIG9uZSBuZXRsaW5rIG1lc3NhZ2UgZm9yIG9uZSBpbnRlcmZhY2UKICAqIENvbnRhaW5zIHBvcnQgYW5kIG1hc3RlciBpbmZvIGFzIHdlbGwgYXMgY2FycmllciBhbmQgYnJpZGdlIHN0YXRlLgpAQCAtMjQsNTEgKzM2LDQzIEBACiB7CiAJY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gcG9ydC0+YnI7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnQtPmRldjsKLQlzdHJ1Y3QgaWZpbmZvbXNnICpyOworCXN0cnVjdCBpZmluZm9tc2cgKmhkcjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOwotCXUzMiBtdHUgPSBkZXYtPm10dTsKIAl1OCBvcGVyc3RhdGUgPSBuZXRpZl9ydW5uaW5nKGRldikgPyBkZXYtPm9wZXJzdGF0ZSA6IElGX09QRVJfRE9XTjsKLQl1OCBwb3J0c3RhdGUgPSBwb3J0LT5zdGF0ZTsKIAogCXByX2RlYnVnKCJicl9maWxsX2luZm8gZXZlbnQgJWQgcG9ydCAlcyBtYXN0ZXIgJXNcbiIsCiAJCSBldmVudCwgZGV2LT5uYW1lLCBici0+ZGV2LT5uYW1lKTsKIAotCW5saCA9IE5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpyKSwgZmxhZ3MpOwotCXIgPSBOTE1TR19EQVRBKG5saCk7Ci0Jci0+aWZpX2ZhbWlseSA9IEFGX0JSSURHRTsKLQlyLT5fX2lmaV9wYWQgPSAwOwotCXItPmlmaV90eXBlID0gZGV2LT50eXBlOwotCXItPmlmaV9pbmRleCA9IGRldi0+aWZpbmRleDsKLQlyLT5pZmlfZmxhZ3MgPSBkZXZfZ2V0X2ZsYWdzKGRldik7Ci0Jci0+aWZpX2NoYW5nZSA9IDA7CisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKmhkciksIGZsYWdzKTsKKwlpZiAobmxoID09IE5VTEwpCisJCXJldHVybiAtRU5PQlVGUzsKIAotCVJUQV9QVVQoc2tiLCBJRkxBX0lGTkFNRSwgc3RybGVuKGRldi0+bmFtZSkrMSwgZGV2LT5uYW1lKTsKKwloZHIgPSBubG1zZ19kYXRhKG5saCk7CisJaGRyLT5pZmlfZmFtaWx5ID0gQUZfQlJJREdFOworCWhkci0+X19pZmlfcGFkID0gMDsKKwloZHItPmlmaV90eXBlID0gZGV2LT50eXBlOworCWhkci0+aWZpX2luZGV4ID0gZGV2LT5pZmluZGV4OworCWhkci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOworCWhkci0+aWZpX2NoYW5nZSA9IDA7CiAKLQlSVEFfUFVUKHNrYiwgSUZMQV9NQVNURVIsIHNpemVvZihpbnQpLCAmYnItPmRldi0+aWZpbmRleCk7CisJTkxBX1BVVF9TVFJJTkcoc2tiLCBJRkxBX0lGTkFNRSwgZGV2LT5uYW1lKTsKKwlOTEFfUFVUX1UzMihza2IsIElGTEFfTUFTVEVSLCBici0+ZGV2LT5pZmluZGV4KTsKKwlOTEFfUFVUX1UzMihza2IsIElGTEFfTVRVLCBkZXYtPm10dSk7CisJTkxBX1BVVF9VOChza2IsIElGTEFfT1BFUlNUQVRFLCBvcGVyc3RhdGUpOwogCiAJaWYgKGRldi0+YWRkcl9sZW4pCi0JCVJUQV9QVVQoc2tiLCBJRkxBX0FERFJFU1MsIGRldi0+YWRkcl9sZW4sIGRldi0+ZGV2X2FkZHIpOworCQlOTEFfUFVUKHNrYiwgSUZMQV9BRERSRVNTLCBkZXYtPmFkZHJfbGVuLCBkZXYtPmRldl9hZGRyKTsKIAotCVJUQV9QVVQoc2tiLCBJRkxBX01UVSwgc2l6ZW9mKG10dSksICZtdHUpOwogCWlmIChkZXYtPmlmaW5kZXggIT0gZGV2LT5pZmxpbmspCi0JCVJUQV9QVVQoc2tiLCBJRkxBX0xJTkssIHNpemVvZihpbnQpLCAmZGV2LT5pZmxpbmspOwotCi0KLQlSVEFfUFVUKHNrYiwgSUZMQV9PUEVSU1RBVEUsIHNpemVvZihvcGVyc3RhdGUpLCAmb3BlcnN0YXRlKTsKKwkJTkxBX1BVVF9VMzIoc2tiLCBJRkxBX0xJTkssIGRldi0+aWZsaW5rKTsKIAogCWlmIChldmVudCA9PSBSVE1fTkVXTElOSykKLQkJUlRBX1BVVChza2IsIElGTEFfUFJPVElORk8sIHNpemVvZihwb3J0c3RhdGUpLCAmcG9ydHN0YXRlKTsKKwkJTkxBX1BVVF9VOChza2IsIElGTEFfUFJPVElORk8sIHBvcnQtPnN0YXRlKTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAotCXJldHVybiBza2ItPmxlbjsKLQotbmxtc2dfZmFpbHVyZToKLXJ0YXR0cl9mYWlsdXJlOgotCi0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlyZXR1cm4gLUVJTlZBTDsKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKIH0KIAogLyoKQEAgLTc3LDE5ICs4MSwxNiBAQAogdm9pZCBicl9pZmluZm9fbm90aWZ5KGludCBldmVudCwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBwYXlsb2FkID0gc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpICsgMTI4OwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAogCXByX2RlYnVnKCJicmlkZ2Ugbm90aWZ5IGV2ZW50PSVkXG4iLCBldmVudCk7Ci0Jc2tiID0gbmxtc2dfbmV3KG5sbXNnX3RvdGFsX3NpemUocGF5bG9hZCksIEdGUF9BVE9NSUMpOworCXNrYiA9IG5sbXNnX25ldyhicl9ubG1zZ19zaXplKCksIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBicl9maWxsX2lmaW5mbyhza2IsIHBvcnQsIDAsIDAsIGV2ZW50LCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXQ7Ci0JfQorCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gYnJfbmxtc2dfc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0xJTkssIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgpAQCAtMTA0LDI1ICsxMDUsMTggQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBpZHg7Ci0JaW50IHNfaWR4ID0gY2ItPmFyZ3NbMF07Ci0JaW50IGVyciA9IDA7CiAKIAlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwogCWZvciAoZGV2ID0gZGV2X2Jhc2UsIGlkeCA9IDA7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7Ci0JCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBkZXYtPmJyX3BvcnQ7Ci0KIAkJLyogbm90IGEgYnJpZGdlIHBvcnQgKi8KLQkJaWYgKCFwKQotCQkJY29udGludWU7CisJCWlmIChkZXYtPmJyX3BvcnQgPT0gTlVMTCB8fCBpZHggPCBjYi0+YXJnc1swXSkKKwkJCWdvdG8gc2tpcDsKIAotCQlpZiAoaWR4IDwgc19pZHgpCi0JCQlnb3RvIGNvbnQ7Ci0KLQkJZXJyID0gYnJfZmlsbF9pZmluZm8oc2tiLCBwLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKLQkJCQkgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgUlRNX05FV0xJTkssIE5MTV9GX01VTFRJKTsKLQkJaWYgKGVyciA8PSAwKQorCQlpZiAoYnJfZmlsbF9pZmluZm8oc2tiLCBkZXYtPmJyX3BvcnQsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCSAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgUlRNX05FV0xJTkssCisJCQkJICAgTkxNX0ZfTVVMVEkpIDwgMCkKIAkJCWJyZWFrOwotY29udDoKK3NraXA6CiAJCSsraWR4OwogCX0KIAlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CkBAIC0xMzgsMjYgKzEzMiwyNyBAQAogICovCiBzdGF0aWMgaW50IGJyX3J0bV9zZXRsaW5rKHN0cnVjdCBza19idWZmICpza2IsICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBydGF0dHIgICoqcnRhID0gYXJnOwotCXN0cnVjdCBpZmluZm9tc2cgKmlmbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZm07CisJc3RydWN0IG5sYXR0ciAqcHJvdGluZm87CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOwogCXU4IG5ld19zdGF0ZTsKIAorCWlmIChubG1zZ19sZW4obmxoKSA8IHNpemVvZigqaWZtKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZm0gPSBubG1zZ19kYXRhKG5saCk7CiAJaWYgKGlmbS0+aWZpX2ZhbWlseSAhPSBBRl9CUklER0UpCiAJCXJldHVybiAtRVBGTk9TVVBQT1JUOwogCi0JLyogTXVzdCBwYXNzIHZhbGlkIHN0YXRlIGFzIFBST1RJTkZPICovCi0JaWYgKHJ0YVtJRkxBX1BST1RJTkZPLTFdKSB7Ci0JCXU4ICpwc3RhdGUgPSBSVEFfREFUQShydGFbSUZMQV9QUk9USU5GTy0xXSk7Ci0JCW5ld19zdGF0ZSA9ICpwc3RhdGU7Ci0JfSBlbHNlCisJcHJvdGluZm8gPSBubG1zZ19maW5kX2F0dHIobmxoLCBzaXplb2YoKmlmbSksIElGTEFfUFJPVElORk8pOworCWlmICghcHJvdGluZm8gfHwgbmxhX2xlbihwcm90aW5mbykgPCBzaXplb2YodTgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCW5ld19zdGF0ZSA9IG5sYV9nZXRfdTgocHJvdGluZm8pOwogCWlmIChuZXdfc3RhdGUgPiBCUl9TVEFURV9CTE9DS0lORykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBGaW5kIGJyaWRnZSBwb3J0ICovCiAJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KGlmbS0+aWZpX2luZGV4KTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNzAsMTAgKzE2NSw4IEBACiAJaWYgKHAtPmJyLT5zdHBfZW5hYmxlZCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQotCQlyZXR1cm4gLUVORVRET1dOOwotCi0JaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikgJiYgbmV3X3N0YXRlICE9IEJSX1NUQVRFX0RJU0FCTEVEKQorCWlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8CisJICAgICghbmV0aWZfY2Fycmllcl9vayhkZXYpICYmIG5ld19zdGF0ZSAhPSBCUl9TVEFURV9ESVNBQkxFRCkpCiAJCXJldHVybiAtRU5FVERPV047CiAKIAlwLT5zdGF0ZSA9IG5ld19zdGF0ZTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKaW5kZXggYzQ5MWZiMi4uM2E1MzRlOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKKysrIGIvbmV0L2JyaWRnZS9icl9wcml2YXRlLmgKQEAgLTgyLDcgKzgyLDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJaG9sZF90aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJbWVzc2FnZV9hZ2VfdGltZXI7CiAJc3RydWN0IGtvYmplY3QJCQlrb2JqOwotCXN0cnVjdCB3b3JrX3N0cnVjdAkJY2Fycmllcl9jaGVjazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQljYXJyaWVyX2NoZWNrOwogCXN0cnVjdCByY3VfaGVhZAkJCXJjdTsKIH07CiAKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3YWRkcik7CiBleHRlcm4gdm9pZCBicl9mZGJfY2xlYW51cCh1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gdm9pZCBicl9mZGJfZGVsZXRlX2J5X3BvcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkJICAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CisJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgZG9fYWxsKTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKl9fYnJfZmRiX2dldChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcik7CiBleHRlcm4gc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpicl9mZGJfZ2V0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMgYi9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCmluZGV4IDE0Y2QwMjUuLmQyOTQyMjQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zdHBfaWYuYwpAQCAtMTEzLDYgKzExMyw4IEBACiAJZGVsX3RpbWVyKCZwLT5mb3J3YXJkX2RlbGF5X3RpbWVyKTsKIAlkZWxfdGltZXIoJnAtPmhvbGRfdGltZXIpOwogCisJYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KGJyLCBwLCAwKTsKKwogCWJyX2NvbmZpZ3VyYXRpb25fdXBkYXRlKGJyKTsKIAogCWJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKGJyKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYwppbmRleCA5NmJjYjJmLi5kZTlkMWE5IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCkBAIC0zNzYsNyArMzc2LDcgQEAKIAogCWVyciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShicm9iaiwgJmJyaWRnZV9mb3J3YXJkKTsKIAlpZiAoZXJyKSB7Ci0JCXByX2luZm8oIiVzOiBjYW4ndCBjcmVhdGUgYXR0cmlidWUgZmlsZSAlcy8lc1xuIiwKKwkJcHJfaW5mbygiJXM6IGNhbid0IGNyZWF0ZSBhdHRyaWJ1dGUgZmlsZSAlcy8lc1xuIiwKIAkJCV9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBicmlkZ2VfZm9yd2FyZC5hdHRyLm5hbWUpOwogCQlnb3RvIG91dDI7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0XzgwMl8zLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfODAyXzMuYwppbmRleCBkNDJmNjNmLi45YWJiYzA5IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfODAyXzMuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfODAyXzMuYwpAQCAtMTcsNyArMTcsNyBAQAogewogCXN0cnVjdCBlYnRfODAyXzNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZWJ0XzgwMl8zX2luZm8gKilkYXRhOwogCXN0cnVjdCBlYnRfODAyXzNfaGRyICpoZHIgPSBlYnRfODAyXzNfaGRyKHNrYik7Ci0JdWludDE2X3QgdHlwZSA9IGhkci0+bGxjLnVpLmN0cmwgJiBJU19VSSA/IGhkci0+bGxjLnVpLnR5cGUgOiBoZHItPmxsYy5uaS50eXBlOworCV9fYmUxNiB0eXBlID0gaGRyLT5sbGMudWkuY3RybCAmIElTX1VJID8gaGRyLT5sbGMudWkudHlwZSA6IGhkci0+bGxjLm5pLnR5cGU7CiAKIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF84MDJfM19TQVApIHsKIAkJaWYgKEZXSU5WKGluZm8tPnNhcCAhPSBoZHItPmxsYy51aS5zc2FwLCBFQlRfODAyXzNfU0FQKSkgCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYW1vbmcuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hbW9uZy5jCmluZGV4IGE2MTQ0ODUuLmNlOTdjNDIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hbW9uZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hbW9uZy5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0YXRpYyBpbnQgZWJ0X21hY193b3JtaGFzaF9jb250YWlucyhjb25zdCBzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaCAqd2gsCi0JCQkJICAgICBjb25zdCBjaGFyICptYWMsIHVpbnQzMl90IGlwKQorCQkJCSAgICAgY29uc3QgY2hhciAqbWFjLCBfX2JlMzIgaXApCiB7CiAJLyogWW91IG1heSBiZSBwdXp6bGVkIGFzIHRvIGhvdyB0aGlzIGNvZGUgd29ya3MuCiAJICogU29tZSB0cmlja3Mgd2VyZSB1c2VkLCByZWZlciB0byAKQEAgLTcwLDcgKzcwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnZXRfaXBfZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVpbnQzMl90ICphZGRyKQorc3RhdGljIGludCBnZXRfaXBfZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIF9fYmUzMiAqYWRkcikKIHsKIAlpZiAoZXRoX2hkcihza2IpLT5oX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSkgewogCQlzdHJ1Y3QgaXBoZHIgX2lwaCwgKmloOwpAQCAtODEsMTYgKzgxLDE2IEBACiAJCSphZGRyID0gaWgtPmRhZGRyOwogCX0gZWxzZSBpZiAoZXRoX2hkcihza2IpLT5oX3Byb3RvID09IGh0b25zKEVUSF9QX0FSUCkpIHsKIAkJc3RydWN0IGFycGhkciBfYXJwaCwgKmFoOwotCQl1aW50MzJfdCBidWYsICpicDsKKwkJX19iZTMyIGJ1ZiwgKmJwOwogCiAJCWFoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9hcnBoKSwgJl9hcnBoKTsKIAkJaWYgKGFoID09IE5VTEwgfHwKLQkJICAgIGFoLT5hcl9wbG4gIT0gc2l6ZW9mKHVpbnQzMl90KSB8fAorCQkgICAgYWgtPmFyX3BsbiAhPSBzaXplb2YoX19iZTMyKSB8fAogCQkgICAgYWgtPmFyX2hsbiAhPSBFVEhfQUxFTikKIAkJCXJldHVybiAtMTsKIAkJYnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkcikgKwotCQkJCQkyICogRVRIX0FMRU4gKyBzaXplb2YodWludDMyX3QpLAotCQkJCQlzaXplb2YodWludDMyX3QpLCAmYnVmKTsKKwkJCQkJMiAqIEVUSF9BTEVOICsgc2l6ZW9mKF9fYmUzMiksCisJCQkJCXNpemVvZihfX2JlMzIpLCAmYnVmKTsKIAkJaWYgKGJwID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7CiAJCSphZGRyID0gKmJwOwpAQCAtOTgsNyArOTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF9pcF9zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDMyX3QgKmFkZHIpCitzdGF0aWMgaW50IGdldF9pcF9zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTMyICphZGRyKQogewogCWlmIChldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKSB7CiAJCXN0cnVjdCBpcGhkciBfaXBoLCAqaWg7CkBAIC0xMDksMTUgKzEwOSwxNSBAQAogCQkqYWRkciA9IGloLT5zYWRkcjsKIAl9IGVsc2UgaWYgKGV0aF9oZHIoc2tiKS0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9BUlApKSB7CiAJCXN0cnVjdCBhcnBoZHIgX2FycGgsICphaDsKLQkJdWludDMyX3QgYnVmLCAqYnA7CisJCV9fYmUzMiBidWYsICpicDsKIAogCQlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZihfYXJwaCksICZfYXJwaCk7CiAJCWlmIChhaCA9PSBOVUxMIHx8Ci0JCSAgICBhaC0+YXJfcGxuICE9IHNpemVvZih1aW50MzJfdCkgfHwKKwkJICAgIGFoLT5hcl9wbG4gIT0gc2l6ZW9mKF9fYmUzMikgfHwKIAkJICAgIGFoLT5hcl9obG4gIT0gRVRIX0FMRU4pCiAJCQlyZXR1cm4gLTE7CiAJCWJwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKLQkJCQkJRVRIX0FMRU4sIHNpemVvZih1aW50MzJfdCksICZidWYpOworCQkJCQlFVEhfQUxFTiwgc2l6ZW9mKF9fYmUzMiksICZidWYpOwogCQlpZiAoYnAgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKIAkJKmFkZHIgPSAqYnA7CkBAIC0xMzMsNyArMTMzLDcgQEAKIAlzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9hbW9uZ19pbmZvICopIGRhdGE7CiAJY29uc3QgY2hhciAqZG1hYywgKnNtYWM7CiAJY29uc3Qgc3RydWN0IGVidF9tYWNfd29ybWhhc2ggKndoX2RzdCwgKndoX3NyYzsKLQl1aW50MzJfdCBkaXAgPSAwLCBzaXAgPSAwOworCV9fYmUzMiBkaXAgPSAwLCBzaXAgPSAwOwogCiAJd2hfZHN0ID0gZWJ0X2Ftb25nX3doX2RzdChpbmZvKTsKIAl3aF9zcmMgPSBlYnRfYW1vbmdfd2hfc3JjKGluZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jCmluZGV4IGE2YzgxZDkuLjljNTk5ODAgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnAuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMKQEAgLTM1LDEwICszNSwxMCBAQAogCQlyZXR1cm4gRUJUX05PTUFUQ0g7CiAKIAlpZiAoaW5mby0+Yml0bWFzayAmIChFQlRfQVJQX1NSQ19JUCB8IEVCVF9BUlBfRFNUX0lQKSkgewotCQl1aW50MzJfdCBfYWRkciwgKmFwOworCQlfX2JlMzIgX2FkZHIsICphcDsKIAogCQkvKiBJUHY0IGFkZHJlc3NlcyBhcmUgYWx3YXlzIDQgYnl0ZXMgKi8KLQkJaWYgKGFoLT5hcl9wbG4gIT0gc2l6ZW9mKHVpbnQzMl90KSkKKwkJaWYgKGFoLT5hcl9wbG4gIT0gc2l6ZW9mKF9fYmUzMikpCiAJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CiAJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9TUkNfSVApIHsKIAkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKQEAgLTUzLDcgKzUzLDcgQEAKIAogCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfRFNUX0lQKSB7CiAJCQlhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCi0JCQkJCQkyKmFoLT5hcl9obG4rc2l6ZW9mKHVpbnQzMl90KSwKKwkJCQkJCTIqYWgtPmFyX2hsbitzaXplb2YoX19iZTMyKSwKIAkJCQkJCXNpemVvZihfYWRkciksICZfYWRkcik7CiAJCQlpZiAoYXAgPT0gTlVMTCkKIAkJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXAuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9pcC5jCmluZGV4IDY1YjY2NWMuLmU0YzY0MjQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9pcC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9pcC5jCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCB0Y3B1ZHBoZHIgewotCXVpbnQxNl90IHNyYzsKLQl1aW50MTZfdCBkc3Q7CisJX19iZTE2IHNyYzsKKwlfX2JlMTYgZHN0OwogfTsKIAogc3RhdGljIGludCBlYnRfZmlsdGVyX2lwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwppbmRleCA0NjZlZDM0Li5hMTg0Zjg3IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCkBAIC0zOCw4ICszOCw4IEBACiAKIHN0cnVjdCB0Y3B1ZHBoZHIKIHsKLQl1aW50MTZfdCBzcmM7Ci0JdWludDE2X3QgZHN0OworCV9fYmUxNiBzcmM7CisJX19iZTE2IGRzdDsKIH07CiAKIHN0cnVjdCBhcnBwYXlsb2FkCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJICogdGhlbiBsb2cgdGhlIEFSUCBwYXlsb2FkICovCiAJCWlmIChhaC0+YXJfaHJkID09IGh0b25zKDEpICYmCiAJCSAgICBhaC0+YXJfaGxuID09IEVUSF9BTEVOICYmCi0JCSAgICBhaC0+YXJfcGxuID09IHNpemVvZih1aW50MzJfdCkpIHsKKwkJICAgIGFoLT5hcl9wbG4gPT0gc2l6ZW9mKF9fYmUzMikpIHsKIAkJCXN0cnVjdCBhcnBwYXlsb2FkIF9hcnBwLCAqYXA7CiAKIAkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKF9hcnBoKSwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9tYXJrLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbWFyay5jCmluZGV4IGI1NDMwNmEuLjYyZDIzYzcgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9tYXJrLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmsuYwpAQCAtMjUsMTUgKzI1LDE1IEBACiAJaW50IGFjdGlvbiA9IGluZm8tPnRhcmdldCAmIC0xNjsKIAogCWlmIChhY3Rpb24gPT0gTUFSS19TRVRfVkFMVUUpCi0JCSgqcHNrYiktPm5mbWFyayA9IGluZm8tPm1hcms7CisJCSgqcHNrYiktPm1hcmsgPSBpbmZvLT5tYXJrOwogCWVsc2UgaWYgKGFjdGlvbiA9PSBNQVJLX09SX1ZBTFVFKQotCQkoKnBza2IpLT5uZm1hcmsgfD0gaW5mby0+bWFyazsKKwkJKCpwc2tiKS0+bWFyayB8PSBpbmZvLT5tYXJrOwogCWVsc2UgaWYgKGFjdGlvbiA9PSBNQVJLX0FORF9WQUxVRSkKLQkJKCpwc2tiKS0+bmZtYXJrICY9IGluZm8tPm1hcms7CisJCSgqcHNrYiktPm1hcmsgJj0gaW5mby0+bWFyazsKIAllbHNlCi0JCSgqcHNrYiktPm5mbWFyayBePSBpbmZvLT5tYXJrOworCQkoKnBza2IpLT5tYXJrIF49IGluZm8tPm1hcms7CiAKLQlyZXR1cm4gaW5mby0+dGFyZ2V0IHwgLTE2OworCXJldHVybiBpbmZvLT50YXJnZXQgfCB+RUJUX1ZFUkRJQ1RfQklUUzsKIH0KIAogc3RhdGljIGludCBlYnRfdGFyZ2V0X21hcmtfY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssCkBAIC00NCwxMyArNDQsMTMgQEAKIAogCWlmIChkYXRhbGVuICE9IEVCVF9BTElHTihzaXplb2Yoc3RydWN0IGVidF9tYXJrX3RfaW5mbykpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl0bXAgPSBpbmZvLT50YXJnZXQgfCAtMTY7CisJdG1wID0gaW5mby0+dGFyZ2V0IHwgfkVCVF9WRVJESUNUX0JJVFM7CiAJaWYgKEJBU0VfQ0hBSU4gJiYgdG1wID09IEVCVF9SRVRVUk4pCiAJCXJldHVybiAtRUlOVkFMOwogCUNMRUFSX0JBU0VfQ0hBSU5fQklUOwogCWlmICh0bXAgPCAtTlVNX1NUQU5EQVJEX1RBUkdFVFMgfHwgdG1wID49IDApCiAJCXJldHVybiAtRUlOVkFMOwotCXRtcCA9IGluZm8tPnRhcmdldCAmIC0xNjsKKwl0bXAgPSBpbmZvLT50YXJnZXQgJiB+RUJUX1ZFUkRJQ1RfQklUUzsKIAlpZiAodG1wICE9IE1BUktfU0VUX1ZBTFVFICYmIHRtcCAhPSBNQVJLX09SX1ZBTFVFICYmCiAJICAgIHRtcCAhPSBNQVJLX0FORF9WQUxVRSAmJiB0bXAgIT0gTUFSS19YT1JfVkFMVUUpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmtfbS5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmtfbS5jCmluZGV4IGE2NDEzZTQuLjAyNTg2OWVlMCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X21hcmtfbS5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9tYXJrX20uYwpAQCAtMTksOCArMTksOCBAQAogCXN0cnVjdCBlYnRfbWFya19tX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9tYXJrX21faW5mbyAqKSBkYXRhOwogCiAJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfTUFSS19PUikKLQkJcmV0dXJuICEoISEoc2tiLT5uZm1hcmsgJiBpbmZvLT5tYXNrKSBeIGluZm8tPmludmVydCk7Ci0JcmV0dXJuICEoKChza2ItPm5mbWFyayAmIGluZm8tPm1hc2spID09IGluZm8tPm1hcmspIF4gaW5mby0+aW52ZXJ0KTsKKwkJcmV0dXJuICEoISEoc2tiLT5tYXJrICYgaW5mby0+bWFzaykgXiBpbmZvLT5pbnZlcnQpOworCXJldHVybiAhKCgoc2tiLT5tYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQpOwogfQogCiBzdGF0aWMgaW50IGVidF9tYXJrX2NoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgdW5zaWduZWQgaW50IGhvb2ttYXNrLApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3NuYXQuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9zbmF0LmMKaW5kZXggY2JiMzNlMi4uYTUwNzIyMSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3NuYXQuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfc25hdC5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbmF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CiAKIHN0YXRpYyBpbnQgZWJ0X3RhcmdldF9zbmF0KHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IGhvb2tuciwKICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKQEAgLTMxLDI0ICszMyw0MyBAQAogCQkqcHNrYiA9IG5za2I7CiAJfQogCW1lbWNweShldGhfaGRyKCpwc2tiKS0+aF9zb3VyY2UsIGluZm8tPm1hYywgRVRIX0FMRU4pOwotCXJldHVybiBpbmZvLT50YXJnZXQ7CisJaWYgKCEoaW5mby0+dGFyZ2V0ICYgTkFUX0FSUF9CSVQpICYmCisJICAgIGV0aF9oZHIoKnBza2IpLT5oX3Byb3RvID09IGh0b25zKEVUSF9QX0FSUCkpIHsKKwkJc3RydWN0IGFycGhkciBfYWgsICphcDsKKworCQlhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgMCwgc2l6ZW9mKF9haCksICZfYWgpOworCQlpZiAoYXAgPT0gTlVMTCkKKwkJCXJldHVybiBFQlRfRFJPUDsKKwkJaWYgKGFwLT5hcl9obG4gIT0gRVRIX0FMRU4pCisJCQlnb3RvIG91dDsKKwkJaWYgKHNrYl9zdG9yZV9iaXRzKCpwc2tiLCBzaXplb2YoX2FoKSwgaW5mby0+bWFjLEVUSF9BTEVOKSkKKwkJCXJldHVybiBFQlRfRFJPUDsKKwl9CitvdXQ6CisJcmV0dXJuIGluZm8tPnRhcmdldCB8IH5FQlRfVkVSRElDVF9CSVRTOwogfQogCiBzdGF0aWMgaW50IGVidF90YXJnZXRfc25hdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywKICAgIGNvbnN0IHN0cnVjdCBlYnRfZW50cnkgKmUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuKQogewogCXN0cnVjdCBlYnRfbmF0X2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9uYXRfaW5mbyAqKSBkYXRhOworCWludCB0bXA7CiAKIAlpZiAoZGF0YWxlbiAhPSBFQlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBlYnRfbmF0X2luZm8pKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKEJBU0VfQ0hBSU4gJiYgaW5mby0+dGFyZ2V0ID09IEVCVF9SRVRVUk4pCisJdG1wID0gaW5mby0+dGFyZ2V0IHwgfkVCVF9WRVJESUNUX0JJVFM7CisJaWYgKEJBU0VfQ0hBSU4gJiYgdG1wID09IEVCVF9SRVRVUk4pCiAJCXJldHVybiAtRUlOVkFMOwogCUNMRUFSX0JBU0VfQ0hBSU5fQklUOwogCWlmIChzdHJjbXAodGFibGVuYW1lLCAibmF0IikpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChob29rbWFzayAmIH4oMSA8PCBORl9CUl9QT1NUX1JPVVRJTkcpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoSU5WQUxJRF9UQVJHRVQpCisKKwlpZiAodG1wIDwgLU5VTV9TVEFOREFSRF9UQVJHRVRTIHx8IHRtcCA+PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0bXAgPSBpbmZvLT50YXJnZXQgfCBFQlRfVkVSRElDVF9CSVRTOworCWlmICgodG1wICYgfk5BVF9BUlBfQklUKSAhPSB+TkFUX0FSUF9CSVQpCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF91bG9nLmMKaW5kZXggOWY5NTBkYi4uYzFhZjY4YiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlpZiAodWItPnFsZW4gPT0gMSkKIAkJc2tiX3NldF90aW1lc3RhbXAodWItPnNrYiwgJnBtLT5zdGFtcCk7CiAJcG0tPmRhdGFfbGVuID0gY29weV9sZW47Ci0JcG0tPm1hcmsgPSBza2ItPm5mbWFyazsKKwlwbS0+bWFyayA9IHNrYi0+bWFyazsKIAlwbS0+aG9vayA9IGhvb2tucjsKIAlpZiAodWxvZ2luZm8tPnByZWZpeCAhPSBOVUxMKQogCQlzdHJjcHkocG0tPnByZWZpeCwgdWxvZ2luZm8tPnByZWZpeCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdmxhbi5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3ZsYW4uYwppbmRleCBhMmI0NTI4Li43ZWUzNzc2IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdmxhbi5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF92bGFuLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBpZDsJLyogVkxBTiBJRCwgZ2l2ZW4gZnJvbSBmcmFtZSBUQ0kgKi8KIAl1bnNpZ25lZCBjaGFyIHByaW87CS8qIHVzZXJfcHJpb3JpdHksIGdpdmVuIGZyb20gZnJhbWUgVENJICovCiAJLyogVkxBTiBlbmNhcHN1bGF0ZWQgVHlwZS9MZW5ndGggZmllbGQsIGdpdmVuIGZyb20gb3JpZyBmcmFtZSAqLwotCXVuc2lnbmVkIHNob3J0IGVuY2FwOworCV9fYmUxNiBlbmNhcDsKIAogCWZwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgMCwgc2l6ZW9mKF9mcmFtZSksICZfZnJhbWUpOwogCWlmIChmcCA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9icm91dGUuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfYnJvdXRlLmMKaW5kZXggOWE2ZTU0OC4uZDM3Y2UwNCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9icm91dGUuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2Jyb3V0ZS5jCkBAIC0yMyw3ICsyMyw3IEBACiAJLnBvbGljeQkJPSBFQlRfQUNDRVBULAogfTsKIAotc3RhdGljIHN0cnVjdCBlYnRfcmVwbGFjZSBpbml0aWFsX3RhYmxlID0KK3N0YXRpYyBzdHJ1Y3QgZWJ0X3JlcGxhY2Vfa2VybmVsIGluaXRpYWxfdGFibGUgPQogewogCS5uYW1lCQk9ICJicm91dGUiLAogCS52YWxpZF9ob29rcwk9IDEgPDwgTkZfQlJfQlJPVVRJTkcsCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2ZpbHRlci5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9maWx0ZXIuYwppbmRleCAzZDViZDQ0Li4xMjcxMzVlIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfZmlsdGVyLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBlYnRfcmVwbGFjZSBpbml0aWFsX3RhYmxlID0KK3N0YXRpYyBzdHJ1Y3QgZWJ0X3JlcGxhY2Vfa2VybmVsIGluaXRpYWxfdGFibGUgPQogewogCS5uYW1lCQk9ICJmaWx0ZXIiLAogCS52YWxpZF9ob29rcwk9IEZJTFRFUl9WQUxJRF9IT09LUywKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfbmF0LmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX25hdC5jCmluZGV4IDA0ZGQ0MmUuLjljNTA0ODggMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfbmF0LmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9uYXQuYwpAQCAtMzAsNyArMzAsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZWJ0X3JlcGxhY2UgaW5pdGlhbF90YWJsZSA9CitzdGF0aWMgc3RydWN0IGVidF9yZXBsYWNlX2tlcm5lbCBpbml0aWFsX3RhYmxlID0KIHsKIAkubmFtZQkJPSAibmF0IiwKIAkudmFsaWRfaG9va3MJPSBOQVRfVkFMSURfSE9PS1MsCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYwppbmRleCAzZGY1NWIyLi5iZWU1NThhNCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCkBAIC04Niw3ICs4Niw3IEBACiBzdGF0aWMgaW5saW5lIGludCBlYnRfZGV2X2NoZWNrKGNoYXIgKmVudHJ5LCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2aWNlKQogewogCWludCBpID0gMDsKLQljaGFyICpkZXZuYW1lID0gZGV2aWNlLT5uYW1lOworCWNvbnN0IGNoYXIgKmRldm5hbWUgPSBkZXZpY2UtPm5hbWU7CiAKIAlpZiAoKmVudHJ5ID09ICdcMCcpCiAJCXJldHVybiAwOwpAQCAtMzM4LDEwICszMzgsMTEgQEAKICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBob29rbWFzaywgdW5zaWduZWQgaW50ICpjbnQpCiB7CiAJc3RydWN0IGVidF9tYXRjaCAqbWF0Y2g7CisJc2l6ZV90IGxlZnQgPSAoKGNoYXIgKillICsgZS0+d2F0Y2hlcnNfb2Zmc2V0KSAtIChjaGFyICopbTsKIAlpbnQgcmV0OwogCi0JaWYgKCgoY2hhciAqKW0pICsgbS0+bWF0Y2hfc2l6ZSArIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSA+Ci0JICAgKChjaGFyICopZSkgKyBlLT53YXRjaGVyc19vZmZzZXQpCisJaWYgKGxlZnQgPCBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV9tYXRjaCkgfHwKKwkgICAgbGVmdCAtIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSA8IG0tPm1hdGNoX3NpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCW1hdGNoID0gZmluZF9tYXRjaF9sb2NrKG0tPnUubmFtZSwgJnJldCwgJmVidF9tdXRleCk7CiAJaWYgKCFtYXRjaCkKQEAgLTM2NywxMCArMzY4LDExIEBACiAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssIHVuc2lnbmVkIGludCAqY250KQogewogCXN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcjsKKwlzaXplX3QgbGVmdCA9ICgoY2hhciAqKWUgKyBlLT50YXJnZXRfb2Zmc2V0KSAtIChjaGFyICopdzsKIAlpbnQgcmV0OwogCi0JaWYgKCgoY2hhciAqKXcpICsgdy0+d2F0Y2hlcl9zaXplICsgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlcikgPgotCSAgICgoY2hhciAqKWUpICsgZS0+dGFyZ2V0X29mZnNldCkKKwlpZiAobGVmdCA8IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpIHx8CisJICAgbGVmdCAtIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIpIDwgdy0+d2F0Y2hlcl9zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAl3YXRjaGVyID0gZmluZF93YXRjaGVyX2xvY2sody0+dS5uYW1lLCAmcmV0LCAmZWJ0X211dGV4KTsKIAlpZiAoIXdhdGNoZXIpCkBAIC0zOTEsMzUgKzM5Myw5MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGVidF92ZXJpZnlfcG9pbnRlcnMoc3RydWN0IGVidF9yZXBsYWNlICpyZXBsLAorCQkJICAgICAgIHN0cnVjdCBlYnRfdGFibGVfaW5mbyAqbmV3aW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgbGltaXQgPSByZXBsLT5lbnRyaWVzX3NpemU7CisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzID0gcmVwbC0+dmFsaWRfaG9va3M7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykKKwkJbmV3aW5mby0+aG9va19lbnRyeVtpXSA9IE5VTEw7CisKKwluZXdpbmZvLT5lbnRyaWVzX3NpemUgPSByZXBsLT5lbnRyaWVzX3NpemU7CisJbmV3aW5mby0+bmVudHJpZXMgPSByZXBsLT5uZW50cmllczsKKworCXdoaWxlIChvZmZzZXQgPCBsaW1pdCkgeworCQlzaXplX3QgbGVmdCA9IGxpbWl0IC0gb2Zmc2V0OworCQlzdHJ1Y3QgZWJ0X2VudHJ5ICplID0gKHZvaWQgKiluZXdpbmZvLT5lbnRyaWVzICsgb2Zmc2V0OworCisJCWlmIChsZWZ0IDwgc2l6ZW9mKHVuc2lnbmVkIGludCkpCisJCQlicmVhazsKKworCQlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykgeworCQkJaWYgKCh2YWxpZF9ob29rcyAmICgxIDw8IGkpKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChjaGFyIF9fdXNlciAqKXJlcGwtPmhvb2tfZW50cnlbaV0gPT0KKwkJCSAgICAgcmVwbC0+ZW50cmllcyArIG9mZnNldCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpICE9IE5GX0JSX05VTUhPT0tTIHx8ICEoZS0+Yml0bWFzayAmIEVCVF9FTlRSWV9PUl9FTlRSSUVTKSkgeworCQkJaWYgKGUtPmJpdG1hc2sgIT0gMCkgeworCQkJCS8qIHdlIG1ha2UgdXNlcnNwYWNlIHNldCB0aGlzIHJpZ2h0LAorCQkJCSAgIHNvIHRoZXJlIGlzIG5vIG1pc3VuZGVyc3RhbmRpbmcgKi8KKwkJCQlCVUdQUklOVCgiRUJUX0VOVFJZX09SX0VOVFJJRVMgc2hvdWxkbid0IGJlIHNldCAiCisJCQkJCSAiaW4gZGlzdGluZ3Vpc2hlclxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoaSAhPSBORl9CUl9OVU1IT09LUykKKwkJCQluZXdpbmZvLT5ob29rX2VudHJ5W2ldID0gKHN0cnVjdCBlYnRfZW50cmllcyAqKWU7CisJCQlpZiAobGVmdCA8IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJpZXMpKQorCQkJCWJyZWFrOworCQkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJpZXMpOworCQl9IGVsc2UgeworCQkJaWYgKGxlZnQgPCBzaXplb2Yoc3RydWN0IGVidF9lbnRyeSkpCisJCQkJYnJlYWs7CisJCQlpZiAobGVmdCA8IGUtPm5leHRfb2Zmc2V0KQorCQkJCWJyZWFrOworCQkJb2Zmc2V0ICs9IGUtPm5leHRfb2Zmc2V0OworCQl9CisJfQorCWlmIChvZmZzZXQgIT0gbGltaXQpIHsKKwkJQlVHUFJJTlQoImVudHJpZXNfc2l6ZSB0b28gc21hbGxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjaGVjayBpZiBhbGwgdmFsaWQgaG9va3MgaGF2ZSBhIGNoYWluICovCisJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspIHsKKwkJaWYgKCFuZXdpbmZvLT5ob29rX2VudHJ5W2ldICYmCisJCSAgICh2YWxpZF9ob29rcyAmICgxIDw8IGkpKSkgeworCQkJQlVHUFJJTlQoIlZhbGlkIGhvb2sgd2l0aG91dCBjaGFpblxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIHRoaXMgb25lIGlzIHZlcnkgY2FyZWZ1bCwgYXMgaXQgaXMgdGhlIGZpcnN0IGZ1bmN0aW9uCiAgKiB0byBwYXJzZSB0aGUgdXNlcnNwYWNlIGRhdGEKICAqLwogc3RhdGljIGlubGluZSBpbnQKIGVidF9jaGVja19lbnRyeV9zaXplX2FuZF9ob29rcyhzdHJ1Y3QgZWJ0X2VudHJ5ICplLAotICAgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvLCBjaGFyICpiYXNlLCBjaGFyICpsaW1pdCwKLSAgIHN0cnVjdCBlYnRfZW50cmllcyAqKmhvb2tfZW50cmllcywgdW5zaWduZWQgaW50ICpuLCB1bnNpZ25lZCBpbnQgKmNudCwKLSAgIHVuc2lnbmVkIGludCAqdG90YWxjbnQsIHVuc2lnbmVkIGludCAqdWRjX2NudCwgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzKQorICAgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvLAorICAgdW5zaWduZWQgaW50ICpuLCB1bnNpZ25lZCBpbnQgKmNudCwKKyAgIHVuc2lnbmVkIGludCAqdG90YWxjbnQsIHVuc2lnbmVkIGludCAqdWRjX2NudCkKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7Ci0JCWlmICgodmFsaWRfaG9va3MgJiAoMSA8PCBpKSkgPT0gMCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIChjaGFyICopaG9va19lbnRyaWVzW2ldIC0gYmFzZSA9PQotCQkgICAoY2hhciAqKWUgLSBuZXdpbmZvLT5lbnRyaWVzKQorCQlpZiAoKHZvaWQgKillID09ICh2b2lkICopbmV3aW5mby0+aG9va19lbnRyeVtpXSkKIAkJCWJyZWFrOwogCX0KIAkvKiBiZWdpbm5pbmcgb2YgYSBuZXcgY2hhaW4KIAkgICBpZiBpID09IE5GX0JSX05VTUhPT0tTIGl0IG11c3QgYmUgYSB1c2VyIGRlZmluZWQgY2hhaW4gKi8KLQlpZiAoaSAhPSBORl9CUl9OVU1IT09LUyB8fCAhKGUtPmJpdG1hc2sgJiBFQlRfRU5UUllfT1JfRU5UUklFUykpIHsKLQkJaWYgKChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpICE9IDApIHsKLQkJCS8qIHdlIG1ha2UgdXNlcnNwYWNlIHNldCB0aGlzIHJpZ2h0LAotCQkJICAgc28gdGhlcmUgaXMgbm8gbWlzdW5kZXJzdGFuZGluZyAqLwotCQkJQlVHUFJJTlQoIkVCVF9FTlRSWV9PUl9FTlRSSUVTIHNob3VsZG4ndCBiZSBzZXQgIgotCQkJICAgICAgICAgImluIGRpc3Rpbmd1aXNoZXJcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwlpZiAoaSAhPSBORl9CUl9OVU1IT09LUyB8fCAhZS0+Yml0bWFzaykgewogCQkvKiB0aGlzIGNoZWNrcyBpZiB0aGUgcHJldmlvdXMgY2hhaW4gaGFzIGFzIG1hbnkgZW50cmllcwogCQkgICBhcyBpdCBzYWlkIGl0IGhhcyAqLwogCQlpZiAoKm4gIT0gKmNudCkgewpAQCAtNDI3LDEyICs0ODUsNiBAQAogCQkgICAgICAgICAgICAgICAgICJpbiB0aGUgY2hhaW5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJLyogYmVmb3JlIHdlIGxvb2sgYXQgdGhlIHN0cnVjdCwgYmUgc3VyZSBpdCBpcyBub3QgdG9vIGJpZyAqLwotCQlpZiAoKGNoYXIgKilob29rX2VudHJpZXNbaV0gKyBzaXplb2Yoc3RydWN0IGVidF9lbnRyaWVzKQotCQkgICA+IGxpbWl0KSB7Ci0JCQlCVUdQUklOVCgiZW50cmllc19zaXplIHRvbyBzbWFsbFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQogCQlpZiAoKChzdHJ1Y3QgZWJ0X2VudHJpZXMgKillKS0+cG9saWN5ICE9IEVCVF9EUk9QICYmCiAJCSAgICgoc3RydWN0IGVidF9lbnRyaWVzICopZSktPnBvbGljeSAhPSBFQlRfQUNDRVBUKSB7CiAJCQkvKiBvbmx5IFJFVFVSTiBmcm9tIHVkYyAqLwpAQCAtNDQ0LDggKzQ5Niw2IEBACiAJCX0KIAkJaWYgKGkgPT0gTkZfQlJfTlVNSE9PS1MpIC8qIGl0J3MgYSB1c2VyIGRlZmluZWQgY2hhaW4gKi8KIAkJCSgqdWRjX2NudCkrKzsKLQkJZWxzZQotCQkJbmV3aW5mby0+aG9va19lbnRyeVtpXSA9IChzdHJ1Y3QgZWJ0X2VudHJpZXMgKillOwogCQlpZiAoKChzdHJ1Y3QgZWJ0X2VudHJpZXMgKillKS0+Y291bnRlcl9vZmZzZXQgIT0gKnRvdGFsY250KSB7CiAJCQlCVUdQUklOVCgiY291bnRlcl9vZmZzZXQgIT0gdG90YWxjbnQiKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtNDY2LDcgKzUxNiw2IEBACiAJCUJVR1BSSU5UKCJ0YXJnZXQgc2l6ZSB0b28gc21hbGxcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0KIAkoKmNudCkrKzsKIAkoKnRvdGFsY250KSsrOwogCXJldHVybiAwOwpAQCAtNDg1LDE3ICs1MzQsMTQgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQKIGVidF9nZXRfdWRjX3Bvc2l0aW9ucyhzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKm5ld2luZm8sCi0gICBzdHJ1Y3QgZWJ0X2VudHJpZXMgKipob29rX2VudHJpZXMsIHVuc2lnbmVkIGludCAqbiwgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAotICAgc3RydWN0IGVidF9jbF9zdGFjayAqdWRjKQorICAgdW5zaWduZWQgaW50ICpuLCBzdHJ1Y3QgZWJ0X2NsX3N0YWNrICp1ZGMpCiB7CiAJaW50IGk7CiAKIAkvKiB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gY2hhaW4gc3RhcnRzICovCi0JaWYgKGUtPmJpdG1hc2sgJiBFQlRfRU5UUllfT1JfRU5UUklFUykKKwlpZiAoZS0+Yml0bWFzaykKIAkJcmV0dXJuIDA7CiAJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspIHsKLQkJaWYgKCh2YWxpZF9ob29rcyAmICgxIDw8IGkpKSA9PSAwKQotCQkJY29udGludWU7CiAJCWlmIChuZXdpbmZvLT5ob29rX2VudHJ5W2ldID09IChzdHJ1Y3QgZWJ0X2VudHJpZXMgKillKQogCQkJYnJlYWs7CiAJfQpAQCAtNTQxLDcgKzU4Nyw3IEBACiB7CiAJc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKnQ7CiAKLQlpZiAoKGUtPmJpdG1hc2sgJiBFQlRfRU5UUllfT1JfRU5UUklFUykgPT0gMCkKKwlpZiAoZS0+Yml0bWFzayA9PSAwKQogCQlyZXR1cm4gMDsKIAkvKiB3ZSdyZSBkb25lICovCiAJaWYgKGNudCAmJiAoKmNudCktLSA9PSAwKQpAQCAtNTU4LDE2ICs2MDQsMTcgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIGVidF9jaGVja19lbnRyeShzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKm5ld2luZm8sCi0gICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgKmNudCwgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAorICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50ICpjbnQsCiAgICBzdHJ1Y3QgZWJ0X2NsX3N0YWNrICpjbF9zLCB1bnNpZ25lZCBpbnQgdWRjX2NudCkKIHsKIAlzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldCAqdDsKIAlzdHJ1Y3QgZWJ0X3RhcmdldCAqdGFyZ2V0OwogCXVuc2lnbmVkIGludCBpLCBqLCBob29rID0gMCwgaG9va21hc2sgPSAwOworCXNpemVfdCBnYXAgPSBlLT5uZXh0X29mZnNldCAtIGUtPnRhcmdldF9vZmZzZXQ7CiAJaW50IHJldDsKIAogCS8qIGRvbid0IG1lc3Mgd2l0aCB0aGUgc3RydWN0IGVidF9lbnRyaWVzICovCi0JaWYgKChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpID09IDApCisJaWYgKGUtPmJpdG1hc2sgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoZS0+Yml0bWFzayAmIH5FQlRfRl9NQVNLKSB7CkBAIC01ODQsNyArNjMxLDcgQEAKIAl9CiAJLyogd2hhdCBob29rIGRvIHdlIGJlbG9uZyB0bz8gKi8KIAlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykgewotCQlpZiAoKHZhbGlkX2hvb2tzICYgKDEgPDwgaSkpID09IDApCisJCWlmICghbmV3aW5mby0+aG9va19lbnRyeVtpXSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGNoYXIgKiluZXdpbmZvLT5ob29rX2VudHJ5W2ldIDwgKGNoYXIgKillKQogCQkJaG9vayA9IGk7CkBAIC02MjUsOCArNjcyLDcgQEAKIAogCXQtPnUudGFyZ2V0ID0gdGFyZ2V0OwogCWlmICh0LT51LnRhcmdldCA9PSAmZWJ0X3N0YW5kYXJkX3RhcmdldCkgewotCQlpZiAoZS0+dGFyZ2V0X29mZnNldCArIHNpemVvZihzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldCkgPgotCQkgICBlLT5uZXh0X29mZnNldCkgeworCQlpZiAoZ2FwIDwgc2l6ZW9mKHN0cnVjdCBlYnRfc3RhbmRhcmRfdGFyZ2V0KSkgewogCQkJQlVHUFJJTlQoIlN0YW5kYXJkIHRhcmdldCBzaXplIHRvbyBiaWdcbiIpOwogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKQEAgLTYzNyw4ICs2ODMsNyBAQAogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gY2xlYW51cF93YXRjaGVyczsKIAkJfQotCX0gZWxzZSBpZiAoKGUtPnRhcmdldF9vZmZzZXQgKyB0LT50YXJnZXRfc2l6ZSArCi0JICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0KSA+IGUtPm5leHRfb2Zmc2V0KSB8fAorCX0gZWxzZSBpZiAodC0+dGFyZ2V0X3NpemUgPiBnYXAgLSBzaXplb2Yoc3RydWN0IGVidF9lbnRyeV90YXJnZXQpIHx8CiAJICAgKHQtPnUudGFyZ2V0LT5jaGVjayAmJgogCSAgIHQtPnUudGFyZ2V0LT5jaGVjayhuYW1lLCBob29rbWFzaywgZSwgdC0+ZGF0YSwgdC0+dGFyZ2V0X3NpemUpICE9IDApKXsKIAkJbW9kdWxlX3B1dCh0LT51LnRhcmdldC0+bWUpOwpAQCAtNzA4LDcgKzc1Myw5IEBACiAJCQkJQlVHUFJJTlQoImxvb3BcbiIpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KLQkJCS8qIHRoaXMgY2FuJ3QgYmUgMCwgc28gdGhlIGFib3ZlIHRlc3QgaXMgY29ycmVjdCAqLworCQkJaWYgKGNsX3NbaV0uaG9va21hc2sgJiAoMSA8PCBob29rbnIpKQorCQkJCWdvdG8gbGV0c2NvbnRpbnVlOworCQkJLyogdGhpcyBjYW4ndCBiZSAwLCBzbyB0aGUgbG9vcCB0ZXN0IGlzIGNvcnJlY3QgKi8KIAkJCWNsX3NbaV0uY3MubiA9IHBvcyArIDE7CiAJCQlwb3MgPSAwOwogCQkJY2xfc1tpXS5jcy5lID0gKCh2b2lkICopZSArIGUtPm5leHRfb2Zmc2V0KTsKQEAgLTcyOCw0MiArNzc1LDM1IEBACiB9CiAKIC8qIGRvIHRoZSBwYXJzaW5nIG9mIHRoZSB0YWJsZS9jaGFpbnMvZW50cmllcy9tYXRjaGVzL3dhdGNoZXJzL3RhcmdldHMsIGhlaCAqLwotc3RhdGljIGludCB0cmFuc2xhdGVfdGFibGUoc3RydWN0IGVidF9yZXBsYWNlICpyZXBsLAotICAgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvKQorc3RhdGljIGludCB0cmFuc2xhdGVfdGFibGUoY2hhciAqbmFtZSwgc3RydWN0IGVidF90YWJsZV9pbmZvICpuZXdpbmZvKQogewogCXVuc2lnbmVkIGludCBpLCBqLCBrLCB1ZGNfY250OwogCWludCByZXQ7CiAJc3RydWN0IGVidF9jbF9zdGFjayAqY2xfcyA9IE5VTEw7IC8qIHVzZWQgaW4gdGhlIGNoZWNraW5nIGZvciBjaGFpbiBsb29wcyAqLwogCiAJaSA9IDA7Ci0Jd2hpbGUgKGkgPCBORl9CUl9OVU1IT09LUyAmJiAhKHJlcGwtPnZhbGlkX2hvb2tzICYgKDEgPDwgaSkpKQorCXdoaWxlIChpIDwgTkZfQlJfTlVNSE9PS1MgJiYgIW5ld2luZm8tPmhvb2tfZW50cnlbaV0pCiAJCWkrKzsKIAlpZiAoaSA9PSBORl9CUl9OVU1IT09LUykgewogCQlCVUdQUklOVCgiTm8gdmFsaWQgaG9va3Mgc3BlY2lmaWVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChyZXBsLT5ob29rX2VudHJ5W2ldICE9IChzdHJ1Y3QgZWJ0X2VudHJpZXMgKilyZXBsLT5lbnRyaWVzKSB7CisJaWYgKG5ld2luZm8tPmhvb2tfZW50cnlbaV0gIT0gKHN0cnVjdCBlYnRfZW50cmllcyAqKW5ld2luZm8tPmVudHJpZXMpIHsKIAkJQlVHUFJJTlQoIkNoYWlucyBkb24ndCBzdGFydCBhdCBiZWdpbm5pbmdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogbWFrZSBzdXJlIGNoYWlucyBhcmUgb3JkZXJlZCBhZnRlciBlYWNoIG90aGVyIGluIHNhbWUgb3JkZXIKIAkgICBhcyB0aGVpciBjb3JyZXNwb25kaW5nIGhvb2tzICovCiAJZm9yIChqID0gaSArIDE7IGogPCBORl9CUl9OVU1IT09LUzsgaisrKSB7Ci0JCWlmICghKHJlcGwtPnZhbGlkX2hvb2tzICYgKDEgPDwgaikpKQorCQlpZiAoIW5ld2luZm8tPmhvb2tfZW50cnlbal0pCiAJCQljb250aW51ZTsKLQkJaWYgKCByZXBsLT5ob29rX2VudHJ5W2pdIDw9IHJlcGwtPmhvb2tfZW50cnlbaV0gKSB7CisJCWlmIChuZXdpbmZvLT5ob29rX2VudHJ5W2pdIDw9IG5ld2luZm8tPmhvb2tfZW50cnlbaV0pIHsKIAkJCUJVR1BSSU5UKCJIb29rIG9yZGVyIG11c3QgYmUgZm9sbG93ZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaSA9IGo7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspCi0JCW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPSBOVUxMOwotCi0JbmV3aW5mby0+ZW50cmllc19zaXplID0gcmVwbC0+ZW50cmllc19zaXplOwotCW5ld2luZm8tPm5lbnRyaWVzID0gcmVwbC0+bmVudHJpZXM7Ci0KIAkvKiBkbyBzb21lIGVhcmx5IGNoZWNraW5ncyBhbmQgaW5pdGlhbGl6ZSBzb21lIHRoaW5ncyAqLwogCWkgPSAwOyAvKiBob2xkcyB0aGUgZXhwZWN0ZWQgbnIuIG9mIGVudHJpZXMgZm9yIHRoZSBjaGFpbiAqLwogCWogPSAwOyAvKiBob2xkcyB0aGUgdXAgdG8gbm93IGNvdW50ZWQgZW50cmllcyBmb3IgdGhlIGNoYWluICovCkBAIC03NzEsOSArODExLDggQEAKIAkgICAgICAgICAgbmV3aW5mby0+bmVudHJpZXMgYWZ0ZXJ3YXJkcyAqLwogCXVkY19jbnQgPSAwOyAvKiB3aWxsIGhvbGQgdGhlIG5yLiBvZiB1c2VyIGRlZmluZWQgY2hhaW5zICh1ZGMpICovCiAJcmV0ID0gRUJUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+ZW50cmllc19zaXplLAotCSAgIGVidF9jaGVja19lbnRyeV9zaXplX2FuZF9ob29rcywgbmV3aW5mbywgcmVwbC0+ZW50cmllcywKLQkgICByZXBsLT5lbnRyaWVzICsgcmVwbC0+ZW50cmllc19zaXplLCByZXBsLT5ob29rX2VudHJ5LCAmaSwgJmosICZrLAotCSAgICZ1ZGNfY250LCByZXBsLT52YWxpZF9ob29rcyk7CisJICAgZWJ0X2NoZWNrX2VudHJ5X3NpemVfYW5kX2hvb2tzLCBuZXdpbmZvLAorCSAgICZpLCAmaiwgJmssICZ1ZGNfY250KTsKIAogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKQEAgLTc4OCwxNSArODI3LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogY2hlY2sgaWYgYWxsIHZhbGlkIGhvb2tzIGhhdmUgYSBjaGFpbiAqLwotCWZvciAoaSA9IDA7IGkgPCBORl9CUl9OVU1IT09LUzsgaSsrKSB7Ci0JCWlmIChuZXdpbmZvLT5ob29rX2VudHJ5W2ldID09IE5VTEwgJiYKLQkJICAgKHJlcGwtPnZhbGlkX2hvb2tzICYgKDEgPDwgaSkpKSB7Ci0JCQlCVUdQUklOVCgiVmFsaWQgaG9vayB3aXRob3V0IGNoYWluXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCiAJLyogZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgdWRjLCBwdXQgdGhlbSBpbiBhbiBhcnJheQogCSAgIHdoaWxlIHdlJ3JlIGF0IGl0LCBhbGxvY2F0ZSB0aGUgY2hhaW5zdGFjayAqLwogCWlmICh1ZGNfY250KSB7CkBAIC04MjQsOCArODU0LDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpID0gMDsgLyogdGhlIGkndGggdWRjICovCiAJCUVCVF9FTlRSWV9JVEVSQVRFKG5ld2luZm8tPmVudHJpZXMsIG5ld2luZm8tPmVudHJpZXNfc2l6ZSwKLQkJICAgZWJ0X2dldF91ZGNfcG9zaXRpb25zLCBuZXdpbmZvLCByZXBsLT5ob29rX2VudHJ5LCAmaSwKLQkJICAgcmVwbC0+dmFsaWRfaG9va3MsIGNsX3MpOworCQkgICBlYnRfZ2V0X3VkY19wb3NpdGlvbnMsIG5ld2luZm8sICZpLCBjbF9zKTsKIAkJLyogc2FuaXR5IGNoZWNrICovCiAJCWlmIChpICE9IHVkY19jbnQpIHsKIAkJCUJVR1BSSU5UKCJpICE9IHVkY19jbnRcbiIpOwpAQCAtODM2LDcgKzg2NSw3IEBACiAKIAkvKiBDaGVjayBmb3IgbG9vcHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTkZfQlJfTlVNSE9PS1M7IGkrKykKLQkJaWYgKHJlcGwtPnZhbGlkX2hvb2tzICYgKDEgPDwgaSkpCisJCWlmIChuZXdpbmZvLT5ob29rX2VudHJ5W2ldKQogCQkJaWYgKGNoZWNrX2NoYWlubG9vcHMobmV3aW5mby0+aG9va19lbnRyeVtpXSwKIAkJCSAgIGNsX3MsIHVkY19jbnQsIGksIG5ld2luZm8tPmVudHJpZXMpKSB7CiAJCQkJdmZyZWUoY2xfcyk7CkBAIC04NTYsOCArODg1LDcgQEAKIAkvKiB1c2VkIHRvIGtub3cgd2hhdCB3ZSBuZWVkIHRvIGNsZWFuIHVwIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nICovCiAJaSA9IDA7CiAJcmV0ID0gRUJUX0VOVFJZX0lURVJBVEUobmV3aW5mby0+ZW50cmllcywgbmV3aW5mby0+ZW50cmllc19zaXplLAotCSAgIGVidF9jaGVja19lbnRyeSwgbmV3aW5mbywgcmVwbC0+bmFtZSwgJmksIHJlcGwtPnZhbGlkX2hvb2tzLAotCSAgIGNsX3MsIHVkY19jbnQpOworCSAgIGVidF9jaGVja19lbnRyeSwgbmV3aW5mbywgbmFtZSwgJmksIGNsX3MsIHVkY19jbnQpOwogCWlmIChyZXQgIT0gMCkgewogCQlFQlRfRU5UUllfSVRFUkFURShuZXdpbmZvLT5lbnRyaWVzLCBuZXdpbmZvLT5lbnRyaWVzX3NpemUsCiAJCSAgIGVidF9jbGVhbnVwX2VudHJ5LCAmaSk7CkBAIC05NTQsNyArOTgyLDExIEBACiAKIAkvKiB0aGlzIGNhbiBnZXQgaW5pdGlhbGl6ZWQgYnkgdHJhbnNsYXRlX3RhYmxlKCkgKi8KIAluZXdpbmZvLT5jaGFpbnN0YWNrID0gTlVMTDsKLQlyZXQgPSB0cmFuc2xhdGVfdGFibGUoJnRtcCwgbmV3aW5mbyk7CisJcmV0ID0gZWJ0X3ZlcmlmeV9wb2ludGVycygmdG1wLCBuZXdpbmZvKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZnJlZV9jb3VudGVyc3RtcDsKKworCXJldCA9IHRyYW5zbGF0ZV90YWJsZSh0bXAubmFtZSwgbmV3aW5mbyk7CiAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZnJlZV9jb3VudGVyc3RtcDsKQEAgLTExMjUsMzUgKzExNTcsNDcgQEAKIHsKIAlzdHJ1Y3QgZWJ0X3RhYmxlX2luZm8gKm5ld2luZm87CiAJc3RydWN0IGVidF90YWJsZSAqdDsKKwlzdHJ1Y3QgZWJ0X3JlcGxhY2Vfa2VybmVsICpyZXBsOwogCWludCByZXQsIGksIGNvdW50ZXJzaXplOworCXZvaWQgKnA7CiAKLQlpZiAoIXRhYmxlIHx8ICF0YWJsZS0+dGFibGUgfHwhdGFibGUtPnRhYmxlLT5lbnRyaWVzIHx8Ci0JICAgIHRhYmxlLT50YWJsZS0+ZW50cmllc19zaXplID09IDAgfHwKLQkgICAgdGFibGUtPnRhYmxlLT5jb3VudGVycyB8fCB0YWJsZS0+cHJpdmF0ZSkgeworCWlmICghdGFibGUgfHwgIShyZXBsID0gdGFibGUtPnRhYmxlKSB8fCAhcmVwbC0+ZW50cmllcyB8fAorCSAgICByZXBsLT5lbnRyaWVzX3NpemUgPT0gMCB8fAorCSAgICByZXBsLT5jb3VudGVycyB8fCB0YWJsZS0+cHJpdmF0ZSkgewogCQlCVUdQUklOVCgiQmFkIHRhYmxlIGRhdGEgZm9yIGVidF9yZWdpc3Rlcl90YWJsZSEhIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWNvdW50ZXJzaXplID0gQ09VTlRFUl9PRkZTRVQodGFibGUtPnRhYmxlLT5uZW50cmllcykgKgorCWNvdW50ZXJzaXplID0gQ09VTlRFUl9PRkZTRVQocmVwbC0+bmVudHJpZXMpICoKIAkJCQkJKGhpZ2hlc3RfcG9zc2libGVfcHJvY2Vzc29yX2lkKCkrMSk7CiAJbmV3aW5mbyA9IHZtYWxsb2Moc2l6ZW9mKCpuZXdpbmZvKSArIGNvdW50ZXJzaXplKTsKIAlyZXQgPSAtRU5PTUVNOwogCWlmICghbmV3aW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQluZXdpbmZvLT5lbnRyaWVzID0gdm1hbGxvYyh0YWJsZS0+dGFibGUtPmVudHJpZXNfc2l6ZSk7Ci0JaWYgKCEobmV3aW5mby0+ZW50cmllcykpCisJcCA9IHZtYWxsb2MocmVwbC0+ZW50cmllc19zaXplKTsKKwlpZiAoIXApCiAJCWdvdG8gZnJlZV9uZXdpbmZvOwogCi0JbWVtY3B5KG5ld2luZm8tPmVudHJpZXMsIHRhYmxlLT50YWJsZS0+ZW50cmllcywKLQkgICB0YWJsZS0+dGFibGUtPmVudHJpZXNfc2l6ZSk7CisJbWVtY3B5KHAsIHJlcGwtPmVudHJpZXMsIHJlcGwtPmVudHJpZXNfc2l6ZSk7CisJbmV3aW5mby0+ZW50cmllcyA9IHA7CisKKwluZXdpbmZvLT5lbnRyaWVzX3NpemUgPSByZXBsLT5lbnRyaWVzX3NpemU7CisJbmV3aW5mby0+bmVudHJpZXMgPSByZXBsLT5uZW50cmllczsKIAogCWlmIChjb3VudGVyc2l6ZSkKIAkJbWVtc2V0KG5ld2luZm8tPmNvdW50ZXJzLCAwLCBjb3VudGVyc2l6ZSk7CiAKIAkvKiBmaWxsIGluIG5ld2luZm8gYW5kIHBhcnNlIHRoZSBlbnRyaWVzICovCiAJbmV3aW5mby0+Y2hhaW5zdGFjayA9IE5VTEw7Ci0JcmV0ID0gdHJhbnNsYXRlX3RhYmxlKHRhYmxlLT50YWJsZSwgbmV3aW5mbyk7CisJZm9yIChpID0gMDsgaSA8IE5GX0JSX05VTUhPT0tTOyBpKyspIHsKKwkJaWYgKChyZXBsLT52YWxpZF9ob29rcyAmICgxIDw8IGkpKSA9PSAwKQorCQkJbmV3aW5mby0+aG9va19lbnRyeVtpXSA9IE5VTEw7CisJCWVsc2UKKwkJCW5ld2luZm8tPmhvb2tfZW50cnlbaV0gPSBwICsKKwkJCQkoKGNoYXIgKilyZXBsLT5ob29rX2VudHJ5W2ldIC0gcmVwbC0+ZW50cmllcyk7CisJfQorCXJldCA9IHRyYW5zbGF0ZV90YWJsZShyZXBsLT5uYW1lLCBuZXdpbmZvKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJQlVHUFJJTlQoIlRyYW5zbGF0ZV90YWJsZSBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfY2hhaW5zdGFjazsKQEAgLTEyNzcsMzMgKzEzMjEsMzMgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZWJ0X21ha2VfbWF0Y2huYW1lKHN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKm0sCi0gICBjaGFyICpiYXNlLCBjaGFyICp1YmFzZSkKKyAgIGNoYXIgKmJhc2UsIGNoYXIgX191c2VyICp1YmFzZSkKIHsKLQljaGFyICpobHAgPSB1YmFzZSAtIGJhc2UgKyAoY2hhciAqKW07CisJY2hhciBfX3VzZXIgKmhscCA9IHViYXNlICsgKChjaGFyICopbSAtIGJhc2UpOwogCWlmIChjb3B5X3RvX3VzZXIoaGxwLCBtLT51Lm1hdGNoLT5uYW1lLCBFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTikpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBlYnRfbWFrZV93YXRjaGVybmFtZShzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIgKncsCi0gICBjaGFyICpiYXNlLCBjaGFyICp1YmFzZSkKKyAgIGNoYXIgKmJhc2UsIGNoYXIgX191c2VyICp1YmFzZSkKIHsKLQljaGFyICpobHAgPSB1YmFzZSAtIGJhc2UgKyAoY2hhciAqKXc7CisJY2hhciBfX3VzZXIgKmhscCA9IHViYXNlICsgKChjaGFyICopdyAtIGJhc2UpOwogCWlmIChjb3B5X3RvX3VzZXIoaGxwICwgdy0+dS53YXRjaGVyLT5uYW1lLCBFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTikpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBlYnRfbWFrZV9uYW1lcyhzdHJ1Y3QgZWJ0X2VudHJ5ICplLCBjaGFyICpiYXNlLCBjaGFyICp1YmFzZSkKK3N0YXRpYyBpbmxpbmUgaW50IGVidF9tYWtlX25hbWVzKHN0cnVjdCBlYnRfZW50cnkgKmUsIGNoYXIgKmJhc2UsIGNoYXIgX191c2VyICp1YmFzZSkKIHsKIAlpbnQgcmV0OwotCWNoYXIgKmhscDsKKwljaGFyIF9fdXNlciAqaGxwOwogCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0ICp0OwogCi0JaWYgKChlLT5iaXRtYXNrICYgRUJUX0VOVFJZX09SX0VOVFJJRVMpID09IDApCisJaWYgKGUtPmJpdG1hc2sgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlobHAgPSB1YmFzZSAtIGJhc2UgKyAoY2hhciAqKWUgKyBlLT50YXJnZXRfb2Zmc2V0OworCWhscCA9IHViYXNlICsgKCgoY2hhciAqKWUgKyBlLT50YXJnZXRfb2Zmc2V0KSAtIGJhc2UpOwogCXQgPSAoc3RydWN0IGVidF9lbnRyeV90YXJnZXQgKikoKChjaGFyICopZSkgKyBlLT50YXJnZXRfb2Zmc2V0KTsKIAkKIAlyZXQgPSBFQlRfTUFUQ0hfSVRFUkFURShlLCBlYnRfbWFrZV9tYXRjaG5hbWUsIGJhc2UsIHViYXNlKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL01ha2VmaWxlIGIvbmV0L2NvcmUvTWFrZWZpbGUKaW5kZXggMTE5NTY4MC4uNzMyNzJkNSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvTWFrZWZpbGUKKysrIGIvbmV0L2NvcmUvTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDYgQEAKIAogb2JqLSQoQ09ORklHX1hGUk0pICs9IGZsb3cubwogb2JqLSQoQ09ORklHX1NZU0ZTKSArPSBuZXQtc3lzZnMubwotb2JqLSQoQ09ORklHX05FVF9ESVZFUlQpICs9IGR2Lm8KIG9iai0kKENPTkZJR19ORVRfUEtUR0VOKSArPSBwa3RnZW4ubwogb2JqLSQoQ09ORklHX1dJUkVMRVNTX0VYVCkgKz0gd2lyZWxlc3Mubwogb2JqLSQoQ09ORklHX05FVFBPTEwpICs9IG5ldHBvbGwubwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGF0YWdyYW0uYyBiL25ldC9jb3JlL2RhdGFncmFtLmMKaW5kZXggZjU1OGM2MS4uNzk3ZmRkNCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGF0YWdyYW0uYworKysgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogc3RhdGljIGludCBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAogCQkJCSAgICAgIHU4IF9fdXNlciAqdG8sIGludCBsZW4sCi0JCQkJICAgICAgdW5zaWduZWQgaW50ICpjc3VtcCkKKwkJCQkgICAgICBfX3dzdW0gKmNzdW1wKQogewogCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7CiAJaW50IHBvcyA9IDA7CkBAIC0zNTAsNyArMzUwLDcgQEAKIAogCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKIAkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKLQkJCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJCV9fd3N1bSBjc3VtMjsKIAkJCWludCBlcnIgPSAwOwogCQkJdTggICp2YWRkcjsKIAkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKQEAgLTM4Niw3ICszODYsNyBAQAogCiAJCQllbmQgPSBzdGFydCArIGxpc3QtPmxlbjsKIAkJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7Ci0JCQkJdW5zaWduZWQgaW50IGNzdW0yID0gMDsKKwkJCQlfX3dzdW0gY3N1bTIgPSAwOwogCQkJCWlmIChjb3B5ID4gbGVuKQogCQkJCQljb3B5ID0gbGVuOwogCQkJCWlmIChza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbShsaXN0LApAQCAtNDExLDExICs0MTEsMTEgQEAKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotdW5zaWduZWQgaW50IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCitfX3N1bTE2IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdW5zaWduZWQgaW50IHN1bTsKKwlfX3N1bTE2IHN1bTsKIAotCXN1bSA9ICh1MTYpY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCBza2ItPmNzdW0pKTsKKwlzdW0gPSBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIHNrYi0+Y3N1bSkpOwogCWlmIChsaWtlbHkoIXN1bSkpIHsKIAkJaWYgKHVubGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSkKIAkJCW5ldGRldl9yeF9jc3VtX2ZhdWx0KHNrYi0+ZGV2KTsKQEAgLTQ0MSw3ICs0NDEsNyBAQAogaW50IHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtX2lvdmVjKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICBpbnQgaGxlbiwgc3RydWN0IGlvdmVjICppb3YpCiB7Ci0JdW5zaWduZWQgaW50IGNzdW07CisJX193c3VtIGNzdW07CiAJaW50IGNodW5rID0gc2tiLT5sZW4gLSBobGVuOwogCiAJLyogU2tpcCBmaWxsZWQgZWxlbWVudHMuCkBAIC00NjAsNyArNDYwLDcgQEAKIAkJaWYgKHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtKHNrYiwgaGxlbiwgaW92LT5pb3ZfYmFzZSwKIAkJCQkJICAgICAgIGNodW5rLCAmY3N1bSkpCiAJCQlnb3RvIGZhdWx0OwotCQlpZiAoKHVuc2lnbmVkIHNob3J0KWNzdW1fZm9sZChjc3VtKSkKKwkJaWYgKGNzdW1fZm9sZChjc3VtKSkKIAkJCWdvdG8gY3N1bV9lcnJvcjsKIAkJaWYgKHVubGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSkKIAkJCW5ldGRldl9yeF9jc3VtX2ZhdWx0KHNrYi0+ZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggNGQ4OTFiZS4uZTY2MGNiNSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTk4LDcgKzk4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kaXZlcnQuaD4KICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgpAQCAtMTE3MCw3ICsxMTY5LDcgQEAKICAqLwogaW50IHNrYl9jaGVja3N1bV9oZWxwKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdW5zaWduZWQgaW50IGNzdW07CisJX193c3VtIGNzdW07CiAJaW50IHJldCA9IDAsIG9mZnNldCA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCkBAIC0xMTkyLDkgKzExOTEsOSBAQAogCiAJb2Zmc2V0ID0gc2tiLT50YWlsIC0gc2tiLT5oLnJhdzsKIAlCVUdfT04ob2Zmc2V0IDw9IDApOwotCUJVR19PTihza2ItPmNzdW0gKyAyID4gb2Zmc2V0KTsKKwlCVUdfT04oc2tiLT5jc3VtX29mZnNldCArIDIgPiBvZmZzZXQpOwogCi0JKih1MTYqKShza2ItPmgucmF3ICsgc2tiLT5jc3VtKSA9IGNzdW1fZm9sZChjc3VtKTsKKwkqKF9fc3VtMTYqKShza2ItPmgucmF3ICsgc2tiLT5jc3VtX29mZnNldCkgPSBjc3VtX2ZvbGQoY3N1bSk7CiAKIG91dF9zZXRfc3VtbWVkOgogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKQEAgLTEyMTYsNyArMTIxNSw3IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBFUlJfUFRSKC1FUFJPVE9OT1NVUFBPUlQpOwogCXN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGU7Ci0JaW50IHR5cGUgPSBza2ItPnByb3RvY29sOworCV9fYmUxNiB0eXBlID0gc2tiLT5wcm90b2NvbDsKIAlpbnQgZXJyOwogCiAJQlVHX09OKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KTsKQEAgLTE3NjcsNyArMTc2Niw3IEBACiAJc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSwgKnB0X3ByZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2OwogCWludCByZXQgPSBORVRfUlhfRFJPUDsKLQl1bnNpZ25lZCBzaG9ydCB0eXBlOworCV9fYmUxNiB0eXBlOwogCiAJLyogaWYgd2UndmUgZ290dGVuIGhlcmUgdGhyb3VnaCBOQVBJLCBjaGVjayBuZXRwb2xsICovCiAJaWYgKHNrYi0+ZGV2LT5wb2xsICYmIG5ldHBvbGxfcngoc2tiKSkKQEAgLTE4MjcsOCArMTgyNiw2IEBACiBuY2xzOgogI2VuZGlmCiAKLQloYW5kbGVfZGl2ZXJ0ZXIoc2tiKTsKLQogCWlmIChoYW5kbGVfYnJpZGdlKCZza2IsICZwdF9wcmV2LCAmcmV0LCBvcmlnX2RldikpCiAJCWdvdG8gb3V0OwogCkBAIC0yODk4LDEwICsyODk1LDYgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5pbmdyZXNzX2xvY2spOwogI2VuZGlmCiAKLQlyZXQgPSBhbGxvY19kaXZlcnRfYmxrKGRldik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KIAlkZXYtPmlmbGluayA9IC0xOwogCiAJLyogSW5pdCwgaWYgdGhpcyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgKi8KQEAgLTI5MTAsMTMgKzI5MDMsMTMgQEAKIAkJaWYgKHJldCkgewogCQkJaWYgKHJldCA+IDApCiAJCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0X2VycjsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogIAogCWlmICghZGV2X3ZhbGlkX25hbWUoZGV2LT5uYW1lKSkgewogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9lcnI7CisJCWdvdG8gb3V0OwogCX0KIAogCWRldi0+aWZpbmRleCA9IGRldl9uZXdfaW5kZXgoKTsKQEAgLTI5MzAsNyArMjkyMyw3IEBACiAJCQk9IGhsaXN0X2VudHJ5KHAsIHN0cnVjdCBuZXRfZGV2aWNlLCBuYW1lX2hsaXN0KTsKIAkJaWYgKCFzdHJuY21wKGQtPm5hbWUsIGRldi0+bmFtZSwgSUZOQU1TSVopKSB7CiAJCQlyZXQgPSAtRUVYSVNUOwotIAkJCWdvdG8gb3V0X2VycjsKKyAJCQlnb3RvIG91dDsKIAkJfQogIAl9CiAKQEAgLTI5NzQsNyArMjk2Nyw3IEBACiAKIAlyZXQgPSBuZXRkZXZfcmVnaXN0ZXJfc3lzZnMoZGV2KTsKIAlpZiAocmV0KQotCQlnb3RvIG91dF9lcnI7CisJCWdvdG8gb3V0OwogCWRldi0+cmVnX3N0YXRlID0gTkVUUkVHX1JFR0lTVEVSRUQ7CiAKIAkvKgpAQCAtMzAwMSw5ICsyOTk0LDYgQEAKIAogb3V0OgogCXJldHVybiByZXQ7Ci1vdXRfZXJyOgotCWZyZWVfZGl2ZXJ0X2JsayhkZXYpOwotCWdvdG8gb3V0OwogfQogCiAvKioKQEAgLTMwMzUsMTUgKzMwMjUsNiBAQAogCQkJZ290byBvdXQ7CiAJfQogCQotCS8qCi0JICogQmFjayBjb21wYXRpYmlsaXR5IGhvb2suIEtpbGwgdGhpcyBvbmUgaW4gMi41Ci0JICovCi0JaWYgKGRldi0+bmFtZVswXSA9PSAwIHx8IGRldi0+bmFtZVswXSA9PSAnICcpIHsKLQkJZXJyID0gZGV2X2FsbG9jX25hbWUoZGV2LCAiZXRoJWQiKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIG91dDsKLQl9Ci0KIAllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIG91dDoKIAlydG5sX3VubG9jaygpOwpAQCAtMzMyOSw4ICszMzEwLDYgQEAKIAkvKiBOb3RpZmllciBjaGFpbiBNVVNUIGRldGFjaCB1cyBmcm9tIG1hc3RlciBkZXZpY2UuICovCiAJQlVHX1RSQVAoIWRldi0+bWFzdGVyKTsKIAotCWZyZWVfZGl2ZXJ0X2JsayhkZXYpOwotCiAJLyogRmluaXNoIHByb2Nlc3NpbmcgdW5yZWdpc3RlciBhZnRlciB1bmxvY2sgKi8KIAluZXRfc2V0X3RvZG8oZGV2KTsKIApAQCAtMzM2MSw3ICszMzQwLDYgQEAKIAogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX25ldGRldik7CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIHN0YXRpYyBpbnQgZGV2X2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwKIAkJCSAgICB2b2lkICpvY3B1KQpAQCAtMzQwNSw3ICszMzgzLDYgQEAKIAogCXJldHVybiBOT1RJRllfT0s7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKICNpZmRlZiBDT05GSUdfTkVUX0RNQQogLyoqCkBAIC0zNTAyLDggKzM0NzksNiBAQAogCiAJQlVHX09OKCFkZXZfYm9vdF9waGFzZSk7CiAKLQluZXRfcmFuZG9tX2luaXQoKTsKLQogCWlmIChkZXZfcHJvY19pbml0KCkpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kc3QuYyBiL25ldC9jb3JlL2RzdC5jCmluZGV4IDFhNWU0OWQuLjgzNmVjNjYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2RzdC5jCisrKyBiL25ldC9jb3JlL2RzdC5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkJaWYgKG9wcy0+Z2MoKSkKIAkJCXJldHVybiBOVUxMOwogCX0KLQlkc3QgPSBrbWVtX2NhY2hlX2FsbG9jKG9wcy0+a21lbV9jYWNoZXAsIFNMQUJfQVRPTUlDKTsKKwlkc3QgPSBrbWVtX2NhY2hlX2FsbG9jKG9wcy0+a21lbV9jYWNoZXAsIEdGUF9BVE9NSUMpOwogCWlmICghZHN0KQogCQlyZXR1cm4gTlVMTDsKIAltZW1zZXQoZHN0LCAwLCBvcHMtPmVudHJ5X3NpemUpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHYuYyBiL25ldC9jb3JlL2R2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZWU3N2YxLi4wMDAwMDAwCi0tLSBhL25ldC9jb3JlL2R2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDYgKzAsMCBAQAotLyoKLSAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAotICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAotICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgotICoKLSAqCQlHZW5lcmljIGZyYW1lIGRpdmVyc2lvbgotICoKLSAqIEF1dGhvcnM6CQotICogCQlCZW5vaXQgTE9DSEVSOglpbml0aWFsIGludGVncmF0aW9uIHdpdGhpbiB0aGUga2VybmVsIHdpdGggc3VwcG9ydCBmb3IgZXRoZXJuZXQKLSAqIAkJRGF2ZSBNaWxsZXI6CWltcHJvdmVtZW50IG9uIHRoZSBjb2RlIChjb3JyZWN0bmVzcywgcGVyZm9ybWFuY2UgYW5kIHNvdXJjZSBmaWxlcykKLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPG5ldC9kc3QuaD4KLSNpbmNsdWRlIDxuZXQvYXJwLmg+Ci0jaW5jbHVkZSA8bmV0L3NvY2suaD4KLSNpbmNsdWRlIDxuZXQvaXB2Ni5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgotI2luY2x1ZGUgPGxpbnV4L2RpdmVydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KLQotY29uc3QgY2hhciBzeXNjdGxfZGl2ZXJ0X3ZlcnNpb25bMzJdPSIwLjQ2IjsJLyogQ3VycmVudCB2ZXJzaW9uICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGR2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KGR2X2luaXQpOwotCi0vKgotICogQWxsb2NhdGUgYSBkaXZlcnRfYmxrIGZvciBhIGRldmljZS4gVGhpcyBtdXN0IGJlIGFuIGV0aGVybmV0IG5pYy4KLSAqLwotaW50IGFsbG9jX2RpdmVydF9ibGsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlpbnQgYWxsb2Nfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGRpdmVydF9ibGspICsgMykgJiB+MzsKLQotCWRldi0+ZGl2ZXJ0ID0gTlVMTDsKLQlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikgewotCQlkZXYtPmRpdmVydCA9IGt6YWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChkZXYtPmRpdmVydCA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJkaXZlcnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBkaXZlcnRfYmxrIGZvciAlc1xuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJZGV2X2hvbGQoZGV2KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0gCi0KLS8qCi0gKiBGcmVlIGEgZGl2ZXJ0X2JsayBhbGxvY2F0ZWQgYnkgdGhlIGFib3ZlIGZ1bmN0aW9uLCBpZiBpdCB3YXMgCi0gKiBhbGxvY2F0ZWQgb24gdGhhdCBkZXZpY2UuCi0gKi8KLXZvaWQgZnJlZV9kaXZlcnRfYmxrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JaWYgKGRldi0+ZGl2ZXJ0KSB7Ci0JCWtmcmVlKGRldi0+ZGl2ZXJ0KTsKLQkJZGV2LT5kaXZlcnQ9TlVMTDsKLQkJZGV2X3B1dChkZXYpOwotCX0KLX0KLQotLyoKLSAqIEFkZHMgYSB0Y3AvdWRwIChzb3VyY2Ugb3IgZGVzdCkgcG9ydCB0byBhbiBhcnJheQotICovCi1zdGF0aWMgaW50IGFkZF9wb3J0KHUxNiBwb3J0c1tdLCB1MTYgcG9ydCkKLXsKLQlpbnQgaTsKLQotCWlmIChwb3J0ID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogU3RvcmluZyBkaXJlY3RseSBpbiBuZXR3b3JrIGZvcm1hdCBmb3IgcGVyZm9ybWFuY2UsCi0JICogdGhhbmtzIERhdmUgOikKLQkgKi8KLQlwb3J0ID0gaHRvbnMocG9ydCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RJVkVSVF9QT1JUUzsgaSsrKSB7Ci0JCWlmIChwb3J0c1tpXSA9PSBwb3J0KQotCQkJcmV0dXJuIC1FQUxSRUFEWTsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IE1BWF9ESVZFUlRfUE9SVFM7IGkrKykgewotCQlpZiAocG9ydHNbaV0gPT0gMCkgewotCQkJcG9ydHNbaV0gPSBwb3J0OwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLUVOT0JVRlM7Ci19Ci0KLS8qCi0gKiBSZW1vdmVzIGEgcG9ydCBmcm9tIGFuIGFycmF5IHRjcC91ZHAgKHNvdXJjZSBvciBkZXN0KQotICovCi1zdGF0aWMgaW50IHJlbW92ZV9wb3J0KHUxNiBwb3J0c1tdLCB1MTYgcG9ydCkKLXsKLQlpbnQgaTsKLQotCWlmIChwb3J0ID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCQotCS8qIFN0b3JpbmcgZGlyZWN0bHkgaW4gbmV0d29yayBmb3JtYXQgZm9yIHBlcmZvcm1hbmNlLAotCSAqIHRoYW5rcyBEYXZlICEKLQkgKi8KLQlwb3J0ID0gaHRvbnMocG9ydCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RJVkVSVF9QT1JUUzsgaSsrKSB7Ci0JCWlmIChwb3J0c1tpXSA9PSBwb3J0KSB7Ci0JCQlwb3J0c1tpXSA9IDA7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKiBTb21lIGJhc2ljIHNhbml0eSBjaGVja3Mgb24gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGl2ZXJ0X2lvY3RsKCkgKi8KLXN0YXRpYyBpbnQgY2hlY2tfYXJncyhzdHJ1Y3QgZGl2ZXJ0X2NmICpkaXZfY2YsIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2KQotewotCWNoYXIgZGV2bmFtZVszMl07Ci0JaW50IHJldDsKLQotCWlmIChkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCi0JLyogR0VUVkVSU0lPTjogYWxsIG90aGVyIGFyZ3MgYXJlIHVudXNlZCAqLwotCWlmIChkaXZfY2YtPmNtZCA9PSBESVZDTURfR0VUVkVSU0lPTikKLQkJcmV0dXJuIDA7Ci0JCi0JLyogTmV0d29yayBkZXZpY2UgaW5kZXggc2hvdWxkIHJlYXNvbmFibHkgYmUgYmV0d2VlbiAwIGFuZCAxMDAwIDopICovCi0JaWYgKGRpdl9jZi0+ZGV2X2luZGV4IDwgMCB8fCBkaXZfY2YtPmRldl9pbmRleCA+IDEwMDApIAotCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQotCS8qIExldCdzIHRyeSB0byBmaW5kIHRoZSBpZm5hbWUgKi8KLQlzcHJpbnRmKGRldm5hbWUsICJldGglZCIsIGRpdl9jZi0+ZGV2X2luZGV4KTsKLQkqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOwotCQotCS8qIGRldiBzaG91bGQgTk9UIGJlIG51bGwgKi8KLQlpZiAoKmRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IDA7Ci0KLQkvKiB1c2VyIGlzc3VpbmcgdGhlIGlvY3RsIG11c3QgYmUgYSBzdXBlciBvbmUgOikgKi8KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJcmV0ID0gLUVQRVJNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBEZXZpY2UgbXVzdCBoYXZlIGEgZGl2ZXJ0X2JsayBtZW1iZXIgTk9UIG51bGwgKi8KLQlpZiAoKCpkZXYpLT5kaXZlcnQgPT0gTlVMTCkKLQkJcmV0ID0gLUVJTlZBTDsKLW91dDoKLQlkZXZfcHV0KCpkZXYpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBjb250cm9sIGZ1bmN0aW9uIG9mIHRoZSBkaXZlcnRlcgotICovCi0jaWYgMAotI2RlZmluZQlEVkRCRyhhKQlcCi0JcHJpbnRrKEtFUk5fREVCVUcgImRpdmVydF9pb2N0bCgpIGxpbmUgJWQgJXNcbiIsIF9fTElORV9fLCAoYSkpCi0jZWxzZQotI2RlZmluZQlEVkRCRyhhKQotI2VuZGlmCi0KLWludCBkaXZlcnRfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGRpdmVydF9jZiBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgZGl2ZXJ0X2NmCWRpdl9jZjsKLQlzdHJ1Y3QgZGl2ZXJ0X2JsawkqZGl2X2JsazsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwotCWludAkJCXJldDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTSU9DR0lGRElWRVJUOgotCQlEVkRCRygiU0lPQ0dJRkRJVkVSVCwgY29weV9mcm9tX3VzZXIiKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkaXZfY2YsIGFyZywgc2l6ZW9mKHN0cnVjdCBkaXZlcnRfY2YpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlEVkRCRygiYmVmb3JlIGNoZWNrX2FyZ3MiKTsKLQkJcmV0ID0gY2hlY2tfYXJncygmZGl2X2NmLCAmZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCURWREJHKCJhZnRlciBjaGVja2FyZ3MiKTsKLQkJZGl2X2JsayA9IGRldi0+ZGl2ZXJ0OwotCQkJCi0JCURWREJHKCJiZWZyZSBzd2l0Y2goKSIpOwotCQlzd2l0Y2ggKGRpdl9jZi5jbWQpIHsKLQkJY2FzZSBESVZDTURfR0VUU1RBVFVTOgotCQkJLyogTm93LCBqdXN0IGdpdmUgdGhlIHVzZXIgdGhlIHJhdyBkaXZlcnQgYmxvY2sKLQkJCSAqIGZvciBoaW0gdG8gcGxheSB3aXRoIDopCi0JCQkgKi8KLQkJCWlmIChjb3B5X3RvX3VzZXIoZGl2X2NmLmFyZzEucHRyLCBkZXYtPmRpdmVydCwKLQkJCQkJIHNpemVvZihzdHJ1Y3QgZGl2ZXJ0X2JsaykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBESVZDTURfR0VUVkVSU0lPTjoKLQkJCURWREJHKCJHRVRWRVJTSU9OOiBjaGVja2luZyBwdHIiKTsKLQkJCWlmIChkaXZfY2YuYXJnMS5wdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCURWREJHKCJHRVRWRVJTSU9OOiBjb3B5aW5nIGRhdGEgdG8gdXNlcmxhbmQiKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoZGl2X2NmLmFyZzEucHRyLAotCQkJCQkgc3lzY3RsX2RpdmVydF92ZXJzaW9uLCAzMikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlEVkRCRygiR0VUVkVSU0lPTjogZGF0YSBjb3BpZWQiKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lGRElWRVJUOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRpdl9jZiwgYXJnLCBzaXplb2Yoc3RydWN0IGRpdmVydF9jZikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0ID0gY2hlY2tfYXJncygmZGl2X2NmLCAmZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJZGl2X2JsayA9IGRldi0+ZGl2ZXJ0OwotCi0JCXN3aXRjaChkaXZfY2YuY21kKSB7Ci0JCWNhc2UgRElWQ01EX1JFU0VUOgotCQkJZGl2X2Jsay0+ZGl2ZXJ0ID0gMDsKLQkJCWRpdl9ibGstPnByb3RvcyA9IERJVkVSVF9QUk9UT19OT05FOwotCQkJbWVtc2V0KGRpdl9ibGstPnRjcF9kc3QsIDAsCi0JCQkgICAgICAgTUFYX0RJVkVSVF9QT1JUUyAqIHNpemVvZih1MTYpKTsKLQkJCW1lbXNldChkaXZfYmxrLT50Y3Bfc3JjLCAwLAotCQkJICAgICAgIE1BWF9ESVZFUlRfUE9SVFMgKiBzaXplb2YodTE2KSk7Ci0JCQltZW1zZXQoZGl2X2Jsay0+dWRwX2RzdCwgMCwKLQkJCSAgICAgICBNQVhfRElWRVJUX1BPUlRTICogc2l6ZW9mKHUxNikpOwotCQkJbWVtc2V0KGRpdl9ibGstPnVkcF9zcmMsIDAsCi0JCQkgICAgICAgTUFYX0RJVkVSVF9QT1JUUyAqIHNpemVvZih1MTYpKTsKLQkJCXJldHVybiAwOwotCQkJCQotCQljYXNlIERJVkNNRF9ESVZFUlQ6Ci0JCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKLQkJCWNhc2UgRElWQVJHMV9FTkFCTEU6Ci0JCQkJaWYgKGRpdl9ibGstPmRpdmVydCkKLQkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKLQkJCQlkaXZfYmxrLT5kaXZlcnQgPSAxOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIERJVkFSRzFfRElTQUJMRToKLQkJCQlpZiAoIWRpdl9ibGstPmRpdmVydCkKLQkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKLQkJCQlkaXZfYmxrLT5kaXZlcnQgPSAwOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIERJVkNNRF9JUDoKLQkJCXN3aXRjaChkaXZfY2YuYXJnMS5pbnQzMikgewotCQkJY2FzZSBESVZBUkcxX0VOQUJMRToKLQkJCQlpZiAoZGl2X2Jsay0+cHJvdG9zICYgRElWRVJUX1BST1RPX0lQKQotCQkJCQlyZXR1cm4gLUVBTFJFQURZOwotCQkJCWRpdl9ibGstPnByb3RvcyB8PSBESVZFUlRfUFJPVE9fSVA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgRElWQVJHMV9ESVNBQkxFOgotCQkJCWlmICghKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19JUCkpCi0JCQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JCQkJZGl2X2Jsay0+cHJvdG9zICY9IH5ESVZFUlRfUFJPVE9fSVA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgRElWQ01EX1RDUDoKLQkJCXN3aXRjaChkaXZfY2YuYXJnMS5pbnQzMikgewotCQkJY2FzZSBESVZBUkcxX0VOQUJMRToKLQkJCQlpZiAoZGl2X2Jsay0+cHJvdG9zICYgRElWRVJUX1BST1RPX1RDUCkKLQkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKLQkJCQlkaXZfYmxrLT5wcm90b3MgfD0gRElWRVJUX1BST1RPX1RDUDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBESVZBUkcxX0RJU0FCTEU6Ci0JCQkJaWYgKCEoZGl2X2Jsay0+cHJvdG9zICYgRElWRVJUX1BST1RPX1RDUCkpCi0JCQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JCQkJZGl2X2Jsay0+cHJvdG9zICY9IH5ESVZFUlRfUFJPVE9fVENQOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIERJVkNNRF9UQ1BEU1Q6Ci0JCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKLQkJCWNhc2UgRElWQVJHMV9BREQ6Ci0JCQkJcmV0dXJuIGFkZF9wb3J0KGRpdl9ibGstPnRjcF9kc3QsCi0JCQkJCQlkaXZfY2YuYXJnMi51aW50MTYpOwotCQkJCQotCQkJY2FzZSBESVZBUkcxX1JFTU9WRToKLQkJCQlyZXR1cm4gcmVtb3ZlX3BvcnQoZGl2X2Jsay0+dGNwX2RzdCwKLQkJCQkJCSAgIGRpdl9jZi5hcmcyLnVpbnQxNik7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgRElWQ01EX1RDUFNSQzoKLQkJCXN3aXRjaChkaXZfY2YuYXJnMS5pbnQzMikgewotCQkJY2FzZSBESVZBUkcxX0FERDoKLQkJCQlyZXR1cm4gYWRkX3BvcnQoZGl2X2Jsay0+dGNwX3NyYywKLQkJCQkJCWRpdl9jZi5hcmcyLnVpbnQxNik7Ci0KLQkJCWNhc2UgRElWQVJHMV9SRU1PVkU6Ci0JCQkJcmV0dXJuIHJlbW92ZV9wb3J0KGRpdl9ibGstPnRjcF9zcmMsCi0JCQkJCQkgICBkaXZfY2YuYXJnMi51aW50MTYpOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIERJVkNNRF9VRFA6Ci0JCQlzd2l0Y2goZGl2X2NmLmFyZzEuaW50MzIpIHsKLQkJCWNhc2UgRElWQVJHMV9FTkFCTEU6Ci0JCQkJaWYgKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19VRFApCi0JCQkJCXJldHVybiAtRUFMUkVBRFk7Ci0JCQkJZGl2X2Jsay0+cHJvdG9zIHw9IERJVkVSVF9QUk9UT19VRFA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgRElWQVJHMV9ESVNBQkxFOgotCQkJCWlmICghKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19VRFApKQotCQkJCQlyZXR1cm4gLUVBTFJFQURZOwotCQkJCWRpdl9ibGstPnByb3RvcyAmPSB+RElWRVJUX1BST1RPX1VEUDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBESVZDTURfVURQRFNUOgotCQkJc3dpdGNoKGRpdl9jZi5hcmcxLmludDMyKSB7Ci0JCQljYXNlIERJVkFSRzFfQUREOgotCQkJCXJldHVybiBhZGRfcG9ydChkaXZfYmxrLT51ZHBfZHN0LAotCQkJCQkJZGl2X2NmLmFyZzIudWludDE2KTsKLQotCQkJY2FzZSBESVZBUkcxX1JFTU9WRToKLQkJCQlyZXR1cm4gcmVtb3ZlX3BvcnQoZGl2X2Jsay0+dWRwX2RzdCwKLQkJCQkJCSAgIGRpdl9jZi5hcmcyLnVpbnQxNik7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgRElWQ01EX1VEUFNSQzoKLQkJCXN3aXRjaChkaXZfY2YuYXJnMS5pbnQzMikgewotCQkJY2FzZSBESVZBUkcxX0FERDoKLQkJCQlyZXR1cm4gYWRkX3BvcnQoZGl2X2Jsay0+dWRwX3NyYywKLQkJCQkJCWRpdl9jZi5hcmcyLnVpbnQxNik7Ci0KLQkJCWNhc2UgRElWQVJHMV9SRU1PVkU6Ci0JCQkJcmV0dXJuIHJlbW92ZV9wb3J0KGRpdl9ibGstPnVkcF9zcmMsCi0JCQkJCQkgICBkaXZfY2YuYXJnMi51aW50MTYpOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlicmVhazsKLQotCQljYXNlIERJVkNNRF9JQ01QOgotCQkJc3dpdGNoKGRpdl9jZi5hcmcxLmludDMyKSB7Ci0JCQljYXNlIERJVkFSRzFfRU5BQkxFOgotCQkJCWlmIChkaXZfYmxrLT5wcm90b3MgJiBESVZFUlRfUFJPVE9fSUNNUCkKLQkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKLQkJCQlkaXZfYmxrLT5wcm90b3MgfD0gRElWRVJUX1BST1RPX0lDTVA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgRElWQVJHMV9ESVNBQkxFOgotCQkJCWlmICghKGRpdl9ibGstPnByb3RvcyAmIERJVkVSVF9QUk9UT19JQ01QKSkKLQkJCQkJcmV0dXJuIC1FQUxSRUFEWTsKLQkJCQlkaXZfYmxrLT5wcm90b3MgJj0gfkRJVkVSVF9QUk9UT19JQ01QOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBDaGVjayBpZiBwYWNrZXQgc2hvdWxkIGhhdmUgaXRzIGRlc3QgbWFjIGFkZHJlc3Mgc2V0IHRvIHRoZSBib3ggaXRzZWxmCi0gKiBmb3IgZGl2ZXJzaW9uCi0gKi8KLQotI2RlZmluZQlFVEhfRElWRVJUX0ZSQU1FKHNrYikgXAotCW1lbWNweShldGhfaGRyKHNrYiksIHNrYi0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOyBcCi0Jc2tiLT5wa3RfdHlwZT1QQUNLRVRfSE9TVAotCQkKLXZvaWQgZGl2ZXJ0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGV0aGhkcgkJCSpldGggPSBldGhfaGRyKHNrYik7Ci0Jc3RydWN0IGlwaGRyCQkJKmlwaDsKLQlzdHJ1Y3QgdGNwaGRyCQkJKnRjcGg7Ci0Jc3RydWN0IHVkcGhkcgkJCSp1ZHBoOwotCXN0cnVjdCBkaXZlcnRfYmxrCQkqZGl2ZXJ0ID0gc2tiLT5kZXYtPmRpdmVydDsKLQlpbnQJCQkJaSwgc3JjLCBkc3Q7Ci0JdW5zaWduZWQgY2hhcgkJCSpza2JfZGF0YV9lbmQgPSBza2ItPmRhdGEgKyBza2ItPmxlbjsKLQotCS8qIFBhY2tldCBpcyBhbHJlYWR5IGFpbWVkIGF0IHVzLCByZXR1cm4gKi8KLQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihldGgtPmhfZGVzdCwgc2tiLT5kZXYtPmRldl9hZGRyKSkKLQkJcmV0dXJuOwotCQotCS8qIHByb3RvIGlzIG5vdCBJUCwgZG8gbm90aGluZyAqLwotCWlmIChldGgtPmhfcHJvdG8gIT0gaHRvbnMoRVRIX1BfSVApKQotCQlyZXR1cm47Ci0JCi0JLyogRGl2ZXJ0IGFsbCBJUCBmcmFtZXMgPyAqLwotCWlmIChkaXZlcnQtPnByb3RvcyAmIERJVkVSVF9QUk9UT19JUCkgewotCQlFVEhfRElWRVJUX0ZSQU1FKHNrYik7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLyogQ2hlY2sgZm9yIHBvc3NpYmxlIChtYWxpY2lvdXNseSkgbWFsZm9ybWVkIElQIGZyYW1lICh0aGFua3MgRGF2ZSkgKi8KLQlpcGggPSAoc3RydWN0IGlwaGRyICopIHNrYi0+ZGF0YTsKLQlpZiAoKChpcGgtPmlobDw8MikrKHVuc2lnbmVkIGNoYXIqKShpcGgpKSA+PSBza2JfZGF0YV9lbmQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZGl2ZXJ0OiBtYWxmb3JtZWQgSVAgcGFja2V0ICFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChpcGgtPnByb3RvY29sKSB7Ci0JLyogRGl2ZXJ0IGFsbCBJQ01QIGZyYW1lcyA/ICovCi0JY2FzZSBJUFBST1RPX0lDTVA6Ci0JCWlmIChkaXZlcnQtPnByb3RvcyAmIERJVkVSVF9QUk9UT19JQ01QKSB7Ci0JCQlFVEhfRElWRVJUX0ZSQU1FKHNrYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQkvKiBEaXZlcnQgYWxsIFRDUCBmcmFtZXMgPyAqLwotCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCWlmIChkaXZlcnQtPnByb3RvcyAmIERJVkVSVF9QUk9UT19UQ1ApIHsKLQkJCUVUSF9ESVZFUlRfRlJBTUUoc2tiKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIENoZWNrIGZvciBwb3NzaWJsZSAobWFsaWNpb3VzbHkpIG1hbGZvcm1lZCBJUAotCQkgKiBmcmFtZSAodGhhbnggRGF2ZSkKLQkJICovCi0JCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKQotCQkJKCgodW5zaWduZWQgY2hhciAqKWlwaCkgKyAoaXBoLT5paGw8PDIpKTsKLQkJaWYgKCgodW5zaWduZWQgY2hhciAqKSh0Y3BoKzEpKSA+PSBza2JfZGF0YV9lbmQpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImRpdmVydDogbWFsZm9ybWVkIFRDUCBwYWNrZXQgIVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBEaXZlcnQgc29tZSB0Y3AgZHN0L3NyYyBwb3J0cyBvbmx5ID8qLwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RJVkVSVF9QT1JUUzsgaSsrKSB7Ci0JCQlkc3QgPSBkaXZlcnQtPnRjcF9kc3RbaV07Ci0JCQlzcmMgPSBkaXZlcnQtPnRjcF9zcmNbaV07Ci0JCQlpZiAoKGRzdCAmJiBkc3QgPT0gdGNwaC0+ZGVzdCkgfHwKLQkJCSAgICAoc3JjICYmIHNyYyA9PSB0Y3BoLT5zb3VyY2UpKSB7Ci0JCQkJRVRIX0RJVkVSVF9GUkFNRShza2IpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCS8qIERpdmVydCBhbGwgVURQIGZyYW1lcyA/ICovCi0JY2FzZSBJUFBST1RPX1VEUDoKLQkJaWYgKGRpdmVydC0+cHJvdG9zICYgRElWRVJUX1BST1RPX1VEUCkgewotCQkJRVRIX0RJVkVSVF9GUkFNRShza2IpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIHBvc3NpYmxlIChtYWxpY2lvdXNseSkgbWFsZm9ybWVkIElQCi0JCSAqIHBhY2tldCAodGhhbmtzIERhdmUpCi0JCSAqLwotCQl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikKLQkJCSgoKHVuc2lnbmVkIGNoYXIgKilpcGgpICsgKGlwaC0+aWhsPDwyKSk7Ci0JCWlmICgoKHVuc2lnbmVkIGNoYXIgKikodWRwaCsxKSkgPj0gc2tiX2RhdGFfZW5kKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgImRpdmVydDogbWFsZm9ybWVkIFVEUCBwYWNrZXQgIVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBEaXZlcnQgc29tZSB1ZHAgZHN0L3NyYyBwb3J0cyBvbmx5ID8gKi8KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9ESVZFUlRfUE9SVFM7IGkrKykgewotCQkJZHN0ID0gZGl2ZXJ0LT51ZHBfZHN0W2ldOwotCQkJc3JjID0gZGl2ZXJ0LT51ZHBfc3JjW2ldOwotCQkJaWYgKChkc3QgJiYgZHN0ID09IHVkcGgtPmRlc3QpIHx8Ci0JCQkgICAgKHNyYyAmJiBzcmMgPT0gdWRwaC0+c291cmNlKSkgewotCQkJCUVUSF9ESVZFUlRfRlJBTUUoc2tiKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmliX3J1bGVzLmMgYi9uZXQvY29yZS9maWJfcnVsZXMuYwppbmRleCA2YjBlNjNjLi4xZGY2Y2Q0NSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmliX3J1bGVzLmMKKysrIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKQEAgLTEwNyw2ICsxMDcsMjIgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZmliX3J1bGVzX3VucmVnaXN0ZXIpOwogCitzdGF0aWMgaW50IGZpYl9ydWxlX21hdGNoKHN0cnVjdCBmaWJfcnVsZSAqcnVsZSwgc3RydWN0IGZpYl9ydWxlc19vcHMgKm9wcywKKwkJCSAgc3RydWN0IGZsb3dpICpmbCwgaW50IGZsYWdzKQoreworCWludCByZXQgPSAwOworCisJaWYgKHJ1bGUtPmlmaW5kZXggJiYgKHJ1bGUtPmlmaW5kZXggIT0gZmwtPmlpZikpCisJCWdvdG8gb3V0OworCisJaWYgKChydWxlLT5tYXJrIF4gZmwtPm1hcmspICYgcnVsZS0+bWFya19tYXNrKQorCQlnb3RvIG91dDsKKworCXJldCA9IG9wcy0+bWF0Y2gocnVsZSwgZmwsIGZsYWdzKTsKK291dDoKKwlyZXR1cm4gKHJ1bGUtPmZsYWdzICYgRklCX1JVTEVfSU5WRVJUKSA/ICFyZXQgOiByZXQ7Cit9CisKIGludCBmaWJfcnVsZXNfbG9va3VwKHN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMsIHN0cnVjdCBmbG93aSAqZmwsCiAJCSAgICAgaW50IGZsYWdzLCBzdHJ1Y3QgZmliX2xvb2t1cF9hcmcgKmFyZykKIHsKQEAgLTExNiwxMCArMTMyLDcgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShydWxlLCBvcHMtPnJ1bGVzX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHJ1bGUtPmlmaW5kZXggJiYgKHJ1bGUtPmlmaW5kZXggIT0gZmwtPmlpZikpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIW9wcy0+bWF0Y2gocnVsZSwgZmwsIGZsYWdzKSkKKwkJaWYgKCFmaWJfcnVsZV9tYXRjaChydWxlLCBvcHMsIGZsLCBmbGFncykpCiAJCQljb250aW51ZTsKIAogCQllcnIgPSBvcHMtPmFjdGlvbihydWxlLCBmbCwgZmxhZ3MsIGFyZyk7CkBAIC0xNzksNiArMTkyLDE4IEBACiAJCQlydWxlLT5pZmluZGV4ID0gZGV2LT5pZmluZGV4OwogCX0KIAorCWlmICh0YltGUkFfRldNQVJLXSkgeworCQlydWxlLT5tYXJrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFSS10pOworCQlpZiAocnVsZS0+bWFyaykKKwkJCS8qIGNvbXBhdGliaWxpdHk6IGlmIHRoZSBtYXJrIHZhbHVlIGlzIG5vbi16ZXJvIGFsbCBiaXRzCisJCQkgKiBhcmUgY29tcGFyZWQgdW5sZXNzIGEgbWFzayBpcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KKwkJCSAqLworCQkJcnVsZS0+bWFya19tYXNrID0gMHhGRkZGRkZGRjsKKwl9CisKKwlpZiAodGJbRlJBX0ZXTUFTS10pCisJCXJ1bGUtPm1hcmtfbWFzayA9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BU0tdKTsKKwogCXJ1bGUtPmFjdGlvbiA9IGZyaC0+YWN0aW9uOwogCXJ1bGUtPmZsYWdzID0gZnJoLT5mbGFnczsKIAlydWxlLT50YWJsZSA9IGZyaF9nZXRfdGFibGUoZnJoLCB0Yik7CkBAIC0yNTAsNiArMjc1LDE0IEBACiAJCSAgICBubGFfc3RyY21wKHRiW0ZSQV9JRk5BTUVdLCBydWxlLT5pZm5hbWUpKQogCQkJY29udGludWU7CiAKKwkJaWYgKHRiW0ZSQV9GV01BUktdICYmCisJCSAgICAocnVsZS0+bWFyayAhPSBubGFfZ2V0X3UzMih0YltGUkFfRldNQVJLXSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKHRiW0ZSQV9GV01BU0tdICYmCisJCSAgICAocnVsZS0+bWFya19tYXNrICE9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BU0tdKSkpCisJCQljb250aW51ZTsKKwogCQlpZiAoIW9wcy0+Y29tcGFyZShydWxlLCBmcmgsIHRiKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0yNzMsNiArMzA2LDIyIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGlubGluZSBzaXplX3QgZmliX3J1bGVfbmxtc2dfc2l6ZShzdHJ1Y3QgZmliX3J1bGVzX29wcyAqb3BzLAorCQkJCQkgc3RydWN0IGZpYl9ydWxlICpydWxlKQoreworCXNpemVfdCBwYXlsb2FkID0gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBmaWJfcnVsZV9oZHIpKQorCQkJICsgbmxhX3RvdGFsX3NpemUoSUZOQU1TSVopIC8qIEZSQV9JRk5BTUUgKi8KKwkJCSArIG5sYV90b3RhbF9zaXplKDQpIC8qIEZSQV9QUklPUklUWSAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCkgLyogRlJBX1RBQkxFICovCisJCQkgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBGUkFfRldNQVJLICovCisJCQkgKyBubGFfdG90YWxfc2l6ZSg0KTsgLyogRlJBX0ZXTUFTSyAqLworCisJaWYgKG9wcy0+bmxtc2dfcGF5bG9hZCkKKwkJcGF5bG9hZCArPSBvcHMtPm5sbXNnX3BheWxvYWQocnVsZSk7CisKKwlyZXR1cm4gcGF5bG9hZDsKK30KKwogc3RhdGljIGludCBmaWJfbmxfZmlsbF9ydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmaWJfcnVsZSAqcnVsZSwKIAkJCSAgICB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgdHlwZSwgaW50IGZsYWdzLAogCQkJICAgIHN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMpCkBAIC0yOTgsNiArMzQ3LDEyIEBACiAJaWYgKHJ1bGUtPnByZWYpCiAJCU5MQV9QVVRfVTMyKHNrYiwgRlJBX1BSSU9SSVRZLCBydWxlLT5wcmVmKTsKIAorCWlmIChydWxlLT5tYXJrKQorCQlOTEFfUFVUX1UzMihza2IsIEZSQV9GV01BUkssIHJ1bGUtPm1hcmspOworCisJaWYgKHJ1bGUtPm1hcmtfbWFzayB8fCBydWxlLT5tYXJrKQorCQlOTEFfUFVUX1UzMihza2IsIEZSQV9GV01BU0ssIHJ1bGUtPm1hcmtfbWFzayk7CisKIAlpZiAob3BzLT5maWxsKHJ1bGUsIHNrYiwgbmxoLCBmcmgpIDwgMCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKQEAgLTM0NSwxNSArNDAwLDEzIEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAKLQlza2IgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCXNrYiA9IG5sbXNnX25ldyhmaWJfcnVsZV9ubG1zZ19zaXplKG9wcywgcnVsZSksIEdGUF9LRVJORUwpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBmaWJfbmxfZmlsbF9ydWxlKHNrYiwgcnVsZSwgcGlkLCBubGgtPm5sbXNnX3NlcSwgZXZlbnQsIDAsIG9wcyk7Ci0JaWYgKGVyciA8IDApIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGZpYl9ydWxlX25sbXNnX3NpemUoKSAqLworCUJVR19PTihlcnIgPCAwKTsKIAogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgcGlkLCBvcHMtPm5sZ3JvdXAsIG5saCwgR0ZQX0tFUk5FTCk7CiBlcnJvdXQ6CmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jCmluZGV4IDY3MzI3ODIuLjBkZjg0M2IgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2ZpbHRlci5jCisrKyBiL25ldC9jb3JlL2ZpbHRlci5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIGxvYWRfdzoKIAkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGssIDQsICZ0bXApOwogCQkJaWYgKHB0ciAhPSBOVUxMKSB7Ci0JCQkJQSA9IG50b2hsKGdldF91bmFsaWduZWQoKHUzMiAqKXB0cikpOworCQkJCUEgPSBudG9obChnZXRfdW5hbGlnbmVkKChfX2JlMzIgKilwdHIpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiBsb2FkX2g6CiAJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrLCAyLCAmdG1wKTsKIAkJCWlmIChwdHIgIT0gTlVMTCkgewotCQkJCUEgPSBudG9ocyhnZXRfdW5hbGlnbmVkKCh1MTYgKilwdHIpKTsKKwkJCQlBID0gbnRvaHMoZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopcHRyKSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlicmVhazsKQEAgLTI2MSw3ICsyNjEsNyBAQAogCQkgKi8KIAkJc3dpdGNoIChrLVNLRl9BRF9PRkYpIHsKIAkJY2FzZSBTS0ZfQURfUFJPVE9DT0w6Ci0JCQlBID0gaHRvbnMoc2tiLT5wcm90b2NvbCk7CisJCQlBID0gbnRvaHMoc2tiLT5wcm90b2NvbCk7CiAJCQljb250aW51ZTsKIAkJY2FzZSBTS0ZfQURfUEtUVFlQRToKIAkJCUEgPSBza2ItPnBrdF90eXBlOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmxvdy5jIGIvbmV0L2NvcmUvZmxvdy5jCmluZGV4IGIxNmQzMWEuLmQxMzdmOTcgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Zsb3cuYworKysgYi9uZXQvY29yZS9mbG93LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogI2RlZmluZSBmbG93X3RhYmxlKGNwdSkgKHBlcl9jcHUoZmxvd190YWJsZXMsIGNwdSkpCiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmZsb3dfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZsb3dfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBpbnQgZmxvd19sd20sIGZsb3dfaHdtOwogCkBAIC0yMTEsNyArMjExLDcgQEAKIAkJaWYgKGZsb3dfY291bnQoY3B1KSA+IGZsb3dfaHdtKQogCQkJZmxvd19jYWNoZV9zaHJpbmsoY3B1KTsKIAotCQlmbGUgPSBrbWVtX2NhY2hlX2FsbG9jKGZsb3dfY2FjaGVwLCBTTEFCX0FUT01JQyk7CisJCWZsZSA9IGttZW1fY2FjaGVfYWxsb2MoZmxvd19jYWNoZXAsIEdGUF9BVE9NSUMpOwogCQlpZiAoZmxlKSB7CiAJCQlmbGUtPm5leHQgPSAqaGVhZDsKIAkJCSpoZWFkID0gZmxlOwpAQCAtMzQwLDcgKzM0MCw2IEBACiAJdGFza2xldF9pbml0KHRhc2tsZXQsIGZsb3dfY2FjaGVfZmx1c2hfdGFza2xldCwgMCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIHN0YXRpYyBpbnQgZmxvd19jYWNoZV9jcHUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCiAJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAogCQkJICB2b2lkICpoY3B1KQpAQCAtMzQ5LDcgKzM0OCw2IEBACiAJCV9fZmxvd19jYWNoZV9zaHJpbmsoKHVuc2lnbmVkIGxvbmcpaGNwdSwgMCk7CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAogc3RhdGljIGludCBfX2luaXQgZmxvd19jYWNoZV9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9pb3ZlYy5jIGIvbmV0L2NvcmUvaW92ZWMuYwppbmRleCA2NWU0YjU2Li4wNGIyNDljIDEwMDY0NAotLS0gYS9uZXQvY29yZS9pb3ZlYy5jCisrKyBiL25ldC9jb3JlL2lvdmVjLmMKQEAgLTE1OCw5ICsxNTgsOSBAQAogICoJY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgdW5hbGlnbmVkIGFsc28uCiAgKi8KIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9taW92ZWNlbmQodW5zaWduZWQgY2hhciAqa2RhdGEsIHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgKmNzdW1wKQorCQkJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLCBfX3dzdW0gKmNzdW1wKQogewotCWludCBjc3VtID0gKmNzdW1wOworCV9fd3N1bSBjc3VtID0gKmNzdW1wOwogCWludCBwYXJ0aWFsX2NudCA9IDAsIGVyciA9IDA7CiAKIAkvKiBTa2lwIG92ZXIgdGhlIGZpbmlzaGVkIGlvdmVjcyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUva21hcF9za2IuaCBiL25ldC9jb3JlL2ttYXBfc2tiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzYzJiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9rbWFwX3NrYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hcF9za2JfZnJhZyhjb25zdCBza2JfZnJhZ190ICpmcmFnKQoreworI2lmZGVmIENPTkZJR19ISUdITUVNCisJQlVHX09OKGluX2lycSgpKTsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKyNlbmRpZgorCXJldHVybiBrbWFwX2F0b21pYyhmcmFnLT5wYWdlLCBLTV9TS0JfREFUQV9TT0ZUSVJRKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGt1bm1hcF9za2JfZnJhZyh2b2lkICp2YWRkcikKK3sKKwlrdW5tYXBfYXRvbWljKHZhZGRyLCBLTV9TS0JfREFUQV9TT0ZUSVJRKTsKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCWxvY2FsX2JoX2VuYWJsZSgpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9saW5rX3dhdGNoLmMgYi9uZXQvY29yZS9saW5rX3dhdGNoLmMKaW5kZXggNGIzNjExNC4uNTQ5YTJjZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbGlua193YXRjaC5jCisrKyBiL25ldC9jb3JlL2xpbmtfd2F0Y2guYwpAQCAtMzQsOCArMzQsOCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGlua3dhdGNoX2ZsYWdzOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGlua3dhdGNoX25leHRldmVudDsKIAotc3RhdGljIHZvaWQgbGlua3dhdGNoX2V2ZW50KHZvaWQgKmR1bW15KTsKLXN0YXRpYyBERUNMQVJFX1dPUksobGlua3dhdGNoX3dvcmssIGxpbmt3YXRjaF9ldmVudCwgTlVMTCk7CitzdGF0aWMgdm9pZCBsaW5rd2F0Y2hfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSk7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksobGlua3dhdGNoX3dvcmssIGxpbmt3YXRjaF9ldmVudCk7CiAKIHN0YXRpYyBMSVNUX0hFQUQobHdldmVudGxpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhsd2V2ZW50bGlzdF9sb2NrKTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogfSAgICAgICAKIAogCi1zdGF0aWMgdm9pZCBsaW5rd2F0Y2hfZXZlbnQodm9pZCAqZHVtbXkpCitzdGF0aWMgdm9pZCBsaW5rd2F0Y2hfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKIHsKIAkvKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGxpbmt3YXRjaCBldmVudHMgdG8gb25lCiAJICogcGVyIHNlY29uZCBzbyB0aGF0IGEgcnVuYXdheSBkcml2ZXIgZG9lcyBub3QKQEAgLTE3MSwxMCArMTcxLDkgQEAKIAkJCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSBsaW5rd2F0Y2hfbmV4dGV2ZW50IC0gamlmZmllczsKIAogCQkJLyogSWYgd2Ugd3JhcCBhcm91bmQgd2UnbGwgZGVsYXkgaXQgYnkgYXQgbW9zdCBIWi4gKi8KLQkJCWlmICghZGVsYXkgfHwgZGVsYXkgPiBIWikKLQkJCQlzY2hlZHVsZV93b3JrKCZsaW5rd2F0Y2hfd29yayk7Ci0JCQllbHNlCi0JCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZsaW5rd2F0Y2hfd29yaywgZGVsYXkpOworCQkJaWYgKGRlbGF5ID4gSFopCisJCQkJZGVsYXkgPSAwOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZsaW5rd2F0Y2hfd29yaywgZGVsYXkpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwppbmRleCBiNGI0NzgzLi5lNzMwMGI2IDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZWlnaGJvdXIuYworKysgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiAJCQlnb3RvIG91dF9lbnRyaWVzOwogCX0KIAotCW4gPSBrbWVtX2NhY2hlX2FsbG9jKHRibC0+a21lbV9jYWNoZXAsIFNMQUJfQVRPTUlDKTsKKwluID0ga21lbV9jYWNoZV9hbGxvYyh0YmwtPmttZW1fY2FjaGVwLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW4pCiAJCWdvdG8gb3V0X2VudHJpZXM7CiAKQEAgLTU3Nyw5ICs1NzcsMTAgQEAKIAl3aGlsZSAoKGhoID0gbmVpZ2gtPmhoKSAhPSBOVUxMKSB7CiAJCW5laWdoLT5oaCA9IGhoLT5oaF9uZXh0OwogCQloaC0+aGhfbmV4dCA9IE5VTEw7Ci0JCXdyaXRlX2xvY2tfYmgoJmhoLT5oaF9sb2NrKTsKKworCQl3cml0ZV9zZXFsb2NrX2JoKCZoaC0+aGhfbG9jayk7CiAJCWhoLT5oaF9vdXRwdXQgPSBuZWlnaF9ibGFja2hvbGU7Ci0JCXdyaXRlX3VubG9ja19iaCgmaGgtPmhoX2xvY2spOworCQl3cml0ZV9zZXF1bmxvY2tfYmgoJmhoLT5oaF9sb2NrKTsKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmhoLT5oaF9yZWZjbnQpKQogCQkJa2ZyZWUoaGgpOwogCX0KQEAgLTg5Nyw5ICs4OTgsOSBAQAogCiAJaWYgKHVwZGF0ZSkgewogCQlmb3IgKGhoID0gbmVpZ2gtPmhoOyBoaDsgaGggPSBoaC0+aGhfbmV4dCkgewotCQkJd3JpdGVfbG9ja19iaCgmaGgtPmhoX2xvY2spOworCQkJd3JpdGVfc2VxbG9ja19iaCgmaGgtPmhoX2xvY2spOwogCQkJdXBkYXRlKGhoLCBuZWlnaC0+ZGV2LCBuZWlnaC0+aGEpOwotCQkJd3JpdGVfdW5sb2NrX2JoKCZoaC0+aGhfbG9jayk7CisJCQl3cml0ZV9zZXF1bmxvY2tfYmgoJmhoLT5oaF9sb2NrKTsKIAkJfQogCX0KIH0KQEAgLTEwODksNyArMTA5MCw3IEBACiAJCQlicmVhazsKIAogCWlmICghaGggJiYgKGhoID0ga3phbGxvYyhzaXplb2YoKmhoKSwgR0ZQX0FUT01JQykpICE9IE5VTEwpIHsKLQkJcndsb2NrX2luaXQoJmhoLT5oaF9sb2NrKTsKKwkJc2VxbG9ja19pbml0KCZoaC0+aGhfbG9jayk7CiAJCWhoLT5oaF90eXBlID0gcHJvdG9jb2w7CiAJCWF0b21pY19zZXQoJmhoLT5oaF9yZWZjbnQsIDApOwogCQloaC0+aGhfbmV4dCA9IE5VTEw7CkBAIC0xMjY2LDEwICsxMjY3LDkgQEAKIHN0cnVjdCBuZWlnaF9wYXJtcyAqbmVpZ2hfcGFybXNfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCkKIHsKLQlzdHJ1Y3QgbmVpZ2hfcGFybXMgKnAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCXN0cnVjdCBuZWlnaF9wYXJtcyAqcCA9IGttZW1kdXAoJnRibC0+cGFybXMsIHNpemVvZigqcCksIEdGUF9LRVJORUwpOwogCiAJaWYgKHApIHsKLQkJbWVtY3B5KHAsICZ0YmwtPnBhcm1zLCBzaXplb2YoKnApKTsKIAkJcC0+dGJsCQkgID0gdGJsOwogCQlhdG9taWNfc2V0KCZwLT5yZWZjbnQsIDEpOwogCQlJTklUX1JDVV9IRUFEKCZwLT5yY3VfaGVhZCk7CkBAIC0yNDEwLDIwICsyNDEwLDI3IEBACiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogI2lmZGVmIENPTkZJR19BUlBECitzdGF0aWMgaW5saW5lIHNpemVfdCBuZWlnaF9ubG1zZ19zaXplKHZvaWQpCit7CisJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmRtc2cpKQorCSAgICAgICArIG5sYV90b3RhbF9zaXplKE1BWF9BRERSX0xFTikgLyogTkRBX0RTVCAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKE1BWF9BRERSX0xFTikgLyogTkRBX0xMQUREUiAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgbmRhX2NhY2hlaW5mbykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCk7IC8qIE5EQV9QUk9CRVMgKi8KK30KKwogc3RhdGljIHZvaWQgX19uZWlnaF9ub3RpZnkoc3RydWN0IG5laWdoYm91ciAqbiwgaW50IHR5cGUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAotCXNrYiA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0FUT01JQyk7CisJc2tiID0gbmxtc2dfbmV3KG5laWdoX25sbXNnX3NpemUoKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IG5laWdoX2ZpbGxfaW5mbyhza2IsIG4sIDAsIDAsIHR5cGUsIGZsYWdzKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXQ7Ci0JfQorCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gbmVpZ2hfbmxtc2dfc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX05FSUdILCBOVUxMLCBHRlBfQVRPTUlDKTsKIGVycm91dDoKQEAgLTI2MTgsMTQgKzI2MjUsMTQgQEAKIAkJCSAgaW50IHBfaWQsIGludCBwZGV2X2lkLCBjaGFyICpwX25hbWUsIAogCQkJICBwcm9jX2hhbmRsZXIgKmhhbmRsZXIsIGN0bF9oYW5kbGVyICpzdHJhdGVneSkKIHsKLQlzdHJ1Y3QgbmVpZ2hfc3lzY3RsX3RhYmxlICp0ID0ga21hbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgbmVpZ2hfc3lzY3RsX3RhYmxlICp0ID0ga21lbWR1cCgmbmVpZ2hfc3lzY3RsX3RlbXBsYXRlLAorCQkJCQkgICAgICAgc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CiAJY29uc3QgY2hhciAqZGV2X25hbWVfc291cmNlID0gTlVMTDsKIAljaGFyICpkZXZfbmFtZSA9IE5VTEw7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAoIXQpCiAJCXJldHVybiAtRU5PQlVGUzsKLQltZW1jcHkodCwgJm5laWdoX3N5c2N0bF90ZW1wbGF0ZSwgc2l6ZW9mKCp0KSk7CiAJdC0+bmVpZ2hfdmFyc1swXS5kYXRhICA9ICZwLT5tY2FzdF9wcm9iZXM7CiAJdC0+bmVpZ2hfdmFyc1sxXS5kYXRhICA9ICZwLT51Y2FzdF9wcm9iZXM7CiAJdC0+bmVpZ2hfdmFyc1syXS5kYXRhICA9ICZwLT5hcHBfcHJvYmVzOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmV0cG9sbC5jIGIvbmV0L2NvcmUvbmV0cG9sbC5jCmluZGV4IGVhZDU5MjAuLjgyMzIxNWQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldHBvbGwuYworKysgYi9uZXQvY29yZS9uZXRwb2xsLmMKQEAgLTM0LDE4ICszNCwxMiBAQAogI2RlZmluZSBNQVhfVURQX0NIVU5LIDE0NjAKICNkZWZpbmUgTUFYX1NLQlMgMzIKICNkZWZpbmUgTUFYX1FVRVVFX0RFUFRIIChNQVhfU0tCUyAvIDIpCi0jZGVmaW5lIE1BWF9SRVRSSUVTIDIwMDAwCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2tiX2xpc3RfbG9jayk7Ci1zdGF0aWMgaW50IG5yX3NrYnM7Ci1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnNrYnM7Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socXVldWVfbG9jayk7Ci1zdGF0aWMgaW50IHF1ZXVlX2RlcHRoOwotc3RhdGljIHN0cnVjdCBza19idWZmICpxdWV1ZV9oZWFkLCAqcXVldWVfdGFpbDsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl9wb29sOwogCiBzdGF0aWMgYXRvbWljX3QgdHJhcHBlZDsKIAorI2RlZmluZSBVU0VDX1BFUl9QT0xMCTUwCiAjZGVmaW5lIE5FVFBPTExfUlhfRU5BQkxFRCAgMQogI2RlZmluZSBORVRQT0xMX1JYX0RST1AgICAgIDIKIApAQCAtNTYsNTQgKzUwLDQxIEBACiBzdGF0aWMgdm9pZCB6YXBfY29tcGxldGlvbl9xdWV1ZSh2b2lkKTsKIHN0YXRpYyB2b2lkIGFycF9yZXBseShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotc3RhdGljIHZvaWQgcXVldWVfcHJvY2Vzcyh2b2lkICpwKQorc3RhdGljIHZvaWQgcXVldWVfcHJvY2VzcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGluZm8gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ldHBvbGxfaW5mbywgdHhfd29yay53b3JrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0Jd2hpbGUgKHF1ZXVlX2hlYWQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCQlza2IgPSBxdWV1ZV9oZWFkOwotCQlxdWV1ZV9oZWFkID0gc2tiLT5uZXh0OwotCQlpZiAoc2tiID09IHF1ZXVlX3RhaWwpCi0JCQlxdWV1ZV9oZWFkID0gTlVMTDsKLQotCQlxdWV1ZV9kZXB0aC0tOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCQlkZXZfcXVldWVfeG1pdChza2IpOwotCX0KLX0KLQotc3RhdGljIERFQ0xBUkVfV09SSyhzZW5kX3F1ZXVlLCBxdWV1ZV9wcm9jZXNzLCBOVUxMKTsKLQotdm9pZCBuZXRwb2xsX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IpCi17CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChxdWV1ZV9kZXB0aCA9PSBNQVhfUVVFVUVfREVQVEgpIHsKLQkJX19rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJm5waW5mby0+dHhxKSkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCisJCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSB8fCAhbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQlfX2tmcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCW5ldGlmX3R4X2xvY2soZGV2KTsKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSB8fAorCQkgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBkZXYpICE9IE5FVERFVl9UWF9PSykgeworCQkJc2tiX3F1ZXVlX2hlYWQoJm5waW5mby0+dHhxLCBza2IpOworCQkJbmV0aWZfdHhfdW5sb2NrKGRldik7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbnBpbmZvLT50eF93b3JrLCBIWi8xMCk7CisJCQlyZXR1cm47CisJCX0KKwkJbmV0aWZfdHhfdW5sb2NrKGRldik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghcXVldWVfaGVhZCkKLQkJcXVldWVfaGVhZCA9IHNrYjsKLQllbHNlCi0JCXF1ZXVlX3RhaWwtPm5leHQgPSBza2I7Ci0JcXVldWVfdGFpbCA9IHNrYjsKLQlxdWV1ZV9kZXB0aCsrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCXNjaGVkdWxlX3dvcmsoJnNlbmRfcXVldWUpOwogfQogCi1zdGF0aWMgaW50IGNoZWNrc3VtX3VkcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCwKLQkJCSAgICAgdW5zaWduZWQgc2hvcnQgdWxlbiwgdTMyIHNhZGRyLCB1MzIgZGFkZHIpCitzdGF0aWMgX19zdW0xNiBjaGVja3N1bV91ZHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgsCisJCQkgICAgdW5zaWduZWQgc2hvcnQgdWxlbiwgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIpCiB7Ci0JdW5zaWduZWQgaW50IHBzdW07CisJX193c3VtIHBzdW07CiAKIAlpZiAodWgtPmNoZWNrID09IDAgfHwgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCiAJCXJldHVybiAwOwpAQCAtMTExLDcgKzkyLDcgQEAKIAlwc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLCBkYWRkciwgdWxlbiwgSVBQUk9UT19VRFAsIDApOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFICYmCi0JICAgICEodTE2KWNzdW1fZm9sZChjc3VtX2FkZChwc3VtLCBza2ItPmNzdW0pKSkKKwkgICAgIWNzdW1fZm9sZChjc3VtX2FkZChwc3VtLCBza2ItPmNzdW0pKSkKIAkJcmV0dXJuIDA7CiAKIAlza2ItPmNzdW0gPSBwc3VtOwpAQCAtMTY3LDEyICsxNDgsMTEgQEAKIAkJYXJwX3JlcGx5KHNrYik7CiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZucGktPmFycF90eCk7CiAJfQotCXJldHVybjsKIH0KIAogdm9pZCBuZXRwb2xsX3BvbGwoc3RydWN0IG5ldHBvbGwgKm5wKQogewotCWlmKCFucC0+ZGV2IHx8ICFuZXRpZl9ydW5uaW5nKG5wLT5kZXYpIHx8ICFucC0+ZGV2LT5wb2xsX2NvbnRyb2xsZXIpCisJaWYgKCFucC0+ZGV2IHx8ICFuZXRpZl9ydW5uaW5nKG5wLT5kZXYpIHx8ICFucC0+ZGV2LT5wb2xsX2NvbnRyb2xsZXIpCiAJCXJldHVybjsKIAogCS8qIFByb2Nlc3MgcGVuZGluZyB3b3JrIG9uIE5JQyAqLwpAQCAtMTkwLDE3ICsxNzAsMTUgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2tiX2xpc3RfbG9jaywgZmxhZ3MpOwotCXdoaWxlIChucl9za2JzIDwgTUFYX1NLQlMpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2tiX3Bvb2wubG9jaywgZmxhZ3MpOworCXdoaWxlIChza2JfcG9vbC5xbGVuIDwgTUFYX1NLQlMpIHsKIAkJc2tiID0gYWxsb2Nfc2tiKE1BWF9TS0JfU0laRSwgR0ZQX0FUT01JQyk7CiAJCWlmICghc2tiKQogCQkJYnJlYWs7CiAKLQkJc2tiLT5uZXh0ID0gc2ticzsKLQkJc2ticyA9IHNrYjsKLQkJbnJfc2ticysrOworCQlfX3NrYl9xdWV1ZV90YWlsKCZza2JfcG9vbCwgc2tiKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2tiX2xpc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNrYl9wb29sLmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgemFwX2NvbXBsZXRpb25fcXVldWUodm9pZCkKQEAgLTIxOSw3ICsxOTcsNyBAQAogCQl3aGlsZSAoY2xpc3QgIT0gTlVMTCkgewogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGNsaXN0OwogCQkJY2xpc3QgPSBjbGlzdC0+bmV4dDsKLQkJCWlmKHNrYi0+ZGVzdHJ1Y3RvcikKKwkJCWlmIChza2ItPmRlc3RydWN0b3IpCiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsgLyogcHV0IHRoaXMgb25lIGJhY2sgKi8KIAkJCWVsc2UKIAkJCQlfX2tmcmVlX3NrYihza2IpOwpAQCAtMjI5LDM4ICsyMDcsMjUgQEAKIAlwdXRfY3B1X3Zhcihzb2Z0bmV0X2RhdGEpOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKiBmaW5kX3NrYihzdHJ1Y3QgbmV0cG9sbCAqbnAsIGludCBsZW4sIGludCByZXNlcnZlKQorc3RhdGljIHN0cnVjdCBza19idWZmICpmaW5kX3NrYihzdHJ1Y3QgbmV0cG9sbCAqbnAsIGludCBsZW4sIGludCByZXNlcnZlKQogewotCWludCBvbmNlID0gMSwgY291bnQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJemFwX2NvbXBsZXRpb25fcXVldWUoKTsKKwlyZWZpbGxfc2ticygpOwogcmVwZWF0OgotCWlmIChucl9za2JzIDwgTUFYX1NLQlMpCi0JCXJlZmlsbF9za2JzKCk7CiAKIAlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJc2tiID0gc2tiX2RlcXVldWUoJnNrYl9wb29sKTsKIAogCWlmICghc2tiKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZza2JfbGlzdF9sb2NrLCBmbGFncyk7Ci0JCXNrYiA9IHNrYnM7Ci0JCWlmIChza2IpIHsKLQkJCXNrYnMgPSBza2ItPm5leHQ7Ci0JCQlza2ItPm5leHQgPSBOVUxMOwotCQkJbnJfc2ticy0tOworCQlpZiAoKytjb3VudCA8IDEwKSB7CisJCQluZXRwb2xsX3BvbGwobnApOworCQkJZ290byByZXBlYXQ7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2tiX2xpc3RfbG9jaywgZmxhZ3MpOwotCX0KLQotCWlmKCFza2IpIHsKLQkJY291bnQrKzsKLQkJaWYgKG9uY2UgJiYgKGNvdW50ID09IDEwMDAwMDApKSB7Ci0JCQlwcmludGsoIm91dCBvZiBuZXRwb2xsIHNrYnMhXG4iKTsKLQkJCW9uY2UgPSAwOwotCQl9Ci0JCW5ldHBvbGxfcG9sbChucCk7Ci0JCWdvdG8gcmVwZWF0OworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlhdG9taWNfc2V0KCZza2ItPnVzZXJzLCAxKTsKQEAgLTI3MCw1MCArMjM1LDQ2IEBACiAKIHN0YXRpYyB2b2lkIG5ldHBvbGxfc2VuZF9za2Ioc3RydWN0IG5ldHBvbGwgKm5wLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCBzdGF0dXM7Ci0Jc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvOworCWludCBzdGF0dXMgPSBORVRERVZfVFhfQlVTWTsKKwl1bnNpZ25lZCBsb25nIHRyaWVzOworIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbnAtPmRldjsKKyAJc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvID0gbnAtPmRldi0+bnBpbmZvOwogCi0JaWYgKCFucCB8fCAhbnAtPmRldiB8fCAhbmV0aWZfcnVubmluZyhucC0+ZGV2KSkgewotCQlfX2tmcmVlX3NrYihza2IpOwotCQlyZXR1cm47Ci0JfQorIAlpZiAoIW5waW5mbyB8fCAhbmV0aWZfcnVubmluZyhkZXYpIHx8ICFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisgCQlfX2tmcmVlX3NrYihza2IpOworIAkJcmV0dXJuOworIAl9CiAKLQlucGluZm8gPSBucC0+ZGV2LT5ucGluZm87CisJLyogZG9uJ3QgZ2V0IG1lc3NhZ2VzIG91dCBvZiBvcmRlciwgYW5kIG5vIHJlY3Vyc2lvbiAqLworCWlmIChza2JfcXVldWVfbGVuKCZucGluZm8tPnR4cSkgPT0gMCAmJgorCQkgICAgbnBpbmZvLT5wb2xsX293bmVyICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogYXZvaWQgcmVjdXJzaW9uICovCi0JaWYgKG5waW5mby0+cG9sbF9vd25lciA9PSBzbXBfcHJvY2Vzc29yX2lkKCkgfHwKLQkgICAgbnAtPmRldi0+eG1pdF9sb2NrX293bmVyID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgewotCQlpZiAobnAtPmRyb3ApCi0JCQlucC0+ZHJvcChza2IpOwotCQllbHNlCi0JCQlfX2tmcmVlX3NrYihza2IpOwotCQlyZXR1cm47Ci0JfQorCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWlmIChuZXRpZl90eF90cnlsb2NrKGRldikpIHsKKwkJCS8qIHRyeSB1bnRpbCBuZXh0IGNsb2NrIHRpY2sgKi8KKwkJCWZvciAodHJpZXMgPSBqaWZmaWVzX3RvX3VzZWNzKDEpL1VTRUNfUEVSX1BPTEw7CisJCQkJCXRyaWVzID4gMDsgLS10cmllcykgeworCQkJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJCQlzdGF0dXMgPSBkZXYtPmhhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CiAKLQlkbyB7Ci0JCW5waW5mby0+dHJpZXMtLTsKLQkJbmV0aWZfdHhfbG9jayhucC0+ZGV2KTsKKwkJCQlpZiAoc3RhdHVzID09IE5FVERFVl9UWF9PSykKKwkJCQkJYnJlYWs7CiAKLQkJLyoKLQkJICogbmV0d29yayBkcml2ZXJzIGRvIG5vdCBleHBlY3QgdG8gYmUgY2FsbGVkIGlmIHRoZSBxdWV1ZSBpcwotCQkgKiBzdG9wcGVkLgotCQkgKi8KLQkJc3RhdHVzID0gTkVUREVWX1RYX0JVU1k7Ci0JCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChucC0+ZGV2KSkKLQkJCXN0YXR1cyA9IG5wLT5kZXYtPmhhcmRfc3RhcnRfeG1pdChza2IsIG5wLT5kZXYpOworCQkJCS8qIHRpY2tsZSBkZXZpY2UgbWF5YmUgdGhlcmUgaXMgc29tZSBjbGVhbnVwICovCisJCQkJbmV0cG9sbF9wb2xsKG5wKTsKIAotCQluZXRpZl90eF91bmxvY2sobnAtPmRldik7Ci0KLQkJLyogc3VjY2VzcyAqLwotCQlpZighc3RhdHVzKSB7Ci0JCQlucGluZm8tPnRyaWVzID0gTUFYX1JFVFJJRVM7IC8qIHJlc2V0ICovCi0JCQlyZXR1cm47CisJCQkJdWRlbGF5KFVTRUNfUEVSX1BPTEwpOworCQkJfQorCQkJbmV0aWZfdHhfdW5sb2NrKGRldik7CiAJCX0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KIAotCQkvKiB0cmFuc21pdCBidXN5ICovCi0JCW5ldHBvbGxfcG9sbChucCk7Ci0JCXVkZWxheSg1MCk7Ci0JfSB3aGlsZSAobnBpbmZvLT50cmllcyA+IDApOworCWlmIChzdGF0dXMgIT0gTkVUREVWX1RYX09LKSB7CisJCXNrYl9xdWV1ZV90YWlsKCZucGluZm8tPnR4cSwgc2tiKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZucGluZm8tPnR4X3dvcmssMCk7CisJfQogfQogCiB2b2lkIG5ldHBvbGxfc2VuZF91ZHAoc3RydWN0IG5ldHBvbGwgKm5wLCBjb25zdCBjaGFyICptc2csIGludCBsZW4pCkBAIC0zMzUsMTMgKzI5NiwxOSBAQAogCW1lbWNweShza2ItPmRhdGEsIG1zZywgbGVuKTsKIAlza2ItPmxlbiArPSBsZW47CiAKLQl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YoKnVkcGgpKTsKKwlza2ItPmgudWggPSB1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YoKnVkcGgpKTsKIAl1ZHBoLT5zb3VyY2UgPSBodG9ucyhucC0+bG9jYWxfcG9ydCk7CiAJdWRwaC0+ZGVzdCA9IGh0b25zKG5wLT5yZW1vdGVfcG9ydCk7CiAJdWRwaC0+bGVuID0gaHRvbnModWRwX2xlbik7CiAJdWRwaC0+Y2hlY2sgPSAwOworCXVkcGgtPmNoZWNrID0gY3N1bV90Y3B1ZHBfbWFnaWMoaHRvbmwobnAtPmxvY2FsX2lwKSwKKwkJCQkJaHRvbmwobnAtPnJlbW90ZV9pcCksCisJCQkJCXVkcF9sZW4sIElQUFJPVE9fVURQLAorCQkJCQljc3VtX3BhcnRpYWwoKHVuc2lnbmVkIGNoYXIgKil1ZHBoLCB1ZHBfbGVuLCAwKSk7CisJaWYgKHVkcGgtPmNoZWNrID09IDApCisJCXVkcGgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7CiAKLQlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLCBzaXplb2YoKmlwaCkpOworCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCppcGgpKTsKIAogCS8qIGlwaC0+dmVyc2lvbiA9IDQ7IGlwaC0+aWhsID0gNTsgKi8KIAlwdXRfdW5hbGlnbmVkKDB4NDUsICh1bnNpZ25lZCBjaGFyICopaXBoKTsKQEAgLTM1Nyw4ICszMjQsOCBAQAogCWlwaC0+Y2hlY2sgICAgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKTsKIAogCWV0aCA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotCi0JZXRoLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfSVApOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnByb3RvY29sID0gZXRoLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfSVApOwogCW1lbWNweShldGgtPmhfc291cmNlLCBucC0+bG9jYWxfbWFjLCA2KTsKIAltZW1jcHkoZXRoLT5oX2Rlc3QsIG5wLT5yZW1vdGVfbWFjLCA2KTsKIApAQCAtMzczLDcgKzM0MCw4IEBACiAJc3RydWN0IGFycGhkciAqYXJwOwogCXVuc2lnbmVkIGNoYXIgKmFycF9wdHI7CiAJaW50IHNpemUsIHR5cGUgPSBBUlBPUF9SRVBMWSwgcHR5cGUgPSBFVEhfUF9BUlA7Ci0JdTMyIHNpcCwgdGlwOworCV9fYmUzMiBzaXAsIHRpcDsKKwl1bnNpZ25lZCBjaGFyICpzaGE7CiAJc3RydWN0IHNrX2J1ZmYgKnNlbmRfc2tiOwogCXN0cnVjdCBuZXRwb2xsICpucCA9IE5VTEw7CiAKQEAgLTQwMCw5ICszNjgsMTQgQEAKIAkgICAgYXJwLT5hcl9vcCAhPSBodG9ucyhBUlBPUF9SRVFVRVNUKSkKIAkJcmV0dXJuOwogCi0JYXJwX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopKGFycCsxKSArIHNrYi0+ZGV2LT5hZGRyX2xlbjsKKwlhcnBfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoYXJwKzEpOworCS8qIHNhdmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBzcmMgaHcgYWRkciAqLworCXNoYSA9IGFycF9wdHI7CisJYXJwX3B0ciArPSBza2ItPmRldi0+YWRkcl9sZW47CiAJbWVtY3B5KCZzaXAsIGFycF9wdHIsIDQpOwotCWFycF9wdHIgKz0gNCArIHNrYi0+ZGV2LT5hZGRyX2xlbjsKKwlhcnBfcHRyICs9IDQ7CisJLyogaWYgd2UgYWN0dWFsbHkgY2FyZWQgYWJvdXQgZHN0IGh3IGFkZHIsIGl0IHdvdWxkIGdldCBjb3BpZWQgaGVyZSAqLworCWFycF9wdHIgKz0gc2tiLT5kZXYtPmFkZHJfbGVuOwogCW1lbWNweSgmdGlwLCBhcnBfcHRyLCA0KTsKIAogCS8qIFNob3VsZCB3ZSBpZ25vcmUgYXJwPyAqLwpAQCAtNDI1LDggKzM5OCw4IEBACiAKIAlpZiAobnAtPmRldi0+aGFyZF9oZWFkZXIgJiYKIAkgICAgbnAtPmRldi0+aGFyZF9oZWFkZXIoc2VuZF9za2IsIHNrYi0+ZGV2LCBwdHlwZSwKLQkJCQkgICAgICAgbnAtPnJlbW90ZV9tYWMsIG5wLT5sb2NhbF9tYWMsCi0JCQkJICAgICAgIHNlbmRfc2tiLT5sZW4pIDwgMCkgeworCQkJCSBzaGEsIG5wLT5sb2NhbF9tYWMsCisJCQkJIHNlbmRfc2tiLT5sZW4pIDwgMCkgewogCQlrZnJlZV9za2Ioc2VuZF9za2IpOwogCQlyZXR1cm47CiAJfQpAQCAtNDQ5LDcgKzQyMiw3IEBACiAJYXJwX3B0ciArPSBucC0+ZGV2LT5hZGRyX2xlbjsKIAltZW1jcHkoYXJwX3B0ciwgJnRpcCwgNCk7CiAJYXJwX3B0ciArPSA0OwotCW1lbWNweShhcnBfcHRyLCBucC0+cmVtb3RlX21hYywgbnAtPmRldi0+YWRkcl9sZW4pOworCW1lbWNweShhcnBfcHRyLCBzaGEsIG5wLT5kZXYtPmFkZHJfbGVuKTsKIAlhcnBfcHRyICs9IG5wLT5kZXYtPmFkZHJfbGVuOwogCW1lbWNweShhcnBfcHRyLCAmc2lwLCA0KTsKIApAQCAtNDY0LDcgKzQzNyw2IEBACiAJc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpID0gc2tiLT5kZXYtPm5waW5mbzsKIAlzdHJ1Y3QgbmV0cG9sbCAqbnAgPSBucGktPnJ4X25wOwogCi0KIAlpZiAoIW5wKQogCQlnb3RvIG91dDsKIAlpZiAoc2tiLT5kZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSKQpAQCAtNTM3LDQ3ICs1MDksNDcgQEAKIHsKIAljaGFyICpjdXI9b3B0LCAqZGVsaW07CiAKLQlpZigqY3VyICE9ICdAJykgeworCWlmICgqY3VyICE9ICdAJykgewogCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJ0AnKSkgPT0gTlVMTCkKIAkJCWdvdG8gcGFyc2VfZmFpbGVkOwotCQkqZGVsaW09MDsKLQkJbnAtPmxvY2FsX3BvcnQ9c2ltcGxlX3N0cnRvbChjdXIsIE5VTEwsIDEwKTsKLQkJY3VyPWRlbGltOworCQkqZGVsaW0gPSAwOworCQlucC0+bG9jYWxfcG9ydCA9IHNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxMCk7CisJCWN1ciA9IGRlbGltOwogCX0KIAljdXIrKzsKIAlwcmludGsoS0VSTl9JTkZPICIlczogbG9jYWwgcG9ydCAlZFxuIiwgbnAtPm5hbWUsIG5wLT5sb2NhbF9wb3J0KTsKIAotCWlmKCpjdXIgIT0gJy8nKSB7CisJaWYgKCpjdXIgIT0gJy8nKSB7CiAJCWlmICgoZGVsaW0gPSBzdHJjaHIoY3VyLCAnLycpKSA9PSBOVUxMKQogCQkJZ290byBwYXJzZV9mYWlsZWQ7Ci0JCSpkZWxpbT0wOwotCQlucC0+bG9jYWxfaXA9bnRvaGwoaW5fYXRvbihjdXIpKTsKLQkJY3VyPWRlbGltOworCQkqZGVsaW0gPSAwOworCQlucC0+bG9jYWxfaXAgPSBudG9obChpbl9hdG9uKGN1cikpOworCQljdXIgPSBkZWxpbTsKIAogCQlwcmludGsoS0VSTl9JTkZPICIlczogbG9jYWwgSVAgJWQuJWQuJWQuJWRcbiIsCiAJCSAgICAgICBucC0+bmFtZSwgSElQUVVBRChucC0+bG9jYWxfaXApKTsKIAl9CiAJY3VyKys7CiAKLQlpZiAoICpjdXIgIT0gJywnKSB7CisJaWYgKCpjdXIgIT0gJywnKSB7CiAJCS8qIHBhcnNlIG91dCBkZXYgbmFtZSAqLwogCQlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJywnKSkgPT0gTlVMTCkKIAkJCWdvdG8gcGFyc2VfZmFpbGVkOwotCQkqZGVsaW09MDsKKwkJKmRlbGltID0gMDsKIAkJc3RybGNweShucC0+ZGV2X25hbWUsIGN1ciwgc2l6ZW9mKG5wLT5kZXZfbmFtZSkpOwotCQljdXI9ZGVsaW07CisJCWN1ciA9IGRlbGltOwogCX0KIAljdXIrKzsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcmZhY2UgJXNcbiIsIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOwogCi0JaWYgKCAqY3VyICE9ICdAJyApIHsKKwlpZiAoKmN1ciAhPSAnQCcpIHsKIAkJLyogZHN0IHBvcnQgKi8KIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICdAJykpID09IE5VTEwpCiAJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKLQkJKmRlbGltPTA7Ci0JCW5wLT5yZW1vdGVfcG9ydD1zaW1wbGVfc3RydG9sKGN1ciwgTlVMTCwgMTApOwotCQljdXI9ZGVsaW07CisJCSpkZWxpbSA9IDA7CisJCW5wLT5yZW1vdGVfcG9ydCA9IHNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxMCk7CisJCWN1ciA9IGRlbGltOwogCX0KIAljdXIrKzsKIAlwcmludGsoS0VSTl9JTkZPICIlczogcmVtb3RlIHBvcnQgJWRcbiIsIG5wLT5uYW1lLCBucC0+cmVtb3RlX3BvcnQpOwpAQCAtNTg1LDQyICs1NTcsNDEgQEAKIAkvKiBkc3QgaXAgKi8KIAlpZiAoKGRlbGltID0gc3RyY2hyKGN1ciwgJy8nKSkgPT0gTlVMTCkKIAkJZ290byBwYXJzZV9mYWlsZWQ7Ci0JKmRlbGltPTA7Ci0JbnAtPnJlbW90ZV9pcD1udG9obChpbl9hdG9uKGN1cikpOwotCWN1cj1kZWxpbSsxOworCSpkZWxpbSA9IDA7CisJbnAtPnJlbW90ZV9pcCA9IG50b2hsKGluX2F0b24oY3VyKSk7CisJY3VyID0gZGVsaW0gKyAxOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlbW90ZSBJUCAlZC4lZC4lZC4lZFxuIiwKLQkJICAgICAgIG5wLT5uYW1lLCBISVBRVUFEKG5wLT5yZW1vdGVfaXApKTsKKwkgICAgICAgbnAtPm5hbWUsIEhJUFFVQUQobnAtPnJlbW90ZV9pcCkpOwogCi0JaWYoICpjdXIgIT0gMCApCi0JeworCWlmICgqY3VyICE9IDApIHsKIAkJLyogTUFDIGFkZHJlc3MgKi8KIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICc6JykpID09IE5VTEwpCiAJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKLQkJKmRlbGltPTA7Ci0JCW5wLT5yZW1vdGVfbWFjWzBdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7Ci0JCWN1cj1kZWxpbSsxOworCQkqZGVsaW0gPSAwOworCQlucC0+cmVtb3RlX21hY1swXSA9IHNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJCWN1ciA9IGRlbGltICsgMTsKIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICc6JykpID09IE5VTEwpCiAJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKLQkJKmRlbGltPTA7Ci0JCW5wLT5yZW1vdGVfbWFjWzFdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7Ci0JCWN1cj1kZWxpbSsxOworCQkqZGVsaW0gPSAwOworCQlucC0+cmVtb3RlX21hY1sxXSA9IHNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJCWN1ciA9IGRlbGltICsgMTsKIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICc6JykpID09IE5VTEwpCiAJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKLQkJKmRlbGltPTA7Ci0JCW5wLT5yZW1vdGVfbWFjWzJdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7Ci0JCWN1cj1kZWxpbSsxOworCQkqZGVsaW0gPSAwOworCQlucC0+cmVtb3RlX21hY1syXSA9IHNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJCWN1ciA9IGRlbGltICsgMTsKIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICc6JykpID09IE5VTEwpCiAJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKLQkJKmRlbGltPTA7Ci0JCW5wLT5yZW1vdGVfbWFjWzNdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7Ci0JCWN1cj1kZWxpbSsxOworCQkqZGVsaW0gPSAwOworCQlucC0+cmVtb3RlX21hY1szXSA9IHNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJCWN1ciA9IGRlbGltICsgMTsKIAkJaWYgKChkZWxpbSA9IHN0cmNocihjdXIsICc6JykpID09IE5VTEwpCiAJCQlnb3RvIHBhcnNlX2ZhaWxlZDsKLQkJKmRlbGltPTA7Ci0JCW5wLT5yZW1vdGVfbWFjWzRdPXNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7Ci0JCWN1cj1kZWxpbSsxOwotCQlucC0+cmVtb3RlX21hY1s1XT1zaW1wbGVfc3RydG9sKGN1ciwgTlVMTCwgMTYpOworCQkqZGVsaW0gPSAwOworCQlucC0+cmVtb3RlX21hY1s0XSA9IHNpbXBsZV9zdHJ0b2woY3VyLCBOVUxMLCAxNik7CisJCWN1ciA9IGRlbGltICsgMTsKKwkJbnAtPnJlbW90ZV9tYWNbNV0gPSBzaW1wbGVfc3RydG9sKGN1ciwgTlVMTCwgMTYpOwogCX0KIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiByZW1vdGUgZXRoZXJuZXQgYWRkcmVzcyAiCkBAIC02NDcsMzQgKzYxOCw0NCBAQAogCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKIAlzdHJ1Y3QgbmV0cG9sbF9pbmZvICpucGluZm87CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOwogCiAJaWYgKG5wLT5kZXZfbmFtZSkKIAkJbmRldiA9IGRldl9nZXRfYnlfbmFtZShucC0+ZGV2X25hbWUpOwogCWlmICghbmRldikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBkb2Vzbid0IGV4aXN0LCBhYm9ydGluZy5cbiIsCiAJCSAgICAgICBucC0+bmFtZSwgbnAtPmRldl9uYW1lKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlucC0+ZGV2ID0gbmRldjsKIAlpZiAoIW5kZXYtPm5waW5mbykgewogCQlucGluZm8gPSBrbWFsbG9jKHNpemVvZigqbnBpbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbnBpbmZvKQorCQlpZiAoIW5waW5mbykgeworCQkJZXJyID0gLUVOT01FTTsKIAkJCWdvdG8gcmVsZWFzZTsKKwkJfQogCiAJCW5waW5mby0+cnhfZmxhZ3MgPSAwOwogCQlucGluZm8tPnJ4X25wID0gTlVMTDsKIAkJc3Bpbl9sb2NrX2luaXQoJm5waW5mby0+cG9sbF9sb2NrKTsKIAkJbnBpbmZvLT5wb2xsX293bmVyID0gLTE7Ci0JCW5waW5mby0+dHJpZXMgPSBNQVhfUkVUUklFUzsKKwogCQlzcGluX2xvY2tfaW5pdCgmbnBpbmZvLT5yeF9sb2NrKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbnBpbmZvLT5hcnBfdHgpOwotCX0gZWxzZQorCQlza2JfcXVldWVfaGVhZF9pbml0KCZucGluZm8tPnR4cSk7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZucGluZm8tPnR4X3dvcmssIHF1ZXVlX3Byb2Nlc3MpOworCisJCWF0b21pY19zZXQoJm5waW5mby0+cmVmY250LCAxKTsKKwl9IGVsc2UgewogCQlucGluZm8gPSBuZGV2LT5ucGluZm87CisJCWF0b21pY19pbmMoJm5waW5mby0+cmVmY250KTsKKwl9CiAKIAlpZiAoIW5kZXYtPnBvbGxfY29udHJvbGxlcikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBkb2Vzbid0IHN1cHBvcnQgcG9sbGluZywgYWJvcnRpbmcuXG4iLAogCQkgICAgICAgbnAtPm5hbWUsIG5wLT5kZXZfbmFtZSk7CisJCWVyciA9IC1FTk9UU1VQUDsKIAkJZ290byByZWxlYXNlOwogCX0KIApAQCAtNjg1LDEzICs2NjYsMTQgQEAKIAkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOwogCiAJCXJ0bmxfbG9jaygpOwotCQlpZiAoZGV2X2NoYW5nZV9mbGFncyhuZGV2LCBuZGV2LT5mbGFncyB8IElGRl9VUCkgPCAwKSB7CisJCWVyciA9IGRldl9vcGVuKG5kZXYpOworCQlydG5sX3VubG9jaygpOworCisJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBvcGVuICVzXG4iLAotCQkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOwotCQkJcnRubF91bmxvY2soKTsKKwkJCSAgICAgICBucC0+bmFtZSwgbmRldi0+bmFtZSk7CiAJCQlnb3RvIHJlbGVhc2U7CiAJCX0KLQkJcnRubF91bmxvY2soKTsKIAogCQlhdGxlYXN0ID0gamlmZmllcyArIEhaLzEwOwogIAkJYXRtb3N0ID0gamlmZmllcyArIDQqSFo7CkBAIC03MjksNiArNzExLDcgQEAKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gSVAgYWRkcmVzcyBmb3IgJXMsIGFib3J0aW5nXG4iLAogCQkJICAgICAgIG5wLT5uYW1lLCBucC0+ZGV2X25hbWUpOworCQkJZXJyID0gLUVERVNUQUREUlJFUTsKIAkJCWdvdG8gcmVsZWFzZTsKIAkJfQogCkBAIC03NjEsOSArNzQ0LDE2IEBACiAJCWtmcmVlKG5waW5mbyk7CiAJbnAtPmRldiA9IE5VTEw7CiAJZGV2X3B1dChuZGV2KTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBfX2luaXQgbmV0cG9sbF9pbml0KHZvaWQpCit7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2tiX3Bvb2wpOworCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChuZXRwb2xsX2luaXQpOworCiB2b2lkIG5ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0cG9sbCAqbnApCiB7CiAJc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvOwpAQCAtNzcxLDEyICs3NjEsMjUgQEAKIAogCWlmIChucC0+ZGV2KSB7CiAJCW5waW5mbyA9IG5wLT5kZXYtPm5waW5mbzsKLQkJaWYgKG5waW5mbyAmJiBucGluZm8tPnJ4X25wID09IG5wKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnBpbmZvLT5yeF9sb2NrLCBmbGFncyk7Ci0JCQlucGluZm8tPnJ4X25wID0gTlVMTDsKLQkJCW5waW5mby0+cnhfZmxhZ3MgJj0gfk5FVFBPTExfUlhfRU5BQkxFRDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5waW5mby0+cnhfbG9jaywgZmxhZ3MpOworCQlpZiAobnBpbmZvKSB7CisJCQlpZiAobnBpbmZvLT5yeF9ucCA9PSBucCkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZucGluZm8tPnJ4X2xvY2ssIGZsYWdzKTsKKwkJCQlucGluZm8tPnJ4X25wID0gTlVMTDsKKwkJCQlucGluZm8tPnJ4X2ZsYWdzICY9IH5ORVRQT0xMX1JYX0VOQUJMRUQ7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnBpbmZvLT5yeF9sb2NrLCBmbGFncyk7CisJCQl9CisKKwkJCW5wLT5kZXYtPm5waW5mbyA9IE5VTEw7CisJCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbnBpbmZvLT5yZWZjbnQpKSB7CisJCQkJc2tiX3F1ZXVlX3B1cmdlKCZucGluZm8tPmFycF90eCk7CisgCQkJCXNrYl9xdWV1ZV9wdXJnZSgmbnBpbmZvLT50eHEpOworCQkJCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJm5waW5mby0+dHhfd29yayk7CisgCQkJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwkJCQlrZnJlZShucGluZm8pOworCQkJfQogCQl9CisKIAkJZGV2X3B1dChucC0+ZGV2KTsKIAl9CiAKQEAgLTgwMyw0ICs4MDYsMyBAQAogRVhQT1JUX1NZTUJPTChuZXRwb2xsX2NsZWFudXApOwogRVhQT1JUX1NZTUJPTChuZXRwb2xsX3NlbmRfdWRwKTsKIEVYUE9SVF9TWU1CT0wobmV0cG9sbF9wb2xsKTsKLUVYUE9SVF9TWU1CT0wobmV0cG9sbF9xdWV1ZSk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9wa3RnZW4uYyBiL25ldC9jb3JlL3BrdGdlbi5jCmluZGV4IGRkMDIzZmQuLjE4OTdhM2EgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3BrdGdlbi5jCisrKyBiL25ldC9jb3JlL3BrdGdlbi5jCkBAIC0yMDcsNyArMjA3LDcgQEAKICNkZWZpbmUgU1ZMQU5fVEFHX1NJWkUoeCkgKCh4KS0+c3ZsYW5faWQgPT0gMHhmZmZmID8gMCA6IDQpCiAKIHN0cnVjdCBmbG93X3N0YXRlIHsKLQlfX3UzMiBjdXJfZGFkZHI7CisJX19iZTMyIGN1cl9kYWRkcjsKIAlpbnQgY291bnQ7CiB9OwogCkBAIC0yODIsMTAgKzI4MiwxMCBAQAogCS8qIElmIHdlJ3JlIGRvaW5nIHJhbmdlcywgcmFuZG9tIG9yIGluY3JlbWVudGFsLCB0aGVuIHRoaXMKIAkgKiBkZWZpbmVzIHRoZSBtaW4vbWF4IGZvciB0aG9zZSByYW5nZXMuCiAJICovCi0JX191MzIgc2FkZHJfbWluOwkvKiBpbmNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCi0JX191MzIgc2FkZHJfbWF4OwkvKiBleGNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCi0JX191MzIgZGFkZHJfbWluOwkvKiBpbmNsdXNpdmUsIGRlc3QgSVAgYWRkcmVzcyAqLwotCV9fdTMyIGRhZGRyX21heDsJLyogZXhjbHVzaXZlLCBkZXN0IElQIGFkZHJlc3MgKi8KKwlfX2JlMzIgc2FkZHJfbWluOwkvKiBpbmNsdXNpdmUsIHNvdXJjZSBJUCBhZGRyZXNzICovCisJX19iZTMyIHNhZGRyX21heDsJLyogZXhjbHVzaXZlLCBzb3VyY2UgSVAgYWRkcmVzcyAqLworCV9fYmUzMiBkYWRkcl9taW47CS8qIGluY2x1c2l2ZSwgZGVzdCBJUCBhZGRyZXNzICovCisJX19iZTMyIGRhZGRyX21heDsJLyogZXhjbHVzaXZlLCBkZXN0IElQIGFkZHJlc3MgKi8KIAogCV9fdTE2IHVkcF9zcmNfbWluOwkvKiBpbmNsdXNpdmUsIHNvdXJjZSBVRFAgcG9ydCAqLwogCV9fdTE2IHVkcF9zcmNfbWF4OwkvKiBleGNsdXNpdmUsIHNvdXJjZSBVRFAgcG9ydCAqLwpAQCAtMzE3LDggKzMxNyw4IEBACiAKIAlfX3UzMiBjdXJfZHN0X21hY19vZmZzZXQ7CiAJX191MzIgY3VyX3NyY19tYWNfb2Zmc2V0OwotCV9fdTMyIGN1cl9zYWRkcjsKLQlfX3UzMiBjdXJfZGFkZHI7CisJX19iZTMyIGN1cl9zYWRkcjsKKwlfX2JlMzIgY3VyX2RhZGRyOwogCV9fdTE2IGN1cl91ZHBfZHN0OwogCV9fdTE2IGN1cl91ZHBfc3JjOwogCV9fdTMyIGN1cl9wa3Rfc2l6ZTsKQEAgLTM1MCwxMCArMzUwLDEwIEBACiB9OwogCiBzdHJ1Y3QgcGt0Z2VuX2hkciB7Ci0JX191MzIgcGdoX21hZ2ljOwotCV9fdTMyIHNlcV9udW07Ci0JX191MzIgdHZfc2VjOwotCV9fdTMyIHR2X3VzZWM7CisJX19iZTMyIHBnaF9tYWdpYzsKKwlfX2JlMzIgc2VxX251bTsKKwlfX2JlMzIgdHZfc2VjOworCV9fYmUzMiB0dl91c2VjOwogfTsKIAogc3RydWN0IHBrdGdlbl90aHJlYWQgewpAQCAtMjE2MCw3ICsyMTYwLDcgQEAKIAkJZm9yKGkgPSAwOyBpIDwgcGt0X2Rldi0+bnJfbGFiZWxzOyBpKyspCiAJCQlpZiAocGt0X2Rldi0+bGFiZWxzW2ldICYgTVBMU19TVEFDS19CT1RUT00pCiAJCQkJcGt0X2Rldi0+bGFiZWxzW2ldID0gTVBMU19TVEFDS19CT1RUT00gfAotCQkJCQkJICAgICAocGt0Z2VuX3JhbmRvbSgpICYKKwkJCQkJICAgICAoKF9fZm9yY2UgX19iZTMyKXBrdGdlbl9yYW5kb20oKSAmCiAJCQkJCQkgICAgICBodG9ubCgweDAwMGZmZmZmKSk7CiAJfQogCkBAIC0yMjIwLDI5ICsyMjIwLDI1IEBACiAJCWlmIChwa3RfZGV2LT5jZmxvd3MgJiYgcGt0X2Rldi0+Zmxvd3NbZmxvd10uY291bnQgIT0gMCkgewogCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gcGt0X2Rldi0+Zmxvd3NbZmxvd10uY3VyX2RhZGRyOwogCQl9IGVsc2UgewotCi0JCQlpZiAoKGltbiA9IG50b2hsKHBrdF9kZXYtPmRhZGRyX21pbikpIDwgKGlteCA9Ci0JCQkJCQkJCSBudG9obChwa3RfZGV2LT4KLQkJCQkJCQkJICAgICAgIGRhZGRyX21heCkpKQotCQkJeworCQkJaW1uID0gbnRvaGwocGt0X2Rldi0+ZGFkZHJfbWluKTsKKwkJCWlteCA9IG50b2hsKHBrdF9kZXYtPmRhZGRyX21heCk7CisJCQlpZiAoaW1uIDwgaW14KSB7CiAJCQkJX191MzIgdDsKKwkJCQlfX2JlMzIgczsKIAkJCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQRFNUX1JORCkgewogCi0JCQkJCXQgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChpbXggLSBpbW4pKSArCi0JCQkJCSAgICAgaW1uKTsKLQkJCQkJdCA9IGh0b25sKHQpOworCQkJCQl0ID0gcGt0Z2VuX3JhbmRvbSgpICUgKGlteCAtIGltbikgKyBpbW47CisJCQkJCXMgPSBodG9ubCh0KTsKIAotCQkJCQl3aGlsZSAoTE9PUEJBQ0sodCkgfHwgTVVMVElDQVNUKHQpCi0JCQkJCSAgICAgICB8fCBCQURDTEFTUyh0KSB8fCBaRVJPTkVUKHQpCi0JCQkJCSAgICAgICB8fCBMT0NBTF9NQ0FTVCh0KSkgewotCQkJCQkJdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUKLQkJCQkJCSAgICAgIChpbXggLSBpbW4pKSArIGltbik7Ci0JCQkJCQl0ID0gaHRvbmwodCk7CisJCQkJCXdoaWxlIChMT09QQkFDSyhzKSB8fCBNVUxUSUNBU1QocykKKwkJCQkJICAgICAgIHx8IEJBRENMQVNTKHMpIHx8IFpFUk9ORVQocykKKwkJCQkJICAgICAgIHx8IExPQ0FMX01DQVNUKHMpKSB7CisJCQkJCQl0ID0gKHBrdGdlbl9yYW5kb20oKSAlCisJCQkJCQkgICAgICAoaW14IC0gaW1uKSkgKyBpbW47CisJCQkJCQlzID0gaHRvbmwodCk7CiAJCQkJCX0KLQkJCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gdDsKLQkJCQl9Ci0KLQkJCQllbHNlIHsKKwkJCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gczsKKwkJCQl9IGVsc2UgewogCQkJCQl0ID0gbnRvaGwocGt0X2Rldi0+Y3VyX2RhZGRyKTsKIAkJCQkJdCsrOwogCQkJCQlpZiAodCA+IGlteCkgewpAQCAtMjI3MCw3ICsyMjY2LDcgQEAKIAogCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkJCXBrdF9kZXYtPmN1cl9pbjZfZGFkZHIuczZfYWRkcjMyW2ldID0KLQkJCQkgICAgKChwa3RnZW5fcmFuZG9tKCkgfAorCQkJCSAgICAoKChfX2ZvcmNlIF9fYmUzMilwa3RnZW5fcmFuZG9tKCkgfAogCQkJCSAgICAgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcjMyW2ldKSAmCiAJCQkJICAgICBwa3RfZGV2LT5tYXhfaW42X2RhZGRyLnM2X2FkZHIzMltpXSk7CiAJCQl9CkBAIC0yMzA0LDYgKzIzMDAsMTIgQEAKIAkqbXBscyB8PSBNUExTX1NUQUNLX0JPVFRPTTsKIH0KIAorc3RhdGljIGlubGluZSBfX2JlMTYgYnVpbGRfdGNpKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IGNmaSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcHJpbykKK3sKKwlyZXR1cm4gaHRvbnMoaWQgfCAoY2ZpIDw8IDEyKSB8IChwcmlvIDw8IDEzKSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZmlsbF9wYWNrZXRfaXB2NChzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiwKIAkJCQkJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCiB7CkBAIC0yMzUzLDE2ICsyMzU1LDE2IEBACiAJaWYgKHBrdF9kZXYtPnZsYW5faWQgIT0gMHhmZmZmKSB7CiAJCWlmKHBrdF9kZXYtPnN2bGFuX2lkICE9IDB4ZmZmZikgewogCQkJc3ZsYW5fdGNpID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7Ci0JCQkqc3ZsYW5fdGNpID0gaHRvbnMocGt0X2Rldi0+c3ZsYW5faWQpOwotCQkJKnN2bGFuX3RjaSB8PSBwa3RfZGV2LT5zdmxhbl9wIDw8IDU7Ci0JCQkqc3ZsYW5fdGNpIHw9IHBrdF9kZXYtPnN2bGFuX2NmaSA8PCA0OworCQkJKnN2bGFuX3RjaSA9IGJ1aWxkX3RjaShwa3RfZGV2LT5zdmxhbl9pZCwKKwkJCQkJICAgICAgIHBrdF9kZXYtPnN2bGFuX2NmaSwKKwkJCQkJICAgICAgIHBrdF9kZXYtPnN2bGFuX3ApOwogCQkJc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7CiAJCQkqc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSk7CiAJCX0KIAkJdmxhbl90Y2kgPSAoX19iZTE2ICopc2tiX3B1dChza2IsIHNpemVvZihfX2JlMTYpKTsKLQkJKnZsYW5fdGNpID0gaHRvbnMocGt0X2Rldi0+dmxhbl9pZCk7Ci0JCSp2bGFuX3RjaSB8PSBwa3RfZGV2LT52bGFuX3AgPDwgNTsKLQkJKnZsYW5fdGNpIHw9IHBrdF9kZXYtPnZsYW5fY2ZpIDw8IDQ7CisJCSp2bGFuX3RjaSA9IGJ1aWxkX3RjaShwa3RfZGV2LT52bGFuX2lkLAorCQkJCSAgICAgIHBrdF9kZXYtPnZsYW5fY2ZpLAorCQkJCSAgICAgIHBrdF9kZXYtPnZsYW5fcCk7CiAJCXZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7CiAJCSp2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOwogCX0KQEAgLTIzNzEsNyArMjM3Myw3IEBACiAJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAKIAltZW1jcHkoZXRoLCBwa3RfZGV2LT5oaCwgMTIpOwotCSoodTE2ICopICYgZXRoWzEyXSA9IHByb3RvY29sOworCSooX19iZTE2ICopICYgZXRoWzEyXSA9IHByb3RvY29sOwogCiAJLyogRXRoICsgSVBoICsgVURQaCArIG1wbHMgKi8KIAlkYXRhbGVuID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplIC0gMTQgLSAyMCAtIDggLQpAQCAtMjQ5MSw3ICsyNDkzLDcgQEAKIAljaGFyIHN1ZmZpeFsxNl07CiAJdW5zaWduZWQgaW50IHByZWZpeGxlbiA9IDA7CiAJdW5zaWduZWQgaW50IHN1ZmZpeGxlbiA9IDA7Ci0JX191MzIgdG1wOworCV9fYmUzMiB0bXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJaXBbaV0gPSAwOwpAQCAtMjY4OSwxNiArMjY5MSwxNiBAQAogCWlmIChwa3RfZGV2LT52bGFuX2lkICE9IDB4ZmZmZikgewogCQlpZihwa3RfZGV2LT5zdmxhbl9pZCAhPSAweGZmZmYpIHsKIAkJCXN2bGFuX3RjaSA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwotCQkJKnN2bGFuX3RjaSA9IGh0b25zKHBrdF9kZXYtPnN2bGFuX2lkKTsKLQkJCSpzdmxhbl90Y2kgfD0gcGt0X2Rldi0+c3ZsYW5fcCA8PCA1OwotCQkJKnN2bGFuX3RjaSB8PSBwa3RfZGV2LT5zdmxhbl9jZmkgPDwgNDsKKwkJCSpzdmxhbl90Y2kgPSBidWlsZF90Y2kocGt0X2Rldi0+c3ZsYW5faWQsCisJCQkJCSAgICAgICBwa3RfZGV2LT5zdmxhbl9jZmksCisJCQkJCSAgICAgICBwa3RfZGV2LT5zdmxhbl9wKTsKIAkJCXN2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwogCQkJKnN2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpOwogCQl9CiAJCXZsYW5fdGNpID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7Ci0JCSp2bGFuX3RjaSA9IGh0b25zKHBrdF9kZXYtPnZsYW5faWQpOwotCQkqdmxhbl90Y2kgfD0gcGt0X2Rldi0+dmxhbl9wIDw8IDU7Ci0JCSp2bGFuX3RjaSB8PSBwa3RfZGV2LT52bGFuX2NmaSA8PCA0OworCQkqdmxhbl90Y2kgPSBidWlsZF90Y2kocGt0X2Rldi0+dmxhbl9pZCwKKwkJCQkgICAgICBwa3RfZGV2LT52bGFuX2NmaSwKKwkJCQkgICAgICBwa3RfZGV2LT52bGFuX3ApOwogCQl2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwogCQkqdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOwogCX0KQEAgLTI3MDcsNyArMjcwOSw3IEBACiAJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAKIAltZW1jcHkoZXRoLCBwa3RfZGV2LT5oaCwgMTIpOwotCSoodTE2ICopICYgZXRoWzEyXSA9IHByb3RvY29sOworCSooX19iZTE2ICopICYgZXRoWzEyXSA9IHByb3RvY29sOwogCiAJLyogRXRoICsgSVBoICsgVURQaCArIG1wbHMgKi8KIAlkYXRhbGVuID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplIC0gMTQgLQpAQCAtMjcyNiwxMSArMjcyOCwxMSBAQAogCXVkcGgtPmxlbiA9IGh0b25zKGRhdGFsZW4gKyBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwogCXVkcGgtPmNoZWNrID0gMDsJLyogTm8gY2hlY2tzdW0gKi8KIAotCSoodTMyICopIGlwaCA9IF9fY29uc3RhbnRfaHRvbmwoMHg2MDAwMDAwMCk7CS8qIFZlcnNpb24gKyBmbG93ICovCisJKihfX2JlMzIgKikgaXBoID0gX19jb25zdGFudF9odG9ubCgweDYwMDAwMDAwKTsJLyogVmVyc2lvbiArIGZsb3cgKi8KIAogCWlmIChwa3RfZGV2LT50cmFmZmljX2NsYXNzKSB7CiAJCS8qIFZlcnNpb24gKyB0cmFmZmljIGNsYXNzICsgZmxvdyAoMCkgKi8KLQkJKih1MzIgKilpcGggfD0gaHRvbmwoMHg2MDAwMDAwMCB8IChwa3RfZGV2LT50cmFmZmljX2NsYXNzIDw8IDIwKSk7CisJCSooX19iZTMyICopaXBoIHw9IGh0b25sKDB4NjAwMDAwMDAgfCAocGt0X2Rldi0+dHJhZmZpY19jbGFzcyA8PCAyMCkpOwogCX0KIAogCWlwaC0+aG9wX2xpbWl0ID0gMzI7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9yZXF1ZXN0X3NvY2suYyBiL25ldC9jb3JlL3JlcXVlc3Rfc29jay5jCmluZGV4IDc5ZWJkNzUuLjVmMDgxOGQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3JlcXVlc3Rfc29jay5jCisrKyBiL25ldC9jb3JlL3JlcXVlc3Rfc29jay5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgPG5ldC9yZXF1ZXN0X3NvY2suaD4KIApAQCAtMjksMjIgKzMwLDMxIEBACiAgKiBpdCBpcyBhYnNvbHV0ZWx5IG5vdCBlbm91Z2ggZXZlbiBhdCAxMDBjb25uL3NlYy4gMjU2IGN1cmVzIG1vc3QKICAqIG9mIHByb2JsZW1zLiBUaGlzIHZhbHVlIGlzIGFkanVzdGVkIHRvIDEyOCBmb3IgdmVyeSBzbWFsbCBtYWNoaW5lcwogICogKDw9MzJNYiBvZiBtZW1vcnkpIGFuZCB0byAxMDI0IG9uIG5vcm1hbCBvciBiZXR0ZXIgb25lcyAoPj0yNTZNYikuCi0gKiBGdXJ0aGVyIGluY3JlYXNpbmcgcmVxdWlyZXMgdG8gY2hhbmdlIGhhc2ggdGFibGUgc2l6ZS4KKyAqIE5vdGUgOiBEb250IGZvcmdldCBzb21heGNvbm4gdGhhdCBtYXkgbGltaXQgYmFja2xvZyB0b28uCiAgKi8KIGludCBzeXNjdGxfbWF4X3N5bl9iYWNrbG9nID0gMjU2OwogCiBpbnQgcmVxc2tfcXVldWVfYWxsb2Moc3RydWN0IHJlcXVlc3Rfc29ja19xdWV1ZSAqcXVldWUsCi0JCSAgICAgIGNvbnN0IGludCBucl90YWJsZV9lbnRyaWVzKQorCQkgICAgICB1bnNpZ25lZCBpbnQgbnJfdGFibGVfZW50cmllcykKIHsKLQljb25zdCBpbnQgbG9wdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsaXN0ZW5fc29jaykgKwotCQkJICAgICAgbnJfdGFibGVfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgcmVxdWVzdF9zb2NrICopOwotCXN0cnVjdCBsaXN0ZW5fc29jayAqbG9wdCA9IGt6YWxsb2MobG9wdF9zaXplLCBHRlBfS0VSTkVMKTsKKwlzaXplX3QgbG9wdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsaXN0ZW5fc29jayk7CisJc3RydWN0IGxpc3Rlbl9zb2NrICpsb3B0OwogCisJbnJfdGFibGVfZW50cmllcyA9IG1pbl90KHUzMiwgbnJfdGFibGVfZW50cmllcywgc3lzY3RsX21heF9zeW5fYmFja2xvZyk7CisJbnJfdGFibGVfZW50cmllcyA9IG1heF90KHUzMiwgbnJfdGFibGVfZW50cmllcywgOCk7CisJbnJfdGFibGVfZW50cmllcyA9IHJvdW5kdXBfcG93X29mX3R3byhucl90YWJsZV9lbnRyaWVzICsgMSk7CisJbG9wdF9zaXplICs9IG5yX3RhYmxlX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IHJlcXVlc3Rfc29jayAqKTsKKwlpZiAobG9wdF9zaXplID4gUEFHRV9TSVpFKQorCQlsb3B0ID0gX192bWFsbG9jKGxvcHRfc2l6ZSwKKwkJCUdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNIHwgX19HRlBfWkVSTywKKwkJCVBBR0VfS0VSTkVMKTsKKwllbHNlCisJCWxvcHQgPSBremFsbG9jKGxvcHRfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGxvcHQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKGxvcHQtPm1heF9xbGVuX2xvZyA9IDY7Ci0JICAgICAoMSA8PCBsb3B0LT5tYXhfcWxlbl9sb2cpIDwgc3lzY3RsX21heF9zeW5fYmFja2xvZzsKKwlmb3IgKGxvcHQtPm1heF9xbGVuX2xvZyA9IDM7CisJICAgICAoMSA8PCBsb3B0LT5tYXhfcWxlbl9sb2cpIDwgbnJfdGFibGVfZW50cmllczsKIAkgICAgIGxvcHQtPm1heF9xbGVuX2xvZysrKTsKIAogCWdldF9yYW5kb21fYnl0ZXMoJmxvcHQtPmhhc2hfcm5kLCBzaXplb2YobG9wdC0+aGFzaF9ybmQpKTsKQEAgLTY1LDkgKzc1LDExIEBACiB7CiAJLyogbWFrZSBhbGwgdGhlIGxpc3Rlbl9vcHQgbG9jYWwgdG8gdXMgKi8KIAlzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQgPSByZXFza19xdWV1ZV95YW5rX2xpc3Rlbl9zayhxdWV1ZSk7CisJc2l6ZV90IGxvcHRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbGlzdGVuX3NvY2spICsKKwkJbG9wdC0+bnJfdGFibGVfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgcmVxdWVzdF9zb2NrICopOwogCiAJaWYgKGxvcHQtPnFsZW4gIT0gMCkgewotCQlpbnQgaTsKKwkJdW5zaWduZWQgaW50IGk7CiAKIAkJZm9yIChpID0gMDsgaSA8IGxvcHQtPm5yX3RhYmxlX2VudHJpZXM7IGkrKykgewogCQkJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOwpAQCAtODEsNyArOTMsMTAgQEAKIAl9CiAKIAlCVUdfVFJBUChsb3B0LT5xbGVuID09IDApOwotCWtmcmVlKGxvcHQpOworCWlmIChsb3B0X3NpemUgPiBQQUdFX1NJWkUpCisJCXZmcmVlKGxvcHQpOworCWVsc2UKKwkJa2ZyZWUobG9wdCk7CiB9CiAKIEVYUE9SVF9TWU1CT0wocmVxc2tfcXVldWVfZGVzdHJveSk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IDAyZjNjNzkuLmU3NjUzOWEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC0xMDgsNyArMTA4LDYgQEAKIAlbUlRNX0ZBTShSVE1fTkVXVENMQVNTKV0gICAgPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB0Y21zZykpLAogCVtSVE1fRkFNKFJUTV9ORVdURklMVEVSKV0gICA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjbXNnKSksCiAJW1JUTV9GQU0oUlRNX05FV0FDVElPTildICAgID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgdGNhbXNnKSksCi0JW1JUTV9GQU0oUlRNX05FV1BSRUZJWCldICAgID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpKSwKIAlbUlRNX0ZBTShSVE1fR0VUTVVMVElDQVNUKV0gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBydGdlbm1zZykpLAogCVtSVE1fRkFNKFJUTV9HRVRBTllDQVNUKV0gICA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IHJ0Z2VubXNnKSksCiB9OwpAQCAtMjEzLDYgKzIxMiwyNiBAQAogCXJldHVybiBubGFfbmVzdF9jYW5jZWwoc2tiLCBteCk7CiB9CiAKK2ludCBydG5sX3B1dF9jYWNoZWluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgaWQsCisJCSAgICAgICB1MzIgdHMsIHUzMiB0c2FnZSwgbG9uZyBleHBpcmVzLCB1MzIgZXJyb3IpCit7CisJc3RydWN0IHJ0YV9jYWNoZWluZm8gY2kgPSB7CisJCS5ydGFfbGFzdHVzZSA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gZHN0LT5sYXN0dXNlKSwKKwkJLnJ0YV91c2VkID0gZHN0LT5fX3VzZSwKKwkJLnJ0YV9jbG50cmVmID0gYXRvbWljX3JlYWQoJihkc3QtPl9fcmVmY250KSksCisJCS5ydGFfZXJyb3IgPSBlcnJvciwKKwkJLnJ0YV9pZCA9ICBpZCwKKwkJLnJ0YV90cyA9IHRzLAorCQkucnRhX3RzYWdlID0gdHNhZ2UsCisJfTsKKworCWlmIChleHBpcmVzKQorCQljaS5ydGFfZXhwaXJlcyA9IGppZmZpZXNfdG9fY2xvY2tfdChleHBpcmVzKTsKKworCXJldHVybiBubGFfcHV0KHNrYiwgUlRBX0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocnRubF9wdXRfY2FjaGVpbmZvKTsKIAogc3RhdGljIHZvaWQgc2V0X29wZXJzdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIHRyYW5zaXRpb24pCiB7CkBAIC0yNzMsNiArMjkyLDI1IEBACiAJYS0+dHhfY29tcHJlc3NlZCA9IGItPnR4X2NvbXByZXNzZWQ7CiB9OwogCitzdGF0aWMgaW5saW5lIHNpemVfdCBpZl9ubG1zZ19zaXplKGludCBpd2J1ZmxlbikKK3sKKwlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKQorCSAgICAgICArIG5sYV90b3RhbF9zaXplKElGTkFNU0laKSAvKiBJRkxBX0lGTkFNRSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKElGTkFNU0laKSAvKiBJRkxBX1FESVNDICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBydG5sX2xpbmtfaWZtYXApKQorCSAgICAgICArIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgcnRubF9saW5rX3N0YXRzKSkKKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShNQVhfQUREUl9MRU4pIC8qIElGTEFfQUREUkVTUyAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKE1BWF9BRERSX0xFTikgLyogSUZMQV9CUk9BRENBU1QgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX1RYUUxFTiAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfV0VJR0hUICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZMQV9NVFUgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX0xJTksgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX01BU1RFUiAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDEpIC8qIElGTEFfT1BFUlNUQVRFICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMSkgLyogSUZMQV9MSU5LTU9ERSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKGl3YnVmbGVuKTsKK30KKwogc3RhdGljIGludCBydG5sX2ZpbGxfaWZpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgdm9pZCAqaXdidWYsIGludCBpd2J1ZmxlbiwgaW50IHR5cGUsIHUzMiBwaWQsCiAJCQkgICAgdTMyIHNlcSwgdTMyIGNoYW5nZSwgdW5zaWduZWQgaW50IGZsYWdzKQpAQCAtNTU4LDcgKzU5Niw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAJY2hhciAqaXdfYnVmID0gTlVMTCwgKml3ID0gTlVMTDsKIAlpbnQgaXdfYnVmX2xlbiA9IDA7Ci0JaW50IGVyciwgcGF5bG9hZDsKKwlpbnQgZXJyOwogCiAJZXJyID0gbmxtc2dfcGFyc2UobmxoLCBzaXplb2YoKmlmbSksIHRiLCBJRkxBX01BWCwgaWZsYV9wb2xpY3kpOwogCWlmIChlcnIgPCAwKQpAQCAtNTg3LDkgKzYyNSw3IEBACiAJfQogI2VuZGlmCS8qIENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LICovCiAKLQlwYXlsb2FkID0gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpICsKLQkJCSAgICAgIG5sYV90b3RhbF9zaXplKGl3X2J1Zl9sZW4pKTsKLQluc2tiID0gbmxtc2dfbmV3KG5sbXNnX3RvdGFsX3NpemUocGF5bG9hZCksIEdGUF9LRVJORUwpOworCW5za2IgPSBubG1zZ19uZXcoaWZfbmxtc2dfc2l6ZShpd19idWZfbGVuKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5za2IgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PQlVGUzsKIAkJZ290byBlcnJvdXQ7CkBAIC01OTcsMTAgKzYzMyw4IEBACiAKIAllcnIgPSBydG5sX2ZpbGxfaWZpbmZvKG5za2IsIGRldiwgaXcsIGl3X2J1Zl9sZW4sIFJUTV9ORVdMSU5LLAogCQkJICAgICAgIE5FVExJTktfQ0Ioc2tiKS5waWQsIG5saC0+bmxtc2dfc2VxLCAwLCAwKTsKLQlpZiAoZXJyIDw9IDApIHsKLQkJa2ZyZWVfc2tiKG5za2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBpbGllcyBCVUcgaW4gaWZfbmxtc2dfc2l6ZSBvciB3aXJlbGVzc19ydG5ldGxpbmtfZ2V0ICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF91bmljYXN0KG5za2IsIE5FVExJTktfQ0Ioc2tiKS5waWQpOwogZXJyb3V0OgpAQCAtNjM5LDE1ICs2NzMsMTMgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAotCXNrYiA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CisJc2tiID0gbmxtc2dfbmV3KGlmX25sbXNnX3NpemUoMCksIEdGUF9LRVJORUwpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBydG5sX2ZpbGxfaWZpbmZvKHNrYiwgZGV2LCBOVUxMLCAwLCB0eXBlLCAwLCAwLCBjaGFuZ2UsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpZl9ubG1zZ19zaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfTElOSywgTlVMTCwgR0ZQX0tFUk5FTCk7CiBlcnJvdXQ6CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDNjMjM3NjAuLmRlNzgwMWQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC01Niw3ICs1Niw2IEBACiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgpAQCAtNjcsOCArNjYsMTAgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqc2tidWZmX2hlYWRfY2FjaGUgX19yZWFkX21vc3RseTsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnNrYnVmZl9mY2xvbmVfY2FjaGUgX19yZWFkX21vc3RseTsKKyNpbmNsdWRlICJrbWFwX3NrYi5oIgorCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNrYnVmZl9oZWFkX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNrYnVmZl9mY2xvbmVfY2FjaGUgX19yZWFkX21vc3RseTsKIAogLyoKICAqCUtlZXAgb3V0LW9mLWxpbmUgdG8gcHJldmVudCBrZXJuZWwgYmxvYXQuCkBAIC0xMzEsNiArMTMyLDcgQEAKICAqCUBnZnBfbWFzazogYWxsb2NhdGlvbiBtYXNrCiAgKglAZmNsb25lOiBhbGxvY2F0ZSBmcm9tIGZjbG9uZSBjYWNoZSBpbnN0ZWFkIG9mIGhlYWQgY2FjaGUKICAqCQlhbmQgYWxsb2NhdGUgYSBjbG9uZWQgKGNoaWxkKSBza2IKKyAqCUBub2RlOiBudW1hIG5vZGUgdG8gYWxsb2NhdGUgbWVtb3J5IG9uCiAgKgogICoJQWxsb2NhdGUgYSBuZXcgJnNrX2J1ZmYuIFRoZSByZXR1cm5lZCBidWZmZXIgaGFzIG5vIGhlYWRyb29tIGFuZCBhCiAgKgl0YWlsIHJvb20gb2Ygc2l6ZSBieXRlcy4gVGhlIG9iamVjdCBoYXMgYSByZWZlcmVuY2UgY291bnQgb2Ygb25lLgpAQCAtMTQwLDkgKzE0Miw5IEBACiAgKgklR0ZQX0FUT01JQy4KICAqLwogc3RydWN0IHNrX2J1ZmYgKl9fYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCBnZnBfdCBnZnBfbWFzaywKLQkJCSAgICBpbnQgZmNsb25lKQorCQkJICAgIGludCBmY2xvbmUsIGludCBub2RlKQogewotCWttZW1fY2FjaGVfdCAqY2FjaGU7CisJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlOwogCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNoaW5mbzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXU4ICpkYXRhOwpAQCAtMTUwLDE0ICsxNTIsMTQgQEAKIAljYWNoZSA9IGZjbG9uZSA/IHNrYnVmZl9mY2xvbmVfY2FjaGUgOiBza2J1ZmZfaGVhZF9jYWNoZTsKIAogCS8qIEdldCB0aGUgSEVBRCAqLwotCXNrYiA9IGttZW1fY2FjaGVfYWxsb2MoY2FjaGUsIGdmcF9tYXNrICYgfl9fR0ZQX0RNQSk7CisJc2tiID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNhY2hlLCBnZnBfbWFzayAmIH5fX0dGUF9ETUEsIG5vZGUpOwogCWlmICghc2tiKQogCQlnb3RvIG91dDsKIAogCS8qIEdldCB0aGUgREFUQS4gU2l6ZSBtdXN0IG1hdGNoIHNrYl9hZGRfbXR1KCkuICovCiAJc2l6ZSA9IFNLQl9EQVRBX0FMSUdOKHNpemUpOwotCWRhdGEgPSBrbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplICsgc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pLAotCQkJZ2ZwX21hc2spOworCWRhdGEgPSBrbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyKHNpemUgKyBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbyksCisJCQlnZnBfbWFzaywgbm9kZSk7CiAJaWYgKCFkYXRhKQogCQlnb3RvIG5vZGF0YTsKIApAQCAtMjA5LDcgKzIxMSw3IEBACiAgKglCdWZmZXJzIG1heSBvbmx5IGJlIGFsbG9jYXRlZCBmcm9tIGludGVycnVwdHMgdXNpbmcgYSBAZ2ZwX21hc2sgb2YKICAqCSVHRlBfQVRPTUlDLgogICovCi1zdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiX2Zyb21fY2FjaGUoa21lbV9jYWNoZV90ICpjcCwKK3N0cnVjdCBza19idWZmICphbGxvY19za2JfZnJvbV9jYWNoZShzdHJ1Y3Qga21lbV9jYWNoZSAqY3AsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCQkgICAgIGdmcF90IGdmcF9tYXNrKQogewpAQCAtMjY2LDkgKzI2OCwxMCBAQAogc3RydWN0IHNrX2J1ZmYgKl9fbmV0ZGV2X2FsbG9jX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQl1bnNpZ25lZCBpbnQgbGVuZ3RoLCBnZnBfdCBnZnBfbWFzaykKIHsKKwlpbnQgbm9kZSA9IGRldi0+Y2xhc3NfZGV2LmRldiA/IGRldl90b19ub2RlKGRldi0+Y2xhc3NfZGV2LmRldikgOiAtMTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0Jc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCArIE5FVF9TS0JfUEFELCBnZnBfbWFzayk7CisgCXNrYiA9IF9fYWxsb2Nfc2tiKGxlbmd0aCArIE5FVF9TS0JfUEFELCBnZnBfbWFzaywgMCwgbm9kZSk7CiAJaWYgKGxpa2VseShza2IpKSB7CiAJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX1NLQl9QQUQpOwogCQlza2ItPmRldiA9IGRldjsKQEAgLTQ3Myw4ICs0NzYsOCBAQAogI2VuZGlmCiAJQyhwcm90b2NvbCk7CiAJbi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisJQyhtYXJrKTsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JQyhuZm1hcmspOwogCUMobmZjdCk7CiAJbmZfY29ubnRyYWNrX2dldChza2ItPm5mY3QpOwogCUMobmZjdGluZm8pOwpAQCAtNTM0LDggKzUzNyw4IEBACiAJbmV3LT5wa3RfdHlwZQk9IG9sZC0+cGt0X3R5cGU7CiAJbmV3LT50c3RhbXAJPSBvbGQtPnRzdGFtcDsKIAluZXctPmRlc3RydWN0b3IgPSBOVUxMOworCW5ldy0+bWFyawk9IG9sZC0+bWFyazsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JbmV3LT5uZm1hcmsJPSBvbGQtPm5mbWFyazsKIAluZXctPm5mY3QJPSBvbGQtPm5mY3Q7CiAJbmZfY29ubnRyYWNrX2dldChvbGQtPm5mY3QpOwogCW5ldy0+bmZjdGluZm8JPSBvbGQtPm5mY3RpbmZvOwpAQCAtNjM5LDYgKzY0Miw3IEBACiAJbi0+Y3N1bQkgICAgID0gc2tiLT5jc3VtOwogCW4tPmlwX3N1bW1lZCA9IHNrYi0+aXBfc3VtbWVkOwogCisJbi0+dHJ1ZXNpemUgKz0gc2tiLT5kYXRhX2xlbjsKIAluLT5kYXRhX2xlbiAgPSBza2ItPmRhdGFfbGVuOwogCW4tPmxlbgkgICAgID0gc2tiLT5sZW47CiAKQEAgLTEyMzksOCArMTI0Myw4IEBACiAKIC8qIENoZWNrc3VtIHNrYiBkYXRhLiAqLwogCi11bnNpZ25lZCBpbnQgc2tiX2NoZWNrc3VtKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCi0JCQkgIGludCBsZW4sIHVuc2lnbmVkIGludCBjc3VtKQorX193c3VtIHNrYl9jaGVja3N1bShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAorCQkJICBpbnQgbGVuLCBfX3dzdW0gY3N1bSkKIHsKIAlpbnQgc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOwogCWludCBpLCBjb3B5ID0gc3RhcnQgLSBvZmZzZXQ7CkBAIC0xMjY0LDcgKzEyNjgsNyBAQAogCiAJCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwogCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgewotCQkJdW5zaWduZWQgaW50IGNzdW0yOworCQkJX193c3VtIGNzdW0yOwogCQkJdTggKnZhZGRyOwogCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCkBAIC0xMjkzLDcgKzEyOTcsNyBAQAogCiAJCQllbmQgPSBzdGFydCArIGxpc3QtPmxlbjsKIAkJCWlmICgoY29weSA9IGVuZCAtIG9mZnNldCkgPiAwKSB7Ci0JCQkJdW5zaWduZWQgaW50IGNzdW0yOworCQkJCV9fd3N1bSBjc3VtMjsKIAkJCQlpZiAoY29weSA+IGxlbikKIAkJCQkJY29weSA9IGxlbjsKIAkJCQljc3VtMiA9IHNrYl9jaGVja3N1bShsaXN0LCBvZmZzZXQgLSBzdGFydCwKQEAgLTEzMTQsOCArMTMxOCw4IEBACiAKIC8qIEJvdGggb2YgYWJvdmUgaW4gb25lIGJvdHRsZS4gKi8KIAotdW5zaWduZWQgaW50IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKLQkJCQkgICAgdTggKnRvLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgY3N1bSkKK19fd3N1bSBza2JfY29weV9hbmRfY3N1bV9iaXRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCisJCQkJICAgIHU4ICp0bywgaW50IGxlbiwgX193c3VtIGNzdW0pCiB7CiAJaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKIAlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OwpAQCAtMTM0MSw3ICsxMzQ1LDcgQEAKIAogCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKIAkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKLQkJCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJCV9fd3N1bSBjc3VtMjsKIAkJCXU4ICp2YWRkcjsKIAkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKIApAQCAtMTM2Nyw3ICsxMzcxLDcgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKIAogCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCXVuc2lnbmVkIGludCBjc3VtMjsKKwkJCV9fd3N1bSBjc3VtMjsKIAkJCWludCBlbmQ7CiAKIAkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7CkBAIC0xMzk1LDcgKzEzOTksNyBAQAogCiB2b2lkIHNrYl9jb3B5X2FuZF9jc3VtX2Rldihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqdG8pCiB7Ci0JdW5zaWduZWQgaW50IGNzdW07CisJX193c3VtIGNzdW07CiAJbG9uZyBjc3N0YXJ0OwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCkBAIC0xNDEzLDkgKzE0MTcsOSBAQAogCQkJCQkgICAgICBza2ItPmxlbiAtIGNzc3RhcnQsIDApOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJbG9uZyBjc3N0dWZmID0gY3NzdGFydCArIHNrYi0+Y3N1bTsKKwkJbG9uZyBjc3N0dWZmID0gY3NzdGFydCArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAKLQkJKigodW5zaWduZWQgc2hvcnQgKikodG8gKyBjc3N0dWZmKSkgPSBjc3VtX2ZvbGQoY3N1bSk7CisJCSooKF9fc3VtMTYgKikodG8gKyBjc3N0dWZmKSkgPSBjc3VtX2ZvbGQoY3N1bSk7CiAJfQogfQogCkBAIC0xOTQ2LDcgKzE5NTAsNyBAQAogCWRvIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAJCXNrYl9mcmFnX3QgKmZyYWc7Ci0JCWludCBoc2l6ZSwgbnNpemU7CisJCWludCBoc2l6ZTsKIAkJaW50IGs7CiAJCWludCBzaXplOwogCkBAIC0xOTU3LDExICsxOTYxLDEwIEBACiAJCWhzaXplID0gc2tiX2hlYWRsZW4oc2tiKSAtIG9mZnNldDsKIAkJaWYgKGhzaXplIDwgMCkKIAkJCWhzaXplID0gMDsKLQkJbnNpemUgPSBoc2l6ZSArIGRvZmZzZXQ7Ci0JCWlmIChuc2l6ZSA+IGxlbiArIGRvZmZzZXQgfHwgIXNnKQotCQkJbnNpemUgPSBsZW4gKyBkb2Zmc2V0OworCQlpZiAoaHNpemUgPiBsZW4gfHwgIXNnKQorCQkJaHNpemUgPSBsZW47CiAKLQkJbnNrYiA9IGFsbG9jX3NrYihuc2l6ZSArIGhlYWRyb29tLCBHRlBfQVRPTUlDKTsKKwkJbnNrYiA9IGFsbG9jX3NrYihoc2l6ZSArIGRvZmZzZXQgKyBoZWFkcm9vbSwgR0ZQX0FUT01JQyk7CiAJCWlmICh1bmxpa2VseSghbnNrYikpCiAJCQlnb3RvIGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29jay5jIGIvbmV0L2NvcmUvc29jay5jCmluZGV4IGI3N2UxNTUuLjBlZDViNGYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NvY2suYworKysgYi9uZXQvY29yZS9zb2NrLmMKQEAgLTExMSw2ICsxMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0yNzAsNyArMjcxLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woc29ja19xdWV1ZV9yY3Zfc2tiKTsKIAotaW50IHNrX3JlY2VpdmVfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBza19yZWNlaXZlX3NrYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGludCBuZXN0ZWQpCiB7CiAJaW50IHJjID0gTkVUX1JYX1NVQ0NFU1M7CiAKQEAgLTI3OSw3ICsyODAsMTAgQEAKIAogCXNrYi0+ZGV2ID0gTlVMTDsKIAotCWJoX2xvY2tfc29jayhzayk7CisJaWYgKG5lc3RlZCkKKwkJYmhfbG9ja19zb2NrX25lc3RlZChzayk7CisJZWxzZQorCQliaF9sb2NrX3NvY2soc2spOwogCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSkgewogCQkvKgogCQkgKiB0cnlsb2NrICsgdW5sb2NrIHNlbWFudGljczoKQEAgLTgwNiwyNCArODEwLDExIEBACiAgKi8KIHN0YXRpYyB2b2lkIGlubGluZSBzb2NrX2xvY2tfaW5pdChzdHJ1Y3Qgc29jayAqc2spCiB7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNrLT5za19sb2NrLnNsb2NrKTsKLQlzay0+c2tfbG9jay5vd25lciA9IE5VTEw7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmc2stPnNrX2xvY2sud3EpOwotCS8qCi0JICogTWFrZSBzdXJlIHdlIGFyZSBub3QgcmVpbml0aWFsaXppbmcgYSBoZWxkIGxvY2s6Ci0JICovCi0JZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQoKHZvaWQgKikmc2stPnNrX2xvY2ssIHNpemVvZihzay0+c2tfbG9jaykpOwotCi0JLyoKLQkgKiBNYXJrIGJvdGggdGhlIHNrX2xvY2sgYW5kIHRoZSBza19sb2NrLnNsb2NrIGFzIGEKLQkgKiBwZXItYWRkcmVzcy1mYW1pbHkgbG9jayBjbGFzczoKLQkgKi8KLQlsb2NrZGVwX3NldF9jbGFzc19hbmRfbmFtZSgmc2stPnNrX2xvY2suc2xvY2ssCi0JCQkJICAgYWZfZmFtaWx5X3Nsb2NrX2tleXMgKyBzay0+c2tfZmFtaWx5LAotCQkJCSAgIGFmX2ZhbWlseV9zbG9ja19rZXlfc3RyaW5nc1tzay0+c2tfZmFtaWx5XSk7Ci0JbG9ja2RlcF9pbml0X21hcCgmc2stPnNrX2xvY2suZGVwX21hcCwKLQkJCSBhZl9mYW1pbHlfa2V5X3N0cmluZ3Nbc2stPnNrX2ZhbWlseV0sCi0JCQkgYWZfZmFtaWx5X2tleXMgKyBzay0+c2tfZmFtaWx5KTsKKwlzb2NrX2xvY2tfaW5pdF9jbGFzc19hbmRfbmFtZShzaywKKwkJCWFmX2ZhbWlseV9zbG9ja19rZXlfc3RyaW5nc1tzay0+c2tfZmFtaWx5XSwKKwkJCWFmX2ZhbWlseV9zbG9ja19rZXlzICsgc2stPnNrX2ZhbWlseSwKKwkJCWFmX2ZhbWlseV9rZXlfc3RyaW5nc1tzay0+c2tfZmFtaWx5XSwKKwkJCWFmX2ZhbWlseV9rZXlzICsgc2stPnNrX2ZhbWlseSk7CiB9CiAKIC8qKgpAQCAtODM3LDcgKzgyOCw3IEBACiAJCSAgICAgIHN0cnVjdCBwcm90byAqcHJvdCwgaW50IHplcm9faXQpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKLQlrbWVtX2NhY2hlX3QgKnNsYWIgPSBwcm90LT5zbGFiOworCXN0cnVjdCBrbWVtX2NhY2hlICpzbGFiID0gcHJvdC0+c2xhYjsKIAogCWlmIChzbGFiICE9IE5VTEwpCiAJCXNrID0ga21lbV9jYWNoZV9hbGxvYyhzbGFiLCBwcmlvcml0eSk7CkBAIC0xMTYwLDcgKzExNTEsNyBAQAogCQkJZ290byBmYWlsdXJlOwogCiAJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpIDwgc2stPnNrX3NuZGJ1ZikgewotCQkJc2tiID0gYWxsb2Nfc2tiKGhlYWRlcl9sZW4sIHNrLT5za19hbGxvY2F0aW9uKTsKKwkJCXNrYiA9IGFsbG9jX3NrYihoZWFkZXJfbGVuLCBnZnBfbWFzayk7CiAJCQlpZiAoc2tiKSB7CiAJCQkJaW50IG5wYWdlczsKIAkJCQlpbnQgaTsKQEAgLTE1MjcsNyArMTUxOCw3IEBACiAJYXRvbWljX3NldCgmc2stPnNrX3JlZmNudCwgMSk7CiB9CiAKLXZvaWQgZmFzdGNhbGwgbG9ja19zb2NrKHN0cnVjdCBzb2NrICpzaykKK3ZvaWQgZmFzdGNhbGwgbG9ja19zb2NrX25lc3RlZChzdHJ1Y3Qgc29jayAqc2ssIGludCBzdWJjbGFzcykKIHsKIAltaWdodF9zbGVlcCgpOwogCXNwaW5fbG9ja19iaCgmc2stPnNrX2xvY2suc2xvY2spOwpAQCAtMTUzOCwxMSArMTUyOSwxMSBAQAogCS8qCiAJICogVGhlIHNrX2xvY2sgaGFzIG11dGV4X2xvY2soKSBzZW1hbnRpY3MgaGVyZToKIAkgKi8KLQltdXRleF9hY3F1aXJlKCZzay0+c2tfbG9jay5kZXBfbWFwLCAwLCAwLCBfUkVUX0lQXyk7CisJbXV0ZXhfYWNxdWlyZSgmc2stPnNrX2xvY2suZGVwX21hcCwgc3ViY2xhc3MsIDAsIF9SRVRfSVBfKTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIH0KIAotRVhQT1JUX1NZTUJPTChsb2NrX3NvY2spOworRVhQT1JUX1NZTUJPTChsb2NrX3NvY2tfbmVzdGVkKTsKIAogdm9pZCBmYXN0Y2FsbCByZWxlYXNlX3NvY2soc3RydWN0IHNvY2sgKnNrKQogewpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMgYi9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYwppbmRleCAwMjUzNDEzLi4xZTc1YjE1IDEwMDY0NAotLS0gYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYworKysgYi9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYwpAQCAtMjEsMTAgKzIxLDYgQEAKIAogZXh0ZXJuIGludCBzeXNjdGxfY29yZV9kZXN0cm95X2RlbGF5OwogCi0jaWZkZWYgQ09ORklHX05FVF9ESVZFUlQKLWV4dGVybiBjaGFyIHN5c2N0bF9kaXZlcnRfdmVyc2lvbltdOwotI2VuZGlmIC8qIENPTkZJR19ORVRfRElWRVJUICovCi0KICNpZmRlZiBDT05GSUdfWEZSTQogZXh0ZXJuIHUzMiBzeXNjdGxfeGZybV9hZXZlbnRfZXRpbWU7CiBleHRlcm4gdTMyIHN5c2N0bF94ZnJtX2FldmVudF9yc2VxdGg7CkBAIC0xMDUsMTYgKzEwMSw2IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwogCX0sCi0jaWZkZWYgQ09ORklHX05FVF9ESVZFUlQKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9DT1JFX0RJVkVSVF9WRVJTSU9OLAotCQkucHJvY25hbWUJPSAiZGl2ZXJ0X3ZlcnNpb24iLAotCQkuZGF0YQkJPSAodm9pZCAqKXN5c2N0bF9kaXZlcnRfdmVyc2lvbiwKLQkJLm1heGxlbgkJPSAzMiwKLQkJLm1vZGUJCT0gMDQ0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2Rvc3RyaW5nCi0JfSwKLSNlbmRpZiAvKiBDT05GSUdfTkVUX0RJVkVSVCAqLwogI2lmZGVmIENPTkZJR19YRlJNCiAJewogCQkuY3RsX25hbWUJPSBORVRfQ09SRV9BRVZFTlRfRVRJTUUsCmRpZmYgLS1naXQgYS9uZXQvY29yZS91dGlscy5jIGIvbmV0L2NvcmUvdXRpbHMuYwppbmRleCA5NGM1ZDc2Li42MTU1NjA2IDEwMDY0NAotLS0gYS9uZXQvY29yZS91dGlscy5jCisrKyBiL25ldC9jb3JlL3V0aWxzLmMKQEAgLTMwLDExOSArMzAsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0vKgotICBUaGlzIGlzIGEgbWF4aW1hbGx5IGVxdWlkaXN0cmlidXRlZCBjb21iaW5lZCBUYXVzd29ydGhlIGdlbmVyYXRvcgotICBiYXNlZCBvbiBjb2RlIGZyb20gR05VIFNjaWVudGlmaWMgTGlicmFyeSAxLjUgKDMwIEp1biAyMDA0KQotCi0gICB4X24gPSAoczFfbiBeIHMyX24gXiBzM19uKSAKLQotICAgczFfe24rMX0gPSAoKChzMV9uICYgNDI5NDk2NzI5NCkgPDwxMikgXiAoKChzMV9uIDw8MTMpIF4gczFfbikgPj4xOSkpCi0gICBzMl97bisxfSA9ICgoKHMyX24gJiA0Mjk0OTY3Mjg4KSA8PCA0KSBeICgoKHMyX24gPDwgMikgXiBzMl9uKSA+PjI1KSkKLSAgIHMzX3tuKzF9ID0gKCgoczNfbiAmIDQyOTQ5NjcyODApIDw8MTcpIF4gKCgoczNfbiA8PCAzKSBeIHMzX24pID4+MTEpKQotCi0gICBUaGUgcGVyaW9kIG9mIHRoaXMgZ2VuZXJhdG9yIGlzIGFib3V0IDJeODguCi0KLSAgIEZyb206IFAuIEwnRWN1eWVyLCAiTWF4aW1hbGx5IEVxdWlkaXN0cmlidXRlZCBDb21iaW5lZCBUYXVzd29ydGhlCi0gICBHZW5lcmF0b3JzIiwgTWF0aGVtYXRpY3Mgb2YgQ29tcHV0YXRpb24sIDY1LCAyMTMgKDE5OTYpLCAyMDMtLTIxMy4KLQotICAgVGhpcyBpcyBhdmFpbGFibGUgb24gdGhlIG5ldCBmcm9tIEwnRWN1eWVyJ3MgaG9tZSBwYWdlLAotCi0gICBodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvfmxlY3V5ZXIvbXlmdHAvcGFwZXJzL3RhdXNtZS5wcwotICAgZnRwOi8vZnRwLmlyby51bW9udHJlYWwuY2EvcHViL3NpbXVsYXRpb24vbGVjdXllci9wYXBlcnMvdGF1c21lLnBzIAotCi0gICBUaGVyZSBpcyBhbiBlcnJhdHVtIGluIHRoZSBwYXBlciAiVGFibGVzIG9mIE1heGltYWxseQotICAgRXF1aWRpc3RyaWJ1dGVkIENvbWJpbmVkIExGU1IgR2VuZXJhdG9ycyIsIE1hdGhlbWF0aWNzIG9mCi0gICBDb21wdXRhdGlvbiwgNjgsIDIyNSAoMTk5OSksIDI2MS0tMjY5OgotICAgaHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL35sZWN1eWVyL215ZnRwL3BhcGVycy90YXVzbWUyLnBzCi0KLSAgICAgICAgLi4uIHRoZSBrX2ogbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHpfaiBtdXN0IGJlIG5vbi0KLSAgICAgICAgemVybywgZm9yIGVhY2ggai4gKE5vdGU6IHRoaXMgcmVzdHJpY3Rpb24gYWxzbyBhcHBsaWVzIHRvIHRoZSAKLSAgICAgICAgY29tcHV0ZXIgY29kZSBnaXZlbiBpbiBbNF0sIGJ1dCB3YXMgbWlzdGFrZW5seSBub3QgbWVudGlvbmVkIGluCi0gICAgICAgIHRoYXQgcGFwZXIuKQotICAgCi0gICBUaGlzIGFmZmVjdHMgdGhlIHNlZWRpbmcgcHJvY2VkdXJlIGJ5IGltcG9zaW5nIHRoZSByZXF1aXJlbWVudAotICAgczEgPiAxLCBzMiA+IDcsIHMzID4gMTUuCi0KLSovCi1zdHJ1Y3QgbnJuZF9zdGF0ZSB7Ci0JdTMyIHMxLCBzMiwgczM7Ci19OwotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IG5ybmRfc3RhdGUsIG5ldF9yYW5kX3N0YXRlKTsKLQotc3RhdGljIHUzMiBfX25ldF9yYW5kb20oc3RydWN0IG5ybmRfc3RhdGUgKnN0YXRlKQotewotI2RlZmluZSBUQVVTV09SVEhFKHMsYSxiLGMsZCkgKChzJmMpPDxkKSBeICgoKHMgPDxhKSBeIHMpPj5iKQotCi0Jc3RhdGUtPnMxID0gVEFVU1dPUlRIRShzdGF0ZS0+czEsIDEzLCAxOSwgNDI5NDk2NzI5NFVMLCAxMik7Ci0Jc3RhdGUtPnMyID0gVEFVU1dPUlRIRShzdGF0ZS0+czIsIDIsIDI1LCA0Mjk0OTY3Mjg4VUwsIDQpOwotCXN0YXRlLT5zMyA9IFRBVVNXT1JUSEUoc3RhdGUtPnMzLCAzLCAxMSwgNDI5NDk2NzI4MFVMLCAxNyk7Ci0KLQlyZXR1cm4gKHN0YXRlLT5zMSBeIHN0YXRlLT5zMiBeIHN0YXRlLT5zMyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fbmV0X3NyYW5kb20oc3RydWN0IG5ybmRfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBsb25nIHMpCi17Ci0JaWYgKHMgPT0gMCkKLQkJcyA9IDE7ICAgICAgLyogZGVmYXVsdCBzZWVkIGlzIDEgKi8KLQotI2RlZmluZSBMQ0cobikgKDY5MDY5ICogbikKLQlzdGF0ZS0+czEgPSBMQ0cocyk7Ci0Jc3RhdGUtPnMyID0gTENHKHN0YXRlLT5zMSk7Ci0Jc3RhdGUtPnMzID0gTENHKHN0YXRlLT5zMik7Ci0KLQkvKiAid2FybSBpdCB1cCIgKi8KLQlfX25ldF9yYW5kb20oc3RhdGUpOwotCV9fbmV0X3JhbmRvbShzdGF0ZSk7Ci0JX19uZXRfcmFuZG9tKHN0YXRlKTsKLQlfX25ldF9yYW5kb20oc3RhdGUpOwotCV9fbmV0X3JhbmRvbShzdGF0ZSk7Ci0JX19uZXRfcmFuZG9tKHN0YXRlKTsKLX0KLQotCi11bnNpZ25lZCBsb25nIG5ldF9yYW5kb20odm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHI7Ci0Jc3RydWN0IG5ybmRfc3RhdGUgKnN0YXRlID0gJmdldF9jcHVfdmFyKG5ldF9yYW5kX3N0YXRlKTsKLQlyID0gX19uZXRfcmFuZG9tKHN0YXRlKTsKLQlwdXRfY3B1X3ZhcihzdGF0ZSk7Ci0JcmV0dXJuIHI7Ci19Ci0KLQotdm9pZCBuZXRfc3JhbmRvbSh1bnNpZ25lZCBsb25nIGVudHJvcHkpCi17Ci0Jc3RydWN0IG5ybmRfc3RhdGUgKnN0YXRlID0gJmdldF9jcHVfdmFyKG5ldF9yYW5kX3N0YXRlKTsKLQlfX25ldF9zcmFuZG9tKHN0YXRlLCBzdGF0ZS0+czFeZW50cm9weSk7Ci0JcHV0X2NwdV92YXIoc3RhdGUpOwotfQotCi12b2lkIF9faW5pdCBuZXRfcmFuZG9tX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXN0cnVjdCBucm5kX3N0YXRlICpzdGF0ZSA9ICZwZXJfY3B1KG5ldF9yYW5kX3N0YXRlLGkpOwotCQlfX25ldF9zcmFuZG9tKHN0YXRlLCBpK2ppZmZpZXMpOwotCX0KLX0KLQotc3RhdGljIGludCBuZXRfcmFuZG9tX3Jlc2VlZCh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgc2VlZDsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXN0cnVjdCBucm5kX3N0YXRlICpzdGF0ZSA9ICZwZXJfY3B1KG5ldF9yYW5kX3N0YXRlLGkpOwotCi0JCWdldF9yYW5kb21fYnl0ZXMoJnNlZWQsIHNpemVvZihzZWVkKSk7Ci0JCV9fbmV0X3NyYW5kb20oc3RhdGUsIHNlZWQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLWxhdGVfaW5pdGNhbGwobmV0X3JhbmRvbV9yZXNlZWQpOwotCiBpbnQgbmV0X21zZ19jb3N0ID0gNSpIWjsKIGludCBuZXRfbXNnX2J1cnN0ID0gMTA7CiAKQEAgLTE1MywxMCArNDAsNyBAQAogewogCXJldHVybiBfX3ByaW50a19yYXRlbGltaXQobmV0X21zZ19jb3N0LCBuZXRfbXNnX2J1cnN0KTsKIH0KLQotRVhQT1JUX1NZTUJPTChuZXRfcmFuZG9tKTsKIEVYUE9SVF9TWU1CT0wobmV0X3JhdGVsaW1pdCk7Ci1FWFBPUlRfU1lNQk9MKG5ldF9zcmFuZG9tKTsKIAogLyoKICAqIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGJpbmFyeSBJUC4KQEAgLTIwNCw3ICs4OCw3IEBACiAjZGVmaW5lIElONlBUT05fTlVMTAkJMHgyMDAwMDAwMAkvKiBmaXJzdC90YWlsICovCiAjZGVmaW5lIElONlBUT05fVU5LTk9XTgkJMHg0MDAwMDAwMAogCi1zdGF0aWMgaW5saW5lIGludCBkaWdpdDJiaW4oY2hhciBjLCBjaGFyIGRlbGltKQorc3RhdGljIGlubGluZSBpbnQgZGlnaXQyYmluKGNoYXIgYywgaW50IGRlbGltKQogewogCWlmIChjID09IGRlbGltIHx8IGMgPT0gJ1wwJykKIAkJcmV0dXJuIElONlBUT05fREVMSU07CkBAIC0yMTUsNyArOTksNyBAQAogCXJldHVybiBJTjZQVE9OX1VOS05PV047CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHhkaWdpdDJiaW4oY2hhciBjLCBjaGFyIGRlbGltKQorc3RhdGljIGlubGluZSBpbnQgeGRpZ2l0MmJpbihjaGFyIGMsIGludCBkZWxpbSkKIHsKIAlpZiAoYyA9PSBkZWxpbSB8fCBjID09ICdcMCcpCiAJCXJldHVybiBJTjZQVE9OX0RFTElNOwpAQCAtMjI5LDEyICsxMTMsMTQgQEAKIAkJcmV0dXJuIChJTjZQVE9OX1hESUdJVCB8IChjIC0gJ2EnICsgMTApKTsKIAlpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCiAJCXJldHVybiAoSU42UFRPTl9YRElHSVQgfCAoYyAtICdBJyArIDEwKSk7CisJaWYgKGRlbGltID09IC0xKQorCQlyZXR1cm4gSU42UFRPTl9ERUxJTTsKIAlyZXR1cm4gSU42UFRPTl9VTktOT1dOOwogfQogCiBpbnQgaW40X3B0b24oY29uc3QgY2hhciAqc3JjLCBpbnQgc3JjbGVuLAogCSAgICAgdTggKmRzdCwKLQkgICAgIGNoYXIgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpCisJICAgICBpbnQgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpCiB7CiAJY29uc3QgY2hhciAqczsKIAl1OCAqZDsKQEAgLTI4OSw3ICsxNzUsNyBAQAogCiBpbnQgaW42X3B0b24oY29uc3QgY2hhciAqc3JjLCBpbnQgc3JjbGVuLAogCSAgICAgdTggKmRzdCwKLQkgICAgIGNoYXIgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpCisJICAgICBpbnQgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpCiB7CiAJY29uc3QgY2hhciAqcywgKnRvayA9IE5VTEw7CiAJdTggKmQsICpkYyA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvY29yZS93aXJlbGVzcy5jIGIvbmV0L2NvcmUvd2lyZWxlc3MuYwppbmRleCBmZmZmMGRhLi5mNjlhYjdiIDEwMDY0NAotLS0gYS9uZXQvY29yZS93aXJlbGVzcy5jCisrKyBiL25ldC9jb3JlL3dpcmVsZXNzLmMKQEAgLTc0OCwxMSArNzQ4LDM5IEBACiAJCWludAlleHRyYV9zaXplOwogCQlpbnQJdXNlcl9sZW5ndGggPSAwOwogCQlpbnQJZXJyOworCQlpbnQJZXNzaWRfY29tcGF0ID0gMDsKIAogCQkvKiBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGJ5IGFyZ3VtZW50cy4gQWx3YXlzIGFsbG9jYXRlCiAJCSAqIGZvciBtYXggc3BhY2UuIEVhc2llciwgYW5kIHdvbid0IGxhc3QgbG9uZy4uLiAqLwogCQlleHRyYV9zaXplID0gZGVzY3ItPm1heF90b2tlbnMgKiBkZXNjci0+dG9rZW5fc2l6ZTsKIAorCQkvKiBDaGVjayBuZWVkIGZvciBFU1NJRCBjb21wYXRpYmlsaXR5IGZvciBXRSA8IDIxICovCisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ1NJV0VTU0lEOgorCQljYXNlIFNJT0NHSVdFU1NJRDoKKwkJY2FzZSBTSU9DU0lXTklDS046CisJCWNhc2UgU0lPQ0dJV05JQ0tOOgorCQkJaWYgKGl3ci0+dS5kYXRhLmxlbmd0aCA9PSBkZXNjci0+bWF4X3Rva2VucyArIDEpCisJCQkJZXNzaWRfY29tcGF0ID0gMTsKKwkJCWVsc2UgaWYgKElXX0lTX1NFVChjbWQpICYmIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpIHsKKwkJCQljaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisKKwkJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihlc3NpZCwgaXdyLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCSAgICAgaXdyLT51LmRhdGEubGVuZ3RoICoKKwkJCQkJCSAgICAgZGVzY3ItPnRva2VuX3NpemUpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJaWYgKGVzc2lkW2l3ci0+dS5kYXRhLmxlbmd0aCAtIDFdID09ICdcMCcpCisJCQkJCWVzc2lkX2NvbXBhdCA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaXdyLT51LmRhdGEubGVuZ3RoIC09IGVzc2lkX2NvbXBhdDsKKwogCQkvKiBDaGVjayB3aGF0IHVzZXIgc3BhY2UgaXMgZ2l2aW5nIHVzICovCiAJCWlmKElXX0lTX1NFVChjbWQpKSB7CiAJCQkvKiBDaGVjayBOVUxMIHBvaW50ZXIgKi8KQEAgLTc5NSw3ICs4MjMsOCBAQAogI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCiAKIAkJLyogQ3JlYXRlIHRoZSBrZXJuZWwgYnVmZmVyICovCi0JCWV4dHJhID0ga21hbGxvYyhleHRyYV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJLyogICAga3phbGxvYyBlbnN1cmVzIE5VTEwtdGVybWluYXRpb24gZm9yIGVzc2lkX2NvbXBhdCAqLworCQlleHRyYSA9IGt6YWxsb2MoZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChleHRyYSA9PSBOVUxMKSB7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtODE5LDYgKzg0OCw4IEBACiAJCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KIAkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIGV4dHJhKTsKIAorCQlpd3ItPnUuZGF0YS5sZW5ndGggKz0gZXNzaWRfY29tcGF0OworCiAJCS8qIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHJldHVybiB0byB0aGUgdXNlciAqLwogCQlpZiAoIXJldCAmJiBJV19JU19HRVQoY21kKSkgewogCQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciB1cCB0aGVyZSAqLwpAQCAtMjA5OSw3ICsyMTMwLDcgQEAKIAkgKiBUaGUgcnRubF9sb2NrKCkgbWFrZSBzdXJlIHdlIGRvbid0IHJhY2Ugd2l0aCB0aGUgb3RoZXIgaXdfaGFuZGxlcnMuCiAJICogVGhpcyBtYWtlIHN1cmUgd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpICJzZWUiIHRoYXQgdGhlIHNweSBsaXN0CiAJICogaXMgdGVtcG9yYXJpbHkgZGlzYWJsZWQuICovCi0Jd21iKCk7CisJc21wX3dtYigpOwogCiAJLyogQXJlIHRoZXJlIGFyZSBhZGRyZXNzZXMgdG8gY29weT8gKi8KIAlpZih3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKQEAgLTIxMjgsNyArMjE1OSw3IEBACiAJfQogCiAJLyogTWFrZSBzdXJlIGFib3ZlIGlzIHVwZGF0ZWQgYmVmb3JlIHJlLWVuYWJsaW5nICovCi0Jd21iKCk7CisJc21wX3dtYigpOwogCiAJLyogRW5hYmxlIGFkZHJlc3NlcyAqLwogCXNweWRhdGEtPnNweV9udW1iZXIgPSB3cnF1LT5kYXRhLmxlbmd0aDsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL0tjb25maWcgYi9uZXQvZGNjcC9LY29uZmlnCmluZGV4IGUyYTA5NWQuLmI4YTY4ZGQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL0tjb25maWcKKysrIGIvbmV0L2RjY3AvS2NvbmZpZwpAQCAtNCwxNSArNCwxNSBAQAogY29uZmlnIElQX0RDQ1AKIAl0cmlzdGF0ZSAiVGhlIERDQ1AgUHJvdG9jb2wgKEVYUEVSSU1FTlRBTCkiCiAJLS0taGVscC0tLQotCSAgRGF0YWdyYW0gQ29uZ2VzdGlvbiBDb250cm9sIFByb3RvY29sCisJICBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wgKFJGQyA0MzQwKQogCi0JICBGcm9tIGRyYWZ0LWlldGYtZGNjcC1zcGVjLTExIDxodHRwOi8vd3d3LmljaXIub3JnL2tvaGxlci9kY3AvZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTEudHh0Pi4KKwkgIEZyb20gaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDM0MC50eHQ6CiAKIAkgIFRoZSBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wgKERDQ1ApIGlzIGEgdHJhbnNwb3J0CiAJICBwcm90b2NvbCB0aGF0IGltcGxlbWVudHMgYmlkaXJlY3Rpb25hbCwgdW5pY2FzdCBjb25uZWN0aW9ucyBvZgogCSAgY29uZ2VzdGlvbi1jb250cm9sbGVkLCB1bnJlbGlhYmxlIGRhdGFncmFtcy4gSXQgc2hvdWxkIGJlIHN1aXRhYmxlCiAJICBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIHN0cmVhbWluZyBtZWRpYSwgSW50ZXJuZXQgdGVsZXBob255LAotCSAgYW5kIG9uLWxpbmUgZ2FtZXMKKwkgIGFuZCBvbi1saW5lIGdhbWVzLgogCiAJICBUbyBjb21waWxlIHRoaXMgcHJvdG9jb2wgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZGNjcC4KQEAgLTM4LDYgKzM4LDkgQEAKIAktLS1oZWxwLS0tCiAJICBPbmx5IHVzZSB0aGlzIGlmIHlvdSdyZSBoYWNraW5nIERDQ1AuCiAKKwkgIFdoZW4gY29tcGlsaW5nIERDQ1AgYXMgYSBtb2R1bGUsIHRoaXMgZGVidWdnaW5nIG91dHB1dCBjYW4gYmUgdG9nZ2xlZAorCSAgYnkgc2V0dGluZyB0aGUgcGFyYW1ldGVyIGRjY3BfZGVidWcgb2YgdGhlIGBkY2NwJyBtb2R1bGUgdG8gMCBvciAxLgorCiAJICBKdXN0IHNheSBOLgogCiBjb25maWcgTkVUX0RDQ1BQUk9CRQpAQCAtNDksNyArNTIsNyBAQAogCURDQ1AgY29uZ2VzdGlvbiBhdm9pZGFuY2UgbW9kdWxlcy4gSWYgeW91IGRvbid0IHVuZGVyc3RhbmQKIAl3aGF0IHdhcyBqdXN0IHNhaWQsIHlvdSBkb24ndCBuZWVkIGl0OiBzYXkgTi4KIAotCURvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGUgcGFja2V0IGdlbmVyYXRvciBjYW4gYmUgZm91bmQKKwlEb2N1bWVudGF0aW9uIG9uIGhvdyB0byB1c2UgRENDUCBjb25uZWN0aW9uIHByb2JpbmcgY2FuIGJlIGZvdW5kCiAJYXQgaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvRGNjcFByb2JlCiAKIAlUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9NYWtlZmlsZSBiL25ldC9kY2NwL01ha2VmaWxlCmluZGV4IDE3ZWQ5OWMuLmY0Zjg3OTMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL01ha2VmaWxlCisrKyBiL25ldC9kY2NwL01ha2VmaWxlCkBAIC0xLDEzICsxLDEzIEBACi1vYmotJChDT05GSUdfSVBWNikgKz0gZGNjcF9pcHY2Lm8KLQotZGNjcF9pcHY2LXkgOj0gaXB2Ni5vCi0KIG9iai0kKENPTkZJR19JUF9EQ0NQKSArPSBkY2NwLm8gZGNjcF9pcHY0Lm8KIAogZGNjcC15IDo9IGNjaWQubyBmZWF0Lm8gaW5wdXQubyBtaW5pc29ja3MubyBvcHRpb25zLm8gb3V0cHV0Lm8gcHJvdG8ubyB0aW1lci5vCiAKIGRjY3BfaXB2NC15IDo9IGlwdjQubwogCisjIGJ1aWxkIGRjY3BfaXB2NiBhcyBtb2R1bGUgd2hlbmV2ZXIgZWl0aGVyIElQdjYgb3IgRENDUCBpcyBhIG1vZHVsZQorb2JqLSQoc3Vic3QgeSwkKENPTkZJR19JUF9EQ0NQKSwkKENPTkZJR19JUFY2KSkgKz0gZGNjcF9pcHY2Lm8KK2RjY3BfaXB2Ni15IDo9IGlwdjYubworCiBkY2NwLSQoQ09ORklHX0lQX0RDQ1BfQUNLVkVDKSArPSBhY2t2ZWMubwogCiBvYmotJChDT05GSUdfSU5FVF9EQ0NQX0RJQUcpICs9IGRjY3BfZGlhZy5vCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9hY2t2ZWMuYyBiL25ldC9kY2NwL2Fja3ZlYy5jCmluZGV4IDRkMTc2ZDMuLmEwODZjNjMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2Fja3ZlYy5jCisrKyBiL25ldC9kY2NwL2Fja3ZlYy5jCkBAIC0yMSw4ICsyMSw4IEBACiAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpkY2NwX2Fja3ZlY19zbGFiOwotc3RhdGljIGttZW1fY2FjaGVfdCAqZGNjcF9hY2t2ZWNfcmVjb3JkX3NsYWI7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmRjY3BfYWNrdmVjX3NsYWI7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmRjY3BfYWNrdmVjX3JlY29yZF9zbGFiOwogCiBzdGF0aWMgc3RydWN0IGRjY3BfYWNrdmVjX3JlY29yZCAqZGNjcF9hY2t2ZWNfcmVjb3JkX25ldyh2b2lkKQogewpAQCAtNjcsMTUgKzY3LDE2IEBACiBpbnQgZGNjcF9pbnNlcnRfb3B0aW9uX2Fja3ZlYyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLSNpZmRlZiBDT05GSUdfSVBfRENDUF9ERUJVRwotCWNvbnN0IGNoYXIgKmRlYnVnX3ByZWZpeCA9IGRwLT5kY2Nwc19yb2xlID09IERDQ1BfUk9MRV9DTElFTlQgPwotCQkJCSJDTElFTlQgdHg6ICIgOiAic2VydmVyIHR4OiAiOwotI2VuZGlmCiAJc3RydWN0IGRjY3BfYWNrdmVjICphdiA9IGRwLT5kY2Nwc19oY19yeF9hY2t2ZWM7Ci0JaW50IGxlbiA9IGF2LT5kY2NwYXZfdmVjX2xlbiArIDI7CisJLyogRmlndXJlIG91dCBob3cgbWFueSBvcHRpb25zIGRvIHdlIG5lZWQgdG8gcmVwcmVzZW50IHRoZSBhY2t2ZWMgKi8KKwljb25zdCB1MTYgbnJfb3B0cyA9IChhdi0+ZGNjcGF2X3ZlY19sZW4gKworCQkJICAgICBEQ0NQX01BWF9BQ0tWRUNfT1BUX0xFTiAtIDEpIC8KKwkJCSAgICBEQ0NQX01BWF9BQ0tWRUNfT1BUX0xFTjsKKwl1MTYgbGVuID0gYXYtPmRjY3Bhdl92ZWNfbGVuICsgMiAqIG5yX29wdHMsIGk7CiAJc3RydWN0IHRpbWV2YWwgbm93OwogCXUzMiBlbGFwc2VkX3RpbWU7Ci0JdW5zaWduZWQgY2hhciAqdG8sICpmcm9tOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhaWwsICpmcm9tOworCXVuc2lnbmVkIGNoYXIgKnRvOwogCXN0cnVjdCBkY2NwX2Fja3ZlY19yZWNvcmQgKmF2cjsKIAogCWlmIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9vcHRfbGVuICsgbGVuID4gRENDUF9NQVhfT1BUX0xFTikKQEAgLTk0LDI2ICs5NSwzOSBAQAogCiAJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfb3B0X2xlbiArPSBsZW47CiAKLQl0byAgICA9IHNrYl9wdXNoKHNrYiwgbGVuKTsKLQkqdG8rKyA9IERDQ1BPX0FDS19WRUNUT1JfMDsKLQkqdG8rKyA9IGxlbjsKLQorCXRvICAgPSBza2JfcHVzaChza2IsIGxlbik7CiAJbGVuICA9IGF2LT5kY2NwYXZfdmVjX2xlbjsKIAlmcm9tID0gYXYtPmRjY3Bhdl9idWYgKyBhdi0+ZGNjcGF2X2J1Zl9oZWFkOworCXRhaWwgPSBhdi0+ZGNjcGF2X2J1ZiArIERDQ1BfTUFYX0FDS1ZFQ19MRU47CiAKLQkvKiBDaGVjayBpZiBidWZfaGVhZCB3cmFwcyAqLwotCWlmICgoaW50KWF2LT5kY2NwYXZfYnVmX2hlYWQgKyBsZW4gPiBEQ0NQX01BWF9BQ0tWRUNfTEVOKSB7Ci0JCWNvbnN0IHUzMiB0YWlsc2l6ZSA9IERDQ1BfTUFYX0FDS1ZFQ19MRU4gLSBhdi0+ZGNjcGF2X2J1Zl9oZWFkOworCWZvciAoaSA9IDA7IGkgPCBucl9vcHRzOyArK2kpIHsKKwkJaW50IGNvcHlsZW4gPSBsZW47CiAKLQkJbWVtY3B5KHRvLCBmcm9tLCB0YWlsc2l6ZSk7Ci0JCXRvICAgKz0gdGFpbHNpemU7Ci0JCWxlbiAgLT0gdGFpbHNpemU7Ci0JCWZyb20gPSBhdi0+ZGNjcGF2X2J1ZjsKKwkJaWYgKGxlbiA+IERDQ1BfTUFYX0FDS1ZFQ19PUFRfTEVOKQorCQkJY29weWxlbiA9IERDQ1BfTUFYX0FDS1ZFQ19PUFRfTEVOOworCisJCSp0bysrID0gRENDUE9fQUNLX1ZFQ1RPUl8wOworCQkqdG8rKyA9IGNvcHlsZW4gKyAyOworCisJCS8qIENoZWNrIGlmIGJ1Zl9oZWFkIHdyYXBzICovCisJCWlmIChmcm9tICsgY29weWxlbiA+IHRhaWwpIHsKKwkJCWNvbnN0IHUxNiB0YWlsc2l6ZSA9IHRhaWwgLSBmcm9tOworCisJCQltZW1jcHkodG8sIGZyb20sIHRhaWxzaXplKTsKKwkJCXRvCSs9IHRhaWxzaXplOworCQkJbGVuCS09IHRhaWxzaXplOworCQkJY29weWxlbgktPSB0YWlsc2l6ZTsKKwkJCWZyb20JPSBhdi0+ZGNjcGF2X2J1ZjsKKwkJfQorCisJCW1lbWNweSh0bywgZnJvbSwgY29weWxlbik7CisJCWZyb20gKz0gY29weWxlbjsKKwkJdG8gICArPSBjb3B5bGVuOworCQlsZW4gIC09IGNvcHlsZW47CiAJfQogCi0JbWVtY3B5KHRvLCBmcm9tLCBsZW4pOwogCS8qCi0JICoJRnJvbSBkcmFmdC1pZXRmLWRjY3Atc3BlYy0xMS50eHQ6CisJICoJRnJvbSBSRkMgNDM0MCwgQS4yOgogCSAqCiAJICoJRm9yIGVhY2ggYWNrbm93bGVkZ2VtZW50IGl0IHNlbmRzLCB0aGUgSEMtUmVjZWl2ZXIgd2lsbCBhZGQgYW4KIAkgKglhY2tub3dsZWRnZW1lbnQgcmVjb3JkLiAgYWNrX3NlcW5vIHdpbGwgZXF1YWwgdGhlIEhDLVJlY2VpdmVyCkBAIC0xMjksOSArMTQzLDkgQEAKIAogCWRjY3BfYWNrdmVjX2luc2VydF9hdnIoYXYsIGF2cik7CiAKLQlkY2NwX3ByX2RlYnVnKCIlc0FDSyBWZWN0b3IgMCwgbGVuPSVkLCBhY2tfc2Vxbm89JWxsdSwgIgorCWRjY3BfcHJfZGVidWcoIiVzIEFDSyBWZWN0b3IgMCwgbGVuPSVkLCBhY2tfc2Vxbm89JWxsdSwgIgogCQkgICAgICAiYWNrX2Fja25vPSVsbHVcbiIsCi0JCSAgICAgIGRlYnVnX3ByZWZpeCwgYXZyLT5kY2NwYXZyX3NlbnRfbGVuLAorCQkgICAgICBkY2NwX3JvbGUoc2spLCBhdnItPmRjY3BhdnJfc2VudF9sZW4sCiAJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYXZyLT5kY2NwYXZyX2Fja19zZXFubywKIAkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhdnItPmRjY3BhdnJfYWNrX2Fja25vKTsKIAlyZXR1cm4gMDsKQEAgLTE0NSw3ICsxNTksNiBAQAogCQlhdi0+ZGNjcGF2X2J1Zl9oZWFkCT0gRENDUF9NQVhfQUNLVkVDX0xFTiAtIDE7CiAJCWF2LT5kY2NwYXZfYnVmX2Fja25vCT0gRENDUF9NQVhfU0VRTk8gKyAxOwogCQlhdi0+ZGNjcGF2X2J1Zl9ub25jZSA9IGF2LT5kY2NwYXZfYnVmX25vbmNlID0gMDsKLQkJYXYtPmRjY3Bhdl9hY2tfcHRyCT0gMDsKIAkJYXYtPmRjY3Bhdl90aW1lLnR2X3NlYwk9IDA7CiAJCWF2LT5kY2NwYXZfdGltZS50dl91c2VjCT0gMDsKIAkJYXYtPmRjY3Bhdl92ZWNfbGVuCT0gMDsKQEAgLTE3NCwxMyArMTg3LDEzIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggZGNjcF9hY2t2ZWNfc3RhdGUoY29uc3Qgc3RydWN0IGRjY3BfYWNrdmVjICphdiwKLQkJCQkgICBjb25zdCB1OCBpbmRleCkKKwkJCQkgICBjb25zdCB1MzIgaW5kZXgpCiB7CiAJcmV0dXJuIGF2LT5kY2NwYXZfYnVmW2luZGV4XSAmIERDQ1BfQUNLVkVDX1NUQVRFX01BU0s7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggZGNjcF9hY2t2ZWNfbGVuKGNvbnN0IHN0cnVjdCBkY2NwX2Fja3ZlYyAqYXYsCi0JCQkJIGNvbnN0IHU4IGluZGV4KQorCQkJCSBjb25zdCB1MzIgaW5kZXgpCiB7CiAJcmV0dXJuIGF2LT5kY2NwYXZfYnVmW2luZGV4XSAmIERDQ1BfQUNLVkVDX0xFTl9NQVNLOwogfQpAQCAtMjEwLDcgKzIyMyw3IEBACiAJCQlnYXAgPSAtbmV3X2hlYWQ7CiAJCX0KIAkJbmV3X2hlYWQgKz0gRENDUF9NQVhfQUNLVkVDX0xFTjsKLQl9IAorCX0KIAogCWF2LT5kY2NwYXZfYnVmX2hlYWQgPSBuZXdfaGVhZDsKIApAQCAtMjI0LDcgKzIzNyw3IEBACiB9CiAKIC8qCi0gKiBJbXBsZW1lbnRzIHRoZSBkcmFmdC1pZXRmLWRjY3Atc3BlYy0xMS50eHQgQXBwZW5kaXggQQorICogSW1wbGVtZW50cyB0aGUgUkZDIDQzNDAsIEFwcGVuZGl4IEEKICAqLwogaW50IGRjY3BfYWNrdmVjX2FkZChzdHJ1Y3QgZGNjcF9hY2t2ZWMgKmF2LCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCiAJCSAgICBjb25zdCB1NjQgYWNrbm8sIGNvbnN0IHU4IHN0YXRlKQpAQCAtMjM3LDcgKzI1MCw3IEBACiAJICogV2UgbWF5IHdlbGwgZGVjaWRlIHRvIGRvIGJ1ZmZlciBjb21wcmVzc2lvbiwgZXRjLCBidXQgZm9yIG5vdyBsZXRzCiAJICoganVzdCBkcm9wLgogCSAqCi0JICogRnJvbSBBcHBlbmRpeCBBOgorCSAqIEZyb20gQXBwZW5kaXggQS4xLjEgKGBOZXcgUGFja2V0cycpOgogCSAqCiAJICoJT2YgY291cnNlLCB0aGUgY2lyY3VsYXIgYnVmZmVyIG1heSBvdmVyZmxvdywgZWl0aGVyIHdoZW4gdGhlCiAJICoJSEMtU2VuZGVyIGlzIHNlbmRpbmcgZGF0YSBhdCBhIHZlcnkgaGlnaCByYXRlLCB3aGVuIHRoZQpAQCAtMjc0LDEzICsyODcsMTMgQEAKIAkJLyoKIAkJICogQS4xLjIuICBPbGQgUGFja2V0cwogCQkgKgotCQkgKglXaGVuIGEgcGFja2V0IHdpdGggU2VxdWVuY2UgTnVtYmVyIFMgYXJyaXZlcywgYW5kCi0JCSAqCVMgPD0gYnVmX2Fja25vLCB0aGUgSEMtUmVjZWl2ZXIgd2lsbCBzY2FuIHRoZSB0YWJsZQotCQkgKglmb3IgdGhlIGJ5dGUgY29ycmVzcG9uZGluZyB0byBTLiAoSW5kZXhpbmcgc3RydWN0dXJlcworCQkgKglXaGVuIGEgcGFja2V0IHdpdGggU2VxdWVuY2UgTnVtYmVyIFMgPD0gYnVmX2Fja25vCisJCSAqCWFycml2ZXMsIHRoZSBIQy1SZWNlaXZlciB3aWxsIHNjYW4gdGhlIHRhYmxlIGZvcgorCQkgKgl0aGUgYnl0ZSBjb3JyZXNwb25kaW5nIHRvIFMuIChJbmRleGluZyBzdHJ1Y3R1cmVzCiAJCSAqCWNvdWxkIHJlZHVjZSB0aGUgY29tcGxleGl0eSBvZiB0aGlzIHNjYW4uKQogCQkgKi8KIAkJdTY0IGRlbHRhID0gZGNjcF9kZWx0YV9zZXFubyhhY2tubywgYXYtPmRjY3Bhdl9idWZfYWNrbm8pOwotCQl1OCBpbmRleCA9IGF2LT5kY2NwYXZfYnVmX2hlYWQ7CisJCXUzMiBpbmRleCA9IGF2LT5kY2NwYXZfYnVmX2hlYWQ7CiAKIAkJd2hpbGUgKDEpIHsKIAkJCWNvbnN0IHU4IGxlbiA9IGRjY3BfYWNrdmVjX2xlbihhdiwgaW5kZXgpOwpAQCAtMzIyLDIxICszMzUsMTggQEAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9ERUJVRwogdm9pZCBkY2NwX2Fja3ZlY3Rvcl9wcmludChjb25zdCB1NjQgYWNrbm8sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnZlY3RvciwgaW50IGxlbikKIHsKLQlpZiAoIWRjY3BfZGVidWcpCi0JCXJldHVybjsKLQotCXByaW50aygiQUNLIHZlY3RvciBsZW49JWQsIGFja25vPSVsbHUgfCIsIGxlbiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhY2tubyk7CisJZGNjcF9wcl9kZWJ1Z19jYXQoIkFDSyB2ZWN0b3IgbGVuPSVkLCBhY2tubz0lbGx1IHwiLCBsZW4sCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylhY2tubyk7CiAKIAl3aGlsZSAobGVuLS0pIHsKIAkJY29uc3QgdTggc3RhdGUgPSAoKnZlY3RvciAmIERDQ1BfQUNLVkVDX1NUQVRFX01BU0spID4+IDY7CiAJCWNvbnN0IHU4IHJsID0gKnZlY3RvciAmIERDQ1BfQUNLVkVDX0xFTl9NQVNLOwogCi0JCXByaW50aygiJWQsJWR8Iiwgc3RhdGUsIHJsKTsKKwkJZGNjcF9wcl9kZWJ1Z19jYXQoIiVkLCVkfCIsIHN0YXRlLCBybCk7CiAJCSsrdmVjdG9yOwogCX0KIAotCXByaW50aygiXG4iKTsKKwlkY2NwX3ByX2RlYnVnX2NhdCgiXG4iKTsKIH0KIAogdm9pZCBkY2NwX2Fja3ZlY19wcmludChjb25zdCBzdHJ1Y3QgZGNjcF9hY2t2ZWMgKmF2KQpAQCAtMzgwLDI0ICszOTAsMjAgQEAKIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoYXZyLCAmYXYtPmRjY3Bhdl9yZWNvcmRzLCBkY2NwYXZyX25vZGUpIHsKIAkJaWYgKGFja25vID09IGF2ci0+ZGNjcGF2cl9hY2tfc2Vxbm8pIHsKLSNpZmRlZiBDT05GSUdfSVBfRENDUF9ERUJVRwotCQkJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQkJCWNvbnN0IGNoYXIgKmRlYnVnX3ByZWZpeCA9IGRwLT5kY2Nwc19yb2xlID09IERDQ1BfUk9MRV9DTElFTlQgPwotCQkJCQkJIkNMSUVOVCByeCBhY2s6ICIgOiAic2VydmVyIHJ4IGFjazogIjsKLSNlbmRpZgotCQkJZGNjcF9wcl9kZWJ1ZygiJXNBQ0sgcGFja2V0IDAsIGxlbj0lZCwgYWNrX3NlcW5vPSVsbHUsICIKKwkJCWRjY3BfcHJfZGVidWcoIiVzIEFDSyBwYWNrZXQgMCwgbGVuPSVkLCBhY2tfc2Vxbm89JWxsdSwgIgogCQkJCSAgICAgICJhY2tfYWNrbm89JWxsdSwgQUNLRUQhXG4iLAotCQkJCSAgICAgIGRlYnVnX3ByZWZpeCwgMSwKKwkJCQkgICAgICBkY2NwX3JvbGUoc2spLCAxLAogCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYXZyLT5kY2NwYXZyX2Fja19zZXFubywKIAkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWF2ci0+ZGNjcGF2cl9hY2tfYWNrbm8pOwogCQkJZGNjcF9hY2t2ZWNfdGhyb3dfcmVjb3JkKGF2LCBhdnIpOwogCQkJYnJlYWs7Ci0JCX0KKwkJfSBlbHNlIGlmIChhdnItPmRjY3BhdnJfYWNrX3NlcW5vID4gYWNrbm8pCisJCQlicmVhazsgLyogb2xkIG5ld3MgKi8KIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGRjY3BfYWNrdmVjX2NoZWNrX3Jjdl9hY2t2ZWN0b3Ioc3RydWN0IGRjY3BfYWNrdmVjICphdiwKLQkJCQkJICAgIHN0cnVjdCBzb2NrICpzaywgdTY0IGFja25vLAorCQkJCQkgICAgc3RydWN0IHNvY2sgKnNrLCB1NjQgKmFja25vLAogCQkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciBsZW4sCiAJCQkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp2ZWN0b3IpCiB7CkBAIC00MjAsNyArNDI2LDcgQEAKIAkJY29uc3QgdTggcmwgPSAqdmVjdG9yICYgRENDUF9BQ0tWRUNfTEVOX01BU0s7CiAJCXU2NCBhY2tub19lbmRfcmw7CiAKLQkJZGNjcF9zZXRfc2Vxbm8oJmFja25vX2VuZF9ybCwgYWNrbm8gLSBybCk7CisJCWRjY3Bfc2V0X3NlcW5vKCZhY2tub19lbmRfcmwsICphY2tubyAtIHJsKTsKIAogCQkvKgogCQkgKiBJZiBvdXIgQVZSIHNlcXVlbmNlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIGFjaywgZ28KQEAgLTQyOCwyNSArNDM0LDE5IEBACiAJCSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20oYXZyLCAmYXYtPmRjY3Bhdl9yZWNvcmRzLAogCQkJCQkgZGNjcGF2cl9ub2RlKSB7Ci0JCQlpZiAoIWFmdGVyNDgoYXZyLT5kY2NwYXZyX2Fja19zZXFubywgYWNrbm8pKQorCQkJaWYgKCFhZnRlcjQ4KGF2ci0+ZGNjcGF2cl9hY2tfc2Vxbm8sICphY2tubykpCiAJCQkJZ290byBmb3VuZDsKIAkJfQogCQkvKiBFbmQgb2YgdGhlIGRjY3Bhdl9yZWNvcmRzIGxpc3QsIG5vdCBmb3VuZCwgZXhpdCAqLwogCQlicmVhazsKIGZvdW5kOgotCQlpZiAoYmV0d2VlbjQ4KGF2ci0+ZGNjcGF2cl9hY2tfc2Vxbm8sIGFja25vX2VuZF9ybCwgYWNrbm8pKSB7CisJCWlmIChiZXR3ZWVuNDgoYXZyLT5kY2NwYXZyX2Fja19zZXFubywgYWNrbm9fZW5kX3JsLCAqYWNrbm8pKSB7CiAJCQljb25zdCB1OCBzdGF0ZSA9ICp2ZWN0b3IgJiBEQ0NQX0FDS1ZFQ19TVEFURV9NQVNLOwogCQkJaWYgKHN0YXRlICE9IERDQ1BfQUNLVkVDX1NUQVRFX05PVF9SRUNFSVZFRCkgewotI2lmZGVmIENPTkZJR19JUF9EQ0NQX0RFQlVHCi0JCQkJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQkJCQljb25zdCBjaGFyICpkZWJ1Z19wcmVmaXggPQotCQkJCQlkcC0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfQ0xJRU5UID8KLQkJCQkJIkNMSUVOVCByeCBhY2s6ICIgOiAic2VydmVyIHJ4IGFjazogIjsKLSNlbmRpZgotCQkJCWRjY3BfcHJfZGVidWcoIiVzQUNLIHZlY3RvciAwLCBsZW49JWQsICIKKwkJCQlkY2NwX3ByX2RlYnVnKCIlcyBBQ0sgdmVjdG9yIDAsIGxlbj0lZCwgIgogCQkJCQkgICAgICAiYWNrX3NlcW5vPSVsbHUsIGFja19hY2tubz0lbGx1LCAiCiAJCQkJCSAgICAgICJBQ0tFRCFcbiIsCi0JCQkJCSAgICAgIGRlYnVnX3ByZWZpeCwgbGVuLAorCQkJCQkgICAgICBkY2NwX3JvbGUoc2spLCBsZW4sCiAJCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCiAJCQkJCSAgICAgIGF2ci0+ZGNjcGF2cl9hY2tfc2Vxbm8sCiAJCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCkBAIC00NjAsMjcgKzQ2MCwyMyBAQAogCQkJICovCiAJCX0KIAotCQlkY2NwX3NldF9zZXFubygmYWNrbm8sIGFja25vX2VuZF9ybCAtIDEpOworCQlkY2NwX3NldF9zZXFubyhhY2tubywgYWNrbm9fZW5kX3JsIC0gMSk7CiAJCSsrdmVjdG9yOwogCX0KIH0KIAogaW50IGRjY3BfYWNrdmVjX3BhcnNlKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgY29uc3QgdTggb3B0LCBjb25zdCB1OCAqdmFsdWUsIGNvbnN0IHU4IGxlbikKKwkJICAgICAgdTY0ICphY2tubywgY29uc3QgdTggb3B0LCBjb25zdCB1OCAqdmFsdWUsIGNvbnN0IHU4IGxlbikKIHsKLQlpZiAobGVuID4gRENDUF9NQVhfQUNLVkVDX0xFTikKKwlpZiAobGVuID4gRENDUF9NQVhfQUNLVkVDX09QVF9MRU4pCiAJCXJldHVybiAtMTsKIAogCS8qIGRjY3BfYWNrdmVjdG9yX3ByaW50KERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEsIHZhbHVlLCBsZW4pOyAqLwogCWRjY3BfYWNrdmVjX2NoZWNrX3Jjdl9hY2t2ZWN0b3IoZGNjcF9zayhzayktPmRjY3BzX2hjX3J4X2Fja3ZlYywgc2ssCi0JCQkJCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEsCi0JCQkJICAgICAgICBsZW4sIHZhbHVlKTsKKwkJCQkJYWNrbm8sIGxlbiwgdmFsdWUpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY2hhciBkY2NwX2Fja3ZlY19zbGFiX21zZ1tdIF9faW5pdGRhdGEgPQotCUtFUk5fQ1JJVCAiRENDUDogVW5hYmxlIHRvIGNyZWF0ZSBhY2sgdmVjdG9ycyBzbGFiIGNhY2hlc1xuIjsKLQogaW50IF9faW5pdCBkY2NwX2Fja3ZlY19pbml0KHZvaWQpCiB7CiAJZGNjcF9hY2t2ZWNfc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKCJkY2NwX2Fja3ZlYyIsCkBAIC01MDIsNyArNDk4LDcgQEAKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZGNjcF9hY2t2ZWNfc2xhYik7CiAJZGNjcF9hY2t2ZWNfc2xhYiA9IE5VTEw7CiBvdXRfZXJyOgotCXByaW50ayhkY2NwX2Fja3ZlY19zbGFiX21zZyk7CisJRENDUF9DUklUKCJVbmFibGUgdG8gY3JlYXRlIEFjayBWZWN0b3Igc2xhYiBjYWNoZSIpOwogCXJldHVybiAtRU5PQlVGUzsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvYWNrdmVjLmggYi9uZXQvZGNjcC9hY2t2ZWMuaAppbmRleCAyNDI0ZWZmLi45NjUwNGEzIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9hY2t2ZWMuaAorKysgYi9uZXQvZGNjcC9hY2t2ZWMuaApAQCAtMTcsNyArMTcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qIFJlYWQgYWJvdXQgdGhlIEVDTiBub25jZSB0byBzZWUgd2h5IGl0IGlzIDI1MyAqLwotI2RlZmluZSBEQ0NQX01BWF9BQ0tWRUNfTEVOIDI1MworI2RlZmluZSBEQ0NQX01BWF9BQ0tWRUNfT1BUX0xFTiAyNTMKKy8qIFdlIGNhbiBzcHJlYWQgYW4gYWNrIHZlY3RvciBhY3Jvc3MgbXVsdGlwbGUgb3B0aW9ucyAqLworI2RlZmluZSBEQ0NQX01BWF9BQ0tWRUNfTEVOIChEQ0NQX01BWF9BQ0tWRUNfT1BUX0xFTiAqIDIpCiAKICNkZWZpbmUgRENDUF9BQ0tWRUNfU1RBVEVfUkVDRUlWRUQJMAogI2RlZmluZSBEQ0NQX0FDS1ZFQ19TVEFURV9FQ05fTUFSS0VECSgxIDw8IDYpCkBAIC0yOCw4ICszMCw3IEBACiAKIC8qKiBzdHJ1Y3QgZGNjcF9hY2t2ZWMgLSBhY2sgdmVjdG9yCiAgKgotICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyB0aGUgb25lIGRlZmluZWQgaW4gdGhlIERDQ1AgZHJhZnQKLSAqIEFwcGVuZGl4IEEuCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHRoZSBvbmUgZGVmaW5lZCBpbiBSRkMgNDM0MCwgQXBwZW5kaXggQS4KICAqCiAgKiBAZGNjcGF2X2J1Zl9oZWFkIC0gY2lyY3VsYXIgYnVmZmVyIGhlYWQKICAqIEBkY2NwYXZfYnVmX3RhaWwgLSBjaXJjdWxhciBidWZmZXIgdGFpbApAQCAtNDIsNyArNDMsNiBAQAogICogQWNrIFZlY3RvcnMgaXQgaGFzIHJlY2VudGx5IHNlbnQuIEZvciBlYWNoIHBhY2tldCBzZW50IGNhcnJ5aW5nIGFuCiAgKiBBY2sgVmVjdG9yLCBpdCByZW1lbWJlcnMgZm91ciB2YXJpYWJsZXM6CiAgKgotICogQGRjY3Bhdl9hY2tfcHRyIC0gdGhlIHZhbHVlIG9mIGJ1Zl9oZWFkIGF0IHRoZSB0aW1lIG9mIGFja25vd2xlZGdlbWVudC4KICAqIEBkY2NwYXZfcmVjb3JkcyAtIGxpc3Qgb2YgZGNjcF9hY2t2ZWNfcmVjb3JkCiAgKiBAZGNjcGF2X2Fja19ub25jZSAtIHRoZSBvbmUtYml0IHN1bSBvZiB0aGUgRUNOIE5vbmNlcyBmb3IgYWxsIFN0YXRlIDAuCiAgKgpAQCAtNTMsOSArNTMsOCBAQAogCXU2NAkJZGNjcGF2X2J1Zl9hY2tubzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRjY3Bhdl9yZWNvcmRzOwogCXN0cnVjdCB0aW1ldmFsCWRjY3Bhdl90aW1lOwotCXU4CQlkY2NwYXZfYnVmX2hlYWQ7Ci0JdTgJCWRjY3Bhdl9hY2tfcHRyOwotCXU4CQlkY2NwYXZfdmVjX2xlbjsKKwl1MTYJCWRjY3Bhdl9idWZfaGVhZDsKKwl1MTYJCWRjY3Bhdl92ZWNfbGVuOwogCXU4CQlkY2NwYXZfYnVmX25vbmNlOwogCXU4CQlkY2NwYXZfYWNrX25vbmNlOwogCXU4CQlkY2NwYXZfYnVmW0RDQ1BfTUFYX0FDS1ZFQ19MRU5dOwpAQCAtNzgsOSArNzcsOSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZGNjcGF2cl9ub2RlOwogCXU2NAkJIGRjY3BhdnJfYWNrX3NlcW5vOwogCXU2NAkJIGRjY3BhdnJfYWNrX2Fja25vOwotCXU4CQkgZGNjcGF2cl9hY2tfcHRyOworCXUxNgkJIGRjY3BhdnJfYWNrX3B0cjsKKwl1MTYJCSBkY2NwYXZyX3NlbnRfbGVuOwogCXU4CQkgZGNjcGF2cl9hY2tfbm9uY2U7Ci0JdTgJCSBkY2NwYXZyX3NlbnRfbGVuOwogfTsKIAogc3RydWN0IHNvY2s7CkBAIC05OSw3ICs5OCw4IEBACiBleHRlcm4gdm9pZCBkY2NwX2Fja3ZlY19jaGVja19yY3ZfYWNrbm8oc3RydWN0IGRjY3BfYWNrdmVjICphdiwKIAkJCQkJc3RydWN0IHNvY2sgKnNrLCBjb25zdCB1NjQgYWNrbm8pOwogZXh0ZXJuIGludCBkY2NwX2Fja3ZlY19wYXJzZShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIGNvbnN0IHU4IG9wdCwgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pOworCQkJICAgICB1NjQgKmFja25vLCBjb25zdCB1OCBvcHQsCisJCQkgICAgIGNvbnN0IHU4ICp2YWx1ZSwgY29uc3QgdTggbGVuKTsKIAogZXh0ZXJuIGludCBkY2NwX2luc2VydF9vcHRpb25fYWNrdmVjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKQEAgLTEzOCw3ICsxMzgsOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBkY2NwX2Fja3ZlY19wYXJzZShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGNvbnN0IHU4IG9wdCwgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pCisJCQkJICAgIGNvbnN0IHU2NCAqYWNrbm8sIGNvbnN0IHU4IG9wdCwKKwkJCQkgICAgY29uc3QgdTggKnZhbHVlLCBjb25zdCB1OCBsZW4pCiB7CiAJcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZC5jIGIvbmV0L2RjY3AvY2NpZC5jCmluZGV4IGZmMDVlNTkuLmQ4Y2Y5MmYgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWQuYworKysgYi9uZXQvZGNjcC9jY2lkLmMKQEAgLTU1LDkgKzU1LDkgQEAKICNkZWZpbmUgY2NpZHNfcmVhZF91bmxvY2soKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpjY2lkX2ttZW1fY2FjaGVfY3JlYXRlKGludCBvYmpfc2l6ZSwgY29uc3QgY2hhciAqZm10LC4uLikKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY2NpZF9rbWVtX2NhY2hlX2NyZWF0ZShpbnQgb2JqX3NpemUsIGNvbnN0IGNoYXIgKmZtdCwuLi4pCiB7Ci0Ja21lbV9jYWNoZV90ICpzbGFiOworCXN0cnVjdCBrbWVtX2NhY2hlICpzbGFiOwogCWNoYXIgc2xhYl9uYW1lX2ZtdFszMl0sICpzbGFiX25hbWU7CiAJdmFfbGlzdCBhcmdzOwogCkBAIC03NSw3ICs3NSw3IEBACiAJcmV0dXJuIHNsYWI7CiB9CiAKLXN0YXRpYyB2b2lkIGNjaWRfa21lbV9jYWNoZV9kZXN0cm95KGttZW1fY2FjaGVfdCAqc2xhYikKK3N0YXRpYyB2b2lkIGNjaWRfa21lbV9jYWNoZV9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICpzbGFiKQogewogCWlmIChzbGFiICE9IE5VTEwpIHsKIAkJY29uc3QgY2hhciAqbmFtZSA9IGttZW1fY2FjaGVfbmFtZShzbGFiKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWQuaCBiL25ldC9kY2NwL2NjaWQuaAppbmRleCBmN2ViNmM2Li5jNjVjYjI0IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkLmgKKysrIGIvbmV0L2RjY3AvY2NpZC5oCkBAIC0yNyw5ICsyNyw5IEBACiAJdW5zaWduZWQgY2hhcgljY2lkX2lkOwogCWNvbnN0IGNoYXIJKmNjaWRfbmFtZTsKIAlzdHJ1Y3QgbW9kdWxlCSpjY2lkX293bmVyOwotCWttZW1fY2FjaGVfdAkqY2NpZF9oY19yeF9zbGFiOworCXN0cnVjdCBrbWVtX2NhY2hlCSpjY2lkX2hjX3J4X3NsYWI7CiAJX191MzIJCWNjaWRfaGNfcnhfb2JqX3NpemU7Ci0Ja21lbV9jYWNoZV90CSpjY2lkX2hjX3R4X3NsYWI7CisJc3RydWN0IGttZW1fY2FjaGUJKmNjaWRfaGNfdHhfc2xhYjsKIAlfX3UzMgkJY2NpZF9oY190eF9vYmpfc2l6ZTsKIAlpbnQJCSgqY2NpZF9oY19yeF9pbml0KShzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrKTsKIAlpbnQJCSgqY2NpZF9oY190eF9pbml0KShzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrKTsKQEAgLTQzLDggKzQzLDYgQEAKIAkJCQkJCSAgICB1bnNpZ25lZCBjaGFyKiB2YWx1ZSk7CiAJaW50CQkoKmNjaWRfaGNfcnhfaW5zZXJ0X29wdGlvbnMpKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0JaW50CQkoKmNjaWRfaGNfdHhfaW5zZXJ0X29wdGlvbnMpKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJdm9pZAkJKCpjY2lkX2hjX3R4X3BhY2tldF9yZWN2KShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwogCWludAkJKCpjY2lkX2hjX3R4X3BhcnNlX29wdGlvbnMpKHN0cnVjdCBzb2NrICpzaywKQEAgLTUyLDkgKzUwLDkgQEAKIAkJCQkJCSAgICB1bnNpZ25lZCBjaGFyIGxlbiwgdTE2IGlkeCwKIAkJCQkJCSAgICB1bnNpZ25lZCBjaGFyKiB2YWx1ZSk7CiAJaW50CQkoKmNjaWRfaGNfdHhfc2VuZF9wYWNrZXQpKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbik7Ci0Jdm9pZAkJKCpjY2lkX2hjX3R4X3BhY2tldF9zZW50KShzdHJ1Y3Qgc29jayAqc2ssIGludCBtb3JlLAotCQkJCQkJICBpbnQgbGVuKTsKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdm9pZAkJKCpjY2lkX2hjX3R4X3BhY2tldF9zZW50KShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgIGludCBtb3JlLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAl2b2lkCQkoKmNjaWRfaGNfcnhfZ2V0X2luZm8pKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgICAgIHN0cnVjdCB0Y3BfaW5mbyAqaW5mbyk7CiAJdm9pZAkJKCpjY2lkX2hjX3R4X2dldF9pbmZvKShzdHJ1Y3Qgc29jayAqc2ssCkBAIC05NCwxNiArOTIsMTYgQEAKIGV4dGVybiB2b2lkIGNjaWRfaGNfdHhfZGVsZXRlKHN0cnVjdCBjY2lkICpjY2lkLCBzdHJ1Y3Qgc29jayAqc2spOwogCiBzdGF0aWMgaW5saW5lIGludCBjY2lkX2hjX3R4X3NlbmRfcGFja2V0KHN0cnVjdCBjY2lkICpjY2lkLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgcmMgPSAwOwogCWlmIChjY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9zZW5kX3BhY2tldCAhPSBOVUxMKQotCQlyYyA9IGNjaWQtPmNjaWRfb3BzLT5jY2lkX2hjX3R4X3NlbmRfcGFja2V0KHNrLCBza2IsIGxlbik7CisJCXJjID0gY2NpZC0+Y2NpZF9vcHMtPmNjaWRfaGNfdHhfc2VuZF9wYWNrZXQoc2ssIHNrYik7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2NpZF9oY190eF9wYWNrZXRfc2VudChzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgIGludCBtb3JlLCBpbnQgbGVuKQorCQkJCQkgIGludCBtb3JlLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWlmIChjY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9wYWNrZXRfc2VudCAhPSBOVUxMKQogCQljY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9wYWNrZXRfc2VudChzaywgbW9yZSwgbGVuKTsKQEAgLTE0NiwxNCArMTQ0LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNjaWRfaGNfdHhfaW5zZXJ0X29wdGlvbnMoc3RydWN0IGNjaWQgKmNjaWQsIHN0cnVjdCBzb2NrICpzaywKLQkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKGNjaWQtPmNjaWRfb3BzLT5jY2lkX2hjX3R4X2luc2VydF9vcHRpb25zICE9IE5VTEwpCi0JCXJldHVybiBjY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9pbnNlcnRfb3B0aW9ucyhzaywgc2tiKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgY2NpZF9oY19yeF9pbnNlcnRfb3B0aW9ucyhzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL0tjb25maWcgYi9uZXQvZGNjcC9jY2lkcy9LY29uZmlnCmluZGV4IDMyNzUyZjcuLjgwZjQ2OTggMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL0tjb25maWcKKysrIGIvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZwpAQCAtMjIsMTkgKzIyLDI2IEBACiAJICBmb3IgbG9zdCBwYWNrZXRzLCB3b3VsZCBwcmVmZXIgQ0NJRCAyIHRvIENDSUQgMy4gIE9uLWxpbmUgZ2FtZXMgbWF5CiAJICBhbHNvIHByZWZlciBDQ0lEIDIuCiAKLQkgIENDSUQgMiBpcyBmdXJ0aGVyIGRlc2NyaWJlZCBpbjoKLQkgIGh0dHA6Ly93d3cuaWNpci5vcmcva29obGVyL2RjY3AvZHJhZnQtaWV0Zi1kY2NwLWNjaWQyLTEwLnR4dAorCSAgQ0NJRCAyIGlzIGZ1cnRoZXIgZGVzY3JpYmVkIGluIFJGQyA0MzQxLAorCSAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDM0MS50eHQKIAotCSAgVGhpcyB0ZXh0IHdhcyBleHRyYWN0ZWQgZnJvbToKLQkgIGh0dHA6Ly93d3cuaWNpci5vcmcva29obGVyL2RjY3AvZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTMudHh0CisJICBUaGlzIHRleHQgd2FzIGV4dHJhY3RlZCBmcm9tIFJGQyA0MzQwIChzZWMuIDEwLjEpLAorCSAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDM0MC50eHQKKworCSAgVG8gY29tcGlsZSB0aGlzIENDSUQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGRjY3BfY2NpZDIuCiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTS4KIAogY29uZmlnIElQX0RDQ1BfQ0NJRDJfREVCVUcKLQkgIGJvb2wgIkNDSUQyIGRlYnVnIgorCSAgYm9vbCAiQ0NJRDIgZGVidWdnaW5nIG1lc3NhZ2VzIgogCSAgZGVwZW5kcyBvbiBJUF9EQ0NQX0NDSUQyCiAJICAtLS1oZWxwLS0tCi0JICAgIEVuYWJsZSBDQ0lEMiBkZWJ1ZyBtZXNzYWdlcy4KKwkgICAgRW5hYmxlIENDSUQyLXNwZWNpZmljIGRlYnVnZ2luZyBtZXNzYWdlcy4KKworCSAgICBXaGVuIGNvbXBpbGluZyBDQ0lEMiBhcyBhIG1vZHVsZSwgdGhpcyBkZWJ1Z2dpbmcgb3V0cHV0IGNhbgorCSAgICBhZGRpdGlvbmFsbHkgYmUgdG9nZ2xlZCBieSBzZXR0aW5nIHRoZSBjY2lkMl9kZWJ1ZyBtb2R1bGUKKwkgICAgcGFyYW1ldGVyIHRvIDAgb3IgMS4KIAogCSAgICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKQEAgLTUzLDIwICs2MCw2NiBAQAogCSAgc3VpdGFibGUgdGhhbiBDQ0lEIDIgZm9yIGFwcGxpY2F0aW9ucyBzdWNoIHN0cmVhbWluZyBtZWRpYSB3aGVyZSBhCiAJICByZWxhdGl2ZWx5IHNtb290aCBzZW5kaW5nIHJhdGUgaXMgb2YgaW1wb3J0YW5jZS4KIAotCSAgQ0NJRCAzIGlzIGZ1cnRoZXIgZGVzY3JpYmVkIGluOgotCi0JICBodHRwOi8vd3d3LmljaXIub3JnL2tvaGxlci9kY2NwL2RyYWZ0LWlldGYtZGNjcC1jY2lkMy0xMS50eHQuCisJICBDQ0lEIDMgaXMgZnVydGhlciBkZXNjcmliZWQgaW4gUkZDIDQzNDIsCisJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQyLnR4dAogCiAJICBUaGUgVEZSQyBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtcyB3ZXJlIGluaXRpYWxseSBkZXNjcmliZWQgaW4KIAkgIFJGQyAzNDQ4LgogCi0JICBUaGlzIHRleHQgd2FzIGV4dHJhY3RlZCBmcm9tOgotCSAgaHR0cDovL3d3dy5pY2lyLm9yZy9rb2hsZXIvZGNjcC9kcmFmdC1pZXRmLWRjY3Atc3BlYy0xMy50eHQKKwkgIFRoaXMgdGV4dCB3YXMgZXh0cmFjdGVkIGZyb20gUkZDIDQzNDAgKHNlYy4gMTAuMiksCisJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQwLnR4dAogCSAgCisJICBUbyBjb21waWxlIHRoaXMgQ0NJRCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZGNjcF9jY2lkMy4KKwogCSAgSWYgaW4gZG91YnQsIHNheSBNLgogCiBjb25maWcgSVBfRENDUF9URlJDX0xJQgogCWRlcGVuZHMgb24gSVBfRENDUF9DQ0lEMwogCWRlZl90cmlzdGF0ZSBJUF9EQ0NQX0NDSUQzCiAKK2NvbmZpZyBJUF9EQ0NQX0NDSUQzX0RFQlVHCisJICBib29sICJDQ0lEMyBkZWJ1Z2dpbmcgbWVzc2FnZXMiCisJICBkZXBlbmRzIG9uIElQX0RDQ1BfQ0NJRDMKKwkgIC0tLWhlbHAtLS0KKwkgICAgRW5hYmxlIENDSUQzLXNwZWNpZmljIGRlYnVnZ2luZyBtZXNzYWdlcy4KKworCSAgICBXaGVuIGNvbXBpbGluZyBDQ0lEMyBhcyBhIG1vZHVsZSwgdGhpcyBkZWJ1Z2dpbmcgb3V0cHV0IGNhbgorCSAgICBhZGRpdGlvbmFsbHkgYmUgdG9nZ2xlZCBieSBzZXR0aW5nIHRoZSBjY2lkM19kZWJ1ZyBtb2R1bGUKKwkgICAgcGFyYW1ldGVyIHRvIDAgb3IgMS4KKworCSAgICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBJUF9EQ0NQX0NDSUQzX1JUTworCSAgaW50ICJVc2UgaGlnaGVyIGJvdW5kIGZvciBub2ZlZWRiYWNrIHRpbWVyIgorCSAgZGVmYXVsdCAxMDAKKwkgIGRlcGVuZHMgb24gSVBfRENDUF9DQ0lEMyAmJiBFWFBFUklNRU5UQUwKKwkgIC0tLWhlbHAtLS0KKwkgICAgVXNlIGhpZ2hlciBsb3dlciBib3VuZCBmb3Igbm9mZWVkYmFjayB0aW1lciBleHBpcmF0aW9uLgorCisJICAgIFRoZSBURlJDIG5vZmVlZGJhY2sgdGltZXIgbm9ybWFsbHkgZXhwaXJlcyBhZnRlciB0aGUgbWF4aW11bSBvZiA0CisJICAgIFJUVHMgYW5kIHR3aWNlIHRoZSBjdXJyZW50IHNlbmQgaW50ZXJ2YWwgKFJGQyAzNDQ4LCA0LjMpLiBPbiBMQU5zCisJICAgIHdpdGggYSBzbWFsbCBSVFQgdGhpcyBjYW4gbWVhbiBhIGhpZ2ggcHJvY2Vzc2luZyBsb2FkIGFuZCByZWR1Y2VkCisJICAgIHBlcmZvcm1hbmNlLCBzaW5jZSB0aGVuIHRoZSBub2ZlZWRiYWNrIHRpbWVyIGlzIHRyaWdnZXJlZCB2ZXJ5CisJICAgIGZyZXF1ZW50bHkuCisKKwkgICAgVGhpcyBvcHRpb24gZW5hYmxlcyB0byBzZXQgYSBoaWdoZXIgbG93ZXIgYm91bmQgZm9yIHRoZSBub2ZlZWRiYWNrCisJICAgIHZhbHVlLiBWYWx1ZXMgaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzIGNhbiBiZSBzZXQgaGVyZS4KKworCSAgICBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgdGhpcyBmZWF0dXJlIGJ5IGVuZm9yY2luZyB0aGUgdmFsdWUgc3BlY2lmaWVkCisJICAgIGluIFJGQyAzNDQ4LiBUaGUgZm9sbG93aW5nIHZhbHVlcyBoYXZlIGJlZW4gc3VnZ2VzdGVkIGFzIGJvdW5kcyBmb3IKKwkgICAgZXhwZXJpbWVudGFsIHVzZToKKwkgICAgCSogMTYtMjBtcyB0byBtYXRjaCB0aGUgdHlwaWNhbCBtdWx0aW1lZGlhIGludGVyLWZyYW1lIGludGVydmFsCisJICAgIAkqIDEwMG1zIGFzIGEgcmVhc29uYWJsZSBjb21wcm9taXNlIFtkZWZhdWx0XQorCSAgICAJKiAxMDAwbXMgY29ycmVzcG9uZHMgdG8gdGhlIGxvd2VyIFRDUCBSVE8gYm91bmQgKFJGQyAyOTg4LCAyLjQpCisKKwkgICAgVGhlIGRlZmF1bHQgb2YgMTAwbXMgaXMgYSBjb21wcm9taXNlIGJldHdlZW4gYSBsYXJnZSB2YWx1ZSBmb3IKKwkgICAgZWZmaWNpZW50IERDQ1AgaW1wbGVtZW50YXRpb25zLCBhbmQgYSBzbWFsbCB2YWx1ZSB0byBhdm9pZCBkaXNydXB0aW5nCisJICAgIHRoZSBuZXR3b3JrIGluIHRpbWVzIG9mIGNvbmdlc3Rpb24uCisKKwkgICAgVGhlIHB1cnBvc2Ugb2YgdGhlIG5vZmVlZGJhY2sgdGltZXIgaXMgdG8gc2xvdyBEQ0NQIGRvd24gd2hlbiB0aGVyZQorCSAgICBpcyBzZXJpb3VzIG5ldHdvcmsgY29uZ2VzdGlvbjogZXhwZXJpbWVudGluZyB3aXRoIGxhcmdlciB2YWx1ZXMgc2hvdWxkCisJICAgIHRoZXJlZm9yZSBub3QgYmUgcGVyZm9ybWVkIG9uIFdBTnMuCisKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYyBiL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMKaW5kZXggMmVmYjUwNS4uZmQzOGIwNSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYworKysgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jCkBAIC0yMyw3ICsyMyw3IEBACiAgKi8KIAogLyoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGZvbGxvdzogZHJhZnQtaWV0Zi1kY2NwLWNjaWQyLTEwLnR4dAorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZm9sbG93IFJGQyA0MzQxCiAgKgogICogQlVHUzoKICAqIC0gc2VxdWVuY2UgbnVtYmVyIHdyYXBwaW5nCkBAIC0zMywxOCArMzMsMTEgQEAKICNpbmNsdWRlICIuLi9kY2NwLmgiCiAjaW5jbHVkZSAiY2NpZDIuaCIKIAorCisjaWZkZWYgQ09ORklHX0lQX0RDQ1BfQ0NJRDJfREVCVUcKIHN0YXRpYyBpbnQgY2NpZDJfZGVidWc7CisjZGVmaW5lIGNjaWQyX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikJRENDUF9QUl9ERUJVRyhjY2lkMl9kZWJ1ZywgZm9ybWF0LCAjI2EpCiAKLSNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEMl9ERUJVRwotI2RlZmluZSBjY2lkMl9wcl9kZWJ1Zyhmb3JtYXQsIGEuLi4pIFwKLSAgICAgICAgZG8geyBpZiAoY2NpZDJfZGVidWcpIFwKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0LCBfX0ZVTkNUSU9OX18sICMjYSk7IFwKLSAgICAgICAgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIGNjaWQyX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0lQX0RDQ1BfQ0NJRDJfREVCVUcKIHN0YXRpYyB2b2lkIGNjaWQyX2hjX3R4X2NoZWNrX3Nhbml0eShjb25zdCBzdHJ1Y3QgY2NpZDJfaGNfdHhfc29jayAqaGN0eCkKIHsKIAlpbnQgbGVuID0gMDsKQEAgLTg2LDcgKzc5LDggQEAKIAlCVUdfT04obGVuICE9IGhjdHgtPmNjaWQyaGN0eF9zZXFidWZjICogQ0NJRDJfU0VRQlVGX0xFTik7CiB9CiAjZWxzZQotI2RlZmluZSBjY2lkMl9oY190eF9jaGVja19zYW5pdHkoaGN0eCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNjaWQyX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikKKyNkZWZpbmUgY2NpZDJfaGNfdHhfY2hlY2tfc2FuaXR5KGhjdHgpCiAjZW5kaWYKIAogc3RhdGljIGludCBjY2lkMl9oY190eF9hbGxvY19zZXEoc3RydWN0IGNjaWQyX2hjX3R4X3NvY2sgKmhjdHgsIGludCBudW0sCkBAIC0xMzEsOCArMTI1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjY2lkMl9oY190eF9zZW5kX3BhY2tldChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbikKK3N0YXRpYyBpbnQgY2NpZDJfaGNfdHhfc2VuZF9wYWNrZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBjY2lkMl9oY190eF9zb2NrICpoY3R4OwogCkBAIC0yNzQsNyArMjY3LDcgQEAKIAkJICAgICAgIGppZmZpZXMgKyBoY3R4LT5jY2lkMmhjdHhfcnRvKTsKIH0KIAotc3RhdGljIHZvaWQgY2NpZDJfaGNfdHhfcGFja2V0X3NlbnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbW9yZSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIGNjaWQyX2hjX3R4X3BhY2tldF9zZW50KHN0cnVjdCBzb2NrICpzaywgaW50IG1vcmUsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAlzdHJ1Y3QgY2NpZDJfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQyX2hjX3R4X3NrKHNrKTsKQEAgLTM1MiwxNCArMzQ1LDE0IEBACiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEMl9ERUJVRwogCWNjaWQyX3ByX2RlYnVnKCJwaXBlPSVkXG4iLCBoY3R4LT5jY2lkMmhjdHhfcGlwZSk7Ci0JY2NpZDJfcHJfZGVidWcoIlNlbnQ6IHNlcT0lbGx1XG4iLCBzZXEpOworCWNjaWQyX3ByX2RlYnVnKCJTZW50OiBzZXE9JWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzZXEpOwogCWRvIHsKIAkJc3RydWN0IGNjaWQyX3NlcSAqc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXF0OwogCiAJCXdoaWxlIChzZXFwICE9IGhjdHgtPmNjaWQyaGN0eF9zZXFoKSB7CiAJCQljY2lkMl9wcl9kZWJ1Zygib3V0IHNlcT0lbGx1IGFja2VkPSVkIHRpbWU9JWx1XG4iLAotCQkJICAgICAgIAkgICAgICAgc2VxcC0+Y2NpZDJzX3NlcSwgc2VxcC0+Y2NpZDJzX2Fja2VkLAotCQkJCSAgICAgICBzZXFwLT5jY2lkMnNfc2VudCk7CisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VxcC0+Y2NpZDJzX3NlcSwKKwkJCQkgICAgICAgc2VxcC0+Y2NpZDJzX2Fja2VkLCBzZXFwLT5jY2lkMnNfc2VudCk7CiAJCQlzZXFwID0gc2VxcC0+Y2NpZDJzX25leHQ7CiAJCX0KIAl9IHdoaWxlICgwKTsKQEAgLTQyNiw3ICs0MTksNyBAQAogCXJldHVybiAtMTsKIAogb3V0X2ludmFsaWRfb3B0aW9uOgotCUJVR19PTigxKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbi4uLiBvcHRpb25zIHdlcmUgcHJldmlvdXNseSBwYXJzZWQgISAqLworCURDQ1BfQlVHKCJJbnZhbGlkIG9wdGlvbiAtIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKHByZXZpb3VzIHBhcnNpbmcpISIpOwogCXJldHVybiAtMTsKIH0KIApAQCAtNDgwLDcgKzQ3Myw4IEBACiAJCS8qIGZpcnN0IG1lYXN1cmVtZW50ICovCiAJCWlmIChoY3R4LT5jY2lkMmhjdHhfc3J0dCA9PSAtMSkgewogCQkJY2NpZDJfcHJfZGVidWcoIlI6ICVsdSBUaW1lPSVsdSBzZXE9JWxsdVxuIiwKLQkJCSAgICAgICAJICAgICAgIHIsIGppZmZpZXMsIHNlcXAtPmNjaWQyc19zZXEpOworCQkJCSAgICAgICByLCBqaWZmaWVzLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNlcXAtPmNjaWQyc19zZXEpOwogCQkJY2NpZDJfY2hhbmdlX3NydHQoaGN0eCwgcik7CiAJCQloY3R4LT5jY2lkMmhjdHhfcnR0dmFyID0gciA+PiAxOwogCQl9IGVsc2UgewpAQCAtNTI0LDggKzUxOCw4IEBACiAJCWhjdHgtPmNjaWQyaGN0eF9sYXN0cnR0ID0gamlmZmllczsKIAogCQljY2lkMl9wcl9kZWJ1Zygic3J0dDogJWxkIHJ0dHZhcjogJWxkIHJ0bzogJWxkIChIWj0lZCkgUj0lbHVcbiIsCi0JCSAgICAgICAJICAgICAgIGhjdHgtPmNjaWQyaGN0eF9zcnR0LCBoY3R4LT5jY2lkMmhjdHhfcnR0dmFyLAotCQkgICAgICAgCSAgICAgICBoY3R4LT5jY2lkMmhjdHhfcnRvLCBIWiwgcik7CisJCQkgICAgICAgaGN0eC0+Y2NpZDJoY3R4X3NydHQsIGhjdHgtPmNjaWQyaGN0eF9ydHR2YXIsCisJCQkgICAgICAgaGN0eC0+Y2NpZDJoY3R4X3J0bywgSFosIHIpOwogCQloY3R4LT5jY2lkMmhjdHhfc2VudCA9IDA7CiAJfQogCkBAIC02MTgsNyArNjEyLDE3IEBACiAJfQogCiAJYWNrbm8gPSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxOwotCXNlcXAgPSBoY3R4LT5jY2lkMmhjdHhfc2VxaC0+Y2NpZDJzX3ByZXY7CisJaWYgKGFmdGVyNDgoYWNrbm8sIGhjdHgtPmNjaWQyaGN0eF9oaWdoX2FjaykpCisJCWhjdHgtPmNjaWQyaGN0eF9oaWdoX2FjayA9IGFja25vOworCisJc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXF0OworCXdoaWxlIChiZWZvcmU0OChzZXFwLT5jY2lkMnNfc2VxLCBhY2tubykpIHsKKwkJc2VxcCA9IHNlcXAtPmNjaWQyc19uZXh0OworCQlpZiAoc2VxcCA9PSBoY3R4LT5jY2lkMmhjdHhfc2VxaCkgeworCQkJc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXFoLT5jY2lkMnNfcHJldjsKKwkJCWJyZWFrOworCQl9CisJfQogCiAJLyogSWYgaW4gc2xvdy1zdGFydCwgY3duZCBjYW4gaW5jcmVhc2UgYXQgbW9zdCBBY2sgUmF0aW8gLyAyIHBhY2tldHMgZm9yCiAJICogdGhpcyBzaW5nbGUgYWNrLiAgSSByb3VuZCB1cC4KQEAgLTYzNiw4ICs2NDAsOSBAQAogCQkJdTY0IGFja25vX2VuZF9ybDsKIAogCQkJZGNjcF9zZXRfc2Vxbm8oJmFja25vX2VuZF9ybCwgYWNrbm8gLSBybCk7Ci0JCQljY2lkMl9wcl9kZWJ1ZygiYWNrdmVjIHN0YXJ0OiVsbHUgZW5kOiVsbHVcbiIsIGFja25vLAotCQkJCSAgICAgICBhY2tub19lbmRfcmwpOworCQkJY2NpZDJfcHJfZGVidWcoImFja3ZlYyBzdGFydDolbGx1IGVuZDolbGx1XG4iLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFja25vLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFja25vX2VuZF9ybCk7CiAJCQkvKiBpZiB0aGUgc2Vxbm8gd2UgYXJlIGFuYWx5emluZyBpcyBsYXJnZXIgdGhhbiB0aGUKIAkJCSAqIGN1cnJlbnQgYWNrbm8sIHRoZW4gbW92ZSB0b3dhcmRzIHRoZSB0YWlsIG9mIG91cgogCQkJICogc2Vxbm9zLgpAQCAtNjYyLDkgKzY2Nyw5IEBACiAJCQkJLyogbmV3IHBhY2tldCByZWNlaXZlZCBvciBtYXJrZWQgKi8KIAkJCQlpZiAoc3RhdGUgIT0gRENDUF9BQ0tWRUNfU1RBVEVfTk9UX1JFQ0VJVkVEICYmCiAJCQkJICAgICFzZXFwLT5jY2lkMnNfYWNrZWQpIHsKLQkJCQkgICAgCWlmIChzdGF0ZSA9PQorCQkJCQlpZiAoc3RhdGUgPT0KIAkJCQkJICAgIERDQ1BfQUNLVkVDX1NUQVRFX0VDTl9NQVJLRUQpIHsKLQkJCQkJICAgIAljY2lkMl9jb25nZXN0aW9uX2V2ZW50KGhjdHgsCisJCQkJCQljY2lkMl9jb25nZXN0aW9uX2V2ZW50KGhjdHgsCiAJCQkJCQkJCSAgICAgICBzZXFwKTsKIAkJCQkJfSBlbHNlCiAJCQkJCQljY2lkMl9uZXdfYWNrKHNrLCBzZXFwLApAQCAtNjcyLDcgKzY3Nyw3IEBACiAKIAkJCQkJc2VxcC0+Y2NpZDJzX2Fja2VkID0gMTsKIAkJCQkJY2NpZDJfcHJfZGVidWcoIkdvdCBhY2sgZm9yICVsbHVcbiIsCi0JCQkJCSAgICAgICAJICAgICAgIHNlcXAtPmNjaWQyc19zZXEpOworCQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VxcC0+Y2NpZDJzX3NlcSk7CiAJCQkJCWNjaWQyX2hjX3R4X2RlY19waXBlKHNrKTsKIAkJCQl9CiAJCQkJaWYgKHNlcXAgPT0gaGN0eC0+Y2NpZDJoY3R4X3NlcXQpIHsKQEAgLTY5NSw3ICs3MDAsMTQgQEAKIAkvKiBUaGUgc3RhdGUgYWJvdXQgd2hhdCBpcyBhY2tlZCBzaG91bGQgYmUgY29ycmVjdCBub3cKIAkgKiBDaGVjayBmb3IgTlVNRFVQQUNLCiAJICovCi0Jc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXFoLT5jY2lkMnNfcHJldjsKKwlzZXFwID0gaGN0eC0+Y2NpZDJoY3R4X3NlcXQ7CisJd2hpbGUgKGJlZm9yZTQ4KHNlcXAtPmNjaWQyc19zZXEsIGhjdHgtPmNjaWQyaGN0eF9oaWdoX2FjaykpIHsKKwkJc2VxcCA9IHNlcXAtPmNjaWQyc19uZXh0OworCQlpZiAoc2VxcCA9PSBoY3R4LT5jY2lkMmhjdHhfc2VxaCkgeworCQkJc2VxcCA9IGhjdHgtPmNjaWQyaGN0eF9zZXFoLT5jY2lkMnNfcHJldjsKKwkJCWJyZWFrOworCQl9CisJfQogCWRvbmUgPSAwOwogCXdoaWxlICgxKSB7CiAJCWlmIChzZXFwLT5jY2lkMnNfYWNrZWQpIHsKQEAgLTcxOCw3ICs3MzAsNyBAQAogCQl3aGlsZSAoMSkgewogCQkJaWYgKCFzZXFwLT5jY2lkMnNfYWNrZWQpIHsKIAkJCQljY2lkMl9wcl9kZWJ1ZygiUGFja2V0IGxvc3Q6ICVsbHVcbiIsCi0JCQkJCSAgICAgICBzZXFwLT5jY2lkMnNfc2VxKTsKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2VxcC0+Y2NpZDJzX3NlcSk7CiAJCQkJLyogWFhYIG5lZWQgdG8gdHJhdmVyc2UgZnJvbSB0YWlsIC0+IGhlYWQgaW4KIAkJCQkgKiBvcmRlciB0byBkZXRlY3QgbXVsdGlwbGUgY29uZ2VzdGlvbiBldmVudHMgaW4KIAkJCQkgKiBvbmUgYWNrIHZlY3Rvci4KQEAgLTc2OSw2ICs3ODEsNyBAQAogCWhjdHgtPmNjaWQyaGN0eF9sYXN0cnR0ICA9IDA7CiAJaGN0eC0+Y2NpZDJoY3R4X3JwZHVwYWNrID0gLTE7CiAJaGN0eC0+Y2NpZDJoY3R4X2xhc3RfY29uZyA9IGppZmZpZXM7CisJaGN0eC0+Y2NpZDJoY3R4X2hpZ2hfYWNrID0gMDsKIAogCWhjdHgtPmNjaWQyaGN0eF9ydG90aW1lci5mdW5jdGlvbiA9ICZjY2lkMl9oY190eF9ydG9fZXhwaXJlOwogCWhjdHgtPmNjaWQyaGN0eF9ydG90aW1lci5kYXRhCSAgPSAodW5zaWduZWQgbG9uZylzazsKQEAgLTgyMSw4ICs4MzQsMTAgQEAKIAkuY2NpZF9oY19yeF9wYWNrZXRfcmVjdgk9IGNjaWQyX2hjX3J4X3BhY2tldF9yZWN2LAogfTsKIAorI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQyX0RFQlVHCiBtb2R1bGVfcGFyYW0oY2NpZDJfZGVidWcsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNjaWQyX2RlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisjZW5kaWYKIAogc3RhdGljIF9faW5pdCBpbnQgY2NpZDJfbW9kdWxlX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmggYi9uZXQvZGNjcC9jY2lkcy9jY2lkMi5oCmluZGV4IDViMmVmNGEuLmViZDc5NDkgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQyLmgKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDIuaApAQCAtMzUsNyArMzUsNyBAQAogCXN0cnVjdCBjY2lkMl9zZXEJKmNjaWQyc19uZXh0OwogfTsKIAotI2RlZmluZSBDQ0lEMl9TRVFCVUZfTEVOIDI1NgorI2RlZmluZSBDQ0lEMl9TRVFCVUZfTEVOIDEwMjQKICNkZWZpbmUgQ0NJRDJfU0VRQlVGX01BWCAxMjgKIAogLyoqIHN0cnVjdCBjY2lkMl9oY190eF9zb2NrIC0gQ0NJRDIgVFggaGFsZiBjb25uZWN0aW9uCkBAIC03Miw2ICs3Miw3IEBACiAJaW50CQkJY2NpZDJoY3R4X3JwZHVwYWNrOwogCWludAkJCWNjaWQyaGN0eF9zZW5kd2FpdDsKIAl1bnNpZ25lZCBsb25nCQljY2lkMmhjdHhfbGFzdF9jb25nOworCXU2NAkJCWNjaWQyaGN0eF9oaWdoX2FjazsKIH07CiAKIHN0cnVjdCBjY2lkMl9oY19yeF9zb2NrIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCmluZGV4IDY3ZDJkYzAuLjQwNDAyYzUgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwpAQCAtNDEsMzIgKzQxLDkgQEAKICNpbmNsdWRlICJsaWIvdGZyYy5oIgogI2luY2x1ZGUgImNjaWQzLmgiCiAKLS8qCi0gKiBSZWFzb24gZm9yIG1hdGhzIGhlcmUgaXMgdG8gYXZvaWQgMzIgYml0IG92ZXJmbG93IHdoZW4gYSBpcyBiaWcuCi0gKiBXaXRoIHRoaXMgd2UgZ2V0IGNsb3NlIHRvIHRoZSBsaW1pdC4KLSAqLwotc3RhdGljIHUzMiB1c2Vjc19kaXYoY29uc3QgdTMyIGEsIGNvbnN0IHUzMiBiKQotewotCWNvbnN0IHUzMiBkaXYgPSBhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAgIDEwKSkgPyAgICAxMCA6Ci0JCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAgIDUwKSkgPyAgICA1MCA6Ci0JCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAgMTAwKSkgPyAgIDEwMCA6Ci0JCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAgNTAwKSkgPyAgIDUwMCA6Ci0JCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICAxMDAwKSkgPyAgMTAwMCA6Ci0JCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvICA1MDAwKSkgPyAgNTAwMCA6Ci0JCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvIDEwMDAwKSkgPyAxMDAwMCA6Ci0JCQlhIDwgKFVJTlRfTUFYIC8gKFVTRUNfUEVSX1NFQyAvIDUwMDAwKSkgPyA1MDAwMCA6Ci0JCQkJCQkJCSAxMDAwMDA7Ci0JY29uc3QgdTMyIHRtcCA9IGEgKiAoVVNFQ19QRVJfU0VDIC8gZGl2KTsKLQlyZXR1cm4gKGIgPj0gMiAqIGRpdikgPyB0bXAgLyAoYiAvIGRpdikgOiB0bXA7Ci19Ci0KKyNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEM19ERUJVRwogc3RhdGljIGludCBjY2lkM19kZWJ1ZzsKLQotI2lmZGVmIENDSUQzX0RFQlVHCi0jZGVmaW5lIGNjaWQzX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikgXAotCWRvIHsgaWYgKGNjaWQzX2RlYnVnKSBcCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsIF9fRlVOQ1RJT05fXywgIyNhKTsgXAotCX0gd2hpbGUgKDApCisjZGVmaW5lIGNjaWQzX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikJRENDUF9QUl9ERUJVRyhjY2lkM19kZWJ1ZywgZm9ybWF0LCAjI2EpCiAjZWxzZQogI2RlZmluZSBjY2lkM19wcl9kZWJ1Zyhmb3JtYXQsIGEuLi4pCiAjZW5kaWYKQEAgLTc1LDE1ICs1Miw3IEBACiBzdGF0aWMgc3RydWN0IGRjY3BfcnhfaGlzdCAqY2NpZDNfcnhfaGlzdDsKIHN0YXRpYyBzdHJ1Y3QgZGNjcF9saV9oaXN0ICpjY2lkM19saV9oaXN0OwogCi0vKiBURlJDIHNlbmRlciBzdGF0ZXMgKi8KLWVudW0gY2NpZDNfaGNfdHhfc3RhdGVzIHsKLSAgICAgICAJVEZSQ19TU1RBVEVfTk9fU0VOVCA9IDEsCi0JVEZSQ19TU1RBVEVfTk9fRkJBQ0ssCi0JVEZSQ19TU1RBVEVfRkJBQ0ssCi0JVEZSQ19TU1RBVEVfVEVSTSwKLX07Ci0KLSNpZmRlZiBDQ0lEM19ERUJVRworI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzX0RFQlVHCiBzdGF0aWMgY29uc3QgY2hhciAqY2NpZDNfdHhfc3RhdGVfbmFtZShlbnVtIGNjaWQzX2hjX3R4X3N0YXRlcyBzdGF0ZSkKIHsKIAlzdGF0aWMgY2hhciAqY2NpZDNfc3RhdGVfbmFtZXNbXSA9IHsKQEAgLTExMCwzMjUgKzc5LDMxOSBAQAogCWhjdHgtPmNjaWQzaGN0eF9zdGF0ZSA9IHN0YXRlOwogfQogCi0vKiBDYWxjdWxhdGUgbmV3IHRfaXBpIChpbnRlciBwYWNrZXQgaW50ZXJ2YWwpIGJ5IHRfaXBpID0gcyAvIFhfaW5zdCAqLwotc3RhdGljIGlubGluZSB2b2lkIGNjaWQzX2NhbGNfbmV3X3RfaXBpKHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4KQorLyoKKyAqIFJlY2FsY3VsYXRlIHNjaGVkdWxlZCBub21pbmFsIHNlbmQgdGltZSB0X25vbSwgaW50ZXItcGFja2V0IGludGVydmFsCisgKiB0X2lwaSwgYW5kIGRlbHRhIHZhbHVlLiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIGVhY2ggY2hhbmdlIHRvIFguCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjY2lkM191cGRhdGVfc2VuZF90aW1lKHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4KQogewotCS8qCi0JICogSWYgbm8gZmVlZGJhY2sgc3BlYyBzYXlzIHRfaXBpIGlzIDEgc2Vjb25kIChzZXQgZWxzZXdoZXJlIGFuZCB0aGVuCi0JICogZG91YmxlcyBhZnRlciBldmVyeSBubyBmZWVkYmFjayB0aW1lciAoc2VwYXJhdGUgZnVuY3Rpb24pCi0JICovCi0JaWYgKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSAhPSBURlJDX1NTVEFURV9OT19GQkFDSykKLQkJaGN0eC0+Y2NpZDNoY3R4X3RfaXBpID0gdXNlY3NfZGl2KGhjdHgtPmNjaWQzaGN0eF9zLAotCQkJCQkJICBoY3R4LT5jY2lkM2hjdHhfeCk7Ci19CisJdGltZXZhbF9zdWJfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKIAotLyogQ2FsY3VsYXRlIG5ldyBkZWx0YSBieSBkZWx0YSA9IG1pbih0X2lwaSAvIDIsIHRfZ3JhbiAvIDIpICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2NpZDNfY2FsY19uZXdfZGVsdGEoc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHgpCi17CisJLyogQ2FsY3VsYXRlIG5ldyB0X2lwaSA9IHMgLyBYX2luc3QgKFhfaW5zdCBpcyBpbiA2NCAqIGJ5dGVzL3NlY29uZCkgKi8KKwloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSBzY2FsZWRfZGl2KGhjdHgtPmNjaWQzaGN0eF9zLAorCQkJCQkgICBoY3R4LT5jY2lkM2hjdHhfeCA+PiA2KTsKKworCS8qIFVwZGF0ZSBub21pbmFsIHNlbmQgdGltZSB3aXRoIHJlZ2FyZCB0byB0aGUgbmV3IHRfaXBpICovCisJdGltZXZhbF9hZGRfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKKworCS8qIENhbGN1bGF0ZSBuZXcgZGVsdGEgYnkgZGVsdGEgPSBtaW4odF9pcGkgLyAyLCB0X2dyYW4gLyAyKSAqLwogCWhjdHgtPmNjaWQzaGN0eF9kZWx0YSA9IG1pbl90KHUzMiwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpIC8gMiwKIAkJCQkJICAgVEZSQ19PUFNZU19IQUxGX1RJTUVfR1JBTik7CiB9Ci0KIC8qCiAgKiBVcGRhdGUgWCBieQogICogICAgSWYgKHAgPiAwKQotICogICAgICAgeF9jYWxjID0gY2FsY1gocywgUiwgcCk7CisgKiAgICAgICBYX2NhbGMgPSBjYWxjWChzLCBSLCBwKTsKICAqICAgICAgIFggPSBtYXgobWluKFhfY2FsYywgMiAqIFhfcmVjdiksIHMgLyB0X21iaSk7CiAgKiAgICBFbHNlCiAgKiAgICAgICBJZiAobm93IC0gdGxkID49IFIpCiAgKiAgICAgICAgICBYID0gbWF4KG1pbigyICogWCwgMiAqIFhfcmVjdiksIHMgLyBSKTsKICAqICAgICAgICAgIHRsZCA9IG5vdzsKLSAqLyAKLXN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X3VwZGF0ZV94KHN0cnVjdCBzb2NrICpzaykKKyAqCisgKiBOb3RlOiBYIGFuZCBYX3JlY3YgYXJlIGJvdGggc3RvcmVkIGluIHVuaXRzIG9mIDY0ICogYnl0ZXMvc2Vjb25kLCB0byBzdXBwb3J0CisgKiAgICAgICBmaW5lLWdyYWluZWQgcmVzb2x1dGlvbiBvZiBzZW5kaW5nIHJhdGVzLiBUaGlzIHJlcXVpcmVzIHNjYWxpbmcgYnkgMl42CisgKiAgICAgICB0aHJvdWdob3V0IHRoZSBjb2RlLiBPbmx5IFhfY2FsYyBpcyB1bnNjYWxlZCAoaW4gYnl0ZXMvc2Vjb25kKS4KKyAqCisgKiBJZiBYIGhhcyBjaGFuZ2VkLCB3ZSBhbHNvIHVwZGF0ZSB0aGUgc2NoZWR1bGVkIHNlbmQgdGltZSB0X25vdywKKyAqIHRoZSBpbnRlci1wYWNrZXQgaW50ZXJ2YWwgdF9pcGksIGFuZCB0aGUgZGVsdGEgdmFsdWUuCisgKi8KK3N0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X3VwZGF0ZV94KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgKm5vdykKKwogewogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOworCWNvbnN0ICBfX3U2NCBvbGRfeCA9IGhjdHgtPmNjaWQzaGN0eF94OwogCi0JLyogVG8gYXZvaWQgbGFyZ2UgZXJyb3IgaW4gY2FsY1ggKi8KLQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3AgPj0gVEZSQ19TTUFMTEVTVF9QKSB7Ci0JCWhjdHgtPmNjaWQzaGN0eF94X2NhbGMgPSB0ZnJjX2NhbGNfeChoY3R4LT5jY2lkM2hjdHhfcywKLQkJCQkJCSAgICAgaGN0eC0+Y2NpZDNoY3R4X3J0dCwKLQkJCQkJCSAgICAgaGN0eC0+Y2NpZDNoY3R4X3ApOwotCQloY3R4LT5jY2lkM2hjdHhfeCA9IG1heF90KHUzMiwgbWluX3QodTMyLCBoY3R4LT5jY2lkM2hjdHhfeF9jYWxjLAotCQkJCQkJCSAgMiAqIGhjdHgtPmNjaWQzaGN0eF94X3JlY3YpLAotCQkJCQkgICAgICAgKGhjdHgtPmNjaWQzaGN0eF9zIC8KLQkJCQkJICAgICAgICBURlJDX01BWF9CQUNLX09GRl9USU1FKSk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHRpbWV2YWwgbm93OworCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA+IDApIHsKIAotCQlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7Ci0JICAgICAgIAlpZiAodGltZXZhbF9kZWx0YSgmbm93LCAmaGN0eC0+Y2NpZDNoY3R4X3RfbGQpID49Ci0JCSAgICBoY3R4LT5jY2lkM2hjdHhfcnR0KSB7Ci0JCQloY3R4LT5jY2lkM2hjdHhfeCA9IG1heF90KHUzMiwgbWluX3QodTMyLCBoY3R4LT5jY2lkM2hjdHhfeF9yZWN2LAotCQkJCQkJCQkgIGhjdHgtPmNjaWQzaGN0eF94KSAqIDIsCi0JCQkJCQkgICAgICAgdXNlY3NfZGl2KGhjdHgtPmNjaWQzaGN0eF9zLAotCQkJCQkJCSAgICAgICAJIGhjdHgtPmNjaWQzaGN0eF9ydHQpKTsKLQkJCWhjdHgtPmNjaWQzaGN0eF90X2xkID0gbm93OwotCQl9CisJCWhjdHgtPmNjaWQzaGN0eF94ID0gbWluKCgoX191NjQpaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYykgPDwgNiwKKwkJCQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiAqIDIpOworCQloY3R4LT5jY2lkM2hjdHhfeCA9IG1heChoY3R4LT5jY2lkM2hjdHhfeCwKKwkJCQkJKCgoX191NjQpaGN0eC0+Y2NpZDNoY3R4X3MpIDw8IDYpIC8KKwkJCQkJCQkJVEZSQ19UX01CSSk7CisKKwl9IGVsc2UgaWYgKHRpbWV2YWxfZGVsdGEobm93LCAmaGN0eC0+Y2NpZDNoY3R4X3RfbGQpIC0KKwkJCShzdXNlY29uZHNfdCloY3R4LT5jY2lkM2hjdHhfcnR0ID49IDApIHsKKworCQloY3R4LT5jY2lkM2hjdHhfeCA9CisJCQltYXgoMiAqIG1pbihoY3R4LT5jY2lkM2hjdHhfeCwgaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiksCisJCQkgICAgc2NhbGVkX2RpdigoKF9fdTY0KWhjdHgtPmNjaWQzaGN0eF9zKSA8PCA2LAorCQkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfcnR0KSk7CisJCWhjdHgtPmNjaWQzaGN0eF90X2xkID0gKm5vdzsKKwl9CisKKwlpZiAoaGN0eC0+Y2NpZDNoY3R4X3ggIT0gb2xkX3gpCisJCWNjaWQzX3VwZGF0ZV9zZW5kX3RpbWUoaGN0eCk7Cit9CisKKy8qCisgKglUcmFjayB0aGUgbWVhbiBwYWNrZXQgc2l6ZSBgcycgKGNmLiBSRkMgNDM0MiwgNS4zIGFuZCAgUkZDIDM0NDgsIDQuMSkKKyAqCUBsZW46IERDQ1AgcGFja2V0IHBheWxvYWQgc2l6ZSBpbiBieXRlcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2NpZDNfaGNfdHhfdXBkYXRlX3Moc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHgsIGludCBsZW4pCit7CisJaWYgKHVubGlrZWx5KGxlbiA9PSAwKSkKKwkJY2NpZDNfcHJfZGVidWcoIlBhY2tldCBwYXlsb2FkIGxlbmd0aCBpcyAwIC0gbm90IHVwZGF0aW5nXG4iKTsKKwllbHNlCisJCWhjdHgtPmNjaWQzaGN0eF9zID0gaGN0eC0+Y2NpZDNoY3R4X3MgPT0gMCA/IGxlbiA6CisJCQkJICAgICg5ICogaGN0eC0+Y2NpZDNoY3R4X3MgKyBsZW4pIC8gMTA7CisJLyoKKwkgKiBOb3RlOiBXZSBjb3VsZCBkbyBhIHBvdGVudGlhbCBvcHRpbWlzYXRpb24gaGVyZSAtIHdoZW4gYHMnIGNoYW5nZXMsCisJICoJIHJlY2FsY3VsYXRlIHNlbmRpbmcgcmF0ZSBhbmQgY29uc2VxdWVudGx5IHRfaXBpLCB0X2RlbHRhLCBhbmQKKwkgKgkgdF9ub3cuIFRoaXMgaXMgaG93ZXZlciBub24tc3RhbmRhcmQsIGFuZCB0aGUgYmVuZWZpdHMgYXJlIG5vdAorCSAqCSBjbGVhciwgc28gaXQgaXMgY3VycmVudGx5IGxlZnQgb3V0LgorCSAqLworfQorCisvKgorICoJVXBkYXRlIFdpbmRvdyBDb3VudGVyIHVzaW5nIHRoZSBhbGdvcml0aG0gZnJvbSBbUkZDIDQzNDIsIDguMV0uCisgKglUaGUgYWxnb3JpdGhtIGlzIG5vdCBhcHBsaWNhYmxlIGlmIFJUVCA8IDQgbWljcm9zZWNvbmRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2NpZDNfaGNfdHhfdXBkYXRlX3dpbl9jb3VudChzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCwKKwkJCQkJCXN0cnVjdCB0aW1ldmFsICpub3cpCit7CisJc3VzZWNvbmRzX3QgZGVsdGE7CisJdTMyIHF1YXJ0ZXJfcnR0czsKKworCWlmICh1bmxpa2VseShoY3R4LT5jY2lkM2hjdHhfcnR0IDwgNCkpCS8qIGF2b2lkIGRpdmlkZS1ieS16ZXJvICovCisJCXJldHVybjsKKworCWRlbHRhID0gdGltZXZhbF9kZWx0YShub3csICZoY3R4LT5jY2lkM2hjdHhfdF9sYXN0X3dpbl9jb3VudCk7CisJRENDUF9CVUdfT04oZGVsdGEgPCAwKTsKKworCXF1YXJ0ZXJfcnR0cyA9ICh1MzIpZGVsdGEgLyAoaGN0eC0+Y2NpZDNoY3R4X3J0dCAvIDQpOworCisJaWYgKHF1YXJ0ZXJfcnR0cyA+IDApIHsKKwkJaGN0eC0+Y2NpZDNoY3R4X3RfbGFzdF93aW5fY291bnQgPSAqbm93OworCQloY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQJKz0gbWluX3QodTMyLCBxdWFydGVyX3J0dHMsIDUpOworCQloY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQJJj0gMHhGOwkJLyogbW9kIDE2ICovCisKKwkJY2NpZDNfcHJfZGVidWcoIm5vdyBhdCAlI1hcbiIsIGhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudCk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF9ub19mZWVkYmFja190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopZGF0YTsKLQl1bnNpZ25lZCBsb25nIG5leHRfdG1vdXQgPSAwOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOworCXVuc2lnbmVkIGxvbmcgdF9uZmIgPSBVU0VDX1BFUl9TRUMgLyA1OwogCiAJYmhfbG9ja19zb2NrKHNrKTsKIAlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgewogCQkvKiBUcnkgYWdhaW4gbGF0ZXIuICovCiAJCS8qIFhYWDogc2V0IHNvbWUgc2Vuc2libGUgTUlCICovCi0JCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyLAotCQkJICAgICAgIGppZmZpZXMgKyBIWiAvIDUpOwotCQlnb3RvIG91dDsKKwkJZ290byByZXN0YXJ0X3RpbWVyOwogCX0KIAotCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIHN0YXRlPSVzXG4iLCBkY2NwX3JvbGUoc2spLCBzaywKKwljY2lkM19wcl9kZWJ1ZygiJXMoJXAsIHN0YXRlPSVzKSAtIGVudHJ5IFxuIiwgZGNjcF9yb2xlKHNrKSwgc2ssCiAJCSAgICAgICBjY2lkM190eF9zdGF0ZV9uYW1lKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSkpOwotCQotCXN3aXRjaCAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSB7Ci0JY2FzZSBURlJDX1NTVEFURV9URVJNOgotCQlnb3RvIG91dDsKLQljYXNlIFRGUkNfU1NUQVRFX05PX0ZCQUNLOgotCQkvKiBIYWx2ZSBzZW5kIHJhdGUgKi8KLQkJaGN0eC0+Y2NpZDNoY3R4X3ggLz0gMjsKLQkJaWYgKGhjdHgtPmNjaWQzaGN0eF94IDwgKGhjdHgtPmNjaWQzaGN0eF9zIC8KLQkJCQkJIFRGUkNfTUFYX0JBQ0tfT0ZGX1RJTUUpKQotCQkJaGN0eC0+Y2NpZDNoY3R4X3ggPSAoaGN0eC0+Y2NpZDNoY3R4X3MgLwotCQkJCQkgICAgIFRGUkNfTUFYX0JBQ0tfT0ZGX1RJTUUpOwogCi0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIHN0YXRlPSVzLCB1cGRhdGVkIHR4IHJhdGUgdG8gJWQgIgotCQkJICAgICAgICJieXRlcy9zXG4iLAotCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAorCXN3aXRjaCAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSB7CisJY2FzZSBURlJDX1NTVEFURV9OT19GQkFDSzoKKwkJLyogUkZDIDM0NDgsIDQuNDogSGFsdmUgc2VuZCByYXRlIGRpcmVjdGx5ICovCisJCWhjdHgtPmNjaWQzaGN0eF94ID0gbWF4KGhjdHgtPmNjaWQzaGN0eF94IC8gMiwKKwkJCQkJKCgoX191NjQpaGN0eC0+Y2NpZDNoY3R4X3MpIDw8IDYpIC8KKwkJCQkJCQkJICAgIFRGUkNfVF9NQkkpOworCisJCWNjaWQzX3ByX2RlYnVnKCIlcyglcCwgc3RhdGU9JXMpLCB1cGRhdGVkIHR4IHJhdGUgdG8gJXUgIgorCQkJICAgICAgICJieXRlcy9zXG4iLCBkY2NwX3JvbGUoc2spLCBzaywKIAkJCSAgICAgICBjY2lkM190eF9zdGF0ZV9uYW1lKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSksCi0JCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3gpOwotCQluZXh0X3Rtb3V0ID0gbWF4X3QodTMyLCAyICogdXNlY3NfZGl2KGhjdHgtPmNjaWQzaGN0eF9zLAotCQkJCQkJICAgICAgaGN0eC0+Y2NpZDNoY3R4X3gpLAotCQkJCQlURlJDX0lOSVRJQUxfVElNRU9VVCk7Ci0JCS8qCi0JCSAqIEZJWE1FIC0gbm90IHN1cmUgYWJvdmUgY2FsY3VsYXRpb24gaXMgY29ycmVjdC4gU2VlIHNlY3Rpb24KLQkJICogNSBvZiBDQ0lEMyAxMSBzaG91bGQgYWRqdXN0IHR4X3RfaXBpIGFuZCBkb3VibGUgdGhhdCB0bwotCQkgKiBhY2hpZXZlIGl0IHJlYWxseQotCQkgKi8KKwkJCSAgICAgICAodW5zaWduZWQpKGhjdHgtPmNjaWQzaGN0eF94ID4+IDYpKTsKKwkJLyogVGhlIHZhbHVlIG9mIFIgaXMgc3RpbGwgdW5kZWZpbmVkIGFuZCBzbyB3ZSBjYW4gbm90IHJlY29tcHV0ZQorCQkgKiB0aGUgdGltb3V0IHZhbHVlLiBLZWVwIGluaXRpYWwgdmFsdWUgYXMgcGVyIFtSRkMgNDM0MiwgNV0uICovCisJCXRfbmZiID0gVEZSQ19JTklUSUFMX1RJTUVPVVQ7CisJCWNjaWQzX3VwZGF0ZV9zZW5kX3RpbWUoaGN0eCk7CiAJCWJyZWFrOwogCWNhc2UgVEZSQ19TU1RBVEVfRkJBQ0s6CiAJCS8qCiAJCSAqIENoZWNrIGlmIElETEUgc2luY2UgbGFzdCB0aW1lb3V0IGFuZCByZWN2IHJhdGUgaXMgbGVzcyB0aGFuCi0JCSAqIDQgcGFja2V0cyBwZXIgUlRUCisJCSAqIDQgcGFja2V0cyAoaW4gdW5pdHMgb2YgNjQqYnl0ZXMvc2VjKSBwZXIgUlRUCiAJCSAqLwogCQlpZiAoIWhjdHgtPmNjaWQzaGN0eF9pZGxlIHx8Ci0JCSAgICAoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA+PQotCQkgICAgIDQgKiB1c2Vjc19kaXYoaGN0eC0+Y2NpZDNoY3R4X3MsIGhjdHgtPmNjaWQzaGN0eF9ydHQpKSkgewotCQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgc3RhdGU9JXMsIG5vdCBpZGxlXG4iLAotCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywKLQkJCQkgICAgICAgY2NpZDNfdHhfc3RhdGVfbmFtZShoY3R4LT5jY2lkM2hjdHhfc3RhdGUpKTsKLQkJCS8qIEhhbHZlIHNlbmRpbmcgcmF0ZSAqLworCQkgICAgKGhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPj0gNCAqCisJCSAgICAgc2NhbGVkX2RpdigoKF9fdTY0KWhjdHgtPmNjaWQzaGN0eF9zKSA8PCA2LAorCQkJCWhjdHgtPmNjaWQzaGN0eF9ydHQpKSkgeworCQkJc3RydWN0IHRpbWV2YWwgbm93OwogCi0JCQkvKiAgSWYgKFhfY2FsYyA+IDIgKiBYX3JlY3YpCisJCQljY2lkM19wcl9kZWJ1ZygiJXMoJXAsIHN0YXRlPSVzKSwgbm90IGlkbGVcbiIsCisJCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAorCQkJCSAgIGNjaWQzX3R4X3N0YXRlX25hbWUoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSk7CisKKwkJCS8qCisJCQkgKiAgTW9kaWZ5IHRoZSBjYWNoZWQgdmFsdWUgb2YgWF9yZWN2IFtSRkMgMzQ0OCwgNC40XQorCQkJICoKKwkJCSAqICBJZiAocCA9PSAwIHx8IFhfY2FsYyA+IDIgKiBYX3JlY3YpCiAJCQkgKiAgICBYX3JlY3YgPSBtYXgoWF9yZWN2IC8gMiwgcyAvICgyICogdF9tYmkpKTsKIAkJCSAqICBFbHNlCiAJCQkgKiAgICBYX3JlY3YgPSBYX2NhbGMgLyA0OworCQkJICoKKwkJCSAqICBOb3RlIHRoYXQgWF9yZWN2IGlzIHNjYWxlZCBieSAyXjYgd2hpbGUgWF9jYWxjIGlzIG5vdAogCQkJICovCi0JCQlCVUdfT04oaGN0eC0+Y2NpZDNoY3R4X3AgPj0gVEZSQ19TTUFMTEVTVF9QICYmCi0JCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYyA9PSAwKTsKKwkJCUJVR19PTihoY3R4LT5jY2lkM2hjdHhfcCAmJiAhaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYyk7CiAKLQkJCS8qIGNoZWNrIGFsc28gaWYgcCBpcyB6ZXJvIC0+IHhfY2FsYyBpcyBpbmZpbml0eT8gKi8KLQkJCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA8IFRGUkNfU01BTExFU1RfUCB8fAotCQkJICAgIGhjdHgtPmNjaWQzaGN0eF94X2NhbGMgPiAyICogaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdikKLQkJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID0gbWF4X3QodTMyLCBoY3R4LT5jY2lkM2hjdHhfeF9yZWN2IC8gMiwKLQkJCQkJCQkJICAgIGhjdHgtPmNjaWQzaGN0eF9zIC8gKDIgKiBURlJDX01BWF9CQUNLX09GRl9USU1FKSk7Ci0JCQllbHNlCi0JCQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA9IGhjdHgtPmNjaWQzaGN0eF94X2NhbGMgLyA0OworCQkJaWYgKGhjdHgtPmNjaWQzaGN0eF9wICA9PSAwIHx8CisJCQkgICAgKGhjdHgtPmNjaWQzaGN0eF94X2NhbGMgPgorCQkJICAgICAoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA+PiA1KSkpIHsKIAotCQkJLyogVXBkYXRlIHNlbmRpbmcgcmF0ZSAqLwotCQkJY2NpZDNfaGNfdHhfdXBkYXRlX3goc2spOworCQkJCWhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPQorCQkJCQltYXgoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiAvIDIsCisJCQkJCSAgICAoKChfX3U2NCloY3R4LT5jY2lkM2hjdHhfcykgPDwgNikgLworCQkJCQkJCSAgKDIgKiBURlJDX1RfTUJJKSk7CisKKwkJCQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3AgPT0gMCkKKwkJCQkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOworCQkJfSBlbHNlIHsKKwkJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID0gaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYzsKKwkJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2IDw8PSA0OworCQkJfQorCQkJLyogTm93IHJlY2FsY3VsYXRlIFggW1JGQyAzNDQ4LCA0LjMsIHN0ZXAgKDQpXSAqLworCQkJY2NpZDNfaGNfdHhfdXBkYXRlX3goc2ssICZub3cpOwogCQl9CiAJCS8qCiAJCSAqIFNjaGVkdWxlIG5vIGZlZWRiYWNrIHRpbWVyIHRvIGV4cGlyZSBpbgotCQkgKiBtYXgoNCAqIFIsIDIgKiBzIC8gWCkKKwkJICogbWF4KHRfUlRPLCAyICogcy9YKSAgPSAgbWF4KHRfUlRPLCAyICogdF9pcGkpCisJCSAqIFNlZSBjb21tZW50cyBpbiBwYWNrZXRfcmVjdigpIHJlZ2FyZGluZyB0aGUgdmFsdWUgb2YgdF9SVE8uCiAJCSAqLwotCQluZXh0X3Rtb3V0ID0gbWF4X3QodTMyLCBoY3R4LT5jY2lkM2hjdHhfdF9ydG8sIAotCQkJCQkyICogdXNlY3NfZGl2KGhjdHgtPmNjaWQzaGN0eF9zLAotCQkJCQkJICAgICAgaGN0eC0+Y2NpZDNoY3R4X3gpKTsKKwkJdF9uZmIgPSBtYXgoaGN0eC0+Y2NpZDNoY3R4X3RfcnRvLCAyICogaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6ICVzLCBzaz0lcCwgSWxsZWdhbCBzdGF0ZSAoJWQpIVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2ssIGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSk7Ci0JCWR1bXBfc3RhY2soKTsKKwljYXNlIFRGUkNfU1NUQVRFX05PX1NFTlQ6CisJCURDQ1BfQlVHKCIlcyglcCkgLSBJbGxlZ2FsIHN0YXRlIE5PX1NFTlQiLCBkY2NwX3JvbGUoc2spLCBzayk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVEZSQ19TU1RBVEVfVEVSTToKIAkJZ290byBvdXQ7CiAJfQogCi0Jc2tfcmVzZXRfdGltZXIoc2ssICZoY3R4LT5jY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIsIAotCQkgICAgICBqaWZmaWVzICsgbWF4X3QodTMyLCAxLCB1c2Vjc190b19qaWZmaWVzKG5leHRfdG1vdXQpKSk7CiAJaGN0eC0+Y2NpZDNoY3R4X2lkbGUgPSAxOworCityZXN0YXJ0X3RpbWVyOgorCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyLAorCQkgICAgICAgICAgIGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHRfbmZiKSk7CiBvdXQ6CiAJYmhfdW5sb2NrX3NvY2soc2spOwogCXNvY2tfcHV0KHNrKTsKIH0KIAotc3RhdGljIGludCBjY2lkM19oY190eF9zZW5kX3BhY2tldChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbikKKy8qCisgKiByZXR1cm5zCisgKiAgID4gMDogZGVsYXkgKGluIG1zZWNzKSB0aGF0IHNob3VsZCBwYXNzIGJlZm9yZSBhY3R1YWxseSBzZW5kaW5nCisgKiAgID0gMDogY2FuIHNlbmQgaW1tZWRpYXRlbHkKKyAqICAgPCAwOiBlcnJvciBjb25kaXRpb247IGRvIG5vdCBzZW5kIHBhY2tldAorICovCitzdGF0aWMgaW50IGNjaWQzX2hjX3R4X3NlbmRfcGFja2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwotCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKm5ld19wYWNrZXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwotCWxvbmcgZGVsYXk7Ci0JaW50IHJjID0gLUVOT1RDT05OOworCXN1c2Vjb25kc190IGRlbGF5OwogCi0JQlVHX09OKGhjdHggPT0gTlVMTCB8fCBoY3R4LT5jY2lkM2hjdHhfc3RhdGUgPT0gVEZSQ19TU1RBVEVfVEVSTSk7CisJQlVHX09OKGhjdHggPT0gTlVMTCk7CiAKLQkvKiBDaGVjayBpZiBwdXJlIEFDSyBvciBUZXJtaW5hdGluZyovCiAJLyoKLQkgKiBYWFg6IFdlIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBEQVRBIGFuZCBEQVRBQUNLLCBvbiwgdGhlc2UKLQkgKiBwYWNrZXRzIGNhbiBoYXZlIHplcm8gbGVuZ3RoLCBidXQgd2h5IHRoZSBjb21tZW50IGFib3V0ICJwdXJlIEFDSyI/CisJICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBmb3IgRGF0YSBhbmQgRGF0YUFjayBwYWNrZXRzLiBTZW5kaW5nCisJICogemVyby1zaXplZCBEYXRhKEFjaylzIGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUsIGJ1dCBmb3IgY29uZ2VzdGlvbgorCSAqIGNvbnRyb2wgdGhpcyBjYXNlIGlzIHBhdGhvbG9naWNhbCAtIGlnbm9yZSBpdC4KIAkgKi8KLQlpZiAodW5saWtlbHkobGVuID09IDApKQotCQlnb3RvIG91dDsKLQotCS8qIFNlZSBpZiBsYXN0IHBhY2tldCBhbGxvY2F0ZWQgd2FzIG5vdCBzZW50ICovCi0JbmV3X3BhY2tldCA9IGRjY3BfdHhfaGlzdF9oZWFkKCZoY3R4LT5jY2lkM2hjdHhfaGlzdCk7Ci0JaWYgKG5ld19wYWNrZXQgPT0gTlVMTCB8fCBuZXdfcGFja2V0LT5kY2NwaHR4X3NlbnQpIHsKLQkJbmV3X3BhY2tldCA9IGRjY3BfdHhfaGlzdF9lbnRyeV9uZXcoY2NpZDNfdHhfaGlzdCwKLQkJCQkJCSAgICBTTEFCX0FUT01JQyk7Ci0KLQkJcmMgPSAtRU5PQlVGUzsKLQkJaWYgKHVubGlrZWx5KG5ld19wYWNrZXQgPT0gTlVMTCkpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgbm90IGVub3VnaCAiCi0JCQkJICAgICAgICJtZW0gdG8gYWRkIHRvIGhpc3RvcnksIHNlbmQgcmVmdXNlZFxuIiwKLQkJCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzayk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWRjY3BfdHhfaGlzdF9hZGRfZW50cnkoJmhjdHgtPmNjaWQzaGN0eF9oaXN0LCBuZXdfcGFja2V0KTsKLQl9CisJaWYgKHVubGlrZWx5KHNrYi0+bGVuID09IDApKQorCQlyZXR1cm4gLUVCQURNU0c7CiAKIAlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7CiAKIAlzd2l0Y2ggKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSkgewogCWNhc2UgVEZSQ19TU1RBVEVfTk9fU0VOVDoKIAkJc2tfcmVzZXRfdGltZXIoc2ssICZoY3R4LT5jY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIsCi0JCQkgICAgICAgamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXMoVEZSQ19JTklUSUFMX1RJTUVPVVQpKTsKKwkJCSAgICAgICAoamlmZmllcyArCisJCQkgICAgICAgIHVzZWNzX3RvX2ppZmZpZXMoVEZSQ19JTklUSUFMX1RJTUVPVVQpKSk7CiAJCWhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudAkgPSAwOwogCQloY3R4LT5jY2lkM2hjdHhfdF9sYXN0X3dpbl9jb3VudCA9IG5vdzsKIAkJY2NpZDNfaGNfdHhfc2V0X3N0YXRlKHNrLCBURlJDX1NTVEFURV9OT19GQkFDSyk7Ci0JCWhjdHgtPmNjaWQzaGN0eF90X2lwaSA9IFRGUkNfSU5JVElBTF9JUEk7CiAKLQkJLyogU2V0IG5vbWluYWwgc2VuZCB0aW1lIGZvciBpbml0aWFsIHBhY2tldCAqLworCQkvKiBTZXQgaW5pdGlhbCBzZW5kaW5nIHJhdGUgWC9zIHRvIDFwcHMgKFggaXMgc2NhbGVkIGJ5IDJeNikgKi8KKwkJY2NpZDNfaGNfdHhfdXBkYXRlX3MoaGN0eCwgc2tiLT5sZW4pOworCQloY3R4LT5jY2lkM2hjdHhfeCA9IGhjdHgtPmNjaWQzaGN0eF9zOworCQloY3R4LT5jY2lkM2hjdHhfeCA8PD0gNjsKKworCQkvKiBGaXJzdCB0aW1lb3V0LCBhY2NvcmRpbmcgdG8gW1JGQyAzNDQ4LCA0LjJdLCBpcyAxIHNlY29uZCAqLworCQloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSBVU0VDX1BFUl9TRUM7CisJCS8qIEluaXRpYWwgZGVsdGE6IG1pbmltdW0gb2YgMC41IHNlYyBhbmQgdF9ncmFuLzIgKi8KKwkJaGN0eC0+Y2NpZDNoY3R4X2RlbHRhID0gVEZSQ19PUFNZU19IQUxGX1RJTUVfR1JBTjsKKworCQkvKiBTZXQgdF8wIGZvciBpbml0aWFsIHBhY2tldCAqLwogCQloY3R4LT5jY2lkM2hjdHhfdF9ub20gPSBub3c7Ci0JCXRpbWV2YWxfYWRkX3VzZWNzKCZoY3R4LT5jY2lkM2hjdHhfdF9ub20sCi0JCQkJICBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOwotCQljY2lkM19jYWxjX25ld19kZWx0YShoY3R4KTsKLQkJcmMgPSAwOwogCQlicmVhazsKIAljYXNlIFRGUkNfU1NUQVRFX05PX0ZCQUNLOgogCWNhc2UgVEZSQ19TU1RBVEVfRkJBQ0s6Ci0JCWRlbGF5ID0gKHRpbWV2YWxfZGVsdGEoJm5vdywgJmhjdHgtPmNjaWQzaGN0eF90X25vbSkgLQotCQkgICAgICAgICBoY3R4LT5jY2lkM2hjdHhfZGVsdGEpOwotCQlkZWxheSAvPSAtMTAwMDsKLQkJLyogZGl2aWRlIGJ5IC0xMDAwIGlzIHRvIGNvbnZlcnQgdG8gbXMgYW5kIGdldCBzaWduIHJpZ2h0ICovCi0JCXJjID0gZGVsYXkgPiAwID8gZGVsYXkgOiAwOworCQlkZWxheSA9IHRpbWV2YWxfZGVsdGEoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgJm5vdyk7CisJCS8qCisJCSAqCVNjaGVkdWxpbmcgb2YgcGFja2V0IHRyYW5zbWlzc2lvbnMgW1JGQyAzNDQ4LCA0LjZdCisJCSAqCisJCSAqIGlmICh0X25vdyA+IHRfbm9tIC0gZGVsdGEpCisJCSAqICAgICAgIC8vIHNlbmQgdGhlIHBhY2tldCBub3cKKwkJICogZWxzZQorCQkgKiAgICAgICAvLyBzZW5kIHRoZSBwYWNrZXQgaW4gKHRfbm9tIC0gdF9ub3cpIG1pbGxpc2Vjb25kcy4KKwkJICovCisJCWlmIChkZWxheSAtIChzdXNlY29uZHNfdCloY3R4LT5jY2lkM2hjdHhfZGVsdGEgPj0gMCkKKwkJCXJldHVybiBkZWxheSAvIDEwMDBMOworCisJCWNjaWQzX2hjX3R4X3VwZGF0ZV93aW5fY291bnQoaGN0eCwgJm5vdyk7CiAJCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0NSSVQgIiVzOiAlcywgc2s9JXAsIElsbGVnYWwgc3RhdGUgKCVkKSFcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrLCBoY3R4LT5jY2lkM2hjdHhfc3RhdGUpOwotCQlkdW1wX3N0YWNrKCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7CisJY2FzZSBURlJDX1NTVEFURV9URVJNOgorCQlEQ0NQX0JVRygiJXMoJXApIC0gSWxsZWdhbCBzdGF0ZSBURVJNIiwgZGNjcF9yb2xlKHNrKSwgc2spOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiBDYW4gd2Ugc2VuZD8gaWYgc28gYWRkIG9wdGlvbnMgYW5kIGFkZCB0byBwYWNrZXQgaGlzdG9yeSAqLwotCWlmIChyYyA9PSAwKSB7Ci0JCWRwLT5kY2Nwc19oY190eF9pbnNlcnRfb3B0aW9ucyA9IDE7Ci0JCW5ld19wYWNrZXQtPmRjY3BodHhfY2N2YWwgPQotCQkJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfY2N2YWwgPQotCQkJCWhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudDsKLQkJdGltZXZhbF9hZGRfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwKLQkJCQkgIGhjdHgtPmNjaWQzaGN0eF90X2lwaSk7Ci0JfQotb3V0OgotCXJldHVybiByYzsKKwkvKiBwcmVwYXJlIHRvIHNlbmQgbm93IChhZGQgb3B0aW9ucyBldGMuKSAqLworCWRwLT5kY2Nwc19oY190eF9pbnNlcnRfb3B0aW9ucyA9IDE7CisJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfY2N2YWwgPSBoY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQ7CisKKwkvKiBzZXQgdGhlIG5vbWluYWwgc2VuZCB0aW1lIGZvciB0aGUgbmV4dCBmb2xsb3dpbmcgcGFja2V0ICovCisJdGltZXZhbF9hZGRfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjY2lkM19oY190eF9wYWNrZXRfc2VudChzdHJ1Y3Qgc29jayAqc2ssIGludCBtb3JlLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgY2NpZDNfaGNfdHhfcGFja2V0X3NlbnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbW9yZSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGxlbikKIHsKLQljb25zdCBzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpwYWNrZXQ7CiAKLQlCVUdfT04oaGN0eCA9PSBOVUxMIHx8IGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSA9PSBURlJDX1NTVEFURV9URVJNKTsKKwlCVUdfT04oaGN0eCA9PSBOVUxMKTsKKworCWNjaWQzX2hjX3R4X3VwZGF0ZV9zKGhjdHgsIGxlbik7CisKKwlwYWNrZXQgPSBkY2NwX3R4X2hpc3RfZW50cnlfbmV3KGNjaWQzX3R4X2hpc3QsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseShwYWNrZXQgPT0gTlVMTCkpIHsKKwkJRENDUF9DUklUKCJwYWNrZXQgaGlzdG9yeSAtIG91dCBvZiBtZW1vcnkhIik7CisJCXJldHVybjsKKwl9CisJZGNjcF90eF9oaXN0X2FkZF9lbnRyeSgmaGN0eC0+Y2NpZDNoY3R4X2hpc3QsIHBhY2tldCk7CiAKIAlkY2NwX3RpbWVzdGFtcChzaywgJm5vdyk7Ci0KLQkvKiBjaGVjayBpZiB3ZSBoYXZlIHNlbnQgYSBkYXRhIHBhY2tldCAqLwotCWlmIChsZW4gPiAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcXVhcnRlcl9ydHQ7Ci0JCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKnBhY2tldDsKLQotCQlwYWNrZXQgPSBkY2NwX3R4X2hpc3RfaGVhZCgmaGN0eC0+Y2NpZDNoY3R4X2hpc3QpOwotCQlpZiAodW5saWtlbHkocGFja2V0ID09IE5VTEwpKSB7Ci0JCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiBwYWNrZXQgZG9lc24ndCAiCi0JCQkJICAgICAgICJleGlzdHMgaW4gaGlzdG9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHVubGlrZWx5KHBhY2tldC0+ZGNjcGh0eF9zZW50KSkgewotCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogbm8gdW5zZW50IHBhY2tldCBpbiAiCi0JCQkJICAgICAgICJoaXN0b3J5IVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXJldHVybjsKLQkJfQotCQlwYWNrZXQtPmRjY3BodHhfdHN0YW1wID0gbm93OwotCQlwYWNrZXQtPmRjY3BodHhfc2Vxbm8gID0gZHAtPmRjY3BzX2dzczsKLQkJLyoKLQkJICogQ2hlY2sgaWYgd2luX2NvdW50IGhhdmUgY2hhbmdlZAotCQkgKiBBbGdvcml0aG0gaW4gIjguMS4gV2luZG93IENvdW50ZXIgVmFsdWVyIiBpbgotCQkgKiBkcmFmdC1pZXRmLWRjY3AtY2NpZDMtMTEudHh0Ci0JCSAqLwotCQlxdWFydGVyX3J0dCA9IHRpbWV2YWxfZGVsdGEoJm5vdywgJmhjdHgtPmNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50KTsKLQkJaWYgKGxpa2VseShoY3R4LT5jY2lkM2hjdHhfcnR0ID4gOCkpCi0JCQlxdWFydGVyX3J0dCAvPSBoY3R4LT5jY2lkM2hjdHhfcnR0IC8gNDsKLQotCQlpZiAocXVhcnRlcl9ydHQgPiAwKSB7Ci0JCQloY3R4LT5jY2lkM2hjdHhfdF9sYXN0X3dpbl9jb3VudCA9IG5vdzsKLQkJCWhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudAkgPSAoaGN0eC0+Y2NpZDNoY3R4X2xhc3Rfd2luX2NvdW50ICsKLQkJCQkJCQkgICAgbWluX3QodW5zaWduZWQgbG9uZywgcXVhcnRlcl9ydHQsIDUpKSAlIDE2OwotCQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgd2luZG93IGNoYW5nZWQgZnJvbSAiCi0JCQkJICAgICAgICIldSB0byAldSFcbiIsCi0JCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAotCQkJCSAgICAgICBwYWNrZXQtPmRjY3BodHhfY2N2YWwsCi0JCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudCk7Ci0JCX0KLQotCQloY3R4LT5jY2lkM2hjdHhfaWRsZSA9IDA7Ci0JCXBhY2tldC0+ZGNjcGh0eF9ydHQgID0gaGN0eC0+Y2NpZDNoY3R4X3J0dDsKLQkJcGFja2V0LT5kY2NwaHR4X3NlbnQgPSAxOwotCX0gZWxzZQotCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBzZXFubz0lbGx1IE5PVCBpbnNlcnRlZCFcbiIsCi0JCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2ssIGRwLT5kY2Nwc19nc3MpOwotCi0Jc3dpdGNoIChoY3R4LT5jY2lkM2hjdHhfc3RhdGUpIHsKLQljYXNlIFRGUkNfU1NUQVRFX05PX1NFTlQ6Ci0JCS8qIGlmIGZpcnN0IHdhc24ndCBwdXJlIGFjayAqLwotCQlpZiAobGVuICE9IDApCi0JCQlwcmludGsoS0VSTl9DUklUICIlczogJXMsIEZpcnN0IHBhY2tldCBzZW50IGlzIG5vdGVkICIKLQkJCQkJICJhcyBhIGRhdGEgcGFja2V0XG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSk7Ci0JCXJldHVybjsKLQljYXNlIFRGUkNfU1NUQVRFX05PX0ZCQUNLOgotCWNhc2UgVEZSQ19TU1RBVEVfRkJBQ0s6Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQl0aW1ldmFsX3N1Yl91c2VjcygmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tLAotCQkJCSAgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKLQkJCWNjaWQzX2NhbGNfbmV3X3RfaXBpKGhjdHgpOwotCQkJY2NpZDNfY2FsY19uZXdfZGVsdGEoaGN0eCk7Ci0JCQl0aW1ldmFsX2FkZF91c2VjcygmaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tLAotCQkJCQkgIGhjdHgtPmNjaWQzaGN0eF90X2lwaSk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6ICVzLCBzaz0lcCwgSWxsZWdhbCBzdGF0ZSAoJWQpIVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2ssIGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSk7Ci0JCWR1bXBfc3RhY2soKTsKLQkJYnJlYWs7Ci0JfQorCXBhY2tldC0+ZGNjcGh0eF90c3RhbXAgPSBub3c7CisJcGFja2V0LT5kY2NwaHR4X3NlcW5vICA9IGRjY3Bfc2soc2spLT5kY2Nwc19nc3M7CisJcGFja2V0LT5kY2NwaHR4X3J0dCAgICA9IGhjdHgtPmNjaWQzaGN0eF9ydHQ7CisJcGFja2V0LT5kY2NwaHR4X3NlbnQgICA9IDE7CisJaGN0eC0+Y2NpZDNoY3R4X2lkbGUgICA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X3BhY2tldF9yZWN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTQzOCwxMyArNDAxLDExIEBACiAJc3RydWN0IGNjaWQzX29wdGlvbnNfcmVjZWl2ZWQgKm9wdF9yZWN2OwogCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKnBhY2tldDsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7Ci0JdW5zaWduZWQgbG9uZyBuZXh0X3Rtb3V0OyAKLQl1MzIgdF9lbGFwc2VkOworCXVuc2lnbmVkIGxvbmcgdF9uZmI7CiAJdTMyIHBpbnY7Ci0JdTMyIHhfcmVjdjsKLQl1MzIgcl9zYW1wbGU7CisJc3VzZWNvbmRzX3Qgcl9zYW1wbGUsIHRfZWxhcHNlZDsKIAotCUJVR19PTihoY3R4ID09IE5VTEwgfHwgaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX1RFUk0pOworCUJVR19PTihoY3R4ID09IE5VTEwpOwogCiAJLyogd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBBQ0tzICovCiAJaWYgKCEoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSA9PSBEQ0NQX1BLVF9BQ0sgfHwKQEAgLTQ1Myw0MSArNDE0LDQ5IEBACiAKIAlvcHRfcmVjdiA9ICZoY3R4LT5jY2lkM2hjdHhfb3B0aW9uc19yZWNlaXZlZDsKIAotCXRfZWxhcHNlZCA9IGRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkLmRjY3Bvcl9lbGFwc2VkX3RpbWUgKiAxMDsKLQl4X3JlY3YgPSBvcHRfcmVjdi0+Y2NpZDNvcl9yZWNlaXZlX3JhdGU7Ci0JcGludiA9IG9wdF9yZWN2LT5jY2lkM29yX2xvc3NfZXZlbnRfcmF0ZTsKLQogCXN3aXRjaCAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSB7Ci0JY2FzZSBURlJDX1NTVEFURV9OT19TRU5UOgotCQkvKiBGSVhNRTogd2hhdCB0byBkbyBoZXJlPyAqLwotCQlyZXR1cm47CiAJY2FzZSBURlJDX1NTVEFURV9OT19GQkFDSzoKIAljYXNlIFRGUkNfU1NUQVRFX0ZCQUNLOgotCQkvKiBDYWxjdWxhdGUgbmV3IHJvdW5kIHRyaXAgc2FtcGxlIGJ5Ci0JCSAqIFJfc2FtcGxlID0gKG5vdyAtIHRfcmVjdmRhdGEpIC0gdF9kZWxheSAqLwotCQkvKiBnZXQgdF9yZWN2ZGF0YSBmcm9tIGhpc3RvcnkgKi8KKwkJLyogZ2V0IHBhY2tldCBmcm9tIGhpc3RvcnkgdG8gbG9vayB1cCB0X3JlY3ZkYXRhICovCiAJCXBhY2tldCA9IGRjY3BfdHhfaGlzdF9maW5kX2VudHJ5KCZoY3R4LT5jY2lkM2hjdHhfaGlzdCwKLQkJCQkJCSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxKTsKKwkJCQkJICAgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSk7CiAJCWlmICh1bmxpa2VseShwYWNrZXQgPT0gTlVMTCkpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgc2Vxbm8gIgotCQkJCSAgICAgICAiJWxsdSglcykgZG9lcyd0IGV4aXN0IGluIGhpc3RvcnkhXG4iLAotCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrLAorCQkJRENDUF9XQVJOKCIlcyglcCksIHNlcW5vICVsbHUoJXMpIGRvZXNuJ3QgZXhpc3QgIgorCQkJCSAgImluIGhpc3RvcnkhXG4iLCAgZGNjcF9yb2xlKHNrKSwgc2ssCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxLAogCQkJCWRjY3BfcGFja2V0X25hbWUoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSkpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJLyogVXBkYXRlIFJUVCAqLworCQkvKiBVcGRhdGUgcmVjZWl2ZSByYXRlIGluIHVuaXRzIG9mIDY0ICogYnl0ZXMvc2Vjb25kICovCisJCWhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPSBvcHRfcmVjdi0+Y2NpZDNvcl9yZWNlaXZlX3JhdGU7CisJCWhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPDw9IDY7CisKKwkJLyogVXBkYXRlIGxvc3MgZXZlbnQgcmF0ZSAqLworCQlwaW52ID0gb3B0X3JlY3YtPmNjaWQzb3JfbG9zc19ldmVudF9yYXRlOworCQlpZiAocGludiA9PSB+MFUgfHwgcGludiA9PSAwKQkgICAgICAgLyogc2VlIFJGQyA0MzQyLCA4LjUgICAqLworCQkJaGN0eC0+Y2NpZDNoY3R4X3AgPSAwOworCQllbHNlCQkJCSAgICAgICAvKiBjYW4gbm90IGV4Y2VlZCAxMDAlICovCisJCQloY3R4LT5jY2lkM2hjdHhfcCA9IDEwMDAwMDAgLyBwaW52OworCiAJCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKLQkJcl9zYW1wbGUgPSB0aW1ldmFsX2RlbHRhKCZub3csICZwYWNrZXQtPmRjY3BodHhfdHN0YW1wKTsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgbmV3IHJvdW5kIHRyaXAgc2FtcGxlIGFzIHBlciBbUkZDIDM0NDgsIDQuM10gYnkKKwkJICoJUl9zYW1wbGUgID0gIChub3cgLSB0X3JlY3ZkYXRhKSAtIHRfZWxhcHNlZAorCQkgKi8KKwkJcl9zYW1wbGUgID0gdGltZXZhbF9kZWx0YSgmbm93LCAmcGFja2V0LT5kY2NwaHR4X3RzdGFtcCk7CisJCXRfZWxhcHNlZCA9IGRwLT5kY2Nwc19vcHRpb25zX3JlY2VpdmVkLmRjY3Bvcl9lbGFwc2VkX3RpbWUgKiAxMDsKKworCQlEQ0NQX0JVR19PTihyX3NhbXBsZSA8IDApOwogCQlpZiAodW5saWtlbHkocl9zYW1wbGUgPD0gdF9lbGFwc2VkKSkKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IHJfc2FtcGxlPSV1dXMsICIKLQkJCQkgICAgICAgInRfZWxhcHNlZD0ldXVzXG4iLAotCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJfc2FtcGxlLCB0X2VsYXBzZWQpOworCQkJRENDUF9XQVJOKCJXQVJOSU5HOiByX3NhbXBsZT0lZHVzIDw9IHRfZWxhcHNlZD0lZHVzXG4iLAorCQkJCSAgKGludClyX3NhbXBsZSwgKGludCl0X2VsYXBzZWQpOwogCQllbHNlCiAJCQlyX3NhbXBsZSAtPSB0X2VsYXBzZWQ7CisJCUNDSUQzX1JUVF9TQU5JVFlfQ0hFQ0socl9zYW1wbGUpOwogCi0JCS8qIFVwZGF0ZSBSVFQgZXN0aW1hdGUgYnkgCisJCS8qIFVwZGF0ZSBSVFQgZXN0aW1hdGUgYnkKIAkJICogSWYgKE5vIGZlZWRiYWNrIHJlY3YpCiAJCSAqICAgIFIgPSBSX3NhbXBsZTsKIAkJICogRWxzZQpAQCAtNDk2LDk3ICs0NjUsOTYgQEAKIAkJICogcSBpcyBhIGNvbnN0YW50LCBSRkMgMzQ0OCByZWNvbW1lbnRzIDAuOQogCQkgKi8KIAkJaWYgKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSA9PSBURlJDX1NTVEFURV9OT19GQkFDSykgeworCQkJLyoKKwkJCSAqIExhcmdlciBJbml0aWFsIFdpbmRvd3MgW1JGQyA0MzQyLCBzZWMuIDVdCisJCQkgKiBXZSBkZXZpYXRlIGluIHRoYXQgd2UgdXNlIGBzJyBpbnN0ZWFkIG9mIGBNU1MnLgorCQkJICovCisJCQlfX3U2NCB3X2luaXQgPSBtaW4oNCAqIGhjdHgtPmNjaWQzaGN0eF9zLAorCQkJCQkgICBtYXgoMiAqIGhjdHgtPmNjaWQzaGN0eF9zLCA0MzgwKSk7CisJCQloY3R4LT5jY2lkM2hjdHhfcnR0ICA9IHJfc2FtcGxlOworCQkJaGN0eC0+Y2NpZDNoY3R4X3ggICAgPSBzY2FsZWRfZGl2KHdfaW5pdCA8PCA2LCByX3NhbXBsZSk7CisJCQloY3R4LT5jY2lkM2hjdHhfdF9sZCA9IG5vdzsKKworCQkJY2NpZDNfdXBkYXRlX3NlbmRfdGltZShoY3R4KTsKKworCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgcz0ldSwgd19pbml0PSVsbHUsICIKKwkJCQkgICAgICAgIlJfc2FtcGxlPSVkdXMsIFg9JXVcbiIsIGRjY3Bfcm9sZShzayksCisJCQkJICAgICAgIHNrLCBoY3R4LT5jY2lkM2hjdHhfcywgd19pbml0LAorCQkJCSAgICAgICAoaW50KXJfc2FtcGxlLAorCQkJCSAgICAgICAodW5zaWduZWQpKGhjdHgtPmNjaWQzaGN0eF94ID4+IDYpKTsKKwogCQkJY2NpZDNfaGNfdHhfc2V0X3N0YXRlKHNrLCBURlJDX1NTVEFURV9GQkFDSyk7Ci0JCQloY3R4LT5jY2lkM2hjdHhfcnR0ID0gcl9zYW1wbGU7Ci0JCX0gZWxzZQotCQkJaGN0eC0+Y2NpZDNoY3R4X3J0dCA9IChoY3R4LT5jY2lkM2hjdHhfcnR0ICogOSkgLyAxMCArCi0JCQkJCSAgICAgIHJfc2FtcGxlIC8gMTA7CisJCX0gZWxzZSB7CisJCQloY3R4LT5jY2lkM2hjdHhfcnR0ID0gKDkgKiBoY3R4LT5jY2lkM2hjdHhfcnR0ICsKKwkJCQkJICAgICAgICAgICAodTMyKXJfc2FtcGxlKSAvIDEwOwogCi0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIE5ldyBSVFQgZXN0aW1hdGU9JXV1cywgIgotCQkJICAgICAgICJyX3NhbXBsZT0ldXNcbiIsIGRjY3Bfcm9sZShzayksIHNrLAotCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9ydHQsIHJfc2FtcGxlKTsKKwkJCS8qIFVwZGF0ZSBzZW5kaW5nIHJhdGUgKHN0ZXAgNCBvZiBbUkZDIDM0NDgsIDQuM10pICovCisJCQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3AgPiAwKQorCQkJCWhjdHgtPmNjaWQzaGN0eF94X2NhbGMgPQorCQkJCQl0ZnJjX2NhbGNfeChoY3R4LT5jY2lkM2hjdHhfcywKKwkJCQkJCSAgICBoY3R4LT5jY2lkM2hjdHhfcnR0LAorCQkJCQkJICAgIGhjdHgtPmNjaWQzaGN0eF9wKTsKKwkJCWNjaWQzX2hjX3R4X3VwZGF0ZV94KHNrLCAmbm93KTsKIAotCQkvKiBVcGRhdGUgdGltZW91dCBpbnRlcnZhbCAqLwotCQloY3R4LT5jY2lkM2hjdHhfdF9ydG8gPSBtYXhfdCh1MzIsIDQgKiBoY3R4LT5jY2lkM2hjdHhfcnR0LAotCQkJCQkgICAgICBVU0VDX1BFUl9TRUMpOwotCi0JCS8qIFVwZGF0ZSByZWNlaXZlIHJhdGUgKi8KLQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA9IHhfcmVjdjsvKiBYX3JlY3YgaW4gYnl0ZXMgcGVyIHNlYyAqLwotCi0JCS8qIFVwZGF0ZSBsb3NzIGV2ZW50IHJhdGUgKi8KLQkJaWYgKHBpbnYgPT0gfjAgfHwgcGludiA9PSAwKQotCQkJaGN0eC0+Y2NpZDNoY3R4X3AgPSAwOwotCQllbHNlIHsKLQkJCWhjdHgtPmNjaWQzaGN0eF9wID0gMTAwMDAwMCAvIHBpbnY7Ci0KLQkJCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA8IFRGUkNfU01BTExFU1RfUCkgewotCQkJCWhjdHgtPmNjaWQzaGN0eF9wID0gVEZSQ19TTUFMTEVTVF9QOwotCQkJCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIFNtYWxsZXN0IHAgdXNlZCFcbiIsCi0JCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzayk7Ci0JCQl9CisJCQljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCBSVFQ9JXV1cyAoc2FtcGxlPSVkdXMpLCBzPSV1LCAiCisJCQkJICAgICAgICJwPSV1LCBYX2NhbGM9JXUsIFhfcmVjdj0ldSwgWD0ldVxuIiwKKwkJCQkgICAgICAgZGNjcF9yb2xlKHNrKSwKKwkJCQkgICAgICAgc2ssIGhjdHgtPmNjaWQzaGN0eF9ydHQsIChpbnQpcl9zYW1wbGUsCisJCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9zLCBoY3R4LT5jY2lkM2hjdHhfcCwKKwkJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYywKKwkJCQkgICAgICAgKHVuc2lnbmVkKShoY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID4+IDYpLAorCQkJCSAgICAgICAodW5zaWduZWQpKGhjdHgtPmNjaWQzaGN0eF94ID4+IDYpKTsKIAkJfQogCiAJCS8qIHVuc2NoZWR1bGUgbm8gZmVlZGJhY2sgdGltZXIgKi8KIAkJc2tfc3RvcF90aW1lcihzaywgJmhjdHgtPmNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lcik7CiAKLQkJLyogVXBkYXRlIHNlbmRpbmcgcmF0ZSAqLwotCQljY2lkM19oY190eF91cGRhdGVfeChzayk7Ci0KLQkJLyogVXBkYXRlIG5leHQgc2VuZCB0aW1lICovCi0JCXRpbWV2YWxfc3ViX3VzZWNzKCZoY3R4LT5jY2lkM2hjdHhfdF9ub20sCi0JCQkJICBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOwotCQljY2lkM19jYWxjX25ld190X2lwaShoY3R4KTsKLQkJdGltZXZhbF9hZGRfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwKLQkJCQkgIGhjdHgtPmNjaWQzaGN0eF90X2lwaSk7Ci0JCWNjaWQzX2NhbGNfbmV3X2RlbHRhKGhjdHgpOwotCiAJCS8qIHJlbW92ZSBhbGwgcGFja2V0cyBvbGRlciB0aGFuIHRoZSBvbmUgYWNrZWQgZnJvbSBoaXN0b3J5ICovCiAJCWRjY3BfdHhfaGlzdF9wdXJnZV9vbGRlcihjY2lkM190eF9oaXN0LAogCQkJCQkgJmhjdHgtPmNjaWQzaGN0eF9oaXN0LCBwYWNrZXQpOwogCQkvKgotCQkgKiBBcyB3ZSBoYXZlIGNhbGN1bGF0ZWQgbmV3IGlwaSwgZGVsdGEsIHRfbm9tIGl0IGlzIHBvc3NpYmxlIHRoYXQKLQkJICogd2Ugbm93IGNhbiBzZW5kIGEgcGFja2V0LCBzbyB3YWtlIHVwIGRjY3Bfd2FpdF9mb3JfY2NpZHMuCisJCSAqIEFzIHdlIGhhdmUgY2FsY3VsYXRlZCBuZXcgaXBpLCBkZWx0YSwgdF9ub20gaXQgaXMgcG9zc2libGUKKwkJICogdGhhdCB3ZSBub3cgY2FuIHNlbmQgYSBwYWNrZXQsIHNvIHdha2UgdXAgZGNjcF93YWl0X2Zvcl9jY2lkCiAJCSAqLwogCQlzay0+c2tfd3JpdGVfc3BhY2Uoc2spOwogCiAJCS8qCi0JCSAqIFNjaGVkdWxlIG5vIGZlZWRiYWNrIHRpbWVyIHRvIGV4cGlyZSBpbgotCQkgKiBtYXgoNCAqIFIsIDIgKiBzIC8gWCkKKwkJICogVXBkYXRlIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIHRoZSBub2ZlZWRiYWNrIHRpbWVyLgorCQkgKiBXZSB1c2UgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBpbmNyZWFzZSB0aGUgbG93ZXIgYm91bmQuCisJCSAqIFRoaXMgY2FuIGhlbHAgYXZvaWQgdHJpZ2dlcmluZyB0aGUgbm9mZWVkYmFjayB0aW1lciB0b28KKwkJICogb2Z0ZW4gKCdzcGlubmluZycpIG9uIExBTnMgd2l0aCBzbWFsbCBSVFRzLgogCQkgKi8KLQkJbmV4dF90bW91dCA9IG1heChoY3R4LT5jY2lkM2hjdHhfdF9ydG8sCi0JCQkJIDIgKiB1c2Vjc19kaXYoaGN0eC0+Y2NpZDNoY3R4X3MsCi0JCQkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfeCkpOwotCQkJCi0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAsIFNjaGVkdWxlZCBubyBmZWVkYmFjayB0aW1lciB0byAiCi0JCQkgICAgICAgImV4cGlyZSBpbiAlbHUgamlmZmllcyAoJWx1dXMpXG4iLAotCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAotCQkJICAgICAgIHVzZWNzX3RvX2ppZmZpZXMobmV4dF90bW91dCksIG5leHRfdG1vdXQpOyAKKwkJaGN0eC0+Y2NpZDNoY3R4X3RfcnRvID0gbWF4X3QodTMyLCA0ICogaGN0eC0+Y2NpZDNoY3R4X3J0dCwKKwkJCQkJCSAgIENPTkZJR19JUF9EQ0NQX0NDSUQzX1JUTyAqCisJCQkJCQkgICAoVVNFQ19QRVJfU0VDLzEwMDApKTsKKwkJLyoKKwkJICogU2NoZWR1bGUgbm8gZmVlZGJhY2sgdGltZXIgdG8gZXhwaXJlIGluCisJCSAqIG1heCh0X1JUTywgMiAqIHMvWCkgID0gIG1heCh0X1JUTywgMiAqIHRfaXBpKQorCQkgKi8KKwkJdF9uZmIgPSBtYXgoaGN0eC0+Y2NpZDNoY3R4X3RfcnRvLCAyICogaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKIAotCQlza19yZXNldF90aW1lcihzaywgJmhjdHgtPmNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lciwgCi0JCQkgICAgICAgamlmZmllcyArIG1heF90KHUzMiwgMSwgdXNlY3NfdG9famlmZmllcyhuZXh0X3Rtb3V0KSkpOworCQljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCBTY2hlZHVsZWQgbm8gZmVlZGJhY2sgdGltZXIgdG8gIgorCQkJICAgICAgICJleHBpcmUgaW4gJWx1IGppZmZpZXMgKCVsdXVzKVxuIiwKKwkJCSAgICAgICBkY2NwX3JvbGUoc2spLAorCQkJICAgICAgIHNrLCB1c2Vjc190b19qaWZmaWVzKHRfbmZiKSwgdF9uZmIpOworCisJCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaGN0eC0+Y2NpZDNoY3R4X25vX2ZlZWRiYWNrX3RpbWVyLAorCQkJCSAgIGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHRfbmZiKSk7CiAKIAkJLyogc2V0IGlkbGUgZmxhZyAqLwotCQloY3R4LT5jY2lkM2hjdHhfaWRsZSA9IDE7ICAgCisJCWhjdHgtPmNjaWQzaGN0eF9pZGxlID0gMTsKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6ICVzLCBzaz0lcCwgSWxsZWdhbCBzdGF0ZSAoJWQpIVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2ssIGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSk7Ci0JCWR1bXBfc3RhY2soKTsKKwljYXNlIFRGUkNfU1NUQVRFX05PX1NFTlQ6CisJCS8qCisJCSAqIFhYWCB3aGVuIGltcGxlbWVudGluZyBiaWRpcmVjdGlvbmFsIHJ4L3R4IGNoZWNrIHRoaXMgYWdhaW4KKwkJICovCisJCURDQ1BfV0FSTigiSWxsZWdhbCBBQ0sgcmVjZWl2ZWQgLSBubyBwYWNrZXQgc2VudFxuIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVEZSQ19TU1RBVEVfVEVSTToJCS8qIGlnbm9yZSBmZWVkYmFjayB3aGVuIGNsb3NpbmcgKi8KIAkJYnJlYWs7CiAJfQogfQogCi1zdGF0aWMgaW50IGNjaWQzX2hjX3R4X2luc2VydF9vcHRpb25zKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQljb25zdCBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKLQotCUJVR19PTihoY3R4ID09IE5VTEwpOwotCi0JaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX09QRU4gfHwgc2stPnNrX3N0YXRlID09IERDQ1BfUEFSVE9QRU4pCi0JCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2NjdmFsID0gaGN0eC0+Y2NpZDNoY3R4X2xhc3Rfd2luX2NvdW50OwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGNjaWQzX2hjX3R4X3BhcnNlX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBjaGFyIG9wdGlvbiwKIAkJCQkgICAgIHVuc2lnbmVkIGNoYXIgbGVuLCB1MTYgaWR4LAogCQkJCSAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUpCkBAIC02MTEsMTMgKzU3OSwxNCBAQAogCXN3aXRjaCAob3B0aW9uKSB7CiAJY2FzZSBURlJDX09QVF9MT1NTX0VWRU5UX1JBVEU6CiAJCWlmICh1bmxpa2VseShsZW4gIT0gNCkpIHsKLQkJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6ICVzLCBzaz0lcCwgaW52YWxpZCAiCi0JCQkJICAgICAgICJsZW4gZm9yIFRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURVxuIiwKLQkJCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzayk7CisJCQlEQ0NQX1dBUk4oIiVzKCVwKSwgaW52YWxpZCBsZW4gJWQgIgorCQkJCSAgImZvciBURlJDX09QVF9MT1NTX0VWRU5UX1JBVEVcbiIsCisJCQkJICBkY2NwX3JvbGUoc2spLCBzaywgbGVuKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJfSBlbHNlIHsKLQkJCW9wdF9yZWN2LT5jY2lkM29yX2xvc3NfZXZlbnRfcmF0ZSA9IG50b2hsKCooX19iZTMyICopdmFsdWUpOwotCQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgTE9TU19FVkVOVF9SQVRFPSV1XG4iLAorCQkJb3B0X3JlY3YtPmNjaWQzb3JfbG9zc19ldmVudF9yYXRlID0KKwkJCQkJCW50b2hsKCooX19iZTMyICopdmFsdWUpOworCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgTE9TU19FVkVOVF9SQVRFPSV1XG4iLAogCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywKIAkJCQkgICAgICAgb3B0X3JlY3YtPmNjaWQzb3JfbG9zc19ldmVudF9yYXRlKTsKIAkJfQpAQCAtNjI1LDIwICs1OTQsMjEgQEAKIAljYXNlIFRGUkNfT1BUX0xPU1NfSU5URVJWQUxTOgogCQlvcHRfcmVjdi0+Y2NpZDNvcl9sb3NzX2ludGVydmFsc19pZHggPSBpZHg7CiAJCW9wdF9yZWN2LT5jY2lkM29yX2xvc3NfaW50ZXJ2YWxzX2xlbiA9IGxlbjsKLQkJY2NpZDNfcHJfZGVidWcoIiVzLCBzaz0lcCwgTE9TU19JTlRFUlZBTFM9KCV1LCAldSlcbiIsCisJCWNjaWQzX3ByX2RlYnVnKCIlcyglcCksIExPU1NfSU5URVJWQUxTPSgldSwgJXUpXG4iLAogCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAogCQkJICAgICAgIG9wdF9yZWN2LT5jY2lkM29yX2xvc3NfaW50ZXJ2YWxzX2lkeCwKIAkJCSAgICAgICBvcHRfcmVjdi0+Y2NpZDNvcl9sb3NzX2ludGVydmFsc19sZW4pOwogCQlicmVhazsKIAljYXNlIFRGUkNfT1BUX1JFQ0VJVkVfUkFURToKIAkJaWYgKHVubGlrZWx5KGxlbiAhPSA0KSkgewotCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBpbnZhbGlkICIKLQkJCQkgICAgICAgImxlbiBmb3IgVEZSQ19PUFRfUkVDRUlWRV9SQVRFXG4iLAotCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKKwkJCURDQ1BfV0FSTigiJXMoJXApLCBpbnZhbGlkIGxlbiAlZCAiCisJCQkJICAiZm9yIFRGUkNfT1BUX1JFQ0VJVkVfUkFURVxuIiwKKwkJCQkgIGRjY3Bfcm9sZShzayksIHNrLCBsZW4pOwogCQkJcmMgPSAtRUlOVkFMOwogCQl9IGVsc2UgewotCQkJb3B0X3JlY3YtPmNjaWQzb3JfcmVjZWl2ZV9yYXRlID0gbnRvaGwoKihfX2JlMzIgKil2YWx1ZSk7Ci0JCQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBSRUNFSVZFX1JBVEU9JXVcbiIsCisJCQlvcHRfcmVjdi0+Y2NpZDNvcl9yZWNlaXZlX3JhdGUgPQorCQkJCQkJbnRvaGwoKihfX2JlMzIgKil2YWx1ZSk7CisJCQljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCBSRUNFSVZFX1JBVEU9JXVcbiIsCiAJCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAogCQkJCSAgICAgICBvcHRfcmVjdi0+Y2NpZDNvcl9yZWNlaXZlX3JhdGUpOwogCQl9CkBAIC02NTAsMjIgKzYyMCwxNSBAQAogCiBzdGF0aWMgaW50IGNjaWQzX2hjX3R4X2luaXQoc3RydWN0IGNjaWQgKmNjaWQsIHN0cnVjdCBzb2NrICpzaykKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZF9wcml2KGNjaWQpOwogCi0JaWYgKGRwLT5kY2Nwc19wYWNrZXRfc2l6ZSA+PSBURlJDX01JTl9QQUNLRVRfU0laRSAmJgotCSAgICBkcC0+ZGNjcHNfcGFja2V0X3NpemUgPD0gVEZSQ19NQVhfUEFDS0VUX1NJWkUpCi0JCWhjdHgtPmNjaWQzaGN0eF9zID0gZHAtPmRjY3BzX3BhY2tldF9zaXplOwotCWVsc2UKLQkJaGN0eC0+Y2NpZDNoY3R4X3MgPSBURlJDX1NURF9QQUNLRVRfU0laRTsKLQotCS8qIFNldCB0cmFuc21pc3Npb24gcmF0ZSB0byAxIHBhY2tldCBwZXIgc2Vjb25kICovCi0JaGN0eC0+Y2NpZDNoY3R4X3ggICAgID0gaGN0eC0+Y2NpZDNoY3R4X3M7Ci0JaGN0eC0+Y2NpZDNoY3R4X3RfcnRvID0gVVNFQ19QRVJfU0VDOworCWhjdHgtPmNjaWQzaGN0eF9zICAgICA9IDA7CisJaGN0eC0+Y2NpZDNoY3R4X3J0dCAgID0gMDsKIAloY3R4LT5jY2lkM2hjdHhfc3RhdGUgPSBURlJDX1NTVEFURV9OT19TRU5UOwogCUlOSVRfTElTVF9IRUFEKCZoY3R4LT5jY2lkM2hjdHhfaGlzdCk7CiAKLQloY3R4LT5jY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIuZnVuY3Rpb24gPSBjY2lkM19oY190eF9ub19mZWVkYmFja190aW1lcjsKKwloY3R4LT5jY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIuZnVuY3Rpb24gPQorCQkJCWNjaWQzX2hjX3R4X25vX2ZlZWRiYWNrX3RpbWVyOwogCWhjdHgtPmNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNrOwogCWluaXRfdGltZXIoJmhjdHgtPmNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lcik7CiAKQEAgLTY4OSwxNCArNjUyLDcgQEAKICAqIFJYIEhhbGYgQ29ubmVjdGlvbiBtZXRob2RzCiAgKi8KIAotLyogVEZSQyByZWNlaXZlciBzdGF0ZXMgKi8KLWVudW0gY2NpZDNfaGNfcnhfc3RhdGVzIHsKLSAgICAgICAJVEZSQ19SU1RBVEVfTk9fREFUQSA9IDEsCi0JVEZSQ19SU1RBVEVfREFUQSwKLQlURlJDX1JTVEFURV9URVJNICAgID0gMTI3LAotfTsKLQotI2lmZGVmIENDSUQzX0RFQlVHCisjaWZkZWYgQ09ORklHX0lQX0RDQ1BfQ0NJRDNfREVCVUcKIHN0YXRpYyBjb25zdCBjaGFyICpjY2lkM19yeF9zdGF0ZV9uYW1lKGVudW0gY2NpZDNfaGNfcnhfc3RhdGVzIHN0YXRlKQogewogCXN0YXRpYyBjaGFyICpjY2lkM19yeF9zdGF0ZV9uYW1lc1tdID0gewpAQCAtNzIyLDE0ICs2NzgsMjQgQEAKIAloY3J4LT5jY2lkM2hjcnhfc3RhdGUgPSBzdGF0ZTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNjaWQzX2hjX3J4X3VwZGF0ZV9zKHN0cnVjdCBjY2lkM19oY19yeF9zb2NrICpoY3J4LCBpbnQgbGVuKQoreworCWlmICh1bmxpa2VseShsZW4gPT0gMCkpCS8qIGRvbid0IHVwZGF0ZSBvbiBlbXB0eSBwYWNrZXRzIChlLmcuIEFDS3MpICovCisJCWNjaWQzX3ByX2RlYnVnKCJQYWNrZXQgcGF5bG9hZCBsZW5ndGggaXMgMCAtIG5vdCB1cGRhdGluZ1xuIik7CisJZWxzZQorCQloY3J4LT5jY2lkM2hjcnhfcyA9IGhjcngtPmNjaWQzaGNyeF9zID09IDAgPyBsZW4gOgorCQkJCSAgICAoOSAqIGhjcngtPmNjaWQzaGNyeF9zICsgbGVuKSAvIDEwOworfQorCiBzdGF0aWMgdm9pZCBjY2lkM19oY19yeF9zZW5kX2ZlZWRiYWNrKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGNjaWQzX2hjX3J4X3NrKHNrKTsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKnBhY2tldDsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7CisJc3VzZWNvbmRzX3QgZGVsdGE7CiAKLQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwXG4iLCBkY2NwX3JvbGUoc2spLCBzayk7CisJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSAtIGVudHJ5IFxuIiwgZGNjcF9yb2xlKHNrKSwgc2spOwogCiAJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOwogCkBAIC03MzcsMjUgKzcwMywyMiBAQAogCWNhc2UgVEZSQ19SU1RBVEVfTk9fREFUQToKIAkJaGNyeC0+Y2NpZDNoY3J4X3hfcmVjdiA9IDA7CiAJCWJyZWFrOwotCWNhc2UgVEZSQ19SU1RBVEVfREFUQTogewotCQljb25zdCB1MzIgZGVsdGEgPSB0aW1ldmFsX2RlbHRhKCZub3csCi0JCQkJCSZoY3J4LT5jY2lkM2hjcnhfdHN0YW1wX2xhc3RfZmVlZGJhY2spOwotCQloY3J4LT5jY2lkM2hjcnhfeF9yZWN2ID0gdXNlY3NfZGl2KGhjcngtPmNjaWQzaGNyeF9ieXRlc19yZWN2LAotCQkJCQkJICAgZGVsdGEpOwotCX0KKwljYXNlIFRGUkNfUlNUQVRFX0RBVEE6CisJCWRlbHRhID0gdGltZXZhbF9kZWx0YSgmbm93LAorCQkJCSAgICAgICZoY3J4LT5jY2lkM2hjcnhfdHN0YW1wX2xhc3RfZmVlZGJhY2spOworCQlEQ0NQX0JVR19PTihkZWx0YSA8IDApOworCQloY3J4LT5jY2lkM2hjcnhfeF9yZWN2ID0KKwkJCXNjYWxlZF9kaXYzMihoY3J4LT5jY2lkM2hjcnhfYnl0ZXNfcmVjdiwgZGVsdGEpOwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9DUklUICIlczogJXMsIHNrPSVwLCBJbGxlZ2FsIHN0YXRlICglZCkhXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzaywgaGNyeC0+Y2NpZDNoY3J4X3N0YXRlKTsKLQkJZHVtcF9zdGFjaygpOworCWNhc2UgVEZSQ19SU1RBVEVfVEVSTToKKwkJRENDUF9CVUcoIiVzKCVwKSAtIElsbGVnYWwgc3RhdGUgVEVSTSIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJcmV0dXJuOwogCX0KIAogCXBhY2tldCA9IGRjY3BfcnhfaGlzdF9maW5kX2RhdGFfcGFja2V0KCZoY3J4LT5jY2lkM2hjcnhfaGlzdCk7CiAJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIG5vIGRhdGEgcGFja2V0ICIKLQkJCSAgICAgICAiaW4gaGlzdG9yeSFcbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLCBkY2NwX3JvbGUoc2spLCBzayk7CisJCURDQ1BfV0FSTigiJXMoJXApLCBubyBkYXRhIHBhY2tldCBpbiBoaXN0b3J5IVxuIiwKKwkJCSAgZGNjcF9yb2xlKHNrKSwgc2spOwogCQlyZXR1cm47CiAJfQogCkBAIC03NjMsMTMgKzcyNiwxOSBAQAogCWhjcngtPmNjaWQzaGNyeF9jY3ZhbF9sYXN0X2NvdW50ZXIgICA9IHBhY2tldC0+ZGNjcGhyeF9jY3ZhbDsKIAloY3J4LT5jY2lkM2hjcnhfYnl0ZXNfcmVjdgkgICAgID0gMDsKIAotCS8qIENvbnZlcnQgdG8gbXVsdGlwbGVzIG9mIDEwdXMgKi8KLQloY3J4LT5jY2lkM2hjcnhfZWxhcHNlZF90aW1lID0KLQkJCXRpbWV2YWxfZGVsdGEoJm5vdywgJnBhY2tldC0+ZGNjcGhyeF90c3RhbXApIC8gMTA7CisJLyogRWxhcHNlZCB0aW1lIGluZm9ybWF0aW9uIFtSRkMgNDM0MCwgMTMuMl0gaW4gdW5pdHMgb2YgMTAgKiB1c2VjcyAqLworCWRlbHRhID0gdGltZXZhbF9kZWx0YSgmbm93LCAmcGFja2V0LT5kY2NwaHJ4X3RzdGFtcCk7CisJRENDUF9CVUdfT04oZGVsdGEgPCAwKTsKKwloY3J4LT5jY2lkM2hjcnhfZWxhcHNlZF90aW1lID0gZGVsdGEgLyAxMDsKKwogCWlmIChoY3J4LT5jY2lkM2hjcnhfcCA9PSAwKQotCQloY3J4LT5jY2lkM2hjcnhfcGludiA9IH4wOwotCWVsc2UKKwkJaGNyeC0+Y2NpZDNoY3J4X3BpbnYgPSB+MFU7CS8qIHNlZSBSRkMgNDM0MiwgOC41ICovCisJZWxzZSBpZiAoaGNyeC0+Y2NpZDNoY3J4X3AgPiAxMDAwMDAwKSB7CisJCURDQ1BfV0FSTigicCAoJXUpID4gMTAwJSVcbiIsIGhjcngtPmNjaWQzaGNyeF9wKTsKKwkJaGNyeC0+Y2NpZDNoY3J4X3BpbnYgPSAxOwkvKiB1c2UgMTAwJSBpbiB0aGlzIGNhc2UgKi8KKwl9IGVsc2UKIAkJaGNyeC0+Y2NpZDNoY3J4X3BpbnYgPSAxMDAwMDAwIC8gaGNyeC0+Y2NpZDNoY3J4X3A7CisKIAlkcC0+ZGNjcHNfaGNfcnhfaW5zZXJ0X29wdGlvbnMgPSAxOwogCWRjY3Bfc2VuZF9hY2soc2spOwogfQpAQCAtNzk3LDkgKzc2Niw5IEBACiAJCQkJCSAgICAgaGNyeC0+Y2NpZDNoY3J4X2VsYXBzZWRfdGltZSkpIHx8CiAJICAgIGRjY3BfaW5zZXJ0X29wdGlvbl90aW1lc3RhbXAoc2ssIHNrYikgfHwKIAkgICAgZGNjcF9pbnNlcnRfb3B0aW9uKHNrLCBza2IsIFRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURSwKLQkJICAgIAkgICAgICAgJnBpbnYsIHNpemVvZihwaW52KSkgfHwKKwkJCSAgICAgICAmcGludiwgc2l6ZW9mKHBpbnYpKSB8fAogCSAgICBkY2NwX2luc2VydF9vcHRpb24oc2ssIHNrYiwgVEZSQ19PUFRfUkVDRUlWRV9SQVRFLAotCQkgICAgCSAgICAgICAmeF9yZWN2LCBzaXplb2YoeF9yZWN2KSkpCisJCQkgICAgICAgJnhfcmVjdiwgc2l6ZW9mKHhfcmVjdikpKQogCQlyZXR1cm4gLTE7CiAKIAlyZXR1cm4gMDsKQEAgLTgxMywxMiArNzgyLDEzIEBACiB7CiAJc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBjY2lkM19oY19yeF9zayhzayk7CiAJc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqZW50cnksICpuZXh0LCAqdGFpbCA9IE5VTEw7Ci0JdTMyIHJ0dCwgZGVsdGEsIHhfcmVjdiwgZnZhbCwgcCwgdG1wMjsKKwl1MzIgeF9yZWN2LCBwOworCXN1c2Vjb25kc190IHJ0dCwgZGVsdGE7CiAJc3RydWN0IHRpbWV2YWwgdHN0YW1wID0geyAwLCB9OwogCWludCBpbnRlcnZhbCA9IDA7CiAJaW50IHdpbl9jb3VudCA9IDA7CiAJaW50IHN0ZXAgPSAwOwotCXU2NCB0bXAxOworCXU2NCBmdmFsOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCAmaGNyeC0+Y2NpZDNoY3J4X2hpc3QsCiAJCQkJIGRjY3Bocnhfbm9kZSkgewpAQCAtODQzLDU4ICs4MTMsNjYgQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoc3RlcCA9PSAwKSkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIHBhY2tldCBoaXN0b3J5ICIKLQkJCSAgICAgICAiY29udGFpbnMgbm8gZGF0YSBwYWNrZXRzIVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKKwkJRENDUF9XQVJOKCIlcyglcCksIHBhY2tldCBoaXN0b3J5IGhhcyBubyBkYXRhIHBhY2tldHMhXG4iLAorCQkJICBkY2NwX3JvbGUoc2spLCBzayk7CiAJCXJldHVybiB+MDsKIAl9CiAKIAlpZiAodW5saWtlbHkoaW50ZXJ2YWwgPT0gMCkpIHsKLQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogJXMsIHNrPSVwLCBDb3VsZCBub3QgZmluZCBhICIKLQkJCSAgICAgICAid2luX2NvdW50IGludGVydmFsID4gMC4gRGVmYXVsdGluZyB0byAxXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2spOworCQlEQ0NQX1dBUk4oIiVzKCVwKSwgQ291bGQgbm90IGZpbmQgYSB3aW5fY291bnQgaW50ZXJ2YWwgPiAwLiIKKwkJCSAgIkRlZmF1bHRpbmcgdG8gMVxuIiwgZGNjcF9yb2xlKHNrKSwgc2spOwogCQlpbnRlcnZhbCA9IDE7CiAJfQogZm91bmQ6CiAJaWYgKCF0YWlsKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IHRhaWwgaXMgbnVsbFxuIiwKLQkJICAgX19GVU5DVElPTl9fKTsKKwkJRENDUF9DUklUKCJ0YWlsIGlzIG51bGxcbiIpOwogCQlyZXR1cm4gfjA7CiAJfQotCXJ0dCA9IHRpbWV2YWxfZGVsdGEoJnRzdGFtcCwgJnRhaWwtPmRjY3BocnhfdHN0YW1wKSAqIDQgLyBpbnRlcnZhbDsKLQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCBhcHByb3hpbWF0ZWQgUlRUIHRvICV1dXNcbiIsCi0JCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywgcnR0KTsKLQlpZiAocnR0ID09IDApCi0JCXJ0dCA9IDE7CisKKwlkZWx0YSA9IHRpbWV2YWxfZGVsdGEoJnRzdGFtcCwgJnRhaWwtPmRjY3BocnhfdHN0YW1wKTsKKwlEQ0NQX0JVR19PTihkZWx0YSA8IDApOworCisJcnR0ID0gZGVsdGEgKiA0IC8gaW50ZXJ2YWw7CisJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgYXBwcm94aW1hdGVkIFJUVCB0byAlZHVzXG4iLAorCQkgICAgICAgZGNjcF9yb2xlKHNrKSwgc2ssIChpbnQpcnR0KTsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIGZpcnN0IGxvc3MgaW50ZXJ2YWwgdmlhIGludmVyc2UgbG9va3VwLgorCSAqIEFzc3VtZSB0aGF0IFhfcmVjdiBjYW4gYmUgY29tcHV0ZWQgYnkgdGhlIHRocm91Z2hwdXQgZXF1YXRpb24KKwkgKgkJICAgIHMKKwkgKglYX3JlY3YgPSAtLS0tLS0tLQorCSAqCQkgUiAqIGZ2YWwKKwkgKiBGaW5kIHNvbWUgcCBzdWNoIHRoYXQgZihwKSA9IGZ2YWw7IHJldHVybiAxL3AgW1JGQyAzNDQ4LCA2LjMuMV0uCisJICovCisJaWYgKHJ0dCA9PSAwKSB7CQkJLyogd291bGQgcmVzdWx0IGluIGRpdmlkZS1ieS16ZXJvICovCisJCURDQ1BfV0FSTigiUlRUPT0wXG4iKTsKKwkJcmV0dXJuIH4wOworCX0KIAogCWRjY3BfdGltZXN0YW1wKHNrLCAmdHN0YW1wKTsKIAlkZWx0YSA9IHRpbWV2YWxfZGVsdGEoJnRzdGFtcCwgJmhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayk7Ci0JeF9yZWN2ID0gdXNlY3NfZGl2KGhjcngtPmNjaWQzaGNyeF9ieXRlc19yZWN2LCBkZWx0YSk7CisJRENDUF9CVUdfT04oZGVsdGEgPD0gMCk7CiAKLQlpZiAoeF9yZWN2ID09IDApCi0JCXhfcmVjdiA9IGhjcngtPmNjaWQzaGNyeF94X3JlY3Y7Ci0KLQl0bXAxID0gKHU2NCl4X3JlY3YgKiAodTY0KXJ0dDsKLQlkb19kaXYodG1wMSwxMDAwMDAwMCk7Ci0JdG1wMiA9ICh1MzIpdG1wMTsKLQotCWlmICghdG1wMikgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgInRtcDIgPSAwICIKLQkJICAgIiVzOiB4X3JlY3YgPSAldSwgcnR0ID0ldVxuIiwKLQkJICAgX19GVU5DVElPTl9fLCB4X3JlY3YsIHJ0dCk7Ci0JCXJldHVybiB+MDsKKwl4X3JlY3YgPSBzY2FsZWRfZGl2MzIoaGNyeC0+Y2NpZDNoY3J4X2J5dGVzX3JlY3YsIGRlbHRhKTsKKwlpZiAoeF9yZWN2ID09IDApIHsJCS8qIHdvdWxkIGFsc28gdHJpZ2dlciBkaXZpZGUtYnktemVybyAqLworCQlEQ0NQX1dBUk4oIlhfcmVjdj09MFxuIik7CisJCWlmICgoeF9yZWN2ID0gaGNyeC0+Y2NpZDNoY3J4X3hfcmVjdikgPT0gMCkgeworCQkJRENDUF9CVUcoInN0b3JlZCB2YWx1ZSBvZiBYX3JlY3YgaXMgemVybyIpOworCQkJcmV0dXJuIH4wOworCQl9CiAJfQogCi0JZnZhbCA9IChoY3J4LT5jY2lkM2hjcnhfcyAqIDEwMDAwMCkgLyB0bXAyOwotCS8qIGRvIG5vdCBhbHRlciBvcmRlciBhYm92ZSBvciB5b3Ugd2lsbCBnZXQgb3ZlcmZsb3cgb24gMzIgYml0ICovCisJZnZhbCA9IHNjYWxlZF9kaXYoaGNyeC0+Y2NpZDNoY3J4X3MsIHJ0dCk7CisJZnZhbCA9IHNjYWxlZF9kaXYzMihmdmFsLCB4X3JlY3YpOwogCXAgPSB0ZnJjX2NhbGNfeF9yZXZlcnNlX2xvb2t1cChmdmFsKTsKLQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwLCByZWNlaXZlIHJhdGU9JXUgYnl0ZXMvcywgaW1wbGllZCAiCisKKwljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCByZWNlaXZlIHJhdGU9JXUgYnl0ZXMvcywgaW1wbGllZCAiCiAJCSAgICAgICAibG9zcyByYXRlPSV1XG4iLCBkY2NwX3JvbGUoc2spLCBzaywgeF9yZWN2LCBwKTsKIAogCWlmIChwID09IDApCiAJCXJldHVybiB+MDsKIAllbHNlCi0JCXJldHVybiAxMDAwMDAwIC8gcDsgCisJCXJldHVybiAxMDAwMDAwIC8gcDsKIH0KIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfcnhfdXBkYXRlX2xpKHN0cnVjdCBzb2NrICpzaywgdTY0IHNlcV9sb3NzLCB1OCB3aW5fbG9zcykKQEAgLTkyNCwxMSArOTAyLDEwIEBACiAJCS8qIG5ldyBsb3NzIGV2ZW50IGRldGVjdGVkICovCiAJCS8qIGNhbGN1bGF0ZSBsYXN0IGludGVydmFsIGxlbmd0aCAqLwogCQlzZXFfdGVtcCA9IGRjY3BfZGVsdGFfc2Vxbm8oaGVhZC0+ZGNjcGxpaF9zZXFubywgc2VxX2xvc3MpOwotCQllbnRyeSA9IGRjY3BfbGlfaGlzdF9lbnRyeV9uZXcoY2NpZDNfbGlfaGlzdCwgU0xBQl9BVE9NSUMpOworCQllbnRyeSA9IGRjY3BfbGlfaGlzdF9lbnRyeV9uZXcoY2NpZDNfbGlfaGlzdCwgR0ZQX0FUT01JQyk7CiAKIAkJaWYgKGVudHJ5ID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQlkdW1wX3N0YWNrKCk7CisJCQlEQ0NQX0JVRygib3V0IG9mIG1lbW9yeSAtIGNhbiBub3QgYWxsb2NhdGUgZW50cnkiKTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC05NDksNyArOTI2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKnBhY2tldCkKIHsKIAlzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayAqaGNyeCA9IGNjaWQzX2hjX3J4X3NrKHNrKTsKLQlzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICpyeF9oaXN0ID0gZGNjcF9yeF9oaXN0X2hlYWQoJmhjcngtPmNjaWQzaGNyeF9oaXN0KTsKKwlzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICpyeF9oaXN0ID0KKwkJCQlkY2NwX3J4X2hpc3RfaGVhZCgmaGNyeC0+Y2NpZDNoY3J4X2hpc3QpOwogCXU2NCBzZXFubyA9IHBhY2tldC0+ZGNjcGhyeF9zZXFubzsKIAl1NjQgdG1wX3NlcW5vOwogCWludCBsb3NzID0gMDsKQEAgLTk3Nyw3ICs5NTUsNyBAQAogCQlkY2NwX2luY19zZXFubygmdG1wX3NlcW5vKTsKIAkJd2hpbGUgKGRjY3BfcnhfaGlzdF9maW5kX2VudHJ5KCZoY3J4LT5jY2lkM2hjcnhfaGlzdCwKIAkJICAgdG1wX3NlcW5vLCAmY2N2YWwpKSB7Ci0JCSAgIAloY3J4LT5jY2lkM2hjcnhfc2Vxbm9fbm9ubG9zcyA9IHRtcF9zZXFubzsKKwkJCWhjcngtPmNjaWQzaGNyeF9zZXFub19ub25sb3NzID0gdG1wX3NlcW5vOwogCQkJaGNyeC0+Y2NpZDNoY3J4X2NjdmFsX25vbmxvc3MgPSBjY3ZhbDsKIAkJCWRjY3BfaW5jX3NlcW5vKCZ0bXBfc2Vxbm8pOwogCQl9CkBAIC0xMDAzLDEzICs5ODEsMTEgQEAKIAljb25zdCBzdHJ1Y3QgZGNjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcmVjdjsKIAlzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICpwYWNrZXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwotCXU4IHdpbl9jb3VudDsKLQl1MzIgcF9wcmV2LCBydHRfcHJldiwgcl9zYW1wbGUsIHRfZWxhcHNlZDsKLQlpbnQgbG9zczsKKwl1MzIgcF9wcmV2LCBydHRfcHJldjsKKwlzdXNlY29uZHNfdCByX3NhbXBsZSwgdF9lbGFwc2VkOworCWludCBsb3NzLCBwYXlsb2FkX3NpemU7CiAKLQlCVUdfT04oaGNyeCA9PSBOVUxMIHx8Ci0JICAgICAgICEoaGNyeC0+Y2NpZDNoY3J4X3N0YXRlID09IFRGUkNfUlNUQVRFX05PX0RBVEEgfHwKLQkJIGhjcngtPmNjaWQzaGNyeF9zdGF0ZSA9PSBURlJDX1JTVEFURV9EQVRBKSk7CisJQlVHX09OKGhjcnggPT0gTlVMTCk7CiAKIAlvcHRfcmVjdiA9ICZkY2NwX3NrKHNrKS0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZDsKIApAQCAtMTAyNiwxMiArMTAwMiwxMyBAQAogCQlyX3NhbXBsZSA9IHRpbWV2YWxfdXNlY3MoJm5vdyk7CiAJCXRfZWxhcHNlZCA9IG9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lICogMTA7CiAKKwkJRENDUF9CVUdfT04ocl9zYW1wbGUgPCAwKTsKIAkJaWYgKHVubGlrZWx5KHJfc2FtcGxlIDw9IHRfZWxhcHNlZCkpCi0JCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiByX3NhbXBsZT0ldXVzLCAiCi0JCQkJICAgICAgICJ0X2VsYXBzZWQ9JXV1c1xuIiwKLQkJCQkgICAgICAgX19GVU5DVElPTl9fLCByX3NhbXBsZSwgdF9lbGFwc2VkKTsKKwkJCURDQ1BfV0FSTigicl9zYW1wbGU9JWxkdXMsIHRfZWxhcHNlZD0lbGR1c1xuIiwKKwkJCQkgIHJfc2FtcGxlLCB0X2VsYXBzZWQpOwogCQllbHNlCiAJCQlyX3NhbXBsZSAtPSB0X2VsYXBzZWQ7CisJCUNDSUQzX1JUVF9TQU5JVFlfQ0hFQ0socl9zYW1wbGUpOwogCiAJCWlmIChoY3J4LT5jY2lkM2hjcnhfc3RhdGUgPT0gVEZSQ19SU1RBVEVfTk9fREFUQSkKIAkJCWhjcngtPmNjaWQzaGNyeF9ydHQgPSByX3NhbXBsZTsKQEAgLTEwNDAsOCArMTAxNyw4IEBACiAJCQkJCSAgICAgIHJfc2FtcGxlIC8gMTA7CiAKIAkJaWYgKHJ0dF9wcmV2ICE9IGhjcngtPmNjaWQzaGNyeF9ydHQpCi0JCQljY2lkM19wcl9kZWJ1ZygiJXMsIE5ldyBSVFQ9JXV1cywgZWxhcHNlZCB0aW1lPSV1XG4iLAotCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBoY3J4LT5jY2lkM2hjcnhfcnR0LAorCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgTmV3IFJUVD0ldXVzLCBlbGFwc2VkIHRpbWU9JXVcbiIsCisJCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLCBoY3J4LT5jY2lkM2hjcnhfcnR0LAogCQkJCSAgICAgICBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSk7CiAJCWJyZWFrOwogCWNhc2UgRENDUF9QS1RfREFUQToKQEAgLTEwNTEsNTIgKzEwMjgsNDggQEAKIAl9CiAKIAlwYWNrZXQgPSBkY2NwX3J4X2hpc3RfZW50cnlfbmV3KGNjaWQzX3J4X2hpc3QsIHNrLCBvcHRfcmVjdi0+ZGNjcG9yX25kcCwKLQkJCQkJc2tiLCBTTEFCX0FUT01JQyk7CisJCQkJCXNrYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHVubGlrZWx5KHBhY2tldCA9PSBOVUxMKSkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiAlcywgc2s9JXAsIE5vdCBlbm91Z2ggbWVtIHRvICIKLQkJCQkiYWRkIHJ4IHBhY2tldCB0byBoaXN0b3J5LCBjb25zaWRlciBpdCBsb3N0IVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRjY3Bfcm9sZShzayksIHNrKTsKKwkJRENDUF9XQVJOKCIlcyglcCksIE5vdCBlbm91Z2ggbWVtIHRvIGFkZCByeCBwYWNrZXQgIgorCQkJICAidG8gaGlzdG9yeSwgY29uc2lkZXIgaXQgbG9zdCFcbiIsIGRjY3Bfcm9sZShzayksIHNrKTsKIAkJcmV0dXJuOwogCX0KIAotCXdpbl9jb3VudCA9IHBhY2tldC0+ZGNjcGhyeF9jY3ZhbDsKLQogCWxvc3MgPSBjY2lkM19oY19yeF9kZXRlY3RfbG9zcyhzaywgcGFja2V0KTsKIAogCWlmIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlID09IERDQ1BfUEtUX0FDSykKIAkJcmV0dXJuOwogCisJcGF5bG9hZF9zaXplID0gc2tiLT5sZW4gLSBkY2NwX2hkcihza2IpLT5kY2NwaF9kb2ZmICogNDsKKwljY2lkM19oY19yeF91cGRhdGVfcyhoY3J4LCBwYXlsb2FkX3NpemUpOworCiAJc3dpdGNoIChoY3J4LT5jY2lkM2hjcnhfc3RhdGUpIHsKIAljYXNlIFRGUkNfUlNUQVRFX05PX0RBVEE6Ci0JCWNjaWQzX3ByX2RlYnVnKCIlcywgc2s9JXAoJXMpLCBza2I9JXAsIHNlbmRpbmcgaW5pdGlhbCAiCi0JCQkgICAgICAgImZlZWRiYWNrXG4iLAotCQkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLAorCQljY2lkM19wcl9kZWJ1ZygiJXMoJXAsIHN0YXRlPSVzKSwgc2tiPSVwLCBzZW5kaW5nIGluaXRpYWwgIgorCQkJICAgICAgICJmZWVkYmFja1xuIiwgZGNjcF9yb2xlKHNrKSwgc2ssCiAJCQkgICAgICAgZGNjcF9zdGF0ZV9uYW1lKHNrLT5za19zdGF0ZSksIHNrYik7CiAJCWNjaWQzX2hjX3J4X3NlbmRfZmVlZGJhY2soc2spOwogCQljY2lkM19oY19yeF9zZXRfc3RhdGUoc2ssIFRGUkNfUlNUQVRFX0RBVEEpOwogCQlyZXR1cm47CiAJY2FzZSBURlJDX1JTVEFURV9EQVRBOgotCQloY3J4LT5jY2lkM2hjcnhfYnl0ZXNfcmVjdiArPSBza2ItPmxlbiAtCi0JCQkJCSAgICAgIGRjY3BfaGRyKHNrYiktPmRjY3BoX2RvZmYgKiA0OworCQloY3J4LT5jY2lkM2hjcnhfYnl0ZXNfcmVjdiArPSBwYXlsb2FkX3NpemU7CiAJCWlmIChsb3NzKQogCQkJYnJlYWs7CiAKIAkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOwotCQlpZiAodGltZXZhbF9kZWx0YSgmbm93LCAmaGNyeC0+Y2NpZDNoY3J4X3RzdGFtcF9sYXN0X2FjaykgPj0KLQkJICAgIGhjcngtPmNjaWQzaGNyeF9ydHQpIHsKKwkJaWYgKCh0aW1ldmFsX2RlbHRhKCZub3csICZoY3J4LT5jY2lkM2hjcnhfdHN0YW1wX2xhc3RfYWNrKSAtCisJCSAgICAgKHN1c2Vjb25kc190KWhjcngtPmNjaWQzaGNyeF9ydHQpID49IDApIHsKIAkJCWhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9hY2sgPSBub3c7CiAJCQljY2lkM19oY19yeF9zZW5kX2ZlZWRiYWNrKHNrKTsKIAkJfQogCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6ICVzLCBzaz0lcCwgSWxsZWdhbCBzdGF0ZSAoJWQpIVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGNjcF9yb2xlKHNrKSwgc2ssIGhjcngtPmNjaWQzaGNyeF9zdGF0ZSk7Ci0JCWR1bXBfc3RhY2soKTsKKwljYXNlIFRGUkNfUlNUQVRFX1RFUk06CisJCURDQ1BfQlVHKCIlcyglcCkgLSBJbGxlZ2FsIHN0YXRlIFRFUk0iLCBkY2NwX3JvbGUoc2spLCBzayk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBEZWFsaW5nIHdpdGggcGFja2V0IGxvc3MgKi8KLQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwKCVzKSwgZGF0YSBsb3NzISBSZWFjdGluZy4uLlxuIiwKKwljY2lkM19wcl9kZWJ1ZygiJXMoJXAsIHN0YXRlPSVzKSwgZGF0YSBsb3NzISBSZWFjdGluZy4uLlxuIiwKIAkJICAgICAgIGRjY3Bfcm9sZShzayksIHNrLCBkY2NwX3N0YXRlX25hbWUoc2stPnNrX3N0YXRlKSk7CiAKIAlwX3ByZXYgPSBoY3J4LT5jY2lkM2hjcnhfcDsKQEAgLTExMDgsMTAgKzEwODEsOCBAQAogCQkvKiBTY2FsaW5nIHVwIGJ5IDEwMDAwMDAgYXMgZml4ZWQgZGVjaW1hbCAqLwogCQlpZiAoaV9tZWFuICE9IDApCiAJCQloY3J4LT5jY2lkM2hjcnhfcCA9IDEwMDAwMDAgLyBpX21lYW47Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGVtcHR5IGxvc3MgaGlzdFxuIixfX0ZVTkNUSU9OX18pOwotCQlkdW1wX3N0YWNrKCk7Ci0JfQorCX0gZWxzZQorCQlEQ0NQX0JVRygiZW1wdHkgbG9zcyBoaXN0b3J5Iik7CiAKIAlpZiAoaGNyeC0+Y2NpZDNoY3J4X3AgPiBwX3ByZXYpIHsKIAkJY2NpZDNfaGNfcnhfc2VuZF9mZWVkYmFjayhzayk7CkBAIC0xMTIxLDIzICsxMDkyLDE3IEBACiAKIHN0YXRpYyBpbnQgY2NpZDNfaGNfcnhfaW5pdChzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrKQogewotCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CiAJc3RydWN0IGNjaWQzX2hjX3J4X3NvY2sgKmhjcnggPSBjY2lkX3ByaXYoY2NpZCk7CiAKLQljY2lkM19wcl9kZWJ1ZygiJXMsIHNrPSVwXG4iLCBkY2NwX3JvbGUoc2spLCBzayk7Ci0KLQlpZiAoZHAtPmRjY3BzX3BhY2tldF9zaXplID49IFRGUkNfTUlOX1BBQ0tFVF9TSVpFICYmCi0JICAgIGRwLT5kY2Nwc19wYWNrZXRfc2l6ZSA8PSBURlJDX01BWF9QQUNLRVRfU0laRSkKLQkJaGNyeC0+Y2NpZDNoY3J4X3MgPSBkcC0+ZGNjcHNfcGFja2V0X3NpemU7Ci0JZWxzZQotCQloY3J4LT5jY2lkM2hjcnhfcyA9IFRGUkNfU1REX1BBQ0tFVF9TSVpFOworCWNjaWQzX3ByX2RlYnVnKCJlbnRyeVxuIik7CiAKIAloY3J4LT5jY2lkM2hjcnhfc3RhdGUgPSBURlJDX1JTVEFURV9OT19EQVRBOwogCUlOSVRfTElTVF9IRUFEKCZoY3J4LT5jY2lkM2hjcnhfaGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmhjcngtPmNjaWQzaGNyeF9saV9oaXN0KTsKIAlkY2NwX3RpbWVzdGFtcChzaywgJmhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9hY2spOwogCWhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayA9IGhjcngtPmNjaWQzaGNyeF90c3RhbXBfbGFzdF9hY2s7Ci0JaGNyeC0+Y2NpZDNoY3J4X3J0dCA9IDUwMDA7IC8qIFhYWCA1bXMgZm9yIG5vdy4uLiAqLworCWhjcngtPmNjaWQzaGNyeF9zICAgPSAwOworCWhjcngtPmNjaWQzaGNyeF9ydHQgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC0xMTY2LDkgKzExMzEsOSBAQAogCiAJQlVHX09OKGhjcnggPT0gTlVMTCk7CiAKLQlpbmZvLT50Y3BpX2NhX3N0YXRlCT0gaGNyeC0+Y2NpZDNoY3J4X3N0YXRlOwotCWluZm8tPnRjcGlfb3B0aW9ucwl8PSBUQ1BJX09QVF9USU1FU1RBTVBTOwotCWluZm8tPnRjcGlfcmN2X3J0dAk9IGhjcngtPmNjaWQzaGNyeF9ydHQ7CisJaW5mby0+dGNwaV9jYV9zdGF0ZSA9IGhjcngtPmNjaWQzaGNyeF9zdGF0ZTsKKwlpbmZvLT50Y3BpX29wdGlvbnMgIHw9IFRDUElfT1BUX1RJTUVTVEFNUFM7CisJaW5mby0+dGNwaV9yY3ZfcnR0ICA9IGhjcngtPmNjaWQzaGNyeF9ydHQ7CiB9CiAKIHN0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X2dldF9pbmZvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9pbmZvICppbmZvKQpAQCAtMTI0OSw3ICsxMjE0LDYgQEAKIAkuY2NpZF9oY190eF9zZW5kX3BhY2tldAkgICA9IGNjaWQzX2hjX3R4X3NlbmRfcGFja2V0LAogCS5jY2lkX2hjX3R4X3BhY2tldF9zZW50CSAgID0gY2NpZDNfaGNfdHhfcGFja2V0X3NlbnQsCiAJLmNjaWRfaGNfdHhfcGFja2V0X3JlY3YJICAgPSBjY2lkM19oY190eF9wYWNrZXRfcmVjdiwKLQkuY2NpZF9oY190eF9pbnNlcnRfb3B0aW9ucyA9IGNjaWQzX2hjX3R4X2luc2VydF9vcHRpb25zLAogCS5jY2lkX2hjX3R4X3BhcnNlX29wdGlvbnMgID0gY2NpZDNfaGNfdHhfcGFyc2Vfb3B0aW9ucywKIAkuY2NpZF9oY19yeF9vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayksCiAJLmNjaWRfaGNfcnhfaW5pdAkgICA9IGNjaWQzX2hjX3J4X2luaXQsCkBAIC0xMjYxLDkgKzEyMjUsMTEgQEAKIAkuY2NpZF9oY19yeF9nZXRzb2Nrb3B0CSAgID0gY2NpZDNfaGNfcnhfZ2V0c29ja29wdCwKIAkuY2NpZF9oY190eF9nZXRzb2Nrb3B0CSAgID0gY2NpZDNfaGNfdHhfZ2V0c29ja29wdCwKIH07Ci0gCisKKyNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEM19ERUJVRwogbW9kdWxlX3BhcmFtKGNjaWQzX2RlYnVnLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjY2lkM19kZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyIpOworI2VuZGlmCiAKIHN0YXRpYyBfX2luaXQgaW50IGNjaWQzX21vZHVsZV9pbml0KHZvaWQpCiB7CkBAIC0xMjgyLDcgKzEyNDgsNyBAQAogCQlnb3RvIG91dF9mcmVlX3R4OwogCiAJcmMgPSBjY2lkX3JlZ2lzdGVyKCZjY2lkMyk7Ci0JaWYgKHJjICE9IDApIAorCWlmIChyYyAhPSAwKQogCQlnb3RvIG91dF9mcmVlX2xvc3NfaW50ZXJ2YWxfaGlzdG9yeTsKIG91dDoKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5oIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuaAppbmRleCAwYTJjYjc1Li4xNTc3NmE4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5oCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmgKQEAgLTQyLDIyICs0MiwyNCBAQAogI2luY2x1ZGUgPGxpbnV4L3RmcmMuaD4KICNpbmNsdWRlICIuLi9jY2lkLmgiCiAKLSNkZWZpbmUgVEZSQ19NSU5fUEFDS0VUX1NJWkUJICAgMTYKLSNkZWZpbmUgVEZSQ19TVERfUEFDS0VUX1NJWkUJICAyNTYKLSNkZWZpbmUgVEZSQ19NQVhfUEFDS0VUX1NJWkUJNjU1MzUKLQotLyogVHdvIHNlY29uZHMgYXMgcGVyIENDSUQzIHNwZWMgKi8KKy8qIFR3byBzZWNvbmRzIGFzIHBlciBSRkMgMzQ0OCA0LjIgKi8KICNkZWZpbmUgVEZSQ19JTklUSUFMX1RJTUVPVVQJICAgKDIgKiBVU0VDX1BFUl9TRUMpCiAKLSNkZWZpbmUgVEZSQ19JTklUSUFMX0lQSQkgICAoVVNFQ19QRVJfU0VDIC8gNCkKLQogLyogSW4gdXNlY3MgLSBoYWxmIHRoZSBzY2hlZHVsaW5nIGdyYW51bGFyaXR5IGFzIHBlciBSRkMzNDQ4IDQuNiAqLwogI2RlZmluZSBURlJDX09QU1lTX0hBTEZfVElNRV9HUkFOICAoVVNFQ19QRVJfU0VDIC8gKDIgKiBIWikpCiAKLS8qIEluIHNlY29uZHMgKi8KLSNkZWZpbmUgVEZSQ19NQVhfQkFDS19PRkZfVElNRQkgICA2NAorLyogUGFyYW1ldGVyIHRfbWJpIGZyb20gW1JGQyAzNDQ4LCA0LjNdOiBiYWNrb2ZmIGludGVydmFsIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgVEZSQ19UX01CSQkJICAgNjQKIAotI2RlZmluZSBURlJDX1NNQUxMRVNUX1AJCSAgIDQwCisvKiBXaGF0IHdlIHRoaW5rIGlzIGEgcmVhc29uYWJsZSB1cHBlciBsaW1pdCBvbiBSVFQgdmFsdWVzICovCisjZGVmaW5lIENDSUQzX1NBTkVfUlRUX01BWAkgICAoKHN1c2Vjb25kc190KSg0ICogVVNFQ19QRVJfU0VDKSkKKworI2RlZmluZSBDQ0lEM19SVFRfU0FOSVRZX0NIRUNLKHJ0dCkgCQkJZG8gewkJICAgXAorCQlpZiAocnR0ID4gQ0NJRDNfU0FORV9SVFRfTUFYKSB7CQkJCSAgIFwKKwkJCURDQ1BfQ1JJVCgiUlRUICglZCkgdG9vIGxhcmdlLCBzdWJzdGl0dXRpbmcgJWQiLCAgIFwKKwkJCQkgIChpbnQpcnR0LCAoaW50KUNDSUQzX1NBTkVfUlRUX01BWCk7CSAgIFwKKwkJCXJ0dCA9IENDSUQzX1NBTkVfUlRUX01BWDsJCQkgICBcCisJCX0gCQkJCQl9IHdoaWxlICgwKQogCiBlbnVtIGNjaWQzX29wdGlvbnMgewogCVRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURSA9IDE5MiwKQEAgLTczLDI2ICs3NSwzNiBAQAogCXUzMiBjY2lkM29yX3JlY2VpdmVfcmF0ZTsKIH07CiAKLS8qKiBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAtIENDSUQzIHNlbmRlciBoYWxmIGNvbm5lY3Rpb24gc29jaworLyogVEZSQyBzZW5kZXIgc3RhdGVzICovCitlbnVtIGNjaWQzX2hjX3R4X3N0YXRlcyB7CisJVEZSQ19TU1RBVEVfTk9fU0VOVCA9IDEsCisJVEZSQ19TU1RBVEVfTk9fRkJBQ0ssCisJVEZSQ19TU1RBVEVfRkJBQ0ssCisJVEZSQ19TU1RBVEVfVEVSTSwKK307CisKKy8qKiBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAtIENDSUQzIHNlbmRlciBoYWxmLWNvbm5lY3Rpb24gc29ja2V0CiAgKgotICAqIEBjY2lkM2hjdHhfc3RhdGUgLSBTZW5kZXIgc3RhdGUKLSAgKiBAY2NpZDNoY3R4X3ggLSBDdXJyZW50IHNlbmRpbmcgcmF0ZQotICAqIEBjY2lkM2hjdHhfeF9yZWN2IC0gUmVjZWl2ZSByYXRlCi0gICogQGNjaWQzaGN0eF94X2NhbGMgLSBDYWxjdWxhdGVkIHNlbmQgKD8pIHJhdGUKLSAgKiBAY2NpZDNoY3R4X3MgLSBQYWNrZXQgc2l6ZQotICAqIEBjY2lkM2hjdHhfcnR0IC0gRXN0aW1hdGUgb2YgY3VycmVudCByb3VuZCB0cmlwIHRpbWUgaW4gdXNlY3MKLSAgKiBAQGNjaWQzaGN0eF9wIC0gQ3VycmVudCBsb3NzIGV2ZW50IHJhdGUgKDAtMSkgc2NhbGVkIGJ5IDEwMDAwMDAKLSAgKiBAY2NpZDNoY3R4X2xhc3Rfd2luX2NvdW50IC0gTGFzdCB3aW5kb3cgY291bnRlciBzZW50Ci0gICogQGNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50IC0gVGltZXN0YW1wIG9mIGVhcmxpZXN0IHBhY2tldAotICAqIAkJCQkgIHdpdGggbGFzdF93aW5fY291bnQgdmFsdWUgc2VudAotICAqIEBjY2lkM2hjdHhfbm9fZmVlZGJhY2tfdGltZXIgLSBIYW5kbGUgdG8gbm8gZmVlZGJhY2sgdGltZXIKLSAgKiBAY2NpZDNoY3R4X2lkbGUgLSBGSVhNRQotICAqIEBjY2lkM2hjdHhfdF9sZCAtIFRpbWUgbGFzdCBkb3VibGVkIGR1cmluZyBzbG93IHN0YXJ0Ci0gICogQGNjaWQzaGN0eF90X25vbSAtIE5vbWluYWwgc2VuZCB0aW1lIG9mIG5leHQgcGFja2V0Ci0gICogQGNjaWQzaGN0eF90X2lwaSAtIEludGVycGFja2V0IChzZW5kKSBpbnRlcnZhbAotICAqIEBjY2lkM2hjdHhfZGVsdGEgLSBTZW5kIHRpbWVyIGRlbHRhCi0gICogQGNjaWQzaGN0eF9oaXN0IC0gUGFja2V0IGhpc3RvcnkKLSAgKi8KKyAqIEBjY2lkM2hjdHhfeCAtIEN1cnJlbnQgc2VuZGluZyByYXRlIGluIDY0ICogYnl0ZXMgcGVyIHNlY29uZAorICogQGNjaWQzaGN0eF94X3JlY3YgLSBSZWNlaXZlIHJhdGUgICAgaW4gNjQgKiBieXRlcyBwZXIgc2Vjb25kCisgKiBAY2NpZDNoY3R4X3hfY2FsYyAtIENhbGN1bGF0ZWQgcmF0ZSBpbiBieXRlcyBwZXIgc2Vjb25kCisgKiBAY2NpZDNoY3R4X3J0dCAtIEVzdGltYXRlIG9mIGN1cnJlbnQgcm91bmQgdHJpcCB0aW1lIGluIHVzZWNzCisgKiBAY2NpZDNoY3R4X3AgLSBDdXJyZW50IGxvc3MgZXZlbnQgcmF0ZSAoMC0xKSBzY2FsZWQgYnkgMTAwMDAwMAorICogQGNjaWQzaGN0eF9zIC0gUGFja2V0IHNpemUgaW4gYnl0ZXMKKyAqIEBjY2lkM2hjdHhfdF9ydG8gLSBOb2ZlZWRiYWNrIFRpbWVyIHNldHRpbmcgaW4gdXNlY3MKKyAqIEBjY2lkM2hjdHhfdF9pcGkgLSBJbnRlcnBhY2tldCAoc2VuZCkgaW50ZXJ2YWwgKFJGQyAzNDQ4LCA0LjYpIGluIHVzZWNzCisgKiBAY2NpZDNoY3R4X3N0YXRlIC0gU2VuZGVyIHN0YXRlLCBvbmUgb2YgJWNjaWQzX2hjX3R4X3N0YXRlcworICogQGNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudCAtIExhc3Qgd2luZG93IGNvdW50ZXIgc2VudAorICogQGNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50IC0gVGltZXN0YW1wIG9mIGVhcmxpZXN0IHBhY2tldAorICoJCQkJIHdpdGggbGFzdF93aW5fY291bnQgdmFsdWUgc2VudAorICogQGNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lciAtIEhhbmRsZSB0byBubyBmZWVkYmFjayB0aW1lcgorICogQGNjaWQzaGN0eF9pZGxlIC0gRmxhZyBpbmRpY2F0aW5nIHRoYXQgc2VuZGVyIGlzIGlkbGluZworICogQGNjaWQzaGN0eF90X2xkIC0gVGltZSBsYXN0IGRvdWJsZWQgZHVyaW5nIHNsb3cgc3RhcnQKKyAqIEBjY2lkM2hjdHhfdF9ub20gLSBOb21pbmFsIHNlbmQgdGltZSBvZiBuZXh0IHBhY2tldAorICogQGNjaWQzaGN0eF9kZWx0YSAtIFNlbmQgdGltZXIgZGVsdGEgKFJGQyAzNDQ4LCA0LjYpIGluIHVzZWNzCisgKiBAY2NpZDNoY3R4X2hpc3QgLSBQYWNrZXQgaGlzdG9yeQorICogQGNjaWQzaGN0eF9vcHRpb25zX3JlY2VpdmVkIC0gUGFyc2VkIHNldCBvZiByZXRyaWV2ZWQgb3B0aW9ucworICovCiBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayB7CiAJc3RydWN0IHRmcmNfdHhfaW5mbwkJY2NpZDNoY3R4X3RmcmM7CiAjZGVmaW5lIGNjaWQzaGN0eF94CQkJY2NpZDNoY3R4X3RmcmMudGZyY3R4X3gKQEAgLTEwMyw3ICsxMTUsNyBAQAogI2RlZmluZSBjY2lkM2hjdHhfdF9ydG8JCQljY2lkM2hjdHhfdGZyYy50ZnJjdHhfcnRvCiAjZGVmaW5lIGNjaWQzaGN0eF90X2lwaQkJCWNjaWQzaGN0eF90ZnJjLnRmcmN0eF9pcGkKIAl1MTYJCQkJY2NpZDNoY3R4X3M7Ci0gIAl1OAkJCQljY2lkM2hjdHhfc3RhdGU7CisJZW51bSBjY2lkM19oY190eF9zdGF0ZXMJCWNjaWQzaGN0eF9zdGF0ZTo4OwogCXU4CQkJCWNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudDsKIAl1OAkJCQljY2lkM2hjdHhfaWRsZTsKIAlzdHJ1Y3QgdGltZXZhbAkJCWNjaWQzaGN0eF90X2xhc3Rfd2luX2NvdW50OwpAQCAtMTE1LDIzICsxMjcsNDggQEAKIAlzdHJ1Y3QgY2NpZDNfb3B0aW9uc19yZWNlaXZlZAljY2lkM2hjdHhfb3B0aW9uc19yZWNlaXZlZDsKIH07CiAKKy8qIFRGUkMgcmVjZWl2ZXIgc3RhdGVzICovCitlbnVtIGNjaWQzX2hjX3J4X3N0YXRlcyB7CisJVEZSQ19SU1RBVEVfTk9fREFUQSA9IDEsCisJVEZSQ19SU1RBVEVfREFUQSwKKwlURlJDX1JTVEFURV9URVJNICAgID0gMTI3LAorfTsKKworLyoqIHN0cnVjdCBjY2lkM19oY19yeF9zb2NrIC0gQ0NJRDMgcmVjZWl2ZXIgaGFsZi1jb25uZWN0aW9uIHNvY2tldAorICoKKyAqICBAY2NpZDNoY3J4X3hfcmVjdiAgLSAgUmVjZWl2ZXIgZXN0aW1hdGUgb2Ygc2VuZCByYXRlIChSRkMgMzQ0OCA0LjMpCisgKiAgQGNjaWQzaGNyeF9ydHQgIC0gIFJlY2VpdmVyIGVzdGltYXRlIG9mIHJ0dCAobm9uLXN0YW5kYXJkKQorICogIEBjY2lkM2hjcnhfcCAgLSAgY3VycmVudCBsb3NzIGV2ZW50IHJhdGUgKFJGQyAzNDQ4IDUuNCkKKyAqICBAY2NpZDNoY3J4X3NlcW5vX25vbmxvc3MgIC0gIExhc3QgcmVjZWl2ZWQgbm9uLWxvc3Mgc2VxdWVuY2UgbnVtYmVyCisgKiAgQGNjaWQzaGNyeF9jY3ZhbF9ub25sb3NzICAtICBMYXN0IHJlY2VpdmVkIG5vbi1sb3NzIFdpbmRvdyBDQ1ZhbAorICogIEBjY2lkM2hjcnhfY2N2YWxfbGFzdF9jb3VudGVyICAtICBUcmFja3Mgd2luZG93IGNvdW50ZXIgKFJGQyA0MzQyLCA4LjEpCisgKiAgQGNjaWQzaGNyeF9zdGF0ZSAgLSAgcmVjZWl2ZXIgc3RhdGUsIG9uZSBvZiAlY2NpZDNfaGNfcnhfc3RhdGVzCisgKiAgQGNjaWQzaGNyeF9ieXRlc19yZWN2ICAtICBUb3RhbCBzdW0gb2YgRENDUCBwYXlsb2FkIGJ5dGVzCisgKiAgQGNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjayAgLSAgVGltZSBhdCB3aGljaCBsYXN0IGZlZWRiYWNrIHdhcyBzZW50CisgKiAgQGNjaWQzaGNyeF90c3RhbXBfbGFzdF9hY2sgIC0gIFRpbWUgYXQgd2hpY2ggbGFzdCBmZWVkYmFjayB3YXMgc2VudAorICogIEBjY2lkM2hjcnhfaGlzdCAgLSAgUGFja2V0IGhpc3RvcnkKKyAqICBAY2NpZDNoY3J4X2xpX2hpc3QgIC0gIExvc3MgSW50ZXJ2YWwgSGlzdG9yeQorICogIEBjY2lkM2hjcnhfcyAgLSAgUmVjZWl2ZWQgcGFja2V0IHNpemUgaW4gYnl0ZXMKKyAqICBAY2NpZDNoY3J4X3BpbnYgIC0gIEludmVyc2Ugb2YgTG9zcyBFdmVudCBSYXRlIChSRkMgNDM0Miwgc2VjLiA4LjUpCisgKiAgQGNjaWQzaGNyeF9lbGFwc2VkX3RpbWUgIC0gIFRpbWUgc2luY2UgcGFja2V0IHJlY2VwdGlvbgorICovCiBzdHJ1Y3QgY2NpZDNfaGNfcnhfc29jayB7Ci0Jc3RydWN0IHRmcmNfcnhfaW5mbwljY2lkM2hjcnhfdGZyYzsKLSNkZWZpbmUgY2NpZDNoY3J4X3hfcmVjdgljY2lkM2hjcnhfdGZyYy50ZnJjcnhfeF9yZWN2Ci0jZGVmaW5lIGNjaWQzaGNyeF9ydHQJCWNjaWQzaGNyeF90ZnJjLnRmcmNyeF9ydHQKLSNkZWZpbmUgY2NpZDNoY3J4X3AJCWNjaWQzaGNyeF90ZnJjLnRmcmNyeF9wCi0gIAl1NjQJCQljY2lkM2hjcnhfc2Vxbm9fbm9ubG9zczo0OCwKLQkJCQljY2lkM2hjcnhfY2N2YWxfbm9ubG9zczo0LAotCQkJCWNjaWQzaGNyeF9zdGF0ZTo4LAotCQkJCWNjaWQzaGNyeF9jY3ZhbF9sYXN0X2NvdW50ZXI6NDsKLSAgCXUzMgkJCWNjaWQzaGNyeF9ieXRlc19yZWN2OwotICAJc3RydWN0IHRpbWV2YWwJCWNjaWQzaGNyeF90c3RhbXBfbGFzdF9mZWVkYmFjazsKLSAgCXN0cnVjdCB0aW1ldmFsCQljY2lkM2hjcnhfdHN0YW1wX2xhc3RfYWNrOwotCXN0cnVjdCBsaXN0X2hlYWQJY2NpZDNoY3J4X2hpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAljY2lkM2hjcnhfbGlfaGlzdDsKLSAgCXUxNgkJCWNjaWQzaGNyeF9zOwotICAJdTMyCQkJY2NpZDNoY3J4X3BpbnY7Ci0gIAl1MzIJCQljY2lkM2hjcnhfZWxhcHNlZF90aW1lOworCXN0cnVjdCB0ZnJjX3J4X2luZm8JCWNjaWQzaGNyeF90ZnJjOworI2RlZmluZSBjY2lkM2hjcnhfeF9yZWN2CQljY2lkM2hjcnhfdGZyYy50ZnJjcnhfeF9yZWN2CisjZGVmaW5lIGNjaWQzaGNyeF9ydHQJCQljY2lkM2hjcnhfdGZyYy50ZnJjcnhfcnR0CisjZGVmaW5lIGNjaWQzaGNyeF9wCQkJY2NpZDNoY3J4X3RmcmMudGZyY3J4X3AKKwl1NjQJCQkJY2NpZDNoY3J4X3NlcW5vX25vbmxvc3M6NDgsCisJCQkJCWNjaWQzaGNyeF9jY3ZhbF9ub25sb3NzOjQsCisJCQkJCWNjaWQzaGNyeF9jY3ZhbF9sYXN0X2NvdW50ZXI6NDsKKwllbnVtIGNjaWQzX2hjX3J4X3N0YXRlcwkJY2NpZDNoY3J4X3N0YXRlOjg7CisJdTMyCQkJCWNjaWQzaGNyeF9ieXRlc19yZWN2OworCXN0cnVjdCB0aW1ldmFsCQkJY2NpZDNoY3J4X3RzdGFtcF9sYXN0X2ZlZWRiYWNrOworCXN0cnVjdCB0aW1ldmFsCQkJY2NpZDNoY3J4X3RzdGFtcF9sYXN0X2FjazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQljY2lkM2hjcnhfaGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQljY2lkM2hjcnhfbGlfaGlzdDsKKwl1MTYJCQkJY2NpZDNoY3J4X3M7CisJdTMyCQkJCWNjaWQzaGNyeF9waW52OworCXUzMgkJCQljY2lkM2hjcnhfZWxhcHNlZF90aW1lOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqY2NpZDNfaGNfdHhfc2soY29uc3Qgc3RydWN0IHNvY2sgKnNrKQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYyBiL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmMKaW5kZXggOTA2YzgxYS4uMGEwYmFlZiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYworKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jCkBAIC0xMyw3ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgotCisjaW5jbHVkZSAiLi4vLi4vZGNjcC5oIgogI2luY2x1ZGUgImxvc3NfaW50ZXJ2YWwuaCIKIAogc3RydWN0IGRjY3BfbGlfaGlzdCAqZGNjcF9saV9oaXN0X25ldyhjb25zdCBjaGFyICpuYW1lKQpAQCAtMTA5LDcgKzEwOSw3IEBACiAJaV90b3QgPSBtYXgoaV90b3QwLCBpX3RvdDEpOwogCiAJaWYgKCF3X3RvdCkgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcgIiVzOiB3X3RvdCA9IDBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURDQ1BfV0FSTigid190b3QgPSAwXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0xMjUsMTAgKzEyNSwxMCBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IERDQ1BfTElfSElTVF9JVkFMX0ZfTEVOR1RIOyBpKyspIHsKLQkJZW50cnkgPSBkY2NwX2xpX2hpc3RfZW50cnlfbmV3KGhpc3QsIFNMQUJfQVRPTUlDKTsKKwkJZW50cnkgPSBkY2NwX2xpX2hpc3RfZW50cnlfbmV3KGhpc3QsIEdGUF9BVE9NSUMpOwogCQlpZiAoZW50cnkgPT0gTlVMTCkgewogCQkJZGNjcF9saV9oaXN0X3B1cmdlKGhpc3QsIGxpc3QpOwotCQkJZHVtcF9zdGFjaygpOworCQkJRENDUF9CVUcoImxvc3MgaW50ZXJ2YWwgbGlzdCBlbnRyeSBpcyBOVUxMIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQllbnRyeS0+ZGNjcGxpaF9pbnRlcnZhbCA9IH4wOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuaCBiL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmgKaW5kZXggMGFlODVmMC4uZWIyNTcwMSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuaAorKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5oCkBAIC0yMCw3ICsyMCw3IEBACiAjZGVmaW5lIERDQ1BfTElfSElTVF9JVkFMX0ZfTEVOR1RIICA4CiAKIHN0cnVjdCBkY2NwX2xpX2hpc3QgewotCWttZW1fY2FjaGVfdCAqZGNjcGxpaF9zbGFiOworCXN0cnVjdCBrbWVtX2NhY2hlICpkY2NwbGloX3NsYWI7CiB9OwogCiBleHRlcm4gc3RydWN0IGRjY3BfbGlfaGlzdCAqZGNjcF9saV9oaXN0X25ldyhjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5jIGIvbmV0L2RjY3AvY2NpZHMvbGliL3BhY2tldF9oaXN0b3J5LmMKaW5kZXggYjg3NmM5Yy4uMmU4ZWY0MiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3BhY2tldF9oaXN0b3J5LmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvbGliL3BhY2tldF9oaXN0b3J5LmMKQEAgLTM2LDkgKzM2LDEwMCBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KICNpbmNsdWRlICJwYWNrZXRfaGlzdG9yeS5oIgogCisvKgorICogCVRyYW5zbWl0dGVyIEhpc3RvcnkgUm91dGluZXMKKyAqLworc3RydWN0IGRjY3BfdHhfaGlzdCAqZGNjcF90eF9oaXN0X25ldyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkY2NwX3R4X2hpc3QgKmhpc3QgPSBrbWFsbG9jKHNpemVvZigqaGlzdCksIEdGUF9BVE9NSUMpOworCXN0YXRpYyBjb25zdCBjaGFyIGRjY3BfdHhfaGlzdF9tYXNrW10gPSAidHhfaGlzdF8lcyI7CisJY2hhciAqc2xhYl9uYW1lOworCisJaWYgKGhpc3QgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzbGFiX25hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSArIHNpemVvZihkY2NwX3R4X2hpc3RfbWFzaykgLSAxLAorCQkJICAgIEdGUF9BVE9NSUMpOworCWlmIChzbGFiX25hbWUgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZV9oaXN0OworCisJc3ByaW50ZihzbGFiX25hbWUsIGRjY3BfdHhfaGlzdF9tYXNrLCBuYW1lKTsKKwloaXN0LT5kY2NwdHhoX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShzbGFiX25hbWUsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkpLAorCQkJCQkgICAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJaWYgKGhpc3QtPmRjY3B0eGhfc2xhYiA9PSBOVUxMKQorCQlnb3RvIG91dF9mcmVlX3NsYWJfbmFtZTsKK291dDoKKwlyZXR1cm4gaGlzdDsKK291dF9mcmVlX3NsYWJfbmFtZToKKwlrZnJlZShzbGFiX25hbWUpOworb3V0X2ZyZWVfaGlzdDoKKwlrZnJlZShoaXN0KTsKKwloaXN0ID0gTlVMTDsKKwlnb3RvIG91dDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF90eF9oaXN0X25ldyk7CisKK3ZvaWQgZGNjcF90eF9oaXN0X2RlbGV0ZShzdHJ1Y3QgZGNjcF90eF9oaXN0ICpoaXN0KQoreworCWNvbnN0IGNoYXIqIG5hbWUgPSBrbWVtX2NhY2hlX25hbWUoaGlzdC0+ZGNjcHR4aF9zbGFiKTsKKworCWttZW1fY2FjaGVfZGVzdHJveShoaXN0LT5kY2NwdHhoX3NsYWIpOworCWtmcmVlKG5hbWUpOworCWtmcmVlKGhpc3QpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3R4X2hpc3RfZGVsZXRlKTsKKworc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqCisJZGNjcF90eF9oaXN0X2ZpbmRfZW50cnkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgY29uc3QgdTY0IHNlcSkKK3sKKwlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpwYWNrZXQgPSBOVUxMLCAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBsaXN0LCBkY2NwaHR4X25vZGUpCisJCWlmIChlbnRyeS0+ZGNjcGh0eF9zZXFubyA9PSBzZXEpIHsKKwkJCXBhY2tldCA9IGVudHJ5OworCQkJYnJlYWs7CisJCX0KKworCXJldHVybiBwYWNrZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGRjY3BfdHhfaGlzdF9maW5kX2VudHJ5KTsKKwordm9pZCBkY2NwX3R4X2hpc3RfcHVyZ2Uoc3RydWN0IGRjY3BfdHhfaGlzdCAqaGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICplbnRyeSwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsIGxpc3QsIGRjY3BodHhfbm9kZSkgeworCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+ZGNjcGh0eF9ub2RlKTsKKwkJZGNjcF90eF9oaXN0X2VudHJ5X2RlbGV0ZShoaXN0LCBlbnRyeSk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3R4X2hpc3RfcHVyZ2UpOworCit2b2lkIGRjY3BfdHhfaGlzdF9wdXJnZV9vbGRlcihzdHJ1Y3QgZGNjcF90eF9oaXN0ICpoaXN0LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCSAgICAgIHN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2NvbnRpbnVlKHBhY2tldCwgbmV4dCwgbGlzdCwgZGNjcGh0eF9ub2RlKSB7CisJCWxpc3RfZGVsX2luaXQoJnBhY2tldC0+ZGNjcGh0eF9ub2RlKTsKKwkJZGNjcF90eF9oaXN0X2VudHJ5X2RlbGV0ZShoaXN0LCBwYWNrZXQpOworCX0KK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF90eF9oaXN0X3B1cmdlX29sZGVyKTsKKworLyoKKyAqIAlSZWNlaXZlciBIaXN0b3J5IFJvdXRpbmVzCisgKi8KIHN0cnVjdCBkY2NwX3J4X2hpc3QgKmRjY3BfcnhfaGlzdF9uZXcoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZGNjcF9yeF9oaXN0ICpoaXN0ID0ga21hbGxvYyhzaXplb2YoKmhpc3QpLCBHRlBfQVRPTUlDKTsKQEAgLTgzLDE4ICsxNzQsMjQgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9yeF9oaXN0X2RlbGV0ZSk7CiAKLXZvaWQgZGNjcF9yeF9oaXN0X3B1cmdlKHN0cnVjdCBkY2NwX3J4X2hpc3QgKmhpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCitpbnQgZGNjcF9yeF9oaXN0X2ZpbmRfZW50cnkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgY29uc3QgdTY0IHNlcSwKKwkJCSAgICB1OCAqY2N2YWwpCiB7Ci0Jc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqZW50cnksICpuZXh0OworCXN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKnBhY2tldCA9IE5VTEwsICplbnRyeTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgbGlzdCwgZGNjcGhyeF9ub2RlKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5kY2NwaHJ4X25vZGUpOwotCQlrbWVtX2NhY2hlX2ZyZWUoaGlzdC0+ZGNjcHJ4aF9zbGFiLCBlbnRyeSk7Ci0JfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIGxpc3QsIGRjY3Bocnhfbm9kZSkKKwkJaWYgKGVudHJ5LT5kY2NwaHJ4X3NlcW5vID09IHNlcSkgeworCQkJcGFja2V0ID0gZW50cnk7CisJCQlicmVhazsKKwkJfQorCisJaWYgKHBhY2tldCkKKwkJKmNjdmFsID0gcGFja2V0LT5kY2NwaHJ4X2NjdmFsOworCisJcmV0dXJuIHBhY2tldCAhPSBOVUxMOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChkY2NwX3J4X2hpc3RfcHVyZ2UpOwotCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3J4X2hpc3RfZmluZF9lbnRyeSk7CiBzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICoKIAkJZGNjcF9yeF9oaXN0X2ZpbmRfZGF0YV9wYWNrZXQoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKQEAgLTE4NCwxMTAgKzI4MSwxOCBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3J4X2hpc3RfYWRkX3BhY2tldCk7CiAKLXN0cnVjdCBkY2NwX3R4X2hpc3QgKmRjY3BfdHhfaGlzdF9uZXcoY29uc3QgY2hhciAqbmFtZSkKK3ZvaWQgZGNjcF9yeF9oaXN0X3B1cmdlKHN0cnVjdCBkY2NwX3J4X2hpc3QgKmhpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7Ci0Jc3RydWN0IGRjY3BfdHhfaGlzdCAqaGlzdCA9IGttYWxsb2Moc2l6ZW9mKCpoaXN0KSwgR0ZQX0FUT01JQyk7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgZGNjcF90eF9oaXN0X21hc2tbXSA9ICJ0eF9oaXN0XyVzIjsKLQljaGFyICpzbGFiX25hbWU7CisJc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqZW50cnksICpuZXh0OwogCi0JaWYgKGhpc3QgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KLQlzbGFiX25hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSArIHNpemVvZihkY2NwX3R4X2hpc3RfbWFzaykgLSAxLAotCQkJICAgIEdGUF9BVE9NSUMpOwotCWlmIChzbGFiX25hbWUgPT0gTlVMTCkKLQkJZ290byBvdXRfZnJlZV9oaXN0OwotCi0Jc3ByaW50ZihzbGFiX25hbWUsIGRjY3BfdHhfaGlzdF9tYXNrLCBuYW1lKTsKLQloaXN0LT5kY2NwdHhoX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShzbGFiX25hbWUsCi0JCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkpLAotCQkJCQkgICAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAotCQkJCQkgICAgICAgTlVMTCwgTlVMTCk7Ci0JaWYgKGhpc3QtPmRjY3B0eGhfc2xhYiA9PSBOVUxMKQotCQlnb3RvIG91dF9mcmVlX3NsYWJfbmFtZTsKLW91dDoKLQlyZXR1cm4gaGlzdDsKLW91dF9mcmVlX3NsYWJfbmFtZToKLQlrZnJlZShzbGFiX25hbWUpOwotb3V0X2ZyZWVfaGlzdDoKLQlrZnJlZShoaXN0KTsKLQloaXN0ID0gTlVMTDsKLQlnb3RvIG91dDsKLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF90eF9oaXN0X25ldyk7Ci0KLXZvaWQgZGNjcF90eF9oaXN0X2RlbGV0ZShzdHJ1Y3QgZGNjcF90eF9oaXN0ICpoaXN0KQotewotCWNvbnN0IGNoYXIqIG5hbWUgPSBrbWVtX2NhY2hlX25hbWUoaGlzdC0+ZGNjcHR4aF9zbGFiKTsKLQotCWttZW1fY2FjaGVfZGVzdHJveShoaXN0LT5kY2NwdHhoX3NsYWIpOwotCWtmcmVlKG5hbWUpOwotCWtmcmVlKGhpc3QpOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTChkY2NwX3R4X2hpc3RfZGVsZXRlKTsKLQotc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqCi0JZGNjcF90eF9oaXN0X2ZpbmRfZW50cnkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgY29uc3QgdTY0IHNlcSkKLXsKLQlzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpwYWNrZXQgPSBOVUxMLCAqZW50cnk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBsaXN0LCBkY2NwaHR4X25vZGUpCi0JCWlmIChlbnRyeS0+ZGNjcGh0eF9zZXFubyA9PSBzZXEpIHsKLQkJCXBhY2tldCA9IGVudHJ5OwotCQkJYnJlYWs7Ci0JCX0KLQotCXJldHVybiBwYWNrZXQ7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfdHhfaGlzdF9maW5kX2VudHJ5KTsKLQotaW50IGRjY3BfcnhfaGlzdF9maW5kX2VudHJ5KGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGNvbnN0IHU2NCBzZXEsCi0gICB1OCAqY2N2YWwpCi17Ci0Jc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqcGFja2V0ID0gTlVMTCwgKmVudHJ5OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbGlzdCwgZGNjcGhyeF9ub2RlKQotCQlpZiAoZW50cnktPmRjY3Bocnhfc2Vxbm8gPT0gc2VxKSB7Ci0JCQlwYWNrZXQgPSBlbnRyeTsKLQkJCWJyZWFrOwotCQl9Ci0KLQlpZiAocGFja2V0KQotCQkqY2N2YWwgPSBwYWNrZXQtPmRjY3BocnhfY2N2YWw7Ci0KLQlyZXR1cm4gcGFja2V0ICE9IE5VTEw7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfcnhfaGlzdF9maW5kX2VudHJ5KTsKLQotdm9pZCBkY2NwX3R4X2hpc3RfcHVyZ2Vfb2xkZXIoc3RydWN0IGRjY3BfdHhfaGlzdCAqaGlzdCwKLQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0JCQkgICAgICBzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICpwYWNrZXQpCi17Ci0Jc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqbmV4dDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9jb250aW51ZShwYWNrZXQsIG5leHQsIGxpc3QsIGRjY3BodHhfbm9kZSkgewotCQlsaXN0X2RlbF9pbml0KCZwYWNrZXQtPmRjY3BodHhfbm9kZSk7Ci0JCWRjY3BfdHhfaGlzdF9lbnRyeV9kZWxldGUoaGlzdCwgcGFja2V0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsIGxpc3QsIGRjY3Bocnhfbm9kZSkgeworCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+ZGNjcGhyeF9ub2RlKTsKKwkJa21lbV9jYWNoZV9mcmVlKGhpc3QtPmRjY3ByeGhfc2xhYiwgZW50cnkpOwogCX0KIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF90eF9oaXN0X3B1cmdlX29sZGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGRjY3BfcnhfaGlzdF9wdXJnZSk7CiAKLXZvaWQgZGNjcF90eF9oaXN0X3B1cmdlKHN0cnVjdCBkY2NwX3R4X2hpc3QgKmhpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCi17Ci0Jc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqZW50cnksICpuZXh0OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCBsaXN0LCBkY2NwaHR4X25vZGUpIHsKLQkJbGlzdF9kZWxfaW5pdCgmZW50cnktPmRjY3BodHhfbm9kZSk7Ci0JCWRjY3BfdHhfaGlzdF9lbnRyeV9kZWxldGUoaGlzdCwgZW50cnkpOwotCX0KLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF90eF9oaXN0X3B1cmdlKTsKIAogTU9EVUxFX0FVVEhPUigiSWFuIE1jRG9uYWxkIDxpYW4ubWNkb25hbGRAamFuZGkuY28ubno+LCAiCiAJICAgICAgIkFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBnaG9zdHByb3RvY29scy5uZXQ+Iik7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvcGFja2V0X2hpc3RvcnkuaCBiL25ldC9kY2NwL2NjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5oCmluZGV4IDA2N2NmMWMuLjFmOTYwYzEgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5oCisrKyBiL25ldC9kY2NwL2NjaWRzL2xpYi9wYWNrZXRfaGlzdG9yeS5oCkBAIC00OSw0MyArNDksMjcgQEAKICNkZWZpbmUgVEZSQ19XSU5fQ09VTlRfUEVSX1JUVAkgNAogI2RlZmluZSBURlJDX1dJTl9DT1VOVF9MSU1JVAkxNgogCisvKgorICogCVRyYW5zbWl0dGVyIEhpc3RvcnkgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBkZWNsYXJhdGlvbnMKKyAqLwogc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBkY2NwaHR4X25vZGU7CiAJdTY0CQkgZGNjcGh0eF9zZXFubzo0OCwKLQkJCSBkY2NwaHR4X2NjdmFsOjQsCiAJCQkgZGNjcGh0eF9zZW50OjE7CiAJdTMyCQkgZGNjcGh0eF9ydHQ7CiAJc3RydWN0IHRpbWV2YWwJIGRjY3BodHhfdHN0YW1wOwogfTsKIAotc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBkY2NwaHJ4X25vZGU7Ci0JdTY0CQkgZGNjcGhyeF9zZXFubzo0OCwKLQkJCSBkY2NwaHJ4X2NjdmFsOjQsCi0JCQkgZGNjcGhyeF90eXBlOjQ7Ci0JdTMyCQkgZGNjcGhyeF9uZHA7IC8qIEluIGZhY3QgaXQgaXMgZnJvbSA4IHRvIDI0IGJpdHMgKi8KLQlzdHJ1Y3QgdGltZXZhbAkgZGNjcGhyeF90c3RhbXA7Ci19OwotCiBzdHJ1Y3QgZGNjcF90eF9oaXN0IHsKLQlrbWVtX2NhY2hlX3QgKmRjY3B0eGhfc2xhYjsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqZGNjcHR4aF9zbGFiOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkY2NwX3R4X2hpc3QgKmRjY3BfdHhfaGlzdF9uZXcoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gdm9pZCBkY2NwX3R4X2hpc3RfZGVsZXRlKHN0cnVjdCBkY2NwX3R4X2hpc3QgKmhpc3QpOwotCi1zdHJ1Y3QgZGNjcF9yeF9oaXN0IHsKLQlrbWVtX2NhY2hlX3QgKmRjY3ByeGhfc2xhYjsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgZGNjcF9yeF9oaXN0ICpkY2NwX3J4X2hpc3RfbmV3KGNvbnN0IGNoYXIgKm5hbWUpOwotZXh0ZXJuIHZvaWQgZGNjcF9yeF9oaXN0X2RlbGV0ZShzdHJ1Y3QgZGNjcF9yeF9oaXN0ICpoaXN0KTsKLWV4dGVybiBzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICoKLQkJZGNjcF9yeF9oaXN0X2ZpbmRfZGF0YV9wYWNrZXQoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CitleHRlcm4gdm9pZCAJCSAgICBkY2NwX3R4X2hpc3RfZGVsZXRlKHN0cnVjdCBkY2NwX3R4X2hpc3QgKmhpc3QpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKgotCQlkY2NwX3R4X2hpc3RfZW50cnlfbmV3KHN0cnVjdCBkY2NwX3R4X2hpc3QgKmhpc3QsCi0JCQkJICAgICAgIGNvbnN0IGdmcF90IHByaW8pCisJCQlkY2NwX3R4X2hpc3RfZW50cnlfbmV3KHN0cnVjdCBkY2NwX3R4X2hpc3QgKmhpc3QsCisJCQkJCSAgICAgICBjb25zdCBnZnBfdCBwcmlvKQogewogCXN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKmVudHJ5ID0ga21lbV9jYWNoZV9hbGxvYyhoaXN0LT5kY2NwdHhoX3NsYWIsCiAJCQkJCQkJICAgIHByaW8pOwpAQCAtOTYsMzQgKzgwLDggQEAKIAlyZXR1cm4gZW50cnk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX3R4X2hpc3RfZW50cnlfZGVsZXRlKHN0cnVjdCBkY2NwX3R4X2hpc3QgKmhpc3QsCi0JCQkJCSAgICAgc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqZW50cnkpCi17Ci0JaWYgKGVudHJ5ICE9IE5VTEwpCi0JCWttZW1fY2FjaGVfZnJlZShoaXN0LT5kY2NwdHhoX3NsYWIsIGVudHJ5KTsKLX0KLQotZXh0ZXJuIHN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKgotCQkJZGNjcF90eF9oaXN0X2ZpbmRfZW50cnkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkJCWNvbnN0IHU2NCBzZXEpOwotZXh0ZXJuIGludCBkY2NwX3J4X2hpc3RfZmluZF9lbnRyeShjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBjb25zdCB1NjQgc2VxLAotICAgdTggKmNjdmFsKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGRjY3BfdHhfaGlzdF9hZGRfZW50cnkoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkJICBzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICplbnRyeSkKLXsKLQlsaXN0X2FkZCgmZW50cnktPmRjY3BodHhfbm9kZSwgbGlzdCk7Ci19Ci0KLWV4dGVybiB2b2lkIGRjY3BfdHhfaGlzdF9wdXJnZV9vbGRlcihzdHJ1Y3QgZGNjcF90eF9oaXN0ICpoaXN0LAotCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkgICAgIHN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKm5leHQpOwotCi1leHRlcm4gdm9pZCBkY2NwX3R4X2hpc3RfcHVyZ2Uoc3RydWN0IGRjY3BfdHhfaGlzdCAqaGlzdCwKLQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICoKLQkJZGNjcF90eF9oaXN0X2hlYWQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKKwkJCWRjY3BfdHhfaGlzdF9oZWFkKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqaGVhZCA9IE5VTEw7CiAKQEAgLTEzMywxMiArOTEsNTUgQEAKIAlyZXR1cm4gaGVhZDsKIH0KIAorZXh0ZXJuIHN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKgorCQkJZGNjcF90eF9oaXN0X2ZpbmRfZW50cnkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCQkJCWNvbnN0IHU2NCBzZXEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgZGNjcF90eF9oaXN0X2FkZF9lbnRyeShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCQkgIHN0cnVjdCBkY2NwX3R4X2hpc3RfZW50cnkgKmVudHJ5KQoreworCWxpc3RfYWRkKCZlbnRyeS0+ZGNjcGh0eF9ub2RlLCBsaXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRjY3BfdHhfaGlzdF9lbnRyeV9kZWxldGUoc3RydWN0IGRjY3BfdHhfaGlzdCAqaGlzdCwKKwkJCQkJICAgICBzdHJ1Y3QgZGNjcF90eF9oaXN0X2VudHJ5ICplbnRyeSkKK3sKKwlpZiAoZW50cnkgIT0gTlVMTCkKKwkJa21lbV9jYWNoZV9mcmVlKGhpc3QtPmRjY3B0eGhfc2xhYiwgZW50cnkpOworfQorCitleHRlcm4gdm9pZCBkY2NwX3R4X2hpc3RfcHVyZ2Uoc3RydWN0IGRjY3BfdHhfaGlzdCAqaGlzdCwKKwkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKKworZXh0ZXJuIHZvaWQgZGNjcF90eF9oaXN0X3B1cmdlX29sZGVyKHN0cnVjdCBkY2NwX3R4X2hpc3QgKmhpc3QsCisJCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSAgICAgc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqbmV4dCk7CisKKy8qCisgKiAJUmVjZWl2ZXIgSGlzdG9yeSBkYXRhIHN0cnVjdHVyZXMgYW5kIGRlY2xhcmF0aW9ucworICovCitzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRjY3Bocnhfbm9kZTsKKwl1NjQJCSBkY2NwaHJ4X3NlcW5vOjQ4LAorCQkJIGRjY3BocnhfY2N2YWw6NCwKKwkJCSBkY2NwaHJ4X3R5cGU6NDsKKwl1MzIJCSBkY2NwaHJ4X25kcDsgLyogSW4gZmFjdCBpdCBpcyBmcm9tIDggdG8gMjQgYml0cyAqLworCXN0cnVjdCB0aW1ldmFsCSBkY2NwaHJ4X3RzdGFtcDsKK307CisKK3N0cnVjdCBkY2NwX3J4X2hpc3QgeworCXN0cnVjdCBrbWVtX2NhY2hlICpkY2NwcnhoX3NsYWI7Cit9OworCitleHRlcm4gc3RydWN0IGRjY3BfcnhfaGlzdCAqZGNjcF9yeF9oaXN0X25ldyhjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIAkJZGNjcF9yeF9oaXN0X2RlbGV0ZShzdHJ1Y3QgZGNjcF9yeF9oaXN0ICpoaXN0KTsKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICoKLQkJICAgICBkY2NwX3J4X2hpc3RfZW50cnlfbmV3KHN0cnVjdCBkY2NwX3J4X2hpc3QgKmhpc3QsCi0JCQkJICAgICAJICAgIGNvbnN0IHN0cnVjdCBzb2NrICpzaywgCi0JCQkJICAgICAJICAgIGNvbnN0IHUzMiBuZHAsIAotCQkJCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgIGNvbnN0IGdmcF90IHByaW8pCisJCQlkY2NwX3J4X2hpc3RfZW50cnlfbmV3KHN0cnVjdCBkY2NwX3J4X2hpc3QgKmhpc3QsCisJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgICAJICAgICAgIGNvbnN0IHUzMiBuZHAsCisJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgICAgY29uc3QgZ2ZwX3QgcHJpbykKIHsKIAlzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICplbnRyeSA9IGttZW1fY2FjaGVfYWxsb2MoaGlzdC0+ZGNjcHJ4aF9zbGFiLAogCQkJCQkJCSAgICBwcmlvKTsKQEAgLTE1Niw2ICsxNTcsMjggQEAKIAlyZXR1cm4gZW50cnk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqCisJCQlkY2NwX3J4X2hpc3RfaGVhZChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKmhlYWQgPSBOVUxMOworCisJaWYgKCFsaXN0X2VtcHR5KGxpc3QpKQorCQloZWFkID0gbGlzdF9lbnRyeShsaXN0LT5uZXh0LCBzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5LAorCQkJCSAgZGNjcGhyeF9ub2RlKTsKKwlyZXR1cm4gaGVhZDsKK30KKworZXh0ZXJuIGludCBkY2NwX3J4X2hpc3RfZmluZF9lbnRyeShjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBjb25zdCB1NjQgc2VxLAorICAgCQkJCSAgIHU4ICpjY3ZhbCk7CitleHRlcm4gc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqCisJCWRjY3BfcnhfaGlzdF9maW5kX2RhdGFfcGFja2V0KGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOworCitleHRlcm4gdm9pZCBkY2NwX3J4X2hpc3RfYWRkX3BhY2tldChzdHJ1Y3QgZGNjcF9yeF9oaXN0ICpoaXN0LAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpyeF9saXN0LAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaV9saXN0LAorCQkJCSAgICBzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICpwYWNrZXQsCisJCQkJICAgIHU2NCBub25sb3NzX3NlcW5vKTsKKwogc3RhdGljIGlubGluZSB2b2lkIGRjY3BfcnhfaGlzdF9lbnRyeV9kZWxldGUoc3RydWN0IGRjY3BfcnhfaGlzdCAqaGlzdCwKIAkJCQkJICAgICBzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5ICplbnRyeSkKIHsKQEAgLTE2NiwxNyArMTg5LDYgQEAKIGV4dGVybiB2b2lkIGRjY3BfcnhfaGlzdF9wdXJnZShzdHJ1Y3QgZGNjcF9yeF9oaXN0ICpoaXN0LAogCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKgotCQlkY2NwX3J4X2hpc3RfaGVhZChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQotewotCXN0cnVjdCBkY2NwX3J4X2hpc3RfZW50cnkgKmhlYWQgPSBOVUxMOwotCi0JaWYgKCFsaXN0X2VtcHR5KGxpc3QpKQotCQloZWFkID0gbGlzdF9lbnRyeShsaXN0LT5uZXh0LCBzdHJ1Y3QgZGNjcF9yeF9oaXN0X2VudHJ5LAotCQkJCSAgZGNjcGhyeF9ub2RlKTsKLQlyZXR1cm4gaGVhZDsKLX0KLQogc3RhdGljIGlubGluZSBpbnQKIAlkY2NwX3J4X2hpc3RfZW50cnlfZGF0YV9wYWNrZXQoY29uc3Qgc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqZW50cnkpCiB7CkBAIC0xODQsMTIgKzE5Niw2IEBACiAJICAgICAgIGVudHJ5LT5kY2NwaHJ4X3R5cGUgPT0gRENDUF9QS1RfREFUQUFDSzsKIH0KIAotZXh0ZXJuIHZvaWQgZGNjcF9yeF9oaXN0X2FkZF9wYWNrZXQoc3RydWN0IGRjY3BfcnhfaGlzdCAqaGlzdCwKLQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpyeF9saXN0LAotCQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpX2xpc3QsCi0JCQkJICAgc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqcGFja2V0LAotCQkJCSAgIHU2NCBub25sb3NzX3NlcW5vKTsKLQogZXh0ZXJuIHU2NCBkY2NwX3J4X2hpc3RfZGV0ZWN0X2xvc3Moc3RydWN0IGxpc3RfaGVhZCAqcnhfbGlzdCwKIAkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlfbGlzdCwgdTggKndpbl9sb3NzKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuaCBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmgKaW5kZXggNDVmMzBmNS4uZmFmNWY3ZSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuaAorKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5oCkBAIC0xMyw4ICsxMywyOSBAQAogICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworLyogaW50ZWdlci1hcml0aG1ldGljIGRpdmlzaW9ucyBvZiB0eXBlIChhICogMTAwMDAwMCkvYiAqLworc3RhdGljIGlubGluZSB1NjQgc2NhbGVkX2Rpdih1NjQgYSwgdTMyIGIpCit7CisJQlVHX09OKGI9PTApOworCWEgKj0gMTAwMDAwMDsKKwlkb19kaXYoYSwgYik7CisJcmV0dXJuIGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNjYWxlZF9kaXYzMih1NjQgYSwgdTMyIGIpCit7CisJdTY0IHJlc3VsdCA9IHNjYWxlZF9kaXYoYSwgYik7CisKKwlpZiAocmVzdWx0ID4gVUlOVF9NQVgpIHsKKwkJRENDUF9DUklUKCJPdmVyZmxvdzogYSglbGx1KS9iKCV1KSA+IH4wVSIsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpYSwgYik7CisJCXJldHVybiBVSU5UX01BWDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KIAogZXh0ZXJuIHUzMiB0ZnJjX2NhbGNfeCh1MTYgcywgdTMyIFIsIHUzMiBwKTsKIGV4dGVybiB1MzIgdGZyY19jYWxjX3hfcmV2ZXJzZV9sb29rdXAodTMyIGZ2YWx1ZSk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvdGZyY19lcXVhdGlvbi5jIGIvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmNfZXF1YXRpb24uYwppbmRleCA0NDA3NmUwLi45MDAwOWZkIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9saWIvdGZyY19lcXVhdGlvbi5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjX2VxdWF0aW9uLmMKQEAgLTEzLDE2ICsxMyw4MyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCisjaW5jbHVkZSAiLi4vLi4vZGNjcC5oIgogI2luY2x1ZGUgInRmcmMuaCIKIAogI2RlZmluZSBURlJDX0NBTENfWF9BUlJTSVpFIDUwMAorI2RlZmluZSBURlJDX0NBTENfWF9TUExJVCAgIDUwMDAwCS8qIDAuMDUgKiAxMDAwMDAwLCBkZXRhaWxzIGJlbG93ICovCisjZGVmaW5lIFRGUkNfU01BTExFU1RfUAkgICAgKFRGUkNfQ0FMQ19YX1NQTElUL1RGUkNfQ0FMQ19YX0FSUlNJWkUpCiAKLSNkZWZpbmUgVEZSQ19DQUxDX1hfU1BMSVQgNTAwMDAKLS8qIGVxdWl2YWxlbnQgdG8gMC4wNSAqLworLyoKKyAgVEZSQyBUQ1AgUmVubyBUaHJvdWdocHV0IEVxdWF0aW9uIExvb2t1cCBUYWJsZSBmb3IgZihwKQogCisgIFRoZSBmb2xsb3dpbmcgdHdvLWNvbHVtbiBsb29rdXAgdGFibGUgaW1wbGVtZW50cyBhIHBhcnQgb2YgdGhlIFRDUCB0aHJvdWdocHV0CisgIGVxdWF0aW9uIGZyb20gW1JGQyAzNDQ4LCBzZWMuIDMuMV06CisKKwkgCQkJICAgICBzCisgIFhfY2FsYyAgPSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgIFIgKiBzcXJ0KDIqYipwLzMpICsgKDMgKiB0X1JUTyAqIHNxcnQoMypiKnAvOCkgKiAocCArIDMyKnBeMykpCisKKyAgV2hlcmU6CisJWCAgICAgIGlzIHRoZSB0cmFuc21pdCByYXRlIGluIGJ5dGVzL3NlY29uZAorCXMgICAgICBpcyB0aGUgcGFja2V0IHNpemUgaW4gYnl0ZXMKKwlSICAgICAgaXMgdGhlIHJvdW5kIHRyaXAgdGltZSBpbiBzZWNvbmRzCisJcCAgICAgIGlzIHRoZSBsb3NzIGV2ZW50IHJhdGUsIGJldHdlZW4gMCBhbmQgMS4wLCBvZiB0aGUgbnVtYmVyIG9mIGxvc3MKKwkgICAgICAgICAgICAgIGV2ZW50cyBhcyBhIGZyYWN0aW9uIG9mIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0cmFuc21pdHRlZAorCXRfUlRPICBpcyB0aGUgVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcworCWIgICAgICBpcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgYWNrbm93bGVkZ2VkIGJ5IGEgc2luZ2xlIFRDUCBBQ0sKKworICBXZSBjYW4gYXNzdW1lIHRoYXQgYiA9IDEgYW5kIHRfUlRPIGlzIDQgKiBSLiBUaGUgZXF1YXRpb24gbm93IGJlY29tZXM6CisKKwkJCQkgICAgIHMKKyAgWF9jYWxjICA9ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgICBSICogc3FydChwKjIvMykgKyAoMTIgKiBSICogc3FydChwKjMvOCkgKiAocCArIDMyKnBeMykpCisKKyAgd2hpY2ggd2UgY2FuIGJyZWFrIGRvd24gaW50bzoKKworICAgICAgICAgICAgICAgICAgICAgIHMKKwlYX2NhbGMgID0gIC0tLS0tLS0tLQorCSAgICAgICAgICAgIFIgKiBmKHApCisKKyAgd2hlcmUgZihwKSBpcyBnaXZlbiBmb3IgMCA8IHAgPD0gMSBieToKKworCWYocCkgID0gIHNxcnQoMipwLzMpICsgMTIgKiBzcXJ0KDMqcC84KSAqICAocCArIDMyKnBeMykKKworICBTaW5jZSB0aGlzIGlzIGtlcm5lbCBjb2RlLCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljIGlzIGF2b2lkZWQgaW4gZmF2b3VyIG9mCisgIGludGVnZXIgYXJpdGhtZXRpYy4gVGhpcyBtZWFucyB0aGF0IG5lYXJseSBhbGwgZnJhY3Rpb25hbCBwYXJhbWV0ZXJzIGFyZQorICBzY2FsZWQgYnkgMTAwMDAwMDoKKyAgICAqIHRoZSBwYXJhbWV0ZXJzIHAgYW5kIFIKKyAgICAqIHRoZSByZXR1cm4gcmVzdWx0IGYocCkKKyAgVGhlIGxvb2t1cCB0YWJsZSB0aGVyZWZvcmUgYWN0dWFsbHkgdGFidWxhdGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gZyhxKToKKworICAJZyhxKSAgPSAgMTAwMDAwMCAqIGYocS8xMDAwMDAwKQorCisgIEhlbmNlLCB3aGVuIHAgPD0gMSwgcSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMDAwMDAwLiBUbyBhY2hpZXZlIGZpbmVyCisgIGdyYW51bGFyaXR5IGZvciB0aGUgcHJhY3RpY2FsbHkgbW9yZSByZWxldmFudCBjYXNlIG9mIHNtYWxsIHZhbHVlcyBvZiBwICh1cCB0bworICA1JSksIHRoZSBzZWNvbmQgY29sdW1uIGlzIHVzZWQ7IHRoZSBmaXJzdCBvbmUgcmFuZ2VzIHVwIHRvIDEwMCUuICBUaGlzIHNwbGl0CisgIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBvZiBxID0gVEZSQ19DQUxDX1hfU1BMSVQuIEF0IHRoZSBzYW1lIHRpbWUgdGhpcyBhbHNvCisgIGRldGVybWluZXMgdGhlIHNtYWxsZXN0IHJlc29sdXRpb24gcG9zc2libGUgd2l0aCB0aGlzIGxvb2t1cCB0YWJsZToKKworICAgIFRGUkNfU01BTExFU1RfUCAgID0gIFRGUkNfQ0FMQ19YX1NQTElUIC8gVEZSQ19DQUxDX1hfQVJSU0laRQorCisgIFRoZSBlbnRpcmUgdGFibGUgaXMgZ2VuZXJhdGVkIGJ5OgorICAgIGZvcihpPTA7IGkgPCBURlJDX0NBTENfWF9BUlJTSVpFOyBpKyspIHsKKwlsb29rdXBbaV1bMF0gID0gIGcoKGkrMSkgKiAxMDAwMDAwL1RGUkNfQ0FMQ19YX0FSUlNJWkUpOworCWxvb2t1cFtpXVsxXSAgPSAgZygoaSsxKSAqIFRGUkNfQ0FMQ19YX1NQTElUL1RGUkNfQ0FMQ19YX0FSUlNJWkUpOworICAgIH0KKworICBXaXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLCB3ZSBoYXZlLCB3aXRoIE0gPSBURlJDX0NBTENfWF9BUlJTSVpFLTEsCisgICAgbG9va3VwWzBdWzBdICA9ICBnKDEwMDAwMDAvKE0rMSkpIAkJID0gIDEwMDAwMDAgKiBmKDAuMiUpCisgICAgbG9va3VwW01dWzBdICA9ICBnKDEwMDAwMDApCQkJID0gIDEwMDAwMDAgKiBmKDEwMCUpCisgICAgbG9va3VwWzBdWzFdICA9ICBnKFRGUkNfU01BTExFU1RfUCkJCSAgPSAxMDAwMDAwICogZigwLjAxJSkKKyAgICBsb29rdXBbTV1bMV0gID0gIGcoVEZSQ19DQUxDX1hfU1BMSVQpCSA9ICAxMDAwMDAwICogZig1JSkKKworICBJbiBzdW1tYXJ5LCB0aGUgdHdvIGNvbHVtbnMgcmVwcmVzZW50IGYocCkgZm9yIHRoZSBmb2xsb3dpbmcgcmFuZ2VzOgorICAgICogVGhlIGZpcnN0IGNvbHVtbiBpcyBmb3IgICAwLjAwMiAgPD0gcCA8PSAxLjAKKyAgICAqIFRoZSBzZWNvbmQgY29sdW1uIGlzIGZvciAgMC4wMDAxIDw9IHAgPD0gMC4wNQorICBXaGVyZSB0aGUgY29sdW1ucyBvdmVybGFwLCB0aGUgc2Vjb25kIChmaW5lci1ncmFpbmVkKSBpcyBnaXZlbiBwcmVmZXJlbmNlLAorICBpLmUuIHRoZSBmaXJzdCBjb2x1bW4gaXMgdXNlZCBvbmx5IGZvciBwID49IDAuMDUuCisgKi8KIHN0YXRpYyBjb25zdCB1MzIgdGZyY19jYWxjX3hfbG9va3VwW1RGUkNfQ0FMQ19YX0FSUlNJWkVdWzJdID0gewogCXsgICAgIDM3MTcyLCAgIDgxNzIgfSwKIAl7ICAgICA1MzQ5OSwgIDExNTY3IH0sCkBAIC01MjYsMTE3ICs1OTMsMTA1IEBACiAJeyAyNDMzMTU5ODEsIDI3MTMwNSB9CiB9OwogCi0vKiBDYWxjdWxhdGUgdGhlIHNlbmQgcmF0ZSBhcyBwZXIgc2VjdGlvbiAzLjEgb2YgUkZDMzQ0OAotIAotUmV0dXJucyBzZW5kIHJhdGUgaW4gYnl0ZXMgcGVyIHNlY29uZAorLyogcmV0dXJuIGxhcmdlc3QgaW5kZXggaSBzdWNoIHRoYXQgZnZhbCA8PSBsb29rdXBbaV1bc21hbGxdICovCitzdGF0aWMgaW5saW5lIHUzMiB0ZnJjX2JpbnNlYXJjaCh1MzIgZnZhbCwgdTggc21hbGwpCit7CisJdTMyIHRyeSwgbG93ID0gMCwgaGlnaCA9IFRGUkNfQ0FMQ19YX0FSUlNJWkUgLSAxOwogCi1JbnRlZ2VyIG1hdGhzIGFuZCBsb29rdXBzIGFyZSB1c2VkIGFzIG5vdCBhbGxvd2VkIGZsb2F0aW5nIHBvaW50IGluIGtlcm5lbAorCXdoaWxlIChsb3cgPCBoaWdoKSB7CisJCXRyeSA9IChsb3cgKyBoaWdoKSAvIDI7CisJCWlmIChmdmFsIDw9IHRmcmNfY2FsY194X2xvb2t1cFt0cnldW3NtYWxsXSkKKwkJCWhpZ2ggPSB0cnk7CisJCWVsc2UKKwkJCWxvdyAgPSB0cnkgKyAxOworCX0KKwlyZXR1cm4gaGlnaDsKK30KIAotVGhlIGZ1bmN0aW9uIGZvciBYY2FsYyBhcyBwZXIgc2VjdGlvbiAzLjEgb2YgUkZDMzQ0OCBpczoKLQotWCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBSKnNxcnQoMipiKnAvMykgKyAodF9SVE8gKiAoMypzcXJ0KDMqYipwLzgpICogcCAqICgxKzMyKnBeMikpKQotCi13aGVyZSAKLVggaXMgdGhlIHRyYXNtaXQgcmF0ZSBpbiBieXRlcy9zZWNvbmQKLXMgaXMgdGhlIHBhY2tldCBzaXplIGluIGJ5dGVzCi1SIGlzIHRoZSByb3VuZCB0cmlwIHRpbWUgaW4gc2Vjb25kcwotcCBpcyB0aGUgbG9zcyBldmVudCByYXRlLCBiZXR3ZWVuIDAgYW5kIDEuMCwgb2YgdGhlIG51bWJlciBvZiBsb3NzIGV2ZW50cyAKLSAgYXMgYSBmcmFjdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQKLXRfUlRPIGlzIHRoZSBUQ1AgcmV0cmFuc21pc3Npb24gdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzCi1iIGlzIHRoZSBudW1iZXIgb2YgcGFja2V0cyBhY2tub3dsZWRnZWQgYnkgYSBzaW5nbGUgVENQIGFja25vd2xlZGdlbWVudAotCi13ZSBjYW4gYXNzdW1lIHRoYXQgYiA9IDEgYW5kIHRfUlRPIGlzIDQgKiBSLiBXaXRoIHRoaXMgdGhlIGVxdWF0aW9uIGJlY29tZXM6Ci0KLVggPSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIFIgKiBzcXJ0KDIgKiBwIC8gMykgKyAoMTIgKiBSICogKHNxcnQoMyAqIHAgLyA4KSAqIHAgKiAoMSArIDMyICogcF4yKSkpCi0KLQotd2hpY2ggd2UgY2FuIGJyZWFrIGRvd24gaW50bzoKLQotWCA9ICAgICBzCi0gICAgIC0tLS0tLS0tCi0gICAgIFIgKiBmKHApCi0KLXdoZXJlIGYocCkgPSBzcXJ0KDIgKiBwIC8gMykgKyAoMTIgKiBzcXJ0KDMgKiBwIC8gOCkgKiBwICogKDEgKyAzMiAqIHAgKiBwKSkKLQotRnVuY3Rpb24gcGFyYW1ldGVyczoKLXMgLSBieXRlcwotUiAtIFJUVCBpbiB1c2VjcwotcCAtIGxvc3MgcmF0ZSAoZGVjaW1hbCBmcmFjdGlvbiBtdWx0aXBsaWVkIGJ5IDEsMDAwLDAwMCkKLQotUmV0dXJucyBYY2FsYyBpbiBieXRlcyBwZXIgc2Vjb25kCi0KLURPTidUIGFsdGVyIHRoaXMgY29kZSB1bmxlc3MgeW91IHJ1biB0ZXN0IGNhc2VzIGFnYWluc3QgaXQgYXMgdGhlIGNvZGUKLWhhcyBiZWVuIG1hbmlwdWxhdGVkIHRvIHN0b3AgdW5kZXJmbG93L292ZXJsb3cuCi0KLSovCisvKioKKyAqIHRmcmNfY2FsY194IC0gQ2FsY3VsYXRlIHRoZSBzZW5kIHJhdGUgYXMgcGVyIHNlY3Rpb24gMy4xIG9mIFJGQzM0NDgKKyAqCisgKiAgQHM6IHBhY2tldCBzaXplICAgICAgICAgIGluIGJ5dGVzCisgKiAgQFI6IFJUVCAgICAgICAgICAgICAgICAgIHNjYWxlZCBieSAxMDAwMDAwICAgKGkuZS4sIG1pY3Jvc2Vjb25kcykKKyAqICBAcDogbG9zcyByYXRpbyBlc3RpbWF0ZSAgc2NhbGVkIGJ5IDEwMDAwMDAKKyAqICBSZXR1cm5zIFhfY2FsYyAgICAgICAgICAgaW4gYnl0ZXMgcGVyIHNlY29uZCAobm90IHNjYWxlZCkuCisgKi8KIHUzMiB0ZnJjX2NhbGNfeCh1MTYgcywgdTMyIFIsIHUzMiBwKQogewotCWludCBpbmRleDsKKwl1MTYgaW5kZXg7CiAJdTMyIGY7Ci0JdTY0IHRtcDEsIHRtcDI7CisJdTY0IHJlc3VsdDsKIAotCWlmIChwIDwgVEZSQ19DQUxDX1hfU1BMSVQpCi0JCWluZGV4ID0gKHAgLyAoVEZSQ19DQUxDX1hfU1BMSVQgLyBURlJDX0NBTENfWF9BUlJTSVpFKSkgLSAxOwotCWVsc2UKLQkJaW5kZXggPSAocCAvICgxMDAwMDAwIC8gVEZSQ19DQUxDX1hfQVJSU0laRSkpIC0gMTsKKwkvKiBjaGVjayBhZ2FpbnN0IGludmFsaWQgcGFyYW1ldGVycyBhbmQgZGl2aWRlLWJ5LXplcm8gICAqLworCUJVR19PTihwID4gIDEwMDAwMDApOwkJLyogcCBtdXN0IG5vdCBleGNlZWQgMTAwJSAgICovCisJQlVHX09OKHAgPT0gMCk7CQkJLyogZigwKSA9IDAsIGRpdmlkZSBieSB6ZXJvICovCisJaWYgKFIgPT0gMCkgewkJCS8qIHBvc3NpYmxlICBkaXZpZGUgYnkgemVybyAqLworCQlEQ0NQX0NSSVQoIldBUk5JTkc6IFJUVCBpcyAwLCByZXR1cm5pbmcgbWF4aW11bSBYX2NhbGMuIik7CisJCXJldHVybiB+MFU7CisgCX0KIAotCWlmIChpbmRleCA8IDApCi0JCS8qIHAgc2hvdWxkIGJlIDAgdW5sZXNzIHRoZXJlIGlzIGEgYnVnIGluIG15IGNvZGUgKi8KLQkJaW5kZXggPSAwOworCWlmIChwIDw9IFRGUkNfQ0FMQ19YX1NQTElUKSAJCXsgICAgIC8qIDAuMDAwMCA8IHAgPD0gMC4wNSAgICovCisJCWlmIChwIDwgVEZSQ19TTUFMTEVTVF9QKSB7CSAgICAgIC8qIDAuMDAwMCA8IHAgPCAgMC4wMDAxICovCisJCQlEQ0NQX1dBUk4oIlZhbHVlIG9mIHAgKCVkKSBiZWxvdyByZXNvbHV0aW9uLiAiCisJCQkJICAiU3Vic3RpdHV0aW5nICVkXG4iLCBwLCBURlJDX1NNQUxMRVNUX1ApOworCQkJaW5kZXggPSAwOworCQl9IGVsc2UgCQkJCSAgICAgIC8qIDAuMDAwMSA8PSBwIDw9IDAuMDUgICovCisJCQlpbmRleCA9ICBwL1RGUkNfU01BTExFU1RfUCAtIDE7CiAKLQlpZiAoUiA9PSAwKQotCQlSID0gMTsgLyogUlRUIGNhbid0IGJlIHplcm8gb3IgZWxzZSBkaXZpZGUgYnkgemVybyAqLworIAkJZiA9IHRmcmNfY2FsY194X2xvb2t1cFtpbmRleF1bMV07CiAKLQlCVUdfT04oaW5kZXggPj0gVEZSQ19DQUxDX1hfQVJSU0laRSk7CisJfSBlbHNlIHsJIAkJCSAgICAgIC8qIDAuMDUgICA8ICBwIDw9IDEuMDAgICovCisJCWluZGV4ID0gcC8oMTAwMDAwMC9URlJDX0NBTENfWF9BUlJTSVpFKSAtIDE7CiAKLQlpZiAocCA+PSBURlJDX0NBTENfWF9TUExJVCkKIAkJZiA9IHRmcmNfY2FsY194X2xvb2t1cFtpbmRleF1bMF07Ci0JZWxzZQotCQlmID0gdGZyY19jYWxjX3hfbG9va3VwW2luZGV4XVsxXTsKKwl9CiAKLQl0bXAxID0gKCh1NjQpcyAqIDEwMDAwMDAwMCk7Ci0JdG1wMiA9ICgodTY0KVIgKiAodTY0KWYpOwotCWRvX2Rpdih0bXAyLCAxMDAwMCk7Ci0JZG9fZGl2KHRtcDEsIHRtcDIpOyAKLQkvKiBEb24ndCBhbHRlciBhYm92ZSBtYXRoIHVubGVzcyB5b3UgdGVzdCBkdWUgdG8gb3ZlcmZsb3cgb24gMzIgYml0ICovCi0KLQlyZXR1cm4gKHUzMil0bXAxOyAKKwkvKgorCSAqIENvbXB1dGUgWCA9IHMvKFIqZihwKSkgaW4gYnl0ZXMgcGVyIHNlY29uZC4KKwkgKiBTaW5jZSBmKHApIGFuZCBSIGFyZSBib3RoIHNjYWxlZCBieSAxMDAwMDAwLCB3ZSBuZWVkIHRvIG11bHRpcGx5IGJ5CisJICogMTAwMDAwMF4yLiBUbyBhdm9pZCBvdmVyZmxvdywgdGhlIHJlc3VsdCBpcyBjb21wdXRlZCBpbiB0d28gc3RhZ2VzLgorCSAqIFRoaXMgd29ya3MgdW5kZXIgYWxtb3N0IGFsbCByZWFzb25hYmxlIG9wZXJhdGlvbmFsIGNvbmRpdGlvbnMsIGZvciBhCisJICogd2lkZSByYW5nZSBvZiBwYXJhbWV0ZXJzLiBZZXQsIHNob3VsZCBzb21lIHN0cmFuZ2UgY29tYmluYXRpb24gb2YKKwkgKiBwYXJhbWV0ZXJzIHJlc3VsdCBpbiBvdmVyZmxvdywgdGhlIHVzZSBvZiBzY2FsZWRfZGl2MzIgd2lsbCBjYXRjaAorCSAqIHRoaXMgYW5kIHJldHVybiBVSU5UX01BWCAtIHdoaWNoIGlzIGEgbG9naWNhbGx5IGFkZXF1YXRlIGNvbnNlcXVlbmNlLgorCSAqLworCXJlc3VsdCA9IHNjYWxlZF9kaXYocywgUik7CisJcmV0dXJuIHNjYWxlZF9kaXYzMihyZXN1bHQsIGYpOwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTCh0ZnJjX2NhbGNfeCk7CiAKIC8qCi0gKiBhcmdzOiBmdmFsdWUgLSBmdW5jdGlvbiB2YWx1ZSB0byBtYXRjaAotICogcmV0dXJuczogcCBjbG9zZXN0IHRvIHRoYXQgdmFsdWUKKyAqICB0ZnJjX2NhbGNfeF9yZXZlcnNlX2xvb2t1cCAgLSAgdHJ5IHRvIGZpbmQgcCBnaXZlbiBmKHApCiAgKgotICogYm90aCBmdmFsdWUgYW5kIHAgYXJlIG11bHRpcGxpZWQgYnkgMSwwMDAsMDAwIHRvIHVzZSBpbnRzCisgKiAgQGZ2YWx1ZTogZnVuY3Rpb24gdmFsdWUgdG8gbWF0Y2gsIHNjYWxlZCBieSAxMDAwMDAwCisgKiAgUmV0dXJucyBjbG9zZXN0IG1hdGNoIGZvciBwLCBhbHNvIHNjYWxlZCBieSAxMDAwMDAwCiAgKi8KIHUzMiB0ZnJjX2NhbGNfeF9yZXZlcnNlX2xvb2t1cCh1MzIgZnZhbHVlKQogewotCWludCBjdHIgPSAwOwotCWludCBzbWFsbDsKKwlpbnQgaW5kZXg7CiAKLQlpZiAoZnZhbHVlIDwgdGZyY19jYWxjX3hfbG9va3VwWzBdWzFdKQorCWlmIChmdmFsdWUgPT0gMCkJLyogZihwKSA9IDAgIHdoZW5ldmVyICBwID0gMCAqLwogCQlyZXR1cm4gMDsKIAotCWlmIChmdmFsdWUgPD0gdGZyY19jYWxjX3hfbG9va3VwW1RGUkNfQ0FMQ19YX0FSUlNJWkUgLSAxXVsxXSkKLQkJc21hbGwgPSAxOwotCWVsc2UgaWYgKGZ2YWx1ZSA+IHRmcmNfY2FsY194X2xvb2t1cFtURlJDX0NBTENfWF9BUlJTSVpFIC0gMV1bMF0pCisJLyogRXJyb3IgY2FzZXMuICovCisJaWYgKGZ2YWx1ZSA8IHRmcmNfY2FsY194X2xvb2t1cFswXVsxXSkgeworCQlEQ0NQX1dBUk4oImZ2YWx1ZSAlZCBzbWFsbGVyIHRoYW4gcmVzb2x1dGlvblxuIiwgZnZhbHVlKTsKKwkJcmV0dXJuIHRmcmNfY2FsY194X2xvb2t1cFswXVsxXTsKKwl9CisJaWYgKGZ2YWx1ZSA+IHRmcmNfY2FsY194X2xvb2t1cFtURlJDX0NBTENfWF9BUlJTSVpFIC0gMV1bMF0pIHsKKwkJRENDUF9XQVJOKCJmdmFsdWUgJWQgZXhjZWVkcyBib3VuZHMhXG4iLCBmdmFsdWUpOwogCQlyZXR1cm4gMTAwMDAwMDsKLQllbHNlCi0JCXNtYWxsID0gMDsKKwl9CiAKLQl3aGlsZSAoZnZhbHVlID4gdGZyY19jYWxjX3hfbG9va3VwW2N0cl1bc21hbGxdKQotCQljdHIrKzsKLQotCWlmIChzbWFsbCkKLQkJcmV0dXJuIFRGUkNfQ0FMQ19YX1NQTElUICogY3RyIC8gVEZSQ19DQUxDX1hfQVJSU0laRTsKLQllbHNlCi0JCXJldHVybiAxMDAwMDAwICogY3RyIC8gVEZSQ19DQUxDX1hfQVJSU0laRTsKKwlpZiAoZnZhbHVlIDw9IHRmcmNfY2FsY194X2xvb2t1cFtURlJDX0NBTENfWF9BUlJTSVpFIC0gMV1bMV0pIHsKKwkJaW5kZXggPSB0ZnJjX2JpbnNlYXJjaChmdmFsdWUsIDEpOworCQlyZXR1cm4gKGluZGV4ICsgMSkgKiBURlJDX0NBTENfWF9TUExJVCAvIFRGUkNfQ0FMQ19YX0FSUlNJWkU7CisgCX0KKyAKKwkvKiBlbHNlIC4uLiBpdCBtdXN0IGJlIGluIHRoZSBjb2Fyc2UtZ3JhaW5lZCBjb2x1bW4gKi8KKwlpbmRleCA9IHRmcmNfYmluc2VhcmNoKGZ2YWx1ZSwgMCk7CisJcmV0dXJuIChpbmRleCArIDEpICogMTAwMDAwMCAvIFRGUkNfQ0FMQ19YX0FSUlNJWkU7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfY2FsY194X3JldmVyc2VfbG9va3VwKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2RjY3AuaCBiL25ldC9kY2NwL2RjY3AuaAppbmRleCAwYTIxYmU0Li5hMDkwMGJmIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9kY2NwLmgKKysrIGIvbmV0L2RjY3AvZGNjcC5oCkBAIC0xOCwxNSArMTgsMzMgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSAiYWNrdmVjLmgiCiAKKy8qCisgKiAJRENDUCAtIHNwZWNpZmljIHdhcm5pbmcgYW5kIGRlYnVnZ2luZyBtYWNyb3MuCisgKi8KKyNkZWZpbmUgRENDUF9XQVJOKGZtdCwgYS4uLikgTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICIlczogIiBmbXQsICAgICAgIFwKKwkJCQkJCSAgICAgICAgX19GVU5DVElPTl9fLCAjI2EpCisjZGVmaW5lIERDQ1BfQ1JJVChmbXQsIGEuLi4pIHByaW50ayhLRVJOX0NSSVQgZm10ICIgYXQgJXM6JWQvJXMoKVxuIiwgIyNhLCBcCisJCQkJCSBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgRENDUF9CVUcoYS4uLikgICAgICAgZG8geyBEQ0NQX0NSSVQoIkJVRzogIiBhKTsgZHVtcF9zdGFjaygpOyB9IHdoaWxlKDApCisjZGVmaW5lIERDQ1BfQlVHX09OKGNvbmQpICAgIGRvIHsgaWYgKHVubGlrZWx5KChjb25kKSAhPSAwKSkJCSAgIFwKKwkJCQkgICAgIERDQ1BfQlVHKCJcIiVzXCIgaG9sZHMgKGV4Y2VwdGlvbiEpIiwgXAorCQkJCQkgICAgICBfX3N0cmluZ2lmeShjb25kKSk7ICAgICAgICAgIFwKKwkJCSAgICAgfSB3aGlsZSAoMCkKKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBEQ0NQX1BSSU5USyhlbmFibGUsIGZtdCwgYXJncy4uLikJZG8geyBpZiAoZW5hYmxlKQkgICAgIFwKKwkJCQkJCQlwcmludGsoZm10LCAjI2FyZ3MpOyBcCisJCQkJCSAJfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgRENDUF9QUklOVEsoZW5hYmxlLCBmbXQsIGFyZ3MuLi4pCXByaW50ayhmbXQsICMjYXJncykKKyNlbmRpZgorI2RlZmluZSBEQ0NQX1BSX0RFQlVHKGVuYWJsZSwgZm10LCBhLi4uKQlEQ0NQX1BSSU5USyhlbmFibGUsIEtFUk5fREVCVUcgXAorCQkJCQkJICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYSkKKwogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0RFQlVHCiBleHRlcm4gaW50IGRjY3BfZGVidWc7Ci0KLSNkZWZpbmUgZGNjcF9wcl9kZWJ1Zyhmb3JtYXQsIGEuLi4pIFwKLQlkbyB7IGlmIChkY2NwX2RlYnVnKSBcCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsIF9fRlVOQ1RJT05fXyAsICMjYSk7IFwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBkY2NwX3ByX2RlYnVnX2NhdChmb3JtYXQsIGEuLi4pIGRvIHsgaWYgKGRjY3BfZGVidWcpIFwKLQkJCQkJICAgICBwcmludGsoZm9ybWF0LCAjI2EpOyB9IHdoaWxlICgwKQorI2RlZmluZSBkY2NwX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikJICBEQ0NQX1BSX0RFQlVHKGRjY3BfZGVidWcsIGZvcm1hdCwgIyNhKQorI2RlZmluZSBkY2NwX3ByX2RlYnVnX2NhdChmb3JtYXQsIGEuLi4pICAgRENDUF9QUklOVEsoZGNjcF9kZWJ1ZywgZm9ybWF0LCAjI2EpCiAjZWxzZQogI2RlZmluZSBkY2NwX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikKICNkZWZpbmUgZGNjcF9wcl9kZWJ1Z19jYXQoZm9ybWF0LCBhLi4uKQpAQCAtMzUsMjIgKzUzLDI2IEBACiBleHRlcm4gc3RydWN0IGluZXRfaGFzaGluZm8gZGNjcF9oYXNoaW5mbzsKIAogZXh0ZXJuIGF0b21pY190IGRjY3Bfb3JwaGFuX2NvdW50OwotZXh0ZXJuIGludCBkY2NwX3R3X2NvdW50OwotZXh0ZXJuIHZvaWQgZGNjcF90d19kZXNjaGVkdWxlKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KTsKIAogZXh0ZXJuIHZvaWQgZGNjcF90aW1lX3dhaXQoc3RydWN0IHNvY2sgKnNrLCBpbnQgc3RhdGUsIGludCB0aW1lbyk7CiAKLS8qIEZJWE1FOiBSaWdodCBzaXplIHRoaXMgKi8KLSNkZWZpbmUgRENDUF9NQVhfT1BUX0xFTiAxMjgKLQotI2RlZmluZSBEQ0NQX01BWF9QQUNLRVRfSERSIDMyCi0KLSNkZWZpbmUgTUFYX0RDQ1BfSEVBREVSICAoRENDUF9NQVhfUEFDS0VUX0hEUiArIERDQ1BfTUFYX09QVF9MRU4gKyBNQVhfSEVBREVSKQorLyoKKyAqICBTZXQgc2FmZSB1cHBlciBib3VuZHMgZm9yIGhlYWRlciBhbmQgb3B0aW9uIGxlbmd0aC4gU2luY2UgRGF0YSBPZmZzZXQgaXMgOAorICogIGJpdHMgKFJGQyA0MzQwLCBzZWMuIDUuMSksIHRoZSB0b3RhbCBoZWFkZXIgbGVuZ3RoIGNhbiBuZXZlciBiZSBtb3JlIHRoYW4KKyAqICA0ICogMjU1ID0gMTAyMCBieXRlcy4gVGhlIGxhcmdlc3QgcG9zc2libGUgaGVhZGVyIGxlbmd0aCBpcyAyOCBieXRlcyAoWD0xKToKKyAqICAgIC0gRENDUC1SZXNwb25zZSB3aXRoIEFDSyBTdWJoZWFkZXIgYW5kIDQgYnl0ZXMgb2YgU2VydmljZSBjb2RlICAgICAgT1IKKyAqICAgIC0gRENDUC1SZXNldCAgICB3aXRoIEFDSyBTdWJoZWFkZXIgYW5kIDQgYnl0ZXMgb2YgUmVzZXQgQ29kZSBmaWVsZHMKKyAqICBIZW5jZSBhIHNhZmUgdXBwZXIgYm91bmQgZm9yIHRoZSBtYXhpbXVtIG9wdGlvbiBsZW5ndGggaXMgMTAyMC0yOCA9IDk5MgorICovCisjZGVmaW5lIE1BWF9EQ0NQX1NQRUNJRklDX0hFQURFUiAoMjU1ICogc2l6ZW9mKGludCkpCisjZGVmaW5lIERDQ1BfTUFYX1BBQ0tFVF9IRFIgMjgKKyNkZWZpbmUgRENDUF9NQVhfT1BUX0xFTiAoTUFYX0RDQ1BfU1BFQ0lGSUNfSEVBREVSIC0gRENDUF9NQVhfUEFDS0VUX0hEUikKKyNkZWZpbmUgTUFYX0RDQ1BfSEVBREVSIChNQVhfRENDUF9TUEVDSUZJQ19IRUFERVIgKyBNQVhfSEVBREVSKQogCiAjZGVmaW5lIERDQ1BfVElNRVdBSVRfTEVOICg2MCAqIEhaKSAvKiBob3cgbG9uZyB0byB3YWl0IHRvIGRlc3Ryb3kgVElNRS1XQUlUCiAJCQkJICAgICAqIHN0YXRlLCBhYm91dCA2MCBzZWNvbmRzICovCiAKLS8qIGRyYWZ0LWlldGYtZGNjcC1zcGVjLTExLnR4dCBpbml0aWFsIFJUTyB2YWx1ZSAqLworLyogUkZDIDExMjIsIDQuMi4zLjEgaW5pdGlhbCBSVE8gdmFsdWUgKi8KICNkZWZpbmUgRENDUF9USU1FT1VUX0lOSVQgKCh1bnNpZ25lZCkoMyAqIEhaKSkKIAogLyogTWF4aW1hbCBpbnRlcnZhbCBiZXR3ZWVuIHByb2JlcyBmb3IgbG9jYWwgcmVzb3VyY2VzLiAgKi8KQEAgLTU4LDYgKzgwLDE4IEBACiAKICNkZWZpbmUgRENDUF9SVE9fTUFYICgodW5zaWduZWQpKDEyMCAqIEhaKSkgLyogRklYTUU6IHVzaW5nIFRDUCB2YWx1ZSAqLwogCisvKiBzeXNjdGwgdmFyaWFibGVzIGZvciBEQ0NQICovCitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9yZXF1ZXN0X3JldHJpZXM7CitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9yZXRyaWVzMTsKK2V4dGVybiBpbnQgIHN5c2N0bF9kY2NwX3JldHJpZXMyOworZXh0ZXJuIGludCAgc3lzY3RsX2RjY3BfZmVhdF9zZXF1ZW5jZV93aW5kb3c7CitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9mZWF0X3J4X2NjaWQ7CitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9mZWF0X3R4X2NjaWQ7CitleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9mZWF0X2Fja19yYXRpbzsKK2V4dGVybiBpbnQgIHN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9hY2tfdmVjdG9yOworZXh0ZXJuIGludCAgc3lzY3RsX2RjY3BfZmVhdF9zZW5kX25kcF9jb3VudDsKK2V4dGVybiBpbnQgIHN5c2N0bF9kY2NwX3R4X3FsZW47CisKIC8qIGlzIHNlcTEgPCBzZXEyID8gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGJlZm9yZTQ4KGNvbnN0IHU2NCBzZXExLCBjb25zdCB1NjQgc2VxMikKIHsKQEAgLTEyMywxMCArMTU3LDM2IEBACiAjZGVmaW5lIERDQ1BfQUREX1NUQVRTX1VTRVIoZmllbGQsIHZhbCkJXAogCQkJU05NUF9BRERfU1RBVFNfVVNFUihkY2NwX3N0YXRpc3RpY3MsIGZpZWxkLCB2YWwpCiAKKy8qCisgKiAJQ2hlY2tzdW1taW5nIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRjY3BfY3N1bV9jb3ZlcmFnZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWNvbnN0IHN0cnVjdCBkY2NwX2hkciogZGggPSBkY2NwX2hkcihza2IpOworCisJaWYgKGRoLT5kY2NwaF9jc2NvdiA9PSAwKQorCQlyZXR1cm4gc2tiLT5sZW47CisJcmV0dXJuIChkaC0+ZGNjcGhfZG9mZiArIGRoLT5kY2NwaF9jc2NvdiAtIDEpICogc2l6ZW9mKHUzMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX2NzdW1fb3V0Z29pbmcoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgY292ID0gZGNjcF9jc3VtX2NvdmVyYWdlKHNrYik7CisKKwlpZiAoY292ID49IHNrYi0+bGVuKQorCQlkY2NwX2hkcihza2IpLT5kY2NwaF9jc2NvdiA9IDA7CisKKwlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCAwLCAoY292ID4gc2tiLT5sZW4pPyBza2ItPmxlbiA6IGNvdiwgMCk7Cit9CisKK2V4dGVybiB2b2lkIGRjY3BfdjRfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpOworCiBleHRlcm4gaW50ICBkY2NwX3JldHJhbnNtaXRfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIGV4dGVybiB2b2lkIGRjY3Bfc2VuZF9hY2soc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiB2b2lkIGRjY3Bfc2VuZF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIHZvaWQgZGNjcF9yZXFza19zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2ssIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJzayk7CisKIGV4dGVybiB2b2lkIGRjY3Bfc2VuZF9zeW5jKHN0cnVjdCBzb2NrICpzaywgY29uc3QgdTY0IHNlcSwKIAkJCSAgIGNvbnN0IGVudW0gZGNjcF9wa3RfdHlwZSBwa3RfdHlwZSk7CiAKQEAgLTE0NywxOCArMjA3LDcgQEAKIGV4dGVybiB2b2lkIGRjY3Bfc2V0X3N0YXRlKHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IHN0YXRlKTsKIGV4dGVybiB2b2lkIGRjY3BfZG9uZShzdHJ1Y3Qgc29jayAqc2spOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9vcGVucmVxX2luaXQoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJCSAgICAgc3RydWN0IGRjY3Bfc29jayAqZHAsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCS8qCi0JICogRklYTUU6IGZpbGwgaW4gdGhlIG90aGVyIHJlcSBmaWVsZHMgZnJvbSB0aGUgRENDUCBvcHRpb25zCi0JICogcmVjZWl2ZWQKLQkgKi8KLQlpbmV0X3JzayhyZXEpLT5ybXRfcG9ydCA9IGRjY3BfaGRyKHNrYiktPmRjY3BoX3Nwb3J0OwotCWluZXRfcnNrKHJlcSktPmFja2VkCT0gMDsKLQlyZXEtPnJjdl93bmQgPSAwOwotfQorZXh0ZXJuIHZvaWQgZGNjcF9yZXFza19pbml0KHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIGV4dGVybiBpbnQgZGNjcF92NF9jb25uX3JlcXVlc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApAQCAtMjE3LDE0ICsyNjYsOSBAQAogZXh0ZXJuIGludAkgICBpbmV0X2RjY3BfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZGNjcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJICAgICBwb2xsX3RhYmxlICp3YWl0KTsKLWV4dGVybiB2b2lkCSAgIGRjY3BfdjRfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CSAgIGRjY3BfdjRfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCiAJCQkJICAgaW50IGFkZHJfbGVuKTsKIAotZXh0ZXJuIGludAkgICBkY2NwX3Y0X2NoZWNrc3VtKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGNvbnN0IF9fYmUzMiBzYWRkciwgY29uc3QgX19iZTMyIGRhZGRyKTsKLQogZXh0ZXJuIGludAkgICBkY2NwX3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIGRjY3BfcmVzZXRfY29kZXMgY29kZSk7CiBleHRlcm4gdm9pZAkgICBkY2NwX3NlbmRfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgYWN0aXZlKTsKIGV4dGVybiBpbnQJICAgZGNjcF9pbnZhbGlkX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTM4OCw2ICs0MzIsNyBAQAogCQl0di0+dHZfc2VjLS07CiAJCXR2LT50dl91c2VjICs9IFVTRUNfUEVSX1NFQzsKIAl9CisJRENDUF9CVUdfT04odHYtPnR2X3NlYyA8IDApOwogfQogCiAjaWZkZWYgQ09ORklHX1NZU0NUTApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvZmVhdC5jIGIvbmV0L2RjY3AvZmVhdC5jCmluZGV4IGExYjA2ODIuLjk1YjY5MjcgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2ZlYXQuYworKysgYi9uZXQvZGNjcC9mZWF0LmMKQEAgLTEyLDcgKzEyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi0jaW5jbHVkZSAiZGNjcC5oIgogI2luY2x1ZGUgImNjaWQuaCIKICNpbmNsdWRlICJmZWF0LmgiCiAKQEAgLTIzLDkgKzIyLDE3IEBACiB7CiAJc3RydWN0IGRjY3Bfb3B0X3BlbmQgKm9wdDsKIAotCWRjY3BfcHJfZGVidWcoImZlYXQgY2hhbmdlIHR5cGU9JWQgZmVhdD0lZFxuIiwgdHlwZSwgZmVhdHVyZSk7CisJZGNjcF9mZWF0X2RlYnVnKHR5cGUsIGZlYXR1cmUsICp2YWwpOwogCi0JLyogWFhYIHNhbml0eSBjaGVjayBmZWF0IGNoYW5nZSByZXF1ZXN0ICovCisJaWYgKCFkY2NwX2ZlYXRfaXNfdmFsaWRfdHlwZSh0eXBlKSkgeworCQlEQ0NQX1dBUk4oIm9wdGlvbiB0eXBlICVkIGludmFsaWQgaW4gbmVnb3RpYXRpb25cbiIsIHR5cGUpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCFkY2NwX2ZlYXRfaXNfdmFsaWRfbGVuZ3RoKHR5cGUsIGZlYXR1cmUsIGxlbikpIHsKKwkJRENDUF9XQVJOKCJpbnZhbGlkIGxlbmd0aCAlZFxuIiwgbGVuKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIFhYWCBhZGQgZnVydGhlciBzYW5pdHkgY2hlY2tzICovCiAKIAkvKiBjaGVjayBpZiB0aGF0IGZlYXR1cmUgaXMgYWxyZWFkeSBiZWluZyBuZWdvdGlhdGVkICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHQsICZkbXNrLT5kY2NwbXNfcGVuZGluZywgZGNjcG9wX25vZGUpIHsKQEAgLTk1LDE0ICsxMDIsMTQgQEAKIC8qIFhYWCB0YWtpbmcgb25seSB1OCB2YWxzICovCiBzdGF0aWMgaW50IGRjY3BfZmVhdF91cGRhdGUoc3RydWN0IHNvY2sgKnNrLCB1OCB0eXBlLCB1OCBmZWF0LCB1OCB2YWwpCiB7Ci0JZGNjcF9wcl9kZWJ1ZygiY2hhbmdpbmcgWyVkXSBmZWF0ICVkIHRvICVkXG4iLCB0eXBlLCBmZWF0LCB2YWwpOworCWRjY3BfZmVhdF9kZWJ1Zyh0eXBlLCBmZWF0LCB2YWwpOwogCiAJc3dpdGNoIChmZWF0KSB7CiAJY2FzZSBEQ0NQRl9DQ0lEOgogCQlyZXR1cm4gZGNjcF9mZWF0X3VwZGF0ZV9jY2lkKHNrLCB0eXBlLCB2YWwpOwogCWRlZmF1bHQ6Ci0JCWRjY3BfcHJfZGVidWcoIklNUExFTUVOVCBjaGFuZ2luZyBbJWRdIGZlYXQgJWQgdG8gJWRcbiIsCi0JCQkgICAgICB0eXBlLCBmZWF0LCB2YWwpOworCQlkY2NwX3ByX2RlYnVnKCJVTklNUExFTUVOVEVEOiAlcyglZCwgLi4uKVxuIiwKKwkJCSAgICAgIGRjY3BfZmVhdF90eXBlbmFtZSh0eXBlKSwgZmVhdCk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE2Miw3ICsxNjksOCBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCVdBUk5fT04oMSk7IC8qIFhYWCBpbXBsZW1lbnQgcmVzICovCisJCQlEQ0NQX0JVRygiRmVsbCB0aHJvdWdoLCBmZWF0PSVkIiwgb3B0LT5kY2Nwb3BfZmVhdCk7CisJCQkvKiBYWFggaW1wbGVtZW50IHJlcyAqLwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIApAQCAtMjY1LDEwICsyNzMsMTAgQEAKIAl1OCAqY29weTsKIAlpbnQgcmM7CiAKLQkvKiBOTiBmZWF0dXJlcyBtdXN0IGJlIGNoYW5nZSBMICovCi0JaWYgKHR5cGUgPT0gRENDUE9fQ0hBTkdFX1IpIHsKLQkJZGNjcF9wcl9kZWJ1ZygicmVjZWl2ZWQgQ0hBTkdFX1IgJWQgZm9yIE5OIGZlYXQgJWRcbiIsCi0JCQkgICAgICB0eXBlLCBmZWF0dXJlKTsKKwkvKiBOTiBmZWF0dXJlcyBtdXN0IGJlIENoYW5nZSBMIChzZWMuIDYuMy4yKSAqLworCWlmICh0eXBlICE9IERDQ1BPX0NIQU5HRV9MKSB7CisJCWRjY3BfcHJfZGVidWcoInJlY2VpdmVkICVzIGZvciBOTiBmZWF0dXJlICVkXG4iLAorCQkJCWRjY3BfZmVhdF90eXBlbmFtZSh0eXBlKSwgZmVhdHVyZSk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMjc5LDEyICsyODcsMTEgQEAKIAlpZiAob3B0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY29weSA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwljb3B5ID0ga21lbWR1cCh2YWwsIGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKGNvcHkgPT0gTlVMTCkgewogCQlrZnJlZShvcHQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtY3B5KGNvcHksIHZhbCwgbGVuKTsKIAogCW9wdC0+ZGNjcG9wX3R5cGUgPSBEQ0NQT19DT05GSVJNX1I7IC8qIE5OIGNhbiBvbmx5IGNvbmZpcm0gUiAqLwogCW9wdC0+ZGNjcG9wX2ZlYXQgPSBmZWF0dXJlOwpAQCAtMjk5LDcgKzMwNiw4IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQlkY2NwX3ByX2RlYnVnKCJDb25maXJtaW5nIE5OIGZlYXR1cmUgJWQgKHZhbD0lZClcbiIsIGZlYXR1cmUsICpjb3B5KTsKKwlkY2NwX2ZlYXRfZGVidWcodHlwZSwgZmVhdHVyZSwgKmNvcHkpOworCiAJbGlzdF9hZGRfdGFpbCgmb3B0LT5kY2Nwb3Bfbm9kZSwgJmRtc2stPmRjY3Btc19jb25mKTsKIAogCXJldHVybiAwOwpAQCAtMzE4LDE0ICszMjYsMTkgQEAKIAkJcmV0dXJuOwogCX0KIAotCW9wdC0+ZGNjcG9wX3R5cGUgPSB0eXBlID09IERDQ1BPX0NIQU5HRV9MID8gRENDUE9fQ09ORklSTV9SIDoKLQkJCQkJCSAgICBEQ0NQT19DT05GSVJNX0w7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBEQ0NQT19DSEFOR0VfTDogb3B0LT5kY2Nwb3BfdHlwZSA9IERDQ1BPX0NPTkZJUk1fUjsgYnJlYWs7CisJY2FzZSBEQ0NQT19DSEFOR0VfUjogb3B0LT5kY2Nwb3BfdHlwZSA9IERDQ1BPX0NPTkZJUk1fTDsgYnJlYWs7CisJZGVmYXVsdDoJICAgICBEQ0NQX1dBUk4oImludmFsaWQgdHlwZSAlZFxuIiwgdHlwZSk7IHJldHVybjsKKworCX0KIAlvcHQtPmRjY3BvcF9mZWF0ID0gZmVhdHVyZTsKIAlvcHQtPmRjY3BvcF92YWwJID0gTlVMTDsKIAlvcHQtPmRjY3BvcF9sZW4JID0gMDsKIAogCS8qIGNoYW5nZSBmZWF0dXJlICovCi0JZGNjcF9wcl9kZWJ1ZygiRW1wdHkgY29uZmlybSBmZWF0dXJlICVkIHR5cGUgJWRcbiIsIGZlYXR1cmUsIHR5cGUpOworCWRjY3BfcHJfZGVidWcoIkVtcHR5ICVzKCVkKVxuIiwgZGNjcF9mZWF0X3R5cGVuYW1lKHR5cGUpLCBmZWF0dXJlKTsKKwogCWxpc3RfYWRkX3RhaWwoJm9wdC0+ZGNjcG9wX25vZGUsICZkbXNrLT5kY2NwbXNfY29uZik7CiB9CiAKQEAgLTM1OSw3ICszNzIsNyBAQAogewogCWludCByYzsKIAotCWRjY3BfcHJfZGVidWcoImdvdCBmZWF0IGNoYW5nZSB0eXBlPSVkIGZlYXQ9JWRcbiIsIHR5cGUsIGZlYXR1cmUpOworCWRjY3BfZmVhdF9kZWJ1Zyh0eXBlLCBmZWF0dXJlLCAqdmFsKTsKIAogCS8qIGZpZ3VyZSBvdXQgaWYgaXQncyBTUCBvciBOTiBmZWF0dXJlICovCiAJc3dpdGNoIChmZWF0dXJlKSB7CkBAIC0zNzUsNiArMzg4LDggQEAKIAogCS8qIFhYWCBpbXBsZW1lbnQgb3RoZXIgZmVhdHVyZXMgKi8KIAlkZWZhdWx0OgorCQlkY2NwX3ByX2RlYnVnKCJVTklNUExFTUVOVEVEOiBub3QgaGFuZGxpbmcgJXMoJWQsIC4uLilcbiIsCisJCQkgICAgICBkY2NwX2ZlYXRfdHlwZW5hbWUodHlwZSksIGZlYXR1cmUpOwogCQlyYyA9IC1FRkFVTFQ7CiAJCWJyZWFrOwogCX0KQEAgLTQwMywyMCArNDE4LDI3IEBACiAJdTggdDsKIAlzdHJ1Y3QgZGNjcF9vcHRfcGVuZCAqb3B0OwogCXN0cnVjdCBkY2NwX21pbmlzb2NrICpkbXNrID0gZGNjcF9tc2soc2spOwotCWludCByYyA9IDE7CisJaW50IGZvdW5kID0gMDsKIAlpbnQgYWxsX2NvbmZpcm1lZCA9IDE7CiAKLQlkY2NwX3ByX2RlYnVnKCJnb3QgZmVhdCBjb25maXJtIHR5cGU9JWQgZmVhdD0lZFxuIiwgdHlwZSwgZmVhdHVyZSk7Ci0KLQkvKiBYWFggc2FuaXR5IGNoZWNrIHR5cGUgJiBmZWF0ICovCisJZGNjcF9mZWF0X2RlYnVnKHR5cGUsIGZlYXR1cmUsICp2YWwpOwogCiAJLyogbG9jYXRlIG91ciBjaGFuZ2UgcmVxdWVzdCAqLwotCXQgPSB0eXBlID09IERDQ1BPX0NPTkZJUk1fTCA/IERDQ1BPX0NIQU5HRV9SIDogRENDUE9fQ0hBTkdFX0w7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBEQ0NQT19DT05GSVJNX0w6IHQgPSBEQ0NQT19DSEFOR0VfUjsgYnJlYWs7CisJY2FzZSBEQ0NQT19DT05GSVJNX1I6IHQgPSBEQ0NQT19DSEFOR0VfTDsgYnJlYWs7CisJZGVmYXVsdDoJICAgICAgRENDUF9XQVJOKCJpbnZhbGlkIHR5cGUgJWRcbiIsIHR5cGUpOworCQkJICAgICAgcmV0dXJuIDE7CisKKwl9CisJLyogWFhYIHNhbml0eSBjaGVjayBmZWF0dXJlIHZhbHVlICovCiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wdCwgJmRtc2stPmRjY3Btc19wZW5kaW5nLCBkY2Nwb3Bfbm9kZSkgewogCQlpZiAoIW9wdC0+ZGNjcG9wX2NvbmYgJiYgb3B0LT5kY2Nwb3BfdHlwZSA9PSB0ICYmCiAJCSAgICBvcHQtPmRjY3BvcF9mZWF0ID09IGZlYXR1cmUpIHsKLQkJCS8qIHdlIGZvdW5kIGl0ICovCisJCQlmb3VuZCA9IDE7CisJCQlkY2NwX3ByX2RlYnVnKCJmZWF0dXJlICVkIGZvdW5kXG4iLCBvcHQtPmRjY3BvcF9mZWF0KTsKKwogCQkJLyogWFhYIGRvIHNhbml0eSBjaGVjayAqLwogCiAJCQlvcHQtPmRjY3BvcF9jb25mID0gMTsKQEAgLTQyNSw5ICs0NDcsNyBAQAogCQkJZGNjcF9mZWF0X3VwZGF0ZShzaywgb3B0LT5kY2Nwb3BfdHlwZSwKIAkJCQkJIG9wdC0+ZGNjcG9wX2ZlYXQsICp2YWwpOwogCi0JCQlkY2NwX3ByX2RlYnVnKCJmZWF0ICVkIHR5cGUgJWQgY29uZmlybWVkICVkXG4iLAotCQkJCSAgICAgIGZlYXR1cmUsIHR5cGUsICp2YWwpOwotCQkJcmMgPSAwOworCQkJLyogWFhYIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgZGNjcF9mZWF0X3VwZGF0ZSAqLwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDQ2LDkgKzQ2Niw5IEBACiAJCWluZXRfY3NrX2NsZWFyX3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TKTsKIAl9CiAKLQlpZiAocmMpCi0JCWRjY3BfcHJfZGVidWcoImZlYXQgJWQgdHlwZSAlZCBuZXZlciByZXF1ZXN0ZWRcbiIsCi0JCQkgICAgICBmZWF0dXJlLCB0eXBlKTsKKwlpZiAoIWZvdW5kKQorCQlkY2NwX3ByX2RlYnVnKCIlcyglZCwgLi4uKSBuZXZlciByZXF1ZXN0ZWRcbiIsCisJCQkgICAgICBkY2NwX2ZlYXRfdHlwZW5hbWUodHlwZSksIGZlYXR1cmUpOwogCXJldHVybiAwOwogfQogCkBAIC01MDEsMjAgKzUyMSwxOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkob3B0LCAmb2xkZG1zay0+ZGNjcG1zX3BlbmRpbmcsIGRjY3BvcF9ub2RlKSB7CiAJCXN0cnVjdCBkY2NwX29wdF9wZW5kICpuZXdvcHQ7CiAJCS8qIGNvcHkgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gKi8KLQkJdTggKnZhbCA9IGttYWxsb2Mob3B0LT5kY2Nwb3BfbGVuLCBHRlBfQVRPTUlDKTsKKwkJdTggKnZhbCA9IGttZW1kdXAob3B0LT5kY2Nwb3BfdmFsLCBvcHQtPmRjY3BvcF9sZW4sIEdGUF9BVE9NSUMpOwogCiAJCWlmICh2YWwgPT0gTlVMTCkKIAkJCWdvdG8gb3V0X2NsZWFuOwotCQltZW1jcHkodmFsLCBvcHQtPmRjY3BvcF92YWwsIG9wdC0+ZGNjcG9wX2xlbik7CiAKLQkJbmV3b3B0ID0ga21hbGxvYyhzaXplb2YoKm5ld29wdCksIEdGUF9BVE9NSUMpOworCQluZXdvcHQgPSBrbWVtZHVwKG9wdCwgc2l6ZW9mKCpuZXdvcHQpLCBHRlBfQVRPTUlDKTsKIAkJaWYgKG5ld29wdCA9PSBOVUxMKSB7CiAJCQlrZnJlZSh2YWwpOwogCQkJZ290byBvdXRfY2xlYW47CiAJCX0KIAogCQkvKiBpbnNlcnQgdGhlIG9wdGlvbiAqLwotCQltZW1jcHkobmV3b3B0LCBvcHQsIHNpemVvZigqbmV3b3B0KSk7CiAJCW5ld29wdC0+ZGNjcG9wX3ZhbCA9IHZhbDsKIAkJbGlzdF9hZGRfdGFpbCgmbmV3b3B0LT5kY2Nwb3Bfbm9kZSwgJm5ld2Rtc2stPmRjY3Btc19wZW5kaW5nKTsKIApAQCAtNTQ1LDEwICs1NjMsOSBAQAogCQkJICAgIHU4ICp2YWwsIHU4IGxlbikKIHsKIAlpbnQgcmMgPSAtRU5PTUVNOwotCXU4ICpjb3B5ID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCXU4ICpjb3B5ID0ga21lbWR1cCh2YWwsIGxlbiwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoY29weSAhPSBOVUxMKSB7Ci0JCW1lbWNweShjb3B5LCB2YWwsIGxlbik7CiAJCXJjID0gZGNjcF9mZWF0X2NoYW5nZShkbXNrLCB0eXBlLCBmZWF0LCBjb3B5LCBsZW4sIEdGUF9LRVJORUwpOwogCQlpZiAocmMpCiAJCQlrZnJlZShjb3B5KTsKQEAgLTU4MywzICs2MDAsNDUgQEAKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9mZWF0X2luaXQpOworCisjaWZkZWYgQ09ORklHX0lQX0RDQ1BfREVCVUcKK2NvbnN0IGNoYXIgKmRjY3BfZmVhdF90eXBlbmFtZShjb25zdCB1OCB0eXBlKQoreworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBEQ0NQT19DSEFOR0VfTDogIHJldHVybigiQ2hhbmdlTCIpOworCWNhc2UgRENDUE9fQ09ORklSTV9MOiByZXR1cm4oIkNvbmZpcm1MIik7CisJY2FzZSBEQ0NQT19DSEFOR0VfUjogIHJldHVybigiQ2hhbmdlUiIpOworCWNhc2UgRENDUE9fQ09ORklSTV9SOiByZXR1cm4oIkNvbmZpcm1SIik7CisJLyogdGhlIGZvbGxvd2luZyBjYXNlIG11c3Qgbm90IGFwcGVhciBpbiBmZWF0dXJlIG5lZ290YXRpb24gICovCisJZGVmYXVsdDoJICAgICAgZGNjcF9wcl9kZWJ1ZygidW5rbm93biB0eXBlICVkIFtCVUchXVxuIiwgdHlwZSk7CisJfQorCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX2ZlYXRfdHlwZW5hbWUpOworCitjb25zdCBjaGFyICpkY2NwX2ZlYXRfbmFtZShjb25zdCB1OCBmZWF0KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpmZWF0dXJlX25hbWVzW10gPSB7CisJCVtEQ0NQRl9SRVNFUlZFRF0JPSAiUmVzZXJ2ZWQiLAorCQlbRENDUEZfQ0NJRF0JCT0gIkNDSUQiLAorCQlbRENDUEZfU0hPUlRfU0VRTk9TXQk9ICJBbGxvdyBTaG9ydCBTZXFub3MiLAorCQlbRENDUEZfU0VRVUVOQ0VfV0lORE9XXQk9ICJTZXF1ZW5jZSBXaW5kb3ciLAorCQlbRENDUEZfRUNOX0lOQ0FQQUJMRV0JPSAiRUNOIEluY2FwYWJsZSIsCisJCVtEQ0NQRl9BQ0tfUkFUSU9dCT0gIkFjayBSYXRpbyIsCisJCVtEQ0NQRl9TRU5EX0FDS19WRUNUT1JdCT0gIlNlbmQgQUNLIFZlY3RvciIsCisJCVtEQ0NQRl9TRU5EX05EUF9DT1VOVF0JPSAiU2VuZCBORFAgQ291bnQiLAorCQlbRENDUEZfTUlOX0NTVU1fQ09WRVJdCT0gIk1pbi4gQ3N1bSBDb3ZlcmFnZSIsCisJCVtEQ0NQRl9EQVRBX0NIRUNLU1VNXQk9ICJTZW5kIERhdGEgQ2hlY2tzdW0iLAorCX07CisJaWYgKGZlYXQgPj0gRENDUEZfTUlOX0NDSURfU1BFQ0lGSUMpCisJCXJldHVybiAiQ0NJRC1zcGVjaWZpYyI7CisKKwlpZiAoZGNjcF9mZWF0X2lzX3Jlc2VydmVkKGZlYXQpKQorCQlyZXR1cm4gZmVhdHVyZV9uYW1lc1tEQ0NQRl9SRVNFUlZFRF07CisKKwlyZXR1cm4gZmVhdHVyZV9uYW1lc1tmZWF0XTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9mZWF0X25hbWUpOworI2VuZGlmIC8qIENPTkZJR19JUF9EQ0NQX0RFQlVHICovCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9mZWF0LmggYi9uZXQvZGNjcC9mZWF0LmgKaW5kZXggY2VlNTUzZC4uMmMzNzNhZCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZmVhdC5oCisrKyBiL25ldC9kY2NwL2ZlYXQuaApAQCAtMTIsOSArMTIsNDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJkY2NwLmgiCiAKLXN0cnVjdCBzb2NrOwotc3RydWN0IGRjY3BfbWluaXNvY2s7CitzdGF0aWMgaW5saW5lIGludCBkY2NwX2ZlYXRfaXNfdmFsaWRfbGVuZ3RoKHU4IHR5cGUsIHU4IGZlYXR1cmUsIHU4IGxlbikKK3sKKwkvKiBzZWMuIDYuMTogQ29uZmlybSBoYXMgYXQgbGVhc3QgbGVuZ3RoIDMsCisJICogc2VjLiA2LjI6IENoYW5nZSAgaGFzIGF0IGxlYXN0IGxlbmd0aCA0ICovCisJaWYgKGxlbiA8IDMpCisJCXJldHVybiAxOworCWlmIChsZW4gPCA0ICAmJiAodHlwZSA9PSBEQ0NQT19DSEFOR0VfTCB8fCB0eXBlID09IERDQ1BPX0NIQU5HRV9SKSkKKwkJcmV0dXJuIDE7CisJLyogWFhYOiBhZGQgcGVyLWZlYXR1cmUgbGVuZ3RoIHZhbGlkYXRpb24gKHNlYy4gNi42LjgpICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRjY3BfZmVhdF9pc19yZXNlcnZlZChjb25zdCB1OCBmZWF0KQoreworCXJldHVybiAoZmVhdCA+IERDQ1BGX0RBVEFfQ0hFQ0tTVU0gJiYKKwkJZmVhdCA8IERDQ1BGX01JTl9DQ0lEX1NQRUNJRklDKSB8fAorCSAgICAgICAgZmVhdCA9PSBEQ0NQRl9SRVNFUlZFRDsKK30KKworLyogZmVhdHVyZSBuZWdvdGlhdGlvbiBrbm93cyBvbmx5IHRoZXNlIGZvdXIgb3B0aW9uIHR5cGVzIChSRkMgNDM0MCwgc2VjLiA2KSAqLworc3RhdGljIGlubGluZSBpbnQgZGNjcF9mZWF0X2lzX3ZhbGlkX3R5cGUoY29uc3QgdTggb3B0bnVtKQoreworCXJldHVybiBvcHRudW0gPj0gRENDUE9fQ0hBTkdFX0wgJiYgb3B0bnVtIDw9IERDQ1BPX0NPTkZJUk1fUjsKKworfQorCisjaWZkZWYgQ09ORklHX0lQX0RDQ1BfREVCVUcKK2V4dGVybiBjb25zdCBjaGFyICpkY2NwX2ZlYXRfdHlwZW5hbWUoY29uc3QgdTggdHlwZSk7CitleHRlcm4gY29uc3QgY2hhciAqZGNjcF9mZWF0X25hbWUoY29uc3QgdTggZmVhdCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX2ZlYXRfZGVidWcoY29uc3QgdTggdHlwZSwgY29uc3QgdTggZmVhdCwgY29uc3QgdTggdmFsKQoreworCWRjY3BfcHJfZGVidWcoIiVzKCVzICglZCksICVkKVxuIiwgZGNjcF9mZWF0X3R5cGVuYW1lKHR5cGUpLAorCQkJCQkgICBkY2NwX2ZlYXRfbmFtZShmZWF0KSwgZmVhdCwgdmFsKTsKK30KKyNlbHNlCisjZGVmaW5lIGRjY3BfZmVhdF9kZWJ1Zyh0eXBlLCBmZWF0LCB2YWwpCisjZW5kaWYgLyogQ09ORklHX0lQX0RDQ1BfREVCVUcgKi8KIAogZXh0ZXJuIGludCAgZGNjcF9mZWF0X2NoYW5nZShzdHJ1Y3QgZGNjcF9taW5pc29jayAqZG1zaywgdTggdHlwZSwgdTggZmVhdHVyZSwKIAkJCSAgICAgdTggKnZhbCwgdTggbGVuLCBnZnBfdCBnZnApOwpAQCAtMjYsMTEgKzYzLDQgQEAKIGV4dGVybiBpbnQgIGRjY3BfZmVhdF9jbG9uZShzdHJ1Y3Qgc29jayAqb2xkc2ssIHN0cnVjdCBzb2NrICpuZXdzayk7CiBleHRlcm4gaW50ICBkY2NwX2ZlYXRfaW5pdChzdHJ1Y3QgZGNjcF9taW5pc29jayAqZG1zayk7CiAKLWV4dGVybiBpbnQgIGRjY3BfZmVhdF9kZWZhdWx0X3NlcXVlbmNlX3dpbmRvdzsKLWV4dGVybiBpbnQgIGRjY3BfZmVhdF9kZWZhdWx0X3J4X2NjaWQ7Ci1leHRlcm4gaW50ICBkY2NwX2ZlYXRfZGVmYXVsdF90eF9jY2lkOwotZXh0ZXJuIGludCAgZGNjcF9mZWF0X2RlZmF1bHRfYWNrX3JhdGlvOwotZXh0ZXJuIGludCAgZGNjcF9mZWF0X2RlZmF1bHRfc2VuZF9hY2tfdmVjdG9yOwotZXh0ZXJuIGludCAgZGNjcF9mZWF0X2RlZmF1bHRfc2VuZF9uZHBfY291bnQ7Ci0KICNlbmRpZiAvKiBfRENDUF9GRUFUX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lucHV0LmMgYi9uZXQvZGNjcC9pbnB1dC5jCmluZGV4IDdmOWRjNmEuLjU2NWJjODAgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lucHV0LmMKKysrIGIvbmV0L2RjY3AvaW5wdXQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgbmV0L2RjY3AvaW5wdXQuYwotICogCisgKgogICogIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEQ0NQIHByb3RvY29sCiAgKiAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAgKgpAQCAtODIsNyArODIsNyBAQAogCSAqCSAgT3RoZXJ3aXNlLAogCSAqCSAgICAgRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqLwotCWlmIChkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9TWU5DIHx8IAorCWlmIChkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9TWU5DIHx8CiAJICAgIGRoLT5kY2NwaF90eXBlID09IERDQ1BfUEtUX1NZTkNBQ0spIHsKIAkJaWYgKGJldHdlZW40OChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxLAogCQkJICAgICAgZHAtPmRjY3BzX2F3bCwgZHAtPmRjY3BzX2F3aCkgJiYKQEAgLTEyOCwyMSArMTI4LDE4IEBACiAJCSAgICAgRENDUF9QS1RfV0lUSE9VVF9BQ0tfU0VRKSkKIAkJCWRwLT5kY2Nwc19nYXIgPSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxOwogCX0gZWxzZSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiRENDUDogU3RlcCA2IGZhaWxlZCBmb3IgJXMgcGFja2V0LCAiCi0JCQkJCSAgICAiKExTV0woJWxsdSkgPD0gUC5zZXFubyglbGx1KSA8PSBTLlNXSCglbGx1KSkgYW5kICIKLQkJCQkJICAgICIoUC5hY2tubyAlcyBvciBMQVdMKCVsbHUpIDw9IFAuYWNrbm8oJWxsdSkgPD0gUy5BV0goJWxsdSksICIKLQkJCQkJICAgICJzZW5kaW5nIFNZTkMuLi5cbiIsCi0JCQkgICAgICAgZGNjcF9wYWNrZXRfbmFtZShkaC0+ZGNjcGhfdHlwZSksCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbHN3bCwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQotCQkJICAgICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBkcC0+ZGNjcHNfc3doLAotCQkJICAgICAgIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxID09CisJCURDQ1BfV0FSTigiRENDUDogU3RlcCA2IGZhaWxlZCBmb3IgJXMgcGFja2V0LCAiCisJCQkgICIoTFNXTCglbGx1KSA8PSBQLnNlcW5vKCVsbHUpIDw9IFMuU1dIKCVsbHUpKSBhbmQgIgorCQkJICAiKFAuYWNrbm8gJXMgb3IgTEFXTCglbGx1KSA8PSBQLmFja25vKCVsbHUpIDw9IFMuQVdIKCVsbHUpLCAiCisJCQkgICJzZW5kaW5nIFNZTkMuLi5cbiIsICBkY2NwX3BhY2tldF9uYW1lKGRoLT5kY2NwaF90eXBlKSwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbHN3bCwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBkcC0+ZGNjcHNfc3doLAorCQkJICAoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSA9PQogCQkJICAgICAgICBEQ0NQX1BLVF9XSVRIT1VUX0FDS19TRVEpID8gImRvZXNuJ3QgZXhpc3QiIDogImV4aXN0cyIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbGF3bCwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQotCQkJICAgICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZHAtPmRjY3BzX2F3aCk7CisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGxhd2wsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEsCisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGRwLT5kY2Nwc19hd2gpOwogCQlkY2NwX3NlbmRfc3luYyhzaywgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLCBEQ0NQX1BLVF9TWU5DKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTE4OCw4ICsxODUsOCBAQAogCQlkY2NwX3Jjdl9jbG9zZShzaywgc2tiKTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBEQ0NQX1BLVF9SRVFVRVNUOgotCQkvKiBTdGVwIDcgCi0gICAgICAgICAgICAJICogICBvciAoUy5pc19zZXJ2ZXIgYW5kIFAudHlwZSA9PSBSZXNwb25zZSkKKwkJLyogU3RlcCA3CisJCSAqICAgb3IgKFMuaXNfc2VydmVyIGFuZCBQLnR5cGUgPT0gUmVzcG9uc2UpCiAJCSAqICAgb3IgKFMuaXNfY2xpZW50IGFuZCBQLnR5cGUgPT0gUmVxdWVzdCkKIAkJICogICBvciAoUy5zdGF0ZSA+PSBPUEVOIGFuZCBQLnR5cGUgPT0gUmVxdWVzdAogCQkgKglhbmQgUC5zZXFubyA+PSBTLk9TUikKQEAgLTIxNiwxMSArMjEzLDExIEBACiAJCWRjY3Bfc2VuZF9zeW5jKHNrLCBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXEsCiAJCQkgICAgICAgRENDUF9QS1RfU1lOQ0FDSyk7CiAJCS8qCi0JCSAqIEZyb20gdGhlIGRyYWZ0OgorCQkgKiBGcm9tIFJGQyA0MzQwLCBzZWMuIDUuNwogCQkgKgogCQkgKiBBcyB3aXRoIERDQ1AtQWNrIHBhY2tldHMsIERDQ1AtU3luYyBhbmQgRENDUC1TeW5jQWNrIHBhY2tldHMKIAkJICogTUFZIGhhdmUgbm9uLXplcm8tbGVuZ3RoIGFwcGxpY2F0aW9uIGRhdGEgYXJlYXMsIHdob3NlCi0JCSAqIGNvbnRlbnRzICogcmVjZWl2ZXJzIE1VU1QgaWdub3JlLgorCQkgKiBjb250ZW50cyByZWNlaXZlcnMgTVVTVCBpZ25vcmUuCiAJCSAqLwogCQlnb3RvIGRpc2NhcmQ7CiAJfQpAQCAtMjUxLDggKzI0OCwxOCBAQAogCQkJICAgIERDQ1BfQUNLVkVDX1NUQVRFX1JFQ0VJVkVEKSkKIAkJZ290byBkaXNjYXJkOwogCi0JY2NpZF9oY19yeF9wYWNrZXRfcmVjdihkcC0+ZGNjcHNfaGNfcnhfY2NpZCwgc2ssIHNrYik7Ci0JY2NpZF9oY190eF9wYWNrZXRfcmVjdihkcC0+ZGNjcHNfaGNfdHhfY2NpZCwgc2ssIHNrYik7CisJLyoKKwkgKiBEZWxpdmVyIHRvIHRoZSBDQ0lEIG1vZHVsZSBpbiBjaGFyZ2UuCisJICogRklYTUU6IEN1cnJlbnRseSBEQ0NQIG9wZXJhdGVzIG9uZS1kaXJlY3Rpb25hbCBvbmx5LCBpLmUuIGEgbGlzdGVuaW5nCisJICogICAgICAgIHNlcnZlciBpcyBub3QgYXQgdGhlIHNhbWUgdGltZSBhIGNvbm5lY3RpbmcgY2xpZW50LiBUaGVyZSBpcworCSAqICAgICAgICBub3QgbXVjaCBzZW5zZSBpbiBkZWxpdmVyaW5nIHRvIGJvdGggcngvdHggc2lkZXMgYXQgdGhlIG1vbWVudAorCSAqICAgICAgICAob25seSBvbmUgaXMgYWN0aXZlIGF0IGEgdGltZSk7IHdoZW4gbW92aW5nIHRvIGJpZGlyZWN0aW9uYWwKKwkgKiAgICAgICAgc2VydmljZSwgdGhpcyBuZWVkcyB0byBiZSByZXZpc2VkLgorCSAqLworCWlmIChkY2NwX3NrKHNrKS0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfU0VSVkVSKQorCQljY2lkX2hjX3J4X3BhY2tldF9yZWN2KGRwLT5kY2Nwc19oY19yeF9jY2lkLCBzaywgc2tiKTsKKwllbHNlCisJCWNjaWRfaGNfdHhfcGFja2V0X3JlY3YoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCBza2IpOwogCiAJcmV0dXJuIF9fZGNjcF9yY3ZfZXN0YWJsaXNoZWQoc2ssIHNrYiwgZGgsIGxlbik7CiBkaXNjYXJkOgpAQCAtMjY3LDcgKzI3NCw3IEBACiAJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLAogCQkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgbGVuKQogewotCS8qIAorCS8qCiAJICogIFN0ZXAgNDogUHJlcGFyZSBzZXF1ZW5jZSBudW1iZXJzIGluIFJFUVVFU1QKIAkgKiAgICAgSWYgUy5zdGF0ZSA9PSBSRVFVRVNULAogCSAqCSAgSWYgKFAudHlwZSA9PSBSZXNwb25zZSBvciBQLnR5cGUgPT0gUmVzZXQpCkBAIC0zMzUsNyArMzQyLDcgQEAKIAkJICoJICAgICAgZnJvbSB0aGUgUmVzcG9uc2UgKiAvCiAJCSAqCSAgUy5zdGF0ZSA6PSBQQVJUT1BFTgogCQkgKgkgIFNldCBQQVJUT1BFTiB0aW1lcgotCQkgKiAJICBDb250aW51ZSB3aXRoIFMuc3RhdGUgPT0gUEFSVE9QRU4KKwkJICoJICBDb250aW51ZSB3aXRoIFMuc3RhdGUgPT0gUEFSVE9QRU4KIAkJICoJICAvICogU3RlcCAxMiB3aWxsIHNlbmQgdGhlIEFjayBjb21wbGV0aW5nIHRoZQogCQkgKgkgICAgICB0aHJlZS13YXkgaGFuZHNoYWtlICogLwogCQkgKi8KQEAgLTM2Niw3ICszNzMsNyBAQAogCQkJICovCiAJCQlfX2tmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIDA7Ci0JCX0gCisJCX0KIAkJZGNjcF9zZW5kX2Fjayhzayk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0zNzQsNyArMzgxLDcgQEAKIG91dF9pbnZhbGlkX3BhY2tldDoKIAkvKiBkY2NwX3Y0X2RvX3JjdiB3aWxsIHNlbmQgYSByZXNldCAqLwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3Jlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfUEFDS0VUX0VSUk9SOwotCXJldHVybiAxOyAKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBkY2NwX3Jjdl9yZXNwb25kX3BhcnRvcGVuX3N0YXRlX3Byb2Nlc3Moc3RydWN0IHNvY2sgKnNrLApAQCAtNDMxLDI5ICs0MzgsMjUgQEAKIAogCS8qCiAJICogIFN0ZXAgMzogUHJvY2VzcyBMSVNURU4gc3RhdGUKLQkgKiAgCShDb250aW51aW5nIGZyb20gZGNjcF92NF9kb19yY3YgYW5kIGRjY3BfdjZfZG9fcmN2KQogCSAqCiAJICogICAgIElmIFMuc3RhdGUgPT0gTElTVEVOLAotCSAqCSAgSWYgUC50eXBlID09IFJlcXVlc3Qgb3IgUCBjb250YWlucyBhIHZhbGlkIEluaXQgQ29va2llCi0JICoJICAJb3B0aW9uLAotCSAqCSAgICAgKiBNdXN0IHNjYW4gdGhlIHBhY2tldCdzIG9wdGlvbnMgdG8gY2hlY2sgZm9yIGFuIEluaXQKLQkgKgkJQ29va2llLiAgT25seSB0aGUgSW5pdCBDb29raWUgaXMgcHJvY2Vzc2VkIGhlcmUsCi0JICoJCWhvd2V2ZXI7IG90aGVyIG9wdGlvbnMgYXJlIHByb2Nlc3NlZCBpbiBTdGVwIDguICBUaGlzCi0JICoJCXNjYW4gbmVlZCBvbmx5IGJlIHBlcmZvcm1lZCBpZiB0aGUgZW5kcG9pbnQgdXNlcyBJbml0Ci0JICoJCUNvb2tpZXMgKgotCSAqCSAgICAgKiBHZW5lcmF0ZSBhIG5ldyBzb2NrZXQgYW5kIHN3aXRjaCB0byB0aGF0IHNvY2tldCAqCi0JICoJICAgICBTZXQgUyA6PSBuZXcgc29ja2V0IGZvciB0aGlzIHBvcnQgcGFpcgotCSAqCSAgICAgUy5zdGF0ZSA9IFJFU1BPTkQKLQkgKgkgICAgIENob29zZSBTLklTUyAoaW5pdGlhbCBzZXFubykgb3Igc2V0IGZyb20gSW5pdCBDb29raWUKLQkgKgkgICAgIFNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0IENvb2tpZQotCSAqCSAgICAgQ29udGludWUgd2l0aCBTLnN0YXRlID09IFJFU1BPTkQKLQkgKgkgICAgICogQSBSZXNwb25zZSBwYWNrZXQgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gU3RlcCAxMSAqCi0JICoJICBPdGhlcndpc2UsCi0JICoJICAgICBHZW5lcmF0ZSBSZXNldChObyBDb25uZWN0aW9uKSB1bmxlc3MgUC50eXBlID09IFJlc2V0Ci0JICoJICAgICBEcm9wIHBhY2tldCBhbmQgcmV0dXJuCi0JICoKLQkgKiBOT1RFOiB0aGUgY2hlY2sgZm9yIHRoZSBwYWNrZXQgdHlwZXMgaXMgZG9uZSBpbgotCSAqCSBkY2NwX3Jjdl9zdGF0ZV9wcm9jZXNzCisJICoJIElmIFAudHlwZSA9PSBSZXF1ZXN0IG9yIFAgY29udGFpbnMgYSB2YWxpZCBJbml0IENvb2tpZSBvcHRpb24sCisJICoJICAgICAgKCogTXVzdCBzY2FuIHRoZSBwYWNrZXQncyBvcHRpb25zIHRvIGNoZWNrIGZvciBJbml0CisJICoJCSBDb29raWVzLiAgT25seSBJbml0IENvb2tpZXMgYXJlIHByb2Nlc3NlZCBoZXJlLAorCSAqCQkgaG93ZXZlcjsgb3RoZXIgb3B0aW9ucyBhcmUgcHJvY2Vzc2VkIGluIFN0ZXAgOC4gIFRoaXMKKwkgKgkJIHNjYW4gbmVlZCBvbmx5IGJlIHBlcmZvcm1lZCBpZiB0aGUgZW5kcG9pbnQgdXNlcyBJbml0CisJICoJCSBDb29raWVzICopCisJICoJICAgICAgKCogR2VuZXJhdGUgYSBuZXcgc29ja2V0IGFuZCBzd2l0Y2ggdG8gdGhhdCBzb2NrZXQgKikKKwkgKgkgICAgICBTZXQgUyA6PSBuZXcgc29ja2V0IGZvciB0aGlzIHBvcnQgcGFpcgorCSAqCSAgICAgIFMuc3RhdGUgPSBSRVNQT05ECisJICoJICAgICAgQ2hvb3NlIFMuSVNTIChpbml0aWFsIHNlcW5vKSBvciBzZXQgZnJvbSBJbml0IENvb2tpZXMKKwkgKgkgICAgICBJbml0aWFsaXplIFMuR0FSIDo9IFMuSVNTCisJICoJICAgICAgU2V0IFMuSVNSLCBTLkdTUiwgUy5TV0wsIFMuU1dIIGZyb20gcGFja2V0IG9yIEluaXQKKwkgKgkgICAgICBDb29raWVzIENvbnRpbnVlIHdpdGggUy5zdGF0ZSA9PSBSRVNQT05ECisJICoJICAgICAgKCogQSBSZXNwb25zZSBwYWNrZXQgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gU3RlcCAxMSAqKQorCSAqCSBPdGhlcndpc2UsCisJICoJICAgICAgR2VuZXJhdGUgUmVzZXQoTm8gQ29ubmVjdGlvbikgdW5sZXNzIFAudHlwZSA9PSBSZXNldAorCSAqCSAgICAgIERyb3AgcGFja2V0IGFuZCByZXR1cm4KIAkgKi8KIAlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfTElTVEVOKSB7CiAJCWlmIChkaC0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9SRVFVRVNUKSB7CkBAIC00ODUsMTQgKzQ4OCwxNyBAQAogCQlpZiAoZGNiLT5kY2NwZF9hY2tfc2VxICE9IERDQ1BfUEtUX1dJVEhPVVRfQUNLX1NFUSkKIAkJCWRjY3BfZXZlbnRfYWNrX3JlY3Yoc2ssIHNrYik7CiAKLSAJCWlmIChkY2NwX21zayhzayktPmRjY3Btc19zZW5kX2Fja192ZWN0b3IgJiYKKwkJaWYgKGRjY3BfbXNrKHNrKS0+ZGNjcG1zX3NlbmRfYWNrX3ZlY3RvciAmJgogCQkgICAgZGNjcF9hY2t2ZWNfYWRkKGRwLT5kY2Nwc19oY19yeF9hY2t2ZWMsIHNrLAotIAkJCQkgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLAotIAkJCQkgICAgRENDUF9BQ0tWRUNfU1RBVEVfUkVDRUlWRUQpKQotIAkJCWdvdG8gZGlzY2FyZDsKKwkJCQkgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLAorCQkJCSAgICBEQ0NQX0FDS1ZFQ19TVEFURV9SRUNFSVZFRCkpCisJCQlnb3RvIGRpc2NhcmQ7CiAKLQkJY2NpZF9oY19yeF9wYWNrZXRfcmVjdihkcC0+ZGNjcHNfaGNfcnhfY2NpZCwgc2ssIHNrYik7Ci0JCWNjaWRfaGNfdHhfcGFja2V0X3JlY3YoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCBza2IpOworCQkvKiBYWFggc2VlIHRoZSBjb21tZW50cyBpbiBkY2NwX3Jjdl9lc3RhYmxpc2hlZCBhYm91dCB0aGlzICovCisJCWlmIChkY2NwX3NrKHNrKS0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfU0VSVkVSKQorCQkJY2NpZF9oY19yeF9wYWNrZXRfcmVjdihkcC0+ZGNjcHNfaGNfcnhfY2NpZCwgc2ssIHNrYik7CisJCWVsc2UKKwkJCWNjaWRfaGNfdHhfcGFja2V0X3JlY3YoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCBza2IpOwogCX0KIAogCS8qCkBAIC01NzQsNyArNTgwLDcgQEAKIAkJfQogCX0KIAotCWlmICghcXVldWVkKSB7IAorCWlmICghcXVldWVkKSB7CiBkaXNjYXJkOgogCQlfX2tmcmVlX3NrYihza2IpOwogCX0KZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjQuYyBiL25ldC9kY2NwL2lwdjQuYwppbmRleCA3ZTc0NmM0Li45MGM3NGI0IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY0LmMKKysrIGIvbmV0L2RjY3AvaXB2NC5jCkBAIC0xMTMsMTMgKzExMyw4IEBACiAJLyogT0ssIG5vdyBjb21taXQgZGVzdGluYXRpb24gdG8gc29ja2V0LiAgKi8KIAlza19zZXR1cF9jYXBzKHNrLCAmcnQtPnUuZHN0KTsKIAotCWRwLT5kY2Nwc19nYXIgPQotCQlkcC0+ZGNjcHNfaXNzID0gc2VjdXJlX2RjY3Bfc2VxdWVuY2VfbnVtYmVyKGluZXQtPnNhZGRyLAotCQkJCQkJCSAgICBpbmV0LT5kYWRkciwKLQkJCQkJCQkgICAgaW5ldC0+c3BvcnQsCi0JCQkJCQkJICAgIHVzaW4tPnNpbl9wb3J0KTsKLQlkY2NwX3VwZGF0ZV9nc3Moc2ssIGRwLT5kY2Nwc19pc3MpOwotCisJZHAtPmRjY3BzX2lzcyA9IHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihpbmV0LT5zYWRkciwgaW5ldC0+ZGFkZHIsCisJCQkJCQkgICAgaW5ldC0+c3BvcnQsIGluZXQtPmRwb3J0KTsKIAlpbmV0LT5pZCA9IGRwLT5kY2Nwc19pc3MgXiBqaWZmaWVzOwogCiAJZXJyID0gZGNjcF9jb25uZWN0KHNrKTsKQEAgLTE2Miw3ICsxNTcsNyBAQAogCS8qIFdlIGRvbid0IGNoZWNrIGluIHRoZSBkZXN0ZW50cnkgaWYgcG10dSBkaXNjb3ZlcnkgaXMgZm9yYmlkZGVuCiAJICogb24gdGhpcyByb3V0ZS4gV2UganVzdCBhc3N1bWUgdGhhdCBubyBwYWNrZXRfdG9fYmlnIHBhY2tldHMKIAkgKiBhcmUgc2VuZCBiYWNrIHdoZW4gcG10dSBkaXNjb3ZlcnkgaXMgbm90IGFjdGl2ZS4KLSAgICAgCSAqIFRoZXJlIGlzIGEgc21hbGwgcmFjZSB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhpcyBmbGFnIGluIHRoZQorIAkgKiBUaGVyZSBpcyBhIHNtYWxsIHJhY2Ugd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoaXMgZmxhZyBpbiB0aGUKIAkgKiByb3V0ZSwgYnV0IEkgdGhpbmsgdGhhdCdzIGFjY2VwdGFibGUuCiAJICovCiAJaWYgKChkc3QgPSBfX3NrX2RzdF9jaGVjayhzaywgMCkpID09IE5VTEwpCkBAIC0xODMsNyArMTc4LDcgQEAKIAkJZGNjcF9zeW5jX21zcyhzaywgbXR1KTsKIAogCQkvKgotCQkgKiBGcm9tOiBkcmFmdC1pZXRmLWRjY3Atc3BlYy0xMS50eHQKKwkJICogRnJvbSBSRkMgNDM0MCwgc2VjLiAxNC4xOgogCQkgKgogCQkgKglEQ0NQLVN5bmMgcGFja2V0cyBhcmUgdGhlIGJlc3QgY2hvaWNlIGZvciB1cHdhcmQKIAkJICoJcHJvYmluZywgc2luY2UgRENDUC1TeW5jIHByb2JlcyBkbyBub3QgcmlzayBhcHBsaWNhdGlvbgpAQCAtMTkzLDg2ICsxODgsNiBAQAogCX0gLyogZWxzZSBsZXQgdGhlIHVzdWFsIHJldHJhbnNtaXQgdGltZXIgaGFuZGxlIGl0ICovCiB9CiAKLXN0YXRpYyB2b2lkIGRjY3BfdjRfcmVxc2tfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnJ4c2tiLAotCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBkY2NwX2hkciAqcnhkaCA9IGRjY3BfaGRyKHJ4c2tiKSwgKmRoOwotCWNvbnN0IHUzMiBkY2NwX2hkcl9hY2tfbGVuID0gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikgKwotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9leHQpICsKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMpOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlpZiAoKChzdHJ1Y3QgcnRhYmxlICopcnhza2ItPmRzdCktPnJ0X3R5cGUgIT0gUlROX0xPQ0FMKQotCQlyZXR1cm47Ci0KLQlza2IgPSBhbGxvY19za2IoZGNjcF92NF9jdGxfc29ja2V0LT5zay0+c2tfcHJvdC0+bWF4X2hlYWRlciwgR0ZQX0FUT01JQyk7Ci0JaWYgKHNrYiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzLiAqLwotCXNrYl9yZXNlcnZlKHNrYiwgZGNjcF92NF9jdGxfc29ja2V0LT5zay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7Ci0KLQlza2ItPmRzdCA9IGRzdF9jbG9uZShyeHNrYi0+ZHN0KTsKLQotCXNrYi0+aC5yYXcgPSBza2JfcHVzaChza2IsIGRjY3BfaGRyX2Fja19sZW4pOwotCWRoID0gZGNjcF9oZHIoc2tiKTsKLQltZW1zZXQoZGgsIDAsIGRjY3BfaGRyX2Fja19sZW4pOwotCi0JLyogQnVpbGQgRENDUCBoZWFkZXIgYW5kIGNoZWNrc3VtIGl0LiAqLwotCWRoLT5kY2NwaF90eXBlCSAgID0gRENDUF9QS1RfQUNLOwotCWRoLT5kY2NwaF9zcG9ydAkgICA9IHJ4ZGgtPmRjY3BoX2Rwb3J0OwotCWRoLT5kY2NwaF9kcG9ydAkgICA9IHJ4ZGgtPmRjY3BoX3Nwb3J0OwotCWRoLT5kY2NwaF9kb2ZmCSAgID0gZGNjcF9oZHJfYWNrX2xlbiAvIDQ7Ci0JZGgtPmRjY3BoX3gJICAgPSAxOwotCi0JZGNjcF9oZHJfc2V0X3NlcShkaCwgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9hY2tfc2VxKTsKLQlkY2NwX2hkcl9zZXRfYWNrKGRjY3BfaGRyX2Fja19iaXRzKHNrYiksCi0JCQkgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9zZXEpOwotCi0JYmhfbG9ja19zb2NrKGRjY3BfdjRfY3RsX3NvY2tldC0+c2spOwotCWVyciA9IGlwX2J1aWxkX2FuZF9zZW5kX3BrdChza2IsIGRjY3BfdjRfY3RsX3NvY2tldC0+c2ssCi0JCQkJICAgIHJ4c2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCSAgICByeHNrYi0+bmguaXBoLT5zYWRkciwgTlVMTCk7Ci0JYmhfdW5sb2NrX3NvY2soZGNjcF92NF9jdGxfc29ja2V0LT5zayk7Ci0KLQlpZiAoZXJyID09IE5FVF9YTUlUX0NOIHx8IGVyciA9PSAwKSB7Ci0JCURDQ1BfSU5DX1NUQVRTX0JIKERDQ1BfTUlCX09VVFNFR1MpOwotCQlEQ0NQX0lOQ19TVEFUU19CSChEQ0NQX01JQl9PVVRSU1RTKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZGNjcF92NF9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJCSBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCi17Ci0JaW50IGVyciA9IC0xOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkvKiBGaXJzdCwgZ3JhYiBhIHJvdXRlLiAqLwotCQotCWlmIChkc3QgPT0gTlVMTCAmJiAoZHN0ID0gaW5ldF9jc2tfcm91dGVfcmVxKHNrLCByZXEpKSA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCXNrYiA9IGRjY3BfbWFrZV9yZXNwb25zZShzaywgZHN0LCByZXEpOwotCWlmIChza2IgIT0gTlVMTCkgewotCQljb25zdCBzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOwotCQlzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKLQotCQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NoZWNrc3VtKHNrYiwgaXJlcS0+bG9jX2FkZHIsCi0JCQkJCQkgICAgICBpcmVxLT5ybXRfYWRkcik7Ci0JCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKElQQ0Ioc2tiKS0+b3B0KSk7Ci0JCWVyciA9IGlwX2J1aWxkX2FuZF9zZW5kX3BrdChza2IsIHNrLCBpcmVxLT5sb2NfYWRkciwKLQkJCQkJICAgIGlyZXEtPnJtdF9hZGRyLAotCQkJCQkgICAgaXJlcS0+b3B0KTsKLQkJaWYgKGVyciA9PSBORVRfWE1JVF9DTikKLQkJCWVyciA9IDA7Ci0JfQotCi1vdXQ6Ci0JZHN0X3JlbGVhc2UoZHN0KTsKLQlyZXR1cm4gZXJyOwotfQotCiAvKgogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgSUNNUCBtb2R1bGUgd2hlbiBpdCBnZXRzIHNvbWUgc29ydCBvZiBlcnJvcgogICogY29uZGl0aW9uLiBJZiBlcnIgPCAwIHRoZW4gdGhlIHNvY2tldCBzaG91bGQgYmUgY2xvc2VkIGFuZCB0aGUgZXJyb3IKQEAgLTMyOSw3ICsyNDQsNyBAQAogCXNlcSA9IGRjY3BfaGRyX3NlcShza2IpOwogCWlmIChzay0+c2tfc3RhdGUgIT0gRENDUF9MSVNURU4gJiYKIAkgICAgIWJldHdlZW40OChzZXEsIGRwLT5kY2Nwc19zd2wsIGRwLT5kY2Nwc19zd2gpKSB7Ci0JCU5FVF9JTkNfU1RBVFMoTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMpOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC00MjksMTkgKzM0NCwyNCBAQAogCXNvY2tfcHV0KHNrKTsKIH0KIAotLyogVGhpcyByb3V0aW5lIGNvbXB1dGVzIGFuIElQdjQgRENDUCBjaGVja3N1bS4gKi8KLXZvaWQgZGNjcF92NF9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBkY2NwX3Y0X2NzdW1fZmluaXNoKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgX19iZTMyIHNyYywgX19iZTMyIGRzdCkKK3sKKwlyZXR1cm4gY3N1bV90Y3B1ZHBfbWFnaWMoc3JjLCBkc3QsIHNrYi0+bGVuLCBJUFBST1RPX0RDQ1AsIHNrYi0+Y3N1bSk7Cit9CisKK3ZvaWQgZGNjcF92NF9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgaW50IHVudXNlZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7CiAKLQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NoZWNrc3VtKHNrYiwgaW5ldC0+c2FkZHIsIGluZXQtPmRhZGRyKTsKKwlkY2NwX2NzdW1fb3V0Z29pbmcoc2tiKTsKKwlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NzdW1fZmluaXNoKHNrYiwgaW5ldC0+c2FkZHIsIGluZXQtPmRhZGRyKTsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF92NF9zZW5kX2NoZWNrKTsKIAotc3RhdGljIGlubGluZSB1NjQgZGNjcF92NF9pbml0X3NlcXVlbmNlKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgdTY0IGRjY3BfdjRfaW5pdF9zZXF1ZW5jZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiBzZWN1cmVfZGNjcF9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcGgtPmRhZGRyLAogCQkJCQkgICBza2ItPm5oLmlwaC0+c2FkZHIsCkBAIC00NDksOTMgKzM2OSw2IEBACiAJCQkJCSAgIGRjY3BfaGRyKHNrYiktPmRjY3BoX3Nwb3J0KTsKIH0KIAotaW50IGRjY3BfdjRfY29ubl9yZXF1ZXN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXE7Ci0Jc3RydWN0IGRjY3Bfc29jayBkcDsKLQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXE7Ci0Jc3RydWN0IGRjY3BfcmVxdWVzdF9zb2NrICpkcmVxOwotCWNvbnN0IF9fYmUzMiBzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKLQljb25zdCBfX2JlMzIgZGFkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7Ci0gCWNvbnN0IF9fYmUzMiBzZXJ2aWNlID0gZGNjcF9oZHJfcmVxdWVzdChza2IpLT5kY2NwaF9yZXFfc2VydmljZTsKLQlzdHJ1Y3QgZGNjcF9za2JfY2IgKmRjYiA9IERDQ1BfU0tCX0NCKHNrYik7Ci0JX191OCByZXNldF9jb2RlID0gRENDUF9SRVNFVF9DT0RFX1RPT19CVVNZOwotCi0JLyogTmV2ZXIgYW5zd2VyIHRvIERDQ1BfUEtUX1JFUVVFU1RzIHNlbmQgdG8gYnJvYWRjYXN0IG9yIG11bHRpY2FzdCAqLwotCWlmICgoKHN0cnVjdCBydGFibGUgKilza2ItPmRzdCktPnJ0X2ZsYWdzICYKLQkgICAgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKSB7Ci0JCXJlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfTk9fQ09OTkVDVElPTjsKLQkJZ290byBkcm9wOwotCX0KLQotCWlmIChkY2NwX2JhZF9zZXJ2aWNlX2NvZGUoc2ssIHNlcnZpY2UpKSB7Ci0JCXJlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfQkFEX1NFUlZJQ0VfQ09ERTsKLQkJZ290byBkcm9wOwotIAl9Ci0JLyoKLQkgKiBUVyBidWNrZXRzIGFyZSBjb252ZXJ0ZWQgdG8gb3BlbiByZXF1ZXN0cyB3aXRob3V0Ci0JICogbGltaXRhdGlvbnMsIHRoZXkgY29uc2VydmUgcmVzb3VyY2VzIGFuZCBwZWVyIGlzCi0JICogZXZpZGVudGx5IHJlYWwgb25lLgotCSAqLwotCWlmIChpbmV0X2Nza19yZXFza19xdWV1ZV9pc19mdWxsKHNrKSkKLQkJZ290byBkcm9wOwotCi0JLyoKLQkgKiBBY2NlcHQgYmFja2xvZyBpcyBmdWxsLiBJZiB3ZSBoYXZlIGFscmVhZHkgcXVldWVkIGVub3VnaAotCSAqIG9mIHdhcm0gZW50cmllcyBpbiBzeW4gcXVldWUsIGRyb3AgcmVxdWVzdC4gSXQgaXMgYmV0dGVyIHRoYW4KLQkgKiBjbG9nZ2luZyBzeW4gcXVldWUgd2l0aCBvcGVucmVxcyB3aXRoIGV4cG9uZW50aWFsbHkgaW5jcmVhc2luZwotCSAqIHRpbWVvdXQuCi0JICovCi0JaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChzaykgJiYgaW5ldF9jc2tfcmVxc2tfcXVldWVfeW91bmcoc2spID4gMSkKLQkJZ290byBkcm9wOwotCi0JcmVxID0gcmVxc2tfYWxsb2Moc2stPnNrX3Byb3QtPnJza19wcm90KTsKLQlpZiAocmVxID09IE5VTEwpCi0JCWdvdG8gZHJvcDsKLQotCWlmIChkY2NwX3BhcnNlX29wdGlvbnMoc2ssIHNrYikpCi0JCWdvdG8gZHJvcF9hbmRfZnJlZTsKLQotCWRjY3Bfb3BlbnJlcV9pbml0KHJlcSwgJmRwLCBza2IpOwotCi0JaWYgKHNlY3VyaXR5X2luZXRfY29ubl9yZXF1ZXN0KHNrLCBza2IsIHJlcSkpCi0JCWdvdG8gZHJvcF9hbmRfZnJlZTsKLQotCWlyZXEgPSBpbmV0X3JzayhyZXEpOwotCWlyZXEtPmxvY19hZGRyID0gZGFkZHI7Ci0JaXJlcS0+cm10X2FkZHIgPSBzYWRkcjsKLQlyZXEtPnJjdl93bmQJPSBkY2NwX2ZlYXRfZGVmYXVsdF9zZXF1ZW5jZV93aW5kb3c7Ci0JaXJlcS0+b3B0CT0gTlVMTDsKLQotCS8qIAotCSAqIFN0ZXAgMzogUHJvY2VzcyBMSVNURU4gc3RhdGUKLQkgKgotCSAqIFNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0IENvb2tpZQotCSAqCi0JICogSW4gZmFjdCB3ZSBkZWZlciBzZXR0aW5nIFMuR1NSLCBTLlNXTCwgUy5TV0ggdG8KLQkgKiBkY2NwX2NyZWF0ZV9vcGVucmVxX2NoaWxkLgotCSAqLwotCWRyZXEgPSBkY2NwX3JzayhyZXEpOwotCWRyZXEtPmRyZXFfaXNyCSAgID0gZGNiLT5kY2NwZF9zZXE7Ci0JZHJlcS0+ZHJlcV9pc3MJICAgPSBkY2NwX3Y0X2luaXRfc2VxdWVuY2Uoc2ssIHNrYik7Ci0JZHJlcS0+ZHJlcV9zZXJ2aWNlID0gc2VydmljZTsKLQotCWlmIChkY2NwX3Y0X3NlbmRfcmVzcG9uc2Uoc2ssIHJlcSwgTlVMTCkpCi0JCWdvdG8gZHJvcF9hbmRfZnJlZTsKLQotCWluZXRfY3NrX3JlcXNrX3F1ZXVlX2hhc2hfYWRkKHNrLCByZXEsIERDQ1BfVElNRU9VVF9JTklUKTsKLQlyZXR1cm4gMDsKLQotZHJvcF9hbmRfZnJlZToKLQlyZXFza19mcmVlKHJlcSk7Ci1kcm9wOgotCURDQ1BfSU5DX1NUQVRTX0JIKERDQ1BfTUlCX0FUVEVNUFRGQUlMUyk7Ci0JZGNiLT5kY2NwZF9yZXNldF9jb2RlID0gcmVzZXRfY29kZTsKLQlyZXR1cm4gLTE7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfdjRfY29ubl9yZXF1ZXN0KTsKLQogLyoKICAqIFRoZSB0aHJlZSB3YXkgaGFuZHNoYWtlIGhhcyBjb21wbGV0ZWQgLSB3ZSBnb3QgYSB2YWxpZCBBQ0sgb3IgREFUQUFDSyAtCiAgKiBub3cgY3JlYXRlIHRoZSBuZXcgc29ja2V0LgpAQCAtNjIxLDQ3ICs0NTQsNiBAQAogCXJldHVybiBzazsKIH0KIAotaW50IGRjY3BfdjRfY2hlY2tzdW0oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgX19iZTMyIHNhZGRyLAotCQkgICAgIGNvbnN0IF9fYmUzMiBkYWRkcikKLXsKLQljb25zdCBzdHJ1Y3QgZGNjcF9oZHIqIGRoID0gZGNjcF9oZHIoc2tiKTsKLQlpbnQgY2hlY2tzdW1fbGVuOwotCXUzMiB0bXA7Ci0KLQlpZiAoZGgtPmRjY3BoX2NzY292ID09IDApCi0JCWNoZWNrc3VtX2xlbiA9IHNrYi0+bGVuOwotCWVsc2UgewotCQljaGVja3N1bV9sZW4gPSAoZGgtPmRjY3BoX2NzY292ICsgZGgtPmRjY3BoX3gpICogc2l6ZW9mKHUzMik7Ci0JCWNoZWNrc3VtX2xlbiA9IGNoZWNrc3VtX2xlbiA8IHNrYi0+bGVuID8gY2hlY2tzdW1fbGVuIDoKLQkJCQkJCQkgc2tiLT5sZW47Ci0JfQotCi0JdG1wID0gY3N1bV9wYXJ0aWFsKCh1bnNpZ25lZCBjaGFyICopZGgsIGNoZWNrc3VtX2xlbiwgMCk7Ci0JcmV0dXJuIGNzdW1fdGNwdWRwX21hZ2ljKHNhZGRyLCBkYWRkciwgY2hlY2tzdW1fbGVuLAotCQkJCSBJUFBST1RPX0RDQ1AsIHRtcCk7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfdjRfY2hlY2tzdW0pOwotCi1zdGF0aWMgaW50IGRjY3BfdjRfdmVyaWZ5X2NoZWNrc3VtKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgY29uc3QgX19iZTMyIHNhZGRyLCBjb25zdCBfX2JlMzIgZGFkZHIpCi17Ci0Jc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7Ci0JaW50IGNoZWNrc3VtX2xlbjsKLQl1MzIgdG1wOwotCi0JaWYgKGRoLT5kY2NwaF9jc2NvdiA9PSAwKQotCQljaGVja3N1bV9sZW4gPSBza2ItPmxlbjsKLQllbHNlIHsKLQkJY2hlY2tzdW1fbGVuID0gKGRoLT5kY2NwaF9jc2NvdiArIGRoLT5kY2NwaF94KSAqIHNpemVvZih1MzIpOwotCQljaGVja3N1bV9sZW4gPSBjaGVja3N1bV9sZW4gPCBza2ItPmxlbiA/IGNoZWNrc3VtX2xlbiA6Ci0JCQkJCQkJIHNrYi0+bGVuOwotCX0KLQl0bXAgPSBjc3VtX3BhcnRpYWwoKHVuc2lnbmVkIGNoYXIgKilkaCwgY2hlY2tzdW1fbGVuLCAwKTsKLQlyZXR1cm4gY3N1bV90Y3B1ZHBfbWFnaWMoc2FkZHIsIGRhZGRyLCBjaGVja3N1bV9sZW4sCi0JCQkJIElQUFJPVE9fRENDUCwgdG1wKSA9PSAwID8gMCA6IC0xOwotfQotCiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSogZGNjcF92NF9yb3V0ZV9za2Ioc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNjc1LDcgKzQ2Nyw3IEBACiAJCQkgICAgLnVsaV91ID0geyAucG9ydHMgPQogCQkJCSAgICAgICB7IC5zcG9ydCA9IGRjY3BfaGRyKHNrYiktPmRjY3BoX2Rwb3J0LAogCQkJCQkgLmRwb3J0ID0gZGNjcF9oZHIoc2tiKS0+ZGNjcGhfc3BvcnQgfQotCQkJICAgCSAgICAgfQorCQkJCSAgICAgfQogCQkJICB9OwogCiAJc2VjdXJpdHlfc2tiX2NsYXNzaWZ5X2Zsb3coc2tiLCAmZmwpOwpAQCAtNjg3LDcgKzQ3OSwzNyBAQAogCXJldHVybiAmcnQtPnUuZHN0OwogfQogCi1zdGF0aWMgdm9pZCBkY2NwX3Y0X2N0bF9zZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpyeHNrYikKK3N0YXRpYyBpbnQgZGNjcF92NF9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJCSBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCit7CisJaW50IGVyciA9IC0xOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBGaXJzdCwgZ3JhYiBhIHJvdXRlLiAqLworCQorCWlmIChkc3QgPT0gTlVMTCAmJiAoZHN0ID0gaW5ldF9jc2tfcm91dGVfcmVxKHNrLCByZXEpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXNrYiA9IGRjY3BfbWFrZV9yZXNwb25zZShzaywgZHN0LCByZXEpOworCWlmIChza2IgIT0gTlVMTCkgeworCQljb25zdCBzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOworCQlzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKKworCQlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NzdW1fZmluaXNoKHNrYiwgaXJlcS0+bG9jX2FkZHIsCisJCQkJCQkJICAgICAgaXJlcS0+cm10X2FkZHIpOworCQltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOworCQllcnIgPSBpcF9idWlsZF9hbmRfc2VuZF9wa3Qoc2tiLCBzaywgaXJlcS0+bG9jX2FkZHIsCisJCQkJCSAgICBpcmVxLT5ybXRfYWRkciwKKwkJCQkJICAgIGlyZXEtPm9wdCk7CisJCWVyciA9IG5ldF94bWl0X2V2YWwoZXJyKTsKKwl9CisKK291dDoKKwlkc3RfcmVsZWFzZShkc3QpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGRjY3BfdjRfY3RsX3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqcnhza2IpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZGNjcF9oZHIgKnJ4ZGggPSBkY2NwX2hkcihyeHNrYiksICpkaDsKQEAgLTY5Niw3ICs1MTgsNyBAQAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX3Jlc2V0KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKLQl1NjQgc2Vxbm87CisJdTY0IHNlcW5vID0gMDsKIAogCS8qIE5ldmVyIHNlbmQgYSByZXNldCBpbiByZXNwb25zZSB0byBhIHJlc2V0LiAqLwogCWlmIChyeGRoLT5kY2NwaF90eXBlID09IERDQ1BfUEtUX1JFU0VUKQpAQCAtNzE4LDkgKzU0MCw3IEBACiAJc2tiX3Jlc2VydmUoc2tiLCBkY2NwX3Y0X2N0bF9zb2NrZXQtPnNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKIAlza2ItPmRzdCA9IGRzdF9jbG9uZShkc3QpOwogCi0Jc2tiLT5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgZGNjcF9oZHJfcmVzZXRfbGVuKTsKLQlkaCA9IGRjY3BfaGRyKHNrYik7Ci0JbWVtc2V0KGRoLCAwLCBkY2NwX2hkcl9yZXNldF9sZW4pOworCWRoID0gZGNjcF96ZXJvZWRfaGRyKHNrYiwgZGNjcF9oZHJfcmVzZXRfbGVuKTsKIAogCS8qIEJ1aWxkIERDQ1AgaGVhZGVyIGFuZCBjaGVja3N1bSBpdC4gKi8KIAlkaC0+ZGNjcGhfdHlwZQkgICA9IERDQ1BfUEtUX1JFU0VUOwpAQCAtNzMxLDE3ICs1NTEsMTYgQEAKIAlkY2NwX2hkcl9yZXNldChza2IpLT5kY2NwaF9yZXNldF9jb2RlID0KIAkJCQlEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX3Jlc2V0X2NvZGU7CiAKLQkvKiBTZWUgIjguMy4xLiBBYm5vcm1hbCBUZXJtaW5hdGlvbiIgaW4gZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTEgKi8KLQlzZXFubyA9IDA7CisJLyogU2VlICI4LjMuMS4gQWJub3JtYWwgVGVybWluYXRpb24iIGluIFJGQyA0MzQwICovCiAJaWYgKERDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfYWNrX3NlcSAhPSBEQ0NQX1BLVF9XSVRIT1VUX0FDS19TRVEpCiAJCWRjY3Bfc2V0X3NlcW5vKCZzZXFubywgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9hY2tfc2VxICsgMSk7CiAKIAlkY2NwX2hkcl9zZXRfc2VxKGRoLCBzZXFubyk7Ci0JZGNjcF9oZHJfc2V0X2FjayhkY2NwX2hkcl9hY2tfYml0cyhza2IpLAotCQkJIERDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfc2VxKTsKKwlkY2NwX2hkcl9zZXRfYWNrKGRjY3BfaGRyX2Fja19iaXRzKHNrYiksIERDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfc2VxKTsKIAotCWRoLT5kY2NwaF9jaGVja3N1bSA9IGRjY3BfdjRfY2hlY2tzdW0oc2tiLCByeHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJICAgICAgcnhza2ItPm5oLmlwaC0+ZGFkZHIpOworCWRjY3BfY3N1bV9vdXRnb2luZyhza2IpOworCWRoLT5kY2NwaF9jaGVja3N1bSA9IGRjY3BfdjRfY3N1bV9maW5pc2goc2tiLCByeHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkJCSAgICAgIHJ4c2tiLT5uaC5pcGgtPmRhZGRyKTsKIAogCWJoX2xvY2tfc29jayhkY2NwX3Y0X2N0bF9zb2NrZXQtPnNrKTsKIAllcnIgPSBpcF9idWlsZF9hbmRfc2VuZF9wa3Qoc2tiLCBkY2NwX3Y0X2N0bF9zb2NrZXQtPnNrLApAQCAtNzQ5LDcgKzU2OCw3IEBACiAJCQkJICAgIHJ4c2tiLT5uaC5pcGgtPnNhZGRyLCBOVUxMKTsKIAliaF91bmxvY2tfc29jayhkY2NwX3Y0X2N0bF9zb2NrZXQtPnNrKTsKIAotCWlmIChlcnIgPT0gTkVUX1hNSVRfQ04gfHwgZXJyID09IDApIHsKKwlpZiAobmV0X3htaXRfZXZhbChlcnIpID09IDApIHsKIAkJRENDUF9JTkNfU1RBVFNfQkgoRENDUF9NSUJfT1VUU0VHUyk7CiAJCURDQ1BfSU5DX1NUQVRTX0JIKERDQ1BfTUlCX09VVFJTVFMpOwogCX0KQEAgLTc1Nyw2ICs1NzYsMTAzIEBACiAJIGRzdF9yZWxlYXNlKGRzdCk7CiB9CiAKK3N0YXRpYyB2b2lkIGRjY3BfdjRfcmVxc2tfZGVzdHJ1Y3RvcihzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCit7CisJa2ZyZWUoaW5ldF9yc2socmVxKS0+b3B0KTsKK30KKworc3RhdGljIHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzIGRjY3BfcmVxdWVzdF9zb2NrX29wcyBfX3JlYWRfbW9zdGx5ID0geworCS5mYW1pbHkJCT0gUEZfSU5FVCwKKwkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGRjY3BfcmVxdWVzdF9zb2NrKSwKKwkucnR4X3N5bl9hY2sJPSBkY2NwX3Y0X3NlbmRfcmVzcG9uc2UsCisJLnNlbmRfYWNrCT0gZGNjcF9yZXFza19zZW5kX2FjaywKKwkuZGVzdHJ1Y3Rvcgk9IGRjY3BfdjRfcmVxc2tfZGVzdHJ1Y3RvciwKKwkuc2VuZF9yZXNldAk9IGRjY3BfdjRfY3RsX3NlbmRfcmVzZXQsCit9OworCitpbnQgZGNjcF92NF9jb25uX3JlcXVlc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcTsKKwlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXE7CisJc3RydWN0IGRjY3BfcmVxdWVzdF9zb2NrICpkcmVxOworCWNvbnN0IF9fYmUzMiBzZXJ2aWNlID0gZGNjcF9oZHJfcmVxdWVzdChza2IpLT5kY2NwaF9yZXFfc2VydmljZTsKKwlzdHJ1Y3QgZGNjcF9za2JfY2IgKmRjYiA9IERDQ1BfU0tCX0NCKHNrYik7CisJX191OCByZXNldF9jb2RlID0gRENDUF9SRVNFVF9DT0RFX1RPT19CVVNZOworCisJLyogTmV2ZXIgYW5zd2VyIHRvIERDQ1BfUEtUX1JFUVVFU1RzIHNlbmQgdG8gYnJvYWRjYXN0IG9yIG11bHRpY2FzdCAqLworCWlmICgoKHN0cnVjdCBydGFibGUgKilza2ItPmRzdCktPnJ0X2ZsYWdzICYKKwkgICAgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKSB7CisJCXJlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfTk9fQ09OTkVDVElPTjsKKwkJZ290byBkcm9wOworCX0KKworCWlmIChkY2NwX2JhZF9zZXJ2aWNlX2NvZGUoc2ssIHNlcnZpY2UpKSB7CisJCXJlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfQkFEX1NFUlZJQ0VfQ09ERTsKKwkJZ290byBkcm9wOworCX0KKwkvKgorCSAqIFRXIGJ1Y2tldHMgYXJlIGNvbnZlcnRlZCB0byBvcGVuIHJlcXVlc3RzIHdpdGhvdXQKKwkgKiBsaW1pdGF0aW9ucywgdGhleSBjb25zZXJ2ZSByZXNvdXJjZXMgYW5kIHBlZXIgaXMKKwkgKiBldmlkZW50bHkgcmVhbCBvbmUuCisJICovCisJaWYgKGluZXRfY3NrX3JlcXNrX3F1ZXVlX2lzX2Z1bGwoc2spKQorCQlnb3RvIGRyb3A7CisKKwkvKgorCSAqIEFjY2VwdCBiYWNrbG9nIGlzIGZ1bGwuIElmIHdlIGhhdmUgYWxyZWFkeSBxdWV1ZWQgZW5vdWdoCisJICogb2Ygd2FybSBlbnRyaWVzIGluIHN5biBxdWV1ZSwgZHJvcCByZXF1ZXN0LiBJdCBpcyBiZXR0ZXIgdGhhbgorCSAqIGNsb2dnaW5nIHN5biBxdWV1ZSB3aXRoIG9wZW5yZXFzIHdpdGggZXhwb25lbnRpYWxseSBpbmNyZWFzaW5nCisJICogdGltZW91dC4KKwkgKi8KKwlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHNrKSAmJiBpbmV0X2Nza19yZXFza19xdWV1ZV95b3VuZyhzaykgPiAxKQorCQlnb3RvIGRyb3A7CisKKwlyZXEgPSByZXFza19hbGxvYygmZGNjcF9yZXF1ZXN0X3NvY2tfb3BzKTsKKwlpZiAocmVxID09IE5VTEwpCisJCWdvdG8gZHJvcDsKKworCWlmIChkY2NwX3BhcnNlX29wdGlvbnMoc2ssIHNrYikpCisJCWdvdG8gZHJvcF9hbmRfZnJlZTsKKworCWRjY3BfcmVxc2tfaW5pdChyZXEsIHNrYik7CisKKwlpZiAoc2VjdXJpdHlfaW5ldF9jb25uX3JlcXVlc3Qoc2ssIHNrYiwgcmVxKSkKKwkJZ290byBkcm9wX2FuZF9mcmVlOworCisJaXJlcSA9IGluZXRfcnNrKHJlcSk7CisJaXJlcS0+bG9jX2FkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7CisJaXJlcS0+cm10X2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJaXJlcS0+b3B0CT0gTlVMTDsKKworCS8qCisJICogU3RlcCAzOiBQcm9jZXNzIExJU1RFTiBzdGF0ZQorCSAqCisJICogU2V0IFMuSVNSLCBTLkdTUiwgUy5TV0wsIFMuU1dIIGZyb20gcGFja2V0IG9yIEluaXQgQ29va2llCisJICoKKwkgKiBJbiBmYWN0IHdlIGRlZmVyIHNldHRpbmcgUy5HU1IsIFMuU1dMLCBTLlNXSCB0bworCSAqIGRjY3BfY3JlYXRlX29wZW5yZXFfY2hpbGQuCisJICovCisJZHJlcSA9IGRjY3BfcnNrKHJlcSk7CisJZHJlcS0+ZHJlcV9pc3IJICAgPSBkY2ItPmRjY3BkX3NlcTsKKwlkcmVxLT5kcmVxX2lzcwkgICA9IGRjY3BfdjRfaW5pdF9zZXF1ZW5jZShza2IpOworCWRyZXEtPmRyZXFfc2VydmljZSA9IHNlcnZpY2U7CisKKwlpZiAoZGNjcF92NF9zZW5kX3Jlc3BvbnNlKHNrLCByZXEsIE5VTEwpKQorCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CisKKwlpbmV0X2Nza19yZXFza19xdWV1ZV9oYXNoX2FkZChzaywgcmVxLCBEQ0NQX1RJTUVPVVRfSU5JVCk7CisJcmV0dXJuIDA7CisKK2Ryb3BfYW5kX2ZyZWU6CisJcmVxc2tfZnJlZShyZXEpOworZHJvcDoKKwlEQ0NQX0lOQ19TVEFUU19CSChEQ0NQX01JQl9BVFRFTVBURkFJTFMpOworCWRjYi0+ZGNjcGRfcmVzZXRfY29kZSA9IHJlc2V0X2NvZGU7CisJcmV0dXJuIC0xOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3Y0X2Nvbm5fcmVxdWVzdCk7CisKIGludCBkY2NwX3Y0X2RvX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7CkBAIC03NjksMjQgKzY4NSwyMyBAQAogCiAJLyoKIAkgKiAgU3RlcCAzOiBQcm9jZXNzIExJU1RFTiBzdGF0ZQotCSAqICAgICBJZiBTLnN0YXRlID09IExJU1RFTiwKLQkgKgkgIElmIFAudHlwZSA9PSBSZXF1ZXN0IG9yIFAgY29udGFpbnMgYSB2YWxpZCBJbml0IENvb2tpZQotCSAqCSAgCW9wdGlvbiwKLQkgKgkgICAgICogTXVzdCBzY2FuIHRoZSBwYWNrZXQncyBvcHRpb25zIHRvIGNoZWNrIGZvciBhbiBJbml0Ci0JICoJCUNvb2tpZS4gIE9ubHkgdGhlIEluaXQgQ29va2llIGlzIHByb2Nlc3NlZCBoZXJlLAotCSAqCQlob3dldmVyOyBvdGhlciBvcHRpb25zIGFyZSBwcm9jZXNzZWQgaW4gU3RlcCA4LiAgVGhpcwotCSAqCQlzY2FuIG5lZWQgb25seSBiZSBwZXJmb3JtZWQgaWYgdGhlIGVuZHBvaW50IHVzZXMgSW5pdAotCSAqCQlDb29raWVzICoKLQkgKgkgICAgICogR2VuZXJhdGUgYSBuZXcgc29ja2V0IGFuZCBzd2l0Y2ggdG8gdGhhdCBzb2NrZXQgKgotCSAqCSAgICAgU2V0IFMgOj0gbmV3IHNvY2tldCBmb3IgdGhpcyBwb3J0IHBhaXIKLQkgKgkgICAgIFMuc3RhdGUgPSBSRVNQT05ECi0JICoJICAgICBDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llCi0JICoJICAgICBTZXQgUy5JU1IsIFMuR1NSLCBTLlNXTCwgUy5TV0ggZnJvbSBwYWNrZXQgb3IgSW5pdCBDb29raWUKLQkgKgkgICAgIENvbnRpbnVlIHdpdGggUy5zdGF0ZSA9PSBSRVNQT05ECi0JICoJICAgICAqIEEgUmVzcG9uc2UgcGFja2V0IHdpbGwgYmUgZ2VuZXJhdGVkIGluIFN0ZXAgMTEgKgotCSAqCSAgT3RoZXJ3aXNlLAotCSAqCSAgICAgR2VuZXJhdGUgUmVzZXQoTm8gQ29ubmVjdGlvbikgdW5sZXNzIFAudHlwZSA9PSBSZXNldAotCSAqCSAgICAgRHJvcCBwYWNrZXQgYW5kIHJldHVybgorCSAqCSBJZiBQLnR5cGUgPT0gUmVxdWVzdCBvciBQIGNvbnRhaW5zIGEgdmFsaWQgSW5pdCBDb29raWUgb3B0aW9uLAorCSAqCSAgICAgICgqIE11c3Qgc2NhbiB0aGUgcGFja2V0J3Mgb3B0aW9ucyB0byBjaGVjayBmb3IgSW5pdAorCSAqCQkgQ29va2llcy4gIE9ubHkgSW5pdCBDb29raWVzIGFyZSBwcm9jZXNzZWQgaGVyZSwKKwkgKgkJIGhvd2V2ZXI7IG90aGVyIG9wdGlvbnMgYXJlIHByb2Nlc3NlZCBpbiBTdGVwIDguICBUaGlzCisJICoJCSBzY2FuIG5lZWQgb25seSBiZSBwZXJmb3JtZWQgaWYgdGhlIGVuZHBvaW50IHVzZXMgSW5pdAorCSAqCQkgQ29va2llcyAqKQorCSAqCSAgICAgICgqIEdlbmVyYXRlIGEgbmV3IHNvY2tldCBhbmQgc3dpdGNoIHRvIHRoYXQgc29ja2V0ICopCisJICoJICAgICAgU2V0IFMgOj0gbmV3IHNvY2tldCBmb3IgdGhpcyBwb3J0IHBhaXIKKwkgKgkgICAgICBTLnN0YXRlID0gUkVTUE9ORAorCSAqCSAgICAgIENob29zZSBTLklTUyAoaW5pdGlhbCBzZXFubykgb3Igc2V0IGZyb20gSW5pdCBDb29raWVzCisJICoJICAgICAgSW5pdGlhbGl6ZSBTLkdBUiA6PSBTLklTUworCSAqCSAgICAgIFNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0IENvb2tpZXMKKwkgKgkgICAgICBDb250aW51ZSB3aXRoIFMuc3RhdGUgPT0gUkVTUE9ORAorCSAqCSAgICAgICgqIEEgUmVzcG9uc2UgcGFja2V0IHdpbGwgYmUgZ2VuZXJhdGVkIGluIFN0ZXAgMTEgKikKKwkgKgkgT3RoZXJ3aXNlLAorCSAqCSAgICAgIEdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKKwkgKgkgICAgICBEcm9wIHBhY2tldCBhbmQgcmV0dXJuCiAJICoKIAkgKiBOT1RFOiB0aGUgY2hlY2sgZm9yIHRoZSBwYWNrZXQgdHlwZXMgaXMgZG9uZSBpbgogCSAqCSBkY2NwX3Jjdl9zdGF0ZV9wcm9jZXNzCkBAIC04MDksNyArNzI0LDcgQEAKIAlyZXR1cm4gMDsKIAogcmVzZXQ6Ci0JZGNjcF92NF9jdGxfc2VuZF9yZXNldChza2IpOworCWRjY3BfdjRfY3RsX3NlbmRfcmVzZXQoc2ssIHNrYik7CiBkaXNjYXJkOgogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwpAQCAtODE3LDYwICs3MzIsNzQgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF92NF9kb19yY3YpOwogCisvKioKKyAqCWRjY3BfaW52YWxpZF9wYWNrZXQgIC0gIGNoZWNrIGZvciBtYWxmb3JtZWQgcGFja2V0cworICoJSW1wbGVtZW50cyBSRkMgNDM0MCwgOC41OiAgU3RlcCAxOiBDaGVjayBoZWFkZXIgYmFzaWNzCisgKglQYWNrZXRzIHRoYXQgZmFpbCB0aGVzZSBjaGVja3MgYXJlIGlnbm9yZWQgYW5kIGRvIG5vdCByZWNlaXZlIFJlc2V0cy4KKyAqLwogaW50IGRjY3BfaW52YWxpZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoOworCXVuc2lnbmVkIGludCBjc2NvdjsKIAogCWlmIChza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9IT1NUKQogCQlyZXR1cm4gMTsKIAorCS8qIElmIHRoZSBwYWNrZXQgaXMgc2hvcnRlciB0aGFuIDEyIGJ5dGVzLCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuICovCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikpKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiRENDUDogcHNrYl9tYXlfcHVsbCBmYWlsZWRcbiIpOworCQlEQ0NQX1dBUk4oInBza2JfbWF5X3B1bGwgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJZGggPSBkY2NwX2hkcihza2IpOwogCi0JLyogSWYgdGhlIHBhY2tldCB0eXBlIGlzIG5vdCB1bmRlcnN0b29kLCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuICovCisJLyogSWYgUC50eXBlIGlzIG5vdCB1bmRlcnN0b29kLCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuICovCiAJaWYgKGRoLT5kY2NwaF90eXBlID49IERDQ1BfUEtUX0lOVkFMSUQpIHsKLQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICJEQ0NQOiBpbnZhbGlkIHBhY2tldCB0eXBlXG4iKTsKKwkJRENDUF9XQVJOKCJpbnZhbGlkIHBhY2tldCB0eXBlXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJLyoKLQkgKiBJZiBQLkRhdGEgT2Zmc2V0IGlzIHRvbyBzbWFsbCBmb3IgcGFja2V0IHR5cGUsIG9yIHRvbyBsYXJnZSBmb3IKLQkgKiBwYWNrZXQsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4KKwkgKiBJZiBQLkRhdGEgT2Zmc2V0IGlzIHRvbyBzbWFsbCBmb3IgcGFja2V0IHR5cGUsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4KIAkgKi8KIAlpZiAoZGgtPmRjY3BoX2RvZmYgPCBkY2NwX2hkcl9sZW4oc2tiKSAvIHNpemVvZih1MzIpKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiRENDUDogUC5EYXRhIE9mZnNldCgldSkgIgotCQkJCQkgICAgInRvbyBzbWFsbCAxXG4iLAotCQkJICAgICAgIGRoLT5kY2NwaF9kb2ZmKTsKKwkJRENDUF9XQVJOKCJQLkRhdGEgT2Zmc2V0KCV1KSB0b28gc21hbGxcbiIsIGRoLT5kY2NwaF9kb2ZmKTsKIAkJcmV0dXJuIDE7CiAJfQotCisJLyoKKwkgKiBJZiBQLkRhdGEgT2Zmc2V0IGlzIHRvbyB0b28gbGFyZ2UgZm9yIHBhY2tldCwgZHJvcCBwYWNrZXQgYW5kIHJldHVybgorCSAqLwogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGRoLT5kY2NwaF9kb2ZmICogc2l6ZW9mKHUzMikpKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiRENDUDogUC5EYXRhIE9mZnNldCgldSkgIgotCQkJCQkgICAgInRvbyBzbWFsbCAyXG4iLAotCQkJICAgICAgIGRoLT5kY2NwaF9kb2ZmKTsKKwkJRENDUF9XQVJOKCJQLkRhdGEgT2Zmc2V0KCV1KSB0b28gbGFyZ2VcbiIsIGRoLT5kY2NwaF9kb2ZmKTsKIAkJcmV0dXJuIDE7CiAJfQogCi0JZGggPSBkY2NwX2hkcihza2IpOwotCiAJLyoKIAkgKiBJZiBQLnR5cGUgaXMgbm90IERhdGEsIEFjaywgb3IgRGF0YUFjayBhbmQgUC5YID09IDAgKHRoZSBwYWNrZXQKIAkgKiBoYXMgc2hvcnQgc2VxdWVuY2UgbnVtYmVycyksIGRyb3AgcGFja2V0IGFuZCByZXR1cm4KIAkgKi8KLQlpZiAoZGgtPmRjY3BoX3ggPT0gMCAmJgotCSAgICBkaC0+ZGNjcGhfdHlwZSAhPSBEQ0NQX1BLVF9EQVRBICYmCi0JICAgIGRoLT5kY2NwaF90eXBlICE9IERDQ1BfUEtUX0FDSyAmJgotCSAgICBkaC0+ZGNjcGhfdHlwZSAhPSBEQ0NQX1BLVF9EQVRBQUNLKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiRENDUDogUC50eXBlICglcykgbm90IERhdGEsIEFjayAiCi0JCQkJCSAgICAibm9yIERhdGFBY2sgYW5kIFAuWCA9PSAwXG4iLAotCQkJICAgICAgIGRjY3BfcGFja2V0X25hbWUoZGgtPmRjY3BoX3R5cGUpKTsKKwlpZiAoZGgtPmRjY3BoX3R5cGUgPj0gRENDUF9QS1RfREFUQSAgICAmJgorCSAgICBkaC0+ZGNjcGhfdHlwZSA8PSBEQ0NQX1BLVF9EQVRBQUNLICYmIGRoLT5kY2NwaF94ID09IDApICB7CisJCURDQ1BfV0FSTigiUC50eXBlICglcykgbm90IERhdGEgfHwgW0RhdGFdQWNrLCB3aGlsZSBQLlggPT0gMFxuIiwKKwkJCSAgZGNjcF9wYWNrZXRfbmFtZShkaC0+ZGNjcGhfdHlwZSkpOwogCQlyZXR1cm4gMTsKIAl9CiAKKwkvKgorCSAqIElmIFAuQ3NDb3YgaXMgdG9vIGxhcmdlIGZvciB0aGUgcGFja2V0IHNpemUsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4uCisJICogVGhpcyBtdXN0IGNvbWUgX2JlZm9yZV8gY2hlY2tzdW1taW5nIChub3QgYXMgUkZDIDQzNDAgc3VnZ2VzdHMpLgorCSAqLworCWNzY292ID0gZGNjcF9jc3VtX2NvdmVyYWdlKHNrYik7CisJaWYgKGNzY292ID4gc2tiLT5sZW4pIHsKKwkJRENDUF9XQVJOKCJQLkNzQ292ICV1IGV4Y2VlZHMgcGFja2V0IGxlbmd0aCAlZFxuIiwKKwkJCSAgZGgtPmRjY3BoX2NzY292LCBza2ItPmxlbik7CisJCXJldHVybiAxOworCX0KKworCS8qIElmIGhlYWRlciBjaGVja3N1bSBpcyBpbmNvcnJlY3QsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4uCisJICogKFRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgaW4gdGhlIEFGLWRlcGVuZGVudCBmdW5jdGlvbnMuKSAqLworCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIDAsIGNzY292LCAwKTsKKwogCXJldHVybiAwOwogfQogCkBAIC04ODEsMTcgKzgxMCwxNiBAQAogewogCWNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGg7CiAJc3RydWN0IHNvY2sgKnNrOworCWludCBtaW5fY292OwogCi0JLyogU3RlcCAxOiBDaGVjayBoZWFkZXIgYmFzaWNzOiAqLworCS8qIFN0ZXAgMTogQ2hlY2sgaGVhZGVyIGJhc2ljcyAqLwogCiAJaWYgKGRjY3BfaW52YWxpZF9wYWNrZXQoc2tiKSkKIAkJZ290byBkaXNjYXJkX2l0OwogCi0JLyogSWYgdGhlIGhlYWRlciBjaGVja3N1bSBpcyBpbmNvcnJlY3QsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4gKi8KLQlpZiAoZGNjcF92NF92ZXJpZnlfY2hlY2tzdW0oc2tiLCBza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJICAgIHNrYi0+bmguaXBoLT5kYWRkcikgPCAwKSB7Ci0JCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiJXM6IGluY29ycmVjdCBoZWFkZXIgY2hlY2tzdW1cbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkvKiBTdGVwIDE6IElmIGhlYWRlciBjaGVja3N1bSBpcyBpbmNvcnJlY3QsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4gKi8KKwlpZiAoZGNjcF92NF9jc3VtX2ZpbmlzaChza2IsIHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyKSkgeworCQlEQ0NQX1dBUk4oImRyb3BwZWQgcGFja2V0IHdpdGggaW52YWxpZCBjaGVja3N1bVxuIik7CiAJCWdvdG8gZGlzY2FyZF9pdDsKIAl9CiAKQEAgLTkxMywyMyArODQxLDIwIEBACiAJCWRjY3BfcHJfZGVidWdfY2F0KCJcbiIpOwogCX0gZWxzZSB7CiAJCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEgPSBkY2NwX2hkcl9hY2tfc2VxKHNrYik7Ci0JCWRjY3BfcHJfZGVidWdfY2F0KCIsIGFjaz0lbGx1XG4iLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJZGNjcF9wcl9kZWJ1Z19jYXQoIiwgYWNrPSVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpCiAJCQkJICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxKTsKIAl9CiAKIAkvKiBTdGVwIDI6Ci0JICogCUxvb2sgdXAgZmxvdyBJRCBpbiB0YWJsZSBhbmQgZ2V0IGNvcnJlc3BvbmRpbmcgc29ja2V0ICovCisJICoJTG9vayB1cCBmbG93IElEIGluIHRhYmxlIGFuZCBnZXQgY29ycmVzcG9uZGluZyBzb2NrZXQgKi8KIAlzayA9IF9faW5ldF9sb29rdXAoJmRjY3BfaGFzaGluZm8sCiAJCQkgICBza2ItPm5oLmlwaC0+c2FkZHIsIGRoLT5kY2NwaF9zcG9ydCwKIAkJCSAgIHNrYi0+bmguaXBoLT5kYWRkciwgZGgtPmRjY3BoX2Rwb3J0LAogCQkJICAgaW5ldF9paWYoc2tiKSk7CiAKLQkvKiAKKwkvKgogCSAqIFN0ZXAgMjoKLQkgKiAJSWYgbm8gc29ja2V0IC4uLgotCSAqCQlHZW5lcmF0ZSBSZXNldChObyBDb25uZWN0aW9uKSB1bmxlc3MgUC50eXBlID09IFJlc2V0Ci0JICoJCURyb3AgcGFja2V0IGFuZCByZXR1cm4KKwkgKglJZiBubyBzb2NrZXQgLi4uCiAJICovCiAJaWYgKHNrID09IE5VTEwpIHsKIAkJZGNjcF9wcl9kZWJ1ZygiZmFpbGVkIHRvIGxvb2sgdXAgZmxvdyBJRCBpbiB0YWJsZSBhbmQgIgpAQCAtOTM3LDUxICs4NjIsNjEgQEAKIAkJZ290byBub19kY2NwX3NvY2tldDsKIAl9CiAKLQkvKiAKKwkvKgogCSAqIFN0ZXAgMjoKLQkgKiAJLi4uIG9yIFMuc3RhdGUgPT0gVElNRVdBSVQsCisJICoJLi4uIG9yIFMuc3RhdGUgPT0gVElNRVdBSVQsCiAJICoJCUdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKIAkgKgkJRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqLwotCSAgICAgICAKIAlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfVElNRV9XQUlUKSB7Ci0JCWRjY3BfcHJfZGVidWcoInNrLT5za19zdGF0ZSA9PSBEQ0NQX1RJTUVfV0FJVDogIgotCQkJICAgICAgImRvX3RpbWVfd2FpdFxuIik7Ci0gICAgICAgICAgICAgICAgZ290byBkb190aW1lX3dhaXQ7CisJCWRjY3BfcHJfZGVidWcoInNrLT5za19zdGF0ZSA9PSBEQ0NQX1RJTUVfV0FJVDogZG9fdGltZV93YWl0XG4iKTsKKwkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKKwkJZ290byBub19kY2NwX3NvY2tldDsKKwl9CisKKwkvKgorCSAqIFJGQyA0MzQwLCBzZWMuIDkuMi4xOiBNaW5pbXVtIENoZWNrc3VtIENvdmVyYWdlCisJICoJbyBpZiBNaW5Dc0NvdiA9IDAsIG9ubHkgcGFja2V0cyB3aXRoIENzQ292ID0gMCBhcmUgYWNjZXB0ZWQKKwkgKglvIGlmIE1pbkNzQ292ID4gMCwgYWxzbyBhY2NlcHQgcGFja2V0cyB3aXRoIENzQ292ID49IE1pbkNzQ292CisJICovCisJbWluX2NvdiA9IGRjY3Bfc2soc2spLT5kY2Nwc19wY3JsZW47CisJaWYgKGRoLT5kY2NwaF9jc2NvdiAmJiAobWluX2NvdiA9PSAwIHx8IGRoLT5kY2NwaF9jc2NvdiA8IG1pbl9jb3YpKSAgeworCQlkY2NwX3ByX2RlYnVnKCJQYWNrZXQgQ3NDb3YgJWQgZG9lcyBub3Qgc2F0aXNmeSBNaW5Dc0NvdiAlZFxuIiwKKwkJCSAgICAgIGRoLT5kY2NwaF9jc2NvdiwgbWluX2Nvdik7CisJCS8qIEZJWE1FOiAiU3VjaCBwYWNrZXRzIFNIT1VMRCBiZSByZXBvcnRlZCB1c2luZyBEYXRhIERyb3BwZWQKKwkJICogICAgICAgICBvcHRpb25zIChTZWN0aW9uIDExLjcpIHdpdGggRHJvcCBDb2RlIDAsIFByb3RvY29sCisJCSAqICAgICAgICAgQ29uc3RyYWludHMuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlnb3RvIGRpc2NhcmRfYW5kX3JlbHNlOwogCX0KIAogCWlmICgheGZybTRfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKIAkJZ290byBkaXNjYXJkX2FuZF9yZWxzZTsKIAluZl9yZXNldChza2IpOwogCi0JcmV0dXJuIHNrX3JlY2VpdmVfc2tiKHNrLCBza2IpOworCXJldHVybiBza19yZWNlaXZlX3NrYihzaywgc2tiLCAxKTsKIAogbm9fZGNjcF9zb2NrZXQ6CiAJaWYgKCF4ZnJtNF9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAkvKgogCSAqIFN0ZXAgMjoKKwkgKglJZiBubyBzb2NrZXQgLi4uCiAJICoJCUdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKIAkgKgkJRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqLwogCWlmIChkaC0+ZGNjcGhfdHlwZSAhPSBEQ0NQX1BLVF9SRVNFVCkgewogCQlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9yZXNldF9jb2RlID0KIAkJCQkJRENDUF9SRVNFVF9DT0RFX05PX0NPTk5FQ1RJT047Ci0JCWRjY3BfdjRfY3RsX3NlbmRfcmVzZXQoc2tiKTsKKwkJZGNjcF92NF9jdGxfc2VuZF9yZXNldChzaywgc2tiKTsKIAl9CiAKIGRpc2NhcmRfaXQ6Ci0JLyogRGlzY2FyZCBmcmFtZS4gKi8KIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gMDsKIAogZGlzY2FyZF9hbmRfcmVsc2U6CiAJc29ja19wdXQoc2spOwogCWdvdG8gZGlzY2FyZF9pdDsKLQotZG9fdGltZV93YWl0OgotCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7Ci0JZ290byBub19kY2NwX3NvY2tldDsKIH0KIAogc3RhdGljIHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29ja19hZl9vcHMgZGNjcF9pcHY0X2FmX29wcyA9IHsKQEAgLTEwMTUsMjAgKzk1MCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgZGNjcF92NF9yZXFza19kZXN0cnVjdG9yKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKLXsKLQlrZnJlZShpbmV0X3JzayhyZXEpLT5vcHQpOwotfQotCi1zdGF0aWMgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgZGNjcF9yZXF1ZXN0X3NvY2tfb3BzID0gewotCS5mYW1pbHkJCT0gUEZfSU5FVCwKLQkub2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGRjY3BfcmVxdWVzdF9zb2NrKSwKLQkucnR4X3N5bl9hY2sJPSBkY2NwX3Y0X3NlbmRfcmVzcG9uc2UsCi0JLnNlbmRfYWNrCT0gZGNjcF92NF9yZXFza19zZW5kX2FjaywKLQkuZGVzdHJ1Y3Rvcgk9IGRjY3BfdjRfcmVxc2tfZGVzdHJ1Y3RvciwKLQkuc2VuZF9yZXNldAk9IGRjY3BfdjRfY3RsX3NlbmRfcmVzZXQsCi19OwotCiBzdGF0aWMgc3RydWN0IHRpbWV3YWl0X3NvY2tfb3BzIGRjY3BfdGltZXdhaXRfc29ja19vcHMgPSB7CiAJLnR3c2tfb2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayksCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2Ni5jIGIvbmV0L2RjY3AvaXB2Ni5jCmluZGV4IDcxNzFhNzguLjZiOTFhOWQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjYuYworKysgYi9uZXQvZGNjcC9pcHY2LmMKQEAgLTM2LDEzICszNiw2IEBACiAvKiBTb2NrZXQgdXNlZCBmb3Igc2VuZGluZyBSU1RzIGFuZCBBQ0tzICovCiBzdGF0aWMgc3RydWN0IHNvY2tldCAqZGNjcF92Nl9jdGxfc29ja2V0OwogCi1zdGF0aWMgdm9pZCBkY2NwX3Y2X2N0bF9zZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIHZvaWQgZGNjcF92Nl9yZXFza19zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7Ci1zdGF0aWMgdm9pZCBkY2NwX3Y2X3NlbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotc3RhdGljIGludCBkY2NwX3Y2X2RvX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwotCiBzdGF0aWMgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrX2FmX29wcyBkY2NwX2lwdjZfbWFwcGVkOwogc3RhdGljIHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29ja19hZl9vcHMgZGNjcF9pcHY2X2FmX29wczsKIApAQCAtNjUsMjA1ICs1OCwzNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB1MTYgZGNjcF92Nl9jaGVjayhzdHJ1Y3QgZGNjcF9oZHIgKmRoLCBpbnQgbGVuLAotCQkJCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQl1bnNpZ25lZCBsb25nIGJhc2UpCisvKiBhZGQgcHNldWRvLWhlYWRlciB0byBEQ0NQIGNoZWNrc3VtIHN0b3JlZCBpbiBza2ItPmNzdW0gKi8KK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBkY2NwX3Y2X2NzdW1fZmluaXNoKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyKQogewotCXJldHVybiBjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBsZW4sIElQUFJPVE9fRENDUCwgYmFzZSk7CisJcmV0dXJuIGNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHNrYi0+bGVuLCBJUFBST1RPX0RDQ1AsIHNrYi0+Y3N1bSk7CiB9CiAKLXN0YXRpYyBfX3UzMiBkY2NwX3Y2X2luaXRfc2VxdWVuY2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSB2b2lkIGRjY3BfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCB1bnVzZWRfdmFsdWUsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKLQotCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQotCQlyZXR1cm4gc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcihza2ItPm5oLmlwdjZoLT5kYWRkci5zNl9hZGRyMzIsCi0JCQkJCQkgICAgc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcjMyLAotCQkJCQkJICAgIGRoLT5kY2NwaF9kcG9ydCwKLQkJCQkJCSAgICBkaC0+ZGNjcGhfc3BvcnQpOwotCi0JcmV0dXJuIHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCSAgIHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJICAgZGgtPmRjY3BoX2Rwb3J0LAotCQkJCQkgICBkaC0+ZGNjcGhfc3BvcnQpOwotfQotCi1zdGF0aWMgaW50IGRjY3BfdjZfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCi0JCQkgICBpbnQgYWRkcl9sZW4pCi17Ci0Jc3RydWN0IHNvY2thZGRyX2luNiAqdXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopdWFkZHI7Ci0Jc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwotCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7Ci0Jc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gTlVMTCwgKmZpbmFsX3AgPSBOVUxMLCBmaW5hbDsKLQlzdHJ1Y3QgZmxvd2kgZmw7Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0OwotCWludCBhZGRyX3R5cGU7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKIAotCWRwLT5kY2Nwc19yb2xlID0gRENDUF9ST0xFX0NMSUVOVDsKKwlkY2NwX2NzdW1fb3V0Z29pbmcoc2tiKTsKKwlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y2X2NzdW1fZmluaXNoKHNrYiwgJm5wLT5zYWRkciwgJm5wLT5kYWRkcik7Cit9CiAKLQlpZiAoYWRkcl9sZW4gPCBTSU42X0xFTl9SRkMyMTMzKQotCQlyZXR1cm4gLUVJTlZBTDsKK3N0YXRpYyBpbmxpbmUgX191MzIgc2VjdXJlX2RjY3B2Nl9zZXF1ZW5jZV9udW1iZXIoX19iZTMyICpzYWRkciwgX19iZTMyICpkYWRkciwKKwkJCQkJCSAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQgICApCit7CisJcmV0dXJuIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoc2FkZHIsIGRhZGRyLCBzcG9ydCwgZHBvcnQpOworfQogCi0JaWYgKHVzaW4tPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KQotCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKK3N0YXRpYyBpbmxpbmUgX191MzIgZGNjcF92Nl9pbml0X3NlcXVlbmNlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNlY3VyZV9kY2NwdjZfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXB2NmgtPmRhZGRyLnM2X2FkZHIzMiwKKwkJCQkJICAgICBza2ItPm5oLmlwdjZoLT5zYWRkci5zNl9hZGRyMzIsCisJCQkJCSAgICAgZGNjcF9oZHIoc2tiKS0+ZGNjcGhfZHBvcnQsCisJCQkJCSAgICAgZGNjcF9oZHIoc2tiKS0+ZGNjcGhfc3BvcnQgICAgICk7CiAKLQltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKLQotCWlmIChucC0+c25kZmxvdykgewotCQlmbC5mbDZfZmxvd2xhYmVsID0gdXNpbi0+c2luNl9mbG93aW5mbyAmIElQVjZfRkxPV0lORk9fTUFTSzsKLQkJSVA2X0VDTl9mbG93X2luaXQoZmwuZmw2X2Zsb3dsYWJlbCk7Ci0JCWlmIChmbC5mbDZfZmxvd2xhYmVsICYgSVBWNl9GTE9XTEFCRUxfTUFTSykgewotCQkJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsb3dsYWJlbDsKLQkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmwuZmw2X2Zsb3dsYWJlbCk7Ci0JCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpcHY2X2FkZHJfY29weSgmdXNpbi0+c2luNl9hZGRyLCAmZmxvd2xhYmVsLT5kc3QpOwotCQkJZmw2X3NvY2tfcmVsZWFzZShmbG93bGFiZWwpOwotCQl9Ci0JfQotCS8qCi0JICogY29ubmVjdCgpIHRvIElOQUREUl9BTlkgbWVhbnMgbG9vcGJhY2sgKEJTRCdpc20pLgotCSAqLwotCWlmIChpcHY2X2FkZHJfYW55KCZ1c2luLT5zaW42X2FkZHIpKQotCQl1c2luLT5zaW42X2FkZHIuczZfYWRkclsxNV0gPSAxOwotCi0JYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnVzaW4tPnNpbjZfYWRkcik7Ci0KLQlpZiAoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkKLQkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKLQotCWlmIChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSB7Ci0JCWlmIChhZGRyX2xlbiA+PSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgJiYKLQkJICAgIHVzaW4tPnNpbjZfc2NvcGVfaWQpIHsKLQkJCS8qIElmIGludGVyZmFjZSBpcyBzZXQgd2hpbGUgYmluZGluZywgaW5kaWNlcwotCQkJICogbXVzdCBjb2luY2lkZS4KLQkJCSAqLwotCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYKLQkJCSAgICBzay0+c2tfYm91bmRfZGV2X2lmICE9IHVzaW4tPnNpbjZfc2NvcGVfaWQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSB1c2luLT5zaW42X3Njb3BlX2lkOwotCQl9Ci0KLQkJLyogQ29ubmVjdCB0byBsaW5rLWxvY2FsIGFkZHJlc3MgcmVxdWlyZXMgYW4gaW50ZXJmYWNlICovCi0JCWlmICghc2stPnNrX2JvdW5kX2Rldl9pZikKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlwdjZfYWRkcl9jb3B5KCZucC0+ZGFkZHIsICZ1c2luLT5zaW42X2FkZHIpOwotCW5wLT5mbG93X2xhYmVsID0gZmwuZmw2X2Zsb3dsYWJlbDsKLQotCS8qCi0JICogRENDUCBvdmVyIElQdjQKLQkgKi8KLQlpZiAoYWRkcl90eXBlID09IElQVjZfQUREUl9NQVBQRUQpIHsKLQkJdTMyIGV4dGhkcmxlbiA9IGljc2stPmljc2tfZXh0X2hkcl9sZW47Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0KLQkJU09DS19ERUJVRyhzaywgImNvbm5lY3Q6IGlwdjQgbWFwcGVkXG4iKTsKLQotCQlpZiAoX19pcHY2X29ubHlfc29jayhzaykpCi0JCQlyZXR1cm4gLUVORVRVTlJFQUNIOwotCi0JCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2luLnNpbl9wb3J0ID0gdXNpbi0+c2luNl9wb3J0OwotCQlzaW4uc2luX2FkZHIuc19hZGRyID0gdXNpbi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXTsKLQotCQlpY3NrLT5pY3NrX2FmX29wcyA9ICZkY2NwX2lwdjZfbWFwcGVkOwotCQlzay0+c2tfYmFja2xvZ19yY3YgPSBkY2NwX3Y0X2RvX3JjdjsKLQotCQllcnIgPSBkY2NwX3Y0X2Nvbm5lY3Qoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSk7Ci0JCWlmIChlcnIpIHsKLQkJCWljc2stPmljc2tfZXh0X2hkcl9sZW4gPSBleHRoZHJsZW47Ci0JCQlpY3NrLT5pY3NrX2FmX29wcyA9ICZkY2NwX2lwdjZfYWZfb3BzOwotCQkJc2stPnNrX2JhY2tsb2dfcmN2ID0gZGNjcF92Nl9kb19yY3Y7Ci0JCQlnb3RvIGZhaWx1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlpcHY2X2FkZHJfc2V0KCZucC0+c2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMEZGRkYpLAotCQkJCSAgICAgIGluZXQtPnNhZGRyKTsKLQkJCWlwdjZfYWRkcl9zZXQoJm5wLT5yY3Zfc2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMEZGRkYpLAotCQkJCSAgICAgIGluZXQtPnJjdl9zYWRkcik7Ci0JCX0KLQotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICghaXB2Nl9hZGRyX2FueSgmbnAtPnJjdl9zYWRkcikpCi0JCXNhZGRyID0gJm5wLT5yY3Zfc2FkZHI7Ci0KLQlmbC5wcm90byA9IElQUFJPVE9fRENDUDsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJm5wLT5kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsIHNhZGRyID8gc2FkZHIgOiAmbnAtPnNhZGRyKTsKLQlmbC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwotCWZsLmZsX2lwX2Rwb3J0ID0gdXNpbi0+c2luNl9wb3J0OwotCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldC0+c3BvcnQ7Ci0Jc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKLQotCWlmIChucC0+b3B0ICE9IE5VTEwgJiYgbnAtPm9wdC0+c3JjcnQgIT0gTlVMTCkgewotCQljb25zdCBzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopbnAtPm9wdC0+c3JjcnQ7Ci0KLQkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOwotCQlmaW5hbF9wID0gJmZpbmFsOwotCX0KLQotCWVyciA9IGlwNl9kc3RfbG9va3VwKHNrLCAmZHN0LCAmZmwpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbHVyZTsKLQotCWlmIChmaW5hbF9wKQotCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgZmluYWxfcCk7Ci0KLQllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBmYWlsdXJlOwotCi0JaWYgKHNhZGRyID09IE5VTEwpIHsKLQkJc2FkZHIgPSAmZmwuZmw2X3NyYzsKLQkJaXB2Nl9hZGRyX2NvcHkoJm5wLT5yY3Zfc2FkZHIsIHNhZGRyKTsKLQl9Ci0KLQkvKiBzZXQgdGhlIHNvdXJjZSBhZGRyZXNzICovCi0JaXB2Nl9hZGRyX2NvcHkoJm5wLT5zYWRkciwgc2FkZHIpOwotCWluZXQtPnJjdl9zYWRkciA9IExPT1BCQUNLNF9JUFY2OwotCi0JX19pcDZfZHN0X3N0b3JlKHNrLCBkc3QsIE5VTEwsIE5VTEwpOwotCi0JaWNzay0+aWNza19leHRfaGRyX2xlbiA9IDA7Ci0JaWYgKG5wLT5vcHQgIT0gTlVMTCkKLQkJaWNzay0+aWNza19leHRfaGRyX2xlbiA9IChucC0+b3B0LT5vcHRfZmxlbiArCi0JCQkJCSAgbnAtPm9wdC0+b3B0X25mbGVuKTsKLQotCWluZXQtPmRwb3J0ID0gdXNpbi0+c2luNl9wb3J0OwotCi0JZGNjcF9zZXRfc3RhdGUoc2ssIERDQ1BfUkVRVUVTVElORyk7Ci0JZXJyID0gaW5ldDZfaGFzaF9jb25uZWN0KCZkY2NwX2RlYXRoX3Jvdywgc2spOwotCWlmIChlcnIpCi0JCWdvdG8gbGF0ZV9mYWlsdXJlOwotCS8qIEZJWE1FICovCi0jaWYgMAotCWRwLT5kY2Nwc19nYXIgPSBzZWN1cmVfZGNjcF92Nl9zZXF1ZW5jZV9udW1iZXIobnAtPnNhZGRyLnM2X2FkZHIzMiwKLQkJCQkJCSAgICAgICBucC0+ZGFkZHIuczZfYWRkcjMyLAotCQkJCQkJICAgICAgIGluZXQtPnNwb3J0LAotCQkJCQkJICAgICAgIGluZXQtPmRwb3J0KTsKLSNlbmRpZgotCWVyciA9IGRjY3BfY29ubmVjdChzayk7Ci0JaWYgKGVycikKLQkJZ290byBsYXRlX2ZhaWx1cmU7Ci0KLQlyZXR1cm4gMDsKLQotbGF0ZV9mYWlsdXJlOgotCWRjY3Bfc2V0X3N0YXRlKHNrLCBEQ0NQX0NMT1NFRCk7Ci0JX19za19kc3RfcmVzZXQoc2spOwotZmFpbHVyZToKLQlpbmV0LT5kcG9ydCA9IDA7Ci0Jc2stPnNrX3JvdXRlX2NhcHMgPSAwOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGRjY3BfdjZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LApAQCAtMjc3LDcgKzEwMiw3IEBACiAJX191NjQgc2VxOwogCiAJc2sgPSBpbmV0Nl9sb29rdXAoJmRjY3BfaGFzaGluZm8sICZoZHItPmRhZGRyLCBkaC0+ZGNjcGhfZHBvcnQsCi0JCQkgICZoZHItPnNhZGRyLCBkaC0+ZGNjcGhfc3BvcnQsIHNrYi0+ZGV2LT5pZmluZGV4KTsKKwkJCSAgJmhkci0+c2FkZHIsIGRoLT5kY2NwaF9zcG9ydCwgaW5ldDZfaWlmKHNrYikpOwogCiAJaWYgKHNrID09IE5VTEwpIHsKIAkJSUNNUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoc2tiLT5kZXYpLCBJQ01QNl9NSUJfSU5FUlJPUlMpOwpAQCAtNDY0LDE2ICsyODksMTIgQEAKIAlpZiAoc2tiICE9IE5VTEwpIHsKIAkJc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7CiAKLQkJZGgtPmRjY3BoX2NoZWNrc3VtID0gZGNjcF92Nl9jaGVjayhkaCwgc2tiLT5sZW4sCi0JCQkJCQkgICAmaXJlcTYtPmxvY19hZGRyLAotCQkJCQkJICAgJmlyZXE2LT5ybXRfYWRkciwKLQkJCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKWRoLAotCQkJCQkJCQlza2ItPmxlbiwKLQkJCQkJCQkJc2tiLT5jc3VtKSk7CisJCWRoLT5kY2NwaF9jaGVja3N1bSA9IGRjY3BfdjZfY3N1bV9maW5pc2goc2tiLAorCQkJCQkJCSAmaXJlcTYtPmxvY19hZGRyLAorCQkJCQkJCSAmaXJlcTYtPnJtdF9hZGRyKTsKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZpcmVxNi0+cm10X2FkZHIpOwogCQllcnIgPSBpcDZfeG1pdChzaywgc2tiLCAmZmwsIG9wdCwgMCk7Ci0JCWlmIChlcnIgPT0gTkVUX1hNSVRfQ04pCi0JCQllcnIgPSAwOworCQllcnIgPSBuZXRfeG1pdF9ldmFsKGVycik7CiAJfQogCiBkb25lOgpAQCAtNDg5LDMyICszMTAsNyBAQAogCQlrZnJlZV9za2IoaW5ldDZfcnNrKHJlcSktPnBrdG9wdHMpOwogfQogCi1zdGF0aWMgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgZGNjcDZfcmVxdWVzdF9zb2NrX29wcyA9IHsKLQkuZmFtaWx5CQk9IEFGX0lORVQ2LAotCS5vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgZGNjcDZfcmVxdWVzdF9zb2NrKSwKLQkucnR4X3N5bl9hY2sJPSBkY2NwX3Y2X3NlbmRfcmVzcG9uc2UsCi0JLnNlbmRfYWNrCT0gZGNjcF92Nl9yZXFza19zZW5kX2FjaywKLQkuZGVzdHJ1Y3Rvcgk9IGRjY3BfdjZfcmVxc2tfZGVzdHJ1Y3RvciwKLQkuc2VuZF9yZXNldAk9IGRjY3BfdjZfY3RsX3NlbmRfcmVzZXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHRpbWV3YWl0X3NvY2tfb3BzIGRjY3A2X3RpbWV3YWl0X3NvY2tfb3BzID0gewotCS50d3NrX29ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBkY2NwNl90aW1ld2FpdF9zb2NrKSwKLX07Ci0KLXN0YXRpYyB2b2lkIGRjY3BfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwotCXN0cnVjdCBkY2NwX2hkciAqZGggPSBkY2NwX2hkcihza2IpOwotCi0JZGgtPmRjY3BoX2NoZWNrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZucC0+c2FkZHIsICZucC0+ZGFkZHIsCi0JCQkJCSAgICAgbGVuLCBJUFBST1RPX0RDQ1AsCi0JCQkJCSAgICAgY3N1bV9wYXJ0aWFsKChjaGFyICopZGgsCi0JCQkJCQkJICBkaC0+ZGNjcGhfZG9mZiA8PCAyLAotCQkJCQkJCSAgc2tiLT5jc3VtKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRjY3BfdjZfY3RsX3NlbmRfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnJ4c2tiKQorc3RhdGljIHZvaWQgZGNjcF92Nl9jdGxfc2VuZF9yZXNldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpyeHNrYikKIHsKIAlzdHJ1Y3QgZGNjcF9oZHIgKnJ4ZGggPSBkY2NwX2hkcihyeHNrYiksICpkaDsKIAljb25zdCB1MzIgZGNjcF9oZHJfcmVzZXRfbGVuID0gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikgKwpAQCAtNTIyLDcgKzMxOCw3IEBACiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfcmVzZXQpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGZsb3dpIGZsOwotCXU2NCBzZXFubzsKKwl1NjQgc2Vxbm8gPSAwOwogCiAJaWYgKHJ4ZGgtPmRjY3BoX3R5cGUgPT0gRENDUF9QS1RfUkVTRVQpCiAJCXJldHVybjsKQEAgLTUzMywxMyArMzI5LDExIEBACiAJc2tiID0gYWxsb2Nfc2tiKGRjY3BfdjZfY3RsX3NvY2tldC0+c2stPnNrX3Byb3QtPm1heF9oZWFkZXIsCiAJCQlHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpCi0JICAJcmV0dXJuOworCQlyZXR1cm47CiAKIAlza2JfcmVzZXJ2ZShza2IsIGRjY3BfdjZfY3RsX3NvY2tldC0+c2stPnNrX3Byb3QtPm1heF9oZWFkZXIpOwogCi0Jc2tiLT5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgZGNjcF9oZHJfcmVzZXRfbGVuKTsKLQlkaCA9IGRjY3BfaGRyKHNrYik7Ci0JbWVtc2V0KGRoLCAwLCBkY2NwX2hkcl9yZXNldF9sZW4pOworCWRoID0gZGNjcF96ZXJvZWRfaGRyKHNrYiwgZGNjcF9oZHJfcmVzZXRfbGVuKTsKIAogCS8qIFN3YXAgdGhlIHNlbmQgYW5kIHRoZSByZWNlaXZlLiAqLwogCWRoLT5kY2NwaF90eXBlCT0gRENDUF9QS1RfUkVTRVQ7CkBAIC01NTAsMjEgKzM0NCwyMSBAQAogCWRjY3BfaGRyX3Jlc2V0KHNrYiktPmRjY3BoX3Jlc2V0X2NvZGUgPQogCQkJCURDQ1BfU0tCX0NCKHJ4c2tiKS0+ZGNjcGRfcmVzZXRfY29kZTsKIAotCS8qIFNlZSAiOC4zLjEuIEFibm9ybWFsIFRlcm1pbmF0aW9uIiBpbiBkcmFmdC1pZXRmLWRjY3Atc3BlYy0xMSAqLwotCXNlcW5vID0gMDsKKwkvKiBTZWUgIjguMy4xLiBBYm5vcm1hbCBUZXJtaW5hdGlvbiIgaW4gUkZDIDQzNDAgKi8KIAlpZiAoRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9hY2tfc2VxICE9IERDQ1BfUEtUX1dJVEhPVVRfQUNLX1NFUSkKIAkJZGNjcF9zZXRfc2Vxbm8oJnNlcW5vLCBEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX2Fja19zZXEgKyAxKTsKIAogCWRjY3BfaGRyX3NldF9zZXEoZGgsIHNlcW5vKTsKLQlkY2NwX2hkcl9zZXRfYWNrKGRjY3BfaGRyX2Fja19iaXRzKHNrYiksCi0JCQkgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9zZXEpOworCWRjY3BfaGRyX3NldF9hY2soZGNjcF9oZHJfYWNrX2JpdHMoc2tiKSwgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9zZXEpOworCisJZGNjcF9jc3VtX291dGdvaW5nKHNrYik7CisJZGgtPmRjY3BoX2NoZWNrc3VtID0gZGNjcF92Nl9jc3VtX2ZpbmlzaChza2IsICZyeHNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCQkJICAgICAgJnJ4c2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwogCiAJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CiAJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZyeHNrYi0+bmguaXB2NmgtPnNhZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnJ4c2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwotCWRoLT5kY2NwaF9jaGVja3N1bSA9IGNzdW1faXB2Nl9tYWdpYygmZmwuZmw2X3NyYywgJmZsLmZsNl9kc3QsCi0JCQkJCSAgICAgc2l6ZW9mKCpkaCksIElQUFJPVE9fRENDUCwKLQkJCQkJICAgICBza2ItPmNzdW0pOworCiAJZmwucHJvdG8gPSBJUFBST1RPX0RDQ1A7CiAJZmwub2lmID0gaW5ldDZfaWlmKHJ4c2tiKTsKIAlmbC5mbF9pcF9kcG9ydCA9IGRoLT5kY2NwaF9kcG9ydDsKQEAgLTU4NCw2MCArMzc4LDE0IEBACiAJa2ZyZWVfc2tiKHNrYik7CiB9CiAKLXN0YXRpYyB2b2lkIGRjY3BfdjZfcmVxc2tfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnJ4c2tiLAotCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKLXsKLQlzdHJ1Y3QgZmxvd2kgZmw7Ci0Jc3RydWN0IGRjY3BfaGRyICpyeGRoID0gZGNjcF9oZHIocnhza2IpLCAqZGg7Ci0JY29uc3QgdTMyIGRjY3BfaGRyX2Fja19sZW4gPSBzaXplb2Yoc3RydWN0IGRjY3BfaGRyKSArCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX2V4dCkgKwotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9hY2tfYml0cyk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCXNrYiA9IGFsbG9jX3NrYihkY2NwX3Y2X2N0bF9zb2NrZXQtPnNrLT5za19wcm90LT5tYXhfaGVhZGVyLAotCQkJR0ZQX0FUT01JQyk7Ci0JaWYgKHNrYiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlza2JfcmVzZXJ2ZShza2IsIGRjY3BfdjZfY3RsX3NvY2tldC0+c2stPnNrX3Byb3QtPm1heF9oZWFkZXIpOwotCi0Jc2tiLT5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgZGNjcF9oZHJfYWNrX2xlbik7Ci0JZGggPSBkY2NwX2hkcihza2IpOwotCW1lbXNldChkaCwgMCwgZGNjcF9oZHJfYWNrX2xlbik7Ci0KLQkvKiBCdWlsZCBEQ0NQIGhlYWRlciBhbmQgY2hlY2tzdW0gaXQuICovCi0JZGgtPmRjY3BoX3R5cGUJPSBEQ0NQX1BLVF9BQ0s7Ci0JZGgtPmRjY3BoX3Nwb3J0ID0gcnhkaC0+ZGNjcGhfZHBvcnQ7Ci0JZGgtPmRjY3BoX2Rwb3J0ID0gcnhkaC0+ZGNjcGhfc3BvcnQ7Ci0JZGgtPmRjY3BoX2RvZmYJPSBkY2NwX2hkcl9hY2tfbGVuIC8gNDsKLQlkaC0+ZGNjcGhfeAk9IDE7Ci0KLQlkY2NwX2hkcl9zZXRfc2VxKGRoLCBEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX2Fja19zZXEpOwotCWRjY3BfaGRyX3NldF9hY2soZGNjcF9oZHJfYWNrX2JpdHMoc2tiKSwKLQkJCSBEQ0NQX1NLQl9DQihyeHNrYiktPmRjY3BkX3NlcSk7Ci0KLQltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnJ4c2tiLT5uaC5pcHY2aC0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmcnhza2ItPm5oLmlwdjZoLT5kYWRkcik7Ci0KLQkvKiBGSVhNRTogY2FsY3VsYXRlIGNoZWNrc3VtLCBJUHY0IGFsc28gc2hvdWxkLi4uICovCi0KLQlmbC5wcm90byA9IElQUFJPVE9fRENDUDsKLQlmbC5vaWYgPSBpbmV0Nl9paWYocnhza2IpOwotCWZsLmZsX2lwX2Rwb3J0ID0gZGgtPmRjY3BoX2Rwb3J0OwotCWZsLmZsX2lwX3Nwb3J0ID0gZGgtPmRjY3BoX3Nwb3J0OwotCXNlY3VyaXR5X3JlcV9jbGFzc2lmeV9mbG93KHJlcSwgJmZsKTsKLQotCWlmICghaXA2X2RzdF9sb29rdXAoTlVMTCwgJnNrYi0+ZHN0LCAmZmwpKSB7Ci0JCWlmICh4ZnJtX2xvb2t1cCgmc2tiLT5kc3QsICZmbCwgTlVMTCwgMCkgPj0gMCkgewotCQkJaXA2X3htaXQoZGNjcF92Nl9jdGxfc29ja2V0LT5zaywgc2tiLCAmZmwsIE5VTEwsIDApOwotCQkJRENDUF9JTkNfU1RBVFNfQkgoRENDUF9NSUJfT1VUU0VHUyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlrZnJlZV9za2Ioc2tiKTsKLX0KK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcyBkY2NwNl9yZXF1ZXN0X3NvY2tfb3BzID0geworCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCBkY2NwNl9yZXF1ZXN0X3NvY2spLAorCS5ydHhfc3luX2Fjawk9IGRjY3BfdjZfc2VuZF9yZXNwb25zZSwKKwkuc2VuZF9hY2sJPSBkY2NwX3JlcXNrX3NlbmRfYWNrLAorCS5kZXN0cnVjdG9yCT0gZGNjcF92Nl9yZXFza19kZXN0cnVjdG9yLAorCS5zZW5kX3Jlc2V0CT0gZGNjcF92Nl9jdGxfc2VuZF9yZXNldCwKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgc29jayAqZGNjcF92Nl9obmRfcmVxKHN0cnVjdCBzb2NrICpzayxzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNjcyLDEzICs0MjAsMTEgQEAKIAogc3RhdGljIGludCBkY2NwX3Y2X2Nvbm5fcmVxdWVzdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxOwotCXN0cnVjdCBkY2NwX3NvY2sgZHA7CiAJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOwogCXN0cnVjdCBkY2NwX3JlcXVlc3Rfc29jayAqZHJlcTsKIAlzdHJ1Y3QgaW5ldDZfcmVxdWVzdF9zb2NrICppcmVxNjsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7Ci0gCWNvbnN0IF9fYmUzMiBzZXJ2aWNlID0gZGNjcF9oZHJfcmVxdWVzdChza2IpLT5kY2NwaF9yZXFfc2VydmljZTsKKwljb25zdCBfX2JlMzIgc2VydmljZSA9IGRjY3BfaGRyX3JlcXVlc3Qoc2tiKS0+ZGNjcGhfcmVxX3NlcnZpY2U7CiAJc3RydWN0IGRjY3Bfc2tiX2NiICpkY2IgPSBEQ0NQX1NLQl9DQihza2IpOwogCV9fdTggcmVzZXRfY29kZSA9IERDQ1BfUkVTRVRfQ09ERV9UT09fQlVTWTsKIApAQCAtNjkxLDcgKzQzNyw3IEBACiAJaWYgKGRjY3BfYmFkX3NlcnZpY2VfY29kZShzaywgc2VydmljZSkpIHsKIAkJcmVzZXRfY29kZSA9IERDQ1BfUkVTRVRfQ09ERV9CQURfU0VSVklDRV9DT0RFOwogCQlnb3RvIGRyb3A7Ci0gCX0KKwl9CiAJLyoKIAkgKiBUaGVyZSBhcmUgbm8gU1lOIGF0dGFja3Mgb24gSVB2NiwgeWV0Li4uCiAJICovCkBAIC03MDEsMjIgKzQ0NywyMSBAQAogCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spICYmIGluZXRfY3NrX3JlcXNrX3F1ZXVlX3lvdW5nKHNrKSA+IDEpCiAJCWdvdG8gZHJvcDsKIAotCXJlcSA9IGluZXQ2X3JlcXNrX2FsbG9jKHNrLT5za19wcm90LT5yc2tfcHJvdCk7CisJcmVxID0gaW5ldDZfcmVxc2tfYWxsb2MoJmRjY3A2X3JlcXVlc3Rfc29ja19vcHMpOwogCWlmIChyZXEgPT0gTlVMTCkKIAkJZ290byBkcm9wOwogCi0JLyogRklYTUU6IHByb2Nlc3Mgb3B0aW9ucyAqLworCWlmIChkY2NwX3BhcnNlX29wdGlvbnMoc2ssIHNrYikpCisJCWdvdG8gZHJvcF9hbmRfZnJlZTsKIAotCWRjY3Bfb3BlbnJlcV9pbml0KHJlcSwgJmRwLCBza2IpOworCWRjY3BfcmVxc2tfaW5pdChyZXEsIHNrYik7CiAKIAlpZiAoc2VjdXJpdHlfaW5ldF9jb25uX3JlcXVlc3Qoc2ssIHNrYiwgcmVxKSkKIAkJZ290byBkcm9wX2FuZF9mcmVlOwogCiAJaXJlcTYgPSBpbmV0Nl9yc2socmVxKTsKLQlpcmVxID0gaW5ldF9yc2socmVxKTsKIAlpcHY2X2FkZHJfY29weSgmaXJlcTYtPnJtdF9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOwogCWlwdjZfYWRkcl9jb3B5KCZpcmVxNi0+bG9jX2FkZHIsICZza2ItPm5oLmlwdjZoLT5kYWRkcik7Ci0JcmVxLT5yY3Zfd25kCT0gZGNjcF9mZWF0X2RlZmF1bHRfc2VxdWVuY2Vfd2luZG93OwogCWlyZXE2LT5wa3RvcHRzCT0gTlVMTDsKIAogCWlmIChpcHY2X29wdF9hY2NlcHRlZChzaywgc2tiKSB8fApAQCAtNzM1LDE0ICs0ODAsMTQgQEAKIAkvKgogCSAqIFN0ZXAgMzogUHJvY2VzcyBMSVNURU4gc3RhdGUKIAkgKgotCSAqIFNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0IENvb2tpZQorCSAqICAgU2V0IFMuSVNSLCBTLkdTUiwgUy5TV0wsIFMuU1dIIGZyb20gcGFja2V0IG9yIEluaXQgQ29va2llCiAJICoKLQkgKiBJbiBmYWN0IHdlIGRlZmVyIHNldHRpbmcgUy5HU1IsIFMuU1dMLCBTLlNXSCB0bwotCSAqIGRjY3BfY3JlYXRlX29wZW5yZXFfY2hpbGQuCisJICogICBJbiBmYWN0IHdlIGRlZmVyIHNldHRpbmcgUy5HU1IsIFMuU1dMLCBTLlNXSCB0bworCSAqICAgZGNjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZC4KIAkgKi8KIAlkcmVxID0gZGNjcF9yc2socmVxKTsKIAlkcmVxLT5kcmVxX2lzcgkgICA9IGRjYi0+ZGNjcGRfc2VxOwotCWRyZXEtPmRyZXFfaXNzCSAgID0gZGNjcF92Nl9pbml0X3NlcXVlbmNlKHNrLCBza2IpOworCWRyZXEtPmRyZXFfaXNzCSAgID0gZGNjcF92Nl9pbml0X3NlcXVlbmNlKHNrYik7CiAJZHJlcS0+ZHJlcV9zZXJ2aWNlID0gc2VydmljZTsKIAogCWlmIChkY2NwX3Y2X3NlbmRfcmVzcG9uc2Uoc2ssIHJlcSwgTlVMTCkpCkBAIC05OTIsMTQgKzczNyw0NiBAQAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tQU5LICg5ODA3MjgpCiAJICovCiAJaWYgKG5wLT5yeG9wdC5hbGwpCisJLyoKKwkgKiBGSVhNRTogQWRkIGhhbmRsaW5nIG9mIElQVjZfUEtUT1BUSU9OUyBza2IuIFNlZSB0aGUgY29tbWVudHMgYmVsb3cKKwkgKiAgICAgICAgKHdydCBpcHY2X3BrdG9waW9ucykgYW5kIG5ldC9pcHY2L3RjcF9pcHY2LmMgZm9yIGFuIGV4YW1wbGUuCisJICovCiAJCW9wdF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9PUEVOKSB7IC8qIEZhc3QgcGF0aCAqLwogCQlpZiAoZGNjcF9yY3ZfZXN0YWJsaXNoZWQoc2ssIHNrYiwgZGNjcF9oZHIoc2tiKSwgc2tiLT5sZW4pKQogCQkJZ290byByZXNldDsKKwkJaWYgKG9wdF9za2IpIHsKKwkJCS8qIFhYWCBUaGlzIGlzIHdoZXJlIHdlIHdvdWxkIGdvdG8gaXB2Nl9wa3RvcHRpb25zLiAqLworCQkJX19rZnJlZV9za2Iob3B0X3NrYik7CisJCX0KIAkJcmV0dXJuIDA7CiAJfQogCisJLyoKKwkgKiAgU3RlcCAzOiBQcm9jZXNzIExJU1RFTiBzdGF0ZQorCSAqICAgICBJZiBTLnN0YXRlID09IExJU1RFTiwKKwkgKgkgSWYgUC50eXBlID09IFJlcXVlc3Qgb3IgUCBjb250YWlucyBhIHZhbGlkIEluaXQgQ29va2llIG9wdGlvbiwKKwkgKgkgICAgICAoKiBNdXN0IHNjYW4gdGhlIHBhY2tldCdzIG9wdGlvbnMgdG8gY2hlY2sgZm9yIEluaXQKKwkgKgkJIENvb2tpZXMuICBPbmx5IEluaXQgQ29va2llcyBhcmUgcHJvY2Vzc2VkIGhlcmUsCisJICoJCSBob3dldmVyOyBvdGhlciBvcHRpb25zIGFyZSBwcm9jZXNzZWQgaW4gU3RlcCA4LiAgVGhpcworCSAqCQkgc2NhbiBuZWVkIG9ubHkgYmUgcGVyZm9ybWVkIGlmIHRoZSBlbmRwb2ludCB1c2VzIEluaXQKKwkgKgkJIENvb2tpZXMgKikKKwkgKgkgICAgICAoKiBHZW5lcmF0ZSBhIG5ldyBzb2NrZXQgYW5kIHN3aXRjaCB0byB0aGF0IHNvY2tldCAqKQorCSAqCSAgICAgIFNldCBTIDo9IG5ldyBzb2NrZXQgZm9yIHRoaXMgcG9ydCBwYWlyCisJICoJICAgICAgUy5zdGF0ZSA9IFJFU1BPTkQKKwkgKgkgICAgICBDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llcworCSAqCSAgICAgIEluaXRpYWxpemUgUy5HQVIgOj0gUy5JU1MKKwkgKgkgICAgICBTZXQgUy5JU1IsIFMuR1NSLCBTLlNXTCwgUy5TV0ggZnJvbSBwYWNrZXQgb3IgSW5pdCBDb29raWVzCisJICoJICAgICAgQ29udGludWUgd2l0aCBTLnN0YXRlID09IFJFU1BPTkQKKwkgKgkgICAgICAoKiBBIFJlc3BvbnNlIHBhY2tldCB3aWxsIGJlIGdlbmVyYXRlZCBpbiBTdGVwIDExICopCisJICoJIE90aGVyd2lzZSwKKwkgKgkgICAgICBHZW5lcmF0ZSBSZXNldChObyBDb25uZWN0aW9uKSB1bmxlc3MgUC50eXBlID09IFJlc2V0CisJICoJICAgICAgRHJvcCBwYWNrZXQgYW5kIHJldHVybgorCSAqCisJICogTk9URTogdGhlIGNoZWNrIGZvciB0aGUgcGFja2V0IHR5cGVzIGlzIGRvbmUgaW4KKwkgKgkgZGNjcF9yY3Zfc3RhdGVfcHJvY2VzcworCSAqLwogCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9MSVNURU4pIHsKIAkJc3RydWN0IHNvY2sgKm5zayA9IGRjY3BfdjZfaG5kX3JlcShzaywgc2tiKTsKIApAQCAtMTAxMCw3ICs3ODcsNyBAQAogCQkgKiBvdGhlcndpc2Ugd2UganVzdCBzaG9ydGNpcmN1aXQgdGhpcyBhbmQgY29udGludWUgd2l0aAogCQkgKiB0aGUgbmV3IHNvY2tldC4uCiAJCSAqLwotIAkJaWYgKG5zayAhPSBzaykgeworCQlpZiAobnNrICE9IHNrKSB7CiAJCQlpZiAoZGNjcF9jaGlsZF9wcm9jZXNzKHNrLCBuc2ssIHNrYikpCiAJCQkJZ290byByZXNldDsKIAkJCWlmIChvcHRfc2tiICE9IE5VTEwpCkBAIC0xMDIxLDEwICs3OTgsMTQgQEAKIAogCWlmIChkY2NwX3Jjdl9zdGF0ZV9wcm9jZXNzKHNrLCBza2IsIGRjY3BfaGRyKHNrYiksIHNrYi0+bGVuKSkKIAkJZ290byByZXNldDsKKwlpZiAob3B0X3NrYikgeworCQkvKiBYWFggVGhpcyBpcyB3aGVyZSB3ZSB3b3VsZCBnb3RvIGlwdjZfcGt0b3B0aW9ucy4gKi8KKwkJX19rZnJlZV9za2Iob3B0X3NrYik7CisJfQogCXJldHVybiAwOwogCiByZXNldDoKLQlkY2NwX3Y2X2N0bF9zZW5kX3Jlc2V0KHNrYik7CisJZGNjcF92Nl9jdGxfc2VuZF9yZXNldChzaywgc2tiKTsKIGRpc2NhcmQ6CiAJaWYgKG9wdF9za2IgIT0gTlVMTCkKIAkJX19rZnJlZV9za2Iob3B0X3NrYik7CkBAIC0xMDM3LDEyICs4MTgsMjAgQEAKIAljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoOwogCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKIAlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IG1pbl9jb3Y7CiAKLQkvKiBTdGVwIDE6IENoZWNrIGhlYWRlciBiYXNpY3M6ICovCisJLyogU3RlcCAxOiBDaGVjayBoZWFkZXIgYmFzaWNzICovCiAKIAlpZiAoZGNjcF9pbnZhbGlkX3BhY2tldChza2IpKQogCQlnb3RvIGRpc2NhcmRfaXQ7CiAKKwkvKiBTdGVwIDE6IElmIGhlYWRlciBjaGVja3N1bSBpcyBpbmNvcnJlY3QsIGRyb3AgcGFja2V0IGFuZCByZXR1cm4uICovCisJaWYgKGRjY3BfdjZfY3N1bV9maW5pc2goc2tiLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCQkJICAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpKSB7CisJCURDQ1BfV0FSTigiZHJvcHBlZCBwYWNrZXQgd2l0aCBpbnZhbGlkIGNoZWNrc3VtXG4iKTsKKwkJZ290byBkaXNjYXJkX2l0OworCX0KKwogCWRoID0gZGNjcF9oZHIoc2tiKTsKIAogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSAgPSBkY2NwX2hkcl9zZXEoc2tiKTsKQEAgLTEwNTQsNjMgKzg0MywyNDcgQEAKIAkJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSA9IGRjY3BfaGRyX2Fja19zZXEoc2tiKTsKIAogCS8qIFN0ZXAgMjoKLQkgKiAJTG9vayB1cCBmbG93IElEIGluIHRhYmxlIGFuZCBnZXQgY29ycmVzcG9uZGluZyBzb2NrZXQgKi8KKwkgKglMb29rIHVwIGZsb3cgSUQgaW4gdGFibGUgYW5kIGdldCBjb3JyZXNwb25kaW5nIHNvY2tldCAqLwogCXNrID0gX19pbmV0Nl9sb29rdXAoJmRjY3BfaGFzaGluZm8sICZza2ItPm5oLmlwdjZoLT5zYWRkciwKIAkJCSAgICBkaC0+ZGNjcGhfc3BvcnQsCiAJCQkgICAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLCBudG9ocyhkaC0+ZGNjcGhfZHBvcnQpLAogCQkJICAgIGluZXQ2X2lpZihza2IpKTsKIAkvKgogCSAqIFN0ZXAgMjoKLQkgKiAJSWYgbm8gc29ja2V0IC4uLgotCSAqCQlHZW5lcmF0ZSBSZXNldChObyBDb25uZWN0aW9uKSB1bmxlc3MgUC50eXBlID09IFJlc2V0Ci0JICoJCURyb3AgcGFja2V0IGFuZCByZXR1cm4KKwkgKglJZiBubyBzb2NrZXQgLi4uCiAJICovCi0JaWYgKHNrID09IE5VTEwpCisJaWYgKHNrID09IE5VTEwpIHsKKwkJZGNjcF9wcl9kZWJ1ZygiZmFpbGVkIHRvIGxvb2sgdXAgZmxvdyBJRCBpbiB0YWJsZSBhbmQgIgorCQkJICAgICAgImdldCBjb3JyZXNwb25kaW5nIHNvY2tldFxuIik7CiAJCWdvdG8gbm9fZGNjcF9zb2NrZXQ7CisJfQogCiAJLyoKIAkgKiBTdGVwIDI6Ci0JICogCS4uLiBvciBTLnN0YXRlID09IFRJTUVXQUlULAorCSAqCS4uLiBvciBTLnN0YXRlID09IFRJTUVXQUlULAogCSAqCQlHZW5lcmF0ZSBSZXNldChObyBDb25uZWN0aW9uKSB1bmxlc3MgUC50eXBlID09IFJlc2V0CiAJICoJCURyb3AgcGFja2V0IGFuZCByZXR1cm4KIAkgKi8KLQlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfVElNRV9XQUlUKQotCQlnb3RvIGRvX3RpbWVfd2FpdDsKKwlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfVElNRV9XQUlUKSB7CisJCWRjY3BfcHJfZGVidWcoInNrLT5za19zdGF0ZSA9PSBEQ0NQX1RJTUVfV0FJVDogZG9fdGltZV93YWl0XG4iKTsKKwkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKKwkJZ290byBub19kY2NwX3NvY2tldDsKKwl9CisKKwkvKgorCSAqIFJGQyA0MzQwLCBzZWMuIDkuMi4xOiBNaW5pbXVtIENoZWNrc3VtIENvdmVyYWdlCisJICoJbyBpZiBNaW5Dc0NvdiA9IDAsIG9ubHkgcGFja2V0cyB3aXRoIENzQ292ID0gMCBhcmUgYWNjZXB0ZWQKKwkgKglvIGlmIE1pbkNzQ292ID4gMCwgYWxzbyBhY2NlcHQgcGFja2V0cyB3aXRoIENzQ292ID49IE1pbkNzQ292CisJICovCisJbWluX2NvdiA9IGRjY3Bfc2soc2spLT5kY2Nwc19wY3JsZW47CisJaWYgKGRoLT5kY2NwaF9jc2NvdiAgJiYgIChtaW5fY292ID09IDAgfHwgZGgtPmRjY3BoX2NzY292IDwgbWluX2NvdikpICB7CisJCWRjY3BfcHJfZGVidWcoIlBhY2tldCBDc0NvdiAlZCBkb2VzIG5vdCBzYXRpc2Z5IE1pbkNzQ292ICVkXG4iLAorCQkJICAgICAgZGgtPmRjY3BoX2NzY292LCBtaW5fY292KTsKKwkJLyogRklYTUU6IHNlbmQgRGF0YSBEcm9wcGVkIG9wdGlvbiAoc2VlIGFsc28gZGNjcF92NF9yY3YpICovCisJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CisJfQogCiAJaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soc2ssIFhGUk1fUE9MSUNZX0lOLCBza2IpKQogCQlnb3RvIGRpc2NhcmRfYW5kX3JlbHNlOwogCi0JcmV0dXJuIHNrX3JlY2VpdmVfc2tiKHNrLCBza2IpID8gLTEgOiAwOworCXJldHVybiBza19yZWNlaXZlX3NrYihzaywgc2tiLCAxKSA/IC0xIDogMDsKIAogbm9fZGNjcF9zb2NrZXQ6CiAJaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAkvKgogCSAqIFN0ZXAgMjoKKwkgKglJZiBubyBzb2NrZXQgLi4uCiAJICoJCUdlbmVyYXRlIFJlc2V0KE5vIENvbm5lY3Rpb24pIHVubGVzcyBQLnR5cGUgPT0gUmVzZXQKIAkgKgkJRHJvcCBwYWNrZXQgYW5kIHJldHVybgogCSAqLwogCWlmIChkaC0+ZGNjcGhfdHlwZSAhPSBEQ0NQX1BLVF9SRVNFVCkgewogCQlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9yZXNldF9jb2RlID0KIAkJCQkJRENDUF9SRVNFVF9DT0RFX05PX0NPTk5FQ1RJT047Ci0JCWRjY3BfdjZfY3RsX3NlbmRfcmVzZXQoc2tiKTsKKwkJZGNjcF92Nl9jdGxfc2VuZF9yZXNldChzaywgc2tiKTsKIAl9CisKIGRpc2NhcmRfaXQ6Ci0KLQkvKgotCSAqCURpc2NhcmQgZnJhbWUKLQkgKi8KLQogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwogCiBkaXNjYXJkX2FuZF9yZWxzZToKIAlzb2NrX3B1dChzayk7CiAJZ290byBkaXNjYXJkX2l0OworfQogCi1kb190aW1lX3dhaXQ6Ci0JaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKLQlnb3RvIG5vX2RjY3Bfc29ja2V0Oworc3RhdGljIGludCBkY2NwX3Y2X2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkJICAgaW50IGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnVzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXVhZGRyOworCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOworCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciA9IE5VTEwsICpmaW5hbF9wID0gTlVMTCwgZmluYWw7CisJc3RydWN0IGZsb3dpIGZsOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwlpbnQgYWRkcl90eXBlOworCWludCBlcnI7CisKKwlkcC0+ZGNjcHNfcm9sZSA9IERDQ1BfUk9MRV9DTElFTlQ7CisKKwlpZiAoYWRkcl9sZW4gPCBTSU42X0xFTl9SRkMyMTMzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1c2luLT5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKworCWlmIChucC0+c25kZmxvdykgeworCQlmbC5mbDZfZmxvd2xhYmVsID0gdXNpbi0+c2luNl9mbG93aW5mbyAmIElQVjZfRkxPV0lORk9fTUFTSzsKKwkJSVA2X0VDTl9mbG93X2luaXQoZmwuZmw2X2Zsb3dsYWJlbCk7CisJCWlmIChmbC5mbDZfZmxvd2xhYmVsICYgSVBWNl9GTE9XTEFCRUxfTUFTSykgeworCQkJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsb3dsYWJlbDsKKwkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmwuZmw2X2Zsb3dsYWJlbCk7CisJCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpcHY2X2FkZHJfY29weSgmdXNpbi0+c2luNl9hZGRyLCAmZmxvd2xhYmVsLT5kc3QpOworCQkJZmw2X3NvY2tfcmVsZWFzZShmbG93bGFiZWwpOworCQl9CisJfQorCS8qCisJICogY29ubmVjdCgpIHRvIElOQUREUl9BTlkgbWVhbnMgbG9vcGJhY2sgKEJTRCdpc20pLgorCSAqLworCWlmIChpcHY2X2FkZHJfYW55KCZ1c2luLT5zaW42X2FkZHIpKQorCQl1c2luLT5zaW42X2FkZHIuczZfYWRkclsxNV0gPSAxOworCisJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnVzaW4tPnNpbjZfYWRkcik7CisKKwlpZiAoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkKKwkJcmV0dXJuIC1FTkVUVU5SRUFDSDsKKworCWlmIChhZGRyX3R5cGUgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSB7CisJCWlmIChhZGRyX2xlbiA+PSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikgJiYKKwkJICAgIHVzaW4tPnNpbjZfc2NvcGVfaWQpIHsKKwkJCS8qIElmIGludGVyZmFjZSBpcyBzZXQgd2hpbGUgYmluZGluZywgaW5kaWNlcworCQkJICogbXVzdCBjb2luY2lkZS4KKwkJCSAqLworCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYKKwkJCSAgICBzay0+c2tfYm91bmRfZGV2X2lmICE9IHVzaW4tPnNpbjZfc2NvcGVfaWQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSB1c2luLT5zaW42X3Njb3BlX2lkOworCQl9CisKKwkJLyogQ29ubmVjdCB0byBsaW5rLWxvY2FsIGFkZHJlc3MgcmVxdWlyZXMgYW4gaW50ZXJmYWNlICovCisJCWlmICghc2stPnNrX2JvdW5kX2Rldl9pZikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlwdjZfYWRkcl9jb3B5KCZucC0+ZGFkZHIsICZ1c2luLT5zaW42X2FkZHIpOworCW5wLT5mbG93X2xhYmVsID0gZmwuZmw2X2Zsb3dsYWJlbDsKKworCS8qCisJICogRENDUCBvdmVyIElQdjQKKwkgKi8KKwlpZiAoYWRkcl90eXBlID09IElQVjZfQUREUl9NQVBQRUQpIHsKKwkJdTMyIGV4dGhkcmxlbiA9IGljc2stPmljc2tfZXh0X2hkcl9sZW47CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisKKwkJU09DS19ERUJVRyhzaywgImNvbm5lY3Q6IGlwdjQgbWFwcGVkXG4iKTsKKworCQlpZiAoX19pcHY2X29ubHlfc29jayhzaykpCisJCQlyZXR1cm4gLUVORVRVTlJFQUNIOworCisJCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2luLnNpbl9wb3J0ID0gdXNpbi0+c2luNl9wb3J0OworCQlzaW4uc2luX2FkZHIuc19hZGRyID0gdXNpbi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXTsKKworCQlpY3NrLT5pY3NrX2FmX29wcyA9ICZkY2NwX2lwdjZfbWFwcGVkOworCQlzay0+c2tfYmFja2xvZ19yY3YgPSBkY2NwX3Y0X2RvX3JjdjsKKworCQllcnIgPSBkY2NwX3Y0X2Nvbm5lY3Qoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSk7CisJCWlmIChlcnIpIHsKKwkJCWljc2stPmljc2tfZXh0X2hkcl9sZW4gPSBleHRoZHJsZW47CisJCQlpY3NrLT5pY3NrX2FmX29wcyA9ICZkY2NwX2lwdjZfYWZfb3BzOworCQkJc2stPnNrX2JhY2tsb2dfcmN2ID0gZGNjcF92Nl9kb19yY3Y7CisJCQlnb3RvIGZhaWx1cmU7CisJCX0gZWxzZSB7CisJCQlpcHY2X2FkZHJfc2V0KCZucC0+c2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMEZGRkYpLAorCQkJCSAgICAgIGluZXQtPnNhZGRyKTsKKwkJCWlwdjZfYWRkcl9zZXQoJm5wLT5yY3Zfc2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMEZGRkYpLAorCQkJCSAgICAgIGluZXQtPnJjdl9zYWRkcik7CisJCX0KKworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICghaXB2Nl9hZGRyX2FueSgmbnAtPnJjdl9zYWRkcikpCisJCXNhZGRyID0gJm5wLT5yY3Zfc2FkZHI7CisKKwlmbC5wcm90byA9IElQUFJPVE9fRENDUDsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJm5wLT5kYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsIHNhZGRyID8gc2FkZHIgOiAmbnAtPnNhZGRyKTsKKwlmbC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCWZsLmZsX2lwX2Rwb3J0ID0gdXNpbi0+c2luNl9wb3J0OworCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldC0+c3BvcnQ7CisJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgJmZsKTsKKworCWlmIChucC0+b3B0ICE9IE5VTEwgJiYgbnAtPm9wdC0+c3JjcnQgIT0gTlVMTCkgeworCQljb25zdCBzdHJ1Y3QgcnQwX2hkciAqcnQwID0gKHN0cnVjdCBydDBfaGRyICopbnAtPm9wdC0+c3JjcnQ7CisKKwkJaXB2Nl9hZGRyX2NvcHkoJmZpbmFsLCAmZmwuZmw2X2RzdCk7CisJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBydDAtPmFkZHIpOworCQlmaW5hbF9wID0gJmZpbmFsOworCX0KKworCWVyciA9IGlwNl9kc3RfbG9va3VwKHNrLCAmZHN0LCAmZmwpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbHVyZTsKKworCWlmIChmaW5hbF9wKQorCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgZmluYWxfcCk7CisKKwllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIHNrLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsdXJlOworCisJaWYgKHNhZGRyID09IE5VTEwpIHsKKwkJc2FkZHIgPSAmZmwuZmw2X3NyYzsKKwkJaXB2Nl9hZGRyX2NvcHkoJm5wLT5yY3Zfc2FkZHIsIHNhZGRyKTsKKwl9CisKKwkvKiBzZXQgdGhlIHNvdXJjZSBhZGRyZXNzICovCisJaXB2Nl9hZGRyX2NvcHkoJm5wLT5zYWRkciwgc2FkZHIpOworCWluZXQtPnJjdl9zYWRkciA9IExPT1BCQUNLNF9JUFY2OworCisJX19pcDZfZHN0X3N0b3JlKHNrLCBkc3QsIE5VTEwsIE5VTEwpOworCisJaWNzay0+aWNza19leHRfaGRyX2xlbiA9IDA7CisJaWYgKG5wLT5vcHQgIT0gTlVMTCkKKwkJaWNzay0+aWNza19leHRfaGRyX2xlbiA9IChucC0+b3B0LT5vcHRfZmxlbiArCisJCQkJCSAgbnAtPm9wdC0+b3B0X25mbGVuKTsKKworCWluZXQtPmRwb3J0ID0gdXNpbi0+c2luNl9wb3J0OworCisJZGNjcF9zZXRfc3RhdGUoc2ssIERDQ1BfUkVRVUVTVElORyk7CisJZXJyID0gaW5ldDZfaGFzaF9jb25uZWN0KCZkY2NwX2RlYXRoX3Jvdywgc2spOworCWlmIChlcnIpCisJCWdvdG8gbGF0ZV9mYWlsdXJlOworCisJZHAtPmRjY3BzX2lzcyA9IHNlY3VyZV9kY2NwdjZfc2VxdWVuY2VfbnVtYmVyKG5wLT5zYWRkci5zNl9hZGRyMzIsCisJCQkJCQkgICAgICBucC0+ZGFkZHIuczZfYWRkcjMyLAorCQkJCQkJICAgICAgaW5ldC0+c3BvcnQsIGluZXQtPmRwb3J0KTsKKwllcnIgPSBkY2NwX2Nvbm5lY3Qoc2spOworCWlmIChlcnIpCisJCWdvdG8gbGF0ZV9mYWlsdXJlOworCisJcmV0dXJuIDA7CisKK2xhdGVfZmFpbHVyZToKKwlkY2NwX3NldF9zdGF0ZShzaywgRENDUF9DTE9TRUQpOworCV9fc2tfZHN0X3Jlc2V0KHNrKTsKK2ZhaWx1cmU6CisJaW5ldC0+ZHBvcnQgPSAwOworCXNrLT5za19yb3V0ZV9jYXBzID0gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrX2FmX29wcyBkY2NwX2lwdjZfYWZfb3BzID0gewpAQCAtMTE3Myw2ICsxMTQ2LDEwIEBACiAJcmV0dXJuIGluZXQ2X2Rlc3Ryb3lfc29jayhzayk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdGltZXdhaXRfc29ja19vcHMgZGNjcDZfdGltZXdhaXRfc29ja19vcHMgPSB7CisJLnR3c2tfb2JqX3NpemUJPSBzaXplb2Yoc3RydWN0IGRjY3A2X3RpbWV3YWl0X3NvY2spLAorfTsKKwogc3RhdGljIHN0cnVjdCBwcm90byBkY2NwX3Y2X3Byb3QgPSB7CiAJLm5hbWUJCSAgID0gIkRDQ1B2NiIsCiAJLm93bmVyCQkgICA9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvbWluaXNvY2tzLmMgYi9uZXQvZGNjcC9taW5pc29ja3MuYwppbmRleCA5MDQ1NDM4Li42NjU2YmI0IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9taW5pc29ja3MuYworKysgYi9uZXQvZGNjcC9taW5pc29ja3MuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9kY2NwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KIApAQCAtMzEsOCArMzIsNyBAQAogCS50d190aW1lcgk9IFRJTUVSX0lOSVRJQUxJWkVSKGluZXRfdHdkcl9oYW5nbWFuLCAwLAogCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpJmRjY3BfZGVhdGhfcm93KSwKIAkudHdraWxsX3dvcmsJPSBfX1dPUktfSU5JVElBTElaRVIoZGNjcF9kZWF0aF9yb3cudHdraWxsX3dvcmssCi0JCQkJCSAgICAgaW5ldF90d2RyX3R3a2lsbF93b3JrLAotCQkJCQkgICAgICZkY2NwX2RlYXRoX3JvdyksCisJCQkJCSAgICAgaW5ldF90d2RyX3R3a2lsbF93b3JrKSwKIC8qIFNob3J0LXRpbWUgdGltZXdhaXQgY2FsZW5kYXIgKi8KIAogCS50d2NhbF9oYW5kCT0gLTEsCkBAIC04Myw4ICs4Myw3IEBACiAJCSAqIHNvY2tldCB1cC4gIFdlJ3ZlIGdvdCBiaWdnZXIgcHJvYmxlbXMgdGhhbgogCQkgKiBub24tZ3JhY2VmdWwgc29ja2V0IGNsb3NpbmdzLgogCQkgKi8KLQkJTElNSVRfTkVUREVCVUcoS0VSTl9JTkZPICJEQ0NQOiB0aW1lIHdhaXQgYnVja2V0ICIKLQkJCQkJICJ0YWJsZSBvdmVyZmxvd1xuIik7CisJCURDQ1BfV0FSTigidGltZSB3YWl0IGJ1Y2tldCB0YWJsZSBvdmVyZmxvd1xuIik7CiAJfQogCiAJZGNjcF9kb25lKHNrKTsKQEAgLTk3LDggKzk2LDggQEAKIAkvKgogCSAqIFN0ZXAgMzogUHJvY2VzcyBMSVNURU4gc3RhdGUKIAkgKgotCSAqIC8vIEdlbmVyYXRlIGEgbmV3IHNvY2tldCBhbmQgc3dpdGNoIHRvIHRoYXQgc29ja2V0Ci0JICogU2V0IFMgOj0gbmV3IHNvY2tldCBmb3IgdGhpcyBwb3J0IHBhaXIKKwkgKiAgICgqIEdlbmVyYXRlIGEgbmV3IHNvY2tldCBhbmQgc3dpdGNoIHRvIHRoYXQgc29ja2V0ICopCisJICogICBTZXQgUyA6PSBuZXcgc29ja2V0IGZvciB0aGlzIHBvcnQgcGFpcgogCSAqLwogCXN0cnVjdCBzb2NrICpuZXdzayA9IGluZXRfY3NrX2Nsb25lKHNrLCByZXEsIEdGUF9BVE9NSUMpOwogCkBAIC0xNDcsOSArMTQ2LDkgQEAKIAkJLyoKIAkJICogU3RlcCAzOiBQcm9jZXNzIExJU1RFTiBzdGF0ZQogCQkgKgotCQkgKglDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llCi0JCSAqCVNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0Ci0JCSAqCUNvb2tpZQorCQkgKiAgICBDaG9vc2UgUy5JU1MgKGluaXRpYWwgc2Vxbm8pIG9yIHNldCBmcm9tIEluaXQgQ29va2llcworCQkgKiAgICBJbml0aWFsaXplIFMuR0FSIDo9IFMuSVNTCisJCSAqICAgIFNldCBTLklTUiwgUy5HU1IsIFMuU1dMLCBTLlNXSCBmcm9tIHBhY2tldCBvciBJbml0IENvb2tpZXMKIAkJICovCiAKIAkJLyogU2VlIGRjY3BfdjRfY29ubl9yZXF1ZXN0ICovCkBAIC0xODMsNyArMTgyLDcgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZCk7CiAKLS8qIAorLyoKICAqIFByb2Nlc3MgYW4gaW5jb21pbmcgcGFja2V0IGZvciBSRVNQT05EIHNvY2tldHMgcmVwcmVzZW50ZWQKICAqIGFzIGFuIHJlcXVlc3Rfc29jay4KICAqLwpAQCAtMTk1LDE1ICsxOTQsMTcgQEAKIAogCS8qIENoZWNrIGZvciByZXRyYW5zbWl0dGVkIFJFUVVFU1QgKi8KIAlpZiAoZGNjcF9oZHIoc2tiKS0+ZGNjcGhfdHlwZSA9PSBEQ0NQX1BLVF9SRVFVRVNUKSB7Ci0JCWlmIChhZnRlcjQ4KERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSwKLQkJCSAgICBkY2NwX3JzayhyZXEpLT5kcmVxX2lzcikpIHsKLQkJCXN0cnVjdCBkY2NwX3JlcXVlc3Rfc29jayAqZHJlcSA9IGRjY3BfcnNrKHJlcSk7CisJCXN0cnVjdCBkY2NwX3JlcXVlc3Rfc29jayAqZHJlcSA9IGRjY3BfcnNrKHJlcSk7CiAKKwkJaWYgKGFmdGVyNDgoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfc2VxLCBkcmVxLT5kcmVxX2lzcikpIHsKIAkJCWRjY3BfcHJfZGVidWcoIlJldHJhbnNtaXR0ZWQgUkVRVUVTVFxuIik7Ci0JCQkvKiBTZW5kIGFub3RoZXIgUkVTUE9OU0UgcGFja2V0ICovCi0JCQlkY2NwX3NldF9zZXFubygmZHJlcS0+ZHJlcV9pc3MsIGRyZXEtPmRyZXFfaXNzICsgMSk7Ci0JCQlkY2NwX3NldF9zZXFubygmZHJlcS0+ZHJlcV9pc3IsCi0JCQkJICAgICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSk7CisJCQlkcmVxLT5kcmVxX2lzciA9IERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcTsKKwkJCS8qCisJCQkgKiBTZW5kIGFub3RoZXIgUkVTUE9OU0UgcGFja2V0CisJCQkgKiBUbyBwcm90ZWN0IGFnYWluc3QgUmVxdWVzdCBmbG9vZHMsIGluY3JlbWVudCByZXRyYW5zCisJCQkgKiBjb3VudGVyIChiYWNrb2ZmLCBtb25pdG9yZWQgYnkgZGNjcF9yZXNwb25zZV90aW1lcikuCisJCQkgKi8KKwkJCXJlcS0+cmV0cmFucysrOwogCQkJcmVxLT5yc2tfb3BzLT5ydHhfc3luX2FjayhzaywgcmVxLCBOVUxMKTsKIAkJfQogCQkvKiBOZXR3b3JrIER1cGxpY2F0ZSwgZGlzY2FyZCBwYWNrZXQgKi8KQEAgLTI0Myw3ICsyNDQsNyBAQAogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3Jlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfVE9PX0JVU1k7CiBkcm9wOgogCWlmIChkY2NwX2hkcihza2IpLT5kY2NwaF90eXBlICE9IERDQ1BfUEtUX1JFU0VUKQotCQlyZXEtPnJza19vcHMtPnNlbmRfcmVzZXQoc2tiKTsKKwkJcmVxLT5yc2tfb3BzLT5zZW5kX3Jlc2V0KHNrLCBza2IpOwogCiAJaW5ldF9jc2tfcmVxc2tfcXVldWVfZHJvcChzaywgcmVxLCBwcmV2KTsKIAlnb3RvIG91dDsKQEAgLTI4MywzICsyODQsMTkgQEAKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9jaGlsZF9wcm9jZXNzKTsKKwordm9pZCBkY2NwX3JlcXNrX3NlbmRfYWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJzaykKK3sKKwlEQ0NQX0JVRygiRENDUC1BQ0sgcGFja2V0cyBhcmUgbmV2ZXIgc2VudCBpbiBMSVNURU4vUkVTUE9ORCBzdGF0ZSIpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3JlcXNrX3NlbmRfYWNrKTsKKwordm9pZCBkY2NwX3JlcXNrX2luaXQoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWluZXRfcnNrKHJlcSktPnJtdF9wb3J0ID0gZGNjcF9oZHIoc2tiKS0+ZGNjcGhfc3BvcnQ7CisJaW5ldF9yc2socmVxKS0+YWNrZWQJPSAwOworCXJlcS0+cmN2X3duZAkJPSBzeXNjdGxfZGNjcF9mZWF0X3NlcXVlbmNlX3dpbmRvdzsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9yZXFza19pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL29wdGlvbnMuYyBiL25ldC9kY2NwL29wdGlvbnMuYwppbmRleCAwN2EzNDY5Li5jMDNiYTYxIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9vcHRpb25zLmMKKysrIGIvbmV0L2RjY3Avb3B0aW9ucy5jCkBAIC0yMiwyMyArMjIsMjMgQEAKICNpbmNsdWRlICJkY2NwLmgiCiAjaW5jbHVkZSAiZmVhdC5oIgogCi1pbnQgZGNjcF9mZWF0X2RlZmF1bHRfc2VxdWVuY2Vfd2luZG93ID0gRENDUEZfSU5JVElBTF9TRVFVRU5DRV9XSU5ET1c7Ci1pbnQgZGNjcF9mZWF0X2RlZmF1bHRfcnhfY2NpZAkgICAgICA9IERDQ1BGX0lOSVRJQUxfQ0NJRDsKLWludCBkY2NwX2ZlYXRfZGVmYXVsdF90eF9jY2lkCSAgICAgID0gRENDUEZfSU5JVElBTF9DQ0lEOwotaW50IGRjY3BfZmVhdF9kZWZhdWx0X2Fja19yYXRpbwkgICAgICA9IERDQ1BGX0lOSVRJQUxfQUNLX1JBVElPOwotaW50IGRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfYWNrX3ZlY3RvciA9IERDQ1BGX0lOSVRJQUxfU0VORF9BQ0tfVkVDVE9SOwotaW50IGRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfbmRwX2NvdW50ICA9IERDQ1BGX0lOSVRJQUxfU0VORF9ORFBfQ09VTlQ7CitpbnQgc3lzY3RsX2RjY3BfZmVhdF9zZXF1ZW5jZV93aW5kb3cgPSBEQ0NQRl9JTklUSUFMX1NFUVVFTkNFX1dJTkRPVzsKK2ludCBzeXNjdGxfZGNjcF9mZWF0X3J4X2NjaWQJICAgICAgPSBEQ0NQRl9JTklUSUFMX0NDSUQ7CitpbnQgc3lzY3RsX2RjY3BfZmVhdF90eF9jY2lkCSAgICAgID0gRENDUEZfSU5JVElBTF9DQ0lEOworaW50IHN5c2N0bF9kY2NwX2ZlYXRfYWNrX3JhdGlvCSAgICAgID0gRENDUEZfSU5JVElBTF9BQ0tfUkFUSU87CitpbnQgc3lzY3RsX2RjY3BfZmVhdF9zZW5kX2Fja192ZWN0b3IgPSBEQ0NQRl9JTklUSUFMX1NFTkRfQUNLX1ZFQ1RPUjsKK2ludCBzeXNjdGxfZGNjcF9mZWF0X3NlbmRfbmRwX2NvdW50ICA9IERDQ1BGX0lOSVRJQUxfU0VORF9ORFBfQ09VTlQ7CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfZmVhdF9kZWZhdWx0X3NlcXVlbmNlX3dpbmRvdyk7CitFWFBPUlRfU1lNQk9MX0dQTChzeXNjdGxfZGNjcF9mZWF0X3NlcXVlbmNlX3dpbmRvdyk7CiAKIHZvaWQgZGNjcF9taW5pc29ja19pbml0KHN0cnVjdCBkY2NwX21pbmlzb2NrICpkbXNrKQogewotCWRtc2stPmRjY3Btc19zZXF1ZW5jZV93aW5kb3cgPSBkY2NwX2ZlYXRfZGVmYXVsdF9zZXF1ZW5jZV93aW5kb3c7Ci0JZG1zay0+ZGNjcG1zX3J4X2NjaWQJICAgICA9IGRjY3BfZmVhdF9kZWZhdWx0X3J4X2NjaWQ7Ci0JZG1zay0+ZGNjcG1zX3R4X2NjaWQJICAgICA9IGRjY3BfZmVhdF9kZWZhdWx0X3R4X2NjaWQ7Ci0JZG1zay0+ZGNjcG1zX2Fja19yYXRpbwkgICAgID0gZGNjcF9mZWF0X2RlZmF1bHRfYWNrX3JhdGlvOwotCWRtc2stPmRjY3Btc19zZW5kX2Fja192ZWN0b3IgPSBkY2NwX2ZlYXRfZGVmYXVsdF9zZW5kX2Fja192ZWN0b3I7Ci0JZG1zay0+ZGNjcG1zX3NlbmRfbmRwX2NvdW50ICA9IGRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfbmRwX2NvdW50OworCWRtc2stPmRjY3Btc19zZXF1ZW5jZV93aW5kb3cgPSBzeXNjdGxfZGNjcF9mZWF0X3NlcXVlbmNlX3dpbmRvdzsKKwlkbXNrLT5kY2NwbXNfcnhfY2NpZAkgICAgID0gc3lzY3RsX2RjY3BfZmVhdF9yeF9jY2lkOworCWRtc2stPmRjY3Btc190eF9jY2lkCSAgICAgPSBzeXNjdGxfZGNjcF9mZWF0X3R4X2NjaWQ7CisJZG1zay0+ZGNjcG1zX2Fja19yYXRpbwkgICAgID0gc3lzY3RsX2RjY3BfZmVhdF9hY2tfcmF0aW87CisJZG1zay0+ZGNjcG1zX3NlbmRfYWNrX3ZlY3RvciA9IHN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9hY2tfdmVjdG9yOworCWRtc2stPmRjY3Btc19zZW5kX25kcF9jb3VudCAgPSBzeXNjdGxfZGNjcF9mZWF0X3NlbmRfbmRwX2NvdW50OwogfQogCiBzdGF0aWMgdTMyIGRjY3BfZGVjb2RlX3ZhbHVlX3Zhcihjb25zdCB1bnNpZ25lZCBjaGFyICpiZiwgY29uc3QgdTggbGVuKQpAQCAtNjAsMTIgKzYwLDkgQEAKIGludCBkY2NwX3BhcnNlX29wdGlvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7Ci0jaWZkZWYgQ09ORklHX0lQX0RDQ1BfREVCVUcKLQljb25zdCBjaGFyICpkZWJ1Z19wcmVmaXggPSBkcC0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfQ0xJRU5UID8KLQkJCQkJIkNMSUVOVCByeCBvcHQ6ICIgOiAic2VydmVyIHJ4IG9wdDogIjsKLSNlbmRpZgogCWNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGggPSBkY2NwX2hkcihza2IpOwogCWNvbnN0IHU4IHBrdF90eXBlID0gRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZTsKKwl1NjQgYWNrbm8gPSBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9hY2tfc2VxOwogCXVuc2lnbmVkIGNoYXIgKm9wdGlvbnMgPSAodW5zaWduZWQgY2hhciAqKWRoICsgZGNjcF9oZHJfbGVuKHNrYik7CiAJdW5zaWduZWQgY2hhciAqb3B0X3B0ciA9IG9wdGlvbnM7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqb3B0X2VuZCA9ICh1bnNpZ25lZCBjaGFyICopZGggKwpAQCAtMTE5LDcgKzExNiw3IEBACiAJCQkJZ290byBvdXRfaW52YWxpZF9vcHRpb247CiAKIAkJCW9wdF9yZWN2LT5kY2Nwb3JfbmRwID0gZGNjcF9kZWNvZGVfdmFsdWVfdmFyKHZhbHVlLCBsZW4pOwotCQkJZGNjcF9wcl9kZWJ1ZygiJXNORFAgY291bnQ9JWRcbiIsIGRlYnVnX3ByZWZpeCwKKwkJCWRjY3BfcHJfZGVidWcoIiVzIHJ4IG9wdDogTkRQIGNvdW50PSVkXG4iLCBkY2NwX3JvbGUoc2spLAogCQkJCSAgICAgIG9wdF9yZWN2LT5kY2Nwb3JfbmRwKTsKIAkJCWJyZWFrOwogCQljYXNlIERDQ1BPX0NIQU5HRV9MOgpAQCAtMTUzLDcgKzE1MCw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWlmIChkY2NwX21zayhzayktPmRjY3Btc19zZW5kX2Fja192ZWN0b3IgJiYKLQkJCSAgICBkY2NwX2Fja3ZlY19wYXJzZShzaywgc2tiLCBvcHQsIHZhbHVlLCBsZW4pKQorCQkJICAgIGRjY3BfYWNrdmVjX3BhcnNlKHNrLCBza2IsICZhY2tubywgb3B0LCB2YWx1ZSwgbGVuKSkKIAkJCQlnb3RvIG91dF9pbnZhbGlkX29wdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIERDQ1BPX1RJTUVTVEFNUDoKQEAgLTE2NSw4ICsxNjIsOCBAQAogCQkJZHAtPmRjY3BzX3RpbWVzdGFtcF9lY2hvID0gb3B0X3JlY3YtPmRjY3Bvcl90aW1lc3RhbXA7CiAJCQlkY2NwX3RpbWVzdGFtcChzaywgJmRwLT5kY2Nwc190aW1lc3RhbXBfdGltZSk7CiAKLQkJCWRjY3BfcHJfZGVidWcoIiVzVElNRVNUQU1QPSV1LCBhY2tubz0lbGx1XG4iLAotCQkJCSAgICAgIGRlYnVnX3ByZWZpeCwgb3B0X3JlY3YtPmRjY3Bvcl90aW1lc3RhbXAsCisJCQlkY2NwX3ByX2RlYnVnKCIlcyByeCBvcHQ6IFRJTUVTVEFNUD0ldSwgYWNrbm89JWxsdVxuIiwKKwkJCQkgICAgICBkY2NwX3JvbGUoc2spLCBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcCwKIAkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQogCQkJCSAgICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEpOwogCQkJYnJlYWs7CkBAIC0xNzYsOCArMTczLDggQEAKIAogCQkJb3B0X3JlY3YtPmRjY3Bvcl90aW1lc3RhbXBfZWNobyA9IG50b2hsKCooX19iZTMyICopdmFsdWUpOwogCi0JCQlkY2NwX3ByX2RlYnVnKCIlc1RJTUVTVEFNUF9FQ0hPPSV1LCBsZW49JWQsIGFja25vPSVsbHUsICIsCi0JCQkJICAgICAgZGVidWdfcHJlZml4LAorCQkJZGNjcF9wcl9kZWJ1ZygiJXMgcnggb3B0OiBUSU1FU1RBTVBfRUNITz0ldSwgbGVuPSVkLCAiCisJCQkJICAgICAgImFja25vPSVsbHUsICIsICBkY2NwX3JvbGUoc2spLAogCQkJCSAgICAgIG9wdF9yZWN2LT5kY2Nwb3JfdGltZXN0YW1wX2VjaG8sCiAJCQkJICAgICAgbGVuICsgMiwKIAkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQpAQCAtMjExLDExICsyMDgsMTEgQEAKIAkJCWlmIChlbGFwc2VkX3RpbWUgPiBvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSkKIAkJCQlvcHRfcmVjdi0+ZGNjcG9yX2VsYXBzZWRfdGltZSA9IGVsYXBzZWRfdGltZTsKIAotCQkJZGNjcF9wcl9kZWJ1ZygiJXNFTEFQU0VEX1RJTUU9JWRcbiIsIGRlYnVnX3ByZWZpeCwKLQkJCQkgICAgICBlbGFwc2VkX3RpbWUpOworCQkJZGNjcF9wcl9kZWJ1ZygiJXMgcnggb3B0OiBFTEFQU0VEX1RJTUU9JWRcbiIsCisJCQkJICAgICAgZGNjcF9yb2xlKHNrKSwgZWxhcHNlZF90aW1lKTsKIAkJCWJyZWFrOwogCQkJLyoKLQkJCSAqIEZyb20gZHJhZnQtaWV0Zi1kY2NwLXNwZWMtMTEudHh0OgorCQkJICogRnJvbSBSRkMgNDM0MCwgc2VjLiAxMC4zOgogCQkJICoKIAkJCSAqCU9wdGlvbiBudW1iZXJzIDEyOCB0aHJvdWdoIDE5MSBhcmUgZm9yCiAJCQkgKglvcHRpb25zIHNlbnQgZnJvbSB0aGUgSEMtU2VuZGVyIHRvIHRoZQpAQCAtMjQyLDkgKzIzOSw4IEBACiAJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJfaW5mbygiRENDUCglcCk6IG9wdGlvbiAlZChsZW49JWQpIG5vdCAiCi0JCQkJImltcGxlbWVudGVkLCBpZ25vcmluZ1xuIiwKLQkJCQlzaywgb3B0LCBsZW4pOworCQkJRENDUF9DUklUKCJEQ0NQKCVwKTogb3B0aW9uICVkKGxlbj0lZCkgbm90ICIKKwkJCQkgICJpbXBsZW1lbnRlZCwgaWdub3JpbmciLCBzaywgb3B0LCBsZW4pOwogCQkJYnJlYWs7CiAJICAgICAgICB9CiAKQEAgLTI2MSw3ICsyNTcsNyBAQAogb3V0X2ludmFsaWRfb3B0aW9uOgogCURDQ1BfSU5DX1NUQVRTX0JIKERDQ1BfTUlCX0lOVkFMSURPUFQpOwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3Jlc2V0X2NvZGUgPSBEQ0NQX1JFU0VUX0NPREVfT1BUSU9OX0VSUk9SOwotCXByX2luZm8oIkRDQ1AoJXApOiBpbnZhbGlkIG9wdGlvbiAlZCwgbGVuPSVkXG4iLCBzaywgb3B0LCBsZW4pOworCURDQ1BfV0FSTigiRENDUCglcCk6IGludmFsaWQgb3B0aW9uICVkLCBsZW49JWQiLCBzaywgb3B0LCBsZW4pOwogCXJldHVybiAtMTsKIH0KIApAQCAtNDUxLDggKzQ0Nyw3IEBACiAJdTggKnRvOwogCiAJaWYgKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX29wdF9sZW4gKyBsZW4gKyAzID4gRENDUF9NQVhfT1BUX0xFTikgewotCQlMSU1JVF9ORVRERUJVRyhLRVJOX0lORk8gIkRDQ1A6IHBhY2tldCB0b28gc21hbGwiCi0JCQkgICAgICAgIiB0byBpbnNlcnQgZmVhdHVyZSAlZCBvcHRpb24hXG4iLCBmZWF0KTsKKwkJRENDUF9XQVJOKCJwYWNrZXQgdG9vIHNtYWxsIGZvciBmZWF0dXJlICVkIG9wdGlvbiFcbiIsIGZlYXQpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC00NjUsOCArNDYwLDEwIEBACiAKIAlpZiAobGVuKQogCQltZW1jcHkodG8sIHZhbCwgbGVuKTsKLQlkY2NwX3ByX2RlYnVnKCJvcHRpb24gJWQgZmVhdCAlZCBsZW4gJWRcbiIsIHR5cGUsIGZlYXQsIGxlbik7CiAKKwlkY2NwX3ByX2RlYnVnKCIlcyglcyAoJWQpLCAuLi4pLCBsZW5ndGggJWRcbiIsCisJCSAgICAgIGRjY3BfZmVhdF90eXBlbmFtZSh0eXBlKSwKKwkJICAgICAgZGNjcF9mZWF0X25hbWUoZmVhdCksIGZlYXQsIGxlbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU2MCwxMSArNTU3LDYgQEAKIAkJCXJldHVybiAtMTsKIAkJZHAtPmRjY3BzX2hjX3J4X2luc2VydF9vcHRpb25zID0gMDsKIAl9Ci0JaWYgKGRwLT5kY2Nwc19oY190eF9pbnNlcnRfb3B0aW9ucykgewotCQlpZiAoY2NpZF9oY190eF9pbnNlcnRfb3B0aW9ucyhkcC0+ZGNjcHNfaGNfdHhfY2NpZCwgc2ssIHNrYikpCi0JCQlyZXR1cm4gLTE7Ci0JCWRwLT5kY2Nwc19oY190eF9pbnNlcnRfb3B0aW9ucyA9IDA7Ci0JfQogCiAJLyogRmVhdHVyZSBuZWdvdGlhdGlvbiAqLwogCS8qIERhdGEgcGFja2V0cyBjYW4ndCBkbyBmZWF0IG5lZ290aWF0aW9uICovCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9vdXRwdXQuYyBiL25ldC9kY2NwL291dHB1dC5jCmluZGV4IDcxMDJlM2EuLjgyNDU2OTYgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL291dHB1dC5jCisrKyBiL25ldC9kY2NwL291dHB1dC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICBuZXQvZGNjcC9vdXRwdXQuYwotICogCisgKgogICogIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEQ0NQIHByb3RvY29sCiAgKiAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAgKgpAQCAtODgsMTYgKzg4LDE1IEBACiAJCQlyZXR1cm4gLUVQUk9UTzsKIAkJfQogCQkKLQkJc2tiLT5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgZGNjcF9oZWFkZXJfc2l6ZSk7Ci0JCWRoID0gZGNjcF9oZHIoc2tiKTsKIAogCQkvKiBCdWlsZCBEQ0NQIGhlYWRlciBhbmQgY2hlY2tzdW0gaXQuICovCi0JCW1lbXNldChkaCwgMCwgZGNjcF9oZWFkZXJfc2l6ZSk7CisJCWRoID0gZGNjcF96ZXJvZWRfaGRyKHNrYiwgZGNjcF9oZWFkZXJfc2l6ZSk7CiAJCWRoLT5kY2NwaF90eXBlCT0gZGNiLT5kY2NwZF90eXBlOwogCQlkaC0+ZGNjcGhfc3BvcnQJPSBpbmV0LT5zcG9ydDsKIAkJZGgtPmRjY3BoX2Rwb3J0CT0gaW5ldC0+ZHBvcnQ7CiAJCWRoLT5kY2NwaF9kb2ZmCT0gKGRjY3BfaGVhZGVyX3NpemUgKyBkY2ItPmRjY3BkX29wdF9sZW4pIC8gNDsKIAkJZGgtPmRjY3BoX2NjdmFsCT0gZGNiLT5kY2NwZF9jY3ZhbDsKKwkJZGgtPmRjY3BoX2NzY292ID0gZHAtPmRjY3BzX3Bjc2xlbjsKIAkJLyogWFhYIEZvciBub3cgd2UncmUgdXNpbmcgb25seSA0OCBiaXRzIHNlcXVlbmNlIG51bWJlcnMgKi8KIAkJZGgtPmRjY3BoX3gJPSAxOwogCkBAIC0xMTcsNyArMTE2LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWNzay0+aWNza19hZl9vcHMtPnNlbmRfY2hlY2soc2ssIHNrYi0+bGVuLCBza2IpOworCQlpY3NrLT5pY3NrX2FmX29wcy0+c2VuZF9jaGVjayhzaywgMCwgc2tiKTsKIAogCQlpZiAoc2V0X2FjaykKIAkJCWRjY3BfZXZlbnRfYWNrX3NlbnQoc2spOwpAQCAtMTI1LDE3ICsxMjQsOCBAQAogCQlEQ0NQX0lOQ19TVEFUUyhEQ0NQX01JQl9PVVRTRUdTKTsKIAogCQltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwotCQllcnIgPSBpY3NrLT5pY3NrX2FmX29wcy0+cXVldWVfeG1pdChza2IsIDApOwotCQlpZiAoZXJyIDw9IDApCi0JCQlyZXR1cm4gZXJyOwotCi0JCS8qIE5FVF9YTUlUX0NOIGlzIHNwZWNpYWwuIEl0IGRvZXMgbm90IGd1YXJhbnRlZSwKLQkJICogdGhhdCB0aGlzIHBhY2tldCBpcyBsb3N0LiBJdCB0ZWxscyB0aGF0IGRldmljZQotCQkgKiBpcyBhYm91dCB0byBzdGFydCB0byBkcm9wIHBhY2tldHMgb3IgYWxyZWFkeQotCQkgKiBkcm9wcyBzb21lIHBhY2tldHMgb2YgdGhlIHNhbWUgcHJpb3JpdHkgYW5kCi0JCSAqIGludm9rZXMgdXMgdG8gc2VuZCBsZXNzIGFnZ3Jlc3NpdmVseS4KLQkJICovCi0JCXJldHVybiBlcnIgPT0gTkVUX1hNSVRfQ04gPyAwIDogZXJyOworCQllcnIgPSBpY3NrLT5pY3NrX2FmX29wcy0+cXVldWVfeG1pdChza2IsIHNrLCAwKTsKKwkJcmV0dXJuIG5ldF94bWl0X2V2YWwoZXJyKTsKIAl9CiAJcmV0dXJuIC1FTk9CVUZTOwogfQpAQCAtMTg1LDE0ICsxNzUsMTIgQEAKIC8qKgogICogZGNjcF93YWl0X2Zvcl9jY2lkIC0gV2FpdCBmb3IgY2NpZCB0byB0ZWxsIHVzIHdlIGNhbiBzZW5kIGEgcGFja2V0CiAgKiBAc2s6IHNvY2tldCB0byB3YWl0IGZvcgotICogQHRpbWVvOiBmb3IgaG93IGxvbmcKICAqLwotc3RhdGljIGludCBkY2NwX3dhaXRfZm9yX2NjaWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgbG9uZyAqdGltZW8pCitzdGF0aWMgaW50IGRjY3Bfd2FpdF9mb3JfY2NpZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAlERUZJTkVfV0FJVCh3YWl0KTsKLQlsb25nIGRlbGF5OworCXVuc2lnbmVkIGxvbmcgZGVsYXk7CiAJaW50IHJjOwogCiAJd2hpbGUgKDEpIHsKQEAgLTIwMCwyMiArMTg4LDE2IEBACiAKIAkJaWYgKHNrLT5za19lcnIpCiAJCQlnb3RvIGRvX2Vycm9yOwotCQlpZiAoISp0aW1lbykKLQkJCWdvdG8gZG9fbm9uYmxvY2s7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWdvdG8gZG9faW50ZXJydXB0ZWQ7CiAKLQkJcmMgPSBjY2lkX2hjX3R4X3NlbmRfcGFja2V0KGRwLT5kY2Nwc19oY190eF9jY2lkLCBzaywgc2tiLAotCQkJCQkgICAgc2tiLT5sZW4pOworCQlyYyA9IGNjaWRfaGNfdHhfc2VuZF9wYWNrZXQoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCBza2IpOwogCQlpZiAocmMgPD0gMCkKIAkJCWJyZWFrOwogCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMocmMpOwotCQlpZiAoZGVsYXkgPiAqdGltZW8gfHwgZGVsYXkgPCAwKQotCQkJZ290byBkb19ub25ibG9jazsKLQogCQlzay0+c2tfd3JpdGVfcGVuZGluZysrOwogCQlyZWxlYXNlX3NvY2soc2spOwotCQkqdGltZW8gLT0gc2NoZWR1bGVfdGltZW91dChkZWxheSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoZGVsYXkpOwogCQlsb2NrX3NvY2soc2spOwogCQlzay0+c2tfd3JpdGVfcGVuZGluZy0tOwogCX0KQEAgLTIyNiwxMSArMjA4LDggQEAKIGRvX2Vycm9yOgogCXJjID0gLUVQSVBFOwogCWdvdG8gb3V0OwotZG9fbm9uYmxvY2s6Ci0JcmMgPSAtRUFHQUlOOwotCWdvdG8gb3V0OwogZG9faW50ZXJydXB0ZWQ6Ci0JcmMgPSBzb2NrX2ludHJfZXJybm8oKnRpbWVvKTsKKwlyYyA9IC1FSU5UUjsKIAlnb3RvIG91dDsKIH0KIApAQCAtMjUxLDEyICsyMzAsOSBAQAogewogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlsb25nIHRpbWVvID0gMzAwMDA7IAkvKiBJZiBhIHBhY2tldCBpcyB0YWtpbmcgbG9uZ2VyIHRoYW4gMiBzZWNzCi0JCQkJICAgd2UgaGF2ZSBvdGhlciBpc3N1ZXMgKi8KIAogCXdoaWxlICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpKSB7Ci0JCWludCBlcnIgPSBjY2lkX2hjX3R4X3NlbmRfcGFja2V0KGRwLT5kY2Nwc19oY190eF9jY2lkLCBzaywgc2tiLAotCQkJCQkgc2tiLT5sZW4pOworCQlpbnQgZXJyID0gY2NpZF9oY190eF9zZW5kX3BhY2tldChkcC0+ZGNjcHNfaGNfdHhfY2NpZCwgc2ssIHNrYik7CiAKIAkJaWYgKGVyciA+IDApIHsKIAkJCWlmICghYmxvY2spIHsKQEAgLTI2NCwxMiArMjQwLDkgQEAKIAkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoZXJyKStqaWZmaWVzKTsKIAkJCQlicmVhazsKIAkJCX0gZWxzZQotCQkJCWVyciA9IGRjY3Bfd2FpdF9mb3JfY2NpZChzaywgc2tiLCAmdGltZW8pOwotCQkJaWYgKGVycikgewotCQkJCXByaW50ayhLRVJOX0NSSVQgIiVzOmVyciBhdCBkY2NwX3dhaXRfZm9yX2NjaWQiCi0JCQkJCQkgIiAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOwotCQkJCWR1bXBfc3RhY2soKTsKLQkJCX0KKwkJCQllcnIgPSBkY2NwX3dhaXRfZm9yX2NjaWQoc2ssIHNrYik7CisJCQlpZiAoZXJyICYmIGVyciAhPSAtRUlOVFIpCisJCQkJRENDUF9CVUcoImVycj0lZCBhZnRlciBkY2NwX3dhaXRfZm9yX2NjaWQiLCBlcnIpOwogCQl9CiAKIAkJc2tiX2RlcXVldWUoJnNrLT5za193cml0ZV9xdWV1ZSk7CkBAIC0yOTEsMTQgKzI2NCwxMyBAQAogCiAJCQllcnIgPSBkY2NwX3RyYW5zbWl0X3NrYihzaywgc2tiKTsKIAkJCWNjaWRfaGNfdHhfcGFja2V0X3NlbnQoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCAwLCBsZW4pOwotCQkJaWYgKGVycikgewotCQkJCXByaW50ayhLRVJOX0NSSVQgIiVzOmVyciBmcm9tICIKLQkJCQkJICAgICAgICAgImNjaWRfaGNfdHhfcGFja2V0X3NlbnQgJWRcbiIsCi0JCQkJCSAgICAgICAgIF9fRlVOQ1RJT05fXywgZXJyKTsKLQkJCQlkdW1wX3N0YWNrKCk7Ci0JCQl9Ci0JCX0gZWxzZQorCQkJaWYgKGVycikKKwkJCQlEQ0NQX0JVRygiZXJyPSVkIGFmdGVyIGNjaWRfaGNfdHhfcGFja2V0X3NlbnQiLAorCQkJCQkgZXJyKTsKKwkJfSBlbHNlIHsKKwkJCWRjY3BfcHJfZGVidWcoInBhY2tldCBkaXNjYXJkZWRcbiIpOwogCQkJa2ZyZWUoc2tiKTsKKwkJfQogCX0KIH0KIApAQCAtMzI5LDkgKzMwMSwxMCBAQAogCXNrYl9yZXNlcnZlKHNrYiwgc2stPnNrX3Byb3QtPm1heF9oZWFkZXIpOwogCiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoZHN0KTsKLQlza2ItPmNzdW0gPSAwOwogCiAJZHJlcSA9IGRjY3BfcnNrKHJlcSk7CisJaWYgKGluZXRfcnNrKHJlcSktPmFja2VkKQkvKiBpbmNyZWFzZSBJU1MgdXBvbiByZXRyYW5zbWlzc2lvbiAqLworCQlkY2NwX2luY19zZXFubygmZHJlcS0+ZHJlcV9pc3MpOwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUgPSBEQ0NQX1BLVF9SRVNQT05TRTsKIAlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXEgID0gZHJlcS0+ZHJlcV9pc3M7CiAKQEAgLTM0MCwxMCArMzEzLDggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgZGNjcF9oZWFkZXJfc2l6ZSk7Ci0KLQlkaCA9IGRjY3BfaGRyKHNrYik7Ci0JbWVtc2V0KGRoLCAwLCBkY2NwX2hlYWRlcl9zaXplKTsKKwkvKiBCdWlsZCBhbmQgY2hlY2tzdW0gaGVhZGVyICovCisJZGggPSBkY2NwX3plcm9lZF9oZHIoc2tiLCBkY2NwX2hlYWRlcl9zaXplKTsKIAogCWRoLT5kY2NwaF9zcG9ydAk9IGluZXRfc2soc2spLT5zcG9ydDsKIAlkaC0+ZGNjcGhfZHBvcnQJPSBpbmV0X3JzayhyZXEpLT5ybXRfcG9ydDsKQEAgLTM1NSw2ICszMjYsMTAgQEAKIAlkY2NwX2hkcl9zZXRfYWNrKGRjY3BfaGRyX2Fja19iaXRzKHNrYiksIGRyZXEtPmRyZXFfaXNyKTsKIAlkY2NwX2hkcl9yZXNwb25zZShza2IpLT5kY2NwaF9yZXNwX3NlcnZpY2UgPSBkcmVxLT5kcmVxX3NlcnZpY2U7CiAKKwlkY2NwX2NzdW1fb3V0Z29pbmcoc2tiKTsKKworCS8qIFdlIHVzZSBgYWNrZWQnIHRvIHJlbWVtYmVyIHRoYXQgYSBSZXNwb25zZSB3YXMgYWxyZWFkeSBzZW50LiAqLworCWluZXRfcnNrKHJlcSktPmFja2VkID0gMTsKIAlEQ0NQX0lOQ19TVEFUUyhEQ0NQX01JQl9PVVRTRUdTKTsKIAlyZXR1cm4gc2tiOwogfQpAQCAtMzYzLDcgKzMzOCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZGNjcF9tYWtlX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAogCQkJCSAgICAgICBjb25zdCBlbnVtIGRjY3BfcmVzZXRfY29kZXMgY29kZSkKLQkJCQkgICAKIHsKIAlzdHJ1Y3QgZGNjcF9oZHIgKmRoOwogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CkBAIC0zNzksNyArMzUzLDYgQEAKIAlza2JfcmVzZXJ2ZShza2IsIHNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKIAogCXNrYi0+ZHN0ID0gZHN0X2Nsb25lKGRzdCk7Ci0Jc2tiLT5jc3VtID0gMDsKIAogCWRjY3BfaW5jX3NlcW5vKCZkcC0+ZGNjcHNfZ3NzKTsKIApAQCAtMzkyLDEwICszNjUsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlza2ItPmgucmF3ID0gc2tiX3B1c2goc2tiLCBkY2NwX2hlYWRlcl9zaXplKTsKLQotCWRoID0gZGNjcF9oZHIoc2tiKTsKLQltZW1zZXQoZGgsIDAsIGRjY3BfaGVhZGVyX3NpemUpOworCWRoID0gZGNjcF96ZXJvZWRfaGRyKHNrYiwgZGNjcF9oZWFkZXJfc2l6ZSk7CiAKIAlkaC0+ZGNjcGhfc3BvcnQJPSBpbmV0X3NrKHNrKS0+c3BvcnQ7CiAJZGgtPmRjY3BoX2Rwb3J0CT0gaW5ldF9zayhzayktPmRwb3J0OwpAQCAtNDA3LDcgKzM3Nyw3IEBACiAJZGNjcF9oZHJfc2V0X2FjayhkY2NwX2hkcl9hY2tfYml0cyhza2IpLCBkcC0+ZGNjcHNfZ3NyKTsKIAogCWRjY3BfaGRyX3Jlc2V0KHNrYiktPmRjY3BoX3Jlc2V0X2NvZGUgPSBjb2RlOwotCWluZXRfY3NrKHNrKS0+aWNza19hZl9vcHMtPnNlbmRfY2hlY2soc2ssIHNrYi0+bGVuLCBza2IpOworCWluZXRfY3NrKHNrKS0+aWNza19hZl9vcHMtPnNlbmRfY2hlY2soc2ssIDAsIHNrYik7CiAKIAlEQ0NQX0lOQ19TVEFUUyhEQ0NQX01JQl9PVVRTRUdTKTsKIAlyZXR1cm4gc2tiOwpAQCAtNDI2LDkgKzM5Niw4IEBACiAJCQkJCQkgICAgICBjb2RlKTsKIAkJaWYgKHNrYiAhPSBOVUxMKSB7CiAJCQltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwotCQkJZXJyID0gaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcy0+cXVldWVfeG1pdChza2IsIDApOwotCQkJaWYgKGVyciA9PSBORVRfWE1JVF9DTikKLQkJCQllcnIgPSAwOworCQkJZXJyID0gaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcy0+cXVldWVfeG1pdChza2IsIHNrLCAwKTsKKwkJCXJldHVybiBuZXRfeG1pdF9ldmFsKGVycik7CiAJCX0KIAl9CiAKQEAgLTQ0OSwxNyArNDE4LDIxIEBACiAJCiAJZGNjcF9zeW5jX21zcyhzaywgZHN0X210dShkc3QpKTsKIAotCWRjY3BfdXBkYXRlX2dzcyhzaywgZHAtPmRjY3BzX2lzcyk7Ci0gCS8qCisJLyoKIAkgKiBTV0wgYW5kIEFXTCBhcmUgaW5pdGlhbGx5IGFkanVzdGVkIHNvIHRoYXQgdGhleSBhcmUgbm90IGxlc3MgdGhhbgogCSAqIHRoZSBpbml0aWFsIFNlcXVlbmNlIE51bWJlcnMgcmVjZWl2ZWQgYW5kIHNlbnQsIHJlc3BlY3RpdmVseToKIAkgKglTV0wgOj0gbWF4KEdTUiArIDEgLSBmbG9vcihXLzQpLCBJU1IpLAogCSAqCUFXTCA6PSBtYXgoR1NTIC0gVycgKyAxLCBJU1MpLgogCSAqIFRoZXNlIGFkanVzdG1lbnRzIE1VU1QgYmUgYXBwbGllZCBvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCiAJICogY29ubmVjdGlvbi4KLSAJICovCisJICovCisJZGNjcF91cGRhdGVfZ3NzKHNrLCBkcC0+ZGNjcHNfaXNzKTsKIAlkY2NwX3NldF9zZXFubygmZHAtPmRjY3BzX2F3bCwgbWF4NDgoZHAtPmRjY3BzX2F3bCwgZHAtPmRjY3BzX2lzcykpOwogCisJLyogUy5HQVIgLSBncmVhdGVzdCB2YWxpZCBhY2tub3dsZWRnZW1lbnQgbnVtYmVyIHJlY2VpdmVkIG9uIGEgbm9uLVN5bmM7CisJICogICAgICAgICBpbml0aWFsaXplZCB0byBTLklTUyAoc2VjLiA4LjUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJZHAtPmRjY3BzX2dhciA9IGRwLT5kY2Nwc19pc3M7CisKIAlpY3NrLT5pY3NrX3JldHJhbnNtaXRzID0gMDsKIAlpbml0X3RpbWVyKCZkcC0+ZGNjcHNfeG1pdF90aW1lcik7CiAJZHAtPmRjY3BzX3htaXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNrOwpAQCAtNDgxLDcgKzQ1NCw2IEBACiAJc2tiX3Jlc2VydmUoc2tiLCBzay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7CiAKIAlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlID0gRENDUF9QS1RfUkVRVUVTVDsKLQlza2ItPmNzdW0gPSAwOwogCiAJZGNjcF9za2JfZW50YWlsKHNrLCBza2IpOwogCWRjY3BfdHJhbnNtaXRfc2tiKHNrLCBza2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKSk7CkBAIC01MTMsNyArNDg1LDYgQEAKIAogCQkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgc2stPnNrX3Byb3QtPm1heF9oZWFkZXIpOwotCQlza2ItPmNzdW0gPSAwOwogCQlEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF90eXBlID0gRENDUF9QS1RfQUNLOwogCQlkY2NwX3RyYW5zbWl0X3NrYihzaywgc2tiKTsKIAl9CkBAIC01NjcsNyArNTM4LDYgQEAKIAogCS8qIFJlc2VydmUgc3BhY2UgZm9yIGhlYWRlcnMgYW5kIHByZXBhcmUgY29udHJvbCBiaXRzLiAqLwogCXNrYl9yZXNlcnZlKHNrYiwgc2stPnNrX3Byb3QtPm1heF9oZWFkZXIpOwotCXNrYi0+Y3N1bSA9IDA7CiAJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfdHlwZSA9IHBrdF90eXBlOwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSA9IHNlcTsKIApAQCAtNTkzLDcgKzU2Myw2IEBACiAKIAkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzIGFuZCBwcmVwYXJlIGNvbnRyb2wgYml0cy4gKi8KIAlza2JfcmVzZXJ2ZShza2IsIHNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKLQlza2ItPmNzdW0gPSAwOwogCURDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUgPSBkcC0+ZGNjcHNfcm9sZSA9PSBEQ0NQX1JPTEVfQ0xJRU5UID8KIAkJCQkJRENDUF9QS1RfQ0xPU0UgOiBEQ0NQX1BLVF9DTE9TRVJFUTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvcHJvYmUuYyBiL25ldC9kY2NwL3Byb2JlLmMKaW5kZXggMTQ2NDk2Zi4uZjgxZTM3ZCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvcHJvYmUuYworKysgYi9uZXQvZGNjcC9wcm9iZS5jCkBAIC0xMDYsOCArMTA2LDEwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QganByb2JlIGRjY3Bfc2VuZF9wcm9iZSA9IHsKLQkua3AJPSB7IC5hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKSZkY2NwX3NlbmRtc2csIH0sCi0JLmVudHJ5CT0gKGtwcm9iZV9vcGNvZGVfdCAqKSZqZGNjcF9zZW5kbXNnLAorCS5rcAk9IHsKKwkJLnN5bWJvbF9uYW1lID0gImRjY3Bfc2VuZG1zZyIsCisJfSwKKwkuZW50cnkJPSBKUFJPQkVfRU5UUlkoamRjY3Bfc2VuZG1zZyksCiB9OwogCiBzdGF0aWMgaW50IGRjY3Bwcm9iZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMTYwLDYgKzE2Miw4IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGNjcHcud2FpdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRjY3B3LmxvY2spOwogCWRjY3B3LmZpZm8gPSBrZmlmb19hbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMLCAmZGNjcHcubG9jayk7CisJaWYgKElTX0VSUihkY2Nwdy5maWZvKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGNjcHcuZmlmbyk7CiAKIAlpZiAoIXByb2NfbmV0X2ZvcHNfY3JlYXRlKHByb2NuYW1lLCBTX0lSVVNSLCAmZGNjcHByb2JlX2ZvcHMpKQogCQlnb3RvIGVycjA7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9wcm90by5jIGIvbmV0L2RjY3AvcHJvdG8uYwppbmRleCA3MmNiZGNmLi42M2IzZmEyIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9wcm90by5jCisrKyBiL25ldC9kY2NwL3Byb3RvLmMKQEAgLTUyLDYgKzUyLDkgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9oYXNoaW5mbyk7CiAKKy8qIHRoZSBtYXhpbXVtIHF1ZXVlIGxlbmd0aCBmb3IgdHggaW4gcGFja2V0cy4gMCBpcyBubyBsaW1pdCAqLworaW50IHN5c2N0bF9kY2NwX3R4X3FsZW4gX19yZWFkX21vc3RseSA9IDU7CisKIHZvaWQgZGNjcF9zZXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgc3RhdGUpCiB7CiAJY29uc3QgaW50IG9sZHN0YXRlID0gc2stPnNrX3N0YXRlOwpAQCAtMTkzLDcgKzE5Niw3IEBACiAJCQkJCQkgICAgICBzaywgR0ZQX0tFUk5FTCk7CiAJCWRwLT5kY2Nwc19oY190eF9jY2lkID0gY2NpZF9oY190eF9uZXcoZG1zay0+ZGNjcG1zX3R4X2NjaWQsCiAJCQkJCQkgICAgICBzaywgR0ZQX0tFUk5FTCk7Ci0JICAgIAlpZiAodW5saWtlbHkoZHAtPmRjY3BzX2hjX3J4X2NjaWQgPT0gTlVMTCB8fAorCQlpZiAodW5saWtlbHkoZHAtPmRjY3BzX2hjX3J4X2NjaWQgPT0gTlVMTCB8fAogCQkJICAgICBkcC0+ZGNjcHNfaGNfdHhfY2NpZCA9PSBOVUxMKSkgewogCQkJY2NpZF9oY19yeF9kZWxldGUoZHAtPmRjY3BzX2hjX3J4X2NjaWQsIHNrKTsKIAkJCWNjaWRfaGNfdHhfZGVsZXRlKGRwLT5kY2Nwc19oY190eF9jY2lkLCBzayk7CkBAIC0yMTIsNiArMjE1LDcgQEAKIAogCWRjY3BfaW5pdF94bWl0X3RpbWVycyhzayk7CiAJaWNzay0+aWNza19ydG8JCT0gRENDUF9USU1FT1VUX0lOSVQ7CisJaWNzay0+aWNza19zeW5fcmV0cmllcwk9IHN5c2N0bF9kY2NwX3JlcXVlc3RfcmV0cmllczsKIAlzay0+c2tfc3RhdGUJCT0gRENDUF9DTE9TRUQ7CiAJc2stPnNrX3dyaXRlX3NwYWNlCT0gZGNjcF93cml0ZV9zcGFjZTsKIAlpY3NrLT5pY3NrX3N5bmNfbXNzCT0gZGNjcF9zeW5jX21zczsKQEAgLTI2MiwxMiArMjY2LDEyIEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfZGVzdHJveV9zb2NrKTsKIAotc3RhdGljIGlubGluZSBpbnQgZGNjcF9saXN0ZW5fc3RhcnQoc3RydWN0IHNvY2sgKnNrKQorc3RhdGljIGlubGluZSBpbnQgZGNjcF9saXN0ZW5fc3RhcnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgYmFja2xvZykKIHsKIAlzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCiAJZHAtPmRjY3BzX3JvbGUgPSBEQ0NQX1JPTEVfTElTVEVOOwotCXJldHVybiBpbmV0X2Nza19saXN0ZW5fc3RhcnQoc2ssIFRDUF9TWU5RX0hTSVpFKTsKKwlyZXR1cm4gaW5ldF9jc2tfbGlzdGVuX3N0YXJ0KHNrLCBiYWNrbG9nKTsKIH0KIAogaW50IGRjY3BfZGlzY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncykKQEAgLTM4Niw3ICszOTAsNyBAQAogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CiAJc3RydWN0IGRjY3Bfc2VydmljZV9saXN0ICpzbCA9IE5VTEw7CiAKLQlpZiAoc2VydmljZSA9PSBEQ0NQX1NFUlZJQ0VfSU5WQUxJRF9WQUxVRSB8fCAKKwlpZiAoc2VydmljZSA9PSBEQ0NQX1NFUlZJQ0VfSU5WQUxJRF9WQUxVRSB8fAogCSAgICBvcHRsZW4gPiBEQ0NQX1NFUlZJQ0VfTElTVF9NQVhfTEVOICogc2l6ZW9mKHUzMikpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC00NTEsOSArNDU1LDggQEAKIHN0YXRpYyBpbnQgZG9fZGNjcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKIHsKLQlzdHJ1Y3QgZGNjcF9zb2NrICpkcDsKLQlpbnQgZXJyOwotCWludCB2YWw7CisJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKKwlpbnQgdmFsLCBlcnIgPSAwOwogCiAJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ2NSwxNCArNDY4LDExIEBACiAJCXJldHVybiBkY2NwX3NldHNvY2tvcHRfc2VydmljZShzaywgdmFsLCBvcHR2YWwsIG9wdGxlbik7CiAKIAlsb2NrX3NvY2soc2spOwotCWRwID0gZGNjcF9zayhzayk7Ci0JZXJyID0gMDsKLQogCXN3aXRjaCAob3B0bmFtZSkgewogCWNhc2UgRENDUF9TT0NLT1BUX1BBQ0tFVF9TSVpFOgotCQlkcC0+ZGNjcHNfcGFja2V0X3NpemUgPSB2YWw7CisJCURDQ1BfV0FSTigic29ja29wdChQQUNLRVRfU0laRSkgaXMgZGVwcmVjYXRlZDogZml4IHlvdXIgYXBwXG4iKTsKKwkJZXJyID0gMDsKIAkJYnJlYWs7Ci0KIAljYXNlIERDQ1BfU09DS09QVF9DSEFOR0VfTDoKIAkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGRjY3Bfc29fZmVhdCkpCiAJCQllcnIgPSAtRUlOVkFMOwpAQCAtNDgxLDcgKzQ4MSw2IEBACiAJCQkJCSAgICAgICAgICAgICAoc3RydWN0IGRjY3Bfc29fZmVhdCBfX3VzZXIgKikKIAkJCQkJCSAgICAgb3B0dmFsKTsKIAkJYnJlYWs7Ci0KIAljYXNlIERDQ1BfU09DS09QVF9DSEFOR0VfUjoKIAkJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IGRjY3Bfc29fZmVhdCkpCiAJCQllcnIgPSAtRUlOVkFMOwpAQCAtNDkwLDEyICs0ODksMjYgQEAKIAkJCQkJCSAgICAgKHN0cnVjdCBkY2NwX3NvX2ZlYXQgX191c2VyICopCiAJCQkJCQkgICAgIG9wdHZhbCk7CiAJCWJyZWFrOwotCisJY2FzZSBEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPVjoJLyogc2VuZGVyIHNpZGUsIFJGQyA0MzQwLCBzZWMuIDkuMiAqLworCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAxNSkKKwkJCWVyciA9IC1FSU5WQUw7CisJCWVsc2UKKwkJCWRwLT5kY2Nwc19wY3NsZW4gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgRENDUF9TT0NLT1BUX1JFQ1ZfQ1NDT1Y6CS8qIHJlY2VpdmVyIHNpZGUsIFJGQyA0MzQwIHNlYy4gOS4yLjEgKi8KKwkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMTUpCisJCQllcnIgPSAtRUlOVkFMOworCQllbHNlIHsKKwkJCWRwLT5kY2Nwc19wY3JsZW4gPSB2YWw7CisJCQkvKiBGSVhNRTogYWRkIGZlYXR1cmUgbmVnb3RpYXRpb24sCisJCQkgKiBDaGFuZ2VMKE1pbmltdW1DaGVja3N1bUNvdmVyYWdlLCB2YWwpICovCisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKIAl9Ci0JCisKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CiB9CkBAIC01NjksMTIgKzU4MiwxNyBAQAogCiAJc3dpdGNoIChvcHRuYW1lKSB7CiAJY2FzZSBEQ0NQX1NPQ0tPUFRfUEFDS0VUX1NJWkU6Ci0JCXZhbCA9IGRwLT5kY2Nwc19wYWNrZXRfc2l6ZTsKLQkJbGVuID0gc2l6ZW9mKGRwLT5kY2Nwc19wYWNrZXRfc2l6ZSk7Ci0JCWJyZWFrOworCQlEQ0NQX1dBUk4oInNvY2tvcHQoUEFDS0VUX1NJWkUpIGlzIGRlcHJlY2F0ZWQ6IGZpeCB5b3VyIGFwcFxuIik7CisJCXJldHVybiAwOwogCWNhc2UgRENDUF9TT0NLT1BUX1NFUlZJQ0U6CiAJCXJldHVybiBkY2NwX2dldHNvY2tvcHRfc2VydmljZShzaywgbGVuLAogCQkJCQkgICAgICAgKF9fYmUzMiBfX3VzZXIgKilvcHR2YWwsIG9wdGxlbik7CisJY2FzZSBEQ0NQX1NPQ0tPUFRfU0VORF9DU0NPVjoKKwkJdmFsID0gZHAtPmRjY3BzX3Bjc2xlbjsKKwkJYnJlYWs7CisJY2FzZSBEQ0NQX1NPQ0tPUFRfUkVDVl9DU0NPVjoKKwkJdmFsID0gZHAtPmRjY3BzX3BjcmxlbjsKKwkJYnJlYWs7CiAJY2FzZSAxMjggLi4uIDE5MToKIAkJcmV0dXJuIGNjaWRfaGNfcnhfZ2V0c29ja29wdChkcC0+ZGNjcHNfaGNfcnhfY2NpZCwgc2ssIG9wdG5hbWUsCiAJCQkJCSAgICAgbGVuLCAodTMyIF9fdXNlciAqKW9wdHZhbCwgb3B0bGVuKTsKQEAgLTYzMCw2ICs2NDgsMTMgQEAKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWxvY2tfc29jayhzayk7CisKKwlpZiAoc3lzY3RsX2RjY3BfdHhfcWxlbiAmJgorCSAgICAoc2stPnNrX3dyaXRlX3F1ZXVlLnFsZW4gPj0gc3lzY3RsX2RjY3BfdHhfcWxlbikpIHsKKwkJcmMgPSAtRUFHQUlOOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKwogCXRpbWVvID0gc29ja19zbmR0aW1lbyhzaywgbm9ibG9jayk7CiAKIAkvKgpAQCAtNzg4LDcgKzgxMyw3IEBACiAJCSAqIEZJWE1FOiBoZXJlIGl0IHByb2JhYmx5IHNob3VsZCBiZSBzay0+c2tfcHJvdC0+bGlzdGVuX3N0YXJ0CiAJCSAqIHNlZSB0Y3BfbGlzdGVuX3N0YXJ0CiAJCSAqLwotCQllcnIgPSBkY2NwX2xpc3Rlbl9zdGFydChzayk7CisJCWVyciA9IGRjY3BfbGlzdGVuX3N0YXJ0KHNrLCBiYWNrbG9nKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTgwNSw3ICs4MzAsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGNjcF9uZXdfc3RhdGVbXSA9IHsKIAkvKiBjdXJyZW50IHN0YXRlOiAgIG5ldyBzdGF0ZTogICAgICBhY3Rpb246CSovCiAJWzBdCQkgID0gRENDUF9DTE9TRUQsCi0JW0RDQ1BfT1BFTl0gCSAgPSBEQ0NQX0NMT1NJTkcgfCBEQ0NQX0FDVElPTl9GSU4sCisJW0RDQ1BfT1BFTl0JICA9IERDQ1BfQ0xPU0lORyB8IERDQ1BfQUNUSU9OX0ZJTiwKIAlbRENDUF9SRVFVRVNUSU5HXSA9IERDQ1BfQ0xPU0VELAogCVtEQ0NQX1BBUlRPUEVOXQkgID0gRENDUF9DTE9TSU5HIHwgRENDUF9BQ1RJT05fRklOLAogCVtEQ0NQX0xJU1RFTl0JICA9IERDQ1BfQ0xPU0VELApAQCAtMTAwOCw4ICsxMDMzLDcgQEAKIAl9IHdoaWxlICghZGNjcF9oYXNoaW5mby5laGFzaCAmJiAtLWVoYXNoX29yZGVyID4gMCk7CiAKIAlpZiAoIWRjY3BfaGFzaGluZm8uZWhhc2gpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiRmFpbGVkIHRvIGFsbG9jYXRlIERDQ1AgIgotCQkJCSAiZXN0YWJsaXNoZWQgaGFzaCB0YWJsZVxuIik7CisJCURDQ1BfQ1JJVCgiRmFpbGVkIHRvIGFsbG9jYXRlIERDQ1AgZXN0YWJsaXNoZWQgaGFzaCB0YWJsZSIpOwogCQlnb3RvIG91dF9mcmVlX2JpbmRfYnVja2V0X2NhY2hlcDsKIAl9CiAKQEAgLTEwMzEsNyArMTA1NSw3IEBACiAJfSB3aGlsZSAoIWRjY3BfaGFzaGluZm8uYmhhc2ggJiYgLS1iaGFzaF9vcmRlciA+PSAwKTsKIAogCWlmICghZGNjcF9oYXNoaW5mby5iaGFzaCkgewotCQlwcmludGsoS0VSTl9DUklUICJGYWlsZWQgdG8gYWxsb2NhdGUgRENDUCBiaW5kIGhhc2ggdGFibGVcbiIpOworCQlEQ0NQX0NSSVQoIkZhaWxlZCB0byBhbGxvY2F0ZSBEQ0NQIGJpbmQgaGFzaCB0YWJsZSIpOwogCQlnb3RvIG91dF9mcmVlX2RjY3BfZWhhc2g7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9zeXNjdGwuYyBiL25ldC9kY2NwL3N5c2N0bC5jCmluZGV4IDM4YmMxNTcuLmZkY2ZjYTMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3N5c2N0bC5jCisrKyBiL25ldC9kY2NwL3N5c2N0bC5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgImRjY3AuaCIKICNpbmNsdWRlICJmZWF0LmgiCiAKICNpZm5kZWYgQ09ORklHX1NZU0NUTApAQCAtMTksNTMgKzIwLDc2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGRjY3BfZGVmYXVsdF90YWJsZVtdID0gewogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0RDQ1BfREVGQVVMVF9TRVFfV0lORE9XLAogCQkucHJvY25hbWUJPSAic2VxX3dpbmRvdyIsCi0JCS5kYXRhCQk9ICZkY2NwX2ZlYXRfZGVmYXVsdF9zZXF1ZW5jZV93aW5kb3csCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGRjY3BfZmVhdF9kZWZhdWx0X3NlcXVlbmNlX3dpbmRvdyksCisJCS5kYXRhCQk9ICZzeXNjdGxfZGNjcF9mZWF0X3NlcXVlbmNlX3dpbmRvdywKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2RjY3BfZmVhdF9zZXF1ZW5jZV93aW5kb3cpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0RDQ1BfREVGQVVMVF9SWF9DQ0lELAogCQkucHJvY25hbWUJPSAicnhfY2NpZCIsCi0JCS5kYXRhCQk9ICZkY2NwX2ZlYXRfZGVmYXVsdF9yeF9jY2lkLAotCQkubWF4bGVuCQk9IHNpemVvZihkY2NwX2ZlYXRfZGVmYXVsdF9yeF9jY2lkKSwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kY2NwX2ZlYXRfcnhfY2NpZCwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2RjY3BfZmVhdF9yeF9jY2lkKSwKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJfSwKIAl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9EQ0NQX0RFRkFVTFRfVFhfQ0NJRCwKIAkJLnByb2NuYW1lCT0gInR4X2NjaWQiLAotCQkuZGF0YQkJPSAmZGNjcF9mZWF0X2RlZmF1bHRfdHhfY2NpZCwKLQkJLm1heGxlbgkJPSBzaXplb2YoZGNjcF9mZWF0X2RlZmF1bHRfdHhfY2NpZCksCisJCS5kYXRhCQk9ICZzeXNjdGxfZGNjcF9mZWF0X3R4X2NjaWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX2ZlYXRfdHhfY2NpZCksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCX0sCiAJewotCQkuY3RsX25hbWUJPSBORVRfRENDUF9ERUZBVUxUX0FDS19SQVRJTywKIAkJLnByb2NuYW1lCT0gImFja19yYXRpbyIsCi0JCS5kYXRhCQk9ICZkY2NwX2ZlYXRfZGVmYXVsdF9hY2tfcmF0aW8sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGRjY3BfZmVhdF9kZWZhdWx0X2Fja19yYXRpbyksCisJCS5kYXRhCQk9ICZzeXNjdGxfZGNjcF9mZWF0X2Fja19yYXRpbywKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2RjY3BfZmVhdF9hY2tfcmF0aW8pLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0RDQ1BfREVGQVVMVF9TRU5EX0FDS1ZFQywKIAkJLnByb2NuYW1lCT0gInNlbmRfYWNrdmVjIiwKLQkJLmRhdGEJCT0gJmRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfYWNrX3ZlY3RvciwKLQkJLm1heGxlbgkJPSBzaXplb2YoZGNjcF9mZWF0X2RlZmF1bHRfc2VuZF9hY2tfdmVjdG9yKSwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9hY2tfdmVjdG9yLAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfZGNjcF9mZWF0X3NlbmRfYWNrX3ZlY3RvciksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCX0sCiAJewotCQkuY3RsX25hbWUJPSBORVRfRENDUF9ERUZBVUxUX1NFTkRfTkRQLAogCQkucHJvY25hbWUJPSAic2VuZF9uZHAiLAotCQkuZGF0YQkJPSAmZGNjcF9mZWF0X2RlZmF1bHRfc2VuZF9uZHBfY291bnQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGRjY3BfZmVhdF9kZWZhdWx0X3NlbmRfbmRwX2NvdW50KSwKKwkJLmRhdGEJCT0gJnN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9uZHBfY291bnQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9uZHBfY291bnQpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAorCXsKKwkJLnByb2NuYW1lCT0gInJlcXVlc3RfcmV0cmllcyIsCisJCS5kYXRhCQk9ICZzeXNjdGxfZGNjcF9yZXF1ZXN0X3JldHJpZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX3JlcXVlc3RfcmV0cmllcyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkucHJvY25hbWUJPSAicmV0cmllczEiLAorCQkuZGF0YQkJPSAmc3lzY3RsX2RjY3BfcmV0cmllczEsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9kY2NwX3JldHJpZXMxKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJyZXRyaWVzMiIsCisJCS5kYXRhCQk9ICZzeXNjdGxfZGNjcF9yZXRyaWVzMiwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2RjY3BfcmV0cmllczIpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInR4X3FsZW4iLAorCQkuZGF0YQkJPSAmc3lzY3RsX2RjY3BfdHhfcWxlbiwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX2RjY3BfdHhfcWxlbiksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCisKIAl7IC5jdGxfbmFtZSA9IDAsIH0KIH07CiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL3RpbWVyLmMgYi9uZXQvZGNjcC90aW1lci5jCmluZGV4IDg0NDc3NDIuLmU1MzQ4ZjMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL3RpbWVyLmMKKysrIGIvbmV0L2RjY3AvdGltZXIuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgbmV0L2RjY3AvdGltZXIuYwotICogCisgKgogICogIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEQ0NQIHByb3RvY29sCiAgKiAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAgKgpAQCAtMTUsMTUgKzE1LDEwIEBACiAKICNpbmNsdWRlICJkY2NwLmgiCiAKLXN0YXRpYyB2b2lkIGRjY3Bfd3JpdGVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGRjY3Bfa2VlcGFsaXZlX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBkY2NwX2RlbGFja190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwotCi12b2lkIGRjY3BfaW5pdF94bWl0X3RpbWVycyhzdHJ1Y3Qgc29jayAqc2spCi17Ci0JaW5ldF9jc2tfaW5pdF94bWl0X3RpbWVycyhzaywgJmRjY3Bfd3JpdGVfdGltZXIsICZkY2NwX2RlbGFja190aW1lciwKLQkJCQkgICZkY2NwX2tlZXBhbGl2ZV90aW1lcik7Ci19CisvKiBzeXNjdGwgdmFyaWFibGVzIGdvdmVybmluZyBudW1iZXJzIG9mIHJldHJhbnNtaXNzaW9uIGF0dGVtcHRzICovCitpbnQgIHN5c2N0bF9kY2NwX3JlcXVlc3RfcmV0cmllcwlfX3JlYWRfbW9zdGx5ID0gVENQX1NZTl9SRVRSSUVTOworaW50ICBzeXNjdGxfZGNjcF9yZXRyaWVzMQkJX19yZWFkX21vc3RseSA9IFRDUF9SRVRSMTsKK2ludCAgc3lzY3RsX2RjY3BfcmV0cmllczIJCV9fcmVhZF9tb3N0bHkgPSBUQ1BfUkVUUjI7CiAKIHN0YXRpYyB2b2lkIGRjY3Bfd3JpdGVfZXJyKHN0cnVjdCBzb2NrICpzaykKIHsKQEAgLTQ0LDExICszOSwxMCBAQAogCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9SRVFVRVNUSU5HIHx8IHNrLT5za19zdGF0ZSA9PSBEQ0NQX1BBUlRPUEVOKSB7CiAJCWlmIChpY3NrLT5pY3NrX3JldHJhbnNtaXRzICE9IDApCiAJCQlkc3RfbmVnYXRpdmVfYWR2aWNlKCZzay0+c2tfZHN0X2NhY2hlKTsKLQkJcmV0cnlfdW50aWwgPSBpY3NrLT5pY3NrX3N5bl9yZXRyaWVzID8gOgotCQkJICAgIC8qIEZJWE1FISAqLyAzIC8qIEZJWE1FISBzeXNjdGxfdGNwX3N5bl9yZXRyaWVzICovOworCQlyZXRyeV91bnRpbCA9IGljc2stPmljc2tfc3luX3JldHJpZXMgPworCQkJICAgIDogc3lzY3RsX2RjY3BfcmVxdWVzdF9yZXRyaWVzOwogCX0gZWxzZSB7Ci0JCWlmIChpY3NrLT5pY3NrX3JldHJhbnNtaXRzID49Ci0JCSAgICAgLyogRklYTUUhIHN5c2N0bF90Y3BfcmV0cmllczEgKi8gNSAvKiBGSVhNRSEgKi8pIHsKKwkJaWYgKGljc2stPmljc2tfcmV0cmFuc21pdHMgPj0gc3lzY3RsX2RjY3BfcmV0cmllczEpIHsKIAkJCS8qIE5PVEUuIGRyYWZ0LWlldGYtdGNwaW1wbC1wbXR1ZC0wMS50eHQgcmVxdWlyZXMgcG10dQogCQkJICAgYmxhY2sgaG9sZSBkZXRlY3Rpb24uIDotKAogCkBAIC03Miw3ICs2Niw3IEBACiAJCQlkc3RfbmVnYXRpdmVfYWR2aWNlKCZzay0+c2tfZHN0X2NhY2hlKTsKIAkJfQogCi0JCXJldHJ5X3VudGlsID0gLyogRklYTUUhICovIDE1IC8qIEZJWE1FISBzeXNjdGxfdGNwX3JldHJpZXMyICovOworCQlyZXRyeV91bnRpbCA9IHN5c2N0bF9kY2NwX3JldHJpZXMyOwogCQkvKgogCQkgKiBGSVhNRTogc2VlIHRjcF93cml0ZV90aW1vdXQgYW5kIHRjcF9vdXRfb2ZfcmVzb3VyY2VzCiAJCSAqLwpAQCAtODYsNTMgKzgwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogVGhpcyBpcyB0aGUgc2FtZSBhcyB0Y3BfZGVsYWNrX3RpbWVyLCBzYW5zIHByZXF1ZXVlICYgbWVtX3JlY2xhaW0gc3R1ZmYgKi8KLXN0YXRpYyB2b2lkIGRjY3BfZGVsYWNrX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilkYXRhOwotCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKLQotCWJoX2xvY2tfc29jayhzayk7Ci0JaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKLQkJLyogVHJ5IGFnYWluIGxhdGVyLiAqLwotCQlpY3NrLT5pY3NrX2Fjay5ibG9ja2VkID0gMTsKLQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfREVMQVlFREFDS0xPQ0tFRCk7Ci0JCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaWNzay0+aWNza19kZWxhY2tfdGltZXIsCi0JCQkgICAgICAgamlmZmllcyArIFRDUF9ERUxBQ0tfTUlOKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX0NMT1NFRCB8fAotCSAgICAhKGljc2stPmljc2tfYWNrLnBlbmRpbmcgJiBJQ1NLX0FDS19USU1FUikpCi0JCWdvdG8gb3V0OwotCWlmICh0aW1lX2FmdGVyKGljc2stPmljc2tfYWNrLnRpbWVvdXQsIGppZmZpZXMpKSB7Ci0JCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaWNzay0+aWNza19kZWxhY2tfdGltZXIsCi0JCQkgICAgICAgaWNzay0+aWNza19hY2sudGltZW91dCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWljc2stPmljc2tfYWNrLnBlbmRpbmcgJj0gfklDU0tfQUNLX1RJTUVSOwotCi0JaWYgKGluZXRfY3NrX2Fja19zY2hlZHVsZWQoc2spKSB7Ci0JCWlmICghaWNzay0+aWNza19hY2sucGluZ3BvbmcpIHsKLQkJCS8qIERlbGF5ZWQgQUNLIG1pc3NlZDogaW5mbGF0ZSBBVE8uICovCi0JCQlpY3NrLT5pY3NrX2Fjay5hdG8gPSBtaW4oaWNzay0+aWNza19hY2suYXRvIDw8IDEsCi0JCQkJCQkgaWNzay0+aWNza19ydG8pOwotCQl9IGVsc2UgewotCQkJLyogRGVsYXllZCBBQ0sgbWlzc2VkOiBsZWF2ZSBwaW5ncG9uZyBtb2RlIGFuZAotCQkJICogZGVmbGF0ZSBBVE8uCi0JCQkgKi8KLQkJCWljc2stPmljc2tfYWNrLnBpbmdwb25nID0gMDsKLQkJCWljc2stPmljc2tfYWNrLmF0byA9IFRDUF9BVE9fTUlOOwotCQl9Ci0JCWRjY3Bfc2VuZF9hY2soc2spOwotCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9ERUxBWUVEQUNLUyk7Ci0JfQotb3V0OgotCWJoX3VubG9ja19zb2NrKHNrKTsKLQlzb2NrX3B1dChzayk7Ci19Ci0KIC8qCiAgKglUaGUgRENDUCByZXRyYW5zbWl0IHRpbWVyLgogICovCkBAIC0xNDIsNyArODksNyBAQAogCiAJLyogcmV0cmFuc21pdCB0aW1lciBpcyB1c2VkIGZvciBmZWF0dXJlIG5lZ290aWF0aW9uIHRocm91Z2hvdXQKIAkgKiBjb25uZWN0aW9uLiAgSW4gdGhpcyBjYXNlLCBubyBwYWNrZXQgaXMgcmUtdHJhbnNtaXR0ZWQsIGJ1dCByYXRoZXIgYW4KLQkgKiBhY2sgaXMgZ2VuZXJhdGVkIGFuZCBwZW5kaW5nIGNoYW5nZXMgYXJlIHNwbGFjZWQgaW50byBpdHMgb3B0aW9ucy4KKwkgKiBhY2sgaXMgZ2VuZXJhdGVkIGFuZCBwZW5kaW5nIGNoYW5nZXMgYXJlIHBsYWNlZCBpbnRvIGl0cyBvcHRpb25zLgogCSAqLwogCWlmIChzay0+c2tfc2VuZF9oZWFkID09IE5VTEwpIHsKIAkJZGNjcF9wcl9kZWJ1ZygiZmVhdCBuZWdvdGlhdGlvbiByZXRyYW5zbWl0IHRpbWVvdXQgJXBcbiIsIHNrKTsKQEAgLTE1NCwxMiArMTAxLDE0IEBACiAJLyoKIAkgKiBzay0+c2tfc2VuZF9oZWFkIGhhcyB0byBoYXZlIG9uZSBza2Igd2l0aAogCSAqIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUgc2V0IHRvIG9uZSBvZiB0aGUgcmV0cmFuc21pdHRhYmxlIERDQ1AKLQkgKiBwYWNrZXQgdHlwZXMgKFJFUVVFU1QsIFJFU1BPTlNFLCB0aGUgQUNLIGluIHRoZSAzd2F5IGhhbmRzaGFrZQotCSAqIChQQVJUT1BFTiB0aW1lciksIGV0YykuCi0JICovCisJICogcGFja2V0IHR5cGVzLiBUaGUgb25seSBwYWNrZXRzIGVsaWdpYmxlIGZvciByZXRyYW5zbWlzc2lvbiBhcmU6CisJICoJLS0gUmVxdWVzdHMgaW4gY2xpZW50LVJFUVVFU1QgIHN0YXRlIChzZWMuIDguMS4xKQorCSAqCS0tIEFja3MgICAgIGluIGNsaWVudC1QQVJUT1BFTiBzdGF0ZSAoc2VjLiA4LjEuNSkKKwkgKgktLSBDbG9zZVJlcSBpbiBzZXJ2ZXItQ0xPU0VSRVEgc3RhdGUgKHNlYy4gOC4zKQorCSAqCS0tIENsb3NlICAgIGluICAgbm9kZS1DTE9TSU5HICBzdGF0ZSAoc2VjLiA4LjMpICAgICAgICAgICAgICAgICovCiAJQlVHX1RSQVAoc2stPnNrX3NlbmRfaGVhZCAhPSBOVUxMKTsKIAotCS8qIAorCS8qCiAJICogTW9yZSB0aGFuIHRoYW4gNE1TTCAoOCBtaW51dGVzKSBoYXMgcGFzc2VkLCBhIFJFU0VUKGFib3J0ZWQpIHdhcwogCSAqIHNlbnQsIG5vIG5lZWQgdG8gcmV0cmFuc21pdCwgdGhpcyBzb2NrIGlzIGRlYWQuCiAJICovCkBAIC0xOTQsNyArMTQzLDcgQEAKIAlpY3NrLT5pY3NrX3J0byA9IG1pbihpY3NrLT5pY3NrX3J0byA8PCAxLCBEQ0NQX1JUT19NQVgpOwogCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLCBpY3NrLT5pY3NrX3J0bywKIAkJCQkgIERDQ1BfUlRPX01BWCk7Ci0JaWYgKGljc2stPmljc2tfcmV0cmFuc21pdHMgPiAzIC8qIEZJWE1FOiBzeXNjdGxfZGNjcF9yZXRyaWVzMSAqLykKKwlpZiAoaWNzay0+aWNza19yZXRyYW5zbWl0cyA+IHN5c2N0bF9kY2NwX3JldHJpZXMxKQogCQlfX3NrX2RzdF9yZXNldChzayk7CiBvdXQ6OwogfQpAQCAtMjUxLDcgKzIwMCw3IEBACiAJLyogT25seSBwcm9jZXNzIGlmIHNvY2tldCBpcyBub3QgaW4gdXNlLiAqLwogCWJoX2xvY2tfc29jayhzayk7CiAJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKLQkJLyogVHJ5IGFnYWluIGxhdGVyLiAqLyAKKwkJLyogVHJ5IGFnYWluIGxhdGVyLiAqLwogCQlpbmV0X2Nza19yZXNldF9rZWVwYWxpdmVfdGltZXIoc2ssIEhaIC8gMjApOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yNjQsMyArMjEzLDU2IEBACiAJYmhfdW5sb2NrX3NvY2soc2spOwogCXNvY2tfcHV0KHNrKTsKIH0KKworLyogVGhpcyBpcyB0aGUgc2FtZSBhcyB0Y3BfZGVsYWNrX3RpbWVyLCBzYW5zIHByZXF1ZXVlICYgbWVtX3JlY2xhaW0gc3R1ZmYgKi8KK3N0YXRpYyB2b2lkIGRjY3BfZGVsYWNrX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilkYXRhOworCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKKworCWJoX2xvY2tfc29jayhzayk7CisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKKwkJLyogVHJ5IGFnYWluIGxhdGVyLiAqLworCQlpY3NrLT5pY3NrX2Fjay5ibG9ja2VkID0gMTsKKwkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfREVMQVlFREFDS0xPQ0tFRCk7CisJCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaWNzay0+aWNza19kZWxhY2tfdGltZXIsCisJCQkgICAgICAgamlmZmllcyArIFRDUF9ERUxBQ0tfTUlOKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHNrLT5za19zdGF0ZSA9PSBEQ0NQX0NMT1NFRCB8fAorCSAgICAhKGljc2stPmljc2tfYWNrLnBlbmRpbmcgJiBJQ1NLX0FDS19USU1FUikpCisJCWdvdG8gb3V0OworCWlmICh0aW1lX2FmdGVyKGljc2stPmljc2tfYWNrLnRpbWVvdXQsIGppZmZpZXMpKSB7CisJCXNrX3Jlc2V0X3RpbWVyKHNrLCAmaWNzay0+aWNza19kZWxhY2tfdGltZXIsCisJCQkgICAgICAgaWNzay0+aWNza19hY2sudGltZW91dCk7CisJCWdvdG8gb3V0OworCX0KKworCWljc2stPmljc2tfYWNrLnBlbmRpbmcgJj0gfklDU0tfQUNLX1RJTUVSOworCisJaWYgKGluZXRfY3NrX2Fja19zY2hlZHVsZWQoc2spKSB7CisJCWlmICghaWNzay0+aWNza19hY2sucGluZ3BvbmcpIHsKKwkJCS8qIERlbGF5ZWQgQUNLIG1pc3NlZDogaW5mbGF0ZSBBVE8uICovCisJCQlpY3NrLT5pY3NrX2Fjay5hdG8gPSBtaW4oaWNzay0+aWNza19hY2suYXRvIDw8IDEsCisJCQkJCQkgaWNzay0+aWNza19ydG8pOworCQl9IGVsc2UgeworCQkJLyogRGVsYXllZCBBQ0sgbWlzc2VkOiBsZWF2ZSBwaW5ncG9uZyBtb2RlIGFuZAorCQkJICogZGVmbGF0ZSBBVE8uCisJCQkgKi8KKwkJCWljc2stPmljc2tfYWNrLnBpbmdwb25nID0gMDsKKwkJCWljc2stPmljc2tfYWNrLmF0byA9IFRDUF9BVE9fTUlOOworCQl9CisJCWRjY3Bfc2VuZF9hY2soc2spOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9ERUxBWUVEQUNLUyk7CisJfQorb3V0OgorCWJoX3VubG9ja19zb2NrKHNrKTsKKwlzb2NrX3B1dChzayk7Cit9CisKK3ZvaWQgZGNjcF9pbml0X3htaXRfdGltZXJzKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbmV0X2Nza19pbml0X3htaXRfdGltZXJzKHNrLCAmZGNjcF93cml0ZV90aW1lciwgJmRjY3BfZGVsYWNrX3RpbWVyLAorCQkJCSAgJmRjY3Bfa2VlcGFsaXZlX3RpbWVyKTsKK30KZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvS2NvbmZpZyBiL25ldC9kZWNuZXQvS2NvbmZpZwppbmRleCAzNmU3MmNiLi43OTE0ZmQ2IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L0tjb25maWcKKysrIGIvbmV0L2RlY25ldC9LY29uZmlnCkBAIC00MSwxMSArNDEsMyBAQAogCiAJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RlY25ldC50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi1jb25maWcgREVDTkVUX1JPVVRFX0ZXTUFSSwotCWJvb2wgIkRFQ25ldDogdXNlIEZXTUFSSyB2YWx1ZSBhcyByb3V0aW5nIGtleSAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIERFQ05FVF9ST1VURVIgJiYgTkVURklMVEVSCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gc3BlY2lmeSBkaWZmZXJlbnQgcm91dGVzIGZvcgotCSAgcGFja2V0cyB3aXRoIGRpZmZlcmVudCBGV01BUksgKCJmaXJld2FsbGluZyBtYXJrIikgdmFsdWVzCi0JICAoc2VlIGlwY2hhaW5zKDgpLCAiLW0iIGFyZ3VtZW50KS4KLQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKaW5kZXggMzQ1NmNkMy4uMjFmMjBmMiAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYworKysgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCkBAIC0xNjYsNyArMTY2LDcgQEAKIAlpZiAoc2NwLT5hZGRyLnNkbl9mbGFncyAmIFNERl9XSUxEKQogCQlyZXR1cm4gaGxpc3RfZW1wdHkoJmRuX3dpbGRfc2spID8gJmRuX3dpbGRfc2sgOiBOVUxMOwogCi0JcmV0dXJuICZkbl9za19oYXNoW3NjcC0+YWRkcmxvYyAmIEROX1NLX0hBU0hfTUFTS107CisJcmV0dXJuICZkbl9za19oYXNoW2RuX250b2hzKHNjcC0+YWRkcmxvYykgJiBETl9TS19IQVNIX01BU0tdOwogfQogCiAvKiAKQEAgLTE4MCw3ICsxODAsNyBAQAogCWlmIChwb3J0ID09IDApCiAJCXJldHVybiAtMTsKIAotCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmZG5fc2tfaGFzaFtwb3J0ICYgRE5fU0tfSEFTSF9NQVNLXSkgeworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmZG5fc2tfaGFzaFtkbl9udG9ocyhwb3J0KSAmIEROX1NLX0hBU0hfTUFTS10pIHsKIAkJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOwogCQlpZiAoc2NwLT5hZGRybG9jID09IHBvcnQpCiAJCQlyZXR1cm4gLTE7CkBAIC0xOTQsMTIgKzE5NCwxMiBAQAogc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnQgPSAweDIwMDA7CiAJdW5zaWduZWQgc2hvcnQgaV9wb3J0ID0gcG9ydDsKIAotCXdoaWxlKGNoZWNrX3BvcnQoKytwb3J0KSAhPSAwKSB7CisJd2hpbGUoY2hlY2tfcG9ydChkbl9odG9ucygrK3BvcnQpKSAhPSAwKSB7CiAJCWlmIChwb3J0ID09IGlfcG9ydCkKIAkJCXJldHVybiAwOwogCX0KIAotCXNjcC0+YWRkcmxvYyA9IHBvcnQ7CisJc2NwLT5hZGRybG9jID0gZG5faHRvbnMocG9ydCk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTQxOCw3ICs0MTgsNyBAQAogCXN0cnVjdCBkbl9zY3AgKnNjcDsKIAogCXJlYWRfbG9jaygmZG5faGFzaF9sb2NrKTsKLQlza19mb3JfZWFjaChzaywgbm9kZSwgJmRuX3NrX2hhc2hbY2ItPmRzdF9wb3J0ICYgRE5fU0tfSEFTSF9NQVNLXSkgeworCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmZG5fc2tfaGFzaFtkbl9udG9ocyhjYi0+ZHN0X3BvcnQpICYgRE5fU0tfSEFTSF9NQVNLXSkgewogCQlzY3AgPSBETl9TSyhzayk7CiAJCWlmIChjYi0+c3JjICE9IGRuX3NhZGRyMmRuKCZzY3AtPnBlZXIpKQogCQkJY29udGludWU7CkBAIC0xMDE2LDEzICsxMDE2LDE0IEBACiAKIHN0YXRpYyB2b2lkIGRuX3VzZXJfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgb3B0ZGF0YV9kbiAqb3B0KQogewotICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHIgPSBza2ItPmRhdGE7Ci0gICAgICAgIAotICAgICAgICBvcHQtPm9wdF9vcHRsICAgPSAqcHRyKys7Ci0gICAgICAgIG9wdC0+b3B0X3N0YXR1cyA9IDA7Ci0gICAgICAgIG1lbWNweShvcHQtPm9wdF9kYXRhLCBwdHIsIG9wdC0+b3B0X29wdGwpOwotICAgICAgICBza2JfcHVsbChza2IsIGRuX250b2hzKG9wdC0+b3B0X29wdGwpICsgMSk7CisJdW5zaWduZWQgY2hhciAqcHRyID0gc2tiLT5kYXRhOworCXUxNiBsZW4gPSAqcHRyKys7IC8qIHllcywgaXQncyA4Yml0IG9uIHRoZSB3aXJlICovCiAKKwlCVUdfT04obGVuID4gMTYpOyAvKiB3ZSd2ZSBjaGVja2VkIHRoZSBjb250ZW50cyBlYXJsaWVyICovCisJb3B0LT5vcHRfb3B0bCAgID0gZG5faHRvbnMobGVuKTsKKwlvcHQtPm9wdF9zdGF0dXMgPSAwOworCW1lbWNweShvcHQtPm9wdF9kYXRhLCBwdHIsIGxlbik7CisJc2tiX3B1bGwoc2tiLCBsZW4gKyAxKTsKIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICpkbl93YWl0X2Zvcl9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgbG9uZyAqdGltZW8pCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX2Rldi5jIGIvbmV0L2RlY25ldC9kbl9kZXYuYwppbmRleCAwMTg2MWZlLi5mYzZmM2MwIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX2Rldi5jCisrKyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ3LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvZG4uaD4KICNpbmNsdWRlIDxuZXQvZG5fZGV2Lmg+CiAjaW5jbHVkZSA8bmV0L2RuX3JvdXRlLmg+CkBAIC03Myw3ICs3Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZG5fZGV2ICpkbl9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqZXJyKTsKIHN0YXRpYyB2b2lkIGRuX2Rldl9kZWxldGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBydG1zZ19pZmEoaW50IGV2ZW50LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpOworc3RhdGljIHZvaWQgZG5faWZhZGRyX25vdGlmeShpbnQgZXZlbnQsIHN0cnVjdCBkbl9pZmFkZHIgKmlmYSk7CiAKIHN0YXRpYyBpbnQgZG5fZXRoX3VwKHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIHZvaWQgZG5fZXRoX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKik7CkBAIC0xNjcsOCArMTY3LDcgQEAKIAkJCXZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiBzdGF0aWMgaW50IGRuX2ZvcndhcmRpbmdfc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAogCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sCi0JCQl2b2lkICoqY29udGV4dCk7CisJCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKTsKIAogc3RhdGljIHN0cnVjdCBkbl9kZXZfc3lzY3RsX3RhYmxlIHsKIAlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc3lzY3RsX2hlYWRlcjsKQEAgLTI1NSwxMiArMjU0LDEwIEBACiAJc3RydWN0IGRuX2Rldl9zeXNjdGxfdGFibGUgKnQ7CiAJaW50IGk7CiAKLQl0ID0ga21hbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKTsKKwl0ID0ga21lbWR1cCgmZG5fZGV2X3N5c2N0bCwgc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHQgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JbWVtY3B5KHQsICZkbl9kZXZfc3lzY3RsLCBzaXplb2YoKnQpKTsKLQogCWZvcihpID0gMDsgaSA8IEFSUkFZX1NJWkUodC0+ZG5fZGV2X3ZhcnMpIC0gMTsgaSsrKSB7CiAJCWxvbmcgb2Zmc2V0ID0gKGxvbmcpdC0+ZG5fZGV2X3ZhcnNbaV0uZGF0YTsKIAkJdC0+ZG5fZGV2X3ZhcnNbaV0uZGF0YSA9ICgoY2hhciAqKXBhcm1zKSArIG9mZnNldDsKQEAgLTM0OSw4ICszNDYsNyBAQAogCiBzdGF0aWMgaW50IGRuX2ZvcndhcmRpbmdfc3lzY3RsKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAogCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sCi0JCQl2b2lkICoqY29udGV4dCkKKwkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CiAjaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURVIKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdGFibGUtPmV4dHJhMTsKQEAgLTQ0Miw3ICs0MzgsNyBAQAogCQl9CiAJfQogCi0JcnRtc2dfaWZhKFJUTV9ERUxBRERSLCBpZmExKTsKKwlkbl9pZmFkZHJfbm90aWZ5KFJUTV9ERUxBRERSLCBpZmExKTsKIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkbmFkZHJfY2hhaW4sIE5FVERFVl9ET1dOLCBpZmExKTsKIAlpZiAoZGVzdHJveSkgewogCQlkbl9kZXZfZnJlZV9pZmEoaWZhMSk7CkBAIC00NzcsNyArNDczLDcgQEAKIAlpZmEtPmlmYV9uZXh0ID0gZG5fZGItPmlmYV9saXN0OwogCWRuX2RiLT5pZmFfbGlzdCA9IGlmYTsKIAotCXJ0bXNnX2lmYShSVE1fTkVXQUREUiwgaWZhKTsKKwlkbl9pZmFkZHJfbm90aWZ5KFJUTV9ORVdBRERSLCBpZmEpOwogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRuYWRkcl9jaGFpbiwgTkVUREVWX1VQLCBpZmEpOwogCiAJcmV0dXJuIDA7CkBAIC02NDcsNDEgKzY0Myw2MiBAQAogCXJldHVybiBkbl9kZXY7CiB9CiAKLXN0YXRpYyBpbnQgZG5fZGV2X3J0bV9kZWxhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgZG5faWZhX3BvbGljeVtJRkFfTUFYKzFdIF9fcmVhZF9tb3N0bHkgPSB7CisJW0lGQV9BRERSRVNTXQkJPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtJRkFfTE9DQUxdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0lGQV9MQUJFTF0JCT0geyAudHlwZSA9IE5MQV9TVFJJTkcsCisJCQkJICAgIC5sZW4gPSBJRk5BTVNJWiAtIDEgfSwKK307CisKK3N0YXRpYyBpbnQgZG5fbmxfZGVsYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBydGF0dHIgKipydGEgPSBhcmc7CisJc3RydWN0IG5sYXR0ciAqdGJbSUZBX01BWCsxXTsKIAlzdHJ1Y3QgZG5fZGV2ICpkbl9kYjsKLQlzdHJ1Y3QgaWZhZGRybXNnICppZm0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGlmYWRkcm1zZyAqaWZtOwogCXN0cnVjdCBkbl9pZmFkZHIgKmlmYSwgKippZmFwOworCWludCBlcnIgPSAtRUFERFJOT1RBVkFJTDsKIAorCWVyciA9IG5sbXNnX3BhcnNlKG5saCwgc2l6ZW9mKCppZm0pLCB0YiwgSUZBX01BWCwgZG5faWZhX3BvbGljeSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCisJaWZtID0gbmxtc2dfZGF0YShubGgpOwogCWlmICgoZG5fZGIgPSBkbl9kZXZfYnlfaW5kZXgoaWZtLT5pZmFfaW5kZXgpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJCWdvdG8gZXJyb3V0OwogCi0JZm9yKGlmYXAgPSAmZG5fZGItPmlmYV9saXN0OyAoaWZhPSppZmFwKSAhPSBOVUxMOyBpZmFwID0gJmlmYS0+aWZhX25leHQpIHsKLQkJdm9pZCAqdG1wID0gcnRhW0lGQV9MT0NBTC0xXTsKLQkJaWYgKCh0bXAgJiYgbWVtY21wKFJUQV9EQVRBKHRtcCksICZpZmEtPmlmYV9sb2NhbCwgMikpIHx8Ci0JCSAgICAocnRhW0lGQV9MQUJFTC0xXSAmJiBydGF0dHJfc3RyY21wKHJ0YVtJRkFfTEFCRUwtMV0sIGlmYS0+aWZhX2xhYmVsKSkpCisJZm9yIChpZmFwID0gJmRuX2RiLT5pZmFfbGlzdDsgKGlmYSA9ICppZmFwKTsgaWZhcCA9ICZpZmEtPmlmYV9uZXh0KSB7CisJCWlmICh0YltJRkFfTE9DQUxdICYmCisJCSAgICBubGFfbWVtY21wKHRiW0lGQV9MT0NBTF0sICZpZmEtPmlmYV9sb2NhbCwgMikpCisJCQljb250aW51ZTsKKworCQlpZiAodGJbSUZBX0xBQkVMXSAmJiBubGFfc3RyY21wKHRiW0lGQV9MQUJFTF0sIGlmYS0+aWZhX2xhYmVsKSkKIAkJCWNvbnRpbnVlOwogCiAJCWRuX2Rldl9kZWxfaWZhKGRuX2RiLCBpZmFwLCAxKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIC1FQUREUk5PVEFWQUlMOworZXJyb3V0OgorCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZG5fZGV2X3J0bV9uZXdhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGRuX25sX25ld2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgcnRhdHRyICoqcnRhID0gYXJnOworCXN0cnVjdCBubGF0dHIgKnRiW0lGQV9NQVgrMV07CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZG5fZGV2ICpkbl9kYjsKLQlzdHJ1Y3QgaWZhZGRybXNnICppZm0gPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGlmYWRkcm1zZyAqaWZtOwogCXN0cnVjdCBkbl9pZmFkZHIgKmlmYTsKLQlpbnQgcnY7CisJaW50IGVycjsKIAotCWlmIChydGFbSUZBX0xPQ0FMLTFdID09IE5VTEwpCisJZXJyID0gbmxtc2dfcGFyc2UobmxoLCBzaXplb2YoKmlmbSksIHRiLCBJRkFfTUFYLCBkbl9pZmFfcG9saWN5KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICh0YltJRkFfTE9DQUxdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWZtID0gbmxtc2dfZGF0YShubGgpOwogCWlmICgoZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KGlmbS0+aWZhX2luZGV4KSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTY5NSw2OSArNzEyLDc3IEBACiAJaWYgKChpZmEgPSBkbl9kZXZfYWxsb2NfaWZhKCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PQlVGUzsKIAotCWlmICghcnRhW0lGQV9BRERSRVNTIC0gMV0pCi0JCXJ0YVtJRkFfQUREUkVTUyAtIDFdID0gcnRhW0lGQV9MT0NBTCAtIDFdOwotCW1lbWNweSgmaWZhLT5pZmFfbG9jYWwsIFJUQV9EQVRBKHJ0YVtJRkFfTE9DQUwtMV0pLCAyKTsKLQltZW1jcHkoJmlmYS0+aWZhX2FkZHJlc3MsIFJUQV9EQVRBKHJ0YVtJRkFfQUREUkVTUy0xXSksIDIpOworCWlmICh0YltJRkFfQUREUkVTU10gPT0gTlVMTCkKKwkJdGJbSUZBX0FERFJFU1NdID0gdGJbSUZBX0xPQ0FMXTsKKworCWlmYS0+aWZhX2xvY2FsID0gbmxhX2dldF9sZTE2KHRiW0lGQV9MT0NBTF0pOworCWlmYS0+aWZhX2FkZHJlc3MgPSBubGFfZ2V0X2xlMTYodGJbSUZBX0FERFJFU1NdKTsKIAlpZmEtPmlmYV9mbGFncyA9IGlmbS0+aWZhX2ZsYWdzOwogCWlmYS0+aWZhX3Njb3BlID0gaWZtLT5pZmFfc2NvcGU7CiAJaWZhLT5pZmFfZGV2ID0gZG5fZGI7Ci0JaWYgKHJ0YVtJRkFfTEFCRUwtMV0pCi0JCXJ0YXR0cl9zdHJsY3B5KGlmYS0+aWZhX2xhYmVsLCBydGFbSUZBX0xBQkVMLTFdLCBJRk5BTVNJWik7CisKKwlpZiAodGJbSUZBX0xBQkVMXSkKKwkJbmxhX3N0cmxjcHkoaWZhLT5pZmFfbGFiZWwsIHRiW0lGQV9MQUJFTF0sIElGTkFNU0laKTsKIAllbHNlCiAJCW1lbWNweShpZmEtPmlmYV9sYWJlbCwgZGV2LT5uYW1lLCBJRk5BTVNJWik7CiAKLQlydiA9IGRuX2Rldl9pbnNlcnRfaWZhKGRuX2RiLCBpZmEpOwotCWlmIChydikKKwllcnIgPSBkbl9kZXZfaW5zZXJ0X2lmYShkbl9kYiwgaWZhKTsKKwlpZiAoZXJyKQogCQlkbl9kZXZfZnJlZV9pZmEoaWZhKTsKLQlyZXR1cm4gcnY7CisKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGRuX2Rldl9maWxsX2lmYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZG5faWZhZGRyICppZmEsCi0JCQkJdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaW5saW5lIHNpemVfdCBkbl9pZmFkZHJfbmxtc2dfc2l6ZSh2b2lkKQoreworCXJldHVybiBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoSUZOQU1TSVopIC8qIElGQV9MQUJFTCAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDIpIC8qIElGQV9BRERSRVNTICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMik7IC8qIElGQV9MT0NBTCAqLworfQorCitzdGF0aWMgaW50IGRuX25sX2ZpbGxfaWZhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBkbl9pZmFkZHIgKmlmYSwKKwkJCSAgICAgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGlmYWRkcm1zZyAqaWZtOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CiAKLQlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaWZtKSwgZmxhZ3MpOwotCWlmbSA9IE5MTVNHX0RBVEEobmxoKTsKKwlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaWZtKSwgZmxhZ3MpOworCWlmIChubGggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOwogCisJaWZtID0gbmxtc2dfZGF0YShubGgpOwogCWlmbS0+aWZhX2ZhbWlseSA9IEFGX0RFQ25ldDsKIAlpZm0tPmlmYV9wcmVmaXhsZW4gPSAxNjsKIAlpZm0tPmlmYV9mbGFncyA9IGlmYS0+aWZhX2ZsYWdzIHwgSUZBX0ZfUEVSTUFORU5UOwogCWlmbS0+aWZhX3Njb3BlID0gaWZhLT5pZmFfc2NvcGU7CiAJaWZtLT5pZmFfaW5kZXggPSBpZmEtPmlmYV9kZXYtPmRldi0+aWZpbmRleDsKLQlpZiAoaWZhLT5pZmFfYWRkcmVzcykKLQkJUlRBX1BVVChza2IsIElGQV9BRERSRVNTLCAyLCAmaWZhLT5pZmFfYWRkcmVzcyk7Ci0JaWYgKGlmYS0+aWZhX2xvY2FsKQotCQlSVEFfUFVUKHNrYiwgSUZBX0xPQ0FMLCAyLCAmaWZhLT5pZmFfbG9jYWwpOwotCWlmIChpZmEtPmlmYV9sYWJlbFswXSkKLQkJUlRBX1BVVChza2IsIElGQV9MQUJFTCwgSUZOQU1TSVosICZpZmEtPmlmYV9sYWJlbCk7Ci0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwotCXJldHVybiBza2ItPmxlbjsKIAotbmxtc2dfZmFpbHVyZToKLXJ0YXR0cl9mYWlsdXJlOgotICAgICAgICBza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOwotICAgICAgICByZXR1cm4gLTE7CisJaWYgKGlmYS0+aWZhX2FkZHJlc3MpCisJCU5MQV9QVVRfTEUxNihza2IsIElGQV9BRERSRVNTLCBpZmEtPmlmYV9hZGRyZXNzKTsKKwlpZiAoaWZhLT5pZmFfbG9jYWwpCisJCU5MQV9QVVRfTEUxNihza2IsIElGQV9MT0NBTCwgaWZhLT5pZmFfbG9jYWwpOworCWlmIChpZmEtPmlmYV9sYWJlbFswXSkKKwkJTkxBX1BVVF9TVFJJTkcoc2tiLCBJRkFfTEFCRUwsIGlmYS0+aWZhX2xhYmVsKTsKKworCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIG5sbXNnX2NhbmNlbChza2IsIG5saCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bXNnX2lmYShpbnQgZXZlbnQsIHN0cnVjdCBkbl9pZmFkZHIgKmlmYSkKK3N0YXRpYyB2b2lkIGRuX2lmYWRkcl9ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgZG5faWZhZGRyICppZmEpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgcGF5bG9hZCA9IHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSArIDEyODsKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAKLQlza2IgPSBhbGxvY19za2Iobmxtc2dfdG90YWxfc2l6ZShwYXlsb2FkKSwgR0ZQX0tFUk5FTCk7CisJc2tiID0gYWxsb2Nfc2tiKGRuX2lmYWRkcl9ubG1zZ19zaXplKCksIEdGUF9LRVJORUwpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKLQllcnIgPSBkbl9kZXZfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIDAsIDAsIGV2ZW50LCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXQ7Ci0JfQorCWVyciA9IGRuX25sX2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCAwLCAwLCBldmVudCwgMCk7CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBkbl9pZmFkZHJfbmxtc2dfc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0RFQ25ldF9JRkFERFIsIE5VTEwsIEdGUF9LRVJORUwpOwogZXJyb3V0OgpAQCAtNzY1LDM5ICs3OTAsNDMgQEAKIAkJcnRubF9zZXRfc2tfZXJyKFJUTkxHUlBfREVDbmV0X0lGQUREUiwgZXJyKTsKIH0KIAotc3RhdGljIGludCBkbl9kZXZfZHVtcF9pZmFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQorc3RhdGljIGludCBkbl9ubF9kdW1wX2lmYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7Ci0JaW50IGlkeCwgZG5faWR4OwotCWludCBzX2lkeCwgc19kbl9pZHg7CisJaW50IGlkeCwgZG5faWR4ID0gMCwgc2tpcF9uZGV2cywgc2tpcF9uYWRkcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBkbl9kZXYgKmRuX2RiOwogCXN0cnVjdCBkbl9pZmFkZHIgKmlmYTsKIAotCXNfaWR4ID0gY2ItPmFyZ3NbMF07Ci0Jc19kbl9pZHggPSBkbl9pZHggPSBjYi0+YXJnc1sxXTsKKwlza2lwX25kZXZzID0gY2ItPmFyZ3NbMF07CisJc2tpcF9uYWRkciA9IGNiLT5hcmdzWzFdOworCiAJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKLQlmb3IoZGV2ID0gZGV2X2Jhc2UsIGlkeCA9IDA7IGRldjsgZGV2ID0gZGV2LT5uZXh0LCBpZHgrKykgewotCQlpZiAoaWR4IDwgc19pZHgpCisJZm9yIChkZXYgPSBkZXZfYmFzZSwgaWR4ID0gMDsgZGV2OyBkZXYgPSBkZXYtPm5leHQsIGlkeCsrKSB7CisJCWlmIChpZHggPCBza2lwX25kZXZzKQogCQkJY29udGludWU7Ci0JCWlmIChpZHggPiBzX2lkeCkKLQkJCXNfZG5faWR4ID0gMDsKKwkJZWxzZSBpZiAoaWR4ID4gc2tpcF9uZGV2cykgeworCQkJLyogT25seSBza2lwIG92ZXIgYWRkcmVzc2VzIGZvciBmaXJzdCBkZXYgZHVtcGVkCisJCQkgKiBpbiB0aGlzIGl0ZXJhdGlvbiAoaWR4ID09IHNraXBfbmRldnMpICovCisJCQlza2lwX25hZGRyID0gMDsKKwkJfQorCiAJCWlmICgoZG5fZGIgPSBkZXYtPmRuX3B0cikgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCi0JCWZvcihpZmEgPSBkbl9kYi0+aWZhX2xpc3QsIGRuX2lkeCA9IDA7IGlmYTsgaWZhID0gaWZhLT5pZmFfbmV4dCwgZG5faWR4KyspIHsKLQkJCWlmIChkbl9pZHggPCBzX2RuX2lkeCkKKwkJZm9yIChpZmEgPSBkbl9kYi0+aWZhX2xpc3QsIGRuX2lkeCA9IDA7IGlmYTsKKwkJICAgICBpZmEgPSBpZmEtPmlmYV9uZXh0LCBkbl9pZHgrKykgeworCQkJaWYgKGRuX2lkeCA8IHNraXBfbmFkZHIpCiAJCQkJY29udGludWU7CiAKLQkJCWlmIChkbl9kZXZfZmlsbF9pZmFkZHIoc2tiLCBpZmEsCi0JCQkJCSAgICAgICBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKLQkJCQkJICAgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKLQkJCQkJICAgICAgIFJUTV9ORVdBRERSLAotCQkJCQkgICAgICAgTkxNX0ZfTVVMVEkpIDw9IDApCisJCQlpZiAoZG5fbmxfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgICAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdBRERSLAorCQkJCQkgICAgICBOTE1fRl9NVUxUSSkgPCAwKQogCQkJCWdvdG8gZG9uZTsKIAkJfQogCX0KIGRvbmU6CiAJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworCiAJY2ItPmFyZ3NbMF0gPSBpZHg7CiAJY2ItPmFyZ3NbMV0gPSBkbl9pZHg7CiAKQEAgLTE0MTQsOSArMTQ0Myw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgZG5ldF9ydG5ldGxpbmtfdGFibGVbUlRNX05SX01TR1RZUEVTXSA9CiB7Ci0JW1JUTV9ORVdBRERSICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9kZXZfcnRtX25ld2FkZHIsCX0sCi0JW1JUTV9ERUxBRERSICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9kZXZfcnRtX2RlbGFkZHIsCX0sCi0JW1JUTV9HRVRBRERSICAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGRuX2Rldl9kdW1wX2lmYWRkciwJfSwKKwlbUlRNX05FV0FERFIgIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGRuX25sX25ld2FkZHIsCX0sCisJW1JUTV9ERUxBRERSICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9ubF9kZWxhZGRyLAl9LAorCVtSVE1fR0VUQUREUiAgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQJPSBkbl9ubF9kdW1wX2lmYWRkciwJfSwKICNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFUgogCVtSVE1fTkVXUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gZG5fZmliX3J0bV9uZXdyb3V0ZSwJfSwKIAlbUlRNX0RFTFJPVVRFIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGRuX2ZpYl9ydG1fZGVscm91dGUsCX0sCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25laWdoLmMgYi9uZXQvZGVjbmV0L2RuX25laWdoLmMKaW5kZXggZmYwZWJlOS4uNzMyMmJiMyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uZWlnaC5jCisrKyBiL25ldC9kZWNuZXQvZG5fbmVpZ2guYwpAQCAtNTkxLDcgKzU5MSw2IEBACiAKIAlzZXEgICAgICAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc2VxLT5wcml2YXRlID0gczsKLQltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CiBvdXQ6CiAJcmV0dXJuIHJjOwogb3V0X2tmcmVlOgpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKaW5kZXggNzJlY2M2ZS4uMzlhNmNmNyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYworKysgYi9uZXQvZGVjbmV0L2RuX25zcF9pbi5jCkBAIC0zNjAsOSArMzYwLDkgQEAKIAkJCXNjcC0+bWF4X3dpbmRvdyA9IGRlY25ldF9ub19mY19tYXhfY3duZDsKIAogCQlpZiAoc2tiLT5sZW4gPiAwKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGRsZW4gPSAqc2tiLT5kYXRhOworCQkJdTE2IGRsZW4gPSAqc2tiLT5kYXRhOwogCQkJaWYgKChkbGVuIDw9IDE2KSAmJiAoZGxlbiA8PSBza2ItPmxlbikpIHsKLQkJCQlzY3AtPmNvbm5kYXRhX2luLm9wdF9vcHRsID0gZG5faHRvbnMoKF9fdTE2KWRsZW4pOworCQkJCXNjcC0+Y29ubmRhdGFfaW4ub3B0X29wdGwgPSBkbl9odG9ucyhkbGVuKTsKIAkJCQltZW1jcHkoc2NwLT5jb25uZGF0YV9pbi5vcHRfZGF0YSwgc2tiLT5kYXRhICsgMSwgZGxlbik7CiAJCQl9CiAJCX0KQEAgLTQwNCw5ICs0MDQsOSBAQAogCW1lbXNldChzY3AtPmRpc2NkYXRhX2luLm9wdF9kYXRhLCAwLCAxNik7CiAKIAlpZiAoc2tiLT5sZW4gPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgZGxlbiA9ICpza2ItPmRhdGE7CisJCXUxNiBkbGVuID0gKnNrYi0+ZGF0YTsKIAkJaWYgKChkbGVuIDw9IDE2KSAmJiAoZGxlbiA8PSBza2ItPmxlbikpIHsKLQkJCXNjcC0+ZGlzY2RhdGFfaW4ub3B0X29wdGwgPSBkbl9odG9ucygoX191MTYpZGxlbik7CisJCQlzY3AtPmRpc2NkYXRhX2luLm9wdF9vcHRsID0gZG5faHRvbnMoZGxlbik7CiAJCQltZW1jcHkoc2NwLT5kaXNjZGF0YV9pbi5vcHRfZGF0YSwgc2tiLT5kYXRhICsgMSwgZGxlbik7CiAJCX0KIAl9CkBAIC04MDQsNyArODA0LDcgQEAKIAkJCQlnb3RvIGZyZWVfb3V0OwogCQl9CiAKLQkJcmV0dXJuIHNrX3JlY2VpdmVfc2tiKHNrLCBza2IpOworCQlyZXR1cm4gc2tfcmVjZWl2ZV9za2Ioc2ssIHNrYiwgMCk7CiAJfQogCiAJcmV0dXJuIGRuX25zcF9ub19zb2NrZXQoc2tiLCByZWFzb24pOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9uc3Bfb3V0LmMgYi9uZXQvZGVjbmV0L2RuX25zcF9vdXQuYwppbmRleCBjMmUyMWNkLi5iMzQyZTRlIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX25zcF9vdXQuYworKysgYi9uZXQvZGVjbmV0L2RuX25zcF9vdXQuYwpAQCAtNTI2LDcgKzUyNiw3IEBACiAgICAgICAgIHN0cnVjdCBuc3BfY29ubl9pbml0X21zZyAqbXNnOwogCV9fdTggbGVuID0gKF9fdTgpZG5fbnRvaHMoc2NwLT5jb25uZGF0YV9vdXQub3B0X29wdGwpOwogCi0JaWYgKChza2IgPSBkbl9hbGxvY19za2Ioc2ssIDUwICsgZG5fbnRvaHMoc2NwLT5jb25uZGF0YV9vdXQub3B0X29wdGwpLCBnZnApKSA9PSBOVUxMKQorCWlmICgoc2tiID0gZG5fYWxsb2Nfc2tiKHNrLCA1MCArIGxlbiwgZ2ZwKSkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAgICAgICAgIG1zZyA9IChzdHJ1Y3QgbnNwX2Nvbm5faW5pdF9tc2cgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCptc2cpKTsKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fcm91dGUuYyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwppbmRleCBhMmE0M2Q4Li45ODgxOTMzIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKKysrIGIvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCkBAIC0yNjksOSArMjY5LDcgQEAKIHsKIAlyZXR1cm4gKChmbDEtPm5sX3UuZG5fdS5kYWRkciBeIGZsMi0+bmxfdS5kbl91LmRhZGRyKSB8CiAJCShmbDEtPm5sX3UuZG5fdS5zYWRkciBeIGZsMi0+bmxfdS5kbl91LnNhZGRyKSB8Ci0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCQkoZmwxLT5ubF91LmRuX3UuZndtYXJrIF4gZmwyLT5ubF91LmRuX3UuZndtYXJrKSB8Ci0jZW5kaWYKKwkJKGZsMS0+bWFyayBeIGZsMi0+bWFyaykgfAogCQkoZmwxLT5ubF91LmRuX3Uuc2NvcGUgXiBmbDItPm5sX3UuZG5fdS5zY29wZSkgfAogCQkoZmwxLT5vaWYgXiBmbDItPm9pZikgfAogCQkoZmwxLT5paWYgXiBmbDItPmlpZikpID09IDA7CkBAIC04ODIsMTAgKzg4MCw4IEBACiAJCQkJICAgICAgeyAuZGFkZHIgPSBvbGRmbHAtPmZsZF9kc3QsCiAJCQkJCS5zYWRkciA9IG9sZGZscC0+ZmxkX3NyYywKIAkJCQkJLnNjb3BlID0gUlRfU0NPUEVfVU5JVkVSU0UsCi0jaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURV9GV01BUksKLQkJCQkJLmZ3bWFyayA9IG9sZGZscC0+ZmxkX2Z3bWFyawotI2VuZGlmCiAJCQkJICAgICB9IH0sCisJCQkgICAgLm1hcmsgPSBvbGRmbHAtPm1hcmssCiAJCQkgICAgLmlpZiA9IGxvb3BiYWNrX2Rldi5pZmluZGV4LAogCQkJICAgIC5vaWYgPSBvbGRmbHAtPm9pZiB9OwogCXN0cnVjdCBkbl9yb3V0ZSAqcnQgPSBOVUxMOwpAQCAtOTAzLDcgKzg5OSw3IEBACiAJCSAgICAgICAiZG5fcm91dGVfb3V0cHV0X3Nsb3c6IGRzdD0lMDR4IHNyYz0lMDR4IG1hcms9JWQiCiAJCSAgICAgICAiIGlpZj0lZCBvaWY9JWRcbiIsIGRuX250b2hzKG9sZGZscC0+ZmxkX2RzdCksCiAJCSAgICAgICBkbl9udG9ocyhvbGRmbHAtPmZsZF9zcmMpLAotICAgICAgICAgICAgICAgICAgICAgICBvbGRmbHAtPmZsZF9md21hcmssIGxvb3BiYWNrX2Rldi5pZmluZGV4LCBvbGRmbHAtPm9pZik7CisgICAgICAgICAgICAgICAgICAgICAgIG9sZGZscC0+bWFyaywgbG9vcGJhY2tfZGV2LmlmaW5kZXgsIG9sZGZscC0+b2lmKTsKIAogCS8qIElmIHdlIGhhdmUgYW4gb3V0cHV0IGludGVyZmFjZSwgdmVyaWZ5IGl0cyBhIERFQ25ldCBkZXZpY2UgKi8KIAlpZiAob2xkZmxwLT5vaWYpIHsKQEAgLTExMDgsOSArMTEwNCw3IEBACiAJcnQtPmZsLmZsZF9kc3QgICAgPSBvbGRmbHAtPmZsZF9kc3Q7CiAJcnQtPmZsLm9pZiAgICAgICAgPSBvbGRmbHAtPm9pZjsKIAlydC0+ZmwuaWlmICAgICAgICA9IDA7Ci0jaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURV9GV01BUksKLQlydC0+ZmwuZmxkX2Z3bWFyayA9IG9sZGZscC0+ZmxkX2Z3bWFyazsKLSNlbmRpZgorCXJ0LT5mbC5tYXJrICAgICAgID0gb2xkZmxwLT5tYXJrOwogCiAJcnQtPnJ0X3NhZGRyICAgICAgPSBmbC5mbGRfc3JjOwogCXJ0LT5ydF9kYWRkciAgICAgID0gZmwuZmxkX2RzdDsKQEAgLTExNzgsOSArMTE3Miw3IEBACiAJCQlydCA9IHJjdV9kZXJlZmVyZW5jZShydC0+dS5ydF9uZXh0KSkgewogCQkJaWYgKChmbHAtPmZsZF9kc3QgPT0gcnQtPmZsLmZsZF9kc3QpICYmCiAJCQkgICAgKGZscC0+ZmxkX3NyYyA9PSBydC0+ZmwuZmxkX3NyYykgJiYKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSwotCQkJICAgIChmbHAtPmZsZF9md21hcmsgPT0gcnQtPmZsLmZsZF9md21hcmspICYmCi0jZW5kaWYKKwkJCSAgICAoZmxwLT5tYXJrID09IHJ0LT5mbC5tYXJrKSAmJgogCQkJICAgIChydC0+ZmwuaWlmID09IDApICYmCiAJCQkgICAgKHJ0LT5mbC5vaWYgPT0gZmxwLT5vaWYpKSB7CiAJCQkJcnQtPnUuZHN0Lmxhc3R1c2UgPSBqaWZmaWVzOwpAQCAtMTIzNSwxMCArMTIyNyw4IEBACiAJCQkJICAgICB7IC5kYWRkciA9IGNiLT5kc3QsCiAJCQkJICAgICAgIC5zYWRkciA9IGNiLT5zcmMsCiAJCQkJICAgICAgIC5zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFLAotI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCi0JCQkJICAgICAgIC5md21hcmsgPSBza2ItPm5mbWFyawotI2VuZGlmCiAJCQkJICAgIH0gfSwKKwkJCSAgICAubWFyayA9IHNrYi0+bWFyaywKIAkJCSAgICAuaWlmID0gc2tiLT5kZXYtPmlmaW5kZXggfTsKIAlzdHJ1Y3QgZG5fZmliX3JlcyByZXMgPSB7IC5maSA9IE5VTEwsIC50eXBlID0gUlROX1VOUkVBQ0hBQkxFIH07CiAJaW50IGVyciA9IC1FSU5WQUw7CkBAIC0xMjc1LDcgKzEyNjUsNiBAQAogCQkJZ290byBlX2ludmFsOwogCiAJCXJlcy50eXBlID0gUlROX0xPQ0FMOwotCQlmbGFncyB8PSBSVENGX0RJUkVDVFNSQzsKIAl9IGVsc2UgewogCQlfX2xlMTYgc3JjX21hcCA9IGZsLmZsZF9zcmM7CiAJCWZyZWVfcmVzID0gMTsKQEAgLTEzNDYsNyArMTMzNSw3IEBACiAJCQlnb3RvIG1ha2Vfcm91dGU7CiAKIAkJLyogUGFja2V0IHdhcyBpbnRyYS1ldGhlcm5ldCwgc28gd2Uga25vdyBpdHMgb24tbGluayAqLwotCQlpZiAoY2ItPnJ0X2ZsYWdzIHwgRE5fUlRfRl9JRSkgeworCQlpZiAoY2ItPnJ0X2ZsYWdzICYgRE5fUlRfRl9JRSkgewogCQkJZ2F0ZXdheSA9IGNiLT5zcmM7CiAJCQlmbGFncyB8PSBSVENGX0RJUkVDVFNSQzsKIAkJCWdvdG8gbWFrZV9yb3V0ZTsKQEAgLTEzODYsNyArMTM3NSw3IEBACiAJcnQtPmZsLmZsZF9kc3QgICAgPSBjYi0+ZHN0OwogCXJ0LT5mbC5vaWYgICAgICAgID0gMDsKIAlydC0+ZmwuaWlmICAgICAgICA9IGluX2Rldi0+aWZpbmRleDsKLQlydC0+ZmwuZmxkX2Z3bWFyayA9IGZsLmZsZF9md21hcms7CisJcnQtPmZsLm1hcmsgICAgICAgPSBmbC5tYXJrOwogCiAJcnQtPnUuZHN0LmZsYWdzID0gRFNUX0hPU1Q7CiAJcnQtPnUuZHN0Lm5laWdoYm91ciA9IG5laWdoOwpAQCAtMTQ1OCw5ICsxNDQ3LDcgQEAKIAkJaWYgKChydC0+ZmwuZmxkX3NyYyA9PSBjYi0+c3JjKSAmJgogCSAJICAgIChydC0+ZmwuZmxkX2RzdCA9PSBjYi0+ZHN0KSAmJgogCQkgICAgKHJ0LT5mbC5vaWYgPT0gMCkgJiYKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSwotCQkgICAgKHJ0LT5mbC5mbGRfZndtYXJrID09IHNrYi0+bmZtYXJrKSAmJgotI2VuZGlmCisJCSAgICAocnQtPmZsLm1hcmsgPT0gc2tiLT5tYXJrKSAmJgogCQkgICAgKHJ0LT5mbC5paWYgPT0gY2ItPmlpZikpIHsKIAkJCXJ0LT51LmRzdC5sYXN0dXNlID0gamlmZmllczsKIAkJCWRzdF9ob2xkKCZydC0+dS5kc3QpOwpAQCAtMTQ4Miw3ICsxNDY5LDcgQEAKIAlzdHJ1Y3QgcnRtc2cgKnI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKLQlzdHJ1Y3QgcnRhX2NhY2hlaW5mbyBjaTsKKwlsb25nIGV4cGlyZXM7CiAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqciksIGZsYWdzKTsKIAlyID0gTkxNU0dfREFUQShubGgpOwpAQCAtMTUxNSwxNiArMTUwMiwxMCBAQAogCQlSVEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDIsICZydC0+cnRfZ2F0ZXdheSk7CiAJaWYgKHJ0bmV0bGlua19wdXRfbWV0cmljcyhza2IsIHJ0LT51LmRzdC5tZXRyaWNzKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JY2kucnRhX2xhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHJ0LT51LmRzdC5sYXN0dXNlKTsKLQljaS5ydGFfdXNlZCAgICAgPSBydC0+dS5kc3QuX191c2U7Ci0JY2kucnRhX2NsbnRyZWYgID0gYXRvbWljX3JlYWQoJnJ0LT51LmRzdC5fX3JlZmNudCk7Ci0JaWYgKHJ0LT51LmRzdC5leHBpcmVzKQotCQljaS5ydGFfZXhwaXJlcyA9IGppZmZpZXNfdG9fY2xvY2tfdChydC0+dS5kc3QuZXhwaXJlcyAtIGppZmZpZXMpOwotCWVsc2UKLQkJY2kucnRhX2V4cGlyZXMgPSAwOwotCWNpLnJ0YV9lcnJvciAgICA9IHJ0LT51LmRzdC5lcnJvcjsKLQljaS5ydGFfaWQgICAgICAgPSBjaS5ydGFfdHMgPSBjaS5ydGFfdHNhZ2UgPSAwOwotCVJUQV9QVVQoc2tiLCBSVEFfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworCWV4cGlyZXMgPSBydC0+dS5kc3QuZXhwaXJlcyA/IHJ0LT51LmRzdC5leHBpcmVzIC0gamlmZmllcyA6IDA7CisJaWYgKHJ0bmxfcHV0X2NhY2hlaW5mbyhza2IsICZydC0+dS5kc3QsIDAsIDAsIDAsIGV4cGlyZXMsCisJCQkgICAgICAgcnQtPnUuZHN0LmVycm9yKSA8IDApCisJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CiAJaWYgKHJ0LT5mbC5paWYpCiAJCVJUQV9QVVQoc2tiLCBSVEFfSUlGLCBzaXplb2YoaW50KSwgJnJ0LT5mbC5paWYpOwogCkBAIC0xNjA1LDggKzE1ODYsNiBAQAogCWlmIChydG0tPnJ0bV9mbGFncyAmIFJUTV9GX05PVElGWSkKIAkJcnQtPnJ0X2ZsYWdzIHw9IFJUQ0ZfTk9USUZZOwogCi0JTkVUTElOS19DQihza2IpLmRzdF9waWQgPSBORVRMSU5LX0NCKGluX3NrYikucGlkOwotCiAJZXJyID0gZG5fcnRfZmlsbF9pbmZvKHNrYiwgTkVUTElOS19DQihpbl9za2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdST1VURSwgMCwgMCk7CiAKIAlpZiAoZXJyID09IDApCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3J1bGVzLmMgYi9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKaW5kZXggM2UwYzg4Mi4uZTMyZDBjMyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9ydWxlcy5jCisrKyBiL25ldC9kZWNuZXQvZG5fcnVsZXMuYwpAQCAtNDUsMTAgKzQ1LDYgQEAKIAlfX2xlMTYJCQlkc3RtYXNrOwogCV9fbGUxNgkJCXNyY21hcDsKIAl1OAkJCWZsYWdzOwotI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCi0JdTMyCQkJZndtYXJrOwotCXUzMgkJCWZ3bWFzazsKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBkbl9maWJfcnVsZSBkZWZhdWx0X3J1bGUgPSB7CkBAIC0xMTIsMzAgKzEwOCwyMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgZG5fZmliX3J1bGVfcG9saWN5W0ZSQV9NQVgrMV0gX19yZWFkX21vc3RseSA9IHsKLQlbRlJBX0lGTkFNRV0JPSB7IC50eXBlID0gTkxBX1NUUklORywgLmxlbiA9IElGTkFNU0laIC0gMSB9LAotCVtGUkFfUFJJT1JJVFldCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlGUkFfR0VORVJJQ19QT0xJQ1ksCiAJW0ZSQV9TUkNdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbRlJBX0RTVF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAotCVtGUkFfRldNQVJLXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCi0JW0ZSQV9GV01BU0tdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbRlJBX1RBQkxFXSAgICAgPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBkbl9maWJfcnVsZV9tYXRjaChzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsIHN0cnVjdCBmbG93aSAqZmwsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgZG5fZmliX3J1bGUgKnIgPSAoc3RydWN0IGRuX2ZpYl9ydWxlICopcnVsZTsKLQl1MTYgZGFkZHIgPSBmbC0+ZmxkX2RzdDsKLQl1MTYgc2FkZHIgPSBmbC0+ZmxkX3NyYzsKKwlfX2xlMTYgZGFkZHIgPSBmbC0+ZmxkX2RzdDsKKwlfX2xlMTYgc2FkZHIgPSBmbC0+ZmxkX3NyYzsKIAogCWlmICgoKHNhZGRyIF4gci0+c3JjKSAmIHItPnNyY21hc2spIHx8CiAJICAgICgoZGFkZHIgXiByLT5kc3QpICYgci0+ZHN0bWFzaykpCiAJCXJldHVybiAwOwogCi0jaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURV9GV01BUksKLQlpZiAoKHItPmZ3bWFyayBeIGZsLT5mbGRfZndtYXJrKSAmIHItPmZ3bWFzaykKLQkJcmV0dXJuIDA7Ci0jZW5kaWYKLQogCXJldHVybiAxOwogfQogCkBAIC0xNjksMjAgKzE1Niw2IEBACiAJaWYgKHRiW0ZSQV9EU1RdKQogCQlyLT5kc3QgPSBubGFfZ2V0X3UxNih0YltGUkFfRFNUXSk7CiAKLSNpZmRlZiBDT05GSUdfREVDTkVUX1JPVVRFX0ZXTUFSSwotCWlmICh0YltGUkFfRldNQVJLXSkgewotCQlyLT5md21hcmsgPSBubGFfZ2V0X3UzMih0YltGUkFfRldNQVJLXSk7Ci0JCWlmIChyLT5md21hcmspCi0JCQkvKiBjb21wYXRpYmlsaXR5OiBpZiB0aGUgbWFyayB2YWx1ZSBpcyBub24temVybyBhbGwgYml0cwotCQkJICogYXJlIGNvbXBhcmVkIHVubGVzcyBhIG1hc2sgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi0JCQkgKi8KLQkJCXItPmZ3bWFzayA9IDB4RkZGRkZGRkY7Ci0JfQotCi0JaWYgKHRiW0ZSQV9GV01BU0tdKQotCQlyLT5md21hc2sgPSBubGFfZ2V0X3UzMih0YltGUkFfRldNQVNLXSk7Ci0jZW5kaWYKLQogCXItPnNyY19sZW4gPSBmcmgtPnNyY19sZW47CiAJci0+c3JjbWFzayA9IGRuZXRfbWFrZV9tYXNrKHItPnNyY19sZW4pOwogCXItPmRzdF9sZW4gPSBmcmgtPmRzdF9sZW47CkBAIC0yMDMsMTQgKzE3Niw2IEBACiAJaWYgKGZyaC0+ZHN0X2xlbiAmJiAoci0+ZHN0X2xlbiAhPSBmcmgtPmRzdF9sZW4pKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCi0JaWYgKHRiW0ZSQV9GV01BUktdICYmIChyLT5md21hcmsgIT0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFSS10pKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodGJbRlJBX0ZXTUFTS10gJiYgKHItPmZ3bWFzayAhPSBubGFfZ2V0X3UzMih0YltGUkFfRldNQVNLXSkpKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCiAJaWYgKHRiW0ZSQV9TUkNdICYmIChyLT5zcmMgIT0gbmxhX2dldF91MTYodGJbRlJBX1NSQ10pKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTI0OCwxMiArMjEzLDYgQEAKIAlmcmgtPnNyY19sZW4gPSByLT5zcmNfbGVuOwogCWZyaC0+dG9zID0gMDsKIAotI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVfRldNQVJLCi0JaWYgKHItPmZ3bWFyaykKLQkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfRldNQVJLLCByLT5md21hcmspOwotCWlmIChyLT5md21hc2sgfHwgci0+ZndtYXJrKQotCQlOTEFfUFVUX1UzMihza2IsIEZSQV9GV01BU0ssIHItPmZ3bWFzayk7Ci0jZW5kaWYKIAlpZiAoci0+ZHN0X2xlbikKIAkJTkxBX1BVVF9VMTYoc2tiLCBGUkFfRFNULCByLT5kc3QpOwogCWlmIChyLT5zcmNfbGVuKQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl90YWJsZS5jIGIvbmV0L2RlY25ldC9kbl90YWJsZS5jCmluZGV4IDMxNzkwNGIuLjEzYjI0MjEgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fdGFibGUuYworKysgYi9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKQEAgLTc5LDcgKzc5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBkbl9maWJfdGFibGVfaGFzaFtETl9GSUJfVEFCTEVfSEFTSFNaXTsKIHN0YXRpYyBERUZJTkVfUldMT0NLKGRuX2ZpYl90YWJsZXNfbG9jayk7CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmRuX2hhc2hfa21lbSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkbl9oYXNoX2ttZW0gX19yZWFkX21vc3RseTsKIHN0YXRpYyBpbnQgZG5fZmliX2hhc2hfem9tYmllczsKIAogc3RhdGljIGlubGluZSBkbl9maWJfaWR4X3QgZG5faGFzaChkbl9maWJfa2V5X3Qga2V5LCBzdHJ1Y3QgZG5fem9uZSAqZHopCkBAIC0yNjMsNiArMjYzLDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGRuX2ZpYl9ubG1zZ19zaXplKHN0cnVjdCBkbl9maWJfaW5mbyAqZmkpCit7CisJc2l6ZV90IHBheWxvYWQgPSBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHJ0bXNnKSkKKwkJCSArIG5sYV90b3RhbF9zaXplKDQpIC8qIFJUQV9UQUJMRSAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoMikgLyogUlRBX0RTVCAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCk7IC8qIFJUQV9QUklPUklUWSAqLworCisJLyogc3BhY2UgZm9yIG5lc3RlZCBtZXRyaWNzICovCisJcGF5bG9hZCArPSBubGFfdG90YWxfc2l6ZSgoUlRBWF9NQVggKiBubGFfdG90YWxfc2l6ZSg0KSkpOworCisJaWYgKGZpLT5maWJfbmhzKSB7CisJCS8qIEFsc28gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIGZpYl9uaHMgPT0gMSAqLworCisJCS8qIGVhY2ggbmV4dGhvcCBpcyBwYWNrZWQgaW4gYW4gYXR0cmlidXRlICovCisJCXNpemVfdCBuaHNpemUgPSBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkpOworCisJCS8qIG1heSBjb250YWluIGEgZ2F0ZXdheSBhdHRyaWJ1dGUgKi8KKwkJbmhzaXplICs9IG5sYV90b3RhbF9zaXplKDQpOworCisJCS8qIGFsbCBuZXh0aG9wcyBhcmUgcGFja2VkIGluIGEgbmVzdGVkIGF0dHJpYnV0ZSAqLworCQlwYXlsb2FkICs9IG5sYV90b3RhbF9zaXplKGZpLT5maWJfbmhzICogbmhzaXplKTsKKwl9CisKKwlyZXR1cm4gcGF5bG9hZDsKK30KKwogc3RhdGljIGludCBkbl9maWJfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiB0Yl9pZCwgdTggdHlwZSwgdTggc2NvcGUsIHZvaWQgKmRzdCwgaW50IGRzdF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZG5fZmliX2luZm8gKmZpLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCkBAIC0zMzUsMTcgKzM2MSwxNSBAQAogICAgICAgICB1MzIgcGlkID0gcmVxID8gcmVxLT5waWQgOiAwOwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAotICAgICAgICBza2IgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworICAgICAgICBza2IgPSBubG1zZ19uZXcoZG5fZmliX25sbXNnX3NpemUoRE5fRklCX0lORk8oZikpLCBHRlBfS0VSTkVMKTsKICAgICAgICAgaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAogICAgICAgICBlcnIgPSBkbl9maWJfZHVtcF9pbmZvKHNrYiwgcGlkLCBubGgtPm5sbXNnX3NlcSwgZXZlbnQsIHRiX2lkLAogCQkJICAgICAgIGYtPmZuX3R5cGUsIGYtPmZuX3Njb3BlLCAmZi0+Zm5fa2V5LCB6LAogCQkJICAgICAgIEROX0ZJQl9JTkZPKGYpLCAwKTsKLQlpZiAoZXJyIDwgMCkgewotICAgICAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLSAgICAgICAgfQorCS8qIGZhaWx1cmUgaW1wbGllcyBCVUcgaW4gZG5fZmliX25sbXNnX3NpemUoKSAqLworCUJVR19PTihlcnIgPCAwKTsKIAogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgcGlkLCBSVE5MR1JQX0RFQ25ldF9ST1VURSwgbmxoLCBHRlBfS0VSTkVMKTsKIGVycm91dDoKQEAgLTU2Niw3ICs1OTAsNyBAQAogCiByZXBsYWNlOgogCWVyciA9IC1FTk9CVUZTOwotCW5ld19mID0ga21lbV9jYWNoZV9hbGxvYyhkbl9oYXNoX2ttZW0sIFNMQUJfS0VSTkVMKTsKKwluZXdfZiA9IGttZW1fY2FjaGVfYWxsb2MoZG5faGFzaF9rbWVtLCBHRlBfS0VSTkVMKTsKIAlpZiAobmV3X2YgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKQEAgLTgwNywxMCArODMxLDExIEBACiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkRFQ25ldDogQlVHISBBdHRlbXB0IHRvIGNyZWF0ZSByb3V0aW5nIHRhYmxlIGZyb20gaW50ZXJydXB0XG4iKTsgCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRuX2ZpYl90YWJsZSkgKyBzaXplb2Yoc3RydWN0IGRuX2hhc2gpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBtZW1zZXQodCwgMCwgc2l6ZW9mKHN0cnVjdCBkbl9maWJfdGFibGUpKTsKKyAgICAgICAgdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbl9maWJfdGFibGUpICsgc2l6ZW9mKHN0cnVjdCBkbl9oYXNoKSwKKwkJICAgIEdGUF9LRVJORUwpOworICAgICAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAgIHQtPm4gPSBuOwogICAgICAgICB0LT5pbnNlcnQgPSBkbl9maWJfdGFibGVfaW5zZXJ0OwpAQCAtODE4LDcgKzg0Myw2IEBACiAgICAgICAgIHQtPmxvb2t1cCA9IGRuX2ZpYl90YWJsZV9sb29rdXA7CiAgICAgICAgIHQtPmZsdXNoICA9IGRuX2ZpYl90YWJsZV9mbHVzaDsKICAgICAgICAgdC0+ZHVtcCA9IGRuX2ZpYl90YWJsZV9kdW1wOwotCW1lbXNldCh0LT5kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGRuX2hhc2gpKTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJnQtPmhsaXN0LCAmZG5fZmliX3RhYmxlX2hhc2hbaF0pOwogCiAgICAgICAgIHJldHVybiB0OwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9zeXNjdGxfbmV0X2RlY25ldC5jIGIvbmV0L2RlY25ldC9zeXNjdGxfbmV0X2RlY25ldC5jCmluZGV4IGUyNDZmMDUuLmE0MDY1ZWIgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvc3lzY3RsX25ldF9kZWNuZXQuYworKysgYi9uZXQvZGVjbmV0L3N5c2N0bF9uZXRfZGVjbmV0LmMKQEAgLTEzNCw4ICsxMzQsNyBAQAogCiBzdGF0aWMgaW50IGRuX25vZGVfYWRkcmVzc19zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAotCQkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sCi0JCQkJdm9pZCAqKmNvbnRleHQpCisJCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKIAlzaXplX3QgbGVuOwogCV9fbGUxNiBhZGRyOwpAQCAtMjIwLDggKzIxOSw3IEBACiAKIHN0YXRpYyBpbnQgZG5fZGVmX2Rldl9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKIAkJCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAotCQkJCXZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sCi0JCQkJdm9pZCAqKmNvbnRleHQpCisJCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKIAlzaXplX3QgbGVuOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmMKaW5kZXggNGJkNzhjOC4uMmQzMWJmMyAxMDA2NDQKLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jCisrKyBiL25ldC9ldGhlcm5ldC9ldGguYwpAQCAtNjAsNyArNjAsNiBAQAogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogCiBfX3NldHVwKCJldGhlcj0iLCBuZXRkZXZfYm9vdF9zZXR1cCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvS2NvbmZpZyBiL25ldC9pZWVlODAyMTEvS2NvbmZpZwppbmRleCBmN2U4NGU5Li5hNjRiZTZjIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL0tjb25maWcKKysrIGIvbmV0L2llZWU4MDIxMS9LY29uZmlnCkBAIC0zMiw2ICszMiw3IEBACiAJZGVwZW5kcyBvbiBJRUVFODAyMTEKIAlzZWxlY3QgQ1JZUFRPCiAJc2VsZWN0IENSWVBUT19BUkM0CisJc2VsZWN0IENSWVBUT19FQ0IKIAlzZWxlY3QgQ1JDMzIKIAktLS1oZWxwLS0tCiAJSW5jbHVkZSBzb2Z0d2FyZSBiYXNlZCBjaXBoZXIgc3VpdGVzIGluIHN1cHBvcnQgb2YgSUVFRQpAQCAtNTgsNiArNTksNyBAQAogCWRlcGVuZHMgb24gSUVFRTgwMjExICYmIE5FVF9SQURJTwogCXNlbGVjdCBDUllQVE8KIAlzZWxlY3QgQ1JZUFRPX01JQ0hBRUxfTUlDCisJc2VsZWN0IENSWVBUT19FQ0IKIAlzZWxlY3QgQ1JDMzIKIAktLS1oZWxwLS0tCiAJSW5jbHVkZSBzb2Z0d2FyZSBiYXNlZCBjaXBoZXIgc3VpdGVzIGluIHN1cHBvcnQgb2YgSUVFRSA4MDIuMTFpCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKaW5kZXggNDIwMGVjNS4uZmMxZjk5YSAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCmluZGV4IDFiMmVmZmYuLjdhOTVjM2QgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgogCiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwppbmRleCAxM2IxZTVmLi5iMWM2ZDFmIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtNjcsNyArNjcsNyBAQAogCQlyZXR1cm4gMDsKIAogCWllZWUtPm5ldHdvcmtzID0KLQkgICAga21hbGxvYyhNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspLAorCSAgICBremFsbG9jKE1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayksCiAJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWllZWUtPm5ldHdvcmtzKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYmVhY29uc1xuIiwKQEAgLTc1LDkgKzc1LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KGllZWUtPm5ldHdvcmtzLCAwLAotCSAgICAgICBNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMTgsNiArMTE1LDIxIEBACiAJCQkgICAgICAmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IElFRUU4MDIxMV9EQVRBX0xFTikpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZWVlODAyMTFfZ2VuZXJpY19nZXRfc3RhdHMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZpZWVlLT5zdGF0czsKK30KKwogc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CkBAIC0xMzMsNiArMTQ1LDExIEBACiAJfQogCWllZWUgPSBuZXRkZXZfcHJpdihkZXYpOwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaWVlZTgwMjExX3htaXQ7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaWVlZTgwMjExX2NoYW5nZV9tdHU7CisKKwkvKiBEcml2ZXJzIGFyZSBmcmVlIHRvIG92ZXJyaWRlIHRoaXMgaWYgdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24KKwkgKiBkb2VzIG5vdCBtZWV0IHRoZWlyIG5lZWRzLiAqLworCWRldi0+Z2V0X3N0YXRzID0gaWVlZTgwMjExX2dlbmVyaWNfZ2V0X3N0YXRzOwogCiAJaWVlZS0+ZGV2ID0gZGV2OwogCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCA3NzA3MDQxLi5kOTdlNTQxIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTQxNSwxNyArNDE1LDE2IEBACiAJICAgIGllZWUtPmhvc3RfbWNfZGVjcnlwdCA6IGllZWUtPmhvc3RfZGVjcnlwdDsKIAogCWlmIChjYW5fYmVfZGVjcnlwdGVkKSB7Ci0JCWludCBpZHggPSAwOwogCQlpZiAoc2tiLT5sZW4gPj0gaGRybGVuICsgMykgewogCQkJLyogVG9wIHR3by1iaXRzIG9mIGJ5dGUgMyBhcmUgdGhlIGtleSBpbmRleCAqLwotCQkJaWR4ID0gc2tiLT5kYXRhW2hkcmxlbiArIDNdID4+IDY7CisJCQlrZXlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKIAkJfQogCi0JCS8qIGllZWUtPmNyeXB0W10gaXMgV0VQX0tFWSAoNCkgaW4gbGVuZ3RoLiAgR2l2ZW4gdGhhdCBpZHgKLQkJICogaXMgb25seSBhbGxvd2VkIDItYml0cyBvZiBzdG9yYWdlLCBubyB2YWx1ZSBvZiBpZHggY2FuCi0JCSAqIGJlIHByb3ZpZGVkIHZpYSBhYm92ZSBjb2RlIHRoYXQgd291bGQgcmVzdWx0IGluIGlkeAorCQkvKiBpZWVlLT5jcnlwdFtdIGlzIFdFUF9LRVkgKDQpIGluIGxlbmd0aC4gIEdpdmVuIHRoYXQga2V5aWR4CisJCSAqIGlzIG9ubHkgYWxsb3dlZCAyLWJpdHMgb2Ygc3RvcmFnZSwgbm8gdmFsdWUgb2Yga2V5aWR4IGNhbgorCQkgKiBiZSBwcm92aWRlZCB2aWEgYWJvdmUgY29kZSB0aGF0IHdvdWxkIHJlc3VsdCBpbiBrZXlpZHgKIAkJICogYmVpbmcgb3V0IG9mIHJhbmdlICovCi0JCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWR4XTsKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtrZXlpZHhdOwogCiAjaWZkZWYgTk9UX1lFVAogCQlzdGEgPSBOVUxMOwpAQCAtNDc5LDYgKzQ3OCwxMSBAQAogCQkJZ290byByeF9leGl0OwogCX0KICNlbmRpZgorCS8qIGRyb3AgZHVwbGljYXRlIDgwMi4xMSByZXRyYW5zbWlzc2lvbnMgKElFRUUgODAyLjExIENoYXAuIDkuMjkpICovCisJaWYgKHNjID09IGllZWUtPnByZXZfc2VxX2N0bCkKKwkJZ290byByeF9kcm9wcGVkOworCWVsc2UKKwkJaWVlZS0+cHJldl9zZXFfY3RsID0gc2M7CiAKIAkvKiBEYXRhIGZyYW1lIC0gZXh0cmFjdCBzcmMvZHN0IGFkZHJlc3NlcyAqLwogCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV8zQUREUl9MRU4pCkBAIC02NTUsNiArNjU5LDUxIEBACiAJCWdvdG8gcnhfZHJvcHBlZDsKIAl9CiAKKwkvKiBJZiB0aGUgZnJhbWUgd2FzIGRlY3J5cHRlZCBpbiBoYXJkd2FyZSwgd2UgbWF5IG5lZWQgdG8gc3RyaXAgb2ZmCisJICogYW55IHNlY3VyaXR5IGRhdGEgKElWLCBJQ1YsIGV0YykgdGhhdCB3YXMgbGVmdCBiZWhpbmQgKi8KKwlpZiAoIWNhbl9iZV9kZWNyeXB0ZWQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSAmJgorCSAgICBpZWVlLT5ob3N0X3N0cmlwX2l2X2ljdikgeworCSAgICAJaW50IHRyaW1sZW4gPSAwOworCisJCS8qIFRvcCB0d28tYml0cyBvZiBieXRlIDMgYXJlIHRoZSBrZXkgaW5kZXggKi8KKwkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCisJCQlrZXlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKKworCQkvKiBUbyBzdHJpcCBvZmYgYW55IHNlY3VyaXR5IGRhdGEgd2hpY2ggYXBwZWFycyBiZWZvcmUgdGhlCisJCSAqIHBheWxvYWQsIHdlIHNpbXBseSBpbmNyZWFzZSBoZHJsZW4gKGFzIHRoZSBoZWFkZXIgZ2V0cworCQkgKiBjaG9wcGVkIG9mZiBpbW1lZGlhdGVseSBiZWxvdykuIEZvciB0aGUgc2VjdXJpdHkgZGF0YSB3aGljaAorCQkgKiBhcHBlYXJzIGFmdGVyIHRoZSBwYXlsb2FkLCB3ZSB1c2Ugc2tiX3RyaW0uICovCisKKwkJc3dpdGNoIChpZWVlLT5zZWMuZW5jb2RlX2FsZ1trZXlpZHhdKSB7CisJCWNhc2UgU0VDX0FMR19XRVA6CisJCQkvKiA0IGJ5dGUgSVYgKi8KKwkJCWhkcmxlbiArPSA0OworCQkJLyogNCBieXRlIElDViAqLworCQkJdHJpbWxlbiA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSBTRUNfQUxHX1RLSVA6CisJCQkvKiA0IGJ5dGUgSVYsIDQgYnl0ZSBFeHRJViAqLworCQkJaGRybGVuICs9IDg7CisJCQkvKiA4IGJ5dGUgTUlDLCA0IGJ5dGUgSUNWICovCisJCQl0cmltbGVuID0gMTI7CisJCQlicmVhazsKKwkJY2FzZSBTRUNfQUxHX0NDTVA6CisJCQkvKiA4IGJ5dGUgQ0NNUCBoZWFkZXIgKi8KKwkJCWhkcmxlbiArPSA4OworCQkJLyogOCBieXRlIE1JQyAqLworCQkJdHJpbWxlbiA9IDg7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChza2ItPmxlbiA8IHRyaW1sZW4pCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwkJX19za2JfdHJpbShza2IsIHNrYi0+bGVuIC0gdHJpbWxlbik7CisKKwkJaWYgKHNrYi0+bGVuIDwgaGRybGVuKQorCQkJZ290byByeF9kcm9wcGVkOworCX0KKwogCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIHBsYWludGV4dCBwYXlsb2FkICovCiAKIAlwYXlsb2FkID0gc2tiLT5kYXRhICsgaGRybGVuOwpAQCAtMTA3OCwxMiArMTEyNywxMiBAQAogCiAJd2hpbGUgKGxlbmd0aCA+PSBzaXplb2YoKmluZm9fZWxlbWVudCkpIHsKIAkJaWYgKHNpemVvZigqaW5mb19lbGVtZW50KSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVuZ3RoKSB7Ci0JCQlJRUVFODAyMTFfRVJST1IoIkluZm8gZWxlbTogcGFyc2UgZmFpbGVkOiAiCi0JCQkJCSJpbmZvX2VsZW1lbnQtPmxlbiArIDIgPiBsZWZ0IDogIgotCQkJCQkiaW5mb19lbGVtZW50LT5sZW4rMj0lemQgbGVmdD0lZCwgaWQ9JWQuXG4iLAotCQkJCQlpbmZvX2VsZW1lbnQtPmxlbiArCi0JCQkJCXNpemVvZigqaW5mb19lbGVtZW50KSwKLQkJCQkJbGVuZ3RoLCBpbmZvX2VsZW1lbnQtPmlkKTsKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJJbmZvIGVsZW06IHBhcnNlIGZhaWxlZDogIgorCQkJCQkgICAgICJpbmZvX2VsZW1lbnQtPmxlbiArIDIgPiBsZWZ0IDogIgorCQkJCQkgICAgICJpbmZvX2VsZW1lbnQtPmxlbisyPSV6ZCBsZWZ0PSVkLCBpZD0lZC5cbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4gKworCQkJCQkgICAgIHNpemVvZigqaW5mb19lbGVtZW50KSwKKwkJCQkJICAgICBsZW5ndGgsIGluZm9fZWxlbWVudC0+aWQpOwogCQkJLyogV2Ugc3RvcCBwcm9jZXNzaW5nIGJ1dCBkb24ndCByZXR1cm4gYW4gZXJyb3IgaGVyZQogCQkJICogYmVjYXVzZSBzb21lIG1pc2JlaGF2aW91ciBBUHMgYnJlYWsgdGhpcyBydWxlLiBpZS4KIAkJCSAqIE9yaW5vY28gQVAxMDAwLiAqLwpAQCAtMTI1NSwxMiArMTMwNCwxMSBAQAogCQljYXNlIE1GSUVfVFlQRV9JQlNTX0RGUzoKIAkJCWlmIChuZXR3b3JrLT5pYnNzX2RmcykKIAkJCQlicmVhazsKLQkJCW5ldHdvcmstPmlic3NfZGZzID0KLQkJCSAgICBrbWFsbG9jKGluZm9fZWxlbWVudC0+bGVuLCBHRlBfQVRPTUlDKTsKKwkJCW5ldHdvcmstPmlic3NfZGZzID0ga21lbWR1cChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgICAgaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkgICAgR0ZQX0FUT01JQyk7CiAJCQlpZiAoIW5ldHdvcmstPmlic3NfZGZzKQogCQkJCXJldHVybiAxOwotCQkJbWVtY3B5KG5ldHdvcmstPmlic3NfZGZzLCBpbmZvX2VsZW1lbnQtPmRhdGEsCi0JCQkgICAgICAgaW5mb19lbGVtZW50LT5sZW4pOwogCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfSUJTU19ERlM7CiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggYWUyNTQ0OS4uODU0ZmMxMyAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAkJICogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKIAkJICogZXZlbnR1YWxseSBiZSBhZmZpeGVkIHRvIHRoaXMgZnJhZ21lbnQgLS0gc28gd2UgbXVzdCBhY2NvdW50CiAJCSAqIGZvciBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KLQkJYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSBJRUVFODAyMTFfM0FERFJfTEVOOworCQlieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIGhkcl9sZW47CiAJCWlmIChpZWVlLT5jb25maWcgJgogCQkgICAgKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKIAkJCWJ5dGVzX3Blcl9mcmFnIC09IElFRUU4MDIxMV9GQ1NfTEVOOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJfSBlbHNlIHsKIAkJbnJfZnJhZ3MgPSAxOwogCQlieXRlc19wZXJfZnJhZyA9IGJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzOwotCQlmcmFnX3NpemUgPSBieXRlcyArIElFRUU4MDIxMV8zQUREUl9MRU47CisJCWZyYWdfc2l6ZSA9IGJ5dGVzICsgaGRyX2xlbjsKIAl9CiAKIAlydHNfcmVxdWlyZWQgPSAoZnJhZ19zaXplID4gaWVlZS0+cnRzCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYwppbmRleCA1ODlmNmQyLi5lM2YzN2ZkIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jCisrKyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlkcHJpbnRrKEtFUk5fSU5GTyBQRlggInNlbnQgYXNzb2NpYXRpb24gcmVxdWVzdCFcbiIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOwotCW1hYy0+YXNzb2NpYXRlZCA9IDA7IC8qIGp1c3QgdG8gbWFrZSBzdXJlICovCisJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCA9IDA7IC8qIGp1c3QgdG8gbWFrZSBzdXJlICovCiAKIAkvKiBTZXQgYSB0aW1lciBmb3IgdGltZW91dCAqLwogCS8qIEZJWE1FOiBtYWtlIHRpbWVvdXQgY29uZmlndXJhYmxlICovCkBAIC01OCwyOCArNTgsMjggQEAKIH0KIAogdm9pZAotaWVlZTgwMjExc29mdG1hY19hc3NvY190aW1lb3V0KHZvaWQgKmQpCitpZWVlODAyMTFzb2Z0bWFjX2Fzc29jX3RpbWVvdXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjID0gKHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqKWQ7CisJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICptYWMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlLAorCQkJICAgICBhc3NvY2luZm8udGltZW91dC53b3JrKTsKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19uZXR3b3JrICpuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7CisJbXV0ZXhfbG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOwogCS8qIHdlIG1pZ2h0IHJhY2UgYWdhaW5zdCBpZWVlODAyMTFzb2Z0bWFjX2hhbmRsZV9hc3NvY19yZXNwb25zZSwKIAkgKiBzbyBtYWtlIHN1cmUgb25seSBvbmUgb2YgdXMgZG9lcyBzb21ldGhpbmcgKi8KLQlpZiAoIW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQorCWlmICghbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcpCisJCWdvdG8gb3V0OwogCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMDsKIAltYWMtPmFzc29jaW5mby5ic3N2YWxpZCA9IDA7Ci0JbWFjLT5hc3NvY2lhdGVkID0gMDsKKwltYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkID0gMDsKIAogCW4gPSBpZWVlODAyMTFzb2Z0bWFjX2dldF9uZXR3b3JrX2J5X2Jzc2lkX2xvY2tlZChtYWMsIG1hYy0+YXNzb2NpbmZvLmJzc2lkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKIAogCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiYXNzb2MgcmVxdWVzdCB0aW1lZCBvdXQhXG4iKTsKIAlpZWVlODAyMTFzb2Z0bWFjX2NhbGxfZXZlbnRzKG1hYywgSUVFRTgwMjExU09GVE1BQ19FVkVOVF9BU1NPQ0lBVEVfVElNRU9VVCwgbik7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZtYWMtPmFzc29jaW5mby5tdXRleCk7CiB9CiAKIHZvaWQKQEAgLTkzLDcgKzkzLDcgQEAKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKG1hYy0+ZGV2KTsKIAotCW1hYy0+YXNzb2NpYXRlZCA9IDA7CisJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCA9IDA7CiAJbWFjLT5hc3NvY2luZm8uYnNzdmFsaWQgPSAwOwogCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMDsKIAlpZWVlODAyMTFzb2Z0bWFjX2luaXRfYnNzKG1hYyk7CkBAIC0xMDcsNyArMTA3LDcgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19uZXR3b3JrICpmb3VuZDsKIAotCWlmIChtYWMtPmFzc29jaW5mby5ic3N2YWxpZCAmJiBtYWMtPmFzc29jaWF0ZWQpIHsKKwlpZiAobWFjLT5hc3NvY2luZm8uYnNzdmFsaWQgJiYgbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCkgewogCQlmb3VuZCA9IGllZWU4MDIxMXNvZnRtYWNfZ2V0X25ldHdvcmtfYnlfYnNzaWQobWFjLCBtYWMtPmFzc29jaW5mby5ic3NpZCk7CiAJCWlmIChmb3VuZCkKIAkJCWllZWU4MDIxMXNvZnRtYWNfc2VuZF9tZ3RfZnJhbWUobWFjLCBmb3VuZCwgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DLCByZWFzb24pOwpAQCAtMTg4LDI1ICsxODgsMjggQEAKIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaGFuZGxlIHVzZXJzcGFjZSByZXF1ZXN0cyAoYXN5bmNocm9ub3VzbHkpICovCiB2b2lkCi1pZWVlODAyMTFzb2Z0bWFjX2Fzc29jX3dvcmsodm9pZCAqZCkKK2llZWU4MDIxMXNvZnRtYWNfYXNzb2Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICptYWMgPSAoc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICopZDsKKwlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKm1hYyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UsCisJCQkgICAgIGFzc29jaW5mby53b3JrLndvcmspOwogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX25ldHdvcmsgKmZvdW5kID0gTlVMTDsKIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9IE5VTEwsICpiZXN0ID0gTlVMTDsKIAlpbnQgYnNzdmFsaWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCW11dGV4X2xvY2soJm1hYy0+YXNzb2NpbmZvLm11dGV4KTsKKworCWlmICghbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcpCisJCWdvdG8gb3V0OworCiAJLyogaWVlZTgwMjExX2Rpc2Fzc29jIG1pZ2h0IGNsZWFyIHRoaXMgKi8KIAlic3N2YWxpZCA9IG1hYy0+YXNzb2NpbmZvLmJzc3ZhbGlkOwogCiAJLyogbWVoICovCi0JaWYgKG1hYy0+YXNzb2NpYXRlZCkKKwlpZiAobWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCkKIAkJaWVlZTgwMjExc29mdG1hY19zZW5kX2Rpc2Fzc29jX3JlcShtYWMsIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7Ci0JbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAxOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOwotCiAJLyogdHJ5IHRvIGZpbmQgdGhlIHJlcXVlc3RlZCBuZXR3b3JrIGluIG91ciBsaXN0LCBpZiB3ZSBmb3VuZCBvbmUgYWxyZWFkeSAqLwogCWlmIChic3N2YWxpZCB8fCBtYWMtPmFzc29jaW5mby5ic3NmaXhlZCkKIAkJZm91bmQgPSBpZWVlODAyMTFzb2Z0bWFjX2dldF9uZXR3b3JrX2J5X2Jzc2lkKG1hYywgbWFjLT5hc3NvY2luZm8uYnNzaWQpOwkKQEAgLTI2MCwxMCArMjYzLDggQEAKIAogCWlmICghZm91bmQpIHsKIAkJaWYgKG1hYy0+YXNzb2NpbmZvLnNjYW5fcmV0cnkgPiAwKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7CiAJCQltYWMtPmFzc29jaW5mby5zY2FuX3JldHJ5LS07Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKLQkJCisKIAkJCS8qIFdlIGtub3cgb2Ygbm8gc3VjaCBuZXR3b3JrLiBMZXQncyBzY2FuLiAKIAkJCSAqIE5COiB0aGlzIGFsc28gaGFwcGVucyBpZiB3ZSBoYWQgbm8gbWVtb3J5IHRvIGNvcHkgdGhlIG5ldHdvcmsgaW5mby4uLgogCQkJICogTWF5YmUgd2UgY2FuIGhvcGUgdG8gaGF2ZSBtb3JlIG1lbW9yeSBhZnRlciBzY2FubmluZyBmaW5pc2hlcyA7KQpAQCAtMjcyLDE5ICsyNzMsMTcgQEAKIAkJCWllZWU4MDIxMXNvZnRtYWNfbm90aWZ5KG1hYy0+ZGV2LCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX1NDQU5fRklOSVNIRUQsIGllZWU4MDIxMXNvZnRtYWNfYXNzb2Nfbm90aWZ5X3NjYW4sIE5VTEwpOwogCQkJaWYgKGllZWU4MDIxMXNvZnRtYWNfc3RhcnRfc2NhbihtYWMpKQogCQkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQXNzb2NpYXRlOiBmYWlsZWQgdG8gaW5pdGlhdGUgc2Nhbi4gSXMgZGV2aWNlIHVwP1xuIik7Ci0JCQlyZXR1cm47CisJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKIAkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMDsKLQkJCW1hYy0+YXNzb2NpYXRlZCA9IDA7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgPSAwOwogCiAJCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIlVuYWJsZSB0byBmaW5kIG1hdGNoaW5nIG5ldHdvcmsgYWZ0ZXIgc2NhbiFcbiIpOwogCQkJLyogcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIgZm9yIHRoZSBuZXh0IHVzZXIgcmVxdWVzdCBzaW5jZSB3ZQogCQkJICogYnJlYWsgb3V0IGFuZCBkb24ndCByZXNjaGVkdWxlIG91cnNlbHZlcyBhZnRlciB0aGlzIHBvaW50LiAqLwogCQkJbWFjLT5hc3NvY2luZm8uc2Nhbl9yZXRyeSA9IElFRUU4MDIxMVNPRlRNQUNfQVNTT0NfU0NBTl9SRVRSWV9MSU1JVDsKIAkJCWllZWU4MDIxMXNvZnRtYWNfY2FsbF9ldmVudHMobWFjLCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX0FTU09DSUFURV9ORVRfTk9UX0ZPVU5ELCBOVUxMKTsKLQkJCXJldHVybjsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogCkBAIC0yOTcsNyArMjk2LDcgQEAKIAkvKiBjb3B5IHRoZSBFU1NJRCBmb3IgZGlzcGxheWluZyBpdCAqLwogCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZV9lc3NpZC5sZW4gPSBmb3VuZC0+ZXNzaWQubGVuOwogCW1lbWNweShtYWMtPmFzc29jaW5mby5hc3NvY2lhdGVfZXNzaWQuZGF0YSwgZm91bmQtPmVzc2lkLmRhdGEsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7Ci0JCisKIAkvKiB3ZSBmb3VuZCBhIG5ldHdvcmshIGF1dGhlbnRpY2F0ZSAoaWYgbmVjZXNzYXJ5KSBhbmQgYXNzb2NpYXRlIHRvIGl0LiAqLwogCWlmIChmb3VuZC0+YXV0aGVudGljYXRpbmcpIHsKIAkJZHByaW50ayhLRVJOX0lORk8gUEZYICJBbHJlYWR5IHJlcXVlc3RlZCBhdXRoZW50aWNhdGlvbiwgd2FpdGluZy4uLlxuIik7CkBAIC0zMDUsNyArMzA0LDcgQEAKIAkJCW1hYy0+YXNzb2NpbmZvLmFzc29jX3dhaXQgPSAxOwogCQkJaWVlZTgwMjExc29mdG1hY19ub3RpZnlfaW50ZXJuYWwobWFjLCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX0FOWSwgZm91bmQsIGllZWU4MDIxMXNvZnRtYWNfYXNzb2Nfbm90aWZ5X2F1dGgsIE5VTEwsIEdGUF9LRVJORUwpOwogCQl9Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCWlmICghZm91bmQtPmF1dGhlbnRpY2F0ZWQgJiYgIWZvdW5kLT5hdXRoZW50aWNhdGluZykgewogCQkvKiBUaGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IF9hdXRoX3JlcSBvbmx5IHF1ZXVlcyB0aGUgd29yaywKQEAgLTMyMSwxMSArMzIwLDE0IEBACiAJCQltYWMtPmFzc29jaW5mby5hc3NvY193YWl0ID0gMDsKIAkJCWllZWU4MDIxMXNvZnRtYWNfY2FsbF9ldmVudHMobWFjLCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX0FTU09DSUFURV9GQUlMRUQsIGZvdW5kKTsKIAkJfQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAkvKiBmaW5hbGx5ISBub3cgd2UgY2FuIHN0YXJ0IGFzc29jaWF0aW5nICovCiAJbWFjLT5hc3NvY2luZm8uYXNzb2Nfd2FpdCA9IDA7CiAJaWVlZTgwMjExc29mdG1hY19hc3NvYyhtYWMsIGZvdW5kKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOwogfQogCiAvKiBjYWxsIHRoaXMgdG8gZG8gd2hhdGV2ZXIgaXMgbmVjZXNzYXJ5IHdoZW4gd2UncmUgYXNzb2NpYXRlZCAqLwpAQCAtMzQxLDcgKzM0Myw3IEBACiAJbWFjLT5ic3NpbmZvLnN1cHBvcnRlZF9yYXRlcyA9IG5ldC0+c3VwcG9ydGVkX3JhdGVzOwogCWllZWU4MDIxMXNvZnRtYWNfcmVjYWxjX3R4cmF0ZXMobWFjKTsKIAotCW1hYy0+YXNzb2NpYXRlZCA9IDE7CisJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCA9IDE7CiAKIAltYWMtPmFzc29jaW5mby5zaG9ydF9wcmVhbWJsZV9hdmFpbGFibGUgPQogCQkoY2FwICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKSAhPSAwOwpAQCAtNDE0LDE0ICs0MTYsMTQgQEAKIAkJCQluZXR3b3JrLT5hdXRoZW50aWNhdGVkID0gMDsKIAkJCQkvKiB3ZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgLi4uICovCiAJCQkJbmV0d29yay0+YXV0aF9kZXN5bmNlZF9vbmNlID0gMTsKLQkJCQlzY2hlZHVsZV93b3JrKCZtYWMtPmFzc29jaW5mby53b3JrKTsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1hYy0+YXNzb2NpbmZvLndvcmssIDApOwogCQkJCWJyZWFrOwogCQkJfQogCQlkZWZhdWx0OgogCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJhc3NvY2lhdGluZyBmYWlsZWQgKHJlYXNvbjogMHgleCkhXG4iLCBzdGF0dXMpOwogCQkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRpbmcgPSAwOwogCQkJbWFjLT5hc3NvY2luZm8uYnNzdmFsaWQgPSAwOwotCQkJbWFjLT5hc3NvY2lhdGVkID0gMDsKKwkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgPSAwOwogCQkJaWVlZTgwMjExc29mdG1hY19jYWxsX2V2ZW50c19sb2NrZWQobWFjLCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX0FTU09DSUFURV9GQUlMRUQsIG5ldHdvcmspOwogCX0KIAkKQEAgLTQyOSw2ICs0MzEsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZAoraWVlZTgwMjExc29mdG1hY190cnlfcmVhc3NvYyhzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKm1hYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1hYy0+YXNzb2NpbmZvLndvcmssIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworfQorCiBpbnQKIGllZWU4MDIxMXNvZnRtYWNfaGFuZGxlX2Rpc2Fzc29jKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LAogCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICpkaXNhc3NvYykKQEAgLTQ0Nyw4ICs0NjAsNyBAQAogCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiZ290IGRpc2Fzc29jIGZyYW1lXG4iKTsKIAlpZWVlODAyMTFzb2Z0bWFjX2Rpc2Fzc29jKG1hYyk7CiAKLQkvKiB0cnkgdG8gcmVhc3NvY2lhdGUgKi8KLQlzY2hlZHVsZV93b3JrKCZtYWMtPmFzc29jaW5mby53b3JrKTsKKwlpZWVlODAyMTFzb2Z0bWFjX3RyeV9yZWFzc29jKG1hYyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ2OCw3ICs0ODAsNyBAQAogCQlkcHJpbnRrbChLRVJOX0lORk8gUEZYICJyZWFzc29jIHJlcXVlc3QgZnJvbSB1bmtub3duIG5ldHdvcmtcbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0Jc2NoZWR1bGVfd29yaygmbWFjLT5hc3NvY2luZm8ud29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtYWMtPmFzc29jaW5mby53b3JrLCAwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXV0aC5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXV0aC5jCmluZGV4IDRjZWYzOWUuLjhlZDNlNTkgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2F1dGguYworKysgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hdXRoLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2luY2x1ZGUgImllZWU4MDIxMXNvZnRtYWNfcHJpdi5oIgogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFzb2Z0bWFjX2F1dGhfcXVldWUodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBpZWVlODAyMTFzb2Z0bWFjX2F1dGhfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyogUXVldWVzIGFuIGF1dGggcmVxdWVzdCB0byB0aGUgZGVzaXJlZCBBUCAqLwogaW50CkBAIC01NCwxNCArNTQsMTQgQEAKIAlhdXRoLT5tYWMgPSBtYWM7CiAJYXV0aC0+cmV0cnkgPSBJRUVFODAyMTFTT0ZUTUFDX0FVVEhfUkVUUllfTElNSVQ7CiAJYXV0aC0+c3RhdGUgPSBJRUVFODAyMTFTT0ZUTUFDX0FVVEhfT1BFTl9SRVFVRVNUOwotCUlOSVRfV09SSygmYXV0aC0+d29yaywgJmllZWU4MDIxMXNvZnRtYWNfYXV0aF9xdWV1ZSwgKHZvaWQgKilhdXRoKTsKKwlJTklUX0RFTEFZRURfV09SSygmYXV0aC0+d29yaywgaWVlZTgwMjExc29mdG1hY19hdXRoX3F1ZXVlKTsKIAkKIAkvKiBMb2NrIChmb3IgbGlzdCkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBhZGQgdG8gbGlzdCAqLwogCWxpc3RfYWRkX3RhaWwoJmF1dGgtPmxpc3QsICZtYWMtPmF1dGhfcXVldWUpOwotCXNjaGVkdWxlX3dvcmsoJmF1dGgtPndvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYXV0aC0+d29yaywgMCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7CiAJCiAJcmV0dXJuIDA7CkBAIC03MCwxNCArNzAsMTUgQEAKIAogLyogU2VuZHMgYW4gYXV0aCByZXF1ZXN0IHRvIHRoZSBkZXNpcmVkIEFQIGFuZCBoYW5kbGVzIHRpbWVvdXRzICovCiBzdGF0aWMgdm9pZAotaWVlZTgwMjExc29mdG1hY19hdXRoX3F1ZXVlKHZvaWQgKmRhdGEpCitpZWVlODAyMTFzb2Z0bWFjX2F1dGhfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjOwogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2F1dGhfcXVldWVfaXRlbSAqYXV0aDsKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19uZXR3b3JrICpuZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWF1dGggPSAoc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfYXV0aF9xdWV1ZV9pdGVtICopZGF0YTsKKwlhdXRoID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2F1dGhfcXVldWVfaXRlbSwKKwkJCSAgICB3b3JrLndvcmspOwogCW5ldCA9IGF1dGgtPm5ldDsKIAltYWMgPSBhdXRoLT5tYWM7CiAKQEAgLTExOCw5ICsxMTksMTEgQEAKIAogLyogU2VuZHMgYSByZXNwb25zZSB0byBhbiBhdXRoIGNoYWxsZW5nZSAoZm9yIHNoYXJlZCBrZXkgYXV0aCkuICovCiBzdGF0aWMgdm9pZAotaWVlZTgwMjExc29mdG1hY19hdXRoX2NoYWxsZW5nZV9yZXNwb25zZSh2b2lkICpfYXEpCitpZWVlODAyMTFzb2Z0bWFjX2F1dGhfY2hhbGxlbmdlX3Jlc3BvbnNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19hdXRoX3F1ZXVlX2l0ZW0gKmFxID0gX2FxOworCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2F1dGhfcXVldWVfaXRlbSAqYXEgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfYXV0aF9xdWV1ZV9pdGVtLAorCQkJICAgICB3b3JrLndvcmspOwogCiAJLyogU2VuZCBvdXIgcmVzcG9uc2UgKi8KIAlpZWVlODAyMTFzb2Z0bWFjX3NlbmRfbWd0X2ZyYW1lKGFxLT5tYWMsIGFxLT5uZXQsIElFRUU4MDIxMV9TVFlQRV9BVVRILCBhcS0+c3RhdGUpOwpAQCAtMTU4LDcgKzE2MSw3IEBACiAJLyogTWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGFuIGF1dGggcXVldWUgaXRlbSBmb3IgdGhpcyByZXF1ZXN0ICovCiAJaWYoYXEgPT0gTlVMTCkKIAl7Ci0JCXByaW50a2woS0VSTl9ERUJVRyBQRlggIkF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gIk1BQ19GTVQiIGJ1dCBubyBxdWV1ZSBpdGVtIGV4aXN0cy5cbiIsIE1BQ19BUkcoYXV0aC0+aGVhZGVyLmFkZHIyKSk7CisJCWRwcmludGtsKEtFUk5fREVCVUcgUEZYICJBdXRoZW50aWNhdGlvbiByZXNwb25zZSByZWNlaXZlZCBmcm9tICJNQUNfRk1UIiBidXQgbm8gcXVldWUgaXRlbSBleGlzdHMuXG4iLCBNQUNfQVJHKGF1dGgtPmhlYWRlci5hZGRyMikpOwogCQkvKiBFcnJvciAjPyAqLwogCQlyZXR1cm4gLTE7CiAJfQkJCQpAQCAtMTY2LDcgKzE2OSw3IEBACiAJLyogQ2hlY2sgZm9yIG91dCBvZiBvcmRlciBhdXRoZW50aWNhdGlvbiAqLwogCWlmKCFuZXQtPmF1dGhlbnRpY2F0aW5nKQogCXsKLQkJcHJpbnRrbChLRVJOX0RFQlVHIFBGWCAiQXV0aGVudGljYXRpb24gcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSAiTUFDX0ZNVCIgYnV0IGRpZCBub3QgcmVxdWVzdCBhdXRoZW50aWNhdGlvbi5cbiIsTUFDX0FSRyhhdXRoLT5oZWFkZXIuYWRkcjIpKTsKKwkJZHByaW50a2woS0VSTl9ERUJVRyBQRlggIkF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gIk1BQ19GTVQiIGJ1dCBkaWQgbm90IHJlcXVlc3QgYXV0aGVudGljYXRpb24uXG4iLE1BQ19BUkcoYXV0aC0+aGVhZGVyLmFkZHIyKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTIxNiwxMCArMjE5LDE2IEBACiAJCQluZXQtPmNoYWxsZW5nZV9sZW4gPSAqZGF0YSsrOyAJCiAJCQlpZiAobmV0LT5jaGFsbGVuZ2VfbGVuID4gV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4pCiAJCQkJbmV0LT5jaGFsbGVuZ2VfbGVuID0gV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU47Ci0JCQlpZiAobmV0LT5jaGFsbGVuZ2UgIT0gTlVMTCkKLQkJCQlrZnJlZShuZXQtPmNoYWxsZW5nZSk7Ci0JCQluZXQtPmNoYWxsZW5nZSA9IGttYWxsb2MobmV0LT5jaGFsbGVuZ2VfbGVuLCBHRlBfQVRPTUlDKTsKLQkJCW1lbWNweShuZXQtPmNoYWxsZW5nZSwgZGF0YSwgbmV0LT5jaGFsbGVuZ2VfbGVuKTsKKwkJCWtmcmVlKG5ldC0+Y2hhbGxlbmdlKTsKKwkJCW5ldC0+Y2hhbGxlbmdlID0ga21lbWR1cChkYXRhLCBuZXQtPmNoYWxsZW5nZV9sZW4sCisJCQkJCQkgR0ZQX0FUT01JQyk7CisJCQlpZiAobmV0LT5jaGFsbGVuZ2UgPT0gTlVMTCkgeworCQkJCXByaW50a2woS0VSTl9OT1RJQ0UgUEZYICJTaGFyZWQgS2V5ICIKKwkJCQkJIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCBkdWUgdG8gIgorCQkJCQkibWVtb3J5IHNob3J0YWdlLlxuIik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CiAJCQlhcS0+c3RhdGUgPSBJRUVFODAyMTFTT0ZUTUFDX0FVVEhfU0hBUkVEX1JFU1BPTlNFOyAKIAogCQkJLyogV2UgcmV1c2UgdGhlIHdvcmsgc3RydWN0IGZyb20gdGhlIGF1dGggcmVxdWVzdCBoZXJlLgpAQCAtMjI4LDggKzIzNyw4IEBACiAJCQkgKiB3ZSBoYXZlIG9idmlvdXNseSBhbHJlYWR5IHNlbnQgdGhlIGluaXRpYWwgYXV0aAogCQkJICogcmVxdWVzdC4gKi8KIAkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFxLT53b3JrKTsKLQkJCUlOSVRfV09SSygmYXEtPndvcmssICZpZWVlODAyMTFzb2Z0bWFjX2F1dGhfY2hhbGxlbmdlX3Jlc3BvbnNlLCAodm9pZCAqKWFxKTsKLQkJCXNjaGVkdWxlX3dvcmsoJmFxLT53b3JrKTsKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZhcS0+d29yaywgJmllZWU4MDIxMXNvZnRtYWNfYXV0aF9jaGFsbGVuZ2VfcmVzcG9uc2UpOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhcS0+d29yaywgMCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAwOwogCQljYXNlIElFRUU4MDIxMVNPRlRNQUNfQVVUSF9TSEFSRURfUEFTUzoKQEAgLTMyOCw2ICszMzcsOCBAQAogCS8qIGNhbid0IHRyYW5zbWl0IGRhdGEgcmlnaHQgbm93Li4uICovCiAJbmV0aWZfY2Fycmllcl9vZmYobWFjLT5kZXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCisJaWVlZTgwMjExc29mdG1hY190cnlfcmVhc3NvYyhtYWMpOwogfQogCiAvKiAKQEAgLTM0Miw3ICszNTMsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGUgbmV0d29yayBpcyBhdXRoZW50aWNhdGVkICovCiAJaWYgKCFuZXQtPmF1dGhlbnRpY2F0ZWQpCiAJewotCQlwcmludGtsKEtFUk5fREVCVUcgUEZYICJDYW4ndCBzZW5kIGRlYXV0aGVudGljYXRpb24gcGFja2V0LCBuZXR3b3JrIGlzIG5vdCBhdXRoZW50aWNhdGVkLlxuIik7CisJCWRwcmludGtsKEtFUk5fREVCVUcgUEZYICJDYW4ndCBzZW5kIGRlYXV0aGVudGljYXRpb24gcGFja2V0LCBuZXR3b3JrIGlzIG5vdCBhdXRoZW50aWNhdGVkLlxuIik7CiAJCS8qIEVycm9yIG9rYXk/ICovCiAJCXJldHVybiAtRVBFUk07CiAJfQpAQCAtMzc2LDcgKzM4Nyw3IEBACiAJbmV0ID0gaWVlZTgwMjExc29mdG1hY19nZXRfbmV0d29ya19ieV9ic3NpZChtYWMsIGRlYXV0aC0+aGVhZGVyLmFkZHIyKTsKIAkKIAlpZiAobmV0ID09IE5VTEwpIHsKLQkJcHJpbnRrbChLRVJOX0RFQlVHIFBGWCAiUmVjZWl2ZWQgZGVhdXRoZW50aWNhdGlvbiBwYWNrZXQgZnJvbSAiTUFDX0ZNVCIsIGJ1dCB0aGF0IG5ldHdvcmsgaXMgdW5rbm93bi5cbiIsCisJCWRwcmludGtsKEtFUk5fREVCVUcgUEZYICJSZWNlaXZlZCBkZWF1dGhlbnRpY2F0aW9uIHBhY2tldCBmcm9tICJNQUNfRk1UIiwgYnV0IHRoYXQgbmV0d29yayBpcyB1bmtub3duLlxuIiwKIAkJCU1BQ19BUkcoZGVhdXRoLT5oZWFkZXIuYWRkcjIpKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzg0LDcgKzM5NSw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBuZXR3b3JrIGlzIGF1dGhlbnRpY2F0ZWQgKi8KIAlpZighbmV0LT5hdXRoZW50aWNhdGVkKQogCXsKLQkJcHJpbnRrbChLRVJOX0RFQlVHIFBGWCAiQ2FuJ3QgcGVyZm9ybSBkZWF1dGhlbnRpY2F0aW9uLCBuZXR3b3JrIGlzIG5vdCBhdXRoZW50aWNhdGVkLlxuIik7CisJCWRwcmludGtsKEtFUk5fREVCVUcgUEZYICJDYW4ndCBwZXJmb3JtIGRlYXV0aGVudGljYXRpb24sIG5ldHdvcmsgaXMgbm90IGF1dGhlbnRpY2F0ZWQuXG4iKTsKIAkJLyogRXJyb3Igb2theT8gKi8KIAkJcmV0dXJuIC1FUEVSTTsKIAl9CkBAIC0zOTIsNiArNDAzLDYgQEAKIAlpZWVlODAyMTFzb2Z0bWFjX2RlYXV0aF9mcm9tX25ldChtYWMsIG5ldCk7CiAKIAkvKiBsZXQncyB0cnkgdG8gcmUtYXNzb2NpYXRlICovCi0Jc2NoZWR1bGVfd29yaygmbWFjLT5hc3NvY2luZm8ud29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtYWMtPmFzc29jaW5mby53b3JrLCAwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2V2ZW50LmMgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19ldmVudC5jCmluZGV4IGYzNGZhMmUuLmI5MDE1NjUgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2V2ZW50LmMKKysrIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfZXZlbnQuYwpAQCAtNzMsMTAgKzczLDEyIEBACiAKIAogc3RhdGljIHZvaWQKLWllZWU4MDIxMXNvZnRtYWNfbm90aWZ5X2NhbGxiYWNrKHZvaWQgKmQpCitpZWVlODAyMTFzb2Z0bWFjX25vdGlmeV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZXZlbnQgZXZlbnQgPSAqKHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2V2ZW50KikgZDsKLQlrZnJlZShkKTsKKwlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19ldmVudCAqcGV2ZW50ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2V2ZW50LCB3b3JrLndvcmspOworCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2V2ZW50IGV2ZW50ID0gKnBldmVudDsKKwlrZnJlZShwZXZlbnQpOwogCQogCWV2ZW50LmZ1bihldmVudC5tYWMtPmRldiwgZXZlbnQuZXZlbnRfdHlwZSwgZXZlbnQuY29udGV4dCk7CiB9CkBAIC05OSw3ICsxMDEsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAkKIAlldmVudHB0ci0+ZXZlbnRfdHlwZSA9IGV2ZW50OwotCUlOSVRfV09SSygmZXZlbnRwdHItPndvcmssIGllZWU4MDIxMXNvZnRtYWNfbm90aWZ5X2NhbGxiYWNrLCBldmVudHB0cik7CisJSU5JVF9ERUxBWUVEX1dPUksoJmV2ZW50cHRyLT53b3JrLCBpZWVlODAyMTFzb2Z0bWFjX25vdGlmeV9jYWxsYmFjayk7CiAJZXZlbnRwdHItPmZ1biA9IGZ1bjsKIAlldmVudHB0ci0+Y29udGV4dCA9IGNvbnRleHQ7CiAJZXZlbnRwdHItPm1hYyA9IG1hYzsKQEAgLTE3MCw3ICsxNzIsNyBAQAogCQkJCS8qIFVzZXIgbWF5IGhhdmUgc3Vic2NyaWJlZCB0byBBTlkgZXZlbnQsIHNvCiAJCQkJICogd2UgdGVsbCB0aGVtIHdoaWNoIGV2ZW50IHRyaWdnZXJlZCBpdC4gKi8KIAkJCQlldmVudHB0ci0+ZXZlbnRfdHlwZSA9IGV2ZW50OwotCQkJCXNjaGVkdWxlX3dvcmsoJmV2ZW50cHRyLT53b3JrKTsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmV2ZW50cHRyLT53b3JrLCAwKTsKIAkJCX0KIAkJfQogfQpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfaW8uYyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2lvLmMKaW5kZXggODJiZmRkYi4uYjk2OTMxMCAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfaW8uYworKysgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19pby5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJMiArCQkvKiBBdXRoIFRyYW5zYWN0aW9uIFNlcSAqLwogCQkyICsJCS8qIFN0YXR1cyBDb2RlICovCiAJCSAvKiBDaGFsbGVuZ2UgVGV4dCBJRSAqLwotCQlpc19zaGFyZWRfcmVzcG9uc2UgPyAwIDogMSArIDEgKyBuZXQtPmNoYWxsZW5nZV9sZW4KKwkJKGlzX3NoYXJlZF9yZXNwb25zZSA/IDEgKyAxICsgbmV0LT5jaGFsbGVuZ2VfbGVuIDogMCkKIAkpOwogCWlmICh1bmxpa2VseSgoKnBrdCkgPT0gTlVMTCkpCiAJCXJldHVybiAwOwpAQCAtNDc1LDggKzQ3NSwxMyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAotCWlmIChtYWMtPmFzc29jaWF0ZWQgJiYgbWVtY21wKG5ldHdvcmstPmJzc2lkLCBtYWMtPmFzc29jaW5mby5ic3NpZCwgRVRIX0FMRU4pID09IDApCi0JCWllZWU4MDIxMXNvZnRtYWNfcHJvY2Vzc19lcnAobWFjLCBuZXR3b3JrLT5lcnBfdmFsdWUpOworCS8qIFRoaXMgbWlnaHQgcmFjZSwgYnV0IHdlIGRvbid0IHJlYWxseSBjYXJlIGFuZCBpdCdzIG5vdCB3b3J0aAorCSAqIGFkZGluZyBoZWF2eXdlaWdodCBsb2NraW5nIGluIHRoaXMgZmFzdHBhdGguCisJICovCisJaWYgKG1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQpIHsKKwkJaWYgKG1lbWNtcChuZXR3b3JrLT5ic3NpZCwgbWFjLT5hc3NvY2luZm8uYnNzaWQsIEVUSF9BTEVOKSA9PSAwKQorCQkJaWVlZTgwMjExc29mdG1hY19wcm9jZXNzX2VycChtYWMsIG5ldHdvcmstPmVycF92YWx1ZSk7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19tb2R1bGUuYyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX21vZHVsZS5jCmluZGV4IGFkZGVhMWMuLjI1NjIwN2IgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX21vZHVsZS5jCisrKyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX21vZHVsZS5jCkBAIC01Nyw4ICs1Nyw5IEBACiAJSU5JVF9MSVNUX0hFQUQoJnNvZnRtYWMtPm5ldHdvcmtfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNvZnRtYWMtPmV2ZW50cyk7CiAKLQlJTklUX1dPUksoJnNvZnRtYWMtPmFzc29jaW5mby53b3JrLCBpZWVlODAyMTFzb2Z0bWFjX2Fzc29jX3dvcmssIHNvZnRtYWMpOwotCUlOSVRfV09SSygmc29mdG1hYy0+YXNzb2NpbmZvLnRpbWVvdXQsIGllZWU4MDIxMXNvZnRtYWNfYXNzb2NfdGltZW91dCwgc29mdG1hYyk7CisJbXV0ZXhfaW5pdCgmc29mdG1hYy0+YXNzb2NpbmZvLm11dGV4KTsKKwlJTklUX0RFTEFZRURfV09SSygmc29mdG1hYy0+YXNzb2NpbmZvLndvcmssIGllZWU4MDIxMXNvZnRtYWNfYXNzb2Nfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnNvZnRtYWMtPmFzc29jaW5mby50aW1lb3V0LCBpZWVlODAyMTFzb2Z0bWFjX2Fzc29jX3RpbWVvdXQpOwogCXNvZnRtYWMtPnN0YXJ0X3NjYW4gPSBpZWVlODAyMTFzb2Z0bWFjX3N0YXJ0X3NjYW5faW1wbGVtZW50YXRpb247CiAJc29mdG1hYy0+d2FpdF9mb3Jfc2NhbiA9IGllZWU4MDIxMXNvZnRtYWNfd2FpdF9mb3Jfc2Nhbl9pbXBsZW1lbnRhdGlvbjsKIAlzb2Z0bWFjLT5zdG9wX3NjYW4gPSBpZWVlODAyMTFzb2Z0bWFjX3N0b3Bfc2Nhbl9pbXBsZW1lbnRhdGlvbjsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3ByaXYuaCBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3ByaXYuaAppbmRleCAwNjQyZTA5Li40YzJiYmEzIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19wcml2LmgKKysrIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfcHJpdi5oCkBAIC03OCw3ICs3OCw3IEBACiAvKiBwcml2YXRlIGRlZmluaXRpb25zIGFuZCBwcm90b3R5cGVzICovCiAKIC8qKiogcHJvdG90eXBlcyBmcm9tIF9zY2FuLmMgKi8KLXZvaWQgaWVlZTgwMjExc29mdG1hY19zY2FuKHZvaWQgKnNtKTsKK3ZvaWQgaWVlZTgwMjExc29mdG1hY19zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAvKiBmb3IgaW50ZXJuYWwgdXNlIGlmIHNjYW5uaW5nIGlzIG5lZWRlZCAqLwogaW50IGllZWU4MDIxMXNvZnRtYWNfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKm1hYyk7CiB2b2lkIGllZWU4MDIxMXNvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjKTsKQEAgLTE0OSw3ICsxNDksNyBAQAogaW50IGllZWU4MDIxMXNvZnRtYWNfZGVhdXRoX3Jlc3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9kZWF1dGggKmRlYXV0aCk7CiAKIC8qKiogcHJvdG90eXBlcyBmcm9tIF9hc3NvYy5jICovCi12b2lkIGllZWU4MDIxMXNvZnRtYWNfYXNzb2Nfd29yayh2b2lkICpkKTsKK3ZvaWQgaWVlZTgwMjExc29mdG1hY19hc3NvY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBpbnQgaWVlZTgwMjExc29mdG1hY19oYW5kbGVfYXNzb2NfcmVzcG9uc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2UgKiByZXNwLAogCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrKTsKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyAqIGRpc2Fzc29jKTsKIGludCBpZWVlODAyMTFzb2Z0bWFjX2hhbmRsZV9yZWFzc29jX3JlcShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKIAkJCQkgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcmVhc3NvY19yZXF1ZXN0ICogcmVhc3NvYyk7Ci12b2lkIGllZWU4MDIxMXNvZnRtYWNfYXNzb2NfdGltZW91dCh2b2lkICpkKTsKK3ZvaWQgaWVlZTgwMjExc29mdG1hY19hc3NvY190aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGllZWU4MDIxMXNvZnRtYWNfc2VuZF9kaXNhc3NvY19yZXEoc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICptYWMsIHUxNiByZWFzb24pOwogdm9pZCBpZWVlODAyMTFzb2Z0bWFjX2Rpc2Fzc29jKHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjKTsKIApAQCAtMjA3LDcgKzIwNyw3IEBACiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlCSptYWM7CS8qIFNvZnRNQUMgZGV2aWNlICovCiAJdTggcmV0cnk7CQkJCS8qIFJldHJ5IGxpbWl0ICovCiAJdTggc3RhdGU7CQkJCS8qIEF1dGggU3RhdGUgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcms7CS8qIFdvcmsgcXVldWUgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQl3b3JrOwkvKiBXb3JrIHF1ZXVlICovCiB9OwogCiAvKiBzY2FubmluZyBpbmZvcm1hdGlvbiAqLwpAQCAtMjE5LDcgKzIxOSw4IEBACiAJICAgc3RvcDoxOwogCXU4IHNraXBfZmxhZ3M7CiAJc3RydWN0IGNvbXBsZXRpb24gZmluaXNoZWQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2NhbjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2NhbjsKKwlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKm1hYzsKIH07CiAKIC8qIHByaXZhdGUgZXZlbnQgc3RydWN0ICovCkBAIC0yMjcsNyArMjI4LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IGV2ZW50X3R5cGU7CiAJdm9pZCAqZXZlbnRfY29udGV4dDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJbm90aWZ5X2Z1bmN0aW9uX3B0ciBmdW47CiAJdm9pZCAqY29udGV4dDsKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKm1hYzsKQEAgLTIzOCw0ICsyMzksNiBAQAogaW50IGllZWU4MDIxMXNvZnRtYWNfbm90aWZ5X2ludGVybmFsKHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjLAogCWludCBldmVudCwgdm9pZCAqZXZlbnRfY29udGV4dCwgbm90aWZ5X2Z1bmN0aW9uX3B0ciBmdW4sIHZvaWQgKmNvbnRleHQsIGdmcF90IGdmcF9tYXNrKTsKIAordm9pZCBpZWVlODAyMTFzb2Z0bWFjX3RyeV9yZWFzc29jKHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjKTsKKwogI2VuZGlmIC8qIElFRUU4MDIxMVNPRlRNQUNfUFJJVl9IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfc2Nhbi5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfc2Nhbi5jCmluZGV4IGQzMWNmNzcuLjBjODVkNmMgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3NjYW4uYworKysgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19zY2FuLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKIAlzbS0+c2Nhbm5pbmcgPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtLT5sb2NrLCBmbGFncyk7CiAKLQluZXRpZl90eF9kaXNhYmxlKHNtLT5pZWVlLT5kZXYpOwogCXJldCA9IHNtLT5zdGFydF9zY2FuKHNtLT5kZXYpOwogCWlmIChyZXQpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnNtLT5sb2NrLCBmbGFncyk7CkBAIC05MSwxMiArOTAsMTQgQEAKIAogCiAvKiBpbnRlcm5hbCBzY2FubmluZyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzICovCi12b2lkIGllZWU4MDIxMXNvZnRtYWNfc2Nhbih2b2lkICpkKQordm9pZCBpZWVlODAyMTFzb2Z0bWFjX3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCBpbnZhbGlkX2NoYW5uZWw7CiAJdTggY3VycmVudF9jaGFubmVsX2lkeDsKLQlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19kZXZpY2UgKnNtID0gKHN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqKWQ7Ci0Jc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfc2NhbmluZm8gKnNpID0gc20tPnNjYW5pbmZvOworCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX3NjYW5pbmZvICpzaSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19zY2FuaW5mbywKKwkJCSAgICAgc29mdG1hY19zY2FuLndvcmspOworCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqc20gPSBzaS0+bWFjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAl3aGlsZSAoIShzaS0+c3RvcCkgJiYgKHNpLT5jdXJyZW50X2NoYW5uZWxfaWR4IDwgc2ktPm51bWJlcl9jaGFubmVscykpIHsKQEAgLTEzNSw3ICsxMzYsOCBAQAogCXNpLT5zdGFydGVkID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbS0+bG9jaywgZmxhZ3MpOwogCi0JZHByaW50ayhQRlggIlNjYW5uaW5nIGZpbmlzaGVkXG4iKTsKKwlkcHJpbnRrKFBGWCAiU2Nhbm5pbmcgZmluaXNoZWQ6IHNjYW5uZWQgJWQgY2hhbm5lbHMgc3RhcnRpbmcgd2l0aCBjaGFubmVsICVkXG4iLAorCQkgICAgIHNtLT5zY2FuaW5mby0+bnVtYmVyX2NoYW5uZWxzLCBzbS0+c2NhbmluZm8tPmNoYW5uZWxzWzBdLmNoYW5uZWwpOwogCWllZWU4MDIxMXNvZnRtYWNfc2Nhbl9maW5pc2hlZChzbSk7CiAJY29tcGxldGVfYWxsKCZzbS0+c2NhbmluZm8tPmZpbmlzaGVkKTsKIH0KQEAgLTE0Niw3ICsxNDgsOCBAQAogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX3NjYW5pbmZvICppbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfc2NhbmluZm8pLCBHRlBfQVRPTUlDKTsKIAlpZiAodW5saWtlbHkoIWluZm8pKQogCQlyZXR1cm4gTlVMTDsKLQlJTklUX1dPUksoJmluZm8tPnNvZnRtYWNfc2NhbiwgaWVlZTgwMjExc29mdG1hY19zY2FuLCBtYWMpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbmZvLT5zb2Z0bWFjX3NjYW4sIGllZWU4MDIxMXNvZnRtYWNfc2Nhbik7CisJaW5mby0+bWFjID0gbWFjOwogCWluaXRfY29tcGxldGlvbigmaW5mby0+ZmluaXNoZWQpOwogCXJldHVybiBpbmZvOwogfQpAQCAtMTgzLDEzICsxODYsMTEgQEAKIAkJc20tPnNjYW5pbmZvLT5jaGFubmVscyA9IHNtLT5pZWVlLT5nZW8uYmc7CiAJCXNtLT5zY2FuaW5mby0+bnVtYmVyX2NoYW5uZWxzID0gc20tPmllZWUtPmdlby5iZ19jaGFubmVsczsKIAl9Ci0JZHByaW50ayhQRlggIlN0YXJ0IHNjYW5uaW5nIHdpdGggY2hhbm5lbDogJWRcbiIsIHNtLT5zY2FuaW5mby0+Y2hhbm5lbHNbMF0uY2hhbm5lbCk7Ci0JZHByaW50ayhQRlggIlNjYW5uaW5nICVkIGNoYW5uZWxzXG4iLCBzbS0+c2NhbmluZm8tPm51bWJlcl9jaGFubmVscyk7CiAJc20tPnNjYW5pbmZvLT5jdXJyZW50X2NoYW5uZWxfaWR4ID0gMDsKIAlzbS0+c2NhbmluZm8tPnN0YXJ0ZWQgPSAxOwogCXNtLT5zY2FuaW5mby0+c3RvcCA9IDA7CiAJSU5JVF9DT01QTEVUSU9OKHNtLT5zY2FuaW5mby0+ZmluaXNoZWQpOwotCXNjaGVkdWxlX3dvcmsoJnNtLT5zY2FuaW5mby0+c29mdG1hY19zY2FuKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNtLT5zY2FuaW5mby0+c29mdG1hY19zY2FuLCAwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQpAQCAtMjQ4LDcgKzI0OSw2IEBACiAJCWlmIChuZXQpCiAJCQlzbS0+c2V0X2NoYW5uZWwoc20tPmRldiwgbmV0LT5jaGFubmVsKTsKIAl9Ci0JbmV0aWZfd2FrZV9xdWV1ZShzbS0+aWVlZS0+ZGV2KTsKIAlpZWVlODAyMTFzb2Z0bWFjX2NhbGxfZXZlbnRzKHNtLCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX1NDQU5fRklOSVNIRUQsIE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjExc29mdG1hY19zY2FuX2ZpbmlzaGVkKTsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3d4LmMgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY193eC5jCmluZGV4IDJhYTc3OWQuLjQ4MGQ3MmMgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3d4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfd3guYwpAQCAtNzMsMTMgKzczLDE0IEBACiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfbmV0d29yayAqbjsKIAlzdHJ1Y3QgaWVlZTgwMjExc29mdG1hY19hdXRoX3F1ZXVlX2l0ZW0gKmF1dGhwdHI7CiAJaW50IGxlbmd0aCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW11dGV4X2xvY2soJnNtLT5hc3NvY2luZm8ubXV0ZXgpOwogCiAJLyogQ2hlY2sgaWYgd2UncmUgYWxyZWFkeSBhc3NvY2lhdGluZyB0byB0aGlzIG9yIGFub3RoZXIgbmV0d29yawogCSAqIElmIGl0J3MgYW5vdGhlciBuZXR3b3JrLCBjYW5jZWwgYW5kIHN0YXJ0IG92ZXIgd2l0aCBvdXIgbmV3IG5ldHdvcmsKIAkgKiBJZiBpdCdzIG91ciBuZXR3b3JrLCBpZ25vcmUgdGhlIGNoYW5nZSwgd2UncmUgYWxyZWFkeSBkb2luZyBpdCEKIAkgKi8KLQlpZigoc20tPmFzc29jaW5mby5hc3NvY2lhdGluZyB8fCBzbS0+YXNzb2NpYXRlZCkgJiYKKwlpZigoc20tPmFzc29jaW5mby5hc3NvY2lhdGluZyB8fCBzbS0+YXNzb2NpbmZvLmFzc29jaWF0ZWQpICYmCiAJICAgKGRhdGEtPmVzc2lkLmZsYWdzICYmIGRhdGEtPmVzc2lkLmxlbmd0aCkpIHsKIAkJLyogR2V0IHRoZSBhc3NvY2lhdGluZyBuZXR3b3JrICovCiAJCW4gPSBpZWVlODAyMTFzb2Z0bWFjX2dldF9uZXR3b3JrX2J5X2Jzc2lkKHNtLCBzbS0+YXNzb2NpbmZvLmJzc2lkKTsKQEAgLTg3LDEwICs4OCw5IEBACiAJCSAgICFtZW1jbXAobi0+ZXNzaWQuZGF0YSwgZXh0cmEsIG4tPmVzc2lkLmxlbikpIHsKIAkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQWxyZWFkeSBhc3NvY2lhdGluZyBvciBhc3NvY2lhdGVkIHRvICJNQUNfRk1UIlxuIiwKIAkJCQlNQUNfQVJHKHNtLT5hc3NvY2luZm8uYnNzaWQpKTsKLQkJCXJldHVybiAwOworCQkJZ290byBvdXQ7CiAJCX0gZWxzZSB7CiAJCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNhbmNlbGluZyBleGlzdGluZyBhc3NvY2lhdGUgcmVxdWVzdCFcbiIpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNtLT5sb2NrLGZsYWdzKTsKIAkJCS8qIENhbmNlbCBhc3NvYyB3b3JrICovCiAJCQljYW5jZWxfZGVsYXllZF93b3JrKCZzbS0+YXNzb2NpbmZvLndvcmspOwogCQkJLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyB0aGlzLCBidXQgaXQncyBhIGxpdHRsZSBjbGVhbmVyICovCkBAIC05OCwxNCArOTgsMTMgQEAKIAkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZhdXRocHRyLT53b3JrKTsKIAkJCXNtLT5hc3NvY2luZm8uYnNzdmFsaWQgPSAwOwogCQkJc20tPmFzc29jaW5mby5ic3NmaXhlZCA9IDA7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbS0+bG9jayxmbGFncyk7CiAJCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCQkJc20tPmFzc29jaW5mby5hc3NvY2lhdGluZyA9IDA7CisJCQlzbS0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgPSAwOwogCQl9CiAJfQogCiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc20tPmxvY2ssIGZsYWdzKTsKLQogCXNtLT5hc3NvY2luZm8uc3RhdGljX2Vzc2lkID0gMDsKIAlzbS0+YXNzb2NpbmZvLmFzc29jX3dhaXQgPSAwOwogCkBAIC0xMjEsMTAgKzEyMCwxMiBAQAogCSAqIElmIGFwcGxpY2FibGUsIHdlIGhhdmUgYWxyZWFkeSBjb3BpZWQgdGhlIGRhdGEgaW4gKi8KIAlzbS0+YXNzb2NpbmZvLnJlcV9lc3NpZC5sZW4gPSBsZW5ndGg7CiAKKwlzbS0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMTsKIAkvKiBxdWV1ZSBsb3dlciBsZXZlbCBjb2RlIHRvIGRvIHdvcmsgKGlmIG5lY2Vzc2FyeSkgKi8KLQlzY2hlZHVsZV93b3JrKCZzbS0+YXNzb2NpbmZvLndvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc20tPmFzc29jaW5mby53b3JrLCAwKTsKK291dDoKKwltdXRleF91bmxvY2soJnNtLT5hc3NvY2luZm8ubXV0ZXgpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc20tPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMXNvZnRtYWNfd3hfc2V0X2Vzc2lkKTsKQEAgLTEzNiwxMCArMTM3LDggQEAKIAkJCSAgICAgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqc20gPSBpZWVlODAyMTFfcHJpdihuZXRfZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogYXZvaWQgZ2V0dGluZyBpbmNvbnNpc3RlbnQgaW5mb3JtYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc20tPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZzbS0+YXNzb2NpbmZvLm11dGV4KTsKIAkvKiBJZiBhbGwgZmFpbHMsIHJldHVybiBBTlkgKGVtcHR5KSAqLwogCWRhdGEtPmVzc2lkLmxlbmd0aCA9IDA7CiAJZGF0YS0+ZXNzaWQuZmxhZ3MgPSAwOyAgLyogYWN0aXZlICovCkBAIC0xNTIsMTIgKzE1MSwxMyBAQAogCX0KIAkKIAkvKiBJZiB3ZSdyZSBhc3NvY2lhdGluZy9hc3NvY2lhdGVkLCByZXR1cm4gdGhhdCAqLwotCWlmIChzbS0+YXNzb2NpYXRlZCB8fCBzbS0+YXNzb2NpbmZvLmFzc29jaWF0aW5nKSB7CisJaWYgKHNtLT5hc3NvY2luZm8uYXNzb2NpYXRlZCB8fCBzbS0+YXNzb2NpbmZvLmFzc29jaWF0aW5nKSB7CiAJCWRhdGEtPmVzc2lkLmxlbmd0aCA9IHNtLT5hc3NvY2luZm8uYXNzb2NpYXRlX2Vzc2lkLmxlbjsKIAkJZGF0YS0+ZXNzaWQuZmxhZ3MgPSAxOyAgLyogYWN0aXZlICovCiAJCW1lbWNweShleHRyYSwgc20tPmFzc29jaW5mby5hc3NvY2lhdGVfZXNzaWQuZGF0YSwgc20tPmFzc29jaW5mby5hc3NvY2lhdGVfZXNzaWQubGVuKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc20tPmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJnNtLT5hc3NvY2luZm8ubXV0ZXgpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZWVlODAyMTFzb2Z0bWFjX3d4X2dldF9lc3NpZCk7CkBAIC0zMjIsMTUgKzMyMiwxNSBAQAogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjID0gaWVlZTgwMjExX3ByaXYobmV0X2Rldik7CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZtYWMtPmFzc29jaW5mby5tdXRleCk7CiAJaWYgKG1hYy0+YXNzb2NpbmZvLmJzc3ZhbGlkKQogCQltZW1jcHkoZGF0YS0+YXBfYWRkci5zYV9kYXRhLCBtYWMtPmFzc29jaW5mby5ic3NpZCwgRVRIX0FMRU4pOwogCWVsc2UKIAkJbWVtc2V0KGRhdGEtPmFwX2FkZHIuc2FfZGF0YSwgMHhmZiwgRVRIX0FMRU4pOwogCWRhdGEtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOworCiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMXNvZnRtYWNfd3hfZ2V0X3dhcCk7CkBAIC0zNDIsMjggKzM0MiwyNyBAQAogCQkJICAgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX2RldmljZSAqbWFjID0gaWVlZTgwMjExX3ByaXYobmV0X2Rldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChkYXRhLT5hcF9hZGRyLnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOworCW11dGV4X2xvY2soJm1hYy0+YXNzb2NpbmZvLm11dGV4KTsKIAlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGF0YS0+YXBfYWRkci5zYV9kYXRhKSkgewogCQkvKiB0aGUgYnNzaWQgd2UgaGF2ZSBpcyBub3QgdG8gYmUgZml4ZWQgYW55IGxvbmdlciwKIAkJICogYW5kIHdlIHNob3VsZCByZWFzc29jaWF0ZSB0byB0aGUgYmVzdCBBUC4gKi8KIAkJbWFjLT5hc3NvY2luZm8uYnNzZml4ZWQgPSAwOwogCQkvKiBmb3JjZSByZWFzc29jaWF0aW9uICovCiAJCW1hYy0+YXNzb2NpbmZvLmJzc3ZhbGlkID0gMDsKLQkJaWYgKG1hYy0+YXNzb2NpYXRlZCkKLQkJCXNjaGVkdWxlX3dvcmsoJm1hYy0+YXNzb2NpbmZvLndvcmspOworCQlpZiAobWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCkKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbWFjLT5hc3NvY2luZm8ud29yaywgMCk7CiAJfSBlbHNlIGlmIChpc196ZXJvX2V0aGVyX2FkZHIoZGF0YS0+YXBfYWRkci5zYV9kYXRhKSkgewogCQkvKiB0aGUgYnNzaWQgd2UgaGF2ZSBpcyBubyBsb25nZXIgZml4ZWQgKi8KIAkJbWFjLT5hc3NvY2luZm8uYnNzZml4ZWQgPSAwOwogICAgICAgICB9IGVsc2UgewogCQlpZiAoIW1lbWNtcChtYWMtPmFzc29jaW5mby5ic3NpZCwgZGF0YS0+YXBfYWRkci5zYV9kYXRhLCBFVEhfQUxFTikpIHsKLQkJCWlmIChtYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZyB8fCBtYWMtPmFzc29jaWF0ZWQpIHsKKwkJCWlmIChtYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZyB8fCBtYWMtPmFzc29jaW5mby5hc3NvY2lhdGVkKSB7CiAJCQkvKiBic3NpZCB1bmNoYW5nZWQgYW5kIGFzc29jaWF0ZWQgb3IgYXNzb2NpYXRpbmcgLSBqdXN0IHJldHVybiAqLwogCQkJCWdvdG8gb3V0OwogCQkJfQpAQCAtMzc0LDExICszNzMsMTIgQEAKIAkJLyogdGVsbCB0aGUgb3RoZXIgY29kZSB0aGF0IHRoaXMgYnNzaWQgc2hvdWxkIGJlIHVzZWQgbm8gbWF0dGVyIHdoYXQgKi8KIAkJbWFjLT5hc3NvY2luZm8uYnNzZml4ZWQgPSAxOwogCQkvKiBxdWV1ZSBhc3NvY2lhdGUgaWYgbmV3IGJzc2lkIG9yIChvbGQgb25lIGFnYWluIGFuZCBub3QgYXNzb2NpYXRlZCkgKi8KLQkJc2NoZWR1bGVfd29yaygmbWFjLT5hc3NvY2luZm8ud29yayk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbWFjLT5hc3NvY2luZm8ud29yaywgMCk7CiAgICAgICAgIH0KIAogIG91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJm1hYy0+YXNzb2NpbmZvLm11dGV4KTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjExc29mdG1hY193eF9zZXRfd2FwKTsKQEAgLTM5NCw3ICszOTQsOCBAQAogCWludCBlcnIgPSAwOwogCWNoYXIgKmJ1ZjsKIAlpbnQgaTsKLQkKKworCW11dGV4X2xvY2soJm1hYy0+YXNzb2NpbmZvLm11dGV4KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5sb2NrLCBmbGFncyk7CiAJLyogYmxlaC4gc2hvdWxkbid0IGJlIGxvY2tlZCBmb3IgdGhhdCBrbWFsbG9jLi4uICovCiAKQEAgLTQzMiw2ICs0MzMsOCBAQAogCiAgb3V0OgkKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJm1hYy0+YXNzb2NpbmZvLm11dGV4KTsKKwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZWVlODAyMTFzb2Z0bWFjX3d4X3NldF9nZW5pZSk7CkBAIC00NDYsNyArNDQ5LDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnIgPSAwOwogCWludCBzcGFjZSA9IHdycXUtPmRhdGEubGVuZ3RoOwotCQorCisJbXV0ZXhfbG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKIAkKIAl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7CkBAIC00NTksNiArNDYzLDggQEAKIAkJCWVyciA9IC1FMkJJRzsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjLT5sb2NrLCBmbGFncyk7CisJbXV0ZXhfbG9jaygmbWFjLT5hc3NvY2luZm8ubXV0ZXgpOworCiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMXNvZnRtYWNfd3hfZ2V0X2dlbmllKTsKQEAgLTQ3MywxMCArNDc5LDEzIEBACiAJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKilleHRyYTsKIAl1MTYgcmVhc29uID0gY3B1X3RvX2xlMTYobWxtZS0+cmVhc29uX2NvZGUpOwogCXN0cnVjdCBpZWVlODAyMTFzb2Z0bWFjX25ldHdvcmsgKm5ldDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJm1hYy0+YXNzb2NpbmZvLm11dGV4KTsKIAogCWlmIChtZW1jbXAobWFjLT5hc3NvY2luZm8uYnNzaWQsIG1sbWUtPmFkZHIuc2FfZGF0YSwgRVRIX0FMRU4pKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAid3hfc2V0X21sbWU6IHJlcXVlc3RlZCBvcGVyYXRpb24gb24gbmV0IHdlIGRvbid0IHVzZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dDsKIAl9CiAKIAlzd2l0Y2ggKG1sbWUtPmNtZCkgewpAQCAtNDg0LDE0ICs0OTMsMjMgQEAKIAkJbmV0ID0gaWVlZTgwMjExc29mdG1hY19nZXRfbmV0d29ya19ieV9ic3NpZF9sb2NrZWQobWFjLCBtbG1lLT5hZGRyLnNhX2RhdGEpOwogCQlpZiAoIW5ldCkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJ3eF9zZXRfbWxtZTogd2Ugc2hvdWxkIGtub3cgdGhlIG5ldCBoZXJlLi4uXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJZ290byBvdXQ7CiAJCX0KLQkJcmV0dXJuIGllZWU4MDIxMXNvZnRtYWNfZGVhdXRoX3JlcShtYWMsIG5ldCwgcmVhc29uKTsKKwkJZXJyID0gIGllZWU4MDIxMXNvZnRtYWNfZGVhdXRoX3JlcShtYWMsIG5ldCwgcmVhc29uKTsKKwkJZ290byBvdXQ7CiAJY2FzZSBJV19NTE1FX0RJU0FTU09DOgogCQlpZWVlODAyMTFzb2Z0bWFjX3NlbmRfZGlzYXNzb2NfcmVxKG1hYywgcmVhc29uKTsKLQkJcmV0dXJuIDA7CisJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0ZWQgPSAwOworCQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZyA9IDA7CisJCWVyciA9IDA7CisJCWdvdG8gb3V0OwogCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CiAJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZtYWMtPmFzc29jaW5mby5tdXRleCk7CisKKwlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjExc29mdG1hY193eF9zZXRfbWxtZSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9LY29uZmlnIGIvbmV0L2lwdjQvS2NvbmZpZwppbmRleCA1NTcyMDcxLi41MDNlNzA1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9LY29uZmlnCisrKyBiL25ldC9pcHY0L0tjb25maWcKQEAgLTEwNCwxMyArMTA0LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX1JPVVRFX0ZXTUFSSwotCWJvb2wgIklQOiB1c2UgbmV0ZmlsdGVyIE1BUksgdmFsdWUgYXMgcm91dGluZyBrZXkiCi0JZGVwZW5kcyBvbiBJUF9NVUxUSVBMRV9UQUJMRVMgJiYgTkVURklMVEVSCi0JaGVscAotCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gc3BlY2lmeSBkaWZmZXJlbnQgcm91dGVzIGZvcgotCSAgcGFja2V0cyB3aXRoIGRpZmZlcmVudCBtYXJrIHZhbHVlcyAoc2VlIGlwdGFibGVzKDgpLCBNQVJLIHRhcmdldCkuCi0KIGNvbmZpZyBJUF9ST1VURV9NVUxUSVBBVEgKIAlib29sICJJUDogZXF1YWwgY29zdCBtdWx0aXBhdGgiCiAJZGVwZW5kcyBvbiBJUF9BRFZBTkNFRF9ST1VURVIKQEAgLTYyNSw1ICs2MTgsMTcgQEAKIAlkZWZhdWx0ICJyZW5vIiBpZiBERUZBVUxUX1JFTk8KIAlkZWZhdWx0ICJjdWJpYyIKIAorY29uZmlnIFRDUF9NRDVTSUcKKwlib29sICJUQ1A6IE1ENSBTaWduYXR1cmUgT3B0aW9uIHN1cHBvcnQgKFJGQzIzODUpIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fTUQ1CisJLS0taGVscC0tLQorCSAgUkZDMjM4NSBzcGVjaWZpY2VzIGEgbWV0aG9kIG9mIGdpdmluZyBNRDUgcHJvdGVjdGlvbiB0byBUQ1Agc2Vzc2lvbnMuCisJICBJdHMgbWFpbiAob25seT8pIHVzZSBpcyB0byBwcm90ZWN0IEJHUCBzZXNzaW9ucyBiZXR3ZWVuIGNvcmUgcm91dGVycworCSAgb24gdGhlIEludGVybmV0LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBzb3VyY2UgIm5ldC9pcHY0L2lwdnMvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvTWFrZWZpbGUgYi9uZXQvaXB2NC9NYWtlZmlsZQppbmRleCAxNTY0NWM1Li43YTA2ODYyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9NYWtlZmlsZQpAQCAtOCw3ICs4LDggQEAKIAkgICAgIGluZXRfdGltZXdhaXRfc29jay5vIGluZXRfY29ubmVjdGlvbl9zb2NrLm8gXAogCSAgICAgdGNwLm8gdGNwX2lucHV0Lm8gdGNwX291dHB1dC5vIHRjcF90aW1lci5vIHRjcF9pcHY0Lm8gXAogCSAgICAgdGNwX21pbmlzb2Nrcy5vIHRjcF9jb25nLm8gXAotCSAgICAgZGF0YWdyYW0ubyByYXcubyB1ZHAubyBhcnAubyBpY21wLm8gZGV2aW5ldC5vIGFmX2luZXQubyBpZ21wLm8gXAorCSAgICAgZGF0YWdyYW0ubyByYXcubyB1ZHAubyB1ZHBsaXRlLm8gXAorCSAgICAgYXJwLm8gaWNtcC5vIGRldmluZXQubyBhZl9pbmV0Lm8gIGlnbXAubyBcCiAJICAgICBzeXNjdGxfbmV0X2lwdjQubyBmaWJfZnJvbnRlbmQubyBmaWJfc2VtYW50aWNzLm8KIAogb2JqLSQoQ09ORklHX0lQX0ZJQl9IQVNIKSArPSBmaWJfaGFzaC5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggZWRjZjA5My4uMTE0NDkwMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtMTA0LDYgKzEwNCw3IEBACiAjaW5jbHVkZSA8bmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvdWRwbGl0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3Jhdy5oPgpAQCAtMjA0LDcgKzIwNSw3IEBACiAJICogd2UgY2FuIG9ubHkgYWxsb3cgdGhlIGJhY2tsb2cgdG8gYmUgYWRqdXN0ZWQuCiAJICovCiAJaWYgKG9sZF9zdGF0ZSAhPSBUQ1BfTElTVEVOKSB7Ci0JCWVyciA9IGluZXRfY3NrX2xpc3Rlbl9zdGFydChzaywgVENQX1NZTlFfSFNJWkUpOworCQllcnIgPSBpbmV0X2Nza19saXN0ZW5fc3RhcnQoc2ssIGJhY2tsb2cpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtNjQzLDcgKzY0NCw3IEBACiAJCXNpbi0+c2luX3BvcnQgPSBpbmV0LT5kcG9ydDsKIAkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpbmV0LT5kYWRkcjsKIAl9IGVsc2UgewotCQlfX3UzMiBhZGRyID0gaW5ldC0+cmN2X3NhZGRyOworCQlfX2JlMzIgYWRkciA9IGluZXQtPnJjdl9zYWRkcjsKIAkJaWYgKCFhZGRyKQogCQkJYWRkciA9IGluZXQtPnNhZGRyOwogCQlzaW4tPnNpbl9wb3J0ID0gaW5ldC0+c3BvcnQ7CkBAIC05OTQsOCArOTk1LDggQEAKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJaW50IGVycjsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKLQlfX3UzMiBvbGRfc2FkZHIgPSBpbmV0LT5zYWRkcjsKLQlfX3UzMiBuZXdfc2FkZHI7CisJX19iZTMyIG9sZF9zYWRkciA9IGluZXQtPnNhZGRyOworCV9fYmUzMiBuZXdfc2FkZHI7CiAJX19iZTMyIGRhZGRyID0gaW5ldC0+ZGFkZHI7CiAKIAlpZiAoaW5ldC0+b3B0ICYmIGluZXQtPm9wdC0+c3JyKQpAQCAtMTIyMywxMCArMTIyNCwxMyBAQAogCXRjcF9zdGF0aXN0aWNzWzFdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB0Y3BfbWliKTsKIAl1ZHBfc3RhdGlzdGljc1swXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdWRwX21pYik7CiAJdWRwX3N0YXRpc3RpY3NbMV0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHVkcF9taWIpOworCXVkcGxpdGVfc3RhdGlzdGljc1swXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdWRwX21pYik7CisJdWRwbGl0ZV9zdGF0aXN0aWNzWzFdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKIAlpZiAoIQogCSAgICAobmV0X3N0YXRpc3RpY3NbMF0gJiYgbmV0X3N0YXRpc3RpY3NbMV0gJiYgaXBfc3RhdGlzdGljc1swXQogCSAgICAgJiYgaXBfc3RhdGlzdGljc1sxXSAmJiB0Y3Bfc3RhdGlzdGljc1swXSAmJiB0Y3Bfc3RhdGlzdGljc1sxXQotCSAgICAgJiYgdWRwX3N0YXRpc3RpY3NbMF0gJiYgdWRwX3N0YXRpc3RpY3NbMV0pKQorCSAgICAgJiYgdWRwX3N0YXRpc3RpY3NbMF0gJiYgdWRwX3N0YXRpc3RpY3NbMV0KKwkgICAgICYmIHVkcGxpdGVfc3RhdGlzdGljc1swXSAmJiB1ZHBsaXRlX3N0YXRpc3RpY3NbMV0gICAgICAgICAgICAgKSApCiAJCXJldHVybiAtRU5PTUVNOwogCiAJKHZvaWQpIHRjcF9taWJfaW5pdCgpOwpAQCAtMTMxMyw2ICsxMzE3LDggQEAKIAkvKiBTZXR1cCBUQ1Agc2xhYiBjYWNoZSBmb3Igb3BlbiByZXF1ZXN0cy4gKi8KIAl0Y3BfaW5pdCgpOwogCisJLyogQWRkIFVEUC1MaXRlIChSRkMgMzgyOCkgKi8KKwl1ZHBsaXRlNF9yZWdpc3RlcigpOwogCiAJLyoKIAkgKglTZXQgdGhlIElDTVAgbGF5ZXIgdXAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FoNC5jIGIvbmV0L2lwdjQvYWg0LmMKaW5kZXggOTk1NDI5Ny4uNjdhNTUwOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWg0LmMKKysrIGIvbmV0L2lwdjQvYWg0LmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGludG8gSVAgaGVhZGVyIGZvciBpY3YgY2FsY3VsYXRpb24uIE9wdGlvbnMgYXJlIGFscmVhZHkgY2hlY2tlZAogICogZm9yIHZhbGlkaXR5LCBzbyBwYXJhbm9pYSBpcyBub3QgcmVxdWlyZWQuICovCiAKLXN0YXRpYyBpbnQgaXBfY2xlYXJfbXV0YWJsZV9vcHRpb25zKHN0cnVjdCBpcGhkciAqaXBoLCB1MzIgKmRhZGRyKQorc3RhdGljIGludCBpcF9jbGVhcl9tdXRhYmxlX29wdGlvbnMoc3RydWN0IGlwaGRyICppcGgsIF9fYmUzMiAqZGFkZHIpCiB7CiAJdW5zaWduZWQgY2hhciAqIG9wdHB0ciA9ICh1bnNpZ25lZCBjaGFyKikoaXBoKzEpOwogCWludCAgbCA9IGlwaC0+aWhsKjQgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCWlwaC0+ZnJhZ19vZmYgPSAwOwogCWlwaC0+Y2hlY2sgPSAwOwogCWlmIChpaGwgPiBzaXplb2YoKmlwaCkpIHsKLQkJdTMyIGR1bW15OworCQlfX2JlMzIgZHVtbXk7CiAJCWlmIChpcF9jbGVhcl9tdXRhYmxlX29wdGlvbnMoaXBoLCAmZHVtbXkpKQogCQkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYXJwLmMgYi9uZXQvaXB2NC9hcnAuYwppbmRleCBjZmI1ZDNkLi4zOTgxZThiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hcnAuYworKysgYi9uZXQvaXB2NC9hcnAuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJLmdjX3RocmVzaDMgPQkxMDI0LAogfTsKIAotaW50IGFycF9tY19tYXAodTMyIGFkZHIsIHU4ICpoYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGRpcikKK2ludCBhcnBfbWNfbWFwKF9fYmUzMiBhZGRyLCB1OCAqaGFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkaXIpCiB7CiAJc3dpdGNoIChkZXYtPnR5cGUpIHsKIAljYXNlIEFSUEhSRF9FVEhFUjoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2NpcHNvX2lwdjQuYyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwppbmRleCBiZGU4Y2NhLi42MGFhZmI0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9jaXBzb19pcHY0LmMKKysrIGIvbmV0L2lwdjQvY2lwc29faXB2NC5jCkBAIC0zMTksNiArMzE5LDcgQEAKIAkJCWVudHJ5LT5hY3Rpdml0eSArPSAxOwogCQkJYXRvbWljX2luYygmZW50cnktPmxzbV9kYXRhLT5yZWZjb3VudCk7CiAJCQlzZWNhdHRyLT5jYWNoZSA9IGVudHJ5LT5sc21fZGF0YTsKKwkJCXNlY2F0dHItPmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX0NBQ0hFOwogCQkJaWYgKHByZXZfZW50cnkgPT0gTlVMTCkgewogCQkJCXNwaW5fdW5sb2NrX2JoKCZjaXBzb192NF9jYWNoZVtia3RdLmxvY2spOwogCQkJCXJldHVybiAwOwpAQCAtMzc3LDEyICszNzgsMTEgQEAKIAllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmIChlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQllbnRyeS0+a2V5ID0ga21hbGxvYyhjaXBzb19wdHJfbGVuLCBHRlBfQVRPTUlDKTsKKwllbnRyeS0+a2V5ID0ga21lbWR1cChjaXBzb19wdHIsIGNpcHNvX3B0cl9sZW4sIEdGUF9BVE9NSUMpOwogCWlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKIAkJcmV0X3ZhbCA9IC1FTk9NRU07CiAJCWdvdG8gY2FjaGVfYWRkX2ZhaWx1cmU7CiAJfQotCW1lbWNweShlbnRyeS0+a2V5LCBjaXBzb19wdHIsIGNpcHNvX3B0cl9sZW4pOwogCWVudHJ5LT5rZXlfbGVuID0gY2lwc29fcHRyX2xlbjsKIAllbnRyeS0+aGFzaCA9IGNpcHNvX3Y0X21hcF9jYWNoZV9oYXNoKGNpcHNvX3B0ciwgY2lwc29fcHRyX2xlbik7CiAJYXRvbWljX2luYygmc2VjYXR0ci0+Y2FjaGUtPnJlZmNvdW50KTsKQEAgLTQ0Nyw4ICs0NDcsMzAgQEAKICAqLwogaW50IGNpcHNvX3Y0X2RvaV9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZikKIHsKKwl1MzIgaXRlcjsKKwogCWlmIChkb2lfZGVmID09IE5VTEwgfHwgZG9pX2RlZi0+ZG9pID09IENJUFNPX1Y0X0RPSV9VTktOT1dOKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgQ0lQU09fVjRfVEFHX01BWENOVDsgaXRlcisrKSB7CisJCXN3aXRjaCAoZG9pX2RlZi0+dGFnc1tpdGVyXSkgeworCQljYXNlIENJUFNPX1Y0X1RBR19SQklUTUFQOgorCQkJYnJlYWs7CisJCWNhc2UgQ0lQU09fVjRfVEFHX1JBTkdFOgorCQkJaWYgKGRvaV9kZWYtPnR5cGUgIT0gQ0lQU09fVjRfTUFQX1BBU1MpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfSU5WQUxJRDoKKwkJCWlmIChpdGVyID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfRU5VTToKKwkJCWlmIChkb2lfZGVmLT50eXBlICE9IENJUFNPX1Y0X01BUF9QQVNTKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KIAogCWRvaV9kZWYtPnZhbGlkID0gMTsKIAlJTklUX1JDVV9IRUFEKCZkb2lfZGVmLT5yY3UpOwpAQCAtNzczLDEzICs3OTUsMTUgQEAKIHsKIAlpbnQgY2F0ID0gLTE7CiAJdTMyIGJpdG1hcF9sZW5fYml0cyA9IGJpdG1hcF9sZW4gKiA4OwotCXUzMiBjaXBzb19jYXRfc2l6ZSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5jaXBzb19zaXplOwotCXUzMiAqY2lwc29fYXJyYXkgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQuY2lwc287CisJdTMyIGNpcHNvX2NhdF9zaXplOworCXUzMiAqY2lwc29fYXJyYXk7CiAKIAlzd2l0Y2ggKGRvaV9kZWYtPnR5cGUpIHsKIAljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgogCQlyZXR1cm4gMDsKIAljYXNlIENJUFNPX1Y0X01BUF9TVEQ6CisJCWNpcHNvX2NhdF9zaXplID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvX3NpemU7CisJCWNpcHNvX2FycmF5ID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvOwogCQlmb3IgKDs7KSB7CiAJCQljYXQgPSBjaXBzb192NF9iaXRtYXBfd2FsayhiaXRtYXAsCiAJCQkJCQkgICBiaXRtYXBfbGVuX2JpdHMsCkBAIC04MDMsOCArODI3LDcgQEAKIC8qKgogICogY2lwc29fdjRfbWFwX2NhdF9yYm1faHRvbiAtIFBlcmZvcm0gYSBjYXRlZ29yeSBtYXBwaW5nIGZyb20gaG9zdCB0byBuZXR3b3JrCiAgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCi0gKiBAaG9zdF9jYXQ6IHRoZSBjYXRlZ29yeSBiaXRtYXAgaW4gaG9zdCBmb3JtYXQKLSAqIEBob3N0X2NhdF9sZW46IHRoZSBsZW5ndGggb2YgdGhlIGhvc3QncyBjYXRlZ29yeSBiaXRtYXAgaW4gYnl0ZXMKKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcwogICogQG5ldF9jYXQ6IHRoZSB6ZXJvJ2Qgb3V0IGNhdGVnb3J5IGJpdG1hcCBpbiBuZXR3b3JrL0NJUFNPIGZvcm1hdAogICogQG5ldF9jYXRfbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBDSVBTTyBiaXRtYXAgaW4gYnl0ZXMKICAqCkBAIC04MTUsNTcgKzgzOCw1MSBAQAogICoKICAqLwogc3RhdGljIGludCBjaXBzb192NF9tYXBfY2F0X3JibV9odG9uKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCi0JCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpob3N0X2NhdCwKLQkJCQkgICAgIHUzMiBob3N0X2NhdF9sZW4sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAogCQkJCSAgICAgdW5zaWduZWQgY2hhciAqbmV0X2NhdCwKIAkJCQkgICAgIHUzMiBuZXRfY2F0X2xlbikKIHsKIAlpbnQgaG9zdF9zcG90ID0gLTE7Ci0JdTMyIG5ldF9zcG90OworCXUzMiBuZXRfc3BvdCA9IENJUFNPX1Y0X0lOVl9DQVQ7CiAJdTMyIG5ldF9zcG90X21heCA9IDA7Ci0JdTMyIGhvc3RfY2xlbl9iaXRzID0gaG9zdF9jYXRfbGVuICogODsKIAl1MzIgbmV0X2NsZW5fYml0cyA9IG5ldF9jYXRfbGVuICogODsKLQl1MzIgaG9zdF9jYXRfc2l6ZSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5sb2NhbF9zaXplOwotCXUzMiAqaG9zdF9jYXRfYXJyYXkgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQubG9jYWw7CisJdTMyIGhvc3RfY2F0X3NpemUgPSAwOworCXUzMiAqaG9zdF9jYXRfYXJyYXkgPSBOVUxMOwogCi0Jc3dpdGNoIChkb2lfZGVmLT50eXBlKSB7Ci0JY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKLQkJbmV0X3Nwb3RfbWF4ID0gaG9zdF9jYXRfbGVuIC0gMTsKLQkJd2hpbGUgKG5ldF9zcG90X21heCA+IDAgJiYgaG9zdF9jYXRbbmV0X3Nwb3RfbWF4XSA9PSAwKQotCQkJbmV0X3Nwb3RfbWF4LS07Ci0JCWlmIChuZXRfc3BvdF9tYXggPiBuZXRfY2F0X2xlbikKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1jcHkobmV0X2NhdCwgaG9zdF9jYXQsIG5ldF9zcG90X21heCk7Ci0JCXJldHVybiBuZXRfc3BvdF9tYXg7Ci0JY2FzZSBDSVBTT19WNF9NQVBfU1REOgotCQlmb3IgKDs7KSB7Ci0JCQlob3N0X3Nwb3QgPSBjaXBzb192NF9iaXRtYXBfd2Fsayhob3N0X2NhdCwKLQkJCQkJCQkgaG9zdF9jbGVuX2JpdHMsCi0JCQkJCQkJIGhvc3Rfc3BvdCArIDEsCi0JCQkJCQkJIDEpOwotCQkJaWYgKGhvc3Rfc3BvdCA8IDApCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaG9zdF9zcG90ID49IGhvc3RfY2F0X3NpemUpCi0JCQkJcmV0dXJuIC1FUEVSTTsKLQotCQkJbmV0X3Nwb3QgPSBob3N0X2NhdF9hcnJheVtob3N0X3Nwb3RdOwotCQkJaWYgKG5ldF9zcG90ID49IG5ldF9jbGVuX2JpdHMpCi0JCQkJcmV0dXJuIC1FTk9TUEM7Ci0JCQljaXBzb192NF9iaXRtYXBfc2V0Yml0KG5ldF9jYXQsIG5ldF9zcG90LCAxKTsKLQotCQkJaWYgKG5ldF9zcG90ID4gbmV0X3Nwb3RfbWF4KQotCQkJCW5ldF9zcG90X21heCA9IG5ldF9zcG90OwotCQl9Ci0KLQkJaWYgKGhvc3Rfc3BvdCA9PSAtMikKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmICgrK25ldF9zcG90X21heCAlIDgpCi0JCQlyZXR1cm4gbmV0X3Nwb3RfbWF4IC8gOCArIDE7Ci0JCXJldHVybiBuZXRfc3BvdF9tYXggLyA4OworCWlmIChkb2lfZGVmLT50eXBlID09IENJUFNPX1Y0X01BUF9TVEQpIHsKKwkJaG9zdF9jYXRfc2l6ZSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5sb2NhbF9zaXplOworCQlob3N0X2NhdF9hcnJheSA9IGRvaV9kZWYtPm1hcC5zdGQtPmNhdC5sb2NhbDsKIAl9CiAKLQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKDs7KSB7CisJCWhvc3Rfc3BvdCA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrKHNlY2F0dHItPm1sc19jYXQsCisJCQkJCQkgICAgICAgaG9zdF9zcG90ICsgMSk7CisJCWlmIChob3N0X3Nwb3QgPCAwKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChkb2lfZGVmLT50eXBlKSB7CisJCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6CisJCQluZXRfc3BvdCA9IGhvc3Rfc3BvdDsKKwkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X01BUF9TVEQ6CisJCQlpZiAoaG9zdF9zcG90ID49IGhvc3RfY2F0X3NpemUpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCW5ldF9zcG90ID0gaG9zdF9jYXRfYXJyYXlbaG9zdF9zcG90XTsKKwkJCWlmIChuZXRfc3BvdCA+PSBDSVBTT19WNF9JTlZfQ0FUKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCQlpZiAobmV0X3Nwb3QgPj0gbmV0X2NsZW5fYml0cykKKwkJCXJldHVybiAtRU5PU1BDOworCQljaXBzb192NF9iaXRtYXBfc2V0Yml0KG5ldF9jYXQsIG5ldF9zcG90LCAxKTsKKworCQlpZiAobmV0X3Nwb3QgPiBuZXRfc3BvdF9tYXgpCisJCQluZXRfc3BvdF9tYXggPSBuZXRfc3BvdDsKKwl9CisKKwlpZiAoKytuZXRfc3BvdF9tYXggJSA4KQorCQlyZXR1cm4gbmV0X3Nwb3RfbWF4IC8gOCArIDE7CisJcmV0dXJuIG5ldF9zcG90X21heCAvIDg7CiB9CiAKIC8qKgpAQCAtODczLDEwMCArODkwLDMzMyBAQAogICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgogICogQG5ldF9jYXQ6IHRoZSBjYXRlZ29yeSBiaXRtYXAgaW4gbmV0d29yay9DSVBTTyBmb3JtYXQKICAqIEBuZXRfY2F0X2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgQ0lQU08gYml0bWFwIGluIGJ5dGVzCi0gKiBAaG9zdF9jYXQ6IHRoZSB6ZXJvJ2Qgb3V0IGNhdGVnb3J5IGJpdG1hcCBpbiBob3N0IGZvcm1hdAotICogQGhvc3RfY2F0X2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgaG9zdCdzIGNhdGVnb3J5IGJpdG1hcCBpbiBieXRlcworICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBQZXJmb3JtIGEgbGFiZWwgbWFwcGluZyB0byB0cmFuc2xhdGUgYSBDSVBTTyBiaXRtYXAgdG8gdGhlIGNvcnJlY3QgbG9jYWwKLSAqIE1MUyBjYXRlZ29yeSBiaXRtYXAgdXNpbmcgdGhlIGdpdmVuIERPSSBkZWZpbml0aW9uLiAgUmV0dXJucyB0aGUgbWluaW11bQotICogc2l6ZSBpbiBieXRlcyBvZiB0aGUgaG9zdCBiaXRtYXAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG90aGVyd2lzZS4KKyAqIE1MUyBjYXRlZ29yeSBiaXRtYXAgdXNpbmcgdGhlIGdpdmVuIERPSSBkZWZpbml0aW9uLiAgUmV0dXJucyB6ZXJvIG9uCisgKiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KIHN0YXRpYyBpbnQgY2lwc29fdjRfbWFwX2NhdF9yYm1fbnRvaChjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAogCQkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmV0X2NhdCwKIAkJCQkgICAgIHUzMiBuZXRfY2F0X2xlbiwKLQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmhvc3RfY2F0LAotCQkJCSAgICAgdTMyIGhvc3RfY2F0X2xlbikKKwkJCQkgICAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JdTMyIGhvc3Rfc3BvdDsKLQl1MzIgaG9zdF9zcG90X21heCA9IDA7CisJaW50IHJldF92YWw7CiAJaW50IG5ldF9zcG90ID0gLTE7CisJdTMyIGhvc3Rfc3BvdCA9IENJUFNPX1Y0X0lOVl9DQVQ7CiAJdTMyIG5ldF9jbGVuX2JpdHMgPSBuZXRfY2F0X2xlbiAqIDg7Ci0JdTMyIGhvc3RfY2xlbl9iaXRzID0gaG9zdF9jYXRfbGVuICogODsKLQl1MzIgbmV0X2NhdF9zaXplID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvX3NpemU7Ci0JdTMyICpuZXRfY2F0X2FycmF5ID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvOworCXUzMiBuZXRfY2F0X3NpemUgPSAwOworCXUzMiAqbmV0X2NhdF9hcnJheSA9IE5VTEw7CiAKLQlzd2l0Y2ggKGRvaV9kZWYtPnR5cGUpIHsKLQljYXNlIENJUFNPX1Y0X01BUF9QQVNTOgotCQlpZiAobmV0X2NhdF9sZW4gPiBob3N0X2NhdF9sZW4pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtY3B5KGhvc3RfY2F0LCBuZXRfY2F0LCBuZXRfY2F0X2xlbik7Ci0JCXJldHVybiBuZXRfY2F0X2xlbjsKLQljYXNlIENJUFNPX1Y0X01BUF9TVEQ6Ci0JCWZvciAoOzspIHsKLQkJCW5ldF9zcG90ID0gY2lwc29fdjRfYml0bWFwX3dhbGsobmV0X2NhdCwKLQkJCQkJCQluZXRfY2xlbl9iaXRzLAotCQkJCQkJCW5ldF9zcG90ICsgMSwKLQkJCQkJCQkxKTsKLQkJCWlmIChuZXRfc3BvdCA8IDApCi0JCQkJYnJlYWs7Ci0JCQlpZiAobmV0X3Nwb3QgPj0gbmV0X2NhdF9zaXplIHx8Ci0JCQkgICAgbmV0X2NhdF9hcnJheVtuZXRfc3BvdF0gPj0gQ0lQU09fVjRfSU5WX0NBVCkKLQkJCQlyZXR1cm4gLUVQRVJNOworCWlmIChkb2lfZGVmLT50eXBlID09IENJUFNPX1Y0X01BUF9TVEQpIHsKKwkJbmV0X2NhdF9zaXplID0gZG9pX2RlZi0+bWFwLnN0ZC0+Y2F0LmNpcHNvX3NpemU7CisJCW5ldF9jYXRfYXJyYXkgPSBkb2lfZGVmLT5tYXAuc3RkLT5jYXQuY2lwc287CisJfQogCi0JCQlob3N0X3Nwb3QgPSBuZXRfY2F0X2FycmF5W25ldF9zcG90XTsKLQkJCWlmIChob3N0X3Nwb3QgPj0gaG9zdF9jbGVuX2JpdHMpCi0JCQkJcmV0dXJuIC1FTk9TUEM7Ci0JCQljaXBzb192NF9iaXRtYXBfc2V0Yml0KGhvc3RfY2F0LCBob3N0X3Nwb3QsIDEpOwotCi0JCQlpZiAoaG9zdF9zcG90ID4gaG9zdF9zcG90X21heCkKLQkJCQlob3N0X3Nwb3RfbWF4ID0gaG9zdF9zcG90OworCWZvciAoOzspIHsKKwkJbmV0X3Nwb3QgPSBjaXBzb192NF9iaXRtYXBfd2FsayhuZXRfY2F0LAorCQkJCQkJbmV0X2NsZW5fYml0cywKKwkJCQkJCW5ldF9zcG90ICsgMSwKKwkJCQkJCTEpOworCQlpZiAobmV0X3Nwb3QgPCAwKSB7CisJCQlpZiAobmV0X3Nwb3QgPT0gLTIpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKIAkJfQogCi0JCWlmIChuZXRfc3BvdCA9PSAtMikKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmICgrK2hvc3Rfc3BvdF9tYXggJSA4KQotCQkJcmV0dXJuIGhvc3Rfc3BvdF9tYXggLyA4ICsgMTsKLQkJcmV0dXJuIGhvc3Rfc3BvdF9tYXggLyA4OworCQlzd2l0Y2ggKGRvaV9kZWYtPnR5cGUpIHsKKwkJY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKKwkJCWhvc3Rfc3BvdCA9IG5ldF9zcG90OworCQkJYnJlYWs7CisJCWNhc2UgQ0lQU09fVjRfTUFQX1NURDoKKwkJCWlmIChuZXRfc3BvdCA+PSBuZXRfY2F0X3NpemUpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWhvc3Rfc3BvdCA9IG5ldF9jYXRfYXJyYXlbbmV0X3Nwb3RdOworCQkJaWYgKGhvc3Rfc3BvdCA+PSBDSVBTT19WNF9JTlZfQ0FUKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCQlyZXRfdmFsID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3NldGJpdChzZWNhdHRyLT5tbHNfY2F0LAorCQkJCQkJICAgICAgIGhvc3Rfc3BvdCwKKwkJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldF92YWwgIT0gMCkKKwkJCXJldHVybiByZXRfdmFsOwogCX0KIAogCXJldHVybiAtRUlOVkFMOwogfQogCisvKioKKyAqIGNpcHNvX3Y0X21hcF9jYXRfZW51bV92YWxpZCAtIENoZWNrcyB0byBzZWUgaWYgdGhlIGNhdGVnb3JpZXMgYXJlIHZhbGlkCisgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCisgKiBAZW51bWNhdDogY2F0ZWdvcnkgbGlzdAorICogQGVudW1jYXRfbGVuOiBsZW5ndGggb2YgdGhlIGNhdGVnb3J5IGxpc3QgaW4gYnl0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgZ2l2ZW4gY2F0ZWdvcmllcyBhZ2FpbnN0IHRoZSBnaXZlbiBET0kgZGVmaW5pdGlvbiBhbmQgcmV0dXJucyBhCisgKiBuZWdhdGl2ZSB2YWx1ZSBpZiBhbnkgb2YgdGhlIGNhdGVnb3JpZXMgZG8gbm90IGhhdmUgYSB2YWxpZCBtYXBwaW5nIGFuZCBhCisgKiB6ZXJvIHZhbHVlIGlmIGFsbCBvZiB0aGUgY2F0ZWdvcmllcyBhcmUgdmFsaWQuCisgKgorICovCitzdGF0aWMgaW50IGNpcHNvX3Y0X21hcF9jYXRfZW51bV92YWxpZChjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICplbnVtY2F0LAorCQkJCSAgICAgICB1MzIgZW51bWNhdF9sZW4pCit7CisJdTE2IGNhdDsKKwlpbnQgY2F0X3ByZXYgPSAtMTsKKwl1MzIgaXRlcjsKKworCWlmIChkb2lfZGVmLT50eXBlICE9IENJUFNPX1Y0X01BUF9QQVNTIHx8IGVudW1jYXRfbGVuICYgMHgwMSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgZW51bWNhdF9sZW47IGl0ZXIgKz0gMikgeworCQljYXQgPSBudG9ocygqKChfX2JlMTYgKikmZW51bWNhdFtpdGVyXSkpOworCQlpZiAoY2F0IDw9IGNhdF9wcmV2KQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWNhdF9wcmV2ID0gY2F0OworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNpcHNvX3Y0X21hcF9jYXRfZW51bV9odG9uIC0gUGVyZm9ybSBhIGNhdGVnb3J5IG1hcHBpbmcgZnJvbSBob3N0IHRvIG5ldHdvcmsKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICogQG5ldF9jYXQ6IHRoZSB6ZXJvJ2Qgb3V0IGNhdGVnb3J5IGxpc3QgaW4gbmV0d29yay9DSVBTTyBmb3JtYXQKKyAqIEBuZXRfY2F0X2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgQ0lQU08gY2F0ZWdvcnkgbGlzdCBpbiBieXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBhIGxhYmVsIG1hcHBpbmcgdG8gdHJhbnNsYXRlIGEgbG9jYWwgTUxTIGNhdGVnb3J5IGJpdG1hcCB0byB0aGUKKyAqIGNvcnJlY3QgQ0lQU08gY2F0ZWdvcnkgbGlzdCB1c2luZyB0aGUgZ2l2ZW4gRE9JIGRlZmluaXRpb24uICAgUmV0dXJucyB0aGUKKyAqIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG5ldHdvcmsgY2F0ZWdvcnkgYml0bWFwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcworICogb3RoZXJ3aXNlLgorICoKKyAqLworc3RhdGljIGludCBjaXBzb192NF9tYXBfY2F0X2VudW1faHRvbihjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAqbmV0X2NhdCwKKwkJCQkgICAgICB1MzIgbmV0X2NhdF9sZW4pCit7CisJaW50IGNhdCA9IC0xOworCXUzMiBjYXRfaXRlciA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWNhdCA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF93YWxrKHNlY2F0dHItPm1sc19jYXQsIGNhdCArIDEpOworCQlpZiAoY2F0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoKGNhdF9pdGVyICsgMikgPiBuZXRfY2F0X2xlbikKKwkJCXJldHVybiAtRU5PU1BDOworCisJCSooKF9fYmUxNiAqKSZuZXRfY2F0W2NhdF9pdGVyXSkgPSBodG9ucyhjYXQpOworCQljYXRfaXRlciArPSAyOworCX0KKworCXJldHVybiBjYXRfaXRlcjsKK30KKworLyoqCisgKiBjaXBzb192NF9tYXBfY2F0X2VudW1fbnRvaCAtIFBlcmZvcm0gYSBjYXRlZ29yeSBtYXBwaW5nIGZyb20gbmV0d29yayB0byBob3N0CisgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCisgKiBAbmV0X2NhdDogdGhlIGNhdGVnb3J5IGxpc3QgaW4gbmV0d29yay9DSVBTTyBmb3JtYXQKKyAqIEBuZXRfY2F0X2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgQ0lQU08gYml0bWFwIGluIGJ5dGVzCisgKiBAc2VjYXR0cjogdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gYSBsYWJlbCBtYXBwaW5nIHRvIHRyYW5zbGF0ZSBhIENJUFNPIGNhdGVnb3J5IGxpc3QgdG8gdGhlIGNvcnJlY3QKKyAqIGxvY2FsIE1MUyBjYXRlZ29yeSBiaXRtYXAgdXNpbmcgdGhlIGdpdmVuIERPSSBkZWZpbml0aW9uLiAgUmV0dXJucyB6ZXJvIG9uCisgKiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfbWFwX2NhdF9lbnVtX250b2goY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXRfY2F0LAorCQkJCSAgICAgIHUzMiBuZXRfY2F0X2xlbiwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKQoreworCWludCByZXRfdmFsOworCXUzMiBpdGVyOworCisJZm9yIChpdGVyID0gMDsgaXRlciA8IG5ldF9jYXRfbGVuOyBpdGVyICs9IDIpIHsKKwkJcmV0X3ZhbCA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF9zZXRiaXQoc2VjYXR0ci0+bWxzX2NhdCwKKwkJCQkJICAgIG50b2hzKCooKF9fYmUxNiAqKSZuZXRfY2F0W2l0ZXJdKSksCisJCQkJCSAgICBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldF92YWwgIT0gMCkKKwkJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNpcHNvX3Y0X21hcF9jYXRfcm5nX3ZhbGlkIC0gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgY2F0ZWdvcmllcyBhcmUgdmFsaWQKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEBybmdjYXQ6IGNhdGVnb3J5IGxpc3QKKyAqIEBybmdjYXRfbGVuOiBsZW5ndGggb2YgdGhlIGNhdGVnb3J5IGxpc3QgaW4gYnl0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgZ2l2ZW4gY2F0ZWdvcmllcyBhZ2FpbnN0IHRoZSBnaXZlbiBET0kgZGVmaW5pdGlvbiBhbmQgcmV0dXJucyBhCisgKiBuZWdhdGl2ZSB2YWx1ZSBpZiBhbnkgb2YgdGhlIGNhdGVnb3JpZXMgZG8gbm90IGhhdmUgYSB2YWxpZCBtYXBwaW5nIGFuZCBhCisgKiB6ZXJvIHZhbHVlIGlmIGFsbCBvZiB0aGUgY2F0ZWdvcmllcyBhcmUgdmFsaWQuCisgKgorICovCitzdGF0aWMgaW50IGNpcHNvX3Y0X21hcF9jYXRfcm5nX3ZhbGlkKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcm5nY2F0LAorCQkJCSAgICAgIHUzMiBybmdjYXRfbGVuKQoreworCXUxNiBjYXRfaGlnaDsKKwl1MTYgY2F0X2xvdzsKKwl1MzIgY2F0X3ByZXYgPSBDSVBTT19WNF9NQVhfUkVNX0NBVFMgKyAxOworCXUzMiBpdGVyOworCisJaWYgKGRvaV9kZWYtPnR5cGUgIT0gQ0lQU09fVjRfTUFQX1BBU1MgfHwgcm5nY2F0X2xlbiAmIDB4MDEpCisJCXJldHVybiAtRUZBVUxUOworCisJZm9yIChpdGVyID0gMDsgaXRlciA8IHJuZ2NhdF9sZW47IGl0ZXIgKz0gNCkgeworCQljYXRfaGlnaCA9IG50b2hzKCooKF9fYmUxNiAqKSZybmdjYXRbaXRlcl0pKTsKKwkJaWYgKChpdGVyICsgNCkgPD0gcm5nY2F0X2xlbikKKwkJCWNhdF9sb3cgPSBudG9ocygqKChfX2JlMTYgKikmcm5nY2F0W2l0ZXIgKyAyXSkpOworCQllbHNlCisJCQljYXRfbG93ID0gMDsKKworCQlpZiAoY2F0X2hpZ2ggPiBjYXRfcHJldikKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWNhdF9wcmV2ID0gY2F0X2xvdzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjaXBzb192NF9tYXBfY2F0X3JuZ19odG9uIC0gUGVyZm9ybSBhIGNhdGVnb3J5IG1hcHBpbmcgZnJvbSBob3N0IHRvIG5ldHdvcmsKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICogQG5ldF9jYXQ6IHRoZSB6ZXJvJ2Qgb3V0IGNhdGVnb3J5IGxpc3QgaW4gbmV0d29yay9DSVBTTyBmb3JtYXQKKyAqIEBuZXRfY2F0X2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgQ0lQU08gY2F0ZWdvcnkgbGlzdCBpbiBieXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybSBhIGxhYmVsIG1hcHBpbmcgdG8gdHJhbnNsYXRlIGEgbG9jYWwgTUxTIGNhdGVnb3J5IGJpdG1hcCB0byB0aGUKKyAqIGNvcnJlY3QgQ0lQU08gY2F0ZWdvcnkgbGlzdCB1c2luZyB0aGUgZ2l2ZW4gRE9JIGRlZmluaXRpb24uICAgUmV0dXJucyB0aGUKKyAqIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG5ldHdvcmsgY2F0ZWdvcnkgYml0bWFwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcworICogb3RoZXJ3aXNlLgorICoKKyAqLworc3RhdGljIGludCBjaXBzb192NF9tYXBfY2F0X3JuZ19odG9uKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAorCQkJCSAgICAgdW5zaWduZWQgY2hhciAqbmV0X2NhdCwKKwkJCQkgICAgIHUzMiBuZXRfY2F0X2xlbikKK3sKKwkvKiBUaGUgY29uc3RhbnQgJzE2JyBpcyBub3QgcmFuZG9tLCBpdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKwkgKiBoaWdoL2xvdyBjYXRlZ29yeSByYW5nZSBwYWlycyBhcyBwZXJtaXR0ZWQgYnkgdGhlIENJUFNPIGRyYWZ0IGJhc2VkCisJICogb24gYSBtYXhpbXVtIElQdjQgaGVhZGVyIGxlbmd0aCBvZiA2MCBieXRlcyAtIHRoZSBCVUdfT04oKSBhc3NlcnRpb24KKwkgKiBkb2VzIGEgc2FuaXR5IGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgYXJyYXkuICovCisJaW50IGl0ZXIgPSAtMTsKKwl1MTYgYXJyYXlbMTZdOworCXUzMiBhcnJheV9jbnQgPSAwOworCXUzMiBjYXRfc2l6ZSA9IDA7CisKKwlCVUdfT04obmV0X2NhdF9sZW4gPiAzMCk7CisKKwlmb3IgKDs7KSB7CisJCWl0ZXIgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2FsayhzZWNhdHRyLT5tbHNfY2F0LCBpdGVyICsgMSk7CisJCWlmIChpdGVyIDwgMCkKKwkJCWJyZWFrOworCQljYXRfc2l6ZSArPSAoaXRlciA9PSAwID8gMCA6IHNpemVvZih1MTYpKTsKKwkJaWYgKGNhdF9zaXplID4gbmV0X2NhdF9sZW4pCisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJYXJyYXlbYXJyYXlfY250KytdID0gaXRlcjsKKworCQlpdGVyID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3dhbGtfcm5nKHNlY2F0dHItPm1sc19jYXQsIGl0ZXIpOworCQlpZiAoaXRlciA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJY2F0X3NpemUgKz0gc2l6ZW9mKHUxNik7CisJCWlmIChjYXRfc2l6ZSA+IG5ldF9jYXRfbGVuKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWFycmF5W2FycmF5X2NudCsrXSA9IGl0ZXI7CisJfQorCisJZm9yIChpdGVyID0gMDsgYXJyYXlfY250ID4gMDspIHsKKwkJKigoX19iZTE2ICopJm5ldF9jYXRbaXRlcl0pID0gaHRvbnMoYXJyYXlbLS1hcnJheV9jbnRdKTsKKwkJaXRlciArPSAyOworCQlhcnJheV9jbnQtLTsKKwkJaWYgKGFycmF5W2FycmF5X2NudF0gIT0gMCkgeworCQkJKigoX19iZTE2ICopJm5ldF9jYXRbaXRlcl0pID0gaHRvbnMoYXJyYXlbYXJyYXlfY250XSk7CisJCQlpdGVyICs9IDI7CisJCX0KKwl9CisKKwlyZXR1cm4gY2F0X3NpemU7Cit9CisKKy8qKgorICogY2lwc29fdjRfbWFwX2NhdF9ybmdfbnRvaCAtIFBlcmZvcm0gYSBjYXRlZ29yeSBtYXBwaW5nIGZyb20gbmV0d29yayB0byBob3N0CisgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCisgKiBAbmV0X2NhdDogdGhlIGNhdGVnb3J5IGxpc3QgaW4gbmV0d29yay9DSVBTTyBmb3JtYXQKKyAqIEBuZXRfY2F0X2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgQ0lQU08gYml0bWFwIGluIGJ5dGVzCisgKiBAc2VjYXR0cjogdGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gYSBsYWJlbCBtYXBwaW5nIHRvIHRyYW5zbGF0ZSBhIENJUFNPIGNhdGVnb3J5IGxpc3QgdG8gdGhlIGNvcnJlY3QKKyAqIGxvY2FsIE1MUyBjYXRlZ29yeSBiaXRtYXAgdXNpbmcgdGhlIGdpdmVuIERPSSBkZWZpbml0aW9uLiAgUmV0dXJucyB6ZXJvIG9uCisgKiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfbWFwX2NhdF9ybmdfbnRvaChjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmV0X2NhdCwKKwkJCQkgICAgIHUzMiBuZXRfY2F0X2xlbiwKKwkJCQkgICAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJaW50IHJldF92YWw7CisJdTMyIG5ldF9pdGVyOworCXUxNiBjYXRfbG93OworCXUxNiBjYXRfaGlnaDsKKworCWZvcihuZXRfaXRlciA9IDA7IG5ldF9pdGVyIDwgbmV0X2NhdF9sZW47IG5ldF9pdGVyICs9IDQpIHsKKwkJY2F0X2hpZ2ggPSBudG9ocygqKChfX2JlMTYgKikmbmV0X2NhdFtuZXRfaXRlcl0pKTsKKwkJaWYgKChuZXRfaXRlciArIDQpIDw9IG5ldF9jYXRfbGVuKQorCQkJY2F0X2xvdyA9IG50b2hzKCooKF9fYmUxNiAqKSZuZXRfY2F0W25ldF9pdGVyICsgMl0pKTsKKwkJZWxzZQorCQkJY2F0X2xvdyA9IDA7CisKKwkJcmV0X3ZhbCA9IG5ldGxibF9zZWNhdHRyX2NhdG1hcF9zZXRybmcoc2VjYXR0ci0+bWxzX2NhdCwKKwkJCQkJCSAgICAgICBjYXRfbG93LAorCQkJCQkJICAgICAgIGNhdF9oaWdoLAorCQkJCQkJICAgICAgIEdGUF9BVE9NSUMpOworCQlpZiAocmV0X3ZhbCAhPSAwKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBQcm90b2NvbCBIYW5kbGluZyBGdW5jdGlvbnMKICAqLwogCisjZGVmaW5lIENJUFNPX1Y0X09QVF9MRU5fTUFYICAgICAgICAgIDQwCiAjZGVmaW5lIENJUFNPX1Y0X0hEUl9MRU4gICAgICAgICAgICAgIDYKIAogLyoqCiAgKiBjaXBzb192NF9nZW50YWdfaGRyIC0gR2VuZXJhdGUgYSBDSVBTTyBvcHRpb24gaGVhZGVyCiAgKiBAZG9pX2RlZjogdGhlIERPSSBkZWZpbml0aW9uCi0gKiBAbGVuOiB0aGUgdG90YWwgdGFnIGxlbmd0aCBpbiBieXRlcworICogQGxlbjogdGhlIHRvdGFsIHRhZyBsZW5ndGggaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcgdGhpcyBoZWFkZXIKICAqIEBidWY6IHRoZSBDSVBTTyBvcHRpb24gYnVmZmVyCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBXcml0ZSBhIENJUFNPIGhlYWRlciBpbnRvIHRoZSBiZWdpbm5pbmcgb2YgQGJ1ZmZlci4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsCi0gKiBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIFdyaXRlIGEgQ0lQU08gaGVhZGVyIGludG8gdGhlIGJlZ2lubmluZyBvZiBAYnVmZmVyLgogICoKICAqLwotc3RhdGljIGludCBjaXBzb192NF9nZW50YWdfaGRyKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCi0JCQkgICAgICAgdTMyIGxlbiwKLQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYpCitzdGF0aWMgdm9pZCBjaXBzb192NF9nZW50YWdfaGRyKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCXUzMiBsZW4pCiB7Ci0JaWYgKENJUFNPX1Y0X0hEUl9MRU4gKyBsZW4gPiA0MCkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KIAlidWZbMF0gPSBJUE9QVF9DSVBTTzsKIAlidWZbMV0gPSBDSVBTT19WNF9IRFJfTEVOICsgbGVuOwotCSoodTMyICopJmJ1ZlsyXSA9IGh0b25sKGRvaV9kZWYtPmRvaSk7Ci0KLQlyZXR1cm4gMDsKKwkqKF9fYmUzMiAqKSZidWZbMl0gPSBodG9ubChkb2lfZGVmLT5kb2kpOwogfQogCi0jZGVmaW5lIENJUFNPX1Y0X1RBRzFfQ0FUX0xFTiAgICAgICAgIDMwCi0KIC8qKgogICogY2lwc29fdjRfZ2VudGFnX3JibSAtIEdlbmVyYXRlIGEgQ0lQU08gcmVzdHJpY3RlZCBiaXRtYXAgdGFnICh0eXBlICMxKQogICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgpAQCAtOTc3LDY4ICsxMjI3LDQ5IEBACiAgKiBEZXNjcmlwdGlvbjoKICAqIEdlbmVyYXRlIGEgQ0lQU08gb3B0aW9uIHVzaW5nIHRoZSByZXN0cmljdGVkIGJpdG1hcCB0YWcsIHRhZyB0eXBlICMxLiAgVGhlCiAgKiBhY3R1YWwgYnVmZmVyIGxlbmd0aCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGluZGljYXRlZCBzaXplIGR1ZSB0bwotICogdHJhbnNsYXRpb24gYmV0d2VlbiBob3N0IGFuZCBuZXR3b3JrIGNhdGVnb3J5IGJpdG1hcHMuICBSZXR1cm5zIHplcm8gb24KLSAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICogdHJhbnNsYXRpb24gYmV0d2VlbiBob3N0IGFuZCBuZXR3b3JrIGNhdGVnb3J5IGJpdG1hcHMuICBSZXR1cm5zIHRoZSBzaXplIG9mCisgKiB0aGUgdGFnIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgogICoKICAqLwogc3RhdGljIGludCBjaXBzb192NF9nZW50YWdfcmJtKGNvbnN0IHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0ciwKLQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqYnVmZmVyLAotCQkJICAgICAgIHUzMiAqYnVmZmVyX2xlbikKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkgICAgICAgdTMyIGJ1ZmZlcl9sZW4pCiB7Ci0JaW50IHJldF92YWwgPSAtRVBFUk07Ci0JdW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDsKLQl1MzIgYnVmX2xlbjsKKwlpbnQgcmV0X3ZhbDsKKwl1MzIgdGFnX2xlbjsKIAl1MzIgbGV2ZWw7CiAKLQlpZiAoc2VjYXR0ci0+bWxzX2NhdCkgewotCQlidWYgPSBremFsbG9jKENJUFNPX1Y0X0hEUl9MRU4gKyA0ICsgQ0lQU09fVjRfVEFHMV9DQVRfTEVOLAotCQkJICAgICAgR0ZQX0FUT01JQyk7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOworCWlmICgoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfTFZMKSA9PSAwKQorCQlyZXR1cm4gLUVQRVJNOwogCisJcmV0X3ZhbCA9IGNpcHNvX3Y0X21hcF9sdmxfaHRvbihkb2lfZGVmLCBzZWNhdHRyLT5tbHNfbHZsLCAmbGV2ZWwpOworCWlmIChyZXRfdmFsICE9IDApCisJCXJldHVybiByZXRfdmFsOworCisJaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgewogCQlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2NhdF9yYm1faHRvbihkb2lfZGVmLAotCQkJCQkJICAgIHNlY2F0dHItPm1sc19jYXQsCi0JCQkJCQkgICAgc2VjYXR0ci0+bWxzX2NhdF9sZW4sCi0JCQkJCQkgICAgJmJ1ZltDSVBTT19WNF9IRFJfTEVOICsgNF0sCi0JCQkJCQkgICAgQ0lQU09fVjRfVEFHMV9DQVRfTEVOKTsKKwkJCQkJCSAgICBzZWNhdHRyLAorCQkJCQkJICAgICZidWZmZXJbNF0sCisJCQkJCQkgICAgYnVmZmVyX2xlbiAtIDQpOwogCQlpZiAocmV0X3ZhbCA8IDApCi0JCQlnb3RvIGdlbnRhZ19mYWlsdXJlOworCQkJcmV0dXJuIHJldF92YWw7CiAKIAkJLyogVGhpcyB3aWxsIHNlbmQgcGFja2V0cyB1c2luZyB0aGUgIm9wdGltaXplZCIgZm9ybWF0IHdoZW4KIAkJICogcG9zc2liaWxlIGFzIHNwZWNpZmllZCBpbiAgc2VjdGlvbiAzLjQuMi42IG9mIHRoZQogCQkgKiBDSVBTTyBkcmFmdC4gKi8KLQkJaWYgKGNpcHNvX3Y0X3JibV9vcHRmbXQgJiYgKHJldF92YWwgPiAwICYmIHJldF92YWwgPCAxMCkpCi0JCQlyZXRfdmFsID0gMTA7CisJCWlmIChjaXBzb192NF9yYm1fb3B0Zm10ICYmIHJldF92YWwgPiAwICYmIHJldF92YWwgPD0gMTApCisJCQl0YWdfbGVuID0gMTQ7CisJCWVsc2UKKwkJCXRhZ19sZW4gPSA0ICsgcmV0X3ZhbDsKKwl9IGVsc2UKKwkJdGFnX2xlbiA9IDQ7CiAKLQkJYnVmX2xlbiA9IDQgKyByZXRfdmFsOwotCX0gZWxzZSB7Ci0JCWJ1ZiA9IGt6YWxsb2MoQ0lQU09fVjRfSERSX0xFTiArIDQsIEdGUF9BVE9NSUMpOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJYnVmX2xlbiA9IDQ7Ci0JfQorCWJ1ZmZlclswXSA9IDB4MDE7CisJYnVmZmVyWzFdID0gdGFnX2xlbjsKKwlidWZmZXJbM10gPSBsZXZlbDsKIAotCXJldF92YWwgPSBjaXBzb192NF9tYXBfbHZsX2h0b24oZG9pX2RlZiwgc2VjYXR0ci0+bWxzX2x2bCwgJmxldmVsKTsKLQlpZiAocmV0X3ZhbCAhPSAwKQotCQlnb3RvIGdlbnRhZ19mYWlsdXJlOwotCi0JcmV0X3ZhbCA9IGNpcHNvX3Y0X2dlbnRhZ19oZHIoZG9pX2RlZiwgYnVmX2xlbiwgYnVmKTsKLQlpZiAocmV0X3ZhbCAhPSAwKQotCQlnb3RvIGdlbnRhZ19mYWlsdXJlOwotCi0JYnVmW0NJUFNPX1Y0X0hEUl9MRU5dID0gMHgwMTsKLQlidWZbQ0lQU09fVjRfSERSX0xFTiArIDFdID0gYnVmX2xlbjsKLQlidWZbQ0lQU09fVjRfSERSX0xFTiArIDNdID0gbGV2ZWw7Ci0KLQkqYnVmZmVyID0gYnVmOwotCSpidWZmZXJfbGVuID0gQ0lQU09fVjRfSERSX0xFTiArIGJ1Zl9sZW47Ci0KLQlyZXR1cm4gMDsKLQotZ2VudGFnX2ZhaWx1cmU6Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0X3ZhbDsKKwlyZXR1cm4gdGFnX2xlbjsKIH0KIAogLyoqCkBAIC0xMDY1LDMyICsxMjk2LDIwOCBAQAogCWlmIChyZXRfdmFsICE9IDApCiAJCXJldHVybiByZXRfdmFsOwogCXNlY2F0dHItPm1sc19sdmwgPSBsZXZlbDsKLQlzZWNhdHRyLT5tbHNfbHZsX3ZsZCA9IDE7CisJc2VjYXR0ci0+ZmxhZ3MgfD0gTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTDsKIAogCWlmICh0YWdfbGVuID4gNCkgewotCQlzd2l0Y2ggKGRvaV9kZWYtPnR5cGUpIHsKLQkJY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKLQkJCXNlY2F0dHItPm1sc19jYXRfbGVuID0gdGFnX2xlbiAtIDQ7Ci0JCQlicmVhazsKLQkJY2FzZSBDSVBTT19WNF9NQVBfU1REOgotCQkJc2VjYXR0ci0+bWxzX2NhdF9sZW4gPQotCQkJCWRvaV9kZWYtPm1hcC5zdGQtPmNhdC5sb2NhbF9zaXplOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2VjYXR0ci0+bWxzX2NhdCA9IGt6YWxsb2Moc2VjYXR0ci0+bWxzX2NhdF9sZW4sIEdGUF9BVE9NSUMpOworCQlzZWNhdHRyLT5tbHNfY2F0ID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2FsbG9jKEdGUF9BVE9NSUMpOwogCQlpZiAoc2VjYXR0ci0+bWxzX2NhdCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJcmV0X3ZhbCA9IGNpcHNvX3Y0X21hcF9jYXRfcmJtX250b2goZG9pX2RlZiwKIAkJCQkJCSAgICAmdGFnWzRdLAogCQkJCQkJICAgIHRhZ19sZW4gLSA0LAotCQkJCQkJICAgIHNlY2F0dHItPm1sc19jYXQsCi0JCQkJCQkgICAgc2VjYXR0ci0+bWxzX2NhdF9sZW4pOwotCQlpZiAocmV0X3ZhbCA8IDApIHsKLQkJCWtmcmVlKHNlY2F0dHItPm1sc19jYXQpOworCQkJCQkJICAgIHNlY2F0dHIpOworCQlpZiAocmV0X3ZhbCAhPSAwKSB7CisJCQluZXRsYmxfc2VjYXR0cl9jYXRtYXBfZnJlZShzZWNhdHRyLT5tbHNfY2F0KTsKIAkJCXJldHVybiByZXRfdmFsOwogCQl9Ci0JCXNlY2F0dHItPm1sc19jYXRfbGVuID0gcmV0X3ZhbDsKKworCQlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNpcHNvX3Y0X2dlbnRhZ19lbnVtIC0gR2VuZXJhdGUgYSBDSVBTTyBlbnVtZXJhdGVkIHRhZyAodHlwZSAjMikKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICogQGJ1ZmZlcjogdGhlIG9wdGlvbiBidWZmZXIKKyAqIEBidWZmZXJfbGVuOiBsZW5ndGggb2YgYnVmZmVyIGluIGJ5dGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBHZW5lcmF0ZSBhIENJUFNPIG9wdGlvbiB1c2luZyB0aGUgZW51bWVyYXRlZCB0YWcsIHRhZyB0eXBlICMyLiAgUmV0dXJucyB0aGUKKyAqIHNpemUgb2YgdGhlIHRhZyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfZ2VudGFnX2VudW0oY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCQljb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAorCQkJCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCQl1MzIgYnVmZmVyX2xlbikKK3sKKwlpbnQgcmV0X3ZhbDsKKwl1MzIgdGFnX2xlbjsKKwl1MzIgbGV2ZWw7CisKKwlpZiAoIShzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0X3ZhbCA9IGNpcHNvX3Y0X21hcF9sdmxfaHRvbihkb2lfZGVmLCBzZWNhdHRyLT5tbHNfbHZsLCAmbGV2ZWwpOworCWlmIChyZXRfdmFsICE9IDApCisJCXJldHVybiByZXRfdmFsOworCisJaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgeworCQlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2NhdF9lbnVtX2h0b24oZG9pX2RlZiwKKwkJCQkJCSAgICAgc2VjYXR0ciwKKwkJCQkJCSAgICAgJmJ1ZmZlcls0XSwKKwkJCQkJCSAgICAgYnVmZmVyX2xlbiAtIDQpOworCQlpZiAocmV0X3ZhbCA8IDApCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQl0YWdfbGVuID0gNCArIHJldF92YWw7CisJfSBlbHNlCisJCXRhZ19sZW4gPSA0OworCisJYnVmZmVyWzBdID0gMHgwMjsKKwlidWZmZXJbMV0gPSB0YWdfbGVuOworCWJ1ZmZlclszXSA9IGxldmVsOworCisJcmV0dXJuIHRhZ19sZW47Cit9CisKKy8qKgorICogY2lwc29fdjRfcGFyc2V0YWdfZW51bSAtIFBhcnNlIGEgQ0lQU08gZW51bWVyYXRlZCB0YWcKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEB0YWc6IHRoZSBDSVBTTyB0YWcKKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFyc2UgYSBDSVBTTyBlbnVtZXJhdGVkIHRhZyAodGFnIHR5cGUgIzIpIGFuZCByZXR1cm4gdGhlIHNlY3VyaXR5CisgKiBhdHRyaWJ1dGVzIGluIEBzZWNhdHRyLiAgUmV0dXJuIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmVzIHZhbHVlcyBvbgorICogZmFpbHVyZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgY2lwc29fdjRfcGFyc2V0YWdfZW51bShjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqdGFnLAorCQkJCSAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlpbnQgcmV0X3ZhbDsKKwl1OCB0YWdfbGVuID0gdGFnWzFdOworCXUzMiBsZXZlbDsKKworCXJldF92YWwgPSBjaXBzb192NF9tYXBfbHZsX250b2goZG9pX2RlZiwgdGFnWzNdLCAmbGV2ZWwpOworCWlmIChyZXRfdmFsICE9IDApCisJCXJldHVybiByZXRfdmFsOworCXNlY2F0dHItPm1sc19sdmwgPSBsZXZlbDsKKwlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9NTFNfTFZMOworCisJaWYgKHRhZ19sZW4gPiA0KSB7CisJCXNlY2F0dHItPm1sc19jYXQgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfYWxsb2MoR0ZQX0FUT01JQyk7CisJCWlmIChzZWNhdHRyLT5tbHNfY2F0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2NhdF9lbnVtX250b2goZG9pX2RlZiwKKwkJCQkJCSAgICAgJnRhZ1s0XSwKKwkJCQkJCSAgICAgdGFnX2xlbiAtIDQsCisJCQkJCQkgICAgIHNlY2F0dHIpOworCQlpZiAocmV0X3ZhbCAhPSAwKSB7CisJCQluZXRsYmxfc2VjYXR0cl9jYXRtYXBfZnJlZShzZWNhdHRyLT5tbHNfY2F0KTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisKKwkJc2VjYXR0ci0+ZmxhZ3MgfD0gTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjaXBzb192NF9nZW50YWdfcm5nIC0gR2VuZXJhdGUgYSBDSVBTTyByYW5nZWQgdGFnICh0eXBlICM1KQorICogQGRvaV9kZWY6IHRoZSBET0kgZGVmaW5pdGlvbgorICogQHNlY2F0dHI6IHRoZSBzZWN1cml0eSBhdHRyaWJ1dGVzCisgKiBAYnVmZmVyOiB0aGUgb3B0aW9uIGJ1ZmZlcgorICogQGJ1ZmZlcl9sZW46IGxlbmd0aCBvZiBidWZmZXIgaW4gYnl0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdlbmVyYXRlIGEgQ0lQU08gb3B0aW9uIHVzaW5nIHRoZSByYW5nZWQgdGFnLCB0YWcgdHlwZSAjNS4gIFJldHVybnMgdGhlCisgKiBzaXplIG9mIHRoZSB0YWcgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitzdGF0aWMgaW50IGNpcHNvX3Y0X2dlbnRhZ19ybmcoY29uc3Qgc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgICB1MzIgYnVmZmVyX2xlbikKK3sKKwlpbnQgcmV0X3ZhbDsKKwl1MzIgdGFnX2xlbjsKKwl1MzIgbGV2ZWw7CisKKwlpZiAoIShzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0X3ZhbCA9IGNpcHNvX3Y0X21hcF9sdmxfaHRvbihkb2lfZGVmLCBzZWNhdHRyLT5tbHNfbHZsLCAmbGV2ZWwpOworCWlmIChyZXRfdmFsICE9IDApCisJCXJldHVybiByZXRfdmFsOworCisJaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgeworCQlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2NhdF9ybmdfaHRvbihkb2lfZGVmLAorCQkJCQkJICAgIHNlY2F0dHIsCisJCQkJCQkgICAgJmJ1ZmZlcls0XSwKKwkJCQkJCSAgICBidWZmZXJfbGVuIC0gNCk7CisJCWlmIChyZXRfdmFsIDwgMCkKKwkJCXJldHVybiByZXRfdmFsOworCisJCXRhZ19sZW4gPSA0ICsgcmV0X3ZhbDsKKwl9IGVsc2UKKwkJdGFnX2xlbiA9IDQ7CisKKwlidWZmZXJbMF0gPSAweDA1OworCWJ1ZmZlclsxXSA9IHRhZ19sZW47CisJYnVmZmVyWzNdID0gbGV2ZWw7CisKKwlyZXR1cm4gdGFnX2xlbjsKK30KKworLyoqCisgKiBjaXBzb192NF9wYXJzZXRhZ19ybmcgLSBQYXJzZSBhIENJUFNPIHJhbmdlZCB0YWcKKyAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KKyAqIEB0YWc6IHRoZSBDSVBTTyB0YWcKKyAqIEBzZWNhdHRyOiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFyc2UgYSBDSVBTTyByYW5nZWQgdGFnICh0YWcgdHlwZSAjNSkgYW5kIHJldHVybiB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcworICogaW4gQHNlY2F0dHIuICBSZXR1cm4gemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZXMgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitzdGF0aWMgaW50IGNpcHNvX3Y0X3BhcnNldGFnX3JuZyhjb25zdCBzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWcsCisJCQkJIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJaW50IHJldF92YWw7CisJdTggdGFnX2xlbiA9IHRhZ1sxXTsKKwl1MzIgbGV2ZWw7CisKKwlyZXRfdmFsID0gY2lwc29fdjRfbWFwX2x2bF9udG9oKGRvaV9kZWYsIHRhZ1szXSwgJmxldmVsKTsKKwlpZiAocmV0X3ZhbCAhPSAwKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlzZWNhdHRyLT5tbHNfbHZsID0gbGV2ZWw7CisJc2VjYXR0ci0+ZmxhZ3MgfD0gTkVUTEJMX1NFQ0FUVFJfTUxTX0xWTDsKKworCWlmICh0YWdfbGVuID4gNCkgeworCQlzZWNhdHRyLT5tbHNfY2F0ID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2FsbG9jKEdGUF9BVE9NSUMpOworCQlpZiAoc2VjYXR0ci0+bWxzX2NhdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmV0X3ZhbCA9IGNpcHNvX3Y0X21hcF9jYXRfcm5nX250b2goZG9pX2RlZiwKKwkJCQkJCSAgICAmdGFnWzRdLAorCQkJCQkJICAgIHRhZ19sZW4gLSA0LAorCQkJCQkJICAgIHNlY2F0dHIpOworCQlpZiAocmV0X3ZhbCAhPSAwKSB7CisJCQluZXRsYmxfc2VjYXR0cl9jYXRtYXBfZnJlZShzZWNhdHRyLT5tbHNfY2F0KTsKKwkJCXJldHVybiByZXRfdmFsOworCQl9CisKKwkJc2VjYXR0ci0+ZmxhZ3MgfD0gTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExMzQsNyArMTU0MSw3IEBACiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwotCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfZ2V0ZGVmKG50b2hsKCooKHUzMiAqKSZvcHRbMl0pKSk7CisJZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9zZWFyY2gobnRvaGwoKigoX19iZTMyICopJm9wdFsyXSkpKTsKIAlpZiAoZG9pX2RlZiA9PSBOVUxMKSB7CiAJCWVycl9vZmZzZXQgPSAyOwogCQlnb3RvIHZhbGlkYXRlX3JldHVybl9sb2NrZWQ7CkBAIC0xMTg1LDYgKzE1OTIsNDQgQEAKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSBDSVBTT19WNF9UQUdfRU5VTToKKwkJCWlmICh0YWdfbGVuIDwgNCkgeworCQkJCWVycl9vZmZzZXQgPSBvcHRfaXRlciArIDE7CisJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOworCQkJfQorCisJCQlpZiAoY2lwc29fdjRfbWFwX2x2bF92YWxpZChkb2lfZGVmLAorCQkJCQkJICAgdGFnWzNdKSA8IDApIHsKKwkJCQllcnJfb2Zmc2V0ID0gb3B0X2l0ZXIgKyAzOworCQkJCWdvdG8gdmFsaWRhdGVfcmV0dXJuX2xvY2tlZDsKKwkJCX0KKwkJCWlmICh0YWdfbGVuID4gNCAmJgorCQkJICAgIGNpcHNvX3Y0X21hcF9jYXRfZW51bV92YWxpZChkb2lfZGVmLAorCQkJCQkJCSZ0YWdbNF0sCisJCQkJCQkJdGFnX2xlbiAtIDQpIDwgMCkgeworCQkJCWVycl9vZmZzZXQgPSBvcHRfaXRlciArIDQ7CisJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ0lQU09fVjRfVEFHX1JBTkdFOgorCQkJaWYgKHRhZ19sZW4gPCA0KSB7CisJCQkJZXJyX29mZnNldCA9IG9wdF9pdGVyICsgMTsKKwkJCQlnb3RvIHZhbGlkYXRlX3JldHVybl9sb2NrZWQ7CisJCQl9CisKKwkJCWlmIChjaXBzb192NF9tYXBfbHZsX3ZhbGlkKGRvaV9kZWYsCisJCQkJCQkgICB0YWdbM10pIDwgMCkgeworCQkJCWVycl9vZmZzZXQgPSBvcHRfaXRlciArIDM7CisJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOworCQkJfQorCQkJaWYgKHRhZ19sZW4gPiA0ICYmCisJCQkgICAgY2lwc29fdjRfbWFwX2NhdF9ybmdfdmFsaWQoZG9pX2RlZiwKKwkJCQkJCSAgICAgICAmdGFnWzRdLAorCQkJCQkJICAgICAgIHRhZ19sZW4gLSA0KSA8IDApIHsKKwkJCQllcnJfb2Zmc2V0ID0gb3B0X2l0ZXIgKyA0OworCQkJCWdvdG8gdmFsaWRhdGVfcmV0dXJuX2xvY2tlZDsKKwkJCX0KKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZXJyX29mZnNldCA9IG9wdF9pdGVyOwogCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOwpAQCAtMTI1OSw3ICsxNzA0LDcgQEAKIHsKIAlpbnQgcmV0X3ZhbCA9IC1FUEVSTTsKIAl1MzIgaXRlcjsKLQl1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1MzIgYnVmX2xlbiA9IDA7CiAJdTMyIG9wdF9sZW47CiAJc3RydWN0IGlwX29wdGlvbnMgKm9wdCA9IE5VTEw7CkBAIC0xMjc1LDE3ICsxNzIwLDQwIEBACiAJaWYgKHNrID09IE5VTEwpCiAJCXJldHVybiAwOwogCisJLyogV2UgYWxsb2NhdGUgdGhlIG1heGltdW0gQ0lQU08gb3B0aW9uIHNpemUgaGVyZSBzbyB3ZSBhcmUgcHJvYmFibHkKKwkgKiBiZWluZyBhIGxpdHRsZSB3YXN0ZWZ1bCwgYnV0IGl0IG1ha2VzIG91ciBsaWZlIF9tdWNoXyBlYXNpZXIgbGF0ZXIKKwkgKiBvbiBhbmQgYWZ0ZXIgYWxsIHdlIGFyZSBvbmx5IHRhbGtpbmcgYWJvdXQgNDAgYnl0ZXMuICovCisJYnVmX2xlbiA9IENJUFNPX1Y0X09QVF9MRU5fTUFYOworCWJ1ZiA9IGttYWxsb2MoYnVmX2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJldF92YWwgPSAtRU5PTUVNOworCQlnb3RvIHNvY2tldF9zZXRhdHRyX2ZhaWx1cmU7CisJfQorCiAJLyogWFhYIC0gVGhpcyBjb2RlIGFzc3VtZXMgb25seSBvbmUgdGFnIHBlciBDSVBTTyBvcHRpb24gd2hpY2ggaXNuJ3QKIAkgKiByZWFsbHkgYSBnb29kIGFzc3VtcHRpb24gdG8gbWFrZSBidXQgc2luY2Ugd2Ugb25seSBzdXBwb3J0IHRoZSBNQUMKIAkgKiB0YWdzIHJpZ2h0IG5vdyBpdCBpcyBhIHNhZmUgYXNzdW1wdGlvbi4gKi8KIAlpdGVyID0gMDsKIAlkbyB7CisJCW1lbXNldChidWYsIDAsIGJ1Zl9sZW4pOwogCQlzd2l0Y2ggKGRvaV9kZWYtPnRhZ3NbaXRlcl0pIHsKIAkJY2FzZSBDSVBTT19WNF9UQUdfUkJJVE1BUDoKIAkJCXJldF92YWwgPSBjaXBzb192NF9nZW50YWdfcmJtKGRvaV9kZWYsCi0JCQkJCQkgICAgICBzZWNhdHRyLAotCQkJCQkJICAgICAgJmJ1ZiwKLQkJCQkJCSAgICAgICZidWZfbGVuKTsKKwkJCQkJCSAgIHNlY2F0dHIsCisJCQkJCQkgICAmYnVmW0NJUFNPX1Y0X0hEUl9MRU5dLAorCQkJCQkJICAgYnVmX2xlbiAtIENJUFNPX1Y0X0hEUl9MRU4pOworCQkJYnJlYWs7CisJCWNhc2UgQ0lQU09fVjRfVEFHX0VOVU06CisJCQlyZXRfdmFsID0gY2lwc29fdjRfZ2VudGFnX2VudW0oZG9pX2RlZiwKKwkJCQkJCSAgIHNlY2F0dHIsCisJCQkJCQkgICAmYnVmW0NJUFNPX1Y0X0hEUl9MRU5dLAorCQkJCQkJICAgYnVmX2xlbiAtIENJUFNPX1Y0X0hEUl9MRU4pOworCQkJYnJlYWs7CisJCWNhc2UgQ0lQU09fVjRfVEFHX1JBTkdFOgorCQkJcmV0X3ZhbCA9IGNpcHNvX3Y0X2dlbnRhZ19ybmcoZG9pX2RlZiwKKwkJCQkJCSAgIHNlY2F0dHIsCisJCQkJCQkgICAmYnVmW0NJUFNPX1Y0X0hEUl9MRU5dLAorCQkJCQkJICAgYnVmX2xlbiAtIENJUFNPX1Y0X0hEUl9MRU4pOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXRfdmFsID0gLUVQRVJNOwpAQCAtMTI5MywxNSArMTc2MSwxOCBAQAogCQl9CiAKIAkJaXRlcisrOwotCX0gd2hpbGUgKHJldF92YWwgIT0gMCAmJgorCX0gd2hpbGUgKHJldF92YWwgPCAwICYmCiAJCSBpdGVyIDwgQ0lQU09fVjRfVEFHX01BWENOVCAmJgogCQkgZG9pX2RlZi0+dGFnc1tpdGVyXSAhPSBDSVBTT19WNF9UQUdfSU5WQUxJRCk7Ci0JaWYgKHJldF92YWwgIT0gMCkKKwlpZiAocmV0X3ZhbCA8IDApCiAJCWdvdG8gc29ja2V0X3NldGF0dHJfZmFpbHVyZTsKKwljaXBzb192NF9nZW50YWdfaGRyKGRvaV9kZWYsIGJ1ZiwgcmV0X3ZhbCk7CisJYnVmX2xlbiA9IENJUFNPX1Y0X0hEUl9MRU4gKyByZXRfdmFsOwogCiAJLyogV2UgY2FuJ3QgdXNlIGlwX29wdGlvbnNfZ2V0KCkgZGlyZWN0bHkgYmVjYXVzZSBpdCBtYWtlcyBhIGNhbGwgdG8KIAkgKiBpcF9vcHRpb25zX2dldF9hbGxvYygpIHdoaWNoIGFsbG9jYXRlcyBtZW1vcnkgd2l0aCBHRlBfS0VSTkVMIGFuZAotCSAqIHdlIGNhbid0IGJsb2NrIGhlcmUuICovCisJICogd2Ugd29uJ3QgYWx3YXlzIGhhdmUgQ0FQX05FVF9SQVcgZXZlbiB0aG91Z2ggd2UgX2Fsd2F5c18gd2FudCB0bworCSAqIHNldCB0aGUgSVBPUFRfQ0lQU08gb3B0aW9uLiAqLwogCW9wdF9sZW4gPSAoYnVmX2xlbiArIDMpICYgfjM7CiAJb3B0ID0ga3phbGxvYyhzaXplb2YoKm9wdCkgKyBvcHRfbGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAob3B0ID09IE5VTEwpIHsKQEAgLTEzMTEsMTEgKzE3ODIsOSBAQAogCW1lbWNweShvcHQtPl9fZGF0YSwgYnVmLCBidWZfbGVuKTsKIAlvcHQtPm9wdGxlbiA9IG9wdF9sZW47CiAJb3B0LT5pc19kYXRhID0gMTsKKwlvcHQtPmNpcHNvID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CiAJa2ZyZWUoYnVmKTsKIAlidWYgPSBOVUxMOwotCXJldF92YWwgPSBpcF9vcHRpb25zX2NvbXBpbGUob3B0LCBOVUxMKTsKLQlpZiAocmV0X3ZhbCAhPSAwKQotCQlnb3RvIHNvY2tldF9zZXRhdHRyX2ZhaWx1cmU7CiAKIAlza19pbmV0ID0gaW5ldF9zayhzayk7CiAJaWYgKHNrX2luZXQtPmlzX2ljc2spIHsKQEAgLTEzNjUsMTkgKzE4MzQsMzMgQEAKIAlpZiAocmV0X3ZhbCA9PSAwKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAotCWRvaSA9IG50b2hsKCoodTMyICopJmNpcHNvX3B0clsyXSk7CisJZG9pID0gbnRvaGwoKihfX2JlMzIgKikmY2lwc29fcHRyWzJdKTsKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9nZXRkZWYoZG9pKTsKKwlkb2lfZGVmID0gY2lwc29fdjRfZG9pX3NlYXJjaChkb2kpOwogCWlmIChkb2lfZGVmID09IE5VTEwpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PTVNHOwogCX0KKworCS8qIFhYWCAtIFRoaXMgY29kZSBhc3N1bWVzIG9ubHkgb25lIHRhZyBwZXIgQ0lQU08gb3B0aW9uIHdoaWNoIGlzbid0CisJICogcmVhbGx5IGEgZ29vZCBhc3N1bXB0aW9uIHRvIG1ha2UgYnV0IHNpbmNlIHdlIG9ubHkgc3VwcG9ydCB0aGUgTUFDCisJICogdGFncyByaWdodCBub3cgaXQgaXMgYSBzYWZlIGFzc3VtcHRpb24uICovCiAJc3dpdGNoIChjaXBzb19wdHJbNl0pIHsKIAljYXNlIENJUFNPX1Y0X1RBR19SQklUTUFQOgogCQlyZXRfdmFsID0gY2lwc29fdjRfcGFyc2V0YWdfcmJtKGRvaV9kZWYsCiAJCQkJCQkmY2lwc29fcHRyWzZdLAogCQkJCQkJc2VjYXR0cik7CiAJCWJyZWFrOworCWNhc2UgQ0lQU09fVjRfVEFHX0VOVU06CisJCXJldF92YWwgPSBjaXBzb192NF9wYXJzZXRhZ19lbnVtKGRvaV9kZWYsCisJCQkJCQkgJmNpcHNvX3B0cls2XSwKKwkJCQkJCSBzZWNhdHRyKTsKKwkJYnJlYWs7CisJY2FzZSBDSVBTT19WNF9UQUdfUkFOR0U6CisJCXJldF92YWwgPSBjaXBzb192NF9wYXJzZXRhZ19ybmcoZG9pX2RlZiwKKwkJCQkJCSZjaXBzb19wdHJbNl0sCisJCQkJCQlzZWNhdHRyKTsKKwkJYnJlYWs7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC0xNDI1LDIzICsxOTA4LDMwIEBACiAJdTMyIGRvaTsKIAlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmOwogCi0JaWYgKCFDSVBTT19WNF9PUFRFWElTVChza2IpKQotCQlyZXR1cm4gLUVOT01TRzsKIAljaXBzb19wdHIgPSBDSVBTT19WNF9PUFRQVFIoc2tiKTsKIAlpZiAoY2lwc29fdjRfY2FjaGVfY2hlY2soY2lwc29fcHRyLCBjaXBzb19wdHJbMV0sIHNlY2F0dHIpID09IDApCiAJCXJldHVybiAwOwogCi0JZG9pID0gbnRvaGwoKih1MzIgKikmY2lwc29fcHRyWzJdKTsKKwlkb2kgPSBudG9obCgqKF9fYmUzMiAqKSZjaXBzb19wdHJbMl0pOwogCXJjdV9yZWFkX2xvY2soKTsKLQlkb2lfZGVmID0gY2lwc29fdjRfZG9pX2dldGRlZihkb2kpOworCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfc2VhcmNoKGRvaSk7CiAJaWYgKGRvaV9kZWYgPT0gTlVMTCkKIAkJZ290byBza2J1ZmZfZ2V0YXR0cl9yZXR1cm47CisKKwkvKiBYWFggLSBUaGlzIGNvZGUgYXNzdW1lcyBvbmx5IG9uZSB0YWcgcGVyIENJUFNPIG9wdGlvbiB3aGljaCBpc24ndAorCSAqIHJlYWxseSBhIGdvb2QgYXNzdW1wdGlvbiB0byBtYWtlIGJ1dCBzaW5jZSB3ZSBvbmx5IHN1cHBvcnQgdGhlIE1BQworCSAqIHRhZ3MgcmlnaHQgbm93IGl0IGlzIGEgc2FmZSBhc3N1bXB0aW9uLiAqLwogCXN3aXRjaCAoY2lwc29fcHRyWzZdKSB7CiAJY2FzZSBDSVBTT19WNF9UQUdfUkJJVE1BUDoKIAkJcmV0X3ZhbCA9IGNpcHNvX3Y0X3BhcnNldGFnX3JibShkb2lfZGVmLAogCQkJCQkJJmNpcHNvX3B0cls2XSwKIAkJCQkJCXNlY2F0dHIpOwogCQlicmVhazsKKwljYXNlIENJUFNPX1Y0X1RBR19FTlVNOgorCQlyZXRfdmFsID0gY2lwc29fdjRfcGFyc2V0YWdfZW51bShkb2lfZGVmLAorCQkJCQkJICZjaXBzb19wdHJbNl0sCisJCQkJCQkgc2VjYXR0cik7CisJCWJyZWFrOwogCX0KIAogc2tidWZmX2dldGF0dHJfcmV0dXJuOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGV2aW5ldC5jIGIvbmV0L2lwdjQvZGV2aW5ldC5jCmluZGV4IDc2MDJjNzkuLjg0YmVkNDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2RldmluZXQuYworKysgYi9uZXQvaXB2NC9kZXZpbmV0LmMKQEAgLTU3NywyMCArNTc3LDIwIEBACiAgKglEZXRlcm1pbmUgYSBkZWZhdWx0IG5ldHdvcmsgbWFzaywgYmFzZWQgb24gdGhlIElQIGFkZHJlc3MuCiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gaW50IGluZXRfYWJjX2xlbih1MzIgYWRkcikKK3N0YXRpYyBfX2lubGluZV9fIGludCBpbmV0X2FiY19sZW4oX19iZTMyIGFkZHIpCiB7CiAJaW50IHJjID0gLTE7CS8qIFNvbWV0aGluZyBlbHNlLCBwcm9iYWJseSBhIG11bHRpY2FzdC4gKi8KIAogICAJaWYgKFpFUk9ORVQoYWRkcikpCiAgIAkJcmMgPSAwOwogCWVsc2UgewotCQlhZGRyID0gbnRvaGwoYWRkcik7CisJCV9fdTMyIGhhZGRyID0gbnRvaGwoYWRkcik7CiAKLQkJaWYgKElOX0NMQVNTQShhZGRyKSkKKwkJaWYgKElOX0NMQVNTQShoYWRkcikpCiAJCQlyYyA9IDg7Ci0JCWVsc2UgaWYgKElOX0NMQVNTQihhZGRyKSkKKwkJZWxzZSBpZiAoSU5fQ0xBU1NCKGhhZGRyKSkKIAkJCXJjID0gMTY7Ci0JCWVsc2UgaWYgKElOX0NMQVNTQyhhZGRyKSkKKwkJZWxzZSBpZiAoSU5fQ0xBU1NDKGhhZGRyKSkKIAkJCXJjID0gMjQ7CiAJfQogCkBAIC0xMTIwLDYgKzExMjAsMTYgQEAKIAkubm90aWZpZXJfY2FsbCA9aW5ldGRldl9ldmVudCwKIH07CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGluZXRfbmxtc2dfc2l6ZSh2b2lkKQoreworCXJldHVybiBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZBX0FERFJFU1MgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkFfTE9DQUwgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkFfQlJPQURDQVNUICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZBX0FOWUNBU1QgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShJRk5BTVNJWik7IC8qIElGQV9MQUJFTCAqLworfQorCiBzdGF0aWMgaW50IGluZXRfZmlsbF9pZmFkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluX2lmYWRkciAqaWZhLAogCQkJICAgIHUzMiBwaWQsIHUzMiBzZXEsIGludCBldmVudCwgdW5zaWduZWQgaW50IGZsYWdzKQogewpAQCAtMTIwOCwxNSArMTIxOCwxMyBAQAogCXUzMiBzZXEgPSBubGggPyBubGgtPm5sbXNnX3NlcSA6IDA7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCi0Jc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlza2IgPSBubG1zZ19uZXcoaW5ldF9ubG1zZ19zaXplKCksIEdGUF9LRVJORUwpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0X2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCBwaWQsIHNlcSwgZXZlbnQsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0X25sbXNnX3NpemUoKSAqLworCUJVR19PTihlcnIgPCAwKTsKIAogCWVyciA9IHJ0bmxfbm90aWZ5KHNrYiwgcGlkLCBSVE5MR1JQX0lQVjRfSUZBRERSLCBubGgsIEdGUF9LRVJORUwpOwogZXJyb3V0OgpAQCAtMTI5NSw4ICsxMzAzLDcgQEAKIAogaW50IGlwdjRfZG9pbnRfYW5kX2ZsdXNoX3N0cmF0ZWd5KGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAogCQkJCSAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKLQkJCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIAotCQkJCSAgdm9pZCAqKmNvbnRleHQpCisJCQkJICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWludCAqdmFscCA9IHRhYmxlLT5kYXRhOwogCWludCBuZXc7CkBAIC0xNTU2LDEyICsxNTYzLDEyIEBACiB7CiAJaW50IGk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluX2RldiA/IGluX2Rldi0+ZGV2IDogTlVMTDsKLQlzdHJ1Y3QgZGV2aW5ldF9zeXNjdGxfdGFibGUgKnQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCXN0cnVjdCBkZXZpbmV0X3N5c2N0bF90YWJsZSAqdCA9IGttZW1kdXAoJmRldmluZXRfc3lzY3RsLCBzaXplb2YoKnQpLAorCQkJCQkJIEdGUF9LRVJORUwpOwogCWNoYXIgKmRldl9uYW1lID0gTlVMTDsKIAogCWlmICghdCkKIAkJcmV0dXJuOwotCW1lbWNweSh0LCAmZGV2aW5ldF9zeXNjdGwsIHNpemVvZigqdCkpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHQtPmRldmluZXRfdmFycykgLSAxOyBpKyspIHsKIAkJdC0+ZGV2aW5ldF92YXJzW2ldLmRhdGEgKz0gKGNoYXIgKilwIC0gKGNoYXIgKikmaXB2NF9kZXZjb25mOwogCQl0LT5kZXZpbmV0X3ZhcnNbaV0uZGUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZXNwNC5jIGIvbmV0L2lwdjQvZXNwNC5jCmluZGV4IGI1YzIwNWIuLmYyYzY3NzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2VzcDQuYworKysgYi9uZXQvaXB2NC9lc3A0LmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlpZiAoeC0+ZW5jYXApIHsKIAkJc3RydWN0IHhmcm1fZW5jYXBfdG1wbCAqZW5jYXAgPSB4LT5lbmNhcDsKIAkJc3RydWN0IHVkcGhkciAqdWg7Ci0JCXUzMiAqdWRwZGF0YTMyOworCQlfX2JlMzIgKnVkcGRhdGEzMjsKIAogCQl1aCA9IChzdHJ1Y3QgdWRwaGRyICopZXNwaDsKIAkJdWgtPnNvdXJjZSA9IGVuY2FwLT5lbmNhcF9zcG9ydDsKQEAgLTgxLDcgKzgxLDcgQEAKIAkJCWVzcGggPSAoc3RydWN0IGlwX2VzcF9oZHIgKikodWggKyAxKTsKIAkJCWJyZWFrOwogCQljYXNlIFVEUF9FTkNBUF9FU1BJTlVEUF9OT05fSUtFOgotCQkJdWRwZGF0YTMyID0gKHUzMiAqKSh1aCArIDEpOworCQkJdWRwZGF0YTMyID0gKF9fYmUzMiAqKSh1aCArIDEpOwogCQkJdWRwZGF0YTMyWzBdID0gdWRwZGF0YTMyWzFdID0gMDsKIAkJCWVzcGggPSAoc3RydWN0IGlwX2VzcF9oZHIgKikodWRwZGF0YTMyICsgMik7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKaW5kZXggOWMzOTlhNy4uZDQ3YjcyYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKKysrIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKQEAgLTQ4Miw5ICs0ODIsNyBAQAogCW1lbXNldChjZmcsIDAsIHNpemVvZigqY2ZnKSk7CiAKIAlydG0gPSBubG1zZ19kYXRhKG5saCk7Ci0JY2ZnLT5mY19mYW1pbHkgPSBydG0tPnJ0bV9mYW1pbHk7CiAJY2ZnLT5mY19kc3RfbGVuID0gcnRtLT5ydG1fZHN0X2xlbjsKLQljZmctPmZjX3NyY19sZW4gPSBydG0tPnJ0bV9zcmNfbGVuOwogCWNmZy0+ZmNfdG9zID0gcnRtLT5ydG1fdG9zOwogCWNmZy0+ZmNfdGFibGUgPSBydG0tPnJ0bV90YWJsZTsKIAljZmctPmZjX3Byb3RvY29sID0gcnRtLT5ydG1fcHJvdG9jb2w7CkBAIC01MDEsOSArNDk5LDYgQEAKIAkJY2FzZSBSVEFfRFNUOgogCQkJY2ZnLT5mY19kc3QgPSBubGFfZ2V0X2JlMzIoYXR0cik7CiAJCQlicmVhazsKLQkJY2FzZSBSVEFfU1JDOgotCQkJY2ZnLT5mY19zcmMgPSBubGFfZ2V0X2JlMzIoYXR0cik7Ci0JCQlicmVhazsKIAkJY2FzZSBSVEFfT0lGOgogCQkJY2ZnLT5mY19vaWYgPSBubGFfZ2V0X3UzMihhdHRyKTsKIAkJCWJyZWFrOwpAQCAtNzczLDggKzc2OCw4IEBACiB7CiAJCiAJc3RydWN0IGZpYl9yZXN1bHQgICAgICAgcmVzOwotCXN0cnVjdCBmbG93aSAgICAgICAgICAgIGZsID0geyAubmxfdSA9IHsgLmlwNF91ID0geyAuZGFkZHIgPSBmcm4tPmZsX2FkZHIsIAotCQkJCQkJCSAgICAuZndtYXJrID0gZnJuLT5mbF9md21hcmssCisJc3RydWN0IGZsb3dpICAgICAgICAgICAgZmwgPSB7IC5tYXJrID0gZnJuLT5mbF9tYXJrLAorCQkJCSAgICAgICAubmxfdSA9IHsgLmlwNF91ID0geyAuZGFkZHIgPSBmcm4tPmZsX2FkZHIsCiAJCQkJCQkJICAgIC50b3MgPSBmcm4tPmZsX3RvcywKIAkJCQkJCQkgICAgLnNjb3BlID0gZnJuLT5mbF9zY29wZSB9IH0gfTsKIAlpZiAodGIpIHsKQEAgLTgxNiw3ICs4MTEsNiBAQAogCQogCXBpZCA9IG5saC0+bmxtc2dfcGlkOyAgICAgICAgICAgLypwaWQgb2Ygc2VuZGluZyBwcm9jZXNzICovCiAJTkVUTElOS19DQihza2IpLnBpZCA9IDA7ICAgICAgICAgLyogZnJvbSBrZXJuZWwgKi8KLQlORVRMSU5LX0NCKHNrYikuZHN0X3BpZCA9IHBpZDsKIAlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gMDsgIC8qIHVuaWNhc3QgKi8KIAluZXRsaW5rX3VuaWNhc3Qoc2ssIHNrYiwgcGlkLCBNU0dfRE9OVFdBSVQpOwogfSAgICAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9oYXNoLmMgYi9uZXQvaXB2NC9maWJfaGFzaC5jCmluZGV4IDEwN2JiNmMuLjY0OGY0N2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9oYXNoLmMKKysrIGIvbmV0L2lwdjQvZmliX2hhc2guYwpAQCAtNDUsOCArNDUsOCBAQAogCiAjaW5jbHVkZSAiZmliX2xvb2t1cC5oIgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpmbl9oYXNoX2ttZW0gX19yZWFkX21vc3RseTsKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKmZuX2FsaWFzX2ttZW0gX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZm5faGFzaF9rbWVtIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZuX2FsaWFzX2ttZW0gX19yZWFkX21vc3RseTsKIAogc3RydWN0IGZpYl9ub2RlIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlmbl9oYXNoOwpAQCAtNDg1LDEzICs0ODUsMTMgQEAKIAkJZ290byBvdXQ7CiAKIAllcnIgPSAtRU5PQlVGUzsKLQluZXdfZmEgPSBrbWVtX2NhY2hlX2FsbG9jKGZuX2FsaWFzX2ttZW0sIFNMQUJfS0VSTkVMKTsKKwluZXdfZmEgPSBrbWVtX2NhY2hlX2FsbG9jKGZuX2FsaWFzX2ttZW0sIEdGUF9LRVJORUwpOwogCWlmIChuZXdfZmEgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKIAluZXdfZiA9IE5VTEw7CiAJaWYgKCFmKSB7Ci0JCW5ld19mID0ga21lbV9jYWNoZV9hbGxvYyhmbl9oYXNoX2ttZW0sIFNMQUJfS0VSTkVMKTsKKwkJbmV3X2YgPSBrbWVtX2NhY2hlX2FsbG9jKGZuX2hhc2hfa21lbSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChuZXdfZiA9PSBOVUxMKQogCQkJZ290byBvdXRfZnJlZV9uZXdfZmE7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKaW5kZXggMDg1MmI5Yy4uYjgzN2MzMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3J1bGVzLmMKKysrIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKQEAgLTQ0LDEwICs0NCw2IEBACiAJX19iZTMyCQkJc3JjbWFzazsKIAlfX2JlMzIJCQlkc3Q7CiAJX19iZTMyCQkJZHN0bWFzazsKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCi0JdTMyCQkJZndtYXJrOwotCXUzMgkJCWZ3bWFzazsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCiAJdTMyCQkJdGNsYXNzaWQ7CiAjZW5kaWYKQEAgLTE2MCwxMSArMTU2LDYgQEAKIAlpZiAoci0+dG9zICYmIChyLT50b3MgIT0gZmwtPmZsNF90b3MpKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19JUF9ST1VURV9GV01BUksKLQlpZiAoKHItPmZ3bWFyayBeIGZsLT5mbDRfZndtYXJrKSAmIHItPmZ3bWFzaykKLQkJcmV0dXJuIDA7Ci0jZW5kaWYKLQogCXJldHVybiAxOwogfQogCkBAIC0xNzksMTQgKzE3MCwxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgZmliNF9ydWxlX3BvbGljeVtGUkFfTUFYKzFdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JW0ZSQV9JRk5BTUVdCT0geyAudHlwZSA9IE5MQV9TVFJJTkcsIC5sZW4gPSBJRk5BTVNJWiAtIDEgfSwKLQlbRlJBX1BSSU9SSVRZXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJRlJBX0dFTkVSSUNfUE9MSUNZLAogCVtGUkFfU1JDXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW0ZSQV9EU1RdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbRlJBX0ZXTUFSS10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtGUkFfRldNQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW0ZSQV9GTE9XXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCi0JW0ZSQV9UQUJMRV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBmaWI0X3J1bGVfY29uZmlndXJlKHN0cnVjdCBmaWJfcnVsZSAqcnVsZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTIyMCwyMCArMjA3LDYgQEAKIAlpZiAodGJbRlJBX0RTVF0pCiAJCXJ1bGU0LT5kc3QgPSBubGFfZ2V0X2JlMzIodGJbRlJBX0RTVF0pOwogCi0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCWlmICh0YltGUkFfRldNQVJLXSkgewotCQlydWxlNC0+ZndtYXJrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFSS10pOwotCQlpZiAocnVsZTQtPmZ3bWFyaykKLQkJCS8qIGNvbXBhdGliaWxpdHk6IGlmIHRoZSBtYXJrIHZhbHVlIGlzIG5vbi16ZXJvIGFsbCBiaXRzCi0JCQkgKiBhcmUgY29tcGFyZWQgdW5sZXNzIGEgbWFzayBpcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KLQkJCSAqLwotCQkJcnVsZTQtPmZ3bWFzayA9IDB4RkZGRkZGRkY7Ci0JfQotCi0JaWYgKHRiW0ZSQV9GV01BU0tdKQotCQlydWxlNC0+ZndtYXNrID0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFTS10pOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQogCWlmICh0YltGUkFfRkxPV10pCiAJCXJ1bGU0LT50Y2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GTE9XXSk7CkBAIC0yNjQsMTQgKzIzNyw2IEBACiAJaWYgKGZyaC0+dG9zICYmIChydWxlNC0+dG9zICE9IGZyaC0+dG9zKSkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCi0JaWYgKHRiW0ZSQV9GV01BUktdICYmIChydWxlNC0+ZndtYXJrICE9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BUktdKSkpCi0JCXJldHVybiAwOwotCi0JaWYgKHRiW0ZSQV9GV01BU0tdICYmIChydWxlNC0+ZndtYXNrICE9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BU0tdKSkpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTkVUX0NMU19ST1VURQogCWlmICh0YltGUkFfRkxPV10gJiYgKHJ1bGU0LT50Y2xhc3NpZCAhPSBubGFfZ2V0X3UzMih0YltGUkFfRkxPV10pKSkKIAkJcmV0dXJuIDA7CkBAIC0yOTYsMTQgKzI2MSw2IEBACiAJZnJoLT5zcmNfbGVuID0gcnVsZTQtPnNyY19sZW47CiAJZnJoLT50b3MgPSBydWxlNC0+dG9zOwogCi0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCWlmIChydWxlNC0+ZndtYXJrKQotCQlOTEFfUFVUX1UzMihza2IsIEZSQV9GV01BUkssIHJ1bGU0LT5md21hcmspOwotCi0JaWYgKHJ1bGU0LT5md21hc2sgfHwgcnVsZTQtPmZ3bWFyaykKLQkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfRldNQVNLLCBydWxlNC0+ZndtYXNrKTsKLSNlbmRpZgotCiAJaWYgKHJ1bGU0LT5kc3RfbGVuKQogCQlOTEFfUFVUX0JFMzIoc2tiLCBGUkFfRFNULCBydWxlNC0+ZHN0KTsKIApAQCAtMzQyLDYgKzI5OSwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc2l6ZV90IGZpYjRfcnVsZV9ubG1zZ19wYXlsb2FkKHN0cnVjdCBmaWJfcnVsZSAqcnVsZSkKK3sKKwlyZXR1cm4gbmxhX3RvdGFsX3NpemUoNCkgLyogZHN0ICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogc3JjICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCk7IC8qIGZsb3cgKi8KK30KKwogc3RhdGljIHN0cnVjdCBmaWJfcnVsZXNfb3BzIGZpYjRfcnVsZXNfb3BzID0gewogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkucnVsZV9zaXplCT0gc2l6ZW9mKHN0cnVjdCBmaWI0X3J1bGUpLApAQCAtMzUxLDYgKzMxNSw3IEBACiAJLmNvbXBhcmUJPSBmaWI0X3J1bGVfY29tcGFyZSwKIAkuZmlsbAkJPSBmaWI0X3J1bGVfZmlsbCwKIAkuZGVmYXVsdF9wcmVmCT0gZmliNF9ydWxlX2RlZmF1bHRfcHJlZiwKKwkubmxtc2dfcGF5bG9hZAk9IGZpYjRfcnVsZV9ubG1zZ19wYXlsb2FkLAogCS5ubGdyb3VwCT0gUlROTEdSUF9JUFY0X1JVTEUsCiAJLnBvbGljeQkJPSBmaWI0X3J1bGVfcG9saWN5LAogCS5ydWxlc19saXN0CT0gJmZpYjRfcnVsZXMsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggODg0ZDE3Ni4uZTYzYjhhOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtMjczLDI1ICsyNzMsNDkgQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGZpYl9ubG1zZ19zaXplKHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7CisJc2l6ZV90IHBheWxvYWQgPSBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHJ0bXNnKSkKKwkJCSArIG5sYV90b3RhbF9zaXplKDQpIC8qIFJUQV9UQUJMRSAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCkgLyogUlRBX0RTVCAqLworCQkJICsgbmxhX3RvdGFsX3NpemUoNCkgLyogUlRBX1BSSU9SSVRZICovCisJCQkgKyBubGFfdG90YWxfc2l6ZSg0KTsgLyogUlRBX1BSRUZTUkMgKi8KKworCS8qIHNwYWNlIGZvciBuZXN0ZWQgbWV0cmljcyAqLworCXBheWxvYWQgKz0gbmxhX3RvdGFsX3NpemUoKFJUQVhfTUFYICogbmxhX3RvdGFsX3NpemUoNCkpKTsKKworCWlmIChmaS0+ZmliX25ocykgeworCQkvKiBBbHNvIGhhbmRsZXMgdGhlIHNwZWNpYWwgY2FzZSBmaWJfbmhzID09IDEgKi8KKworCQkvKiBlYWNoIG5leHRob3AgaXMgcGFja2VkIGluIGFuIGF0dHJpYnV0ZSAqLworCQlzaXplX3QgbmhzaXplID0gbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBydG5leHRob3ApKTsKKworCQkvKiBtYXkgY29udGFpbiBmbG93IGFuZCBnYXRld2F5IGF0dHJpYnV0ZSAqLworCQluaHNpemUgKz0gMiAqIG5sYV90b3RhbF9zaXplKDQpOworCisJCS8qIGFsbCBuZXh0aG9wcyBhcmUgcGFja2VkIGluIGEgbmVzdGVkIGF0dHJpYnV0ZSAqLworCQlwYXlsb2FkICs9IG5sYV90b3RhbF9zaXplKGZpLT5maWJfbmhzICogbmhzaXplKTsKKwl9CisKKwlyZXR1cm4gcGF5bG9hZDsKK30KKwogdm9pZCBydG1zZ19maWIoaW50IGV2ZW50LCBfX2JlMzIga2V5LCBzdHJ1Y3QgZmliX2FsaWFzICpmYSwKIAkgICAgICAgaW50IGRzdF9sZW4sIHUzMiB0Yl9pZCwgc3RydWN0IG5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgcGF5bG9hZCA9IHNpemVvZihzdHJ1Y3QgcnRtc2cpICsgMjU2OwogCXUzMiBzZXEgPSBpbmZvLT5ubGggPyBpbmZvLT5ubGgtPm5sbXNnX3NlcSA6IDA7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCi0Jc2tiID0gbmxtc2dfbmV3KG5sbXNnX3RvdGFsX3NpemUocGF5bG9hZCksIEdGUF9LRVJORUwpOworCXNrYiA9IG5sbXNnX25ldyhmaWJfbmxtc2dfc2l6ZShmYS0+ZmFfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBmaWJfZHVtcF9pbmZvKHNrYiwgaW5mby0+cGlkLCBzZXEsIGV2ZW50LCB0Yl9pZCwKIAkJCSAgICBmYS0+ZmFfdHlwZSwgZmEtPmZhX3Njb3BlLCBrZXksIGRzdF9sZW4sCiAJCQkgICAgZmEtPmZhX3RvcywgZmEtPmZhX2luZm8sIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBmaWJfbmxtc2dfc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCBpbmZvLT5waWQsIFJUTkxHUlBfSVBWNF9ST1VURSwKIAkJCSAgaW5mby0+bmxoLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl90cmllLmMgYi9uZXQvaXB2NC9maWJfdHJpZS5jCmluZGV4IGQxNzk5MGUuLmNmYjI0OWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl90cmllLmMKKysrIGIvbmV0L2lwdjQvZmliX3RyaWUuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiBzdGF0aWMgc3RydWN0IHRub2RlICpoYWx2ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bik7CiBzdGF0aWMgdm9pZCB0bm9kZV9mcmVlKHN0cnVjdCB0bm9kZSAqdG4pOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICpmbl9hbGlhc19rbWVtIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZuX2FsaWFzX2ttZW0gX19yZWFkX21vc3RseTsKIHN0YXRpYyBzdHJ1Y3QgdHJpZSAqdHJpZV9sb2NhbCA9IE5VTEwsICp0cmllX21haW4gPSBOVUxMOwogCiAKQEAgLTExODcsNyArMTE4Nyw3IEBACiAJCQl1OCBzdGF0ZTsKIAogCQkJZXJyID0gLUVOT0JVRlM7Ci0JCQluZXdfZmEgPSBrbWVtX2NhY2hlX2FsbG9jKGZuX2FsaWFzX2ttZW0sIFNMQUJfS0VSTkVMKTsKKwkJCW5ld19mYSA9IGttZW1fY2FjaGVfYWxsb2MoZm5fYWxpYXNfa21lbSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAobmV3X2ZhID09IE5VTEwpCiAJCQkJZ290byBvdXQ7CiAKQEAgLTEyMzIsNyArMTIzMiw3IEBACiAJCWdvdG8gb3V0OwogCiAJZXJyID0gLUVOT0JVRlM7Ci0JbmV3X2ZhID0ga21lbV9jYWNoZV9hbGxvYyhmbl9hbGlhc19rbWVtLCBTTEFCX0tFUk5FTCk7CisJbmV3X2ZhID0ga21lbV9jYWNoZV9hbGxvYyhmbl9hbGlhc19rbWVtLCBHRlBfS0VSTkVMKTsKIAlpZiAobmV3X2ZhID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pY21wLmMgYi9uZXQvaXB2NC9pY21wLmMKaW5kZXggYjM5YTM3YS4uNDBjZjBkMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWNtcC5jCisrKyBiL25ldC9pcHY0L2ljbXAuYwpAQCAtMzMyLDcgKzMzMiw3IEBACiAJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGljbXBfYnhtICppY21wX3BhcmFtID0gKHN0cnVjdCBpY21wX2J4bSAqKWZyb207Ci0JdW5zaWduZWQgaW50IGNzdW07CisJX193c3VtIGNzdW07CiAKIAljc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhpY21wX3BhcmFtLT5za2IsCiAJCQkJICAgICAgaWNtcF9wYXJhbS0+b2Zmc2V0ICsgb2Zmc2V0LApAQCAtMzU2LDcgKzM1Niw3IEBACiAJCWlwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKGljbXBfc29ja2V0LT5zayk7CiAJZWxzZSBpZiAoKHNrYiA9IHNrYl9wZWVrKCZpY21wX3NvY2tldC0+c2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgewogCQlzdHJ1Y3QgaWNtcGhkciAqaWNtcGggPSBza2ItPmguaWNtcGg7Ci0JCXVuc2lnbmVkIGludCBjc3VtID0gMDsKKwkJX193c3VtIGNzdW0gPSAwOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMTsKIAogCQlza2JfcXVldWVfd2FsaygmaWNtcF9zb2NrZXQtPnNrLT5za193cml0ZV9xdWV1ZSwgc2tiMSkgewpAQCAtOTMxLDcgKzkzMSw3IEBACiAKIAlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CiAJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKLQkJaWYgKCEodTE2KWNzdW1fZm9sZChza2ItPmNzdW0pKQorCQlpZiAoIWNzdW1fZm9sZChza2ItPmNzdW0pKQogCQkJYnJlYWs7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgQ0hFQ0tTVU1fTk9ORToKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCA2ZWVlNzE2Li4wMDE3Y2NiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC05MzIsNyArOTMyLDcgQEAKIAogCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKIAljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgotCQlpZiAoISh1MTYpY3N1bV9mb2xkKHNrYi0+Y3N1bSkpCisJCWlmICghY3N1bV9mb2xkKHNrYi0+Y3N1bSkpCiAJCQlicmVhazsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBDSEVDS1NVTV9OT05FOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYyBiL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMKaW5kZXggOTZiYmUyYS4uOWQ2ODgzNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYworKysgYi9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3NrX3JvdXRlX3JlcSk7CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGluZXRfc3lucV9oYXNoKGNvbnN0IF9fYmUzMiByYWRkciwgY29uc3QgX19iZTE2IHJwb3J0LAotCQkJCSBjb25zdCB1MzIgcm5kLCBjb25zdCB1MTYgc3lucV9oc2l6ZSkKKwkJCQkgY29uc3QgdTMyIHJuZCwgY29uc3QgdTMyIHN5bnFfaHNpemUpCiB7CiAJcmV0dXJuIGpoYXNoXzJ3b3JkcygoX19mb3JjZSB1MzIpcmFkZHIsIChfX2ZvcmNlIHUzMilycG9ydCwgcm5kKSAmIChzeW5xX2hzaXplIC0gMSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2hhc2h0YWJsZXMuYyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCmluZGV4IDI0NGM0ZjQuLjhjNzljOGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCisrKyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCkBAIC0yNywxMSArMjcsMTEgQEAKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGxvY2FsIHBvcnQgYmluZCBidWNrZXQuCiAgKiBUaGUgYmluZGhhc2ggbXV0ZXggZm9yIHNudW0ncyBoYXNoIGNoYWluIG11c3QgYmUgaGVsZCBoZXJlLgogICovCi1zdHJ1Y3QgaW5ldF9iaW5kX2J1Y2tldCAqaW5ldF9iaW5kX2J1Y2tldF9jcmVhdGUoa21lbV9jYWNoZV90ICpjYWNoZXAsCitzdHJ1Y3QgaW5ldF9iaW5kX2J1Y2tldCAqaW5ldF9iaW5kX2J1Y2tldF9jcmVhdGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKIAkJCQkJCSBzdHJ1Y3QgaW5ldF9iaW5kX2hhc2hidWNrZXQgKmhlYWQsCiAJCQkJCQkgY29uc3QgdW5zaWduZWQgc2hvcnQgc251bSkKIHsKLQlzdHJ1Y3QgaW5ldF9iaW5kX2J1Y2tldCAqdGIgPSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgU0xBQl9BVE9NSUMpOworCXN0cnVjdCBpbmV0X2JpbmRfYnVja2V0ICp0YiA9IGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBHRlBfQVRPTUlDKTsKIAogCWlmICh0YiAhPSBOVUxMKSB7CiAJCXRiLT5wb3J0ICAgICAgPSBzbnVtOwpAQCAtNDUsNyArNDUsNyBAQAogLyoKICAqIENhbGxlciBtdXN0IGhvbGQgaGFzaGJ1Y2tldCBsb2NrIGZvciB0aGlzIHRiIHdpdGggbG9jYWwgQkggZGlzYWJsZWQKICAqLwotdm9pZCBpbmV0X2JpbmRfYnVja2V0X2Rlc3Ryb3koa21lbV9jYWNoZV90ICpjYWNoZXAsIHN0cnVjdCBpbmV0X2JpbmRfYnVja2V0ICp0YikKK3ZvaWQgaW5ldF9iaW5kX2J1Y2tldF9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHN0cnVjdCBpbmV0X2JpbmRfYnVja2V0ICp0YikKIHsKIAlpZiAoaGxpc3RfZW1wdHkoJnRiLT5vd25lcnMpKSB7CiAJCV9faGxpc3RfZGVsKCZ0Yi0+bm9kZSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X3RpbWV3YWl0X3NvY2suYyBiL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCmluZGV4IGNkZDgwNTMuLjlmNDE0ZTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCisrKyBiL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jCkBAIC05MSw3ICs5MSw3IEBACiB7CiAJc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcgPQogCQlrbWVtX2NhY2hlX2FsbG9jKHNrLT5za19wcm90X2NyZWF0b3ItPnR3c2tfcHJvdC0+dHdza19zbGFiLAotCQkJCSBTTEFCX0FUT01JQyk7CisJCQkJIEdGUF9BVE9NSUMpOwogCWlmICh0dyAhPSBOVUxMKSB7CiAJCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIApAQCAtMTc4LDcgKzE3OCw2IEBACiAJbmVlZF90aW1lciA9IDA7CiAJaWYgKGluZXRfdHdkcl9kb190d2tpbGxfd29yayh0d2RyLCB0d2RyLT5zbG90KSkgewogCQl0d2RyLT50aHJlYWRfc2xvdHMgfD0gKDEgPDwgdHdkci0+c2xvdCk7Ci0JCW1iKCk7CiAJCXNjaGVkdWxlX3dvcmsoJnR3ZHItPnR3a2lsbF93b3JrKTsKIAkJbmVlZF90aW1lciA9IDE7CiAJfSBlbHNlIHsKQEAgLTE5Nyw5ICsxOTYsMTAgQEAKIAogZXh0ZXJuIHZvaWQgdHdraWxsX3Nsb3RzX2ludmFsaWQodm9pZCk7CiAKLXZvaWQgaW5ldF90d2RyX3R3a2lsbF93b3JrKHZvaWQgKmRhdGEpCit2b2lkIGluZXRfdHdkcl90d2tpbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93ICp0d2RyID0gZGF0YTsKKwlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKnR3ZHIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93LCB0d2tpbGxfd29yayk7CiAJaW50IGk7CiAKIAlpZiAoKElORVRfVFdEUl9UV0tJTExfU0xPVFMgLSAxKSA+IChzaXplb2YodHdkci0+dGhyZWFkX3Nsb3RzKSAqIDgpKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldHBlZXIuYyBiL25ldC9pcHY0L2luZXRwZWVyLmMKaW5kZXggMmIxYTU0Yi4uNzExZWI2ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldHBlZXIuYworKysgYi9uZXQvaXB2NC9pbmV0cGVlci5jCkBAIC03Myw3ICs3Myw3IEBACiAvKiBFeHBvcnRlZCBmb3IgaW5ldF9nZXRpZCBpbmxpbmUgZnVuY3Rpb24uICAqLwogREVGSU5FX1NQSU5MT0NLKGluZXRfcGVlcl9pZGxvY2spOwogCi1zdGF0aWMga21lbV9jYWNoZV90ICpwZWVyX2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwZWVyX2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCiAjZGVmaW5lIG5vZGVfaGVpZ2h0KHgpIHgtPmF2bF9oZWlnaHQKIHN0YXRpYyBzdHJ1Y3QgaW5ldF9wZWVyIHBlZXJfZmFrZV9ub2RlID0gewpAQCAtOTQsMTAgKzk0LDggQEAKIGludCBpbmV0X3BlZXJfbWF4dHRsID0gMTAgKiA2MCAqIEhaOwkvKiB1c3VhbCB0aW1lIHRvIGxpdmU6IDEwIG1pbiAqLwogCiBzdGF0aWMgc3RydWN0IGluZXRfcGVlciAqaW5ldF9wZWVyX3VudXNlZF9oZWFkOwotLyogRXhwb3J0ZWQgZm9yIGluZXRfcHV0cGVlciBpbmxpbmUgZnVuY3Rpb24uICAqLwotc3RydWN0IGluZXRfcGVlciAqKmluZXRfcGVlcl91bnVzZWRfdGFpbHAgPSAmaW5ldF9wZWVyX3VudXNlZF9oZWFkOwotREVGSU5FX1NQSU5MT0NLKGluZXRfcGVlcl91bnVzZWRfbG9jayk7Ci0jZGVmaW5lIFBFRVJfTUFYX0NMRUFOVVBfV09SSyAzMAorc3RhdGljIHN0cnVjdCBpbmV0X3BlZXIgKippbmV0X3BlZXJfdW51c2VkX3RhaWxwID0gJmluZXRfcGVlcl91bnVzZWRfaGVhZDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKIAogc3RhdGljIHZvaWQgcGVlcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSk7CiBzdGF0aWMgREVGSU5FX1RJTUVSKHBlZXJfcGVyaW9kaWNfdGltZXIsIHBlZXJfY2hlY2tfZXhwaXJlLCAwLCAwKTsKQEAgLTM0MCw3ICszMzgsOCBAQAogCXNwaW5fbG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKIAlwID0gaW5ldF9wZWVyX3VudXNlZF9oZWFkOwogCWlmIChwICE9IE5VTEwpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIocC0+ZHRpbWUgKyB0dGwsIGppZmZpZXMpKSB7CisJCV9fdTMyIGRlbHRhID0gKF9fdTMyKWppZmZpZXMgLSBwLT5kdGltZTsKKwkJaWYgKGRlbHRhIDwgdHRsKSB7CiAJCQkvKiBEbyBub3QgcHJ1bmUgZnJlc2ggZW50cmllcy4gKi8KIAkJCXNwaW5fdW5sb2NrX2JoKCZpbmV0X3BlZXJfdW51c2VkX2xvY2spOwogCQkJcmV0dXJuIC0xOwpAQCAtNDMyLDcgKzQzMSw3IEBACiAvKiBDYWxsZWQgd2l0aCBsb2NhbCBCSCBkaXNhYmxlZC4gKi8KIHN0YXRpYyB2b2lkIHBlZXJfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZHVtbXkpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCWludCB0dGw7CiAKIAlpZiAocGVlcl90b3RhbCA+PSBpbmV0X3BlZXJfdGhyZXNob2xkKQpAQCAtNDQxLDcgKzQ0MCwxMCBAQAogCQl0dGwgPSBpbmV0X3BlZXJfbWF4dHRsCiAJCQkJLSAoaW5ldF9wZWVyX21heHR0bCAtIGluZXRfcGVlcl9taW50dGwpIC8gSFogKgogCQkJCQlwZWVyX3RvdGFsIC8gaW5ldF9wZWVyX3RocmVzaG9sZCAqIEhaOwotCWZvciAoaSA9IDA7IGkgPCBQRUVSX01BWF9DTEVBTlVQX1dPUksgJiYgIWNsZWFudXBfb25jZSh0dGwpOyBpKyspOworCXdoaWxlICghY2xlYW51cF9vbmNlKHR0bCkpIHsKKwkJaWYgKGppZmZpZXMgIT0gbm93KQorCQkJYnJlYWs7CisJfQogCiAJLyogVHJpZ2dlciB0aGUgdGltZXIgYWZ0ZXIgaW5ldF9wZWVyX2djX21pbnRpbWUgLi4gaW5ldF9wZWVyX2djX21heHRpbWUKIAkgKiBpbnRlcnZhbCBkZXBlbmRpbmcgb24gdGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIChtb3JlIGVudHJpZXMsCkBAIC00NTUsMyArNDU3LDE2IEBACiAJCQkJcGVlcl90b3RhbCAvIGluZXRfcGVlcl90aHJlc2hvbGQgKiBIWjsKIAlhZGRfdGltZXIoJnBlZXJfcGVyaW9kaWNfdGltZXIpOwogfQorCit2b2lkIGluZXRfcHV0cGVlcihzdHJ1Y3QgaW5ldF9wZWVyICpwKQoreworCXNwaW5fbG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcC0+cmVmY250KSkgeworCQlwLT51bnVzZWRfcHJldnAgPSBpbmV0X3BlZXJfdW51c2VkX3RhaWxwOworCQlwLT51bnVzZWRfbmV4dCA9IE5VTEw7CisJCSppbmV0X3BlZXJfdW51c2VkX3RhaWxwID0gcDsKKwkJaW5ldF9wZWVyX3VudXNlZF90YWlscCA9ICZwLT51bnVzZWRfbmV4dDsKKwkJcC0+ZHRpbWUgPSAoX191MzIpamlmZmllczsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmluZXRfcGVlcl91bnVzZWRfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9mcmFnbWVudC5jIGIvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYwppbmRleCA3NDA0NmVmLi44Y2UwMGQzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCisrKyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKQEAgLTU2NSw3ICs1NjUsNyBAQAogCQl9IGVsc2UgewogCQkJc3RydWN0IHNrX2J1ZmYgKmZyZWVfaXQgPSBuZXh0OwogCi0JCQkvKiBPbGQgZnJhZ21uZXQgaXMgY29tcGxldGVseSBvdmVycmlkZGVuIHdpdGgKKwkJCS8qIE9sZCBmcmFnbWVudCBpcyBjb21wbGV0ZWx5IG92ZXJyaWRkZW4gd2l0aAogCQkJICogbmV3IG9uZSBkcm9wIGl0LgogCQkJICovCiAJCQluZXh0ID0gbmV4dC0+bmV4dDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2dyZS5jIGIvbmV0L2lwdjQvaXBfZ3JlLmMKaW5kZXggZDViNWRlYy4uNDc2Y2I2MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZ3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfZ3JlLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogICovCiAKICNkZWZpbmUgSEFTSF9TSVpFICAxNgotI2RlZmluZSBIQVNIKGFkZHIpICgoYWRkcl4oYWRkcj4+NCkpJjB4RikKKyNkZWZpbmUgSEFTSChhZGRyKSAoKChfX2ZvcmNlIHUzMilhZGRyXigoX19mb3JjZSB1MzIpYWRkcj4+NCkpJjB4RikKIAogc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbHNbNF1bSEFTSF9TSVpFXTsKIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIC8qIEdpdmVuIHNyYywgZHN0IGFuZCBrZXksIGZpbmQgYXBwcm9wcmlhdGUgZm9yIGlucHV0IHR1bm5lbC4gKi8KIAotc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKiBpcGdyZV90dW5uZWxfbG9va3VwKHUzMiByZW1vdGUsIHUzMiBsb2NhbCwgdTMyIGtleSkKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBncmVfdHVubmVsX2xvb2t1cChfX2JlMzIgcmVtb3RlLCBfX2JlMzIgbG9jYWwsIF9fYmUzMiBrZXkpCiB7CiAJdW5zaWduZWQgaDAgPSBIQVNIKHJlbW90ZSk7CiAJdW5zaWduZWQgaDEgPSBIQVNIKGtleSk7CkBAIC0xOTQsOSArMTk0LDkgQEAKIAogc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKippcGdyZV9idWNrZXQoc3RydWN0IGlwX3R1bm5lbCAqdCkKIHsKLQl1MzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOwotCXUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKLQl1MzIga2V5ID0gdC0+cGFybXMuaV9rZXk7CisJX19iZTMyIHJlbW90ZSA9IHQtPnBhcm1zLmlwaC5kYWRkcjsKKwlfX2JlMzIgbG9jYWwgPSB0LT5wYXJtcy5pcGguc2FkZHI7CisJX19iZTMyIGtleSA9IHQtPnBhcm1zLmlfa2V5OwogCXVuc2lnbmVkIGggPSBIQVNIKGtleSk7CiAJaW50IHByaW8gPSAwOwogCkBAIC0yMzYsOSArMjM2LDkgQEAKIAogc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKiBpcGdyZV90dW5uZWxfbG9jYXRlKHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybXMsIGludCBjcmVhdGUpCiB7Ci0JdTMyIHJlbW90ZSA9IHBhcm1zLT5pcGguZGFkZHI7Ci0JdTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKLQl1MzIga2V5ID0gcGFybXMtPmlfa2V5OworCV9fYmUzMiByZW1vdGUgPSBwYXJtcy0+aXBoLmRhZGRyOworCV9fYmUzMiBsb2NhbCA9IHBhcm1zLT5pcGguc2FkZHI7CisJX19iZTMyIGtleSA9IHBhcm1zLT5pX2tleTsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBoID0gSEFTSChrZXkpOwpAQCAtMzE5LDEyICszMTksMTIgQEAKICAqLwogCiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilza2ItPmRhdGE7Ci0JdTE2CSAgICAgKnAgPSAodTE2Kikoc2tiLT5kYXRhKyhpcGgtPmlobDw8MikpOworCV9fYmUxNgkgICAgICpwID0gKF9fYmUxNiopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKIAlpbnQgZ3JlaGxlbiA9IChpcGgtPmlobDw8MikgKyA0OwogCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwogCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOwogCXN0cnVjdCBpcF90dW5uZWwgKnQ7Ci0JdTE2IGZsYWdzOworCV9fYmUxNiBmbGFnczsKIAogCWZsYWdzID0gcFswXTsKIAlpZiAoZmxhZ3MmKEdSRV9DU1VNfEdSRV9LRVl8R1JFX1NFUXxHUkVfUk9VVElOR3xHUkVfVkVSU0lPTikpIHsKQEAgLTM3MCw3ICszNzAsNyBAQAogCX0KIAogCXJlYWRfbG9jaygmaXBncmVfbG9jayk7Ci0JdCA9IGlwZ3JlX3R1bm5lbF9sb29rdXAoaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgKGZsYWdzJkdSRV9LRVkpID8gKigoKHUzMiopcCkgKyAoZ3JlaGxlbj4+MikgLSAxKSA6IDApOworCXQgPSBpcGdyZV90dW5uZWxfbG9va3VwKGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIChmbGFncyZHUkVfS0VZKSA/ICooKChfX2JlMzIqKXApICsgKGdyZWhsZW4+PjIpIC0gMSkgOiAwKTsKIAlpZiAodCA9PSBOVUxMIHx8IHQtPnBhcm1zLmlwaC5kYWRkciA9PSAwIHx8IE1VTFRJQ0FTVCh0LT5wYXJtcy5pcGguZGFkZHIpKQogCQlnb3RvIG91dDsKIApAQCAtMzg4LDE0ICszODgsMTQgQEAKICNlbHNlCiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilkcDsKIAlzdHJ1Y3QgaXBoZHIgKmVpcGg7Ci0JdTE2CSAgICAgKnAgPSAodTE2KikoZHArKGlwaC0+aWhsPDwyKSk7CisJX19iZTE2CSAgICAgKnAgPSAoX19iZTE2KikoZHArKGlwaC0+aWhsPDwyKSk7CiAJaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7CiAJaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CiAJaW50IHJlbF90eXBlID0gMDsKIAlpbnQgcmVsX2NvZGUgPSAwOwogCV9fYmUzMiByZWxfaW5mbyA9IDA7CiAJX191MzIgbiA9IDA7Ci0JdTE2IGZsYWdzOworCV9fYmUxNiBmbGFnczsKIAlpbnQgZ3JlaGxlbiA9IChpcGgtPmlobDw8MikgKyA0OwogCXN0cnVjdCBza19idWZmICpza2IyOwogCXN0cnVjdCBmbG93aSBmbDsKQEAgLTU1Niw5ICs1NTYsOSBAQAogewogCXN0cnVjdCBpcGhkciAqaXBoOwogCXU4ICAgICAqaDsKLQl1MTYgICAgZmxhZ3M7Ci0JdTE2ICAgIGNzdW0gPSAwOwotCXUzMiAgICBrZXkgPSAwOworCV9fYmUxNiAgICBmbGFnczsKKwlfX3N1bTE2ICAgY3N1bSA9IDA7CisJX19iZTMyIGtleSA9IDA7CiAJdTMyICAgIHNlcW5vID0gMDsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CiAJaW50ICAgIG9mZnNldCA9IDQ7CkBAIC01NjgsNyArNTY4LDcgQEAKIAogCWlwaCA9IHNrYi0+bmguaXBoOwogCWggPSBza2ItPmRhdGE7Ci0JZmxhZ3MgPSAqKHUxNiopaDsKKwlmbGFncyA9ICooX19iZTE2KiloOwogCiAJaWYgKGZsYWdzJihHUkVfQ1NVTXxHUkVfS0VZfEdSRV9ST1VUSU5HfEdSRV9TRVF8R1JFX1ZFUlNJT04pKSB7CiAJCS8qIC0gVmVyc2lvbiBtdXN0IGJlIDAuCkBAIC01ODAsNyArNTgwLDcgQEAKIAkJaWYgKGZsYWdzJkdSRV9DU1VNKSB7CiAJCQlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CiAJCQljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgotCQkJCWNzdW0gPSAodTE2KWNzdW1fZm9sZChza2ItPmNzdW0pOworCQkJCWNzdW0gPSBjc3VtX2ZvbGQoc2tiLT5jc3VtKTsKIAkJCQlpZiAoIWNzdW0pCiAJCQkJCWJyZWFrOwogCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtNTkyLDExICs1OTIsMTEgQEAKIAkJCW9mZnNldCArPSA0OwogCQl9CiAJCWlmIChmbGFncyZHUkVfS0VZKSB7Ci0JCQlrZXkgPSAqKHUzMiopKGggKyBvZmZzZXQpOworCQkJa2V5ID0gKihfX2JlMzIqKShoICsgb2Zmc2V0KTsKIAkJCW9mZnNldCArPSA0OwogCQl9CiAJCWlmIChmbGFncyZHUkVfU0VRKSB7Ci0JCQlzZXFubyA9IG50b2hsKCoodTMyKikoaCArIG9mZnNldCkpOworCQkJc2Vxbm8gPSBudG9obCgqKF9fYmUzMiopKGggKyBvZmZzZXQpKTsKIAkJCW9mZnNldCArPSA0OwogCQl9CiAJfQpAQCAtNjA1LDcgKzYwNSw3IEBACiAJaWYgKCh0dW5uZWwgPSBpcGdyZV90dW5uZWxfbG9va3VwKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsIGtleSkpICE9IE5VTEwpIHsKIAkJc2VjcGF0aF9yZXNldChza2IpOwogCi0JCXNrYi0+cHJvdG9jb2wgPSAqKHUxNiopKGggKyAyKTsKKwkJc2tiLT5wcm90b2NvbCA9ICooX19iZTE2KikoaCArIDIpOwogCQkvKiBXQ0NQIHZlcnNpb24gMSBhbmQgMiBwcm90b2NvbCBkZWNvZGluZy4KIAkJICogLSBDaGFuZ2UgcHJvdG9jb2wgdG8gSVAKIAkJICogLSBXaGVuIGRlYWxpbmcgd2l0aCBXQ0NQdjIsIFNraXAgZXh0cmEgNCBieXRlcyBpbiBHUkUgaGVhZGVyCkBAIC02NzMsMTMgKzY3MywxMyBAQAogCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBza2ItPm5oLmlwaDsKIAlzdHJ1Y3QgaXBoZHIgICp0aXBoOwogCXU4ICAgICB0b3M7Ci0JdTE2ICAgIGRmOworCV9fYmUxNiBkZjsKIAlzdHJ1Y3QgcnRhYmxlICpydDsgICAgIAkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CQkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KIAlzdHJ1Y3QgaXBoZHIgICppcGg7CQkJLyogT3VyIG5ldyBJUCBoZWFkZXIgKi8KIAlpbnQgICAgbWF4X2hlYWRyb29tOwkJCS8qIFRoZSBleHRyYSBoZWFkZXIgc3BhY2UgbmVlZGVkICovCiAJaW50ICAgIGdyZV9obGVuOwotCXUzMiAgICBkc3Q7CisJX19iZTMyIGRzdDsKIAlpbnQgICAgbXR1OwogCiAJaWYgKHR1bm5lbC0+cmVjdXJzaW9uKyspIHsKQEAgLTg2MCwxMSArODYwLDExIEBACiAJCQlpcGgtPnR0bCA9IGRzdF9tZXRyaWMoJnJ0LT51LmRzdCwgUlRBWF9IT1BMSU1JVCk7CiAJfQogCi0JKCh1MTYqKShpcGgrMSkpWzBdID0gdHVubmVsLT5wYXJtcy5vX2ZsYWdzOwotCSgodTE2KikoaXBoKzEpKVsxXSA9IHNrYi0+cHJvdG9jb2w7CisJKChfX2JlMTYqKShpcGgrMSkpWzBdID0gdHVubmVsLT5wYXJtcy5vX2ZsYWdzOworCSgoX19iZTE2KikoaXBoKzEpKVsxXSA9IHNrYi0+cHJvdG9jb2w7CiAKIAlpZiAodHVubmVsLT5wYXJtcy5vX2ZsYWdzJihHUkVfS0VZfEdSRV9DU1VNfEdSRV9TRVEpKSB7Ci0JCXUzMiAqcHRyID0gKHUzMiopKCgodTgqKWlwaCkgKyB0dW5uZWwtPmhsZW4gLSA0KTsKKwkJX19iZTMyICpwdHIgPSAoX19iZTMyKikoKCh1OCopaXBoKSArIHR1bm5lbC0+aGxlbiAtIDQpOwogCiAJCWlmICh0dW5uZWwtPnBhcm1zLm9fZmxhZ3MmR1JFX1NFUSkgewogCQkJKyt0dW5uZWwtPm9fc2Vxbm87CkBAIC04NzcsNyArODc3LDcgQEAKIAkJfQogCQlpZiAodHVubmVsLT5wYXJtcy5vX2ZsYWdzJkdSRV9DU1VNKSB7CiAJCQkqcHRyID0gMDsKLQkJCSooX191MTYqKXB0ciA9IGlwX2NvbXB1dGVfY3N1bSgodm9pZCopKGlwaCsxKSwgc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJCQkqKF9fc3VtMTYqKXB0ciA9IGlwX2NvbXB1dGVfY3N1bSgodm9pZCopKGlwaCsxKSwgc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJCX0KIAl9CiAKQEAgLTEwNjgsNyArMTA2OCw3IEBACiB7CiAJc3RydWN0IGlwX3R1bm5lbCAqdCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLCB0LT5obGVuKTsKLQl1MTYgKnAgPSAodTE2KikoaXBoKzEpOworCV9fYmUxNiAqcCA9IChfX2JlMTYqKShpcGgrMSk7CiAKIAltZW1jcHkoaXBoLCAmdC0+cGFybXMuaXBoLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJcFswXQkJPSB0LT5wYXJtcy5vX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3B0aW9ucy5jIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCmluZGV4IDhkYWJiZmMuLjlmMDI5MTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX29wdGlvbnMuYworKysgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCQkJCW9wdC0+cm91dGVyX2FsZXJ0ID0gb3B0cHRyIC0gaXBoOwogCQkJYnJlYWs7CiAJCSAgICAgIGNhc2UgSVBPUFRfQ0lQU086Ci0JCSAgICAgICAgaWYgKG9wdC0+Y2lwc28pIHsKKwkJCWlmICgoIXNrYiAmJiAhY2FwYWJsZShDQVBfTkVUX1JBVykpIHx8IG9wdC0+Y2lwc28pIHsKIAkJCQlwcF9wdHIgPSBvcHRwdHI7CiAJCQkJZ290byBlcnJvcjsKIAkJCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggZmMxOTVhNC4uZjA3MWY4NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgpAQCAtMTYzLDcgKzE2NCw2IEBACiBzdGF0aWMgaW5saW5lIGludCBpcF9maW5pc2hfb3V0cHV0MihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYi0+ZHN0OwotCXN0cnVjdCBoaF9jYWNoZSAqaGggPSBkc3QtPmhoOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkc3QtPmRldjsKIAlpbnQgaGhfbGVuID0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KTsKIApAQCAtMTgyLDE2ICsxODIsOSBAQAogCQlza2IgPSBza2IyOwogCX0KIAotCWlmIChoaCkgewotCQlpbnQgaGhfYWxlbjsKLQotCQlyZWFkX2xvY2tfYmgoJmhoLT5oaF9sb2NrKTsKLQkJaGhfYWxlbiA9IEhIX0RBVEFfQUxJR04oaGgtPmhoX2xlbik7Ci0gIAkJbWVtY3B5KHNrYi0+ZGF0YSAtIGhoX2FsZW4sIGhoLT5oaF9kYXRhLCBoaF9hbGVuKTsKLQkJcmVhZF91bmxvY2tfYmgoJmhoLT5oaF9sb2NrKTsKLQkgICAgICAgIHNrYl9wdXNoKHNrYiwgaGgtPmhoX2xlbik7Ci0JCXJldHVybiBoaC0+aGhfb3V0cHV0KHNrYik7Ci0JfSBlbHNlIGlmIChkc3QtPm5laWdoYm91cikKKwlpZiAoZHN0LT5oaCkKKwkJcmV0dXJuIG5laWdoX2hoX291dHB1dChkc3QtPmhoLCBza2IpOworCWVsc2UgaWYgKGRzdC0+bmVpZ2hib3VyKQogCQlyZXR1cm4gZHN0LT5uZWlnaGJvdXItPm91dHB1dChza2IpOwogCiAJaWYgKG5ldF9yYXRlbGltaXQoKSkKQEAgLTI4OCw5ICsyODEsOCBAQAogCQkJICAgICEoSVBDQihza2IpLT5mbGFncyAmIElQU0tCX1JFUk9VVEVEKSk7CiB9CiAKLWludCBpcF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIGludCBpcGZyYWdvaykKK2ludCBpcF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywgaW50IGlwZnJhZ29rKQogewotCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcF9vcHRpb25zICpvcHQgPSBpbmV0LT5vcHQ7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CkBAIC0zNDIsNyArMzM0LDcgQEAKIAogCS8qIE9LLCB3ZSBrbm93IHdoZXJlIHRvIHNlbmQgaXQsIGFsbG9jYXRlIGFuZCBidWlsZCBJUCBoZWFkZXIuICovCiAJaXBoID0gKHN0cnVjdCBpcGhkciAqKSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgKG9wdCA/IG9wdC0+b3B0bGVuIDogMCkpOwotCSooKF9fdTE2ICopaXBoKQk9IGh0b25zKCg0IDw8IDEyKSB8ICg1IDw8IDgpIHwgKGluZXQtPnRvcyAmIDB4ZmYpKTsKKwkqKChfX2JlMTYgKilpcGgpID0gaHRvbnMoKDQgPDwgMTIpIHwgKDUgPDwgOCkgfCAoaW5ldC0+dG9zICYgMHhmZikpOwogCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKIAlpZiAoaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT51LmRzdCkgJiYgIWlwZnJhZ29rKQogCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOwpAQCAtMzg2LDYgKzM3OCw3IEBACiAJZHN0X3JlbGVhc2UodG8tPmRzdCk7CiAJdG8tPmRzdCA9IGRzdF9jbG9uZShmcm9tLT5kc3QpOwogCXRvLT5kZXYgPSBmcm9tLT5kZXY7CisJdG8tPm1hcmsgPSBmcm9tLT5tYXJrOwogCiAJLyogQ29weSB0aGUgZmxhZ3MgdG8gZWFjaCBmcmFnbWVudC4gKi8KIAlJUENCKHRvKS0+ZmxhZ3MgPSBJUENCKGZyb20pLT5mbGFnczsKQEAgLTM5NCw3ICszODcsNiBAQAogCXRvLT50Y19pbmRleCA9IGZyb20tPnRjX2luZGV4OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUgotCXRvLT5uZm1hcmsgPSBmcm9tLT5uZm1hcms7CiAJLyogQ29ubmVjdGlvbiBhc3NvY2lhdGlvbiBpcyBzYW1lIGFzIHByZS1mcmFnIHBhY2tldCAqLwogCW5mX2Nvbm50cmFja19wdXQodG8tPm5mY3QpOwogCXRvLT5uZmN0ID0gZnJvbS0+bmZjdDsKQEAgLTY4Myw3ICs2NzUsNyBAQAogCQlpZiAobWVtY3B5X2Zyb21pb3ZlY2VuZCh0bywgaW92LCBvZmZzZXQsIGxlbikgPCAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfSBlbHNlIHsKLQkJdW5zaWduZWQgaW50IGNzdW0gPSAwOworCQlfX3dzdW0gY3N1bSA9IDA7CiAJCWlmIChjc3VtX3BhcnRpYWxfY29weV9mcm9taW92ZWNlbmQodG8sIGlvdiwgb2Zmc2V0LCBsZW4sICZjc3VtKSA8IDApCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLCBjc3VtLCBvZGQpOwpAQCAtNjkxLDExICs2ODMsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK3N0YXRpYyBpbmxpbmUgX193c3VtCiBjc3VtX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvZmZzZXQsIGludCBjb3B5KQogewogCWNoYXIgKmthZGRyOwotCXVuc2lnbmVkIGludCBjc3VtOworCV9fd3N1bSBjc3VtOwogCWthZGRyID0ga21hcChwYWdlKTsKIAljc3VtID0gY3N1bV9wYXJ0aWFsKGthZGRyICsgb2Zmc2V0LCBjb3B5LCAwKTsKIAlrdW5tYXAocGFnZSk7CkBAIC0xMTY3LDcgKzExNTksNyBAQAogCQl9CiAKIAkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKLQkJCXVuc2lnbmVkIGludCBjc3VtOworCQkJX193c3VtIGNzdW07CiAJCQljc3VtID0gY3N1bV9wYWdlKHBhZ2UsIG9mZnNldCwgbGVuKTsKIAkJCXNrYi0+Y3N1bSA9IGNzdW1fYmxvY2tfYWRkKHNrYi0+Y3N1bSwgY3N1bSwgc2tiLT5sZW4pOwogCQl9CkBAIC0xMzE1LDcgKzEzMDcsNyBAQAogc3RhdGljIGludCBpcF9yZXBseV9nbHVlX2JpdHModm9pZCAqZHB0ciwgY2hhciAqdG8sIGludCBvZmZzZXQsIAogCQkJICAgICAgaW50IGxlbiwgaW50IG9kZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQl1bnNpZ25lZCBpbnQgY3N1bTsKKwlfX3dzdW0gY3N1bTsKIAogCWNzdW0gPSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGRwdHIrb2Zmc2V0LCB0bywgbGVuLCAwKTsKIAlza2ItPmNzdW0gPSBjc3VtX2Jsb2NrX2FkZChza2ItPmNzdW0sIGNzdW0sIG9kZCk7CkBAIC0xMzg1LDcgKzEzNzcsNyBAQAogCQkgICAgICAgJmlwYywgcnQsIE1TR19ET05UV0FJVCk7CiAJaWYgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgewogCQlpZiAoYXJnLT5jc3Vtb2Zmc2V0ID49IDApCi0JCQkqKCh1MTYgKilza2ItPmgucmF3ICsgYXJnLT5jc3Vtb2Zmc2V0KSA9IGNzdW1fZm9sZChjc3VtX2FkZChza2ItPmNzdW0sIGFyZy0+Y3N1bSkpOworCQkJKigoX19zdW0xNiAqKXNrYi0+aC5yYXcgKyBhcmctPmNzdW1vZmZzZXQpID0gY3N1bV9mb2xkKGNzdW1fYWRkKHNrYi0+Y3N1bSwgYXJnLT5jc3VtKSk7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJaXBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKaW5kZXggNGIxMzI5NS4uNTdkNGJhZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYworKysgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCkBAIC0zNTUsNyArMzU1LDcgQEAKIAlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopbXNnLT5tc2dfbmFtZTsKIAlpZiAoc2luKSB7CiAJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCXNpbi0+c2luX2FkZHIuc19hZGRyID0gKih1MzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0KTsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSAqKF9fYmUzMiopKHNrYi0+bmgucmF3ICsgc2Vyci0+YWRkcl9vZmZzZXQpOwogCQlzaW4tPnNpbl9wb3J0ID0gc2Vyci0+cG9ydDsKIAkJbWVtc2V0KCZzaW4tPnNpbl96ZXJvLCAwLCBzaXplb2Yoc2luLT5zaW5femVybykpOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmluZGV4IGY4Y2U4NDcuLmFmYTYwYjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIGIvbmV0L2lwdjQvaXBjb25maWcuYwpAQCAtMTAxLDYgKzEwMSw3IEBACiAjZGVmaW5lIENPTkZfTkFNRVNFUlZFUlNfTUFYICAgMyAgICAgICAvKiBNYXhpbXVtIG51bWJlciBvZiBuYW1lc2VydmVycyAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAnMycgZnJvbSByZXNvbHYuaCAqLwogCisjZGVmaW5lIE5PTkUgX19jb25zdGFudF9odG9ubChJTkFERFJfTk9ORSkKIAogLyoKICAqIFB1YmxpYyBJUCBjb25maWd1cmF0aW9uCkBAIC0xMjksMTkgKzEzMCwxOSBAQAogCiBzdGF0aWMgaW50IGljX2hvc3RfbmFtZV9zZXQgX19pbml0ZGF0YSA9IDA7CS8qIEhvc3QgbmFtZSBzZXQgYnkgdXM/ICovCiAKLXUzMiBpY19teWFkZHIgPSBJTkFERFJfTk9ORTsJCS8qIE15IElQIGFkZHJlc3MgKi8KLXN0YXRpYyB1MzIgaWNfbmV0bWFzayA9IElOQUREUl9OT05FOwkvKiBOZXRtYXNrIGZvciBsb2NhbCBzdWJuZXQgKi8KLXUzMiBpY19nYXRld2F5ID0gSU5BRERSX05PTkU7CS8qIEdhdGV3YXkgSVAgYWRkcmVzcyAqLworX19iZTMyIGljX215YWRkciA9IE5PTkU7CQkvKiBNeSBJUCBhZGRyZXNzICovCitzdGF0aWMgX19iZTMyIGljX25ldG1hc2sgPSBOT05FOwkvKiBOZXRtYXNrIGZvciBsb2NhbCBzdWJuZXQgKi8KK19fYmUzMiBpY19nYXRld2F5ID0gTk9ORTsJLyogR2F0ZXdheSBJUCBhZGRyZXNzICovCiAKLXUzMiBpY19zZXJ2YWRkciA9IElOQUREUl9OT05FOwkvKiBCb290IHNlcnZlciBJUCBhZGRyZXNzICovCitfX2JlMzIgaWNfc2VydmFkZHIgPSBOT05FOwkvKiBCb290IHNlcnZlciBJUCBhZGRyZXNzICovCiAKLXUzMiByb290X3NlcnZlcl9hZGRyID0gSU5BRERSX05PTkU7CS8qIEFkZHJlc3Mgb2YgTkZTIHNlcnZlciAqLworX19iZTMyIHJvb3Rfc2VydmVyX2FkZHIgPSBOT05FOwkvKiBBZGRyZXNzIG9mIE5GUyBzZXJ2ZXIgKi8KIHU4IHJvb3Rfc2VydmVyX3BhdGhbMjU2XSA9IHsgMCwgfTsJLyogUGF0aCB0byBtb3VudCBhcyByb290ICovCiAKIC8qIFBlcnNpc3RlbnQgZGF0YTogKi8KIAogc3RhdGljIGludCBpY19wcm90b191c2VkOwkJCS8qIFByb3RvY29sIHVzZWQsIGlmIGFueSAqLwotc3RhdGljIHUzMiBpY19uYW1lc2VydmVyc1tDT05GX05BTUVTRVJWRVJTX01BWF07IC8qIEROUyBTZXJ2ZXIgSVAgYWRkcmVzc2VzICovCitzdGF0aWMgX19iZTMyIGljX25hbWVzZXJ2ZXJzW0NPTkZfTkFNRVNFUlZFUlNfTUFYXTsgLyogRE5TIFNlcnZlciBJUCBhZGRyZXNzZXMgKi8KIHN0YXRpYyB1OCBpY19kb21haW5bNjRdOwkJLyogRE5TIChub3QgTklTKSBkb21haW4gbmFtZSAqLwogCiAvKgpAQCAtMTcyLDcgKzE3Myw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBzaG9ydCBmbGFnczsKIAlzaG9ydCBhYmxlOwotCXUzMiB4aWQ7CisJX19iZTMyIHhpZDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWNfZGV2aWNlICppY19maXJzdF9kZXYgX19pbml0ZGF0YSA9IE5VTEw7LyogTGlzdCBvZiBvcGVuIGRldmljZSAqLwpAQCAtMjIzLDcgKzIyNCw3IEBACiAJCQlkLT5mbGFncyA9IG9mbGFnczsKIAkJCWQtPmFibGUgPSBhYmxlOwogCQkJaWYgKGFibGUgJiBJQ19CT09UUCkKLQkJCQlnZXRfcmFuZG9tX2J5dGVzKCZkLT54aWQsIHNpemVvZih1MzIpKTsKKwkJCQlnZXRfcmFuZG9tX2J5dGVzKCZkLT54aWQsIHNpemVvZihfX2JlMzIpKTsKIAkJCWVsc2UKIAkJCQlkLT54aWQgPSAwOwogCQkJaWNfcHJvdG9faGF2ZV9pZiB8PSBhYmxlOwpAQCAtMjY5LDcgKzI3MCw3IEBACiAgKi8KIAogc3RhdGljIGlubGluZSB2b2lkCi1zZXRfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyX2luICpzaW4sIHUzMiBhZGRyLCB1MTYgcG9ydCkKK3NldF9zb2NrYWRkcihzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwgX19iZTMyIGFkZHIsIF9fYmUxNiBwb3J0KQogewogCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CiAJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOwpAQCAtMzMyLDcgKzMzMyw3IEBACiB7CiAJLyogTm8gbmVlZCB0byBzZXR1cCBkZXZpY2Ugcm91dGVzLCBvbmx5IHRoZSBkZWZhdWx0IHJvdXRlLi4uICovCiAKLQlpZiAoaWNfZ2F0ZXdheSAhPSBJTkFERFJfTk9ORSkgeworCWlmIChpY19nYXRld2F5ICE9IE5PTkUpIHsKIAkJc3RydWN0IHJ0ZW50cnkgcm07CiAJCWludCBlcnI7CiAKQEAgLTM2OCwxMCArMzY5LDEwIEBACiAJaWYgKCFpY19ob3N0X25hbWVfc2V0KQogCQlzcHJpbnRmKGluaXRfdXRzbmFtZSgpLT5ub2RlbmFtZSwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChpY19teWFkZHIpKTsKIAotCWlmIChyb290X3NlcnZlcl9hZGRyID09IElOQUREUl9OT05FKQorCWlmIChyb290X3NlcnZlcl9hZGRyID09IE5PTkUpCiAJCXJvb3Rfc2VydmVyX2FkZHIgPSBpY19zZXJ2YWRkcjsKIAotCWlmIChpY19uZXRtYXNrID09IElOQUREUl9OT05FKSB7CisJaWYgKGljX25ldG1hc2sgPT0gTk9ORSkgewogCQlpZiAoSU5fQ0xBU1NBKG50b2hsKGljX215YWRkcikpKQogCQkJaWNfbmV0bWFzayA9IGh0b25sKElOX0NMQVNTQV9ORVQpOwogCQllbHNlIGlmIChJTl9DTEFTU0IobnRvaGwoaWNfbXlhZGRyKSkpCkBAIC00MjAsNyArNDIxLDcgQEAKIHsKIAlzdHJ1Y3QgYXJwaGRyICpyYXJwOwogCXVuc2lnbmVkIGNoYXIgKnJhcnBfcHRyOwotCXVuc2lnbmVkIGxvbmcgc2lwLCB0aXA7CisJX19iZTMyIHNpcCwgdGlwOwogCXVuc2lnbmVkIGNoYXIgKnNoYSwgKnRoYTsJCS8qIHMgZm9yICJzb3VyY2UiLCB0IGZvciAidGFyZ2V0IiAqLwogCXN0cnVjdCBpY19kZXZpY2UgKmQ7CiAKQEAgLTQ4NSwxMiArNDg2LDEyIEBACiAJCWdvdG8gZHJvcF91bmxvY2s7CiAKIAkvKiBEaXNjYXJkIHBhY2tldHMgd2hpY2ggYXJlIG5vdCBmcm9tIHNwZWNpZmllZCBzZXJ2ZXIuICovCi0JaWYgKGljX3NlcnZhZGRyICE9IElOQUREUl9OT05FICYmIGljX3NlcnZhZGRyICE9IHNpcCkKKwlpZiAoaWNfc2VydmFkZHIgIT0gTk9ORSAmJiBpY19zZXJ2YWRkciAhPSBzaXApCiAJCWdvdG8gZHJvcF91bmxvY2s7CiAKIAkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwogCWljX2RldiA9IGRldjsKLQlpZiAoaWNfbXlhZGRyID09IElOQUREUl9OT05FKQorCWlmIChpY19teWFkZHIgPT0gTk9ORSkKIAkJaWNfbXlhZGRyID0gdGlwOwogCWljX3NlcnZhZGRyID0gc2lwOwogCWljX2dvdF9yZXBseSA9IElDX1JBUlA7CkBAIC01MzAsMTMgKzUzMSwxMyBAQAogCXU4IGh0eXBlOwkJLyogSFcgYWRkcmVzcyB0eXBlICovCiAJdTggaGxlbjsJCS8qIEhXIGFkZHJlc3MgbGVuZ3RoICovCiAJdTggaG9wczsJCS8qIFVzZWQgb25seSBieSBnYXRld2F5cyAqLwotCXUzMiB4aWQ7CQkvKiBUcmFuc2FjdGlvbiBJRCAqLwotCXUxNiBzZWNzOwkJLyogU2Vjb25kcyBzaW5jZSB3ZSBzdGFydGVkICovCi0JdTE2IGZsYWdzOwkJLyogSnVzdCB3aGF0IGl0IHNheXMgKi8KLQl1MzIgY2xpZW50X2lwOwkJLyogQ2xpZW50J3MgSVAgYWRkcmVzcyBpZiBrbm93biAqLwotCXUzMiB5b3VyX2lwOwkJLyogQXNzaWduZWQgSVAgYWRkcmVzcyAqLwotCXUzMiBzZXJ2ZXJfaXA7CQkvKiAoTmV4dCwgZS5nLiBORlMpIFNlcnZlcidzIElQIGFkZHJlc3MgKi8KLQl1MzIgcmVsYXlfaXA7CQkvKiBJUCBhZGRyZXNzIG9mIEJPT1RQIHJlbGF5ICovCisJX19iZTMyIHhpZDsJCS8qIFRyYW5zYWN0aW9uIElEICovCisJX19iZTE2IHNlY3M7CQkvKiBTZWNvbmRzIHNpbmNlIHdlIHN0YXJ0ZWQgKi8KKwlfX2JlMTYgZmxhZ3M7CQkvKiBKdXN0IHdoYXQgaXQgc2F5cyAqLworCV9fYmUzMiBjbGllbnRfaXA7CQkvKiBDbGllbnQncyBJUCBhZGRyZXNzIGlmIGtub3duICovCisJX19iZTMyIHlvdXJfaXA7CQkvKiBBc3NpZ25lZCBJUCBhZGRyZXNzICovCisJX19iZTMyIHNlcnZlcl9pcDsJCS8qIChOZXh0LCBlLmcuIE5GUykgU2VydmVyJ3MgSVAgYWRkcmVzcyAqLworCV9fYmUzMiByZWxheV9pcDsJCS8qIElQIGFkZHJlc3Mgb2YgQk9PVFAgcmVsYXkgKi8KIAl1OCBod19hZGRyWzE2XTsJCS8qIENsaWVudCdzIEhXIGFkZHJlc3MgKi8KIAl1OCBzZXJ2X25hbWVbNjRdOwkvKiBTZXJ2ZXIgaG9zdCBuYW1lICovCiAJdTggYm9vdF9maWxlWzEyOF07CS8qIE5hbWUgb2YgYm9vdCBmaWxlICovCkBAIC01NzYsNyArNTc3LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdAogaWNfZGhjcF9pbml0X29wdGlvbnModTggKm9wdGlvbnMpCiB7Ci0JdTggbXQgPSAoKGljX3NlcnZhZGRyID09IElOQUREUl9OT05FKQorCXU4IG10ID0gKChpY19zZXJ2YWRkciA9PSBOT05FKQogCQkgPyBESENQRElTQ09WRVIgOiBESENQUkVRVUVTVCk7CiAJdTggKmUgPSBvcHRpb25zOwogCkBAIC02NjYsNyArNjY3LDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBDT05GX05BTUVTRVJWRVJTX01BWDsgaSsrKQotCQlpY19uYW1lc2VydmVyc1tpXSA9IElOQUREUl9OT05FOworCQlpY19uYW1lc2VydmVyc1tpXSA9IE5PTkU7CiAKIAlkZXZfYWRkX3BhY2soJmJvb3RwX3BhY2tldF90eXBlKTsKIH0KQEAgLTcwOCw3ICs3MDksNyBAQAogCWgtPmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOwogCWgtPnR0bCA9IDY0OwogCWgtPnByb3RvY29sID0gSVBQUk9UT19VRFA7Ci0JaC0+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+ZGFkZHI7CisJX19iZTMyIGRzdCA9IHRpcGgtPmRhZGRyOwogCWludCAgICBtdHU7CiAKIAlpZiAodHVubmVsLT5yZWN1cnNpb24rKykgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IDk3Y2ZhOTcuLmVjYjU0MjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwbXIuYworKysgYi9uZXQvaXB2NC9pcG1yLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgSW4gdGhpcyBjYXNlIGRhdGEgcGF0aCBpcyBmcmVlIG9mIGV4Y2x1c2l2ZSBsb2NrcyBhdCBhbGwuCiAgKi8KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqbXJ0X2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptcnRfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBpbnQgaXBfbXJfZm9yd2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbWZjX2NhY2hlICpjYWNoZSwgaW50IGxvY2FsKTsKIHN0YXRpYyBpbnQgaXBtcl9jYWNoZV9yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnBrdCwgdmlmaV90IHZpZmksIGludCBhc3NlcnQpOwpAQCAtMTQ5Myw3ICsxNDkzLDcgQEAKICAgICAgICAgaWYgKHBpbS0+dHlwZSAhPSAoKFBJTV9WRVJTSU9OPDw0KXwoUElNX1JFR0lTVEVSKSkgfHwKIAkgICAgKHBpbS0+ZmxhZ3MmUElNX05VTExfUkVHSVNURVIpIHx8CiAJICAgIChpcF9jb21wdXRlX2NzdW0oKHZvaWQgKilwaW0sIHNpemVvZigqcGltKSkgIT0gMCAmJiAKLQkgICAgICh1MTYpY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIHNrYi0+bGVuLCAwKSkpKSAKKwkgICAgIGNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBza2ItPmxlbiwgMCkpKSkKIAkJZ290byBkcm9wOwogCiAJLyogY2hlY2sgaWYgdGhlIGlubmVyIHBhY2tldCBpcyBkZXN0aW5lZCB0byBtY2FzdCBncm91cCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19hcHAuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfYXBwLmMKaW5kZXggZTc3NTIzMy4uNmM0MDg5OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19hcHAuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2FwcC5jCkBAIC04MCwxMCArODAsOSBAQAogCWlmICghcHAtPnVucmVnaXN0ZXJfYXBwKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpbmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBfdnNfYXBwKSwgR0ZQX0tFUk5FTCk7CisJaW5jID0ga21lbWR1cChhcHAsIHNpemVvZigqaW5jKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmMpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbWNweShpbmMsIGFwcCwgc2l6ZW9mKCppbmMpKTsKIAlJTklUX0xJU1RfSEVBRCgmaW5jLT5wX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZpbmMtPmluY3NfbGlzdCk7CiAJaW5jLT5hcHAgPSBhcHA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY29ubi5jCmluZGV4IDg4MzJlYjUuLjgwODY3ODcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfY29ubi5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY29ubi5jCkBAIC00NCw3ICs0NCw3IEBACiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqaXBfdnNfY29ubl90YWI7CiAKIC8qICBTTEFCIGNhY2hlIGZvciBJUFZTIGNvbm5lY3Rpb25zICovCi1zdGF0aWMga21lbV9jYWNoZV90ICppcF92c19jb25uX2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppcF92c19jb25uX2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCiAvKiAgY291bnRlciBmb3IgY3VycmVudCBJUFZTIGNvbm5lY3Rpb25zICovCiBzdGF0aWMgYXRvbWljX3QgaXBfdnNfY29ubl9jb3VudCA9IEFUT01JQ19JTklUKDApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYwppbmRleCAxNDQ1YmI0Li4zNDI1NzUyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYwpAQCAtNTM2LDkgKzUzNiw5IEBACiAJcmV0dXJuIE5GX1NUT1A7CiB9CiAKLXUxNiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KQorX19zdW0xNiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0KQogewotCXJldHVybiAodTE2KSBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCkpOworCXJldHVybiBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCkpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jCmluZGV4IGYyNjE2MTYuLjliOTMzMzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYwpAQCAtMjIxLDEwICsyMjEsMTAgQEAKICAqCVRpbWVyIGZvciBjaGVja2luZyB0aGUgZGVmZW5zZQogICovCiAjZGVmaW5lIERFRkVOU0VfVElNRVJfUEVSSU9ECTEqSFoKLXN0YXRpYyB2b2lkIGRlZmVuc2Vfd29ya19oYW5kbGVyKHZvaWQgKmRhdGEpOwotc3RhdGljIERFQ0xBUkVfV09SSyhkZWZlbnNlX3dvcmssIGRlZmVuc2Vfd29ya19oYW5kbGVyLCBOVUxMKTsKK3N0YXRpYyB2b2lkIGRlZmVuc2Vfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoZGVmZW5zZV93b3JrLCBkZWZlbnNlX3dvcmtfaGFuZGxlcik7CiAKLXN0YXRpYyB2b2lkIGRlZmVuc2Vfd29ya19oYW5kbGVyKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBkZWZlbnNlX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJdXBkYXRlX2RlZmVuc2VfbGV2ZWwoKTsKIAlpZiAoYXRvbWljX3JlYWQoJmlwX3ZzX2Ryb3BlbnRyeSkpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19mdHAuYwppbmRleCA2ZDM5OGYxLi42ODdjMWRlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfZnRwLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCQlmcm9tID0gbl9jcC0+dmFkZHI7CiAJCXBvcnQgPSBuX2NwLT52cG9ydDsKIAkJc3ByaW50ZihidWYsIiVkLCVkLCVkLCVkLCVkLCVkIiwgTklQUVVBRChmcm9tKSwKLQkJCW50b2hzKHBvcnQpJjI1NSwgKG50b2hzKHBvcnQpPj44KSYyNTUpOworCQkJKG50b2hzKHBvcnQpPj44KSYyNTUsIG50b2hzKHBvcnQpJjI1NSk7CiAJCWJ1Zl9sZW4gPSBzdHJsZW4oYnVmKTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGMuYwppbmRleCA1MjQ3NTFlLi5hNDM4NWEyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGMuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGMuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogLyogZm9yIHN5c2N0bCAqLwogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGNyLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGNyLmMKaW5kZXggMDg5OTAxOS4uZmUxYWY1ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsY3IuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogLyogZm9yIHN5c2N0bCAqLwogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvLmMKaW5kZXggYzQ1MjhiNS4uZTg0NGRkYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90by5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG8uYwpAQCAtMTE4LDEzICsxMTgsNyBAQAogaW50ICoKIGlwX3ZzX2NyZWF0ZV90aW1lb3V0X3RhYmxlKGludCAqdGFibGUsIGludCBzaXplKQogewotCWludCAqdDsKLQotCXQgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmICh0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSh0LCB0YWJsZSwgc2l6ZSk7Ci0JcmV0dXJuIHQ7CisJcmV0dXJuIGttZW1kdXAodGFibGUsIHNpemUsIEdGUF9BVE9NSUMpOwogfQogCiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCmluZGV4IGJmZTc3OWUuLjE2YTllYmUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b190Y3AuYwpAQCAtODQsNyArODQsNyBAQAogCX0KIAogCWlmICh0aC0+c3luICYmCi0JICAgIChzdmMgPSBpcF92c19zZXJ2aWNlX2dldChza2ItPm5mbWFyaywgc2tiLT5uaC5pcGgtPnByb3RvY29sLAorCSAgICAoc3ZjID0gaXBfdnNfc2VydmljZV9nZXQoc2tiLT5tYXJrLCBza2ItPm5oLmlwaC0+cHJvdG9jb2wsCiAJCQkJICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsIHRoLT5kZXN0KSkpIHsKIAkJaWYgKGlwX3ZzX3RvZHJvcCgpKSB7CiAJCQkvKgpAQCAtMTE2LDkgKzExNiw5IEBACiAJCSAgICAgX19iZTE2IG9sZHBvcnQsIF9fYmUxNiBuZXdwb3J0KQogewogCXRjcGgtPmNoZWNrID0KLQkJaXBfdnNfY2hlY2tfZGlmZih+b2xkaXAsIG5ld2lwLAotCQkJCSBpcF92c19jaGVja19kaWZmKG9sZHBvcnQgXiBodG9ubCgweEZGRkYpLAotCQkJCQkJICBuZXdwb3J0LCB0Y3BoLT5jaGVjaykpOworCQljc3VtX2ZvbGQoaXBfdnNfY2hlY2tfZGlmZjQob2xkaXAsIG5ld2lwLAorCQkJCSBpcF92c19jaGVja19kaWZmMihvbGRwb3J0LCBuZXdwb3J0LAorCQkJCQkJfmNzdW1fdW5mb2xkKHRjcGgtPmNoZWNrKSkpKTsKIH0KIAogCkBAIC00OTAsMTYgKzQ5MCwxOCBAQAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdGNwX2FwcHNbVENQX0FQUF9UQUJfU0laRV07CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRjcF9hcHBfbG9jayk7CiAKLXN0YXRpYyBpbmxpbmUgX191MTYgdGNwX2FwcF9oYXNoa2V5KF9fdTE2IHBvcnQpCitzdGF0aWMgaW5saW5lIF9fdTE2IHRjcF9hcHBfaGFzaGtleShfX2JlMTYgcG9ydCkKIHsKLQlyZXR1cm4gKChwb3J0ID4+IFRDUF9BUFBfVEFCX0JJVFMpIF4gcG9ydCkgJiBUQ1BfQVBQX1RBQl9NQVNLOworCXJldHVybiAoKChfX2ZvcmNlIHUxNilwb3J0ID4+IFRDUF9BUFBfVEFCX0JJVFMpIF4gKF9fZm9yY2UgdTE2KXBvcnQpCisJCSYgVENQX0FQUF9UQUJfTUFTSzsKIH0KIAogCiBzdGF0aWMgaW50IHRjcF9yZWdpc3Rlcl9hcHAoc3RydWN0IGlwX3ZzX2FwcCAqaW5jKQogewogCXN0cnVjdCBpcF92c19hcHAgKmk7Ci0JX191MTYgaGFzaCwgcG9ydCA9IGluYy0+cG9ydDsKKwlfX3UxNiBoYXNoOworCV9fYmUxNiBwb3J0ID0gaW5jLT5wb3J0OwogCWludCByZXQgPSAwOwogCiAJaGFzaCA9IHRjcF9hcHBfaGFzaGtleShwb3J0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCmluZGV4IDU0YWE3NjAuLjAzZjBhNDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKKysrIGIvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b191ZHAuYwpAQCAtODksNyArODksNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoKHN2YyA9IGlwX3ZzX3NlcnZpY2VfZ2V0KHNrYi0+bmZtYXJrLCBza2ItPm5oLmlwaC0+cHJvdG9jb2wsCisJaWYgKChzdmMgPSBpcF92c19zZXJ2aWNlX2dldChza2ItPm1hcmssIHNrYi0+bmguaXBoLT5wcm90b2NvbCwKIAkJCQkgICAgIHNrYi0+bmguaXBoLT5kYWRkciwgdWgtPmRlc3QpKSkgewogCQlpZiAoaXBfdnNfdG9kcm9wKCkpIHsKIAkJCS8qCkBAIC0xMjEsMTEgKzEyMSwxMSBAQAogCQkgICAgIF9fYmUxNiBvbGRwb3J0LCBfX2JlMTYgbmV3cG9ydCkKIHsKIAl1aGRyLT5jaGVjayA9Ci0JCWlwX3ZzX2NoZWNrX2RpZmYofm9sZGlwLCBuZXdpcCwKLQkJCQkgaXBfdnNfY2hlY2tfZGlmZihvbGRwb3J0IF4gaHRvbmwoMHhGRkZGKSwKLQkJCQkJCSAgbmV3cG9ydCwgdWhkci0+Y2hlY2spKTsKKwkJY3N1bV9mb2xkKGlwX3ZzX2NoZWNrX2RpZmY0KG9sZGlwLCBuZXdpcCwKKwkJCQkgaXBfdnNfY2hlY2tfZGlmZjIob2xkcG9ydCwgbmV3cG9ydCwKKwkJCQkJfmNzdW1fdW5mb2xkKHVoZHItPmNoZWNrKSkpKTsKIAlpZiAoIXVoZHItPmNoZWNrKQotCQl1aGRyLT5jaGVjayA9IGh0b25sKDB4RkZGRik7CisJCXVoZHItPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQkJCQkJY3AtPnByb3RvY29sLAogCQkJCQkJKCpwc2tiKS0+Y3N1bSk7CiAJCWlmICh1ZHBoLT5jaGVjayA9PSAwKQotCQkJdWRwaC0+Y2hlY2sgPSBodG9ubCgweEZGRkYpOworCQkJdWRwaC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAkJSVBfVlNfREJHKDExLCAiTy1wa3Q6ICVzIE8tY3N1bT0lZCAoKyV6ZClcbiIsCiAJCQkgIHBwLT5uYW1lLCB1ZHBoLT5jaGVjaywKIAkJCSAgKGNoYXIqKSYodWRwaC0+Y2hlY2spIC0gKGNoYXIqKXVkcGgpOwpAQCAtMjI4LDcgKzIyOCw3IEBACiAJCQkJCQljcC0+cHJvdG9jb2wsCiAJCQkJCQkoKnBza2IpLT5jc3VtKTsKIAkJaWYgKHVkcGgtPmNoZWNrID09IDApCi0JCQl1ZHBoLT5jaGVjayA9IDB4RkZGRjsKKwkJCXVkcGgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7CiAJCSgqcHNrYiktPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KIAlyZXR1cm4gMTsKQEAgLTI4MiwxNiArMjgyLDE4IEBACiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB1ZHBfYXBwc1tVRFBfQVBQX1RBQl9TSVpFXTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodWRwX2FwcF9sb2NrKTsKIAotc3RhdGljIGlubGluZSBfX3UxNiB1ZHBfYXBwX2hhc2hrZXkoX191MTYgcG9ydCkKK3N0YXRpYyBpbmxpbmUgX191MTYgdWRwX2FwcF9oYXNoa2V5KF9fYmUxNiBwb3J0KQogewotCXJldHVybiAoKHBvcnQgPj4gVURQX0FQUF9UQUJfQklUUykgXiBwb3J0KSAmIFVEUF9BUFBfVEFCX01BU0s7CisJcmV0dXJuICgoKF9fZm9yY2UgdTE2KXBvcnQgPj4gVURQX0FQUF9UQUJfQklUUykgXiAoX19mb3JjZSB1MTYpcG9ydCkKKwkJJiBVRFBfQVBQX1RBQl9NQVNLOwogfQogCiAKIHN0YXRpYyBpbnQgdWRwX3JlZ2lzdGVyX2FwcChzdHJ1Y3QgaXBfdnNfYXBwICppbmMpCiB7CiAJc3RydWN0IGlwX3ZzX2FwcCAqaTsKLQlfX3UxNiBoYXNoLCBwb3J0ID0gaW5jLT5wb3J0OworCV9fdTE2IGhhc2g7CisJX19iZTE2IHBvcnQgPSBpbmMtPnBvcnQ7CiAJaW50IHJldCA9IDA7CiAKIAloYXNoID0gdWRwX2FwcF9oYXNoa2V5KHBvcnQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19zeW5jLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYwppbmRleCA5MWEwNzVlLi43ZWEyZDk4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJCWlmIChzdG9wX21hc3Rlcl9zeW5jKQogCQkJYnJlYWs7CiAKLQkJc3NsZWVwKDEpOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKIAl9CiAKIAkvKiBjbGVhbiB1cCB0aGUgc3luY19idWZmIHF1ZXVlICovCkBAIC03MTQsNyArNzE0LDcgQEAKIAkJaWYgKHN0b3BfYmFja3VwX3N5bmMpCiAJCQlicmVhazsKIAotCQlzc2xlZXAoMSk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOwogCX0KIAogCS8qIHJlbGVhc2UgdGhlIHNlbmRpbmcgbXVsdGljYXN0IHNvY2tldCAqLwpAQCAtODI2LDcgKzgyNiw3IEBACiAJaWYgKChwaWQgPSBrZXJuZWxfdGhyZWFkKHN5bmNfdGhyZWFkLCBzdGFydHVwLCAwKSkgPCAwKSB7CiAJCUlQX1ZTX0VSUigiY291bGQgbm90IGNyZWF0ZSBzeW5jX3RocmVhZCBkdWUgdG8gJWQuLi4gIgogCQkJICAicmV0cnlpbmcuXG4iLCBwaWQpOwotCQlzc2xlZXAoMSk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOwogCQlnb3RvIHJlcGVhdDsKIAl9CiAKQEAgLTg0OSwxMCArODQ5LDEyIEBACiAKIAlpcF92c19zeW5jX3N0YXRlIHw9IHN0YXRlOwogCWlmIChzdGF0ZSA9PSBJUF9WU19TVEFURV9NQVNURVIpIHsKLQkJc3RybGNweShpcF92c19tYXN0ZXJfbWNhc3RfaWZuLCBtY2FzdF9pZm4sIHNpemVvZihpcF92c19tYXN0ZXJfbWNhc3RfaWZuKSk7CisJCXN0cmxjcHkoaXBfdnNfbWFzdGVyX21jYXN0X2lmbiwgbWNhc3RfaWZuLAorCQkJc2l6ZW9mKGlwX3ZzX21hc3Rlcl9tY2FzdF9pZm4pKTsKIAkJaXBfdnNfbWFzdGVyX3N5bmNpZCA9IHN5bmNpZDsKIAl9IGVsc2UgewotCQlzdHJsY3B5KGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4sIG1jYXN0X2lmbiwgc2l6ZW9mKGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4pKTsKKwkJc3RybGNweShpcF92c19iYWNrdXBfbWNhc3RfaWZuLCBtY2FzdF9pZm4sCisJCQlzaXplb2YoaXBfdnNfYmFja3VwX21jYXN0X2lmbikpOwogCQlpcF92c19iYWNrdXBfc3luY2lkID0gc3luY2lkOwogCX0KIApAQCAtODYwLDcgKzg2Miw3IEBACiAJaWYgKChwaWQgPSBrZXJuZWxfdGhyZWFkKGZvcmtfc3luY190aHJlYWQsICZzdGFydHVwLCAwKSkgPCAwKSB7CiAJCUlQX1ZTX0VSUigiY291bGQgbm90IGNyZWF0ZSBmb3JrX3N5bmNfdGhyZWFkIGR1ZSB0byAlZC4uLiAiCiAJCQkgICJyZXRyeWluZy5cbiIsIHBpZCk7Ci0JCXNzbGVlcCgxKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCk7CiAJCWdvdG8gcmVwZWF0OwogCX0KIApAQCAtODgwLDcgKzg4Miw4IEBACiAKIAlJUF9WU19EQkcoNywgIiVzOiBwaWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgY3VycmVudC0+cGlkKTsKIAlJUF9WU19JTkZPKCJzdG9wcGluZyBzeW5jIHRocmVhZCAlZCAuLi5cbiIsCi0JCSAgIChzdGF0ZSA9PSBJUF9WU19TVEFURV9NQVNURVIpID8gc3luY19tYXN0ZXJfcGlkIDogc3luY19iYWNrdXBfcGlkKTsKKwkJICAgKHN0YXRlID09IElQX1ZTX1NUQVRFX01BU1RFUikgPworCQkgICBzeW5jX21hc3Rlcl9waWQgOiBzeW5jX2JhY2t1cF9waWQpOwogCiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJYWRkX3dhaXRfcXVldWUoJnN0b3Bfc3luY193YWl0LCAmd2FpdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IGUyMDA1YzYuLmE2ODk2NjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci5jCkBAIC0yNyw5ICsyNyw3IEBACiAJCWZsLm5sX3UuaXA0X3Uuc2FkZHIgPSBpcGgtPnNhZGRyOwogCQlmbC5ubF91LmlwNF91LnRvcyA9IFJUX1RPUyhpcGgtPnRvcyk7CiAJCWZsLm9pZiA9ICgqcHNrYiktPnNrID8gKCpwc2tiKS0+c2stPnNrX2JvdW5kX2Rldl9pZiA6IDA7Ci0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCQlmbC5ubF91LmlwNF91LmZ3bWFyayA9ICgqcHNrYiktPm5mbWFyazsKLSNlbmRpZgorCQlmbC5tYXJrID0gKCpwc2tiKS0+bWFyazsKIAkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpICE9IDApCiAJCQlyZXR1cm4gLTE7CiAKQEAgLTE2NCwxNyArMTYyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGludCBuZl9pcF9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKK19fc3VtMTYgbmZfaXBfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsIHVfaW50OF90IHByb3RvY29sKQogewogCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0JdW5zaWduZWQgaW50IGNzdW0gPSAwOworCV9fc3VtMTYgY3N1bSA9IDA7CiAKIAlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CiAJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKIAkJaWYgKGhvb2sgIT0gTkZfSVBfUFJFX1JPVVRJTkcgJiYgaG9vayAhPSBORl9JUF9MT0NBTF9JTikKIAkJCWJyZWFrOwotCQlpZiAoKHByb3RvY29sID09IDAgJiYgISh1MTYpY3N1bV9mb2xkKHNrYi0+Y3N1bSkpIHx8CisJCWlmICgocHJvdG9jb2wgPT0gMCAmJiAhY3N1bV9mb2xkKHNrYi0+Y3N1bSkpIHx8CiAJCSAgICAhY3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKIAkJCSAgICAJICAgICAgIHNrYi0+bGVuIC0gZGF0YW9mZiwgcHJvdG9jb2wsCiAJCQkJICAgICAgIHNrYi0+Y3N1bSkpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggZDg4YzI5Mi4uZjYwMjZkNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAJZGVwZW5kcyBvbiBJTkVUICYmIE5FVEZJTFRFUgogCiBjb25maWcgTkZfQ09OTlRSQUNLX0lQVjQKLQl0cmlzdGF0ZSAiSVB2NCBzdXBwb3J0IGZvciBuZXcgY29ubmVjdGlvbiB0cmFja2luZyAoRVhQRVJJTUVOVEFMKSIKKwl0cmlzdGF0ZSAiSVB2NCBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBOQVQpIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSwogCS0tLWhlbHAtLS0KIAkgIENvbm5lY3Rpb24gdHJhY2tpbmcga2VlcHMgYSByZWNvcmQgb2Ygd2hhdCBwYWNrZXRzIGhhdmUgcGFzc2VkCkBAIC0xOSwyMSArMTksMTggQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKKwlib29sICJwcm9jL3N5c2N0bCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGNvbm5lY3Rpb24gdHJhY2tpbmciCisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0tfSVBWNAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgL3Byb2MgYW5kIHN5c2N0bCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZAorCSAgbGF5ZXIgMyBkZXBlbmRhbnQgY29ubmVjdGlvbiB0cmFja2luZy4gVGhpcyBpcyBuZWVkZWQgdG8ga2VlcAorCSAgb2xkIHByb2dyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBhZGFwdGVkIHRvIHRoZSBuZXcgbmFtZXMgd29ya2luZy4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogIyBjb25uZWN0aW9uIHRyYWNraW5nLCBoZWxwZXJzIGFuZCBwcm90b2NvbHMKLWNvbmZpZyBJUF9ORl9DT05OVFJBQ0sKLQl0cmlzdGF0ZSAiQ29ubmVjdGlvbiB0cmFja2luZyAocmVxdWlyZWQgZm9yIG1hc3EvTkFUKSIKLQktLS1oZWxwLS0tCi0JICBDb25uZWN0aW9uIHRyYWNraW5nIGtlZXBzIGEgcmVjb3JkIG9mIHdoYXQgcGFja2V0cyBoYXZlIHBhc3NlZAotCSAgdGhyb3VnaCB5b3VyIG1hY2hpbmUsIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRoZXkgYXJlIHJlbGF0ZWQKLQkgIGludG8gY29ubmVjdGlvbnMuCi0KLQkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gZG8gTWFzcXVlcmFkaW5nIG9yIG90aGVyIGtpbmRzIG9mIE5ldHdvcmsKLQkgIEFkZHJlc3MgVHJhbnNsYXRpb24gKGV4Y2VwdCBmb3IgRmFzdCBOQVQpLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0bwotCSAgZW5oYW5jZSBwYWNrZXQgZmlsdGVyaW5nIChzZWUgYENvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCcKLQkgIGJlbG93KS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9DVF9BQ0NUCiAJYm9vbCAiQ29ubmVjdGlvbiB0cmFja2luZyBmbG93IGFjY291bnRpbmciCiAJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKQEAgLTMxNSwyMCArMzEyLDYgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgogCi1jb25maWcgSVBfTkZfTUFUQ0hfSEFTSExJTUlUCi0JdHJpc3RhdGUgICdoYXNobGltaXQgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIG5ldyBpcHRhYmxlcyBgaGFzaGxpbWl0JyBtYXRjaC4gIAotCi0JICBBcyBvcHBvc2VkIHRvIGBsaW1pdCcsIHRoaXMgbWF0Y2ggZHluYW1pY2FsbHkgY3JlYXRlcyBhIGhhc2ggdGFibGUKLQkgIG9mIGxpbWl0IGJ1Y2tldHMsIGJhc2VkIG9uIHlvdXIgc2VsZWN0aW9uIG9mIHNvdXJjZS9kZXN0aW5hdGlvbgotCSAgaXAgYWRkcmVzc2VzIGFuZC9vciBwb3J0cy4KLQotCSAgSXQgZW5hYmxlcyB5b3UgdG8gZXhwcmVzcyBwb2xpY2llcyBsaWtlIGAxMGtwcHMgZm9yIGFueSBnaXZlbgotCSAgZGVzdGluYXRpb24gSVAnIG9yIGA1MDBwcHMgZnJvbSBhbnkgZ2l2ZW4gc291cmNlIElQJyAgd2l0aCBhIHNpbmdsZQotCSAgSVB0YWJsZXMgcnVsZS4KLQogIyBgZmlsdGVyJywgZ2VuZXJpYyBhbmQgc3BlY2lmaWMgdGFyZ2V0cwogY29uZmlnIElQX05GX0ZJTFRFUgogCXRyaXN0YXRlICJQYWNrZXQgZmlsdGVyaW5nIgpAQCAtNDA0LDcgKzM4Nyw3IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi0jIE5BVCArIHNwZWNpZmljIHRhcmdldHMKKyMgTkFUICsgc3BlY2lmaWMgdGFyZ2V0czogaXBfY29ubnRyYWNrCiBjb25maWcgSVBfTkZfTkFUCiAJdHJpc3RhdGUgIkZ1bGwgTkFUIgogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgSVBfTkZfQ09OTlRSQUNLCkBAIC00MTUsMTQgKzM5OCwzMCBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorIyBOQVQgKyBzcGVjaWZpYyB0YXJnZXRzOiBuZl9jb25udHJhY2sKK2NvbmZpZyBORl9OQVQKKwl0cmlzdGF0ZSAiRnVsbCBOQVQiCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0tfSVBWNAorCWhlbHAKKwkgIFRoZSBGdWxsIE5BVCBvcHRpb24gYWxsb3dzIG1hc3F1ZXJhZGluZywgcG9ydCBmb3J3YXJkaW5nIGFuZCBvdGhlcgorCSAgZm9ybXMgb2YgZnVsbCBOZXR3b3JrIEFkZHJlc3MgUG9ydCBUcmFuc2xhdGlvbi4gIEl0IGlzIGNvbnRyb2xsZWQgYnkKKwkgIHRoZSBgbmF0JyB0YWJsZSBpbiBpcHRhYmxlczogc2VlIHRoZSBtYW4gcGFnZSBmb3IgaXB0YWJsZXMoOCkuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgSVBfTkZfTkFUX05FRURFRAogCWJvb2wKLQlkZXBlbmRzIG9uIElQX05GX05BVCAhPSBuCisJZGVwZW5kcyBvbiBJUF9ORl9OQVQKKwlkZWZhdWx0IHkKKworY29uZmlnIE5GX05BVF9ORUVERUQKKwlib29sCisJZGVwZW5kcyBvbiBORl9OQVQKIAlkZWZhdWx0IHkKIAogY29uZmlnIElQX05GX1RBUkdFVF9NQVNRVUVSQURFCiAJdHJpc3RhdGUgIk1BU1FVRVJBREUgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9OQVQKKwlkZXBlbmRzIG9uIChORl9OQVQgfHwgSVBfTkZfTkFUKQogCWhlbHAKIAkgIE1hc3F1ZXJhZGluZyBpcyBhIHNwZWNpYWwgY2FzZSBvZiBOQVQ6IGFsbCBvdXRnb2luZyBjb25uZWN0aW9ucyBhcmUKIAkgIGNoYW5nZWQgdG8gc2VlbSB0byBjb21lIGZyb20gYSBwYXJ0aWN1bGFyIGludGVyZmFjZSdzIGFkZHJlc3MsIGFuZApAQCAtNDM0LDcgKzQzMyw3IEBACiAKIGNvbmZpZyBJUF9ORl9UQVJHRVRfUkVESVJFQ1QKIAl0cmlzdGF0ZSAiUkVESVJFQ1QgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9OQVQKKwlkZXBlbmRzIG9uIChORl9OQVQgfHwgSVBfTkZfTkFUKQogCWhlbHAKIAkgIFJFRElSRUNUIGlzIGEgc3BlY2lhbCBjYXNlIG9mIE5BVDogYWxsIGluY29taW5nIGNvbm5lY3Rpb25zIGFyZQogCSAgbWFwcGVkIG9udG8gdGhlIGluY29taW5nIGludGVyZmFjZSdzIGFkZHJlc3MsIGNhdXNpbmcgdGhlIHBhY2tldHMgdG8KQEAgLTQ0NSw3ICs0NDQsNyBAQAogCiBjb25maWcgSVBfTkZfVEFSR0VUX05FVE1BUAogCXRyaXN0YXRlICJORVRNQVAgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9OQVQKKwlkZXBlbmRzIG9uIChORl9OQVQgfHwgSVBfTkZfTkFUKQogCWhlbHAKIAkgIE5FVE1BUCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBzdGF0aWMgMToxIE5BVCBtYXBwaW5nIG9mIG5ldHdvcmsKIAkgIGFkZHJlc3Nlcy4gSXQgbWFwcyB0aGUgbmV0d29yayBhZGRyZXNzIHBhcnQsIHdoaWxlIGtlZXBpbmcgdGhlIGhvc3QKQEAgLTQ1Niw3ICs0NTUsNyBAQAogCiBjb25maWcgSVBfTkZfVEFSR0VUX1NBTUUKIAl0cmlzdGF0ZSAiU0FNRSB0YXJnZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX05BVAorCWRlcGVuZHMgb24gKE5GX05BVCB8fCBJUF9ORl9OQVQpCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBTQU1FJyB0YXJnZXQsIHdoaWNoIHdvcmtzIGxpa2UgdGhlIHN0YW5kYXJkIFNOQVQKIAkgIHRhcmdldCwgYnV0IGF0dGVtcHRzIHRvIGdpdmUgY2xpZW50cyB0aGUgc2FtZSBJUCBmb3IgYWxsIGNvbm5lY3Rpb25zLgpAQCAtNDc4LDE5ICs0NzcsNTIgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBORl9OQVRfU05NUF9CQVNJQworCXRyaXN0YXRlICJCYXNpYyBTTk1QLUFMRyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX05BVAorCS0tLWhlbHAtLS0KKworCSAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhbiBBcHBsaWNhdGlvbiBMYXllciBHYXRld2F5IChBTEcpIGZvcgorCSAgU05NUCBwYXlsb2Fkcy4gIEluIGNvbmp1bmN0aW9uIHdpdGggTkFULCBpdCBhbGxvd3MgYSBuZXR3b3JrCisJICBtYW5hZ2VtZW50IHN5c3RlbSB0byBhY2Nlc3MgbXVsdGlwbGUgcHJpdmF0ZSBuZXR3b3JrcyB3aXRoCisJICBjb25mbGljdGluZyBhZGRyZXNzZXMuICBJdCB3b3JrcyBieSBtb2RpZnlpbmcgSVAgYWRkcmVzc2VzCisJICBpbnNpZGUgU05NUCBwYXlsb2FkcyB0byBtYXRjaCBJUC1sYXllciBOQVQgbWFwcGluZy4KKworCSAgVGhpcyBpcyB0aGUgImJhc2ljIiBmb3JtIG9mIFNOTVAtQUxHLCBhcyBkZXNjcmliZWQgaW4gUkZDIDI5NjIKKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKKyMgSWYgdGhleSB3YW50IEZUUCwgc2V0IHRvICRDT05GSUdfSVBfTkZfTkFUIChtIG9yIHkpLAorIyBvciAkQ09ORklHX0lQX05GX0ZUUCAobSBvciB5KSwgd2hpY2hldmVyIGlzIHdlYWtlci4KKyMgRnJvbSBrY29uZmlnLWxhbmd1YWdlLnR4dDoKKyMKKyMgICAgICAgICAgIDxleHByPiAnJiYnIDxleHByPiAgICAgICAgICAgICAgICAgICAoNikKKyMKKyMgKDYpIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtaW4oL2V4cHIvLCAvZXhwci8pLgorY29uZmlnIE5GX05BVF9QUk9UT19HUkUKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gTkZfTkFUICYmIE5GX0NUX1BST1RPX0dSRQorCitjb25maWcgSVBfTkZfTkFUX0ZUUAorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBJUF9ORl9DT05OVFJBQ0sgJiYgSVBfTkZfTkFUCisJZGVmYXVsdCBJUF9ORl9OQVQgJiYgSVBfTkZfRlRQCisKK2NvbmZpZyBORl9OQVRfRlRQCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfRlRQCisKIGNvbmZpZyBJUF9ORl9OQVRfSVJDCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTIT1uICYmIElQX05GX0NPTk5UUkFDSyE9biAmJiBJUF9ORl9OQVQhPW4KIAlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9JUkM9eQogCWRlZmF1bHQgbSBpZiBJUF9ORl9JUkM9bQogCi0jIElmIHRoZXkgd2FudCBGVFAsIHNldCB0byAkQ09ORklHX0lQX05GX05BVCAobSBvciB5KSwgCi0jIG9yICRDT05GSUdfSVBfTkZfRlRQIChtIG9yIHkpLCB3aGljaGV2ZXIgaXMgd2Vha2VyLiAgQXJnaC4KLWNvbmZpZyBJUF9ORl9OQVRfRlRQCitjb25maWcgTkZfTkFUX0lSQwogCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCi0JZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfRlRQPXkKLQlkZWZhdWx0IG0gaWYgSVBfTkZfRlRQPW0KKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfSVJDCiAKIGNvbmZpZyBJUF9ORl9OQVRfVEZUUAogCXRyaXN0YXRlCkBAIC00OTgsMzAgKzUzMCw1NiBAQAogCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX1RGVFA9eQogCWRlZmF1bHQgbSBpZiBJUF9ORl9URlRQPW0KIAorY29uZmlnIE5GX05BVF9URlRQCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfVEZUUAorCiBjb25maWcgSVBfTkZfTkFUX0FNQU5EQQogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCiAJZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfQU1BTkRBPXkKIAlkZWZhdWx0IG0gaWYgSVBfTkZfQU1BTkRBPW0KIAorY29uZmlnIE5GX05BVF9BTUFOREEKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAorCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19BTUFOREEKKwogY29uZmlnIElQX05GX05BVF9QUFRQCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIElQX05GX05BVCE9biAmJiBJUF9ORl9QUFRQIT1uCiAJZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfUFBUUD15CiAJZGVmYXVsdCBtIGlmIElQX05GX1BQVFA9bQogCitjb25maWcgTkZfTkFUX1BQVFAKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAorCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19QUFRQCisJc2VsZWN0IE5GX05BVF9QUk9UT19HUkUKKwogY29uZmlnIElQX05GX05BVF9IMzIzCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTIT1uICYmIElQX05GX0NPTk5UUkFDSyE9biAmJiBJUF9ORl9OQVQhPW4KIAlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9IMzIzPXkKIAlkZWZhdWx0IG0gaWYgSVBfTkZfSDMyMz1tCiAKK2NvbmZpZyBORl9OQVRfSDMyMworCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCisJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX0gzMjMKKwogY29uZmlnIElQX05GX05BVF9TSVAKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMhPW4gJiYgSVBfTkZfQ09OTlRSQUNLIT1uICYmIElQX05GX05BVCE9bgogCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX1NJUD15CiAJZGVmYXVsdCBtIGlmIElQX05GX1NJUD1tCiAKK2NvbmZpZyBORl9OQVRfU0lQCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKKwlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfU0lQCisKICMgbWFuZ2xlICsgc3BlY2lmaWMgdGFyZ2V0cwogY29uZmlnIElQX05GX01BTkdMRQogCXRyaXN0YXRlICJQYWNrZXQgbWFuZ2xpbmciCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggMDlhYWVkMS4uMTVlNzQxYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtNSwxNyArNSwyMyBAQAogIyBvYmplY3RzIGZvciB0aGUgc3RhbmRhbG9uZSAtIGNvbm5lY3Rpb24gdHJhY2tpbmcgLyBOQVQKIGlwX2Nvbm50cmFjay1vYmpzCTo9IGlwX2Nvbm50cmFja19zdGFuZGFsb25lLm8gaXBfY29ubnRyYWNrX2NvcmUubyBpcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5vIGlwX2Nvbm50cmFja19wcm90b190Y3AubyBpcF9jb25udHJhY2tfcHJvdG9fdWRwLm8gaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAubwogaXBfbmF0LW9ianMJOj0gaXBfbmF0X2NvcmUubyBpcF9uYXRfaGVscGVyLm8gaXBfbmF0X3Byb3RvX3Vua25vd24ubyBpcF9uYXRfcHJvdG9fdGNwLm8gaXBfbmF0X3Byb3RvX3VkcC5vIGlwX25hdF9wcm90b19pY21wLm8KK25mX25hdC1vYmpzCTo9IG5mX25hdF9jb3JlLm8gbmZfbmF0X2hlbHBlci5vIG5mX25hdF9wcm90b191bmtub3duLm8gbmZfbmF0X3Byb3RvX3RjcC5vIG5mX25hdF9wcm90b191ZHAubyBuZl9uYXRfcHJvdG9faWNtcC5vCitpZm5lcSAoJChDT05GSUdfTkZfTkFUKSwpCitpcHRhYmxlX25hdC1vYmpzCTo9IG5mX25hdF9ydWxlLm8gbmZfbmF0X3N0YW5kYWxvbmUubworZWxzZQogaXB0YWJsZV9uYXQtb2Jqcwk6PSBpcF9uYXRfcnVsZS5vIGlwX25hdF9zdGFuZGFsb25lLm8KK2VuZGlmCiAKIGlwX2Nvbm50cmFja19wcHRwLW9ianMJOj0gaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLm8gaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5vCiBpcF9uYXRfcHB0cC1vYmpzCTo9IGlwX25hdF9oZWxwZXJfcHB0cC5vIGlwX25hdF9wcm90b19ncmUubwogCi1pcF9jb25udHJhY2tfaDMyMy1vYmpzIDo9IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyMy5vIGlwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLm8KK2lwX2Nvbm50cmFja19oMzIzLW9ianMgOj0gaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLm8gLi4vLi4vbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX2FzbjEubwogaXBfbmF0X2gzMjMtb2JqcyA6PSBpcF9uYXRfaGVscGVyX2gzMjMubwogCiAjIGNvbm5lY3Rpb24gdHJhY2tpbmcKIG9iai0kKENPTkZJR19JUF9ORl9DT05OVFJBQ0spICs9IGlwX2Nvbm50cmFjay5vCiBvYmotJChDT05GSUdfSVBfTkZfTkFUKSArPSBpcF9uYXQubworb2JqLSQoQ09ORklHX05GX05BVCkgKz0gbmZfbmF0Lm8KIAogIyBjb25udHJhY2sgbmV0bGluayBpbnRlcmZhY2UKIG9iai0kKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgKz0gaXBfY29ubnRyYWNrX25ldGxpbmsubwpAQCAtMzQsNyArNDAsNyBAQAogb2JqLSQoQ09ORklHX0lQX05GX1NJUCkgKz0gaXBfY29ubnRyYWNrX3NpcC5vCiBvYmotJChDT05GSUdfSVBfTkZfTkVUQklPU19OUykgKz0gaXBfY29ubnRyYWNrX25ldGJpb3NfbnMubwogCi0jIE5BVCBoZWxwZXJzIAorIyBOQVQgaGVscGVycyAoaXBfY29ubnRyYWNrKQogb2JqLSQoQ09ORklHX0lQX05GX05BVF9IMzIzKSArPSBpcF9uYXRfaDMyMy5vCiBvYmotJChDT05GSUdfSVBfTkZfTkFUX1BQVFApICs9IGlwX25hdF9wcHRwLm8KIG9iai0kKENPTkZJR19JUF9ORl9OQVRfQU1BTkRBKSArPSBpcF9uYXRfYW1hbmRhLm8KQEAgLTQzLDYgKzQ5LDE5IEBACiBvYmotJChDT05GSUdfSVBfTkZfTkFUX0lSQykgKz0gaXBfbmF0X2lyYy5vCiBvYmotJChDT05GSUdfSVBfTkZfTkFUX1NJUCkgKz0gaXBfbmF0X3NpcC5vCiAKKyMgTkFUIGhlbHBlcnMgKG5mX2Nvbm50cmFjaykKK29iai0kKENPTkZJR19ORl9OQVRfQU1BTkRBKSArPSBuZl9uYXRfYW1hbmRhLm8KK29iai0kKENPTkZJR19ORl9OQVRfRlRQKSArPSBuZl9uYXRfZnRwLm8KK29iai0kKENPTkZJR19ORl9OQVRfSDMyMykgKz0gbmZfbmF0X2gzMjMubworb2JqLSQoQ09ORklHX05GX05BVF9JUkMpICs9IG5mX25hdF9pcmMubworb2JqLSQoQ09ORklHX05GX05BVF9QUFRQKSArPSBuZl9uYXRfcHB0cC5vCitvYmotJChDT05GSUdfTkZfTkFUX1NJUCkgKz0gbmZfbmF0X3NpcC5vCitvYmotJChDT05GSUdfTkZfTkFUX1NOTVBfQkFTSUMpICs9IG5mX25hdF9zbm1wX2Jhc2ljLm8KK29iai0kKENPTkZJR19ORl9OQVRfVEZUUCkgKz0gbmZfbmF0X3RmdHAubworCisjIE5BVCBwcm90b2NvbHMgKG5mX25hdCkKK29iai0kKENPTkZJR19ORl9OQVRfUFJPVE9fR1JFKSArPSBuZl9uYXRfcHJvdG9fZ3JlLm8KKwogIyBnZW5lcmljIElQIHRhYmxlcyAKIG9iai0kKENPTkZJR19JUF9ORl9JUFRBQkxFUykgKz0gaXBfdGFibGVzLm8KIApAQCAtNTAsMTAgKzY5LDEwIEBACiBvYmotJChDT05GSUdfSVBfTkZfRklMVEVSKSArPSBpcHRhYmxlX2ZpbHRlci5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFOR0xFKSArPSBpcHRhYmxlX21hbmdsZS5vCiBvYmotJChDT05GSUdfSVBfTkZfTkFUKSArPSBpcHRhYmxlX25hdC5vCitvYmotJChDT05GSUdfTkZfTkFUKSArPSBpcHRhYmxlX25hdC5vCiBvYmotJChDT05GSUdfSVBfTkZfUkFXKSArPSBpcHRhYmxlX3Jhdy5vCiAKICMgbWF0Y2hlcwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0hBU0hMSU1JVCkgKz0gaXB0X2hhc2hsaW1pdC5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfSVBSQU5HRSkgKz0gaXB0X2lwcmFuZ2Uubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX09XTkVSKSArPSBpcHRfb3duZXIubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1RPUykgKz0gaXB0X3Rvcy5vCkBAIC04OSw2ICsxMDgsMTEgQEAKIAogIyBvYmplY3RzIGZvciBsMyBpbmRlcGVuZGVudCBjb25udHJhY2sKIG5mX2Nvbm50cmFja19pcHY0LW9ianMgIDo9ICBuZl9jb25udHJhY2tfbDNwcm90b19pcHY0Lm8gbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAubworaWZlcSAoJChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKSx5KQoraWZlcSAoJChDT05GSUdfUFJPQ19GUykseSkKK25mX2Nvbm50cmFja19pcHY0LW9ianMJKz0gbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQubworZW5kaWYKK2VuZGlmCiAKICMgbDMgaW5kZXBlbmRlbnQgY29ubnRyYWNrCiBvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQpICs9IG5mX2Nvbm50cmFja19pcHY0Lm8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCmluZGV4IDE3ZTFhNjguLjlhYTIyMzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYwpAQCAtMzU4LDYgKzM1OCw3IEBACiAJCWZvciAoOzspIHsKIAkJCXN0cnVjdCBhcnB0X3N0YW5kYXJkX3RhcmdldCAqdAogCQkJCT0gKHZvaWQgKilhcnB0X2dldF90YXJnZXQoZSk7CisJCQlpbnQgdmlzaXRlZCA9IGUtPmNvbWVmcm9tICYgKDEgPDwgaG9vayk7CiAKIAkJCWlmIChlLT5jb21lZnJvbSAmICgxIDw8IE5GX0FSUF9OVU1IT09LUykpIHsKIAkJCQlwcmludGsoImFycHRhYmxlczogbG9vcCBob29rICV1IHBvcyAldSAlMDhYLlxuIiwKQEAgLTM2OCwxMyArMzY5LDIwIEBACiAJCQkJfD0gKCgxIDw8IGhvb2spIHwgKDEgPDwgTkZfQVJQX05VTUhPT0tTKSk7CiAKIAkJCS8qIFVuY29uZGl0aW9uYWwgcmV0dXJuL0VORC4gKi8KLQkJCWlmIChlLT50YXJnZXRfb2Zmc2V0ID09IHNpemVvZihzdHJ1Y3QgYXJwdF9lbnRyeSkKKwkJCWlmICgoZS0+dGFyZ2V0X29mZnNldCA9PSBzaXplb2Yoc3RydWN0IGFycHRfZW50cnkpCiAJCQkgICAgJiYgKHN0cmNtcCh0LT50YXJnZXQudS51c2VyLm5hbWUsCiAJCQkJICAgICAgIEFSUFRfU1RBTkRBUkRfVEFSR0VUKSA9PSAwKQogCQkJICAgICYmIHQtPnZlcmRpY3QgPCAwCi0JCQkgICAgJiYgdW5jb25kaXRpb25hbCgmZS0+YXJwKSkgeworCQkJICAgICYmIHVuY29uZGl0aW9uYWwoJmUtPmFycCkpIHx8IHZpc2l0ZWQpIHsKIAkJCQl1bnNpZ25lZCBpbnQgb2xkcG9zLCBzaXplOwogCisJCQkJaWYgKHQtPnZlcmRpY3QgPCAtTkZfTUFYX1ZFUkRJQ1QgLSAxKSB7CisJCQkJCWR1cHJpbnRmKCJtYXJrX3NvdXJjZV9jaGFpbnM6IGJhZCAiCisJCQkJCQkibmVnYXRpdmUgdmVyZGljdCAoJWkpXG4iLAorCQkJCQkJCQl0LT52ZXJkaWN0KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCiAJCQkJLyogUmV0dXJuOiBiYWNrdHJhY2sgdGhyb3VnaCB0aGUgbGFzdAogCQkJCSAqIGJpZyBqdW1wLgogCQkJCSAqLwpAQCAtNDA0LDYgKzQxMiwxNCBAQAogCQkJCWlmIChzdHJjbXAodC0+dGFyZ2V0LnUudXNlci5uYW1lLAogCQkJCQkgICBBUlBUX1NUQU5EQVJEX1RBUkdFVCkgPT0gMAogCQkJCSAgICAmJiBuZXdwb3MgPj0gMCkgeworCQkJCQlpZiAobmV3cG9zID4gbmV3aW5mby0+c2l6ZSAtCisJCQkJCQlzaXplb2Yoc3RydWN0IGFycHRfZW50cnkpKSB7CisJCQkJCQlkdXByaW50ZigibWFya19zb3VyY2VfY2hhaW5zOiAiCisJCQkJCQkJImJhZCB2ZXJkaWN0ICglaSlcbiIsCisJCQkJCQkJCW5ld3Bvcyk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCiAJCQkJCS8qIFRoaXMgYSBqdW1wOyBjaGFzZSBpdC4gKi8KIAkJCQkJZHVwcmludGYoIkp1bXAgcnVsZSAldSAtPiAldVxuIiwKIAkJCQkJCSBwb3MsIG5ld3Bvcyk7CkBAIC00MjYsOCArNDQyLDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHN0YW5kYXJkX2NoZWNrKGNvbnN0IHN0cnVjdCBhcnB0X2VudHJ5X3RhcmdldCAqdCwKIAkJCQkgdW5zaWduZWQgaW50IG1heF9vZmZzZXQpCiB7Ci0Jc3RydWN0IGFycHRfc3RhbmRhcmRfdGFyZ2V0ICp0YXJnID0gKHZvaWQgKil0OwotCiAJLyogQ2hlY2sgc3RhbmRhcmQgaW5mby4gKi8KIAlpZiAodC0+dS50YXJnZXRfc2l6ZQogCSAgICAhPSBBUlBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZF90YXJnZXQpKSkgewpAQCAtNDM3LDE4ICs0NTEsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAodGFyZy0+dmVyZGljdCA+PSAwCi0JICAgICYmIHRhcmctPnZlcmRpY3QgPiBtYXhfb2Zmc2V0IC0gc2l6ZW9mKHN0cnVjdCBhcnB0X2VudHJ5KSkgewotCQlkdXByaW50ZigiYXJwdF9zdGFuZGFyZF9jaGVjazogYmFkIHZlcmRpY3QgKCVpKVxuIiwKLQkJCSB0YXJnLT52ZXJkaWN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHRhcmctPnZlcmRpY3QgPCAtTkZfTUFYX1ZFUkRJQ1QgLSAxKSB7Ci0JCWR1cHJpbnRmKCJhcnB0X3N0YW5kYXJkX2NoZWNrOiBiYWQgbmVnYXRpdmUgdmVyZGljdCAoJWkpXG4iLAotCQkJIHRhcmctPnZlcmRpY3QpOwotCQlyZXR1cm4gMDsKLQl9CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTQ2Niw3ICs0NjgsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyBzaXplb2Yoc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0KSA+IGUtPm5leHRfb2Zmc2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXQgPSBhcnB0X2dldF90YXJnZXQoZSk7CisJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyB0LT51LnRhcmdldF9zaXplID4gZS0+bmV4dF9vZmZzZXQpCisJCXJldHVybiAtRUlOVkFMOworCiAJdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YXJnZXQoTkZfQVJQLCB0LT51LnVzZXIubmFtZSwKIAkJCQkJCQl0LT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkgImFycHRfJXMiLCB0LT51LnVzZXIubmFtZSk7CkBAIC02MzMsNyArNjQxLDcgQEAKIAogCWlmIChyZXQgIT0gMCkgewogCQlBUlBUX0VOVFJZX0lURVJBVEUoZW50cnkwLCBuZXdpbmZvLT5zaXplLAotCQkJCSAgIGNsZWFudXBfZW50cnksICZpKTsKKwkJCQljbGVhbnVwX2VudHJ5LCAmaSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xMTk2LDYgKzEyMDQsOCBAQAogc3RhdGljIHZvaWQgX19leGl0IGFycF90YWJsZXNfZmluaSh2b2lkKQogewogCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmYXJwdF9zb2Nrb3B0cyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoJmFycHRfZXJyb3JfdGFyZ2V0KTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldCgmYXJwdF9zdGFuZGFyZF90YXJnZXQpOwogCXh0X3Byb3RvX2ZpbmkoTkZfQVJQKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMKaW5kZXggNmM3MzgzYS4uYWQyNDZiYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2FtYW5kYS5jCkBAIC05Miw2ICs5Miw3IEBACiAJY2hhciBwYnVmW3NpemVvZigiNjU1MzUiKV0sICp0bXA7CiAJdV9pbnQxNl90IHBvcnQsIGxlbjsKIAlpbnQgcmV0ID0gTkZfQUNDRVBUOworCXR5cGVvZihpcF9uYXRfYW1hbmRhX2hvb2spIGlwX25hdF9hbWFuZGE7CiAKIAkvKiBPbmx5IGxvb2sgYXQgcGFja2V0cyBmcm9tIHRoZSBBbWFuZGEgc2VydmVyICovCiAJaWYgKENUSU5GTzJESVIoY3RpbmZvKSA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCkBAIC0xNjEsOSArMTYyLDExIEBACiAJCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwogCQlleHAtPm1hc2suZHN0LnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwogCi0JCWlmIChpcF9uYXRfYW1hbmRhX2hvb2spCi0JCQlyZXQgPSBpcF9uYXRfYW1hbmRhX2hvb2socHNrYiwgY3RpbmZvLCBvZmYgLSBkYXRhb2ZmLAotCQkJCQkJIGxlbiwgZXhwKTsKKwkJLyogUkNVIHJlYWQgbG9ja2VkIGJ5IG5mX2hvb2tfc2xvdyAqLworCQlpcF9uYXRfYW1hbmRhID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9hbWFuZGFfaG9vayk7CisJCWlmIChpcF9uYXRfYW1hbmRhKQorCQkJcmV0ID0gaXBfbmF0X2FtYW5kYShwc2tiLCBjdGluZm8sIG9mZiAtIGRhdGFvZmYsCisJCQkJCSAgICBsZW4sIGV4cCk7CiAJCWVsc2UgaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCiAJCQlyZXQgPSBORl9EUk9QOwogCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwpAQCAtMTgwLDcgKzE4Myw3IEBACiAJLmhlbHAgPSBoZWxwLAogCS5uYW1lID0gImFtYW5kYSIsCiAKLQkudHVwbGUgPSB7IC5zcmMgPSB7IC51ID0geyBfX2NvbnN0YW50X2h0b25zKDEwMDgwKSB9IH0sCisJLnR1cGxlID0geyAuc3JjID0geyAudSA9IHsgLnVkcCA9IHsucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoMTAwODApIH0gfSB9LAogCQkgICAuZHN0ID0geyAucHJvdG9udW0gPSBJUFBST1RPX1VEUCB9LAogCX0sCiAJLm1hc2sgPSB7IC5zcmMgPSB7IC51ID0geyAweEZGRkYgfSB9LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwppbmRleCAxNDNjNDY2Li44NTU2YTRmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYwpAQCAtNDAsOSArNDAsNiBAQAogCiAvKiBpcF9jb25udHJhY2tfbG9jayBwcm90ZWN0cyB0aGUgbWFpbiBoYXNoIHRhYmxlLCBwcm90b2NvbC9oZWxwZXIvZXhwZWN0ZWQKICAgIHJlZ2lzdHJhdGlvbnMsIGNvbm50cmFjayB0aW1lcnMqLwotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpCi0jZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpCi0KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+CkBAIC02OCw4ICs2NSw4IEBACiB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplIF9fcmVhZF9tb3N0bHkgPSAwOwogaW50IGlwX2Nvbm50cmFja19tYXggX19yZWFkX21vc3RseTsKIHN0cnVjdCBsaXN0X2hlYWQgKmlwX2Nvbm50cmFja19oYXNoIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMga21lbV9jYWNoZV90ICppcF9jb25udHJhY2tfY2FjaGVwIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMga21lbV9jYWNoZV90ICppcF9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppcF9jb25udHJhY2tfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiBzdHJ1Y3QgaXBfY29ubnRyYWNrIGlwX2Nvbm50cmFja191bnRyYWNrZWQ7CiB1bnNpZ25lZCBpbnQgaXBfY3RfbG9nX2ludmFsaWQgX19yZWFkX21vc3RseTsKIHN0YXRpYyBMSVNUX0hFQUQodW5jb25maXJtZWQpOwpAQCAtMjAxLDcgKzE5OCw2IEBACiAvKiBpcF9jb25udHJhY2tfZXhwZWN0IGhlbHBlciBmdW5jdGlvbnMgKi8KIHZvaWQgaXBfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogewotCUFTU0VSVF9XUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CiAJSVBfTkZfQVNTRVJUKCF0aW1lcl9wZW5kaW5nKCZleHAtPnRpbWVvdXQpKTsKIAlsaXN0X2RlbCgmZXhwLT5saXN0KTsKIAlDT05OVFJBQ0tfU1RBVF9JTkMoZXhwZWN0X2RlbGV0ZSk7CkBAIC0yMjUsMjIgKzIyMSwyMiBAQAogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppOwogCQogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewotCQlpZiAoaXBfY3RfdHVwbGVfbWFza19jbXAodHVwbGUsICZpLT50dXBsZSwgJmktPm1hc2spKSB7Ci0JCQlhdG9taWNfaW5jKCZpLT51c2UpOworCQlpZiAoaXBfY3RfdHVwbGVfbWFza19jbXAodHVwbGUsICZpLT50dXBsZSwgJmktPm1hc2spKQogCQkJcmV0dXJuIGk7Ci0JCX0KIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKIC8qIEp1c3QgZmluZCBhIGV4cGVjdGF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICoKLWlwX2Nvbm50cmFja19leHBlY3RfZmluZChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK2lwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7CiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7CiAJCiAJcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CiAJaSA9IF9faXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKHR1cGxlKTsKKwlpZiAoaSkKKwkJYXRvbWljX2luYygmaS0+dXNlKTsKIAlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwogCiAJcmV0dXJuIGk7CkBAIC0yOTQsNyArMjkwLDYgQEAKIGNsZWFuX2Zyb21fbGlzdHMoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCiB7CiAJREVCVUdQKCJjbGVhbl9mcm9tX2xpc3RzKCVwKVxuIiwgY3QpOwotCUFTU0VSVF9XUklURV9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CiAJbGlzdF9kZWwoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5saXN0KTsKIAlsaXN0X2RlbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLmxpc3QpOwogCkBAIC0zNzMsNyArMzY4LDYgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX2Nvbm50cmFjayh0dXBsZSk7CiAKLQlBU1NFUlRfUkVBRF9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmaXBfY29ubnRyYWNrX2hhc2hbaGFzaF0sIGxpc3QpIHsKIAkJaWYgKHR1cGxlaGFzaF90b19jdHJhY2soaCkgIT0gaWdub3JlZF9jb25udHJhY2sgJiYKIAkJICAgIGlwX2N0X3R1cGxlX2VxdWFsKHR1cGxlLCAmaC0+dHVwbGUpKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYwppbmRleCA5M2RjZjk2Li4wNDEwYzk5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMKQEAgLTMxMCw2ICszMTAsNyBAQAogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGZvdW5kID0gMCwgZW5kc19pbl9ubDsKKwl0eXBlb2YoaXBfbmF0X2Z0cF9ob29rKSBpcF9uYXRfZnRwOwogCiAJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCiAJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRApAQCAtNDMzLDkgKzQzNCwxMCBAQAogCiAJLyogTm93LCBOQVQgbWlnaHQgd2FudCB0byBtYW5nbGUgdGhlIHBhY2tldCwgYW5kIHJlZ2lzdGVyIHRoZQogCSAqIChwb3NzaWJseSBjaGFuZ2VkKSBleHBlY3RhdGlvbiBpdHNlbGYuICovCi0JaWYgKGlwX25hdF9mdHBfaG9vaykKLQkJcmV0ID0gaXBfbmF0X2Z0cF9ob29rKHBza2IsIGN0aW5mbywgc2VhcmNoW2Rpcl1baV0uZnRwdHlwZSwKLQkJCQkgICAgICBtYXRjaG9mZiwgbWF0Y2hsZW4sIGV4cCwgJnNlcSk7CisJaXBfbmF0X2Z0cCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfZnRwX2hvb2spOworCWlmIChpcF9uYXRfZnRwKQorCQlyZXQgPSBpcF9uYXRfZnRwKHBza2IsIGN0aW5mbywgc2VhcmNoW2Rpcl1baV0uZnRwdHlwZSwKKwkJCQkgbWF0Y2hvZmYsIG1hdGNobGVuLCBleHAsICZzZXEpOwogCWVsc2UgewogCQkvKiBDYW4ndCBleHBlY3QgdGhpcz8gIEJlc3QgdG8gZHJvcCBwYWNrZXQgbm93LiAqLwogCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjMuYwppbmRleCA3Yjc0NDEyLi5hYWJmZTFjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfaDMyMy5jCkBAIC0yMzcsNiArMjM3LDcgQEAKIAl1X2ludDE2X3QgcnRwX3BvcnQ7CiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnJ0cF9leHA7CiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnJ0Y3BfZXhwOworCXR5cGVvZihuYXRfcnRwX3J0Y3BfaG9vaykgbmF0X3J0cF9ydGNwOwogCiAJLyogUmVhZCBSVFAgb3IgUlRDUCBhZGRyZXNzICovCiAJaWYgKCFnZXRfaDI0NV9hZGRyKCpkYXRhLCBhZGRyLCAmaXAsICZwb3J0KSB8fApAQCAtMjc5LDExICsyODAsMTEgQEAKIAlydGNwX2V4cC0+ZmxhZ3MgPSAwOwogCiAJaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYgbmF0X3J0cF9ydGNwX2hvb2spIHsKKwkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYKKwkgICAgKG5hdF9ydHBfcnRjcCA9IHJjdV9kZXJlZmVyZW5jZShuYXRfcnRwX3J0Y3BfaG9vaykpKSB7CiAJCS8qIE5BVCBuZWVkZWQgKi8KLQkJcmV0ID0gbmF0X3J0cF9ydGNwX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJYWRkciwgcG9ydCwgcnRwX3BvcnQsIHJ0cF9leHAsCi0JCQkJCXJ0Y3BfZXhwKTsKKwkJcmV0ID0gbmF0X3J0cF9ydGNwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAgYWRkciwgcG9ydCwgcnRwX3BvcnQsIHJ0cF9leHAsIHJ0Y3BfZXhwKTsKIAl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KIAkJcnRwX2V4cC0+ZXhwZWN0Zm4gPSBOVUxMOwogCQlydGNwX2V4cC0+ZXhwZWN0Zm4gPSBOVUxMOwpAQCAtMzI4LDYgKzMyOSw3IEBACiAJX19iZTMyIGlwOwogCXVfaW50MTZfdCBwb3J0OwogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAgPSBOVUxMOworCXR5cGVvZihuYXRfdDEyMF9ob29rKSBuYXRfdDEyMDsKIAogCS8qIFJlYWQgVC4xMjAgYWRkcmVzcyAqLwogCWlmICghZ2V0X2gyNDVfYWRkcigqZGF0YSwgYWRkciwgJmlwLCAmcG9ydCkgfHwKQEAgLTM1MCwxMCArMzUyLDExIEBACiAJZXhwLT5mbGFncyA9IElQX0NUX0VYUEVDVF9QRVJNQU5FTlQ7CS8qIEFjY2VwdCBtdWx0aXBsZSBjaGFubmVscyAqLwogCiAJaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYgbmF0X3QxMjBfaG9vaykgeworCSAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCAmJgorCSAgICAobmF0X3QxMjAgPSByY3VfZGVyZWZlcmVuY2UobmF0X3QxMjBfaG9vaykpKSB7CiAJCS8qIE5BVCBuZWVkZWQgKi8KLQkJcmV0ID0gbmF0X3QxMjBfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAotCQkJCSAgICBwb3J0LCBleHApOworCQlyZXQgPSBuYXRfdDEyMChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAorCQkJICAgICAgIHBvcnQsIGV4cCk7CiAJfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCiAJCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOwogCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgewpAQCAtNjUxLDYgKzY1NCw3IEBACiAJX19iZTMyIGlwOwogCXVfaW50MTZfdCBwb3J0OwogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAgPSBOVUxMOworCXR5cGVvZihuYXRfaDI0NV9ob29rKSBuYXRfaDI0NTsKIAogCS8qIFJlYWQgaDI0NUFkZHJlc3MgKi8KIAlpZiAoIWdldF9oMjI1X2FkZHIoKmRhdGEsIGFkZHIsICZpcCwgJnBvcnQpIHx8CkBAIC02NzMsMTAgKzY3NywxMSBAQAogCWV4cC0+ZmxhZ3MgPSAwOwogCiAJaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYgbmF0X2gyNDVfaG9vaykgeworCSAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCAmJgorCSAgICAobmF0X2gyNDUgPSByY3VfZGVyZWZlcmVuY2UobmF0X2gyNDVfaG9vaykpKSB7CiAJCS8qIE5BVCBuZWVkZWQgKi8KLQkJcmV0ID0gbmF0X2gyNDVfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAotCQkJCSAgICBwb3J0LCBleHApOworCQlyZXQgPSBuYXRfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAorCQkJICAgICAgIHBvcnQsIGV4cCk7CiAJfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCiAJCWV4cC0+ZXhwZWN0Zm4gPSBpcF9jb25udHJhY2tfaDI0NV9leHBlY3Q7CiAKQEAgLTcxMiw2ICs3MTcsNyBAQAogCV9fYmUzMiBpcDsKIAl1X2ludDE2X3QgcG9ydDsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gTlVMTDsKKwl0eXBlb2YobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spIG5hdF9jYWxsZm9yd2FyZGluZzsKIAogCS8qIFJlYWQgYWx0ZXJuYXRpdmVBZGRyZXNzICovCiAJaWYgKCFnZXRfaDIyNV9hZGRyKCpkYXRhLCBhZGRyLCAmaXAsICZwb3J0KSB8fCBwb3J0ID09IDApCkBAIC03NTksMTAgKzc2NSwxMSBAQAogCWV4cC0+ZmxhZ3MgPSAwOwogCiAJaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYgbmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spIHsKKwkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYKKwkgICAgKG5hdF9jYWxsZm9yd2FyZGluZyA9IHJjdV9kZXJlZmVyZW5jZShuYXRfY2FsbGZvcndhcmRpbmdfaG9vaykpKSB7CiAJCS8qIE5lZWQgTkFUICovCi0JCXJldCA9IG5hdF9jYWxsZm9yd2FyZGluZ19ob29rKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgICAgIGFkZHIsIHBvcnQsIGV4cCk7CisJCXJldCA9IG5hdF9jYWxsZm9yd2FyZGluZyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgYWRkciwgcG9ydCwgZXhwKTsKIAl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KIAkJZXhwLT5leHBlY3RmbiA9IGlwX2Nvbm50cmFja19xOTMxX2V4cGVjdDsKIApAQCAtNzkzLDYgKzgwMCw3IEBACiAJaW50IGk7CiAJX19iZTMyIGlwOwogCXVfaW50MTZfdCBwb3J0OworCXR5cGVvZihzZXRfaDIyNV9hZGRyX2hvb2spIHNldF9oMjI1X2FkZHI7CiAKIAlERUJVR1AoImlwX2N0X3E5MzE6IFNldHVwXG4iKTsKIApAQCAtODAzLDggKzgxMSwxMCBAQAogCQkJcmV0dXJuIC0xOwogCX0KIAorCXNldF9oMjI1X2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X2gyMjVfYWRkcl9ob29rKTsKKwogCWlmICgoc2V0dXAtPm9wdGlvbnMgJiBlU2V0dXBfVVVJRV9kZXN0Q2FsbFNpZ25hbEFkZHJlc3MpICYmCi0JICAgIChzZXRfaDIyNV9hZGRyX2hvb2spICYmCisJICAgIChzZXRfaDIyNV9hZGRyKSAmJgogCSAgICBnZXRfaDIyNV9hZGRyKCpkYXRhLCAmc2V0dXAtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkgJiYKIAkgICAgaXAgIT0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXApIHsKIAkJREVCVUdQKCJpcF9jdF9xOTMxOiBzZXQgZGVzdENhbGxTaWduYWxBZGRyZXNzICIKQEAgLTgxMiwxNyArODIyLDE3IEBACiAJCSAgICAgICBOSVBRVUFEKGlwKSwgcG9ydCwKIAkJICAgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXApLAogCQkgICAgICAgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudS50Y3AucG9ydCkpOwotCQlyZXQgPSBzZXRfaDIyNV9hZGRyX2hvb2socHNrYiwgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICZzZXR1cC0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLAotCQkJCQkgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXAsCi0JCQkJCSBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy4KLQkJCQkJICAgICAgIHUudGNwLnBvcnQpKTsKKwkJcmV0ID0gc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAmc2V0dXAtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKKwkJCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXAsCisJCQkJICAgIG50b2hzKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLgorCQkJCQkgIHUudGNwLnBvcnQpKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKChzZXR1cC0+b3B0aW9ucyAmIGVTZXR1cF9VVUlFX3NvdXJjZUNhbGxTaWduYWxBZGRyZXNzKSAmJgotCSAgICAoc2V0X2gyMjVfYWRkcl9ob29rKSAmJgorCSAgICAoc2V0X2gyMjVfYWRkcikgJiYKIAkgICAgZ2V0X2gyMjVfYWRkcigqZGF0YSwgJnNldHVwLT5zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkKIAkgICAgJiYgaXAgIT0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXApIHsKIAkJREVCVUdQKCJpcF9jdF9xOTMxOiBzZXQgc291cmNlQ2FsbFNpZ25hbEFkZHJlc3MgIgpAQCAtODMwLDExICs4NDAsMTEgQEAKIAkJICAgICAgIE5JUFFVQUQoaXApLCBwb3J0LAogCQkgICAgICAgTklQUVVBRChjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCksCiAJCSAgICAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7Ci0JCXJldCA9IHNldF9oMjI1X2FkZHJfaG9vayhwc2tiLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgJnNldHVwLT5zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcywKLQkJCQkJIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJCQkgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuCi0JCQkJCSAgICAgICB1LnRjcC5wb3J0KSk7CisJCXJldCA9IHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICAgJnNldHVwLT5zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcywKKwkJCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCisJCQkJICAgIG50b2hzKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LgorCQkJCQkgIHUudGNwLnBvcnQpKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTE1Myw3ICsxMTYzLDcgQEAKIAkubWUgPSBUSElTX01PRFVMRSwKIAkubWF4X2V4cGVjdGVkID0gSDMyM19SVFBfQ0hBTk5FTF9NQVggKiA0ICsgNCAvKiBULjEyMCBhbmQgSC4yNDUgKi8gLAogCS50aW1lb3V0ID0gMjQwLAotCS50dXBsZSA9IHsuc3JjID0gey51ID0ge19fY29uc3RhbnRfaHRvbnMoUTkzMV9QT1JUKX19LAorCS50dXBsZSA9IHsuc3JjID0gey51ID0gey50Y3AgPSB7LnBvcnQgPSBfX2NvbnN0YW50X2h0b25zKFE5MzFfUE9SVCl9fX0sCiAJCSAgLmRzdCA9IHsucHJvdG9udW0gPSBJUFBST1RPX1RDUH19LAogCS5tYXNrID0gey5zcmMgPSB7LnUgPSB7MHhGRkZGfX0sCiAJCSAuZHN0ID0gey5wcm90b251bSA9IDB4RkZ9fSwKQEAgLTEyMzEsNiArMTI0MSw3IEBACiAJX19iZTMyIGlwOwogCXVfaW50MTZfdCBwb3J0OwogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdHlwZW9mKG5hdF9xOTMxX2hvb2spIG5hdF9xOTMxOwogCiAJLyogTG9vayBmb3IgdGhlIGZpcnN0IHJlbGF0ZWQgYWRkcmVzcyAqLwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC0xMjU4LDkgKzEyNjksOSBAQAogCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwogCWV4cC0+ZmxhZ3MgPSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UOwkvKiBBY2NlcHQgbXVsdGlwbGUgY2FsbHMgKi8KIAotCWlmIChuYXRfcTkzMV9ob29rKSB7CS8qIE5lZWQgTkFUICovCi0JCXJldCA9IG5hdF9xOTMxX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgYWRkciwgaSwKLQkJCQkgICAgcG9ydCwgZXhwKTsKKwluYXRfcTkzMSA9IHJjdV9kZXJlZmVyZW5jZShuYXRfcTkzMV9ob29rKTsKKwlpZiAobmF0X3E5MzEpIHsJLyogTmVlZCBOQVQgKi8KKwkJcmV0ID0gbmF0X3E5MzEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgYWRkciwgaSwgcG9ydCwgZXhwKTsKIAl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KIAkJZXhwLT5leHBlY3RmbiA9IGlwX2Nvbm50cmFja19xOTMxX2V4cGVjdDsKIApAQCAtMTI4OCwxMSArMTI5OSwxNCBAQAogCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCiAJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgR2F0ZWtlZXBlclJlcXVlc3QgKiBncnEpCiB7CisJdHlwZW9mKHNldF9yYXNfYWRkcl9ob29rKSBzZXRfcmFzX2FkZHI7CisKIAlERUJVR1AoImlwX2N0X3JhczogR1JRXG4iKTsKIAotCWlmIChzZXRfcmFzX2FkZHJfaG9vaykJLyogTkFUZWQgKi8KLQkJcmV0dXJuIHNldF9yYXNfYWRkcl9ob29rKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJCSAmZ3JxLT5yYXNBZGRyZXNzLCAxKTsKKwlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOworCWlmIChzZXRfcmFzX2FkZHIpCS8qIE5BVGVkICovCisJCXJldHVybiBzZXRfcmFzX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAgJmdycS0+cmFzQWRkcmVzcywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNjIsNiArMTM3Niw3IEBACiB7CiAJc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKIAlpbnQgcmV0OworCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOwogCiAJREVCVUdQKCJpcF9jdF9yYXM6IFJSUVxuIik7CiAKQEAgLTEzNzEsMTAgKzEzODYsMTEgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKHNldF9yYXNfYWRkcl9ob29rKSB7Ci0JCXJldCA9IHNldF9yYXNfYWRkcl9ob29rKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJCXJycS0+cmFzQWRkcmVzcy5pdGVtLAotCQkJCQlycnEtPnJhc0FkZHJlc3MuY291bnQpOworCXNldF9yYXNfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfcmFzX2FkZHJfaG9vayk7CisJaWYgKHNldF9yYXNfYWRkcikgeworCQlyZXQgPSBzZXRfcmFzX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICBycnEtPnJhc0FkZHJlc3MuaXRlbSwKKwkJCQkgICBycnEtPnJhc0FkZHJlc3MuY291bnQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiAtMTsKIAl9CkBAIC0xMzk3LDEzICsxNDEzLDE1IEBACiAJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKIAlpbnQgcmV0OwogCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7CiAKIAlERUJVR1AoImlwX2N0X3JhczogUkNGXG4iKTsKIAotCWlmIChzZXRfc2lnX2FkZHJfaG9vaykgewotCQlyZXQgPSBzZXRfc2lnX2FkZHJfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCQlyY2YtPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCi0JCQkJCXJjZi0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOworCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7CisJaWYgKHNldF9zaWdfYWRkcikgeworCQlyZXQgPSBzZXRfc2lnX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICByY2YtPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCisJCQkJICAgcmNmLT5jYWxsU2lnbmFsQWRkcmVzcy5jb3VudCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KQEAgLTE0MTcsNyArMTQzNSw3IEBACiAJCURFQlVHUAogCQkgICAgKCJpcF9jdF9yYXM6IHNldCBSQVMgY29ubmVjdGlvbiB0aW1lb3V0IHRvICV1IHNlY29uZHNcbiIsCiAJCSAgICAgaW5mby0+dGltZW91dCk7Ci0JCWlwX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBOVUxMLCBpbmZvLT50aW1lb3V0ICogSFopOworCQlpcF9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgaW5mby0+dGltZW91dCAqIEhaKTsKIAogCQkvKiBTZXQgZXhwZWN0IHRpbWVvdXQgKi8KIAkJcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7CkBAIC0xNDQ4LDEzICsxNDY2LDE1IEBACiAJc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKIAlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwogCWludCByZXQ7CisJdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7CiAKIAlERUJVR1AoImlwX2N0X3JhczogVVJRXG4iKTsKIAotCWlmIChzZXRfc2lnX2FkZHJfaG9vaykgewotCQlyZXQgPSBzZXRfc2lnX2FkZHJfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCQl1cnEtPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCi0JCQkJCXVycS0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOworCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7CisJaWYgKHNldF9zaWdfYWRkcikgeworCQlyZXQgPSBzZXRfc2lnX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICB1cnEtPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCisJCQkJICAgdXJxLT5jYWxsU2lnbmFsQWRkcmVzcy5jb3VudCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KQEAgLTE0NjUsNyArMTQ4NSw3IEBACiAJaW5mby0+c2lnX3BvcnRbIWRpcl0gPSAwOwogCiAJLyogR2l2ZSBpdCAzMCBzZWNvbmRzIGZvciBVQ0Ygb3IgVVJKICovCi0JaXBfY3RfcmVmcmVzaF9hY2N0KGN0LCBjdGluZm8sIE5VTEwsIDMwICogSFopOworCWlwX2N0X3JlZnJlc2goY3QsICpwc2tiLCAzMCAqIEhaKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ3OSwyOCArMTQ5OSwzMCBAQAogCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CiAJX19iZTMyIGlwOwogCXVfaW50MTZfdCBwb3J0OworCXR5cGVvZihzZXRfaDIyNV9hZGRyX2hvb2spIHNldF9oMjI1X2FkZHI7CiAKIAlERUJVR1AoImlwX2N0X3JhczogQVJRXG4iKTsKIAorCXNldF9oMjI1X2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X2gyMjVfYWRkcl9ob29rKTsKIAlpZiAoKGFycS0+b3B0aW9ucyAmIGVBZG1pc3Npb25SZXF1ZXN0X2Rlc3RDYWxsU2lnbmFsQWRkcmVzcykgJiYKIAkgICAgZ2V0X2gyMjVfYWRkcigqZGF0YSwgJmFycS0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLCAmaXAsICZwb3J0KSAmJgogCSAgICBpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICYmCi0JICAgIHBvcnQgPT0gaW5mby0+c2lnX3BvcnRbZGlyXSAmJiBzZXRfaDIyNV9hZGRyX2hvb2spIHsKKwkgICAgcG9ydCA9PSBpbmZvLT5zaWdfcG9ydFtkaXJdICYmIHNldF9oMjI1X2FkZHIpIHsKIAkJLyogQW5zd2VyaW5nIEFSUSAqLwotCQlyZXR1cm4gc2V0X2gyMjVfYWRkcl9ob29rKHBza2IsIGRhdGEsIDAsCi0JCQkJCSAgJmFycS0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLAotCQkJCQkgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJCQkgIGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKKwkJcmV0dXJuIHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwKKwkJCQkgICAgICZhcnEtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKKwkJCQkgICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAorCQkJCSAgICAgaW5mby0+c2lnX3BvcnRbIWRpcl0pOwogCX0KIAogCWlmICgoYXJxLT5vcHRpb25zICYgZUFkbWlzc2lvblJlcXVlc3Rfc3JjQ2FsbFNpZ25hbEFkZHJlc3MpICYmCiAJICAgIGdldF9oMjI1X2FkZHIoKmRhdGEsICZhcnEtPnNyY0NhbGxTaWduYWxBZGRyZXNzLCAmaXAsICZwb3J0KSAmJgotCSAgICBpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICYmIHNldF9oMjI1X2FkZHJfaG9vaykgeworCSAgICBpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICYmIHNldF9oMjI1X2FkZHIpIHsKIAkJLyogQ2FsbGluZyBBUlEgKi8KLQkJcmV0dXJuIHNldF9oMjI1X2FkZHJfaG9vayhwc2tiLCBkYXRhLCAwLAotCQkJCQkgICZhcnEtPnNyY0NhbGxTaWduYWxBZGRyZXNzLAotCQkJCQkgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJCQkgIHBvcnQpOworCQlyZXR1cm4gc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCAwLAorCQkJCSAgICAgJmFycS0+c3JjQ2FsbFNpZ25hbEFkZHJlc3MsCisJCQkJICAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKKwkJCQkgICAgIHBvcnQpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTUxNiw2ICsxNTM4LDcgQEAKIAlfX2JlMzIgaXA7CiAJdV9pbnQxNl90IHBvcnQ7CiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwl0eXBlb2Yoc2V0X3NpZ19hZGRyX2hvb2spIHNldF9zaWdfYWRkcjsKIAogCURFQlVHUCgiaXBfY3RfcmFzOiBBQ0ZcbiIpOwogCkBAIC0xNTIzLDEwICsxNTQ2LDEwIEBACiAJCXJldHVybiAwOwogCiAJaWYgKGlwID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QuaXApIHsJLyogQW5zd2VyaW5nIEFDRiAqLwotCQlpZiAoc2V0X3NpZ19hZGRyX2hvb2spCi0JCQlyZXR1cm4gc2V0X3NpZ19hZGRyX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkJCSAmYWNmLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCi0JCQkJCQkgMSk7CisJCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7CisJCWlmIChzZXRfc2lnX2FkZHIpCisJCQlyZXR1cm4gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJCSAgICAmYWNmLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsIDEpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE1NjYsMTEgKzE1ODksMTQgQEAKIAkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAogCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIExvY2F0aW9uUmVxdWVzdCAqIGxycSkKIHsKKwl0eXBlb2Yoc2V0X3Jhc19hZGRyX2hvb2spIHNldF9yYXNfYWRkcjsKKwogCURFQlVHUCgiaXBfY3RfcmFzOiBMUlFcbiIpOwogCi0JaWYgKHNldF9yYXNfYWRkcl9ob29rKQotCQlyZXR1cm4gc2V0X3Jhc19hZGRyX2hvb2socHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkJICZscnEtPnJlcGx5QWRkcmVzcywgMSk7CisJc2V0X3Jhc19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKTsKKwlpZiAoc2V0X3Jhc19hZGRyKQorCQlyZXR1cm4gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgICZscnEtPnJlcGx5QWRkcmVzcywgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MjksMjAgKzE2NTUsMjQgQEAKIAkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBJbmZvUmVxdWVzdFJlc3BvbnNlICogaXJyKQogewogCWludCByZXQ7CisJdHlwZW9mKHNldF9yYXNfYWRkcl9ob29rKSBzZXRfcmFzX2FkZHI7CisJdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7CiAKIAlERUJVR1AoImlwX2N0X3JhczogSVJSXG4iKTsKIAotCWlmIChzZXRfcmFzX2FkZHJfaG9vaykgewotCQlyZXQgPSBzZXRfcmFzX2FkZHJfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCQkmaXJyLT5yYXNBZGRyZXNzLCAxKTsKKwlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOworCWlmIChzZXRfcmFzX2FkZHIpIHsKKwkJcmV0ID0gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJmlyci0+cmFzQWRkcmVzcywgMSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChzZXRfc2lnX2FkZHJfaG9vaykgewotCQlyZXQgPSBzZXRfc2lnX2FkZHJfaG9vayhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCQlpcnItPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCi0JCQkJCWlyci0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOworCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7CisJaWYgKHNldF9zaWdfYWRkcikgeworCQlyZXQgPSBzZXRfc2lnX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICBpcnItPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCisJCQkJICAgaXJyLT5jYWxsU2lnbmFsQWRkcmVzcy5jb3VudCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIC0xOwogCX0KQEAgLTE3NDYsNyArMTc3Niw3IEBACiAJLm1lID0gVEhJU19NT0RVTEUsCiAJLm1heF9leHBlY3RlZCA9IDMyLAogCS50aW1lb3V0ID0gMjQwLAotCS50dXBsZSA9IHsuc3JjID0gey51ID0ge19fY29uc3RhbnRfaHRvbnMoUkFTX1BPUlQpfX0sCisJLnR1cGxlID0gey5zcmMgPSB7LnUgPSB7LnRjcCA9IHsucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoUkFTX1BPUlQpfX19LAogCQkgIC5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19VRFB9fSwKIAkubWFzayA9IHsuc3JjID0gey51ID0gezB4RkZGRX19LAogCQkgLmRzdCA9IHsucHJvdG9udW0gPSAweEZGfX0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX2FzbjEuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfYXNuMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRmZWNhLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjNfYXNuMS5jCisrKyAvZGV2L251bGwKQEAgLTEsODc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBpcF9jb25udHJhY2tfaGVscGVyX2gzMjNfYXNuMS5jIC0gQkVSIGFuZCBQRVIgZGVjb2RpbmcgbGlicmFyeSBmb3IgSC4zMjMKLSAqIAkJCSAgICAgIAkgICAgIGNvbm50cmFjay9OQVQgbW9kdWxlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBieSBKaW5nIE1pbiBaaGFvIDx6aGFvamluZ21pbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gKgotICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqCi0gKiBTZWUgaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX2FzbjEuaCBmb3IgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmg+Ci0KLS8qIFRyYWNlIEZsYWcgKi8KLSNpZm5kZWYgSDMyM19UUkFDRQotI2RlZmluZSBIMzIzX1RSQUNFIDAKLSNlbmRpZgotCi0jaWYgSDMyM19UUkFDRQotI2RlZmluZSBUQUJfU0laRSA0Ci0jZGVmaW5lIElGVEhFTihjb25kLCBhY3QpIGlmKGNvbmQpe2FjdDt9Ci0jaWZkZWYgX19LRVJORUxfXwotI2RlZmluZSBQUklOVCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIFBSSU5UIHByaW50ZgotI2VuZGlmCi0jZGVmaW5lIEZOQU1FKG5hbWUpIG5hbWUsCi0jZWxzZQotI2RlZmluZSBJRlRIRU4oY29uZCwgYWN0KQotI2RlZmluZSBQUklOVChmbXQsIGFyZ3MuLi4pCi0jZGVmaW5lIEZOQU1FKG5hbWUpCi0jZW5kaWYKLQotLyogQVNOLjEgVHlwZXMgKi8KLSNkZWZpbmUgTlVMIDAKLSNkZWZpbmUgQk9PTCAxCi0jZGVmaW5lIE9JRCAyCi0jZGVmaW5lIElOVCAzCi0jZGVmaW5lIEVOVU0gNAotI2RlZmluZSBCSVRTVFIgNQotI2RlZmluZSBOVU1TVFIgNgotI2RlZmluZSBOVU1ER1QgNgotI2RlZmluZSBUQkNEU1RSIDYKLSNkZWZpbmUgT0NUU1RSIDcKLSNkZWZpbmUgUFJUU1RSIDcKLSNkZWZpbmUgSUE1U1RSIDcKLSNkZWZpbmUgR0VOU1RSIDcKLSNkZWZpbmUgQk1QU1RSIDgKLSNkZWZpbmUgU0VRIDkKLSNkZWZpbmUgU0VUIDkKLSNkZWZpbmUgU0VRT0YgMTAKLSNkZWZpbmUgU0VUT0YgMTAKLSNkZWZpbmUgQ0hPSUNFIDExCi0KLS8qIENvbnN0cmFpbnQgVHlwZXMgKi8KLSNkZWZpbmUgRklYRCAwCi0vKiAjZGVmaW5lIEJJVFMgMS04ICovCi0jZGVmaW5lIEJZVEUgOQotI2RlZmluZSBXT1JEIDEwCi0jZGVmaW5lIENPTlMgMTEKLSNkZWZpbmUgU0VNSSAxMgotI2RlZmluZSBVTkNPIDEzCi0KLS8qIEFTTi4xIFR5cGUgQXR0cmlidXRlcyAqLwotI2RlZmluZSBTS0lQIDAKLSNkZWZpbmUgU1RPUCAxCi0jZGVmaW5lIERFQ09ERSAyCi0jZGVmaW5lIEVYVCA0Ci0jZGVmaW5lIE9QRU4gOAotI2RlZmluZSBPUFQgMTYKLQotCi0vKiBBU04uMSBGaWVsZCBTdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IGZpZWxkX3QgewotI2lmIEgzMjNfVFJBQ0UKLQljaGFyICpuYW1lOwotI2VuZGlmCi0JdW5zaWduZWQgY2hhciB0eXBlOwotCXVuc2lnbmVkIGNoYXIgc3o7Ci0JdW5zaWduZWQgY2hhciBsYjsKLQl1bnNpZ25lZCBjaGFyIHViOwotCXVuc2lnbmVkIHNob3J0IGF0dHI7Ci0JdW5zaWduZWQgc2hvcnQgb2Zmc2V0OwotCXN0cnVjdCBmaWVsZF90ICpmaWVsZHM7Ci19IGZpZWxkX3Q7Ci0KLS8qIEJpdCBTdHJlYW0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBjaGFyICpidWY7Ci0JdW5zaWduZWQgY2hhciAqYmVnOwotCXVuc2lnbmVkIGNoYXIgKmVuZDsKLQl1bnNpZ25lZCBjaGFyICpjdXI7Ci0JdW5zaWduZWQgYml0OwotfSBiaXRzdHJfdDsKLQotLyogVG9vbCBGdW5jdGlvbnMgKi8KLSNkZWZpbmUgSU5DX0JJVChicykgaWYoKCsrYnMtPmJpdCk+Nyl7YnMtPmN1cisrO2JzLT5iaXQ9MDt9Ci0jZGVmaW5lIElOQ19CSVRTKGJzLGIpIGlmKChicy0+Yml0Kz1iKT43KXticy0+Y3VyKz1icy0+Yml0Pj4zO2JzLT5iaXQmPTc7fQotI2RlZmluZSBCWVRFX0FMSUdOKGJzKSBpZihicy0+Yml0KXticy0+Y3VyKys7YnMtPmJpdD0wO30KLSNkZWZpbmUgQ0hFQ0tfQk9VTkQoYnMsbikgaWYoYnMtPmN1cisobik+YnMtPmVuZClyZXR1cm4oSDMyM19FUlJPUl9CT1VORCkKLXN0YXRpYyB1bnNpZ25lZCBnZXRfbGVuKGJpdHN0cl90ICogYnMpOwotc3RhdGljIHVuc2lnbmVkIGdldF9iaXQoYml0c3RyX3QgKiBicyk7Ci1zdGF0aWMgdW5zaWduZWQgZ2V0X2JpdHMoYml0c3RyX3QgKiBicywgdW5zaWduZWQgYik7Ci1zdGF0aWMgdW5zaWduZWQgZ2V0X2JpdG1hcChiaXRzdHJfdCAqIGJzLCB1bnNpZ25lZCBiKTsKLXN0YXRpYyB1bnNpZ25lZCBnZXRfdWludChiaXRzdHJfdCAqIGJzLCBpbnQgYik7Ci0KLS8qIERlY29kZXIgRnVuY3Rpb25zICovCi1zdGF0aWMgaW50IGRlY29kZV9udWwoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCk7Ci1zdGF0aWMgaW50IGRlY29kZV9ib29sKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOwotc3RhdGljIGludCBkZWNvZGVfb2lkKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOwotc3RhdGljIGludCBkZWNvZGVfaW50KGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOwotc3RhdGljIGludCBkZWNvZGVfZW51bShiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKTsKLXN0YXRpYyBpbnQgZGVjb2RlX2JpdHN0cihiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKTsKLXN0YXRpYyBpbnQgZGVjb2RlX251bXN0cihiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKTsKLXN0YXRpYyBpbnQgZGVjb2RlX29jdHN0cihiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKTsKLXN0YXRpYyBpbnQgZGVjb2RlX2JtcHN0cihiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKTsKLXN0YXRpYyBpbnQgZGVjb2RlX3NlcShiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKTsKLXN0YXRpYyBpbnQgZGVjb2RlX3NlcW9mKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOwotc3RhdGljIGludCBkZWNvZGVfY2hvaWNlKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOwotCi0vKiBEZWNvZGVyIEZ1bmN0aW9ucyBWZWN0b3IgKi8KLXR5cGVkZWYgaW50ICgqZGVjb2Rlcl90KSAoYml0c3RyX3QgKiwgZmllbGRfdCAqLCBjaGFyICosIGludCk7Ci1zdGF0aWMgZGVjb2Rlcl90IERlY29kZXJzW10gPSB7Ci0JZGVjb2RlX251bCwKLQlkZWNvZGVfYm9vbCwKLQlkZWNvZGVfb2lkLAotCWRlY29kZV9pbnQsCi0JZGVjb2RlX2VudW0sCi0JZGVjb2RlX2JpdHN0ciwKLQlkZWNvZGVfbnVtc3RyLAotCWRlY29kZV9vY3RzdHIsCi0JZGVjb2RlX2JtcHN0ciwKLQlkZWNvZGVfc2VxLAotCWRlY29kZV9zZXFvZiwKLQlkZWNvZGVfY2hvaWNlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEguMzIzIFR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJpcF9jb25udHJhY2tfaGVscGVyX2gzMjNfdHlwZXMuYyIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBc3N1bWUgYnMgaXMgYWxpZ25lZCAmJiB2IDwgMTYzODQgKi8KLXVuc2lnbmVkIGdldF9sZW4oYml0c3RyX3QgKiBicykKLXsKLQl1bnNpZ25lZCB2OwotCi0JdiA9ICpicy0+Y3VyKys7Ci0KLQlpZiAodiAmIDB4ODApIHsKLQkJdiAmPSAweDNmOwotCQl2IDw8PSA4OwotCQl2ICs9ICpicy0+Y3VyKys7Ci0JfQotCi0JcmV0dXJuIHY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgZ2V0X2JpdChiaXRzdHJfdCAqIGJzKQotewotCXVuc2lnbmVkIGIgPSAoKmJzLT5jdXIpICYgKDB4ODAgPj4gYnMtPmJpdCk7Ci0KLQlJTkNfQklUKGJzKTsKLQotCXJldHVybiBiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEFzc3VtZSBiIDw9IDggKi8KLXVuc2lnbmVkIGdldF9iaXRzKGJpdHN0cl90ICogYnMsIHVuc2lnbmVkIGIpCi17Ci0JdW5zaWduZWQgdiwgbDsKLQotCXYgPSAoKmJzLT5jdXIpICYgKDB4ZmZVID4+IGJzLT5iaXQpOwotCWwgPSBiICsgYnMtPmJpdDsKLQotCWlmIChsIDwgOCkgewotCQl2ID4+PSA4IC0gbDsKLQkJYnMtPmJpdCA9IGw7Ci0JfSBlbHNlIGlmIChsID09IDgpIHsKLQkJYnMtPmN1cisrOwotCQlicy0+Yml0ID0gMDsKLQl9IGVsc2UgewkJLyogbCA+IDggKi8KLQotCQl2IDw8PSA4OwotCQl2ICs9ICooKyticy0+Y3VyKTsKLQkJdiA+Pj0gMTYgLSBsOwotCQlicy0+Yml0ID0gbCAtIDg7Ci0JfQotCi0JcmV0dXJuIHY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQXNzdW1lIGIgPD0gMzIgKi8KLXVuc2lnbmVkIGdldF9iaXRtYXAoYml0c3RyX3QgKiBicywgdW5zaWduZWQgYikKLXsKLQl1bnNpZ25lZCB2LCBsLCBzaGlmdCwgYnl0ZXM7Ci0KLQlpZiAoIWIpCi0JCXJldHVybiAwOwotCi0JbCA9IGJzLT5iaXQgKyBiOwotCi0JaWYgKGwgPCA4KSB7Ci0JCXYgPSAodW5zaWduZWQpICgqYnMtPmN1cikgPDwgKGJzLT5iaXQgKyAyNCk7Ci0JCWJzLT5iaXQgPSBsOwotCX0gZWxzZSBpZiAobCA9PSA4KSB7Ci0JCXYgPSAodW5zaWduZWQpICgqYnMtPmN1cisrKSA8PCAoYnMtPmJpdCArIDI0KTsKLQkJYnMtPmJpdCA9IDA7Ci0JfSBlbHNlIHsKLQkJZm9yIChieXRlcyA9IGwgPj4gMywgc2hpZnQgPSAyNCwgdiA9IDA7IGJ5dGVzOwotCQkgICAgIGJ5dGVzLS0sIHNoaWZ0IC09IDgpCi0JCQl2IHw9ICh1bnNpZ25lZCkgKCpicy0+Y3VyKyspIDw8IHNoaWZ0OwotCi0JCWlmIChsIDwgMzIpIHsKLQkJCXYgfD0gKHVuc2lnbmVkKSAoKmJzLT5jdXIpIDw8IHNoaWZ0OwotCQkJdiA8PD0gYnMtPmJpdDsKLQkJfSBlbHNlIGlmIChsID4gMzIpIHsKLQkJCXYgPDw9IGJzLT5iaXQ7Ci0JCQl2IHw9ICgqYnMtPmN1cikgPj4gKDggLSBicy0+Yml0KTsKLQkJfQotCi0JCWJzLT5iaXQgPSBsICYgMHg3OwotCX0KLQotCXYgJj0gMHhmZmZmZmZmZiA8PCAoMzIgLSBiKTsKLQotCXJldHVybiB2OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQXNzdW1lIGJzIGlzIGFsaWduZWQgYW5kIHNpemVvZih1bnNpZ25lZCBpbnQpID09IDQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgZ2V0X3VpbnQoYml0c3RyX3QgKiBicywgaW50IGIpCi17Ci0JdW5zaWduZWQgdiA9IDA7Ci0KLQlzd2l0Y2ggKGIpIHsKLQljYXNlIDQ6Ci0JCXYgfD0gKmJzLT5jdXIrKzsKLQkJdiA8PD0gODsKLQljYXNlIDM6Ci0JCXYgfD0gKmJzLT5jdXIrKzsKLQkJdiA8PD0gODsKLQljYXNlIDI6Ci0JCXYgfD0gKmJzLT5jdXIrKzsKLQkJdiA8PD0gODsKLQljYXNlIDE6Ci0JCXYgfD0gKmJzLT5jdXIrKzsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBkZWNvZGVfbnVsKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCi17Ci0JUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKLQotCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGRlY29kZV9ib29sKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCi17Ci0JUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKLQotCUlOQ19CSVQoYnMpOwotCi0JQ0hFQ0tfQk9VTkQoYnMsIDApOwotCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGRlY29kZV9vaWQoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCkKLXsKLQlpbnQgbGVuOwotCi0JUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKLQotCUJZVEVfQUxJR04oYnMpOwotCUNIRUNLX0JPVU5EKGJzLCAxKTsKLQlsZW4gPSAqYnMtPmN1cisrOwotCWJzLT5jdXIgKz0gbGVuOwotCi0JQ0hFQ0tfQk9VTkQoYnMsIDApOwotCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGRlY29kZV9pbnQoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCkKLXsKLQl1bnNpZ25lZCBsZW47Ci0KLQlQUklOVCgiJSoucyVzIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKLQotCXN3aXRjaCAoZi0+c3opIHsKLQljYXNlIEJZVEU6CQkvKiBSYW5nZSA9PSAyNTYgKi8KLQkJQllURV9BTElHTihicyk7Ci0JCWJzLT5jdXIrKzsKLQkJYnJlYWs7Ci0JY2FzZSBXT1JEOgkJLyogMjU3IDw9IFJhbmdlIDw9IDY0SyAqLwotCQlCWVRFX0FMSUdOKGJzKTsKLQkJYnMtPmN1ciArPSAyOwotCQlicmVhazsKLQljYXNlIENPTlM6CQkvKiA2NEsgPCBSYW5nZSA8IDRHICovCi0JCWxlbiA9IGdldF9iaXRzKGJzLCAyKSArIDE7Ci0JCUJZVEVfQUxJR04oYnMpOwotCQlpZiAoYmFzZSAmJiAoZi0+YXR0ciAmIERFQ09ERSkpIHsJLyogdGltZVRvTGl2ZSAqLwotCQkJdW5zaWduZWQgdiA9IGdldF91aW50KGJzLCBsZW4pICsgZi0+bGI7Ci0JCQlQUklOVCgiID0gJXUiLCB2KTsKLQkJCSooKHVuc2lnbmVkICopIChiYXNlICsgZi0+b2Zmc2V0KSkgPSB2OwotCQl9Ci0JCWJzLT5jdXIgKz0gbGVuOwotCQlicmVhazsKLQljYXNlIFVOQ086Ci0JCUJZVEVfQUxJR04oYnMpOwotCQlDSEVDS19CT1VORChicywgMik7Ci0JCWxlbiA9IGdldF9sZW4oYnMpOwotCQlicy0+Y3VyICs9IGxlbjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoJCS8qIDIgPD0gUmFuZ2UgPD0gMjU1ICovCi0JCUlOQ19CSVRTKGJzLCBmLT5zeik7Ci0JCWJyZWFrOwotCX0KLQotCVBSSU5UKCJcbiIpOwotCi0JQ0hFQ0tfQk9VTkQoYnMsIDApOwotCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGRlY29kZV9lbnVtKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCi17Ci0JUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKLQotCWlmICgoZi0+YXR0ciAmIEVYVCkgJiYgZ2V0X2JpdChicykpIHsKLQkJSU5DX0JJVFMoYnMsIDcpOwotCX0gZWxzZSB7Ci0JCUlOQ19CSVRTKGJzLCBmLT5zeik7Ci0JfQotCi0JQ0hFQ0tfQk9VTkQoYnMsIDApOwotCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGRlY29kZV9iaXRzdHIoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCkKLXsKLQl1bnNpZ25lZCBsZW47Ci0KLQlQUklOVCgiJSoucyVzXG4iLCBsZXZlbCAqIFRBQl9TSVpFLCAiICIsIGYtPm5hbWUpOwotCi0JQllURV9BTElHTihicyk7Ci0Jc3dpdGNoIChmLT5zeikgewotCWNhc2UgRklYRDoJCS8qIGZpeGVkIGxlbmd0aCA+IDE2ICovCi0JCWxlbiA9IGYtPmxiOwotCQlicmVhazsKLQljYXNlIFdPUkQ6CQkvKiAyLWJ5dGUgbGVuZ3RoICovCi0JCUNIRUNLX0JPVU5EKGJzLCAyKTsKLQkJbGVuID0gKCpicy0+Y3VyKyspIDw8IDg7Ci0JCWxlbiArPSAoKmJzLT5jdXIrKykgKyBmLT5sYjsKLQkJYnJlYWs7Ci0JY2FzZSBTRU1JOgotCQlDSEVDS19CT1VORChicywgMik7Ci0JCWxlbiA9IGdldF9sZW4oYnMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSAwOwotCQlicmVhazsKLQl9Ci0KLQlicy0+Y3VyICs9IGxlbiA+PiAzOwotCWJzLT5iaXQgPSBsZW4gJiA3OwotCi0JQ0hFQ0tfQk9VTkQoYnMsIDApOwotCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGRlY29kZV9udW1zdHIoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCkKLXsKLQl1bnNpZ25lZCBsZW47Ci0KLQlQUklOVCgiJSoucyVzXG4iLCBsZXZlbCAqIFRBQl9TSVpFLCAiICIsIGYtPm5hbWUpOwotCi0JLyogMiA8PSBSYW5nZSA8PSAyNTUgKi8KLQlsZW4gPSBnZXRfYml0cyhicywgZi0+c3opICsgZi0+bGI7Ci0KLQlCWVRFX0FMSUdOKGJzKTsKLQlJTkNfQklUUyhicywgKGxlbiA8PCAyKSk7Ci0KLQlDSEVDS19CT1VORChicywgMCk7Ci0JcmV0dXJuIEgzMjNfRVJST1JfTk9ORTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZGVjb2RlX29jdHN0cihiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKQotewotCXVuc2lnbmVkIGxlbjsKLQotCVBSSU5UKCIlKi5zJXMiLCBsZXZlbCAqIFRBQl9TSVpFLCAiICIsIGYtPm5hbWUpOwotCi0Jc3dpdGNoIChmLT5zeikgewotCWNhc2UgRklYRDoJCS8qIFJhbmdlID09IDEgKi8KLQkJaWYgKGYtPmxiID4gMikgewotCQkJQllURV9BTElHTihicyk7Ci0JCQlpZiAoYmFzZSAmJiAoZi0+YXR0ciAmIERFQ09ERSkpIHsKLQkJCQkvKiBUaGUgSVAgQWRkcmVzcyAqLwotCQkJCUlGVEhFTihmLT5sYiA9PSA0LAotCQkJCSAgICAgICBQUklOVCgiID0gJWQuJWQuJWQuJWQ6JWQiLAotCQkJCQkgICAgIGJzLT5jdXJbMF0sIGJzLT5jdXJbMV0sCi0JCQkJCSAgICAgYnMtPmN1clsyXSwgYnMtPmN1clszXSwKLQkJCQkJICAgICBicy0+Y3VyWzRdICogMjU2ICsgYnMtPmN1cls1XSkpOwotCQkJCSooKHVuc2lnbmVkICopIChiYXNlICsgZi0+b2Zmc2V0KSkgPQotCQkJCSAgICBicy0+Y3VyIC0gYnMtPmJ1ZjsKLQkJCX0KLQkJfQotCQlsZW4gPSBmLT5sYjsKLQkJYnJlYWs7Ci0JY2FzZSBCWVRFOgkJLyogUmFuZ2UgPT0gMjU2ICovCi0JCUJZVEVfQUxJR04oYnMpOwotCQlDSEVDS19CT1VORChicywgMSk7Ci0JCWxlbiA9ICgqYnMtPmN1cisrKSArIGYtPmxiOwotCQlicmVhazsKLQljYXNlIFNFTUk6Ci0JCUJZVEVfQUxJR04oYnMpOwotCQlDSEVDS19CT1VORChicywgMik7Ci0JCWxlbiA9IGdldF9sZW4oYnMpICsgZi0+bGI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CQkvKiAyIDw9IFJhbmdlIDw9IDI1NSAqLwotCQlsZW4gPSBnZXRfYml0cyhicywgZi0+c3opICsgZi0+bGI7Ci0JCUJZVEVfQUxJR04oYnMpOwotCQlicmVhazsKLQl9Ci0KLQlicy0+Y3VyICs9IGxlbjsKLQotCVBSSU5UKCJcbiIpOwotCi0JQ0hFQ0tfQk9VTkQoYnMsIDApOwotCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGRlY29kZV9ibXBzdHIoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCkKLXsKLQl1bnNpZ25lZCBsZW47Ci0KLQlQUklOVCgiJSoucyVzXG4iLCBsZXZlbCAqIFRBQl9TSVpFLCAiICIsIGYtPm5hbWUpOwotCi0Jc3dpdGNoIChmLT5zeikgewotCWNhc2UgQllURToJCS8qIFJhbmdlID09IDI1NiAqLwotCQlCWVRFX0FMSUdOKGJzKTsKLQkJQ0hFQ0tfQk9VTkQoYnMsIDEpOwotCQlsZW4gPSAoKmJzLT5jdXIrKykgKyBmLT5sYjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoJCS8qIDIgPD0gUmFuZ2UgPD0gMjU1ICovCi0JCWxlbiA9IGdldF9iaXRzKGJzLCBmLT5zeikgKyBmLT5sYjsKLQkJQllURV9BTElHTihicyk7Ci0JCWJyZWFrOwotCX0KLQotCWJzLT5jdXIgKz0gbGVuIDw8IDE7Ci0KLQlDSEVDS19CT1VORChicywgMCk7Ci0JcmV0dXJuIEgzMjNfRVJST1JfTk9ORTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZGVjb2RlX3NlcShiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKQotewotCXVuc2lnbmVkIGV4dCwgYm1wLCBpLCBvcHQsIGxlbiA9IDAsIGJtcDIsIGJtcDJfbGVuOwotCWludCBlcnI7Ci0JZmllbGRfdCAqc29uOwotCXVuc2lnbmVkIGNoYXIgKmJlZyA9IE5VTEw7Ci0KLQlQUklOVCgiJSoucyVzXG4iLCBsZXZlbCAqIFRBQl9TSVpFLCAiICIsIGYtPm5hbWUpOwotCi0JLyogRGVjb2RlPyAqLwotCWJhc2UgPSAoYmFzZSAmJiAoZi0+YXR0ciAmIERFQ09ERSkpID8gYmFzZSArIGYtPm9mZnNldCA6IE5VTEw7Ci0KLQkvKiBFeHRlbnNpYmxlPyAqLwotCWV4dCA9IChmLT5hdHRyICYgRVhUKSA/IGdldF9iaXQoYnMpIDogMDsKLQotCS8qIEdldCBmaWVsZHMgYml0bWFwICovCi0JYm1wID0gZ2V0X2JpdG1hcChicywgZi0+c3opOwotCWlmIChiYXNlKQotCQkqKHVuc2lnbmVkICopIGJhc2UgPSBibXA7Ci0KLQkvKiBEZWNvZGUgdGhlIHJvb3QgY29tcG9uZW50cyAqLwotCWZvciAoaSA9IG9wdCA9IDAsIHNvbiA9IGYtPmZpZWxkczsgaSA8IGYtPmxiOyBpKyssIHNvbisrKSB7Ci0JCWlmIChzb24tPmF0dHIgJiBTVE9QKSB7Ci0JCQlQUklOVCgiJSoucyVzXG4iLCAobGV2ZWwgKyAxKSAqIFRBQl9TSVpFLCAiICIsCi0JCQkgICAgICBzb24tPm5hbWUpOwotCQkJcmV0dXJuIEgzMjNfRVJST1JfU1RPUDsKLQkJfQotCi0JCWlmIChzb24tPmF0dHIgJiBPUFQpIHsJLyogT3B0aW9uYWwgY29tcG9uZW50ICovCi0JCQlpZiAoISgoMHg4MDAwMDAwMFUgPj4gKG9wdCsrKSkgJiBibXApKQkvKiBOb3QgZXhpc3QgKi8KLQkJCQljb250aW51ZTsKLQkJfQotCi0JCS8qIERlY29kZSAqLwotCQlpZiAoc29uLT5hdHRyICYgT1BFTikgewkvKiBPcGVuIGZpZWxkICovCi0JCQlDSEVDS19CT1VORChicywgMik7Ci0JCQlsZW4gPSBnZXRfbGVuKGJzKTsKLQkJCUNIRUNLX0JPVU5EKGJzLCBsZW4pOwotCQkJaWYgKCFiYXNlKSB7Ci0JCQkJUFJJTlQoIiUqLnMlc1xuIiwgKGxldmVsICsgMSkgKiBUQUJfU0laRSwKLQkJCQkgICAgICAiICIsIHNvbi0+bmFtZSk7Ci0JCQkJYnMtPmN1ciArPSBsZW47Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQliZWcgPSBicy0+Y3VyOwotCi0JCQkvKiBEZWNvZGUgKi8KLQkJCWlmICgoZXJyID0gKERlY29kZXJzW3Nvbi0+dHlwZV0pIChicywgc29uLCBiYXNlLAotCQkJCQkJCSAgbGV2ZWwgKyAxKSkgPAotCQkJICAgIEgzMjNfRVJST1JfTk9ORSkKLQkJCQlyZXR1cm4gZXJyOwotCi0JCQlicy0+Y3VyID0gYmVnICsgbGVuOwotCQkJYnMtPmJpdCA9IDA7Ci0JCX0gZWxzZSBpZiAoKGVyciA9IChEZWNvZGVyc1tzb24tPnR5cGVdKSAoYnMsIHNvbiwgYmFzZSwKLQkJCQkJCQkgbGV2ZWwgKyAxKSkgPAotCQkJICAgSDMyM19FUlJPUl9OT05FKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQkvKiBObyBleHRlbnNpb24/ICovCi0JaWYgKCFleHQpCi0JCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci0KLQkvKiBHZXQgdGhlIGV4dGVuc2lvbiBiaXRtYXAgKi8KLQlibXAyX2xlbiA9IGdldF9iaXRzKGJzLCA3KSArIDE7Ci0JQ0hFQ0tfQk9VTkQoYnMsIChibXAyX2xlbiArIDcpID4+IDMpOwotCWJtcDIgPSBnZXRfYml0bWFwKGJzLCBibXAyX2xlbik7Ci0JYm1wIHw9IGJtcDIgPj4gZi0+c3o7Ci0JaWYgKGJhc2UpCi0JCSoodW5zaWduZWQgKikgYmFzZSA9IGJtcDsKLQlCWVRFX0FMSUdOKGJzKTsKLQotCS8qIERlY29kZSB0aGUgZXh0ZW5zaW9uIGNvbXBvbmVudHMgKi8KLQlmb3IgKG9wdCA9IDA7IG9wdCA8IGJtcDJfbGVuOyBvcHQrKywgaSsrLCBzb24rKykgewotCQlpZiAoaSA8IGYtPnViICYmIHNvbi0+YXR0ciAmIFNUT1ApIHsKLQkJCVBSSU5UKCIlKi5zJXNcbiIsIChsZXZlbCArIDEpICogVEFCX1NJWkUsICIgIiwKLQkJCSAgICAgIHNvbi0+bmFtZSk7Ci0JCQlyZXR1cm4gSDMyM19FUlJPUl9TVE9QOwotCQl9Ci0KLQkJaWYgKCEoKDB4ODAwMDAwMDAgPj4gb3B0KSAmIGJtcDIpKQkvKiBOb3QgcHJlc2VudCAqLwotCQkJY29udGludWU7Ci0KLQkJLyogQ2hlY2sgUmFuZ2UgKi8KLQkJaWYgKGkgPj0gZi0+dWIpIHsJLyogTmV3ZXIgVmVyc2lvbj8gKi8KLQkJCUNIRUNLX0JPVU5EKGJzLCAyKTsKLQkJCWxlbiA9IGdldF9sZW4oYnMpOwotCQkJQ0hFQ0tfQk9VTkQoYnMsIGxlbik7Ci0JCQlicy0+Y3VyICs9IGxlbjsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJQ0hFQ0tfQk9VTkQoYnMsIDIpOwotCQlsZW4gPSBnZXRfbGVuKGJzKTsKLQkJQ0hFQ0tfQk9VTkQoYnMsIGxlbik7Ci0JCWlmICghYmFzZSB8fCAhKHNvbi0+YXR0ciAmIERFQ09ERSkpIHsKLQkJCVBSSU5UKCIlKi5zJXNcbiIsIChsZXZlbCArIDEpICogVEFCX1NJWkUsICIgIiwKLQkJCSAgICAgIHNvbi0+bmFtZSk7Ci0JCQlicy0+Y3VyICs9IGxlbjsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJlZyA9IGJzLT5jdXI7Ci0KLQkJaWYgKChlcnIgPSAoRGVjb2RlcnNbc29uLT50eXBlXSkgKGJzLCBzb24sIGJhc2UsCi0JCQkJCQkgIGxldmVsICsgMSkpIDwKLQkJICAgIEgzMjNfRVJST1JfTk9ORSkKLQkJCXJldHVybiBlcnI7Ci0KLQkJYnMtPmN1ciA9IGJlZyArIGxlbjsKLQkJYnMtPmJpdCA9IDA7Ci0JfQotCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGRlY29kZV9zZXFvZihiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKQotewotCXVuc2lnbmVkIGNvdW50LCBlZmZlY3RpdmVfY291bnQgPSAwLCBpLCBsZW4gPSAwOwotCWludCBlcnI7Ci0JZmllbGRfdCAqc29uOwotCXVuc2lnbmVkIGNoYXIgKmJlZyA9IE5VTEw7Ci0KLQlQUklOVCgiJSoucyVzXG4iLCBsZXZlbCAqIFRBQl9TSVpFLCAiICIsIGYtPm5hbWUpOwotCi0JLyogRGVjb2RlPyAqLwotCWJhc2UgPSAoYmFzZSAmJiAoZi0+YXR0ciAmIERFQ09ERSkpID8gYmFzZSArIGYtPm9mZnNldCA6IE5VTEw7Ci0KLQkvKiBEZWNvZGUgaXRlbSBjb3VudCAqLwotCXN3aXRjaCAoZi0+c3opIHsKLQljYXNlIEJZVEU6Ci0JCUJZVEVfQUxJR04oYnMpOwotCQlDSEVDS19CT1VORChicywgMSk7Ci0JCWNvdW50ID0gKmJzLT5jdXIrKzsKLQkJYnJlYWs7Ci0JY2FzZSBXT1JEOgotCQlCWVRFX0FMSUdOKGJzKTsKLQkJQ0hFQ0tfQk9VTkQoYnMsIDIpOwotCQljb3VudCA9ICpicy0+Y3VyKys7Ci0JCWNvdW50IDw8PSA4OwotCQljb3VudCA9ICpicy0+Y3VyKys7Ci0JCWJyZWFrOwotCWNhc2UgU0VNSToKLQkJQllURV9BTElHTihicyk7Ci0JCUNIRUNLX0JPVU5EKGJzLCAyKTsKLQkJY291bnQgPSBnZXRfbGVuKGJzKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJY291bnQgPSBnZXRfYml0cyhicywgZi0+c3opOwotCQlicmVhazsKLQl9Ci0JY291bnQgKz0gZi0+bGI7Ci0KLQkvKiBXcml0ZSBDb3VudCAqLwotCWlmIChiYXNlKSB7Ci0JCWVmZmVjdGl2ZV9jb3VudCA9IGNvdW50ID4gZi0+dWIgPyBmLT51YiA6IGNvdW50OwotCQkqKHVuc2lnbmVkICopIGJhc2UgPSBlZmZlY3RpdmVfY291bnQ7Ci0JCWJhc2UgKz0gc2l6ZW9mKHVuc2lnbmVkKTsKLQl9Ci0KLQkvKiBEZWNvZGUgbmVzdGVkIGZpZWxkICovCi0Jc29uID0gZi0+ZmllbGRzOwotCWlmIChiYXNlKQotCQliYXNlIC09IHNvbi0+b2Zmc2V0OwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmIChzb24tPmF0dHIgJiBPUEVOKSB7Ci0JCQlCWVRFX0FMSUdOKGJzKTsKLQkJCWxlbiA9IGdldF9sZW4oYnMpOwotCQkJQ0hFQ0tfQk9VTkQoYnMsIGxlbik7Ci0JCQlpZiAoIWJhc2UgfHwgIShzb24tPmF0dHIgJiBERUNPREUpKSB7Ci0JCQkJUFJJTlQoIiUqLnMlc1xuIiwgKGxldmVsICsgMSkgKiBUQUJfU0laRSwKLQkJCQkgICAgICAiICIsIHNvbi0+bmFtZSk7Ci0JCQkJYnMtPmN1ciArPSBsZW47Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQliZWcgPSBicy0+Y3VyOwotCi0JCQlpZiAoKGVyciA9IChEZWNvZGVyc1tzb24tPnR5cGVdKSAoYnMsIHNvbiwKLQkJCQkJCQkgIGkgPAotCQkJCQkJCSAgZWZmZWN0aXZlX2NvdW50ID8KLQkJCQkJCQkgIGJhc2UgOiBOVUxMLAotCQkJCQkJCSAgbGV2ZWwgKyAxKSkgPAotCQkJICAgIEgzMjNfRVJST1JfTk9ORSkKLQkJCQlyZXR1cm4gZXJyOwotCi0JCQlicy0+Y3VyID0gYmVnICsgbGVuOwotCQkJYnMtPmJpdCA9IDA7Ci0JCX0gZWxzZQotCQkJaWYgKChlcnIgPSAoRGVjb2RlcnNbc29uLT50eXBlXSkgKGJzLCBzb24sCi0JCQkJCQkJICBpIDwKLQkJCQkJCQkgIGVmZmVjdGl2ZV9jb3VudCA/Ci0JCQkJCQkJICBiYXNlIDogTlVMTCwKLQkJCQkJCQkgIGxldmVsICsgMSkpIDwKLQkJCSAgICBIMzIzX0VSUk9SX05PTkUpCi0JCQkJcmV0dXJuIGVycjsKLQotCQlpZiAoYmFzZSkKLQkJCWJhc2UgKz0gc29uLT5vZmZzZXQ7Ci0JfQotCi0JcmV0dXJuIEgzMjNfRVJST1JfTk9ORTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBkZWNvZGVfY2hvaWNlKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCi17Ci0JdW5zaWduZWQgdHlwZSwgZXh0LCBsZW4gPSAwOwotCWludCBlcnI7Ci0JZmllbGRfdCAqc29uOwotCXVuc2lnbmVkIGNoYXIgKmJlZyA9IE5VTEw7Ci0KLQlQUklOVCgiJSoucyVzXG4iLCBsZXZlbCAqIFRBQl9TSVpFLCAiICIsIGYtPm5hbWUpOwotCi0JLyogRGVjb2RlPyAqLwotCWJhc2UgPSAoYmFzZSAmJiAoZi0+YXR0ciAmIERFQ09ERSkpID8gYmFzZSArIGYtPm9mZnNldCA6IE5VTEw7Ci0KLQkvKiBEZWNvZGUgdGhlIGNob2ljZSBpbmRleCBudW1iZXIgKi8KLQlpZiAoKGYtPmF0dHIgJiBFWFQpICYmIGdldF9iaXQoYnMpKSB7Ci0JCWV4dCA9IDE7Ci0JCXR5cGUgPSBnZXRfYml0cyhicywgNykgKyBmLT5sYjsKLQl9IGVsc2UgewotCQlleHQgPSAwOwotCQl0eXBlID0gZ2V0X2JpdHMoYnMsIGYtPnN6KTsKLQl9Ci0KLQkvKiBXcml0ZSBUeXBlICovCi0JaWYgKGJhc2UpCi0JCSoodW5zaWduZWQgKikgYmFzZSA9IHR5cGU7Ci0KLQkvKiBDaGVjayBSYW5nZSAqLwotCWlmICh0eXBlID49IGYtPnViKSB7CS8qIE5ld2VyIHZlcnNpb24/ICovCi0JCUJZVEVfQUxJR04oYnMpOwotCQlsZW4gPSBnZXRfbGVuKGJzKTsKLQkJQ0hFQ0tfQk9VTkQoYnMsIGxlbik7Ci0JCWJzLT5jdXIgKz0gbGVuOwotCQlyZXR1cm4gSDMyM19FUlJPUl9OT05FOwotCX0KLQotCS8qIFRyYW5zZmVyIHRvIHNvbiBsZXZlbCAqLwotCXNvbiA9ICZmLT5maWVsZHNbdHlwZV07Ci0JaWYgKHNvbi0+YXR0ciAmIFNUT1ApIHsKLQkJUFJJTlQoIiUqLnMlc1xuIiwgKGxldmVsICsgMSkgKiBUQUJfU0laRSwgIiAiLCBzb24tPm5hbWUpOwotCQlyZXR1cm4gSDMyM19FUlJPUl9TVE9QOwotCX0KLQotCWlmIChleHQgfHwgKHNvbi0+YXR0ciAmIE9QRU4pKSB7Ci0JCUJZVEVfQUxJR04oYnMpOwotCQlsZW4gPSBnZXRfbGVuKGJzKTsKLQkJQ0hFQ0tfQk9VTkQoYnMsIGxlbik7Ci0JCWlmICghYmFzZSB8fCAhKHNvbi0+YXR0ciAmIERFQ09ERSkpIHsKLQkJCVBSSU5UKCIlKi5zJXNcbiIsIChsZXZlbCArIDEpICogVEFCX1NJWkUsICIgIiwKLQkJCSAgICAgIHNvbi0+bmFtZSk7Ci0JCQlicy0+Y3VyICs9IGxlbjsKLQkJCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Ci0JCX0KLQkJYmVnID0gYnMtPmN1cjsKLQotCQlpZiAoKGVyciA9IChEZWNvZGVyc1tzb24tPnR5cGVdKSAoYnMsIHNvbiwgYmFzZSwgbGV2ZWwgKyAxKSkgPAotCQkgICAgSDMyM19FUlJPUl9OT05FKQotCQkJcmV0dXJuIGVycjsKLQotCQlicy0+Y3VyID0gYmVnICsgbGVuOwotCQlicy0+Yml0ID0gMDsKLQl9IGVsc2UgaWYgKChlcnIgPSAoRGVjb2RlcnNbc29uLT50eXBlXSkgKGJzLCBzb24sIGJhc2UsIGxldmVsICsgMSkpIDwKLQkJICAgSDMyM19FUlJPUl9OT05FKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIEgzMjNfRVJST1JfTk9ORTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRGVjb2RlUmFzTWVzc2FnZSh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBzeiwgUmFzTWVzc2FnZSAqIHJhcykKLXsKLQlzdGF0aWMgZmllbGRfdCByYXNfbWVzc2FnZSA9IHsKLQkJRk5BTUUoIlJhc01lc3NhZ2UiKSBDSE9JQ0UsIDUsIDI0LCAzMiwgREVDT0RFIHwgRVhULAotCQkwLCBfUmFzTWVzc2FnZQotCX07Ci0JYml0c3RyX3QgYnM7Ci0KLQlicy5idWYgPSBicy5iZWcgPSBicy5jdXIgPSBidWY7Ci0JYnMuZW5kID0gYnVmICsgc3o7Ci0JYnMuYml0ID0gMDsKLQotCXJldHVybiBkZWNvZGVfY2hvaWNlKCZicywgJnJhc19tZXNzYWdlLCAoY2hhciAqKSByYXMsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgRGVjb2RlSDMyM19Vc2VySW5mb3JtYXRpb24odW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBjaGFyICpiZWcsCi0JCQkJICAgICAgc2l6ZV90IHN6LCBIMzIzX1VzZXJJbmZvcm1hdGlvbiAqIHV1aWUpCi17Ci0Jc3RhdGljIGZpZWxkX3QgaDMyM191c2VyaW5mb3JtYXRpb24gPSB7Ci0JCUZOQU1FKCJIMzIzLVVzZXJJbmZvcm1hdGlvbiIpIFNFUSwgMSwgMiwgMiwgREVDT0RFIHwgRVhULAotCQkwLCBfSDMyM19Vc2VySW5mb3JtYXRpb24KLQl9OwotCWJpdHN0cl90IGJzOwotCi0JYnMuYnVmID0gYnVmOwotCWJzLmJlZyA9IGJzLmN1ciA9IGJlZzsKLQlicy5lbmQgPSBiZWcgKyBzejsKLQlicy5iaXQgPSAwOwotCi0JcmV0dXJuIGRlY29kZV9zZXEoJmJzLCAmaDMyM191c2VyaW5mb3JtYXRpb24sIChjaGFyICopIHV1aWUsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBEZWNvZGVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3Qgc3osCi0JCQkJCSBNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UgKgotCQkJCQkgbXNjbSkKLXsKLQlzdGF0aWMgZmllbGRfdCBtdWx0aW1lZGlhc3lzdGVtY29udHJvbG1lc3NhZ2UgPSB7Ci0JCUZOQU1FKCJNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UiKSBDSE9JQ0UsIDIsIDQsIDQsCi0JCURFQ09ERSB8IEVYVCwgMCwgX011bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZQotCX07Ci0JYml0c3RyX3QgYnM7Ci0KLQlicy5idWYgPSBicy5iZWcgPSBicy5jdXIgPSBidWY7Ci0JYnMuZW5kID0gYnVmICsgc3o7Ci0JYnMuYml0ID0gMDsKLQotCXJldHVybiBkZWNvZGVfY2hvaWNlKCZicywgJm11bHRpbWVkaWFzeXN0ZW1jb250cm9sbWVzc2FnZSwKLQkJCSAgICAgKGNoYXIgKikgbXNjbSwgMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IERlY29kZVE5MzEodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3Qgc3osIFE5MzEgKiBxOTMxKQotewotCXVuc2lnbmVkIGNoYXIgKnAgPSBidWY7Ci0JaW50IGxlbjsKLQotCWlmICghcCB8fCBzeiA8IDEpCi0JCXJldHVybiBIMzIzX0VSUk9SX0JPVU5EOwotCi0JLyogUHJvdG9jb2wgRGlzY3JpbWluYXRvciAqLwotCWlmICgqcCAhPSAweDA4KSB7Ci0JCVBSSU5UKCJVbmtub3duIFByb3RvY29sIERpc2NyaW1pbmF0b3JcbiIpOwotCQlyZXR1cm4gSDMyM19FUlJPUl9SQU5HRTsKLQl9Ci0JcCsrOwotCXN6LS07Ci0KLQkvKiBDYWxsUmVmZXJlbmNlVmFsdWUgKi8KLQlpZiAoc3ogPCAxKQotCQlyZXR1cm4gSDMyM19FUlJPUl9CT1VORDsKLQlsZW4gPSAqcCsrOwotCXN6LS07Ci0JaWYgKHN6IDwgbGVuKQotCQlyZXR1cm4gSDMyM19FUlJPUl9CT1VORDsKLQlwICs9IGxlbjsKLQlzeiAtPSBsZW47Ci0KLQkvKiBNZXNzYWdlIFR5cGUgKi8KLQlpZiAoc3ogPCAxKQotCQlyZXR1cm4gSDMyM19FUlJPUl9CT1VORDsKLQlxOTMxLT5NZXNzYWdlVHlwZSA9ICpwKys7Ci0JUFJJTlQoIk1lc3NhZ2VUeXBlID0gJTAyWFxuIiwgcTkzMS0+TWVzc2FnZVR5cGUpOwotCWlmICgqcCAmIDB4ODApIHsKLQkJcCsrOwotCQlzei0tOwotCX0KLQotCS8qIERlY29kZSBJbmZvcm1hdGlvbiBFbGVtZW50cyAqLwotCXdoaWxlIChzeiA+IDApIHsKLQkJaWYgKCpwID09IDB4N2UpIHsJLyogVXNlclVzZXJJRSAqLwotCQkJaWYgKHN6IDwgMykKLQkJCQlicmVhazsKLQkJCXArKzsKLQkJCWxlbiA9ICpwKysgPDwgODsKLQkJCWxlbiB8PSAqcCsrOwotCQkJc3ogLT0gMzsKLQkJCWlmIChzeiA8IGxlbikKLQkJCQlicmVhazsKLQkJCXArKzsKLQkJCWxlbi0tOwotCQkJcmV0dXJuIERlY29kZUgzMjNfVXNlckluZm9ybWF0aW9uKGJ1ZiwgcCwgbGVuLAotCQkJCQkJCSAgJnE5MzEtPlVVSUUpOwotCQl9Ci0JCXArKzsKLQkJc3otLTsKLQkJaWYgKHN6IDwgMSkKLQkJCWJyZWFrOwotCQlsZW4gPSAqcCsrOwotCQlpZiAoc3ogPCBsZW4pCi0JCQlicmVhazsKLQkJcCArPSBsZW47Ci0JCXN6IC09IGxlbjsKLQl9Ci0KLQlQUklOVCgiUS45MzEgVVVJRSBub3QgZm91bmRcbiIpOwotCi0JcmV0dXJuIEgzMjNfRVJST1JfQk9VTkQ7Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX3R5cGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzX3R5cGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzU5NjEuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfaDMyM190eXBlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyNiArMCwwIEBACi0vKiBHZW5lcmF0ZWQgYnkgSmluZyBNaW4gWmhhbydzIEFTTi4xIHBhcnNlciwgQXByIDIwIDIwMDYKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgotICoKLSAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotc3RhdGljIGZpZWxkX3QgX1RyYW5zcG9ydEFkZHJlc3NfaXBBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJpcCIpIE9DVFNUUiwgRklYRCwgNCwgMCwgREVDT0RFLAotCSBvZmZzZXRvZihUcmFuc3BvcnRBZGRyZXNzX2lwQWRkcmVzcywgaXApLCBOVUxMfSwKLQl7Rk5BTUUoInBvcnQiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1RyYW5zcG9ydEFkZHJlc3NfaXBTb3VyY2VSb3V0ZV9yb3V0ZVtdID0gewkvKiBTRVFVRU5DRSBPRiAqLwotCXtGTkFNRSgiaXRlbSIpIE9DVFNUUiwgRklYRCwgNCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVHJhbnNwb3J0QWRkcmVzc19pcFNvdXJjZVJvdXRlX3JvdXRpbmdbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJzdHJpY3QiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibG9vc2UiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1RyYW5zcG9ydEFkZHJlc3NfaXBTb3VyY2VSb3V0ZVtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiaXAiKSBPQ1RTVFIsIEZJWEQsIDQsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicG9ydCIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyb3V0ZSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLAotCSBfVHJhbnNwb3J0QWRkcmVzc19pcFNvdXJjZVJvdXRlX3JvdXRlfSwKLQl7Rk5BTUUoInJvdXRpbmciKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCi0JIF9UcmFuc3BvcnRBZGRyZXNzX2lwU291cmNlUm91dGVfcm91dGluZ30sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVHJhbnNwb3J0QWRkcmVzc19pcHhBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub2RlIikgT0NUU1RSLCBGSVhELCA2LCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm5ldG51bSIpIE9DVFNUUiwgRklYRCwgNCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwb3J0IikgT0NUU1RSLCBGSVhELCAyLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9UcmFuc3BvcnRBZGRyZXNzX2lwNkFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImlwIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwb3J0IikgSU5ULCBXT1JELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMjIxTm9uU3RhbmRhcmRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInQzNUNvdW50cnlDb2RlIikgSU5ULCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInQzNUV4dGVuc2lvbiIpIElOVCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtYW51ZmFjdHVyZXJDb2RlIikgSU5ULCBXT1JELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9Ob25TdGFuZGFyZElkZW50aWZpZXJbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJvYmplY3QiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiaDIyMU5vblN0YW5kYXJkIikgU0VRLCAwLCAzLCAzLCBTS0lQIHwgRVhULCAwLAotCSBfSDIyMU5vblN0YW5kYXJkfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9Ob25TdGFuZGFyZFBhcmFtZXRlcltdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmRJZGVudGlmaWVyIikgQ0hPSUNFLCAxLCAyLCAyLCBTS0lQIHwgRVhULCAwLAotCSBfTm9uU3RhbmRhcmRJZGVudGlmaWVyfSwKLQl7Rk5BTUUoImRhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1RyYW5zcG9ydEFkZHJlc3NbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJpcEFkZHJlc3MiKSBTRVEsIDAsIDIsIDIsIERFQ09ERSwKLQkgb2Zmc2V0b2YoVHJhbnNwb3J0QWRkcmVzcywgaXBBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3NfaXBBZGRyZXNzfSwKLQl7Rk5BTUUoImlwU291cmNlUm91dGUiKSBTRVEsIDAsIDQsIDQsIFNLSVAgfCBFWFQsIDAsCi0JIF9UcmFuc3BvcnRBZGRyZXNzX2lwU291cmNlUm91dGV9LAotCXtGTkFNRSgiaXB4QWRkcmVzcyIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKLQkgX1RyYW5zcG9ydEFkZHJlc3NfaXB4QWRkcmVzc30sCi0Je0ZOQU1FKCJpcDZBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhULCAwLAotCSBfVHJhbnNwb3J0QWRkcmVzc19pcDZBZGRyZXNzfSwKLQl7Rk5BTUUoIm5ldEJpb3MiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm5zYXAiKSBPQ1RTVFIsIDUsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibm9uU3RhbmRhcmRBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLAotCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0FsaWFzQWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoImRpYWxlZERpZ2l0cyIpIE5VTURHVCwgNywgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJoMzIzLUlEIikgQk1QU1RSLCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInVybC1JRCIpIElBNVNUUiwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0cmFuc3BvcnRJRCIpIENIT0lDRSwgMywgNywgNywgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJlbWFpbC1JRCIpIElBNVNUUiwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwYXJ0eU51bWJlciIpIENIT0lDRSwgMywgNSwgNSwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtb2JpbGVVSU0iKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1NldHVwX1VVSUVfc291cmNlQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLwotCXtGTkFNRSgiaXRlbSIpIENIT0lDRSwgMSwgMiwgNywgU0tJUCB8IEVYVCwgMCwgX0FsaWFzQWRkcmVzc30sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVmVuZG9ySWRlbnRpZmllcltdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgidmVuZG9yIikgU0VRLCAwLCAzLCAzLCBTS0lQIHwgRVhULCAwLCBfSDIyMU5vblN0YW5kYXJkfSwKLQl7Rk5BTUUoInByb2R1Y3RJZCIpIE9DVFNUUiwgQllURSwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ2ZXJzaW9uSWQiKSBPQ1RTVFIsIEJZVEUsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0dhdGVrZWVwZXJJbmZvW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDMxMENhcHNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKLQkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImRhdGFSYXRlc1N1cHBvcnRlZCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN1cHBvcnRlZFByZWZpeGVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gzMjBDYXBzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJkYXRhUmF0ZXNTdXBwb3J0ZWQiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzdXBwb3J0ZWRQcmVmaXhlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMzIxQ2Fwc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgT1BULCAwLAotCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotCXtGTkFNRSgiZGF0YVJhdGVzU3VwcG9ydGVkIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic3VwcG9ydGVkUHJlZml4ZXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDMyMkNhcHNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKLQkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImRhdGFSYXRlc1N1cHBvcnRlZCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN1cHBvcnRlZFByZWZpeGVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gzMjNDYXBzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJkYXRhUmF0ZXNTdXBwb3J0ZWQiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzdXBwb3J0ZWRQcmVmaXhlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMzI0Q2Fwc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgT1BULCAwLAotCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotCXtGTkFNRSgiZGF0YVJhdGVzU3VwcG9ydGVkIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic3VwcG9ydGVkUHJlZml4ZXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVm9pY2VDYXBzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJkYXRhUmF0ZXNTdXBwb3J0ZWQiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzdXBwb3J0ZWRQcmVmaXhlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9UMTIwT25seUNhcHNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKLQkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImRhdGFSYXRlc1N1cHBvcnRlZCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN1cHBvcnRlZFByZWZpeGVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1N1cHBvcnRlZFByb3RvY29sc1tdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKLQkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImgzMTAiKSBTRVEsIDEsIDEsIDMsIFNLSVAgfCBFWFQsIDAsIF9IMzEwQ2Fwc30sCi0Je0ZOQU1FKCJoMzIwIikgU0VRLCAxLCAxLCAzLCBTS0lQIHwgRVhULCAwLCBfSDMyMENhcHN9LAotCXtGTkFNRSgiaDMyMSIpIFNFUSwgMSwgMSwgMywgU0tJUCB8IEVYVCwgMCwgX0gzMjFDYXBzfSwKLQl7Rk5BTUUoImgzMjIiKSBTRVEsIDEsIDEsIDMsIFNLSVAgfCBFWFQsIDAsIF9IMzIyQ2Fwc30sCi0Je0ZOQU1FKCJoMzIzIikgU0VRLCAxLCAxLCAzLCBTS0lQIHwgRVhULCAwLCBfSDMyM0NhcHN9LAotCXtGTkFNRSgiaDMyNCIpIFNFUSwgMSwgMSwgMywgU0tJUCB8IEVYVCwgMCwgX0gzMjRDYXBzfSwKLQl7Rk5BTUUoInZvaWNlIikgU0VRLCAxLCAxLCAzLCBTS0lQIHwgRVhULCAwLCBfVm9pY2VDYXBzfSwKLQl7Rk5BTUUoInQxMjAtb25seSIpIFNFUSwgMSwgMSwgMywgU0tJUCB8IEVYVCwgMCwgX1QxMjBPbmx5Q2Fwc30sCi0Je0ZOQU1FKCJub25TdGFuZGFyZFByb3RvY29sIikgU0VRLCAyLCAzLCAzLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInQzOEZheEFubmV4Yk9ubHkiKSBTRVEsIDIsIDUsIDUsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0dhdGV3YXlJbmZvX3Byb3RvY29sW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCA0LCA5LCAxMSwgU0tJUCB8IEVYVCwgMCwgX1N1cHBvcnRlZFByb3RvY29sc30sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfR2F0ZXdheUluZm9bXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInByb3RvY29sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCi0JIF9HYXRld2F5SW5mb19wcm90b2NvbH0sCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfTWN1SW5mb1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgT1BULCAwLAotCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotCXtGTkFNRSgicHJvdG9jb2wiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVGVybWluYWxJbmZvW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfRW5kcG9pbnRUeXBlW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJ2ZW5kb3IiKSBTRVEsIDIsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIF9WZW5kb3JJZGVudGlmaWVyfSwKLQl7Rk5BTUUoImdhdGVrZWVwZXIiKSBTRVEsIDEsIDEsIDEsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIF9HYXRla2VlcGVySW5mb30sCi0Je0ZOQU1FKCJnYXRld2F5IikgU0VRLCAyLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBfR2F0ZXdheUluZm99LAotCXtGTkFNRSgibWN1IikgU0VRLCAxLCAxLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBfTWN1SW5mb30sCi0Je0ZOQU1FKCJ0ZXJtaW5hbCIpIFNFUSwgMSwgMSwgMSwgU0tJUCB8IEVYVCB8IE9QVCwgMCwgX1Rlcm1pbmFsSW5mb30sCi0Je0ZOQU1FKCJtYyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidW5kZWZpbmVkTm9kZSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgic2V0IikgQklUU1RSLCBGSVhELCAzMiwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzdXBwb3J0ZWRUdW5uZWxsZWRQcm90b2NvbHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwKLQkgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfU2V0dXBfVVVJRV9kZXN0aW5hdGlvbkFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1NldHVwX1VVSUVfZGVzdEV4dHJhQ2FsbEluZm9bXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1NldHVwX1VVSUVfZGVzdEV4dHJhQ1JWW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgSU5ULCBXT1JELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9TZXR1cF9VVUlFX2NvbmZlcmVuY2VHb2FsW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgiY3JlYXRlIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImpvaW4iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiaW52aXRlIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhcGFiaWxpdHktbmVnb3RpYXRpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2FsbEluZGVwZW5kZW50U3VwcGxlbWVudGFyeVNlcnZpY2UiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsCi0JIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1E5NTREZXRhaWxzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJjb25mZXJlbmNlQ2FsbGluZyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidGhyZWVQYXJ0eVNlcnZpY2UiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9Rc2VyaWVzT3B0aW9uc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgicTkzMkZ1bGwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInE5NTFGdWxsIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJxOTUyRnVsbCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicTk1M0Z1bGwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInE5NTVGdWxsIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJxOTU2RnVsbCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicTk1N0Z1bGwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInE5NTRJbmZvIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhULCAwLCBfUTk1NERldGFpbHN9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0NhbGxUeXBlW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgicG9pbnRUb1BvaW50IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm9uZVRvTiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJuVG9PbmUiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiblRvTiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDI0NV9Ob25TdGFuZGFyZElkZW50aWZpZXJfaDIyMU5vblN0YW5kYXJkW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJ0MzVDb3VudHJ5Q29kZSIpIElOVCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0MzVFeHRlbnNpb24iKSBJTlQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibWFudWZhY3R1cmVyQ29kZSIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDI0NV9Ob25TdGFuZGFyZElkZW50aWZpZXJbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJvYmplY3QiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiaDIyMU5vblN0YW5kYXJkIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAotCSBfSDI0NV9Ob25TdGFuZGFyZElkZW50aWZpZXJfaDIyMU5vblN0YW5kYXJkfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZElkZW50aWZpZXIiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAsIDAsCi0JIF9IMjQ1X05vblN0YW5kYXJkSWRlbnRpZmllcn0sCi0Je0ZOQU1FKCJkYXRhIikgT0NUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMjYxVmlkZW9DYXBhYmlsaXR5W10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJxY2lmTVBJIikgSU5ULCAyLCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNpZk1QSSIpIElOVCwgMiwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0ZW1wb3JhbFNwYXRpYWxUcmFkZU9mZkNhcGFiaWxpdHkiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoIm1heEJpdFJhdGUiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgic3RpbGxJbWFnZVRyYW5zbWlzc2lvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidmlkZW9CYWRNQnNDYXAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMjYyVmlkZW9DYXBhYmlsaXR5W10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtU1BhdE1MIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtTVBhdExMIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtTVBhdE1MIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtTVBhdEgtMTQiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInByb2ZpbGVBbmRMZXZlbC1NUGF0SEwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInByb2ZpbGVBbmRMZXZlbC1TTlJhdExMIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtU05SYXRNTCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicHJvZmlsZUFuZExldmVsLVNwYXRpYWxhdEgtMTQiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoInByb2ZpbGVBbmRMZXZlbC1IUGF0TUwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInByb2ZpbGVBbmRMZXZlbC1IUGF0SC0xNCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicHJvZmlsZUFuZExldmVsLUhQYXRITCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidmlkZW9CaXRSYXRlIikgSU5ULCBDT05TLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInZidkJ1ZmZlclNpemUiKSBJTlQsIENPTlMsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic2FtcGxlc1BlckxpbmUiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibGluZXNQZXJGcmFtZSIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmcmFtZXNQZXJTZWNvbmQiKSBJTlQsIDQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibHVtaW5hbmNlU2FtcGxlUmF0ZSIpIElOVCwgQ09OUywgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ2aWRlb0JhZE1Cc0NhcCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gyNjNWaWRlb0NhcGFiaWxpdHlbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInNxY2lmTVBJIikgSU5ULCA1LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInFjaWZNUEkiKSBJTlQsIDUsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2lmTVBJIikgSU5ULCA1LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNpZjRNUEkiKSBJTlQsIDUsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2lmMTZNUEkiKSBJTlQsIDUsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibWF4Qml0UmF0ZSIpIElOVCwgQ09OUywgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ1bnJlc3RyaWN0ZWRWZWN0b3IiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFyaXRobWV0aWNDb2RpbmciKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFkdmFuY2VkUHJlZGljdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicGJGcmFtZXMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRlbXBvcmFsU3BhdGlhbFRyYWRlT2ZmQ2FwYWJpbGl0eSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgiaHJkLUIiKSBJTlQsIENPTlMsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiYnBwTWF4S2IiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic2xvd1NxY2lmTVBJIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInNsb3dRY2lmTVBJIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInNsb3dDaWZNUEkiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic2xvd0NpZjRNUEkiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic2xvd0NpZjE2TVBJIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImVycm9yQ29tcGVuc2F0aW9uIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJlbmhhbmNlbWVudExheWVySW5mbyIpIFNFUSwgMywgNCwgNCwgU0tJUCB8IEVYVCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJoMjYzT3B0aW9ucyIpIFNFUSwgNSwgMjksIDMxLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9JUzExMTcyVmlkZW9DYXBhYmlsaXR5W10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJjb25zdHJhaW5lZEJpdHN0cmVhbSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidmlkZW9CaXRSYXRlIikgSU5ULCBDT05TLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInZidkJ1ZmZlclNpemUiKSBJTlQsIENPTlMsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic2FtcGxlc1BlckxpbmUiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibGluZXNQZXJGcmFtZSIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwaWN0dXJlUmF0ZSIpIElOVCwgNCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJsdW1pbmFuY2VTYW1wbGVSYXRlIikgSU5ULCBDT05TLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInZpZGVvQmFkTUJzQ2FwIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVmlkZW9DYXBhYmlsaXR5W10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsCi0JIF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImgyNjFWaWRlb0NhcGFiaWxpdHkiKSBTRVEsIDIsIDUsIDYsIFNLSVAgfCBFWFQsIDAsCi0JIF9IMjYxVmlkZW9DYXBhYmlsaXR5fSwKLQl7Rk5BTUUoImgyNjJWaWRlb0NhcGFiaWxpdHkiKSBTRVEsIDYsIDE3LCAxOCwgU0tJUCB8IEVYVCwgMCwKLQkgX0gyNjJWaWRlb0NhcGFiaWxpdHl9LAotCXtGTkFNRSgiaDI2M1ZpZGVvQ2FwYWJpbGl0eSIpIFNFUSwgNywgMTMsIDIxLCBTS0lQIHwgRVhULCAwLAotCSBfSDI2M1ZpZGVvQ2FwYWJpbGl0eX0sCi0Je0ZOQU1FKCJpczExMTcyVmlkZW9DYXBhYmlsaXR5IikgU0VRLCA2LCA3LCA4LCBTS0lQIHwgRVhULCAwLAotCSBfSVMxMTE3MlZpZGVvQ2FwYWJpbGl0eX0sCi0Je0ZOQU1FKCJnZW5lcmljVmlkZW9DYXBhYmlsaXR5IikgU0VRLCA1LCA2LCA2LCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9BdWRpb0NhcGFiaWxpdHlfZzcyMzFbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoIm1heEFsLXNkdUF1ZGlvRnJhbWVzIikgSU5ULCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInNpbGVuY2VTdXBwcmVzc2lvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0lTMTExNzJBdWRpb0NhcGFiaWxpdHlbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImF1ZGlvTGF5ZXIxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhdWRpb0xheWVyMiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiYXVkaW9MYXllcjMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImF1ZGlvU2FtcGxpbmczMmsiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImF1ZGlvU2FtcGxpbmc0NGsxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhdWRpb1NhbXBsaW5nNDhrIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzaW5nbGVDaGFubmVsIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0d29DaGFubmVscyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiYml0UmF0ZSIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSVMxMzgxOEF1ZGlvQ2FwYWJpbGl0eVtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiYXVkaW9MYXllcjEiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImF1ZGlvTGF5ZXIyIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhdWRpb0xheWVyMyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiYXVkaW9TYW1wbGluZzE2ayIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiYXVkaW9TYW1wbGluZzIyazA1IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhdWRpb1NhbXBsaW5nMjRrIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhdWRpb1NhbXBsaW5nMzJrIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhdWRpb1NhbXBsaW5nNDRrMSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiYXVkaW9TYW1wbGluZzQ4ayIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgic2luZ2xlQ2hhbm5lbCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidHdvQ2hhbm5lbHMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRocmVlQ2hhbm5lbHMyLTEiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRocmVlQ2hhbm5lbHMzLTAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZvdXJDaGFubmVsczItMC0yLTAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZvdXJDaGFubmVsczItMiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZm91ckNoYW5uZWxzMy0xIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmaXZlQ2hhbm5lbHMzLTAtMi0wIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmaXZlQ2hhbm5lbHMzLTIiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImxvd0ZyZXF1ZW5jeUVuaGFuY2VtZW50IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtdWx0aWxpbmd1YWwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImJpdFJhdGUiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0F1ZGlvQ2FwYWJpbGl0eVtdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoIm5vblN0YW5kYXJkIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLAotCSBfSDI0NV9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJnNzExQWxhdzY0ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnNzExQWxhdzU2ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnNzExVWxhdzY0ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnNzExVWxhdzU2ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnNzIyLTY0ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnNzIyLTU2ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnNzIyLTQ4ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnNzIzMSIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwgX0F1ZGlvQ2FwYWJpbGl0eV9nNzIzMX0sCi0Je0ZOQU1FKCJnNzI4IikgSU5ULCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImc3MjkiKSBJTlQsIEJZVEUsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZzcyOUFubmV4QSIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpczExMTcyQXVkaW9DYXBhYmlsaXR5IikgU0VRLCAwLCA5LCA5LCBTS0lQIHwgRVhULCAwLAotCSBfSVMxMTE3MkF1ZGlvQ2FwYWJpbGl0eX0sCi0Je0ZOQU1FKCJpczEzODE4QXVkaW9DYXBhYmlsaXR5IikgU0VRLCAwLCAyMSwgMjEsIFNLSVAgfCBFWFQsIDAsCi0JIF9JUzEzODE4QXVkaW9DYXBhYmlsaXR5fSwKLQl7Rk5BTUUoImc3Mjl3QW5uZXhCIikgSU5ULCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImc3MjlBbm5leEF3QW5uZXhCIikgSU5ULCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImc3MjMxQW5uZXhDQ2FwYWJpbGl0eSIpIFNFUSwgMSwgMywgMywgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnc21GdWxsUmF0ZSIpIFNFUSwgMCwgMywgMywgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnc21IYWxmUmF0ZSIpIFNFUSwgMCwgMywgMywgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnc21FbmhhbmNlZEZ1bGxSYXRlIikgU0VRLCAwLCAzLCAzLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImdlbmVyaWNBdWRpb0NhcGFiaWxpdHkiKSBTRVEsIDUsIDYsIDYsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZzcyOUV4dGVuc2lvbnMiKSBTRVEsIDEsIDgsIDgsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0RhdGFQcm90b2NvbENhcGFiaWxpdHlbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKLQkgX0gyNDVfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotCXtGTkFNRSgidjE0YnVmZmVyZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidjQybGFwbSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJoZGxjRnJhbWVUdW5uZWxsaW5nIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImgzMTBTZXBhcmF0ZVZDU3RhY2siKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiaDMxMFNpbmdsZVZDU3RhY2siKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidHJhbnNwYXJlbnQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgic2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJoZGxjRnJhbWVUdW5uZWxpbmd3U0FSIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInYxMjAiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgic2VwYXJhdGVMQU5TdGFjayIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ2NzZ3Q29tcHJlc3Npb24iKSBDSE9JQ0UsIDIsIDMsIDMsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidGNwIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInVkcCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVDg0UHJvZmlsZV90ODRSZXN0cmljdGVkW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJxY2lmIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjaWYiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNjaXI2MDFTZXEiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNjaXI2MDFQcm9nIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJoZHR2U2VxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJoZHR2UHJvZyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZzNGYWNzTUgyMDB4MTAwIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnM0ZhY3NNSDIwMHgyMDAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImc0RmFjc01NUjIwMHgxMDAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImc0RmFjc01NUjIwMHgyMDAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImpiaWcyMDB4MjAwU2VxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJqYmlnMjAweDIwMFByb2ciKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImpiaWczMDB4MzAwU2VxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJqYmlnMzAweDMwMFByb2ciKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRpZ1Bob3RvTG93IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkaWdQaG90b01lZFNlcSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGlnUGhvdG9NZWRQcm9nIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkaWdQaG90b0hpZ2hTZXEiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRpZ1Bob3RvSGlnaFByb2ciKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9UODRQcm9maWxlW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgidDg0VW5yZXN0cmljdGVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInQ4NFJlc3RyaWN0ZWQiKSBTRVEsIDAsIDE5LCAxOSwgU0tJUCB8IEVYVCwgMCwKLQkgX1Q4NFByb2ZpbGVfdDg0UmVzdHJpY3RlZH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90ODRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInQ4NFByb3RvY29sIikgQ0hPSUNFLCAzLCA3LCAxNCwgU0tJUCB8IEVYVCwgMCwKLQkgX0RhdGFQcm90b2NvbENhcGFiaWxpdHl9LAotCXtGTkFNRSgidDg0UHJvZmlsZSIpIENIT0lDRSwgMSwgMiwgMiwgU0tJUCwgMCwgX1Q4NFByb2ZpbGV9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0RhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fbmxwaWRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoIm5scGlkUHJvdG9jb2wiKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLAotCSBfRGF0YVByb3RvY29sQ2FwYWJpbGl0eX0sCi0Je0ZOQU1FKCJubHBpZERhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0RhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25bXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKLQkgX0gyNDVfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotCXtGTkFNRSgidDEyMCIpIENIT0lDRSwgMywgNywgMTQsIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbiwgdDEyMCksCi0JIF9EYXRhUHJvdG9jb2xDYXBhYmlsaXR5fSwKLQl7Rk5BTUUoImRzbS1jYyIpIENIT0lDRSwgMywgNywgMTQsIFNLSVAgfCBFWFQsIDAsCi0JIF9EYXRhUHJvdG9jb2xDYXBhYmlsaXR5fSwKLQl7Rk5BTUUoInVzZXJEYXRhIikgQ0hPSUNFLCAzLCA3LCAxNCwgU0tJUCB8IEVYVCwgMCwKLQkgX0RhdGFQcm90b2NvbENhcGFiaWxpdHl9LAotCXtGTkFNRSgidDg0IikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLAotCSBfRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90ODR9LAotCXtGTkFNRSgidDQzNCIpIENIT0lDRSwgMywgNywgMTQsIFNLSVAgfCBFWFQsIDAsCi0JIF9EYXRhUHJvdG9jb2xDYXBhYmlsaXR5fSwKLQl7Rk5BTUUoImgyMjQiKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLAotCSBfRGF0YVByb3RvY29sQ2FwYWJpbGl0eX0sCi0Je0ZOQU1FKCJubHBpZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKLQkgX0RhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fbmxwaWR9LAotCXtGTkFNRSgiZHN2ZENvbnRyb2wiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiaDIyMkRhdGFQYXJ0aXRpb25pbmciKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLAotCSBfRGF0YVByb3RvY29sQ2FwYWJpbGl0eX0sCi0Je0ZOQU1FKCJ0MzBmYXgiKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInQxNDAiKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInQzOGZheCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnZW5lcmljRGF0YUNhcGFiaWxpdHkiKSBTRVEsIDUsIDYsIDYsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0RhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImFwcGxpY2F0aW9uIikgQ0hPSUNFLCA0LCAxMCwgMTQsIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eSwgYXBwbGljYXRpb24pLAotCSBfRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbn0sCi0Je0ZOQU1FKCJtYXhCaXRSYXRlIikgSU5ULCBDT05TLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9FbmNyeXB0aW9uTW9kZVtdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoIm5vblN0YW5kYXJkIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLAotCSBfSDI0NV9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJoMjMzRW5jcnlwdGlvbiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfRGF0YVR5cGVbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKLQkgX0gyNDVfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotCXtGTkFNRSgibnVsbERhdGEiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidmlkZW9EYXRhIikgQ0hPSUNFLCAzLCA1LCA2LCBTS0lQIHwgRVhULCAwLCBfVmlkZW9DYXBhYmlsaXR5fSwKLQl7Rk5BTUUoImF1ZGlvRGF0YSIpIENIT0lDRSwgNCwgMTQsIDIyLCBTS0lQIHwgRVhULCAwLAotCSBfQXVkaW9DYXBhYmlsaXR5fSwKLQl7Rk5BTUUoImRhdGEiKSBTRVEsIDAsIDIsIDIsIERFQ09ERSB8IEVYVCwgb2Zmc2V0b2YoRGF0YVR5cGUsIGRhdGEpLAotCSBfRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eX0sCi0Je0ZOQU1FKCJlbmNyeXB0aW9uRGF0YSIpIENIT0lDRSwgMSwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKLQkgX0VuY3J5cHRpb25Nb2RlfSwKLQl7Rk5BTUUoImgyMzVDb250cm9sIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImgyMzVNZWRpYSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtdWx0aXBsZXhlZFN0cmVhbSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDIyMkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgicmVzb3VyY2VJRCIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzdWJDaGFubmVsSUQiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicGNyLXBpZCIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwcm9ncmFtRGVzY3JpcHRvcnMiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic3RyZWFtRGVzY3JpcHRvcnMiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfYWRhcHRhdGlvbkxheWVyVHlwZV9hbDNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImNvbnRyb2xGaWVsZE9jdGV0cyIpIElOVCwgMiwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzZW5kQnVmZmVyU2l6ZSIpIElOVCwgQ09OUywgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDIyM0xvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19hZGFwdGF0aW9uTGF5ZXJUeXBlW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsCi0JIF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImFsMUZyYW1lZCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhbDFOb3RGcmFtZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiYWwyV2l0aG91dFNlcXVlbmNlTnVtYmVycyIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhbDJXaXRoU2VxdWVuY2VOdW1iZXJzIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFsMyIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKLQkgX0gyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfYWRhcHRhdGlvbkxheWVyVHlwZV9hbDN9LAotCXtGTkFNRSgiYWwxTSIpIFNFUSwgMCwgNywgOCwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhbDJNIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFsM00iKSBTRVEsIDAsIDUsIDYsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImFkYXB0YXRpb25MYXllclR5cGUiKSBDSE9JQ0UsIDMsIDYsIDksIFNLSVAgfCBFWFQsIDAsCi0JIF9IMjIzTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX2FkYXB0YXRpb25MYXllclR5cGV9LAotCXtGTkFNRSgic2VnbWVudGFibGVGbGFnIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ1JDTGVuZ3RoW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgiY3JjOGJpdCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjcmMxNmJpdCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjcmMzMmJpdCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVjc2SERMQ1BhcmFtZXRlcnNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImNyY0xlbmd0aCIpIENIT0lDRSwgMiwgMywgMywgU0tJUCB8IEVYVCwgMCwgX0NSQ0xlbmd0aH0sCi0Je0ZOQU1FKCJuNDAxIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImxvb3BiYWNrVGVzdFByb2NlZHVyZSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1Y3NkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19zdXNwZW5kUmVzdW1lW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgibm9TdXNwZW5kUmVzdW1lIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN1c3BlbmRSZXN1bWV3QWRkcmVzcyIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzdXNwZW5kUmVzdW1ld29BZGRyZXNzIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9WNzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbW9kZV9lUk1fcmVjb3ZlcnlbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJyZWoiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgic1JFSiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtU1JFSiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21vZGVfZVJNW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJ3aW5kb3dTaXplIikgSU5ULCA3LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJlY292ZXJ5IikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhULCAwLAotCSBfVjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21vZGVfZVJNX3JlY292ZXJ5fSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9WNzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbW9kZVtdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoImVSTSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKLQkgX1Y3NkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tb2RlX2VSTX0sCi0Je0ZOQU1FKCJ1TkVSTSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVjc1UGFyYW1ldGVyc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiYXVkaW9IZWFkZXJQcmVzZW50IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJoZGxjUGFyYW1ldGVycyIpIFNFUSwgMCwgMywgMywgU0tJUCB8IEVYVCwgMCwKLQkgX1Y3NkhETENQYXJhbWV0ZXJzfSwKLQl7Rk5BTUUoInN1c3BlbmRSZXN1bWUiKSBDSE9JQ0UsIDIsIDMsIDMsIFNLSVAgfCBFWFQsIDAsCi0JIF9WNzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfc3VzcGVuZFJlc3VtZX0sCi0Je0ZOQU1FKCJ1SUgiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm1vZGUiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCi0JIF9WNzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbW9kZX0sCi0Je0ZOQU1FKCJ2NzVQYXJhbWV0ZXJzIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBfVjc1UGFyYW1ldGVyc30sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbm9uU3RhbmRhcmRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsIF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9VbmljYXN0QWRkcmVzc19pUEFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoIm5ldHdvcmsiKSBPQ1RTVFIsIEZJWEQsIDQsIDAsIERFQ09ERSwKLQkgb2Zmc2V0b2YoVW5pY2FzdEFkZHJlc3NfaVBBZGRyZXNzLCBuZXR3b3JrKSwgTlVMTH0sCi0Je0ZOQU1FKCJ0c2FwSWRlbnRpZmllciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVW5pY2FzdEFkZHJlc3NfaVBYQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgibm9kZSIpIE9DVFNUUiwgRklYRCwgNiwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJuZXRudW0iKSBPQ1RTVFIsIEZJWEQsIDQsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidHNhcElkZW50aWZpZXIiKSBPQ1RTVFIsIEZJWEQsIDIsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1VuaWNhc3RBZGRyZXNzX2lQNkFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoIm5ldHdvcmsiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRzYXBJZGVudGlmaWVyIikgSU5ULCBXT1JELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9VbmljYXN0QWRkcmVzc19pUFNvdXJjZVJvdXRlQWRkcmVzc19yb3V0aW5nW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgic3RyaWN0IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImxvb3NlIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9VbmljYXN0QWRkcmVzc19pUFNvdXJjZVJvdXRlQWRkcmVzc19yb3V0ZVtdID0gewkvKiBTRVFVRU5DRSBPRiAqLwotCXtGTkFNRSgiaXRlbSIpIE9DVFNUUiwgRklYRCwgNCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVW5pY2FzdEFkZHJlc3NfaVBTb3VyY2VSb3V0ZUFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInJvdXRpbmciKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAsIDAsCi0JIF9VbmljYXN0QWRkcmVzc19pUFNvdXJjZVJvdXRlQWRkcmVzc19yb3V0aW5nfSwKLQl7Rk5BTUUoIm5ldHdvcmsiKSBPQ1RTVFIsIEZJWEQsIDQsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidHNhcElkZW50aWZpZXIiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicm91dGUiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwKLQkgX1VuaWNhc3RBZGRyZXNzX2lQU291cmNlUm91dGVBZGRyZXNzX3JvdXRlfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9VbmljYXN0QWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoImlQQWRkcmVzcyIpIFNFUSwgMCwgMiwgMiwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihVbmljYXN0QWRkcmVzcywgaVBBZGRyZXNzKSwgX1VuaWNhc3RBZGRyZXNzX2lQQWRkcmVzc30sCi0Je0ZOQU1FKCJpUFhBZGRyZXNzIikgU0VRLCAwLCAzLCAzLCBTS0lQIHwgRVhULCAwLAotCSBfVW5pY2FzdEFkZHJlc3NfaVBYQWRkcmVzc30sCi0Je0ZOQU1FKCJpUDZBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhULCAwLAotCSBfVW5pY2FzdEFkZHJlc3NfaVA2QWRkcmVzc30sCi0Je0ZOQU1FKCJuZXRCaW9zIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpUFNvdXJjZVJvdXRlQWRkcmVzcyIpIFNFUSwgMCwgNCwgNCwgU0tJUCB8IEVYVCwgMCwKLQkgX1VuaWNhc3RBZGRyZXNzX2lQU291cmNlUm91dGVBZGRyZXNzfSwKLQl7Rk5BTUUoIm5zYXAiKSBPQ1RTVFIsIDUsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibm9uU3RhbmRhcmRBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9NdWx0aWNhc3RBZGRyZXNzX2lQQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgibmV0d29yayIpIE9DVFNUUiwgRklYRCwgNCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0c2FwSWRlbnRpZmllciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfTXVsdGljYXN0QWRkcmVzc19pUDZBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJuZXR3b3JrIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0c2FwSWRlbnRpZmllciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfTXVsdGljYXN0QWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoImlQQWRkcmVzcyIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKLQkgX011bHRpY2FzdEFkZHJlc3NfaVBBZGRyZXNzfSwKLQl7Rk5BTUUoImlQNkFkZHJlc3MiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCi0JIF9NdWx0aWNhc3RBZGRyZXNzX2lQNkFkZHJlc3N9LAotCXtGTkFNRSgibnNhcCIpIE9DVFNUUiwgNSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJub25TdGFuZGFyZEFkZHJlc3MiKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gyNDVfVHJhbnNwb3J0QWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoInVuaWNhc3RBZGRyZXNzIikgQ0hPSUNFLCAzLCA1LCA3LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKEgyNDVfVHJhbnNwb3J0QWRkcmVzcywgdW5pY2FzdEFkZHJlc3MpLCBfVW5pY2FzdEFkZHJlc3N9LAotCXtGTkFNRSgibXVsdGljYXN0QWRkcmVzcyIpIENIT0lDRSwgMSwgMiwgNCwgU0tJUCB8IEVYVCwgMCwKLQkgX011bHRpY2FzdEFkZHJlc3N9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLAotCSBfSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbm9uU3RhbmRhcmR9LAotCXtGTkFNRSgic2Vzc2lvbklEIikgSU5ULCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFzc29jaWF0ZWRTZXNzaW9uSUQiKSBJTlQsIDgsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibWVkaWFDaGFubmVsIikgQ0hPSUNFLCAxLCAyLCAyLCBERUNPREUgfCBFWFQgfCBPUFQsCi0JIG9mZnNldG9mKEgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLCBtZWRpYUNoYW5uZWwpLAotCSBfSDI0NV9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoIm1lZGlhR3VhcmFudGVlZERlbGl2ZXJ5IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJtZWRpYUNvbnRyb2xDaGFubmVsIikgQ0hPSUNFLCAxLCAyLCAyLCBERUNPREUgfCBFWFQgfCBPUFQsCi0JIG9mZnNldG9mKEgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLCBtZWRpYUNvbnRyb2xDaGFubmVsKSwKLQkgX0gyNDVfVHJhbnNwb3J0QWRkcmVzc30sCi0Je0ZOQU1FKCJtZWRpYUNvbnRyb2xHdWFyYW50ZWVkRGVsaXZlcnkiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QIHwgT1BULAotCSAwLCBOVUxMfSwKLQl7Rk5BTUUoInNpbGVuY2VTdXBwcmVzc2lvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdGluYXRpb24iKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZHluYW1pY1JUUFBheWxvYWRUeXBlIikgSU5ULCA1LCA5NiwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtZWRpYVBhY2tldGl6YXRpb24iKSBDSE9JQ0UsIDAsIDEsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgidHJhbnNwb3J0Q2FwYWJpbGl0eSIpIFNFUSwgMywgMywgMywgU1RPUCB8IEVYVCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJyZWR1bmRhbmN5RW5jb2RpbmciKSBTRVEsIDEsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic291cmNlIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9PcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgiaDIyMkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyIpIFNFUSwgMywgNSwgNSwgU0tJUCB8IEVYVCwgMCwKLQkgX0gyMjJMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnN9LAotCXtGTkFNRSgiaDIyM0xvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKLQkgX0gyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnN9LAotCXtGTkFNRSgidjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAwLCA1LCA1LCBTS0lQIHwgRVhULCAwLAotCSBfVjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKLQl7Rk5BTUUoImgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAxMCwgMTEsIDE0LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mCi0JIChPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzLAotCSAgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpLCBfSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnN9LAotCXtGTkFNRSgibm9uZSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInBvcnROdW1iZXIiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGF0YVR5cGUiKSBDSE9JQ0UsIDMsIDYsIDksIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMsCi0JCSAgZGF0YVR5cGUpLCBfRGF0YVR5cGV9LAotCXtGTkFNRSgibXVsdGlwbGV4UGFyYW1ldGVycyIpIENIT0lDRSwgMiwgMywgNSwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKLQkJICBtdWx0aXBsZXhQYXJhbWV0ZXJzKSwKLQkgX09wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnN9LAotCXtGTkFNRSgiZm9yd2FyZExvZ2ljYWxDaGFubmVsRGVwZW5kZW5jeSIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCB8IE9QVCwKLQkgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZXBsYWNlbWVudEZvciIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc1tdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoImgyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCi0JIF9IMjIzTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKLQl7Rk5BTUUoInY3NkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyIpIFNFUSwgMCwgNSwgNSwgU0tJUCB8IEVYVCwgMCwKLQkgX1Y3NkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc30sCi0Je0ZOQU1FKCJoMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyIpIFNFUSwgMTAsIDExLCAxNCwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZgotCSAoT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycywKLQkgIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSwgX0gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9PcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiZGF0YVR5cGUiKSBDSE9JQ0UsIDMsIDYsIDksIFNLSVAgfCBFWFQsIDAsIF9EYXRhVHlwZX0sCi0Je0ZOQU1FKCJtdWx0aXBsZXhQYXJhbWV0ZXJzIikgQ0hPSUNFLCAxLCAyLCAzLCBERUNPREUgfCBFWFQgfCBPUFQsCi0JIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAotCQkgIG11bHRpcGxleFBhcmFtZXRlcnMpLAotCSBfT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc30sCi0Je0ZOQU1FKCJyZXZlcnNlTG9naWNhbENoYW5uZWxEZXBlbmRlbmN5IikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULAotCSAwLCBOVUxMfSwKLQl7Rk5BTUUoInJlcGxhY2VtZW50Rm9yIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9OZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19kaXN0cmlidXRpb25bXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJ1bmljYXN0IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm11bHRpY2FzdCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfUTI5MzFBZGRyZXNzX2FkZHJlc3NbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJpbnRlcm5hdGlvbmFsTnVtYmVyIikgTlVNU1RSLCA0LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm5zYXBBZGRyZXNzIikgT0NUU1RSLCA1LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9RMjkzMUFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImFkZHJlc3MiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCi0JIF9RMjkzMUFkZHJlc3NfYWRkcmVzc30sCi0Je0ZOQU1FKCJzdWJhZGRyZXNzIikgT0NUU1RSLCA1LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9OZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19uZXR3b3JrQWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoInEyOTMxQWRkcmVzcyIpIFNFUSwgMSwgMiwgMiwgU0tJUCB8IEVYVCwgMCwgX1EyOTMxQWRkcmVzc30sCi0Je0ZOQU1FKCJlMTY0QWRkcmVzcyIpIE5VTURHVCwgNywgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJsb2NhbEFyZWFBZGRyZXNzIikgQ0hPSUNFLCAxLCAyLCAyLCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKE5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzLCBsb2NhbEFyZWFBZGRyZXNzKSwKLQkgX0gyNDVfVHJhbnNwb3J0QWRkcmVzc30sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImRpc3RyaWJ1dGlvbiIpIENIT0lDRSwgMSwgMiwgMiwgU0tJUCB8IEVYVCB8IE9QVCwgMCwKLQkgX05ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX2Rpc3RyaWJ1dGlvbn0sCi0Je0ZOQU1FKCJuZXR3b3JrQWRkcmVzcyIpIENIT0lDRSwgMiwgMywgMywgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihOZXR3b3JrQWNjZXNzUGFyYW1ldGVycywgbmV0d29ya0FkZHJlc3MpLAotCSBfTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfbmV0d29ya0FkZHJlc3N9LAotCXtGTkFNRSgiYXNzb2NpYXRlQ29uZmVyZW5jZSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZXh0ZXJuYWxSZWZlcmVuY2UiKSBPQ1RTVFIsIDgsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidDEyMFNldHVwUHJvY2VkdXJlIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLAotCSBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9PcGVuTG9naWNhbENoYW5uZWxbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImZvcndhcmRMb2dpY2FsQ2hhbm5lbE51bWJlciIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAxLCAzLCA1LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbCwgZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyksCi0JIF9PcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc30sCi0Je0ZOQU1FKCJyZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAxLCAyLCA0LAotCSBERUNPREUgfCBFWFQgfCBPUFQsIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbCwKLQkJCQkgICAgICByZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSwKLQkgX09wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKLQl7Rk5BTUUoInNlcGFyYXRlU3RhY2siKSBTRVEsIDIsIDQsIDUsIERFQ09ERSB8IEVYVCB8IE9QVCwKLQkgb2Zmc2V0b2YoT3BlbkxvZ2ljYWxDaGFubmVsLCBzZXBhcmF0ZVN0YWNrKSwKLQkgX05ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzfSwKLQl7Rk5BTUUoImVuY3J5cHRpb25TeW5jIikgU0VRLCAyLCA0LCA0LCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9TZXR1cF9VVUlFX2Zhc3RTdGFydFtdID0gewkvKiBTRVFVRU5DRSBPRiAqLwotCXtGTkFNRSgiaXRlbSIpIFNFUSwgMSwgMywgNSwgREVDT0RFIHwgT1BFTiB8IEVYVCwKLQkgc2l6ZW9mKE9wZW5Mb2dpY2FsQ2hhbm5lbCksIF9PcGVuTG9naWNhbENoYW5uZWx9Ci0JLAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1NldHVwX1VVSUVbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInByb3RvY29sSWRlbnRpZmllciIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJoMjQ1QWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAotCSBvZmZzZXRvZihTZXR1cF9VVUlFLCBoMjQ1QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoInNvdXJjZUFkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKLQkgX1NldHVwX1VVSUVfc291cmNlQWRkcmVzc30sCi0Je0ZOQU1FKCJzb3VyY2VJbmZvIikgU0VRLCA2LCA4LCAxMCwgU0tJUCB8IEVYVCwgMCwgX0VuZHBvaW50VHlwZX0sCi0Je0ZOQU1FKCJkZXN0aW5hdGlvbkFkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKLQkgX1NldHVwX1VVSUVfZGVzdGluYXRpb25BZGRyZXNzfSwKLQl7Rk5BTUUoImRlc3RDYWxsU2lnbmFsQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAotCSBvZmZzZXRvZihTZXR1cF9VVUlFLCBkZXN0Q2FsbFNpZ25hbEFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCi0Je0ZOQU1FKCJkZXN0RXh0cmFDYWxsSW5mbyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLAotCSBfU2V0dXBfVVVJRV9kZXN0RXh0cmFDYWxsSW5mb30sCi0Je0ZOQU1FKCJkZXN0RXh0cmFDUlYiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKLQkgX1NldHVwX1VVSUVfZGVzdEV4dHJhQ1JWfSwKLQl7Rk5BTUUoImFjdGl2ZU1DIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjb25mZXJlbmNlSUQiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNvbmZlcmVuY2VHb2FsIikgQ0hPSUNFLCAyLCAzLCA1LCBTS0lQIHwgRVhULCAwLAotCSBfU2V0dXBfVVVJRV9jb25mZXJlbmNlR29hbH0sCi0Je0ZOQU1FKCJjYWxsU2VydmljZXMiKSBTRVEsIDAsIDgsIDgsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIF9Rc2VyaWVzT3B0aW9uc30sCi0Je0ZOQU1FKCJjYWxsVHlwZSIpIENIT0lDRSwgMiwgNCwgNCwgU0tJUCB8IEVYVCwgMCwgX0NhbGxUeXBlfSwKLQl7Rk5BTUUoInNvdXJjZUNhbGxTaWduYWxBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQgfCBPUFQsCi0JIG9mZnNldG9mKFNldHVwX1VVSUUsIHNvdXJjZUNhbGxTaWduYWxBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3N9LAotCXtGTkFNRSgicmVtb3RlRXh0ZW5zaW9uQWRkcmVzcyIpIENIT0lDRSwgMSwgMiwgNywgU0tJUCB8IEVYVCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJjYWxsSWRlbnRpZmllciIpIFNFUSwgMCwgMSwgMSwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJoMjQ1U2VjdXJpdHlDYXBhYmlsaXR5IikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmFzdFN0YXJ0IikgU0VRT0YsIFNFTUksIDAsIDMwLCBERUNPREUgfCBPUFQsCi0JIG9mZnNldG9mKFNldHVwX1VVSUUsIGZhc3RTdGFydCksIF9TZXR1cF9VVUlFX2Zhc3RTdGFydH0sCi0Je0ZOQU1FKCJtZWRpYVdhaXRGb3JDb25uZWN0IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYW5PdmVybGFwU2VuZCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm11bHRpcGxlQ2FsbHMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm1haW50YWluQ29ubmVjdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiY29ubmVjdGlvblBhcmFtZXRlcnMiKSBTRVEsIDAsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgibGFuZ3VhZ2UiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwcmVzZW50YXRpb25JbmRpY2F0b3IiKSBDSE9JQ0UsIDIsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgic2NyZWVuaW5nSW5kaWNhdG9yIikgRU5VTSwgMiwgMCwgMCwgU0tJUCB8IEVYVCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJzZXJ2aWNlQ29udHJvbCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN5bW1ldHJpY09wZXJhdGlvblJlcXVpcmVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQIHwgT1BULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNpcmN1aXRJbmZvIikgU0VRLCAzLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRlc2lyZWRQcm90b2NvbHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJuZWVkZWRGZWF0dXJlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRlc2lyZWRGZWF0dXJlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN1cHBvcnRlZEZlYXR1cmVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicGFyYWxsZWxIMjQ1Q29udHJvbCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFkZGl0aW9uYWxTb3VyY2VBZGRyZXNzZXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKLQkgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ2FsbFByb2NlZWRpbmdfVVVJRV9mYXN0U3RhcnRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBTRVEsIDEsIDMsIDUsIERFQ09ERSB8IE9QRU4gfCBFWFQsCi0JIHNpemVvZihPcGVuTG9naWNhbENoYW5uZWwpLCBfT3BlbkxvZ2ljYWxDaGFubmVsfQotCSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9DYWxsUHJvY2VlZGluZ19VVUlFW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdGluYXRpb25JbmZvIikgU0VRLCA2LCA4LCAxMCwgU0tJUCB8IEVYVCwgMCwKLQkgX0VuZHBvaW50VHlwZX0sCi0Je0ZOQU1FKCJoMjQ1QWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAotCSBvZmZzZXRvZihDYWxsUHJvY2VlZGluZ19VVUlFLCBoMjQ1QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImNhbGxJZGVudGlmaWVyIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImgyNDVTZWN1cml0eU1vZGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmFzdFN0YXJ0IikgU0VRT0YsIFNFTUksIDAsIDMwLCBERUNPREUgfCBPUFQsCi0JIG9mZnNldG9mKENhbGxQcm9jZWVkaW5nX1VVSUUsIGZhc3RTdGFydCksCi0JIF9DYWxsUHJvY2VlZGluZ19VVUlFX2Zhc3RTdGFydH0sCi0Je0ZOQU1FKCJtdWx0aXBsZUNhbGxzIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtYWludGFpbkNvbm5lY3Rpb24iKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZhc3RDb25uZWN0UmVmdXNlZCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmZWF0dXJlU2V0IikgU0VRLCAzLCA0LCA0LCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9Db25uZWN0X1VVSUVfZmFzdFN0YXJ0W10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgU0VRLCAxLCAzLCA1LCBERUNPREUgfCBPUEVOIHwgRVhULAotCSBzaXplb2YoT3BlbkxvZ2ljYWxDaGFubmVsKSwgX09wZW5Mb2dpY2FsQ2hhbm5lbH0KLQksCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ29ubmVjdF9VVUlFW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiaDI0NUFkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCB8IE9QVCwKLQkgb2Zmc2V0b2YoQ29ubmVjdF9VVUlFLCBoMjQ1QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImRlc3RpbmF0aW9uSW5mbyIpIFNFUSwgNiwgOCwgMTAsIFNLSVAgfCBFWFQsIDAsCi0JIF9FbmRwb2ludFR5cGV9LAotCXtGTkFNRSgiY29uZmVyZW5jZUlEIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYWxsSWRlbnRpZmllciIpIFNFUSwgMCwgMSwgMSwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJoMjQ1U2VjdXJpdHlNb2RlIikgQ0hPSUNFLCAyLCA0LCA0LCBTS0lQIHwgRVhUIHwgT1BULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZhc3RTdGFydCIpIFNFUU9GLCBTRU1JLCAwLCAzMCwgREVDT0RFIHwgT1BULAotCSBvZmZzZXRvZihDb25uZWN0X1VVSUUsIGZhc3RTdGFydCksIF9Db25uZWN0X1VVSUVfZmFzdFN0YXJ0fSwKLQl7Rk5BTUUoIm11bHRpcGxlQ2FsbHMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm1haW50YWluQ29ubmVjdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibGFuZ3VhZ2UiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjb25uZWN0ZWRBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicHJlc2VudGF0aW9uSW5kaWNhdG9yIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoInNjcmVlbmluZ0luZGljYXRvciIpIEVOVU0sIDIsIDAsIDAsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgiZmFzdENvbm5lY3RSZWZ1c2VkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInNlcnZpY2VDb250cm9sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2FwYWNpdHkiKSBTRVEsIDIsIDIsIDIsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU0tJUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQWxlcnRpbmdfVVVJRV9mYXN0U3RhcnRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBTRVEsIDEsIDMsIDUsIERFQ09ERSB8IE9QRU4gfCBFWFQsCi0JIHNpemVvZihPcGVuTG9naWNhbENoYW5uZWwpLCBfT3BlbkxvZ2ljYWxDaGFubmVsfQotCSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9BbGVydGluZ19VVUlFW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdGluYXRpb25JbmZvIikgU0VRLCA2LCA4LCAxMCwgU0tJUCB8IEVYVCwgMCwKLQkgX0VuZHBvaW50VHlwZX0sCi0Je0ZOQU1FKCJoMjQ1QWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAotCSBvZmZzZXRvZihBbGVydGluZ19VVUlFLCBoMjQ1QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImNhbGxJZGVudGlmaWVyIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImgyNDVTZWN1cml0eU1vZGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmFzdFN0YXJ0IikgU0VRT0YsIFNFTUksIDAsIDMwLCBERUNPREUgfCBPUFQsCi0JIG9mZnNldG9mKEFsZXJ0aW5nX1VVSUUsIGZhc3RTdGFydCksIF9BbGVydGluZ19VVUlFX2Zhc3RTdGFydH0sCi0Je0ZOQU1FKCJtdWx0aXBsZUNhbGxzIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtYWludGFpbkNvbm5lY3Rpb24iKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFsZXJ0aW5nQWRkcmVzcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInByZXNlbnRhdGlvbkluZGljYXRvciIpIENIT0lDRSwgMiwgMywgMywgU0tJUCB8IEVYVCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJzY3JlZW5pbmdJbmRpY2F0b3IiKSBFTlVNLCAyLCAwLCAwLCBTS0lQIHwgRVhUIHwgT1BULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoImZhc3RDb25uZWN0UmVmdXNlZCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzZXJ2aWNlQ29udHJvbCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZlYXR1cmVTZXQiKSBTRVEsIDMsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0luZm9ybWF0aW9uX1VVSUVfZmFzdFN0YXJ0W10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgU0VRLCAxLCAzLCA1LCBERUNPREUgfCBPUEVOIHwgRVhULAotCSBzaXplb2YoT3BlbkxvZ2ljYWxDaGFubmVsKSwgX09wZW5Mb2dpY2FsQ2hhbm5lbH0KLQksCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSW5mb3JtYXRpb25fVVVJRVtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhbGxJZGVudGlmaWVyIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZhc3RTdGFydCIpIFNFUU9GLCBTRU1JLCAwLCAzMCwgREVDT0RFIHwgT1BULAotCSBvZmZzZXRvZihJbmZvcm1hdGlvbl9VVUlFLCBmYXN0U3RhcnQpLCBfSW5mb3JtYXRpb25fVVVJRV9mYXN0U3RhcnR9LAotCXtGTkFNRSgiZmFzdENvbm5lY3RSZWZ1c2VkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNpcmN1aXRJbmZvIikgU0VRLCAzLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9SZWxlYXNlQ29tcGxldGVSZWFzb25bXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJub0JhbmR3aWR0aCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnYXRla2VlcGVyUmVzb3VyY2VzIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInVucmVhY2hhYmxlRGVzdGluYXRpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdGluYXRpb25SZWplY3Rpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiaW52YWxpZFJldmlzaW9uIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm5vUGVybWlzc2lvbiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ1bnJlYWNoYWJsZUdhdGVrZWVwZXIiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZ2F0ZXdheVJlc291cmNlcyIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJiYWRGb3JtYXRBZGRyZXNzIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFkYXB0aXZlQnVzeSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpbkNvbmYiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidW5kZWZpbmVkUmVhc29uIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZhY2lsaXR5Q2FsbERlZmxlY3Rpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgic2VjdXJpdHlEZW5pZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2FsbGVkUGFydHlOb3RSZWdpc3RlcmVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhbGxlck5vdFJlZ2lzdGVyZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibmV3Q29ubmVjdGlvbk5lZWRlZCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJub25TdGFuZGFyZFJlYXNvbiIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZXBsYWNlV2l0aENvbmZlcmVuY2VJbnZpdGUiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoImdlbmVyaWNEYXRhUmVhc29uIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm5lZWRlZEZlYXR1cmVOb3RTdXBwb3J0ZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidHVubmVsbGVkU2lnbmFsbGluZ1JlamVjdGVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9SZWxlYXNlQ29tcGxldGVfVVVJRVtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJlYXNvbiIpIENIT0lDRSwgNCwgMTIsIDIyLCBTS0lQIHwgRVhUIHwgT1BULCAwLAotCSBfUmVsZWFzZUNvbXBsZXRlUmVhc29ufSwKLQl7Rk5BTUUoImNhbGxJZGVudGlmaWVyIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImJ1c3lBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicHJlc2VudGF0aW9uSW5kaWNhdG9yIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoInNjcmVlbmluZ0luZGljYXRvciIpIEVOVU0sIDIsIDAsIDAsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgiY2FwYWNpdHkiKSBTRVEsIDIsIDIsIDIsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic2VydmljZUNvbnRyb2wiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmZWF0dXJlU2V0IikgU0VRLCAzLCA0LCA0LCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9GYWNpbGl0eV9VVUlFX2FsdGVybmF0aXZlQWxpYXNBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhULCAwLCBfQWxpYXNBZGRyZXNzfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9GYWNpbGl0eVJlYXNvbltdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoInJvdXRlQ2FsbFRvR2F0ZWtlZXBlciIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYWxsRm9yd2FyZGVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJvdXRlQ2FsbFRvTUMiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidW5kZWZpbmVkUmVhc29uIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNvbmZlcmVuY2VMaXN0Q2hvaWNlIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN0YXJ0SDI0NSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJub0gyNDUiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibmV3VG9rZW5zIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZlYXR1cmVTZXRVcGRhdGUiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZm9yd2FyZGVkRWxlbWVudHMiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidHJhbnNwb3J0ZWRJbmZvcm1hdGlvbiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfRmFjaWxpdHlfVVVJRV9mYXN0U3RhcnRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBTRVEsIDEsIDMsIDUsIERFQ09ERSB8IE9QRU4gfCBFWFQsCi0JIHNpemVvZihPcGVuTG9naWNhbENoYW5uZWwpLCBfT3BlbkxvZ2ljYWxDaGFubmVsfQotCSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9GYWNpbGl0eV9VVUlFW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiYWx0ZXJuYXRpdmVBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQgfCBPUFQsCi0JIG9mZnNldG9mKEZhY2lsaXR5X1VVSUUsIGFsdGVybmF0aXZlQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImFsdGVybmF0aXZlQWxpYXNBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCi0JIF9GYWNpbGl0eV9VVUlFX2FsdGVybmF0aXZlQWxpYXNBZGRyZXNzfSwKLQl7Rk5BTUUoImNvbmZlcmVuY2VJRCIpIE9DVFNUUiwgRklYRCwgMTYsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicmVhc29uIikgQ0hPSUNFLCAyLCA0LCAxMSwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihGYWNpbGl0eV9VVUlFLCByZWFzb24pLCBfRmFjaWxpdHlSZWFzb259LAotCXtGTkFNRSgiY2FsbElkZW50aWZpZXIiKSBTRVEsIDAsIDEsIDEsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdEV4dHJhQ2FsbEluZm8iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZW1vdGVFeHRlbnNpb25BZGRyZXNzIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhUIHwgT1BULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNvbmZlcmVuY2VzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiaDI0NUFkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCB8IE9QVCwKLQkgb2Zmc2V0b2YoRmFjaWxpdHlfVVVJRSwgaDI0NUFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCi0Je0ZOQU1FKCJmYXN0U3RhcnQiKSBTRVFPRiwgU0VNSSwgMCwgMzAsIERFQ09ERSB8IE9QVCwKLQkgb2Zmc2V0b2YoRmFjaWxpdHlfVVVJRSwgZmFzdFN0YXJ0KSwgX0ZhY2lsaXR5X1VVSUVfZmFzdFN0YXJ0fSwKLQl7Rk5BTUUoIm11bHRpcGxlQ2FsbHMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm1haW50YWluQ29ubmVjdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmFzdENvbm5lY3RSZWZ1c2VkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInNlcnZpY2VDb250cm9sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2lyY3VpdEluZm8iKSBTRVEsIDMsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU0tJUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkZXN0aW5hdGlvbkluZm8iKSBTRVEsIDYsIDgsIDEwLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImgyNDVTZWN1cml0eU1vZGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0NhbGxJZGVudGlmaWVyW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJndWlkIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfU2VjdXJpdHlTZXJ2aWNlTW9kZVtdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoIm5vblN0YW5kYXJkIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLCBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotCXtGTkFNRSgibm9uZSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkZWZhdWx0IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9TZWN1cml0eUNhcGFiaWxpdGllc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJlbmNyeXB0aW9uIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhULCAwLAotCSBfU2VjdXJpdHlTZXJ2aWNlTW9kZX0sCi0Je0ZOQU1FKCJhdXRoZW50aWNhdG9uIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhULCAwLAotCSBfU2VjdXJpdHlTZXJ2aWNlTW9kZX0sCi0Je0ZOQU1FKCJpbnRlZ3JpdHkiKSBDSE9JQ0UsIDIsIDMsIDMsIFNLSVAgfCBFWFQsIDAsCi0JIF9TZWN1cml0eVNlcnZpY2VNb2RlfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMjQ1U2VjdXJpdHlbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoIm5vU2VjdXJpdHkiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidGxzIikgU0VRLCAxLCA0LCA0LCBTS0lQIHwgRVhULCAwLCBfU2VjdXJpdHlDYXBhYmlsaXRpZXN9LAotCXtGTkFNRSgiaXBzZWMiKSBTRVEsIDEsIDQsIDQsIFNLSVAgfCBFWFQsIDAsIF9TZWN1cml0eUNhcGFiaWxpdGllc30sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfREhzZXRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImhhbGZrZXkiKSBCSVRTVFIsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibW9kU2l6ZSIpIEJJVFNUUiwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnZW5lcmF0b3IiKSBCSVRTVFIsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1R5cGVkQ2VydGlmaWNhdGVbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInR5cGUiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2VydGlmaWNhdGUiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gyMzVfTm9uU3RhbmRhcmRQYXJhbWV0ZXJbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoIm5vblN0YW5kYXJkSWRlbnRpZmllciIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkYXRhIikgT0NUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9DbGVhclRva2VuW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJ0b2tlbk9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0aW1lU3RhbXAiKSBJTlQsIENPTlMsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicGFzc3dvcmQiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGhrZXkiKSBTRVEsIDAsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIF9ESHNldH0sCi0Je0ZOQU1FKCJjaGFsbGVuZ2UiKSBPQ1RTVFIsIDcsIDgsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicmFuZG9tIikgSU5ULCBVTkNPLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNlcnRpZmljYXRlIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLAotCSBfVHlwZWRDZXJ0aWZpY2F0ZX0sCi0Je0ZOQU1FKCJnZW5lcmFsSUQiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9IMjM1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImVja2FzZGhrZXkiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic2VuZGVyc0lEIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9Qcm9ncmVzc19VVUlFX3Rva2Vuc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLwotCXtGTkFNRSgiaXRlbSIpIFNFUSwgOCwgOSwgMTEsIFNLSVAgfCBFWFQsIDAsIF9DbGVhclRva2VufSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9QYXJhbXNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInJhbkludCIpIElOVCwgVU5DTywgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpdjgiKSBPQ1RTVFIsIEZJWEQsIDgsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiaXYxNiIpIE9DVFNUUiwgRklYRCwgMTYsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9FUFB3ZEhhc2hfdG9rZW5bXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImFsZ29yaXRobU9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwYXJhbVMiKSBTRVEsIDIsIDIsIDMsIFNLSVAgfCBFWFQsIDAsIF9QYXJhbXN9LAotCXtGTkFNRSgiaGFzaCIpIEJJVFNUUiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0VQUHdkSGFzaFtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiYWxpYXMiKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAotCXtGTkFNRSgidGltZVN0YW1wIikgSU5ULCBDT05TLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRva2VuIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAotCSBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0VQUHdkSGFzaF90b2tlbn0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0dLUHdkSGFzaF90b2tlbltdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiYWxnb3JpdGhtT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInBhcmFtUyIpIFNFUSwgMiwgMiwgMywgU0tJUCB8IEVYVCwgMCwgX1BhcmFtc30sCi0Je0ZOQU1FKCJoYXNoIikgQklUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvR0tQd2RIYXNoW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJnYXRla2VlcGVySWQiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidGltZVN0YW1wIikgSU5ULCBDT05TLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRva2VuIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAotCSBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0dLUHdkSGFzaF90b2tlbn0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0VQUHdkRW5jcltdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiYWxnb3JpdGhtT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInBhcmFtUyIpIFNFUSwgMiwgMiwgMywgU0tJUCB8IEVYVCwgMCwgX1BhcmFtc30sCi0Je0ZOQU1FKCJlbmNyeXB0ZWREYXRhIikgT0NUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvR0tQd2RFbmNyW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJhbGdvcml0aG1PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicGFyYW1TIikgU0VRLCAyLCAyLCAzLCBTS0lQIHwgRVhULCAwLCBfUGFyYW1zfSwKLQl7Rk5BTUUoImVuY3J5cHRlZERhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9FUENlcnRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInRvQmVTaWduZWQiKSBTRVEsIDgsIDksIDExLCBTS0lQIHwgT1BFTiB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhbGdvcml0aG1PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicGFyYW1TIikgU0VRLCAyLCAyLCAzLCBTS0lQIHwgRVhULCAwLCBfUGFyYW1zfSwKLQl7Rk5BTUUoInNpZ25hdHVyZSIpIEJJVFNUUiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0dLQ2VydFtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgidG9CZVNpZ25lZCIpIFNFUSwgOCwgOSwgMTEsIFNLSVAgfCBPUEVOIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFsZ29yaXRobU9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwYXJhbVMiKSBTRVEsIDIsIDIsIDMsIFNLSVAgfCBFWFQsIDAsIF9QYXJhbXN9LAotCXtGTkFNRSgic2lnbmF0dXJlIikgQklUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvRmFzdFN0YXJ0W10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJ0b0JlU2lnbmVkIikgU0VRLCA4LCA5LCAxMSwgU0tJUCB8IE9QRU4gfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiYWxnb3JpdGhtT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInBhcmFtUyIpIFNFUSwgMiwgMiwgMywgU0tJUCB8IEVYVCwgMCwgX1BhcmFtc30sCi0Je0ZOQU1FKCJzaWduYXR1cmUiKSBCSVRTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0NyeXB0b1Rva2VuX2NyeXB0b0VuY3J5cHRlZFRva2VuX3Rva2VuW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJhbGdvcml0aG1PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicGFyYW1TIikgU0VRLCAyLCAyLCAzLCBTS0lQIHwgRVhULCAwLCBfUGFyYW1zfSwKLQl7Rk5BTUUoImVuY3J5cHRlZERhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0NyeXB0b1Rva2VuX2NyeXB0b0VuY3J5cHRlZFRva2VuW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJ0b2tlbk9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0b2tlbiIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKLQkgX0NyeXB0b1Rva2VuX2NyeXB0b0VuY3J5cHRlZFRva2VuX3Rva2VufSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9DcnlwdG9Ub2tlbl9jcnlwdG9TaWduZWRUb2tlbl90b2tlbltdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgidG9CZVNpZ25lZCIpIFNFUSwgOCwgOSwgMTEsIFNLSVAgfCBPUEVOIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFsZ29yaXRobU9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwYXJhbVMiKSBTRVEsIDIsIDIsIDMsIFNLSVAgfCBFWFQsIDAsIF9QYXJhbXN9LAotCXtGTkFNRSgic2lnbmF0dXJlIikgQklUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9DcnlwdG9Ub2tlbl9jcnlwdG9TaWduZWRUb2tlbltdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgidG9rZW5PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgidG9rZW4iKSBTRVEsIDAsIDQsIDQsIFNLSVAsIDAsCi0JIF9DcnlwdG9Ub2tlbl9jcnlwdG9TaWduZWRUb2tlbl90b2tlbn0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ3J5cHRvVG9rZW5fY3J5cHRvSGFzaGVkVG9rZW5fdG9rZW5bXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImFsZ29yaXRobU9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwYXJhbVMiKSBTRVEsIDIsIDIsIDMsIFNLSVAgfCBFWFQsIDAsIF9QYXJhbXN9LAotCXtGTkFNRSgiaGFzaCIpIEJJVFNUUiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ3J5cHRvVG9rZW5fY3J5cHRvSGFzaGVkVG9rZW5bXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInRva2VuT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImhhc2hlZFZhbHMiKSBTRVEsIDgsIDksIDExLCBTS0lQIHwgRVhULCAwLCBfQ2xlYXJUb2tlbn0sCi0Je0ZOQU1FKCJ0b2tlbiIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKLQkgX0NyeXB0b1Rva2VuX2NyeXB0b0hhc2hlZFRva2VuX3Rva2VufSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9DcnlwdG9Ub2tlbl9jcnlwdG9Qd2RFbmNyW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJhbGdvcml0aG1PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicGFyYW1TIikgU0VRLCAyLCAyLCAzLCBTS0lQIHwgRVhULCAwLCBfUGFyYW1zfSwKLQl7Rk5BTUUoImVuY3J5cHRlZERhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0NyeXB0b1Rva2VuW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgiY3J5cHRvRW5jcnlwdGVkVG9rZW4iKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsCi0JIF9DcnlwdG9Ub2tlbl9jcnlwdG9FbmNyeXB0ZWRUb2tlbn0sCi0Je0ZOQU1FKCJjcnlwdG9TaWduZWRUb2tlbiIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKLQkgX0NyeXB0b1Rva2VuX2NyeXB0b1NpZ25lZFRva2VufSwKLQl7Rk5BTUUoImNyeXB0b0hhc2hlZFRva2VuIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAotCSBfQ3J5cHRvVG9rZW5fY3J5cHRvSGFzaGVkVG9rZW59LAotCXtGTkFNRSgiY3J5cHRvUHdkRW5jciIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKLQkgX0NyeXB0b1Rva2VuX2NyeXB0b1B3ZEVuY3J9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0NyeXB0b0gzMjNUb2tlbltdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoImNyeXB0b0VQUHdkSGFzaCIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKLQkgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9FUFB3ZEhhc2h9LAotCXtGTkFNRSgiY3J5cHRvR0tQd2RIYXNoIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAotCSBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0dLUHdkSGFzaH0sCi0Je0ZOQU1FKCJjcnlwdG9FUFB3ZEVuY3IiKSBTRVEsIDAsIDMsIDMsIFNLSVAsIDAsCi0JIF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvRVBQd2RFbmNyfSwKLQl7Rk5BTUUoImNyeXB0b0dLUHdkRW5jciIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKLQkgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9HS1B3ZEVuY3J9LAotCXtGTkFNRSgiY3J5cHRvRVBDZXJ0IikgU0VRLCAwLCA0LCA0LCBTS0lQLCAwLAotCSBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0VQQ2VydH0sCi0Je0ZOQU1FKCJjcnlwdG9HS0NlcnQiKSBTRVEsIDAsIDQsIDQsIFNLSVAsIDAsCi0JIF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvR0tDZXJ0fSwKLQl7Rk5BTUUoImNyeXB0b0Zhc3RTdGFydCIpIFNFUSwgMCwgNCwgNCwgU0tJUCwgMCwKLQkgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9GYXN0U3RhcnR9LAotCXtGTkFNRSgibmVzdGVkY3J5cHRvVG9rZW4iKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQsIDAsCi0JIF9DcnlwdG9Ub2tlbn0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfUHJvZ3Jlc3NfVVVJRV9jcnlwdG9Ub2tlbnNbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDMsIDgsIDgsIFNLSVAgfCBFWFQsIDAsIF9DcnlwdG9IMzIzVG9rZW59LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1Byb2dyZXNzX1VVSUVfZmFzdFN0YXJ0W10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgU0VRLCAxLCAzLCA1LCBERUNPREUgfCBPUEVOIHwgRVhULAotCSBzaXplb2YoT3BlbkxvZ2ljYWxDaGFubmVsKSwgX09wZW5Mb2dpY2FsQ2hhbm5lbH0KLQksCi19OwotCi1zdGF0aWMgZmllbGRfdCBfUHJvZ3Jlc3NfVVVJRVtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRlc3RpbmF0aW9uSW5mbyIpIFNFUSwgNiwgOCwgMTAsIFNLSVAgfCBFWFQsIDAsCi0JIF9FbmRwb2ludFR5cGV9LAotCXtGTkFNRSgiaDI0NUFkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCB8IE9QVCwKLQkgb2Zmc2V0b2YoUHJvZ3Jlc3NfVVVJRSwgaDI0NUFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCi0Je0ZOQU1FKCJjYWxsSWRlbnRpZmllciIpIFNFUSwgMCwgMSwgMSwgU0tJUCB8IEVYVCwgMCwKLQkgX0NhbGxJZGVudGlmaWVyfSwKLQl7Rk5BTUUoImgyNDVTZWN1cml0eU1vZGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCi0JIF9IMjQ1U2VjdXJpdHl9LAotCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCi0JIF9Qcm9ncmVzc19VVUlFX3Rva2Vuc30sCi0Je0ZOQU1FKCJjcnlwdG9Ub2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKLQkgX1Byb2dyZXNzX1VVSUVfY3J5cHRvVG9rZW5zfSwKLQl7Rk5BTUUoImZhc3RTdGFydCIpIFNFUU9GLCBTRU1JLCAwLCAzMCwgREVDT0RFIHwgT1BULAotCSBvZmZzZXRvZihQcm9ncmVzc19VVUlFLCBmYXN0U3RhcnQpLCBfUHJvZ3Jlc3NfVVVJRV9mYXN0U3RhcnR9LAotCXtGTkFNRSgibXVsdGlwbGVDYWxscyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibWFpbnRhaW5Db25uZWN0aW9uIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmYXN0Q29ubmVjdFJlZnVzZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0gzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5W10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgic2V0dXAiKSBTRVEsIDcsIDEzLCAzOSwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSwgc2V0dXApLCBfU2V0dXBfVVVJRX0sCi0Je0ZOQU1FKCJjYWxsUHJvY2VlZGluZyIpIFNFUSwgMSwgMywgMTIsIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHksIGNhbGxQcm9jZWVkaW5nKSwKLQkgX0NhbGxQcm9jZWVkaW5nX1VVSUV9LAotCXtGTkFNRSgiY29ubmVjdCIpIFNFUSwgMSwgNCwgMTksIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHksIGNvbm5lY3QpLCBfQ29ubmVjdF9VVUlFfSwKLQl7Rk5BTUUoImFsZXJ0aW5nIikgU0VRLCAxLCAzLCAxNywgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSwgYWxlcnRpbmcpLCBfQWxlcnRpbmdfVVVJRX0sCi0Je0ZOQU1FKCJpbmZvcm1hdGlvbiIpIFNFUSwgMCwgMSwgNywgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSwgaW5mb3JtYXRpb24pLAotCSBfSW5mb3JtYXRpb25fVVVJRX0sCi0Je0ZOQU1FKCJyZWxlYXNlQ29tcGxldGUiKSBTRVEsIDEsIDIsIDExLCBTS0lQIHwgRVhULCAwLAotCSBfUmVsZWFzZUNvbXBsZXRlX1VVSUV9LAotCXtGTkFNRSgiZmFjaWxpdHkiKSBTRVEsIDMsIDUsIDIxLCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKEgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5LCBmYWNpbGl0eSksIF9GYWNpbGl0eV9VVUlFfSwKLQl7Rk5BTUUoInByb2dyZXNzIikgU0VRLCA1LCA4LCAxMSwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSwgcHJvZ3Jlc3MpLCBfUHJvZ3Jlc3NfVVVJRX0sCi0Je0ZOQU1FKCJlbXB0eSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzdGF0dXMiKSBTRVEsIDIsIDQsIDQsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic3RhdHVzSW5xdWlyeSIpIFNFUSwgMiwgNCwgNCwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzZXR1cEFja25vd2xlZGdlIikgU0VRLCAyLCA0LCA0LCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm5vdGlmeSIpIFNFUSwgMiwgNCwgNCwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfUmVxdWVzdE1lc3NhZ2VbXSA9IHsJLyogQ0hPSUNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtYXN0ZXJTbGF2ZURldGVybWluYXRpb24iKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidGVybWluYWxDYXBhYmlsaXR5U2V0IikgU0VRLCAzLCA1LCA1LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm9wZW5Mb2dpY2FsQ2hhbm5lbCIpIFNFUSwgMSwgMywgNSwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihSZXF1ZXN0TWVzc2FnZSwgb3BlbkxvZ2ljYWxDaGFubmVsKSwgX09wZW5Mb2dpY2FsQ2hhbm5lbH0sCi0Je0ZOQU1FKCJjbG9zZUxvZ2ljYWxDaGFubmVsIikgU0VRLCAwLCAyLCAzLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJlcXVlc3RDaGFubmVsQ2xvc2UiKSBTRVEsIDAsIDEsIDMsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibXVsdGlwbGV4RW50cnlTZW5kIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJlcXVlc3RNdWx0aXBsZXhFbnRyeSIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZXF1ZXN0TW9kZSIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyb3VuZFRyaXBEZWxheVJlcXVlc3QiKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibWFpbnRlbmFuY2VMb29wUmVxdWVzdCIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjb21tdW5pY2F0aW9uTW9kZVJlcXVlc3QiKSBTRVEsIDAsIDAsIDAsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY29uZmVyZW5jZVJlcXVlc3QiKSBDSE9JQ0UsIDMsIDgsIDE2LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm11bHRpbGlua1JlcXVlc3QiKSBDSE9JQ0UsIDMsIDUsIDUsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibG9naWNhbENoYW5uZWxSYXRlUmVxdWVzdCIpIFNFUSwgMCwgMywgMywgU1RPUCB8IEVYVCwgMCwKLQkgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc1tdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoImgyMjJMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMiKSBTRVEsIDMsIDUsIDUsIFNLSVAgfCBFWFQsIDAsCi0JIF9IMjIyTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKLQl7Rk5BTUUoImgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAxMCwgMTEsIDE0LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mCi0JIChPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzLAotCSAgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpLCBfSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnN9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX09wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJyZXZlcnNlTG9naWNhbENoYW5uZWxOdW1iZXIiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicG9ydE51bWJlciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtdWx0aXBsZXhQYXJhbWV0ZXJzIikgQ0hPSUNFLCAwLCAxLCAyLCBERUNPREUgfCBFWFQgfCBPUFQsCi0JIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAotCQkgIG11bHRpcGxleFBhcmFtZXRlcnMpLAotCSBfT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc30sCi0Je0ZOQU1FKCJyZXBsYWNlbWVudEZvciIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfbm9uU3RhbmRhcmRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsIF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVyc1tdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKLQkgX0gyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX25vblN0YW5kYXJkfSwKLQl7Rk5BTUUoInNlc3Npb25JRCIpIElOVCwgOCwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtZWRpYUNoYW5uZWwiKSBDSE9JQ0UsIDEsIDIsIDIsIERFQ09ERSB8IEVYVCB8IE9QVCwKLQkgb2Zmc2V0b2YoSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnMsIG1lZGlhQ2hhbm5lbCksCi0JIF9IMjQ1X1RyYW5zcG9ydEFkZHJlc3N9LAotCXtGTkFNRSgibWVkaWFDb250cm9sQ2hhbm5lbCIpIENIT0lDRSwgMSwgMiwgMiwgREVDT0RFIHwgRVhUIHwgT1BULAotCSBvZmZzZXRvZihIMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVycywgbWVkaWFDb250cm9sQ2hhbm5lbCksCi0JIF9IMjQ1X1RyYW5zcG9ydEFkZHJlc3N9LAotCXtGTkFNRSgiZHluYW1pY1JUUFBheWxvYWRUeXBlIikgSU5ULCA1LCA5NiwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmbG93Q29udHJvbFRvWmVybyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicG9ydE51bWJlciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgiaDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnMiKSBTRVEsIDUsIDUsIDcsIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzLAotCQkgIGgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzKSwKLQkgX0gyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9PcGVuTG9naWNhbENoYW5uZWxBY2tbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoImZvcndhcmRMb2dpY2FsQ2hhbm5lbE51bWJlciIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAyLCAzLCA0LAotCSBERUNPREUgfCBFWFQgfCBPUFQsIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbEFjaywKLQkJCQkgICAgICByZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSwKLQkgX09wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKLQl7Rk5BTUUoInNlcGFyYXRlU3RhY2siKSBTRVEsIDIsIDQsIDUsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnMiKSBDSE9JQ0UsIDAsIDEsIDEsCi0JIERFQ09ERSB8IEVYVCB8IE9QVCwgb2Zmc2V0b2YoT3BlbkxvZ2ljYWxDaGFubmVsQWNrLAotCQkJCSAgICAgIGZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzKSwKLQkgX09wZW5Mb2dpY2FsQ2hhbm5lbEFja19mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVyc30sCi0Je0ZOQU1FKCJlbmNyeXB0aW9uU3luYyIpIFNFUSwgMiwgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfUmVzcG9uc2VNZXNzYWdlW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibWFzdGVyU2xhdmVEZXRlcm1pbmF0aW9uQWNrIikgU0VRLCAwLCAxLCAxLCBTVE9QIHwgRVhULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoIm1hc3RlclNsYXZlRGV0ZXJtaW5hdGlvblJlamVjdCIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJ0ZXJtaW5hbENhcGFiaWxpdHlTZXRBY2siKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidGVybWluYWxDYXBhYmlsaXR5U2V0UmVqZWN0IikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgRVhULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoIm9wZW5Mb2dpY2FsQ2hhbm5lbEFjayIpIFNFUSwgMSwgMiwgNSwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihSZXNwb25zZU1lc3NhZ2UsIG9wZW5Mb2dpY2FsQ2hhbm5lbEFjayksCi0JIF9PcGVuTG9naWNhbENoYW5uZWxBY2t9LAotCXtGTkFNRSgib3BlbkxvZ2ljYWxDaGFubmVsUmVqZWN0IikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNsb3NlTG9naWNhbENoYW5uZWxBY2siKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicmVxdWVzdENoYW5uZWxDbG9zZUFjayIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZXF1ZXN0Q2hhbm5lbENsb3NlUmVqZWN0IikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgRVhULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoIm11bHRpcGxleEVudHJ5U2VuZEFjayIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtdWx0aXBsZXhFbnRyeVNlbmRSZWplY3QiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicmVxdWVzdE11bHRpcGxleEVudHJ5QWNrIikgU0VRLCAwLCAxLCAxLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJlcXVlc3RNdWx0aXBsZXhFbnRyeVJlamVjdCIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJyZXF1ZXN0TW9kZUFjayIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZXF1ZXN0TW9kZVJlamVjdCIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyb3VuZFRyaXBEZWxheVJlc3BvbnNlIikgU0VRLCAwLCAxLCAxLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm1haW50ZW5hbmNlTG9vcEFjayIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtYWludGVuYW5jZUxvb3BSZWplY3QiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY29tbXVuaWNhdGlvbk1vZGVSZXNwb25zZSIpIENIT0lDRSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJjb25mZXJlbmNlUmVzcG9uc2UiKSBDSE9JQ0UsIDMsIDgsIDE2LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm11bHRpbGlua1Jlc3BvbnNlIikgQ0hPSUNFLCAzLCA1LCA1LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImxvZ2ljYWxDaGFubmVsUmF0ZUFja25vd2xlZGdlIikgU0VRLCAwLCAzLCAzLCBTVE9QIHwgRVhULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoImxvZ2ljYWxDaGFubmVsUmF0ZVJlamVjdCIpIFNFUSwgMSwgNCwgNCwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgicmVxdWVzdCIpIENIT0lDRSwgNCwgMTEsIDE1LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKE11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSwgcmVxdWVzdCksIF9SZXF1ZXN0TWVzc2FnZX0sCi0Je0ZOQU1FKCJyZXNwb25zZSIpIENIT0lDRSwgNSwgMTksIDI0LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKE11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSwgcmVzcG9uc2UpLAotCSBfUmVzcG9uc2VNZXNzYWdlfSwKLQl7Rk5BTUUoImNvbW1hbmQiKSBDSE9JQ0UsIDMsIDcsIDEyLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImluZGljYXRpb24iKSBDSE9JQ0UsIDQsIDE0LCAyMywgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSDMyM19VVV9QRFVfaDI0NUNvbnRyb2xbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDIsIDQsIDQsIERFQ09ERSB8IE9QRU4gfCBFWFQsCi0JIHNpemVvZihNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UpLAotCSBfTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlfQotCSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMzIzX1VVX1BEVVtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiaDMyMy1tZXNzYWdlLWJvZHkiKSBDSE9JQ0UsIDMsIDcsIDEzLCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKEgzMjNfVVVfUERVLCBoMzIzX21lc3NhZ2VfYm9keSksCi0JIF9IMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keX0sCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJoNDUwMVN1cHBsZW1lbnRhcnlTZXJ2aWNlIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgiaDI0NVR1bm5lbGluZyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiaDI0NUNvbnRyb2wiKSBTRVFPRiwgU0VNSSwgMCwgNCwgREVDT0RFIHwgT1BULAotCSBvZmZzZXRvZihIMzIzX1VVX1BEVSwgaDI0NUNvbnRyb2wpLCBfSDMyM19VVV9QRFVfaDI0NUNvbnRyb2x9LAotCXtGTkFNRSgibm9uU3RhbmRhcmRDb250cm9sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2FsbExpbmthZ2UiKSBTRVEsIDIsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidHVubmVsbGVkU2lnbmFsbGluZ01lc3NhZ2UiKSBTRVEsIDIsIDQsIDQsIFNUT1AgfCBFWFQgfCBPUFQsCi0JIDAsIE5VTEx9LAotCXtGTkFNRSgicHJvdmlzaW9uYWxSZXNwVG9IMjQ1VHVubmVsaW5nIikgTlVMLCBGSVhELCAwLCAwLCBTVE9QIHwgT1BULAotCSAwLCBOVUxMfSwKLQl7Rk5BTUUoInN0aW11bHVzQ29udHJvbCIpIFNFUSwgMywgMywgMywgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9IMzIzX1VzZXJJbmZvcm1hdGlvbltdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgiaDMyMy11dS1wZHUiKSBTRVEsIDEsIDIsIDExLCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKEgzMjNfVXNlckluZm9ybWF0aW9uLCBoMzIzX3V1X3BkdSksIF9IMzIzX1VVX1BEVX0sCi0Je0ZOQU1FKCJ1c2VyLWRhdGEiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0dhdGVrZWVwZXJSZXF1ZXN0W10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJyZXF1ZXN0U2VxTnVtIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInByb3RvY29sSWRlbnRpZmllciIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJyYXNBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKEdhdGVrZWVwZXJSZXF1ZXN0LCByYXNBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3N9LAotCXtGTkFNRSgiZW5kcG9pbnRUeXBlIikgU0VRLCA2LCA4LCAxMCwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnYXRla2VlcGVySWRlbnRpZmllciIpIEJNUFNUUiwgNywgMSwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYWxsU2VydmljZXMiKSBTRVEsIDAsIDgsIDgsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZW5kcG9pbnRBbGlhcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFsdGVybmF0ZUVuZHBvaW50cyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImF1dGhlbnRpY2F0aW9uQ2FwYWJpbGl0eSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoImFsZ29yaXRobU9JRHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpbnRlZ3JpdHkiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpbnRlZ3JpdHlDaGVja1ZhbHVlIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN1cHBvcnRzQWx0R0siKSBOVUwsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9HYXRla2VlcGVyQ29uZmlybVtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgicmVxdWVzdFNlcU51bSIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgT1BULCAwLAotCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAotCXtGTkFNRSgiZ2F0ZWtlZXBlcklkZW50aWZpZXIiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicmFzQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihHYXRla2VlcGVyQ29uZmlybSwgcmFzQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImFsdGVybmF0ZUdhdGVrZWVwZXIiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhdXRoZW50aWNhdGlvbk1vZGUiKSBDSE9JQ0UsIDMsIDcsIDgsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiYWxnb3JpdGhtT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImludGVncml0eSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImludGVncml0eUNoZWNrVmFsdWUiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9SZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQsCi0JIHNpemVvZihUcmFuc3BvcnRBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3N9Ci0JLAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1JlZ2lzdHJhdGlvblJlcXVlc3RfcmFzQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLwotCXtGTkFNRSgiaXRlbSIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAotCSBzaXplb2YoVHJhbnNwb3J0QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfQotCSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9SZWdpc3RyYXRpb25SZXF1ZXN0X3Rlcm1pbmFsQWxpYXNbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1JlZ2lzdHJhdGlvblJlcXVlc3RbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInJlcXVlc3RTZXFOdW0iKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKLQkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImRpc2NvdmVyeUNvbXBsZXRlIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYWxsU2lnbmFsQWRkcmVzcyIpIFNFUU9GLCBTRU1JLCAwLCAxMCwgREVDT0RFLAotCSBvZmZzZXRvZihSZWdpc3RyYXRpb25SZXF1ZXN0LCBjYWxsU2lnbmFsQWRkcmVzcyksCi0JIF9SZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzfSwKLQl7Rk5BTUUoInJhc0FkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMTAsIERFQ09ERSwKLQkgb2Zmc2V0b2YoUmVnaXN0cmF0aW9uUmVxdWVzdCwgcmFzQWRkcmVzcyksCi0JIF9SZWdpc3RyYXRpb25SZXF1ZXN0X3Jhc0FkZHJlc3N9LAotCXtGTkFNRSgidGVybWluYWxUeXBlIikgU0VRLCA2LCA4LCAxMCwgU0tJUCB8IEVYVCwgMCwgX0VuZHBvaW50VHlwZX0sCi0Je0ZOQU1FKCJ0ZXJtaW5hbEFsaWFzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCi0JIF9SZWdpc3RyYXRpb25SZXF1ZXN0X3Rlcm1pbmFsQWxpYXN9LAotCXtGTkFNRSgiZ2F0ZWtlZXBlcklkZW50aWZpZXIiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZW5kcG9pbnRWZW5kb3IiKSBTRVEsIDIsIDMsIDMsIFNLSVAgfCBFWFQsIDAsCi0JIF9WZW5kb3JJZGVudGlmaWVyfSwKLQl7Rk5BTUUoImFsdGVybmF0ZUVuZHBvaW50cyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRpbWVUb0xpdmUiKSBJTlQsIENPTlMsIDEsIDAsIERFQ09ERSB8IE9QVCwKLQkgb2Zmc2V0b2YoUmVnaXN0cmF0aW9uUmVxdWVzdCwgdGltZVRvTGl2ZSksIE5VTEx9LAotCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiaW50ZWdyaXR5Q2hlY2tWYWx1ZSIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJrZWVwQWxpdmUiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImVuZHBvaW50SWRlbnRpZmllciIpIEJNUFNUUiwgNywgMSwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ3aWxsU3VwcGx5VVVJRXMiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm1haW50YWluQ29ubmVjdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAotCXtGTkFNRSgiYWx0ZXJuYXRlVHJhbnNwb3J0QWRkcmVzc2VzIikgU0VRLCAxLCAxLCAxLCBTVE9QIHwgRVhUIHwgT1BULAotCSAwLCBOVUxMfSwKLQl7Rk5BTUUoImFkZGl0aXZlUmVnaXN0cmF0aW9uIikgTlVMLCBGSVhELCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRlcm1pbmFsQWxpYXNQYXR0ZXJuIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgic3VwcG9ydHNBbHRHSyIpIE5VTCwgRklYRCwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ1c2FnZVJlcG9ydGluZ0NhcGFiaWxpdHkiKSBTRVEsIDMsIDQsIDQsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgibXVsdGlwbGVDYWxscyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic3VwcG9ydGVkSDI0OFBhY2thZ2VzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgiY2FsbENyZWRpdENhcGFiaWxpdHkiKSBTRVEsIDIsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgiY2FwYWNpdHlSZXBvcnRpbmdDYXBhYmlsaXR5IikgU0VRLCAwLCAxLCAxLCBTVE9QIHwgRVhUIHwgT1BULAotCSAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZlYXR1cmVTZXQiKSBTRVEsIDMsIDQsIDQsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZ2VuZXJpY0RhdGEiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfUmVnaXN0cmF0aW9uQ29uZmlybV9jYWxsU2lnbmFsQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLwotCXtGTkFNRSgiaXRlbSIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAotCSBzaXplb2YoVHJhbnNwb3J0QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfQotCSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9SZWdpc3RyYXRpb25Db25maXJtX3Rlcm1pbmFsQWxpYXNbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX1JlZ2lzdHJhdGlvbkNvbmZpcm1bXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInJlcXVlc3RTZXFOdW0iKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKLQkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKLQl7Rk5BTUUoImNhbGxTaWduYWxBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDEwLCBERUNPREUsCi0JIG9mZnNldG9mKFJlZ2lzdHJhdGlvbkNvbmZpcm0sIGNhbGxTaWduYWxBZGRyZXNzKSwKLQkgX1JlZ2lzdHJhdGlvbkNvbmZpcm1fY2FsbFNpZ25hbEFkZHJlc3N9LAotCXtGTkFNRSgidGVybWluYWxBbGlhcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLAotCSBfUmVnaXN0cmF0aW9uQ29uZmlybV90ZXJtaW5hbEFsaWFzfSwKLQl7Rk5BTUUoImdhdGVrZWVwZXJJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImVuZHBvaW50SWRlbnRpZmllciIpIEJNUFNUUiwgNywgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhbHRlcm5hdGVHYXRla2VlcGVyIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidGltZVRvTGl2ZSIpIElOVCwgQ09OUywgMSwgMCwgREVDT0RFIHwgT1BULAotCSBvZmZzZXRvZihSZWdpc3RyYXRpb25Db25maXJtLCB0aW1lVG9MaXZlKSwgTlVMTH0sCi0Je0ZOQU1FKCJ0b2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjcnlwdG9Ub2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpbnRlZ3JpdHlDaGVja1ZhbHVlIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoIndpbGxSZXNwb25kVG9JUlIiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInByZUdyYW50ZWRBUlEiKSBTRVEsIDAsIDQsIDgsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibWFpbnRhaW5Db25uZWN0aW9uIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzZXJ2aWNlQ29udHJvbCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN1cHBvcnRzQWRkaXRpdmVSZWdpc3RyYXRpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgidGVybWluYWxBbGlhc1BhdHRlcm4iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJzdXBwb3J0ZWRQcmVmaXhlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInVzYWdlU3BlYyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImZlYXR1cmVTZXJ2ZXJBbGlhcyIpIENIT0lDRSwgMSwgMiwgNywgU1RPUCB8IEVYVCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJjYXBhY2l0eVJlcG9ydGluZ1NwZWMiKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9VbnJlZ2lzdHJhdGlvblJlcXVlc3RfY2FsbFNpZ25hbEFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCwKLQkgc2l6ZW9mKFRyYW5zcG9ydEFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30KLQksCi19OwotCi1zdGF0aWMgZmllbGRfdCBfVW5yZWdpc3RyYXRpb25SZXF1ZXN0W10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJyZXF1ZXN0U2VxTnVtIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhbGxTaWduYWxBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDEwLCBERUNPREUsCi0JIG9mZnNldG9mKFVucmVnaXN0cmF0aW9uUmVxdWVzdCwgY2FsbFNpZ25hbEFkZHJlc3MpLAotCSBfVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzfSwKLQl7Rk5BTUUoImVuZHBvaW50QWxpYXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFsdGVybmF0ZUVuZHBvaW50cyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImdhdGVrZWVwZXJJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImludGVncml0eUNoZWNrVmFsdWUiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicmVhc29uIikgQ0hPSUNFLCAyLCA0LCA1LCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImVuZHBvaW50QWxpYXNQYXR0ZXJuIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgic3VwcG9ydGVkUHJlZml4ZXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhbHRlcm5hdGVHYXRla2VlcGVyIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZ2VuZXJpY0RhdGEiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfQ2FsbE1vZGVsW10gPSB7CS8qIENIT0lDRSAqLwotCXtGTkFNRSgiZGlyZWN0IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImdhdGVrZWVwZXJSb3V0ZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0FkbWlzc2lvblJlcXVlc3RfZGVzdGluYXRpb25JbmZvW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhULCAwLCBfQWxpYXNBZGRyZXNzfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9BZG1pc3Npb25SZXF1ZXN0X2Rlc3RFeHRyYUNhbGxJbmZvW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhULCAwLCBfQWxpYXNBZGRyZXNzfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9BZG1pc3Npb25SZXF1ZXN0X3NyY0luZm9bXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KLQl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0FkbWlzc2lvblJlcXVlc3RbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInJlcXVlc3RTZXFOdW0iKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2FsbFR5cGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQsIDAsIF9DYWxsVHlwZX0sCi0Je0ZOQU1FKCJjYWxsTW9kZWwiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIF9DYWxsTW9kZWx9LAotCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRlc3RpbmF0aW9uSW5mbyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLAotCSBfQWRtaXNzaW9uUmVxdWVzdF9kZXN0aW5hdGlvbkluZm99LAotCXtGTkFNRSgiZGVzdENhbGxTaWduYWxBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQgfCBPUFQsCi0JIG9mZnNldG9mKEFkbWlzc2lvblJlcXVlc3QsIGRlc3RDYWxsU2lnbmFsQWRkcmVzcyksCi0JIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImRlc3RFeHRyYUNhbGxJbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCi0JIF9BZG1pc3Npb25SZXF1ZXN0X2Rlc3RFeHRyYUNhbGxJbmZvfSwKLQl7Rk5BTUUoInNyY0luZm8iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwKLQkgX0FkbWlzc2lvblJlcXVlc3Rfc3JjSW5mb30sCi0Je0ZOQU1FKCJzcmNDYWxsU2lnbmFsQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAotCSBvZmZzZXRvZihBZG1pc3Npb25SZXF1ZXN0LCBzcmNDYWxsU2lnbmFsQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImJhbmRXaWR0aCIpIElOVCwgQ09OUywgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYWxsUmVmZXJlbmNlVmFsdWUiKSBJTlQsIFdPUkQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAotCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhbGxTZXJ2aWNlcyIpIFNFUSwgMCwgOCwgOCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjb25mZXJlbmNlSUQiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTVE9QLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFjdGl2ZU1DIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhbnN3ZXJDYWxsIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYW5NYXBBbGlhcyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2FsbElkZW50aWZpZXIiKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic3JjQWx0ZXJuYXRpdmVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdEFsdGVybmF0aXZlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImdhdGVrZWVwZXJJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImludGVncml0eUNoZWNrVmFsdWUiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidHJhbnNwb3J0UU9TIikgQ0hPSUNFLCAyLCAzLCAzLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoIndpbGxTdXBwbHlVVUlFcyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2FsbExpbmthZ2UiKSBTRVEsIDIsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZ2F0ZXdheURhdGFSYXRlIikgU0VRLCAyLCAzLCAzLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNpcmN1aXRJbmZvIikgU0VRLCAzLCAzLCAzLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRlc2lyZWRQcm90b2NvbHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkZXNpcmVkVHVubmVsbGVkUHJvdG9jb2wiKSBTRVEsIDEsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9BZG1pc3Npb25Db25maXJtW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJyZXF1ZXN0U2VxTnVtIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImJhbmRXaWR0aCIpIElOVCwgQ09OUywgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYWxsTW9kZWwiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsIF9DYWxsTW9kZWx9LAotCXtGTkFNRSgiZGVzdENhbGxTaWduYWxBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKEFkbWlzc2lvbkNvbmZpcm0sIGRlc3RDYWxsU2lnbmFsQWRkcmVzcyksCi0JIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImlyckZyZXF1ZW5jeSIpIElOVCwgV09SRCwgMSwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdGluYXRpb25JbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdEV4dHJhQ2FsbEluZm8iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkZXN0aW5hdGlvblR5cGUiKSBTRVEsIDYsIDgsIDEwLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJlbW90ZUV4dGVuc2lvbkFkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJhbHRlcm5hdGVFbmRwb2ludHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0b2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjcnlwdG9Ub2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpbnRlZ3JpdHlDaGVja1ZhbHVlIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRyYW5zcG9ydFFPUyIpIENIT0lDRSwgMiwgMywgMywgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ3aWxsUmVzcG9uZFRvSVJSIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ1dWllc1JlcXVlc3RlZCIpIFNFUSwgMCwgOSwgMTMsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibGFuZ3VhZ2UiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJhbHRlcm5hdGVUcmFuc3BvcnRBZGRyZXNzZXMiKSBTRVEsIDEsIDEsIDEsIFNUT1AgfCBFWFQgfCBPUFQsCi0JIDAsIE5VTEx9LAotCXtGTkFNRSgidXNlU3BlY2lmaWVkVHJhbnNwb3J0IikgQ0hPSUNFLCAxLCAyLCAyLCBTVE9QIHwgRVhUIHwgT1BULCAwLAotCSBOVUxMfSwKLQl7Rk5BTUUoImNpcmN1aXRJbmZvIikgU0VRLCAzLCAzLCAzLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInVzYWdlU3BlYyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInN1cHBvcnRlZFByb3RvY29scyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInNlcnZpY2VDb250cm9sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibXVsdGlwbGVDYWxscyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9Mb2NhdGlvblJlcXVlc3RfZGVzdGluYXRpb25JbmZvW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCi0Je0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhULCAwLCBfQWxpYXNBZGRyZXNzfSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9Mb2NhdGlvblJlcXVlc3RbXSA9IHsJLyogU0VRVUVOQ0UgKi8KLQl7Rk5BTUUoInJlcXVlc3RTZXFOdW0iKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAotCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRlc3RpbmF0aW9uSW5mbyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLAotCSBfTG9jYXRpb25SZXF1ZXN0X2Rlc3RpbmF0aW9uSW5mb30sCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJyZXBseUFkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoTG9jYXRpb25SZXF1ZXN0LCByZXBseUFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCi0Je0ZOQU1FKCJzb3VyY2VJbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2FuTWFwQWxpYXMiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImdhdGVrZWVwZXJJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImludGVncml0eUNoZWNrVmFsdWUiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzaXJlZFByb3RvY29scyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImRlc2lyZWRUdW5uZWxsZWRQcm90b2NvbCIpIFNFUSwgMSwgMiwgMiwgU1RPUCB8IEVYVCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJmZWF0dXJlU2V0IikgU0VRLCAzLCA0LCA0LCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImdlbmVyaWNEYXRhIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiaG9wQ291bnQiKSBJTlQsIDgsIDEsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2lyY3VpdEluZm8iKSBTRVEsIDMsIDMsIDMsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotfTsKLQotc3RhdGljIGZpZWxkX3QgX0xvY2F0aW9uQ29uZmlybVtdID0gewkvKiBTRVFVRU5DRSAqLwotCXtGTkFNRSgicmVxdWVzdFNlcU51bSIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjYWxsU2lnbmFsQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihMb2NhdGlvbkNvbmZpcm0sIGNhbGxTaWduYWxBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3N9LAotCXtGTkFNRSgicmFzQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihMb2NhdGlvbkNvbmZpcm0sIHJhc0FkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdGluYXRpb25JbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGVzdEV4dHJhQ2FsbEluZm8iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkZXN0aW5hdGlvblR5cGUiKSBTRVEsIDYsIDgsIDEwLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJlbW90ZUV4dGVuc2lvbkFkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJhbHRlcm5hdGVFbmRwb2ludHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ0b2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJjcnlwdG9Ub2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpbnRlZ3JpdHlDaGVja1ZhbHVlIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFsdGVybmF0ZVRyYW5zcG9ydEFkZHJlc3NlcyIpIFNFUSwgMSwgMSwgMSwgU1RPUCB8IEVYVCB8IE9QVCwKLQkgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzdXBwb3J0ZWRQcm90b2NvbHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJtdWx0aXBsZUNhbGxzIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJmZWF0dXJlU2V0IikgU0VRLCAzLCA0LCA0LCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImdlbmVyaWNEYXRhIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY2lyY3VpdEluZm8iKSBTRVEsIDMsIDMsIDMsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgic2VydmljZUNvbnRyb2wiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfSW5mb1JlcXVlc3RSZXNwb25zZV9jYWxsU2lnbmFsQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLwotCXtGTkFNRSgiaXRlbSIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAotCSBzaXplb2YoVHJhbnNwb3J0QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfQotCSwKLX07Ci0KLXN0YXRpYyBmaWVsZF90IF9JbmZvUmVxdWVzdFJlc3BvbnNlW10gPSB7CS8qIFNFUVVFTkNFICovCi0Je0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCi0JIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCi0Je0ZOQU1FKCJyZXF1ZXN0U2VxTnVtIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImVuZHBvaW50VHlwZSIpIFNFUSwgNiwgOCwgMTAsIFNLSVAgfCBFWFQsIDAsIF9FbmRwb2ludFR5cGV9LAotCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKLQl7Rk5BTUUoInJhc0FkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoSW5mb1JlcXVlc3RSZXNwb25zZSwgcmFzQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKLQl7Rk5BTUUoImNhbGxTaWduYWxBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDEwLCBERUNPREUsCi0JIG9mZnNldG9mKEluZm9SZXF1ZXN0UmVzcG9uc2UsIGNhbGxTaWduYWxBZGRyZXNzKSwKLQkgX0luZm9SZXF1ZXN0UmVzcG9uc2VfY2FsbFNpZ25hbEFkZHJlc3N9LAotCXtGTkFNRSgiZW5kcG9pbnRBbGlhcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInBlckNhbGxJbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiaW50ZWdyaXR5Q2hlY2tWYWx1ZSIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJuZWVkUmVzcG9uc2UiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKLQl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImlyclN0YXR1cyIpIENIT0lDRSwgMiwgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ1bnNvbGljaXRlZCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAotCXtGTkFNRSgiZ2VuZXJpY0RhdGEiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCi19OwotCi1zdGF0aWMgZmllbGRfdCBfUmFzTWVzc2FnZVtdID0gewkvKiBDSE9JQ0UgKi8KLQl7Rk5BTUUoImdhdGVrZWVwZXJSZXF1ZXN0IikgU0VRLCA0LCA4LCAxOCwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihSYXNNZXNzYWdlLCBnYXRla2VlcGVyUmVxdWVzdCksIF9HYXRla2VlcGVyUmVxdWVzdH0sCi0Je0ZOQU1FKCJnYXRla2VlcGVyQ29uZmlybSIpIFNFUSwgMiwgNSwgMTQsIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoUmFzTWVzc2FnZSwgZ2F0ZWtlZXBlckNvbmZpcm0pLCBfR2F0ZWtlZXBlckNvbmZpcm19LAotCXtGTkFNRSgiZ2F0ZWtlZXBlclJlamVjdCIpIFNFUSwgMiwgNSwgMTEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgicmVnaXN0cmF0aW9uUmVxdWVzdCIpIFNFUSwgMywgMTAsIDMxLCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKFJhc01lc3NhZ2UsIHJlZ2lzdHJhdGlvblJlcXVlc3QpLCBfUmVnaXN0cmF0aW9uUmVxdWVzdH0sCi0Je0ZOQU1FKCJyZWdpc3RyYXRpb25Db25maXJtIikgU0VRLCAzLCA3LCAyNCwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihSYXNNZXNzYWdlLCByZWdpc3RyYXRpb25Db25maXJtKSwgX1JlZ2lzdHJhdGlvbkNvbmZpcm19LAotCXtGTkFNRSgicmVnaXN0cmF0aW9uUmVqZWN0IikgU0VRLCAyLCA1LCAxMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJ1bnJlZ2lzdHJhdGlvblJlcXVlc3QiKSBTRVEsIDMsIDUsIDE1LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKFJhc01lc3NhZ2UsIHVucmVnaXN0cmF0aW9uUmVxdWVzdCksIF9VbnJlZ2lzdHJhdGlvblJlcXVlc3R9LAotCXtGTkFNRSgidW5yZWdpc3RyYXRpb25Db25maXJtIikgU0VRLCAxLCAyLCA2LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoInVucmVnaXN0cmF0aW9uUmVqZWN0IikgU0VRLCAxLCAzLCA4LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImFkbWlzc2lvblJlcXVlc3QiKSBTRVEsIDcsIDE2LCAzNCwgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihSYXNNZXNzYWdlLCBhZG1pc3Npb25SZXF1ZXN0KSwgX0FkbWlzc2lvblJlcXVlc3R9LAotCXtGTkFNRSgiYWRtaXNzaW9uQ29uZmlybSIpIFNFUSwgMiwgNiwgMjcsIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoUmFzTWVzc2FnZSwgYWRtaXNzaW9uQ29uZmlybSksIF9BZG1pc3Npb25Db25maXJtfSwKLQl7Rk5BTUUoImFkbWlzc2lvblJlamVjdCIpIFNFUSwgMSwgMywgMTEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiYmFuZHdpZHRoUmVxdWVzdCIpIFNFUSwgMiwgNywgMTgsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiYmFuZHdpZHRoQ29uZmlybSIpIFNFUSwgMSwgMywgOCwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJiYW5kd2lkdGhSZWplY3QiKSBTRVEsIDEsIDQsIDksIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGlzZW5nYWdlUmVxdWVzdCIpIFNFUSwgMSwgNiwgMTksIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiZGlzZW5nYWdlQ29uZmlybSIpIFNFUSwgMSwgMiwgOSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJkaXNlbmdhZ2VSZWplY3QiKSBTRVEsIDEsIDMsIDgsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgibG9jYXRpb25SZXF1ZXN0IikgU0VRLCAyLCA1LCAxNywgREVDT0RFIHwgRVhULAotCSBvZmZzZXRvZihSYXNNZXNzYWdlLCBsb2NhdGlvblJlcXVlc3QpLCBfTG9jYXRpb25SZXF1ZXN0fSwKLQl7Rk5BTUUoImxvY2F0aW9uQ29uZmlybSIpIFNFUSwgMSwgNCwgMTksIERFQ09ERSB8IEVYVCwKLQkgb2Zmc2V0b2YoUmFzTWVzc2FnZSwgbG9jYXRpb25Db25maXJtKSwgX0xvY2F0aW9uQ29uZmlybX0sCi0Je0ZOQU1FKCJsb2NhdGlvblJlamVjdCIpIFNFUSwgMSwgMywgMTAsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgiaW5mb1JlcXVlc3QiKSBTRVEsIDIsIDQsIDE1LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLQl7Rk5BTUUoImluZm9SZXF1ZXN0UmVzcG9uc2UiKSBTRVEsIDMsIDgsIDE2LCBERUNPREUgfCBFWFQsCi0JIG9mZnNldG9mKFJhc01lc3NhZ2UsIGluZm9SZXF1ZXN0UmVzcG9uc2UpLCBfSW5mb1JlcXVlc3RSZXNwb25zZX0sCi0Je0ZOQU1FKCJub25TdGFuZGFyZE1lc3NhZ2UiKSBTRVEsIDAsIDIsIDcsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAotCXtGTkFNRSgidW5rbm93bk1lc3NhZ2VSZXNwb25zZSIpIFNFUSwgMCwgMSwgNSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZXF1ZXN0SW5Qcm9ncmVzcyIpIFNFUSwgNCwgNiwgNiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJyZXNvdXJjZXNBdmFpbGFibGVJbmRpY2F0ZSIpIFNFUSwgNCwgOSwgMTEsIFNUT1AgfCBFWFQsIDAsCi0JIE5VTEx9LAotCXtGTkFNRSgicmVzb3VyY2VzQXZhaWxhYmxlQ29uZmlybSIpIFNFUSwgNCwgNiwgNywgU1RPUCB8IEVYVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJpbmZvUmVxdWVzdEFjayIpIFNFUSwgNCwgNSwgNSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJpbmZvUmVxdWVzdE5hayIpIFNFUSwgNSwgNywgNywgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCi0Je0ZOQU1FKCJzZXJ2aWNlQ29udHJvbEluZGljYXRpb24iKSBTRVEsIDgsIDEwLCAxMCwgU1RPUCB8IEVYVCwgMCwKLQkgTlVMTH0sCi0Je0ZOQU1FKCJzZXJ2aWNlQ29udHJvbFJlc3BvbnNlIikgU0VRLCA3LCA4LCA4LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKLX07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMKaW5kZXggYTJhZjVlMC4uNGQxOTM3MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19oZWxwZXJfcHB0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX3BwdHAuYwpAQCAtMTI0LDYgKzEyNCw4IEBACiBzdGF0aWMgdm9pZCBwcHRwX2V4cGVjdGZuKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAogCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCiB7CisJdHlwZW9mKGlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pIGlwX25hdF9wcHRwX2V4cGVjdGZuOworCiAJREVCVUdQKCJpbmNyZWFzaW5nIHRpbWVvdXRzXG4iKTsKIAogCS8qIGluY3JlYXNlIHRpbWVvdXQgb2YgR1JFIGRhdGEgY2hhbm5lbCBjb25udHJhY2sgZW50cnkgKi8KQEAgLTEzMyw3ICsxMzUsOSBAQAogCS8qIENhbiB5b3Ugc2VlIGhvdyBydXN0eSB0aGlzIGNvZGUgaXMsIGNvbXBhcmVkIHdpdGggdGhlIHByZS0yLjYuMTEKIAkgKiBvbmU/IFRoYXQncyB3aGF0IGhhcHBlbmVkIHRvIG15IHNoaW55IG5ld25hdCBvZiAyMDAyIDsoIC1IVyAqLwogCi0JaWYgKCFpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKSB7CisJcmN1X3JlYWRfbG9jaygpOworCWlwX25hdF9wcHRwX2V4cGVjdGZuID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pOworCWlmICghaXBfbmF0X3BwdHBfZXhwZWN0Zm4pIHsKIAkJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSBpbnZfdDsKIAkJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cF9vdGhlcjsKIApAQCAtMTQyLDcgKzE0Niw3IEBACiAJCURFQlVHUCgidHJ5aW5nIHRvIHVuZXhwZWN0IG90aGVyIGRpcjogIik7CiAJCURVTVBfVFVQTEUoJmludl90KTsKIAotCQlleHBfb3RoZXIgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoJmludl90KTsKKwkJZXhwX290aGVyID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCgmaW52X3QpOwogCQlpZiAoZXhwX290aGVyKSB7CiAJCQkvKiBkZWxldGUgb3RoZXIgZXhwZWN0YXRpb24uICAqLwogCQkJREVCVUdQKCJmb3VuZFxuIik7CkBAIC0xNTMsOCArMTU3LDkgQEAKIAkJfQogCX0gZWxzZSB7CiAJCS8qIHdlIG5lZWQgbW9yZSB0aGFuIHNpbXBsZSBpbnZlcnNpb24gKi8KLQkJaXBfbmF0X3BwdHBfaG9va19leHBlY3RmbihjdCwgZXhwKTsKKwkJaXBfbmF0X3BwdHBfZXhwZWN0Zm4oY3QsIGV4cCk7CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgaW50IGRlc3Ryb3lfc2libGluZ19vcl9leHAoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdCkKQEAgLTE3Niw3ICsxODEsNyBAQAogCQlpcF9jb25udHJhY2tfcHV0KHNpYmxpbmcpOwogCQlyZXR1cm4gMTsKIAl9IGVsc2UgewotCQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQodCk7CisJCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQodCk7CiAJCWlmIChleHApIHsKIAkJCURFQlVHUCgidW5leHBlY3RfcmVsYXRlZCBvZiBleHBlY3QgJXBcbiIsIGV4cCk7CiAJCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOwpAQCAtMjI2LDYgKzIzMSw3IEBACiB7CiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cF9vcmlnLCAqZXhwX3JlcGx5OwogCWludCByZXQgPSAxOworCXR5cGVvZihpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpIGlwX25hdF9wcHRwX2V4cF9ncmU7CiAKIAlleHBfb3JpZyA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOwogCWlmIChleHBfb3JpZyA9PSBOVUxMKQpAQCAtMjYyLDggKzI2OCw5IEBACiAJZXhwX3JlcGx5LT50dXBsZS5kc3QudS5ncmUua2V5ID0gcGVlcl9jYWxsaWQ7CiAJZXhwX3JlcGx5LT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX0dSRTsKIAotCWlmIChpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpCi0JCWlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZShleHBfb3JpZywgZXhwX3JlcGx5KTsKKwlpcF9uYXRfcHB0cF9leHBfZ3JlID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSk7CisJaWYgKGlwX25hdF9wcHRwX2V4cF9ncmUpCisJCWlwX25hdF9wcHRwX2V4cF9ncmUoZXhwX29yaWcsIGV4cF9yZXBseSk7CiAJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHBfb3JpZykgIT0gMCkKIAkJZ290byBvdXRfcHV0X2JvdGg7CiAJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHBfcmVwbHkpICE9IDApCkBAIC0zMDMsNiArMzEwLDcgQEAKIAlzdHJ1Y3QgaXBfY3RfcHB0cF9tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfcHB0cF9pbmZvOwogCXVfaW50MTZfdCBtc2c7CiAJX19iZTE2IGNpZCA9IDAsIHBjaWQgPSAwOworCXR5cGVvZihpcF9uYXRfcHB0cF9ob29rX2luYm91bmQpIGlwX25hdF9wcHRwX2luYm91bmQ7CiAKIAltc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSk7CiAJREVCVUdQKCJpbmJvdW5kIGNvbnRyb2wgbWVzc2FnZSAlc1xuIiwgcHB0cF9tc2dfbmFtZVttc2ddKTsKQEAgLTQwMiw5ICs0MTAsOSBAQAogCQlnb3RvIGludmFsaWQ7CiAJfQogCi0JaWYgKGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkKLQkJcmV0dXJuIGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZChwc2tiLCBjdCwgY3RpbmZvLCBjdGxoLAotCQkJCQkJcHB0cFJlcSk7CisJaXBfbmF0X3BwdHBfaW5ib3VuZCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2luYm91bmQpOworCWlmIChpcF9uYXRfcHB0cF9pbmJvdW5kKQorCQlyZXR1cm4gaXBfbmF0X3BwdHBfaW5ib3VuZChwc2tiLCBjdCwgY3RpbmZvLCBjdGxoLCBwcHRwUmVxKTsKIAlyZXR1cm4gTkZfQUNDRVBUOwogCiBpbnZhbGlkOgpAQCAtNDI3LDYgKzQzNSw3IEBACiAJc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X3BwdHBfaW5mbzsKIAl1X2ludDE2X3QgbXNnOwogCV9fYmUxNiBjaWQgPSAwLCBwY2lkID0gMDsKKwl0eXBlb2YoaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCkgaXBfbmF0X3BwdHBfb3V0Ym91bmQ7CiAKIAltc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSk7CiAJREVCVUdQKCJvdXRib3VuZCBjb250cm9sIG1lc3NhZ2UgJXNcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSk7CkBAIC00OTIsOSArNTAxLDkgQEAKIAkJZ290byBpbnZhbGlkOwogCX0KIAotCWlmIChpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kKQotCQlyZXR1cm4gaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZChwc2tiLCBjdCwgY3RpbmZvLCBjdGxoLAotCQkJCQkJIHBwdHBSZXEpOworCWlwX25hdF9wcHRwX291dGJvdW5kID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpOworCWlmIChpcF9uYXRfcHB0cF9vdXRib3VuZCkKKwkJcmV0dXJuIGlwX25hdF9wcHRwX291dGJvdW5kKHBza2IsIGN0LCBjdGluZm8sIGN0bGgsIHBwdHBSZXEpOwogCXJldHVybiBORl9BQ0NFUFQ7CiAKIGludmFsaWQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYwppbmRleCA3NWY3YzNkYi4uOTE4MzJlYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19pcmMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jCkBAIC0xMTQsNiArMTE0LDcgQEAKIAl1X2ludDE2X3QgZGNjX3BvcnQ7CiAJaW50IGksIHJldCA9IE5GX0FDQ0VQVDsKIAljaGFyICphZGRyX2JlZ19wLCAqYWRkcl9lbmRfcDsKKwl0eXBlb2YoaXBfbmF0X2lyY19ob29rKSBpcF9uYXRfaXJjOwogCiAJREVCVUdQKCJlbnRlcmVkXG4iKTsKIApAQCAtMjIyLDExICsyMjMsMTIgQEAKIAkJCQkJeyAudGNwID0geyBodG9ucygweEZGRkYpIH0gfSwgMHhGRiB9fSk7CiAJCQlleHAtPmV4cGVjdGZuID0gTlVMTDsKIAkJCWV4cC0+ZmxhZ3MgPSAwOwotCQkJaWYgKGlwX25hdF9pcmNfaG9vaykKLQkJCQlyZXQgPSBpcF9uYXRfaXJjX2hvb2socHNrYiwgY3RpbmZvLCAKLQkJCQkJCSAgICAgIGFkZHJfYmVnX3AgLSBpYl9wdHIsCi0JCQkJCQkgICAgICBhZGRyX2VuZF9wIC0gYWRkcl9iZWdfcCwKLQkJCQkJCSAgICAgIGV4cCk7CisJCQlpcF9uYXRfaXJjID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9pcmNfaG9vayk7CisJCQlpZiAoaXBfbmF0X2lyYykKKwkJCQlyZXQgPSBpcF9uYXRfaXJjKHBza2IsIGN0aW5mbywKKwkJCQkJCSBhZGRyX2JlZ19wIC0gaWJfcHRyLAorCQkJCQkJIGFkZHJfZW5kX3AgLSBhZGRyX2JlZ19wLAorCQkJCQkJIGV4cCk7CiAJCQllbHNlIGlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQogCQkJCXJldCA9IE5GX0RST1A7CiAJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGxpbmsuYwppbmRleCA1M2I2ZGZmLi41ZmNmOTFkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGxpbmsuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGxpbmsuYwpAQCAtNDQsMTMgKzQ0LDYgQEAKIAogc3RhdGljIGNoYXIgX19pbml0ZGF0YSB2ZXJzaW9uW10gPSAiMC45MCI7CiAKLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotCiBzdGF0aWMgaW5saW5lIGludAogY3RuZXRsaW5rX2R1bXBfdHVwbGVzX3Byb3RvKHN0cnVjdCBza19idWZmICpza2IsIAogCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLApAQCAtMTYwLDYgKzE1Myw3IEBACiAJcmV0dXJuIHJldDsKIAogbmZhdHRyX2ZhaWx1cmU6CisJaXBfY29ubnRyYWNrX3Byb3RvX3B1dChwcm90byk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0zMjYsOCArMzIwLDYgQEAKIAl9IGVsc2UgaWYgKGV2ZW50cyAmIChJUENUX05FVyB8IElQQ1RfUkVMQVRFRCkpIHsKIAkJdHlwZSA9IElQQ1ROTF9NU0dfQ1RfTkVXOwogCQlmbGFncyA9IE5MTV9GX0NSRUFURXxOTE1fRl9FWENMOwotCQkvKiBkdW1wIGV2ZXJ5dGhpbmcgKi8KLQkJZXZlbnRzID0gfjBVTDsKIAkJZ3JvdXAgPSBORk5MR1JQX0NPTk5UUkFDS19ORVc7CiAJfSBlbHNlIGlmIChldmVudHMgJiAoSVBDVF9TVEFUVVMgfCBJUENUX1BST1RPSU5GTykpIHsKIAkJdHlwZSA9IElQQ1ROTF9NU0dfQ1RfTkVXOwpAQCAtMzYyLDI4ICszNTQsMzUgQEAKIAlpZiAoY3RuZXRsaW5rX2R1bXBfdHVwbGVzKHNrYiwgdHVwbGUoY3QsIElQX0NUX0RJUl9SRVBMWSkpIDwgMCkKIAkJZ290byBuZmF0dHJfZmFpbHVyZTsKIAlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKLQkKLQkvKiBOQVQgc3R1ZmYgaXMgbm93IGEgc3RhdHVzIGZsYWcgKi8KLQlpZiAoKGV2ZW50cyAmIElQQ1RfU1RBVFVTIHx8IGV2ZW50cyAmIElQQ1RfTkFUSU5GTykKLQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfc3RhdHVzKHNrYiwgY3QpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQlpZiAoZXZlbnRzICYgSVBDVF9SRUZSRVNICi0JICAgICYmIGN0bmV0bGlua19kdW1wX3RpbWVvdXQoc2tiLCBjdCkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCWlmIChldmVudHMgJiBJUENUX1BST1RPSU5GTwotCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9wcm90b2luZm8oc2tiLCBjdCkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCWlmIChldmVudHMgJiBJUENUX0hFTFBJTkZPCi0JICAgICYmIGN0bmV0bGlua19kdW1wX2hlbHBpbmZvKHNrYiwgY3QpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKIAotCWlmIChjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfUkVQTFkpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKKwlpZiAoZXZlbnRzICYgSVBDVF9ERVNUUk9ZKSB7CisJCWlmIChjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpIDwgMCB8fAorCQkgICAgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX1JFUExZKSA8IDApCisJCQlnb3RvIG5mYXR0cl9mYWlsdXJlOworCX0gZWxzZSB7CisJCWlmIChjdG5ldGxpbmtfZHVtcF9zdGF0dXMoc2tiLCBjdCkgPCAwKQorCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKIAotCWlmIChldmVudHMgJiBJUENUX01BUksKLQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfbWFyayhza2IsIGN0KSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisJCWlmIChjdG5ldGxpbmtfZHVtcF90aW1lb3V0KHNrYiwgY3QpIDwgMCkKKwkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisKKwkJaWYgKGV2ZW50cyAmIElQQ1RfUFJPVE9JTkZPCisJCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9wcm90b2luZm8oc2tiLCBjdCkgPCAwKQorCQkgICAgCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisKKwkJaWYgKChldmVudHMgJiBJUENUX0hFTFBFUiB8fCBjdC0+aGVscGVyKQorCQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfaGVscGluZm8oc2tiLCBjdCkgPCAwKQorCQkgICAgCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisKKwkJaWYgKChldmVudHMgJiBJUENUX01BUksgfHwgY3QtPm1hcmspCisJCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9tYXJrKHNrYiwgY3QpIDwgMCkKKwkJICAgIAlnb3RvIG5mYXR0cl9mYWlsdXJlOworCisJCWlmIChldmVudHMgJiBJUENUX0NPVU5URVJfRklMTElORyAmJgorCQkgICAgKGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9PUklHSU5BTCkgPCAwIHx8CisJCSAgICAgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX1JFUExZKSA8IDApKQorCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKKwl9CiAKIAlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CiAJbmZuZXRsaW5rX3NlbmQoc2tiLCAwLCBncm91cCwgMCk7CkBAIC0zOTgsNyArMzk3LDYgQEAKIAogc3RhdGljIGludCBjdG5ldGxpbmtfZG9uZShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7Ci0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCWlmIChjYi0+YXJnc1sxXSkKIAkJaXBfY29ubnRyYWNrX3B1dCgoc3RydWN0IGlwX2Nvbm50cmFjayAqKWNiLT5hcmdzWzFdKTsKIAlyZXR1cm4gMDsKQEAgLTQxMSw5ICs0MDksNiBAQAogCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppOwogCi0JREVCVUdQKCJlbnRlcmVkICVzLCBsYXN0IGJ1Y2tldD0lbHUgaWQ9JXVcbiIsIF9fRlVOQ1RJT05fXywgCi0JCQljYi0+YXJnc1swXSwgKmlkKTsKLQogCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwogCWxhc3QgPSAoc3RydWN0IGlwX2Nvbm50cmFjayAqKWNiLT5hcmdzWzFdOwogCWZvciAoOyBjYi0+YXJnc1swXSA8IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsgY2ItPmFyZ3NbMF0rKykgewpAQCAtNDUyLDcgKzQ0Nyw2IEBACiAJaWYgKGxhc3QpCiAJCWlwX2Nvbm50cmFja19wdXQobGFzdCk7CiAKLQlERUJVR1AoImxlYXZpbmcsIGxhc3QgYnVja2V0PSVsdSBpZD0ldVxuIiwgY2ItPmFyZ3NbMF0sICppZCk7CiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCkBAIC00NjYsOCArNDYwLDYgQEAKIHsKIAlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfSVBfTUFYXTsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9JUF9NQVgsIGF0dHIpOwogCiAJaWYgKG5mYXR0cl9iYWRfc2l6ZSh0YiwgQ1RBX0lQX01BWCwgY3RhX21pbl9pcCkpCkBAIC00ODEsOCArNDczLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJdHVwbGUtPmRzdC5pcCA9ICooX19iZTMyICopTkZBX0RBVEEodGJbQ1RBX0lQX1Y0X0RTVC0xXSk7CiAKLQlERUJVR1AoImxlYXZpbmdcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUwMyw4ICs0OTMsNiBAQAogCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvOwogCWludCByZXQgPSAwOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPX01BWCwgYXR0cik7CiAKIAlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfUFJPVE9fTUFYLCBjdGFfbWluX3Byb3RvKSkKQEAgLTUzMSw4ICs1MTksNiBAQAogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9UVVBMRV9NQVhdOwogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAltZW1zZXQodHVwbGUsIDAsIHNpemVvZigqdHVwbGUpKTsKIAogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9UVVBMRV9NQVgsIGNkYVt0eXBlLTFdKTsKQEAgLTU1NywxMCArNTQzLDYgQEAKIAllbHNlCiAJCXR1cGxlLT5kc3QuZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOwogCi0JRFVNUF9UVVBMRSh0dXBsZSk7Ci0KLQlERUJVR1AoImxlYXZpbmdcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU3Nyw4ICs1NTksNiBAQAogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9QUk9UT05BVF9NQVhdOwogCXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKm5wdDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9QUk9UT05BVF9NQVgsIGF0dHIpOwogCiAJaWYgKG5mYXR0cl9iYWRfc2l6ZSh0YiwgQ1RBX1BST1RPTkFUX01BWCwgY3RhX21pbl9wcm90b25hdCkpCkBAIC01OTcsNyArNTc3LDYgQEAKIAogCWlwX25hdF9wcm90b19wdXQobnB0KTsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxMyw4ICs1OTIsNiBAQAogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9OQVRfTUFYXTsKIAlpbnQgZXJyOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CiAJCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX05BVF9NQVgsIG5hdCk7CkBAIC02NDAsNyArNjE3LDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKQEAgLTY1MCw4ICs2MjYsNiBAQAogewogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9IRUxQX01BWF07CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfSEVMUF9NQVgsIGF0dHIpOwogCiAJaWYgKCF0YltDVEFfSEVMUF9OQU1FLTFdKQpAQCAtNjc5LDggKzY1Myw2IEBACiAJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CiAJaW50IGVyciA9IDA7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX01BWCwgY3RhX21pbikpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC02OTgsMTAgKzY3MCw4IEBACiAJCXJldHVybiBlcnI7CiAKIAloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7Ci0JaWYgKCFoKSB7Ci0JCURFQlVHUCgidHVwbGUgbm90IGZvdW5kIGluIGNvbm50cmFjayBoYXNoXG4iKTsKKwlpZiAoIWgpCiAJCXJldHVybiAtRU5PRU5UOwotCX0KIAogCWN0ID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKIAkKQEAgLTcxNiw3ICs2ODYsNiBAQAogCQljdC0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZyljdCk7CiAKIAlpcF9jb25udHJhY2tfcHV0KGN0KTsKLQlERUJVR1AoImxlYXZpbmdcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MzEsOCArNzAwLDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CiAJaW50IGVyciA9IDA7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKIAkJc3RydWN0IG5mZ2VubXNnICptc2cgPSBOTE1TR19EQVRBKG5saCk7CiAJCXUzMiBybGVuOwpAQCAtNzcwLDExICs3MzcsOSBAQAogCQlyZXR1cm4gZXJyOwogCiAJaCA9IGlwX2Nvbm50cmFja19maW5kX2dldCgmdHVwbGUsIE5VTEwpOwotCWlmICghaCkgewotCQlERUJVR1AoInR1cGxlIG5vdCBmb3VuZCBpbiBjb25udHJhY2sgaGFzaCIpOworCWlmICghaCkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCURFQlVHUCgidHVwbGUgZm91bmRcbiIpOworCiAJY3QgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCiAJZXJyID0gLUVOT01FTTsKQEAgLTc4Myw3ICs3NDgsNiBAQAogCQlpcF9jb25udHJhY2tfcHV0KGN0KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCU5FVExJTktfQ0Ioc2tiMikuZHN0X3BpZCA9IE5FVExJTktfQ0Ioc2tiKS5waWQ7CiAKIAllcnIgPSBjdG5ldGxpbmtfZmlsbF9pbmZvKHNrYjIsIE5FVExJTktfQ0Ioc2tiKS5waWQsIG5saC0+bmxtc2dfc2VxLCAKIAkJCQkgIElQQ1ROTF9NU0dfQ1RfTkVXLCAxLCBjdCk7CkBAIC03OTUsNyArNzU5LDYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKLQlERUJVR1AoImxlYXZpbmdcbiIpOwogCXJldHVybiAwOwogCiBmcmVlOgpAQCAtODY2LDggKzgyOSw2IEBACiAJY2hhciAqaGVscG5hbWU7CiAJaW50IGVycjsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCS8qIGRvbid0IGNoYW5nZSBoZWxwZXIgb2Ygc2libGluZyBjb25uZWN0aW9ucyAqLwogCWlmIChjdC0+bWFzdGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTkzOCw4ICs4OTksNiBAQAogewogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAoY2RhW0NUQV9IRUxQLTFdKSB7CiAJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfaGVscGVyKGN0LCBjZGEpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTk2OSw3ICs5MjgsNiBAQAogCQljdC0+bWFyayA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9NQVJLLTFdKSk7CiAjZW5kaWYKIAotCURFQlVHUCgiYWxsIGRvbmVcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC05ODEsOCArOTM5LDYgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWN0ID0gaXBfY29ubnRyYWNrX2FsbG9jKG90dXBsZSwgcnR1cGxlKTsKIAlpZiAoY3QgPT0gTlVMTCB8fCBJU19FUlIoY3QpKQogCQlyZXR1cm4gLUVOT01FTTsJCkBAIC05OTQsOSArOTUwLDExIEBACiAJY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBjdC0+dGltZW91dC5leHBpcmVzICogSFo7CiAJY3QtPnN0YXR1cyB8PSBJUFNfQ09ORklSTUVEOwogCi0JZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9zdGF0dXMoY3QsIGNkYSk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyOworCWlmIChjZGFbQ1RBX1NUQVRVUy0xXSkgeworCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3N0YXR1cyhjdCwgY2RhKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycjsKKwl9CiAKIAlpZiAoY2RhW0NUQV9QUk9UT0lORk8tMV0pIHsKIAkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9wcm90b2luZm8oY3QsIGNkYSk7CkBAIC0xMDE3LDcgKzk3NSw2IEBACiAJaWYgKGN0LT5oZWxwZXIpCiAJCWlwX2Nvbm50cmFja19oZWxwZXJfcHV0KGN0LT5oZWxwZXIpOwogCi0JREVCVUdQKCJjb25udHJhY2sgd2l0aCBpZCAldSBpbnNlcnRlZFxuIiwgY3QtPmlkKTsKIAlyZXR1cm4gMDsKIAogZXJyOgkKQEAgLTEwMzMsOCArOTkwLDYgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmggPSBOVUxMOwogCWludCBlcnIgPSAwOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJaWYgKG5mYXR0cl9iYWRfc2l6ZShjZGEsIENUQV9NQVgsIGN0YV9taW4pKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTA1OCw3ICsxMDEzLDYgQEAKIAogCWlmIChoID09IE5VTEwpIHsKIAkJd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JCURFQlVHUCgibm8gc3VjaCBjb25udHJhY2ssIGNyZWF0ZSBuZXdcbiIpOwogCQllcnIgPSAtRU5PRU5UOwogCQlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0NSRUFURSkKIAkJCWVyciA9IGN0bmV0bGlua19jcmVhdGVfY29ubnRyYWNrKGNkYSwgJm90dXBsZSwgJnJ0dXBsZSk7CkBAIC0xMDc0LDcgKzEwMjgsNiBAQAogCiAJLyogV2UgbWFuaXB1bGF0ZSB0aGUgY29ubnRyYWNrIGluc2lkZSB0aGUgZ2xvYmFsIGNvbm50cmFjayB0YWJsZSBsb2NrLAogCSAqIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBpbmNyZWFzZSB0aGUgcmVmY291bnQgKi8KLQlERUJVR1AoImNvbm50cmFjayBmb3VuZFxuIik7CiAJZXJyID0gLUVFWElTVDsKIAlpZiAoIShubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkpCiAJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfY29ubnRyYWNrKHR1cGxlaGFzaF90b19jdHJhY2soaCksIGNkYSk7CkBAIC0xMjQ5LDggKzEyMDIsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmk7CiAJdV9pbnQzMl90ICppZCA9ICh1X2ludDMyX3QgKikgJmNiLT5hcmdzWzBdOwogCi0JREVCVUdQKCJlbnRlcmVkICVzLCBsYXN0IGlkPSVsbHVcbiIsIF9fRlVOQ1RJT05fXywgKmlkKTsKLQogCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfcHJldihpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0KSB7CiAJCWV4cCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqKSBpOwpAQCAtMTI2Niw4ICsxMjE3LDYgQEAKIG91dDoJCiAJcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAotCURFQlVHUCgibGVhdmluZywgbGFzdCBpZD0lbGx1XG4iLCAqaWQpOwotCiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCkBAIC0xMjg1LDggKzEyMzQsNiBAQAogCXN0cnVjdCBza19idWZmICpza2IyOwogCWludCBlcnIgPSAwOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJaWYgKG5mYXR0cl9iYWRfc2l6ZShjZGEsIENUQV9FWFBFQ1RfTUFYLCBjdGFfbWluX2V4cCkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xMzE2LDcgKzEyNjMsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKCZ0dXBsZSk7CisJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCgmdHVwbGUpOwogCWlmICghZXhwKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMTMzMiw4ICsxMjc5LDcgQEAKIAlza2IyID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYjIpCiAJCWdvdG8gb3V0OwotCU5FVExJTktfQ0Ioc2tiMikuZHN0X3BpZCA9IE5FVExJTktfQ0Ioc2tiKS5waWQ7Ci0JCisKIAllcnIgPSBjdG5ldGxpbmtfZXhwX2ZpbGxfaW5mbyhza2IyLCBORVRMSU5LX0NCKHNrYikucGlkLCAKIAkJCQkgICAgICBubGgtPm5sbXNnX3NlcSwgSVBDVE5MX01TR19FWFBfTkVXLAogCQkJCSAgICAgIDEsIGV4cCk7CkBAIC0xMzcwLDcgKzEzMTYsNyBAQAogCQkJcmV0dXJuIGVycjsKIAogCQkvKiBidW1wIHVzYWdlIGNvdW50IHRvIDIgKi8KLQkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKCZ0dXBsZSk7CisJCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJnR1cGxlKTsKIAkJaWYgKCFleHApCiAJCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMTQzNyw4ICsxMzgzLDYgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCS8qIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhvc2UgdGhyZWUgQ1RBX0VYUEVDVF8qIGV4aXN0ICovCiAJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfRVhQRUNUX1RVUExFKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTE0OTAsOCArMTQzNCw2IEBACiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsJCi0KIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE1MjAsOCArMTQ2Miw2IEBACiAJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfZXhwZWN0KGV4cCwgY2RhKTsKIAl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7Ci0JCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19ncmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmMKaW5kZXggNWZlMDI2Zi4uYWMxYzQ5ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19ncmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5jCkBAIC0zNCw4ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIHN0YXRpYyBERUZJTkVfUldMT0NLKGlwX2N0X2dyZV9sb2NrKTsKLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KQotI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KQogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zaXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc2lwLmMKaW5kZXggZjRmNzU5OS4uM2EyNmQ2MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zaXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3NpcC5jCkBAIC01MiwyMCArNTIsNTYgQEAKIAkJCQljb25zdCBjaGFyICpkcHRyKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF9zZHBfaG9vayk7CiAKLWludCBjdF9zaXBfZ2V0X2luZm8oY29uc3QgY2hhciAqZHB0ciwgc2l6ZV90IGRsZW4sCi0JCQkJdW5zaWduZWQgaW50ICptYXRjaG9mZiwKLQkJCQl1bnNpZ25lZCBpbnQgKm1hdGNobGVuLAotCQkJCXN0cnVjdCBzaXBfaGVhZGVyX25mbyAqaG5mbyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChjdF9zaXBfZ2V0X2luZm8pOwotCi0KIHN0YXRpYyBpbnQgZGlnaXRzX2xlbihjb25zdCBjaGFyICpkcHRyLCBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCk7CiBzdGF0aWMgaW50IGVwYWRkcl9sZW4oY29uc3QgY2hhciAqZHB0ciwgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpOwogc3RhdGljIGludCBza3BfZGlnaXRzX2xlbihjb25zdCBjaGFyICpkcHRyLCBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCk7CiBzdGF0aWMgaW50IHNrcF9lcGFkZHJfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KTsKIAotc3RydWN0IHNpcF9oZWFkZXJfbmZvIGN0X3NpcF9oZHJzW10gPSB7Ci0JeyAJLyogVmlhIGhlYWRlciAqLworc3RydWN0IHNpcF9oZWFkZXJfbmZvIHsKKwljb25zdCBjaGFyCSpsbmFtZTsKKwljb25zdCBjaGFyCSpzbmFtZTsKKwljb25zdCBjaGFyCSpsbl9zdHI7CisJc2l6ZV90CQlsbmxlbjsKKwlzaXplX3QJCXNubGVuOworCXNpemVfdAkJbG5fc3RybGVuOworCWludAkJY2FzZV9zZW5zaXRpdmU7CisJaW50CQkoKm1hdGNoX2xlbikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCAqKTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gY3Rfc2lwX2hkcnNbXSA9IHsKKwlbUE9TX1JFR19SRVFfVVJJXSA9IHsgCS8qIFNJUCBSRUdJU1RFUiByZXF1ZXN0IFVSSSAqLworCQkubG5hbWUJCT0gInNpcDoiLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAorCQkubG5fc3RyCQk9ICI6IiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigiOiIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KKwl9LAorCVtQT1NfUkVRX1VSSV0gPSB7IAkvKiBTSVAgcmVxdWVzdCBVUkkgKi8KKwkJLmxuYW1lCQk9ICJzaXA6IiwKKwkJLmxubGVuCQk9IHNpemVvZigic2lwOiIpIC0gMSwKKwkJLmxuX3N0cgkJPSAiQCIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoIkAiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCisJfSwKKwlbUE9TX0ZST01dID0gewkJLyogU0lQIEZyb20gaGVhZGVyICovCisJCS5sbmFtZQkJPSAiRnJvbToiLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJGcm9tOiIpIC0gMSwKKwkJLnNuYW1lCQk9ICJcclxuZjoiLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJcclxuZjoiKSAtIDEsCisJCS5sbl9zdHIJCT0gInNpcDoiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAorCQkubWF0Y2hfbGVuCT0gc2twX2VwYWRkcl9sZW4sCisJfSwKKwlbUE9TX1RPXSA9IHsJCS8qIFNJUCBUbyBoZWFkZXIgKi8KKwkJLmxuYW1lCQk9ICJUbzoiLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJUbzoiKSAtIDEsCisJCS5zbmFtZQkJPSAiXHJcbnQ6IiwKKwkJLnNubGVuCQk9IHNpemVvZigiXHJcbnQ6IikgLSAxLAorCQkubG5fc3RyCQk9ICJzaXA6IiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigic2lwOiIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IHNrcF9lcGFkZHJfbGVuLAorCX0sCisJW1BPU19WSUFdID0geyAJCS8qIFNJUCBWaWEgaGVhZGVyICovCiAJCS5sbmFtZQkJPSAiVmlhOiIsCiAJCS5sbmxlbgkJPSBzaXplb2YoIlZpYToiKSAtIDEsCiAJCS5zbmFtZQkJPSAiXHJcbnY6IiwKQEAgLTc0LDcgKzExMCw3IEBACiAJCS5sbl9zdHJsZW4JPSBzaXplb2YoIlVEUCAiKSAtIDEsCiAJCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuLAogCX0sCi0JeyAJLyogQ29udGFjdCBoZWFkZXIgKi8KKwlbUE9TX0NPTlRBQ1RdID0geyAJLyogU0lQIENvbnRhY3QgaGVhZGVyICovCiAJCS5sbmFtZQkJPSAiQ29udGFjdDoiLAogCQkubG5sZW4JCT0gc2l6ZW9mKCJDb250YWN0OiIpIC0gMSwKIAkJLnNuYW1lCQk9ICJcclxubToiLApAQCAtODMsNyArMTE5LDcgQEAKIAkJLmxuX3N0cmxlbgk9IHNpemVvZigic2lwOiIpIC0gMSwKIAkJLm1hdGNoX2xlbgk9IHNrcF9lcGFkZHJfbGVuCiAJfSwKLQl7IAkvKiBDb250ZW50IGxlbmd0aCBoZWFkZXIgKi8KKwlbUE9TX0NPTlRFTlRdID0geyAJLyogU0lQIENvbnRlbnQgbGVuZ3RoIGhlYWRlciAqLwogCQkubG5hbWUJCT0gIkNvbnRlbnQtTGVuZ3RoOiIsCiAJCS5sbmxlbgkJPSBzaXplb2YoIkNvbnRlbnQtTGVuZ3RoOiIpIC0gMSwKIAkJLnNuYW1lCQk9ICJcclxubDoiLApAQCAtOTIsNyArMTI4LDggQEAKIAkJLmxuX3N0cmxlbgk9IHNpemVvZigiOiIpIC0gMSwKIAkJLm1hdGNoX2xlbgk9IHNrcF9kaWdpdHNfbGVuCiAJfSwKLQl7CS8qIFNEUCBtZWRpYSBpbmZvICovCisJW1BPU19NRURJQV0gPSB7CQkvKiBTRFAgbWVkaWEgaW5mbyAqLworCQkuY2FzZV9zZW5zaXRpdmUJPSAxLAogCQkubG5hbWUJCT0gIlxubT0iLAogCQkubG5sZW4JCT0gc2l6ZW9mKCJcbm09IikgLSAxLAogCQkuc25hbWUJCT0gIlxybT0iLApAQCAtMTAxLDcgKzEzOCw4IEBACiAJCS5sbl9zdHJsZW4JPSBzaXplb2YoImF1ZGlvICIpIC0gMSwKIAkJLm1hdGNoX2xlbgk9IGRpZ2l0c19sZW4KIAl9LAotCXsgCS8qIFNEUCBvd25lciBhZGRyZXNzKi8KKwlbUE9TX09XTkVSXSA9IHsgCS8qIFNEUCBvd25lciBhZGRyZXNzKi8KKwkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKIAkJLmxuYW1lCQk9ICJcbm89IiwKIAkJLmxubGVuCQk9IHNpemVvZigiXG5vPSIpIC0gMSwKIAkJLnNuYW1lCQk9ICJccm89IiwKQEAgLTExMCw3ICsxNDgsOCBAQAogCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJJTiBJUDQgIikgLSAxLAogCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbgogCX0sCi0JeyAJLyogU0RQIGNvbm5lY3Rpb24gaW5mbyAqLworCVtQT1NfQ09OTkVDVElPTl0gPSB7IAkvKiBTRFAgY29ubmVjdGlvbiBpbmZvICovCisJCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCiAJCS5sbmFtZQkJPSAiXG5jPSIsCiAJCS5sbmxlbgkJPSBzaXplb2YoIlxuYz0iKSAtIDEsCiAJCS5zbmFtZQkJPSAiXHJjPSIsCkBAIC0xMTksMTYgKzE1OCw4IEBACiAJCS5sbl9zdHJsZW4JPSBzaXplb2YoIklOIElQNCAiKSAtIDEsCiAJCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCiAJfSwKLQl7IAkvKiBSZXF1ZXN0cyBoZWFkZXJzICovCi0JCS5sbmFtZQkJPSAic2lwOiIsCi0JCS5sbmxlbgkJPSBzaXplb2YoInNpcDoiKSAtIDEsCi0JCS5zbmFtZQkJPSAic2lwOiIsCi0JCS5zbmxlbgkJPSBzaXplb2YoInNpcDoiKSAtIDEsIC8qIHllcywgaSBrbm93Li4gOykgKi8KLQkJLmxuX3N0cgkJPSAiQCIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoIkAiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCi0JfSwKLQl7IAkvKiBTRFAgdmVyc2lvbiBoZWFkZXIgKi8KKwlbUE9TX1NEUF9IRUFERVJdID0geyAJLyogU0RQIHZlcnNpb24gaGVhZGVyICovCisJCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCiAJCS5sbmFtZQkJPSAiXG52PSIsCiAJCS5sbmxlbgkJPSBzaXplb2YoIlxudj0iKSAtIDEsCiAJCS5zbmFtZQkJPSAiXHJ2PSIsCkBAIC0xMzgsNyArMTY5LDYgQEAKIAkJLm1hdGNoX2xlbgk9IGRpZ2l0c19sZW4KIAl9CiB9OwotRVhQT1JUX1NZTUJPTF9HUEwoY3Rfc2lwX2hkcnMpOwogCiAvKiBnZXQgbGluZSBsZW5naHQgdW50aWwgZmlyc3QgQ1Igb3IgTEYgc2Vlbi4gKi8KIGludCBjdF9zaXBfbG5sZW4oY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqbGltaXQpCkBAIC0xNTksMTMgKzE4OSwxOSBAQAogCiAvKiBMaW5lYXIgc3RyaW5nIHNlYXJjaCwgY2FzZSBzZW5zaXRpdmUuICovCiBjb25zdCBjaGFyICpjdF9zaXBfc2VhcmNoKGNvbnN0IGNoYXIgKm5lZWRsZSwgY29uc3QgY2hhciAqaGF5c3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZWVkbGVfbGVuLCBzaXplX3QgaGF5c3RhY2tfbGVuKQorCQkJICBzaXplX3QgbmVlZGxlX2xlbiwgc2l6ZV90IGhheXN0YWNrX2xlbiwKKwkJCSAgaW50IGNhc2Vfc2Vuc2l0aXZlKQogewogCWNvbnN0IGNoYXIgKmxpbWl0ID0gaGF5c3RhY2sgKyAoaGF5c3RhY2tfbGVuIC0gbmVlZGxlX2xlbik7CiAKIAl3aGlsZSAoaGF5c3RhY2sgPD0gbGltaXQpIHsKLQkJaWYgKG1lbWNtcChoYXlzdGFjaywgbmVlZGxlLCBuZWVkbGVfbGVuKSA9PSAwKQotCQkJcmV0dXJuIGhheXN0YWNrOworCQlpZiAoY2FzZV9zZW5zaXRpdmUpIHsKKwkJCWlmIChzdHJuY21wKGhheXN0YWNrLCBuZWVkbGUsIG5lZWRsZV9sZW4pID09IDApCisJCQkJcmV0dXJuIGhheXN0YWNrOworCQl9IGVsc2UgeworCQkJaWYgKHN0cm5pY21wKGhheXN0YWNrLCBuZWVkbGUsIG5lZWRsZV9sZW4pID09IDApCisJCQkJcmV0dXJuIGhheXN0YWNrOworCQl9CiAJCWhheXN0YWNrKys7CiAJfQogCXJldHVybiBOVUxMOwpAQCAtMjYzLDggKzI5OSw5IEBACiBpbnQgY3Rfc2lwX2dldF9pbmZvKGNvbnN0IGNoYXIgKmRwdHIsIHNpemVfdCBkbGVuLAogCQkgICAgdW5zaWduZWQgaW50ICptYXRjaG9mZiwKIAkJICAgIHVuc2lnbmVkIGludCAqbWF0Y2hsZW4sCi0JCSAgICBzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gKmhuZm8pCisJCSAgICBlbnVtIHNpcF9oZWFkZXJfcG9zIHBvcykKIHsKKwlzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gKmhuZm8gPSAmY3Rfc2lwX2hkcnNbcG9zXTsKIAljb25zdCBjaGFyICpsaW1pdCwgKmF1eCwgKmsgPSBkcHRyOwogCWludCBzaGlmdCA9IDA7CiAKQEAgLTI3MiwxMiArMzA5LDE0IEBACiAKIAl3aGlsZSAoZHB0ciA8PSBsaW1pdCkgewogCQlpZiAoKHN0cm5jbXAoZHB0ciwgaG5mby0+bG5hbWUsIGhuZm8tPmxubGVuKSAhPSAwKSAmJgotCQkgICAgKHN0cm5jbXAoZHB0ciwgaG5mby0+c25hbWUsIGhuZm8tPnNubGVuKSAhPSAwKSkgeworCQkgICAgKGhuZm8tPnNuYW1lID09IE5VTEwgfHwKKwkJICAgICBzdHJuY21wKGRwdHIsIGhuZm8tPnNuYW1lLCBobmZvLT5zbmxlbikgIT0gMCkpIHsKIAkJCWRwdHIrKzsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWF1eCA9IGN0X3NpcF9zZWFyY2goaG5mby0+bG5fc3RyLCBkcHRyLCBobmZvLT5sbl9zdHJsZW4sCi0JCSAgICAgICAgICAgICAgICAgICAgY3Rfc2lwX2xubGVuKGRwdHIsIGxpbWl0KSk7CisJCSAgICAgICAgICAgICAgICAgICAgY3Rfc2lwX2xubGVuKGRwdHIsIGxpbWl0KSwKKwkJCQkgICAgaG5mby0+Y2FzZV9zZW5zaXRpdmUpOwogCQlpZiAoIWF1eCkgewogCQkJREVCVUdQKCInJXMnIG5vdCBmb3VuZCBpbiAnJXMnLlxuIiwgaG5mby0+bG5fc3RyLAogCQkJICAgICAgIGhuZm8tPmxuYW1lKTsKQEAgLTI5OCw2ICszMzcsNyBAQAogCURFQlVHUCgiJXMgaGVhZGVyIG5vdCBmb3VuZC5cbiIsIGhuZm8tPmxuYW1lKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGN0X3NpcF9nZXRfaW5mbyk7CiAKIHN0YXRpYyBpbnQgc2V0X2V4cGVjdGVkX3J0cChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCiAJCQkgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCkBAIC0zMDgsNiArMzQ4LDcgQEAKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwogCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CiAJaW50IHJldDsKKwl0eXBlb2YoaXBfbmF0X3NkcF9ob29rKSBpcF9uYXRfc2RwOwogCiAJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7CiAJaWYgKGV4cCA9PSBOVUxMKQpAQCAtMzI4LDggKzM2OSw5IEBACiAJZXhwLT5leHBlY3RmbiA9IE5VTEw7CiAJZXhwLT5mbGFncyA9IDA7CiAKLQlpZiAoaXBfbmF0X3NkcF9ob29rKQotCQlyZXQgPSBpcF9uYXRfc2RwX2hvb2socHNrYiwgY3RpbmZvLCBleHAsIGRwdHIpOworCWlwX25hdF9zZHAgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3NkcF9ob29rKTsKKwlpZiAoaXBfbmF0X3NkcCkKKwkJcmV0ID0gaXBfbmF0X3NkcChwc2tiLCBjdGluZm8sIGV4cCwgZHB0cik7CiAJZWxzZSB7CiAJCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQogCQkJcmV0ID0gTkZfRFJPUDsKQEAgLTM1MSw2ICszOTMsNyBAQAogCWludCBtYXRjaG9mZiwgbWF0Y2hsZW47CiAJX19iZTMyIGlwYWRkcjsKIAl1X2ludDE2X3QgcG9ydDsKKwl0eXBlb2YoaXBfbmF0X3NpcF9ob29rKSBpcF9uYXRfc2lwOwogCiAJLyogTm8gRGF0YSA/ICovCiAJZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CkBAIC0zNjgsOCArNDExLDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGlwX25hdF9zaXBfaG9vaykgewotCQlpZiAoIWlwX25hdF9zaXBfaG9vayhwc2tiLCBjdGluZm8sIGN0LCAmZHB0cikpIHsKKwlpcF9uYXRfc2lwID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9zaXBfaG9vayk7CisJaWYgKGlwX25hdF9zaXApIHsKKwkJaWYgKCFpcF9uYXRfc2lwKHBza2IsIGN0aW5mbywgY3QsICZkcHRyKSkgewogCQkJcmV0ID0gTkZfRFJPUDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0zODksNyArNDMzLDcgQEAKIAl9CiAJLyogR2V0IGlwIGFuZCBwb3J0IGFkZHJlc3MgZnJvbSBTRFAgcGFja2V0LiAqLwogCWlmIChjdF9zaXBfZ2V0X2luZm8oZHB0ciwgZGF0YWxlbiwgJm1hdGNob2ZmLCAmbWF0Y2hsZW4sCi0JICAgICAgICAgICAgICAgICAgICAmY3Rfc2lwX2hkcnNbUE9TX0NPTk5FQ1RJT05dKSA+IDApIHsKKwkgICAgICAgICAgICAgICAgICAgIFBPU19DT05ORUNUSU9OKSA+IDApIHsKIAogCQkvKiBXZSdsbCBkcm9wIG9ubHkgaWYgdGhlcmUgYXJlIHBhcnNlIHByb2JsZW1zLiAqLwogCQlpZiAocGFyc2VfaXBhZGRyKGRwdHIgKyBtYXRjaG9mZiwgTlVMTCwgJmlwYWRkciwKQEAgLTM5OCw3ICs0NDIsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAkJaWYgKGN0X3NpcF9nZXRfaW5mbyhkcHRyLCBkYXRhbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwKLQkJICAgICAgICAgICAgICAgICAgICAmY3Rfc2lwX2hkcnNbUE9TX01FRElBXSkgPiAwKSB7CisJCSAgICAgICAgICAgICAgICAgICAgUE9TX01FRElBKSA+IDApIHsKIAogCQkJcG9ydCA9IHNpbXBsZV9zdHJ0b3VsKGRwdHIgKyBtYXRjaG9mZiwgTlVMTCwgMTApOwogCQkJaWYgKHBvcnQgPCAxMDI0KSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCmluZGV4IDAyMTM1NzUuLjg2ZWZiNTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC0yOCw5ICsyOCw2IEBACiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KQotI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KQotCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KQEAgLTEzOSw3ICsxMzYsNiBAQAogCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjayA9IHR1cGxlaGFzaF90b19jdHJhY2soaGFzaCk7CiAJc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87CiAKLQlBU1NFUlRfUkVBRF9MT0NLKCZpcF9jb25udHJhY2tfbG9jayk7CiAJSVBfTkZfQVNTRVJUKGNvbm50cmFjayk7CiAKIAkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCkBAIC05MjYsNyArOTIyLDcgQEAKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyk7CiBFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19leHBlY3RfcHV0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKF9faXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19leHBlY3RfZmluZCk7CitFWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKTsKIEVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQpOwogRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMKaW5kZXggZmUwYjYzNC4uZWY1NmRlMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja190ZnRwLmMKQEAgLTUwLDYgKzUwLDcgQEAKIAlzdHJ1Y3QgdGZ0cGhkciBfdGZ0cGgsICp0Zmg7CiAJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gTkZfQUNDRVBUOworCXR5cGVvZihpcF9uYXRfdGZ0cF9ob29rKSBpcF9uYXRfdGZ0cDsKIAogCXRmaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwKIAkJCQkgKCpwc2tiKS0+bmguaXBoLT5paGwqNCtzaXplb2Yoc3RydWN0IHVkcGhkciksCkBAIC04MSw4ICs4Miw5IEBACiAJCURFQlVHUCgiZXhwZWN0OiAiKTsKIAkJRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CiAJCURVTVBfVFVQTEUoJmV4cC0+bWFzayk7Ci0JCWlmIChpcF9uYXRfdGZ0cF9ob29rKQotCQkJcmV0ID0gaXBfbmF0X3RmdHBfaG9vayhwc2tiLCBjdGluZm8sIGV4cCk7CisJCWlwX25hdF90ZnRwID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF90ZnRwX2hvb2spOworCQlpZiAoaXBfbmF0X3RmdHApCisJCQlyZXQgPSBpcF9uYXRfdGZ0cChwc2tiLCBjdGluZm8sIGV4cCk7CiAJCWVsc2UgaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCiAJCQlyZXQgPSBORl9EUk9QOwogCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9hbWFuZGEuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfYW1hbmRhLmMKaW5kZXggM2E4ODg3MS4uODVkZjFhOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9hbWFuZGEuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2FtYW5kYS5jCkBAIC03MCwxNSArNzAsMTQgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGlwX25hdF9hbWFuZGFfZmluaSh2b2lkKQogewotCWlwX25hdF9hbWFuZGFfaG9vayA9IE5VTEw7Ci0JLyogTWFrZSBzdXJlIG5vb25lIGNhbGxzIGl0LCBtZWFud2hpbGUuICovCi0Jc3luY2hyb25pemVfbmV0KCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9hbWFuZGFfaG9vaywgTlVMTCk7CisJc3luY2hyb25pemVfcmN1KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGlwX25hdF9hbWFuZGFfaW5pdCh2b2lkKQogewotCUJVR19PTihpcF9uYXRfYW1hbmRhX2hvb2spOwotCWlwX25hdF9hbWFuZGFfaG9vayA9IGhlbHA7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfYW1hbmRhX2hvb2spKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2FtYW5kYV9ob29rLCBoZWxwKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYwppbmRleCA0YjYyNjBhLi45ZDFhNTE3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYwpAQCAtMzYyLDEyICszNjIsMTAgQEAKIAlpcGggPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyBpcGhkcm9mZjsKIAogCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgewotCQlpcGgtPmNoZWNrID0gbmZfY3N1bV91cGRhdGUofmlwaC0+c2FkZHIsIHRhcmdldC0+c3JjLmlwLAotCQkJCQkgICAgaXBoLT5jaGVjayk7CisJCW5mX2NzdW1fcmVwbGFjZTQoJmlwaC0+Y2hlY2ssIGlwaC0+c2FkZHIsIHRhcmdldC0+c3JjLmlwKTsKIAkJaXBoLT5zYWRkciA9IHRhcmdldC0+c3JjLmlwOwogCX0gZWxzZSB7Ci0JCWlwaC0+Y2hlY2sgPSBuZl9jc3VtX3VwZGF0ZSh+aXBoLT5kYWRkciwgdGFyZ2V0LT5kc3QuaXAsCi0JCQkJCSAgICBpcGgtPmNoZWNrKTsKKwkJbmZfY3N1bV9yZXBsYWNlNCgmaXBoLT5jaGVjaywgaXBoLT5kYWRkciwgdGFyZ2V0LT5kc3QuaXApOwogCQlpcGgtPmRhZGRyID0gdGFyZ2V0LT5kc3QuaXA7CiAJfQogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfZnRwLmMKaW5kZXggYTcxYzIzMy4uOTEzOTYwZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2Z0cC5jCkBAIC0xNTYsMTUgKzE1NiwxNCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X2Z0cF9maW5pKHZvaWQpCiB7Ci0JaXBfbmF0X2Z0cF9ob29rID0gTlVMTDsKLQkvKiBNYWtlIHN1cmUgbm9vbmUgY2FsbHMgaXQsIG1lYW53aGlsZS4gKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2Z0cF9ob29rLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaXBfbmF0X2Z0cF9pbml0KHZvaWQpCiB7Ci0JQlVHX09OKGlwX25hdF9mdHBfaG9vayk7Ci0JaXBfbmF0X2Z0cF9ob29rID0gaXBfbmF0X2Z0cDsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9mdHBfaG9vaykpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfZnRwX2hvb2ssIGlwX25hdF9mdHApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXIuYwppbmRleCAzYmY4NTg0Li5lZTgwZmViIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMKQEAgLTE4OCwxMCArMTg4LDggQEAKIAkJCQkJICAgY3N1bV9wYXJ0aWFsKChjaGFyICopdGNwaCwKIAkJCQkJICAgCQlkYXRhbGVuLCAwKSk7CiAJfSBlbHNlCi0JCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsCi0JCQkJCQkgICBodG9ucyhvbGRsZW4pIF4gaHRvbnMoMHhGRkZGKSwKLQkJCQkJCSAgIGh0b25zKGRhdGFsZW4pLAotCQkJCQkJICAgdGNwaC0+Y2hlY2ssIDEpOworCQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCisJCQkJCWh0b25zKG9sZGxlbiksIGh0b25zKGRhdGFsZW4pLCAxKTsKIAogCWlmIChyZXBfbGVuICE9IG1hdGNoX2xlbikgewogCQlzZXRfYml0KElQU19TRVFfQURKVVNUX0JJVCwgJmN0LT5zdGF0dXMpOwpAQCAtMjY0LDEyICsyNjIsMTAgQEAKIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil1ZHBoLAogCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhbGVuLCAwKSk7CiAJCWlmICghdWRwaC0+Y2hlY2spCi0JCQl1ZHBoLT5jaGVjayA9IC0xOworCQkJdWRwaC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAl9IGVsc2UKLQkJdWRwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwKLQkJCQkJCSAgIGh0b25zKG9sZGxlbikgXiBodG9ucygweEZGRkYpLAotCQkJCQkJICAgaHRvbnMoZGF0YWxlbiksCi0JCQkJCQkgICB1ZHBoLT5jaGVjaywgMSk7CisJCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJnVkcGgtPmNoZWNrLCAqcHNrYiwKKwkJCQkJaHRvbnMob2xkbGVuKSwgaHRvbnMoZGF0YWxlbiksIDEpOwogCXJldHVybiAxOwogfQogRVhQT1JUX1NZTUJPTChpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQpOwpAQCAtMzA3LDE0ICszMDMsMTAgQEAKIAkJCW50b2hsKHNhY2stPnN0YXJ0X3NlcSksIG5ld19zdGFydF9zZXEsCiAJCQludG9obChzYWNrLT5lbmRfc2VxKSwgbmV3X2VuZF9zZXEpOwogCi0JCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoc2tiLAotCQkJCQkJICAgfnNhY2stPnN0YXJ0X3NlcSwKLQkJCQkJCSAgIG5ld19zdGFydF9zZXEsCi0JCQkJCQkgICB0Y3BoLT5jaGVjaywgMCk7Ci0JCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoc2tiLAotCQkJCQkJICAgfnNhY2stPmVuZF9zZXEsCi0JCQkJCQkgICBuZXdfZW5kX3NlcSwKLQkJCQkJCSAgIHRjcGgtPmNoZWNrLCAwKTsKKwkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssIHNrYiwKKwkJCQkJc2Fjay0+c3RhcnRfc2VxLCBuZXdfc3RhcnRfc2VxLCAwKTsKKwkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssIHNrYiwKKwkJCQkJc2Fjay0+ZW5kX3NlcSwgbmV3X2VuZF9zZXEsIDApOwogCQlzYWNrLT5zdGFydF9zZXEgPSBuZXdfc3RhcnRfc2VxOwogCQlzYWNrLT5lbmRfc2VxID0gbmV3X2VuZF9zZXE7CiAJCXNhY2tvZmYgKz0gc2l6ZW9mKCpzYWNrKTsKQEAgLTM5NywxMCArMzg5LDggQEAKIAllbHNlCiAJCW5ld2FjayA9IGh0b25sKG50b2hsKHRjcGgtPmFja19zZXEpIC0gb3RoZXJfd2F5LT5vZmZzZXRfYmVmb3JlKTsKIAotCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsIH50Y3BoLT5zZXEsIG5ld3NlcSwKLQkJCQkJICAgdGNwaC0+Y2hlY2ssIDApOwotCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsIH50Y3BoLT5hY2tfc2VxLCBuZXdhY2ssCi0JCQkJCSAgIHRjcGgtPmNoZWNrLCAwKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgKnBza2IsIHRjcGgtPnNlcSwgbmV3c2VxLCAwKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgKnBza2IsIHRjcGgtPmFja19zZXEsIG5ld2FjaywgMCk7CiAKIAlERUJVR1AoIkFkanVzdGluZyBzZXF1ZW5jZSBudW1iZXIgZnJvbSAldS0+JXUsIGFjayBmcm9tICV1LT4ldVxuIiwKIAkJbnRvaGwodGNwaC0+c2VxKSwgbnRvaGwobmV3c2VxKSwgbnRvaGwodGNwaC0+YWNrX3NlcSksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9oMzIzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9oMzIzLmMKaW5kZXggNGE3ZDM0NC4uYmRjOTllZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfaDMyMy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX2gzMjMuYwpAQCAtNTYzLDI1ICs1NjMsMjUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCUJVR19PTihzZXRfaDI0NV9hZGRyX2hvb2sgIT0gTlVMTCk7Ci0JQlVHX09OKHNldF9oMjI1X2FkZHJfaG9vayAhPSBOVUxMKTsKLQlCVUdfT04oc2V0X3NpZ19hZGRyX2hvb2sgIT0gTlVMTCk7Ci0JQlVHX09OKHNldF9yYXNfYWRkcl9ob29rICE9IE5VTEwpOwotCUJVR19PTihuYXRfcnRwX3J0Y3BfaG9vayAhPSBOVUxMKTsKLQlCVUdfT04obmF0X3QxMjBfaG9vayAhPSBOVUxMKTsKLQlCVUdfT04obmF0X2gyNDVfaG9vayAhPSBOVUxMKTsKLQlCVUdfT04obmF0X2NhbGxmb3J3YXJkaW5nX2hvb2sgIT0gTlVMTCk7Ci0JQlVHX09OKG5hdF9xOTMxX2hvb2sgIT0gTlVMTCk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShzZXRfaDI0NV9hZGRyX2hvb2spICE9IE5VTEwpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2Uoc2V0X2gyMjVfYWRkcl9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKHNldF9zaWdfYWRkcl9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF9ydHBfcnRjcF9ob29rKSAhPSBOVUxMKTsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF90MTIwX2hvb2spICE9IE5VTEwpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmF0X2gyNDVfaG9vaykgIT0gTlVMTCk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuYXRfY2FsbGZvcndhcmRpbmdfaG9vaykgIT0gTlVMTCk7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuYXRfcTkzMV9ob29rKSAhPSBOVUxMKTsKIAotCXNldF9oMjQ1X2FkZHJfaG9vayA9IHNldF9oMjQ1X2FkZHI7Ci0Jc2V0X2gyMjVfYWRkcl9ob29rID0gc2V0X2gyMjVfYWRkcjsKLQlzZXRfc2lnX2FkZHJfaG9vayA9IHNldF9zaWdfYWRkcjsKLQlzZXRfcmFzX2FkZHJfaG9vayA9IHNldF9yYXNfYWRkcjsKLQluYXRfcnRwX3J0Y3BfaG9vayA9IG5hdF9ydHBfcnRjcDsKLQluYXRfdDEyMF9ob29rID0gbmF0X3QxMjA7Ci0JbmF0X2gyNDVfaG9vayA9IG5hdF9oMjQ1OwotCW5hdF9jYWxsZm9yd2FyZGluZ19ob29rID0gbmF0X2NhbGxmb3J3YXJkaW5nOwotCW5hdF9xOTMxX2hvb2sgPSBuYXRfcTkzMTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X2gyNDVfYWRkcl9ob29rLCBzZXRfaDI0NV9hZGRyKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X2gyMjVfYWRkcl9ob29rLCBzZXRfaDIyNV9hZGRyKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X3NpZ19hZGRyX2hvb2ssIHNldF9zaWdfYWRkcik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9yYXNfYWRkcl9ob29rLCBzZXRfcmFzX2FkZHIpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfcnRwX3J0Y3BfaG9vaywgbmF0X3J0cF9ydGNwKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3QxMjBfaG9vaywgbmF0X3QxMjApOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfaDI0NV9ob29rLCBuYXRfaDI0NSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rLCBuYXRfY2FsbGZvcndhcmRpbmcpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfcTkzMV9ob29rLCBuYXRfcTkzMSk7CiAKIAlERUJVR1AoImlwX25hdF9oMzIzOiBpbml0IHN1Y2Nlc3NcbiIpOwogCXJldHVybiAwOwpAQCAtNTkwLDE2ICs1OTAsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlzZXRfaDI0NV9hZGRyX2hvb2sgPSBOVUxMOwotCXNldF9oMjI1X2FkZHJfaG9vayA9IE5VTEw7Ci0Jc2V0X3NpZ19hZGRyX2hvb2sgPSBOVUxMOwotCXNldF9yYXNfYWRkcl9ob29rID0gTlVMTDsKLQluYXRfcnRwX3J0Y3BfaG9vayA9IE5VTEw7Ci0JbmF0X3QxMjBfaG9vayA9IE5VTEw7Ci0JbmF0X2gyNDVfaG9vayA9IE5VTEw7Ci0JbmF0X2NhbGxmb3J3YXJkaW5nX2hvb2sgPSBOVUxMOwotCW5hdF9xOTMxX2hvb2sgPSBOVUxMOwotCXN5bmNocm9uaXplX25ldCgpOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfaDI0NV9hZGRyX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfaDIyNV9hZGRyX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihzZXRfc2lnX2FkZHJfaG9vaywgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9yYXNfYWRkcl9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3J0cF9ydGNwX2hvb2ssIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfdDEyMF9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmF0X2gyNDVfaG9vaywgTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3E5MzFfaG9vaywgTlVMTCk7CisJc3luY2hyb25pemVfcmN1KCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfcHB0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfcHB0cC5jCmluZGV4IDMyOWZkY2QuLmVjOTU3YmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX3BwdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9wcHRwLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiAJREVCVUdQKCJ0cnlpbmcgdG8gdW5leHBlY3Qgb3RoZXIgZGlyOiAiKTsKIAlEVU1QX1RVUExFKCZ0KTsKLQlvdGhlcl9leHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoJnQpOworCW90aGVyX2V4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJnQpOwogCWlmIChvdGhlcl9leHApIHsKIAkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQob3RoZXJfZXhwKTsKIAkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQob3RoZXJfZXhwKTsKQEAgLTMxNSwxNyArMzE1LDE3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlCVUdfT04oaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCk7Ci0JaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCA9ICZwcHRwX291dGJvdW5kX3BrdDsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCwgcHB0cF9vdXRib3VuZF9wa3QpOwogCi0JQlVHX09OKGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCk7Ci0JaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kID0gJnBwdHBfaW5ib3VuZF9wa3Q7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2luYm91bmQpKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kLCBwcHRwX2luYm91bmRfcGt0KTsKIAotCUJVR19PTihpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpOwotCWlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSA9ICZwcHRwX2V4cF9ncmU7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlLCBwcHRwX2V4cF9ncmUpOwogCi0JQlVHX09OKGlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pOwotCWlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4gPSAmcHB0cF9uYXRfZXhwZWN0ZWQ7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4sIHBwdHBfbmF0X2V4cGVjdGVkKTsKIAogCXByaW50aygiaXBfbmF0X3BwdHAgdmVyc2lvbiAlcyBsb2FkZWRcbiIsIElQX05BVF9QUFRQX1ZFUlNJT04pOwogCXJldHVybiAwOwpAQCAtMzM1LDE0ICszMzUsMTMgQEAKIHsKIAlERUJVR1AoImNsZWFudXBfbW9kdWxlXG4iICk7CiAKLQlpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuID0gTlVMTDsKLQlpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUgPSBOVUxMOwotCWlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCA9IE5VTEw7Ci0JaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCA9IE5VTEw7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4sIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUsIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX2luYm91bmQsIE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCWlwX25hdF9wcm90b19ncmVfZmluaSgpOwotCS8qIE1ha2Ugc3VyZSBub29uZSBjYWxscyBpdCwgbWVhbndoaWxlICovCi0Jc3luY2hyb25pemVfbmV0KCk7CiAKIAlwcmludGsoImlwX25hdF9wcHRwIHZlcnNpb24gJXMgdW5sb2FkZWRcbiIsIElQX05BVF9QUFRQX1ZFUlNJT04pOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9pcmMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaXJjLmMKaW5kZXggYTc2NzEyMy4uZmViMjZiNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9pcmMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2lyYy5jCkBAIC05OCwxNSArOTgsMTQgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGlwX25hdF9pcmNfZmluaSh2b2lkKQogewotCWlwX25hdF9pcmNfaG9vayA9IE5VTEw7Ci0JLyogTWFrZSBzdXJlIG5vb25lIGNhbGxzIGl0LCBtZWFud2hpbGUuICovCi0Jc3luY2hyb25pemVfbmV0KCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9pcmNfaG9vaywgTlVMTCk7CisJc3luY2hyb25pemVfcmN1KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGlwX25hdF9pcmNfaW5pdCh2b2lkKQogewotCUJVR19PTihpcF9uYXRfaXJjX2hvb2spOwotCWlwX25hdF9pcmNfaG9vayA9IGhlbHA7CisJQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfaXJjX2hvb2spKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2lyY19ob29rLCBoZWxwKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19ncmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fZ3JlLmMKaW5kZXggYmY5MWY5My4uOTU4MTAyMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19ncmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2dyZS5jCkBAIC0xMjksMTEgKzEyOSw5IEBACiAJCQl9CiAJCQlpZiAoZ3JlaC0+Y3N1bSkgewogCQkJCS8qIEZJWE1FOiBOZXZlciB0ZXN0ZWQgdGhpcyBjb2RlLi4uICovCi0JCQkJKihncmVfY3N1bShncmVoKSkgPQotCQkJCQluZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwKLQkJCQkJCQl+KihncmVfa2V5KGdyZWgpKSwKLQkJCQkJCQl0dXBsZS0+ZHN0LnUuZ3JlLmtleSwKLQkJCQkJCQkqKGdyZV9jc3VtKGdyZWgpKSwgMCk7CisJCQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNChncmVfY3N1bShncmVoKSwgKnBza2IsCisJCQkJCQkJKihncmVfa2V5KGdyZWgpKSwKKwkJCQkJCQl0dXBsZS0+ZHN0LnUuZ3JlLmtleSwgMCk7CiAJCQl9CiAJCQkqKGdyZV9rZXkoZ3JlaCkpID0gdHVwbGUtPmRzdC51LmdyZS5rZXk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9faWNtcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19pY21wLmMKaW5kZXggM2Y2ZWZjMS4uZmI3MTZlZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19pY21wLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19pY21wLmMKQEAgLTI0LDggKzI0LDggQEAKIAkgICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1pbiwKIAkgICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1heCkKIHsKLQlyZXR1cm4gKHR1cGxlLT5zcmMudS5pY21wLmlkID49IG1pbi0+aWNtcC5pZAotCQkmJiB0dXBsZS0+c3JjLnUuaWNtcC5pZCA8PSBtYXgtPmljbXAuaWQpOworCXJldHVybiBudG9ocyh0dXBsZS0+c3JjLnUuaWNtcC5pZCkgPj0gbnRvaHMobWluLT5pY21wLmlkKSAmJgorCSAgICAgICBudG9ocyh0dXBsZS0+c3JjLnUuaWNtcC5pZCkgPD0gbnRvaHMobWF4LT5pY21wLmlkKTsKIH0KIAogc3RhdGljIGludApAQCAtNjYsMTAgKzY2LDggQEAKIAkJcmV0dXJuIDA7CiAKIAloZHIgPSAoc3RydWN0IGljbXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGhkcm9mZik7Ci0JaGRyLT5jaGVja3N1bSA9IG5mX3Byb3RvX2NzdW1fdXBkYXRlKCpwc2tiLAotCQkJCQkgICAgIGhkci0+dW4uZWNoby5pZCBeIGh0b25zKDB4RkZGRiksCi0JCQkJCSAgICAgdHVwbGUtPnNyYy51LmljbXAuaWQsCi0JCQkJCSAgICAgaGRyLT5jaGVja3N1bSwgMCk7CisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmaGRyLT5jaGVja3N1bSwgKnBza2IsCisJCQkgICAgICAgaGRyLT51bi5lY2hvLmlkLCB0dXBsZS0+c3JjLnUuaWNtcC5pZCwgMCk7CiAJaGRyLT51bi5lY2hvLmlkID0gdHVwbGUtPnNyYy51LmljbXAuaWQ7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b190Y3AuYwppbmRleCAxMmRlYjEzLi5iNTg2ZDE4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMKQEAgLTEyOSw5ICsxMjksOCBAQAogCWlmIChoZHJzaXplIDwgc2l6ZW9mKCpoZHIpKQogCQlyZXR1cm4gMTsKIAotCWhkci0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwgfm9sZGlwLCBuZXdpcCwgaGRyLT5jaGVjaywgMSk7Ci0JaGRyLT5jaGVjayA9IG5mX3Byb3RvX2NzdW1fdXBkYXRlKCpwc2tiLCBvbGRwb3J0IF4gaHRvbnMoMHhGRkZGKSwgbmV3cG9ydCwKLQkJCQkJICBoZHItPmNoZWNrLCAwKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZoZHItPmNoZWNrLCAqcHNrYiwgb2xkaXAsIG5ld2lwLCAxKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZoZHItPmNoZWNrLCAqcHNrYiwgb2xkcG9ydCwgbmV3cG9ydCwgMCk7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3VkcC5jCmluZGV4IDRiYmVjNzcuLjVjZWQwODcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYwpAQCAtMTE1LDEzICsxMTUsMTAgQEAKIAl9CiAKIAlpZiAoaGRyLT5jaGVjayB8fCAoKnBza2IpLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQloZHItPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsIH5vbGRpcCwgbmV3aXAsCi0JCQkJCQkgIGhkci0+Y2hlY2ssIDEpOwotCQloZHItPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsCi0JCQkJCQkgICpwb3J0cHRyIF4gaHRvbnMoMHhGRkZGKSwgbmV3cG9ydCwKLQkJCQkJCSAgaGRyLT5jaGVjaywgMCk7CisJCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJmhkci0+Y2hlY2ssICpwc2tiLCBvbGRpcCwgbmV3aXAsIDEpOworCQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZoZHItPmNoZWNrLCAqcHNrYiwgKnBvcnRwdHIsIG5ld3BvcnQsIDApOwogCQlpZiAoIWhkci0+Y2hlY2spCi0JCQloZHItPmNoZWNrID0gLTE7CisJCQloZHItPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7CiAJfQogCSpwb3J0cHRyID0gbmV3cG9ydDsKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc2lwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NpcC5jCmluZGV4IDcxZmMyNzMuLjYyMjNhYmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc2lwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zaXAuYwpAQCAtMjksMTggKzI5LDEyMyBAQAogI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQogI2VuZGlmCiAKLWV4dGVybiBzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gY3Rfc2lwX2hkcnNbXTsKK3N0cnVjdCBhZGRyX21hcCB7CisJc3RydWN0IHsKKwkJY2hhcgkJc3JjW3NpemVvZigibm5uLm5ubi5ubm4ubm5uOm5ubm5uIildOworCQljaGFyCQlkc3Rbc2l6ZW9mKCJubm4ubm5uLm5ubi5ubm46bm5ubm4iKV07CisJCXVuc2lnbmVkIGludAlzcmNsZW4sIHNyY2lwbGVuOworCQl1bnNpZ25lZCBpbnQJZHN0bGVuLCBkc3RpcGxlbjsKKwl9IGFkZHJbSVBfQ1RfRElSX01BWF07Cit9OworCitzdGF0aWMgdm9pZCBhZGRyX21hcF9pbml0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBzdHJ1Y3QgYWRkcl9tYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0OworCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7CisJdW5zaWduZWQgaW50IG47CisKKwlmb3IgKGRpciA9IDA7IGRpciA8IElQX0NUX0RJUl9NQVg7IGRpcisrKSB7CisJCXQgPSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlOworCisJCW4gPSBzcHJpbnRmKG1hcC0+YWRkcltkaXJdLnNyYywgIiV1LiV1LiV1LiV1IiwKKwkJCSAgICBOSVBRVUFEKHQtPnNyYy5pcCkpOworCQltYXAtPmFkZHJbZGlyXS5zcmNpcGxlbiA9IG47CisJCW4gKz0gc3ByaW50ZihtYXAtPmFkZHJbZGlyXS5zcmMgKyBuLCAiOiV1IiwKKwkJCSAgICAgbnRvaHModC0+c3JjLnUudWRwLnBvcnQpKTsKKwkJbWFwLT5hZGRyW2Rpcl0uc3JjbGVuID0gbjsKKworCQluID0gc3ByaW50ZihtYXAtPmFkZHJbZGlyXS5kc3QsICIldS4ldS4ldS4ldSIsCisJCQkgICAgTklQUVVBRCh0LT5kc3QuaXApKTsKKwkJbWFwLT5hZGRyW2Rpcl0uZHN0aXBsZW4gPSBuOworCQluICs9IHNwcmludGYobWFwLT5hZGRyW2Rpcl0uZHN0ICsgbiwgIjoldSIsCisJCQkgICAgIG50b2hzKHQtPmRzdC51LnVkcC5wb3J0KSk7CisJCW1hcC0+YWRkcltkaXJdLmRzdGxlbiA9IG47CisJfQorfQorCitzdGF0aWMgaW50IG1hcF9zaXBfYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIGNvbnN0IGNoYXIgKipkcHRyLCBzaXplX3QgZGxlbiwKKwkJCWVudW0gc2lwX2hlYWRlcl9wb3MgcG9zLCBzdHJ1Y3QgYWRkcl9tYXAgKm1hcCkKK3sKKwllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXVuc2lnbmVkIGludCBtYXRjaGxlbiwgbWF0Y2hvZmYsIGFkZHJsZW47CisJY2hhciAqYWRkcjsKKworCWlmIChjdF9zaXBfZ2V0X2luZm8oKmRwdHIsIGRsZW4sICZtYXRjaG9mZiwgJm1hdGNobGVuLCBwb3MpIDw9IDApCisJCXJldHVybiAxOworCisJaWYgKChtYXRjaGxlbiA9PSBtYXAtPmFkZHJbZGlyXS5zcmNpcGxlbiB8fAorCSAgICAgbWF0Y2hsZW4gPT0gbWFwLT5hZGRyW2Rpcl0uc3JjbGVuKSAmJgorCSAgICBtZW1jbXAoKmRwdHIgKyBtYXRjaG9mZiwgbWFwLT5hZGRyW2Rpcl0uc3JjLCBtYXRjaGxlbikgPT0gMCkgeworCQlhZGRyICAgID0gbWFwLT5hZGRyWyFkaXJdLmRzdDsKKwkJYWRkcmxlbiA9IG1hcC0+YWRkclshZGlyXS5kc3RsZW47CisJfSBlbHNlIGlmICgobWF0Y2hsZW4gPT0gbWFwLT5hZGRyW2Rpcl0uZHN0aXBsZW4gfHwKKwkJICAgIG1hdGNobGVuID09IG1hcC0+YWRkcltkaXJdLmRzdGxlbikgJiYKKwkJICAgbWVtY21wKCpkcHRyICsgbWF0Y2hvZmYsIG1hcC0+YWRkcltkaXJdLmRzdCwgbWF0Y2hsZW4pID09IDApIHsKKwkJYWRkciAgICA9IG1hcC0+YWRkclshZGlyXS5zcmM7CisJCWFkZHJsZW4gPSBtYXAtPmFkZHJbIWRpcl0uc3JjbGVuOworCX0gZWxzZQorCQlyZXR1cm4gMTsKKworCWlmICghaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLCBhZGRyLCBhZGRybGVuKSkKKwkJcmV0dXJuIDA7CisJKmRwdHIgPSAoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlyZXR1cm4gMTsKKworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlwX25hdF9zaXAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAorCQkJICAgICAgIGNvbnN0IGNoYXIgKipkcHRyKQoreworCWVudW0gc2lwX2hlYWRlcl9wb3MgcG9zOworCXN0cnVjdCBhZGRyX21hcCBtYXA7CisJaW50IGRhdGFvZmYsIGRhdGFsZW47CisKKwlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKKwlpZiAoZGF0YWxlbiA8IHNpemVvZigiU0lQLzIuMCIpIC0gMSkKKwkJcmV0dXJuIE5GX0RST1A7CisKKwlhZGRyX21hcF9pbml0KGN0LCAmbWFwKTsKKworCS8qIEJhc2ljIHJ1bGVzOiByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLiAqLworCWlmIChzdHJuY21wKCpkcHRyLCAiU0lQLzIuMCIsIHNpemVvZigiU0lQLzIuMCIpIC0gMSkgIT0gMCkgeworCQkvKiAxMC4yOiBDb25zdHJ1Y3RpbmcgdGhlIFJFR0lTVEVSIFJlcXVlc3Q6CisJCSAqCisJCSAqIFRoZSAidXNlcmluZm8iIGFuZCAiQCIgY29tcG9uZW50cyBvZiB0aGUgU0lQIFVSSSBNVVNUIE5PVAorCQkgKiBiZSBwcmVzZW50LgorCQkgKi8KKwkJaWYgKGRhdGFsZW4gPj0gc2l6ZW9mKCJSRUdJU1RFUiIpIC0gMSAmJgorCQkgICAgc3RybmNtcCgqZHB0ciwgIlJFR0lTVEVSIiwgc2l6ZW9mKCJSRUdJU1RFUiIpIC0gMSkgPT0gMCkKKwkJCXBvcyA9IFBPU19SRUdfUkVRX1VSSTsKKwkJZWxzZQorCQkJcG9zID0gUE9TX1JFUV9VUkk7CisKKwkJaWYgKCFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgcG9zLCAmbWFwKSkKKwkJCXJldHVybiBORl9EUk9QOworCX0KKworCWlmICghbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIFBPU19GUk9NLCAmbWFwKSB8fAorCSAgICAhbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIFBPU19UTywgJm1hcCkgfHwKKwkgICAgIW1hcF9zaXBfYWRkcihwc2tiLCBjdGluZm8sIGN0LCBkcHRyLCBkYXRhbGVuLCBQT1NfVklBLCAmbWFwKSB8fAorCSAgICAhbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIFBPU19DT05UQUNULCAmbWFwKSkKKwkJcmV0dXJuIE5GX0RST1A7CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KIAogc3RhdGljIHVuc2lnbmVkIGludCBtYW5nbGVfc2lwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCiAJCQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCiAJCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCiAJCQkJICAgICAgY29uc3QgY2hhciAqKmRwdHIsIHNpemVfdCBkbGVuLAogCQkJCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZsZW4sCi0JCQkJICAgICAgc3RydWN0IHNpcF9oZWFkZXJfbmZvICpobmZvKQorCQkJCSAgICAgIGVudW0gc2lwX2hlYWRlcl9wb3MgcG9zKQogewogCXVuc2lnbmVkIGludCBtYXRjaGxlbiwgbWF0Y2hvZmY7CiAKLQlpZiAoY3Rfc2lwX2dldF9pbmZvKCpkcHRyLCBkbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwgaG5mbykgPD0gMCkKKwlpZiAoY3Rfc2lwX2dldF9pbmZvKCpkcHRyLCBkbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwgcG9zKSA8PSAwKQogCQlyZXR1cm4gMDsKIAogCWlmICghaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCkBAIC01Miw3NyArMTU3LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBpcF9uYXRfc2lwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgICBjb25zdCBjaGFyICoqZHB0cikKLXsKLQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWNoYXIgYnVmZmVyW3NpemVvZigibm5uLm5ubi5ubm4ubm5uOm5ubm5uIildOwotCXVuc2lnbmVkIGludCBidWZmbGVuLCBkYXRhb2ZmOwotCV9fYmUzMiBpcDsKLQlfX2JlMTYgcG9ydDsKLQotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCi0JaXAgICA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwOwotCXBvcnQgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51LnVkcC5wb3J0OwotCWJ1ZmZsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiV1LiV1LiV1LiV1OiV1IiwgTklQUVVBRChpcCksIG50b2hzKHBvcnQpKTsKLQotCS8qIHNob3J0IHBhY2tldCA/ICovCi0JaWYgKCgoKnBza2IpLT5sZW4gLSBkYXRhb2ZmKSA8IChzaXplb2YoIlNJUC8yLjAiKSAtIDEpKQotCQlyZXR1cm4gMDsKLQotCS8qIEJhc2ljIHJ1bGVzOiByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLiAqLwotCWlmIChtZW1jbXAoKmRwdHIsICJTSVAvMi4wIiwgc2l6ZW9mKCJTSVAvMi4wIikgLSAxKSA9PSAwKSB7Ci0JCWNvbnN0IGNoYXIgKmF1eDsKLQotCQlpZiAoKGN0aW5mbykgPCBJUF9DVF9JU19SRVBMWSkgewotCQkJbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwKLQkJCSAgICAgICAgICAgICAgICAgICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JCQkgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZsZW4sCi0JCQkgICAgICAgICAgICAgICAgICAmY3Rfc2lwX2hkcnNbUE9TX0NPTlRBQ1RdKTsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJaWYgKCFtYW5nbGVfc2lwX3BhY2tldChwc2tiLCBjdGluZm8sIGN0LCBkcHRyLAotCQkJCSAgICAgICAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAotCQkgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwgJmN0X3NpcF9oZHJzW1BPU19WSUFdKSkKLQkJCXJldHVybiAwOwotCi0JCS8qIFRoaXMgc2VhcmNoIHNob3VsZCBpZ25vcmUgY2FzZSwgYnV0IGxhdGVyLi4gKi8KLQkJYXV4ID0gY3Rfc2lwX3NlYXJjaCgiQ1NlcToiLCAqZHB0ciwgc2l6ZW9mKCJDU2VxOiIpIC0gMSwKLQkJICAgICAgICAgICAgICAgICAgICAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmKTsKLQkJaWYgKCFhdXgpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoIWN0X3NpcF9zZWFyY2goIlJFR0lTVEVSIiwgYXV4LCBzaXplb2YoIlJFR0lTVEVSIiksCi0JCSAgICBjdF9zaXBfbG5sZW4oYXV4LCAqZHB0ciArICgqcHNrYiktPmxlbiAtIGRhdGFvZmYpKSkKLQkJCXJldHVybiAxOwotCi0JCXJldHVybiBtYW5nbGVfc2lwX3BhY2tldChwc2tiLCBjdGluZm8sIGN0LCBkcHRyLAotCQkJCQkgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwKLQkJCQkJICZjdF9zaXBfaGRyc1tQT1NfQ09OVEFDVF0pOwotCX0KLQlpZiAoKGN0aW5mbykgPCBJUF9DVF9JU19SRVBMWSkgewotCQlpZiAoIW1hbmdsZV9zaXBfcGFja2V0KHBza2IsIGN0aW5mbywgY3QsIGRwdHIsCi0JCQkJICAgICAgICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCAmY3Rfc2lwX2hkcnNbUE9TX1ZJQV0pKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogTWFuZ2xlIENvbnRhY3QgaWYgZXhpc3RzIG9ubHkuIC0gd2F0Y2ggdWRwX25hdF9tYW5nbGUoKSEgKi8KLQkJbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKLQkJICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCAmY3Rfc2lwX2hkcnNbUE9TX0NPTlRBQ1RdKTsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qIFRoaXMgbWFuZ2xlIHJlcXVlc3RzIGhlYWRlcnMuICovCi0JcmV0dXJuIG1hbmdsZV9zaXBfcGFja2V0KHBza2IsIGN0aW5mbywgY3QsIGRwdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGN0X3NpcF9sbmxlbigqZHB0ciwKLQkJCQkgICAgICAgICAgICAgICpkcHRyICsgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwgJmN0X3NpcF9oZHJzW1BPU19SRVFfSEVBREVSXSk7Ci19Ci0KIHN0YXRpYyBpbnQgbWFuZ2xlX2NvbnRlbnRfbGVuKHN0cnVjdCBza19idWZmICoqcHNrYiwKIAkJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAogCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCkBAIC0xMzYsNyArMTcwLDcgQEAKIAogCS8qIEdldCBhY3R1YWwgU0RQIGxlbmdodCAqLwogCWlmIChjdF9zaXBfZ2V0X2luZm8oZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwgJm1hdGNob2ZmLAotCSAgICAgICAgICAgICAgICAgICAgJm1hdGNobGVuLCAmY3Rfc2lwX2hkcnNbUE9TX1NEUF9IRUFERVJdKSA+IDApIHsKKwkgICAgICAgICAgICAgICAgICAgICZtYXRjaGxlbiwgUE9TX1NEUF9IRUFERVIpID4gMCkgewogCiAJCS8qIHNpbmNlIGN0X3NpcF9nZXRfaW5mbygpIGdpdmUgdXMgYSBwb2ludGVyIHBhc3NpbmcgJ3Y9JwogCQkgICB3ZSBuZWVkIHRvIGFkZCAyIGJ5dGVzIGluIHRoaXMgY291bnQuICovCkBAIC0xNDQsNyArMTc4LDcgQEAKIAogCQkvKiBOb3csIHVwZGF0ZSBTRFAgbGVuZ2h0ICovCiAJCWlmIChjdF9zaXBfZ2V0X2luZm8oZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwgJm1hdGNob2ZmLAotCQkgICAgICAgICAgICAgICAgICAgICZtYXRjaGxlbiwgJmN0X3NpcF9oZHJzW1BPU19DT05URU5UXSkgPiAwKSB7CisJCSAgICAgICAgICAgICAgICAgICAgJm1hdGNobGVuLCBQT1NfQ09OVEVOVCkgPiAwKSB7CiAKIAkJCWJ1ZmZsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiV1IiwgY19sZW4pOwogCkBAIC0xNzAsMTcgKzIwNCwxNyBAQAogCS8qIE1hbmdsZSBvd25lciBhbmQgY29udGFjdCBpbmZvLiAqLwogCWJ1ZmZsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChuZXdpcCkpOwogCWlmICghbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZsZW4sICZjdF9zaXBfaGRyc1tQT1NfT1dORVJdKSkKKwkgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwgUE9TX09XTkVSKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIW1hbmdsZV9zaXBfcGFja2V0KHBza2IsIGN0aW5mbywgY3QsICZkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAotCSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCAmY3Rfc2lwX2hkcnNbUE9TX0NPTk5FQ1RJT05dKSkKKwkgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwgUE9TX0NPTk5FQ1RJT04pKQogCQlyZXR1cm4gMDsKIAogCS8qIE1hbmdsZSBtZWRpYSBwb3J0LiAqLwogCWJ1ZmZsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiV1IiwgcG9ydCk7CiAJaWYgKCFtYW5nbGVfc2lwX3BhY2tldChwc2tiLCBjdGluZm8sIGN0LCAmZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmxlbiwgJmN0X3NpcF9oZHJzW1BPU19NRURJQV0pKQorCSAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmbGVuLCBQT1NfTUVESUEpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBtYW5nbGVfY29udGVudF9sZW4ocHNrYiwgY3RpbmZvLCBjdCwgZHB0cik7CkBAIC0yMzAsMTggKzI2NCwxNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwX25hdF9zaXBfaG9vayA9IE5VTEw7Ci0JaXBfbmF0X3NkcF9ob29rID0gTlVMTDsKLQkvKiBNYWtlIHN1cmUgbm9vbmUgY2FsbHMgaXQsIG1lYW53aGlsZS4gKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3NpcF9ob29rLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3NkcF9ob29rLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCUJVR19PTihpcF9uYXRfc2lwX2hvb2spOwotCUJVR19PTihpcF9uYXRfc2RwX2hvb2spOwotCWlwX25hdF9zaXBfaG9vayA9IGlwX25hdF9zaXA7Ci0JaXBfbmF0X3NkcF9ob29rID0gaXBfbmF0X3NkcDsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9zaXBfaG9vaykpOworCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3NkcF9ob29rKSk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9zaXBfaG9vaywgaXBfbmF0X3NpcCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9zZHBfaG9vaywgaXBfbmF0X3NkcCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc25tcF9iYXNpYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zbm1wX2Jhc2ljLmMKaW5kZXggMTY4ZjQ1Zi4uYzNkOWYzYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zbm1wX2Jhc2ljLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zbm1wX2Jhc2ljLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAogI2RlZmluZSBTTk1QX1BPUlQgMTYxCiAjZGVmaW5lIFNOTVBfVFJBUF9QT1JUIDE2MgotI2RlZmluZSBOT0NUMShuKSAodV9pbnQ4X3QgKSgobikgJiAweGZmKQorI2RlZmluZSBOT0NUMShuKSAoKih1OCAqKW4pCiAKIHN0YXRpYyBpbnQgZGVidWc7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNubXBfbG9jayk7CkBAIC02MTMsNyArNjEzLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYW5nbGVfYWRkcmVzcyh1bnNpZ25lZCBjaGFyICpiZWdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICphZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCAqY2hlY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3VtMTYgKmNoZWNrKTsKIHN0cnVjdCBzbm1wX2NudgogewogCXVuc2lnbmVkIGludCBjbGFzczsKQEAgLTg3MywzOCArODczLDI0IEBACiAgKiBGYXN0IGNoZWNrc3VtIHVwZGF0ZSBmb3IgcG9zc2libHkgb2RkbHktYWxpZ25lZCBVRFAgYnl0ZSwgZnJvbSB0aGUKICAqIGNvZGUgZXhhbXBsZSBpbiB0aGUgZHJhZnQuCiAgKi8KLXN0YXRpYyB2b2lkIGZhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICpjc3VtLAorc3RhdGljIHZvaWQgZmFzdF9jc3VtKF9fc3VtMTYgKmNzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb3B0ciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpucHRyLAotICAgICAgICAgICAgICAgICAgICAgIGludCBvZGQpCisgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCkKIHsKLQlsb25nIHgsIG9sZCwgbmV3OwotCQotCXggPSBjc3VtWzBdICogMjU2ICsgY3N1bVsxXTsKLQkKLQl4ID1+IHggJiAweEZGRkY7Ci0JCi0JaWYgKG9kZCkgb2xkID0gb3B0clswXSAqIDI1NjsKLQllbHNlIG9sZCA9IG9wdHJbMF07Ci0JCi0JeCAtPSBvbGQgJiAweEZGRkY7Ci0JaWYgKHggPD0gMCkgewotCQl4LS07Ci0JCXggJj0gMHhGRkZGOworCXVuc2lnbmVkIGNoYXIgc1s0XTsKKworCWlmIChvZmZzZXQgJiAxKSB7CisJCXNbMF0gPSBzWzJdID0gMDsKKwkJc1sxXSA9IH4qb3B0cjsKKwkJc1szXSA9ICpucHRyOworCX0gZWxzZSB7CisJCXNbMV0gPSBzWzNdID0gMDsKKwkJc1swXSA9IH4qb3B0cjsKKwkJc1syXSA9ICpucHRyOwogCX0KLQkKLQlpZiAob2RkKSBuZXcgPSBucHRyWzBdICogMjU2OwotCWVsc2UgbmV3ID0gbnB0clswXTsKLQkKLQl4ICs9IG5ldyAmIDB4RkZGRjsKLQlpZiAoeCAmIDB4MTAwMDApIHsKLQkJeCsrOwotCQl4ICY9IDB4RkZGRjsKLQl9Ci0JCi0JeCA9fiB4ICYgMHhGRkZGOwotCWNzdW1bMF0gPSB4IC8gMjU2OwotCWNzdW1bMV0gPSB4ICYgMHhGRjsKKworCSpjc3VtID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChzLCA0LCB+Y3N1bV91bmZvbGQoKmNzdW0pKSk7CiB9CiAKIC8qIApAQCAtOTE1LDkgKzkwMSw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbWFuZ2xlX2FkZHJlc3ModW5zaWduZWQgY2hhciAqYmVnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludDE2X3QgKmNoZWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3VtMTYgKmNoZWNrKQogewotCWlmIChtYXAtPmZyb20gPT0gTk9DVDEoKmFkZHIpKSB7CisJaWYgKG1hcC0+ZnJvbSA9PSBOT0NUMShhZGRyKSkgewogCQl1X2ludDMyX3Qgb2xkOwogCQkKIAkJaWYgKGRlYnVnKQpAQCAtOTI3LDExICs5MTMsOCBAQAogCQkKIAkJLyogVXBkYXRlIFVEUCBjaGVja3N1bSBpZiBiZWluZyB1c2VkICovCiAJCWlmICgqY2hlY2spIHsKLQkJCXVuc2lnbmVkIGNoYXIgb2RkID0gISgoYWRkciAtIGJlZ2luKSAlIDIpOwotCQkJCi0JCQlmYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKiljaGVjaywKLQkJCSAgICAgICAgICAmbWFwLT5mcm9tLCAmbWFwLT50bywgb2RkKTsKLQkJCSAgICAgICAgICAKKwkJCWZhc3RfY3N1bShjaGVjaywKKwkJCSAgICAgICAgICAmbWFwLT5mcm9tLCAmbWFwLT50bywgYWRkciAtIGJlZ2luKTsKIAkJfQogCQkKIAkJaWYgKGRlYnVnKQpAQCAtOTQzLDcgKzkyNiw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX3RyYXBfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc25tcF92MV90cmFwICp0cmFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQxNl90ICpjaGVjaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zdW0xNiAqY2hlY2spCiB7CiAJdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIGxlbjsKIAl1bnNpZ25lZCBjaGFyICplbmQ7CkBAIC0xMDM3LDcgKzEwMjAsNyBAQAogc3RhdGljIGludCBzbm1wX3BhcnNlX21hbmdsZSh1bnNpZ25lZCBjaGFyICptc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludDE2X3QgKmNoZWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N1bTE2ICpjaGVjaykKIHsKIAl1bnNpZ25lZCBjaGFyICplb2MsICplbmQ7CiAJdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIHZlcnMsIHBkdXR5cGU7CkBAIC0xMjIzLDEyICsxMjA2LDEyIEBACiAJICovCiAJaWYgKGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpIHsKIAkJLyogU05BVCB0cmFwcyAqLwotCQltYXAuZnJvbSA9IE5PQ1QxKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXApOwotCQltYXAudG8gPSBOT0NUMShjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwKTsKKwkJbWFwLmZyb20gPSBOT0NUMSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcCk7CisJCW1hcC50byA9IE5PQ1QxKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwKTsKIAl9IGVsc2UgewogCQkvKiBETkFUIHJlcGxpZXMgKi8KLQkJbWFwLmZyb20gPSBOT0NUMShjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmlwKTsKLQkJbWFwLnRvID0gTk9DVDEoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcCk7CisJCW1hcC5mcm9tID0gTk9DVDEoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApOworCQltYXAudG8gPSBOT0NUMSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcCk7CiAJfQogCQogCWlmIChtYXAuZnJvbSA9PSBtYXAudG8pCkBAIC0xMjk0LDExICsxMjc3LDExIEBACiAJLmhlbHAgPSBoZWxwLAogCS5uYW1lID0gInNubXAiLAogCi0JLnR1cGxlID0geyAuc3JjID0geyAudSA9IHsgX19jb25zdGFudF9odG9ucyhTTk1QX1BPUlQpIH0gfSwKLQkJICAgLmRzdCA9IHsgLnByb3RvbnVtID0gSVBQUk9UT19VRFAgfSwKKwkudHVwbGUgPSB7LnNyYyA9IHsudSA9IHsudWRwID0gey5wb3J0ID0gX19jb25zdGFudF9odG9ucyhTTk1QX1BPUlQpfX19LAorCQkgIC5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19VRFB9LAogCX0sCi0JLm1hc2sgPSB7IC5zcmMgPSB7IC51ID0geyAweEZGRkYgfSB9LAotCQkgLmRzdCA9IHsgLnByb3RvbnVtID0gMHhGRiB9LAorCS5tYXNrID0gey5zcmMgPSB7LnUgPSB7MHhGRkZGfX0sCisJCSAuZHN0ID0gey5wcm90b251bSA9IDB4RkZ9LAogCX0sCiB9OwogCkBAIC0xMzA5LDExICsxMjkyLDExIEBACiAJLmhlbHAgPSBoZWxwLAogCS5uYW1lID0gInNubXBfdHJhcCIsCiAKLQkudHVwbGUgPSB7IC5zcmMgPSB7IC51ID0geyBfX2NvbnN0YW50X2h0b25zKFNOTVBfVFJBUF9QT1JUKSB9IH0sCi0JCSAgIC5kc3QgPSB7IC5wcm90b251bSA9IElQUFJPVE9fVURQIH0sCisJLnR1cGxlID0gey5zcmMgPSB7LnUgPSB7LnVkcCA9IHsucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoU05NUF9UUkFQX1BPUlQpfX19LAorCQkgIC5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19VRFB9LAogCX0sCi0JLm1hc2sgPSB7IC5zcmMgPSB7IC51ID0geyAweEZGRkYgfSB9LAotCQkgLmRzdCA9IHsgLnByb3RvbnVtID0gMHhGRiB9LAorCS5tYXNrID0gey5zcmMgPSB7LnUgPSB7MHhGRkZGfX0sCisJCSAuZHN0ID0gey5wcm90b251bSA9IDB4RkZ9LAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IGQ4NWQyZGUuLmFkNjYzMjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCkBAIC00NCwxMiArNDQsNiBAQAogI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQogI2VuZGlmCiAKLSNkZWZpbmUgSE9PS05BTUUoaG9va251bSkgKChob29rbnVtKSA9PSBORl9JUF9QT1NUX1JPVVRJTkcgPyAiUE9TVF9ST1VUSU5HIiAgXAotCQkJICAgOiAoKGhvb2tudW0pID09IE5GX0lQX1BSRV9ST1VUSU5HID8gIlBSRV9ST1VUSU5HIiBcCi0JCQkgICAgICA6ICgoaG9va251bSkgPT0gTkZfSVBfTE9DQUxfT1VUID8gIkxPQ0FMX09VVCIgIFwKLQkJCSAgICAgICAgIDogKChob29rbnVtKSA9PSBORl9JUF9MT0NBTF9JTiA/ICJMT0NBTF9JTiIgIFwKLQkJCQkgICAgOiAiKkVSUk9SKiIpKSkKLQogI2lmZGVmIENPTkZJR19YRlJNCiBzdGF0aWMgdm9pZCBuYXRfZGVjb2RlX3Nlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCkKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfdGZ0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF90ZnRwLmMKaW5kZXggOTRhNzgwMS4uNjA0NzkzNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF90ZnRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF90ZnRwLmMKQEAgLTU1LDE1ICs1NSwxNCBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X3RmdHBfZmluaSh2b2lkKQogewotCWlwX25hdF90ZnRwX2hvb2sgPSBOVUxMOwotCS8qIE1ha2Ugc3VyZSBub29uZSBjYWxscyBpdCwgbWVhbndoaWxlLiAqLwotCXN5bmNocm9uaXplX25ldCgpOworCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfdGZ0cF9ob29rLCBOVUxMKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaXBfbmF0X3RmdHBfaW5pdCh2b2lkKQogewotCUJVR19PTihpcF9uYXRfdGZ0cF9ob29rKTsKLQlpcF9uYXRfdGZ0cF9ob29rID0gaGVscDsKKwlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF90ZnRwX2hvb2spKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3RmdHBfaG9vaywgaGVscCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9xdWV1ZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKaW5kZXggN2VkYWQ3OS4uY2Q1MjBkZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCXBtc2ctPmRhdGFfbGVuICAgICAgICA9IGRhdGFfbGVuOwogCXBtc2ctPnRpbWVzdGFtcF9zZWMgICA9IGVudHJ5LT5za2ItPnRzdGFtcC5vZmZfc2VjOwogCXBtc2ctPnRpbWVzdGFtcF91c2VjICA9IGVudHJ5LT5za2ItPnRzdGFtcC5vZmZfdXNlYzsKLQlwbXNnLT5tYXJrICAgICAgICAgICAgPSBlbnRyeS0+c2tiLT5uZm1hcms7CisJcG1zZy0+bWFyayAgICAgICAgICAgID0gZW50cnktPnNrYi0+bWFyazsKIAlwbXNnLT5ob29rICAgICAgICAgICAgPSBlbnRyeS0+aW5mby0+aG9vazsKIAlwbXNnLT5od19wcm90b2NvbCAgICAgPSBlbnRyeS0+c2tiLT5wcm90b2NvbDsKIAkKQEAgLTM1MSw5ICszNTEsMTAgQEAKIAlpZiAodi0+ZGF0YV9sZW4gPCBzaXplb2YoKnVzZXJfaXBoKSkKIAkJcmV0dXJuIDA7CiAJZGlmZiA9IHYtPmRhdGFfbGVuIC0gZS0+c2tiLT5sZW47Ci0JaWYgKGRpZmYgPCAwKQotCQlza2JfdHJpbShlLT5za2IsIHYtPmRhdGFfbGVuKTsKLQllbHNlIGlmIChkaWZmID4gMCkgeworCWlmIChkaWZmIDwgMCkgeworCQlpZiAocHNrYl90cmltKGUtPnNrYiwgdi0+ZGF0YV9sZW4pKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlIGlmIChkaWZmID4gMCkgewogCQlpZiAodi0+ZGF0YV9sZW4gPiAweEZGRkYpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKGRpZmYgPiBza2JfdGFpbHJvb20oZS0+c2tiKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCmluZGV4IDc4YTQ0YjAuLjA5Njk2ZjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTM4NCw2ICszODQsNyBAQAogCQlmb3IgKDs7KSB7CiAJCQlzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCAqdAogCQkJCT0gKHZvaWQgKilpcHRfZ2V0X3RhcmdldChlKTsKKwkJCWludCB2aXNpdGVkID0gZS0+Y29tZWZyb20gJiAoMSA8PCBob29rKTsKIAogCQkJaWYgKGUtPmNvbWVmcm9tICYgKDEgPDwgTkZfSVBfTlVNSE9PS1MpKSB7CiAJCQkJcHJpbnRrKCJpcHRhYmxlczogbG9vcCBob29rICV1IHBvcyAldSAlMDhYLlxuIiwKQEAgLTM5NCwxMyArMzk1LDIwIEBACiAJCQkJfD0gKCgxIDw8IGhvb2spIHwgKDEgPDwgTkZfSVBfTlVNSE9PS1MpKTsKIAogCQkJLyogVW5jb25kaXRpb25hbCByZXR1cm4vRU5ELiAqLwotCQkJaWYgKGUtPnRhcmdldF9vZmZzZXQgPT0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpCisJCQlpZiAoKGUtPnRhcmdldF9vZmZzZXQgPT0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpCiAJCQkgICAgJiYgKHN0cmNtcCh0LT50YXJnZXQudS51c2VyLm5hbWUsCiAJCQkJICAgICAgIElQVF9TVEFOREFSRF9UQVJHRVQpID09IDApCiAJCQkgICAgJiYgdC0+dmVyZGljdCA8IDAKLQkJCSAgICAmJiB1bmNvbmRpdGlvbmFsKCZlLT5pcCkpIHsKKwkJCSAgICAmJiB1bmNvbmRpdGlvbmFsKCZlLT5pcCkpIHx8IHZpc2l0ZWQpIHsKIAkJCQl1bnNpZ25lZCBpbnQgb2xkcG9zLCBzaXplOwogCisJCQkJaWYgKHQtPnZlcmRpY3QgPCAtTkZfTUFYX1ZFUkRJQ1QgLSAxKSB7CisJCQkJCWR1cHJpbnRmKCJtYXJrX3NvdXJjZV9jaGFpbnM6IGJhZCAiCisJCQkJCQkibmVnYXRpdmUgdmVyZGljdCAoJWkpXG4iLAorCQkJCQkJCQl0LT52ZXJkaWN0KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCiAJCQkJLyogUmV0dXJuOiBiYWNrdHJhY2sgdGhyb3VnaCB0aGUgbGFzdAogCQkJCSAgIGJpZyBqdW1wLiAqLwogCQkJCWRvIHsKQEAgLTQzOCw2ICs0NDYsMTMgQEAKIAkJCQlpZiAoc3RyY21wKHQtPnRhcmdldC51LnVzZXIubmFtZSwKIAkJCQkJICAgSVBUX1NUQU5EQVJEX1RBUkdFVCkgPT0gMAogCQkJCSAgICAmJiBuZXdwb3MgPj0gMCkgeworCQkJCQlpZiAobmV3cG9zID4gbmV3aW5mby0+c2l6ZSAtCisJCQkJCQlzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSkpIHsKKwkJCQkJCWR1cHJpbnRmKCJtYXJrX3NvdXJjZV9jaGFpbnM6ICIKKwkJCQkJCQkiYmFkIHZlcmRpY3QgKCVpKVxuIiwKKwkJCQkJCQkJbmV3cG9zKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CiAJCQkJCS8qIFRoaXMgYSBqdW1wOyBjaGFzZSBpdC4gKi8KIAkJCQkJZHVwcmludGYoIkp1bXAgcnVsZSAldSAtPiAldVxuIiwKIAkJCQkJCSBwb3MsIG5ld3Bvcyk7CkBAIC00NzAsMjggKzQ4NSw0NyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotc3RhbmRhcmRfY2hlY2soY29uc3Qgc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQsCi0JICAgICAgIHVuc2lnbmVkIGludCBtYXhfb2Zmc2V0KQorY2hlY2tfZW50cnkoc3RydWN0IGlwdF9lbnRyeSAqZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCAqdGFyZyA9ICh2b2lkICopdDsKKwlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKIAotCS8qIENoZWNrIHN0YW5kYXJkIGluZm8uICovCi0JaWYgKHRhcmctPnZlcmRpY3QgPj0gMAotCSAgICAmJiB0YXJnLT52ZXJkaWN0ID4gbWF4X29mZnNldCAtIHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSkgewotCQlkdXByaW50ZigiaXB0X3N0YW5kYXJkX2NoZWNrOiBiYWQgdmVyZGljdCAoJWkpXG4iLAotCQkJIHRhcmctPnZlcmRpY3QpOwotCQlyZXR1cm4gMDsKKwlpZiAoIWlwX2NoZWNrZW50cnkoJmUtPmlwKSkgeworCQlkdXByaW50ZigiaXBfdGFibGVzOiBpcCBjaGVjayBmYWlsZWQgJXAgJXMuXG4iLCBlLCBuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICh0YXJnLT52ZXJkaWN0IDwgLU5GX01BWF9WRVJESUNUIC0gMSkgewotCQlkdXByaW50ZigiaXB0X3N0YW5kYXJkX2NoZWNrOiBiYWQgbmVnYXRpdmUgdmVyZGljdCAoJWkpXG4iLAotCQkJIHRhcmctPnZlcmRpY3QpOwotCQlyZXR1cm4gMDsKKworCWlmIChlLT50YXJnZXRfb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnlfdGFyZ2V0KSA+IGUtPm5leHRfb2Zmc2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXQgPSBpcHRfZ2V0X3RhcmdldChlKTsKKwlpZiAoZS0+dGFyZ2V0X29mZnNldCArIHQtPnUudGFyZ2V0X3NpemUgPiBlLT5uZXh0X29mZnNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbWF0Y2goc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgdW5zaWduZWQgaW50IGhvb2ttYXNrKQoreworCXN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoOworCWludCByZXQ7CisKKwltYXRjaCA9IG0tPnUua2VybmVsLm1hdGNoOworCXJldCA9IHh0X2NoZWNrX21hdGNoKG1hdGNoLCBBRl9JTkVULCBtLT51Lm1hdGNoX3NpemUgLSBzaXplb2YoKm0pLAorCQkJICAgICBuYW1lLCBob29rbWFzaywgaXAtPnByb3RvLAorCQkJICAgICBpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKTsKKwlpZiAoIXJldCAmJiBtLT51Lmtlcm5lbC5tYXRjaC0+Y2hlY2tlbnRyeQorCSAgICAmJiAhbS0+dS5rZXJuZWwubWF0Y2gtPmNoZWNrZW50cnkobmFtZSwgaXAsIG1hdGNoLCBtLT5kYXRhLAorCQkJCQkgICAgICBob29rbWFzaykpIHsKKwkJZHVwcmludGYoImlwX3RhYmxlczogY2hlY2sgZmFpbGVkIGZvciBgJXMnLlxuIiwKKwkJCSBtLT51Lmtlcm5lbC5tYXRjaC0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CiAJfQotCXJldHVybiAxOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1jaGVja19tYXRjaChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLAorZmluZF9jaGVja19tYXRjaChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLAogCSAgICBjb25zdCBjaGFyICpuYW1lLAogCSAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKIAkgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrLApAQCAtNTA0LDI2ICs1MzgsMTUgQEAKIAkJCQkJCSAgIG0tPnUudXNlci5yZXZpc2lvbiksCiAJCQkJCSJpcHRfJXMiLCBtLT51LnVzZXIubmFtZSk7CiAJaWYgKElTX0VSUihtYXRjaCkgfHwgIW1hdGNoKSB7Ci0JCWR1cHJpbnRmKCJjaGVja19tYXRjaDogYCVzJyBub3QgZm91bmRcbiIsIG0tPnUudXNlci5uYW1lKTsKKwkJZHVwcmludGYoImZpbmRfY2hlY2tfbWF0Y2g6IGAlcycgbm90IGZvdW5kXG4iLCBtLT51LnVzZXIubmFtZSk7CiAJCXJldHVybiBtYXRjaCA/IFBUUl9FUlIobWF0Y2gpIDogLUVOT0VOVDsKIAl9CiAJbS0+dS5rZXJuZWwubWF0Y2ggPSBtYXRjaDsKIAotCXJldCA9IHh0X2NoZWNrX21hdGNoKG1hdGNoLCBBRl9JTkVULCBtLT51Lm1hdGNoX3NpemUgLSBzaXplb2YoKm0pLAotCQkJICAgICBuYW1lLCBob29rbWFzaywgaXAtPnByb3RvLAotCQkJICAgICBpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKTsKKwlyZXQgPSBjaGVja19tYXRjaChtLCBuYW1lLCBpcCwgaG9va21hc2spOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0JaWYgKG0tPnUua2VybmVsLm1hdGNoLT5jaGVja2VudHJ5Ci0JICAgICYmICFtLT51Lmtlcm5lbC5tYXRjaC0+Y2hlY2tlbnRyeShuYW1lLCBpcCwgbWF0Y2gsIG0tPmRhdGEsCi0JCQkJCSAgICAgIGhvb2ttYXNrKSkgewotCQlkdXByaW50ZigiaXBfdGFibGVzOiBjaGVjayBmYWlsZWQgZm9yIGAlcycuXG4iLAotCQkJIG0tPnUua2VybmVsLm1hdGNoLT5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCiAJKCppKSsrOwogCXJldHVybiAwOwogZXJyOgpAQCAtNTMxLDEwICs1NTQsMjkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgaXB0X3N0YW5kYXJkX3RhcmdldDsKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3RhcmdldChzdHJ1Y3QgaXB0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lKQoreworIAlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKKyAJc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKKyAJaW50IHJldDsKKworCXQgPSBpcHRfZ2V0X3RhcmdldChlKTsKKwl0YXJnZXQgPSB0LT51Lmtlcm5lbC50YXJnZXQ7CisJcmV0ID0geHRfY2hlY2tfdGFyZ2V0KHRhcmdldCwgQUZfSU5FVCwgdC0+dS50YXJnZXRfc2l6ZSAtIHNpemVvZigqdCksCisJCQkgICAgICBuYW1lLCBlLT5jb21lZnJvbSwgZS0+aXAucHJvdG8sCisJCQkgICAgICBlLT5pcC5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pOworCWlmICghcmV0ICYmIHQtPnUua2VybmVsLnRhcmdldC0+Y2hlY2tlbnRyeQorCQkgICAmJiAhdC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5KG5hbWUsIGUsIHRhcmdldCwKKwkJCQkJCSAgICAgIHQtPmRhdGEsIGUtPmNvbWVmcm9tKSkgeworCQlkdXByaW50ZigiaXBfdGFibGVzOiBjaGVjayBmYWlsZWQgZm9yIGAlcycuXG4iLAorCQkJIHQtPnUua2VybmVsLnRhcmdldC0+bmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1jaGVja19lbnRyeShzdHJ1Y3QgaXB0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgc2l6ZSwKK2ZpbmRfY2hlY2tfZW50cnkoc3RydWN0IGlwdF9lbnRyeSAqZSwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IHNpemUsCiAJICAgIHVuc2lnbmVkIGludCAqaSkKIHsKIAlzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqdDsKQEAgLTU0MiwxMyArNTg0LDEzIEBACiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgajsKIAotCWlmICghaXBfY2hlY2tlbnRyeSgmZS0+aXApKSB7Ci0JCWR1cHJpbnRmKCJpcF90YWJsZXM6IGlwIGNoZWNrIGZhaWxlZCAlcCAlcy5cbiIsIGUsIG5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJcmV0ID0gY2hlY2tfZW50cnkoZSwgbmFtZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWogPSAwOwotCXJldCA9IElQVF9NQVRDSF9JVEVSQVRFKGUsIGNoZWNrX21hdGNoLCBuYW1lLCAmZS0+aXAsIGUtPmNvbWVmcm9tLCAmaik7CisJcmV0ID0gSVBUX01BVENIX0lURVJBVEUoZSwgZmluZF9jaGVja19tYXRjaCwgbmFtZSwgJmUtPmlwLAorCQkJCQkJCWUtPmNvbWVmcm9tLCAmaik7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIApAQCAtNTU4LDMyICs2MDAsMTYgQEAKIAkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJICJpcHRfJXMiLCB0LT51LnVzZXIubmFtZSk7CiAJaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpIHsKLQkJZHVwcmludGYoImNoZWNrX2VudHJ5OiBgJXMnIG5vdCBmb3VuZFxuIiwgdC0+dS51c2VyLm5hbWUpOworCQlkdXByaW50ZigiZmluZF9jaGVja19lbnRyeTogYCVzJyBub3QgZm91bmRcbiIsIHQtPnUudXNlci5uYW1lKTsKIAkJcmV0ID0gdGFyZ2V0ID8gUFRSX0VSUih0YXJnZXQpIDogLUVOT0VOVDsKIAkJZ290byBjbGVhbnVwX21hdGNoZXM7CiAJfQogCXQtPnUua2VybmVsLnRhcmdldCA9IHRhcmdldDsKIAotCXJldCA9IHh0X2NoZWNrX3RhcmdldCh0YXJnZXQsIEFGX0lORVQsIHQtPnUudGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpLAotCQkJICAgICAgbmFtZSwgZS0+Y29tZWZyb20sIGUtPmlwLnByb3RvLAotCQkJICAgICAgZS0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKTsKKwlyZXQgPSBjaGVja190YXJnZXQoZSwgbmFtZSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnI7CiAKLQlpZiAodC0+dS5rZXJuZWwudGFyZ2V0ID09ICZpcHRfc3RhbmRhcmRfdGFyZ2V0KSB7Ci0JCWlmICghc3RhbmRhcmRfY2hlY2sodCwgc2l6ZSkpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0gZWxzZSBpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5Ci0JCSAgICYmICF0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkobmFtZSwgZSwgdGFyZ2V0LCB0LT5kYXRhLAotCQkJCQkJICAgICAgZS0+Y29tZWZyb20pKSB7Ci0JCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNoZWNrIGZhaWxlZCBmb3IgYCVzJy5cbiIsCi0JCQkgdC0+dS5rZXJuZWwudGFyZ2V0LT5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCiAJKCppKSsrOwogCXJldHVybiAwOwogIGVycjoKQEAgLTcxOCwxMSArNzQ0LDExIEBACiAJLyogRmluYWxseSwgZWFjaCBzYW5pdHkgY2hlY2sgbXVzdCBwYXNzICovCiAJaSA9IDA7CiAJcmV0ID0gSVBUX0VOVFJZX0lURVJBVEUoZW50cnkwLCBuZXdpbmZvLT5zaXplLAotCQkJCWNoZWNrX2VudHJ5LCBuYW1lLCBzaXplLCAmaSk7CisJCQkJZmluZF9jaGVja19lbnRyeSwgbmFtZSwgc2l6ZSwgJmkpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCUlQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgbmV3aW5mby0+c2l6ZSwKLQkJCQkgIGNsZWFudXBfZW50cnksICZpKTsKKwkJCQljbGVhbnVwX2VudHJ5LCAmaSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xNDU4LDEwICsxNDg0LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFpcF9jaGVja2VudHJ5KCZlLT5pcCkpIHsKLQkJZHVwcmludGYoImlwX3RhYmxlczogaXAgY2hlY2sgZmFpbGVkICVwICVzLlxuIiwgZSwgbmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlyZXQgPSBjaGVja19lbnRyeShlLCBuYW1lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJb2ZmID0gMDsKIAllbnRyeV9vZmZzZXQgPSAodm9pZCAqKWUgLSAodm9pZCAqKWJhc2U7CkBAIC0xNDc3LDcgKzE1MDIsOCBAQAogCQkJCQkJICAgICB0LT51LnVzZXIucmV2aXNpb24pLAogCQkJCQkgImlwdF8lcyIsIHQtPnUudXNlci5uYW1lKTsKIAlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkgewotCQlkdXByaW50ZigiY2hlY2tfZW50cnk6IGAlcycgbm90IGZvdW5kXG4iLCB0LT51LnVzZXIubmFtZSk7CisJCWR1cHJpbnRmKCJjaGVja19jb21wYXRfZW50cnlfc2l6ZV9hbmRfaG9va3M6IGAlcycgbm90IGZvdW5kXG4iLAorCQkJCQkJCXQtPnUudXNlci5uYW1lKTsKIAkJcmV0ID0gdGFyZ2V0ID8gUFRSX0VSUih0YXJnZXQpIDogLUVOT0VOVDsKIAkJZ290byBjbGVhbnVwX21hdGNoZXM7CiAJfQpAQCAtMTUxMywzNiArMTUzOSwxMCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjb21wYXRfY29weV9tYXRjaF9mcm9tX3VzZXIoc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbSwKIAl2b2lkICoqZHN0cHRyLCBjb21wYXRfdWludF90ICpzaXplLCBjb25zdCBjaGFyICpuYW1lLAotCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLCB1bnNpZ25lZCBpbnQgaG9va21hc2ssIGludCAqaSkKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgdW5zaWduZWQgaW50IGhvb2ttYXNrKQogewotCXN0cnVjdCBpcHRfZW50cnlfbWF0Y2ggKmRtOwotCXN0cnVjdCBpcHRfbWF0Y2ggKm1hdGNoOwotCWludCByZXQ7Ci0KLQlkbSA9IChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICopKmRzdHB0cjsKLQltYXRjaCA9IG0tPnUua2VybmVsLm1hdGNoOwogCXh0X2NvbXBhdF9tYXRjaF9mcm9tX3VzZXIobSwgZHN0cHRyLCBzaXplKTsKLQotCXJldCA9IHh0X2NoZWNrX21hdGNoKG1hdGNoLCBBRl9JTkVULCBkbS0+dS5tYXRjaF9zaXplIC0gc2l6ZW9mKCpkbSksCi0JCQkgICAgIG5hbWUsIGhvb2ttYXNrLCBpcC0+cHJvdG8sCi0JCQkgICAgIGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JaWYgKG0tPnUua2VybmVsLm1hdGNoLT5jaGVja2VudHJ5Ci0JICAgICYmICFtLT51Lmtlcm5lbC5tYXRjaC0+Y2hlY2tlbnRyeShuYW1lLCBpcCwgbWF0Y2gsIGRtLT5kYXRhLAotCQkJCQkgICAgICBob29rbWFzaykpIHsKLQkJZHVwcmludGYoImlwX3RhYmxlczogY2hlY2sgZmFpbGVkIGZvciBgJXMnLlxuIiwKLQkJCSBtLT51Lmtlcm5lbC5tYXRjaC0+bmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQkoKmkpKys7CiAJcmV0dXJuIDA7Ci0KLWVycjoKLQltb2R1bGVfcHV0KG0tPnUua2VybmVsLm1hdGNoLT5tZSk7Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBjb21wYXRfY29weV9lbnRyeV9mcm9tX3VzZXIoc3RydWN0IGlwdF9lbnRyeSAqZSwgdm9pZCAqKmRzdHB0ciwKQEAgLTE1NTMsMTkgKzE1NTMsMTggQEAKIAlzdHJ1Y3QgaXB0X3RhcmdldCAqdGFyZ2V0OwogCXN0cnVjdCBpcHRfZW50cnkgKmRlOwogCXVuc2lnbmVkIGludCBvcmlnc2l6ZTsKLQlpbnQgcmV0LCBoLCBqOworCWludCByZXQsIGg7CiAKIAlyZXQgPSAwOwogCW9yaWdzaXplID0gKnNpemU7CiAJZGUgPSAoc3RydWN0IGlwdF9lbnRyeSAqKSpkc3RwdHI7CiAJbWVtY3B5KGRlLCBlLCBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSkpOwogCi0JaiA9IDA7CiAJKmRzdHB0ciArPSBzaXplb2Yoc3RydWN0IGNvbXBhdF9pcHRfZW50cnkpOwogCXJldCA9IElQVF9NQVRDSF9JVEVSQVRFKGUsIGNvbXBhdF9jb3B5X21hdGNoX2Zyb21fdXNlciwgZHN0cHRyLCBzaXplLAotCQkJbmFtZSwgJmRlLT5pcCwgZGUtPmNvbWVmcm9tLCAmaik7CisJCQluYW1lLCAmZGUtPmlwLCBkZS0+Y29tZWZyb20pOwogCWlmIChyZXQpCi0JCWdvdG8gY2xlYW51cF9tYXRjaGVzOworCQlyZXR1cm4gcmV0OwogCWRlLT50YXJnZXRfb2Zmc2V0ID0gZS0+dGFyZ2V0X29mZnNldCAtIChvcmlnc2l6ZSAtICpzaXplKTsKIAl0ID0gaXB0X2dldF90YXJnZXQoZSk7CiAJdGFyZ2V0ID0gdC0+dS5rZXJuZWwudGFyZ2V0OwpAQCAtMTU3OCwzNCArMTU3NywxOCBAQAogCQlpZiAoKHVuc2lnbmVkIGNoYXIgKilkZSAtIGJhc2UgPCBuZXdpbmZvLT51bmRlcmZsb3dbaF0pCiAJCQluZXdpbmZvLT51bmRlcmZsb3dbaF0gLT0gb3JpZ3NpemUgLSAqc2l6ZTsKIAl9CisJcmV0dXJuIHJldDsKK30KIAotCXQgPSBpcHRfZ2V0X3RhcmdldChkZSk7Ci0JdGFyZ2V0ID0gdC0+dS5rZXJuZWwudGFyZ2V0OwotCXJldCA9IHh0X2NoZWNrX3RhcmdldCh0YXJnZXQsIEFGX0lORVQsIHQtPnUudGFyZ2V0X3NpemUgLSBzaXplb2YoKnQpLAotCQkJICAgICAgbmFtZSwgZS0+Y29tZWZyb20sIGUtPmlwLnByb3RvLAotCQkJICAgICAgZS0+aXAuaW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKTsKK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhdF9jaGVja19lbnRyeShzdHJ1Y3QgaXB0X2VudHJ5ICplLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXQ7CisKKwlyZXQgPSBJUFRfTUFUQ0hfSVRFUkFURShlLCBjaGVja19tYXRjaCwgbmFtZSwgJmUtPmlwLCBlLT5jb21lZnJvbSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCXJldHVybiByZXQ7CiAKLQlyZXQgPSAtRUlOVkFMOwotCWlmICh0LT51Lmtlcm5lbC50YXJnZXQgPT0gJmlwdF9zdGFuZGFyZF90YXJnZXQpIHsKLQkJaWYgKCFzdGFuZGFyZF9jaGVjayh0LCAqc2l6ZSkpCi0JCQlnb3RvIGVycjsKLQl9IGVsc2UgaWYgKHQtPnUua2VybmVsLnRhcmdldC0+Y2hlY2tlbnRyeQotCQkgICAmJiAhdC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5KG5hbWUsIGRlLCB0YXJnZXQsCi0JCQkJCQkgICAgICB0LT5kYXRhLCBkZS0+Y29tZWZyb20pKSB7Ci0JCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNvbXBhdDogY2hlY2sgZmFpbGVkIGZvciBgJXMnLlxuIiwKLQkJCSB0LT51Lmtlcm5lbC50YXJnZXQtPm5hbWUpOwotCQlnb3RvIGVycjsKLQl9Ci0JcmV0ID0gMDsKLQlyZXR1cm4gcmV0OwotCi1lcnI6Ci0JbW9kdWxlX3B1dCh0LT51Lmtlcm5lbC50YXJnZXQtPm1lKTsKLWNsZWFudXBfbWF0Y2hlczoKLQlJUFRfTUFUQ0hfSVRFUkFURShlLCBjbGVhbnVwX21hdGNoLCAmaik7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gY2hlY2tfdGFyZ2V0KGUsIG5hbWUpOwogfQogCiBzdGF0aWMgaW50CkBAIC0xNjE4LDcgKzE2MDEsNyBAQAogCQl1bnNpZ25lZCBpbnQgKmhvb2tfZW50cmllcywKIAkJdW5zaWduZWQgaW50ICp1bmRlcmZsb3dzKQogewotCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpLCBqOwogCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLCAqaW5mbzsKIAl2b2lkICpwb3MsICplbnRyeTAsICplbnRyeTE7CiAJdW5zaWduZWQgaW50IHNpemU7CkBAIC0xNjM2LDIxICsxNjE5LDIxIEBACiAJfQogCiAJZHVwcmludGYoInRyYW5zbGF0ZV9jb21wYXRfdGFibGU6IHNpemUgJXVcbiIsIGluZm8tPnNpemUpOwotCWkgPSAwOworCWogPSAwOwogCXh0X2NvbXBhdF9sb2NrKEFGX0lORVQpOwogCS8qIFdhbGsgdGhyb3VnaCBlbnRyaWVzLCBjaGVja2luZyBvZmZzZXRzLiAqLwogCXJldCA9IElQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgdG90YWxfc2l6ZSwKIAkJCQljaGVja19jb21wYXRfZW50cnlfc2l6ZV9hbmRfaG9va3MsCiAJCQkJaW5mbywgJnNpemUsIGVudHJ5MCwKIAkJCQllbnRyeTAgKyB0b3RhbF9zaXplLAotCQkJCWhvb2tfZW50cmllcywgdW5kZXJmbG93cywgJmksIG5hbWUpOworCQkJCWhvb2tfZW50cmllcywgdW5kZXJmbG93cywgJmosIG5hbWUpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJcmV0ID0gLUVJTlZBTDsKLQlpZiAoaSAhPSBudW1iZXIpIHsKKwlpZiAoaiAhPSBudW1iZXIpIHsKIAkJZHVwcmludGYoInRyYW5zbGF0ZV9jb21wYXRfdGFibGU6ICV1IG5vdCAldSBlbnRyaWVzXG4iLAotCQkJIGksIG51bWJlcik7CisJCQkgaiwgbnVtYmVyKTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIApAQCAtMTY5Niw2ICsxNjc5LDExIEBACiAJaWYgKCFtYXJrX3NvdXJjZV9jaGFpbnMobmV3aW5mbywgdmFsaWRfaG9va3MsIGVudHJ5MSkpCiAJCWdvdG8gZnJlZV9uZXdpbmZvOwogCisJcmV0ID0gSVBUX0VOVFJZX0lURVJBVEUoZW50cnkxLCBuZXdpbmZvLT5zaXplLCBjb21wYXRfY2hlY2tfZW50cnksCisJCQkJCQkJCQluYW1lKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfbmV3aW5mbzsKKwogCS8qIEFuZCBvbmUgY29weSBmb3IgZXZlcnkgb3RoZXIgQ1BVICovCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCiAJCWlmIChuZXdpbmZvLT5lbnRyaWVzW2ldICYmIG5ld2luZm8tPmVudHJpZXNbaV0gIT0gZW50cnkxKQpAQCAtMTcwOSw4ICsxNjk3LDEwIEBACiBmcmVlX25ld2luZm86CiAJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogb3V0OgorCUlQVF9FTlRSWV9JVEVSQVRFKGVudHJ5MCwgdG90YWxfc2l6ZSwgY2xlYW51cF9lbnRyeSwgJmopOwogCXJldHVybiByZXQ7CiBvdXRfdW5sb2NrOgorCWNvbXBhdF9mbHVzaF9vZmZzZXRzKCk7CiAJeHRfY29tcGF0X3VubG9jayhBRl9JTkVUKTsKIAlnb3RvIG91dDsKIH0KQEAgLTE5MzIsNiArMTkyMiw5IEBACiB7CiAJaW50IHJldDsKIAorCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJUFRfU09fR0VUX0lORk86CiAJCXJldCA9IGdldF9pbmZvKHVzZXIsIGxlbiwgMSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwppbmRleCA3YTI5ZDZlLi5iMWMxMTE2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKQEAgLTQwLDggKzQwLDYgQEAKICNkZWZpbmUgREVCVUdQCiAjZW5kaWYKIAotI2RlZmluZSBBU1NFUlRfUkVBRF9MT0NLKHgpCi0KIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyB0YXJnZXQgZm9yIENMVVNURVJJUCIpOwpAQCAtMTIzLDcgKzEyMSw2IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCi0JQVNTRVJUX1JFQURfTE9DSygmY2x1c3RlcmlwX2xvY2spOwogCWxpc3RfZm9yX2VhY2gocG9zLCAmY2x1c3RlcmlwX2NvbmZpZ3MpIHsKIAkJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMgPSBsaXN0X2VudHJ5KHBvcywgCiAJCQkJCXN0cnVjdCBjbHVzdGVyaXBfY29uZmlnLCBsaXN0KTsKQEAgLTE3MCw3ICsxNjcsNiBAQAogCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqYzsKLQljaGFyIGJ1ZmZlclsxNl07CiAKIAljID0ga3phbGxvYyhzaXplb2YoKmMpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWMpCkBAIC0xODcsMTIgKzE4MywxNyBAQAogCWF0b21pY19zZXQoJmMtPmVudHJpZXMsIDEpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLQkvKiBjcmVhdGUgcHJvYyBkaXIgZW50cnkgKi8KLQlzcHJpbnRmKGJ1ZmZlciwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChpcCkpOwotCWMtPnBkZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGJ1ZmZlciwgU19JV1VTUnxTX0lSVVNSLCBjbHVzdGVyaXBfcHJvY2Rpcik7Ci0JaWYgKCFjLT5wZGUpIHsKLQkJa2ZyZWUoYyk7Ci0JCXJldHVybiBOVUxMOworCXsKKwkJY2hhciBidWZmZXJbMTZdOworCisJCS8qIGNyZWF0ZSBwcm9jIGRpciBlbnRyeSAqLworCQlzcHJpbnRmKGJ1ZmZlciwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChpcCkpOworCQljLT5wZGUgPSBjcmVhdGVfcHJvY19lbnRyeShidWZmZXIsIFNfSVdVU1J8U19JUlVTUiwKKwkJCQkJICAgY2x1c3RlcmlwX3Byb2NkaXIpOworCQlpZiAoIWMtPnBkZSkgeworCQkJa2ZyZWUoYyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCX0KIAljLT5wZGUtPnByb2NfZm9wcyA9ICZjbHVzdGVyaXBfcHJvY19mb3BzOwogCWMtPnBkZS0+ZGF0YSA9IGM7CkBAIC0yMDUsNiArMjA2LDcgQEAKIAlyZXR1cm4gYzsKIH0KIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50CiBjbHVzdGVyaXBfYWRkX25vZGUoc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMsIHVfaW50MTZfdCBub2RlbnVtKQogewpAQCAtMjMyLDYgKzIzNCw3IEBACiAKIAlyZXR1cm4gMTsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHVfaW50MzJfdAogY2x1c3RlcmlwX2hhc2hmbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqY29uZmlnKQpAQCAtNDQ0LDYgKzQ0NywxMiBAQAogCQljaXBpbmZvLT5jb25maWcgPSBjb25maWc7CiAJfQogCisJaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQodGFyZ2V0LT5mYW1pbHkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCisJCQkJICAgICJwcm90bz0lZFxuIiwgdGFyZ2V0LT5mYW1pbHkpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtNDU3LDYgKzQ2Niw4IEBACiAJY2x1c3RlcmlwX2NvbmZpZ19lbnRyeV9wdXQoY2lwaW5mby0+Y29uZmlnKTsKIAogCWNsdXN0ZXJpcF9jb25maWdfcHV0KGNpcGluZm8tPmNvbmZpZyk7CisKKwluZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQodGFyZ2V0LT5mYW1pbHkpOwogfQogCiBzdGF0aWMgc3RydWN0IGlwdF90YXJnZXQgY2x1c3RlcmlwX3RndCA9IHsKQEAgLTY4MCw3ICs2OTEsNyBAQAogewogI2RlZmluZSBQUk9DX1dSSVRFTEVOCTEwCiAJY2hhciBidWZmZXJbUFJPQ19XUklURUxFTisxXTsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmMgPSBwZGUtPmRhdGE7CiAJdW5zaWduZWQgbG9uZyBub2RlbnVtOwogCkBAIC03MzcsOCArNzQ4LDEwIEBACiAJCUNMVVNURVJJUF9WRVJTSU9OKTsKIAlyZXR1cm4gMDsKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBjbGVhbnVwX2hvb2s6CiAJbmZfdW5yZWdpc3Rlcl9ob29rKCZjaXBfYXJwX29wcyk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIGNsZWFudXBfdGFyZ2V0OgogCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmY2x1c3RlcmlwX3RndCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCmluZGV4IDEyYTgxOGEuLmI1NWQ2NzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwpAQCAtMjgsMTcgKzI4LDE2IEBACiBzZXRfZWN0X2lwKHN0cnVjdCBza19idWZmICoqcHNrYiwgY29uc3Qgc3RydWN0IGlwdF9FQ05faW5mbyAqZWluZm8pCiB7CiAJc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7Ci0JX19iZTE2IG9sZHRvczsKIAogCWlmICgoaXBoLT50b3MgJiBJUFRfRUNOX0lQX01BU0spICE9IChlaW5mby0+aXBfZWN0ICYgSVBUX0VDTl9JUF9NQVNLKSkgeworCQlfX3U4IG9sZHRvczsKIAkJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCiAJCQlyZXR1cm4gMDsKIAkJaXBoID0gKCpwc2tiKS0+bmguaXBoOwogCQlvbGR0b3MgPSBpcGgtPnRvczsKIAkJaXBoLT50b3MgJj0gfklQVF9FQ05fSVBfTUFTSzsKIAkJaXBoLT50b3MgfD0gKGVpbmZvLT5pcF9lY3QgJiBJUFRfRUNOX0lQX01BU0spOwotCQlpcGgtPmNoZWNrID0gbmZfY3N1bV91cGRhdGUob2xkdG9zIF4gaHRvbnMoMHhGRkZGKSwgaXBoLT50b3MsCi0JCQkJCSAgICBpcGgtPmNoZWNrKTsKKwkJbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaHRvbnMob2xkdG9zKSwgaHRvbnMoaXBoLT50b3MpKTsKIAl9IAogCXJldHVybiAxOwogfQpAQCAtNzIsMTAgKzcxLDggQEAKIAlpZiAoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfU0VUX0NXUikKIAkJdGNwaC0+Y3dyID0gZWluZm8tPnByb3RvLnRjcC5jd3I7CiAKLQl0Y3BoLT5jaGVjayA9IG5mX3Byb3RvX2NzdW1fdXBkYXRlKCgqcHNrYiksCi0JCQkJCSAgIG9sZHZhbCBeIGh0b25zKDB4RkZGRiksCi0JCQkJCSAgICgoX19iZTE2ICopdGNwaClbNl0sCi0JCQkJCSAgIHRjcGgtPmNoZWNrLCAwKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCisJCQkJb2xkdmFsLCAoKF9fYmUxNiAqKXRjcGgpWzZdLCAwKTsKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKaW5kZXggN2RjODIwZC4uYzk2ZGUxNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCkBAIC0xNzEsMTEgKzE3MSwxNSBAQAogCQl9CiAJCWJyZWFrOwogCX0KLQljYXNlIElQUFJPVE9fVURQOiB7CisJY2FzZSBJUFBST1RPX1VEUDoKKwljYXNlIElQUFJPVE9fVURQTElURTogewogCQlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7CiAKLQkJLyogTWF4IGxlbmd0aDogMTAgIlBST1RPPVVEUCAiICovCi0JCXByaW50aygiUFJPVE89VURQICIpOworCQlpZiAoaWgtPnByb3RvY29sID09IElQUFJPVE9fVURQKQorCQkJLyogTWF4IGxlbmd0aDogMTAgIlBST1RPPVVEUCAiICAgICAqLworCQkJcHJpbnRrKCJQUk9UTz1VRFAgIiApOworCQllbHNlCS8qIE1heCBsZW5ndGg6IDE0ICJQUk9UTz1VRFBMSVRFICIgKi8KKwkJCXByaW50aygiUFJPVE89VURQTElURSAiKTsKIAogCQlpZiAobnRvaHMoaWgtPmZyYWdfb2ZmKSAmIElQX09GRlNFVCkKIAkJCWJyZWFrOwpAQCAtMzQxLDYgKzM0NSw3IEBACiAJLyogSVA6ICAgICAgNDArNDYrNisxMSsxMjcgPSAyMzAgKi8KIAkvKiBUQ1A6ICAgICAxMCttYXgoMjUsMjArMzArMTMrOSszMisxMSsxMjcpID0gMjUyICovCiAJLyogVURQOiAgICAgMTArbWF4KDI1LDIwKSA9IDM1ICovCisJLyogVURQTElURTogMTQrbWF4KDI1LDIwKSA9IDM5ICovCiAJLyogSUNNUDogICAgMTErbWF4KDI1LCAxOCsyNSttYXgoMTksMTQsMjQrMytuKzEwLDMrbisxMCkpID0gOTErbiAqLwogCS8qIEVTUDogICAgIDEwK21heCgyNSkrMTUgPSA1MCAqLwogCS8qIEFIOiAgICAgIDkrbWF4KDI1KSsxNSA9IDQ5ICovCkBAIC00MjUsMTMgKzQzMCw4IEBACiAJbGkudS5sb2cubGV2ZWwgPSBsb2dpbmZvLT5sZXZlbDsKIAlsaS51LmxvZy5sb2dmbGFncyA9IGxvZ2luZm8tPmxvZ2ZsYWdzOwogCi0JaWYgKGxvZ2luZm8tPmxvZ2ZsYWdzICYgSVBUX0xPR19ORkxPRykKLQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCBob29rbnVtLCAqcHNrYiwgaW4sIG91dCwgJmxpLAotCQkgICAgICAgICAgICAgICIlcyIsIGxvZ2luZm8tPnByZWZpeCk7Ci0JZWxzZQotCQlpcHRfbG9nX3BhY2tldChQRl9JTkVULCBob29rbnVtLCAqcHNrYiwgaW4sIG91dCwgJmxpLAotCQkgICAgICAgICAgICAgICBsb2dpbmZvLT5wcmVmaXgpOwotCisJaXB0X2xvZ19wYWNrZXQoUEZfSU5FVCwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKKwkgICAgICAgICAgICAgICBsb2dpbmZvLT5wcmVmaXgpOwogCXJldHVybiBJUFRfQ09OVElOVUU7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKaW5kZXggM2RiZmNmYS4uMjhiOTIzMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKQEAgLTIsNyArMiw3IEBACiAgICAoZGVwZW5kaW5nIG9uIHJvdXRlKS4gKi8KIAogLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICogKEMpIDIwMDItMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMjAsNyArMjAsMTEgQEAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgorI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTY1LDIzICs2OSwzMyBAQAogCQkgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKIAkJICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0OworI2VuZGlmCiAJc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0JY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yOwogCXN0cnVjdCBpcF9uYXRfcmFuZ2UgbmV3cmFuZ2U7CisJY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCV9fYmUzMiBuZXdzcmM7CiAKIAlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QT1NUX1JPVVRJTkcpOwogCiAJY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorCW5hdCA9IG5mY3RfbmF0KGN0KTsKKyNlbmRpZgogCUlQX05GX0FTU0VSVChjdCAmJiAoY3RpbmZvID09IElQX0NUX05FVyB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRAogCSAgICAgICAgICAgICAgICAgICAgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOwogCiAJLyogU291cmNlIGFkZHJlc3MgaXMgMC4wLjAuMCAtIGxvY2FsbHkgZ2VuZXJhdGVkIHBhY2tldCB0aGF0IGlzCiAJICogcHJvYmFibHkgbm90IHN1cHBvc2VkIHRvIGJlIG1hc3F1ZXJhZGVkLgogCSAqLworI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisJaWYgKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuaXAgPT0gMCkKKyNlbHNlCiAJaWYgKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXAgPT0gMCkKKyNlbmRpZgogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJbXIgPSB0YXJnaW5mbzsKQEAgLTkzLDcgKzEwNywxMSBAQAogCX0KIAogCXdyaXRlX2xvY2tfYmgoJm1hc3FfbG9jayk7CisjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKKwluYXQtPm1hc3FfaW5kZXggPSBvdXQtPmlmaW5kZXg7CisjZWxzZQogCWN0LT5uYXQubWFzcV9pbmRleCA9IG91dC0+aWZpbmRleDsKKyNlbmRpZgogCXdyaXRlX3VubG9ja19iaCgmbWFzcV9sb2NrKTsKIAogCS8qIFRyYW5zZmVyIGZyb20gb3JpZ2luYWwgcmFuZ2UuICovCkBAIC0xMDksMTAgKzEyNywxNyBAQAogc3RhdGljIGlubGluZSBpbnQKIGRldmljZV9jbXAoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqaWZpbmRleCkKIHsKKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0ID0gbmZjdF9uYXQoaSk7CisjZW5kaWYKIAlpbnQgcmV0OwogCiAJcmVhZF9sb2NrX2JoKCZtYXNxX2xvY2spOworI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisJcmV0ID0gKG5hdC0+bWFzcV9pbmRleCA9PSAoaW50KShsb25nKWlmaW5kZXgpOworI2Vsc2UKIAlyZXQgPSAoaS0+bmF0Lm1hc3FfaW5kZXggPT0gKGludCkobG9uZylpZmluZGV4KTsKKyNlbmRpZgogCXJlYWRfdW5sb2NrX2JoKCZtYXNxX2xvY2spOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCmluZGV4IDU4YTg4ZjIuLjkzOTBlOTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwpAQCAtMTUsNyArMTUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgorI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2VuZGlmCiAKICNkZWZpbmUgTU9EVUxFTkFNRSAiTkVUTUFQIgogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCmluZGV4IGMwZGNmZTkuLjQ2MmVjZWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKQEAgLTEsNiArMSw2IEBACiAvKiBSZWRpcmVjdC4gIFNpbXBsZSBtYXBwaW5nIHdoaWNoIGFsdGVycyBkc3QgdG8gYSBsb2NhbCBJUCBhZGRyZXNzLiAqLwogLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICogKEMpIDIwMDItMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTgsNyArMTgsMTEgQEAKICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgorI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2VuZGlmCiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwppbmRleCBhZDAzMTJkLi5mMDMxOWU1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKQEAgLTc2LDcgKzc2LDcgQEAKIAogCS8qIFRoaXMgcGFja2V0IHdpbGwgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBvdGhlcjogY2xlYXIgbmYgZmllbGRzICovCiAJbmZfcmVzZXQobnNrYik7Ci0JbnNrYi0+bmZtYXJrID0gMDsKKwluc2tiLT5tYXJrID0gMDsKIAlza2JfaW5pdF9zZWNtYXJrKG5za2IpOwogCiAJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKCh1X2ludDMyX3QqKW5za2ItPm5oLmlwaCArIG5za2ItPm5oLmlwaC0+aWhsKTsKQEAgLTExNCw2ICsxMTQsMTQgQEAKIAl0Y3BoLT53aW5kb3cgPSAwOwogCXRjcGgtPnVyZ19wdHIgPSAwOwogCisJLyogQWRqdXN0IFRDUCBjaGVja3N1bSAqLworCXRjcGgtPmNoZWNrID0gMDsKKwl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayh0Y3BoLCBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJCQkJICAgbnNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkgICBuc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCisJCQkJCQlzaXplb2Yoc3RydWN0IHRjcGhkciksIDApKTsKKwogCS8qIFNldCBERiwgaWQgPSAwICovCiAJbnNrYi0+bmguaXBoLT5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKIAluc2tiLT5uaC5pcGgtPmlkID0gMDsKQEAgLTEyOSwxNCArMTM3LDggQEAKIAlpZiAoaXBfcm91dGVfbWVfaGFyZGVyKCZuc2tiLCBhZGRyX3R5cGUpKQogCQlnb3RvIGZyZWVfbnNrYjsKIAotCS8qIEFkanVzdCBUQ1AgY2hlY2tzdW0gKi8KIAluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCXRjcGgtPmNoZWNrID0gMDsKLQl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayh0Y3BoLCBzaXplb2Yoc3RydWN0IHRjcGhkciksCi0JCQkJICAgbnNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkgICBuc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCi0JCQkJCQlzaXplb2Yoc3RydWN0IHRjcGhkciksIDApKTsKKwogCS8qIEFkanVzdCBJUCBUVEwgKi8KIAluc2tiLT5uaC5pcGgtPnR0bCA9IGRzdF9tZXRyaWMobnNrYi0+ZHN0LCBSVEFYX0hPUExJTUlUKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYwppbmRleCBiMzhiMTMzLi4zZGNmMjk0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYwpAQCAtMzQsNyArMzQsMTEgQEAKICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgorI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMTUyLDExICsxNTYsMTcgQEAKIAkgICBIZXJlIHdlIGNhbGN1bGF0ZSB0aGUgaW5kZXggaW4gc2FtZS0+aXBhcnJheSB3aGljaAogCSAgIGhvbGRzIHRoZSBpcGFkZHJlc3Mgd2Ugc2hvdWxkIHVzZSAqLwogCQorI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisJdG1waXAgPSBudG9obCh0LT5zcmMudTMuaXApOworCisJaWYgKCEoc2FtZS0+aW5mbyAmIElQVF9TQU1FX05PRFNUKSkKKwkJdG1waXAgKz0gbnRvaGwodC0+ZHN0LnUzLmlwKTsKKyNlbHNlCiAJdG1waXAgPSBudG9obCh0LT5zcmMuaXApOwogCiAJaWYgKCEoc2FtZS0+aW5mbyAmIElQVF9TQU1FX05PRFNUKSkKIAkJdG1waXAgKz0gbnRvaGwodC0+ZHN0LmlwKTsKLQkKKyNlbmRpZgogCWFpbmRleCA9IHRtcGlwICUgc2FtZS0+aXBudW07CiAKIAluZXdfaXAgPSBodG9ubChzYW1lLT5pcGFycmF5W2FpbmRleF0pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMKaW5kZXggMTA4YjZiNy4uOTNlYjVjMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jCkBAIC05NywxMCArOTcsOCBAQAogCQkJb3B0W2krMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OwogCQkJb3B0W2krM10gPSAobmV3bXNzICYgMHgwMGZmKTsKIAotCQkJdGNwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwKLQkJCQkJCQkgICBodG9ucyhvbGRtc3MpXmh0b25zKDB4RkZGRiksCi0JCQkJCQkJICAgaHRvbnMobmV3bXNzKSwKLQkJCQkJCQkgICB0Y3BoLT5jaGVjaywgMCk7CisJCQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCisJCQkJCQlodG9ucyhvbGRtc3MpLCBodG9ucyhuZXdtc3MpLCAwKTsKIAkJCXJldHVybiBJUFRfQ09OVElOVUU7CiAJCX0KIAl9CkBAIC0xMjYsMjggKzEyNCwyMiBAQAogIAlvcHQgPSAodV9pbnQ4X3QgKil0Y3BoICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwogCW1lbW1vdmUob3B0ICsgVENQT0xFTl9NU1MsIG9wdCwgdGNwbGVuIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKIAotCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsCi0JCQkJCSAgIGh0b25zKHRjcGxlbikgXiBodG9ucygweEZGRkYpLAotCQkJCSAgICAgICAgICAgaHRvbnModGNwbGVuICsgVENQT0xFTl9NU1MpLAotCQkJCQkgICB0Y3BoLT5jaGVjaywgMSk7CisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAorCQkJCWh0b25zKHRjcGxlbiksIGh0b25zKHRjcGxlbiArIFRDUE9MRU5fTVNTKSwgMSk7CiAJb3B0WzBdID0gVENQT1BUX01TUzsKIAlvcHRbMV0gPSBUQ1BPTEVOX01TUzsKIAlvcHRbMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OwogCW9wdFszXSA9IChuZXdtc3MgJiAweDAwZmYpOwogCi0JdGNwaC0+Y2hlY2sgPSBuZl9wcm90b19jc3VtX3VwZGF0ZSgqcHNrYiwgaHRvbmwofjApLCAqKChfX2JlMzIgKilvcHQpLAotCQkJCQkgICB0Y3BoLT5jaGVjaywgMCk7CisJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssICpwc2tiLCAwLCAqKChfX2JlMzIgKilvcHQpLCAwKTsKIAogCW9sZHZhbCA9ICgoX19iZTE2ICopdGNwaClbNl07CiAJdGNwaC0+ZG9mZiArPSBUQ1BPTEVOX01TUy80OwotCXRjcGgtPmNoZWNrID0gbmZfcHJvdG9fY3N1bV91cGRhdGUoKnBza2IsCi0JCQkJCSAgIG9sZHZhbCBeIGh0b25zKDB4RkZGRiksCi0JCQkJCSAgICgoX19iZTE2ICopdGNwaClbNl0sCi0JCQkJCSAgIHRjcGgtPmNoZWNrLCAwKTsKKwluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCisJCQkJb2xkdmFsLCAoKF9fYmUxNiAqKXRjcGgpWzZdLCAwKTsKIAogCW5ld3RvdGxlbiA9IGh0b25zKG50b2hzKGlwaC0+dG90X2xlbikgKyBUQ1BPTEVOX01TUyk7Ci0JaXBoLT5jaGVjayA9IG5mX2NzdW1fdXBkYXRlKGlwaC0+dG90X2xlbiBeIGh0b25zKDB4RkZGRiksCi0JCQkJICAgIG5ld3RvdGxlbiwgaXBoLT5jaGVjayk7CisJbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaXBoLT50b3RfbGVuLCBuZXd0b3RsZW4pOwogCWlwaC0+dG90X2xlbiA9IG5ld3RvdGxlbjsKIAlyZXR1cm4gSVBUX0NPTlRJTlVFOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKaW5kZXggNmI4YjE0Yy4uMThlNzRhYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCkBAIC0zMCwxNiArMzAsMTUgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X3Rvc190YXJnZXRfaW5mbyAqdG9zaW5mbyA9IHRhcmdpbmZvOwogCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOwotCV9fYmUxNiBvbGR0b3M7CiAKIAlpZiAoKGlwaC0+dG9zICYgSVBUT1NfVE9TX01BU0spICE9IHRvc2luZm8tPnRvcykgeworCQlfX3U4IG9sZHRvczsKIAkJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKIAkJaXBoID0gKCpwc2tiKS0+bmguaXBoOwogCQlvbGR0b3MgPSBpcGgtPnRvczsKIAkJaXBoLT50b3MgPSAoaXBoLT50b3MgJiBJUFRPU19QUkVDX01BU0spIHwgdG9zaW5mby0+dG9zOwotCQlpcGgtPmNoZWNrID0gbmZfY3N1bV91cGRhdGUob2xkdG9zIF4gaHRvbnMoMHhGRkZGKSwgaXBoLT50b3MsCi0JCQkJCSAgICBpcGgtPmNoZWNrKTsKKwkJbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaHRvbnMob2xkdG9zKSwgaHRvbnMoaXBoLT50b3MpKTsKIAl9CiAJcmV0dXJuIElQVF9DT05USU5VRTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCmluZGV4IGFjOTUxN2QuLmZmZmU1Y2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwpAQCAtNTQsOSArNTQsOCBAQAogCX0KIAogCWlmIChuZXdfdHRsICE9IGlwaC0+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+cmF0ZWluZm8uY3JlZGl0LCBlbnQtPnJhdGVpbmZvLmNyZWRpdF9jYXAsCi0JCQllbnQtPnJhdGVpbmZvLmNvc3QpOwotfQotCi1zdGF0aWMgaW50IGRsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHMtPnByaXZhdGU7Ci0Jc3RydWN0IGlwdF9oYXNobGltaXRfaHRhYmxlICpodGFibGUgPSBwZGUtPmRhdGE7Ci0JdW5zaWduZWQgaW50ICpidWNrZXQgPSAodW5zaWduZWQgaW50ICopdjsKLQlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmVudDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCi0JaWYgKCFobGlzdF9lbXB0eSgmaHRhYmxlLT5oYXNoWypidWNrZXRdKSkKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50LCBwb3MsICZodGFibGUtPmhhc2hbKmJ1Y2tldF0sIG5vZGUpIHsKLQkJCWlmIChkbF9zZXFfcmVhbF9zaG93KGVudCwgcykpIHsKLQkJCQkvKiBidWZmZXIgd2FzIGZpbGxlZCBhbmQgdW5hYmxlIHRvIHByaW50IHRoYXQgdHVwbGUgKi8KLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRsX3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ID0gZGxfc2VxX3N0YXJ0LAotCS5uZXh0ICA9IGRsX3NlcV9uZXh0LAotCS5zdG9wICA9IGRsX3NlcV9zdG9wLAotCS5zaG93ICA9IGRsX3NlcV9zaG93Ci19OwotCi1zdGF0aWMgaW50IGRsX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHMpOwotCi0JaWYgKCFyZXQpIHsKLQkJc3RydWN0IHNlcV9maWxlICpzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJc2YtPnByaXZhdGUgPSBQREUoaW5vZGUpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wcyA9IHsKLQkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gZGxfcHJvY19vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQotfTsKLQotc3RhdGljIGludCBpbml0X29yX2ZpbmkoaW50IGZpbmkpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZmluaSkKLQkJZ290byBjbGVhbnVwOwotCi0JaWYgKGlwdF9yZWdpc3Rlcl9tYXRjaCgmaXB0X2hhc2hsaW1pdCkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBjbGVhbnVwX25vdGhpbmc7Ci0JfQotCi0JaGFzaGxpbWl0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpcHRfaGFzaGxpbWl0IiwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgZHN0aGFzaF9lbnQpLCAwLAotCQkJCQkgICAgMCwgTlVMTCwgTlVMTCk7Ci0JaWYgKCFoYXNobGltaXRfY2FjaGVwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGNyZWF0ZSBpcHRfaGFzaGxpbWl0IHNsYWIgY2FjaGVcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFudXBfdW5yZWdfbWF0Y2g7Ci0JfQotCi0JaGFzaGxpbWl0X3Byb2NkaXIgPSBwcm9jX21rZGlyKCJpcHRfaGFzaGxpbWl0IiwgcHJvY19uZXQpOwotCWlmICghaGFzaGxpbWl0X3Byb2NkaXIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIHByb2MgZGlyIGVudHJ5XG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBjbGVhbnVwX2ZyZWVfc2xhYjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi1jbGVhbnVwOgotCXJlbW92ZV9wcm9jX2VudHJ5KCJpcHRfaGFzaGxpbWl0IiwgcHJvY19uZXQpOwotY2xlYW51cF9mcmVlX3NsYWI6Ci0Ja21lbV9jYWNoZV9kZXN0cm95KGhhc2hsaW1pdF9jYWNoZXApOwotY2xlYW51cF91bnJlZ19tYXRjaDoKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmaXB0X2hhc2hsaW1pdCk7Ci1jbGVhbnVwX25vdGhpbmc6Ci0JcmV0dXJuIHJldDsKLQkKLX0KLQotc3RhdGljIGludCBfX2luaXQgaXB0X2hhc2hsaW1pdF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGluaXRfb3JfZmluaSgwKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwdF9oYXNobGltaXRfZmluaSh2b2lkKQotewotCWluaXRfb3JfZmluaSgxKTsKLX0KLQotbW9kdWxlX2luaXQoaXB0X2hhc2hsaW1pdF9pbml0KTsKLW1vZHVsZV9leGl0KGlwdF9oYXNobGltaXRfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwppbmRleCAxMjZkYjQ0Li40ZGIwZTczIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMKQEAgLTQwMSw3ICs0MDEsNyBAQAogc3RhdGljIHNzaXplX3QgcmVjZW50X3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICppbnB1dCwKIAkJCQkgc2l6ZV90IHNpemUsIGxvZmZfdCAqbG9mZikKIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IHJlY2VudF90YWJsZSAqdCA9IHBkZS0+ZGF0YTsKIAlzdHJ1Y3QgcmVjZW50X2VudHJ5ICplOwogCWNoYXIgYnVmW3NpemVvZigiKzI1NS4yNTUuMjU1LjI1NSIpXSwgKmMgPSBidWY7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCmluZGV4IGI5MWYzNTguLmFmMjkzOTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAl1bnNpZ25lZCBpbnQgcmV0OwogCXVfaW50OF90IHRvczsKIAlfX2JlMzIgc2FkZHIsIGRhZGRyOwotCXVuc2lnbmVkIGxvbmcgbmZtYXJrOworCXVfaW50MzJfdCBtYXJrOwogCiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCiAJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCkBAIC0xNDMsNyArMTQzLDcgQEAKIAl9CiAKIAkvKiBTYXZlIHRoaW5ncyB3aGljaCBjb3VsZCBhZmZlY3Qgcm91dGUgKi8KLQluZm1hcmsgPSAoKnBza2IpLT5uZm1hcms7CisJbWFyayA9ICgqcHNrYiktPm1hcms7CiAJc2FkZHIgPSAoKnBza2IpLT5uaC5pcGgtPnNhZGRyOwogCWRhZGRyID0gKCpwc2tiKS0+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+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTY2LDYgKzY3LDcgQEAKIAkJICAgdGNwX2RlYXRoX3Jvdy50d19jb3VudCwgYXRvbWljX3JlYWQoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCksCiAJCSAgIGF0b21pY19yZWFkKCZ0Y3BfbWVtb3J5X2FsbG9jYXRlZCkpOwogCXNlcV9wcmludGYoc2VxLCAiVURQOiBpbnVzZSAlZFxuIiwgZm9sZF9wcm90X2ludXNlKCZ1ZHBfcHJvdCkpOworCXNlcV9wcmludGYoc2VxLCAiVURQTElURTogaW51c2UgJWRcbiIsIGZvbGRfcHJvdF9pbnVzZSgmdWRwbGl0ZV9wcm90KSk7CiAJc2VxX3ByaW50ZihzZXEsICJSQVc6IGludXNlICVkXG4iLCBmb2xkX3Byb3RfaW51c2UoJnJhd19wcm90KSk7CiAJc2VxX3ByaW50ZihzZXEsICAiRlJBRzogaW51c2UgJWQgbWVtb3J5ICVkXG4iLCBpcF9mcmFnX25xdWV1ZXMsCiAJCSAgIGF0b21pY19yZWFkKCZpcF9mcmFnX21lbSkpOwpAQCAtMzA0LDYgKzMwNiwxNyBAQAogCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgdWRwX3N0YXRpc3RpY3MsIAogCQkJCSAgICAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSk7CiAKKwkvKiB0aGUgVURQIGFuZCBVRFAtTGl0ZSBNSUJzIGFyZSB0aGUgc2FtZSAqLworCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKKwlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKKwlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKKwkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopIHVkcGxpdGVfc3RhdGlzdGljcywKKwkJCQkgICAgICBzbm1wNF91ZHBfbGlzdFtpXS5lbnRyeSkgICAgICk7CisKIAlzZXFfcHV0YyhzZXEsICdcbicpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcmF3LmMgYi9uZXQvaXB2NC9yYXcuYwppbmRleCBiNDMwY2YyLi5hNmM2M2JiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yYXcuYworKysgYi9uZXQvaXB2NC9yYXcuYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJcmV0dXJuIGVycjsgCiB9CiAKLXN0YXRpYyB2b2lkIHJhd19wcm9iZV9wcm90b19vcHQoc3RydWN0IGZsb3dpICpmbCwgc3RydWN0IG1zZ2hkciAqbXNnKQorc3RhdGljIGludCByYXdfcHJvYmVfcHJvdG9fb3B0KHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCBtc2doZHIgKm1zZykKIHsKIAlzdHJ1Y3QgaW92ZWMgKmlvdjsKIAl1OCBfX3VzZXIgKnR5cGUgPSBOVUxMOwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoIW1zZy0+bXNnX2lvdikKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBtc2ctPm1zZ19pb3ZsZW47IGkrKykgewogCQlpb3YgPSAmbXNnLT5tc2dfaW92W2ldOwpAQCAtMzYwLDggKzM2MCw5IEBACiAJCQkJY29kZSA9IGlvdi0+aW92X2Jhc2U7CiAKIAkJCWlmICh0eXBlICYmIGNvZGUpIHsKLQkJCQlnZXRfdXNlcihmbC0+ZmxfaWNtcF90eXBlLCB0eXBlKTsKLQkJCSAgICAgICAgZ2V0X3VzZXIoZmwtPmZsX2ljbXBfY29kZSwgY29kZSk7CisJCQkJaWYgKGdldF91c2VyKGZsLT5mbF9pY21wX3R5cGUsIHR5cGUpIHx8CisJCQkJICAgIGdldF91c2VyKGZsLT5mbF9pY21wX2NvZGUsIGNvZGUpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQlwcm9iZWQgPSAxOwogCQkJfQogCQkJYnJlYWs7CkBAIC0zNzIsNiArMzczLDcgQEAKIAkJaWYgKHByb2JlZCkKIAkJCWJyZWFrOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCByYXdfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLApAQCAtNDgwLDggKzQ4MiwxMSBAQAogCQkJCSAgICAucHJvdG8gPSBpbmV0LT5oZHJpbmNsID8gSVBQUk9UT19SQVcgOgogCQkJCQkgICAgCQkgICAgIHNrLT5za19wcm90b2NvbCwKIAkJCQkgIH07Ci0JCWlmICghaW5ldC0+aGRyaW5jbCkKLQkJCXJhd19wcm9iZV9wcm90b19vcHQoJmZsLCBtc2cpOworCQlpZiAoIWluZXQtPmhkcmluY2wpIHsKKwkJCWVyciA9IHJhd19wcm9iZV9wcm90b19vcHQoJmZsLCBtc2cpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGRvbmU7CisJCX0KIAogCQlzZWN1cml0eV9za19jbGFzc2lmeV9mbG93KHNrLCAmZmwpOwogCQllcnIgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdygmcnQsICZmbCwgc2ssICEobXNnLT5tc2dfZmxhZ3MmTVNHX0RPTlRXQUlUKSk7CkBAIC04NDksOCArODU0LDggQEAKIHN0YXRpYyBfX2lubGluZV9fIGNoYXIgKmdldF9yYXdfc29jayhzdHJ1Y3Qgc29jayAqc3AsIGNoYXIgKnRtcGJ1ZiwgaW50IGkpCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc3ApOwotCXVuc2lnbmVkIGludCBkZXN0ID0gaW5ldC0+ZGFkZHIsCi0JCSAgICAgc3JjID0gaW5ldC0+cmN2X3NhZGRyOworCV9fYmUzMiBkZXN0ID0gaW5ldC0+ZGFkZHIsCisJICAgICAgIHNyYyA9IGluZXQtPnJjdl9zYWRkcjsKIAlfX3UxNiBkZXN0cCA9IDAsCiAJICAgICAgc3JjcCAgPSBpbmV0LT5udW07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDkyNWVlNGQuLjFhYWZmMGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtNTY2LDExICs1NjYsOSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX2tleXMoc3RydWN0IGZsb3dpICpmbDEsIHN0cnVjdCBmbG93aSAqZmwyKQogewotCXJldHVybiAoKGZsMS0+bmxfdS5pcDRfdS5kYWRkciBeIGZsMi0+bmxfdS5pcDRfdS5kYWRkcikgfAotCQkoZmwxLT5ubF91LmlwNF91LnNhZGRyIF4gZmwyLT5ubF91LmlwNF91LnNhZGRyKSB8Ci0jaWZkZWYgQ09ORklHX0lQX1JPVVRFX0ZXTUFSSwotCQkoZmwxLT5ubF91LmlwNF91LmZ3bWFyayBeIGZsMi0+bmxfdS5pcDRfdS5md21hcmspIHwKLSNlbmRpZgorCXJldHVybiAoKF9fZm9yY2UgdTMyKSgoZmwxLT5ubF91LmlwNF91LmRhZGRyIF4gZmwyLT5ubF91LmlwNF91LmRhZGRyKSB8CisJCShmbDEtPm5sX3UuaXA0X3Uuc2FkZHIgXiBmbDItPm5sX3UuaXA0X3Uuc2FkZHIpKSB8CisJCShmbDEtPm1hcmsgXiBmbDItPm1hcmspIHwKIAkJKCoodTE2ICopJmZsMS0+bmxfdS5pcDRfdS50b3MgXgogCQkgKih1MTYgKikmZmwyLT5ubF91LmlwNF91LnRvcykgfAogCQkoZmwxLT5vaWYgXiBmbDItPm9pZikgfApAQCAtMTY0Myw5ICsxNjQxLDcgQEAKIAlydGgtPmZsLmZsNF9kc3QJPSBkYWRkcjsKIAlydGgtPnJ0X2RzdAk9IGRhZGRyOwogCXJ0aC0+ZmwuZmw0X3Rvcwk9IHRvczsKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfRldNQVJLCi0JcnRoLT5mbC5mbDRfZndtYXJrPSBza2ItPm5mbWFyazsKLSNlbmRpZgorCXJ0aC0+ZmwubWFyayAgICA9IHNrYi0+bWFyazsKIAlydGgtPmZsLmZsNF9zcmMJPSBzYWRkcjsKIAlydGgtPnJ0X3NyYwk9IHNhZGRyOwogI2lmZGVmIENPTkZJR19ORVRfQ0xTX1JPVVRFCkBAIC0xNzg0LDE0ICsxNzgwLDEyIEBACiAjZW5kaWYKIAlpZiAoaW5fZGV2LT5jbmYubm9fcG9saWN5KQogCQlydGgtPnUuZHN0LmZsYWdzIHw9IERTVF9OT1BPTElDWTsKLQlpZiAoaW5fZGV2LT5jbmYubm9feGZybSkKKwlpZiAob3V0X2Rldi0+Y25mLm5vX3hmcm0pCiAJCXJ0aC0+dS5kc3QuZmxhZ3MgfD0gRFNUX05PWEZSTTsKIAlydGgtPmZsLmZsNF9kc3QJPSBkYWRkcjsKIAlydGgtPnJ0X2RzdAk9IGRhZGRyOwogCXJ0aC0+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+ZmwuaWlmKTsKIAl9CiAKLQlOTEFfUFVUKHNrYiwgUlRBX0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKKwlpZiAocnRubF9wdXRfY2FjaGVpbmZvKHNrYiwgJnJ0LT51LmRzdCwgaWQsIHRzLCB0c2FnZSwKKwkJCSAgICAgICBleHBpcmVzLCBlcnJvcikgPCAwKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCkBAIC0yODk0LDggKzI4NzIsNyBAQAogCQkJCQkJdm9pZCBfX3VzZXIgKm9sZHZhbCwKIAkJCQkJCXNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJCQkJCQl2b2lkIF9fdXNlciAqbmV3dmFsLAotCQkJCQkJc2l6ZV90IG5ld2xlbiwKLQkJCQkJCXZvaWQgKipjb250ZXh0KQorCQkJCQkJc2l6ZV90IG5ld2xlbikKIHsKIAlpbnQgZGVsYXk7CiAJaWYgKG5ld2xlbiAhPSBzaXplb2YoaW50KSkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3N5bmNvb2tpZXMuYyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwppbmRleCA2NjFlMGE0Li42YjE5NTMwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9zeW5jb29raWVzLmMKKysrIGIvbmV0L2lwdjQvc3luY29va2llcy5jCkBAIC0zNSwyMyArMzUsMjMgQEAKICNkZWZpbmUgQ09PS0lFQklUUyAyNAkvKiBVcHBlciBiaXRzIHN0b3JlIGNvdW50ICovCiAjZGVmaW5lIENPT0tJRU1BU0sgKCgoX191MzIpMSA8PCBDT09LSUVCSVRTKSAtIDEpCiAKLXN0YXRpYyB1MzIgY29va2llX2hhc2godTMyIHNhZGRyLCB1MzIgZGFkZHIsIHUzMiBzcG9ydCwgdTMyIGRwb3J0LAorc3RhdGljIHUzMiBjb29raWVfaGFzaChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQsCiAJCSAgICAgICB1MzIgY291bnQsIGludCBjKQogewogCV9fdTMyIHRtcFsxNiArIDUgKyBTSEFfV09SS1NQQUNFX1dPUkRTXTsKIAogCW1lbWNweSh0bXAgKyAzLCBzeW5jb29raWVfc2VjcmV0W2NdLCBzaXplb2Yoc3luY29va2llX3NlY3JldFtjXSkpOwotCXRtcFswXSA9IHNhZGRyOwotCXRtcFsxXSA9IGRhZGRyOwotCXRtcFsyXSA9IChzcG9ydCA8PCAxNikgKyBkcG9ydDsKKwl0bXBbMF0gPSAoX19mb3JjZSB1MzIpc2FkZHI7CisJdG1wWzFdID0gKF9fZm9yY2UgdTMyKWRhZGRyOworCXRtcFsyXSA9ICgoX19mb3JjZSB1MzIpc3BvcnQgPDwgMTYpICsgKF9fZm9yY2UgdTMyKWRwb3J0OwogCXRtcFszXSA9IGNvdW50OwogCXNoYV90cmFuc2Zvcm0odG1wICsgMTYsIChfX3U4ICopdG1wLCB0bXAgKyAxNiArIDUpOwogCiAJcmV0dXJuIHRtcFsxN107CiB9CiAKLXN0YXRpYyBfX3UzMiBzZWN1cmVfdGNwX3N5bl9jb29raWUoX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyLCBfX3UxNiBzcG9ydCwKLQkJCQkgICBfX3UxNiBkcG9ydCwgX191MzIgc3NlcSwgX191MzIgY291bnQsCitzdGF0aWMgX191MzIgc2VjdXJlX3RjcF9zeW5fY29va2llKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCBfX2JlMTYgc3BvcnQsCisJCQkJICAgX19iZTE2IGRwb3J0LCBfX3UzMiBzc2VxLCBfX3UzMiBjb3VudCwKIAkJCQkgICBfX3UzMiBkYXRhKQogewogCS8qCkBAIC04MCw4ICs4MCw4IEBACiAgKiAibWF4ZGlmZiIgaWYgdGhlIGN1cnJlbnQgKHBhc3NlZC1pbikgImNvdW50Ii4gIFRoZSByZXR1cm4gdmFsdWUKICAqIGlzIChfX3UzMiktMSBpZiB0aGlzIHRlc3QgZmFpbHMuCiAgKi8KLXN0YXRpYyBfX3UzMiBjaGVja190Y3Bfc3luX2Nvb2tpZShfX3UzMiBjb29raWUsIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKLQkJCQkgIF9fdTE2IHNwb3J0LCBfX3UxNiBkcG9ydCwgX191MzIgc3NlcSwKK3N0YXRpYyBfX3UzMiBjaGVja190Y3Bfc3luX2Nvb2tpZShfX3UzMiBjb29raWUsIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCSAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQsIF9fdTMyIHNzZXEsCiAJCQkJICBfX3UzMiBjb3VudCwgX191MzIgbWF4ZGlmZikKIHsKIAlfX3UzMiBkaWZmOwpAQCAtMjIwLDcgKzIyMCw3IEBACiAJfQogCWlyZXEgPSBpbmV0X3JzayhyZXEpOwogCXRyZXEgPSB0Y3BfcnNrKHJlcSk7Ci0JdHJlcS0+cmN2X2lzbgkJPSBodG9ubChza2ItPmgudGgtPnNlcSkgLSAxOworCXRyZXEtPnJjdl9pc24JCT0gbnRvaGwoc2tiLT5oLnRoLT5zZXEpIC0gMTsKIAl0cmVxLT5zbnRfaXNuCQk9IGNvb2tpZTsgCiAJcmVxLT5tc3MJCT0gbXNzOwogIAlpcmVxLT5ybXRfcG9ydAkJPSBza2ItPmgudGgtPnNvdXJjZTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jIGIvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMKaW5kZXggZTgyYTViZS4uZmFiZjY5YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMKQEAgLTUxLDggKzUxLDcgQEAKIHN0YXRpYyBpbnQgaXB2NF9zeXNjdGxfZm9yd2FyZF9zdHJhdGVneShjdGxfdGFibGUgKnRhYmxlLAogCQkJIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAogCQkJIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCi0JCQkgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgCi0JCQkgdm9pZCAqKmNvbnRleHQpCisJCQkgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKIAlpbnQgKnZhbHAgPSB0YWJsZS0+ZGF0YTsKIAlpbnQgbmV3OwpAQCAtMTExLDggKzExMCw3IEBACiBzdGF0aWMgaW50IHN5c2N0bF90Y3BfY29uZ2VzdGlvbl9jb250cm9sKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsCiAJCQkJCSBpbnQgbmxlbiwgdm9pZCBfX3VzZXIgKm9sZHZhbCwKIAkJCQkJIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCi0JCQkJCSB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLAotCQkJCQkgdm9pZCAqKmNvbnRleHQpCisJCQkJCSB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWNoYXIgdmFsW1RDUF9DQV9OQU1FX01BWF07CiAJY3RsX3RhYmxlIHRibCA9IHsKQEAgLTEyMiwxOSArMTIwLDcxIEBACiAJaW50IHJldDsKIAogCXRjcF9nZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2wodmFsKTsKLQlyZXQgPSBzeXNjdGxfc3RyaW5nKCZ0YmwsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4sCi0JCQkgICAgY29udGV4dCk7CisJcmV0ID0gc3lzY3RsX3N0cmluZygmdGJsLCBuYW1lLCBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuKTsKIAlpZiAocmV0ID09IDAgJiYgbmV3dmFsICYmIG5ld2xlbikKIAkJcmV0ID0gdGNwX3NldF9kZWZhdWx0X2Nvbmdlc3Rpb25fY29udHJvbCh2YWwpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHRjcF9jb25nZXN0aW9uX2RlZmF1bHQodm9pZCkKK3N0YXRpYyBpbnQgcHJvY190Y3BfYXZhaWxhYmxlX2Nvbmdlc3Rpb25fY29udHJvbChjdGxfdGFibGUgKmN0bCwKKwkJCQkJCSBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICogZmlscCwKKwkJCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCQkJCQkgbG9mZl90ICpwcG9zKQogewotCXJldHVybiB0Y3Bfc2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKENPTkZJR19ERUZBVUxUX1RDUF9DT05HKTsKKwljdGxfdGFibGUgdGJsID0geyAubWF4bGVuID0gVENQX0NBX0JVRl9NQVgsIH07CisJaW50IHJldDsKKworCXRibC5kYXRhID0ga21hbGxvYyh0YmwubWF4bGVuLCBHRlBfVVNFUik7CisJaWYgKCF0YmwuZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJdGNwX2dldF9hdmFpbGFibGVfY29uZ2VzdGlvbl9jb250cm9sKHRibC5kYXRhLCBUQ1BfQ0FfQlVGX01BWCk7CisJcmV0ID0gcHJvY19kb3N0cmluZygmdGJsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlrZnJlZSh0YmwuZGF0YSk7CisJcmV0dXJuIHJldDsKIH0KIAotbGF0ZV9pbml0Y2FsbCh0Y3BfY29uZ2VzdGlvbl9kZWZhdWx0KTsKK3N0YXRpYyBpbnQgcHJvY19hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbChjdGxfdGFibGUgKmN0bCwKKwkJCQkJICAgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJCQkJICAgbG9mZl90ICpwcG9zKQoreworCWN0bF90YWJsZSB0YmwgPSB7IC5tYXhsZW4gPSBUQ1BfQ0FfQlVGX01BWCB9OworCWludCByZXQ7CisKKwl0YmwuZGF0YSA9IGttYWxsb2ModGJsLm1heGxlbiwgR0ZQX1VTRVIpOworCWlmICghdGJsLmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJdGNwX2dldF9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbCh0YmwuZGF0YSwgdGJsLm1heGxlbik7CisJcmV0ID0gcHJvY19kb3N0cmluZygmdGJsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAod3JpdGUgJiYgcmV0ID09IDApCisJCXJldCA9IHRjcF9zZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wodGJsLmRhdGEpOworCWtmcmVlKHRibC5kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0cmF0ZWd5X2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsCisJCQkJCSAgICAgICBpbnQgbmxlbiwgdm9pZCBfX3VzZXIgKm9sZHZhbCwKKwkJCQkJICAgICAgIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCisJCQkJCSAgICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLAorCQkJCQkgICAgICAgc2l6ZV90IG5ld2xlbikKK3sKKwljdGxfdGFibGUgdGJsID0geyAubWF4bGVuID0gVENQX0NBX0JVRl9NQVggfTsKKwlpbnQgcmV0OworCisJdGJsLmRhdGEgPSBrbWFsbG9jKHRibC5tYXhsZW4sIEdGUF9VU0VSKTsKKwlpZiAoIXRibC5kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRjcF9nZXRfYXZhaWxhYmxlX2Nvbmdlc3Rpb25fY29udHJvbCh0YmwuZGF0YSwgdGJsLm1heGxlbik7CisJcmV0ID0gc3lzY3RsX3N0cmluZygmdGJsLCBuYW1lLCBubGVuLCBvbGR2YWwsIG9sZGxlbnAsIG5ld3ZhbCwgbmV3bGVuKTsKKwlpZiAocmV0ID09IDAgJiYgbmV3dmFsICYmIG5ld2xlbikKKwkJcmV0ID0gdGNwX3NldF9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbCh0YmwuZGF0YSk7CisJa2ZyZWUodGJsLmRhdGEpOworCisJcmV0dXJuIHJldDsKKworfQogCiBjdGxfdGFibGUgaXB2NF90YWJsZVtdID0gewogICAgICAgICB7CkBAIC03MzgsNiArNzg4LDIxIEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogI2VuZGlmIC8qIENPTkZJR19ORVRMQUJFTCAqLworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX1RDUF9BVkFJTF9DT05HX0NPTlRST0wsCisJCS5wcm9jbmFtZQk9ICJ0Y3BfYXZhaWxhYmxlX2Nvbmdlc3Rpb25fY29udHJvbCIsCisJCS5tYXhsZW4JCT0gVENQX0NBX0JVRl9NQVgsCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIgICA9ICZwcm9jX3RjcF9hdmFpbGFibGVfY29uZ2VzdGlvbl9jb250cm9sLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0FMTE9XRURfQ09OR19DT05UUk9MLAorCQkucHJvY25hbWUJPSAidGNwX2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sIiwKKwkJLm1heGxlbgkJPSBUQ1BfQ0FfQlVGX01BWCwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciAgID0gJnByb2NfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wsCisJCS5zdHJhdGVneQk9ICZzdHJhdGVneV9hbGxvd2VkX2Nvbmdlc3Rpb25fY29udHJvbCwKKwl9LAogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IDY2ZTlhNzIuLmI2N2UwZGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC0yNTgsNiArMjU4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KIAogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgpAQCAtNDYyLDExICs0NjMsMTIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfZW50YWlsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKIAkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc2tiLT5jc3VtID0gMDsKLQlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IHRwLT53cml0ZV9zZXE7Ci0JVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gdHAtPndyaXRlX3NlcTsKLQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gVENQQ0JfRkxBR19BQ0s7Ci0JVENQX1NLQl9DQihza2IpLT5zYWNrZWQgPSAwOworCXN0cnVjdCB0Y3Bfc2tiX2NiICp0Y2IgPSBUQ1BfU0tCX0NCKHNrYik7CisKKwlza2ItPmNzdW0gICAgPSAwOworCXRjYi0+c2VxICAgICA9IHRjYi0+ZW5kX3NlcSA9IHRwLT53cml0ZV9zZXE7CisJdGNiLT5mbGFncyAgID0gVENQQ0JfRkxBR19BQ0s7CisJdGNiLT5zYWNrZWQgID0gMDsKIAlza2JfaGVhZGVyX3JlbGVhc2Uoc2tiKTsKIAlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CiAJc2tfY2hhcmdlX3NrYihzaywgc2tiKTsKQEAgLTE5NDIsNiArMTk0NCwxMyBAQAogCQl9CiAJCWJyZWFrOwogCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwljYXNlIFRDUF9NRDVTSUc6CisJCS8qIFJlYWQgdGhlIElQLT5LZXkgbWFwcGluZ3MgZnJvbSB1c2Vyc3BhY2UgKi8KKwkJZXJyID0gdHAtPmFmX3NwZWNpZmljLT5tZDVfcGFyc2Uoc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CisjZW5kaWYKKwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9QUk9UT09QVDsKIAkJYnJlYWs7CkBAIC0yMTU0LDcgKzIxNjMsNyBAQAogCXN0cnVjdCB0Y3BoZHIgKnRoOwogCXVuc2lnbmVkIHRobGVuOwogCXVuc2lnbmVkIGludCBzZXE7Ci0JdW5zaWduZWQgaW50IGRlbHRhOworCV9fYmUzMiBkZWx0YTsKIAl1bnNpZ25lZCBpbnQgb2xkbGVuOwogCXVuc2lnbmVkIGludCBsZW47CiAKQEAgLTIyMDcsNyArMjIxNiw4IEBACiAJZG8gewogCQl0aC0+ZmluID0gdGgtPnBzaCA9IDA7CiAKLQkJdGgtPmNoZWNrID0gfmNzdW1fZm9sZCh0aC0+Y2hlY2sgKyBkZWx0YSk7CisJCXRoLT5jaGVjayA9IH5jc3VtX2ZvbGQoKF9fZm9yY2UgX193c3VtKSgoX19mb3JjZSB1MzIpdGgtPmNoZWNrICsKKwkJCQkgICAgICAgKF9fZm9yY2UgdTMyKWRlbHRhKSk7CiAJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQogCQkJdGgtPmNoZWNrID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2ItPmgucmF3LCB0aGxlbiwKIAkJCQkJCQkgICBza2ItPmNzdW0pKTsKQEAgLTIyMjEsNyArMjIzMSw4IEBACiAJfSB3aGlsZSAoc2tiLT5uZXh0KTsKIAogCWRlbHRhID0gaHRvbmwob2xkbGVuICsgKHNrYi0+dGFpbCAtIHNrYi0+aC5yYXcpICsgc2tiLT5kYXRhX2xlbik7Ci0JdGgtPmNoZWNrID0gfmNzdW1fZm9sZCh0aC0+Y2hlY2sgKyBkZWx0YSk7CisJdGgtPmNoZWNrID0gfmNzdW1fZm9sZCgoX19mb3JjZSBfX3dzdW0pKChfX2ZvcmNlIHUzMil0aC0+Y2hlY2sgKworCQkJCShfX2ZvcmNlIHUzMilkZWx0YSkpOwogCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQogCQl0aC0+Y2hlY2sgPSBjc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKHNrYi0+aC5yYXcsIHRobGVuLAogCQkJCQkJICAgc2tiLT5jc3VtKSk7CkBAIC0yMjMxLDYgKzIyNDIsMTM2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRjcF90c29fc2VnbWVudCk7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGNwX21kNXNpZ191c2VyczsKK3N0YXRpYyBzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICoqdGNwX21kNXNpZ19wb29sOworc3RhdGljIERFRklORV9TUElOTE9DSyh0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisKK3N0YXRpYyB2b2lkIF9fdGNwX2ZyZWVfbWQ1c2lnX3Bvb2woc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqKnBvb2wpCit7CisJaW50IGNwdTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKnAgPSAqcGVyX2NwdV9wdHIocG9vbCwgY3B1KTsKKwkJaWYgKHApIHsKKwkJCWlmIChwLT5tZDVfZGVzYy50Zm0pCisJCQkJY3J5cHRvX2ZyZWVfaGFzaChwLT5tZDVfZGVzYy50Zm0pOworCQkJa2ZyZWUocCk7CisJCQlwID0gTlVMTDsKKwkJfQorCX0KKwlmcmVlX3BlcmNwdShwb29sKTsKK30KKwordm9pZCB0Y3BfZnJlZV9tZDVzaWdfcG9vbCh2b2lkKQoreworCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKipwb29sID0gTlVMTDsKKworCXNwaW5fbG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCWlmICgtLXRjcF9tZDVzaWdfdXNlcnMgPT0gMCkgeworCQlwb29sID0gdGNwX21kNXNpZ19wb29sOworCQl0Y3BfbWQ1c2lnX3Bvb2wgPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCWlmIChwb29sKQorCQlfX3RjcF9mcmVlX21kNXNpZ19wb29sKHBvb2wpOworfQorCitFWFBPUlRfU1lNQk9MKHRjcF9mcmVlX21kNXNpZ19wb29sKTsKKworc3RhdGljIHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKipfX3RjcF9hbGxvY19tZDVzaWdfcG9vbCh2b2lkKQoreworCWludCBjcHU7CisJc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqKnBvb2w7CisKKwlwb29sID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKik7CisJaWYgKCFwb29sKQorCQlyZXR1cm4gTlVMTDsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqcDsKKwkJc3RydWN0IGNyeXB0b19oYXNoICpoYXNoOworCisJCXAgPSBremFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCQlpZiAoIXApCisJCQlnb3RvIG91dF9mcmVlOworCQkqcGVyX2NwdV9wdHIocG9vbCwgY3B1KSA9IHA7CisKKwkJaGFzaCA9IGNyeXB0b19hbGxvY19oYXNoKCJtZDUiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwkJaWYgKCFoYXNoIHx8IElTX0VSUihoYXNoKSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisKKwkJcC0+bWQ1X2Rlc2MudGZtID0gaGFzaDsKKwl9CisJcmV0dXJuIHBvb2w7CitvdXRfZnJlZToKKwlfX3RjcF9mcmVlX21kNXNpZ19wb29sKHBvb2wpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICoqdGNwX2FsbG9jX21kNXNpZ19wb29sKHZvaWQpCit7CisJc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqKnBvb2w7CisJaW50IGFsbG9jID0gMDsKKworcmV0cnk6CisJc3Bpbl9sb2NrKCZ0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisJcG9vbCA9IHRjcF9tZDVzaWdfcG9vbDsKKwlpZiAodGNwX21kNXNpZ191c2VycysrID09IDApIHsKKwkJYWxsb2MgPSAxOworCQlzcGluX3VubG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCX0gZWxzZSBpZiAoIXBvb2wpIHsKKwkJdGNwX21kNXNpZ191c2Vycy0tOworCQlzcGluX3VubG9jaygmdGNwX21kNXNpZ19wb29sX2xvY2spOworCQljcHVfcmVsYXgoKTsKKwkJZ290byByZXRyeTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2soJnRjcF9tZDVzaWdfcG9vbF9sb2NrKTsKKworCWlmIChhbGxvYykgeworCQkvKiB3ZSBjYW5ub3QgaG9sZCBzcGlubG9jayBoZXJlIGJlY2F1c2UgdGhpcyBtYXkgc2xlZXAuICovCisJCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKipwID0gX190Y3BfYWxsb2NfbWQ1c2lnX3Bvb2woKTsKKwkJc3Bpbl9sb2NrKCZ0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisJCWlmICghcCkgeworCQkJdGNwX21kNXNpZ191c2Vycy0tOworCQkJc3Bpbl91bmxvY2soJnRjcF9tZDVzaWdfcG9vbF9sb2NrKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXBvb2wgPSB0Y3BfbWQ1c2lnX3Bvb2w7CisJCWlmIChwb29sKSB7CisJCQkvKiBvb3BzLCBpdCBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLiAqLworCQkJc3Bpbl91bmxvY2soJnRjcF9tZDVzaWdfcG9vbF9sb2NrKTsKKwkJCV9fdGNwX2ZyZWVfbWQ1c2lnX3Bvb2wocCk7CisJCX0gZWxzZSB7CisJCQl0Y3BfbWQ1c2lnX3Bvb2wgPSBwb29sID0gcDsKKwkJCXNwaW5fdW5sb2NrKCZ0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisJCX0KKwl9CisJcmV0dXJuIHBvb2w7Cit9CisKK0VYUE9SVF9TWU1CT0wodGNwX2FsbG9jX21kNXNpZ19wb29sKTsKKworc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqX190Y3BfZ2V0X21kNXNpZ19wb29sKGludCBjcHUpCit7CisJc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqKnA7CisJc3Bpbl9sb2NrKCZ0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisJcCA9IHRjcF9tZDVzaWdfcG9vbDsKKwlpZiAocCkKKwkJdGNwX21kNXNpZ191c2VycysrOworCXNwaW5fdW5sb2NrKCZ0Y3BfbWQ1c2lnX3Bvb2xfbG9jayk7CisJcmV0dXJuIChwID8gKnBlcl9jcHVfcHRyKHAsIGNwdSkgOiBOVUxMKTsKK30KKworRVhQT1JUX1NZTUJPTChfX3RjcF9nZXRfbWQ1c2lnX3Bvb2wpOworCit2b2lkIF9fdGNwX3B1dF9tZDVzaWdfcG9vbCh2b2lkKQoreworCXRjcF9mcmVlX21kNXNpZ19wb29sKCk7Cit9CisKK0VYUE9SVF9TWU1CT0woX190Y3BfcHV0X21kNXNpZ19wb29sKTsKKyNlbmRpZgorCiBleHRlcm4gdm9pZCBfX3NrYl9jYl90b29fc21hbGxfZm9yX3RjcChpbnQsIGludCk7CiBleHRlcm4gc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfcmVubzsKIApAQCAtMjI3MCw3ICsyNDExLDcgQEAKIAkJCQkJdGhhc2hfZW50cmllcywKIAkJCQkJKG51bV9waHlzcGFnZXMgPj0gMTI4ICogMTAyNCkgPwogCQkJCQkxMyA6IDE1LAotCQkJCQlIQVNIX0hJR0hNRU0sCisJCQkJCTAsCiAJCQkJCSZ0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZSwKIAkJCQkJTlVMTCwKIAkJCQkJMCk7CkBAIC0yMjg2LDcgKzI0MjcsNyBAQAogCQkJCQl0Y3BfaGFzaGluZm8uZWhhc2hfc2l6ZSwKIAkJCQkJKG51bV9waHlzcGFnZXMgPj0gMTI4ICogMTAyNCkgPwogCQkJCQkxMyA6IDE1LAotCQkJCQlIQVNIX0hJR0hNRU0sCisJCQkJCTAsCiAJCQkJCSZ0Y3BfaGFzaGluZm8uYmhhc2hfc2l6ZSwKIAkJCQkJTlVMTCwKIAkJCQkJNjQgKiAxMDI0KTsKQEAgLTIzMTYsOSArMjQ1NywxMCBAQAogCQlzeXNjdGxfbWF4X3N5bl9iYWNrbG9nID0gMTI4OwogCX0KIAotCXN5c2N0bF90Y3BfbWVtWzBdID0gIDc2OCA8PCBvcmRlcjsKLQlzeXNjdGxfdGNwX21lbVsxXSA9IDEwMjQgPDwgb3JkZXI7Ci0Jc3lzY3RsX3RjcF9tZW1bMl0gPSAxNTM2IDw8IG9yZGVyOworCS8qIEFsbG93IG5vIG1vcmUgdGhhbiAzLzQga2VybmVsIG1lbW9yeSAodXN1YWxseSBsZXNzKSBhbGxvY2F0ZWQgdG8gVENQICovCisJc3lzY3RsX3RjcF9tZW1bMF0gPSAoMTUzNiAvIHNpemVvZiAoc3RydWN0IGluZXRfYmluZF9oYXNoYnVja2V0KSkgPDwgb3JkZXI7CisJc3lzY3RsX3RjcF9tZW1bMV0gPSBzeXNjdGxfdGNwX21lbVswXSAqIDQgLyAzOworCXN5c2N0bF90Y3BfbWVtWzJdID0gc3lzY3RsX3RjcF9tZW1bMF0gKiAyOwogCiAJbGltaXQgPSAoKHVuc2lnbmVkIGxvbmcpc3lzY3RsX3RjcF9tZW1bMV0pIDw8IChQQUdFX1NISUZUIC0gNyk7CiAJbWF4X3NoYXJlID0gbWluKDRVTCoxMDI0KjEwMjQsIGxpbWl0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9jb25nLmMgYi9uZXQvaXB2NC90Y3BfY29uZy5jCmluZGV4IGFmMGFjYTEuLjVjYTc3MjMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9jb25nLmMKKysrIGIvbmV0L2lwdjQvdGNwX2NvbmcuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJc3Bpbl9sb2NrKCZ0Y3BfY29uZ19saXN0X2xvY2spOwogCWNhID0gdGNwX2NhX2ZpbmQobmFtZSk7CiAjaWZkZWYgQ09ORklHX0tNT0QKLQlpZiAoIWNhKSB7CisJaWYgKCFjYSAmJiBjYXBhYmxlKENBUF9TWVNfTU9EVUxFKSkgewogCQlzcGluX3VubG9jaygmdGNwX2NvbmdfbGlzdF9sb2NrKTsKIAogCQlyZXF1ZXN0X21vZHVsZSgidGNwXyVzIiwgbmFtZSk7CkBAIC0xMjMsNiArMTIzLDcgQEAKICNlbmRpZgogCiAJaWYgKGNhKSB7CisJCWNhLT5ub25fcmVzdHJpY3RlZCA9IDE7CS8qIGRlZmF1bHQgaXMgYWx3YXlzIGFsbG93ZWQgKi8KIAkJbGlzdF9tb3ZlKCZjYS0+bGlzdCwgJnRjcF9jb25nX2xpc3QpOwogCQlyZXQgPSAwOwogCX0KQEAgLTEzMSw2ICsxMzIsMzAgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBTZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIGtlcm5lbCBjb25maWd1cmF0aW9uIGF0IGJvb3R1cCAqLworc3RhdGljIGludCBfX2luaXQgdGNwX2Nvbmdlc3Rpb25fZGVmYXVsdCh2b2lkKQoreworCXJldHVybiB0Y3Bfc2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKENPTkZJR19ERUZBVUxUX1RDUF9DT05HKTsKK30KK2xhdGVfaW5pdGNhbGwodGNwX2Nvbmdlc3Rpb25fZGVmYXVsdCk7CisKKworLyogQnVpbGQgc3RyaW5nIHdpdGggbGlzdCBvZiBhdmFpbGFibGUgY29uZ2VzdGlvbiBjb250cm9sIHZhbHVlcyAqLwordm9pZCB0Y3BfZ2V0X2F2YWlsYWJsZV9jb25nZXN0aW9uX2NvbnRyb2woY2hhciAqYnVmLCBzaXplX3QgbWF4bGVuKQoreworCXN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhOworCXNpemVfdCBvZmZzID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjYSwgJnRjcF9jb25nX2xpc3QsIGxpc3QpIHsKKwkJb2ZmcyArPSBzbnByaW50ZihidWYgKyBvZmZzLCBtYXhsZW4gLSBvZmZzLAorCQkJCSAiJXMlcyIsCisJCQkJIG9mZnMgPT0gMCA/ICIiIDogIiAiLCBjYS0+bmFtZSk7CisKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKIC8qIEdldCBjdXJyZW50IGRlZmF1bHQgY29uZ2VzdGlvbiBjb250cm9sICovCiB2b2lkIHRjcF9nZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2woY2hhciAqbmFtZSkKIHsKQEAgLTE0NCw2ICsxNjksNjQgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAorLyogQnVpbHQgbGlzdCBvZiBub24tcmVzdHJpY3RlZCBjb25nZXN0aW9uIGNvbnRyb2wgdmFsdWVzICovCit2b2lkIHRjcF9nZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2woY2hhciAqYnVmLCBzaXplX3QgbWF4bGVuKQoreworCXN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhOworCXNpemVfdCBvZmZzID0gMDsKKworCSpidWYgPSAnXDAnOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjYSwgJnRjcF9jb25nX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFjYS0+bm9uX3Jlc3RyaWN0ZWQpCisJCQljb250aW51ZTsKKwkJb2ZmcyArPSBzbnByaW50ZihidWYgKyBvZmZzLCBtYXhsZW4gLSBvZmZzLAorCQkJCSAiJXMlcyIsCisJCQkJIG9mZnMgPT0gMCA/ICIiIDogIiAiLCBjYS0+bmFtZSk7CisKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKKy8qIENoYW5nZSBsaXN0IG9mIG5vbi1yZXN0cmljdGVkIGNvbmdlc3Rpb24gY29udHJvbCAqLworaW50IHRjcF9zZXRfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2woY2hhciAqdmFsKQoreworCXN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhOworCWNoYXIgKmNsb25lLCAqbmFtZTsKKwlpbnQgcmV0ID0gMDsKKworCWNsb25lID0ga3N0cmR1cCh2YWwsIEdGUF9VU0VSKTsKKwlpZiAoIWNsb25lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9jaygmdGNwX2NvbmdfbGlzdF9sb2NrKTsKKwkvKiBwYXNzIDEgY2hlY2sgZm9yIGJhZCBlbnRyaWVzICovCisJd2hpbGUgKChuYW1lID0gc3Ryc2VwKCZjbG9uZSwgIiAiKSkgJiYgKm5hbWUpIHsKKwkJY2EgPSB0Y3BfY2FfZmluZChuYW1lKTsKKwkJaWYgKCFjYSkgeworCQkJcmV0ID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogcGFzcyAyIGNsZWFyICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2EsICZ0Y3BfY29uZ19saXN0LCBsaXN0KQorCQljYS0+bm9uX3Jlc3RyaWN0ZWQgPSAwOworCisJLyogcGFzcyAzIG1hcmsgYXMgYWxsb3dlZCAqLworCXdoaWxlICgobmFtZSA9IHN0cnNlcCgmdmFsLCAiICIpKSAmJiAqbmFtZSkgeworCQljYSA9IHRjcF9jYV9maW5kKG5hbWUpOworCQlXQVJOX09OKCFjYSk7CisJCWlmIChjYSkKKwkJCWNhLT5ub25fcmVzdHJpY3RlZCA9IDE7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrKCZ0Y3BfY29uZ19saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworCiAvKiBDaGFuZ2UgY29uZ2VzdGlvbiBjb250cm9sIGZvciBzb2NrZXQgKi8KIGludCB0Y3Bfc2V0X2Nvbmdlc3Rpb25fY29udHJvbChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC0xNTMsMTIgKzIzNiwyNSBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWNhID0gdGNwX2NhX2ZpbmQobmFtZSk7CisJLyogbm8gY2hhbmdlIGFza2luZyBmb3IgZXhpc3RpbmcgdmFsdWUgKi8KIAlpZiAoY2EgPT0gaWNzay0+aWNza19jYV9vcHMpCiAJCWdvdG8gb3V0OwogCisjaWZkZWYgQ09ORklHX0tNT0QKKwkvKiBub3QgZm91bmQgYXR0ZW1wdCB0byBhdXRvbG9hZCBtb2R1bGUgKi8KKwlpZiAoIWNhICYmIGNhcGFibGUoQ0FQX1NZU19NT0RVTEUpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXF1ZXN0X21vZHVsZSgidGNwXyVzIiwgbmFtZSk7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJY2EgPSB0Y3BfY2FfZmluZChuYW1lKTsKKwl9CisjZW5kaWYKIAlpZiAoIWNhKQogCQllcnIgPSAtRU5PRU5UOwogCisJZWxzZSBpZiAoIShjYS0+bm9uX3Jlc3RyaWN0ZWQgfHwgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkpCisJCWVyciA9IC1FUEVSTTsKKwogCWVsc2UgaWYgKCF0cnlfbW9kdWxlX2dldChjYS0+b3duZXIpKQogCQllcnIgPSAtRUJVU1k7CiAKQEAgLTI2MCw2ICszNTYsNyBAQAogCiBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9yZW5vID0gewogCS5uYW1lCQk9ICJyZW5vIiwKKwkubm9uX3Jlc3RyaWN0ZWQgPSAxLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuc3N0aHJlc2gJPSB0Y3BfcmVub19zc3RocmVzaCwKIAkuY29uZ19hdm9pZAk9IHRjcF9yZW5vX2NvbmdfYXZvaWQsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY3ViaWMuYyBiL25ldC9pcHY0L3RjcF9jdWJpYy5jCmluZGV4IGE2MGVmMzguLjZhZDE4NDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9jdWJpYy5jCisrKyBiL25ldC9pcHY0L3RjcF9jdWJpYy5jCkBAIC0xOTAsNyArMTkwLDcgQEAKICAgICAgICAgICovCiAKIAkvKiBjaGFuZ2UgdGhlIHVuaXQgZnJvbSBIWiB0byBiaWN0Y3BfSFogKi8KLSAgICAgICAgdCA9ICgodGNwX3RpbWVfc3RhbXAgKyBjYS0+ZGVsYXlfbWluIC0gY2EtPmVwb2NoX3N0YXJ0KQorICAgICAgICB0ID0gKCh0Y3BfdGltZV9zdGFtcCArIChjYS0+ZGVsYXlfbWluPj4zKSAtIGNhLT5lcG9jaF9zdGFydCkKIAkgICAgIDw8IEJJQ1RDUF9IWikgLyBIWjsKIAogICAgICAgICBpZiAodCA8IGNhLT5iaWNfSykJCS8qIHQgLSBLICovCkBAIC0yNTksNyArMjU5LDcgQEAKIAkgICAgKHMzMikodGNwX3RpbWVfc3RhbXAgLSBjYS0+ZXBvY2hfc3RhcnQpIDwgSFopCiAJCXJldHVybjsKIAotCWRlbGF5ID0gdGNwX3RpbWVfc3RhbXAgLSB0cC0+cnhfb3B0LnJjdl90c2VjcjsKKwlkZWxheSA9ICh0Y3BfdGltZV9zdGFtcCAtIHRwLT5yeF9vcHQucmN2X3RzZWNyKTw8MzsKIAlpZiAoZGVsYXkgPT0gMCkKIAkJZGVsYXkgPSAxOwogCkBAIC0zNjYsNyArMzY2LDcgQEAKIAogCWJldGFfc2NhbGUgPSA4KihCSUNUQ1BfQkVUQV9TQ0FMRStiZXRhKS8gMyAvIChCSUNUQ1BfQkVUQV9TQ0FMRSAtIGJldGEpOwogCi0JY3ViZV9ydHRfc2NhbGUgPSAoYmljX3NjYWxlIDw8IDMpIC8gMTA7CS8qIDEwMjQqYy9ydHQgKi8KKwljdWJlX3J0dF9zY2FsZSA9IChiaWNfc2NhbGUgKiAxMCk7CS8qIDEwMjQqYy9ydHQgKi8KIAogCS8qIGNhbGN1bGF0ZSB0aGUgIksiIGZvciAod21heC1jd25kKSA9IGMvcnR0ICogS14zCiAJICogIHNvIEsgPSBjdWJpY19yb290KCAod21heC1jd25kKSpydHQvYyApCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaHRjcC5jIGIvbmV0L2lwdjQvdGNwX2h0Y3AuYwppbmRleCA2ODJlN2Q1Li43NTM5ODdhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaHRjcC5jCisrKyBiL25ldC9pcHY0L3RjcF9odGNwLmMKQEAgLTIzLDE1ICsyMywxNSBAQAogTU9EVUxFX1BBUk1fREVTQyh1c2VfYmFuZHdpZHRoX3N3aXRjaCwgInR1cm4gb24vb2ZmIGJhbmR3aWR0aCBzd2l0Y2hlciIpOwogCiBzdHJ1Y3QgaHRjcCB7Ci0JdTE2CWFscGhhOwkJLyogRml4ZWQgcG9pbnQgYXJpdGgsIDw8IDcgKi8KKwl1MzIJYWxwaGE7CQkvKiBGaXhlZCBwb2ludCBhcml0aCwgPDwgNyAqLwogCXU4CWJldGE7ICAgICAgICAgICAvKiBGaXhlZCBwb2ludCBhcml0aCwgPDwgNyAqLwogCXU4CW1vZGVzd2l0Y2g7ICAgICAvKiBEZWxheSBtb2Rlc3dpdGNoIHVudGlsIHdlIGhhZCBhdCBsZWFzdCBvbmUgY29uZ2VzdGlvbiBldmVudCAqLwotCXUzMglsYXN0X2Nvbmc7CS8qIFRpbWUgc2luY2UgbGFzdCBjb25nZXN0aW9uIGV2ZW50IGVuZCAqLwotCXUzMgl1bmRvX2xhc3RfY29uZzsKIAl1MTYJcGt0c19hY2tlZDsKIAl1MzIJcGFja2V0Y291bnQ7CiAJdTMyCW1pblJUVDsKIAl1MzIJbWF4UlRUOworCXUzMglsYXN0X2Nvbmc7CS8qIFRpbWUgc2luY2UgbGFzdCBjb25nZXN0aW9uIGV2ZW50IGVuZCAqLworCXUzMgl1bmRvX2xhc3RfY29uZzsKIAogCXUzMgl1bmRvX21heFJUVDsKIAl1MzIJdW5kb19vbGRfbWF4QjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggY2YwNmFjYy4uYzcwMWY2YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTI2NzcsNiArMjY3NywxNCBAQAogCQkJCQkgICBvcHRfcngtPnNhY2tfb2spIHsKIAkJCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gKHB0ciAtIDIpIC0gKHVuc2lnbmVkIGNoYXIgKil0aDsKIAkJCQkJfQorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJCQkJY2FzZSBUQ1BPUFRfTUQ1U0lHOgorCQkJCQkvKgorCQkJCQkgKiBUaGUgTUQ1IEhhc2ggaGFzIGFscmVhZHkgYmVlbgorCQkJCQkgKiBjaGVja2VkIChzZWUgdGNwX3Z7NCw2fV9kb19yY3YoKSkuCisJCQkJCSAqLworCQkJCQlicmVhazsKKyNlbmRpZgogCSAgCQkJfTsKIAkgIAkJCXB0cis9b3BzaXplLTI7CiAJICAJCQlsZW5ndGgtPW9wc2l6ZTsKQEAgLTM3ODIsOSArMzc5MCw5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX3RjcF9jaGVja3N1bV9jb21wbGV0ZV91c2VyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBfX3N1bTE2IF9fdGNwX2NoZWNrc3VtX2NvbXBsZXRlX3VzZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCByZXN1bHQ7CisJX19zdW0xNiByZXN1bHQ7CiAKIAlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgewogCQlsb2NhbF9iaF9lbmFibGUoKTsKQEAgLTQyMjcsOSArNDIzNSwxMSBAQAogCQkgKiBDaGFuZ2Ugc3RhdGUgZnJvbSBTWU4tU0VOVCBvbmx5IGFmdGVyIGNvcGllZF9zZXEKIAkJICogaXMgaW5pdGlhbGl6ZWQuICovCiAJCXRwLT5jb3BpZWRfc2VxID0gdHAtPnJjdl9ueHQ7Ci0JCW1iKCk7CisJCXNtcF9tYigpOwogCQl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfRVNUQUJMSVNIRUQpOwogCisJCXNlY3VyaXR5X2luZXRfY29ubl9lc3RhYmxpc2hlZChzaywgc2tiKTsKKwogCQkvKiBNYWtlIHN1cmUgc29ja2V0IGlzIHJvdXRlZCwgZm9yIGNvcnJlY3QgbWV0cmljcy4gICovCiAJCWljc2stPmljc2tfYWZfb3BzLT5yZWJ1aWxkX2hlYWRlcihzayk7CiAKQEAgLTQ0NzMsNyArNDQ4Myw3IEBACiAJCWNhc2UgVENQX1NZTl9SRUNWOgogCQkJaWYgKGFjY2VwdGFibGUpIHsKIAkJCQl0cC0+Y29waWVkX3NlcSA9IHRwLT5yY3Zfbnh0OwotCQkJCW1iKCk7CisJCQkJc21wX21iKCk7CiAJCQkJdGNwX3NldF9zdGF0ZShzaywgVENQX0VTVEFCTElTSEVEKTsKIAkJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggNmJiZDk4NS4uYTEyMjJkNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC03OCw2ICs3OCw5IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCiBpbnQgc3lzY3RsX3RjcF90d19yZXVzZSBfX3JlYWRfbW9zdGx5OwogaW50IHN5c2N0bF90Y3BfbG93X2xhdGVuY3kgX19yZWFkX21vc3RseTsKIApAQCAtODksMTAgKzkyLDE5IEBACiAKIHZvaWQgdGNwX3Y0X3NlbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCitzdGF0aWMgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICp0Y3BfdjRfbWQ1X2RvX2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCQkgICBfX2JlMzIgYWRkcik7CitzdGF0aWMgaW50IHRjcF92NF9kb19jYWxjX21kNV9oYXNoKGNoYXIgKm1kNV9oYXNoLCBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSwKKwkJCQkgICBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkgICBzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IHByb3RvY29sLAorCQkJCSAgIGludCB0Y3BsZW4pOworI2VuZGlmCisKIHN0cnVjdCBpbmV0X2hhc2hpbmZvIF9fY2FjaGVsaW5lX2FsaWduZWQgdGNwX2hhc2hpbmZvID0gewotCS5saGFzaF9sb2NrCT0gX19SV19MT0NLX1VOTE9DS0VEKHRjcF9oYXNoaW5mby5saGFzaF9sb2NrKSwKLQkubGhhc2hfdXNlcnMJPSBBVE9NSUNfSU5JVCgwKSwKLQkubGhhc2hfd2FpdAk9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKHRjcF9oYXNoaW5mby5saGFzaF93YWl0KSwKKwkubGhhc2hfbG9jayAgPSBfX1JXX0xPQ0tfVU5MT0NLRUQodGNwX2hhc2hpbmZvLmxoYXNoX2xvY2spLAorCS5saGFzaF91c2VycyA9IEFUT01JQ19JTklUKDApLAorCS5saGFzaF93YWl0ICA9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKHRjcF9oYXNoaW5mby5saGFzaF93YWl0KSwKIH07CiAKIHN0YXRpYyBpbnQgdGNwX3Y0X2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSkKQEAgLTExMSw3ICsxMjMsNyBAQAogCWluZXRfdW5oYXNoKCZ0Y3BfaGFzaGluZm8sIHNrKTsKIH0KIAotc3RhdGljIGlubGluZSBfX3UzMiB0Y3BfdjRfaW5pdF9zZXF1ZW5jZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIF9fdTMyIHRjcF92NF9pbml0X3NlcXVlbmNlKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXBoLT5kYWRkciwKIAkJCQkJICBza2ItPm5oLmlwaC0+c2FkZHIsCkBAIC0yMDUsMTMgKzIxNywxNCBAQAogCWlmICh0Y3BfZGVhdGhfcm93LnN5c2N0bF90d19yZWN5Y2xlICYmCiAJICAgICF0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCAmJiBydC0+cnRfZHN0ID09IGRhZGRyKSB7CiAJCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXIgPSBydF9nZXRfcGVlcihydCk7Ci0KLQkJLyogVkoncyBpZGVhLiBXZSBzYXZlIGxhc3QgdGltZXN0YW1wIHNlZW4gZnJvbQotCQkgKiB0aGUgZGVzdGluYXRpb24gaW4gcGVlciB0YWJsZSwgd2hlbiBlbnRlcmluZyBzdGF0ZSBUSU1FLVdBSVQKLQkJICogYW5kIGluaXRpYWxpemUgcnhfb3B0LnRzX3JlY2VudCBmcm9tIGl0LCB3aGVuIHRyeWluZyBuZXcgY29ubmVjdGlvbi4KKwkJLyoKKwkJICogVkoncyBpZGVhLiBXZSBzYXZlIGxhc3QgdGltZXN0YW1wIHNlZW4gZnJvbQorCQkgKiB0aGUgZGVzdGluYXRpb24gaW4gcGVlciB0YWJsZSwgd2hlbiBlbnRlcmluZyBzdGF0ZQorCQkgKiBUSU1FLVdBSVQgKiBhbmQgaW5pdGlhbGl6ZSByeF9vcHQudHNfcmVjZW50IGZyb20gaXQsCisJCSAqIHdoZW4gdHJ5aW5nIG5ldyBjb25uZWN0aW9uLgogCQkgKi8KLQotCQlpZiAocGVlciAmJiBwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgPj0geHRpbWUudHZfc2VjKSB7CisJCWlmIChwZWVyICE9IE5VTEwgJiYKKwkJICAgIHBlZXItPnRjcF90c19zdGFtcCArIFRDUF9QQVdTX01TTCA+PSB4dGltZS50dl9zZWMpIHsKIAkJCXRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wID0gcGVlci0+dGNwX3RzX3N0YW1wOwogCQkJdHAtPnJ4X29wdC50c19yZWNlbnQgPSBwZWVyLT50Y3BfdHM7CiAJCX0KQEAgLTIzNiw3ICsyNDksOCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZmFpbHVyZTsKIAotCWVyciA9IGlwX3JvdXRlX25ld3BvcnRzKCZydCwgSVBQUk9UT19UQ1AsIGluZXQtPnNwb3J0LCBpbmV0LT5kcG9ydCwgc2spOworCWVyciA9IGlwX3JvdXRlX25ld3BvcnRzKCZydCwgSVBQUk9UT19UQ1AsCisJCQkJaW5ldC0+c3BvcnQsIGluZXQtPmRwb3J0LCBzayk7CiAJaWYgKGVycikKIAkJZ290byBmYWlsdXJlOwogCkBAIC0yNjAsNyArMjc0LDEwIEBACiAJcmV0dXJuIDA7CiAKIGZhaWx1cmU6Ci0JLyogVGhpcyB1bmhhc2hlcyB0aGUgc29ja2V0IGFuZCByZWxlYXNlcyB0aGUgbG9jYWwgcG9ydCwgaWYgbmVjZXNzYXJ5LiAqLworCS8qCisJICogVGhpcyB1bmhhc2hlcyB0aGUgc29ja2V0IGFuZCByZWxlYXNlcyB0aGUgbG9jYWwgcG9ydCwKKwkgKiBpZiBuZWNlc3NhcnkuCisJICovCiAJdGNwX3NldF9zdGF0ZShzaywgVENQX0NMT1NFKTsKIAlpcF9ydF9wdXQocnQpOwogCXNrLT5za19yb3V0ZV9jYXBzID0gMDsKQEAgLTM3Myw3ICszOTAsNyBAQAogCXNlcSA9IG50b2hsKHRoLT5zZXEpOwogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTiAmJgogCSAgICAhYmV0d2VlbihzZXEsIHRwLT5zbmRfdW5hLCB0cC0+c25kX254dCkpIHsKLQkJTkVUX0lOQ19TVEFUUyhMSU5VWF9NSUJfT1VUT0ZXSU5ET1dJQ01QUyk7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQ4NSw4ICs1MDIsOSBAQAogCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOwogCiAJaWYgKHNrYi0+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+PSAweEZGRkYgPyAtMSA6IHRwLT5zbmRfc3N0aHJlc2gpOwogfQogCi1zdGF0aWMgdm9pZCBnZXRfdGltZXdhaXQ0X3NvY2soc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsIGNoYXIgKnRtcGJ1ZiwgaW50IGkpCitzdGF0aWMgdm9pZCBnZXRfdGltZXdhaXQ0X3NvY2soc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsCisJCQkgICAgICAgY2hhciAqdG1wYnVmLCBpbnQgaSkKIHsKIAlfX2JlMzIgZGVzdCwgc3JjOwogCV9fdTE2IGRlc3RwLCBzcmNwOwpAQCAtMTg3Miw3ICsyNDUyLDggQEAKIAogdm9pZCBfX2luaXQgdGNwX3Y0X2luaXQoc3RydWN0IG5ldF9wcm90b19mYW1pbHkgKm9wcykKIHsKLQlpZiAoaW5ldF9jc2tfY3RsX3NvY2tfY3JlYXRlKCZ0Y3Bfc29ja2V0LCBQRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19UQ1ApIDwgMCkKKwlpZiAoaW5ldF9jc2tfY3RsX3NvY2tfY3JlYXRlKCZ0Y3Bfc29ja2V0LCBQRl9JTkVULCBTT0NLX1JBVywKKwkJCQkgICAgIElQUFJPVE9fVENQKSA8IDApCiAJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBUQ1AgY29udHJvbCBzb2NrZXQuXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCmluZGV4IDAxNjNkOTguLjRhMzg4OWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYworKysgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKQEAgLTQ1LDggKzQ1LDcgQEAKIAkudHdfdGltZXIJPSBUSU1FUl9JTklUSUFMSVpFUihpbmV0X3R3ZHJfaGFuZ21hbiwgMCwKIAkJCQkJICAgICh1bnNpZ25lZCBsb25nKSZ0Y3BfZGVhdGhfcm93KSwKIAkudHdraWxsX3dvcmsJPSBfX1dPUktfSU5JVElBTElaRVIodGNwX2RlYXRoX3Jvdy50d2tpbGxfd29yaywKLQkJCQkJICAgICBpbmV0X3R3ZHJfdHdraWxsX3dvcmssCi0JCQkJCSAgICAgJnRjcF9kZWF0aF9yb3cpLAorCQkJCQkgICAgIGluZXRfdHdkcl90d2tpbGxfd29yayksCiAvKiBTaG9ydC10aW1lIHRpbWV3YWl0IGNhbGVuZGFyICovCiAKIAkudHdjYWxfaGFuZAk9IC0xLApAQCAtMzA2LDYgKzMwNSwyOCBAQAogCQkJdHctPnR3X2lwdjZvbmx5ID0gbnAtPmlwdjZvbmx5OwogCQl9CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJCS8qCisJCSAqIFRoZSB0aW1ld2FpdCBidWNrZXQgZG9lcyBub3QgaGF2ZSB0aGUga2V5IERCIGZyb20gdGhlCisJCSAqIHNvY2sgc3RydWN0dXJlLiBXZSBqdXN0IG1ha2UgYSBxdWljayBjb3B5IG9mIHRoZQorCQkgKiBtZDUga2V5IGJlaW5nIHVzZWQgKGlmIGluZGVlZCB3ZSBhcmUgdXNpbmcgb25lKQorCQkgKiBzbyB0aGUgdGltZXdhaXQgYWNrIGdlbmVyYXRpbmcgY29kZSBoYXMgdGhlIGtleS4KKwkJICovCisJCWRvIHsKKwkJCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5OworCQkJbWVtc2V0KHRjcHR3LT50d19tZDVfa2V5LCAwLCBzaXplb2YodGNwdHctPnR3X21kNV9rZXkpKTsKKwkJCXRjcHR3LT50d19tZDVfa2V5bGVuID0gMDsKKwkJCWtleSA9IHRwLT5hZl9zcGVjaWZpYy0+bWQ1X2xvb2t1cChzaywgc2spOworCQkJaWYgKGtleSAhPSBOVUxMKSB7CisJCQkJbWVtY3B5KCZ0Y3B0dy0+dHdfbWQ1X2tleSwga2V5LT5rZXksIGtleS0+a2V5bGVuKTsKKwkJCQl0Y3B0dy0+dHdfbWQ1X2tleWxlbiA9IGtleS0+a2V5bGVuOworCQkJCWlmICh0Y3BfYWxsb2NfbWQ1c2lnX3Bvb2woKSA9PSBOVUxMKQorCQkJCQlCVUcoKTsKKwkJCX0KKwkJfSB3aGlsZSgwKTsKKyNlbmRpZgorCiAJCS8qIExpbmthZ2UgdXBkYXRlcy4gKi8KIAkJX19pbmV0X3R3c2tfaGFzaGRhbmNlKHR3LCBzaywgJnRjcF9oYXNoaW5mbyk7CiAKQEAgLTMyOSwxNCArMzUwLDI0IEBACiAJCSAqIHNvY2tldCB1cC4gIFdlJ3ZlIGdvdCBiaWdnZXIgcHJvYmxlbXMgdGhhbgogCQkgKiBub24tZ3JhY2VmdWwgc29ja2V0IGNsb3NpbmdzLgogCQkgKi8KLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0lORk8gIlRDUDogdGltZSB3YWl0IGJ1Y2tldCB0YWJsZSBvdmVyZmxvd1xuIik7CisJCUxJTUlUX05FVERFQlVHKEtFUk5fSU5GTyAiVENQOiB0aW1lIHdhaXQgYnVja2V0IHRhYmxlIG92ZXJmbG93XG4iKTsKIAl9CiAKIAl0Y3BfdXBkYXRlX21ldHJpY3Moc2spOwogCXRjcF9kb25lKHNrKTsKIH0KIAordm9pZCB0Y3BfdHdza19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzaykKK3sKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXN0cnVjdCB0Y3BfdGltZXdhaXRfc29jayAqdHdzayA9IHRjcF90d3NrKHNrKTsKKwlpZiAodHdzay0+dHdfbWQ1X2tleWxlbikKKwkJdGNwX3B1dF9tZDVzaWdfcG9vbCgpOworI2VuZGlmCit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF90d3NrX2Rlc3RydWN0b3IpOworCiAvKiBUaGlzIGlzIG5vdCBvbmx5IG1vcmUgZWZmaWNpZW50IHRoYW4gd2hhdCB3ZSB1c2VkIHRvIGRvLCBpdCBlbGltaW5hdGVzCiAgKiBhIGxvdCBvZiBjb2RlIGR1cGxpY2F0aW9uIGJldHdlZW4gSVB2NC9JUHY2IFNZTiByZWN2IHByb2Nlc3NpbmcuIC1EYXZlTQogICoKQEAgLTQzNSw2ICs0NjYsMTEgQEAKIAkJCW5ld3RwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wID0gMDsKIAkJCW5ld3RwLT50Y3BfaGVhZGVyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAkJfQorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJCW5ld3RwLT5tZDVzaWdfaW5mbyA9IE5VTEw7CS8qWFhYKi8KKwkJaWYgKG5ld3RwLT5hZl9zcGVjaWZpYy0+bWQ1X2xvb2t1cChzaywgbmV3c2spKQorCQkJbmV3dHAtPnRjcF9oZWFkZXJfbGVuICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CisjZW5kaWYKIAkJaWYgKHNrYi0+bGVuID49IFRDUF9NSU5fUkNWTVNTK25ld3RwLT50Y3BfaGVhZGVyX2xlbikKIAkJCW5ld2ljc2stPmljc2tfYWNrLmxhc3Rfc2VnX3NpemUgPSBza2ItPmxlbiAtIG5ld3RwLT50Y3BfaGVhZGVyX2xlbjsKIAkJbmV3dHAtPnJ4X29wdC5tc3NfY2xhbXAgPSByZXEtPm1zczsKQEAgLTQ1NSw3ICs0OTEsNyBAQAogCQkJICAgc3RydWN0IHJlcXVlc3Rfc29jayAqKnByZXYpCiB7CiAJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7Ci0JdTMyIGZsZyA9IHRjcF9mbGFnX3dvcmQodGgpICYgKFRDUF9GTEFHX1JTVHxUQ1BfRkxBR19TWU58VENQX0ZMQUdfQUNLKTsKKwlfX2JlMzIgZmxnID0gdGNwX2ZsYWdfd29yZCh0aCkgJiAoVENQX0ZMQUdfUlNUfFRDUF9GTEFHX1NZTnxUQ1BfRkxBR19BQ0spOwogCWludCBwYXdzX3JlamVjdCA9IDA7CiAJc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHRtcF9vcHQ7CiAJc3RydWN0IHNvY2sgKmNoaWxkOwpAQCAtNjE3LDYgKzY1MywzMCBAQAogCQkJCQkJCQkgcmVxLCBOVUxMKTsKIAkJaWYgKGNoaWxkID09IE5VTEwpCiAJCQlnb3RvIGxpc3Rlbl9vdmVyZmxvdzsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQllbHNlIHsKKwkJCS8qIENvcHkgb3ZlciB0aGUgTUQ1IGtleSBmcm9tIHRoZSBvcmlnaW5hbCBzb2NrZXQgKi8KKwkJCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5OworCQkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJCQlrZXkgPSB0cC0+YWZfc3BlY2lmaWMtPm1kNV9sb29rdXAoc2ssIGNoaWxkKTsKKwkJCWlmIChrZXkgIT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogV2UncmUgdXNpbmcgb25lLCBzbyBjcmVhdGUgYSBtYXRjaGluZyBrZXkgb24gdGhlCisJCQkJICogbmV3c2sgc3RydWN0dXJlLiBJZiB3ZSBmYWlsIHRvIGdldCBtZW1vcnkgdGhlbiB3ZQorCQkJCSAqIGVuZCB1cCBub3QgY29weWluZyB0aGUga2V5IGFjcm9zcy4gU2h1Y2tzLgorCQkJCSAqLworCQkJCWNoYXIgKm5ld2tleSA9IGttZW1kdXAoa2V5LT5rZXksIGtleS0+a2V5bGVuLAorCQkJCQkJICAgICAgIEdGUF9BVE9NSUMpOworCQkJCWlmIChuZXdrZXkpIHsKKwkJCQkJaWYgKCF0Y3BfYWxsb2NfbWQ1c2lnX3Bvb2woKSkKKwkJCQkJCUJVRygpOworCQkJCQl0cC0+YWZfc3BlY2lmaWMtPm1kNV9hZGQoY2hpbGQsIGNoaWxkLAorCQkJCQkJCQkgbmV3a2V5LAorCQkJCQkJCQkga2V5LT5rZXlsZW4pOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCiAKIAkJaW5ldF9jc2tfcmVxc2tfcXVldWVfdW5saW5rKHNrLCByZXEsIHByZXYpOwogCQlpbmV0X2Nza19yZXFza19xdWV1ZV9yZW1vdmVkKHNrLCByZXEpOwpAQCAtNjMzLDcgKzY5Myw3IEBACiAJZW1icnlvbmljX3Jlc2V0OgogCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9FTUJSWU9OSUNSU1RTKTsKIAkJaWYgKCEoZmxnICYgVENQX0ZMQUdfUlNUKSkKLQkJCXJlcS0+cnNrX29wcy0+c2VuZF9yZXNldChza2IpOworCQkJcmVxLT5yc2tfb3BzLT5zZW5kX3Jlc2V0KHNrLCBza2IpOwogCiAJCWluZXRfY3NrX3JlcXNrX3F1ZXVlX2Ryb3Aoc2ssIHJlcSwgcHJldik7CiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX291dHB1dC5jIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCmluZGV4IGYyMjUzNmUuLjMyYzFhOTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogfQogCiBzdGF0aWMgdm9pZCB0Y3BfYnVpbGRfYW5kX3VwZGF0ZV9vcHRpb25zKF9fYmUzMiAqcHRyLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAotCQkJCQkgX191MzIgdHN0YW1wKQorCQkJCQkgX191MzIgdHN0YW1wLCBfX3U4ICoqbWQ1X2hhc2gpCiB7CiAJaWYgKHRwLT5yeF9vcHQudHN0YW1wX29rKSB7CiAJCSpwdHIrKyA9IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KSB8CkBAIC0yOTgsMTYgKzI5OCwyOSBAQAogCQkJdHAtPnJ4X29wdC5lZmZfc2Fja3MtLTsKIAkJfQogCX0KKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCWlmIChtZDVfaGFzaCkgeworCQkqcHRyKysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfAorCQkJICAgICAgIChUQ1BPUFRfTk9QIDw8IDE2KSB8CisJCQkgICAgICAgKFRDUE9QVF9NRDVTSUcgPDwgOCkgfAorCQkJICAgICAgIFRDUE9MRU5fTUQ1U0lHKTsKKwkJKm1kNV9oYXNoID0gKF9fdTggKilwdHI7CisJfQorI2VuZGlmCiB9CiAKIC8qIENvbnN0cnVjdCBhIHRjcCBvcHRpb25zIGhlYWRlciBmb3IgYSBTWU4gb3IgU1lOX0FDSyBwYWNrZXQuCiAgKiBJZiB0aGlzIGlzIGV2ZXJ5IGNoYW5nZWQgbWFrZSBzdXJlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgogICogTUFYX1NZTl9TSVpFIHRvIG1hdGNoIHRoZSBuZXcgbWF4aW11bSBudW1iZXIgb2Ygb3B0aW9ucyB0aGF0IHlvdQogICogY2FuIGdlbmVyYXRlLgorICoKKyAqIE5vdGUgLSB0aGF0IHdpdGggdGhlIFJGQzIzODUgVENQIG9wdGlvbiwgd2UgbWFrZSByb29tIGZvciB0aGUKKyAqIDE2IGJ5dGUgTUQ1IGhhc2guIFRoaXMgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIsIHNvIHRoZSBwb2ludGVyIGZvciB0aGUKKyAqIGxvY2F0aW9uIHRvIGJlIGZpbGxlZCBpcyBwYXNzZWQgYmFjayB1cC4KICAqLwogc3RhdGljIHZvaWQgdGNwX3N5bl9idWlsZF9vcHRpb25zKF9fYmUzMiAqcHRyLCBpbnQgbXNzLCBpbnQgdHMsIGludCBzYWNrLAogCQkJCSAgaW50IG9mZmVyX3dzY2FsZSwgaW50IHdzY2FsZSwgX191MzIgdHN0YW1wLAotCQkJCSAgX191MzIgdHNfcmVjZW50KQorCQkJCSAgX191MzIgdHNfcmVjZW50LCBfX3U4ICoqbWQ1X2hhc2gpCiB7CiAJLyogV2UgYWx3YXlzIGdldCBhbiBNU1Mgb3B0aW9uLgogCSAqIFRoZSBvcHRpb24gYnl0ZXMgd2hpY2ggd2lsbCBiZSBzZWVuIGluIG5vcm1hbCBkYXRhCkBAIC0zNDYsNiArMzU5LDIwIEBACiAJCQkgICAgICAgKFRDUE9QVF9XSU5ET1cgPDwgMTYpIHwKIAkJCSAgICAgICAoVENQT0xFTl9XSU5ET1cgPDwgOCkgfAogCQkJICAgICAgICh3c2NhbGUpKTsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qCisJICogSWYgTUQ1IGlzIGVuYWJsZWQsIHRoZW4gd2Ugc2V0IHRoZSBvcHRpb24sIGFuZCBpbmNsdWRlIHRoZSBzaXplCisJICogKGFsd2F5cyAxOCkuIFRoZSBhY3R1YWwgTUQ1IGhhc2ggaXMgYWRkZWQganVzdCBiZWZvcmUgdGhlCisJICogcGFja2V0IGlzIHNlbnQuCisJICovCisJaWYgKG1kNV9oYXNoKSB7CisJCSpwdHIrKyA9IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KSB8CisJCQkgICAgICAgKFRDUE9QVF9OT1AgPDwgMTYpIHwKKwkJCSAgICAgICAoVENQT1BUX01ENVNJRyA8PCA4KSB8CisJCQkgICAgICAgVENQT0xFTl9NRDVTSUcpOworCQkqbWQ1X2hhc2ggPSAoX191OCAqKSBwdHI7CisJfQorI2VuZGlmCiB9CiAKIC8qIFRoaXMgcm91dGluZSBhY3R1YWxseSB0cmFuc21pdHMgVENQIHBhY2tldHMgcXVldWVkIGluIGJ5CkBAIC0zNjYsNiArMzkzLDEwIEBACiAJc3RydWN0IHRjcF9zb2NrICp0cDsKIAlzdHJ1Y3QgdGNwX3NrYl9jYiAqdGNiOwogCWludCB0Y3BfaGVhZGVyX3NpemU7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKm1kNTsKKwlfX3U4ICptZDVfaGFzaF9sb2NhdGlvbjsKKyNlbmRpZgogCXN0cnVjdCB0Y3BoZHIgKnRoOwogCWludCBzeXNjdGxfZmxhZ3M7CiAJaW50IGVycjsKQEAgLTQyNCw5ICs0NTUsMTggQEAKIAlpZiAodGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA9PSAwKQogCQl0Y3BfY2FfZXZlbnQoc2ssIENBX0VWRU5UX1RYX1NUQVJUKTsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJLyoKKwkgKiBBcmUgd2UgZG9pbmcgTUQ1IG9uIHRoaXMgc2VnbWVudD8gSWYgc28gLSBtYWtlCisJICogcm9vbSBmb3IgaXQuCisJICovCisJbWQ1ID0gdHAtPmFmX3NwZWNpZmljLT5tZDVfbG9va3VwKHNrLCBzayk7CisJaWYgKG1kNSkKKwkJdGNwX2hlYWRlcl9zaXplICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CisjZW5kaWYKKwogCXRoID0gKHN0cnVjdCB0Y3BoZHIgKikgc2tiX3B1c2goc2tiLCB0Y3BfaGVhZGVyX3NpemUpOwogCXNrYi0+aC50aCA9IHRoOwotCXNrYl9zZXRfb3duZXJfdyhza2IsIHNrKTsKIAogCS8qIEJ1aWxkIFRDUCBoZWFkZXIgYW5kIGNoZWNrc3VtIGl0LiAqLwogCXRoLT5zb3VyY2UJCT0gaW5ldC0+c3BvcnQ7CkBAIC00NjEsMTMgKzUwMSwzNCBAQAogCQkJCSAgICAgIChzeXNjdGxfZmxhZ3MgJiBTWVNDVExfRkxBR19XU0NBTEUpLAogCQkJCSAgICAgIHRwLT5yeF9vcHQucmN2X3dzY2FsZSwKIAkJCQkgICAgICB0Y2ItPndoZW4sCi0JCQkJICAgICAgdHAtPnJ4X29wdC50c19yZWNlbnQpOworCQkJCSAgICAgIHRwLT5yeF9vcHQudHNfcmVjZW50LAorCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwkJCQkgICAgICBtZDUgPyAmbWQ1X2hhc2hfbG9jYXRpb24gOgorI2VuZGlmCisJCQkJICAgICAgTlVMTCk7CiAJfSBlbHNlIHsKIAkJdGNwX2J1aWxkX2FuZF91cGRhdGVfb3B0aW9ucygoX19iZTMyICopKHRoICsgMSksCi0JCQkJCSAgICAgdHAsIHRjYi0+d2hlbik7CisJCQkJCSAgICAgdHAsIHRjYi0+d2hlbiwKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQkJCQkgICAgIG1kNSA/ICZtZDVfaGFzaF9sb2NhdGlvbiA6CisjZW5kaWYKKwkJCQkJICAgICBOVUxMKTsKIAkJVENQX0VDTl9zZW5kKHNrLCB0cCwgc2tiLCB0Y3BfaGVhZGVyX3NpemUpOwogCX0KIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJLyogQ2FsY3VsYXRlIHRoZSBNRDUgaGFzaCwgYXMgd2UgaGF2ZSBhbGwgd2UgbmVlZCBub3cgKi8KKwlpZiAobWQ1KSB7CisJCXRwLT5hZl9zcGVjaWZpYy0+Y2FsY19tZDVfaGFzaChtZDVfaGFzaF9sb2NhdGlvbiwKKwkJCQkJICAgICAgIG1kNSwKKwkJCQkJICAgICAgIHNrLCBOVUxMLCBOVUxMLAorCQkJCQkgICAgICAgc2tiLT5oLnRoLAorCQkJCQkgICAgICAgc2stPnNrX3Byb3RvY29sLAorCQkJCQkgICAgICAgc2tiLT5sZW4pOworCX0KKyNlbmRpZgorCiAJaWNzay0+aWNza19hZl9vcHMtPnNlbmRfY2hlY2soc2ssIHNrYi0+bGVuLCBza2IpOwogCiAJaWYgKGxpa2VseSh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19BQ0spKQpAQCAtNDc5LDE5ICs1NDAsMTMgQEAKIAlpZiAoYWZ0ZXIodGNiLT5lbmRfc2VxLCB0cC0+c25kX254dCkgfHwgdGNiLT5zZXEgPT0gdGNiLT5lbmRfc2VxKQogCQlUQ1BfSU5DX1NUQVRTKFRDUF9NSUJfT1VUU0VHUyk7CiAKLQllcnIgPSBpY3NrLT5pY3NrX2FmX29wcy0+cXVldWVfeG1pdChza2IsIDApOworCWVyciA9IGljc2stPmljc2tfYWZfb3BzLT5xdWV1ZV94bWl0KHNrYiwgc2ssIDApOwogCWlmIChsaWtlbHkoZXJyIDw9IDApKQogCQlyZXR1cm4gZXJyOwogCiAJdGNwX2VudGVyX2N3cihzayk7CiAKLQkvKiBORVRfWE1JVF9DTiBpcyBzcGVjaWFsLiBJdCBkb2VzIG5vdCBndWFyYW50ZWUsCi0JICogdGhhdCB0aGlzIHBhY2tldCBpcyBsb3N0LiBJdCB0ZWxscyB0aGF0IGRldmljZQotCSAqIGlzIGFib3V0IHRvIHN0YXJ0IHRvIGRyb3AgcGFja2V0cyBvciBhbHJlYWR5Ci0JICogZHJvcHMgc29tZSBwYWNrZXRzIG9mIHRoZSBzYW1lIHByaW9yaXR5IGFuZAotCSAqIGludm9rZXMgdXMgdG8gc2VuZCBsZXNzIGFnZ3Jlc3NpdmVseS4KLQkgKi8KLQlyZXR1cm4gZXJyID09IE5FVF9YTUlUX0NOID8gMCA6IGVycjsKKwlyZXR1cm4gbmV0X3htaXRfZXZhbChlcnIpOwogCiAjdW5kZWYgU1lTQ1RMX0ZMQUdfVFNUQU1QUwogI3VuZGVmIFNZU0NUTF9GTEFHX1dTQ0FMRQpAQCAtODQ3LDYgKzkwMiwxMSBAQAogCQltc3Nfbm93IC09IChUQ1BPTEVOX1NBQ0tfQkFTRV9BTElHTkVEICsKIAkJCSAgICAodHAtPnJ4X29wdC5lZmZfc2Fja3MgKiBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spKTsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKHRwLT5hZl9zcGVjaWZpYy0+bWQ1X2xvb2t1cChzaywgc2spKQorCQltc3Nfbm93IC09IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CisjZW5kaWYKKwogCXhtaXRfc2l6ZV9nb2FsID0gbXNzX25vdzsKIAogCWlmIChkb2luZ190c28pIHsKQEAgLTEwOTYsMTAgKzExNTYsMTQgQEAKIAl1MzIgc2VuZF93aW4sIGNvbmdfd2luLCBsaW1pdCwgaW5fZmxpZ2h0OwogCiAJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikKLQkJcmV0dXJuIDA7CisJCWdvdG8gc2VuZF9ub3c7CiAKIAlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSAhPSBUQ1BfQ0FfT3BlbikKLQkJcmV0dXJuIDA7CisJCWdvdG8gc2VuZF9ub3c7CisKKwkvKiBEZWZlciBmb3IgbGVzcyB0aGFuIHR3byBjbG9jayB0aWNrcy4gKi8KKwlpZiAoIXRwLT50c29fZGVmZXJyZWQgJiYgKChqaWZmaWVzPDwxKT4+MSkgLSAodHAtPnRzb19kZWZlcnJlZD4+MSkgPiAxKQorCQlnb3RvIHNlbmRfbm93OwogCiAJaW5fZmxpZ2h0ID0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKTsKIApAQCAtMTExNSw3ICsxMTc5LDcgQEAKIAogCS8qIElmIGEgZnVsbC1zaXplZCBUU08gc2tiIGNhbiBiZSBzZW50LCBkbyBpdC4gKi8KIAlpZiAobGltaXQgPj0gNjU1MzYpCi0JCXJldHVybiAwOworCQlnb3RvIHNlbmRfbm93OwogCiAJaWYgKHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yKSB7CiAJCXUzMiBjaHVuayA9IG1pbih0cC0+c25kX3duZCwgdHAtPnNuZF9jd25kICogdHAtPm1zc19jYWNoZSk7CkBAIC0xMTI1LDcgKzExODksNyBAQAogCQkgKi8KIAkJY2h1bmsgLz0gc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3I7CiAJCWlmIChsaW1pdCA+PSBjaHVuaykKLQkJCXJldHVybiAwOworCQkJZ290byBzZW5kX25vdzsKIAl9IGVsc2UgewogCQkvKiBEaWZmZXJlbnQgYXBwcm9hY2gsIHRyeSBub3QgdG8gZGVmZXIgcGFzdCBhIHNpbmdsZQogCQkgKiBBQ0suICBSZWNlaXZlciBzaG91bGQgQUNLIGV2ZXJ5IG90aGVyIGZ1bGwgc2l6ZWQKQEAgLTExMzMsMTEgKzExOTcsMTcgQEAKIAkJICogdGhlbiBzZW5kIG5vdy4KIAkJICovCiAJCWlmIChsaW1pdCA+IHRjcF9tYXhfYnVyc3QodHApICogdHAtPm1zc19jYWNoZSkKLQkJCXJldHVybiAwOworCQkJZ290byBzZW5kX25vdzsKIAl9CiAKIAkvKiBPaywgaXQgbG9va3MgbGlrZSBpdCBpcyBhZHZpc2FibGUgdG8gZGVmZXIuICAqLworCXRwLT50c29fZGVmZXJyZWQgPSAxIHwgKGppZmZpZXM8PDEpOworCiAJcmV0dXJuIDE7CisKK3NlbmRfbm93OgorCXRwLT50c29fZGVmZXJyZWQgPSAwOworCXJldHVybiAwOwogfQogCiAvKiBDcmVhdGUgYSBuZXcgTVRVIHByb2JlIGlmIHdlIGFyZSByZWFkeS4KQEAgLTIwMzAsNiArMjEwMCwxMCBAQAogCXN0cnVjdCB0Y3BoZHIgKnRoOwogCWludCB0Y3BfaGVhZGVyX3NpemU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqbWQ1OworCV9fdTggKm1kNV9oYXNoX2xvY2F0aW9uOworI2VuZGlmCiAKIAlza2IgPSBzb2NrX3dtYWxsb2Moc2ssIE1BWF9UQ1BfSEVBREVSICsgMTUsIDEsIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKQEAgLTIwNDUsNiArMjExOSwxMyBAQAogCQkJICAgKGlyZXEtPndzY2FsZV9vayA/IFRDUE9MRU5fV1NDQUxFX0FMSUdORUQgOiAwKSArCiAJCQkgICAvKiBTQUNLX1BFUk0gaXMgaW4gdGhlIHBsYWNlIG9mIE5PUCBOT1Agb2YgVFMgKi8KIAkJCSAgICgoaXJlcS0+c2Fja19vayAmJiAhaXJlcS0+dHN0YW1wX29rKSA/IFRDUE9MRU5fU0FDS1BFUk1fQUxJR05FRCA6IDApKTsKKworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJLyogQXJlIHdlIGRvaW5nIE1ENSBvbiB0aGlzIHNlZ21lbnQ/IElmIHNvIC0gbWFrZSByb29tIGZvciBpdCAqLworCW1kNSA9IHRjcF9yc2socmVxKS0+YWZfc3BlY2lmaWMtPm1kNV9sb29rdXAoc2ssIHJlcSk7CisJaWYgKG1kNSkKKwkJdGNwX2hlYWRlcl9zaXplICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CisjZW5kaWYKIAlza2ItPmgudGggPSB0aCA9IChzdHJ1Y3QgdGNwaGRyICopIHNrYl9wdXNoKHNrYiwgdGNwX2hlYWRlcl9zaXplKTsKIAogCW1lbXNldCh0aCwgMCwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKQEAgLTIwODIsMTEgKzIxNjMsMjkgQEAKIAl0Y3Bfc3luX2J1aWxkX29wdGlvbnMoKF9fYmUzMiAqKSh0aCArIDEpLCBkc3RfbWV0cmljKGRzdCwgUlRBWF9BRFZNU1MpLCBpcmVxLT50c3RhbXBfb2ssCiAJCQkgICAgICBpcmVxLT5zYWNrX29rLCBpcmVxLT53c2NhbGVfb2ssIGlyZXEtPnJjdl93c2NhbGUsCiAJCQkgICAgICBUQ1BfU0tCX0NCKHNrYiktPndoZW4sCi0JCQkgICAgICByZXEtPnRzX3JlY2VudCk7CisJCQkgICAgICByZXEtPnRzX3JlY2VudCwKKwkJCSAgICAgICgKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQkJICAgICAgIG1kNSA/ICZtZDVfaGFzaF9sb2NhdGlvbiA6CisjZW5kaWYKKwkJCSAgICAgICBOVUxMKQorCQkJICAgICAgKTsKIAogCXNrYi0+Y3N1bSA9IDA7CiAJdGgtPmRvZmYgPSAodGNwX2hlYWRlcl9zaXplID4+IDIpOwogCVRDUF9JTkNfU1RBVFMoVENQX01JQl9PVVRTRUdTKTsKKworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJLyogT2theSwgd2UgaGF2ZSBhbGwgd2UgbmVlZCAtIGRvIHRoZSBtZDUgaGFzaCBpZiBuZWVkZWQgKi8KKwlpZiAobWQ1KSB7CisJCXRwLT5hZl9zcGVjaWZpYy0+Y2FsY19tZDVfaGFzaChtZDVfaGFzaF9sb2NhdGlvbiwKKwkJCQkJICAgICAgIG1kNSwKKwkJCQkJICAgICAgIE5VTEwsIGRzdCwgcmVxLAorCQkJCQkgICAgICAgc2tiLT5oLnRoLCBzay0+c2tfcHJvdG9jb2wsCisJCQkJCSAgICAgICBza2ItPmxlbik7CisJfQorI2VuZGlmCisKIAlyZXR1cm4gc2tiOwogfQogCkBAIC0yMTA1LDYgKzIyMDQsMTEgQEAKIAl0cC0+dGNwX2hlYWRlcl9sZW4gPSBzaXplb2Yoc3RydWN0IHRjcGhkcikgKwogCQkoc3lzY3RsX3RjcF90aW1lc3RhbXBzID8gVENQT0xFTl9UU1RBTVBfQUxJR05FRCA6IDApOwogCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlpZiAodHAtPmFmX3NwZWNpZmljLT5tZDVfbG9va3VwKHNrLCBzaykgIT0gTlVMTCkKKwkJdHAtPnRjcF9oZWFkZXJfbGVuICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CisjZW5kaWYKKwogCS8qIElmIHVzZXIgZ2F2ZSBoaXMgVENQX01BWFNFRywgcmVjb3JkIGl0IHRvIGNsYW1wICovCiAJaWYgKHRwLT5yeF9vcHQudXNlcl9tc3MpCiAJCXRwLT5yeF9vcHQubXNzX2NsYW1wID0gdHAtPnJ4X29wdC51c2VyX21zczsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9wcm9iZS5jIGIvbmV0L2lwdjQvdGNwX3Byb2JlLmMKaW5kZXggNGJlMzM2Zi4uZjIzMGVlZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3Byb2JlLmMKKysrIGIvbmV0L2lwdjQvdGNwX3Byb2JlLmMKQEAgLTE1Niw2ICsxNTYsOCBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRjcHcud2FpdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnRjcHcubG9jayk7CiAJdGNwdy5maWZvID0ga2ZpZm9fYWxsb2MoYnVmc2l6ZSwgR0ZQX0tFUk5FTCwgJnRjcHcubG9jayk7CisJaWYgKElTX0VSUih0Y3B3LmZpZm8pKQorCQlyZXR1cm4gUFRSX0VSUih0Y3B3LmZpZm8pOwogCiAJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZShwcm9jbmFtZSwgU19JUlVTUiwgJnRjcHByb2JlX2ZvcHMpKQogCQlnb3RvIGVycjA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCmluZGV4IGZiMDlhZGUuLjMzNTVjMjc2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfdGltZXIuYworKysgYi9uZXQvaXB2NC90Y3BfdGltZXIuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKIAkJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJUQ1A6IFRyZWFzb24gdW5jbG9ha2VkISBQZWVyICV1LiV1LiV1LiV1OiV1LyV1IHNocmlua3Mgd2luZG93ICV1OiV1LiBSZXBhaXJlZC5cbiIsCi0JCQkgICAgICAgTklQUVVBRChpbmV0LT5kYWRkciksIGh0b25zKGluZXQtPmRwb3J0KSwKKwkJCSAgICAgICBOSVBRVUFEKGluZXQtPmRhZGRyKSwgbnRvaHMoaW5ldC0+ZHBvcnQpLAogCQkJICAgICAgIGluZXQtPm51bSwgdHAtPnNuZF91bmEsIHRwLT5zbmRfbnh0KTsKIAkJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdmVnYXMuYyBiL25ldC9pcHY0L3RjcF92ZWdhcy5jCmluZGV4IGEzYjdhYTAuLmRkYzRiY2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF92ZWdhcy5jCisrKyBiL25ldC9pcHY0L3RjcF92ZWdhcy5jCkBAIC00Miw4ICs0Miw4IEBACiAgKiB3aXRoIFZfUEFSQU1fU0hJRlQgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlIGJpbmFyeSBwb2ludC4KICAqLwogI2RlZmluZSBWX1BBUkFNX1NISUZUIDEKLXN0YXRpYyBpbnQgYWxwaGEgPSAxPDxWX1BBUkFNX1NISUZUOwotc3RhdGljIGludCBiZXRhICA9IDM8PFZfUEFSQU1fU0hJRlQ7CitzdGF0aWMgaW50IGFscGhhID0gMjw8Vl9QQVJBTV9TSElGVDsKK3N0YXRpYyBpbnQgYmV0YSAgPSA0PDxWX1BBUkFNX1NISUZUOwogc3RhdGljIGludCBnYW1tYSA9IDE8PFZfUEFSQU1fU0hJRlQ7CiAKIG1vZHVsZV9wYXJhbShhbHBoYSwgaW50LCAwNjQ0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcC5jIGIvbmV0L2lwdjQvdWRwLmMKaW5kZXggODY1ZDc1Mi4uMDM1OTE1ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwLmMKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTkyLDIyICs5MiwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPG5ldC9zbm1wLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3RjcF9zdGF0ZXMuaD4KLSNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPG5ldC91ZHAuaD4KICNpbmNsdWRlIDxuZXQvaWNtcC5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSAidWRwX2ltcGwuaCIKIAogLyoKICAqCVNubXAgTUlCIGZvciB0aGUgVURQIGxheWVyCkBAIC0xMjAsMjYgKzExNCwzMCBAQAogCiBzdGF0aWMgaW50IHVkcF9wb3J0X3JvdmVyOwogCi1zdGF0aWMgaW5saW5lIGludCB1ZHBfbHBvcnRfaW51c2UodTE2IG51bSkKK3N0YXRpYyBpbmxpbmUgaW50IF9fdWRwX2xpYl9scG9ydF9pbnVzZShfX3UxNiBudW0sIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10pCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCi0Jc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHBfaGFzaFtudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKQorCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwdGFibGVbbnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSkKIAkJaWYgKGluZXRfc2soc2spLT5udW0gPT0gbnVtKQogCQkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogIHVkcF9nZXRfcG9ydCAgLSAgY29tbW9uIHBvcnQgbG9va3VwIGZvciBJUHY0IGFuZCBJUHY2CisgKiAgX191ZHBfbGliX2dldF9wb3J0ICAtICBVRFAvLUxpdGUgcG9ydCBsb29rdXAgZm9yIElQdjQgYW5kIElQdjYKICAqCiAgKiAgQHNrOiAgICAgICAgICBzb2NrZXQgc3RydWN0IGluIHF1ZXN0aW9uCiAgKiAgQHNudW06ICAgICAgICBwb3J0IG51bWJlciB0byBsb29rIHVwCisgKiAgQHVkcHRhYmxlOiAgICBoYXNoIGxpc3QgdGFibGUsIG11c3QgYmUgb2YgVURQX0hUQUJMRV9TSVpFCisgKiAgQHBvcnRfcm92ZXI6ICBwb2ludGVyIHRvIHJlY29yZCBvZiBsYXN0IHVuYWxsb2NhdGVkIHBvcnQKICAqICBAc2FkZHJfY29tcDogIEFGLWRlcGVuZGVudCBjb21wYXJpc29uIG9mIGJvdW5kIGxvY2FsIElQIGFkZHJlc3NlcwogICovCi1pbnQgdWRwX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKLQkJIGludCAoKnNhZGRyX2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKnNrMSwgY29uc3Qgc3RydWN0IHNvY2sgKnNrMikpCitpbnQgX191ZHBfbGliX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKKwkJICAgICAgIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10sIGludCAqcG9ydF9yb3ZlciwKKwkJICAgICAgIGludCAoKnNhZGRyX2NvbXApKGNvbnN0IHN0cnVjdCBzb2NrICpzazEsCisJCQkJCSBjb25zdCBzdHJ1Y3Qgc29jayAqc2syICkgICAgKQogewogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpAQCAtMTUwLDE1ICsxNDgsMTUgQEAKIAlpZiAoc251bSA9PSAwKSB7CiAJCWludCBiZXN0X3NpemVfc29fZmFyLCBiZXN0LCByZXN1bHQsIGk7CiAKLQkJaWYgKHVkcF9wb3J0X3JvdmVyID4gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV0gfHwKLQkJICAgIHVkcF9wb3J0X3JvdmVyIDwgc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0pCi0JCQl1ZHBfcG9ydF9yb3ZlciA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdOworCQlpZiAoKnBvcnRfcm92ZXIgPiBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSB8fAorCQkgICAgKnBvcnRfcm92ZXIgPCBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXSkKKwkJCSpwb3J0X3JvdmVyID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF07CiAJCWJlc3Rfc2l6ZV9zb19mYXIgPSAzMjc2NzsKLQkJYmVzdCA9IHJlc3VsdCA9IHVkcF9wb3J0X3JvdmVyOworCQliZXN0ID0gcmVzdWx0ID0gKnBvcnRfcm92ZXI7CiAJCWZvciAoaSA9IDA7IGkgPCBVRFBfSFRBQkxFX1NJWkU7IGkrKywgcmVzdWx0KyspIHsKIAkJCWludCBzaXplOwogCi0JCQloZWFkID0gJnVkcF9oYXNoW3Jlc3VsdCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CisJCQloZWFkID0gJnVkcHRhYmxlW3Jlc3VsdCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CiAJCQlpZiAoaGxpc3RfZW1wdHkoaGVhZCkpIHsKIAkJCQlpZiAocmVzdWx0ID4gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV0pCiAJCQkJCXJlc3VsdCA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdICsKQEAgLTE3OSwxNSArMTc3LDE1IEBACiAJCQkJcmVzdWx0ID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0KIAkJCQkJKyAoKHJlc3VsdCAtIHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdKSAmCiAJCQkJCSAgIChVRFBfSFRBQkxFX1NJWkUgLSAxKSk7Ci0JCQlpZiAoIXVkcF9scG9ydF9pbnVzZShyZXN1bHQpKQorCQkJaWYgKCEgX191ZHBfbGliX2xwb3J0X2ludXNlKHJlc3VsdCwgdWRwdGFibGUpKQogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChpID49ICgxIDw8IDE2KSAvIFVEUF9IVEFCTEVfU0laRSkKIAkJCWdvdG8gZmFpbDsKIGdvdGl0OgotCQl1ZHBfcG9ydF9yb3ZlciA9IHNudW0gPSByZXN1bHQ7CisJCSpwb3J0X3JvdmVyID0gc251bSA9IHJlc3VsdDsKIAl9IGVsc2UgewotCQloZWFkID0gJnVkcF9oYXNoW3NudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldOworCQloZWFkID0gJnVkcHRhYmxlW3NudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldOwogCiAJCXNrX2Zvcl9lYWNoKHNrMiwgbm9kZSwgaGVhZCkKIAkJCWlmIChpbmV0X3NrKHNrMiktPm51bSA9PSBzbnVtICAgICAgICAgICAgICAgICAgICAgICAgJiYKQEAgLTE5NSwxMiArMTkzLDEyIEBACiAJCQkgICAgKCFzazItPnNrX3JldXNlICAgICAgICB8fCAhc2stPnNrX3JldXNlKSAgICAgICAgICYmCiAJCQkgICAgKCFzazItPnNrX2JvdW5kX2Rldl9pZiB8fCAhc2stPnNrX2JvdW5kX2Rldl9pZgogCQkJICAgICB8fCBzazItPnNrX2JvdW5kX2Rldl9pZiA9PSBzay0+c2tfYm91bmRfZGV2X2lmKSAmJgotCQkJICAgICgqc2FkZHJfY21wKShzaywgc2syKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKwkJCSAgICAoKnNhZGRyX2NvbXApKHNrLCBzazIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAJCQkJZ290byBmYWlsOwogCX0KIAlpbmV0X3NrKHNrKS0+bnVtID0gc251bTsKIAlpZiAoc2tfdW5oYXNoZWQoc2spKSB7Ci0JCWhlYWQgPSAmdWRwX2hhc2hbc251bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CisJCWhlYWQgPSAmdWRwdGFibGVbc251bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CiAJCXNrX2FkZF9ub2RlKHNrLCBoZWFkKTsKIAkJc29ja19wcm90X2luY191c2Uoc2stPnNrX3Byb3QpOwogCX0KQEAgLTIxMCw3ICsyMDgsMTMgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlwdjRfcmN2X3NhZGRyX2VxdWFsKGNvbnN0IHN0cnVjdCBzb2NrICpzazEsIGNvbnN0IHN0cnVjdCBzb2NrICpzazIpCitfX2lubGluZV9fIGludCB1ZHBfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtLAorCQkJaW50ICgqc2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKikpCit7CisJcmV0dXJuICBfX3VkcF9saWJfZ2V0X3BvcnQoc2ssIHNudW0sIHVkcF9oYXNoLCAmdWRwX3BvcnRfcm92ZXIsIHNjbXApOworfQorCitpbmxpbmUgaW50IGlwdjRfcmN2X3NhZGRyX2VxdWFsKGNvbnN0IHN0cnVjdCBzb2NrICpzazEsIGNvbnN0IHN0cnVjdCBzb2NrICpzazIpCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldDEgPSBpbmV0X3NrKHNrMSksICppbmV0MiA9IGluZXRfc2soc2syKTsKIApAQCAtMjI0LDM0ICsyMjgsMjAgQEAKIAlyZXR1cm4gdWRwX2dldF9wb3J0KHNrLCBzbnVtLCBpcHY0X3Jjdl9zYWRkcl9lcXVhbCk7CiB9CiAKLQotc3RhdGljIHZvaWQgdWRwX3Y0X2hhc2goc3RydWN0IHNvY2sgKnNrKQotewotCUJVRygpOwotfQotCi1zdGF0aWMgdm9pZCB1ZHBfdjRfdW5oYXNoKHN0cnVjdCBzb2NrICpzaykKLXsKLQl3cml0ZV9sb2NrX2JoKCZ1ZHBfaGFzaF9sb2NrKTsKLQlpZiAoc2tfZGVsX25vZGVfaW5pdChzaykpIHsKLQkJaW5ldF9zayhzayktPm51bSA9IDA7Ci0JCXNvY2tfcHJvdF9kZWNfdXNlKHNrLT5za19wcm90KTsKLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ1ZHBfaGFzaF9sb2NrKTsKLX0KLQogLyogVURQIGlzIG5lYXJseSBhbHdheXMgd2lsZGNhcmRzIG91dCB0aGUgd2F6b28sIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHRyeQogICogaGFyZGVyIHRoYW4gdGhpcy4gLURhdmVNCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29jayAqdWRwX3Y0X2xvb2t1cF9sb25nd2F5KF9fYmUzMiBzYWRkciwgX19iZTE2IHNwb3J0LAotCQkJCQkgIF9fYmUzMiBkYWRkciwgX19iZTE2IGRwb3J0LCBpbnQgZGlmKQorc3RhdGljIHN0cnVjdCBzb2NrICpfX3VkcDRfbGliX2xvb2t1cChfX2JlMzIgc2FkZHIsIF9fYmUxNiBzcG9ydCwKKwkJCQkgICAgICBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwKKwkJCQkgICAgICBpbnQgZGlmLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdKQogewogCXN0cnVjdCBzb2NrICpzaywgKnJlc3VsdCA9IE5VTEw7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJdW5zaWduZWQgc2hvcnQgaG51bSA9IG50b2hzKGRwb3J0KTsKIAlpbnQgYmFkbmVzcyA9IC0xOwogCi0Jc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHBfaGFzaFtobnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSkgeworCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7CisJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHB0YWJsZVtobnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSkgewogCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAKIAkJaWYgKGluZXQtPm51bSA9PSBobnVtICYmICFpcHY2X29ubHlfc29jayhzaykpIHsKQEAgLTI4NSwyMCArMjc1LDEwIEBACiAJCQl9CiAJCX0KIAl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gc3RydWN0IHNvY2sgKnVkcF92NF9sb29rdXAoX19iZTMyIHNhZGRyLCBfX2JlMTYgc3BvcnQsCi0JCQkJCSAgICAgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQsIGludCBkaWYpCi17Ci0Jc3RydWN0IHNvY2sgKnNrOwotCi0JcmVhZF9sb2NrKCZ1ZHBfaGFzaF9sb2NrKTsKLQlzayA9IHVkcF92NF9sb29rdXBfbG9uZ3dheShzYWRkciwgc3BvcnQsIGRhZGRyLCBkcG9ydCwgZGlmKTsKLQlpZiAoc2spCi0JCXNvY2tfaG9sZChzayk7CisJaWYgKHJlc3VsdCkKKwkJc29ja19ob2xkKHJlc3VsdCk7CiAJcmVhZF91bmxvY2soJnVkcF9oYXNoX2xvY2spOwotCXJldHVybiBzazsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICp1ZHBfdjRfbWNhc3RfbmV4dChzdHJ1Y3Qgc29jayAqc2ssCkBAIC0zNDAsNyArMzIwLDcgQEAKICAqIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIHBvcnQuCiAgKi8KIAotdm9pZCB1ZHBfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKQordm9pZCBfX3VkcDRfbGliX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbywgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0OwogCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciopc2tiLT5kYXRhOwpAQCAtMzUxLDcgKzMzMSw4IEBACiAJaW50IGhhcmRlcnI7CiAJaW50IGVycjsKIAotCXNrID0gdWRwX3Y0X2xvb2t1cChpcGgtPmRhZGRyLCB1aC0+ZGVzdCwgaXBoLT5zYWRkciwgdWgtPnNvdXJjZSwgc2tiLT5kZXYtPmlmaW5kZXgpOworCXNrID0gX191ZHA0X2xpYl9sb29rdXAoaXBoLT5kYWRkciwgdWgtPmRlc3QsIGlwaC0+c2FkZHIsIHVoLT5zb3VyY2UsCisJCQkgICAgICAgc2tiLT5kZXYtPmlmaW5kZXgsIHVkcHRhYmxlCQkgICAgKTsKIAlpZiAoc2sgPT0gTlVMTCkgewogCQlJQ01QX0lOQ19TVEFUU19CSChJQ01QX01JQl9JTkVSUk9SUyk7CiAgICAgCSAgCXJldHVybjsJLyogTm8gc29ja2V0IGZvciBlcnJvciAqLwpAQCAtNDA1LDYgKzM4NiwxMSBAQAogCXNvY2tfcHV0KHNrKTsKIH0KIAorX19pbmxpbmVfXyB2b2lkIHVkcF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8pCit7CisJcmV0dXJuIF9fdWRwNF9saWJfZXJyKHNrYiwgaW5mbywgdWRwX2hhc2gpOworfQorCiAvKgogICogVGhyb3cgYXdheSBhbGwgcGVuZGluZyBkYXRhIGFuZCBjYW5jZWwgdGhlIGNvcmtpbmcuIFNvY2tldCBpcyBsb2NrZWQuCiAgKi8KQEAgLTQxOSwxNiArNDA1LDU4IEBACiAJfQogfQogCisvKioKKyAqIAl1ZHA0X2h3Y3N1bV9vdXRnb2luZyAgLSAgaGFuZGxlIG91dGdvaW5nIEhXIGNoZWNrc3VtbWluZworICogCUBzazogCXNvY2tldCB3ZSBhcmUgc2VuZGluZyBvbgorICogCUBza2I6IAlza19idWZmIGNvbnRhaW5pbmcgdGhlIGZpbGxlZC1pbiBVRFAgaGVhZGVyCisgKiAJICAgICAgICAoY2hlY2tzdW0gZmllbGQgbXVzdCBiZSB6ZXJvZWQgb3V0KQorICovCitzdGF0aWMgdm9pZCB1ZHA0X2h3Y3N1bV9vdXRnb2luZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIF9fYmUzMiBzcmMsIF9fYmUzMiBkc3QsIGludCBsZW4gICAgICApCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlzdHJ1Y3QgdWRwaGRyICp1aCA9IHNrYi0+aC51aDsKKwlfX3dzdW0gY3N1bSA9IDA7CisKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2stPnNrX3dyaXRlX3F1ZXVlKSA9PSAxKSB7CisJCS8qCisJCSAqIE9ubHkgb25lIGZyYWdtZW50IG9uIHRoZSBzb2NrZXQuCisJCSAqLworCQlza2ItPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHVkcGhkciwgY2hlY2spOworCQl1aC0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoc3JjLCBkc3QsIGxlbiwgSVBQUk9UT19VRFAsIDApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEhXLWNoZWNrc3VtIHdvbid0IHdvcmsgYXMgdGhlcmUgYXJlIHR3byBvciBtb3JlCisJCSAqIGZyYWdtZW50cyBvbiB0aGUgc29ja2V0IHNvIHRoYXQgYWxsIGNzdW1zIG9mIHNrX2J1ZmZzCisJCSAqIHNob3VsZCBiZSB0b2dldGhlcgorCQkgKi8KKwkJb2Zmc2V0ID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCk7CisKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYikgeworCQkJY3N1bSA9IGNzdW1fYWRkKGNzdW0sIHNrYi0+Y3N1bSk7CisJCX0KKworCQl1aC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhzcmMsIGRzdCwgbGVuLCBJUFBST1RPX1VEUCwgY3N1bSk7CisJCWlmICh1aC0+Y2hlY2sgPT0gMCkKKwkJCXVoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCX0KK30KKwogLyoKICAqIFB1c2ggb3V0IGFsbCBwZW5kaW5nIGRhdGEgYXMgb25lIFVEUCBkYXRhZ3JhbS4gU29ja2V0IGlzIGxvY2tlZC4KICAqLwotc3RhdGljIGludCB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB1ZHBfc29jayAqdXApCitzdGF0aWMgaW50IHVkcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdWRwX3NvY2sgICp1cCA9IHVkcF9zayhzayk7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBmbG93aSAqZmwgPSAmaW5ldC0+Y29yay5mbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB1ZHBoZHIgKnVoOwogCWludCBlcnIgPSAwOworCV9fd3N1bSBjc3VtID0gMDsKIAogCS8qIEdyYWIgdGhlIHNrYnVmZiB3aGVyZSBVRFAgaGVhZGVyIHNwYWNlIGV4aXN0cy4gKi8KIAlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSA9PSBOVUxMKQpAQCAtNDQzLDUyICs0NzEsMjggQEAKIAl1aC0+bGVuID0gaHRvbnModXAtPmxlbik7CiAJdWgtPmNoZWNrID0gMDsKIAotCWlmIChzay0+c2tfbm9fY2hlY2sgPT0gVURQX0NTVU1fTk9YTUlUKSB7CisJaWYgKHVwLT5wY2ZsYWcpICAJCQkJIC8qICAgICBVRFAtTGl0ZSAgICAgICovCisJCWNzdW0gID0gdWRwbGl0ZV9jc3VtX291dGdvaW5nKHNrLCBza2IpOworCisJZWxzZSBpZiAoc2stPnNrX25vX2NoZWNrID09IFVEUF9DU1VNX05PWE1JVCkgeyAgIC8qIFVEUCBjc3VtIGRpc2FibGVkICovCisKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCQlnb3RvIHNlbmQ7Ci0JfQogCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za193cml0ZV9xdWV1ZSkgPT0gMSkgewotCQkvKgotCQkgKiBPbmx5IG9uZSBmcmFnbWVudCBvbiB0aGUgc29ja2V0LgotCQkgKi8KLQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJCXNrYi0+Y3N1bSA9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKLQkJCXVoLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhmbC0+Zmw0X3NyYywgZmwtPmZsNF9kc3QsCi0JCQkJCXVwLT5sZW4sIElQUFJPVE9fVURQLCAwKTsKLQkJfSBlbHNlIHsKLQkJCXNrYi0+Y3N1bSA9IGNzdW1fcGFydGlhbCgoY2hhciAqKXVoLAotCQkJCQlzaXplb2Yoc3RydWN0IHVkcGhkciksIHNrYi0+Y3N1bSk7Ci0JCQl1aC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhmbC0+Zmw0X3NyYywgZmwtPmZsNF9kc3QsCi0JCQkJCXVwLT5sZW4sIElQUFJPVE9fVURQLCBza2ItPmNzdW0pOwotCQkJaWYgKHVoLT5jaGVjayA9PSAwKQotCQkJCXVoLT5jaGVjayA9IC0xOwotCQl9Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgaW50IGNzdW0gPSAwOwotCQkvKgotCQkgKiBIVy1jaGVja3N1bSB3b24ndCB3b3JrIGFzIHRoZXJlIGFyZSB0d28gb3IgbW9yZSAKLQkJICogZnJhZ21lbnRzIG9uIHRoZSBzb2NrZXQgc28gdGhhdCBhbGwgY3N1bXMgb2Ygc2tfYnVmZnMKLQkJICogc2hvdWxkIGJlIHRvZ2V0aGVyLgotCQkgKi8KLQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJCWludCBvZmZzZXQgPSAodW5zaWduZWQgY2hhciAqKXVoIC0gc2tiLT5kYXRhOwotCQkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCk7CisJfSBlbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7IC8qIFVEUCBoYXJkd2FyZSBjc3VtICovCiAKLQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQkJfSBlbHNlIHsKLQkJCXNrYi0+Y3N1bSA9IGNzdW1fcGFydGlhbCgoY2hhciAqKXVoLAotCQkJCQlzaXplb2Yoc3RydWN0IHVkcGhkciksIHNrYi0+Y3N1bSk7Ci0JCX0KKwkJdWRwNF9od2NzdW1fb3V0Z29pbmcoc2ssIHNrYiwgZmwtPmZsNF9zcmMsZmwtPmZsNF9kc3QsIHVwLT5sZW4pOworCQlnb3RvIHNlbmQ7CiAKLQkJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7Ci0JCQljc3VtID0gY3N1bV9hZGQoY3N1bSwgc2tiLT5jc3VtKTsKLQkJfQotCQl1aC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhmbC0+Zmw0X3NyYywgZmwtPmZsNF9kc3QsCi0JCQkJdXAtPmxlbiwgSVBQUk9UT19VRFAsIGNzdW0pOwotCQlpZiAodWgtPmNoZWNrID09IDApCi0JCQl1aC0+Y2hlY2sgPSAtMTsKLQl9CisJfSBlbHNlCQkJCQkJIC8qICAgYG5vcm1hbCcgVURQICAgICovCisJCWNzdW0gPSB1ZHBfY3N1bV9vdXRnb2luZyhzaywgc2tiKTsKKworCS8qIGFkZCBwcm90b2NvbC1kZXBlbmRlbnQgcHNldWRvLWhlYWRlciAqLworCXVoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGZsLT5mbDRfc3JjLCBmbC0+Zmw0X2RzdCwgdXAtPmxlbiwKKwkJCQkgICAgICBzay0+c2tfcHJvdG9jb2wsIGNzdW0gICAgICAgICAgICAgKTsKKwlpZiAodWgtPmNoZWNrID09IDApCisJCXVoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCiBzZW5kOgogCWVyciA9IGlwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOwogb3V0OgpAQCAtNDk3LDEyICs1MDEsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHVkcF9jaGVjayhzdHJ1Y3QgdWRwaGRyICp1aCwgaW50IGxlbiwgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsIHVuc2lnbmVkIGxvbmcgYmFzZSkKLXsKLQlyZXR1cm4oY3N1bV90Y3B1ZHBfbWFnaWMoc2FkZHIsIGRhZGRyLCBsZW4sIElQUFJPVE9fVURQLCBiYXNlKSk7Ci19Ci0KIGludCB1ZHBfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAogCQlzaXplX3QgbGVuKQogewpAQCAtNTE2LDggKzUxNCw5IEBACiAJX19iZTMyIGRhZGRyLCBmYWRkciwgc2FkZHI7CiAJX19iZTE2IGRwb3J0OwogCXU4ICB0b3M7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBpc191ZHBsaXRlID0gdXAtPnBjZmxhZzsKIAlpbnQgY29ya3JlcSA9IHVwLT5jb3JrZmxhZyB8fCBtc2ctPm1zZ19mbGFncyZNU0dfTU9SRTsKKwlpbnQgKCpnZXRmcmFnKSh2b2lkICosIGNoYXIgKiwgaW50LCBpbnQsIGludCwgc3RydWN0IHNrX2J1ZmYgKik7CiAKIAlpZiAobGVuID4gMHhGRkZGKQogCQlyZXR1cm4gLUVNU0dTSVpFOwpAQCAtNjIyLDcgKzYyMSw3IEBACiAJCQkJCSAgICAgIHsgLmRhZGRyID0gZmFkZHIsCiAJCQkJCQkuc2FkZHIgPSBzYWRkciwKIAkJCQkJCS50b3MgPSB0b3MgfSB9LAotCQkJCSAgICAucHJvdG8gPSBJUFBST1RPX1VEUCwKKwkJCQkgICAgLnByb3RvID0gc2stPnNrX3Byb3RvY29sLAogCQkJCSAgICAudWxpX3UgPSB7IC5wb3J0cyA9CiAJCQkJCSAgICAgICB7IC5zcG9ydCA9IGluZXQtPnNwb3J0LAogCQkJCQkJIC5kcG9ydCA9IGRwb3J0IH0gfSB9OwpAQCAtNjY4LDEzICs2NjcsMTQgQEAKIAogZG9fYXBwZW5kX2RhdGE6CiAJdXAtPmxlbiArPSB1bGVuOwotCWVyciA9IGlwX2FwcGVuZF9kYXRhKHNrLCBpcF9nZW5lcmljX2dldGZyYWcsIG1zZy0+bXNnX2lvdiwgdWxlbiwgCi0JCQlzaXplb2Yoc3RydWN0IHVkcGhkciksICZpcGMsIHJ0LCAKKwlnZXRmcmFnICA9ICBpc191ZHBsaXRlID8gIHVkcGxpdGVfZ2V0ZnJhZyA6IGlwX2dlbmVyaWNfZ2V0ZnJhZzsKKwllcnIgPSBpcF9hcHBlbmRfZGF0YShzaywgZ2V0ZnJhZywgbXNnLT5tc2dfaW92LCB1bGVuLAorCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCAmaXBjLCBydCwKIAkJCWNvcmtyZXEgPyBtc2ctPm1zZ19mbGFnc3xNU0dfTU9SRSA6IG1zZy0+bXNnX2ZsYWdzKTsKIAlpZiAoZXJyKQogCQl1ZHBfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOwogCWVsc2UgaWYgKCFjb3JrcmVxKQotCQllcnIgPSB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdXApOworCQllcnIgPSB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJZWxzZSBpZiAodW5saWtlbHkoc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfd3JpdGVfcXVldWUpKSkKIAkJdXAtPnBlbmRpbmcgPSAwOwogCXJlbGVhc2Vfc29jayhzayk7CkBAIC02ODQsNyArNjg0LDcgQEAKIAlpZiAoZnJlZSkKIAkJa2ZyZWUoaXBjLm9wdCk7CiAJaWYgKCFlcnIpIHsKLQkJVURQX0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfT1VUREFUQUdSQU1TKTsKKwkJVURQX0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfT1VUREFUQUdSQU1TLCBpc191ZHBsaXRlKTsKIAkJcmV0dXJuIGxlbjsKIAl9CiAJLyoKQEAgLTY5NSw3ICs2OTUsNyBAQAogCSAqIHNlZW1zIGxpa2Ugb3ZlcmtpbGwuCiAJICovCiAJaWYgKGVyciA9PSAtRU5PQlVGUyB8fCB0ZXN0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncykpIHsKLQkJVURQX0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfU05EQlVGRVJST1JTKTsKKwkJVURQX0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfU05EQlVGRVJST1JTLCBpc191ZHBsaXRlKTsKIAl9CiAJcmV0dXJuIGVycjsKIApAQCAtNzA3LDggKzcwNyw4IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBpbnQgdWRwX3NlbmRwYWdlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvZmZzZXQsCi0JCQlzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoraW50IHVkcF9zZW5kcGFnZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LAorCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKIAlpbnQgcmV0OwpAQCAtNzQ3LDcgKzc0Nyw3IEBACiAKIAl1cC0+bGVuICs9IHNpemU7CiAJaWYgKCEodXAtPmNvcmtmbGFnIHx8IChmbGFncyZNU0dfTU9SRSkpKQotCQlyZXQgPSB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdXApOworCQlyZXQgPSB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IHNpemU7CiBvdXQ6CkBAIC03OTUsMjkgKzc5NSwxOCBAQAogCXJldHVybigwKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IF9fdWRwX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCB1ZHBfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKLQkJX191ZHBfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKLX0KLQogLyoKICAqIAlUaGlzIHNob3VsZCBiZSBlYXN5LCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUgd2UKICAqIAlyZXR1cm4gaXQsIG90aGVyd2lzZSB3ZSBibG9jay4KICAqLwogCi1zdGF0aWMgaW50IHVkcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCSAgICAgICBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQoraW50IHVkcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJICAgICAgICBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKICAgCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZy0+bXNnX25hbWU7CiAgIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotICAJaW50IGNvcGllZCwgZXJyOworCWludCBjb3BpZWQsIGVyciwgY29weV9vbmx5LCBpc191ZHBsaXRlID0gSVNfVURQTElURShzayk7CiAKIAkvKgogCSAqCUNoZWNrIGFueSBwYXNzZWQgYWRkcmVzc2VzCkBAIC04MzksMTUgKzgyOCwyNSBAQAogCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CiAJfQogCi0JaWYgKHNrYi0+aXBfc3VtbWVkPT1DSEVDS1NVTV9VTk5FQ0VTU0FSWSkgewotCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgbXNnLT5tc2dfaW92LAotCQkJCQkgICAgICBjb3BpZWQpOwotCX0gZWxzZSBpZiAobXNnLT5tc2dfZmxhZ3MmTVNHX1RSVU5DKSB7Ci0JCWlmIChfX3VkcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCS8qCisJICogCURlY2lkZSB3aGV0aGVyIHRvIGNoZWNrc3VtIGFuZC9vciBjb3B5IGRhdGEuCisJICoKKwkgKiAJVURQOiAgICAgIGNoZWNrc3VtIG1heSBoYXZlIGJlZW4gY29tcHV0ZWQgaW4gSFcsCisJICogCSAgICAgICAgICAocmUtKWNvbXB1dGUgaXQgaWYgbWVzc2FnZSBpcyB0cnVuY2F0ZWQuCisJICogCVVEUC1MaXRlOiBhbHdheXMgbmVlZHMgdG8gY2hlY2tzdW0sIG5vIEhXIHN1cHBvcnQuCisJICovCisJY29weV9vbmx5ID0gKHNrYi0+aXBfc3VtbWVkPT1DSEVDS1NVTV9VTk5FQ0VTU0FSWSk7CisKKwlpZiAoaXNfdWRwbGl0ZSAgfHwgICghY29weV9vbmx5ICAmJiAgbXNnLT5tc2dfZmxhZ3MmTVNHX1RSVU5DKSkgeworCQlpZiAoX191ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCiAJCQlnb3RvIGNzdW1fY29weV9lcnI7Ci0JCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBtc2ctPm1zZ19pb3YsCi0JCQkJCSAgICAgIGNvcGllZCk7Ci0JfSBlbHNlIHsKKwkJY29weV9vbmx5ID0gMTsKKwl9CisKKwlpZiAoY29weV9vbmx5KQorCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKKwkJCQkJICAgICAgbXNnLT5tc2dfaW92LCBjb3BpZWQgICAgICAgKTsKKwllbHNlIHsKIAkJZXJyID0gc2tiX2NvcHlfYW5kX2NzdW1fZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksIG1zZy0+bXNnX2lvdik7CiAKIAkJaWYgKGVyciA9PSAtRUlOVkFMKQpAQCAtODgwLDcgKzg3OSw3IEBACiAgIAlyZXR1cm4gZXJyOwogCiBjc3VtX2NvcHlfZXJyOgotCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUyk7CisJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTLCBpc191ZHBsaXRlKTsKIAogCXNrYl9raWxsX2RhdGFncmFtKHNrLCBza2IsIGZsYWdzKTsKIApAQCAtOTEyLDExICs5MTEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB1ZHBfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCi17Ci0Jc2tfY29tbW9uX3JlbGVhc2Uoc2spOwotfQotCiAvKiByZXR1cm46CiAgKiAJMSAgaWYgdGhlIHRoZSBVRFAgc3lzdGVtIHNob3VsZCBwcm9jZXNzIGl0CiAgKgkwICBpZiB3ZSBzaG91bGQgZHJvcCB0aGlzIHBhY2tldApAQCAtOTI4LDIzICs5MjIsMzIgQEAKIAlyZXR1cm4gMTsgCiAjZWxzZQogCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOwotICAJc3RydWN0IHVkcGhkciAqdWggPSBza2ItPmgudWg7CisgIAlzdHJ1Y3QgdWRwaGRyICp1aDsKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAlpbnQgaXBobGVuLCBsZW47CiAgIAotCV9fdTggKnVkcGRhdGEgPSAoX191OCAqKXVoICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCV9fYmUzMiAqdWRwZGF0YTMyID0gKF9fYmUzMiAqKXVkcGRhdGE7CisJX191OCAqdWRwZGF0YTsKKwlfX2JlMzIgKnVkcGRhdGEzMjsKIAlfX3UxNiBlbmNhcF90eXBlID0gdXAtPmVuY2FwX3R5cGU7CiAKIAkvKiBpZiB3ZSdyZSBvdmVybHkgc2hvcnQsIGxldCBVRFAgaGFuZGxlIGl0ICovCi0JaWYgKHVkcGRhdGEgPiBza2ItPnRhaWwpCisJbGVuID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJaWYgKGxlbiA8PSAwKQogCQlyZXR1cm4gMTsKIAogCS8qIGlmIHRoaXMgaXMgbm90IGVuY2Fwc3VsYXRlZCBzb2NrZXQsIHRoZW4ganVzdCByZXR1cm4gbm93ICovCiAJaWYgKCFlbmNhcF90eXBlKQogCQlyZXR1cm4gMTsKIAotCWxlbiA9IHNrYi0+dGFpbCAtIHVkcGRhdGE7CisJLyogSWYgdGhpcyBpcyBhIHBhZ2VkIHNrYiwgbWFrZSBzdXJlIHdlIHB1bGwgdXAKKwkgKiB3aGF0ZXZlciBkYXRhIHdlIG5lZWQgdG8gbG9vayBhdC4gKi8KKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBtaW4obGVuLCA4KSkpCisJCXJldHVybiAxOworCisJLyogTm93IHdlIGNhbiBnZXQgdGhlIHBvaW50ZXJzICovCisJdWggPSBza2ItPmgudWg7CisJdWRwZGF0YSA9IChfX3U4ICopdWggKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJdWRwZGF0YTMyID0gKF9fYmUzMiAqKXVkcGRhdGE7CiAKIAlzd2l0Y2ggKGVuY2FwX3R5cGUpIHsKIAlkZWZhdWx0OgpAQCAtMTAxMyw3ICsxMDE2LDcgQEAKICAqIE5vdGUgdGhhdCBpbiB0aGUgc3VjY2VzcyBhbmQgZXJyb3IgY2FzZXMsIHRoZSBza2IgaXMgYXNzdW1lZCB0bwogICogaGF2ZSBlaXRoZXIgYmVlbiByZXF1ZXVlZCBvciBmcmVlZC4KICAqLwotc3RhdGljIGludCB1ZHBfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqIHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IHVkcF9xdWV1ZV9yY3Zfc2tiKHN0cnVjdCBzb2NrICogc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CiAJaW50IHJjOwpAQCAtMTAyMSwxMCArMTAyNCw4IEBACiAJLyoKIAkgKglDaGFyZ2UgaXQgdG8gdGhlIHNvY2tldCwgZHJvcHBpbmcgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwuCiAJICovCi0JaWYgKCF4ZnJtNF9wb2xpY3lfY2hlY2soc2ssIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gLTE7Ci0JfQorCWlmICgheGZybTRfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKKwkJZ290byBkcm9wOwogCW5mX3Jlc2V0KHNrYik7CiAKIAlpZiAodXAtPmVuY2FwX3R5cGUpIHsKQEAgLTEwNDgsMzEgKzEwNDksNjggQEAKIAkJaWYgKHJldCA8IDApIHsKIAkJCS8qIHByb2Nlc3MgdGhlIEVTUCBwYWNrZXQgKi8KIAkJCXJldCA9IHhmcm00X3Jjdl9lbmNhcChza2IsIHVwLT5lbmNhcF90eXBlKTsKLQkJCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkRBVEFHUkFNUyk7CisJCQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5EQVRBR1JBTVMsIHVwLT5wY2ZsYWcpOwogCQkJcmV0dXJuIC1yZXQ7CiAJCX0KIAkJLyogRkFMTFRIUk9VR0ggLS0gaXQncyBhIFVEUCBQYWNrZXQgKi8KIAl9CiAKLQlpZiAoc2stPnNrX2ZpbHRlciAmJiBza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkgewotCQlpZiAoX191ZHBfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewotCQkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTKTsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuIC0xOworCS8qCisJICogCVVEUC1MaXRlIHNwZWNpZmljIHRlc3RzLCBpZ25vcmVkIG9uIFVEUCBzb2NrZXRzCisJICovCisJaWYgKCh1cC0+cGNmbGFnICYgVURQTElURV9SRUNWX0NDKSAgJiYgIFVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YpIHsKKworCQkvKgorCQkgKiBNSUIgc3RhdGlzdGljcyBvdGhlciB0aGFuIGluY3JlbWVudGluZyB0aGUgZXJyb3IgY291bnQgYXJlCisJCSAqIGRpc2FibGVkIGZvciB0aGUgZm9sbG93aW5nIHR3byB0eXBlcyBvZiBlcnJvcnM6IHRoZXNlIGRlcGVuZAorCQkgKiBvbiB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MsIG5vdCBvbiB0aGUgZnVuY3Rpb25pbmcgb2YgdGhlCisJCSAqIHByb3RvY29sIHN0YWNrIGFzIHN1Y2guCisJCSAqCisJCSAqIFJGQyAzODI4IGhlcmUgcmVjb21tZW5kcyAoc2VjIDMuMyk6ICJUaGVyZSBzaG91bGQgYWxzbyBiZSBhCisJCSAqIHdheSAuLi4gdG8gLi4uIGF0IGxlYXN0IGxldCB0aGUgcmVjZWl2aW5nIGFwcGxpY2F0aW9uIGJsb2NrCisJCSAqIGRlbGl2ZXJ5IG9mIHBhY2tldHMgd2l0aCBjb3ZlcmFnZSB2YWx1ZXMgbGVzcyB0aGFuIGEgdmFsdWUKKwkJICogcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiIKKwkJICovCisJCWlmICh1cC0+cGNybGVuID09IDApIHsgICAgICAgICAgLyogZnVsbCBjb3ZlcmFnZSB3YXMgc2V0ICAqLworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICJVRFBMSVRFOiBwYXJ0aWFsIGNvdmVyYWdlICIKKwkJCQkiJWQgd2hpbGUgZnVsbCBjb3ZlcmFnZSAlZCByZXF1ZXN0ZWRcbiIsCisJCQkJVURQX1NLQl9DQihza2IpLT5jc2Nvdiwgc2tiLT5sZW4pOworCQkJZ290byBkcm9wOwogCQl9CisJCS8qIFRoZSBuZXh0IGNhc2UgaW52b2x2ZXMgdmlvbGF0aW5nIHRoZSBtaW4uIGNvdmVyYWdlIHJlcXVlc3RlZAorCQkgKiBieSB0aGUgcmVjZWl2ZXIuIFRoaXMgaXMgc3VidGxlOiBpZiByZWNlaXZlciB3YW50cyB4IGFuZCB4IGlzCisJCSAqIGdyZWF0ZXIgdGhhbiB0aGUgYnVmZmVyc2l6ZS9NVFUgdGhlbiByZWNlaXZlciB3aWxsIGNvbXBsYWluCisJCSAqIHRoYXQgaXQgd2FudHMgeCB3aGlsZSBzZW5kZXIgZW1pdHMgcGFja2V0cyBvZiBzbWFsbGVyIHNpemUgeS4KKwkJICogVGhlcmVmb3JlIHRoZSBhYm92ZSAuLi4oKS0+cGFydGlhbF9jb3Ygc3RhdGVtZW50IGlzIGVzc2VudGlhbC4KKwkJICovCisJCWlmIChVRFBfU0tCX0NCKHNrYiktPmNzY292ICA8ICB1cC0+cGNybGVuKSB7CisJCQlMSU1JVF9ORVRERUJVRyhLRVJOX1dBUk5JTkcKKwkJCQkiVURQTElURTogY292ZXJhZ2UgJWQgdG9vIHNtYWxsLCBuZWVkIG1pbiAlZFxuIiwKKwkJCQlVRFBfU0tCX0NCKHNrYiktPmNzY292LCB1cC0+cGNybGVuKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCX0KKworCWlmIChzay0+c2tfZmlsdGVyICYmIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKSB7CisJCWlmIChfX3VkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwkJCWdvdG8gZHJvcDsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAl9CiAKIAlpZiAoKHJjID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLHNrYikpIDwgMCkgewogCQkvKiBOb3RlIHRoYXQgYW4gRU5PTUVNIGVycm9yIGlzIGNoYXJnZWQgdHdpY2UgKi8KIAkJaWYgKHJjID09IC1FTk9NRU0pCi0JCQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfUkNWQlVGRVJST1JTKTsKLQkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTKTsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAtMTsKKwkJCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9SQ1ZCVUZFUlJPUlMsIHVwLT5wY2ZsYWcpOworCQlnb3RvIGRyb3A7CiAJfQotCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkRBVEFHUkFNUyk7CisKKwlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5EQVRBR1JBTVMsIHVwLT5wY2ZsYWcpOwogCXJldHVybiAwOworCitkcm9wOgorCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgdXAtPnBjZmxhZyk7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIC0xOwogfQogCiAvKgpAQCAtMTA4MSwxNCArMTExOSwxNiBAQAogICoJTm90ZTogY2FsbGVkIG9ubHkgZnJvbSB0aGUgQkggaGFuZGxlciBjb250ZXh0LAogICoJc28gd2UgZG9uJ3QgbmVlZCB0byBsb2NrIHRoZSBoYXNoZXMuCiAgKi8KLXN0YXRpYyBpbnQgdWRwX3Y0X21jYXN0X2RlbGl2ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgsCi0JCQkJIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyKQorc3RhdGljIGludCBfX3VkcDRfbGliX21jYXN0X2RlbGl2ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgc3RydWN0IHVkcGhkciAgKnVoLAorCQkJCSAgICBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkgICAgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJaW50IGRpZjsKIAogCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7Ci0Jc2sgPSBza19oZWFkKCZ1ZHBfaGFzaFtudG9ocyh1aC0+ZGVzdCkgJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKTsKKwlzayA9IHNrX2hlYWQoJnVkcHRhYmxlW250b2hzKHVoLT5kZXN0KSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pOwogCWRpZiA9IHNrYi0+ZGV2LT5pZmluZGV4OwogCXNrID0gdWRwX3Y0X21jYXN0X25leHQoc2ssIHVoLT5kZXN0LCBkYWRkciwgdWgtPnNvdXJjZSwgc2FkZHIsIGRpZik7CiAJaWYgKHNrKSB7CkBAIC0xMTIyLDY1ICsxMTYyLDc1IEBACiAgKiBPdGhlcndpc2UsIGNzdW0gY29tcGxldGlvbiByZXF1aXJlcyBjaGFja3N1bW1pbmcgcGFja2V0IGJvZHksCiAgKiBpbmNsdWRpbmcgdWRwIGhlYWRlciBhbmQgZm9sZGluZyBpdCB0byBza2ItPmNzdW0uCiAgKi8KLXN0YXRpYyB2b2lkIHVkcF9jaGVja3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoLAotCQkJICAgICB1bnNpZ25lZCBzaG9ydCB1bGVuLCBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZHA0X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCkKIHsKIAlpZiAodWgtPmNoZWNrID09IDApIHsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSB7Ci0JCWlmICghdWRwX2NoZWNrKHVoLCB1bGVuLCBzYWRkciwgZGFkZHIsIHNrYi0+Y3N1bSkpCisJICAgICAgIGlmICghY3N1bV90Y3B1ZHBfbWFnaWMoc2tiLT5uaC5pcGgtPnNhZGRyLCBza2ItPm5oLmlwaC0+ZGFkZHIsCisJCQkJICAgICAgc2tiLT5sZW4sIElQUFJPVE9fVURQLCBza2ItPmNzdW0gICAgICAgKSkKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfQogCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKLQkJc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLCBkYWRkciwgdWxlbiwgSVBQUk9UT19VRFAsIDApOworCQlza2ItPmNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkJCQkgICAgICAgc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCQkgICAgICAgc2tiLT5sZW4sIElQUFJPVE9fVURQLCAwKTsKIAkvKiBQcm9iYWJseSwgd2Ugc2hvdWxkIGNoZWNrc3VtIHVkcCBoZWFkZXIgKGl0IHNob3VsZCBiZSBpbiBjYWNoZQogCSAqIGluIGFueSBjYXNlKSBhbmQgZGF0YSBpbiB0aW55IHBhY2tldHMgKDwgcnggY29weWJyZWFrKS4KIAkgKi8KKworCS8qIFVEUCA9IFVEUC1MaXRlIHdpdGggYSBub24tcGFydGlhbCBjaGVja3N1bSBjb3ZlcmFnZSAqLworCVVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YgPSAwOwogfQogCiAvKgogICoJQWxsIHdlIG5lZWQgdG8gZG8gaXMgZ2V0IHRoZSBzb2NrZXQsIGFuZCB0aGVuIGRvIGEgY2hlY2tzdW0uIAogICovCiAgCi1pbnQgdWRwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IF9fdWRwNF9saWJfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10sCisJCSAgIGludCBpc191ZHBsaXRlKQogewogICAJc3RydWN0IHNvY2sgKnNrOwotICAJc3RydWN0IHVkcGhkciAqdWg7CisgIAlzdHJ1Y3QgdWRwaGRyICp1aCA9IHNrYi0+aC51aDsKIAl1bnNpZ25lZCBzaG9ydCB1bGVuOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OwogCV9fYmUzMiBzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKIAlfX2JlMzIgZGFkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7Ci0JaW50IGxlbiA9IHNrYi0+bGVuOwogCiAJLyoKLQkgKglWYWxpZGF0ZSB0aGUgcGFja2V0IGFuZCB0aGUgVURQIGxlbmd0aC4KKwkgKiAgVmFsaWRhdGUgdGhlIHBhY2tldC4KIAkgKi8KIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpKQotCQlnb3RvIG5vX2hlYWRlcjsKLQotCXVoID0gc2tiLT5oLnVoOworCQlnb3RvIGRyb3A7CQkvKiBObyBzcGFjZSBmb3IgaGVhZGVyLiAqLwogCiAJdWxlbiA9IG50b2hzKHVoLT5sZW4pOwotCi0JaWYgKHVsZW4gPiBsZW4gfHwgdWxlbiA8IHNpemVvZigqdWgpKQorCWlmICh1bGVuID4gc2tiLT5sZW4pCiAJCWdvdG8gc2hvcnRfcGFja2V0OwogCi0JaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIHVsZW4pKQotCQlnb3RvIHNob3J0X3BhY2tldDsKKwlpZighIGlzX3VkcGxpdGUgKSB7CQkvKiBVRFAgdmFsaWRhdGVzIHVsZW4uICovCiAKLQl1ZHBfY2hlY2tzdW1faW5pdChza2IsIHVoLCB1bGVuLCBzYWRkciwgZGFkZHIpOworCQlpZiAodWxlbiA8IHNpemVvZigqdWgpIHx8IHBza2JfdHJpbV9yY3N1bShza2IsIHVsZW4pKQorCQkJZ290byBzaG9ydF9wYWNrZXQ7CisKKwkJdWRwNF9jc3VtX2luaXQoc2tiLCB1aCk7CisKKwl9IGVsc2UgCXsJCQkvKiBVRFAtTGl0ZSB2YWxpZGF0ZXMgY3Njb3YuICovCisJCWlmICh1ZHBsaXRlNF9jc3VtX2luaXQoc2tiLCB1aCkpCisJCQlnb3RvIGNzdW1fZXJyb3I7CisJfQogCiAJaWYocnQtPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUfFJUQ0ZfTVVMVElDQVNUKSkKLQkJcmV0dXJuIHVkcF92NF9tY2FzdF9kZWxpdmVyKHNrYiwgdWgsIHNhZGRyLCBkYWRkcik7CisJCXJldHVybiBfX3VkcDRfbGliX21jYXN0X2RlbGl2ZXIoc2tiLCB1aCwgc2FkZHIsIGRhZGRyLCB1ZHB0YWJsZSk7CiAKLQlzayA9IHVkcF92NF9sb29rdXAoc2FkZHIsIHVoLT5zb3VyY2UsIGRhZGRyLCB1aC0+ZGVzdCwgc2tiLT5kZXYtPmlmaW5kZXgpOworCXNrID0gX191ZHA0X2xpYl9sb29rdXAoc2FkZHIsIHVoLT5zb3VyY2UsIGRhZGRyLCB1aC0+ZGVzdCwKKwkJCSAgICAgICBza2ItPmRldi0+aWZpbmRleCwgdWRwdGFibGUgICAgICAgICk7CiAKIAlpZiAoc2sgIT0gTlVMTCkgewogCQlpbnQgcmV0ID0gdWRwX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJCXNvY2tfcHV0KHNrKTsKIAogCQkvKiBhIHJldHVybiB2YWx1ZSA+IDAgbWVhbnMgdG8gcmVzdWJtaXQgdGhlIGlucHV0LCBidXQKLQkJICogaXQgaXQgd2FudHMgdGhlIHJldHVybiB0byBiZSAtcHJvdG9jb2wsIG9yIDAKKwkJICogaXQgd2FudHMgdGhlIHJldHVybiB0byBiZSAtcHJvdG9jb2wsIG9yIDAKIAkJICovCiAJCWlmIChyZXQgPiAwKQogCQkJcmV0dXJuIC1yZXQ7CkBAIC0xMTkyLDEwICsxMjQyLDEwIEBACiAJbmZfcmVzZXQoc2tiKTsKIAogCS8qIE5vIHNvY2tldC4gRHJvcCBwYWNrZXQgc2lsZW50bHksIGlmIGNoZWNrc3VtIGlzIHdyb25nICovCi0JaWYgKHVkcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCiAJCWdvdG8gY3N1bV9lcnJvcjsKIAotCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTKTsKKwlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfTk9QT1JUUywgaXNfdWRwbGl0ZSk7CiAJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfUE9SVF9VTlJFQUNILCAwKTsKIAogCS8qCkBAIC0xMjA2LDM2ICsxMjU2LDQwIEBACiAJcmV0dXJuKDApOwogCiBzaG9ydF9wYWNrZXQ6Ci0JTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAiVURQOiBzaG9ydCBwYWNrZXQ6IEZyb20gJXUuJXUuJXUuJXU6JXUgJWQvJWQgdG8gJXUuJXUuJXUuJXU6JXVcbiIsCisJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAiVURQJXM6IHNob3J0IHBhY2tldDogRnJvbSAldS4ldS4ldS4ldToldSAlZC8lZCB0byAldS4ldS4ldS4ldToldVxuIiwKKwkJICAgICAgIGlzX3VkcGxpdGU/ICItTGl0ZSIgOiAiIiwKIAkJICAgICAgIE5JUFFVQUQoc2FkZHIpLAogCQkgICAgICAgbnRvaHModWgtPnNvdXJjZSksCiAJCSAgICAgICB1bGVuLAotCQkgICAgICAgbGVuLAorCQkgICAgICAgc2tiLT5sZW4sCiAJCSAgICAgICBOSVBRVUFEKGRhZGRyKSwKIAkJICAgICAgIG50b2hzKHVoLT5kZXN0KSk7Ci1ub19oZWFkZXI6Ci0JVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTKTsKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4oMCk7CisJZ290byBkcm9wOwogCiBjc3VtX2Vycm9yOgogCS8qIAogCSAqIFJGQzExMjI6IE9LLiAgRGlzY2FyZHMgdGhlIGJhZCBwYWNrZXQgc2lsZW50bHkgKGFzIGZhciBhcyAKIAkgKiB0aGUgbmV0d29yayBpcyBjb25jZXJuZWQsIGFueXdheSkgYXMgcGVyIDQuMS4zLjQgKE1VU1QpLiAKIAkgKi8KLQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJVRFA6IGJhZCBjaGVja3N1bS4gRnJvbSAlZC4lZC4lZC4lZDolZCB0byAlZC4lZC4lZC4lZDolZCB1bGVuICVkXG4iLAorCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIlVEUCVzOiBiYWQgY2hlY2tzdW0uIEZyb20gJWQuJWQuJWQuJWQ6JWQgdG8gJWQuJWQuJWQuJWQ6JWQgdWxlbiAlZFxuIiwKKwkJICAgICAgIGlzX3VkcGxpdGU/ICItTGl0ZSIgOiAiIiwKIAkJICAgICAgIE5JUFFVQUQoc2FkZHIpLAogCQkgICAgICAgbnRvaHModWgtPnNvdXJjZSksCiAJCSAgICAgICBOSVBRVUFEKGRhZGRyKSwKIAkJICAgICAgIG50b2hzKHVoLT5kZXN0KSwKIAkJICAgICAgIHVsZW4pOwogZHJvcDoKLQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMpOworCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgaXNfdWRwbGl0ZSk7CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuKDApOwogfQogCi1zdGF0aWMgaW50IHVkcF9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQorX19pbmxpbmVfXyBpbnQgdWRwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBfX3VkcDRfbGliX3Jjdihza2IsIHVkcF9oYXNoLCAwKTsKK30KKworaW50IHVkcF9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQogewogCWxvY2tfc29jayhzayk7CiAJdWRwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKQEAgLTEyNDYsOCArMTMwMCw5IEBACiAvKgogICoJU29ja2V0IG9wdGlvbiBjb2RlIGZvciBVRFAKICAqLwotc3RhdGljIGludCBkb191ZHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCitpbnQgdWRwX2xpYl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4sCisJCSAgICAgICBpbnQgKCpwdXNoX3BlbmRpbmdfZnJhbWVzKShzdHJ1Y3Qgc29jayAqKSkKIHsKIAlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKIAlpbnQgdmFsOwpAQCAtMTI2Niw3ICsxMzIxLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXVwLT5jb3JrZmxhZyA9IDA7CiAJCQlsb2NrX3NvY2soc2spOwotCQkJdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHVwKTsKKwkJCSgqcHVzaF9wZW5kaW5nX2ZyYW1lcykoc2spOwogCQkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJfQogCQlicmVhazsKQEAgLTEyODQsNiArMTMzOSwzMiBAQAogCQl9CiAJCWJyZWFrOwogCisJLyoKKwkgKiAJVURQLUxpdGUncyBwYXJ0aWFsIGNoZWNrc3VtIGNvdmVyYWdlIChSRkMgMzgyOCkuCisJICovCisJLyogVGhlIHNlbmRlciBzZXRzIGFjdHVhbCBjaGVja3N1bSBjb3ZlcmFnZSBsZW5ndGggdmlhIHRoaXMgb3B0aW9uLgorCSAqIFRoZSBjYXNlIGNvdmVyYWdlID4gcGFja2V0IGxlbmd0aCBpcyBoYW5kbGVkIGJ5IHNlbmQgbW9kdWxlLiAqLworCWNhc2UgVURQTElURV9TRU5EX0NTQ09WOgorCQlpZiAoIXVwLT5wY2ZsYWcpICAgICAgICAgLyogRGlzYWJsZSB0aGUgb3B0aW9uIG9uIFVEUCBzb2NrZXRzICovCisJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCQlpZiAodmFsICE9IDAgJiYgdmFsIDwgOCkgLyogSWxsZWdhbCBjb3ZlcmFnZTogdXNlIGRlZmF1bHQgKDgpICovCisJCQl2YWwgPSA4OworCQl1cC0+cGNzbGVuID0gdmFsOworCQl1cC0+cGNmbGFnIHw9IFVEUExJVEVfU0VORF9DQzsKKwkJYnJlYWs7CisKKyAgICAgICAgLyogVGhlIHJlY2VpdmVyIHNwZWNpZmllcyBhIG1pbmltdW0gY2hlY2tzdW0gY292ZXJhZ2UgdmFsdWUuIFRvIG1ha2UKKyAgICAgICAgICogc2Vuc2UsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBhdCBsZWFzdCA4IChhcyBkb25lIGJlbG93KS4gSWYgemVybyBpcworCSAqIHVzZWQsIHRoaXMgYWdhaW4gbWVhbnMgZnVsbCBjaGVja3N1bSBjb3ZlcmFnZS4gICAgICAgICAgICAgICAgICAgICAqLworCWNhc2UgVURQTElURV9SRUNWX0NTQ09WOgorCQlpZiAoIXVwLT5wY2ZsYWcpICAgICAgICAgLyogRGlzYWJsZSB0aGUgb3B0aW9uIG9uIFVEUCBzb2NrZXRzICovCisJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCQlpZiAodmFsICE9IDAgJiYgdmFsIDwgOCkgLyogQXZvaWQgc2lsbHkgbWluaW1hbCB2YWx1ZXMuICAgICAgICovCisJCQl2YWwgPSA4OworCQl1cC0+cGNybGVuID0gdmFsOworCQl1cC0+cGNmbGFnIHw9IFVEUExJVEVfUkVDVl9DQzsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQllcnIgPSAtRU5PUFJPVE9PUFQ7CiAJCWJyZWFrOwpAQCAtMTI5MiwyNiArMTM3MywyOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgdWRwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoraW50IHVkcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKIHsKLQlpZiAobGV2ZWwgIT0gU09MX1VEUCkKLQkJcmV0dXJuIGlwX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7Ci0JcmV0dXJuIGRvX3VkcF9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCisJCXJldHVybiB1ZHBfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKKwkJCQkJICB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyk7CisJcmV0dXJuIGlwX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdGF0aWMgaW50IGNvbXBhdF91ZHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkJIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCitpbnQgY29tcGF0X3VkcF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKIHsKLQlpZiAobGV2ZWwgIT0gU09MX1VEUCkKLQkJcmV0dXJuIGNvbXBhdF9pcF9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHBfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlpZiAobGV2ZWwgPT0gU09MX1VEUCAgfHwgIGxldmVsID09IFNPTF9VRFBMSVRFKQorCQlyZXR1cm4gdWRwX2xpYl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4sCisJCQkJCSAgdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMpOworCXJldHVybiBjb21wYXRfaXBfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGRvX3VkcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoraW50IHVkcF9saWJfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCiB7CiAJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CiAJaW50IHZhbCwgbGVuOwpAQCAtMTMzMyw2ICsxNDE2LDE2IEBACiAJCXZhbCA9IHVwLT5lbmNhcF90eXBlOwogCQlicmVhazsKIAorCS8qIFRoZSBmb2xsb3dpbmcgdHdvIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIFVEUCBzb2NrZXRzLCB0aGUgcmV0dXJuIGlzCisJICogYWx3YXlzIDAgKHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBmdWxsIGNoZWNrc3VtIGNvdmVyYWdlIG9mIFVEUCkuICovCisJY2FzZSBVRFBMSVRFX1NFTkRfQ1NDT1Y6CisJCXZhbCA9IHVwLT5wY3NsZW47CisJCWJyZWFrOworCisJY2FzZSBVRFBMSVRFX1JFQ1ZfQ1NDT1Y6CisJCXZhbCA9IHVwLT5wY3JsZW47CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9OwpAQCAtMTM0NCwyMSArMTQzNywyMSBAQAogICAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWRwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCitpbnQgdWRwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCiB7Ci0JaWYgKGxldmVsICE9IFNPTF9VRFApCi0JCXJldHVybiBpcF9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHBfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlpZiAobGV2ZWwgPT0gU09MX1VEUCAgfHwgIGxldmVsID09IFNPTF9VRFBMSVRFKQorCQlyZXR1cm4gdWRwX2xpYl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCXJldHVybiBpcF9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGludCBjb21wYXRfdWRwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAoraW50IGNvbXBhdF91ZHBfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkJIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKLQlpZiAobGV2ZWwgIT0gU09MX1VEUCkKLQkJcmV0dXJuIGNvbXBhdF9pcF9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHBfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlpZiAobGV2ZWwgPT0gU09MX1VEUCAgfHwgIGxldmVsID09IFNPTF9VRFBMSVRFKQorCQlyZXR1cm4gdWRwX2xpYl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCXJldHVybiBjb21wYXRfaXBfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KICNlbmRpZgogLyoqCkBAIC0xMzc4LDcgKzE0NzEsOCBAQAogewogCXVuc2lnbmVkIGludCBtYXNrID0gZGF0YWdyYW1fcG9sbChmaWxlLCBzb2NrLCB3YWl0KTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKLQkKKwlpbnQgCWlzX2xpdGUgPSBJU19VRFBMSVRFKHNrKTsKKwogCS8qIENoZWNrIGZvciBmYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIGNoZWNrc3VtIGVycm9ycyAqLwogCWlmICggKG1hc2sgJiBQT0xMUkROT1JNKSAmJgogCSAgICAgIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYKQEAgLTEzODgsOCArMTQ4Miw4IEBACiAKIAkJc3Bpbl9sb2NrX2JoKCZyY3ZxLT5sb2NrKTsKIAkJd2hpbGUgKChza2IgPSBza2JfcGVlayhyY3ZxKSkgIT0gTlVMTCkgewotCQkJaWYgKHVkcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKSB7Ci0JCQkJVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTKTsKKwkJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKKwkJCQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIGlzX2xpdGUpOwogCQkJCV9fc2tiX3VubGluayhza2IsIHJjdnEpOwogCQkJCWtmcmVlX3NrYihza2IpOwogCQkJfSBlbHNlIHsKQEAgLTE0MTEsNyArMTUwNSw3IEBACiBzdHJ1Y3QgcHJvdG8gdWRwX3Byb3QgPSB7CiAgCS5uYW1lCQkgICA9ICJVRFAiLAogCS5vd25lcgkJICAgPSBUSElTX01PRFVMRSwKLQkuY2xvc2UJCSAgID0gdWRwX2Nsb3NlLAorCS5jbG9zZQkJICAgPSB1ZHBfbGliX2Nsb3NlLAogCS5jb25uZWN0CSAgID0gaXA0X2RhdGFncmFtX2Nvbm5lY3QsCiAJLmRpc2Nvbm5lY3QJICAgPSB1ZHBfZGlzY29ubmVjdCwKIAkuaW9jdGwJCSAgID0gdWRwX2lvY3RsLApAQCAtMTQyMiw4ICsxNTE2LDggQEAKIAkucmVjdm1zZwkgICA9IHVkcF9yZWN2bXNnLAogCS5zZW5kcGFnZQkgICA9IHVkcF9zZW5kcGFnZSwKIAkuYmFja2xvZ19yY3YJICAgPSB1ZHBfcXVldWVfcmN2X3NrYiwKLQkuaGFzaAkJICAgPSB1ZHBfdjRfaGFzaCwKLQkudW5oYXNoCQkgICA9IHVkcF92NF91bmhhc2gsCisJLmhhc2gJCSAgID0gdWRwX2xpYl9oYXNoLAorCS51bmhhc2gJCSAgID0gdWRwX2xpYl91bmhhc2gsCiAJLmdldF9wb3J0CSAgID0gdWRwX3Y0X2dldF9wb3J0LAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwX3NvY2spLAogI2lmZGVmIENPTkZJR19DT01QQVQKQEAgLTE0NDIsNyArMTUzNiw3IEBACiAKIAlmb3IgKHN0YXRlLT5idWNrZXQgPSAwOyBzdGF0ZS0+YnVja2V0IDwgVURQX0hUQUJMRV9TSVpFOyArK3N0YXRlLT5idWNrZXQpIHsKIAkJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0JCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwX2hhc2hbc3RhdGUtPmJ1Y2tldF0pIHsKKwkJc2tfZm9yX2VhY2goc2ssIG5vZGUsIHN0YXRlLT5oYXNodGFibGUgKyBzdGF0ZS0+YnVja2V0KSB7CiAJCQlpZiAoc2stPnNrX2ZhbWlseSA9PSBzdGF0ZS0+ZmFtaWx5KQogCQkJCWdvdG8gZm91bmQ7CiAJCX0KQEAgLTE0NjMsNyArMTU1Nyw3IEBACiAJfSB3aGlsZSAoc2sgJiYgc2stPnNrX2ZhbWlseSAhPSBzdGF0ZS0+ZmFtaWx5KTsKIAogCWlmICghc2sgJiYgKytzdGF0ZS0+YnVja2V0IDwgVURQX0hUQUJMRV9TSVpFKSB7Ci0JCXNrID0gc2tfaGVhZCgmdWRwX2hhc2hbc3RhdGUtPmJ1Y2tldF0pOworCQlzayA9IHNrX2hlYWQoc3RhdGUtPmhhc2h0YWJsZSArIHN0YXRlLT5idWNrZXQpOwogCQlnb3RvIHRyeV9hZ2FpbjsKIAl9CiAJcmV0dXJuIHNrOwpAQCAtMTUxMyw2ICsxNjA3LDcgQEAKIAlpZiAoIXMpCiAJCWdvdG8gb3V0OwogCXMtPmZhbWlseQkJPSBhZmluZm8tPmZhbWlseTsKKwlzLT5oYXNodGFibGUJCT0gYWZpbmZvLT5oYXNodGFibGU7CiAJcy0+c2VxX29wcy5zdGFydAk9IHVkcF9zZXFfc3RhcnQ7CiAJcy0+c2VxX29wcy5uZXh0CQk9IHVkcF9zZXFfbmV4dDsKIAlzLT5zZXFfb3BzLnNob3cJCT0gYWZpbmZvLT5zZXFfc2hvdzsKQEAgLTE1NzksNyArMTY3NCw3IEBACiAJCWF0b21pY19yZWFkKCZzcC0+c2tfcmVmY250KSwgc3ApOwogfQogCi1zdGF0aWMgaW50IHVkcDRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCitpbnQgdWRwNF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCiAJCXNlcV9wcmludGYoc2VxLCAiJS0xMjdzXG4iLApAQCAtMTYwMiw2ICsxNjk3LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInVkcCIsCiAJLmZhbWlseQkJPSBBRl9JTkVULAorCS5oYXNodGFibGUJPSB1ZHBfaGFzaCwKIAkuc2VxX3Nob3cJPSB1ZHA0X3NlcV9zaG93LAogCS5zZXFfZm9wcwk9ICZ1ZHA0X3NlcV9mb3BzLAogfTsKQEAgLTE2MjQsNiArMTcyMCw4IEBACiBFWFBPUlRfU1lNQk9MKHVkcF9nZXRfcG9ydCk7CiBFWFBPUlRfU1lNQk9MKHVkcF9wcm90KTsKIEVYUE9SVF9TWU1CT0wodWRwX3NlbmRtc2cpOworRVhQT1JUX1NZTUJPTCh1ZHBfbGliX2dldHNvY2tvcHQpOworRVhQT1JUX1NZTUJPTCh1ZHBfbGliX3NldHNvY2tvcHQpOwogRVhQT1JUX1NZTUJPTCh1ZHBfcG9sbCk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwX2ltcGwuaCBiL25ldC9pcHY0L3VkcF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmNDI3NwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3VkcF9pbXBsLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfVURQNF9JTVBMX0gKKyNkZWZpbmUgX1VEUDRfSU1QTF9ICisjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC91ZHBsaXRlLmg+CisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CisKK2V4dGVybiBpbnQgIAlfX3VkcDRfbGliX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgaGxpc3RfaGVhZCBbXSwgaW50ICk7CitleHRlcm4gdm9pZCAJX191ZHA0X2xpYl9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgdTMyLCBzdHJ1Y3QgaGxpc3RfaGVhZCBbXSk7CisKK2V4dGVybiBpbnQJX191ZHBfbGliX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKKwkJCQkgICBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLCBpbnQgKnBvcnRfcm92ZXIsCisJCSAgICAgICAJICAgICAgIAkgICBpbnQgKCopKGNvbnN0IHN0cnVjdCBzb2NrKixjb25zdCBzdHJ1Y3Qgc29jayopKTsKK2V4dGVybiBpbnQJaXB2NF9yY3Zfc2FkZHJfZXF1YWwoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKik7CisKKworZXh0ZXJuIGludAl1ZHBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbik7CitleHRlcm4gaW50CXVkcF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorZXh0ZXJuIGludAljb21wYXRfdWRwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworZXh0ZXJuIGludAljb21wYXRfdWRwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7CisjZW5kaWYKK2V4dGVybiBpbnQJdWRwX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKTsKK2V4dGVybiBpbnQJdWRwX3NlbmRwYWdlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvZmZzZXQsCisJCQkgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludAl1ZHBfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqIHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQJdWRwX2Rlc3Ryb3lfc29jayhzdHJ1Y3Qgc29jayAqc2spOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK2V4dGVybiBpbnQJdWRwNF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdik7CisjZW5kaWYKKyNlbmRpZgkvKiBfVURQNF9JTVBMX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcGxpdGUuYyBiL25ldC9pcHY0L3VkcGxpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjhmZTFlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvdWRwbGl0ZS5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogIFVEUExJVEUgICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVRFAtTGl0ZSBwcm90b2NvbCAoUkZDIDM4MjgpLgorICoKKyAqICBWZXJzaW9uOiAgICAkSWQ6IHVkcGxpdGUuYyx2IDEuMjUgMjAwNi8xMC8xOSAwNzoyMjozNiBnZXJyaXQgRXhwICQKKyAqCisgKiAgQXV0aG9yczogICAgR2Vycml0IFJlbmtlciAgICAgICA8Z2Vycml0QGVyZy5hYmRuLmFjLnVrPgorICoKKyAqICBDaGFuZ2VzOgorICogIEZpeGVzOgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlICJ1ZHBfaW1wbC5oIgorREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwbGl0ZV9zdGF0aXN0aWNzKQlfX3JlYWRfbW9zdGx5OworCitzdHJ1Y3QgaGxpc3RfaGVhZCAJdWRwbGl0ZV9oYXNoW1VEUF9IVEFCTEVfU0laRV07CitzdGF0aWMgaW50CQl1ZHBsaXRlX3BvcnRfcm92ZXI7CisKK2ludCB1ZHBsaXRlX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgcCwKKwkJICAgICBpbnQgKCpjKShjb25zdCBzdHJ1Y3Qgc29jayAqLCBjb25zdCBzdHJ1Y3Qgc29jayAqKSkKK3sKKwlyZXR1cm4gIF9fdWRwX2xpYl9nZXRfcG9ydChzaywgcCwgdWRwbGl0ZV9oYXNoLCAmdWRwbGl0ZV9wb3J0X3JvdmVyLCBjKTsKK30KKworc3RhdGljIGludCB1ZHBsaXRlX3Y0X2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSkKK3sKKwlyZXR1cm4gdWRwbGl0ZV9nZXRfcG9ydChzaywgc251bSwgaXB2NF9yY3Zfc2FkZHJfZXF1YWwpOworfQorCitzdGF0aWMgaW50IHVkcGxpdGVfcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIF9fdWRwNF9saWJfcmN2KHNrYiwgdWRwbGl0ZV9oYXNoLCAxKTsKK30KKworc3RhdGljIHZvaWQgdWRwbGl0ZV9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8pCit7CisJcmV0dXJuIF9fdWRwNF9saWJfZXJyKHNrYiwgaW5mbywgdWRwbGl0ZV9oYXNoKTsKK30KKworc3RhdGljCXN0cnVjdCBuZXRfcHJvdG9jb2wgdWRwbGl0ZV9wcm90b2NvbCA9IHsKKwkuaGFuZGxlcgk9IHVkcGxpdGVfcmN2LAorCS5lcnJfaGFuZGxlcgk9IHVkcGxpdGVfZXJyLAorCS5ub19wb2xpY3kJPSAxLAorfTsKKworc3RydWN0IHByb3RvIAl1ZHBsaXRlX3Byb3QgPSB7CisJLm5hbWUJCSAgID0gIlVEUC1MaXRlIiwKKwkub3duZXIJCSAgID0gVEhJU19NT0RVTEUsCisJLmNsb3NlCQkgICA9IHVkcF9saWJfY2xvc2UsCisJLmNvbm5lY3QJICAgPSBpcDRfZGF0YWdyYW1fY29ubmVjdCwKKwkuZGlzY29ubmVjdAkgICA9IHVkcF9kaXNjb25uZWN0LAorCS5pb2N0bAkJICAgPSB1ZHBfaW9jdGwsCisJLmluaXQJCSAgID0gdWRwbGl0ZV9za19pbml0LAorCS5kZXN0cm95CSAgID0gdWRwX2Rlc3Ryb3lfc29jaywKKwkuc2V0c29ja29wdAkgICA9IHVkcF9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CSAgID0gdWRwX2dldHNvY2tvcHQsCisJLnNlbmRtc2cJICAgPSB1ZHBfc2VuZG1zZywKKwkucmVjdm1zZwkgICA9IHVkcF9yZWN2bXNnLAorCS5zZW5kcGFnZQkgICA9IHVkcF9zZW5kcGFnZSwKKwkuYmFja2xvZ19yY3YJICAgPSB1ZHBfcXVldWVfcmN2X3NrYiwKKwkuaGFzaAkJICAgPSB1ZHBfbGliX2hhc2gsCisJLnVuaGFzaAkJICAgPSB1ZHBfbGliX3VuaGFzaCwKKwkuZ2V0X3BvcnQJICAgPSB1ZHBsaXRlX3Y0X2dldF9wb3J0LAorCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwX3NvY2spLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X3NldHNvY2tvcHQgPSBjb21wYXRfdWRwX3NldHNvY2tvcHQsCisJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcF9nZXRzb2Nrb3B0LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyB1ZHBsaXRlNF9wcm90b3N3ID0geworCS50eXBlCQk9ICBTT0NLX0RHUkFNLAorCS5wcm90b2NvbAk9ICBJUFBST1RPX1VEUExJVEUsCisJLnByb3QJCT0gICZ1ZHBsaXRlX3Byb3QsCisJLm9wcwkJPSAgJmluZXRfZGdyYW1fb3BzLAorCS5jYXBhYmlsaXR5CT0gLTEsCisJLm5vX2NoZWNrCT0gIDAsCQkvKiBtdXN0IGNoZWNrc3VtIChSRkMgMzgyOCkgKi8KKwkuZmxhZ3MJCT0gIElORVRfUFJPVE9TV19QRVJNQU5FTlQsCit9OworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVkcGxpdGU0X3NlcV9mb3BzOworc3RhdGljIHN0cnVjdCB1ZHBfc2VxX2FmaW5mbyB1ZHBsaXRlNF9zZXFfYWZpbmZvID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidWRwbGl0ZSIsCisJLmZhbWlseQkJPSBBRl9JTkVULAorCS5oYXNodGFibGUJPSB1ZHBsaXRlX2hhc2gsCisJLnNlcV9zaG93CT0gdWRwNF9zZXFfc2hvdywKKwkuc2VxX2ZvcHMJPSAmdWRwbGl0ZTRfc2VxX2ZvcHMsCit9OworI2VuZGlmCisKK3ZvaWQgX19pbml0IHVkcGxpdGU0X3JlZ2lzdGVyKHZvaWQpCit7CisJaWYgKHByb3RvX3JlZ2lzdGVyKCZ1ZHBsaXRlX3Byb3QsIDEpKQorCQlnb3RvIG91dF9yZWdpc3Rlcl9lcnI7CisKKwlpZiAoaW5ldF9hZGRfcHJvdG9jb2woJnVkcGxpdGVfcHJvdG9jb2wsIElQUFJPVE9fVURQTElURSkgPCAwKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3Byb3RvOworCisJaW5ldF9yZWdpc3Rlcl9wcm90b3N3KCZ1ZHBsaXRlNF9wcm90b3N3KTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaWYgKHVkcF9wcm9jX3JlZ2lzdGVyKCZ1ZHBsaXRlNF9zZXFfYWZpbmZvKSkgLyogdWRwbGl0ZTRfcHJvY19pbml0KCkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlZ2lzdGVyIC9wcm9jIVxuIiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCXJldHVybjsKKworb3V0X3VucmVnaXN0ZXJfcHJvdG86CisJcHJvdG9fdW5yZWdpc3RlcigmdWRwbGl0ZV9wcm90KTsKK291dF9yZWdpc3Rlcl9lcnI6CisJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IENhbm5vdCBhZGQgVURQLUxpdGUgcHJvdG9jb2wuXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCitFWFBPUlRfU1lNQk9MKHVkcGxpdGVfaGFzaCk7CitFWFBPUlRfU1lNQk9MKHVkcGxpdGVfcHJvdCk7CitFWFBPUlRfU1lNQk9MKHVkcGxpdGVfZ2V0X3BvcnQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwppbmRleCAxYmVkMGNkLi5mYjlmNjljIDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYworKysgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwpAQCAtNzIsOCArNzIsOCBAQAogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCwgKmRzdF9wcmV2OwogCXN0cnVjdCBydGFibGUgKnJ0MCA9IChzdHJ1Y3QgcnRhYmxlKikoKmRzdF9wKTsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IHJ0MDsKLQl1MzIgcmVtb3RlID0gZmwtPmZsNF9kc3Q7Ci0JdTMyIGxvY2FsICA9IGZsLT5mbDRfc3JjOworCV9fYmUzMiByZW1vdGUgPSBmbC0+Zmw0X2RzdDsKKwlfX2JlMzIgbG9jYWwgID0gZmwtPmZsNF9zcmM7CiAJc3RydWN0IGZsb3dpIGZsX3R1bm5lbCA9IHsKIAkJLm5sX3UgPSB7CiAJCQkuaXA0X3UgPSB7CkBAIC0xOTksMTEgKzE5OSwxMiBAQAogCWlmICghKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpKSB7CiAJCXN3aXRjaCAoaXBoLT5wcm90b2NvbCkgewogCQljYXNlIElQUFJPVE9fVURQOgorCQljYXNlIElQUFJPVE9fVURQTElURToKIAkJY2FzZSBJUFBST1RPX1RDUDoKIAkJY2FzZSBJUFBST1RPX1NDVFA6CiAJCWNhc2UgSVBQUk9UT19EQ0NQOgogCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCB4cHJ0aCArIDQgLSBza2ItPmRhdGEpKSB7Ci0JCQkJdTE2ICpwb3J0cyA9ICh1MTYgKil4cHJ0aDsKKwkJCQlfX2JlMTYgKnBvcnRzID0gKF9fYmUxNiAqKXhwcnRoOwogCiAJCQkJZmwtPmZsX2lwX3Nwb3J0ID0gcG9ydHNbMF07CiAJCQkJZmwtPmZsX2lwX2Rwb3J0ID0gcG9ydHNbMV07CkBAIC0yNzMsNiArMjc0LDggQEAKIAogCWlmIChsaWtlbHkoeGRzdC0+dS5ydC5pZGV2KSkKIAkJaW5fZGV2X3B1dCh4ZHN0LT51LnJ0LmlkZXYpOworCWlmIChsaWtlbHkoeGRzdC0+dS5ydC5wZWVyKSkKKwkJaW5ldF9wdXRwZWVyKHhkc3QtPnUucnQucGVlcik7CiAJeGZybV9kc3RfZGVzdHJveSh4ZHN0KTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvS2NvbmZpZyBiL25ldC9pcHY2L0tjb25maWcKaW5kZXggZWY1ZWFhZC4uZGViNDEwMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvS2NvbmZpZworKysgYi9uZXQvaXB2Ni9LY29uZmlnCkBAIC0xNzUsOSArMTc1LDE2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBJUFY2X01VTFRJUExFX1RBQkxFUworCWJvb2wgIklQdjY6IE11bHRpcGxlIFJvdXRpbmcgVGFibGVzIgorCWRlcGVuZHMgb24gSVBWNiAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgRklCX1JVTEVTCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBtdWx0aXBsZSByb3V0aW5nIHRhYmxlcy4KKwogY29uZmlnIElQVjZfU1VCVFJFRVMKIAlib29sICJJUHY2OiBzb3VyY2UgYWRkcmVzcyBiYXNlZCByb3V0aW5nIgotCWRlcGVuZHMgb24gSVBWNiAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIElQVjZfTVVMVElQTEVfVEFCTEVTCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHJvdXRpbmcgYnkgc291cmNlIGFkZHJlc3Mgb3IgcHJlZml4LgogCkBAIC0xODksMTcgKzE5NiwzIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUFY2X01VTFRJUExFX1RBQkxFUwotCWJvb2wgIklQdjY6IE11bHRpcGxlIFJvdXRpbmcgVGFibGVzIgotCWRlcGVuZHMgb24gSVBWNiAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgRklCX1JVTEVTCi0JLS0taGVscC0tLQotCSAgU3VwcG9ydCBtdWx0aXBsZSByb3V0aW5nIHRhYmxlcy4KLQotY29uZmlnIElQVjZfUk9VVEVfRldNQVJLCi0JYm9vbCAiSVB2NjogdXNlIG5ldGZpbHRlciBNQVJLIHZhbHVlIGFzIHJvdXRpbmcga2V5IgotCWRlcGVuZHMgb24gSVBWNl9NVUxUSVBMRV9UQUJMRVMgJiYgTkVURklMVEVSCi0JLS0taGVscC0tLQotCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gc3BlY2lmeSBkaWZmZXJlbnQgcm91dGVzIGZvcgotCSAgcGFja2V0cyB3aXRoIGRpZmZlcmVudCBtYXJrIHZhbHVlcyAoc2VlIGlwdGFibGVzKDgpLCBNQVJLIHRhcmdldCkuCi0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L01ha2VmaWxlIGIvbmV0L2lwdjYvTWFrZWZpbGUKaW5kZXggYWRkY2MwMS4uOGJhY2RhMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvTWFrZWZpbGUKKysrIGIvbmV0L2lwdjYvTWFrZWZpbGUKQEAgLTUsOCArNSw4IEBACiBvYmotJChDT05GSUdfSVBWNikgKz0gaXB2Ni5vCiAKIGlwdjYtb2JqcyA6PQlhZl9pbmV0Ni5vIGFueWNhc3QubyBpcDZfb3V0cHV0Lm8gaXA2X2lucHV0Lm8gYWRkcmNvbmYubyBcCi0JCXJvdXRlLm8gaXA2X2ZpYi5vIGlwdjZfc29ja2dsdWUubyBuZGlzYy5vIHVkcC5vIHJhdy5vIFwKLQkJcHJvdG9jb2wubyBpY21wLm8gbWNhc3QubyByZWFzc2VtYmx5Lm8gdGNwX2lwdjYubyBcCisJCXJvdXRlLm8gaXA2X2ZpYi5vIGlwdjZfc29ja2dsdWUubyBuZGlzYy5vIHVkcC5vIHVkcGxpdGUubyBcCisJCXJhdy5vIHByb3RvY29sLm8gaWNtcC5vIG1jYXN0Lm8gcmVhc3NlbWJseS5vIHRjcF9pcHY2Lm8gXAogCQlleHRoZHJzLm8gc3lzY3RsX25ldF9pcHY2Lm8gZGF0YWdyYW0ubyBwcm9jLm8gXAogCQlpcDZfZmxvd2xhYmVsLm8gaXB2Nl9zeW1zLm8gaW5ldDZfY29ubmVjdGlvbl9zb2NrLm8KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggYjMxMmE1Zi4uOWIwYTkwNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAogaW50IF9faXB2Nl9hZGRyX3R5cGUoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQogewotCXUzMiBzdDsKKwlfX2JlMzIgc3Q7CiAKIAlzdCA9IGFkZHItPnM2X2FkZHIzMlswXTsKIApAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIGludCBpcHY2X2dldF9zYWRkcihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCiAJCSAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIpCiB7Ci0JcmV0dXJuIGlwdjZfZGV2X2dldF9zYWRkcihkc3QgPyAoKHN0cnVjdCBydDZfaW5mbyAqKWRzdCktPnJ0NmlfaWRldi0+ZGV2IDogTlVMTCwgZGFkZHIsIHNhZGRyKTsKKwlyZXR1cm4gaXB2Nl9kZXZfZ2V0X3NhZGRyKGRzdCA/IGlwNl9kc3RfaWRldihkc3QpLT5kZXYgOiBOVUxMLCBkYWRkciwgc2FkZHIpOwogfQogCiAKQEAgLTMwOTgsMTAgKzMwOTgsOSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBpbmV0Nl9pZmFkZHJfbXNnc2l6ZSh2b2lkKQogewotCXJldHVybiBubG1zZ190b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSArCi0JCQkJbmxhX3RvdGFsX3NpemUoMTYpICsKLQkJCQlubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmYV9jYWNoZWluZm8pKSArCi0JCQkJMTI4KTsKKwlyZXR1cm4gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKQorCSAgICAgICArIG5sYV90b3RhbF9zaXplKDE2KSAvKiBJRkFfQUREUkVTUyAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZhX2NhY2hlaW5mbykpOwogfQogCiBzdGF0aWMgaW50IGluZXQ2X2ZpbGxfaWZhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYSwKQEAgLTMzMjksMTAgKzMzMjgsOCBAQAogCiAJZXJyID0gaW5ldDZfZmlsbF9pZmFkZHIoc2tiLCBpZmEsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsCiAJCQkJbmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdBRERSLCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXRfaWZhOwotCX0KKwkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGluZXQ2X2lmYWRkcl9tc2dzaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX3VuaWNhc3Qoc2tiLCBORVRMSU5LX0NCKGluX3NrYikucGlkKTsKIGVycm91dF9pZmE6CkBAIC0zMzUxLDEwICszMzQ4LDggQEAKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX2lmYWRkcihza2IsIGlmYSwgMCwgMCwgZXZlbnQsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZmFkZHJfbXNnc2l6ZSgpICovCisJQlVHX09OKGVyciA8IDApOwogCiAJZXJyID0gcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0lQVjZfSUZBRERSLCBOVUxMLCBHRlBfQVRPTUlDKTsKIGVycm91dDoKQEAgLTMzNjUsNiArMzM2MCw4IEBACiBzdGF0aWMgdm9pZCBpbmxpbmUgaXB2Nl9zdG9yZV9kZXZjb25mKHN0cnVjdCBpcHY2X2RldmNvbmYgKmNuZiwKIAkJCQlfX3MzMiAqYXJyYXksIGludCBieXRlcykKIHsKKwlCVUdfT04oYnl0ZXMgPCAoREVWQ09ORl9NQVggKiA0KSk7CisKIAltZW1zZXQoYXJyYXksIDAsIGJ5dGVzKTsKIAlhcnJheVtERVZDT05GX0ZPUldBUkRJTkddID0gY25mLT5mb3J3YXJkaW5nOwogCWFycmF5W0RFVkNPTkZfSE9QTElNSVRdID0gY25mLT5ob3BfbGltaXQ7CkBAIC0zMzk3LDgwICszMzk0LDc2IEBACiAJYXJyYXlbREVWQ09ORl9QUk9YWV9ORFBdID0gY25mLT5wcm94eV9uZHA7CiB9CiAKLS8qIE1heGltdW0gbGVuZ3RoIG9mIGlmaW5mb21zZyBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIElORVQ2X0lGSU5GT19SVEFfU1BBQ0UgXAotCQlSVEFfU1BBQ0UoSUZOQU1TSVopIC8qIElGTkFNRSAqLyArIFwKLQkJUlRBX1NQQUNFKE1BWF9BRERSX0xFTikgLyogQUREUkVTUyAqLyArCVwKLQkJUlRBX1NQQUNFKHNpemVvZih1MzIpKSAvKiBNVFUgKi8gKyBcCi0JCVJUQV9TUEFDRShzaXplb2YoaW50KSkgLyogTElOSyAqLyArIFwKLQkJUlRBX1NQQUNFKDApIC8qIFBST1RJTkZPICovICsgXAotCQlSVEFfU1BBQ0Uoc2l6ZW9mKHUzMikpIC8qIEZMQUdTICovICsgXAotCQlSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpZmxhX2NhY2hlaW5mbykpIC8qIENBQ0hFSU5GTyAqLyArIFwKLQkJUlRBX1NQQUNFKHNpemVvZihfX3MzMltERVZDT05GX01BWF0pKSAvKiBDT05GICovCitzdGF0aWMgaW5saW5lIHNpemVfdCBpbmV0Nl9pZl9ubG1zZ19zaXplKHZvaWQpCit7CisJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkKKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShJRk5BTVNJWikgLyogSUZMQV9JRk5BTUUgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShNQVhfQUREUl9MRU4pIC8qIElGTEFfQUREUkVTUyAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfTVRVICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZMQV9MSU5LICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoIC8qIElGTEFfUFJPVElORk8gKi8KKwkJCW5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfSU5FVDZfRkxBR1MgKi8KKwkJCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX2NhY2hlaW5mbykpCisJCQkrIG5sYV90b3RhbF9zaXplKERFVkNPTkZfTUFYICogNCkgLyogSUZMQV9JTkVUNl9DT05GICovCisJCSApOworfQogCiBzdGF0aWMgaW50IGluZXQ2X2ZpbGxfaWZpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIAogCQkJICAgICB1MzIgcGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQsIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gaWRldi0+ZGV2OwotCV9fczMyCQkJKmFycmF5ID0gTlVMTDsKLQlzdHJ1Y3QgaWZpbmZvbXNnCSpyOwotCXN0cnVjdCBubG1zZ2hkciAJKm5saDsKLQl1bnNpZ25lZCBjaGFyCQkqYiA9IHNrYi0+dGFpbDsKLQlzdHJ1Y3QgcnRhdHRyCQkqc3ViYXR0cjsKLQlfX3UzMgkJCW10dSA9IGRldi0+bXR1OwotCXN0cnVjdCBpZmxhX2NhY2hlaW5mbwljaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWRldi0+ZGV2OworCXN0cnVjdCBubGF0dHIgKmNvbmY7CisJc3RydWN0IGlmaW5mb21zZyAqaGRyOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXZvaWQgKnByb3RvaW5mbzsKKwlzdHJ1Y3QgaWZsYV9jYWNoZWluZm8gY2k7CiAKLQlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqciksIGZsYWdzKTsKLQlyID0gTkxNU0dfREFUQShubGgpOwotCXItPmlmaV9mYW1pbHkgPSBBRl9JTkVUNjsKLQlyLT5fX2lmaV9wYWQgPSAwOwotCXItPmlmaV90eXBlID0gZGV2LT50eXBlOwotCXItPmlmaV9pbmRleCA9IGRldi0+aWZpbmRleDsKLQlyLT5pZmlfZmxhZ3MgPSBkZXZfZ2V0X2ZsYWdzKGRldik7Ci0Jci0+aWZpX2NoYW5nZSA9IDA7CisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKmhkciksIGZsYWdzKTsKKwlpZiAobmxoID09IE5VTEwpCisJCXJldHVybiAtRU5PQlVGUzsKIAotCVJUQV9QVVQoc2tiLCBJRkxBX0lGTkFNRSwgc3RybGVuKGRldi0+bmFtZSkrMSwgZGV2LT5uYW1lKTsKKwloZHIgPSBubG1zZ19kYXRhKG5saCk7CisJaGRyLT5pZmlfZmFtaWx5ID0gQUZfSU5FVDY7CisJaGRyLT5fX2lmaV9wYWQgPSAwOworCWhkci0+aWZpX3R5cGUgPSBkZXYtPnR5cGU7CisJaGRyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJaGRyLT5pZmlfZmxhZ3MgPSBkZXZfZ2V0X2ZsYWdzKGRldik7CisJaGRyLT5pZmlfY2hhbmdlID0gMDsKKworCU5MQV9QVVRfU1RSSU5HKHNrYiwgSUZMQV9JRk5BTUUsIGRldi0+bmFtZSk7CiAKIAlpZiAoZGV2LT5hZGRyX2xlbikKLQkJUlRBX1BVVChza2IsIElGTEFfQUREUkVTUywgZGV2LT5hZGRyX2xlbiwgZGV2LT5kZXZfYWRkcik7CisJCU5MQV9QVVQoc2tiLCBJRkxBX0FERFJFU1MsIGRldi0+YWRkcl9sZW4sIGRldi0+ZGV2X2FkZHIpOwogCi0JUlRBX1BVVChza2IsIElGTEFfTVRVLCBzaXplb2YobXR1KSwgJm10dSk7CisJTkxBX1BVVF9VMzIoc2tiLCBJRkxBX01UVSwgZGV2LT5tdHUpOwogCWlmIChkZXYtPmlmaW5kZXggIT0gZGV2LT5pZmxpbmspCi0JCVJUQV9QVVQoc2tiLCBJRkxBX0xJTkssIHNpemVvZihpbnQpLCAmZGV2LT5pZmxpbmspOwotCQkJCi0Jc3ViYXR0ciA9IChzdHJ1Y3QgcnRhdHRyKilza2ItPnRhaWw7CisJCU5MQV9QVVRfVTMyKHNrYiwgSUZMQV9MSU5LLCBkZXYtPmlmbGluayk7CiAKLQlSVEFfUFVUKHNrYiwgSUZMQV9QUk9USU5GTywgMCwgTlVMTCk7CisJcHJvdG9pbmZvID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBJRkxBX1BST1RJTkZPKTsKKwlpZiAocHJvdG9pbmZvID09IE5VTEwpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JLyogcmV0dXJuIHRoZSBkZXZpY2UgZmxhZ3MgKi8KLQlSVEFfUFVUKHNrYiwgSUZMQV9JTkVUNl9GTEFHUywgc2l6ZW9mKF9fdTMyKSwgJmlkZXYtPmlmX2ZsYWdzKTsKKwlOTEFfUFVUX1UzMihza2IsIElGTEFfSU5FVDZfRkxBR1MsIGlkZXYtPmlmX2ZsYWdzKTsKIAotCS8qIHJldHVybiBpbnRlcmZhY2UgY2FjaGVpbmZvICovCiAJY2kubWF4X3JlYXNtX2xlbiA9IElQVjZfTUFYUExFTjsKIAljaS50c3RhbXAgPSAoX191MzIpKFRJTUVfREVMVEEoaWRldi0+dHN0YW1wLCBJTklUSUFMX0pJRkZJRVMpIC8gSFogKiAxMDAKIAkJICAgICsgVElNRV9ERUxUQShpZGV2LT50c3RhbXAsIElOSVRJQUxfSklGRklFUykgJSBIWiAqIDEwMCAvIEhaKTsKIAljaS5yZWFjaGFibGVfdGltZSA9IGlkZXYtPm5kX3Bhcm1zLT5yZWFjaGFibGVfdGltZTsKIAljaS5yZXRyYW5zX3RpbWUgPSBpZGV2LT5uZF9wYXJtcy0+cmV0cmFuc190aW1lOwotCVJUQV9QVVQoc2tiLCBJRkxBX0lORVQ2X0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKLQkKLQkvKiByZXR1cm4gdGhlIGRldmljZSBzeXNjdGwgcGFyYW1zICovCi0JaWYgKChhcnJheSA9IGttYWxsb2MoREVWQ09ORl9NQVggKiBzaXplb2YoKmFycmF5KSwgR0ZQX0FUT01JQykpID09IE5VTEwpCi0JCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JaXB2Nl9zdG9yZV9kZXZjb25mKCZpZGV2LT5jbmYsIGFycmF5LCBERVZDT05GX01BWCAqIHNpemVvZigqYXJyYXkpKTsKLQlSVEFfUFVUKHNrYiwgSUZMQV9JTkVUNl9DT05GLCBERVZDT05GX01BWCAqIHNpemVvZigqYXJyYXkpLCBhcnJheSk7CisJTkxBX1BVVChza2IsIElGTEFfSU5FVDZfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworCisJY29uZiA9IG5sYV9yZXNlcnZlKHNrYiwgSUZMQV9JTkVUNl9DT05GLCBERVZDT05GX01BWCAqIHNpemVvZihzMzIpKTsKKwlpZiAoY29uZiA9PSBOVUxMKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpcHY2X3N0b3JlX2RldmNvbmYoJmlkZXYtPmNuZiwgbmxhX2RhdGEoY29uZiksIG5sYV9sZW4oY29uZikpOwogCiAJLyogWFhYIC0gU3RhdGlzdGljcy9NQyBub3QgaW1wbGVtZW50ZWQgKi8KLQlzdWJhdHRyLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilzdWJhdHRyOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwotCWtmcmVlKGFycmF5KTsKLQlyZXR1cm4gc2tiLT5sZW47CisJbmxhX25lc3RfZW5kKHNrYiwgcHJvdG9pbmZvKTsKKwlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAotbmxtc2dfZmFpbHVyZToKLXJ0YXR0cl9mYWlsdXJlOgotCWtmcmVlKGFycmF5KTsKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOwotCXJldHVybiAtMTsKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKIH0KIAogc3RhdGljIGludCBpbmV0Nl9kdW1wX2lmaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCkBAIC0zNTAxLDE4ICszNDk0LDE1IEBACiB2b2lkIGluZXQ2X2lmaW5mb19ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHBheWxvYWQgPSBzaXplb2Yoc3RydWN0IGlmaW5mb21zZykgKyBJTkVUNl9JRklORk9fUlRBX1NQQUNFOwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAkKLQlza2IgPSBubG1zZ19uZXcobmxtc2dfdG90YWxfc2l6ZShwYXlsb2FkKSwgR0ZQX0FUT01JQyk7CisJc2tiID0gbmxtc2dfbmV3KGluZXQ2X2lmX25sbXNnX3NpemUoKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IGluZXQ2X2ZpbGxfaWZpbmZvKHNrYiwgaWRldiwgMCwgMCwgZXZlbnQsIDApOwotCWlmIChlcnIgPCAwKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlnb3RvIGVycm91dDsKLQl9CisJLyogZmFpbHVyZSBpbXBsaWVzIEJVRyBpbiBpbmV0Nl9pZl9ubG1zZ19zaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfSVBWNl9JRkFERFIsIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgpAQCAtMzUyMCwyMiArMzUxMCwyNiBAQAogCQlydG5sX3NldF9za19lcnIoUlROTEdSUF9JUFY2X0lGQUREUiwgZXJyKTsKIH0KIAotLyogTWF4aW11bSBsZW5ndGggb2YgcHJlZml4X2NhY2hlaW5mbyBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIElORVQ2X1BSRUZJWF9SVEFfU1BBQ0UgXAotCQlSVEFfU1BBQ0Uoc2l6ZW9mKCgoc3RydWN0IHByZWZpeF9pbmZvICopTlVMTCktPnByZWZpeCkpIC8qIEFERFJFU1MgKi8gKyBcCi0JCVJUQV9TUEFDRShzaXplb2Yoc3RydWN0IHByZWZpeF9jYWNoZWluZm8pKSAvKiBDQUNIRUlORk8gKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGluZXQ2X3ByZWZpeF9ubG1zZ19zaXplKHZvaWQpCit7CisJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgcHJlZml4bXNnKSkKKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkKKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IHByZWZpeF9jYWNoZWluZm8pKTsKK30KIAogc3RhdGljIGludCBpbmV0Nl9maWxsX3ByZWZpeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LAotCQkJc3RydWN0IHByZWZpeF9pbmZvICpwaW5mbywgdTMyIHBpZCwgdTMyIHNlcSwgCi0JCQlpbnQgZXZlbnQsIHVuc2lnbmVkIGludCBmbGFncykKKwkJCSAgICAgc3RydWN0IHByZWZpeF9pbmZvICpwaW5mbywgdTMyIHBpZCwgdTMyIHNlcSwKKwkJCSAgICAgaW50IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHByZWZpeG1zZwkqcG1zZzsKLQlzdHJ1Y3Qgbmxtc2doZHIgCSpubGg7Ci0JdW5zaWduZWQgY2hhcgkJKmIgPSBza2ItPnRhaWw7CisJc3RydWN0IHByZWZpeG1zZyAqcG1zZzsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgcHJlZml4X2NhY2hlaW5mbwljaTsKIAotCW5saCA9IE5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpwbXNnKSwgZmxhZ3MpOwotCXBtc2cgPSBOTE1TR19EQVRBKG5saCk7CisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnBtc2cpLCBmbGFncyk7CisJaWYgKG5saCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlwbXNnID0gbmxtc2dfZGF0YShubGgpOwogCXBtc2ctPnByZWZpeF9mYW1pbHkgPSBBRl9JTkVUNjsKIAlwbXNnLT5wcmVmaXhfcGFkMSA9IDA7CiAJcG1zZy0+cHJlZml4X3BhZDIgPSAwOwpAQCAtMzU0Myw0NCArMzUzNywzNyBAQAogCXBtc2ctPnByZWZpeF9sZW4gPSBwaW5mby0+cHJlZml4X2xlbjsKIAlwbXNnLT5wcmVmaXhfdHlwZSA9IHBpbmZvLT50eXBlOwogCXBtc2ctPnByZWZpeF9wYWQzID0gMDsKLQkKIAlwbXNnLT5wcmVmaXhfZmxhZ3MgPSAwOwogCWlmIChwaW5mby0+b25saW5rKQogCQlwbXNnLT5wcmVmaXhfZmxhZ3MgfD0gSUZfUFJFRklYX09OTElOSzsKIAlpZiAocGluZm8tPmF1dG9jb25mKQogCQlwbXNnLT5wcmVmaXhfZmxhZ3MgfD0gSUZfUFJFRklYX0FVVE9DT05GOwogCi0JUlRBX1BVVChza2IsIFBSRUZJWF9BRERSRVNTLCBzaXplb2YocGluZm8tPnByZWZpeCksICZwaW5mby0+cHJlZml4KTsKKwlOTEFfUFVUKHNrYiwgUFJFRklYX0FERFJFU1MsIHNpemVvZihwaW5mby0+cHJlZml4KSwgJnBpbmZvLT5wcmVmaXgpOwogCiAJY2kucHJlZmVycmVkX3RpbWUgPSBudG9obChwaW5mby0+cHJlZmVyZWQpOwogCWNpLnZhbGlkX3RpbWUgPSBudG9obChwaW5mby0+dmFsaWQpOwotCVJUQV9QVVQoc2tiLCBQUkVGSVhfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOworCU5MQV9QVVQoc2tiLCBQUkVGSVhfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwotCXJldHVybiBza2ItPmxlbjsKKwlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAotbmxtc2dfZmFpbHVyZToKLXJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7Ci0JcmV0dXJuIC0xOworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiBubG1zZ19jYW5jZWwoc2tiLCBubGgpOwogfQogCiBzdGF0aWMgdm9pZCBpbmV0Nl9wcmVmaXhfbm90aWZ5KGludCBldmVudCwgc3RydWN0IGluZXQ2X2RldiAqaWRldiwgCiAJCQkgc3RydWN0IHByZWZpeF9pbmZvICpwaW5mbykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBwYXlsb2FkID0gc2l6ZW9mKHN0cnVjdCBwcmVmaXhtc2cpICsgSU5FVDZfUFJFRklYX1JUQV9TUEFDRTsKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAKLQlza2IgPSBubG1zZ19uZXcobmxtc2dfdG90YWxfc2l6ZShwYXlsb2FkKSwgR0ZQX0FUT01JQyk7CisJc2tiID0gbmxtc2dfbmV3KGluZXQ2X3ByZWZpeF9ubG1zZ19zaXplKCksIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX3ByZWZpeChza2IsIGlkZXYsIHBpbmZvLCAwLCAwLCBldmVudCwgMCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIGluZXQ2X3ByZWZpeF9ubG1zZ19zaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfSVBWNl9QUkVGSVgsIE5VTEwsIEdGUF9BVE9NSUMpOwogZXJyb3V0OgpAQCAtMzY2OSw4ICszNjU2LDcgQEAKIAkJCQkJICAgIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAogCQkJCQkgICAgdm9pZCBfX3VzZXIgKm9sZHZhbCwKIAkJCQkJICAgIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCi0JCQkJCSAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLAotCQkJCQkgICAgdm9pZCAqKmNvbnRleHQpCisJCQkJCSAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuKQogewogCWludCAqdmFscCA9IHRhYmxlLT5kYXRhOwogCWludCBuZXc7CkBAIC0zOTgyLDEwICszOTY4LDkgQEAKIAlzdHJ1Y3QgYWRkcmNvbmZfc3lzY3RsX3RhYmxlICp0OwogCWNoYXIgKmRldl9uYW1lID0gTlVMTDsKIAotCXQgPSBrbWFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOworCXQgPSBrbWVtZHVwKCZhZGRyY29uZl9zeXNjdGwsIHNpemVvZigqdCksIEdGUF9LRVJORUwpOwogCWlmICh0ID09IE5VTEwpCiAJCXJldHVybjsKLQltZW1jcHkodCwgJmFkZHJjb25mX3N5c2N0bCwgc2l6ZW9mKCp0KSk7CiAJZm9yIChpPTA7IHQtPmFkZHJjb25mX3ZhcnNbaV0uZGF0YTsgaSsrKSB7CiAJCXQtPmFkZHJjb25mX3ZhcnNbaV0uZGF0YSArPSAoY2hhciopcCAtIChjaGFyKikmaXB2Nl9kZXZjb25mOwogCQl0LT5hZGRyY29uZl92YXJzW2ldLmRlID0gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FmX2luZXQ2LmMgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCmluZGV4IDg1OGNhZTIuLmU1Y2Q4M2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FmX2luZXQ2LmMKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC91ZHBsaXRlLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC9pcGlwLmg+CiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CkBAIC0yMjEsNyArMjIyLDcgQEAKIAkJICogdGhlIHVzZXIgdG8gYXNzaWduIGEgbnVtYmVyIGF0IHNvY2tldAogCQkgKiBjcmVhdGlvbiB0aW1lIGF1dG9tYXRpY2FsbHkgc2hhcmVzLgogCQkgKi8KLQkJaW5ldC0+c3BvcnQgPSBudG9ocyhpbmV0LT5udW0pOworCQlpbmV0LT5zcG9ydCA9IGh0b25zKGluZXQtPm51bSk7CiAJCXNrLT5za19wcm90LT5oYXNoKHNrKTsKIAl9CiAJaWYgKHNrLT5za19wcm90LT5pbml0KSB7CkBAIC0zNDEsNyArMzQyLDcgQEAKIAkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX0JJTkRBRERSX0xPQ0s7CiAJaWYgKHNudW0pCiAJCXNrLT5za191c2VybG9ja3MgfD0gU09DS19CSU5EUE9SVF9MT0NLOwotCWluZXQtPnNwb3J0ID0gbnRvaHMoaW5ldC0+bnVtKTsKKwlpbmV0LT5zcG9ydCA9IGh0b25zKGluZXQtPm51bSk7CiAJaW5ldC0+ZHBvcnQgPSAwOwogCWluZXQtPmRhZGRyID0gMDsKIG91dDoKQEAgLTY3OCw3ICs2NzksNyBAQAogCWlmIChucC0+cnhvcHQuYWxsKSB7CiAJCWlmICgob3B0LT5ob3AgJiYgKG5wLT5yeG9wdC5iaXRzLmhvcG9wdHMgfHwKIAkJCQkgIG5wLT5yeG9wdC5iaXRzLm9ob3BvcHRzKSkgfHwKLQkJICAgICgoSVBWNl9GTE9XSU5GT19NQVNLICYgKih1MzIqKXNrYi0+bmgucmF3KSAmJgorCQkgICAgKChJUFY2X0ZMT1dJTkZPX01BU0sgJiAqKF9fYmUzMiopc2tiLT5uaC5yYXcpICYmCiAJCSAgICAgbnAtPnJ4b3B0LmJpdHMucnhmbG93KSB8fAogCQkgICAgKG9wdC0+c3JjcnQgJiYgKG5wLT5yeG9wdC5iaXRzLnNyY3J0IHx8CiAJCSAgICAgbnAtPnJ4b3B0LmJpdHMub3NyY3J0KSkgfHwKQEAgLTcxOSwxMCArNzIwLDggQEAKIHsKIAlpZiAocHRyID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAocHRyWzBdKQotCQlmcmVlX3BlcmNwdShwdHJbMF0pOwotCWlmIChwdHJbMV0pCi0JCWZyZWVfcGVyY3B1KHB0clsxXSk7CisJZnJlZV9wZXJjcHUocHRyWzBdKTsKKwlmcmVlX3BlcmNwdShwdHJbMV0pOwogCXB0clswXSA9IHB0clsxXSA9IE5VTEw7CiB9CiAKQEAgLTczNyw4ICs3MzYsMTMgQEAKIAlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopdWRwX3N0YXRzX2luNiwgc2l6ZW9mIChzdHJ1Y3QgdWRwX21pYiksCiAJCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdWRwX21pYikpIDwgMCkKIAkJZ290byBlcnJfdWRwX21pYjsKKwlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopdWRwbGl0ZV9zdGF0c19pbjYsIHNpemVvZiAoc3RydWN0IHVkcF9taWIpLAorCQkJICAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCisJCWdvdG8gZXJyX3VkcGxpdGVfbWliOwogCXJldHVybiAwOwogCitlcnJfdWRwbGl0ZV9taWI6CisJc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopdWRwX3N0YXRzX2luNik7CiBlcnJfdWRwX21pYjoKIAlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpY21wdjZfc3RhdGlzdGljcyk7CiBlcnJfaWNtcF9taWI6CkBAIC03NTMsNiArNzU3LDcgQEAKIAlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpcHY2X3N0YXRpc3RpY3MpOwogCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzKTsKIAlzbm1wNl9taWJfZnJlZSgodm9pZCAqKil1ZHBfc3RhdHNfaW42KTsKKwlzbm1wNl9taWJfZnJlZSgodm9pZCAqKil1ZHBsaXRlX3N0YXRzX2luNik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGluZXQ2X2luaXQodm9pZCkKQEAgLTc4MCwxMCArNzg1LDE0IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfdW5yZWdpc3Rlcl90Y3BfcHJvdG87CiAKLQllcnIgPSBwcm90b19yZWdpc3RlcigmcmF3djZfcHJvdCwgMSk7CisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoJnVkcGxpdGV2Nl9wcm90LCAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF91bnJlZ2lzdGVyX3VkcF9wcm90bzsKIAorCWVyciA9IHByb3RvX3JlZ2lzdGVyKCZyYXd2Nl9wcm90LCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3VkcGxpdGVfcHJvdG87CisKIAogCS8qIFJlZ2lzdGVyIHRoZSBzb2NrZXQtc2lkZSBpbmZvcm1hdGlvbiBmb3IgaW5ldDZfY3JlYXRlLiAgKi8KIAlmb3IociA9ICZpbmV0c3c2WzBdOyByIDwgJmluZXRzdzZbU09DS19NQVhdOyArK3IpCkBAIC04MzcsNiArODQ2LDggQEAKIAkJZ290byBwcm9jX3RjcDZfZmFpbDsKIAlpZiAodWRwNl9wcm9jX2luaXQoKSkKIAkJZ290byBwcm9jX3VkcDZfZmFpbDsKKwlpZiAodWRwbGl0ZTZfcHJvY19pbml0KCkpCisJCWdvdG8gcHJvY191ZHBsaXRlNl9mYWlsOwogCWlmIChpcHY2X21pc2NfcHJvY19pbml0KCkpCiAJCWdvdG8gcHJvY19taXNjNl9mYWlsOwogCkBAIC04NjIsNiArODczLDcgQEAKIAogCS8qIEluaXQgdjYgdHJhbnNwb3J0IHByb3RvY29scy4gKi8KIAl1ZHB2Nl9pbml0KCk7CisJdWRwbGl0ZXY2X2luaXQoKTsKIAl0Y3B2Nl9pbml0KCk7CiAKIAlpcHY2X3BhY2tldF9pbml0KCk7CkBAIC04NzksNiArODkxLDggQEAKIHByb2NfYW55Y2FzdDZfZmFpbDoKIAlpcHY2X21pc2NfcHJvY19leGl0KCk7CiBwcm9jX21pc2M2X2ZhaWw6CisJdWRwbGl0ZTZfcHJvY19leGl0KCk7Citwcm9jX3VkcGxpdGU2X2ZhaWw6CiAJdWRwNl9wcm9jX2V4aXQoKTsKIHByb2NfdWRwNl9mYWlsOgogCXRjcDZfcHJvY19leGl0KCk7CkBAIC05MDIsNiArOTE2LDggQEAKIAlzb2NrX3VucmVnaXN0ZXIoUEZfSU5FVDYpOwogb3V0X3VucmVnaXN0ZXJfcmF3X3Byb3RvOgogCXByb3RvX3VucmVnaXN0ZXIoJnJhd3Y2X3Byb3QpOworb3V0X3VucmVnaXN0ZXJfdWRwbGl0ZV9wcm90bzoKKwlwcm90b191bnJlZ2lzdGVyKCZ1ZHBsaXRldjZfcHJvdCk7CiBvdXRfdW5yZWdpc3Rlcl91ZHBfcHJvdG86CiAJcHJvdG9fdW5yZWdpc3RlcigmdWRwdjZfcHJvdCk7CiBvdXRfdW5yZWdpc3Rlcl90Y3BfcHJvdG86CkBAIC05MTksNiArOTM1LDcgQEAKIAlhYzZfcHJvY19leGl0KCk7CiAgCWlwdjZfbWlzY19wcm9jX2V4aXQoKTsKICAJdWRwNl9wcm9jX2V4aXQoKTsKKyAJdWRwbGl0ZTZfcHJvY19leGl0KCk7CiAgCXRjcDZfcHJvY19leGl0KCk7CiAgCXJhdzZfcHJvY19leGl0KCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FoNi5jIGIvbmV0L2lwdjYvYWg2LmMKaW5kZXggYjBkODNlOC4uMTJjNWE0ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWg2LmMKKysrIGIvbmV0L2lwdjYvYWg2LmMKQEAgLTM1NCwxMCArMzU0LDkgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBhaF9obGVuKSkKIAkJZ290byBvdXQ7CiAKLQl0bXBfaGRyID0ga21hbGxvYyhoZHJfbGVuLCBHRlBfQVRPTUlDKTsKKwl0bXBfaGRyID0ga21lbWR1cChza2ItPm5oLnJhdywgaGRyX2xlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0bXBfaGRyKQogCQlnb3RvIG91dDsKLQltZW1jcHkodG1wX2hkciwgc2tiLT5uaC5yYXcsIGhkcl9sZW4pOwogCWlmIChpcHY2X2NsZWFyX211dGFibGVfb3B0aW9ucyhza2ItPm5oLmlwdjZoLCBoZHJfbGVuLCBYRlJNX1BPTElDWV9JTikpCiAJCWdvdG8gZnJlZV9vdXQ7CiAJc2tiLT5uaC5pcHY2aC0+cHJpb3JpdHkgICAgPSAwOwpAQCAtMzk3LDcgKzM5Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGFoNl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsIAotICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fdTMyIGluZm8pCisgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwaCA9IChzdHJ1Y3QgaXB2Nmhkciopc2tiLT5kYXRhOwogCXN0cnVjdCBpcF9hdXRoX2hkciAqYWggPSAoc3RydWN0IGlwX2F1dGhfaGRyKikoc2tiLT5kYXRhK29mZnNldCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jIGIvbmV0L2lwdjYvZGF0YWdyYW0uYwppbmRleCA3MjA2NzQ3Li41Yzk0ZmVhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jCisrKyBiL25ldC9pcHY2L2RhdGFncmFtLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogfQogCiB2b2lkIGlwdjZfaWNtcF9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBlcnIsIAotCQkgICAgIHUxNiBwb3J0LCB1MzIgaW5mbywgdTggKnBheWxvYWQpCisJCSAgICAgX19iZTE2IHBvcnQsIHUzMiBpbmZvLCB1OCAqcGF5bG9hZCkKIHsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBpY21wNmhkciAqaWNtcGggPSAoc3RydWN0IGljbXA2aGRyICopc2tiLT5oLnJhdzsKQEAgLTMxOCwxMyArMzE4LDEzIEBACiAJCQlpcHY2X2FkZHJfY29weSgmc2luLT5zaW42X2FkZHIsCiAJCQkgIChzdHJ1Y3QgaW42X2FkZHIgKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCkpOwogCQkJaWYgKG5wLT5zbmRmbG93KQotCQkJCXNpbi0+c2luNl9mbG93aW5mbyA9ICoodTMyKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCAtIDI0KSAmIElQVjZfRkxPV0lORk9fTUFTSzsKKwkJCQlzaW4tPnNpbjZfZmxvd2luZm8gPSAqKF9fYmUzMiopKHNrYi0+bmgucmF3ICsgc2Vyci0+YWRkcl9vZmZzZXQgLSAyNCkgJiBJUFY2X0ZMT1dJTkZPX01BU0s7CiAJCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCiAJCQkJc2luLT5zaW42X3Njb3BlX2lkID0gSVA2Q0Ioc2tiKS0+aWlmOwogCQl9IGVsc2UgewogCQkJaXB2Nl9hZGRyX3NldCgmc2luLT5zaW42X2FkZHIsIDAsIDAsCiAJCQkJICAgICAgaHRvbmwoMHhmZmZmKSwKLQkJCQkgICAgICAqKHUzMiopKHNrYi0+bmgucmF3ICsgc2Vyci0+YWRkcl9vZmZzZXQpKTsKKwkJCQkgICAgICAqKF9fYmUzMiopKHNrYi0+bmgucmF3ICsgc2Vyci0+YWRkcl9vZmZzZXQpKTsKIAkJfQogCX0KIApAQCAtMzk3LDEyICszOTcsMTIgQEAKIAl9CiAKIAlpZiAobnAtPnJ4b3B0LmJpdHMucnh0Y2xhc3MpIHsKLQkJaW50IHRjbGFzcyA9IChudG9obCgqKHUzMiAqKXNrYi0+bmguaXB2NmgpID4+IDIwKSAmIDB4ZmY7CisJCWludCB0Y2xhc3MgPSAobnRvaGwoKihfX2JlMzIgKilza2ItPm5oLmlwdjZoKSA+PiAyMCkgJiAweGZmOwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2X1RDTEFTUywgc2l6ZW9mKHRjbGFzcyksICZ0Y2xhc3MpOwogCX0KIAotCWlmIChucC0+cnhvcHQuYml0cy5yeGZsb3cgJiYgKCoodTMyKilza2ItPm5oLnJhdyAmIElQVjZfRkxPV0lORk9fTUFTSykpIHsKLQkJdTMyIGZsb3dpbmZvID0gKih1MzIqKXNrYi0+bmgucmF3ICYgSVBWNl9GTE9XSU5GT19NQVNLOworCWlmIChucC0+cnhvcHQuYml0cy5yeGZsb3cgJiYgKCooX19iZTMyKilza2ItPm5oLnJhdyAmIElQVjZfRkxPV0lORk9fTUFTSykpIHsKKwkJX19iZTMyIGZsb3dpbmZvID0gKihfX2JlMzIqKXNrYi0+bmgucmF3ICYgSVBWNl9GTE9XSU5GT19NQVNLOwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2X0ZMT1dJTkZPLCBzaXplb2YoZmxvd2luZm8pLCAmZmxvd2luZm8pOwogCX0KIApAQCAtNTYwLDEyICs1NjAsMTIgQEAKIAkJCX0KIAogCQkJaWYgKGZsLT5mbDZfZmxvd2xhYmVsJklQVjZfRkxPV0lORk9fTUFTSykgewotCQkJCWlmICgoZmwtPmZsNl9mbG93bGFiZWxeKih1MzIgKilDTVNHX0RBVEEoY21zZykpJn5JUFY2X0ZMT1dJTkZPX01BU0spIHsKKwkJCQlpZiAoKGZsLT5mbDZfZmxvd2xhYmVsXiooX19iZTMyICopQ01TR19EQVRBKGNtc2cpKSZ+SVBWNl9GTE9XSU5GT19NQVNLKSB7CiAJCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJCWdvdG8gZXhpdF9mOwogCQkJCX0KIAkJCX0KLQkJCWZsLT5mbDZfZmxvd2xhYmVsID0gSVBWNl9GTE9XSU5GT19NQVNLICYgKih1MzIgKilDTVNHX0RBVEEoY21zZyk7CisJCQlmbC0+Zmw2X2Zsb3dsYWJlbCA9IElQVjZfRkxPV0lORk9fTUFTSyAmICooX19iZTMyICopQ01TR19EQVRBKGNtc2cpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJUFY2XzIyOTJIT1BPUFRTOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXNwNi5jIGIvbmV0L2lwdjYvZXNwNi5jCmluZGV4IGU3ODY4MGEuLjI1ZGNmNjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2VzcDYuYworKysgYi9uZXQvaXB2Ni9lc3A2LmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBlc3A2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLSAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwaCA9IChzdHJ1Y3QgaXB2Nmhkciopc2tiLT5kYXRhOwogCXN0cnVjdCBpcHY2X2VzcF9oZHIgKmVzcGggPSAoc3RydWN0IGlwdjZfZXNwX2hkciopKHNrYi0+ZGF0YStvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXh0aGRycy5jIGIvbmV0L2lwdjYvZXh0aGRycy5jCmluZGV4IDg4Yzk2YjEuLjA3MTFmOTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2V4dGhkcnMuYworKysgYi9uZXQvaXB2Ni9leHRoZHJzLmMKQEAgLTI4NCwxMCArMjg0LDEyIEBACiAjaWZkZWYgQ09ORklHX0lQVjZfTUlQNgogCV9fdTE2IGRzdGJ1ZjsKICNlbmRpZgorCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrOCkgfHwKIAkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdy1za2ItPmRhdGEpKygoc2tiLT5oLnJhd1sxXSsxKTw8MykpKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yOTgsNyArMzAwLDkgQEAKIAlkc3RidWYgPSBvcHQtPmRzdDE7CiAjZW5kaWYKIAorCWRzdCA9IGRzdF9jbG9uZShza2ItPmRzdCk7CiAJaWYgKGlwNl9wYXJzZV90bHYodGx2cHJvY2Rlc3RvcHRfbHN0LCBza2JwKSkgeworCQlkc3RfcmVsZWFzZShkc3QpOwogCQlza2IgPSAqc2ticDsKIAkJc2tiLT5oLnJhdyArPSAoKHNrYi0+aC5yYXdbMV0rMSk8PDMpOwogCQlvcHQgPSBJUDZDQihza2IpOwpAQCAtMzEwLDcgKzMxNCw4IEBACiAJCXJldHVybiAxOwogCX0KIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwlkc3RfcmVsZWFzZShkc3QpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMzY1LDcgKzM3MCw4IEBACiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdy1za2ItPmRhdGEpKzgpIHx8CiAJICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXctc2tiLT5kYXRhKSsoKHNrYi0+aC5yYXdbMV0rMSk8PDMpKSkgewotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzc0LDcgKzM4MCw4IEBACiAKIAlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpIHx8CiAJICAgIHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QpIHsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzg4LDcgKzM5NSw4IEBACiAJCQkgKiBwcm9jZXNzZWQgYnkgb3duCiAJCQkgKi8KIAkJCWlmICghYWRkcikgewotCQkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKKwkJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJCQkgSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKIAkJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCQlyZXR1cm4gLTE7CiAJCQl9CkBAIC00MTAsNyArNDE4LDggQEAKIAlzd2l0Y2ggKGhkci0+dHlwZSkgewogCWNhc2UgSVBWNl9TUkNSVF9UWVBFXzA6CiAJCWlmIChoZHItPmhkcmxlbiAmIDB4MDEpIHsKLQkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCAoJmhkci0+aGRybGVuKSAtIHNrYi0+bmgucmF3KTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtNDE5LDE0ICs0MjgsMTYgQEAKIAljYXNlIElQVjZfU1JDUlRfVFlQRV8yOgogCQkvKiBTaWxlbnRseSBkaXNjYXJkIGludmFsaWQgUlRIIHR5cGUgMiAqLwogCQlpZiAoaGRyLT5oZHJsZW4gIT0gMiB8fCBoZHItPnNlZ21lbnRzX2xlZnQgIT0gMSkgewotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCAoJmhkci0+dHlwZSkgLSBza2ItPm5oLnJhdyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC00MzksNyArNDUwLDggQEAKIAluID0gaGRyLT5oZHJsZW4gPj4gMTsKIAogCWlmIChoZHItPnNlZ21lbnRzX2xlZnQgPiBuKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCAoJmhkci0+c2VnbWVudHNfbGVmdCkgLSBza2ItPm5oLnJhdyk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC00NDksMTIgKzQ2MSwxNCBAQAogCSAqLwogCWlmIChza2JfY2xvbmVkKHNrYikpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOwotCQlrZnJlZV9za2Ioc2tiKTsKIAkJLyogdGhlIGNvcHkgaXMgYSBmb3J3YXJkZWQgcGFja2V0ICovCiAJCWlmIChza2IyID09IE5VTEwpIHsKLQkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwkKKwkJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkJIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIC0xOwogCQl9CisJCWtmcmVlX3NrYihza2IpOwogCQkqc2ticCA9IHNrYiA9IHNrYjI7CiAJCW9wdCA9IElQNkNCKHNrYjIpOwogCQloZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopIHNrYjItPmgucmF3OwpAQCAtNDc1LDEyICs0ODksMTQgQEAKIAkJaWYgKHhmcm02X2lucHV0X2FkZHIoc2tiLCAoeGZybV9hZGRyZXNzX3QgKilhZGRyLAogCQkJCSAgICAgKHhmcm1fYWRkcmVzc190ICopJnNrYi0+bmguaXB2NmgtPnNhZGRyLAogCQkJCSAgICAgSVBQUk9UT19ST1VUSU5HKSA8IDApIHsKLQkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkJIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlpZiAoIWlwdjZfY2hrX2hvbWVfYWRkcihhZGRyKSkgewotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJCQkgSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC00OTEsNyArNTA3LDggQEAKIAl9CiAKIAlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdChhZGRyKSkgewotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkgSVBTVEFUU19NSUJfSU5BRERSRVJST1JTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC01MTAsNyArNTI3LDggQEAKIAogCWlmIChza2ItPmRzdC0+ZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spIHsKIAkJaWYgKHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCA8PSAxKSB7Ci0JCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1RJTUVfRVhDRUVELCBJQ01QVjZfRVhDX0hPUExJTUlULAogCQkJCSAgICAwLCBza2ItPmRldik7CiAJCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTYzMiwyNCArNjUwLDI1IEBACiAJaWYgKHNrYi0+bmgucmF3W29wdG9mZisxXSAhPSA0IHx8IChvcHRvZmYmMykgIT0gMikgewogCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpcHY2X2hvcF9qdW1ibzogd3JvbmcganVtYm8gb3B0IGxlbmd0aC9hbGlnbm1lbnQgJWRcbiIsCiAJCSAgICAgICAgICAgICAgIHNrYi0+bmgucmF3W29wdG9mZisxXSk7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJZ290byBkcm9wOwogCX0KIAotCXBrdF9sZW4gPSBudG9obCgqKHUzMiopKHNrYi0+bmgucmF3K29wdG9mZisyKSk7CisJcGt0X2xlbiA9IG50b2hsKCooX19iZTMyKikoc2tiLT5uaC5yYXcrb3B0b2ZmKzIpKTsKIAlpZiAocGt0X2xlbiA8PSBJUFY2X01BWFBMRU4pIHsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIG9wdG9mZisyKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikgewotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgb3B0b2ZmKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHBrdF9sZW4gPiBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpIHsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTlRSVU5DQVRFRFBLVFMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CiAJCWdvdG8gZHJvcDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2V4dGhkcnNfY29yZS5jIGIvbmV0L2lwdjYvZXh0aGRyc19jb3JlLmMKaW5kZXggMzE1YmMxZi4uMjFjYmJiZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXh0aGRyc19jb3JlLmMKKysrIGIvbmV0L2lwdjYvZXh0aGRyc19jb3JlLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkJaWYgKGhwID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7CiAJCWlmIChuZXh0aGRyID09IE5FWFRIRFJfRlJBR01FTlQpIHsKLQkJCXVuc2lnbmVkIHNob3J0IF9mcmFnX29mZiwgKmZwOworCQkJX19iZTE2IF9mcmFnX29mZiwgKmZwOwogCQkJZnAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAogCQkJCQkJc3RhcnQrb2Zmc2V0b2Yoc3RydWN0IGZyYWdfaGRyLAogCQkJCQkJCSAgICAgICBmcmFnX29mZiksCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9maWI2X3J1bGVzLmMgYi9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKaW5kZXggZDhjMTA1Ny4uMDg2MjgwOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZmliNl9ydWxlcy5jCisrKyBiL25ldC9pcHY2L2ZpYjZfcnVsZXMuYwpAQCAtMjUsMTAgKzI1LDYgQEAKIAlzdHJ1Y3QgZmliX3J1bGUJCWNvbW1vbjsKIAlzdHJ1Y3QgcnQ2a2V5CQlzcmM7CiAJc3RydWN0IHJ0NmtleQkJZHN0OwotI2lmZGVmIENPTkZJR19JUFY2X1JPVVRFX0ZXTUFSSwotCXUzMgkJCWZ3bWFyazsKLQl1MzIJCQlmd21hc2s7Ci0jZW5kaWYKIAl1OAkJCXRjbGFzczsKIH07CiAKQEAgLTY3LDcgKzYzLDcgQEAKIAkJZmliX3J1bGVfcHV0KGFyZy5ydWxlKTsKIAogCWlmIChhcmcucmVzdWx0KQotCQlyZXR1cm4gKHN0cnVjdCBkc3RfZW50cnkgKikgYXJnLnJlc3VsdDsKKwkJcmV0dXJuIGFyZy5yZXN1bHQ7CiAKIAlkc3RfaG9sZCgmaXA2X251bGxfZW50cnkudS5kc3QpOwogCXJldHVybiAmaXA2X251bGxfZW50cnkudS5kc3Q7CkBAIC0xMTcsMzIgKzExMywyNiBAQAogewogCXN0cnVjdCBmaWI2X3J1bGUgKnIgPSAoc3RydWN0IGZpYjZfcnVsZSAqKSBydWxlOwogCi0JaWYgKCFpcHY2X3ByZWZpeF9lcXVhbCgmZmwtPmZsNl9kc3QsICZyLT5kc3QuYWRkciwgci0+ZHN0LnBsZW4pKQorCWlmIChyLT5kc3QucGxlbiAmJgorCSAgICAhaXB2Nl9wcmVmaXhfZXF1YWwoJmZsLT5mbDZfZHN0LCAmci0+ZHN0LmFkZHIsIHItPmRzdC5wbGVuKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoKGZsYWdzICYgUlQ2X0xPT0tVUF9GX0hBU19TQUREUikgJiYKLQkgICAgIWlwdjZfcHJlZml4X2VxdWFsKCZmbC0+Zmw2X3NyYywgJnItPnNyYy5hZGRyLCByLT5zcmMucGxlbikpCi0JCXJldHVybiAwOworCWlmIChyLT5zcmMucGxlbikgeworCQlpZiAoIShmbGFncyAmIFJUNl9MT09LVVBfRl9IQVNfU0FERFIpIHx8CisJCSAgICAhaXB2Nl9wcmVmaXhfZXF1YWwoJmZsLT5mbDZfc3JjLCAmci0+c3JjLmFkZHIsIHItPnNyYy5wbGVuKSkKKwkJCXJldHVybiAwOworCX0KIAogCWlmIChyLT50Y2xhc3MgJiYgci0+dGNsYXNzICE9ICgobnRvaGwoZmwtPmZsNl9mbG93bGFiZWwpID4+IDIwKSAmIDB4ZmYpKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19JUFY2X1JPVVRFX0ZXTUFSSwotCWlmICgoci0+ZndtYXJrIF4gZmwtPmZsNl9md21hcmspICYgci0+ZndtYXNrKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCiAJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmxhX3BvbGljeSBmaWI2X3J1bGVfcG9saWN5W0ZSQV9NQVgrMV0gX19yZWFkX21vc3RseSA9IHsKLQlbRlJBX0lGTkFNRV0JPSB7IC50eXBlID0gTkxBX1NUUklORywgLmxlbiA9IElGTkFNU0laIC0gMSB9LAotCVtGUkFfUFJJT1JJVFldCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlGUkFfR0VORVJJQ19QT0xJQ1ksCiAJW0ZSQV9TUkNdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgfSwKIAlbRlJBX0RTVF0JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAotCVtGUkFfRldNQVJLXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCi0JW0ZSQV9GV01BU0tdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKLQlbRlJBX1RBQkxFXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCiBzdGF0aWMgaW50IGZpYjZfcnVsZV9jb25maWd1cmUoc3RydWN0IGZpYl9ydWxlICpydWxlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTUyLDggKzE0Miw3IEBACiAJaW50IGVyciA9IC1FSU5WQUw7CiAJc3RydWN0IGZpYjZfcnVsZSAqcnVsZTYgPSAoc3RydWN0IGZpYjZfcnVsZSAqKSBydWxlOwogCi0JaWYgKGZyaC0+c3JjX2xlbiA+IDEyOCB8fCBmcmgtPmRzdF9sZW4gPiAxMjggfHwKLQkgICAgKGZyaC0+dG9zICYgfklQVjZfRkxPV0lORk9fTUFTSykpCisJaWYgKGZyaC0+c3JjX2xlbiA+IDEyOCB8fCBmcmgtPmRzdF9sZW4gPiAxMjgpCiAJCWdvdG8gZXJyb3V0OwogCiAJaWYgKHJ1bGUtPmFjdGlvbiA9PSBGUl9BQ1RfVE9fVEJMKSB7CkBAIC0xNzQsMjMgKzE2Myw2IEBACiAJCW5sYV9tZW1jcHkoJnJ1bGU2LT5kc3QuYWRkciwgdGJbRlJBX0RTVF0sCiAJCQkgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiAKLSNpZmRlZiBDT05GSUdfSVBWNl9ST1VURV9GV01BUksKLQlpZiAodGJbRlJBX0ZXTUFSS10pIHsKLQkJcnVsZTYtPmZ3bWFyayA9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BUktdKTsKLQkJaWYgKHJ1bGU2LT5md21hcmspIHsKLQkJCS8qCi0JCQkgKiBpZiB0aGUgbWFyayB2YWx1ZSBpcyBub24temVybywKLQkJCSAqIGFsbCBiaXRzIGFyZSBjb21wYXJlZCBieSBkZWZhdWx0Ci0JCQkgKiB1bmxlc3MgYSBtYXNrIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotCQkJICovCi0JCQlydWxlNi0+ZndtYXNrID0gMHhGRkZGRkZGRjsKLQkJfQotCX0KLQotCWlmICh0YltGUkFfRldNQVNLXSkKLQkJcnVsZTYtPmZ3bWFzayA9IG5sYV9nZXRfdTMyKHRiW0ZSQV9GV01BU0tdKTsKLSNlbmRpZgotCiAJcnVsZTYtPnNyYy5wbGVuID0gZnJoLT5zcmNfbGVuOwogCXJ1bGU2LT5kc3QucGxlbiA9IGZyaC0+ZHN0X2xlbjsKIAlydWxlNi0+dGNsYXNzID0gZnJoLT50b3M7CkBAIC0yMjIsMTQgKzE5NCw2IEBACiAJICAgIG5sYV9tZW1jbXAodGJbRlJBX0RTVF0sICZydWxlNi0+ZHN0LmFkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfSVBWNl9ST1VURV9GV01BUksKLQlpZiAodGJbRlJBX0ZXTUFSS10gJiYgKHJ1bGU2LT5md21hcmsgIT0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFSS10pKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodGJbRlJBX0ZXTUFTS10gJiYgKHJ1bGU2LT5md21hc2sgIT0gbmxhX2dldF91MzIodGJbRlJBX0ZXTUFTS10pKSkKLQkJcmV0dXJuIDA7Ci0jZW5kaWYKLQogCXJldHVybiAxOwogfQogCkBAIC0yNTEsMTQgKzIxNSw2IEBACiAJCU5MQV9QVVQoc2tiLCBGUkFfU1JDLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKIAkJCSZydWxlNi0+c3JjLmFkZHIpOwogCi0jaWZkZWYgQ09ORklHX0lQVjZfUk9VVEVfRldNQVJLCi0JaWYgKHJ1bGU2LT5md21hcmspCi0JCU5MQV9QVVRfVTMyKHNrYiwgRlJBX0ZXTUFSSywgcnVsZTYtPmZ3bWFyayk7Ci0KLQlpZiAocnVsZTYtPmZ3bWFzayB8fCBydWxlNi0+ZndtYXJrKQotCQlOTEFfUFVUX1UzMihza2IsIEZSQV9GV01BU0ssIHJ1bGU2LT5md21hc2spOwotI2VuZGlmCi0KIAlyZXR1cm4gMDsKIAogbmxhX3B1dF9mYWlsdXJlOgpAQCAtMjc1LDYgKzIzMSwxMiBAQAogCXJldHVybiAweDNGRkY7CiB9CiAKK3N0YXRpYyBzaXplX3QgZmliNl9ydWxlX25sbXNnX3BheWxvYWQoc3RydWN0IGZpYl9ydWxlICpydWxlKQoreworCXJldHVybiBubGFfdG90YWxfc2l6ZSgxNikgLyogZHN0ICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMTYpOyAvKiBzcmMgKi8KK30KKwogc3RhdGljIHN0cnVjdCBmaWJfcnVsZXNfb3BzIGZpYjZfcnVsZXNfb3BzID0gewogCS5mYW1pbHkJCQk9IEFGX0lORVQ2LAogCS5ydWxlX3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBmaWI2X3J1bGUpLApAQCAtMjg0LDYgKzI0Niw3IEBACiAJLmNvbXBhcmUJCT0gZmliNl9ydWxlX2NvbXBhcmUsCiAJLmZpbGwJCQk9IGZpYjZfcnVsZV9maWxsLAogCS5kZWZhdWx0X3ByZWYJCT0gZmliNl9ydWxlX2RlZmF1bHRfcHJlZiwKKwkubmxtc2dfcGF5bG9hZAkJPSBmaWI2X3J1bGVfbmxtc2dfcGF5bG9hZCwKIAkubmxncm91cAkJPSBSVE5MR1JQX0lQVjZfUlVMRSwKIAkucG9saWN5CQkJPSBmaWI2X3J1bGVfcG9saWN5LAogCS5ydWxlc19saXN0CQk9ICZmaWI2X3J1bGVzLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaWNtcC5jIGIvbmV0L2lwdjYvaWNtcC5jCmluZGV4IDRlYzg3NjAuLjNkY2M0YjcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2ljbXAuYworKysgYi9uZXQvaXB2Ni9pY21wLmMKQEAgLTE3Nyw3ICsxNzcsOCBAQAogCSAqLwogCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoc2ssIGZsKTsKIAlpZiAoZHN0LT5lcnJvcikgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoZHN0KSwKKwkJCSAgICAgIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKIAl9IGVsc2UgaWYgKGRzdC0+ZGV2ICYmIChkc3QtPmRldi0+ZmxhZ3MmSUZGX0xPT1BCQUNLKSkgewogCQlyZXMgPSAxOwogCX0gZWxzZSB7CkBAIC0yMzMsNyArMjM0LDcgQEAKIAkJCQkJCSAgICAgIGxlbiwgZmwtPnByb3RvLAogCQkJCQkJICAgICAgc2tiLT5jc3VtKTsKIAl9IGVsc2UgewotCQl1MzIgdG1wX2NzdW0gPSAwOworCQlfX3dzdW0gdG1wX2NzdW0gPSAwOwogCiAJCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYikgewogCQkJdG1wX2NzdW0gPSBjc3VtX2FkZCh0bXBfY3N1bSwgc2tiLT5jc3VtKTsKQEAgLTI0MSwxMyArMjQyLDExIEBACiAKIAkJdG1wX2NzdW0gPSBjc3VtX3BhcnRpYWwoKGNoYXIgKilpY21wNmgsCiAJCQkJCXNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpLCB0bXBfY3N1bSk7Ci0JCXRtcF9jc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZmbC0+Zmw2X3NyYywKLQkJCQkJICAgJmZsLT5mbDZfZHN0LAotCQkJCQkgICBsZW4sIGZsLT5wcm90bywgdG1wX2NzdW0pOwotCQlpY21wNmgtPmljbXA2X2Nrc3VtID0gdG1wX2NzdW07CisJCWljbXA2aC0+aWNtcDZfY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAorCQkJCQkJICAgICAgJmZsLT5mbDZfZHN0LAorCQkJCQkJICAgICAgbGVuLCBmbC0+cHJvdG8sCisJCQkJCQkgICAgICB0bXBfY3N1bSk7CiAJfQotCWlmIChpY21wNmgtPmljbXA2X2Nrc3VtID09IDApCi0JCWljbXA2aC0+aWNtcDZfY2tzdW0gPSAtMTsKIAlpcDZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKQEAgLTI2Myw3ICsyNjIsNyBAQAogewogCXN0cnVjdCBpY21wdjZfbXNnICptc2cgPSAoc3RydWN0IGljbXB2Nl9tc2cgKikgZnJvbTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqb3JnX3NrYiA9IG1zZy0+c2tiOwotCV9fdTMyIGNzdW0gPSAwOworCV9fd3N1bSBjc3VtID0gMDsKIAogCWNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKG9yZ19za2IsIG1zZy0+b2Zmc2V0ICsgb2Zmc2V0LAogCQkJCSAgICAgIHRvLCBsZW4sIGNzdW0pOwpAQCAtNTU1LDcgKzU1NCw3IEBACiAJaWNtcHY2X3htaXRfdW5sb2NrKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGljbXB2Nl9ub3RpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHR5cGUsIGludCBjb2RlLCB1MzIgaW5mbykKK3N0YXRpYyB2b2lkIGljbXB2Nl9ub3RpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHR5cGUsIGludCBjb2RlLCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCAqZGFkZHI7CiAJc3RydWN0IGluZXQ2X3Byb3RvY29sICppcHByb3Q7CkBAIC02MzcsOCArNjM2LDggQEAKIAkJCWJyZWFrOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIENIRUNLU1VNX05PTkU6Ci0JCXNrYi0+Y3N1bSA9IH5jc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBza2ItPmxlbiwKLQkJCQkJICAgICBJUFBST1RPX0lDTVBWNiwgMCk7CisJCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZChjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBza2ItPmxlbiwKKwkJCQkJICAgICBJUFBST1RPX0lDTVBWNiwgMCkpOwogCQlpZiAoX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewogCQkJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAiSUNNUHY2IGNoZWNrc3VtIGZhaWxlZCBbIiBOSVA2X0ZNVCAiID4gIiBOSVA2X0ZNVCAiXVxuIiwKIAkJCQkgICAgICAgTklQNigqc2FkZHIpLCBOSVA2KCpkYWRkcikpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmMgYi9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYwppbmRleCA4MjdmNDFkLi5jNzAwMzAyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYworKysgYi9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYwpAQCAtNTIsMjAgKzUyLDIwIEBACiAvKgogICogcmVxdWVzdF9zb2NrIChmb3JtZXJseSBvcGVuIHJlcXVlc3QpIGhhc2ggdGFibGVzLgogICovCi1zdGF0aWMgdTMyIGluZXQ2X3N5bnFfaGFzaChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnJhZGRyLCBjb25zdCB1MTYgcnBvcnQsCitzdGF0aWMgdTMyIGluZXQ2X3N5bnFfaGFzaChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnJhZGRyLCBjb25zdCBfX2JlMTYgcnBvcnQsCiAJCQkgICBjb25zdCB1MzIgcm5kLCBjb25zdCB1MTYgc3lucV9oc2l6ZSkKIHsKLQl1MzIgYSA9IHJhZGRyLT5zNl9hZGRyMzJbMF07Ci0JdTMyIGIgPSByYWRkci0+czZfYWRkcjMyWzFdOwotCXUzMiBjID0gcmFkZHItPnM2X2FkZHIzMlsyXTsKKwl1MzIgYSA9IChfX2ZvcmNlIHUzMilyYWRkci0+czZfYWRkcjMyWzBdOworCXUzMiBiID0gKF9fZm9yY2UgdTMyKXJhZGRyLT5zNl9hZGRyMzJbMV07CisJdTMyIGMgPSAoX19mb3JjZSB1MzIpcmFkZHItPnM2X2FkZHIzMlsyXTsKIAogCWEgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWIgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWMgKz0gcm5kOwogCV9famhhc2hfbWl4KGEsIGIsIGMpOwogCi0JYSArPSByYWRkci0+czZfYWRkcjMyWzNdOwotCWIgKz0gKHUzMilycG9ydDsKKwlhICs9IChfX2ZvcmNlIHUzMilyYWRkci0+czZfYWRkcjMyWzNdOworCWIgKz0gKF9fZm9yY2UgdTMyKXJwb3J0OwogCV9famhhc2hfbWl4KGEsIGIsIGMpOwogCiAJcmV0dXJuIGMgJiAoc3lucV9oc2l6ZSAtIDEpOwpAQCAtNzMsNyArNzMsNyBAQAogCiBzdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0Nl9jc2tfc2VhcmNoX3JlcShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSAgc3RydWN0IHJlcXVlc3Rfc29jayAqKipwcmV2cCwKLQkJCQkJICBjb25zdCBfX3UxNiBycG9ydCwKKwkJCQkJICBjb25zdCBfX2JlMTYgcnBvcnQsCiAJCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpyYWRkciwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmxhZGRyLAogCQkJCQkgIGNvbnN0IGludCBpaWYpCkBAIC0xMzksOSArMTM5LDggQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldDZfY3NrX2FkZHIyc29ja2FkZHIpOwogCi1pbnQgaW5ldDZfY3NrX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGlwZnJhZ29rKQoraW50IGluZXQ2X2Nza194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywgaW50IGlwZnJhZ29rKQogewotCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKIAlzdHJ1Y3QgZmxvd2kgZmw7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pbmV0Nl9oYXNodGFibGVzLmMgYi9uZXQvaXB2Ni9pbmV0Nl9oYXNodGFibGVzLmMKaW5kZXggOGFjY2QxZi4uYjdlNWJhZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jCisrKyBiL25ldC9pcHY2L2luZXQ2X2hhc2h0YWJsZXMuYwpAQCAtNTcsNyArNTcsNyBAQAogICovCiBzdHJ1Y3Qgc29jayAqX19pbmV0Nl9sb29rdXBfZXN0YWJsaXNoZWQoc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAogCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAotCQkJCQkgICBjb25zdCB1MTYgc3BvcnQsCisJCQkJCSAgIGNvbnN0IF9fYmUxNiBzcG9ydCwKIAkJCQkJICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKIAkJCQkJICAgY29uc3QgdTE2IGhudW0sCiAJCQkJCSAgIGNvbnN0IGludCBkaWYpCkBAIC0xNDYsOCArMTQ2LDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGluZXQ2X2xvb2t1cF9saXN0ZW5lcik7CiAKIHN0cnVjdCBzb2NrICppbmV0Nl9sb29rdXAoc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAotCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBjb25zdCB1MTYgc3BvcnQsCi0JCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIGNvbnN0IHUxNiBkcG9ydCwKKwkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3QgX19iZTE2IHNwb3J0LAorCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBjb25zdCBfX2JlMTYgZHBvcnQsCiAJCQkgIGNvbnN0IGludCBkaWYpCiB7CiAJc3RydWN0IHNvY2sgKnNrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2ZpYi5jIGIvbmV0L2lwdjYvaXA2X2ZpYi5jCmluZGV4IDhmY2FlN2EuLjk2ZDgzMTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9maWIuYworKysgYi9uZXQvaXB2Ni9pcDZfZmliLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAogc3RydWN0IHJ0Nl9zdGF0aXN0aWNzCXJ0Nl9zdGF0czsKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqIGZpYjZfbm9kZV9rbWVtIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKiBmaWI2X25vZGVfa21lbSBfX3JlYWRfbW9zdGx5OwogCiBlbnVtIGZpYl93YWxrX3N0YXRlX3QKIHsKQEAgLTEzOSw5ICsxMzksOSBAQAogICoJdGVzdCBiaXQKICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgYWRkcl9iaXRfc2V0KHZvaWQgKnRva2VuLCBpbnQgZm5fYml0KQorc3RhdGljIF9faW5saW5lX18gX19iZTMyIGFkZHJfYml0X3NldCh2b2lkICp0b2tlbiwgaW50IGZuX2JpdCkKIHsKLQlfX3UzMiAqYWRkciA9IHRva2VuOworCV9fYmUzMiAqYWRkciA9IHRva2VuOwogCiAJcmV0dXJuIGh0b25sKDEgPDwgKCh+Zm5fYml0KSYweDFGKSkgJiBhZGRyW2ZuX2JpdD4+NV07CiB9CkBAIC0xNTAsNyArMTUwLDcgQEAKIHsKIAlzdHJ1Y3QgZmliNl9ub2RlICpmbjsKIAotCWlmICgoZm4gPSBrbWVtX2NhY2hlX2FsbG9jKGZpYjZfbm9kZV9rbWVtLCBTTEFCX0FUT01JQykpICE9IE5VTEwpCisJaWYgKChmbiA9IGttZW1fY2FjaGVfYWxsb2MoZmliNl9ub2RlX2ttZW0sIEdGUF9BVE9NSUMpKSAhPSBOVUxMKQogCQltZW1zZXQoZm4sIDAsIHNpemVvZihzdHJ1Y3QgZmliNl9ub2RlKSk7CiAKIAlyZXR1cm4gZm47CkBAIC0xNjksNyArMTY5LDYgQEAKIAogc3RhdGljIHN0cnVjdCBmaWI2X3RhYmxlIGZpYjZfbWFpbl90YmwgPSB7CiAJLnRiNl9pZAkJPSBSVDZfVEFCTEVfTUFJTiwKLQkudGI2X2xvY2sJPSBSV19MT0NLX1VOTE9DS0VELAogCS50YjZfcm9vdAk9IHsKIAkJLmxlYWYJCT0gJmlwNl9udWxsX2VudHJ5LAogCQkuZm5fZmxhZ3MJPSBSVE5fUk9PVCB8IFJUTl9UTF9ST09UIHwgUlROX1JUSU5GTywKQEAgLTE4Nyw2ICsxODYsMTIgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaDsKIAorCS8qCisJICogSW5pdGlhbGl6ZSB0YWJsZSBsb2NrIGF0IGEgc2luZ2xlIHBsYWNlIHRvIGdpdmUgbG9ja2RlcCBhIGtleSwKKwkgKiB0YWJsZXMgYXJlbid0IHZpc2libGUgcHJpb3IgdG8gYmVpbmcgbGlua2VkIHRvIHRoZSBsaXN0LgorCSAqLworCXJ3bG9ja19pbml0KCZ0Yi0+dGI2X2xvY2spOworCiAJaCA9IHRiLT50YjZfaWQgJiAoRklCX1RBQkxFX0hBU0hTWiAtIDEpOwogCiAJLyoKQEAgLTE5OSw3ICsyMDQsNiBAQAogI2lmZGVmIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUwogc3RhdGljIHN0cnVjdCBmaWI2X3RhYmxlIGZpYjZfbG9jYWxfdGJsID0gewogCS50YjZfaWQJCT0gUlQ2X1RBQkxFX0xPQ0FMLAotCS50YjZfbG9jawk9IFJXX0xPQ0tfVU5MT0NLRUQsCiAJLnRiNl9yb290IAk9IHsKIAkJLmxlYWYJCT0gJmlwNl9udWxsX2VudHJ5LAogCQkuZm5fZmxhZ3MJPSBSVE5fUk9PVCB8IFJUTl9UTF9ST09UIHwgUlROX1JUSU5GTywKQEAgLTIxMyw3ICsyMTcsNiBAQAogCXRhYmxlID0ga3phbGxvYyhzaXplb2YoKnRhYmxlKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHRhYmxlICE9IE5VTEwpIHsKIAkJdGFibGUtPnRiNl9pZCA9IGlkOwotCQl0YWJsZS0+dGI2X2xvY2sgPSBSV19MT0NLX1VOTE9DS0VEOwogCQl0YWJsZS0+dGI2X3Jvb3QubGVhZiA9ICZpcDZfbnVsbF9lbnRyeTsKIAkJdGFibGUtPnRiNl9yb290LmZuX2ZsYWdzID0gUlROX1JPT1QgfCBSVE5fVExfUk9PVCB8IFJUTl9SVElORk87CiAJfQpAQCAtNDMxLDcgKzQzNCw3IEBACiAJc3RydWN0IGZpYjZfbm9kZSAqcG4gPSBOVUxMOwogCXN0cnVjdCBydDZrZXkgKmtleTsKIAlpbnQJYml0OwotICAgICAgIAlpbnQJZGlyID0gMDsKKyAgICAgICAJX19iZTMyCWRpciA9IDA7CiAJX191MzIJc2VybnVtID0gZmliNl9uZXdfc2VybnVtKCk7CiAKIAlSVDZfVFJBQ0UoImZpYjZfYWRkXzFcbiIpOwpAQCAtODI2LDcgKzgyOSw3IEBACiAJCQkJCXN0cnVjdCBsb29rdXBfYXJncyAqYXJncykKIHsKIAlzdHJ1Y3QgZmliNl9ub2RlICpmbjsKLQlpbnQgZGlyOworCV9fYmUzMiBkaXI7CiAKIAlpZiAodW5saWtlbHkoYXJncy0+b2Zmc2V0ID09IDApKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwppbmRleCAxZDY3MmIwLi42MjRmYWUyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCkBAIC02MSw3ICs2MSw3IEBACiBzdGF0aWMgREVGSU5FX1JXTE9DSyhpcDZfc2tfZmxfbG9jayk7CiAKIAotc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlwNl9mbG93bGFiZWwgKiBfX2ZsX2xvb2t1cCh1MzIgbGFiZWwpCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqIF9fZmxfbG9va3VwKF9fYmUzMiBsYWJlbCkKIHsKIAlzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqZmw7CiAKQEAgLTcyLDcgKzcyLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcDZfZmxvd2xhYmVsICogZmxfbG9va3VwKHUzMiBsYWJlbCkKK3N0YXRpYyBzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqIGZsX2xvb2t1cChfX2JlMzIgbGFiZWwpCiB7CiAJc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsOwogCkBAIC0xNTMsNyArMTUzLDcgQEAKIAl3cml0ZV91bmxvY2soJmlwNl9mbF9sb2NrKTsKIH0KIAotc3RhdGljIGludCBmbF9pbnRlcm4oc3RydWN0IGlwNl9mbG93bGFiZWwgKmZsLCBfX3UzMiBsYWJlbCkKK3N0YXRpYyBpbnQgZmxfaW50ZXJuKHN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbCwgX19iZTMyIGxhYmVsKQogewogCWZsLT5sYWJlbCA9IGxhYmVsICYgSVBWNl9GTE9XTEFCRUxfTUFTSzsKIApAQCAtMTgyLDcgKzE4Miw3IEBACiAKIC8qIFNvY2tldCBmbG93bGFiZWwgbGlzdHMgKi8KIAotc3RydWN0IGlwNl9mbG93bGFiZWwgKiBmbDZfc29ja19sb29rdXAoc3RydWN0IHNvY2sgKnNrLCB1MzIgbGFiZWwpCitzdHJ1Y3QgaXA2X2Zsb3dsYWJlbCAqIGZsNl9zb2NrX2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssIF9fYmUzMiBsYWJlbCkKIHsKIAlzdHJ1Y3QgaXB2Nl9mbF9zb2NrbGlzdCAqc2ZsOwogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKQEAgLTMzMCw4ICszMzAsMTAgQEAKIAlmbC0+c2hhcmUgPSBmcmVxLT5mbHJfc2hhcmU7CiAJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmZyZXEtPmZscl9kc3QpOwogCWlmICgoYWRkcl90eXBlJklQVjZfQUREUl9NQVBQRUQpCi0JICAgIHx8IGFkZHJfdHlwZSA9PSBJUFY2X0FERFJfQU5ZKQorCSAgICB8fCBhZGRyX3R5cGUgPT0gSVBWNl9BRERSX0FOWSkgeworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CisJfQogCWlwdjZfYWRkcl9jb3B5KCZmbC0+ZHN0LCAmZnJlcS0+ZmxyX2RzdCk7CiAJYXRvbWljX3NldCgmZmwtPnVzZXJzLCAxKTsKIAlzd2l0Y2ggKGZsLT5zaGFyZSkgewpAQCAtNTg3LDYgKzU4OSw4IEBACiAJd2hpbGUgKCFmbCkgewogCQlpZiAoKytzdGF0ZS0+YnVja2V0IDw9IEZMX0hBU0hfTUFTSykKIAkJCWZsID0gZmxfaHRbc3RhdGUtPmJ1Y2tldF07CisJCWVsc2UKKwkJCWJyZWFrOwogCX0KIAlyZXR1cm4gZmw7CiB9CkBAIC02MjMsOSArNjI3LDEzIEBACiAJcmVhZF91bmxvY2tfYmgoJmlwNl9mbF9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgaXA2ZmxfZmxfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbCkKK3N0YXRpYyBpbnQgaXA2Zmxfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0Jd2hpbGUoZmwpIHsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wcmludGYoc2VxLCAiJS01cyAlLTFzICUtNnMgJS02cyAlLTZzICUtOHMgJS0zMnMgJXNcbiIsCisJCQkgICAiTGFiZWwiLCAiUyIsICJPd25lciIsICJVc2VycyIsICJMaW5nZXIiLCAiRXhwaXJlcyIsICJEc3QiLCAiT3B0Iik7CisJZWxzZSB7CisJCXN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbCA9IHY7CiAJCXNlcV9wcmludGYoc2VxLAogCQkJICAgIiUwNVggJS0xZCAlLTZkICUtNmQgJS02bGQgJS04bGQgIiBOSVA2X1NFUUZNVCAiICUtNGRcbiIsCiAJCQkgICAodW5zaWduZWQpbnRvaGwoZmwtPmxhYmVsKSwKQEAgLTYzNiwxNyArNjQ0LDcgQEAKIAkJCSAgIChsb25nKShmbC0+ZXhwaXJlcyAtIGppZmZpZXMpL0haLAogCQkJICAgTklQNihmbC0+ZHN0KSwKIAkJCSAgIGZsLT5vcHQgPyBmbC0+b3B0LT5vcHRfbmZsZW4gOiAwKTsKLQkJZmwgPSBmbC0+bmV4dDsKIAl9Ci19Ci0KLXN0YXRpYyBpbnQgaXA2Zmxfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQotCQlzZXFfcHJpbnRmKHNlcSwgIiUtNXMgJS0xcyAlLTZzICUtNnMgJS02cyAlLThzICUtMzJzICVzXG4iLAotCQkJICAgIkxhYmVsIiwgIlMiLCAiT3duZXIiLCAiVXNlcnMiLCAiTGluZ2VyIiwgIkV4cGlyZXMiLCAiRHN0IiwgIk9wdCIpOwotCWVsc2UKLQkJaXA2ZmxfZmxfc2VxX3Nob3coc2VxLCB2KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2lucHV0LmMgYi9uZXQvaXB2Ni9pcDZfaW5wdXQuYwppbmRleCA2YjhlNmQ3Li5hZDBiOGFiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfaW5wdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfaW5wdXQuYwpAQCAtNjAsMTQgKzYwLDIyIEBACiB7CiAJc3RydWN0IGlwdjZoZHIgKmhkcjsKIAl1MzIgCQlwa3RfbGVuOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAKLQlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKQotCQlnb3RvIGRyb3A7CisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQogCi0JSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTlJFQ0VJVkVTKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlpZGV2ID0gX19pbjZfZGV2X2dldChza2ItPmRldik7CisKKwlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lOUkVDRUlWRVMpOwogCiAJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC04NCw3ICs5Miw3IEBACiAJICogYXJyaXZlZCB2aWEgdGhlIHNlbmRpbmcgaW50ZXJmYWNlIChldGhYKSwgYmVjYXVzZSBvZiB0aGUKIAkgKiBuYXR1cmUgb2Ygc2NvcGluZyBhcmNoaXRlY3R1cmUuIC0teW9zaGZ1amkKIAkgKi8KLQlJUDZDQihza2IpLT5paWYgPSBza2ItPmRzdCA/ICgoc3RydWN0IHJ0Nl9pbmZvICopc2tiLT5kc3QpLT5ydDZpX2lkZXYtPmRldi0+aWZpbmRleCA6IGRldi0+aWZpbmRleDsKKwlJUDZDQihza2IpLT5paWYgPSBza2ItPmRzdCA/IGlwNl9kc3RfaWRldihza2ItPmRzdCktPmRldi0+aWZpbmRleCA6IGRldi0+aWZpbmRleDsKIAogCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaGRyKSkpKQogCQlnb3RvIGVycjsKQEAgLTEwNCw3ICsxMTIsNyBAQAogCQlpZiAocGt0X2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgPiBza2ItPmxlbikKIAkJCWdvdG8gdHJ1bmNhdGVkOwogCQlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwgcGt0X2xlbiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpKSB7Ci0JCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQkJZ290byBkcm9wOwogCQl9CiAJCWhkciA9IHNrYi0+bmguaXB2Nmg7CkBAIC0xMTIsMTcgKzEyMCwyMSBAQAogCiAJaWYgKGhkci0+bmV4dGhkciA9PSBORVhUSERSX0hPUCkgewogCQlpZiAoaXB2Nl9wYXJzZV9ob3BvcHRzKCZza2IpIDwgMCkgewotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKKwlyY3VfcmVhZF91bmxvY2soKTsKKwogCXJldHVybiBORl9IT09LKFBGX0lORVQ2LE5GX0lQNl9QUkVfUk9VVElORywgc2tiLCBkZXYsIE5VTEwsIGlwNl9yY3ZfZmluaXNoKTsKIHRydW5jYXRlZDoKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOVFJVTkNBVEVEUEtUUyk7CisJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9JTlRSVU5DQVRFRFBLVFMpOwogZXJyOgotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogZHJvcDoKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlrZnJlZV9za2Ioc2tiKTsKIG91dDoKIAlyZXR1cm4gMDsKQEAgLTE0MCw2ICsxNTIsNyBAQAogCXVuc2lnbmVkIGludCBuaG9mZjsKIAlpbnQgbmV4dGhkcjsKIAl1OCBoYXNoOworCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAKIAkvKgogCSAqCVBhcnNlIGV4dGVuc2lvbiBoZWFkZXJzCkBAIC0xNDcsNiArMTYwLDcgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIHJlc3VibWl0OgorCWlkZXYgPSBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpOwogCWlmICghcHNrYl9wdWxsKHNrYiwgc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkpCiAJCWdvdG8gZGlzY2FyZDsKIAluaG9mZiA9IElQNkNCKHNrYiktPm5ob2ZmOwpAQCAtMTg1LDI0ICsxOTksMjQgQEAKIAkJaWYgKHJldCA+IDApCiAJCQlnb3RvIHJlc3VibWl0OwogCQllbHNlIGlmIChyZXQgPT0gMCkKLQkJCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5ERUxJVkVSUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKGlkZXYsIElQU1RBVFNfTUlCX0lOREVMSVZFUlMpOwogCX0gZWxzZSB7CiAJCWlmICghcmF3X3NrKSB7CiAJCQlpZiAoeGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKSB7Ci0JCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTlVOS05PV05QUk9UT1MpOworCQkJCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5VTktOT1dOUFJPVE9TKTsKIAkJCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QQVJBTVBST0IsCiAJCQkJICAgICAgICAgICAgSUNNUFY2X1VOS19ORVhUSERSLCBuaG9mZiwKIAkJCQkgICAgICAgICAgICBza2ItPmRldik7CiAJCQl9CiAJCX0gZWxzZQotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkRFTElWRVJTKTsKKwkJCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5ERUxJVkVSUyk7CiAJCWtmcmVlX3NrYihza2IpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gMDsKIAogZGlzY2FyZDoKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CkBAIC0yMTksNyArMjMzLDcgQEAKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyOwogCWludCBkZWxpdmVyOwogCi0JSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTk1DQVNUUEtUUyk7CisJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTk1DQVNUUEtUUyk7CiAKIAloZHIgPSBza2ItPm5oLmlwdjZoOwogCWRlbGl2ZXIgPSBsaWtlbHkoIShza2ItPmRldi0+ZmxhZ3MgJiAoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkpIHx8CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggNjY3MTY5MS4uN2I3YmQ0NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtNzIsMjMgKzcyLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGlwNl9vdXRwdXRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0KIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKLQlzdHJ1Y3QgaGhfY2FjaGUgKmhoID0gZHN0LT5oaDsKIAotCWlmIChoaCkgewotCQlpbnQgaGhfYWxlbjsKLQotCQlyZWFkX2xvY2tfYmgoJmhoLT5oaF9sb2NrKTsKLQkJaGhfYWxlbiA9IEhIX0RBVEFfQUxJR04oaGgtPmhoX2xlbik7Ci0JCW1lbWNweShza2ItPmRhdGEgLSBoaF9hbGVuLCBoaC0+aGhfZGF0YSwgaGhfYWxlbik7Ci0JCXJlYWRfdW5sb2NrX2JoKCZoaC0+aGhfbG9jayk7Ci0JICAgICAgICBza2JfcHVzaChza2IsIGhoLT5oaF9sZW4pOwotCQlyZXR1cm4gaGgtPmhoX291dHB1dChza2IpOwotCX0gZWxzZSBpZiAoZHN0LT5uZWlnaGJvdXIpCisJaWYgKGRzdC0+aGgpCisJCXJldHVybiBuZWlnaF9oaF9vdXRwdXQoZHN0LT5oaCwgc2tiKTsKKwllbHNlIGlmIChkc3QtPm5laWdoYm91cikKIAkJcmV0dXJuIGRzdC0+bmVpZ2hib3VyLT5vdXRwdXQoc2tiKTsKIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOworCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTE4LDYgKzEwOSw3IEBACiAKIAlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpKSB7CiAJCXN0cnVjdCBpcHY2X3BpbmZvKiBucCA9IHNrYi0+c2sgPyBpbmV0Nl9zayhza2ItPnNrKSA6IE5VTEw7CisJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpcDZfZHN0X2lkZXYoc2tiLT5kc3QpOwogCiAJCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spICYmICghbnAgfHwgbnAtPm1jX2xvb3ApICYmCiAJCSAgICBpcHY2X2Noa19tY2FzdF9hZGRyKGRldiwgJnNrYi0+bmguaXB2NmgtPmRhZGRyLApAQCAtMTMzLDEzICsxMjUsMTMgQEAKIAkJCQkJaXA2X2Rldl9sb29wYmFja194bWl0KTsKIAogCQkJaWYgKHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCA9PSAwKSB7Ci0JCQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJCQkJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KIAotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE1DQVNUUEtUUyk7CisJCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUTUNBU1RQS1RTKTsKIAl9CiAKIAlyZXR1cm4gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X1BPU1RfUk9VVElORywgc2tiLE5VTEwsIHNrYi0+ZGV2LGlwNl9vdXRwdXRfZmluaXNoKTsKQEAgLTE4MiwxMiArMTc0LDE0IEBACiAKIAkJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgaGVhZF9yb29tKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgaGVhZF9yb29tKTsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJc2tiID0gc2tiMjsKLQkJCWlmIChza2IgPT0gTlVMTCkgewkKLQkJCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJCWlmIChza2IyID09IE5VTEwpIHsKKwkJCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJCSAgICAgIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCQlyZXR1cm4gLUVOT0JVRlM7CiAJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IHNrYjI7CiAJCQlpZiAoc2spCiAJCQkJc2tiX3NldF9vd25lcl93KHNrYiwgc2spOwogCQl9CkBAIC0yMTcsNyArMjExLDcgQEAKIAlpZiAodGNsYXNzIDwgMCkKIAkJdGNsYXNzID0gMDsKIAotCSoodTMyICopaGRyID0gaHRvbmwoMHg2MDAwMDAwMCB8ICh0Y2xhc3MgPDwgMjApKSB8IGZsLT5mbDZfZmxvd2xhYmVsOworCSooX19iZTMyICopaGRyID0gaHRvbmwoMHg2MDAwMDAwMCB8ICh0Y2xhc3MgPDwgMjApKSB8IGZsLT5mbDZfZmxvd2xhYmVsOwogCiAJaGRyLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNlZ19sZW4pOwogCWhkci0+bmV4dGhkciA9IHByb3RvOwpAQCAtMjMwLDcgKzIyNCw4IEBACiAKIAltdHUgPSBkc3RfbXR1KGRzdCk7CiAJaWYgKChza2ItPmxlbiA8PSBtdHUpIHx8IGlwZnJhZ29rIHx8IHNrYl9pc19nc28oc2tiKSkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQkJICAgICAgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwogCQlyZXR1cm4gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwKIAkJCQlkc3Rfb3V0cHV0KTsKIAl9CkBAIC0yMzksNyArMjM0LDcgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIklQdjY6IHNlbmRpbmcgcGt0X3Rvb19iaWcgdG8gc2VsZlxuIik7CiAJc2tiLT5kZXYgPSBkc3QtPmRldjsKIAlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIHNrYi0+ZGV2KTsKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAtRU1TR1NJWkU7CiB9CkBAIC0yNjcsNyArMjYyLDcgQEAKIAloZHIgPSAoc3RydWN0IGlwdjZoZHIgKikgc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCXNrYi0+bmguaXB2NmggPSBoZHI7CiAKLQkqKHUzMiopaGRyID0gaHRvbmwoMHg2MDAwMDAwMCk7CisJKihfX2JlMzIqKWhkciA9IGh0b25sKDB4NjAwMDAwMDApOwogCiAJaGRyLT5wYXlsb2FkX2xlbiA9IGh0b25zKGxlbik7CiAJaGRyLT5uZXh0aGRyID0gcHJvdG87CkBAIC0zNzMsNyArMzY4LDcgQEAKIAkJZ290byBlcnJvcjsKIAogCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0ZXRCwgc2tiKSkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKIAkJZ290byBkcm9wOwogCX0KIApAQCAtNDA2LDcgKzQwMSw3IEBACiAJCXNrYi0+ZGV2ID0gZHN0LT5kZXY7CiAJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1RJTUVfRVhDRUVELCBJQ01QVjZfRVhDX0hPUExJTUlULAogCQkJICAgIDAsIHNrYi0+ZGV2KTsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC00MTksMTMgKzQxNCwxMyBAQAogCQlpZiAocHJveGllZCA+IDApCiAJCQlyZXR1cm4gaXA2X2lucHV0KHNrYik7CiAJCWVsc2UgaWYgKHByb3hpZWQgPCAwKSB7Ci0JCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CiAJCQlnb3RvIGRyb3A7CiAJCX0KIAl9CiAKIAlpZiAoIXhmcm02X3JvdXRlX2ZvcndhcmQoc2tiKSkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0lORElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihkc3QpLCBJUFNUQVRTX01JQl9JTkRJU0NBUkRTKTsKIAkJZ290byBkcm9wOwogCX0KIAlkc3QgPSBza2ItPmRzdDsKQEAgLTQ2NCwxNCArNDU5LDE0IEBACiAJCS8qIEFnYWluLCBmb3JjZSBPVVRQVVQgZGV2aWNlIHVzZWQgYXMgc291cmNlIGFkZHJlc3MgKi8KIAkJc2tiLT5kZXYgPSBkc3QtPmRldjsKIAkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgZHN0X210dShkc3QpLCBza2ItPmRldik7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5UT09CSUdFUlJPUlMpOwotCQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOVE9PQklHRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtRU1TR1NJWkU7CiAJfQogCiAJaWYgKHNrYl9jb3coc2tiLCBkc3QtPmRldi0+aGFyZF9oZWFkZXJfbGVuKSkgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKKwkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwogCQlnb3RvIGRyb3A7CiAJfQogCkBAIC00ODEsMTEgKzQ3NiwxMSBAQAogIAogCWhkci0+aG9wX2xpbWl0LS07CiAKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX09VVEZPUldEQVRBR1JBTVMpOworCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVEZPUldEQVRBR1JBTVMpOwogCXJldHVybiBORl9IT09LKFBGX0lORVQ2LE5GX0lQNl9GT1JXQVJELCBza2IsIHNrYi0+ZGV2LCBkc3QtPmRldiwgaXA2X2ZvcndhcmRfZmluaXNoKTsKIAogZXJyb3I6Ci0JSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiBkcm9wOgogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAtRUlOVkFMOwpAQCAtNDk5LDEyICs0OTQsMTIgQEAKIAlkc3RfcmVsZWFzZSh0by0+ZHN0KTsKIAl0by0+ZHN0ID0gZHN0X2Nsb25lKGZyb20tPmRzdCk7CiAJdG8tPmRldiA9IGZyb20tPmRldjsKKwl0by0+bWFyayA9IGZyb20tPm1hcms7CiAKICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECiAJdG8tPnRjX2luZGV4ID0gZnJvbS0+dGNfaW5kZXg7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JdG8tPm5mbWFyayA9IGZyb20tPm5mbWFyazsKIAkvKiBDb25uZWN0aW9uIGFzc29jaWF0aW9uIGlzIHNhbWUgYXMgcHJlLWZyYWcgcGFja2V0ICovCiAJbmZfY29ubnRyYWNrX3B1dCh0by0+bmZjdCk7CiAJdG8tPm5mY3QgPSBmcm9tLT5uZmN0OwpAQCAtNTcxLDcgKzU2Niw3IEBACiAJc3RydWN0IGlwdjZoZHIgKnRtcF9oZHI7CiAJc3RydWN0IGZyYWdfaGRyICpmaDsKIAl1bnNpZ25lZCBpbnQgbXR1LCBobGVuLCBsZWZ0LCBsZW47Ci0JdTMyIGZyYWdfaWQgPSAwOworCV9fYmUzMiBmcmFnX2lkID0gMDsKIAlpbnQgcHRyLCBvZmZzZXQgPSAwLCBlcnI9MDsKIAl1OCAqcHJldmhkciwgbmV4dGhkciA9IDA7CiAKQEAgLTYyMCwxNCArNjE1LDEzIEBACiAJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gTlVMTDsKIAkJLyogQlVJTEQgSEVBREVSICovCiAKLQkJdG1wX2hkciA9IGttYWxsb2MoaGxlbiwgR0ZQX0FUT01JQyk7CisJCSpwcmV2aGRyID0gTkVYVEhEUl9GUkFHTUVOVDsKKwkJdG1wX2hkciA9IGttZW1kdXAoc2tiLT5uaC5yYXcsIGhsZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoIXRtcF9oZHIpIHsKLQkJCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwkJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKLQkJKnByZXZoZHIgPSBORVhUSERSX0ZSQUdNRU5UOwotCQltZW1jcHkodG1wX2hkciwgc2tiLT5uaC5yYXcsIGhsZW4pOwogCQlfX3NrYl9wdWxsKHNrYiwgaGxlbik7CiAJCWZoID0gKHN0cnVjdCBmcmFnX2hkciopX19za2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKTsKIAkJc2tiLT5uaC5yYXcgPSBfX3NrYl9wdXNoKHNrYiwgaGxlbik7CkBAIC02NDMsNyArNjM3LDggQEAKIAkJc2tiLT5kYXRhX2xlbiA9IGZpcnN0X2xlbiAtIHNrYl9oZWFkbGVuKHNrYik7CiAJCXNrYi0+bGVuID0gZmlyc3RfbGVuOwogCQlza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKGZpcnN0X2xlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwotIAorCisJCWRzdF9ob2xkKCZydC0+dS5kc3QpOwogCiAJCWZvciAoOzspIHsKIAkJCS8qIFByZXBhcmUgaGVhZGVyIG9mIHRoZSBuZXh0IGZyYW1lLApAQCAtNjY3LDcgKzY2Miw3IEBACiAJCQkKIAkJCWVyciA9IG91dHB1dChza2IpOwogCQkJaWYoIWVycikKLQkJCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdDUkVBVEVTKTsKKwkJCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldigmcnQtPnUuZHN0KSwgSVBTVEFUU19NSUJfRlJBR0NSRUFURVMpOwogCiAJCQlpZiAoZXJyIHx8ICFmcmFnKQogCQkJCWJyZWFrOwpAQCAtNjgwLDcgKzY3NSw4IEBACiAJCWtmcmVlKHRtcF9oZHIpOwogCiAJCWlmIChlcnIgPT0gMCkgewotCQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHT0tTKTsKKwkJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KCZydC0+dS5kc3QpLCBJUFNUQVRTX01JQl9GUkFHT0tTKTsKKwkJCWRzdF9yZWxlYXNlKCZydC0+dS5kc3QpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtNjkwLDcgKzY4Niw4IEBACiAJCQlmcmFnID0gc2tiOwogCQl9CiAKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHRkFJTFMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldigmcnQtPnUuZHN0KSwgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKKwkJZHN0X3JlbGVhc2UoJnJ0LT51LmRzdCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC03MjMsNyArNzIwLDggQEAKIAogCQlpZiAoKGZyYWcgPSBhbGxvY19za2IobGVuK2hsZW4rc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikrTExfUkVTRVJWRURfU1BBQ0UocnQtPnUuZHN0LmRldiksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CiAJCQlORVRERUJVRyhLRVJOX0lORk8gIklQdjY6IGZyYWc6IG5vIG1lbW9yeSBmb3IgbmV3IGZyYWdtZW50IVxuIik7Ci0JCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJICAgICAgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGZhaWw7CiAJCX0KQEAgLTc4NCwxNSArNzgyLDE3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIGZhaWw7CiAKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9GUkFHQ1JFQVRFUyk7CisJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfRlJBR0NSRUFURVMpOwogCX0KKwlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCSAgICAgIElQU1RBVFNfTUlCX0ZSQUdPS1MpOwogCWtmcmVlX3NrYihza2IpOwotCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR09LUyk7CiAJcmV0dXJuIGVycjsKIAogZmFpbDoKKwlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCSAgICAgIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CiAJa2ZyZWVfc2tiKHNrYik7IAotCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMjY1LDcgKzEyNjUsNyBAQAogCXJldHVybiAwOwogZXJyb3I6CiAJaW5ldC0+Y29yay5sZW5ndGggLT0gbGVuZ3RoOwotCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCUlQNl9JTkNfU1RBVFMocnQtPnJ0NmlfaWRldiwgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEzMTEsNyArMTMxMSw3IEBACiAKIAlza2ItPm5oLmlwdjZoID0gaGRyID0gKHN0cnVjdCBpcHY2aGRyKikgc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAkKLQkqKHUzMiopaGRyID0gZmwtPmZsNl9mbG93bGFiZWwgfAorCSooX19iZTMyKiloZHIgPSBmbC0+Zmw2X2Zsb3dsYWJlbCB8CiAJCSAgICAgaHRvbmwoMHg2MDAwMDAwMCB8ICgoaW50KW5wLT5jb3JrLnRjbGFzcyA8PCAyMCkpOwogCiAJaWYgKHNrYi0+bGVuIDw9IHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyBJUFY2X01BWFBMRU4pCkBAIC0xMzI2LDcgKzEzMjYsNyBAQAogCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CiAKIAlza2ItPmRzdCA9IGRzdF9jbG9uZSgmcnQtPnUuZHN0KTsKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsJCisJSVA2X0lOQ19TVEFUUyhydC0+cnQ2aV9pZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPiAwKQpAQCAtMTM1Nyw3ICsxMzU3LDggQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSkpICE9IE5VTEwpIHsKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKKwkJCSAgICAgIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggODRkN2ViZC4uOGQ5MTgzNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtNjYsNyArNjYsNyBAQAogCiAjZGVmaW5lIEhBU0hfU0laRSAgMzIKIAotI2RlZmluZSBIQVNIKGFkZHIpICgoKGFkZHIpLT5zNl9hZGRyMzJbMF0gXiAoYWRkciktPnM2X2FkZHIzMlsxXSBeIFwKKyNkZWZpbmUgSEFTSChhZGRyKSAoKF9fZm9yY2UgdTMyKSgoYWRkciktPnM2X2FkZHIzMlswXSBeIChhZGRyKS0+czZfYWRkcjMyWzFdIF4gXAogCSAgICAgICAgICAgICAoYWRkciktPnM2X2FkZHIzMlsyXSBeIChhZGRyKS0+czZfYWRkcjMyWzNdKSAmIFwKICAgICAgICAgICAgICAgICAgICAgKEhBU0hfU0laRSAtIDEpKQogCkBAIC0yMTUsMTEgKzIxNSwxMCBAQAogICogICBDcmVhdGUgdHVubmVsIG1hdGNoaW5nIGdpdmVuIHBhcmFtZXRlcnMuCiAgKiAKICAqIFJldHVybjogCi0gKiAgIDAgb24gc3VjY2VzcworICogICBjcmVhdGVkIHR1bm5lbCBvciBOVUxMCiAgKiovCiAKLXN0YXRpYyBpbnQKLWlwNl90bmxfY3JlYXRlKHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAsIHN0cnVjdCBpcDZfdG5sICoqcHQpCitzdGF0aWMgc3RydWN0IGlwNl90bmwgKmlwNl90bmxfY3JlYXRlKHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnApCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaXA2X3RubCAqdDsKQEAgLTIzNiwxMSArMjM1LDExIEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGkgPT0gSVA2X1ROTF9NQVgpIAotCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJZ290byBmYWlsZWQ7CiAJfQogCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YgKCp0KSwgbmFtZSwgaXA2aXA2X3RubF9kZXZfc2V0dXApOwogCWlmIChkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZmFpbGVkOwogCiAJdCA9IG5ldGRldl9wcml2KGRldik7CiAJZGV2LT5pbml0ID0gaXA2aXA2X3RubF9kZXZfaW5pdDsKQEAgLTI0OCwxMyArMjQ3LDEzIEBACiAKIAlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpKSA8IDApIHsKIAkJZnJlZV9uZXRkZXYoZGV2KTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBmYWlsZWQ7CiAJfQogCWRldl9ob2xkKGRldik7Ci0KIAlpcDZpcDZfdG5sX2xpbmsodCk7Ci0JKnB0ID0gdDsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdDsKK2ZhaWxlZDoKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCkBAIC0yNjgsMzIgKzI2NywyMyBAQAogICogICB0dW5uZWwgZGV2aWNlIGlzIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQgZm9yIHVzZS4KICAqCiAgKiBSZXR1cm46Ci0gKiAgIDAgaWYgdHVubmVsIGxvY2F0ZWQgb3IgY3JlYXRlZCwKLSAqICAgLUVJTlZBTCBpZiBwYXJhbWV0ZXJzIGluY29ycmVjdCwKLSAqICAgLUVOT0RFViBpZiBubyBtYXRjaGluZyB0dW5uZWwgYXZhaWxhYmxlCisgKiAgIG1hdGNoaW5nIHR1bm5lbCBvciBOVUxMCiAgKiovCiAKLXN0YXRpYyBpbnQKLWlwNmlwNl90bmxfbG9jYXRlKHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAsIHN0cnVjdCBpcDZfdG5sICoqcHQsIGludCBjcmVhdGUpCitzdGF0aWMgc3RydWN0IGlwNl90bmwgKmlwNmlwNl90bmxfbG9jYXRlKHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAsIGludCBjcmVhdGUpCiB7CiAJc3RydWN0IGluNl9hZGRyICpyZW1vdGUgPSAmcC0+cmFkZHI7CiAJc3RydWN0IGluNl9hZGRyICpsb2NhbCA9ICZwLT5sYWRkcjsKIAlzdHJ1Y3QgaXA2X3RubCAqdDsKIAotCWlmIChwLT5wcm90byAhPSBJUFBST1RPX0lQVjYpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJZm9yICh0ID0gKmlwNmlwNl9idWNrZXQocCk7IHQ7IHQgPSB0LT5uZXh0KSB7CiAJCWlmIChpcHY2X2FkZHJfZXF1YWwobG9jYWwsICZ0LT5wYXJtcy5sYWRkcikgJiYKLQkJICAgIGlwdjZfYWRkcl9lcXVhbChyZW1vdGUsICZ0LT5wYXJtcy5yYWRkcikpIHsKLQkJCSpwdCA9IHQ7Ci0JCQlyZXR1cm4gKGNyZWF0ZSA/IC1FRVhJU1QgOiAwKTsKLQkJfQorCQkgICAgaXB2Nl9hZGRyX2VxdWFsKHJlbW90ZSwgJnQtPnBhcm1zLnJhZGRyKSkKKwkJCXJldHVybiB0OwogCX0KIAlpZiAoIWNyZWF0ZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JCi0JcmV0dXJuIGlwNl90bmxfY3JlYXRlKHAsIHB0KTsKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGlwNl90bmxfY3JlYXRlKHApOwogfQogCiAvKioKQEAgLTM5MSw3ICszODEsNyBAQAogCiBzdGF0aWMgaW50CiBpcDZpcDZfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCSAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKwkgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fYmUzMiBpbmZvKQogewogCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IChzdHJ1Y3QgaXB2NmhkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IGlwNl90bmwgKnQ7CkBAIC00MzQsMTIgKzQyNCw5IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJQ01QVjZfUEFSQU1QUk9COgotCQkvKiBpZ25vcmUgaWYgcGFyYW1ldGVyIHByb2JsZW0gbm90IGNhdXNlZCBieSBhIHR1bm5lbAotCQkgICBlbmNhcHN1bGF0aW9uIGxpbWl0IHN1Yi1vcHRpb24gKi8KLQkJaWYgKGNvZGUgIT0gSUNNUFY2X0hEUl9GSUVMRCkgewotCQkJYnJlYWs7Ci0JCX0KLQkJdGVsaSA9IHBhcnNlX3Rsdl90bmxfZW5jX2xpbShza2IsIHNrYi0+ZGF0YSk7CisJCXRlbGkgPSAwOworCQlpZiAoY29kZSA9PSBJQ01QVjZfSERSX0ZJRUxEKQorCQkJdGVsaSA9IHBhcnNlX3Rsdl90bmxfZW5jX2xpbShza2IsIHNrYi0+ZGF0YSk7CiAKIAkJaWYgKHRlbGkgJiYgdGVsaSA9PSBudG9obChpbmZvKSAtIDIpIHsKIAkJCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgJnNrYi0+ZGF0YVt0ZWxpXTsKQEAgLTQ1MSw2ICs0MzgsMTAgQEAKIAkJCQkJICAgICAgICJ0dW5uZWwhXG4iLCB0LT5wYXJtcy5uYW1lKTsKIAkJCQlyZWxfbXNnID0gMTsKIAkJCX0KKwkJfSBlbHNlIGlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IFJlY2lwaWVudCB1bmFibGUgdG8gcGFyc2UgdHVubmVsZWQgIgorCQkJICAgICAgICJwYWNrZXQhXG4gIiwgdC0+cGFybXMubmFtZSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJQ01QVjZfUEtUX1RPT0JJRzoKQEAgLTQ3MCw2ICs0NjEsNyBAQAogCWlmIChyZWxfbXNnICYmICBwc2tiX21heV9wdWxsKHNrYiwgb2Zmc2V0ICsgc2l6ZW9mICgqaXB2NmgpKSkgewogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCiAJCWlmICghc2tiMikKIAkJCWdvdG8gb3V0OwogCkBAIC01MDQsNiArNDk2LDI3IEBACiAJaWYgKElORVRfRUNOX2lzX2NlKGlwdjZfZ2V0X2RzZmllbGQob3V0ZXJfaXBoKSkpCiAJCUlQNl9FQ05fc2V0X2NlKGlubmVyX2lwaCk7CiB9CitzdGF0aWMgaW5saW5lIGludCBpcDZfdG5sX3Jjdl9jdGwoc3RydWN0IGlwNl90bmwgKnQpCit7CisJc3RydWN0IGlwNl90bmxfcGFybSAqcCA9ICZ0LT5wYXJtczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwLT5mbGFncyAmIElQNl9UTkxfRl9DQVBfUkNWKSB7CisgICAgCQlzdHJ1Y3QgbmV0X2RldmljZSAqbGRldiA9IE5VTEw7CisKKwkJaWYgKHAtPmxpbmspCisJCQlsZGV2ID0gZGV2X2dldF9ieV9pbmRleChwLT5saW5rKTsKKworCQlpZiAoKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJnAtPmxhZGRyKSB8fAorCQkgICAgIGxpa2VseShpcHY2X2Noa19hZGRyKCZwLT5sYWRkciwgbGRldiwgMCkpKSAmJgorCQkgICAgbGlrZWx5KCFpcHY2X2Noa19hZGRyKCZwLT5yYWRkciwgTlVMTCwgMCkpKQorCQkJcmV0ID0gMTsKKworCQlpZiAobGRldikKKwkJCWRldl9wdXQobGRldik7CisJfQorCXJldHVybiByZXQ7Cit9CiAKIC8qKgogICogaXA2aXA2X3JjdiAtIGRlY2Fwc3VsYXRlIElQdjYgcGFja2V0IGFuZCByZXRyYW5zbWl0IGl0IGxvY2FsbHkKQEAgLTUyOCw3ICs1NDEsNyBAQAogCQkJZ290byBkaXNjYXJkOwogCQl9CiAKLQkJaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfQ0FQX1JDVikpIHsKKwkJaWYgKCFpcDZfdG5sX3Jjdl9jdGwodCkpIHsKIAkJCXQtPnN0YXQucnhfZHJvcHBlZCsrOwogCQkJcmVhZF91bmxvY2soJmlwNmlwNl9sb2NrKTsKIAkJCWdvdG8gZGlzY2FyZDsKQEAgLTU0Miw2ICs1NTUsNyBAQAogCQlza2ItPmRldiA9IHQtPmRldjsKIAkJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwogCQlza2ItPmRzdCA9IE5VTEw7CisJCW5mX3Jlc2V0KHNrYik7CiAJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZKQogCQkJaXB2Nl9jb3B5X2RzY3AoaXB2NmgsIHNrYi0+bmguaXB2NmgpOwogCQlpcDZpcDZfZWNuX2RlY2Fwc3VsYXRlKGlwdjZoLCBza2IpOwpAQCAtNTU5LDMxICs1NzMsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKmNyZWF0ZV90ZWwoX191OCBlbmNhcF9saW1pdCkKK3N0cnVjdCBpcHY2X3RlbF90eG9wdGlvbiB7CisJc3RydWN0IGlwdjZfdHhvcHRpb25zIG9wczsKKwlfX3U4IGRzdF9vcHRbOF07Cit9OworCitzdGF0aWMgdm9pZCBpbml0X3RlbF90eG9wdChzdHJ1Y3QgaXB2Nl90ZWxfdHhvcHRpb24gKm9wdCwgX191OCBlbmNhcF9saW1pdCkKIHsKLQlzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKnRlbDsKLQlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdDsKLQlfX3U4ICpyYXc7CisJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHY2X3RlbF90eG9wdGlvbikpOwogCi0JaW50IG9wdF9sZW4gPSBzaXplb2YoKm9wdCkgKyA4OworCW9wdC0+ZHN0X29wdFsyXSA9IElQVjZfVExWX1ROTF9FTkNBUF9MSU1JVDsKKwlvcHQtPmRzdF9vcHRbM10gPSAxOworCW9wdC0+ZHN0X29wdFs0XSA9IGVuY2FwX2xpbWl0OworCW9wdC0+ZHN0X29wdFs1XSA9IElQVjZfVExWX1BBRE47CisJb3B0LT5kc3Rfb3B0WzZdID0gMTsKIAotCWlmICghKG9wdCA9IGt6YWxsb2Mob3B0X2xlbiwgR0ZQX0FUT01JQykpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvcHQtPnRvdF9sZW4gPSBvcHRfbGVuOwotCW9wdC0+ZHN0MG9wdCA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopIChvcHQgKyAxKTsKLQlvcHQtPm9wdF9uZmxlbiA9IDg7Ci0KLQl0ZWwgPSAoc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICopIChvcHQtPmRzdDBvcHQgKyAxKTsKLQl0ZWwtPnR5cGUgPSBJUFY2X1RMVl9UTkxfRU5DQVBfTElNSVQ7Ci0JdGVsLT5sZW5ndGggPSAxOwotCXRlbC0+ZW5jYXBfbGltaXQgPSBlbmNhcF9saW1pdDsKLQotCXJhdyA9IChfX3U4ICopIG9wdC0+ZHN0MG9wdDsKLQlyYXdbNV0gPSBJUFY2X1RMVl9QQUROOwotCXJhd1s2XSA9IDE7Ci0KLQlyZXR1cm4gb3B0OworCW9wdC0+b3BzLmRzdDBvcHQgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKSBvcHQtPmRzdF9vcHQ7CisJb3B0LT5vcHMub3B0X25mbGVuID0gODsKIH0KIAogLyoqCkBAIC02MDYsNiArNjEyLDM0IEBACiAJcmV0dXJuIGlwdjZfYWRkcl9lcXVhbCgmdC0+cGFybXMucmFkZHIsICZoZHItPnNhZGRyKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXA2X3RubF94bWl0X2N0bChzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgaXA2X3RubF9wYXJtICpwID0gJnQtPnBhcm1zOworCWludCByZXQgPSAwOworCisgCWlmIChwLT5mbGFncyAmIElQNl9UTkxfRl9DQVBfWE1JVCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbGRldiA9IE5VTEw7CisKKwkJaWYgKHAtPmxpbmspCisJCQlsZGV2ID0gZGV2X2dldF9ieV9pbmRleChwLT5saW5rKTsKKworCQlpZiAodW5saWtlbHkoIWlwdjZfY2hrX2FkZHIoJnAtPmxhZGRyLCBsZGV2LCAwKSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzIHhtaXQ6IExvY2FsIGFkZHJlc3Mgbm90IHlldCBjb25maWd1cmVkIVxuIiwKKwkJCSAgICAgICBwLT5uYW1lKTsKKwkJZWxzZSBpZiAoIWlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJnAtPnJhZGRyKSAmJgorCQkJIHVubGlrZWx5KGlwdjZfY2hrX2FkZHIoJnAtPnJhZGRyLCBOVUxMLCAwKSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzIHhtaXQ6IFJvdXRpbmcgbG9vcCEgIgorCQkJICAgICAgICJSZW1vdGUgYWRkcmVzcyBmb3VuZCBvbiB0aGlzIG5vZGUhXG4iLAorCQkJICAgICAgIHAtPm5hbWUpOworCQllbHNlCisJCQlyZXQgPSAxOworCQlpZiAobGRldikKKwkJCWRldl9wdXQobGRldik7CisJfQorCXJldHVybiByZXQ7Cit9CiAvKioKICAqIGlwNmlwNl90bmxfeG1pdCAtIGVuY2Fwc3VsYXRlIHBhY2tldCBhbmQgc2VuZCAKICAqICAgQHNrYjogdGhlIG91dGdvaW5nIHNvY2tldCBidWZmZXIKQEAgLTYyNSw4ICs2NTksOCBAQAogCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdC0+c3RhdDsKIAlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBza2ItPm5oLmlwdjZoOwotCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyAqb3B0ID0gTlVMTDsKIAlpbnQgZW5jYXBfbGltaXQgPSAtMTsKKwlzdHJ1Y3QgaXB2Nl90ZWxfdHhvcHRpb24gb3B0OwogCV9fdTE2IG9mZnNldDsKIAlzdHJ1Y3QgZmxvd2kgZmw7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwpAQCAtNjQzLDEwICs2NzcsOSBAQAogCQlnb3RvIHR4X2VycjsKIAl9CiAJaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVBWNikgfHwKLQkgICAgISh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9DQVBfWE1JVCkgfHwKLQkgICAgaXA2aXA2X3RubF9hZGRyX2NvbmZsaWN0KHQsIGlwdjZoKSkgeworCSAgICAhaXA2X3RubF94bWl0X2N0bCh0KSB8fCBpcDZpcDZfdG5sX2FkZHJfY29uZmxpY3QodCwgaXB2NmgpKQogCQlnb3RvIHR4X2VycjsKLQl9CisKIAlpZiAoKG9mZnNldCA9IHBhcnNlX3Rsdl90bmxfZW5jX2xpbShza2IsIHNrYi0+bmgucmF3KSkgPiAwKSB7CiAJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOwogCQl0ZWwgPSAoc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICopICZza2ItPm5oLnJhd1tvZmZzZXRdOwpAQCAtNjU2LDIwICs2ODksMTcgQEAKIAkJCWdvdG8gdHhfZXJyOwogCQl9CiAJCWVuY2FwX2xpbWl0ID0gdGVsLT5lbmNhcF9saW1pdCAtIDE7Ci0JfSBlbHNlIGlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkpIHsKKwl9IGVsc2UgaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKIAkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKLQl9CisKIAltZW1jcHkoJmZsLCAmdC0+ZmwsIHNpemVvZiAoZmwpKTsKIAlwcm90byA9IGZsLnByb3RvOwogCiAJZHNmaWVsZCA9IGlwdjZfZ2V0X2RzZmllbGQoaXB2NmgpOwogCWlmICgodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKSkKLQkJZmwuZmw2X2Zsb3dsYWJlbCB8PSAoKihfX3UzMiAqKSBpcHY2aCAmIElQVjZfVENMQVNTX01BU0spOworCQlmbC5mbDZfZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKSBpcHY2aCAmIElQVjZfVENMQVNTX01BU0spOwogCWlmICgodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfRkxPV0xBQkVMKSkKLQkJZmwuZmw2X2Zsb3dsYWJlbCB8PSAoKihfX3UzMiAqKSBpcHY2aCAmIElQVjZfRkxPV0xBQkVMX01BU0spOwotCi0JaWYgKGVuY2FwX2xpbWl0ID49IDAgJiYgKG9wdCA9IGNyZWF0ZV90ZWwoZW5jYXBfbGltaXQpKSA9PSBOVUxMKQotCQlnb3RvIHR4X2VycjsKKwkJZmwuZmw2X2Zsb3dsYWJlbCB8PSAoKihfX2JlMzIgKikgaXB2NmggJiBJUFY2X0ZMT1dMQUJFTF9NQVNLKTsKIAogCWlmICgoZHN0ID0gaXA2X3RubF9kc3RfY2hlY2sodCkpICE9IE5VTEwpCiAJCWRzdF9ob2xkKGRzdCk7CkBAIC02OTEsNyArNzIxLDcgQEAKIAkJZ290byB0eF9lcnJfZHN0X3JlbGVhc2U7CiAJfQogCW10dSA9IGRzdF9tdHUoZHN0KSAtIHNpemVvZiAoKmlwdjZoKTsKLQlpZiAob3B0KSB7CisJaWYgKGVuY2FwX2xpbWl0ID49IDApIHsKIAkJbWF4X2hlYWRyb29tICs9IDg7CiAJCW10dSAtPSA4OwogCX0KQEAgLTcyOSwxMiArNzU5LDEzIEBACiAKIAlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXc7CiAKLQlpZiAob3B0KQotCQlpcHY2X3B1c2hfbmZyYWdfb3B0cyhza2IsIG9wdCwgJnByb3RvLCBOVUxMKTsKLQorCWlmIChlbmNhcF9saW1pdCA+PSAwKSB7CisJCWluaXRfdGVsX3R4b3B0KCZvcHQsIGVuY2FwX2xpbWl0KTsKKwkJaXB2Nl9wdXNoX25mcmFnX29wdHMoc2tiLCAmb3B0Lm9wcywgJnByb3RvLCBOVUxMKTsKKwl9CiAJc2tiLT5uaC5yYXcgPSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCWlwdjZoID0gc2tiLT5uaC5pcHY2aDsKLQkqKHUzMiopaXB2NmggPSBmbC5mbDZfZmxvd2xhYmVsIHwgaHRvbmwoMHg2MDAwMDAwMCk7CisJKihfX2JlMzIqKWlwdjZoID0gZmwuZmw2X2Zsb3dsYWJlbCB8IGh0b25sKDB4NjAwMDAwMDApOwogCWRzZmllbGQgPSBJTkVUX0VDTl9lbmNhcHN1bGF0ZSgwLCBkc2ZpZWxkKTsKIAlpcHY2X2NoYW5nZV9kc2ZpZWxkKGlwdjZoLCB+SU5FVF9FQ05fTUFTSywgZHNmaWVsZCk7CiAJaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKQEAgLTc0Nyw3ICs3NzgsNyBAQAogCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgCiAJCSAgICAgIHNrYi0+ZHN0LT5kZXYsIGRzdF9vdXRwdXQpOwogCi0JaWYgKGVyciA9PSBORVRfWE1JVF9TVUNDRVNTIHx8IGVyciA9PSBORVRfWE1JVF9DTikgeworCWlmIChuZXRfeG1pdF9ldmFsKGVycikgPT0gMCkgewogCQlzdGF0cy0+dHhfYnl0ZXMgKz0gcGt0X2xlbjsKIAkJc3RhdHMtPnR4X3BhY2tldHMrKzsKIAl9IGVsc2UgewpAQCAtNzU1LDkgKzc4Niw2IEBACiAJCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOwogCX0KIAlpcDZfdG5sX2RzdF9zdG9yZSh0LCBkc3QpOwotCi0Ja2ZyZWUob3B0KTsKLQogCXQtPnJlY3Vyc2lvbi0tOwogCXJldHVybiAwOwogdHhfZXJyX2xpbmtfZmFpbHVyZToKQEAgLTc2NSw3ICs3OTMsNiBAQAogCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKIHR4X2Vycl9kc3RfcmVsZWFzZToKIAlkc3RfcmVsZWFzZShkc3QpOwotCWtmcmVlKG9wdCk7CiB0eF9lcnI6CiAJc3RhdHMtPnR4X2Vycm9ycysrOwogCXN0YXRzLT50eF9kcm9wcGVkKys7CkBAIC03NzcsMzkgKzgwNCwxOSBAQAogc3RhdGljIHZvaWQgaXA2X3RubF9zZXRfY2FwKHN0cnVjdCBpcDZfdG5sICp0KQogewogCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAgPSAmdC0+cGFybXM7Ci0Jc3RydWN0IGluNl9hZGRyICpsYWRkciA9ICZwLT5sYWRkcjsKLQlzdHJ1Y3QgaW42X2FkZHIgKnJhZGRyID0gJnAtPnJhZGRyOwotCWludCBsdHlwZSA9IGlwdjZfYWRkcl90eXBlKGxhZGRyKTsKLQlpbnQgcnR5cGUgPSBpcHY2X2FkZHJfdHlwZShyYWRkcik7CisJaW50IGx0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnAtPmxhZGRyKTsKKwlpbnQgcnR5cGUgPSBpcHY2X2FkZHJfdHlwZSgmcC0+cmFkZHIpOwogCiAJcC0+ZmxhZ3MgJj0gfihJUDZfVE5MX0ZfQ0FQX1hNSVR8SVA2X1ROTF9GX0NBUF9SQ1YpOwogCi0JaWYgKGx0eXBlICE9IElQVjZfQUREUl9BTlkgJiYgcnR5cGUgIT0gSVBWNl9BRERSX0FOWSAmJgotCSAgICAoKGx0eXBlfHJ0eXBlKSAmCi0JICAgICAoSVBWNl9BRERSX1VOSUNBU1R8Ci0JICAgICAgSVBWNl9BRERSX0xPT1BCQUNLfElQVjZfQUREUl9MSU5LTE9DQUx8Ci0JICAgICAgSVBWNl9BRERSX01BUFBFRHxJUFY2X0FERFJfUkVTRVJWRUQpKSA9PSBJUFY2X0FERFJfVU5JQ0FTVCkgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqbGRldiA9IE5VTEw7Ci0JCWludCBsX29rID0gMTsKLQkJaW50IHJfb2sgPSAxOwotCi0JCWlmIChwLT5saW5rKQotCQkJbGRldiA9IGRldl9nZXRfYnlfaW5kZXgocC0+bGluayk7Ci0JCQotCQlpZiAobHR5cGUmSVBWNl9BRERSX1VOSUNBU1QgJiYgIWlwdjZfY2hrX2FkZHIobGFkZHIsIGxkZXYsIDApKQotCQkJbF9vayA9IDA7Ci0JCQotCQlpZiAocnR5cGUmSVBWNl9BRERSX1VOSUNBU1QgJiYgaXB2Nl9jaGtfYWRkcihyYWRkciwgTlVMTCwgMCkpCi0JCQlyX29rID0gMDsKLQkJCi0JCWlmIChsX29rICYmIHJfb2spIHsKLQkJCWlmIChsdHlwZSZJUFY2X0FERFJfVU5JQ0FTVCkKLQkJCQlwLT5mbGFncyB8PSBJUDZfVE5MX0ZfQ0FQX1hNSVQ7Ci0JCQlpZiAocnR5cGUmSVBWNl9BRERSX1VOSUNBU1QpCi0JCQkJcC0+ZmxhZ3MgfD0gSVA2X1ROTF9GX0NBUF9SQ1Y7Ci0JCX0KLQkJaWYgKGxkZXYpCi0JCQlkZXZfcHV0KGxkZXYpOworCWlmIChsdHlwZSAmIChJUFY2X0FERFJfVU5JQ0FTVHxJUFY2X0FERFJfTVVMVElDQVNUKSAmJgorCSAgICBydHlwZSAmIChJUFY2X0FERFJfVU5JQ0FTVHxJUFY2X0FERFJfTVVMVElDQVNUKSAmJgorCSAgICAhKChsdHlwZXxydHlwZSkgJiBJUFY2X0FERFJfTE9PUEJBQ0spICYmCisJICAgICghKChsdHlwZXxydHlwZSkgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSB8fCBwLT5saW5rKSkgeworCQlpZiAobHR5cGUmSVBWNl9BRERSX1VOSUNBU1QpCisJCQlwLT5mbGFncyB8PSBJUDZfVE5MX0ZfQ0FQX1hNSVQ7CisJCWlmIChydHlwZSZJUFY2X0FERFJfVU5JQ0FTVCkKKwkJCXAtPmZsYWdzIHw9IElQNl9UTkxfRl9DQVBfUkNWOwogCX0KIH0KIApAQCAtODQzLDggKzg1MCwxMSBAQAogCWRldi0+aWZsaW5rID0gcC0+bGluazsKIAogCWlmIChwLT5mbGFncyAmIElQNl9UTkxfRl9DQVBfWE1JVCkgeworCQlpbnQgc3RyaWN0ID0gKGlwdjZfYWRkcl90eXBlKCZwLT5yYWRkcikgJgorCQkJICAgICAgKElQVjZfQUREUl9NVUxUSUNBU1R8SVBWNl9BRERSX0xJTktMT0NBTCkpOworCiAJCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBydDZfbG9va3VwKCZwLT5yYWRkciwgJnAtPmxhZGRyLAotCQkJCQkJIHAtPmxpbmssIDApOworCQkJCQkJIHAtPmxpbmssIHN0cmljdCk7CiAKIAkJaWYgKHJ0ID09IE5VTEwpCiAJCQlyZXR1cm47CkBAIC05MTksMjYgKzkyOSwyMCBAQAogaXA2aXA2X3RubF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKIAlpbnQgZXJyID0gMDsKLQlpbnQgY3JlYXRlOwogCXN0cnVjdCBpcDZfdG5sX3Bhcm0gcDsKIAlzdHJ1Y3QgaXA2X3RubCAqdCA9IE5VTEw7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dFVFRVTk5FTDoKIAkJaWYgKGRldiA9PSBpcDZpcDZfZmJfdG5sX2RldikgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLAotCQkJCQkgICBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwKLQkJCQkJICAgc2l6ZW9mIChwKSkpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsIHNpemVvZiAocCkpKSB7CiAJCQkJZXJyID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmICgoZXJyID0gaXA2aXA2X3RubF9sb2NhdGUoJnAsICZ0LCAwKSkgPT0gLUVOT0RFVikKLQkJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkJCWVsc2UgaWYgKGVycikKLQkJCQlicmVhazsKLQkJfSBlbHNlCisJCQl0ID0gaXA2aXA2X3RubF9sb2NhdGUoJnAsIDApOworCQl9CisJCWlmICh0ID09IE5VTEwpCiAJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQogCQltZW1jcHkoJnAsICZ0LT5wYXJtcywgc2l6ZW9mIChwKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsICZwLCBzaXplb2YgKHApKSkgewogCQkJZXJyID0gLUVGQVVMVDsKQEAgLTk0NywzNSArOTUxLDM2IEBACiAJY2FzZSBTSU9DQUREVFVOTkVMOgogCWNhc2UgU0lPQ0NIR1RVTk5FTDoKIAkJZXJyID0gLUVQRVJNOwotCQljcmVhdGUgPSAoY21kID09IFNJT0NBRERUVU5ORUwpOwogCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCQlicmVhazsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mIChwKSkpIHsKLQkJCWVyciA9IC1FRkFVTFQ7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsIHNpemVvZiAocCkpKQogCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCFjcmVhdGUgJiYgZGV2ICE9IGlwNmlwNl9mYl90bmxfZGV2KSB7Ci0JCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkJfQotCQlpZiAoIXQgJiYgKGVyciA9IGlwNmlwNl90bmxfbG9jYXRlKCZwLCAmdCwgY3JlYXRlKSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKHAucHJvdG8gIT0gSVBQUk9UT19JUFY2KQogCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7Ci0JCQlpZiAodC0+ZGV2ICE9IGRldikgewotCQkJCWVyciA9IC1FRVhJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCXQgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgY21kID09IFNJT0NBRERUVU5ORUwpOworCQlpZiAoZGV2ICE9IGlwNmlwNl9mYl90bmxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7CisJCQlpZiAodCAhPSBOVUxMKSB7CisJCQkJaWYgKHQtPmRldiAhPSBkZXYpIHsKKwkJCQkJZXJyID0gLUVFWElTVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJdCA9IG5ldGRldl9wcml2KGRldik7CisKIAkJCWlwNmlwNl90bmxfdW5saW5rKHQpOwogCQkJZXJyID0gaXA2aXA2X3RubF9jaGFuZ2UodCwgJnApOwogCQkJaXA2aXA2X3RubF9saW5rKHQpOwogCQkJbmV0ZGV2X3N0YXRlX2NoYW5nZShkZXYpOwogCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsCi0JCQkJICZ0LT5wYXJtcywgc2l6ZW9mIChwKSkpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSB7CisJCWlmICh0KSB7CiAJCQllcnIgPSAwOwotCQl9CisJCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCAmdC0+cGFybXMsIHNpemVvZiAocCkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisKKwkJfSBlbHNlCisJCQllcnIgPSAoY21kID09IFNJT0NBRERUVU5ORUwgPyAtRU5PQlVGUyA6IC1FTk9FTlQpOwogCQlicmVhazsKIAljYXNlIFNJT0NERUxUVU5ORUw6CiAJCWVyciA9IC1FUEVSTTsKQEAgLTk4MywyMiArOTg4LDE4IEBACiAJCQlicmVhazsKIAogCQlpZiAoZGV2ID09IGlwNmlwNl9mYl90bmxfZGV2KSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLAotCQkJCQkgICBzaXplb2YgKHApKSkgewotCQkJCWVyciA9IC1FRkFVTFQ7CisJCQllcnIgPSAtRUZBVUxUOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mIChwKSkpCiAJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllcnIgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgJnQsIDApOwotCQkJaWYgKGVycikKKwkJCWVyciA9IC1FTk9FTlQ7CisJCQlpZiAoKHQgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgMCkpID09IE5VTEwpCiAJCQkJYnJlYWs7Ci0JCQlpZiAodCA9PSBuZXRkZXZfcHJpdihpcDZpcDZfZmJfdG5sX2RldikpIHsKLQkJCQllcnIgPSAtRVBFUk07CisJCQllcnIgPSAtRVBFUk07CisJCQlpZiAodC0+ZGV2ID09IGlwNmlwNl9mYl90bmxfZGV2KQogCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJdCA9IG5ldGRldl9wcml2KGRldik7CisJCQlkZXYgPSB0LT5kZXY7CiAJCX0KLQkJZXJyID0gdW5yZWdpc3Rlcl9uZXRkZXZpY2UodC0+ZGV2KTsKKwkJZXJyID0gdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTExNDksNiArMTE1MCwyMCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcDZpcDZfZGVzdHJveV90dW5uZWxzKHZvaWQpCit7CisJaW50IGg7CisJc3RydWN0IGlwNl90bmwgKnQ7CisKKwlmb3IgKGggPSAwOyBoIDwgSEFTSF9TSVpFOyBoKyspIHsKKwkJd2hpbGUgKCh0ID0gdG5sc19yX2xbaF0pICE9IE5VTEwpCisJCQl1bnJlZ2lzdGVyX25ldGRldmljZSh0LT5kZXYpOworCX0KKworCXQgPSB0bmxzX3djWzBdOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHQtPmRldik7Cit9CisKIC8qKgogICogaXA2X3R1bm5lbF9jbGVhbnVwIC0gZnJlZSByZXNvdXJjZXMgYW5kIHVucmVnaXN0ZXIgcHJvdG9jb2wKICAqKi8KQEAgLTExNTgsNyArMTE3Myw5IEBACiAJaWYgKHhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlcikpCiAJCXByaW50ayhLRVJOX0lORk8gImlwNmlwNiBjbG9zZTogY2FuJ3QgZGVyZWdpc3RlciB0dW5uZWxcbiIpOwogCi0JdW5yZWdpc3Rlcl9uZXRkZXYoaXA2aXA2X2ZiX3RubF9kZXYpOworCXJ0bmxfbG9jaygpOworCWlwNmlwNl9kZXN0cm95X3R1bm5lbHMoKTsKKwlydG5sX3VubG9jaygpOwogfQogCiBtb2R1bGVfaW5pdChpcDZfdHVubmVsX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXBjb21wNi5jIGIvbmV0L2lwdjYvaXBjb21wNi5jCmluZGV4IDcxZjU5ZjEuLjUxMTczMGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwY29tcDYuYworKysgYi9uZXQvaXB2Ni9pcGNvbXA2LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpcGNvbXA2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkJICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKwkJICAgICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCiB7CiAJX19iZTMyIHNwaTsKIAlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyKilza2ItPmRhdGE7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKaW5kZXggZGU2YjkxOS4uMzUyNjkwZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3VkcGxpdGUuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTIzOSw2ICsyNDAsNyBAQAogCQkJc3RydWN0IHNrX2J1ZmYgKnBrdG9wdDsKIAogCQkJaWYgKHNrLT5za19wcm90b2NvbCAhPSBJUFBST1RPX1VEUCAmJgorCQkJICAgIHNrLT5za19wcm90b2NvbCAhPSBJUFBST1RPX1VEUExJVEUgJiYKIAkJCSAgICBzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCiAJCQkJYnJlYWs7CiAKQEAgLTI3NiwxMSArMjc4LDE1IEBACiAJCQkJc2stPnNrX2ZhbWlseSA9IFBGX0lORVQ7CiAJCQkJdGNwX3N5bmNfbXNzKHNrLCBpY3NrLT5pY3NrX3BtdHVfY29va2llKTsKIAkJCX0gZWxzZSB7CisJCQkJc3RydWN0IHByb3RvICpwcm90ID0gJnVkcF9wcm90OworCisJCQkJaWYgKHNrLT5za19wcm90b2NvbCA9PSBJUFBST1RPX1VEUExJVEUpCisJCQkJCXByb3QgPSAmdWRwbGl0ZV9wcm90OwogCQkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAkJCQlzb2NrX3Byb3RfZGVjX3VzZShzay0+c2tfcHJvdCk7Ci0JCQkJc29ja19wcm90X2luY191c2UoJnVkcF9wcm90KTsKKwkJCQlzb2NrX3Byb3RfaW5jX3VzZShwcm90KTsKIAkJCQlsb2NhbF9iaF9lbmFibGUoKTsKLQkJCQlzay0+c2tfcHJvdCA9ICZ1ZHBfcHJvdDsKKwkJCQlzay0+c2tfcHJvdCA9IHByb3Q7CiAJCQkJc2stPnNrX3NvY2tldC0+b3BzID0gJmluZXRfZGdyYW1fb3BzOwogCQkJCXNrLT5za19mYW1pbHkgPSBQRl9JTkVUOwogCQkJfQpAQCAtODEzLDYgKzgxOSw3IEBACiAJc3dpdGNoIChvcHRuYW1lKSB7CiAJY2FzZSBJUFY2X0FERFJGT1JNOgogCQlpZiAoc2stPnNrX3Byb3RvY29sICE9IElQUFJPVE9fVURQICYmCisJCSAgICBzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19VRFBMSVRFICYmCiAJCSAgICBzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCkBAIC05NzEsMTIgKzk3OCwyNyBAQAogCQlicmVhazsKIAogCWNhc2UgSVBWNl9VTklDQVNUX0hPUFM6Ci0JCXZhbCA9IG5wLT5ob3BfbGltaXQ7Ci0JCWJyZWFrOwotCiAJY2FzZSBJUFY2X01VTFRJQ0FTVF9IT1BTOgotCQl2YWwgPSBucC0+bWNhc3RfaG9wczsKKwl7CisJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKworCQlpZiAob3B0bmFtZSA9PSBJUFY2X1VOSUNBU1RfSE9QUykKKwkJCXZhbCA9IG5wLT5ob3BfbGltaXQ7CisJCWVsc2UKKwkJCXZhbCA9IG5wLT5tY2FzdF9ob3BzOworCisJCWRzdCA9IHNrX2RzdF9nZXQoc2spOworCQlpZiAoZHN0KSB7CisJCQlpZiAodmFsIDwgMCkKKwkJCQl2YWwgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9IT1BMSU1JVCk7CisJCQlpZiAodmFsIDwgMCkKKwkJCQl2YWwgPSBpcHY2X2dldF9ob3BsaW1pdChkc3QtPmRldik7CisJCQlkc3RfcmVsZWFzZShkc3QpOworCQl9CisJCWlmICh2YWwgPCAwKQorCQkJdmFsID0gaXB2Nl9kZXZjb25mLmhvcF9saW1pdDsKIAkJYnJlYWs7CisJfQogCiAJY2FzZSBJUFY2X01VTFRJQ0FTVF9MT09QOgogCQl2YWwgPSBucC0+bWNfbG9vcDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IDNiMTE0ZTMuLmExYzIzMWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtODMsNyArODMsNyBAQAogc3RydWN0IG1sZDJfZ3JlYyB7CiAJX191OAkJZ3JlY190eXBlOwogCV9fdTgJCWdyZWNfYXV4d29yZHM7Ci0JX191MTYJCWdyZWNfbnNyY3M7CisJX19iZTE2CQlncmVjX25zcmNzOwogCXN0cnVjdCBpbjZfYWRkcglncmVjX21jYTsKIAlzdHJ1Y3QgaW42X2FkZHIJZ3JlY19zcmNbMF07CiB9OwpAQCAtOTEsMTggKzkxLDE4IEBACiBzdHJ1Y3QgbWxkMl9yZXBvcnQgewogCV9fdTgJdHlwZTsKIAlfX3U4CXJlc3YxOwotCV9fdTE2CWNzdW07Ci0JX191MTYJcmVzdjI7Ci0JX191MTYJbmdyZWM7CisJX19zdW0xNgljc3VtOworCV9fYmUxNglyZXN2MjsKKwlfX2JlMTYJbmdyZWM7CiAJc3RydWN0IG1sZDJfZ3JlYyBncmVjWzBdOwogfTsKIAogc3RydWN0IG1sZDJfcXVlcnkgewogCV9fdTggdHlwZTsKIAlfX3U4IGNvZGU7Ci0JX191MTYgY3N1bTsKLQlfX3UxNiBtcmM7Ci0JX191MTYgcmVzdjE7CisJX19zdW0xNiBjc3VtOworCV9fYmUxNiBtcmM7CisJX19iZTE2IHJlc3YxOwogCXN0cnVjdCBpbjZfYWRkciBtY2E7CiAjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCiAJX191OCBxcnY6MywKQEAgLTExNiw3ICsxMTYsNyBAQAogI2Vycm9yICJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgogI2VuZGlmCiAJX191OCBxcWljOwotCV9fdTE2IG5zcmNzOworCV9fYmUxNiBuc3JjczsKIAlzdHJ1Y3QgaW42X2FkZHIgc3Jjc1swXTsKIH07CiAKQEAgLTE0NjUsNyArMTQ2NSw3IEBACiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGluNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKIAlpbnQgZXJyOwogCi0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CiAJcGF5bG9hZF9sZW4gPSBza2ItPnRhaWwgLSAodW5zaWduZWQgY2hhciAqKXNrYi0+bmguaXB2NmggLQogCQlzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCW1sZGxlbiA9IHNrYi0+dGFpbCAtIHNrYi0+aC5yYXc7CkBAIC0xNDc3LDkgKzE0NzcsOSBAQAogCQltbGRfZGV2X3F1ZXVlX3htaXQpOwogCWlmICghZXJyKSB7CiAJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LElDTVA2X01JQl9PVVRNU0dTKTsKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMpOworCQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVE1DQVNUUEtUUyk7CiAJfSBlbHNlCi0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAogCWlmIChsaWtlbHkoaWRldiAhPSBOVUxMKSkKIAkJaW42X2Rldl9wdXQoaWRldik7CkBAIC0xNzYzLDcgKzE3NjMsMTAgQEAKIAkJICAgICBJUFY2X1RMVl9ST1VURVJBTEVSVCwgMiwgMCwgMCwKIAkJICAgICBJUFY2X1RMVl9QQUROLCAwIH07CiAKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJSVA2X0lOQ19TVEFUUyhfX2luNl9kZXZfZ2V0KGRldiksCisJCSAgICAgIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlzbmRfYWRkciA9IGFkZHI7CiAJaWYgKHR5cGUgPT0gSUNNUFY2X01HTV9SRURVQ1RJT04pIHsKIAkJc25kX2FkZHIgPSAmYWxsX3JvdXRlcnM7CkBAIC0xNzc3LDcgKzE3ODAsMTAgQEAKIAlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpICsgZnVsbF9sZW4sIDEsICZlcnIpOwogCiAJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCUlQNl9JTkNfU1RBVFMoX19pbjZfZGV2X2dldChkZXYpLAorCQkJICAgICAgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTgxNiw5ICsxODIyLDkgQEAKIAkJZWxzZQogCQkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRHUk9VUE1FTUJSRVNQT05TRVMpOwogCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVE1TR1MpOwotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE1DQVNUUEtUUyk7CisJCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUTUNBU1RQS1RTKTsKIAl9IGVsc2UKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VURElTQ0FSRFMpOwogCiAJaWYgKGxpa2VseShpZGV2ICE9IE5VTEwpKQogCQlpbjZfZGV2X3B1dChpZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21pcDYuYyBiL25ldC9pcHY2L21pcDYuYwppbmRleCA3Y2NkYzhmLi5iZTdkZDdkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9taXA2LmMKKysrIGIvbmV0L2lwdjYvbWlwNi5jCkBAIC0yNjIsMTAgKzI2MiwxMCBAQAogCXNlbC5wcm90byA9IGZsLT5wcm90bzsKIAlzZWwuZHBvcnQgPSB4ZnJtX2Zsb3dpX2Rwb3J0KGZsKTsKIAlpZiAoc2VsLmRwb3J0KQotCQlzZWwuZHBvcnRfbWFzayA9IH4oKF9fdTE2KTApOworCQlzZWwuZHBvcnRfbWFzayA9IGh0b25zKH4wKTsKIAlzZWwuc3BvcnQgPSB4ZnJtX2Zsb3dpX3Nwb3J0KGZsKTsKIAlpZiAoc2VsLnNwb3J0KQotCQlzZWwuc3BvcnRfbWFzayA9IH4oKF9fdTE2KTApOworCQlzZWwuc3BvcnRfbWFzayA9IGh0b25zKH4wKTsKIAlzZWwuaWZpbmRleCA9IGZsLT5vaWY7CiAKIAllcnIgPSBrbV9yZXBvcnQoSVBQUk9UT19EU1RPUFRTLCAmc2VsLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmRpc2MuYyBiL25ldC9pcHY2L25kaXNjLmMKaW5kZXggMDMwNGI1Zi4uNmE5ZjYxNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmRpc2MuYworKysgYi9uZXQvaXB2Ni9uZGlzYy5jCkBAIC00NzIsNyArNDcyLDkgQEAKIAkJCWluY19vcHQgPSAwOwogCX0KIAotCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIE1BWF9IRUFERVIgKyBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpLAorCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCisJCQkJICAoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKworCQkJCSAgIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldikpLAogCQkJCSAgMSwgJmVycik7CiAKIAlpZiAoc2tiID09IE5VTEwpIHsKQEAgLTUxMyw3ICs1MTUsNyBAQAogCiAJc2tiLT5kc3QgPSBkc3Q7CiAJaWRldiA9IGluNl9kZXZfZ2V0KGRzdC0+ZGV2KTsKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKIAllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsIGRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKIAlpZiAoIWVycikgewogCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVE5FSUdIQk9SQURWRVJUSVNFTUVOVFMpOwpAQCAtNTYxLDcgKzU2Myw5IEBACiAJaWYgKHNlbmRfbGxpbmZvKQogCQlsZW4gKz0gbmRpc2Nfb3B0X2FkZHJfc3BhY2UoZGV2KTsKIAotCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIE1BWF9IRUFERVIgKyBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpLAorCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCisJCQkJICAoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKworCQkJCSAgIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldikpLAogCQkJCSAgMSwgJmVycik7CiAJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCU5EX1BSSU5USzAoS0VSTl9FUlIKQEAgLTU5Nyw3ICs2MDEsNyBAQAogCS8qIHNlbmQgaXQhICovCiAJc2tiLT5kc3QgPSBkc3Q7CiAJaWRldiA9IGluNl9kZXZfZ2V0KGRzdC0+ZGV2KTsKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKKwlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKIAllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsIGRzdC0+ZGV2LCBkc3Rfb3V0cHV0KTsKIAlpZiAoIWVycikgewogCQlJQ01QNl9JTkNfU1RBVFMoaWRldiwgSUNNUDZfTUlCX09VVE5FSUdIQk9SU09MSUNJVFMpOwpAQCAtNjM2LDcgKzY0MCw5IEBACiAJaWYgKGRldi0+YWRkcl9sZW4pCiAJCWxlbiArPSBuZGlzY19vcHRfYWRkcl9zcGFjZShkZXYpOwogCi0gICAgICAgIHNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIE1BWF9IRUFERVIgKyBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpLAorICAgICAgICBza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAorCQkJCSAgKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKKwkJCQkgICBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKSwKIAkJCQkgIDEsICZlcnIpOwogCWlmIChza2IgPT0gTlVMTCkgewogCQlORF9QUklOVEswKEtFUk5fRVJSCkBAIC02NzAsNyArNjc2LDcgQEAKIAkvKiBzZW5kIGl0ISAqLwogCXNrYi0+ZHN0ID0gZHN0OwogCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CQorCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwogCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOwogCWlmICghZXJyKSB7CiAJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUUk9VVEVSU09MSUNJVFMpOwpAQCAtOTY3LDggKzk3Myw2IEBACiAJCSAgICBpcHY2X2RldmNvbmYuZm9yd2FyZGluZyAmJiBpcHY2X2RldmNvbmYucHJveHlfbmRwICYmCiAJCSAgICBwbmVpZ2hfbG9va3VwKCZuZF90YmwsICZtc2ctPnRhcmdldCwgZGV2LCAwKSkgewogCQkJLyogWFhYOiBpZGV2LT5jbmYucHJpeHlfbmRwICovCi0JCQlXQVJOX09OKHNrYi0+ZHN0ICE9IE5VTEwgJiYKLQkJCQkoKHN0cnVjdCBydDZfaW5mbyAqKXNrYi0+ZHN0KS0+cnQ2aV9pZGV2KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTEyNjMsMTAgKzEyNjcsMTEgQEAKIAl9CiAKIAlpZiAobmRvcHRzLm5kX29wdHNfbXR1KSB7CisJCV9fYmUzMiBuOwogCQl1MzIgbXR1OwogCi0JCW1lbWNweSgmbXR1LCAoKHU4KikobmRvcHRzLm5kX29wdHNfbXR1KzEpKSsyLCBzaXplb2YobXR1KSk7Ci0JCW10dSA9IG50b2hsKG10dSk7CisJCW1lbWNweSgmbiwgKCh1OCopKG5kb3B0cy5uZF9vcHRzX210dSsxKSkrMiwgc2l6ZW9mKG10dSkpOworCQltdHUgPSBudG9obChuKTsKIAogCQlpZiAobXR1IDwgSVBWNl9NSU5fTVRVIHx8IG10dSA+IHNrYi0+ZGV2LT5tdHUpIHsKIAkJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCkBAIC0xNDQ4LDcgKzE0NTMsOSBAQAogCXJkX2xlbiAmPSB+MHg3OwogCWxlbiArPSByZF9sZW47CiAKLQlidWZmID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgTUFYX0hFQURFUiArIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldiksCisJYnVmZiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCisJCQkJICAgKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKKwkJCQkgICAgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSksCiAJCQkJICAgMSwgJmVycik7CiAJaWYgKGJ1ZmYgPT0gTlVMTCkgewogCQlORF9QUklOVEswKEtFUk5fRVJSCkBAIC0xNTA2LDcgKzE1MTMsNyBAQAogCiAJYnVmZi0+ZHN0ID0gZHN0OwogCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CisJSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CiAJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgYnVmZiwgTlVMTCwgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOwogCWlmICghZXJyKSB7CiAJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUUkVESVJFQ1RTKTsKQEAgLTE2NjAsOCArMTY2Nyw3IEBACiBzdGF0aWMgaW50IG5kaXNjX2lmaW5mb19zeXNjdGxfc3RyYXRlZ3koY3RsX3RhYmxlICpjdGwsIGludCBfX3VzZXIgKm5hbWUsCiAJCQkJCWludCBubGVuLCB2b2lkIF9fdXNlciAqb2xkdmFsLAogCQkJCQlzaXplX3QgX191c2VyICpvbGRsZW5wLAotCQkJCQl2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLAotCQkJCQl2b2lkICoqY29udGV4dCkKKwkJCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY3RsLT5leHRyYTE7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKQEAgLTE2NzQsMTQgKzE2ODAsMTIgQEAKIAlzd2l0Y2ggKGN0bC0+Y3RsX25hbWUpIHsKIAljYXNlIE5FVF9ORUlHSF9SRUFDSEFCTEVfVElNRToKIAkJcmV0ID0gc3lzY3RsX2ppZmZpZXMoY3RsLCBuYW1lLCBubGVuLAotCQkJCSAgICAgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbiwKLQkJCQkgICAgIGNvbnRleHQpOworCQkJCSAgICAgb2xkdmFsLCBvbGRsZW5wLCBuZXd2YWwsIG5ld2xlbik7CiAJCWJyZWFrOwogCWNhc2UgTkVUX05FSUdIX1JFVFJBTlNfVElNRV9NUzoKIAljYXNlIE5FVF9ORUlHSF9SRUFDSEFCTEVfVElNRV9NUzoKIAkJIHJldCA9IHN5c2N0bF9tc19qaWZmaWVzKGN0bCwgbmFtZSwgbmxlbiwKLQkJCQkJIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4sCi0JCQkJCSBjb250ZXh0KTsKKwkJCQkJIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4pOwogCQkgYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gMDsKQEAgLTE3NDQsNiArMTc0OCw3IEBACiAKIHZvaWQgbmRpc2NfY2xlYW51cCh2b2lkKQogeworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZuZGlzY19uZXRkZXZfbm90aWZpZXIpOwogI2lmZGVmIENPTkZJR19TWVNDVEwKIAluZWlnaF9zeXNjdGxfdW5yZWdpc3RlcigmbmRfdGJsLnBhcm1zKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwppbmRleCA1ODBiMWFiLi5mNjI5NGU1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIuYwpAQCAtMzEsNyArMzEsNyBAQAogI2VuZGlmCiAKIAlpZiAoZHN0LT5lcnJvcikgewotCQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOwogCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpcDZfcm91dGVfbWVfaGFyZGVyOiBObyBtb3JlIHJvdXRlLlxuIik7CiAJCWRzdF9yZWxlYXNlKGRzdCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODAsMTEgKzgwLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGludCBuZl9pcDZfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCitfX3N1bTE2IG5mX2lwNl9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKIAkJCSAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsIHVfaW50OF90IHByb3RvY29sKQogewogCXN0cnVjdCBpcHY2aGRyICppcDZoID0gc2tiLT5uaC5pcHY2aDsKLQl1bnNpZ25lZCBpbnQgY3N1bSA9IDA7CisJX19zdW0xNiBjc3VtID0gMDsKIAogCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKIAljYXNlIENIRUNLU1VNX0NPTVBMRVRFOgpAQCAtMTAwLDEyICsxMDAsMTMgQEAKIAkJfQogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIENIRUNLU1VNX05PTkU6Ci0JCXNrYi0+Y3N1bSA9IH5jc3VtX2lwdjZfbWFnaWMoJmlwNmgtPnNhZGRyLCAmaXA2aC0+ZGFkZHIsCisJCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZCgKKwkJCQljc3VtX2lwdjZfbWFnaWMoJmlwNmgtPnNhZGRyLCAmaXA2aC0+ZGFkZHIsCiAJCQkJCSAgICAgc2tiLT5sZW4gLSBkYXRhb2ZmLAogCQkJCQkgICAgIHByb3RvY29sLAogCQkJCQkgICAgIGNzdW1fc3ViKDAsCiAJCQkJCQkgICAgICBza2JfY2hlY2tzdW0oc2tiLCAwLAotCQkJCQkJCSAgICAgICAgICAgZGF0YW9mZiwgMCkpKTsKKwkJCQkJCQkgICAgICAgICAgIGRhdGFvZmYsIDApKSkpOwogCQljc3VtID0gX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKIAl9CiAJcmV0dXJuIGNzdW07CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDRiYzRlNWIuLmZjM2U1ZWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCkBAIC02LDcgKzYsNyBAQAogCWRlcGVuZHMgb24gSU5FVCAmJiBJUFY2ICYmIE5FVEZJTFRFUiAmJiBFWFBFUklNRU5UQUwKIAogY29uZmlnIE5GX0NPTk5UUkFDS19JUFY2Ci0JdHJpc3RhdGUgIklQdjYgc3VwcG9ydCBmb3IgbmV3IGNvbm5lY3Rpb24gdHJhY2tpbmcgKEVYUEVSSU1FTlRBTCkiCisJdHJpc3RhdGUgIklQdjYgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSwogCS0tLWhlbHAtLS0KIAkgIENvbm5lY3Rpb24gdHJhY2tpbmcga2VlcHMgYSByZWNvcmQgb2Ygd2hhdCBwYWNrZXRzIGhhdmUgcGFzc2VkCkBAIC00MCw3ICs0MCw3IEBACiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIElQNl9ORl9JUFRBQkxFUwotCXRyaXN0YXRlICJJUDYgdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBmaWx0ZXJpbmcvbWFzcS9OQVQpIgorCXRyaXN0YXRlICJJUDYgdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBmaWx0ZXJpbmcpIgogCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAloZWxwCiAJICBpcDZ0YWJsZXMgaXMgYSBnZW5lcmFsLCBleHRlbnNpYmxlIHBhY2tldCBpZGVudGlmaWNhdGlvbiBmcmFtZXdvcmsuCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKaW5kZXggOTUxMGMyNC4uZDRkOWYxOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJcG1zZy0+ZGF0YV9sZW4gICAgICAgID0gZGF0YV9sZW47CiAJcG1zZy0+dGltZXN0YW1wX3NlYyAgID0gZW50cnktPnNrYi0+dHN0YW1wLm9mZl9zZWM7CiAJcG1zZy0+dGltZXN0YW1wX3VzZWMgID0gZW50cnktPnNrYi0+dHN0YW1wLm9mZl91c2VjOwotCXBtc2ctPm1hcmsgICAgICAgICAgICA9IGVudHJ5LT5za2ItPm5mbWFyazsKKwlwbXNnLT5tYXJrICAgICAgICAgICAgPSBlbnRyeS0+c2tiLT5tYXJrOwogCXBtc2ctPmhvb2sgICAgICAgICAgICA9IGVudHJ5LT5pbmZvLT5ob29rOwogCXBtc2ctPmh3X3Byb3RvY29sICAgICA9IGVudHJ5LT5za2ItPnByb3RvY29sOwogCQpAQCAtMzQ5LDkgKzM0OSwxMCBAQAogCWlmICh2LT5kYXRhX2xlbiA8IHNpemVvZigqdXNlcl9pcGgpKQogCQlyZXR1cm4gMDsKIAlkaWZmID0gdi0+ZGF0YV9sZW4gLSBlLT5za2ItPmxlbjsKLQlpZiAoZGlmZiA8IDApCi0JCXNrYl90cmltKGUtPnNrYiwgdi0+ZGF0YV9sZW4pOwotCWVsc2UgaWYgKGRpZmYgPiAwKSB7CisJaWYgKGRpZmYgPCAwKSB7CisJCWlmIChwc2tiX3RyaW0oZS0+c2tiLCB2LT5kYXRhX2xlbikpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgaWYgKGRpZmYgPiAwKSB7CiAJCWlmICh2LT5kYXRhX2xlbiA+IDB4RkZGRikKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoZGlmZiA+IHNrYl90YWlscm9vbShlLT5za2IpKSB7CkBAIC02MTksNiArNjIwLDcgQEAKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50CiBpcHFfZ2V0X2luZm8oY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKIHsKQEAgLTY1Miw2ICs2NTQsNyBAQAogCQlsZW4gPSAwOwogCXJldHVybiBsZW47CiB9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogc3RhdGljIHN0cnVjdCBuZl9xdWV1ZV9oYW5kbGVyIG5mcWggPSB7CiAJLm5hbWUJPSAiaXA2X3F1ZXVlIiwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCmluZGV4IDRhYjM2OGYuLjk5NTAyYzUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwpAQCAtMTExLDcgKzExMSw3IEBACiAJCSBjb25zdCBjaGFyICpvdXRkZXYsCiAJCSBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwNmluZm8sCiAJCSB1bnNpZ25lZCBpbnQgKnByb3RvZmYsCi0JCSBpbnQgKmZyYWdvZmYpCisJCSBpbnQgKmZyYWdvZmYsIGludCAqaG90ZHJvcCkKIHsKIAlzaXplX3QgaTsKIAl1bnNpZ25lZCBsb25nIHJldDsKQEAgLTE2OSw5ICsxNjksMTEgQEAKIAkJdW5zaWduZWQgc2hvcnQgX2ZyYWdfb2ZmOwogCiAJCXByb3RvaGRyID0gaXB2Nl9maW5kX2hkcihza2IsIHByb3RvZmYsIC0xLCAmX2ZyYWdfb2ZmKTsKLQkJaWYgKHByb3RvaGRyIDwgMCkKKwkJaWYgKHByb3RvaGRyIDwgMCkgeworCQkJaWYgKF9mcmFnX29mZiA9PSAwKQorCQkJCSpob3Rkcm9wID0gMTsKIAkJCXJldHVybiAwOwotCisJCX0KIAkJKmZyYWdvZmYgPSBfZnJhZ19vZmY7CiAKIAkJZHByaW50ZigiUGFja2V0IHByb3RvY29sICVoaSA/PSAlcyVoaS5cbiIsCkBAIC0yOTAsNyArMjkyLDcgQEAKIAkJSVBfTkZfQVNTRVJUKGUpOwogCQlJUF9ORl9BU1NFUlQoYmFjayk7CiAJCWlmIChpcDZfcGFja2V0X21hdGNoKCpwc2tiLCBpbmRldiwgb3V0ZGV2LCAmZS0+aXB2NiwKLQkJCSZwcm90b2ZmLCAmb2Zmc2V0KSkgeworCQkJJnByb3RvZmYsICZvZmZzZXQsICZob3Rkcm9wKSkgewogCQkJc3RydWN0IGlwNnRfZW50cnlfdGFyZ2V0ICp0OwogCiAJCQlpZiAoSVA2VF9NQVRDSF9JVEVSQVRFKGUsIGRvX21hdGNoLApAQCAtNDExLDYgKzQxMyw3IEBACiAJCXVuc2lnbmVkIGludCBwb3MgPSBuZXdpbmZvLT5ob29rX2VudHJ5W2hvb2tdOwogCQlzdHJ1Y3QgaXA2dF9lbnRyeSAqZQogCQkJPSAoc3RydWN0IGlwNnRfZW50cnkgKikoZW50cnkwICsgcG9zKTsKKwkJaW50IHZpc2l0ZWQgPSBlLT5jb21lZnJvbSAmICgxIDw8IGhvb2spOwogCiAJCWlmICghKHZhbGlkX2hvb2tzICYgKDEgPDwgaG9vaykpKQogCQkJY29udGludWU7CkBAIC00MzEsMTMgKzQzNCwyMCBAQAogCQkJCXw9ICgoMSA8PCBob29rKSB8ICgxIDw8IE5GX0lQNl9OVU1IT09LUykpOwogCiAJCQkvKiBVbmNvbmRpdGlvbmFsIHJldHVybi9FTkQuICovCi0JCQlpZiAoZS0+dGFyZ2V0X29mZnNldCA9PSBzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpCisJCQlpZiAoKGUtPnRhcmdldF9vZmZzZXQgPT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KQogCQkJICAgICYmIChzdHJjbXAodC0+dGFyZ2V0LnUudXNlci5uYW1lLAogCQkJCSAgICAgICBJUDZUX1NUQU5EQVJEX1RBUkdFVCkgPT0gMCkKIAkJCSAgICAmJiB0LT52ZXJkaWN0IDwgMAotCQkJICAgICYmIHVuY29uZGl0aW9uYWwoJmUtPmlwdjYpKSB7CisJCQkgICAgJiYgdW5jb25kaXRpb25hbCgmZS0+aXB2NikpIHx8IHZpc2l0ZWQpIHsKIAkJCQl1bnNpZ25lZCBpbnQgb2xkcG9zLCBzaXplOwogCisJCQkJaWYgKHQtPnZlcmRpY3QgPCAtTkZfTUFYX1ZFUkRJQ1QgLSAxKSB7CisJCQkJCWR1cHJpbnRmKCJtYXJrX3NvdXJjZV9jaGFpbnM6IGJhZCAiCisJCQkJCQkibmVnYXRpdmUgdmVyZGljdCAoJWkpXG4iLAorCQkJCQkJCQl0LT52ZXJkaWN0KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCiAJCQkJLyogUmV0dXJuOiBiYWNrdHJhY2sgdGhyb3VnaCB0aGUgbGFzdAogCQkJCSAgIGJpZyBqdW1wLiAqLwogCQkJCWRvIHsKQEAgLTQ3NSw2ICs0ODUsMTMgQEAKIAkJCQlpZiAoc3RyY21wKHQtPnRhcmdldC51LnVzZXIubmFtZSwKIAkJCQkJICAgSVA2VF9TVEFOREFSRF9UQVJHRVQpID09IDAKIAkJCQkgICAgJiYgbmV3cG9zID49IDApIHsKKwkJCQkJaWYgKG5ld3BvcyA+IG5ld2luZm8tPnNpemUgLQorCQkJCQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSkgeworCQkJCQkJZHVwcmludGYoIm1hcmtfc291cmNlX2NoYWluczogIgorCQkJCQkJCSJiYWQgdmVyZGljdCAoJWkpXG4iLAorCQkJCQkJCQluZXdwb3MpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KIAkJCQkJLyogVGhpcyBhIGp1bXA7IGNoYXNlIGl0LiAqLwogCQkJCQlkdXByaW50ZigiSnVtcCBydWxlICV1IC0+ICV1XG4iLAogCQkJCQkJIHBvcywgbmV3cG9zKTsKQEAgLTUwNywyNyArNTI0LDYgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLXN0YW5kYXJkX2NoZWNrKGNvbnN0IHN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCAqdCwKLQkgICAgICAgdW5zaWduZWQgaW50IG1heF9vZmZzZXQpCi17Ci0Jc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0ICp0YXJnID0gKHZvaWQgKil0OwotCi0JLyogQ2hlY2sgc3RhbmRhcmQgaW5mby4gKi8KLQlpZiAodGFyZy0+dmVyZGljdCA+PSAwCi0JICAgICYmIHRhcmctPnZlcmRpY3QgPiBtYXhfb2Zmc2V0IC0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSkgewotCQlkdXByaW50ZigiaXA2dF9zdGFuZGFyZF9jaGVjazogYmFkIHZlcmRpY3QgKCVpKVxuIiwKLQkJCSB0YXJnLT52ZXJkaWN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICh0YXJnLT52ZXJkaWN0IDwgLU5GX01BWF9WRVJESUNUIC0gMSkgewotCQlkdXByaW50ZigiaXA2dF9zdGFuZGFyZF9jaGVjazogYmFkIG5lZ2F0aXZlIHZlcmRpY3QgKCVpKVxuIiwKLQkJCSB0YXJnLT52ZXJkaWN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludAogY2hlY2tfbWF0Y2goc3RydWN0IGlwNnRfZW50cnlfbWF0Y2ggKm0sCiAJICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiwKQEAgLTU4NCwxMiArNTgwLDE5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChlLT50YXJnZXRfb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCkgPgorCQkJCQkJCQllLT5uZXh0X29mZnNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlqID0gMDsKIAlyZXQgPSBJUDZUX01BVENIX0lURVJBVEUoZSwgY2hlY2tfbWF0Y2gsIG5hbWUsICZlLT5pcHY2LCBlLT5jb21lZnJvbSwgJmopOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBjbGVhbnVwX21hdGNoZXM7CiAKIAl0ID0gaXA2dF9nZXRfdGFyZ2V0KGUpOworCXJldCA9IC1FSU5WQUw7CisJaWYgKGUtPnRhcmdldF9vZmZzZXQgKyB0LT51LnRhcmdldF9zaXplID4gZS0+bmV4dF9vZmZzZXQpCisJCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIAl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChBRl9JTkVUNiwKIAkJCQkJCQl0LT51LnVzZXIubmFtZSwKIAkJCQkJCQl0LT51LnVzZXIucmV2aXNpb24pLApAQCAtNjA3LDEyICs2MTAsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0JaWYgKHQtPnUua2VybmVsLnRhcmdldCA9PSAmaXA2dF9zdGFuZGFyZF90YXJnZXQpIHsKLQkJaWYgKCFzdGFuZGFyZF9jaGVjayh0LCBzaXplKSkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlIGlmICh0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkKKwlpZiAodC0+dS5rZXJuZWwudGFyZ2V0LT5jaGVja2VudHJ5CiAJCSAgICYmICF0LT51Lmtlcm5lbC50YXJnZXQtPmNoZWNrZW50cnkobmFtZSwgZSwgdGFyZ2V0LCB0LT5kYXRhLAogCQkJCQkJICAgICAgZS0+Y29tZWZyb20pKSB7CiAJCWR1cHJpbnRmKCJpcF90YWJsZXM6IGNoZWNrIGZhaWxlZCBmb3IgYCVzJy5cbiIsCkBAIC03NTksNyArNzU3LDcgQEAKIAogCWlmIChyZXQgIT0gMCkgewogCQlJUDZUX0VOVFJZX0lURVJBVEUoZW50cnkwLCBuZXdpbmZvLT5zaXplLAotCQkJCSAgY2xlYW51cF9lbnRyeSwgJmkpOworCQkJCSAgIGNsZWFudXBfZW50cnksICZpKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTc2OSw3ICs3NjcsNyBAQAogCQkJbWVtY3B5KG5ld2luZm8tPmVudHJpZXNbaV0sIGVudHJ5MCwgbmV3aW5mby0+c2l6ZSk7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyogR2V0cyBjb3VudGVycy4gKi8KQEAgLTE0MzgsNiArMTQzNiw5IEBACiAgKiBJZiB0YXJnZXQgaGVhZGVyIGlzIGZvdW5kLCBpdHMgb2Zmc2V0IGlzIHNldCBpbiAqb2Zmc2V0IGFuZCByZXR1cm4gcHJvdG9jb2wKICAqIG51bWJlci4gT3RoZXJ3aXNlLCByZXR1cm4gLTEuCiAgKgorICogSWYgdGhlIGZpcnN0IGZyYWdtZW50IGRvZXNuJ3QgY29udGFpbiB0aGUgZmluYWwgcHJvdG9jb2wgaGVhZGVyIG9yCisgKiBORVhUSERSX05PTkUgaXQgaXMgY29uc2lkZXJlZCBpbnZhbGlkLgorICoKICAqIE5vdGUgdGhhdCBub24tMXN0IGZyYWdtZW50IGlzIHNwZWNpYWwgY2FzZSB0aGF0ICJ0aGUgcHJvdG9jb2wgbnVtYmVyCiAgKiBvZiBsYXN0IGhlYWRlciIgaXMgIm5leHQgaGVhZGVyIiBmaWVsZCBpbiBGcmFnbWVudCBoZWFkZXIuIEluIHRoaXMgY2FzZSwKICAqICpvZmZzZXQgaXMgbWVhbmluZ2xlc3MgYW5kIGZyYWdtZW50IG9mZnNldCBpcyBzdG9yZWQgaW4gKmZyYWdvZmYgaWYgZnJhZ29mZgpAQCAtMTQ2MSwzMiArMTQ2MiwzMyBAQAogCQlpZiAoKCFpcHY2X2V4dF9oZHIobmV4dGhkcikpIHx8IG5leHRoZHIgPT0gTkVYVEhEUl9OT05FKSB7CiAJCQlpZiAodGFyZ2V0IDwgMCkKIAkJCQlicmVhazsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAKIAkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzdGFydCwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CiAJCWlmIChocCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FQkFETVNHOwogCQlpZiAobmV4dGhkciA9PSBORVhUSERSX0ZSQUdNRU5UKSB7Ci0JCQl1bnNpZ25lZCBzaG9ydCBfZnJhZ19vZmYsICpmcDsKKwkJCXVuc2lnbmVkIHNob3J0IF9mcmFnX29mZjsKKwkJCV9fYmUxNiAqZnA7CiAJCQlmcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCiAJCQkJCQlzdGFydCtvZmZzZXRvZihzdHJ1Y3QgZnJhZ19oZHIsCiAJCQkJCQkJICAgICAgIGZyYWdfb2ZmKSwKIAkJCQkJCXNpemVvZihfZnJhZ19vZmYpLAogCQkJCQkJJl9mcmFnX29mZik7CiAJCQlpZiAoZnAgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIC1FQkFETVNHOwogCiAJCQlfZnJhZ19vZmYgPSBudG9ocygqZnApICYgfjB4NzsKIAkJCWlmIChfZnJhZ19vZmYpIHsKIAkJCQlpZiAodGFyZ2V0IDwgMCAmJgogCQkJCSAgICAoKCFpcHY2X2V4dF9oZHIoaHAtPm5leHRoZHIpKSB8fAotCQkJCSAgICAgbmV4dGhkciA9PSBORVhUSERSX05PTkUpKSB7CisJCQkJICAgICBocC0+bmV4dGhkciA9PSBORVhUSERSX05PTkUpKSB7CiAJCQkJCWlmIChmcmFnb2ZmKQogCQkJCQkJKmZyYWdvZmYgPSBfZnJhZ19vZmY7CiAJCQkJCXJldHVybiBocC0+bmV4dGhkcjsKIAkJCQl9Ci0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAtRU5PRU5UOwogCQkJfQogCQkJaGRybGVuID0gODsKIAkJfSBlbHNlIGlmIChuZXh0aGRyID09IE5FWFRIRFJfQVVUSCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKaW5kZXggMGNmNTM3ZC4uMzNiMWZhYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMKQEAgLTY5LDkgKzY5LDkgQEAKIAkvKiBNYXggbGVuZ3RoOiA0NCAiTEVOPTY1NTM1IFRDPTI1NSBIT1BMSU1JVD0yNTUgRkxPV0xCTD1GRkZGRiAiICovCiAJcHJpbnRrKCJMRU49JVp1IFRDPSV1IEhPUExJTUlUPSV1IEZMT1dMQkw9JXUgIiwKIAkgICAgICAgbnRvaHMoaWgtPnBheWxvYWRfbGVuKSArIHNpemVvZihzdHJ1Y3QgaXB2NmhkciksCi0JICAgICAgIChudG9obCgqKHVfaW50MzJfdCAqKWloKSAmIDB4MGZmMDAwMDApID4+IDIwLAorCSAgICAgICAobnRvaGwoKihfX2JlMzIgKilpaCkgJiAweDBmZjAwMDAwKSA+PiAyMCwKIAkgICAgICAgaWgtPmhvcF9saW1pdCwKLQkgICAgICAgKG50b2hsKCoodV9pbnQzMl90ICopaWgpICYgMHgwMDBmZmZmZikpOworCSAgICAgICAobnRvaGwoKihfX2JlMzIgKilpaCkgJiAweDAwMGZmZmZmKSk7CiAKIAlmcmFnbWVudCA9IDA7CiAJcHRyID0gaXA2aG9mZiArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CkBAIC0yNzAsMTEgKzI3MCwxNSBAQAogCQl9CiAJCWJyZWFrOwogCX0KLQljYXNlIElQUFJPVE9fVURQOiB7CisJY2FzZSBJUFBST1RPX1VEUDoKKwljYXNlIElQUFJPVE9fVURQTElURTogewogCQlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7CiAKLQkJLyogTWF4IGxlbmd0aDogMTAgIlBST1RPPVVEUCAiICovCi0JCXByaW50aygiUFJPVE89VURQICIpOworCQlpZiAoY3VycmVudGhkciA9PSBJUFBST1RPX1VEUCkKKwkJCS8qIE1heCBsZW5ndGg6IDEwICJQUk9UTz1VRFAgIiAgICAgKi8KKwkJCXByaW50aygiUFJPVE89VURQICIgKTsKKwkJZWxzZQkvKiBNYXggbGVuZ3RoOiAxNCAiUFJPVE89VURQTElURSAiICovCisJCQlwcmludGsoIlBST1RPPVVEUExJVEUgIik7CiAKIAkJaWYgKGZyYWdtZW50KQogCQkJYnJlYWs7CkBAIC00MzYsMTMgKzQ0MCw4IEBACiAJbGkudS5sb2cubGV2ZWwgPSBsb2dpbmZvLT5sZXZlbDsKIAlsaS51LmxvZy5sb2dmbGFncyA9IGxvZ2luZm8tPmxvZ2ZsYWdzOwogCi0JaWYgKGxvZ2luZm8tPmxvZ2ZsYWdzICYgSVA2VF9MT0dfTkZMT0cpCi0JCW5mX2xvZ19wYWNrZXQoUEZfSU5FVDYsIGhvb2tudW0sICpwc2tiLCBpbiwgb3V0LCAmbGksCi0JCSAgICAgICAgICAgICAgIiVzIiwgbG9naW5mby0+cHJlZml4KTsKLQllbHNlCi0JCWlwNnRfbG9nX3BhY2tldChQRl9JTkVUNiwgaG9va251bSwgKnBza2IsIGluLCBvdXQsICZsaSwKLQkJICAgICAgICAgICAgICAgIGxvZ2luZm8tPnByZWZpeCk7Ci0KKwlpcDZ0X2xvZ19wYWNrZXQoUEZfSU5FVDYsIGhvb2tudW0sICpwc2tiLCBpbiwgb3V0LCAmbGksCisJICAgICAgICAgICAgICAgIGxvZ2luZm8tPnByZWZpeCk7CiAJcmV0dXJuIElQNlRfQ09OVElOVUU7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCmluZGV4IGVjMWIxNjAuLjQ2NDg2NjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfYWguYwpAQCAtNTQsOSArNTQsMTQgQEAKIAljb25zdCBzdHJ1Y3QgaXA2dF9haCAqYWhpbmZvID0gbWF0Y2hpbmZvOwogCXVuc2lnbmVkIGludCBwdHI7CiAJdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7CisJaW50IGVycjsKIAotCWlmIChpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgTkVYVEhEUl9BVVRILCBOVUxMKSA8IDApCisJZXJyID0gaXB2Nl9maW5kX2hkcihza2IsICZwdHIsIE5FWFRIRFJfQVVUSCwgTlVMTCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKGVyciAhPSAtRU5PRU5UKQorCQkJKmhvdGRyb3AgPSAxOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlhaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9haCksICZfYWgpOwogCWlmIChhaCA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMKaW5kZXggNzhkOWM4Yi4uY2QyMmVhYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwpAQCAtNTIsOSArNTIsMTQgQEAKIAlzdHJ1Y3QgZnJhZ19oZHIgX2ZyYWcsICpmaDsKIAljb25zdCBzdHJ1Y3QgaXA2dF9mcmFnICpmcmFnaW5mbyA9IG1hdGNoaW5mbzsKIAl1bnNpZ25lZCBpbnQgcHRyOworCWludCBlcnI7CiAKLQlpZiAoaXB2Nl9maW5kX2hkcihza2IsICZwdHIsIE5FWFRIRFJfRlJBR01FTlQsIE5VTEwpIDwgMCkKKwllcnIgPSBpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgTkVYVEhEUl9GUkFHTUVOVCwgTlVMTCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKGVyciAhPSAtRU5PRU5UKQorCQkJKmhvdGRyb3AgPSAxOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlmaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHB0ciwgc2l6ZW9mKF9mcmFnKSwgJl9mcmFnKTsKIAlpZiAoZmggPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGJoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYwppbmRleCBkMzJhMjA1Li4zZjI1YmFiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYwpAQCAtNjUsOSArNjUsMTQgQEAKIAl1OCBfb3B0dHlwZSwgKnRwID0gTlVMTDsKIAl1OCBfb3B0bGVuLCAqbHAgPSBOVUxMOwogCXVuc2lnbmVkIGludCBvcHRsZW47CisJaW50IGVycjsKIAotCWlmIChpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgbWF0Y2gtPmRhdGEsIE5VTEwpIDwgMCkKKwllcnIgPSBpcHY2X2ZpbmRfaGRyKHNrYiwgJnB0ciwgbWF0Y2gtPmRhdGEsIE5VTEwpOworCWlmIChlcnIgPCAwKSB7CisJCWlmIChlcnIgIT0gLUVOT0VOVCkKKwkJCSpob3Rkcm9wID0gMTsKIAkJcmV0dXJuIDA7CisJfQogCiAJb2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfb3B0c2gpLCAmX29wdHNoKTsKIAlpZiAob2ggPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKaW5kZXggYmNiMmUxNi4uNTRkN2QxNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCkBAIC01OCw5ICs1OCwxNCBAQAogCXVuc2lnbmVkIGludCBoZHJsZW4gPSAwOwogCXVuc2lnbmVkIGludCByZXQgPSAwOwogCXN0cnVjdCBpbjZfYWRkciAqYXAsIF9hZGRyOworCWludCBlcnI7CiAKLQlpZiAoaXB2Nl9maW5kX2hkcihza2IsICZwdHIsIE5FWFRIRFJfUk9VVElORywgTlVMTCkgPCAwKQorCWVyciA9IGlwdjZfZmluZF9oZHIoc2tiLCAmcHRyLCBORVhUSERSX1JPVVRJTkcsIE5VTEwpOworCWlmIChlcnIgPCAwKSB7CisJCWlmIChlcnIgIT0gLUVOT0VOVCkKKwkJCSpob3Rkcm9wID0gMTsKIAkJcmV0dXJuIDA7CisJfQogCiAJcmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwdHIsIHNpemVvZihfcm91dGUpLCAmX3JvdXRlKTsKIAlpZiAocmggPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCmluZGV4IDM4NmVhMjYuLjYyNTBlODYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKQEAgLTE0OSwxMSArMTQ5LDEwIEBACiAJCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewogCi0JdW5zaWduZWQgbG9uZyBuZm1hcms7CiAJdW5zaWduZWQgaW50IHJldDsKIAlzdHJ1Y3QgaW42X2FkZHIgc2FkZHIsIGRhZGRyOwogCXVfaW50OF90IGhvcF9saW1pdDsKLQl1X2ludDMyX3QgZmxvd2xhYmVsOworCXVfaW50MzJfdCBmbG93bGFiZWwsIG1hcms7CiAKICNpZiAwCiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCkBAIC0xNjUsMTAgKzE2NCwxMCBAQAogCX0KICNlbmRpZgogCi0JLyogc2F2ZSBzb3VyY2UvZGVzdCBhZGRyZXNzLCBuZm1hcmssIGhvcGxpbWl0LCBmbG93bGFiZWwsIHByaW9yaXR5LCAgKi8KKwkvKiBzYXZlIHNvdXJjZS9kZXN0IGFkZHJlc3MsIG1hcmssIGhvcGxpbWl0LCBmbG93bGFiZWwsIHByaW9yaXR5LCAgKi8KIAltZW1jcHkoJnNhZGRyLCAmKCpwc2tiKS0+bmguaXB2NmgtPnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKIAltZW1jcHkoJmRhZGRyLCAmKCpwc2tiKS0+bmguaXB2NmgtPmRhZGRyLCBzaXplb2YoZGFkZHIpKTsKLQluZm1hcmsgPSAoKnBza2IpLT5uZm1hcms7CisJbWFyayA9ICgqcHNrYiktPm1hcms7CiAJaG9wX2xpbWl0ID0gKCpwc2tiKS0+bmguaXB2NmgtPmhvcF9saW1pdDsKIAogCS8qIGZsb3dsYWJlbCBhbmQgcHJpbyAoaW5jbHVkZXMgdmVyc2lvbiwgd2hpY2ggc2hvdWxkbid0IGNoYW5nZSBlaXRoZXIgKi8KQEAgLTE3OSw3ICsxNzgsNyBAQAogCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOIAogCQkmJiAobWVtY21wKCYoKnBza2IpLT5uaC5pcHY2aC0+c2FkZHIsICZzYWRkciwgc2l6ZW9mKHNhZGRyKSkKIAkJICAgIHx8IG1lbWNtcCgmKCpwc2tiKS0+bmguaXB2NmgtPmRhZGRyLCAmZGFkZHIsIHNpemVvZihkYWRkcikpCi0JCSAgICB8fCAoKnBza2IpLT5uZm1hcmsgIT0gbmZtYXJrCisJCSAgICB8fCAoKnBza2IpLT5tYXJrICE9IG1hcmsKIAkJICAgIHx8ICgqcHNrYiktPm5oLmlwdjZoLT5ob3BfbGltaXQgIT0gaG9wX2xpbWl0KSkKIAkJcmV0dXJuIGlwNl9yb3V0ZV9tZV9oYXJkZXIoKnBza2IpID09IDAgPyByZXQgOiBORl9EUk9QOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwppbmRleCBlNWU1M2ZmLi5hMjA2MTVmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KIApAQCAtNDMsOCArNDMsNiBAQAogI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQogI2VuZGlmCiAKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQsIG5mX2Nvbm50cmFja19zdGF0KTsKLQogc3RhdGljIGludCBpcHY2X3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbmhvZmYsCiAJCQkgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQogewpAQCAtMjExLDExICsyMDksNiBAQAogCXJldHVybiBuZl9jb25udHJhY2tfY29uZmlybShwc2tiKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBza19idWZmICpuZl9jdF9mcmFnNl9nYXRoZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gdm9pZCBuZl9jdF9mcmFnNl9vdXRwdXQodW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpOwogc3RhdGljIHVuc2lnbmVkIGludCBpcHY2X2RlZnJhZyh1bnNpZ25lZCBpbnQgaG9va251bSwKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCiAJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApAQCAtMzMxLDI2ICszMjQsNyBAQAogfTsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKLQotLyogRnJvbSBuZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfaWNtcHY2X3RpbWVvdXQ7Ci0KLS8qIEZyb20gbmZfY29ubnRyYWNrX3JlYXNtLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfdGltZW91dDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfbG93X3RocmVzaDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfZnJhZzZfaGlnaF90aHJlc2g7Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqbmZfY3RfaXB2Nl9zeXNjdGxfaGVhZGVyOwotCi1zdGF0aWMgY3RsX3RhYmxlIG5mX2N0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19JQ01QVjZfVElNRU9VVCwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19pY21wdjZfdGltZW91dCIsCi0JCS5kYXRhCQk9ICZuZl9jdF9pY21wdjZfdGltZW91dCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKK3N0YXRpYyBjdGxfdGFibGUgbmZfY3RfaXB2Nl9zeXNjdGxfdGFibGVbXSA9IHsKIAl7CiAJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfRlJBRzZfVElNRU9VVCwKIAkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19mcmFnNl90aW1lb3V0IiwKQEAgLTM3NywyNiArMzUxLDYgQEAKIAl9LAogICAgICAgICB7IC5jdGxfbmFtZSA9IDAgfQogfTsKLQotc3RhdGljIGN0bF90YWJsZSBuZl9jdF9uZXRmaWx0ZXJfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORVRGSUxURVIsCi0JCS5wcm9jbmFtZQk9ICJuZXRmaWx0ZXIiLAotCQkubW9kZQkJPSAwNTU1LAotCQkuY2hpbGQJCT0gbmZfY3Rfc3lzY3RsX3RhYmxlLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBjdGxfdGFibGUgbmZfY3RfbmV0X3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBDVExfTkVULAotCQkucHJvY25hbWUJPSAibmV0IiwKLQkJLm1vZGUJCT0gMDU1NSwKLQkJLmNoaWxkCQk9IG5mX2N0X25ldGZpbHRlcl90YWJsZSwKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBcCkBAIC00NTQsMTYgKzQwOCwxNCBAQAogCS50dXBsZV90b19uZmF0dHIJPSBpcHY2X3R1cGxlX3RvX25mYXR0ciwKIAkubmZhdHRyX3RvX3R1cGxlCT0gaXB2Nl9uZmF0dHJfdG9fdHVwbGUsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJLmN0bF90YWJsZV9wYXRoCQk9IG5mX25ldF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGgsCisJLmN0bF90YWJsZQkJPSBuZl9jdF9pcHY2X3N5c2N0bF90YWJsZSwKKyNlbmRpZgogCS5nZXRfZmVhdHVyZXMJCT0gaXB2Nl9nZXRfZmVhdHVyZXMsCiAJLm1lCQkJPSBUSElTX01PRFVMRSwKIH07CiAKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF90Y3A2OwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3VkcDY7Ci1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcHY2OwotZXh0ZXJuIGludCBuZl9jdF9mcmFnNl9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgbmZfY3RfZnJhZzZfY2xlYW51cCh2b2lkKTsKLQogTU9EVUxFX0FMSUFTKCJuZl9jb25udHJhY2stIiBfX3N0cmluZ2lmeShBRl9JTkVUNikpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiWWFzdXl1a2kgS09aQUtBSSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4iKTsKQEAgLTQ3OSwxOSArNDMxLDE5IEBACiAJCXByaW50aygibmZfY29ubnRyYWNrX2lwdjY6IGNhbid0IGluaXRpYWxpemUgZnJhZzYuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0ID0gbmZfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfdGNwNik7CisJcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3RjcDYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygibmZfY29ubnRyYWNrX2lwdjY6IGNhbid0IHJlZ2lzdGVyIHRjcC5cbiIpOwogCQlnb3RvIGNsZWFudXBfZnJhZzY7CiAJfQogCi0JcmV0ID0gbmZfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNik7CisJcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX3VkcDYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50aygibmZfY29ubnRyYWNrX2lwdjY6IGNhbid0IHJlZ2lzdGVyIHVkcC5cbiIpOwogCQlnb3RvIGNsZWFudXBfdGNwOwogCX0KIAotCXJldCA9IG5mX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX2ljbXB2Nik7CisJcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2Nik7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKCJuZl9jb25udHJhY2tfaXB2NjogY2FuJ3QgcmVnaXN0ZXIgaWNtcHY2LlxuIik7CiAJCWdvdG8gY2xlYW51cF91ZHA7CkBAIC01MTAsMjggKzQ2MiwxNiBAQAogCQkgICAgICAgImhvb2suXG4iKTsKIAkJZ290byBjbGVhbnVwX2lwdjY7CiAJfQotI2lmZGVmIENPTkZJR19TWVNDVEwKLQluZl9jdF9pcHY2X3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUobmZfY3RfbmV0X3RhYmxlLCAwKTsKLQlpZiAobmZfY3RfaXB2Nl9zeXNjdGxfaGVhZGVyID09IE5VTEwpIHsKLQkJcHJpbnRrKCJuZl9jb25udHJhY2s6IGNhbid0IHJlZ2lzdGVyIHRvIHN5c2N0bC5cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFudXBfaG9va3M7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIHJldDsKIAotI2lmZGVmIENPTkZJR19TWVNDVEwKLSBjbGVhbnVwX2hvb2tzOgotCW5mX3VucmVnaXN0ZXJfaG9va3MoaXB2Nl9jb25udHJhY2tfb3BzLCBBUlJBWV9TSVpFKGlwdjZfY29ubnRyYWNrX29wcykpOwotI2VuZGlmCiAgY2xlYW51cF9pcHY2OgogCW5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYpOwogIGNsZWFudXBfaWNtcHY2OgotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcHY2KTsKKwluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19pY21wdjYpOwogIGNsZWFudXBfdWRwOgotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNik7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNik7CiAgY2xlYW51cF90Y3A6Ci0JbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF90Y3A2KTsKKwluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b190Y3A2KTsKICBjbGVhbnVwX2ZyYWc2OgogCW5mX2N0X2ZyYWc2X2NsZWFudXAoKTsKIAlyZXR1cm4gcmV0OwpAQCAtNTQwLDE0ICs0ODAsMTEgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZl9jb25udHJhY2tfbDNwcm90b19pcHY2X2Zpbmkodm9pZCkKIHsKIAlzeW5jaHJvbml6ZV9uZXQoKTsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0gCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKG5mX2N0X2lwdjZfc3lzY3RsX2hlYWRlcik7Ci0jZW5kaWYKIAluZl91bnJlZ2lzdGVyX2hvb2tzKGlwdjZfY29ubnRyYWNrX29wcywgQVJSQVlfU0laRShpcHY2X2Nvbm50cmFja19vcHMpKTsKIAluZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDNwcm90b19pcHY2KTsKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX2ljbXB2Nik7Ci0JbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA2KTsKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDYpOworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2Nik7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNik7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNik7CiAJbmZfY3RfZnJhZzZfY2xlYW51cCgpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwppbmRleCAzNGQ0NDcyLi4zOTA1Y2FjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKQEAgLTI5LDExICsyOSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjYvbmZfY29ubnRyYWNrX2ljbXB2Ni5oPgogCi11bnNpZ25lZCBsb25nIG5mX2N0X2ljbXB2Nl90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMCpIWjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5mX2N0X2ljbXB2Nl90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMCpIWjsKIAogI2lmIDAKICNkZWZpbmUgREVCVUdQIHByaW50awpAQCAtMTQyLDkgKzE0Miw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLWV4dGVybiBpbnQKLW5mX2N0X2lwdjZfc2tpcF9leHRoZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHN0YXJ0LCB1OCAqbmV4dGhkcnAsIGludCBsZW4pOwotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byBuZl9jb25udHJhY2tfbDNwcm90b19pcHY2Owogc3RhdGljIGludAogaWNtcHY2X2Vycm9yX21lc3NhZ2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICB1bnNpZ25lZCBpbnQgaWNtcDZvZmYsCkBAIC0xNTUsNyArMTUyLDcgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJc3RydWN0IGljbXA2aGRyIF9oZHIsICpocDsKIAl1bnNpZ25lZCBpbnQgaW5pcDZvZmY7Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqaW5wcm90bzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmlucHJvdG87CiAJdV9pbnQ4X3QgaW5wcm90b251bTsKIAl1bnNpZ25lZCBpbnQgaW5wcm90b2ZmOwogCkBAIC0xODUsNyArMTgyLDcgQEAKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CiAJfQogCi0JaW5wcm90byA9IF9fbmZfY3RfcHJvdG9fZmluZChQRl9JTkVUNiwgaW5wcm90b251bSk7CisJaW5wcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKFBGX0lORVQ2LCBpbnByb3RvbnVtKTsKIAogCS8qIEFyZSB0aGV5IHRhbGtpbmcgYWJvdXQgb25lIG9mIG91ciBjb25uZWN0aW9ucz8gKi8KIAlpZiAoIW5mX2N0X2dldF90dXBsZShza2IsIGluaXA2b2ZmLCBpbnByb3RvZmYsIFBGX0lORVQ2LCBpbnByb3RvbnVtLApAQCAtMjkwLDcgKzI4Nyw3IEBACiAJdHVwbGUtPmRzdC51LmljbXAuY29kZSA9CiAJCQkqKHVfaW50OF90ICopTkZBX0RBVEEodGJbQ1RBX1BST1RPX0lDTVBWNl9DT0RFLTFdKTsKIAl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9Ci0JCQkqKHVfaW50MTZfdCAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT19JQ01QVjZfSUQtMV0pOworCQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9fSUNNUFY2X0lELTFdKTsKIAogCWlmICh0dXBsZS0+ZHN0LnUuaWNtcC50eXBlIDwgMTI4CiAJICAgIHx8IHR1cGxlLT5kc3QudS5pY21wLnR5cGUgLSAxMjggPj0gc2l6ZW9mKGludm1hcCkKQEAgLTMwMSwxMCArMjk4LDI3IEBACiB9CiAjZW5kaWYKIAotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfaWNtcHY2ID0KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmljbXB2Nl9zeXNjdGxfaGVhZGVyOworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgaWNtcHY2X3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19JQ01QVjZfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19pY21wdjZfdGltZW91dCIsCisJCS5kYXRhCQk9ICZuZl9jdF9pY21wdjZfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAKKwl9Cit9OworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKworc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2NiA9CiB7CiAJLmwzcHJvdG8JCT0gUEZfSU5FVDYsCi0JLnByb3RvCQkJPSBJUFBST1RPX0lDTVBWNiwKKwkubDRwcm90bwkJPSBJUFBST1RPX0lDTVBWNiwKIAkubmFtZQkJCT0gImljbXB2NiIsCiAJLnBrdF90b190dXBsZQkJPSBpY21wdjZfcGt0X3RvX3R1cGxlLAogCS5pbnZlcnRfdHVwbGUJCT0gaWNtcHY2X2ludmVydF90dXBsZSwKQEAgLTMxOCw2ICszMzIsMTAgQEAKIAkudHVwbGVfdG9fbmZhdHRyCT0gaWNtcHY2X3R1cGxlX3RvX25mYXR0ciwKIAkubmZhdHRyX3RvX3R1cGxlCT0gaWNtcHY2X25mYXR0cl90b190dXBsZSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX2hlYWRlcgk9ICZpY21wdjZfc3lzY3RsX2hlYWRlciwKKwkuY3RsX3RhYmxlCQk9IGljbXB2Nl9zeXNjdGxfdGFibGUsCisjZW5kaWYKIH07CiAKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX3Byb3RvY29sX2ljbXB2Nik7CitFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19sNHByb3RvX2ljbXB2Nik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKaW5kZXggYmY5M2MxZWEuLjM3ZTVmY2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJbHJ1X2xpc3Q7CS8qIGxydSBsaXN0IG1lbWJlcgkqLwogCi0JX191MzIJCQlpZDsJCS8qIGZyYWdtZW50IGlkCQkqLworCV9fYmUzMgkJCWlkOwkJLyogZnJhZ21lbnQgaWQJCSovCiAJc3RydWN0IGluNl9hZGRyCQlzYWRkcjsKIAlzdHJ1Y3QgaW42X2FkZHIJCWRhZGRyOwogCkBAIC0xMTUsMjggKzExNSwyOCBAQAogCXdyaXRlX3VubG9jaygmbmZfY3RfZnJhZzZfbG9jayk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2cWhhc2hmbih1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCitzdGF0aWMgdW5zaWduZWQgaW50IGlwNnFoYXNoZm4oX19iZTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAogCQkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCiB7CiAJdTMyIGEsIGIsIGM7CiAKLQlhID0gc2FkZHItPnM2X2FkZHIzMlswXTsKLQliID0gc2FkZHItPnM2X2FkZHIzMlsxXTsKLQljID0gc2FkZHItPnM2X2FkZHIzMlsyXTsKKwlhID0gKF9fZm9yY2UgdTMyKXNhZGRyLT5zNl9hZGRyMzJbMF07CisJYiA9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzFdOworCWMgPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlsyXTsKIAogCWEgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWIgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWMgKz0gbmZfY3RfZnJhZzZfaGFzaF9ybmQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKLQlhICs9IHNhZGRyLT5zNl9hZGRyMzJbM107Ci0JYiArPSBkYWRkci0+czZfYWRkcjMyWzBdOwotCWMgKz0gZGFkZHItPnM2X2FkZHIzMlsxXTsKKwlhICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzNdOworCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbMF07CisJYyArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsxXTsKIAlfX2poYXNoX21peChhLCBiLCBjKTsKIAotCWEgKz0gZGFkZHItPnM2X2FkZHIzMlsyXTsKLQliICs9IGRhZGRyLT5zNl9hZGRyMzJbM107Ci0JYyArPSBpZDsKKwlhICs9IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzJdOworCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbM107CisJYyArPSAoX19mb3JjZSB1MzIpaWQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKIAlyZXR1cm4gYyAmIChGUkFHNlFfSEFTSFNaIC0gMSk7CkBAIC0zMzgsNyArMzM4LDcgQEAKIAogCiBzdGF0aWMgc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICoKLW5mX2N0X2ZyYWc2X2NyZWF0ZSh1bnNpZ25lZCBpbnQgaGFzaCwgdTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywJCQkJICAgc3RydWN0IGluNl9hZGRyICpkc3QpCituZl9jdF9mcmFnNl9jcmVhdGUodW5zaWduZWQgaW50IGhhc2gsIF9fYmUzMiBpZCwgc3RydWN0IGluNl9hZGRyICpzcmMsCQkJCSAgIHN0cnVjdCBpbjZfYWRkciAqZHN0KQogewogCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqZnE7CiAKQEAgLTM2Niw3ICszNjYsNyBAQAogfQogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKgotZnFfZmluZCh1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc3JjLCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCkKK2ZxX2ZpbmQoX19iZTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywgc3RydWN0IGluNl9hZGRyICpkc3QpCiB7CiAJc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICpmcTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb2MuYyBiL25ldC9pcHY2L3Byb2MuYwppbmRleCBlZmVlN2E2Li4zNTI0OWQ4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9wcm9jLmMKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC00OSw2ICs0OSw4IEBACiAJCSAgICAgICBmb2xkX3Byb3RfaW51c2UoJnRjcHY2X3Byb3QpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlVEUDY6IGludXNlICVkXG4iLAogCQkgICAgICAgZm9sZF9wcm90X2ludXNlKCZ1ZHB2Nl9wcm90KSk7CisJc2VxX3ByaW50ZihzZXEsICJVRFBMSVRFNjogaW51c2UgJWRcbiIsCisJCSAgICAgICAgZm9sZF9wcm90X2ludXNlKCZ1ZHBsaXRldjZfcHJvdCkpOwogCXNlcV9wcmludGYoc2VxLCAiUkFXNjogaW51c2UgJWRcbiIsCiAJCSAgICAgICBmb2xkX3Byb3RfaW51c2UoJnJhd3Y2X3Byb3QpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIkZSQUc2OiBpbnVzZSAlZCBtZW1vcnkgJWRcbiIsCkBAIC0xMzMsNiArMTM1LDE0IEBACiAJU05NUF9NSUJfU0VOVElORUwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25tcF9taWIgc25tcDZfdWRwbGl0ZTZfbGlzdFtdID0geworCVNOTVBfTUlCX0lURU0oIlVkcExpdGU2SW5EYXRhZ3JhbXMiLCBVRFBfTUlCX0lOREFUQUdSQU1TKSwKKwlTTk1QX01JQl9JVEVNKCJVZHBMaXRlNk5vUG9ydHMiLCBVRFBfTUlCX05PUE9SVFMpLAorCVNOTVBfTUlCX0lURU0oIlVkcExpdGU2SW5FcnJvcnMiLCBVRFBfTUlCX0lORVJST1JTKSwKKwlTTk1QX01JQl9JVEVNKCJVZHBMaXRlNk91dERhdGFncmFtcyIsIFVEUF9NSUJfT1VUREFUQUdSQU1TKSwKKwlTTk1QX01JQl9TRU5USU5FTAorfTsKKwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGZvbGRfZmllbGQodm9pZCAqbWliW10sIGludCBvZmZ0KQogewpAQCAtMTYxLDExICsxNzEsMTMgQEAKIAogCWlmIChpZGV2KSB7CiAJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCV1XG4iLCAiaWZJbmRleCIsIGlkZXYtPmRldi0+aWZpbmRleCk7CisJCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCAqKilpZGV2LT5zdGF0cy5pcHY2LCBzbm1wNl9pcHN0YXRzX2xpc3QpOwogCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaWRldi0+c3RhdHMuaWNtcHY2LCBzbm1wNl9pY21wNl9saXN0KTsKIAl9IGVsc2UgewogCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaXB2Nl9zdGF0aXN0aWNzLCBzbm1wNl9pcHN0YXRzX2xpc3QpOwogCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MsIHNubXA2X2ljbXA2X2xpc3QpOwogCQlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgKiopdWRwX3N0YXRzX2luNiwgc25tcDZfdWRwNl9saXN0KTsKKwkJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkICoqKXVkcGxpdGVfc3RhdHNfaW42LCBzbm1wNl91ZHBsaXRlNl9saXN0KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yODEsNiArMjkzLDkgQEAKIAlpZiAoIWlkZXYgfHwgIWlkZXYtPmRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2Niwgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCisJCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCisJCWdvdG8gZXJyX2lwOwogCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYsIHNpemVvZihzdHJ1Y3QgaWNtcHY2X21pYiksCiAJCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2X21pYikpIDwgMCkKIAkJZ290byBlcnJfaWNtcDsKQEAgLTI4OCwxMiArMzAzLDE1IEBACiAJcmV0dXJuIDA7CiAKIGVycl9pY21wOgorCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmlwdjYpOworZXJyX2lwOgogCXJldHVybiBlcnI7CiB9CiAKIGludCBzbm1wNl9mcmVlX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQogewogCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmljbXB2Nik7CisJc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2Nik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Jhdy5jIGIvbmV0L2lwdjYvcmF3LmMKaW5kZXggZDA5MzI5Yy4uNGFlMWIxOWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC0yMjAsNyArMjIwLDcgQEAKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSB1YWRkcjsKLQlfX3UzMiB2NGFkZHIgPSAwOworCV9fYmUzMiB2NGFkZHIgPSAwOwogCWludCBhZGRyX3R5cGU7CiAJaW50IGVycjsKIApAQCAtMjkwLDcgKzI5MCw3IEBACiAKIHZvaWQgcmF3djZfZXJyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkgICAgICAgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCi0JICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgdTMyIGluZm8pCisJICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKQEAgLTM3MCw5ICszNzAsOSBAQAogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAl9CiAJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKQotCQlza2ItPmNzdW0gPSB+Y3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKGNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCiAJCQkJCSAgICAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLAotCQkJCQkgICAgIHNrYi0+bGVuLCBpbmV0LT5udW0sIDApOworCQkJCQkgICAgIHNrYi0+bGVuLCBpbmV0LT5udW0sIDApKTsKIAogCWlmIChpbmV0LT5oZHJpbmNsKSB7CiAJCWlmIChza2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewpAQCAtNDc5LDggKzQ3OSw4IEBACiAJaW50IG9mZnNldDsKIAlpbnQgbGVuOwogCWludCB0b3RhbF9sZW47Ci0JdTMyIHRtcF9jc3VtOwotCXUxNiBjc3VtOworCV9fd3N1bSB0bXBfY3N1bTsKKwlfX3N1bTE2IGNzdW07CiAKIAlpZiAoIXJwLT5jaGVja3N1bSkKIAkJZ290byBzZW5kOwpAQCAtNTMwLDE2ICs1MzAsMTUgQEAKIAogCS8qIGluIGNhc2UgY2tzdW0gd2FzIG5vdCBpbml0aWFsaXplZCAqLwogCWlmICh1bmxpa2VseShjc3VtKSkKLQkJdG1wX2NzdW0gPSBjc3VtX3N1Yih0bXBfY3N1bSwgY3N1bSk7CisJCXRtcF9jc3VtID0gY3N1bV9zdWIodG1wX2NzdW0sIGNzdW1fdW5mb2xkKGNzdW0pKTsKIAotCXRtcF9jc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZmbC0+Zmw2X3NyYywKKwljc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZmbC0+Zmw2X3NyYywKIAkJCQkgICAmZmwtPmZsNl9kc3QsCiAJCQkJICAgdG90YWxfbGVuLCBmbC0+cHJvdG8sIHRtcF9jc3VtKTsKIAotCWlmICh0bXBfY3N1bSA9PSAwKQotCQl0bXBfY3N1bSA9IC0xOworCWlmIChjc3VtID09IDAgJiYgZmwtPnByb3RvID09IElQUFJPVE9fVURQKQorCQljc3VtID0gQ1NVTV9NQU5HTEVEXzA7CiAKLQljc3VtID0gdG1wX2NzdW07CiAJaWYgKHNrYl9zdG9yZV9iaXRzKHNrYiwgb2Zmc2V0LCAmY3N1bSwgMikpCiAJCUJVRygpOwogCkBAIC01ODYsNyArNTg1LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX2ZhdWx0OwogCi0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7CQkKKwlJUDZfSU5DX1NUQVRTKHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKIAllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsIHJ0LT51LmRzdC5kZXYsCiAJCSAgICAgIGRzdF9vdXRwdXQpOwogCWlmIChlcnIgPiAwKQpAQCAtNjAwLDExICs1OTksMTEgQEAKIAllcnIgPSAtRUZBVUxUOwogCWtmcmVlX3NrYihza2IpOwogZXJyb3I6Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CisJSVA2X0lOQ19TVEFUUyhydC0+cnQ2aV9pZGV2LCBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJcmV0dXJuIGVycjsgCiB9CiAKLXN0YXRpYyB2b2lkIHJhd3Y2X3Byb2JlX3Byb3RvX29wdChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgbXNnaGRyICptc2cpCitzdGF0aWMgaW50IHJhd3Y2X3Byb2JlX3Byb3RvX29wdChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgbXNnaGRyICptc2cpCiB7CiAJc3RydWN0IGlvdmVjICppb3Y7CiAJdTggX191c2VyICp0eXBlID0gTlVMTDsKQEAgLTYxNiw3ICs2MTUsNyBAQAogCWludCBpOwogCiAJaWYgKCFtc2ctPm1zZ19pb3YpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbXNnLT5tc2dfaW92bGVuOyBpKyspIHsKIAkJaW92ID0gJm1zZy0+bXNnX2lvdltpXTsKQEAgLTYzOCw4ICs2MzcsOSBAQAogCQkJCWNvZGUgPSBpb3YtPmlvdl9iYXNlOwogCiAJCQlpZiAodHlwZSAmJiBjb2RlKSB7Ci0JCQkJZ2V0X3VzZXIoZmwtPmZsX2ljbXBfdHlwZSwgdHlwZSk7Ci0JCQkJZ2V0X3VzZXIoZmwtPmZsX2ljbXBfY29kZSwgY29kZSk7CisJCQkJaWYgKGdldF91c2VyKGZsLT5mbF9pY21wX3R5cGUsIHR5cGUpIHx8CisJCQkJICAgIGdldF91c2VyKGZsLT5mbF9pY21wX2NvZGUsIGNvZGUpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQlwcm9iZWQgPSAxOwogCQkJfQogCQkJYnJlYWs7CkBAIC02NTAsNyArNjUwLDggQEAKIAkJCS8qIGNoZWNrIGlmIHR5cGUgZmllbGQgaXMgcmVhZGFibGUgb3Igbm90LiAqLwogCQkJaWYgKGlvdi0+aW92X2xlbiA+IDIgLSBsZW4pIHsKIAkJCQl1OCBfX3VzZXIgKnAgPSBpb3YtPmlvdl9iYXNlOwotCQkJCWdldF91c2VyKGZsLT5mbF9taF90eXBlLCAmcFsyIC0gbGVuXSk7CisJCQkJaWYgKGdldF91c2VyKGZsLT5mbF9taF90eXBlLCAmcFsyIC0gbGVuXSkpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCXByb2JlZCA9IDE7CiAJCQl9IGVsc2UKIAkJCQlsZW4gKz0gaW92LT5pb3ZfbGVuOwpAQCAtNjY0LDYgKzY2NSw3IEBACiAJCWlmIChwcm9iZWQpCiAJCQlicmVhazsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcmF3djZfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKQEAgLTc4Nyw3ICs3ODksOSBAQAogCW9wdCA9IGlwdjZfZml4dXBfb3B0aW9ucygmb3B0X3NwYWNlLCBvcHQpOwogCiAJZmwucHJvdG8gPSBwcm90bzsKLQlyYXd2Nl9wcm9iZV9wcm90b19vcHQoJmZsLCBtc2cpOworCWVyciA9IHJhd3Y2X3Byb2JlX3Byb3RvX29wdCgmZmwsIG1zZyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAgCiAJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsIGRhZGRyKTsKIAlpZiAoaXB2Nl9hZGRyX2FueSgmZmwuZmw2X3NyYykgJiYgIWlwdjZfYWRkcl9hbnkoJm5wLT5zYWRkcikpCkBAIC04NTAsNyArODU0LDggQEAKIAl9CiBkb25lOgogCWRzdF9yZWxlYXNlKGRzdCk7Ci0JcmVsZWFzZV9zb2NrKHNrKTsKKwlpZiAoIWluZXQtPmhkcmluY2wpCisJCXJlbGVhc2Vfc29jayhzayk7CiBvdXQ6CQogCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKIAlyZXR1cm4gZXJyPDA/ZXJyOmxlbjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYyBiL25ldC9pcHY2L3JlYXNzZW1ibHkuYwppbmRleCBmMzliYmVkLi42ZjlhOTA0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKKysrIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KIAogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KICNpbmNsdWRlIDxuZXQvcmF3djYuaD4KQEAgLTc2LDcgKzc3LDcgQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgbHJ1X2xpc3Q7CQkvKiBscnUgbGlzdCBtZW1iZXIJKi8KIAotCV9fdTMyCQkJaWQ7CQkvKiBmcmFnbWVudCBpZAkJKi8KKwlfX2JlMzIJCQlpZDsJCS8qIGZyYWdtZW50IGlkCQkqLwogCXN0cnVjdCBpbjZfYWRkcgkJc2FkZHI7CiAJc3RydWN0IGluNl9hZGRyCQlkYWRkcjsKIApAQCAtMTI0LDI4ICsxMjUsMjggQEAKICAqIGNhbGxlcnMgc2hvdWxkIGJlIGNhcmVmdWwgbm90IHRvIHVzZSB0aGUgaGFzaCB2YWx1ZSBvdXRzaWRlIHRoZSBpcGZyYWdfbG9jawogICogYXMgZG9pbmcgc28gY291bGQgcmFjZSB3aXRoIGlwZnJhZ19oYXNoX3JuZCBiZWluZyByZWNhbGN1bGF0ZWQuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2cWhhc2hmbih1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCitzdGF0aWMgdW5zaWduZWQgaW50IGlwNnFoYXNoZm4oX19iZTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAogCQkJICAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCiB7CiAJdTMyIGEsIGIsIGM7CiAKLQlhID0gc2FkZHItPnM2X2FkZHIzMlswXTsKLQliID0gc2FkZHItPnM2X2FkZHIzMlsxXTsKLQljID0gc2FkZHItPnM2X2FkZHIzMlsyXTsKKwlhID0gKF9fZm9yY2UgdTMyKXNhZGRyLT5zNl9hZGRyMzJbMF07CisJYiA9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzFdOworCWMgPSAoX19mb3JjZSB1MzIpc2FkZHItPnM2X2FkZHIzMlsyXTsKIAogCWEgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWIgKz0gSkhBU0hfR09MREVOX1JBVElPOwogCWMgKz0gaXA2X2ZyYWdfaGFzaF9ybmQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKLQlhICs9IHNhZGRyLT5zNl9hZGRyMzJbM107Ci0JYiArPSBkYWRkci0+czZfYWRkcjMyWzBdOwotCWMgKz0gZGFkZHItPnM2X2FkZHIzMlsxXTsKKwlhICs9IChfX2ZvcmNlIHUzMilzYWRkci0+czZfYWRkcjMyWzNdOworCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbMF07CisJYyArPSAoX19mb3JjZSB1MzIpZGFkZHItPnM2X2FkZHIzMlsxXTsKIAlfX2poYXNoX21peChhLCBiLCBjKTsKIAotCWEgKz0gZGFkZHItPnM2X2FkZHIzMlsyXTsKLQliICs9IGRhZGRyLT5zNl9hZGRyMzJbM107Ci0JYyArPSBpZDsKKwlhICs9IChfX2ZvcmNlIHUzMilkYWRkci0+czZfYWRkcjMyWzJdOworCWIgKz0gKF9fZm9yY2UgdTMyKWRhZGRyLT5zNl9hZGRyMzJbM107CisJYyArPSAoX19mb3JjZSB1MzIpaWQ7CiAJX19qaGFzaF9taXgoYSwgYiwgYyk7CiAKIAlyZXR1cm4gYyAmIChJUDZRX0hBU0hTWiAtIDEpOwpAQCAtMjU3LDcgKzI1OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpcDZfZXZpY3Rvcih2b2lkKQorc3RhdGljIHZvaWQgaXA2X2V2aWN0b3Ioc3RydWN0IGluZXQ2X2RldiAqaWRldikKIHsKIAlzdHJ1Y3QgZnJhZ19xdWV1ZSAqZnE7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwpAQCAtMjg0LDE0ICsyODUsMTQgQEAKIAkJc3Bpbl91bmxvY2soJmZxLT5sb2NrKTsKIAogCQlmcV9wdXQoZnEsICZ3b3JrKTsKLQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpZGV2LCBJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGlwNl9mcmFnX2V4cGlyZSh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGZyYWdfcXVldWUgKmZxID0gKHN0cnVjdCBmcmFnX3F1ZXVlICopIGRhdGE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAogCXNwaW5fbG9jaygmZnEtPmxvY2spOwogCkBAIC0zMDAsMTcgKzMwMSwxOSBAQAogCiAJZnFfa2lsbChmcSk7CiAKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNVElNRU9VVCk7Ci0JSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KGZxLT5paWYpOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01USU1FT1VUKTsKKwlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBEb24ndCBzZW5kIGVycm9yIGlmIHRoZSBmaXJzdCBzZWdtZW50IGRpZCBub3QgYXJyaXZlLiAqLwogCWlmICghKGZxLT5sYXN0X2luJkZJUlNUX0lOKSB8fCAhZnEtPmZyYWdtZW50cykKIAkJZ290byBvdXQ7CiAKLQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KGZxLT5paWYpOwotCWlmICghZGV2KQotCQlnb3RvIG91dDsKLQogCS8qCiAJICAgQnV0IHVzZSBhcyBzb3VyY2UgZGV2aWNlIG9uIHdoaWNoIExBU1QgQVJSSVZFRAogCSAgIHNlZ21lbnQgd2FzIHJlY2VpdmVkLiBBbmQgZG8gbm90IHVzZSBmcS0+ZGV2CkBAIC0zMTgsOCArMzIxLDkgQEAKIAkgKi8KIAlmcS0+ZnJhZ21lbnRzLT5kZXYgPSBkZXY7CiAJaWNtcHY2X3NlbmQoZnEtPmZyYWdtZW50cywgSUNNUFY2X1RJTUVfRVhDRUVELCBJQ01QVjZfRVhDX0ZSQUdUSU1FLCAwLCBkZXYpOwotCWRldl9wdXQoZGV2KTsKIG91dDoKKwlpZiAoZGV2KQorCQlkZXZfcHV0KGRldik7CiAJc3Bpbl91bmxvY2soJmZxLT5sb2NrKTsKIAlmcV9wdXQoZnEsIE5VTEwpOwogfQpAQCAtMzY2LDcgKzM3MCw4IEBACiAKIAogc3RhdGljIHN0cnVjdCBmcmFnX3F1ZXVlICoKLWlwNl9mcmFnX2NyZWF0ZSh1MzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc3JjLCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCkKK2lwNl9mcmFnX2NyZWF0ZShfX2JlMzIgaWQsIHN0cnVjdCBpbjZfYWRkciAqc3JjLCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCwKKwkJc3RydWN0IGluZXQ2X2RldiAqaWRldikKIHsKIAlzdHJ1Y3QgZnJhZ19xdWV1ZSAqZnE7CiAKQEAgLTM4NiwxMiArMzkxLDEzIEBACiAJcmV0dXJuIGlwNl9mcmFnX2ludGVybihmcSk7CiAKIG9vbToKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBmcmFnX3F1ZXVlICoKLWZxX2ZpbmQodTMyIGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNyYywgc3RydWN0IGluNl9hZGRyICpkc3QpCitmcV9maW5kKF9fYmUzMiBpZCwgc3RydWN0IGluNl9hZGRyICpzcmMsIHN0cnVjdCBpbjZfYWRkciAqZHN0LAorCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCiB7CiAJc3RydWN0IGZyYWdfcXVldWUgKmZxOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwpAQCAtNDEwLDcgKzQxNiw3IEBACiAJfQogCXJlYWRfdW5sb2NrKCZpcDZfZnJhZ19sb2NrKTsKIAotCXJldHVybiBpcDZfZnJhZ19jcmVhdGUoaWQsIHNyYywgZHN0KTsKKwlyZXR1cm4gaXA2X2ZyYWdfY3JlYXRlKGlkLCBzcmMsIGRzdCwgaWRldik7CiB9CiAKIApAQCAtNDI4LDcgKzQzNCw4IEBACiAJCQkoKHU4ICopIChmaGRyICsgMSkgLSAodTggKikgKHNrYi0+bmguaXB2NmggKyAxKSkpOwogCiAJaWYgKCh1bnNpZ25lZCBpbnQpZW5kID4gSVBWNl9NQVhQTEVOKSB7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKICAJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYixJQ01QVjZfSERSX0ZJRUxELCAodTgqKSZmaGRyLT5mcmFnX29mZiAtIHNrYi0+bmgucmF3KTsKICAJCXJldHVybjsKIAl9CkBAIC00NTUsNyArNDYyLDggQEAKIAkJCS8qIFJGQzI0NjAgc2F5cyBhbHdheXMgc2VuZCBwYXJhbWV0ZXIgcHJvYmxlbSBpbgogCQkJICogdGhpcyBjYXNlLiAtRGF2ZU0KIAkJCSAqLwotCQkJSVA2X0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCisJCQkJCSBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIAogCQkJCQkgIG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBwYXlsb2FkX2xlbikpOwogCQkJcmV0dXJuOwpAQCAtNTcxLDcgKzU3OSw3IEBACiAJcmV0dXJuOwogCiBlcnI6Ci0JSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKKwlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOwogCWtmcmVlX3NrYihza2IpOwogfQogCkBAIC02NjUsNyArNjczLDkgQEAKIAlpZiAoaGVhZC0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQogCQloZWFkLT5jc3VtID0gY3N1bV9wYXJ0aWFsKGhlYWQtPm5oLnJhdywgaGVhZC0+aC5yYXctaGVhZC0+bmgucmF3LCBoZWFkLT5jc3VtKTsKIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01PS1MpOworCXJjdV9yZWFkX2xvY2soKTsKKwlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01PS1MpOworCXJjdV9yZWFkX3VubG9jaygpOwogCWZxLT5mcmFnbWVudHMgPSBOVUxMOwogCXJldHVybiAxOwogCkBAIC02NzcsNyArNjg3LDkgQEAKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQlwcmludGsoS0VSTl9ERUJVRyAiaXA2X2ZyYWdfcmVhc206IG5vIG1lbW9yeSBmb3IgcmVhc3NlbWJseVxuIik7CiBvdXRfZmFpbDoKLQlJUDZfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX1JFQVNNRkFJTFMpOworCXJjdV9yZWFkX2xvY2soKTsKKwlJUDZfSU5DX1NUQVRTX0JIKF9faW42X2Rldl9nZXQoZGV2KSwgSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC02OTEsMTYgKzcwMywxNiBAQAogCiAJaGRyID0gc2tiLT5uaC5pcHY2aDsKIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01SRVFEUyk7CisJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9SRUFTTVJFUURTKTsKIAogCS8qIEp1bWJvIHBheWxvYWQgaW5oaWJpdHMgZnJhZy4gaGVhZGVyICovCiAJaWYgKGhkci0+cGF5bG9hZF9sZW49PTApIHsKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFMoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIHNrYi0+aC5yYXctc2tiLT5uaC5yYXcpOwogCQlyZXR1cm4gLTE7CiAJfQogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpKSB7Ci0JCUlQNl9JTkNfU1RBVFMoSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCBza2ItPmgucmF3LXNrYi0+bmgucmF3KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTcxMSwxNiArNzIzLDE3IEBACiAJaWYgKCEoZmhkci0+ZnJhZ19vZmYgJiBodG9ucygweEZGRjkpKSkgewogCQkvKiBJdCBpcyBub3QgYSBmcmFnbWVudGVkIGZyYW1lICovCiAJCXNrYi0+aC5yYXcgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7Ci0JCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01PS1MpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX1JFQVNNT0tTKTsKIAogCQlJUDZDQihza2IpLT5uaG9mZiA9ICh1OCopZmhkciAtIHNrYi0+bmgucmF3OwogCQlyZXR1cm4gMTsKIAl9CiAKIAlpZiAoYXRvbWljX3JlYWQoJmlwNl9mcmFnX21lbSkgPiBzeXNjdGxfaXA2ZnJhZ19oaWdoX3RocmVzaCkKLQkJaXA2X2V2aWN0b3IoKTsKKwkJaXA2X2V2aWN0b3IoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSk7CiAKLQlpZiAoKGZxID0gZnFfZmluZChmaGRyLT5pZGVudGlmaWNhdGlvbiwgJmhkci0+c2FkZHIsICZoZHItPmRhZGRyKSkgIT0gTlVMTCkgeworCWlmICgoZnEgPSBmcV9maW5kKGZoZHItPmlkZW50aWZpY2F0aW9uLCAmaGRyLT5zYWRkciwgJmhkci0+ZGFkZHIsCisJCQkgIGlwNl9kc3RfaWRldihza2ItPmRzdCkpKSAhPSBOVUxMKSB7CiAJCWludCByZXQgPSAtMTsKIAogCQlzcGluX2xvY2soJmZxLT5sb2NrKTsKQEAgLTczNiw3ICs3NDksNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCUlQNl9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfUkVBU01GQUlMUyk7CisJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9SRUFTTUZBSUxTKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCBkNmI0YjRmLi44YzNkNTY4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTE0MSw2ICsxNDEsMTAgQEAKIAogI2lmZGVmIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUwogCitzdGF0aWMgaW50IGlwNl9wa3RfcHJvaGliaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IGlwNl9wa3RfcHJvaGliaXRfb3V0KHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcDZfcGt0X2Jsa19ob2xlKHN0cnVjdCBza19idWZmICpza2IpOworCiBzdHJ1Y3QgcnQ2X2luZm8gaXA2X3Byb2hpYml0X2VudHJ5ID0gewogCS51ID0gewogCQkuZHN0ID0gewpAQCAtMTUwLDggKzE1NCw4IEBACiAJCQkub2Jzb2xldGUJPSAtMSwKIAkJCS5lcnJvcgkJPSAtRUFDQ0VTLAogCQkJLm1ldHJpY3MJPSB7IFtSVEFYX0hPUExJTUlUIC0gMV0gPSAyNTUsIH0sCi0JCQkuaW5wdXQJCT0gaXA2X3BrdF9kaXNjYXJkLAotCQkJLm91dHB1dAkJPSBpcDZfcGt0X2Rpc2NhcmRfb3V0LAorCQkJLmlucHV0CQk9IGlwNl9wa3RfcHJvaGliaXQsCisJCQkub3V0cHV0CQk9IGlwNl9wa3RfcHJvaGliaXRfb3V0LAogCQkJLm9wcwkJPSAmaXA2X2RzdF9vcHMsCiAJCQkucGF0aAkJPSAoc3RydWN0IGRzdF9lbnRyeSopJmlwNl9wcm9oaWJpdF9lbnRyeSwKIAkJfQpAQCAtMTcwLDggKzE3NCw4IEBACiAJCQkub2Jzb2xldGUJPSAtMSwKIAkJCS5lcnJvcgkJPSAtRUlOVkFMLAogCQkJLm1ldHJpY3MJPSB7IFtSVEFYX0hPUExJTUlUIC0gMV0gPSAyNTUsIH0sCi0JCQkuaW5wdXQJCT0gaXA2X3BrdF9kaXNjYXJkLAotCQkJLm91dHB1dAkJPSBpcDZfcGt0X2Rpc2NhcmRfb3V0LAorCQkJLmlucHV0CQk9IGlwNl9wa3RfYmxrX2hvbGUsCisJCQkub3V0cHV0CQk9IGlwNl9wa3RfYmxrX2hvbGUsCiAJCQkub3BzCQk9ICZpcDZfZHN0X29wcywKIAkJCS5wYXRoCQk9IChzdHJ1Y3QgZHN0X2VudHJ5KikmaXA2X2Jsa19ob2xlX2VudHJ5LAogCQl9CkBAIC0zMjYsNiArMzMwLDggQEAKIAkJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CiAJCWlmIChuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKQogCQkJbSA9IDI7CisJCWVsc2UgaWYgKCEobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9GQUlMRUQpKQorCQkJbSA9IDE7CiAJCXJlYWRfdW5sb2NrX2JoKCZuZWlnaC0+bG9jayk7CiAJfQogCXJldHVybiBtOwpAQCAtMzQzLDkgKzM0OSw3IEBACiAJbSB8PSBJUFY2X0RFQ09ERV9QUkVGKElQVjZfRVhUUkFDVF9QUkVGKHJ0LT5ydDZpX2ZsYWdzKSkgPDwgMjsKICNlbmRpZgogCW4gPSBydDZfY2hlY2tfbmVpZ2gocnQpOwotCWlmIChuID4gMSkKLQkJbSB8PSAxNjsKLQllbHNlIGlmICghbiAmJiBzdHJpY3QgJiBSVDZfTE9PS1VQX0ZfUkVBQ0hBQkxFKQorCWlmICghbiAmJiAoc3RyaWN0ICYgUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRSkpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gbTsKIH0KQEAgLTM3NiwxMCArMzgwLDExIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAobSA+IG1wcmkpIHsKLQkJCXJ0Nl9wcm9iZShtYXRjaCk7CisJCQlpZiAoc3RyaWN0ICYgUlQ2X0xPT0tVUF9GX1JFQUNIQUJMRSkKKwkJCQlydDZfcHJvYmUobWF0Y2gpOwogCQkJbWF0Y2ggPSBydDsKIAkJCW1wcmkgPSBtOwotCQl9IGVsc2UgeworCQl9IGVsc2UgaWYgKHN0cmljdCAmIFJUNl9MT09LVVBfRl9SRUFDSEFCTEUpIHsKIAkJCXJ0Nl9wcm9iZShydCk7CiAJCX0KIAl9CkBAIC00MzUsNyArNDQwLDcgQEAKIAlpZiAocHJlZiA9PSBJQ01QVjZfUk9VVEVSX1BSRUZfSU5WQUxJRCkKIAkJcHJlZiA9IElDTVBWNl9ST1VURVJfUFJFRl9NRURJVU07CiAKLQlsaWZldGltZSA9IGh0b25sKHJpbmZvLT5saWZldGltZSk7CisJbGlmZXRpbWUgPSBudG9obChyaW5mby0+bGlmZXRpbWUpOwogCWlmIChsaWZldGltZSA9PSAweGZmZmZmZmZmKSB7CiAJCS8qIGluZmluaXR5ICovCiAJfSBlbHNlIGlmIChsaWZldGltZSA+IDB4N2ZmZmZmZmYvSFopIHsKQEAgLTQ4NCwxMiArNDg5LDEyIEBACiBkbyB7IFwKIAlpZiAocnQgPT0gJmlwNl9udWxsX2VudHJ5KSB7IFwKIAkJc3RydWN0IGZpYjZfbm9kZSAqcG47IFwKLQkJd2hpbGUgKGZuKSB7IFwKKwkJd2hpbGUgKDEpIHsgXAogCQkJaWYgKGZuLT5mbl9mbGFncyAmIFJUTl9UTF9ST09UKSBcCiAJCQkJZ290byBvdXQ7IFwKIAkJCXBuID0gZm4tPnBhcmVudDsgXAogCQkJaWYgKEZJQjZfU1VCVFJFRShwbikgJiYgRklCNl9TVUJUUkVFKHBuKSAhPSBmbikgXAotCQkJCWZuID0gZmliNl9sb29rdXAocG4tPnN1YnRyZWUsIE5VTEwsIHNhZGRyKTsgXAorCQkJCWZuID0gZmliNl9sb29rdXAoRklCNl9TVUJUUkVFKHBuKSwgTlVMTCwgc2FkZHIpOyBcCiAJCQllbHNlIFwKIAkJCQlmbiA9IHBuOyBcCiAJCQlpZiAoZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTykgXApAQCAtNTI5LDEzICs1MzQsMTcgQEAKIAkJLm5sX3UgPSB7CiAJCQkuaXA2X3UgPSB7CiAJCQkJLmRhZGRyID0gKmRhZGRyLAotCQkJCS8qIFRPRE86IHNhZGRyICovCiAJCQl9LAogCQl9LAogCX07CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCWludCBmbGFncyA9IHN0cmljdCA/IFJUNl9MT09LVVBfRl9JRkFDRSA6IDA7CiAKKwlpZiAoc2FkZHIpIHsKKwkJbWVtY3B5KCZmbC5mbDZfc3JjLCBzYWRkciwgc2l6ZW9mKCpzYWRkcikpOworCQlmbGFncyB8PSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOworCX0KKwogCWRzdCA9IGZpYjZfcnVsZV9sb29rdXAoJmZsLCBmbGFncywgaXA2X3BvbF9yb3V0ZV9sb29rdXApOwogCWlmIChkc3QtPmVycm9yID09IDApCiAJCXJldHVybiAoc3RydWN0IHJ0Nl9pbmZvICopIGRzdDsKQEAgLTYxNCw4ICs2MjMsNiBAQAogCQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGRhZGRyKTsKIAkJcnQtPnJ0NmlfZHN0LnBsZW4gPSAxMjg7CiAJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9DQUNIRTsKLQkJaWYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX1JFSkVDVCkKLQkJCXJ0LT51LmRzdC5lcnJvciA9IG9ydC0+dS5kc3QuZXJyb3I7CiAJCXJ0LT51LmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKIAkJcnQtPnJ0NmlfbmV4dGhvcCA9IG5laWdoX2Nsb25lKG9ydC0+cnQ2aV9uZXh0aG9wKTsKIAl9CkBAIC02MzAsNyArNjM3LDcgQEAKIAlpbnQgc3RyaWN0ID0gMDsKIAlpbnQgYXR0ZW1wdHMgPSAzOwogCWludCBlcnI7Ci0JaW50IHJlYWNoYWJsZSA9IFJUNl9MT09LVVBfRl9SRUFDSEFCTEU7CisJaW50IHJlYWNoYWJsZSA9IGlwdjZfZGV2Y29uZi5mb3J3YXJkaW5nID8gMCA6IFJUNl9MT09LVVBfRl9SRUFDSEFCTEU7CiAKIAlzdHJpY3QgfD0gZmxhZ3MgJiBSVDZfTE9PS1VQX0ZfSUZBQ0U7CiAKQEAgLTY5NywyMSArNzA0LDIyIEBACiB2b2lkIGlwNl9yb3V0ZV9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpcHY2aGRyICppcGggPSBza2ItPm5oLmlwdjZoOworCWludCBmbGFncyA9IFJUNl9MT09LVVBfRl9IQVNfU0FERFI7CiAJc3RydWN0IGZsb3dpIGZsID0gewogCQkuaWlmID0gc2tiLT5kZXYtPmlmaW5kZXgsCiAJCS5ubF91ID0gewogCQkJLmlwNl91ID0gewogCQkJCS5kYWRkciA9IGlwaC0+ZGFkZHIsCiAJCQkJLnNhZGRyID0gaXBoLT5zYWRkciwKLSNpZmRlZiBDT05GSUdfSVBWNl9ST1VURV9GV01BUksKLQkJCQkuZndtYXJrID0gc2tiLT5uZm1hcmssCi0jZW5kaWYKLQkJCQkuZmxvd2xhYmVsID0gKCogKHUzMiAqKSBpcGgpJklQVjZfRkxPV0lORk9fTUFTSywKKwkJCQkuZmxvd2xhYmVsID0gKCogKF9fYmUzMiAqKSBpcGgpJklQVjZfRkxPV0lORk9fTUFTSywKIAkJCX0sCiAJCX0sCisgCQkubWFyayA9IHNrYi0+bWFyaywKIAkJLnByb3RvID0gaXBoLT5uZXh0aGRyLAogCX07Ci0JaW50IGZsYWdzID0gcnQ2X25lZWRfc3RyaWN0KCZpcGgtPmRhZGRyKSA/IFJUNl9MT09LVVBfRl9JRkFDRSA6IDA7CisKKwlpZiAocnQ2X25lZWRfc3RyaWN0KCZpcGgtPmRhZGRyKSkKKwkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0lGQUNFOwogCiAJc2tiLT5kc3QgPSBmaWI2X3J1bGVfbG9va3VwKCZmbCwgZmxhZ3MsIGlwNl9wb2xfcm91dGVfaW5wdXQpOwogfQpAQCAtNzI0LDcgKzczMiw3IEBACiAJaW50IHN0cmljdCA9IDA7CiAJaW50IGF0dGVtcHRzID0gMzsKIAlpbnQgZXJyOwotCWludCByZWFjaGFibGUgPSBSVDZfTE9PS1VQX0ZfUkVBQ0hBQkxFOworCWludCByZWFjaGFibGUgPSBpcHY2X2RldmNvbmYuZm9yd2FyZGluZyA/IDAgOiBSVDZfTE9PS1VQX0ZfUkVBQ0hBQkxFOwogCiAJc3RyaWN0IHw9IGZsYWdzICYgUlQ2X0xPT0tVUF9GX0lGQUNFOwogCkBAIC03OTQsNiArODAyLDkgQEAKIAlpZiAocnQ2X25lZWRfc3RyaWN0KCZmbC0+Zmw2X2RzdCkpCiAJCWZsYWdzIHw9IFJUNl9MT09LVVBfRl9JRkFDRTsKIAorCWlmICghaXB2Nl9hZGRyX2FueSgmZmwtPmZsNl9zcmMpKQorCQlmbGFncyB8PSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOworCiAJcmV0dXJuIGZpYjZfcnVsZV9sb29rdXAoZmwsIGZsYWdzLCBpcDZfcG9sX3JvdXRlX291dHB1dCk7CiB9CiAKQEAgLTkyOSw3ICs5NDAsNyBAQAogCWZpYjZfZm9yY2Vfc3RhcnRfZ2MoKTsKIAogb3V0OgotCXJldHVybiAoc3RydWN0IGRzdF9lbnRyeSAqKXJ0OworCXJldHVybiAmcnQtPnUuZHN0OwogfQogCiBpbnQgbmRpc2NfZHN0X2djKGludCAqbW9yZSkKQEAgLTEyMTIsNyArMTIyMyw3IEBACiAJaWYgKGlkZXYpCiAJCWluNl9kZXZfcHV0KGlkZXYpOwogCWlmIChydCkKLQkJZHN0X2ZyZWUoKHN0cnVjdCBkc3RfZW50cnkgKikgcnQpOworCQlkc3RfZnJlZSgmcnQtPnUuZHN0KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMzQ1LDYgKzEzNTYsNyBAQAogCQkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmdhdGV3YXksCiAJCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJaW50IGZsYWdzID0gUlQ2X0xPT0tVUF9GX0hBU19TQUREUjsKIAlzdHJ1Y3QgaXA2cmRfZmxvd2kgcmRmbCA9IHsKIAkJLmZsID0gewogCQkJLm9pZiA9IGRldi0+aWZpbmRleCwKQEAgLTEzNTcsNyArMTM2OSw5IEBACiAJCX0sCiAJCS5nYXRld2F5ID0gKmdhdGV3YXksCiAJfTsKLQlpbnQgZmxhZ3MgPSBydDZfbmVlZF9zdHJpY3QoZGVzdCkgPyBSVDZfTE9PS1VQX0ZfSUZBQ0UgOiAwOworCisJaWYgKHJ0Nl9uZWVkX3N0cmljdChkZXN0KSkKKwkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0lGQUNFOwogCiAJcmV0dXJuIChzdHJ1Y3QgcnQ2X2luZm8gKilmaWI2X3J1bGVfbG9va3VwKChzdHJ1Y3QgZmxvd2kgKikmcmRmbCwgZmxhZ3MsIF9faXA2X3JvdXRlX3JlZGlyZWN0KTsKIH0KQEAgLTE1MjcsNiArMTU0MSw3IEBACiAJCXJ0LT51LmRzdC5vdXRwdXQgPSBvcnQtPnUuZHN0Lm91dHB1dDsKIAogCQltZW1jcHkocnQtPnUuZHN0Lm1ldHJpY3MsIG9ydC0+dS5kc3QubWV0cmljcywgUlRBWF9NQVgqc2l6ZW9mKHUzMikpOworCQlydC0+dS5kc3QuZXJyb3IgPSBvcnQtPnUuZHN0LmVycm9yOwogCQlydC0+dS5kc3QuZGV2ID0gb3J0LT51LmRzdC5kZXY7CiAJCWlmIChydC0+dS5kc3QuZGV2KQogCQkJZGV2X2hvbGQocnQtPnUuZHN0LmRldik7CkBAIC0xNzMwLDI0ICsxNzQ1LDUwIEBACiAgKglEcm9wIHRoZSBwYWNrZXQgb24gdGhlIGZsb29yCiAgKi8KIAotc3RhdGljIGludCBpcDZfcGt0X2Rpc2NhcmQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgaW50IGlwNl9wa3RfZHJvcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY29kZSkKIHsKIAlpbnQgdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZza2ItPm5oLmlwdjZoLT5kYWRkcik7CiAJaWYgKHR5cGUgPT0gSVBWNl9BRERSX0FOWSB8fCB0eXBlID09IElQVjZfQUREUl9SRVNFUlZFRCkKLQkJSVA2X0lOQ19TVEFUUyhJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAKLQlJUDZfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKLQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9ERVNUX1VOUkVBQ0gsIElDTVBWNl9OT1JPVVRFLCAwLCBza2ItPmRldik7CisJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CisJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfREVTVF9VTlJFQUNILCBjb2RlLCAwLCBza2ItPmRldik7CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXA2X3BrdF9kaXNjYXJkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGlwNl9wa3RfZHJvcChza2IsIElDTVBWNl9OT1JPVVRFKTsKK30KKwogc3RhdGljIGludCBpcDZfcGt0X2Rpc2NhcmRfb3V0KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc2tiLT5kZXYgPSBza2ItPmRzdC0+ZGV2OwogCXJldHVybiBpcDZfcGt0X2Rpc2NhcmQoc2tiKTsKIH0KIAorI2lmZGVmIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUworCitzdGF0aWMgaW50IGlwNl9wa3RfcHJvaGliaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gaXA2X3BrdF9kcm9wKHNrYiwgSUNNUFY2X0FETV9QUk9ISUJJVEVEKTsKK30KKworc3RhdGljIGludCBpcDZfcGt0X3Byb2hpYml0X291dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+ZGV2ID0gc2tiLT5kc3QtPmRldjsKKwlyZXR1cm4gaXA2X3BrdF9wcm9oaWJpdChza2IpOworfQorCitzdGF0aWMgaW50IGlwNl9wa3RfYmxrX2hvbGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKIC8qCiAgKglBbGxvY2F0ZSBhIGRzdCBmb3IgbG9jYWwgKHVuaWNhc3QgLyBhbnljYXN0KSBhZGRyZXNzLgogICovCkBAIC0xNzgxLDcgKzE4MjIsNyBAQAogCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfTE9DQUw7CiAJcnQtPnJ0NmlfbmV4dGhvcCA9IG5kaXNjX2dldF9uZWlnaChydC0+cnQ2aV9kZXYsICZydC0+cnQ2aV9nYXRld2F5KTsKIAlpZiAocnQtPnJ0NmlfbmV4dGhvcCA9PSBOVUxMKSB7Ci0JCWRzdF9mcmVlKChzdHJ1Y3QgZHN0X2VudHJ5ICopIHJ0KTsKKwkJZHN0X2ZyZWUoJnJ0LT51LmRzdCk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIApAQCAtMTk2NSw2ICsyMDA2LDIwIEBACiAJcmV0dXJuIGlwNl9yb3V0ZV9hZGQoJmNmZyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHJ0Nl9ubG1zZ19zaXplKHZvaWQpCit7CisJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRtc2cpKQorCSAgICAgICArIG5sYV90b3RhbF9zaXplKDE2KSAvKiBSVEFfU1JDICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMTYpIC8qIFJUQV9EU1QgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgxNikgLyogUlRBX0dBVEVXQVkgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgxNikgLyogUlRBX1BSRUZTUkMgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBSVEFfVEFCTEUgKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBSVEFfSUlGICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogUlRBX09JRiAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKDQpIC8qIFJUQV9QUklPUklUWSAqLworCSAgICAgICArIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgcnRhX2NhY2hlaW5mbykpOworfQorCiBzdGF0aWMgaW50IHJ0Nl9maWxsX25vZGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJ0Nl9pbmZvICpydCwKIAkJCSBzdHJ1Y3QgaW42X2FkZHIgKmRzdCwgc3RydWN0IGluNl9hZGRyICpzcmMsCiAJCQkgaW50IGlpZiwgaW50IHR5cGUsIHUzMiBwaWQsIHUzMiBzZXEsCkBAIC0xOTcyLDcgKzIwMjcsNyBAQAogewogCXN0cnVjdCBydG1zZyAqcnRtOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXN0cnVjdCBydGFfY2FjaGVpbmZvIGNpOworCWxvbmcgZXhwaXJlczsKIAl1MzIgdGFibGU7CiAKIAlpZiAocHJlZml4KSB7CS8qIHVzZXIgd2FudHMgcHJlZml4IHJvdXRlcyBvbmx5ICovCkBAIC0yMDQ2LDE4ICsyMTAxLDExIEBACiAJCU5MQV9QVVRfVTMyKHNrYiwgUlRBX09JRiwgcnQtPnJ0NmlfZGV2LT5pZmluZGV4KTsKIAogCU5MQV9QVVRfVTMyKHNrYiwgUlRBX1BSSU9SSVRZLCBydC0+cnQ2aV9tZXRyaWMpOwotCWNpLnJ0YV9sYXN0dXNlID0gamlmZmllc190b19jbG9ja190KGppZmZpZXMgLSBydC0+dS5kc3QubGFzdHVzZSk7Ci0JaWYgKHJ0LT5ydDZpX2V4cGlyZXMpCi0JCWNpLnJ0YV9leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHJ0LT5ydDZpX2V4cGlyZXMgLSBqaWZmaWVzKTsKLQllbHNlCi0JCWNpLnJ0YV9leHBpcmVzID0gMDsKLQljaS5ydGFfdXNlZCA9IHJ0LT51LmRzdC5fX3VzZTsKLQljaS5ydGFfY2xudHJlZiA9IGF0b21pY19yZWFkKCZydC0+dS5kc3QuX19yZWZjbnQpOwotCWNpLnJ0YV9lcnJvciA9IHJ0LT51LmRzdC5lcnJvcjsKLQljaS5ydGFfaWQgPSAwOwotCWNpLnJ0YV90cyA9IDA7Ci0JY2kucnRhX3RzYWdlID0gMDsKLQlOTEFfUFVUKHNrYiwgUlRBX0NBQ0hFSU5GTywgc2l6ZW9mKGNpKSwgJmNpKTsKKworCWV4cGlyZXMgPSBydC0+cnQ2aV9leHBpcmVzID8gcnQtPnJ0NmlfZXhwaXJlcyAtIGppZmZpZXMgOiAwOworCWlmIChydG5sX3B1dF9jYWNoZWluZm8oc2tiLCAmcnQtPnUuZHN0LCAwLCAwLCAwLAorCQkJICAgICAgIGV4cGlyZXMsIHJ0LT51LmRzdC5lcnJvcikgPCAwKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOwogCkBAIC0yMTU5LDcgKzIyMDcsNiBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTMyIHBpZCA9IDAsIHNlcSA9IDA7CiAJc3RydWN0IG5sbXNnaGRyICpubGggPSBOVUxMOwotCWludCBwYXlsb2FkID0gc2l6ZW9mKHN0cnVjdCBydG1zZykgKyAyNTY7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCiAJaWYgKGluZm8pIHsKQEAgLTIxNjksMTUgKzIyMTYsMTMgQEAKIAkJCXNlcSA9IG5saC0+bmxtc2dfc2VxOwogCX0KIAotCXNrYiA9IG5sbXNnX25ldyhubG1zZ190b3RhbF9zaXplKHBheWxvYWQpLCBnZnBfYW55KCkpOworCXNrYiA9IG5sbXNnX25ldyhydDZfbmxtc2dfc2l6ZSgpLCBnZnBfYW55KCkpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBydDZfZmlsbF9ub2RlKHNrYiwgcnQsIE5VTEwsIE5VTEwsIDAsIGV2ZW50LCBwaWQsIHNlcSwgMCwgMCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwkvKiBmYWlsdXJlIGltcGxpZXMgQlVHIGluIHJ0Nl9ubG1zZ19zaXplKCkgKi8KKwlCVUdfT04oZXJyIDwgMCk7CiAKIAllcnIgPSBydG5sX25vdGlmeShza2IsIHBpZCwgUlROTEdSUF9JUFY2X1JPVVRFLCBubGgsIGdmcF9hbnkoKSk7CiBlcnJvdXQ6CkBAIC0yMjA1LDcgKzIyNTAsNiBAQAogc3RhdGljIGludCBydDZfaW5mb19yb3V0ZShzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCB2b2lkICpwX2FyZykKIHsKIAlzdHJ1Y3QgcnQ2X3Byb2NfYXJnICphcmcgPSAoc3RydWN0IHJ0Nl9wcm9jX2FyZyAqKSBwX2FyZzsKLQlpbnQgaTsKIAogCWlmIChhcmctPnNraXAgPCBhcmctPm9mZnNldCAvIFJUNl9JTkZPX0xFTikgewogCQlhcmctPnNraXArKzsKQEAgLTIyMTUsMzggKzIyNTksMjggQEAKIAlpZiAoYXJnLT5sZW4gPj0gYXJnLT5sZW5ndGgpCiAJCXJldHVybiAwOwogCi0JZm9yIChpPTA7IGk8MTY7IGkrKykgewotCQlzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sICIlMDJ4IiwKLQkJCXJ0LT5ydDZpX2RzdC5hZGRyLnM2X2FkZHJbaV0pOwotCQlhcmctPmxlbiArPSAyOwotCX0KLQlhcmctPmxlbiArPSBzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sICIgJTAyeCAiLAorCWFyZy0+bGVuICs9IHNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwKKwkJCSAgICBOSVA2X1NFUUZNVCAiICUwMnggIiwKKwkJCSAgICBOSVA2KHJ0LT5ydDZpX2RzdC5hZGRyKSwKIAkJCSAgICBydC0+cnQ2aV9kc3QucGxlbik7CiAKICNpZmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUwotCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKLQkJc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLCAiJTAyeCIsCi0JCQlydC0+cnQ2aV9zcmMuYWRkci5zNl9hZGRyW2ldKTsKLQkJYXJnLT5sZW4gKz0gMjsKLQl9Ci0JYXJnLT5sZW4gKz0gc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLCAiICUwMnggIiwKKwlhcmctPmxlbiArPSBzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sCisJCQkgICAgTklQNl9TRVFGTVQgIiAlMDJ4ICIsCisJCQkgICAgTklQNihydC0+cnQ2aV9zcmMuYWRkciksCiAJCQkgICAgcnQtPnJ0Nmlfc3JjLnBsZW4pOwogI2Vsc2UKLQlzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sCi0JCSIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMCAiKTsKLQlhcmctPmxlbiArPSAzNjsKKwlhcmctPmxlbiArPSBzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sCisJCQkgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwICIpOwogI2VuZGlmCiAKIAlpZiAocnQtPnJ0NmlfbmV4dGhvcCkgewotCQlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7Ci0JCQlzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sICIlMDJ4IiwKLQkJCQlydC0+cnQ2aV9uZXh0aG9wLT5wcmltYXJ5X2tleVtpXSk7Ci0JCQlhcmctPmxlbiArPSAyOwotCQl9CisJCWFyZy0+bGVuICs9IHNwcmludGYoYXJnLT5idWZmZXIgKyBhcmctPmxlbiwKKwkJCQkgICAgTklQNl9TRVFGTVQsCisJCQkJICAgIE5JUDYoKigoc3RydWN0IGluNl9hZGRyICopcnQtPnJ0NmlfbmV4dGhvcC0+cHJpbWFyeV9rZXkpKSk7CiAJfSBlbHNlIHsKLQkJc3ByaW50ZihhcmctPmJ1ZmZlciArIGFyZy0+bGVuLAotCQkJIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIik7Ci0JCWFyZy0+bGVuICs9IDMyOworCQlhcmctPmxlbiArPSBzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sCisJCQkJICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIpOwogCX0KIAlhcmctPmxlbiArPSBzcHJpbnRmKGFyZy0+YnVmZmVyICsgYXJnLT5sZW4sCiAJCQkgICAgIiAlMDh4ICUwOHggJTA4eCAlMDh4ICU4c1xuIiwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3NpdC5jIGIvbmV0L2lwdjYvc2l0LmMKaW5kZXggZGM1NzY1Yi4uNzdiN2IwOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc2l0LmMKKysrIGIvbmV0L2lwdjYvc2l0LmMKQEAgLTYwLDcgKzYwLDcgQEAKICAqLwogCiAjZGVmaW5lIEhBU0hfU0laRSAgMTYKLSNkZWZpbmUgSEFTSChhZGRyKSAoKGFkZHJeKGFkZHI+PjQpKSYweEYpCisjZGVmaW5lIEhBU0goYWRkcikgKCgoX19mb3JjZSB1MzIpYWRkcl4oKF9fZm9yY2UgdTMyKWFkZHI+PjQpKSYweEYpCiAKIHN0YXRpYyBpbnQgaXBpcDZfZmJfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGlwaXA2X3R1bm5lbF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtNzYsNyArNzYsNyBAQAogCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhpcGlwNl9sb2NrKTsKIAotc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKiBpcGlwNl90dW5uZWxfbG9va3VwKHUzMiByZW1vdGUsIHUzMiBsb2NhbCkKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICogaXBpcDZfdHVubmVsX2xvb2t1cChfX2JlMzIgcmVtb3RlLCBfX2JlMzIgbG9jYWwpCiB7CiAJdW5zaWduZWQgaDAgPSBIQVNIKHJlbW90ZSk7CiAJdW5zaWduZWQgaDEgPSBIQVNIKGxvY2FsKTsKQEAgLTEwMiw4ICsxMDIsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqKiBpcGlwNl9idWNrZXQoc3RydWN0IGlwX3R1bm5lbCAqdCkKIHsKLQl1MzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOwotCXUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKKwlfX2JlMzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOworCV9fYmUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKIAl1bnNpZ25lZCBoID0gMDsKIAlpbnQgcHJpbyA9IDA7CiAKQEAgLTE0NCw4ICsxNDQsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqIGlwaXA2X3R1bm5lbF9sb2NhdGUoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwYXJtcywgaW50IGNyZWF0ZSkKIHsKLQl1MzIgcmVtb3RlID0gcGFybXMtPmlwaC5kYWRkcjsKLQl1MzIgbG9jYWwgPSBwYXJtcy0+aXBoLnNhZGRyOworCV9fYmUzMiByZW1vdGUgPSBwYXJtcy0+aXBoLmRhZGRyOworCV9fYmUzMiBsb2NhbCA9IHBhcm1zLT5pcGguc2FkZHI7CiAJc3RydWN0IGlwX3R1bm5lbCAqdCwgKip0cCwgKm50OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJdW5zaWduZWQgaCA9IDA7CkBAIC00MDUsOSArNDA1LDkgQEAKIC8qIFJldHVybnMgdGhlIGVtYmVkZGVkIElQdjQgYWRkcmVzcyBpZiB0aGUgSVB2NiBhZGRyZXNzCiAgICBjb21lcyBmcm9tIDZ0bzQgKFJGQyAzMDU2KSBhZGRyIHNwYWNlICovCiAKLXN0YXRpYyBpbmxpbmUgdTMyIHRyeV82dG80KHN0cnVjdCBpbjZfYWRkciAqdjZkc3QpCitzdGF0aWMgaW5saW5lIF9fYmUzMiB0cnlfNnRvNChzdHJ1Y3QgaW42X2FkZHIgKnY2ZHN0KQogewotCXUzMiBkc3QgPSAwOworCV9fYmUzMiBkc3QgPSAwOwogCiAJaWYgKHY2ZHN0LT5zNl9hZGRyMTZbMF0gPT0gaHRvbnMoMHgyMDAyKSkgewogCSAgICAgICAgLyogNnRvNCB2NiBhZGRyIGhhcyAxNiBiaXRzIHByZWZpeCwgMzIgdjRhZGRyLCAxNiBTTEEsIC4uLiAqLwpAQCAtNDMyLDcgKzQzMiw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CQkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KIAlzdHJ1Y3QgaXBoZHIgICppcGg7CQkJLyogT3VyIG5ldyBJUCBoZWFkZXIgKi8KIAlpbnQgICAgbWF4X2hlYWRyb29tOwkJCS8qIFRoZSBleHRyYSBoZWFkZXIgc3BhY2UgbmVlZGVkICovCi0JdTMyICAgIGRzdCA9IHRpcGgtPmRhZGRyOworCV9fYmUzMiBkc3QgPSB0aXBoLT5kYWRkcjsKIAlpbnQgICAgbXR1OwogCXN0cnVjdCBpbjZfYWRkciAqYWRkcjY7CQogCWludCBhZGRyX3R5cGU7CkBAIC04MDksNyArODA5LDcgQEAKIAl9CiB9CiAKLXZvaWQgX19leGl0IHNpdF9jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgc2l0X2NsZWFudXAodm9pZCkKIHsKIAlpbmV0X2RlbF9wcm90b2NvbCgmc2l0X3Byb3RvY29sLCBJUFBST1RPX0lQVjYpOwogCkBAIC04MTksNyArODE5LDcgQEAKIAlydG5sX3VubG9jaygpOwogfQogCi1pbnQgX19pbml0IHNpdF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBzaXRfaW5pdCh2b2lkKQogewogCWludCBlcnI7CiAKQEAgLTg1MywzICs4NTMsNSBAQAogCiBtb2R1bGVfaW5pdChzaXRfaW5pdCk7CiBtb2R1bGVfZXhpdChzaXRfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInNpdDAiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IDRjMmE3YzAuLmMyNWU5MzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtNjYsMTAgKzY2LDEzIEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCiAvKiBTb2NrZXQgdXNlZCBmb3Igc2VuZGluZyBSU1RzIGFuZCBBQ0tzICovCiBzdGF0aWMgc3RydWN0IHNvY2tldCAqdGNwNl9zb2NrZXQ7CiAKLXN0YXRpYyB2b2lkCXRjcF92Nl9zZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQJdGNwX3Y2X3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyB2b2lkCXRjcF92Nl9yZXFza19zZW5kX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpOwogc3RhdGljIHZvaWQJdGNwX3Y2X3NlbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLCAKIAkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwpAQCAtNzgsNiArODEsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29ja19hZl9vcHMgaXB2Nl9tYXBwZWQ7CiBzdGF0aWMgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrX2FmX29wcyBpcHY2X3NwZWNpZmljOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCitzdGF0aWMgc3RydWN0IHRjcF9zb2NrX2FmX29wcyB0Y3Bfc29ja19pcHY2X3NwZWNpZmljOworc3RhdGljIHN0cnVjdCB0Y3Bfc29ja19hZl9vcHMgdGNwX3NvY2tfaXB2Nl9tYXBwZWRfc3BlY2lmaWM7CisjZW5kaWYKIAogc3RhdGljIGludCB0Y3BfdjZfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtKQogewpAQCAtOTgsMjcgKzEwNSwyMCBAQAogCX0KIH0KIAotc3RhdGljIF9faW5saW5lX18gdTE2IHRjcF92Nl9jaGVjayhzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IGxlbiwKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgdGNwX3Y2X2NoZWNrKHN0cnVjdCB0Y3BoZHIgKnRoLCBpbnQgbGVuLAogCQkJCSAgIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIAogCQkJCSAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgYmFzZSkKKwkJCQkgICBfX3dzdW0gYmFzZSkKIHsKIAlyZXR1cm4gY3N1bV9pcHY2X21hZ2ljKHNhZGRyLCBkYWRkciwgbGVuLCBJUFBST1RPX1RDUCwgYmFzZSk7CiB9CiAKLXN0YXRpYyBfX3UzMiB0Y3BfdjZfaW5pdF9zZXF1ZW5jZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgX191MzIgdGNwX3Y2X2luaXRfc2VxdWVuY2Uoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewotCQlyZXR1cm4gc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcihza2ItPm5oLmlwdjZoLT5kYWRkci5zNl9hZGRyMzIsCi0JCQkJCQkgICAgc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcjMyLAotCQkJCQkJICAgIHNrYi0+aC50aC0+ZGVzdCwKLQkJCQkJCSAgICBza2ItPmgudGgtPnNvdXJjZSk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJCSAgc2tiLT5uaC5pcGgtPnNhZGRyLAotCQkJCQkJICBza2ItPmgudGgtPmRlc3QsCi0JCQkJCQkgIHNrYi0+aC50aC0+c291cmNlKTsKLQl9CisJcmV0dXJuIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcHY2aC0+ZGFkZHIuczZfYWRkcjMyLAorCQkJCQkgICAgc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcjMyLAorCQkJCQkgICAgc2tiLT5oLnRoLT5kZXN0LAorCQkJCQkgICAgc2tiLT5oLnRoLT5zb3VyY2UpOwogfQogCiBzdGF0aWMgaW50IHRjcF92Nl9jb25uZWN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwgCkBAIC0yMTUsNiArMjE1LDkgQEAKIAogCQlpY3NrLT5pY3NrX2FmX29wcyA9ICZpcHY2X21hcHBlZDsKIAkJc2stPnNrX2JhY2tsb2dfcmN2ID0gdGNwX3Y0X2RvX3JjdjsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCQl0cC0+YWZfc3BlY2lmaWMgPSAmdGNwX3NvY2tfaXB2Nl9tYXBwZWRfc3BlY2lmaWM7CisjZW5kaWYKIAogCQllcnIgPSB0Y3BfdjRfY29ubmVjdChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKTsKIApAQCAtMjIyLDYgKzIyNSw5IEBACiAJCQlpY3NrLT5pY3NrX2V4dF9oZHJfbGVuID0gZXh0aGRybGVuOwogCQkJaWNzay0+aWNza19hZl9vcHMgPSAmaXB2Nl9zcGVjaWZpYzsKIAkJCXNrLT5za19iYWNrbG9nX3JjdiA9IHRjcF92Nl9kb19yY3Y7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwkJCXRwLT5hZl9zcGVjaWZpYyA9ICZ0Y3Bfc29ja19pcHY2X3NwZWNpZmljOworI2VuZGlmCiAJCQlnb3RvIGZhaWx1cmU7CiAJCX0gZWxzZSB7CiAJCQlpcHY2X2FkZHJfc2V0KCZucC0+c2FkZHIsIDAsIDAsIGh0b25sKDB4MDAwMEZGRkYpLApAQCAtMzEwLDcgKzMxNiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHRjcF92Nl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCi0JCWludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKwkJaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gKHN0cnVjdCBpcHY2aGRyKilza2ItPmRhdGE7CiAJY29uc3Qgc3RydWN0IHRjcGhkciAqdGggPSAoc3RydWN0IHRjcGhkciAqKShza2ItPmRhdGErb2Zmc2V0KTsKQEAgLTUwOSw4ICs1MTUsNyBAQAogCiAJCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmdHJlcS0+cm10X2FkZHIpOwogCQllcnIgPSBpcDZfeG1pdChzaywgc2tiLCAmZmwsIG9wdCwgMCk7Ci0JCWlmIChlcnIgPT0gTkVUX1hNSVRfQ04pCi0JCQllcnIgPSAwOworCQllcnIgPSBuZXRfeG1pdF9ldmFsKGVycik7CiAJfQogCiBkb25lOgpAQCAtNTI2LDcgKzUzMSwzOTYgQEAKIAkJa2ZyZWVfc2tiKGluZXQ2X3JzayhyZXEpLT5wa3RvcHRzKTsKIH0KIAotc3RhdGljIHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzIHRjcDZfcmVxdWVzdF9zb2NrX29wcyA9IHsKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworc3RhdGljIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqdGNwX3Y2X21kNV9kb19sb29rdXAoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICAgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCBpOworCisJQlVHX09OKHRwID09IE5VTEwpOworCisJaWYgKCF0cC0+bWQ1c2lnX2luZm8gfHwgIXRwLT5tZDVzaWdfaW5mby0+ZW50cmllczYpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IHRwLT5tZDVzaWdfaW5mby0+ZW50cmllczY7IGkrKykgeworCQlpZiAoaXB2Nl9hZGRyX2NtcCgmdHAtPm1kNXNpZ19pbmZvLT5rZXlzNltpXS5hZGRyLCBhZGRyKSA9PSAwKQorCQkJcmV0dXJuIChzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKikmdHAtPm1kNXNpZ19pbmZvLT5rZXlzNltpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKnRjcF92Nl9tZDVfbG9va3VwKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCXN0cnVjdCBzb2NrICphZGRyX3NrKQoreworCXJldHVybiB0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJmluZXQ2X3NrKGFkZHJfc2spLT5kYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKnRjcF92Nl9yZXFza19tZDVfbG9va3VwKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKK3sKKwlyZXR1cm4gdGNwX3Y2X21kNV9kb19sb29rdXAoc2ssICZpbmV0Nl9yc2socmVxKS0+cm10X2FkZHIpOworfQorCitzdGF0aWMgaW50IHRjcF92Nl9tZDVfZG9fYWRkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGluNl9hZGRyICpwZWVyLAorCQkJICAgICBjaGFyICpuZXdrZXksIHU4IG5ld2tleWxlbikKK3sKKwkvKiBBZGQga2V5IHRvIHRoZSBsaXN0ICovCisJc3RydWN0IHRjcDZfbWQ1c2lnX2tleSAqa2V5OworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCB0Y3A2X21kNXNpZ19rZXkgKmtleXM7CisKKwlrZXkgPSAoc3RydWN0IHRjcDZfbWQ1c2lnX2tleSopIHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCBwZWVyKTsKKwlpZiAoa2V5KSB7CisJCS8qIG1vZGlmeSBleGlzdGluZyBlbnRyeSAtIGp1c3QgdXBkYXRlIHRoYXQgb25lICovCisJCWtmcmVlKGtleS0+a2V5KTsKKwkJa2V5LT5rZXkgPSBuZXdrZXk7CisJCWtleS0+a2V5bGVuID0gbmV3a2V5bGVuOworCX0gZWxzZSB7CisJCS8qIHJlYWxsb2NhdGUgbmV3IGxpc3QgaWYgY3VycmVudCBvbmUgaXMgZnVsbC4gKi8KKwkJaWYgKCF0cC0+bWQ1c2lnX2luZm8pIHsKKwkJCXRwLT5tZDVzaWdfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCp0cC0+bWQ1c2lnX2luZm8pLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghdHAtPm1kNXNpZ19pbmZvKSB7CisJCQkJa2ZyZWUobmV3a2V5KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCQl0Y3BfYWxsb2NfbWQ1c2lnX3Bvb2woKTsKKwkJaWYgKHRwLT5tZDVzaWdfaW5mby0+YWxsb2NlZDYgPT0gdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNikgeworCQkJa2V5cyA9IGttYWxsb2MoKHNpemVvZiAodHAtPm1kNXNpZ19pbmZvLT5rZXlzNlswXSkgKgorCQkJCSAgICAgICAodHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNiArIDEpKSwgR0ZQX0FUT01JQyk7CisKKwkJCWlmICgha2V5cykgeworCQkJCXRjcF9mcmVlX21kNXNpZ19wb29sKCk7CisJCQkJa2ZyZWUobmV3a2V5KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJaWYgKHRwLT5tZDVzaWdfaW5mby0+ZW50cmllczYpCisJCQkJbWVtbW92ZShrZXlzLCB0cC0+bWQ1c2lnX2luZm8tPmtleXM2LAorCQkJCQkoc2l6ZW9mICh0cC0+bWQ1c2lnX2luZm8tPmtleXM2WzBdKSAqCisJCQkJCSB0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2KSk7CisKKwkJCWtmcmVlKHRwLT5tZDVzaWdfaW5mby0+a2V5czYpOworCQkJdHAtPm1kNXNpZ19pbmZvLT5rZXlzNiA9IGtleXM7CisJCQl0cC0+bWQ1c2lnX2luZm8tPmFsbG9jZWQ2Kys7CisJCX0KKworCQlpcHY2X2FkZHJfY29weSgmdHAtPm1kNXNpZ19pbmZvLT5rZXlzNlt0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2XS5hZGRyLAorCQkJICAgICAgIHBlZXIpOworCQl0cC0+bWQ1c2lnX2luZm8tPmtleXM2W3RwLT5tZDVzaWdfaW5mby0+ZW50cmllczZdLmtleSA9IG5ld2tleTsKKwkJdHAtPm1kNXNpZ19pbmZvLT5rZXlzNlt0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2XS5rZXlsZW4gPSBuZXdrZXlsZW47CisKKwkJdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNisrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y3BfdjZfbWQ1X2FkZF9mdW5jKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKmFkZHJfc2ssCisJCQkgICAgICAgdTggKm5ld2tleSwgX191OCBuZXdrZXlsZW4pCit7CisJcmV0dXJuIHRjcF92Nl9tZDVfZG9fYWRkKHNrLCAmaW5ldDZfc2soYWRkcl9zayktPmRhZGRyLAorCQkJCSBuZXdrZXksIG5ld2tleWxlbik7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Y2X21kNV9kb19kZWwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW42X2FkZHIgKnBlZXIpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNjsgaSsrKSB7CisJCWlmIChpcHY2X2FkZHJfY21wKCZ0cC0+bWQ1c2lnX2luZm8tPmtleXM2W2ldLmFkZHIsIHBlZXIpID09IDApIHsKKwkJCS8qIEZyZWUgdGhlIGtleSAqLworCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNltpXS5rZXkpOworCQkJdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNi0tOworCisJCQlpZiAodHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNiA9PSAwKSB7CisJCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNik7CisJCQkJdHAtPm1kNXNpZ19pbmZvLT5rZXlzNiA9IE5VTEw7CisKKwkJCQl0Y3BfZnJlZV9tZDVzaWdfcG9vbCgpOworCisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCS8qIHNocmluayB0aGUgZGF0YWJhc2UgKi8KKwkJCQlpZiAodHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNiAhPSBpKQorCQkJCQltZW1tb3ZlKCZ0cC0+bWQ1c2lnX2luZm8tPmtleXM2W2ldLAorCQkJCQkJJnRwLT5tZDVzaWdfaW5mby0+a2V5czZbaSsxXSwKKwkJCQkJCSh0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2IC0gaSkKKwkJCQkJCSogc2l6ZW9mICh0cC0+bWQ1c2lnX2luZm8tPmtleXM2WzBdKSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF92Nl9jbGVhcl9tZDVfbGlzdCAoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWludCBpOworCisJaWYgKHRwLT5tZDVzaWdfaW5mby0+ZW50cmllczYpIHsKKwkJZm9yIChpID0gMDsgaSA8IHRwLT5tZDVzaWdfaW5mby0+ZW50cmllczY7IGkrKykKKwkJCWtmcmVlKHRwLT5tZDVzaWdfaW5mby0+a2V5czZbaV0ua2V5KTsKKwkJdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNiA9IDA7CisJCXRjcF9mcmVlX21kNXNpZ19wb29sKCk7CisJfQorCisJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNik7CisJdHAtPm1kNXNpZ19pbmZvLT5rZXlzNiA9IE5VTEw7CisJdHAtPm1kNXNpZ19pbmZvLT5hbGxvY2VkNiA9IDA7CisKKwlpZiAodHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNCkgeworCQlmb3IgKGkgPSAwOyBpIDwgdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNDsgaSsrKQorCQkJa2ZyZWUodHAtPm1kNXNpZ19pbmZvLT5rZXlzNFtpXS5rZXkpOworCQl0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM0ID0gMDsKKwkJdGNwX2ZyZWVfbWQ1c2lnX3Bvb2woKTsKKwl9CisKKwlrZnJlZSh0cC0+bWQ1c2lnX2luZm8tPmtleXM0KTsKKwl0cC0+bWQ1c2lnX2luZm8tPmtleXM0ID0gTlVMTDsKKwl0cC0+bWQ1c2lnX2luZm8tPmFsbG9jZWQ0ID0gMDsKK30KKworc3RhdGljIGludCB0Y3BfdjZfcGFyc2VfbWQ1X2tleXMgKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwKKwkJCQkgIGludCBvcHRsZW4pCit7CisJc3RydWN0IHRjcF9tZDVzaWcgY21kOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZjbWQudGNwbV9hZGRyOworCXU4ICpuZXdrZXk7CisKKwlpZiAob3B0bGVuIDwgc2l6ZW9mKGNtZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIG9wdHZhbCwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzaW42LT5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWNtZC50Y3BtX2tleWxlbikgeworCQlpZiAoIXRjcF9zayhzayktPm1kNXNpZ19pbmZvKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9NQVBQRUQpCisJCQlyZXR1cm4gdGNwX3Y0X21kNV9kb19kZWwoc2ssIHNpbjYtPnNpbjZfYWRkci5zNl9hZGRyMzJbM10pOworCQlyZXR1cm4gdGNwX3Y2X21kNV9kb19kZWwoc2ssICZzaW42LT5zaW42X2FkZHIpOworCX0KKworCWlmIChjbWQudGNwbV9rZXlsZW4gPiBUQ1BfTUQ1U0lHX01BWEtFWUxFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXRjcF9zayhzayktPm1kNXNpZ19pbmZvKSB7CisJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCQlzdHJ1Y3QgdGNwX21kNXNpZ19pbmZvICpwOworCisJCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGNwX21kNXNpZ19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXRwLT5tZDVzaWdfaW5mbyA9IHA7CisJfQorCisJbmV3a2V5ID0ga21lbWR1cChjbWQudGNwbV9rZXksIGNtZC50Y3BtX2tleWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdrZXkpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9NQVBQRUQpIHsKKwkJcmV0dXJuIHRjcF92NF9tZDVfZG9fYWRkKHNrLCBzaW42LT5zaW42X2FkZHIuczZfYWRkcjMyWzNdLAorCQkJCQkgbmV3a2V5LCBjbWQudGNwbV9rZXlsZW4pOworCX0KKwlyZXR1cm4gdGNwX3Y2X21kNV9kb19hZGQoc2ssICZzaW42LT5zaW42X2FkZHIsIG5ld2tleSwgY21kLnRjcG1fa2V5bGVuKTsKK30KKworc3RhdGljIGludCB0Y3BfdjZfZG9fY2FsY19tZDVfaGFzaChjaGFyICptZDVfaGFzaCwgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksCisJCQkJICAgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAorCQkJCSAgIHN0cnVjdCB0Y3BoZHIgKnRoLCBpbnQgcHJvdG9jb2wsCisJCQkJICAgaW50IHRjcGxlbikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbNF07CisJX191MTYgZGF0YV9sZW47CisJaW50IGJsb2NrID0gMDsKKwlfX3N1bTE2IGNrc3VtOworCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKmhwOworCXN0cnVjdCB0Y3A2X3BzZXVkb2hkciAqYnA7CisJc3RydWN0IGhhc2hfZGVzYyAqZGVzYzsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBuYnl0ZXMgPSAwOworCisJaHAgPSB0Y3BfZ2V0X21kNXNpZ19wb29sKCk7CisJaWYgKCFocCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcygpOiBoYXNoIHBvb2wgbm90IGZvdW5kLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGNsZWFyX2hhc2hfbm9wdXQ7CisJfQorCWJwID0gJmhwLT5tZDVfYmxrLmlwNjsKKwlkZXNjID0gJmhwLT5tZDVfZGVzYzsKKworCS8qIDEuIFRDUCBwc2V1ZG8taGVhZGVyIChSRkMyNDYwKSAqLworCWlwdjZfYWRkcl9jb3B5KCZicC0+c2FkZHIsIHNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmYnAtPmRhZGRyLCBkYWRkcik7CisJYnAtPmxlbiA9IGh0b25sKHRjcGxlbik7CisJYnAtPnByb3RvY29sID0gaHRvbmwocHJvdG9jb2wpOworCisJc2dfc2V0X2J1Zigmc2dbYmxvY2srK10sIGJwLCBzaXplb2YoKmJwKSk7CisJbmJ5dGVzICs9IHNpemVvZigqYnApOworCisJLyogMi4gVENQIGhlYWRlciwgZXhjbHVkaW5nIG9wdGlvbnMgKi8KKwlja3N1bSA9IHRoLT5jaGVjazsKKwl0aC0+Y2hlY2sgPSAwOworCXNnX3NldF9idWYoJnNnW2Jsb2NrKytdLCB0aCwgc2l6ZW9mKCp0aCkpOworCW5ieXRlcyArPSBzaXplb2YoKnRoKTsKKworCS8qIDMuIFRDUCBzZWdtZW50IGRhdGEgKGlmIGFueSkgKi8KKwlkYXRhX2xlbiA9IHRjcGxlbiAtICh0aC0+ZG9mZiA8PCAyKTsKKwlpZiAoZGF0YV9sZW4gPiAwKSB7CisJCXU4ICpkYXRhID0gKHU4ICopdGggKyAodGgtPmRvZmYgPDwgMik7CisJCXNnX3NldF9idWYoJnNnW2Jsb2NrKytdLCBkYXRhLCBkYXRhX2xlbik7CisJCW5ieXRlcyArPSBkYXRhX2xlbjsKKwl9CisKKwkvKiA0LiBzaGFyZWQga2V5ICovCisJc2dfc2V0X2J1Zigmc2dbYmxvY2srK10sIGtleS0+a2V5LCBrZXktPmtleWxlbik7CisJbmJ5dGVzICs9IGtleS0+a2V5bGVuOworCisJLyogTm93IHN0b3JlIHRoZSBoYXNoIGludG8gdGhlIHBhY2tldCAqLworCWVyciA9IGNyeXB0b19oYXNoX2luaXQoZGVzYyk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcygpOiBoYXNoX2luaXQgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGNsZWFyX2hhc2g7CisJfQorCWVyciA9IGNyeXB0b19oYXNoX3VwZGF0ZShkZXNjLCBzZywgbmJ5dGVzKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IGhhc2hfdXBkYXRlIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBjbGVhcl9oYXNoOworCX0KKwllcnIgPSBjcnlwdG9faGFzaF9maW5hbChkZXNjLCBtZDVfaGFzaCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcygpOiBoYXNoX2ZpbmFsIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBjbGVhcl9oYXNoOworCX0KKworCS8qIFJlc2V0IGhlYWRlciwgYW5kIGZyZWUgdXAgdGhlIGNyeXB0byAqLworCXRjcF9wdXRfbWQ1c2lnX3Bvb2woKTsKKwl0aC0+Y2hlY2sgPSBja3N1bTsKK291dDoKKwlyZXR1cm4gMDsKK2NsZWFyX2hhc2g6CisJdGNwX3B1dF9tZDVzaWdfcG9vbCgpOworY2xlYXJfaGFzaF9ub3B1dDoKKwltZW1zZXQobWQ1X2hhc2gsIDAsIDE2KTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCB0Y3BfdjZfY2FsY19tZDVfaGFzaChjaGFyICptZDVfaGFzaCwgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksCisJCQkJc3RydWN0IHNvY2sgKnNrLAorCQkJCXN0cnVjdCBkc3RfZW50cnkgKmRzdCwKKwkJCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCisJCQkJc3RydWN0IHRjcGhkciAqdGgsIGludCBwcm90b2NvbCwKKwkJCQlpbnQgdGNwbGVuKQoreworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIsICpkYWRkcjsKKworCWlmIChzaykgeworCQlzYWRkciA9ICZpbmV0Nl9zayhzayktPnNhZGRyOworCQlkYWRkciA9ICZpbmV0Nl9zayhzayktPmRhZGRyOworCX0gZWxzZSB7CisJCXNhZGRyID0gJmluZXQ2X3JzayhyZXEpLT5sb2NfYWRkcjsKKwkJZGFkZHIgPSAmaW5ldDZfcnNrKHJlcSktPnJtdF9hZGRyOworCX0KKwlyZXR1cm4gdGNwX3Y2X2RvX2NhbGNfbWQ1X2hhc2gobWQ1X2hhc2gsIGtleSwKKwkJCQkgICAgICAgc2FkZHIsIGRhZGRyLAorCQkJCSAgICAgICB0aCwgcHJvdG9jb2wsIHRjcGxlbik7Cit9CisKK3N0YXRpYyBpbnQgdGNwX3Y2X2luYm91bmRfbWQ1X2hhc2ggKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3U4ICpoYXNoX2xvY2F0aW9uID0gTlVMTDsKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmhhc2hfZXhwZWN0ZWQ7CisJc3RydWN0IGlwdjZoZHIgKmlwNmggPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCWludCBsZW5ndGggPSAodGgtPmRvZmYgPDwgMikgLSBzaXplb2YgKCp0aCk7CisJaW50IGdlbmhhc2g7CisJdTggKnB0cjsKKwl1OCBuZXdoYXNoWzE2XTsKKworCWhhc2hfZXhwZWN0ZWQgPSB0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJmlwNmgtPnNhZGRyKTsKKworCS8qIElmIHRoZSBUQ1Agb3B0aW9uIGlzIHRvbyBzaG9ydCwgd2UgY2FuIHNob3J0IGN1dCAqLworCWlmIChsZW5ndGggPCBUQ1BPTEVOX01ENVNJRykKKwkJcmV0dXJuIGhhc2hfZXhwZWN0ZWQgPyAxIDogMDsKKworCS8qIHBhcnNlIG9wdGlvbnMgKi8KKwlwdHIgPSAodTgqKSh0aCArIDEpOworCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCWludCBvcGNvZGUgPSAqcHRyKys7CisJCWludCBvcHNpemU7CisKKwkJc3dpdGNoKG9wY29kZSkgeworCQljYXNlIFRDUE9QVF9FT0w6CisJCQlnb3RvIGRvbmVfb3B0czsKKwkJY2FzZSBUQ1BPUFRfTk9QOgorCQkJbGVuZ3RoLS07CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCW9wc2l6ZSA9ICpwdHIrKzsKKwkJCWlmIChvcHNpemUgPCAyIHx8IG9wc2l6ZSA+IGxlbmd0aCkKKwkJCQlnb3RvIGRvbmVfb3B0czsKKwkJCWlmIChvcGNvZGUgPT0gVENQT1BUX01ENVNJRykgeworCQkJCWhhc2hfbG9jYXRpb24gPSBwdHI7CisJCQkJZ290byBkb25lX29wdHM7CisJCQl9CisJCX0KKwkJcHRyICs9IG9wc2l6ZSAtIDI7CisJCWxlbmd0aCAtPSBvcHNpemU7CisJfQorCitkb25lX29wdHM6CisJLyogZG8gd2UgaGF2ZSBhIGhhc2ggYXMgZXhwZWN0ZWQ/ICovCisJaWYgKCFoYXNoX2V4cGVjdGVkKSB7CisJCWlmICghaGFzaF9sb2NhdGlvbikKKwkJCXJldHVybiAwOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJNRDUgSGFzaCBOT1QgZXhwZWN0ZWQgYnV0IGZvdW5kICIKKwkJCSAgICAgICAiKCIgTklQNl9GTVQgIiwgJXUpLT4iCisJCQkgICAgICAgIigiIE5JUDZfRk1UICIsICV1KVxuIiwKKwkJCSAgICAgICBOSVA2KGlwNmgtPnNhZGRyKSwgbnRvaHModGgtPnNvdXJjZSksCisJCQkgICAgICAgTklQNihpcDZoLT5kYWRkciksIG50b2hzKHRoLT5kZXN0KSk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFoYXNoX2xvY2F0aW9uKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIk1ENSBIYXNoIGV4cGVjdGVkIGJ1dCBOT1QgZm91bmQgIgorCQkJICAgICAgICIoIiBOSVA2X0ZNVCAiLCAldSktPiIKKwkJCSAgICAgICAiKCIgTklQNl9GTVQgIiwgJXUpXG4iLAorCQkJICAgICAgIE5JUDYoaXA2aC0+c2FkZHIpLCBudG9ocyh0aC0+c291cmNlKSwKKwkJCSAgICAgICBOSVA2KGlwNmgtPmRhZGRyKSwgbnRvaHModGgtPmRlc3QpKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBjaGVjayB0aGUgc2lnbmF0dXJlICovCisJZ2VuaGFzaCA9IHRjcF92Nl9kb19jYWxjX21kNV9oYXNoKG5ld2hhc2gsCisJCQkJCSAgaGFzaF9leHBlY3RlZCwKKwkJCQkJICAmaXA2aC0+c2FkZHIsICZpcDZoLT5kYWRkciwKKwkJCQkJICB0aCwgc2stPnNrX3Byb3RvY29sLAorCQkJCQkgIHNrYi0+bGVuKTsKKwlpZiAoZ2VuaGFzaCB8fCBtZW1jbXAoaGFzaF9sb2NhdGlvbiwgbmV3aGFzaCwgMTYpICE9IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiTUQ1IEhhc2ggJXMgZm9yICIKKwkJCSAgICAgICAiKCIgTklQNl9GTVQgIiwgJXUpLT4iCisJCQkgICAgICAgIigiIE5JUDZfRk1UICIsICV1KVxuIiwKKwkJCSAgICAgICBnZW5oYXNoID8gImZhaWxlZCIgOiAibWlzbWF0Y2giLAorCQkJICAgICAgIE5JUDYoaXA2aC0+c2FkZHIpLCBudG9ocyh0aC0+c291cmNlKSwKKwkJCSAgICAgICBOSVA2KGlwNmgtPmRhZGRyKSwgbnRvaHModGgtPmRlc3QpKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzIHRjcDZfcmVxdWVzdF9zb2NrX29wcyBfX3JlYWRfbW9zdGx5ID0gewogCS5mYW1pbHkJCT0JQUZfSU5FVDYsCiAJLm9ial9zaXplCT0Jc2l6ZW9mKHN0cnVjdCB0Y3A2X3JlcXVlc3Rfc29jayksCiAJLnJ0eF9zeW5fYWNrCT0JdGNwX3Y2X3NlbmRfc3luYWNrLApAQCAtNTM1LDkgKzkyOSwxNiBAQAogCS5zZW5kX3Jlc2V0CT0JdGNwX3Y2X3NlbmRfcmVzZXQKIH07CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworc3RhdGljIHN0cnVjdCB0Y3BfcmVxdWVzdF9zb2NrX29wcyB0Y3BfcmVxdWVzdF9zb2NrX2lwdjZfb3BzID0geworCS5tZDVfbG9va3VwCT0JdGNwX3Y2X3JlcXNrX21kNV9sb29rdXAsCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgdGltZXdhaXRfc29ja19vcHMgdGNwNl90aW1ld2FpdF9zb2NrX29wcyA9IHsKIAkudHdza19vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgdGNwNl90aW1ld2FpdF9zb2NrKSwKIAkudHdza191bmlxdWUJPSB0Y3BfdHdza191bmlxdWUsCisJLnR3c2tfZGVzdHJ1Y3Rvcj0gdGNwX3R3c2tfZGVzdHJ1Y3RvciwKIH07CiAKIHN0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTU0Nyw3ICs5NDgsNyBAQAogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJdGgtPmNoZWNrID0gfmNzdW1faXB2Nl9tYWdpYygmbnAtPnNhZGRyLCAmbnAtPmRhZGRyLCBsZW4sIElQUFJPVE9fVENQLCAgMCk7Ci0JCXNrYi0+Y3N1bSA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKKwkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAl9IGVsc2UgewogCQl0aC0+Y2hlY2sgPSBjc3VtX2lwdjZfbWFnaWMoJm5wLT5zYWRkciwgJm5wLT5kYWRkciwgbGVuLCBJUFBST1RPX1RDUCwgCiAJCQkJCSAgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0aCwgdGgtPmRvZmY8PDIsIApAQCAtNTY5LDE2ICs5NzAsMjAgQEAKIAl0aC0+Y2hlY2sgPSAwOwogCXRoLT5jaGVjayA9IH5jc3VtX2lwdjZfbWFnaWMoJmlwdjZoLT5zYWRkciwgJmlwdjZoLT5kYWRkciwgc2tiLT5sZW4sCiAJCQkJICAgICBJUFBST1RPX1RDUCwgMCk7Ci0Jc2tiLT5jc3VtID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOworCXNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoLCAqdDE7IAogCXN0cnVjdCBza19idWZmICpidWZmOwogCXN0cnVjdCBmbG93aSBmbDsKKwlpbnQgdG90X2xlbiA9IHNpemVvZigqdGgpOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXk7CisjZW5kaWYKIAogCWlmICh0aC0+cnN0KQogCQlyZXR1cm47CkBAIC01ODYsMjUgKzk5MSwzNSBAQAogCWlmICghaXB2Nl91bmljYXN0X2Rlc3RpbmF0aW9uKHNrYikpCiAJCXJldHVybjsgCiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCWlmIChzaykKKwkJa2V5ID0gdGNwX3Y2X21kNV9kb19sb29rdXAoc2ssICZza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJZWxzZQorCQlrZXkgPSBOVUxMOworCisJaWYgKGtleSkKKwkJdG90X2xlbiArPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOworI2VuZGlmCisKIAkvKgogCSAqIFdlIG5lZWQgdG8gZ3JhYiBzb21lIG1lbW9yeSwgYW5kIHB1dCB0b2dldGhlciBhbiBSU1QsCiAJICogYW5kIHRoZW4gcHV0IGl0IGludG8gdGhlIHF1ZXVlIHRvIGJlIHNlbnQuCiAJICovCiAKLQlidWZmID0gYWxsb2Nfc2tiKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAorCWJ1ZmYgPSBhbGxvY19za2IoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKyB0b3RfbGVuLAogCQkJIEdGUF9BVE9NSUMpOwogCWlmIChidWZmID09IE5VTEwpIAogCSAgCXJldHVybjsKIAotCXNrYl9yZXNlcnZlKGJ1ZmYsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwlza2JfcmVzZXJ2ZShidWZmLCBNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHRvdF9sZW4pOwogCi0JdDEgPSAoc3RydWN0IHRjcGhkciAqKSBza2JfcHVzaChidWZmLHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CisJdDEgPSAoc3RydWN0IHRjcGhkciAqKSBza2JfcHVzaChidWZmLCB0b3RfbGVuKTsKIAogCS8qIFN3YXAgdGhlIHNlbmQgYW5kIHRoZSByZWNlaXZlLiAqLwogCW1lbXNldCh0MSwgMCwgc2l6ZW9mKCp0MSkpOwogCXQxLT5kZXN0ID0gdGgtPnNvdXJjZTsKIAl0MS0+c291cmNlID0gdGgtPmRlc3Q7Ci0JdDEtPmRvZmYgPSBzaXplb2YoKnQxKS80OworCXQxLT5kb2ZmID0gdG90X2xlbiAvIDQ7CiAJdDEtPnJzdCA9IDE7CiAgIAogCWlmKHRoLT5hY2spIHsKQEAgLTYxNSw2ICsxMDMwLDIyIEBACiAJCQkJICAgICsgc2tiLT5sZW4gLSAodGgtPmRvZmY8PDIpKTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCWlmIChrZXkpIHsKKwkJX19iZTMyICpvcHQgPSAoX19iZTMyKikodDEgKyAxKTsKKwkJb3B0WzBdID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwKKwkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAorCQkJICAgICAgIChUQ1BPUFRfTUQ1U0lHIDw8IDgpIHwKKwkJCSAgICAgICBUQ1BPTEVOX01ENVNJRyk7CisJCXRjcF92Nl9kb19jYWxjX21kNV9oYXNoKChfX3U4Kikmb3B0WzFdLAorCQkJCQlrZXksCisJCQkJCSZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwkJCQkJJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCQl0MSwgSVBQUk9UT19UQ1AsCisJCQkJCXRvdF9sZW4pOworCX0KKyNlbmRpZgorCiAJYnVmZi0+Y3N1bSA9IGNzdW1fcGFydGlhbCgoY2hhciAqKXQxLCBzaXplb2YoKnQxKSwgMCk7CiAKIAltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKQEAgLTY0NSwxNSArMTA3NiwzNyBAQAogCWtmcmVlX3NrYihidWZmKTsKIH0KIAotc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfYWNrKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssIHUzMiB3aW4sIHUzMiB0cykKK3N0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX2FjayhzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnR3LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssIHUzMiB3aW4sIHUzMiB0cykKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aCwgKnQxOwogCXN0cnVjdCBza19idWZmICpidWZmOwogCXN0cnVjdCBmbG93aSBmbDsKIAlpbnQgdG90X2xlbiA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwlfX2JlMzIgKnRvcHQ7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleTsKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgdHdfa2V5OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCWlmICghdHcgJiYgc2tiLT5zaykgeworCQlrZXkgPSB0Y3BfdjZfbWQ1X2RvX2xvb2t1cChza2ItPnNrLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCX0gZWxzZSBpZiAodHcgJiYgdHctPnR3X21kNV9rZXlsZW4pIHsKKwkJdHdfa2V5LmtleSA9IHR3LT50d19tZDVfa2V5OworCQl0d19rZXkua2V5bGVuID0gdHctPnR3X21kNV9rZXlsZW47CisJCWtleSA9ICZ0d19rZXk7CisJfSBlbHNlIHsKKwkJa2V5ID0gTlVMTDsKKwl9CisjZW5kaWYKIAogCWlmICh0cykKIAkJdG90X2xlbiArPSBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEOworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKGtleSkKKwkJdG90X2xlbiArPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOworI2VuZGlmCiAKIAlidWZmID0gYWxsb2Nfc2tiKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgdG90X2xlbiwKIAkJCSBHRlBfQVRPTUlDKTsKQEAgLTY3MywxNSArMTEyNiwyOSBAQAogCXQxLT5hY2tfc2VxID0gaHRvbmwoYWNrKTsKIAl0MS0+YWNrID0gMTsKIAl0MS0+d2luZG93ID0gaHRvbnMod2luKTsKKworCXRvcHQgPSAoX19iZTMyICopKHQxICsgMSk7CiAJCiAJaWYgKHRzKSB7Ci0JCXUzMiAqcHRyID0gKHUzMiopKHQxICsgMSk7Ci0JCSpwdHIrKyA9IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KSB8IChUQ1BPUFRfTk9QIDw8IDE2KSB8Ci0JCQkgICAgICAgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkgfCBUQ1BPTEVOX1RJTUVTVEFNUCk7Ci0JCSpwdHIrKyA9IGh0b25sKHRjcF90aW1lX3N0YW1wKTsKLQkJKnB0ciA9IGh0b25sKHRzKTsKKwkJKnRvcHQrKyA9IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KSB8IChUQ1BPUFRfTk9QIDw8IDE2KSB8CisJCQkJKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkgfCBUQ1BPTEVOX1RJTUVTVEFNUCk7CisJCSp0b3B0KysgPSBodG9ubCh0Y3BfdGltZV9zdGFtcCk7CisJCSp0b3B0ID0gaHRvbmwodHMpOwogCX0KIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKGtleSkgeworCQkqdG9wdCsrID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwgKFRDUE9QVF9OT1AgPDwgMTYpIHwKKwkJCQkoVENQT1BUX01ENVNJRyA8PCA4KSB8IFRDUE9MRU5fTUQ1U0lHKTsKKwkJdGNwX3Y2X2RvX2NhbGNfbWQ1X2hhc2goKF9fdTggKil0b3B0LAorCQkJCQlrZXksCisJCQkJCSZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwkJCQkJJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCQl0MSwgSVBQUk9UT19UQ1AsCisJCQkJCXRvdF9sZW4pOworCX0KKyNlbmRpZgorCiAJYnVmZi0+Y3N1bSA9IGNzdW1fcGFydGlhbCgoY2hhciAqKXQxLCB0b3RfbGVuLCAwKTsKIAogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwpAQCAtNzEyLDkgKzExNzksOSBAQAogc3RhdGljIHZvaWQgdGNwX3Y2X3RpbWV3YWl0X2FjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcgPSBpbmV0X3R3c2soc2spOwotCWNvbnN0IHN0cnVjdCB0Y3BfdGltZXdhaXRfc29jayAqdGNwdHcgPSB0Y3BfdHdzayhzayk7CisJc3RydWN0IHRjcF90aW1ld2FpdF9zb2NrICp0Y3B0dyA9IHRjcF90d3NrKHNrKTsKIAotCXRjcF92Nl9zZW5kX2Fjayhza2IsIHRjcHR3LT50d19zbmRfbnh0LCB0Y3B0dy0+dHdfcmN2X254dCwKKwl0Y3BfdjZfc2VuZF9hY2sodGNwdHcsIHNrYiwgdGNwdHctPnR3X3NuZF9ueHQsIHRjcHR3LT50d19yY3Zfbnh0LAogCQkJdGNwdHctPnR3X3Jjdl93bmQgPj4gdHctPnR3X3Jjdl93c2NhbGUsCiAJCQl0Y3B0dy0+dHdfdHNfcmVjZW50KTsKIApAQCAtNzIzLDcgKzExOTAsNyBAQAogCiBzdGF0aWMgdm9pZCB0Y3BfdjZfcmVxc2tfc2VuZF9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQogewotCXRjcF92Nl9zZW5kX2Fjayhza2IsIHRjcF9yc2socmVxKS0+c250X2lzbiArIDEsIHRjcF9yc2socmVxKS0+cmN2X2lzbiArIDEsIHJlcS0+cmN2X3duZCwgcmVxLT50c19yZWNlbnQpOworCXRjcF92Nl9zZW5kX2FjayhOVUxMLCBza2IsIHRjcF9yc2socmVxKS0+c250X2lzbiArIDEsIHRjcF9yc2socmVxKS0+cmN2X2lzbiArIDEsIHJlcS0+cmN2X3duZCwgcmVxLT50c19yZWNlbnQpOwogfQogCiAKQEAgLTc5NCw2ICsxMjYxLDEwIEBACiAJaWYgKHJlcSA9PSBOVUxMKQogCQlnb3RvIGRyb3A7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXRjcF9yc2socmVxKS0+YWZfc3BlY2lmaWMgPSAmdGNwX3JlcXVlc3Rfc29ja19pcHY2X29wczsKKyNlbmRpZgorCiAJdGNwX2NsZWFyX29wdGlvbnMoJnRtcF9vcHQpOwogCXRtcF9vcHQubXNzX2NsYW1wID0gSVBWNl9NSU5fTVRVIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAl0bXBfb3B0LnVzZXJfbXNzID0gdHAtPnJ4X29wdC51c2VyX21zczsKQEAgLTgyMiw3ICsxMjkzLDcgQEAKIAkJdHJlcS0+aWlmID0gaW5ldDZfaWlmKHNrYik7CiAKIAlpZiAoaXNuID09IDApIAotCQlpc24gPSB0Y3BfdjZfaW5pdF9zZXF1ZW5jZShzayxza2IpOworCQlpc24gPSB0Y3BfdjZfaW5pdF9zZXF1ZW5jZShza2IpOwogCiAJdGNwX3JzayhyZXEpLT5zbnRfaXNuID0gaXNuOwogCkBAIC04NTIsNiArMTMyMyw5IEBACiAJc3RydWN0IHRjcF9zb2NrICpuZXd0cDsKIAlzdHJ1Y3Qgc29jayAqbmV3c2s7CiAJc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQ7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleTsKKyNlbmRpZgogCiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CiAJCS8qCkBAIC04ODIsNiArMTM1NiwxMCBAQAogCiAJCWluZXRfY3NrKG5ld3NrKS0+aWNza19hZl9vcHMgPSAmaXB2Nl9tYXBwZWQ7CiAJCW5ld3NrLT5za19iYWNrbG9nX3JjdiA9IHRjcF92NF9kb19yY3Y7CisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKKwkJbmV3dHAtPmFmX3NwZWNpZmljID0gJnRjcF9zb2NrX2lwdjZfbWFwcGVkX3NwZWNpZmljOworI2VuZGlmCisKIAkJbmV3bnAtPnBrdG9wdGlvbnMgID0gTlVMTDsKIAkJbmV3bnAtPm9wdAkgICA9IE5VTEw7CiAJCW5ld25wLT5tY2FzdF9vaWYgICA9IGluZXQ2X2lpZihza2IpOwpAQCAtMTAxNiw2ICsxNDk0LDIxIEBACiAKIAluZXdpbmV0LT5kYWRkciA9IG5ld2luZXQtPnNhZGRyID0gbmV3aW5ldC0+cmN2X3NhZGRyID0gTE9PUEJBQ0s0X0lQVjY7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCS8qIENvcHkgb3ZlciB0aGUgTUQ1IGtleSBmcm9tIHRoZSBvcmlnaW5hbCBzb2NrZXQgKi8KKwlpZiAoKGtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmbmV3bnAtPmRhZGRyKSkgIT0gTlVMTCkgeworCQkvKiBXZSdyZSB1c2luZyBvbmUsIHNvIGNyZWF0ZSBhIG1hdGNoaW5nIGtleQorCQkgKiBvbiB0aGUgbmV3c2sgc3RydWN0dXJlLiBJZiB3ZSBmYWlsIHRvIGdldAorCQkgKiBtZW1vcnksIHRoZW4gd2UgZW5kIHVwIG5vdCBjb3B5aW5nIHRoZSBrZXkKKwkJICogYWNyb3NzLiBTaHVja3MuCisJCSAqLworCQljaGFyICpuZXdrZXkgPSBrbWVtZHVwKGtleS0+a2V5LCBrZXktPmtleWxlbiwgR0ZQX0FUT01JQyk7CisJCWlmIChuZXdrZXkgIT0gTlVMTCkKKwkJCXRjcF92Nl9tZDVfZG9fYWRkKG5ld3NrLCAmaW5ldDZfc2soc2spLT5kYWRkciwKKwkJCQkJICBuZXdrZXksIGtleS0+a2V5bGVuKTsKKwl9CisjZW5kaWYKKwogCV9faW5ldDZfaGFzaCgmdGNwX2hhc2hpbmZvLCBuZXdzayk7CiAJaW5ldF9pbmhlcml0X3BvcnQoJnRjcF9oYXNoaW5mbywgc2ssIG5ld3NrKTsKIApAQCAtMTAzMSw3ICsxNTI0LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCB0Y3BfdjZfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIF9fc3VtMTYgdGNwX3Y2X2NoZWNrc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKIAkJaWYgKCF0Y3BfdjZfY2hlY2soc2tiLT5oLnRoLHNrYi0+bGVuLCZza2ItPm5oLmlwdjZoLT5zYWRkciwKQEAgLTEwNDEsOCArMTUzNCw4IEBACiAJCX0KIAl9CiAKLQlza2ItPmNzdW0gPSB+dGNwX3Y2X2NoZWNrKHNrYi0+aC50aCxza2ItPmxlbiwmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsIDApOworCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZCh0Y3BfdjZfY2hlY2soc2tiLT5oLnRoLHNrYi0+bGVuLCZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkgICZza2ItPm5oLmlwdjZoLT5kYWRkciwgMCkpOwogCiAJaWYgKHNrYi0+bGVuIDw9IDc2KSB7CiAJCXJldHVybiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwpAQCAtMTA3NSw2ICsxNTY4LDExIEBACiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQogCQlyZXR1cm4gdGNwX3Y0X2RvX3Jjdihzaywgc2tiKTsKIAorI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJaWYgKHRjcF92Nl9pbmJvdW5kX21kNV9oYXNoIChzaywgc2tiKSkKKwkJZ290byBkaXNjYXJkOworI2VuZGlmCisKIAlpZiAoc2tfZmlsdGVyKHNrLCBza2IpKQogCQlnb3RvIGRpc2NhcmQ7CiAKQEAgLTExNDAsNyArMTYzOCw3IEBACiAJcmV0dXJuIDA7CiAKIHJlc2V0OgotCXRjcF92Nl9zZW5kX3Jlc2V0KHNrYik7CisJdGNwX3Y2X3NlbmRfcmVzZXQoc2ssIHNrYik7CiBkaXNjYXJkOgogCWlmIChvcHRfc2tiKQogCQlfX2tmcmVlX3NrYihvcHRfc2tiKTsKQEAgLTEyNjUsNyArMTc2Myw3IEBACiBiYWRfcGFja2V0OgogCQlUQ1BfSU5DX1NUQVRTX0JIKFRDUF9NSUJfSU5FUlJTKTsKIAl9IGVsc2UgewotCQl0Y3BfdjZfc2VuZF9yZXNldChza2IpOworCQl0Y3BfdjZfc2VuZF9yZXNldChOVUxMLCBza2IpOwogCX0KIAogZGlzY2FyZF9pdDoKQEAgLTEzNDQsNiArMTg0MiwxNSBAQAogI2VuZGlmCiB9OwogCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKK3N0YXRpYyBzdHJ1Y3QgdGNwX3NvY2tfYWZfb3BzIHRjcF9zb2NrX2lwdjZfc3BlY2lmaWMgPSB7CisJLm1kNV9sb29rdXAJPQl0Y3BfdjZfbWQ1X2xvb2t1cCwKKwkuY2FsY19tZDVfaGFzaAk9CXRjcF92Nl9jYWxjX21kNV9oYXNoLAorCS5tZDVfYWRkCT0JdGNwX3Y2X21kNV9hZGRfZnVuYywKKwkubWQ1X3BhcnNlCT0JdGNwX3Y2X3BhcnNlX21kNV9rZXlzLAorfTsKKyNlbmRpZgorCiAvKgogICoJVENQIG92ZXIgSVB2NCB2aWEgSU5FVDYgQVBJCiAgKi8KQEAgLTEzNjYsNiArMTg3MywxNSBAQAogI2VuZGlmCiB9OwogCisjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKK3N0YXRpYyBzdHJ1Y3QgdGNwX3NvY2tfYWZfb3BzIHRjcF9zb2NrX2lwdjZfbWFwcGVkX3NwZWNpZmljID0geworCS5tZDVfbG9va3VwCT0JdGNwX3Y0X21kNV9sb29rdXAsCisJLmNhbGNfbWQ1X2hhc2gJPQl0Y3BfdjRfY2FsY19tZDVfaGFzaCwKKwkubWQ1X2FkZAk9CXRjcF92Nl9tZDVfYWRkX2Z1bmMsCisJLm1kNV9wYXJzZQk9CXRjcF92Nl9wYXJzZV9tZDVfa2V5cywKK307CisjZW5kaWYKKwogLyogTk9URTogQSBsb3Qgb2YgdGhpbmdzIHNldCB0byB6ZXJvIGV4cGxpY2l0bHkgYnkgY2FsbCB0bwogICogICAgICAgc2tfYWxsb2MoKSBzbyBuZWVkIG5vdCBiZSBkb25lIGhlcmUuCiAgKi8KQEAgLTE0MDUsNiArMTkyMSwxMCBAQAogCXNrLT5za193cml0ZV9zcGFjZSA9IHNrX3N0cmVhbV93cml0ZV9zcGFjZTsKIAlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1VTRV9XUklURV9RVUVVRSk7CiAKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXRwLT5hZl9zcGVjaWZpYyA9ICZ0Y3Bfc29ja19pcHY2X3NwZWNpZmljOworI2VuZGlmCisKIAlzay0+c2tfc25kYnVmID0gc3lzY3RsX3RjcF93bWVtWzFdOwogCXNrLT5za19yY3ZidWYgPSBzeXNjdGxfdGNwX3JtZW1bMV07CiAKQEAgLTE0MTUsNiArMTkzNSwxMSBAQAogCiBzdGF0aWMgaW50IHRjcF92Nl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQogeworI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCisJLyogQ2xlYW4gdXAgdGhlIE1ENSBrZXkgbGlzdCAqLworCWlmICh0Y3Bfc2soc2spLT5tZDVzaWdfaW5mbykKKwkJdGNwX3Y2X2NsZWFyX21kNV9saXN0KHNrKTsKKyNlbmRpZgogCXRjcF92NF9kZXN0cm95X3NvY2soc2spOwogCXJldHVybiBpbmV0Nl9kZXN0cm95X3NvY2soc2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdHVubmVsNi5jIGIvbmV0L2lwdjYvdHVubmVsNi5jCmluZGV4IDBlZjlhMzUuLjkxOGQwN2QgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3R1bm5lbDYuYworKysgYi9uZXQvaXB2Ni90dW5uZWw2LmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogfQogCiBzdGF0aWMgdm9pZCB0dW5uZWw2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkJCWludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKwkJCWludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCiB7CiAJc3RydWN0IHhmcm02X3R1bm5lbCAqaGFuZGxlcjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCBlMGMzOTM0Li5mNTJhNWMzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtMzgsMjYgKzM4LDE4IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L3NubXAuaD4KLQotI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L25kaXNjLmg+CiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgogI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KLSNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvdWRwLmg+CiAjaW5jbHVkZSA8bmV0L3Jhdy5oPgotI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgogI2luY2x1ZGUgPG5ldC90Y3Bfc3RhdGVzLmg+Ci0KICNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgInVkcF9pbXBsLmgiCiAKIERFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcF9zdGF0c19pbjYpIF9fcmVhZF9tb3N0bHk7CiAKQEAgLTY2LDIzICs1OCw5IEBACiAJcmV0dXJuIHVkcF9nZXRfcG9ydChzaywgc251bSwgaXB2Nl9yY3Zfc2FkZHJfZXF1YWwpOwogfQogCi1zdGF0aWMgdm9pZCB1ZHBfdjZfaGFzaChzdHJ1Y3Qgc29jayAqc2spCi17Ci0JQlVHKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVkcF92Nl91bmhhc2goc3RydWN0IHNvY2sgKnNrKQotewotIAl3cml0ZV9sb2NrX2JoKCZ1ZHBfaGFzaF9sb2NrKTsKLQlpZiAoc2tfZGVsX25vZGVfaW5pdChzaykpIHsKLQkJaW5ldF9zayhzayktPm51bSA9IDA7Ci0JCXNvY2tfcHJvdF9kZWNfdXNlKHNrLT5za19wcm90KTsKLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ1ZHBfaGFzaF9sb2NrKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzb2NrICp1ZHBfdjZfbG9va3VwKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIHUxNiBzcG9ydCwKLQkJCQkgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIHUxNiBkcG9ydCwgaW50IGRpZikKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqX191ZHA2X2xpYl9sb29rdXAoc3RydWN0IGluNl9hZGRyICpzYWRkciwgX19iZTE2IHNwb3J0LAorCQkJCSAgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIF9fYmUxNiBkcG9ydCwKKwkJCQkgICAgICBpbnQgZGlmLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdKQogewogCXN0cnVjdCBzb2NrICpzaywgKnJlc3VsdCA9IE5VTEw7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CkBAIC05MCw3ICs2OCw3IEBACiAJaW50IGJhZG5lc3MgPSAtMTsKIAogIAlyZWFkX2xvY2soJnVkcF9oYXNoX2xvY2spOwotCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwX2hhc2hbaG51bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pIHsKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnVkcHRhYmxlW2hudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKSB7CiAJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAogCQlpZiAoaW5ldC0+bnVtID09IGhudW0gJiYgc2stPnNrX2ZhbWlseSA9PSBQRl9JTkVUNikgewpAQCAtMTMyLDIwICsxMTAsMTEgQEAKIH0KIAogLyoKLSAqCi0gKi8KLQotc3RhdGljIHZvaWQgdWRwdjZfY2xvc2Uoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCi17Ci0Jc2tfY29tbW9uX3JlbGVhc2Uoc2spOwotfQotCi0vKgogICogCVRoaXMgc2hvdWxkIGJlIGVhc3ksIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGVyZSB3ZQogICogCXJldHVybiBpdCwgb3RoZXJ3aXNlIHdlIGJsb2NrLgogICovCiAKLXN0YXRpYyBpbnQgdWRwdjZfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgCitpbnQgdWRwdjZfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKIAkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCiAJCSAgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKIHsKQEAgLTE1Myw3ICsxMjIsNyBAQAogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKICAgCXN0cnVjdCBza19idWZmICpza2I7CiAJc2l6ZV90IGNvcGllZDsKLSAgCWludCBlcnI7CisJaW50IGVyciwgY29weV9vbmx5LCBpc191ZHBsaXRlID0gSVNfVURQTElURShzayk7CiAKICAgCWlmIChhZGRyX2xlbikKICAgCQkqYWRkcl9sZW49c2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOwpAQCAtMTcyLDE1ICsxNDEsMjEgQEAKICAgCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CiAgIAl9CiAKLQlpZiAoc2tiLT5pcF9zdW1tZWQ9PUNIRUNLU1VNX1VOTkVDRVNTQVJZKSB7Ci0JCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBtc2ctPm1zZ19pb3YsCi0JCQkJCSAgICAgIGNvcGllZCk7Ci0JfSBlbHNlIGlmIChtc2ctPm1zZ19mbGFncyZNU0dfVFJVTkMpIHsKLQkJaWYgKF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJLyoKKwkgKiAJRGVjaWRlIHdoZXRoZXIgdG8gY2hlY2tzdW0gYW5kL29yIGNvcHkgZGF0YS4KKwkgKi8KKwljb3B5X29ubHkgPSAoc2tiLT5pcF9zdW1tZWQ9PUNIRUNLU1VNX1VOTkVDRVNTQVJZKTsKKworCWlmIChpc191ZHBsaXRlICB8fCAgKCFjb3B5X29ubHkgICYmICBtc2ctPm1zZ19mbGFncyZNU0dfVFJVTkMpKSB7CisJCWlmIChfX3VkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJCWdvdG8gY3N1bV9jb3B5X2VycjsKLQkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksIG1zZy0+bXNnX2lvdiwKLQkJCQkJICAgICAgY29waWVkKTsKLQl9IGVsc2UgeworCQljb3B5X29ubHkgPSAxOworCX0KKworCWlmIChjb3B5X29ubHkpCisJCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLAorCQkJCQkgICAgICBtc2ctPm1zZ19pb3YsIGNvcGllZCAgICAgICApOworCWVsc2UgewogCQllcnIgPSBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgbXNnLT5tc2dfaW92KTsKIAkJaWYgKGVyciA9PSAtRUlOVkFMKQogCQkJZ290byBjc3VtX2NvcHlfZXJyOwpAQCAtMjMxLDI2ICsyMDYsMjYgQEAKIAlza2Jfa2lsbF9kYXRhZ3JhbShzaywgc2tiLCBmbGFncyk7CiAKIAlpZiAoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpIHsKLQkJVURQNl9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX0lORVJST1JTKTsKKwkJVURQNl9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX0lORVJST1JTLCBpc191ZHBsaXRlKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCWdvdG8gdHJ5X2FnYWluOwogfQogCi1zdGF0aWMgdm9pZCB1ZHB2Nl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCi0JICAgICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKK3ZvaWQgX191ZHA2X2xpYl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJCSAgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fYmUzMiBpbmZvLAorCQkgICAgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSAgICAgICAgICAgICAgICAgICAgKQogewogCXN0cnVjdCBpcHY2X3BpbmZvICpucDsKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gKHN0cnVjdCBpcHY2aGRyKilza2ItPmRhdGE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmaGRyLT5zYWRkcjsKIAlzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyID0gJmhkci0+ZGFkZHI7CiAJc3RydWN0IHVkcGhkciAqdWggPSAoc3RydWN0IHVkcGhkciopKHNrYi0+ZGF0YStvZmZzZXQpOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgZXJyOwogCi0Jc2sgPSB1ZHBfdjZfbG9va3VwKGRhZGRyLCB1aC0+ZGVzdCwgc2FkZHIsIHVoLT5zb3VyY2UsIGRldi0+aWZpbmRleCk7Ci0gICAKKwlzayA9IF9fdWRwNl9saWJfbG9va3VwKGRhZGRyLCB1aC0+ZGVzdCwKKwkJCSAgICAgICBzYWRkciwgdWgtPnNvdXJjZSwgaW5ldDZfaWlmKHNrYiksIHVkcHRhYmxlKTsKIAlpZiAoc2sgPT0gTlVMTCkKIAkJcmV0dXJuOwogCkBAIC0yNzEsMzYgKzI0Niw2MCBAQAogCXNvY2tfcHV0KHNrKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdWRwdjZfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqIHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIF9faW5saW5lX18gdm9pZCB1ZHB2Nl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsIGludCB0eXBlLAorCQkJCSBpbnQgY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8gICAgICkKIHsKKwlyZXR1cm4gX191ZHA2X2xpYl9lcnIoc2tiLCBvcHQsIHR5cGUsIGNvZGUsIG9mZnNldCwgaW5mbywgdWRwX2hhc2gpOworfQorCitpbnQgdWRwdjZfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqIHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOwogCWludCByYzsKIAotCWlmICgheGZybTZfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIC0xOworCWlmICgheGZybTZfcG9saWN5X2NoZWNrKHNrLCBYRlJNX1BPTElDWV9JTiwgc2tiKSkKKwkJZ290byBkcm9wOworCisJLyoKKwkgKiBVRFAtTGl0ZSBzcGVjaWZpYyB0ZXN0cywgaWdub3JlZCBvbiBVRFAgc29ja2V0cyAoc2VlIG5ldC9pcHY0L3VkcC5jKS4KKwkgKi8KKwlpZiAoKHVwLT5wY2ZsYWcgJiBVRFBMSVRFX1JFQ1ZfQ0MpICAmJiAgVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdikgeworCisJCWlmICh1cC0+cGNybGVuID09IDApIHsgICAgICAgICAgLyogZnVsbCBjb3ZlcmFnZSB3YXMgc2V0ICAqLworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICJVRFBMSVRFNjogcGFydGlhbCBjb3ZlcmFnZSIKKwkJCQkiICVkIHdoaWxlIGZ1bGwgY292ZXJhZ2UgJWQgcmVxdWVzdGVkXG4iLAorCQkJCVVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YsIHNrYi0+bGVuKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlpZiAoVURQX1NLQl9DQihza2IpLT5jc2NvdiAgPCAgdXAtPnBjcmxlbikgeworCQkJTElNSVRfTkVUREVCVUcoS0VSTl9XQVJOSU5HICJVRFBMSVRFNjogY292ZXJhZ2UgJWQgIgorCQkJCQkJICAgICJ0b28gc21hbGwsIG5lZWQgbWluICVkXG4iLAorCQkJCSAgICAgICBVRFBfU0tCX0NCKHNrYiktPmNzY292LCB1cC0+cGNybGVuKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQogCX0KIAotCWlmIChza2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewotCQlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTKTsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAodWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCQlnb3RvIGRyb3A7CiAKIAlpZiAoKHJjID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLHNrYikpIDwgMCkgewogCQkvKiBOb3RlIHRoYXQgYW4gRU5PTUVNIGVycm9yIGlzIGNoYXJnZWQgdHdpY2UgKi8KIAkJaWYgKHJjID09IC1FTk9NRU0pCi0JCQlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX1JDVkJVRkVSUk9SUyk7Ci0JCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIDA7CisJCQlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX1JDVkJVRkVSUk9SUywgdXAtPnBjZmxhZyk7CisJCWdvdG8gZHJvcDsKIAl9Ci0JVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkRBVEFHUkFNUyk7CisJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkRBVEFHUkFNUywgdXAtPnBjZmxhZyk7CiAJcmV0dXJuIDA7Citkcm9wOgorCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIHVwLT5wY2ZsYWcpOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAtMTsKIH0KIAogc3RhdGljIHN0cnVjdCBzb2NrICp1ZHBfdjZfbWNhc3RfbmV4dChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJICAgICAgdTE2IGxvY19wb3J0LCBzdHJ1Y3QgaW42X2FkZHIgKmxvY19hZGRyLAotCQkJCSAgICAgIHUxNiBybXRfcG9ydCwgc3RydWN0IGluNl9hZGRyICpybXRfYWRkciwKKwkJCQkgICAgICBfX2JlMTYgbG9jX3BvcnQsIHN0cnVjdCBpbjZfYWRkciAqbG9jX2FkZHIsCisJCQkJICAgICAgX19iZTE2IHJtdF9wb3J0LCBzdHJ1Y3QgaW42X2FkZHIgKnJtdF9hZGRyLAogCQkJCSAgICAgIGludCBkaWYpCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CkBAIC0zMzksMTYgKzMzOCwxNiBAQAogICogTm90ZTogY2FsbGVkIG9ubHkgZnJvbSB0aGUgQkggaGFuZGxlciBjb250ZXh0LAogICogc28gd2UgZG9uJ3QgbmVlZCB0byBsb2NrIHRoZSBoYXNoZXMuCiAgKi8KLXN0YXRpYyB2b2lkIHVkcHY2X21jYXN0X2RlbGl2ZXIoc3RydWN0IHVkcGhkciAqdWgsCi0JCQkJc3RydWN0IGluNl9hZGRyICpzYWRkciwgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBfX3VkcDZfbGliX21jYXN0X2RlbGl2ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJICAgICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdKQogewogCXN0cnVjdCBzb2NrICpzaywgKnNrMjsKKwljb25zdCBzdHJ1Y3QgdWRwaGRyICp1aCA9IHNrYi0+aC51aDsKIAlpbnQgZGlmOwogCiAJcmVhZF9sb2NrKCZ1ZHBfaGFzaF9sb2NrKTsKLQlzayA9IHNrX2hlYWQoJnVkcF9oYXNoW250b2hzKHVoLT5kZXN0KSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pOwotCWRpZiA9IHNrYi0+ZGV2LT5pZmluZGV4OworCXNrID0gc2tfaGVhZCgmdWRwdGFibGVbbnRvaHModWgtPmRlc3QpICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSk7CisJZGlmID0gaW5ldDZfaWlmKHNrYik7CiAJc2sgPSB1ZHBfdjZfbWNhc3RfbmV4dChzaywgdWgtPmRlc3QsIGRhZGRyLCB1aC0+c291cmNlLCBzYWRkciwgZGlmKTsKIAlpZiAoIXNrKSB7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtMzY1LDkgKzM2NCwzNSBAQAogCXVkcHY2X3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiBvdXQ6CiAJcmVhZF91bmxvY2soJnVkcF9oYXNoX2xvY2spOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVkcHY2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCitzdGF0aWMgaW5saW5lIGludCB1ZHA2X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCkKKworeworCWlmICh1aC0+Y2hlY2sgPT0gMCkgeworCQkvKiBSRkMgMjQ2MCBzZWN0aW9uIDguMSBzYXlzIHRoYXQgd2UgU0hPVUxEIGxvZworCQkgICB0aGlzIGVycm9yLiBXZWxsLCBpdCBpcyByZWFzb25hYmxlLgorCQkgKi8KKwkJTElNSVRfTkVUREVCVUcoS0VSTl9JTkZPICJJUHY2OiB1ZHAgY2hlY2tzdW0gaXMgMFxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUgJiYKKwkgICAgIWNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsICZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwkJICAgIAkgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtICAgICAgICAgICAgICkpCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisKKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCisJCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZChjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCQkJCQkJCSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCQkJCQkJIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwKKwkJCQkJCQkgMCkpOworCisJcmV0dXJuIChVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMCk7Cit9CisKK2ludCBfX3VkcDZfbGliX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10sCisJCSAgIGludCBpc191ZHBsaXRlKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKIAlzdHJ1Y3Qgc29jayAqc2s7CkBAIC0zODQsNDQgKzQwOSwzOSBAQAogCXVoID0gc2tiLT5oLnVoOwogCiAJdWxlbiA9IG50b2hzKHVoLT5sZW4pOwotCi0JLyogQ2hlY2sgZm9yIGp1bWJvIHBheWxvYWQgKi8KLQlpZiAodWxlbiA9PSAwKQotCQl1bGVuID0gc2tiLT5sZW47Ci0KLQlpZiAodWxlbiA+IHNrYi0+bGVuIHx8IHVsZW4gPCBzaXplb2YoKnVoKSkKKwlpZiAodWxlbiA+IHNrYi0+bGVuKQogCQlnb3RvIHNob3J0X3BhY2tldDsKIAotCWlmICh1aC0+Y2hlY2sgPT0gMCkgewotCQkvKiBSRkMgMjQ2MCBzZWN0aW9uIDguMSBzYXlzIHRoYXQgd2UgU0hPVUxEIGxvZwotCQkgICB0aGlzIGVycm9yLiBXZWxsLCBpdCBpcyByZWFzb25hYmxlLgotCQkgKi8KLQkJTElNSVRfTkVUREVCVUcoS0VSTl9JTkZPICJJUHY2OiB1ZHAgY2hlY2tzdW0gaXMgMFxuIik7Ci0JCWdvdG8gZGlzY2FyZDsKLQl9CisJaWYoISBpc191ZHBsaXRlICkgewkJLyogVURQIHZhbGlkYXRlcyB1bGVuLiAqLwogCi0JaWYgKHVsZW4gPCBza2ItPmxlbikgewotCQlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwgdWxlbikpCisJCS8qIENoZWNrIGZvciBqdW1ibyBwYXlsb2FkICovCisJCWlmICh1bGVuID09IDApCisJCQl1bGVuID0gc2tiLT5sZW47CisKKwkJaWYgKHVsZW4gPCBzaXplb2YoKnVoKSkKKwkJCWdvdG8gc2hvcnRfcGFja2V0OworCisJCWlmICh1bGVuIDwgc2tiLT5sZW4pIHsKKwkJCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCB1bGVuKSkKKwkJCQlnb3RvIHNob3J0X3BhY2tldDsKKwkJCXNhZGRyID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOworCQkJZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJCQl1aCA9IHNrYi0+aC51aDsKKwkJfQorCisJCWlmICh1ZHA2X2NzdW1faW5pdChza2IsIHVoKSkKIAkJCWdvdG8gZGlzY2FyZDsKLQkJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7Ci0JCWRhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOwotCQl1aCA9IHNrYi0+aC51aDsKKworCX0gZWxzZSAJewkJCS8qIFVEUC1MaXRlIHZhbGlkYXRlcyBjc2Nvdi4gKi8KKwkJaWYgKHVkcGxpdGU2X2NzdW1faW5pdChza2IsIHVoKSkKKwkJCWdvdG8gZGlzY2FyZDsKIAl9CiAKLQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUgJiYKLQkgICAgIWNzdW1faXB2Nl9tYWdpYyhzYWRkciwgZGFkZHIsIHVsZW4sIElQUFJPVE9fVURQLCBza2ItPmNzdW0pKQotCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCi0JaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKQotCQlza2ItPmNzdW0gPSB+Y3N1bV9pcHY2X21hZ2ljKHNhZGRyLCBkYWRkciwgdWxlbiwgSVBQUk9UT19VRFAsIDApOwotCiAJLyogCiAJICoJTXVsdGljYXN0IHJlY2VpdmUgY29kZSAKIAkgKi8KLQlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdChkYWRkcikpIHsKLQkJdWRwdjZfbWNhc3RfZGVsaXZlcih1aCwgc2FkZHIsIGRhZGRyLCBza2IpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoZGFkZHIpKQorCQlyZXR1cm4gX191ZHA2X2xpYl9tY2FzdF9kZWxpdmVyKHNrYiwgc2FkZHIsIGRhZGRyLCB1ZHB0YWJsZSk7CiAKIAkvKiBVbmljYXN0ICovCiAKQEAgLTQyOSwxNSArNDQ5LDE2IEBACiAJICogY2hlY2sgc29ja2V0IGNhY2hlIC4uLiBtdXN0IHRhbGsgdG8gQWxhbiBhYm91dCBoaXMgcGxhbnMKIAkgKiBmb3Igc29jayBjYWNoZXMuLi4gaSdsbCBza2lwIHRoaXMgZm9yIG5vdy4KIAkgKi8KLQlzayA9IHVkcF92Nl9sb29rdXAoc2FkZHIsIHVoLT5zb3VyY2UsIGRhZGRyLCB1aC0+ZGVzdCwgZGV2LT5pZmluZGV4KTsKKwlzayA9IF9fdWRwNl9saWJfbG9va3VwKHNhZGRyLCB1aC0+c291cmNlLAorCQkJICAgICAgIGRhZGRyLCB1aC0+ZGVzdCwgaW5ldDZfaWlmKHNrYiksIHVkcHRhYmxlKTsKIAogCWlmIChzayA9PSBOVUxMKSB7CiAJCWlmICgheGZybTZfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKQogCQkJZ290byBkaXNjYXJkOwogCi0JCWlmIChza2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwkJaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJCWdvdG8gZGlzY2FyZDsKLQkJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTKTsKKwkJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTLCBpc191ZHBsaXRlKTsKIAogCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9ERVNUX1VOUkVBQ0gsIElDTVBWNl9QT1JUX1VOUkVBQ0gsIDAsIGRldik7CiAKQEAgLTQ1MiwxNCArNDczLDIwIEBACiAJcmV0dXJuKDApOwogCiBzaG9ydF9wYWNrZXQ6CQotCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCXByaW50ayhLRVJOX0RFQlVHICJVRFA6IHNob3J0IHBhY2tldDogJWQvJXVcbiIsIHVsZW4sIHNrYi0+bGVuKTsKKwlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJVRFAlc3Y2OiBzaG9ydCBwYWNrZXQ6ICVkLyV1XG4iLAorCQkgICAgICAgaXNfdWRwbGl0ZT8gIi1MaXRlIiA6ICIiLCAgdWxlbiwgc2tiLT5sZW4pOwogCiBkaXNjYXJkOgotCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMpOworCVVEUDZfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIGlzX3VkcGxpdGUpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybigwKTsJCiB9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB1ZHB2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQoreworCXJldHVybiBfX3VkcDZfbGliX3Jjdihwc2tiLCB1ZHBfaGFzaCwgMCk7Cit9CisKIC8qCiAgKiBUaHJvdyBhd2F5IGFsbCBwZW5kaW5nIGRhdGEgYW5kIGNhbmNlbCB0aGUgY29ya2luZy4gU29ja2V0IGlzIGxvY2tlZC4KICAqLwpAQCAtNDc4LDEzICs1MDUsMTUgQEAKICAqCVNlbmRpbmcKICAqLwogCi1zdGF0aWMgaW50IHVkcF92Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHVkcF9zb2NrICp1cCkKK3N0YXRpYyBpbnQgdWRwX3Y2X3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHVkcGhkciAqdWg7CisJc3RydWN0IHVkcF9zb2NrICAqdXAgPSB1ZHBfc2soc2spOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgZmxvd2kgKmZsID0gJmluZXQtPmNvcmsuZmw7CiAJaW50IGVyciA9IDA7CisJX193c3VtIGNzdW0gPSAwOwogCiAJLyogR3JhYiB0aGUgc2tidWZmIHdoZXJlIFVEUCBoZWFkZXIgc3BhY2UgZXhpc3RzLiAqLwogCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpID09IE5VTEwpCkBAIC00OTksMzUgKzUyOCwxNyBAQAogCXVoLT5sZW4gPSBodG9ucyh1cC0+bGVuKTsKIAl1aC0+Y2hlY2sgPSAwOwogCi0JaWYgKHNrLT5za19ub19jaGVjayA9PSBVRFBfQ1NVTV9OT1hNSVQpIHsKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCQlnb3RvIHNlbmQ7Ci0JfQorCWlmICh1cC0+cGNmbGFnKQorCQljc3VtID0gdWRwbGl0ZV9jc3VtX291dGdvaW5nKHNrLCBza2IpOworCSBlbHNlCisJCWNzdW0gPSB1ZHBfY3N1bV9vdXRnb2luZyhzaywgc2tiKTsKIAotCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfd3JpdGVfcXVldWUpID09IDEpIHsKLQkJc2tiLT5jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdWgsCi0JCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBza2ItPmNzdW0pOwotCQl1aC0+Y2hlY2sgPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAotCQkJCQkgICAgJmZsLT5mbDZfZHN0LAotCQkJCQkgICAgdXAtPmxlbiwgZmwtPnByb3RvLCBza2ItPmNzdW0pOwotCX0gZWxzZSB7Ci0JCXUzMiB0bXBfY3N1bSA9IDA7Ci0KLQkJc2tiX3F1ZXVlX3dhbGsoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKSB7Ci0JCQl0bXBfY3N1bSA9IGNzdW1fYWRkKHRtcF9jc3VtLCBza2ItPmNzdW0pOwotCQl9Ci0JCXRtcF9jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdWgsCi0JCQkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCB0bXBfY3N1bSk7Ci0gICAgICAgICAgICAgICAgdG1wX2NzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJmZsLT5mbDZfc3JjLAotCQkJCQkgICAmZmwtPmZsNl9kc3QsCi0JCQkJCSAgIHVwLT5sZW4sIGZsLT5wcm90bywgdG1wX2NzdW0pOwotICAgICAgICAgICAgICAgIHVoLT5jaGVjayA9IHRtcF9jc3VtOwotCi0JfQorCS8qIGFkZCBwcm90b2NvbC1kZXBlbmRlbnQgcHNldWRvLWhlYWRlciAqLworCXVoLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmZmwtPmZsNl9zcmMsICZmbC0+Zmw2X2RzdCwKKwkJCQkgICAgdXAtPmxlbiwgZmwtPnByb3RvLCBjc3VtICAgKTsKIAlpZiAodWgtPmNoZWNrID09IDApCi0JCXVoLT5jaGVjayA9IC0xOworCQl1aC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAotc2VuZDoKIAllcnIgPSBpcDZfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiBvdXQ6CiAJdXAtPmxlbiA9IDA7CkBAIC01MzUsNyArNTQ2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIAoraW50IHVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCiAJCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyBvcHRfc3BhY2U7CkBAIC01NTUsNiArNTY2LDggQEAKIAlpbnQgY29ya3JlcSA9IHVwLT5jb3JrZmxhZyB8fCBtc2ctPm1zZ19mbGFncyZNU0dfTU9SRTsKIAlpbnQgZXJyOwogCWludCBjb25uZWN0ZWQgPSAwOworCWludCBpc191ZHBsaXRlID0gdXAtPnBjZmxhZzsKKwlpbnQgKCpnZXRmcmFnKSh2b2lkICosIGNoYXIgKiwgaW50LCBpbnQsIGludCwgc3RydWN0IHNrX2J1ZmYgKik7CiAKIAkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzIGNoZWNrICovCiAJaWYgKHNpbjYpIHsKQEAgLTY5NSw3ICs3MDgsNyBAQAogCQlvcHQgPSBmbDZfbWVyZ2Vfb3B0aW9ucygmb3B0X3NwYWNlLCBmbG93bGFiZWwsIG9wdCk7CiAJb3B0ID0gaXB2Nl9maXh1cF9vcHRpb25zKCZvcHRfc3BhY2UsIG9wdCk7CiAKLQlmbC5wcm90byA9IElQUFJPVE9fVURQOworCWZsLnByb3RvID0gc2stPnNrX3Byb3RvY29sOwogCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCBkYWRkcik7CiAJaWYgKGlwdjZfYWRkcl9hbnkoJmZsLmZsNl9zcmMpICYmICFpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpKQogCQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJm5wLT5zYWRkcik7CkBAIC03NjIsMTQgKzc3NSwxNSBAQAogCiBkb19hcHBlbmRfZGF0YToKIAl1cC0+bGVuICs9IHVsZW47Ci0JZXJyID0gaXA2X2FwcGVuZF9kYXRhKHNrLCBpcF9nZW5lcmljX2dldGZyYWcsIG1zZy0+bXNnX2lvdiwgdWxlbiwKKwlnZXRmcmFnICA9ICBpc191ZHBsaXRlID8gIHVkcGxpdGVfZ2V0ZnJhZyA6IGlwX2dlbmVyaWNfZ2V0ZnJhZzsKKwllcnIgPSBpcDZfYXBwZW5kX2RhdGEoc2ssIGdldGZyYWcsIG1zZy0+bXNnX2lvdiwgdWxlbiwKIAkJc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCBobGltaXQsIHRjbGFzcywgb3B0LCAmZmwsCiAJCShzdHJ1Y3QgcnQ2X2luZm8qKWRzdCwKIAkJY29ya3JlcSA/IG1zZy0+bXNnX2ZsYWdzfE1TR19NT1JFIDogbXNnLT5tc2dfZmxhZ3MpOwogCWlmIChlcnIpCiAJCXVkcF92Nl9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJZWxzZSBpZiAoIWNvcmtyZXEpCi0JCWVyciA9IHVkcF92Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB1cCk7CisJCWVyciA9IHVkcF92Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKIAllbHNlIGlmICh1bmxpa2VseShza2JfcXVldWVfZW1wdHkoJnNrLT5za193cml0ZV9xdWV1ZSkpKQogCQl1cC0+cGVuZGluZyA9IDA7CiAKQEAgLTc5NCw3ICs4MDgsNyBAQAogb3V0OgogCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKIAlpZiAoIWVycikgewotCQlVRFA2X0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfT1VUREFUQUdSQU1TKTsKKwkJVURQNl9JTkNfU1RBVFNfVVNFUihVRFBfTUlCX09VVERBVEFHUkFNUywgaXNfdWRwbGl0ZSk7CiAJCXJldHVybiBsZW47CiAJfQogCS8qCkBAIC04MDUsNyArODE5LDcgQEAKIAkgKiBzZWVtcyBsaWtlIG92ZXJraWxsLgogCSAqLwogCWlmIChlcnIgPT0gLUVOT0JVRlMgfHwgdGVzdF9iaXQoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpKSB7Ci0JCVVEUDZfSU5DX1NUQVRTX1VTRVIoVURQX01JQl9TTkRCVUZFUlJPUlMpOworCQlVRFA2X0lOQ19TVEFUU19VU0VSKFVEUF9NSUJfU05EQlVGRVJST1JTLCBpc191ZHBsaXRlKTsKIAl9CiAJcmV0dXJuIGVycjsKIApAQCAtODE3LDcgKzgzMSw3IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBpbnQgdWRwdjZfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK2ludCB1ZHB2Nl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQogewogCWxvY2tfc29jayhzayk7CiAJdWRwX3Y2X2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKQEAgLTgzMSwxMTkgKzg0NSw0MSBAQAogLyoKICAqCVNvY2tldCBvcHRpb24gY29kZSBmb3IgVURQCiAgKi8KLXN0YXRpYyBpbnQgZG9fdWRwdjZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCitpbnQgdWRwdjZfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCSAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKIHsKLQlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKLQlpbnQgdmFsOwotCWludCBlcnIgPSAwOwotCi0JaWYob3B0bGVuPHNpemVvZihpbnQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzd2l0Y2gob3B0bmFtZSkgewotCWNhc2UgVURQX0NPUks6Ci0JCWlmICh2YWwgIT0gMCkgewotCQkJdXAtPmNvcmtmbGFnID0gMTsKLQkJfSBlbHNlIHsKLQkJCXVwLT5jb3JrZmxhZyA9IDA7Ci0JCQlsb2NrX3NvY2soc2spOwotCQkJdWRwX3Y2X3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHVwKTsKLQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCX0KLQkJYnJlYWs7Ci0JCQotCWNhc2UgVURQX0VOQ0FQOgotCQlzd2l0Y2ggKHZhbCkgewotCQljYXNlIDA6Ci0JCQl1cC0+ZW5jYXBfdHlwZSA9IHZhbDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJyID0gLUVOT1BST1RPT1BUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQllcnIgPSAtRU5PUFJPVE9PUFQ7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHVkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQotewotCWlmIChsZXZlbCAhPSBTT0xfVURQKQotCQlyZXR1cm4gaXB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCisJCXJldHVybiB1ZHBfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKKwkJCQkJICB1ZHBfdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyk7CisJcmV0dXJuIGlwdjZfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgY29tcGF0X3VkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCitpbnQgY29tcGF0X3VkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCiB7Ci0JaWYgKGxldmVsICE9IFNPTF9VRFApCi0JCXJldHVybiBjb21wYXRfaXB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwKLQkJCQkJICAgICAgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCisJCXJldHVybiB1ZHBfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKKwkJCQkJICB1ZHBfdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyk7CisJcmV0dXJuIGNvbXBhdF9pcHY2X3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBkb191ZHB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoraW50IHVkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKLQlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKLQlpbnQgdmFsLCBsZW47Ci0KLQlpZihnZXRfdXNlcihsZW4sb3B0bGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKGludCkpOwotCQotCWlmKGxlbiA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoKG9wdG5hbWUpIHsKLQljYXNlIFVEUF9DT1JLOgotCQl2YWwgPSB1cC0+Y29ya2ZsYWc7Ci0JCWJyZWFrOwotCi0JY2FzZSBVRFBfRU5DQVA6Ci0JCXZhbCA9IHVwLT5lbmNhcF90eXBlOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PUFJPVE9PUFQ7Ci0JfTsKLQotICAJaWYocHV0X3VzZXIobGVuLCBvcHRsZW4pKQotICAJCXJldHVybiAtRUZBVUxUOwotCWlmKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0gIAlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1ZHB2Nl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQotewotCWlmIChsZXZlbCAhPSBTT0xfVURQKQotCQlyZXR1cm4gaXB2Nl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwotCXJldHVybiBkb191ZHB2Nl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCisJCXJldHVybiB1ZHBfbGliX2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CisJcmV0dXJuIGlwdjZfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgY29tcGF0X3VkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJCSAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKK2ludCBjb21wYXRfdWRwdjZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewotCWlmIChsZXZlbCAhPSBTT0xfVURQKQotCQlyZXR1cm4gY29tcGF0X2lwdjZfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCi0JCQkJCSAgICAgIG9wdHZhbCwgb3B0bGVuKTsKLQlyZXR1cm4gZG9fdWRwdjZfZ2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlpZiAobGV2ZWwgPT0gU09MX1VEUCAgfHwgIGxldmVsID09IFNPTF9VRFBMSVRFKQorCQlyZXR1cm4gdWRwX2xpYl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCXJldHVybiBjb21wYXRfaXB2Nl9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQogI2VuZGlmCiAKQEAgLTk4NCw3ICs5MjAsNyBAQAogCQkgICBhdG9taWNfcmVhZCgmc3AtPnNrX3JlZmNudCksIHNwKTsKIH0KIAotc3RhdGljIGludCB1ZHA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoraW50IHVkcDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQogCQlzZXFfcHJpbnRmKHNlcSwKQEAgLTEwMDMsNiArOTM5LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInVkcDYiLAogCS5mYW1pbHkJCT0gQUZfSU5FVDYsCisJLmhhc2h0YWJsZQk9IHVkcF9oYXNoLAogCS5zZXFfc2hvdwk9IHVkcDZfc2VxX3Nob3csCiAJLnNlcV9mb3BzCT0gJnVkcDZfc2VxX2ZvcHMsCiB9OwpAQCAtMTAyMiw3ICs5NTksNyBAQAogc3RydWN0IHByb3RvIHVkcHY2X3Byb3QgPSB7CiAJLm5hbWUJCSAgID0gIlVEUHY2IiwKIAkub3duZXIJCSAgID0gVEhJU19NT0RVTEUsCi0JLmNsb3NlCQkgICA9IHVkcHY2X2Nsb3NlLAorCS5jbG9zZQkJICAgPSB1ZHBfbGliX2Nsb3NlLAogCS5jb25uZWN0CSAgID0gaXA2X2RhdGFncmFtX2Nvbm5lY3QsCiAJLmRpc2Nvbm5lY3QJICAgPSB1ZHBfZGlzY29ubmVjdCwKIAkuaW9jdGwJCSAgID0gdWRwX2lvY3RsLApAQCAtMTAzMiw4ICs5NjksOCBAQAogCS5zZW5kbXNnCSAgID0gdWRwdjZfc2VuZG1zZywKIAkucmVjdm1zZwkgICA9IHVkcHY2X3JlY3Ztc2csCiAJLmJhY2tsb2dfcmN2CSAgID0gdWRwdjZfcXVldWVfcmN2X3NrYiwKLQkuaGFzaAkJICAgPSB1ZHBfdjZfaGFzaCwKLQkudW5oYXNoCQkgICA9IHVkcF92Nl91bmhhc2gsCisJLmhhc2gJCSAgID0gdWRwX2xpYl9oYXNoLAorCS51bmhhc2gJCSAgID0gdWRwX2xpYl91bmhhc2gsCiAJLmdldF9wb3J0CSAgID0gdWRwX3Y2X2dldF9wb3J0LAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwNl9zb2NrKSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHBfaW1wbC5oIGIvbmV0L2lwdjYvdWRwX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk4Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvdWRwX2ltcGwuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9VRFA2X0lNUExfSAorI2RlZmluZSBfVURQNl9JTVBMX0gKKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3VkcGxpdGUuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KKworZXh0ZXJuIGludCAgCV9fdWRwNl9saWJfcmN2KHN0cnVjdCBza19idWZmICoqLCBzdHJ1Y3QgaGxpc3RfaGVhZCBbXSwgaW50ICk7CitleHRlcm4gdm9pZCAJX191ZHA2X2xpYl9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICosCisJCQkgICAgICAgaW50ICwgaW50ICwgaW50ICwgX19iZTMyICwgc3RydWN0IGhsaXN0X2hlYWQgW10pOworCitleHRlcm4gaW50CXVkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkgICAgIAkJIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7CitleHRlcm4gaW50CXVkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICAJIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOworI2lmZGVmIENPTkZJR19DT01QQVQKK2V4dGVybiBpbnQJY29tcGF0X3VkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKK2V4dGVybiBpbnQJY29tcGF0X3VkcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOworI2VuZGlmCitleHRlcm4gaW50CXVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOworZXh0ZXJuIGludAl1ZHB2Nl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAorCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAorCQkgIAkgICAgICBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKTsKK2V4dGVybiBpbnQJdWRwdjZfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqIHNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQJdWRwdjZfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzayk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIGludAl1ZHA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTsKKyNlbmRpZgorI2VuZGlmCS8qIF9VRFA2X0lNUExfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwbGl0ZS5jIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOWY5NzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiAgVURQTElURXY2ICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFVEUC1MaXRlIHByb3RvY29sIG92ZXIgSVB2Ni4KKyAqICAgICAgICAgICAgICBTZWUgYWxzbyBuZXQvaXB2NC91ZHBsaXRlLmMKKyAqCisgKiAgVmVyc2lvbjogICAgJElkOiB1ZHBsaXRlLmMsdiAxLjkgMjAwNi8xMC8xOSAwODoyODoxMCBnZXJyaXQgRXhwICQKKyAqCisgKiAgQXV0aG9yczogICAgR2Vycml0IFJlbmtlciAgICAgICA8Z2Vycml0QGVyZy5hYmRuLmFjLnVrPgorICoKKyAqICBDaGFuZ2VzOgorICogIEZpeGVzOgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlICJ1ZHBfaW1wbC5oIgorCitERUZJTkVfU05NUF9TVEFUKHN0cnVjdCB1ZHBfbWliLCB1ZHBsaXRlX3N0YXRzX2luNikgX19yZWFkX21vc3RseTsKKworc3RhdGljIGludCB1ZHBsaXRldjZfcmN2KHN0cnVjdCBza19idWZmICoqcHNrYikKK3sKKwlyZXR1cm4gX191ZHA2X2xpYl9yY3YocHNrYiwgdWRwbGl0ZV9oYXNoLCAxKTsKK30KKworc3RhdGljIHZvaWQgdWRwbGl0ZXY2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKKwkJCSAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKK3sKKwlyZXR1cm4gX191ZHA2X2xpYl9lcnIoc2tiLCBvcHQsIHR5cGUsIGNvZGUsIG9mZnNldCwgaW5mbywgdWRwbGl0ZV9oYXNoKTsKK30KKworc3RhdGljIHN0cnVjdCBpbmV0Nl9wcm90b2NvbCB1ZHBsaXRldjZfcHJvdG9jb2wgPSB7CisJLmhhbmRsZXIJPQl1ZHBsaXRldjZfcmN2LAorCS5lcnJfaGFuZGxlcgk9CXVkcGxpdGV2Nl9lcnIsCisJLmZsYWdzCQk9CUlORVQ2X1BST1RPX05PUE9MSUNZfElORVQ2X1BST1RPX0ZJTkFMLAorfTsKKworc3RhdGljIGludCB1ZHBsaXRlX3Y2X2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSkKK3sKKwlyZXR1cm4gdWRwbGl0ZV9nZXRfcG9ydChzaywgc251bSwgaXB2Nl9yY3Zfc2FkZHJfZXF1YWwpOworfQorCitzdHJ1Y3QgcHJvdG8gdWRwbGl0ZXY2X3Byb3QgPSB7CisJLm5hbWUJCSAgID0gIlVEUExJVEV2NiIsCisJLm93bmVyCQkgICA9IFRISVNfTU9EVUxFLAorCS5jbG9zZQkJICAgPSB1ZHBfbGliX2Nsb3NlLAorCS5jb25uZWN0CSAgID0gaXA2X2RhdGFncmFtX2Nvbm5lY3QsCisJLmRpc2Nvbm5lY3QJICAgPSB1ZHBfZGlzY29ubmVjdCwKKwkuaW9jdGwJCSAgID0gdWRwX2lvY3RsLAorCS5pbml0CQkgICA9IHVkcGxpdGVfc2tfaW5pdCwKKwkuZGVzdHJveQkgICA9IHVkcHY2X2Rlc3Ryb3lfc29jaywKKwkuc2V0c29ja29wdAkgICA9IHVkcHY2X3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJICAgPSB1ZHB2Nl9nZXRzb2Nrb3B0LAorCS5zZW5kbXNnCSAgID0gdWRwdjZfc2VuZG1zZywKKwkucmVjdm1zZwkgICA9IHVkcHY2X3JlY3Ztc2csCisJLmJhY2tsb2dfcmN2CSAgID0gdWRwdjZfcXVldWVfcmN2X3NrYiwKKwkuaGFzaAkJICAgPSB1ZHBfbGliX2hhc2gsCisJLnVuaGFzaAkJICAgPSB1ZHBfbGliX3VuaGFzaCwKKwkuZ2V0X3BvcnQJICAgPSB1ZHBsaXRlX3Y2X2dldF9wb3J0LAorCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwNl9zb2NrKSwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X3NldHNvY2tvcHQsCisJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X2dldHNvY2tvcHQsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5ldF9wcm90b3N3IHVkcGxpdGU2X3Byb3Rvc3cgPSB7CisJLnR5cGUJCT0gU09DS19ER1JBTSwKKwkucHJvdG9jb2wJPSBJUFBST1RPX1VEUExJVEUsCisJLnByb3QJCT0gJnVkcGxpdGV2Nl9wcm90LAorCS5vcHMJCT0gJmluZXQ2X2RncmFtX29wcywKKwkuY2FwYWJpbGl0eQk9IC0xLAorCS5ub19jaGVjawk9IDAsCisJLmZsYWdzCQk9IElORVRfUFJPVE9TV19QRVJNQU5FTlQsCit9OworCit2b2lkIF9faW5pdCB1ZHBsaXRldjZfaW5pdCh2b2lkKQoreworCWlmIChpbmV0Nl9hZGRfcHJvdG9jb2woJnVkcGxpdGV2Nl9wcm90b2NvbCwgSVBQUk9UT19VRFBMSVRFKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCByZWdpc3Rlci5cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpbmV0Nl9yZWdpc3Rlcl9wcm90b3N3KCZ1ZHBsaXRlNl9wcm90b3N3KTsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZHBsaXRlNl9zZXFfZm9wczsKK3N0YXRpYyBzdHJ1Y3QgdWRwX3NlcV9hZmluZm8gdWRwbGl0ZTZfc2VxX2FmaW5mbyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInVkcGxpdGU2IiwKKwkuZmFtaWx5CQk9IEFGX0lORVQ2LAorCS5oYXNodGFibGUJPSB1ZHBsaXRlX2hhc2gsCisJLnNlcV9zaG93CT0gdWRwNl9zZXFfc2hvdywKKwkuc2VxX2ZvcHMJPSAmdWRwbGl0ZTZfc2VxX2ZvcHMsCit9OworCitpbnQgX19pbml0IHVkcGxpdGU2X3Byb2NfaW5pdCh2b2lkKQoreworCXJldHVybiB1ZHBfcHJvY19yZWdpc3RlcigmdWRwbGl0ZTZfc2VxX2FmaW5mbyk7Cit9CisKK3ZvaWQgdWRwbGl0ZTZfcHJvY19leGl0KHZvaWQpCit7CisJdWRwX3Byb2NfdW5yZWdpc3RlcigmdWRwbGl0ZTZfc2VxX2FmaW5mbyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3BvbGljeS5jIGIvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKaW5kZXggNzNjZWUyZS4uOGRmZmQ0ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKKysrIGIvbmV0L2lwdjYveGZybTZfcG9saWN5LmMKQEAgLTI1LDEyICsyNSwxNCBAQAogc3RhdGljIHN0cnVjdCBkc3Rfb3BzIHhmcm02X2RzdF9vcHM7CiBzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyB4ZnJtNl9wb2xpY3lfYWZpbmZvOwogCi1zdGF0aWMgaW50IHhmcm02X2RzdF9sb29rdXAoc3RydWN0IHhmcm1fZHN0ICoqZHN0LCBzdHJ1Y3QgZmxvd2kgKmZsKQorc3RhdGljIGludCB4ZnJtNl9kc3RfbG9va3VwKHN0cnVjdCB4ZnJtX2RzdCAqKnhkc3QsIHN0cnVjdCBmbG93aSAqZmwpCiB7Ci0JaW50IGVyciA9IDA7Ci0JKmRzdCA9IChzdHJ1Y3QgeGZybV9kc3QqKWlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgZmwpOwotCWlmICghKmRzdCkKLQkJZXJyID0gLUVORVRVTlJFQUNIOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgZmwpOworCWludCBlcnIgPSBkc3QtPmVycm9yOworCWlmICghZXJyKQorCQkqeGRzdCA9IChzdHJ1Y3QgeGZybV9kc3QgKikgZHN0OworCWVsc2UKKwkJZHN0X3JlbGVhc2UoZHN0KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzIsMTEgKzI3NCwxMiBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBJUFBST1RPX1VEUDoKKwkJY2FzZSBJUFBST1RPX1VEUExJVEU6CiAJCWNhc2UgSVBQUk9UT19UQ1A6CiAJCWNhc2UgSVBQUk9UT19TQ1RQOgogCQljYXNlIElQUFJPVE9fRENDUDoKIAkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgKyBvZmZzZXQgKyA0IC0gc2tiLT5kYXRhKSkgewotCQkJCXUxNiAqcG9ydHMgPSAodTE2ICopZXh0aGRyOworCQkJCV9fYmUxNiAqcG9ydHMgPSAoX19iZTE2ICopZXh0aGRyOwogCiAJCQkJZmwtPmZsX2lwX3Nwb3J0ID0gcG9ydHNbMF07CiAJCQkJZmwtPmZsX2lwX2Rwb3J0ID0gcG9ydHNbMV07CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYyBiL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jCmluZGV4IDdhZjIyN2IuLjEyZTQyNmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jCkBAIC01MCw3ICs1MCw3IEBACiAjZGVmaW5lIFhGUk02X1RVTk5FTF9TUElfTUlOCTEKICNkZWZpbmUgWEZSTTZfVFVOTkVMX1NQSV9NQVgJMHhmZmZmZmZmZgogCi1zdGF0aWMga21lbV9jYWNoZV90ICp4ZnJtNl90dW5uZWxfc3BpX2ttZW0gX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqeGZybTZfdHVubmVsX3NwaV9rbWVtIF9fcmVhZF9tb3N0bHk7CiAKICNkZWZpbmUgWEZSTTZfVFVOTkVMX1NQSV9CWUFERFJfSFNJWkUgMjU2CiAjZGVmaW5lIFhGUk02X1RVTk5FTF9TUElfQllTUElfSFNJWkUgMjU2CkBAIC02Miw3ICs2Miw3IEBACiB7CiAJdW5zaWduZWQgaDsKIAotCWggPSBhZGRyLT5hNlswXSBeIGFkZHItPmE2WzFdIF4gYWRkci0+YTZbMl0gXiBhZGRyLT5hNlszXTsKKwloID0gKF9fZm9yY2UgdTMyKShhZGRyLT5hNlswXSBeIGFkZHItPmE2WzFdIF4gYWRkci0+YTZbMl0gXiBhZGRyLT5hNlszXSk7CiAJaCBePSBoID4+IDE2OwogCWggXj0gaCA+PiA4OwogCWggJj0gWEZSTTZfVFVOTkVMX1NQSV9CWUFERFJfSFNJWkUgLSAxOwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXUzMiB4ZnJtNl90dW5uZWxfc3BpX2xvb2t1cCh4ZnJtX2FkZHJlc3NfdCAqc2FkZHIpCitfX2JlMzIgeGZybTZfdHVubmVsX3NwaV9sb29rdXAoeGZybV9hZGRyZXNzX3QgKnNhZGRyKQogewogCXN0cnVjdCB4ZnJtNl90dW5uZWxfc3BpICp4NnNwaTsKIAl1MzIgc3BpOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJeDZzcGkgPSBfX3hmcm02X3R1bm5lbF9zcGlfbG9va3VwKHNhZGRyKTsKIAlzcGkgPSB4NnNwaSA/IHg2c3BpLT5zcGkgOiAwOwogCXJlYWRfdW5sb2NrX2JoKCZ4ZnJtNl90dW5uZWxfc3BpX2xvY2spOwotCXJldHVybiBzcGk7CisJcmV0dXJuIGh0b25sKHNwaSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woeGZybTZfdHVubmVsX3NwaV9sb29rdXApOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJc3BpID0gMDsKIAlnb3RvIG91dDsKIGFsbG9jX3NwaToKLQl4NnNwaSA9IGttZW1fY2FjaGVfYWxsb2MoeGZybTZfdHVubmVsX3NwaV9rbWVtLCBTTEFCX0FUT01JQyk7CisJeDZzcGkgPSBrbWVtX2NhY2hlX2FsbG9jKHhmcm02X3R1bm5lbF9zcGlfa21lbSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF4NnNwaSkKIAkJZ290byBvdXQ7CiAKQEAgLTE5Niw3ICsxOTYsNyBAQAogCXJldHVybiBzcGk7CiB9CiAKLXUzMiB4ZnJtNl90dW5uZWxfYWxsb2Nfc3BpKHhmcm1fYWRkcmVzc190ICpzYWRkcikKK19fYmUzMiB4ZnJtNl90dW5uZWxfYWxsb2Nfc3BpKHhmcm1fYWRkcmVzc190ICpzYWRkcikKIHsKIAlzdHJ1Y3QgeGZybTZfdHVubmVsX3NwaSAqeDZzcGk7CiAJdTMyIHNwaTsKQEAgLTIxMCw3ICsyMTAsNyBAQAogCQlzcGkgPSBfX3hmcm02X3R1bm5lbF9hbGxvY19zcGkoc2FkZHIpOwogCXdyaXRlX3VubG9ja19iaCgmeGZybTZfdHVubmVsX3NwaV9sb2NrKTsKIAotCXJldHVybiBzcGk7CisJcmV0dXJuIGh0b25sKHNwaSk7CiB9CiAKIEVYUE9SVF9TWU1CT0woeGZybTZfdHVubmVsX2FsbG9jX3NwaSk7CkBAIC0yNjUsNyArMjY1LDcgQEAKIH0KIAogc3RhdGljIGludCB4ZnJtNl90dW5uZWxfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LAotCQkJICAgIGludCB0eXBlLCBpbnQgY29kZSwgaW50IG9mZnNldCwgX191MzIgaW5mbykKKwkJCSAgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fYmUzMiBpbmZvKQogewogCS8qIHhmcm02X3R1bm5lbCBuYXRpdmUgZXJyIGhhbmRsaW5nICovCiAJc3dpdGNoICh0eXBlKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB4L2FmX2lweC5jIGIvbmV0L2lweC9hZl9pcHguYwppbmRleCBiZWYzZjYxLi43NmM2NjE1IDEwMDY0NAotLS0gYS9uZXQvaXB4L2FmX2lweC5jCisrKyBiL25ldC9pcHgvYWZfaXB4LmMKQEAgLTgzLDEzICs4MywxMyBAQAogc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweF9wcmltYXJ5X25ldDsKIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhfaW50ZXJuYWxfbmV0OwogCi1leHRlcm4gaW50IGlweHJ0cl9hZGRfcm91dGUoX191MzIgbmV0d29yaywgc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKK2V4dGVybiBpbnQgaXB4cnRyX2FkZF9yb3V0ZShfX2JlMzIgbmV0d29yaywgc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKIAkJCSAgICB1bnNpZ25lZCBjaGFyICpub2RlKTsKIGV4dGVybiB2b2lkIGlweHJ0cl9kZWxfcm91dGVzKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMpOwogZXh0ZXJuIGludCBpcHhydHJfcm91dGVfcGFja2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyX2lweCAqdXNpcHgsCiAJCQkgICAgICAgc3RydWN0IGlvdmVjICppb3YsIGludCBsZW4sIGludCBub2Jsb2NrKTsKIGV4dGVybiBpbnQgaXB4cnRyX3JvdXRlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBzdHJ1Y3QgaXB4X3JvdXRlICppcHhydHJfbG9va3VwKF9fdTMyIG5ldCk7CitleHRlcm4gc3RydWN0IGlweF9yb3V0ZSAqaXB4cnRyX2xvb2t1cChfX2JlMzIgbmV0KTsKIGV4dGVybiBpbnQgaXB4cnRyX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwogCiAjdW5kZWYgSVBYX1JFRkNOVF9ERUJVRwpAQCAtMTc3LDcgKzE3Nyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqX19pcHhpdGZfZmluZF91c2luZ19waHlzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBkYXRhbGluaykKKwkJCQkJCSAgICAgIF9fYmUxNiBkYXRhbGluaykKIHsKIAlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaTsKIApAQCAtMTkwLDcgKzE5MCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfcGh5cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJICAgIHVuc2lnbmVkIHNob3J0IGRhdGFsaW5rKQorCQkJCQkJICAgIF9fYmUxNiBkYXRhbGluaykKIHsKIAlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaTsKIApAQCAtMjAyLDcgKzIwMiw3IEBACiAJcmV0dXJuIGk7CiB9CiAKLXN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpdGZfZmluZF91c2luZ19uZXQoX191MzIgbmV0KQorc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9maW5kX3VzaW5nX25ldChfX2JlMzIgbmV0KQogewogCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppOwogCkBAIC0yMzcsNyArMjM3LDcgQEAKIAogLyogY2FsbGVyIG11c3QgaG9sZCBpbnRyZmMtPmlmX3NrbGlzdF9sb2NrICovCiBzdGF0aWMgc3RydWN0IHNvY2sgKl9faXB4aXRmX2ZpbmRfc29ja2V0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCi0JCQkJCSB1bnNpZ25lZCBzaG9ydCBwb3J0KQorCQkJCQkgX19iZTE2IHBvcnQpCiB7CiAJc3RydWN0IHNvY2sgKnM7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CkBAIC0yNTIsNyArMjUyLDcgQEAKIAogLyogY2FsbGVyIG11c3QgaG9sZCBhIHJlZmVyZW5jZSB0byBpbnRyZmMgKi8KIHN0YXRpYyBzdHJ1Y3Qgc29jayAqaXB4aXRmX2ZpbmRfc29ja2V0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCi0JCQkJCXVuc2lnbmVkIHNob3J0IHBvcnQpCisJCQkJCV9fYmUxNiBwb3J0KQogewogCXN0cnVjdCBzb2NrICpzOwogCkBAIC0yNjgsNyArMjY4LDcgQEAKICNpZmRlZiBDT05GSUdfSVBYX0lOVEVSTgogc3RhdGljIHN0cnVjdCBzb2NrICppcHhpdGZfZmluZF9pbnRlcm5hbF9zb2NrZXQoc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYywKIAkJCQkJCXVuc2lnbmVkIGNoYXIgKmlweF9ub2RlLAotCQkJCQkJdW5zaWduZWQgc2hvcnQgcG9ydCkKKwkJCQkJCV9fYmUxNiBwb3J0KQogewogCXN0cnVjdCBzb2NrICpzOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwpAQCAtNjAwLDEwICs2MDAsMTAgQEAKIAogCS8qIHNlZSBpZiB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIG5ldG51bSBpbiB0aGUgcm91dGUgbGlzdCAqLwogCWlmIChJUFhfU0tCX0NCKHNrYiktPmxhc3RfaG9wLmluZGV4ID49IDApIHsKLQkJdTMyICpsYXN0X2hvcCA9ICh1MzIgKikoKCh1OCAqKSBza2ItPmRhdGEpICsKKwkJX19iZTMyICpsYXN0X2hvcCA9IChfX2JlMzIgKikoKCh1OCAqKSBza2ItPmRhdGEpICsKIAkJCQlzaXplb2Yoc3RydWN0IGlweGhkcikgKwogCQkJCUlQWF9TS0JfQ0Ioc2tiKS0+bGFzdF9ob3AuaW5kZXggKgotCQkJCXNpemVvZih1MzIpKTsKKwkJCQlzaXplb2YoX19iZTMyKSk7CiAJCSpsYXN0X2hvcCA9IElQWF9TS0JfQ0Ioc2tiKS0+bGFzdF9ob3AubmV0bnVtOwogCQlJUFhfU0tCX0NCKHNrYiktPmxhc3RfaG9wLmluZGV4ID0gLTE7CiAJfQpAQCAtNzcyLDcgKzc3Miw3IEBACiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJUFg6IE5ldHdvcmsgbnVtYmVyIGNvbGxpc2lvbiAiCiAJCQkJIiVseFxuICAgICAgICAlcyAlcyBhbmQgJXMgJXNcbiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGh0b25sKGNiLT5pcHhfc291cmNlX25ldCksCisJCQkJKHVuc2lnbmVkIGxvbmcpIG50b2hsKGNiLT5pcHhfc291cmNlX25ldCksCiAJCQkJaXB4X2RldmljZV9uYW1lKGkpLAogCQkJCWlweF9mcmFtZV9uYW1lKGktPmlmX2RsaW5rX3R5cGUpLAogCQkJCWlweF9kZXZpY2VfbmFtZShpbnRyZmMpLApAQCAtODEyLDcgKzgxMiw3IEBACiAJaW50IGksIHJjID0gLUVJTlZBTDsKIAlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaWZjczsKIAljaGFyICpjOwotCXUzMiAqbDsKKwlfX2JlMzIgKmw7CiAKIAkvKiBJbGxlZ2FsIHBhY2tldCAtIHRvbyBtYW55IGhvcHMgb3IgdG9vIHNob3J0ICovCiAJLyogV2UgZGVjaWRlIHRvIHRocm93IGl0IGF3YXk6IG5vIGJyb2FkY2FzdGluZywgbm8gbG9jYWwgcHJvY2Vzc2luZy4KQEAgLTgzMyw3ICs4MzMsNyBAQAogCQlnb3RvIG91dDsKIAkKIAljID0gKCh1OCAqKSBpcHgpICsgc2l6ZW9mKHN0cnVjdCBpcHhoZHIpOwotCWwgPSAodTMyICopIGM7CisJbCA9IChfX2JlMzIgKikgYzsKIAogCS8qIERvbid0IGJyb2FkY2FzdCBwYWNrZXQgaWYgYWxyZWFkeSBzZWVuIHRoaXMgbmV0ICovCiAJZm9yIChpID0gMDsgaSA8IElQWF9TS0JfQ0Ioc2tiKS0+aXB4X3RjdHJsOyBpKyspCkBAIC04NTUsNyArODU1LDcgQEAKIAkJLyogVGhhdCBhcmVuJ3QgaW4gdGhlIGxpc3QgKi8KIAkJaWYgKGlmY3MgPT0gaW50cmZjKQogCQkJY29udGludWU7Ci0JCWwgPSAoX191MzIgKikgYzsKKwkJbCA9IChfX2JlMzIgKikgYzsKIAkJLyogZG9uJ3QgY29uc2lkZXIgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHBhY2tldCBsaXN0LAogCQkgKiBpdCBpcyBvdXIgbmV0bnVtLCBhbmQgaXQgaXMgbm90IHRoZXJlIHlldCAqLwogCQlmb3IgKGkgPSAwOyBpIDwgSVBYX1NLQl9DQihza2IpLT5pcHhfdGN0cmw7IGkrKykKQEAgLTg4NSw4ICs4ODUsOCBAQAogCQlpcHhfcHJpbWFyeV9uZXQgPSBpbnRyZmM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTMyIG5ldG51bSwKLQkJCQkJICB1bnNpZ25lZCBzaG9ydCBkbGlua190eXBlLAorc3RhdGljIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpdGZfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTMyIG5ldG51bSwKKwkJCQkJICBfX2JlMTYgZGxpbmtfdHlwZSwKIAkJCQkJICBzdHJ1Y3QgZGF0YWxpbmtfcHJvdG8gKmRsaW5rLAogCQkJCQkgIHVuc2lnbmVkIGNoYXIgaW50ZXJuYWwsCiAJCQkJCSAgaW50IGlweF9vZmZzZXQpCkBAIC05NjAsNyArOTYwLDcgQEAKIHN0YXRpYyBpbnQgaXB4aXRmX2NyZWF0ZShzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uICppZGVmKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgc2hvcnQgZGxpbmtfdHlwZSA9IDA7CisJX19iZTE2IGRsaW5rX3R5cGUgPSAwOwogCXN0cnVjdCBkYXRhbGlua19wcm90byAqZGF0YWxpbmsgPSBOVUxMOwogCXN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmM7CiAJaW50IHJjOwpAQCAtMTA3Myw3ICsxMDczLDcgQEAKIHN0YXRpYyBpbnQgaXB4aXRmX2RlbGV0ZShzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uICppZGVmKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwotCXVuc2lnbmVkIHNob3J0IGRsaW5rX3R5cGUgPSAwOworCV9fYmUxNiBkbGlua190eXBlID0gMDsKIAlzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjOwogCWludCByYyA9IDA7CiAKQEAgLTExMTAsNyArMTExMCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2F1dG9fY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQl1bnNpZ25lZCBzaG9ydCBkbGlua190eXBlKQorCQkJCQkJX19iZTE2IGRsaW5rX3R5cGUpCiB7CiAJc3RydWN0IGlweF9pbnRlcmZhY2UgKmludHJmYyA9IE5VTEw7CiAJc3RydWN0IGRhdGFsaW5rX3Byb3RvICpkYXRhbGluazsKQEAgLTExMjIsNyArMTEyMiw3IEBACiAJaWYgKGRldi0+YWRkcl9sZW4gPiBJUFhfTk9ERV9MRU4pCiAJCWdvdG8gb3V0OwogCi0Jc3dpdGNoIChodG9ucyhkbGlua190eXBlKSkgeworCXN3aXRjaCAobnRvaHMoZGxpbmtfdHlwZSkpIHsKIAljYXNlIEVUSF9QX0lQWDoJCWRhdGFsaW5rID0gcEVJSV9kYXRhbGluazsJYnJlYWs7CiAJY2FzZSBFVEhfUF84MDJfMjoJZGF0YWxpbmsgPSBwODAyMl9kYXRhbGluazsJYnJlYWs7CiAJY2FzZSBFVEhfUF9TTkFQOglkYXRhbGluayA9IHBTTkFQX2RhdGFsaW5rOwlicmVhazsKQEAgLTEyMzQsMjcgKzEyMzQsMjcgQEAKIC8qIE5vdGU6IFdlIGFzc3VtZSBpcHhfdGN0cmw9PTAgYW5kIGh0b25zKGxlbmd0aCk9PWlweF9wa3RzaXplICovCiAvKiBUaGlzIGZ1bmN0aW9ucyBzaG91bGQgKm5vdCogbWVzcyB3aXRoIHBhY2tldCBjb250ZW50cyAqLwogCi1fX3UxNiBpcHhfY2tzdW0oc3RydWN0IGlweGhkciAqcGFja2V0LCBpbnQgbGVuZ3RoKSAKK19fYmUxNiBpcHhfY2tzdW0oc3RydWN0IGlweGhkciAqcGFja2V0LCBpbnQgbGVuZ3RoKQogewogCS8qIAogCSAqCU5PVEU6IHN1bSBpcyBhIG5ldCBieXRlIG9yZGVyIHF1YW50aXR5LCB3aGljaCBvcHRpbWl6ZXMgdGhlIAogCSAqCWxvb3AuIFRoaXMgb25seSB3b3JrcyBvbiBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMuIChJCiAJICoJZG9uJ3Qga25vdyBvZiBhIG1hY2hpbmUgdGhhdCBpc24ndC4pCiAJICovCi0JLyogc3RhcnQgYXQgaXB4X2Rlc3QgLSBXZSBza2lwIHRoZSBjaGVja3N1bSBmaWVsZCBhbmQgc3RhcnQgd2l0aAotCSAqIGlweF90eXBlIGJlZm9yZSB0aGUgbG9vcCwgbm90IGNvbnNpZGVyaW5nIGlweF90Y3RybCBpbiB0aGUgY2FsYyAqLwotCV9fdTE2ICpwID0gKF9fdTE2ICopJnBhY2tldC0+aXB4X2Rlc3Q7Ci0JX191MzIgaSA9IChsZW5ndGggPj4gMSkgLSAxOyAvKiBOdW1iZXIgb2YgY29tcGxldGUgd29yZHMgKi8KLQlfX3UzMiBzdW0gPSBwYWNrZXQtPmlweF90eXBlIDw8IHNpemVvZihwYWNrZXQtPmlweF90Y3RybCk7IAorCS8qIGhhbmRsZSB0aGUgZmlyc3QgMyB3b3JkcyBzZXBhcmF0ZWx5OyBjaGVja3N1bSBzaG91bGQgYmUgc2tpcHBlZAorCSAqIGFuZCBpcHhfdGN0cmwgbWFza2VkIG91dCAqLworCV9fdTE2ICpwID0gKF9fdTE2ICopcGFja2V0OworCV9fdTMyIHN1bSA9IHBbMV0gKyAocFsyXSAmIChfX2ZvcmNlIHUxNilodG9ucygweDAwZmYpKTsKKwlfX3UzMiBpID0gKGxlbmd0aCA+PiAxKSAtIDM7IC8qIE51bWJlciBvZiByZW1haW5pbmcgY29tcGxldGUgd29yZHMgKi8KIAotCS8qIExvb3AgdGhyb3VnaCBhbGwgY29tcGxldGUgd29yZHMgZXhjZXB0IHRoZSBjaGVja3N1bSBmaWVsZCwKLQkgKiBpcHhfdHlwZSAoYWNjb3VudGVkIGFib3ZlKSBhbmQgaXB4X3RjdHJsIChub3QgdXNlZCBpbiB0aGUgY2tzdW0pICovCi0Jd2hpbGUgKC0taSkKKwkvKiBMb29wIHRocm91Z2ggdGhlbSAqLworCXAgKz0gMzsKKwl3aGlsZSAoaS0tKQogCQlzdW0gKz0gKnArKzsKIAogCS8qIEFkZCBvbiB0aGUgbGFzdCBwYXJ0IHdvcmQgaWYgaXQgZXhpc3RzICovCiAJaWYgKHBhY2tldC0+aXB4X3BrdHNpemUgJiBodG9ucygxKSkKLQkJc3VtICs9IG50b2hzKDB4ZmYwMCkgJiAqcDsKKwkJc3VtICs9IChfX2ZvcmNlIHUxNilodG9ucygweGZmMDApICYgKnA7CiAKIAkvKiBEbyBmaW5hbCBmaXh1cCAqLwogCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7CkBAIC0xMjYzLDEwICsxMjYzLDE3IEBACiAJaWYgKHN1bSA+PSAweDEwMDAwKQogCQlzdW0rKzsKIAotCXJldHVybiB+c3VtOworCS8qCisJICogTGVhdmUgMCBhbG9uZTsgd2UgZG9uJ3Qgd2FudCAweGZmZmYgaGVyZS4gIE5vdGUgdGhhdCB3ZSBjYW4ndCBnZXQKKwkgKiBoZXJlIHdpdGggMHgxMDAwMCwgc28gdGhpcyBjaGVjayBpcyB0aGUgc2FtZSBhcyAoKF9fdTE2KXN1bSkKKwkgKi8KKwlpZiAoc3VtKQorCQlzdW0gPSB+c3VtOworCisJcmV0dXJuIChfX2ZvcmNlIF9fYmUxNilzdW07CiB9CiAKLWNvbnN0IGNoYXIgKmlweF9mcmFtZV9uYW1lKHVuc2lnbmVkIHNob3J0IGZyYW1lKQorY29uc3QgY2hhciAqaXB4X2ZyYW1lX25hbWUoX19iZTE2IGZyYW1lKQogewogCWNoYXIqIHJjID0gIk5vbmUiOwogCkBAIC0xNDAxLDcgKzE0MDgsNyBAQAogCiAvKiBjYWxsZXIgbXVzdCBob2xkIGEgcmVmZXJlbmNlIHRvIGludHJmYyAqLwogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgaXB4X2ZpcnN0X2ZyZWVfc29ja2V0bnVtKHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMpCitzdGF0aWMgX19iZTE2IGlweF9maXJzdF9mcmVlX3NvY2tldG51bShzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjKQogewogCXVuc2lnbmVkIHNob3J0IHNvY2tldE51bSA9IGludHJmYy0+aWZfc2tudW07CiAKQEAgLTE0MTAsNyArMTQxNyw3IEBACiAJaWYgKHNvY2tldE51bSA8IElQWF9NSU5fRVBIRU1FUkFMX1NPQ0tFVCkKIAkJc29ja2V0TnVtID0gSVBYX01JTl9FUEhFTUVSQUxfU09DS0VUOwogCi0Jd2hpbGUgKF9faXB4aXRmX2ZpbmRfc29ja2V0KGludHJmYywgbnRvaHMoc29ja2V0TnVtKSkpCisJd2hpbGUgKF9faXB4aXRmX2ZpbmRfc29ja2V0KGludHJmYywgaHRvbnMoc29ja2V0TnVtKSkpCiAJCWlmIChzb2NrZXROdW0gPiBJUFhfTUFYX0VQSEVNRVJBTF9TT0NLRVQpCiAJCQlzb2NrZXROdW0gPSBJUFhfTUlOX0VQSEVNRVJBTF9TT0NLRVQ7CiAJCWVsc2UKQEAgLTE0MTksNyArMTQyNiw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJmludHJmYy0+aWZfc2tsaXN0X2xvY2spOwogCWludHJmYy0+aWZfc2tudW0gPSBzb2NrZXROdW07CiAKLQlyZXR1cm4gbnRvaHMoc29ja2V0TnVtKTsKKwlyZXR1cm4gaHRvbnMoc29ja2V0TnVtKTsKIH0KIAogc3RhdGljIGludCBpcHhfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pCkBAIC0xNDczLDcgKzE0ODAsNyBAQAogCQkJCQkJaXB4cy0+cG9ydCkpIHsKIAkJCVNPQ0tfREVCVUcoc2ssCiAJCQkJIklQWDogYmluZCBmYWlsZWQgYmVjYXVzZSBwb3J0ICVYIGluIHVzZS5cbiIsCi0JCQkJbnRvaHMoKGludClhZGRyLT5zaXB4X3BvcnQpKTsKKwkJCQludG9ocyhhZGRyLT5zaXB4X3BvcnQpKTsKIAkJCWdvdG8gb3V0X3B1dDsKIAkJfQogCX0gZWxzZSB7CkBAIC0xNDg4LDcgKzE0OTUsNyBAQAogCQlpZiAoaXB4aXRmX2ZpbmRfc29ja2V0KGludHJmYywgYWRkci0+c2lweF9wb3J0KSkgewogCQkJU09DS19ERUJVRyhzaywKIAkJCQkiSVBYOiBiaW5kIGZhaWxlZCBiZWNhdXNlIHBvcnQgJVggaW4gdXNlLlxuIiwKLQkJCQludG9ocygoaW50KWFkZHItPnNpcHhfcG9ydCkpOworCQkJCW50b2hzKGFkZHItPnNpcHhfcG9ydCkpOwogCQkJZ290byBvdXRfcHV0OwogCQl9CiAJfQpAQCAtMTY2NSw3ICsxNjcyLDcgQEAKIAlpbnRyZmMgPSBpcHhpdGZfZmluZF91c2luZ19waHlzKGRldiwgcHQtPnR5cGUpOwogCWlmICghaW50cmZjKSB7CiAJCWlmIChpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlcyAmJgotCQkgICBudG9obChJUFhfU0tCX0NCKHNrYiktPmlweF9kZXN0X25ldCkpIHsKKwkJICAgSVBYX1NLQl9DQihza2IpLT5pcHhfZGVzdF9uZXQpIHsKIAkJCWludHJmYyA9IGlweGl0Zl9hdXRvX2NyZWF0ZShkZXYsIHB0LT50eXBlKTsKIAkJCWlmIChpbnRyZmMpCiAJCQkJaXB4aXRmX2hvbGQoaW50cmZjKTsKZGlmZiAtLWdpdCBhL25ldC9pcHgvaXB4X3Byb2MuYyBiL25ldC9pcHgvaXB4X3Byb2MuYwppbmRleCA0YzBjNzEyLi5iNzQ2M2RmIDEwMDY0NAotLS0gYS9uZXQvaXB4L2lweF9wcm9jLmMKKysrIGIvbmV0L2lweC9pcHhfcHJvYy5jCkBAIC0yNjAsMjIgKzI2MCwyMiBAQAogCWlweHMgPSBpcHhfc2socyk7CiAjaWZkZWYgQ09ORklHX0lQWF9JTlRFUk4KIAlzZXFfcHJpbnRmKHNlcSwgIiUwOGxYOiUwMlglMDJYJTAyWCUwMlglMDJYJTAyWDolMDRYICAiLAotCQkgICAodW5zaWduZWQgbG9uZylodG9ubChpcHhzLT5pbnRyZmMtPmlmX25ldG51bSksCisJCSAgICh1bnNpZ25lZCBsb25nKW50b2hsKGlweHMtPmludHJmYy0+aWZfbmV0bnVtKSwKIAkJICAgaXB4cy0+bm9kZVswXSwgaXB4cy0+bm9kZVsxXSwgaXB4cy0+bm9kZVsyXSwgaXB4cy0+bm9kZVszXSwKLQkJICAgaXB4cy0+bm9kZVs0XSwgaXB4cy0+bm9kZVs1XSwgaHRvbnMoaXB4cy0+cG9ydCkpOworCQkgICBpcHhzLT5ub2RlWzRdLCBpcHhzLT5ub2RlWzVdLCBudG9ocyhpcHhzLT5wb3J0KSk7CiAjZWxzZQotCXNlcV9wcmludGYoc2VxLCAiJTA4bFg6JTA0WCAgIiwgKHVuc2lnbmVkIGxvbmcpIGh0b25sKGlweHMtPmludHJmYy0+aWZfbmV0bnVtKSwKLQkJICAgaHRvbnMoaXB4cy0+cG9ydCkpOworCXNlcV9wcmludGYoc2VxLCAiJTA4bFg6JTA0WCAgIiwgKHVuc2lnbmVkIGxvbmcpIG50b2hsKGlweHMtPmludHJmYy0+aWZfbmV0bnVtKSwKKwkJICAgbnRvaHMoaXB4cy0+cG9ydCkpOwogI2VuZGlmCS8qIENPTkZJR19JUFhfSU5URVJOICovCiAJaWYgKHMtPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKIAkJc2VxX3ByaW50ZihzZXEsICIlLTI4cyIsICJOb3RfQ29ubmVjdGVkIik7CiAJZWxzZSB7CiAJCXNlcV9wcmludGYoc2VxLCAiJTA4bFg6JTAyWCUwMlglMDJYJTAyWCUwMlglMDJYOiUwNFggICIsCi0JCQkgICAodW5zaWduZWQgbG9uZylodG9ubChpcHhzLT5kZXN0X2FkZHIubmV0KSwKKwkJCSAgICh1bnNpZ25lZCBsb25nKW50b2hsKGlweHMtPmRlc3RfYWRkci5uZXQpLAogCQkJICAgaXB4cy0+ZGVzdF9hZGRyLm5vZGVbMF0sIGlweHMtPmRlc3RfYWRkci5ub2RlWzFdLAogCQkJICAgaXB4cy0+ZGVzdF9hZGRyLm5vZGVbMl0sIGlweHMtPmRlc3RfYWRkci5ub2RlWzNdLAogCQkJICAgaXB4cy0+ZGVzdF9hZGRyLm5vZGVbNF0sIGlweHMtPmRlc3RfYWRkci5ub2RlWzVdLAotCQkJICAgaHRvbnMoaXB4cy0+ZGVzdF9hZGRyLnNvY2spKTsKKwkJCSAgIG50b2hzKGlweHMtPmRlc3RfYWRkci5zb2NrKSk7CiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICIlMDhYICAlMDhYICAlMDJYICAgICAlMDNkXG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lweC9pcHhfcm91dGUuYyBiL25ldC9pcHgvaXB4X3JvdXRlLmMKaW5kZXggYTMwZGJiMS4uNjg1NjBlZSAxMDA2NDQKLS0tIGEvbmV0L2lweC9pcHhfcm91dGUuYworKysgYi9uZXQvaXB4L2lweF9yb3V0ZS5jCkBAIC0xOSwxNyArMTksMTcgQEAKIAogZXh0ZXJuIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhfaW50ZXJuYWxfbmV0OwogCi1leHRlcm4gX191MTYgaXB4X2Nrc3VtKHN0cnVjdCBpcHhoZHIgKnBhY2tldCwgaW50IGxlbmd0aCk7Ci1leHRlcm4gc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9maW5kX3VzaW5nX25ldChfX3UzMiBuZXQpOworZXh0ZXJuIF9fYmUxNiBpcHhfY2tzdW0oc3RydWN0IGlweGhkciAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKK2V4dGVybiBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaXB4aXRmX2ZpbmRfdXNpbmdfbmV0KF9fYmUzMiBuZXQpOwogZXh0ZXJuIGludCBpcHhpdGZfZGVtdXhfc29ja2V0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNvcHkpOwogZXh0ZXJuIGludCBpcHhpdGZfZGVtdXhfc29ja2V0KHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNvcHkpOwogZXh0ZXJuIGludCBpcHhpdGZfc2VuZChzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICAgICAgY2hhciAqbm9kZSk7Ci1leHRlcm4gc3RydWN0IGlweF9pbnRlcmZhY2UgKmlweGl0Zl9maW5kX3VzaW5nX25ldChfX3UzMiBuZXQpOworZXh0ZXJuIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppcHhpdGZfZmluZF91c2luZ19uZXQoX19iZTMyIG5ldCk7CiAKLXN0cnVjdCBpcHhfcm91dGUgKmlweHJ0cl9sb29rdXAoX191MzIgbmV0KQorc3RydWN0IGlweF9yb3V0ZSAqaXB4cnRyX2xvb2t1cChfX2JlMzIgbmV0KQogewogCXN0cnVjdCBpcHhfcm91dGUgKnI7CiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIC8qCiAgKiBDYWxsZXIgbXVzdCBob2xkIGEgcmVmZXJlbmNlIHRvIGludHJmYwogICovCi1pbnQgaXB4cnRyX2FkZF9yb3V0ZShfX3UzMiBuZXR3b3JrLCBzdHJ1Y3QgaXB4X2ludGVyZmFjZSAqaW50cmZjLAoraW50IGlweHJ0cl9hZGRfcm91dGUoX19iZTMyIG5ldHdvcmssIHN0cnVjdCBpcHhfaW50ZXJmYWNlICppbnRyZmMsCiAJCSAgICAgdW5zaWduZWQgY2hhciAqbm9kZSkKIHsKIAlzdHJ1Y3QgaXB4X3JvdXRlICpydDsKQEAgLTExOCw3ICsxMTgsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBpcHhydHJfZGVsZXRlKF9fdTMyIG5ldCkKK3N0YXRpYyBpbnQgaXB4cnRyX2RlbGV0ZShfX2JlMzIgbmV0KQogewogCXN0cnVjdCBpcHhfcm91dGUgKnIsICp0bXA7CiAJaW50IHJjOwpAQCAtMjM4LDcgKzIzOCw3IEBACiAKIAkvKiBBcHBseSBjaGVja3N1bS4gTm90IGFsbG93ZWQgb24gODAyLjMgbGlua3MuICovCiAJaWYgKHNrLT5za19ub19jaGVjayB8fCBpbnRyZmMtPmlmX2RsaW5rX3R5cGUgPT0gaHRvbnMoSVBYX0ZSQU1FXzgwMjMpKQotCQlpcHgtPmlweF9jaGVja3N1bSA9IDB4RkZGRjsKKwkJaXB4LT5pcHhfY2hlY2tzdW0gPSBodG9ucygweEZGRkYpOwogCWVsc2UKIAkJaXB4LT5pcHhfY2hlY2tzdW0gPSBpcHhfY2tzdW0oaXB4LCBsZW4gKyBzaXplb2Yoc3RydWN0IGlweGhkcikpOwogCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9kaXNjb3ZlcnkuYyBiL25ldC9pcmRhL2Rpc2NvdmVyeS5jCmluZGV4IDNmZWZjODIuLjg5ZmQyYTIgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2Rpc2NvdmVyeS5jCisrKyBiL25ldC9pcmRhL2Rpc2NvdmVyeS5jCkBAIC0zMiw2ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eS5jIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHkuYwppbmRleCBkNTBhMDIwLi4yNjJiZGE4IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eS5jCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5LmMKQEAgLTYxLDcgKzYxLDcgQEAKIHN0YXRpYyB2b2lkIGlyY29tbV90dHlfc2VuZF94Y2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjaGFyIGNoKTsKIHN0YXRpYyB2b2lkIGlyY29tbV90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KTsKIHN0YXRpYyB2b2lkIGlyY29tbV90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgaXJjb21tX3R0eV9kb19zb2Z0aW50KHZvaWQgKnByaXZhdGVfKTsKK3N0YXRpYyB2b2lkIGlyY29tbV90dHlfZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgaXJjb21tX3R0eV9zaHV0ZG93bihzdHJ1Y3QgaXJjb21tX3R0eV9jYiAqc2VsZik7CiBzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAKQEAgLTM4OSw3ICszODksNyBAQAogCQlzZWxmLT5mbG93ID0gRkxPV19TVE9QOwogCiAJCXNlbGYtPmxpbmUgPSBsaW5lOwotCQlJTklUX1dPUksoJnNlbGYtPnRxdWV1ZSwgaXJjb21tX3R0eV9kb19zb2Z0aW50LCBzZWxmKTsKKwkJSU5JVF9XT1JLKCZzZWxmLT50cXVldWUsIGlyY29tbV90dHlfZG9fc29mdGludCk7CiAJCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IElSQ09NTV9UVFlfSERSX1VOSU5JVElBTElTRUQ7CiAJCXNlbGYtPm1heF9kYXRhX3NpemUgPSBJUkNPTU1fVFRZX0RBVEFfVU5JTklUSUFMSVNFRDsKIAkJc2VsZi0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOwpAQCAtNTk0LDE1ICs1OTQsMTYgQEAKIH0KIAogLyoKLSAqIEZ1bmN0aW9uIGlyY29tbV90dHlfZG9fc29mdGludCAocHJpdmF0ZV8pCisgKiBGdW5jdGlvbiBpcmNvbW1fdHR5X2RvX3NvZnRpbnQgKHdvcmspCiAgKgogICogICAgV2UgdXNlIHRoaXMgcm91dGluZSB0byBnaXZlIHRoZSB3cml0ZSB3YWtldXAgdG8gdGhlIHVzZXIgYXQgYXQgYQogICogICAgc2FmZSB0aW1lIChhcyBmYXN0IGFzIHBvc3NpYmxlIGFmdGVyIHdyaXRlIGhhdmUgY29tcGxldGVkKS4gVGhpcyAKICAqICAgIGNhbiBiZSBjb21wYXJlZCB0byB0aGUgVHggaW50ZXJydXB0LgogICovCi1zdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2RvX3NvZnRpbnQodm9pZCAqcHJpdmF0ZV8pCitzdGF0aWMgdm9pZCBpcmNvbW1fdHR5X2RvX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0gKHN0cnVjdCBpcmNvbW1fdHR5X2NiICopIHByaXZhdGVfOworCXN0cnVjdCBpcmNvbW1fdHR5X2NiICpzZWxmID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcmNvbW1fdHR5X2NiLCB0cXVldWUpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqY3RybF9za2I7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9pb2N0bC5jIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV90dHlfaW9jdGwuYwppbmRleCAxOTdlM2U3Li43NWUzOWVhIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3R0eV9pb2N0bC5jCisrKyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fdHR5X2lvY3RsLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogICogICAgZG8gc29tZXRoaW5nIHJhdGlvbmFsLgogICovCiB2b2lkIGlyY29tbV90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgCi0JCQkgICAgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQorCQkJICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IGlyY29tbV90dHlfY2IgKnNlbGYgPSAoc3RydWN0IGlyY29tbV90dHlfY2IgKikgdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBpbnQgY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmlhcC5jIGIvbmV0L2lyZGEvaXJpYXAuYwppbmRleCA0MTVjZjRlLi44ZjFjNmQ2IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmlhcC5jCisrKyBiL25ldC9pcmRhL2lyaWFwLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0xNzIsNyArMTczLDcgQEAKIAogCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlzZWxmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlyaWFwX2NiKSwgR0ZQX0FUT01JQyk7CisJc2VsZiA9IGt6YWxsb2Moc2l6ZW9mKCpzZWxmKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFzZWxmKSB7CiAJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xODEsNyArMTgyLDYgQEAKIAkvKgogCSAqICBJbml0aWFsaXplIGluc3RhbmNlCiAJICovCi0JbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpKTsKIAogCXNlbGYtPm1hZ2ljID0gSUFTX01BR0lDOwogCXNlbGYtPm1vZGUgPSBtb2RlOwpAQCAtNDUxLDEyICs0NTEsMTIgQEAKIAluID0gMjsKIAogCS8qIEdldCBsZW5ndGgsIE1TQiBmaXJzdCAqLwotCWxlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7IG4gKz0gMjsKKwlsZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMTYgKikoZnArbikpKTsgbiArPSAyOwogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CiAKIAkvKiBHZXQgb2JqZWN0IElELCBNU0IgZmlyc3QgKi8KLQlvYmpfaWQgPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOyBuICs9IDI7CisJb2JqX2lkID0gYmUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopKGZwK24pKSk7IG4gKz0gMjsKIAogCXR5cGUgPSBmcFtuKytdOwogCUlSREFfREVCVUcoNCwgIiVzKCksIFZhbHVlIHR5cGUgPSAlZFxuIiwgX19GVU5DVElPTl9fLCB0eXBlKTsKQEAgLTUwNiw3ICs1MDYsNyBAQAogCQl2YWx1ZSA9IGlyaWFzX25ld19zdHJpbmdfdmFsdWUoZnArbik7CiAJCWJyZWFrOwogCWNhc2UgSUFTX09DVF9TRVE6Ci0JCXZhbHVlX2xlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7CisJCXZhbHVlX2xlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiAqKShmcCtuKSkpOwogCQluICs9IDI7CiAKIAkJLyogV2lsbCB0cnVuY2F0ZSB0byBJQVNfTUFYX09DVEVUX1NUUklORyBieXRlcyAqLwpAQCAtNTQ0LDcgKzU0NCw3IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKIAlpbnQgbjsKLQlfX3UzMiB0bXBfYmUzMjsKKwlfX2JlMzIgdG1wX2JlMzI7CiAJX19iZTE2IHRtcF9iZTE2OwogCV9fdTggKmZwOwogCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmlhc19vYmplY3QuYyBiL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCmluZGV4IDU2MjkyYWIuLmIxZWU5OWEgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCisrKyBiL25ldC9pcmRhL2lyaWFzX29iamVjdC5jCkBAIC01MDEsMTMgKzUwMSwxMiBAQAogCQlsZW4gPSBJQVNfTUFYX09DVEVUX1NUUklORzsKIAl2YWx1ZS0+bGVuID0gbGVuOwogCi0JdmFsdWUtPnQub2N0X3NlcSA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwl2YWx1ZS0+dC5vY3Rfc2VxID0ga21lbWR1cChvY3RzZXEsIGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKHZhbHVlLT50Lm9jdF9zZXEgPT0gTlVMTCl7CiAJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJa2ZyZWUodmFsdWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbWVtY3B5KHZhbHVlLT50Lm9jdF9zZXEsIG9jdHNlcSAsIGxlbik7CiAJcmV0dXJuIHZhbHVlOwogfQogCkBAIC01MjIsNyArNTIxLDYgQEAKIAl9CiAKIAl2YWx1ZS0+dHlwZSA9IElBU19NSVNTSU5HOwotCXZhbHVlLT5sZW4gPSAwOwogCiAJcmV0dXJuIHZhbHVlOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwppbmRleCA5Yjk2MmYyLi4yYmIwNGFjIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYworKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwpAQCAtOTk1LDcgKzk5NSw3IEBACiB7CiAJX191OCAqZnJhbWU7CiAJX191OCBwYXJhbV9sZW47Ci0JX191MTYgdG1wX2xlOyAvKiBUZW1wb3JhcnkgdmFsdWUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KKwlfX2xlMTYgdG1wX2xlOyAvKiBUZW1wb3JhcnkgdmFsdWUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KIAlpbnQgbj0wOwogCQogCWlmIChza2IgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsbXAuYyBiL25ldC9pcmRhL2lybG1wLmMKaW5kZXggNTA3MzI2MS4uN2U1ZDEyYSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsbXAuYworKysgYi9uZXQvaXJkYS9pcmxtcC5jCkBAIC02NDEsMTUgKzY0MSwxMyBAQAogCX0KIAogCS8qIEFsbG9jYXRlIGEgbmV3IGluc3RhbmNlICovCi0JbmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxzYXBfY2IpLCBHRlBfQVRPTUlDKTsKKwluZXcgPSBrbWVtZHVwKG9yaWcsIHNpemVvZigqbmV3KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFuZXcpICB7CiAJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBrbWFsbG9jXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmxtcC0+dW5jb25uZWN0ZWRfbHNhcHMtPmhiX3NwaW5sb2NrLAogCQkJCSAgICAgICBmbGFncyk7CiAJCXJldHVybiBOVUxMOwogCX0KLQkvKiBEdXAgKi8KLQltZW1jcHkobmV3LCBvcmlnLCBzaXplb2Yoc3RydWN0IGxzYXBfY2IpKTsKIAkvKiBuZXctPmxhcCA9IG9yaWctPmxhcDsgPT4gZG9uZSBpbiB0aGUgbWVtY3B5KCkgKi8KIAkvKiBuZXctPnNsc2FwX3NlbCA9IG9yaWctPnNsc2FwX3NlbDsgPT4gZG9uZSBpbiB0aGUgbWVtY3B5KCkgKi8KIAluZXctPmNvbm5fc2tiID0gTlVMTDsKQEAgLTE2NzgsNyArMTY3Niw4IEBACiAJICogIGV2ZXJ5IElyTEFQIGNvbm5lY3Rpb24gYW5kIGNoZWNrIGV2ZXJ5IExTQVAgYXNzb2NpYXRlZCB3aXRoIGVhY2gKIAkgKiAgdGhlIGNvbm5lY3Rpb24uCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlybG1wLT5saW5rcy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZV9uZXN0ZWQoJmlybG1wLT5saW5rcy0+aGJfc3BpbmxvY2ssIGZsYWdzLAorCQkJU0lOR0xFX0RFUFRIX05FU1RJTkcpOwogCWxhcCA9IChzdHJ1Y3QgbGFwX2NiICopIGhhc2hiaW5fZ2V0X2ZpcnN0KGlybG1wLT5saW5rcyk7CiAJd2hpbGUgKGxhcCAhPSBOVUxMKSB7CiAJCUlSREFfQVNTRVJUKGxhcC0+bWFnaWMgPT0gTE1QX0xBUF9NQUdJQywgZ290byBlcnJsYXA7KTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lycXVldWUuYyBiL25ldC9pcmRhL2lycXVldWUuYwppbmRleCAxYmE4YzcxLi4xZDI2Y2QzIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcnF1ZXVlLmMKKysrIGIvbmV0L2lyZGEvaXJxdWV1ZS5jCkBAIC0zNTYsMTQgKzM1NiwxMyBAQAogCS8qCiAJICogQWxsb2NhdGUgbmV3IGhhc2hiaW4KIAkgKi8KLQloYXNoYmluID0ga21hbGxvYyggc2l6ZW9mKGhhc2hiaW5fdCksIEdGUF9BVE9NSUMpOworCWhhc2hiaW4gPSBremFsbG9jKHNpemVvZigqaGFzaGJpbiksIEdGUF9BVE9NSUMpOwogCWlmICghaGFzaGJpbikKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKgogCSAqIEluaXRpYWxpemUgc3RydWN0dXJlCiAJICovCi0JbWVtc2V0KGhhc2hiaW4sIDAsIHNpemVvZihoYXNoYmluX3QpKTsKIAloYXNoYmluLT5oYl90eXBlID0gdHlwZTsKIAloYXNoYmluLT5tYWdpYyA9IEhCX01BR0lDOwogCS8vaGFzaGJpbi0+aGJfY3VycmVudCA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcnR0cC5jIGIvbmV0L2lyZGEvaXJ0dHAuYwppbmRleCAzYzJlNzBiLi4wMzUwNGYzIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcnR0cC5jCisrKyBiL25ldC9pcmRhL2lydHRwLmMKQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CkBAIC0xMDk5LDcgKzExMDAsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYX0NPTlRST0wgYW5kIExBUCBoZWFkZXIgKi8KLQkJc2tiX3Jlc2VydmUodHhfc2tiLCBUVFBfTUFYX0hFQURFUik7CisJCXNrYl9yZXNlcnZlKHR4X3NrYiwgVFRQX01BWF9IRUFERVIgKyBUVFBfU0FSX0hFQURFUik7CiAJfSBlbHNlIHsKIAkJdHhfc2tiID0gdXNlcmRhdGE7CiAJCS8qCkBAIC0xMTQ3LDcgKzExNDgsNyBAQAogCQlmcmFtZVszXSA9IDB4MDI7IC8qIFZhbHVlIGxlbmd0aCAqLwogCiAJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMTYoKF9fdTE2KSBtYXhfc2R1X3NpemUpLAotCQkJICAgICAgKF9fdTE2ICopKGZyYW1lKzQpKTsKKwkJCSAgICAgIChfX2JlMTYgKikoZnJhbWUrNCkpOwogCX0gZWxzZSB7CiAJCS8qIEluc2VydCBwbGFpbiBUVFAgaGVhZGVyICovCiAJCWZyYW1lID0gc2tiX3B1c2godHhfc2tiLCBUVFBfSEVBREVSKTsKQEAgLTEzNDgsNyArMTM0OSw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCQkvKiBSZXNlcnZlIHNwYWNlIGZvciBNVVhfQ09OVFJPTCBhbmQgTEFQIGhlYWRlciAqLwotCQlza2JfcmVzZXJ2ZSh0eF9za2IsIFRUUF9NQVhfSEVBREVSKTsKKwkJc2tiX3Jlc2VydmUodHhfc2tiLCBUVFBfTUFYX0hFQURFUiArIFRUUF9TQVJfSEVBREVSKTsKIAl9IGVsc2UgewogCQl0eF9za2IgPSB1c2VyZGF0YTsKIAkJLyoKQEAgLTEzOTQsNyArMTM5NSw3IEBACiAJCWZyYW1lWzNdID0gMHgwMjsgLyogVmFsdWUgbGVuZ3RoICovCiAKIAkJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUxNigoX191MTYpIG1heF9zZHVfc2l6ZSksCi0JCQkgICAgICAoX191MTYgKikoZnJhbWUrNCkpOworCQkJICAgICAgKF9fYmUxNiAqKShmcmFtZSs0KSk7CiAJfSBlbHNlIHsKIAkJLyogSW5zZXJ0IFRUUCBoZWFkZXIgKi8KIAkJZnJhbWUgPSBza2JfcHVzaCh0eF9za2IsIFRUUF9IRUFERVIpOwpkaWZmIC0tZ2l0IGEvbmV0L2tleS9hZl9rZXkuYyBiL25ldC9rZXkvYWZfa2V5LmMKaW5kZXggMjBmZjdjYy4uNWRkNTA5NCAxMDA2NDQKLS0tIGEvbmV0L2tleS9hZl9rZXkuYworKysgYi9uZXQva2V5L2FmX2tleS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogCkBAIC0xNDIwLDYgKzE0MjEsOSBAQAogCWVsc2UKIAkJZXJyID0geGZybV9zdGF0ZV91cGRhdGUoeCk7CiAKKwl4ZnJtX2F1ZGl0X2xvZyhhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudC0+YXVkaXRfY29udGV4dCksIDAsCisJCSAgICAgICBBVURJVF9NQUNfSVBTRUNfQUREU0EsIGVyciA/IDAgOiAxLCBOVUxMLCB4KTsKKwogCWlmIChlcnIgPCAwKSB7CiAJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOwogCQlfX3hmcm1fc3RhdGVfcHV0KHgpOwpAQCAtMTQ2MCw4ICsxNDY0LDEyIEBACiAJCWVyciA9IC1FUEVSTTsKIAkJZ290byBvdXQ7CiAJfQotCQorCiAJZXJyID0geGZybV9zdGF0ZV9kZWxldGUoeCk7CisKKwl4ZnJtX2F1ZGl0X2xvZyhhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudC0+YXVkaXRfY29udGV4dCksIDAsCisJCSAgICAgICBBVURJVF9NQUNfSVBTRUNfREVMU0EsIGVyciA/IDAgOiAxLCBOVUxMLCB4KTsKKwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtMTYzNywxMiArMTY0NSwxNSBAQAogewogCXVuc2lnbmVkIHByb3RvOwogCXN0cnVjdCBrbV9ldmVudCBjOworCXN0cnVjdCB4ZnJtX2F1ZGl0IGF1ZGl0X2luZm87CiAKIAlwcm90byA9IHBma2V5X3NhdHlwZTJwcm90byhoZHItPnNhZGJfbXNnX3NhdHlwZSk7CiAJaWYgKHByb3RvID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JeGZybV9zdGF0ZV9mbHVzaChwcm90byk7CisJYXVkaXRfaW5mby5sb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50LT5hdWRpdF9jb250ZXh0KTsKKwlhdWRpdF9pbmZvLnNlY2lkID0gMDsKKwl4ZnJtX3N0YXRlX2ZsdXNoKHByb3RvLCAmYXVkaXRfaW5mbyk7CiAJYy5kYXRhLnByb3RvID0gcHJvdG87CiAJYy5zZXEgPSBoZHItPnNhZGJfbXNnX3NlcTsKIAljLnBpZCA9IGhkci0+c2FkYl9tc2dfcGlkOwpAQCAtMTc2NywxMSArMTc3OCwxMSBAQAogCiAJLyogYWRkcmVzc2VzIHByZXNlbnQgb25seSBpbiB0dW5uZWwgbW9kZSAqLwogCWlmICh0LT5tb2RlID09IFhGUk1fTU9ERV9UVU5ORUwpIHsKLQkJc3dpdGNoICh4cC0+ZmFtaWx5KSB7CisJCXN0cnVjdCBzb2NrYWRkciAqc2E7CisJCXNhID0gKHN0cnVjdCBzb2NrYWRkciAqKShycSsxKTsKKwkJc3dpdGNoKHNhLT5zYV9mYW1pbHkpIHsKIAkJY2FzZSBBRl9JTkVUOgotCQkJc2luID0gKHZvaWQqKShycSsxKTsKLQkJCWlmIChzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4qKXNhOwogCQkJdC0+c2FkZHIuYTQgPSBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKIAkJCXNpbisrOwogCQkJaWYgKHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQpAQCAtMTc4MCw5ICsxNzkxLDcgQEAKIAkJCWJyZWFrOwogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQogCQljYXNlIEFGX0lORVQ2OgotCQkJc2luNiA9ICh2b2lkICopKHJxKzEpOwotCQkJaWYgKHNpbjYtPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KilzYTsKIAkJCW1lbWNweSh0LT5zYWRkci5hNiwgJnNpbjYtPnNpbjZfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwogCQkJc2luNisrOwogCQkJaWYgKHNpbjYtPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KQpAQCAtMTc5Myw3ICsxODAyLDEwIEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCX0KKwkJdC0+ZW5jYXBfZmFtaWx5ID0gc2EtPnNhX2ZhbWlseTsKKwl9IGVsc2UKKwkJdC0+ZW5jYXBfZmFtaWx5ID0geHAtPmZhbWlseTsKKwogCS8qIE5vIHdheSB0byBzZXQgdGhpcyB2aWEga2FtZSBwZmtleSAqLwogCXQtPmFhbGdvcyA9IHQtPmVhbGdvcyA9IHQtPmNhbGdvcyA9IH4wOwogCXhwLT54ZnJtX25yKys7CkBAIC0xODMwLDE4ICsxODQyLDI1IEBACiAKIHN0YXRpYyBpbnQgcGZrZXlfeGZybV9wb2xpY3kybXNnX3NpemUoc3RydWN0IHhmcm1fcG9saWN5ICp4cCkKIHsKKwlzdHJ1Y3QgeGZybV90bXBsICp0OwogCWludCBzb2NrYWRkcl9zaXplID0gcGZrZXlfc29ja2FkZHJfc2l6ZSh4cC0+ZmFtaWx5KTsKLQlpbnQgc29ja2xlbiA9ICh4cC0+ZmFtaWx5ID09IEFGX0lORVQgPwotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgOgotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKKwlpbnQgc29ja2xlbiA9IDA7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTx4cC0+eGZybV9ucjsgaSsrKSB7CisJCXQgPSB4cC0+eGZybV92ZWMgKyBpOworCQlzb2NrbGVuICs9ICh0LT5lbmNhcF9mYW1pbHkgPT0gQUZfSU5FVCA/CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikgOgorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJfQogCiAJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpICsKIAkJKHNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSkgKiAzKSArCiAJCShzaXplb2Yoc3RydWN0IHNhZGJfYWRkcmVzcykgKiAyKSArIAogCQkoc29ja2FkZHJfc2l6ZSAqIDIpICsKIAkJc2l6ZW9mKHN0cnVjdCBzYWRiX3hfcG9saWN5KSArCi0JCSh4cC0+eGZybV9uciAqIChzaXplb2Yoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QpICsKLQkJCQkoc29ja2xlbiAqIDIpKSkgKworCQkoeHAtPnhmcm1fbnIgKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9pcHNlY3JlcXVlc3QpKSArCisJCShzb2NrbGVuICogMikgKwogCQlwZmtleV94ZnJtX3BvbGljeTJzZWNfY3R4X3NpemUoeHApOwogfQogCkBAIC0xOTk5LDcgKzIwMTgsOSBAQAogCiAJCXJlcV9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYWRiX3hfaXBzZWNyZXF1ZXN0KTsKIAkJaWYgKHQtPm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCkKLQkJCXJlcV9zaXplICs9IDIqc29ja2xlbjsKKwkJCXJlcV9zaXplICs9ICgodC0+ZW5jYXBfZmFtaWx5ID09IEFGX0lORVQgPworCQkgICAgICAgCQkgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pIDoKKwkJICAgICAgIAkJICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpICogMik7CiAJCWVsc2UKIAkJCXNpemUgLT0gMipzb2NrbGVuOwogCQlycSA9ICh2b2lkKilza2JfcHV0KHNrYiwgcmVxX3NpemUpOwpAQCAtMjAxNSw3ICsyMDM2LDcgQEAKIAkJCXJxLT5zYWRiX3hfaXBzZWNyZXF1ZXN0X2xldmVsID0gSVBTRUNfTEVWRUxfVVNFOwogCQlycS0+c2FkYl94X2lwc2VjcmVxdWVzdF9yZXFpZCA9IHQtPnJlcWlkOwogCQlpZiAodC0+bW9kZSA9PSBYRlJNX01PREVfVFVOTkVMKSB7Ci0JCQlzd2l0Y2ggKHhwLT5mYW1pbHkpIHsKKwkJCXN3aXRjaCAodC0+ZW5jYXBfZmFtaWx5KSB7CiAJCQljYXNlIEFGX0lORVQ6CiAJCQkJc2luID0gKHZvaWQqKShycSsxKTsKIAkJCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwpAQCAtMjE5NSw2ICsyMjE2LDkgQEAKIAllcnIgPSB4ZnJtX3BvbGljeV9pbnNlcnQocG9sLT5zYWRiX3hfcG9saWN5X2Rpci0xLCB4cCwKIAkJCQkgaGRyLT5zYWRiX21zZ190eXBlICE9IFNBREJfWF9TUERVUERBVEUpOwogCisJeGZybV9hdWRpdF9sb2coYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpLCAwLAorCQkgICAgICAgQVVESVRfTUFDX0lQU0VDX0FERFNQRCwgZXJyID8gMCA6IDEsIHhwLCBOVUxMKTsKKwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC0yMjcyLDYgKzIyOTYsMTAgQEAKIAl4cCA9IHhmcm1fcG9saWN5X2J5c2VsX2N0eChYRlJNX1BPTElDWV9UWVBFX01BSU4sIHBvbC0+c2FkYl94X3BvbGljeV9kaXItMSwKIAkJCQkgICAmc2VsLCB0bXAuc2VjdXJpdHksIDEpOwogCXNlY3VyaXR5X3hmcm1fcG9saWN5X2ZyZWUoJnRtcCk7CisKKwl4ZnJtX2F1ZGl0X2xvZyhhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudC0+YXVkaXRfY29udGV4dCksIDAsCisJCSAgICAgICBBVURJVF9NQUNfSVBTRUNfREVMU1BELCAoeHApID8gMSA6IDAsIHhwLCBOVUxMKTsKKwogCWlmICh4cCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMjQwNiw4ICsyNDM0LDExIEBACiBzdGF0aWMgaW50IHBma2V5X3NwZGZsdXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNhZGJfbXNnICpoZHIsIHZvaWQgKipleHRfaGRycykKIHsKIAlzdHJ1Y3Qga21fZXZlbnQgYzsKKwlzdHJ1Y3QgeGZybV9hdWRpdCBhdWRpdF9pbmZvOwogCi0JeGZybV9wb2xpY3lfZmx1c2goWEZSTV9QT0xJQ1lfVFlQRV9NQUlOKTsKKwlhdWRpdF9pbmZvLmxvZ2ludWlkID0gYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpOworCWF1ZGl0X2luZm8uc2VjaWQgPSAwOworCXhmcm1fcG9saWN5X2ZsdXNoKFhGUk1fUE9MSUNZX1RZUEVfTUFJTiwgJmF1ZGl0X2luZm8pOwogCWMuZGF0YS50eXBlID0gWEZSTV9QT0xJQ1lfVFlQRV9NQUlOOwogCWMuZXZlbnQgPSBYRlJNX01TR19GTFVTSFBPTElDWTsKIAljLnBpZCA9IGhkci0+c2FkYl9tc2dfcGlkOwpAQCAtMjkzOCw3ICsyOTY5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBwZmtleV9zZW5kX25ld19tYXBwaW5nKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCB4ZnJtX2FkZHJlc3NfdCAqaXBhZGRyLCB1MTYgc3BvcnQpCitzdGF0aWMgaW50IHBma2V5X3NlbmRfbmV3X21hcHBpbmcoc3RydWN0IHhmcm1fc3RhdGUgKngsIHhmcm1fYWRkcmVzc190ICppcGFkZHIsIF9fYmUxNiBzcG9ydCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBzYWRiX21zZyAqaGRyOwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9hZl9sbGMuYyBiL25ldC9sbGMvYWZfbGxjLmMKaW5kZXggMjY1MmVhZC4uMTkwYmIzZSAxMDA2NDQKLS0tIGEvbmV0L2xsYy9hZl9sbGMuYworKysgYi9uZXQvbGxjL2FmX2xsYy5jCkBAIC02NCw3ICs2NCw3IEBACiAgKgogICoJR2l2ZW4gYW4gQVJQIGhlYWRlciB0eXBlIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBldGhlcm5ldCBwcm90b2NvbC4KICAqLwotc3RhdGljIGlubGluZSB1MTYgbGxjX3Byb3RvX3R5cGUodTE2IGFycGhyZCkKK3N0YXRpYyBpbmxpbmUgX19iZTE2IGxsY19wcm90b190eXBlKHUxNiBhcnBocmQpCiB7CiAJcmV0dXJuIGFycGhyZCA9PSBBUlBIUkRfSUVFRTgwMl9UUiA/CiAJCSAgICAgICAgIGh0b25zKEVUSF9QX1RSXzgwMl8yKSA6IGh0b25zKEVUSF9QXzgwMl8yKTsKZGlmZiAtLWdpdCBhL25ldC9sbGMvbGxjX2lucHV0LmMgYi9uZXQvbGxjL2xsY19pbnB1dC5jCmluZGV4IDk0ZDIzNjguLmRiODJhZmYgMTAwNjQ0Ci0tLSBhL25ldC9sbGMvbGxjX2lucHV0LmMKKysrIGIvbmV0L2xsYy9sbGNfaW5wdXQuYwpAQCAtMTE1LDggKzExNSw4IEBACiAJc2tiLT5oLnJhdyArPSBsbGNfbGVuOwogCXNrYl9wdWxsKHNrYiwgbGxjX2xlbik7CiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyXzIpKSB7Ci0JCXUxNiBwZHVsZW4gPSBldGhfaGRyKHNrYiktPmhfcHJvdG8sCi0JCSAgICBkYXRhX3NpemUgPSBudG9ocyhwZHVsZW4pIC0gbGxjX2xlbjsKKwkJX19iZTE2IHBkdWxlbiA9IGV0aF9oZHIoc2tiKS0+aF9wcm90bzsKKwkJdTE2IGRhdGFfc2l6ZSA9IG50b2hzKHBkdWxlbikgLSBsbGNfbGVuOwogCiAJCWlmICh1bmxpa2VseShwc2tiX3RyaW1fcmNzdW0oc2tiLCBkYXRhX3NpemUpKSkKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IGNlOTQ3MzIuLjFiODUzYzMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBtZW51ICJDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uIgotCWRlcGVuZHMgb24gTkVUICYmIE5FVEZJTFRFUgorCWRlcGVuZHMgb24gTkVUICYmIElORVQgJiYgTkVURklMVEVSCiAKIGNvbmZpZyBORVRGSUxURVJfTkVUTElOSwogICAgICAgIHRyaXN0YXRlICJOZXRmaWx0ZXIgbmV0bGluayBpbnRlcmZhY2UiCkBAIC0yNSwxOSArMjUsNTcgQEAKIAkgIGFuZCBpcyBhbHNvIHNjaGVkdWxlZCB0byByZXBsYWNlIHRoZSBvbGQgc3lzbG9nLWJhc2VkIGlwdF9MT0cKIAkgIGFuZCBpcDZ0X0xPRyBtb2R1bGVzLgogCi1jb25maWcgTkZfQ09OTlRSQUNLCi0JdHJpc3RhdGUgIkxheWVyIDMgSW5kZXBlbmRlbnQgQ29ubmVjdGlvbiB0cmFja2luZyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUF9ORl9DT05OVFJBQ0s9bgotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KK2NvbmZpZyBORl9DT05OVFJBQ0tfRU5BQkxFRAorCXRyaXN0YXRlICJOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0IgorCWhlbHAKIAkgIENvbm5lY3Rpb24gdHJhY2tpbmcga2VlcHMgYSByZWNvcmQgb2Ygd2hhdCBwYWNrZXRzIGhhdmUgcGFzc2VkCiAJICB0aHJvdWdoIHlvdXIgbWFjaGluZSwgaW4gb3JkZXIgdG8gZmlndXJlIG91dCBob3cgdGhleSBhcmUgcmVsYXRlZAogCSAgaW50byBjb25uZWN0aW9ucy4KIAorCSAgVGhpcyBpcyByZXF1aXJlZCB0byBkbyBNYXNxdWVyYWRpbmcgb3Igb3RoZXIga2luZHMgb2YgTmV0d29yaworCSAgQWRkcmVzcyBUcmFuc2xhdGlvbiAoZXhjZXB0IGZvciBGYXN0IE5BVCkuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvCisJICBlbmhhbmNlIHBhY2tldCBmaWx0ZXJpbmcgKHNlZSBgQ29ubmVjdGlvbiBzdGF0ZSBtYXRjaCBzdXBwb3J0JworCSAgYmVsb3cpLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY2hvaWNlCisJcHJvbXB0ICJOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLX0VOQUJMRUQKKworY29uZmlnIE5GX0NPTk5UUkFDS19TVVBQT1JUCisJYm9vbCAiTGF5ZXIgMyBJbmRlcGVuZGVudCBDb25uZWN0aW9uIHRyYWNraW5nIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAogCSAgTGF5ZXIgMyBpbmRlcGVuZGVudCBjb25uZWN0aW9uIHRyYWNraW5nIGlzIGV4cGVyaW1lbnRhbCBzY2hlbWUKIAkgIHdoaWNoIGdlbmVyYWxpemUgaXBfY29ubnRyYWNrIHRvIHN1cHBvcnQgb3RoZXIgbGF5ZXIgMyBwcm90b2NvbHMuCiAKLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCSAgVGhpcyBpcyByZXF1aXJlZCB0byBkbyBNYXNxdWVyYWRpbmcgb3Igb3RoZXIga2luZHMgb2YgTmV0d29yaworCSAgQWRkcmVzcyBUcmFuc2xhdGlvbiAoZXhjZXB0IGZvciBGYXN0IE5BVCkuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvCisJICBlbmhhbmNlIHBhY2tldCBmaWx0ZXJpbmcgKHNlZSBgQ29ubmVjdGlvbiBzdGF0ZSBtYXRjaCBzdXBwb3J0JworCSAgYmVsb3cpLgorCitjb25maWcgSVBfTkZfQ09OTlRSQUNLX1NVUFBPUlQKKwlib29sICJMYXllciAzIERlcGVuZGVudCBDb25uZWN0aW9uIHRyYWNraW5nIChPQlNPTEVURSkiCisJaGVscAorCSAgVGhlIG9sZCwgTGF5ZXIgMyBkZXBlbmRlbnQgaXBfY29ubnRyYWNrIHN1YnN5c3RlbSBvZiBuZXRmaWx0ZXIuCisKKwkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gZG8gTWFzcXVlcmFkaW5nIG9yIG90aGVyIGtpbmRzIG9mIE5ldHdvcmsKKwkgIEFkZHJlc3MgVHJhbnNsYXRpb24gKGV4Y2VwdCBmb3IgRmFzdCBOQVQpLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0bworCSAgZW5oYW5jZSBwYWNrZXQgZmlsdGVyaW5nIChzZWUgYENvbm5lY3Rpb24gc3RhdGUgbWF0Y2ggc3VwcG9ydCcKKwkgIGJlbG93KS4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBORl9DT05OVFJBQ0sKKwl0cmlzdGF0ZQorCWRlZmF1bHQgbSBpZiBORl9DT05OVFJBQ0tfU1VQUE9SVCAmJiBORl9DT05OVFJBQ0tfRU5BQkxFRD1tCisJZGVmYXVsdCB5IGlmIE5GX0NPTk5UUkFDS19TVVBQT1JUICYmIE5GX0NPTk5UUkFDS19FTkFCTEVEPXkKKworY29uZmlnIElQX05GX0NPTk5UUkFDSworCXRyaXN0YXRlCisJZGVmYXVsdCBtIGlmIElQX05GX0NPTk5UUkFDS19TVVBQT1JUICYmIE5GX0NPTk5UUkFDS19FTkFCTEVEPW0KKwlkZWZhdWx0IHkgaWYgSVBfTkZfQ09OTlRSQUNLX1NVUFBPUlQgJiYgTkZfQ09OTlRSQUNLX0VOQUJMRUQ9eQogCiBjb25maWcgTkZfQ1RfQUNDVAogCWJvb2wgIkNvbm5lY3Rpb24gdHJhY2tpbmcgZmxvdyBhY2NvdW50aW5nIgpAQCAtODIsOCArMTIwLDEyIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IGBOJy4KIAorY29uZmlnIE5GX0NUX1BST1RPX0dSRQorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCisKIGNvbmZpZyBORl9DVF9QUk9UT19TQ1RQCi0JdHJpc3RhdGUgJ1NDVFAgcHJvdG9jb2wgb24gbmV3IGNvbm5lY3Rpb24gdHJhY2tpbmcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKScKKwl0cmlzdGF0ZSAnU0NUUCBwcm90b2NvbCBjb25uZWN0aW9uIHRyYWNraW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCknCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCiAJZGVmYXVsdCBuCiAJaGVscApAQCAtOTMsOCArMTM1LDIzIEBACiAJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCiAJICBEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgogCitjb25maWcgTkZfQ09OTlRSQUNLX0FNQU5EQQorCXRyaXN0YXRlICJBbWFuZGEgYmFja3VwIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCisJc2VsZWN0IFRFWFRTRUFSQ0gKKwlzZWxlY3QgVEVYVFNFQVJDSF9LTVAKKwloZWxwCisJICBJZiB5b3UgYXJlIHJ1bm5pbmcgdGhlIEFtYW5kYSBiYWNrdXAgcGFja2FnZSA8aHR0cDovL3d3dy5hbWFuZGEub3JnLz4KKwkgIG9uIHRoaXMgbWFjaGluZSBvciBtYWNoaW5lcyB0aGF0IHdpbGwgYmUgTUFTUVVFUkFERUQgdGhyb3VnaCB0aGlzCisJICBtYWNoaW5lLCB0aGVuIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBmZWF0dXJlLiAgVGhpcyBhbGxvd3MgdGhlCisJICBjb25uZWN0aW9uIHRyYWNraW5nIGFuZCBuYXR0aW5nIGNvZGUgdG8gYWxsb3cgdGhlIHN1Yi1jaGFubmVscyB0aGF0CisJICBBbWFuZGEgcmVxdWlyZXMgZm9yIGNvbW11bmljYXRpb24gb2YgdGhlIGJhY2t1cCBkYXRhLCBtZXNzYWdlcyBhbmQKKwkgIGluZGV4LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE5GX0NPTk5UUkFDS19GVFAKLQl0cmlzdGF0ZSAiRlRQIHN1cHBvcnQgb24gbmV3IGNvbm5lY3Rpb24gdHJhY2tpbmcgKEVYUEVSSU1FTlRBTCkiCisJdHJpc3RhdGUgIkZUUCBwcm90b2NvbCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSwogCWhlbHAKIAkgIFRyYWNraW5nIEZUUCBjb25uZWN0aW9ucyBpcyBwcm9ibGVtYXRpYzogc3BlY2lhbCBoZWxwZXJzIGFyZQpAQCAtMTA3LDYgKzE2NCwxMDEgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBORl9DT05OVFJBQ0tfSDMyMworCXRyaXN0YXRlICJILjMyMyBwcm90b2NvbCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIEguMzIzIGlzIGEgVm9JUCBzaWduYWxsaW5nIHByb3RvY29sIGZyb20gSVRVLVQuIEFzIG9uZSBvZiB0aGUgbW9zdAorCSAgaW1wb3J0YW50IFZvSVAgcHJvdG9jb2xzLCBpdCBpcyB3aWRlbHkgdXNlZCBieSB2b2ljZSBoYXJkd2FyZSBhbmQKKwkgIHNvZnR3YXJlIGluY2x1ZGluZyB2b2ljZSBnYXRld2F5cywgSVAgcGhvbmVzLCBOZXRtZWV0aW5nLCBPcGVuUGhvbmUsCisJICBHbm9tZW1lZXRpbmcsIGV0Yy4KKworCSAgV2l0aCB0aGlzIG1vZHVsZSB5b3UgY2FuIHN1cHBvcnQgSC4zMjMgb24gYSBjb25uZWN0aW9uIHRyYWNraW5nL05BVAorCSAgZmlyZXdhbGwuCisKKwkgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIFJBUywgRmFzdCBTdGFydCwgSC4yNDUgVHVubmVsbGluZywgQ2FsbAorCSAgRm9yd2FyZGluZywgUlRQL1JUQ1AgYW5kIFQuMTIwIGJhc2VkIGF1ZGlvLCB2aWRlbywgZmF4LCBjaGF0LAorCSAgd2hpdGVib2FyZCwgZmlsZSB0cmFuc2ZlciwgZXRjLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlCisJICB2aXNpdCBodHRwOi8vbmF0aDMyMy5zb3VyY2Vmb3JnZS5uZXQvLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5GX0NPTk5UUkFDS19JUkMKKwl0cmlzdGF0ZSAiSVJDIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCisJaGVscAorCSAgVGhlcmUgaXMgYSBjb21tb25seS11c2VkIGV4dGVuc2lvbiB0byBJUkMgY2FsbGVkCisJICBEaXJlY3QgQ2xpZW50LXRvLUNsaWVudCBQcm90b2NvbCAoRENDKS4gIFRoaXMgZW5hYmxlcyB1c2VycyB0byBzZW5kCisJICBmaWxlcyB0byBlYWNoIG90aGVyLCBhbmQgYWxzbyBjaGF0IHRvIGVhY2ggb3RoZXIgd2l0aG91dCB0aGUgbmVlZAorCSAgb2YgYSBzZXJ2ZXIuICBEQ0MgU2VuZGluZyBpcyB1c2VkIGFueXdoZXJlIHlvdSBzZW5kIGZpbGVzIG92ZXIgSVJDLAorCSAgYW5kIERDQyBDaGF0IGlzIG1vc3QgY29tbW9ubHkgdXNlZCBieSBFZ2dkcm9wIGJvdHMuICBJZiB5b3UgYXJlCisJICB1c2luZyBOQVQsIHRoaXMgZXh0ZW5zaW9uIHdpbGwgZW5hYmxlIHlvdSB0byBzZW5kIGZpbGVzIGFuZCBpbml0aWF0ZQorCSAgY2hhdHMuICBOb3RlIHRoYXQgeW91IGRvIE5PVCBuZWVkIHRoaXMgZXh0ZW5zaW9uIHRvIGdldCBmaWxlcyBvcgorCSAgaGF2ZSBvdGhlcnMgaW5pdGlhdGUgY2hhdHMsIG9yIGV2ZXJ5dGhpbmcgZWxzZSBpbiBJUkMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkZfQ09OTlRSQUNLX05FVEJJT1NfTlMKKwl0cmlzdGF0ZSAiTmV0QklPUyBuYW1lIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9DT05OVFJBQ0sKKwloZWxwCisJICBOZXRCSU9TIG5hbWUgc2VydmljZSByZXF1ZXN0cyBhcmUgc2VudCBhcyBicm9hZGNhc3QgbWVzc2FnZXMgZnJvbSBhbgorCSAgdW5wcml2aWxlZ2VkIHBvcnQgYW5kIHJlc3BvbmRlZCB0byB3aXRoIHVuaWNhc3QgbWVzc2FnZXMgdG8gdGhlCisJICBzYW1lIHBvcnQuIFRoaXMgbWFrZSB0aGVtIGhhcmQgdG8gZmlyZXdhbGwgcHJvcGVybHkgYmVjYXVzZSBjb25uZWN0aW9uCisJICB0cmFja2luZyBkb2Vzbid0IGRlYWwgd2l0aCBicm9hZGNhc3RzLiBUaGlzIGhlbHBlciB0cmFja3MgbG9jYWxseQorCSAgb3JpZ2luYXRpbmcgTmV0QklPUyBuYW1lIHNlcnZpY2UgcmVxdWVzdHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisJICByZXNwb25zZXMuIEl0IHJlbGllcyBvbiBjb3JyZWN0IElQIGFkZHJlc3MgY29uZmlndXJhdGlvbiwgc3BlY2lmaWNhbGx5CisJICBuZXRtYXNrIGFuZCBicm9hZGNhc3QgYWRkcmVzcy4gV2hlbiBwcm9wZXJseSBjb25maWd1cmVkLCB0aGUgb3V0cHV0CisJICBvZiAiaXAgYWRkcmVzcyBzaG93IiBzaG91bGQgbG9vayBzaW1pbGFyIHRvIHRoaXM6CisKKwkgICQgaXAgLTQgYWRkcmVzcyBzaG93IGV0aDAKKwkgIDQ6IGV0aDA6IDxCUk9BRENBU1QsTVVMVElDQVNULFVQPiBtdHUgMTUwMCBxZGlzYyBwZmlmb19mYXN0IHFsZW4gMTAwMAorCSAgICAgIGluZXQgMTcyLjE2LjIuMjUyLzI0IGJyZCAxNzIuMTYuMi4yNTUgc2NvcGUgZ2xvYmFsIGV0aDAKKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORl9DT05OVFJBQ0tfUFBUUAorCXRyaXN0YXRlICJQUHRQIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLCisJc2VsZWN0IE5GX0NUX1BST1RPX0dSRQorCWhlbHAKKwkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgUFBUUCAoUG9pbnQgdG8gUG9pbnQgVHVubmVsbGluZworCSAgUHJvdG9jb2wsIFJGQzI2MzcpIGNvbm5lY3Rpb24gdHJhY2tpbmcgYW5kIE5BVC4KKworCSAgSWYgeW91IGFyZSBydW5uaW5nIFBQVFAgc2Vzc2lvbnMgb3ZlciBhIHN0YXRlZnVsIGZpcmV3YWxsIG9yIE5BVAorCSAgYm94LCB5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZS4KKworCSAgUGxlYXNlIG5vdGUgdGhhdCBub3QgYWxsIFBQVFAgbW9kZXMgb2Ygb3BlcmF0aW9uIGFyZSBzdXBwb3J0ZWQgeWV0LgorCSAgU3BlY2lmaWNhbGx5IHRoZXNlIGxpbWl0YXRpb25zIGV4aXN0OgorCSAgICAtIEJsaW5keSBhc3N1bWVzIHRoYXQgY29udHJvbCBjb25uZWN0aW9ucyBhcmUgYWx3YXlzIGVzdGFibGlzaGVkCisJICAgICAgaW4gUE5TLT5QQUMgZGlyZWN0aW9uLiBUaGlzIGlzIGEgdmlvbGF0aW9uIG9mIFJGQzI2MzcuCisJICAgIC0gT25seSBzdXBwb3J0cyBhIHNpbmdsZSBjYWxsIHdpdGhpbiBlYWNoIHNlc3Npb24KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORl9DT05OVFJBQ0tfU0lQCisJdHJpc3RhdGUgIlNJUCBwcm90b2NvbCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIFNJUCBpcyBhbiBhcHBsaWNhdGlvbi1sYXllciBjb250cm9sIHByb3RvY29sIHRoYXQgY2FuIGVzdGFibGlzaCwKKwkgIG1vZGlmeSwgYW5kIHRlcm1pbmF0ZSBtdWx0aW1lZGlhIHNlc3Npb25zIChjb25mZXJlbmNlcykgc3VjaCBhcworCSAgSW50ZXJuZXQgdGVsZXBob255IGNhbGxzLiBXaXRoIHRoZSBpcF9jb25udHJhY2tfc2lwIGFuZAorCSAgdGhlIG5mX25hdF9zaXAgbW9kdWxlcyB5b3UgY2FuIHN1cHBvcnQgdGhlIHByb3RvY29sIG9uIGEgY29ubmVjdGlvbgorCSAgdHJhY2tpbmcvTkFUaW5nIGZpcmV3YWxsLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5GX0NPTk5UUkFDS19URlRQCisJdHJpc3RhdGUgIlRGVFAgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9DT05OVFJBQ0sKKwloZWxwCisJICBURlRQIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyLCB0aGlzIGlzIHJlcXVpcmVkIGRlcGVuZGluZworCSAgb24gaG93IHJlc3RyaWN0aXZlIHlvdXIgcnVsZXNldCBpcy4KKwkgIElmIHlvdSBhcmUgdXNpbmcgYSB0ZnRwIGNsaWVudCBiZWhpbmQgLWogU05BVCBvciAtaiBNQVNRVUVSQURJTkcKKwkgIHlvdSB3aWxsIG5lZWQgdGhpcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORl9DVF9ORVRMSU5LCiAJdHJpc3RhdGUgJ0Nvbm5lY3Rpb24gdHJhY2tpbmcgbmV0bGluayBpbnRlcmZhY2UgKEVYUEVSSU1FTlRBTCknCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkZfQ09OTlRSQUNLICYmIE5FVEZJTFRFUl9ORVRMSU5LCkBAIC0xODQsNiArMzM2LDE3IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRworCXRyaXN0YXRlICciTkZMT0ciIHRhcmdldCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBORkxPRyB0YXJnZXQsIHdoaWNoIGFsbG93cyB0byBMT0cKKwkgIG1lc3NhZ2VzIHRocm91Z2ggdGhlIG5ldGZpbHRlciBsb2dnaW5nIEFQSSwgd2hpY2ggY2FuIHVzZQorCSAgZWl0aGVyIHRoZSBvbGQgTE9HIHRhcmdldCwgdGhlIG9sZCBVTE9HIHRhcmdldCBvciBuZm5ldGxpbmtfbG9nCisJICBhcyBiYWNrZW5kLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSwogCXRyaXN0YXRlICAnIk5PVFJBQ0siIHRhcmdldCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKQEAgLTIwOSw3ICszNzIsOSBAQAogCiBjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9DT05OU0VDTUFSSwogCXRyaXN0YXRlICciQ09OTlNFQ01BUksiIHRhcmdldCBzdXBwb3J0JwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMgJiYgKE5GX0NPTk5UUkFDS19TRUNNQVJLIHx8IElQX05GX0NPTk5UUkFDS19TRUNNQVJLKQorCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMgJiYgXAorCQkgICAoKE5GX0NPTk5UUkFDSyAmJiBORl9DT05OVFJBQ0tfU0VDTUFSSykgfHwgXAorCQkgICAgKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DT05OVFJBQ0tfU0VDTUFSSykpCiAJaGVscAogCSAgVGhlIENPTk5TRUNNQVJLIHRhcmdldCBjb3BpZXMgc2VjdXJpdHkgbWFya2luZ3MgZnJvbSBwYWNrZXRzCiAJICB0byBjb25uZWN0aW9ucywgYW5kIHJlc3RvcmVzIHNlY3VyaXR5IG1hcmtpbmdzIGZyb20gY29ubmVjdGlvbnMKQEAgLTQ2Miw1ICs2MjcsMTkgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUCisJdHJpc3RhdGUgJyJoYXNobGltaXQiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgaGFzaGxpbWl0JyBtYXRjaC4KKworCSAgQXMgb3Bwb3NlZCB0byBgbGltaXQnLCB0aGlzIG1hdGNoIGR5bmFtaWNhbGx5IGNyZWF0ZXMgYSBoYXNoIHRhYmxlCisJICBvZiBsaW1pdCBidWNrZXRzLCBiYXNlZCBvbiB5b3VyIHNlbGVjdGlvbiBvZiBzb3VyY2UvZGVzdGluYXRpb24KKwkgIGFkZHJlc3NlcyBhbmQvb3IgcG9ydHMuCisKKwkgIEl0IGVuYWJsZXMgeW91IHRvIGV4cHJlc3MgcG9saWNpZXMgbGlrZSBgMTBrcHBzIGZvciBhbnkgZ2l2ZW4KKwkgIGRlc3RpbmF0aW9uIGFkZHJlc3MnIG9yIGA1MDBwcHMgZnJvbSBhbnkgZ2l2ZW4gc291cmNlIGFkZHJlc3MnCisJICB3aXRoIGEgc2luZ2xlIHJ1bGUuCisKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggYTc0YmU0OS4uNWRjNTU3NCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCkBAIC0xLDcgKzEsMTAgQEAKIG5ldGZpbHRlci1vYmpzIDo9IGNvcmUubyBuZl9sb2cubyBuZl9xdWV1ZS5vIG5mX3NvY2tvcHQubwotbmZfY29ubnRyYWNrLW9ianMJOj0gbmZfY29ubnRyYWNrX2NvcmUubyBuZl9jb25udHJhY2tfc3RhbmRhbG9uZS5vIG5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5vIG5mX2Nvbm50cmFja19wcm90b190Y3AubyBuZl9jb25udHJhY2tfcHJvdG9fdWRwLm8KKworbmZfY29ubnRyYWNrLXkJOj0gbmZfY29ubnRyYWNrX2NvcmUubyBuZl9jb25udHJhY2tfc3RhbmRhbG9uZS5vIG5mX2Nvbm50cmFja19leHBlY3QubyBuZl9jb25udHJhY2tfaGVscGVyLm8gbmZfY29ubnRyYWNrX3Byb3RvLm8gbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYy5vIG5mX2Nvbm50cmFja19wcm90b19nZW5lcmljLm8gbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5vIG5mX2Nvbm50cmFja19wcm90b191ZHAubworbmZfY29ubnRyYWNrLSQoQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMpICs9IG5mX2Nvbm50cmFja19lY2FjaGUubwogCiBvYmotJChDT05GSUdfTkVURklMVEVSKSA9IG5ldGZpbHRlci5vCitvYmotJChDT05GSUdfU1lTQ1RMKSArPSBuZl9zeXNjdGwubwogCiBvYmotJChDT05GSUdfTkVURklMVEVSX05FVExJTkspICs9IG5mbmV0bGluay5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUUpICs9IG5mbmV0bGlua19xdWV1ZS5vCkBAIC0xMSwxMyArMTQsMjMgQEAKIG9iai0kKENPTkZJR19ORl9DT05OVFJBQ0spICs9IG5mX2Nvbm50cmFjay5vCiAKICMgU0NUUCBwcm90b2NvbCBjb25uZWN0aW9uIHRyYWNraW5nCitvYmotJChDT05GSUdfTkZfQ1RfUFJPVE9fR1JFKSArPSBuZl9jb25udHJhY2tfcHJvdG9fZ3JlLm8KIG9iai0kKENPTkZJR19ORl9DVF9QUk9UT19TQ1RQKSArPSBuZl9jb25udHJhY2tfcHJvdG9fc2N0cC5vCiAKICMgbmV0bGluayBpbnRlcmZhY2UgZm9yIG5mX2Nvbm50cmFjawogb2JqLSQoQ09ORklHX05GX0NUX05FVExJTkspICs9IG5mX2Nvbm50cmFja19uZXRsaW5rLm8KIAogIyBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcnMKK25mX2Nvbm50cmFja19oMzIzLW9ianMgOj0gbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5vIG5mX2Nvbm50cmFja19oMzIzX2FzbjEubworCitvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX0FNQU5EQSkgKz0gbmZfY29ubnRyYWNrX2FtYW5kYS5vCiBvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX0ZUUCkgKz0gbmZfY29ubnRyYWNrX2Z0cC5vCitvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX0gzMjMpICs9IG5mX2Nvbm50cmFja19oMzIzLm8KK29iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfSVJDKSArPSBuZl9jb25udHJhY2tfaXJjLm8KK29iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfTkVUQklPU19OUykgKz0gbmZfY29ubnRyYWNrX25ldGJpb3NfbnMubworb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19QUFRQKSArPSBuZl9jb25udHJhY2tfcHB0cC5vCitvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX1NJUCkgKz0gbmZfY29ubnRyYWNrX3NpcC5vCitvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFApICs9IG5mX2Nvbm50cmFja190ZnRwLm8KIAogIyBnZW5lcmljIFggdGFibGVzIAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTKSArPSB4X3RhYmxlcy5vIHh0X3RjcHVkcC5vCkBAIC0yOCw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9EU0NQKSArPSB4dF9EU0NQLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUkspICs9IHh0X01BUksubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRSkgKz0geHRfTkZRVUVVRS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRykgKz0geHRfTkZMT0cubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSykgKz0geHRfTk9UUkFDSy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9TRUNNQVJLKSArPSB4dF9TRUNNQVJLLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5TRUNNQVJLKSArPSB4dF9DT05OU0VDTUFSSy5vCkBAIC01NiwzICs3MCw0IEBACiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORykgKz0geHRfc3RyaW5nLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTKSArPSB4dF90Y3Btc3Mubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QSFlTREVWKSArPSB4dF9waHlzZGV2Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUKSArPSB4dF9oYXNobGltaXQubwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2NvcmUuYwppbmRleCBkODBiOTM1Li4yOTFiOGM2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2NvcmUuYwpAQCAtMjgsNyArMjgsNyBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFmaW5mb19sb2NrKTsKIAotc3RydWN0IG5mX2FmaW5mbyAqbmZfYWZpbmZvW05QUk9UT107CitzdHJ1Y3QgbmZfYWZpbmZvICpuZl9hZmluZm9bTlBST1RPXSBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTChuZl9hZmluZm8pOwogCiBpbnQgbmZfcmVnaXN0ZXJfYWZpbmZvKHN0cnVjdCBuZl9hZmluZm8gKmFmaW5mbykKQEAgLTU0LDcgKzU0LDcgQEAKICAqIG9mIHNrYnVmZnMgcXVldWVkIGZvciB1c2Vyc3BhY2UsIGFuZCBub3QgZGVyZWdpc3RlciBhIGhvb2sgdW5sZXNzCiAgKiB0aGlzIGlzIHplcm8sIGJ1dCB0aGF0IHN1Y2tzLiAgTm93LCB3ZSBzaW1wbHkgY2hlY2sgd2hlbiB0aGUKICAqIHBhY2tldHMgY29tZSBiYWNrOiBpZiB0aGUgaG9vayBpcyBnb25lLCB0aGUgcGFja2V0IGlzIGRpc2NhcmRlZC4gKi8KLXN0cnVjdCBsaXN0X2hlYWQgbmZfaG9va3NbTlBST1RPXVtORl9NQVhfSE9PS1NdOworc3RydWN0IGxpc3RfaGVhZCBuZl9ob29rc1tOUFJPVE9dW05GX01BWF9IT09LU10gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wobmZfaG9va3MpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhuZl9ob29rX2xvY2spOwogCkBAIC0yMjIsMjggKzIyMiwyMSBAQAogfQogRVhQT1JUX1NZTUJPTChza2JfbWFrZV93cml0YWJsZSk7CiAKLXVfaW50MTZfdCBuZl9jc3VtX3VwZGF0ZSh1X2ludDMyX3Qgb2xkdmFsLCB1X2ludDMyX3QgbmV3dmFsLCB1X2ludDMyX3QgY3N1bSkKK3ZvaWQgbmZfcHJvdG9fY3N1bV9yZXBsYWNlNChfX3N1bTE2ICpzdW0sIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgX19iZTMyIGZyb20sIF9fYmUzMiB0bywgaW50IHBzZXVkb2hkcikKIHsKLQl1X2ludDMyX3QgZGlmZltdID0geyBvbGR2YWwsIG5ld3ZhbCB9OwotCi0JcmV0dXJuIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoKGNoYXIgKilkaWZmLCBzaXplb2YoZGlmZiksIH5jc3VtKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKG5mX2NzdW1fdXBkYXRlKTsKLQotdV9pbnQxNl90IG5mX3Byb3RvX2NzdW1fdXBkYXRlKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgdV9pbnQzMl90IG9sZHZhbCwgdV9pbnQzMl90IG5ld3ZhbCwKLQkJCSAgICAgICB1X2ludDE2X3QgY3N1bSwgaW50IHBzZXVkb2hkcikKLXsKKwlfX2JlMzIgZGlmZltdID0geyB+ZnJvbSwgdG8gfTsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQljc3VtID0gbmZfY3N1bV91cGRhdGUob2xkdmFsLCBuZXd2YWwsIGNzdW0pOworCQkqc3VtID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbCgoY2hhciAqKWRpZmYsIHNpemVvZihkaWZmKSwKKwkJCQl+Y3N1bV91bmZvbGQoKnN1bSkpKTsKIAkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFICYmIHBzZXVkb2hkcikKLQkJCXNrYi0+Y3N1bSA9IG5mX2NzdW1fdXBkYXRlKG9sZHZhbCwgbmV3dmFsLCBza2ItPmNzdW0pOworCQkJc2tiLT5jc3VtID0gfmNzdW1fcGFydGlhbCgoY2hhciAqKWRpZmYsIHNpemVvZihkaWZmKSwKKwkJCQkJCX5za2ItPmNzdW0pOwogCX0gZWxzZSBpZiAocHNldWRvaGRyKQotCQljc3VtID0gfm5mX2NzdW1fdXBkYXRlKG9sZHZhbCwgbmV3dmFsLCB+Y3N1bSk7Ci0KLQlyZXR1cm4gY3N1bTsKKwkJKnN1bSA9IH5jc3VtX2ZvbGQoY3N1bV9wYXJ0aWFsKChjaGFyICopZGlmZiwgc2l6ZW9mKGRpZmYpLAorCQkJCWNzdW1fdW5mb2xkKCpzdW0pKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKG5mX3Byb3RvX2NzdW1fdXBkYXRlKTsKK0VYUE9SVF9TWU1CT0wobmZfcHJvdG9fY3N1bV9yZXBsYWNlNCk7CiAKIC8qIFRoaXMgZG9lcyBub3QgYmVsb25nIGhlcmUsIGJ1dCBsb2NhbGx5IGdlbmVyYXRlZCBlcnJvcnMgbmVlZCBpdCBpZiBjb25uZWN0aW9uCiAgICB0cmFja2luZyBpbiB1c2U6IHdpdGhvdXQgdGhpcywgY29ubmVjdGlvbiBtYXkgbm90IGJlIGluIGhhc2ggdGFibGUsIGFuZCBoZW5jZQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYW1hbmRhLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hbWFuZGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg2OWVhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYW1hbmRhLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qIEFtYW5kYSBleHRlbnNpb24gZm9yIElQIGNvbm5lY3Rpb24gdHJhY2tpbmcKKyAqCisgKiAoQykgMjAwMiBieSBCcmlhbiBKLiBNdXJyZWxsIDxuZXRmaWx0ZXJAaW50ZXJsaW54LmJjLmNhPgorICogYmFzZWQgb24gSFcncyBpcF9jb25udHJhY2tfaXJjLmMgYXMgd2VsbCBhcyBvdGhlciBtb2R1bGVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGV4dHNlYXJjaC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfYW1hbmRhLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWFzdGVyX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDMwMDsKK3N0YXRpYyBjaGFyICp0c19hbGdvID0gImttcCI7CisKK01PRFVMRV9BVVRIT1IoIkJyaWFuIEouIE11cnJlbGwgPG5ldGZpbHRlckBpbnRlcmxpbnguYmMuY2E+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFtYW5kYSBjb25uZWN0aW9uIHRyYWNraW5nIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcF9jb25udHJhY2tfYW1hbmRhIik7CisKK21vZHVsZV9wYXJhbShtYXN0ZXJfdGltZW91dCwgdWludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hc3Rlcl90aW1lb3V0LCAidGltZW91dCBmb3IgdGhlIG1hc3RlciBjb25uZWN0aW9uIik7Cittb2R1bGVfcGFyYW0odHNfYWxnbywgY2hhcnAsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyh0c19hbGdvLCAidGV4dHNlYXJjaCBhbGdvcml0aG0gdG8gdXNlIChkZWZhdWx0IGttcCkiKTsKKwordW5zaWduZWQgaW50ICgqbmZfbmF0X2FtYW5kYV9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAorCQkJCSAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJCQkgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQorCQkJCSAgIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfYW1hbmRhX2hvb2spOworCitlbnVtIGFtYW5kYV9zdHJpbmdzIHsKKwlTRUFSQ0hfQ09OTkVDVCwKKwlTRUFSQ0hfTkVXTElORSwKKwlTRUFSQ0hfREFUQSwKKwlTRUFSQ0hfTUVTRywKKwlTRUFSQ0hfSU5ERVgsCit9OworCitzdGF0aWMgc3RydWN0IHsKKwljaGFyCQkJKnN0cmluZzsKKwlzaXplX3QJCQlsZW47CisJc3RydWN0IHRzX2NvbmZpZwkqdHM7Cit9IHNlYXJjaFtdIF9fcmVhZF9tb3N0bHkgPSB7CisJW1NFQVJDSF9DT05ORUNUXSA9IHsKKwkJLnN0cmluZwk9ICJDT05ORUNUICIsCisJCS5sZW4JPSA4LAorCX0sCisJW1NFQVJDSF9ORVdMSU5FXSA9IHsKKwkJLnN0cmluZwk9ICJcbiIsCisJCS5sZW4JPSAxLAorCX0sCisJW1NFQVJDSF9EQVRBXSA9IHsKKwkJLnN0cmluZwk9ICJEQVRBICIsCisJCS5sZW4JPSA1LAorCX0sCisJW1NFQVJDSF9NRVNHXSA9IHsKKwkJLnN0cmluZwk9ICJNRVNHICIsCisJCS5sZW4JPSA1LAorCX0sCisJW1NFQVJDSF9JTkRFWF0gPSB7CisJCS5zdHJpbmcgPSAiSU5ERVggIiwKKwkJLmxlbgk9IDYsCisJfSwKK307CisKK3N0YXRpYyBpbnQgYW1hbmRhX2hlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSAgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlzdHJ1Y3QgdHNfc3RhdGUgdHM7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZTsKKwl1bnNpZ25lZCBpbnQgZGF0YW9mZiwgc3RhcnQsIHN0b3AsIG9mZiwgaTsKKwljaGFyIHBidWZbc2l6ZW9mKCI2NTUzNSIpXSwgKnRtcDsKKwl1X2ludDE2X3QgbGVuOworCV9fYmUxNiBwb3J0OworCWludCBmYW1pbHkgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtOworCWludCByZXQgPSBORl9BQ0NFUFQ7CisJdHlwZW9mKG5mX25hdF9hbWFuZGFfaG9vaykgbmZfbmF0X2FtYW5kYTsKKworCS8qIE9ubHkgbG9vayBhdCBwYWNrZXRzIGZyb20gdGhlIEFtYW5kYSBzZXJ2ZXIgKi8KKwlpZiAoQ1RJTkZPMkRJUihjdGluZm8pID09IElQX0NUX0RJUl9PUklHSU5BTCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qIGluY3JlYXNlIHRoZSBVRFAgdGltZW91dCBvZiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gYXMgcmVwbGllcyBmcm9tCisJICogQW1hbmRhIGNsaWVudHMgdG8gdGhlIHNlcnZlciBjYW4gYmUgcXVpdGUgZGVsYXllZCAqLworCW5mX2N0X3JlZnJlc2goY3QsICpwc2tiLCBtYXN0ZXJfdGltZW91dCAqIEhaKTsKKworCS8qIE5vIGRhdGE/ICovCisJZGF0YW9mZiA9IHByb3RvZmYgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJaWYgKGRhdGFvZmYgPj0gKCpwc2tiKS0+bGVuKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoImFtYW5kYV9oZWxwOiBza2JsZW4gPSAldVxuIiwgKCpwc2tiKS0+bGVuKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKKwlzdGFydCA9IHNrYl9maW5kX3RleHQoKnBza2IsIGRhdGFvZmYsICgqcHNrYiktPmxlbiwKKwkJCSAgICAgIHNlYXJjaFtTRUFSQ0hfQ09OTkVDVF0udHMsICZ0cyk7CisJaWYgKHN0YXJ0ID09IFVJTlRfTUFYKQorCQlnb3RvIG91dDsKKwlzdGFydCArPSBkYXRhb2ZmICsgc2VhcmNoW1NFQVJDSF9DT05ORUNUXS5sZW47CisKKwltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKKwlzdG9wID0gc2tiX2ZpbmRfdGV4dCgqcHNrYiwgc3RhcnQsICgqcHNrYiktPmxlbiwKKwkJCSAgICAgc2VhcmNoW1NFQVJDSF9ORVdMSU5FXS50cywgJnRzKTsKKwlpZiAoc3RvcCA9PSBVSU5UX01BWCkKKwkJZ290byBvdXQ7CisJc3RvcCArPSBzdGFydDsKKworCWZvciAoaSA9IFNFQVJDSF9EQVRBOyBpIDw9IFNFQVJDSF9JTkRFWDsgaSsrKSB7CisJCW1lbXNldCgmdHMsIDAsIHNpemVvZih0cykpOworCQlvZmYgPSBza2JfZmluZF90ZXh0KCpwc2tiLCBzdGFydCwgc3RvcCwgc2VhcmNoW2ldLnRzLCAmdHMpOworCQlpZiAob2ZmID09IFVJTlRfTUFYKQorCQkJY29udGludWU7CisJCW9mZiArPSBzdGFydCArIHNlYXJjaFtpXS5sZW47CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplb2YocGJ1ZikgLSAxLCBzdG9wIC0gb2ZmKTsKKwkJaWYgKHNrYl9jb3B5X2JpdHMoKnBza2IsIG9mZiwgcGJ1ZiwgbGVuKSkKKwkJCWJyZWFrOworCQlwYnVmW2xlbl0gPSAnXDAnOworCisJCXBvcnQgPSBodG9ucyhzaW1wbGVfc3RydG91bChwYnVmLCAmdG1wLCAxMCkpOworCQlsZW4gPSB0bXAgLSBwYnVmOworCQlpZiAocG9ydCA9PSAwIHx8IGxlbiA+IDUpCisJCQlicmVhazsKKworCQlleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKKwkJaWYgKGV4cCA9PSBOVUxMKSB7CisJCQlyZXQgPSBORl9EUk9QOworCQkJZ290byBvdXQ7CisJCX0KKwkJdHVwbGUgPSAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlOworCQluZl9jb25udHJhY2tfZXhwZWN0X2luaXQoZXhwLCBmYW1pbHksCisJCQkJCSAmdHVwbGUtPnNyYy51MywgJnR1cGxlLT5kc3QudTMsCisJCQkJCSBJUFBST1RPX1RDUCwgTlVMTCwgJnBvcnQpOworCisJCW5mX25hdF9hbWFuZGEgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X2FtYW5kYV9ob29rKTsKKwkJaWYgKG5mX25hdF9hbWFuZGEgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKKwkJCXJldCA9IG5mX25hdF9hbWFuZGEocHNrYiwgY3RpbmZvLCBvZmYgLSBkYXRhb2ZmLAorCQkJCQkgICAgbGVuLCBleHApOworCQllbHNlIGlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQorCQkJcmV0ID0gTkZfRFJPUDsKKwkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgYW1hbmRhX2hlbHBlclsyXSBfX3JlYWRfbW9zdGx5ID0geworCXsKKwkJLm5hbWUJCQk9ICJhbWFuZGEiLAorCQkubWF4X2V4cGVjdGVkCQk9IDMsCisJCS50aW1lb3V0CQk9IDE4MCwKKwkJLm1lCQkJPSBUSElTX01PRFVMRSwKKwkJLmhlbHAJCQk9IGFtYW5kYV9oZWxwLAorCQkudHVwbGUuc3JjLmwzbnVtCT0gQUZfSU5FVCwKKwkJLnR1cGxlLnNyYy51LnVkcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygxMDA4MCksCisJCS50dXBsZS5kc3QucHJvdG9udW0JPSBJUFBST1RPX1VEUCwKKwkJLm1hc2suc3JjLmwzbnVtCQk9IDB4RkZGRiwKKwkJLm1hc2suc3JjLnUudWRwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKDB4RkZGRiksCisJCS5tYXNrLmRzdC5wcm90b251bQk9IDB4RkYsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiYW1hbmRhIiwKKwkJLm1heF9leHBlY3RlZAkJPSAzLAorCQkudGltZW91dAkJPSAxODAsCisJCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJCS5oZWxwCQkJPSBhbWFuZGFfaGVscCwKKwkJLnR1cGxlLnNyYy5sM251bQk9IEFGX0lORVQ2LAorCQkudHVwbGUuc3JjLnUudWRwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKDEwMDgwKSwKKwkJLnR1cGxlLmRzdC5wcm90b251bQk9IElQUFJPVE9fVURQLAorCQkubWFzay5zcmMubDNudW0JCT0gMHhGRkZGLAorCQkubWFzay5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoMHhGRkZGKSwKKwkJLm1hc2suZHN0LnByb3RvbnVtCT0gMHhGRiwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgX19leGl0IG5mX2Nvbm50cmFja19hbWFuZGFfZmluaSh2b2lkKQoreworCWludCBpOworCisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZhbWFuZGFfaGVscGVyWzBdKTsKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmFtYW5kYV9oZWxwZXJbMV0pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlYXJjaCk7IGkrKykKKwkJdGV4dHNlYXJjaF9kZXN0cm95KHNlYXJjaFtpXS50cyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5mX2Nvbm50cmFja19hbWFuZGFfaW5pdCh2b2lkKQoreworCWludCByZXQsIGk7CisKKwlyZXQgPSAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlYXJjaCk7IGkrKykgeworCQlzZWFyY2hbaV0udHMgPSB0ZXh0c2VhcmNoX3ByZXBhcmUodHNfYWxnbywgc2VhcmNoW2ldLnN0cmluZywKKwkJCQkJCSAgc2VhcmNoW2ldLmxlbiwKKwkJCQkJCSAgR0ZQX0tFUk5FTCwgVFNfQVVUT0xPQUQpOworCQlpZiAoc2VhcmNoW2ldLnRzID09IE5VTEwpCisJCQlnb3RvIGVycjE7CisJfQorCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmFtYW5kYV9oZWxwZXJbMF0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisJcmV0ID0gbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmYW1hbmRhX2hlbHBlclsxXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMjsKKwlyZXR1cm4gMDsKKworZXJyMjoKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmFtYW5kYV9oZWxwZXJbMF0pOworZXJyMToKKwlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHNlYXJjaFtpXS50cykKKwkJCXRleHRzZWFyY2hfZGVzdHJveShzZWFyY2hbaV0udHMpOworCX0KKwlyZXR1cm4gcmV0OworfQorCittb2R1bGVfaW5pdChuZl9jb25udHJhY2tfYW1hbmRhX2luaXQpOworbW9kdWxlX2V4aXQobmZfY29ubnRyYWNrX2FtYW5kYV9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwppbmRleCAwOTNiM2RkLi45YjAyZWM0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCkBAIC00NiwxNSArNDYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KLQotLyogVGhpcyByd2xvY2sgcHJvdGVjdHMgdGhlIG1haW4gaGFzaCB0YWJsZSwgcHJvdG9jb2wvaGVscGVyL2V4cGVjdGVkCi0gICByZWdpc3RyYXRpb25zLCBjb25udHJhY2sgdGltZXJzKi8KLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KQotI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KQorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CiAKQEAgLTY3LDkyICs2NCwzMiBAQAogI2VuZGlmCiAKIERFRklORV9SV0xPQ0sobmZfY29ubnRyYWNrX2xvY2spOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2xvY2spOwogCiAvKiBuZl9jb25udHJhY2tfc3RhbmRhbG9uZSBuZWVkcyB0aGlzICovCiBhdG9taWNfdCBuZl9jb25udHJhY2tfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19jb3VudCk7CiAKLXZvaWQgKCpuZl9jb25udHJhY2tfZGVzdHJveWVkKShzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrKSA9IE5VTEw7Ci1MSVNUX0hFQUQobmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKLXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKipuZl9jdF9wcm90b3NbUEZfTUFYXSBfX3JlYWRfbW9zdGx5Owotc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpuZl9jdF9sM3Byb3Rvc1tQRl9NQVhdIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgTElTVF9IRUFEKGhlbHBlcnMpOwotdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSBfX3JlYWRfbW9zdGx5ID0gMDsKK3ZvaWQgKCpuZl9jb25udHJhY2tfZGVzdHJveWVkKShzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19kZXN0cm95ZWQpOworCit1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaHRhYmxlX3NpemUpOworCiBpbnQgbmZfY29ubnRyYWNrX21heCBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX21heCk7CisKIHN0cnVjdCBsaXN0X2hlYWQgKm5mX2Nvbm50cmFja19oYXNoIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMga21lbV9jYWNoZV90ICpuZl9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCBfX3JlYWRfbW9zdGx5Owotc3RydWN0IG5mX2Nvbm4gbmZfY29ubnRyYWNrX3VudHJhY2tlZDsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19oYXNoKTsKKworc3RydWN0IG5mX2Nvbm4gbmZfY29ubnRyYWNrX3VudHJhY2tlZCBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3VudHJhY2tlZCk7CisKIHVuc2lnbmVkIGludCBuZl9jdF9sb2dfaW52YWxpZCBfX3JlYWRfbW9zdGx5Owotc3RhdGljIExJU1RfSEVBRCh1bmNvbmZpcm1lZCk7CitMSVNUX0hFQUQodW5jb25maXJtZWQpOwogc3RhdGljIGludCBuZl9jb25udHJhY2tfdm1hbGxvYyBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19uZXh0X2lkOwotc3RhdGljIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfZXhwZWN0X25leHRfaWQ7Ci0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKLUFUT01JQ19OT1RJRklFUl9IRUFEKG5mX2Nvbm50cmFja19jaGFpbik7Ci1BVE9NSUNfTk9USUZJRVJfSEVBRChuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluKTsKLQotREVGSU5FX1BFUl9DUFUoc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUsIG5mX2Nvbm50cmFja19lY2FjaGUpOwotCi0vKiBkZWxpdmVyIGNhY2hlZCBldmVudHMgYW5kIGNsZWFyIGNhY2hlIGVudHJ5IC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NhbGx5Ci0gKiBkaXNhYmxlZCBzb2Z0aXJxcyAqLwotc3RhdGljIGlubGluZSB2b2lkCi1fX25mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlKQotewotCURFQlVHUCgiZWNhY2hlOiBkZWxpdmVyaW5nIGV2ZW50cyBmb3IgJXBcbiIsIGVjYWNoZS0+Y3QpOwotCWlmIChuZl9jdF9pc19jb25maXJtZWQoZWNhY2hlLT5jdCkgJiYgIW5mX2N0X2lzX2R5aW5nKGVjYWNoZS0+Y3QpCi0JICAgICYmIGVjYWNoZS0+ZXZlbnRzKQotCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbmZfY29ubnRyYWNrX2NoYWluLCBlY2FjaGUtPmV2ZW50cywKLQkJCQkgICAgZWNhY2hlLT5jdCk7Ci0KLQllY2FjaGUtPmV2ZW50cyA9IDA7Ci0JbmZfY3RfcHV0KGVjYWNoZS0+Y3QpOwotCWVjYWNoZS0+Y3QgPSBOVUxMOwotfQotCi0vKiBEZWxpdmVyIGFsbCBjYWNoZWQgZXZlbnRzIGZvciBhIHBhcnRpY3VsYXIgY29ubnRyYWNrLiBUaGlzIGlzIGNhbGxlZAotICogYnkgY29kZSBwcmlvciB0byBhc3luYyBwYWNrZXQgaGFuZGxpbmcgZm9yIGZyZWVpbmcgdGhlIHNrYiAqLwotdm9pZCBuZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7Ci0KLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JZWNhY2hlID0gJl9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX2VjYWNoZSk7Ci0JaWYgKGVjYWNoZS0+Y3QgPT0gY3QpCi0JCV9fbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGVjYWNoZSk7Ci0JbG9jYWxfYmhfZW5hYmxlKCk7Ci19Ci0KLS8qIERlbGl2ZXIgY2FjaGVkIGV2ZW50cyBmb3Igb2xkIHBlbmRpbmcgZXZlbnRzLCBpZiBjdXJyZW50IGNvbm50cmFjayAhPSBvbGQgKi8KLXZvaWQgX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOwotCQotCS8qIHRha2UgY2FyZSBvZiBkZWxpdmVyaW5nIHBvdGVudGlhbGx5IG9sZCBldmVudHMgKi8KLQllY2FjaGUgPSAmX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKTsKLQlCVUdfT04oZWNhY2hlLT5jdCA9PSBjdCk7Ci0JaWYgKGVjYWNoZS0+Y3QpCi0JCV9fbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGVjYWNoZSk7Ci0JLyogaW5pdGlhbGl6ZSBmb3IgdGhpcyBjb25udHJhY2svcGFja2V0ICovCi0JZWNhY2hlLT5jdCA9IGN0OwotCW5mX2Nvbm50cmFja19nZXQoJmN0LT5jdF9nZW5lcmFsKTsKLX0KLQotLyogZmx1c2ggdGhlIGV2ZW50IGNhY2hlIC0gdG91Y2hlcyBvdGhlciBDUFUncyBkYXRhIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQKLSAqIHdoaWxlIHBhY2tldHMgYXJlIHN0aWxsIHBhc3NpbmcgdGhyb3VnaCB0aGUgY29kZSAqLwotc3RhdGljIHZvaWQgbmZfY3RfZXZlbnRfY2FjaGVfZmx1c2godm9pZCkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOwotCWludCBjcHU7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCWVjYWNoZSA9ICZwZXJfY3B1KG5mX2Nvbm50cmFja19lY2FjaGUsIGNwdSk7Ci0JCWlmIChlY2FjaGUtPmN0KQotCQkJbmZfY3RfcHV0KGVjYWNoZS0+Y3QpOwotCX0KLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfZXZlbnRfY2FjaGVfZmx1c2godm9pZCkge30KLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUyAqLwogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQsIG5mX2Nvbm50cmFja19zdGF0KTsKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTChuZl9jb25udHJhY2tfc3RhdCk7CkBAIC0xNzEsNyArMTA4LDcgQEAKIAlzaXplX3Qgc2l6ZTsKIAogCS8qIHNsYWIgY2FjaGUgcG9pbnRlciAqLwotCWttZW1fY2FjaGVfdCAqY2FjaGVwOworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CiAKIAkvKiBhbGxvY2F0ZWQgc2xhYiBjYWNoZSArIG1vZHVsZXMgd2hpY2ggdXNlcyB0aGlzIHNsYWIgY2FjaGUgKi8KIAlpbnQgdXNlOwpAQCAtMTg0LDg1ICsxMjEsNiBAQAogLyogVGhpcyBhdm9pZHMgY2FsbGluZyBrbWVtX2NhY2hlX2NyZWF0ZSgpIHdpdGggc2FtZSBuYW1lIHNpbXVsdGFuZW91c2x5ICovCiBzdGF0aWMgREVGSU5FX01VVEVYKG5mX2N0X2NhY2hlX211dGV4KTsKIAotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2w7Ci1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICoKLV9fbmZfY3RfcHJvdG9fZmluZCh1X2ludDE2X3QgbDNwcm90bywgdV9pbnQ4X3QgcHJvdG9jb2wpCi17Ci0JaWYgKHVubGlrZWx5KGwzcHJvdG8gPj0gQUZfTUFYIHx8IG5mX2N0X3Byb3Rvc1tsM3Byb3RvXSA9PSBOVUxMKSkKLQkJcmV0dXJuICZuZl9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbDsKLQotCXJldHVybiBuZl9jdF9wcm90b3NbbDNwcm90b11bcHJvdG9jb2xdOwotfQotCi0vKiB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiBhIHZhbGlkIHByb3RvY29sIGhlbHBlciwgc2luY2UKLSAqIGl0IGZhbGxzIGJhY2sgdG8gZ2VuZXJpY19wcm90b2NvbCAqLwotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqCi1uZl9jdF9wcm90b19maW5kX2dldCh1X2ludDE2X3QgbDNwcm90bywgdV9pbnQ4X3QgcHJvdG9jb2wpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcDsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCXAgPSBfX25mX2N0X3Byb3RvX2ZpbmQobDNwcm90bywgcHJvdG9jb2wpOwotCWlmICghdHJ5X21vZHVsZV9nZXQocC0+bWUpKQotCQlwID0gJm5mX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0JCi0JcmV0dXJuIHA7Ci19Ci0KLXZvaWQgbmZfY3RfcHJvdG9fcHV0KHN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKnApCi17Ci0JbW9kdWxlX3B1dChwLT5tZSk7Ci19Ci0KLXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqCi1uZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KHVfaW50MTZfdCBsM3Byb3RvKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcDsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCXAgPSBfX25mX2N0X2wzcHJvdG9fZmluZChsM3Byb3RvKTsKLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHAtPm1lKSkKLQkJcCA9ICZuZl9jb25udHJhY2tfZ2VuZXJpY19sM3Byb3RvOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0KLQlyZXR1cm4gcDsKLX0KLQotdm9pZCBuZl9jdF9sM3Byb3RvX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnApCi17Ci0JbW9kdWxlX3B1dChwLT5tZSk7Ci19Ci0KLWludAotbmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldCh1bnNpZ25lZCBzaG9ydCBsM3Byb3RvKQotewotCWludCByZXQ7Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwOwotCi1yZXRyeToJcCA9IG5mX2N0X2wzcHJvdG9fZmluZF9nZXQobDNwcm90byk7Ci0JaWYgKHAgPT0gJm5mX2Nvbm50cmFja19nZW5lcmljX2wzcHJvdG8pIHsKLQkJcmV0ID0gcmVxdWVzdF9tb2R1bGUoIm5mX2Nvbm50cmFjay0lZCIsIGwzcHJvdG8pOwotCQlpZiAoIXJldCkKLQkJCWdvdG8gcmV0cnk7Ci0KLQkJcmV0dXJuIC1FUFJPVE9UWVBFOwotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkIG5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCh1bnNpZ25lZCBzaG9ydCBsM3Byb3RvKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcDsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCXAgPSBfX25mX2N0X2wzcHJvdG9fZmluZChsM3Byb3RvKTsKLQlwcmVlbXB0X2VuYWJsZSgpOwotCi0JbW9kdWxlX3B1dChwLT5tZSk7Ci19Ci0KIHN0YXRpYyBpbnQgbmZfY29ubnRyYWNrX2hhc2hfcm5kX2luaXR0ZWQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19oYXNoX3JuZDsKIApAQCAtMjg5LDcgKzE0Nyw3IEBACiB7CiAJaW50IHJldCA9IDA7CiAJY2hhciAqY2FjaGVfbmFtZTsKLQlrbWVtX2NhY2hlX3QgKmNhY2hlcDsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwogCiAJREVCVUdQKCJuZl9jb25udHJhY2tfcmVnaXN0ZXJfY2FjaGU6IGZlYXR1cmVzPTB4JXgsIG5hbWU9JXMsIHNpemU9JWRcbiIsCiAJICAgICAgIGZlYXR1cmVzLCBuYW1lLCBzaXplKTsKQEAgLTM2MywxMSArMjIxLDEyIEBACiAJbXV0ZXhfdW5sb2NrKCZuZl9jdF9jYWNoZV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19yZWdpc3Rlcl9jYWNoZSk7CiAKIC8qIEZJWE1FOiBJbiB0aGUgY3VycmVudCwgb25seSBuZl9jb25udHJhY2tfY2xlYW51cCgpIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24uICovCiB2b2lkIG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX2NhY2hlKHVfaW50MzJfdCBmZWF0dXJlcykKIHsKLQlrbWVtX2NhY2hlX3QgKmNhY2hlcDsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwogCWNoYXIgKm5hbWU7CiAKIAkvKgpAQCAtMzk3LDYgKzI1Niw3IEBACiAKIAltdXRleF91bmxvY2soJm5mX2N0X2NhY2hlX211dGV4KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX2NhY2hlKTsKIAogaW50CiBuZl9jdF9nZXRfdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTQwNiw3ICsyNjYsNyBAQAogCQl1X2ludDhfdCBwcm90b251bSwKIAkJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCiAJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bywKLQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG9jb2wpCisJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bykKIHsKIAlORl9DVF9UVVBMRV9VX0JMQU5LKHR1cGxlKTsKIApAQCAtNDE3LDE0ICsyNzcsMTUgQEAKIAl0dXBsZS0+ZHN0LnByb3RvbnVtID0gcHJvdG9udW07CiAJdHVwbGUtPmRzdC5kaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7CiAKLQlyZXR1cm4gcHJvdG9jb2wtPnBrdF90b190dXBsZShza2IsIGRhdGFvZmYsIHR1cGxlKTsKKwlyZXR1cm4gbDRwcm90by0+cGt0X3RvX3R1cGxlKHNrYiwgZGF0YW9mZiwgdHVwbGUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZ2V0X3R1cGxlKTsKIAogaW50CiBuZl9jdF9pbnZlcnRfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKIAkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZywKIAkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAotCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCkKKwkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKQogewogCU5GX0NUX1RVUExFX1VfQkxBTksoaW52ZXJzZSk7CiAKQEAgLTQzNSwxMTEgKzI5NiwxNCBAQAogCWludmVyc2UtPmRzdC5kaXIgPSAhb3JpZy0+ZHN0LmRpcjsKIAogCWludmVyc2UtPmRzdC5wcm90b251bSA9IG9yaWctPmRzdC5wcm90b251bTsKLQlyZXR1cm4gcHJvdG9jb2wtPmludmVydF90dXBsZShpbnZlcnNlLCBvcmlnKTsKKwlyZXR1cm4gbDRwcm90by0+aW52ZXJ0X3R1cGxlKGludmVyc2UsIG9yaWcpOwogfQotCi0vKiBuZl9jb25udHJhY2tfZXhwZWN0IGhlbHBlciBmdW5jdGlvbnMgKi8KLXZvaWQgbmZfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCXN0cnVjdCBuZl9jb25uX2hlbHAgKm1hc3Rlcl9oZWxwID0gbmZjdF9oZWxwKGV4cC0+bWFzdGVyKTsKLQotCU5GX0NUX0FTU0VSVChtYXN0ZXJfaGVscCk7Ci0JQVNTRVJUX1dSSVRFX0xPQ0soJm5mX2Nvbm50cmFja19sb2NrKTsKLQlORl9DVF9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOwotCi0JbGlzdF9kZWwoJmV4cC0+bGlzdCk7Ci0JTkZfQ1RfU1RBVF9JTkMoZXhwZWN0X2RlbGV0ZSk7Ci0JbWFzdGVyX2hlbHAtPmV4cGVjdGluZy0tOwotCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4cGVjdGF0aW9uX3RpbWVkX291dCh1bnNpZ25lZCBsb25nIHVsX2V4cGVjdCkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gKHZvaWQgKil1bF9leHBlY3Q7Ci0KLQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JbmZfY3RfdW5saW5rX2V4cGVjdChleHApOwotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci19Ci0KLXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICoKLV9fbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOwotCQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewotCQlpZiAobmZfY3RfdHVwbGVfbWFza19jbXAodHVwbGUsICZpLT50dXBsZSwgJmktPm1hc2spKSB7Ci0JCQlhdG9taWNfaW5jKCZpLT51c2UpOwotCQkJcmV0dXJuIGk7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEp1c3QgZmluZCBhIGV4cGVjdGF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KLXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICoKLW5mX2Nvbm50cmFja19leHBlY3RfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKLQkKLQlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlpID0gX19uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQodHVwbGUpOwotCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0KLQlyZXR1cm4gaTsKLX0KLQotLyogSWYgYW4gZXhwZWN0YXRpb24gZm9yIHRoaXMgY29ubmVjdGlvbiBpcyBmb3VuZCwgaXQgZ2V0cyBkZWxldGUgZnJvbQotICogZ2xvYmFsIGxpc3QgdGhlbiByZXR1cm5lZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqCi1maW5kX2V4cGVjdGF0aW9uKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JLyogSWYgbWFzdGVyIGlzIG5vdCBpbiBoYXNoIHRhYmxlIHlldCAoaWUuIHBhY2tldCBoYXNuJ3QgbGVmdAotCSAgIHRoaXMgbWFjaGluZSB5ZXQpLCBob3cgY2FuIG90aGVyIGVuZCBrbm93IGFib3V0IGV4cGVjdGVkPwotCSAgIEhlbmNlIHRoZXNlIGFyZSBub3QgdGhlIGRyb2lkcyB5b3UgYXJlIGxvb2tpbmcgZm9yIChpZgotCSAgIG1hc3RlciBjdCBuZXZlciBnb3QgY29uZmlybWVkLCB3ZSdkIGhvbGQgYSByZWZlcmVuY2UgdG8gaXQKLQkgICBhbmQgd2VpcmQgdGhpbmdzIHdvdWxkIGhhcHBlbiB0byBmdXR1cmUgcGFja2V0cykuICovCi0JCWlmIChuZl9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmktPnR1cGxlLCAmaS0+bWFzaykKLQkJICAgICYmIG5mX2N0X2lzX2NvbmZpcm1lZChpLT5tYXN0ZXIpKSB7Ci0JCQlpZiAoaS0+ZmxhZ3MgJiBORl9DVF9FWFBFQ1RfUEVSTUFORU5UKSB7Ci0JCQkJYXRvbWljX2luYygmaS0+dXNlKTsKLQkJCQlyZXR1cm4gaTsKLQkJCX0gZWxzZSBpZiAoZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJCW5mX2N0X3VubGlua19leHBlY3QoaSk7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGRlbGV0ZSBhbGwgZXhwZWN0YXRpb25zIGZvciB0aGlzIGNvbm50cmFjayAqLwotdm9pZCBuZl9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaSwgKnRtcDsKLQlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGN0KTsKLQotCS8qIE9wdGltaXphdGlvbjogbW9zdCBjb25uZWN0aW9uIG5ldmVyIGV4cGVjdCBhbnkgb3RoZXJzLiAqLwotCWlmICghaGVscCB8fCBoZWxwLT5leHBlY3RpbmcgPT0gMCkKLQkJcmV0dXJuOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGksIHRtcCwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewotCQlpZiAoaS0+bWFzdGVyID09IGN0ICYmIGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKLQkJCW5mX2N0X3VubGlua19leHBlY3QoaSk7Ci0JCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKLSAJCX0KLQl9Ci19CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9pbnZlcnRfdHVwbGUpOwogCiBzdGF0aWMgdm9pZAogY2xlYW5fZnJvbV9saXN0cyhzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CiAJREVCVUdQKCJjbGVhbl9mcm9tX2xpc3RzKCVwKVxuIiwgY3QpOwotCUFTU0VSVF9XUklURV9MT0NLKCZuZl9jb25udHJhY2tfbG9jayk7CiAJbGlzdF9kZWwoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5saXN0KTsKIAlsaXN0X2RlbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLmxpc3QpOwogCkBAIC01NTEsOCArMzE1LDkgQEAKIGRlc3Ryb3lfY29ubnRyYWNrKHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHN0cnVjdCBuZl9jb25uICopbmZjdDsKKwlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGN0KTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwogCiAJREVCVUdQKCJkZXN0cm95X2Nvbm50cmFjayglcClcbiIsIGN0KTsKIAlORl9DVF9BU1NFUlQoYXRvbWljX3JlYWQoJm5mY3QtPnVzZSkgPT0gMCk7CkBAIC01NjEsNiArMzI2LDkgQEAKIAluZl9jb25udHJhY2tfZXZlbnQoSVBDVF9ERVNUUk9ZLCBjdCk7CiAJc2V0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7CiAKKwlpZiAoaGVscCAmJiBoZWxwLT5oZWxwZXIgJiYgaGVscC0+aGVscGVyLT5kZXN0cm95KQorCQloZWxwLT5oZWxwZXItPmRlc3Ryb3koY3QpOworCiAJLyogVG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgd2VpcmQgbG9ja2luZyBpc3N1ZXMgaGVyZToKIAkgKiBkZXN0cm95X2Nvbm50cmFjaygpIE1VU1QgTk9UIGJlIGNhbGxlZCB3aXRoIGEgd3JpdGUgbG9jawogCSAqIHRvIG5mX2Nvbm50cmFja19sb2NrISEhIC1IVyAqLwpAQCAtNTY4LDkgKzMzNiw5IEBACiAJaWYgKGwzcHJvdG8gJiYgbDNwcm90by0+ZGVzdHJveSkKIAkJbDNwcm90by0+ZGVzdHJveShjdCk7CiAKLQlwcm90byA9IF9fbmZfY3RfcHJvdG9fZmluZChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLmwzbnVtLCBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnByb3RvbnVtKTsKLQlpZiAocHJvdG8gJiYgcHJvdG8tPmRlc3Ryb3kpCi0JCXByb3RvLT5kZXN0cm95KGN0KTsKKwlsNHByb3RvID0gX19uZl9jdF9sNHByb3RvX2ZpbmQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5sM251bSwgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5wcm90b251bSk7CisJaWYgKGw0cHJvdG8gJiYgbDRwcm90by0+ZGVzdHJveSkKKwkJbDRwcm90by0+ZGVzdHJveShjdCk7CiAKIAlpZiAobmZfY29ubnRyYWNrX2Rlc3Ryb3llZCkKIAkJbmZfY29ubnRyYWNrX2Rlc3Ryb3llZChjdCk7CkBAIC02MTgsNyArMzg2LDYgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX2Nvbm50cmFjayh0dXBsZSk7CiAKLQlBU1NFUlRfUkVBRF9MT0NLKCZuZl9jb25udHJhY2tfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmbmZfY29ubnRyYWNrX2hhc2hbaGFzaF0sIGxpc3QpIHsKIAkJaWYgKG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCkgIT0gaWdub3JlZF9jb25udHJhY2sgJiYKIAkJICAgIG5mX2N0X3R1cGxlX2VxdWFsKHR1cGxlLCAmaC0+dHVwbGUpKSB7CkBAIC02MzAsNiArMzk3LDcgQEAKIAogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jb25udHJhY2tfZmluZCk7CiAKIC8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqCkBAIC02NDYsNiArNDE0LDcgQEAKIAogCXJldHVybiBoOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2ZpbmRfZ2V0KTsKIAogc3RhdGljIHZvaWQgX19uZl9jb25udHJhY2tfaGFzaF9pbnNlcnQoc3RydWN0IG5mX2Nvbm4gKmN0LAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaGFzaCwKQEAgLTY2OSw2ICs0MzgsNyBAQAogCV9fbmZfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KGN0LCBoYXNoLCByZXBsX2hhc2gpOwogCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KTsKIAogLyogQ29uZmlybSBhIGNvbm5lY3Rpb24gZ2l2ZW4gc2tiOyBwbGFjZXMgaXQgaW4gaGFzaCB0YWJsZSAqLwogaW50CkBAIC03NDYsNiArNTE2LDcgQEAKIAl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAlyZXR1cm4gTkZfRFJPUDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY29ubnRyYWNrX2NvbmZpcm0pOwogCiAvKiBSZXR1cm5zIHRydWUgaWYgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmdzIHRvIHRoZSB0dXBsZSAocmVxdWlyZWQKICAgIGZvciBOQVQpLiAqLwpAQCAtNzYxLDYgKzUzMiw3IEBACiAKIAlyZXR1cm4gaCAhPSBOVUxMOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3R1cGxlX3Rha2VuKTsKIAogLyogVGhlcmUncyBhIHNtYWxsIHJhY2UgaGVyZSB3aGVyZSB3ZSBtYXkgZnJlZSBhIGp1c3QtYXNzdXJlZAogICAgY29ubmVjdGlvbi4gIFRvbyBiYWQ6IHdlJ3JlIGluIHRyb3VibGUgYW55d2F5LiAqLwpAQCAtNzk0LDUzICs1NjYsMTMgQEAKIAlyZXR1cm4gZHJvcHBlZDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKLV9fbmZfY3RfaGVscGVyX2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmg7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZoZWxwZXJzLCBsaXN0KSB7Ci0JCWlmIChuZl9jdF90dXBsZV9tYXNrX2NtcCh0dXBsZSwgJmgtPnR1cGxlLCAmaC0+bWFzaykpCi0JCQlyZXR1cm4gaDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKLW5mX2N0X2hlbHBlcl9maW5kX2dldCggY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKLQotCS8qIG5lZWQgbmZfY29ubnRyYWNrX2xvY2sgdG8gYXNzdXJlIHRoYXQgaGVscGVyIGV4aXN0cyB1bnRpbAotCSAqIHRyeV9tb2R1bGVfZ2V0KCkgaXMgY2FsbGVkICovCi0JcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0KLQloZWxwZXIgPSBfX25mX2N0X2hlbHBlcl9maW5kKHR1cGxlKTsKLQlpZiAoaGVscGVyKSB7Ci0JCS8qIG5lZWQgdG8gaW5jcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50IHRvIGFzc3VyZSBoZWxwZXIgd2lsbAotCQkgKiBub3QgZ28gYXdheSB3aGlsZSB0aGUgY2FsbGVyIGlzIGUuZy4gYnVzeSBwdXR0aW5nIGEKLQkJICogY29ubnRyYWNrIGluIHRoZSBoYXNoIHRoYXQgdXNlcyB0aGUgaGVscGVyICovCi0JCWlmICghdHJ5X21vZHVsZV9nZXQoaGVscGVyLT5tZSkpCi0JCQloZWxwZXIgPSBOVUxMOwotCX0KLQotCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0KLQlyZXR1cm4gaGVscGVyOwotfQotCi12b2lkIG5mX2N0X2hlbHBlcl9wdXQoc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcikKLXsKLQltb2R1bGVfcHV0KGhlbHBlci0+bWUpOwotfQotCiBzdGF0aWMgc3RydWN0IG5mX2Nvbm4gKgogX19uZl9jb25udHJhY2tfYWxsb2MoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZywKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpyZXBsLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bykKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8sCisJCSAgICAgdV9pbnQzMl90IGZlYXR1cmVzKQogewogCXN0cnVjdCBuZl9jb25uICpjb25udHJhY2sgPSBOVUxMOwotCXVfaW50MzJfdCBmZWF0dXJlcyA9IDA7CiAJc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKIAogCWlmICh1bmxpa2VseSghbmZfY29ubnRyYWNrX2hhc2hfcm5kX2luaXR0ZWQpKSB7CkBAIC04NjYsMTIgKzU5OCwxMyBAQAogCX0KIAogCS8qICBmaW5kIGZlYXR1cmVzIG5lZWRlZCBieSB0aGlzIGNvbm50cmFjay4gKi8KLQlmZWF0dXJlcyA9IGwzcHJvdG8tPmdldF9mZWF0dXJlcyhvcmlnKTsKKwlmZWF0dXJlcyB8PSBsM3Byb3RvLT5nZXRfZmVhdHVyZXMob3JpZyk7CiAKIAkvKiBGSVhNRTogcHJvdGVjdCBoZWxwZXIgbGlzdCBwZXIgUkNVICovCiAJcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJaGVscGVyID0gX19uZl9jdF9oZWxwZXJfZmluZChyZXBsKTsKLQlpZiAoaGVscGVyKQorCS8qIE5BVCBtaWdodCB3YW50IHRvIGFzc2lnbiBhIGhlbHBlciBsYXRlciAqLworCWlmIChoZWxwZXIgfHwgZmVhdHVyZXMgJiBORl9DVF9GX05BVCkKIAkJZmVhdHVyZXMgfD0gTkZfQ1RfRl9IRUxQOwogCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAKQEAgLTg5MywxMiArNjI2LDYgQEAKIAogCW1lbXNldChjb25udHJhY2ssIDAsIG5mX2N0X2NhY2hlW2ZlYXR1cmVzXS5zaXplKTsKIAljb25udHJhY2stPmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JaWYgKGhlbHBlcikgewotCQlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGNvbm50cmFjayk7Ci0JCU5GX0NUX0FTU0VSVChoZWxwKTsKLQkJaGVscC0+aGVscGVyID0gaGVscGVyOwotCX0KLQogCWF0b21pY19zZXQoJmNvbm50cmFjay0+Y3RfZ2VuZXJhbC51c2UsIDEpOwogCWNvbm50cmFjay0+Y3RfZ2VuZXJhbC5kZXN0cm95ID0gZGVzdHJveV9jb25udHJhY2s7CiAJY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSA9ICpvcmlnOwpAQCAtOTIyLDggKzY0OSw5IEBACiAJc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvOwogCiAJbDNwcm90byA9IF9fbmZfY3RfbDNwcm90b19maW5kKG9yaWctPnNyYy5sM251bSk7Ci0JcmV0dXJuIF9fbmZfY29ubnRyYWNrX2FsbG9jKG9yaWcsIHJlcGwsIGwzcHJvdG8pOworCXJldHVybiBfX25mX2Nvbm50cmFja19hbGxvYyhvcmlnLCByZXBsLCBsM3Byb3RvLCAwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19hbGxvYyk7CiAKIHZvaWQgbmZfY29ubnRyYWNrX2ZyZWUoc3RydWN0IG5mX2Nvbm4gKmNvbm50cmFjaykKIHsKQEAgLTkzNCwzMiArNjYyLDQwIEBACiAJa21lbV9jYWNoZV9mcmVlKG5mX2N0X2NhY2hlW2ZlYXR1cmVzXS5jYWNoZXAsIGNvbm50cmFjayk7CiAJYXRvbWljX2RlYygmbmZfY29ubnRyYWNrX2NvdW50KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19mcmVlKTsKIAogLyogQWxsb2NhdGUgYSBuZXcgY29ubnRyYWNrOiB3ZSByZXR1cm4gLUVOT01FTSBpZiBjbGFzc2lmaWNhdGlvbgogICAgZmFpbGVkIGR1ZSB0byBzdHJlc3MuICBPdGhlcndpc2UgaXQgcmVhbGx5IGlzIHVuY2xhc3NpZmlhYmxlLiAqLwogc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqCiBpbml0X2Nvbm50cmFjayhjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAotCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCwKKwkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvLAogCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCSAgICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZikKIHsKIAlzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgcmVwbF90dXBsZTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXVfaW50MzJfdCBmZWF0dXJlcyA9IDA7CiAKLQlpZiAoIW5mX2N0X2ludmVydF90dXBsZSgmcmVwbF90dXBsZSwgdHVwbGUsIGwzcHJvdG8sIHByb3RvY29sKSkgeworCWlmICghbmZfY3RfaW52ZXJ0X3R1cGxlKCZyZXBsX3R1cGxlLCB0dXBsZSwgbDNwcm90bywgbDRwcm90bykpIHsKIAkJREVCVUdQKCJDYW4ndCBpbnZlcnQgdHVwbGUuXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JY29ubnRyYWNrID0gX19uZl9jb25udHJhY2tfYWxsb2ModHVwbGUsICZyZXBsX3R1cGxlLCBsM3Byb3RvKTsKKwlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwlleHAgPSBfX25mX2Nvbm50cmFja19leHBlY3RfZmluZCh0dXBsZSk7CisJaWYgKGV4cCAmJiBleHAtPmhlbHBlcikKKwkJZmVhdHVyZXMgPSBORl9DVF9GX0hFTFA7CisJcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCWNvbm50cmFjayA9IF9fbmZfY29ubnRyYWNrX2FsbG9jKHR1cGxlLCAmcmVwbF90dXBsZSwgbDNwcm90bywgZmVhdHVyZXMpOwogCWlmIChjb25udHJhY2sgPT0gTlVMTCB8fCBJU19FUlIoY29ubnRyYWNrKSkgewogCQlERUJVR1AoIkNhbid0IGFsbG9jYXRlIGNvbm50cmFjay5cbiIpOwogCQlyZXR1cm4gKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqKWNvbm50cmFjazsKIAl9CiAKLQlpZiAoIXByb3RvY29sLT5uZXcoY29ubnRyYWNrLCBza2IsIGRhdGFvZmYpKSB7CisJaWYgKCFsNHByb3RvLT5uZXcoY29ubnRyYWNrLCBza2IsIGRhdGFvZmYpKSB7CiAJCW5mX2Nvbm50cmFja19mcmVlKGNvbm50cmFjayk7CiAJCURFQlVHUCgiaW5pdCBjb25udHJhY2s6IGNhbid0IHRyYWNrIHdpdGggcHJvdG8gbW9kdWxlXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC05NzQsNiArNzEwLDggQEAKIAkJLyogV2VsY29tZSwgTXIuIEJvbmQuICBXZSd2ZSBiZWVuIGV4cGVjdGluZyB5b3UuLi4gKi8KIAkJX19zZXRfYml0KElQU19FWFBFQ1RFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cyk7CiAJCWNvbm50cmFjay0+bWFzdGVyID0gZXhwLT5tYXN0ZXI7CisJCWlmIChleHAtPmhlbHBlcikKKwkJCW5mY3RfaGVscChjb25udHJhY2spLT5oZWxwZXIgPSBleHAtPmhlbHBlcjsKICNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX01BUksKIAkJY29ubnRyYWNrLT5tYXJrID0gZXhwLT5tYXN0ZXItPm1hcms7CiAjZW5kaWYKQEAgLTk4Miw4ICs3MjAsMTMgQEAKICNlbmRpZgogCQluZl9jb25udHJhY2tfZ2V0KCZjb25udHJhY2stPm1hc3Rlci0+Y3RfZ2VuZXJhbCk7CiAJCU5GX0NUX1NUQVRfSU5DKGV4cGVjdF9uZXcpOwotCX0gZWxzZQorCX0gZWxzZSB7CisJCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY29ubnRyYWNrKTsKKworCQlpZiAoaGVscCkKKwkJCWhlbHAtPmhlbHBlciA9IF9fbmZfY3RfaGVscGVyX2ZpbmQoJnJlcGxfdHVwbGUpOwogCQlORl9DVF9TVEFUX0lOQyhuZXcpOworCX0KIAogCS8qIE92ZXJsb2FkIHR1cGxlIGxpbmtlZCBsaXN0IHRvIHB1dCB1cyBpbiB1bmNvbmZpcm1lZCBsaXN0LiAqLwogCWxpc3RfYWRkKCZjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmxpc3QsICZ1bmNvbmZpcm1lZCk7CkBAIC0xMDA2LDcgKzc0OSw3IEBACiAJCSAgdV9pbnQxNl90IGwzbnVtLAogCQkgIHVfaW50OF90IHByb3RvbnVtLAogCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bywKLQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bywKKwkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8sCiAJCSAgaW50ICpzZXRfcmVwbHksCiAJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvKQogewpAQCAtMTAxNiw3ICs3NTksNyBAQAogCiAJaWYgKCFuZl9jdF9nZXRfdHVwbGUoc2tiLCAodW5zaWduZWQgaW50KShza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSksCiAJCQkgICAgIGRhdGFvZmYsIGwzbnVtLCBwcm90b251bSwgJnR1cGxlLCBsM3Byb3RvLAotCQkJICAgICBwcm90bykpIHsKKwkJCSAgICAgbDRwcm90bykpIHsKIAkJREVCVUdQKCJyZXNvbHZlX25vcm1hbF9jdDogQ2FuJ3QgZ2V0IHR1cGxlXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTAyNCw3ICs3NjcsNyBAQAogCS8qIGxvb2sgZm9yIHR1cGxlIG1hdGNoICovCiAJaCA9IG5mX2Nvbm50cmFja19maW5kX2dldCgmdHVwbGUsIE5VTEwpOwogCWlmICghaCkgewotCQloID0gaW5pdF9jb25udHJhY2soJnR1cGxlLCBsM3Byb3RvLCBwcm90bywgc2tiLCBkYXRhb2ZmKTsKKwkJaCA9IGluaXRfY29ubnRyYWNrKCZ0dXBsZSwgbDNwcm90bywgbDRwcm90bywgc2tiLCBkYXRhb2ZmKTsKIAkJaWYgKCFoKQogCQkJcmV0dXJuIE5VTEw7CiAJCWlmIChJU19FUlIoaCkpCkBAIC0xMDYyLDcgKzgwNSw3IEBACiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bzsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAJdW5zaWduZWQgaW50IGRhdGFvZmY7CiAJdV9pbnQ4X3QgcHJvdG9udW07CiAJaW50IHNldF9yZXBseSA9IDA7CkBAIC0xMDgwLDE5ICs4MjMsMTkgQEAKIAkJcmV0dXJuIC1yZXQ7CiAJfQogCi0JcHJvdG8gPSBfX25mX2N0X3Byb3RvX2ZpbmQoKHVfaW50MTZfdClwZiwgcHJvdG9udW0pOworCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZCgodV9pbnQxNl90KXBmLCBwcm90b251bSk7CiAKIAkvKiBJdCBtYXkgYmUgYW4gc3BlY2lhbCBwYWNrZXQsIGVycm9yLCB1bmNsZWFuLi4uCiAJICogaW52ZXJzZSBvZiB0aGUgcmV0dXJuIGNvZGUgdGVsbHMgdG8gdGhlIG5ldGZpbHRlcgogCSAqIGNvcmUgd2hhdCB0byBkbyB3aXRoIHRoZSBwYWNrZXQuICovCi0JaWYgKHByb3RvLT5lcnJvciAhPSBOVUxMICYmCi0JICAgIChyZXQgPSBwcm90by0+ZXJyb3IoKnBza2IsIGRhdGFvZmYsICZjdGluZm8sIHBmLCBob29rbnVtKSkgPD0gMCkgeworCWlmIChsNHByb3RvLT5lcnJvciAhPSBOVUxMICYmCisJICAgIChyZXQgPSBsNHByb3RvLT5lcnJvcigqcHNrYiwgZGF0YW9mZiwgJmN0aW5mbywgcGYsIGhvb2tudW0pKSA8PSAwKSB7CiAJCU5GX0NUX1NUQVRfSU5DKGVycm9yKTsKIAkJTkZfQ1RfU1RBVF9JTkMoaW52YWxpZCk7CiAJCXJldHVybiAtcmV0OwogCX0KIAotCWN0ID0gcmVzb2x2ZV9ub3JtYWxfY3QoKnBza2IsIGRhdGFvZmYsIHBmLCBwcm90b251bSwgbDNwcm90bywgcHJvdG8sCisJY3QgPSByZXNvbHZlX25vcm1hbF9jdCgqcHNrYiwgZGF0YW9mZiwgcGYsIHByb3RvbnVtLCBsM3Byb3RvLCBsNHByb3RvLAogCQkJICAgICAgICZzZXRfcmVwbHksICZjdGluZm8pOwogCWlmICghY3QpIHsKIAkJLyogTm90IHZhbGlkIHBhcnQgb2YgYSBjb25uZWN0aW9uICovCkBAIC0xMTA4LDcgKzg1MSw3IEBACiAKIAlORl9DVF9BU1NFUlQoKCpwc2tiKS0+bmZjdCk7CiAKLQlyZXQgPSBwcm90by0+cGFja2V0KGN0LCAqcHNrYiwgZGF0YW9mZiwgY3RpbmZvLCBwZiwgaG9va251bSk7CisJcmV0ID0gbDRwcm90by0+cGFja2V0KGN0LCAqcHNrYiwgZGF0YW9mZiwgY3RpbmZvLCBwZiwgaG9va251bSk7CiAJaWYgKHJldCA8IDApIHsKIAkJLyogSW52YWxpZDogaW52ZXJzZSBvZiB0aGUgcmV0dXJuIGNvZGUgdGVsbHMKIAkJICogdGhlIG5ldGZpbHRlciBjb3JlIHdoYXQgdG8gZG8gKi8KQEAgLTExMjQsMjU1ICs4NjcsMzggQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaW4pOwogCiBpbnQgbmZfY3RfaW52ZXJ0X3R1cGxlcHIoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKIAkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnKQogewogCXJldHVybiBuZl9jdF9pbnZlcnRfdHVwbGUoaW52ZXJzZSwgb3JpZywKIAkJCQkgIF9fbmZfY3RfbDNwcm90b19maW5kKG9yaWctPnNyYy5sM251bSksCi0JCQkJICBfX25mX2N0X3Byb3RvX2ZpbmQob3JpZy0+c3JjLmwzbnVtLAorCQkJCSAgX19uZl9jdF9sNHByb3RvX2ZpbmQob3JpZy0+c3JjLmwzbnVtLAogCQkJCQkJICAgICBvcmlnLT5kc3QucHJvdG9udW0pKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2ludmVydF90dXBsZXByKTsKIAotLyogV291bGQgdHdvIGV4cGVjdGVkIHRoaW5ncyBjbGFzaD8gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGV4cGVjdF9jbGFzaChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqYSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqYikKKy8qIEFsdGVyIHJlcGx5IHR1cGxlIChtYXliZSBhbHRlciBoZWxwZXIpLiAgVGhpcyBpcyBmb3IgTkFULCBhbmQgaXMKKyAgIGltcGxpY2l0bHkgcmFjeTogc2VlIF9fbmZfY29ubnRyYWNrX2NvbmZpcm0gKi8KK3ZvaWQgbmZfY29ubnRyYWNrX2FsdGVyX3JlcGx5KHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm5ld3JlcGx5KQogewotCS8qIFBhcnQgY292ZXJlZCBieSBpbnRlcnNlY3Rpb24gb2YgbWFza3MgbXVzdCBiZSB1bmVxdWFsLAotCSAgIG90aGVyd2lzZSB0aGV5IGNsYXNoICovCi0Jc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSBpbnRlcnNlY3RfbWFzazsKLQlpbnQgY291bnQ7Ci0KLQlpbnRlcnNlY3RfbWFzay5zcmMubDNudW0gPSBhLT5tYXNrLnNyYy5sM251bSAmIGItPm1hc2suc3JjLmwzbnVtOwotCWludGVyc2VjdF9tYXNrLnNyYy51LmFsbCA9IGEtPm1hc2suc3JjLnUuYWxsICYgYi0+bWFzay5zcmMudS5hbGw7Ci0JaW50ZXJzZWN0X21hc2suZHN0LnUuYWxsID0gYS0+bWFzay5kc3QudS5hbGwgJiBiLT5tYXNrLmRzdC51LmFsbDsKLQlpbnRlcnNlY3RfbWFzay5kc3QucHJvdG9udW0gPSBhLT5tYXNrLmRzdC5wcm90b251bQotCQkJCQkmIGItPm1hc2suZHN0LnByb3RvbnVtOwotCi0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTkZfQ1RfVFVQTEVfTDNTSVpFOyBjb3VudCsrKXsKLQkJaW50ZXJzZWN0X21hc2suc3JjLnUzLmFsbFtjb3VudF0gPQotCQkJYS0+bWFzay5zcmMudTMuYWxsW2NvdW50XSAmIGItPm1hc2suc3JjLnUzLmFsbFtjb3VudF07Ci0JfQotCi0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTkZfQ1RfVFVQTEVfTDNTSVpFOyBjb3VudCsrKXsKLQkJaW50ZXJzZWN0X21hc2suZHN0LnUzLmFsbFtjb3VudF0gPQotCQkJYS0+bWFzay5kc3QudTMuYWxsW2NvdW50XSAmIGItPm1hc2suZHN0LnUzLmFsbFtjb3VudF07Ci0JfQotCi0JcmV0dXJuIG5mX2N0X3R1cGxlX21hc2tfY21wKCZhLT50dXBsZSwgJmItPnR1cGxlLCAmaW50ZXJzZWN0X21hc2spOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBleHBlY3RfbWF0Y2hlcyhjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqYSwKLQkJCQkgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmIpCi17Ci0JcmV0dXJuIGEtPm1hc3RlciA9PSBiLT5tYXN0ZXIKLQkJJiYgbmZfY3RfdHVwbGVfZXF1YWwoJmEtPnR1cGxlLCAmYi0+dHVwbGUpCi0JCSYmIG5mX2N0X3R1cGxlX2VxdWFsKCZhLT5tYXNrLCAmYi0+bWFzayk7Ci19Ci0KLS8qIEdlbmVyYWxseSBhIGJhZCBpZGVhIHRvIGNhbGwgdGhpczogY291bGQgaGF2ZSBtYXRjaGVkIGFscmVhZHkuICovCi12b2lkIG5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JLyogY2hvb3NlIHRoZSB0aGUgb2xkZXN0IGV4cGVjdGF0aW9uIHRvIGV2aWN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGksICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGV4cGVjdF9tYXRjaGVzKGksIGV4cCkgJiYgZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJbmZfY3RfdW5saW5rX2V4cGVjdChpKTsKLQkJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCQkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci19Ci0KLS8qIFdlIGRvbid0IGluY3JlYXNlIHRoZSBtYXN0ZXIgY29ubnRyYWNrIHJlZmNvdW50IGZvciBub24tZnVsZmlsbGVkCi0gKiBjb25udHJhY2tzLiBEdXJpbmcgdGhlIGNvbm50cmFjayBkZXN0cnVjdGlvbiwgdGhlIGV4cGVjdGF0aW9ucyBhcmUKLSAqIGFsd2F5cyBraWxsZWQgYmVmb3JlIHRoZSBjb25udHJhY2sgaXRzZWxmICovCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhzdHJ1Y3QgbmZfY29ubiAqbWUpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKm5ldzsKLQotCW5ldyA9IGttZW1fY2FjaGVfYWxsb2MobmZfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmICghbmV3KSB7Ci0JCURFQlVHUCgiZXhwZWN0X3JlbGF0ZWQ6IE9PTSBhbGxvY2F0aW5nIGV4cGVjdFxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluZXctPm1hc3RlciA9IG1lOwotCWF0b21pY19zZXQoJm5ldy0+dXNlLCAxKTsKLQlyZXR1cm4gbmV3OwotfQotCi12b2lkIG5mX2Nvbm50cmFja19leHBlY3RfcHV0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmV4cC0+dXNlKSkKLQkJa21lbV9jYWNoZV9mcmVlKG5mX2Nvbm50cmFja19leHBlY3RfY2FjaGVwLCBleHApOwotfQotCi1zdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfZXhwZWN0X2luc2VydChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCXN0cnVjdCBuZl9jb25uX2hlbHAgKm1hc3Rlcl9oZWxwID0gbmZjdF9oZWxwKGV4cC0+bWFzdGVyKTsKLQotCWF0b21pY19pbmMoJmV4cC0+dXNlKTsKLQltYXN0ZXJfaGVscC0+ZXhwZWN0aW5nKys7Ci0JbGlzdF9hZGQoJmV4cC0+bGlzdCwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCk7Ci0KLQlpbml0X3RpbWVyKCZleHAtPnRpbWVvdXQpOwotCWV4cC0+dGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZXhwOwotCWV4cC0+dGltZW91dC5mdW5jdGlvbiA9IGV4cGVjdGF0aW9uX3RpbWVkX291dDsKLQlleHAtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBtYXN0ZXJfaGVscC0+aGVscGVyLT50aW1lb3V0ICogSFo7Ci0JYWRkX3RpbWVyKCZleHAtPnRpbWVvdXQpOwotCi0JZXhwLT5pZCA9ICsrbmZfY29ubnRyYWNrX2V4cGVjdF9uZXh0X2lkOwotCWF0b21pY19pbmMoJmV4cC0+dXNlKTsKLQlORl9DVF9TVEFUX0lOQyhleHBlY3RfY3JlYXRlKTsKLX0KLQotLyogUmFjZSB3aXRoIGV4cGVjdGF0aW9ucyBiZWluZyB1c2VkIG1lYW5zIHdlIGNvdWxkIGhhdmUgbm9uZSB0byBmaW5kOyBPSy4gKi8KLXN0YXRpYyB2b2lkIGV2aWN0X29sZGVzdF9leHBlY3Qoc3RydWN0IG5mX2Nvbm4gKm1hc3RlcikKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChpLT5tYXN0ZXIgPT0gbWFzdGVyKSB7Ci0JCQlpZiAoZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgewotCQkJCW5mX2N0X3VubGlua19leHBlY3QoaSk7Ci0JCQkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmVmcmVzaF90aW1lcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaSkKLXsKLQlzdHJ1Y3QgbmZfY29ubl9oZWxwICptYXN0ZXJfaGVscCA9IG5mY3RfaGVscChpLT5tYXN0ZXIpOwotCi0JaWYgKCFkZWxfdGltZXIoJmktPnRpbWVvdXQpKQotCQlyZXR1cm4gMDsKLQotCWktPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBtYXN0ZXJfaGVscC0+aGVscGVyLT50aW1lb3V0KkhaOwotCWFkZF90aW1lcigmaS0+dGltZW91dCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCBuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdCkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKLQlzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyID0gZXhwZWN0LT5tYXN0ZXI7Ci0Jc3RydWN0IG5mX2Nvbm5faGVscCAqbWFzdGVyX2hlbHAgPSBuZmN0X2hlbHAobWFzdGVyKTsKLQlpbnQgcmV0OwotCi0JTkZfQ1RfQVNTRVJUKG1hc3Rlcl9oZWxwKTsKLQotCURFQlVHUCgibmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkICVwXG4iLCByZWxhdGVkX3RvKTsKLQlERUJVR1AoInR1cGxlOiAiKTsgTkZfQ1RfRFVNUF9UVVBMRSgmZXhwZWN0LT50dXBsZSk7Ci0JREVCVUdQKCJtYXNrOiAgIik7IE5GX0NUX0RVTVBfVFVQTEUoJmV4cGVjdC0+bWFzayk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChleHBlY3RfbWF0Y2hlcyhpLCBleHBlY3QpKSB7Ci0JCQkvKiBSZWZyZXNoIHRpbWVyOiBpZiBpdCdzIGR5aW5nLCBpZ25vcmUuLiAqLwotCQkJaWYgKHJlZnJlc2hfdGltZXIoaSkpIHsKLQkJCQlyZXQgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9IGVsc2UgaWYgKGV4cGVjdF9jbGFzaChpLCBleHBlY3QpKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQkvKiBXaWxsIGJlIG92ZXIgbGltaXQ/ICovCi0JaWYgKG1hc3Rlcl9oZWxwLT5oZWxwZXItPm1heF9leHBlY3RlZCAmJgotCSAgICBtYXN0ZXJfaGVscC0+ZXhwZWN0aW5nID49IG1hc3Rlcl9oZWxwLT5oZWxwZXItPm1heF9leHBlY3RlZCkKLQkJZXZpY3Rfb2xkZXN0X2V4cGVjdChtYXN0ZXIpOwotCi0JbmZfY29ubnRyYWNrX2V4cGVjdF9pbnNlcnQoZXhwZWN0KTsKLQluZl9jb25udHJhY2tfZXhwZWN0X2V2ZW50KElQRVhQX05FVywgZXhwZWN0KTsKLQlyZXQgPSAwOwotb3V0OgotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICptZSkKLXsKLQlpbnQgcmV0OwotCUJVR19PTihtZS0+dGltZW91dCA9PSAwKTsKLQotCXJldCA9IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9jYWNoZShORl9DVF9GX0hFTFAsICJuZl9jb25udHJhY2s6aGVscCIsCi0JCQkJCSAgc2l6ZW9mKHN0cnVjdCBuZl9jb25uKQotCQkJCQkgICsgc2l6ZW9mKHN0cnVjdCBuZl9jb25uX2hlbHApCi0JCQkJCSAgKyBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZfY29ubl9oZWxwKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJuZl9jb25udHJhY2tfaGVscGVyX3JlaWdzdGVyOiBVbmFibGUgdG8gY3JlYXRlIHNsYWIgY2FjaGUgZm9yIGNvbm50cmFja3NcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JbGlzdF9hZGQoJm1lLT5saXN0LCAmaGVscGVycyk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgotX19uZl9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmg7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZoZWxwZXJzLCBsaXN0KSB7Ci0JCWlmICghc3RyY21wKGgtPm5hbWUsIG5hbWUpKQotCQkJcmV0dXJuIGg7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bmhlbHAoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICppLAotCQkJICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqbWUpCi17Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhpKTsKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGN0KTsKIAotCWlmIChoZWxwICYmIGhlbHAtPmhlbHBlciA9PSBtZSkgewotCQluZl9jb25udHJhY2tfZXZlbnQoSVBDVF9IRUxQRVIsIGN0KTsKLQkJaGVscC0+aGVscGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICptZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwgKnRtcDsKLQotCS8qIE5lZWQgd3JpdGUgbG9jayBoZXJlLCB0byBkZWxldGUgaGVscGVyLiAqLwogCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlsaXN0X2RlbCgmbWUtPmxpc3QpOworCS8qIFNob3VsZCBiZSB1bmNvbmZpcm1lZCwgc28gbm90IGluIGhhc2ggdGFibGUgeWV0ICovCisJTkZfQ1RfQVNTRVJUKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKTsKIAotCS8qIEdldCByaWQgb2YgZXhwZWN0YXRpb25zICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4cCwgdG1wLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoZXhwLT5tYXN0ZXIpOwotCQlpZiAoaGVscC0+aGVscGVyID09IG1lICYmIGRlbF90aW1lcigmZXhwLT50aW1lb3V0KSkgewotCQkJbmZfY3RfdW5saW5rX2V4cGVjdChleHApOwotCQkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQkJfQotCX0KKwlERUJVR1AoIkFsdGVyaW5nIHJlcGx5IHR1cGxlIG9mICVwIHRvICIsIGN0KTsKKwlORl9DVF9EVU1QX1RVUExFKG5ld3JlcGx5KTsKIAotCS8qIEdldCByaWQgb2YgZXhwZWN0ZWRzLCBzZXQgaGVscGVycyB0byBOVUxMLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJnVuY29uZmlybWVkLCBsaXN0KQotCQl1bmhlbHAoaCwgbWUpOwotCWZvciAoaSA9IDA7IGkgPCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZuZl9jb25udHJhY2tfaGFzaFtpXSwgbGlzdCkKLQkJCXVuaGVscChoLCBtZSk7Ci0JfQorCWN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSA9ICpuZXdyZXBseTsKKwlpZiAoIWN0LT5tYXN0ZXIgJiYgaGVscCAmJiBoZWxwLT5leHBlY3RpbmcgPT0gMCkKKwkJaGVscC0+aGVscGVyID0gX19uZl9jdF9oZWxwZXJfZmluZChuZXdyZXBseSk7CiAJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0KLQkvKiBTb21lb25lIGNvdWxkIGJlIHN0aWxsIGxvb2tpbmcgYXQgdGhlIGhlbHBlciBpbiBhIGJoLiAqLwotCXN5bmNocm9uaXplX25ldCgpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2FsdGVyX3JlcGx5KTsKIAogLyogUmVmcmVzaCBjb25udHJhY2sgZm9yIHRoaXMgbWFueSBqaWZmaWVzIGFuZCBkbyBhY2NvdW50aW5nIGlmIGRvX2FjY3QgaXMgMSAqLwogdm9pZCBfX25mX2N0X3JlZnJlc2hfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCkBAIC0xMzk5LDkgKzkyNSwxNCBAQAogCQljdC0+dGltZW91dC5leHBpcmVzID0gZXh0cmFfamlmZmllczsKIAkJZXZlbnQgPSBJUENUX1JFRlJFU0g7CiAJfSBlbHNlIHsKLQkJLyogTmVlZCBkZWxfdGltZXIgZm9yIHJhY2UgYXZvaWRhbmNlIChtYXkgYWxyZWFkeSBiZSBkeWluZykuICovCi0JCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkgewotCQkJY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBleHRyYV9qaWZmaWVzOworCQl1bnNpZ25lZCBsb25nIG5ld3RpbWUgPSBqaWZmaWVzICsgZXh0cmFfamlmZmllczsKKworCQkvKiBPbmx5IHVwZGF0ZSB0aGUgdGltZW91dCBpZiB0aGUgbmV3IHRpbWVvdXQgaXMgYXQgbGVhc3QKKwkJICAgSFogamlmZmllcyBmcm9tIHRoZSBvbGQgdGltZW91dC4gTmVlZCBkZWxfdGltZXIgZm9yIHJhY2UKKwkJICAgYXZvaWRhbmNlIChtYXkgYWxyZWFkeSBiZSBkeWluZykuICovCisJCWlmIChuZXd0aW1lIC0gY3QtPnRpbWVvdXQuZXhwaXJlcyA+PSBIWgorCQkgICAgJiYgZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpIHsKKwkJCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBuZXd0aW1lOwogCQkJYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7CiAJCQlldmVudCA9IElQQ1RfUkVGUkVTSDsKIAkJfQpAQCAtMTQxMiw5ICs5NDMsMTAgQEAKIAkJY3QtPmNvdW50ZXJzW0NUSU5GTzJESVIoY3RpbmZvKV0ucGFja2V0cysrOwogCQljdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5ieXRlcyArPQogCQkJc2tiLT5sZW4gLSAodW5zaWduZWQgaW50KShza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JaWYgKChjdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzICYgMHg4MDAwMDAwMCkKLQkgICAgfHwgKGN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICYgMHg4MDAwMDAwMCkpCi0JCWV2ZW50IHw9IElQQ1RfQ09VTlRFUl9GSUxMSU5HOworCisJCWlmICgoY3QtPmNvdW50ZXJzW0NUSU5GTzJESVIoY3RpbmZvKV0ucGFja2V0cyAmIDB4ODAwMDAwMDApCisJCSAgICB8fCAoY3QtPmNvdW50ZXJzW0NUSU5GTzJESVIoY3RpbmZvKV0uYnl0ZXMgJiAweDgwMDAwMDAwKSkKKwkJCWV2ZW50IHw9IElQQ1RfQ09VTlRFUl9GSUxMSU5HOwogCX0KICNlbmRpZgogCkBAIC0xNDI0LDYgKzk1Niw3IEBACiAJaWYgKGV2ZW50KQogCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoZXZlbnQsIHNrYik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChfX25mX2N0X3JlZnJlc2hfYWNjdCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCkBAIC0xNDQ4LDYgKzk4MSw3IEBACiBuZmF0dHJfZmFpbHVyZToKIAlyZXR1cm4gLTE7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9wb3J0X3R1cGxlX3RvX25mYXR0cik7CiAKIHN0YXRpYyBjb25zdCBzaXplX3QgY3RhX21pbl9wcm90b1tDVEFfUFJPVE9fTUFYXSA9IHsKIAlbQ1RBX1BST1RPX1NSQ19QT1JULTFdICA9IHNpemVvZih1X2ludDE2X3QpLApAQCAtMTQ2MywxMyArOTk3LDEyIEBACiAJaWYgKG5mYXR0cl9iYWRfc2l6ZSh0YiwgQ1RBX1BST1RPX01BWCwgY3RhX21pbl9wcm90bykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdC0+c3JjLnUudGNwLnBvcnQgPQotCQkqKHVfaW50MTZfdCAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT19TUkNfUE9SVC0xXSk7Ci0JdC0+ZHN0LnUudGNwLnBvcnQgPQotCQkqKHVfaW50MTZfdCAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT19EU1RfUE9SVC0xXSk7CisJdC0+c3JjLnUudGNwLnBvcnQgPSAqKF9fYmUxNiAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT19TUkNfUE9SVC0xXSk7CisJdC0+ZHN0LnUudGNwLnBvcnQgPSAqKF9fYmUxNiAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT19EU1RfUE9SVC0xXSk7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlKTsKICNlbmRpZgogCiAvKiBVc2VkIGJ5IGlwdF9SRUpFQ1QgYW5kIGlwNnRfUkVKRUNULiAqLwpAQCAtMTQ5MCw2ICsxMDIzLDcgQEAKIAluc2tiLT5uZmN0aW5mbyA9IGN0aW5mbzsKIAluZl9jb25udHJhY2tfZ2V0KG5za2ItPm5mY3QpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jb25udHJhY2tfYXR0YWNoKTsKIAogc3RhdGljIGlubGluZSBpbnQKIGRvX2l0ZXIoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICppLApAQCAtMTUyMCw5ICsxMDU0LDEwIEBACiAJCWlmIChpdGVyKGN0LCBkYXRhKSkKIAkJCWdvdG8gZm91bmQ7CiAJfQorCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCXJldHVybiBOVUxMOwogZm91bmQ6Ci0JYXRvbWljX2luYygmbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKS0+Y3RfZ2VuZXJhbC51c2UpOworCWF0b21pY19pbmMoJmN0LT5jdF9nZW5lcmFsLnVzZSk7CiAJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJcmV0dXJuIGN0OwogfQpAQCAtMTU0Miw2ICsxMDc3LDcgQEAKIAkJbmZfY3RfcHV0KGN0KTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9pdGVyYXRlX2NsZWFudXApOwogCiBzdGF0aWMgaW50IGtpbGxfYWxsKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKQogewpAQCAtMTU1NywxMCArMTA5MywxMSBAQAogCQkJICAgZ2V0X29yZGVyKHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSAqIHNpemUpKTsKIH0KIAotdm9pZCBuZl9jb25udHJhY2tfZmx1c2goKQordm9pZCBuZl9jb25udHJhY2tfZmx1c2godm9pZCkKIHsKIAluZl9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9hbGwsIE5VTEwpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2ZsdXNoKTsKIAogLyogTWlzaGVhcmluZyB0aGUgdm9pY2VzIGluIGhpcyBoZWFkLCBvdXIgaGVybyB3b25kZXJzIGhvdyBoZSdzCiAgICBzdXBwb3NlZCB0byBraWxsIHRoZSBtYWxsLiAqLwpAQCAtMTU5OCw2ICsxMTM1LDggQEAKIAlmcmVlX2Nvbm50cmFja19oYXNoKG5mX2Nvbm50cmFja19oYXNoLCBuZl9jb25udHJhY2tfdm1hbGxvYywKIAkJCSAgICBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUpOwogCisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYyk7CisKIAkvKiBmcmVlIGwzcHJvdG8gcHJvdG9jb2wgdGFibGVzICovCiAJZm9yIChpID0gMDsgaSA8IFBGX01BWDsgaSsrKQogCQlpZiAobmZfY3RfcHJvdG9zW2ldKSB7CkBAIC0xNzIzLDEwICsxMjYyLDE0IEBACiAJCWdvdG8gZXJyX2ZyZWVfY29ubnRyYWNrX3NsYWI7CiAJfQogCisJcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9mcmVlX2V4cGVjdF9zbGFiOworCiAJLyogRG9uJ3QgTkVFRCBsb2NrIGhlcmUsIGJ1dCBnb29kIGZvcm0gYW55d2F5LiAqLwogCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBGX01BWDsgaSsrKQotCQluZl9jdF9sM3Byb3Rvc1tpXSA9ICZuZl9jb25udHJhY2tfZ2VuZXJpY19sM3Byb3RvOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUZfTUFYOyBpKyspCisJCW5mX2N0X2wzcHJvdG9zW2ldID0gJm5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWM7CiAgICAgICAgIHdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCiAJLyogRm9yIHVzZSBieSBSRUpFQ1QgdGFyZ2V0ICovCkBAIC0xNzQwLDYgKzEyODMsOCBAQAogCiAJcmV0dXJuIHJldDsKIAorb3V0X2ZyZWVfZXhwZWN0X3NsYWI6CisJa21lbV9jYWNoZV9kZXN0cm95KG5mX2Nvbm50cmFja19leHBlY3RfY2FjaGVwKTsKIGVycl9mcmVlX2Nvbm50cmFja19zbGFiOgogCW5mX2Nvbm50cmFja191bnJlZ2lzdGVyX2NhY2hlKE5GX0NUX0ZfQkFTSUMpOwogZXJyX2ZyZWVfaGFzaDoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyMjNlMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIEV2ZW50IGNhY2hlIGZvciBuZXRmaWx0ZXIuICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqIChDKSAyMDAzLDIwMDQgVVNBR0kvV0lERSBQcm9qZWN0IDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KKworQVRPTUlDX05PVElGSUVSX0hFQUQobmZfY29ubnRyYWNrX2NoYWluKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19jaGFpbik7CisKK0FUT01JQ19OT1RJRklFUl9IRUFEKG5mX2Nvbm50cmFja19leHBlY3RfY2hhaW4pOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbik7CisKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlLCBuZl9jb25udHJhY2tfZWNhY2hlKTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2VjYWNoZSk7CisKKy8qIGRlbGl2ZXIgY2FjaGVkIGV2ZW50cyBhbmQgY2xlYXIgY2FjaGUgZW50cnkgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2FsbHkKKyAqIGRpc2FibGVkIHNvZnRpcnFzICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGUpCit7CisJaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChlY2FjaGUtPmN0KSAmJiAhbmZfY3RfaXNfZHlpbmcoZWNhY2hlLT5jdCkKKwkgICAgJiYgZWNhY2hlLT5ldmVudHMpCisJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZuZl9jb25udHJhY2tfY2hhaW4sIGVjYWNoZS0+ZXZlbnRzLAorCQkJCSAgICBlY2FjaGUtPmN0KTsKKworCWVjYWNoZS0+ZXZlbnRzID0gMDsKKwluZl9jdF9wdXQoZWNhY2hlLT5jdCk7CisJZWNhY2hlLT5jdCA9IE5VTEw7Cit9CisKKy8qIERlbGl2ZXIgYWxsIGNhY2hlZCBldmVudHMgZm9yIGEgcGFydGljdWxhciBjb25udHJhY2suIFRoaXMgaXMgY2FsbGVkCisgKiBieSBjb2RlIHByaW9yIHRvIGFzeW5jIHBhY2tldCBoYW5kbGluZyBmb3IgZnJlZWluZyB0aGUgc2tiICovCit2b2lkIG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwllY2FjaGUgPSAmX19nZXRfY3B1X3ZhcihuZl9jb25udHJhY2tfZWNhY2hlKTsKKwlpZiAoZWNhY2hlLT5jdCA9PSBjdCkKKwkJX19uZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoZWNhY2hlKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyk7CisKKy8qIERlbGl2ZXIgY2FjaGVkIGV2ZW50cyBmb3Igb2xkIHBlbmRpbmcgZXZlbnRzLCBpZiBjdXJyZW50IGNvbm50cmFjayAhPSBvbGQgKi8KK3ZvaWQgX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOworCisJLyogdGFrZSBjYXJlIG9mIGRlbGl2ZXJpbmcgcG90ZW50aWFsbHkgb2xkIGV2ZW50cyAqLworCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKG5mX2Nvbm50cmFja19lY2FjaGUpOworCUJVR19PTihlY2FjaGUtPmN0ID09IGN0KTsKKwlpZiAoZWNhY2hlLT5jdCkKKwkJX19uZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoZWNhY2hlKTsKKwkvKiBpbml0aWFsaXplIGZvciB0aGlzIGNvbm50cmFjay9wYWNrZXQgKi8KKwllY2FjaGUtPmN0ID0gY3Q7CisJbmZfY29ubnRyYWNrX2dldCgmY3QtPmN0X2dlbmVyYWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jdF9ldmVudF9jYWNoZV9pbml0KTsKKworLyogZmx1c2ggdGhlIGV2ZW50IGNhY2hlIC0gdG91Y2hlcyBvdGhlciBDUFUncyBkYXRhIGFuZCBtdXN0IG5vdCBiZSBjYWxsZWQKKyAqIHdoaWxlIHBhY2tldHMgYXJlIHN0aWxsIHBhc3NpbmcgdGhyb3VnaCB0aGUgY29kZSAqLwordm9pZCBuZl9jdF9ldmVudF9jYWNoZV9mbHVzaCh2b2lkKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJZWNhY2hlID0gJnBlcl9jcHUobmZfY29ubnRyYWNrX2VjYWNoZSwgY3B1KTsKKwkJaWYgKGVjYWNoZS0+Y3QpCisJCQluZl9jdF9wdXQoZWNhY2hlLT5jdCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmY5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuYwpAQCAtMCwwICsxLDQ0NSBAQAorLyogRXhwZWN0YXRpb24gaGFuZGxpbmcgZm9yIG5mX2Nvbm50cmFjay4gKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICogKEMpIDIwMDMsMjAwNCBVU0FHSS9XSURFIFByb2plY3QgPGh0dHA6Ly93d3cubGludXgtaXB2Ni5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgorCitMSVNUX0hFQUQobmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19leHBlY3RfbGlzdCk7CisKK3N0cnVjdCBrbWVtX2NhY2hlICpuZl9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfZXhwZWN0X25leHRfaWQ7CisKKy8qIG5mX2Nvbm50cmFja19leHBlY3QgaGVscGVyIGZ1bmN0aW9ucyAqLwordm9pZCBuZl9jdF91bmxpbmtfZXhwZWN0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqbWFzdGVyX2hlbHAgPSBuZmN0X2hlbHAoZXhwLT5tYXN0ZXIpOworCisJTkZfQ1RfQVNTRVJUKG1hc3Rlcl9oZWxwKTsKKwlORl9DVF9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOworCisJbGlzdF9kZWwoJmV4cC0+bGlzdCk7CisJTkZfQ1RfU1RBVF9JTkMoZXhwZWN0X2RlbGV0ZSk7CisJbWFzdGVyX2hlbHAtPmV4cGVjdGluZy0tOworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF91bmxpbmtfZXhwZWN0KTsKKworc3RhdGljIHZvaWQgZXhwZWN0YXRpb25fdGltZWRfb3V0KHVuc2lnbmVkIGxvbmcgdWxfZXhwZWN0KQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAgPSAodm9pZCAqKXVsX2V4cGVjdDsKKworCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwluZl9jdF91bmxpbmtfZXhwZWN0KGV4cCk7CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKK30KKworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgorX19uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKG5mX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaS0+dHVwbGUsICZpLT5tYXNrKSkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKTsKKworLyogSnVzdCBmaW5kIGEgZXhwZWN0YXRpb24gY29ycmVzcG9uZGluZyB0byBhIHR1cGxlLiAqLworc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKgorbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKKworCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWkgPSBfX25mX2Nvbm50cmFja19leHBlY3RfZmluZCh0dXBsZSk7CisJaWYgKGkpCisJCWF0b21pY19pbmMoJmktPnVzZSk7CisJcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCXJldHVybiBpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCk7CisKKy8qIElmIGFuIGV4cGVjdGF0aW9uIGZvciB0aGlzIGNvbm5lY3Rpb24gaXMgZm91bmQsIGl0IGdldHMgZGVsZXRlIGZyb20KKyAqIGdsb2JhbCBsaXN0IHRoZW4gcmV0dXJuZWQuICovCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqCitmaW5kX2V4cGVjdGF0aW9uKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisKKwlleHAgPSBfX25mX2Nvbm50cmFja19leHBlY3RfZmluZCh0dXBsZSk7CisJaWYgKCFleHApCisJCXJldHVybiBOVUxMOworCisJLyogSWYgbWFzdGVyIGlzIG5vdCBpbiBoYXNoIHRhYmxlIHlldCAoaWUuIHBhY2tldCBoYXNuJ3QgbGVmdAorCSAgIHRoaXMgbWFjaGluZSB5ZXQpLCBob3cgY2FuIG90aGVyIGVuZCBrbm93IGFib3V0IGV4cGVjdGVkPworCSAgIEhlbmNlIHRoZXNlIGFyZSBub3QgdGhlIGRyb2lkcyB5b3UgYXJlIGxvb2tpbmcgZm9yIChpZgorCSAgIG1hc3RlciBjdCBuZXZlciBnb3QgY29uZmlybWVkLCB3ZSdkIGhvbGQgYSByZWZlcmVuY2UgdG8gaXQKKwkgICBhbmQgd2VpcmQgdGhpbmdzIHdvdWxkIGhhcHBlbiB0byBmdXR1cmUgcGFja2V0cykuICovCisJaWYgKCFuZl9jdF9pc19jb25maXJtZWQoZXhwLT5tYXN0ZXIpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChleHAtPmZsYWdzICYgTkZfQ1RfRVhQRUNUX1BFUk1BTkVOVCkgeworCQlhdG9taWNfaW5jKCZleHAtPnVzZSk7CisJCXJldHVybiBleHA7CisJfSBlbHNlIGlmIChkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKKwkJbmZfY3RfdW5saW5rX2V4cGVjdChleHApOworCQlyZXR1cm4gZXhwOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBkZWxldGUgYWxsIGV4cGVjdGF0aW9ucyBmb3IgdGhpcyBjb25udHJhY2sgKi8KK3ZvaWQgbmZfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyhzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmksICp0bXA7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChjdCk7CisKKwkvKiBPcHRpbWl6YXRpb246IG1vc3QgY29ubmVjdGlvbiBuZXZlciBleHBlY3QgYW55IG90aGVycy4gKi8KKwlpZiAoIWhlbHAgfHwgaGVscC0+ZXhwZWN0aW5nID09IDApCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpLCB0bXAsICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGktPm1hc3RlciA9PSBjdCAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7CisJCQluZl9jdF91bmxpbmtfZXhwZWN0KGkpOworCQkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7CisgCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyk7CisKKy8qIFdvdWxkIHR3byBleHBlY3RlZCB0aGluZ3MgY2xhc2g/ICovCitzdGF0aWMgaW5saW5lIGludCBleHBlY3RfY2xhc2goY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmEsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmIpCit7CisJLyogUGFydCBjb3ZlcmVkIGJ5IGludGVyc2VjdGlvbiBvZiBtYXNrcyBtdXN0IGJlIHVuZXF1YWwsCisJICAgb3RoZXJ3aXNlIHRoZXkgY2xhc2ggKi8KKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIGludGVyc2VjdF9tYXNrOworCWludCBjb3VudDsKKworCWludGVyc2VjdF9tYXNrLnNyYy5sM251bSA9IGEtPm1hc2suc3JjLmwzbnVtICYgYi0+bWFzay5zcmMubDNudW07CisJaW50ZXJzZWN0X21hc2suc3JjLnUuYWxsID0gYS0+bWFzay5zcmMudS5hbGwgJiBiLT5tYXNrLnNyYy51LmFsbDsKKwlpbnRlcnNlY3RfbWFzay5kc3QudS5hbGwgPSBhLT5tYXNrLmRzdC51LmFsbCAmIGItPm1hc2suZHN0LnUuYWxsOworCWludGVyc2VjdF9tYXNrLmRzdC5wcm90b251bSA9IGEtPm1hc2suZHN0LnByb3RvbnVtCisJCQkJCSYgYi0+bWFzay5kc3QucHJvdG9udW07CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBORl9DVF9UVVBMRV9MM1NJWkU7IGNvdW50KyspeworCQlpbnRlcnNlY3RfbWFzay5zcmMudTMuYWxsW2NvdW50XSA9CisJCQlhLT5tYXNrLnNyYy51My5hbGxbY291bnRdICYgYi0+bWFzay5zcmMudTMuYWxsW2NvdW50XTsKKwl9CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBORl9DVF9UVVBMRV9MM1NJWkU7IGNvdW50KyspeworCQlpbnRlcnNlY3RfbWFzay5kc3QudTMuYWxsW2NvdW50XSA9CisJCQlhLT5tYXNrLmRzdC51My5hbGxbY291bnRdICYgYi0+bWFzay5kc3QudTMuYWxsW2NvdW50XTsKKwl9CisKKwlyZXR1cm4gbmZfY3RfdHVwbGVfbWFza19jbXAoJmEtPnR1cGxlLCAmYi0+dHVwbGUsICZpbnRlcnNlY3RfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4cGVjdF9tYXRjaGVzKGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICphLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqYikKK3sKKwlyZXR1cm4gYS0+bWFzdGVyID09IGItPm1hc3RlcgorCQkmJiBuZl9jdF90dXBsZV9lcXVhbCgmYS0+dHVwbGUsICZiLT50dXBsZSkKKwkJJiYgbmZfY3RfdHVwbGVfZXF1YWwoJmEtPm1hc2ssICZiLT5tYXNrKTsKK30KKworLyogR2VuZXJhbGx5IGEgYmFkIGlkZWEgdG8gY2FsbCB0aGlzOiBjb3VsZCBoYXZlIG1hdGNoZWQgYWxyZWFkeS4gKi8KK3ZvaWQgbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKKworCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwkvKiBjaG9vc2UgdGhlIHRoZSBvbGRlc3QgZXhwZWN0YXRpb24gdG8gZXZpY3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaSwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgeworCQlpZiAoZXhwZWN0X21hdGNoZXMoaSwgZXhwKSAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7CisJCQluZl9jdF91bmxpbmtfZXhwZWN0KGkpOworCQkJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKTsKKworLyogV2UgZG9uJ3QgaW5jcmVhc2UgdGhlIG1hc3RlciBjb25udHJhY2sgcmVmY291bnQgZm9yIG5vbi1mdWxmaWxsZWQKKyAqIGNvbm50cmFja3MuIER1cmluZyB0aGUgY29ubnRyYWNrIGRlc3RydWN0aW9uLCB0aGUgZXhwZWN0YXRpb25zIGFyZQorICogYWx3YXlzIGtpbGxlZCBiZWZvcmUgdGhlIGNvbm50cmFjayBpdHNlbGYgKi8KK3N0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKHN0cnVjdCBuZl9jb25uICptZSkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqbmV3OworCisJbmV3ID0ga21lbV9jYWNoZV9hbGxvYyhuZl9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCwgR0ZQX0FUT01JQyk7CisJaWYgKCFuZXcpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5tYXN0ZXIgPSBtZTsKKwlhdG9taWNfc2V0KCZuZXctPnVzZSwgMSk7CisJcmV0dXJuIG5ldzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MpOworCit2b2lkIG5mX2Nvbm50cmFja19leHBlY3RfaW5pdChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLCBpbnQgZmFtaWx5LAorCQkJICAgICAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKnNhZGRyLAorCQkJICAgICAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmRhZGRyLAorCQkJICAgICAgdV9pbnQ4X3QgcHJvdG8sIF9fYmUxNiAqc3JjLCBfX2JlMTYgKmRzdCkKK3sKKwlpbnQgbGVuOworCisJaWYgKGZhbWlseSA9PSBBRl9JTkVUKQorCQlsZW4gPSA0OworCWVsc2UKKwkJbGVuID0gMTY7CisKKwlleHAtPmZsYWdzID0gMDsKKwlleHAtPmV4cGVjdGZuID0gTlVMTDsKKwlleHAtPmhlbHBlciA9IE5VTEw7CisJZXhwLT50dXBsZS5zcmMubDNudW0gPSBmYW1pbHk7CisJZXhwLT50dXBsZS5kc3QucHJvdG9udW0gPSBwcm90bzsKKwlleHAtPm1hc2suc3JjLmwzbnVtID0gMHhGRkZGOworCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOworCisJaWYgKHNhZGRyKSB7CisJCW1lbWNweSgmZXhwLT50dXBsZS5zcmMudTMsIHNhZGRyLCBsZW4pOworCQlpZiAoc2l6ZW9mKGV4cC0+dHVwbGUuc3JjLnUzKSA+IGxlbikKKwkJCS8qIGFkZHJlc3MgbmVlZHMgdG8gYmUgY2xlYXJlZCBmb3IgbmZfY3RfdHVwbGVfZXF1YWwgKi8KKwkJCW1lbXNldCgodm9pZCAqKSZleHAtPnR1cGxlLnNyYy51MyArIGxlbiwgMHgwMCwKKwkJCSAgICAgICBzaXplb2YoZXhwLT50dXBsZS5zcmMudTMpIC0gbGVuKTsKKwkJbWVtc2V0KCZleHAtPm1hc2suc3JjLnUzLCAweEZGLCBsZW4pOworCQlpZiAoc2l6ZW9mKGV4cC0+bWFzay5zcmMudTMpID4gbGVuKQorCQkJbWVtc2V0KCh2b2lkICopJmV4cC0+bWFzay5zcmMudTMgKyBsZW4sIDB4MDAsCisJCQkgICAgICAgc2l6ZW9mKGV4cC0+bWFzay5zcmMudTMpIC0gbGVuKTsKKwl9IGVsc2UgeworCQltZW1zZXQoJmV4cC0+dHVwbGUuc3JjLnUzLCAweDAwLCBzaXplb2YoZXhwLT50dXBsZS5zcmMudTMpKTsKKwkJbWVtc2V0KCZleHAtPm1hc2suc3JjLnUzLCAweDAwLCBzaXplb2YoZXhwLT5tYXNrLnNyYy51MykpOworCX0KKworCWlmIChkYWRkcikgeworCQltZW1jcHkoJmV4cC0+dHVwbGUuZHN0LnUzLCBkYWRkciwgbGVuKTsKKwkJaWYgKHNpemVvZihleHAtPnR1cGxlLmRzdC51MykgPiBsZW4pCisJCQkvKiBhZGRyZXNzIG5lZWRzIHRvIGJlIGNsZWFyZWQgZm9yIG5mX2N0X3R1cGxlX2VxdWFsICovCisJCQltZW1zZXQoKHZvaWQgKikmZXhwLT50dXBsZS5kc3QudTMgKyBsZW4sIDB4MDAsCisJCQkgICAgICAgc2l6ZW9mKGV4cC0+dHVwbGUuZHN0LnUzKSAtIGxlbik7CisJCW1lbXNldCgmZXhwLT5tYXNrLmRzdC51MywgMHhGRiwgbGVuKTsKKwkJaWYgKHNpemVvZihleHAtPm1hc2suZHN0LnUzKSA+IGxlbikKKwkJCW1lbXNldCgodm9pZCAqKSZleHAtPm1hc2suZHN0LnUzICsgbGVuLCAweDAwLAorCQkJICAgICAgIHNpemVvZihleHAtPm1hc2suZHN0LnUzKSAtIGxlbik7CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZleHAtPnR1cGxlLmRzdC51MywgMHgwMCwgc2l6ZW9mKGV4cC0+dHVwbGUuZHN0LnUzKSk7CisJCW1lbXNldCgmZXhwLT5tYXNrLmRzdC51MywgMHgwMCwgc2l6ZW9mKGV4cC0+bWFzay5kc3QudTMpKTsKKwl9CisKKwlpZiAoc3JjKSB7CisJCWV4cC0+dHVwbGUuc3JjLnUuYWxsID0gKF9fZm9yY2UgdTE2KSpzcmM7CisJCWV4cC0+bWFzay5zcmMudS5hbGwgPSAweEZGRkY7CisJfSBlbHNlIHsKKwkJZXhwLT50dXBsZS5zcmMudS5hbGwgPSAwOworCQlleHAtPm1hc2suc3JjLnUuYWxsID0gMDsKKwl9CisKKwlpZiAoZHN0KSB7CisJCWV4cC0+dHVwbGUuZHN0LnUuYWxsID0gKF9fZm9yY2UgdTE2KSpkc3Q7CisJCWV4cC0+bWFzay5kc3QudS5hbGwgPSAweEZGRkY7CisJfSBlbHNlIHsKKwkJZXhwLT50dXBsZS5kc3QudS5hbGwgPSAwOworCQlleHAtPm1hc2suZHN0LnUuYWxsID0gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZXhwZWN0X2luaXQpOworCit2b2lkIG5mX2Nvbm50cmFja19leHBlY3RfcHV0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmV4cC0+dXNlKSkKKwkJa21lbV9jYWNoZV9mcmVlKG5mX2Nvbm50cmFja19leHBlY3RfY2FjaGVwLCBleHApOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9wdXQpOworCitzdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfZXhwZWN0X2luc2VydChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQoreworCXN0cnVjdCBuZl9jb25uX2hlbHAgKm1hc3Rlcl9oZWxwID0gbmZjdF9oZWxwKGV4cC0+bWFzdGVyKTsKKworCWF0b21pY19pbmMoJmV4cC0+dXNlKTsKKwltYXN0ZXJfaGVscC0+ZXhwZWN0aW5nKys7CisJbGlzdF9hZGQoJmV4cC0+bGlzdCwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCk7CisKKwlpbml0X3RpbWVyKCZleHAtPnRpbWVvdXQpOworCWV4cC0+dGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZXhwOworCWV4cC0+dGltZW91dC5mdW5jdGlvbiA9IGV4cGVjdGF0aW9uX3RpbWVkX291dDsKKwlleHAtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBtYXN0ZXJfaGVscC0+aGVscGVyLT50aW1lb3V0ICogSFo7CisJYWRkX3RpbWVyKCZleHAtPnRpbWVvdXQpOworCisJZXhwLT5pZCA9ICsrbmZfY29ubnRyYWNrX2V4cGVjdF9uZXh0X2lkOworCWF0b21pY19pbmMoJmV4cC0+dXNlKTsKKwlORl9DVF9TVEFUX0lOQyhleHBlY3RfY3JlYXRlKTsKK30KKworLyogUmFjZSB3aXRoIGV4cGVjdGF0aW9ucyBiZWluZyB1c2VkIG1lYW5zIHdlIGNvdWxkIGhhdmUgbm9uZSB0byBmaW5kOyBPSy4gKi8KK3N0YXRpYyB2b2lkIGV2aWN0X29sZGVzdF9leHBlY3Qoc3RydWN0IG5mX2Nvbm4gKm1hc3RlcikKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpLCAmbmZfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7CisJCWlmIChpLT5tYXN0ZXIgPT0gbWFzdGVyKSB7CisJCQlpZiAoZGVsX3RpbWVyKCZpLT50aW1lb3V0KSkgeworCQkJCW5mX2N0X3VubGlua19leHBlY3QoaSk7CisJCQkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgcmVmcmVzaF90aW1lcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaSkKK3sKKwlzdHJ1Y3QgbmZfY29ubl9oZWxwICptYXN0ZXJfaGVscCA9IG5mY3RfaGVscChpLT5tYXN0ZXIpOworCisJaWYgKCFkZWxfdGltZXIoJmktPnRpbWVvdXQpKQorCQlyZXR1cm4gMDsKKworCWktPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBtYXN0ZXJfaGVscC0+aGVscGVyLT50aW1lb3V0KkhaOworCWFkZF90aW1lcigmaS0+dGltZW91dCk7CisJcmV0dXJuIDE7Cit9CisKK2ludCBuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdCkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqaTsKKwlzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyID0gZXhwZWN0LT5tYXN0ZXI7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqbWFzdGVyX2hlbHAgPSBuZmN0X2hlbHAobWFzdGVyKTsKKwlpbnQgcmV0OworCisJTkZfQ1RfQVNTRVJUKG1hc3Rlcl9oZWxwKTsKKworCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGV4cGVjdF9tYXRjaGVzKGksIGV4cGVjdCkpIHsKKwkJCS8qIFJlZnJlc2ggdGltZXI6IGlmIGl0J3MgZHlpbmcsIGlnbm9yZS4uICovCisJCQlpZiAocmVmcmVzaF90aW1lcihpKSkgeworCQkJCXJldCA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSBpZiAoZXhwZWN0X2NsYXNoKGksIGV4cGVjdCkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCS8qIFdpbGwgYmUgb3ZlciBsaW1pdD8gKi8KKwlpZiAobWFzdGVyX2hlbHAtPmhlbHBlci0+bWF4X2V4cGVjdGVkICYmCisJICAgIG1hc3Rlcl9oZWxwLT5leHBlY3RpbmcgPj0gbWFzdGVyX2hlbHAtPmhlbHBlci0+bWF4X2V4cGVjdGVkKQorCQlldmljdF9vbGRlc3RfZXhwZWN0KG1hc3Rlcik7CisKKwluZl9jb25udHJhY2tfZXhwZWN0X2luc2VydChleHBlY3QpOworCW5mX2Nvbm50cmFja19leHBlY3RfZXZlbnQoSVBFWFBfTkVXLCBleHBlY3QpOworCXJldCA9IDA7CitvdXQ6CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHZvaWQgKmV4cF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplID0gJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdDsKKwlsb2ZmX3QgaTsKKworCS8qIHN0cmFuZ2Ugc2VxX2ZpbGUgYXBpIGNhbGxzIHN0b3AgZXZlbiBpZiB3ZSBmYWlsLAorCSAqIHRodXMgd2UgbmVlZCB0byBncmFiIGxvY2sgc2luY2Ugc3RvcCB1bmxvY2tzICovCisJcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisKKwlpZiAobGlzdF9lbXB0eShlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDw9ICpwb3M7IGkrKykgeworCQllID0gZS0+bmV4dDsKKwkJaWYgKGUgPT0gJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCkKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQgKmV4cF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmUgPSB2OworCisJKysqcG9zOworCWUgPSBlLT5uZXh0OworCisJaWYgKGUgPT0gJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZTsKK30KKworc3RhdGljIHZvaWQgZXhwX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworfQorCitzdGF0aWMgaW50IGV4cF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdCA9IHY7CisKKwlpZiAoZXhwZWN0LT50aW1lb3V0LmZ1bmN0aW9uKQorCQlzZXFfcHJpbnRmKHMsICIlbGQgIiwgdGltZXJfcGVuZGluZygmZXhwZWN0LT50aW1lb3V0KQorCQkJICAgPyAobG9uZykoZXhwZWN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDApOworCWVsc2UKKwkJc2VxX3ByaW50ZihzLCAiLSAiKTsKKwlzZXFfcHJpbnRmKHMsICJsM3Byb3RvID0gJXUgcHJvdG89JXUgIiwKKwkJICAgZXhwZWN0LT50dXBsZS5zcmMubDNudW0sCisJCSAgIGV4cGVjdC0+dHVwbGUuZHN0LnByb3RvbnVtKTsKKwlwcmludF90dXBsZShzLCAmZXhwZWN0LT50dXBsZSwKKwkJICAgIF9fbmZfY3RfbDNwcm90b19maW5kKGV4cGVjdC0+dHVwbGUuc3JjLmwzbnVtKSwKKwkJICAgIF9fbmZfY3RfbDRwcm90b19maW5kKGV4cGVjdC0+dHVwbGUuc3JjLmwzbnVtLAorCQkJCSAgICAgICBleHBlY3QtPnR1cGxlLmRzdC5wcm90b251bSkpOworCXJldHVybiBzZXFfcHV0YyhzLCAnXG4nKTsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBleHBfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBleHBfc2VxX3N0YXJ0LAorCS5uZXh0ID0gZXhwX3NlcV9uZXh0LAorCS5zdG9wID0gZXhwX3NlcV9zdG9wLAorCS5zaG93ID0gZXhwX3NlcV9zaG93Cit9OworCitzdGF0aWMgaW50IGV4cF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmZXhwX3NlcV9vcHMpOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4cF9maWxlX29wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gZXhwX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlCit9OworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCmluZGV4IDBjMTdhNWIuLjkyYTk0NzEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCkBAIC0yNiwxMiArMjYsMTUgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIlJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiZnRwIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7CitNT0RVTEVfQUxJQVMoImlwX2Nvbm50cmFja19mdHAiKTsKIAogLyogVGhpcyBpcyBzbG93LCBidXQgaXQncyBzaW1wbGUuIC0tUlIgKi8KIHN0YXRpYyBjaGFyICpmdHBfYnVmZmVyOwpAQCAtNDgsNyArNTEsNyBAQAogCiB1bnNpZ25lZCBpbnQgKCpuZl9uYXRfZnRwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKIAkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQllbnVtIGlwX2N0X2Z0cF90eXBlIHR5cGUsCisJCQkJZW51bSBuZl9jdF9mdHBfdHlwZSB0eXBlLAogCQkJCXVuc2lnbmVkIGludCBtYXRjaG9mZiwKIAkJCQl1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCiAJCQkJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwKQEAgLTcxLDcgKzc0LDcgQEAKIAlzaXplX3QgcGxlbjsKIAljaGFyIHNraXA7CiAJY2hhciB0ZXJtOwotCWVudW0gaXBfY3RfZnRwX3R5cGUgZnRwdHlwZTsKKwllbnVtIG5mX2N0X2Z0cF90eXBlIGZ0cHR5cGU7CiAJaW50ICgqZ2V0bnVtKShjb25zdCBjaGFyICosIHNpemVfdCwgc3RydWN0IG5mX2Nvbm50cmFja19tYW4gKiwgY2hhcik7CiB9IHNlYXJjaFtJUF9DVF9ESVJfTUFYXVsyXSA9IHsKIAlbSVBfQ1RfRElSX09SSUdJTkFMXSA9IHsKQEAgLTgwLDcgKzgzLDcgQEAKIAkJCS5wbGVuCQk9IHNpemVvZigiUE9SVCIpIC0gMSwKIAkJCS5za2lwCQk9ICcgJywKIAkJCS50ZXJtCQk9ICdccicsCi0JCQkuZnRwdHlwZQk9IElQX0NUX0ZUUF9QT1JULAorCQkJLmZ0cHR5cGUJPSBORl9DVF9GVFBfUE9SVCwKIAkJCS5nZXRudW0JCT0gdHJ5X3JmYzk1OSwKIAkJfSwKIAkJewpAQCAtODgsNyArOTEsNyBAQAogCQkJLnBsZW4JCT0gc2l6ZW9mKCJFUFJUIikgLSAxLAogCQkJLnNraXAJCT0gJyAnLAogCQkJLnRlcm0JCT0gJ1xyJywKLQkJCS5mdHB0eXBlCT0gSVBfQ1RfRlRQX0VQUlQsCisJCQkuZnRwdHlwZQk9IE5GX0NUX0ZUUF9FUFJULAogCQkJLmdldG51bQkJPSB0cnlfZXBydCwKIAkJfSwKIAl9LApAQCAtOTgsNyArMTAxLDcgQEAKIAkJCS5wbGVuCQk9IHNpemVvZigiMjI3ICIpIC0gMSwKIAkJCS5za2lwCQk9ICcoJywKIAkJCS50ZXJtCQk9ICcpJywKLQkJCS5mdHB0eXBlCT0gSVBfQ1RfRlRQX1BBU1YsCisJCQkuZnRwdHlwZQk9IE5GX0NUX0ZUUF9QQVNWLAogCQkJLmdldG51bQkJPSB0cnlfcmZjOTU5LAogCQl9LAogCQl7CkBAIC0xMDYsNyArMTA5LDcgQEAKIAkJCS5wbGVuCQk9IHNpemVvZigiMjI5ICIpIC0gMSwKIAkJCS5za2lwCQk9ICcoJywKIAkJCS50ZXJtCQk9ICcpJywKLQkJCS5mdHB0eXBlCT0gSVBfQ1RfRlRQX0VQU1YsCisJCQkuZnRwdHlwZQk9IE5GX0NUX0ZUUF9FUFNWLAogCQkJLmdldG51bQkJPSB0cnlfZXBzdl9yZXNwb25zZSwKIAkJfSwKIAl9LApAQCAtMTcxLDcgKzE3NCw3IEBACiAKIC8qIEdyYWIgcG9ydDogbnVtYmVyIHVwIHRvIGRlbGltaXRlciAqLwogc3RhdGljIGludCBnZXRfcG9ydChjb25zdCBjaGFyICpkYXRhLCBpbnQgc3RhcnQsIHNpemVfdCBkbGVuLCBjaGFyIGRlbGltLAotCQkgICAgdV9pbnQxNl90ICpwb3J0KQorCQkgICAgX19iZTE2ICpwb3J0KQogewogCXVfaW50MTZfdCB0bXBfcG9ydCA9IDA7CiAJaW50IGk7CkBAIC0zMTcsNyArMzIwLDcgQEAKIH0KIAogLyogTG9vayB1cCB0byBzZWUgaWYgd2UncmUganVzdCBhZnRlciBhIFxuLiAqLwotc3RhdGljIGludCBmaW5kX25sX3NlcSh1MzIgc2VxLCBjb25zdCBzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciAqaW5mbywgaW50IGRpcikKK3N0YXRpYyBpbnQgZmluZF9ubF9zZXEodTMyIHNlcSwgY29uc3Qgc3RydWN0IG5mX2N0X2Z0cF9tYXN0ZXIgKmluZm8sIGludCBkaXIpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTMyOCw3ICszMzEsNyBAQAogfQogCiAvKiBXZSBkb24ndCB1cGRhdGUgaWYgaXQncyBvbGRlciB0aGFuIHdoYXQgd2UgaGF2ZS4gKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZV9ubF9zZXEodTMyIG5sX3NlcSwgc3RydWN0IGlwX2N0X2Z0cF9tYXN0ZXIgKmluZm8sIGludCBkaXIsCitzdGF0aWMgdm9pZCB1cGRhdGVfbmxfc2VxKHUzMiBubF9zZXEsIHN0cnVjdCBuZl9jdF9mdHBfbWFzdGVyICppbmZvLCBpbnQgZGlyLAogCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXVuc2lnbmVkIGludCBpLCBvbGRlc3QgPSBOVU1fU0VRX1RPX1JFTUVNQkVSOwpAQCAtMzY0LDEyICszNjcsMTIgQEAKIAl1MzIgc2VxOwogCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CiAJdW5zaWduZWQgaW50IG1hdGNobGVuLCBtYXRjaG9mZjsKLQlzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciAqY3RfZnRwX2luZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9mdHBfaW5mbzsKKwlzdHJ1Y3QgbmZfY3RfZnRwX21hc3RlciAqY3RfZnRwX2luZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9mdHBfaW5mbzsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwogCXN0cnVjdCBuZl9jb25udHJhY2tfbWFuIGNtZCA9IHt9OwotCiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGZvdW5kID0gMCwgZW5kc19pbl9ubDsKKwl0eXBlb2YobmZfbmF0X2Z0cF9ob29rKSBuZl9uYXRfZnRwOwogCiAJLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCiAJaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRApAQCAtNTAwLDEyICs1MDMsMTIgQEAKIAkJCSAgICAgICAudSA9IHsgLnRjcCA9IHsgMCB9fSwKIAkJCSAgICAgfSwKIAkJICAgICAgLmRzdCA9IHsgLnByb3RvbnVtID0gMHhGRiwKLQkJCSAgICAgICAudSA9IHsgLnRjcCA9IHsgMHhGRkZGIH19LAorCQkJICAgICAgIC51ID0geyAudGNwID0geyBfX2NvbnN0YW50X2h0b25zKDB4RkZGRikgfX0sCiAJCQkgICAgIH0sCiAJCSAgICB9OwogCWlmIChjbWQubDNudW0gPT0gUEZfSU5FVCkgewotCQlleHAtPm1hc2suc3JjLnUzLmlwID0gMHhGRkZGRkZGRjsKLQkJZXhwLT5tYXNrLmRzdC51My5pcCA9IDB4RkZGRkZGRkY7CisJCWV4cC0+bWFzay5zcmMudTMuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKKwkJZXhwLT5tYXNrLmRzdC51My5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwogCX0gZWxzZSB7CiAJCW1lbXNldChleHAtPm1hc2suc3JjLnUzLmlwNiwgMHhGRiwKIAkJICAgICAgIHNpemVvZihleHAtPm1hc2suc3JjLnUzLmlwNikpOwpAQCAtNTE0LDEzICs1MTcsMTUgQEAKIAl9CiAKIAlleHAtPmV4cGVjdGZuID0gTlVMTDsKKwlleHAtPmhlbHBlciA9IE5VTEw7CiAJZXhwLT5mbGFncyA9IDA7CiAKIAkvKiBOb3csIE5BVCBtaWdodCB3YW50IHRvIG1hbmdsZSB0aGUgcGFja2V0LCBhbmQgcmVnaXN0ZXIgdGhlCiAJICogKHBvc3NpYmx5IGNoYW5nZWQpIGV4cGVjdGF0aW9uIGl0c2VsZi4gKi8KLQlpZiAobmZfbmF0X2Z0cF9ob29rKQotCQlyZXQgPSBuZl9uYXRfZnRwX2hvb2socHNrYiwgY3RpbmZvLCBzZWFyY2hbZGlyXVtpXS5mdHB0eXBlLAotCQkJCSAgICAgIG1hdGNob2ZmLCBtYXRjaGxlbiwgZXhwLCAmc2VxKTsKKwluZl9uYXRfZnRwID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF9mdHBfaG9vayk7CisJaWYgKG5mX25hdF9mdHAgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKKwkJcmV0ID0gbmZfbmF0X2Z0cChwc2tiLCBjdGluZm8sIHNlYXJjaFtkaXJdW2ldLmZ0cHR5cGUsCisJCQkJIG1hdGNob2ZmLCBtYXRjaGxlbiwgZXhwLCAmc2VxKTsKIAllbHNlIHsKIAkJLyogQ2FuJ3QgZXhwZWN0IHRoaXM/ICBCZXN0IHRvIGRyb3AgcGFja2V0IG5vdy4gKi8KIAkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCkBAIC01ODQsNyArNTg5LDggQEAKIAkJZm9yIChqID0gMDsgaiA8IDI7IGorKykgewogCQkJZnRwW2ldW2pdLnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gaHRvbnMocG9ydHNbaV0pOwogCQkJZnRwW2ldW2pdLnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOwotCQkJZnRwW2ldW2pdLm1hc2suc3JjLnUudGNwLnBvcnQgPSAweEZGRkY7CisJCQlmdHBbaV1bal0ubWFzay5zcmMubDNudW0gPSAweEZGRkY7CisJCQlmdHBbaV1bal0ubWFzay5zcmMudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7CiAJCQlmdHBbaV1bal0ubWFzay5kc3QucHJvdG9udW0gPSAweEZGOwogCQkJZnRwW2ldW2pdLm1heF9leHBlY3RlZCA9IDE7CiAJCQlmdHBbaV1bal0udGltZW91dCA9IDUgKiA2MDsJLyogNSBNaW51dGVzICovCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX2FzbjEuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmFkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX2FzbjEuYwpAQCAtMCwwICsxLDg3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlwX2Nvbm50cmFja19oZWxwZXJfaDMyM19hc24xLmMgLSBCRVIgYW5kIFBFUiBkZWNvZGluZyBsaWJyYXJ5IGZvciBILjMyMworICogCQkJICAgICAgCSAgICAgY29ubnRyYWNrL05BVCBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IGJ5IEppbmcgTWluIFpoYW8gPHpoYW9qaW5nbWluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIFNlZSBpcF9jb25udHJhY2tfaGVscGVyX2gzMjNfYXNuMS5oIGZvciBkZXRhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX2FzbjEuaD4KKworLyogVHJhY2UgRmxhZyAqLworI2lmbmRlZiBIMzIzX1RSQUNFCisjZGVmaW5lIEgzMjNfVFJBQ0UgMAorI2VuZGlmCisKKyNpZiBIMzIzX1RSQUNFCisjZGVmaW5lIFRBQl9TSVpFIDQKKyNkZWZpbmUgSUZUSEVOKGNvbmQsIGFjdCkgaWYoY29uZCl7YWN0O30KKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIFBSSU5UIHByaW50aworI2Vsc2UKKyNkZWZpbmUgUFJJTlQgcHJpbnRmCisjZW5kaWYKKyNkZWZpbmUgRk5BTUUobmFtZSkgbmFtZSwKKyNlbHNlCisjZGVmaW5lIElGVEhFTihjb25kLCBhY3QpCisjZGVmaW5lIFBSSU5UKGZtdCwgYXJncy4uLikKKyNkZWZpbmUgRk5BTUUobmFtZSkKKyNlbmRpZgorCisvKiBBU04uMSBUeXBlcyAqLworI2RlZmluZSBOVUwgMAorI2RlZmluZSBCT09MIDEKKyNkZWZpbmUgT0lEIDIKKyNkZWZpbmUgSU5UIDMKKyNkZWZpbmUgRU5VTSA0CisjZGVmaW5lIEJJVFNUUiA1CisjZGVmaW5lIE5VTVNUUiA2CisjZGVmaW5lIE5VTURHVCA2CisjZGVmaW5lIFRCQ0RTVFIgNgorI2RlZmluZSBPQ1RTVFIgNworI2RlZmluZSBQUlRTVFIgNworI2RlZmluZSBJQTVTVFIgNworI2RlZmluZSBHRU5TVFIgNworI2RlZmluZSBCTVBTVFIgOAorI2RlZmluZSBTRVEgOQorI2RlZmluZSBTRVQgOQorI2RlZmluZSBTRVFPRiAxMAorI2RlZmluZSBTRVRPRiAxMAorI2RlZmluZSBDSE9JQ0UgMTEKKworLyogQ29uc3RyYWludCBUeXBlcyAqLworI2RlZmluZSBGSVhEIDAKKy8qICNkZWZpbmUgQklUUyAxLTggKi8KKyNkZWZpbmUgQllURSA5CisjZGVmaW5lIFdPUkQgMTAKKyNkZWZpbmUgQ09OUyAxMQorI2RlZmluZSBTRU1JIDEyCisjZGVmaW5lIFVOQ08gMTMKKworLyogQVNOLjEgVHlwZSBBdHRyaWJ1dGVzICovCisjZGVmaW5lIFNLSVAgMAorI2RlZmluZSBTVE9QIDEKKyNkZWZpbmUgREVDT0RFIDIKKyNkZWZpbmUgRVhUIDQKKyNkZWZpbmUgT1BFTiA4CisjZGVmaW5lIE9QVCAxNgorCisKKy8qIEFTTi4xIEZpZWxkIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgZmllbGRfdCB7CisjaWYgSDMyM19UUkFDRQorCWNoYXIgKm5hbWU7CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgY2hhciBzejsKKwl1bnNpZ25lZCBjaGFyIGxiOworCXVuc2lnbmVkIGNoYXIgdWI7CisJdW5zaWduZWQgc2hvcnQgYXR0cjsKKwl1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7CisJc3RydWN0IGZpZWxkX3QgKmZpZWxkczsKK30gZmllbGRfdDsKKworLyogQml0IFN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpiZWc7CisJdW5zaWduZWQgY2hhciAqZW5kOworCXVuc2lnbmVkIGNoYXIgKmN1cjsKKwl1bnNpZ25lZCBiaXQ7Cit9IGJpdHN0cl90OworCisvKiBUb29sIEZ1bmN0aW9ucyAqLworI2RlZmluZSBJTkNfQklUKGJzKSBpZigoKyticy0+Yml0KT43KXticy0+Y3VyKys7YnMtPmJpdD0wO30KKyNkZWZpbmUgSU5DX0JJVFMoYnMsYikgaWYoKGJzLT5iaXQrPWIpPjcpe2JzLT5jdXIrPWJzLT5iaXQ+PjM7YnMtPmJpdCY9Nzt9CisjZGVmaW5lIEJZVEVfQUxJR04oYnMpIGlmKGJzLT5iaXQpe2JzLT5jdXIrKzticy0+Yml0PTA7fQorI2RlZmluZSBDSEVDS19CT1VORChicyxuKSBpZihicy0+Y3VyKyhuKT5icy0+ZW5kKXJldHVybihIMzIzX0VSUk9SX0JPVU5EKQorc3RhdGljIHVuc2lnbmVkIGdldF9sZW4oYml0c3RyX3QgKiBicyk7CitzdGF0aWMgdW5zaWduZWQgZ2V0X2JpdChiaXRzdHJfdCAqIGJzKTsKK3N0YXRpYyB1bnNpZ25lZCBnZXRfYml0cyhiaXRzdHJfdCAqIGJzLCB1bnNpZ25lZCBiKTsKK3N0YXRpYyB1bnNpZ25lZCBnZXRfYml0bWFwKGJpdHN0cl90ICogYnMsIHVuc2lnbmVkIGIpOworc3RhdGljIHVuc2lnbmVkIGdldF91aW50KGJpdHN0cl90ICogYnMsIGludCBiKTsKKworLyogRGVjb2RlciBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX251bChiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKTsKK3N0YXRpYyBpbnQgZGVjb2RlX2Jvb2woYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCk7CitzdGF0aWMgaW50IGRlY29kZV9vaWQoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCk7CitzdGF0aWMgaW50IGRlY29kZV9pbnQoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCk7CitzdGF0aWMgaW50IGRlY29kZV9lbnVtKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOworc3RhdGljIGludCBkZWNvZGVfYml0c3RyKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOworc3RhdGljIGludCBkZWNvZGVfbnVtc3RyKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOworc3RhdGljIGludCBkZWNvZGVfb2N0c3RyKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOworc3RhdGljIGludCBkZWNvZGVfYm1wc3RyKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOworc3RhdGljIGludCBkZWNvZGVfc2VxKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpOworc3RhdGljIGludCBkZWNvZGVfc2Vxb2YoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCk7CitzdGF0aWMgaW50IGRlY29kZV9jaG9pY2UoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCk7CisKKy8qIERlY29kZXIgRnVuY3Rpb25zIFZlY3RvciAqLwordHlwZWRlZiBpbnQgKCpkZWNvZGVyX3QpIChiaXRzdHJfdCAqLCBmaWVsZF90ICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBkZWNvZGVyX3QgRGVjb2RlcnNbXSA9IHsKKwlkZWNvZGVfbnVsLAorCWRlY29kZV9ib29sLAorCWRlY29kZV9vaWQsCisJZGVjb2RlX2ludCwKKwlkZWNvZGVfZW51bSwKKwlkZWNvZGVfYml0c3RyLAorCWRlY29kZV9udW1zdHIsCisJZGVjb2RlX29jdHN0ciwKKwlkZWNvZGVfYm1wc3RyLAorCWRlY29kZV9zZXEsCisJZGVjb2RlX3NlcW9mLAorCWRlY29kZV9jaG9pY2UsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSC4zMjMgVHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIm5mX2Nvbm50cmFja19oMzIzX3R5cGVzLmMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQXNzdW1lIGJzIGlzIGFsaWduZWQgJiYgdiA8IDE2Mzg0ICovCit1bnNpZ25lZCBnZXRfbGVuKGJpdHN0cl90ICogYnMpCit7CisJdW5zaWduZWQgdjsKKworCXYgPSAqYnMtPmN1cisrOworCisJaWYgKHYgJiAweDgwKSB7CisJCXYgJj0gMHgzZjsKKwkJdiA8PD0gODsKKwkJdiArPSAqYnMtPmN1cisrOworCX0KKworCXJldHVybiB2OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGdldF9iaXQoYml0c3RyX3QgKiBicykKK3sKKwl1bnNpZ25lZCBiID0gKCpicy0+Y3VyKSAmICgweDgwID4+IGJzLT5iaXQpOworCisJSU5DX0JJVChicyk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBc3N1bWUgYiA8PSA4ICovCit1bnNpZ25lZCBnZXRfYml0cyhiaXRzdHJfdCAqIGJzLCB1bnNpZ25lZCBiKQoreworCXVuc2lnbmVkIHYsIGw7CisKKwl2ID0gKCpicy0+Y3VyKSAmICgweGZmVSA+PiBicy0+Yml0KTsKKwlsID0gYiArIGJzLT5iaXQ7CisKKwlpZiAobCA8IDgpIHsKKwkJdiA+Pj0gOCAtIGw7CisJCWJzLT5iaXQgPSBsOworCX0gZWxzZSBpZiAobCA9PSA4KSB7CisJCWJzLT5jdXIrKzsKKwkJYnMtPmJpdCA9IDA7CisJfSBlbHNlIHsJCS8qIGwgPiA4ICovCisKKwkJdiA8PD0gODsKKwkJdiArPSAqKCsrYnMtPmN1cik7CisJCXYgPj49IDE2IC0gbDsKKwkJYnMtPmJpdCA9IGwgLSA4OworCX0KKworCXJldHVybiB2OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEFzc3VtZSBiIDw9IDMyICovCit1bnNpZ25lZCBnZXRfYml0bWFwKGJpdHN0cl90ICogYnMsIHVuc2lnbmVkIGIpCit7CisJdW5zaWduZWQgdiwgbCwgc2hpZnQsIGJ5dGVzOworCisJaWYgKCFiKQorCQlyZXR1cm4gMDsKKworCWwgPSBicy0+Yml0ICsgYjsKKworCWlmIChsIDwgOCkgeworCQl2ID0gKHVuc2lnbmVkKSAoKmJzLT5jdXIpIDw8IChicy0+Yml0ICsgMjQpOworCQlicy0+Yml0ID0gbDsKKwl9IGVsc2UgaWYgKGwgPT0gOCkgeworCQl2ID0gKHVuc2lnbmVkKSAoKmJzLT5jdXIrKykgPDwgKGJzLT5iaXQgKyAyNCk7CisJCWJzLT5iaXQgPSAwOworCX0gZWxzZSB7CisJCWZvciAoYnl0ZXMgPSBsID4+IDMsIHNoaWZ0ID0gMjQsIHYgPSAwOyBieXRlczsKKwkJICAgICBieXRlcy0tLCBzaGlmdCAtPSA4KQorCQkJdiB8PSAodW5zaWduZWQpICgqYnMtPmN1cisrKSA8PCBzaGlmdDsKKworCQlpZiAobCA8IDMyKSB7CisJCQl2IHw9ICh1bnNpZ25lZCkgKCpicy0+Y3VyKSA8PCBzaGlmdDsKKwkJCXYgPDw9IGJzLT5iaXQ7CisJCX0gZWxzZSBpZiAobCA+IDMyKSB7CisJCQl2IDw8PSBicy0+Yml0OworCQkJdiB8PSAoKmJzLT5jdXIpID4+ICg4IC0gYnMtPmJpdCk7CisJCX0KKworCQlicy0+Yml0ID0gbCAmIDB4NzsKKwl9CisKKwl2ICY9IDB4ZmZmZmZmZmYgPDwgKDMyIC0gYik7CisKKwlyZXR1cm4gdjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFzc3VtZSBicyBpcyBhbGlnbmVkIGFuZCBzaXplb2YodW5zaWduZWQgaW50KSA9PSA0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGdldF91aW50KGJpdHN0cl90ICogYnMsIGludCBiKQoreworCXVuc2lnbmVkIHYgPSAwOworCisJc3dpdGNoIChiKSB7CisJY2FzZSA0OgorCQl2IHw9ICpicy0+Y3VyKys7CisJCXYgPDw9IDg7CisJY2FzZSAzOgorCQl2IHw9ICpicy0+Y3VyKys7CisJCXYgPDw9IDg7CisJY2FzZSAyOgorCQl2IHw9ICpicy0+Y3VyKys7CisJCXYgPDw9IDg7CisJY2FzZSAxOgorCQl2IHw9ICpicy0+Y3VyKys7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZGVjb2RlX251bChiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKQoreworCVBSSU5UKCIlKi5zJXNcbiIsIGxldmVsICogVEFCX1NJWkUsICIgIiwgZi0+bmFtZSk7CisKKwlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkZWNvZGVfYm9vbChiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKQoreworCVBSSU5UKCIlKi5zJXNcbiIsIGxldmVsICogVEFCX1NJWkUsICIgIiwgZi0+bmFtZSk7CisKKwlJTkNfQklUKGJzKTsKKworCUNIRUNLX0JPVU5EKGJzLCAwKTsKKwlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkZWNvZGVfb2lkKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCit7CisJaW50IGxlbjsKKworCVBSSU5UKCIlKi5zJXNcbiIsIGxldmVsICogVEFCX1NJWkUsICIgIiwgZi0+bmFtZSk7CisKKwlCWVRFX0FMSUdOKGJzKTsKKwlDSEVDS19CT1VORChicywgMSk7CisJbGVuID0gKmJzLT5jdXIrKzsKKwlicy0+Y3VyICs9IGxlbjsKKworCUNIRUNLX0JPVU5EKGJzLCAwKTsKKwlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkZWNvZGVfaW50KGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCit7CisJdW5zaWduZWQgbGVuOworCisJUFJJTlQoIiUqLnMlcyIsIGxldmVsICogVEFCX1NJWkUsICIgIiwgZi0+bmFtZSk7CisKKwlzd2l0Y2ggKGYtPnN6KSB7CisJY2FzZSBCWVRFOgkJLyogUmFuZ2UgPT0gMjU2ICovCisJCUJZVEVfQUxJR04oYnMpOworCQlicy0+Y3VyKys7CisJCWJyZWFrOworCWNhc2UgV09SRDoJCS8qIDI1NyA8PSBSYW5nZSA8PSA2NEsgKi8KKwkJQllURV9BTElHTihicyk7CisJCWJzLT5jdXIgKz0gMjsKKwkJYnJlYWs7CisJY2FzZSBDT05TOgkJLyogNjRLIDwgUmFuZ2UgPCA0RyAqLworCQlsZW4gPSBnZXRfYml0cyhicywgMikgKyAxOworCQlCWVRFX0FMSUdOKGJzKTsKKwkJaWYgKGJhc2UgJiYgKGYtPmF0dHIgJiBERUNPREUpKSB7CS8qIHRpbWVUb0xpdmUgKi8KKwkJCXVuc2lnbmVkIHYgPSBnZXRfdWludChicywgbGVuKSArIGYtPmxiOworCQkJUFJJTlQoIiA9ICV1Iiwgdik7CisJCQkqKCh1bnNpZ25lZCAqKSAoYmFzZSArIGYtPm9mZnNldCkpID0gdjsKKwkJfQorCQlicy0+Y3VyICs9IGxlbjsKKwkJYnJlYWs7CisJY2FzZSBVTkNPOgorCQlCWVRFX0FMSUdOKGJzKTsKKwkJQ0hFQ0tfQk9VTkQoYnMsIDIpOworCQlsZW4gPSBnZXRfbGVuKGJzKTsKKwkJYnMtPmN1ciArPSBsZW47CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiAyIDw9IFJhbmdlIDw9IDI1NSAqLworCQlJTkNfQklUUyhicywgZi0+c3opOworCQlicmVhazsKKwl9CisKKwlQUklOVCgiXG4iKTsKKworCUNIRUNLX0JPVU5EKGJzLCAwKTsKKwlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkZWNvZGVfZW51bShiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKQoreworCVBSSU5UKCIlKi5zJXNcbiIsIGxldmVsICogVEFCX1NJWkUsICIgIiwgZi0+bmFtZSk7CisKKwlpZiAoKGYtPmF0dHIgJiBFWFQpICYmIGdldF9iaXQoYnMpKSB7CisJCUlOQ19CSVRTKGJzLCA3KTsKKwl9IGVsc2UgeworCQlJTkNfQklUUyhicywgZi0+c3opOworCX0KKworCUNIRUNLX0JPVU5EKGJzLCAwKTsKKwlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkZWNvZGVfYml0c3RyKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCit7CisJdW5zaWduZWQgbGVuOworCisJUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKKworCUJZVEVfQUxJR04oYnMpOworCXN3aXRjaCAoZi0+c3opIHsKKwljYXNlIEZJWEQ6CQkvKiBmaXhlZCBsZW5ndGggPiAxNiAqLworCQlsZW4gPSBmLT5sYjsKKwkJYnJlYWs7CisJY2FzZSBXT1JEOgkJLyogMi1ieXRlIGxlbmd0aCAqLworCQlDSEVDS19CT1VORChicywgMik7CisJCWxlbiA9ICgqYnMtPmN1cisrKSA8PCA4OworCQlsZW4gKz0gKCpicy0+Y3VyKyspICsgZi0+bGI7CisJCWJyZWFrOworCWNhc2UgU0VNSToKKwkJQ0hFQ0tfQk9VTkQoYnMsIDIpOworCQlsZW4gPSBnZXRfbGVuKGJzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGVuID0gMDsKKwkJYnJlYWs7CisJfQorCisJYnMtPmN1ciArPSBsZW4gPj4gMzsKKwlicy0+Yml0ID0gbGVuICYgNzsKKworCUNIRUNLX0JPVU5EKGJzLCAwKTsKKwlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkZWNvZGVfbnVtc3RyKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCit7CisJdW5zaWduZWQgbGVuOworCisJUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKKworCS8qIDIgPD0gUmFuZ2UgPD0gMjU1ICovCisJbGVuID0gZ2V0X2JpdHMoYnMsIGYtPnN6KSArIGYtPmxiOworCisJQllURV9BTElHTihicyk7CisJSU5DX0JJVFMoYnMsIChsZW4gPDwgMikpOworCisJQ0hFQ0tfQk9VTkQoYnMsIDApOworCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRlY29kZV9vY3RzdHIoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBsZW47CisKKwlQUklOVCgiJSoucyVzIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKKworCXN3aXRjaCAoZi0+c3opIHsKKwljYXNlIEZJWEQ6CQkvKiBSYW5nZSA9PSAxICovCisJCWlmIChmLT5sYiA+IDIpIHsKKwkJCUJZVEVfQUxJR04oYnMpOworCQkJaWYgKGJhc2UgJiYgKGYtPmF0dHIgJiBERUNPREUpKSB7CisJCQkJLyogVGhlIElQIEFkZHJlc3MgKi8KKwkJCQlJRlRIRU4oZi0+bGIgPT0gNCwKKwkJCQkgICAgICAgUFJJTlQoIiA9ICVkLiVkLiVkLiVkOiVkIiwKKwkJCQkJICAgICBicy0+Y3VyWzBdLCBicy0+Y3VyWzFdLAorCQkJCQkgICAgIGJzLT5jdXJbMl0sIGJzLT5jdXJbM10sCisJCQkJCSAgICAgYnMtPmN1cls0XSAqIDI1NiArIGJzLT5jdXJbNV0pKTsKKwkJCQkqKCh1bnNpZ25lZCAqKSAoYmFzZSArIGYtPm9mZnNldCkpID0KKwkJCQkgICAgYnMtPmN1ciAtIGJzLT5idWY7CisJCQl9CisJCX0KKwkJbGVuID0gZi0+bGI7CisJCWJyZWFrOworCWNhc2UgQllURToJCS8qIFJhbmdlID09IDI1NiAqLworCQlCWVRFX0FMSUdOKGJzKTsKKwkJQ0hFQ0tfQk9VTkQoYnMsIDEpOworCQlsZW4gPSAoKmJzLT5jdXIrKykgKyBmLT5sYjsKKwkJYnJlYWs7CisJY2FzZSBTRU1JOgorCQlCWVRFX0FMSUdOKGJzKTsKKwkJQ0hFQ0tfQk9VTkQoYnMsIDIpOworCQlsZW4gPSBnZXRfbGVuKGJzKSArIGYtPmxiOworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogMiA8PSBSYW5nZSA8PSAyNTUgKi8KKwkJbGVuID0gZ2V0X2JpdHMoYnMsIGYtPnN6KSArIGYtPmxiOworCQlCWVRFX0FMSUdOKGJzKTsKKwkJYnJlYWs7CisJfQorCisJYnMtPmN1ciArPSBsZW47CisKKwlQUklOVCgiXG4iKTsKKworCUNIRUNLX0JPVU5EKGJzLCAwKTsKKwlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkZWNvZGVfYm1wc3RyKGJpdHN0cl90ICogYnMsIGZpZWxkX3QgKiBmLCBjaGFyICpiYXNlLCBpbnQgbGV2ZWwpCit7CisJdW5zaWduZWQgbGVuOworCisJUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKKworCXN3aXRjaCAoZi0+c3opIHsKKwljYXNlIEJZVEU6CQkvKiBSYW5nZSA9PSAyNTYgKi8KKwkJQllURV9BTElHTihicyk7CisJCUNIRUNLX0JPVU5EKGJzLCAxKTsKKwkJbGVuID0gKCpicy0+Y3VyKyspICsgZi0+bGI7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiAyIDw9IFJhbmdlIDw9IDI1NSAqLworCQlsZW4gPSBnZXRfYml0cyhicywgZi0+c3opICsgZi0+bGI7CisJCUJZVEVfQUxJR04oYnMpOworCQlicmVhazsKKwl9CisKKwlicy0+Y3VyICs9IGxlbiA8PCAxOworCisJQ0hFQ0tfQk9VTkQoYnMsIDApOworCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRlY29kZV9zZXEoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBleHQsIGJtcCwgaSwgb3B0LCBsZW4gPSAwLCBibXAyLCBibXAyX2xlbjsKKwlpbnQgZXJyOworCWZpZWxkX3QgKnNvbjsKKwl1bnNpZ25lZCBjaGFyICpiZWcgPSBOVUxMOworCisJUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKKworCS8qIERlY29kZT8gKi8KKwliYXNlID0gKGJhc2UgJiYgKGYtPmF0dHIgJiBERUNPREUpKSA/IGJhc2UgKyBmLT5vZmZzZXQgOiBOVUxMOworCisJLyogRXh0ZW5zaWJsZT8gKi8KKwlleHQgPSAoZi0+YXR0ciAmIEVYVCkgPyBnZXRfYml0KGJzKSA6IDA7CisKKwkvKiBHZXQgZmllbGRzIGJpdG1hcCAqLworCWJtcCA9IGdldF9iaXRtYXAoYnMsIGYtPnN6KTsKKwlpZiAoYmFzZSkKKwkJKih1bnNpZ25lZCAqKSBiYXNlID0gYm1wOworCisJLyogRGVjb2RlIHRoZSByb290IGNvbXBvbmVudHMgKi8KKwlmb3IgKGkgPSBvcHQgPSAwLCBzb24gPSBmLT5maWVsZHM7IGkgPCBmLT5sYjsgaSsrLCBzb24rKykgeworCQlpZiAoc29uLT5hdHRyICYgU1RPUCkgeworCQkJUFJJTlQoIiUqLnMlc1xuIiwgKGxldmVsICsgMSkgKiBUQUJfU0laRSwgIiAiLAorCQkJICAgICAgc29uLT5uYW1lKTsKKwkJCXJldHVybiBIMzIzX0VSUk9SX1NUT1A7CisJCX0KKworCQlpZiAoc29uLT5hdHRyICYgT1BUKSB7CS8qIE9wdGlvbmFsIGNvbXBvbmVudCAqLworCQkJaWYgKCEoKDB4ODAwMDAwMDBVID4+IChvcHQrKykpICYgYm1wKSkJLyogTm90IGV4aXN0ICovCisJCQkJY29udGludWU7CisJCX0KKworCQkvKiBEZWNvZGUgKi8KKwkJaWYgKHNvbi0+YXR0ciAmIE9QRU4pIHsJLyogT3BlbiBmaWVsZCAqLworCQkJQ0hFQ0tfQk9VTkQoYnMsIDIpOworCQkJbGVuID0gZ2V0X2xlbihicyk7CisJCQlDSEVDS19CT1VORChicywgbGVuKTsKKwkJCWlmICghYmFzZSkgeworCQkJCVBSSU5UKCIlKi5zJXNcbiIsIChsZXZlbCArIDEpICogVEFCX1NJWkUsCisJCQkJICAgICAgIiAiLCBzb24tPm5hbWUpOworCQkJCWJzLT5jdXIgKz0gbGVuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYmVnID0gYnMtPmN1cjsKKworCQkJLyogRGVjb2RlICovCisJCQlpZiAoKGVyciA9IChEZWNvZGVyc1tzb24tPnR5cGVdKSAoYnMsIHNvbiwgYmFzZSwKKwkJCQkJCQkgIGxldmVsICsgMSkpIDwKKwkJCSAgICBIMzIzX0VSUk9SX05PTkUpCisJCQkJcmV0dXJuIGVycjsKKworCQkJYnMtPmN1ciA9IGJlZyArIGxlbjsKKwkJCWJzLT5iaXQgPSAwOworCQl9IGVsc2UgaWYgKChlcnIgPSAoRGVjb2RlcnNbc29uLT50eXBlXSkgKGJzLCBzb24sIGJhc2UsCisJCQkJCQkJIGxldmVsICsgMSkpIDwKKwkJCSAgIEgzMjNfRVJST1JfTk9ORSkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogTm8gZXh0ZW5zaW9uPyAqLworCWlmICghZXh0KQorCQlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworCisJLyogR2V0IHRoZSBleHRlbnNpb24gYml0bWFwICovCisJYm1wMl9sZW4gPSBnZXRfYml0cyhicywgNykgKyAxOworCUNIRUNLX0JPVU5EKGJzLCAoYm1wMl9sZW4gKyA3KSA+PiAzKTsKKwlibXAyID0gZ2V0X2JpdG1hcChicywgYm1wMl9sZW4pOworCWJtcCB8PSBibXAyID4+IGYtPnN6OworCWlmIChiYXNlKQorCQkqKHVuc2lnbmVkICopIGJhc2UgPSBibXA7CisJQllURV9BTElHTihicyk7CisKKwkvKiBEZWNvZGUgdGhlIGV4dGVuc2lvbiBjb21wb25lbnRzICovCisJZm9yIChvcHQgPSAwOyBvcHQgPCBibXAyX2xlbjsgb3B0KyssIGkrKywgc29uKyspIHsKKwkJaWYgKGkgPCBmLT51YiAmJiBzb24tPmF0dHIgJiBTVE9QKSB7CisJCQlQUklOVCgiJSoucyVzXG4iLCAobGV2ZWwgKyAxKSAqIFRBQl9TSVpFLCAiICIsCisJCQkgICAgICBzb24tPm5hbWUpOworCQkJcmV0dXJuIEgzMjNfRVJST1JfU1RPUDsKKwkJfQorCisJCWlmICghKCgweDgwMDAwMDAwID4+IG9wdCkgJiBibXAyKSkJLyogTm90IHByZXNlbnQgKi8KKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIFJhbmdlICovCisJCWlmIChpID49IGYtPnViKSB7CS8qIE5ld2VyIFZlcnNpb24/ICovCisJCQlDSEVDS19CT1VORChicywgMik7CisJCQlsZW4gPSBnZXRfbGVuKGJzKTsKKwkJCUNIRUNLX0JPVU5EKGJzLCBsZW4pOworCQkJYnMtPmN1ciArPSBsZW47CisJCQljb250aW51ZTsKKwkJfQorCisJCUNIRUNLX0JPVU5EKGJzLCAyKTsKKwkJbGVuID0gZ2V0X2xlbihicyk7CisJCUNIRUNLX0JPVU5EKGJzLCBsZW4pOworCQlpZiAoIWJhc2UgfHwgIShzb24tPmF0dHIgJiBERUNPREUpKSB7CisJCQlQUklOVCgiJSoucyVzXG4iLCAobGV2ZWwgKyAxKSAqIFRBQl9TSVpFLCAiICIsCisJCQkgICAgICBzb24tPm5hbWUpOworCQkJYnMtPmN1ciArPSBsZW47CisJCQljb250aW51ZTsKKwkJfQorCQliZWcgPSBicy0+Y3VyOworCisJCWlmICgoZXJyID0gKERlY29kZXJzW3Nvbi0+dHlwZV0pIChicywgc29uLCBiYXNlLAorCQkJCQkJICBsZXZlbCArIDEpKSA8CisJCSAgICBIMzIzX0VSUk9SX05PTkUpCisJCQlyZXR1cm4gZXJyOworCisJCWJzLT5jdXIgPSBiZWcgKyBsZW47CisJCWJzLT5iaXQgPSAwOworCX0KKwlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkZWNvZGVfc2Vxb2YoYml0c3RyX3QgKiBicywgZmllbGRfdCAqIGYsIGNoYXIgKmJhc2UsIGludCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBjb3VudCwgZWZmZWN0aXZlX2NvdW50ID0gMCwgaSwgbGVuID0gMDsKKwlpbnQgZXJyOworCWZpZWxkX3QgKnNvbjsKKwl1bnNpZ25lZCBjaGFyICpiZWcgPSBOVUxMOworCisJUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKKworCS8qIERlY29kZT8gKi8KKwliYXNlID0gKGJhc2UgJiYgKGYtPmF0dHIgJiBERUNPREUpKSA/IGJhc2UgKyBmLT5vZmZzZXQgOiBOVUxMOworCisJLyogRGVjb2RlIGl0ZW0gY291bnQgKi8KKwlzd2l0Y2ggKGYtPnN6KSB7CisJY2FzZSBCWVRFOgorCQlCWVRFX0FMSUdOKGJzKTsKKwkJQ0hFQ0tfQk9VTkQoYnMsIDEpOworCQljb3VudCA9ICpicy0+Y3VyKys7CisJCWJyZWFrOworCWNhc2UgV09SRDoKKwkJQllURV9BTElHTihicyk7CisJCUNIRUNLX0JPVU5EKGJzLCAyKTsKKwkJY291bnQgPSAqYnMtPmN1cisrOworCQljb3VudCA8PD0gODsKKwkJY291bnQgPSAqYnMtPmN1cisrOworCQlicmVhazsKKwljYXNlIFNFTUk6CisJCUJZVEVfQUxJR04oYnMpOworCQlDSEVDS19CT1VORChicywgMik7CisJCWNvdW50ID0gZ2V0X2xlbihicyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvdW50ID0gZ2V0X2JpdHMoYnMsIGYtPnN6KTsKKwkJYnJlYWs7CisJfQorCWNvdW50ICs9IGYtPmxiOworCisJLyogV3JpdGUgQ291bnQgKi8KKwlpZiAoYmFzZSkgeworCQllZmZlY3RpdmVfY291bnQgPSBjb3VudCA+IGYtPnViID8gZi0+dWIgOiBjb3VudDsKKwkJKih1bnNpZ25lZCAqKSBiYXNlID0gZWZmZWN0aXZlX2NvdW50OworCQliYXNlICs9IHNpemVvZih1bnNpZ25lZCk7CisJfQorCisJLyogRGVjb2RlIG5lc3RlZCBmaWVsZCAqLworCXNvbiA9IGYtPmZpZWxkczsKKwlpZiAoYmFzZSkKKwkJYmFzZSAtPSBzb24tPm9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoc29uLT5hdHRyICYgT1BFTikgeworCQkJQllURV9BTElHTihicyk7CisJCQlsZW4gPSBnZXRfbGVuKGJzKTsKKwkJCUNIRUNLX0JPVU5EKGJzLCBsZW4pOworCQkJaWYgKCFiYXNlIHx8ICEoc29uLT5hdHRyICYgREVDT0RFKSkgeworCQkJCVBSSU5UKCIlKi5zJXNcbiIsIChsZXZlbCArIDEpICogVEFCX1NJWkUsCisJCQkJICAgICAgIiAiLCBzb24tPm5hbWUpOworCQkJCWJzLT5jdXIgKz0gbGVuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYmVnID0gYnMtPmN1cjsKKworCQkJaWYgKChlcnIgPSAoRGVjb2RlcnNbc29uLT50eXBlXSkgKGJzLCBzb24sCisJCQkJCQkJICBpIDwKKwkJCQkJCQkgIGVmZmVjdGl2ZV9jb3VudCA/CisJCQkJCQkJICBiYXNlIDogTlVMTCwKKwkJCQkJCQkgIGxldmVsICsgMSkpIDwKKwkJCSAgICBIMzIzX0VSUk9SX05PTkUpCisJCQkJcmV0dXJuIGVycjsKKworCQkJYnMtPmN1ciA9IGJlZyArIGxlbjsKKwkJCWJzLT5iaXQgPSAwOworCQl9IGVsc2UKKwkJCWlmICgoZXJyID0gKERlY29kZXJzW3Nvbi0+dHlwZV0pIChicywgc29uLAorCQkJCQkJCSAgaSA8CisJCQkJCQkJICBlZmZlY3RpdmVfY291bnQgPworCQkJCQkJCSAgYmFzZSA6IE5VTEwsCisJCQkJCQkJICBsZXZlbCArIDEpKSA8CisJCQkgICAgSDMyM19FUlJPUl9OT05FKQorCQkJCXJldHVybiBlcnI7CisKKwkJaWYgKGJhc2UpCisJCQliYXNlICs9IHNvbi0+b2Zmc2V0OworCX0KKworCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZGVjb2RlX2Nob2ljZShiaXRzdHJfdCAqIGJzLCBmaWVsZF90ICogZiwgY2hhciAqYmFzZSwgaW50IGxldmVsKQoreworCXVuc2lnbmVkIHR5cGUsIGV4dCwgbGVuID0gMDsKKwlpbnQgZXJyOworCWZpZWxkX3QgKnNvbjsKKwl1bnNpZ25lZCBjaGFyICpiZWcgPSBOVUxMOworCisJUFJJTlQoIiUqLnMlc1xuIiwgbGV2ZWwgKiBUQUJfU0laRSwgIiAiLCBmLT5uYW1lKTsKKworCS8qIERlY29kZT8gKi8KKwliYXNlID0gKGJhc2UgJiYgKGYtPmF0dHIgJiBERUNPREUpKSA/IGJhc2UgKyBmLT5vZmZzZXQgOiBOVUxMOworCisJLyogRGVjb2RlIHRoZSBjaG9pY2UgaW5kZXggbnVtYmVyICovCisJaWYgKChmLT5hdHRyICYgRVhUKSAmJiBnZXRfYml0KGJzKSkgeworCQlleHQgPSAxOworCQl0eXBlID0gZ2V0X2JpdHMoYnMsIDcpICsgZi0+bGI7CisJfSBlbHNlIHsKKwkJZXh0ID0gMDsKKwkJdHlwZSA9IGdldF9iaXRzKGJzLCBmLT5zeik7CisJfQorCisJLyogV3JpdGUgVHlwZSAqLworCWlmIChiYXNlKQorCQkqKHVuc2lnbmVkICopIGJhc2UgPSB0eXBlOworCisJLyogQ2hlY2sgUmFuZ2UgKi8KKwlpZiAodHlwZSA+PSBmLT51YikgewkvKiBOZXdlciB2ZXJzaW9uPyAqLworCQlCWVRFX0FMSUdOKGJzKTsKKwkJbGVuID0gZ2V0X2xlbihicyk7CisJCUNIRUNLX0JPVU5EKGJzLCBsZW4pOworCQlicy0+Y3VyICs9IGxlbjsKKwkJcmV0dXJuIEgzMjNfRVJST1JfTk9ORTsKKwl9CisKKwkvKiBUcmFuc2ZlciB0byBzb24gbGV2ZWwgKi8KKwlzb24gPSAmZi0+ZmllbGRzW3R5cGVdOworCWlmIChzb24tPmF0dHIgJiBTVE9QKSB7CisJCVBSSU5UKCIlKi5zJXNcbiIsIChsZXZlbCArIDEpICogVEFCX1NJWkUsICIgIiwgc29uLT5uYW1lKTsKKwkJcmV0dXJuIEgzMjNfRVJST1JfU1RPUDsKKwl9CisKKwlpZiAoZXh0IHx8IChzb24tPmF0dHIgJiBPUEVOKSkgeworCQlCWVRFX0FMSUdOKGJzKTsKKwkJbGVuID0gZ2V0X2xlbihicyk7CisJCUNIRUNLX0JPVU5EKGJzLCBsZW4pOworCQlpZiAoIWJhc2UgfHwgIShzb24tPmF0dHIgJiBERUNPREUpKSB7CisJCQlQUklOVCgiJSoucyVzXG4iLCAobGV2ZWwgKyAxKSAqIFRBQl9TSVpFLCAiICIsCisJCQkgICAgICBzb24tPm5hbWUpOworCQkJYnMtPmN1ciArPSBsZW47CisJCQlyZXR1cm4gSDMyM19FUlJPUl9OT05FOworCQl9CisJCWJlZyA9IGJzLT5jdXI7CisKKwkJaWYgKChlcnIgPSAoRGVjb2RlcnNbc29uLT50eXBlXSkgKGJzLCBzb24sIGJhc2UsIGxldmVsICsgMSkpIDwKKwkJICAgIEgzMjNfRVJST1JfTk9ORSkKKwkJCXJldHVybiBlcnI7CisKKwkJYnMtPmN1ciA9IGJlZyArIGxlbjsKKwkJYnMtPmJpdCA9IDA7CisJfSBlbHNlIGlmICgoZXJyID0gKERlY29kZXJzW3Nvbi0+dHlwZV0pIChicywgc29uLCBiYXNlLCBsZXZlbCArIDEpKSA8CisJCSAgIEgzMjNfRVJST1JfTk9ORSkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBIMzIzX0VSUk9SX05PTkU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IERlY29kZVJhc01lc3NhZ2UodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3Qgc3osIFJhc01lc3NhZ2UgKiByYXMpCit7CisJc3RhdGljIGZpZWxkX3QgcmFzX21lc3NhZ2UgPSB7CisJCUZOQU1FKCJSYXNNZXNzYWdlIikgQ0hPSUNFLCA1LCAyNCwgMzIsIERFQ09ERSB8IEVYVCwKKwkJMCwgX1Jhc01lc3NhZ2UKKwl9OworCWJpdHN0cl90IGJzOworCisJYnMuYnVmID0gYnMuYmVnID0gYnMuY3VyID0gYnVmOworCWJzLmVuZCA9IGJ1ZiArIHN6OworCWJzLmJpdCA9IDA7CisKKwlyZXR1cm4gZGVjb2RlX2Nob2ljZSgmYnMsICZyYXNfbWVzc2FnZSwgKGNoYXIgKikgcmFzLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IERlY29kZUgzMjNfVXNlckluZm9ybWF0aW9uKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciAqYmVnLAorCQkJCSAgICAgIHNpemVfdCBzeiwgSDMyM19Vc2VySW5mb3JtYXRpb24gKiB1dWllKQoreworCXN0YXRpYyBmaWVsZF90IGgzMjNfdXNlcmluZm9ybWF0aW9uID0geworCQlGTkFNRSgiSDMyMy1Vc2VySW5mb3JtYXRpb24iKSBTRVEsIDEsIDIsIDIsIERFQ09ERSB8IEVYVCwKKwkJMCwgX0gzMjNfVXNlckluZm9ybWF0aW9uCisJfTsKKwliaXRzdHJfdCBiczsKKworCWJzLmJ1ZiA9IGJ1ZjsKKwlicy5iZWcgPSBicy5jdXIgPSBiZWc7CisJYnMuZW5kID0gYmVnICsgc3o7CisJYnMuYml0ID0gMDsKKworCXJldHVybiBkZWNvZGVfc2VxKCZicywgJmgzMjNfdXNlcmluZm9ybWF0aW9uLCAoY2hhciAqKSB1dWllLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgRGVjb2RlTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6LAorCQkJCQkgTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlICoKKwkJCQkJIG1zY20pCit7CisJc3RhdGljIGZpZWxkX3QgbXVsdGltZWRpYXN5c3RlbWNvbnRyb2xtZXNzYWdlID0geworCQlGTkFNRSgiTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlIikgQ0hPSUNFLCAyLCA0LCA0LAorCQlERUNPREUgfCBFWFQsIDAsIF9NdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UKKwl9OworCWJpdHN0cl90IGJzOworCisJYnMuYnVmID0gYnMuYmVnID0gYnMuY3VyID0gYnVmOworCWJzLmVuZCA9IGJ1ZiArIHN6OworCWJzLmJpdCA9IDA7CisKKwlyZXR1cm4gZGVjb2RlX2Nob2ljZSgmYnMsICZtdWx0aW1lZGlhc3lzdGVtY29udHJvbG1lc3NhZ2UsCisJCQkgICAgIChjaGFyICopIG1zY20sIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBEZWNvZGVROTMxKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IHN6LCBROTMxICogcTkzMSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwID0gYnVmOworCWludCBsZW47CisKKwlpZiAoIXAgfHwgc3ogPCAxKQorCQlyZXR1cm4gSDMyM19FUlJPUl9CT1VORDsKKworCS8qIFByb3RvY29sIERpc2NyaW1pbmF0b3IgKi8KKwlpZiAoKnAgIT0gMHgwOCkgeworCQlQUklOVCgiVW5rbm93biBQcm90b2NvbCBEaXNjcmltaW5hdG9yXG4iKTsKKwkJcmV0dXJuIEgzMjNfRVJST1JfUkFOR0U7CisJfQorCXArKzsKKwlzei0tOworCisJLyogQ2FsbFJlZmVyZW5jZVZhbHVlICovCisJaWYgKHN6IDwgMSkKKwkJcmV0dXJuIEgzMjNfRVJST1JfQk9VTkQ7CisJbGVuID0gKnArKzsKKwlzei0tOworCWlmIChzeiA8IGxlbikKKwkJcmV0dXJuIEgzMjNfRVJST1JfQk9VTkQ7CisJcCArPSBsZW47CisJc3ogLT0gbGVuOworCisJLyogTWVzc2FnZSBUeXBlICovCisJaWYgKHN6IDwgMSkKKwkJcmV0dXJuIEgzMjNfRVJST1JfQk9VTkQ7CisJcTkzMS0+TWVzc2FnZVR5cGUgPSAqcCsrOworCVBSSU5UKCJNZXNzYWdlVHlwZSA9ICUwMlhcbiIsIHE5MzEtPk1lc3NhZ2VUeXBlKTsKKwlpZiAoKnAgJiAweDgwKSB7CisJCXArKzsKKwkJc3otLTsKKwl9CisKKwkvKiBEZWNvZGUgSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KKwl3aGlsZSAoc3ogPiAwKSB7CisJCWlmICgqcCA9PSAweDdlKSB7CS8qIFVzZXJVc2VySUUgKi8KKwkJCWlmIChzeiA8IDMpCisJCQkJYnJlYWs7CisJCQlwKys7CisJCQlsZW4gPSAqcCsrIDw8IDg7CisJCQlsZW4gfD0gKnArKzsKKwkJCXN6IC09IDM7CisJCQlpZiAoc3ogPCBsZW4pCisJCQkJYnJlYWs7CisJCQlwKys7CisJCQlsZW4tLTsKKwkJCXJldHVybiBEZWNvZGVIMzIzX1VzZXJJbmZvcm1hdGlvbihidWYsIHAsIGxlbiwKKwkJCQkJCQkgICZxOTMxLT5VVUlFKTsKKwkJfQorCQlwKys7CisJCXN6LS07CisJCWlmIChzeiA8IDEpCisJCQlicmVhazsKKwkJbGVuID0gKnArKzsKKwkJaWYgKHN6IDwgbGVuKQorCQkJYnJlYWs7CisJCXAgKz0gbGVuOworCQlzeiAtPSBsZW47CisJfQorCisJUFJJTlQoIlEuOTMxIFVVSUUgbm90IGZvdW5kXG4iKTsKKworCXJldHVybiBIMzIzX0VSUk9SX0JPVU5EOworfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDg1Njg5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKQEAgLTAsMCArMSwxODU2IEBACisvKgorICogSC4zMjMgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogQmFzZWQgb24gdGhlICdicnV0ZSBmb3JjZScgSC4zMjMgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUgYnkKKyAqIEpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBodHRwOi8vbmF0aDMyMy5zb3VyY2Vmb3JnZS5uZXQvCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogUGFyYW1ldGVycyAqLworc3RhdGljIHVuc2lnbmVkIGludCBkZWZhdWx0X3JycV90dGwgX19yZWFkX21vc3RseSA9IDMwMDsKK21vZHVsZV9wYXJhbShkZWZhdWx0X3JycV90dGwsIHVpbnQsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X3JycV90dGwsICJ1c2UgdGhpcyBUVEwgaWYgaXQncyBtaXNzaW5nIGluIFJSUSIpOworCitzdGF0aWMgaW50IGdrcm91dGVkX29ubHkgX19yZWFkX21vc3RseSA9IDE7Cittb2R1bGVfcGFyYW0oZ2tyb3V0ZWRfb25seSwgaW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZ2tyb3V0ZWRfb25seSwgIm9ubHkgYWNjZXB0IGNhbGxzIGZyb20gZ2F0ZWtlZXBlciIpOworCitzdGF0aWMgaW50IGNhbGxmb3J3YXJkX2ZpbHRlciBfX3JlYWRfbW9zdGx5ID0gMTsKK21vZHVsZV9wYXJhbShjYWxsZm9yd2FyZF9maWx0ZXIsIGJvb2wsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhjYWxsZm9yd2FyZF9maWx0ZXIsICJvbmx5IGNyZWF0ZSBjYWxsIGZvcndhcmRpbmcgZXhwZWN0YXRpb25zICIKKwkJICAgICAgICAgICAgICAgICAgICAgImlmIGJvdGggZW5kcG9pbnRzIGFyZSBvbiBkaWZmZXJlbnQgc2lkZXMgIgorCQkJCSAgICAgIihkZXRlcm1pbmVkIGJ5IHJvdXRpbmcgaW5mb3JtYXRpb24pIik7CisKKy8qIEhvb2tzIGZvciBOQVQgKi8KK2ludCAoKnNldF9oMjQ1X2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCSAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkgICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqYWRkciwgX19iZTE2IHBvcnQpCisJCQkgICBfX3JlYWRfbW9zdGx5OworaW50ICgqc2V0X2gyMjVfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkgICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqYWRkciwgX19iZTE2IHBvcnQpCisJCQkgICBfX3JlYWRfbW9zdGx5OworaW50ICgqc2V0X3NpZ19hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLAorCQkJICBUcmFuc3BvcnRBZGRyZXNzICp0YWRkciwgaW50IGNvdW50KSBfX3JlYWRfbW9zdGx5OworaW50ICgqc2V0X3Jhc19hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLAorCQkJICBUcmFuc3BvcnRBZGRyZXNzICp0YWRkciwgaW50IGNvdW50KSBfX3JlYWRfbW9zdGx5OworaW50ICgqbmF0X3J0cF9ydGNwX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCSAgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICp0YWRkciwKKwkJCSAgX19iZTE2IHBvcnQsIF9fYmUxNiBydHBfcG9ydCwKKwkJCSAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnJ0cF9leHAsCisJCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpydGNwX2V4cCkgX19yZWFkX21vc3RseTsKK2ludCAoKm5hdF90MTIwX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJICAgICAgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICp0YWRkciwgX19iZTE2IHBvcnQsCisJCSAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApIF9fcmVhZF9tb3N0bHk7CitpbnQgKCpuYXRfaDI0NV9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCSAgICAgIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyLCBfX2JlMTYgcG9ydCwKKwkJICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkgX19yZWFkX21vc3RseTsKK2ludCAoKm5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCXN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkJVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIF9fYmUxNiBwb3J0LAorCQkJCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApIF9fcmVhZF9tb3N0bHk7CitpbnQgKCpuYXRfcTkzMV9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIGludCBpZHgsCisJCSAgICAgIF9fYmUxNiBwb3J0LCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQorCQkgICAgICBfX3JlYWRfbW9zdGx5OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5mX2gzMjNfbG9jayk7CitzdGF0aWMgY2hhciAqaDMyM19idWZmZXI7CisKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBuZl9jb25udHJhY2tfaGVscGVyX2gyNDU7CitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxW107CitzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgbmZfY29ubnRyYWNrX2hlbHBlcl9yYXNbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGdldF90cGt0X2RhdGEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJCSBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgKmRhdGFsZW4sIGludCAqZGF0YW9mZikKK3sKKwlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9oMzIzX2luZm87CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CisJaW50IHRjcGRhdGFsZW47CisJaW50IHRjcGRhdGFvZmY7CisJdW5zaWduZWQgY2hhciAqdHBrdDsKKwlpbnQgdHBrdGxlbjsKKwlpbnQgdHBrdG9mZjsKKworCS8qIEdldCBUQ1AgaGVhZGVyICovCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpCisJCXJldHVybiAwOworCisJLyogR2V0IFRDUCBkYXRhIG9mZnNldCAqLworCXRjcGRhdGFvZmYgPSBwcm90b2ZmICsgdGgtPmRvZmYgKiA0OworCisJLyogR2V0IFRDUCBkYXRhIGxlbmd0aCAqLworCXRjcGRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSB0Y3BkYXRhb2ZmOworCWlmICh0Y3BkYXRhbGVuIDw9IDApCS8qIE5vIFRDUCBkYXRhICovCisJCWdvdG8gY2xlYXJfb3V0OworCisJaWYgKCpkYXRhID09IE5VTEwpIHsJLyogZmlyc3QgVFBLVCAqLworCQkvKiBHZXQgZmlyc3QgVFBLVCBwb2ludGVyICovCisJCXRwa3QgPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIHRjcGRhdGFvZmYsIHRjcGRhdGFsZW4sCisJCQkJCSAgaDMyM19idWZmZXIpOworCQlCVUdfT04odHBrdCA9PSBOVUxMKTsKKworCQkvKiBWYWxpZGF0ZSBUUEtUIGlkZW50aWZpZXIgKi8KKwkJaWYgKHRjcGRhdGFsZW4gPCA0IHx8IHRwa3RbMF0gIT0gMHgwMyB8fCB0cGt0WzFdICE9IDApIHsKKwkJCS8qIE5ldG1lZXRpbmcgc2VuZHMgVFBLVCBoZWFkZXIgYW5kIGRhdGEgc2VwYXJhdGVseSAqLworCQkJaWYgKGluZm8tPnRwa3RfbGVuW2Rpcl0gPiAwKSB7CisJCQkJREVCVUdQKCJuZl9jdF9oMzIzOiBwcmV2aW91cyBwYWNrZXQgIgorCQkJCSAgICAgICAiaW5kaWNhdGVkIHNlcGFyYXRlIFRQS1QgZGF0YSBvZiAlaHUgIgorCQkJCSAgICAgICAiYnl0ZXNcbiIsIGluZm8tPnRwa3RfbGVuW2Rpcl0pOworCQkJCWlmIChpbmZvLT50cGt0X2xlbltkaXJdIDw9IHRjcGRhdGFsZW4pIHsKKwkJCQkJLyogWWVzLCB0aGVyZSB3YXMgYSBUUEtUIGhlYWRlcgorCQkJCQkgKiByZWNlaXZlZCAqLworCQkJCQkqZGF0YSA9IHRwa3Q7CisJCQkJCSpkYXRhbGVuID0gaW5mby0+dHBrdF9sZW5bZGlyXTsKKwkJCQkJKmRhdGFvZmYgPSAwOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQkvKiBGcmFnbWVudGVkIFRQS1QgKi8KKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoIm5mX2N0X2gzMjM6ICIKKwkJCQkJICAgICAgICJmcmFnbWVudGVkIFRQS1RcbiIpOworCQkJCWdvdG8gY2xlYXJfb3V0OworCQkJfQorCisJCQkvKiBJdCBpcyBub3QgZXZlbiBhIFRQS1QgKi8KKwkJCXJldHVybiAwOworCQl9CisJCXRwa3RvZmYgPSAwOworCX0gZWxzZSB7CQkvKiBOZXh0IFRQS1QgKi8KKwkJdHBrdG9mZiA9ICpkYXRhb2ZmICsgKmRhdGFsZW47CisJCXRjcGRhdGFsZW4gLT0gdHBrdG9mZjsKKwkJaWYgKHRjcGRhdGFsZW4gPD0gNCkJLyogTm8gbW9yZSBUUEtUICovCisJCQlnb3RvIGNsZWFyX291dDsKKwkJdHBrdCA9ICpkYXRhICsgKmRhdGFsZW47CisKKwkJLyogVmFsaWRhdGUgVFBLVCBpZGVudGlmaWVyICovCisJCWlmICh0cGt0WzBdICE9IDB4MDMgfHwgdHBrdFsxXSAhPSAwKQorCQkJZ290byBjbGVhcl9vdXQ7CisJfQorCisJLyogVmFsaWRhdGUgVFBLVCBsZW5ndGggKi8KKwl0cGt0bGVuID0gdHBrdFsyXSAqIDI1NiArIHRwa3RbM107CisJaWYgKHRwa3RsZW4gPCA0KQorCQlnb3RvIGNsZWFyX291dDsKKwlpZiAodHBrdGxlbiA+IHRjcGRhdGFsZW4pIHsKKwkJaWYgKHRjcGRhdGFsZW4gPT0gNCkgewkvKiBTZXBhcmF0ZSBUUEtUIGhlYWRlciAqLworCQkJLyogTmV0bWVldGluZyBzZW5kcyBUUEtUIGhlYWRlciBhbmQgZGF0YSBzZXBhcmF0ZWx5ICovCisJCQlERUJVR1AoIm5mX2N0X2gzMjM6IHNlcGFyYXRlIFRQS1QgaGVhZGVyIGluZGljYXRlcyAiCisJCQkgICAgICAgInRoZXJlIHdpbGwgYmUgVFBLVCBkYXRhIG9mICVodSBieXRlc1xuIiwKKwkJCSAgICAgICB0cGt0bGVuIC0gNCk7CisJCQlpbmZvLT50cGt0X2xlbltkaXJdID0gdHBrdGxlbiAtIDQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoIm5mX2N0X2gzMjM6IGluY29tcGxldGUgVFBLVCAoZnJhZ21lbnRlZD8pXG4iKTsKKwkJZ290byBjbGVhcl9vdXQ7CisJfQorCisJLyogVGhpcyBpcyB0aGUgZW5jYXBzdWxhdGVkIGRhdGEgKi8KKwkqZGF0YSA9IHRwa3QgKyA0OworCSpkYXRhbGVuID0gdHBrdGxlbiAtIDQ7CisJKmRhdGFvZmYgPSB0cGt0b2ZmICsgNDsKKworICAgICAgb3V0OgorCS8qIENsZWFyIFRQS1QgbGVuZ3RoICovCisJaW5mby0+dHBrdF9sZW5bZGlyXSA9IDA7CisJcmV0dXJuIDE7CisKKyAgICAgIGNsZWFyX291dDoKKwlpbmZvLT50cGt0X2xlbltkaXJdID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGdldF9oMjQ1X2FkZHIoc3RydWN0IG5mX2Nvbm4gKmN0LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCQkgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsIF9fYmUxNiAqcG9ydCkKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBmYW1pbHkgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtOworCWludCBsZW47CisKKwlpZiAodGFkZHItPmNob2ljZSAhPSBlSDI0NV9UcmFuc3BvcnRBZGRyZXNzX3VuaWNhc3RBZGRyZXNzKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAodGFkZHItPnVuaWNhc3RBZGRyZXNzLmNob2ljZSkgeworCWNhc2UgZVVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzczoKKwkJaWYgKGZhbWlseSAhPSBBRl9JTkVUKQorCQkJcmV0dXJuIDA7CisJCXAgPSBkYXRhICsgdGFkZHItPnVuaWNhc3RBZGRyZXNzLmlQQWRkcmVzcy5uZXR3b3JrOworCQlsZW4gPSA0OworCQlicmVhazsKKwljYXNlIGVVbmljYXN0QWRkcmVzc19pUDZBZGRyZXNzOgorCQlpZiAoZmFtaWx5ICE9IEFGX0lORVQ2KQorCQkJcmV0dXJuIDA7CisJCXAgPSBkYXRhICsgdGFkZHItPnVuaWNhc3RBZGRyZXNzLmlQNkFkZHJlc3MubmV0d29yazsKKwkJbGVuID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCW1lbWNweShhZGRyLCBwLCBsZW4pOworCW1lbXNldCgodm9pZCAqKWFkZHIgKyBsZW4sIDAsIHNpemVvZigqYWRkcikgLSBsZW4pOworCW1lbWNweShwb3J0LCBwICsgbGVuLCBzaXplb2YoX19iZTE2KSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGV4cGVjdF9ydHBfcnRjcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICp0YWRkcikKK3sKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCByZXQgPSAwOworCV9fYmUxNiBwb3J0OworCV9fYmUxNiBydHBfcG9ydCwgcnRjcF9wb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnJ0cF9leHA7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnJ0Y3BfZXhwOworCXR5cGVvZihuYXRfcnRwX3J0Y3BfaG9vaykgbmF0X3J0cF9ydGNwOworCisJLyogUmVhZCBSVFAgb3IgUlRDUCBhZGRyZXNzICovCisJaWYgKCFnZXRfaDI0NV9hZGRyKGN0LCAqZGF0YSwgdGFkZHIsICZhZGRyLCAmcG9ydCkgfHwKKwkgICAgbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51Mywgc2l6ZW9mKGFkZHIpKSB8fAorCSAgICBwb3J0ID09IDApCisJCXJldHVybiAwOworCisJLyogUlRQIHBvcnQgaXMgZXZlbiAqLworCXBvcnQgJj0gaHRvbnMofjEpOworCXJ0cF9wb3J0ID0gcG9ydDsKKwlydGNwX3BvcnQgPSBodG9ucyhudG9ocyhwb3J0KSArIDEpOworCisJLyogQ3JlYXRlIGV4cGVjdCBmb3IgUlRQICovCisJaWYgKChydHBfZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKwluZl9jb25udHJhY2tfZXhwZWN0X2luaXQocnRwX2V4cCwgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywKKwkJCQkgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkJCSBJUFBST1RPX1VEUCwgTlVMTCwgJnJ0cF9wb3J0KTsKKworCS8qIENyZWF0ZSBleHBlY3QgZm9yIFJUQ1AgKi8KKwlpZiAoKHJ0Y3BfZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpIHsKKwkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQocnRwX2V4cCk7CisJCXJldHVybiAtMTsKKwl9CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KHJ0Y3BfZXhwLCBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5sM251bSwKKwkJCQkgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUzLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCQkJIElQUFJPVE9fVURQLCBOVUxMLCAmcnRjcF9wb3J0KTsKKworCWlmIChtZW1jbXAoJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMsCisJICAgCSAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJICAgc2l6ZW9mKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMpKSAmJgorCQkgICAobmF0X3J0cF9ydGNwID0gcmN1X2RlcmVmZXJlbmNlKG5hdF9ydHBfcnRjcF9ob29rKSkgJiYKKwkJICAgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykgeworCQkvKiBOQVQgbmVlZGVkICovCisJCXJldCA9IG5hdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgIHRhZGRyLCBwb3J0LCBydHBfcG9ydCwgcnRwX2V4cCwgcnRjcF9leHApOworCX0gZWxzZSB7CQkvKiBDb25udHJhY2sgb25seSAqLworCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHJ0cF9leHApID09IDApIHsKKwkJCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQocnRjcF9leHApID09IDApIHsKKwkJCQlERUJVR1AoIm5mX2N0X2gzMjM6IGV4cGVjdCBSVFAgIik7CisJCQkJTkZfQ1RfRFVNUF9UVVBMRSgmcnRwX2V4cC0+dHVwbGUpOworCQkJCURFQlVHUCgibmZfY3RfaDMyMzogZXhwZWN0IFJUQ1AgIik7CisJCQkJTkZfQ1RfRFVNUF9UVVBMRSgmcnRjcF9leHAtPnR1cGxlKTsKKwkJCX0gZWxzZSB7CisJCQkJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQocnRwX2V4cCk7CisJCQkJcmV0ID0gLTE7CisJCQl9CisJCX0gZWxzZQorCQkJcmV0ID0gLTE7CisJfQorCisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQocnRwX2V4cCk7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQocnRjcF9leHApOworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGV4cGVjdF90MTIwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkgICAgICAgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICp0YWRkcikKK3sKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCByZXQgPSAwOworCV9fYmUxNiBwb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwl0eXBlb2YobmF0X3QxMjBfaG9vaykgbmF0X3QxMjA7CisKKwkvKiBSZWFkIFQuMTIwIGFkZHJlc3MgKi8KKwlpZiAoIWdldF9oMjQ1X2FkZHIoY3QsICpkYXRhLCB0YWRkciwgJmFkZHIsICZwb3J0KSB8fAorCSAgICBtZW1jbXAoJmFkZHIsICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLCBzaXplb2YoYWRkcikpIHx8CisJICAgIHBvcnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDcmVhdGUgZXhwZWN0IGZvciBULjEyMCBjb25uZWN0aW9ucyAqLworCWlmICgoZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKwluZl9jb25udHJhY2tfZXhwZWN0X2luaXQoZXhwLCBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5sM251bSwKKwkJCQkgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUzLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCQkJIElQUFJPVE9fVENQLCBOVUxMLCAmcG9ydCk7CisJZXhwLT5mbGFncyA9IE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQ7CS8qIEFjY2VwdCBtdWx0aXBsZSBjaGFubmVscyAqLworCisJaWYgKG1lbWNtcCgmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51MywKKwkJICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkgICBzaXplb2YoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51MykpICYmCisJICAgIChuYXRfdDEyMCA9IHJjdV9kZXJlZmVyZW5jZShuYXRfdDEyMF9ob29rKSkgJiYKKwkgICAgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykgeworCQkvKiBOQVQgbmVlZGVkICovCisJCXJldCA9IG5hdF90MTIwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsIHRhZGRyLAorCQkJICAgICAgIHBvcnQsIGV4cCk7CisJfSBlbHNlIHsJCS8qIENvbm50cmFjayBvbmx5ICovCisJCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7CisJCQlERUJVR1AoIm5mX2N0X2gzMjM6IGV4cGVjdCBULjEyMCAiKTsKKwkJCU5GX0NUX0RVTVBfVFVQTEUoJmV4cC0+dHVwbGUpOworCQl9IGVsc2UKKwkJCXJldCA9IC0xOworCX0KKworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19oMjQ1X2NoYW5uZWwoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCXN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkJSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMgKmNoYW5uZWwpCit7CisJaW50IHJldDsKKworCWlmIChjaGFubmVsLT5vcHRpb25zICYgZUgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21lZGlhQ2hhbm5lbCkgeworCQkvKiBSVFAgKi8KKwkJcmV0ID0gZXhwZWN0X3J0cF9ydGNwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAgICAgJmNoYW5uZWwtPm1lZGlhQ2hhbm5lbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChjaGFubmVsLT4KKwkgICAgb3B0aW9ucyAmIGVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tZWRpYUNvbnRyb2xDaGFubmVsKSB7CisJCS8qIFJUQ1AgKi8KKwkJcmV0ID0gZXhwZWN0X3J0cF9ydGNwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAgICAgJmNoYW5uZWwtPm1lZGlhQ29udHJvbENoYW5uZWwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3Nfb2xjKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCSAgICAgICBPcGVuTG9naWNhbENoYW5uZWwgKm9sYykKK3sKKwlpbnQgcmV0OworCisJREVCVUdQKCJuZl9jdF9oMzIzOiBPcGVuTG9naWNhbENoYW5uZWxcbiIpOworCisJaWYgKG9sYy0+Zm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5tdWx0aXBsZXhQYXJhbWV0ZXJzLmNob2ljZSA9PQorCSAgICBlT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycykKKwl7CisJCXJldCA9IHByb2Nlc3NfaDI0NV9jaGFubmVsKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgICZvbGMtPgorCQkJCQkgICBmb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLgorCQkJCQkgICBtdWx0aXBsZXhQYXJhbWV0ZXJzLgorCQkJCQkgICBoMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICgob2xjLT5vcHRpb25zICYKKwkgICAgIGVPcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycykgJiYKKwkgICAgKG9sYy0+cmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5vcHRpb25zICYKKwkgICAgIGVPcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzKQorCSAgICAmJiAob2xjLT5yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLm11bHRpcGxleFBhcmFtZXRlcnMuCisJCWNob2ljZSA9PQorCQllT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycykpCisJeworCQlyZXQgPQorCQkgICAgcHJvY2Vzc19oMjQ1X2NoYW5uZWwocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICZvbGMtPgorCQkJCQkgcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy4KKwkJCQkJIG11bHRpcGxleFBhcmFtZXRlcnMuCisJCQkJCSBoMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICgob2xjLT5vcHRpb25zICYgZU9wZW5Mb2dpY2FsQ2hhbm5lbF9zZXBhcmF0ZVN0YWNrKSAmJgorCSAgICBvbGMtPmZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuZGF0YVR5cGUuY2hvaWNlID09CisJICAgIGVEYXRhVHlwZV9kYXRhICYmCisJICAgIG9sYy0+Zm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5kYXRhVHlwZS5kYXRhLmFwcGxpY2F0aW9uLgorCSAgICBjaG9pY2UgPT0gZURhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fdDEyMCAmJgorCSAgICBvbGMtPmZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuZGF0YVR5cGUuZGF0YS5hcHBsaWNhdGlvbi4KKwkgICAgdDEyMC5jaG9pY2UgPT0gZURhdGFQcm90b2NvbENhcGFiaWxpdHlfc2VwYXJhdGVMQU5TdGFjayAmJgorCSAgICBvbGMtPnNlcGFyYXRlU3RhY2submV0d29ya0FkZHJlc3MuY2hvaWNlID09CisJICAgIGVOZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19uZXR3b3JrQWRkcmVzc19sb2NhbEFyZWFBZGRyZXNzKSB7CisJCXJldCA9IGV4cGVjdF90MTIwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAmb2xjLT5zZXBhcmF0ZVN0YWNrLm5ldHdvcmtBZGRyZXNzLgorCQkJCSAgbG9jYWxBcmVhQWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19vbGNhKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQlPcGVuTG9naWNhbENoYW5uZWxBY2sgKm9sY2EpCit7CisJSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnMgKmFjazsKKwlpbnQgcmV0OworCisJREVCVUdQKCJuZl9jdF9oMzIzOiBPcGVuTG9naWNhbENoYW5uZWxBY2tcbiIpOworCisJaWYgKChvbGNhLT5vcHRpb25zICYKKwkgICAgIGVPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycykgJiYKKwkgICAgKG9sY2EtPnJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMub3B0aW9ucyAmCisJICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycykKKwkgICAgJiYgKG9sY2EtPnJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMubXVsdGlwbGV4UGFyYW1ldGVycy4KKwkJY2hvaWNlID09CisJCWVPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzX2gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSkKKwl7CisJCXJldCA9IHByb2Nlc3NfaDI0NV9jaGFubmVsKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgICZvbGNhLT4KKwkJCQkJICAgcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy4KKwkJCQkJICAgbXVsdGlwbGV4UGFyYW1ldGVycy4KKwkJCQkJICAgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKG9sY2EtPm9wdGlvbnMgJgorCSAgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVycykgJiYKKwkgICAgKG9sY2EtPmZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzLmNob2ljZSA9PQorCSAgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVycykpCisJeworCQlhY2sgPSAmb2xjYS0+Zm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnMuCisJCSAgICBoMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVyczsKKwkJaWYgKGFjay0+b3B0aW9ucyAmCisJCSAgICBlSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfbWVkaWFDaGFubmVsKSB7CisJCQkvKiBSVFAgKi8KKwkJCXJldCA9IGV4cGVjdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICAgICAmYWNrLT5tZWRpYUNoYW5uZWwpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGFjay0+b3B0aW9ucyAmCisJCSAgICBlSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfbWVkaWFDb250cm9sQ2hhbm5lbCkgeworCQkJLyogUlRDUCAqLworCQkJcmV0ID0gZXhwZWN0X3J0cF9ydGNwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgICAgICZhY2stPm1lZGlhQ29udHJvbENoYW5uZWwpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX2gyNDUoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJCU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSAqbXNjbSkKK3sKKwlzd2l0Y2ggKG1zY20tPmNob2ljZSkgeworCWNhc2UgZU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZV9yZXF1ZXN0OgorCQlpZiAobXNjbS0+cmVxdWVzdC5jaG9pY2UgPT0KKwkJICAgIGVSZXF1ZXN0TWVzc2FnZV9vcGVuTG9naWNhbENoYW5uZWwpIHsKKwkJCXJldHVybiBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICAmbXNjbS0+cmVxdWVzdC5vcGVuTG9naWNhbENoYW5uZWwpOworCQl9CisJCURFQlVHUCgibmZfY3RfaDMyMzogSC4yNDUgUmVxdWVzdCAlZFxuIiwKKwkJICAgICAgIG1zY20tPnJlcXVlc3QuY2hvaWNlKTsKKwkJYnJlYWs7CisJY2FzZSBlTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlX3Jlc3BvbnNlOgorCQlpZiAobXNjbS0+cmVzcG9uc2UuY2hvaWNlID09CisJCSAgICBlUmVzcG9uc2VNZXNzYWdlX29wZW5Mb2dpY2FsQ2hhbm5lbEFjaykgeworCQkJcmV0dXJuIHByb2Nlc3Nfb2xjYShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICAgJm1zY20tPnJlc3BvbnNlLgorCQkJCQkgICAgb3BlbkxvZ2ljYWxDaGFubmVsQWNrKTsKKwkJfQorCQlERUJVR1AoIm5mX2N0X2gzMjM6IEguMjQ1IFJlc3BvbnNlICVkXG4iLAorCQkgICAgICAgbXNjbS0+cmVzcG9uc2UuY2hvaWNlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKCJuZl9jdF9oMzIzOiBILjI0NSBzaWduYWwgJWRcbiIsIG1zY20tPmNob2ljZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgaDI0NV9oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlzdGF0aWMgTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlIG1zY207CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IE5VTEw7CisJaW50IGRhdGFsZW47CisJaW50IGRhdGFvZmY7CisJaW50IHJldDsKKworCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLworCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKKwkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpIHsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisJREVCVUdQKCJuZl9jdF9oMjQ1OiBza2JsZW4gPSAldVxuIiwgKCpwc2tiKS0+bGVuKTsKKworCXNwaW5fbG9ja19iaCgmbmZfaDMyM19sb2NrKTsKKworCS8qIFByb2Nlc3MgZWFjaCBUUEtUICovCisJd2hpbGUgKGdldF90cGt0X2RhdGEocHNrYiwgcHJvdG9mZiwgY3QsIGN0aW5mbywKKwkJCSAgICAgJmRhdGEsICZkYXRhbGVuLCAmZGF0YW9mZikpIHsKKwkJREVCVUdQKCJuZl9jdF9oMjQ1OiBUUEtUIGxlbj0lZCAiLCBkYXRhbGVuKTsKKwkJTkZfQ1RfRFVNUF9UVVBMRSgmY3QtPnR1cGxlaGFzaFtDVElORk8yRElSKGN0aW5mbyldLnR1cGxlKTsKKworCQkvKiBEZWNvZGUgSC4yNDUgc2lnbmFsICovCisJCXJldCA9IERlY29kZU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZShkYXRhLCBkYXRhbGVuLAorCQkJCQkJCSAgICZtc2NtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKCJuZl9jdF9oMjQ1OiBkZWNvZGluZyBlcnJvcjogJXNcbiIsCisJCQkJICAgICAgIHJldCA9PSBIMzIzX0VSUk9SX0JPVU5EID8KKwkJCQkgICAgICAgIm91dCBvZiBib3VuZCIgOiAib3V0IG9mIHJhbmdlIik7CisJCQkvKiBXZSBkb24ndCBkcm9wIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyogUHJvY2VzcyBILjI0NSBzaWduYWwgKi8KKwkJaWYgKHByb2Nlc3NfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCAmZGF0YSwgZGF0YW9mZiwgJm1zY20pIDwgMCkKKwkJCWdvdG8gZHJvcDsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmbmZfaDMyM19sb2NrKTsKKwlyZXR1cm4gTkZfQUNDRVBUOworCisgICAgICBkcm9wOgorCXNwaW5fdW5sb2NrX2JoKCZuZl9oMzIzX2xvY2spOworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50aygibmZfY3RfaDI0NTogcGFja2V0IGRyb3BwZWRcbiIpOworCXJldHVybiBORl9EUk9QOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBuZl9jb25udHJhY2tfaGVscGVyX2gyNDUgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJCT0gIkguMjQ1IiwKKwkubWUJCQk9IFRISVNfTU9EVUxFLAorCS5tYXhfZXhwZWN0ZWQJCT0gSDMyM19SVFBfQ0hBTk5FTF9NQVggKiA0ICsgMiAvKiBULjEyMCAqLywKKwkudGltZW91dAkJPSAyNDAsCisJLnR1cGxlLmRzdC5wcm90b251bQk9IElQUFJPVE9fVURQLAorCS5tYXNrLnNyYy51LnVkcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygweEZGRkYpLAorCS5tYXNrLmRzdC5wcm90b251bQk9IDB4RkYsCisJLmhlbHAJCQk9IGgyNDVfaGVscAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZ2V0X2gyMjVfYWRkcihzdHJ1Y3QgbmZfY29ubiAqY3QsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCSAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsCisJCSAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsIF9fYmUxNiAqcG9ydCkKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBmYW1pbHkgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtOworCWludCBsZW47CisKKwlzd2l0Y2ggKHRhZGRyLT5jaG9pY2UpIHsKKwljYXNlIGVUcmFuc3BvcnRBZGRyZXNzX2lwQWRkcmVzczoKKwkJaWYgKGZhbWlseSAhPSBBRl9JTkVUKQorCQkJcmV0dXJuIDA7CisJCXAgPSBkYXRhICsgdGFkZHItPmlwQWRkcmVzcy5pcDsKKwkJbGVuID0gNDsKKwkJYnJlYWs7CisJY2FzZSBlVHJhbnNwb3J0QWRkcmVzc19pcDZBZGRyZXNzOgorCQlpZiAoZmFtaWx5ICE9IEFGX0lORVQ2KQorCQkJcmV0dXJuIDA7CisJCXAgPSBkYXRhICsgdGFkZHItPmlwNkFkZHJlc3MuaXA2OworCQlsZW4gPSAxNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtY3B5KGFkZHIsIHAsIGxlbik7CisJbWVtc2V0KCh2b2lkICopYWRkciArIGxlbiwgMCwgc2l6ZW9mKCphZGRyKSAtIGxlbik7CisJbWVtY3B5KHBvcnQsIHAgKyBsZW4sIHNpemVvZihfX2JlMTYpKTsKKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZXhwZWN0X2gyNDUoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKKwkJICAgICAgIFRyYW5zcG9ydEFkZHJlc3MgKnRhZGRyKQoreworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJaW50IHJldCA9IDA7CisJX19iZTE2IHBvcnQ7CisJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgYWRkcjsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCXR5cGVvZihuYXRfaDI0NV9ob29rKSBuYXRfaDI0NTsKKworCS8qIFJlYWQgaDI0NUFkZHJlc3MgKi8KKwlpZiAoIWdldF9oMjI1X2FkZHIoY3QsICpkYXRhLCB0YWRkciwgJmFkZHIsICZwb3J0KSB8fAorCSAgICBtZW1jbXAoJmFkZHIsICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLCBzaXplb2YoYWRkcikpIHx8CisJICAgIHBvcnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDcmVhdGUgZXhwZWN0IGZvciBoMjQ1IGNvbm5lY3Rpb24gKi8KKwlpZiAoKGV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywKKwkJCQkgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkJCSBJUFBST1RPX1RDUCwgTlVMTCwgJnBvcnQpOworCWV4cC0+aGVscGVyID0gJm5mX2Nvbm50cmFja19oZWxwZXJfaDI0NTsKKworCWlmIChtZW1jbXAoJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMsCisJCSAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJICAgc2l6ZW9mKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMpKSAmJgorCSAgICAobmF0X2gyNDUgPSByY3VfZGVyZWZlcmVuY2UobmF0X2gyNDVfaG9vaykpICYmCisJICAgIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJLyogTkFUIG5lZWRlZCAqLworCQlyZXQgPSBuYXRfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLCB0YWRkciwKKwkJCSAgICAgICBwb3J0LCBleHApOworCX0gZWxzZSB7CQkvKiBDb25udHJhY2sgb25seSAqLworCQlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgeworCQkJREVCVUdQKCJuZl9jdF9xOTMxOiBleHBlY3QgSC4yNDUgIik7CisJCQlORl9DVF9EVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtMTsKKwl9CisKKwluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCisJcmV0dXJuIHJldDsKK30KKworLyogSWYgdGhlIGNhbGxpbmcgcGFydHkgaXMgb24gdGhlIHNhbWUgc2lkZSBvZiB0aGUgZm9yd2FyZC10byBwYXJ0eSwKKyAqIHdlIGRvbid0IG5lZWQgdG8gdHJhY2sgdGhlIHNlY29uZCBjYWxsICovCitzdGF0aWMgaW50IGNhbGxmb3J3YXJkX2RvX2ZpbHRlcih1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqc3JjLAorCQkJCSB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqZHN0LAorCQkJCSBpbnQgZmFtaWx5KQoreworCXN0cnVjdCBmbG93aSBmbDEsIGZsMjsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCgmZmwxLCAwLCBzaXplb2YoZmwxKSk7CisJbWVtc2V0KCZmbDIsIDAsIHNpemVvZihmbDIpKTsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOiB7CisJCXN0cnVjdCBydGFibGUgKnJ0MSwgKnJ0MjsKKworCQlmbDEuZmw0X2RzdCA9IHNyYy0+aXA7CisJCWZsMi5mbDRfZHN0ID0gZHN0LT5pcDsKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0MSwgJmZsMSkgPT0gMCkgeworCQkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0MiwgJmZsMikgPT0gMCkgeworCQkJCWlmIChydDEtPnJ0X2dhdGV3YXkgPT0gcnQyLT5ydF9nYXRld2F5ICYmCisJCQkJICAgIHJ0MS0+dS5kc3QuZGV2ICA9PSBydDItPnUuZHN0LmRldikKKwkJCQkJcmV0ID0gMTsKKwkJCQlkc3RfcmVsZWFzZSgmcnQyLT51LmRzdCk7CisJCQl9CisJCQlkc3RfcmVsZWFzZSgmcnQxLT51LmRzdCk7CisJCX0KKwkJYnJlYWs7CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCWNhc2UgQUZfSU5FVDY6IHsKKwkJc3RydWN0IHJ0Nl9pbmZvICpydDEsICpydDI7CisKKwkJbWVtY3B5KCZmbDEuZmw2X2RzdCwgc3JjLCBzaXplb2YoZmwxLmZsNl9kc3QpKTsKKwkJbWVtY3B5KCZmbDIuZmw2X2RzdCwgZHN0LCBzaXplb2YoZmwyLmZsNl9kc3QpKTsKKwkJcnQxID0gKHN0cnVjdCBydDZfaW5mbyAqKWlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgJmZsMSk7CisJCWlmIChydDEpIHsKKwkJCXJ0MiA9IChzdHJ1Y3QgcnQ2X2luZm8gKilpcDZfcm91dGVfb3V0cHV0KE5VTEwsICZmbDIpOworCQkJaWYgKHJ0MikgeworCQkJCWlmICghbWVtY21wKCZydDEtPnJ0NmlfZ2F0ZXdheSwgJnJ0Mi0+cnQ2aV9nYXRld2F5LAorCQkJCSAJICAgIHNpemVvZihydDEtPnJ0NmlfZ2F0ZXdheSkpICYmCisJCQkJICAgIHJ0MS0+dS5kc3QuZGV2ID09IHJ0Mi0+dS5kc3QuZGV2KQorCQkJCQlyZXQgPSAxOworCQkJCWRzdF9yZWxlYXNlKCZydDItPnUuZHN0KTsKKwkJCX0KKwkJCWRzdF9yZWxlYXNlKCZydDEtPnUuZHN0KTsKKwkJfQorCQlicmVhazsKKwl9CisjZW5kaWYKKwl9CisJcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZXhwZWN0X2NhbGxmb3J3YXJkaW5nKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCQkgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJCSBUcmFuc3BvcnRBZGRyZXNzICp0YWRkcikKK3sKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCByZXQgPSAwOworCV9fYmUxNiBwb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwl0eXBlb2YobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spIG5hdF9jYWxsZm9yd2FyZGluZzsKKworCS8qIFJlYWQgYWx0ZXJuYXRpdmVBZGRyZXNzICovCisJaWYgKCFnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgdGFkZHIsICZhZGRyLCAmcG9ydCkgfHwgcG9ydCA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIElmIHRoZSBjYWxsaW5nIHBhcnR5IGlzIG9uIHRoZSBzYW1lIHNpZGUgb2YgdGhlIGZvcndhcmQtdG8gcGFydHksCisJICogd2UgZG9uJ3QgbmVlZCB0byB0cmFjayB0aGUgc2Vjb25kIGNhbGwgKi8KKwlpZiAoY2FsbGZvcndhcmRfZmlsdGVyICYmCisJICAgIGNhbGxmb3J3YXJkX2RvX2ZpbHRlcigmYWRkciwgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUzLAorCSAgICAJCQkgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtKSkgeworCQlERUJVR1AoIm5mX2N0X3E5MzE6IENhbGwgRm9yd2FyZGluZyBub3QgdHJhY2tlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIENyZWF0ZSBleHBlY3QgZm9yIHRoZSBzZWNvbmQgY2FsbCBsZWcgKi8KKwlpZiAoKGV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywgJmFkZHIsCisJCQkJIElQUFJPVE9fVENQLCBOVUxMLCAmcG9ydCk7CisJZXhwLT5oZWxwZXIgPSBuZl9jb25udHJhY2tfaGVscGVyX3E5MzE7CisKKwlpZiAobWVtY21wKCZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLAorCQkgICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsCisJCSAgIHNpemVvZihjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzKSkgJiYKKwkgICAgKG5hdF9jYWxsZm9yd2FyZGluZyA9IHJjdV9kZXJlZmVyZW5jZShuYXRfY2FsbGZvcndhcmRpbmdfaG9vaykpICYmCisJICAgIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJLyogTmVlZCBOQVQgKi8KKwkJcmV0ID0gbmF0X2NhbGxmb3J3YXJkaW5nKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSB0YWRkciwgcG9ydCwgZXhwKTsKKwl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KKwkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKKwkJCURFQlVHUCgibmZfY3RfcTkzMTogZXhwZWN0IENhbGwgRm9yd2FyZGluZyAiKTsKKwkJCU5GX0NUX0RVTVBfVFVQTEUoJmV4cC0+dHVwbGUpOworCQl9IGVsc2UKKwkJCXJldCA9IC0xOworCX0KKworCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19zZXR1cChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgU2V0dXBfVVVJRSAqc2V0dXApCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0OworCWludCBpOworCV9fYmUxNiBwb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJdHlwZW9mKHNldF9oMjI1X2FkZHJfaG9vaykgc2V0X2gyMjVfYWRkcjsKKworCURFQlVHUCgibmZfY3RfcTkzMTogU2V0dXBcbiIpOworCisJaWYgKHNldHVwLT5vcHRpb25zICYgZVNldHVwX1VVSUVfaDI0NUFkZHJlc3MpIHsKKwkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICZzZXR1cC0+aDI0NUFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlzZXRfaDIyNV9hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9oMjI1X2FkZHJfaG9vayk7CisJaWYgKChzZXR1cC0+b3B0aW9ucyAmIGVTZXR1cF9VVUlFX2Rlc3RDYWxsU2lnbmFsQWRkcmVzcykgJiYKKwkgICAgKHNldF9oMjI1X2FkZHIpICYmIGN0LT5zdGF0dXMgJiYgSVBTX05BVF9NQVNLICYmCisJICAgIGdldF9oMjI1X2FkZHIoY3QsICpkYXRhLCAmc2V0dXAtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKKwkgICAgCQkgICZhZGRyLCAmcG9ydCkgJiYKKwkgICAgbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMsIHNpemVvZihhZGRyKSkpIHsKKwkJREVCVUdQKCJuZl9jdF9xOTMxOiBzZXQgZGVzdENhbGxTaWduYWxBZGRyZXNzICIKKwkJICAgICAgIE5JUDZfRk1UICI6JWh1LT4iIE5JUDZfRk1UICI6JWh1XG4iLAorCQkgICAgICAgTklQNigqKHN0cnVjdCBpbjZfYWRkciAqKSZhZGRyKSwgbnRvaHMocG9ydCksCisJCSAgICAgICBOSVA2KCooc3RydWN0IGluNl9hZGRyICopJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUzKSwKKwkJICAgICAgIG50b2hzKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUudGNwLnBvcnQpKTsKKwkJcmV0ID0gc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAmc2V0dXAtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKKwkJCQkgICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLnUzLAorCQkJCSAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51LnRjcC5wb3J0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKChzZXR1cC0+b3B0aW9ucyAmIGVTZXR1cF9VVUlFX3NvdXJjZUNhbGxTaWduYWxBZGRyZXNzKSAmJgorCSAgICAoc2V0X2gyMjVfYWRkcikgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSyAmJgorCSAgICBnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgJnNldHVwLT5zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcywKKwkgICAgCQkgICZhZGRyLCAmcG9ydCkgJiYKKwkgICAgbWVtY21wKCZhZGRyLCAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMsIHNpemVvZihhZGRyKSkpIHsKKwkJREVCVUdQKCJuZl9jdF9xOTMxOiBzZXQgc291cmNlQ2FsbFNpZ25hbEFkZHJlc3MgIgorCQkgICAgICAgTklQNl9GTVQgIjolaHUtPiIgTklQNl9GTVQgIjolaHVcbiIsCisJCSAgICAgICBOSVA2KCooc3RydWN0IGluNl9hZGRyICopJmFkZHIpLCBudG9ocyhwb3J0KSwKKwkJICAgICAgIE5JUDYoKihzdHJ1Y3QgaW42X2FkZHIgKikmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudTMpLAorCQkgICAgICAgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudS50Y3AucG9ydCkpOworCQlyZXQgPSBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsCisJCQkJICAgICZzZXR1cC0+c291cmNlQ2FsbFNpZ25hbEFkZHJlc3MsCisJCQkJICAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudS50Y3AucG9ydCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChzZXR1cC0+b3B0aW9ucyAmIGVTZXR1cF9VVUlFX2Zhc3RTdGFydCkgeworCQlmb3IgKGkgPSAwOyBpIDwgc2V0dXAtPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7CisJCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICZzZXR1cC0+ZmFzdFN0YXJ0Lml0ZW1baV0pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX2NhbGxwcm9jZWVkaW5nKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCSAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJCSAgQ2FsbFByb2NlZWRpbmdfVVVJRSAqY2FsbHByb2MpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCURFQlVHUCgibmZfY3RfcTkzMTogQ2FsbFByb2NlZWRpbmdcbiIpOworCisJaWYgKGNhbGxwcm9jLT5vcHRpb25zICYgZUNhbGxQcm9jZWVkaW5nX1VVSUVfaDI0NUFkZHJlc3MpIHsKKwkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICZjYWxscHJvYy0+aDI0NUFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY2FsbHByb2MtPm9wdGlvbnMgJiBlQ2FsbFByb2NlZWRpbmdfVVVJRV9mYXN0U3RhcnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNhbGxwcm9jLT5mYXN0U3RhcnQuY291bnQ7IGkrKykgeworCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAmY2FsbHByb2MtPmZhc3RTdGFydC5pdGVtW2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19jb25uZWN0KHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgICBDb25uZWN0X1VVSUUgKmNvbm5lY3QpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCURFQlVHUCgibmZfY3RfcTkzMTogQ29ubmVjdFxuIik7CisKKwlpZiAoY29ubmVjdC0+b3B0aW9ucyAmIGVDb25uZWN0X1VVSUVfaDI0NUFkZHJlc3MpIHsKKwkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICZjb25uZWN0LT5oMjQ1QWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChjb25uZWN0LT5vcHRpb25zICYgZUNvbm5lY3RfVVVJRV9mYXN0U3RhcnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvbm5lY3QtPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7CisJCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICZjb25uZWN0LT5mYXN0U3RhcnQuaXRlbVtpXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfYWxlcnRpbmcoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAorCQkJICAgIEFsZXJ0aW5nX1VVSUUgKmFsZXJ0KQoreworCWludCByZXQ7CisJaW50IGk7CisKKwlERUJVR1AoIm5mX2N0X3E5MzE6IEFsZXJ0aW5nXG4iKTsKKworCWlmIChhbGVydC0+b3B0aW9ucyAmIGVBbGVydGluZ19VVUlFX2gyNDVBZGRyZXNzKSB7CisJCXJldCA9IGV4cGVjdF9oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAmYWxlcnQtPmgyNDVBZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFsZXJ0LT5vcHRpb25zICYgZUFsZXJ0aW5nX1VVSUVfZmFzdFN0YXJ0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBhbGVydC0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKKwkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgJmFsZXJ0LT5mYXN0U3RhcnQuaXRlbVtpXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfaW5mb3JtYXRpb24oc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgICAgICAgSW5mb3JtYXRpb25fVVVJRSAqaW5mbykKK3sKKwlpbnQgcmV0OworCWludCBpOworCisJREVCVUdQKCJuZl9jdF9xOTMxOiBJbmZvcm1hdGlvblxuIik7CisKKwlpZiAoaW5mby0+b3B0aW9ucyAmIGVJbmZvcm1hdGlvbl9VVUlFX2Zhc3RTdGFydCkgeworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKKwkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgJmluZm8tPmZhc3RTdGFydC5pdGVtW2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19mYWNpbGl0eShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgICAgRmFjaWxpdHlfVVVJRSAqZmFjaWxpdHkpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCURFQlVHUCgibmZfY3RfcTkzMTogRmFjaWxpdHlcbiIpOworCisJaWYgKGZhY2lsaXR5LT5yZWFzb24uY2hvaWNlID09IGVGYWNpbGl0eVJlYXNvbl9jYWxsRm9yd2FyZGVkKSB7CisJCWlmIChmYWNpbGl0eS0+b3B0aW9ucyAmIGVGYWNpbGl0eV9VVUlFX2FsdGVybmF0aXZlQWRkcmVzcykKKwkJCXJldHVybiBleHBlY3RfY2FsbGZvcndhcmRpbmcocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkJCSAgICAgZGF0YW9mZiwKKwkJCQkJCSAgICAgJmZhY2lsaXR5LT4KKwkJCQkJCSAgICAgYWx0ZXJuYXRpdmVBZGRyZXNzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZhY2lsaXR5LT5vcHRpb25zICYgZUZhY2lsaXR5X1VVSUVfaDI0NUFkZHJlc3MpIHsKKwkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICZmYWNpbGl0eS0+aDI0NUFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZmFjaWxpdHktPm9wdGlvbnMgJiBlRmFjaWxpdHlfVVVJRV9mYXN0U3RhcnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGZhY2lsaXR5LT5mYXN0U3RhcnQuY291bnQ7IGkrKykgeworCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAmZmFjaWxpdHktPmZhc3RTdGFydC5pdGVtW2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19wcm9ncmVzcyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCisJCQkgICAgUHJvZ3Jlc3NfVVVJRSAqcHJvZ3Jlc3MpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCURFQlVHUCgibmZfY3RfcTkzMTogUHJvZ3Jlc3NcbiIpOworCisJaWYgKHByb2dyZXNzLT5vcHRpb25zICYgZVByb2dyZXNzX1VVSUVfaDI0NUFkZHJlc3MpIHsKKwkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkgICZwcm9ncmVzcy0+aDI0NUFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocHJvZ3Jlc3MtPm9wdGlvbnMgJiBlUHJvZ3Jlc3NfVVVJRV9mYXN0U3RhcnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHByb2dyZXNzLT5mYXN0U3RhcnQuY291bnQ7IGkrKykgeworCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAmcHJvZ3Jlc3MtPmZhc3RTdGFydC5pdGVtW2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19xOTMxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsIFE5MzEgKnE5MzEpCit7CisJSDMyM19VVV9QRFUgKnBkdSA9ICZxOTMxLT5VVUlFLmgzMjNfdXVfcGR1OworCWludCBpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LmNob2ljZSkgeworCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3NldHVwOgorCQlyZXQgPSBwcm9jZXNzX3NldHVwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LnNldHVwKTsKKwkJYnJlYWs7CisJY2FzZSBlSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfY2FsbFByb2NlZWRpbmc6CisJCXJldCA9IHByb2Nlc3NfY2FsbHByb2NlZWRpbmcocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKKwkJCQkJICAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS4KKwkJCQkJICAgICBjYWxsUHJvY2VlZGluZyk7CisJCWJyZWFrOworCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2Nvbm5lY3Q6CisJCXJldCA9IHByb2Nlc3NfY29ubmVjdChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LmNvbm5lY3QpOworCQlicmVhazsKKwljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9hbGVydGluZzoKKwkJcmV0ID0gcHJvY2Vzc19hbGVydGluZyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS5hbGVydGluZyk7CisJCWJyZWFrOworCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2luZm9ybWF0aW9uOgorCQlyZXQgPSBwcm9jZXNzX2luZm9ybWF0aW9uKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJCSAgJnBkdS0+aDMyM19tZXNzYWdlX2JvZHkuCisJCQkJCSAgaW5mb3JtYXRpb24pOworCQlicmVhazsKKwljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9mYWNpbGl0eToKKwkJcmV0ID0gcHJvY2Vzc19mYWNpbGl0eShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCSAgICAgICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS5mYWNpbGl0eSk7CisJCWJyZWFrOworCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X3Byb2dyZXNzOgorCQlyZXQgPSBwcm9jZXNzX3Byb2dyZXNzKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCisJCQkJICAgICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LnByb2dyZXNzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKCJuZl9jdF9xOTMxOiBRLjkzMSBzaWduYWwgJWRcbiIsCisJCSAgICAgICBwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LmNob2ljZSk7CisJCWJyZWFrOworCX0KKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocGR1LT5vcHRpb25zICYgZUgzMjNfVVVfUERVX2gyNDVDb250cm9sKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwZHUtPmgyNDVDb250cm9sLmNvdW50OyBpKyspIHsKKwkJCXJldCA9IHByb2Nlc3NfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAorCQkJCQkgICAmcGR1LT5oMjQ1Q29udHJvbC5pdGVtW2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcTkzMV9oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlzdGF0aWMgUTkzMSBxOTMxOworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBOVUxMOworCWludCBkYXRhbGVuOworCWludCBkYXRhb2ZmOworCWludCByZXQ7CisKKwkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KKwlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICYmCisJICAgIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKSB7CisJCXJldHVybiBORl9BQ0NFUFQ7CisJfQorCURFQlVHUCgibmZfY3RfcTkzMTogc2tibGVuID0gJXVcbiIsICgqcHNrYiktPmxlbik7CisKKwlzcGluX2xvY2tfYmgoJm5mX2gzMjNfbG9jayk7CisKKwkvKiBQcm9jZXNzIGVhY2ggVFBLVCAqLworCXdoaWxlIChnZXRfdHBrdF9kYXRhKHBza2IsIHByb3RvZmYsIGN0LCBjdGluZm8sCisJCQkgICAgICZkYXRhLCAmZGF0YWxlbiwgJmRhdGFvZmYpKSB7CisJCURFQlVHUCgibmZfY3RfcTkzMTogVFBLVCBsZW49JWQgIiwgZGF0YWxlbik7CisJCU5GX0NUX0RVTVBfVFVQTEUoJmN0LT50dXBsZWhhc2hbQ1RJTkZPMkRJUihjdGluZm8pXS50dXBsZSk7CisKKwkJLyogRGVjb2RlIFEuOTMxIHNpZ25hbCAqLworCQlyZXQgPSBEZWNvZGVROTMxKGRhdGEsIGRhdGFsZW4sICZxOTMxKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKCJuZl9jdF9xOTMxOiBkZWNvZGluZyBlcnJvcjogJXNcbiIsCisJCQkJICAgICAgIHJldCA9PSBIMzIzX0VSUk9SX0JPVU5EID8KKwkJCQkgICAgICAgIm91dCBvZiBib3VuZCIgOiAib3V0IG9mIHJhbmdlIik7CisJCQkvKiBXZSBkb24ndCBkcm9wIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyogUHJvY2VzcyBRLjkzMSBzaWduYWwgKi8KKwkJaWYgKHByb2Nlc3NfcTkzMShwc2tiLCBjdCwgY3RpbmZvLCAmZGF0YSwgZGF0YW9mZiwgJnE5MzEpIDwgMCkKKwkJCWdvdG8gZHJvcDsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmbmZfaDMyM19sb2NrKTsKKwlyZXR1cm4gTkZfQUNDRVBUOworCisgICAgICBkcm9wOgorCXNwaW5fdW5sb2NrX2JoKCZuZl9oMzIzX2xvY2spOworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50aygibmZfY3RfcTkzMTogcGFja2V0IGRyb3BwZWRcbiIpOworCXJldHVybiBORl9EUk9QOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBuZl9jb25udHJhY2tfaGVscGVyX3E5MzFbXSBfX3JlYWRfbW9zdGx5ID0geworCXsKKwkJLm5hbWUJCQk9ICJRLjkzMSIsCisJCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJCQkJCSAgLyogVC4xMjAgYW5kIEguMjQ1ICovCisJCS5tYXhfZXhwZWN0ZWQJCT0gSDMyM19SVFBfQ0hBTk5FTF9NQVggKiA0ICsgNCwKKwkJLnRpbWVvdXQJCT0gMjQwLAorCQkudHVwbGUuc3JjLmwzbnVtCT0gQUZfSU5FVCwKKwkJLnR1cGxlLnNyYy51LnRjcC5wb3J0CT0gX19jb25zdGFudF9odG9ucyhROTMxX1BPUlQpLAorCQkudHVwbGUuZHN0LnByb3RvbnVtCT0gSVBQUk9UT19UQ1AsCisJCS5tYXNrLnNyYy5sM251bQkJPSAweEZGRkYsCisJCS5tYXNrLnNyYy51LnRjcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygweEZGRkYpLAorCQkubWFzay5kc3QucHJvdG9udW0JPSAweEZGLAorCQkuaGVscAkJCT0gcTkzMV9oZWxwCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUS45MzEiLAorCQkubWUJCQk9IFRISVNfTU9EVUxFLAorCQkJCQkgIC8qIFQuMTIwIGFuZCBILjI0NSAqLworCQkubWF4X2V4cGVjdGVkCQk9IEgzMjNfUlRQX0NIQU5ORUxfTUFYICogNCArIDQsCisJCS50aW1lb3V0CQk9IDI0MCwKKwkJLnR1cGxlLnNyYy5sM251bQk9IEFGX0lORVQ2LAorCQkudHVwbGUuc3JjLnUudGNwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKFE5MzFfUE9SVCksCisJCS50dXBsZS5kc3QucHJvdG9udW0JPSBJUFBST1RPX1RDUCwKKwkJLm1hc2suc3JjLmwzbnVtCQk9IDB4RkZGRiwKKwkJLm1hc2suc3JjLnUudGNwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKDB4RkZGRiksCisJCS5tYXNrLmRzdC5wcm90b251bQk9IDB4RkYsCisJCS5oZWxwCQkJPSBxOTMxX2hlbHAKKwl9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZ2V0X3VkcF9kYXRhKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCQkJICAgaW50ICpkYXRhbGVuKQoreworCXN0cnVjdCB1ZHBoZHIgX3VoLCAqdWg7CisJaW50IGRhdGFvZmY7CisKKwl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF91aCksICZfdWgpOworCWlmICh1aCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlkYXRhb2ZmID0gcHJvdG9mZiArIHNpemVvZihfdWgpOworCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikKKwkJcmV0dXJuIE5VTEw7CisJKmRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmOworCXJldHVybiBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIGRhdGFvZmYsICpkYXRhbGVuLCBoMzIzX2J1ZmZlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpmaW5kX2V4cGVjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkJCSAgICAgICB1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyAqYWRkciwKKwkJCQkJICAgICAgIF9fYmUxNiBwb3J0KQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZTsKKworCW1lbXNldCgmdHVwbGUuc3JjLnUzLCAwLCBzaXplb2YodHVwbGUuc3JjLnUzKSk7CisJdHVwbGUuc3JjLnUudGNwLnBvcnQgPSAwOworCW1lbWNweSgmdHVwbGUuZHN0LnUzLCBhZGRyLCBzaXplb2YodHVwbGUuZHN0LnUzKSk7CisJdHVwbGUuZHN0LnUudGNwLnBvcnQgPSBwb3J0OworCXR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOworCisJZXhwID0gX19uZl9jb25udHJhY2tfZXhwZWN0X2ZpbmQoJnR1cGxlKTsKKwlpZiAoZXhwICYmIGV4cC0+bWFzdGVyID09IGN0KQorCQlyZXR1cm4gZXhwOworCXJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgc2V0X2V4cGVjdF90aW1lb3V0KHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAsCisJCQkgICAgICB1bnNpZ25lZCB0aW1lb3V0KQoreworCWlmICghZXhwIHx8ICFkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpCisJCXJldHVybiAwOworCisJZXhwLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dCAqIEhaOworCWFkZF90aW1lcigmZXhwLT50aW1lb3V0KTsKKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZXhwZWN0X3E5MzEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLAorCQkgICAgICAgVHJhbnNwb3J0QWRkcmVzcyAqdGFkZHIsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgbmZfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9oMzIzX2luZm87CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKwlfX2JlMTYgcG9ydDsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdHlwZW9mKG5hdF9xOTMxX2hvb2spIG5hdF9xOTMxOworCisJLyogTG9vayBmb3IgdGhlIGZpcnN0IHJlbGF0ZWQgYWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmIChnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgJnRhZGRyW2ldLCAmYWRkciwgJnBvcnQpICYmCisJCSAgICBtZW1jbXAoJmFkZHIsICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLAorCQkgICAgCSAgIHNpemVvZihhZGRyKSkgPT0gMCAmJiBwb3J0ICE9IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA+PSBjb3VudCkJCS8qIE5vdCBmb3VuZCAqLworCQlyZXR1cm4gMDsKKworCS8qIENyZWF0ZSBleHBlY3QgZm9yIFEuOTMxICovCisJaWYgKChleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtLAorCQkJCSBna3JvdXRlZF9vbmx5ID8gLyogb25seSBhY2NlcHQgY2FsbHMgZnJvbSBHSz8gKi8KKwkJCQkgCSZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MyA6CisJCQkJCU5VTEwsCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJCQkgSVBQUk9UT19UQ1AsIE5VTEwsICZwb3J0KTsKKwlleHAtPmhlbHBlciA9IG5mX2Nvbm50cmFja19oZWxwZXJfcTkzMTsKKwlleHAtPmZsYWdzID0gTkZfQ1RfRVhQRUNUX1BFUk1BTkVOVDsJLyogQWNjZXB0IG11bHRpcGxlIGNhbGxzICovCisKKwluYXRfcTkzMSA9IHJjdV9kZXJlZmVyZW5jZShuYXRfcTkzMV9ob29rKTsKKwlpZiAobmF0X3E5MzEgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykgewkvKiBOZWVkIE5BVCAqLworCQlyZXQgPSBuYXRfcTkzMShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCB0YWRkciwgaSwgcG9ydCwgZXhwKTsKKwl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KKwkJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKKwkJCURFQlVHUCgibmZfY3RfcmFzOiBleHBlY3QgUS45MzEgIik7CisJCQlORl9DVF9EVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKKworCQkJLyogU2F2ZSBwb3J0IGZvciBsb29raW5nIHVwIGV4cGVjdCBpbiBwcm9jZXNzaW5nIFJDRiAqLworCQkJaW5mby0+c2lnX3BvcnRbZGlyXSA9IHBvcnQ7CisJCX0gZWxzZQorCQkJcmV0ID0gLTE7CisJfQorCisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX2dycShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIEdhdGVrZWVwZXJSZXF1ZXN0ICpncnEpCit7CisJdHlwZW9mKHNldF9yYXNfYWRkcl9ob29rKSBzZXRfcmFzX2FkZHI7CisKKwlERUJVR1AoIm5mX2N0X3JhczogR1JRXG4iKTsKKworCXNldF9yYXNfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfcmFzX2FkZHJfaG9vayk7CisJaWYgKHNldF9yYXNfYWRkciAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQkvKiBOQVRlZCAqLworCQlyZXR1cm4gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgICZncnEtPnJhc0FkZHJlc3MsIDEpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19nY2Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBHYXRla2VlcGVyQ29uZmlybSAqZ2NmKQoreworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJaW50IHJldCA9IDA7CisJX19iZTE2IHBvcnQ7CisJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgYWRkcjsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCisJREVCVUdQKCJuZl9jdF9yYXM6IEdDRlxuIik7CisKKwlpZiAoIWdldF9oMjI1X2FkZHIoY3QsICpkYXRhLCAmZ2NmLT5yYXNBZGRyZXNzLCAmYWRkciwgJnBvcnQpKQorCQlyZXR1cm4gMDsKKworCS8qIFJlZ2lzdHJhdGlvbiBwb3J0IGlzIHRoZSBzYW1lIGFzIGRpc2NvdmVyeSBwb3J0ICovCisJaWYgKCFtZW1jbXAoJmFkZHIsICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLCBzaXplb2YoYWRkcikpICYmCisJICAgIHBvcnQgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51LnVkcC5wb3J0KQorCQlyZXR1cm4gMDsKKworCS8qIEF2b2lkIFJBUyBleHBlY3RhdGlvbiBsb29wcy4gQSBHQ0YgaXMgbmV2ZXIgZXhwZWN0ZWQuICovCisJaWYgKHRlc3RfYml0KElQU19FWFBFQ1RFRF9CSVQsICZjdC0+c3RhdHVzKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBOZWVkIG5ldyBleHBlY3QgKi8KKwlpZiAoKGV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywgJmFkZHIsCisJCQkJIElQUFJPVE9fVURQLCBOVUxMLCAmcG9ydCk7CisJZXhwLT5oZWxwZXIgPSBuZl9jb25udHJhY2tfaGVscGVyX3JhczsKKworCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7CisJCURFQlVHUCgibmZfY3RfcmFzOiBleHBlY3QgUkFTICIpOworCQlORl9DVF9EVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKKwl9IGVsc2UKKwkJcmV0ID0gLTE7CisKKwluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfcnJxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgUmVnaXN0cmF0aW9uUmVxdWVzdCAqcnJxKQoreworCXN0cnVjdCBuZl9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X2gzMjNfaW5mbzsKKwlpbnQgcmV0OworCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOworCisJREVCVUdQKCJuZl9jdF9yYXM6IFJSUVxuIik7CisKKwlyZXQgPSBleHBlY3RfcTkzMShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJICBycnEtPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCisJCQkgIHJycS0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOworCWlmIChzZXRfcmFzX2FkZHIgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykgeworCQlyZXQgPSBzZXRfcmFzX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICBycnEtPnJhc0FkZHJlc3MuaXRlbSwKKwkJCQkgICBycnEtPnJhc0FkZHJlc3MuY291bnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocnJxLT5vcHRpb25zICYgZVJlZ2lzdHJhdGlvblJlcXVlc3RfdGltZVRvTGl2ZSkgeworCQlERUJVR1AoIm5mX2N0X3JhczogUlJRIFRUTCA9ICV1IHNlY29uZHNcbiIsIHJycS0+dGltZVRvTGl2ZSk7CisJCWluZm8tPnRpbWVvdXQgPSBycnEtPnRpbWVUb0xpdmU7CisJfSBlbHNlCisJCWluZm8tPnRpbWVvdXQgPSBkZWZhdWx0X3JycV90dGw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByb2Nlc3NfcmNmKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgUmVnaXN0cmF0aW9uQ29uZmlybSAqcmNmKQoreworCXN0cnVjdCBuZl9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X2gzMjNfaW5mbzsKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCByZXQ7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwl0eXBlb2Yoc2V0X3NpZ19hZGRyX2hvb2spIHNldF9zaWdfYWRkcjsKKworCURFQlVHUCgibmZfY3RfcmFzOiBSQ0ZcbiIpOworCisJc2V0X3NpZ19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9zaWdfYWRkcl9ob29rKTsKKwlpZiAoc2V0X3NpZ19hZGRyICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJcmV0ID0gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJCXJjZi0+Y2FsbFNpZ25hbEFkZHJlc3MuaXRlbSwKKwkJCQkJcmNmLT5jYWxsU2lnbmFsQWRkcmVzcy5jb3VudCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChyY2YtPm9wdGlvbnMgJiBlUmVnaXN0cmF0aW9uQ29uZmlybV90aW1lVG9MaXZlKSB7CisJCURFQlVHUCgibmZfY3RfcmFzOiBSQ0YgVFRMID0gJXUgc2Vjb25kc1xuIiwgcmNmLT50aW1lVG9MaXZlKTsKKwkJaW5mby0+dGltZW91dCA9IHJjZi0+dGltZVRvTGl2ZTsKKwl9CisKKwlpZiAoaW5mby0+dGltZW91dCA+IDApIHsKKwkJREVCVUdQCisJCSAgICAoIm5mX2N0X3Jhczogc2V0IFJBUyBjb25uZWN0aW9uIHRpbWVvdXQgdG8gJXUgc2Vjb25kc1xuIiwKKwkJICAgICBpbmZvLT50aW1lb3V0KTsKKwkJbmZfY3RfcmVmcmVzaChjdCwgKnBza2IsIGluZm8tPnRpbWVvdXQgKiBIWik7CisKKwkJLyogU2V0IGV4cGVjdCB0aW1lb3V0ICovCisJCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCQlleHAgPSBmaW5kX2V4cGVjdChjdCwgJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QudTMsCisJCQkJICBpbmZvLT5zaWdfcG9ydFshZGlyXSk7CisJCWlmIChleHApIHsKKwkJCURFQlVHUCgibmZfY3RfcmFzOiBzZXQgUS45MzEgZXhwZWN0ICIKKwkJCSAgICAgICAidGltZW91dCB0byAldSBzZWNvbmRzIGZvciIsCisJCQkgICAgICAgaW5mby0+dGltZW91dCk7CisJCQlORl9DVF9EVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKKwkJCXNldF9leHBlY3RfdGltZW91dChleHAsIGluZm8tPnRpbWVvdXQpOworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX3VycShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFVucmVnaXN0cmF0aW9uUmVxdWVzdCAqdXJxKQoreworCXN0cnVjdCBuZl9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X2gzMjNfaW5mbzsKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCByZXQ7CisJdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7CisKKwlERUJVR1AoIm5mX2N0X3JhczogVVJRXG4iKTsKKworCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7CisJaWYgKHNldF9zaWdfYWRkciAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKSB7CisJCXJldCA9IHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgIHVycS0+Y2FsbFNpZ25hbEFkZHJlc3MuaXRlbSwKKwkJCQkgICB1cnEtPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2xlYXIgb2xkIGV4cGVjdCAqLworCW5mX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoY3QpOworCWluZm8tPnNpZ19wb3J0W2Rpcl0gPSAwOworCWluZm8tPnNpZ19wb3J0WyFkaXJdID0gMDsKKworCS8qIEdpdmUgaXQgMzAgc2Vjb25kcyBmb3IgVUNGIG9yIFVSSiAqLworCW5mX2N0X3JlZnJlc2goY3QsICpwc2tiLCAzMCAqIEhaKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19hcnEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBBZG1pc3Npb25SZXF1ZXN0ICphcnEpCit7CisJc3RydWN0IG5mX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJm5mY3RfaGVscChjdCktPmhlbHAuY3RfaDMyM19pbmZvOworCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJX19iZTE2IHBvcnQ7CisJdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgYWRkcjsKKwl0eXBlb2Yoc2V0X2gyMjVfYWRkcl9ob29rKSBzZXRfaDIyNV9hZGRyOworCisJREVCVUdQKCJuZl9jdF9yYXM6IEFSUVxuIik7CisKKwlzZXRfaDIyNV9hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9oMjI1X2FkZHJfaG9vayk7CisJaWYgKChhcnEtPm9wdGlvbnMgJiBlQWRtaXNzaW9uUmVxdWVzdF9kZXN0Q2FsbFNpZ25hbEFkZHJlc3MpICYmCisJICAgIGdldF9oMjI1X2FkZHIoY3QsICpkYXRhLCAmYXJxLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCisJICAgIAkJICAmYWRkciwgJnBvcnQpICYmCisJICAgICFtZW1jbXAoJmFkZHIsICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLCBzaXplb2YoYWRkcikpICYmCisJICAgIHBvcnQgPT0gaW5mby0+c2lnX3BvcnRbZGlyXSAmJgorCSAgICBzZXRfaDIyNV9hZGRyICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJLyogQW5zd2VyaW5nIEFSUSAqLworCQlyZXR1cm4gc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCAwLAorCQkJCSAgICAgJmFycS0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLAorCQkJCSAgICAgJmN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LnUzLAorCQkJCSAgICAgaW5mby0+c2lnX3BvcnRbIWRpcl0pOworCX0KKworCWlmICgoYXJxLT5vcHRpb25zICYgZUFkbWlzc2lvblJlcXVlc3Rfc3JjQ2FsbFNpZ25hbEFkZHJlc3MpICYmCisJICAgIGdldF9oMjI1X2FkZHIoY3QsICpkYXRhLCAmYXJxLT5zcmNDYWxsU2lnbmFsQWRkcmVzcywKKwkgICAgCQkgICZhZGRyLCAmcG9ydCkgJiYKKwkgICAgIW1lbWNtcCgmYWRkciwgJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMsIHNpemVvZihhZGRyKSkgJiYKKwkgICAgc2V0X2gyMjVfYWRkciAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKSB7CisJCS8qIENhbGxpbmcgQVJRICovCisJCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsCisJCQkJICAgICAmYXJxLT5zcmNDYWxsU2lnbmFsQWRkcmVzcywKKwkJCQkgICAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51MywKKwkJCQkgICAgIHBvcnQpOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19hY2Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBBZG1pc3Npb25Db25maXJtICphY2YpCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlpbnQgcmV0ID0gMDsKKwlfX2JlMTYgcG9ydDsKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7CisKKwlERUJVR1AoIm5mX2N0X3JhczogQUNGXG4iKTsKKworCWlmICghZ2V0X2gyMjVfYWRkcihjdCwgKmRhdGEsICZhY2YtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKKwkJCSAgICZhZGRyLCAmcG9ydCkpCisJCXJldHVybiAwOworCisJaWYgKCFtZW1jbXAoJmFkZHIsICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuZHN0LnUzLCBzaXplb2YoYWRkcikpKSB7CisJCS8qIEFuc3dlcmluZyBBQ0YgKi8KKwkJc2V0X3NpZ19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9zaWdfYWRkcl9ob29rKTsKKwkJaWYgKHNldF9zaWdfYWRkciAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQorCQkJcmV0dXJuIHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCQkgICAgJmFjZi0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTmVlZCBuZXcgZXhwZWN0ICovCisJaWYgKChleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtLAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMsICZhZGRyLAorCQkJCSBJUFBST1RPX1RDUCwgTlVMTCwgJnBvcnQpOworCWV4cC0+ZmxhZ3MgPSBORl9DVF9FWFBFQ1RfUEVSTUFORU5UOworCWV4cC0+aGVscGVyID0gbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxOworCisJaWYgKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKKwkJREVCVUdQKCJuZl9jdF9yYXM6IGV4cGVjdCBRLjkzMSAiKTsKKwkJTkZfQ1RfRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CisJfSBlbHNlCisJCXJldCA9IC0xOworCisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX2xycShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIExvY2F0aW9uUmVxdWVzdCAqbHJxKQoreworCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOworCisJREVCVUdQKCJuZl9jdF9yYXM6IExSUVxuIik7CisKKwlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOworCWlmIChzZXRfcmFzX2FkZHIgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKKwkJcmV0dXJuIHNldF9yYXNfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICAmbHJxLT5yZXBseUFkZHJlc3MsIDEpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19sY2Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBMb2NhdGlvbkNvbmZpcm0gKmxjZikKK3sKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCWludCByZXQgPSAwOworCV9fYmUxNiBwb3J0OworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKworCURFQlVHUCgibmZfY3RfcmFzOiBMQ0ZcbiIpOworCisJaWYgKCFnZXRfaDIyNV9hZGRyKGN0LCAqZGF0YSwgJmxjZi0+Y2FsbFNpZ25hbEFkZHJlc3MsCisJCQkgICAmYWRkciwgJnBvcnQpKQorCQlyZXR1cm4gMDsKKworCS8qIE5lZWQgbmV3IGV4cGVjdCBmb3IgY2FsbCBzaWduYWwgKi8KKwlpZiAoKGV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51MywgJmFkZHIsCisJCQkJIElQUFJPVE9fVENQLCBOVUxMLCAmcG9ydCk7CisJZXhwLT5mbGFncyA9IE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQ7CisJZXhwLT5oZWxwZXIgPSBuZl9jb25udHJhY2tfaGVscGVyX3E5MzE7CisKKwlpZiAobmZfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgeworCQlERUJVR1AoIm5mX2N0X3JhczogZXhwZWN0IFEuOTMxICIpOworCQlORl9DVF9EVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKKwl9IGVsc2UKKwkJcmV0ID0gLTE7CisKKwluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCisJLyogSWdub3JlIHJhc0FkZHJlc3MgKi8KKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcm9jZXNzX2lycihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIEluZm9SZXF1ZXN0UmVzcG9uc2UgKmlycikKK3sKKwlpbnQgcmV0OworCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOworCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOworCisJREVCVUdQKCJuZl9jdF9yYXM6IElSUlxuIik7CisKKwlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOworCWlmIChzZXRfcmFzX2FkZHIgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykgeworCQlyZXQgPSBzZXRfcmFzX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAmaXJyLT5yYXNBZGRyZXNzLCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJc2V0X3NpZ19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9zaWdfYWRkcl9ob29rKTsKKwlpZiAoc2V0X3NpZ19hZGRyICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spIHsKKwkJcmV0ID0gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJCWlyci0+Y2FsbFNpZ25hbEFkZHJlc3MuaXRlbSwKKwkJCQkJaXJyLT5jYWxsU2lnbmFsQWRkcmVzcy5jb3VudCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19yYXMoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBSYXNNZXNzYWdlICpyYXMpCit7CisJc3dpdGNoIChyYXMtPmNob2ljZSkgeworCWNhc2UgZVJhc01lc3NhZ2VfZ2F0ZWtlZXBlclJlcXVlc3Q6CisJCXJldHVybiBwcm9jZXNzX2dycShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICZyYXMtPmdhdGVrZWVwZXJSZXF1ZXN0KTsKKwljYXNlIGVSYXNNZXNzYWdlX2dhdGVrZWVwZXJDb25maXJtOgorCQlyZXR1cm4gcHJvY2Vzc19nY2YocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAmcmFzLT5nYXRla2VlcGVyQ29uZmlybSk7CisJY2FzZSBlUmFzTWVzc2FnZV9yZWdpc3RyYXRpb25SZXF1ZXN0OgorCQlyZXR1cm4gcHJvY2Vzc19ycnEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAmcmFzLT5yZWdpc3RyYXRpb25SZXF1ZXN0KTsKKwljYXNlIGVSYXNNZXNzYWdlX3JlZ2lzdHJhdGlvbkNvbmZpcm06CisJCXJldHVybiBwcm9jZXNzX3JjZihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICZyYXMtPnJlZ2lzdHJhdGlvbkNvbmZpcm0pOworCWNhc2UgZVJhc01lc3NhZ2VfdW5yZWdpc3RyYXRpb25SZXF1ZXN0OgorCQlyZXR1cm4gcHJvY2Vzc191cnEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAmcmFzLT51bnJlZ2lzdHJhdGlvblJlcXVlc3QpOworCWNhc2UgZVJhc01lc3NhZ2VfYWRtaXNzaW9uUmVxdWVzdDoKKwkJcmV0dXJuIHByb2Nlc3NfYXJxKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJnJhcy0+YWRtaXNzaW9uUmVxdWVzdCk7CisJY2FzZSBlUmFzTWVzc2FnZV9hZG1pc3Npb25Db25maXJtOgorCQlyZXR1cm4gcHJvY2Vzc19hY2YocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKKwkJCQkgICAmcmFzLT5hZG1pc3Npb25Db25maXJtKTsKKwljYXNlIGVSYXNNZXNzYWdlX2xvY2F0aW9uUmVxdWVzdDoKKwkJcmV0dXJuIHByb2Nlc3NfbHJxKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJnJhcy0+bG9jYXRpb25SZXF1ZXN0KTsKKwljYXNlIGVSYXNNZXNzYWdlX2xvY2F0aW9uQ29uZmlybToKKwkJcmV0dXJuIHByb2Nlc3NfbGNmKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCisJCQkJICAgJnJhcy0+bG9jYXRpb25Db25maXJtKTsKKwljYXNlIGVSYXNNZXNzYWdlX2luZm9SZXF1ZXN0UmVzcG9uc2U6CisJCXJldHVybiBwcm9jZXNzX2lycihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAorCQkJCSAgICZyYXMtPmluZm9SZXF1ZXN0UmVzcG9uc2UpOworCWRlZmF1bHQ6CisJCURFQlVHUCgibmZfY3RfcmFzOiBSQVMgbWVzc2FnZSAlZFxuIiwgcmFzLT5jaG9pY2UpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHJhc19oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXN0YXRpYyBSYXNNZXNzYWdlIHJhczsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBkYXRhbGVuID0gMDsKKwlpbnQgcmV0OworCisJREVCVUdQKCJuZl9jdF9yYXM6IHNrYmxlbiA9ICV1XG4iLCAoKnBza2IpLT5sZW4pOworCisJc3Bpbl9sb2NrX2JoKCZuZl9oMzIzX2xvY2spOworCisJLyogR2V0IFVEUCBkYXRhICovCisJZGF0YSA9IGdldF91ZHBfZGF0YShwc2tiLCBwcm90b2ZmLCAmZGF0YWxlbik7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJZ290byBhY2NlcHQ7CisJREVCVUdQKCJuZl9jdF9yYXM6IFJBUyBtZXNzYWdlIGxlbj0lZCAiLCBkYXRhbGVuKTsKKwlORl9DVF9EVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0NUSU5GTzJESVIoY3RpbmZvKV0udHVwbGUpOworCisJLyogRGVjb2RlIFJBUyBtZXNzYWdlICovCisJcmV0ID0gRGVjb2RlUmFzTWVzc2FnZShkYXRhLCBkYXRhbGVuLCAmcmFzKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJuZl9jdF9yYXM6IGRlY29kaW5nIGVycm9yOiAlc1xuIiwKKwkJCSAgICAgICByZXQgPT0gSDMyM19FUlJPUl9CT1VORCA/CisJCQkgICAgICAgIm91dCBvZiBib3VuZCIgOiAib3V0IG9mIHJhbmdlIik7CisJCWdvdG8gYWNjZXB0OworCX0KKworCS8qIFByb2Nlc3MgUkFTIG1lc3NhZ2UgKi8KKwlpZiAocHJvY2Vzc19yYXMocHNrYiwgY3QsIGN0aW5mbywgJmRhdGEsICZyYXMpIDwgMCkKKwkJZ290byBkcm9wOworCisgICAgICBhY2NlcHQ6CisJc3Bpbl91bmxvY2tfYmgoJm5mX2gzMjNfbG9jayk7CisJcmV0dXJuIE5GX0FDQ0VQVDsKKworICAgICAgZHJvcDoKKwlzcGluX3VubG9ja19iaCgmbmZfaDMyM19sb2NrKTsKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoIm5mX2N0X3JhczogcGFja2V0IGRyb3BwZWRcbiIpOworCXJldHVybiBORl9EUk9QOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBuZl9jb25udHJhY2tfaGVscGVyX3Jhc1tdIF9fcmVhZF9tb3N0bHkgPSB7CisJeworCQkubmFtZQkJCT0gIlJBUyIsCisJCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJCS5tYXhfZXhwZWN0ZWQJCT0gMzIsCisJCS50aW1lb3V0CQk9IDI0MCwKKwkJLnR1cGxlLnNyYy5sM251bQk9IEFGX0lORVQsCisJCS50dXBsZS5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoUkFTX1BPUlQpLAorCQkudHVwbGUuZHN0LnByb3RvbnVtCT0gSVBQUk9UT19VRFAsCisJCS5tYXNrLnNyYy5sM251bQkJPSAweEZGRkYsCisJCS5tYXNrLnNyYy51LnVkcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygweEZGRkYpLAorCQkubWFzay5kc3QucHJvdG9udW0JPSAweEZGLAorCQkuaGVscAkJCT0gcmFzX2hlbHAsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUkFTIiwKKwkJLm1lCQkJPSBUSElTX01PRFVMRSwKKwkJLm1heF9leHBlY3RlZAkJPSAzMiwKKwkJLnRpbWVvdXQJCT0gMjQwLAorCQkudHVwbGUuc3JjLmwzbnVtCT0gQUZfSU5FVDYsCisJCS50dXBsZS5zcmMudS51ZHAucG9ydAk9IF9fY29uc3RhbnRfaHRvbnMoUkFTX1BPUlQpLAorCQkudHVwbGUuZHN0LnByb3RvbnVtCT0gSVBQUk9UT19VRFAsCisJCS5tYXNrLnNyYy5sM251bQkJPSAweEZGRkYsCisJCS5tYXNrLnNyYy51LnVkcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygweEZGRkYpLAorCQkubWFzay5kc3QucHJvdG9udW0JPSAweEZGLAorCQkuaGVscAkJCT0gcmFzX2hlbHAsCisJfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19leGl0IG5mX2Nvbm50cmFja19oMzIzX2Zpbmkodm9pZCkKK3sKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19oZWxwZXJfcmFzWzFdKTsKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19oZWxwZXJfcmFzWzBdKTsKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19oZWxwZXJfcTkzMVsxXSk7CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3E5MzFbMF0pOworCWtmcmVlKGgzMjNfYnVmZmVyKTsKKwlERUJVR1AoIm5mX2N0X2gzMjM6IGZpbmlcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX19pbml0IG5mX2Nvbm50cmFja19oMzIzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaDMyM19idWZmZXIgPSBrbWFsbG9jKDY1NTM2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWgzMjNfYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3E5MzFbMF0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisJcmV0ID0gbmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmbmZfY29ubnRyYWNrX2hlbHBlcl9xOTMxWzFdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnIyOworCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19oZWxwZXJfcmFzWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnIzOworCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19oZWxwZXJfcmFzWzFdKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI0OworCURFQlVHUCgibmZfY3RfaDMyMzogaW5pdCBzdWNjZXNzXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyNDoKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19oZWxwZXJfcmFzWzBdKTsKK2VycjM6CisJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfaGVscGVyX3E5MzFbMV0pOworZXJyMjoKKwluZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19oZWxwZXJfcTkzMVswXSk7CitlcnIxOgorCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbW9kdWxlX2luaXQobmZfY29ubnRyYWNrX2gzMjNfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9jb25udHJhY2tfaDMyM19maW5pKTsKKworRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2gyMjVfYWRkcik7CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfaDI0NV9hZGRyX2hvb2spOworRVhQT1JUX1NZTUJPTF9HUEwoc2V0X2gyMjVfYWRkcl9ob29rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9zaWdfYWRkcl9ob29rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9yYXNfYWRkcl9ob29rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5hdF9ydHBfcnRjcF9ob29rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5hdF90MTIwX2hvb2spOworRVhQT1JUX1NZTUJPTF9HUEwobmF0X2gyNDVfaG9vayk7CitFWFBPUlRfU1lNQk9MX0dQTChuYXRfY2FsbGZvcndhcmRpbmdfaG9vayk7CitFWFBPUlRfU1lNQk9MX0dQTChuYXRfcTkzMV9ob29rKTsKKworTU9EVUxFX0FVVEhPUigiSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJILjMyMyBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcF9jb25udHJhY2tfaDMyMyIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM190eXBlcy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM190eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNmY4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX3R5cGVzLmMKQEAgLTAsMCArMSwxOTI3IEBACisvKiBHZW5lcmF0ZWQgYnkgSmluZyBNaW4gWmhhbydzIEFTTi4xIHBhcnNlciwgQXByIDIwIDIwMDYKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSmluZyBNaW4gWmhhbyA8emhhb2ppbmdtaW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworc3RhdGljIGZpZWxkX3QgX1RyYW5zcG9ydEFkZHJlc3NfaXBBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJpcCIpIE9DVFNUUiwgRklYRCwgNCwgMCwgREVDT0RFLAorCSBvZmZzZXRvZihUcmFuc3BvcnRBZGRyZXNzX2lwQWRkcmVzcywgaXApLCBOVUxMfSwKKwl7Rk5BTUUoInBvcnQiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1RyYW5zcG9ydEFkZHJlc3NfaXBTb3VyY2VSb3V0ZV9yb3V0ZVtdID0gewkvKiBTRVFVRU5DRSBPRiAqLworCXtGTkFNRSgiaXRlbSIpIE9DVFNUUiwgRklYRCwgNCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVHJhbnNwb3J0QWRkcmVzc19pcFNvdXJjZVJvdXRlX3JvdXRpbmdbXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJzdHJpY3QiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibG9vc2UiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1RyYW5zcG9ydEFkZHJlc3NfaXBTb3VyY2VSb3V0ZVtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiaXAiKSBPQ1RTVFIsIEZJWEQsIDQsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicG9ydCIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyb3V0ZSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLAorCSBfVHJhbnNwb3J0QWRkcmVzc19pcFNvdXJjZVJvdXRlX3JvdXRlfSwKKwl7Rk5BTUUoInJvdXRpbmciKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCisJIF9UcmFuc3BvcnRBZGRyZXNzX2lwU291cmNlUm91dGVfcm91dGluZ30sCit9OworCitzdGF0aWMgZmllbGRfdCBfVHJhbnNwb3J0QWRkcmVzc19pcHhBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub2RlIikgT0NUU1RSLCBGSVhELCA2LCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm5ldG51bSIpIE9DVFNUUiwgRklYRCwgNCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwb3J0IikgT0NUU1RSLCBGSVhELCAyLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9UcmFuc3BvcnRBZGRyZXNzX2lwNkFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImlwIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgREVDT0RFLAorCSBvZmZzZXRvZihUcmFuc3BvcnRBZGRyZXNzX2lwNkFkZHJlc3MsIGlwNiksIE5VTEx9LAorCXtGTkFNRSgicG9ydCIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDIyMU5vblN0YW5kYXJkW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJ0MzVDb3VudHJ5Q29kZSIpIElOVCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0MzVFeHRlbnNpb24iKSBJTlQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibWFudWZhY3R1cmVyQ29kZSIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfTm9uU3RhbmRhcmRJZGVudGlmaWVyW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgib2JqZWN0IikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImgyMjFOb25TdGFuZGFyZCIpIFNFUSwgMCwgMywgMywgU0tJUCB8IEVYVCwgMCwKKwkgX0gyMjFOb25TdGFuZGFyZH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkSWRlbnRpZmllciIpIENIT0lDRSwgMSwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKKwkgX05vblN0YW5kYXJkSWRlbnRpZmllcn0sCisJe0ZOQU1FKCJkYXRhIikgT0NUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9UcmFuc3BvcnRBZGRyZXNzW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgiaXBBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBERUNPREUsCisJIG9mZnNldG9mKFRyYW5zcG9ydEFkZHJlc3MsIGlwQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzX2lwQWRkcmVzc30sCisJe0ZOQU1FKCJpcFNvdXJjZVJvdXRlIikgU0VRLCAwLCA0LCA0LCBTS0lQIHwgRVhULCAwLAorCSBfVHJhbnNwb3J0QWRkcmVzc19pcFNvdXJjZVJvdXRlfSwKKwl7Rk5BTUUoImlweEFkZHJlc3MiKSBTRVEsIDAsIDMsIDMsIFNLSVAsIDAsCisJIF9UcmFuc3BvcnRBZGRyZXNzX2lweEFkZHJlc3N9LAorCXtGTkFNRSgiaXA2QWRkcmVzcyIpIFNFUSwgMCwgMiwgMiwgREVDT0RFIHwgRVhULAorCW9mZnNldG9mKFRyYW5zcG9ydEFkZHJlc3MsIGlwNkFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc19pcDZBZGRyZXNzfSwKKwl7Rk5BTUUoIm5ldEJpb3MiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm5zYXAiKSBPQ1RTVFIsIDUsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibm9uU3RhbmRhcmRBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLAorCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0FsaWFzQWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoImRpYWxlZERpZ2l0cyIpIE5VTURHVCwgNywgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJoMzIzLUlEIikgQk1QU1RSLCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInVybC1JRCIpIElBNVNUUiwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0cmFuc3BvcnRJRCIpIENIT0lDRSwgMywgNywgNywgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJlbWFpbC1JRCIpIElBNVNUUiwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwYXJ0eU51bWJlciIpIENIT0lDRSwgMywgNSwgNSwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtb2JpbGVVSU0iKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1NldHVwX1VVSUVfc291cmNlQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLworCXtGTkFNRSgiaXRlbSIpIENIT0lDRSwgMSwgMiwgNywgU0tJUCB8IEVYVCwgMCwgX0FsaWFzQWRkcmVzc30sCit9OworCitzdGF0aWMgZmllbGRfdCBfVmVuZG9ySWRlbnRpZmllcltdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgidmVuZG9yIikgU0VRLCAwLCAzLCAzLCBTS0lQIHwgRVhULCAwLCBfSDIyMU5vblN0YW5kYXJkfSwKKwl7Rk5BTUUoInByb2R1Y3RJZCIpIE9DVFNUUiwgQllURSwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ2ZXJzaW9uSWQiKSBPQ1RTVFIsIEJZVEUsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0dhdGVrZWVwZXJJbmZvW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDMxMENhcHNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKKwkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImRhdGFSYXRlc1N1cHBvcnRlZCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN1cHBvcnRlZFByZWZpeGVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gzMjBDYXBzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJkYXRhUmF0ZXNTdXBwb3J0ZWQiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzdXBwb3J0ZWRQcmVmaXhlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMzIxQ2Fwc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgT1BULCAwLAorCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorCXtGTkFNRSgiZGF0YVJhdGVzU3VwcG9ydGVkIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic3VwcG9ydGVkUHJlZml4ZXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDMyMkNhcHNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKKwkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImRhdGFSYXRlc1N1cHBvcnRlZCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN1cHBvcnRlZFByZWZpeGVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gzMjNDYXBzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJkYXRhUmF0ZXNTdXBwb3J0ZWQiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzdXBwb3J0ZWRQcmVmaXhlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMzI0Q2Fwc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgT1BULCAwLAorCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorCXtGTkFNRSgiZGF0YVJhdGVzU3VwcG9ydGVkIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic3VwcG9ydGVkUHJlZml4ZXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVm9pY2VDYXBzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJkYXRhUmF0ZXNTdXBwb3J0ZWQiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzdXBwb3J0ZWRQcmVmaXhlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9UMTIwT25seUNhcHNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKKwkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImRhdGFSYXRlc1N1cHBvcnRlZCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN1cHBvcnRlZFByZWZpeGVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1N1cHBvcnRlZFByb3RvY29sc1tdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKKwkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImgzMTAiKSBTRVEsIDEsIDEsIDMsIFNLSVAgfCBFWFQsIDAsIF9IMzEwQ2Fwc30sCisJe0ZOQU1FKCJoMzIwIikgU0VRLCAxLCAxLCAzLCBTS0lQIHwgRVhULCAwLCBfSDMyMENhcHN9LAorCXtGTkFNRSgiaDMyMSIpIFNFUSwgMSwgMSwgMywgU0tJUCB8IEVYVCwgMCwgX0gzMjFDYXBzfSwKKwl7Rk5BTUUoImgzMjIiKSBTRVEsIDEsIDEsIDMsIFNLSVAgfCBFWFQsIDAsIF9IMzIyQ2Fwc30sCisJe0ZOQU1FKCJoMzIzIikgU0VRLCAxLCAxLCAzLCBTS0lQIHwgRVhULCAwLCBfSDMyM0NhcHN9LAorCXtGTkFNRSgiaDMyNCIpIFNFUSwgMSwgMSwgMywgU0tJUCB8IEVYVCwgMCwgX0gzMjRDYXBzfSwKKwl7Rk5BTUUoInZvaWNlIikgU0VRLCAxLCAxLCAzLCBTS0lQIHwgRVhULCAwLCBfVm9pY2VDYXBzfSwKKwl7Rk5BTUUoInQxMjAtb25seSIpIFNFUSwgMSwgMSwgMywgU0tJUCB8IEVYVCwgMCwgX1QxMjBPbmx5Q2Fwc30sCisJe0ZOQU1FKCJub25TdGFuZGFyZFByb3RvY29sIikgU0VRLCAyLCAzLCAzLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInQzOEZheEFubmV4Yk9ubHkiKSBTRVEsIDIsIDUsIDUsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0dhdGV3YXlJbmZvX3Byb3RvY29sW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCA0LCA5LCAxMSwgU0tJUCB8IEVYVCwgMCwgX1N1cHBvcnRlZFByb3RvY29sc30sCit9OworCitzdGF0aWMgZmllbGRfdCBfR2F0ZXdheUluZm9bXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInByb3RvY29sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCisJIF9HYXRld2F5SW5mb19wcm90b2NvbH0sCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCit9OworCitzdGF0aWMgZmllbGRfdCBfTWN1SW5mb1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgT1BULCAwLAorCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorCXtGTkFNRSgicHJvdG9jb2wiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVGVybWluYWxJbmZvW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCit9OworCitzdGF0aWMgZmllbGRfdCBfRW5kcG9pbnRUeXBlW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJ2ZW5kb3IiKSBTRVEsIDIsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIF9WZW5kb3JJZGVudGlmaWVyfSwKKwl7Rk5BTUUoImdhdGVrZWVwZXIiKSBTRVEsIDEsIDEsIDEsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIF9HYXRla2VlcGVySW5mb30sCisJe0ZOQU1FKCJnYXRld2F5IikgU0VRLCAyLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBfR2F0ZXdheUluZm99LAorCXtGTkFNRSgibWN1IikgU0VRLCAxLCAxLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBfTWN1SW5mb30sCisJe0ZOQU1FKCJ0ZXJtaW5hbCIpIFNFUSwgMSwgMSwgMSwgU0tJUCB8IEVYVCB8IE9QVCwgMCwgX1Rlcm1pbmFsSW5mb30sCisJe0ZOQU1FKCJtYyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidW5kZWZpbmVkTm9kZSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgic2V0IikgQklUU1RSLCBGSVhELCAzMiwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzdXBwb3J0ZWRUdW5uZWxsZWRQcm90b2NvbHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwKKwkgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfU2V0dXBfVVVJRV9kZXN0aW5hdGlvbkFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1NldHVwX1VVSUVfZGVzdEV4dHJhQ2FsbEluZm9bXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1NldHVwX1VVSUVfZGVzdEV4dHJhQ1JWW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgSU5ULCBXT1JELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9TZXR1cF9VVUlFX2NvbmZlcmVuY2VHb2FsW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgiY3JlYXRlIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImpvaW4iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiaW52aXRlIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhcGFiaWxpdHktbmVnb3RpYXRpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2FsbEluZGVwZW5kZW50U3VwcGxlbWVudGFyeVNlcnZpY2UiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsCisJIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1E5NTREZXRhaWxzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJjb25mZXJlbmNlQ2FsbGluZyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidGhyZWVQYXJ0eVNlcnZpY2UiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9Rc2VyaWVzT3B0aW9uc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgicTkzMkZ1bGwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInE5NTFGdWxsIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJxOTUyRnVsbCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicTk1M0Z1bGwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInE5NTVGdWxsIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJxOTU2RnVsbCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicTk1N0Z1bGwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInE5NTRJbmZvIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhULCAwLCBfUTk1NERldGFpbHN9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0NhbGxUeXBlW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgicG9pbnRUb1BvaW50IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm9uZVRvTiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJuVG9PbmUiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiblRvTiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDI0NV9Ob25TdGFuZGFyZElkZW50aWZpZXJfaDIyMU5vblN0YW5kYXJkW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJ0MzVDb3VudHJ5Q29kZSIpIElOVCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0MzVFeHRlbnNpb24iKSBJTlQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibWFudWZhY3R1cmVyQ29kZSIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDI0NV9Ob25TdGFuZGFyZElkZW50aWZpZXJbXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJvYmplY3QiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiaDIyMU5vblN0YW5kYXJkIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAorCSBfSDI0NV9Ob25TdGFuZGFyZElkZW50aWZpZXJfaDIyMU5vblN0YW5kYXJkfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZElkZW50aWZpZXIiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAsIDAsCisJIF9IMjQ1X05vblN0YW5kYXJkSWRlbnRpZmllcn0sCisJe0ZOQU1FKCJkYXRhIikgT0NUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMjYxVmlkZW9DYXBhYmlsaXR5W10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJxY2lmTVBJIikgSU5ULCAyLCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNpZk1QSSIpIElOVCwgMiwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0ZW1wb3JhbFNwYXRpYWxUcmFkZU9mZkNhcGFiaWxpdHkiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoIm1heEJpdFJhdGUiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgic3RpbGxJbWFnZVRyYW5zbWlzc2lvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidmlkZW9CYWRNQnNDYXAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMjYyVmlkZW9DYXBhYmlsaXR5W10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtU1BhdE1MIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtTVBhdExMIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtTVBhdE1MIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtTVBhdEgtMTQiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInByb2ZpbGVBbmRMZXZlbC1NUGF0SEwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInByb2ZpbGVBbmRMZXZlbC1TTlJhdExMIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwcm9maWxlQW5kTGV2ZWwtU05SYXRNTCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicHJvZmlsZUFuZExldmVsLVNwYXRpYWxhdEgtMTQiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoInByb2ZpbGVBbmRMZXZlbC1IUGF0TUwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInByb2ZpbGVBbmRMZXZlbC1IUGF0SC0xNCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicHJvZmlsZUFuZExldmVsLUhQYXRITCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidmlkZW9CaXRSYXRlIikgSU5ULCBDT05TLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInZidkJ1ZmZlclNpemUiKSBJTlQsIENPTlMsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic2FtcGxlc1BlckxpbmUiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibGluZXNQZXJGcmFtZSIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmcmFtZXNQZXJTZWNvbmQiKSBJTlQsIDQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibHVtaW5hbmNlU2FtcGxlUmF0ZSIpIElOVCwgQ09OUywgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ2aWRlb0JhZE1Cc0NhcCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gyNjNWaWRlb0NhcGFiaWxpdHlbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInNxY2lmTVBJIikgSU5ULCA1LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInFjaWZNUEkiKSBJTlQsIDUsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2lmTVBJIikgSU5ULCA1LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNpZjRNUEkiKSBJTlQsIDUsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2lmMTZNUEkiKSBJTlQsIDUsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibWF4Qml0UmF0ZSIpIElOVCwgQ09OUywgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ1bnJlc3RyaWN0ZWRWZWN0b3IiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFyaXRobWV0aWNDb2RpbmciKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFkdmFuY2VkUHJlZGljdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicGJGcmFtZXMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRlbXBvcmFsU3BhdGlhbFRyYWRlT2ZmQ2FwYWJpbGl0eSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgiaHJkLUIiKSBJTlQsIENPTlMsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiYnBwTWF4S2IiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic2xvd1NxY2lmTVBJIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInNsb3dRY2lmTVBJIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInNsb3dDaWZNUEkiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic2xvd0NpZjRNUEkiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic2xvd0NpZjE2TVBJIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImVycm9yQ29tcGVuc2F0aW9uIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJlbmhhbmNlbWVudExheWVySW5mbyIpIFNFUSwgMywgNCwgNCwgU0tJUCB8IEVYVCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJoMjYzT3B0aW9ucyIpIFNFUSwgNSwgMjksIDMxLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9JUzExMTcyVmlkZW9DYXBhYmlsaXR5W10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJjb25zdHJhaW5lZEJpdHN0cmVhbSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidmlkZW9CaXRSYXRlIikgSU5ULCBDT05TLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInZidkJ1ZmZlclNpemUiKSBJTlQsIENPTlMsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic2FtcGxlc1BlckxpbmUiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibGluZXNQZXJGcmFtZSIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwaWN0dXJlUmF0ZSIpIElOVCwgNCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJsdW1pbmFuY2VTYW1wbGVSYXRlIikgSU5ULCBDT05TLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInZpZGVvQmFkTUJzQ2FwIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVmlkZW9DYXBhYmlsaXR5W10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsCisJIF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImgyNjFWaWRlb0NhcGFiaWxpdHkiKSBTRVEsIDIsIDUsIDYsIFNLSVAgfCBFWFQsIDAsCisJIF9IMjYxVmlkZW9DYXBhYmlsaXR5fSwKKwl7Rk5BTUUoImgyNjJWaWRlb0NhcGFiaWxpdHkiKSBTRVEsIDYsIDE3LCAxOCwgU0tJUCB8IEVYVCwgMCwKKwkgX0gyNjJWaWRlb0NhcGFiaWxpdHl9LAorCXtGTkFNRSgiaDI2M1ZpZGVvQ2FwYWJpbGl0eSIpIFNFUSwgNywgMTMsIDIxLCBTS0lQIHwgRVhULCAwLAorCSBfSDI2M1ZpZGVvQ2FwYWJpbGl0eX0sCisJe0ZOQU1FKCJpczExMTcyVmlkZW9DYXBhYmlsaXR5IikgU0VRLCA2LCA3LCA4LCBTS0lQIHwgRVhULCAwLAorCSBfSVMxMTE3MlZpZGVvQ2FwYWJpbGl0eX0sCisJe0ZOQU1FKCJnZW5lcmljVmlkZW9DYXBhYmlsaXR5IikgU0VRLCA1LCA2LCA2LCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9BdWRpb0NhcGFiaWxpdHlfZzcyMzFbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm1heEFsLXNkdUF1ZGlvRnJhbWVzIikgSU5ULCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInNpbGVuY2VTdXBwcmVzc2lvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0lTMTExNzJBdWRpb0NhcGFiaWxpdHlbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImF1ZGlvTGF5ZXIxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhdWRpb0xheWVyMiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiYXVkaW9MYXllcjMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImF1ZGlvU2FtcGxpbmczMmsiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImF1ZGlvU2FtcGxpbmc0NGsxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhdWRpb1NhbXBsaW5nNDhrIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzaW5nbGVDaGFubmVsIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0d29DaGFubmVscyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiYml0UmF0ZSIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSVMxMzgxOEF1ZGlvQ2FwYWJpbGl0eVtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiYXVkaW9MYXllcjEiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImF1ZGlvTGF5ZXIyIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhdWRpb0xheWVyMyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiYXVkaW9TYW1wbGluZzE2ayIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiYXVkaW9TYW1wbGluZzIyazA1IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhdWRpb1NhbXBsaW5nMjRrIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhdWRpb1NhbXBsaW5nMzJrIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhdWRpb1NhbXBsaW5nNDRrMSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiYXVkaW9TYW1wbGluZzQ4ayIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgic2luZ2xlQ2hhbm5lbCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidHdvQ2hhbm5lbHMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRocmVlQ2hhbm5lbHMyLTEiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRocmVlQ2hhbm5lbHMzLTAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZvdXJDaGFubmVsczItMC0yLTAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZvdXJDaGFubmVsczItMiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZm91ckNoYW5uZWxzMy0xIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmaXZlQ2hhbm5lbHMzLTAtMi0wIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmaXZlQ2hhbm5lbHMzLTIiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImxvd0ZyZXF1ZW5jeUVuaGFuY2VtZW50IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtdWx0aWxpbmd1YWwiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImJpdFJhdGUiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0F1ZGlvQ2FwYWJpbGl0eVtdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLAorCSBfSDI0NV9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJnNzExQWxhdzY0ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnNzExQWxhdzU2ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnNzExVWxhdzY0ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnNzExVWxhdzU2ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnNzIyLTY0ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnNzIyLTU2ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnNzIyLTQ4ayIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnNzIzMSIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwgX0F1ZGlvQ2FwYWJpbGl0eV9nNzIzMX0sCisJe0ZOQU1FKCJnNzI4IikgSU5ULCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImc3MjkiKSBJTlQsIEJZVEUsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZzcyOUFubmV4QSIpIElOVCwgQllURSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpczExMTcyQXVkaW9DYXBhYmlsaXR5IikgU0VRLCAwLCA5LCA5LCBTS0lQIHwgRVhULCAwLAorCSBfSVMxMTE3MkF1ZGlvQ2FwYWJpbGl0eX0sCisJe0ZOQU1FKCJpczEzODE4QXVkaW9DYXBhYmlsaXR5IikgU0VRLCAwLCAyMSwgMjEsIFNLSVAgfCBFWFQsIDAsCisJIF9JUzEzODE4QXVkaW9DYXBhYmlsaXR5fSwKKwl7Rk5BTUUoImc3Mjl3QW5uZXhCIikgSU5ULCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImc3MjlBbm5leEF3QW5uZXhCIikgSU5ULCBCWVRFLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImc3MjMxQW5uZXhDQ2FwYWJpbGl0eSIpIFNFUSwgMSwgMywgMywgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnc21GdWxsUmF0ZSIpIFNFUSwgMCwgMywgMywgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnc21IYWxmUmF0ZSIpIFNFUSwgMCwgMywgMywgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnc21FbmhhbmNlZEZ1bGxSYXRlIikgU0VRLCAwLCAzLCAzLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImdlbmVyaWNBdWRpb0NhcGFiaWxpdHkiKSBTRVEsIDUsIDYsIDYsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZzcyOUV4dGVuc2lvbnMiKSBTRVEsIDEsIDgsIDgsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0RhdGFQcm90b2NvbENhcGFiaWxpdHlbXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKKwkgX0gyNDVfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorCXtGTkFNRSgidjE0YnVmZmVyZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidjQybGFwbSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJoZGxjRnJhbWVUdW5uZWxsaW5nIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImgzMTBTZXBhcmF0ZVZDU3RhY2siKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiaDMxMFNpbmdsZVZDU3RhY2siKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidHJhbnNwYXJlbnQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgic2VnbWVudGF0aW9uQW5kUmVhc3NlbWJseSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJoZGxjRnJhbWVUdW5uZWxpbmd3U0FSIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInYxMjAiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgic2VwYXJhdGVMQU5TdGFjayIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ2NzZ3Q29tcHJlc3Npb24iKSBDSE9JQ0UsIDIsIDMsIDMsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidGNwIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInVkcCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVDg0UHJvZmlsZV90ODRSZXN0cmljdGVkW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJxY2lmIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjaWYiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNjaXI2MDFTZXEiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNjaXI2MDFQcm9nIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJoZHR2U2VxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJoZHR2UHJvZyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZzNGYWNzTUgyMDB4MTAwIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnM0ZhY3NNSDIwMHgyMDAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImc0RmFjc01NUjIwMHgxMDAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImc0RmFjc01NUjIwMHgyMDAiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImpiaWcyMDB4MjAwU2VxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJqYmlnMjAweDIwMFByb2ciKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImpiaWczMDB4MzAwU2VxIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJqYmlnMzAweDMwMFByb2ciKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRpZ1Bob3RvTG93IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkaWdQaG90b01lZFNlcSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGlnUGhvdG9NZWRQcm9nIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkaWdQaG90b0hpZ2hTZXEiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRpZ1Bob3RvSGlnaFByb2ciKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9UODRQcm9maWxlW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgidDg0VW5yZXN0cmljdGVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInQ4NFJlc3RyaWN0ZWQiKSBTRVEsIDAsIDE5LCAxOSwgU0tJUCB8IEVYVCwgMCwKKwkgX1Q4NFByb2ZpbGVfdDg0UmVzdHJpY3RlZH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90ODRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInQ4NFByb3RvY29sIikgQ0hPSUNFLCAzLCA3LCAxNCwgU0tJUCB8IEVYVCwgMCwKKwkgX0RhdGFQcm90b2NvbENhcGFiaWxpdHl9LAorCXtGTkFNRSgidDg0UHJvZmlsZSIpIENIT0lDRSwgMSwgMiwgMiwgU0tJUCwgMCwgX1Q4NFByb2ZpbGV9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0RhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fbmxwaWRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm5scGlkUHJvdG9jb2wiKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLAorCSBfRGF0YVByb3RvY29sQ2FwYWJpbGl0eX0sCisJe0ZOQU1FKCJubHBpZERhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0RhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25bXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKKwkgX0gyNDVfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorCXtGTkFNRSgidDEyMCIpIENIT0lDRSwgMywgNywgMTQsIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbiwgdDEyMCksCisJIF9EYXRhUHJvdG9jb2xDYXBhYmlsaXR5fSwKKwl7Rk5BTUUoImRzbS1jYyIpIENIT0lDRSwgMywgNywgMTQsIFNLSVAgfCBFWFQsIDAsCisJIF9EYXRhUHJvdG9jb2xDYXBhYmlsaXR5fSwKKwl7Rk5BTUUoInVzZXJEYXRhIikgQ0hPSUNFLCAzLCA3LCAxNCwgU0tJUCB8IEVYVCwgMCwKKwkgX0RhdGFQcm90b2NvbENhcGFiaWxpdHl9LAorCXtGTkFNRSgidDg0IikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLAorCSBfRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbl90ODR9LAorCXtGTkFNRSgidDQzNCIpIENIT0lDRSwgMywgNywgMTQsIFNLSVAgfCBFWFQsIDAsCisJIF9EYXRhUHJvdG9jb2xDYXBhYmlsaXR5fSwKKwl7Rk5BTUUoImgyMjQiKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLAorCSBfRGF0YVByb3RvY29sQ2FwYWJpbGl0eX0sCisJe0ZOQU1FKCJubHBpZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKKwkgX0RhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlfYXBwbGljYXRpb25fbmxwaWR9LAorCXtGTkFNRSgiZHN2ZENvbnRyb2wiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiaDIyMkRhdGFQYXJ0aXRpb25pbmciKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLAorCSBfRGF0YVByb3RvY29sQ2FwYWJpbGl0eX0sCisJe0ZOQU1FKCJ0MzBmYXgiKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInQxNDAiKSBDSE9JQ0UsIDMsIDcsIDE0LCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInQzOGZheCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnZW5lcmljRGF0YUNhcGFiaWxpdHkiKSBTRVEsIDUsIDYsIDYsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0RhdGFBcHBsaWNhdGlvbkNhcGFiaWxpdHlbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImFwcGxpY2F0aW9uIikgQ0hPSUNFLCA0LCAxMCwgMTQsIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eSwgYXBwbGljYXRpb24pLAorCSBfRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eV9hcHBsaWNhdGlvbn0sCisJe0ZOQU1FKCJtYXhCaXRSYXRlIikgSU5ULCBDT05TLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9FbmNyeXB0aW9uTW9kZVtdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLAorCSBfSDI0NV9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJoMjMzRW5jcnlwdGlvbiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfRGF0YVR5cGVbXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKKwkgX0gyNDVfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorCXtGTkFNRSgibnVsbERhdGEiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidmlkZW9EYXRhIikgQ0hPSUNFLCAzLCA1LCA2LCBTS0lQIHwgRVhULCAwLCBfVmlkZW9DYXBhYmlsaXR5fSwKKwl7Rk5BTUUoImF1ZGlvRGF0YSIpIENIT0lDRSwgNCwgMTQsIDIyLCBTS0lQIHwgRVhULCAwLAorCSBfQXVkaW9DYXBhYmlsaXR5fSwKKwl7Rk5BTUUoImRhdGEiKSBTRVEsIDAsIDIsIDIsIERFQ09ERSB8IEVYVCwgb2Zmc2V0b2YoRGF0YVR5cGUsIGRhdGEpLAorCSBfRGF0YUFwcGxpY2F0aW9uQ2FwYWJpbGl0eX0sCisJe0ZOQU1FKCJlbmNyeXB0aW9uRGF0YSIpIENIT0lDRSwgMSwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKKwkgX0VuY3J5cHRpb25Nb2RlfSwKKwl7Rk5BTUUoImgyMzVDb250cm9sIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImgyMzVNZWRpYSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtdWx0aXBsZXhlZFN0cmVhbSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDIyMkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgicmVzb3VyY2VJRCIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzdWJDaGFubmVsSUQiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicGNyLXBpZCIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwcm9ncmFtRGVzY3JpcHRvcnMiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic3RyZWFtRGVzY3JpcHRvcnMiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfYWRhcHRhdGlvbkxheWVyVHlwZV9hbDNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImNvbnRyb2xGaWVsZE9jdGV0cyIpIElOVCwgMiwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzZW5kQnVmZmVyU2l6ZSIpIElOVCwgQ09OUywgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDIyM0xvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19hZGFwdGF0aW9uTGF5ZXJUeXBlW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsCisJIF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImFsMUZyYW1lZCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhbDFOb3RGcmFtZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiYWwyV2l0aG91dFNlcXVlbmNlTnVtYmVycyIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhbDJXaXRoU2VxdWVuY2VOdW1iZXJzIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFsMyIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKKwkgX0gyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfYWRhcHRhdGlvbkxheWVyVHlwZV9hbDN9LAorCXtGTkFNRSgiYWwxTSIpIFNFUSwgMCwgNywgOCwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhbDJNIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFsM00iKSBTRVEsIDAsIDUsIDYsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImFkYXB0YXRpb25MYXllclR5cGUiKSBDSE9JQ0UsIDMsIDYsIDksIFNLSVAgfCBFWFQsIDAsCisJIF9IMjIzTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX2FkYXB0YXRpb25MYXllclR5cGV9LAorCXtGTkFNRSgic2VnbWVudGFibGVGbGFnIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ1JDTGVuZ3RoW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgiY3JjOGJpdCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjcmMxNmJpdCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjcmMzMmJpdCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVjc2SERMQ1BhcmFtZXRlcnNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImNyY0xlbmd0aCIpIENIT0lDRSwgMiwgMywgMywgU0tJUCB8IEVYVCwgMCwgX0NSQ0xlbmd0aH0sCisJe0ZOQU1FKCJuNDAxIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImxvb3BiYWNrVGVzdFByb2NlZHVyZSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1Y3NkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19zdXNwZW5kUmVzdW1lW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgibm9TdXNwZW5kUmVzdW1lIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN1c3BlbmRSZXN1bWV3QWRkcmVzcyIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzdXNwZW5kUmVzdW1ld29BZGRyZXNzIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9WNzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbW9kZV9lUk1fcmVjb3ZlcnlbXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJyZWoiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgic1JFSiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtU1JFSiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21vZGVfZVJNW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJ3aW5kb3dTaXplIikgSU5ULCA3LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJlY292ZXJ5IikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhULCAwLAorCSBfVjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX21vZGVfZVJNX3JlY292ZXJ5fSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9WNzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbW9kZVtdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoImVSTSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKKwkgX1Y3NkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tb2RlX2VSTX0sCisJe0ZOQU1FKCJ1TkVSTSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVjc1UGFyYW1ldGVyc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiYXVkaW9IZWFkZXJQcmVzZW50IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJoZGxjUGFyYW1ldGVycyIpIFNFUSwgMCwgMywgMywgU0tJUCB8IEVYVCwgMCwKKwkgX1Y3NkhETENQYXJhbWV0ZXJzfSwKKwl7Rk5BTUUoInN1c3BlbmRSZXN1bWUiKSBDSE9JQ0UsIDIsIDMsIDMsIFNLSVAgfCBFWFQsIDAsCisJIF9WNzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfc3VzcGVuZFJlc3VtZX0sCisJe0ZOQU1FKCJ1SUgiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm1vZGUiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCisJIF9WNzZMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbW9kZX0sCisJe0ZOQU1FKCJ2NzVQYXJhbWV0ZXJzIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBfVjc1UGFyYW1ldGVyc30sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbm9uU3RhbmRhcmRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsIF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9VbmljYXN0QWRkcmVzc19pUEFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm5ldHdvcmsiKSBPQ1RTVFIsIEZJWEQsIDQsIDAsIERFQ09ERSwKKwkgb2Zmc2V0b2YoVW5pY2FzdEFkZHJlc3NfaVBBZGRyZXNzLCBuZXR3b3JrKSwgTlVMTH0sCisJe0ZOQU1FKCJ0c2FwSWRlbnRpZmllciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVW5pY2FzdEFkZHJlc3NfaVBYQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgibm9kZSIpIE9DVFNUUiwgRklYRCwgNiwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJuZXRudW0iKSBPQ1RTVFIsIEZJWEQsIDQsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidHNhcElkZW50aWZpZXIiKSBPQ1RTVFIsIEZJWEQsIDIsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1VuaWNhc3RBZGRyZXNzX2lQNkFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm5ldHdvcmsiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRzYXBJZGVudGlmaWVyIikgSU5ULCBXT1JELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9VbmljYXN0QWRkcmVzc19pUFNvdXJjZVJvdXRlQWRkcmVzc19yb3V0aW5nW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgic3RyaWN0IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImxvb3NlIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9VbmljYXN0QWRkcmVzc19pUFNvdXJjZVJvdXRlQWRkcmVzc19yb3V0ZVtdID0gewkvKiBTRVFVRU5DRSBPRiAqLworCXtGTkFNRSgiaXRlbSIpIE9DVFNUUiwgRklYRCwgNCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfVW5pY2FzdEFkZHJlc3NfaVBTb3VyY2VSb3V0ZUFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInJvdXRpbmciKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAsIDAsCisJIF9VbmljYXN0QWRkcmVzc19pUFNvdXJjZVJvdXRlQWRkcmVzc19yb3V0aW5nfSwKKwl7Rk5BTUUoIm5ldHdvcmsiKSBPQ1RTVFIsIEZJWEQsIDQsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidHNhcElkZW50aWZpZXIiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicm91dGUiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwKKwkgX1VuaWNhc3RBZGRyZXNzX2lQU291cmNlUm91dGVBZGRyZXNzX3JvdXRlfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9VbmljYXN0QWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoImlQQWRkcmVzcyIpIFNFUSwgMCwgMiwgMiwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihVbmljYXN0QWRkcmVzcywgaVBBZGRyZXNzKSwgX1VuaWNhc3RBZGRyZXNzX2lQQWRkcmVzc30sCisJe0ZOQU1FKCJpUFhBZGRyZXNzIikgU0VRLCAwLCAzLCAzLCBTS0lQIHwgRVhULCAwLAorCSBfVW5pY2FzdEFkZHJlc3NfaVBYQWRkcmVzc30sCisJe0ZOQU1FKCJpUDZBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhULCAwLAorCSBfVW5pY2FzdEFkZHJlc3NfaVA2QWRkcmVzc30sCisJe0ZOQU1FKCJuZXRCaW9zIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpUFNvdXJjZVJvdXRlQWRkcmVzcyIpIFNFUSwgMCwgNCwgNCwgU0tJUCB8IEVYVCwgMCwKKwkgX1VuaWNhc3RBZGRyZXNzX2lQU291cmNlUm91dGVBZGRyZXNzfSwKKwl7Rk5BTUUoIm5zYXAiKSBPQ1RTVFIsIDUsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibm9uU3RhbmRhcmRBZGRyZXNzIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9NdWx0aWNhc3RBZGRyZXNzX2lQQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgibmV0d29yayIpIE9DVFNUUiwgRklYRCwgNCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0c2FwSWRlbnRpZmllciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfTXVsdGljYXN0QWRkcmVzc19pUDZBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJuZXR3b3JrIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0c2FwSWRlbnRpZmllciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfTXVsdGljYXN0QWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoImlQQWRkcmVzcyIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKKwkgX011bHRpY2FzdEFkZHJlc3NfaVBBZGRyZXNzfSwKKwl7Rk5BTUUoImlQNkFkZHJlc3MiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCisJIF9NdWx0aWNhc3RBZGRyZXNzX2lQNkFkZHJlc3N9LAorCXtGTkFNRSgibnNhcCIpIE9DVFNUUiwgNSwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJub25TdGFuZGFyZEFkZHJlc3MiKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gyNDVfVHJhbnNwb3J0QWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoInVuaWNhc3RBZGRyZXNzIikgQ0hPSUNFLCAzLCA1LCA3LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKEgyNDVfVHJhbnNwb3J0QWRkcmVzcywgdW5pY2FzdEFkZHJlc3MpLCBfVW5pY2FzdEFkZHJlc3N9LAorCXtGTkFNRSgibXVsdGljYXN0QWRkcmVzcyIpIENIT0lDRSwgMSwgMiwgNCwgU0tJUCB8IEVYVCwgMCwKKwkgX011bHRpY2FzdEFkZHJlc3N9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLAorCSBfSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbm9uU3RhbmRhcmR9LAorCXtGTkFNRSgic2Vzc2lvbklEIikgSU5ULCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFzc29jaWF0ZWRTZXNzaW9uSUQiKSBJTlQsIDgsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibWVkaWFDaGFubmVsIikgQ0hPSUNFLCAxLCAyLCAyLCBERUNPREUgfCBFWFQgfCBPUFQsCisJIG9mZnNldG9mKEgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLCBtZWRpYUNoYW5uZWwpLAorCSBfSDI0NV9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoIm1lZGlhR3VhcmFudGVlZERlbGl2ZXJ5IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJtZWRpYUNvbnRyb2xDaGFubmVsIikgQ0hPSUNFLCAxLCAyLCAyLCBERUNPREUgfCBFWFQgfCBPUFQsCisJIG9mZnNldG9mKEgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLCBtZWRpYUNvbnRyb2xDaGFubmVsKSwKKwkgX0gyNDVfVHJhbnNwb3J0QWRkcmVzc30sCisJe0ZOQU1FKCJtZWRpYUNvbnRyb2xHdWFyYW50ZWVkRGVsaXZlcnkiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QIHwgT1BULAorCSAwLCBOVUxMfSwKKwl7Rk5BTUUoInNpbGVuY2VTdXBwcmVzc2lvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdGluYXRpb24iKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZHluYW1pY1JUUFBheWxvYWRUeXBlIikgSU5ULCA1LCA5NiwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtZWRpYVBhY2tldGl6YXRpb24iKSBDSE9JQ0UsIDAsIDEsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgidHJhbnNwb3J0Q2FwYWJpbGl0eSIpIFNFUSwgMywgMywgMywgU1RPUCB8IEVYVCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJyZWR1bmRhbmN5RW5jb2RpbmciKSBTRVEsIDEsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic291cmNlIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9PcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgiaDIyMkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyIpIFNFUSwgMywgNSwgNSwgU0tJUCB8IEVYVCwgMCwKKwkgX0gyMjJMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnN9LAorCXtGTkFNRSgiaDIyM0xvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IEVYVCwgMCwKKwkgX0gyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnN9LAorCXtGTkFNRSgidjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAwLCA1LCA1LCBTS0lQIHwgRVhULCAwLAorCSBfVjc2TG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKKwl7Rk5BTUUoImgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAxMCwgMTEsIDE0LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mCisJIChPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzLAorCSAgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpLCBfSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnN9LAorCXtGTkFNRSgibm9uZSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInBvcnROdW1iZXIiKSBJTlQsIFdPUkQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGF0YVR5cGUiKSBDSE9JQ0UsIDMsIDYsIDksIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoT3BlbkxvZ2ljYWxDaGFubmVsX2ZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMsCisJCSAgZGF0YVR5cGUpLCBfRGF0YVR5cGV9LAorCXtGTkFNRSgibXVsdGlwbGV4UGFyYW1ldGVycyIpIENIT0lDRSwgMiwgMywgNSwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihPcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycywKKwkJICBtdWx0aXBsZXhQYXJhbWV0ZXJzKSwKKwkgX09wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnN9LAorCXtGTkFNRSgiZm9yd2FyZExvZ2ljYWxDaGFubmVsRGVwZW5kZW5jeSIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCB8IE9QVCwKKwkgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZXBsYWNlbWVudEZvciIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc1tdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoImgyMjNMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCisJIF9IMjIzTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKKwl7Rk5BTUUoInY3NkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyIpIFNFUSwgMCwgNSwgNSwgU0tJUCB8IEVYVCwgMCwKKwkgX1Y3NkxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc30sCisJe0ZOQU1FKCJoMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyIpIFNFUSwgMTAsIDExLCAxNCwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZgorCSAoT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycywKKwkgIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSwgX0gyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9PcGVuTG9naWNhbENoYW5uZWxfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiZGF0YVR5cGUiKSBDSE9JQ0UsIDMsIDYsIDksIFNLSVAgfCBFWFQsIDAsIF9EYXRhVHlwZX0sCisJe0ZOQU1FKCJtdWx0aXBsZXhQYXJhbWV0ZXJzIikgQ0hPSUNFLCAxLCAyLCAzLCBERUNPREUgfCBFWFQgfCBPUFQsCisJIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAorCQkgIG11bHRpcGxleFBhcmFtZXRlcnMpLAorCSBfT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc30sCisJe0ZOQU1FKCJyZXZlcnNlTG9naWNhbENoYW5uZWxEZXBlbmRlbmN5IikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULAorCSAwLCBOVUxMfSwKKwl7Rk5BTUUoInJlcGxhY2VtZW50Rm9yIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9OZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19kaXN0cmlidXRpb25bXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJ1bmljYXN0IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm11bHRpY2FzdCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfUTI5MzFBZGRyZXNzX2FkZHJlc3NbXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJpbnRlcm5hdGlvbmFsTnVtYmVyIikgTlVNU1RSLCA0LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm5zYXBBZGRyZXNzIikgT0NUU1RSLCA1LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9RMjkzMUFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImFkZHJlc3MiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsCisJIF9RMjkzMUFkZHJlc3NfYWRkcmVzc30sCisJe0ZOQU1FKCJzdWJhZGRyZXNzIikgT0NUU1RSLCA1LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9OZXR3b3JrQWNjZXNzUGFyYW1ldGVyc19uZXR3b3JrQWRkcmVzc1tdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoInEyOTMxQWRkcmVzcyIpIFNFUSwgMSwgMiwgMiwgU0tJUCB8IEVYVCwgMCwgX1EyOTMxQWRkcmVzc30sCisJe0ZOQU1FKCJlMTY0QWRkcmVzcyIpIE5VTURHVCwgNywgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJsb2NhbEFyZWFBZGRyZXNzIikgQ0hPSUNFLCAxLCAyLCAyLCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKE5ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX25ldHdvcmtBZGRyZXNzLCBsb2NhbEFyZWFBZGRyZXNzKSwKKwkgX0gyNDVfVHJhbnNwb3J0QWRkcmVzc30sCit9OworCitzdGF0aWMgZmllbGRfdCBfTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImRpc3RyaWJ1dGlvbiIpIENIT0lDRSwgMSwgMiwgMiwgU0tJUCB8IEVYVCB8IE9QVCwgMCwKKwkgX05ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzX2Rpc3RyaWJ1dGlvbn0sCisJe0ZOQU1FKCJuZXR3b3JrQWRkcmVzcyIpIENIT0lDRSwgMiwgMywgMywgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihOZXR3b3JrQWNjZXNzUGFyYW1ldGVycywgbmV0d29ya0FkZHJlc3MpLAorCSBfTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfbmV0d29ya0FkZHJlc3N9LAorCXtGTkFNRSgiYXNzb2NpYXRlQ29uZmVyZW5jZSIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZXh0ZXJuYWxSZWZlcmVuY2UiKSBPQ1RTVFIsIDgsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidDEyMFNldHVwUHJvY2VkdXJlIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLAorCSBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9PcGVuTG9naWNhbENoYW5uZWxbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImZvcndhcmRMb2dpY2FsQ2hhbm5lbE51bWJlciIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAxLCAzLCA1LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbCwgZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycyksCisJIF9PcGVuTG9naWNhbENoYW5uZWxfZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc30sCisJe0ZOQU1FKCJyZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAxLCAyLCA0LAorCSBERUNPREUgfCBFWFQgfCBPUFQsIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbCwKKwkJCQkgICAgICByZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSwKKwkgX09wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKKwl7Rk5BTUUoInNlcGFyYXRlU3RhY2siKSBTRVEsIDIsIDQsIDUsIERFQ09ERSB8IEVYVCB8IE9QVCwKKwkgb2Zmc2V0b2YoT3BlbkxvZ2ljYWxDaGFubmVsLCBzZXBhcmF0ZVN0YWNrKSwKKwkgX05ldHdvcmtBY2Nlc3NQYXJhbWV0ZXJzfSwKKwl7Rk5BTUUoImVuY3J5cHRpb25TeW5jIikgU0VRLCAyLCA0LCA0LCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9TZXR1cF9VVUlFX2Zhc3RTdGFydFtdID0gewkvKiBTRVFVRU5DRSBPRiAqLworCXtGTkFNRSgiaXRlbSIpIFNFUSwgMSwgMywgNSwgREVDT0RFIHwgT1BFTiB8IEVYVCwKKwkgc2l6ZW9mKE9wZW5Mb2dpY2FsQ2hhbm5lbCksIF9PcGVuTG9naWNhbENoYW5uZWx9CisJLAorfTsKKworc3RhdGljIGZpZWxkX3QgX1NldHVwX1VVSUVbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInByb3RvY29sSWRlbnRpZmllciIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJoMjQ1QWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAorCSBvZmZzZXRvZihTZXR1cF9VVUlFLCBoMjQ1QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoInNvdXJjZUFkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKKwkgX1NldHVwX1VVSUVfc291cmNlQWRkcmVzc30sCisJe0ZOQU1FKCJzb3VyY2VJbmZvIikgU0VRLCA2LCA4LCAxMCwgU0tJUCB8IEVYVCwgMCwgX0VuZHBvaW50VHlwZX0sCisJe0ZOQU1FKCJkZXN0aW5hdGlvbkFkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKKwkgX1NldHVwX1VVSUVfZGVzdGluYXRpb25BZGRyZXNzfSwKKwl7Rk5BTUUoImRlc3RDYWxsU2lnbmFsQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAorCSBvZmZzZXRvZihTZXR1cF9VVUlFLCBkZXN0Q2FsbFNpZ25hbEFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCisJe0ZOQU1FKCJkZXN0RXh0cmFDYWxsSW5mbyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLAorCSBfU2V0dXBfVVVJRV9kZXN0RXh0cmFDYWxsSW5mb30sCisJe0ZOQU1FKCJkZXN0RXh0cmFDUlYiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKKwkgX1NldHVwX1VVSUVfZGVzdEV4dHJhQ1JWfSwKKwl7Rk5BTUUoImFjdGl2ZU1DIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjb25mZXJlbmNlSUQiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNvbmZlcmVuY2VHb2FsIikgQ0hPSUNFLCAyLCAzLCA1LCBTS0lQIHwgRVhULCAwLAorCSBfU2V0dXBfVVVJRV9jb25mZXJlbmNlR29hbH0sCisJe0ZOQU1FKCJjYWxsU2VydmljZXMiKSBTRVEsIDAsIDgsIDgsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIF9Rc2VyaWVzT3B0aW9uc30sCisJe0ZOQU1FKCJjYWxsVHlwZSIpIENIT0lDRSwgMiwgNCwgNCwgU0tJUCB8IEVYVCwgMCwgX0NhbGxUeXBlfSwKKwl7Rk5BTUUoInNvdXJjZUNhbGxTaWduYWxBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQgfCBPUFQsCisJIG9mZnNldG9mKFNldHVwX1VVSUUsIHNvdXJjZUNhbGxTaWduYWxBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3N9LAorCXtGTkFNRSgicmVtb3RlRXh0ZW5zaW9uQWRkcmVzcyIpIENIT0lDRSwgMSwgMiwgNywgU0tJUCB8IEVYVCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJjYWxsSWRlbnRpZmllciIpIFNFUSwgMCwgMSwgMSwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJoMjQ1U2VjdXJpdHlDYXBhYmlsaXR5IikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmFzdFN0YXJ0IikgU0VRT0YsIFNFTUksIDAsIDMwLCBERUNPREUgfCBPUFQsCisJIG9mZnNldG9mKFNldHVwX1VVSUUsIGZhc3RTdGFydCksIF9TZXR1cF9VVUlFX2Zhc3RTdGFydH0sCisJe0ZOQU1FKCJtZWRpYVdhaXRGb3JDb25uZWN0IikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYW5PdmVybGFwU2VuZCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm11bHRpcGxlQ2FsbHMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm1haW50YWluQ29ubmVjdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiY29ubmVjdGlvblBhcmFtZXRlcnMiKSBTRVEsIDAsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgibGFuZ3VhZ2UiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwcmVzZW50YXRpb25JbmRpY2F0b3IiKSBDSE9JQ0UsIDIsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgic2NyZWVuaW5nSW5kaWNhdG9yIikgRU5VTSwgMiwgMCwgMCwgU0tJUCB8IEVYVCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJzZXJ2aWNlQ29udHJvbCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN5bW1ldHJpY09wZXJhdGlvblJlcXVpcmVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQIHwgT1BULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNpcmN1aXRJbmZvIikgU0VRLCAzLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRlc2lyZWRQcm90b2NvbHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJuZWVkZWRGZWF0dXJlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRlc2lyZWRGZWF0dXJlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN1cHBvcnRlZEZlYXR1cmVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicGFyYWxsZWxIMjQ1Q29udHJvbCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFkZGl0aW9uYWxTb3VyY2VBZGRyZXNzZXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKKwkgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ2FsbFByb2NlZWRpbmdfVVVJRV9mYXN0U3RhcnRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBTRVEsIDEsIDMsIDUsIERFQ09ERSB8IE9QRU4gfCBFWFQsCisJIHNpemVvZihPcGVuTG9naWNhbENoYW5uZWwpLCBfT3BlbkxvZ2ljYWxDaGFubmVsfQorCSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9DYWxsUHJvY2VlZGluZ19VVUlFW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdGluYXRpb25JbmZvIikgU0VRLCA2LCA4LCAxMCwgU0tJUCB8IEVYVCwgMCwKKwkgX0VuZHBvaW50VHlwZX0sCisJe0ZOQU1FKCJoMjQ1QWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAorCSBvZmZzZXRvZihDYWxsUHJvY2VlZGluZ19VVUlFLCBoMjQ1QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImNhbGxJZGVudGlmaWVyIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImgyNDVTZWN1cml0eU1vZGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmFzdFN0YXJ0IikgU0VRT0YsIFNFTUksIDAsIDMwLCBERUNPREUgfCBPUFQsCisJIG9mZnNldG9mKENhbGxQcm9jZWVkaW5nX1VVSUUsIGZhc3RTdGFydCksCisJIF9DYWxsUHJvY2VlZGluZ19VVUlFX2Zhc3RTdGFydH0sCisJe0ZOQU1FKCJtdWx0aXBsZUNhbGxzIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtYWludGFpbkNvbm5lY3Rpb24iKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZhc3RDb25uZWN0UmVmdXNlZCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmZWF0dXJlU2V0IikgU0VRLCAzLCA0LCA0LCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9Db25uZWN0X1VVSUVfZmFzdFN0YXJ0W10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgU0VRLCAxLCAzLCA1LCBERUNPREUgfCBPUEVOIHwgRVhULAorCSBzaXplb2YoT3BlbkxvZ2ljYWxDaGFubmVsKSwgX09wZW5Mb2dpY2FsQ2hhbm5lbH0KKwksCit9OworCitzdGF0aWMgZmllbGRfdCBfQ29ubmVjdF9VVUlFW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiaDI0NUFkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCB8IE9QVCwKKwkgb2Zmc2V0b2YoQ29ubmVjdF9VVUlFLCBoMjQ1QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImRlc3RpbmF0aW9uSW5mbyIpIFNFUSwgNiwgOCwgMTAsIFNLSVAgfCBFWFQsIDAsCisJIF9FbmRwb2ludFR5cGV9LAorCXtGTkFNRSgiY29uZmVyZW5jZUlEIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYWxsSWRlbnRpZmllciIpIFNFUSwgMCwgMSwgMSwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJoMjQ1U2VjdXJpdHlNb2RlIikgQ0hPSUNFLCAyLCA0LCA0LCBTS0lQIHwgRVhUIHwgT1BULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZhc3RTdGFydCIpIFNFUU9GLCBTRU1JLCAwLCAzMCwgREVDT0RFIHwgT1BULAorCSBvZmZzZXRvZihDb25uZWN0X1VVSUUsIGZhc3RTdGFydCksIF9Db25uZWN0X1VVSUVfZmFzdFN0YXJ0fSwKKwl7Rk5BTUUoIm11bHRpcGxlQ2FsbHMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm1haW50YWluQ29ubmVjdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibGFuZ3VhZ2UiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjb25uZWN0ZWRBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicHJlc2VudGF0aW9uSW5kaWNhdG9yIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoInNjcmVlbmluZ0luZGljYXRvciIpIEVOVU0sIDIsIDAsIDAsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgiZmFzdENvbm5lY3RSZWZ1c2VkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInNlcnZpY2VDb250cm9sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2FwYWNpdHkiKSBTRVEsIDIsIDIsIDIsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU0tJUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQWxlcnRpbmdfVVVJRV9mYXN0U3RhcnRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBTRVEsIDEsIDMsIDUsIERFQ09ERSB8IE9QRU4gfCBFWFQsCisJIHNpemVvZihPcGVuTG9naWNhbENoYW5uZWwpLCBfT3BlbkxvZ2ljYWxDaGFubmVsfQorCSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9BbGVydGluZ19VVUlFW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdGluYXRpb25JbmZvIikgU0VRLCA2LCA4LCAxMCwgU0tJUCB8IEVYVCwgMCwKKwkgX0VuZHBvaW50VHlwZX0sCisJe0ZOQU1FKCJoMjQ1QWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAorCSBvZmZzZXRvZihBbGVydGluZ19VVUlFLCBoMjQ1QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImNhbGxJZGVudGlmaWVyIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImgyNDVTZWN1cml0eU1vZGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmFzdFN0YXJ0IikgU0VRT0YsIFNFTUksIDAsIDMwLCBERUNPREUgfCBPUFQsCisJIG9mZnNldG9mKEFsZXJ0aW5nX1VVSUUsIGZhc3RTdGFydCksIF9BbGVydGluZ19VVUlFX2Zhc3RTdGFydH0sCisJe0ZOQU1FKCJtdWx0aXBsZUNhbGxzIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtYWludGFpbkNvbm5lY3Rpb24iKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFsZXJ0aW5nQWRkcmVzcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInByZXNlbnRhdGlvbkluZGljYXRvciIpIENIT0lDRSwgMiwgMywgMywgU0tJUCB8IEVYVCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJzY3JlZW5pbmdJbmRpY2F0b3IiKSBFTlVNLCAyLCAwLCAwLCBTS0lQIHwgRVhUIHwgT1BULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoImZhc3RDb25uZWN0UmVmdXNlZCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzZXJ2aWNlQ29udHJvbCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZlYXR1cmVTZXQiKSBTRVEsIDMsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0luZm9ybWF0aW9uX1VVSUVfZmFzdFN0YXJ0W10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgU0VRLCAxLCAzLCA1LCBERUNPREUgfCBPUEVOIHwgRVhULAorCSBzaXplb2YoT3BlbkxvZ2ljYWxDaGFubmVsKSwgX09wZW5Mb2dpY2FsQ2hhbm5lbH0KKwksCit9OworCitzdGF0aWMgZmllbGRfdCBfSW5mb3JtYXRpb25fVVVJRVtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhbGxJZGVudGlmaWVyIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZhc3RTdGFydCIpIFNFUU9GLCBTRU1JLCAwLCAzMCwgREVDT0RFIHwgT1BULAorCSBvZmZzZXRvZihJbmZvcm1hdGlvbl9VVUlFLCBmYXN0U3RhcnQpLCBfSW5mb3JtYXRpb25fVVVJRV9mYXN0U3RhcnR9LAorCXtGTkFNRSgiZmFzdENvbm5lY3RSZWZ1c2VkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNpcmN1aXRJbmZvIikgU0VRLCAzLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9SZWxlYXNlQ29tcGxldGVSZWFzb25bXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJub0JhbmR3aWR0aCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnYXRla2VlcGVyUmVzb3VyY2VzIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInVucmVhY2hhYmxlRGVzdGluYXRpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdGluYXRpb25SZWplY3Rpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiaW52YWxpZFJldmlzaW9uIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm5vUGVybWlzc2lvbiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ1bnJlYWNoYWJsZUdhdGVrZWVwZXIiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZ2F0ZXdheVJlc291cmNlcyIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJiYWRGb3JtYXRBZGRyZXNzIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFkYXB0aXZlQnVzeSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpbkNvbmYiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidW5kZWZpbmVkUmVhc29uIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZhY2lsaXR5Q2FsbERlZmxlY3Rpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgic2VjdXJpdHlEZW5pZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2FsbGVkUGFydHlOb3RSZWdpc3RlcmVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhbGxlck5vdFJlZ2lzdGVyZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibmV3Q29ubmVjdGlvbk5lZWRlZCIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJub25TdGFuZGFyZFJlYXNvbiIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZXBsYWNlV2l0aENvbmZlcmVuY2VJbnZpdGUiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTS0lQLCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoImdlbmVyaWNEYXRhUmVhc29uIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm5lZWRlZEZlYXR1cmVOb3RTdXBwb3J0ZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidHVubmVsbGVkU2lnbmFsbGluZ1JlamVjdGVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9SZWxlYXNlQ29tcGxldGVfVVVJRVtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJlYXNvbiIpIENIT0lDRSwgNCwgMTIsIDIyLCBTS0lQIHwgRVhUIHwgT1BULCAwLAorCSBfUmVsZWFzZUNvbXBsZXRlUmVhc29ufSwKKwl7Rk5BTUUoImNhbGxJZGVudGlmaWVyIikgU0VRLCAwLCAxLCAxLCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImJ1c3lBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicHJlc2VudGF0aW9uSW5kaWNhdG9yIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhUIHwgT1BULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoInNjcmVlbmluZ0luZGljYXRvciIpIEVOVU0sIDIsIDAsIDAsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgiY2FwYWNpdHkiKSBTRVEsIDIsIDIsIDIsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic2VydmljZUNvbnRyb2wiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmZWF0dXJlU2V0IikgU0VRLCAzLCA0LCA0LCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9GYWNpbGl0eV9VVUlFX2FsdGVybmF0aXZlQWxpYXNBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhULCAwLCBfQWxpYXNBZGRyZXNzfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9GYWNpbGl0eVJlYXNvbltdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoInJvdXRlQ2FsbFRvR2F0ZWtlZXBlciIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYWxsRm9yd2FyZGVkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJvdXRlQ2FsbFRvTUMiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidW5kZWZpbmVkUmVhc29uIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNvbmZlcmVuY2VMaXN0Q2hvaWNlIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN0YXJ0SDI0NSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJub0gyNDUiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibmV3VG9rZW5zIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZlYXR1cmVTZXRVcGRhdGUiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZm9yd2FyZGVkRWxlbWVudHMiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidHJhbnNwb3J0ZWRJbmZvcm1hdGlvbiIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfRmFjaWxpdHlfVVVJRV9mYXN0U3RhcnRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBTRVEsIDEsIDMsIDUsIERFQ09ERSB8IE9QRU4gfCBFWFQsCisJIHNpemVvZihPcGVuTG9naWNhbENoYW5uZWwpLCBfT3BlbkxvZ2ljYWxDaGFubmVsfQorCSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9GYWNpbGl0eV9VVUlFW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiYWx0ZXJuYXRpdmVBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQgfCBPUFQsCisJIG9mZnNldG9mKEZhY2lsaXR5X1VVSUUsIGFsdGVybmF0aXZlQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImFsdGVybmF0aXZlQWxpYXNBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCisJIF9GYWNpbGl0eV9VVUlFX2FsdGVybmF0aXZlQWxpYXNBZGRyZXNzfSwKKwl7Rk5BTUUoImNvbmZlcmVuY2VJRCIpIE9DVFNUUiwgRklYRCwgMTYsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicmVhc29uIikgQ0hPSUNFLCAyLCA0LCAxMSwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihGYWNpbGl0eV9VVUlFLCByZWFzb24pLCBfRmFjaWxpdHlSZWFzb259LAorCXtGTkFNRSgiY2FsbElkZW50aWZpZXIiKSBTRVEsIDAsIDEsIDEsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdEV4dHJhQ2FsbEluZm8iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZW1vdGVFeHRlbnNpb25BZGRyZXNzIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhUIHwgT1BULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNvbmZlcmVuY2VzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiaDI0NUFkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCB8IE9QVCwKKwkgb2Zmc2V0b2YoRmFjaWxpdHlfVVVJRSwgaDI0NUFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCisJe0ZOQU1FKCJmYXN0U3RhcnQiKSBTRVFPRiwgU0VNSSwgMCwgMzAsIERFQ09ERSB8IE9QVCwKKwkgb2Zmc2V0b2YoRmFjaWxpdHlfVVVJRSwgZmFzdFN0YXJ0KSwgX0ZhY2lsaXR5X1VVSUVfZmFzdFN0YXJ0fSwKKwl7Rk5BTUUoIm11bHRpcGxlQ2FsbHMiKSBCT09MLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm1haW50YWluQ29ubmVjdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmFzdENvbm5lY3RSZWZ1c2VkIikgTlVMLCBGSVhELCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInNlcnZpY2VDb250cm9sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2lyY3VpdEluZm8iKSBTRVEsIDMsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU0tJUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkZXN0aW5hdGlvbkluZm8iKSBTRVEsIDYsIDgsIDEwLCBTS0lQIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImgyNDVTZWN1cml0eU1vZGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0NhbGxJZGVudGlmaWVyW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJndWlkIikgT0NUU1RSLCBGSVhELCAxNiwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfU2VjdXJpdHlTZXJ2aWNlTW9kZVtdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkIikgU0VRLCAwLCAyLCAyLCBTS0lQLCAwLCBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorCXtGTkFNRSgibm9uZSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkZWZhdWx0IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9TZWN1cml0eUNhcGFiaWxpdGllc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJlbmNyeXB0aW9uIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhULCAwLAorCSBfU2VjdXJpdHlTZXJ2aWNlTW9kZX0sCisJe0ZOQU1FKCJhdXRoZW50aWNhdG9uIikgQ0hPSUNFLCAyLCAzLCAzLCBTS0lQIHwgRVhULCAwLAorCSBfU2VjdXJpdHlTZXJ2aWNlTW9kZX0sCisJe0ZOQU1FKCJpbnRlZ3JpdHkiKSBDSE9JQ0UsIDIsIDMsIDMsIFNLSVAgfCBFWFQsIDAsCisJIF9TZWN1cml0eVNlcnZpY2VNb2RlfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMjQ1U2VjdXJpdHlbXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoIm5vU2VjdXJpdHkiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidGxzIikgU0VRLCAxLCA0LCA0LCBTS0lQIHwgRVhULCAwLCBfU2VjdXJpdHlDYXBhYmlsaXRpZXN9LAorCXtGTkFNRSgiaXBzZWMiKSBTRVEsIDEsIDQsIDQsIFNLSVAgfCBFWFQsIDAsIF9TZWN1cml0eUNhcGFiaWxpdGllc30sCit9OworCitzdGF0aWMgZmllbGRfdCBfREhzZXRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImhhbGZrZXkiKSBCSVRTVFIsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibW9kU2l6ZSIpIEJJVFNUUiwgV09SRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnZW5lcmF0b3IiKSBCSVRTVFIsIFdPUkQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1R5cGVkQ2VydGlmaWNhdGVbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInR5cGUiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2VydGlmaWNhdGUiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gyMzVfTm9uU3RhbmRhcmRQYXJhbWV0ZXJbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoIm5vblN0YW5kYXJkSWRlbnRpZmllciIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkYXRhIikgT0NUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9DbGVhclRva2VuW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJ0b2tlbk9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0aW1lU3RhbXAiKSBJTlQsIENPTlMsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicGFzc3dvcmQiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGhrZXkiKSBTRVEsIDAsIDMsIDMsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIF9ESHNldH0sCisJe0ZOQU1FKCJjaGFsbGVuZ2UiKSBPQ1RTVFIsIDcsIDgsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicmFuZG9tIikgSU5ULCBVTkNPLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNlcnRpZmljYXRlIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgRVhUIHwgT1BULCAwLAorCSBfVHlwZWRDZXJ0aWZpY2F0ZX0sCisJe0ZOQU1FKCJnZW5lcmFsSUQiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9IMjM1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImVja2FzZGhrZXkiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic2VuZGVyc0lEIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9Qcm9ncmVzc19VVUlFX3Rva2Vuc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLworCXtGTkFNRSgiaXRlbSIpIFNFUSwgOCwgOSwgMTEsIFNLSVAgfCBFWFQsIDAsIF9DbGVhclRva2VufSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9QYXJhbXNbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInJhbkludCIpIElOVCwgVU5DTywgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpdjgiKSBPQ1RTVFIsIEZJWEQsIDgsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiaXYxNiIpIE9DVFNUUiwgRklYRCwgMTYsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9FUFB3ZEhhc2hfdG9rZW5bXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImFsZ29yaXRobU9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwYXJhbVMiKSBTRVEsIDIsIDIsIDMsIFNLSVAgfCBFWFQsIDAsIF9QYXJhbXN9LAorCXtGTkFNRSgiaGFzaCIpIEJJVFNUUiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0VQUHdkSGFzaFtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiYWxpYXMiKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAorCXtGTkFNRSgidGltZVN0YW1wIikgSU5ULCBDT05TLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRva2VuIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAorCSBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0VQUHdkSGFzaF90b2tlbn0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0dLUHdkSGFzaF90b2tlbltdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiYWxnb3JpdGhtT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInBhcmFtUyIpIFNFUSwgMiwgMiwgMywgU0tJUCB8IEVYVCwgMCwgX1BhcmFtc30sCisJe0ZOQU1FKCJoYXNoIikgQklUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvR0tQd2RIYXNoW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJnYXRla2VlcGVySWQiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidGltZVN0YW1wIikgSU5ULCBDT05TLCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRva2VuIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAorCSBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0dLUHdkSGFzaF90b2tlbn0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0VQUHdkRW5jcltdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiYWxnb3JpdGhtT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInBhcmFtUyIpIFNFUSwgMiwgMiwgMywgU0tJUCB8IEVYVCwgMCwgX1BhcmFtc30sCisJe0ZOQU1FKCJlbmNyeXB0ZWREYXRhIikgT0NUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvR0tQd2RFbmNyW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJhbGdvcml0aG1PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicGFyYW1TIikgU0VRLCAyLCAyLCAzLCBTS0lQIHwgRVhULCAwLCBfUGFyYW1zfSwKKwl7Rk5BTUUoImVuY3J5cHRlZERhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9FUENlcnRbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInRvQmVTaWduZWQiKSBTRVEsIDgsIDksIDExLCBTS0lQIHwgT1BFTiB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhbGdvcml0aG1PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicGFyYW1TIikgU0VRLCAyLCAyLCAzLCBTS0lQIHwgRVhULCAwLCBfUGFyYW1zfSwKKwl7Rk5BTUUoInNpZ25hdHVyZSIpIEJJVFNUUiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0dLQ2VydFtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgidG9CZVNpZ25lZCIpIFNFUSwgOCwgOSwgMTEsIFNLSVAgfCBPUEVOIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFsZ29yaXRobU9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwYXJhbVMiKSBTRVEsIDIsIDIsIDMsIFNLSVAgfCBFWFQsIDAsIF9QYXJhbXN9LAorCXtGTkFNRSgic2lnbmF0dXJlIikgQklUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvRmFzdFN0YXJ0W10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJ0b0JlU2lnbmVkIikgU0VRLCA4LCA5LCAxMSwgU0tJUCB8IE9QRU4gfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiYWxnb3JpdGhtT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInBhcmFtUyIpIFNFUSwgMiwgMiwgMywgU0tJUCB8IEVYVCwgMCwgX1BhcmFtc30sCisJe0ZOQU1FKCJzaWduYXR1cmUiKSBCSVRTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0NyeXB0b1Rva2VuX2NyeXB0b0VuY3J5cHRlZFRva2VuX3Rva2VuW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJhbGdvcml0aG1PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicGFyYW1TIikgU0VRLCAyLCAyLCAzLCBTS0lQIHwgRVhULCAwLCBfUGFyYW1zfSwKKwl7Rk5BTUUoImVuY3J5cHRlZERhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0NyeXB0b1Rva2VuX2NyeXB0b0VuY3J5cHRlZFRva2VuW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJ0b2tlbk9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0b2tlbiIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKKwkgX0NyeXB0b1Rva2VuX2NyeXB0b0VuY3J5cHRlZFRva2VuX3Rva2VufSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9DcnlwdG9Ub2tlbl9jcnlwdG9TaWduZWRUb2tlbl90b2tlbltdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgidG9CZVNpZ25lZCIpIFNFUSwgOCwgOSwgMTEsIFNLSVAgfCBPUEVOIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFsZ29yaXRobU9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwYXJhbVMiKSBTRVEsIDIsIDIsIDMsIFNLSVAgfCBFWFQsIDAsIF9QYXJhbXN9LAorCXtGTkFNRSgic2lnbmF0dXJlIikgQklUU1RSLCBTRU1JLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9DcnlwdG9Ub2tlbl9jcnlwdG9TaWduZWRUb2tlbltdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgidG9rZW5PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgidG9rZW4iKSBTRVEsIDAsIDQsIDQsIFNLSVAsIDAsCisJIF9DcnlwdG9Ub2tlbl9jcnlwdG9TaWduZWRUb2tlbl90b2tlbn0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ3J5cHRvVG9rZW5fY3J5cHRvSGFzaGVkVG9rZW5fdG9rZW5bXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImFsZ29yaXRobU9JRCIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwYXJhbVMiKSBTRVEsIDIsIDIsIDMsIFNLSVAgfCBFWFQsIDAsIF9QYXJhbXN9LAorCXtGTkFNRSgiaGFzaCIpIEJJVFNUUiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ3J5cHRvVG9rZW5fY3J5cHRvSGFzaGVkVG9rZW5bXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInRva2VuT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImhhc2hlZFZhbHMiKSBTRVEsIDgsIDksIDExLCBTS0lQIHwgRVhULCAwLCBfQ2xlYXJUb2tlbn0sCisJe0ZOQU1FKCJ0b2tlbiIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKKwkgX0NyeXB0b1Rva2VuX2NyeXB0b0hhc2hlZFRva2VuX3Rva2VufSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9DcnlwdG9Ub2tlbl9jcnlwdG9Qd2RFbmNyW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJhbGdvcml0aG1PSUQiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicGFyYW1TIikgU0VRLCAyLCAyLCAzLCBTS0lQIHwgRVhULCAwLCBfUGFyYW1zfSwKKwl7Rk5BTUUoImVuY3J5cHRlZERhdGEiKSBPQ1RTVFIsIFNFTUksIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0NyeXB0b1Rva2VuW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgiY3J5cHRvRW5jcnlwdGVkVG9rZW4iKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsCisJIF9DcnlwdG9Ub2tlbl9jcnlwdG9FbmNyeXB0ZWRUb2tlbn0sCisJe0ZOQU1FKCJjcnlwdG9TaWduZWRUb2tlbiIpIFNFUSwgMCwgMiwgMiwgU0tJUCwgMCwKKwkgX0NyeXB0b1Rva2VuX2NyeXB0b1NpZ25lZFRva2VufSwKKwl7Rk5BTUUoImNyeXB0b0hhc2hlZFRva2VuIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAorCSBfQ3J5cHRvVG9rZW5fY3J5cHRvSGFzaGVkVG9rZW59LAorCXtGTkFNRSgiY3J5cHRvUHdkRW5jciIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKKwkgX0NyeXB0b1Rva2VuX2NyeXB0b1B3ZEVuY3J9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0NyeXB0b0gzMjNUb2tlbltdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoImNyeXB0b0VQUHdkSGFzaCIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKKwkgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9FUFB3ZEhhc2h9LAorCXtGTkFNRSgiY3J5cHRvR0tQd2RIYXNoIikgU0VRLCAwLCAzLCAzLCBTS0lQLCAwLAorCSBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0dLUHdkSGFzaH0sCisJe0ZOQU1FKCJjcnlwdG9FUFB3ZEVuY3IiKSBTRVEsIDAsIDMsIDMsIFNLSVAsIDAsCisJIF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvRVBQd2RFbmNyfSwKKwl7Rk5BTUUoImNyeXB0b0dLUHdkRW5jciIpIFNFUSwgMCwgMywgMywgU0tJUCwgMCwKKwkgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9HS1B3ZEVuY3J9LAorCXtGTkFNRSgiY3J5cHRvRVBDZXJ0IikgU0VRLCAwLCA0LCA0LCBTS0lQLCAwLAorCSBfQ3J5cHRvSDMyM1Rva2VuX2NyeXB0b0VQQ2VydH0sCisJe0ZOQU1FKCJjcnlwdG9HS0NlcnQiKSBTRVEsIDAsIDQsIDQsIFNLSVAsIDAsCisJIF9DcnlwdG9IMzIzVG9rZW5fY3J5cHRvR0tDZXJ0fSwKKwl7Rk5BTUUoImNyeXB0b0Zhc3RTdGFydCIpIFNFUSwgMCwgNCwgNCwgU0tJUCwgMCwKKwkgX0NyeXB0b0gzMjNUb2tlbl9jcnlwdG9GYXN0U3RhcnR9LAorCXtGTkFNRSgibmVzdGVkY3J5cHRvVG9rZW4iKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQsIDAsCisJIF9DcnlwdG9Ub2tlbn0sCit9OworCitzdGF0aWMgZmllbGRfdCBfUHJvZ3Jlc3NfVVVJRV9jcnlwdG9Ub2tlbnNbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDMsIDgsIDgsIFNLSVAgfCBFWFQsIDAsIF9DcnlwdG9IMzIzVG9rZW59LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1Byb2dyZXNzX1VVSUVfZmFzdFN0YXJ0W10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgU0VRLCAxLCAzLCA1LCBERUNPREUgfCBPUEVOIHwgRVhULAorCSBzaXplb2YoT3BlbkxvZ2ljYWxDaGFubmVsKSwgX09wZW5Mb2dpY2FsQ2hhbm5lbH0KKwksCit9OworCitzdGF0aWMgZmllbGRfdCBfUHJvZ3Jlc3NfVVVJRVtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRlc3RpbmF0aW9uSW5mbyIpIFNFUSwgNiwgOCwgMTAsIFNLSVAgfCBFWFQsIDAsCisJIF9FbmRwb2ludFR5cGV9LAorCXtGTkFNRSgiaDI0NUFkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCB8IE9QVCwKKwkgb2Zmc2V0b2YoUHJvZ3Jlc3NfVVVJRSwgaDI0NUFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCisJe0ZOQU1FKCJjYWxsSWRlbnRpZmllciIpIFNFUSwgMCwgMSwgMSwgU0tJUCB8IEVYVCwgMCwKKwkgX0NhbGxJZGVudGlmaWVyfSwKKwl7Rk5BTUUoImgyNDVTZWN1cml0eU1vZGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQgfCBPUFQsIDAsCisJIF9IMjQ1U2VjdXJpdHl9LAorCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCisJIF9Qcm9ncmVzc19VVUlFX3Rva2Vuc30sCisJe0ZOQU1FKCJjcnlwdG9Ub2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKKwkgX1Byb2dyZXNzX1VVSUVfY3J5cHRvVG9rZW5zfSwKKwl7Rk5BTUUoImZhc3RTdGFydCIpIFNFUU9GLCBTRU1JLCAwLCAzMCwgREVDT0RFIHwgT1BULAorCSBvZmZzZXRvZihQcm9ncmVzc19VVUlFLCBmYXN0U3RhcnQpLCBfUHJvZ3Jlc3NfVVVJRV9mYXN0U3RhcnR9LAorCXtGTkFNRSgibXVsdGlwbGVDYWxscyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibWFpbnRhaW5Db25uZWN0aW9uIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmYXN0Q29ubmVjdFJlZnVzZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0gzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5W10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgic2V0dXAiKSBTRVEsIDcsIDEzLCAzOSwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSwgc2V0dXApLCBfU2V0dXBfVVVJRX0sCisJe0ZOQU1FKCJjYWxsUHJvY2VlZGluZyIpIFNFUSwgMSwgMywgMTIsIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHksIGNhbGxQcm9jZWVkaW5nKSwKKwkgX0NhbGxQcm9jZWVkaW5nX1VVSUV9LAorCXtGTkFNRSgiY29ubmVjdCIpIFNFUSwgMSwgNCwgMTksIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHksIGNvbm5lY3QpLCBfQ29ubmVjdF9VVUlFfSwKKwl7Rk5BTUUoImFsZXJ0aW5nIikgU0VRLCAxLCAzLCAxNywgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSwgYWxlcnRpbmcpLCBfQWxlcnRpbmdfVVVJRX0sCisJe0ZOQU1FKCJpbmZvcm1hdGlvbiIpIFNFUSwgMCwgMSwgNywgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSwgaW5mb3JtYXRpb24pLAorCSBfSW5mb3JtYXRpb25fVVVJRX0sCisJe0ZOQU1FKCJyZWxlYXNlQ29tcGxldGUiKSBTRVEsIDEsIDIsIDExLCBTS0lQIHwgRVhULCAwLAorCSBfUmVsZWFzZUNvbXBsZXRlX1VVSUV9LAorCXtGTkFNRSgiZmFjaWxpdHkiKSBTRVEsIDMsIDUsIDIxLCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKEgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5LCBmYWNpbGl0eSksIF9GYWNpbGl0eV9VVUlFfSwKKwl7Rk5BTUUoInByb2dyZXNzIikgU0VRLCA1LCA4LCAxMSwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keSwgcHJvZ3Jlc3MpLCBfUHJvZ3Jlc3NfVVVJRX0sCisJe0ZOQU1FKCJlbXB0eSIpIE5VTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzdGF0dXMiKSBTRVEsIDIsIDQsIDQsIFNLSVAgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic3RhdHVzSW5xdWlyeSIpIFNFUSwgMiwgNCwgNCwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzZXR1cEFja25vd2xlZGdlIikgU0VRLCAyLCA0LCA0LCBTS0lQIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm5vdGlmeSIpIFNFUSwgMiwgNCwgNCwgU0tJUCB8IEVYVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfUmVxdWVzdE1lc3NhZ2VbXSA9IHsJLyogQ0hPSUNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZCIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtYXN0ZXJTbGF2ZURldGVybWluYXRpb24iKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidGVybWluYWxDYXBhYmlsaXR5U2V0IikgU0VRLCAzLCA1LCA1LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm9wZW5Mb2dpY2FsQ2hhbm5lbCIpIFNFUSwgMSwgMywgNSwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihSZXF1ZXN0TWVzc2FnZSwgb3BlbkxvZ2ljYWxDaGFubmVsKSwgX09wZW5Mb2dpY2FsQ2hhbm5lbH0sCisJe0ZOQU1FKCJjbG9zZUxvZ2ljYWxDaGFubmVsIikgU0VRLCAwLCAyLCAzLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJlcXVlc3RDaGFubmVsQ2xvc2UiKSBTRVEsIDAsIDEsIDMsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibXVsdGlwbGV4RW50cnlTZW5kIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJlcXVlc3RNdWx0aXBsZXhFbnRyeSIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZXF1ZXN0TW9kZSIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyb3VuZFRyaXBEZWxheVJlcXVlc3QiKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibWFpbnRlbmFuY2VMb29wUmVxdWVzdCIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjb21tdW5pY2F0aW9uTW9kZVJlcXVlc3QiKSBTRVEsIDAsIDAsIDAsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY29uZmVyZW5jZVJlcXVlc3QiKSBDSE9JQ0UsIDMsIDgsIDE2LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm11bHRpbGlua1JlcXVlc3QiKSBDSE9JQ0UsIDMsIDUsIDUsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibG9naWNhbENoYW5uZWxSYXRlUmVxdWVzdCIpIFNFUSwgMCwgMywgMywgU1RPUCB8IEVYVCwgMCwKKwkgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc1tdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoImgyMjJMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMiKSBTRVEsIDMsIDUsIDUsIFNLSVAgfCBFWFQsIDAsCisJIF9IMjIyTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKKwl7Rk5BTUUoImgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAxMCwgMTEsIDE0LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mCisJIChPcGVuTG9naWNhbENoYW5uZWxBY2tfcmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tdWx0aXBsZXhQYXJhbWV0ZXJzLAorCSAgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpLCBfSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnN9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX09wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJyZXZlcnNlTG9naWNhbENoYW5uZWxOdW1iZXIiKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicG9ydE51bWJlciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtdWx0aXBsZXhQYXJhbWV0ZXJzIikgQ0hPSUNFLCAwLCAxLCAyLCBERUNPREUgfCBFWFQgfCBPUFQsCisJIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLAorCQkgIG11bHRpcGxleFBhcmFtZXRlcnMpLAorCSBfT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc30sCisJe0ZOQU1FKCJyZXBsYWNlbWVudEZvciIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnNfbm9uU3RhbmRhcmRbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBTRVEsIDAsIDIsIDIsIFNLSVAsIDAsIF9IMjQ1X05vblN0YW5kYXJkUGFyYW1ldGVyfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVyc1tdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCB8IE9QVCwgMCwKKwkgX0gyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX25vblN0YW5kYXJkfSwKKwl7Rk5BTUUoInNlc3Npb25JRCIpIElOVCwgOCwgMSwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtZWRpYUNoYW5uZWwiKSBDSE9JQ0UsIDEsIDIsIDIsIERFQ09ERSB8IEVYVCB8IE9QVCwKKwkgb2Zmc2V0b2YoSDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnMsIG1lZGlhQ2hhbm5lbCksCisJIF9IMjQ1X1RyYW5zcG9ydEFkZHJlc3N9LAorCXtGTkFNRSgibWVkaWFDb250cm9sQ2hhbm5lbCIpIENIT0lDRSwgMSwgMiwgMiwgREVDT0RFIHwgRVhUIHwgT1BULAorCSBvZmZzZXRvZihIMjI1MExvZ2ljYWxDaGFubmVsQWNrUGFyYW1ldGVycywgbWVkaWFDb250cm9sQ2hhbm5lbCksCisJIF9IMjQ1X1RyYW5zcG9ydEFkZHJlc3N9LAorCXtGTkFNRSgiZHluYW1pY1JUUFBheWxvYWRUeXBlIikgSU5ULCA1LCA5NiwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmbG93Q29udHJvbFRvWmVybyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicG9ydE51bWJlciIpIElOVCwgV09SRCwgMCwgMCwgU0tJUCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgiaDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnMiKSBTRVEsIDUsIDUsIDcsIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoT3BlbkxvZ2ljYWxDaGFubmVsQWNrX2ZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzLAorCQkgIGgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzKSwKKwkgX0gyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9PcGVuTG9naWNhbENoYW5uZWxBY2tbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoImZvcndhcmRMb2dpY2FsQ2hhbm5lbE51bWJlciIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzIikgU0VRLCAyLCAzLCA0LAorCSBERUNPREUgfCBFWFQgfCBPUFQsIG9mZnNldG9mKE9wZW5Mb2dpY2FsQ2hhbm5lbEFjaywKKwkJCQkgICAgICByZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKSwKKwkgX09wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzfSwKKwl7Rk5BTUUoInNlcGFyYXRlU3RhY2siKSBTRVEsIDIsIDQsIDUsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnMiKSBDSE9JQ0UsIDAsIDEsIDEsCisJIERFQ09ERSB8IEVYVCB8IE9QVCwgb2Zmc2V0b2YoT3BlbkxvZ2ljYWxDaGFubmVsQWNrLAorCQkJCSAgICAgIGZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzKSwKKwkgX09wZW5Mb2dpY2FsQ2hhbm5lbEFja19mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVyc30sCisJe0ZOQU1FKCJlbmNyeXB0aW9uU3luYyIpIFNFUSwgMiwgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfUmVzcG9uc2VNZXNzYWdlW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgibm9uU3RhbmRhcmQiKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibWFzdGVyU2xhdmVEZXRlcm1pbmF0aW9uQWNrIikgU0VRLCAwLCAxLCAxLCBTVE9QIHwgRVhULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoIm1hc3RlclNsYXZlRGV0ZXJtaW5hdGlvblJlamVjdCIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJ0ZXJtaW5hbENhcGFiaWxpdHlTZXRBY2siKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidGVybWluYWxDYXBhYmlsaXR5U2V0UmVqZWN0IikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgRVhULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoIm9wZW5Mb2dpY2FsQ2hhbm5lbEFjayIpIFNFUSwgMSwgMiwgNSwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihSZXNwb25zZU1lc3NhZ2UsIG9wZW5Mb2dpY2FsQ2hhbm5lbEFjayksCisJIF9PcGVuTG9naWNhbENoYW5uZWxBY2t9LAorCXtGTkFNRSgib3BlbkxvZ2ljYWxDaGFubmVsUmVqZWN0IikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNsb3NlTG9naWNhbENoYW5uZWxBY2siKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicmVxdWVzdENoYW5uZWxDbG9zZUFjayIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZXF1ZXN0Q2hhbm5lbENsb3NlUmVqZWN0IikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgRVhULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoIm11bHRpcGxleEVudHJ5U2VuZEFjayIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtdWx0aXBsZXhFbnRyeVNlbmRSZWplY3QiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicmVxdWVzdE11bHRpcGxleEVudHJ5QWNrIikgU0VRLCAwLCAxLCAxLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJlcXVlc3RNdWx0aXBsZXhFbnRyeVJlamVjdCIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJyZXF1ZXN0TW9kZUFjayIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZXF1ZXN0TW9kZVJlamVjdCIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyb3VuZFRyaXBEZWxheVJlc3BvbnNlIikgU0VRLCAwLCAxLCAxLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm1haW50ZW5hbmNlTG9vcEFjayIpIFNFUSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtYWludGVuYW5jZUxvb3BSZWplY3QiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY29tbXVuaWNhdGlvbk1vZGVSZXNwb25zZSIpIENIT0lDRSwgMCwgMSwgMSwgU1RPUCB8IEVYVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJjb25mZXJlbmNlUmVzcG9uc2UiKSBDSE9JQ0UsIDMsIDgsIDE2LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm11bHRpbGlua1Jlc3BvbnNlIikgQ0hPSUNFLCAzLCA1LCA1LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImxvZ2ljYWxDaGFubmVsUmF0ZUFja25vd2xlZGdlIikgU0VRLCAwLCAzLCAzLCBTVE9QIHwgRVhULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoImxvZ2ljYWxDaGFubmVsUmF0ZVJlamVjdCIpIFNFUSwgMSwgNCwgNCwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgicmVxdWVzdCIpIENIT0lDRSwgNCwgMTEsIDE1LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKE11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSwgcmVxdWVzdCksIF9SZXF1ZXN0TWVzc2FnZX0sCisJe0ZOQU1FKCJyZXNwb25zZSIpIENIT0lDRSwgNSwgMTksIDI0LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKE11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSwgcmVzcG9uc2UpLAorCSBfUmVzcG9uc2VNZXNzYWdlfSwKKwl7Rk5BTUUoImNvbW1hbmQiKSBDSE9JQ0UsIDMsIDcsIDEyLCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImluZGljYXRpb24iKSBDSE9JQ0UsIDQsIDE0LCAyMywgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSDMyM19VVV9QRFVfaDI0NUNvbnRyb2xbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDIsIDQsIDQsIERFQ09ERSB8IE9QRU4gfCBFWFQsCisJIHNpemVvZihNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UpLAorCSBfTXVsdGltZWRpYVN5c3RlbUNvbnRyb2xNZXNzYWdlfQorCSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMzIzX1VVX1BEVVtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiaDMyMy1tZXNzYWdlLWJvZHkiKSBDSE9JQ0UsIDMsIDcsIDEzLCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKEgzMjNfVVVfUERVLCBoMzIzX21lc3NhZ2VfYm9keSksCisJIF9IMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keX0sCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJoNDUwMVN1cHBsZW1lbnRhcnlTZXJ2aWNlIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgiaDI0NVR1bm5lbGluZyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiaDI0NUNvbnRyb2wiKSBTRVFPRiwgU0VNSSwgMCwgNCwgREVDT0RFIHwgT1BULAorCSBvZmZzZXRvZihIMzIzX1VVX1BEVSwgaDI0NUNvbnRyb2wpLCBfSDMyM19VVV9QRFVfaDI0NUNvbnRyb2x9LAorCXtGTkFNRSgibm9uU3RhbmRhcmRDb250cm9sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2FsbExpbmthZ2UiKSBTRVEsIDIsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidHVubmVsbGVkU2lnbmFsbGluZ01lc3NhZ2UiKSBTRVEsIDIsIDQsIDQsIFNUT1AgfCBFWFQgfCBPUFQsCisJIDAsIE5VTEx9LAorCXtGTkFNRSgicHJvdmlzaW9uYWxSZXNwVG9IMjQ1VHVubmVsaW5nIikgTlVMLCBGSVhELCAwLCAwLCBTVE9QIHwgT1BULAorCSAwLCBOVUxMfSwKKwl7Rk5BTUUoInN0aW11bHVzQ29udHJvbCIpIFNFUSwgMywgMywgMywgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9IMzIzX1VzZXJJbmZvcm1hdGlvbltdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgiaDMyMy11dS1wZHUiKSBTRVEsIDEsIDIsIDExLCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKEgzMjNfVXNlckluZm9ybWF0aW9uLCBoMzIzX3V1X3BkdSksIF9IMzIzX1VVX1BEVX0sCisJe0ZOQU1FKCJ1c2VyLWRhdGEiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0dhdGVrZWVwZXJSZXF1ZXN0W10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJyZXF1ZXN0U2VxTnVtIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInByb3RvY29sSWRlbnRpZmllciIpIE9JRCwgQllURSwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJyYXNBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKEdhdGVrZWVwZXJSZXF1ZXN0LCByYXNBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3N9LAorCXtGTkFNRSgiZW5kcG9pbnRUeXBlIikgU0VRLCA2LCA4LCAxMCwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnYXRla2VlcGVySWRlbnRpZmllciIpIEJNUFNUUiwgNywgMSwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYWxsU2VydmljZXMiKSBTRVEsIDAsIDgsIDgsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZW5kcG9pbnRBbGlhcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFsdGVybmF0ZUVuZHBvaW50cyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImF1dGhlbnRpY2F0aW9uQ2FwYWJpbGl0eSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoImFsZ29yaXRobU9JRHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpbnRlZ3JpdHkiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpbnRlZ3JpdHlDaGVja1ZhbHVlIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN1cHBvcnRzQWx0R0siKSBOVUwsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9HYXRla2VlcGVyQ29uZmlybVtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgicmVxdWVzdFNlcU51bSIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJwcm90b2NvbElkZW50aWZpZXIiKSBPSUQsIEJZVEUsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTS0lQIHwgT1BULCAwLAorCSBfTm9uU3RhbmRhcmRQYXJhbWV0ZXJ9LAorCXtGTkFNRSgiZ2F0ZWtlZXBlcklkZW50aWZpZXIiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicmFzQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihHYXRla2VlcGVyQ29uZmlybSwgcmFzQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImFsdGVybmF0ZUdhdGVrZWVwZXIiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhdXRoZW50aWNhdGlvbk1vZGUiKSBDSE9JQ0UsIDMsIDcsIDgsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiYWxnb3JpdGhtT0lEIikgT0lELCBCWVRFLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImludGVncml0eSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImludGVncml0eUNoZWNrVmFsdWUiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9SZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQsCisJIHNpemVvZihUcmFuc3BvcnRBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3N9CisJLAorfTsKKworc3RhdGljIGZpZWxkX3QgX1JlZ2lzdHJhdGlvblJlcXVlc3RfcmFzQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLworCXtGTkFNRSgiaXRlbSIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAorCSBzaXplb2YoVHJhbnNwb3J0QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfQorCSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9SZWdpc3RyYXRpb25SZXF1ZXN0X3Rlcm1pbmFsQWxpYXNbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1JlZ2lzdHJhdGlvblJlcXVlc3RbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInJlcXVlc3RTZXFOdW0iKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKKwkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImRpc2NvdmVyeUNvbXBsZXRlIikgQk9PTCwgRklYRCwgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYWxsU2lnbmFsQWRkcmVzcyIpIFNFUU9GLCBTRU1JLCAwLCAxMCwgREVDT0RFLAorCSBvZmZzZXRvZihSZWdpc3RyYXRpb25SZXF1ZXN0LCBjYWxsU2lnbmFsQWRkcmVzcyksCisJIF9SZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzfSwKKwl7Rk5BTUUoInJhc0FkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMTAsIERFQ09ERSwKKwkgb2Zmc2V0b2YoUmVnaXN0cmF0aW9uUmVxdWVzdCwgcmFzQWRkcmVzcyksCisJIF9SZWdpc3RyYXRpb25SZXF1ZXN0X3Jhc0FkZHJlc3N9LAorCXtGTkFNRSgidGVybWluYWxUeXBlIikgU0VRLCA2LCA4LCAxMCwgU0tJUCB8IEVYVCwgMCwgX0VuZHBvaW50VHlwZX0sCisJe0ZOQU1FKCJ0ZXJtaW5hbEFsaWFzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCisJIF9SZWdpc3RyYXRpb25SZXF1ZXN0X3Rlcm1pbmFsQWxpYXN9LAorCXtGTkFNRSgiZ2F0ZWtlZXBlcklkZW50aWZpZXIiKSBCTVBTVFIsIDcsIDEsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZW5kcG9pbnRWZW5kb3IiKSBTRVEsIDIsIDMsIDMsIFNLSVAgfCBFWFQsIDAsCisJIF9WZW5kb3JJZGVudGlmaWVyfSwKKwl7Rk5BTUUoImFsdGVybmF0ZUVuZHBvaW50cyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRpbWVUb0xpdmUiKSBJTlQsIENPTlMsIDEsIDAsIERFQ09ERSB8IE9QVCwKKwkgb2Zmc2V0b2YoUmVnaXN0cmF0aW9uUmVxdWVzdCwgdGltZVRvTGl2ZSksIE5VTEx9LAorCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiaW50ZWdyaXR5Q2hlY2tWYWx1ZSIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJrZWVwQWxpdmUiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImVuZHBvaW50SWRlbnRpZmllciIpIEJNUFNUUiwgNywgMSwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ3aWxsU3VwcGx5VVVJRXMiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm1haW50YWluQ29ubmVjdGlvbiIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAorCXtGTkFNRSgiYWx0ZXJuYXRlVHJhbnNwb3J0QWRkcmVzc2VzIikgU0VRLCAxLCAxLCAxLCBTVE9QIHwgRVhUIHwgT1BULAorCSAwLCBOVUxMfSwKKwl7Rk5BTUUoImFkZGl0aXZlUmVnaXN0cmF0aW9uIikgTlVMLCBGSVhELCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRlcm1pbmFsQWxpYXNQYXR0ZXJuIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgic3VwcG9ydHNBbHRHSyIpIE5VTCwgRklYRCwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ1c2FnZVJlcG9ydGluZ0NhcGFiaWxpdHkiKSBTRVEsIDMsIDQsIDQsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgibXVsdGlwbGVDYWxscyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic3VwcG9ydGVkSDI0OFBhY2thZ2VzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgiY2FsbENyZWRpdENhcGFiaWxpdHkiKSBTRVEsIDIsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgiY2FwYWNpdHlSZXBvcnRpbmdDYXBhYmlsaXR5IikgU0VRLCAwLCAxLCAxLCBTVE9QIHwgRVhUIHwgT1BULAorCSAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZlYXR1cmVTZXQiKSBTRVEsIDMsIDQsIDQsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZ2VuZXJpY0RhdGEiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfUmVnaXN0cmF0aW9uQ29uZmlybV9jYWxsU2lnbmFsQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLworCXtGTkFNRSgiaXRlbSIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAorCSBzaXplb2YoVHJhbnNwb3J0QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfQorCSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9SZWdpc3RyYXRpb25Db25maXJtX3Rlcm1pbmFsQWxpYXNbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX1JlZ2lzdHJhdGlvbkNvbmZpcm1bXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInJlcXVlc3RTZXFOdW0iKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgicHJvdG9jb2xJZGVudGlmaWVyIikgT0lELCBCWVRFLCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoIm5vblN0YW5kYXJkRGF0YSIpIFNFUSwgMCwgMiwgMiwgU0tJUCB8IE9QVCwgMCwKKwkgX05vblN0YW5kYXJkUGFyYW1ldGVyfSwKKwl7Rk5BTUUoImNhbGxTaWduYWxBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDEwLCBERUNPREUsCisJIG9mZnNldG9mKFJlZ2lzdHJhdGlvbkNvbmZpcm0sIGNhbGxTaWduYWxBZGRyZXNzKSwKKwkgX1JlZ2lzdHJhdGlvbkNvbmZpcm1fY2FsbFNpZ25hbEFkZHJlc3N9LAorCXtGTkFNRSgidGVybWluYWxBbGlhcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLAorCSBfUmVnaXN0cmF0aW9uQ29uZmlybV90ZXJtaW5hbEFsaWFzfSwKKwl7Rk5BTUUoImdhdGVrZWVwZXJJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImVuZHBvaW50SWRlbnRpZmllciIpIEJNUFNUUiwgNywgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhbHRlcm5hdGVHYXRla2VlcGVyIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidGltZVRvTGl2ZSIpIElOVCwgQ09OUywgMSwgMCwgREVDT0RFIHwgT1BULAorCSBvZmZzZXRvZihSZWdpc3RyYXRpb25Db25maXJtLCB0aW1lVG9MaXZlKSwgTlVMTH0sCisJe0ZOQU1FKCJ0b2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjcnlwdG9Ub2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpbnRlZ3JpdHlDaGVja1ZhbHVlIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoIndpbGxSZXNwb25kVG9JUlIiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInByZUdyYW50ZWRBUlEiKSBTRVEsIDAsIDQsIDgsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibWFpbnRhaW5Db25uZWN0aW9uIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzZXJ2aWNlQ29udHJvbCIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN1cHBvcnRzQWRkaXRpdmVSZWdpc3RyYXRpb24iKSBOVUwsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgidGVybWluYWxBbGlhc1BhdHRlcm4iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJzdXBwb3J0ZWRQcmVmaXhlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInVzYWdlU3BlYyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImZlYXR1cmVTZXJ2ZXJBbGlhcyIpIENIT0lDRSwgMSwgMiwgNywgU1RPUCB8IEVYVCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJjYXBhY2l0eVJlcG9ydGluZ1NwZWMiKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9VbnJlZ2lzdHJhdGlvblJlcXVlc3RfY2FsbFNpZ25hbEFkZHJlc3NbXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCwKKwkgc2l6ZW9mKFRyYW5zcG9ydEFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30KKwksCit9OworCitzdGF0aWMgZmllbGRfdCBfVW5yZWdpc3RyYXRpb25SZXF1ZXN0W10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJyZXF1ZXN0U2VxTnVtIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhbGxTaWduYWxBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDEwLCBERUNPREUsCisJIG9mZnNldG9mKFVucmVnaXN0cmF0aW9uUmVxdWVzdCwgY2FsbFNpZ25hbEFkZHJlc3MpLAorCSBfVW5yZWdpc3RyYXRpb25SZXF1ZXN0X2NhbGxTaWduYWxBZGRyZXNzfSwKKwl7Rk5BTUUoImVuZHBvaW50QWxpYXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFsdGVybmF0ZUVuZHBvaW50cyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImdhdGVrZWVwZXJJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImludGVncml0eUNoZWNrVmFsdWUiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicmVhc29uIikgQ0hPSUNFLCAyLCA0LCA1LCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImVuZHBvaW50QWxpYXNQYXR0ZXJuIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgic3VwcG9ydGVkUHJlZml4ZXMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhbHRlcm5hdGVHYXRla2VlcGVyIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZ2VuZXJpY0RhdGEiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfQ2FsbE1vZGVsW10gPSB7CS8qIENIT0lDRSAqLworCXtGTkFNRSgiZGlyZWN0IikgTlVMLCBGSVhELCAwLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImdhdGVrZWVwZXJSb3V0ZWQiKSBOVUwsIEZJWEQsIDAsIDAsIFNLSVAsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0FkbWlzc2lvblJlcXVlc3RfZGVzdGluYXRpb25JbmZvW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhULCAwLCBfQWxpYXNBZGRyZXNzfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9BZG1pc3Npb25SZXF1ZXN0X2Rlc3RFeHRyYUNhbGxJbmZvW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhULCAwLCBfQWxpYXNBZGRyZXNzfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9BZG1pc3Npb25SZXF1ZXN0X3NyY0luZm9bXSA9IHsJLyogU0VRVUVOQ0UgT0YgKi8KKwl7Rk5BTUUoIml0ZW0iKSBDSE9JQ0UsIDEsIDIsIDcsIFNLSVAgfCBFWFQsIDAsIF9BbGlhc0FkZHJlc3N9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0FkbWlzc2lvblJlcXVlc3RbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInJlcXVlc3RTZXFOdW0iKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2FsbFR5cGUiKSBDSE9JQ0UsIDIsIDQsIDQsIFNLSVAgfCBFWFQsIDAsIF9DYWxsVHlwZX0sCisJe0ZOQU1FKCJjYWxsTW9kZWwiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQgfCBPUFQsIDAsIF9DYWxsTW9kZWx9LAorCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRlc3RpbmF0aW9uSW5mbyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQIHwgT1BULCAwLAorCSBfQWRtaXNzaW9uUmVxdWVzdF9kZXN0aW5hdGlvbkluZm99LAorCXtGTkFNRSgiZGVzdENhbGxTaWduYWxBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQgfCBPUFQsCisJIG9mZnNldG9mKEFkbWlzc2lvblJlcXVlc3QsIGRlc3RDYWxsU2lnbmFsQWRkcmVzcyksCisJIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImRlc3RFeHRyYUNhbGxJbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNLSVAgfCBPUFQsIDAsCisJIF9BZG1pc3Npb25SZXF1ZXN0X2Rlc3RFeHRyYUNhbGxJbmZvfSwKKwl7Rk5BTUUoInNyY0luZm8iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU0tJUCwgMCwKKwkgX0FkbWlzc2lvblJlcXVlc3Rfc3JjSW5mb30sCisJe0ZOQU1FKCJzcmNDYWxsU2lnbmFsQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhUIHwgT1BULAorCSBvZmZzZXRvZihBZG1pc3Npb25SZXF1ZXN0LCBzcmNDYWxsU2lnbmFsQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImJhbmRXaWR0aCIpIElOVCwgQ09OUywgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYWxsUmVmZXJlbmNlVmFsdWUiKSBJTlQsIFdPUkQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAorCXtGTkFNRSgibm9uU3RhbmRhcmREYXRhIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhbGxTZXJ2aWNlcyIpIFNFUSwgMCwgOCwgOCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjb25mZXJlbmNlSUQiKSBPQ1RTVFIsIEZJWEQsIDE2LCAwLCBTVE9QLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFjdGl2ZU1DIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhbnN3ZXJDYWxsIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYW5NYXBBbGlhcyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2FsbElkZW50aWZpZXIiKSBTRVEsIDAsIDEsIDEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic3JjQWx0ZXJuYXRpdmVzIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdEFsdGVybmF0aXZlcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImdhdGVrZWVwZXJJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImludGVncml0eUNoZWNrVmFsdWUiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidHJhbnNwb3J0UU9TIikgQ0hPSUNFLCAyLCAzLCAzLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoIndpbGxTdXBwbHlVVUlFcyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2FsbExpbmthZ2UiKSBTRVEsIDIsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZ2F0ZXdheURhdGFSYXRlIikgU0VRLCAyLCAzLCAzLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNpcmN1aXRJbmZvIikgU0VRLCAzLCAzLCAzLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRlc2lyZWRQcm90b2NvbHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkZXNpcmVkVHVubmVsbGVkUHJvdG9jb2wiKSBTRVEsIDEsIDIsIDIsIFNUT1AgfCBFWFQgfCBPUFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9BZG1pc3Npb25Db25maXJtW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJyZXF1ZXN0U2VxTnVtIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImJhbmRXaWR0aCIpIElOVCwgQ09OUywgMCwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYWxsTW9kZWwiKSBDSE9JQ0UsIDEsIDIsIDIsIFNLSVAgfCBFWFQsIDAsIF9DYWxsTW9kZWx9LAorCXtGTkFNRSgiZGVzdENhbGxTaWduYWxBZGRyZXNzIikgQ0hPSUNFLCAzLCA3LCA3LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKEFkbWlzc2lvbkNvbmZpcm0sIGRlc3RDYWxsU2lnbmFsQWRkcmVzcyksCisJIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImlyckZyZXF1ZW5jeSIpIElOVCwgV09SRCwgMSwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdGluYXRpb25JbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdEV4dHJhQ2FsbEluZm8iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkZXN0aW5hdGlvblR5cGUiKSBTRVEsIDYsIDgsIDEwLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJlbW90ZUV4dGVuc2lvbkFkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJhbHRlcm5hdGVFbmRwb2ludHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0b2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjcnlwdG9Ub2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpbnRlZ3JpdHlDaGVja1ZhbHVlIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRyYW5zcG9ydFFPUyIpIENIT0lDRSwgMiwgMywgMywgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ3aWxsUmVzcG9uZFRvSVJSIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ1dWllc1JlcXVlc3RlZCIpIFNFUSwgMCwgOSwgMTMsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibGFuZ3VhZ2UiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJhbHRlcm5hdGVUcmFuc3BvcnRBZGRyZXNzZXMiKSBTRVEsIDEsIDEsIDEsIFNUT1AgfCBFWFQgfCBPUFQsCisJIDAsIE5VTEx9LAorCXtGTkFNRSgidXNlU3BlY2lmaWVkVHJhbnNwb3J0IikgQ0hPSUNFLCAxLCAyLCAyLCBTVE9QIHwgRVhUIHwgT1BULCAwLAorCSBOVUxMfSwKKwl7Rk5BTUUoImNpcmN1aXRJbmZvIikgU0VRLCAzLCAzLCAzLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInVzYWdlU3BlYyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInN1cHBvcnRlZFByb3RvY29scyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInNlcnZpY2VDb250cm9sIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibXVsdGlwbGVDYWxscyIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZmVhdHVyZVNldCIpIFNFUSwgMywgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJnZW5lcmljRGF0YSIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9Mb2NhdGlvblJlcXVlc3RfZGVzdGluYXRpb25JbmZvW10gPSB7CS8qIFNFUVVFTkNFIE9GICovCisJe0ZOQU1FKCJpdGVtIikgQ0hPSUNFLCAxLCAyLCA3LCBTS0lQIHwgRVhULCAwLCBfQWxpYXNBZGRyZXNzfSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9Mb2NhdGlvblJlcXVlc3RbXSA9IHsJLyogU0VRVUVOQ0UgKi8KKwl7Rk5BTUUoInJlcXVlc3RTZXFOdW0iKSBJTlQsIFdPUkQsIDEsIDAsIFNLSVAsIDAsIE5VTEx9LAorCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRlc3RpbmF0aW9uSW5mbyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTS0lQLCAwLAorCSBfTG9jYXRpb25SZXF1ZXN0X2Rlc3RpbmF0aW9uSW5mb30sCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJyZXBseUFkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoTG9jYXRpb25SZXF1ZXN0LCByZXBseUFkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCisJe0ZOQU1FKCJzb3VyY2VJbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2FuTWFwQWxpYXMiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImdhdGVrZWVwZXJJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInRva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNyeXB0b1Rva2VucyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImludGVncml0eUNoZWNrVmFsdWUiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzaXJlZFByb3RvY29scyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImRlc2lyZWRUdW5uZWxsZWRQcm90b2NvbCIpIFNFUSwgMSwgMiwgMiwgU1RPUCB8IEVYVCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJmZWF0dXJlU2V0IikgU0VRLCAzLCA0LCA0LCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImdlbmVyaWNEYXRhIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiaG9wQ291bnQiKSBJTlQsIDgsIDEsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2lyY3VpdEluZm8iKSBTRVEsIDMsIDMsIDMsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorfTsKKworc3RhdGljIGZpZWxkX3QgX0xvY2F0aW9uQ29uZmlybVtdID0gewkvKiBTRVFVRU5DRSAqLworCXtGTkFNRSgicmVxdWVzdFNlcU51bSIpIElOVCwgV09SRCwgMSwgMCwgU0tJUCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjYWxsU2lnbmFsQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihMb2NhdGlvbkNvbmZpcm0sIGNhbGxTaWduYWxBZGRyZXNzKSwgX1RyYW5zcG9ydEFkZHJlc3N9LAorCXtGTkFNRSgicmFzQWRkcmVzcyIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihMb2NhdGlvbkNvbmZpcm0sIHJhc0FkZHJlc3MpLCBfVHJhbnNwb3J0QWRkcmVzc30sCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdGluYXRpb25JbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGVzdEV4dHJhQ2FsbEluZm8iKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkZXN0aW5hdGlvblR5cGUiKSBTRVEsIDYsIDgsIDEwLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJlbW90ZUV4dGVuc2lvbkFkZHJlc3MiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJhbHRlcm5hdGVFbmRwb2ludHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ0b2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJjcnlwdG9Ub2tlbnMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpbnRlZ3JpdHlDaGVja1ZhbHVlIikgU0VRLCAwLCAyLCAyLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFsdGVybmF0ZVRyYW5zcG9ydEFkZHJlc3NlcyIpIFNFUSwgMSwgMSwgMSwgU1RPUCB8IEVYVCB8IE9QVCwKKwkgMCwgTlVMTH0sCisJe0ZOQU1FKCJzdXBwb3J0ZWRQcm90b2NvbHMiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJtdWx0aXBsZUNhbGxzIikgQk9PTCwgRklYRCwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJmZWF0dXJlU2V0IikgU0VRLCAzLCA0LCA0LCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImdlbmVyaWNEYXRhIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY2lyY3VpdEluZm8iKSBTRVEsIDMsIDMsIDMsIFNUT1AgfCBFWFQgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgic2VydmljZUNvbnRyb2wiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfSW5mb1JlcXVlc3RSZXNwb25zZV9jYWxsU2lnbmFsQWRkcmVzc1tdID0gewkvKiBTRVFVRU5DRSBPRiAqLworCXtGTkFNRSgiaXRlbSIpIENIT0lDRSwgMywgNywgNywgREVDT0RFIHwgRVhULAorCSBzaXplb2YoVHJhbnNwb3J0QWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfQorCSwKK307CisKK3N0YXRpYyBmaWVsZF90IF9JbmZvUmVxdWVzdFJlc3BvbnNlW10gPSB7CS8qIFNFUVVFTkNFICovCisJe0ZOQU1FKCJub25TdGFuZGFyZERhdGEiKSBTRVEsIDAsIDIsIDIsIFNLSVAgfCBPUFQsIDAsCisJIF9Ob25TdGFuZGFyZFBhcmFtZXRlcn0sCisJe0ZOQU1FKCJyZXF1ZXN0U2VxTnVtIikgSU5ULCBXT1JELCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImVuZHBvaW50VHlwZSIpIFNFUSwgNiwgOCwgMTAsIFNLSVAgfCBFWFQsIDAsIF9FbmRwb2ludFR5cGV9LAorCXtGTkFNRSgiZW5kcG9pbnRJZGVudGlmaWVyIikgQk1QU1RSLCA3LCAxLCAwLCBTS0lQLCAwLCBOVUxMfSwKKwl7Rk5BTUUoInJhc0FkZHJlc3MiKSBDSE9JQ0UsIDMsIDcsIDcsIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoSW5mb1JlcXVlc3RSZXNwb25zZSwgcmFzQWRkcmVzcyksIF9UcmFuc3BvcnRBZGRyZXNzfSwKKwl7Rk5BTUUoImNhbGxTaWduYWxBZGRyZXNzIikgU0VRT0YsIFNFTUksIDAsIDEwLCBERUNPREUsCisJIG9mZnNldG9mKEluZm9SZXF1ZXN0UmVzcG9uc2UsIGNhbGxTaWduYWxBZGRyZXNzKSwKKwkgX0luZm9SZXF1ZXN0UmVzcG9uc2VfY2FsbFNpZ25hbEFkZHJlc3N9LAorCXtGTkFNRSgiZW5kcG9pbnRBbGlhcyIpIFNFUU9GLCBTRU1JLCAwLCAwLCBTVE9QIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInBlckNhbGxJbmZvIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiY3J5cHRvVG9rZW5zIikgU0VRT0YsIFNFTUksIDAsIDAsIFNUT1AgfCBPUFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiaW50ZWdyaXR5Q2hlY2tWYWx1ZSIpIFNFUSwgMCwgMiwgMiwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJuZWVkUmVzcG9uc2UiKSBCT09MLCBGSVhELCAwLCAwLCBTVE9QLCAwLCBOVUxMfSwKKwl7Rk5BTUUoImNhcGFjaXR5IikgU0VRLCAyLCAyLCAyLCBTVE9QIHwgRVhUIHwgT1BULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImlyclN0YXR1cyIpIENIT0lDRSwgMiwgNCwgNCwgU1RPUCB8IEVYVCB8IE9QVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ1bnNvbGljaXRlZCIpIEJPT0wsIEZJWEQsIDAsIDAsIFNUT1AsIDAsIE5VTEx9LAorCXtGTkFNRSgiZ2VuZXJpY0RhdGEiKSBTRVFPRiwgU0VNSSwgMCwgMCwgU1RPUCB8IE9QVCwgMCwgTlVMTH0sCit9OworCitzdGF0aWMgZmllbGRfdCBfUmFzTWVzc2FnZVtdID0gewkvKiBDSE9JQ0UgKi8KKwl7Rk5BTUUoImdhdGVrZWVwZXJSZXF1ZXN0IikgU0VRLCA0LCA4LCAxOCwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihSYXNNZXNzYWdlLCBnYXRla2VlcGVyUmVxdWVzdCksIF9HYXRla2VlcGVyUmVxdWVzdH0sCisJe0ZOQU1FKCJnYXRla2VlcGVyQ29uZmlybSIpIFNFUSwgMiwgNSwgMTQsIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoUmFzTWVzc2FnZSwgZ2F0ZWtlZXBlckNvbmZpcm0pLCBfR2F0ZWtlZXBlckNvbmZpcm19LAorCXtGTkFNRSgiZ2F0ZWtlZXBlclJlamVjdCIpIFNFUSwgMiwgNSwgMTEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgicmVnaXN0cmF0aW9uUmVxdWVzdCIpIFNFUSwgMywgMTAsIDMxLCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKFJhc01lc3NhZ2UsIHJlZ2lzdHJhdGlvblJlcXVlc3QpLCBfUmVnaXN0cmF0aW9uUmVxdWVzdH0sCisJe0ZOQU1FKCJyZWdpc3RyYXRpb25Db25maXJtIikgU0VRLCAzLCA3LCAyNCwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihSYXNNZXNzYWdlLCByZWdpc3RyYXRpb25Db25maXJtKSwgX1JlZ2lzdHJhdGlvbkNvbmZpcm19LAorCXtGTkFNRSgicmVnaXN0cmF0aW9uUmVqZWN0IikgU0VRLCAyLCA1LCAxMSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJ1bnJlZ2lzdHJhdGlvblJlcXVlc3QiKSBTRVEsIDMsIDUsIDE1LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKFJhc01lc3NhZ2UsIHVucmVnaXN0cmF0aW9uUmVxdWVzdCksIF9VbnJlZ2lzdHJhdGlvblJlcXVlc3R9LAorCXtGTkFNRSgidW5yZWdpc3RyYXRpb25Db25maXJtIikgU0VRLCAxLCAyLCA2LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoInVucmVnaXN0cmF0aW9uUmVqZWN0IikgU0VRLCAxLCAzLCA4LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImFkbWlzc2lvblJlcXVlc3QiKSBTRVEsIDcsIDE2LCAzNCwgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihSYXNNZXNzYWdlLCBhZG1pc3Npb25SZXF1ZXN0KSwgX0FkbWlzc2lvblJlcXVlc3R9LAorCXtGTkFNRSgiYWRtaXNzaW9uQ29uZmlybSIpIFNFUSwgMiwgNiwgMjcsIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoUmFzTWVzc2FnZSwgYWRtaXNzaW9uQ29uZmlybSksIF9BZG1pc3Npb25Db25maXJtfSwKKwl7Rk5BTUUoImFkbWlzc2lvblJlamVjdCIpIFNFUSwgMSwgMywgMTEsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiYmFuZHdpZHRoUmVxdWVzdCIpIFNFUSwgMiwgNywgMTgsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiYmFuZHdpZHRoQ29uZmlybSIpIFNFUSwgMSwgMywgOCwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJiYW5kd2lkdGhSZWplY3QiKSBTRVEsIDEsIDQsIDksIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGlzZW5nYWdlUmVxdWVzdCIpIFNFUSwgMSwgNiwgMTksIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiZGlzZW5nYWdlQ29uZmlybSIpIFNFUSwgMSwgMiwgOSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJkaXNlbmdhZ2VSZWplY3QiKSBTRVEsIDEsIDMsIDgsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgibG9jYXRpb25SZXF1ZXN0IikgU0VRLCAyLCA1LCAxNywgREVDT0RFIHwgRVhULAorCSBvZmZzZXRvZihSYXNNZXNzYWdlLCBsb2NhdGlvblJlcXVlc3QpLCBfTG9jYXRpb25SZXF1ZXN0fSwKKwl7Rk5BTUUoImxvY2F0aW9uQ29uZmlybSIpIFNFUSwgMSwgNCwgMTksIERFQ09ERSB8IEVYVCwKKwkgb2Zmc2V0b2YoUmFzTWVzc2FnZSwgbG9jYXRpb25Db25maXJtKSwgX0xvY2F0aW9uQ29uZmlybX0sCisJe0ZOQU1FKCJsb2NhdGlvblJlamVjdCIpIFNFUSwgMSwgMywgMTAsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgiaW5mb1JlcXVlc3QiKSBTRVEsIDIsIDQsIDE1LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKKwl7Rk5BTUUoImluZm9SZXF1ZXN0UmVzcG9uc2UiKSBTRVEsIDMsIDgsIDE2LCBERUNPREUgfCBFWFQsCisJIG9mZnNldG9mKFJhc01lc3NhZ2UsIGluZm9SZXF1ZXN0UmVzcG9uc2UpLCBfSW5mb1JlcXVlc3RSZXNwb25zZX0sCisJe0ZOQU1FKCJub25TdGFuZGFyZE1lc3NhZ2UiKSBTRVEsIDAsIDIsIDcsIFNUT1AgfCBFWFQsIDAsIE5VTEx9LAorCXtGTkFNRSgidW5rbm93bk1lc3NhZ2VSZXNwb25zZSIpIFNFUSwgMCwgMSwgNSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZXF1ZXN0SW5Qcm9ncmVzcyIpIFNFUSwgNCwgNiwgNiwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJyZXNvdXJjZXNBdmFpbGFibGVJbmRpY2F0ZSIpIFNFUSwgNCwgOSwgMTEsIFNUT1AgfCBFWFQsIDAsCisJIE5VTEx9LAorCXtGTkFNRSgicmVzb3VyY2VzQXZhaWxhYmxlQ29uZmlybSIpIFNFUSwgNCwgNiwgNywgU1RPUCB8IEVYVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJpbmZvUmVxdWVzdEFjayIpIFNFUSwgNCwgNSwgNSwgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJpbmZvUmVxdWVzdE5hayIpIFNFUSwgNSwgNywgNywgU1RPUCB8IEVYVCwgMCwgTlVMTH0sCisJe0ZOQU1FKCJzZXJ2aWNlQ29udHJvbEluZGljYXRpb24iKSBTRVEsIDgsIDEwLCAxMCwgU1RPUCB8IEVYVCwgMCwKKwkgTlVMTH0sCisJe0ZOQU1FKCJzZXJ2aWNlQ29udHJvbFJlc3BvbnNlIikgU0VRLCA3LCA4LCA4LCBTVE9QIHwgRVhULCAwLCBOVUxMfSwKK307CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDNiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogSGVscGVyIGhhbmRsaW5nIGZvciBuZXRmaWx0ZXIuICovCisKKy8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKKyAqIChDKSAyMDAyLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqIChDKSAyMDAzLDIwMDQgVVNBR0kvV0lERSBQcm9qZWN0IDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CisKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IExJU1RfSEVBRChoZWxwZXJzKTsKKworc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgorX19uZl9jdF9oZWxwZXJfZmluZChjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmhlbHBlcnMsIGxpc3QpIHsKKwkJaWYgKG5mX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaC0+dHVwbGUsICZoLT5tYXNrKSkKKwkJCXJldHVybiBoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKgorbmZfY3RfaGVscGVyX2ZpbmRfZ2V0KCBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOworCisJLyogbmVlZCBuZl9jb25udHJhY2tfbG9jayB0byBhc3N1cmUgdGhhdCBoZWxwZXIgZXhpc3RzIHVudGlsCisJICogdHJ5X21vZHVsZV9nZXQoKSBpcyBjYWxsZWQgKi8KKwlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCWhlbHBlciA9IF9fbmZfY3RfaGVscGVyX2ZpbmQodHVwbGUpOworCWlmIChoZWxwZXIpIHsKKwkJLyogbmVlZCB0byBpbmNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnQgdG8gYXNzdXJlIGhlbHBlciB3aWxsCisJCSAqIG5vdCBnbyBhd2F5IHdoaWxlIHRoZSBjYWxsZXIgaXMgZS5nLiBidXN5IHB1dHRpbmcgYQorCQkgKiBjb25udHJhY2sgaW4gdGhlIGhhc2ggdGhhdCB1c2VzIHRoZSBoZWxwZXIgKi8KKwkJaWYgKCF0cnlfbW9kdWxlX2dldChoZWxwZXItPm1lKSkKKwkJCWhlbHBlciA9IE5VTEw7CisJfQorCisJcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCXJldHVybiBoZWxwZXI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9oZWxwZXJfZmluZF9nZXQpOworCit2b2lkIG5mX2N0X2hlbHBlcl9wdXQoc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcikKK3sKKwltb2R1bGVfcHV0KGhlbHBlci0+bWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfaGVscGVyX3B1dCk7CisKK3N0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKK19fbmZfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICpoOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmaGVscGVycywgbGlzdCkgeworCQlpZiAoIXN0cmNtcChoLT5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiBoOworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKTsKKworc3RhdGljIGlubGluZSBpbnQgdW5oZWxwKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaSwKKwkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqbWUpCit7CisJc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhpKTsKKwlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGN0KTsKKworCWlmIChoZWxwICYmIGhlbHAtPmhlbHBlciA9PSBtZSkgeworCQluZl9jb25udHJhY2tfZXZlbnQoSVBDVF9IRUxQRVIsIGN0KTsKKwkJaGVscC0+aGVscGVyID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICptZSkKK3sKKwlpbnQgc2l6ZSwgcmV0OworCisJQlVHX09OKG1lLT50aW1lb3V0ID09IDApOworCisJc2l6ZSA9IEFMSUdOKHNpemVvZihzdHJ1Y3QgbmZfY29ubiksIF9fYWxpZ25vZl9fKHN0cnVjdCBuZl9jb25uX2hlbHApKSArCisJICAgICAgIHNpemVvZihzdHJ1Y3QgbmZfY29ubl9oZWxwKTsKKwlyZXQgPSBuZl9jb25udHJhY2tfcmVnaXN0ZXJfY2FjaGUoTkZfQ1RfRl9IRUxQLCAibmZfY29ubnRyYWNrOmhlbHAiLAorCQkJCQkgIHNpemUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcjogVW5hYmxlIHRvIGNyZWF0ZSBzbGFiIGNhY2hlIGZvciBjb25udHJhY2tzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWxpc3RfYWRkKCZtZS0+bGlzdCwgJmhlbHBlcnMpOworCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKTsKKwordm9pZCBuZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKm1lKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLCAqdG1wOworCisJLyogTmVlZCB3cml0ZSBsb2NrIGhlcmUsIHRvIGRlbGV0ZSBoZWxwZXIuICovCisJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWxpc3RfZGVsKCZtZS0+bGlzdCk7CisKKwkvKiBHZXQgcmlkIG9mIGV4cGVjdGF0aW9ucyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIHRtcCwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGV4cC0+bWFzdGVyKTsKKwkJaWYgKChoZWxwLT5oZWxwZXIgPT0gbWUgfHwgZXhwLT5oZWxwZXIgPT0gbWUpICYmCisJCSAgICBkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKKwkJCW5mX2N0X3VubGlua19leHBlY3QoZXhwKTsKKwkJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisJCX0KKwl9CisKKwkvKiBHZXQgcmlkIG9mIGV4cGVjdGVkcywgc2V0IGhlbHBlcnMgdG8gTlVMTC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZ1bmNvbmZpcm1lZCwgbGlzdCkKKwkJdW5oZWxwKGgsIG1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmbmZfY29ubnRyYWNrX2hhc2hbaV0sIGxpc3QpCisJCQl1bmhlbHAoaCwgbWUpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCS8qIFNvbWVvbmUgY291bGQgYmUgc3RpbGwgbG9va2luZyBhdCB0aGUgaGVscGVyIGluIGEgYmguICovCisJc3luY2hyb25pemVfbmV0KCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19pcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDAxZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmMKQEAgLTAsMCArMSwyODEgQEAKKy8qIElSQyBleHRlbnNpb24gZm9yIElQIGNvbm5lY3Rpb24gdHJhY2tpbmcsIFZlcnNpb24gMS4yMQorICogKEMpIDIwMDAtMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogYmFzZWQgb24gUlIncyBpcF9jb25udHJhY2tfZnRwLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaXJjLmg+CisKKyNkZWZpbmUgTUFYX1BPUlRTIDgKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tNQVhfUE9SVFNdOworc3RhdGljIGludCBwb3J0c19jOworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGNjX2NoYW5uZWxzID0gODsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGNjX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDMwMDsKKy8qIFRoaXMgaXMgc2xvdywgYnV0IGl0J3Mgc2ltcGxlLiAtLVJSICovCitzdGF0aWMgY2hhciAqaXJjX2J1ZmZlcjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXJjX2J1ZmZlcl9sb2NrKTsKKwordW5zaWduZWQgaW50ICgqbmZfbmF0X2lyY19ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJdW5zaWduZWQgaW50IG1hdGNob2ZmLAorCQkJCXVuc2lnbmVkIGludCBtYXRjaGxlbiwKKwkJCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X2lyY19ob29rKTsKKworTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklSQyAoRENDKSBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcF9jb25udHJhY2tfaXJjIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgdXNob3J0LCAmcG9ydHNfYywgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvcnRzLCAicG9ydCBudW1iZXJzIG9mIElSQyBzZXJ2ZXJzIik7Cittb2R1bGVfcGFyYW0obWF4X2RjY19jaGFubmVscywgdWludCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9kY2NfY2hhbm5lbHMsICJtYXggbnVtYmVyIG9mIGV4cGVjdGVkIERDQyBjaGFubmVscyBwZXIgIgorCQkJCSAgICJJUkMgc2Vzc2lvbiIpOworbW9kdWxlX3BhcmFtKGRjY190aW1lb3V0LCB1aW50LCAwNDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGNjX3RpbWVvdXQsICJ0aW1lb3V0IG9uIGZvciB1bmVzdGFibGlzaGVkIERDQyBjaGFubmVscyIpOworCitzdGF0aWMgY29uc3QgY2hhciAqZGNjcHJvdG9zW10gPSB7CisJIlNFTkQgIiwgIkNIQVQgIiwgIk1PVkUgIiwgIlRTRU5EICIsICJTQ0hBVCAiCit9OworCisjZGVmaW5lIE1JTk1BVENITEVOCTUKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiIgZm9ybWF0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19GVU5DVElPTl9fICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworLyogdHJpZXMgdG8gZ2V0IHRoZSBpcF9hZGRyIGFuZCBwb3J0IG91dCBvZiBhIGRjYyBjb21tYW5kCisgKiByZXR1cm4gdmFsdWU6IC0xIG9uIGZhaWx1cmUsIDAgb24gc3VjY2VzcworICoJZGF0YQkJcG9pbnRlciB0byBmaXJzdCBieXRlIG9mIERDQyBjb21tYW5kIGRhdGEKKyAqCWRhdGFfZW5kCXBvaW50ZXIgdG8gbGFzdCBieXRlIG9mIGRjYyBjb21tYW5kIGRhdGEKKyAqCWlwCQlyZXR1cm5zIHBhcnNlZCBpcCBvZiBkY2MgY29tbWFuZAorICoJcG9ydAkJcmV0dXJucyBwYXJzZWQgcG9ydCBvZiBkY2MgY29tbWFuZAorICoJYWRfYmVnX3AJcmV0dXJucyBwb2ludGVyIHRvIGZpcnN0IGJ5dGUgb2YgYWRkciBkYXRhCisgKglhZF9lbmRfcAlyZXR1cm5zIHBvaW50ZXIgdG8gbGFzdCBieXRlIG9mIGFkZHIgZGF0YQorICovCitzdGF0aWMgaW50IHBhcnNlX2RjYyhjaGFyICpkYXRhLCBjaGFyICpkYXRhX2VuZCwgdV9pbnQzMl90ICppcCwKKwkJICAgICB1X2ludDE2X3QgKnBvcnQsIGNoYXIgKiphZF9iZWdfcCwgY2hhciAqKmFkX2VuZF9wKQoreworCS8qIGF0IGxlYXN0IDEyOiAiQUFBQUFBQUEgUFwxXG4iICovCisJd2hpbGUgKCpkYXRhKysgIT0gJyAnKQorCQlpZiAoZGF0YSA+IGRhdGFfZW5kIC0gMTIpCisJCQlyZXR1cm4gLTE7CisKKwkqYWRfYmVnX3AgPSBkYXRhOworCSppcCA9IHNpbXBsZV9zdHJ0b3VsKGRhdGEsICZkYXRhLCAxMCk7CisKKwkvKiBza2lwIGJsYW5rcyBiZXR3ZWVuIGlwIGFuZCBwb3J0ICovCisJd2hpbGUgKCpkYXRhID09ICcgJykgeworCQlpZiAoZGF0YSA+PSBkYXRhX2VuZCkKKwkJCXJldHVybiAtMTsKKwkJZGF0YSsrOworCX0KKworCSpwb3J0ID0gc2ltcGxlX3N0cnRvdWwoZGF0YSwgJmRhdGEsIDEwKTsKKwkqYWRfZW5kX3AgPSBkYXRhOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQlzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXVuc2lnbmVkIGludCBkYXRhb2ZmOworCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKKwljaGFyICpkYXRhLCAqZGF0YV9saW1pdCwgKmliX3B0cjsKKwlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOworCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CisJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGU7CisJdV9pbnQzMl90IGRjY19pcDsKKwl1X2ludDE2X3QgZGNjX3BvcnQ7CisJX19iZTE2IHBvcnQ7CisJaW50IGksIHJldCA9IE5GX0FDQ0VQVDsKKwljaGFyICphZGRyX2JlZ19wLCAqYWRkcl9lbmRfcDsKKwl0eXBlb2YobmZfbmF0X2lyY19ob29rKSBuZl9uYXRfaXJjOworCisJLyogSWYgcGFja2V0IGlzIGNvbWluZyBmcm9tIElSQyBzZXJ2ZXIgKi8KKwlpZiAoZGlyID09IElQX0NUX0RJUl9SRVBMWSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLworCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKKwkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBOb3QgYSBmdWxsIHRjcCBoZWFkZXI/ICovCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIHByb3RvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwkvKiBObyBkYXRhPyAqLworCWRhdGFvZmYgPSBwcm90b2ZmICsgdGgtPmRvZmYqNDsKKwlpZiAoZGF0YW9mZiA+PSAoKnBza2IpLT5sZW4pCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwlzcGluX2xvY2tfYmgoJmlyY19idWZmZXJfbG9jayk7CisJaWJfcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBkYXRhb2ZmLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLAorCQkJCSAgICBpcmNfYnVmZmVyKTsKKwlCVUdfT04oaWJfcHRyID09IE5VTEwpOworCisJZGF0YSA9IGliX3B0cjsKKwlkYXRhX2xpbWl0ID0gaWJfcHRyICsgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKKworCS8qIHN0cmxlbigiXDFEQ0MgU0VOVCB0IEFBQUFBQUFBIFBcMVxuIik9MjQKKwkgKiA1K01JTk1BVENITEVOK3N0cmxlbigidCBBQUFBQUFBQSBQXDFcbiIpPTE0ICovCisJd2hpbGUgKGRhdGEgPCBkYXRhX2xpbWl0IC0gKDE5ICsgTUlOTUFUQ0hMRU4pKSB7CisJCWlmIChtZW1jbXAoZGF0YSwgIlwxRENDICIsIDUpKSB7CisJCQlkYXRhKys7CisJCQljb250aW51ZTsKKwkJfQorCQlkYXRhICs9IDU7CisJCS8qIHdlIGhhdmUgYXQgbGVhc3QgKDE5K01JTk1BVENITEVOKS01IGJ5dGVzIHZhbGlkIGRhdGEgbGVmdCAqLworCisJCURFQlVHUCgiRENDIGZvdW5kIGluIG1hc3RlciAldS4ldS4ldS4ldToldSAldS4ldS4ldS4ldToldS4uLlxuIiwKKwkJCU5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKHRoLT5zb3VyY2UpLAorCQkJTklQUVVBRChpcGgtPmRhZGRyKSwgbnRvaHModGgtPmRlc3QpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkY2Nwcm90b3MpOyBpKyspIHsKKwkJCWlmIChtZW1jbXAoZGF0YSwgZGNjcHJvdG9zW2ldLCBzdHJsZW4oZGNjcHJvdG9zW2ldKSkpIHsKKwkJCQkvKiBubyBtYXRjaCAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGF0YSArPSBzdHJsZW4oZGNjcHJvdG9zW2ldKTsKKwkJCURFQlVHUCgiRENDICVzIGRldGVjdGVkXG4iLCBkY2Nwcm90b3NbaV0pOworCisJCQkvKiB3ZSBoYXZlIGF0IGxlYXN0CisJCQkgKiAoMTkrTUlOTUFUQ0hMRU4pLTUtZGNjcHJvdG9zW2ldLm1hdGNobGVuIGJ5dGVzIHZhbGlkCisJCQkgKiBkYXRhIGxlZnQgKD09IDE0LzEzIGJ5dGVzKSAqLworCQkJaWYgKHBhcnNlX2RjYygoY2hhciAqKWRhdGEsIGRhdGFfbGltaXQsICZkY2NfaXAsCisJCQkJICAgICAgICZkY2NfcG9ydCwgJmFkZHJfYmVnX3AsICZhZGRyX2VuZF9wKSkgeworCQkJCURFQlVHUCgidW5hYmxlIHRvIHBhcnNlIGRjYyBjb21tYW5kXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCURFQlVHUCgiRENDIGJvdW5kIGlwL3BvcnQ6ICV1LiV1LiV1LiV1OiV1XG4iLAorCQkJCUhJUFFVQUQoZGNjX2lwKSwgZGNjX3BvcnQpOworCisJCQkvKiBkY2NfaXAgY2FuIGJlIHRoZSBpbnRlcm5hbCBPUiBleHRlcm5hbCAoTkFUJ2VkKSBJUCAqLworCQkJdHVwbGUgPSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlOworCQkJaWYgKHR1cGxlLT5zcmMudTMuaXAgIT0gaHRvbmwoZGNjX2lwKSAmJgorCQkJICAgIHR1cGxlLT5kc3QudTMuaXAgIT0gaHRvbmwoZGNjX2lwKSkgeworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJCSJGb3JnZWQgRENDIGNvbW1hbmQgZnJvbSAiCisJCQkJCQkiJXUuJXUuJXUuJXU6ICV1LiV1LiV1LiV1OiV1XG4iLAorCQkJCQkJTklQUVVBRCh0dXBsZS0+c3JjLnUzLmlwKSwKKwkJCQkJCUhJUFFVQUQoZGNjX2lwKSwgZGNjX3BvcnQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKKwkJCWlmIChleHAgPT0gTlVMTCkgeworCQkJCXJldCA9IE5GX0RST1A7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl0dXBsZSA9ICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlOworCQkJcG9ydCA9IGh0b25zKGRjY19wb3J0KTsKKwkJCW5mX2Nvbm50cmFja19leHBlY3RfaW5pdChleHAsIHR1cGxlLT5zcmMubDNudW0sCisJCQkJCQkgTlVMTCwgJnR1cGxlLT5kc3QudTMsCisJCQkJCQkgSVBQUk9UT19UQ1AsIE5VTEwsICZwb3J0KTsKKworCQkJbmZfbmF0X2lyYyA9IHJjdV9kZXJlZmVyZW5jZShuZl9uYXRfaXJjX2hvb2spOworCQkJaWYgKG5mX25hdF9pcmMgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKKwkJCQlyZXQgPSBuZl9uYXRfaXJjKHBza2IsIGN0aW5mbywKKwkJCQkJCSBhZGRyX2JlZ19wIC0gaWJfcHRyLAorCQkJCQkJIGFkZHJfZW5kX3AgLSBhZGRyX2JlZ19wLAorCQkJCQkJIGV4cCk7CisJCQllbHNlIGlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQorCQkJCXJldCA9IE5GX0RST1A7CisJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCQkJZ290byBvdXQ7CisJCX0KKwl9Cisgb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZpcmNfYnVmZmVyX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBpcmNbTUFYX1BPUlRTXSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGNoYXIgaXJjX25hbWVzW01BWF9QT1JUU11bc2l6ZW9mKCJpcmMtNjU1MzUiKV0gX19yZWFkX21vc3RseTsKKworc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX2lyY19maW5pKHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfaXJjX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCWNoYXIgKnRtcG5hbWU7CisKKwlpZiAobWF4X2RjY19jaGFubmVscyA8IDEpIHsKKwkJcHJpbnRrKCJuZl9jdF9pcmM6IG1heF9kY2NfY2hhbm5lbHMgbXVzdCBub3QgYmUgemVyb1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlyY19idWZmZXIgPSBrbWFsbG9jKDY1NTM2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlyY19idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSWYgbm8gcG9ydCBnaXZlbiwgZGVmYXVsdCB0byBzdGFuZGFyZCBpcmMgcG9ydCAqLworCWlmIChwb3J0c19jID09IDApCisJCXBvcnRzW3BvcnRzX2MrK10gPSBJUkNfUE9SVDsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKKwkJaXJjW2ldLnR1cGxlLnNyYy5sM251bSA9IEFGX0lORVQ7CisJCWlyY1tpXS50dXBsZS5zcmMudS50Y3AucG9ydCA9IGh0b25zKHBvcnRzW2ldKTsKKwkJaXJjW2ldLnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOworCQlpcmNbaV0ubWFzay5zcmMubDNudW0gPSAweEZGRkY7CisJCWlyY1tpXS5tYXNrLnNyYy51LnRjcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKKwkJaXJjW2ldLm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKKwkJaXJjW2ldLm1heF9leHBlY3RlZCA9IG1heF9kY2NfY2hhbm5lbHM7CisJCWlyY1tpXS50aW1lb3V0ID0gZGNjX3RpbWVvdXQ7CisJCWlyY1tpXS5tZSA9IFRISVNfTU9EVUxFOworCQlpcmNbaV0uaGVscCA9IGhlbHA7CisKKwkJdG1wbmFtZSA9ICZpcmNfbmFtZXNbaV1bMF07CisJCWlmIChwb3J0c1tpXSA9PSBJUkNfUE9SVCkKKwkJCXNwcmludGYodG1wbmFtZSwgImlyYyIpOworCQllbHNlCisJCQlzcHJpbnRmKHRtcG5hbWUsICJpcmMtJXUiLCBpKTsKKwkJaXJjW2ldLm5hbWUgPSB0bXBuYW1lOworCisJCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmlyY1tpXSk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50aygibmZfY3RfaXJjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaGVscGVyICIKKwkJCSAgICAgICAiZm9yIHBmOiAldSBwb3J0OiAldVxuIiwKKwkJCSAgICAgICBpcmNbaV0udHVwbGUuc3JjLmwzbnVtLCBwb3J0c1tpXSk7CisJCQluZl9jb25udHJhY2tfaXJjX2ZpbmkoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBfTk9UXyBkZWZpbmVkIGFzIF9fZXhpdCwgYmVjYXVzZQorICogaXQgaXMgbmVlZGVkIGJ5IHRoZSBpbml0IGZ1bmN0aW9uICovCitzdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfaXJjX2Zpbmkodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspCisJCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmaXJjW2ldKTsKKwlrZnJlZShpcmNfYnVmZmVyKTsKK30KKworbW9kdWxlX2luaXQobmZfY29ubnRyYWNrX2lyY19pbml0KTsKK21vZHVsZV9leGl0KG5mX2Nvbm50cmFja19pcmNfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYy5jCmluZGV4IDIxZTBiYzkuLmEzZDMxYzMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYy5jCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaD4KQEAgLTM3LDggKzM3LDYgQEAKICNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKICNlbmRpZgogCi1ERUNMQVJFX1BFUl9DUFUoc3RydWN0IG5mX2Nvbm50cmFja19zdGF0LCBuZl9jb25udHJhY2tfc3RhdCk7Ci0KIHN0YXRpYyBpbnQgZ2VuZXJpY19wa3RfdG9fdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ob2ZmLAogCQkJCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQogewpAQCAtODQsNyArODIsNyBAQAogCXJldHVybiBORl9DVF9GX0JBU0lDOwogfQogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gbmZfY29ubnRyYWNrX2dlbmVyaWNfbDNwcm90byA9IHsKK3N0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byBuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljID0gewogCS5sM3Byb3RvCSA9IFBGX1VOU1BFQywKIAkubmFtZQkJID0gInVua25vd24iLAogCS5wa3RfdG9fdHVwbGUJID0gZ2VuZXJpY19wa3RfdG9fdHVwbGUsCkBAIC05NCwzICs5Miw0IEBACiAJLnByZXBhcmUJID0gZ2VuZXJpY19wcmVwYXJlLAogCS5nZXRfZmVhdHVyZXMJID0gZ2VuZXJpY19nZXRfZmVhdHVyZXMsCiB9OworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYyk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRiaW9zX25zLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRiaW9zX25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViMjM0ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGJpb3NfbnMuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqICAgICAgTmV0QklPUyBuYW1lIHNlcnZpY2UgYnJvYWRjYXN0IGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyCisgKgorICogICAgICAoYykgMjAwNSBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKy8qCisgKiAgICAgIFRoaXMgaGVscGVyIHRyYWNrcyBsb2NhbGx5IG9yaWdpbmF0aW5nIE5ldEJJT1MgbmFtZSBzZXJ2aWNlCisgKiAgICAgIHJlcXVlc3RzIGJ5IGlzc3VpbmcgcGVybWFuZW50IGV4cGVjdGF0aW9ucyAodmFsaWQgdW50aWwKKyAqICAgICAgdGltaW5nIG91dCkgbWF0Y2hpbmcgYWxsIHJlcGx5IGNvbm5lY3Rpb25zIGZyb20gdGhlCisgKiAgICAgIGRlc3RpbmF0aW9uIG5ldHdvcmsuIFRoZSBvbmx5IE5ldEJJT1Mgc3BlY2lmaWMgdGhpbmcgaXMKKyAqICAgICAgYWN0dWFsbHkgdGhlIHBvcnQgbnVtYmVyLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hZGRyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKworI2RlZmluZSBOTUJEX1BPUlQJMTM3CisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRCSU9TIG5hbWUgc2VydmljZSBicm9hZGNhc3QgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrX25ldGJpb3NfbnMiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCB0aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIHVpbnQsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAidGltZW91dCBmb3IgbWFzdGVyIGNvbm5lY3Rpb24vcmVwbGllcyBpbiBzZWNvbmRzIik7CisKK3N0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopKCpwc2tiKS0+ZHN0OworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwlfX2JlMzIgbWFzayA9IDA7CisKKwkvKiB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gbG9jYWxseSBnZW5lcmF0ZWQgcGFja2V0cyAqLworCWlmICgoKnBza2IpLT5zayA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAocnQgPT0gTlVMTCB8fCAhKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfQlJPQURDQVNUKSkKKwkJZ290byBvdXQ7CisJaWYgKENUSU5GTzJESVIoY3RpbmZvKSAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCisJCWdvdG8gb3V0OworCisJcmN1X3JlYWRfbG9jaygpOworCWluX2RldiA9IF9faW5fZGV2X2dldF9yY3UocnQtPnUuZHN0LmRldik7CisJaWYgKGluX2RldiAhPSBOVUxMKSB7CisJCWZvcl9wcmltYXJ5X2lmYShpbl9kZXYpIHsKKwkJCWlmIChpZmEtPmlmYV9icm9hZGNhc3QgPT0gaXBoLT5kYWRkcikgeworCQkJCW1hc2sgPSBpZmEtPmlmYV9tYXNrOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVuZGZvcl9pZmEoaW5fZGV2KTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAobWFzayA9PSAwKQorCQlnb3RvIG91dDsKKworCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOworCWlmIChleHAgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlleHAtPnR1cGxlICAgICAgICAgICAgICAgID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlOworCWV4cC0+dHVwbGUuc3JjLnUudWRwLnBvcnQgPSBodG9ucyhOTUJEX1BPUlQpOworCisJZXhwLT5tYXNrLnNyYy51My5pcCAgICAgICA9IG1hc2s7CisJZXhwLT5tYXNrLnNyYy51LnVkcC5wb3J0ICA9IGh0b25zKDB4RkZGRik7CisJZXhwLT5tYXNrLmRzdC51My5pcCAgICAgICA9IGh0b25sKDB4RkZGRkZGRkYpOworCWV4cC0+bWFzay5kc3QudS51ZHAucG9ydCAgPSBodG9ucygweEZGRkYpOworCWV4cC0+bWFzay5kc3QucHJvdG9udW0gICAgPSAweEZGOworCisJZXhwLT5leHBlY3RmbiAgICAgICAgICAgICA9IE5VTEw7CisJZXhwLT5mbGFncyAgICAgICAgICAgICAgICA9IE5GX0NUX0VYUEVDVF9QRVJNQU5FTlQ7CisKKwluZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCisJbmZfY3RfcmVmcmVzaChjdCwgKnBza2IsIHRpbWVvdXQgKiBIWik7CitvdXQ6CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyIGhlbHBlciBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQkJPSAibmV0Ymlvcy1ucyIsCisJLnR1cGxlLnNyYy5sM251bQk9IEFGX0lORVQsCisJLnR1cGxlLnNyYy51LnVkcC5wb3J0CT0gX19jb25zdGFudF9odG9ucyhOTUJEX1BPUlQpLAorCS50dXBsZS5kc3QucHJvdG9udW0JPSBJUFBST1RPX1VEUCwKKwkubWFzay5zcmMubDNudW0JCT0gMHhGRkZGLAorCS5tYXNrLnNyYy51LnVkcC5wb3J0CT0gX19jb25zdGFudF9odG9ucygweEZGRkYpLAorCS5tYXNrLmRzdC5wcm90b251bQk9IDB4RkYsCisJLm1heF9leHBlY3RlZAkJPSAxLAorCS5tZQkJCT0gVEhJU19NT0RVTEUsCisJLmhlbHAJCQk9IGhlbHAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfbmV0Ymlvc19uc19pbml0KHZvaWQpCit7CisJaGVscGVyLnRpbWVvdXQgPSB0aW1lb3V0OworCXJldHVybiBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZoZWxwZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZfY29ubnRyYWNrX25ldGJpb3NfbnNfZmluaSh2b2lkKQoreworCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmaGVscGVyKTsKK30KKworbW9kdWxlX2luaXQobmZfY29ubnRyYWNrX25ldGJpb3NfbnNfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9jb25udHJhY2tfbmV0Ymlvc19uc19maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwppbmRleCAxNzIxZjdjLi5iZDFkMmRlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCkBAIC0zNSwxMCArMzUsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaD4KKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KQEAgLTQ3LDI1ICs1MiwxOCBAQAogCiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIHZlcnNpb25bXSA9ICIwLjkzIjsKIAotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0KIHN0YXRpYyBpbmxpbmUgaW50CiBjdG5ldGxpbmtfZHVtcF90dXBsZXNfcHJvdG8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgCiAJCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pCisJCQkgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBuZmF0dHIgKm5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9UVVBMRV9QUk9UTyk7CiAKIAlORkFfUFVUKHNrYiwgQ1RBX1BST1RPX05VTSwgc2l6ZW9mKHVfaW50OF90KSwgJnR1cGxlLT5kc3QucHJvdG9udW0pOwogCi0JaWYgKGxpa2VseShwcm90by0+dHVwbGVfdG9fbmZhdHRyKSkKLQkJcmV0ID0gcHJvdG8tPnR1cGxlX3RvX25mYXR0cihza2IsIHR1cGxlKTsKKwlpZiAobGlrZWx5KGw0cHJvdG8tPnR1cGxlX3RvX25mYXR0cikpCisJCXJldCA9IGw0cHJvdG8tPnR1cGxlX3RvX25mYXR0cihza2IsIHR1cGxlKTsKIAkKIAlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKIApAQCAtMTAwLDcgKzk4LDcgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bzsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAKIAlsM3Byb3RvID0gbmZfY3RfbDNwcm90b19maW5kX2dldCh0dXBsZS0+c3JjLmwzbnVtKTsKIAlyZXQgPSBjdG5ldGxpbmtfZHVtcF90dXBsZXNfaXAoc2tiLCB0dXBsZSwgbDNwcm90byk7CkBAIC0xMDksOSArMTA3LDkgQEAKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpCiAJCXJldHVybiByZXQ7CiAKLQlwcm90byA9IG5mX2N0X3Byb3RvX2ZpbmRfZ2V0KHR1cGxlLT5zcmMubDNudW0sIHR1cGxlLT5kc3QucHJvdG9udW0pOwotCXJldCA9IGN0bmV0bGlua19kdW1wX3R1cGxlc19wcm90byhza2IsIHR1cGxlLCBwcm90byk7Ci0JbmZfY3RfcHJvdG9fcHV0KHByb3RvKTsKKwlsNHByb3RvID0gbmZfY3RfbDRwcm90b19maW5kX2dldCh0dXBsZS0+c3JjLmwzbnVtLCB0dXBsZS0+ZHN0LnByb3RvbnVtKTsKKwlyZXQgPSBjdG5ldGxpbmtfZHVtcF90dXBsZXNfcHJvdG8oc2tiLCB0dXBsZSwgbDRwcm90byk7CisJbmZfY3RfbDRwcm90b19wdXQobDRwcm90byk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTE5LDcgKzExNyw3IEBACiBzdGF0aWMgaW5saW5lIGludAogY3RuZXRsaW5rX2R1bXBfc3RhdHVzKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKLQl1X2ludDMyX3Qgc3RhdHVzID0gaHRvbmwoKHVfaW50MzJfdCkgY3QtPnN0YXR1cyk7CisJX19iZTMyIHN0YXR1cyA9IGh0b25sKCh1X2ludDMyX3QpIGN0LT5zdGF0dXMpOwogCU5GQV9QVVQoc2tiLCBDVEFfU1RBVFVTLCBzaXplb2Yoc3RhdHVzKSwgJnN0YXR1cyk7CiAJcmV0dXJuIDA7CiAKQEAgLTEzMSw3ICsxMjksNyBAQAogY3RuZXRsaW5rX2R1bXBfdGltZW91dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CiAJbG9uZyB0aW1lb3V0X2wgPSBjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllczsKLQl1X2ludDMyX3QgdGltZW91dDsKKwlfX2JlMzIgdGltZW91dDsKIAogCWlmICh0aW1lb3V0X2wgPCAwKQogCQl0aW1lb3V0ID0gMDsKQEAgLTE0OCwyNiArMTQ2LDI3IEBACiBzdGF0aWMgaW5saW5lIGludAogY3RuZXRsaW5rX2R1bXBfcHJvdG9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90byA9IG5mX2N0X3Byb3RvX2ZpbmRfZ2V0KGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW0sIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0pOworCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90byA9IG5mX2N0X2w0cHJvdG9fZmluZF9nZXQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bSwgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSk7CiAJc3RydWN0IG5mYXR0ciAqbmVzdF9wcm90bzsKIAlpbnQgcmV0OwogCi0JaWYgKCFwcm90by0+dG9fbmZhdHRyKSB7Ci0JCW5mX2N0X3Byb3RvX3B1dChwcm90byk7CisJaWYgKCFsNHByb3RvLT50b19uZmF0dHIpIHsKKwkJbmZfY3RfbDRwcm90b19wdXQobDRwcm90byk7CiAJCXJldHVybiAwOwogCX0KIAkKIAluZXN0X3Byb3RvID0gTkZBX05FU1Qoc2tiLCBDVEFfUFJPVE9JTkZPKTsKIAotCXJldCA9IHByb3RvLT50b19uZmF0dHIoc2tiLCBuZXN0X3Byb3RvLCBjdCk7CisJcmV0ID0gbDRwcm90by0+dG9fbmZhdHRyKHNrYiwgbmVzdF9wcm90bywgY3QpOwogCi0JbmZfY3RfcHJvdG9fcHV0KHByb3RvKTsKKwluZl9jdF9sNHByb3RvX3B1dChsNHByb3RvKTsKIAogCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcHJvdG8pOwogCiAJcmV0dXJuIHJldDsKIAogbmZhdHRyX2ZhaWx1cmU6CisJbmZfY3RfbDRwcm90b19wdXQobDRwcm90byk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0yMDEsNyArMjAwLDcgQEAKIHsKIAllbnVtIGN0YXR0cl90eXBlIHR5cGUgPSBkaXIgPyBDVEFfQ09VTlRFUlNfUkVQTFk6IENUQV9DT1VOVEVSU19PUklHOwogCXN0cnVjdCBuZmF0dHIgKm5lc3RfY291bnQgPSBORkFfTkVTVChza2IsIHR5cGUpOwotCXVfaW50MzJfdCB0bXA7CisJX19iZTMyIHRtcDsKIAogCXRtcCA9IGh0b25sKGN0LT5jb3VudGVyc1tkaXJdLnBhY2tldHMpOwogCU5GQV9QVVQoc2tiLCBDVEFfQ09VTlRFUlMzMl9QQUNLRVRTLCBzaXplb2YodV9pbnQzMl90KSwgJnRtcCk7CkBAIC0yMjQsNyArMjIzLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjdG5ldGxpbmtfZHVtcF9tYXJrKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKLQl1X2ludDMyX3QgbWFyayA9IGh0b25sKGN0LT5tYXJrKTsKKwlfX2JlMzIgbWFyayA9IGh0b25sKGN0LT5tYXJrKTsKIAogCU5GQV9QVVQoc2tiLCBDVEFfTUFSSywgc2l6ZW9mKHVfaW50MzJfdCksICZtYXJrKTsKIAlyZXR1cm4gMDsKQEAgLTIzOSw3ICsyMzgsNyBAQAogc3RhdGljIGlubGluZSBpbnQKIGN0bmV0bGlua19kdW1wX2lkKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKLQl1X2ludDMyX3QgaWQgPSBodG9ubChjdC0+aWQpOworCV9fYmUzMiBpZCA9IGh0b25sKGN0LT5pZCk7CiAJTkZBX1BVVChza2IsIENUQV9JRCwgc2l6ZW9mKHVfaW50MzJfdCksICZpZCk7CiAJcmV0dXJuIDA7CiAKQEAgLTI1MCw3ICsyNDksNyBAQAogc3RhdGljIGlubGluZSBpbnQKIGN0bmV0bGlua19kdW1wX3VzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0JdV9pbnQzMl90IHVzZSA9IGh0b25sKGF0b21pY19yZWFkKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKTsKKwlfX2JlMzIgdXNlID0gaHRvbmwoYXRvbWljX3JlYWQoJmN0LT5jdF9nZW5lcmFsLnVzZSkpOwogCQogCU5GQV9QVVQoc2tiLCBDVEFfVVNFLCBzaXplb2YodV9pbnQzMl90KSwgJnVzZSk7CiAJcmV0dXJuIDA7CkBAIC0zMzYsOCArMzM1LDYgQEAKIAl9IGVsc2UgIGlmIChldmVudHMgJiAoSVBDVF9ORVcgfCBJUENUX1JFTEFURUQpKSB7CiAJCXR5cGUgPSBJUENUTkxfTVNHX0NUX05FVzsKIAkJZmxhZ3MgPSBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTDsKLQkJLyogZHVtcCBldmVyeXRoaW5nICovCi0JCWV2ZW50cyA9IH4wVUw7CiAJCWdyb3VwID0gTkZOTEdSUF9DT05OVFJBQ0tfTkVXOwogCX0gZWxzZSAgaWYgKGV2ZW50cyAmIChJUENUX1NUQVRVUyB8IElQQ1RfUFJPVE9JTkZPKSkgewogCQl0eXBlID0gSVBDVE5MX01TR19DVF9ORVc7CkBAIC0zNzIsMjggKzM2OSwzNSBAQAogCWlmIChjdG5ldGxpbmtfZHVtcF90dXBsZXMoc2tiLCB0dXBsZShjdCwgSVBfQ1RfRElSX1JFUExZKSkgPCAwKQogCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwogCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcGFybXMpOwotCQotCS8qIE5BVCBzdHVmZiBpcyBub3cgYSBzdGF0dXMgZmxhZyAqLwotCWlmICgoZXZlbnRzICYgSVBDVF9TVEFUVVMgfHwgZXZlbnRzICYgSVBDVF9OQVRJTkZPKQotCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9zdGF0dXMoc2tiLCBjdCkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCWlmIChldmVudHMgJiBJUENUX1JFRlJFU0gKLQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfdGltZW91dChza2IsIGN0KSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JaWYgKGV2ZW50cyAmIElQQ1RfUFJPVE9JTkZPCi0JICAgICYmIGN0bmV0bGlua19kdW1wX3Byb3RvaW5mbyhza2IsIGN0KSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JaWYgKGV2ZW50cyAmIElQQ1RfSEVMUElORk8KLQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfaGVscGluZm8oc2tiLCBjdCkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwogCi0JaWYgKGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9PUklHSU5BTCkgPCAwIHx8Ci0JICAgIGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9SRVBMWSkgPCAwKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOworCWlmIChldmVudHMgJiBJUENUX0RFU1RST1kpIHsKKwkJaWYgKGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9PUklHSU5BTCkgPCAwIHx8CisJCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfUkVQTFkpIDwgMCkKKwkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisJfSBlbHNlIHsKKwkJaWYgKGN0bmV0bGlua19kdW1wX3N0YXR1cyhza2IsIGN0KSA8IDApCisJCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwogCi0JaWYgKGV2ZW50cyAmIElQQ1RfTUFSSwotCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9tYXJrKHNrYiwgY3QpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKKwkJaWYgKGN0bmV0bGlua19kdW1wX3RpbWVvdXQoc2tiLCBjdCkgPCAwKQorCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKKworCQlpZiAoZXZlbnRzICYgSVBDVF9QUk9UT0lORk8KKwkJICAgICYmIGN0bmV0bGlua19kdW1wX3Byb3RvaW5mbyhza2IsIGN0KSA8IDApCisJCSAgICAJZ290byBuZmF0dHJfZmFpbHVyZTsKKworCQlpZiAoKGV2ZW50cyAmIElQQ1RfSEVMUEVSIHx8IG5mY3RfaGVscChjdCkpCisJCSAgICAmJiBjdG5ldGxpbmtfZHVtcF9oZWxwaW5mbyhza2IsIGN0KSA8IDApCisJCSAgICAJZ290byBuZmF0dHJfZmFpbHVyZTsKKworCQlpZiAoKGV2ZW50cyAmIElQQ1RfTUFSSyB8fCBjdC0+bWFyaykKKwkJICAgICYmIGN0bmV0bGlua19kdW1wX21hcmsoc2tiLCBjdCkgPCAwKQorCQkgICAgCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CisKKwkJaWYgKGV2ZW50cyAmIElQQ1RfQ09VTlRFUl9GSUxMSU5HICYmCisJCSAgICAoY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX09SSUdJTkFMKSA8IDAgfHwKKwkJICAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfUkVQTFkpIDwgMCkpCisJCQlnb3RvIG5mYXR0cl9mYWlsdXJlOworCX0KIAogCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKIAluZm5ldGxpbmtfc2VuZChza2IsIDAsIGdyb3VwLCAwKTsKQEAgLTQxMCw3ICs0MTQsNiBAQAogewogCWlmIChjYi0+YXJnc1sxXSkKIAkJbmZfY3RfcHV0KChzdHJ1Y3QgbmZfY29ubiAqKWNiLT5hcmdzWzFdKTsKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQyNSwxNiArNDI4LDEzIEBACiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZyA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CiAJdV9pbnQ4X3QgbDNwcm90byA9IG5mbXNnLT5uZmdlbl9mYW1pbHk7CiAKLQlERUJVR1AoImVudGVyZWQgJXMsIGxhc3QgYnVja2V0PSVsdSBpZD0ldVxuIiwgX19GVU5DVElPTl9fLCAKLQkJCWNiLT5hcmdzWzBdLCAqaWQpOwotCiAJcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJbGFzdCA9IChzdHJ1Y3QgbmZfY29ubiAqKWNiLT5hcmdzWzFdOwogCWZvciAoOyBjYi0+YXJnc1swXSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgY2ItPmFyZ3NbMF0rKykgewogcmVzdGFydDoKIAkJbGlzdF9mb3JfZWFjaF9wcmV2KGksICZuZl9jb25udHJhY2tfaGFzaFtjYi0+YXJnc1swXV0pIHsKIAkJCWggPSAoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICopIGk7Ci0JCQlpZiAoRElSRUNUSU9OKGgpICE9IElQX0NUX0RJUl9PUklHSU5BTCkKKwkJCWlmIChORl9DVF9ESVJFQ1RJT04oaCkgIT0gSVBfQ1RfRElSX09SSUdJTkFMKQogCQkJCWNvbnRpbnVlOwogCQkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCQkJLyogRHVtcCBlbnRyaWVzIG9mIGEgZ2l2ZW4gTDMgcHJvdG9jb2wgbnVtYmVyLgpAQCAtNDcxLDcgKzQ3MSw2IEBACiAJaWYgKGxhc3QpCiAJCW5mX2N0X3B1dChsYXN0KTsKIAotCURFQlVHUCgibGVhdmluZywgbGFzdCBidWNrZXQ9JWx1IGlkPSV1XG4iLCBjYi0+YXJnc1swXSwgKmlkKTsKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKQEAgLTQ4Miw4ICs0ODEsNiBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bzsKIAlpbnQgcmV0ID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9JUF9NQVgsIGF0dHIpOwogCiAJbDNwcm90byA9IG5mX2N0X2wzcHJvdG9fZmluZF9nZXQodHVwbGUtPnNyYy5sM251bSk7CkBAIC00OTMsOCArNDkwLDYgQEAKIAogCW5mX2N0X2wzcHJvdG9fcHV0KGwzcHJvdG8pOwogCi0JREVCVUdQKCJsZWF2aW5nXG4iKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTUwNywxMSArNTAyLDkgQEAKIAkJCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKIHsKIAlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfUFJPVE9fTUFYXTsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAJaW50IHJldCA9IDA7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9fTUFYLCBhdHRyKTsKIAogCWlmIChuZmF0dHJfYmFkX3NpemUodGIsIENUQV9QUk9UT19NQVgsIGN0YV9taW5fcHJvdG8pKQpAQCAtNTIxLDEyICs1MTQsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJdHVwbGUtPmRzdC5wcm90b251bSA9ICoodV9pbnQ4X3QgKilORkFfREFUQSh0YltDVEFfUFJPVE9fTlVNLTFdKTsKIAotCXByb3RvID0gbmZfY3RfcHJvdG9fZmluZF9nZXQodHVwbGUtPnNyYy5sM251bSwgdHVwbGUtPmRzdC5wcm90b251bSk7CisJbDRwcm90byA9IG5mX2N0X2w0cHJvdG9fZmluZF9nZXQodHVwbGUtPnNyYy5sM251bSwgdHVwbGUtPmRzdC5wcm90b251bSk7CiAKLQlpZiAobGlrZWx5KHByb3RvLT5uZmF0dHJfdG9fdHVwbGUpKQotCQlyZXQgPSBwcm90by0+bmZhdHRyX3RvX3R1cGxlKHRiLCB0dXBsZSk7CisJaWYgKGxpa2VseShsNHByb3RvLT5uZmF0dHJfdG9fdHVwbGUpKQorCQlyZXQgPSBsNHByb3RvLT5uZmF0dHJfdG9fdHVwbGUodGIsIHR1cGxlKTsKIAotCW5mX2N0X3Byb3RvX3B1dChwcm90byk7CisJbmZfY3RfbDRwcm90b19wdXQobDRwcm90byk7CiAJCiAJcmV0dXJuIHJldDsKIH0KQEAgLTUzOCw4ICs1MzEsNiBAQAogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9UVVBMRV9NQVhdOwogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAltZW1zZXQodHVwbGUsIDAsIHNpemVvZigqdHVwbGUpKTsKIAogCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9UVVBMRV9NQVgsIGNkYVt0eXBlLTFdKTsKQEAgLTU2NiwzNyArNTU3LDMxIEBACiAJZWxzZQogCQl0dXBsZS0+ZHN0LmRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsKIAotCU5GX0NUX0RVTVBfVFVQTEUodHVwbGUpOwotCi0JREVCVUdQKCJsZWF2aW5nXG4iKTsKLQogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKKyNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluX3Byb3RvbmF0W0NUQV9QUk9UT05BVF9NQVhdID0gewogCVtDVEFfUFJPVE9OQVRfUE9SVF9NSU4tMV0gICAgICAgPSBzaXplb2YodV9pbnQxNl90KSwKIAlbQ1RBX1BST1RPTkFUX1BPUlRfTUFYLTFdICAgICAgID0gc2l6ZW9mKHVfaW50MTZfdCksCiB9OwogCi1zdGF0aWMgaW50IGN0bmV0bGlua19wYXJzZV9uYXRfcHJvdG8oc3RydWN0IG5mYXR0ciAqYXR0ciwKK3N0YXRpYyBpbnQgbmZuZXRsaW5rX3BhcnNlX25hdF9wcm90byhzdHJ1Y3QgbmZhdHRyICphdHRyLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LAotCQkJCSAgICAgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCisJCQkJICAgICBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSkKIHsKIAlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfUFJPVE9OQVRfTUFYXTsKLQlzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpucHQ7Ci0KLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJc3RydWN0IG5mX25hdF9wcm90b2NvbCAqbnB0OwogCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX1BST1RPTkFUX01BWCwgYXR0cik7CiAKIAlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfUFJPVE9OQVRfTUFYLCBjdGFfbWluX3Byb3RvbmF0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlucHQgPSBpcF9uYXRfcHJvdG9fZmluZF9nZXQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSk7CisJbnB0ID0gbmZfbmF0X3Byb3RvX2ZpbmRfZ2V0KGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0pOwogCiAJaWYgKCFucHQtPm5mYXR0cl90b19yYW5nZSkgewotCQlpcF9uYXRfcHJvdG9fcHV0KG5wdCk7CisJCW5mX25hdF9wcm90b19wdXQobnB0KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02MDQsOSArNTg5LDggQEAKIAlpZiAobnB0LT5uZmF0dHJfdG9fcmFuZ2UodGIsIHJhbmdlKSA+IDApCiAJCXJhbmdlLT5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOwogCi0JaXBfbmF0X3Byb3RvX3B1dChucHQpOworCW5mX25hdF9wcm90b19wdXQobnB0KTsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxNiwxNCArNjAwLDEyIEBACiB9OwogCiBzdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX3BhcnNlX25hdChzdHJ1Y3QgbmZhdHRyICpuYXQsCi0JCSAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKQorbmZuZXRsaW5rX3BhcnNlX25hdChzdHJ1Y3QgbmZhdHRyICpuYXQsCisJCSAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKQogewogCXN0cnVjdCBuZmF0dHIgKnRiW0NUQV9OQVRfTUFYXTsKIAlpbnQgZXJyOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CiAJCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX05BVF9NQVgsIG5hdCk7CkBAIC02MzIsMTIgKzYxNCwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh0YltDVEFfTkFUX01JTklQLTFdKQotCQlyYW5nZS0+bWluX2lwID0gKih1X2ludDMyX3QgKilORkFfREFUQSh0YltDVEFfTkFUX01JTklQLTFdKTsKKwkJcmFuZ2UtPm1pbl9pcCA9ICooX19iZTMyICopTkZBX0RBVEEodGJbQ1RBX05BVF9NSU5JUC0xXSk7CiAKIAlpZiAoIXRiW0NUQV9OQVRfTUFYSVAtMV0pCiAJCXJhbmdlLT5tYXhfaXAgPSByYW5nZS0+bWluX2lwOwogCWVsc2UKLQkJcmFuZ2UtPm1heF9pcCA9ICoodV9pbnQzMl90ICopTkZBX0RBVEEodGJbQ1RBX05BVF9NQVhJUC0xXSk7CisJCXJhbmdlLT5tYXhfaXAgPSAqKF9fYmUzMiAqKU5GQV9EQVRBKHRiW0NUQV9OQVRfTUFYSVAtMV0pOwogCiAJaWYgKHJhbmdlLT5taW5faXApCiAJCXJhbmdlLT5mbGFncyB8PSBJUF9OQVRfUkFOR0VfTUFQX0lQUzsKQEAgLTY0NSwxMSArNjI3LDEwIEBACiAJaWYgKCF0YltDVEFfTkFUX1BST1RPLTFdKQogCQlyZXR1cm4gMDsKIAotCWVyciA9IGN0bmV0bGlua19wYXJzZV9uYXRfcHJvdG8odGJbQ1RBX05BVF9QUk9UTy0xXSwgY3QsIHJhbmdlKTsKKwllcnIgPSBuZm5ldGxpbmtfcGFyc2VfbmF0X3Byb3RvKHRiW0NUQV9OQVRfUFJPVE8tMV0sIGN0LCByYW5nZSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlERUJVR1AoImxlYXZpbmdcbiIpOwogCXJldHVybiAwOwogfQogI2VuZGlmCkBAIC02NTksOCArNjQwLDYgQEAKIHsKIAlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfSEVMUF9NQVhdOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX0hFTFBfTUFYLCBhdHRyKTsKIAogCWlmICghdGJbQ1RBX0hFTFBfTkFNRS0xXSkKQEAgLTY5MCw4ICs2NjksNiBAQAogCXVfaW50OF90IHUzID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWlmIChuZmF0dHJfYmFkX3NpemUoY2RhLCBDVEFfTUFYLCBjdGFfbWluKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTcwOSwxNSArNjg2LDEzIEBACiAJCXJldHVybiBlcnI7CiAKIAloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7Ci0JaWYgKCFoKSB7Ci0JCURFQlVHUCgidHVwbGUgbm90IGZvdW5kIGluIGNvbm50cmFjayBoYXNoXG4iKTsKKwlpZiAoIWgpCiAJCXJldHVybiAtRU5PRU5UOwotCX0KIAogCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKIAkKIAlpZiAoY2RhW0NUQV9JRC0xXSkgewotCQl1X2ludDMyX3QgaWQgPSBudG9obCgqKHVfaW50MzJfdCAqKU5GQV9EQVRBKGNkYVtDVEFfSUQtMV0pKTsKKwkJdV9pbnQzMl90IGlkID0gbnRvaGwoKihfX2JlMzIgKilORkFfREFUQShjZGFbQ1RBX0lELTFdKSk7CiAJCWlmIChjdC0+aWQgIT0gaWQpIHsKIAkJCW5mX2N0X3B1dChjdCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTcyNyw3ICs3MDIsNiBAQAogCQljdC0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZyljdCk7CiAKIAluZl9jdF9wdXQoY3QpOwotCURFQlVHUCgibGVhdmluZ1xuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0NCw4ICs3MTgsNiBAQAogCXVfaW50OF90IHUzID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKLQogCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewogCQl1MzIgcmxlbjsKIApAQCAtNzc5LDExICs3NTEsOSBAQAogCQlyZXR1cm4gZXJyOwogCiAJaCA9IG5mX2Nvbm50cmFja19maW5kX2dldCgmdHVwbGUsIE5VTEwpOwotCWlmICghaCkgewotCQlERUJVR1AoInR1cGxlIG5vdCBmb3VuZCBpbiBjb25udHJhY2sgaGFzaCIpOworCWlmICghaCkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCURFQlVHUCgidHVwbGUgZm91bmRcbiIpOworCiAJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCiAJZXJyID0gLUVOT01FTTsKQEAgLTc5Miw3ICs3NjIsNiBAQAogCQluZl9jdF9wdXQoY3QpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JTkVUTElOS19DQihza2IyKS5kc3RfcGlkID0gTkVUTElOS19DQihza2IpLnBpZDsKIAogCWVyciA9IGN0bmV0bGlua19maWxsX2luZm8oc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsIAogCQkJCSAgSVBDVE5MX01TR19DVF9ORVcsIDEsIGN0KTsKQEAgLTgwNCw3ICs3NzMsNiBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7CiAJcmV0dXJuIDA7CiAKIGZyZWU6CkBAIC04MTcsNyArNzg1LDcgQEAKIGN0bmV0bGlua19jaGFuZ2Vfc3RhdHVzKHN0cnVjdCBuZl9jb25uICpjdCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCiB7CiAJdW5zaWduZWQgbG9uZyBkOwotCXVuc2lnbmVkIHN0YXR1cyA9IG50b2hsKCoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9TVEFUVVMtMV0pKTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzID0gbnRvaGwoKihfX2JlMzIgKilORkFfREFUQShjZGFbQ1RBX1NUQVRVUy0xXSkpOwogCWQgPSBjdC0+c3RhdHVzIF4gc3RhdHVzOwogCiAJaWYgKGQgJiAoSVBTX0VYUEVDVEVEfElQU19DT05GSVJNRUR8SVBTX0RZSU5HKSkKQEAgLTgzNCwzNSArODAyLDM1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNkYVtDVEFfTkFUX1NSQy0xXSB8fCBjZGFbQ1RBX05BVF9EU1QtMV0pIHsKLSNpZm5kZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKKyNpZm5kZWYgQ09ORklHX05GX05BVF9ORUVERUQKIAkJcmV0dXJuIC1FSU5WQUw7CiAjZWxzZQotCQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlOworCQlzdHJ1Y3QgbmZfbmF0X3JhbmdlIHJhbmdlOwogCiAJCWlmIChjZGFbQ1RBX05BVF9EU1QtMV0pIHsKLQkJCWlmIChjdG5ldGxpbmtfcGFyc2VfbmF0KGNkYVtDVEFfTkFUX0RTVC0xXSwgY3QsCisJCQlpZiAobmZuZXRsaW5rX3BhcnNlX25hdChjZGFbQ1RBX05BVF9EU1QtMV0sIGN0LAogCQkJCQkJJnJhbmdlKSA8IDApCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoaXBfbmF0X2luaXRpYWxpemVkKGN0LAorCQkJaWYgKG5mX25hdF9pbml0aWFsaXplZChjdCwKIAkJCQkJICAgICAgIEhPT0syTUFOSVAoTkZfSVBfUFJFX1JPVVRJTkcpKSkKIAkJCQlyZXR1cm4gLUVFWElTVDsKLQkJCWlwX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIGhvb2tudW0pOworCQkJbmZfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfSVBfUFJFX1JPVVRJTkcpOwogCQl9CiAJCWlmIChjZGFbQ1RBX05BVF9TUkMtMV0pIHsKLQkJCWlmIChjdG5ldGxpbmtfcGFyc2VfbmF0KGNkYVtDVEFfTkFUX1NSQy0xXSwgY3QsCisJCQlpZiAobmZuZXRsaW5rX3BhcnNlX25hdChjZGFbQ1RBX05BVF9TUkMtMV0sIGN0LAogCQkJCQkJJnJhbmdlKSA8IDApCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoaXBfbmF0X2luaXRpYWxpemVkKGN0LAorCQkJaWYgKG5mX25hdF9pbml0aWFsaXplZChjdCwKIAkJCQkJICAgICAgIEhPT0syTUFOSVAoTkZfSVBfUE9TVF9ST1VUSU5HKSkpCiAJCQkJcmV0dXJuIC1FRVhJU1Q7Ci0JCQlpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBob29rbnVtKTsKKwkJCW5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX0lQX1BPU1RfUk9VVElORyk7CiAJCX0KICNlbmRpZgogCX0KIAogCS8qIEJlIGNhcmVmdWwgaGVyZSwgbW9kaWZ5aW5nIE5BVCBiaXRzIGNhbiBzY3JldyB1cCB0aGluZ3MsCiAJICogc28gZG9uJ3QgbGV0IHVzZXJzIG1vZGlmeSB0aGVtIGRpcmVjdGx5IGlmIHRoZXkgZG9uJ3QgcGFzcwotCSAqIGlwX25hdF9yYW5nZS4gKi8KKwkgKiBuZl9uYXRfcmFuZ2UuICovCiAJY3QtPnN0YXR1cyB8PSBzdGF0dXMgJiB+KElQU19OQVRfRE9ORV9NQVNLIHwgSVBTX05BVF9NQVNLKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg3Niw4ICs4NDQsNiBAQAogCWNoYXIgKmhlbHBuYW1lOwogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAoIWhlbHApIHsKIAkJLyogRklYTUU6IHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSBhbmQgcmVoYXNoICovCiAJCXJldHVybiAtRUJVU1k7CkBAIC05MTgsNyArODg0LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjdG5ldGxpbmtfY2hhbmdlX3RpbWVvdXQoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKLQl1X2ludDMyX3QgdGltZW91dCA9IG50b2hsKCoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9USU1FT1VULTFdKSk7CisJdV9pbnQzMl90IHRpbWVvdXQgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfVElNRU9VVC0xXSkpOwogCQogCWlmICghZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpCiAJCXJldHVybiAtRVRJTUU7CkBAIC05MzMsMTggKzg5OSwxOCBAQAogY3RuZXRsaW5rX2NoYW5nZV9wcm90b2luZm8oc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKIAlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfUFJPVE9JTkZPX01BWF0sICphdHRyID0gY2RhW0NUQV9QUk9UT0lORk8tMV07Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwogCXVfaW50MTZfdCBucHQgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtOwogCXVfaW50MTZfdCBsM251bSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW07CiAJaW50IGVyciA9IDA7CiAKIAluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9JTkZPX01BWCwgYXR0cik7CiAKLQlwcm90byA9IG5mX2N0X3Byb3RvX2ZpbmRfZ2V0KGwzbnVtLCBucHQpOworCWw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmRfZ2V0KGwzbnVtLCBucHQpOwogCi0JaWYgKHByb3RvLT5mcm9tX25mYXR0cikKLQkJZXJyID0gcHJvdG8tPmZyb21fbmZhdHRyKHRiLCBjdCk7Ci0JbmZfY3RfcHJvdG9fcHV0KHByb3RvKTsgCisJaWYgKGw0cHJvdG8tPmZyb21fbmZhdHRyKQorCQllcnIgPSBsNHByb3RvLT5mcm9tX25mYXR0cih0YiwgY3QpOworCW5mX2N0X2w0cHJvdG9fcHV0KGw0cHJvdG8pOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTk1NCw4ICs5MjAsNiBAQAogewogCWludCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAoY2RhW0NUQV9IRUxQLTFdKSB7CiAJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfaGVscGVyKGN0LCBjZGEpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTk4MiwxMCArOTQ2LDkgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NQVJLKQogCWlmIChjZGFbQ1RBX01BUkstMV0pCi0JCWN0LT5tYXJrID0gbnRvaGwoKih1X2ludDMyX3QgKilORkFfREFUQShjZGFbQ1RBX01BUkstMV0pKTsKKwkJY3QtPm1hcmsgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfTUFSSy0xXSkpOwogI2VuZGlmCiAKLQlERUJVR1AoImFsbCBkb25lXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTk2LDggKzk1OSw3IEBACiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWludCBlcnIgPSAtRUlOVkFMOwotCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHA7CiAKIAljdCA9IG5mX2Nvbm50cmFja19hbGxvYyhvdHVwbGUsIHJ0dXBsZSk7CiAJaWYgKGN0ID09IE5VTEwgfHwgSVNfRVJSKGN0KSkKQEAgLTEwMDUsMTQgKzk2NywxNiBAQAogCiAJaWYgKCFjZGFbQ1RBX1RJTUVPVVQtMV0pCiAJCWdvdG8gZXJyOwotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBudG9obCgqKHVfaW50MzJfdCAqKU5GQV9EQVRBKGNkYVtDVEFfVElNRU9VVC0xXSkpOworCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfVElNRU9VVC0xXSkpOwogCiAJY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBjdC0+dGltZW91dC5leHBpcmVzICogSFo7CiAJY3QtPnN0YXR1cyB8PSBJUFNfQ09ORklSTUVEOwogCi0JZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9zdGF0dXMoY3QsIGNkYSk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyOworCWlmIChjZGFbQ1RBX1NUQVRVUy0xXSkgeworCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3N0YXR1cyhjdCwgY2RhKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycjsKKwl9CiAKIAlpZiAoY2RhW0NUQV9QUk9UT0lORk8tMV0pIHsKIAkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9wcm90b2luZm8oY3QsIGNkYSk7CkBAIC0xMDIyLDEzICs5ODYsMTkgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NQVJLKQogCWlmIChjZGFbQ1RBX01BUkstMV0pCi0JCWN0LT5tYXJrID0gbnRvaGwoKih1X2ludDMyX3QgKilORkFfREFUQShjZGFbQ1RBX01BUkstMV0pKTsKKwkJY3QtPm1hcmsgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfTUFSSy0xXSkpOwogI2VuZGlmCiAKKwloZWxwID0gbmZjdF9oZWxwKGN0KTsKKwlpZiAoaGVscCkKKwkJaGVscC0+aGVscGVyID0gbmZfY3RfaGVscGVyX2ZpbmRfZ2V0KHJ0dXBsZSk7CisKIAlhZGRfdGltZXIoJmN0LT50aW1lb3V0KTsKIAluZl9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QpOwogCi0JREVCVUdQKCJjb25udHJhY2sgd2l0aCBpZCAldSBpbnNlcnRlZFxuIiwgY3QtPmlkKTsKKwlpZiAoaGVscCAmJiBoZWxwLT5oZWxwZXIpCisJCW5mX2N0X2hlbHBlcl9wdXQoaGVscC0+aGVscGVyKTsKKwogCXJldHVybiAwOwogCiBlcnI6CQpAQCAtMTA0Niw4ICsxMDE2LDYgQEAKIAl1X2ludDhfdCB1MyA9IG5mbXNnLT5uZmdlbl9mYW1pbHk7CiAJaW50IGVyciA9IDA7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX01BWCwgY3RhX21pbikpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xMDcxLDcgKzEwMzksNiBAQAogCiAJaWYgKGggPT0gTlVMTCkgewogCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkJREVCVUdQKCJubyBzdWNoIGNvbm50cmFjaywgY3JlYXRlIG5ld1xuIik7CiAJCWVyciA9IC1FTk9FTlQ7CiAJCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKQogCQkJZXJyID0gY3RuZXRsaW5rX2NyZWF0ZV9jb25udHJhY2soY2RhLCAmb3R1cGxlLCAmcnR1cGxlKTsKQEAgLTEwODcsNyArMTA1NCw2IEBACiAKIAkvKiBXZSBtYW5pcHVsYXRlIHRoZSBjb25udHJhY2sgaW5zaWRlIHRoZSBnbG9iYWwgY29ubnRyYWNrIHRhYmxlIGxvY2ssCiAJICogc28gdGhlcmUncyBubyBuZWVkIHRvIGluY3JlYXNlIHRoZSByZWZjb3VudCAqLwotCURFQlVHUCgiY29ubnRyYWNrIGZvdW5kXG4iKTsKIAllcnIgPSAtRUVYSVNUOwogCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKSkKIAkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9jb25udHJhY2sobmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKSwgY2RhKTsKQEAgLTExMjYsNyArMTA5Miw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwogCXN0cnVjdCBuZmF0dHIgKm5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9FWFBFQ1RfTUFTSyk7CiAKIAlsM3Byb3RvID0gbmZfY3RfbDNwcm90b19maW5kX2dldCh0dXBsZS0+c3JjLmwzbnVtKTsKQEAgLTExMzYsOSArMTEwMiw5IEBACiAJaWYgKHVubGlrZWx5KHJldCA8IDApKQogCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwogCi0JcHJvdG8gPSBuZl9jdF9wcm90b19maW5kX2dldCh0dXBsZS0+c3JjLmwzbnVtLCB0dXBsZS0+ZHN0LnByb3RvbnVtKTsKLQlyZXQgPSBjdG5ldGxpbmtfZHVtcF90dXBsZXNfcHJvdG8oc2tiLCBtYXNrLCBwcm90byk7Ci0JbmZfY3RfcHJvdG9fcHV0KHByb3RvKTsKKwlsNHByb3RvID0gbmZfY3RfbDRwcm90b19maW5kX2dldCh0dXBsZS0+c3JjLmwzbnVtLCB0dXBsZS0+ZHN0LnByb3RvbnVtKTsKKwlyZXQgPSBjdG5ldGxpbmtfZHVtcF90dXBsZXNfcHJvdG8oc2tiLCBtYXNrLCBsNHByb3RvKTsKKwluZl9jdF9sNHByb3RvX3B1dChsNHByb3RvKTsKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpCiAJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7CiAKQEAgLTExNTUsOCArMTEyMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApCiB7CiAJc3RydWN0IG5mX2Nvbm4gKm1hc3RlciA9IGV4cC0+bWFzdGVyOwotCXVfaW50MzJfdCB0aW1lb3V0ID0gaHRvbmwoKGV4cC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykgLyBIWik7Ci0JdV9pbnQzMl90IGlkID0gaHRvbmwoZXhwLT5pZCk7CisJX19iZTMyIHRpbWVvdXQgPSBodG9ubCgoZXhwLT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKSAvIEhaKTsKKwlfX2JlMzIgaWQgPSBodG9ubChleHAtPmlkKTsKIAogCWlmIChjdG5ldGxpbmtfZXhwX2R1bXBfdHVwbGUoc2tiLCAmZXhwLT50dXBsZSwgQ1RBX0VYUEVDVF9UVVBMRSkgPCAwKQogCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwpAQCAtMTI2OCw4ICsxMjM0LDYgQEAKIAlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gTkxNU0dfREFUQShjYi0+bmxoKTsKIAl1X2ludDhfdCBsM3Byb3RvID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKIAotCURFQlVHUCgiZW50ZXJlZCAlcywgbGFzdCBpZD0lbGx1XG4iLCBfX0ZVTkNUSU9OX18sICppZCk7Ci0KIAlyZWFkX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3ByZXYoaSwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCkgewogCQlleHAgPSAoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKikgaTsKQEAgLTEyODcsOCArMTI1MSw2IEBACiBvdXQ6CQogCXJlYWRfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAKLQlERUJVR1AoImxlYXZpbmcsIGxhc3QgaWQ9JWxsdVxuIiwgKmlkKTsKLQogCXJldHVybiBza2ItPmxlbjsKIH0KIApAQCAtMTMwOCw4ICsxMjcwLDYgQEAKIAl1X2ludDhfdCB1MyA9IG5mbXNnLT5uZmdlbl9mYW1pbHk7CiAJaW50IGVyciA9IDA7CiAKLQlERUJVR1AoImVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEzMzUsMTIgKzEyOTUsMTIgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfZmluZCgmdHVwbGUpOworCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJnR1cGxlKTsKIAlpZiAoIWV4cCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pIHsKLQkJdV9pbnQzMl90IGlkID0gKih1X2ludDMyX3QgKilORkFfREFUQShjZGFbQ1RBX0VYUEVDVF9JRC0xXSk7CisJCV9fYmUzMiBpZCA9ICooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pOwogCQlpZiAoZXhwLT5pZCAhPSBudG9obChpZCkpIHsKIAkJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTEzNTEsOCArMTMxMSw3IEBACiAJc2tiMiA9IGFsbG9jX3NrYihOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IyKQogCQlnb3RvIG91dDsKLQlORVRMSU5LX0NCKHNrYjIpLmRzdF9waWQgPSBORVRMSU5LX0NCKHNrYikucGlkOwotCQorCiAJZXJyID0gY3RuZXRsaW5rX2V4cF9maWxsX2luZm8oc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgCiAJCQkJICAgICAgbmxoLT5ubG1zZ19zZXEsIElQQ1ROTF9NU0dfRVhQX05FVywKIAkJCQkgICAgICAxLCBleHApOwpAQCAtMTM5MSwxMyArMTM1MCwxMiBAQAogCQkJcmV0dXJuIGVycjsKIAogCQkvKiBidW1wIHVzYWdlIGNvdW50IHRvIDIgKi8KLQkJZXhwID0gbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKCZ0dXBsZSk7CisJCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJnR1cGxlKTsKIAkJaWYgKCFleHApCiAJCQlyZXR1cm4gLUVOT0VOVDsKIAogCQlpZiAoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pIHsKLQkJCXVfaW50MzJfdCBpZCA9IAotCQkJCSoodV9pbnQzMl90ICopTkZBX0RBVEEoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pOworCQkJX19iZTMyIGlkID0gKihfX2JlMzIgKilORkFfREFUQShjZGFbQ1RBX0VYUEVDVF9JRC0xXSk7CiAJCQlpZiAoZXhwLT5pZCAhPSBudG9obChpZCkpIHsKIAkJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwogCQkJCXJldHVybiAtRU5PRU5UOwpAQCAtMTQ2MCw4ICsxNDE4LDYgQEAKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwOwogCWludCBlcnIgPSAwOwogCi0JREVCVUdQKCJlbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAJLyogY2FsbGVyIGd1YXJhbnRlZXMgdGhhdCB0aG9zZSB0aHJlZSBDVEFfRVhQRUNUXyogZXhpc3QgKi8KIAllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmdHVwbGUsIENUQV9FWFBFQ1RfVFVQTEUsIHUzKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTE0OTUsNiArMTQ1MSw3IEBACiAJZXhwLT5leHBlY3RmbiA9IE5VTEw7CiAJZXhwLT5mbGFncyA9IDA7CiAJZXhwLT5tYXN0ZXIgPSBjdDsKKwlleHAtPmhlbHBlciA9IE5VTEw7CiAJbWVtY3B5KCZleHAtPnR1cGxlLCAmdHVwbGUsIHNpemVvZihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlKSk7CiAJbWVtY3B5KCZleHAtPm1hc2ssICZtYXNrLCBzaXplb2Yoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSkpOwogCkBAIC0xNTE2LDggKzE0NzMsNiBAQAogCXVfaW50OF90IHUzID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKIAlpbnQgZXJyID0gMDsKIAotCURFQlVHUCgiZW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsJCi0KIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE1NDYsOCArMTUwMSw2IEBACiAJCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfZXhwZWN0KGV4cCwgY2RhKTsKIAl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAotCURFQlVHUCgibGVhdmluZ1xuIik7Ci0JCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTU5NSw2ICsxNTQ4LDcgQEAKIAkuY2IJCQkJPSBjdG5sX2V4cF9jYiwKIH07CiAKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrX25ldGxpbmsiKTsKIE1PRFVMRV9BTElBU19ORk5MX1NVQlNZUyhORk5MX1NVQlNZU19DVE5FVExJTkspOwogTU9EVUxFX0FMSUFTX05GTkxfU1VCU1lTKE5GTkxfU1VCU1lTX0NUTkVUTElOS19FWFApOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmZjAwZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYwpAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqIENvbm5lY3Rpb24gdHJhY2tpbmcgc3VwcG9ydCBmb3IgUFBUUCAoUG9pbnQgdG8gUG9pbnQgVHVubmVsaW5nIFByb3RvY29sKS4KKyAqIFBQVFAgaXMgYSBhIHByb3RvY29sIGZvciBjcmVhdGluZyB2aXJ0dWFsIHByaXZhdGUgbmV0d29ya3MuCisgKiBJdCBpcyBhIHNwZWNpZmljYXRpb24gZGVmaW5lZCBieSBNaWNyb3NvZnQgYW5kIHNvbWUgdmVuZG9ycworICogd29ya2luZyB3aXRoIE1pY3Jvc29mdC4gIFBQVFAgaXMgYnVpbHQgb24gdG9wIG9mIGEgbW9kaWZpZWQKKyAqIHZlcnNpb24gb2YgdGhlIEludGVybmV0IEdlbmVyaWMgUm91dGluZyBFbmNhcHN1bGF0aW9uIFByb3RvY29sLgorICogR1JFIGlzIGRlZmluZWQgaW4gUkZDIDE3MDEgYW5kIFJGQyAxNzAyLiAgRG9jdW1lbnRhdGlvbiBvZgorICogUFBUUCBjYW4gYmUgZm91bmQgaW4gUkZDIDI2MzcKKyAqCisgKiAoQykgMjAwMC0yMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCisgKgorICogTGltaXRhdGlvbnM6CisgKiAJIC0gV2UgYmxpbmRseSBhc3N1bWUgdGhhdCBjb250cm9sIGNvbm5lY3Rpb25zIGFyZSBhbHdheXMKKyAqIAkgICBlc3RhYmxpc2hlZCBpbiBQTlMtPlBBQyBkaXJlY3Rpb24uICBUaGlzIGlzIGEgdmlvbGF0aW9uCisgKiAJICAgb2YgUkZGQzI2NzMKKyAqIAkgLSBXZSBjYW4gb25seSBzdXBwb3J0IG9uZSBzaW5nbGUgY2FsbCB3aXRoaW4gZWFjaCBzZXNzaW9uCisgKiBUT0RPOgorICoJIC0gdGVzdGluZyBvZiBpbmNvbWluZyBQUFRQIGNhbGxzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5oPgorCisjZGVmaW5lIE5GX0NUX1BQVFBfVkVSU0lPTiAiMy4xIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIgbW9kdWxlIGZvciBQUFRQIik7CitNT0RVTEVfQUxJQVMoImlwX2Nvbm50cmFja19wcHRwIik7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmZfcHB0cF9sb2NrKTsKKworaW50CisoKm5mX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJCSAgICAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAorCQkJICAgICB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfcHB0cF9ob29rX291dGJvdW5kKTsKKworaW50CisoKm5mX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJICAgIHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAorCQkJICAgIHVuaW9uIHBwdHBfY3RybF91bmlvbiAqcHB0cFJlcSkgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9wcHRwX2hvb2tfaW5ib3VuZCk7CisKK3ZvaWQKKygqbmZfbmF0X3BwdHBfaG9va19leHBfZ3JlKShzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwZWN0X29yaWcsCisJCQkgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdF9yZXBseSkKKwkJCSAgICBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3BwdHBfaG9va19leHBfZ3JlKTsKKwordm9pZAorKCpuZl9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKShzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKTsKKworI2lmIDAKKy8qIFBwdHBDb250cm9sTWVzc2FnZVR5cGUgbmFtZXMgKi8KK2NvbnN0IGNoYXIgKnBwdHBfbXNnX25hbWVbXSA9IHsKKwkiVU5LTk9XTl9NRVNTQUdFIiwKKwkiU1RBUlRfU0VTU0lPTl9SRVFVRVNUIiwKKwkiU1RBUlRfU0VTU0lPTl9SRVBMWSIsCisJIlNUT1BfU0VTU0lPTl9SRVFVRVNUIiwKKwkiU1RPUF9TRVNTSU9OX1JFUExZIiwKKwkiRUNIT19SRVFVRVNUIiwKKwkiRUNIT19SRVBMWSIsCisJIk9VVF9DQUxMX1JFUVVFU1QiLAorCSJPVVRfQ0FMTF9SRVBMWSIsCisJIklOX0NBTExfUkVRVUVTVCIsCisJIklOX0NBTExfUkVQTFkiLAorCSJJTl9DQUxMX0NPTk5FQ1QiLAorCSJDQUxMX0NMRUFSX1JFUVVFU1QiLAorCSJDQUxMX0RJU0NPTk5FQ1RfTk9USUZZIiwKKwkiV0FOX0VSUk9SX05PVElGWSIsCisJIlNFVF9MSU5LX0lORk8iCit9OworRVhQT1JUX1NZTUJPTChwcHRwX21zZ19uYW1lKTsKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiAiIGZvcm1hdCwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBTRUNTICpIWgorI2RlZmluZSBNSU5TICogNjAgU0VDUworI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKKworI2RlZmluZSBQUFRQX0dSRV9USU1FT1VUIAkJKDEwIE1JTlMpCisjZGVmaW5lIFBQVFBfR1JFX1NUUkVBTV9USU1FT1VUIAkoNSBIT1VSUykKKworc3RhdGljIHZvaWQgcHB0cF9leHBlY3RmbihzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3sKKwl0eXBlb2YobmZfbmF0X3BwdHBfaG9va19leHBlY3RmbikgbmZfbmF0X3BwdHBfZXhwZWN0Zm47CisJREVCVUdQKCJpbmNyZWFzaW5nIHRpbWVvdXRzXG4iKTsKKworCS8qIGluY3JlYXNlIHRpbWVvdXQgb2YgR1JFIGRhdGEgY2hhbm5lbCBjb25udHJhY2sgZW50cnkgKi8KKwljdC0+cHJvdG8uZ3JlLnRpbWVvdXQJICAgICA9IFBQVFBfR1JFX1RJTUVPVVQ7CisJY3QtPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCA9IFBQVFBfR1JFX1NUUkVBTV9USU1FT1VUOworCisJLyogQ2FuIHlvdSBzZWUgaG93IHJ1c3R5IHRoaXMgY29kZSBpcywgY29tcGFyZWQgd2l0aCB0aGUgcHJlLTIuNi4xMQorCSAqIG9uZT8gVGhhdCdzIHdoYXQgaGFwcGVuZWQgdG8gbXkgc2hpbnkgbmV3bmF0IG9mIDIwMDIgOyggLUhXICovCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbmZfbmF0X3BwdHBfZXhwZWN0Zm4gPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X3BwdHBfaG9va19leHBlY3Rmbik7CisJaWYgKG5mX25hdF9wcHRwX2V4cGVjdGZuICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCW5mX25hdF9wcHRwX2V4cGVjdGZuKGN0LCBleHApOworCWVsc2UgeworCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIGludl90OworCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwX290aGVyOworCisJCS8qIG9idmlvdXNseSB0aGlzIHR1cGxlIGludmVyc2lvbiBvbmx5IHdvcmtzIHVudGlsIHlvdSBkbyBOQVQgKi8KKwkJbmZfY3RfaW52ZXJ0X3R1cGxlcHIoJmludl90LCAmZXhwLT50dXBsZSk7CisJCURFQlVHUCgidHJ5aW5nIHRvIHVuZXhwZWN0IG90aGVyIGRpcjogIik7CisJCU5GX0NUX0RVTVBfVFVQTEUoJmludl90KTsKKworCQlleHBfb3RoZXIgPSBuZl9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KCZpbnZfdCk7CisJCWlmIChleHBfb3RoZXIpIHsKKwkJCS8qIGRlbGV0ZSBvdGhlciBleHBlY3RhdGlvbi4gICovCisJCQlERUJVR1AoImZvdW5kXG4iKTsKKwkJCW5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cF9vdGhlcik7CisJCQluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHBfb3RoZXIpOworCQl9IGVsc2UgeworCQkJREVCVUdQKCJub3QgZm91bmRcbiIpOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IGRlc3Ryb3lfc2libGluZ19vcl9leHAoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwlzdHJ1Y3QgbmZfY29ubiAqc2libGluZzsKKworCURFQlVHUCgidHJ5aW5nIHRvIHRpbWVvdXQgY3Qgb3IgZXhwIGZvciB0dXBsZSAiKTsKKwlORl9DVF9EVU1QX1RVUExFKHQpOworCisJaCA9IG5mX2Nvbm50cmFja19maW5kX2dldCh0LCBOVUxMKTsKKwlpZiAoaCkgIHsKKwkJc2libGluZyA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CisJCURFQlVHUCgic2V0dGluZyB0aW1lb3V0IG9mIGNvbm50cmFjayAlcCB0byAwXG4iLCBzaWJsaW5nKTsKKwkJc2libGluZy0+cHJvdG8uZ3JlLnRpbWVvdXQJICA9IDA7CisJCXNpYmxpbmctPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCA9IDA7CisJCWlmIChkZWxfdGltZXIoJnNpYmxpbmctPnRpbWVvdXQpKQorCQkJc2libGluZy0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZylzaWJsaW5nKTsKKwkJbmZfY3RfcHV0KHNpYmxpbmcpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlleHAgPSBuZl9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KHQpOworCQlpZiAoZXhwKSB7CisJCQlERUJVR1AoInVuZXhwZWN0X3JlbGF0ZWQgb2YgZXhwZWN0ICVwXG4iLCBleHApOworCQkJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKKwkJCW5mX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogdGltZW91dCBHUkUgZGF0YSBjb25uZWN0aW9ucyAqLworc3RhdGljIHZvaWQgcHB0cF9kZXN0cm95X3NpYmxpbmdzKHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGN0KTsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHQ7CisKKwluZl9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koY3QpOworCisJLyogdHJ5IG9yaWdpbmFsIChwbnMtPnBhYykgdHVwbGUgKi8KKwltZW1jcHkoJnQsICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUsIHNpemVvZih0KSk7CisJdC5kc3QucHJvdG9udW0gPSBJUFBST1RPX0dSRTsKKwl0LnNyYy51LmdyZS5rZXkgPSBoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5wbnNfY2FsbF9pZDsKKwl0LmRzdC51LmdyZS5rZXkgPSBoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5wYWNfY2FsbF9pZDsKKwlpZiAoIWRlc3Ryb3lfc2libGluZ19vcl9leHAoJnQpKQorCQlERUJVR1AoImZhaWxlZCB0byB0aW1lb3V0IG9yaWdpbmFsIHBucy0+cGFjIGN0L2V4cFxuIik7CisKKwkvKiB0cnkgcmVwbHkgKHBhYy0+cG5zKSB0dXBsZSAqLworCW1lbWNweSgmdCwgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSwgc2l6ZW9mKHQpKTsKKwl0LmRzdC5wcm90b251bSA9IElQUFJPVE9fR1JFOworCXQuc3JjLnUuZ3JlLmtleSA9IGhlbHAtPmhlbHAuY3RfcHB0cF9pbmZvLnBhY19jYWxsX2lkOworCXQuZHN0LnUuZ3JlLmtleSA9IGhlbHAtPmhlbHAuY3RfcHB0cF9pbmZvLnBuc19jYWxsX2lkOworCWlmICghZGVzdHJveV9zaWJsaW5nX29yX2V4cCgmdCkpCisJCURFQlVHUCgiZmFpbGVkIHRvIHRpbWVvdXQgcmVwbHkgcGFjLT5wbnMgY3QvZXhwXG4iKTsKK30KKworLyogZXhwZWN0IEdSRSBjb25uZWN0aW9ucyAoUE5TLT5QQUMgYW5kIFBBQy0+UE5TIGRpcmVjdGlvbikgKi8KK3N0YXRpYyBpbnQgZXhwX2dyZShzdHJ1Y3QgbmZfY29ubiAqY3QsIF9fYmUxNiBjYWxsaWQsIF9fYmUxNiBwZWVyX2NhbGxpZCkKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwX29yaWcsICpleHBfcmVwbHk7CisJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKKwlpbnQgcmV0ID0gMTsKKwl0eXBlb2YobmZfbmF0X3BwdHBfaG9va19leHBfZ3JlKSBuZl9uYXRfcHB0cF9leHBfZ3JlOworCisJZXhwX29yaWcgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKKwlpZiAoZXhwX29yaWcgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlleHBfcmVwbHkgPSBuZl9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKKwlpZiAoZXhwX3JlcGx5ID09IE5VTEwpCisJCWdvdG8gb3V0X3B1dF9vcmlnOworCisJLyogb3JpZ2luYWwgZGlyZWN0aW9uLCBQTlMtPlBBQyAqLworCWRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsKKwluZl9jb25udHJhY2tfZXhwZWN0X2luaXQoZXhwX29yaWcsIGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMubDNudW0sCisJCQkJICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUzLAorCQkJCSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC51MywKKwkJCQkgSVBQUk9UT19HUkUsICZwZWVyX2NhbGxpZCwgJmNhbGxpZCk7CisJZXhwX29yaWctPmV4cGVjdGZuID0gcHB0cF9leHBlY3RmbjsKKworCS8qIHJlcGx5IGRpcmVjdGlvbiwgUEFDLT5QTlMgKi8KKwlkaXIgPSBJUF9DVF9ESVJfUkVQTFk7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cF9yZXBseSwgY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5sM251bSwKKwkJCQkgJmN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMsCisJCQkJICZjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuZHN0LnUzLAorCQkJCSBJUFBST1RPX0dSRSwgJmNhbGxpZCwgJnBlZXJfY2FsbGlkKTsKKwlleHBfcmVwbHktPmV4cGVjdGZuID0gcHB0cF9leHBlY3RmbjsKKworCW5mX25hdF9wcHRwX2V4cF9ncmUgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X3BwdHBfaG9va19leHBfZ3JlKTsKKwlpZiAobmZfbmF0X3BwdHBfZXhwX2dyZSAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQorCQluZl9uYXRfcHB0cF9leHBfZ3JlKGV4cF9vcmlnLCBleHBfcmVwbHkpOworCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwX29yaWcpICE9IDApCisJCWdvdG8gb3V0X3B1dF9ib3RoOworCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwX3JlcGx5KSAhPSAwKQorCQlnb3RvIG91dF91bmV4cGVjdF9vcmlnOworCisJLyogQWRkIEdSRSBrZXltYXAgZW50cmllcyAqLworCWlmIChuZl9jdF9ncmVfa2V5bWFwX2FkZChjdCwgSVBfQ1RfRElSX09SSUdJTkFMLCAmZXhwX29yaWctPnR1cGxlKSAhPSAwKQorCQlnb3RvIG91dF91bmV4cGVjdF9ib3RoOworCWlmIChuZl9jdF9ncmVfa2V5bWFwX2FkZChjdCwgSVBfQ1RfRElSX1JFUExZLCAmZXhwX3JlcGx5LT50dXBsZSkgIT0gMCkgeworCQluZl9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koY3QpOworCQlnb3RvIG91dF91bmV4cGVjdF9ib3RoOworCX0KKwlyZXQgPSAwOworCitvdXRfcHV0X2JvdGg6CisJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwX3JlcGx5KTsKK291dF9wdXRfb3JpZzoKKwluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHBfb3JpZyk7CitvdXQ6CisJcmV0dXJuIHJldDsKKworb3V0X3VuZXhwZWN0X2JvdGg6CisJbmZfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwX3JlcGx5KTsKK291dF91bmV4cGVjdF9vcmlnOgorCW5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cF9vcmlnKTsKKwlnb3RvIG91dF9wdXRfYm90aDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3BwdHBfaW5ib3VuZF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAorCQkgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxLAorCQkgdW5zaWduZWQgaW50IHJlcWxlbiwKKwkJIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXN0cnVjdCBuZl9jdF9wcHRwX21hc3RlciAqaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X3BwdHBfaW5mbzsKKwl1X2ludDE2X3QgbXNnOworCV9fYmUxNiBjaWQgPSAwLCBwY2lkID0gMDsKKwl0eXBlb2YobmZfbmF0X3BwdHBfaG9va19pbmJvdW5kKSBuZl9uYXRfcHB0cF9pbmJvdW5kOworCisJbXNnID0gbnRvaHMoY3RsaC0+bWVzc2FnZVR5cGUpOworCURFQlVHUCgiaW5ib3VuZCBjb250cm9sIG1lc3NhZ2UgJXNcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSk7CisKKwlzd2l0Y2ggKG1zZykgeworCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUExZOgorCQkvKiBzZXJ2ZXIgY29uZmlybXMgbmV3IGNvbnRyb2wgc2Vzc2lvbiAqLworCQlpZiAoaW5mby0+c3N0YXRlIDwgUFBUUF9TRVNTSU9OX1JFUVVFU1RFRCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaWYgKHBwdHBSZXEtPnNyZXAucmVzdWx0Q29kZSA9PSBQUFRQX1NUQVJUX09LKQorCQkJaW5mby0+c3N0YXRlID0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRDsKKwkJZWxzZQorCQkJaW5mby0+c3N0YXRlID0gUFBUUF9TRVNTSU9OX0VSUk9SOworCQlicmVhazsKKworCWNhc2UgUFBUUF9TVE9QX1NFU1NJT05fUkVQTFk6CisJCS8qIHNlcnZlciBjb25maXJtcyBlbmQgb2YgY29udHJvbCBzZXNzaW9uICovCisJCWlmIChpbmZvLT5zc3RhdGUgPiBQUFRQX1NFU1NJT05fU1RPUFJFUSkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaWYgKHBwdHBSZXEtPnN0cmVwLnJlc3VsdENvZGUgPT0gUFBUUF9TVE9QX09LKQorCQkJaW5mby0+c3N0YXRlID0gUFBUUF9TRVNTSU9OX05PTkU7CisJCWVsc2UKKwkJCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9FUlJPUjsKKwkJYnJlYWs7CisKKwljYXNlIFBQVFBfT1VUX0NBTExfUkVQTFk6CisJCS8qIHNlcnZlciBhY2NlcHRlZCBjYWxsLCB3ZSBub3cgZXhwZWN0IEdSRSBmcmFtZXMgKi8KKwkJaWYgKGluZm8tPnNzdGF0ZSAhPSBQUFRQX1NFU1NJT05fQ09ORklSTUVEKQorCQkJZ290byBpbnZhbGlkOworCQlpZiAoaW5mby0+Y3N0YXRlICE9IFBQVFBfQ0FMTF9PVVRfUkVRICYmCisJCSAgICBpbmZvLT5jc3RhdGUgIT0gUFBUUF9DQUxMX09VVF9DT05GKQorCQkJZ290byBpbnZhbGlkOworCisJCWNpZCA9IHBwdHBSZXEtPm9jYWNrLmNhbGxJRDsKKwkJcGNpZCA9IHBwdHBSZXEtPm9jYWNrLnBlZXJzQ2FsbElEOworCQlpZiAoaW5mby0+cG5zX2NhbGxfaWQgIT0gcGNpZCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJREVCVUdQKCIlcywgQ0lEPSVYLCBQQ0lEPSVYXG4iLCBwcHRwX21zZ19uYW1lW21zZ10sCisJCQludG9ocyhjaWQpLCBudG9ocyhwY2lkKSk7CisKKwkJaWYgKHBwdHBSZXEtPm9jYWNrLnJlc3VsdENvZGUgPT0gUFBUUF9PVVRDQUxMX0NPTk5FQ1QpIHsKKwkJCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9PVVRfQ09ORjsKKwkJCWluZm8tPnBhY19jYWxsX2lkID0gY2lkOworCQkJZXhwX2dyZShjdCwgY2lkLCBwY2lkKTsKKwkJfSBlbHNlCisJCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfTk9ORTsKKwkJYnJlYWs7CisKKwljYXNlIFBQVFBfSU5fQ0FMTF9SRVFVRVNUOgorCQkvKiBzZXJ2ZXIgdGVsbHMgdXMgYWJvdXQgaW5jb21pbmcgY2FsbCByZXF1ZXN0ICovCisJCWlmIChpbmZvLT5zc3RhdGUgIT0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCkKKwkJCWdvdG8gaW52YWxpZDsKKworCQljaWQgPSBwcHRwUmVxLT5pY3JlcS5jYWxsSUQ7CisJCURFQlVHUCgiJXMsIENJRD0lWFxuIiwgcHB0cF9tc2dfbmFtZVttc2ddLCBudG9ocyhjaWQpKTsKKwkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX0lOX1JFUTsKKwkJaW5mby0+cGFjX2NhbGxfaWQgPSBjaWQ7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX0lOX0NBTExfQ09OTkVDVDoKKwkJLyogc2VydmVyIHRlbGxzIHVzIGFib3V0IGluY29taW5nIGNhbGwgZXN0YWJsaXNoZWQgKi8KKwkJaWYgKGluZm8tPnNzdGF0ZSAhPSBQUFRQX1NFU1NJT05fQ09ORklSTUVEKQorCQkJZ290byBpbnZhbGlkOworCQlpZiAoaW5mby0+Y3N0YXRlICE9IFBQVFBfQ0FMTF9JTl9SRVAgJiYKKwkJICAgIGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfSU5fQ09ORikKKwkJCWdvdG8gaW52YWxpZDsKKworCQlwY2lkID0gcHB0cFJlcS0+aWNjb24ucGVlcnNDYWxsSUQ7CisJCWNpZCA9IGluZm8tPnBhY19jYWxsX2lkOworCisJCWlmIChpbmZvLT5wbnNfY2FsbF9pZCAhPSBwY2lkKQorCQkJZ290byBpbnZhbGlkOworCisJCURFQlVHUCgiJXMsIFBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwgbnRvaHMocGNpZCkpOworCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfSU5fQ09ORjsKKworCQkvKiB3ZSBleHBlY3QgYSBHUkUgY29ubmVjdGlvbiBmcm9tIFBBQyB0byBQTlMgKi8KKwkJZXhwX2dyZShjdCwgY2lkLCBwY2lkKTsKKwkJYnJlYWs7CisKKwljYXNlIFBQVFBfQ0FMTF9ESVNDT05ORUNUX05PVElGWToKKwkJLyogc2VydmVyIGNvbmZpcm1zIGRpc2Nvbm5lY3QgKi8KKwkJY2lkID0gcHB0cFJlcS0+ZGlzYy5jYWxsSUQ7CisJCURFQlVHUCgiJXMsIENJRD0lWFxuIiwgcHB0cF9tc2dfbmFtZVttc2ddLCBudG9ocyhjaWQpKTsKKwkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX05PTkU7CisKKwkJLyogdW50cmFjayB0aGlzIGNhbGwgaWQsIHVuZXhwZWN0IEdSRSBwYWNrZXRzICovCisJCXBwdHBfZGVzdHJveV9zaWJsaW5ncyhjdCk7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX1dBTl9FUlJPUl9OT1RJRlk6CisJY2FzZSBQUFRQX0VDSE9fUkVRVUVTVDoKKwljYXNlIFBQVFBfRUNIT19SRVBMWToKKwkJLyogSSBkb24ndCBoYXZlIHRvIGV4cGxhaW4gdGhlc2UgOykgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIGludmFsaWQ7CisJfQorCisJbmZfbmF0X3BwdHBfaW5ib3VuZCA9IHJjdV9kZXJlZmVyZW5jZShuZl9uYXRfcHB0cF9ob29rX2luYm91bmQpOworCWlmIChuZl9uYXRfcHB0cF9pbmJvdW5kICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCXJldHVybiBuZl9uYXRfcHB0cF9pbmJvdW5kKHBza2IsIGN0LCBjdGluZm8sIGN0bGgsIHBwdHBSZXEpOworCXJldHVybiBORl9BQ0NFUFQ7CisKK2ludmFsaWQ6CisJREVCVUdQKCJpbnZhbGlkICVzOiB0eXBlPSVkIGNpZD0ldSBwY2lkPSV1ICIKKwkgICAgICAgImNzdGF0ZT0lZCBzc3RhdGU9JWQgcG5zX2NpZD0ldSBwYWNfY2lkPSV1XG4iLAorCSAgICAgICBtc2cgPD0gUFBUUF9NU0dfTUFYID8gcHB0cF9tc2dfbmFtZVttc2ddIDogcHB0cF9tc2dfbmFtZVswXSwKKwkgICAgICAgbXNnLCBudG9ocyhjaWQpLCBudG9ocyhwY2lkKSwgIGluZm8tPmNzdGF0ZSwgaW5mby0+c3N0YXRlLAorCSAgICAgICBudG9ocyhpbmZvLT5wbnNfY2FsbF9pZCksIG50b2hzKGluZm8tPnBhY19jYWxsX2lkKSk7CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3BwdHBfb3V0Ym91bmRfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICBzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgKmN0bGgsCisJCSAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxLAorCQkgIHVuc2lnbmVkIGludCByZXFsZW4sCisJCSAgc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCXN0cnVjdCBuZl9jdF9wcHRwX21hc3RlciAqaW5mbyA9ICZuZmN0X2hlbHAoY3QpLT5oZWxwLmN0X3BwdHBfaW5mbzsKKwl1X2ludDE2X3QgbXNnOworCV9fYmUxNiBjaWQgPSAwLCBwY2lkID0gMDsKKwl0eXBlb2YobmZfbmF0X3BwdHBfaG9va19vdXRib3VuZCkgbmZfbmF0X3BwdHBfb3V0Ym91bmQ7CisKKwltc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSk7CisJREVCVUdQKCJvdXRib3VuZCBjb250cm9sIG1lc3NhZ2UgJXNcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSk7CisKKwlzd2l0Y2ggKG1zZykgeworCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUVVFU1Q6CisJCS8qIGNsaWVudCByZXF1ZXN0cyBmb3IgbmV3IGNvbnRyb2wgc2Vzc2lvbiAqLworCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9OT05FKQorCQkJZ290byBpbnZhbGlkOworCQlpbmZvLT5zc3RhdGUgPSBQUFRQX1NFU1NJT05fUkVRVUVTVEVEOworCQlicmVhazsKKworCWNhc2UgUFBUUF9TVE9QX1NFU1NJT05fUkVRVUVTVDoKKwkJLyogY2xpZW50IHJlcXVlc3RzIGVuZCBvZiBjb250cm9sIHNlc3Npb24gKi8KKwkJaW5mby0+c3N0YXRlID0gUFBUUF9TRVNTSU9OX1NUT1BSRVE7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX09VVF9DQUxMX1JFUVVFU1Q6CisJCS8qIGNsaWVudCBpbml0aWF0aW5nIGNvbm5lY3Rpb24gdG8gc2VydmVyICovCisJCWlmIChpbmZvLT5zc3RhdGUgIT0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX09VVF9SRVE7CisJCS8qIHRyYWNrIFBOUyBjYWxsIGlkICovCisJCWNpZCA9IHBwdHBSZXEtPm9jcmVxLmNhbGxJRDsKKwkJREVCVUdQKCIlcywgQ0lEPSVYXG4iLCBwcHRwX21zZ19uYW1lW21zZ10sIG50b2hzKGNpZCkpOworCQlpbmZvLT5wbnNfY2FsbF9pZCA9IGNpZDsKKwkJYnJlYWs7CisKKwljYXNlIFBQVFBfSU5fQ0FMTF9SRVBMWToKKwkJLyogY2xpZW50IGFuc3dlcnMgaW5jb21pbmcgY2FsbCAqLworCQlpZiAoaW5mby0+Y3N0YXRlICE9IFBQVFBfQ0FMTF9JTl9SRVEgJiYKKwkJICAgIGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfSU5fUkVQKQorCQkJZ290byBpbnZhbGlkOworCisJCWNpZCA9IHBwdHBSZXEtPmljYWNrLmNhbGxJRDsKKwkJcGNpZCA9IHBwdHBSZXEtPmljYWNrLnBlZXJzQ2FsbElEOworCQlpZiAoaW5mby0+cGFjX2NhbGxfaWQgIT0gcGNpZCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJREVCVUdQKCIlcywgQ0lEPSVYIFBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwKKwkJICAgICAgIG50b2hzKGNpZCksIG50b2hzKHBjaWQpKTsKKworCQlpZiAocHB0cFJlcS0+aWNhY2sucmVzdWx0Q29kZSA9PSBQUFRQX0lOQ0FMTF9BQ0NFUFQpIHsKKwkJCS8qIHBhcnQgdHdvIG9mIHRoZSB0aHJlZS13YXkgaGFuZHNoYWtlICovCisJCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfSU5fUkVQOworCQkJaW5mby0+cG5zX2NhbGxfaWQgPSBjaWQ7CisJCX0gZWxzZQorCQkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX05PTkU7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX0NBTExfQ0xFQVJfUkVRVUVTVDoKKwkJLyogY2xpZW50IHJlcXVlc3RzIGhhbmd1cCBvZiBjYWxsICovCisJCWlmIChpbmZvLT5zc3RhdGUgIT0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJLyogRlVUVVJFOiBpdGVyYXRlIG92ZXIgYWxsIGNhbGxzIGFuZCBjaGVjayBpZgorCQkgKiBjYWxsIElEIGlzIHZhbGlkLiAgV2UgZG9uJ3QgZG8gdGhpcyB3aXRob3V0IG5ld25hdCwKKwkJICogYmVjYXVzZSB3ZSBvbmx5IGtub3cgYWJvdXQgbGFzdCBjYWxsICovCisJCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9DTEVBUl9SRVE7CisJCWJyZWFrOworCisJY2FzZSBQUFRQX1NFVF9MSU5LX0lORk86CisJY2FzZSBQUFRQX0VDSE9fUkVRVUVTVDoKKwljYXNlIFBQVFBfRUNIT19SRVBMWToKKwkJLyogSSBkb24ndCBoYXZlIHRvIGV4cGxhaW4gdGhlc2UgOykgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIGludmFsaWQ7CisJfQorCisJbmZfbmF0X3BwdHBfb3V0Ym91bmQgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X3BwdHBfaG9va19vdXRib3VuZCk7CisJaWYgKG5mX25hdF9wcHRwX291dGJvdW5kICYmIGN0LT5zdGF0dXMgJiBJUFNfTkFUX01BU0spCisJCXJldHVybiBuZl9uYXRfcHB0cF9vdXRib3VuZChwc2tiLCBjdCwgY3RpbmZvLCBjdGxoLCBwcHRwUmVxKTsKKwlyZXR1cm4gTkZfQUNDRVBUOworCitpbnZhbGlkOgorCURFQlVHUCgiaW52YWxpZCAlczogdHlwZT0lZCBjaWQ9JXUgcGNpZD0ldSAiCisJICAgICAgICJjc3RhdGU9JWQgc3N0YXRlPSVkIHBuc19jaWQ9JXUgcGFjX2NpZD0ldVxuIiwKKwkgICAgICAgbXNnIDw9IFBQVFBfTVNHX01BWCA/IHBwdHBfbXNnX25hbWVbbXNnXSA6IHBwdHBfbXNnX25hbWVbMF0sCisJICAgICAgIG1zZywgbnRvaHMoY2lkKSwgbnRvaHMocGNpZCksICBpbmZvLT5jc3RhdGUsIGluZm8tPnNzdGF0ZSwKKwkgICAgICAgbnRvaHMoaW5mby0+cG5zX2NhbGxfaWQpLCBudG9ocyhpbmZvLT5wYWNfY2FsbF9pZCkpOworCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHB0cF9tc2dfc2l6ZVtdID0geworCVtQUFRQX1NUQVJUX1NFU1NJT05fUkVRVUVTVF0gID0gc2l6ZW9mKHN0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVxdWVzdCksCisJW1BQVFBfU1RBUlRfU0VTU0lPTl9SRVBMWV0gICAgPSBzaXplb2Yoc3RydWN0IFBwdHBTdGFydFNlc3Npb25SZXBseSksCisJW1BQVFBfU1RPUF9TRVNTSU9OX1JFUVVFU1RdICAgPSBzaXplb2Yoc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcXVlc3QpLAorCVtQUFRQX1NUT1BfU0VTU0lPTl9SRVBMWV0gICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwU3RvcFNlc3Npb25SZXBseSksCisJW1BQVFBfT1VUX0NBTExfUkVRVUVTVF0gICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBPdXRDYWxsUmVxdWVzdCksCisJW1BQVFBfT1VUX0NBTExfUkVQTFldCSAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwT3V0Q2FsbFJlcGx5KSwKKwlbUFBUUF9JTl9DQUxMX1JFUVVFU1RdCSAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwSW5DYWxsUmVxdWVzdCksCisJW1BQVFBfSU5fQ0FMTF9SRVBMWV0JICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBJbkNhbGxSZXBseSksCisJW1BQVFBfSU5fQ0FMTF9DT05ORUNUXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cEluQ2FsbENvbm5lY3RlZCksCisJW1BQVFBfQ0FMTF9DTEVBUl9SRVFVRVNUXSAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBDbGVhckNhbGxSZXF1ZXN0KSwKKwlbUFBUUF9DQUxMX0RJU0NPTk5FQ1RfTk9USUZZXSA9IHNpemVvZihzdHJ1Y3QgUHB0cENhbGxEaXNjb25uZWN0Tm90aWZ5KSwKKwlbUFBUUF9XQU5fRVJST1JfTk9USUZZXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cFdhbkVycm9yTm90aWZ5KSwKKwlbUFBUUF9TRVRfTElOS19JTkZPXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cFNldExpbmtJbmZvKSwKK307CisKKy8qIHRyYWNrIGNhbGxlciBpZCBpbnNpZGUgY29udHJvbCBjb25uZWN0aW9uLCBjYWxsIGV4cGVjdF9yZWxhdGVkICovCitzdGF0aWMgaW50Citjb25udHJhY2tfcHB0cF9oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQorCit7CisJaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKwlzdHJ1Y3QgbmZfY3RfcHB0cF9tYXN0ZXIgKmluZm8gPSAmbmZjdF9oZWxwKGN0KS0+aGVscC5jdF9wcHRwX2luZm87CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRjcGg7CisJc3RydWN0IHBwdHBfcGt0X2hkciBfcHB0cGgsICpwcHRwaDsKKwlzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgX2N0bGgsICpjdGxoOworCXVuaW9uIHBwdHBfY3RybF91bmlvbiBfcHB0cFJlcSwgKnBwdHBSZXE7CisJdW5zaWduZWQgaW50IHRjcGxlbiA9ICgqcHNrYiktPmxlbiAtIHByb3RvZmY7CisJdW5zaWduZWQgaW50IGRhdGFsZW4sIHJlcWxlbiwgbmV4dGhkcl9vZmY7CisJaW50IG9sZHNzdGF0ZSwgb2xkY3N0YXRlOworCWludCByZXQ7CisJdV9pbnQxNl90IG1zZzsKKworCS8qIGRvbid0IGRvIGFueSB0cmFja2luZyBiZWZvcmUgdGNwIGhhbmRzaGFrZSBjb21wbGV0ZSAqLworCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgJiYKKwkgICAgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpCisJCXJldHVybiBORl9BQ0NFUFQ7CisKKwluZXh0aGRyX29mZiA9IHByb3RvZmY7CisJdGNwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgbmV4dGhkcl9vZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJQlVHX09OKCF0Y3BoKTsKKwluZXh0aGRyX29mZiArPSB0Y3BoLT5kb2ZmICogNDsKKyAJZGF0YWxlbiA9IHRjcGxlbiAtIHRjcGgtPmRvZmYgKiA0OworCisJcHB0cGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIG5leHRoZHJfb2ZmLCBzaXplb2YoX3BwdHBoKSwgJl9wcHRwaCk7CisJaWYgKCFwcHRwaCkgeworCQlERUJVR1AoIm5vIGZ1bGwgUFBUUCBoZWFkZXIsIGNhbid0IHRyYWNrXG4iKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisJbmV4dGhkcl9vZmYgKz0gc2l6ZW9mKF9wcHRwaCk7CisJZGF0YWxlbiAtPSBzaXplb2YoX3BwdHBoKTsKKworCS8qIGlmIGl0J3Mgbm90IGEgY29udHJvbCBtZXNzYWdlIHdlIGNhbid0IGRvIGFueXRoaW5nIHdpdGggaXQgKi8KKwlpZiAobnRvaHMocHB0cGgtPnBhY2tldFR5cGUpICE9IFBQVFBfUEFDS0VUX0NPTlRST0wgfHwKKwkgICAgbnRvaGwocHB0cGgtPm1hZ2ljQ29va2llKSAhPSBQUFRQX01BR0lDX0NPT0tJRSkgeworCQlERUJVR1AoIm5vdCBhIGNvbnRyb2wgcGFja2V0XG4iKTsKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwl9CisKKwljdGxoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBuZXh0aGRyX29mZiwgc2l6ZW9mKF9jdGxoKSwgJl9jdGxoKTsKKwlpZiAoIWN0bGgpCisJCXJldHVybiBORl9BQ0NFUFQ7CisJbmV4dGhkcl9vZmYgKz0gc2l6ZW9mKF9jdGxoKTsKKwlkYXRhbGVuIC09IHNpemVvZihfY3RsaCk7CisKKwlyZXFsZW4gPSBkYXRhbGVuOworCW1zZyA9IG50b2hzKGN0bGgtPm1lc3NhZ2VUeXBlKTsKKwlpZiAobXNnID4gMCAmJiBtc2cgPD0gUFBUUF9NU0dfTUFYICYmIHJlcWxlbiA8IHBwdHBfbXNnX3NpemVbbXNnXSkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKwlpZiAocmVxbGVuID4gc2l6ZW9mKCpwcHRwUmVxKSkKKwkJcmVxbGVuID0gc2l6ZW9mKCpwcHRwUmVxKTsKKworCXBwdHBSZXEgPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIG5leHRoZHJfb2ZmLCByZXFsZW4sICZfcHB0cFJlcSk7CisJaWYgKCFwcHRwUmVxKQorCQlyZXR1cm4gTkZfQUNDRVBUOworCisJb2xkc3N0YXRlID0gaW5mby0+c3N0YXRlOworCW9sZGNzdGF0ZSA9IGluZm8tPmNzdGF0ZTsKKworCXNwaW5fbG9ja19iaCgmbmZfcHB0cF9sb2NrKTsKKworCS8qIEZJWE1FOiBXZSBqdXN0IGJsaW5kbHkgYXNzdW1lIHRoYXQgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBpcyBhbHdheXMKKwkgKiBlc3RhYmxpc2hlZCBmcm9tIFBOUy0+UEFDLiAgSG93ZXZlciwgUkZDIG1ha2VzIG5vIGd1YXJhbnRlZSAqLworCWlmIChkaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQorCQkvKiBjbGllbnQgLT4gc2VydmVyIChQTlMgLT4gUEFDKSAqLworCQlyZXQgPSBwcHRwX291dGJvdW5kX3BrdChwc2tiLCBjdGxoLCBwcHRwUmVxLCByZXFsZW4sIGN0LAorCQkJCQljdGluZm8pOworCWVsc2UKKwkJLyogc2VydmVyIC0+IGNsaWVudCAoUEFDIC0+IFBOUykgKi8KKwkJcmV0ID0gcHB0cF9pbmJvdW5kX3BrdChwc2tiLCBjdGxoLCBwcHRwUmVxLCByZXFsZW4sIGN0LAorCQkJCSAgICAgICBjdGluZm8pOworCURFQlVHUCgic3N0YXRlOiAlZC0+JWQsIGNzdGF0ZTogJWQtPiVkXG4iLAorCQlvbGRzc3RhdGUsIGluZm8tPnNzdGF0ZSwgb2xkY3N0YXRlLCBpbmZvLT5jc3RhdGUpOworCXNwaW5fdW5sb2NrX2JoKCZuZl9wcHRwX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogY29udHJvbCBwcm90b2NvbCBoZWxwZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBwcHRwIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCQk9ICJwcHRwIiwKKwkubWUJCQk9IFRISVNfTU9EVUxFLAorCS5tYXhfZXhwZWN0ZWQJCT0gMiwKKwkudGltZW91dAkJPSA1ICogNjAsCisJLnR1cGxlLnNyYy5sM251bQk9IEFGX0lORVQsCisJLnR1cGxlLnNyYy51LnRjcC5wb3J0CT0gX19jb25zdGFudF9odG9ucyhQUFRQX0NPTlRST0xfUE9SVCksCisJLnR1cGxlLmRzdC5wcm90b251bQk9IElQUFJPVE9fVENQLAorCS5tYXNrLnNyYy5sM251bQkJPSAweGZmZmYsCisJLm1hc2suc3JjLnUudGNwLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKDB4ZmZmZiksCisJLm1hc2suZHN0LnByb3RvbnVtCT0gMHhmZiwKKwkuaGVscAkJCT0gY29ubnRyYWNrX3BwdHBfaGVscCwKKwkuZGVzdHJveQkJPSBwcHRwX2Rlc3Ryb3lfc2libGluZ3MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZl9jb25udHJhY2tfcHB0cF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJnBwdHApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZfY29ubnRyYWNrX3BwdHBfZmluaSh2b2lkKQoreworCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmcHB0cCk7CisJbmZfY3RfZ3JlX2tleW1hcF9mbHVzaCgpOworfQorCittb2R1bGVfaW5pdChuZl9jb25udHJhY2tfcHB0cF9pbml0KTsKK21vZHVsZV9leGl0KG5mX2Nvbm50cmFja19wcHRwX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MWI3MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMKQEAgLTAsMCArMSw0MTAgQEAKKy8qIEwzL0w0IHByb3RvY29sIHN1cHBvcnQgZm9yIG5mX2Nvbm50cmFjay4gKi8KKworLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAorICogKEMpIDIwMDItMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgorICogKEMpIDIwMDMsMjAwNCBVU0FHSS9XSURFIFByb2plY3QgPGh0dHA6Ly93d3cubGludXgtaXB2Ni5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgorCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKipuZl9jdF9wcm90b3NbUEZfTUFYXSBfX3JlYWRfbW9zdGx5Oworc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpuZl9jdF9sM3Byb3Rvc1tBRl9NQVhdIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9sM3Byb3Rvcyk7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgREVGSU5FX01VVEVYKG5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CisKK3N0YXRpYyBpbnQKK25mX2N0X3JlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqKmhlYWRlciwgc3RydWN0IGN0bF90YWJsZSAqcGF0aCwKKwkJICAgICAgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIHVuc2lnbmVkIGludCAqdXNlcnMpCit7CisJaWYgKCpoZWFkZXIgPT0gTlVMTCkgeworCQkqaGVhZGVyID0gbmZfcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHBhdGgsIHRhYmxlKTsKKwkJaWYgKCpoZWFkZXIgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAodXNlcnMgIT0gTlVMTCkKKwkJKCp1c2VycykrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK25mX2N0X3VucmVnaXN0ZXJfc3lzY3RsKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICoqaGVhZGVyLAorCQkJc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIHVuc2lnbmVkIGludCAqdXNlcnMpCit7CisJaWYgKHVzZXJzICE9IE5VTEwgJiYgLS0qdXNlcnMgPiAwKQorCQlyZXR1cm47CisJbmZfdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoKmhlYWRlciwgdGFibGUpOworCSpoZWFkZXIgPSBOVUxMOworfQorI2VuZGlmCisKK3N0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqCitfX25mX2N0X2w0cHJvdG9fZmluZCh1X2ludDE2X3QgbDNwcm90bywgdV9pbnQ4X3QgbDRwcm90bykKK3sKKwlpZiAodW5saWtlbHkobDNwcm90byA+PSBBRl9NQVggfHwgbmZfY3RfcHJvdG9zW2wzcHJvdG9dID09IE5VTEwpKQorCQlyZXR1cm4gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWM7CisKKwlyZXR1cm4gbmZfY3RfcHJvdG9zW2wzcHJvdG9dW2w0cHJvdG9dOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jdF9sNHByb3RvX2ZpbmQpOworCisvKiB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiBhIHZhbGlkIHByb3RvY29sIGhlbHBlciwgc2luY2UKKyAqIGl0IGZhbGxzIGJhY2sgdG8gZ2VuZXJpY19wcm90b2NvbCAqLworc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoKK25mX2N0X2w0cHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8sIHVfaW50OF90IGw0cHJvdG8pCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpwOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJcCA9IF9fbmZfY3RfbDRwcm90b19maW5kKGwzcHJvdG8sIGw0cHJvdG8pOworCWlmICghdHJ5X21vZHVsZV9nZXQocC0+bWUpKQorCQlwID0gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWM7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiBwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbDRwcm90b19maW5kX2dldCk7CisKK3ZvaWQgbmZfY3RfbDRwcm90b19wdXQoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpwKQoreworCW1vZHVsZV9wdXQocC0+bWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbDRwcm90b19wdXQpOworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKgorbmZfY3RfbDNwcm90b19maW5kX2dldCh1X2ludDE2X3QgbDNwcm90bykKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnA7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlwID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQobDNwcm90byk7CisJaWYgKCF0cnlfbW9kdWxlX2dldChwLT5tZSkpCisJCXAgPSAmbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYzsKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJcmV0dXJuIHA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KTsKKwordm9pZCBuZl9jdF9sM3Byb3RvX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnApCit7CisJbW9kdWxlX3B1dChwLT5tZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9sM3Byb3RvX3B1dCk7CisKK2ludAorbmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldCh1bnNpZ25lZCBzaG9ydCBsM3Byb3RvKQoreworCWludCByZXQ7CisJc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwOworCityZXRyeToJcCA9IG5mX2N0X2wzcHJvdG9fZmluZF9nZXQobDNwcm90byk7CisJaWYgKHAgPT0gJm5mX2Nvbm50cmFja19sM3Byb3RvX2dlbmVyaWMpIHsKKwkJcmV0ID0gcmVxdWVzdF9tb2R1bGUoIm5mX2Nvbm50cmFjay0lZCIsIGwzcHJvdG8pOworCQlpZiAoIXJldCkKKwkJCWdvdG8gcmV0cnk7CisKKwkJcmV0dXJuIC1FUFJPVE9UWVBFOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldCk7CisKK3ZvaWQgbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KHVuc2lnbmVkIHNob3J0IGwzcHJvdG8pCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJcCA9IF9fbmZfY3RfbDNwcm90b19maW5kKGwzcHJvdG8pOworCXByZWVtcHRfZW5hYmxlKCk7CisKKwltb2R1bGVfcHV0KHAtPm1lKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCk7CisKK3N0YXRpYyBpbnQga2lsbF9sM3Byb3RvKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKQoreworCXJldHVybiAoaS0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtID09CisJCQkoKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqKWRhdGEpLT5sM3Byb3RvKTsKK30KKworc3RhdGljIGludCBraWxsX2w0cHJvdG8oc3RydWN0IG5mX2Nvbm4gKmksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOworCWw0cHJvdG8gPSAoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICopZGF0YTsKKwlyZXR1cm4gKGktPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSA9PQorCQkJbDRwcm90by0+bDRwcm90bykgJiYKKwkgICAgICAgKGktPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bSA9PQorCQkJbDRwcm90by0+bDNwcm90byk7Cit9CisKK3N0YXRpYyBpbnQgbmZfY3RfbDNwcm90b19yZWdpc3Rlcl9zeXNjdGwoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvKQoreworCWludCBlcnIgPSAwOworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CisJaWYgKGwzcHJvdG8tPmN0bF90YWJsZSAhPSBOVUxMKSB7CisJCWVyciA9IG5mX2N0X3JlZ2lzdGVyX3N5c2N0bCgmbDNwcm90by0+Y3RsX3RhYmxlX2hlYWRlciwKKwkJCQkJICAgIGwzcHJvdG8tPmN0bF90YWJsZV9wYXRoLAorCQkJCQkgICAgbDNwcm90by0+Y3RsX3RhYmxlLCBOVUxMKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOworI2VuZGlmCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8pCit7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CisJaWYgKGwzcHJvdG8tPmN0bF90YWJsZV9oZWFkZXIgIT0gTlVMTCkKKwkJbmZfY3RfdW5yZWdpc3Rlcl9zeXNjdGwoJmwzcHJvdG8tPmN0bF90YWJsZV9oZWFkZXIsCisJCQkJCWwzcHJvdG8tPmN0bF90YWJsZSwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOworI2VuZGlmCit9CisKK2ludCBuZl9jb25udHJhY2tfbDNwcm90b19yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnByb3RvKQoreworCWludCByZXQgPSAwOworCisJaWYgKHByb3RvLT5sM3Byb3RvID49IEFGX01BWCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwlpZiAobmZfY3RfbDNwcm90b3NbcHJvdG8tPmwzcHJvdG9dICE9ICZuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwluZl9jdF9sM3Byb3Rvc1twcm90by0+bDNwcm90b10gPSBwcm90bzsKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCXJldCA9IG5mX2N0X2wzcHJvdG9fcmVnaXN0ZXJfc3lzY3RsKHByb3RvKTsKKwlpZiAocmV0IDwgMCkKKwkJbmZfY29ubnRyYWNrX2wzcHJvdG9fdW5yZWdpc3Rlcihwcm90byk7CisJcmV0dXJuIHJldDsKKworb3V0X3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2wzcHJvdG9fcmVnaXN0ZXIpOworCitpbnQgbmZfY29ubnRyYWNrX2wzcHJvdG9fdW5yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnByb3RvKQoreworCWludCByZXQgPSAwOworCisJaWYgKHByb3RvLT5sM3Byb3RvID49IEFGX01BWCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwlpZiAobmZfY3RfbDNwcm90b3NbcHJvdG8tPmwzcHJvdG9dICE9IHByb3RvKSB7CisJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCW5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSA9ICZuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljOworCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCisJbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyX3N5c2N0bChwcm90byk7CisKKwkvKiBTb21lYm9keSBjb3VsZCBiZSBzdGlsbCBsb29raW5nIGF0IHRoZSBwcm90byBpbiBiaC4gKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCS8qIFJlbW92ZSBhbGwgY29udHJhY2sgZW50cmllcyBmb3IgdGhpcyBwcm90b2NvbCAqLworCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2wzcHJvdG8sIHByb3RvKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKTsKKworc3RhdGljIGludCBuZl9jdF9sNHByb3RvX3JlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8pCit7CisJaW50IGVyciA9IDA7CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJbXV0ZXhfbG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKKwlpZiAobDRwcm90by0+Y3RsX3RhYmxlICE9IE5VTEwpIHsKKwkJZXJyID0gbmZfY3RfcmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8tPmN0bF90YWJsZV9oZWFkZXIsCisJCQkJCSAgICBuZl9uZXRfbmV0ZmlsdGVyX3N5c2N0bF9wYXRoLAorCQkJCQkgICAgbDRwcm90by0+Y3RsX3RhYmxlLAorCQkJCQkgICAgbDRwcm90by0+Y3RsX3RhYmxlX3VzZXJzKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDsKKwl9CisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAorCWlmIChsNHByb3RvLT5jdGxfY29tcGF0X3RhYmxlICE9IE5VTEwpIHsKKwkJZXJyID0gbmZfY3RfcmVnaXN0ZXJfc3lzY3RsKCZsNHByb3RvLT5jdGxfY29tcGF0X3RhYmxlX2hlYWRlciwKKwkJCQkJICAgIG5mX25ldF9pcHY0X25ldGZpbHRlcl9zeXNjdGxfcGF0aCwKKwkJCQkJICAgIGw0cHJvdG8tPmN0bF9jb21wYXRfdGFibGUsIE5VTEwpOworCQlpZiAoZXJyID09IDApCisJCQlnb3RvIG91dDsKKwkJbmZfY3RfdW5yZWdpc3Rlcl9zeXNjdGwobDRwcm90by0+Y3RsX3RhYmxlX2hlYWRlciwKKwkJCQkJbDRwcm90by0+Y3RsX3RhYmxlLAorCQkJCQlsNHByb3RvLT5jdGxfdGFibGVfdXNlcnMpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBuZl9jdF9sNHByb3RvX3VucmVnaXN0ZXJfc3lzY3RsKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bykKK3sKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJbXV0ZXhfbG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKKwlpZiAobDRwcm90by0+Y3RsX3RhYmxlX2hlYWRlciAhPSBOVUxMICYmCisJICAgICpsNHByb3RvLT5jdGxfdGFibGVfaGVhZGVyICE9IE5VTEwpCisJCW5mX2N0X3VucmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8tPmN0bF90YWJsZV9oZWFkZXIsCisJCQkJCWw0cHJvdG8tPmN0bF90YWJsZSwKKwkJCQkJbDRwcm90by0+Y3RsX3RhYmxlX3VzZXJzKTsKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCisJaWYgKGw0cHJvdG8tPmN0bF9jb21wYXRfdGFibGVfaGVhZGVyICE9IE5VTEwpCisJCW5mX2N0X3VucmVnaXN0ZXJfc3lzY3RsKCZsNHByb3RvLT5jdGxfY29tcGF0X3RhYmxlX2hlYWRlciwKKwkJCQkJbDRwcm90by0+Y3RsX2NvbXBhdF90YWJsZSwgTlVMTCk7CisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLworCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCit9CisKKy8qIEZJWE1FOiBBbGxvdyBOVUxMIGZ1bmN0aW9ucyBhbmQgc3ViIGluIHBvaW50ZXJzIHRvIGdlbmVyaWMgZm9yCisgICB0aGVtLiAtLVJSICovCitpbnQgbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKQoreworCWludCByZXQgPSAwOworCisJaWYgKGw0cHJvdG8tPmwzcHJvdG8gPj0gUEZfTUFYKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGw0cHJvdG8gPT0gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpCisJCXJldHVybiBuZl9jdF9sNHByb3RvX3JlZ2lzdGVyX3N5c2N0bChsNHByb3RvKTsKKworcmV0cnk6CisJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCWlmIChuZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b10pIHsKKwkJaWYgKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXVtsNHByb3RvLT5sNHByb3RvXQorCQkJCSE9ICZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9IGVsc2UgeworCQkvKiBsM3Byb3RvIG1heSBiZSBsb2FkZWQgbGF0dGVyLiAqLworCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKipwcm90b19hcnJheTsKKwkJaW50IGk7CisKKwkJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisKKwkJcHJvdG9fYXJyYXkgPSAoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoqKQorCQkJCWttYWxsb2MoTUFYX05GX0NUX1BST1RPICoKKwkJCQkJIHNpemVvZihzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKiksCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAocHJvdG9fYXJyYXkgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTkZfQ1RfUFJPVE87IGkrKykKKwkJCXByb3RvX2FycmF5W2ldID0gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWM7CisKKwkJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCQlpZiAobmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dKSB7CisJCQkvKiBiYWQgdGltaW5nLCBidXQgbm8gcHJvYmxlbSAqLworCQkJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJCQlrZnJlZShwcm90b19hcnJheSk7CisJCX0gZWxzZSB7CisJCQluZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b10gPSBwcm90b19hcnJheTsKKwkJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCQl9CisKKwkJLyoKKwkJICogSnVzdCBvbmNlIGJlY2F1c2UgYXJyYXkgaXMgbmV2ZXIgZnJlZWQgdW50aWwgdW5sb2FkaW5nCisJCSAqIG5mX2Nvbm50cmFjay5rbworCQkgKi8KKwkJZ290byByZXRyeTsKKwl9CisKKwluZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b11bbDRwcm90by0+bDRwcm90b10gPSBsNHByb3RvOworCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCisJcmV0ID0gbmZfY3RfbDRwcm90b19yZWdpc3Rlcl9zeXNjdGwobDRwcm90byk7CisJaWYgKHJldCA8IDApCisJCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIobDRwcm90byk7CisJcmV0dXJuIHJldDsKKworb3V0X3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIpOworCitpbnQgbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAobDRwcm90by0+bDNwcm90byA+PSBQRl9NQVgpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobDRwcm90byA9PSAmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYykgeworCQluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8pOworCQlnb3RvIG91dDsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CisJaWYgKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXVtsNHByb3RvLT5sNHByb3RvXQorCSAgICAhPSBsNHByb3RvKSB7CisJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwluZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b11bbDRwcm90by0+bDRwcm90b10KKwkJPSAmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYzsKKwl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKworCW5mX2N0X2w0cHJvdG9fdW5yZWdpc3Rlcl9zeXNjdGwobDRwcm90byk7CisKKwkvKiBTb21lYm9keSBjb3VsZCBiZSBzdGlsbCBsb29raW5nIGF0IHRoZSBwcm90byBpbiBiaC4gKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKKworCS8qIFJlbW92ZSBhbGwgY29udHJhY2sgZW50cmllcyBmb3IgdGhpcyBwcm90b2NvbCAqLworCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2w0cHJvdG8sIGw0cHJvdG8pOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCmluZGV4IDI2NDA4YmIuLjY5OTAyNTMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKQEAgLTE1LDkgKzE1LDkgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CiAKLXVuc2lnbmVkIGludCBuZl9jdF9nZW5lcmljX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDYwMCpIWjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfZ2VuZXJpY190aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSA2MDAqSFo7CiAKIHN0YXRpYyBpbnQgZ2VuZXJpY19wa3RfdG9fdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQl1bnNpZ25lZCBpbnQgZGF0YW9mZiwKQEAgLTcxLDEwICs3MSw0MiBAQAogCXJldHVybiAxOwogfQogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sID0KKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmdlbmVyaWNfc3lzY3RsX2hlYWRlcjsKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGdlbmVyaWNfc3lzY3RsX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX0dFTkVSSUNfVElNRU9VVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja19nZW5lcmljX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfZ2VuZXJpY190aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMAorCX0KK307CisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAorc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgZ2VuZXJpY19jb21wYXRfc3lzY3RsX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfR0VORVJJQ19USU1FT1VULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2dlbmVyaWNfdGltZW91dCIsCisJCS5kYXRhCQk9ICZuZl9jdF9nZW5lcmljX3RpbWVvdXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKKyNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYyA9CiB7CiAJLmwzcHJvdG8JCT0gUEZfVU5TUEVDLAotCS5wcm90bwkJCT0gMCwKKwkubDRwcm90bwkJPSAwLAogCS5uYW1lCQkJPSAidW5rbm93biIsCiAJLnBrdF90b190dXBsZQkJPSBnZW5lcmljX3BrdF90b190dXBsZSwKIAkuaW52ZXJ0X3R1cGxlCQk9IGdlbmVyaWNfaW52ZXJ0X3R1cGxlLApAQCAtODIsNCArMTE0LDExIEBACiAJLnByaW50X2Nvbm50cmFjawk9IGdlbmVyaWNfcHJpbnRfY29ubnRyYWNrLAogCS5wYWNrZXQJCQk9IHBhY2tldCwKIAkubmV3CQkJPSBuZXcsCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCS5jdGxfdGFibGVfaGVhZGVyCT0gJmdlbmVyaWNfc3lzY3RsX2hlYWRlciwKKwkuY3RsX3RhYmxlCQk9IGdlbmVyaWNfc3lzY3RsX3RhYmxlLAorI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKKwkuY3RsX2NvbXBhdF90YWJsZQk9IGdlbmVyaWNfY29tcGF0X3N5c2N0bF90YWJsZSwKKyNlbmRpZgorI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE5M2NlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBpcF9jb25udHJhY2tfcHJvdG9fZ3JlLmMgLSBWZXJzaW9uIDMuMAorICoKKyAqIENvbm5lY3Rpb24gdHJhY2tpbmcgcHJvdG9jb2wgaGVscGVyIG1vZHVsZSBmb3IgR1JFLgorICoKKyAqIEdSRSBpcyBhIGdlbmVyaWMgZW5jYXBzdWxhdGlvbiBwcm90b2NvbCwgd2hpY2ggaXMgZ2VuZXJhbGx5IG5vdCB2ZXJ5CisgKiBzdWl0ZWQgZm9yIE5BVCwgYXMgaXQgaGFzIG5vIHByb3RvY29sLXNwZWNpZmljIHBhcnQgYXMgcG9ydCBudW1iZXJzLgorICoKKyAqIEl0IGhhcyBhbiBvcHRpb25hbCBrZXkgZmllbGQsIHdoaWNoIG1heSBoZWxwIHVzIGRpc3Rpbmd1aXNoaW5nIHR3bworICogY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgc2FtZSB0d28gaG9zdHMuCisgKgorICogR1JFIGlzIGRlZmluZWQgaW4gUkZDIDE3MDEgYW5kIFJGQyAxNzAyLCBhcyB3ZWxsIGFzIFJGQyAyNzg0CisgKgorICogUFBUUCBpcyBidWlsdCBvbiB0b3Agb2YgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIEdSRSwgYW5kIGhhcyBhIG1hbmRhdG9yeQorICogZmllbGQgY2FsbGVkICJDYWxsSUQiLCB3aGljaCBzZXJ2ZXMgdXMgZm9yIHRoZSBzYW1lIHB1cnBvc2UgYXMgdGhlIGtleQorICogZmllbGQgaW4gcGxhaW4gR1JFLgorICoKKyAqIERvY3VtZW50YXRpb24gYWJvdXQgUFBUUCBjYW4gYmUgZm91bmQgaW4gUkZDIDI2MzcKKyAqCisgKiAoQykgMjAwMC0yMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuaD4KKworI2RlZmluZSBHUkVfVElNRU9VVAkJKDMwICogSFopCisjZGVmaW5lIEdSRV9TVFJFQU1fVElNRU9VVAkoMTgwICogSFopCisKKyNpZiAwCisjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICIlczolczogIiBmb3JtYXQsIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoeCwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1JXTE9DSyhuZl9jdF9ncmVfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGdyZV9rZXltYXBfbGlzdCk7CisKK3ZvaWQgbmZfY3RfZ3JlX2tleW1hcF9mbHVzaCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm47CisKKwl3cml0ZV9sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgJmdyZV9rZXltYXBfbGlzdCkgeworCQlsaXN0X2RlbChwb3MpOworCQlrZnJlZShwb3MpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJm5mX2N0X2dyZV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wobmZfY3RfZ3JlX2tleW1hcF9mbHVzaCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGdyZV9rZXlfY21wZm4oY29uc3Qgc3RydWN0IG5mX2N0X2dyZV9rZXltYXAgKmttLAorCQkJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpCit7CisJcmV0dXJuIGttLT50dXBsZS5zcmMubDNudW0gPT0gdC0+c3JjLmwzbnVtICYmCisJICAgICAgICFtZW1jbXAoJmttLT50dXBsZS5zcmMudTMsICZ0LT5zcmMudTMsIHNpemVvZih0LT5zcmMudTMpKSAmJgorCSAgICAgICAhbWVtY21wKCZrbS0+dHVwbGUuZHN0LnUzLCAmdC0+ZHN0LnUzLCBzaXplb2YodC0+ZHN0LnUzKSkgJiYKKwkgICAgICAga20tPnR1cGxlLmRzdC5wcm90b251bSA9PSB0LT5kc3QucHJvdG9udW0gJiYKKwkgICAgICAga20tPnR1cGxlLmRzdC51LmFsbCA9PSB0LT5kc3QudS5hbGw7Cit9CisKKy8qIGxvb2sgdXAgdGhlIHNvdXJjZSBrZXkgZm9yIGEgZ2l2ZW4gdHVwbGUgKi8KK3N0YXRpYyBfX2JlMTYgZ3JlX2tleW1hcF9sb29rdXAoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCkKK3sKKwlzdHJ1Y3QgbmZfY3RfZ3JlX2tleW1hcCAqa207CisJX19iZTE2IGtleSA9IDA7CisKKwlyZWFkX2xvY2tfYmgoJm5mX2N0X2dyZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGttLCAmZ3JlX2tleW1hcF9saXN0LCBsaXN0KSB7CisJCWlmIChncmVfa2V5X2NtcGZuKGttLCB0KSkgeworCQkJa2V5ID0ga20tPnR1cGxlLnNyYy51LmdyZS5rZXk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmbmZfY3RfZ3JlX2xvY2spOworCisJREVCVUdQKCJsb29rdXAgc3JjIGtleSAweCV4IGZvciAiLCBrZXkpOworCU5GX0NUX0RVTVBfVFVQTEUodCk7CisKKwlyZXR1cm4ga2V5OworfQorCisvKiBhZGQgYSBzaW5nbGUga2V5bWFwIGVudHJ5LCBhc3NvY2lhdGUgd2l0aCBzcGVjaWZpZWQgbWFzdGVyIGN0ICovCitpbnQgbmZfY3RfZ3JlX2tleW1hcF9hZGQoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyLAorCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnQpCit7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChjdCk7CisJc3RydWN0IG5mX2N0X2dyZV9rZXltYXAgKiprbXAsICprbTsKKworCUJVR19PTihzdHJjbXAoaGVscC0+aGVscGVyLT5uYW1lLCAicHB0cCIpKTsKKwlrbXAgPSAmaGVscC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwW2Rpcl07CisJaWYgKCprbXApIHsKKwkJLyogY2hlY2sgd2hldGhlciBpdCdzIGEgcmV0cmFuc21pc3Npb24gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJmdyZV9rZXltYXBfbGlzdCwgbGlzdCkgeworCQkJaWYgKGdyZV9rZXlfY21wZm4oa20sIHQpICYmIGttID09ICprbXApCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJREVCVUdQKCJ0cnlpbmcgdG8gb3ZlcnJpZGUga2V5bWFwXyVzIGZvciBjdCAlcFxuIiwKKwkJCWRpciA9PSBJUF9DVF9ESVJfUkVQTFkgPyAicmVwbHkiIDogIm9yaWciLCBjdCk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCWttID0ga21hbGxvYyhzaXplb2YoKmttKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFrbSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KCZrbS0+dHVwbGUsIHQsIHNpemVvZigqdCkpOworCSprbXAgPSBrbTsKKworCURFQlVHUCgiYWRkaW5nIG5ldyBlbnRyeSAlcDogIiwga20pOworCU5GX0NUX0RVTVBfVFVQTEUoJmttLT50dXBsZSk7CisKKwl3cml0ZV9sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgma20tPmxpc3QsICZncmVfa2V5bWFwX2xpc3QpOworCXdyaXRlX3VubG9ja19iaCgmbmZfY3RfZ3JlX2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9ncmVfa2V5bWFwX2FkZCk7CisKKy8qIGRlc3Ryb3kgdGhlIGtleW1hcCBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQgbWFzdGVyIGN0ICovCit2b2lkIG5mX2N0X2dyZV9rZXltYXBfZGVzdHJveShzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscCA9IG5mY3RfaGVscChjdCk7CisJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKKworCURFQlVHUCgiZW50ZXJpbmcgZm9yIGN0ICVwXG4iLCBjdCk7CisJQlVHX09OKHN0cmNtcChoZWxwLT5oZWxwZXItPm5hbWUsICJwcHRwIikpOworCisJd3JpdGVfbG9ja19iaCgmbmZfY3RfZ3JlX2xvY2spOworCWZvciAoZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOyBkaXIgPCBJUF9DVF9ESVJfTUFYOyBkaXIrKykgeworCQlpZiAoaGVscC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwW2Rpcl0pIHsKKwkJCURFQlVHUCgicmVtb3ZpbmcgJXAgZnJvbSBsaXN0XG4iLAorCQkJCWhlbHAtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcFtkaXJdKTsKKwkJCWxpc3RfZGVsKCZoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBbZGlyXS0+bGlzdCk7CisJCQlrZnJlZShoZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBbZGlyXSk7CisJCQloZWxwLT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBbZGlyXSA9IE5VTEw7CisJCX0KKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZuZl9jdF9ncmVfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3kpOworCisvKiBQVUJMSUMgQ09OTlRSQUNLIFBST1RPIEhFTFBFUiBGVU5DVElPTlMgKi8KKworLyogaW52ZXJ0IGdyZSBwYXJ0IG9mIHR1cGxlICovCitzdGF0aWMgaW50IGdyZV9pbnZlcnRfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZykKK3sKKwl0dXBsZS0+ZHN0LnUuZ3JlLmtleSA9IG9yaWctPnNyYy51LmdyZS5rZXk7CisJdHVwbGUtPnNyYy51LmdyZS5rZXkgPSBvcmlnLT5kc3QudS5ncmUua2V5OworCXJldHVybiAxOworfQorCisvKiBncmUgaGRyIGluZm8gdG8gdHVwbGUgKi8KK3N0YXRpYyBpbnQgZ3JlX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCisJCQkgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlzdHJ1Y3QgZ3JlX2hkcl9wcHRwIF9wZ3JlaGRyLCAqcGdyZWhkcjsKKwlfX2JlMTYgc3Jja2V5OworCXN0cnVjdCBncmVfaGRyIF9ncmVoZHIsICpncmVoZHI7CisKKwkvKiBmaXJzdCBvbmx5IGRlbGluZWFyaXplIG9sZCBSRkMxNzAxIEdSRSBoZWFkZXIgKi8KKwlncmVoZHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2dyZWhkciksICZfZ3JlaGRyKTsKKwlpZiAoIWdyZWhkciB8fCBncmVoZHItPnZlcnNpb24gIT0gR1JFX1ZFUlNJT05fUFBUUCkgeworCQkvKiB0cnkgdG8gYmVoYXZlIGxpa2UgIm5mX2Nvbm50cmFja19wcm90b19nZW5lcmljIiAqLworCQl0dXBsZS0+c3JjLnUuYWxsID0gMDsKKwkJdHVwbGUtPmRzdC51LmFsbCA9IDA7CisJCXJldHVybiAxOworCX0KKworCS8qIFBQVFAgaGVhZGVyIGlzIHZhcmlhYmxlIGxlbmd0aCwgb25seSBuZWVkIHVwIHRvIHRoZSBjYWxsX2lkIGZpZWxkICovCisJcGdyZWhkciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIDgsICZfcGdyZWhkcik7CisJaWYgKCFwZ3JlaGRyKQorCQlyZXR1cm4gMTsKKworCWlmIChudG9ocyhncmVoZHItPnByb3RvY29sKSAhPSBHUkVfUFJPVE9DT0xfUFBUUCkgeworCQlERUJVR1AoIkdSRV9WRVJTSU9OX1BQVFAgYnV0IHVua25vd24gcHJvdG9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0dXBsZS0+ZHN0LnUuZ3JlLmtleSA9IHBncmVoZHItPmNhbGxfaWQ7CisJc3Jja2V5ID0gZ3JlX2tleW1hcF9sb29rdXAodHVwbGUpOworCXR1cGxlLT5zcmMudS5ncmUua2V5ID0gc3Jja2V5OworCisJcmV0dXJuIDE7Cit9CisKKy8qIHByaW50IGdyZSBwYXJ0IG9mIHR1cGxlICovCitzdGF0aWMgaW50IGdyZV9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKK3sKKwlyZXR1cm4gc2VxX3ByaW50ZihzLCAic3Jja2V5PTB4JXggZHN0a2V5PTB4JXggIiwKKwkJCSAgbnRvaHModHVwbGUtPnNyYy51LmdyZS5rZXkpLAorCQkJICBudG9ocyh0dXBsZS0+ZHN0LnUuZ3JlLmtleSkpOworfQorCisvKiBwcmludCBwcml2YXRlIGRhdGEgZm9yIGNvbm50cmFjayAqLworc3RhdGljIGludCBncmVfcHJpbnRfY29ubnRyYWNrKHN0cnVjdCBzZXFfZmlsZSAqcywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJcmV0dXJuIHNlcV9wcmludGYocywgInRpbWVvdXQ9JXUsIHN0cmVhbV90aW1lb3V0PSV1ICIsCisJCQkgIChjdC0+cHJvdG8uZ3JlLnRpbWVvdXQgLyBIWiksCisJCQkgIChjdC0+cHJvdG8uZ3JlLnN0cmVhbV90aW1lb3V0IC8gSFopKTsKK30KKworLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIGFuZCBtYXkgbW9kaWZ5IGNvbm50cmFjayAqLworc3RhdGljIGludCBncmVfcGFja2V0KHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCisJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkgICAgICBpbnQgcGYsCisJCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKQoreworCS8qIElmIHdlJ3ZlIHNlZW4gdHJhZmZpYyBib3RoIHdheXMsIHRoaXMgaXMgYSBHUkUgY29ubmVjdGlvbi4KKwkgKiBFeHRlbmQgdGltZW91dC4gKi8KKwlpZiAoY3QtPnN0YXR1cyAmIElQU19TRUVOX1JFUExZKSB7CisJCW5mX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsCisJCQkJICAgY3QtPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCk7CisJCS8qIEFsc28sIG1vcmUgbGlrZWx5IHRvIGJlIGltcG9ydGFudCwgYW5kIG5vdCBhIHByb2JlLiAqLworCQlzZXRfYml0KElQU19BU1NVUkVEX0JJVCwgJmN0LT5zdGF0dXMpOworCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TVEFUVVMsIHNrYik7CisJfSBlbHNlCisJCW5mX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsCisJCQkJICAgY3QtPnByb3RvLmdyZS50aW1lb3V0KTsKKworCXJldHVybiBORl9BQ0NFUFQ7Cit9CisKKy8qIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoaXMgcHJvdG9jb2wgZm91bmQuICovCitzdGF0aWMgaW50IGdyZV9uZXcoc3RydWN0IG5mX2Nvbm4gKmN0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICB1bnNpZ25lZCBpbnQgZGF0YW9mZikKK3sKKwlERUJVR1AoIjogIik7CisJTkZfQ1RfRFVNUF9UVVBMRSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKTsKKworCS8qIGluaXRpYWxpemUgdG8gc2FuZSB2YWx1ZS4gIElkZWFsbHkgYSBjb25udHJhY2sgaGVscGVyCisJICogKGUuZy4gaW4gY2FzZSBvZiBwcHRwKSBpcyBpbmNyZWFzaW5nIHRoZW0gKi8KKwljdC0+cHJvdG8uZ3JlLnN0cmVhbV90aW1lb3V0ID0gR1JFX1NUUkVBTV9USU1FT1VUOworCWN0LT5wcm90by5ncmUudGltZW91dCA9IEdSRV9USU1FT1VUOworCisJcmV0dXJuIDE7Cit9CisKKy8qIENhbGxlZCB3aGVuIGEgY29ubnRyYWNrIGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBoYXNoZXMKKyAqIGFuZCBpcyBhYm91dCB0byBiZSBkZWxldGVkIGZyb20gbWVtb3J5ICovCitzdGF0aWMgdm9pZCBncmVfZGVzdHJveShzdHJ1Y3QgbmZfY29ubiAqY3QpCit7CisJc3RydWN0IG5mX2Nvbm4gKm1hc3RlciA9IGN0LT5tYXN0ZXI7CisJREVCVUdQKCIgZW50ZXJpbmdcbiIpOworCisJaWYgKCFtYXN0ZXIpCisJCURFQlVHUCgibm8gbWFzdGVyICE/IVxuIik7CisJZWxzZQorCQluZl9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3kobWFzdGVyKTsKK30KKworLyogcHJvdG9jb2wgaGVscGVyIHN0cnVjdCAqLworc3RhdGljIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b19ncmU0ID0geworCS5sM3Byb3RvCSA9IEFGX0lORVQsCisJLmw0cHJvdG8JID0gSVBQUk9UT19HUkUsCisJLm5hbWUJCSA9ICJncmUiLAorCS5wa3RfdG9fdHVwbGUJID0gZ3JlX3BrdF90b190dXBsZSwKKwkuaW52ZXJ0X3R1cGxlCSA9IGdyZV9pbnZlcnRfdHVwbGUsCisJLnByaW50X3R1cGxlCSA9IGdyZV9wcmludF90dXBsZSwKKwkucHJpbnRfY29ubnRyYWNrID0gZ3JlX3ByaW50X2Nvbm50cmFjaywKKwkucGFja2V0CQkgPSBncmVfcGFja2V0LAorCS5uZXcJCSA9IGdyZV9uZXcsCisJLmRlc3Ryb3kJID0gZ3JlX2Rlc3Ryb3ksCisJLm1lIAkJID0gVEhJU19NT0RVTEUsCisjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX05FVExJTkspIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTkVUTElOS19NT0RVTEUpCisJLnR1cGxlX3RvX25mYXR0ciA9IG5mX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyLAorCS5uZmF0dHJfdG9fdHVwbGUgPSBuZl9jdF9wb3J0X25mYXR0cl90b190dXBsZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgbmZfY3RfcHJvdG9fZ3JlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2dyZTQpOworfQorCitzdGF0aWMgdm9pZCBuZl9jdF9wcm90b19ncmVfZmluaSh2b2lkKQoreworCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2dyZTQpOworCW5mX2N0X2dyZV9rZXltYXBfZmx1c2goKTsKK30KKworbW9kdWxlX2luaXQobmZfY3RfcHJvdG9fZ3JlX2luaXQpOworbW9kdWxlX2V4aXQobmZfY3RfcHJvdG9fZ3JlX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKaW5kZXggYWY1Njg3Ny4uNzZlMjYzNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYwpAQCAtMzIsNyArMzIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b2NvbC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaD4KIAogI2lmIDAKICNkZWZpbmUgREVCVUdQKGZvcm1hdCwgLi4uKSBwcmludGsoZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKQEAgLTIxNiw3ICsyMTcsNyBAQAogZm9yIChvZmZzZXQgPSBkYXRhb2ZmICsgc2l6ZW9mKHNjdHBfc2N0cGhkcl90KSwgY291bnQgPSAwOwkJXAogCW9mZnNldCA8IHNrYi0+bGVuICYmCQkJCQkJXAogCShzY2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfc2NoKSwgJl9zY2gpKTsJXAotCW9mZnNldCArPSAoaHRvbnMoc2NoLT5sZW5ndGgpICsgMykgJiB+MywgY291bnQrKykKKwlvZmZzZXQgKz0gKG50b2hzKHNjaC0+bGVuZ3RoKSArIDMpICYgfjMsIGNvdW50KyspCiAKIC8qIFNvbWUgdmFsaWRpdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgY2h1bmtzIGFyZSBmaW5lICovCiBzdGF0aWMgaW50IGRvX2Jhc2ljX2NoZWNrcyhzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrLApAQCAtNTA4LDM2ICs1MDksMTAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfc2N0cDQgPSB7IAotCS5sM3Byb3RvCSA9IFBGX0lORVQsCi0JLnByb3RvIAkJID0gSVBQUk9UT19TQ1RQLCAKLQkubmFtZSAJCSA9ICJzY3RwIiwKLQkucGt0X3RvX3R1cGxlIAkgPSBzY3RwX3BrdF90b190dXBsZSwgCi0JLmludmVydF90dXBsZSAJID0gc2N0cF9pbnZlcnRfdHVwbGUsIAotCS5wcmludF90dXBsZSAJID0gc2N0cF9wcmludF90dXBsZSwgCi0JLnByaW50X2Nvbm50cmFjayA9IHNjdHBfcHJpbnRfY29ubnRyYWNrLAotCS5wYWNrZXQgCSA9IHNjdHBfcGFja2V0LCAKLQkubmV3IAkJID0gc2N0cF9uZXcsIAotCS5kZXN0cm95IAkgPSBOVUxMLCAKLQkubWUgCQkgPSBUSElTX01PRFVMRSAKLX07Ci0KLXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3NjdHA2ID0geyAKLQkubDNwcm90bwkgPSBQRl9JTkVUNiwKLQkucHJvdG8gCQkgPSBJUFBST1RPX1NDVFAsIAotCS5uYW1lIAkJID0gInNjdHAiLAotCS5wa3RfdG9fdHVwbGUgCSA9IHNjdHBfcGt0X3RvX3R1cGxlLCAKLQkuaW52ZXJ0X3R1cGxlIAkgPSBzY3RwX2ludmVydF90dXBsZSwgCi0JLnByaW50X3R1cGxlIAkgPSBzY3RwX3ByaW50X3R1cGxlLCAKLQkucHJpbnRfY29ubnRyYWNrID0gc2N0cF9wcmludF9jb25udHJhY2ssCi0JLnBhY2tldCAJID0gc2N0cF9wYWNrZXQsIAotCS5uZXcgCQkgPSBzY3RwX25ldywgCi0JLmRlc3Ryb3kgCSA9IE5VTEwsIAotCS5tZSAJCSA9IFRISVNfTU9EVUxFIAotfTsKLQogI2lmZGVmIENPTkZJR19TWVNDVEwKLXN0YXRpYyBjdGxfdGFibGUgbmZfY3Rfc3lzY3RsX3RhYmxlW10gPSB7CitzdGF0aWMgdW5zaWduZWQgaW50IHNjdHBfc3lzY3RsX3RhYmxlX3VzZXJzOworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzY3RwX3N5c2N0bF9oZWFkZXI7CitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBzY3RwX3N5c2N0bF90YWJsZVtdID0gewogCXsKIAkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ0xPU0VELAogCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3NjdHBfdGltZW91dF9jbG9zZWQiLApAQCAtNTk0LDYzICs1NjksMTM0IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAogCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBjdGxfdGFibGUgbmZfY3RfbmV0ZmlsdGVyX3RhYmxlW10gPSB7CiAJewotCQkuY3RsX25hbWUJPSBORVRfTkVURklMVEVSLAotCQkucHJvY25hbWUJPSAibmV0ZmlsdGVyIiwKLQkJLm1vZGUJCT0gMDU1NSwKLQkJLmNoaWxkCQk9IG5mX2N0X3N5c2N0bF90YWJsZSwKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9CisJCS5jdGxfbmFtZSA9IDAKKwl9CiB9OwogCi1zdGF0aWMgY3RsX3RhYmxlIG5mX2N0X25ldF90YWJsZVtdID0geworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHNjdHBfY29tcGF0X3N5c2N0bF90YWJsZVtdID0gewogCXsKLQkJLmN0bF9uYW1lCT0gQ1RMX05FVCwKLQkJLnByb2NuYW1lCT0gIm5ldCIsCi0JCS5tb2RlCQk9IDA1NTUsIAotCQkuY2hpbGQJCT0gbmZfY3RfbmV0ZmlsdGVyX3RhYmxlLAorCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NMT1NFRCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY2xvc2VkIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3NjdHBfdGltZW91dF9jbG9zZWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAogCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX1dBSVQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2Nvb2tpZV93YWl0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX0VDSE9FRCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY29va2llX2VjaG9lZCIsCisJCS5kYXRhCQk9ICZuZl9jdF9zY3RwX3RpbWVvdXRfY29va2llX2VjaG9lZCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfRVNUQUJMSVNIRUQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2VzdGFibGlzaGVkIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3NjdHBfdGltZW91dF9lc3RhYmxpc2hlZCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fU0VOVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfc2h1dGRvd25fc2VudCIsCisJCS5kYXRhCQk9ICZuZl9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fc2VudCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fUkVDRCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCIsCisJCS5kYXRhCQk9ICZuZl9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fQUNLX1NFTlQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX2Fja19zZW50IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZSA9IDAKKwl9CiB9OwotCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKm5mX2N0X3N5c2N0bF9oZWFkZXI7CisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwogI2VuZGlmCiAKK3N0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b19zY3RwNCA9IHsKKwkubDNwcm90bwkJPSBQRl9JTkVULAorCS5sNHByb3RvIAkJPSBJUFBST1RPX1NDVFAsCisJLm5hbWUgCQkJPSAic2N0cCIsCisJLnBrdF90b190dXBsZSAJCT0gc2N0cF9wa3RfdG9fdHVwbGUsCisJLmludmVydF90dXBsZSAJCT0gc2N0cF9pbnZlcnRfdHVwbGUsCisJLnByaW50X3R1cGxlIAkJPSBzY3RwX3ByaW50X3R1cGxlLAorCS5wcmludF9jb25udHJhY2sJPSBzY3RwX3ByaW50X2Nvbm50cmFjaywKKwkucGFja2V0IAkJPSBzY3RwX3BhY2tldCwKKwkubmV3IAkJCT0gc2N0cF9uZXcsCisJLm1lIAkJCT0gVEhJU19NT0RVTEUsCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCS5jdGxfdGFibGVfdXNlcnMJPSAmc2N0cF9zeXNjdGxfdGFibGVfdXNlcnMsCisJLmN0bF90YWJsZV9oZWFkZXIJPSAmc2N0cF9zeXNjdGxfaGVhZGVyLAorCS5jdGxfdGFibGUJCT0gc2N0cF9zeXNjdGxfdGFibGUsCisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAorCS5jdGxfY29tcGF0X3RhYmxlCT0gc2N0cF9jb21wYXRfc3lzY3RsX3RhYmxlLAorI2VuZGlmCisjZW5kaWYKK307CisKK3N0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b19zY3RwNiA9IHsKKwkubDNwcm90bwkJPSBQRl9JTkVUNiwKKwkubDRwcm90byAJCT0gSVBQUk9UT19TQ1RQLAorCS5uYW1lIAkJCT0gInNjdHAiLAorCS5wa3RfdG9fdHVwbGUgCQk9IHNjdHBfcGt0X3RvX3R1cGxlLAorCS5pbnZlcnRfdHVwbGUgCQk9IHNjdHBfaW52ZXJ0X3R1cGxlLAorCS5wcmludF90dXBsZSAJCT0gc2N0cF9wcmludF90dXBsZSwKKwkucHJpbnRfY29ubnRyYWNrCT0gc2N0cF9wcmludF9jb25udHJhY2ssCisJLnBhY2tldCAJCT0gc2N0cF9wYWNrZXQsCisJLm5ldyAJCQk9IHNjdHBfbmV3LAorCS5tZSAJCQk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX3VzZXJzCT0gJnNjdHBfc3lzY3RsX3RhYmxlX3VzZXJzLAorCS5jdGxfdGFibGVfaGVhZGVyCT0gJnNjdHBfc3lzY3RsX2hlYWRlciwKKwkuY3RsX3RhYmxlCQk9IHNjdHBfc3lzY3RsX3RhYmxlLAorI2VuZGlmCit9OworCiBpbnQgX19pbml0IG5mX2Nvbm50cmFja19wcm90b19zY3RwX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gbmZfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfc2N0cDQpOworCXJldCA9IG5mX2Nvbm50cmFja19sNHByb3RvX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19zY3RwNCk7CiAJaWYgKHJldCkgewotCQlwcmludGsoIm5mX2Nvbm50cmFja19wcm90b19zY3RwNDogcHJvdG9jb2wgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcHJpbnRrKCJuZl9jb25udHJhY2tfbDRwcm90b19zY3RwNDogcHJvdG9jb2wgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQotCXJldCA9IG5mX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3NjdHA2KTsKKwlyZXQgPSBuZl9jb25udHJhY2tfbDRwcm90b19yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDYpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKCJuZl9jb25udHJhY2tfcHJvdG9fc2N0cDY6IHByb3RvY29sIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByaW50aygibmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDY6IHByb3RvY29sIHJlZ2lzdGVyIGZhaWxlZFxuIik7CiAJCWdvdG8gY2xlYW51cF9zY3RwNDsKIAl9CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JbmZfY3Rfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShuZl9jdF9uZXRfdGFibGUsIDApOwotCWlmIChuZl9jdF9zeXNjdGxfaGVhZGVyID09IE5VTEwpIHsKLQkJcHJpbnRrKCJuZl9jb25udHJhY2tfcHJvdG9fc2N0cDogY2FuJ3QgcmVnaXN0ZXIgdG8gc3lzY3RsLlxuIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0jZW5kaWYKLQogCXJldHVybiByZXQ7CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0gY2xlYW51cDoKLQluZl9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX3Byb3RvY29sX3NjdHA2KTsKLSNlbmRpZgogIGNsZWFudXBfc2N0cDQ6Ci0JbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19wcm90b2NvbF9zY3RwNCk7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDQpOwogIG91dDoKIAlERUJVR1AoIlNDVFAgY29ubnRyYWNrIG1vZHVsZSBsb2FkaW5nICVzXG4iLCAKIAkJCQkJcmV0ID8gImZhaWxlZCI6ICJzdWNjZWVkZWQiKTsKQEAgLTY1OSwxMSArNzA1LDggQEAKIAogdm9pZCBfX2V4aXQgbmZfY29ubnRyYWNrX3Byb3RvX3NjdHBfZmluaSh2b2lkKQogewotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfc2N0cDYpOwotCW5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfcHJvdG9jb2xfc2N0cDQpOwotI2lmZGVmIENPTkZJR19TWVNDVEwKLSAJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUobmZfY3Rfc3lzY3RsX2hlYWRlcik7Ci0jZW5kaWYKKwluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b19zY3RwNik7CisJbmZfY29ubnRyYWNrX2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fc2N0cDQpOwogCURFQlVHUCgiU0NUUCBjb25udHJhY2sgbW9kdWxlIHVubG9hZGVkXG4iKTsKIH0KIApAQCAtNjczLDMgKzcxNiw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJLaXJhbiBLdW1hciBJbW1pZGkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgcHJvdG9jb2wgaGVscGVyIGZvciBTQ1RQIik7CitNT0RVTEVfQUxJQVMoImlwX2Nvbm50cmFja19wcm90b19zY3RwIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IDIzOGJiYjUuLjYyNmIwMDEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC00Miw3ICs0Miw4IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmg+CiAKICNpZiAwCiAjZGVmaW5lIERFQlVHUCBwcmludGsKQEAgLTkyLDIyICs5MywyMiBAQAogI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKICNkZWZpbmUgREFZUyAqIDI0IEhPVVJTCiAKLXVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9zeW5fc2VudCBfX3JlYWRfbW9zdGx5ID0gICAgICAyIE1JTlM7Ci11bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YgX19yZWFkX21vc3RseSA9ICAgICA2MCBTRUNTOwotdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkIF9fcmVhZF9tb3N0bHkgPSAgIDUgREFZUzsKLXVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9maW5fd2FpdCBfX3JlYWRfbW9zdGx5ID0gICAgICAyIE1JTlM7Ci11bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCBfX3JlYWRfbW9zdGx5ID0gICA2MCBTRUNTOwotdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrIF9fcmVhZF9tb3N0bHkgPSAgICAgMzAgU0VDUzsKLXVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQgX19yZWFkX21vc3RseSA9ICAgICAyIE1JTlM7Ci11bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2UgX19yZWFkX21vc3RseSA9ICAgICAgICAxMCBTRUNTOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9zeW5fc2VudCBfX3JlYWRfbW9zdGx5ID0gICAgICAyIE1JTlM7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2IF9fcmVhZF9tb3N0bHkgPSAgICAgNjAgU0VDUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQgX19yZWFkX21vc3RseSA9ICAgNSBEQVlTOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9maW5fd2FpdCBfX3JlYWRfbW9zdGx5ID0gICAgICAyIE1JTlM7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQgX19yZWFkX21vc3RseSA9ICAgNjAgU0VDUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2sgX19yZWFkX21vc3RseSA9ICAgICAzMCBTRUNTOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQgX19yZWFkX21vc3RseSA9ICAgICAyIE1JTlM7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlIF9fcmVhZF9tb3N0bHkgPSAgICAgICAgMTAgU0VDUzsKIAogLyogUkZDMTEyMiBzYXlzIHRoZSBSMiBsaW1pdCBzaG91bGQgYmUgYXQgbGVhc3QgMTAwIHNlY29uZHMuCiAgICBMaW51eCB1c2VzIDE1IHBhY2tldHMgYXMgbGltaXQsIHdoaWNoIGNvcnJlc3BvbmRzIAogICAgdG8gfjEzLTMwbWluIGRlcGVuZGluZyBvbiBSVE8uICovCi11bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMgX19yZWFkX21vc3RseSA9ICAgNSBNSU5TOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucyBfX3JlYWRfbW9zdGx5ID0gICA1IE1JTlM7CiAgCi1zdGF0aWMgdW5zaWduZWQgaW50ICogdGNwX3RpbWVvdXRzW10KLT0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRDUF9DT05OVFJBQ0tfTk9ORSAqLworc3RhdGljIHVuc2lnbmVkIGludCAqIHRjcF90aW1lb3V0c1tdID0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVENQX0NPTk5UUkFDS19OT05FICovCiAgICAgJm5mX2N0X3RjcF90aW1lb3V0X3N5bl9zZW50LCAgICAgICAvKiBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5ULCAqLwogICAgICZuZl9jdF90Y3BfdGltZW91dF9zeW5fcmVjdiwgICAgICAgLyogVENQX0NPTk5UUkFDS19TWU5fUkVDViwgKi8KICAgICAmbmZfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQsICAgIC8qIFRDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQsICovCkBAIC00NzMsOCArNDc0LDggQEAKIAogCS8qIEZhc3QgcGF0aCBmb3IgdGltZXN0YW1wLW9ubHkgb3B0aW9uICovCiAJaWYgKGxlbmd0aCA9PSBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEKjQKLQkgICAgJiYgKihfX3UzMiAqKXB0ciA9PQotCSAgICAgICAgX19jb25zdGFudF9udG9obCgoVENQT1BUX05PUCA8PCAyNCkgCisJICAgICYmICooX19iZTMyICopcHRyID09CisJICAgICAgICBfX2NvbnN0YW50X2h0b25sKChUQ1BPUFRfTk9QIDw8IDI0KQogCSAgICAgICAgCQkgfCAoVENQT1BUX05PUCA8PCAxNikKIAkgICAgICAgIAkJIHwgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkKIAkgICAgICAgIAkJIHwgVENQT0xFTl9USU1FU1RBTVApKQpAQCAtNTA1LDkgKzUwNiw3IEBACiAJCQkgICAgCWZvciAoaSA9IDA7CiAJCQkgICAgCSAgICAgaSA8IChvcHNpemUgLSBUQ1BPTEVOX1NBQ0tfQkFTRSk7CiAJCQkgICAgCSAgICAgaSArPSBUQ1BPTEVOX1NBQ0tfUEVSQkxPQ0spIHsKLQkJCQkJbWVtY3B5KCZ0bXAsIChfX3UzMiAqKShwdHIgKyBpKSArIDEsCi0JCQkJCSAgICAgICBzaXplb2YoX191MzIpKTsKLQkJCQkJdG1wID0gbnRvaGwodG1wKTsKKwkJCQkgICAgIAl0bXAgPSBudG9obCgqKChfX2JlMzIgKikocHRyK2kpKzEpKTsKIAogCQkJCQlpZiAoYWZ0ZXIodG1wLCAqc2FjaykpCiAJCQkJCQkqc2FjayA9IHRtcDsKQEAgLTczMSw3ICs3MzAsNyBAQAogCXJldHVybiByZXM7CiB9CiAKLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAorI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAvKiBVcGRhdGUgc2VuZGVyLT50ZF9lbmQgYWZ0ZXIgTkFUIHN1Y2Nlc3NmdWxseSBtYW5nbGVkIHRoZSBwYWNrZXQgKi8KIC8qIENhbGxlciBtdXN0IGxpbmVhcml6ZSBza2IgYXQgdGNwIGhlYWRlci4gKi8KIHZvaWQgbmZfY29ubnRyYWNrX3RjcF91cGRhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTc2Myw3ICs3NjIsNyBAQAogCQlyZWNlaXZlci0+dGRfZW5kLCByZWNlaXZlci0+dGRfbWF4ZW5kLCByZWNlaXZlci0+dGRfbWF4d2luLAogCQlyZWNlaXZlci0+dGRfc2NhbGUpOwogfQotIAorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3RjcF91cGRhdGUpOwogI2VuZGlmCiAKICNkZWZpbmUJVEhfRklOCTB4MDEKQEAgLTExNjcsMTEgKzExNjYsMjIxIEBACiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKLSAgCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF90Y3A0ID0KKworI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGNwX3N5c2N0bF90YWJsZV91c2VyczsKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqdGNwX3N5c2N0bF9oZWFkZXI7CitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSB0Y3Bfc3lzY3RsX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1NZTl9TRU5ULAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X3N5bl9zZW50IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X3N5bl9zZW50LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fUkVDViwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9zeW5fcmVjdiIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9zeW5fcmVjdiwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRVNUQUJMSVNIRUQsCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0ZJTl9XQUlULAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Zpbl93YWl0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2Zpbl93YWl0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9DTE9TRV9XQUlULAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTEFTVF9BQ0ssCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfbGFzdF9hY2siLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2ssCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1RJTUVfV0FJVCwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF90aW1lX3dhaXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9DTE9TRSwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZSIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9jbG9zZSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTUFYX1JFVFJBTlMsCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9MT09TRSwKKwkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfbG9vc2UiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX2xvb3NlLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX0JFX0xJQkVSQUwsCisJCS5wcm9jbmFtZSAgICAgICA9ICJuZl9jb25udHJhY2tfdGNwX2JlX2xpYmVyYWwiLAorCQkuZGF0YSAgICAgICAgICAgPSAmbmZfY3RfdGNwX2JlX2xpYmVyYWwsCisJCS5tYXhsZW4gICAgICAgICA9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZSAgICAgICAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyICAgPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfTUFYX1JFVFJBTlMsCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX21heF9yZXRyYW5zIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF9tYXhfcmV0cmFucywKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKKworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHRjcF9jb21wYXRfc3lzY3RsX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1NFTlQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3NlbnQiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1JFQ1YsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3JlY3YiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRVNUQUJMSVNIRUQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRklOX1dBSVQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfZmluX3dhaXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0VfV0FJVCwKKwkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZV93YWl0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTEFTVF9BQ0ssCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfbGFzdF9hY2siLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2ssCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfVElNRV9XQUlULAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X3RpbWVfd2FpdCIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0UsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfY2xvc2UiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2UsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTUFYX1JFVFJBTlMsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMiLAorCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX0xPT1NFLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF9sb29zZSIsCisJCS5kYXRhCQk9ICZuZl9jdF90Y3BfbG9vc2UsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9CRV9MSUJFUkFMLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF9iZV9saWJlcmFsIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF9iZV9saWJlcmFsLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfTUFYX1JFVFJBTlMsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX21heF9yZXRyYW5zIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3RjcF9tYXhfcmV0cmFucywKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKKyNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNCA9CiB7CiAJLmwzcHJvdG8JCT0gUEZfSU5FVCwKLQkucHJvdG8gCQkJPSBJUFBST1RPX1RDUCwKKwkubDRwcm90byAJCT0gSVBQUk9UT19UQ1AsCiAJLm5hbWUgCQkJPSAidGNwIiwKIAkucGt0X3RvX3R1cGxlIAkJPSB0Y3BfcGt0X3RvX3R1cGxlLAogCS5pbnZlcnRfdHVwbGUgCQk9IHRjcF9pbnZlcnRfdHVwbGUsCkBAIC0xMTg3LDEyICsxMzk2LDIxIEBACiAJLnR1cGxlX3RvX25mYXR0cgk9IG5mX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyLAogCS5uZmF0dHJfdG9fdHVwbGUJPSBuZl9jdF9wb3J0X25mYXR0cl90b190dXBsZSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX3VzZXJzCT0gJnRjcF9zeXNjdGxfdGFibGVfdXNlcnMsCisJLmN0bF90YWJsZV9oZWFkZXIJPSAmdGNwX3N5c2N0bF9oZWFkZXIsCisJLmN0bF90YWJsZQkJPSB0Y3Bfc3lzY3RsX3RhYmxlLAorI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKKwkuY3RsX2NvbXBhdF90YWJsZQk9IHRjcF9jb21wYXRfc3lzY3RsX3RhYmxlLAorI2VuZGlmCisjZW5kaWYKIH07CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDRwcm90b190Y3A0KTsKIAotc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCBuZl9jb25udHJhY2tfcHJvdG9jb2xfdGNwNiA9CitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNiA9CiB7CiAJLmwzcHJvdG8JCT0gUEZfSU5FVDYsCi0JLnByb3RvIAkJCT0gSVBQUk9UT19UQ1AsCisJLmw0cHJvdG8gCQk9IElQUFJPVE9fVENQLAogCS5uYW1lIAkJCT0gInRjcCIsCiAJLnBrdF90b190dXBsZSAJCT0gdGNwX3BrdF90b190dXBsZSwKIAkuaW52ZXJ0X3R1cGxlIAkJPSB0Y3BfaW52ZXJ0X3R1cGxlLApAQCAtMTIwOCw3ICsxNDI2LDEwIEBACiAJLnR1cGxlX3RvX25mYXR0cgk9IG5mX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyLAogCS5uZmF0dHJfdG9fdHVwbGUJPSBuZl9jdF9wb3J0X25mYXR0cl90b190dXBsZSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNDVEwKKwkuY3RsX3RhYmxlX3VzZXJzCT0gJnRjcF9zeXNjdGxfdGFibGVfdXNlcnMsCisJLmN0bF90YWJsZV9oZWFkZXIJPSAmdGNwX3N5c2N0bF9oZWFkZXIsCisJLmN0bF90YWJsZQkJPSB0Y3Bfc3lzY3RsX3RhYmxlLAorI2VuZGlmCiB9OwotCi1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19wcm90b2NvbF90Y3A0KTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX3Byb3RvY29sX3RjcDYpOworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2w0cHJvdG9fdGNwNik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCmluZGV4IGQyODk4MWMuLmU0OWNkMjUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCkBAIC0yMiwxMyArMjIsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgogCi11bnNpZ25lZCBpbnQgbmZfY3RfdWRwX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDMwKkhaOwotdW5zaWduZWQgaW50IG5mX2N0X3VkcF90aW1lb3V0X3N0cmVhbSBfX3JlYWRfbW9zdGx5ID0gMTgwKkhaOworc3RhdGljIHVuc2lnbmVkIGludCBuZl9jdF91ZHBfdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gMzAqSFo7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X3VkcF90aW1lb3V0X3N0cmVhbSBfX3JlYWRfbW9zdGx5ID0gMTgwKkhaOwogCiBzdGF0aWMgaW50IHVkcF9wa3RfdG9fdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCkBAIC0xNDYsMTAgKzE0OCw1OSBAQAogCXJldHVybiBORl9BQ0NFUFQ7CiB9CiAKLXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgbmZfY29ubnRyYWNrX3Byb3RvY29sX3VkcDQgPQorI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdWRwX3N5c2N0bF90YWJsZV91c2VyczsKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqdWRwX3N5c2N0bF9oZWFkZXI7CitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSB1ZHBfc3lzY3RsX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VULAorCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3VkcF90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJm5mX2N0X3VkcF90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19VRFBfVElNRU9VVF9TVFJFQU0sCisJCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdWRwX3RpbWVvdXRfc3RyZWFtIiwKKwkJLmRhdGEJCT0gJm5mX2N0X3VkcF90aW1lb3V0X3N0cmVhbSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAKKwl9Cit9OworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHVkcF9jb21wYXRfc3lzY3RsX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdWRwX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmbmZfY3RfdWRwX3RpbWVvdXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVRfU1RSRUFNLAorCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3VkcF90aW1lb3V0X3N0cmVhbSIsCisJCS5kYXRhCQk9ICZuZl9jdF91ZHBfdGltZW91dF9zdHJlYW0sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKKyNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCitzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNCA9CiB7CiAJLmwzcHJvdG8JCT0gUEZfSU5FVCwKLQkucHJvdG8JCQk9IElQUFJPVE9fVURQLAorCS5sNHByb3RvCQk9IElQUFJPVE9fVURQLAogCS5uYW1lCQkJPSAidWRwIiwKIAkucGt0X3RvX3R1cGxlCQk9IHVkcF9wa3RfdG9fdHVwbGUsCiAJLmludmVydF90dXBsZQkJPSB1ZHBfaW52ZXJ0X3R1cGxlLApAQCAtMTYzLDEyICsyMTQsMjEgQEAKIAkudHVwbGVfdG9fbmZhdHRyCT0gbmZfY3RfcG9ydF90dXBsZV90b19uZmF0dHIsCiAJLm5mYXR0cl90b190dXBsZQk9IG5mX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCS5jdGxfdGFibGVfdXNlcnMJPSAmdWRwX3N5c2N0bF90YWJsZV91c2VycywKKwkuY3RsX3RhYmxlX2hlYWRlcgk9ICZ1ZHBfc3lzY3RsX2hlYWRlciwKKwkuY3RsX3RhYmxlCQk9IHVkcF9zeXNjdGxfdGFibGUsCisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAorCS5jdGxfY29tcGF0X3RhYmxlCT0gdWRwX2NvbXBhdF9zeXNjdGxfdGFibGUsCisjZW5kaWYKKyNlbmRpZgogfTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sNHByb3RvX3VkcDQpOwogCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sIG5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA2ID0KK3N0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b191ZHA2ID0KIHsKIAkubDNwcm90bwkJPSBQRl9JTkVUNiwKLQkucHJvdG8JCQk9IElQUFJPVE9fVURQLAorCS5sNHByb3RvCQk9IElQUFJPVE9fVURQLAogCS5uYW1lCQkJPSAidWRwIiwKIAkucGt0X3RvX3R1cGxlCQk9IHVkcF9wa3RfdG9fdHVwbGUsCiAJLmludmVydF90dXBsZQkJPSB1ZHBfaW52ZXJ0X3R1cGxlLApAQCAtMTgyLDcgKzI0MiwxMCBAQAogCS50dXBsZV90b19uZmF0dHIJPSBuZl9jdF9wb3J0X3R1cGxlX3RvX25mYXR0ciwKIAkubmZhdHRyX3RvX3R1cGxlCT0gbmZfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJLmN0bF90YWJsZV91c2Vycwk9ICZ1ZHBfc3lzY3RsX3RhYmxlX3VzZXJzLAorCS5jdGxfdGFibGVfaGVhZGVyCT0gJnVkcF9zeXNjdGxfaGVhZGVyLAorCS5jdGxfdGFibGUJCT0gdWRwX3N5c2N0bF90YWJsZSwKKyNlbmRpZgogfTsKLQotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfcHJvdG9jb2xfdWRwNCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19wcm90b2NvbF91ZHA2KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19sNHByb3RvX3VkcDYpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJhMjQxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2lwLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qIFNJUCBleHRlbnNpb24gZm9yIElQIGNvbm5lY3Rpb24gdHJhY2tpbmcuCisgKgorICogKEMpIDIwMDUgYnkgQ2hyaXN0aWFuIEhlbnRzY2hlbCA8Y2hlbnRzY2hlbEBhcm5ldC5jb20uYXI+CisgKiBiYXNlZCBvbiBSUidzIGlwX2Nvbm50cmFja19mdHAuYyBhbmQgb3RoZXIgbW9kdWxlcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5oPgorCisjaWYgMAorI2RlZmluZSBERUJVR1AgcHJpbnRrCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkNocmlzdGlhbiBIZW50c2NoZWwgPGNoZW50c2NoZWxAYXJuZXQuY29tLmFyPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSVAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrX3NpcCIpOworCisjZGVmaW5lIE1BWF9QT1JUUwk4CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydHNbTUFYX1BPUlRTXTsKK3N0YXRpYyBpbnQgcG9ydHNfYzsKK21vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgdXNob3J0LCAmcG9ydHNfYywgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvcnRzLCAicG9ydCBudW1iZXJzIG9mIFNJUCBzZXJ2ZXJzIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2lwX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IFNJUF9USU1FT1VUOworbW9kdWxlX3BhcmFtKHNpcF90aW1lb3V0LCB1aW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2lwX3RpbWVvdXQsICJ0aW1lb3V0IGZvciB0aGUgbWFzdGVyIFNJUCBzZXNzaW9uIik7CisKK3Vuc2lnbmVkIGludCAoKm5mX25hdF9zaXBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCXN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQljb25zdCBjaGFyICoqZHB0cikgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9zaXBfaG9vayk7CisKK3Vuc2lnbmVkIGludCAoKm5mX25hdF9zZHBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAorCQkJCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAsCisJCQkJY29uc3QgY2hhciAqZHB0cikgX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9zZHBfaG9vayk7CisKK3N0YXRpYyBpbnQgZGlnaXRzX2xlbihzdHJ1Y3QgbmZfY29ubiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworc3RhdGljIGludCBlcGFkZHJfbGVuKHN0cnVjdCBuZl9jb25uICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitzdGF0aWMgaW50IHNrcF9kaWdpdHNfbGVuKHN0cnVjdCBuZl9jb25uICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CitzdGF0aWMgaW50IHNrcF9lcGFkZHJfbGVuKHN0cnVjdCBuZl9jb25uICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgKik7CisKK3N0cnVjdCBzaXBfaGVhZGVyX25mbyB7CisJY29uc3QgY2hhcgkqbG5hbWU7CisJY29uc3QgY2hhcgkqc25hbWU7CisJY29uc3QgY2hhcgkqbG5fc3RyOworCXNpemVfdAkJbG5sZW47CisJc2l6ZV90CQlzbmxlbjsKKwlzaXplX3QJCWxuX3N0cmxlbjsKKwlpbnQJCWNhc2Vfc2Vuc2l0aXZlOworCWludAkJKCptYXRjaF9sZW4pKHN0cnVjdCBuZl9jb25uICosIGNvbnN0IGNoYXIgKiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKiwgaW50ICopOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaXBfaGVhZGVyX25mbyBjdF9zaXBfaGRyc1tdID0geworCVtQT1NfUkVHX1JFUV9VUkldID0geyAJLyogU0lQIFJFR0lTVEVSIHJlcXVlc3QgVVJJICovCisJCS5sbmFtZQkJPSAic2lwOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoInNpcDoiKSAtIDEsCisJCS5sbl9zdHIJCT0gIjoiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCI6IikgLSAxLAorCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbiwKKwl9LAorCVtQT1NfUkVRX1VSSV0gPSB7IAkvKiBTSVAgcmVxdWVzdCBVUkkgKi8KKwkJLmxuYW1lCQk9ICJzaXA6IiwKKwkJLmxubGVuCQk9IHNpemVvZigic2lwOiIpIC0gMSwKKwkJLmxuX3N0cgkJPSAiQCIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoIkAiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuLAorCX0sCisJW1BPU19GUk9NXSA9IHsJCS8qIFNJUCBGcm9tIGhlYWRlciAqLworCQkubG5hbWUJCT0gIkZyb206IiwKKwkJLmxubGVuCQk9IHNpemVvZigiRnJvbToiKSAtIDEsCisJCS5zbmFtZQkJPSAiXHJcbmY6IiwKKwkJLnNubGVuCQk9IHNpemVvZigiXHJcbmY6IikgLSAxLAorCQkubG5fc3RyCQk9ICJzaXA6IiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigic2lwOiIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IHNrcF9lcGFkZHJfbGVuLAorCX0sCisJW1BPU19UT10gPSB7CQkvKiBTSVAgVG8gaGVhZGVyICovCisJCS5sbmFtZQkJPSAiVG86IiwKKwkJLmxubGVuCQk9IHNpemVvZigiVG86IikgLSAxLAorCQkuc25hbWUJCT0gIlxyXG50OiIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxyXG50OiIpIC0gMSwKKwkJLmxuX3N0cgkJPSAic2lwOiIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoInNpcDoiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBza3BfZXBhZGRyX2xlbgorCX0sCisJW1BPU19WSUFdID0geyAJCS8qIFNJUCBWaWEgaGVhZGVyICovCisJCS5sbmFtZQkJPSAiVmlhOiIsCisJCS5sbmxlbgkJPSBzaXplb2YoIlZpYToiKSAtIDEsCisJCS5zbmFtZQkJPSAiXHJcbnY6IiwKKwkJLnNubGVuCQk9IHNpemVvZigiXHJcbnY6IikgLSAxLCAvKiByZmMzMjYxICJcclxuIiAqLworCQkubG5fc3RyCQk9ICJVRFAgIiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigiVURQICIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4sCisJfSwKKwlbUE9TX0NPTlRBQ1RdID0geyAJLyogU0lQIENvbnRhY3QgaGVhZGVyICovCisJCS5sbmFtZQkJPSAiQ29udGFjdDoiLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJDb250YWN0OiIpIC0gMSwKKwkJLnNuYW1lCQk9ICJcclxubToiLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJcclxubToiKSAtIDEsCisJCS5sbl9zdHIJCT0gInNpcDoiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAorCQkubWF0Y2hfbGVuCT0gc2twX2VwYWRkcl9sZW4KKwl9LAorCVtQT1NfQ09OVEVOVF0gPSB7IAkvKiBTSVAgQ29udGVudCBsZW5ndGggaGVhZGVyICovCisJCS5sbmFtZQkJPSAiQ29udGVudC1MZW5ndGg6IiwKKwkJLmxubGVuCQk9IHNpemVvZigiQ29udGVudC1MZW5ndGg6IikgLSAxLAorCQkuc25hbWUJCT0gIlxyXG5sOiIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxyXG5sOiIpIC0gMSwKKwkJLmxuX3N0cgkJPSAiOiIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoIjoiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBza3BfZGlnaXRzX2xlbgorCX0sCisJW1BPU19NRURJQV0gPSB7CQkvKiBTRFAgbWVkaWEgaW5mbyAqLworCQkuY2FzZV9zZW5zaXRpdmUJPSAxLAorCQkubG5hbWUJCT0gIlxubT0iLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJcbm09IikgLSAxLAorCQkuc25hbWUJCT0gIlxybT0iLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJccm09IikgLSAxLAorCQkubG5fc3RyCQk9ICJhdWRpbyAiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJhdWRpbyAiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBkaWdpdHNfbGVuCisJfSwKKwlbUE9TX09XTkVSX0lQNF0gPSB7CS8qIFNEUCBvd25lciBhZGRyZXNzKi8KKwkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKKwkJLmxuYW1lCQk9ICJcbm89IiwKKwkJLmxubGVuCQk9IHNpemVvZigiXG5vPSIpIC0gMSwKKwkJLnNuYW1lCQk9ICJccm89IiwKKwkJLnNubGVuCQk9IHNpemVvZigiXHJvPSIpIC0gMSwKKwkJLmxuX3N0cgkJPSAiSU4gSVA0ICIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoIklOIElQNCAiKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCisJfSwKKwlbUE9TX0NPTk5FQ1RJT05fSVA0XSA9IHsvKiBTRFAgY29ubmVjdGlvbiBpbmZvICovCisJCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCisJCS5sbmFtZQkJPSAiXG5jPSIsCisJCS5sbmxlbgkJPSBzaXplb2YoIlxuYz0iKSAtIDEsCisJCS5zbmFtZQkJPSAiXHJjPSIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxyYz0iKSAtIDEsCisJCS5sbl9zdHIJCT0gIklOIElQNCAiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJJTiBJUDQgIikgLSAxLAorCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbgorCX0sCisJW1BPU19PV05FUl9JUDZdID0gewkvKiBTRFAgb3duZXIgYWRkcmVzcyovCisJCS5jYXNlX3NlbnNpdGl2ZQk9IDEsCisJCS5sbmFtZQkJPSAiXG5vPSIsCisJCS5sbmxlbgkJPSBzaXplb2YoIlxubz0iKSAtIDEsCisJCS5zbmFtZQkJPSAiXHJvPSIsCisJCS5zbmxlbgkJPSBzaXplb2YoIlxybz0iKSAtIDEsCisJCS5sbl9zdHIJCT0gIklOIElQNiAiLAorCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJJTiBJUDYgIikgLSAxLAorCQkubWF0Y2hfbGVuCT0gZXBhZGRyX2xlbgorCX0sCisJW1BPU19DT05ORUNUSU9OX0lQNl0gPSB7LyogU0RQIGNvbm5lY3Rpb24gaW5mbyAqLworCQkuY2FzZV9zZW5zaXRpdmUJPSAxLAorCQkubG5hbWUJCT0gIlxuYz0iLAorCQkubG5sZW4JCT0gc2l6ZW9mKCJcbmM9IikgLSAxLAorCQkuc25hbWUJCT0gIlxyYz0iLAorCQkuc25sZW4JCT0gc2l6ZW9mKCJccmM9IikgLSAxLAorCQkubG5fc3RyCQk9ICJJTiBJUDYgIiwKKwkJLmxuX3N0cmxlbgk9IHNpemVvZigiSU4gSVA2ICIpIC0gMSwKKwkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KKwl9LAorCVtQT1NfU0RQX0hFQURFUl0gPSB7IAkvKiBTRFAgdmVyc2lvbiBoZWFkZXIgKi8KKwkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKKwkJLmxuYW1lCQk9ICJcbnY9IiwKKwkJLmxubGVuCQk9IHNpemVvZigiXG52PSIpIC0gMSwKKwkJLnNuYW1lCQk9ICJccnY9IiwKKwkJLnNubGVuCQk9IHNpemVvZigiXHJ2PSIpIC0gMSwKKwkJLmxuX3N0cgkJPSAiPSIsCisJCS5sbl9zdHJsZW4JPSBzaXplb2YoIj0iKSAtIDEsCisJCS5tYXRjaF9sZW4JPSBkaWdpdHNfbGVuCisJfQorfTsKKworLyogZ2V0IGxpbmUgbGVuZ2h0IHVudGlsIGZpcnN0IENSIG9yIExGIHNlZW4uICovCitpbnQgY3Rfc2lwX2xubGVuKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmxpbWl0KQoreworCWNvbnN0IGNoYXIgKmsgPSBsaW5lOworCisJd2hpbGUgKChsaW5lIDw9IGxpbWl0KSAmJiAoKmxpbmUgPT0gJ1xyJyB8fCAqbGluZSA9PSAnXG4nKSkKKwkJbGluZSsrOworCisJd2hpbGUgKGxpbmUgPD0gbGltaXQpIHsKKwkJaWYgKCpsaW5lID09ICdccicgfHwgKmxpbmUgPT0gJ1xuJykKKwkJCWJyZWFrOworCQlsaW5lKys7CisJfQorCXJldHVybiBsaW5lIC0gazsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGN0X3NpcF9sbmxlbik7CisKKy8qIExpbmVhciBzdHJpbmcgc2VhcmNoLCBjYXNlIHNlbnNpdGl2ZS4gKi8KK2NvbnN0IGNoYXIgKmN0X3NpcF9zZWFyY2goY29uc3QgY2hhciAqbmVlZGxlLCBjb25zdCBjaGFyICpoYXlzdGFjaywKKwkJCSAgc2l6ZV90IG5lZWRsZV9sZW4sIHNpemVfdCBoYXlzdGFja19sZW4sCisJCQkgIGludCBjYXNlX3NlbnNpdGl2ZSkKK3sKKwljb25zdCBjaGFyICpsaW1pdCA9IGhheXN0YWNrICsgKGhheXN0YWNrX2xlbiAtIG5lZWRsZV9sZW4pOworCisJd2hpbGUgKGhheXN0YWNrIDw9IGxpbWl0KSB7CisJCWlmIChjYXNlX3NlbnNpdGl2ZSkgeworCQkJaWYgKHN0cm5jbXAoaGF5c3RhY2ssIG5lZWRsZSwgbmVlZGxlX2xlbikgPT0gMCkKKwkJCQlyZXR1cm4gaGF5c3RhY2s7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RybmljbXAoaGF5c3RhY2ssIG5lZWRsZSwgbmVlZGxlX2xlbikgPT0gMCkKKwkJCQlyZXR1cm4gaGF5c3RhY2s7CisJCX0KKwkJaGF5c3RhY2srKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjdF9zaXBfc2VhcmNoKTsKKworc3RhdGljIGludCBkaWdpdHNfbGVuKHN0cnVjdCBuZl9jb25uICpjdCwgY29uc3QgY2hhciAqZHB0ciwKKwkJICAgICAgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpCit7CisJaW50IGxlbiA9IDA7CisJd2hpbGUgKGRwdHIgPD0gbGltaXQgJiYgaXNkaWdpdCgqZHB0cikpIHsKKwkJZHB0cisrOworCQlsZW4rKzsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogZ2V0IGRpZ2l0cyBsZW5naHQsIHNraXBpbmcgYmxhbmsgc3BhY2VzLiAqLworc3RhdGljIGludCBza3BfZGlnaXRzX2xlbihzdHJ1Y3QgbmZfY29ubiAqY3QsIGNvbnN0IGNoYXIgKmRwdHIsCisJCQkgIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KQoreworCWZvciAoOyBkcHRyIDw9IGxpbWl0ICYmICpkcHRyID09ICcgJzsgZHB0cisrKQorCQkoKnNoaWZ0KSsrOworCisJcmV0dXJuIGRpZ2l0c19sZW4oY3QsIGRwdHIsIGxpbWl0LCBzaGlmdCk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYWRkcihzdHJ1Y3QgbmZfY29ubiAqY3QsIGNvbnN0IGNoYXIgKmNwLCBjb25zdCBjaGFyICoqZW5kcCwKKwkJICAgICAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsIGNvbnN0IGNoYXIgKmxpbWl0KQoreworCWNvbnN0IGNoYXIgKmVuZDsKKwlpbnQgZmFtaWx5ID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlyZXQgPSBpbjRfcHRvbihjcCwgbGltaXQgLSBjcCwgKHU4ICopJmFkZHItPmlwLCAtMSwgJmVuZCk7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCXJldCA9IGluNl9wdG9uKGNwLCBsaW1pdCAtIGNwLCAodTggKikmYWRkci0+aXA2LCAtMSwgJmVuZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWlmIChyZXQgPT0gMCB8fCBlbmQgPT0gY3ApCisJCXJldHVybiAwOworCWlmIChlbmRwKQorCQkqZW5kcCA9IGVuZDsKKwlyZXR1cm4gMTsKK30KKworLyogc2tpcCBpcCBhZGRyZXNzLiByZXR1cm5zIGl0cyBsZW5ndGguICovCitzdGF0aWMgaW50IGVwYWRkcl9sZW4oc3RydWN0IG5mX2Nvbm4gKmN0LCBjb25zdCBjaGFyICpkcHRyLAorCQkgICAgICBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCkKK3sKKwl1bmlvbiBuZl9jb25udHJhY2tfYWRkcmVzcyBhZGRyOworCWNvbnN0IGNoYXIgKmF1eCA9IGRwdHI7CisKKwlpZiAoIXBhcnNlX2FkZHIoY3QsIGRwdHIsICZkcHRyLCAmYWRkciwgbGltaXQpKSB7CisJCURFQlVHUCgiaXA6ICVzIHBhcnNlIGZhaWxlZC4hXG4iLCBkcHRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUG9ydCBudW1iZXIgKi8KKwlpZiAoKmRwdHIgPT0gJzonKSB7CisJCWRwdHIrKzsKKwkJZHB0ciArPSBkaWdpdHNfbGVuKGN0LCBkcHRyLCBsaW1pdCwgc2hpZnQpOworCX0KKwlyZXR1cm4gZHB0ciAtIGF1eDsKK30KKworLyogZ2V0IGFkZHJlc3MgbGVuZ3RoLCBza2lwaW5nIHVzZXIgaW5mby4gKi8KK3N0YXRpYyBpbnQgc2twX2VwYWRkcl9sZW4oc3RydWN0IG5mX2Nvbm4gKmN0LCBjb25zdCBjaGFyICpkcHRyLAorCQkJICBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCkKK3sKKwlpbnQgcyA9ICpzaGlmdDsKKworCWZvciAoOyBkcHRyIDw9IGxpbWl0ICYmICpkcHRyICE9ICdAJzsgZHB0cisrKQorCQkoKnNoaWZ0KSsrOworCisJaWYgKCpkcHRyID09ICdAJykgeworCQlkcHRyKys7CisJCSgqc2hpZnQpKys7CisJfSBlbHNlCisJCSpzaGlmdCA9IHM7CisKKwlyZXR1cm4gZXBhZGRyX2xlbihjdCwgZHB0ciwgbGltaXQsIHNoaWZ0KTsKK30KKworLyogUmV0dXJucyAwIGlmIG5vdCBmb3VuZCwgLTEgZXJyb3IgcGFyc2luZy4gKi8KK2ludCBjdF9zaXBfZ2V0X2luZm8oc3RydWN0IG5mX2Nvbm4gKmN0LAorCQkgICAgY29uc3QgY2hhciAqZHB0ciwgc2l6ZV90IGRsZW4sCisJCSAgICB1bnNpZ25lZCBpbnQgKm1hdGNob2ZmLAorCQkgICAgdW5zaWduZWQgaW50ICptYXRjaGxlbiwKKwkJICAgIGVudW0gc2lwX2hlYWRlcl9wb3MgcG9zKQoreworCWNvbnN0IHN0cnVjdCBzaXBfaGVhZGVyX25mbyAqaG5mbyA9ICZjdF9zaXBfaGRyc1twb3NdOworCWNvbnN0IGNoYXIgKmxpbWl0LCAqYXV4LCAqayA9IGRwdHI7CisJaW50IHNoaWZ0ID0gMDsKKworCWxpbWl0ID0gZHB0ciArIChkbGVuIC0gaG5mby0+bG5sZW4pOworCisJd2hpbGUgKGRwdHIgPD0gbGltaXQpIHsKKwkJaWYgKChzdHJuY21wKGRwdHIsIGhuZm8tPmxuYW1lLCBobmZvLT5sbmxlbikgIT0gMCkgJiYKKwkJICAgIChzdHJuY21wKGRwdHIsIGhuZm8tPnNuYW1lLCBobmZvLT5zbmxlbikgIT0gMCkpIHsKKwkJCWRwdHIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWF1eCA9IGN0X3NpcF9zZWFyY2goaG5mby0+bG5fc3RyLCBkcHRyLCBobmZvLT5sbl9zdHJsZW4sCisJCSAgICAgICAgICAgICAgICAgICAgY3Rfc2lwX2xubGVuKGRwdHIsIGxpbWl0KSwKKwkJCQkgICAgaG5mby0+Y2FzZV9zZW5zaXRpdmUpOworCQlpZiAoIWF1eCkgeworCQkJREVCVUdQKCInJXMnIG5vdCBmb3VuZCBpbiAnJXMnLlxuIiwgaG5mby0+bG5fc3RyLAorCQkJICAgICAgIGhuZm8tPmxuYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhdXggKz0gaG5mby0+bG5fc3RybGVuOworCisJCSptYXRjaGxlbiA9IGhuZm8tPm1hdGNoX2xlbihjdCwgYXV4LCBsaW1pdCwgJnNoaWZ0KTsKKwkJaWYgKCEqbWF0Y2hsZW4pCisJCQlyZXR1cm4gLTE7CisKKwkJKm1hdGNob2ZmID0gKGF1eCAtIGspICsgc2hpZnQ7CisKKwkJREVCVUdQKCIlcyBtYXRjaCBzdWNjZWVkZWQhIC0gbGVuOiAldVxuIiwgaG5mby0+bG5hbWUsCisJCSAgICAgICAqbWF0Y2hsZW4pOworCQlyZXR1cm4gMTsKKwl9CisJREVCVUdQKCIlcyBoZWFkZXIgbm90IGZvdW5kLlxuIiwgaG5mby0+bG5hbWUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3Rfc2lwX2dldF9pbmZvKTsKKworc3RhdGljIGludCBzZXRfZXhwZWN0ZWRfcnRwKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkgICAgdW5pb24gbmZfY29ubnRyYWNrX2FkZHJlc3MgKmFkZHIsCisJCQkgICAgX19iZTE2IHBvcnQsCisJCQkgICAgY29uc3QgY2hhciAqZHB0cikKK3sKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOworCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CisJaW50IGZhbWlseSA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmwzbnVtOworCWludCByZXQ7CisJdHlwZW9mKG5mX25hdF9zZHBfaG9vaykgbmZfbmF0X3NkcDsKKworCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOworCWlmIChleHAgPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0RST1A7CisJbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KGV4cCwgZmFtaWx5LAorCQkJCSAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMudTMsIGFkZHIsCisJCQkJIElQUFJPVE9fVURQLCBOVUxMLCAmcG9ydCk7CisKKwluZl9uYXRfc2RwID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF9zZHBfaG9vayk7CisJaWYgKG5mX25hdF9zZHAgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykKKwkJcmV0ID0gbmZfbmF0X3NkcChwc2tiLCBjdGluZm8sIGV4cCwgZHB0cik7CisJZWxzZSB7CisJCWlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQorCQkJcmV0ID0gTkZfRFJPUDsKKwkJZWxzZQorCQkJcmV0ID0gTkZfQUNDRVBUOworCX0KKwluZl9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzaXBfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJCSAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQoreworCWludCBmYW1pbHkgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtOworCXVuaW9uIG5mX2Nvbm50cmFja19hZGRyZXNzIGFkZHI7CisJdW5zaWduZWQgaW50IGRhdGFvZmYsIGRhdGFsZW47CisJY29uc3QgY2hhciAqZHB0cjsKKwlpbnQgcmV0ID0gTkZfQUNDRVBUOworCWludCBtYXRjaG9mZiwgbWF0Y2hsZW47CisJdV9pbnQxNl90IHBvcnQ7CisJZW51bSBzaXBfaGVhZGVyX3BvcyBwb3M7CisJdHlwZW9mKG5mX25hdF9zaXBfaG9vaykgbmZfbmF0X3NpcDsKKworCS8qIE5vIERhdGEgPyAqLworCWRhdGFvZmYgPSBwcm90b2ZmICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCW5mX2N0X3JlZnJlc2goY3QsICpwc2tiLCBzaXBfdGltZW91dCAqIEhaKTsKKworCWlmICghc2tiX2lzX25vbmxpbmVhcigqcHNrYikpCisJCWRwdHIgPSAoKnBza2IpLT5kYXRhICsgZGF0YW9mZjsKKwllbHNlIHsKKwkJREVCVUdQKCJDb3B5IG9mIHNrYnVmZiBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwluZl9uYXRfc2lwID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF9zaXBfaG9vayk7CisJaWYgKG5mX25hdF9zaXAgJiYgY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykgeworCQlpZiAoIW5mX25hdF9zaXAocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIpKSB7CisJCQlyZXQgPSBORl9EUk9QOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKKwlpZiAoZGF0YWxlbiA8IHNpemVvZigiU0lQLzIuMCAyMDAiKSAtIDEpCisJCWdvdG8gb3V0OworCisJLyogUlRQIGluZm8gb25seSBpbiBzb21lIFNEUCBwa3RzICovCisJaWYgKG1lbWNtcChkcHRyLCAiSU5WSVRFIiwgc2l6ZW9mKCJJTlZJVEUiKSAtIDEpICE9IDAgJiYKKwkgICAgbWVtY21wKGRwdHIsICJTSVAvMi4wIDIwMCIsIHNpemVvZigiU0lQLzIuMCAyMDAiKSAtIDEpICE9IDApIHsKKwkJZ290byBvdXQ7CisJfQorCS8qIEdldCBhZGRyZXNzIGFuZCBwb3J0IGZyb20gU0RQIHBhY2tldC4gKi8KKwlwb3MgPSBmYW1pbHkgPT0gQUZfSU5FVCA/IFBPU19DT05ORUNUSU9OX0lQNCA6IFBPU19DT05ORUNUSU9OX0lQNjsKKwlpZiAoY3Rfc2lwX2dldF9pbmZvKGN0LCBkcHRyLCBkYXRhbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwgcG9zKSA+IDApIHsKKworCQkvKiBXZSdsbCBkcm9wIG9ubHkgaWYgdGhlcmUgYXJlIHBhcnNlIHByb2JsZW1zLiAqLworCQlpZiAoIXBhcnNlX2FkZHIoY3QsIGRwdHIgKyBtYXRjaG9mZiwgTlVMTCwgJmFkZHIsCisJCQkgICAgICAgIGRwdHIgKyBkYXRhbGVuKSkgeworCQkJcmV0ID0gTkZfRFJPUDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChjdF9zaXBfZ2V0X2luZm8oY3QsIGRwdHIsIGRhdGFsZW4sICZtYXRjaG9mZiwgJm1hdGNobGVuLAorCQkgICAgICAgICAgICAgICAgICAgIFBPU19NRURJQSkgPiAwKSB7CisKKwkJCXBvcnQgPSBzaW1wbGVfc3RydG91bChkcHRyICsgbWF0Y2hvZmYsIE5VTEwsIDEwKTsKKwkJCWlmIChwb3J0IDwgMTAyNCkgeworCQkJCXJldCA9IE5GX0RST1A7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyZXQgPSBzZXRfZXhwZWN0ZWRfcnRwKHBza2IsIGN0LCBjdGluZm8sICZhZGRyLAorCQkJCQkgICAgICAgaHRvbnMocG9ydCksIGRwdHIpOworCQl9CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciBzaXBbTUFYX1BPUlRTXVsyXSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGNoYXIgc2lwX25hbWVzW01BWF9QT1JUU11bMl1bc2l6ZW9mKCJzaXAtNjU1MzUiKV0gX19yZWFkX21vc3RseTsKKworc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX3NpcF9maW5pKHZvaWQpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCWlmIChzaXBbaV1bal0ubWUgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCW5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3Rlcigmc2lwW2ldW2pdKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBfX2luaXQgbmZfY29ubnRyYWNrX3NpcF9pbml0KHZvaWQpCit7CisJaW50IGksIGosIHJldDsKKwljaGFyICp0bXBuYW1lOworCisJaWYgKHBvcnRzX2MgPT0gMCkKKwkJcG9ydHNbcG9ydHNfYysrXSA9IFNJUF9QT1JUOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgeworCQltZW1zZXQoJnNpcFtpXSwgMCwgc2l6ZW9mKHNpcFtpXSkpOworCisJCXNpcFtpXVswXS50dXBsZS5zcmMubDNudW0gPSBBRl9JTkVUOworCQlzaXBbaV1bMV0udHVwbGUuc3JjLmwzbnVtID0gQUZfSU5FVDY7CisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCXNpcFtpXVtqXS50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1VEUDsKKwkJCXNpcFtpXVtqXS50dXBsZS5zcmMudS51ZHAucG9ydCA9IGh0b25zKHBvcnRzW2ldKTsKKwkJCXNpcFtpXVtqXS5tYXNrLnNyYy5sM251bSA9IDB4RkZGRjsKKwkJCXNpcFtpXVtqXS5tYXNrLnNyYy51LnVkcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKKwkJCXNpcFtpXVtqXS5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7CisJCQlzaXBbaV1bal0ubWF4X2V4cGVjdGVkID0gMjsKKwkJCXNpcFtpXVtqXS50aW1lb3V0ID0gMyAqIDYwOyAvKiAzIG1pbnV0ZXMgKi8KKwkJCXNpcFtpXVtqXS5tZSA9IFRISVNfTU9EVUxFOworCQkJc2lwW2ldW2pdLmhlbHAgPSBzaXBfaGVscDsKKworCQkJdG1wbmFtZSA9ICZzaXBfbmFtZXNbaV1bal1bMF07CisJCQlpZiAocG9ydHNbaV0gPT0gU0lQX1BPUlQpCisJCQkJc3ByaW50Zih0bXBuYW1lLCAic2lwIik7CisJCQllbHNlCisJCQkJc3ByaW50Zih0bXBuYW1lLCAic2lwLSV1IiwgaSk7CisJCQlzaXBbaV1bal0ubmFtZSA9IHRtcG5hbWU7CisKKwkJCURFQlVHUCgicG9ydCAjJXU6ICV1XG4iLCBpLCBwb3J0c1tpXSk7CisKKwkJCXJldCA9IG5mX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJnNpcFtpXVtqXSk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKCJuZl9jdF9zaXA6IGZhaWxlZCB0byByZWdpc3RlciBoZWxwZXIgIgorCQkJCSAgICAgICAiZm9yIHBmOiAldSBwb3J0OiAldVxuIiwKKwkJCQkgICAgICAgc2lwW2ldW2pdLnR1cGxlLnNyYy5sM251bSwgcG9ydHNbaV0pOworCQkJCW5mX2Nvbm50cmFja19zaXBfZmluaSgpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KG5mX2Nvbm50cmFja19zaXBfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9jb25udHJhY2tfc2lwX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCmluZGV4IDU5NTRmNjcuLmYxY2I2MGYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTI5LDEzICsyOSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2VuZGlmCiAKLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KQotI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KQotCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KIAogI2lmIDAKQEAgLTQ2LDMzICs0NCwxNSBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLWV4dGVybiBhdG9taWNfdCBuZl9jb25udHJhY2tfY291bnQ7Ci1ERUNMQVJFX1BFUl9DUFUoc3RydWN0IGlwX2Nvbm50cmFja19zdGF0LCBuZl9jb25udHJhY2tfc3RhdCk7Ci0KLXN0YXRpYyBpbnQga2lsbF9sM3Byb3RvKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKQotewotCXJldHVybiAoaS0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtID09IAotCQkJKChzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKilkYXRhKS0+bDNwcm90byk7Ci19Ci0KLXN0YXRpYyBpbnQga2lsbF9wcm90byhzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKLQlwcm90byA9IChzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICopZGF0YTsKLQlyZXR1cm4gKGktPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSA9PSAKLQkJCXByb3RvLT5wcm90bykgJiYKLQkgICAgICAgKGktPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5sM251bSA9PQotCQkJcHJvdG8tPmwzcHJvdG8pOwotfQotCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQKK2ludAogcHJpbnRfdHVwbGUoc3RydWN0IHNlcV9maWxlICpzLCBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkgICAgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAotCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bykKKwkgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKQogewotCXJldHVybiBsM3Byb3RvLT5wcmludF90dXBsZShzLCB0dXBsZSkgfHwgcHJvdG8tPnByaW50X3R1cGxlKHMsIHR1cGxlKTsKKwlyZXR1cm4gbDNwcm90by0+cHJpbnRfdHVwbGUocywgdHVwbGUpIHx8IGw0cHJvdG8tPnByaW50X3R1cGxlKHMsIHR1cGxlKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHByaW50X3R1cGxlKTsKIAogI2lmZGVmIENPTkZJR19ORl9DVF9BQ0NUCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC0xNTAsOSArMTMwLDggQEAKIAljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmhhc2ggPSB2OwogCWNvbnN0IHN0cnVjdCBuZl9jb25uICpjb25udHJhY2sgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGhhc2gpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bzsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAKLQlBU1NFUlRfUkVBRF9MT0NLKCZuZl9jb25udHJhY2tfbG9jayk7CiAJTkZfQ1RfQVNTRVJUKGNvbm50cmFjayk7CiAKIAkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCkBAIC0xNjMsMTYgKzE0MiwxNiBAQAogCQkJCSAgICAgICAudHVwbGUuc3JjLmwzbnVtKTsKIAogCU5GX0NUX0FTU0VSVChsM3Byb3RvKTsKLQlwcm90byA9IF9fbmZfY3RfcHJvdG9fZmluZChjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdCisJbDRwcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0KIAkJCQkgICAudHVwbGUuc3JjLmwzbnVtLAogCQkJCSAgIGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0KIAkJCQkgICAudHVwbGUuZHN0LnByb3RvbnVtKTsKLQlORl9DVF9BU1NFUlQocHJvdG8pOworCU5GX0NUX0FTU0VSVChsNHByb3RvKTsKIAogCWlmIChzZXFfcHJpbnRmKHMsICIlLThzICV1ICUtOHMgJXUgJWxkICIsCiAJCSAgICAgICBsM3Byb3RvLT5uYW1lLAogCQkgICAgICAgY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW0sCi0JCSAgICAgICBwcm90by0+bmFtZSwKKwkJICAgICAgIGw0cHJvdG8tPm5hbWUsCiAJCSAgICAgICBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSwKIAkJICAgICAgIHRpbWVyX3BlbmRpbmcoJmNvbm50cmFjay0+dGltZW91dCkKIAkJICAgICAgID8gKGxvbmcpKGNvbm50cmFjay0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwKSAhPSAwKQpAQCAtMTgxLDExICsxNjAsMTEgQEAKIAlpZiAobDNwcm90by0+cHJpbnRfY29ubnRyYWNrKHMsIGNvbm50cmFjaykpCiAJCXJldHVybiAtRU5PU1BDOwogCi0JaWYgKHByb3RvLT5wcmludF9jb25udHJhY2socywgY29ubnRyYWNrKSkKKwlpZiAobDRwcm90by0+cHJpbnRfY29ubnRyYWNrKHMsIGNvbm50cmFjaykpCiAJCXJldHVybiAtRU5PU1BDOwogCiAJaWYgKHByaW50X3R1cGxlKHMsICZjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAotCQkJbDNwcm90bywgcHJvdG8pKQorCQkJbDNwcm90bywgbDRwcm90bykpCiAJCXJldHVybiAtRU5PU1BDOwogCiAJaWYgKHNlcV9wcmludF9jb3VudGVycyhzLCAmY29ubnRyYWNrLT5jb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdKSkKQEAgLTE5Niw3ICsxNzUsNyBAQAogCQkJcmV0dXJuIC1FTk9TUEM7CiAKIAlpZiAocHJpbnRfdHVwbGUocywgJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsCi0JCQlsM3Byb3RvLCBwcm90bykpCisJCQlsM3Byb3RvLCBsNHByb3RvKSkKIAkJcmV0dXJuIC1FTk9TUEM7CiAKIAlpZiAoc2VxX3ByaW50X2NvdW50ZXJzKHMsICZjb25udHJhY2stPmNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0pKQpAQCAtMjU4LDg0ICsyMzcsNiBAQAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKIH07CiAKLS8qIGV4cGVjdHMgKi8KLXN0YXRpYyB2b2lkICpleHBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZSA9ICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3Q7Ci0JbG9mZl90IGk7Ci0KLQkvKiBzdHJhbmdlIHNlcV9maWxlIGFwaSBjYWxscyBzdG9wIGV2ZW4gaWYgd2UgZmFpbCwKLQkgKiB0aHVzIHdlIG5lZWQgdG8gZ3JhYiBsb2NrIHNpbmNlIHN0b3AgdW5sb2NrcyAqLwotCXJlYWRfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCi0JaWYgKGxpc3RfZW1wdHkoZSkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8PSAqcG9zOyBpKyspIHsKLQkJZSA9IGUtPm5leHQ7Ci0JCWlmIChlID09ICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGU7Ci19Ci0KLXN0YXRpYyB2b2lkICpleHBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplID0gdjsKLQotCSsrKnBvczsKLQllID0gZS0+bmV4dDsKLQotCWlmIChlID09ICZuZl9jb25udHJhY2tfZXhwZWN0X2xpc3QpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4cF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0JcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLX0KLQotc3RhdGljIGludCBleHBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHBlY3QgPSB2OwotCi0JaWYgKGV4cGVjdC0+dGltZW91dC5mdW5jdGlvbikKLQkJc2VxX3ByaW50ZihzLCAiJWxkICIsIHRpbWVyX3BlbmRpbmcoJmV4cGVjdC0+dGltZW91dCkKLQkJCSAgID8gKGxvbmcpKGV4cGVjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwKTsKLQllbHNlCi0JCXNlcV9wcmludGYocywgIi0gIik7Ci0Jc2VxX3ByaW50ZihzLCAibDNwcm90byA9ICV1IHByb3RvPSV1ICIsCi0JCSAgIGV4cGVjdC0+dHVwbGUuc3JjLmwzbnVtLAotCQkgICBleHBlY3QtPnR1cGxlLmRzdC5wcm90b251bSk7Ci0JcHJpbnRfdHVwbGUocywgJmV4cGVjdC0+dHVwbGUsCi0JCSAgICBfX25mX2N0X2wzcHJvdG9fZmluZChleHBlY3QtPnR1cGxlLnNyYy5sM251bSksCi0JCSAgICBfX25mX2N0X3Byb3RvX2ZpbmQoZXhwZWN0LT50dXBsZS5zcmMubDNudW0sCi0JCQkJICAgICAgIGV4cGVjdC0+dHVwbGUuZHN0LnByb3RvbnVtKSk7Ci0JcmV0dXJuIHNlcV9wdXRjKHMsICdcbicpOwotfQotCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGV4cF9zZXFfb3BzID0gewotCS5zdGFydCA9IGV4cF9zZXFfc3RhcnQsCi0JLm5leHQgPSBleHBfc2VxX25leHQsCi0JLnN0b3AgPSBleHBfc2VxX3N0b3AsCi0JLnNob3cgPSBleHBfc2VxX3Nob3cKLX07Ci0KLXN0YXRpYyBpbnQgZXhwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZleHBfc2VxX29wcyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4cF9maWxlX29wcyA9IHsKLQkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gZXhwX29wZW4sCi0JLnJlYWQgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlCi19OwotCiBzdGF0aWMgdm9pZCAqY3RfY3B1X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7CiAJaW50IGNwdTsKQEAgLTQyOCwzNCArMzI5LDkgQEAKIC8qIFN5c2N0bCBzdXBwb3J0ICovCiAKIGludCBuZl9jb25udHJhY2tfY2hlY2tzdW0gX19yZWFkX21vc3RseSA9IDE7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfY2hlY2tzdW0pOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAotCi0vKiBGcm9tIG5mX2Nvbm50cmFja19jb3JlLmMgKi8KLWV4dGVybiBpbnQgbmZfY29ubnRyYWNrX21heDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCi0vKiBGcm9tIG5mX2Nvbm50cmFja19wcm90b190Y3AuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9zeW5fc2VudDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3Y7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkOwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF90Y3BfdGltZW91dF9maW5fd2FpdDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2s7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X3RpbWVfd2FpdDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2U7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zOwotZXh0ZXJuIGludCBuZl9jdF90Y3BfbG9vc2U7Ci1leHRlcm4gaW50IG5mX2N0X3RjcF9iZV9saWJlcmFsOwotZXh0ZXJuIGludCBuZl9jdF90Y3BfbWF4X3JldHJhbnM7Ci0KLS8qIEZyb20gbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jICovCi1leHRlcm4gdW5zaWduZWQgaW50IG5mX2N0X3VkcF90aW1lb3V0OwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF91ZHBfdGltZW91dF9zdHJlYW07Ci0KLS8qIEZyb20gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jdF9nZW5lcmljX3RpbWVvdXQ7Ci0KIC8qIExvZyBpbnZhbGlkIHBhY2tldHMgb2YgYSBnaXZlbiBwcm90b2NvbCAqLwogc3RhdGljIGludCBsb2dfaW52YWxpZF9wcm90b19taW4gPSAwOwogc3RhdGljIGludCBsb2dfaW52YWxpZF9wcm90b19tYXggPSAyNTU7CkBAIC00OTYsOTQgKzM3Miw2IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fU0VOVCwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9zeW5fc2VudCIsCi0JCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9zeW5fc2VudCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1JFQ1YsCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3JlY3YiLAotCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0VTVEFCTElTSEVELAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X2VzdGFibGlzaGVkIiwKLQkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9GSU5fV0FJVCwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9maW5fd2FpdCIsCi0JCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9maW5fd2FpdCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0VfV0FJVCwKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZV93YWl0IiwKLQkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0xBU1RfQUNLLAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF90aW1lb3V0X2xhc3RfYWNrIiwKLQkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9USU1FX1dBSVQsCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfdGltZV93YWl0IiwKLQkJLmRhdGEJCT0gJm5mX2N0X3RjcF90aW1lb3V0X3RpbWVfd2FpdCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0UsCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfY2xvc2UiLAotCQkuZGF0YQkJPSAmbmZfY3RfdGNwX3RpbWVvdXRfY2xvc2UsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VULAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3VkcF90aW1lb3V0IiwKLQkJLmRhdGEJCT0gJm5mX2N0X3VkcF90aW1lb3V0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19VRFBfVElNRU9VVF9TVFJFQU0sCi0JCS5wcm9jbmFtZQk9ICJuZl9jb25udHJhY2tfdWRwX3RpbWVvdXRfc3RyZWFtIiwKLQkJLmRhdGEJCT0gJm5mX2N0X3VkcF90aW1lb3V0X3N0cmVhbSwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfR0VORVJJQ19USU1FT1VULAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX2dlbmVyaWNfdGltZW91dCIsCi0JCS5kYXRhCQk9ICZuZl9jdF9nZW5lcmljX3RpbWVvdXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewogCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX0xPR19JTlZBTElELAogCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX2xvZ19pbnZhbGlkIiwKIAkJLmRhdGEJCT0gJm5mX2N0X2xvZ19pbnZhbGlkLApAQCAtNTk0LDM4ICszODIsNiBAQAogCQkuZXh0cmExCQk9ICZsb2dfaW52YWxpZF9wcm90b19taW4sCiAJCS5leHRyYTIJCT0gJmxvZ19pbnZhbGlkX3Byb3RvX21heCwKIAl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9NQVhfUkVUUkFOUywKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9tYXhfcmV0cmFucyIsCi0JCS5kYXRhCQk9ICZuZl9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucywKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9ORl9DT05OVFJBQ0tfVENQX0xPT1NFLAotCQkucHJvY25hbWUJPSAibmZfY29ubnRyYWNrX3RjcF9sb29zZSIsCi0JCS5kYXRhCQk9ICZuZl9jdF90Y3BfbG9vc2UsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX05GX0NPTk5UUkFDS19UQ1BfQkVfTElCRVJBTCwKLQkJLnByb2NuYW1lICAgICAgID0gIm5mX2Nvbm50cmFja190Y3BfYmVfbGliZXJhbCIsCi0JCS5kYXRhICAgICAgICAgICA9ICZuZl9jdF90Y3BfYmVfbGliZXJhbCwKLQkJLm1heGxlbiAgICAgICAgID0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlICAgICAgICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgICA9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfTkZfQ09OTlRSQUNLX1RDUF9NQVhfUkVUUkFOUywKLQkJLnByb2NuYW1lCT0gIm5mX2Nvbm50cmFja190Y3BfbWF4X3JldHJhbnMiLAotCQkuZGF0YQkJPSAmbmZfY3RfdGNwX21heF9yZXRyYW5zLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKIAogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwpAQCAtNjU5LDEwOSArNDE1LDkgQEAKIAl9LAogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwotRVhQT1JUX1NZTUJPTChuZl9jdF9sb2dfaW52YWxpZCk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9sb2dfaW52YWxpZCk7CiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCi1pbnQgbmZfY29ubnRyYWNrX2wzcHJvdG9fcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90bykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlpZiAobmZfY3RfbDNwcm90b3NbcHJvdG8tPmwzcHJvdG9dICE9ICZuZl9jb25udHJhY2tfZ2VuZXJpY19sM3Byb3RvKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCW5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSA9IHByb3RvOwotb3V0OgotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBuZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pCi17Ci0Jd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCW5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSA9ICZuZl9jb25udHJhY2tfZ2VuZXJpY19sM3Byb3RvOwotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCQotCS8qIFNvbWVib2R5IGNvdWxkIGJlIHN0aWxsIGxvb2tpbmcgYXQgdGhlIHByb3RvIGluIGJoLiAqLwotCXN5bmNocm9uaXplX25ldCgpOwotCi0JLyogUmVtb3ZlIGFsbCBjb250cmFjayBlbnRyaWVzIGZvciB0aGlzIHByb3RvY29sICovCi0JbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKGtpbGxfbDNwcm90bywgcHJvdG8pOwotfQotCi0vKiBGSVhNRTogQWxsb3cgTlVMTCBmdW5jdGlvbnMgYW5kIHN1YiBpbiBwb2ludGVycyB0byBnZW5lcmljIGZvcgotICAgdGhlbS4gLS1SUiAqLwotaW50IG5mX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bykKLXsKLQlpbnQgcmV0ID0gMDsKLQotcmV0cnk6Ci0Jd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCWlmIChuZl9jdF9wcm90b3NbcHJvdG8tPmwzcHJvdG9dKSB7Ci0JCWlmIChuZl9jdF9wcm90b3NbcHJvdG8tPmwzcHJvdG9dW3Byb3RvLT5wcm90b10KLQkJCQkhPSAmbmZfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2wpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0X3VubG9jazsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIGwzcHJvdG8gbWF5IGJlIGxvYWRlZCBsYXR0ZXIuICovCi0JCXN0cnVjdCBuZl9jb25udHJhY2tfcHJvdG9jb2wgKipwcm90b19hcnJheTsKLQkJaW50IGk7Ci0KLQkJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0KLQkJcHJvdG9fYXJyYXkgPSAoc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqKikKLQkJCQlrbWFsbG9jKE1BWF9ORl9DVF9QUk9UTyAqCi0JCQkJCSBzaXplb2Yoc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmIChwcm90b19hcnJheSA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9ORl9DVF9QUk9UTzsgaSsrKQotCQkJcHJvdG9fYXJyYXlbaV0gPSAmbmZfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2w7Ci0KLQkJd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCQlpZiAobmZfY3RfcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSkgewotCQkJLyogYmFkIHRpbWluZywgYnV0IG5vIHByb2JsZW0gKi8KLQkJCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCQkJa2ZyZWUocHJvdG9fYXJyYXkpOwotCQl9IGVsc2UgewotCQkJbmZfY3RfcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSA9IHByb3RvX2FycmF5OwotCQkJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JCX0KLQotCQkvKgotCQkgKiBKdXN0IG9uY2UgYmVjYXVzZSBhcnJheSBpcyBuZXZlciBmcmVlZCB1bnRpbCB1bmxvYWRpbmcKLQkJICogbmZfY29ubnRyYWNrLmtvCi0JCSAqLwotCQlnb3RvIHJldHJ5OwotCX0KLQotCW5mX2N0X3Byb3Rvc1twcm90by0+bDNwcm90b11bcHJvdG8tPnByb3RvXSA9IHByb3RvOwotCi1vdXRfdW5sb2NrOgotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgbmZfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pCi17Ci0Jd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCW5mX2N0X3Byb3Rvc1twcm90by0+bDNwcm90b11bcHJvdG8tPnByb3RvXQotCQk9ICZuZl9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbDsKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkKLQkvKiBTb21lYm9keSBjb3VsZCBiZSBzdGlsbCBsb29raW5nIGF0IHRoZSBwcm90byBpbiBiaC4gKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKLQotCS8qIFJlbW92ZSBhbGwgY29udHJhY2sgZW50cmllcyBmb3IgdGhpcyBwcm90b2NvbCAqLwotCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX3Byb3RvLCBwcm90byk7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IG5mX2Nvbm50cmFja19zdGFuZGFsb25lX2luaXQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtODM0LDcwICs0OTAsNCBAQAogdm9pZCBuZWVkX2Nvbm50cmFjayh2b2lkKQogewogfQotCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19jaGFpbik7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChfX25mX2N0X2V2ZW50X2NhY2hlX2luaXQpOwotRVhQT1JUX1BFUl9DUFVfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZWNhY2hlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0wobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19sM3Byb3RvX3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2wzcHJvdG9fdW5yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19wcm90b2NvbF9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfaW52ZXJ0X3R1cGxlcHIpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfZGVzdHJveWVkKTsKLUVYUE9SVF9TWU1CT0wobmVlZF9jb25udHJhY2spOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfaXRlcmF0ZV9jbGVhbnVwKTsKLUVYUE9SVF9TWU1CT0woX19uZl9jdF9yZWZyZXNoX2FjY3QpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9wcm90b3MpOwotRVhQT1JUX1NZTUJPTChfX25mX2N0X3Byb3RvX2ZpbmQpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9wcm90b19maW5kX2dldCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X3Byb3RvX3B1dCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2wzcHJvdG9fZmluZF9nZXQpOwotRVhQT1JUX1NZTUJPTChuZl9jdF9sM3Byb3RvX3B1dCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2wzcHJvdG9zKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19jaGVja3N1bSk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MpOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfZXhwZWN0X3B1dCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX3R1cGxlX3Rha2VuKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2h0YWJsZV9zaXplKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2xvY2spOwotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfaGFzaCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja191bnRyYWNrZWQpOwotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2ZpbmRfZ2V0KTsKLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotRVhQT1JUX1NZTUJPTChuZl9jb25udHJhY2tfdGNwX3VwZGF0ZSk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0woX19uZl9jb25udHJhY2tfY29uZmlybSk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2dldF90dXBsZSk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2ludmVydF90dXBsZSk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19pbik7Ci1FWFBPUlRfU1lNQk9MKF9fbmZfY29ubnRyYWNrX2F0dGFjaCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19hbGxvYyk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19mcmVlKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2ZsdXNoKTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2hlbHBlcl9maW5kX2dldCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2N0X2hlbHBlcl9wdXQpOwotRVhQT1JUX1NZTUJPTChfX25mX2Nvbm50cmFja19oZWxwZXJfZmluZF9ieW5hbWUpOwotRVhQT1JUX1NZTUJPTChfX25mX2Nvbm50cmFja19maW5kKTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfdW5saW5rX2V4cGVjdCk7Ci1FWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19oYXNoX2luc2VydCk7Ci1FWFBPUlRfU1lNQk9MKF9fbmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2V4cGVjdF9maW5kKTsKLUVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2V4cGVjdF9saXN0KTsKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCi1FWFBPUlRfU1lNQk9MKG5mX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyKTsKLUVYUE9SVF9TWU1CT0wobmZfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUpOwotI2VuZGlmCitFWFBPUlRfU1lNQk9MX0dQTChuZWVkX2Nvbm50cmFjayk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190ZnRwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190ZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjViZmZlMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RmdHAuYwpAQCAtMCwwICsxLDE2MCBAQAorLyogKEMpIDIwMDEtMjAwMiBNYWdudXMgQm9kZW4gPG1iQG96YWJhLm1pbmUubnU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGZ0cC5oPgorCitNT0RVTEVfQVVUSE9SKCJNYWdudXMgQm9kZW4gPG1iQG96YWJhLm1pbmUubnU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRGVFAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXBfY29ubnRyYWNrX3RmdHAiKTsKKworI2RlZmluZSBNQVhfUE9SVFMgOAorc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW01BWF9QT1JUU107CitzdGF0aWMgaW50IHBvcnRzX2M7Cittb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2MsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyhwb3J0cywgIlBvcnQgbnVtYmVycyBvZiBURlRQIHNlcnZlcnMiKTsKKworI2lmIDAKKyNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKCIlczolczoiIGZvcm1hdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKK3Vuc2lnbmVkIGludCAoKm5mX25hdF90ZnRwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCQkJIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHApIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfdGZ0cF9ob29rKTsKKworc3RhdGljIGludCB0ZnRwX2hlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorCQkgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKK3sKKwlzdHJ1Y3QgdGZ0cGhkciBfdGZ0cGgsICp0Zmg7CisJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZTsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gTkZfQUNDRVBUOworCWludCBmYW1pbHkgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmwzbnVtOworCXR5cGVvZihuZl9uYXRfdGZ0cF9ob29rKSBuZl9uYXRfdGZ0cDsKKworCXRmaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgcHJvdG9mZiArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKKwkJCQkgc2l6ZW9mKF90ZnRwaCksICZfdGZ0cGgpOworCWlmICh0ZmggPT0gTlVMTCkKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKKworCXN3aXRjaCAobnRvaHModGZoLT5vcGNvZGUpKSB7CisJY2FzZSBURlRQX09QQ09ERV9SRUFEOgorCWNhc2UgVEZUUF9PUENPREVfV1JJVEU6CisJCS8qIFJSUSBhbmQgV1JRIHdvcmtzIHRoZSBzYW1lIHdheSAqLworCQlERUJVR1AoIiIpOworCQlORl9DVF9EVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpOworCQlORl9DVF9EVU1QX1RVUExFKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOworCisJCWV4cCA9IG5mX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOworCQlpZiAoZXhwID09IE5VTEwpCisJCQlyZXR1cm4gTkZfRFJPUDsKKwkJdHVwbGUgPSAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlOworCQluZl9jb25udHJhY2tfZXhwZWN0X2luaXQoZXhwLCBmYW1pbHksCisJCQkJCSAmdHVwbGUtPnNyYy51MywgJnR1cGxlLT5kc3QudTMsCisJCQkJCSBJUFBST1RPX1VEUCwKKwkJCQkJIE5VTEwsICZ0dXBsZS0+ZHN0LnUudWRwLnBvcnQpOworCisJCURFQlVHUCgiZXhwZWN0OiAiKTsKKwkJTkZfQ1RfRFVNUF9UVVBMRSgmZXhwLT50dXBsZSk7CisJCU5GX0NUX0RVTVBfVFVQTEUoJmV4cC0+bWFzayk7CisKKwkJbmZfbmF0X3RmdHAgPSByY3VfZGVyZWZlcmVuY2UobmZfbmF0X3RmdHBfaG9vayk7CisJCWlmIChuZl9uYXRfdGZ0cCAmJiBjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQorCQkJcmV0ID0gbmZfbmF0X3RmdHAocHNrYiwgY3RpbmZvLCBleHApOworCQllbHNlIGlmIChuZl9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQorCQkJcmV0ID0gTkZfRFJPUDsKKwkJbmZfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKKwkJYnJlYWs7CisJY2FzZSBURlRQX09QQ09ERV9EQVRBOgorCWNhc2UgVEZUUF9PUENPREVfQUNLOgorCQlERUJVR1AoIkRhdGEvQUNLIG9wY29kZVxuIik7CisJCWJyZWFrOworCWNhc2UgVEZUUF9PUENPREVfRVJST1I6CisJCURFQlVHUCgiRXJyb3Igb3Bjb2RlXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKCJVbmtub3duIG9wY29kZVxuIik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciB0ZnRwW01BWF9QT1JUU11bMl0gX19yZWFkX21vc3RseTsKK3N0YXRpYyBjaGFyIHRmdHBfbmFtZXNbTUFYX1BPUlRTXVsyXVtzaXplb2YoInRmdHAtNjU1MzUiKV0gX19yZWFkX21vc3RseTsKKworc3RhdGljIHZvaWQgbmZfY29ubnRyYWNrX3RmdHBfZmluaSh2b2lkKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJbmZfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZ0ZnRwW2ldW2pdKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5mX2Nvbm50cmFja190ZnRwX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgaiwgcmV0OworCWNoYXIgKnRtcG5hbWU7CisKKwlpZiAocG9ydHNfYyA9PSAwKQorCQlwb3J0c1twb3J0c19jKytdID0gVEZUUF9QT1JUOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgeworCQltZW1zZXQoJnRmdHBbaV0sIDAsIHNpemVvZih0ZnRwW2ldKSk7CisKKwkJdGZ0cFtpXVswXS50dXBsZS5zcmMubDNudW0gPSBBRl9JTkVUOworCQl0ZnRwW2ldWzFdLnR1cGxlLnNyYy5sM251bSA9IEFGX0lORVQ2OworCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQl0ZnRwW2ldW2pdLnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVURQOworCQkJdGZ0cFtpXVtqXS50dXBsZS5zcmMudS51ZHAucG9ydCA9IGh0b25zKHBvcnRzW2ldKTsKKwkJCXRmdHBbaV1bal0ubWFzay5zcmMubDNudW0gPSAweEZGRkY7CisJCQl0ZnRwW2ldW2pdLm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKKwkJCXRmdHBbaV1bal0ubWFzay5zcmMudS51ZHAucG9ydCA9IGh0b25zKDB4RkZGRik7CisJCQl0ZnRwW2ldW2pdLm1heF9leHBlY3RlZCA9IDE7CisJCQl0ZnRwW2ldW2pdLnRpbWVvdXQgPSA1ICogNjA7IC8qIDUgbWludXRlcyAqLworCQkJdGZ0cFtpXVtqXS5tZSA9IFRISVNfTU9EVUxFOworCQkJdGZ0cFtpXVtqXS5oZWxwID0gdGZ0cF9oZWxwOworCisJCQl0bXBuYW1lID0gJnRmdHBfbmFtZXNbaV1bal1bMF07CisJCQlpZiAocG9ydHNbaV0gPT0gVEZUUF9QT1JUKQorCQkJCXNwcmludGYodG1wbmFtZSwgInRmdHAiKTsKKwkJCWVsc2UKKwkJCQlzcHJpbnRmKHRtcG5hbWUsICJ0ZnRwLSV1IiwgaSk7CisJCQl0ZnRwW2ldW2pdLm5hbWUgPSB0bXBuYW1lOworCisJCQlyZXQgPSBuZl9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZ0ZnRwW2ldW2pdKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcmludGsoIm5mX2N0X3RmdHA6IGZhaWxlZCB0byByZWdpc3RlciBoZWxwZXIgIgorCQkJCSAgICAgICAiZm9yIHBmOiAldSBwb3J0OiAldVxuIiwKKwkJCQkJdGZ0cFtpXVtqXS50dXBsZS5zcmMubDNudW0sIHBvcnRzW2ldKTsKKwkJCQluZl9jb25udHJhY2tfdGZ0cF9maW5pKCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQobmZfY29ubnRyYWNrX3RmdHBfaW5pdCk7Cittb2R1bGVfZXhpdChuZl9jb25udHJhY2tfdGZ0cF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfc3lzY3RsLmMgYi9uZXQvbmV0ZmlsdGVyL25mX3N5c2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZGRkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX3N5c2N0bC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKiBuZl9zeXNjdGwuYwluZXRmaWx0ZXIgc3lzY3RsIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdGF0aWMgdm9pZAorcGF0aF9mcmVlKHN0cnVjdCBjdGxfdGFibGUgKnBhdGgsIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKQoreworCXN0cnVjdCBjdGxfdGFibGUgKnQsICpuZXh0OworCisJZm9yICh0ID0gcGF0aDsgdCAhPSBOVUxMICYmIHQgIT0gdGFibGU7IHQgPSBuZXh0KSB7CisJCW5leHQgPSB0LT5jaGlsZDsKKwkJa2ZyZWUodCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSAqCitwYXRoX2R1cChzdHJ1Y3QgY3RsX3RhYmxlICpwYXRoLCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0LCAqbGFzdCA9IE5VTEwsICp0bXA7CisKKwlmb3IgKHQgPSBwYXRoOyB0ICE9IE5VTEw7IHQgPSB0LT5jaGlsZCkgeworCQkvKiB0d2ljZSB0aGUgc2l6ZSBzaW5jZSBwYXRoIGVsZW1lbnRzIGFyZSB0ZXJtaW5hdGVkIGJ5IGFuCisJCSAqIGVtcHR5IGVsZW1lbnQgKi8KKwkJdG1wID0ga21lbWR1cCh0LCAyICogc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICh0bXAgPT0gTlVMTCkgeworCQkJaWYgKGxhc3QgIT0gTlVMTCkKKwkJCQlwYXRoX2ZyZWUocGF0aCwgdGFibGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAobGFzdCAhPSBOVUxMKQorCQkJbGFzdC0+Y2hpbGQgPSB0bXA7CisJCWVsc2UKKwkJCXBhdGggPSB0bXA7CisJCWxhc3QgPSB0bXA7CisJfQorCisJaWYgKGxhc3QgIT0gTlVMTCkKKwkJbGFzdC0+Y2hpbGQgPSB0YWJsZTsKKwllbHNlCisJCXBhdGggPSB0YWJsZTsKKworCXJldHVybiBwYXRoOworfQorCitzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqCituZl9yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3RydWN0IGN0bF90YWJsZSAqcGF0aCwgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpCit7CisJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWRlcjsKKworCXBhdGggPSBwYXRoX2R1cChwYXRoLCB0YWJsZSk7CisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHBhdGgsIDApOworCWlmIChoZWFkZXIgPT0gTlVMTCkKKwkJcGF0aF9mcmVlKHBhdGgsIHRhYmxlKTsKKwlyZXR1cm4gaGVhZGVyOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKTsKKwordm9pZAorbmZfdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWRlciwKKwkJCSAgIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKQoreworCXN0cnVjdCBjdGxfdGFibGUgKnBhdGggPSBoZWFkZXItPmN0bF90YWJsZTsKKworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGhlYWRlcik7CisJcGF0aF9mcmVlKHBhdGgsIHRhYmxlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX3VucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKTsKKworLyogbmV0L25ldGZpbHRlciAqLworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgbmZfbmV0X25ldGZpbHRlcl90YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gTkVUX05FVEZJTFRFUiwKKwkJLnByb2NuYW1lCT0gIm5ldGZpbHRlciIsCisJCS5tb2RlCQk9IDA1NTUsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAKKwl9Cit9Oworc3RydWN0IGN0bF90YWJsZSBuZl9uZXRfbmV0ZmlsdGVyX3N5c2N0bF9wYXRoW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfTkVULAorCQkucHJvY25hbWUJPSAibmV0IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IG5mX25ldF9uZXRmaWx0ZXJfdGFibGUsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAKKwl9Cit9OworRVhQT1JUX1NZTUJPTF9HUEwobmZfbmV0X25ldGZpbHRlcl9zeXNjdGxfcGF0aCk7CisKKy8qIG5ldC9pcHY0L25ldGZpbHRlciAqLworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgbmZfbmV0X2lwdjRfbmV0ZmlsdGVyX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORVRGSUxURVIsCisJCS5wcm9jbmFtZQk9ICJuZXRmaWx0ZXIiLAorCQkubW9kZQkJPSAwNTU1LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIG5mX25ldF9pcHY0X3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBORVRfSVBWNCwKKwkJLnByb2NuYW1lCT0gImlwdjQiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gbmZfbmV0X2lwdjRfbmV0ZmlsdGVyX3RhYmxlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKK3N0cnVjdCBjdGxfdGFibGUgbmZfbmV0X2lwdjRfbmV0ZmlsdGVyX3N5c2N0bF9wYXRoW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfTkVULAorCQkucHJvY25hbWUJPSAibmV0IiwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IG5mX25ldF9pcHY0X3RhYmxlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwCisJfQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25ldF9pcHY0X25ldGZpbHRlcl9zeXNjdGxfcGF0aCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCmluZGV4IGI1OWQzYjIuLmQxNTA1ZGQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jCkBAIC00MDgsMTMgKzQwOCwxMyBAQAogCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAogCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKIAkJCWNvbnN0IHN0cnVjdCBuZl9sb2dpbmZvICpsaSwKLQkJCWNvbnN0IGNoYXIgKnByZWZpeCkKKwkJCWNvbnN0IGNoYXIgKnByZWZpeCwgdW5zaWduZWQgaW50IHBsZW4pCiB7CiAJdW5zaWduZWQgY2hhciAqb2xkX3RhaWw7CiAJc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X2hkciBwbXNnOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2c7Ci0JdV9pbnQzMl90IHRtcF91aW50OworCV9fYmUzMiB0bXBfdWludDsKIAogCVVERUJVRygiZW50ZXJlZFxuIik7CiAJCQpAQCAtNDI3LDE3ICs0MjcsMTMgQEAKIAluZm1zZy0+dmVyc2lvbiA9IE5GTkVUTElOS19WMDsKIAluZm1zZy0+cmVzX2lkID0gaHRvbnMoaW5zdC0+Z3JvdXBfbnVtKTsKIAotCXBtc2cuaHdfcHJvdG9jb2wJPSBodG9ucyhza2ItPnByb3RvY29sKTsKKwlwbXNnLmh3X3Byb3RvY29sCT0gc2tiLT5wcm90b2NvbDsKIAlwbXNnLmhvb2sJCT0gaG9va251bTsKIAogCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9QQUNLRVRfSERSLCBzaXplb2YocG1zZyksICZwbXNnKTsKIAotCWlmIChwcmVmaXgpIHsKLQkJaW50IHNsZW4gPSBzdHJsZW4ocHJlZml4KTsKLQkJaWYgKHNsZW4gPiBORlVMTkxfUFJFRklYTEVOKQotCQkJc2xlbiA9IE5GVUxOTF9QUkVGSVhMRU47Ci0JCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9QUkVGSVgsIHNsZW4sIHByZWZpeCk7Ci0JfQorCWlmIChwcmVmaXgpCisJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9QUkVGSVgsIHBsZW4sIHByZWZpeCk7CiAKIAlpZiAoaW5kZXYpIHsKIAkJdG1wX3VpbnQgPSBodG9ubChpbmRldi0+aWZpbmRleCk7CkBAIC01MDEsMTggKzQ5NywxNiBAQAogI2VuZGlmCiAJfQogCi0JaWYgKHNrYi0+bmZtYXJrKSB7Ci0JCXRtcF91aW50ID0gaHRvbmwoc2tiLT5uZm1hcmspOworCWlmIChza2ItPm1hcmspIHsKKwkJdG1wX3VpbnQgPSBodG9ubChza2ItPm1hcmspOwogCQlORkFfUFVUKGluc3QtPnNrYiwgTkZVTEFfTUFSSywgc2l6ZW9mKHRtcF91aW50KSwgJnRtcF91aW50KTsKIAl9CiAKIAlpZiAoaW5kZXYgJiYgc2tiLT5kZXYgJiYgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX3BhcnNlKSB7CiAJCXN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9odyBwaHc7Ci0KLQkJcGh3Lmh3X2FkZHJsZW4gPSAKLQkJCXNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9wYXJzZSgoc3RydWN0IHNrX2J1ZmYgKilza2IsIAorCQlpbnQgbGVuID0gc2tiLT5kZXYtPmhhcmRfaGVhZGVyX3BhcnNlKChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwKIAkJCQkJCSAgICBwaHcuaHdfYWRkcik7Ci0JCXBody5od19hZGRybGVuID0gaHRvbnMocGh3Lmh3X2FkZHJsZW4pOworCQlwaHcuaHdfYWRkcmxlbiA9IGh0b25zKGxlbik7CiAJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9IV0FERFIsIHNpemVvZihwaHcpLCAmcGh3KTsKIAl9CiAKQEAgLTUyOSw3ICs1MjMsNyBAQAogCWlmIChza2ItPnNrKSB7CiAJCXJlYWRfbG9ja19iaCgmc2tiLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CiAJCWlmIChza2ItPnNrLT5za19zb2NrZXQgJiYgc2tiLT5zay0+c2tfc29ja2V0LT5maWxlKSB7Ci0JCQl1X2ludDMyX3QgdWlkID0gaHRvbmwoc2tiLT5zay0+c2tfc29ja2V0LT5maWxlLT5mX3VpZCk7CisJCQlfX2JlMzIgdWlkID0gaHRvbmwoc2tiLT5zay0+c2tfc29ja2V0LT5maWxlLT5mX3VpZCk7CiAJCQkvKiBuZWVkIHRvIHVubG9jayBoZXJlIHNpbmNlIE5GQV9QVVQgbWF5IGdvdG8gKi8KIAkJCXJlYWRfdW5sb2NrX2JoKCZza2ItPnNrLT5za19jYWxsYmFja19sb2NrKTsKIAkJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9VSUQsIHNpemVvZih1aWQpLCAmdWlkKTsKQEAgLTU0NCw3ICs1MzgsNyBAQAogCX0KIAkvKiBnbG9iYWwgc2VxdWVuY2UgbnVtYmVyICovCiAJaWYgKGluc3QtPmZsYWdzICYgTkZVTE5MX0NGR19GX1NFUV9HTE9CQUwpIHsKLQkJdG1wX3VpbnQgPSBhdG9taWNfaW5jX3JldHVybigmZ2xvYmFsX3NlcSk7CisJCXRtcF91aW50ID0gaHRvbmwoYXRvbWljX2luY19yZXR1cm4oJmdsb2JhbF9zZXEpKTsKIAkJTkZBX1BVVChpbnN0LT5za2IsIE5GVUxBX1NFUV9HTE9CQUwsIHNpemVvZih0bXBfdWludCksICZ0bXBfdWludCk7CiAJfQogCkBAIC02MDMsNiArNTk3LDcgQEAKIAljb25zdCBzdHJ1Y3QgbmZfbG9naW5mbyAqbGk7CiAJdW5zaWduZWQgaW50IHF0aHJlc2hvbGQ7CiAJdW5zaWduZWQgaW50IG5sYnVmc2l6OworCXVuc2lnbmVkIGludCBwbGVuOwogCiAJaWYgKGxpX3VzZXIgJiYgbGlfdXNlci0+dHlwZSA9PSBORl9MT0dfVFlQRV9VTE9HKSAKIAkJbGkgPSBsaV91c2VyOwpAQCAtNjE4LDYgKzYxMywxMCBAQAogCQlyZXR1cm47CiAJfQogCisJcGxlbiA9IDA7CisJaWYgKHByZWZpeCkKKwkJcGxlbiA9IHN0cmxlbihwcmVmaXgpOworCiAJLyogYWxsIG1hY3JvcyBleHBhbmQgdG8gY29uc3RhbnQgdmFsdWVzIGF0IGNvbXBpbGUgdGltZSAqLwogCS8qIEZJWE1FOiBkbyB3ZSB3YW50IHRvIG1ha2UgdGhlIHNpemUgY2FsY3VsYXRpb24gY29uZGl0aW9uYWwgYmFzZWQgb24KIAkgKiB3aGF0IGlzIGFjdHVhbGx5IHByZXNlbnQ/ICB3YXkgbW9yZSBicmFuY2hlcyBhbmQgY2hlY2tzLCBidXQgbW9yZQpAQCAtNjMyLDcgKzYzMSw3IEBACiAjZW5kaWYKIAkJKyBORkFfU1BBQ0Uoc2l6ZW9mKHVfaW50MzJfdCkpCS8qIG1hcmsgKi8KIAkJKyBORkFfU1BBQ0Uoc2l6ZW9mKHVfaW50MzJfdCkpCS8qIHVpZCAqLwotCQkrIE5GQV9TUEFDRShORlVMTkxfUFJFRklYTEVOKQkvKiBwcmVmaXggKi8KKwkJKyBORkFfU1BBQ0UocGxlbikJCS8qIHByZWZpeCAqLwogCQkrIE5GQV9TUEFDRShzaXplb2Yoc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X2h3KSkKIAkJKyBORkFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF90aW1lc3RhbXApKTsKIApAQCAtNzAzLDcgKzcwMiw3IEBACiAJaW5zdC0+cWxlbisrOwogCiAJX19idWlsZF9wYWNrZXRfbWVzc2FnZShpbnN0LCBza2IsIGRhdGFfbGVuLCBwZiwKLQkJCQlob29rbnVtLCBpbiwgb3V0LCBsaSwgcHJlZml4KTsKKwkJCQlob29rbnVtLCBpbiwgb3V0LCBsaSwgcHJlZml4LCBwbGVuKTsKIAogCS8qIHRpbWVyX3BlbmRpbmcgYWx3YXlzIGNhbGxlZCB3aXRoaW4gaW5zdC0+bG9jaywgc28gdGhlcmUKIAkgKiBpcyBubyBjaGFuY2Ugb2YgYSByYWNlIGhlcmUgKi8KQEAgLTg3OCwzMyArODc3LDMzIEBACiAJCXBhcmFtcyA9IE5GQV9EQVRBKG5mdWxhW05GVUxBX0NGR19NT0RFLTFdKTsKIAogCQluZnVsbmxfc2V0X21vZGUoaW5zdCwgcGFyYW1zLT5jb3B5X21vZGUsCi0JCQkJbnRvaHMocGFyYW1zLT5jb3B5X3JhbmdlKSk7CisJCQkJbnRvaGwocGFyYW1zLT5jb3B5X3JhbmdlKSk7CiAJfQogCiAJaWYgKG5mdWxhW05GVUxBX0NGR19USU1FT1VULTFdKSB7Ci0JCXVfaW50MzJfdCB0aW1lb3V0ID0gCi0JCQkqKHVfaW50MzJfdCAqKU5GQV9EQVRBKG5mdWxhW05GVUxBX0NGR19USU1FT1VULTFdKTsKKwkJX19iZTMyIHRpbWVvdXQgPQorCQkJKihfX2JlMzIgKilORkFfREFUQShuZnVsYVtORlVMQV9DRkdfVElNRU9VVC0xXSk7CiAKIAkJbmZ1bG5sX3NldF90aW1lb3V0KGluc3QsIG50b2hsKHRpbWVvdXQpKTsKIAl9CiAKIAlpZiAobmZ1bGFbTkZVTEFfQ0ZHX05MQlVGU0laLTFdKSB7Ci0JCXVfaW50MzJfdCBubGJ1ZnNpeiA9IAotCQkJKih1X2ludDMyX3QgKilORkFfREFUQShuZnVsYVtORlVMQV9DRkdfTkxCVUZTSVotMV0pOworCQlfX2JlMzIgbmxidWZzaXogPQorCQkJKihfX2JlMzIgKilORkFfREFUQShuZnVsYVtORlVMQV9DRkdfTkxCVUZTSVotMV0pOwogCiAJCW5mdWxubF9zZXRfbmxidWZzaXooaW5zdCwgbnRvaGwobmxidWZzaXopKTsKIAl9CiAKIAlpZiAobmZ1bGFbTkZVTEFfQ0ZHX1FUSFJFU0gtMV0pIHsKLQkJdV9pbnQzMl90IHF0aHJlc2ggPSAKLQkJCSoodV9pbnQxNl90ICopTkZBX0RBVEEobmZ1bGFbTkZVTEFfQ0ZHX1FUSFJFU0gtMV0pOworCQlfX2JlMzIgcXRocmVzaCA9CisJCQkqKF9fYmUzMiAqKU5GQV9EQVRBKG5mdWxhW05GVUxBX0NGR19RVEhSRVNILTFdKTsKIAogCQluZnVsbmxfc2V0X3F0aHJlc2goaW5zdCwgbnRvaGwocXRocmVzaCkpOwogCX0KIAogCWlmIChuZnVsYVtORlVMQV9DRkdfRkxBR1MtMV0pIHsKLQkJdV9pbnQxNl90IGZsYWdzID0KLQkJCSoodV9pbnQxNl90ICopTkZBX0RBVEEobmZ1bGFbTkZVTEFfQ0ZHX0ZMQUdTLTFdKTsKKwkJX19iZTE2IGZsYWdzID0KKwkJCSooX19iZTE2ICopTkZBX0RBVEEobmZ1bGFbTkZVTEFfQ0ZHX0ZMQUdTLTFdKTsKIAkJbmZ1bG5sX3NldF9mbGFncyhpbnN0LCBudG9ocyhmbGFncykpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggOGViMjQ3My4uYTg4YTAxNyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC0zNDksNyArMzQ5LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqZW50c2tiID0gZW50cnktPnNrYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldjsKLQl1bnNpZ25lZCBpbnQgdG1wX3VpbnQ7CisJX19iZTMyIHRtcF91aW50OwogCiAJUURFQlVHKCJlbnRlcmVkXG4iKTsKIApAQCAtNDE0LDcgKzQxNCw3IEBACiAJbmZtc2ctPnJlc19pZCA9IGh0b25zKHF1ZXVlLT5xdWV1ZV9udW0pOwogCiAJcG1zZy5wYWNrZXRfaWQgCQk9IGh0b25sKGVudHJ5LT5pZCk7Ci0JcG1zZy5od19wcm90b2NvbAk9IGh0b25zKGVudHNrYi0+cHJvdG9jb2wpOworCXBtc2cuaHdfcHJvdG9jb2wJPSBlbnRza2ItPnByb3RvY29sOwogCXBtc2cuaG9vawkJPSBlbnRpbmYtPmhvb2s7CiAKIAlORkFfUFVUKHNrYiwgTkZRQV9QQUNLRVRfSERSLCBzaXplb2YocG1zZyksICZwbXNnKTsKQEAgLTQ4MCw4ICs0ODAsOCBAQAogI2VuZGlmCiAJfQogCi0JaWYgKGVudHNrYi0+bmZtYXJrKSB7Ci0JCXRtcF91aW50ID0gaHRvbmwoZW50c2tiLT5uZm1hcmspOworCWlmIChlbnRza2ItPm1hcmspIHsKKwkJdG1wX3VpbnQgPSBodG9ubChlbnRza2ItPm1hcmspOwogCQlORkFfUFVUKHNrYiwgTkZRQV9NQVJLLCBzaXplb2YodV9pbnQzMl90KSwgJnRtcF91aW50KTsKIAl9CiAKQEAgLTQ4OSwxMCArNDg5LDkgQEAKIAkgICAgJiYgZW50c2tiLT5kZXYtPmhhcmRfaGVhZGVyX3BhcnNlKSB7CiAJCXN0cnVjdCBuZnFubF9tc2dfcGFja2V0X2h3IHBodzsKIAotCQlwaHcuaHdfYWRkcmxlbiA9Ci0JCQllbnRza2ItPmRldi0+aGFyZF9oZWFkZXJfcGFyc2UoZW50c2tiLAorCQlpbnQgbGVuID0gZW50c2tiLT5kZXYtPmhhcmRfaGVhZGVyX3BhcnNlKGVudHNrYiwKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh3Lmh3X2FkZHIpOwotCQlwaHcuaHdfYWRkcmxlbiA9IGh0b25zKHBody5od19hZGRybGVuKTsKKwkJcGh3Lmh3X2FkZHJsZW4gPSBodG9ucyhsZW4pOwogCQlORkFfUFVUKHNrYiwgTkZRQV9IV0FERFIsIHNpemVvZihwaHcpLCAmcGh3KTsKIAl9CiAKQEAgLTYyMiw5ICs2MjEsMTAgQEAKIAlpbnQgZGlmZjsKIAogCWRpZmYgPSBkYXRhX2xlbiAtIGUtPnNrYi0+bGVuOwotCWlmIChkaWZmIDwgMCkKLQkJc2tiX3RyaW0oZS0+c2tiLCBkYXRhX2xlbik7Ci0JZWxzZSBpZiAoZGlmZiA+IDApIHsKKwlpZiAoZGlmZiA8IDApIHsKKwkJaWYgKHBza2JfdHJpbShlLT5za2IsIGRhdGFfbGVuKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSBpZiAoZGlmZiA+IDApIHsKIAkJaWYgKGRhdGFfbGVuID4gMHhGRkZGKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChkaWZmID4gc2tiX3RhaWxyb29tKGUtPnNrYikpIHsKQEAgLTgzNCw4ICs4MzQsOCBAQAogCX0KIAogCWlmIChuZnFhW05GUUFfTUFSSy0xXSkKLQkJZW50cnktPnNrYi0+bmZtYXJrID0gbnRvaGwoKih1X2ludDMyX3QgKikKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZBX0RBVEEobmZxYVtORlFBX01BUkstMV0pKTsKKwkJZW50cnktPnNrYi0+bWFyayA9IG50b2hsKCooX19iZTMyICopCisJCSAgICAgICAgICAgICAgICAgICAgICAgICBORkFfREFUQShuZnFhW05GUUFfTUFSSy0xXSkpOwogCQkKIAlpc3N1ZV92ZXJkaWN0KGVudHJ5LCB2ZXJkaWN0KTsKIAlpbnN0YW5jZV9wdXQocXVldWUpOwpAQCAtOTQ3LDYgKzk0NywxNCBAQAogCQkJCW50b2hsKHBhcmFtcy0+Y29weV9yYW5nZSkpOwogCX0KIAorCWlmIChuZnFhW05GUUFfQ0ZHX1FVRVVFX01BWExFTi0xXSkgeworCQlfX2JlMzIgKnF1ZXVlX21heGxlbjsKKwkJcXVldWVfbWF4bGVuID0gTkZBX0RBVEEobmZxYVtORlFBX0NGR19RVUVVRV9NQVhMRU4tMV0pOworCQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwkJcXVldWUtPnF1ZXVlX21heGxlbiA9IG50b2hsKCpxdWV1ZV9tYXhsZW4pOworCQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOworCX0KKwogb3V0X3B1dDoKIAlpbnN0YW5jZV9wdXQocXVldWUpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMgYi9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKaW5kZXggNTg1MjJmYy4uODk5NjU4NCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKaW5kZXggYzAxNTI0Zi4uMDUzNGJmYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwpAQCAtMzEsNiArMzEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgorI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaD4KKyNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgaW50CiB0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLApAQCAtNDIsNyArNDUsNyBAQAogewogCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKIAl1X2ludDMyX3QgZGlmZjsKLQl1X2ludDMyX3QgbmZtYXJrOworCXVfaW50MzJfdCBtYXJrOwogCXVfaW50MzJfdCBuZXdtYXJrOwogCXVfaW50MzJfdCBjdGluZm87CiAJdV9pbnQzMl90ICpjdG1hcmsgPSBuZl9jdF9nZXRfbWFyaygqcHNrYiwgJmN0aW5mbyk7CkBAIC02Miw3ICs2NSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBYVF9DT05OTUFSS19TQVZFOgogCQkJbmV3bWFyayA9ICgqY3RtYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8Ci0JCQkJICAoKCpwc2tiKS0+bmZtYXJrICYgbWFya2luZm8tPm1hc2spOworCQkJCSAgKCgqcHNrYiktPm1hcmsgJiBtYXJraW5mby0+bWFzayk7CiAJCQlpZiAoKmN0bWFyayAhPSBuZXdtYXJrKSB7CiAJCQkJKmN0bWFyayA9IG5ld21hcms7CiAjaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQpAQCAtNzMsMTAgKzc2LDEwIEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBYVF9DT05OTUFSS19SRVNUT1JFOgotCQkJbmZtYXJrID0gKCpwc2tiKS0+bmZtYXJrOwotCQkJZGlmZiA9ICgqY3RtYXJrIF4gbmZtYXJrKSAmIG1hcmtpbmZvLT5tYXNrOworCQkJbWFyayA9ICgqcHNrYiktPm1hcms7CisJCQlkaWZmID0gKCpjdG1hcmsgXiBtYXJrKSAmIG1hcmtpbmZvLT5tYXNrOwogCQkJaWYgKGRpZmYgIT0gMCkKLQkJCQkoKnBza2IpLT5uZm1hcmsgPSBuZm1hcmsgXiBkaWZmOworCQkJCSgqcHNrYiktPm1hcmsgPSBtYXJrIF4gZGlmZjsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtOTMsNiArOTYsMTEgQEAKIHsKIAlzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8gKm1hdGNoaW5mbyA9IHRhcmdpbmZvOwogCisJaWYgKG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQodGFyZ2V0LT5mYW1pbHkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCisJCQkJICAgICJwcm90bz0lZFxuIiwgdGFyZ2V0LT5mYW1pbHkpOworCQlyZXR1cm4gMDsKKwl9CiAJaWYgKG1hdGNoaW5mby0+bW9kZSA9PSBYVF9DT05OTUFSS19SRVNUT1JFKSB7CiAJCWlmIChzdHJjbXAodGFibGVuYW1lLCAibWFuZ2xlIikgIT0gMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ09OTk1BUks6IHJlc3RvcmUgY2FuIG9ubHkgYmUgIgpAQCAtMTA4LDYgKzExNiwxMiBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgdm9pZAorZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsIHZvaWQgKnRhcmdpbmZvKQoreworCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCh0YXJnZXQtPmZhbWlseSk7Cit9CisKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBzdHJ1Y3QgY29tcGF0X3h0X2Nvbm5tYXJrX3RhcmdldF9pbmZvIHsKIAljb21wYXRfdWxvbmdfdAltYXJrLCBtYXNrOwpAQCAtMTQ0LDYgKzE1OCw3IEBACiAJCS5uYW1lCQk9ICJDT05OTUFSSyIsCiAJCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCQkuZGVzdHJveQk9IGRlc3Ryb3ksCiAJCS50YXJnZXQJCT0gdGFyZ2V0LAogCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8pLAogI2lmZGVmIENPTkZJR19DT01QQVQKQEAgLTE1Nyw2ICsxNzIsNyBAQAogCQkubmFtZQkJPSAiQ09OTk1BUksiLAogCQkuZmFtaWx5CQk9IEFGX0lORVQ2LAogCQkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJCS5kZXN0cm95CT0gZGVzdHJveSwKIAkJLnRhcmdldAkJPSB0YXJnZXQsCiAJCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbyksCiAJCS5tZQkJPSBUSElTX01PRFVMRQpAQCAtMTY1LDcgKzE4MSw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHh0X2Nvbm5tYXJrX2luaXQodm9pZCkKIHsKLQluZWVkX2Nvbm50cmFjaygpOwogCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXRzKHh0X2Nvbm5tYXJrX3RhcmdldCwKIAkJCQkgICBBUlJBWV9TSVpFKHh0X2Nvbm5tYXJrX3RhcmdldCkpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jIGIvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jCmluZGV4IDQ2NzM4NjIuLmEzZmUzYzMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmMKQEAgLTkzLDYgKzkzLDExIEBACiB7CiAJc3RydWN0IHh0X2Nvbm5zZWNtYXJrX3RhcmdldF9pbmZvICppbmZvID0gdGFyZ2luZm87CiAKKwlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldCh0YXJnZXQtPmZhbWlseSkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNhbid0IGxvYWQgY29ubnRyYWNrIHN1cHBvcnQgZm9yICIKKwkJCQkgICAgInByb3RvPSVkXG4iLCB0YXJnZXQtPmZhbWlseSk7CisJCXJldHVybiAwOworCX0KIAlzd2l0Y2ggKGluZm8tPm1vZGUpIHsKIAljYXNlIENPTk5TRUNNQVJLX1NBVkU6CiAJY2FzZSBDT05OU0VDTUFSS19SRVNUT1JFOgpAQCAtMTA2LDExICsxMTEsMTggQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQKK2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnaW5mbykKK3sKKwluZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQodGFyZ2V0LT5mYW1pbHkpOworfQorCiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCB4dF9jb25uc2VjbWFya190YXJnZXRbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJDT05OU0VDTUFSSyIsCiAJCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCQkuZGVzdHJveQk9IGRlc3Ryb3ksCiAJCS50YXJnZXQJCT0gdGFyZ2V0LAogCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY29ubnNlY21hcmtfdGFyZ2V0X2luZm8pLAogCQkudGFibGUJCT0gIm1hbmdsZSIsCkBAIC0xMjAsNiArMTMyLDcgQEAKIAkJLm5hbWUJCT0gIkNPTk5TRUNNQVJLIiwKIAkJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCQkuZGVzdHJveQk9IGRlc3Ryb3ksCiAJCS50YXJnZXQJCT0gdGFyZ2V0LAogCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfY29ubnNlY21hcmtfdGFyZ2V0X2luZm8pLAogCQkudGFibGUJCT0gIm1hbmdsZSIsCkBAIC0xMjksNyArMTQyLDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgeHRfY29ubnNlY21hcmtfaW5pdCh2b2lkKQogewotCW5lZWRfY29ubnRyYWNrKCk7CiAJcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldHMoeHRfY29ubnNlY21hcmtfdGFyZ2V0LAogCQkJCSAgIEFSUkFZX1NJWkUoeHRfY29ubnNlY21hcmtfdGFyZ2V0KSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCmluZGV4IGM2ZTg2MGEuLjBiNDg1NDcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCkBAIC0zMSw4ICszMSw4IEBACiB7CiAJY29uc3Qgc3RydWN0IHh0X21hcmtfdGFyZ2V0X2luZm8gKm1hcmtpbmZvID0gdGFyZ2luZm87CiAKLQlpZigoKnBza2IpLT5uZm1hcmsgIT0gbWFya2luZm8tPm1hcmspCi0JCSgqcHNrYiktPm5mbWFyayA9IG1hcmtpbmZvLT5tYXJrOworCWlmKCgqcHNrYiktPm1hcmsgIT0gbWFya2luZm8tPm1hcmspCisJCSgqcHNrYiktPm1hcmsgPSBtYXJraW5mby0+bWFyazsKIAogCXJldHVybiBYVF9DT05USU5VRTsKIH0KQEAgLTU0LDE2ICs1NCwxNiBAQAogCQlicmVhazsKIAkJCiAJY2FzZSBYVF9NQVJLX0FORDoKLQkJbWFyayA9ICgqcHNrYiktPm5mbWFyayAmIG1hcmtpbmZvLT5tYXJrOworCQltYXJrID0gKCpwc2tiKS0+bWFyayAmIG1hcmtpbmZvLT5tYXJrOwogCQlicmVhazsKIAkJCiAJY2FzZSBYVF9NQVJLX09SOgotCQltYXJrID0gKCpwc2tiKS0+bmZtYXJrIHwgbWFya2luZm8tPm1hcms7CisJCW1hcmsgPSAoKnBza2IpLT5tYXJrIHwgbWFya2luZm8tPm1hcms7CiAJCWJyZWFrOwogCX0KIAotCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJrKQotCQkoKnBza2IpLT5uZm1hcmsgPSBtYXJrOworCWlmKCgqcHNrYiktPm1hcmsgIT0gbWFyaykKKwkJKCpwc2tiKS0+bWFyayA9IG1hcms7CiAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X05GTE9HLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X05GTE9HLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZWQ3YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTkZMT0cuYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9ORkxPRy5oPgorCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigieF90YWJsZXMgTkZMT0cgdGFyZ2V0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9ORkxPRyIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X05GTE9HIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK25mbG9nX3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAorCSAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCit7CisJY29uc3Qgc3RydWN0IHh0X25mbG9nX2luZm8gKmluZm8gPSB0YXJnaW5mbzsKKwlzdHJ1Y3QgbmZfbG9naW5mbyBsaTsKKworCWxpLnR5cGUJCSAgICAgPSBORl9MT0dfVFlQRV9VTE9HOworCWxpLnUudWxvZy5jb3B5X2xlbiAgID0gaW5mby0+bGVuOworCWxpLnUudWxvZy5ncm91cAkgICAgID0gaW5mby0+Z3JvdXA7CisJbGkudS51bG9nLnF0aHJlc2hvbGQgPSBpbmZvLT50aHJlc2hvbGQ7CisKKwluZl9sb2dfcGFja2V0KHRhcmdldC0+ZmFtaWx5LCBob29rbnVtLCAqcHNrYiwgaW4sIG91dCwgJmxpLAorCQkgICAgICAiJXMiLCBpbmZvLT5wcmVmaXgpOworCXJldHVybiBYVF9DT05USU5VRTsKK30KKworc3RhdGljIGludAorbmZsb2dfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAorCQkgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LCB2b2lkICp0YXJnZXRpbmZvLAorCQkgdW5zaWduZWQgaW50IGhvb2ttYXNrKQoreworCXN0cnVjdCB4dF9uZmxvZ19pbmZvICppbmZvID0gdGFyZ2V0aW5mbzsKKworCWlmIChpbmZvLT5mbGFncyAmIH5YVF9ORkxPR19NQVNLKQorCQlyZXR1cm4gMDsKKwlpZiAoaW5mby0+cHJlZml4W3NpemVvZihpbmZvLT5wcmVmaXgpIC0gMV0gIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHh0X25mbG9nX3RhcmdldFtdID0geworCXsKKwkJLm5hbWUJCT0gIk5GTE9HIiwKKwkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuY2hlY2tlbnRyeQk9IG5mbG9nX2NoZWNrZW50cnksCisJCS50YXJnZXQJCT0gbmZsb2dfdGFyZ2V0LAorCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfbmZsb2dfaW5mbyksCisJCS5tZQkJPSBUSElTX01PRFVMRSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIk5GTE9HIiwKKwkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmNoZWNrZW50cnkJPSBuZmxvZ19jaGVja2VudHJ5LAorCQkudGFyZ2V0CQk9IG5mbG9nX3RhcmdldCwKKwkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X25mbG9nX2luZm8pLAorCQkubWUJCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHh0X25mbG9nX2luaXQodm9pZCkKK3sKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0cyh4dF9uZmxvZ190YXJnZXQsCisJCQkJICAgQVJSQVlfU0laRSh4dF9uZmxvZ190YXJnZXQpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHh0X25mbG9nX2Zpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX3RhcmdldHMoeHRfbmZsb2dfdGFyZ2V0LCBBUlJBWV9TSVpFKHh0X25mbG9nX3RhcmdldCkpOworfQorCittb2R1bGVfaW5pdCh4dF9uZmxvZ19pbml0KTsKK21vZHVsZV9leGl0KHh0X25mbG9nX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYwppbmRleCBkYjliODk2Li4zOWUxMTc1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYwpAQCAtNjgsNyArNjgsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgeHRfbmZxdWV1ZV9maW5pKHZvaWQpCiB7Ci0JeHRfcmVnaXN0ZXJfdGFyZ2V0cyh4dF9uZnF1ZXVlX3RhcmdldCwgQVJSQVlfU0laRSh4dF9uZnF1ZXVlX3RhcmdldCkpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0cyh4dF9uZnF1ZXVlX3RhcmdldCwgQVJSQVlfU0laRSh4dF9uZnF1ZXVlX3RhcmdldCkpOwogfQogCiBtb2R1bGVfaW5pdCh4dF9uZnF1ZXVlX2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKaW5kZXggZGNjNDk3ZS4uZDkzY2IwOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCkBAIC0xMzksMTUgKzEzOSwyOCBAQAogCSAgICBzaW5mby0+ZGlyZWN0aW9uICE9IFhUX0NPTk5CWVRFU19ESVJfQk9USCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldChtYXRjaC0+ZmFtaWx5KSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgbG9hZCBjb25udHJhY2sgc3VwcG9ydCBmb3IgIgorCQkJCSAgICAicHJvdG89JWRcbiIsIG1hdGNoLT5mYW1pbHkpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQKK2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvKQoreworCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChtYXRjaC0+ZmFtaWx5KTsKK30KKwogc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB4dF9jb25uYnl0ZXNfbWF0Y2hbXSA9IHsKIAl7CiAJCS5uYW1lCQk9ICJjb25uYnl0ZXMiLAogCQkuZmFtaWx5CQk9IEFGX0lORVQsCiAJCS5jaGVja2VudHJ5CT0gY2hlY2ssCiAJCS5tYXRjaAkJPSBtYXRjaCwKKwkJLmRlc3Ryb3kJPSBkZXN0cm95LAogCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9jb25uYnl0ZXNfaW5mbyksCiAJCS5tZQkJPSBUSElTX01PRFVMRQogCX0sCkBAIC0xNTYsNiArMTY5LDcgQEAKIAkJLmZhbWlseQkJPSBBRl9JTkVUNiwKIAkJLmNoZWNrZW50cnkJPSBjaGVjaywKIAkJLm1hdGNoCQk9IG1hdGNoLAorCQkuZGVzdHJveQk9IGRlc3Ryb3ksCiAJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvKSwKIAkJLm1lCQk9IFRISVNfTU9EVUxFCiAJfSwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYwppbmRleCA5MmE1NzI2Li4zNmMyZGVmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCkBAIC02MywyMiArNjMsMTggQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29ubm1hcms6IG9ubHkgc3VwcG9ydCAzMmJpdCBtYXJrXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIAlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldChtYXRjaC0+ZmFtaWx5KSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgbG9hZCBuZl9jb25udHJhY2sgc3VwcG9ydCBmb3IgIgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCiAJCQkJICAgICJwcm90bz0lZFxuIiwgbWF0Y2gtPmZhbWlseSk7CiAJCXJldHVybiAwOwogCX0KLSNlbmRpZgogCXJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoLCB2b2lkICptYXRjaGluZm8pCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChtYXRjaC0+ZmFtaWx5KTsKLSNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVApAQCAtMTQwLDE0ICsxMzYsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgeHRfY29ubm1hcmtfaW5pdCh2b2lkKQogewotCW5lZWRfY29ubnRyYWNrKCk7CiAJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoZXMoeHRfY29ubm1hcmtfbWF0Y2gsCiAJCQkJICAgQVJSQVlfU0laRSh4dF9jb25ubWFya19tYXRjaCkpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgeHRfY29ubm1hcmtfZmluaSh2b2lkKQogewotCXh0X3JlZ2lzdGVyX21hdGNoZXMoeHRfY29ubm1hcmtfbWF0Y2gsIEFSUkFZX1NJWkUoeHRfY29ubm1hcmtfbWF0Y2gpKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoZXMoeHRfY29ubm1hcmtfbWF0Y2gsIEFSUkFZX1NJWkUoeHRfY29ubm1hcmtfbWF0Y2gpKTsKIH0KIAogbW9kdWxlX2luaXQoeHRfY29ubm1hcmtfaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jIGIvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYwppbmRleCAwZWE1MDFhLi4zZGMyMzU3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7CkBAIC0yMjgsMjEgKzIyOSwxNyBAQAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIAlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldChtYXRjaC0+ZmFtaWx5KSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgbG9hZCBuZl9jb25udHJhY2sgc3VwcG9ydCBmb3IgIgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCiAJCQkJICAgICJwcm90bz0lZFxuIiwgbWF0Y2gtPmZhbWlseSk7CiAJCXJldHVybiAwOwogCX0KLSNlbmRpZgogCXJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBkZXN0cm95KGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbykKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCiAJbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KG1hdGNoLT5mYW1pbHkpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29ubnRyYWNrX21hdGNoID0gewpAQCAtMjU3LDcgKzI1NCw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHh0X2Nvbm50cmFja19pbml0KHZvaWQpCiB7Ci0JbmVlZF9jb25udHJhY2soKTsKIAlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJmNvbm50cmFja19tYXRjaCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTZlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCkBAIC0wLDAgKzEsNzczIEBACisvKiBpcHRhYmxlcyBtYXRjaCBleHRlbnNpb24gdG8gbGltaXQgdGhlIG51bWJlciBvZiBwYWNrZXRzIHBlciBzZWNvbmQKKyAqIHNlcGVyYXRlbHkgZm9yIGVhY2ggaGFzaGJ1Y2tldCAoc291cmNlaXAvc291cmNlcG9ydC9kc3RpcC9kc3Rwb3J0KQorICoKKyAqIChDKSAyMDAzLTIwMDQgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogJElkOiBpcHRfaGFzaGxpbWl0LmMgMzI0NCAyMDA0LTEwLTIwIDE2OjI0OjI5WiBsYWZvcmdlQG5ldGZpbHRlci5vcmcgJAorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSB3YXMgZnVuZGVkIGJ5IEFzdGFybyBBRywgaHR0cDovL3d3dy5hc3Rhcm8uY29tLworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIG1hdGNoIGZvciBsaW1pdGluZyBwZXIgaGFzaC1idWNrZXQiKTsKK01PRFVMRV9BTElBUygiaXB0X2hhc2hsaW1pdCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X2hhc2hsaW1pdCIpOworCisvKiBuZWVkIHRvIGRlY2xhcmUgdGhpcyBhdCB0aGUgdG9wICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpoYXNobGltaXRfcHJvY2RpcjQ7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpoYXNobGltaXRfcHJvY2RpcjY7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wczsKKworLyogaGFzaCB0YWJsZSBjcmFwICovCitzdHJ1Y3QgZHN0aGFzaF9kc3QgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fYmUzMiBzcmM7CisJCQlfX2JlMzIgZHN0OworCQl9IGlwOworCQlzdHJ1Y3QgeworCQkJX19iZTMyIHNyY1s0XTsKKwkJCV9fYmUzMiBkc3RbNF07CisJCX0gaXA2OworCX0gYWRkcjsKKwlfX2JlMTYgc3JjX3BvcnQ7CisJX19iZTE2IGRzdF9wb3J0OworfTsKKworc3RydWN0IGRzdGhhc2hfZW50IHsKKwkvKiBzdGF0aWMgLyByZWFkLW9ubHkgcGFydHMgaW4gdGhlIGJlZ2lubmluZyAqLworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CisJc3RydWN0IGRzdGhhc2hfZHN0IGRzdDsKKworCS8qIG1vZGlmaWVkIHN0cnVjdHVyZSBtZW1iZXJzIGluIHRoZSBlbmQgKi8KKwl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CQkvKiBwcmVjYWxjdWxhdGVkIGV4cGlyeSB0aW1lICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBwcmV2OwkvKiBsYXN0IG1vZGlmaWNhdGlvbiAqLworCQl1X2ludDMyX3QgY3JlZGl0OworCQl1X2ludDMyX3QgY3JlZGl0X2NhcCwgY29zdDsKKwl9IHJhdGVpbmZvOworfTsKKworc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgeworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CQkvKiBnbG9iYWwgbGlzdCBvZiBhbGwgaHRhYmxlcyAqLworCWF0b21pY190IHVzZTsKKwlpbnQgZmFtaWx5OworCisJc3RydWN0IGhhc2hsaW1pdF9jZmcgY2ZnOwkvKiBjb25maWcgKi8KKworCS8qIHVzZWQgaW50ZXJuYWxseSAqLworCXNwaW5sb2NrX3QgbG9jazsJCS8qIGxvY2sgZm9yIGxpc3RfaGVhZCAqLworCXVfaW50MzJfdCBybmQ7CQkJLyogcmFuZG9tIHNlZWQgZm9yIGhhc2ggKi8KKwlpbnQgcm5kX2luaXRpYWxpemVkOworCXVuc2lnbmVkIGludCBjb3VudDsJCS8qIG51bWJlciBlbnRyaWVzIGluIHRhYmxlICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIHRpbWVyIGZvciBnYyAqLworCisJLyogc2VxX2ZpbGUgc3R1ZmYgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKworCXN0cnVjdCBobGlzdF9oZWFkIGhhc2hbMF07CS8qIGhhc2h0YWJsZSBpdHNlbGYgKi8KK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaGFzaGxpbWl0X2xvY2spOwkvKiBwcm90ZWN0cyBodGFibGVzIGxpc3QgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoaGxpbWl0X211dGV4KTsJLyogYWRkaXRpb25hbCBjaGVja2VudHJ5IHByb3RlY3Rpb24gKi8KK3N0YXRpYyBITElTVF9IRUFEKGhhc2hsaW1pdF9odGFibGVzKTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaGFzaGxpbWl0X2NhY2hlcCBfX3JlYWRfbW9zdGx5OworCitzdGF0aWMgaW5saW5lIGludCBkc3RfY21wKGNvbnN0IHN0cnVjdCBkc3RoYXNoX2VudCAqZW50LCBzdHJ1Y3QgZHN0aGFzaF9kc3QgKmIpCit7CisJcmV0dXJuICFtZW1jbXAoJmVudC0+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+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgKmJ1Y2tldCA9ICh1bnNpZ25lZCBpbnQgKil2OworCXN0cnVjdCBkc3RoYXNoX2VudCAqZW50OworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlpZiAoIWhsaXN0X2VtcHR5KCZodGFibGUtPmhhc2hbKmJ1Y2tldF0pKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudCwgcG9zLCAmaHRhYmxlLT5oYXNoWypidWNrZXRdLCBub2RlKQorCQkJaWYgKGRsX3NlcV9yZWFsX3Nob3coZW50LCBodGFibGUtPmZhbWlseSwgcykpCisJCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRsX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGxfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IGRsX3NlcV9uZXh0LAorCS5zdG9wICA9IGRsX3NlcV9zdG9wLAorCS5zaG93ICA9IGRsX3NlcV9zaG93Cit9OworCitzdGF0aWMgaW50IGRsX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHMpOworCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICpzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc2YtPnByaXZhdGUgPSBQREUoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gZGxfcHJvY19vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQorfTsKKworc3RhdGljIGludCBfX2luaXQgeHRfaGFzaGxpbWl0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0geHRfcmVnaXN0ZXJfbWF0Y2hlcyh4dF9oYXNobGltaXQsIEFSUkFZX1NJWkUoeHRfaGFzaGxpbWl0KSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMTsKKworCWVyciA9IC1FTk9NRU07CisJaGFzaGxpbWl0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJ4dF9oYXNobGltaXQiLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBkc3RoYXNoX2VudCksIDAsIDAsCisJCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlpZiAoIWhhc2hsaW1pdF9jYWNoZXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4dF9oYXNobGltaXQ6IHVuYWJsZSB0byBjcmVhdGUgc2xhYiBjYWNoZVxuIik7CisJCWdvdG8gZXJyMjsKKwl9CisJaGFzaGxpbWl0X3Byb2NkaXI0ID0gcHJvY19ta2RpcigiaXB0X2hhc2hsaW1pdCIsIHByb2NfbmV0KTsKKwlpZiAoIWhhc2hsaW1pdF9wcm9jZGlyNCkgeworCQlwcmludGsoS0VSTl9FUlIgInh0X2hhc2hsaW1pdDogdW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiCisJCQkJImVudHJ5XG4iKTsKKwkJZ290byBlcnIzOworCX0KKwloYXNobGltaXRfcHJvY2RpcjYgPSBwcm9jX21rZGlyKCJpcDZ0X2hhc2hsaW1pdCIsIHByb2NfbmV0KTsKKwlpZiAoIWhhc2hsaW1pdF9wcm9jZGlyNikgeworCQlwcmludGsoS0VSTl9FUlIgInh0X2hhc2hsaW1pdDogdG5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiCisJCQkJImVudHJ5XG4iKTsKKwkJZ290byBlcnI0OworCX0KKwlyZXR1cm4gMDsKK2VycjQ6CisJcmVtb3ZlX3Byb2NfZW50cnkoImlwdF9oYXNobGltaXQiLCBwcm9jX25ldCk7CitlcnIzOgorCWttZW1fY2FjaGVfZGVzdHJveShoYXNobGltaXRfY2FjaGVwKTsKK2VycjI6CisJeHRfdW5yZWdpc3Rlcl9tYXRjaGVzKHh0X2hhc2hsaW1pdCwgQVJSQVlfU0laRSh4dF9oYXNobGltaXQpKTsKK2VycjE6CisJcmV0dXJuIGVycjsKKworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeHRfaGFzaGxpbWl0X2Zpbmkodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiaXB0X2hhc2hsaW1pdCIsIHByb2NfbmV0KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiaXA2dF9oYXNobGltaXQiLCBwcm9jX25ldCk7CisJa21lbV9jYWNoZV9kZXN0cm95KGhhc2hsaW1pdF9jYWNoZXApOworCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyh4dF9oYXNobGltaXQsIEFSUkFZX1NJWkUoeHRfaGFzaGxpbWl0KSk7Cit9CisKK21vZHVsZV9pbml0KHh0X2hhc2hsaW1pdF9pbml0KTsKK21vZHVsZV9leGl0KHh0X2hhc2hsaW1pdF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCmluZGV4IDVkNzgxOGIuLjA0YmMzMmIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwpAQCAtMjQsNiArMjQsNyBAQAogI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJ0aW4gSm9zZWZzc29uIDxnYW5kYWxmQG5ldGZpbHRlci5vcmc+Iik7CkBAIC0xNDMsMTMgKzE0NCwxMSBAQAogewogCXN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIAlpZiAobmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldChtYXRjaC0+ZmFtaWx5KSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgbG9hZCBuZl9jb25udHJhY2sgc3VwcG9ydCBmb3IgIgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCiAJCQkJICAgICJwcm90bz0lZFxuIiwgbWF0Y2gtPmZhbWlseSk7CiAJCXJldHVybiAwOwogCX0KLSNlbmRpZgogCWluZm8tPm5hbWVbMjldID0gJ1wwJzsKIAlyZXR1cm4gMTsKIH0KQEAgLTE1Nyw5ICsxNTYsNyBAQAogc3RhdGljIHZvaWQKIGRlc3Ryb3koY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwgdm9pZCAqbWF0Y2hpbmZvKQogewotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIAluZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQobWF0Y2gtPmZhbWlseSk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB4dF9oZWxwZXJfbWF0Y2hbXSA9IHsKQEAgLTE4NSw3ICsxODIsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB4dF9oZWxwZXJfaW5pdCh2b2lkKQogewotCW5lZWRfY29ubnRyYWNrKCk7CiAJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoZXMoeHRfaGVscGVyX21hdGNoLAogCQkJCSAgIEFSUkFZX1NJWkUoeHRfaGVscGVyX21hdGNoKSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X21hcmsuYyBiL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jCmluZGV4IDkzNGRkZGYuLmRmYTFlZTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbWFyay5jCkBAIC0zMSw3ICszMSw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHh0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAotCXJldHVybiAoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7CisJcmV0dXJuICgoc2tiLT5tYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfbXVsdGlwb3J0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X211bHRpcG9ydC5jCmluZGV4IGQzYWVmZDMuLjE2MDIwODYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfbXVsdGlwb3J0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9tdWx0aXBvcnQuYwpAQCAtMSw1ICsxLDUgQEAKLS8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggb25lIG9mIGEgbGlzdCBvZiBUQ1AvVURQL1NDVFAvRENDUCBwb3J0czogcG9ydHMgYXJlIGluCi0gICB0aGUgc2FtZSBwbGFjZSBzbyB3ZSBjYW4gdHJlYXQgdGhlbSBhcyBlcXVhbC4gKi8KKy8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggb25lIG9mIGEgbGlzdCBvZiBUQ1AvVURQKC1MaXRlKS9TQ1RQL0RDQ1AgcG9ydHM6CisgICBwb3J0cyBhcmUgaW4gdGhlIHNhbWUgcGxhY2Ugc28gd2UgY2FuIHRyZWF0IHRoZW0gYXMgZXF1YWwuICovCiAKIC8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKICAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JdTE2IF9wb3J0c1syXSwgKnBwdHI7CisJX19iZTE2IF9wb3J0c1syXSwgKnBwdHI7CiAJY29uc3Qgc3RydWN0IHh0X211bHRpcG9ydCAqbXVsdGlpbmZvID0gbWF0Y2hpbmZvOwogCiAJaWYgKG9mZnNldCkKQEAgLTEzNSw3ICsxMzUsNyBAQAogCSB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKIAkgaW50ICpob3Rkcm9wKQogewotCXUxNiBfcG9ydHNbMl0sICpwcHRyOworCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOwogCWNvbnN0IHN0cnVjdCB4dF9tdWx0aXBvcnRfdjEgKm11bHRpaW5mbyA9IG1hdGNoaW5mbzsKIAogCWlmIChvZmZzZXQpCkBAIC0xNjIsNiArMTYyLDcgQEAKIHsKIAkvKiBNdXN0IHNwZWNpZnkgc3VwcG9ydGVkIHByb3RvY29sLCBubyB1bmtub3duIGZsYWdzIG9yIGJhZCBjb3VudCAqLwogCXJldHVybiAocHJvdG8gPT0gSVBQUk9UT19UQ1AgfHwgcHJvdG8gPT0gSVBQUk9UT19VRFAKKwkJfHwgcHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFCiAJCXx8IHByb3RvID09IElQUFJPVE9fU0NUUCB8fCBwcm90byA9PSBJUFBST1RPX0RDQ1ApCiAJCSYmICEoaXBfaW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pCiAJCSYmIChtYXRjaF9mbGFncyA9PSBYVF9NVUxUSVBPUlRfU09VUkNFCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCmluZGV4IGZkOGY5NTQuLmI5YjNmZmMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCkBAIC0xMTMsMjAgKzExMywxNiBAQAogCWlmICghKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX01BU0spIHx8CiAJICAgIGluZm8tPmJpdG1hc2sgJiB+WFRfUEhZU0RFVl9PUF9NQVNLKQogCQlyZXR1cm4gMDsKLQlpZiAoYnJuZl9kZWZlcnJlZF9ob29rcyA9PSAwICYmCi0JICAgIGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX09VVCAmJgorCWlmIChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9PVVQgJiYKIAkgICAgKCEoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkgfHwKIAkgICAgIGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkgJiYKIAkgICAgaG9va19tYXNrICYgKCgxIDw8IE5GX0lQX0xPQ0FMX09VVCkgfCAoMSA8PCBORl9JUF9GT1JXQVJEKSB8CiAJICAgICAgICAgICAgICAgICAoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJwaHlzZGV2IG1hdGNoOiB1c2luZyAtLXBoeXNkZXYtb3V0IGluIHRoZSAiCiAJCSAgICAgICAiT1VUUFVULCBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgZm9yIG5vbi1icmlkZ2VkICIKLQkJICAgICAgICJ0cmFmZmljIGlzIGRlcHJlY2F0ZWQgYW5kIGJyZWFrcyBvdGhlciB0aGluZ3MsIGl0IHdpbGwgIgotCQkgICAgICAgImJlIHJlbW92ZWQgaW4gSmFudWFyeSAyMDA3LiBTZWUgRG9jdW1lbnRhdGlvbi8iCi0JCSAgICAgICAiZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBmb3IgZGV0YWlscy4gVGhpcyBkb2Vzbid0ICIKLQkJICAgICAgICJhZmZlY3QgeW91IGluIGNhc2UgeW91J3JlIHVzaW5nIGl0IGZvciBwdXJlbHkgYnJpZGdlZCAiCi0JCSAgICAgICAidHJhZmZpYy5cbiIpOwotCQlicm5mX2RlZmVycmVkX2hvb2tzID0gMTsKKwkJICAgICAgICJ0cmFmZmljIGlzIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS5cbiIpOworCQlpZiAoaG9va19tYXNrICYgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSkKKwkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKaW5kZXggNzk1NmFjYS4uNzFiZjAzNiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJZHVwcmludGYoIkNodW5rIG51bTogJWRcdG9mZnNldDogJWRcdHR5cGU6ICVkXHRsZW5ndGg6ICVkXHRmbGFnczogJXhcbiIsIAogCQkJCSsraSwgb2Zmc2V0LCBzY2gtPnR5cGUsIGh0b25zKHNjaC0+bGVuZ3RoKSwgc2NoLT5mbGFncyk7CiAKLQkJb2Zmc2V0ICs9IChodG9ucyhzY2gtPmxlbmd0aCkgKyAzKSAmIH4zOworCQlvZmZzZXQgKz0gKG50b2hzKHNjaC0+bGVuZ3RoKSArIDMpICYgfjM7CiAKIAkJZHVwcmludGYoInNrYi0+bGVuOiAlZFx0b2Zmc2V0OiAlZFxuIiwgc2tiLT5sZW4sIG9mZnNldCk7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYwppbmRleCBkOTAxMGIxLi5kZjM3YjkxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jCkBAIC01MCwyMiArNTAsMTggQEAKIAkJIHZvaWQgKm1hdGNoaW5mbywKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogCWlmIChuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KG1hdGNoLT5mYW1pbHkpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW4ndCBsb2FkIG5mX2Nvbm50cmFjayBzdXBwb3J0IGZvciAiCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNhbid0IGxvYWQgY29ubnRyYWNrIHN1cHBvcnQgZm9yICIKIAkJCQkgICAgInByb3RvPSVkXG4iLCBtYXRjaC0+ZmFtaWx5KTsKIAkJcmV0dXJuIDA7CiAJfQotI2VuZGlmCiAJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkCiBkZXN0cm95KGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsIHZvaWQgKm1hdGNoaW5mbykKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCiAJbmZfY3RfbDNwcm90b19tb2R1bGVfcHV0KG1hdGNoLT5mYW1pbHkpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggeHRfc3RhdGVfbWF0Y2hbXSA9IHsKQEAgLTkxLDcgKzg3LDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgeHRfc3RhdGVfaW5pdCh2b2lkKQogewotCW5lZWRfY29ubnRyYWNrKCk7CiAJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoZXMoeHRfc3RhdGVfbWF0Y2gsIEFSUkFZX1NJWkUoeHRfc3RhdGVfbWF0Y2gpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAuYyBiL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMKaW5kZXggZTc2YTY4ZS4uNDY0MTRiNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3RjcHVkcC5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgogCi1NT0RVTEVfREVTQ1JJUFRJT04oInhfdGFibGVzIG1hdGNoIGZvciBUQ1AgYW5kIFVEUCwgc3VwcG9ydHMgSVB2NCBhbmQgSVB2NiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ4X3RhYmxlcyBtYXRjaCBmb3IgVENQIGFuZCBVRFAoLUxpdGUpLCBzdXBwb3J0cyBJUHY0IGFuZCBJUHY2Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoInh0X3RjcCIpOwogTU9EVUxFX0FMSUFTKCJ4dF91ZHAiKTsKQEAgLTIzNCw2ICsyMzQsMjQgQEAKIAkJLnByb3RvCQk9IElQUFJPVE9fVURQLAogCQkubWUJCT0gVEhJU19NT0RVTEUsCiAJfSwKKwl7CisJCS5uYW1lCQk9ICJ1ZHBsaXRlIiwKKwkJLmZhbWlseQkJPSBBRl9JTkVULAorCQkuY2hlY2tlbnRyeQk9IHVkcF9jaGVja2VudHJ5LAorCQkubWF0Y2gJCT0gdWRwX21hdGNoLAorCQkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF91ZHApLAorCQkucHJvdG8JCT0gSVBQUk9UT19VRFBMSVRFLAorCQkubWUJCT0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJ1ZHBsaXRlIiwKKwkJLmZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLmNoZWNrZW50cnkJPSB1ZHBfY2hlY2tlbnRyeSwKKwkJLm1hdGNoCQk9IHVkcF9tYXRjaCwKKwkJLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdWRwKSwKKwkJLnByb3RvCQk9IElQUFJPVE9fVURQTElURSwKKwkJLm1lCQk9IFRISVNfTU9EVUxFLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB4dF90Y3B1ZHBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL0tjb25maWcgYi9uZXQvbmV0bGFiZWwvS2NvbmZpZwppbmRleCA5ZjcxMjFhLi41Njk1OGM4IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvS2NvbmZpZworKysgYi9uZXQvbmV0bGFiZWwvS2NvbmZpZwpAQCAtNCw3ICs0LDcgQEAKIAogY29uZmlnIE5FVExBQkVMCiAJYm9vbCAiTmV0TGFiZWwgc3Vic3lzdGVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVQgJiYgU0VDVVJJVFkKKwlkZXBlbmRzIG9uIFNFQ1VSSVRZCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCSAgTmV0TGFiZWwgcHJvdmlkZXMgc3VwcG9ydCBmb3IgZXhwbGljaXQgbmV0d29yayBwYWNrZXQgbGFiZWxpbmcKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKaW5kZXggYTZjZTFkNi4uNzQzYjA1NyAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKQEAgLTQwNywxMiArNDA3LDE0IEBACiAKIAlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnRfY29tbW9uKEFVRElUX01BQ19DSVBTT1Y0X0FERCwKIAkJCQkJICAgICAgJmF1ZGl0X2luZm8pOwotCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLAotCQkJICIgY2lwc29fZG9pPSV1IGNpcHNvX3R5cGU9JXMgcmVzPSV1IiwKLQkJCSBkb2ksCi0JCQkgdHlwZV9zdHIsCi0JCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKKwlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCisJCQkJICIgY2lwc29fZG9pPSV1IGNpcHNvX3R5cGU9JXMgcmVzPSV1IiwKKwkJCQkgZG9pLAorCQkJCSB0eXBlX3N0ciwKKwkJCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOworCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7CisJfQogCiAJcmV0dXJuIHJldF92YWw7CiB9CkBAIC00NTIsMTcgKzQ1NCwxMyBAQAogCX0KIAogbGlzdF9zdGFydDoKLQlhbnNfc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFICogbmxzemVfbXVsdCwgR0ZQX0tFUk5FTCk7CisJYW5zX3NrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUgKiBubHN6ZV9tdWx0LCBHRlBfS0VSTkVMKTsKIAlpZiAoYW5zX3NrYiA9PSBOVUxMKSB7CiAJCXJldF92YWwgPSAtRU5PTUVNOwogCQlnb3RvIGxpc3RfZmFpbHVyZTsKIAl9Ci0JZGF0YSA9IG5ldGxibF9uZXRsaW5rX2hkcl9wdXQoYW5zX3NrYiwKLQkJCQkgICAgICBpbmZvLT5zbmRfcGlkLAotCQkJCSAgICAgIGluZm8tPnNuZF9zZXEsCi0JCQkJICAgICAgbmV0bGJsX2NpcHNvdjRfZ25sX2ZhbWlseS5pZCwKLQkJCQkgICAgICAwLAotCQkJCSAgICAgIE5MQkxfQ0lQU09WNF9DX0xJU1QpOworCWRhdGEgPSBnZW5sbXNnX3B1dF9yZXBseShhbnNfc2tiLCBpbmZvLCAmbmV0bGJsX2NpcHNvdjRfZ25sX2ZhbWlseSwKKwkJCQkgMCwgTkxCTF9DSVBTT1Y0X0NfTElTVCk7CiAJaWYgKGRhdGEgPT0gTlVMTCkgewogCQlyZXRfdmFsID0gLUVOT01FTTsKIAkJZ290byBsaXN0X2ZhaWx1cmU7CkBAIC01NjgsNyArNTY2LDcgQEAKIAogCWdlbmxtc2dfZW5kKGFuc19za2IsIGRhdGEpOwogCi0JcmV0X3ZhbCA9IGdlbmxtc2dfdW5pY2FzdChhbnNfc2tiLCBpbmZvLT5zbmRfcGlkKTsKKwlyZXRfdmFsID0gZ2VubG1zZ19yZXBseShhbnNfc2tiLCBpbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGxpc3RfZmFpbHVyZTsKIApAQCAtNjA3LDEyICs2MDUsOSBAQAogCXN0cnVjdCBuZXRsYmxfY2lwc292NF9kb2l3YWxrX2FyZyAqY2JfYXJnID0gYXJnOwogCXZvaWQgKmRhdGE7CiAKLQlkYXRhID0gbmV0bGJsX25ldGxpbmtfaGRyX3B1dChjYl9hcmctPnNrYiwKLQkJCQkgICAgICBORVRMSU5LX0NCKGNiX2FyZy0+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+c25kX3BpZCwKLQkJCQkgICAgICBpbmZvLT5zbmRfc2VxLAotCQkJCSAgICAgIG5ldGxibF91bmxhYmVsX2dubF9mYW1pbHkuaWQsCi0JCQkJICAgICAgMCwKLQkJCQkgICAgICBOTEJMX1VOTEFCRUxfQ19MSVNUKTsKKwlkYXRhID0gZ2VubG1zZ19wdXRfcmVwbHkoYW5zX3NrYiwgaW5mbywgJm5ldGxibF91bmxhYmVsX2dubF9mYW1pbHksCisJCQkJIDAsIE5MQkxfVU5MQUJFTF9DX0xJU1QpOwogCWlmIChkYXRhID09IE5VTEwpIHsKIAkJcmV0X3ZhbCA9IC1FTk9NRU07CiAJCWdvdG8gbGlzdF9mYWlsdXJlOwogCX0KIAorCXJjdV9yZWFkX2xvY2soKTsKIAlyZXRfdmFsID0gbmxhX3B1dF91OChhbnNfc2tiLAogCQkJICAgICBOTEJMX1VOTEFCRUxfQV9BQ1BURkxHLAotCQkJICAgICBhdG9taWNfcmVhZCgmbmV0bGFiZWxfdW5sYWJlbF9hY2NlcHRfZmxnKSk7CisJCQkgICAgIG5ldGxhYmVsX3VubGFiZWxfYWNjZXB0ZmxnKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGxpc3RfZmFpbHVyZTsKIAogCWdlbmxtc2dfZW5kKGFuc19za2IsIGRhdGEpOwogCi0JcmV0X3ZhbCA9IGdlbmxtc2dfdW5pY2FzdChhbnNfc2tiLCBpbmZvLT5zbmRfcGlkKTsKKwlyZXRfdmFsID0gZ2VubG1zZ19yZXBseShhbnNfc2tiLCBpbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGxpc3RfZmFpbHVyZTsKIAlyZXR1cm4gMDsKQEAgLTI0MCwxMCArMjQ3LDE3IEBACiAgKi8KIGludCBuZXRsYmxfdW5sYWJlbF9nZXRhdHRyKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JaWYgKGF0b21pY19yZWFkKCZuZXRsYWJlbF91bmxhYmVsX2FjY2VwdF9mbGcpID09IDEpCi0JCXJldHVybiBuZXRsYmxfc2VjYXR0cl9pbml0KHNlY2F0dHIpOworCWludCByZXRfdmFsOwogCi0JcmV0dXJuIC1FTk9NU0c7CisJcmN1X3JlYWRfbG9jaygpOworCWlmIChuZXRsYWJlbF91bmxhYmVsX2FjY2VwdGZsZyA9PSAxKSB7CisJCW5ldGxibF9zZWNhdHRyX2luaXQoc2VjYXR0cik7CisJCXJldF92YWwgPSAwOworCX0gZWxzZQorCQlyZXRfdmFsID0gLUVOT01TRzsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByZXRfdmFsOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jCmluZGV4IDk4YTQxNjMuLjQyZjEyYmQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYwpAQCAtNDYsNiArNDYsMTAgQEAKICNpbmNsdWRlICJuZXRsYWJlbF9jaXBzb192NC5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX3VzZXIuaCIKIAorLyogZG8gbm90IGRvIGFueSBhdWRpdGluZyBpZiBhdWRpdF9lbmFibGVkID09IDAsIHNlZSBrZXJuZWwvYXVkaXQuYyBmb3IKKyAqIGRldGFpbHMgKi8KK2V4dGVybiBpbnQgYXVkaXRfZW5hYmxlZDsKKwogLyoKICAqIE5ldExhYmVsIE5FVExJTksgU2V0dXAgRnVuY3Rpb25zCiAgKi8KQEAgLTEwMSw2ICsxMDUsOSBAQAogCWNoYXIgKnNlY2N0eDsKIAl1MzIgc2VjY3R4X2xlbjsKIAorCWlmIChhdWRpdF9lbmFibGVkID09IDApCisJCXJldHVybiBOVUxMOworCiAJYXVkaXRfYnVmID0gYXVkaXRfbG9nX3N0YXJ0KGF1ZGl0X2N0eCwgR0ZQX0FUT01JQywgdHlwZSk7CiAJaWYgKGF1ZGl0X2J1ZiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5oCmluZGV4IDQ3OTY3ZWYuLjZkN2Y0YWIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmgKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuaApAQCAtNDIsMzcgKzQyLDYgQEAKIC8qIE5ldExhYmVsIE5FVExJTksgaGVscGVyIGZ1bmN0aW9ucyAqLwogCiAvKioKLSAqIG5ldGxibF9uZXRsaW5rX2hkcl9wdXQgLSBXcml0ZSB0aGUgTkVUTElOSyBidWZmZXJzIGludG8gYSBza19idWZmCi0gKiBAc2tiOiB0aGUgcGFja2V0Ci0gKiBAcGlkOiB0aGUgUElEIG9mIHRoZSByZWNlaXBpZW50Ci0gKiBAc2VxOiB0aGUgc2VxdWVuY2UgbnVtYmVyCi0gKiBAdHlwZTogdGhlIGdlbmVyaWMgTkVUTElOSyBtZXNzYWdlIGZhbWlseSB0eXBlCi0gKiBAY21kOiBjb21tYW5kCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBXcml0ZSBib3RoIGEgTkVUTElOSyBubG1zZ2hkciBzdHJ1Y3R1cmUgYW5kIGEgR2VuZXJpYyBORVRMSU5LIGdlbmxtc2doZHIKLSAqIHN0cnVjdCB0byB0aGUgcGFja2V0LiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXlsb2FkIGJ1ZmZlcgotICogb24gc3VjY2VzcyBvciBOVUxMIG9uIGZhaWx1cmUuCi0gKgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKm5ldGxibF9uZXRsaW5rX2hkcl9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgdTMyIHBpZCwKLQkJCQkJICAgdTMyIHNlcSwKLQkJCQkJICAgaW50IHR5cGUsCi0JCQkJCSAgIGludCBmbGFncywKLQkJCQkJICAgdTggY21kKQotewotCXJldHVybiBnZW5sbXNnX3B1dChza2IsCi0JCQkgICBwaWQsCi0JCQkgICBzZXEsCi0JCQkgICB0eXBlLAotCQkJICAgMCwKLQkJCSAgIGZsYWdzLAotCQkJICAgY21kLAotCQkJICAgTkVUTEJMX1BST1RPX1ZFUlNJT04pOwotfQotCi0vKioKICAqIG5ldGxibF9uZXRsaW5rX2F1ZGl0aW5mbyAtIEZldGNoIHRoZSBhdWRpdCBpbmZvcm1hdGlvbiBmcm9tIGEgTkVUTElOSyBtc2cKICAqIEBza2I6IHRoZSBwYWNrZXQKICAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCmluZGV4IGQ1NmUwZDIuLjI3NjEzMWYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKQEAgLTY5OSw3ICs2OTksNyBAQAogCiBzdHJ1Y3Qgc29jayAqbmV0bGlua19nZXRzb2NrYnlmaWxwKHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3Qgc29jayAqc29jazsKIAogCWlmICghU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpCkBAIC0xMDc1LDggKzEwNzUsOSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWxlbiA9IHNpemVvZihpbnQpOwogCQl2YWwgPSBubGstPmZsYWdzICYgTkVUTElOS19SRUNWX1BLVElORk8gPyAxIDogMDsKLQkJcHV0X3VzZXIobGVuLCBvcHRsZW4pOwotCQlwdXRfdXNlcih2YWwsIG9wdHZhbCk7CisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikgfHwKKwkJICAgIHB1dF91c2VyKHZhbCwgb3B0dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQllcnIgPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTE0NywxMiArMTE0OCwxMSBAQAogCWlmIChsZW4gPiBzay0+c2tfc25kYnVmIC0gMzIpCiAJCWdvdG8gb3V0OwogCWVyciA9IC1FTk9CVUZTOwotCXNrYiA9IG5sbXNnX25ldyhsZW4sIEdGUF9LRVJORUwpOworCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9LRVJORUwpOwogCWlmIChza2I9PU5VTEwpCiAJCWdvdG8gb3V0OwogCiAJTkVUTElOS19DQihza2IpLnBpZAk9IG5say0+cGlkOwotCU5FVExJTktfQ0Ioc2tiKS5kc3RfcGlkID0gZHN0X3BpZDsKIAlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gZHN0X2dyb3VwOwogCU5FVExJTktfQ0Ioc2tiKS5sb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50LT5hdWRpdF9jb250ZXh0KTsKIAlzZWxpbnV4X2dldF90YXNrX3NpZChjdXJyZW50LCAmKE5FVExJTktfQ0Ioc2tiKS5zaWQpKTsKQEAgLTE0MzQsMTQgKzE0MzQsMTMgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBubG1zZ2hkciAqcmVwOwogCXN0cnVjdCBubG1zZ2VyciAqZXJybXNnOwotCWludCBzaXplOworCXNpemVfdCBwYXlsb2FkID0gc2l6ZW9mKCplcnJtc2cpOwogCi0JaWYgKGVyciA9PSAwKQotCQlzaXplID0gbmxtc2dfdG90YWxfc2l6ZShzaXplb2YoKmVycm1zZykpOwotCWVsc2UKLQkJc2l6ZSA9IG5sbXNnX3RvdGFsX3NpemUoc2l6ZW9mKCplcnJtc2cpICsgbmxtc2dfbGVuKG5saCkpOworCS8qIGVycm9yIG1lc3NhZ2VzIGdldCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBhcHBlbmVkICovCisJaWYgKGVycikKKwkJcGF5bG9hZCArPSBubG1zZ19sZW4obmxoKTsKIAotCXNrYiA9IG5sbXNnX25ldyhzaXplLCBHRlBfS0VSTkVMKTsKKwlza2IgPSBubG1zZ19uZXcocGF5bG9hZCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IpIHsKIAkJc3RydWN0IHNvY2sgKnNrOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCmluZGV4IDQ5YmMyZGIuLjU0OGU0ZTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCkBAIC0xNDMsNiArMTQzLDEzIEBACiAJCWdvdG8gZXJyb3V0OwogCX0KIAorCWlmIChvcHMtPmR1bXBpdCkKKwkJb3BzLT5mbGFncyB8PSBHRU5MX0NNRF9DQVBfRFVNUDsKKwlpZiAob3BzLT5kb2l0KQorCQlvcHMtPmZsYWdzIHw9IEdFTkxfQ01EX0NBUF9ETzsKKwlpZiAob3BzLT5wb2xpY3kpCisJCW9wcy0+ZmxhZ3MgfD0gR0VOTF9DTURfQ0FQX0hBU1BPTDsKKwogCWdlbmxfbG9jaygpOwogCWxpc3RfYWRkX3RhaWwoJm9wcy0+b3BzX2xpc3QsICZmYW1pbHktPm9wc19saXN0KTsKIAlnZW5sX3VubG9jaygpOwpAQCAtMzMxLDcgKzMzOCw3IEBACiAJCX0KIAogCQkqZXJycCA9IGVyciA9IG5ldGxpbmtfZHVtcF9zdGFydChnZW5sX3NvY2ssIHNrYiwgbmxoLAotCQkJCQkJIG9wcy0+ZHVtcGl0LCBOVUxMKTsKKwkJCQkJCSBvcHMtPmR1bXBpdCwgb3BzLT5kb25lKTsKIAkJaWYgKGVyciA9PSAwKQogCQkJc2tiX3B1bGwoc2tiLCBtaW4oTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pLAogCQkJCQkgIHNrYi0+bGVuKSk7CkBAIC0zODQsMTYgKzM5MSwxOSBAQAogICogQ29udHJvbGxlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGdlbmxfY3RybCA9IHsKKwkuaWQgPSBHRU5MX0lEX0NUUkwsCisJLm5hbWUgPSAibmxjdHJsIiwKKwkudmVyc2lvbiA9IDB4MiwKKwkubWF4YXR0ciA9IENUUkxfQVRUUl9NQVgsCit9OworCiBzdGF0aWMgaW50IGN0cmxfZmlsbF9pbmZvKHN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5LCB1MzIgcGlkLCB1MzIgc2VxLAogCQkJICB1MzIgZmxhZ3MsIHN0cnVjdCBza19idWZmICpza2IsIHU4IGNtZCkKIHsKLQlzdHJ1Y3QgbmxhdHRyICpubGFfb3BzOwotCXN0cnVjdCBnZW5sX29wcyAqb3BzOwogCXZvaWQgKmhkcjsKLQlpbnQgaWR4ID0gMTsKIAotCWhkciA9IGdlbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIEdFTkxfSURfQ1RSTCwgMCwgZmxhZ3MsIGNtZCwKLQkJCSAgZmFtaWx5LT52ZXJzaW9uKTsKKwloZHIgPSBnZW5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCAmZ2VubF9jdHJsLCBmbGFncywgY21kKTsKIAlpZiAoaGRyID09IE5VTEwpCiAJCXJldHVybiAtMTsKIApAQCAtNDAzLDM0ICs0MTMsMzEgQEAKIAlOTEFfUFVUX1UzMihza2IsIENUUkxfQVRUUl9IRFJTSVpFLCBmYW1pbHktPmhkcnNpemUpOwogCU5MQV9QVVRfVTMyKHNrYiwgQ1RSTF9BVFRSX01BWEFUVFIsIGZhbWlseS0+bWF4YXR0cik7CiAKLQlubGFfb3BzID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBDVFJMX0FUVFJfT1BTKTsKLQlpZiAobmxhX29wcyA9PSBOVUxMKQotCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoIWxpc3RfZW1wdHkoJmZhbWlseS0+b3BzX2xpc3QpKSB7CisJCXN0cnVjdCBubGF0dHIgKm5sYV9vcHM7CisJCXN0cnVjdCBnZW5sX29wcyAqb3BzOworCQlpbnQgaWR4ID0gMTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmZmFtaWx5LT5vcHNfbGlzdCwgb3BzX2xpc3QpIHsKLQkJc3RydWN0IG5sYXR0ciAqbmVzdDsKLQotCQluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBpZHgrKyk7Ci0JCWlmIChuZXN0ID09IE5VTEwpCisJCW5sYV9vcHMgPSBubGFfbmVzdF9zdGFydChza2IsIENUUkxfQVRUUl9PUFMpOworCQlpZiAobmxhX29wcyA9PSBOVUxMKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQkJTkxBX1BVVF9VMzIoc2tiLCBDVFJMX0FUVFJfT1BfSUQsIG9wcy0+Y21kKTsKLQkJTkxBX1BVVF9VMzIoc2tiLCBDVFJMX0FUVFJfT1BfRkxBR1MsIG9wcy0+ZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJmZhbWlseS0+b3BzX2xpc3QsIG9wc19saXN0KSB7CisJCQlzdHJ1Y3QgbmxhdHRyICpuZXN0OwogCi0JCWlmIChvcHMtPnBvbGljeSkKLQkJCU5MQV9QVVRfRkxBRyhza2IsIENUUkxfQVRUUl9PUF9QT0xJQ1kpOworCQkJbmVzdCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgaWR4KyspOworCQkJaWYgKG5lc3QgPT0gTlVMTCkKKwkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCQlpZiAob3BzLT5kb2l0KQotCQkJTkxBX1BVVF9GTEFHKHNrYiwgQ1RSTF9BVFRSX09QX0RPSVQpOworCQkJTkxBX1BVVF9VMzIoc2tiLCBDVFJMX0FUVFJfT1BfSUQsIG9wcy0+Y21kKTsKKwkJCU5MQV9QVVRfVTMyKHNrYiwgQ1RSTF9BVFRSX09QX0ZMQUdTLCBvcHMtPmZsYWdzKTsKIAotCQlpZiAob3BzLT5kdW1waXQpCi0JCQlOTEFfUFVUX0ZMQUcoc2tiLCBDVFJMX0FUVFJfT1BfRFVNUElUKTsKKwkJCW5sYV9uZXN0X2VuZChza2IsIG5lc3QpOworCQl9CiAKLQkJbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7CisJCW5sYV9uZXN0X2VuZChza2IsIG5sYV9vcHMpOwogCX0KIAotCW5sYV9uZXN0X2VuZChza2IsIG5sYV9vcHMpOwotCiAJcmV0dXJuIGdlbmxtc2dfZW5kKHNrYiwgaGRyKTsKIAogbmxhX3B1dF9mYWlsdXJlOgpAQCAtNDgwLDcgKzQ4Nyw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZXJyOwogCi0Jc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlza2IgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9CVUZTKTsKIApAQCAtNTI5LDcgKzUzNiw3IEBACiAJCWdvdG8gZXJyb3V0OwogCX0KIAotCWVyciA9IGdlbmxtc2dfdW5pY2FzdChtc2csIGluZm8tPnNuZF9waWQpOworCWVyciA9IGdlbmxtc2dfcmVwbHkobXNnLCBpbmZvKTsKIGVycm91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTYyLDEzICs1NjksNiBAQAogCS5wb2xpY3kJCT0gY3RybF9wb2xpY3ksCiB9OwogCi1zdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGdlbmxfY3RybCA9IHsKLQkuaWQgPSBHRU5MX0lEX0NUUkwsCi0JLm5hbWUgPSAibmxjdHJsIiwKLQkudmVyc2lvbiA9IDB4MSwKLQkubWF4YXR0ciA9IENUUkxfQVRUUl9NQVgsCi19OwotCiBzdGF0aWMgaW50IF9faW5pdCBnZW5sX2luaXQodm9pZCkKIHsKIAlpbnQgaSwgZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9ucl9yb3V0ZS5jIGIvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCmluZGV4IGMxMTczN2YuLjAwOTYxMDUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vbnJfcm91dGUuYworKysgYi9uZXQvbmV0cm9tL25yX3JvdXRlLmMKQEAgLTE1NSwxNCArMTU1LDE1IEBACiAJCWF0b21pY19zZXQoJm5yX25laWdoLT5yZWZjb3VudCwgMSk7CiAKIAkJaWYgKGF4MjVfZGlnaSAhPSBOVUxMICYmIGF4MjVfZGlnaS0+bmRpZ2kgPiAwKSB7Ci0JCQlpZiAoKG5yX25laWdoLT5kaWdpcGVhdCA9IGttYWxsb2Moc2l6ZW9mKCpheDI1X2RpZ2kpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJbnJfbmVpZ2gtPmRpZ2lwZWF0ID0ga21lbWR1cChheDI1X2RpZ2ksCisJCQkJCQkgICAgIHNpemVvZigqYXgyNV9kaWdpKSwKKwkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAobnJfbmVpZ2gtPmRpZ2lwZWF0ID09IE5VTEwpIHsKIAkJCQlrZnJlZShucl9uZWlnaCk7CiAJCQkJaWYgKG5yX25vZGUpCiAJCQkJCW5yX25vZGVfcHV0KG5yX25vZGUpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQotCQkJbWVtY3B5KG5yX25laWdoLT5kaWdpcGVhdCwgYXgyNV9kaWdpLAotCQkJCQlzaXplb2YoKmF4MjVfZGlnaSkpOwogCQl9CiAKIAkJc3Bpbl9sb2NrX2JoKCZucl9uZWlnaF9saXN0X2xvY2spOwpAQCAtNDMyLDExICs0MzMsMTIgQEAKIAlhdG9taWNfc2V0KCZucl9uZWlnaC0+cmVmY291bnQsIDEpOwogCiAJaWYgKGF4MjVfZGlnaSAhPSBOVUxMICYmIGF4MjVfZGlnaS0+bmRpZ2kgPiAwKSB7Ci0JCWlmICgobnJfbmVpZ2gtPmRpZ2lwZWF0ID0ga21hbGxvYyhzaXplb2YoKmF4MjVfZGlnaSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCW5yX25laWdoLT5kaWdpcGVhdCA9IGttZW1kdXAoYXgyNV9kaWdpLCBzaXplb2YoKmF4MjVfZGlnaSksCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChucl9uZWlnaC0+ZGlnaXBlYXQgPT0gTlVMTCkgewogCQkJa2ZyZWUobnJfbmVpZ2gpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJbWVtY3B5KG5yX25laWdoLT5kaWdpcGVhdCwgYXgyNV9kaWdpLCBzaXplb2YoKmF4MjVfZGlnaSkpOwogCX0KIAogCXNwaW5fbG9ja19iaCgmbnJfbmVpZ2hfbGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IGY0Y2NiOTAuLmRhNzNlOGEgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtNzEsNiArNzEsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTIwMSw3ICsyMDIsNyBAQAogCXNwaW5sb2NrX3QJCWJpbmRfbG9jazsKIAljaGFyCQkJcnVubmluZzsJLyogcHJvdF9ob29rIGlzIGF0dGFjaGVkKi8KIAlpbnQJCQlpZmluZGV4OwkvKiBib3VuZCBkZXZpY2UJCSovCi0JdW5zaWduZWQgc2hvcnQJCW51bTsKKwlfX2JlMTYJCQludW07CiAjaWZkZWYgQ09ORklHX1BBQ0tFVF9NVUxUSUNBU1QKIAlzdHJ1Y3QgcGFja2V0X21jbGlzdAkqbWNsaXN0OwogI2VuZGlmCkBAIC0zMzEsNyArMzMyLDcgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfcGt0ICpzYWRkcj0oc3RydWN0IHNvY2thZGRyX3BrdCAqKW1zZy0+bXNnX25hbWU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXVuc2lnbmVkIHNob3J0IHByb3RvPTA7CisJX19iZTE2IHByb3RvPTA7CiAJaW50IGVycjsKIAkKIAkvKgpAQCAtNjU5LDcgKzY2MCw3IEBACiAJc2xsLT5zbGxfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKIAogCWgtPnRwX3N0YXR1cyA9IHN0YXR1czsKLQltYigpOworCXNtcF9tYigpOwogCiAJewogCQlzdHJ1Y3QgcGFnZSAqcF9zdGFydCwgKnBfZW5kOwpAQCAtNzA0LDcgKzcwNSw3IEBACiAJc3RydWN0IHNvY2thZGRyX2xsICpzYWRkcj0oc3RydWN0IHNvY2thZGRyX2xsICopbXNnLT5tc2dfbmFtZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgc2hvcnQgcHJvdG87CisJX19iZTE2IHByb3RvOwogCXVuc2lnbmVkIGNoYXIgKmFkZHI7CiAJaW50IGlmaW5kZXgsIGVyciwgcmVzZXJ2ZSA9IDA7CiAKQEAgLTg1OCw3ICs4NTksNyBAQAogICoJQXR0YWNoIGEgcGFja2V0IGhvb2suCiAgKi8KIAotc3RhdGljIGludCBwYWNrZXRfZG9fYmluZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcm90b2NvbCkKK3N0YXRpYyBpbnQgcGFja2V0X2RvX2JpbmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMTYgcHJvdG9jb2wpCiB7CiAJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CiAJLyoKQEAgLTk4Myw2ICs5ODQsNyBAQAogewogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvOworCV9fYmUxNiBwcm90byA9IChfX2ZvcmNlIF9fYmUxNilwcm90b2NvbDsgLyogd2VpcmQsIGJ1dCBkb2N1bWVudGVkICovCiAJaW50IGVycjsKIAogCWlmICghY2FwYWJsZShDQVBfTkVUX1JBVykpCkBAIC0xMDEwLDcgKzEwMTIsNyBAQAogCiAJcG8gPSBwa3Rfc2soc2spOwogCXNrLT5za19mYW1pbHkgPSBQRl9QQUNLRVQ7Ci0JcG8tPm51bSA9IHByb3RvY29sOworCXBvLT5udW0gPSBwcm90bzsKIAogCXNrLT5za19kZXN0cnVjdCA9IHBhY2tldF9zb2NrX2Rlc3RydWN0OwogCWF0b21pY19pbmMoJnBhY2tldF9zb2Nrc19ucik7CkBAIC0xMDI3LDggKzEwMjksOCBAQAogI2VuZGlmCiAJcG8tPnByb3RfaG9vay5hZl9wYWNrZXRfcHJpdiA9IHNrOwogCi0JaWYgKHByb3RvY29sKSB7Ci0JCXBvLT5wcm90X2hvb2sudHlwZSA9IHByb3RvY29sOworCWlmIChwcm90bykgeworCQlwby0+cHJvdF9ob29rLnR5cGUgPSBwcm90bzsKIAkJZGV2X2FkZF9wYWNrKCZwby0+cHJvdF9ob29rKTsKIAkJc29ja19ob2xkKHNrKTsKIAkJcG8tPnJ1bm5pbmcgPSAxOwpAQCAtMTYyNCw3ICsxNjI2LDggQEAKIHsKIAljaGFyICoqcGdfdmVjID0gTlVMTDsKIAlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKLQlpbnQgd2FzX3J1bm5pbmcsIG51bSwgb3JkZXIgPSAwOworCWludCB3YXNfcnVubmluZywgb3JkZXIgPSAwOworCV9fYmUxNiBudW07CiAJaW50IGVyciA9IDA7CiAJCiAJaWYgKHJlcS0+dHBfYmxvY2tfbnIpIHsKZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2Vfcm91dGUuYyBiL25ldC9yb3NlL3Jvc2Vfcm91dGUuYwppbmRleCBhMjI1NDJmLi43MjUyMzQ0IDEwMDY0NAotLS0gYS9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKKysrIGIvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jCkBAIC0zOTYsNyArMzk2LDcgQEAKIGludCByb3NlX2FkZF9sb29wYmFja19ub2RlKHJvc2VfYWRkcmVzcyAqYWRkcmVzcykKIHsKIAlzdHJ1Y3Qgcm9zZV9ub2RlICpyb3NlX25vZGU7Ci0JdW5zaWduZWQgaW50IGVyciA9IDA7CisJaW50IGVyciA9IDA7CiAKIAlzcGluX2xvY2tfYmgoJnJvc2Vfbm9kZV9saXN0X2xvY2spOwogCkBAIC00MzIsNyArNDMyLDcgQEAKIG91dDoKIAlzcGluX3VubG9ja19iaCgmcm9zZV9ub2RlX2xpc3RfbG9jayk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2tyeGlvZC5jIGIvbmV0L3J4cnBjL2tyeGlvZC5jCmluZGV4IGRhZGEzNGEuLjQ5ZWZmZDkgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9rcnhpb2QuYworKysgYi9uZXQvcnhycGMva3J4aW9kLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPHJ4cnBjL2tyeGlvZC5oPgogI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9rcnhzZWNkLmMgYi9uZXQvcnhycGMva3J4c2VjZC5jCmluZGV4IGNlYTRlYjUuLjNhYjBmNzcgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9rcnhzZWNkLmMKKysrIGIvbmV0L3J4cnBjL2tyeHNlY2QuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9rcnh0aW1vZC5jIGIvbmV0L3J4cnBjL2tyeHRpbW9kLmMKaW5kZXggM2U3NDY2OS4uOWE5YjYxMyAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2tyeHRpbW9kLmMKKysrIGIvbmV0L3J4cnBjL2tyeHRpbW9kLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+CiAjaW5jbHVkZSA8cnhycGMva3J4dGltb2QuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy90cmFuc3BvcnQuYyBiL25ldC9yeHJwYy90cmFuc3BvcnQuYwppbmRleCA5NGIyZTJmLi40MjY4YjM4IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvdHJhbnNwb3J0LmMKKysrIGIvbmV0L3J4cnBjL3RyYW5zcG9ydC5jCkBAIC0zMSw3ICszMSw2IEBACiAjZW5kaWYKICNpbmNsdWRlIDxsaW51eC9lcnJxdWV1ZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogc3RydWN0IGVycm9ybXNnIHsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9LY29uZmlnIGIvbmV0L3NjaGVkL0tjb25maWcKaW5kZXggODI5OGVhOS4uZjQ1NDRkZCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL0tjb25maWcKKysrIGIvbmV0L3NjaGVkL0tjb25maWcKQEAgLTYsNiArNiw3IEBACiAKIGNvbmZpZyBORVRfU0NIRUQKIAlib29sICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciCisJc2VsZWN0IE5FVF9TQ0hfRklGTwogCS0tLWhlbHAtLS0KIAkgIFdoZW4gdGhlIGtlcm5lbCBoYXMgc2V2ZXJhbCBwYWNrZXRzIHRvIHNlbmQgb3V0IG92ZXIgYSBuZXR3b3JrCiAJICBkZXZpY2UsIGl0IGhhcyB0byBkZWNpZGUgd2hpY2ggb25lcyB0byBzZW5kIGZpcnN0LCB3aGljaCBvbmVzIHRvCkBAIC00MCw2ICs0MSw5IEBACiAJICBUaGUgYXZhaWxhYmxlIHNjaGVkdWxlcnMgYXJlIGxpc3RlZCBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczsgeW91CiAJICBjYW4gc2F5IFkgdG8gYXMgbWFueSBhcyB5b3UgbGlrZS4gSWYgdW5zdXJlLCBzYXkgTiBub3cuCiAKK2NvbmZpZyBORVRfU0NIX0ZJRk8KKwlib29sCisKIGlmIE5FVF9TQ0hFRAogCiBjaG9pY2UKQEAgLTMyMCw3ICszMjQsNyBAQAogCiBjb25maWcgQ0xTX1UzMl9NQVJLCiAJYm9vbCAiTmV0ZmlsdGVyIG1hcmtzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfQ0xTX1UzMiAmJiBORVRGSUxURVIKKwlkZXBlbmRzIG9uIE5FVF9DTFNfVTMyCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSB0byBiZSBhYmxlIHRvIHVzZSBuZXRmaWx0ZXIgbWFya3MgYXMgdTMyIGtleS4KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL01ha2VmaWxlIGIvbmV0L3NjaGVkL01ha2VmaWxlCmluZGV4IDBmMDZhZWMuLmZmMmQ2ZTUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9NYWtlZmlsZQorKysgYi9uZXQvc2NoZWQvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKIG9iai15CTo9IHNjaF9nZW5lcmljLm8KIAotb2JqLSQoQ09ORklHX05FVF9TQ0hFRCkJCSs9IHNjaF9hcGkubyBzY2hfZmlmby5vIHNjaF9ibGFja2hvbGUubworb2JqLSQoQ09ORklHX05FVF9TQ0hFRCkJCSs9IHNjaF9hcGkubyBzY2hfYmxhY2tob2xlLm8KIG9iai0kKENPTkZJR19ORVRfQ0xTKQkJKz0gY2xzX2FwaS5vCiBvYmotJChDT05GSUdfTkVUX0NMU19BQ1QpCSs9IGFjdF9hcGkubwogb2JqLSQoQ09ORklHX05FVF9BQ1RfUE9MSUNFKQkrPSBhY3RfcG9saWNlLm8KQEAgLTE0LDYgKzE0LDcgQEAKIG9iai0kKENPTkZJR19ORVRfQUNUX0lQVCkJKz0gYWN0X2lwdC5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9QRURJVCkJKz0gYWN0X3BlZGl0Lm8KIG9iai0kKENPTkZJR19ORVRfQUNUX1NJTVApCSs9IGFjdF9zaW1wbGUubworb2JqLSQoQ09ORklHX05FVF9TQ0hfRklGTykJKz0gc2NoX2ZpZm8ubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfQ0JRKQkrPSBzY2hfY2JxLm8KIG9iai0kKENPTkZJR19ORVRfU0NIX0hUQikJKz0gc2NoX2h0Yi5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9IUEZRKQkrPSBzY2hfaHBmcS5vCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2dhY3QuYyBiL25ldC9zY2hlZC9hY3RfZ2FjdC5jCmluZGV4IDZjZmY1NjYuLjg1ZGU3ZWYgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfZ2FjdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfZ2FjdC5jCkBAIC00OCwxNCArNDgsMTQgQEAKICNpZmRlZiBDT05GSUdfR0FDVF9QUk9CCiBzdGF0aWMgaW50IGdhY3RfbmV0X3JhbmQoc3RydWN0IHRjZl9nYWN0ICpnYWN0KQogewotCWlmIChuZXRfcmFuZG9tKCkgJSBnYWN0LT50Y2ZnX3B2YWwpCisJaWYgKCFnYWN0LT50Y2ZnX3B2YWwgfHwgbmV0X3JhbmRvbSgpICUgZ2FjdC0+dGNmZ19wdmFsKQogCQlyZXR1cm4gZ2FjdC0+dGNmX2FjdGlvbjsKIAlyZXR1cm4gZ2FjdC0+dGNmZ19wYWN0aW9uOwogfQogCiBzdGF0aWMgaW50IGdhY3RfZGV0ZXJtKHN0cnVjdCB0Y2ZfZ2FjdCAqZ2FjdCkKIHsKLQlpZiAoZ2FjdC0+dGNmX2JzdGF0cy5wYWNrZXRzICUgZ2FjdC0+dGNmZ19wdmFsKQorCWlmICghZ2FjdC0+dGNmZ19wdmFsIHx8IGdhY3QtPnRjZl9ic3RhdHMucGFja2V0cyAlIGdhY3QtPnRjZmdfcHZhbCkKIAkJcmV0dXJuIGdhY3QtPnRjZl9hY3Rpb247CiAJcmV0dXJuIGdhY3QtPnRjZmdfcGFjdGlvbjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfaXB0LmMgYi9uZXQvc2NoZWQvYWN0X2lwdC5jCmluZGV4IGQ4YzkzMTAuLmE5NjA4MDYgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfaXB0LmMKKysrIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwpAQCAtMTU2LDEwICsxNTYsOSBAQAogCSAgICBydGF0dHJfc3RybGNweSh0bmFtZSwgdGJbVENBX0lQVF9UQUJMRS0xXSwgSUZOQU1TSVopID49IElGTkFNU0laKQogCQlzdHJjcHkodG5hbWUsICJtYW5nbGUiKTsKIAotCXQgPSBrbWFsbG9jKHRkLT51LnRhcmdldF9zaXplLCBHRlBfS0VSTkVMKTsKKwl0ID0ga21lbWR1cCh0ZCwgdGQtPnUudGFyZ2V0X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghdCkpCiAJCWdvdG8gZXJyMjsKLQltZW1jcHkodCwgdGQsIHRkLT51LnRhcmdldF9zaXplKTsKIAogCWlmICgoZXJyID0gaXB0X2luaXRfdGFyZ2V0KHQsIHRuYW1lLCBob29rKSkgPCAwKQogCQlnb3RvIGVycjM7CkBAIC0yNTYsMTMgKzI1NSwxMiBAQAogCSoqIGZvciBmb29scHJvb2YgeW91IG5lZWQgdG8gbm90IGFzc3VtZSB0aGlzCiAJKi8KIAotCXQgPSBrbWFsbG9jKGlwdC0+dGNmaV90LT51LnVzZXIudGFyZ2V0X3NpemUsIEdGUF9BVE9NSUMpOworCXQgPSBrbWVtZHVwKGlwdC0+dGNmaV90LCBpcHQtPnRjZmlfdC0+dS51c2VyLnRhcmdldF9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAodW5saWtlbHkoIXQpKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCiAJYy5iaW5kY250ID0gaXB0LT50Y2ZfYmluZGNudCAtIGJpbmQ7CiAJYy5yZWZjbnQgPSBpcHQtPnRjZl9yZWZjbnQgLSByZWY7Ci0JbWVtY3B5KHQsIGlwdC0+dGNmaV90LCBpcHQtPnRjZmlfdC0+dS51c2VyLnRhcmdldF9zaXplKTsKIAlzdHJjcHkodC0+dS51c2VyLm5hbWUsIGlwdC0+dGNmaV90LT51Lmtlcm5lbC50YXJnZXQtPm5hbWUpOwogCiAJUlRBX1BVVChza2IsIFRDQV9JUFRfVEFSRywgaXB0LT50Y2ZpX3QtPnUudXNlci50YXJnZXRfc2l6ZSwgdCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jIGIvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYwppbmRleCBmZWQ0N2I2Li5hZjY4ZTFlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCisrKyBiL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKQEAgLTQ2LDYgKzQ2LDE4IEBACiAJLmxvY2sJPQkmcG9saWNlX2xvY2ssCiB9OwogCisvKiBvbGQgcG9saWNlciBzdHJ1Y3R1cmUgZnJvbSBiZWZvcmUgdGMgYWN0aW9ucyAqLworc3RydWN0IHRjX3BvbGljZV9jb21wYXQKK3sKKwl1MzIJCQlpbmRleDsKKwlpbnQJCQlhY3Rpb247CisJdTMyCQkJbGltaXQ7CisJdTMyCQkJYnVyc3Q7CisJdTMyCQkJbXR1OworCXN0cnVjdCB0Y19yYXRlc3BlYwlyYXRlOworCXN0cnVjdCB0Y19yYXRlc3BlYwlwZWFrcmF0ZTsKK307CisKIC8qIEVhY2ggcG9saWNlciBpcyBzZXJpYWxpemVkIGJ5IGl0cyBpbmRpdmlkdWFsIHNwaW5sb2NrICovCiAKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKQEAgLTEzMSwxMiArMTQzLDE1IEBACiAJc3RydWN0IHRjX3BvbGljZSAqcGFybTsKIAlzdHJ1Y3QgdGNmX3BvbGljZSAqcG9saWNlOwogCXN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICpSX3RhYiA9IE5VTEwsICpQX3RhYiA9IE5VTEw7CisJaW50IHNpemU7CiAKIAlpZiAocnRhID09IE5VTEwgfHwgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX1BPTElDRV9NQVgsIHJ0YSkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICh0YltUQ0FfUE9MSUNFX1RCRi0xXSA9PSBOVUxMIHx8Ci0JICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKSAhPSBzaXplb2YoKnBhcm0pKQorCWlmICh0YltUQ0FfUE9MSUNFX1RCRi0xXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzaXplID0gUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9UQkYtMV0pOworCWlmIChzaXplICE9IHNpemVvZigqcGFybSkgJiYgc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHRjX3BvbGljZV9jb21wYXQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlwYXJtID0gUlRBX0RBVEEodGJbVENBX1BPTElDRV9UQkYtMV0pOwogCkBAIC00MTUsMTIgKzQzMCwxNSBAQAogCXN0cnVjdCB0Y2ZfcG9saWNlICpwb2xpY2U7CiAJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1BPTElDRV9NQVhdOwogCXN0cnVjdCB0Y19wb2xpY2UgKnBhcm07CisJaW50IHNpemU7CiAKIAlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX1BPTElDRV9NQVgsIHJ0YSkgPCAwKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICh0YltUQ0FfUE9MSUNFX1RCRi0xXSA9PSBOVUxMIHx8Ci0JICAgIFJUQV9QQVlMT0FEKHRiW1RDQV9QT0xJQ0VfVEJGLTFdKSAhPSBzaXplb2YoKnBhcm0pKQorCWlmICh0YltUQ0FfUE9MSUNFX1RCRi0xXSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlzaXplID0gUlRBX1BBWUxPQUQodGJbVENBX1BPTElDRV9UQkYtMV0pOworCWlmIChzaXplICE9IHNpemVvZigqcGFybSkgJiYgc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHRjX3BvbGljZV9jb21wYXQpKQogCQlyZXR1cm4gTlVMTDsKIAogCXBhcm0gPSBSVEFfREFUQSh0YltUQ0FfUE9MSUNFX1RCRi0xXSk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jIGIvbmV0L3NjaGVkL2FjdF9zaW1wbGUuYwppbmRleCA5MDE1NzFhLi41ZmU4MDg1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jCisrKyBiL25ldC9zY2hlZC9hY3Rfc2ltcGxlLmMKQEAgLTcxLDExICs3MSwxMCBAQAogCiBzdGF0aWMgaW50IGFsbG9jX2RlZmRhdGEoc3RydWN0IHRjZl9kZWZhY3QgKmQsIHUzMiBkYXRhbGVuLCB2b2lkICpkZWZkYXRhKQogewotCWQtPnRjZmRfZGVmZGF0YSA9IGttYWxsb2MoZGF0YWxlbiwgR0ZQX0tFUk5FTCk7CisJZC0+dGNmZF9kZWZkYXRhID0ga21lbWR1cChkZWZkYXRhLCBkYXRhbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIWQtPnRjZmRfZGVmZGF0YSkpCiAJCXJldHVybiAtRU5PTUVNOwogCWQtPnRjZmRfZGF0YWxlbiA9IGRhdGFsZW47Ci0JbWVtY3B5KGQtPnRjZmRfZGVmZGF0YSwgZGVmZGF0YSwgZGF0YWxlbik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfYXBpLmMgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCmluZGV4IDM3YTE4NDAuLmVkYjhmYzkgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19hcGkuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCS8qIENyZWF0ZSBuZXcgcHJvdG8gdGNmICovCiAKIAkJZXJyID0gLUVOT0JVRlM7Ci0JCWlmICgodHAgPSBrbWFsbG9jKHNpemVvZigqdHApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJaWYgKCh0cCA9IGt6YWxsb2Moc2l6ZW9mKCp0cCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCQkJZ290byBlcnJvdXQ7CiAJCWVyciA9IC1FSU5WQUw7CiAJCXRwX29wcyA9IHRjZl9wcm90b19sb29rdXBfb3BzKHRjYVtUQ0FfS0lORC0xXSk7CkBAIC0yNDcsNyArMjQ3LDYgQEAKIAkJCWtmcmVlKHRwKTsKIAkJCWdvdG8gZXJyb3V0OwogCQl9Ci0JCW1lbXNldCh0cCwgMCwgc2l6ZW9mKCp0cCkpOwogCQl0cC0+b3BzID0gdHBfb3BzOwogCQl0cC0+cHJvdG9jb2wgPSBwcm90b2NvbDsKIAkJdHAtPnByaW8gPSBucHJpbyA/IDogdGNmX2F1dG9fcHJpbygqYmFjayk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Z3LmMgYi9uZXQvc2NoZWQvY2xzX2Z3LmMKaW5kZXggZTU0YWNjNi4uYzc5N2Q2YSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mdy5jCisrKyBiL25ldC9zY2hlZC9jbHNfZncuYwpAQCAtMTAxLDEzICsxMDEsMTAgQEAKIAlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgZndfaGVhZCopdHAtPnJvb3Q7CiAJc3RydWN0IGZ3X2ZpbHRlciAqZjsKIAlpbnQgcjsKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JdTMyIGlkID0gc2tiLT5uZm1hcmsgJiBoZWFkLT5tYXNrOwotI2Vsc2UKLQl1MzIgaWQgPSAwOwotI2VuZGlmCisJdTMyIGlkID0gc2tiLT5tYXJrOwogCiAJaWYgKGhlYWQgIT0gTlVMTCkgeworCQlpZCAmPSBoZWFkLT5tYXNrOwogCQlmb3IgKGY9aGVhZC0+aHRbZndfaGFzaChpZCldOyBmOyBmPWYtPm5leHQpIHsKIAkJCWlmIChmLT5pZCA9PSBpZCkgewogCQkJCSpyZXMgPSBmLT5yZXM7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JzdnAuaCBiL25ldC9zY2hlZC9jbHNfcnN2cC5oCmluZGV4IDZlMjMwZWMuLjU4N2I5YWQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcnN2cC5oCisrKyBiL25ldC9zY2hlZC9jbHNfcnN2cC5oCkBAIC03Nyw3ICs3Nyw3IEBACiBzdHJ1Y3QgcnN2cF9zZXNzaW9uCiB7CiAJc3RydWN0IHJzdnBfc2Vzc2lvbgkqbmV4dDsKLQl1MzIJCQlkc3RbUlNWUF9EU1RfTEVOXTsKKwlfX2JlMzIJCQlkc3RbUlNWUF9EU1RfTEVOXTsKIAlzdHJ1Y3QgdGNfcnN2cF9ncGkgCWRwaTsKIAl1OAkJCXByb3RvY29sOwogCXU4CQkJdHVubmVsaWQ7CkBAIC04OSw3ICs4OSw3IEBACiBzdHJ1Y3QgcnN2cF9maWx0ZXIKIHsKIAlzdHJ1Y3QgcnN2cF9maWx0ZXIJKm5leHQ7Ci0JdTMyCQkJc3JjW1JTVlBfRFNUX0xFTl07CisJX19iZTMyCQkJc3JjW1JTVlBfRFNUX0xFTl07CiAJc3RydWN0IHRjX3JzdnBfZ3BpCXNwaTsKIAl1OAkJCXR1bm5lbGhkcjsKIApAQCAtMTAwLDE3ICsxMDAsMTcgQEAKIAlzdHJ1Y3QgcnN2cF9zZXNzaW9uCSpzZXNzOwogfTsKIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaGFzaF9kc3QodTMyICpkc3QsIHU4IHByb3RvY29sLCB1OCB0dW5uZWxpZCkKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGhhc2hfZHN0KF9fYmUzMiAqZHN0LCB1OCBwcm90b2NvbCwgdTggdHVubmVsaWQpCiB7Ci0JdW5zaWduZWQgaCA9IGRzdFtSU1ZQX0RTVF9MRU4tMV07CisJdW5zaWduZWQgaCA9IChfX2ZvcmNlIF9fdTMyKWRzdFtSU1ZQX0RTVF9MRU4tMV07CiAJaCBePSBoPj4xNjsKIAloIF49IGg+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+bGluayxwLT5saW5rLnEpOwogCXAtPmxpbmsuZmlsdGVyX2xpc3QgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9jYnEuYyBiL25ldC9zY2hlZC9zY2hfY2JxLmMKaW5kZXggYmFjODgxYi4uZjc5YTRmMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9jYnEuYworKysgYi9uZXQvc2NoZWQvc2NoX2NicS5jCkBAIC0zNzEsOCArMzcxLDYgQEAKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCX0KLQotCQkJY2wgPSBjbF9wcmV2LT5uZXh0X2FsaXZlOwogCQkJcmV0dXJuOwogCQl9CiAJfSB3aGlsZSAoKGNsX3ByZXYgPSBjbCkgIT0gcS0+YWN0aXZlW3ByaW9dKTsKQEAgLTEyNTgsNiArMTI1Niw4IEBACiAJCWRvIHsKIAkJCWlmIChjbC0+cS0+b3BzLT5kcm9wICYmIChsZW4gPSBjbC0+cS0+b3BzLT5kcm9wKGNsLT5xKSkpIHsKIAkJCQlzY2gtPnEucWxlbi0tOworCQkJCWlmICghY2wtPnEtPnEucWxlbikKKwkJCQkJY2JxX2RlYWN0aXZhdGVfY2xhc3MoY2wpOwogCQkJCXJldHVybiBsZW47CiAJCQl9CiAJCX0gd2hpbGUgKChjbCA9IGNsLT5uZXh0X2FsaXZlKSAhPSBjbF9oZWFkKTsKQEAgLTE0MjksNyArMTQyOSw4IEBACiAJcS0+bGluay5zaWJsaW5nID0gJnEtPmxpbms7CiAJcS0+bGluay5jbGFzc2lkID0gc2NoLT5oYW5kbGU7CiAJcS0+bGluay5xZGlzYyA9IHNjaDsKLQlpZiAoIShxLT5saW5rLnEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcykpKQorCWlmICghKHEtPmxpbmsucSA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzLAorCQkJCQkgICAgc2NoLT5oYW5kbGUpKSkKIAkJcS0+bGluay5xID0gJm5vb3BfcWRpc2M7CiAKIAlxLT5saW5rLnByaW9yaXR5ID0gVENfQ0JRX01BWFBSSU8tMTsKQEAgLTE2NzQsNyArMTY3NSw4IEBACiAKIAlpZiAoY2wpIHsKIAkJaWYgKG5ldyA9PSBOVUxMKSB7Ci0JCQlpZiAoKG5ldyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzKSkgPT0gTlVMTCkKKwkJCWlmICgobmV3ID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsCisJCQkJCQkgICAgIGNsLT5jbGFzc2lkKSkgPT0gTlVMTCkKIAkJCQlyZXR1cm4gLUVOT0JVRlM7CiAJCX0gZWxzZSB7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCkBAIC0xNjgzLDkgKzE2ODUsOCBAQAogI2VuZGlmCiAJCX0KIAkJc2NoX3RyZWVfbG9jayhzY2gpOwotCQkqb2xkID0gY2wtPnE7Ci0JCWNsLT5xID0gbmV3OwotCQlzY2gtPnEucWxlbiAtPSAoKm9sZCktPnEucWxlbjsKKwkJKm9sZCA9IHhjaGcoJmNsLT5xLCBuZXcpOworCQlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oKm9sZCwgKCpvbGQpLT5xLnFsZW4pOwogCQlxZGlzY19yZXNldCgqb2xkKTsKIAkJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKQEAgLTE3MDIsNiArMTcwMywxNCBAQAogCXJldHVybiBjbCA/IGNsLT5xIDogTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgY2JxX3FsZW5fbm90aWZ5KHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2JxX2NsYXNzICpjbCA9IChzdHJ1Y3QgY2JxX2NsYXNzICopYXJnOworCisJaWYgKGNsLT5xLT5xLnFsZW4gPT0gMCkKKwkJY2JxX2RlYWN0aXZhdGVfY2xhc3MoY2wpOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjYnFfZ2V0KHN0cnVjdCBRZGlzYyAqc2NoLCB1MzIgY2xhc3NpZCkKIHsKIAlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CkBAIC0xOTMyLDcgKzE5NDEsNyBAQAogCWNsLT5SX3RhYiA9IHJ0YWI7CiAJcnRhYiA9IE5VTEw7CiAJY2wtPnJlZmNudCA9IDE7Ci0JaWYgKCEoY2wtPnEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcykpKQorCWlmICghKGNsLT5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsIGNsYXNzaWQpKSkKIAkJY2wtPnEgPSAmbm9vcF9xZGlzYzsKIAljbC0+Y2xhc3NpZCA9IGNsYXNzaWQ7CiAJY2wtPnRwYXJlbnQgPSBwYXJlbnQ7CkBAIC0xOTg2LDEyICsxOTk1LDE3IEBACiB7CiAJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwogCXN0cnVjdCBjYnFfY2xhc3MgKmNsID0gKHN0cnVjdCBjYnFfY2xhc3MqKWFyZzsKKwl1bnNpZ25lZCBpbnQgcWxlbjsKIAogCWlmIChjbC0+ZmlsdGVycyB8fCBjbC0+Y2hpbGRyZW4gfHwgY2wgPT0gJnEtPmxpbmspCiAJCXJldHVybiAtRUJVU1k7CiAKIAlzY2hfdHJlZV9sb2NrKHNjaCk7CiAKKwlxbGVuID0gY2wtPnEtPnEucWxlbjsKKwlxZGlzY19yZXNldChjbC0+cSk7CisJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKGNsLT5xLCBxbGVuKTsKKwogCWlmIChjbC0+bmV4dF9hbGl2ZSkKIAkJY2JxX2RlYWN0aXZhdGVfY2xhc3MoY2wpOwogCkBAIC0yMDgyLDYgKzIwOTYsNyBAQAogc3RhdGljIHN0cnVjdCBRZGlzY19jbGFzc19vcHMgY2JxX2NsYXNzX29wcyA9IHsKIAkuZ3JhZnQJCT0JY2JxX2dyYWZ0LAogCS5sZWFmCQk9CWNicV9sZWFmLAorCS5xbGVuX25vdGlmeQk9CWNicV9xbGVuX25vdGlmeSwKIAkuZ2V0CQk9CWNicV9nZXQsCiAJLnB1dAkJPQljYnFfcHV0LAogCS5jaGFuZ2UJCT0JY2JxX2NoYW5nZV9jbGFzcywKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfZHNtYXJrLmMgYi9uZXQvc2NoZWQvc2NoX2RzbWFyay5jCmluZGV4IDExYzhhMjEuLmQ1NDIxODEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZHNtYXJrLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9kc21hcmsuYwpAQCAtODgsMTUgKzg4LDE2IEBACiAJCXNjaCwgcCwgbmV3LCBvbGQpOwogCiAJaWYgKG5ldyA9PSBOVUxMKSB7Ci0JCW5ldyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmcGZpZm9fcWRpc2Nfb3BzKTsKKwkJbmV3ID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsCisJCQkJCXNjaC0+aGFuZGxlKTsKIAkJaWYgKG5ldyA9PSBOVUxMKQogCQkJbmV3ID0gJm5vb3BfcWRpc2M7CiAJfQogCiAJc2NoX3RyZWVfbG9jayhzY2gpOwogCSpvbGQgPSB4Y2hnKCZwLT5xLCBuZXcpOworCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbigqb2xkLCAoKm9sZCktPnEucWxlbik7CiAJcWRpc2NfcmVzZXQoKm9sZCk7Ci0Jc2NoLT5xLnFsZW4gPSAwOwogCXNjaF90cmVlX3VubG9jayhzY2gpOwogCiAgICAgICAgIHJldHVybiAwOwpAQCAtMzA3LDcgKzMwOCw3IEBACiAJCQlpZiAocC0+bWFza1tpbmRleF0gIT0gMHhmZiB8fCBwLT52YWx1ZVtpbmRleF0pCiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZHNtYXJrX2RlcXVldWU6ICIKIAkJCQkgICAgICAgInVuc3VwcG9ydGVkIHByb3RvY29sICVkXG4iLAotCQkJCSAgICAgICBodG9ucyhza2ItPnByb3RvY29sKSk7CisJCQkJICAgICAgIG50b2hzKHNrYi0+cHJvdG9jb2wpKTsKIAkJCWJyZWFrOwogCX07CiAKQEAgLTM4Nyw3ICszODgsNyBAQAogCXAtPmRlZmF1bHRfaW5kZXggPSBkZWZhdWx0X2luZGV4OwogCXAtPnNldF90Y19pbmRleCA9IFJUQV9HRVRfRkxBRyh0YltUQ0FfRFNNQVJLX1NFVF9UQ19JTkRFWC0xXSk7CiAKLQlwLT5xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOworCXAtPnEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcywgc2NoLT5oYW5kbGUpOwogCWlmIChwLT5xID09IE5VTEwpCiAJCXAtPnEgPSAmbm9vcF9xZGlzYzsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCA4OGM2YTk5Li5iYzExNmJkIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtNDUwLDEzICs0NTAsMTUgQEAKIAlyZXR1cm4gRVJSX1BUUigtZXJyKTsKIH0KIAotc3RydWN0IFFkaXNjICogcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzKQorc3RydWN0IFFkaXNjICogcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzLAorCQkJCSB1bnNpZ25lZCBpbnQgcGFyZW50aWQpCiB7CiAJc3RydWN0IFFkaXNjICpzY2g7CiAJCiAJc2NoID0gcWRpc2NfYWxsb2MoZGV2LCBvcHMpOwogCWlmIChJU19FUlIoc2NoKSkKIAkJZ290byBlcnJvdXQ7CisJc2NoLT5wYXJlbnQgPSBwYXJlbnRpZDsKIAogCWlmICghb3BzLT5pbml0IHx8IG9wcy0+aW5pdChzY2gsIE5VTEwpID09IDApCiAJCXJldHVybiBzY2g7CkBAIC01MjAsNyArNTIyLDggQEAKIAlpZiAoZGV2LT5xZGlzY19zbGVlcGluZyA9PSAmbm9vcF9xZGlzYykgewogCQlzdHJ1Y3QgUWRpc2MgKnFkaXNjOwogCQlpZiAoZGV2LT50eF9xdWV1ZV9sZW4pIHsKLQkJCXFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoZGV2LCAmcGZpZm9fZmFzdF9vcHMpOworCQkJcWRpc2MgPSBxZGlzY19jcmVhdGVfZGZsdChkZXYsICZwZmlmb19mYXN0X29wcywKKwkJCQkJCSAgVENfSF9ST09UKTsKIAkJCWlmIChxZGlzYyA9PSBOVUxMKSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGFjdGl2YXRpb24gZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwogCQkJCXJldHVybjsKQEAgLTYwNiwxMyArNjA5LDEwIEBACiAJcWRpc2NfdW5sb2NrX3RyZWUoZGV2KTsKIH0KIAotRVhQT1JUX1NZTUJPTChfX25ldGRldl93YXRjaGRvZ191cCk7CiBFWFBPUlRfU1lNQk9MKG5ldGlmX2NhcnJpZXJfb24pOwogRVhQT1JUX1NZTUJPTChuZXRpZl9jYXJyaWVyX29mZik7CiBFWFBPUlRfU1lNQk9MKG5vb3BfcWRpc2MpOwotRVhQT1JUX1NZTUJPTChub29wX3FkaXNjX29wcyk7CiBFWFBPUlRfU1lNQk9MKHFkaXNjX2NyZWF0ZV9kZmx0KTsKLUVYUE9SVF9TWU1CT0wocWRpc2NfYWxsb2MpOwogRVhQT1JUX1NZTUJPTChxZGlzY19kZXN0cm95KTsKIEVYUE9SVF9TWU1CT0wocWRpc2NfcmVzZXQpOwogRVhQT1JUX1NZTUJPTChxZGlzY19sb2NrX3RyZWUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9oZnNjLmMgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwppbmRleCA2YTY3MzVhLi42ZWVmYTY5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2hmc2MuYworKysgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwpAQCAtOTQ2LDYgKzk0Niw3IEBACiAJaWYgKHVubGlrZWx5KHNjaC0+b3BzLT5yZXF1ZXVlKHNrYiwgc2NoKSAhPSBORVRfWE1JVF9TVUNDRVNTKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKCJxZGlzY19wZWVrX2xlbjogZmFpbGVkIHRvIHJlcXVldWVcbiIpOworCQlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oc2NoLCAxKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiBsZW47CkBAIC05NTcsMTEgKzk1OCw3IEBACiAJdW5zaWduZWQgaW50IGxlbiA9IGNsLT5xZGlzYy0+cS5xbGVuOwogCiAJcWRpc2NfcmVzZXQoY2wtPnFkaXNjKTsKLQlpZiAobGVuID4gMCkgewotCQl1cGRhdGVfdmYoY2wsIDAsIDApOwotCQlzZXRfcGFzc2l2ZShjbCk7Ci0JCXNjaC0+cS5xbGVuIC09IGxlbjsKLQl9CisJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKGNsLT5xZGlzYywgbGVuKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTExMzgsNyArMTEzNSw3IEBACiAJY2wtPmNsYXNzaWQgICA9IGNsYXNzaWQ7CiAJY2wtPnNjaGVkICAgICA9IHE7CiAJY2wtPmNsX3BhcmVudCA9IHBhcmVudDsKLQljbC0+cWRpc2MgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcyk7CisJY2wtPnFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsIGNsYXNzaWQpOwogCWlmIChjbC0+cWRpc2MgPT0gTlVMTCkKIAkJY2wtPnFkaXNjID0gJm5vb3BfcWRpc2M7CiAJY2wtPnN0YXRzX2xvY2sgPSAmc2NoLT5kZXYtPnF1ZXVlX2xvY2s7CkBAIC0xMjcxLDcgKzEyNjgsOCBAQAogCWlmIChjbC0+bGV2ZWwgPiAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAobmV3ID09IE5VTEwpIHsKLQkJbmV3ID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOworCQluZXcgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcywKKwkJCQkJY2wtPmNsYXNzaWQpOwogCQlpZiAobmV3ID09IE5VTEwpCiAJCQluZXcgPSAmbm9vcF9xZGlzYzsKIAl9CkBAIC0xMjk0LDYgKzEyOTIsMTcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQKK2hmc2NfcWxlbl9ub3RpZnkoc3RydWN0IFFkaXNjICpzY2gsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBoZnNjX2NsYXNzICpjbCA9IChzdHJ1Y3QgaGZzY19jbGFzcyAqKWFyZzsKKworCWlmIChjbC0+cWRpc2MtPnEucWxlbiA9PSAwKSB7CisJCXVwZGF0ZV92ZihjbCwgMCwgMCk7CisJCXNldF9wYXNzaXZlKGNsKTsKKwl9Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBoZnNjX2dldF9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGNsYXNzaWQpCiB7CkBAIC0xNTE0LDcgKzE1MjMsOCBAQAogCXEtPnJvb3QucmVmY250ICA9IDE7CiAJcS0+cm9vdC5jbGFzc2lkID0gc2NoLT5oYW5kbGU7CiAJcS0+cm9vdC5zY2hlZCAgID0gcTsKLQlxLT5yb290LnFkaXNjID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOworCXEtPnJvb3QucWRpc2MgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcywKKwkJCQkJICBzY2gtPmhhbmRsZSk7CiAJaWYgKHEtPnJvb3QucWRpc2MgPT0gTlVMTCkKIAkJcS0+cm9vdC5xZGlzYyA9ICZub29wX3FkaXNjOwogCXEtPnJvb3Quc3RhdHNfbG9jayA9ICZzY2gtPmRldi0+cXVldWVfbG9jazsKQEAgLTE3NzcsNiArMTc4Nyw3IEBACiAJLmRlbGV0ZQkJPSBoZnNjX2RlbGV0ZV9jbGFzcywKIAkuZ3JhZnQJCT0gaGZzY19ncmFmdF9jbGFzcywKIAkubGVhZgkJPSBoZnNjX2NsYXNzX2xlYWYsCisJLnFsZW5fbm90aWZ5CT0gaGZzY19xbGVuX25vdGlmeSwKIAkuZ2V0CQk9IGhmc2NfZ2V0X2NsYXNzLAogCS5wdXQJCT0gaGZzY19wdXRfY2xhc3MsCiAJLmJpbmRfdGNmCT0gaGZzY19iaW5kX3RjZiwKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaHRiLmMgYi9uZXQvc2NoZWQvc2NoX2h0Yi5jCmluZGV4IDliOWM1NTUuLjE1ZjIzYzUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaHRiLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9odGIuYwpAQCAtMTQ3LDYgKzE0NywxMCBAQAogCXBzY2hlZF90ZGlmZl90IG1idWZmZXI7CS8qIG1heCB3YWl0IHRpbWUgKi8KIAlsb25nIHRva2VucywgY3Rva2VuczsJLyogY3VycmVudCBudW1iZXIgb2YgdG9rZW5zICovCiAJcHNjaGVkX3RpbWVfdCB0X2M7CS8qIGNoZWNrcG9pbnQgdGltZSAqLworCisJaW50IHByaW87CQkvKiBGb3IgcGFyZW50IHRvIGxlYWYgcmV0dXJuIHBvc3NpYmxlIGhlcmUgKi8KKwlpbnQgcXVhbnR1bTsJCS8qIHdlIGRvIGJhY2t1cC4gRmluYWxseSBmdWxsIHJlcGxhY2VtZW50ICAqLworCQkJCS8qIG9mIHVuLmxlYWYgb3JpZ2luYWxzIHNob3VsZCBiZSBkb25lLiAqLwogfTsKIAogLyogVE9ETzogbWF5YmUgY29tcHV0ZSByYXRlIHdoZW4gc2l6ZSBpcyB0b28gbGFyZ2UgLi4gb3IgZHJvcCA/ICovCkBAIC0xMjIzLDE3ICsxMjI3LDE0IEBACiAJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSAoc3RydWN0IGh0Yl9jbGFzcyAqKWFyZzsKIAogCWlmIChjbCAmJiAhY2wtPmxldmVsKSB7Ci0JCWlmIChuZXcgPT0gTlVMTCAmJiAobmV3ID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsCi0JCQkJCQkJICAgICZwZmlmb19xZGlzY19vcHMpKQorCQlpZiAobmV3ID09IE5VTEwgJiYKKwkJICAgIChuZXcgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcywKKwkJICAgIAkJCSAgICAgY2wtPmNsYXNzaWQpKQogCQkgICAgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PQlVGUzsKIAkJc2NoX3RyZWVfbG9jayhzY2gpOwogCQlpZiAoKCpvbGQgPSB4Y2hnKCZjbC0+dW4ubGVhZi5xLCBuZXcpKSAhPSBOVUxMKSB7Ci0JCQlpZiAoY2wtPnByaW9fYWN0aXZpdHkpCi0JCQkJaHRiX2RlYWN0aXZhdGUocWRpc2NfcHJpdihzY2gpLCBjbCk7Ci0KLQkJCS8qIFRPRE86IGlzIGl0IGNvcnJlY3QgPyBXaHkgQ0JRIGRvZXNuJ3QgZG8gaXQgPyAqLwotCQkJc2NoLT5xLnFsZW4gLT0gKCpvbGQpLT5xLnFsZW47CisJCQlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oKm9sZCwgKCpvbGQpLT5xLnFsZW4pOwogCQkJcWRpc2NfcmVzZXQoKm9sZCk7CiAJCX0KIAkJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CkBAIC0xMjQ4LDYgKzEyNDksMTQgQEAKIAlyZXR1cm4gKGNsICYmICFjbC0+bGV2ZWwpID8gY2wtPnVuLmxlYWYucSA6IE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIGh0Yl9xbGVuX25vdGlmeShzdHJ1Y3QgUWRpc2MgKnNjaCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGh0Yl9jbGFzcyAqY2wgPSAoc3RydWN0IGh0Yl9jbGFzcyAqKWFyZzsKKworCWlmIChjbC0+dW4ubGVhZi5xLT5xLnFsZW4gPT0gMCkKKwkJaHRiX2RlYWN0aXZhdGUocWRpc2NfcHJpdihzY2gpLCBjbCk7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGh0Yl9nZXQoc3RydWN0IFFkaXNjICpzY2gsIHUzMiBjbGFzc2lkKQogewogCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gaHRiX2ZpbmQoY2xhc3NpZCwgc2NoKTsKQEAgLTEyNjYsMTIgKzEyNzUsNDQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGh0Yl9wYXJlbnRfbGFzdF9jaGlsZChzdHJ1Y3QgaHRiX2NsYXNzICpjbCkKK3sKKwlpZiAoIWNsLT5wYXJlbnQpCisJCS8qIHRoZSByb290IGNsYXNzICovCisJCXJldHVybiAwOworCisJaWYgKCEoY2wtPnBhcmVudC0+Y2hpbGRyZW4ubmV4dCA9PSAmY2wtPnNpYmxpbmcgJiYKKwkJY2wtPnBhcmVudC0+Y2hpbGRyZW4ucHJldiA9PSAmY2wtPnNpYmxpbmcpKQorCQkvKiBub3QgdGhlIGxhc3QgY2hpbGQgKi8KKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaHRiX3BhcmVudF90b19sZWFmKHN0cnVjdCBodGJfY2xhc3MgKmNsLCBzdHJ1Y3QgUWRpc2MgKm5ld19xKQoreworCXN0cnVjdCBodGJfY2xhc3MgKnBhcmVudCA9IGNsLT5wYXJlbnQ7CisKKwlCVUdfVFJBUCghY2wtPmxldmVsICYmIGNsLT51bi5sZWFmLnEgJiYgIWNsLT5wcmlvX2FjdGl2aXR5KTsKKworCXBhcmVudC0+bGV2ZWwgPSAwOworCW1lbXNldCgmcGFyZW50LT51bi5pbm5lciwgMCwgc2l6ZW9mKHBhcmVudC0+dW4uaW5uZXIpKTsKKwlJTklUX0xJU1RfSEVBRCgmcGFyZW50LT51bi5sZWFmLmRyb3BfbGlzdCk7CisJcGFyZW50LT51bi5sZWFmLnEgPSBuZXdfcSA/IG5ld19xIDogJm5vb3BfcWRpc2M7CisJcGFyZW50LT51bi5sZWFmLnF1YW50dW0gPSBwYXJlbnQtPnF1YW50dW07CisJcGFyZW50LT51bi5sZWFmLnByaW8gPSBwYXJlbnQtPnByaW87CisJcGFyZW50LT50b2tlbnMgPSBwYXJlbnQtPmJ1ZmZlcjsKKwlwYXJlbnQtPmN0b2tlbnMgPSBwYXJlbnQtPmNidWZmZXI7CisJUFNDSEVEX0dFVF9USU1FKHBhcmVudC0+dF9jKTsKKwlwYXJlbnQtPmNtb2RlID0gSFRCX0NBTl9TRU5EOworfQorCiBzdGF0aWMgdm9pZCBodGJfZGVzdHJveV9jbGFzcyhzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IGh0Yl9jbGFzcyAqY2wpCiB7CiAJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwogCWlmICghY2wtPmxldmVsKSB7CiAJCUJVR19UUkFQKGNsLT51bi5sZWFmLnEpOwotCQlzY2gtPnEucWxlbiAtPSBjbC0+dW4ubGVhZi5xLT5xLnFsZW47CiAJCXFkaXNjX2Rlc3Ryb3koY2wtPnVuLmxlYWYucSk7CiAJfQogCXFkaXNjX3B1dF9ydGFiKGNsLT5yYXRlKTsKQEAgLTEyODQsOCArMTMyNSw3IEBACiAJCQkJCQkgIHN0cnVjdCBodGJfY2xhc3MsIHNpYmxpbmcpKTsKIAogCS8qIG5vdGU6IHRoaXMgZGVsZXRlIG1heSBoYXBwZW4gdHdpY2UgKHNlZSBodGJfZGVsZXRlKSAqLwotCWlmICghaGxpc3RfdW5oYXNoZWQoJmNsLT5obGlzdCkpCi0JCWhsaXN0X2RlbCgmY2wtPmhsaXN0KTsKKwlobGlzdF9kZWxfaW5pdCgmY2wtPmhsaXN0KTsKIAlsaXN0X2RlbCgmY2wtPnNpYmxpbmcpOwogCiAJaWYgKGNsLT5wcmlvX2FjdGl2aXR5KQpAQCAtMTMyMyw2ICsxMzYzLDkgQEAKIHsKIAlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwogCXN0cnVjdCBodGJfY2xhc3MgKmNsID0gKHN0cnVjdCBodGJfY2xhc3MgKilhcmc7CisJdW5zaWduZWQgaW50IHFsZW47CisJc3RydWN0IFFkaXNjICpuZXdfcSA9IE5VTEw7CisJaW50IGxhc3RfY2hpbGQgPSAwOwogCiAJLy8gVE9ETzogd2h5IGRvbid0IGFsbG93IHRvIGRlbGV0ZSBzdWJ0cmVlID8gcmVmZXJlbmNlcyA/IGRvZXMKIAkvLyB0YyBzdWJzeXMgcXVhcmFudGVlIHVzIHRoYXQgaW4gaHRiX2Rlc3Ryb3kgaXQgaG9sZHMgbm8gY2xhc3MKQEAgLTEzMzAsMTUgKzEzNzMsMjkgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJmNsLT5jaGlsZHJlbikgfHwgY2wtPmZpbHRlcl9jbnQpCiAJCXJldHVybiAtRUJVU1k7CiAKKwlpZiAoIWNsLT5sZXZlbCAmJiBodGJfcGFyZW50X2xhc3RfY2hpbGQoY2wpKSB7CisJCW5ld19xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsCisJCQkJCQljbC0+cGFyZW50LT5jbGFzc2lkKTsKKwkJbGFzdF9jaGlsZCA9IDE7CisJfQorCiAJc2NoX3RyZWVfbG9jayhzY2gpOwogCiAJLyogZGVsZXRlIGZyb20gaGFzaCBhbmQgYWN0aXZlOyByZW1haW5kZXIgaW4gZGVzdHJveV9jbGFzcyAqLwotCWlmICghaGxpc3RfdW5oYXNoZWQoJmNsLT5obGlzdCkpCi0JCWhsaXN0X2RlbCgmY2wtPmhsaXN0KTsKKwlobGlzdF9kZWxfaW5pdCgmY2wtPmhsaXN0KTsKKworCWlmICghY2wtPmxldmVsKSB7CisJCXFsZW4gPSBjbC0+dW4ubGVhZi5xLT5xLnFsZW47CisJCXFkaXNjX3Jlc2V0KGNsLT51bi5sZWFmLnEpOworCQlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oY2wtPnVuLmxlYWYucSwgcWxlbik7CisJfQogCiAJaWYgKGNsLT5wcmlvX2FjdGl2aXR5KQogCQlodGJfZGVhY3RpdmF0ZShxLCBjbCk7CiAKKwlpZiAobGFzdF9jaGlsZCkKKwkJaHRiX3BhcmVudF90b19sZWFmKGNsLCBuZXdfcSk7CisKIAlpZiAoLS1jbC0+cmVmY250ID09IDApCiAJCWh0Yl9kZXN0cm95X2NsYXNzKHNjaCwgY2wpOwogCkBAIC0xNDEyLDExICsxNDY5LDE0IEBACiAJCS8qIGNyZWF0ZSBsZWFmIHFkaXNjIGVhcmx5IGJlY2F1c2UgaXQgdXNlcyBrbWFsbG9jKEdGUF9LRVJORUwpCiAJCSAgIHNvIHRoYXQgY2FuJ3QgYmUgdXNlZCBpbnNpZGUgb2Ygc2NoX3RyZWVfbG9jawogCQkgICAtLSB0aGFua3MgdG8gS2FybGlzIFBlaXNlbmlla3MgKi8KLQkJbmV3X3EgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcyk7CisJCW5ld19xID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMsIGNsYXNzaWQpOwogCQlzY2hfdHJlZV9sb2NrKHNjaCk7CiAJCWlmIChwYXJlbnQgJiYgIXBhcmVudC0+bGV2ZWwpIHsKKwkJCXVuc2lnbmVkIGludCBxbGVuID0gcGFyZW50LT51bi5sZWFmLnEtPnEucWxlbjsKKwogCQkJLyogdHVybiBwYXJlbnQgaW50byBpbm5lciBub2RlICovCi0JCQlzY2gtPnEucWxlbiAtPSBwYXJlbnQtPnVuLmxlYWYucS0+cS5xbGVuOworCQkJcWRpc2NfcmVzZXQocGFyZW50LT51bi5sZWFmLnEpOworCQkJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHBhcmVudC0+dW4ubGVhZi5xLCBxbGVuKTsKIAkJCXFkaXNjX2Rlc3Ryb3kocGFyZW50LT51bi5sZWFmLnEpOwogCQkJaWYgKHBhcmVudC0+cHJpb19hY3Rpdml0eSkKIAkJCQlodGJfZGVhY3RpdmF0ZShxLCBwYXJlbnQpOwpAQCAtMTQ3MCw2ICsxNTMwLDEwIEBACiAJCQljbC0+dW4ubGVhZi5xdWFudHVtID0gaG9wdC0+cXVhbnR1bTsKIAkJaWYgKChjbC0+dW4ubGVhZi5wcmlvID0gaG9wdC0+cHJpbykgPj0gVENfSFRCX05VTVBSSU8pCiAJCQljbC0+dW4ubGVhZi5wcmlvID0gVENfSFRCX05VTVBSSU8gLSAxOworCisJCS8qIGJhY2t1cCBmb3IgaHRiX3BhcmVudF90b19sZWFmICovCisJCWNsLT5xdWFudHVtID0gY2wtPnVuLmxlYWYucXVhbnR1bTsKKwkJY2wtPnByaW8gPSBjbC0+dW4ubGVhZi5wcmlvOwogCX0KIAogCWNsLT5idWZmZXIgPSBob3B0LT5idWZmZXI7CkBAIC0xNTY0LDYgKzE2MjgsNyBAQAogc3RhdGljIHN0cnVjdCBRZGlzY19jbGFzc19vcHMgaHRiX2NsYXNzX29wcyA9IHsKIAkuZ3JhZnQJCT0JaHRiX2dyYWZ0LAogCS5sZWFmCQk9CWh0Yl9sZWFmLAorCS5xbGVuX25vdGlmeQk9CWh0Yl9xbGVuX25vdGlmeSwKIAkuZ2V0CQk9CWh0Yl9nZXQsCiAJLnB1dAkJPQlodGJfcHV0LAogCS5jaGFuZ2UJCT0JaHRiX2NoYW5nZV9jbGFzcywKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwppbmRleCA0NTkzOWJhLi43OTU0MmFmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCkBAIC00LDcgKzQsNyBAQAogICogCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiAJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCQkyIG9mIHRoZSBMaWNlbnNlLgogICoKICAqICAJCU1hbnkgb2YgdGhlIGFsZ29yaXRobXMgYW5kIGlkZWFzIGZvciB0aGlzIGNhbWUgZnJvbQogICoJCU5JU1QgTmV0IHdoaWNoIGlzIG5vdCBjb3B5cmlnaHRlZC4gCkBAIC0xNzAsNiArMTcwLDggQEAKIAkJcmV0dXJuIE5FVF9YTUlUX0JZUEFTUzsKIAl9CiAKKwlza2Jfb3JwaGFuKHNrYik7CisKIAkvKgogCSAqIElmIHdlIG5lZWQgdG8gZHVwbGljYXRlIHBhY2tldCwgdGhlbiByZS1pbnNlcnQgYXQgdG9wIG9mIHRoZQogCSAqIHFkaXNjIHRyZWUsIHNpbmNlIHBhcmVudCBxdWV1ZXIgZXhwZWN0cyB0aGF0IG9ubHkgb25lCkBAIC0yODUsMTMgKzI4NywxMCBAQAogCQkJcHNjaGVkX3RkaWZmX3QgZGVsYXkgPSBQU0NIRURfVERJRkYoY2ItPnRpbWVfdG9fc2VuZCwgbm93KTsKIAogCQkJaWYgKHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYykgIT0gTkVUX1hNSVRfU1VDQ0VTUykgeworCQkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihxLT5xZGlzYywgMSk7CiAJCQkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKLQotCQkJCS8qIEFmdGVyIHRoaXMgcWxlbiBpcyBjb25mdXNlZCAqLwogCQkJCXByaW50ayhLRVJOX0VSUiAibmV0ZW06IHF1ZXVlIGRpc2NwbGluZSAlcyBjb3VsZCBub3QgcmVxdWV1ZVxuIiwKIAkJCQkgICAgICAgcS0+cWRpc2MtPm9wcy0+aWQpOwotCi0JCQkJc2NoLT5xLnFsZW4tLTsKIAkJCX0KIAogCQkJbW9kX3RpbWVyKCZxLT50aW1lciwgamlmZmllcyArIFBTQ0hFRF9VUzJKSUZGSUUoZGVsYXkpKTsKQEAgLTU3Miw3ICs1NzEsOCBAQAogCXEtPnRpbWVyLmZ1bmN0aW9uID0gbmV0ZW1fd2F0Y2hkb2c7CiAJcS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY2g7CiAKLQlxLT5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmdGZpZm9fcWRpc2Nfb3BzKTsKKwlxLT5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmdGZpZm9fcWRpc2Nfb3BzLAorCQkJCSAgICAgVENfSF9NQUtFKHNjaC0+aGFuZGxlLCAxKSk7CiAJaWYgKCFxLT5xZGlzYykgewogCQlwcl9kZWJ1ZygibmV0ZW06IHFkaXNjIGNyZWF0ZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY1OSw4ICs2NTksOCBAQAogCiAJc2NoX3RyZWVfbG9jayhzY2gpOwogCSpvbGQgPSB4Y2hnKCZxLT5xZGlzYywgbmV3KTsKKwlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oKm9sZCwgKCpvbGQpLT5xLnFsZW4pOwogCXFkaXNjX3Jlc2V0KCpvbGQpOwotCXNjaC0+cS5xbGVuID0gMDsKIAlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9wcmlvLmMgYi9uZXQvc2NoZWQvc2NoX3ByaW8uYwppbmRleCBhNWZhMDNjLi4yNTY3YjRjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3ByaW8uYworKysgYi9uZXQvc2NoZWQvc2NoX3ByaW8uYwpAQCAtMjIyLDIxICsyMjIsMjcgQEAKIAogCWZvciAoaT1xLT5iYW5kczsgaTxUQ1FfUFJJT19CQU5EUzsgaSsrKSB7CiAJCXN0cnVjdCBRZGlzYyAqY2hpbGQgPSB4Y2hnKCZxLT5xdWV1ZXNbaV0sICZub29wX3FkaXNjKTsKLQkJaWYgKGNoaWxkICE9ICZub29wX3FkaXNjKQorCQlpZiAoY2hpbGQgIT0gJm5vb3BfcWRpc2MpIHsKKwkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihjaGlsZCwgY2hpbGQtPnEucWxlbik7CiAJCQlxZGlzY19kZXN0cm95KGNoaWxkKTsKKwkJfQogCX0KIAlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAogCWZvciAoaT0wOyBpPHEtPmJhbmRzOyBpKyspIHsKIAkJaWYgKHEtPnF1ZXVlc1tpXSA9PSAmbm9vcF9xZGlzYykgewogCQkJc3RydWN0IFFkaXNjICpjaGlsZDsKLQkJCWNoaWxkID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZwZmlmb19xZGlzY19vcHMpOworCQkJY2hpbGQgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJnBmaWZvX3FkaXNjX29wcywKKwkJCQkJCSAgVENfSF9NQUtFKHNjaC0+aGFuZGxlLCBpICsgMSkpOwogCQkJaWYgKGNoaWxkKSB7CiAJCQkJc2NoX3RyZWVfbG9jayhzY2gpOwogCQkJCWNoaWxkID0geGNoZygmcS0+cXVldWVzW2ldLCBjaGlsZCk7CiAKLQkJCQlpZiAoY2hpbGQgIT0gJm5vb3BfcWRpc2MpCisJCQkJaWYgKGNoaWxkICE9ICZub29wX3FkaXNjKSB7CisJCQkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihjaGlsZCwKKwkJCQkJCQkJIGNoaWxkLT5xLnFsZW4pOwogCQkJCQlxZGlzY19kZXN0cm95KGNoaWxkKTsKKwkJCQl9CiAJCQkJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAJCQl9CiAJCX0KQEAgLTI5NCw3ICszMDAsNyBAQAogCXNjaF90cmVlX2xvY2soc2NoKTsKIAkqb2xkID0gcS0+cXVldWVzW2JhbmRdOwogCXEtPnF1ZXVlc1tiYW5kXSA9IG5ldzsKLQlzY2gtPnEucWxlbiAtPSAoKm9sZCktPnEucWxlbjsKKwlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oKm9sZCwgKCpvbGQpLT5xLnFsZW4pOwogCXFkaXNjX3Jlc2V0KCpvbGQpOwogCXNjaF90cmVlX3VubG9jayhzY2gpOwogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3JlZC5jIGIvbmV0L3NjaGVkL3NjaF9yZWQuYwppbmRleCBkNjVjYWRkLi5hY2RkYWQwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3JlZC5jCisrKyBiL25ldC9zY2hlZC9zY2hfcmVkLmMKQEAgLTE3NSwxMiArMTc1LDE0IEBACiAJcWRpc2NfZGVzdHJveShxLT5xZGlzYyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgUWRpc2MgKnJlZF9jcmVhdGVfZGZsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGltaXQpCitzdGF0aWMgc3RydWN0IFFkaXNjICpyZWRfY3JlYXRlX2RmbHQoc3RydWN0IFFkaXNjICpzY2gsIHUzMiBsaW1pdCkKIHsKLQlzdHJ1Y3QgUWRpc2MgKnEgPSBxZGlzY19jcmVhdGVfZGZsdChkZXYsICZiZmlmb19xZGlzY19vcHMpOworCXN0cnVjdCBRZGlzYyAqcTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAJaW50IHJldDsKIAorCXEgPSBxZGlzY19jcmVhdGVfZGZsdChzY2gtPmRldiwgJmJmaWZvX3FkaXNjX29wcywKKwkJCSAgICAgIFRDX0hfTUFLRShzY2gtPmhhbmRsZSwgMSkpOwogCWlmIChxKSB7CiAJCXJ0YSA9IGttYWxsb2MoUlRBX0xFTkdUSChzaXplb2Yoc3RydWN0IHRjX2ZpZm9fcW9wdCkpLAogCQkgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwpAQCAtMjE5LDcgKzIyMSw3IEBACiAJY3RsID0gUlRBX0RBVEEodGJbVENBX1JFRF9QQVJNUy0xXSk7CiAKIAlpZiAoY3RsLT5saW1pdCA+IDApIHsKLQkJY2hpbGQgPSByZWRfY3JlYXRlX2RmbHQoc2NoLT5kZXYsIGN0bC0+bGltaXQpOworCQljaGlsZCA9IHJlZF9jcmVhdGVfZGZsdChzY2gsIGN0bC0+bGltaXQpOwogCQlpZiAoY2hpbGQgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTIyNyw4ICsyMjksMTAgQEAKIAlzY2hfdHJlZV9sb2NrKHNjaCk7CiAJcS0+ZmxhZ3MgPSBjdGwtPmZsYWdzOwogCXEtPmxpbWl0ID0gY3RsLT5saW1pdDsKLQlpZiAoY2hpbGQpCisJaWYgKGNoaWxkKSB7CisJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihxLT5xZGlzYywgcS0+cWRpc2MtPnEucWxlbik7CiAJCXFkaXNjX2Rlc3Ryb3koeGNoZygmcS0+cWRpc2MsIGNoaWxkKSk7CisJfQogCiAJcmVkX3NldF9wYXJtcygmcS0+cGFybXMsIGN0bC0+cXRoX21pbiwgY3RsLT5xdGhfbWF4LCBjdGwtPldsb2csCiAJCQkJIGN0bC0+UGxvZywgY3RsLT5TY2VsbF9sb2csCkBAIC0zMDYsOCArMzEwLDggQEAKIAogCXNjaF90cmVlX2xvY2soc2NoKTsKIAkqb2xkID0geGNoZygmcS0+cWRpc2MsIG5ldyk7CisJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKCpvbGQsICgqb2xkKS0+cS5xbGVuKTsKIAlxZGlzY19yZXNldCgqb2xkKTsKLQlzY2gtPnEucWxlbiA9IDA7CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3NmcS5jIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwppbmRleCBkMGQ2ZTU5Li40NTljZGEyIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3NmcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKQEAgLTM5Myw2ICszOTMsNyBAQAogewogCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlzdHJ1Y3QgdGNfc2ZxX3FvcHQgKmN0bCA9IFJUQV9EQVRBKG9wdCk7CisJdW5zaWduZWQgaW50IHFsZW47CiAKIAlpZiAob3B0LT5ydGFfbGVuIDwgUlRBX0xFTkdUSChzaXplb2YoKmN0bCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQwMyw4ICs0MDQsMTAgQEAKIAlpZiAoY3RsLT5saW1pdCkKIAkJcS0+bGltaXQgPSBtaW5fdCh1MzIsIGN0bC0+bGltaXQsIFNGUV9ERVBUSCk7CiAKKwlxbGVuID0gc2NoLT5xLnFsZW47CiAJd2hpbGUgKHNjaC0+cS5xbGVuID49IHEtPmxpbWl0LTEpCiAJCXNmcV9kcm9wKHNjaCk7CisJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHNjaCwgcWxlbiAtIHNjaC0+cS5xbGVuKTsKIAogCWRlbF90aW1lcigmcS0+cGVydHVyYl90aW1lcik7CiAJaWYgKHEtPnBlcnR1cmJfcGVyaW9kKSB7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3RiZi5jIGIvbmV0L3NjaGVkL3NjaF90YmYuYwppbmRleCBkOWE1ZDI5Li5lZDliNmQ5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3RiZi5jCisrKyBiL25ldC9zY2hlZC9zY2hfdGJmLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAJCWlmIChxLT5xZGlzYy0+b3BzLT5yZXF1ZXVlKHNrYiwgcS0+cWRpc2MpICE9IE5FVF9YTUlUX1NVQ0NFU1MpIHsKIAkJCS8qIFdoZW4gcmVxdWV1ZSBmYWlscyBza2IgaXMgZHJvcHBlZCAqLwotCQkJc2NoLT5xLnFsZW4tLTsKKwkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihxLT5xZGlzYywgMSk7CiAJCQlzY2gtPnFzdGF0cy5kcm9wcysrOwogCQl9CiAKQEAgLTI3MywxMiArMjczLDE0IEBACiAJZGVsX3RpbWVyKCZxLT53ZF90aW1lcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgUWRpc2MgKnRiZl9jcmVhdGVfZGZsdF9xZGlzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGltaXQpCitzdGF0aWMgc3RydWN0IFFkaXNjICp0YmZfY3JlYXRlX2RmbHRfcWRpc2Moc3RydWN0IFFkaXNjICpzY2gsIHUzMiBsaW1pdCkKIHsKLQlzdHJ1Y3QgUWRpc2MgKnEgPSBxZGlzY19jcmVhdGVfZGZsdChkZXYsICZiZmlmb19xZGlzY19vcHMpOworCXN0cnVjdCBRZGlzYyAqcTsKICAgICAgICAgc3RydWN0IHJ0YXR0ciAqcnRhOwogCWludCByZXQ7CiAKKwlxID0gcWRpc2NfY3JlYXRlX2RmbHQoc2NoLT5kZXYsICZiZmlmb19xZGlzY19vcHMsCisJCQkgICAgICBUQ19IX01BS0Uoc2NoLT5oYW5kbGUsIDEpKTsKIAlpZiAocSkgewogCQlydGEgPSBrbWFsbG9jKFJUQV9MRU5HVEgoc2l6ZW9mKHN0cnVjdCB0Y19maWZvX3FvcHQpKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChydGEpIHsKQEAgLTM0MSwxMyArMzQzLDE1IEBACiAJCWdvdG8gZG9uZTsKIAogCWlmIChxb3B0LT5saW1pdCA+IDApIHsKLQkJaWYgKChjaGlsZCA9IHRiZl9jcmVhdGVfZGZsdF9xZGlzYyhzY2gtPmRldiwgcW9wdC0+bGltaXQpKSA9PSBOVUxMKQorCQlpZiAoKGNoaWxkID0gdGJmX2NyZWF0ZV9kZmx0X3FkaXNjKHNjaCwgcW9wdC0+bGltaXQpKSA9PSBOVUxMKQogCQkJZ290byBkb25lOwogCX0KIAogCXNjaF90cmVlX2xvY2soc2NoKTsKLQlpZiAoY2hpbGQpCisJaWYgKGNoaWxkKSB7CisJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihxLT5xZGlzYywgcS0+cWRpc2MtPnEucWxlbik7CiAJCXFkaXNjX2Rlc3Ryb3koeGNoZygmcS0+cWRpc2MsIGNoaWxkKSk7CisJfQogCXEtPmxpbWl0ID0gcW9wdC0+bGltaXQ7CiAJcS0+bXR1ID0gcW9wdC0+bXR1OwogCXEtPm1heF9zaXplID0gbWF4X3NpemU7CkBAIC00NDksOCArNDUzLDggQEAKIAogCXNjaF90cmVlX2xvY2soc2NoKTsKIAkqb2xkID0geGNoZygmcS0+cWRpc2MsIG5ldyk7CisJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKCpvbGQsICgqb2xkKS0+cS5xbGVuKTsKIAlxZGlzY19yZXNldCgqb2xkKTsKLQlzY2gtPnEucWxlbiA9IDA7CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2Fzc29jaW9sYS5jIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKaW5kZXggMjczMjljZS4uNWRiOTVjYSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMKKysrIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKQEAgLTYxLDcgKzYxLDcgQEAKICNpbmNsdWRlIDxuZXQvc2N0cC9zbS5oPgogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zLiAqLwotc3RhdGljIHZvaWQgc2N0cF9hc3NvY19iaF9yY3Yoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MpOworc3RhdGljIHZvaWQgc2N0cF9hc3NvY19iaF9yY3Yoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogCiAvKiAxc3QgTGV2ZWwgQWJzdHJhY3Rpb25zLiAqLwpAQCAtMjY5LDkgKzI2OSw3IEBACiAKIAkvKiBDcmVhdGUgYW4gaW5wdXQgcXVldWUuICAqLwogCXNjdHBfaW5xX2luaXQoJmFzb2MtPmJhc2UuaW5xdWV1ZSk7Ci0Jc2N0cF9pbnFfc2V0X3RoX2hhbmRsZXIoJmFzb2MtPmJhc2UuaW5xdWV1ZSwKLQkJCQkgICAgKHZvaWQgKCopKHZvaWQgKikpc2N0cF9hc3NvY19iaF9yY3YsCi0JCQkJICAgIGFzb2MpOworCXNjdHBfaW5xX3NldF90aF9oYW5kbGVyKCZhc29jLT5iYXNlLmlucXVldWUsIHNjdHBfYXNzb2NfYmhfcmN2KTsKIAogCS8qIENyZWF0ZSBhbiBvdXRwdXQgcXVldWUuICAqLwogCXNjdHBfb3V0cV9pbml0KGFzb2MsICZhc29jLT5vdXRxdWV1ZSk7CkBAIC0zMDAsNiArMjk4LDcgQEAKIAlhc29jLT5kZWZhdWx0X2ZsYWdzID0gc3AtPmRlZmF1bHRfZmxhZ3M7CiAJYXNvYy0+ZGVmYXVsdF9jb250ZXh0ID0gc3AtPmRlZmF1bHRfY29udGV4dDsKIAlhc29jLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSBzcC0+ZGVmYXVsdF90aW1ldG9saXZlOworCWFzb2MtPmRlZmF1bHRfcmN2X2NvbnRleHQgPSBzcC0+ZGVmYXVsdF9yY3ZfY29udGV4dDsKIAogCXJldHVybiBhc29jOwogCkBAIC0zNDYsMTEgKzM0NSwxOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CiAJaW50IGk7CiAKLQlsaXN0X2RlbCgmYXNvYy0+YXNvY3MpOworCS8qIE9ubHkgcmVhbCBhc3NvY2lhdGlvbnMgY291bnQgYWdhaW5zdCB0aGUgZW5kcG9pbnQsIHNvCisJICogZG9uJ3QgYm90aGVyIGZvciBpZiB0aGlzIGlzIGEgdGVtcG9yYXJ5IGFzc29jaWF0aW9uLgorCSAqLworCWlmICghYXNvYy0+dGVtcCkgeworCQlsaXN0X2RlbCgmYXNvYy0+YXNvY3MpOwogCi0JLyogRGVjcmVtZW50IHRoZSBiYWNrbG9nIHZhbHVlIGZvciBhIFRDUC1zdHlsZSBsaXN0ZW5pbmcgc29ja2V0LiAqLwotCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApICYmIHNjdHBfc3N0YXRlKHNrLCBMSVNURU5JTkcpKQotCQlzay0+c2tfYWNrX2JhY2tsb2ctLTsKKwkJLyogRGVjcmVtZW50IHRoZSBiYWNrbG9nIHZhbHVlIGZvciBhIFRDUC1zdHlsZSBsaXN0ZW5pbmcKKwkJICogc29ja2V0LgorCQkgKi8KKwkJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkgJiYgc2N0cF9zc3RhdGUoc2ssIExJU1RFTklORykpCisJCQlzay0+c2tfYWNrX2JhY2tsb2ctLTsKKwl9CiAKIAkvKiBNYXJrIGFzIGRlYWQsIHNvIG90aGVyIHVzZXJzIGNhbiBrbm93IHRoaXMgc3RydWN0dXJlIGlzCiAJICogZ29pbmcgYXdheS4KQEAgLTQ4MSw3ICs0ODcsNyBAQAogCQkJCSAiIHBvcnQ6ICVkXG4iLAogCQkJCSBhc29jLAogCQkJCSAoJnBlZXItPmlwYWRkciksCi0JCQkJIHBlZXItPmlwYWRkci52NC5zaW5fcG9ydCk7CisJCQkJIG50b2hzKHBlZXItPmlwYWRkci52NC5zaW5fcG9ydCkpOwogCiAJLyogSWYgd2UgYXJlIHRvIHJlbW92ZSB0aGUgY3VycmVudCByZXRyYW5fcGF0aCwgdXBkYXRlIGl0CiAJICogdG8gdGhlIG5leHQgcGVlciBiZWZvcmUgcmVtb3ZpbmcgdGhpcyBwZWVyIGZyb20gdGhlIGxpc3QuCkBAIC01MzAsMTMgKzUzNiwxMyBAQAogCXNwID0gc2N0cF9zayhhc29jLT5iYXNlLnNrKTsKIAogCS8qIEFGX0lORVQgYW5kIEFGX0lORVQ2IHNoYXJlIGNvbW1vbiBwb3J0IGZpZWxkLiAqLwotCXBvcnQgPSBhZGRyLT52NC5zaW5fcG9ydDsKKwlwb3J0ID0gbnRvaHMoYWRkci0+djQuc2luX3BvcnQpOwogCiAJU0NUUF9ERUJVR19QUklOVEtfSVBBRERSKCJzY3RwX2Fzc29jX2FkZF9wZWVyOmFzc29jaWF0aW9uICVwIGFkZHI6ICIsCiAJCQkJICIgcG9ydDogJWQgc3RhdGU6JWRcbiIsCiAJCQkJIGFzb2MsCiAJCQkJIGFkZHIsCi0JCQkJIGFkZHItPnY0LnNpbl9wb3J0LAorCQkJCSBwb3J0LAogCQkJCSBwZWVyX3N0YXRlKTsKIAogCS8qIFNldCB0aGUgcG9ydCBpZiBpdCBoYXMgbm90IGJlZW4gc2V0IHlldC4gICovCkBAIC03MDIsNiArNzA4LDcgQEAKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKmZpcnN0OwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2Vjb25kOwogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlpbnQgc3BjX3N0YXRlID0gMDsKIApAQCAtNzI0LDggKzczMSw5IEBACiAJLyogR2VuZXJhdGUgYW5kIHNlbmQgYSBTQ1RQX1BFRVJfQUREUl9DSEFOR0Ugbm90aWZpY2F0aW9uIHRvIHRoZQogCSAqIHVzZXIuCiAJICovCi0JZXZlbnQgPSBzY3RwX3VscGV2ZW50X21ha2VfcGVlcl9hZGRyX2NoYW5nZShhc29jLAotCQkJCShzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKSAmdHJhbnNwb3J0LT5pcGFkZHIsCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKTsKKwltZW1jcHkoJmFkZHIsICZ0cmFuc3BvcnQtPmlwYWRkciwgdHJhbnNwb3J0LT5hZl9zcGVjaWZpYy0+c29ja2FkZHJfbGVuKTsKKwlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9wZWVyX2FkZHJfY2hhbmdlKGFzb2MsICZhZGRyLAogCQkJCTAsIHNwY19zdGF0ZSwgZXJyb3IsIEdGUF9BVE9NSUMpOwogCWlmIChldmVudCkKIAkJc2N0cF91bHBxX3RhaWxfZXZlbnQoJmFzb2MtPnVscHEsIGV2ZW50KTsKQEAgLTg2MSw3ICs4NjksNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqcG9zOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKLQlfX3UzMiBrZXkgPSBodG9ubCh0c24pOworCV9fYmUzMiBrZXkgPSBodG9ubCh0c24pOwogCiAJbWF0Y2ggPSBOVUxMOwogCkBAIC05MTksOCArOTI3LDggQEAKIAogCXNjdHBfcmVhZF9sb2NrKCZhc29jLT5iYXNlLmFkZHJfbG9jayk7CiAKLQlpZiAoKGFzb2MtPmJhc2UuYmluZF9hZGRyLnBvcnQgPT0gbGFkZHItPnY0LnNpbl9wb3J0KSAmJgotCSAgICAoYXNvYy0+cGVlci5wb3J0ID09IHBhZGRyLT52NC5zaW5fcG9ydCkpIHsKKwlpZiAoKGh0b25zKGFzb2MtPmJhc2UuYmluZF9hZGRyLnBvcnQpID09IGxhZGRyLT52NC5zaW5fcG9ydCkgJiYKKwkgICAgKGh0b25zKGFzb2MtPnBlZXIucG9ydCkgPT0gcGFkZHItPnY0LnNpbl9wb3J0KSkgewogCQl0cmFuc3BvcnQgPSBzY3RwX2Fzc29jX2xvb2t1cF9wYWRkcihhc29jLCBwYWRkcik7CiAJCWlmICghdHJhbnNwb3J0KQogCQkJZ290byBvdXQ7CkBAIC05MzcsOCArOTQ1LDExIEBACiB9CiAKIC8qIERvIGRlbGF5ZWQgaW5wdXQgcHJvY2Vzc2luZy4gIFRoaXMgaXMgc2NoZWR1bGVkIGJ5IHNjdHBfcmN2KCkuICovCi1zdGF0aWMgdm9pZCBzY3RwX2Fzc29jX2JoX3JjdihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKK3N0YXRpYyB2b2lkIHNjdHBfYXNzb2NfYmhfcmN2KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwKKwkJCSAgICAgYmFzZS5pbnF1ZXVlLmltbWVkaWF0ZSk7CiAJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOwogCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKIAlzdHJ1Y3Qgc29jayAqc2s7CkBAIC0xMTI4LDcgKzExMzksNyBAQAogCQkJCSAiIHBvcnQ6ICVkXG4iLAogCQkJCSBhc29jLAogCQkJCSAoJnQtPmlwYWRkciksCi0JCQkJIHQtPmlwYWRkci52NC5zaW5fcG9ydCk7CisJCQkJIG50b2hzKHQtPmlwYWRkci52NC5zaW5fcG9ydCkpOwogfQogCiAvKiBDaG9vc2UgdGhlIHRyYW5zcG9ydCBmb3Igc2VuZGluZyBhIElOSVQgcGFja2V0LiAgKi8KQEAgLTExNTMsNyArMTE2NCw3IEBACiAJCQkJICIgcG9ydDogJWRcbiIsCiAJCQkJIGFzb2MsCiAJCQkJICgmdC0+aXBhZGRyKSwKLQkJCQkgdC0+aXBhZGRyLnY0LnNpbl9wb3J0KTsKKwkJCQkgbnRvaHModC0+aXBhZGRyLnY0LnNpbl9wb3J0KSk7CiAKIAlyZXR1cm4gdDsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2JpbmRfYWRkci5jIGIvbmV0L3NjdHAvYmluZF9hZGRyLmMKaW5kZXggMmI5YzEyYS4uMDA5OTQxNSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYmluZF9hZGRyLmMKKysrIGIvbmV0L3NjdHAvYmluZF9hZGRyLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCSAqIEJvdGggdjQgYW5kIHY2IGhhdmUgdGhlIHBvcnQgYXQgdGhlIHNhbWUgb2Zmc2V0LgogCSAqLwogCWlmICghYWRkci0+YS52NC5zaW5fcG9ydCkKLQkJYWRkci0+YS52NC5zaW5fcG9ydCA9IGJwLT5wb3J0OworCQlhZGRyLT5hLnY0LnNpbl9wb3J0ID0gaHRvbnMoYnAtPnBvcnQpOwogCiAJYWRkci0+dXNlX2FzX3NyYyA9IHVzZV9hc19zcmM7CiAKQEAgLTI3NSw3ICsyNzUsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlhZi0+ZnJvbV9hZGRyX3BhcmFtKCZhZGRyLCByYXdhZGRyLCBwb3J0LCAwKTsKKwkJYWYtPmZyb21fYWRkcl9wYXJhbSgmYWRkciwgcmF3YWRkciwgaHRvbnMocG9ydCksIDApOwogCQlyZXR2YWwgPSBzY3RwX2FkZF9iaW5kX2FkZHIoYnAsICZhZGRyLCAxLCBnZnApOwogCQlpZiAocmV0dmFsKSB7CiAJCQkvKiBDYW4ndCBmaW5pc2ggYnVpbGRpbmcgdGhlIGxpc3QsIGNsZWFuIHVwLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYyBiL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKaW5kZXggMzVjNDlmZi4uMTI5NzU2OSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYworKysgYi9uZXQvc2N0cC9lbmRwb2ludG9sYS5jCkBAIC02MSw3ICs2MSw3IEBACiAjaW5jbHVkZSA8bmV0L3NjdHAvc20uaD4KIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIGludGVybmFsIGhlbHBlcnMuICovCi1zdGF0aWMgdm9pZCBzY3RwX2VuZHBvaW50X2JoX3JjdihzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXApOworc3RhdGljIHZvaWQgc2N0cF9lbmRwb2ludF9iaF9yY3Yoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyoKICAqIEluaXRpYWxpemUgdGhlIGJhc2UgZmllbGRzIG9mIHRoZSBlbmRwb2ludCBzdHJ1Y3R1cmUuCkBAIC03Miw2ICs3MiwxMCBAQAogewogCW1lbXNldChlcCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX2VuZHBvaW50KSk7CiAKKwllcC0+ZGlnZXN0ID0ga3phbGxvYyhTQ1RQX1NJR05BVFVSRV9TSVpFLCBnZnApOworCWlmICghZXAtPmRpZ2VzdCkKKwkJcmV0dXJuIE5VTEw7CisKIAkvKiBJbml0aWFsaXplIHRoZSBiYXNlIHN0cnVjdHVyZS4gKi8KIAkvKiBXaGF0IHR5cGUgb2YgZW5kcG9pbnQgYXJlIHdlPyAgKi8KIAllcC0+YmFzZS50eXBlID0gU0NUUF9FUF9UWVBFX1NPQ0tFVDsKQEAgLTg1LDggKzg5LDcgQEAKIAlzY3RwX2lucV9pbml0KCZlcC0+YmFzZS5pbnF1ZXVlKTsKIAogCS8qIFNldCBpdHMgdG9wLWhhbGYgaGFuZGxlciAqLwotCXNjdHBfaW5xX3NldF90aF9oYW5kbGVyKCZlcC0+YmFzZS5pbnF1ZXVlLAotCQkJCSh2b2lkICgqKSh2b2lkICopKXNjdHBfZW5kcG9pbnRfYmhfcmN2LCBlcCk7CisJc2N0cF9pbnFfc2V0X3RoX2hhbmRsZXIoJmVwLT5iYXNlLmlucXVldWUsIHNjdHBfZW5kcG9pbnRfYmhfcmN2KTsKIAogCS8qIEluaXRpYWxpemUgdGhlIGJpbmQgYWRkciBhcmVhICovCiAJc2N0cF9iaW5kX2FkZHJfaW5pdCgmZXAtPmJhc2UuYmluZF9hZGRyLCAwKTsKQEAgLTE0NCw2ICsxNDcsMTMgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBlcC0+YmFzZS5zazsKIAorCS8qIElmIHRoaXMgaXMgYSB0ZW1wb3JhcnkgYXNzb2NpYXRpb24sIGRvbid0IGJvdGhlcgorCSAqIHNpbmNlIHdlJ2xsIGJlIHJlbW92aW5nIGl0IHNob3J0bHkgYW5kIGRvbid0CisJICogd2FudCBhbnlvbmUgdG8gZmluZCBpdCBhbnl3YXkuCisJICovCisJaWYgKGFzb2MtPnRlbXApCisJCXJldHVybjsKKwogCS8qIE5vdyBqdXN0IGFkZCBpdCB0byBvdXIgbGlzdCBvZiBhc29jcyAqLwogCWxpc3RfYWRkX3RhaWwoJmFzb2MtPmFzb2NzLCAmZXAtPmFzb2NzKTsKIApAQCAtMTc1LDYgKzE4NSw5IEBACiAJLyogRnJlZSB1cCB0aGUgSE1BQyB0cmFuc2Zvcm0uICovCiAJY3J5cHRvX2ZyZWVfaGFzaChzY3RwX3NrKGVwLT5iYXNlLnNrKS0+aG1hYyk7CiAKKwkvKiBGcmVlIHRoZSBkaWdlc3QgYnVmZmVyICovCisJa2ZyZWUoZXAtPmRpZ2VzdCk7CisKIAkvKiBDbGVhbnVwLiAqLwogCXNjdHBfaW5xX2ZyZWUoJmVwLT5iYXNlLmlucXVldWUpOwogCXNjdHBfYmluZF9hZGRyX2ZyZWUoJmVwLT5iYXNlLmJpbmRfYWRkcik7CkBAIC0yMTYsNyArMjI5LDcgQEAKIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqcmV0dmFsOwogCiAJc2N0cF9yZWFkX2xvY2soJmVwLT5iYXNlLmFkZHJfbG9jayk7Ci0JaWYgKGVwLT5iYXNlLmJpbmRfYWRkci5wb3J0ID09IGxhZGRyLT52NC5zaW5fcG9ydCkgeworCWlmIChodG9ucyhlcC0+YmFzZS5iaW5kX2FkZHIucG9ydCkgPT0gbGFkZHItPnY0LnNpbl9wb3J0KSB7CiAJCWlmIChzY3RwX2JpbmRfYWRkcl9tYXRjaCgmZXAtPmJhc2UuYmluZF9hZGRyLCBsYWRkciwKIAkJCQkJIHNjdHBfc2soZXAtPmJhc2Uuc2spKSkgewogCQkJcmV0dmFsID0gZXA7CkBAIC0yNDQsNyArMjU3LDcgQEAKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAKLQlycG9ydCA9IHBhZGRyLT52NC5zaW5fcG9ydDsKKwlycG9ydCA9IG50b2hzKHBhZGRyLT52NC5zaW5fcG9ydCk7CiAKIAlsaXN0X2Zvcl9lYWNoKHBvcywgJmVwLT5hc29jcykgewogCQlhc29jID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uLCBhc29jcyk7CkBAIC0zMDQsOCArMzE3LDExIEBACiAvKiBEbyBkZWxheWVkIGlucHV0IHByb2Nlc3NpbmcuICBUaGlzIGlzIHNjaGVkdWxlZCBieSBzY3RwX3JjdigpLgogICogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIEJIIG9yIHRhc2sgdGltZS4KICAqLwotc3RhdGljIHZvaWQgc2N0cF9lbmRwb2ludF9iaF9yY3Yoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwKQorc3RhdGljIHZvaWQgc2N0cF9lbmRwb2ludF9iaF9yY3Yoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCwKKwkJCSAgICAgYmFzZS5pbnF1ZXVlLmltbWVkaWF0ZSk7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaW5wdXQuYyBiL25ldC9zY3RwL2lucHV0LmMKaW5kZXggNjRmNjMwMS4uMzMxMTE4NyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaW5wdXQuYworKysgYi9uZXQvc2N0cC9pbnB1dC5jCkBAIC0xMzUsNiArMTM1LDkgQEAKIAogCVNDVFBfSU5DX1NUQVRTX0JIKFNDVFBfTUlCX0lOU0NUUFBBQ0tTKTsKIAorCWlmIChza2JfbGluZWFyaXplKHNrYikpCisJCWdvdG8gZGlzY2FyZF9pdDsKKwogCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CiAKIAkvKiBQdWxsIHVwIHRoZSBJUCBhbmQgU0NUUCBoZWFkZXJzLiAqLwpAQCAtNzIzLDcgKzcyNiw3IEBACiAJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwOwogCWludCBoYXNoOwogCi0JaGFzaCA9IHNjdHBfZXBfaGFzaGZuKGxhZGRyLT52NC5zaW5fcG9ydCk7CisJaGFzaCA9IHNjdHBfZXBfaGFzaGZuKG50b2hzKGxhZGRyLT52NC5zaW5fcG9ydCkpOwogCWhlYWQgPSAmc2N0cF9lcF9oYXNodGFibGVbaGFzaF07CiAJcmVhZF9sb2NrKCZoZWFkLT5sb2NrKTsKIAlmb3IgKGVwYiA9IGhlYWQtPmNoYWluOyBlcGI7IGVwYiA9IGVwYi0+bmV4dCkgewpAQCAtNzY4LDYgKzc3MSw5IEBACiAvKiBBZGQgYW4gYXNzb2NpYXRpb24gdG8gdGhlIGhhc2guIExvY2FsIEJILXNhZmUuICovCiB2b2lkIHNjdHBfaGFzaF9lc3RhYmxpc2hlZChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKIHsKKwlpZiAoYXNvYy0+dGVtcCkKKwkJcmV0dXJuOworCiAJc2N0cF9sb2NhbF9iaF9kaXNhYmxlKCk7CiAJX19zY3RwX2hhc2hfZXN0YWJsaXNoZWQoYXNvYyk7CiAJc2N0cF9sb2NhbF9iaF9lbmFibGUoKTsKQEAgLTgwMSw2ICs4MDcsOSBAQAogLyogUmVtb3ZlIGFzc29jaWF0aW9uIGZyb20gdGhlIGhhc2ggdGFibGUuICBMb2NhbCBCSC1zYWZlLiAqLwogdm9pZCBzY3RwX3VuaGFzaF9lc3RhYmxpc2hlZChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYykKIHsKKwlpZiAoYXNvYy0+dGVtcCkKKwkJcmV0dXJuOworCiAJc2N0cF9sb2NhbF9iaF9kaXNhYmxlKCk7CiAJX19zY3RwX3VuaGFzaF9lc3RhYmxpc2hlZChhc29jKTsKIAlzY3RwX2xvY2FsX2JoX2VuYWJsZSgpOwpAQCAtODIxLDcgKzgzMCw3IEBACiAJLyogT3B0aW1pemUgaGVyZSBmb3IgZGlyZWN0IGhpdCwgb25seSBsaXN0ZW5pbmcgY29ubmVjdGlvbnMgY2FuCiAJICogaGF2ZSB3aWxkY2FyZHMgYW55d2F5cy4KIAkgKi8KLQloYXNoID0gc2N0cF9hc3NvY19oYXNoZm4obG9jYWwtPnY0LnNpbl9wb3J0LCBwZWVyLT52NC5zaW5fcG9ydCk7CisJaGFzaCA9IHNjdHBfYXNzb2NfaGFzaGZuKG50b2hzKGxvY2FsLT52NC5zaW5fcG9ydCksIG50b2hzKHBlZXItPnY0LnNpbl9wb3J0KSk7CiAJaGVhZCA9ICZzY3RwX2Fzc29jX2hhc2h0YWJsZVtoYXNoXTsKIAlyZWFkX2xvY2soJmhlYWQtPmxvY2spOwogCWZvciAoZXBiID0gaGVhZC0+Y2hhaW47IGVwYjsgZXBiID0gZXBiLT5uZXh0KSB7CkBAIC05NDgsNyArOTU3LDcgQEAKIAkJaWYgKCFhZikKIAkJCWNvbnRpbnVlOwogCi0JCWFmLT5mcm9tX2FkZHJfcGFyYW0ocGFkZHIsIHBhcmFtcy5hZGRyLCBudG9ocyhzaC0+c291cmNlKSwgMCk7CisJCWFmLT5mcm9tX2FkZHJfcGFyYW0ocGFkZHIsIHBhcmFtcy5hZGRyLCBzaC0+c291cmNlLCAwKTsKIAogCQlhc29jID0gX19zY3RwX2xvb2t1cF9hc3NvY2lhdGlvbihsYWRkciwgcGFkZHIsICZ0cmFuc3BvcnQpOwogCQlpZiAoYXNvYykKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucXVldWUuYyBiL25ldC9zY3RwL2lucXVldWUuYwppbmRleCBjZjZkZWVkLi43MWIwNzQ2IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvaW5xdWV1ZS5jCkBAIC01NCw3ICs1NCw3IEBACiAJcXVldWUtPmluX3Byb2dyZXNzID0gTlVMTDsKIAogCS8qIENyZWF0ZSBhIHRhc2sgZm9yIGRlbGl2ZXJpbmcgZGF0YS4gICovCi0JSU5JVF9XT1JLKCZxdWV1ZS0+aW1tZWRpYXRlLCBOVUxMLCBOVUxMKTsKKwlJTklUX1dPUksoJnF1ZXVlLT5pbW1lZGlhdGUsIE5VTEwpOwogCiAJcXVldWUtPm1hbGxvY2VkID0gMDsKIH0KQEAgLTk3LDcgKzk3LDcgQEAKIAkgKiBvbiB0aGUgQkggcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMuCiAJICovCiAJbGlzdF9hZGRfdGFpbCgmY2h1bmstPmxpc3QsICZxLT5pbl9jaHVua19saXN0KTsKLQlxLT5pbW1lZGlhdGUuZnVuYyhxLT5pbW1lZGlhdGUuZGF0YSk7CisJcS0+aW1tZWRpYXRlLmZ1bmMoJnEtPmltbWVkaWF0ZSk7CiB9CiAKIC8qIEV4dHJhY3QgYSBjaHVuayBmcm9tIGFuIFNDVFAgaW5xdWV1ZS4KQEAgLTIwNSw5ICsyMDUsOCBAQAogICogVGhlIGludGVudCBpcyB0aGF0IHRoaXMgcm91dGluZSB3aWxsIHB1bGwgc3R1ZmYgb3V0IG9mIHRoZQogICogaW5xdWV1ZSBhbmQgcHJvY2VzcyBpdC4KICAqLwotdm9pZCBzY3RwX2lucV9zZXRfdGhfaGFuZGxlcihzdHJ1Y3Qgc2N0cF9pbnEgKnEsCi0JCQkJIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqYXJnKQordm9pZCBzY3RwX2lucV9zZXRfdGhfaGFuZGxlcihzdHJ1Y3Qgc2N0cF9pbnEgKnEsIHdvcmtfZnVuY190IGNhbGxiYWNrKQogewotCUlOSVRfV09SSygmcS0+aW1tZWRpYXRlLCBjYWxsYmFjaywgYXJnKTsKKwlJTklUX1dPUksoJnEtPmltbWVkaWF0ZSwgY2FsbGJhY2spOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggMjQ5ZTUwMy4uZDhkMzZkZSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtNzgsMTMgKzc4LDQ5IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisvKiBFdmVudCBoYW5kbGVyIGZvciBpbmV0NiBhZGRyZXNzIGFkZGl0aW9uL2RlbGV0aW9uIGV2ZW50cy4gICovCitpbnQgc2N0cF9pbmV0NmFkZHJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyKQoreworCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYSA9IChzdHJ1Y3QgaW5ldDZfaWZhZGRyICopcHRyOworCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CisKKwlzd2l0Y2ggKGV2KSB7CisJY2FzZSBORVRERVZfVVA6CisJCWFkZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSksIEdGUF9BVE9NSUMpOworCQlpZiAoYWRkcikgeworCQkJYWRkci0+YS52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJYWRkci0+YS52Ni5zaW42X3BvcnQgPSAwOworCQkJbWVtY3B5KCZhZGRyLT5hLnY2LnNpbjZfYWRkciwgJmlmYS0+YWRkciwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJYWRkci0+YS52Ni5zaW42X3Njb3BlX2lkID0gaWZhLT5pZGV2LT5kZXYtPmlmaW5kZXg7CisJCQlsaXN0X2FkZF90YWlsKCZhZGRyLT5saXN0LCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpOworCQl9CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0RPV046CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZzY3RwX2xvY2FsX2FkZHJfbGlzdCkgeworCQkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CisJCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZhZGRyLT5hLnY2LnNpbjZfYWRkciwgJmlmYS0+YWRkcikpIHsKKwkJCQlsaXN0X2RlbChwb3MpOworCQkJCWtmcmVlKGFkZHIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNjdHBfaW5ldDZhZGRyX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gc2N0cF9pbmV0YWRkcl9ldmVudCwKKwkubm90aWZpZXJfY2FsbCA9IHNjdHBfaW5ldDZhZGRyX2V2ZW50LAogfTsKIAogLyogSUNNUCBlcnJvciBoYW5kbGVyLiAqLwogU0NUUF9TVEFUSUMgdm9pZCBzY3RwX3Y2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKLQkJCSAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQorCQkJICAgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fYmUzMiBpbmZvKQogewogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAJc3RydWN0IGlwdjZoZHIgKmlwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKXNrYi0+ZGF0YTsKQEAgLTE3MCw4ICsyMDYsNiBAQAogCQlmbC5vaWYgPSB0cmFuc3BvcnQtPnNhZGRyLnY2LnNpbjZfc2NvcGVfaWQ7CiAJZWxzZQogCQlmbC5vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwotCWZsLmZsX2lwX3Nwb3J0ID0gaW5ldF9zayhzayktPnNwb3J0OwotCWZsLmZsX2lwX2Rwb3J0ID0gdHJhbnNwb3J0LT5pcGFkZHIudjYuc2luNl9wb3J0OwogCiAJaWYgKG5wLT5vcHQgJiYgbnAtPm9wdC0+c3JjcnQpIHsKIAkJc3RydWN0IHJ0MF9oZHIgKnJ0MCA9IChzdHJ1Y3QgcnQwX2hkciAqKSBucC0+b3B0LT5zcmNydDsKQEAgLTIxNSwxNyArMjQ5LDE3IEBACiAJfQogCiAJZHN0ID0gaXA2X3JvdXRlX291dHB1dChOVUxMLCAmZmwpOwotCWlmIChkc3QpIHsKKwlpZiAoIWRzdC0+ZXJyb3IpIHsKIAkJc3RydWN0IHJ0Nl9pbmZvICpydDsKIAkJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopZHN0OwogCQlTQ1RQX0RFQlVHX1BSSU5USygKIAkJCSJydDZfZHN0OiIgTklQNl9GTVQgIiBydDZfc3JjOiIgTklQNl9GTVQgIlxuIiwKIAkJCU5JUDYocnQtPnJ0NmlfZHN0LmFkZHIpLCBOSVA2KHJ0LT5ydDZpX3NyYy5hZGRyKSk7Ci0JfSBlbHNlIHsKLQkJU0NUUF9ERUJVR19QUklOVEsoIk5PIFJPVVRFXG4iKTsKKwkJcmV0dXJuIGRzdDsKIAl9Ci0KLQlyZXR1cm4gZHN0OworCVNDVFBfREVCVUdfUFJJTlRLKCJOTyBST1VURVxuIik7CisJZHN0X3JlbGVhc2UoZHN0KTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGluaXRpYWwgYml0cyB0aGF0IG1hdGNoIGluIHRoZSAyIGlwdjYKQEAgLTIzOSw3ICsyNzMsNyBAQAogCWludCBpLCBqOwogCiAJZm9yIChpID0gMDsgaSA8IDQgOyBpKyspIHsKLQkJX191MzIgYTF4b3JhMjsKKwkJX19iZTMyIGExeG9yYTI7CiAKIAkJYTF4b3JhMiA9IGExLT5zNl9hZGRyMzJbaV0gXiBhMi0+czZfYWRkcjMyW2ldOwogCkBAIC0zNTAsNyArMzg0LDcgQEAKIAkJCSAgICAgaW50IGlzX3NhZGRyKQogewogCXZvaWQgKmZyb207Ci0JX191MTYgKnBvcnQ7CisJX19iZTE2ICpwb3J0OwogCXN0cnVjdCBzY3RwaGRyICpzaDsKIAogCXBvcnQgPSAmYWRkci0+djYuc2luNl9wb3J0OwpAQCAtMzYwLDEwICszOTQsMTAgQEAKIAogCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CiAJaWYgKGlzX3NhZGRyKSB7Ci0JCSpwb3J0ICA9IG50b2hzKHNoLT5zb3VyY2UpOworCQkqcG9ydCAgPSBzaC0+c291cmNlOwogCQlmcm9tID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOwogCX0gZWxzZSB7Ci0JCSpwb3J0ID0gbnRvaHMoc2gtPmRlc3QpOworCQkqcG9ydCA9IHNoLT5kZXN0OwogCQlmcm9tID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOwogCX0KIAlpcHY2X2FkZHJfY29weSgmYWRkci0+djYuc2luNl9hZGRyLCBmcm9tKTsKQEAgLTM3Myw3ICs0MDcsNyBAQAogc3RhdGljIHZvaWQgc2N0cF92Nl9mcm9tX3NrKHVuaW9uIHNjdHBfYWRkciAqYWRkciwgc3RydWN0IHNvY2sgKnNrKQogewogCWFkZHItPnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7Ci0JYWRkci0+djYuc2luNl9wb3J0ID0gaW5ldF9zayhzayktPm51bTsKKwlhZGRyLT52Ni5zaW42X3BvcnQgPSAwOwogCWFkZHItPnY2LnNpbjZfYWRkciA9IGluZXQ2X3NrKHNrKS0+cmN2X3NhZGRyOwogfQogCkBAIC00MDcsNyArNDQxLDcgQEAKIC8qIEluaXRpYWxpemUgYSBzY3RwX2FkZHIgZnJvbSBhbiBhZGRyZXNzIHBhcmFtZXRlci4gKi8KIHN0YXRpYyB2b2lkIHNjdHBfdjZfZnJvbV9hZGRyX3BhcmFtKHVuaW9uIHNjdHBfYWRkciAqYWRkciwKIAkJCQkgICAgdW5pb24gc2N0cF9hZGRyX3BhcmFtICpwYXJhbSwKLQkJCQkgICAgX191MTYgcG9ydCwgaW50IGlpZikKKwkJCQkgICAgX19iZTE2IHBvcnQsIGludCBpaWYpCiB7CiAJYWRkci0+djYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAlhZGRyLT52Ni5zaW42X3BvcnQgPSBwb3J0OwpAQCAtNDI1LDcgKzQ1OSw3IEBACiAJaW50IGxlbmd0aCA9IHNpemVvZihzY3RwX2lwdjZhZGRyX3BhcmFtX3QpOwogCiAJcGFyYW0tPnY2LnBhcmFtX2hkci50eXBlID0gU0NUUF9QQVJBTV9JUFY2X0FERFJFU1M7Ci0JcGFyYW0tPnY2LnBhcmFtX2hkci5sZW5ndGggPSBudG9ocyhsZW5ndGgpOworCXBhcmFtLT52Ni5wYXJhbV9oZHIubGVuZ3RoID0gaHRvbnMobGVuZ3RoKTsKIAlpcHY2X2FkZHJfY29weSgmcGFyYW0tPnY2LmFkZHIsICZhZGRyLT52Ni5zaW42X2FkZHIpOwogCiAJcmV0dXJuIGxlbmd0aDsKQEAgLTQzMyw3ICs0NjcsNyBAQAogCiAvKiBJbml0aWFsaXplIGEgc2N0cF9hZGRyIGZyb20gYSBkc3RfZW50cnkuICovCiBzdGF0aWMgdm9pZCBzY3RwX3Y2X2RzdF9zYWRkcih1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKLQkJCSAgICAgIHVuc2lnbmVkIHNob3J0IHBvcnQpCisJCQkgICAgICBfX2JlMTYgcG9ydCkKIHsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKWRzdDsKIAlhZGRyLT5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUNjsKQEAgLTQ4MCw3ICs1MTQsNyBAQAogfQogCiAvKiBJbml0aWFsaXplIGFkZHIgc3RydWN0IHRvIElOQUREUl9BTlkuICovCi1zdGF0aWMgdm9pZCBzY3RwX3Y2X2luYWRkcl9hbnkodW5pb24gc2N0cF9hZGRyICphZGRyLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQorc3RhdGljIHZvaWQgc2N0cF92Nl9pbmFkZHJfYW55KHVuaW9uIHNjdHBfYWRkciAqYWRkciwgX19iZTE2IHBvcnQpCiB7CiAJbWVtc2V0KGFkZHIsIDB4MDAsIHNpemVvZih1bmlvbiBzY3RwX2FkZHIpKTsKIAlhZGRyLT52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwpAQCAtODU1LDcgKzg4OSw3IEBACiAgKiBSZXR1cm5zIG51bWJlciBvZiBhZGRyZXNzZXMgc3VwcG9ydGVkLgogICovCiBzdGF0aWMgaW50IHNjdHBfaW5ldDZfc3VwcG9ydGVkX2FkZHJzKGNvbnN0IHN0cnVjdCBzY3RwX3NvY2sgKm9wdCwKLQkJCQkgICAgICBfX3UxNiAqdHlwZXMpCisJCQkJICAgICAgX19iZTE2ICp0eXBlcykKIHsKIAl0eXBlc1swXSA9IFNDVFBfUEFSQU1fSVBWNF9BRERSRVNTOwogCXR5cGVzWzFdID0gU0NUUF9QQVJBTV9JUFY2X0FERFJFU1M7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCA3Mzk1ODI0Li5mYmE1NjdhIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTEwNjUsNyArMTA2NSw3IEBACiAJICogQSkgSW5pdGlhbGl6ZSB0aGUgY2FjY19zYXdfbmV3YWNrIHRvIDAgZm9yIGFsbCBkZXN0aW5hdGlvbgogCSAqIGFkZHJlc3Nlcy4KIAkgKi8KLQlpZiAoc2Fjay0+bnVtX2dhcF9hY2tfYmxvY2tzID4gMCAmJgorCWlmIChzYWNrLT5udW1fZ2FwX2Fja19ibG9ja3MgJiYKIAkgICAgcHJpbWFyeS0+Y2FjYy5jaGFuZ2VvdmVyX2FjdGl2ZSkgewogCQlsaXN0X2Zvcl9lYWNoKHBvcywgdHJhbnNwb3J0X2xpc3QpIHsKIAkJCXRyYW5zcG9ydCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsCkBAIC0xNjMyLDcgKzE2MzIsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBzY3RwX2dldF9za2lwX3BvcyhzdHJ1Y3Qgc2N0cF9md2R0c25fc2tpcCAqc2tpcGxpc3QsCi0JCQkJICAgIGludCBuc2tpcHMsIF9fdTE2IHN0cmVhbSkKKwkJCQkgICAgaW50IG5za2lwcywgX19iZTE2IHN0cmVhbSkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvYy5jIGIvbmV0L3NjdHAvcHJvYy5jCmluZGV4IDdmNDllNzYuLmIzNDkzYmQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Byb2MuYworKysgYi9uZXQvc2N0cC9wcm9jLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAJbGlzdF9mb3JfZWFjaChwb3MsICZlcGItPmJpbmRfYWRkci5hZGRyZXNzX2xpc3QpIHsKIAkJbGFkZHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIGxpc3QpOwotCQlhZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKSZsYWRkci0+YTsKKwkJYWRkciA9ICZsYWRkci0+YTsKIAkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT5zYS5zYV9mYW1pbHkpOwogCQlpZiAocHJpbWFyeSAmJiBhZi0+Y21wX2FkZHIoYWRkciwgcHJpbWFyeSkpIHsKIAkJCXNlcV9wcmludGYoc2VxLCAiKiIpOwpAQCAtMTc3LDEwICsxNzcsMTAgQEAKIAl1bmlvbiBzY3RwX2FkZHIgKmFkZHIsICpwcmltYXJ5OwogCXN0cnVjdCBzY3RwX2FmICphZjsKIAotCXByaW1hcnkgPSAmKGFzc29jLT5wZWVyLnByaW1hcnlfYWRkcik7CisJcHJpbWFyeSA9ICZhc3NvYy0+cGVlci5wcmltYXJ5X2FkZHI7CiAJbGlzdF9mb3JfZWFjaChwb3MsICZhc3NvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KSB7CiAJCXRyYW5zcG9ydCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsIHRyYW5zcG9ydHMpOwotCQlhZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKSZ0cmFuc3BvcnQtPmlwYWRkcjsKKwkJYWRkciA9ICZ0cmFuc3BvcnQtPmlwYWRkcjsKIAkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhhZGRyLT5zYS5zYV9mYW1pbHkpOwogCQlpZiAoYWYtPmNtcF9hZGRyKGFkZHIsIHByaW1hcnkpKSB7CiAJCQlzZXFfcHJpbnRmKHNlcSwgIioiKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Byb3RvY29sLmMgYi9uZXQvc2N0cC9wcm90b2NvbC5jCmluZGV4IGZhYzc2NzQuLjNhM2RiNTYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Byb3RvY29sLmMKKysrIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwpAQCAtNzksOCArNzksOCBAQAogc3RhdGljIHN0cnVjdCBzY3RwX2FmICpzY3RwX2FmX3Y0X3NwZWNpZmljOwogc3RhdGljIHN0cnVjdCBzY3RwX2FmICpzY3RwX2FmX3Y2X3NwZWNpZmljOwogCi1rbWVtX2NhY2hlX3QgKnNjdHBfY2h1bmtfY2FjaGVwIF9fcmVhZF9tb3N0bHk7Ci1rbWVtX2NhY2hlX3QgKnNjdHBfYnVja2V0X2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RydWN0IGttZW1fY2FjaGUgKnNjdHBfY2h1bmtfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3Qga21lbV9jYWNoZSAqc2N0cF9idWNrZXRfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKIC8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29udHJvbCBzb2NrLiAqLwogc3RydWN0IHNvY2sgKnNjdHBfZ2V0X2N0bF9zb2NrKHZvaWQpCkBAIC0xNjMsNyArMTYzLDcgQEAKIC8qIEV4dHJhY3Qgb3VyIElQIGFkZHJlc3NlcyBmcm9tIHRoZSBzeXN0ZW0gYW5kIHN0YXNoIHRoZW0gaW4gdGhlCiAgKiBwcm90b2NvbCBzdHJ1Y3R1cmUuCiAgKi8KLXN0YXRpYyB2b2lkIF9fc2N0cF9nZXRfbG9jYWxfYWRkcl9saXN0KHZvaWQpCitzdGF0aWMgdm9pZCBzY3RwX2dldF9sb2NhbF9hZGRyX2xpc3Qodm9pZCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKQEAgLTE3OSwxNyArMTc5LDggQEAKIAlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHNjdHBfZ2V0X2xvY2FsX2FkZHJfbGlzdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzY3RwX3NwaW5fbG9ja19pcnFzYXZlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOwotCV9fc2N0cF9nZXRfbG9jYWxfYWRkcl9saXN0KCk7Ci0Jc2N0cF9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOwotfQotCiAvKiBGcmVlIHRoZSBleGlzdGluZyBsb2NhbCBhZGRyZXNzZXMuICAqLwotc3RhdGljIHZvaWQgX19zY3RwX2ZyZWVfbG9jYWxfYWRkcl9saXN0KHZvaWQpCitzdGF0aWMgdm9pZCBzY3RwX2ZyZWVfbG9jYWxfYWRkcl9saXN0KHZvaWQpCiB7CiAJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKQEAgLTIwMSwyNyArMTkyLDE1IEBACiAJfQogfQogCi0vKiBGcmVlIHRoZSBleGlzdGluZyBsb2NhbCBhZGRyZXNzZXMuICAqLwotc3RhdGljIHZvaWQgc2N0cF9mcmVlX2xvY2FsX2FkZHJfbGlzdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzY3RwX3NwaW5fbG9ja19pcnFzYXZlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOwotCV9fc2N0cF9mcmVlX2xvY2FsX2FkZHJfbGlzdCgpOwotCXNjdHBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssIGZsYWdzKTsKLX0KLQogLyogQ29weSB0aGUgbG9jYWwgYWRkcmVzc2VzIHdoaWNoIGFyZSB2YWxpZCBmb3IgJ3Njb3BlJyBpbnRvICdicCcuICAqLwogaW50IHNjdHBfY29weV9sb2NhbF9hZGRyX2xpc3Qoc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwgc2N0cF9zY29wZV90IHNjb3BlLAogCQkJICAgICAgZ2ZwX3QgZ2ZwLCBpbnQgY29weV9mbGFncykKIHsKIAlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKIAlpbnQgZXJyb3IgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CiAKLQlzY3RwX3NwaW5fbG9ja19pcnFzYXZlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2gocG9zLCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpIHsKIAkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CiAJCWlmIChzY3RwX2luX3Njb3BlKCZhZGRyLT5hLCBzY29wZSkpIHsKIAkJCS8qIE5vdyB0aGF0IHRoZSBhZGRyZXNzIGlzIGluIHNjb3BlLCBjaGVjayB0byBzZWUgaWYKQEAgLTI0Miw3ICsyMjEsNiBAQAogCX0KIAogZW5kX2NvcHk6Ci0Jc2N0cF9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjUxLDcgKzIyOSw3IEBACiAJCQkgICAgIGludCBpc19zYWRkcikKIHsKIAl2b2lkICpmcm9tOwotCV9fdTE2ICpwb3J0OworCV9fYmUxNiAqcG9ydDsKIAlzdHJ1Y3Qgc2N0cGhkciAqc2g7CiAKIAlwb3J0ID0gJmFkZHItPnY0LnNpbl9wb3J0OwpAQCAtMjU5LDEwICsyMzcsMTAgQEAKIAogCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CiAJaWYgKGlzX3NhZGRyKSB7Ci0JCSpwb3J0ICA9IG50b2hzKHNoLT5zb3VyY2UpOworCQkqcG9ydCAgPSBzaC0+c291cmNlOwogCQlmcm9tID0gJnNrYi0+bmguaXBoLT5zYWRkcjsKIAl9IGVsc2UgewotCQkqcG9ydCA9IG50b2hzKHNoLT5kZXN0KTsKKwkJKnBvcnQgPSBzaC0+ZGVzdDsKIAkJZnJvbSA9ICZza2ItPm5oLmlwaC0+ZGFkZHI7CiAJfQogCW1lbWNweSgmYWRkci0+djQuc2luX2FkZHIuc19hZGRyLCBmcm9tLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKQEAgLTI3Miw3ICsyNTAsNyBAQAogc3RhdGljIHZvaWQgc2N0cF92NF9mcm9tX3NrKHVuaW9uIHNjdHBfYWRkciAqYWRkciwgc3RydWN0IHNvY2sgKnNrKQogewogCWFkZHItPnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCWFkZHItPnY0LnNpbl9wb3J0ID0gaW5ldF9zayhzayktPm51bTsKKwlhZGRyLT52NC5zaW5fcG9ydCA9IDA7CiAJYWRkci0+djQuc2luX2FkZHIuc19hZGRyID0gaW5ldF9zayhzayktPnJjdl9zYWRkcjsKIH0KIApAQCAtMjkxLDcgKzI2OSw3IEBACiAvKiBJbml0aWFsaXplIGEgc2N0cF9hZGRyIGZyb20gYW4gYWRkcmVzcyBwYXJhbWV0ZXIuICovCiBzdGF0aWMgdm9pZCBzY3RwX3Y0X2Zyb21fYWRkcl9wYXJhbSh1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCiAJCQkJICAgIHVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqcGFyYW0sCi0JCQkJICAgIF9fdTE2IHBvcnQsIGludCBpaWYpCisJCQkJICAgIF9fYmUxNiBwb3J0LCBpbnQgaWlmKQogewogCWFkZHItPnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogCWFkZHItPnY0LnNpbl9wb3J0ID0gcG9ydDsKQEAgLTMwNyw3ICsyODUsNyBAQAogCWludCBsZW5ndGggPSBzaXplb2Yoc2N0cF9pcHY0YWRkcl9wYXJhbV90KTsKIAogCXBhcmFtLT52NC5wYXJhbV9oZHIudHlwZSA9IFNDVFBfUEFSQU1fSVBWNF9BRERSRVNTOwotCXBhcmFtLT52NC5wYXJhbV9oZHIubGVuZ3RoID0gbnRvaHMobGVuZ3RoKTsKKwlwYXJhbS0+djQucGFyYW1faGRyLmxlbmd0aCA9IGh0b25zKGxlbmd0aCk7CiAJcGFyYW0tPnY0LmFkZHIuc19hZGRyID0gYWRkci0+djQuc2luX2FkZHIuc19hZGRyOwkKIAogCXJldHVybiBsZW5ndGg7CkBAIC0zMTUsNyArMjkzLDcgQEAKIAogLyogSW5pdGlhbGl6ZSBhIHNjdHBfYWRkciBmcm9tIGEgZHN0X2VudHJ5LiAqLwogc3RhdGljIHZvaWQgc2N0cF92NF9kc3Rfc2FkZHIodW5pb24gc2N0cF9hZGRyICpzYWRkciwgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAotCQkJICAgICAgdW5zaWduZWQgc2hvcnQgcG9ydCkKKwkJCSAgICAgIF9fYmUxNiBwb3J0KQogewogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilkc3Q7CiAJc2FkZHItPnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOwpAQCAtMzM4LDcgKzMxNiw3IEBACiB9CiAKIC8qIEluaXRpYWxpemUgYWRkciBzdHJ1Y3QgdG8gSU5BRERSX0FOWS4gKi8KLXN0YXRpYyB2b2lkIHNjdHBfdjRfaW5hZGRyX2FueSh1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIHVuc2lnbmVkIHNob3J0IHBvcnQpCitzdGF0aWMgdm9pZCBzY3RwX3Y0X2luYWRkcl9hbnkodW5pb24gc2N0cF9hZGRyICphZGRyLCBfX2JlMTYgcG9ydCkKIHsKIAlhZGRyLT52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKIAlhZGRyLT52NC5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwpAQCAtNDgxLDcgKzQ1OSw3IEBACiAJCQkJCSAgIGxpc3QpOwogCQkJaWYgKCFsYWRkci0+dXNlX2FzX3NyYykKIAkJCQljb250aW51ZTsKLQkJCXNjdHBfdjRfZHN0X3NhZGRyKCZkc3Rfc2FkZHIsIGRzdCwgYnAtPnBvcnQpOworCQkJc2N0cF92NF9kc3Rfc2FkZHIoJmRzdF9zYWRkciwgZHN0LCBodG9ucyhicC0+cG9ydCkpOwogCQkJaWYgKHNjdHBfdjRfY21wX2FkZHIoJmRzdF9zYWRkciwgJmxhZGRyLT5hKSkKIAkJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KQEAgLTUzOCw3ICs1MTYsNyBAQAogCiAJaWYgKHJ0KSB7CiAJCXNhZGRyLT52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2FkZHItPnY0LnNpbl9wb3J0ID0gYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydDsgIAorCQlzYWRkci0+djQuc2luX3BvcnQgPSBodG9ucyhhc29jLT5iYXNlLmJpbmRfYWRkci5wb3J0KTsKIAkJc2FkZHItPnY0LnNpbl9hZGRyLnNfYWRkciA9IHJ0LT5ydF9zcmM7IAogCX0KIH0KQEAgLTU5MSw3ICs1NjksNyBAQAogCW5ld2luZXQtPmRwb3J0ID0gaHRvbnMoYXNvYy0+cGVlci5wb3J0KTsKIAluZXdpbmV0LT5kYWRkciA9IGFzb2MtPnBlZXIucHJpbWFyeV9hZGRyLnY0LnNpbl9hZGRyLnNfYWRkcjsKIAluZXdpbmV0LT5wbXR1ZGlzYyA9IGluZXQtPnBtdHVkaXNjOwotICAgICAgCW5ld2luZXQtPmlkID0gMDsKKyAgICAgIAluZXdpbmV0LT5pZCA9IGFzb2MtPm5leHRfdHNuIF4gamlmZmllczsKIAogCW5ld2luZXQtPnVjX3R0bCA9IC0xOwogCW5ld2luZXQtPm1jX2xvb3AgPSAxOwpAQCAtNjIyLDE4ICs2MDAsMzYgQEAKIAlzZXFfcHJpbnRmKHNlcSwgIiVkLiVkLiVkLiVkICIsIE5JUFFVQUQoYWRkci0+djQuc2luX2FkZHIpKTsKIH0KIAotLyogRXZlbnQgaGFuZGxlciBmb3IgaW5ldCBhZGRyZXNzIGFkZGl0aW9uL2RlbGV0aW9uIGV2ZW50cy4KLSAqIEJhc2ljYWxseSwgd2hlbmV2ZXIgdGhlcmUgaXMgYW4gZXZlbnQsIHdlIHJlLWJ1aWxkIG91ciBsb2NhbCBhZGRyZXNzIGxpc3QuCi0gKi8KKy8qIEV2ZW50IGhhbmRsZXIgZm9yIGluZXQgYWRkcmVzcyBhZGRpdGlvbi9kZWxldGlvbiBldmVudHMuICAqLwogaW50IHNjdHBfaW5ldGFkZHJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2LAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGluX2lmYWRkciAqaWZhID0gKHN0cnVjdCBpbl9pZmFkZHIgKilwdHI7CisJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKIAotCXNjdHBfc3Bpbl9sb2NrX2lycXNhdmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7Ci0JX19zY3RwX2ZyZWVfbG9jYWxfYWRkcl9saXN0KCk7Ci0JX19zY3RwX2dldF9sb2NhbF9hZGRyX2xpc3QoKTsKLQlzY3RwX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7CisJc3dpdGNoIChldikgeworCWNhc2UgTkVUREVWX1VQOgorCQlhZGRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGFkZHIpIHsKKwkJCWFkZHItPmEudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlhZGRyLT5hLnY0LnNpbl9wb3J0ID0gMDsKKwkJCWFkZHItPmEudjQuc2luX2FkZHIuc19hZGRyID0gaWZhLT5pZmFfbG9jYWw7CisJCQlsaXN0X2FkZF90YWlsKCZhZGRyLT5saXN0LCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpOworCQl9CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0RPV046CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZzY3RwX2xvY2FsX2FkZHJfbGlzdCkgeworCQkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CisJCQlpZiAoYWRkci0+YS52NC5zaW5fYWRkci5zX2FkZHIgPT0gaWZhLT5pZmFfbG9jYWwpIHsKKwkJCQlsaXN0X2RlbChwb3MpOworCQkJCWtmcmVlKGFkZHIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisJfQogCiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQpAQCAtNzkxLDcgKzc4Nyw3IEBACiAgKiBjaHVua3MuICBSZXR1cm5zIG51bWJlciBvZiBhZGRyZXNzZXMgc3VwcG9ydGVkLgogICovCiBzdGF0aWMgaW50IHNjdHBfaW5ldF9zdXBwb3J0ZWRfYWRkcnMoY29uc3Qgc3RydWN0IHNjdHBfc29jayAqb3B0LAotCQkJCSAgICAgX191MTYgKnR5cGVzKQorCQkJCSAgICAgX19iZTE2ICp0eXBlcykKIHsKIAl0eXBlc1swXSA9IFNDVFBfUEFSQU1fSVBWNF9BRERSRVNTOwogCXJldHVybiAxOwpAQCAtODA4LDcgKzgwNCw3IEBACiAJCQkgIE5JUFFVQUQoKChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3QpLT5ydF9kc3QpKTsKIAogCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVFNDVFBQQUNLUyk7Ci0JcmV0dXJuIGlwX3F1ZXVlX3htaXQoc2tiLCBpcGZyYWdvayk7CisJcmV0dXJuIGlwX3F1ZXVlX3htaXQoc2tiLCBza2ItPnNrLCBpcGZyYWdvayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2N0cF9hZiBzY3RwX2lwdjRfc3BlY2lmaWM7CkBAIC0xMTcyLDEzICsxMTY4LDEyIEBACiAKIAkvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBhZGRyZXNzIGxpc3QuICovCiAJSU5JVF9MSVNUX0hFQUQoJnNjdHBfbG9jYWxfYWRkcl9saXN0KTsKLQlzcGluX2xvY2tfaW5pdCgmc2N0cF9sb2NhbF9hZGRyX2xvY2spOworCisJc2N0cF9nZXRfbG9jYWxfYWRkcl9saXN0KCk7CiAKIAkvKiBSZWdpc3RlciBub3RpZmllciBmb3IgaW5ldCBhZGRyZXNzIGFkZGl0aW9ucy9kZWxldGlvbnMuICovCiAJcmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJnNjdHBfaW5ldGFkZHJfbm90aWZpZXIpOwogCi0Jc2N0cF9nZXRfbG9jYWxfYWRkcl9saXN0KCk7Ci0KIAlfX3Vuc2FmZShUSElTX01PRFVMRSk7CiAJc3RhdHVzID0gMDsKIG91dDoKQEAgLTEyNjMsNiArMTI1OCw3IEBACiAgKiBfX3N0cmluZ2lmeSBkb2Vzbid0IGxpa2VzIGVudW1zLCBzbyB1c2UgSVBQUk9UT19TQ1RQIHZhbHVlICgxMzIpIGRpcmVjdGx5LgogICovCiBNT0RVTEVfQUxJQVMoIm5ldC1wZi0iIF9fc3RyaW5naWZ5KFBGX0lORVQpICItcHJvdG8tMTMyIik7CitNT0RVTEVfQUxJQVMoIm5ldC1wZi0iIF9fc3RyaW5naWZ5KFBGX0lORVQ2KSAiLXByb3RvLTEzMiIpOwogTU9EVUxFX0FVVEhPUigiTGludXggS2VybmVsIFNDVFAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciB0aGUgU0NUUCBwcm90b2NvbCAoUkZDMjk2MCkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwppbmRleCA1MDdkZmY3Li4zMDkyN2QzIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKKysrIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCkBAIC02NSw3ICs2NSw3IEBACiAjaW5jbHVkZSA8bmV0L3NjdHAvc2N0cC5oPgogI2luY2x1ZGUgPG5ldC9zY3RwL3NtLmg+CiAKLWV4dGVybiBrbWVtX2NhY2hlX3QgKnNjdHBfY2h1bmtfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpzY3RwX2NodW5rX2NhY2hlcDsKIAogU0NUUF9TVEFUSUMKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfY2h1bmsoY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCkBAIC0xMTEsNyArMTExLDcgQEAKICAqIHByb3ZpZGVkIGNodW5rLCBhcyBtb3N0IGNhdXNlIGNvZGVzIHdpbGwgYmUgZW1iZWRkZWQgaW5zaWRlIGFuCiAgKiBhYm9ydCBjaHVuay4KICAqLwotdm9pZCAgc2N0cF9pbml0X2NhdXNlKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgX191MTYgY2F1c2VfY29kZSwKK3ZvaWQgIHNjdHBfaW5pdF9jYXVzZShzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIF9fYmUxNiBjYXVzZV9jb2RlLAogCQkgICAgICBjb25zdCB2b2lkICpwYXlsb2FkLCBzaXplX3QgcGF5bGVuKQogewogCXNjdHBfZXJyaGRyX3QgZXJyOwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJaW50IG51bV90eXBlcywgYWRkcnNfbGVuID0gMDsKIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcDsKIAlzY3RwX3N1cHBvcnRlZF9hZGRyc19wYXJhbV90IHNhdDsKLQlfX3UxNiB0eXBlc1syXTsKKwlfX2JlMTYgdHlwZXNbMl07CiAJc2N0cF9hZGFwdGlvbl9pbmRfcGFyYW1fdCBhaXBhcmFtOwogCiAJLyogUkZDIDI5NjAgMy4zLjIgSW5pdGlhdGlvbiAoSU5JVCkgKDEpCkBAIC03NzUsNyArNzc1LDcgQEAKIAljb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIF9fdTMyIHRzbikKIHsKIAlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOwotCV9fdTMyIHBheWxvYWQ7CisJX19iZTMyIHBheWxvYWQ7CiAKIAlyZXR2YWwgPSBzY3RwX21ha2VfYWJvcnQoYXNvYywgY2h1bmssIHNpemVvZihzY3RwX2Vycmhkcl90KQogCQkJCSArIHNpemVvZih0c24pKTsKQEAgLTk1MSw3ICs5NTEsNyBAQAogLyogQ3JlYXRlIGFuIE9wZXJhdGlvbiBFcnJvciBjaHVuay4gICovCiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX29wX2Vycm9yKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJCSBjb25zdCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCQkJIF9fdTE2IGNhdXNlX2NvZGUsIGNvbnN0IHZvaWQgKnBheWxvYWQsCisJCQkJIF9fYmUxNiBjYXVzZV9jb2RlLCBjb25zdCB2b2lkICpwYXlsb2FkLAogCQkJCSBzaXplX3QgcGF5bGVuKQogewogCXN0cnVjdCBzY3RwX2NodW5rICpyZXR2YWw7CkBAIC05NzksNyArOTc5LDcgQEAKIHsKIAlzdHJ1Y3Qgc2N0cF9jaHVuayAqcmV0dmFsOwogCi0JcmV0dmFsID0ga21lbV9jYWNoZV9hbGxvYyhzY3RwX2NodW5rX2NhY2hlcCwgU0xBQl9BVE9NSUMpOworCXJldHZhbCA9IGttZW1fY2FjaGVfYWxsb2Moc2N0cF9jaHVua19jYWNoZXAsIEdGUF9BVE9NSUMpOwogCiAJaWYgKCFyZXR2YWwpCiAJCWdvdG8gbm9kYXRhOwpAQCAtMTE5MCwxNSArMTE5MCwxNCBAQAogCWlmIChjaHVuay0+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+bG93ZXN0X3RzbikpOworCQkJCVNDVFBfVTMyKGxvd2VzdF90c24pKTsKIAl9CiAJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQ09OU1VNRTsKIH0KQEAgLTMzNjAsNyArMzM2MSw3IEBACiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKIAkJCSAgICAgICAgU0NUUF9FUlJPUihFQ09OTkFCT1JURUQpKTsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCi0JCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9BU0NPTkZfQUNLKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfQVNDT05GX0FDSykpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CiAJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0FCT1JUOwpAQCAtMzM4OCw3ICszMzg5LDcgQEAKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAogCQkJICAgICAgICBTQ1RQX0VSUk9SKEVDT05OQUJPUlRFRCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX0FTQ09ORl9BQ0spKTsKKwkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9BU0NPTkZfQUNLKSk7CiAJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKIAkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKIAkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fQUJPUlQ7CkBAIC0zNzQzLDEyICszNzQ0LDEyIEBACiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKIAkJCQlTQ1RQX0VSUk9SKEVDT05OUkVGVVNFRCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0lOSVRfRkFJTEVELAotCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfUFJPVE9fVklPTEFUSU9OKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfUFJPVE9fVklPTEFUSU9OKSk7CiAJfSBlbHNlIHsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAogCQkJICAgICAgICBTQ1RQX0VSUk9SKEVDT05OQUJPUlRFRCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX1BST1RPX1ZJT0xBVElPTikpOworCQkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX1BST1RPX1ZJT0xBVElPTikpOwogCQlTQ1RQX0RFQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOwogCX0KIApAQCAtNDA2Miw3ICs0MDYzLDcgQEAKIAkJCVNDVFBfRVJST1IoRUNPTk5BQk9SVEVEKSk7CiAJLyogRGVsZXRlIHRoZSBlc3RhYmxpc2hlZCBhc3NvY2lhdGlvbi4gKi8KIAlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfVVNFUl9BQk9SVCkpOworCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfVVNFUl9BQk9SVCkpOwogCiAJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOwogCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CkBAIC00MTk5LDcgKzQyMDAsNyBAQAogCQkJU0NUUF9FUlJPUihFQ09OTlJFRlVTRUQpKTsKIAkvKiBEZWxldGUgdGhlIGVzdGFibGlzaGVkIGFzc29jaWF0aW9uLiAqLwogCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfSU5JVF9GQUlMRUQsCi0JCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX1VTRVJfQUJPUlQpKTsKKwkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX1VTRVJfQUJPUlQpKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC00NTcxLDcgKzQ1NzIsNyBAQAogCQkJCVNDVFBfRVJST1IoRVRJTUVET1VUKSk7CiAJCS8qIENNRF9BU1NPQ19GQUlMRUQgY2FsbHMgQ01EX0RFTEVURV9UQ0IuICovCiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfQVNTT0NfRkFJTEVELAotCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CiAJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAJCXJldHVybiBTQ1RQX0RJU1BPU0lUSU9OX0RFTEVURV9UQ0I7CkBAIC00NjkzLDcgKzQ2OTQsNyBAQAogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFVF9TS19FUlIsCiAJCQkJU0NUUF9FUlJPUihFVElNRURPVVQpKTsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9JTklUX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKIAkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKIAl9CiAKQEAgLTQ3NDUsNyArNDc0Niw3IEBACiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKIAkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0lOSVRfRkFJTEVELAotCQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJCQlTQ1RQX1BFUlIoU0NUUF9FUlJPUl9OT19FUlJPUikpOwogCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOwogCX0KIApAQCAtNDc4MSw3ICs0NzgyLDcgQEAKIAkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOwogCQkvKiBOb3RlOiAgQ01EX0FTU09DX0ZBSUxFRCBjYWxscyBDTURfREVMRVRFX1RDQi4gKi8KIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCi0JCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9OT19FUlJPUikpOworCQkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CiAJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX0FCT1JURURTKTsKIAkJU0NUUF9ERUNfU1RBVFMoU0NUUF9NSUJfQ1VSUkVTVEFCKTsKIAkJcmV0dXJuIFNDVFBfRElTUE9TSVRJT05fREVMRVRFX1RDQjsKQEAgLTQ4NTksNyArNDg2MCw3IEBACiAJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfU0VUX1NLX0VSUiwKIAkJCQlTQ1RQX0VSUk9SKEVUSU1FRE9VVCkpOwogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCQlTQ1RQX1UzMihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKIAkJU0NUUF9JTkNfU1RBVFMoU0NUUF9NSUJfQUJPUlRFRFMpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9DVVJSRVNUQUIpOwogCQlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9BQk9SVDsKQEAgLTQ5MTUsNyArNDkxNiw3IEBACiAJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9TRVRfU0tfRVJSLAogCQkJU0NUUF9FUlJPUihFVElNRURPVVQpKTsKIAlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX0FTU09DX0ZBSUxFRCwKLQkJCVNDVFBfVTMyKFNDVFBfRVJST1JfTk9fRVJST1IpKTsKKwkJCVNDVFBfUEVSUihTQ1RQX0VSUk9SX05PX0VSUk9SKSk7CiAKIAlyZXR1cm4gU0NUUF9ESVNQT1NJVElPTl9ERUxFVEVfVENCOwogbm9tZW06CkBAIC01MzY1LDcgKzUzNjYsNyBAQAogCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1NFVF9TS19FUlIsCiAJCQkJU0NUUF9FUlJPUihFQ09OTkFCT1JURUQpKTsKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9BU1NPQ19GQUlMRUQsCi0JCQkJU0NUUF9VMzIoU0NUUF9FUlJPUl9OT19EQVRBKSk7CisJCQkJU0NUUF9QRVJSKFNDVFBfRVJST1JfTk9fREFUQSkpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9BQk9SVEVEUyk7CiAJCVNDVFBfREVDX1NUQVRTKFNDVFBfTUlCX0NVUlJFU1RBQik7CiAJCXJldHVybiBTQ1RQX0lFUlJPUl9OT19EQVRBOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jIGIvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCmluZGV4IDhiY2NhNTYuLjczM2RkODcgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMKQEAgLTEwNCwzMjUgKzEwNCwzMjIgQEAKIAl9OwogfQogCisjZGVmaW5lIFRZUEVfU0NUUF9GVU5DKGZ1bmMpIHsuZm4gPSBmdW5jLCAubmFtZSA9ICNmdW5jfQorCiAjZGVmaW5lIFRZUEVfU0NUUF9EQVRBIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90YWJvcnRfOF80XzgsIC5uYW1lID0gInNjdHBfc2ZfdGFib3J0XzhfNF84In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RhYm9ydF84XzRfOCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2VhdF9kYXRhXzZfMiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZGF0YV82XzIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZWF0X2RhdGFfNl8yKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZWF0X2RhdGFfNl8yLCAubmFtZSA9ICJzY3RwX3NmX2VhdF9kYXRhXzZfMiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lYXRfZGF0YV82XzIpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNCwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lYXRfZGF0YV9mYXN0XzRfNCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX0RBVEEgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfSU5JVCB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8xQl9pbml0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMUJfaW5pdCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzFCX2luaXQpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzFfc2ltaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMV9zaW1pbml0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl8xX3NpbWluaXQpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzJfMV9zaW1pbml0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl8xX3NpbWluaXQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNV8yXzFfc2ltaW5pdCksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzJfMl9kdXBpbml0LCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQsIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfMl9kdXBpbml0KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMl9kdXBpbml0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzJfZHVwaW5pdCwgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfMl9kdXBpbml0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8yX3Jlc2h1dGFjaywgLm5hbWUgPSAic2N0cF9zZl9kb185XzJfcmVzaHV0YWNrIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzlfMl9yZXNodXRhY2spLCBcCiB9IC8qIFRZUEVfU0NUUF9JTklUICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX0lOSVRfQUNLIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzFDX2FjaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzFDX2FjayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzFDX2FjayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX0lOSVRfQUNLICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX1NBQ0sgeyBcCiAJLyogIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90YWJvcnRfOF80XzgsIC5uYW1lID0gInNjdHBfc2ZfdGFib3J0XzhfNF84In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RhYm9ydF84XzRfOCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2VhdF9zYWNrXzZfMiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfc2Fja182XzIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZWF0X3NhY2tfNl8yKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2VhdF9zYWNrXzZfMiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfc2Fja182XzIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZWF0X3NhY2tfNl8yKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZWF0X3NhY2tfNl8yLCAubmFtZSA9ICJzY3RwX3NmX2VhdF9zYWNrXzZfMiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lYXRfc2Fja182XzIpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lYXRfc2Fja182XzIsIC5uYW1lID0gInNjdHBfc2ZfZWF0X3NhY2tfNl8yIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2VhdF9zYWNrXzZfMiksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX1NBQ0sgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfSEVBUlRCRUFUIHsgXAogCS8qICBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90YWJvcnRfOF80XzgpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9iZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9iZWF0XzhfMyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9iZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9iZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9iZWF0XzhfMyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9iZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2JlYXRfOF8zKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmVhdF84XzMifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYmVhdF84XzMpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmVhdF84XzMifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYmVhdF84XzMpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCiAJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIGFyZSBuaWNlLiAgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2JlYXRfOF8zKSwgXAogfSAvKiBUWVBFX1NDVFBfSEVBUlRCRUFUICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX0hFQVJUQkVBVF9BQ0sgeyBcCiAJLyogIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90YWJvcnRfOF80XzgsIC5uYW1lID0gInNjdHBfc2ZfdGFib3J0XzhfNF84In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RhYm9ydF84XzRfOCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl92aW9sYXRpb24sIC5uYW1lID0gInNjdHBfc2ZfdmlvbGF0aW9uIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Zpb2xhdGlvbiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2JhY2tiZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9iYWNrYmVhdF84XzMifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYmFja2JlYXRfOF8zKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYmFja2JlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX2JhY2tiZWF0XzhfMyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9iYWNrYmVhdF84XzMpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9iYWNrYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmFja2JlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2JhY2tiZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9iYWNrYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2ZfYmFja2JlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2JhY2tiZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX0hFQVJUQkVBVF9BQ0sgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfQUJPUlQgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3BkaXNjYXJkLCAubmFtZSA9ICJzY3RwX3NmX3BkaXNjYXJkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3BkaXNjYXJkKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0LCAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Nvb2tpZV93YWl0X2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfY29va2llX2VjaG9lZF9hYm9ydCwgXAotCSAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfY29va2llX2VjaG9lZF9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzFfYWJvcnQsIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8xX2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzlfMV9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfc2h1dGRvd25fcGVuZGluZ19hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3NodXRkb3duX3NlbnRfYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3NlbnRfYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfc2h1dGRvd25fc2VudF9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzFfYWJvcnQsIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8xX2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzlfMV9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9zaHV0ZG93bl9hY2tfc2VudF9hYm9ydCwgXAotCS5uYW1lID0gInNjdHBfc2Zfc2h1dGRvd25fYWNrX3NlbnRfYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfc2h1dGRvd25fYWNrX3NlbnRfYWJvcnQpLCBcCiB9IC8qIFRZUEVfU0NUUF9BQk9SVCAqLwogCiAjZGVmaW5lIFRZUEVfU0NUUF9TSFVURE9XTiB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90YWJvcnRfOF80XzgpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzJfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8yX3NodXRkb3duIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzlfMl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8yX3NodXRkb3duX2FjaywgXAotCSAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9zaHV0ZG93bl9hY2sifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fOV8yX3NodXRkb3duX2FjayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX1NIVVRET1dOICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX1NIVVRET1dOX0FDSyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOF81XzFfRV9zYSwgLm5hbWUgPSAic2N0cF9zZl9kb184XzVfMV9FX3NhIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzhfNV8xX0Vfc2EpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb184XzVfMV9FX3NhLCAubmFtZSA9ICJzY3RwX3NmX2RvXzhfNV8xX0Vfc2EifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fOF81XzFfRV9zYSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl92aW9sYXRpb24sIC5uYW1lID0gInNjdHBfc2ZfdmlvbGF0aW9uIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Zpb2xhdGlvbiksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3Zpb2xhdGlvbiwgLm5hbWUgPSAic2N0cF9zZl92aW9sYXRpb24ifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdmlvbGF0aW9uKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8yX2ZpbmFsLCAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9maW5hbCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfZmluYWwpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdmlvbGF0aW9uLCAubmFtZSA9ICJzY3RwX3NmX3Zpb2xhdGlvbiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl92aW9sYXRpb24pLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8yX2ZpbmFsLCAubmFtZSA9ICJzY3RwX3NmX2RvXzlfMl9maW5hbCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfZmluYWwpLCBcCiB9IC8qIFRZUEVfU0NUUF9TSFVURE9XTl9BQ0sgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfRVJST1IgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RhYm9ydF84XzRfOCwgLm5hbWUgPSAic2N0cF9zZl90YWJvcnRfOF80XzgifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGFib3J0XzhfNF84KSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfY29va2llX2VjaG9lZF9lcnIsIC5uYW1lID0gInNjdHBfc2ZfY29va2llX2VjaG9lZF9lcnIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfY29va2llX2VjaG9lZF9lcnIpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb3BlcnJfbm90aWZ5LCAubmFtZSA9ICJzY3RwX3NmX29wZXJyX25vdGlmeSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vcGVycl9ub3RpZnkpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9vcGVycl9ub3RpZnksIC5uYW1lID0gInNjdHBfc2Zfb3BlcnJfbm90aWZ5In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29wZXJyX25vdGlmeSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29wZXJyX25vdGlmeSwgLm5hbWUgPSAic2N0cF9zZl9vcGVycl9ub3RpZnkifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb3BlcnJfbm90aWZ5KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogfSAvKiBUWVBFX1NDVFBfRVJST1IgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfQ09PS0lFX0VDSE8geyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMURfY2UsIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8xRF9jZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzFEX2NlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfNF9kdXBjb29rKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfNF9kdXBjb29rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2spLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vaywgLm5hbWUgPSAic2N0cF9zZl9kb181XzJfNF9kdXBjb29rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2spLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzJfNF9kdXBjb29rLCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2sifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfNF9kdXBjb29rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfNF9kdXBjb29rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzVfMl80X2R1cGNvb2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNV8yXzRfZHVwY29vayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb181XzJfNF9kdXBjb29rKSwgXAogfSAvKiBUWVBFX1NDVFBfQ09PS0lFX0VDSE8gKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfQ09PS0lFX0FDSyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb181XzFFX2NhLCAubmFtZSA9ICJzY3RwX3NmX2RvXzVfMUVfY2EifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNV8xRV9jYSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiB9IC8qIFRZUEVfU0NUUF9DT09LSUVfQUNLICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VDTl9FQ05FIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX29vdGIsIC5uYW1lID0gInNjdHBfc2Zfb290YiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9vb3RiKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX2VjbmUsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19lY25lKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX2VjbmUsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19lY25lKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fZWNuZSwgLm5hbWUgPSAic2N0cF9zZl9kb19lY25lIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX2VjbmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19lY25lLCAubmFtZSA9ICJzY3RwX3NmX2RvX2VjbmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fZWNuZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19lY25lLCAubmFtZSA9ICJzY3RwX3NmX2RvX2VjbmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fZWNuZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIH0gLyogVFlQRV9TQ1RQX0VDTl9FQ05FICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VDTl9DV1IgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfb290YiwgLm5hbWUgPSAic2N0cF9zZl9vb3RiIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fZWNuX2N3ciwgLm5hbWUgPSAic2N0cF9zZl9kb19lY25fY3dyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX2Vjbl9jd3IpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19lY25fY3dyLCAubmFtZSA9ICJzY3RwX3NmX2RvX2Vjbl9jd3IifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fZWNuX2N3ciksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX2Vjbl9jd3IsIC5uYW1lID0gInNjdHBfc2ZfZG9fZWNuX2N3ciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19lY25fY3dyKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogfSAvKiBUWVBFX1NDVFBfRUNOX0NXUiAqLwogCiAjZGVmaW5lIFRZUEVfU0NUUF9TSFVURE9XTl9DT01QTEVURSB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNF9DLCAubmFtZSA9ICJzY3RwX3NmX2RvXzRfQyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb180X0MpLCBcCiB9IC8qIFRZUEVfU0NUUF9TSFVURE9XTl9DT01QTEVURSAqLwogCiAvKiBUaGUgcHJpbWFyeSBpbmRleCBmb3IgdGhpcyB0YWJsZSBpcyB0aGUgY2h1bmsgdHlwZS4KQEAgLTQ1MCw0NCArNDQ3LDQ0IEBACiAKICNkZWZpbmUgVFlQRV9TQ1RQX0FTQ09ORiB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19hc2NvbmYsIC5uYW1lID0gInNjdHBfc2ZfZG9fYXNjb25mIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX2FzY29uZiksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiB9IC8qIFRZUEVfU0NUUF9BU0NPTkYgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfQVNDT05GX0FDSyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19hc2NvbmZfYWNrLCAubmFtZSA9ICJzY3RwX3NmX2RvX2FzY29uZl9hY2sifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fYXNjb25mX2FjayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Rpc2NhcmRfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfZGlzY2FyZF9jaHVuayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kaXNjYXJkX2NodW5rKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiB9IC8qIFRZUEVfU0NUUF9BU0NPTkZfQUNLICovCiAKIC8qIFRoZSBwcmltYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBjaHVuayB0eXBlLgpAQCAtNTAwLDIzICs0OTcsMjMgQEAKIAogI2RlZmluZSBUWVBFX1NDVFBfRldEX1RTTiB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfb290YiksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90YWJvcnRfOF80XzgpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kaXNjYXJkX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX2Rpc2NhcmRfY2h1bmsifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZGlzY2FyZF9jaHVuayksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lYXRfZndkX3RzbiwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZndkX3RzbiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lYXRfZndkX3RzbiksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2VhdF9md2RfdHNuLCAubmFtZSA9ICJzY3RwX3NmX2VhdF9md2RfdHNuIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2VhdF9md2RfdHNuKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZWF0X2Z3ZF90c25fZmFzdCwgLm5hbWUgPSAic2N0cF9zZl9lYXRfZndkX3Rzbl9mYXN0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2VhdF9md2RfdHNuX2Zhc3QpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZGlzY2FyZF9jaHVuaywgLm5hbWUgPSAic2N0cF9zZl9kaXNjYXJkX2NodW5rIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Rpc2NhcmRfY2h1bmspLCBcCiB9IC8qIFRZUEVfU0NUUF9GV0RfVFNOICovCiAKIC8qIFRoZSBwcmltYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBjaHVuayB0eXBlLgpAQCAtNTI5LDE2NyArNTI2LDE1MCBAQAogc3RhdGljIGNvbnN0IHNjdHBfc21fdGFibGVfZW50cnlfdAogY2h1bmtfZXZlbnRfdGFibGVfdW5rbm93bltTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0gewogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8KLQl7LmZuID0gc2N0cF9zZl9vb3RiLCAubmFtZSA9ICJzY3RwX3NmX29vdGIifSwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX29vdGIpLAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovCi0Jey5mbiA9IHNjdHBfc2ZfdGFib3J0XzhfNF84LCAubmFtZSA9ICJzY3RwX3NmX3RhYm9ydF84XzRfOCJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGFib3J0XzhfNF84KSwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovCi0Jey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdW5rX2NodW5rKSwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8KLQl7LmZuID0gc2N0cF9zZl91bmtfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfdW5rX2NodW5rIn0sCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl91bmtfY2h1bmspLAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8KLQl7LmZuID0gc2N0cF9zZl91bmtfY2h1bmssIC5uYW1lID0gInNjdHBfc2ZfdW5rX2NodW5rIn0sCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl91bmtfY2h1bmspLAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLwotCXsuZm4gPSBzY3RwX3NmX3Vua19jaHVuaywgLm5hbWUgPSAic2N0cF9zZl91bmtfY2h1bmsifSwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Vua19jaHVuayksCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovCi0Jey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdW5rX2NodW5rKSwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovCi0Jey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdW5rX2NodW5rKSwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovCi0Jey5mbiA9IHNjdHBfc2ZfdW5rX2NodW5rLCAubmFtZSA9ICJzY3RwX3NmX3Vua19jaHVuayJ9LAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdW5rX2NodW5rKSwKIH07CS8qIGNodW5rIHVua25vd24gKi8KIAogCiAjZGVmaW5lIFRZUEVfU0NUUF9QUklNSVRJVkVfQVNTT0NJQVRFICB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX2Fzb2MsIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX2Fzb2MifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX2Fzb2MpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfbm90X2ltcGwpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9ub3RfaW1wbCwgLm5hbWUgPSAic2N0cF9zZl9ub3RfaW1wbCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9ub3RfaW1wbCksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9ub3RfaW1wbCwgLm5hbWUgPSAic2N0cF9zZl9ub3RfaW1wbCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9ub3RfaW1wbCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX25vdF9pbXBsLCAubmFtZSA9ICJzY3RwX3NmX25vdF9pbXBsIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX25vdF9pbXBsKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfbm90X2ltcGwpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfbm90X2ltcGwpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfbm90X2ltcGwsIC5uYW1lID0gInNjdHBfc2Zfbm90X2ltcGwifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfbm90X2ltcGwpLCBcCiB9IC8qIFRZUEVfU0NUUF9QUklNSVRJVkVfQVNTT0NJQVRFICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX1BSSU1JVElWRV9TSFVURE9XTiAgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Vycm9yX2Nsb3NlZCwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9jbG9zZWQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZXJyb3JfY2xvc2VkKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Nvb2tpZV93YWl0X3BybV9zaHV0ZG93biwgXAotCSAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV93YWl0X3BybV9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fc2h1dGRvd24pLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9jb29raWVfZWNob2VkX3BybV9zaHV0ZG93biwgXAotCSAubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV9lY2hvZWRfcHJtX3NodXRkb3duIn0sXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfY29va2llX2VjaG9lZF9wcm1fc2h1dGRvd24pLFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzJfcHJtX3NodXRkb3duLCBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8yX3BybV9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfcHJtX3NodXRkb3duKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfcHJpbWl0aXZlLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9wcmltaXRpdmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX3ByaW1pdGl2ZSksIFwKIH0gLyogVFlQRV9TQ1RQX1BSSU1JVElWRV9TSFVURE9XTiAqLwogCiAjZGVmaW5lIFRZUEVfU0NUUF9QUklNSVRJVkVfQUJPUlQgIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Vycm9yX2Nsb3NlZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX2Nvb2tpZV93YWl0X3BybV9hYm9ydCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9jb29raWVfd2FpdF9wcm1fYWJvcnQpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9jb29raWVfZWNob2VkX3BybV9hYm9ydCwgXAotCS5uYW1lID0gInNjdHBfc2ZfY29va2llX2VjaG9lZF9wcm1fYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfY29va2llX2VjaG9lZF9wcm1fYWJvcnQpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fOV8xX3BybV9hYm9ydCwgXAotCS5uYW1lID0gInNjdHBfc2ZfZG9fOV8xX3BybV9hYm9ydCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzFfcHJtX2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfc2h1dGRvd25fcGVuZGluZ19wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfcHJtX2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3NodXRkb3duX3BlbmRpbmdfcHJtX2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfc2h1dGRvd25fc2VudF9wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX3NlbnRfcHJtX2Fib3J0In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3NodXRkb3duX3NlbnRfcHJtX2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzlfMV9wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX2RvXzlfMV9wcm1fYWJvcnQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fOV8xX3BybV9hYm9ydCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9zaHV0ZG93bl9hY2tfc2VudF9wcm1fYWJvcnQsIFwKLQkubmFtZSA9ICJzY3RwX3NmX3NodXRkb3duX2Fja19zZW50X3BybV9hYm9ydCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9zaHV0ZG93bl9hY2tfc2VudF9wcm1fYWJvcnQpLCBcCiB9IC8qIFRZUEVfU0NUUF9QUklNSVRJVkVfQUJPUlQgKi8KIAogI2RlZmluZSBUWVBFX1NDVFBfUFJJTUlUSVZFX1NFTkQgIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Vycm9yX2Nsb3NlZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19wcm1fc2VuZCwgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fc2VuZCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19wcm1fc2VuZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9zZW5kLCAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9zZW5kIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX3BybV9zZW5kKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9zZW5kLCAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9zZW5kIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX3BybV9zZW5kKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24ifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24pLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIH0gLyogVFlQRV9TQ1RQX1BSSU1JVElWRV9TRU5EICovCiAKICNkZWZpbmUgVFlQRV9TQ1RQX1BSSU1JVElWRV9SRVFVRVNUSEVBUlRCRUFUICB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZXJyb3JfY2xvc2VkLCAubmFtZSA9ICJzY3RwX3NmX2Vycm9yX2Nsb3NlZCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9jbG9zZWQpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQpLCAgICAgICAgICBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCwJCSAgICAgIFwKLQkgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCJ9LCAgICAgICAgICBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCksICAgICAgICAgIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCwJCSAgICAgIFwKLQkgLm5hbWUgPSAic2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCJ9LCAgICAgICAgICBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19wcm1fcmVxdWVzdGhlYXJ0YmVhdCksICAgICAgICAgIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0LAkJICAgICAgXAotCSAubmFtZSA9ICJzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0In0sICAgICAgICAgIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvX3BybV9yZXF1ZXN0aGVhcnRiZWF0KSwgICAgICAgICAgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQpLCAgICAgICAgICBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQpLCAgICAgICAgICBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQsCQkgICAgICBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQifSwgICAgICAgICAgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fcHJtX3JlcXVlc3RoZWFydGJlYXQpLCAgICAgICAgICBcCiB9IC8qIFRZUEVfU0NUUF9QUklNSVRJVkVfUkVRVUVTVEhFQVJUQkVBVCAqLwogCiAjZGVmaW5lIFRZUEVfU0NUUF9QUklNSVRJVkVfQVNDT05GIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Vycm9yX2Nsb3NlZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9jbG9zZWQsIC5uYW1lID0gInNjdHBfc2ZfZXJyb3JfY2xvc2VkIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2Vycm9yX2Nsb3NlZCksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2Vycm9yX2Nsb3NlZCwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9jbG9zZWQifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZXJyb3JfY2xvc2VkKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvX3BybV9hc2NvbmYsIC5uYW1lID0gInNjdHBfc2ZfZG9fcHJtX2FzY29uZiJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb19wcm1fYXNjb25mKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24sIC5uYW1lID0gInNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24ifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZXJyb3Jfc2h1dGRvd24pLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9lcnJvcl9zaHV0ZG93biwgLm5hbWUgPSAic2N0cF9zZl9lcnJvcl9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9lcnJvcl9zaHV0ZG93biksIFwKIH0gLyogVFlQRV9TQ1RQX1BSSU1JVElWRV9SRVFVRVNUSEVBUlRCRUFUICovCiAKIC8qIFRoZSBwcmltYXJ5IGluZGV4IGZvciB0aGlzIHRhYmxlIGlzIHRoZSBwcmltaXRpdmUgdHlwZS4KQEAgLTcwNiw0NyArNjg2LDQ0IEBACiAKICNkZWZpbmUgVFlQRV9TQ1RQX09USEVSX05PX1BFTkRJTkdfVFNOICB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9pZ25vcmVfb3RoZXIpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9pZ25vcmVfb3RoZXIpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzlfMl9zdGFydF9zaHV0ZG93biwgXAotCSAubmFtZSA9ICJzY3RwX2RvXzlfMl9zdGFydF9zaHV0ZG93biJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfc3RhcnRfc2h1dGRvd24pLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb185XzJfc2h1dGRvd25fYWNrLCBcCi0JIC5uYW1lID0gInNjdHBfc2ZfZG9fOV8yX3NodXRkb3duX2FjayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb185XzJfc2h1dGRvd25fYWNrKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX290aGVyKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9PVEhFUl9JQ01QX1BST1RPX1VOUkVBQ0ggIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl9jb29raWVfd2FpdF9pY21wX2Fib3J0LCBcCi0JIC5uYW1lID0gInNjdHBfc2ZfY29va2llX3dhaXRfaWNtcF9hYm9ydCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9jb29raWVfd2FpdF9pY21wX2Fib3J0KSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9pZ25vcmVfb3RoZXIpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfaWdub3JlX290aGVyLCAubmFtZSA9ICJzY3RwX3NmX2lnbm9yZV9vdGhlciJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9pZ25vcmVfb3RoZXIpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9pZ25vcmVfb3RoZXIsIC5uYW1lID0gInNjdHBfc2ZfaWdub3JlX290aGVyIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2lnbm9yZV9vdGhlciksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX290aGVyKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX290aGVyKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2lnbm9yZV9vdGhlciwgLm5hbWUgPSAic2N0cF9zZl9pZ25vcmVfb3RoZXIifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfaWdub3JlX290aGVyKSwgXAogfQogCiBzdGF0aWMgY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90IG90aGVyX2V2ZW50X3RhYmxlW1NDVFBfTlVNX09USEVSX1RZUEVTXVtTQ1RQX1NUQVRFX05VTV9TVEFURVNdID0gewpAQCAtNzU2LDIxNSArNzMzLDIxMiBAQAogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX05PTkUgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1QxX0NPT0tJRSB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90MV9jb29raWVfdGltZXJfZXhwaXJlLCBcCi0JIC5uYW1lID0gInNjdHBfc2ZfdDFfY29va2llX3RpbWVyX2V4cGlyZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90MV9jb29raWVfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIH0KIAogI2RlZmluZSBUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl90MV9pbml0X3RpbWVyX2V4cGlyZSwgXAotCSAubmFtZSA9ICJzY3RwX3NmX3QxX2luaXRfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3QxX2luaXRfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2J1ZywgLm5hbWUgPSAic2N0cF9zZl9idWcifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfYnVnKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORyAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl90Ml90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDJfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3QyX3RpbWVyX2V4cGlyZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1JFQ0VJVkVEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UICovIFwKLQl7LmZuID0gc2N0cF9zZl90Ml90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDJfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3QyX3RpbWVyX2V4cGlyZSksIFwKIH0KIAogI2RlZmluZSBUWVBFX1NDVFBfRVZFTlRfVElNRU9VVF9UM19SVFggeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNl8zXzNfcnR4LCAubmFtZSA9ICJzY3RwX3NmX2RvXzZfM18zX3J0eCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb182XzNfM19ydHgpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNl8zXzNfcnR4LCAubmFtZSA9ICJzY3RwX3NmX2RvXzZfM18zX3J0eCJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb182XzNfM19ydHgpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb182XzNfM19ydHgsIC5uYW1lID0gInNjdHBfc2ZfZG9fNl8zXzNfcnR4In0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzZfM18zX3J0eCksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzZfM18zX3J0eCwgLm5hbWUgPSAic2N0cF9zZl9kb182XzNfM19ydHgifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNl8zXzNfcnR4KSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX1Q0X1JUTyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl90NF90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDRfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Q0X3RpbWVyX2V4cGlyZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiB9CiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfVDVfU0hVVERPV05fR1VBUkQgeyBcCiAJLyogU0NUUF9TVEFURV9FTVBUWSAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfYnVnLCAubmFtZSA9ICJzY3RwX3NmX2J1ZyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9idWcpLCBcCiAJLyogU0NUUF9TVEFURV9DTE9TRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX1dBSVQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9FU1RBQkxJU0hFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl90NV90aW1lcl9leHBpcmUsIC5uYW1lID0gInNjdHBfc2ZfdDVfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3Q1X3RpbWVyX2V4cGlyZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3Q1X3RpbWVyX2V4cGlyZSwgLm5hbWUgPSAic2N0cF9zZl90NV90aW1lcl9leHBpcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdDVfdGltZXJfZXhwaXJlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogfQogCiAjZGVmaW5lIFRZUEVfU0NUUF9FVkVOVF9USU1FT1VUX0hFQVJUQkVBVCB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9zZW5kYmVhdF84XzMsIC5uYW1lID0gInNjdHBfc2Zfc2VuZGJlYXRfOF8zIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3NlbmRiZWF0XzhfMyksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3NlbmRiZWF0XzhfMywgLm5hbWUgPSAic2N0cF9zZl9zZW5kYmVhdF84XzMifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2Zfc2VuZGJlYXRfOF8zKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2Zfc2VuZGJlYXRfOF8zLCAubmFtZSA9ICJzY3RwX3NmX3NlbmRiZWF0XzhfMyJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9zZW5kYmVhdF84XzMpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiB9CiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfU0FDSyB7IFwKIAkvKiBTQ1RQX1NUQVRFX0VNUFRZICovIFwKLQl7LmZuID0gc2N0cF9zZl9idWcsIC5uYW1lID0gInNjdHBfc2ZfYnVnIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2J1ZyksIFwKIAkvKiBTQ1RQX1NUQVRFX0NMT1NFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfV0FJVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEICovIFwKLQl7LmZuID0gc2N0cF9zZl9kb182XzJfc2FjaywgLm5hbWUgPSAic2N0cF9zZl9kb182XzJfc2FjayJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl9kb182XzJfc2FjayksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkcgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2RvXzZfMl9zYWNrLCAubmFtZSA9ICJzY3RwX3NmX2RvXzZfMl9zYWNrIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2RvXzZfMl9zYWNrKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfZG9fNl8yX3NhY2ssIC5uYW1lID0gInNjdHBfc2ZfZG9fNl8yX3NhY2sifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfZG9fNl8yX3NhY2spLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVCAqLyBcCi0Jey5mbiA9IHNjdHBfc2ZfdGltZXJfaWdub3JlLCAubmFtZSA9ICJzY3RwX3NmX3RpbWVyX2lnbm9yZSJ9LCBcCisJVFlQRV9TQ1RQX0ZVTkMoc2N0cF9zZl90aW1lcl9pZ25vcmUpLCBcCiB9CiAKICNkZWZpbmUgVFlQRV9TQ1RQX0VWRU5UX1RJTUVPVVRfQVVUT0NMT1NFIHsgXAogCS8qIFNDVFBfU1RBVEVfRU1QVFkgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfQ0xPU0VEICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX0NPT0tJRV9FQ0hPRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfRVNUQUJMSVNIRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX2F1dG9jbG9zZV90aW1lcl9leHBpcmUsIFwKLQkgLm5hbWUgPSAic2N0cF9zZl9hdXRvY2xvc2VfdGltZXJfZXhwaXJlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX2F1dG9jbG9zZV90aW1lcl9leHBpcmUpLCBcCiAJLyogU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ESU5HICovIFwKLQl7LmZuID0gc2N0cF9zZl90aW1lcl9pZ25vcmUsIC5uYW1lID0gInNjdHBfc2ZfdGltZXJfaWdub3JlIn0sIFwKKwlUWVBFX1NDVFBfRlVOQyhzY3RwX3NmX3RpbWVyX2lnbm9yZSksIFwKIAkvKiBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogCS8qIFNDVFBfU1RBVEVfU0hVVERPV05fQUNLX1NFTlQgKi8gXAotCXsuZm4gPSBzY3RwX3NmX3RpbWVyX2lnbm9yZSwgLm5hbWUgPSAic2N0cF9zZl90aW1lcl9pZ25vcmUifSwgXAorCVRZUEVfU0NUUF9GVU5DKHNjdHBfc2ZfdGltZXJfaWdub3JlKSwgXAogfQogCiBzdGF0aWMgY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90IHRpbWVvdXRfZXZlbnRfdGFibGVbU0NUUF9OVU1fVElNRU9VVF9UWVBFU11bU0NUUF9TVEFURV9OVU1fU1RBVEVTXSA9IHsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggOWRlZWM0My4uYmRkOGJkNCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCQkJICAgICAgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgc2N0cF9zb2NrZXRfdHlwZV90KTsKIHN0YXRpYyBjaGFyICpzY3RwX2htYWNfYWxnID0gU0NUUF9DT09LSUVfSE1BQ19BTEc7CiAKLWV4dGVybiBrbWVtX2NhY2hlX3QgKnNjdHBfYnVja2V0X2NhY2hlcDsKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc2N0cF9idWNrZXRfY2FjaGVwOwogCiAvKiBHZXQgdGhlIHNuZGJ1ZiBzcGFjZSBhdmFpbGFibGUgYXQgdGhlIHRpbWUgb24gdGhlIGFzc29jaWF0aW9uLiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNjdHBfd3NwYWNlKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQpAQCAtMjI5LDExICsyMjksOSBAQAogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCXVuaW9uIHNjdHBfYWRkciAqbGFkZHIgPSAodW5pb24gc2N0cF9hZGRyICopYWRkcjsKIAotCWxhZGRyLT52NC5zaW5fcG9ydCA9IG50b2hzKGxhZGRyLT52NC5zaW5fcG9ydCk7CiAJYWRkcl9hc29jID0gc2N0cF9lbmRwb2ludF9sb29rdXBfYXNzb2Moc2N0cF9zayhzayktPmVwLAotCQkJCQkgICAgICAgKHVuaW9uIHNjdHBfYWRkciAqKWFkZHIsCisJCQkJCSAgICAgICBsYWRkciwKIAkJCQkJICAgICAgICZ0cmFuc3BvcnQpOwotCWxhZGRyLT52NC5zaW5fcG9ydCA9IGh0b25zKGxhZGRyLT52NC5zaW5fcG9ydCk7CiAKIAlpZiAoIWFkZHJfYXNvYykKIAkJcmV0dXJuIE5VTEw7CkBAIC0zNjgsOSArMzY2LDcgQEAKIAlzY3RwX3dyaXRlX2xvY2soJmVwLT5iYXNlLmFkZHJfbG9jayk7CiAKIAkvKiBVc2UgR0ZQX0FUT01JQyBzaW5jZSBCSHMgYXJlIGRpc2FibGVkLiAgKi8KLQlhZGRyLT52NC5zaW5fcG9ydCA9IG50b2hzKGFkZHItPnY0LnNpbl9wb3J0KTsKIAlyZXQgPSBzY3RwX2FkZF9iaW5kX2FkZHIoYnAsIGFkZHIsIDEsIEdGUF9BVE9NSUMpOwotCWFkZHItPnY0LnNpbl9wb3J0ID0gaHRvbnMoYWRkci0+djQuc2luX3BvcnQpOwogCXNjdHBfd3JpdGVfdW5sb2NrKCZlcC0+YmFzZS5hZGRyX2xvY2spOwogCXNjdHBfbG9jYWxfYmhfZW5hYmxlKCk7CiAKQEAgLTU3Miw3ICs1NjgsNiBAQAogCQkJYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyX2J1ZjsKIAkJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoYWRkci0+djQuc2luX2ZhbWlseSk7CiAJCQltZW1jcHkoJnNhdmVhZGRyLCBhZGRyLCBhZi0+c29ja2FkZHJfbGVuKTsKLQkJCXNhdmVhZGRyLnY0LnNpbl9wb3J0ID0gbnRvaHMoc2F2ZWFkZHIudjQuc2luX3BvcnQpOwogCQkJcmV0dmFsID0gc2N0cF9hZGRfYmluZF9hZGRyKGJwLCAmc2F2ZWFkZHIsIDAsCiAJCQkJCQkgICAgR0ZQX0FUT01JQyk7CiAJCQlhZGRyX2J1ZiArPSBhZi0+c29ja2FkZHJfbGVuOwpAQCAtNjA3LDkgKzYwMiw4IEBACiAJaW50IGNudDsKIAlzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwID0gJmVwLT5iYXNlLmJpbmRfYWRkcjsKIAlpbnQgcmV0dmFsID0gMDsKLQl1bmlvbiBzY3RwX2FkZHIgc2F2ZWFkZHI7CiAJdm9pZCAqYWRkcl9idWY7Ci0Jc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXVuaW9uIHNjdHBfYWRkciAqc2FfYWRkcjsKIAlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CiAKIAlTQ1RQX0RFQlVHX1BSSU5USygic2N0cF9iaW5keF9yZW0gKHNrOiAlcCwgYWRkcnM6ICVwLCBhZGRyY250OiAlZClcbiIsCkBAIC02MjcsMTkgKzYyMSwxMyBAQAogCQkJZ290byBlcnJfYmluZHhfcmVtOwogCQl9CiAKLQkJLyogVGhlIGxpc3QgbWF5IGNvbnRhaW4gZWl0aGVyIElQdjQgb3IgSVB2NiBhZGRyZXNzOwotCQkgKiBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgbGVuZ3RoIHRvIGNvcHkgdGhlIGFkZHJlc3MgdG8KLQkJICogc2F2ZWFkZHIuIAotCQkgKi8KLQkJc2FfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyX2J1ZjsKLQkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhzYV9hZGRyLT5zYV9mYW1pbHkpOworCQlzYV9hZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJfYnVmOworCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNhX2FkZHItPnNhLnNhX2ZhbWlseSk7CiAJCWlmICghYWYpIHsKIAkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9iaW5keF9yZW07CiAJCX0KLQkJbWVtY3B5KCZzYXZlYWRkciwgc2FfYWRkciwgYWYtPnNvY2thZGRyX2xlbik7IAotCQlzYXZlYWRkci52NC5zaW5fcG9ydCA9IG50b2hzKHNhdmVhZGRyLnY0LnNpbl9wb3J0KTsKLQkJaWYgKHNhdmVhZGRyLnY0LnNpbl9wb3J0ICE9IGJwLT5wb3J0KSB7CisJCWlmIChzYV9hZGRyLT52NC5zaW5fcG9ydCAhPSBodG9ucyhicC0+cG9ydCkpIHsKIAkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9iaW5keF9yZW07CiAJCX0KQEAgLTY1NCw3ICs2NDIsNyBAQAogCQlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKIAkJc2N0cF93cml0ZV9sb2NrKCZlcC0+YmFzZS5hZGRyX2xvY2spOwogCi0JCXJldHZhbCA9IHNjdHBfZGVsX2JpbmRfYWRkcihicCwgJnNhdmVhZGRyKTsKKwkJcmV0dmFsID0gc2N0cF9kZWxfYmluZF9hZGRyKGJwLCBzYV9hZGRyKTsKIAogCQlzY3RwX3dyaXRlX3VubG9jaygmZXAtPmJhc2UuYWRkcl9sb2NrKTsKIAkJc2N0cF9sb2NhbF9iaF9lbmFibGUoKTsKQEAgLTY5Myw3ICs2ODEsNiBAQAogCXN0cnVjdCBzY3RwX2JpbmRfYWRkcgkqYnA7CiAJc3RydWN0IHNjdHBfY2h1bmsJKmNodW5rOwogCXVuaW9uIHNjdHBfYWRkcgkJKmxhZGRyOwotCXVuaW9uIHNjdHBfYWRkcgkJc2F2ZWFkZHI7CiAJdm9pZAkJCSphZGRyX2J1ZjsKIAlzdHJ1Y3Qgc2N0cF9hZgkJKmFmOwogCXN0cnVjdCBsaXN0X2hlYWQJKnBvcywgKnBvczE7CkBAIC03NzMsMTMgKzc2MCwxMSBAQAogCQlmb3IgKGkgPSAwOyBpIDwgYWRkcmNudDsgaSsrKSB7CiAJCQlsYWRkciA9ICh1bmlvbiBzY3RwX2FkZHIgKilhZGRyX2J1ZjsKIAkJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMobGFkZHItPnY0LnNpbl9mYW1pbHkpOwotCQkJbWVtY3B5KCZzYXZlYWRkciwgbGFkZHIsIGFmLT5zb2NrYWRkcl9sZW4pOwotCQkJc2F2ZWFkZHIudjQuc2luX3BvcnQgPSBudG9ocyhzYXZlYWRkci52NC5zaW5fcG9ydCk7CiAJCQlsaXN0X2Zvcl9lYWNoKHBvczEsICZicC0+YWRkcmVzc19saXN0KSB7CiAJCQkJc2FkZHIgPSBsaXN0X2VudHJ5KHBvczEsCiAJCQkJCQkgICBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwKIAkJCQkJCSAgIGxpc3QpOwotCQkJCWlmIChzY3RwX2NtcF9hZGRyX2V4YWN0KCZzYWRkci0+YSwgJnNhdmVhZGRyKSkKKwkJCQlpZiAoc2N0cF9jbXBfYWRkcl9leGFjdCgmc2FkZHItPmEsIGxhZGRyKSkKIAkJCQkJc2FkZHItPnVzZV9hc19zcmMgPSAwOwogCQkJfQogCQkJYWRkcl9idWYgKz0gYWYtPnNvY2thZGRyX2xlbjsKQEAgLTgyMSw3ICs4MDYsNyBAQAogICogYWRkcnMgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIG9uZSBvciBtb3JlIHNvY2tldCBhZGRyZXNzZXMuIEVhY2gKICAqIGFkZHJlc3MgaXMgY29udGFpbmVkIGluIGl0cyBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmUgKGkuZS4gc3RydWN0CiAgKiBzb2NrYWRkcl9pbiBvciBzdHJ1Y3Qgc29ja2FkZHJfaW42KSB0aGUgZmFtaWx5IG9mIHRoZSBhZGRyZXNzIHR5cGUKLSAqIG11c3QgYmUgdXNlZCB0byBkaXN0ZW5naXNoIHRoZSBhZGRyZXNzIGxlbmd0aCAobm90ZSB0aGF0IHRoaXMKKyAqIG11c3QgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGUgYWRkcmVzcyBsZW5ndGggKG5vdGUgdGhhdCB0aGlzCiAgKiByZXByZXNlbnRhdGlvbiBpcyB0ZXJtZWQgYSAicGFja2VkIGFycmF5IiBvZiBhZGRyZXNzZXMpLiBUaGUgY2FsbGVyCiAgKiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgaW4gdGhlIGFycmF5IHdpdGggYWRkcmNudC4KICAqCkBAIC05NzksNyArOTY0LDcgQEAKIAlpbnQgZXJyID0gMDsKIAlpbnQgYWRkcmNudCA9IDA7CiAJaW50IHdhbGtfc2l6ZSA9IDA7Ci0Jc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXVuaW9uIHNjdHBfYWRkciAqc2FfYWRkcjsKIAl2b2lkICphZGRyX2J1ZjsKIAogCXNwID0gc2N0cF9zayhzayk7CkBAIC05OTksOCArOTg0LDggQEAKIAkvKiBXYWxrIHRocm91Z2ggdGhlIGFkZHJzIGJ1ZmZlciBhbmQgY291bnQgdGhlIG51bWJlciBvZiBhZGRyZXNzZXMuICovCiAJYWRkcl9idWYgPSBrYWRkcnM7CiAJd2hpbGUgKHdhbGtfc2l6ZSA8IGFkZHJzX3NpemUpIHsKLQkJc2FfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyX2J1ZjsKLQkJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhzYV9hZGRyLT5zYV9mYW1pbHkpOworCQlzYV9hZGRyID0gKHVuaW9uIHNjdHBfYWRkciAqKWFkZHJfYnVmOworCQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNhX2FkZHItPnNhLnNhX2ZhbWlseSk7CiAKIAkJLyogSWYgdGhlIGFkZHJlc3MgZmFtaWx5IGlzIG5vdCBzdXBwb3J0ZWQgb3IgaWYgdGhpcyBhZGRyZXNzCiAJCSAqIGNhdXNlcyB0aGUgYWRkcmVzcyBidWZmZXIgdG8gb3ZlcmZsb3cgcmV0dXJuIEVJTlZBTC4KQEAgLTEwMTAsMTggKzk5NSwxNiBAQAogCQkJZ290byBvdXRfZnJlZTsKIAkJfQogCi0JCWVyciA9IHNjdHBfdmVyaWZ5X2FkZHIoc2ssICh1bmlvbiBzY3RwX2FkZHIgKilzYV9hZGRyLAotCQkJCSAgICAgICBhZi0+c29ja2FkZHJfbGVuKTsKKwkJZXJyID0gc2N0cF92ZXJpZnlfYWRkcihzaywgc2FfYWRkciwgYWYtPnNvY2thZGRyX2xlbik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9mcmVlOwogCiAJCW1lbWNweSgmdG8sIHNhX2FkZHIsIGFmLT5zb2NrYWRkcl9sZW4pOwotCQl0by52NC5zaW5fcG9ydCA9IG50b2hzKHRvLnY0LnNpbl9wb3J0KTsKIAogCQkvKiBDaGVjayBpZiB0aGVyZSBhbHJlYWR5IGlzIGEgbWF0Y2hpbmcgYXNzb2NpYXRpb24gb24gdGhlCiAJCSAqIGVuZHBvaW50IChvdGhlciB0aGFuIHRoZSBvbmUgY3JlYXRlZCBoZXJlKS4KIAkJICovCi0JCWFzb2MyID0gc2N0cF9lbmRwb2ludF9sb29rdXBfYXNzb2MoZXAsICZ0bywgJnRyYW5zcG9ydCk7CisJCWFzb2MyID0gc2N0cF9lbmRwb2ludF9sb29rdXBfYXNzb2MoZXAsIHNhX2FkZHIsICZ0cmFuc3BvcnQpOwogCQlpZiAoYXNvYzIgJiYgYXNvYzIgIT0gYXNvYykgewogCQkJaWYgKGFzb2MyLT5zdGF0ZSA+PSBTQ1RQX1NUQVRFX0VTVEFCTElTSEVEKQogCQkJCWVyciA9IC1FSVNDT05OOwpAQCAtMTAzNCw3ICsxMDE3LDcgQEAKIAkJICogbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm8gcGVlbGVkLW9mZiBhc3NvY2lhdGlvbiBtYXRjaGluZwogCQkgKiB0aGUgcGVlciBhZGRyZXNzIGV2ZW4gb24gYW5vdGhlciBzb2NrZXQuCiAJCSAqLwotCQlpZiAoc2N0cF9lbmRwb2ludF9pc19wZWVsZWRfb2ZmKGVwLCAmdG8pKSB7CisJCWlmIChzY3RwX2VuZHBvaW50X2lzX3BlZWxlZF9vZmYoZXAsIHNhX2FkZHIpKSB7CiAJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KQEAgLTEwNjUsNyArMTA0OCw3IEBACiAJCQkJfQogCQkJfQogCi0JCQlzY29wZSA9IHNjdHBfc2NvcGUoJnRvKTsKKwkJCXNjb3BlID0gc2N0cF9zY29wZShzYV9hZGRyKTsKIAkJCWFzb2MgPSBzY3RwX2Fzc29jaWF0aW9uX25ldyhlcCwgc2ssIHNjb3BlLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghYXNvYykgewogCQkJCWVyciA9IC1FTk9NRU07CkBAIC0xMDc0LDcgKzEwNTcsNyBAQAogCQl9CiAKIAkJLyogUHJpbWUgdGhlIHBlZXIncyB0cmFuc3BvcnQgc3RydWN0dXJlcy4gICovCi0JCXRyYW5zcG9ydCA9IHNjdHBfYXNzb2NfYWRkX3BlZXIoYXNvYywgJnRvLCBHRlBfS0VSTkVMLAorCQl0cmFuc3BvcnQgPSBzY3RwX2Fzc29jX2FkZF9wZWVyKGFzb2MsIHNhX2FkZHIsIEdGUF9LRVJORUwsCiAJCQkJCQlTQ1RQX1VOS05PV04pOwogCQlpZiAoIXRyYW5zcG9ydCkgewogCQkJZXJyID0gLUVOT01FTTsKQEAgLTE0MjcsMTEgKzE0MTAsNiBAQAogCQlpZiAobXNnX25hbWVsZW4gPiBzaXplb2YodG8pKQogCQkJbXNnX25hbWVsZW4gPSBzaXplb2YodG8pOwogCQltZW1jcHkoJnRvLCBtc2ctPm1zZ19uYW1lLCBtc2dfbmFtZWxlbik7Ci0JCVNDVFBfREVCVUdfUFJJTlRLKCJKdXN0IG1lbWNweSdkLiBtc2dfbmFtZSBpcyAiCi0JCQkJICAiMHgleDoldS5cbiIsCi0JCQkJICB0by52NC5zaW5fYWRkci5zX2FkZHIsIHRvLnY0LnNpbl9wb3J0KTsKLQotCQl0by52NC5zaW5fcG9ydCA9IG50b2hzKHRvLnY0LnNpbl9wb3J0KTsKIAkJbXNnX25hbWUgPSBtc2ctPm1zZ19uYW1lOwogCX0KIApAQCAtMjc2OCw2ICsyNzQ2LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiA3LjEuMjkuICBTZXQgb3IgR2V0IHRoZSBkZWZhdWx0IGNvbnRleHQgKFNDVFBfQ09OVEVYVCkKKyAqCisgKiBUaGUgY29udGV4dCBmaWVsZCBpbiB0aGUgc2N0cF9zbmRyY3ZpbmZvIHN0cnVjdHVyZSBpcyBub3JtYWxseSBvbmx5CisgKiB1c2VkIHdoZW4gYSBmYWlsZWQgbWVzc2FnZSBpcyByZXRyaWV2ZWQgaG9sZGluZyB0aGUgdmFsdWUgdGhhdCB3YXMKKyAqIHNlbnQgZG93biBvbiB0aGUgYWN0dWFsIHNlbmQgY2FsbC4gIFRoaXMgb3B0aW9uIGFsbG93cyB0aGUgc2V0dGluZyBvZgorICogYSBkZWZhdWx0IGNvbnRleHQgb24gYW4gYXNzb2NpYXRpb24gYmFzaXMgdGhhdCB3aWxsIGJlIHJlY2VpdmVkIG9uCisgKiByZWFkaW5nIG1lc3NhZ2VzIGZyb20gdGhlIHBlZXIuICBUaGlzIGlzIGVzcGVjaWFsbHkgaGVscGZ1bCBpbiB0aGUKKyAqIG9uZS0yLW1hbnkgbW9kZWwgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIGtlZXAgc29tZSByZWZlcmVuY2UgdG8gYW4KKyAqIGludGVybmFsIHN0YXRlIG1hY2hpbmUgdGhhdCBpcyBwcm9jZXNzaW5nIG1lc3NhZ2VzIG9uIHRoZQorICogYXNzb2NpYXRpb24uICBOb3RlIHRoYXQgdGhlIHNldHRpbmcgb2YgdGhpcyB2YWx1ZSBvbmx5IGVmZmVjdHMKKyAqIHJlY2VpdmVkIG1lc3NhZ2VzIGZyb20gdGhlIHBlZXIgYW5kIGRvZXMgbm90IGVmZmVjdCB0aGUgdmFsdWUgdGhhdCBpcworICogc2F2ZWQgd2l0aCBvdXRib3VuZCBtZXNzYWdlcy4KKyAqLworc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfY29udGV4dChzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJICAgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3Qgc2N0cF9hc3NvY192YWx1ZSBwYXJhbXM7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisKKwlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY192YWx1ZSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW1zLCBvcHR2YWwsIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJc3AgPSBzY3RwX3NrKHNrKTsKKworCWlmIChwYXJhbXMuYXNzb2NfaWQgIT0gMCkgeworCQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFzc29jX2lkKTsKKwkJaWYgKCFhc29jKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFzb2MtPmRlZmF1bHRfcmN2X2NvbnRleHQgPSBwYXJhbXMuYXNzb2NfdmFsdWU7CisJfSBlbHNlIHsKKwkJc3AtPmRlZmF1bHRfcmN2X2NvbnRleHQgPSBwYXJhbXMuYXNzb2NfdmFsdWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qIEFQSSA2LjIgc2V0c29ja29wdCgpLCBnZXRzb2Nrb3B0KCkKICAqCiAgKiBBcHBsaWNhdGlvbnMgdXNlIHNldHNvY2tvcHQoKSBhbmQgZ2V0c29ja29wdCgpIHRvIHNldCBvciByZXRyaWV2ZQpAQCAtMjg3OSw2ICsyODk3LDkgQEAKIAljYXNlIFNDVFBfQURBUFRJT05fTEFZRVI6CiAJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9hZGFwdGlvbl9sYXllcihzaywgb3B0dmFsLCBvcHRsZW4pOwogCQlicmVhazsKKwljYXNlIFNDVFBfQ09OVEVYVDoKKwkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X2NvbnRleHQoc2ssIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlyZXR2YWwgPSAtRU5PUFJPVE9PUFQ7CkBAIC0zMDM4LDYgKzMwNTksOCBAQAogCXNwLT5kZWZhdWx0X2NvbnRleHQgPSAwOwogCXNwLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSAwOwogCisJc3AtPmRlZmF1bHRfcmN2X2NvbnRleHQgPSAwOworCiAJLyogSW5pdGlhbGl6ZSBkZWZhdWx0IHNldHVwIHBhcmFtZXRlcnMuIFRoZXNlIHBhcmFtZXRlcnMKIAkgKiBjYW4gYmUgbW9kaWZpZWQgd2l0aCB0aGUgU0NUUF9JTklUTVNHIHNvY2tldCBvcHRpb24gb3IKIAkgKiBvdmVycmlkZGVuIGJ5IHRoZSBTQ1RQX0lOSVQgQ01TRy4KQEAgLTMyMTcsOCArMzI0MCw4IEBACiAJc3RhdHVzLnNzdGF0X291dHN0cm1zID0gYXNvYy0+Yy5zaW5pdF9udW1fb3N0cmVhbXM7CiAJc3RhdHVzLnNzdGF0X2ZyYWdtZW50YXRpb25fcG9pbnQgPSBhc29jLT5mcmFnX3BvaW50OwogCXN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19hc3NvY19pZCA9IHNjdHBfYXNzb2MyaWQodHJhbnNwb3J0LT5hc29jKTsKLQltZW1jcHkoJnN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19hZGRyZXNzLAotCSAgICAgICAmKHRyYW5zcG9ydC0+aXBhZGRyKSwgc2l6ZW9mKHVuaW9uIHNjdHBfYWRkcikpOworCW1lbWNweSgmc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX2FkZHJlc3MsICZ0cmFuc3BvcnQtPmlwYWRkciwKKwkJCXRyYW5zcG9ydC0+YWZfc3BlY2lmaWMtPnNvY2thZGRyX2xlbik7CiAJLyogTWFwIGlwdjQgYWRkcmVzcyBpbnRvIHY0LW1hcHBlZC1vbi12NiBhZGRyZXNzLiAgKi8KIAlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzY3RwX3NrKHNrKSwKIAkJKHVuaW9uIHNjdHBfYWRkciAqKSZzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fYWRkcmVzcyk7CkBAIC0zMzcyLDYgKzMzOTUsNyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IGFzb2MtPmJhc2Uuc2s7CiAJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0c2s7CiAJaW50IGVyciA9IDA7CiAKIAkvKiBBbiBhc3NvY2lhdGlvbiBjYW5ub3QgYmUgYnJhbmNoZWQgb2ZmIGZyb20gYW4gYWxyZWFkeSBwZWVsZWQtb2ZmCkBAIC0zMzg5LDYgKzM0MTMsMTQgQEAKIAkgKiBhc29jIHRvIHRoZSBuZXdzay4KIAkgKi8KIAlzY3RwX3NvY2tfbWlncmF0ZShzaywgc29jay0+c2ssIGFzb2MsIFNDVFBfU09DS0VUX1VEUF9ISUdIX0JBTkRXSURUSCk7CisKKwkvKiBNYWtlIHBlZWxlZC1vZmYgc29ja2V0cyBtb3JlIGxpa2UgMS0xIGFjY2VwdGVkIHNvY2tldHMuCisJICogU2V0IHRoZSBkYWRkciBhbmQgaW5pdGlhbGl6ZSBpZCB0byBzb21ldGhpbmcgbW9yZSByYW5kb20KKwkgKi8KKwlpbmV0c2sgPSBpbmV0X3NrKHNvY2stPnNrKTsKKwlpbmV0c2stPmRhZGRyID0gYXNvYy0+cGVlci5wcmltYXJ5X2FkZHIudjQuc2luX2FkZHIuc19hZGRyOworCWluZXRzay0+aWQgPSBhc29jLT5uZXh0X3RzbiBeIGppZmZpZXM7CisKIAkqc29ja3AgPSBzb2NrOwogCiAJcmV0dXJuIGVycjsKQEAgLTM3NjEsNyArMzc5Myw2IEBACiAJCW1lbWNweSgmdGVtcCwgJmZyb20tPmlwYWRkciwgc2l6ZW9mKHRlbXApKTsKIAkJc2N0cF9nZXRfcGZfc3BlY2lmaWMoc2stPnNrX2ZhbWlseSktPmFkZHJfdjRtYXAoc3AsICZ0ZW1wKTsKIAkJYWRkcmxlbiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5zb2NrYWRkcl9sZW47Ci0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyh0ZW1wLnY0LnNpbl9wb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXRvICs9IGFkZHJsZW4gOwpAQCAtMzgxMiw3ICszODQzLDYgQEAKIAkJYWRkcmxlbiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5zb2NrYWRkcl9sZW47CiAJCWlmKHNwYWNlX2xlZnQgPCBhZGRybGVuKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyh0ZW1wLnY0LnNpbl9wb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXRvICs9IGFkZHJsZW47CkBAIC0zODM2LDEwICszODY2LDkgQEAKIAlzY3RwX2Fzc29jX3QgaWQ7CiAJc3RydWN0IHNjdHBfYmluZF9hZGRyICpicDsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKIAlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKIAlyd2xvY2tfdCAqYWRkcl9sb2NrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNudCA9IDA7CiAKIAlpZiAobGVuICE9IHNpemVvZihzY3RwX2Fzc29jX3QpKQpAQCAtMzg3NCwxOCArMzkwMywxNSBAQAogCQlhZGRyID0gbGlzdF9lbnRyeShicC0+YWRkcmVzc19saXN0Lm5leHQsCiAJCQkJICBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CiAJCWlmIChzY3RwX2lzX2FueSgmYWRkci0+YSkpIHsKLQkJCXNjdHBfc3Bpbl9sb2NrX2lycXNhdmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7Ci0JCQlsaXN0X2Zvcl9lYWNoKHBvcywgJnNjdHBfbG9jYWxfYWRkcl9saXN0KSB7CisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpIHsKIAkJCQlhZGRyID0gbGlzdF9lbnRyeShwb3MsCiAJCQkJCQkgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LAogCQkJCQkJICBsaXN0KTsKIAkJCQlpZiAoKFBGX0lORVQgPT0gc2stPnNrX2ZhbWlseSkgJiYgCi0JCQkJICAgIChBRl9JTkVUNiA9PSBhZGRyLT5hLnNhLnNhX2ZhbWlseSkpCQorCQkJCSAgICAoQUZfSU5FVDYgPT0gYWRkci0+YS5zYS5zYV9mYW1pbHkpKQogCQkJCQljb250aW51ZTsKIAkJCQljbnQrKzsKIAkJCX0KLQkJCXNjdHBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssCi0JCQkJCQkgICAgZmxhZ3MpOwogCQl9IGVsc2UgewogCQkJY250ID0gMTsKIAkJfQpAQCAtMzkwNywxNSArMzkzMywxMyBAQAogc3RhdGljIGludCBzY3RwX2NvcHlfbGFkZHJzX3RvX3VzZXJfb2xkKHN0cnVjdCBzb2NrICpzaywgX191MTYgcG9ydCwgaW50IG1heF9hZGRycywKIAkJCQkJdm9pZCBfX3VzZXIgKnRvKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuZXh0OwogCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5pb24gc2N0cF9hZGRyIHRlbXA7CiAJaW50IGNudCA9IDA7CiAJaW50IGFkZHJsZW47CiAKLQlzY3RwX3NwaW5fbG9ja19pcnFzYXZlKCZzY3RwX2xvY2FsX2FkZHJfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2gocG9zLCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmc2N0cF9sb2NhbF9hZGRyX2xpc3QpIHsKIAkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CiAJCWlmICgoUEZfSU5FVCA9PSBzay0+c2tfZmFtaWx5KSAmJiAKIAkJICAgIChBRl9JTkVUNiA9PSBhZGRyLT5hLnNhLnNhX2ZhbWlseSkpCkBAIC0zOTI0LDE3ICszOTQ4LDEzIEBACiAJCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNjdHBfc2soc2spLAogCQkJCQkJCQkmdGVtcCk7CiAJCWFkZHJsZW4gPSBzY3RwX2dldF9hZl9zcGVjaWZpYyh0ZW1wLnNhLnNhX2ZhbWlseSktPnNvY2thZGRyX2xlbjsKLQkJdGVtcC52NC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotCQlpZiAoY29weV90b191c2VyKHRvLCAmdGVtcCwgYWRkcmxlbikpIHsKLQkJCXNjdHBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssCi0JCQkJCQkgICAgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKHRvLCAmdGVtcCwgYWRkcmxlbikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCiAJCXRvICs9IGFkZHJsZW47CiAJCWNudCArKzsKIAkJaWYgKGNudCA+PSBtYXhfYWRkcnMpIGJyZWFrOwogCX0KLQlzY3RwX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjdHBfbG9jYWxfYWRkcl9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gY250OwogfQpAQCAtMzk0MiwxNSArMzk2MiwxMyBAQAogc3RhdGljIGludCBzY3RwX2NvcHlfbGFkZHJzX3RvX3VzZXIoc3RydWN0IHNvY2sgKnNrLCBfX3UxNiBwb3J0LAogCQkJCSAgICB2b2lkIF9fdXNlciAqKnRvLCBzaXplX3Qgc3BhY2VfbGVmdCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbmV4dDsKIAlzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSAqYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuaW9uIHNjdHBfYWRkciB0ZW1wOwogCWludCBjbnQgPSAwOwogCWludCBhZGRybGVuOwogCi0Jc2N0cF9zcGluX2xvY2tfaXJxc2F2ZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoKHBvcywgJnNjdHBfbG9jYWxfYWRkcl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgJnNjdHBfbG9jYWxfYWRkcl9saXN0KSB7CiAJCWFkZHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnksIGxpc3QpOwogCQlpZiAoKFBGX0lORVQgPT0gc2stPnNrX2ZhbWlseSkgJiYgCiAJCSAgICAoQUZfSU5FVDYgPT0gYWRkci0+YS5zYS5zYV9mYW1pbHkpKQpAQCAtMzk2MSwxNyArMzk3OSwxMyBAQAogCQlhZGRybGVuID0gc2N0cF9nZXRfYWZfc3BlY2lmaWModGVtcC5zYS5zYV9mYW1pbHkpLT5zb2NrYWRkcl9sZW47CiAJCWlmKHNwYWNlX2xlZnQ8YWRkcmxlbikKIAkJCXJldHVybiAtRU5PTUVNOwotCQl0ZW1wLnY0LnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKnRvLCAmdGVtcCwgYWRkcmxlbikpIHsKLQkJCXNjdHBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssCi0JCQkJCQkgICAgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKCp0bywgJnRlbXAsIGFkZHJsZW4pKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwogCQkqdG8gKz0gYWRkcmxlbjsKIAkJY250ICsrOwogCQlzcGFjZV9sZWZ0IC09IGFkZHJsZW47CiAJfQotCXNjdHBfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2N0cF9sb2NhbF9hZGRyX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBjbnQ7CiB9CkBAIC00MDQ2LDcgKzQwNjAsNiBAQAogCQltZW1jcHkoJnRlbXAsICZhZGRyLT5hLCBzaXplb2YodGVtcCkpOwogCQlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzcCwgJnRlbXApOwogCQlhZGRybGVuID0gc2N0cF9nZXRfYWZfc3BlY2lmaWModGVtcC5zYS5zYV9mYW1pbHkpLT5zb2NrYWRkcl9sZW47Ci0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyh0ZW1wLnY0LnNpbl9wb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byB1bmxvY2s7CkBAIC00MTM3LDcgKzQxNTAsNiBAQAogCQlhZGRybGVuID0gc2N0cF9nZXRfYWZfc3BlY2lmaWModGVtcC5zYS5zYV9mYW1pbHkpLT5zb2NrYWRkcl9sZW47CiAJCWlmKHNwYWNlX2xlZnQgPCBhZGRybGVuKQogCQkJcmV0dXJuIC1FTk9NRU07IC8qZml4bWU6IHJpZ2h0IGVycm9yPyovCi0JCXRlbXAudjQuc2luX3BvcnQgPSBodG9ucyh0ZW1wLnY0LnNpbl9wb3J0KTsKIAkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byB1bmxvY2s7CkBAIC00MTg1LDEyICs0MTk3LDggQEAKIAlpZiAoIWFzb2MtPnBlZXIucHJpbWFyeV9wYXRoKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCQotCWFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLT5pcGFkZHIudjQuc2luX3BvcnQgPQotCQlodG9ucyhhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+aXBhZGRyLnY0LnNpbl9wb3J0KTsKIAltZW1jcHkoJnByaW0uc3NwX2FkZHIsICZhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+aXBhZGRyLAotCSAgICAgICBzaXplb2YodW5pb24gc2N0cF9hZGRyKSk7Ci0JYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgtPmlwYWRkci52NC5zaW5fcG9ydCA9Ci0JCW50b2hzKGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoLT5pcGFkZHIudjQuc2luX3BvcnQpOworCQlhc29jLT5wZWVyLnByaW1hcnlfcGF0aC0+YWZfc3BlY2lmaWMtPnNvY2thZGRyX2xlbik7CiAKIAlzY3RwX2dldF9wZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+YWRkcl92NG1hcChzcCwKIAkJCSh1bmlvbiBzY3RwX2FkZHIgKikmcHJpbS5zc3BfYWRkcik7CkBAIC00NDU4LDYgKzQ0NjYsNDIgQEAKIH0KIAogLyoKKyAqIDcuMS4yOS4gIFNldCBvciBHZXQgdGhlIGRlZmF1bHQgY29udGV4dCAoU0NUUF9DT05URVhUKQorICogKGNoYXB0ZXIgYW5kIHZlcnNlIGlzIHF1b3RlZCBhdCBzY3RwX3NldHNvY2tvcHRfY29udGV4dCgpKQorICovCitzdGF0aWMgaW50IHNjdHBfZ2V0c29ja29wdF9jb250ZXh0KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwKKwkJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCit7CisJc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgcGFyYW1zOworCXN0cnVjdCBzY3RwX3NvY2sgKnNwOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCisJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcGFyYW1zLCBvcHR2YWwsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJc3AgPSBzY3RwX3NrKHNrKTsKKworCWlmIChwYXJhbXMuYXNzb2NfaWQgIT0gMCkgeworCQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFzc29jX2lkKTsKKwkJaWYgKCFhc29jKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXBhcmFtcy5hc3NvY192YWx1ZSA9IGFzb2MtPmRlZmF1bHRfcmN2X2NvbnRleHQ7CisJfSBlbHNlIHsKKwkJcGFyYW1zLmFzc29jX3ZhbHVlID0gc3AtPmRlZmF1bHRfcmN2X2NvbnRleHQ7CisJfQorCisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZwYXJhbXMsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiA3LjEuMTcgU2V0IHRoZSBtYXhpbXVtIGZyYWdybWVudGF0aW9uIHNpemUgKFNDVFBfTUFYU0VHKQogICoKICAqIFRoaXMgc29ja2V0IG9wdGlvbiBzcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSB0byBwdXQgaW4gYW55IG91dGdvaW5nCkBAIC00NTk1LDYgKzQ2MzksOSBAQAogCQlyZXR2YWwgPSBzY3RwX2dldHNvY2tvcHRfYWRhcHRpb25fbGF5ZXIoc2ssIGxlbiwgb3B0dmFsLAogCQkJCQkJCW9wdGxlbik7CiAJCWJyZWFrOworCWNhc2UgU0NUUF9DT05URVhUOgorCQlyZXR2YWwgPSBzY3RwX2dldHNvY2tvcHRfY29udGV4dChzaywgbGVuLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHZhbCA9IC1FTk9QUk9UT09QVDsKIAkJYnJlYWs7CkBAIC00NjM2LDkgKzQ2ODMsNyBAQAogCXVuc2lnbmVkIHNob3J0IHNudW07CiAJaW50IHJldDsKIAotCS8qIE5PVEU6ICBSZW1lbWJlciB0byBwdXQgdGhpcyBiYWNrIHRvIG5ldCBvcmRlci4gKi8KLQlhZGRyLT52NC5zaW5fcG9ydCA9IG50b2hzKGFkZHItPnY0LnNpbl9wb3J0KTsKLQlzbnVtID0gYWRkci0+djQuc2luX3BvcnQ7CisJc251bSA9IG50b2hzKGFkZHItPnY0LnNpbl9wb3J0KTsKIAogCVNDVFBfREVCVUdfUFJJTlRLKCJzY3RwX2dldF9wb3J0KCkgYmVnaW5zLCBzbnVtPSVkXG4iLCBzbnVtKTsKIAlzY3RwX2xvY2FsX2JoX2Rpc2FibGUoKTsKQEAgLTQ3NzUsNyArNDgyMCw2IEBACiAKIGZhaWw6CiAJc2N0cF9sb2NhbF9iaF9lbmFibGUoKTsKLQlhZGRyLT52NC5zaW5fcG9ydCA9IGh0b25zKGFkZHItPnY0LnNpbl9wb3J0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MDE1LDcgKzUwNTksNyBAQAogewogCXN0cnVjdCBzY3RwX2JpbmRfYnVja2V0ICpwcDsKIAotCXBwID0ga21lbV9jYWNoZV9hbGxvYyhzY3RwX2J1Y2tldF9jYWNoZXAsIFNMQUJfQVRPTUlDKTsKKwlwcCA9IGttZW1fY2FjaGVfYWxsb2Moc2N0cF9idWNrZXRfY2FjaGVwLCBHRlBfQVRPTUlDKTsKIAlTQ1RQX0RCR19PQkpDTlRfSU5DKGJpbmRfYnVja2V0KTsKIAlpZiAocHApIHsKIAkJcHAtPnBvcnQgPSBzbnVtOwpAQCAtNTA3NCw3ICs1MTE4LDcgQEAKIHsKIAl1bmlvbiBzY3RwX2FkZHIgYXV0b2FkZHI7CiAJc3RydWN0IHNjdHBfYWYgKmFmOwotCXVuc2lnbmVkIHNob3J0IHBvcnQ7CisJX19iZTE2IHBvcnQ7CiAKIAkvKiBJbml0aWFsaXplIGEgbG9jYWwgc29ja2FkZHIgc3RydWN0dXJlIHRvIElOQUREUl9BTlkuICovCiAJYWYgPSBzY3RwX3NrKHNrKS0+cGYtPmFmOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdHNubWFwLmMgYi9uZXQvc2N0cC90c25tYXAuYwppbmRleCBhYzRmYWUxLi40MmQ5NDk4IDEwMDY0NAotLS0gYS9uZXQvc2N0cC90c25tYXAuYworKysgYi9uZXQvc2N0cC90c25tYXAuYwpAQCAtNDAxLDEzICs0MDEsMTQgQEAKIAogCS8qIFJlZnJlc2ggdGhlIGdhcCBhY2sgaW5mb3JtYXRpb24uICovCiAJaWYgKHNjdHBfdHNubWFwX2hhc19nYXAobWFwKSkgeworCQlfX3UxNiBzdGFydCwgZW5kOwogCQlzY3RwX3Rzbm1hcF9pdGVyX2luaXQobWFwLCAmaXRlcik7CiAJCXdoaWxlIChzY3RwX3Rzbm1hcF9uZXh0X2dhcF9hY2sobWFwLCAmaXRlciwKLQkJCQkJCSZtYXAtPmdhYnNbZ2Fic10uc3RhcnQsCi0JCQkJCQkmbWFwLT5nYWJzW2dhYnNdLmVuZCkpIHsKKwkJCQkJCSZzdGFydCwKKwkJCQkJCSZlbmQpKSB7CiAKLQkJCW1hcC0+Z2Fic1tnYWJzXS5zdGFydCA9IGh0b25zKG1hcC0+Z2Fic1tnYWJzXS5zdGFydCk7Ci0JCQltYXAtPmdhYnNbZ2Fic10uZW5kID0gaHRvbnMobWFwLT5nYWJzW2dhYnNdLmVuZCk7CisJCQltYXAtPmdhYnNbZ2Fic10uc3RhcnQgPSBodG9ucyhzdGFydCk7CisJCQltYXAtPmdhYnNbZ2Fic10uZW5kID0gaHRvbnMoZW5kKTsKIAkJCWdhYnMrKzsKIAkJCWlmIChnYWJzID49IFNDVFBfTUFYX0dBQlMpCiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBldmVudC5jIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwppbmRleCBhMDE1MjgzLi45M2FjNjNiIDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBldmVudC5jCisrKyBiL25ldC9zY3RwL3VscGV2ZW50LmMKQEAgLTM1MSw3ICszNTEsNyBAQAogCXN0cnVjdCBzY3RwX3JlbW90ZV9lcnJvciAqc3JlOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc2N0cF9lcnJoZHJfdCAqY2g7Ci0JX191MTYgY2F1c2U7CisJX19iZTE2IGNhdXNlOwogCWludCBlbGVuOwogCiAJY2ggPSAoc2N0cF9lcnJoZHJfdCAqKShjaHVuay0+c2tiLT5kYXRhKTsKQEAgLTg0OSw4ICs4NDksMTAgQEAKIAkgKi8KIAlzaW5mby5zaW5mb19hc3NvY19pZCA9IHNjdHBfYXNzb2MyaWQoZXZlbnQtPmFzb2MpOwogCisJLyogY29udGV4dCB2YWx1ZSB0aGF0IGlzIHNldCB2aWEgU0NUUF9DT05URVhUIHNvY2tldCBvcHRpb24uICovCisJc2luZm8uc2luZm9fY29udGV4dCA9IGV2ZW50LT5hc29jLT5kZWZhdWx0X3Jjdl9jb250ZXh0OworCiAJLyogVGhlc2UgZmllbGRzIGFyZSBub3QgdXNlZCB3aGlsZSByZWNlaXZpbmcuICovCi0Jc2luZm8uc2luZm9fY29udGV4dCA9IDA7CiAJc2luZm8uc2luZm9fdGltZXRvbGl2ZSA9IDA7CiAKIAlwdXRfY21zZyhtc2doZHIsIElQUFJPVE9fU0NUUCwgU0NUUF9TTkRSQ1YsCmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggNmM5YjliMy4uNGUzOTYzMSAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtNzcsNyArNzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RpdmVydC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpAQCAtMjMxLDEzICsyMzAsMTMgQEAKIAogI2RlZmluZSBTT0NLRlNfTUFHSUMgMHg1MzRGNDM0QgogCi1zdGF0aWMga21lbV9jYWNoZV90ICpzb2NrX2lub2RlX2NhY2hlcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzb2NrX2lub2RlX2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgc3RydWN0IGlub2RlICpzb2NrX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHNvY2tldF9hbGxvYyAqZWk7CiAKLQllaSA9IGttZW1fY2FjaGVfYWxsb2Moc29ja19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwllaSA9IGttZW1fY2FjaGVfYWxsb2Moc29ja19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVpLT5zb2NrZXQud2FpdCk7CkBAIC0yNTgsNyArMjU3LDcgQEAKIAkJCWNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IHNvY2tldF9hbGxvYywgdmZzX2lub2RlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3Qgc29ja2V0X2FsbG9jICplaSA9IChzdHJ1Y3Qgc29ja2V0X2FsbG9jICopZm9vOwogCkBAIC0zMDYsNyArMzA1LDE0IEBACiAKIHN0YXRpYyBpbnQgc29ja2ZzX2RlbGV0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewotCXJldHVybiAxOworCS8qCisJICogQXQgY3JlYXRpb24gdGltZSwgd2UgcHJldGVuZGVkIHRoaXMgZGVudHJ5IHdhcyBoYXNoZWQKKwkgKiAoYnkgY2xlYXJpbmcgRENBQ0hFX1VOSEFTSEVEIGJpdCBpbiBkX2ZsYWdzKQorCSAqIEF0IGRlbGV0ZSB0aW1lLCB3ZSByZXN0b3JlIHRoZSB0cnV0aCA6IG5vdCBoYXNoZWQuCisJICogKHNvIHRoYXQgZHB1dCgpIGNhbiBwcm9jZWVkIGNvcnJlY3RseSkKKwkgKi8KKwlkZW50cnktPmRfZmxhZ3MgfD0gRENBQ0hFX1VOSEFTSEVEOworCXJldHVybiAwOwogfQogc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBzb2NrZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CiAJLmRfZGVsZXRlID0gc29ja2ZzX2RlbGV0ZV9kZW50cnksCkBAIC0zNTQsMTYgKzM2MCwyMiBAQAogCiAJdGhpcy5sZW4gPSBzcHJpbnRmKG5hbWUsICJbJWx1XSIsIFNPQ0tfSU5PREUoc29jayktPmlfaW5vKTsKIAl0aGlzLm5hbWUgPSBuYW1lOwotCXRoaXMuaGFzaCA9IFNPQ0tfSU5PREUoc29jayktPmlfaW5vOworCXRoaXMuaGFzaCA9IDA7CiAKLQlmaWxlLT5mX2RlbnRyeSA9IGRfYWxsb2Moc29ja19tbnQtPm1udF9zYi0+c19yb290LCAmdGhpcyk7Ci0JaWYgKHVubGlrZWx5KCFmaWxlLT5mX2RlbnRyeSkpCisJZmlsZS0+Zl9wYXRoLmRlbnRyeSA9IGRfYWxsb2Moc29ja19tbnQtPm1udF9zYi0+c19yb290LCAmdGhpcyk7CisJaWYgKHVubGlrZWx5KCFmaWxlLT5mX3BhdGguZGVudHJ5KSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmaWxlLT5mX2RlbnRyeS0+ZF9vcCA9ICZzb2NrZnNfZGVudHJ5X29wZXJhdGlvbnM7Ci0JZF9hZGQoZmlsZS0+Zl9kZW50cnksIFNPQ0tfSU5PREUoc29jaykpOwotCWZpbGUtPmZfdmZzbW50ID0gbW50Z2V0KHNvY2tfbW50KTsKLQlmaWxlLT5mX21hcHBpbmcgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfb3AgPSAmc29ja2ZzX2RlbnRyeV9vcGVyYXRpb25zOworCS8qCisJICogV2UgZG9udCB3YW50IHRvIHB1c2ggdGhpcyBkZW50cnkgaW50byBnbG9iYWwgZGVudHJ5IGhhc2ggdGFibGUuCisJICogV2UgcHJldGVuZCBkZW50cnkgaXMgYWxyZWFkeSBoYXNoZWQsIGJ5IHVuc2V0dGluZyBEQ0FDSEVfVU5IQVNIRUQKKwkgKiBUaGlzIHBlcm1pdHMgYSB3b3JraW5nIC9wcm9jLyRwaWQvZmQvWFhYIG9uIHNvY2tldHMKKwkgKi8KKwlmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfVU5IQVNIRUQ7CisJZF9pbnN0YW50aWF0ZShmaWxlLT5mX3BhdGguZGVudHJ5LCBTT0NLX0lOT0RFKHNvY2spKTsKKwlmaWxlLT5mX3BhdGgubW50ID0gbW50Z2V0KHNvY2tfbW50KTsKKwlmaWxlLT5mX21hcHBpbmcgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAKIAlzb2NrLT5maWxlID0gZmlsZTsKIAlmaWxlLT5mX29wID0gU09DS19JTk9ERShzb2NrKS0+aV9mb3AgPSAmc29ja2V0X2ZpbGVfb3BzOwpAQCAtNDAxLDcgKzQxMyw3IEBACiAJaWYgKGZpbGUtPmZfb3AgPT0gJnNvY2tldF9maWxlX29wcykKIAkJcmV0dXJuIGZpbGUtPnByaXZhdGVfZGF0YTsJLyogc2V0IGluIHNvY2tfbWFwX2ZkICovCiAKLQlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoIVNfSVNTT0NLKGlub2RlLT5pX21vZGUpKSB7CiAJCSplcnIgPSAtRU5PVFNPQ0s7CiAJCXJldHVybiBOVUxMOwpAQCAtODUyLDExICs4NjQsNiBAQAogCQkJCWVyciA9IHZsYW5faW9jdGxfaG9vayhhcmdwKTsKIAkJCW11dGV4X3VubG9jaygmdmxhbl9pb2N0bF9tdXRleCk7CiAJCQlicmVhazsKLQkJY2FzZSBTSU9DR0lGRElWRVJUOgotCQljYXNlIFNJT0NTSUZESVZFUlQ6Ci0JCQkvKiBDb252ZXJ0IHRoaXMgdG8gY2FsbCB0aHJvdWdoIGEgaG9vayAqLwotCQkJZXJyID0gZGl2ZXJ0X2lvY3RsKGNtZCwgYXJncCk7Ci0JCQlicmVhazsKIAkJY2FzZSBTSU9DQURERExDSToKIAkJY2FzZSBTSU9DREVMRExDSToKIAkJCWVyciA9IC1FTk9QS0c7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKaW5kZXggYjM2Yjk0Ni4uZTFhMTA0YSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwpAQCAtNjgsNyArNjgsNyBAQAogI2RlZmluZSBHU1NfQ1JFRF9TTEFDSwkJMTAyNAkJLyogWFhYOiB1bnVzZWQgKi8KIC8qIGxlbmd0aCBvZiBhIGtyYjUgdmVyaWZpZXIgKDQ4KSwgcGx1cyBkYXRhIGFkZGVkIGJlZm9yZSBhcmd1bWVudHMgd2hlbgogICogdXNpbmcgaW50ZWdyaXR5ICh0d28gNC1ieXRlIGludGVnZXJzKTogKi8KLSNkZWZpbmUgR1NTX1ZFUkZfU0xBQ0sJCTU2CisjZGVmaW5lIEdTU19WRVJGX1NMQUNLCQkxMDAKIAogLyogWFhYIHRoaXMgZGVmaW5lIG11c3QgbWF0Y2ggdGhlIGdzc2QgZGVmaW5lCiAqIGFzIGl0IGlzIHBhc3NlZCB0byBnc3NkIHRvIHNpZ25hbCB0aGUgdXNlIG9mCkBAIC05NCw0NiArOTQsNiBAQAogc3RhdGljIHZvaWQgZ3NzX2Rlc3Ryb3lfY3R4KHN0cnVjdCBnc3NfY2xfY3R4ICopOwogc3RhdGljIHN0cnVjdCBycGNfcGlwZV9vcHMgZ3NzX3VwY2FsbF9vcHM7CiAKLXZvaWQKLXByaW50X2hleGwodTMyICpwLCB1X2ludCBsZW5ndGgsIHVfaW50IG9mZnNldCkKLXsKLQl1X2ludCBpLCBqLCBqbTsKLQl1OCBjLCAqY3A7Ci0JCi0JZHByaW50aygiUlBDOiBwcmludF9oZXhsOiBsZW5ndGggJWRcbiIsbGVuZ3RoKTsKLQlkcHJpbnRrKCJcbiIpOwotCWNwID0gKHU4ICopIHA7Ci0JCi0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAweDEwKSB7Ci0JCWRwcmludGsoIiAgJTA0eDogIiwgKHVfaW50KShpICsgb2Zmc2V0KSk7Ci0JCWptID0gbGVuZ3RoIC0gaTsKLQkJam0gPSBqbSA+IDE2ID8gMTYgOiBqbTsKLQkJCi0JCWZvciAoaiA9IDA7IGogPCBqbTsgaisrKSB7Ci0JCQlpZiAoKGogJSAyKSA9PSAxKQotCQkJCWRwcmludGsoIiUwMnggIiwgKHVfaW50KWNwW2kral0pOwotCQkJZWxzZQotCQkJCWRwcmludGsoIiUwMngiLCAodV9pbnQpY3BbaStqXSk7Ci0JCX0KLQkJZm9yICg7IGogPCAxNjsgaisrKSB7Ci0JCQlpZiAoKGogJSAyKSA9PSAxKQotCQkJCWRwcmludGsoIiAgICIpOwotCQkJZWxzZQotCQkJCWRwcmludGsoIiAgIik7Ci0JCX0KLQkJZHByaW50aygiICIpOwotCQkKLQkJZm9yIChqID0gMDsgaiA8IGptOyBqKyspIHsKLQkJCWMgPSBjcFtpK2pdOwotCQkJYyA9IGlzcHJpbnQoYykgPyBjIDogJy4nOwotCQkJZHByaW50aygiJWMiLCBjKTsKLQkJfQotCQlkcHJpbnRrKCJcbiIpOwotCX0KLX0KLQotRVhQT1JUX1NZTUJPTChwcmludF9oZXhsKTsKLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3NzX2NsX2N0eCAqCiBnc3NfZ2V0X2N0eChzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4KQogewpAQCAtMTk4LDExICsxNTgsMTAgQEAKIAlxID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKIAlpZiAodW5saWtlbHkocSA+IGVuZCB8fCBxIDwgcCkpCiAJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotCWRlc3QtPmRhdGEgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJZGVzdC0+ZGF0YSA9IGttZW1kdXAocCwgbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoZGVzdC0+ZGF0YSA9PSBOVUxMKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJZGVzdC0+bGVuID0gbGVuOwotCW1lbWNweShkZXN0LT5kYXRhLCBwLCBsZW4pOwogCXJldHVybiBxOwogfQogCkBAIC01NDIsNyArNTAxLDcgQEAKIAlpZiAoIWJ1ZikKIAkJZ290byBvdXQ7CiAKLQljbG50ID0gUlBDX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT5wcml2YXRlOworCWNsbnQgPSBSUENfSShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+cHJpdmF0ZTsKIAllcnIgPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHNyYywgbWxlbikpCiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9jcnlwdG8uYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfY3J5cHRvLmMKaW5kZXggZTExYTQwYi4uZDkyNmNkYSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9jcnlwdG8uYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X2NyeXB0by5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2tyYjUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CiAKICNpZmRlZiBSUENfREVCVUcKICMgZGVmaW5lIFJQQ0RCR19GQUNJTElUWSAgICAgICAgUlBDREJHX0FVVEgKQEAgLTYxLDkgKzYyLDYgQEAKIAl1OCBsb2NhbF9pdlsxNl0gPSB7MH07CiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7IC50Zm0gPSB0Zm0sIC5pbmZvID0gbG9jYWxfaXYgfTsKIAotCWRwcmludGsoIlJQQzogICAgICBrcmI1X2VuY3J5cHQ6IGlucHV0IGRhdGE6XG4iKTsKLQlwcmludF9oZXhsKCh1MzIgKilpbiwgbGVuZ3RoLCAwKTsKLQogCWlmIChsZW5ndGggJSBjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZSh0Zm0pICE9IDApCiAJCWdvdG8gb3V0OwogCkBAIC04MCwxMiArNzgsOSBAQAogCXNnX3NldF9idWYoc2csIG91dCwgbGVuZ3RoKTsKIAogCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdigmZGVzYywgc2csIHNnLCBsZW5ndGgpOwotCi0JZHByaW50aygiUlBDOiAgICAgIGtyYjVfZW5jcnlwdDogb3V0cHV0IGRhdGE6XG4iKTsKLQlwcmludF9oZXhsKCh1MzIgKilvdXQsIGxlbmd0aCwgMCk7CiBvdXQ6CiAJZHByaW50aygiUlBDOiAgICAgIGtyYjVfZW5jcnlwdCByZXR1cm5zICVkXG4iLHJldCk7Ci0JcmV0dXJuKHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogRVhQT1JUX1NZTUJPTChrcmI1X2VuY3J5cHQpOwpAQCAtMTAzLDkgKzk4LDYgQEAKIAl1OCBsb2NhbF9pdlsxNl0gPSB7MH07CiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7IC50Zm0gPSB0Zm0sIC5pbmZvID0gbG9jYWxfaXYgfTsKIAotCWRwcmludGsoIlJQQzogICAgICBrcmI1X2RlY3J5cHQ6IGlucHV0IGRhdGE6XG4iKTsKLQlwcmludF9oZXhsKCh1MzIgKilpbiwgbGVuZ3RoLCAwKTsKLQogCWlmIChsZW5ndGggJSBjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZSh0Zm0pICE9IDApCiAJCWdvdG8gb3V0OwogCkBAIC0xMjEsODMgKzExMywxNCBAQAogCXNnX3NldF9idWYoc2csIG91dCwgbGVuZ3RoKTsKIAogCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdF9pdigmZGVzYywgc2csIHNnLCBsZW5ndGgpOwotCi0JZHByaW50aygiUlBDOiAgICAgIGtyYjVfZGVjcnlwdDogb3V0cHV0X2RhdGE6XG4iKTsKLQlwcmludF9oZXhsKCh1MzIgKilvdXQsIGxlbmd0aCwgMCk7CiBvdXQ6CiAJZHByaW50aygiUlBDOiAgICAgIGdzc19rNWRlY3J5cHQgcmV0dXJucyAlZFxuIixyZXQpOwotCXJldHVybihyZXQpOworCXJldHVybiByZXQ7CiB9CiAKIEVYUE9SVF9TWU1CT0woa3JiNV9kZWNyeXB0KTsKIAogc3RhdGljIGludAotcHJvY2Vzc194ZHJfYnVmKHN0cnVjdCB4ZHJfYnVmICpidWYsIGludCBvZmZzZXQsIGludCBsZW4sCi0JCWludCAoKmFjdG9yKShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgaSwgcGFnZV9sZW4sIHRoaXNsZW4sIHBhZ2Vfb2Zmc2V0LCByZXQgPSAwOwotCXN0cnVjdCBzY2F0dGVybGlzdAlzZ1sxXTsKLQotCWlmIChvZmZzZXQgPj0gYnVmLT5oZWFkWzBdLmlvdl9sZW4pIHsKLQkJb2Zmc2V0IC09IGJ1Zi0+aGVhZFswXS5pb3ZfbGVuOwotCX0gZWxzZSB7Ci0JCXRoaXNsZW4gPSBidWYtPmhlYWRbMF0uaW92X2xlbiAtIG9mZnNldDsKLQkJaWYgKHRoaXNsZW4gPiBsZW4pCi0JCQl0aGlzbGVuID0gbGVuOwotCQlzZ19zZXRfYnVmKHNnLCBidWYtPmhlYWRbMF0uaW92X2Jhc2UgKyBvZmZzZXQsIHRoaXNsZW4pOwotCQlyZXQgPSBhY3RvcihzZywgZGF0YSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQkJb2Zmc2V0ID0gMDsKLQkJbGVuIC09IHRoaXNsZW47Ci0JfQotCWlmIChsZW4gPT0gMCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAob2Zmc2V0ID49IGJ1Zi0+cGFnZV9sZW4pIHsKLQkJb2Zmc2V0IC09IGJ1Zi0+cGFnZV9sZW47Ci0JfSBlbHNlIHsKLQkJcGFnZV9sZW4gPSBidWYtPnBhZ2VfbGVuIC0gb2Zmc2V0OwotCQlpZiAocGFnZV9sZW4gPiBsZW4pCi0JCQlwYWdlX2xlbiA9IGxlbjsKLQkJbGVuIC09IHBhZ2VfbGVuOwotCQlwYWdlX29mZnNldCA9IChvZmZzZXQgKyBidWYtPnBhZ2VfYmFzZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7Ci0JCWkgPSAob2Zmc2V0ICsgYnVmLT5wYWdlX2Jhc2UpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCXRoaXNsZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBwYWdlX29mZnNldDsKLQkJZG8gewotCQkJaWYgKHRoaXNsZW4gPiBwYWdlX2xlbikKLQkJCQl0aGlzbGVuID0gcGFnZV9sZW47Ci0JCQlzZy0+cGFnZSA9IGJ1Zi0+cGFnZXNbaV07Ci0JCQlzZy0+b2Zmc2V0ID0gcGFnZV9vZmZzZXQ7Ci0JCQlzZy0+bGVuZ3RoID0gdGhpc2xlbjsKLQkJCXJldCA9IGFjdG9yKHNnLCBkYXRhKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7Ci0JCQlwYWdlX2xlbiAtPSB0aGlzbGVuOwotCQkJaSsrOwotCQkJcGFnZV9vZmZzZXQgPSAwOwotCQkJdGhpc2xlbiA9IFBBR0VfQ0FDSEVfU0laRTsKLQkJfSB3aGlsZSAocGFnZV9sZW4gIT0gMCk7Ci0JCW9mZnNldCA9IDA7Ci0JfQotCWlmIChsZW4gPT0gMCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAob2Zmc2V0IDwgYnVmLT50YWlsWzBdLmlvdl9sZW4pIHsKLQkJdGhpc2xlbiA9IGJ1Zi0+dGFpbFswXS5pb3ZfbGVuIC0gb2Zmc2V0OwotCQlpZiAodGhpc2xlbiA+IGxlbikKLQkJCXRoaXNsZW4gPSBsZW47Ci0JCXNnX3NldF9idWYoc2csIGJ1Zi0+dGFpbFswXS5pb3ZfYmFzZSArIG9mZnNldCwgdGhpc2xlbik7Ci0JCXJldCA9IGFjdG9yKHNnLCBkYXRhKTsKLQkJbGVuIC09IHRoaXNsZW47Ci0JfQotCWlmIChsZW4gIT0gMCkKLQkJcmV0ID0gLUVJTlZBTDsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50CiBjaGVja3N1bW1lcihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MgPSBkYXRhOwpAQCAtMjA3LDIzICsxMzAsMTMgQEAKIAogLyogY2hlY2tzdW0gdGhlIHBsYWludGV4dCBkYXRhIGFuZCBoZHJsZW4gYnl0ZXMgb2YgdGhlIHRva2VuIGhlYWRlciAqLwogczMyCi1tYWtlX2NoZWNrc3VtKHMzMiBja3N1bXR5cGUsIGNoYXIgKmhlYWRlciwgaW50IGhkcmxlbiwgc3RydWN0IHhkcl9idWYgKmJvZHksCittYWtlX2NoZWNrc3VtKGNoYXIgKmNrc3VtbmFtZSwgY2hhciAqaGVhZGVyLCBpbnQgaGRybGVuLCBzdHJ1Y3QgeGRyX2J1ZiAqYm9keSwKIAkJICAgaW50IGJvZHlfb2Zmc2V0LCBzdHJ1Y3QgeGRyX25ldG9iaiAqY2tzdW0pCiB7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2tzdW1uYW1lOwogCXN0cnVjdCBoYXNoX2Rlc2MgICAgICAgICAgICAgICAgZGVzYzsgLyogWFhYIGFkZCB0byBjdHg/ICovCiAJc3RydWN0IHNjYXR0ZXJsaXN0ICAgICAgICAgICAgICBzZ1sxXTsKIAlpbnQgZXJyOwogCi0Jc3dpdGNoIChja3N1bXR5cGUpIHsKLQkJY2FzZSBDS1NVTVRZUEVfUlNBX01ENToKLQkJCWNrc3VtbmFtZSA9ICJtZDUiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkcHJpbnRrKCJSUEM6ICAgICAga3JiNV9tYWtlX2NoZWNrc3VtOiIKLQkJCQkiIHVuc3VwcG9ydGVkIGNoZWNrc3VtICVkIiwgY2tzdW10eXBlKTsKLQkJCXJldHVybiBHU1NfU19GQUlMVVJFOwotCX0KIAlkZXNjLnRmbSA9IGNyeXB0b19hbGxvY19oYXNoKGNrc3VtbmFtZSwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihkZXNjLnRmbSkpCiAJCXJldHVybiBHU1NfU19GQUlMVVJFOwpAQCAtMjM3LDcgKzE1MCw3IEBACiAJZXJyID0gY3J5cHRvX2hhc2hfdXBkYXRlKCZkZXNjLCBzZywgaGRybGVuKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSBwcm9jZXNzX3hkcl9idWYoYm9keSwgYm9keV9vZmZzZXQsIGJvZHktPmxlbiAtIGJvZHlfb2Zmc2V0LAorCWVyciA9IHhkcl9wcm9jZXNzX2J1Zihib2R5LCBib2R5X29mZnNldCwgYm9keS0+bGVuIC0gYm9keV9vZmZzZXQsCiAJCQkgICAgICBjaGVja3N1bW1lciwgJmRlc2MpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMzM1LDcgKzI0OCw3IEBACiAJZGVzYy5mcmFnbm8gPSAwOwogCWRlc2MuZnJhZ2xlbiA9IDA7CiAKLQlyZXQgPSBwcm9jZXNzX3hkcl9idWYoYnVmLCBvZmZzZXQsIGJ1Zi0+bGVuIC0gb2Zmc2V0LCBlbmNyeXB0b3IsICZkZXNjKTsKKwlyZXQgPSB4ZHJfcHJvY2Vzc19idWYoYnVmLCBvZmZzZXQsIGJ1Zi0+bGVuIC0gb2Zmc2V0LCBlbmNyeXB0b3IsICZkZXNjKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MDEsNyArMzE0LDcgQEAKIAlkZXNjLmRlc2MuZmxhZ3MgPSAwOwogCWRlc2MuZnJhZ25vID0gMDsKIAlkZXNjLmZyYWdsZW4gPSAwOwotCXJldHVybiBwcm9jZXNzX3hkcl9idWYoYnVmLCBvZmZzZXQsIGJ1Zi0+bGVuIC0gb2Zmc2V0LCBkZWNyeXB0b3IsICZkZXNjKTsKKwlyZXR1cm4geGRyX3Byb2Nlc3NfYnVmKGJ1Ziwgb2Zmc2V0LCBidWYtPmxlbiAtIG9mZnNldCwgZGVjcnlwdG9yLCAmZGVzYyk7CiB9CiAKIEVYUE9SVF9TWU1CT0woZ3NzX2RlY3J5cHRfeGRyX2J1Zik7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X21lY2guYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCmluZGV4IDMyNWU3MmUuLjA1ZDRiZWUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jCkBAIC03MCwxMCArNzAsOSBAQAogCXEgPSAoY29uc3Qgdm9pZCAqKSgoY29uc3QgY2hhciAqKXAgKyBsZW4pOwogCWlmICh1bmxpa2VseShxID4gZW5kIHx8IHEgPCBwKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci0JcmVzLT5kYXRhID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCXJlcy0+ZGF0YSA9IGttZW1kdXAocCwgbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkocmVzLT5kYXRhID09IE5VTEwpKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQltZW1jcHkocmVzLT5kYXRhLCBwLCBsZW4pOwogCXJlcy0+bGVuID0gbGVuOwogCXJldHVybiBxOwogfQpAQCAtMTMwLDYgKzEyOSw3IEBACiB7CiAJY29uc3Qgdm9pZCAqZW5kID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKIAlzdHJ1Y3QJa3JiNV9jdHggKmN0eDsKKwlpbnQgdG1wOwogCiAJaWYgKCEoY3R4ID0ga3phbGxvYyhzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpKSkKIAkJZ290byBvdXRfZXJyOwpAQCAtMTM3LDE3ICsxMzcsMjIgQEAKIAlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZjdHgtPmluaXRpYXRlLCBzaXplb2YoY3R4LT5pbml0aWF0ZSkpOwogCWlmIChJU19FUlIocCkpCiAJCWdvdG8gb3V0X2Vycl9mcmVlX2N0eDsKLQlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZjdHgtPnNlZWRfaW5pdCwgc2l6ZW9mKGN0eC0+c2VlZF9pbml0KSk7CisJLyogVGhlIGRvd25jYWxsIGZvcm1hdCB3YXMgZGVzaWduZWQgYmVmb3JlIHdlIGNvbXBsZXRlbHkgdW5kZXJzdG9vZAorCSAqIHRoZSB1c2VzIG9mIHRoZSBjb250ZXh0IGZpZWxkczsgc28gaXQgaW5jbHVkZXMgc29tZSBzdHVmZiB3ZQorCSAqIGp1c3QgZ2l2ZSBzb21lIG1pbmltYWwgc2FuaXR5LWNoZWNraW5nLCBhbmQgc29tZSB3ZSBpZ25vcmUKKwkgKiBjb21wbGV0ZWx5IChsaWtlIHRoZSBuZXh0IHR3ZW50eSBieXRlcyk6ICovCisJaWYgKHVubGlrZWx5KHAgKyAyMCA+IGVuZCB8fCBwICsgMjAgPCBwKSkKKwkJZ290byBvdXRfZXJyX2ZyZWVfY3R4OworCXAgKz0gMjA7CisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmdG1wLCBzaXplb2YodG1wKSk7CiAJaWYgKElTX0VSUihwKSkKIAkJZ290byBvdXRfZXJyX2ZyZWVfY3R4OwotCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgY3R4LT5zZWVkLCBzaXplb2YoY3R4LT5zZWVkKSk7CisJaWYgKHRtcCAhPSBTR05fQUxHX0RFU19NQUNfTUQ1KQorCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmdG1wLCBzaXplb2YodG1wKSk7CiAJaWYgKElTX0VSUihwKSkKIAkJZ290byBvdXRfZXJyX2ZyZWVfY3R4OwotCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgJmN0eC0+c2lnbmFsZywgc2l6ZW9mKGN0eC0+c2lnbmFsZykpOwotCWlmIChJU19FUlIocCkpCi0JCWdvdG8gb3V0X2Vycl9mcmVlX2N0eDsKLQlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZjdHgtPnNlYWxhbGcsIHNpemVvZihjdHgtPnNlYWxhbGcpKTsKLQlpZiAoSVNfRVJSKHApKQorCWlmICh0bXAgIT0gU0VBTF9BTEdfREVTKQogCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CiAJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmY3R4LT5lbmR0aW1lLCBzaXplb2YoY3R4LT5lbmR0aW1lKSk7CiAJaWYgKElTX0VSUihwKSkKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfc2VhbC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9zZWFsLmMKaW5kZXggMDg2MDFlZS4uZDBiYjUwNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9zZWFsLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9zZWFsLmMKQEAgLTc3LDcgKzc3LDYgQEAKIAkJc3RydWN0IHhkcl9uZXRvYmogKnRva2VuKQogewogCXN0cnVjdCBrcmI1X2N0eAkJKmN0eCA9IGdzc19jdHgtPmludGVybmFsX2N0eF9pZDsKLQlzMzIJCQljaGVja3N1bV90eXBlOwogCWNoYXIJCQlja3N1bWRhdGFbMTZdOwogCXN0cnVjdCB4ZHJfbmV0b2JqCW1kNWNrc3VtID0gey5sZW4gPSAwLCAuZGF0YSA9IGNrc3VtZGF0YX07CiAJdW5zaWduZWQgY2hhcgkJKnB0ciwgKmtyYjVfaGRyLCAqbXNnX3N0YXJ0OwpAQCAtODgsMjEgKzg3LDYgQEAKIAogCW5vdyA9IGdldF9zZWNvbmRzKCk7CiAKLQlzd2l0Y2ggKGN0eC0+c2lnbmFsZykgewotCQljYXNlIFNHTl9BTEdfREVTX01BQ19NRDU6Ci0JCQljaGVja3N1bV90eXBlID0gQ0tTVU1UWVBFX1JTQV9NRDU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRwcmludGsoIlJQQzogICAgICBnc3Nfa3JiNV9zZWFsOiBjdHgtPnNpZ25hbGcgJWQgbm90IgotCQkJCSIgc3VwcG9ydGVkXG4iLCBjdHgtPnNpZ25hbGcpOwotCQkJZ290byBvdXRfZXJyOwotCX0KLQlpZiAoY3R4LT5zZWFsYWxnICE9IFNFQUxfQUxHX05PTkUgJiYgY3R4LT5zZWFsYWxnICE9IFNFQUxfQUxHX0RFUykgewotCQlkcHJpbnRrKCJSUEM6ICAgICAgZ3NzX2tyYjVfc2VhbDogY3R4LT5zZWFsYWxnICVkIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQljdHgtPnNlYWxhbGcpOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCiAJdG9rZW4tPmxlbiA9IGdfdG9rZW5fc2l6ZSgmY3R4LT5tZWNoX3VzZWQsIDIyKTsKIAogCXB0ciA9IHRva2VuLT5kYXRhOwpAQCAtMTE1LDM3ICs5OSwyNiBAQAogCWtyYjVfaGRyID0gcHRyIC0gMjsKIAltc2dfc3RhcnQgPSBrcmI1X2hkciArIDI0OwogCi0JKihfX2JlMTYgKikoa3JiNV9oZHIgKyAyKSA9IGh0b25zKGN0eC0+c2lnbmFsZyk7CisJKihfX2JlMTYgKikoa3JiNV9oZHIgKyAyKSA9IGh0b25zKFNHTl9BTEdfREVTX01BQ19NRDUpOwogCW1lbXNldChrcmI1X2hkciArIDQsIDB4ZmYsIDQpOwogCi0JaWYgKG1ha2VfY2hlY2tzdW0oY2hlY2tzdW1fdHlwZSwga3JiNV9oZHIsIDgsIHRleHQsIDAsICZtZDVja3N1bSkpCi0JCQlnb3RvIG91dF9lcnI7CisJaWYgKG1ha2VfY2hlY2tzdW0oIm1kNSIsIGtyYjVfaGRyLCA4LCB0ZXh0LCAwLCAmbWQ1Y2tzdW0pKQorCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKIAotCXN3aXRjaCAoY3R4LT5zaWduYWxnKSB7Ci0JY2FzZSBTR05fQUxHX0RFU19NQUNfTUQ1OgotCQlpZiAoa3JiNV9lbmNyeXB0KGN0eC0+c2VxLCBOVUxMLCBtZDVja3N1bS5kYXRhLAotCQkJCSAgbWQ1Y2tzdW0uZGF0YSwgbWQ1Y2tzdW0ubGVuKSkKLQkJCWdvdG8gb3V0X2VycjsKLQkJbWVtY3B5KGtyYjVfaGRyICsgMTYsCi0JCSAgICAgICBtZDVja3N1bS5kYXRhICsgbWQ1Y2tzdW0ubGVuIC0gS1JCNV9DS1NVTV9MRU5HVEgsCi0JCSAgICAgICBLUkI1X0NLU1VNX0xFTkdUSCk7CisJaWYgKGtyYjVfZW5jcnlwdChjdHgtPnNlcSwgTlVMTCwgbWQ1Y2tzdW0uZGF0YSwKKwkJCSAgbWQ1Y2tzdW0uZGF0YSwgbWQ1Y2tzdW0ubGVuKSkKKwkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CiAKLQkJZHByaW50aygiUlBDOiAgICAgIG1ha2Vfc2VhbF90b2tlbjogY2tzdW0gZGF0YTogXG4iKTsKLQkJcHJpbnRfaGV4bCgodTMyICopIChrcmI1X2hkciArIDE2KSwgS1JCNV9DS1NVTV9MRU5HVEgsIDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9CisJbWVtY3B5KGtyYjVfaGRyICsgMTYsIG1kNWNrc3VtLmRhdGEgKyBtZDVja3N1bS5sZW4gLSBLUkI1X0NLU1VNX0xFTkdUSCwKKwkgICAgICAgS1JCNV9DS1NVTV9MRU5HVEgpOwogCiAJc3Bpbl9sb2NrKCZrcmI1X3NlcV9sb2NrKTsKIAlzZXFfc2VuZCA9IGN0eC0+c2VxX3NlbmQrKzsKIAlzcGluX3VubG9jaygma3JiNV9zZXFfbG9jayk7CiAKLQlpZiAoKGtyYjVfbWFrZV9zZXFfbnVtKGN0eC0+c2VxLCBjdHgtPmluaXRpYXRlID8gMCA6IDB4ZmYsCi0JCQkgICAgICAgc2VxX3NlbmQsIGtyYjVfaGRyICsgMTYsIGtyYjVfaGRyICsgOCkpKQotCQlnb3RvIG91dF9lcnI7CisJaWYgKGtyYjVfbWFrZV9zZXFfbnVtKGN0eC0+c2VxLCBjdHgtPmluaXRpYXRlID8gMCA6IDB4ZmYsCisJCQkgICAgICAgY3R4LT5zZXFfc2VuZCwga3JiNV9oZHIgKyAxNiwga3JiNV9oZHIgKyA4KSkKKwkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CiAKLQlyZXR1cm4gKChjdHgtPmVuZHRpbWUgPCBub3cpID8gR1NTX1NfQ09OVEVYVF9FWFBJUkVEIDogR1NTX1NfQ09NUExFVEUpOwotb3V0X2VycjoKLQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKKwlyZXR1cm4gKGN0eC0+ZW5kdGltZSA8IG5vdykgPyBHU1NfU19DT05URVhUX0VYUElSRUQgOiBHU1NfU19DT01QTEVURTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfdW5zZWFsLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X3Vuc2VhbC5jCmluZGV4IDA4MjhjZjYuLjg3Zjg5NzcgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfdW5zZWFsLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV91bnNlYWwuYwpAQCAtNzgsNyArNzgsNiBAQAogCXN0cnVjdCBrcmI1X2N0eAkJKmN0eCA9IGdzc19jdHgtPmludGVybmFsX2N0eF9pZDsKIAlpbnQJCQlzaWduYWxnOwogCWludAkJCXNlYWxhbGc7Ci0JczMyCQkJY2hlY2tzdW1fdHlwZTsKIAljaGFyCQkJY2tzdW1kYXRhWzE2XTsKIAlzdHJ1Y3QgeGRyX25ldG9iagltZDVja3N1bSA9IHsubGVuID0gMCwgLmRhdGEgPSBja3N1bWRhdGF9OwogCXMzMgkJCW5vdzsKQEAgLTg2LDk2ICs4NSw1NCBAQAogCXMzMgkJCXNlcW51bTsKIAl1bnNpZ25lZCBjaGFyCQkqcHRyID0gKHVuc2lnbmVkIGNoYXIgKilyZWFkX3Rva2VuLT5kYXRhOwogCWludAkJCWJvZHlzaXplOwotCXUzMgkJCXJldCA9IEdTU19TX0RFRkVDVElWRV9UT0tFTjsKIAogCWRwcmludGsoIlJQQzogICAgICBrcmI1X3JlYWRfdG9rZW5cbiIpOwogCiAJaWYgKGdfdmVyaWZ5X3Rva2VuX2hlYWRlcigmY3R4LT5tZWNoX3VzZWQsICZib2R5c2l6ZSwgJnB0ciwKIAkJCQkJcmVhZF90b2tlbi0+bGVuKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CiAKIAlpZiAoKCpwdHIrKyAhPSAoKEtHX1RPS19NSUNfTVNHPj44KSYweGZmKSkgfHwKIAkgICAgKCpwdHIrKyAhPSAoIEtHX1RPS19NSUNfTVNHICAgICYweGZmKSkgICApCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gR1NTX1NfREVGRUNUSVZFX1RPS0VOOwogCiAJLyogWFhYIHNhbml0eS1jaGVjayBib2R5c2l6ZT8/ICovCiAKLQkvKiBnZXQgdGhlIHNpZ24gYW5kIHNlYWwgYWxnb3JpdGhtcyAqLwotCiAJc2lnbmFsZyA9IHB0clswXSArIChwdHJbMV0gPDwgOCk7Ci0Jc2VhbGFsZyA9IHB0clsyXSArIChwdHJbM10gPDwgOCk7CisJaWYgKHNpZ25hbGcgIT0gU0dOX0FMR19ERVNfTUFDX01ENSkKKwkJcmV0dXJuIEdTU19TX0RFRkVDVElWRV9UT0tFTjsKIAotCS8qIFNhbml0eSBjaGVja3MgKi8KKwlzZWFsYWxnID0gcHRyWzJdICsgKHB0clszXSA8PCA4KTsKKwlpZiAoc2VhbGFsZyAhPSBTRUFMX0FMR19OT05FKQorCQlyZXR1cm4gR1NTX1NfREVGRUNUSVZFX1RPS0VOOwogCiAJaWYgKChwdHJbNF0gIT0gMHhmZikgfHwgKHB0cls1XSAhPSAweGZmKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CiAKLQlpZiAoc2VhbGFsZyAhPSAweGZmZmYpCi0JCWdvdG8gb3V0OworCWlmIChtYWtlX2NoZWNrc3VtKCJtZDUiLCBwdHIgLSAyLCA4LCBtZXNzYWdlX2J1ZmZlciwgMCwgJm1kNWNrc3VtKSkKKwkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CiAKLQkvKiB0aGVyZSBhcmUgc2V2ZXJhbCBtYXBwaW5ncyBvZiBzZWFsIGFsZ29yaXRobXMgdG8gc2lnbiBhbGdvcml0aG1zLAotCSAgIGJ1dCBmZXcgZW5vdWdoIHRoYXQgd2UgY2FuIHRyeSB0aGVtIGFsbC4gKi8KKwlpZiAoa3JiNV9lbmNyeXB0KGN0eC0+c2VxLCBOVUxMLCBtZDVja3N1bS5kYXRhLCBtZDVja3N1bS5kYXRhLCAxNikpCisJCXJldHVybiBHU1NfU19GQUlMVVJFOwogCi0JaWYgKChjdHgtPnNlYWxhbGcgPT0gU0VBTF9BTEdfTk9ORSAmJiBzaWduYWxnID4gMSkgfHwKLQkgICAgKGN0eC0+c2VhbGFsZyA9PSBTRUFMX0FMR18xICYmIHNpZ25hbGcgIT0gU0dOX0FMR18zKSB8fAotCSAgICAoY3R4LT5zZWFsYWxnID09IFNFQUxfQUxHX0RFUzNLRCAmJgotCSAgICAgc2lnbmFsZyAhPSBTR05fQUxHX0hNQUNfU0hBMV9ERVMzX0tEKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBjb21wdXRlIHRoZSBjaGVja3N1bSBvZiB0aGUgbWVzc2FnZSAqLwotCi0JLyogaW5pdGlhbGl6ZSB0aGUgdGhlIGNrc3VtICovCi0Jc3dpdGNoIChzaWduYWxnKSB7Ci0JY2FzZSBTR05fQUxHX0RFU19NQUNfTUQ1OgotCQljaGVja3N1bV90eXBlID0gQ0tTVU1UWVBFX1JTQV9NRDU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IEdTU19TX0RFRkVDVElWRV9UT0tFTjsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3dpdGNoIChzaWduYWxnKSB7Ci0JY2FzZSBTR05fQUxHX0RFU19NQUNfTUQ1OgotCQlyZXQgPSBtYWtlX2NoZWNrc3VtKGNoZWNrc3VtX3R5cGUsIHB0ciAtIDIsIDgsCi0JCQkJCSBtZXNzYWdlX2J1ZmZlciwgMCwgJm1kNWNrc3VtKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCi0JCXJldCA9IGtyYjVfZW5jcnlwdChjdHgtPnNlcSwgTlVMTCwgbWQ1Y2tzdW0uZGF0YSwKLQkJCQkgICBtZDVja3N1bS5kYXRhLCAxNik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQotCQlpZiAobWVtY21wKG1kNWNrc3VtLmRhdGEgKyA4LCBwdHIgKyAxNCwgOCkpIHsKLQkJCXJldCA9IEdTU19TX0JBRF9TSUc7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSBHU1NfU19ERUZFQ1RJVkVfVE9LRU47Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAobWVtY21wKG1kNWNrc3VtLmRhdGEgKyA4LCBwdHIgKyAxNCwgOCkpCisJCXJldHVybiBHU1NfU19CQURfU0lHOwogCiAJLyogaXQgZ290IHRocm91Z2ggdW5zY2F0aGVkLiAgTWFrZSBzdXJlIHRoZSBjb250ZXh0IGlzIHVuZXhwaXJlZCAqLwogCiAJbm93ID0gZ2V0X3NlY29uZHMoKTsKIAotCXJldCA9IEdTU19TX0NPTlRFWFRfRVhQSVJFRDsKIAlpZiAobm93ID4gY3R4LT5lbmR0aW1lKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIEdTU19TX0NPTlRFWFRfRVhQSVJFRDsKIAogCS8qIGRvIHNlcXVlbmNpbmcgY2hlY2tzICovCiAKLQlyZXQgPSBHU1NfU19CQURfU0lHOwotCWlmICgocmV0ID0ga3JiNV9nZXRfc2VxX251bShjdHgtPnNlcSwgcHRyICsgMTQsIHB0ciArIDYsICZkaXJlY3Rpb24sCi0JCQkJICAgICZzZXFudW0pKSkKLQkJZ290byBvdXQ7CisJaWYgKGtyYjVfZ2V0X3NlcV9udW0oY3R4LT5zZXEsIHB0ciArIDE0LCBwdHIgKyA2LCAmZGlyZWN0aW9uLCAmc2VxbnVtKSkKKwkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CiAKIAlpZiAoKGN0eC0+aW5pdGlhdGUgJiYgZGlyZWN0aW9uICE9IDB4ZmYpIHx8CiAJICAgICghY3R4LT5pbml0aWF0ZSAmJiBkaXJlY3Rpb24gIT0gMCkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gR1NTX1NfQkFEX1NJRzsKIAotCXJldCA9IEdTU19TX0NPTVBMRVRFOwotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIEdTU19TX0NPTVBMRVRFOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV93cmFwLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X3dyYXAuYwppbmRleCBjYzQ1YzE2Li5mZTI1YjNkIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X3dyYXAuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X3dyYXAuYwpAQCAtNTcsOSArNTcsOSBAQAogCQkJCQk+PlBBR0VfQ0FDSEVfU0hJRlQ7CiAJCWludCBvZmZzZXQgPSAoYnVmLT5wYWdlX2Jhc2UgKyBsZW4gLSAxKQogCQkJCQkmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKLQkJcHRyID0ga21hcF9hdG9taWMoYnVmLT5wYWdlc1tsYXN0XSwgS01fU0tCX1NVTlJQQ19EQVRBKTsKKwkJcHRyID0ga21hcF9hdG9taWMoYnVmLT5wYWdlc1tsYXN0XSwgS01fVVNFUjApOwogCQlwYWQgPSAqKHB0ciArIG9mZnNldCk7Ci0JCWt1bm1hcF9hdG9taWMocHRyLCBLTV9TS0JfU1VOUlBDX0RBVEEpOworCQlrdW5tYXBfYXRvbWljKHB0ciwgS01fVVNFUjApOwogCQlnb3RvIG91dDsKIAl9IGVsc2UKIAkJbGVuIC09IGJ1Zi0+cGFnZV9sZW47CkBAIC0xMjAsNyArMTIwLDYgQEAKIAkJc3RydWN0IHhkcl9idWYgKmJ1Ziwgc3RydWN0IHBhZ2UgKipwYWdlcykKIHsKIAlzdHJ1Y3Qga3JiNV9jdHgJCSprY3R4ID0gY3R4LT5pbnRlcm5hbF9jdHhfaWQ7Ci0JczMyCQkJY2hlY2tzdW1fdHlwZTsKIAljaGFyCQkJY2tzdW1kYXRhWzE2XTsKIAlzdHJ1Y3QgeGRyX25ldG9iagltZDVja3N1bSA9IHsubGVuID0gMCwgLmRhdGEgPSBja3N1bWRhdGF9OwogCWludAkJCWJsb2Nrc2l6ZSA9IDAsIHBsYWlubGVuOwpAQCAtMTM0LDIxICsxMzMsNiBAQAogCiAJbm93ID0gZ2V0X3NlY29uZHMoKTsKIAotCXN3aXRjaCAoa2N0eC0+c2lnbmFsZykgewotCQljYXNlIFNHTl9BTEdfREVTX01BQ19NRDU6Ci0JCQljaGVja3N1bV90eXBlID0gQ0tTVU1UWVBFX1JTQV9NRDU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRwcmludGsoIlJQQzogICAgICBnc3Nfa3JiNV9zZWFsOiBrY3R4LT5zaWduYWxnICVkIG5vdCIKLQkJCQkiIHN1cHBvcnRlZFxuIiwga2N0eC0+c2lnbmFsZyk7Ci0JCQlnb3RvIG91dF9lcnI7Ci0JfQotCWlmIChrY3R4LT5zZWFsYWxnICE9IFNFQUxfQUxHX05PTkUgJiYga2N0eC0+c2VhbGFsZyAhPSBTRUFMX0FMR19ERVMpIHsKLQkJZHByaW50aygiUlBDOiAgICAgIGdzc19rcmI1X3NlYWw6IGtjdHgtPnNlYWxhbGcgJWQgbm90IHN1cHBvcnRlZFxuIiwKLQkJCWtjdHgtPnNlYWxhbGcpOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCiAJYmxvY2tzaXplID0gY3J5cHRvX2Jsa2NpcGhlcl9ibG9ja3NpemUoa2N0eC0+ZW5jKTsKIAlnc3Nfa3JiNV9hZGRfcGFkZGluZyhidWYsIG9mZnNldCwgYmxvY2tzaXplKTsKIAlCVUdfT04oKGJ1Zi0+bGVuIC0gb2Zmc2V0KSAlIGJsb2Nrc2l6ZSk7CkBAIC0xNzUsMzcgKzE1OSwyNyBAQAogCS8qIHB0ciBub3cgYXQgYnl0ZSAyIG9mIGhlYWRlciBkZXNjcmliZWQgaW4gcmZjIDE5NjQsIHNlY3Rpb24gMS4yLjE6ICovCiAJa3JiNV9oZHIgPSBwdHIgLSAyOwogCW1zZ19zdGFydCA9IGtyYjVfaGRyICsgMjQ7Ci0JLyogWFhYSkJGOiAqLyBCVUdfT04oYnVmLT5oZWFkWzBdLmlvdl9iYXNlICsgb2Zmc2V0ICsgaGVhZGxlbiAhPSBtc2dfc3RhcnQgKyBibG9ja3NpemUpOwogCi0JKihfX2JlMTYgKikoa3JiNV9oZHIgKyAyKSA9IGh0b25zKGtjdHgtPnNpZ25hbGcpOworCSooX19iZTE2ICopKGtyYjVfaGRyICsgMikgPSBodG9ucyhTR05fQUxHX0RFU19NQUNfTUQ1KTsKIAltZW1zZXQoa3JiNV9oZHIgKyA0LCAweGZmLCA0KTsKLQkqKF9fYmUxNiAqKShrcmI1X2hkciArIDQpID0gaHRvbnMoa2N0eC0+c2VhbGFsZyk7CisJKihfX2JlMTYgKikoa3JiNV9oZHIgKyA0KSA9IGh0b25zKFNFQUxfQUxHX0RFUyk7CiAKIAltYWtlX2NvbmZvdW5kZXIobXNnX3N0YXJ0LCBibG9ja3NpemUpOwogCiAJLyogWFhYSkJGOiBVR0ghOiAqLwogCXRtcF9wYWdlcyA9IGJ1Zi0+cGFnZXM7CiAJYnVmLT5wYWdlcyA9IHBhZ2VzOwotCWlmIChtYWtlX2NoZWNrc3VtKGNoZWNrc3VtX3R5cGUsIGtyYjVfaGRyLCA4LCBidWYsCisJaWYgKG1ha2VfY2hlY2tzdW0oIm1kNSIsIGtyYjVfaGRyLCA4LCBidWYsCiAJCQkJb2Zmc2V0ICsgaGVhZGxlbiAtIGJsb2Nrc2l6ZSwgJm1kNWNrc3VtKSkKLQkJZ290byBvdXRfZXJyOworCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKIAlidWYtPnBhZ2VzID0gdG1wX3BhZ2VzOwogCi0Jc3dpdGNoIChrY3R4LT5zaWduYWxnKSB7Ci0JY2FzZSBTR05fQUxHX0RFU19NQUNfTUQ1OgotCQlpZiAoa3JiNV9lbmNyeXB0KGtjdHgtPnNlcSwgTlVMTCwgbWQ1Y2tzdW0uZGF0YSwKLQkJCQkgIG1kNWNrc3VtLmRhdGEsIG1kNWNrc3VtLmxlbikpCi0JCQlnb3RvIG91dF9lcnI7Ci0JCW1lbWNweShrcmI1X2hkciArIDE2LAotCQkgICAgICAgbWQ1Y2tzdW0uZGF0YSArIG1kNWNrc3VtLmxlbiAtIEtSQjVfQ0tTVU1fTEVOR1RILAotCQkgICAgICAgS1JCNV9DS1NVTV9MRU5HVEgpOwotCi0JCWRwcmludGsoIlJQQzogICAgICBtYWtlX3NlYWxfdG9rZW46IGNrc3VtIGRhdGE6IFxuIik7Ci0JCXByaW50X2hleGwoKHUzMiAqKSAoa3JiNV9oZHIgKyAxNiksIEtSQjVfQ0tTVU1fTEVOR1RILCAwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQorCWlmIChrcmI1X2VuY3J5cHQoa2N0eC0+c2VxLCBOVUxMLCBtZDVja3N1bS5kYXRhLAorCQkJICBtZDVja3N1bS5kYXRhLCBtZDVja3N1bS5sZW4pKQorCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKKwltZW1jcHkoa3JiNV9oZHIgKyAxNiwKKwkgICAgICAgbWQ1Y2tzdW0uZGF0YSArIG1kNWNrc3VtLmxlbiAtIEtSQjVfQ0tTVU1fTEVOR1RILAorCSAgICAgICBLUkI1X0NLU1VNX0xFTkdUSCk7CiAKIAlzcGluX2xvY2soJmtyYjVfc2VxX2xvY2spOwogCXNlcV9zZW5kID0ga2N0eC0+c2VxX3NlbmQrKzsKQEAgLTIxNSwxNSArMTg5LDEzIEBACiAJICogYW5kIGVuY3J5cHQgYXQgdGhlIHNhbWUgdGltZTogKi8KIAlpZiAoKGtyYjVfbWFrZV9zZXFfbnVtKGtjdHgtPnNlcSwga2N0eC0+aW5pdGlhdGUgPyAwIDogMHhmZiwKIAkJCSAgICAgICBzZXFfc2VuZCwga3JiNV9oZHIgKyAxNiwga3JiNV9oZHIgKyA4KSkpCi0JCWdvdG8gb3V0X2VycjsKKwkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CiAKIAlpZiAoZ3NzX2VuY3J5cHRfeGRyX2J1ZihrY3R4LT5lbmMsIGJ1Ziwgb2Zmc2V0ICsgaGVhZGxlbiAtIGJsb2Nrc2l6ZSwKIAkJCQkJCQkJCXBhZ2VzKSkKLQkJZ290byBvdXRfZXJyOworCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKIAotCXJldHVybiAoKGtjdHgtPmVuZHRpbWUgPCBub3cpID8gR1NTX1NfQ09OVEVYVF9FWFBJUkVEIDogR1NTX1NfQ09NUExFVEUpOwotb3V0X2VycjoKLQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKKwlyZXR1cm4gKGtjdHgtPmVuZHRpbWUgPCBub3cpID8gR1NTX1NfQ09OVEVYVF9FWFBJUkVEIDogR1NTX1NfQ09NUExFVEU7CiB9CiAKIHUzMgpAQCAtMjMyLDcgKzIwNCw2IEBACiAJc3RydWN0IGtyYjVfY3R4CQkqa2N0eCA9IGN0eC0+aW50ZXJuYWxfY3R4X2lkOwogCWludAkJCXNpZ25hbGc7CiAJaW50CQkJc2VhbGFsZzsKLQlzMzIJCQljaGVja3N1bV90eXBlOwogCWNoYXIJCQlja3N1bWRhdGFbMTZdOwogCXN0cnVjdCB4ZHJfbmV0b2JqCW1kNWNrc3VtID0gey5sZW4gPSAwLCAuZGF0YSA9IGNrc3VtZGF0YX07CiAJczMyCQkJbm93OwpAQCAtMjQwLDcgKzIxMSw2IEBACiAJczMyCQkJc2VxbnVtOwogCXVuc2lnbmVkIGNoYXIJCSpwdHI7CiAJaW50CQkJYm9keXNpemU7Ci0JdTMyCQkJcmV0ID0gR1NTX1NfREVGRUNUSVZFX1RPS0VOOwogCXZvaWQJCQkqZGF0YV9zdGFydCwgKm9yaWdfc3RhcnQ7CiAJaW50CQkJZGF0YV9sZW47CiAJaW50CQkJYmxvY2tzaXplOwpAQCAtMjUwLDk4ICsyMjAsNTggQEAKIAlwdHIgPSAodTggKilidWYtPmhlYWRbMF0uaW92X2Jhc2UgKyBvZmZzZXQ7CiAJaWYgKGdfdmVyaWZ5X3Rva2VuX2hlYWRlcigma2N0eC0+bWVjaF91c2VkLCAmYm9keXNpemUsICZwdHIsCiAJCQkJCWJ1Zi0+bGVuIC0gb2Zmc2V0KSkKLQkJZ290byBvdXQ7CisJCXJldHVybiBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CiAKIAlpZiAoKCpwdHIrKyAhPSAoKEtHX1RPS19XUkFQX01TRz4+OCkmMHhmZikpIHx8CiAJICAgICgqcHRyKysgIT0gIChLR19UT0tfV1JBUF9NU0cgICAgJjB4ZmYpKSAgICkKLQkJZ290byBvdXQ7CisJCXJldHVybiBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CiAKIAkvKiBYWFggc2FuaXR5LWNoZWNrIGJvZHlzaXplPz8gKi8KIAogCS8qIGdldCB0aGUgc2lnbiBhbmQgc2VhbCBhbGdvcml0aG1zICovCiAKIAlzaWduYWxnID0gcHRyWzBdICsgKHB0clsxXSA8PCA4KTsKLQlzZWFsYWxnID0gcHRyWzJdICsgKHB0clszXSA8PCA4KTsKKwlpZiAoc2lnbmFsZyAhPSBTR05fQUxHX0RFU19NQUNfTUQ1KQorCQlyZXR1cm4gR1NTX1NfREVGRUNUSVZFX1RPS0VOOwogCi0JLyogU2FuaXR5IGNoZWNrcyAqLworCXNlYWxhbGcgPSBwdHJbMl0gKyAocHRyWzNdIDw8IDgpOworCWlmIChzZWFsYWxnICE9IFNFQUxfQUxHX0RFUykKKwkJcmV0dXJuIEdTU19TX0RFRkVDVElWRV9UT0tFTjsKIAogCWlmICgocHRyWzRdICE9IDB4ZmYpIHx8IChwdHJbNV0gIT0gMHhmZikpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHNlYWxhbGcgPT0gMHhmZmZmKQotCQlnb3RvIG91dDsKLQotCS8qIGluIHRoZSBjdXJyZW50IHNwZWMsIHRoZXJlIGlzIG9ubHkgb25lIHZhbGlkIHNlYWwgYWxnb3JpdGhtIHBlcgotCSAgIGtleSB0eXBlLCBzbyBhIHNpbXBsZSBjb21wYXJpc29uIGlzIG9rICovCi0KLQlpZiAoc2VhbGFsZyAhPSBrY3R4LT5zZWFsYWxnKQotCQlnb3RvIG91dDsKLQotCS8qIHRoZXJlIGFyZSBzZXZlcmFsIG1hcHBpbmdzIG9mIHNlYWwgYWxnb3JpdGhtcyB0byBzaWduIGFsZ29yaXRobXMsCi0JICAgYnV0IGZldyBlbm91Z2ggdGhhdCB3ZSBjYW4gdHJ5IHRoZW0gYWxsLiAqLwotCi0JaWYgKChrY3R4LT5zZWFsYWxnID09IFNFQUxfQUxHX05PTkUgJiYgc2lnbmFsZyA+IDEpIHx8Ci0JICAgIChrY3R4LT5zZWFsYWxnID09IFNFQUxfQUxHXzEgJiYgc2lnbmFsZyAhPSBTR05fQUxHXzMpIHx8Ci0JICAgIChrY3R4LT5zZWFsYWxnID09IFNFQUxfQUxHX0RFUzNLRCAmJgotCSAgICAgc2lnbmFsZyAhPSBTR05fQUxHX0hNQUNfU0hBMV9ERVMzX0tEKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CiAKIAlpZiAoZ3NzX2RlY3J5cHRfeGRyX2J1ZihrY3R4LT5lbmMsIGJ1ZiwKIAkJCXB0ciArIDIyIC0gKHVuc2lnbmVkIGNoYXIgKilidWYtPmhlYWRbMF0uaW92X2Jhc2UpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIEdTU19TX0RFRkVDVElWRV9UT0tFTjsKIAotCS8qIGNvbXB1dGUgdGhlIGNoZWNrc3VtIG9mIHRoZSBtZXNzYWdlICovCisJaWYgKG1ha2VfY2hlY2tzdW0oIm1kNSIsIHB0ciAtIDIsIDgsIGJ1ZiwKKwkJIHB0ciArIDIyIC0gKHVuc2lnbmVkIGNoYXIgKilidWYtPmhlYWRbMF0uaW92X2Jhc2UsICZtZDVja3N1bSkpCisJCXJldHVybiBHU1NfU19GQUlMVVJFOwogCi0JLyogaW5pdGlhbGl6ZSB0aGUgdGhlIGNrc3VtICovCi0Jc3dpdGNoIChzaWduYWxnKSB7Ci0JY2FzZSBTR05fQUxHX0RFU19NQUNfTUQ1OgotCQljaGVja3N1bV90eXBlID0gQ0tTVU1UWVBFX1JTQV9NRDU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IEdTU19TX0RFRkVDVElWRV9UT0tFTjsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChrcmI1X2VuY3J5cHQoa2N0eC0+c2VxLCBOVUxMLCBtZDVja3N1bS5kYXRhLAorCQkJICAgbWQ1Y2tzdW0uZGF0YSwgbWQ1Y2tzdW0ubGVuKSkKKwkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CiAKLQlzd2l0Y2ggKHNpZ25hbGcpIHsKLQljYXNlIFNHTl9BTEdfREVTX01BQ19NRDU6Ci0JCXJldCA9IG1ha2VfY2hlY2tzdW0oY2hlY2tzdW1fdHlwZSwgcHRyIC0gMiwgOCwgYnVmLAotCQkJIHB0ciArIDIyIC0gKHVuc2lnbmVkIGNoYXIgKilidWYtPmhlYWRbMF0uaW92X2Jhc2UsICZtZDVja3N1bSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQotCQlyZXQgPSBrcmI1X2VuY3J5cHQoa2N0eC0+c2VxLCBOVUxMLCBtZDVja3N1bS5kYXRhLAotCQkJCSAgIG1kNWNrc3VtLmRhdGEsIG1kNWNrc3VtLmxlbik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQotCQlpZiAobWVtY21wKG1kNWNrc3VtLmRhdGEgKyA4LCBwdHIgKyAxNCwgOCkpIHsKLQkJCXJldCA9IEdTU19TX0JBRF9TSUc7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSBHU1NfU19ERUZFQ1RJVkVfVE9LRU47Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAobWVtY21wKG1kNWNrc3VtLmRhdGEgKyA4LCBwdHIgKyAxNCwgOCkpCisJCXJldHVybiBHU1NfU19CQURfU0lHOwogCiAJLyogaXQgZ290IHRocm91Z2ggdW5zY2F0aGVkLiAgTWFrZSBzdXJlIHRoZSBjb250ZXh0IGlzIHVuZXhwaXJlZCAqLwogCiAJbm93ID0gZ2V0X3NlY29uZHMoKTsKIAotCXJldCA9IEdTU19TX0NPTlRFWFRfRVhQSVJFRDsKIAlpZiAobm93ID4ga2N0eC0+ZW5kdGltZSkKLQkJZ290byBvdXQ7CisJCXJldHVybiBHU1NfU19DT05URVhUX0VYUElSRUQ7CiAKIAkvKiBkbyBzZXF1ZW5jaW5nIGNoZWNrcyAqLwogCi0JcmV0ID0gR1NTX1NfQkFEX1NJRzsKLQlpZiAoKHJldCA9IGtyYjVfZ2V0X3NlcV9udW0oa2N0eC0+c2VxLCBwdHIgKyAxNCwgcHRyICsgNiwgJmRpcmVjdGlvbiwKLQkJCQkgICAgJnNlcW51bSkpKQotCQlnb3RvIG91dDsKKwlpZiAoa3JiNV9nZXRfc2VxX251bShrY3R4LT5zZXEsIHB0ciArIDE0LCBwdHIgKyA2LCAmZGlyZWN0aW9uLAorCQkJCSAgICAmc2VxbnVtKSkKKwkJcmV0dXJuIEdTU19TX0JBRF9TSUc7CiAKIAlpZiAoKGtjdHgtPmluaXRpYXRlICYmIGRpcmVjdGlvbiAhPSAweGZmKSB8fAogCSAgICAoIWtjdHgtPmluaXRpYXRlICYmIGRpcmVjdGlvbiAhPSAwKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiBHU1NfU19CQURfU0lHOwogCiAJLyogQ29weSB0aGUgZGF0YSBiYWNrIHRvIHRoZSByaWdodCBwb3NpdGlvbi4gIFhYWDogV291bGQgcHJvYmFibHkgYmUKIAkgKiBiZXR0ZXIgdG8gY29weSBhbmQgZW5jcnlwdCBhdCB0aGUgc2FtZSB0aW1lLiAqLwpAQCAtMzU0LDExICsyODQsOCBAQAogCWJ1Zi0+aGVhZFswXS5pb3ZfbGVuIC09IChkYXRhX3N0YXJ0IC0gb3JpZ19zdGFydCk7CiAJYnVmLT5sZW4gLT0gKGRhdGFfc3RhcnQgLSBvcmlnX3N0YXJ0KTsKIAotCXJldCA9IEdTU19TX0RFRkVDVElWRV9UT0tFTjsKIAlpZiAoZ3NzX2tyYjVfcmVtb3ZlX3BhZGRpbmcoYnVmLCBibG9ja3NpemUpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIEdTU19TX0RFRkVDVElWRV9UT0tFTjsKIAotCXJldCA9IEdTU19TX0NPTVBMRVRFOwotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIEdTU19TX0NPTVBMRVRFOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCmluZGV4IGJkZWRmNDUuLjQxNDY1MDcgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKQEAgLTc2LDE0MCArNzYsNzkgQEAKIAlxID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKIAlpZiAodW5saWtlbHkocSA+IGVuZCB8fCBxIDwgcCkpCiAJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwotCXJlcy0+ZGF0YSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlyZXMtPmRhdGEgPSBrbWVtZHVwKHAsIGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KHJlcy0+ZGF0YSA9PSBOVUxMKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JbWVtY3B5KHJlcy0+ZGF0YSwgcCwgbGVuKTsKIAlyZXR1cm4gcTsKIH0KIAotc3RhdGljIGlubGluZSBjb25zdCB2b2lkICoKLWdldF9rZXkoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqZW5kLCBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqKnJlcywKLQlpbnQgKnJlc2FsZykKLXsKLQlzdHJ1Y3QgeGRyX25ldG9iaglrZXkgPSB7IDAgfTsKLQlpbnQJCQlzZXRrZXkgPSAwOwotCWNoYXIJCQkqYWxnX25hbWU7Ci0KLQlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsIHJlc2FsZywgc2l6ZW9mKCpyZXNhbGcpKTsKLQlpZiAoSVNfRVJSKHApKQotCQlnb3RvIG91dF9lcnI7Ci0JcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmtleSk7Ci0JaWYgKElTX0VSUihwKSkKLQkJZ290byBvdXRfZXJyOwotCi0Jc3dpdGNoICgqcmVzYWxnKSB7Ci0JCWNhc2UgTklEX2Rlc19jYmM6Ci0JCQlhbGdfbmFtZSA9ICJjYmMoZGVzKSI7Ci0JCQlzZXRrZXkgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgTklEX2Nhc3Q1X2NiYzoKLQkJCS8qIFhYWFggaGVyZSBpbiBuYW1lIG9ubHksIG5vdCB1c2VkICovCi0JCQlhbGdfbmFtZSA9ICJjYmMoY2FzdDUpIjsKLQkJCXNldGtleSA9IDA7IC8qIFhYWCB3aWxsIG5lZWQgdG8gc2V0IHRvIDEgKi8KLQkJCWJyZWFrOwotCQljYXNlIE5JRF9tZDU6Ci0JCQlpZiAoa2V5LmxlbiA9PSAwKSB7Ci0JCQkJZHByaW50aygiUlBDOiBTUEtNMyBnZXRfa2V5OiBOSURfbWQ1IHplcm8gS2V5IGxlbmd0aFxuIik7Ci0JCQl9Ci0JCQlhbGdfbmFtZSA9ICJtZDUiOwotCQkJc2V0a2V5ID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZHByaW50aygiZ3NzX3Nwa20zX21lY2g6IHVuc3VwcG9ydGVkIGFsZ29yaXRobSAlZFxuIiwgKnJlc2FsZyk7Ci0JCQlnb3RvIG91dF9lcnJfZnJlZV9rZXk7Ci0JfQotCSpyZXMgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKGFsZ19uYW1lLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKLQlpZiAoSVNfRVJSKCpyZXMpKSB7Ci0JCXByaW50aygiZ3NzX3Nwa20zX21lY2g6IHVuYWJsZSB0byBpbml0aWFsaXplIGNyeXB0byBhbGdvcnRobSAlc1xuIiwgYWxnX25hbWUpOwotCQkqcmVzID0gTlVMTDsKLQkJZ290byBvdXRfZXJyX2ZyZWVfa2V5OwotCX0KLQlpZiAoc2V0a2V5KSB7Ci0JCWlmIChjcnlwdG9fYmxrY2lwaGVyX3NldGtleSgqcmVzLCBrZXkuZGF0YSwga2V5LmxlbikpIHsKLQkJCXByaW50aygiZ3NzX3Nwa20zX21lY2g6IGVycm9yIHNldHRpbmcga2V5IGZvciBjcnlwdG8gYWxnb3J0aG0gJXNcbiIsIGFsZ19uYW1lKTsKLQkJCWdvdG8gb3V0X2Vycl9mcmVlX3RmbTsKLQkJfQotCX0KLQotCWlmKGtleS5sZW4gPiAwKQotCQlrZnJlZShrZXkuZGF0YSk7Ci0JcmV0dXJuIHA7Ci0KLW91dF9lcnJfZnJlZV90Zm06Ci0JY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKCpyZXMpOwotb3V0X2Vycl9mcmVlX2tleToKLQlpZihrZXkubGVuID4gMCkKLQkJa2ZyZWUoa2V5LmRhdGEpOwotCXAgPSBFUlJfUFRSKC1FSU5WQUwpOwotb3V0X2VycjoKLQlyZXR1cm4gcDsKLX0KLQogc3RhdGljIGludAogZ3NzX2ltcG9ydF9zZWNfY29udGV4dF9zcGttMyhjb25zdCB2b2lkICpwLCBzaXplX3QgbGVuLAogCQkJCXN0cnVjdCBnc3NfY3R4ICpjdHhfaWQpCiB7CiAJY29uc3Qgdm9pZCAqZW5kID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IGNoYXIgKilwICsgbGVuKTsKIAlzdHJ1Y3QJc3BrbTNfY3R4ICpjdHg7CisJaW50CXZlcnNpb247CiAKIAlpZiAoIShjdHggPSBremFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCkpKQogCQlnb3RvIG91dF9lcnI7CiAKKwlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZ2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2Vycl9mcmVlX2N0eDsKKwlpZiAodmVyc2lvbiAhPSAxKSB7CisJCWRwcmludGsoIlJQQzogdW5rbm93biBzcGttMyB0b2tlbiBmb3JtYXQ6IG9ic29sZXRlIG5mcy11dGlscz9cbiIpOworCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CisJfQorCiAJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmN0eC0+Y3R4X2lkKTsKIAlpZiAoSVNfRVJSKHApKQogCQlnb3RvIG91dF9lcnJfZnJlZV9jdHg7CiAKLQlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZjdHgtPnFvcCwgc2l6ZW9mKGN0eC0+cW9wKSk7CisJcCA9IHNpbXBsZV9nZXRfYnl0ZXMocCwgZW5kLCAmY3R4LT5lbmR0aW1lLCBzaXplb2YoY3R4LT5lbmR0aW1lKSk7CiAJaWYgKElTX0VSUihwKSkKIAkJZ290byBvdXRfZXJyX2ZyZWVfY3R4X2lkOwogCiAJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmN0eC0+bWVjaF91c2VkKTsKIAlpZiAoSVNfRVJSKHApKQotCQlnb3RvIG91dF9lcnJfZnJlZV9tZWNoOworCQlnb3RvIG91dF9lcnJfZnJlZV9jdHhfaWQ7CiAKIAlwID0gc2ltcGxlX2dldF9ieXRlcyhwLCBlbmQsICZjdHgtPnJldF9mbGFncywgc2l6ZW9mKGN0eC0+cmV0X2ZsYWdzKSk7CiAJaWYgKElTX0VSUihwKSkKIAkJZ290byBvdXRfZXJyX2ZyZWVfbWVjaDsKIAotCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgJmN0eC0+cmVxX2ZsYWdzLCBzaXplb2YoY3R4LT5yZXFfZmxhZ3MpKTsKKwlwID0gc2ltcGxlX2dldF9uZXRvYmoocCwgZW5kLCAmY3R4LT5jb25mX2FsZyk7CiAJaWYgKElTX0VSUihwKSkKIAkJZ290byBvdXRfZXJyX2ZyZWVfbWVjaDsKIAotCXAgPSBzaW1wbGVfZ2V0X25ldG9iaihwLCBlbmQsICZjdHgtPnNoYXJlX2tleSk7CisJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmN0eC0+ZGVyaXZlZF9jb25mX2tleSk7CiAJaWYgKElTX0VSUihwKSkKLQkJZ290byBvdXRfZXJyX2ZyZWVfc19rZXk7CisJCWdvdG8gb3V0X2Vycl9mcmVlX2NvbmZfYWxnOwogCi0JcCA9IGdldF9rZXkocCwgZW5kLCAmY3R4LT5kZXJpdmVkX2NvbmZfa2V5LCAmY3R4LT5jb25mX2FsZyk7CisJcCA9IHNpbXBsZV9nZXRfbmV0b2JqKHAsIGVuZCwgJmN0eC0+aW50Z19hbGcpOwogCWlmIChJU19FUlIocCkpCi0JCWdvdG8gb3V0X2Vycl9mcmVlX3Nfa2V5OworCQlnb3RvIG91dF9lcnJfZnJlZV9jb25mX2tleTsKIAotCXAgPSBnZXRfa2V5KHAsIGVuZCwgJmN0eC0+ZGVyaXZlZF9pbnRlZ19rZXksICZjdHgtPmludGdfYWxnKTsKKwlwID0gc2ltcGxlX2dldF9uZXRvYmoocCwgZW5kLCAmY3R4LT5kZXJpdmVkX2ludGVnX2tleSk7CiAJaWYgKElTX0VSUihwKSkKLQkJZ290byBvdXRfZXJyX2ZyZWVfa2V5MTsKLQotCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgJmN0eC0+a2V5ZXN0Yl9hbGcsIHNpemVvZihjdHgtPmtleWVzdGJfYWxnKSk7Ci0JaWYgKElTX0VSUihwKSkKLQkJZ290byBvdXRfZXJyX2ZyZWVfa2V5MjsKLQotCXAgPSBzaW1wbGVfZ2V0X2J5dGVzKHAsIGVuZCwgJmN0eC0+b3dmX2FsZywgc2l6ZW9mKGN0eC0+b3dmX2FsZykpOwotCWlmIChJU19FUlIocCkpCi0JCWdvdG8gb3V0X2Vycl9mcmVlX2tleTI7CisJCWdvdG8gb3V0X2Vycl9mcmVlX2ludGdfYWxnOwogCiAJaWYgKHAgIT0gZW5kKQotCQlnb3RvIG91dF9lcnJfZnJlZV9rZXkyOworCQlnb3RvIG91dF9lcnJfZnJlZV9pbnRnX2tleTsKIAogCWN0eF9pZC0+aW50ZXJuYWxfY3R4X2lkID0gY3R4OwogCiAJZHByaW50aygiU3VjY2Vzc2Z1bGx5IGltcG9ydGVkIG5ldyBzcGttIGNvbnRleHQuXG4iKTsKIAlyZXR1cm4gMDsKIAotb3V0X2Vycl9mcmVlX2tleTI6Ci0JY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGN0eC0+ZGVyaXZlZF9pbnRlZ19rZXkpOwotb3V0X2Vycl9mcmVlX2tleTE6Ci0JY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGN0eC0+ZGVyaXZlZF9jb25mX2tleSk7Ci1vdXRfZXJyX2ZyZWVfc19rZXk6Ci0Ja2ZyZWUoY3R4LT5zaGFyZV9rZXkuZGF0YSk7CitvdXRfZXJyX2ZyZWVfaW50Z19rZXk6CisJa2ZyZWUoY3R4LT5kZXJpdmVkX2ludGVnX2tleS5kYXRhKTsKK291dF9lcnJfZnJlZV9pbnRnX2FsZzoKKwlrZnJlZShjdHgtPmludGdfYWxnLmRhdGEpOworb3V0X2Vycl9mcmVlX2NvbmZfa2V5OgorCWtmcmVlKGN0eC0+ZGVyaXZlZF9jb25mX2tleS5kYXRhKTsKK291dF9lcnJfZnJlZV9jb25mX2FsZzoKKwlrZnJlZShjdHgtPmNvbmZfYWxnLmRhdGEpOwogb3V0X2Vycl9mcmVlX21lY2g6CiAJa2ZyZWUoY3R4LT5tZWNoX3VzZWQuZGF0YSk7CiBvdXRfZXJyX2ZyZWVfY3R4X2lkOgpAQCAtMjIxLDEzICsxNjAsMTYgQEAKIH0KIAogc3RhdGljIHZvaWQKLWdzc19kZWxldGVfc2VjX2NvbnRleHRfc3BrbTModm9pZCAqaW50ZXJuYWxfY3R4KSB7Citnc3NfZGVsZXRlX3NlY19jb250ZXh0X3Nwa20zKHZvaWQgKmludGVybmFsX2N0eCkKK3sKIAlzdHJ1Y3Qgc3BrbTNfY3R4ICpzY3R4ID0gaW50ZXJuYWxfY3R4OwogCi0JY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHNjdHgtPmRlcml2ZWRfaW50ZWdfa2V5KTsKLQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoc2N0eC0+ZGVyaXZlZF9jb25mX2tleSk7Ci0Ja2ZyZWUoc2N0eC0+c2hhcmVfa2V5LmRhdGEpOworCWtmcmVlKHNjdHgtPmRlcml2ZWRfaW50ZWdfa2V5LmRhdGEpOworCWtmcmVlKHNjdHgtPmludGdfYWxnLmRhdGEpOworCWtmcmVlKHNjdHgtPmRlcml2ZWRfY29uZl9rZXkuZGF0YSk7CisJa2ZyZWUoc2N0eC0+Y29uZl9hbGcuZGF0YSk7CiAJa2ZyZWUoc2N0eC0+bWVjaF91c2VkLmRhdGEpOworCWtmcmVlKHNjdHgtPmN0eF9pZC5kYXRhKTsKIAlrZnJlZShzY3R4KTsKIH0KIApAQCAtMjM5LDcgKzE4MSw2IEBACiAJdTMyIG1hal9zdGF0ID0gMDsKIAlzdHJ1Y3Qgc3BrbTNfY3R4ICpzY3R4ID0gY3R4LT5pbnRlcm5hbF9jdHhfaWQ7CiAKLQlkcHJpbnRrKCJSUEM6IGdzc192ZXJpZnlfbWljX3Nwa20zIGNhbGxpbmcgc3BrbTNfcmVhZF90b2tlblxuIik7CiAJbWFqX3N0YXQgPSBzcGttM19yZWFkX3Rva2VuKHNjdHgsIGNoZWNrc3VtLCBzaWduYnVmLCBTUEtNX01JQ19UT0spOwogCiAJZHByaW50aygiUlBDOiBnc3NfdmVyaWZ5X21pY19zcGttMyByZXR1cm5pbmcgJWRcbiIsIG1hal9zdGF0KTsKQEAgLTI1NCwxMCArMTk1LDkgQEAKIAl1MzIgZXJyID0gMDsKIAlzdHJ1Y3Qgc3BrbTNfY3R4ICpzY3R4ID0gY3R4LT5pbnRlcm5hbF9jdHhfaWQ7CiAKLQlkcHJpbnRrKCJSUEM6IGdzc19nZXRfbWljX3Nwa20zXG4iKTsKLQogCWVyciA9IHNwa20zX21ha2VfdG9rZW4oc2N0eCwgbWVzc2FnZV9idWZmZXIsCi0JCQkgICAgICBtZXNzYWdlX3Rva2VuLCBTUEtNX01JQ19UT0spOworCQkJCW1lc3NhZ2VfdG9rZW4sIFNQS01fTUlDX1RPSyk7CisJZHByaW50aygiUlBDOiBnc3NfZ2V0X21pY19zcGttMyByZXR1cm5pbmcgJWRcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfc2VhbC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfc2VhbC5jCmluZGV4IDE4Yzc4NjIuLmIxNzlkNTggMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX3NlYWwuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19zZWFsLmMKQEAgLTM5LDExICszOSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3Nfc3BrbTMuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CiAKICNpZmRlZiBSUENfREVCVUcKICMgZGVmaW5lIFJQQ0RCR19GQUNJTElUWSAgICAgICAgUlBDREJHX0FVVEgKICNlbmRpZgogCitjb25zdCBzdHJ1Y3QgeGRyX25ldG9iaiBobWFjX21kNV9vaWQgPSB7IDgsICJceDJCXHgwNlx4MDFceDA1XHgwNVx4MDhceDAxXHgwMSJ9OworY29uc3Qgc3RydWN0IHhkcl9uZXRvYmogY2FzdDVfY2JjX29pZCA9IHs5LCAiXHgyQVx4ODZceDQ4XHg4Nlx4RjZceDdEXHgwN1x4NDJceDBBIn07CisKIC8qCiAgKiBzcGttM19tYWtlX3Rva2VuKCkKICAqCkBAIC02NiwyOSArNzIsMjMgQEAKIAlpbnQJCQljdHhlbGVuID0gMCwgY3R4emJpdCA9IDA7CiAJaW50CQkJbWQ1ZWxlbiA9IDAsIG1kNXpiaXQgPSAwOwogCi0JZHByaW50aygiUlBDOiBzcGttM19tYWtlX3Rva2VuXG4iKTsKLQogCW5vdyA9IGppZmZpZXM7CiAKIAlpZiAoY3R4LT5jdHhfaWQubGVuICE9IDE2KSB7CiAJCWRwcmludGsoIlJQQzogc3BrbTNfbWFrZV90b2tlbiBCQUQgY3R4X2lkLmxlbiAlZFxuIiwKLQkJCWN0eC0+Y3R4X2lkLmxlbik7CisJCQkJY3R4LT5jdHhfaWQubGVuKTsKIAkJZ290byBvdXRfZXJyOwogCX0KLQkJCi0Jc3dpdGNoIChjdHgtPmludGdfYWxnKSB7Ci0JCWNhc2UgTklEX21kNToKLQkJCWNoZWNrc3VtX3R5cGUgPSBDS1NVTVRZUEVfUlNBX01ENTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZHByaW50aygiUlBDOiBnc3Nfc3BrbTNfc2VhbDogY3R4LT5zaWduYWxnICVkIG5vdCIKLQkJCQkiIHN1cHBvcnRlZFxuIiwgY3R4LT5pbnRnX2FsZyk7Ci0JCQlnb3RvIG91dF9lcnI7Ci0JfQotCS8qIFhYWCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IFdSQVAsIHBlcmhhcHMgd2UgZG9uJ3QgY2FyZS4uLiAqLwotCWlmIChjdHgtPmNvbmZfYWxnICE9IE5JRF9jYXN0NV9jYmMpIHsKLQkJZHByaW50aygiUlBDOiBnc3Nfc3BrbTNfc2VhbDogY3R4LT5zZWFsYWxnICVkIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQljdHgtPmNvbmZfYWxnKTsKKworCWlmICghZ19PSURfZXF1YWwoJmN0eC0+aW50Z19hbGcsICZobWFjX21kNV9vaWQpKSB7CisJCWRwcmludGsoIlJQQzogZ3NzX3Nwa20zX3NlYWw6IHVuc3VwcG9ydGVkIEktQUxHIGFsZ29yaXRobS4iCisJCQkJIm9ubHkgc3VwcG9ydCBobWFjLW1kNSBJLUFMRy5cbiIpOworCQlnb3RvIG91dF9lcnI7CisJfSBlbHNlCisJCWNoZWNrc3VtX3R5cGUgPSBDS1NVTVRZUEVfSE1BQ19NRDU7CisKKwlpZiAoIWdfT0lEX2VxdWFsKCZjdHgtPmNvbmZfYWxnLCAmY2FzdDVfY2JjX29pZCkpIHsKKwkJZHByaW50aygiUlBDOiBnc3Nfc3BrbTNfc2VhbDogdW5zdXBwb3J0ZWQgQy1BTEcgYWxnb3JpdGhtXG4iKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIApAQCAtOTYsMTAgKzk2LDEwIEBACiAJCS8qIENhbGN1bGF0ZSBjaGVja3N1bSBvdmVyIHRoZSBtaWMtaGVhZGVyICovCiAJCWFzbjFfYml0c3RyaW5nX2xlbigmY3R4LT5jdHhfaWQsICZjdHhlbGVuLCAmY3R4emJpdCk7CiAJCXNwa20zX21pY19oZWFkZXIoJm1pY19oZHIuZGF0YSwgJm1pY19oZHIubGVuLCBjdHgtPmN0eF9pZC5kYXRhLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgY3R4ZWxlbiwgY3R4emJpdCk7Ci0KLQkJaWYgKG1ha2VfY2hlY2tzdW0oY2hlY2tzdW1fdHlwZSwgbWljX2hkci5kYXRhLCBtaWNfaGRyLmxlbiwgCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgMCwgJm1kNWNrc3VtKSkKKwkJCQljdHhlbGVuLCBjdHh6Yml0KTsKKwkJaWYgKG1ha2Vfc3BrbTNfY2hlY2tzdW0oY2hlY2tzdW1fdHlwZSwgJmN0eC0+ZGVyaXZlZF9pbnRlZ19rZXksCisJCQkJCShjaGFyICopbWljX2hkci5kYXRhLCBtaWNfaGRyLmxlbiwKKwkJCQkJdGV4dCwgMCwgJm1kNWNrc3VtKSkKIAkJCWdvdG8gb3V0X2VycjsKIAogCQlhc24xX2JpdHN0cmluZ19sZW4oJm1kNWNrc3VtLCAmbWQ1ZWxlbiwgJm1kNXpiaXQpOwpAQCAtMTIxLDcgKzEyMSw2NiBAQAogCiAJcmV0dXJuICBHU1NfU19DT01QTEVURTsKIG91dF9lcnI6CisJaWYgKG1kNWNrc3VtLmRhdGEpCisJCWtmcmVlKG1kNWNrc3VtLmRhdGEpOworCiAJdG9rZW4tPmRhdGEgPSBOVUxMOwogCXRva2VuLT5sZW4gPSAwOwogCXJldHVybiBHU1NfU19GQUlMVVJFOwogfQorCitzdGF0aWMgaW50CitzcGttM19jaGVja3N1bW1lcihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MgPSBkYXRhOworCisJcmV0dXJuIGNyeXB0b19oYXNoX3VwZGF0ZShkZXNjLCBzZywgc2ctPmxlbmd0aCk7Cit9CisKKy8qIGNoZWNrc3VtIHRoZSBwbGFpbnRleHQgZGF0YSBhbmQgaGRybGVuIGJ5dGVzIG9mIHRoZSB0b2tlbiBoZWFkZXIgKi8KK3MzMgorbWFrZV9zcGttM19jaGVja3N1bShzMzIgY2tzdW10eXBlLCBzdHJ1Y3QgeGRyX25ldG9iaiAqa2V5LCBjaGFyICpoZWFkZXIsCisJCSAgICB1bnNpZ25lZCBpbnQgaGRybGVuLCBzdHJ1Y3QgeGRyX2J1ZiAqYm9keSwKKwkJICAgIHVuc2lnbmVkIGludCBib2R5X29mZnNldCwgc3RydWN0IHhkcl9uZXRvYmogKmNrc3VtKQoreworCWNoYXIJCQkJKmNrc3VtbmFtZTsKKwlzdHJ1Y3QgaGFzaF9kZXNjCQlkZXNjOyAvKiBYWFggYWRkIHRvIGN0eD8gKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJCXNnWzFdOworCWludCBlcnI7CisKKwlzd2l0Y2ggKGNrc3VtdHlwZSkgeworCQljYXNlIENLU1VNVFlQRV9ITUFDX01ENToKKwkJCWNrc3VtbmFtZSA9ICJtZDUiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKCJSUEM6ICAgICAgc3BrbTNfbWFrZV9jaGVja3N1bToiCisJCQkJCSIgdW5zdXBwb3J0ZWQgY2hlY2tzdW0gJWQiLCBja3N1bXR5cGUpOworCQkJcmV0dXJuIEdTU19TX0ZBSUxVUkU7CisJfQorCisJaWYgKGtleS0+ZGF0YSA9PSBOVUxMIHx8IGtleS0+bGVuIDw9IDApIHJldHVybiBHU1NfU19GQUlMVVJFOworCisJZGVzYy50Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaChja3N1bW5hbWUsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoZGVzYy50Zm0pKQorCQlyZXR1cm4gR1NTX1NfRkFJTFVSRTsKKwlja3N1bS0+bGVuID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShkZXNjLnRmbSk7CisJZGVzYy5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKworCWVyciA9IGNyeXB0b19oYXNoX3NldGtleShkZXNjLnRmbSwga2V5LT5kYXRhLCBrZXktPmxlbik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlzZ19zZXRfYnVmKHNnLCBoZWFkZXIsIGhkcmxlbik7CisJY3J5cHRvX2hhc2hfdXBkYXRlKCZkZXNjLCBzZywgMSk7CisKKwl4ZHJfcHJvY2Vzc19idWYoYm9keSwgYm9keV9vZmZzZXQsIGJvZHktPmxlbiAtIGJvZHlfb2Zmc2V0LAorCQkJc3BrbTNfY2hlY2tzdW1tZXIsICZkZXNjKTsKKwljcnlwdG9faGFzaF9maW5hbCgmZGVzYywgY2tzdW0tPmRhdGEpOworCitvdXQ6CisJY3J5cHRvX2ZyZWVfaGFzaChkZXNjLnRmbSk7CisKKwlyZXR1cm4gZXJyID8gR1NTX1NfRkFJTFVSRSA6IDA7Cit9CisKK0VYUE9SVF9TWU1CT0wobWFrZV9zcGttM19jaGVja3N1bSk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM190b2tlbi5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfdG9rZW4uYwppbmRleCA4NTRhOTgzLi4zNTE4OGI2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM190b2tlbi5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX3Rva2VuLmMKQEAgLTE3MiwxMCArMTcyLDEwIEBACiAJKih1OCAqKWhwdHIrKyA9IHpiaXQ7CiAJbWVtY3B5KGhwdHIsIGN0eGRhdGEsIGVsZW4pOwogCWhwdHIgKz0gZWxlbjsKLQkqaGRybGVuID0gaHB0ciAtIHRvcDsgCisJKmhkcmxlbiA9IGhwdHIgLSB0b3A7CiB9Ci0JCQotLyogCisKKy8qCiAgKiBzcGttM19taWNfaW5uZXJjb250ZXh0X3Rva2VuKCkKICAqCiAgKiAqdG9rcCBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgU1BLTV9NSUMgdG9rZW4gIGRlc2NyaWJlZCAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX3Vuc2VhbC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfdW5zZWFsLmMKaW5kZXggODUzN2Y1OC4uZTU0NTgxYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfdW5zZWFsLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfdW5zZWFsLmMKQEAgLTU0LDcwICs1NCw3MCBAQAogCQlzdHJ1Y3QgeGRyX2J1ZiAqbWVzc2FnZV9idWZmZXIsIC8qIHNpZ25idWYgKi8KIAkJaW50IHRva3R5cGUpCiB7CisJczMyCQkJY2hlY2tzdW1fdHlwZTsKIAlzMzIJCQljb2RlOwogCXN0cnVjdCB4ZHJfbmV0b2JqCXdpcmVfY2tzdW0gPSB7LmxlbiA9MCwgLmRhdGEgPSBOVUxMfTsKIAljaGFyCQkJY2tzdW1kYXRhWzE2XTsKIAlzdHJ1Y3QgeGRyX25ldG9iagltZDVja3N1bSA9IHsubGVuID0gMCwgLmRhdGEgPSBja3N1bWRhdGF9OwogCXVuc2lnbmVkIGNoYXIJCSpwdHIgPSAodW5zaWduZWQgY2hhciAqKXJlYWRfdG9rZW4tPmRhdGE7Ci0JdW5zaWduZWQgY2hhciAgICAgICAgICAgKmNrc3VtOworCXVuc2lnbmVkIGNoYXIJCSpja3N1bTsKIAlpbnQJCQlib2R5c2l6ZSwgbWQ1ZWxlbjsKIAlpbnQJCQltaWNfaGRybGVuOwogCXUzMgkJCXJldCA9IEdTU19TX0RFRkVDVElWRV9UT0tFTjsKIAotCWRwcmludGsoIlJQQzogc3BrbTNfcmVhZF90b2tlbiByZWFkX3Rva2VuLT5sZW4gJWRcbiIsIHJlYWRfdG9rZW4tPmxlbik7Ci0KIAlpZiAoZ192ZXJpZnlfdG9rZW5faGVhZGVyKChzdHJ1Y3QgeGRyX25ldG9iaiAqKSAmY3R4LT5tZWNoX3VzZWQsCiAJCQkJCSZib2R5c2l6ZSwgJnB0ciwgcmVhZF90b2tlbi0+bGVuKSkKIAkJZ290byBvdXQ7CiAKIAkvKiBkZWNvZGUgdGhlIHRva2VuICovCiAKLQlpZiAodG9rdHlwZSA9PSBTUEtNX01JQ19UT0spIHsKLQotCQlpZiAoKHJldCA9IHNwa20zX3ZlcmlmeV9taWNfdG9rZW4oJnB0ciwgJm1pY19oZHJsZW4sICZja3N1bSkpKSAKLQkJCWdvdG8gb3V0OwotCi0JCWlmICgqY2tzdW0rKyAhPSAweDAzKSB7Ci0JCQlkcHJpbnRrKCJSUEM6IHNwa20zX3JlYWRfdG9rZW4gQkFEIGNoZWNrc3VtIHR5cGVcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJbWQ1ZWxlbiA9ICpja3N1bSsrOyAKLQkJY2tzdW0rKzsgCS8qIG1vdmUgcGFzdCB0aGUgemJpdCAqLwotCQotCQlpZighZGVjb2RlX2FzbjFfYml0c3RyaW5nKCZ3aXJlX2Nrc3VtLCBja3N1bSwgbWQ1ZWxlbiAtIDEsIDE2KSkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIEhBUkQgQ09ERUQgRk9SIE1ENSAqLwotCi0JCS8qIGNvbXB1dGUgdGhlIGNoZWNrc3VtIG9mIHRoZSBtZXNzYWdlLgotCQkqICBwdHIgKyAyID0gc3RhcnQgb2YgaGVhZGVyIHBpZWNlIG9mIGNoZWNrc3VtCi0JCSogIG1pY19oZHJsZW4gKyAyID0gbGVuZ3RoIG9mIGhlYWRlciBwaWVjZSBvZiBjaGVja3N1bQotCQkqLwotCQlyZXQgPSBHU1NfU19ERUZFQ1RJVkVfVE9LRU47Ci0JCWNvZGUgPSBtYWtlX2NoZWNrc3VtKENLU1VNVFlQRV9SU0FfTUQ1LCBwdHIgKyAyLCAKLQkJCQkJbWljX2hkcmxlbiArIDIsIAotCQkgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2J1ZmZlciwgMCwgJm1kNWNrc3VtKTsKLQotCQlpZiAoY29kZSkKLQkJCWdvdG8gb3V0OwotCi0JCWRwcmludGsoIlJQQzogc3BrbTNfcmVhZF90b2tlbjogZGlnZXN0IHdpcmVfY2tzdW0ubGVuICVkOlxuIiwgCi0JCQl3aXJlX2Nrc3VtLmxlbik7Ci0JCWRwcmludGsoIiAgICAgICAgICBtZDVja3N1bS5kYXRhXG4iKTsKLQkJcHJpbnRfaGV4bCgodTMyICopIG1kNWNrc3VtLmRhdGEsIDE2LCAwKTsKLQkJZHByaW50aygiICAgICAgICAgIGNrc3VtLmRhdGE6XG4iKTsKLQkJcHJpbnRfaGV4bCgodTMyICopIHdpcmVfY2tzdW0uZGF0YSwgd2lyZV9ja3N1bS5sZW4sIDApOwotCi0JCXJldCA9IEdTU19TX0JBRF9TSUc7Ci0JCWNvZGUgPSBtZW1jbXAobWQ1Y2tzdW0uZGF0YSwgd2lyZV9ja3N1bS5kYXRhLCB3aXJlX2Nrc3VtLmxlbik7Ci0JCWlmIChjb2RlKQotCQkJZ290byBvdXQ7Ci0KLQl9IGVsc2UgeyAKLQkJZHByaW50aygiUlBDOiBCQUQgb3IgVU5TVVBQT1JURUQgU1BLTTMgdG9rZW4gdHlwZTogJWRcbiIsdG9rdHlwZSk7CisJaWYgKHRva3R5cGUgIT0gU1BLTV9NSUNfVE9LKSB7CisJCWRwcmludGsoIlJQQzogQkFEIFNQS00zIHRva2VuIHR5cGU6ICVkXG4iLCB0b2t0eXBlKTsKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKChyZXQgPSBzcGttM192ZXJpZnlfbWljX3Rva2VuKCZwdHIsICZtaWNfaGRybGVuLCAmY2tzdW0pKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKmNrc3VtKysgIT0gMHgwMykgeworCQlkcHJpbnRrKCJSUEM6IHNwa20zX3JlYWRfdG9rZW4gQkFEIGNoZWNrc3VtIHR5cGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisJbWQ1ZWxlbiA9ICpja3N1bSsrOworCWNrc3VtKys7IAkvKiBtb3ZlIHBhc3QgdGhlIHpiaXQgKi8KKworCWlmICghZGVjb2RlX2FzbjFfYml0c3RyaW5nKCZ3aXJlX2Nrc3VtLCBja3N1bSwgbWQ1ZWxlbiAtIDEsIDE2KSkKKwkJZ290byBvdXQ7CisKKwkvKiBIQVJEIENPREVEIEZPUiBNRDUgKi8KKworCS8qIGNvbXB1dGUgdGhlIGNoZWNrc3VtIG9mIHRoZSBtZXNzYWdlLgorCSAqIHB0ciArIDIgPSBzdGFydCBvZiBoZWFkZXIgcGllY2Ugb2YgY2hlY2tzdW0KKwkgKiBtaWNfaGRybGVuICsgMiA9IGxlbmd0aCBvZiBoZWFkZXIgcGllY2Ugb2YgY2hlY2tzdW0KKwkgKi8KKwlyZXQgPSBHU1NfU19ERUZFQ1RJVkVfVE9LRU47CisJaWYgKCFnX09JRF9lcXVhbCgmY3R4LT5pbnRnX2FsZywgJmhtYWNfbWQ1X29pZCkpIHsKKwkJZHByaW50aygiUlBDOiBnc3Nfc3BrbTNfc2VhbDogdW5zdXBwb3J0ZWQgSS1BTEcgYWxnb3JpdGhtXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJY2hlY2tzdW1fdHlwZSA9IENLU1VNVFlQRV9ITUFDX01ENTsKKworCWNvZGUgPSBtYWtlX3Nwa20zX2NoZWNrc3VtKGNoZWNrc3VtX3R5cGUsCisJCSZjdHgtPmRlcml2ZWRfaW50ZWdfa2V5LCBwdHIgKyAyLCBtaWNfaGRybGVuICsgMiwKKwkJbWVzc2FnZV9idWZmZXIsIDAsICZtZDVja3N1bSk7CisKKwlpZiAoY29kZSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBHU1NfU19CQURfU0lHOworCWNvZGUgPSBtZW1jbXAobWQ1Y2tzdW0uZGF0YSwgd2lyZV9ja3N1bS5kYXRhLCB3aXJlX2Nrc3VtLmxlbik7CisJaWYgKGNvZGUpIHsKKwkJZHByaW50aygiUlBDOiBiYWQgTUlDIGNoZWNrc3VtXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisKIAkvKiBYWFg6IG5lZWQgdG8gYWRkIGV4cGlyYXRpb24gYW5kIHNlcXVlbmNpbmcgKi8KIAlyZXQgPSBHU1NfU19DT01QTEVURTsKIG91dDoKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwppbmRleCAxZjBmMDc5Li4wNjZjNjRhIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCkBAIC0xMTMsOSArMTEzLDcgQEAKIHN0YXRpYyBpbnQgZHVwX3RvX25ldG9iaihzdHJ1Y3QgeGRyX25ldG9iaiAqZHN0LCBjaGFyICpzcmMsIGludCBsZW4pCiB7CiAJZHN0LT5sZW4gPSBsZW47Ci0JZHN0LT5kYXRhID0gKGxlbiA/IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKSA6IE5VTEwpOwotCWlmIChkc3QtPmRhdGEpCi0JCW1lbWNweShkc3QtPmRhdGEsIHNyYywgbGVuKTsKKwlkc3QtPmRhdGEgPSAobGVuID8ga21lbWR1cChzcmMsIGxlbiwgR0ZQX0tFUk5FTCkgOiBOVUxMKTsKIAlpZiAobGVuICYmICFkc3QtPmRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCXJldHVybiAwOwpAQCAtNzU2LDEwICs3NTQsOSBAQAogCWlmICghbmV3KQogCQlnb3RvIG91dDsKIAlrcmVmX2luaXQoJm5ldy0+aC5yZWYpOwotCW5ldy0+aC5uYW1lID0ga21hbGxvYyhzdHJsZW4obmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwluZXctPmgubmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXctPmgubmFtZSkKIAkJZ290byBvdXRfZnJlZV9kb207Ci0Jc3RyY3B5KG5ldy0+aC5uYW1lLCBuYW1lKTsKIAluZXctPmguZmxhdm91ciA9ICZzdmNhdXRob3BzX2dzczsKIAluZXctPnBzZXVkb2ZsYXZvciA9IHBzZXVkb2ZsYXZvcjsKIApAQCAtODA3LDE5ICs4MDQsMTkgQEAKIAogCWludGVnX2xlbiA9IHN2Y19nZXRubCgmYnVmLT5oZWFkWzBdKTsKIAlpZiAoaW50ZWdfbGVuICYgMykKLQkJZ290byBvdXQ7CisJCXJldHVybiBzdGF0OwogCWlmIChpbnRlZ19sZW4gPiBidWYtPmxlbikKLQkJZ290byBvdXQ7CisJCXJldHVybiBzdGF0OwogCWlmICh4ZHJfYnVmX3N1YnNlZ21lbnQoYnVmLCAmaW50ZWdfYnVmLCAwLCBpbnRlZ19sZW4pKQogCQlCVUcoKTsKIAkvKiBjb3B5IG91dCBtaWMuLi4gKi8KIAlpZiAocmVhZF91MzJfZnJvbV94ZHJfYnVmKGJ1ZiwgaW50ZWdfbGVuLCAmbWljLmxlbikpCiAJCUJVRygpOwogCWlmIChtaWMubGVuID4gUlBDX01BWF9BVVRIX1NJWkUpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gc3RhdDsKIAltaWMuZGF0YSA9IGttYWxsb2MobWljLmxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtaWMuZGF0YSkKLQkJZ290byBvdXQ7CisJCXJldHVybiBzdGF0OwogCWlmIChyZWFkX2J5dGVzX2Zyb21feGRyX2J1ZihidWYsIGludGVnX2xlbiArIDQsIG1pYy5kYXRhLCBtaWMubGVuKSkKIAkJZ290byBvdXQ7CiAJbWFqX3N0YXQgPSBnc3NfdmVyaWZ5X21pYyhjdHgsICZpbnRlZ19idWYsICZtaWMpOwpAQCAtODI5LDYgKzgyNiw3IEBACiAJCWdvdG8gb3V0OwogCXN0YXQgPSAwOwogb3V0OgorCWtmcmVlKG1pYy5kYXRhKTsKIAlyZXR1cm4gc3RhdDsKIH0KIApAQCAtMTA2OCw3ICsxMDY2LDcgQEAKIAkJfQogCQlzd2l0Y2goY2FjaGVfY2hlY2soJnJzaV9jYWNoZSwgJnJzaXAtPmgsICZycXN0cC0+cnFfY2hhbmRsZSkpIHsKIAkJY2FzZSAtRUFHQUlOOgotCQkJZ290byBkcm9wOworCQljYXNlIC1FVElNRURPVVQ6CiAJCWNhc2UgLUVOT0VOVDoKIAkJCWdvdG8gZHJvcDsKIAkJY2FzZSAwOgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jYWNoZS5jIGIvbmV0L3N1bnJwYy9jYWNoZS5jCmluZGV4IDAwY2IzODguLjE0Mjc0NDkgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2FjaGUuYworKysgYi9uZXQvc3VucnBjL2NhY2hlLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2RlZmluZQkgUlBDREJHX0ZBQ0lMSVRZIFJQQ0RCR19DQUNIRQogCi1zdGF0aWMgdm9pZCBjYWNoZV9kZWZlcl9yZXEoc3RydWN0IGNhY2hlX3JlcSAqcmVxLCBzdHJ1Y3QgY2FjaGVfaGVhZCAqaXRlbSk7CitzdGF0aWMgaW50IGNhY2hlX2RlZmVyX3JlcShzdHJ1Y3QgY2FjaGVfcmVxICpyZXEsIHN0cnVjdCBjYWNoZV9oZWFkICppdGVtKTsKIHN0YXRpYyB2b2lkIGNhY2hlX3JldmlzaXRfcmVxdWVzdChzdHJ1Y3QgY2FjaGVfaGVhZCAqaXRlbSk7CiAKIHN0YXRpYyB2b2lkIGNhY2hlX2luaXQoc3RydWN0IGNhY2hlX2hlYWQgKmgpCkBAIC0xODUsNiArMTg1LDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgaWYgdGhlIGNhY2hlX2hlYWQgY2FuIGJlIHVzZWQsIG9yIGNhY2hlX3B1dHMgaXQgYW5kIHJldHVybnMKICAqIC1FQUdBSU4gaWYgdXBjYWxsIGlzIHBlbmRpbmcsCisgKiAtRVRJTUVET1VUIGlmIHVwY2FsbCBmYWlsZWQgYW5kIHNob3VsZCBiZSByZXRyaWVkLAogICogLUVOT0VOVCBpZiBjYWNoZSBlbnRyeSB3YXMgbmVnYXRpdmUKICAqLwogaW50IGNhY2hlX2NoZWNrKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCwKQEAgLTIzNiw3ICsyMzcsOCBAQAogCX0KIAogCWlmIChydiA9PSAtRUFHQUlOKQotCQljYWNoZV9kZWZlcl9yZXEocnFzdHAsIGgpOworCQlpZiAoY2FjaGVfZGVmZXJfcmVxKHJxc3RwLCBoKSAhPSAwKQorCQkJcnYgPSAtRVRJTUVET1VUOwogCiAJaWYgKHJ2KQogCQljYWNoZV9wdXQoaCwgZGV0YWlsKTsKQEAgLTI4NCw4ICsyODYsOCBAQAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29udGVudF9maWxlX29wZXJhdGlvbnM7CiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjYWNoZV9mbHVzaF9vcGVyYXRpb25zOwogCi1zdGF0aWMgdm9pZCBkb19jYWNoZV9jbGVhbih2b2lkICpkYXRhKTsKLXN0YXRpYyBERUNMQVJFX1dPUksoY2FjaGVfY2xlYW5lciwgZG9fY2FjaGVfY2xlYW4sIE5VTEwpOworc3RhdGljIHZvaWQgZG9fY2FjaGVfY2xlYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhjYWNoZV9jbGVhbmVyLCBkb19jYWNoZV9jbGVhbik7CiAKIHZvaWQgY2FjaGVfcmVnaXN0ZXIoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCiB7CkBAIC0zMzcsNyArMzM5LDcgQEAKIAlzcGluX3VubG9jaygmY2FjaGVfbGlzdF9sb2NrKTsKIAogCS8qIHN0YXJ0IHRoZSBjbGVhbmluZyBwcm9jZXNzICovCi0Jc2NoZWR1bGVfd29yaygmY2FjaGVfY2xlYW5lcik7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjYWNoZV9jbGVhbmVyLCAwKTsKIH0KIAogaW50IGNhY2hlX3VucmVnaXN0ZXIoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCkBAIC00NjEsNyArNDYzLDcgQEAKIC8qCiAgKiBXZSB3YW50IHRvIHJlZ3VsYXJseSBjbGVhbiB0aGUgY2FjaGUsIHNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgc29tZSB3b3JrIC4uLgogICovCi1zdGF0aWMgdm9pZCBkb19jYWNoZV9jbGVhbih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZG9fY2FjaGVfY2xlYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCBkZWxheSA9IDU7CiAJaWYgKGNhY2hlX2NsZWFuKCkgPT0gLTEpCkBAIC01MjMsMTQgKzUyNSwyMSBAQAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgY2FjaGVfZGVmZXJfaGFzaFtERlJfSEFTSFNJWkVdOwogc3RhdGljIGludCBjYWNoZV9kZWZlcl9jbnQ7CiAKLXN0YXRpYyB2b2lkIGNhY2hlX2RlZmVyX3JlcShzdHJ1Y3QgY2FjaGVfcmVxICpyZXEsIHN0cnVjdCBjYWNoZV9oZWFkICppdGVtKQorc3RhdGljIGludCBjYWNoZV9kZWZlcl9yZXEoc3RydWN0IGNhY2hlX3JlcSAqcmVxLCBzdHJ1Y3QgY2FjaGVfaGVhZCAqaXRlbSkKIHsKIAlzdHJ1Y3QgY2FjaGVfZGVmZXJyZWRfcmVxICpkcmVxOwogCWludCBoYXNoID0gREZSX0hBU0goaXRlbSk7CiAKKwlpZiAoY2FjaGVfZGVmZXJfY250ID49IERGUl9NQVgpIHsKKwkJLyogdG9vIG11Y2ggaW4gdGhlIGNhY2hlLCByYW5kb21seSBkcm9wIHRoaXMgb25lLAorCQkgKiBvciBjb250aW51ZSBhbmQgZHJvcCB0aGUgb2xkZXN0IGJlbG93CisJCSAqLworCQlpZiAobmV0X3JhbmRvbSgpJjEpCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CiAJZHJlcSA9IHJlcS0+ZGVmZXIocmVxKTsKIAlpZiAoZHJlcSA9PSBOVUxMKQotCQlyZXR1cm47CisJCXJldHVybiAtRVRJTUVET1VUOwogCiAJZHJlcS0+aXRlbSA9IGl0ZW07CiAJZHJlcS0+cmVjdl90aW1lID0gZ2V0X3NlY29uZHMoKTsKQEAgLTU0NiwxNyArNTU1LDggQEAKIAkvKiBpdCBpcyBpbiwgbm93IG1heWJlIGNsZWFuIHVwICovCiAJZHJlcSA9IE5VTEw7CiAJaWYgKCsrY2FjaGVfZGVmZXJfY250ID4gREZSX01BWCkgewotCQkvKiB0b28gbXVjaCBpbiB0aGUgY2FjaGUsIHJhbmRvbWx5IGRyb3AKLQkJICogZmlyc3Qgb3IgbGFzdAotCQkgKi8KLQkJaWYgKG5ldF9yYW5kb20oKSYxKSAKLQkJCWRyZXEgPSBsaXN0X2VudHJ5KGNhY2hlX2RlZmVyX2xpc3QubmV4dCwKLQkJCQkJICBzdHJ1Y3QgY2FjaGVfZGVmZXJyZWRfcmVxLAotCQkJCQkgIHJlY2VudCk7Ci0JCWVsc2UKLQkJCWRyZXEgPSBsaXN0X2VudHJ5KGNhY2hlX2RlZmVyX2xpc3QucHJldiwKLQkJCQkJICBzdHJ1Y3QgY2FjaGVfZGVmZXJyZWRfcmVxLAotCQkJCQkgIHJlY2VudCk7CisJCWRyZXEgPSBsaXN0X2VudHJ5KGNhY2hlX2RlZmVyX2xpc3QucHJldiwKKwkJCQkgIHN0cnVjdCBjYWNoZV9kZWZlcnJlZF9yZXEsIHJlY2VudCk7CiAJCWxpc3RfZGVsKCZkcmVxLT5yZWNlbnQpOwogCQlsaXN0X2RlbCgmZHJlcS0+aGFzaCk7CiAJCWNhY2hlX2RlZmVyX2NudC0tOwpAQCAtNTcxLDYgKzU3MSw3IEBACiAJCS8qIG11c3QgaGF2ZSBqdXN0IGJlZW4gdmFsaWRhdGVkLi4uICovCiAJCWNhY2hlX3JldmlzaXRfcmVxdWVzdChpdGVtKTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNhY2hlX3JldmlzaXRfcmVxdWVzdChzdHJ1Y3QgY2FjaGVfaGVhZCAqaXRlbSkKQEAgLTY3MCw3ICs2NzEsNyBAQAogewogCXN0cnVjdCBjYWNoZV9yZWFkZXIgKnJwID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBjYWNoZV9yZXF1ZXN0ICpycTsKLQlzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCA9IFBERShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CisJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJaW50IGVycjsKIAogCWlmIChjb3VudCA9PSAwKQpAQCAtNzQ3LDcgKzc0OCw3IEBACiAJICAgIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkID0gUERFKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKKwlzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCA9IFBERShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKIAogCWlmIChjb3VudCA9PSAwKQogCQlyZXR1cm4gMDsKQEAgLTc3OCw3ICs3NzksNyBAQAogCXVuc2lnbmVkIGludCBtYXNrOwogCXN0cnVjdCBjYWNoZV9yZWFkZXIgKnJwID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBjYWNoZV9xdWV1ZSAqY3E7Ci0Jc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkID0gUERFKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOwogCiAJcG9sbF93YWl0KGZpbHAsICZxdWV1ZV93YWl0LCB3YWl0KTsKIApAQCAtMTI1NCw3ICsxMjU1LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHJlYWRfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLT5kYXRhOworCXN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOwogCWNoYXIgdGJ1ZlsyMF07CiAJdW5zaWduZWQgbG9uZyBwID0gKnBwb3M7CiAJaW50IGxlbjsKQEAgLTEyNzUsNyArMTI3Niw3IEBACiBzdGF0aWMgc3NpemVfdCB3cml0ZV9mbHVzaChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAogCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CisJc3RydWN0IGNhY2hlX2RldGFpbCAqY2QgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CiAJY2hhciB0YnVmWzIwXTsKIAljaGFyICplcDsKIAlsb25nIGZsdXNodGltZTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvY2xudC5jIGIvbmV0L3N1bnJwYy9jbG50LmMKaW5kZXggNzg2OTZmMi4uYWJhNTI4YiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jbG50LmMKKysrIGIvbmV0L3N1bnJwYy9jbG50LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCkBAIC0xNDEsNiArMTQyLDEwIEBACiAJY2xudC0+Y2xfdmVycyAgICAgPSB2ZXJzaW9uLT5udW1iZXI7CiAJY2xudC0+Y2xfc3RhdHMgICAgPSBwcm9ncmFtLT5zdGF0czsKIAljbG50LT5jbF9tZXRyaWNzICA9IHJwY19hbGxvY19pb3N0YXRzKGNsbnQpOworCWVyciA9IC1FTk9NRU07CisJaWYgKGNsbnQtPmNsX21ldHJpY3MgPT0gTlVMTCkKKwkJZ290byBvdXRfbm9fc3RhdHM7CisJY2xudC0+Y2xfcHJvZ3JhbSAgPSBwcm9ncmFtOwogCiAJaWYgKCF4cHJ0X2JvdW5kKGNsbnQtPmNsX3hwcnQpKQogCQljbG50LT5jbF9hdXRvYmluZCA9IDE7CkBAIC0xNzMsNiArMTc4LDggQEAKIAkJcnBjX3B1dF9tb3VudCgpOwogCX0KIG91dF9ub19wYXRoOgorCXJwY19mcmVlX2lvc3RhdHMoY2xudC0+Y2xfbWV0cmljcyk7CitvdXRfbm9fc3RhdHM6CiAJaWYgKGNsbnQtPmNsX3NlcnZlciAhPSBjbG50LT5jbF9pbmxpbmVfbmFtZSkKIAkJa2ZyZWUoY2xudC0+Y2xfc2VydmVyKTsKIAlrZnJlZShjbG50KTsKQEAgLTI1MiwxMyArMjU5LDE5IEBACiBycGNfY2xvbmVfY2xpZW50KHN0cnVjdCBycGNfY2xudCAqY2xudCkKIHsKIAlzdHJ1Y3QgcnBjX2NsbnQgKm5ldzsKKwlpbnQgZXJyID0gLUVOT01FTTsKIAotCW5ldyA9IGttYWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfS0VSTkVMKTsKKwluZXcgPSBrbWVtZHVwKGNsbnQsIHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXcpCiAJCWdvdG8gb3V0X25vX2NsbnQ7Ci0JbWVtY3B5KG5ldywgY2xudCwgc2l6ZW9mKCpuZXcpKTsKIAlhdG9taWNfc2V0KCZuZXctPmNsX2NvdW50LCAxKTsKIAlhdG9taWNfc2V0KCZuZXctPmNsX3VzZXJzLCAwKTsKKwluZXctPmNsX21ldHJpY3MgPSBycGNfYWxsb2NfaW9zdGF0cyhjbG50KTsKKwlpZiAobmV3LT5jbF9tZXRyaWNzID09IE5VTEwpCisJCWdvdG8gb3V0X25vX3N0YXRzOworCWVyciA9IHJwY19zZXR1cF9waXBlZGlyKG5ldywgY2xudC0+Y2xfcHJvZ3JhbS0+cGlwZV9kaXJfbmFtZSk7CisJaWYgKGVyciAhPSAwKQorCQlnb3RvIG91dF9ub19wYXRoOwogCW5ldy0+Y2xfcGFyZW50ID0gY2xudDsKIAlhdG9taWNfaW5jKCZjbG50LT5jbF9jb3VudCk7CiAJbmV3LT5jbF94cHJ0ID0geHBydF9nZXQoY2xudC0+Y2xfeHBydCk7CkBAIC0yNjYsMTYgKzI3OSwxNyBAQAogCW5ldy0+Y2xfYXV0b2JpbmQgPSAwOwogCW5ldy0+Y2xfb25lc2hvdCA9IDA7CiAJbmV3LT5jbF9kZWFkID0gMDsKLQlpZiAoIUlTX0VSUihuZXctPmNsX2RlbnRyeSkpCi0JCWRnZXQobmV3LT5jbF9kZW50cnkpOwogCXJwY19pbml0X3J0dCgmbmV3LT5jbF9ydHRfZGVmYXVsdCwgY2xudC0+Y2xfeHBydC0+dGltZW91dC50b19pbml0dmFsKTsKIAlpZiAobmV3LT5jbF9hdXRoKQogCQlhdG9taWNfaW5jKCZuZXctPmNsX2F1dGgtPmF1X2NvdW50KTsKLQluZXctPmNsX21ldHJpY3MgPSBycGNfYWxsb2NfaW9zdGF0cyhjbG50KTsKIAlyZXR1cm4gbmV3Oworb3V0X25vX3BhdGg6CisJcnBjX2ZyZWVfaW9zdGF0cyhuZXctPmNsX21ldHJpY3MpOworb3V0X25vX3N0YXRzOgorCWtmcmVlKG5ldyk7CiBvdXRfbm9fY2xudDoKLQlwcmludGsoS0VSTl9JTkZPICJSUEM6IG91dCBvZiBtZW1vcnkgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZHByaW50aygiUlBDOiAlcyByZXR1cm5lZCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIC8qCkBAIC0zMjgsMTYgKzM0MiwxNCBAQAogCQlycGNhdXRoX2Rlc3Ryb3koY2xudC0+Y2xfYXV0aCk7CiAJCWNsbnQtPmNsX2F1dGggPSBOVUxMOwogCX0KLQlpZiAoY2xudC0+Y2xfcGFyZW50ICE9IGNsbnQpIHsKLQkJaWYgKCFJU19FUlIoY2xudC0+Y2xfZGVudHJ5KSkKLQkJCWRwdXQoY2xudC0+Y2xfZGVudHJ5KTsKLQkJcnBjX2Rlc3Ryb3lfY2xpZW50KGNsbnQtPmNsX3BhcmVudCk7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQogCWlmICghSVNfRVJSKGNsbnQtPmNsX2RlbnRyeSkpIHsKIAkJcnBjX3JtZGlyKGNsbnQtPmNsX2RlbnRyeSk7CiAJCXJwY19wdXRfbW91bnQoKTsKIAl9CisJaWYgKGNsbnQtPmNsX3BhcmVudCAhPSBjbG50KSB7CisJCXJwY19kZXN0cm95X2NsaWVudChjbG50LT5jbF9wYXJlbnQpOworCQlnb3RvIG91dF9mcmVlOworCX0KIAlpZiAoY2xudC0+Y2xfc2VydmVyICE9IGNsbnQtPmNsX2lubGluZV9uYW1lKQogCQlrZnJlZShjbG50LT5jbF9zZXJ2ZXIpOwogb3V0X2ZyZWU6CkBAIC00NjcsMTAgKzQ3OSw5IEBACiAKIAlCVUdfT04oZmxhZ3MgJiBSUENfVEFTS19BU1lOQyk7CiAKLQlzdGF0dXMgPSAtRU5PTUVNOwogCXRhc2sgPSBycGNfbmV3X3Rhc2soY2xudCwgZmxhZ3MsICZycGNfZGVmYXVsdF9vcHMsIE5VTEwpOwogCWlmICh0YXNrID09IE5VTEwpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIE1hc2sgc2lnbmFscyBvbiBSUEMgY2FsbHMgX2FuZF8gR1NTX0FVVEggdXBjYWxscyAqLwogCXJwY190YXNrX3NpZ21hc2sodGFzaywgJm9sZHNldCk7CkBAIC00NzksMTUgKzQ5MCwxNyBAQAogCiAJLyogU2V0IHVwIHRoZSBjYWxsIGluZm8gc3RydWN0IGFuZCBleGVjdXRlIHRoZSB0YXNrICovCiAJc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOwotCWlmIChzdGF0dXMgPT0gMCkgewotCQlhdG9taWNfaW5jKCZ0YXNrLT50a19jb3VudCk7Ci0JCXN0YXR1cyA9IHJwY19leGVjdXRlKHRhc2spOwotCQlpZiAoc3RhdHVzID09IDApCi0JCQlzdGF0dXMgPSB0YXNrLT50a19zdGF0dXM7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXJwY19yZWxlYXNlX3Rhc2sodGFzayk7CisJCWdvdG8gb3V0OwogCX0KLQlycGNfcmVzdG9yZV9zaWdtYXNrKCZvbGRzZXQpOwotCXJwY19yZWxlYXNlX3Rhc2sodGFzayk7CisJYXRvbWljX2luYygmdGFzay0+dGtfY291bnQpOworCXN0YXR1cyA9IHJwY19leGVjdXRlKHRhc2spOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOworCXJwY19wdXRfdGFzayh0YXNrKTsKIG91dDoKKwlycGNfcmVzdG9yZV9zaWdtYXNrKCZvbGRzZXQpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTUyOSw4ICs1NDIsNyBAQAogCXJwY19yZXN0b3JlX3NpZ21hc2soJm9sZHNldCk7CQkKIAlyZXR1cm4gc3RhdHVzOwogb3V0X3JlbGVhc2U6Ci0JaWYgKHRrX29wcy0+cnBjX3JlbGVhc2UgIT0gTlVMTCkKLQkJdGtfb3BzLT5ycGNfcmVsZWFzZShkYXRhKTsKKwlycGNfcmVsZWFzZV9jYWxsZGF0YSh0a19vcHMsIGRhdGEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTU4Miw3ICs1OTQsMTEgQEAKIGNoYXIgKnJwY19wZWVyYWRkcjJzdHIoc3RydWN0IHJwY19jbG50ICpjbG50LCBlbnVtIHJwY19kaXNwbGF5X2Zvcm1hdF90IGZvcm1hdCkKIHsKIAlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPSBjbG50LT5jbF94cHJ0OwotCXJldHVybiB4cHJ0LT5vcHMtPnByaW50X2FkZHIoeHBydCwgZm9ybWF0KTsKKworCWlmICh4cHJ0LT5hZGRyZXNzX3N0cmluZ3NbZm9ybWF0XSAhPSBOVUxMKQorCQlyZXR1cm4geHBydC0+YWRkcmVzc19zdHJpbmdzW2Zvcm1hdF07CisJZWxzZQorCQlyZXR1cm4gInVucHJpbnRhYmxlIjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJwY19wZWVyYWRkcjJzdHIpOwogCkBAIC04MTIsOCArODI4LDEwIEBACiAJaWYgKGVuY29kZSA9PSBOVUxMKQogCQlyZXR1cm47CiAKKwlsb2NrX2tlcm5lbCgpOwogCXRhc2stPnRrX3N0YXR1cyA9IHJwY2F1dGhfd3JhcF9yZXEodGFzaywgZW5jb2RlLCByZXEsIHAsCiAJCQl0YXNrLT50a19tc2cucnBjX2FyZ3ApOworCXVubG9ja19rZXJuZWwoKTsKIAlpZiAodGFzay0+dGtfc3RhdHVzID09IC1FTk9NRU0pIHsKIAkJLyogWFhYOiBJcyB0aGlzIHNhbmU/ICovCiAJCXJwY19kZWxheSh0YXNrLCAzKkhaKTsKQEAgLTExNDQsOSArMTE2MiwxMiBAQAogCiAJdGFzay0+dGtfYWN0aW9uID0gcnBjX2V4aXRfdGFzazsKIAotCWlmIChkZWNvZGUpCisJaWYgKGRlY29kZSkgeworCQlsb2NrX2tlcm5lbCgpOwogCQl0YXNrLT50a19zdGF0dXMgPSBycGNhdXRoX3Vud3JhcF9yZXNwKHRhc2ssIGRlY29kZSwgcmVxLCBwLAogCQkJCQkJICAgICAgdGFzay0+dGtfbXNnLnJwY19yZXNwKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KIAlkcHJpbnRrKCJSUEM6ICU0ZCBjYWxsX2RlY29kZSByZXN1bHQgJWRcbiIsIHRhc2stPnRrX3BpZCwKIAkJCQkJdGFzay0+dGtfc3RhdHVzKTsKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3BtYXBfY2xudC5jIGIvbmV0L3N1bnJwYy9wbWFwX2NsbnQuYwppbmRleCA5MTlkNWJhLi4zOTQ2ZWMzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3BtYXBfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcG1hcF9jbG50LmMKQEAgLTEwMSwxMSArMTAxLDEzIEBACiAJLyogQXV0b2JpbmQgb24gY2xvbmVkIHJwYyBjbGllbnRzIGlzIGRpc2NvdXJhZ2VkICovCiAJQlVHX09OKGNsbnQtPmNsX3BhcmVudCAhPSBjbG50KTsKIAotCWlmICh4cHJ0X3Rlc3RfYW5kX3NldF9iaW5kaW5nKHhwcnQpKSB7Ci0JCXRhc2stPnRrX3N0YXR1cyA9IC1FQUNDRVM7CS8qIHRlbGwgY2FsbGVyIHRvIGNoZWNrIGFnYWluICovCi0JCXJwY19zbGVlcF9vbigmeHBydC0+YmluZGluZywgdGFzaywgTlVMTCwgTlVMTCk7Ci0JCXJldHVybjsKLQl9CisJc3RhdHVzID0gLUVBQ0NFUzsJCS8qIHRlbGwgY2FsbGVyIHRvIGNoZWNrIGFnYWluICovCisJaWYgKHhwcnRfdGVzdF9hbmRfc2V0X2JpbmRpbmcoeHBydCkpCisJCWdvdG8gYmFpbG91dF9ub3dha2U7CisKKwkvKiBQdXQgc2VsZiBvbiBxdWV1ZSBiZWZvcmUgc2VuZGluZyBycGNiaW5kIHJlcXVlc3QsIGluIGNhc2UKKwkgKiBwbWFwX2dldHBvcnRfZG9uZSBjb21wbGV0ZXMgYmVmb3JlIHdlIHJldHVybiBmcm9tIHJwY19ydW5fdGFzayAqLworCXJwY19zbGVlcF9vbigmeHBydC0+YmluZGluZywgdGFzaywgTlVMTCwgTlVMTCk7CiAKIAkvKiBTb21lb25lIGVsc2UgbWF5IGhhdmUgYm91bmQgaWYgd2Ugc2xlcHQgKi8KIAlzdGF0dXMgPSAwOwpAQCAtMTMyLDkgKzEzNCw3IEBACiAJY2hpbGQgPSBycGNfcnVuX3Rhc2socG1hcF9jbG50LCBSUENfVEFTS19BU1lOQywgJnBtYXBfZ2V0cG9ydF9vcHMsIG1hcCk7CiAJaWYgKElTX0VSUihjaGlsZCkpCiAJCWdvdG8gYmFpbG91dDsKLQlycGNfcmVsZWFzZV90YXNrKGNoaWxkKTsKLQotCXJwY19zbGVlcF9vbigmeHBydC0+YmluZGluZywgdGFzaywgTlVMTCwgTlVMTCk7CisJcnBjX3B1dF90YXNrKGNoaWxkKTsKIAogCXRhc2stPnRrX3hwcnQtPnN0YXQuYmluZF9jb3VudCsrOwogCXJldHVybjsKQEAgLTE0Myw4ICsxNDMsOSBAQAogCXBtYXBfbWFwX2ZyZWUobWFwKTsKIAl4cHJ0X3B1dCh4cHJ0KTsKIGJhaWxvdXRfbm9mcmVlOgotCXRhc2stPnRrX3N0YXR1cyA9IHN0YXR1czsKIAlwbWFwX3dha2VfcG9ydG1hcF93YWl0ZXJzKHhwcnQsIHN0YXR1cyk7CitiYWlsb3V0X25vd2FrZToKKwl0YXNrLT50a19zdGF0dXMgPSBzdGF0dXM7CiB9CiAKICNpZmRlZiBDT05GSUdfUk9PVF9ORlMKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwppbmRleCA5YTBiNDFhLi44OTI3M2QzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY19waXBlLmMKKysrIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCkBAIC0zMyw3ICszMyw3IEBACiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcnBjX3BpcGVfZnNfdHlwZTsKIAogCi1zdGF0aWMga21lbV9jYWNoZV90ICpycGNfaW5vZGVfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJwY19pbm9kZV9jYWNoZXAgX19yZWFkX21vc3RseTsKIAogI2RlZmluZSBSUENfVVBDQUxMX1RJTUVPVVQgKDMwKkhaKQogCkBAIC01NCwxMCArNTQsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQKLXJwY190aW1lb3V0X3VwY2FsbF9xdWV1ZSh2b2lkICpkYXRhKQorcnBjX3RpbWVvdXRfdXBjYWxsX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlMSVNUX0hFQUQoZnJlZV9saXN0KTsKLQlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gKHN0cnVjdCBycGNfaW5vZGUgKilkYXRhOworCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJwY19pbm9kZSwgcXVldWVfdGltZW91dC53b3JrKTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJnJwY2ktPnZmc19pbm9kZTsKIAl2b2lkICgqZGVzdHJveV9tc2cpKHN0cnVjdCBycGNfcGlwZV9tc2cgKik7CiAKQEAgLTE0Miw3ICsxNDMsNyBAQAogcnBjX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaTsKLQlycGNpID0gKHN0cnVjdCBycGNfaW5vZGUgKilrbWVtX2NhY2hlX2FsbG9jKHJwY19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlycGNpID0gKHN0cnVjdCBycGNfaW5vZGUgKilrbWVtX2NhY2hlX2FsbG9jKHJwY19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghcnBjaSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICZycGNpLT52ZnNfaW5vZGU7CkBAIC0yMTMsNyArMjE0LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBycGNfcGlwZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IFJQQ19JKGlub2RlKTsKIAlzdHJ1Y3QgcnBjX3BpcGVfbXNnICptc2c7CiAJaW50IHJlcyA9IDA7CkBAIC0yNTYsNyArMjU3LDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBycGNfcGlwZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPSBSUENfSShpbm9kZSk7CiAJaW50IHJlczsKIApAQCAtMjc0LDcgKzI3NSw3IEBACiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaTsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKLQlycGNpID0gUlBDX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCXJwY2kgPSBSUENfSShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlwb2xsX3dhaXQoZmlscCwgJnJwY2ktPndhaXRxLCB3YWl0KTsKIAogCW1hc2sgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKQEAgLTI4OSw3ICsyOTAsNyBAQAogcnBjX3BpcGVfaW9jdGwoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxwLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBycGNfaW5vZGUgKnJwY2kgPSBSUENfSShmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQgbGVuOwogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTgyMyw3ICs4MjQsNyBAQAogfTsKIAogc3RhdGljIHZvaWQKLWluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbml0X29uY2Uodm9pZCAqIGZvbywgc3RydWN0IGttZW1fY2FjaGUgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHJwY19pbm9kZSAqcnBjaSA9IChzdHJ1Y3QgcnBjX2lub2RlICopIGZvbzsKIApAQCAtODM3LDcgKzgzOCw4IEBACiAJCUlOSVRfTElTVF9IRUFEKCZycGNpLT5waXBlKTsKIAkJcnBjaS0+cGlwZWxlbiA9IDA7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJwY2ktPndhaXRxKTsKLQkJSU5JVF9XT1JLKCZycGNpLT5xdWV1ZV90aW1lb3V0LCBycGNfdGltZW91dF91cGNhbGxfcXVldWUsIHJwY2kpOworCQlJTklUX0RFTEFZRURfV09SSygmcnBjaS0+cXVldWVfdGltZW91dCwKKwkJCQkgICAgcnBjX3RpbWVvdXRfdXBjYWxsX3F1ZXVlKTsKIAkJcnBjaS0+b3BzID0gTlVMTDsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3NjaGVkLmMgYi9uZXQvc3VucnBjL3NjaGVkLmMKaW5kZXggYTFhYjRlZS4uNzliYzRjZCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zY2hlZC5jCisrKyBiL25ldC9zdW5ycGMvc2NoZWQuYwpAQCAtMzQsMTQgKzM0LDE0IEBACiAjZGVmaW5lIFJQQ19CVUZGRVJfTUFYU0laRQkoMjA0OCkKICNkZWZpbmUgUlBDX0JVRkZFUl9QT09MU0laRQkoOCkKICNkZWZpbmUgUlBDX1RBU0tfUE9PTFNJWkUJKDgpCi1zdGF0aWMga21lbV9jYWNoZV90CSpycGNfdGFza19zbGFicCBfX3JlYWRfbW9zdGx5Owotc3RhdGljIGttZW1fY2FjaGVfdAkqcnBjX2J1ZmZlcl9zbGFicCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlCSpycGNfdGFza19zbGFicCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlCSpycGNfYnVmZmVyX3NsYWJwIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgbWVtcG9vbF90CSpycGNfdGFza19tZW1wb29sIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgbWVtcG9vbF90CSpycGNfYnVmZmVyX21lbXBvb2wgX19yZWFkX21vc3RseTsKIAogc3RhdGljIHZvaWQJCQlfX3JwY19kZWZhdWx0X3RpbWVyKHN0cnVjdCBycGNfdGFzayAqdGFzayk7CiBzdGF0aWMgdm9pZAkJCXJwY2lvZF9raWxsYWxsKHZvaWQpOwotc3RhdGljIHZvaWQJCQlycGNfYXN5bmNfc2NoZWR1bGUodm9pZCAqKTsKK3N0YXRpYyB2b2lkCQkJcnBjX2FzeW5jX3NjaGVkdWxlKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKIAogLyoKICAqIFJQQyB0YXNrcyBzaXQgaGVyZSB3aGlsZSB3YWl0aW5nIGZvciBjb25kaXRpb25zIHRvIGltcHJvdmUuCkBAIC0yNjYsMTIgKzI2NiwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBycGNfc2V0X2FjdGl2ZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoUlBDX1RBU0tfQUNUSVZFLCAmdGFzay0+dGtfcnVuc3RhdGUpICE9IDApCisJCXJldHVybjsKKwlzcGluX2xvY2soJnJwY19zY2hlZF9sb2NrKTsKKyNpZmRlZiBSUENfREVCVUcKKwl0YXNrLT50a19tYWdpYyA9IFJQQ19UQVNLX01BR0lDX0lEOworCXRhc2stPnRrX3BpZCA9IHJwY190YXNrX2lkKys7CisjZW5kaWYKKwkvKiBBZGQgdG8gZ2xvYmFsIGxpc3Qgb2YgYWxsIHRhc2tzICovCisJbGlzdF9hZGRfdGFpbCgmdGFzay0+dGtfdGFzaywgJmFsbF90YXNrcyk7CisJc3Bpbl91bmxvY2soJnJwY19zY2hlZF9sb2NrKTsKK30KKwogLyoKICAqIE1hcmsgYW4gUlBDIGNhbGwgYXMgaGF2aW5nIGNvbXBsZXRlZCBieSBjbGVhcmluZyB0aGUgJ2FjdGl2ZScgYml0CiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBycGNfbWFya19jb21wbGV0ZV90YXNrKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3N0YXRpYyB2b2lkIHJwY19tYXJrX2NvbXBsZXRlX3Rhc2soc3RydWN0IHJwY190YXNrICp0YXNrKQogewotCXJwY19jbGVhcl9hY3RpdmUodGFzayk7CisJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7CisJY2xlYXJfYml0KFJQQ19UQVNLX0FDVElWRSwgJnRhc2stPnRrX3J1bnN0YXRlKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCXdha2VfdXBfYml0KCZ0YXNrLT50a19ydW5zdGF0ZSwgUlBDX1RBU0tfQUNUSVZFKTsKIH0KIApAQCAtMjk1LDE3ICszMTEsMTkgQEAKICAqLwogc3RhdGljIHZvaWQgcnBjX21ha2VfcnVubmFibGUoc3RydWN0IHJwY190YXNrICp0YXNrKQogewotCWludCBkb19yZXQ7Ci0KIAlCVUdfT04odGFzay0+dGtfdGltZW91dF9mbik7Ci0JZG9fcmV0ID0gcnBjX3Rlc3RfYW5kX3NldF9ydW5uaW5nKHRhc2spOwogCXJwY19jbGVhcl9xdWV1ZWQodGFzayk7Ci0JaWYgKGRvX3JldCkKKwlpZiAocnBjX3Rlc3RfYW5kX3NldF9ydW5uaW5nKHRhc2spKQogCQlyZXR1cm47CisJLyogV2UgbWlnaHQgaGF2ZSByYWNlZCAqLworCWlmIChSUENfSVNfUVVFVUVEKHRhc2spKSB7CisJCXJwY19jbGVhcl9ydW5uaW5nKHRhc2spOworCQlyZXR1cm47CisJfQogCWlmIChSUENfSVNfQVNZTkModGFzaykpIHsKIAkJaW50IHN0YXR1czsKIAotCQlJTklUX1dPUksoJnRhc2stPnUudGtfd29yaywgcnBjX2FzeW5jX3NjaGVkdWxlLCAodm9pZCAqKXRhc2spOworCQlJTklUX1dPUksoJnRhc2stPnUudGtfd29yaywgcnBjX2FzeW5jX3NjaGVkdWxlKTsKIAkJc3RhdHVzID0gcXVldWVfd29yayh0YXNrLT50a193b3JrcXVldWUsICZ0YXNrLT51LnRrX3dvcmspOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlBDOiBmYWlsZWQgdG8gYWRkIHRhc2sgdG8gcXVldWU6IGVycm9yOiAlZCFcbiIsIHN0YXR1cyk7CkBAIC0zMzMsOSArMzUxLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIE1hcmsgdGhlIHRhc2sgYXMgYmVpbmcgYWN0aXZhdGVkIGlmIHNvIG5lZWRlZCAqLwotCXJwY19zZXRfYWN0aXZlKHRhc2spOwotCiAJX19ycGNfYWRkX3dhaXRfcXVldWUocSwgdGFzayk7CiAKIAlCVUdfT04odGFzay0+dGtfY2FsbGJhY2sgIT0gTlVMTCk7CkBAIC0zNDYsNiArMzYxLDkgQEAKIHZvaWQgcnBjX3NsZWVwX29uKHN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcSwgc3RydWN0IHJwY190YXNrICp0YXNrLAogCQkJCXJwY19hY3Rpb24gYWN0aW9uLCBycGNfYWN0aW9uIHRpbWVyKQogeworCS8qIE1hcmsgdGhlIHRhc2sgYXMgYmVpbmcgYWN0aXZhdGVkIGlmIHNvIG5lZWRlZCAqLworCXJwY19zZXRfYWN0aXZlKHRhc2spOworCiAJLyoKIAkgKiBQcm90ZWN0IHRoZSBxdWV1ZSBvcGVyYXRpb25zLgogCSAqLwpAQCAtNDA5LDE2ICs0MjcsMTkgQEAKICAqLwogdm9pZCBycGNfd2FrZV91cF90YXNrKHN0cnVjdCBycGNfdGFzayAqdGFzaykKIHsKKwlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJaWYgKHJwY19zdGFydF93YWtldXAodGFzaykpIHsKIAkJaWYgKFJQQ19JU19RVUVVRUQodGFzaykpIHsKIAkJCXN0cnVjdCBycGNfd2FpdF9xdWV1ZSAqcXVldWUgPSB0YXNrLT51LnRrX3dhaXQucnBjX3dhaXRxOwogCi0JCQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwkJCS8qIE5vdGU6IHdlJ3JlIGFscmVhZHkgaW4gYSBiaC1zYWZlIGNvbnRleHQgKi8KKwkJCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOwogCQkJX19ycGNfZG9fd2FrZV91cF90YXNrKHRhc2spOwotCQkJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZxdWV1ZS0+bG9jayk7CiAJCX0KIAkJcnBjX2ZpbmlzaF93YWtldXAodGFzayk7CiAJfQorCXJjdV9yZWFkX3VubG9ja19iaCgpOwogfQogCiAvKgpAQCAtNDgxLDE0ICs1MDIsMTYgQEAKIAlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2sgPSBOVUxMOwogCiAJZHByaW50aygiUlBDOiAgICAgIHdha2VfdXBfbmV4dCglcCBcIiVzXCIpXG4iLCBxdWV1ZSwgcnBjX3FuYW1lKHF1ZXVlKSk7Ci0Jc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CisJcmN1X3JlYWRfbG9ja19iaCgpOworCXNwaW5fbG9jaygmcXVldWUtPmxvY2spOwogCWlmIChSUENfSVNfUFJJT1JJVFkocXVldWUpKQogCQl0YXNrID0gX19ycGNfd2FrZV91cF9uZXh0X3ByaW9yaXR5KHF1ZXVlKTsKIAllbHNlIHsKIAkJdGFza19mb3JfZmlyc3QodGFzaywgJnF1ZXVlLT50YXNrc1swXSkKIAkJCV9fcnBjX3dha2VfdXBfdGFzayh0YXNrKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCiAJcmV0dXJuIHRhc2s7CiB9CkBAIC01MDQsNyArNTI3LDggQEAKIAlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssICpuZXh0OwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAKLQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwlyY3VfcmVhZF9sb2NrX2JoKCk7CisJc3Bpbl9sb2NrKCZxdWV1ZS0+bG9jayk7CiAJaGVhZCA9ICZxdWV1ZS0+dGFza3NbcXVldWUtPm1heHByaW9yaXR5XTsKIAlmb3IgKDs7KSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YXNrLCBuZXh0LCBoZWFkLCB1LnRrX3dhaXQubGlzdCkKQEAgLTUxMyw3ICs1MzcsOCBAQAogCQkJYnJlYWs7CiAJCWhlYWQtLTsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKwlzcGluX3VubG9jaygmcXVldWUtPmxvY2spOworCXJjdV9yZWFkX3VubG9ja19iaCgpOwogfQogCiAvKioKQEAgLTUyOCw3ICs1NTMsOCBAQAogCXN0cnVjdCBycGNfdGFzayAqdGFzaywgKm5leHQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAotCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOworCXJjdV9yZWFkX2xvY2tfYmgoKTsKKwlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKIAloZWFkID0gJnF1ZXVlLT50YXNrc1txdWV1ZS0+bWF4cHJpb3JpdHldOwogCWZvciAoOzspIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRhc2ssIG5leHQsIGhlYWQsIHUudGtfd2FpdC5saXN0KSB7CkBAIC01MzksNyArNTY1LDggQEAKIAkJCWJyZWFrOwogCQloZWFkLS07CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CisJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIH0KIAogc3RhdGljIHZvaWQgX19ycGNfYXRydW4oc3RydWN0IHJwY190YXNrICp0YXNrKQpAQCAtNTYxLDcgKzU4OCw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJwY19wcmVwYXJlX3Rhc2soc3RydWN0IHJwY190YXNrICp0YXNrKQogeworCWxvY2tfa2VybmVsKCk7CiAJdGFzay0+dGtfb3BzLT5ycGNfY2FsbF9wcmVwYXJlKHRhc2ssIHRhc2stPnRrX2NhbGxkYXRhKTsKKwl1bmxvY2tfa2VybmVsKCk7CiB9CiAKIC8qCkBAIC01NzEsNyArNjAwLDkgQEAKIHsKIAl0YXNrLT50a19hY3Rpb24gPSBOVUxMOwogCWlmICh0YXNrLT50a19vcHMtPnJwY19jYWxsX2RvbmUgIT0gTlVMTCkgeworCQlsb2NrX2tlcm5lbCgpOwogCQl0YXNrLT50a19vcHMtPnJwY19jYWxsX2RvbmUodGFzaywgdGFzay0+dGtfY2FsbGRhdGEpOworCQl1bmxvY2tfa2VybmVsKCk7CiAJCWlmICh0YXNrLT50a19hY3Rpb24gIT0gTlVMTCkgewogCQkJV0FSTl9PTihSUENfQVNTQVNTSU5BVEVEKHRhc2spKTsKIAkJCS8qIEFsd2F5cyByZWxlYXNlIHRoZSBSUEMgc2xvdCBhbmQgYnVmZmVyIG1lbW9yeSAqLwpAQCAtNTgxLDYgKzYxMiwxNSBAQAogfQogRVhQT1JUX1NZTUJPTChycGNfZXhpdF90YXNrKTsKIAordm9pZCBycGNfcmVsZWFzZV9jYWxsZGF0YShjb25zdCBzdHJ1Y3QgcnBjX2NhbGxfb3BzICpvcHMsIHZvaWQgKmNhbGxkYXRhKQoreworCWlmIChvcHMtPnJwY19yZWxlYXNlICE9IE5VTEwpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJb3BzLT5ycGNfcmVsZWFzZShjYWxsZGF0YSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9Cit9CisKIC8qCiAgKiBUaGlzIGlzIHRoZSBSUEMgYHNjaGVkdWxlcicgKG9yIHJhdGhlciwgdGhlIGZpbml0ZSBzdGF0ZSBtYWNoaW5lKS4KICAqLwpAQCAtNjE1LDkgKzY1NSw3IEBACiAJCQkgKi8KIAkJCXNhdmVfY2FsbGJhY2s9dGFzay0+dGtfY2FsbGJhY2s7CiAJCQl0YXNrLT50a19jYWxsYmFjaz1OVUxMOwotCQkJbG9ja19rZXJuZWwoKTsKIAkJCXNhdmVfY2FsbGJhY2sodGFzayk7Ci0JCQl1bmxvY2tfa2VybmVsKCk7CiAJCX0KIAogCQkvKgpAQCAtNjI4LDkgKzY2Niw3IEBACiAJCWlmICghUlBDX0lTX1FVRVVFRCh0YXNrKSkgewogCQkJaWYgKHRhc2stPnRrX2FjdGlvbiA9PSBOVUxMKQogCQkJCWJyZWFrOwotCQkJbG9ja19rZXJuZWwoKTsKIAkJCXRhc2stPnRrX2FjdGlvbih0YXNrKTsKLQkJCXVubG9ja19rZXJuZWwoKTsKIAkJfQogCiAJCS8qCkBAIC02NzEsOCArNzA3LDYgQEAKIAl9CiAKIAlkcHJpbnRrKCJSUEM6ICU0ZCwgcmV0dXJuICVkLCBzdGF0dXMgJWRcbiIsIHRhc2stPnRrX3BpZCwgc3RhdHVzLCB0YXNrLT50a19zdGF0dXMpOwotCS8qIFdha2UgdXAgYW55b25lIHdobyBpcyB3YWl0aW5nIGZvciB0YXNrIGNvbXBsZXRpb24gKi8KLQlycGNfbWFya19jb21wbGV0ZV90YXNrKHRhc2spOwogCS8qIFJlbGVhc2UgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgKi8KIAlycGNfcmVsZWFzZV90YXNrKHRhc2spOwogCXJldHVybiBzdGF0dXM7CkBAIC02OTUsOSArNzI5LDkgQEAKIAlyZXR1cm4gX19ycGNfZXhlY3V0ZSh0YXNrKTsKIH0KIAotc3RhdGljIHZvaWQgcnBjX2FzeW5jX3NjaGVkdWxlKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIHJwY19hc3luY19zY2hlZHVsZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JX19ycGNfZXhlY3V0ZSgoc3RydWN0IHJwY190YXNrICopYXJnKTsKKwlfX3JwY19leGVjdXRlKGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnBjX3Rhc2ssIHUudGtfd29yaykpOwogfQogCiAvKioKQEAgLTc4NiwxNSArODIwLDYgQEAKIAkJCXRhc2stPnRrX2ZsYWdzIHw9IFJQQ19UQVNLX05PSU5UUjsKIAl9CiAKLSNpZmRlZiBSUENfREVCVUcKLQl0YXNrLT50a19tYWdpYyA9IFJQQ19UQVNLX01BR0lDX0lEOwotCXRhc2stPnRrX3BpZCA9IHJwY190YXNrX2lkKys7Ci0jZW5kaWYKLQkvKiBBZGQgdG8gZ2xvYmFsIGxpc3Qgb2YgYWxsIHRhc2tzICovCi0Jc3Bpbl9sb2NrKCZycGNfc2NoZWRfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmdGFzay0+dGtfdGFzaywgJmFsbF90YXNrcyk7Ci0Jc3Bpbl91bmxvY2soJnJwY19zY2hlZF9sb2NrKTsKLQogCUJVR19PTih0YXNrLT50a19vcHMgPT0gTlVMTCk7CiAKIAkvKiBzdGFydGluZyB0aW1lc3RhbXAgKi8KQEAgLTgxMCw4ICs4MzUsOSBAQAogCXJldHVybiAoc3RydWN0IHJwY190YXNrICopbWVtcG9vbF9hbGxvYyhycGNfdGFza19tZW1wb29sLCBHRlBfTk9GUyk7CiB9CiAKLXN0YXRpYyB2b2lkIHJwY19mcmVlX3Rhc2soc3RydWN0IHJwY190YXNrICp0YXNrKQorc3RhdGljIHZvaWQgcnBjX2ZyZWVfdGFzayhzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKIHsKKwlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2sgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgcnBjX3Rhc2ssIHUudGtfcmN1KTsKIAlkcHJpbnRrKCJSUEM6ICU0ZCBmcmVlaW5nIHRhc2tcbiIsIHRhc2stPnRrX3BpZCk7CiAJbWVtcG9vbF9mcmVlKHRhc2ssIHJwY190YXNrX21lbXBvb2wpOwogfQpAQCAtODQ3LDE2ICs4NzMsMzQgQEAKIAlnb3RvIG91dDsKIH0KIAotdm9pZCBycGNfcmVsZWFzZV90YXNrKHN0cnVjdCBycGNfdGFzayAqdGFzaykKKwordm9pZCBycGNfcHV0X3Rhc2soc3RydWN0IHJwY190YXNrICp0YXNrKQogewogCWNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgKnRrX29wcyA9IHRhc2stPnRrX29wczsKIAl2b2lkICpjYWxsZGF0YSA9IHRhc2stPnRrX2NhbGxkYXRhOwogCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ0YXNrLT50a19jb3VudCkpCisJCXJldHVybjsKKwkvKiBSZWxlYXNlIHJlc291cmNlcyAqLworCWlmICh0YXNrLT50a19ycXN0cCkKKwkJeHBydF9yZWxlYXNlKHRhc2spOworCWlmICh0YXNrLT50a19tc2cucnBjX2NyZWQpCisJCXJwY2F1dGhfdW5iaW5kY3JlZCh0YXNrKTsKKwlpZiAodGFzay0+dGtfY2xpZW50KSB7CisJCXJwY19yZWxlYXNlX2NsaWVudCh0YXNrLT50a19jbGllbnQpOworCQl0YXNrLT50a19jbGllbnQgPSBOVUxMOworCX0KKwlpZiAodGFzay0+dGtfZmxhZ3MgJiBSUENfVEFTS19EWU5BTUlDKQorCQljYWxsX3JjdV9iaCgmdGFzay0+dS50a19yY3UsIHJwY19mcmVlX3Rhc2spOworCXJwY19yZWxlYXNlX2NhbGxkYXRhKHRrX29wcywgY2FsbGRhdGEpOworfQorRVhQT1JUX1NZTUJPTChycGNfcHV0X3Rhc2spOworCit2b2lkIHJwY19yZWxlYXNlX3Rhc2soc3RydWN0IHJwY190YXNrICp0YXNrKQorewogI2lmZGVmIFJQQ19ERUJVRwogCUJVR19PTih0YXNrLT50a19tYWdpYyAhPSBSUENfVEFTS19NQUdJQ19JRCk7CiAjZW5kaWYKLQlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnRhc2stPnRrX2NvdW50KSkKLQkJcmV0dXJuOwogCWRwcmludGsoIlJQQzogJTRkIHJlbGVhc2UgdGFza1xuIiwgdGFzay0+dGtfcGlkKTsKIAogCS8qIFJlbW92ZSBmcm9tIGdsb2JhbCB0YXNrIGxpc3QgKi8KQEAgLTg2OSwyMyArOTEzLDEzIEBACiAJLyogU3luY2hyb25vdXNseSBkZWxldGUgYW55IHJ1bm5pbmcgdGltZXIgKi8KIAlycGNfZGVsZXRlX3RpbWVyKHRhc2spOwogCi0JLyogUmVsZWFzZSByZXNvdXJjZXMgKi8KLQlpZiAodGFzay0+dGtfcnFzdHApCi0JCXhwcnRfcmVsZWFzZSh0YXNrKTsKLQlpZiAodGFzay0+dGtfbXNnLnJwY19jcmVkKQotCQlycGNhdXRoX3VuYmluZGNyZWQodGFzayk7Ci0JaWYgKHRhc2stPnRrX2NsaWVudCkgewotCQlycGNfcmVsZWFzZV9jbGllbnQodGFzay0+dGtfY2xpZW50KTsKLQkJdGFzay0+dGtfY2xpZW50ID0gTlVMTDsKLQl9Ci0KICNpZmRlZiBSUENfREVCVUcKIAl0YXNrLT50a19tYWdpYyA9IDA7CiAjZW5kaWYKLQlpZiAodGFzay0+dGtfZmxhZ3MgJiBSUENfVEFTS19EWU5BTUlDKQotCQlycGNfZnJlZV90YXNrKHRhc2spOwotCWlmICh0a19vcHMtPnJwY19yZWxlYXNlKQotCQl0a19vcHMtPnJwY19yZWxlYXNlKGNhbGxkYXRhKTsKKwkvKiBXYWtlIHVwIGFueW9uZSB3aG8gaXMgd2FpdGluZyBmb3IgdGFzayBjb21wbGV0aW9uICovCisJcnBjX21hcmtfY29tcGxldGVfdGFzayh0YXNrKTsKKworCXJwY19wdXRfdGFzayh0YXNrKTsKIH0KIAogLyoqCkBAIC05MDIsOCArOTM2LDcgQEAKIAlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2s7CiAJdGFzayA9IHJwY19uZXdfdGFzayhjbG50LCBmbGFncywgb3BzLCBkYXRhKTsKIAlpZiAodGFzayA9PSBOVUxMKSB7Ci0JCWlmIChvcHMtPnJwY19yZWxlYXNlICE9IE5VTEwpCi0JCQlvcHMtPnJwY19yZWxlYXNlKGRhdGEpOworCQlycGNfcmVsZWFzZV9jYWxsZGF0YShvcHMsIGRhdGEpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJYXRvbWljX2luYygmdGFzay0+dGtfY291bnQpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zb2NrbGliLmMgYi9uZXQvc3VucnBjL3NvY2tsaWIuYwppbmRleCA2ZjE3NTI3Li42MzQ4ODViIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3NvY2tsaWIuYworKysgYi9uZXQvc3VucnBjL3NvY2tsaWIuYwpAQCAtMTYsNyArMTYsNyBAQAogCiAKIC8qKgotICogc2tiX3JlYWRfYml0cyAtIGNvcHkgc29tZSBkYXRhIGJpdHMgZnJvbSBza2IgdG8gaW50ZXJuYWwgYnVmZmVyCisgKiB4ZHJfc2tiX3JlYWRfYml0cyAtIGNvcHkgc29tZSBkYXRhIGJpdHMgZnJvbSBza2IgdG8gaW50ZXJuYWwgYnVmZmVyCiAgKiBAZGVzYzogc2tfYnVmZiBjb3B5IGhlbHBlcgogICogQHRvOiBjb3B5IGRlc3RpbmF0aW9uCiAgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQpAQCAtMjQsMTEgKzI0LDExIEBACiAgKiBQb3NzaWJseSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB0byBpdGVyYXRlIG92ZXIgYW4gc2tfYnVmZiBhbmQgY29weQogICogZGF0YSBvdXQgb2YgaXQuCiAgKi8KLXN0YXRpYyBzaXplX3Qgc2tiX3JlYWRfYml0cyhza2JfcmVhZGVyX3QgKmRlc2MsIHZvaWQgKnRvLCBzaXplX3QgbGVuKQorc2l6ZV90IHhkcl9za2JfcmVhZF9iaXRzKHN0cnVjdCB4ZHJfc2tiX3JlYWRlciAqZGVzYywgdm9pZCAqdG8sIHNpemVfdCBsZW4pCiB7CiAJaWYgKGxlbiA+IGRlc2MtPmNvdW50KQogCQlsZW4gPSBkZXNjLT5jb3VudDsKLQlpZiAoc2tiX2NvcHlfYml0cyhkZXNjLT5za2IsIGRlc2MtPm9mZnNldCwgdG8sIGxlbikpCisJaWYgKHVubGlrZWx5KHNrYl9jb3B5X2JpdHMoZGVzYy0+c2tiLCBkZXNjLT5vZmZzZXQsIHRvLCBsZW4pKSkKIAkJcmV0dXJuIDA7CiAJZGVzYy0+Y291bnQgLT0gbGVuOwogCWRlc2MtPm9mZnNldCArPSBsZW47CkBAIC0zNiwxNiArMzYsMTcgQEAKIH0KIAogLyoqCi0gKiBza2JfcmVhZF9hbmRfY3N1bV9iaXRzIC0gY29weSBhbmQgY2hlY2tzdW0gZnJvbSBza2IgdG8gYnVmZmVyCisgKiB4ZHJfc2tiX3JlYWRfYW5kX2NzdW1fYml0cyAtIGNvcHkgYW5kIGNoZWNrc3VtIGZyb20gc2tiIHRvIGJ1ZmZlcgogICogQGRlc2M6IHNrX2J1ZmYgY29weSBoZWxwZXIKICAqIEB0bzogY29weSBkZXN0aW5hdGlvbgogICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKICAqCiAgKiBTYW1lIGFzIHNrYl9yZWFkX2JpdHMsIGJ1dCBjYWxjdWxhdGUgYSBjaGVja3N1bSBhdCB0aGUgc2FtZSB0aW1lLgogICovCi1zdGF0aWMgc2l6ZV90IHNrYl9yZWFkX2FuZF9jc3VtX2JpdHMoc2tiX3JlYWRlcl90ICpkZXNjLCB2b2lkICp0bywgc2l6ZV90IGxlbikKK3N0YXRpYyBzaXplX3QgeGRyX3NrYl9yZWFkX2FuZF9jc3VtX2JpdHMoc3RydWN0IHhkcl9za2JfcmVhZGVyICpkZXNjLCB2b2lkICp0bywgc2l6ZV90IGxlbikKIHsKLQl1bnNpZ25lZCBpbnQJY3N1bTIsIHBvczsKKwl1bnNpZ25lZCBpbnQgcG9zOworCV9fd3N1bSBjc3VtMjsKIAogCWlmIChsZW4gPiBkZXNjLT5jb3VudCkKIAkJbGVuID0gZGVzYy0+Y291bnQ7CkBAIC02NSw3ICs2Niw3IEBACiAgKiBAY29weV9hY3RvcjogdmlydHVhbCBtZXRob2QgZm9yIGNvcHlpbmcgZGF0YQogICoKICAqLwotc3NpemVfdCB4ZHJfcGFydGlhbF9jb3B5X2Zyb21fc2tiKHN0cnVjdCB4ZHJfYnVmICp4ZHIsIHVuc2lnbmVkIGludCBiYXNlLCBza2JfcmVhZGVyX3QgKmRlc2MsIHNrYl9yZWFkX2FjdG9yX3QgY29weV9hY3RvcikKK3NzaXplX3QgeGRyX3BhcnRpYWxfY29weV9mcm9tX3NrYihzdHJ1Y3QgeGRyX2J1ZiAqeGRyLCB1bnNpZ25lZCBpbnQgYmFzZSwgc3RydWN0IHhkcl9za2JfcmVhZGVyICpkZXNjLCB4ZHJfc2tiX3JlYWRfYWN0b3IgY29weV9hY3RvcikKIHsKIAlzdHJ1Y3QgcGFnZQkqKnBwYWdlID0geGRyLT5wYWdlczsKIAl1bnNpZ25lZCBpbnQJbGVuLCBwZ2xlbiA9IHhkci0+cGFnZV9sZW47CkBAIC0xNDcsNyArMTQ4LDcgQEAKICAqLwogaW50IGNzdW1fcGFydGlhbF9jb3B5X3RvX3hkcihzdHJ1Y3QgeGRyX2J1ZiAqeGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXNrYl9yZWFkZXJfdAlkZXNjOworCXN0cnVjdCB4ZHJfc2tiX3JlYWRlcglkZXNjOwogCiAJZGVzYy5za2IgPSBza2I7CiAJZGVzYy5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CkBAIC0xNTcsMjIgKzE1OCwyMiBAQAogCQlnb3RvIG5vX2NoZWNrc3VtOwogCiAJZGVzYy5jc3VtID0gY3N1bV9wYXJ0aWFsKHNrYi0+ZGF0YSwgZGVzYy5vZmZzZXQsIHNrYi0+Y3N1bSk7Ci0JaWYgKHhkcl9wYXJ0aWFsX2NvcHlfZnJvbV9za2IoeGRyLCAwLCAmZGVzYywgc2tiX3JlYWRfYW5kX2NzdW1fYml0cykgPCAwKQorCWlmICh4ZHJfcGFydGlhbF9jb3B5X2Zyb21fc2tiKHhkciwgMCwgJmRlc2MsIHhkcl9za2JfcmVhZF9hbmRfY3N1bV9iaXRzKSA8IDApCiAJCXJldHVybiAtMTsKIAlpZiAoZGVzYy5vZmZzZXQgIT0gc2tiLT5sZW4pIHsKLQkJdW5zaWduZWQgaW50IGNzdW0yOworCQlfX3dzdW0gY3N1bTI7CiAJCWNzdW0yID0gc2tiX2NoZWNrc3VtKHNrYiwgZGVzYy5vZmZzZXQsIHNrYi0+bGVuIC0gZGVzYy5vZmZzZXQsIDApOwogCQlkZXNjLmNzdW0gPSBjc3VtX2Jsb2NrX2FkZChkZXNjLmNzdW0sIGNzdW0yLCBkZXNjLm9mZnNldCk7CiAJfQogCWlmIChkZXNjLmNvdW50KQogCQlyZXR1cm4gLTE7Ci0JaWYgKCh1bnNpZ25lZCBzaG9ydCljc3VtX2ZvbGQoZGVzYy5jc3VtKSkKKwlpZiAoY3N1bV9mb2xkKGRlc2MuY3N1bSkpCiAJCXJldHVybiAtMTsKIAlpZiAodW5saWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpKQogCQluZXRkZXZfcnhfY3N1bV9mYXVsdChza2ItPmRldik7CiAJcmV0dXJuIDA7CiBub19jaGVja3N1bToKLQlpZiAoeGRyX3BhcnRpYWxfY29weV9mcm9tX3NrYih4ZHIsIDAsICZkZXNjLCBza2JfcmVhZF9iaXRzKSA8IDApCisJaWYgKHhkcl9wYXJ0aWFsX2NvcHlfZnJvbV9za2IoeGRyLCAwLCAmZGVzYywgeGRyX3NrYl9yZWFkX2JpdHMpIDwgMCkKIAkJcmV0dXJuIC0xOwogCWlmIChkZXNjLmNvdW50KQogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMgYi9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMKaW5kZXggMTkyZGZmNS4uZDg1ZmRkZSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCisrKyBiL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYwpAQCAtMzMsNyArMzMsNiBAQAogRVhQT1JUX1NZTUJPTChycGNpb2RfdXApOwogRVhQT1JUX1NZTUJPTChycGNfbmV3X3Rhc2spOwogRVhQT1JUX1NZTUJPTChycGNfd2FrZV91cF9zdGF0dXMpOwotRVhQT1JUX1NZTUJPTChycGNfcmVsZWFzZV90YXNrKTsKIAogLyogUlBDIGNsaWVudCBmdW5jdGlvbnMgKi8KIEVYUE9SVF9TWU1CT0wocnBjX2Nsb25lX2NsaWVudCk7CkBAIC0xMzksNiArMTM4LDggQEAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfcnBjX3BpcGVmcyh2b2lkKTsKIGV4dGVybiB2b2lkIHVucmVnaXN0ZXJfcnBjX3BpcGVmcyh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgY2FjaGVfZGV0YWlsIGlwX21hcF9jYWNoZTsKK2V4dGVybiBpbnQgaW5pdF9zb2NrZXRfeHBydCh2b2lkKTsKK2V4dGVybiB2b2lkIGNsZWFudXBfc29ja2V0X3hwcnQodm9pZCk7CiAKIHN0YXRpYyBpbnQgX19pbml0CiBpbml0X3N1bnJwYyh2b2lkKQpAQCAtMTU2LDYgKzE1Nyw3IEBACiAJcnBjX3Byb2NfaW5pdCgpOwogI2VuZGlmCiAJY2FjaGVfcmVnaXN0ZXIoJmlwX21hcF9jYWNoZSk7CisJaW5pdF9zb2NrZXRfeHBydCgpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xNjMsNiArMTY1LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdAogY2xlYW51cF9zdW5ycGModm9pZCkKIHsKKwljbGVhbnVwX3NvY2tldF94cHJ0KCk7CiAJdW5yZWdpc3Rlcl9ycGNfcGlwZWZzKCk7CiAJcnBjX2Rlc3Ryb3lfbWVtcG9vbCgpOwogCWlmIChjYWNoZV91bnJlZ2lzdGVyKCZpcF9tYXBfY2FjaGUpKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmMuYyBiL25ldC9zdW5ycGMvc3ZjLmMKaW5kZXggMjgwN2ZhMC4uZjMwMDFmMyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmMuYworKysgYi9uZXQvc3VucnBjL3N2Yy5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogCXNlcnYtPnN2X25ycG9vbHMgPSBucG9vbHM7CiAJc2Vydi0+c3ZfcG9vbHMgPQotCQlrY2FsbG9jKHNpemVvZihzdHJ1Y3Qgc3ZjX3Bvb2wpLCBzZXJ2LT5zdl9ucnBvb2xzLAorCQlrY2FsbG9jKHNlcnYtPnN2X25ycG9vbHMsIHNpemVvZihzdHJ1Y3Qgc3ZjX3Bvb2wpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZXJ2LT5zdl9wb29scykgewogCQlrZnJlZShzZXJ2KTsKQEAgLTgyOCw2ICs4MjgsMTEgQEAKIAkJKnN0YXRwID0gcHJvY3AtPnBjX2Z1bmMocnFzdHAsIHJxc3RwLT5ycV9hcmdwLCBycXN0cC0+cnFfcmVzcCk7CiAKIAkJLyogRW5jb2RlIHJlcGx5ICovCisJCWlmICgqc3RhdHAgPT0gcnBjX2Ryb3BfcmVwbHkpIHsKKwkJCWlmIChwcm9jcC0+cGNfcmVsZWFzZSkKKwkJCQlwcm9jcC0+cGNfcmVsZWFzZShycXN0cCwgTlVMTCwgcnFzdHAtPnJxX3Jlc3ApOworCQkJZ290byBkcm9waXQ7CisJCX0KIAkJaWYgKCpzdGF0cCA9PSBycGNfc3VjY2VzcyAmJiAoeGRyID0gcHJvY3AtPnBjX2VuY29kZSkKIAkJICYmICF4ZHIocnFzdHAsIHJlc3YtPmlvdl9iYXNlK3Jlc3YtPmlvdl9sZW4sIHJxc3RwLT5ycV9yZXNwKSkgewogCQkJZHByaW50aygic3ZjOiBmYWlsZWQgdG8gZW5jb2RlIHJlcGx5XG4iKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKaW5kZXggOGYyMzIwYS4uYzdiYjVmNyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKQEAgLTExOSwxMyArMTE5LDE1IEBACiAjZGVmaW5lCUROX0hBU0hNQVNLCShETl9IQVNITUFYLTEpCiAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZAlhdXRoX2RvbWFpbl90YWJsZVtETl9IQVNITUFYXTsKLXN0YXRpYyBzcGlubG9ja190CWF1dGhfZG9tYWluX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgc3BpbmxvY2tfdAlhdXRoX2RvbWFpbl9sb2NrID0KKwlfX1NQSU5fTE9DS19VTkxPQ0tFRChhdXRoX2RvbWFpbl9sb2NrKTsKIAogdm9pZCBhdXRoX2RvbWFpbl9wdXQoc3RydWN0IGF1dGhfZG9tYWluICpkb20pCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJmRvbS0+cmVmLnJlZmNvdW50LCAmYXV0aF9kb21haW5fbG9jaykpIHsKIAkJaGxpc3RfZGVsKCZkb20tPmhhc2gpOwogCQlkb20tPmZsYXZvdXItPmRvbWFpbl9yZWxlYXNlKGRvbSk7CisJCXNwaW5fdW5sb2NrKCZhdXRoX2RvbWFpbl9sb2NrKTsKIAl9CiB9CiAKQEAgLTE0NywxMCArMTQ5LDggQEAKIAkJCXJldHVybiBocDsKIAkJfQogCX0KLQlpZiAobmV3KSB7CisJaWYgKG5ldykKIAkJaGxpc3RfYWRkX2hlYWQoJm5ldy0+aGFzaCwgaGVhZCk7Ci0JCWtyZWZfZ2V0KCZuZXctPnJlZik7Ci0JfQogCXNwaW5fdW5sb2NrKCZhdXRoX2RvbWFpbl9sb2NrKTsKIAlyZXR1cm4gbmV3OwogfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKaW5kZXggZTFiZDkzMy4uMGQxZThmYiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCkBAIC01Myw2ICs1MywxMCBAQAogCQkJcmV0dXJuIE5VTEw7CiAJCWtyZWZfaW5pdCgmbmV3LT5oLnJlZik7CiAJCW5ldy0+aC5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ldy0+aC5uYW1lID09IE5VTEwpIHsKKwkJCWtmcmVlKG5ldyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCQluZXctPmguZmxhdm91ciA9ICZzdmNhdXRoX3VuaXg7CiAJCW5ldy0+YWRkcl9jaGFuZ2VzID0gMDsKIAkJcnYgPSBhdXRoX2RvbWFpbl9sb29rdXAobmFtZSwgJm5ldy0+aCk7CkBAIC0xMDEsOSArMTA1LDkgQEAKICAqIElQIGFkZHJlc3NlcyBpbiByZXZlcnNlLWVuZGlhbiAoaS5lLiBvbiBhIGxpdHRsZS1lbmRpYW4gbWFjaGluZSkuCiAgKiBTbyB1c2UgYSB0cml2aWFsIGJ1dCByZWxpYWJsZSBoYXNoIGluc3RlYWQKICAqLwotc3RhdGljIGlubGluZSBpbnQgaGFzaF9pcCh1bnNpZ25lZCBsb25nIGlwKQorc3RhdGljIGlubGluZSBpbnQgaGFzaF9pcChfX2JlMzIgaXApCiB7Ci0JaW50IGhhc2ggPSBpcCBeIChpcD4+MTYpOworCWludCBoYXNoID0gKF9fZm9yY2UgdTMyKWlwIF4gKChfX2ZvcmNlIHUzMilpcD4+MTYpOwogCXJldHVybiAoaGFzaCBeIChoYXNoPj44KSkgJiAweGZmOwogfQogI2VuZGlmCkBAIC0yODQsNyArMjg4LDcgQEAKIAlpcC5tX2FkZHIgPSBhZGRyOwogCWNoID0gc3VucnBjX2NhY2hlX2xvb2t1cCgmaXBfbWFwX2NhY2hlLCAmaXAuaCwKIAkJCQkgaGFzaF9zdHIoY2xhc3MsIElQX0hBU0hCSVRTKSBeCi0JCQkJIGhhc2hfaXAoKHVuc2lnbmVkIGxvbmcpYWRkci5zX2FkZHIpKTsKKwkJCQkgaGFzaF9pcChhZGRyLnNfYWRkcikpOwogCiAJaWYgKGNoKQogCQlyZXR1cm4gY29udGFpbmVyX29mKGNoLCBzdHJ1Y3QgaXBfbWFwLCBoKTsKQEAgLTMxMyw3ICszMTcsNyBAQAogCWNoID0gc3VucnBjX2NhY2hlX3VwZGF0ZSgmaXBfbWFwX2NhY2hlLAogCQkJCSAmaXAuaCwgJmlwbS0+aCwKIAkJCQkgaGFzaF9zdHIoaXBtLT5tX2NsYXNzLCBJUF9IQVNIQklUUykgXgotCQkJCSBoYXNoX2lwKCh1bnNpZ25lZCBsb25nKWlwbS0+bV9hZGRyLnNfYWRkcikpOworCQkJCSBoYXNoX2lwKGlwbS0+bV9hZGRyLnNfYWRkcikpOwogCWlmICghY2gpCiAJCXJldHVybiAtRU5PTUVNOwogCWNhY2hlX3B1dChjaCwgJmlwX21hcF9jYWNoZSk7CkBAIC00MzUsNiArNDM5LDcgQEAKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQljYXNlIC1FQUdBSU46CisJCWNhc2UgLUVUSU1FRE9VVDoKIAkJCXJldHVybiBTVkNfRFJPUDsKIAkJY2FzZSAtRU5PRU5UOgogCQkJcmV0dXJuIFNWQ19ERU5JRUQ7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y3NvY2suYyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCmluZGV4IDYxZTMwN2MuLjk5ZjU0ZmIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3Zjc29jay5jCisrKyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgpAQCAtODQsNiArODUsMzUgQEAKICAqLwogc3RhdGljIGludCBzdmNfY29ubl9hZ2VfcGVyaW9kID0gNio2MDsKIAorI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHN2Y19rZXlbMl07CitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHN2Y19zbG9ja19rZXlbMl07CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdmNfcmVjbGFzc2lmeV9zb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlCVUdfT04oc2stPnNrX2xvY2sub3duZXIgIT0gTlVMTCk7CisJc3dpdGNoIChzay0+c2tfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlzb2NrX2xvY2tfaW5pdF9jbGFzc19hbmRfbmFtZShzaywgInNsb2NrLUFGX0lORVQtTkZTRCIsCisJCSAgICAmc3ZjX3Nsb2NrX2tleVswXSwgInNrX2xvY2stQUZfSU5FVC1ORlNEIiwgJnN2Y19rZXlbMF0pOworCQlicmVhazsKKworCWNhc2UgQUZfSU5FVDY6CisJCXNvY2tfbG9ja19pbml0X2NsYXNzX2FuZF9uYW1lKHNrLCAic2xvY2stQUZfSU5FVDYtTkZTRCIsCisJCSAgICAmc3ZjX3Nsb2NrX2tleVsxXSwgInNrX2xvY2stQUZfSU5FVDYtTkZTRCIsICZzdmNfa2V5WzFdKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHN2Y19yZWNsYXNzaWZ5X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworfQorI2VuZGlmCisKIC8qCiAgKiBRdWV1ZSB1cCBhbiBpZGxlIHNlcnZlciB0aHJlYWQuICBNdXN0IGhhdmUgcG9vbC0+c3BfbG9jayBoZWxkLgogICogTm90ZTogdGhpcyBpcyByZWFsbHkgYSBzdGFjayByYXRoZXIgdGhhbiBhIHF1ZXVlLCBzbyB0aGF0IHdlIG9ubHkKQEAgLTI5OSw5ICszMjksMTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogc3ZjX3NvY2tfcHV0KHN0cnVjdCBzdmNfc29jayAqc3ZzaykKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3Zzay0+c2tfaW51c2UpICYmIHRlc3RfYml0KFNLX0RFQUQsICZzdnNrLT5za19mbGFncykpIHsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3Zzay0+c2tfaW51c2UpICYmCisJCQl0ZXN0X2JpdChTS19ERUFELCAmc3Zzay0+c2tfZmxhZ3MpKSB7CiAJCWRwcmludGsoInN2YzogcmVsZWFzaW5nIGRlYWQgc29ja2V0XG4iKTsKLQkJc29ja19yZWxlYXNlKHN2c2stPnNrX3NvY2spOworCQlpZiAoc3Zzay0+c2tfc29jay0+ZmlsZSkKKwkJCXNvY2tmZF9wdXQoc3Zzay0+c2tfc29jayk7CisJCWVsc2UKKwkJCXNvY2tfcmVsZWFzZShzdnNrLT5za19zb2NrKTsKKwkJaWYgKHN2c2stPnNrX2luZm9fYXV0aHVuaXggIT0gTlVMTCkKKwkJCXN2Y2F1dGhfdW5peF9pbmZvX3JlbGVhc2Uoc3Zzay0+c2tfaW5mb19hdXRodW5peCk7CiAJCWtmcmVlKHN2c2spOwogCX0KIH0KQEAgLTk3Myw3ICsxMDA5LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHRlc3RfYml0KFNLX0NPTk4sICZzdnNrLT5za19mbGFncykpIHsKKwlpZiAoc3Zzay0+c2tfc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pIHsKIAkJc3ZjX3RjcF9hY2NlcHQoc3Zzayk7CiAJCXN2Y19zb2NrX3JlY2VpdmVkKHN2c2spOwogCQlyZXR1cm4gMDsKQEAgLTE1NTAsNiArMTU4Niw4IEBACiAJaWYgKChlcnJvciA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVCwgdHlwZSwgcHJvdG9jb2wsICZzb2NrKSkgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKKwlzdmNfcmVjbGFzc2lmeV9zb2NrZXQoc29jayk7CisKIAlpZiAodHlwZSA9PSBTT0NLX1NUUkVBTSkKIAkJc29jay0+c2stPnNrX3JldXNlID0gMTsgLyogYWxsb3cgYWRkcmVzcyByZXVzZSAqLwogCWVycm9yID0ga2VybmVsX2JpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSBzaW4sCkBAIC0xNjA0LDIwICsxNjQyLDEzIEBACiAJCWlmICh0ZXN0X2JpdChTS19URU1QLCAmc3Zzay0+c2tfZmxhZ3MpKQogCQkJc2Vydi0+c3ZfdG1wY250LS07CiAKLQlpZiAoIWF0b21pY19yZWFkKCZzdnNrLT5za19pbnVzZSkpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOwotCQlpZiAoc3Zzay0+c2tfc29jay0+ZmlsZSkKLQkJCXNvY2tmZF9wdXQoc3Zzay0+c2tfc29jayk7Ci0JCWVsc2UKLQkJCXNvY2tfcmVsZWFzZShzdnNrLT5za19zb2NrKTsKLQkJaWYgKHN2c2stPnNrX2luZm9fYXV0aHVuaXggIT0gTlVMTCkKLQkJCXN2Y2F1dGhfdW5peF9pbmZvX3JlbGVhc2Uoc3Zzay0+c2tfaW5mb19hdXRodW5peCk7Ci0JCWtmcmVlKHN2c2spOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKLQkJZHByaW50ayhLRVJOX05PVElDRSAic3ZjOiBzZXJ2ZXIgc29ja2V0IGRlc3Ryb3kgZGVsYXllZFxuIik7Ci0JCS8qIHN2c2stPnNrX3NlcnZlciA9IE5VTEw7ICovCi0JfQorCS8qIFRoaXMgYXRvbWljX2luYyBzaG91bGQgYmUgbmVlZGVkIC0gc3ZjX2RlbGV0ZV9zb2NrZXQKKwkgKiBzaG91bGQgaGF2ZSB0aGUgc2VtYW50aWMgb2YgZHJvcHBpbmcgYSByZWZlcmVuY2UuCisJICogQnV0IGl0IGRvZXNuJ3QgeWV0Li4uLgorCSAqLworCWF0b21pY19pbmMoJnN2c2stPnNrX2ludXNlKTsKKwlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CisJc3ZjX3NvY2tfcHV0KHN2c2spOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zeXNjdGwuYyBiL25ldC9zdW5ycGMvc3lzY3RsLmMKaW5kZXggZDg5YjA0OC4uODJiMjc1MiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zeXNjdGwuYworKysgYi9uZXQvc3VucnBjL3N5c2N0bC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KIAogLyoKICAqIERlY2xhcmUgdGhlIGRlYnVnIGZsYWdzIGhlcmUKQEAgLTExOSwxMSArMTE4LDYgQEAKIH0KIAogCi1zdGF0aWMgdW5zaWduZWQgaW50IG1pbl9zbG90X3RhYmxlX3NpemUgPSBSUENfTUlOX1NMT1RfVEFCTEU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG1heF9zbG90X3RhYmxlX3NpemUgPSBSUENfTUFYX1NMT1RfVEFCTEU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHhwcnRfbWluX3Jlc3Zwb3J0X2xpbWl0ID0gUlBDX01JTl9SRVNWUE9SVDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgeHBydF9tYXhfcmVzdnBvcnRfbGltaXQgPSBSUENfTUFYX1JFU1ZQT1JUOwotCiBzdGF0aWMgY3RsX3RhYmxlIGRlYnVnX3RhYmxlW10gPSB7CiAJewogCQkuY3RsX25hbWUJPSBDVExfUlBDREVCVUcsCkBAIC0xNTcsNTAgKzE1MSw2IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2RlYnVnCiAJfSwgCi0JewotCQkuY3RsX25hbWUJPSBDVExfU0xPVFRBQkxFX1VEUCwKLQkJLnByb2NuYW1lCT0gInVkcF9zbG90X3RhYmxlX2VudHJpZXMiLAotCQkuZGF0YQkJPSAmeHBydF91ZHBfc2xvdF90YWJsZV9lbnRyaWVzLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKLQkJLmV4dHJhMQkJPSAmbWluX3Nsb3RfdGFibGVfc2l6ZSwKLQkJLmV4dHJhMgkJPSAmbWF4X3Nsb3RfdGFibGVfc2l6ZQotCX0sCi0JewotCQkuY3RsX25hbWUJPSBDVExfU0xPVFRBQkxFX1RDUCwKLQkJLnByb2NuYW1lCT0gInRjcF9zbG90X3RhYmxlX2VudHJpZXMiLAotCQkuZGF0YQkJPSAmeHBydF90Y3Bfc2xvdF90YWJsZV9lbnRyaWVzLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKLQkJLmV4dHJhMQkJPSAmbWluX3Nsb3RfdGFibGVfc2l6ZSwKLQkJLmV4dHJhMgkJPSAmbWF4X3Nsb3RfdGFibGVfc2l6ZQotCX0sCi0JewotCQkuY3RsX25hbWUJPSBDVExfTUlOX1JFU1ZQT1JULAotCQkucHJvY25hbWUJPSAibWluX3Jlc3Zwb3J0IiwKLQkJLmRhdGEJCT0gJnhwcnRfbWluX3Jlc3Zwb3J0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKLQkJLmV4dHJhMQkJPSAmeHBydF9taW5fcmVzdnBvcnRfbGltaXQsCi0JCS5leHRyYTIJCT0gJnhwcnRfbWF4X3Jlc3Zwb3J0X2xpbWl0Ci0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IENUTF9NQVhfUkVTVlBPUlQsCi0JCS5wcm9jbmFtZQk9ICJtYXhfcmVzdnBvcnQiLAotCQkuZGF0YQkJPSAmeHBydF9tYXhfcmVzdnBvcnQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCi0JCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAotCQkuZXh0cmExCQk9ICZ4cHJ0X21pbl9yZXN2cG9ydF9saW1pdCwKLQkJLmV4dHJhMgkJPSAmeHBydF9tYXhfcmVzdnBvcnRfbGltaXQKLQl9LAogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hkci5jIGIvbmV0L3N1bnJwYy94ZHIuYwppbmRleCA5MDIyZWI4Li5hMGFmMjUwIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hkci5jCisrKyBiL25ldC9zdW5ycGMveGRyLmMKQEAgLTY0MCw0MSArNjQwLDMwIEBACiAJYnVmLT5idWZsZW4gPSBidWYtPmxlbiA9IGlvdi0+aW92X2xlbjsKIH0KIAotLyogU2V0cyBzdWJpb3YgdG8gdGhlIGludGVyc2VjdGlvbiBvZiBpb3Ygd2l0aCB0aGUgYnVmZmVyIG9mIGxlbmd0aCBsZW4KLSAqIHN0YXJ0aW5nIGJhc2UgYnl0ZXMgYWZ0ZXIgaW92LiAgSW5kaWNhdGVzIGVtcHR5IGludGVyc2VjdGlvbiBieSBzZXR0aW5nCi0gKiBsZW5ndGggb2Ygc3ViaW92IHRvIHplcm8uICBEZWNyZW1lbnRzIGxlbiBieSBsZW5ndGggb2Ygc3ViaW92LCBzZXRzIGJhc2UKLSAqIHRvIHplcm8gKG9yIGRlY3JlbWVudHMgaXQgYnkgbGVuZ3RoIG9mIGlvdiBpZiBzdWJpb3YgaXMgZW1wdHkpLiAqLwotc3RhdGljIHZvaWQKLWlvdl9zdWJzZWdtZW50KHN0cnVjdCBrdmVjICppb3YsIHN0cnVjdCBrdmVjICpzdWJpb3YsIGludCAqYmFzZSwgaW50ICpsZW4pCi17Ci0JaWYgKCpiYXNlID4gaW92LT5pb3ZfbGVuKSB7Ci0JCXN1Ymlvdi0+aW92X2Jhc2UgPSBOVUxMOwotCQlzdWJpb3YtPmlvdl9sZW4gPSAwOwotCQkqYmFzZSAtPSBpb3YtPmlvdl9sZW47Ci0JfSBlbHNlIHsKLQkJc3ViaW92LT5pb3ZfYmFzZSA9IGlvdi0+aW92X2Jhc2UgKyAqYmFzZTsKLQkJc3ViaW92LT5pb3ZfbGVuID0gbWluKCpsZW4sIChpbnQpaW92LT5pb3ZfbGVuIC0gKmJhc2UpOwotCQkqYmFzZSA9IDA7Ci0JfQotCSpsZW4gLT0gc3ViaW92LT5pb3ZfbGVuOyAKLX0KLQogLyogU2V0cyBzdWJidWYgdG8gdGhlIHBvcnRpb24gb2YgYnVmIG9mIGxlbmd0aCBsZW4gYmVnaW5uaW5nIGJhc2UgYnl0ZXMKICAqIGZyb20gdGhlIHN0YXJ0IG9mIGJ1Zi4gUmV0dXJucyAtMSBpZiBiYXNlIG9mIGxlbmd0aCBhcmUgb3V0IG9mIGJvdW5kcy4gKi8KIGludAogeGRyX2J1Zl9zdWJzZWdtZW50KHN0cnVjdCB4ZHJfYnVmICpidWYsIHN0cnVjdCB4ZHJfYnVmICpzdWJidWYsCi0JCQlpbnQgYmFzZSwgaW50IGxlbikKKwkJCXVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCWludCBpOwotCiAJc3ViYnVmLT5idWZsZW4gPSBzdWJidWYtPmxlbiA9IGxlbjsKLQlpb3Zfc3Vic2VnbWVudChidWYtPmhlYWQsIHN1YmJ1Zi0+aGVhZCwgJmJhc2UsICZsZW4pOworCWlmIChiYXNlIDwgYnVmLT5oZWFkWzBdLmlvdl9sZW4pIHsKKwkJc3ViYnVmLT5oZWFkWzBdLmlvdl9iYXNlID0gYnVmLT5oZWFkWzBdLmlvdl9iYXNlICsgYmFzZTsKKwkJc3ViYnVmLT5oZWFkWzBdLmlvdl9sZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwKKwkJCQkJCWJ1Zi0+aGVhZFswXS5pb3ZfbGVuIC0gYmFzZSk7CisJCWxlbiAtPSBzdWJidWYtPmhlYWRbMF0uaW92X2xlbjsKKwkJYmFzZSA9IDA7CisJfSBlbHNlIHsKKwkJc3ViYnVmLT5oZWFkWzBdLmlvdl9iYXNlID0gTlVMTDsKKwkJc3ViYnVmLT5oZWFkWzBdLmlvdl9sZW4gPSAwOworCQliYXNlIC09IGJ1Zi0+aGVhZFswXS5pb3ZfbGVuOworCX0KIAogCWlmIChiYXNlIDwgYnVmLT5wYWdlX2xlbikgewotCQlpID0gKGJhc2UgKyBidWYtPnBhZ2VfYmFzZSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJc3ViYnVmLT5wYWdlcyA9ICZidWYtPnBhZ2VzW2ldOwotCQlzdWJidWYtPnBhZ2VfYmFzZSA9IChiYXNlICsgYnVmLT5wYWdlX2Jhc2UpICYgflBBR0VfQ0FDSEVfTUFTSzsKLQkJc3ViYnVmLT5wYWdlX2xlbiA9IG1pbigoaW50KWJ1Zi0+cGFnZV9sZW4gLSBiYXNlLCBsZW4pOworCQlzdWJidWYtPnBhZ2VfbGVuID0gbWluKGJ1Zi0+cGFnZV9sZW4gLSBiYXNlLCBsZW4pOworCQliYXNlICs9IGJ1Zi0+cGFnZV9iYXNlOworCQlzdWJidWYtPnBhZ2VfYmFzZSA9IGJhc2UgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlzdWJidWYtPnBhZ2VzID0gJmJ1Zi0+cGFnZXNbYmFzZSA+PiBQQUdFX0NBQ0hFX1NISUZUXTsKIAkJbGVuIC09IHN1YmJ1Zi0+cGFnZV9sZW47CiAJCWJhc2UgPSAwOwogCX0gZWxzZSB7CkBAIC02ODIsNjYgKzY3MSw4NSBAQAogCQlzdWJidWYtPnBhZ2VfbGVuID0gMDsKIAl9CiAKLQlpb3Zfc3Vic2VnbWVudChidWYtPnRhaWwsIHN1YmJ1Zi0+dGFpbCwgJmJhc2UsICZsZW4pOworCWlmIChiYXNlIDwgYnVmLT50YWlsWzBdLmlvdl9sZW4pIHsKKwkJc3ViYnVmLT50YWlsWzBdLmlvdl9iYXNlID0gYnVmLT50YWlsWzBdLmlvdl9iYXNlICsgYmFzZTsKKwkJc3ViYnVmLT50YWlsWzBdLmlvdl9sZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwKKwkJCQkJCWJ1Zi0+dGFpbFswXS5pb3ZfbGVuIC0gYmFzZSk7CisJCWxlbiAtPSBzdWJidWYtPnRhaWxbMF0uaW92X2xlbjsKKwkJYmFzZSA9IDA7CisJfSBlbHNlIHsKKwkJc3ViYnVmLT50YWlsWzBdLmlvdl9iYXNlID0gTlVMTDsKKwkJc3ViYnVmLT50YWlsWzBdLmlvdl9sZW4gPSAwOworCQliYXNlIC09IGJ1Zi0+dGFpbFswXS5pb3ZfbGVuOworCX0KKwogCWlmIChiYXNlIHx8IGxlbikKIAkJcmV0dXJuIC0xOwogCXJldHVybiAwOwogfQogCi0vKiBvYmogaXMgYXNzdW1lZCB0byBwb2ludCB0byBhbGxvY2F0ZWQgbWVtb3J5IG9mIHNpemUgYXQgbGVhc3QgbGVuOiAqLwotaW50Ci1yZWFkX2J5dGVzX2Zyb21feGRyX2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCBpbnQgYmFzZSwgdm9pZCAqb2JqLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgX19yZWFkX2J5dGVzX2Zyb21feGRyX2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqc3ViYnVmLCB2b2lkICpvYmosIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0Jc3RydWN0IHhkcl9idWYgc3ViYnVmOwotCWludCB0aGlzX2xlbjsKLQlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCB0aGlzX2xlbjsKIAotCXN0YXR1cyA9IHhkcl9idWZfc3Vic2VnbWVudChidWYsICZzdWJidWYsIGJhc2UsIGxlbik7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0JdGhpc19sZW4gPSBtaW4obGVuLCAoaW50KXN1YmJ1Zi5oZWFkWzBdLmlvdl9sZW4pOwotCW1lbWNweShvYmosIHN1YmJ1Zi5oZWFkWzBdLmlvdl9iYXNlLCB0aGlzX2xlbik7CisJdGhpc19sZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc3ViYnVmLT5oZWFkWzBdLmlvdl9sZW4pOworCW1lbWNweShvYmosIHN1YmJ1Zi0+aGVhZFswXS5pb3ZfYmFzZSwgdGhpc19sZW4pOwogCWxlbiAtPSB0aGlzX2xlbjsKIAlvYmogKz0gdGhpc19sZW47Ci0JdGhpc19sZW4gPSBtaW4obGVuLCAoaW50KXN1YmJ1Zi5wYWdlX2xlbik7CisJdGhpc19sZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc3ViYnVmLT5wYWdlX2xlbik7CiAJaWYgKHRoaXNfbGVuKQotCQlfY29weV9mcm9tX3BhZ2VzKG9iaiwgc3ViYnVmLnBhZ2VzLCBzdWJidWYucGFnZV9iYXNlLCB0aGlzX2xlbik7CisJCV9jb3B5X2Zyb21fcGFnZXMob2JqLCBzdWJidWYtPnBhZ2VzLCBzdWJidWYtPnBhZ2VfYmFzZSwgdGhpc19sZW4pOwogCWxlbiAtPSB0aGlzX2xlbjsKIAlvYmogKz0gdGhpc19sZW47Ci0JdGhpc19sZW4gPSBtaW4obGVuLCAoaW50KXN1YmJ1Zi50YWlsWzBdLmlvdl9sZW4pOwotCW1lbWNweShvYmosIHN1YmJ1Zi50YWlsWzBdLmlvdl9iYXNlLCB0aGlzX2xlbik7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwl0aGlzX2xlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzdWJidWYtPnRhaWxbMF0uaW92X2xlbik7CisJbWVtY3B5KG9iaiwgc3ViYnVmLT50YWlsWzBdLmlvdl9iYXNlLCB0aGlzX2xlbik7CiB9CiAKIC8qIG9iaiBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIGFsbG9jYXRlZCBtZW1vcnkgb2Ygc2l6ZSBhdCBsZWFzdCBsZW46ICovCi1pbnQKLXdyaXRlX2J5dGVzX3RvX3hkcl9idWYoc3RydWN0IHhkcl9idWYgKmJ1ZiwgaW50IGJhc2UsIHZvaWQgKm9iaiwgaW50IGxlbikKK2ludCByZWFkX2J5dGVzX2Zyb21feGRyX2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCB1bnNpZ25lZCBpbnQgYmFzZSwgdm9pZCAqb2JqLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCB4ZHJfYnVmIHN1YmJ1ZjsKLQlpbnQgdGhpc19sZW47CiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IHhkcl9idWZfc3Vic2VnbWVudChidWYsICZzdWJidWYsIGJhc2UsIGxlbik7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBvdXQ7Ci0JdGhpc19sZW4gPSBtaW4obGVuLCAoaW50KXN1YmJ1Zi5oZWFkWzBdLmlvdl9sZW4pOwotCW1lbWNweShzdWJidWYuaGVhZFswXS5pb3ZfYmFzZSwgb2JqLCB0aGlzX2xlbik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gc3RhdHVzOworCV9fcmVhZF9ieXRlc19mcm9tX3hkcl9idWYoJnN1YmJ1Ziwgb2JqLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX3dyaXRlX2J5dGVzX3RvX3hkcl9idWYoc3RydWN0IHhkcl9idWYgKnN1YmJ1Ziwgdm9pZCAqb2JqLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCB0aGlzX2xlbjsKKworCXRoaXNfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHN1YmJ1Zi0+aGVhZFswXS5pb3ZfbGVuKTsKKwltZW1jcHkoc3ViYnVmLT5oZWFkWzBdLmlvdl9iYXNlLCBvYmosIHRoaXNfbGVuKTsKIAlsZW4gLT0gdGhpc19sZW47CiAJb2JqICs9IHRoaXNfbGVuOwotCXRoaXNfbGVuID0gbWluKGxlbiwgKGludClzdWJidWYucGFnZV9sZW4pOworCXRoaXNfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHN1YmJ1Zi0+cGFnZV9sZW4pOwogCWlmICh0aGlzX2xlbikKLQkJX2NvcHlfdG9fcGFnZXMoc3ViYnVmLnBhZ2VzLCBzdWJidWYucGFnZV9iYXNlLCBvYmosIHRoaXNfbGVuKTsKKwkJX2NvcHlfdG9fcGFnZXMoc3ViYnVmLT5wYWdlcywgc3ViYnVmLT5wYWdlX2Jhc2UsIG9iaiwgdGhpc19sZW4pOwogCWxlbiAtPSB0aGlzX2xlbjsKIAlvYmogKz0gdGhpc19sZW47Ci0JdGhpc19sZW4gPSBtaW4obGVuLCAoaW50KXN1YmJ1Zi50YWlsWzBdLmlvdl9sZW4pOwotCW1lbWNweShzdWJidWYudGFpbFswXS5pb3ZfYmFzZSwgb2JqLCB0aGlzX2xlbik7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXR1czsKKwl0aGlzX2xlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzdWJidWYtPnRhaWxbMF0uaW92X2xlbik7CisJbWVtY3B5KHN1YmJ1Zi0+dGFpbFswXS5pb3ZfYmFzZSwgb2JqLCB0aGlzX2xlbik7Cit9CisKKy8qIG9iaiBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIGFsbG9jYXRlZCBtZW1vcnkgb2Ygc2l6ZSBhdCBsZWFzdCBsZW46ICovCitpbnQgd3JpdGVfYnl0ZXNfdG9feGRyX2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCB1bnNpZ25lZCBpbnQgYmFzZSwgdm9pZCAqb2JqLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCB4ZHJfYnVmIHN1YmJ1ZjsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0geGRyX2J1Zl9zdWJzZWdtZW50KGJ1ZiwgJnN1YmJ1ZiwgYmFzZSwgbGVuKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisJX193cml0ZV9ieXRlc190b194ZHJfYnVmKCZzdWJidWYsIG9iaiwgbGVuKTsKKwlyZXR1cm4gMDsKIH0KIAogaW50Ci14ZHJfZGVjb2RlX3dvcmQoc3RydWN0IHhkcl9idWYgKmJ1ZiwgaW50IGJhc2UsIHUzMiAqb2JqKQoreGRyX2RlY29kZV93b3JkKHN0cnVjdCB4ZHJfYnVmICpidWYsIHVuc2lnbmVkIGludCBiYXNlLCB1MzIgKm9iaikKIHsKIAlfX2JlMzIJcmF3OwogCWludAlzdGF0dXM7CkBAIC03NTQsNyArNzYyLDcgQEAKIH0KIAogaW50Ci14ZHJfZW5jb2RlX3dvcmQoc3RydWN0IHhkcl9idWYgKmJ1ZiwgaW50IGJhc2UsIHUzMiBvYmopCit4ZHJfZW5jb2RlX3dvcmQoc3RydWN0IHhkcl9idWYgKmJ1ZiwgdW5zaWduZWQgaW50IGJhc2UsIHUzMiBvYmopCiB7CiAJX19iZTMyCXJhdyA9IGh0b25sKG9iaik7CiAKQEAgLTc2NSw0NCArNzczLDM3IEBACiAgKiBlbnRpcmVseSBpbiB0aGUgaGVhZCBvciB0aGUgdGFpbCwgc2V0IG9iamVjdCB0byBwb2ludCB0byBpdDsgb3RoZXJ3aXNlCiAgKiB0cnkgdG8gZmluZCBzcGFjZSBmb3IgaXQgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCwgY29weSBpdCB0aGVyZSwgYW5kCiAgKiBzZXQgb2JqIHRvIHBvaW50IHRvIGl0LiAqLwotaW50Ci14ZHJfYnVmX3JlYWRfbmV0b2JqKHN0cnVjdCB4ZHJfYnVmICpidWYsIHN0cnVjdCB4ZHJfbmV0b2JqICpvYmosIGludCBvZmZzZXQpCitpbnQgeGRyX2J1Zl9yZWFkX25ldG9iaihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2JqLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewotCXUzMgl0YWlsX29mZnNldCA9IGJ1Zi0+aGVhZFswXS5pb3ZfbGVuICsgYnVmLT5wYWdlX2xlbjsKLQl1MzIJb2JqX2VuZF9vZmZzZXQ7CisJc3RydWN0IHhkcl9idWYgc3ViYnVmOwogCiAJaWYgKHhkcl9kZWNvZGVfd29yZChidWYsIG9mZnNldCwgJm9iai0+bGVuKSkKLQkJZ290byBvdXQ7Ci0Jb2JqX2VuZF9vZmZzZXQgPSBvZmZzZXQgKyA0ICsgb2JqLT5sZW47CisJCXJldHVybiAtRUZBVUxUOworCWlmICh4ZHJfYnVmX3N1YnNlZ21lbnQoYnVmLCAmc3ViYnVmLCBvZmZzZXQgKyA0LCBvYmotPmxlbikpCisJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKG9ial9lbmRfb2Zmc2V0IDw9IGJ1Zi0+aGVhZFswXS5pb3ZfbGVuKSB7Ci0JCS8qIFRoZSBvYmogaXMgY29udGFpbmVkIGVudGlyZWx5IGluIHRoZSBoZWFkOiAqLwotCQlvYmotPmRhdGEgPSBidWYtPmhlYWRbMF0uaW92X2Jhc2UgKyBvZmZzZXQgKyA0OwotCX0gZWxzZSBpZiAob2Zmc2V0ICsgNCA+PSB0YWlsX29mZnNldCkgewotCQlpZiAob2JqX2VuZF9vZmZzZXQgLSB0YWlsX29mZnNldAotCQkJCT4gYnVmLT50YWlsWzBdLmlvdl9sZW4pCi0JCQlnb3RvIG91dDsKLQkJLyogVGhlIG9iaiBpcyBjb250YWluZWQgZW50aXJlbHkgaW4gdGhlIHRhaWw6ICovCi0JCW9iai0+ZGF0YSA9IGJ1Zi0+dGFpbFswXS5pb3ZfYmFzZQotCQkJKyBvZmZzZXQgLSB0YWlsX29mZnNldCArIDQ7Ci0JfSBlbHNlIHsKLQkJLyogdXNlIGVuZCBvZiB0YWlsIGFzIHN0b3JhZ2UgZm9yIG9iajoKLQkJICogKFdlIGRvbid0IGNvcHkgdG8gdGhlIGJlZ2lubmluZyBiZWNhdXNlIHRoZW4gd2UnZCBoYXZlCi0JCSAqIHRvIHdvcnJ5IGFib3V0IGRvaW5nIGEgcG90ZW50aWFsbHkgb3ZlcmxhcHBpbmcgY29weS4KLQkJICogVGhpcyBhc3N1bWVzIHRoZSBvYmplY3QgaXMgYXQgbW9zdCBoYWxmIHRoZSBsZW5ndGggb2YgdGhlCi0JCSAqIHRhaWwuKSAqLwotCQlpZiAob2JqLT5sZW4gPiBidWYtPnRhaWxbMF0uaW92X2xlbikKLQkJCWdvdG8gb3V0OwotCQlvYmotPmRhdGEgPSBidWYtPnRhaWxbMF0uaW92X2Jhc2UgKyBidWYtPnRhaWxbMF0uaW92X2xlbiAtIAotCQkJCW9iai0+bGVuOwotCQlpZiAocmVhZF9ieXRlc19mcm9tX3hkcl9idWYoYnVmLCBvZmZzZXQgKyA0LAotCQkJCQlvYmotPmRhdGEsIG9iai0+bGVuKSkKLQkJCWdvdG8gb3V0OworCS8qIElzIHRoZSBvYmogY29udGFpbmVkIGVudGlyZWx5IGluIHRoZSBoZWFkPyAqLworCW9iai0+ZGF0YSA9IHN1YmJ1Zi5oZWFkWzBdLmlvdl9iYXNlOworCWlmIChzdWJidWYuaGVhZFswXS5pb3ZfbGVuID09IG9iai0+bGVuKQorCQlyZXR1cm4gMDsKKwkvKiAuLm9yIGlzIHRoZSBvYmogY29udGFpbmVkIGVudGlyZWx5IGluIHRoZSB0YWlsPyAqLworCW9iai0+ZGF0YSA9IHN1YmJ1Zi50YWlsWzBdLmlvdl9iYXNlOworCWlmIChzdWJidWYudGFpbFswXS5pb3ZfbGVuID09IG9iai0+bGVuKQorCQlyZXR1cm4gMDsKIAotCX0KKwkvKiB1c2UgZW5kIG9mIHRhaWwgYXMgc3RvcmFnZSBmb3Igb2JqOgorCSAqIChXZSBkb24ndCBjb3B5IHRvIHRoZSBiZWdpbm5pbmcgYmVjYXVzZSB0aGVuIHdlJ2QgaGF2ZQorCSAqIHRvIHdvcnJ5IGFib3V0IGRvaW5nIGEgcG90ZW50aWFsbHkgb3ZlcmxhcHBpbmcgY29weS4KKwkgKiBUaGlzIGFzc3VtZXMgdGhlIG9iamVjdCBpcyBhdCBtb3N0IGhhbGYgdGhlIGxlbmd0aCBvZiB0aGUKKwkgKiB0YWlsLikgKi8KKwlpZiAob2JqLT5sZW4gPiBidWYtPmJ1ZmxlbiAtIGJ1Zi0+bGVuKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYnVmLT50YWlsWzBdLmlvdl9sZW4gIT0gMCkKKwkJb2JqLT5kYXRhID0gYnVmLT50YWlsWzBdLmlvdl9iYXNlICsgYnVmLT50YWlsWzBdLmlvdl9sZW47CisJZWxzZQorCQlvYmotPmRhdGEgPSBidWYtPmhlYWRbMF0uaW92X2Jhc2UgKyBidWYtPmhlYWRbMF0uaW92X2xlbjsKKwlfX3JlYWRfYnl0ZXNfZnJvbV94ZHJfYnVmKCZzdWJidWYsIG9iai0+ZGF0YSwgb2JqLT5sZW4pOwogCXJldHVybiAwOwotb3V0OgotCXJldHVybiAtMTsKIH0KIAogLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAqLwpAQCAtMTAyMCwzICsxMDIxLDcxIEBACiAKIAlyZXR1cm4geGRyX3hjb2RlX2FycmF5MihidWYsIGJhc2UsIGRlc2MsIDEpOwogfQorCitpbnQKK3hkcl9wcm9jZXNzX2J1ZihzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorICAgICAgICAgICAgICAgIGludCAoKmFjdG9yKShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwl1bnNpZ25lZCBwYWdlX2xlbiwgdGhpc2xlbiwgcGFnZV9vZmZzZXQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICAgICAgc2dbMV07CisKKwlpZiAob2Zmc2V0ID49IGJ1Zi0+aGVhZFswXS5pb3ZfbGVuKSB7CisJCW9mZnNldCAtPSBidWYtPmhlYWRbMF0uaW92X2xlbjsKKwl9IGVsc2UgeworCQl0aGlzbGVuID0gYnVmLT5oZWFkWzBdLmlvdl9sZW4gLSBvZmZzZXQ7CisJCWlmICh0aGlzbGVuID4gbGVuKQorCQkJdGhpc2xlbiA9IGxlbjsKKwkJc2dfc2V0X2J1ZihzZywgYnVmLT5oZWFkWzBdLmlvdl9iYXNlICsgb2Zmc2V0LCB0aGlzbGVuKTsKKwkJcmV0ID0gYWN0b3Ioc2csIGRhdGEpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCW9mZnNldCA9IDA7CisJCWxlbiAtPSB0aGlzbGVuOworCX0KKwlpZiAobGVuID09IDApCisJCWdvdG8gb3V0OworCisJaWYgKG9mZnNldCA+PSBidWYtPnBhZ2VfbGVuKSB7CisJCW9mZnNldCAtPSBidWYtPnBhZ2VfbGVuOworCX0gZWxzZSB7CisJCXBhZ2VfbGVuID0gYnVmLT5wYWdlX2xlbiAtIG9mZnNldDsKKwkJaWYgKHBhZ2VfbGVuID4gbGVuKQorCQkJcGFnZV9sZW4gPSBsZW47CisJCWxlbiAtPSBwYWdlX2xlbjsKKwkJcGFnZV9vZmZzZXQgPSAob2Zmc2V0ICsgYnVmLT5wYWdlX2Jhc2UpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQlpID0gKG9mZnNldCArIGJ1Zi0+cGFnZV9iYXNlKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQl0aGlzbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0gcGFnZV9vZmZzZXQ7CisJCWRvIHsKKwkJCWlmICh0aGlzbGVuID4gcGFnZV9sZW4pCisJCQkJdGhpc2xlbiA9IHBhZ2VfbGVuOworCQkJc2ctPnBhZ2UgPSBidWYtPnBhZ2VzW2ldOworCQkJc2ctPm9mZnNldCA9IHBhZ2Vfb2Zmc2V0OworCQkJc2ctPmxlbmd0aCA9IHRoaXNsZW47CisJCQlyZXQgPSBhY3RvcihzZywgZGF0YSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQkJcGFnZV9sZW4gLT0gdGhpc2xlbjsKKwkJCWkrKzsKKwkJCXBhZ2Vfb2Zmc2V0ID0gMDsKKwkJCXRoaXNsZW4gPSBQQUdFX0NBQ0hFX1NJWkU7CisJCX0gd2hpbGUgKHBhZ2VfbGVuICE9IDApOworCQlvZmZzZXQgPSAwOworCX0KKwlpZiAobGVuID09IDApCisJCWdvdG8gb3V0OworCWlmIChvZmZzZXQgPCBidWYtPnRhaWxbMF0uaW92X2xlbikgeworCQl0aGlzbGVuID0gYnVmLT50YWlsWzBdLmlvdl9sZW4gLSBvZmZzZXQ7CisJCWlmICh0aGlzbGVuID4gbGVuKQorCQkJdGhpc2xlbiA9IGxlbjsKKwkJc2dfc2V0X2J1ZihzZywgYnVmLT50YWlsWzBdLmlvdl9iYXNlICsgb2Zmc2V0LCB0aGlzbGVuKTsKKwkJcmV0ID0gYWN0b3Ioc2csIGRhdGEpOworCQlsZW4gLT0gdGhpc2xlbjsKKwl9CisJaWYgKGxlbiAhPSAwKQorCQlyZXQgPSAtRUlOVkFMOworb3V0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHhkcl9wcm9jZXNzX2J1Zik7CisKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydC5jIGIvbmV0L3N1bnJwYy94cHJ0LmMKaW5kZXggODA4NTc0Ny4uN2EzOTk5ZiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0LmMKQEAgLTQ1OSw3ICs0NTksNiBAQAogCQlpZiAodG8tPnRvX21heHZhbCAmJiByZXEtPnJxX3RpbWVvdXQgPj0gdG8tPnRvX21heHZhbCkKIAkJCXJlcS0+cnFfdGltZW91dCA9IHRvLT50b19tYXh2YWw7CiAJCXJlcS0+cnFfcmV0cmllcysrOwotCQlwcHJpbnRrKCJSUEM6ICVsdSByZXRyYW5zXG4iLCBqaWZmaWVzKTsKIAl9IGVsc2UgewogCQlyZXEtPnJxX3RpbWVvdXQgPSB0by0+dG9faW5pdHZhbDsKIAkJcmVxLT5ycV9yZXRyaWVzID0gMDsKQEAgLTQ2OCw3ICs0NjcsNiBAQAogCQlzcGluX2xvY2tfYmgoJnhwcnQtPnRyYW5zcG9ydF9sb2NrKTsKIAkJcnBjX2luaXRfcnR0KHJlcS0+cnFfdGFzay0+dGtfY2xpZW50LT5jbF9ydHQsIHRvLT50b19pbml0dmFsKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnhwcnQtPnRyYW5zcG9ydF9sb2NrKTsKLQkJcHByaW50aygiUlBDOiAlbHUgdGltZW91dFxuIiwgamlmZmllcyk7CiAJCXN0YXR1cyA9IC1FVElNRURPVVQ7CiAJfQogCkBAIC00NzksOSArNDc3LDEwIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHZvaWQgeHBydF9hdXRvY2xvc2Uodm9pZCAqYXJncykKK3N0YXRpYyB2b2lkIHhwcnRfYXV0b2Nsb3NlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPSAoc3RydWN0IHJwY194cHJ0ICopYXJnczsKKwlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJwY194cHJ0LCB0YXNrX2NsZWFudXApOwogCiAJeHBydF9kaXNjb25uZWN0KHhwcnQpOwogCXhwcnQtPm9wcy0+Y2xvc2UoeHBydCk7CkBAIC04OTEsMzkgKzg5MCwyNSBAQAogICovCiBzdHJ1Y3QgcnBjX3hwcnQgKnhwcnRfY3JlYXRlX3RyYW5zcG9ydChpbnQgcHJvdG8sIHN0cnVjdCBzb2NrYWRkciAqYXAsIHNpemVfdCBzaXplLCBzdHJ1Y3QgcnBjX3RpbWVvdXQgKnRvKQogewotCWludCByZXN1bHQ7CiAJc3RydWN0IHJwY194cHJ0CSp4cHJ0OwogCXN0cnVjdCBycGNfcnFzdAkqcmVxOwogCi0JaWYgKCh4cHJ0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJwY194cHJ0KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJZHByaW50aygiUlBDOiAgICAgIHhwcnRfY3JlYXRlX3RyYW5zcG9ydDogbm8gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCWlmIChzaXplIDw9IHNpemVvZih4cHJ0LT5hZGRyKSkgewotCQltZW1jcHkoJnhwcnQtPmFkZHIsIGFwLCBzaXplKTsKLQkJeHBydC0+YWRkcmxlbiA9IHNpemU7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoeHBydCk7Ci0JCWRwcmludGsoIlJQQzogICAgICB4cHJ0X2NyZWF0ZV90cmFuc3BvcnQ6IGFkZHJlc3MgdG9vIGxhcmdlXG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVCQURGKTsKLQl9Ci0KIAlzd2l0Y2ggKHByb3RvKSB7CiAJY2FzZSBJUFBST1RPX1VEUDoKLQkJcmVzdWx0ID0geHNfc2V0dXBfdWRwKHhwcnQsIHRvKTsKKwkJeHBydCA9IHhzX3NldHVwX3VkcChhcCwgc2l6ZSwgdG8pOwogCQlicmVhazsKIAljYXNlIElQUFJPVE9fVENQOgotCQlyZXN1bHQgPSB4c19zZXR1cF90Y3AoeHBydCwgdG8pOworCQl4cHJ0ID0geHNfc2V0dXBfdGNwKGFwLCBzaXplLCB0byk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiUlBDOiB1bnJlY29nbml6ZWQgdHJhbnNwb3J0IHByb3RvY29sOiAlZFxuIiwKIAkJCQlwcm90byk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KLQlpZiAocmVzdWx0KSB7Ci0JCWtmcmVlKHhwcnQpOwotCQlkcHJpbnRrKCJSUEM6ICAgICAgeHBydF9jcmVhdGVfdHJhbnNwb3J0OiBmYWlsZWQsICVkXG4iLCByZXN1bHQpOwotCQlyZXR1cm4gRVJSX1BUUihyZXN1bHQpOworCWlmIChJU19FUlIoeHBydCkpIHsKKwkJZHByaW50aygiUlBDOiAgICAgIHhwcnRfY3JlYXRlX3RyYW5zcG9ydDogZmFpbGVkLCAlbGRcbiIsCisJCQkJLVBUUl9FUlIoeHBydCkpOworCQlyZXR1cm4geHBydDsKIAl9CiAKIAlrcmVmX2luaXQoJnhwcnQtPmtyZWYpOwpAQCAtOTMyLDcgKzkxNyw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmeHBydC0+ZnJlZSk7CiAJSU5JVF9MSVNUX0hFQUQoJnhwcnQtPnJlY3YpOwotCUlOSVRfV09SSygmeHBydC0+dGFza19jbGVhbnVwLCB4cHJ0X2F1dG9jbG9zZSwgeHBydCk7CisJSU5JVF9XT1JLKCZ4cHJ0LT50YXNrX2NsZWFudXAsIHhwcnRfYXV0b2Nsb3NlKTsKIAlpbml0X3RpbWVyKCZ4cHJ0LT50aW1lcik7CiAJeHBydC0+dGltZXIuZnVuY3Rpb24gPSB4cHJ0X2luaXRfYXV0b2Rpc2Nvbm5lY3Q7CiAJeHBydC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB4cHJ0OwpAQCAtOTY5LDggKzk1NCwxMSBAQAogCWRwcmludGsoIlJQQzogICAgICBkZXN0cm95aW5nIHRyYW5zcG9ydCAlcFxuIiwgeHBydCk7CiAJeHBydC0+c2h1dGRvd24gPSAxOwogCWRlbF90aW1lcl9zeW5jKCZ4cHJ0LT50aW1lcik7CisKKwkvKgorCSAqIFRlYXIgZG93biB0cmFuc3BvcnQgc3RhdGUgYW5kIGZyZWUgdGhlIHJwY194cHJ0CisJICovCiAJeHBydC0+b3BzLT5kZXN0cm95KHhwcnQpOwotCWtmcmVlKHhwcnQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHNvY2suYyBiL25ldC9zdW5ycGMveHBydHNvY2suYwppbmRleCAyODEwMGUwLi40OWNhYmZmIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCkBAIC00Niw2ICs0Niw5MiBAQAogdW5zaWduZWQgaW50IHhwcnRfbWF4X3Jlc3Zwb3J0ID0gUlBDX0RFRl9NQVhfUkVTVlBPUlQ7CiAKIC8qCisgKiBXZSBjYW4gcmVnaXN0ZXIgb3VyIG93biBmaWxlcyB1bmRlciAvcHJvYy9zeXMvc3VucnBjIGJ5CisgKiBjYWxsaW5nIHJlZ2lzdGVyX3N5c2N0bF90YWJsZSgpIGFnYWluLiAgVGhlIGZpbGVzIGluIHRoYXQKKyAqIGRpcmVjdG9yeSBiZWNvbWUgdGhlIHVuaW9uIG9mIGFsbCBmaWxlcyByZWdpc3RlcmVkIHRoZXJlLgorICoKKyAqIFdlIHNpbXBseSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGNvbGxpZGUgd2l0aAorICogc29tZW9uZSBlbHNlJ3MgZmlsZSBuYW1lcyEKKyAqLworCisjaWZkZWYgUlBDX0RFQlVHCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWluX3Nsb3RfdGFibGVfc2l6ZSA9IFJQQ19NSU5fU0xPVF9UQUJMRTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3Nsb3RfdGFibGVfc2l6ZSA9IFJQQ19NQVhfU0xPVF9UQUJMRTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeHBydF9taW5fcmVzdnBvcnRfbGltaXQgPSBSUENfTUlOX1JFU1ZQT1JUOworc3RhdGljIHVuc2lnbmVkIGludCB4cHJ0X21heF9yZXN2cG9ydF9saW1pdCA9IFJQQ19NQVhfUkVTVlBPUlQ7CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc3VucnBjX3RhYmxlX2hlYWRlcjsKKworLyoKKyAqIEZJWE1FOiBjaGFuZ2luZyB0aGUgVURQIHNsb3QgdGFibGUgc2l6ZSBzaG91bGQgYWxzbyByZXNpemUgdGhlIFVEUAorICogICAgICAgIHNvY2tldCBidWZmZXJzIGZvciBleGlzdGluZyBVRFAgdHJhbnNwb3J0cworICovCitzdGF0aWMgY3RsX3RhYmxlIHhzX3R1bmFibGVzX3RhYmxlW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfU0xPVFRBQkxFX1VEUCwKKwkJLnByb2NuYW1lCT0gInVkcF9zbG90X3RhYmxlX2VudHJpZXMiLAorCQkuZGF0YQkJPSAmeHBydF91ZHBfc2xvdF90YWJsZV9lbnRyaWVzLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX3Nsb3RfdGFibGVfc2l6ZSwKKwkJLmV4dHJhMgkJPSAmbWF4X3Nsb3RfdGFibGVfc2l6ZQorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfU0xPVFRBQkxFX1RDUCwKKwkJLnByb2NuYW1lCT0gInRjcF9zbG90X3RhYmxlX2VudHJpZXMiLAorCQkuZGF0YQkJPSAmeHBydF90Y3Bfc2xvdF90YWJsZV9lbnRyaWVzLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmbWluX3Nsb3RfdGFibGVfc2l6ZSwKKwkJLmV4dHJhMgkJPSAmbWF4X3Nsb3RfdGFibGVfc2l6ZQorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfTUlOX1JFU1ZQT1JULAorCQkucHJvY25hbWUJPSAibWluX3Jlc3Zwb3J0IiwKKwkJLmRhdGEJCT0gJnhwcnRfbWluX3Jlc3Zwb3J0LAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmeHBydF9taW5fcmVzdnBvcnRfbGltaXQsCisJCS5leHRyYTIJCT0gJnhwcnRfbWF4X3Jlc3Zwb3J0X2xpbWl0CisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9NQVhfUkVTVlBPUlQsCisJCS5wcm9jbmFtZQk9ICJtYXhfcmVzdnBvcnQiLAorCQkuZGF0YQkJPSAmeHBydF9tYXhfcmVzdnBvcnQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZ4cHJ0X21pbl9yZXN2cG9ydF9saW1pdCwKKwkJLmV4dHJhMgkJPSAmeHBydF9tYXhfcmVzdnBvcnRfbGltaXQKKwl9LAorCXsKKwkJLmN0bF9uYW1lID0gMCwKKwl9LAorfTsKKworc3RhdGljIGN0bF90YWJsZSBzdW5ycGNfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9TVU5SUEMsCisJCS5wcm9jbmFtZQk9ICJzdW5ycGMiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0geHNfdHVuYWJsZXNfdGFibGUKKwl9LAorCXsKKwkJLmN0bF9uYW1lID0gMCwKKwl9LAorfTsKKworI2VuZGlmCisKKy8qCiAgKiBIb3cgbWFueSB0aW1lcyB0byB0cnkgc2VuZGluZyBhIHJlcXVlc3Qgb24gYSBzb2NrZXQgYmVmb3JlIHdhaXRpbmcKICAqIGZvciB0aGUgc29ja2V0IGJ1ZmZlciB0byBjbGVhci4KICAqLwpAQCAtMTI1LDYgKzIxMSw1NSBAQAogfQogI2VuZGlmCiAKK3N0cnVjdCBzb2NrX3hwcnQgeworCXN0cnVjdCBycGNfeHBydAkJeHBydDsKKworCS8qCisJICogTmV0d29yayBsYXllcgorCSAqLworCXN0cnVjdCBzb2NrZXQgKgkJc29jazsKKwlzdHJ1Y3Qgc29jayAqCQlpbmV0OworCisJLyoKKwkgKiBTdGF0ZSBvZiBUQ1AgcmVwbHkgcmVjZWl2ZQorCSAqLworCV9fYmUzMgkJCXRjcF9mcmFnaGRyLAorCQkJCXRjcF94aWQ7CisKKwl1MzIJCQl0Y3Bfb2Zmc2V0LAorCQkJCXRjcF9yZWNsZW47CisKKwl1bnNpZ25lZCBsb25nCQl0Y3BfY29waWVkLAorCQkJCXRjcF9mbGFnczsKKworCS8qCisJICogQ29ubmVjdGlvbiBvZiB0cmFuc3BvcnRzCisJICovCisJc3RydWN0IGRlbGF5ZWRfd29yawljb25uZWN0X3dvcmtlcjsKKwl1bnNpZ25lZCBzaG9ydAkJcG9ydDsKKworCS8qCisJICogVURQIHNvY2tldCBidWZmZXIgc2l6ZSBwYXJhbWV0ZXJzCisJICovCisJc2l6ZV90CQkJcmN2c2l6ZSwKKwkJCQlzbmRzaXplOworCisJLyoKKwkgKiBTYXZlZCBzb2NrZXQgY2FsbGJhY2sgYWRkcmVzc2VzCisJICovCisJdm9pZAkJCSgqb2xkX2RhdGFfcmVhZHkpKHN0cnVjdCBzb2NrICosIGludCk7CisJdm9pZAkJCSgqb2xkX3N0YXRlX2NoYW5nZSkoc3RydWN0IHNvY2sgKik7CisJdm9pZAkJCSgqb2xkX3dyaXRlX3NwYWNlKShzdHJ1Y3Qgc29jayAqKTsKK307CisKKy8qCisgKiBUQ1AgcmVjZWl2ZSBzdGF0ZSBmbGFncworICovCisjZGVmaW5lIFRDUF9SQ1ZfTEFTVF9GUkFHCSgxVUwgPDwgMCkKKyNkZWZpbmUgVENQX1JDVl9DT1BZX0ZSQUdIRFIJKDFVTCA8PCAxKQorI2RlZmluZSBUQ1BfUkNWX0NPUFlfWElECSgxVUwgPDwgMikKKyNkZWZpbmUgVENQX1JDVl9DT1BZX0RBVEEJKDFVTCA8PCAzKQorCiBzdGF0aWMgdm9pZCB4c19mb3JtYXRfcGVlcl9hZGRyZXNzZXMoc3RydWN0IHJwY194cHJ0ICp4cHJ0KQogewogCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnhwcnQtPmFkZHI7CkBAIC0xNjgsMzcgKzMwMyw1MiBAQAogCiAjZGVmaW5lIFhTX1NFTkRNU0dfRkxBR1MJKE1TR19ET05UV0FJVCB8IE1TR19OT1NJR05BTCkKIAotc3RhdGljIGlubGluZSBpbnQgeHNfc2VuZF9oZWFkKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4sIHN0cnVjdCB4ZHJfYnVmICp4ZHIsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgbGVuKQorc3RhdGljIGludCB4c19zZW5kX2t2ZWMoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbiwgc3RydWN0IGt2ZWMgKnZlYywgdW5zaWduZWQgaW50IGJhc2UsIGludCBtb3JlKQogewotCXN0cnVjdCBrdmVjIGlvdiA9IHsKLQkJLmlvdl9iYXNlCT0geGRyLT5oZWFkWzBdLmlvdl9iYXNlICsgYmFzZSwKLQkJLmlvdl9sZW4JPSBsZW4gLSBiYXNlLAotCX07CiAJc3RydWN0IG1zZ2hkciBtc2cgPSB7CiAJCS5tc2dfbmFtZQk9IGFkZHIsCiAJCS5tc2dfbmFtZWxlbgk9IGFkZHJsZW4sCi0JCS5tc2dfZmxhZ3MJPSBYU19TRU5ETVNHX0ZMQUdTLAorCQkubXNnX2ZsYWdzCT0gWFNfU0VORE1TR19GTEFHUyB8IChtb3JlID8gTVNHX01PUkUgOiAwKSwKKwl9OworCXN0cnVjdCBrdmVjIGlvdiA9IHsKKwkJLmlvdl9iYXNlCT0gdmVjLT5pb3ZfYmFzZSArIGJhc2UsCisJCS5pb3ZfbGVuCT0gdmVjLT5pb3ZfbGVuIC0gYmFzZSwKIAl9OwogCi0JaWYgKHhkci0+bGVuID4gbGVuKQotCQltc2cubXNnX2ZsYWdzIHw9IE1TR19NT1JFOwotCi0JaWYgKGxpa2VseShpb3YuaW92X2xlbikpCisJaWYgKGlvdi5pb3ZfbGVuICE9IDApCiAJCXJldHVybiBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBpb3YuaW92X2xlbik7CiAJcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIE5VTEwsIDAsIDApOwogfQogCi1zdGF0aWMgaW50IHhzX3NlbmRfdGFpbChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgeGRyX2J1ZiAqeGRyLCB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyBpbnQgeHNfc2VuZF9wYWdlZGF0YShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgeGRyX2J1ZiAqeGRyLCB1bnNpZ25lZCBpbnQgYmFzZSwgaW50IG1vcmUpCiB7Ci0Jc3RydWN0IGt2ZWMgaW92ID0gewotCQkuaW92X2Jhc2UJPSB4ZHItPnRhaWxbMF0uaW92X2Jhc2UgKyBiYXNlLAotCQkuaW92X2xlbgk9IGxlbiAtIGJhc2UsCi0JfTsKLQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKLQkJLm1zZ19mbGFncwk9IFhTX1NFTkRNU0dfRkxBR1MsCi0JfTsKKwlzdHJ1Y3QgcGFnZSAqKnBwYWdlOworCXVuc2lnbmVkIGludCByZW1haW5kZXI7CisJaW50IGVyciwgc2VudCA9IDA7CiAKLQlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJmlvdiwgMSwgaW92Lmlvdl9sZW4pOworCXJlbWFpbmRlciA9IHhkci0+cGFnZV9sZW4gLSBiYXNlOworCWJhc2UgKz0geGRyLT5wYWdlX2Jhc2U7CisJcHBhZ2UgPSB4ZHItPnBhZ2VzICsgKGJhc2UgPj4gUEFHRV9TSElGVCk7CisJYmFzZSAmPSB+UEFHRV9NQVNLOworCWZvcig7OykgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBQQUdFX1NJWkUgLSBiYXNlLCByZW1haW5kZXIpOworCQlpbnQgZmxhZ3MgPSBYU19TRU5ETVNHX0ZMQUdTOworCisJCXJlbWFpbmRlciAtPSBsZW47CisJCWlmIChyZW1haW5kZXIgIT0gMCB8fCBtb3JlKQorCQkJZmxhZ3MgfD0gTVNHX01PUkU7CisJCWVyciA9IHNvY2stPm9wcy0+c2VuZHBhZ2Uoc29jaywgKnBwYWdlLCBiYXNlLCBsZW4sIGZsYWdzKTsKKwkJaWYgKHJlbWFpbmRlciA9PSAwIHx8IGVyciAhPSBsZW4pCisJCQlicmVhazsKKwkJc2VudCArPSBlcnI7CisJCXBwYWdlKys7CisJCWJhc2UgPSAwOworCX0KKwlpZiAoc2VudCA9PSAwKQorCQlyZXR1cm4gZXJyOworCWlmIChlcnIgPiAwKQorCQlzZW50ICs9IGVycjsKKwlyZXR1cm4gc2VudDsKIH0KIAogLyoqCkBAIC0yMTAsNzYgKzM2MCw1MSBAQAogICogQGJhc2U6IHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBidWZmZXIKICAqCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHhzX3NlbmRwYWdlcyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuLCBzdHJ1Y3QgeGRyX2J1ZiAqeGRyLCB1bnNpZ25lZCBpbnQgYmFzZSkKK3N0YXRpYyBpbnQgeHNfc2VuZHBhZ2VzKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4sIHN0cnVjdCB4ZHJfYnVmICp4ZHIsIHVuc2lnbmVkIGludCBiYXNlKQogewotCXN0cnVjdCBwYWdlICoqcHBhZ2UgPSB4ZHItPnBhZ2VzOwotCXVuc2lnbmVkIGludCBsZW4sIHBnbGVuID0geGRyLT5wYWdlX2xlbjsKLQlpbnQgZXJyLCByZXQgPSAwOworCXVuc2lnbmVkIGludCByZW1haW5kZXIgPSB4ZHItPmxlbiAtIGJhc2U7CisJaW50IGVyciwgc2VudCA9IDA7CiAKIAlpZiAodW5saWtlbHkoIXNvY2spKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCiAJY2xlYXJfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNvY2stPmZsYWdzKTsKKwlpZiAoYmFzZSAhPSAwKSB7CisJCWFkZHIgPSBOVUxMOworCQlhZGRybGVuID0gMDsKKwl9CiAKLQlsZW4gPSB4ZHItPmhlYWRbMF0uaW92X2xlbjsKLQlpZiAoYmFzZSA8IGxlbiB8fCAoYWRkciAhPSBOVUxMICYmIGJhc2UgPT0gMCkpIHsKLQkJZXJyID0geHNfc2VuZF9oZWFkKHNvY2ssIGFkZHIsIGFkZHJsZW4sIHhkciwgYmFzZSwgbGVuKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJcmV0ID0gZXJyOwotCQllbHNlIGlmIChlcnIgPiAwKQotCQkJcmV0ICs9IGVycjsKLQkJaWYgKGVyciAhPSAobGVuIC0gYmFzZSkpCisJaWYgKGJhc2UgPCB4ZHItPmhlYWRbMF0uaW92X2xlbiB8fCBhZGRyICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgaW50IGxlbiA9IHhkci0+aGVhZFswXS5pb3ZfbGVuIC0gYmFzZTsKKwkJcmVtYWluZGVyIC09IGxlbjsKKwkJZXJyID0geHNfc2VuZF9rdmVjKHNvY2ssIGFkZHIsIGFkZHJsZW4sICZ4ZHItPmhlYWRbMF0sIGJhc2UsIHJlbWFpbmRlciAhPSAwKTsKKwkJaWYgKHJlbWFpbmRlciA9PSAwIHx8IGVyciAhPSBsZW4pCiAJCQlnb3RvIG91dDsKKwkJc2VudCArPSBlcnI7CiAJCWJhc2UgPSAwOwogCX0gZWxzZQotCQliYXNlIC09IGxlbjsKKwkJYmFzZSAtPSB4ZHItPmhlYWRbMF0uaW92X2xlbjsKIAotCWlmICh1bmxpa2VseShwZ2xlbiA9PSAwKSkKLQkJZ290byBjb3B5X3RhaWw7Ci0JaWYgKHVubGlrZWx5KGJhc2UgPj0gcGdsZW4pKSB7Ci0JCWJhc2UgLT0gcGdsZW47Ci0JCWdvdG8gY29weV90YWlsOwotCX0KLQlpZiAoYmFzZSB8fCB4ZHItPnBhZ2VfYmFzZSkgewotCQlwZ2xlbiAtPSBiYXNlOwotCQliYXNlICs9IHhkci0+cGFnZV9iYXNlOwotCQlwcGFnZSArPSBiYXNlID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCWJhc2UgJj0gflBBR0VfQ0FDSEVfTUFTSzsKLQl9Ci0KLQlkbyB7Ci0JCWludCBmbGFncyA9IFhTX1NFTkRNU0dfRkxBR1M7Ci0KLQkJbGVuID0gUEFHRV9DQUNIRV9TSVpFOwotCQlpZiAoYmFzZSkKLQkJCWxlbiAtPSBiYXNlOwotCQlpZiAocGdsZW4gPCBsZW4pCi0JCQlsZW4gPSBwZ2xlbjsKLQotCQlpZiAocGdsZW4gIT0gbGVuIHx8IHhkci0+dGFpbFswXS5pb3ZfbGVuICE9IDApCi0JCQlmbGFncyB8PSBNU0dfTU9SRTsKLQotCQllcnIgPSBrZXJuZWxfc2VuZHBhZ2Uoc29jaywgKnBwYWdlLCBiYXNlLCBsZW4sIGZsYWdzKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJcmV0ID0gZXJyOwotCQllbHNlIGlmIChlcnIgPiAwKQotCQkJcmV0ICs9IGVycjsKLQkJaWYgKGVyciAhPSBsZW4pCisJaWYgKGJhc2UgPCB4ZHItPnBhZ2VfbGVuKSB7CisJCXVuc2lnbmVkIGludCBsZW4gPSB4ZHItPnBhZ2VfbGVuIC0gYmFzZTsKKwkJcmVtYWluZGVyIC09IGxlbjsKKwkJZXJyID0geHNfc2VuZF9wYWdlZGF0YShzb2NrLCB4ZHIsIGJhc2UsIHJlbWFpbmRlciAhPSAwKTsKKwkJaWYgKHJlbWFpbmRlciA9PSAwIHx8IGVyciAhPSBsZW4pCiAJCQlnb3RvIG91dDsKKwkJc2VudCArPSBlcnI7CiAJCWJhc2UgPSAwOwotCQlwcGFnZSsrOwotCX0gd2hpbGUgKChwZ2xlbiAtPSBsZW4pICE9IDApOwotY29weV90YWlsOgotCWxlbiA9IHhkci0+dGFpbFswXS5pb3ZfbGVuOwotCWlmIChiYXNlIDwgbGVuKSB7Ci0JCWVyciA9IHhzX3NlbmRfdGFpbChzb2NrLCB4ZHIsIGJhc2UsIGxlbik7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IGVycjsKLQkJZWxzZSBpZiAoZXJyID4gMCkKLQkJCXJldCArPSBlcnI7Ci0JfQorCX0gZWxzZQorCQliYXNlIC09IHhkci0+cGFnZV9sZW47CisKKwlpZiAoYmFzZSA+PSB4ZHItPnRhaWxbMF0uaW92X2xlbikKKwkJcmV0dXJuIHNlbnQ7CisJZXJyID0geHNfc2VuZF9rdmVjKHNvY2ssIE5VTEwsIDAsICZ4ZHItPnRhaWxbMF0sIGJhc2UsIDApOwogb3V0OgotCXJldHVybiByZXQ7CisJaWYgKHNlbnQgPT0gMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoZXJyID4gMCkKKwkJc2VudCArPSBlcnI7CisJcmV0dXJuIHNlbnQ7CiB9CiAKIC8qKgpAQCAtMjkxLDE5ICs0MTYsMjAgQEAKIHsKIAlzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSA9IHRhc2stPnRrX3Jxc3RwOwogCXN0cnVjdCBycGNfeHBydCAqeHBydCA9IHJlcS0+cnFfeHBydDsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CiAKIAlkcHJpbnRrKCJSUEM6ICU0ZCB4bWl0IGluY29tcGxldGUgKCV1IGxlZnQgb2YgJXUpXG4iLAogCQkJdGFzay0+dGtfcGlkLCByZXEtPnJxX3NsZW4gLSByZXEtPnJxX2J5dGVzX3NlbnQsCiAJCQlyZXEtPnJxX3NsZW4pOwogCi0JaWYgKHRlc3RfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnhwcnQtPnNvY2stPmZsYWdzKSkgeworCWlmICh0ZXN0X2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZ0cmFuc3BvcnQtPnNvY2stPmZsYWdzKSkgewogCQkvKiBQcm90ZWN0IGFnYWluc3QgcmFjZXMgd2l0aCB3cml0ZV9zcGFjZSAqLwogCQlzcGluX2xvY2tfYmgoJnhwcnQtPnRyYW5zcG9ydF9sb2NrKTsKIAogCQkvKiBEb24ndCByYWNlIHdpdGggZGlzY29ubmVjdCAqLwogCQlpZiAoIXhwcnRfY29ubmVjdGVkKHhwcnQpKQogCQkJdGFzay0+dGtfc3RhdHVzID0gLUVOT1RDT05OOwotCQllbHNlIGlmICh0ZXN0X2JpdChTT0NLX05PU1BBQ0UsICZ4cHJ0LT5zb2NrLT5mbGFncykpCisJCWVsc2UgaWYgKHRlc3RfYml0KFNPQ0tfTk9TUEFDRSwgJnRyYW5zcG9ydC0+c29jay0+ZmxhZ3MpKQogCQkJeHBydF93YWl0X2Zvcl9idWZmZXJfc3BhY2UodGFzayk7CiAKIAkJc3Bpbl91bmxvY2tfYmgoJnhwcnQtPnRyYW5zcG9ydF9sb2NrKTsKQEAgLTMyNyw2ICs0NTMsNyBAQAogewogCXN0cnVjdCBycGNfcnFzdCAqcmVxID0gdGFzay0+dGtfcnFzdHA7CiAJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gcmVxLT5ycV94cHJ0OworCXN0cnVjdCBzb2NrX3hwcnQgKnRyYW5zcG9ydCA9IGNvbnRhaW5lcl9vZih4cHJ0LCBzdHJ1Y3Qgc29ja194cHJ0LCB4cHJ0KTsKIAlzdHJ1Y3QgeGRyX2J1ZiAqeGRyID0gJnJlcS0+cnFfc25kX2J1ZjsKIAlpbnQgc3RhdHVzOwogCkBAIC0zMzUsOCArNDYyLDEwIEBACiAJCQkJcmVxLT5ycV9zdmVjLT5pb3ZfbGVuKTsKIAogCXJlcS0+cnFfeHRpbWUgPSBqaWZmaWVzOwotCXN0YXR1cyA9IHhzX3NlbmRwYWdlcyh4cHJ0LT5zb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZ4cHJ0LT5hZGRyLAotCQkJCXhwcnQtPmFkZHJsZW4sIHhkciwgcmVxLT5ycV9ieXRlc19zZW50KTsKKwlzdGF0dXMgPSB4c19zZW5kcGFnZXModHJhbnNwb3J0LT5zb2NrLAorCQkJICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmeHBydC0+YWRkciwKKwkJCSAgICAgIHhwcnQtPmFkZHJsZW4sIHhkciwKKwkJCSAgICAgIHJlcS0+cnFfYnl0ZXNfc2VudCk7CiAKIAlkcHJpbnRrKCJSUEM6ICAgICAgeHNfdWRwX3NlbmRfcmVxdWVzdCgldSkgPSAlZFxuIiwKIAkJCXhkci0+bGVuIC0gcmVxLT5ycV9ieXRlc19zZW50LCBzdGF0dXMpOwpAQCAtMzkyLDYgKzUyMSw3IEBACiB7CiAJc3RydWN0IHJwY19ycXN0ICpyZXEgPSB0YXNrLT50a19ycXN0cDsKIAlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPSByZXEtPnJxX3hwcnQ7CisJc3RydWN0IHNvY2tfeHBydCAqdHJhbnNwb3J0ID0gY29udGFpbmVyX29mKHhwcnQsIHN0cnVjdCBzb2NrX3hwcnQsIHhwcnQpOwogCXN0cnVjdCB4ZHJfYnVmICp4ZHIgPSAmcmVxLT5ycV9zbmRfYnVmOwogCWludCBzdGF0dXMsIHJldHJ5ID0gMDsKIApAQCAtNDA2LDggKzUzNiw4IEBACiAJICogY2FsbGVkIHNlbmRtc2coKS4gKi8KIAl3aGlsZSAoMSkgewogCQlyZXEtPnJxX3h0aW1lID0gamlmZmllczsKLQkJc3RhdHVzID0geHNfc2VuZHBhZ2VzKHhwcnQtPnNvY2ssIE5VTEwsIDAsIHhkciwKLQkJCQkJCXJlcS0+cnFfYnl0ZXNfc2VudCk7CisJCXN0YXR1cyA9IHhzX3NlbmRwYWdlcyh0cmFuc3BvcnQtPnNvY2ssCisJCQkJCU5VTEwsIDAsIHhkciwgcmVxLT5ycV9ieXRlc19zZW50KTsKIAogCQlkcHJpbnRrKCJSUEM6ICAgICAgeHNfdGNwX3NlbmRfcmVxdWVzdCgldSkgPSAlZFxuIiwKIAkJCQl4ZHItPmxlbiAtIHJlcS0+cnFfYnl0ZXNfc2VudCwgc3RhdHVzKTsKQEAgLTQ4NSw4ICs2MTUsOSBAQAogICovCiBzdGF0aWMgdm9pZCB4c19jbG9zZShzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpCiB7Ci0Jc3RydWN0IHNvY2tldCAqc29jayA9IHhwcnQtPnNvY2s7Ci0Jc3RydWN0IHNvY2sgKnNrID0geHBydC0+aW5ldDsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHRyYW5zcG9ydC0+c29jazsKKwlzdHJ1Y3Qgc29jayAqc2sgPSB0cmFuc3BvcnQtPmluZXQ7CiAKIAlpZiAoIXNrKQogCQlnb3RvIGNsZWFyX2Nsb3NlX3dhaXQ7CkBAIC00OTQsMTMgKzYyNSwxMyBAQAogCWRwcmludGsoIlJQQzogICAgICB4c19jbG9zZSB4cHJ0ICVwXG4iLCB4cHJ0KTsKIAogCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKLQl4cHJ0LT5pbmV0ID0gTlVMTDsKLQl4cHJ0LT5zb2NrID0gTlVMTDsKKwl0cmFuc3BvcnQtPmluZXQgPSBOVUxMOworCXRyYW5zcG9ydC0+c29jayA9IE5VTEw7CiAKIAlzay0+c2tfdXNlcl9kYXRhID0gTlVMTDsKLQlzay0+c2tfZGF0YV9yZWFkeSA9IHhwcnQtPm9sZF9kYXRhX3JlYWR5OwotCXNrLT5za19zdGF0ZV9jaGFuZ2UgPSB4cHJ0LT5vbGRfc3RhdGVfY2hhbmdlOwotCXNrLT5za193cml0ZV9zcGFjZSA9IHhwcnQtPm9sZF93cml0ZV9zcGFjZTsKKwlzay0+c2tfZGF0YV9yZWFkeSA9IHRyYW5zcG9ydC0+b2xkX2RhdGFfcmVhZHk7CisJc2stPnNrX3N0YXRlX2NoYW5nZSA9IHRyYW5zcG9ydC0+b2xkX3N0YXRlX2NoYW5nZTsKKwlzay0+c2tfd3JpdGVfc3BhY2UgPSB0cmFuc3BvcnQtPm9sZF93cml0ZV9zcGFjZTsKIAl3cml0ZV91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIAogCXNrLT5za19ub19jaGVjayA9IDA7CkBAIC01MTksMTUgKzY1MCwxOCBAQAogICovCiBzdGF0aWMgdm9pZCB4c19kZXN0cm95KHN0cnVjdCBycGNfeHBydCAqeHBydCkKIHsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CisKIAlkcHJpbnRrKCJSUEM6ICAgICAgeHNfZGVzdHJveSB4cHJ0ICVwXG4iLCB4cHJ0KTsKIAotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnhwcnQtPmNvbm5lY3Rfd29ya2VyKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZ0cmFuc3BvcnQtPmNvbm5lY3Rfd29ya2VyKTsKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCiAJeHBydF9kaXNjb25uZWN0KHhwcnQpOwogCXhzX2Nsb3NlKHhwcnQpOwogCXhzX2ZyZWVfcGVlcl9hZGRyZXNzZXMoeHBydCk7CiAJa2ZyZWUoeHBydC0+c2xvdCk7CisJa2ZyZWUoeHBydCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJwY194cHJ0ICp4cHJ0X2Zyb21fc29jayhzdHJ1Y3Qgc29jayAqc2spCkBAIC02MDMsOTEgKzczNyw3NSBAQAogCXJlYWRfdW5sb2NrKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHhzX3RjcF9jb3B5X2RhdGEoc2tiX3JlYWRlcl90ICpkZXNjLCB2b2lkICpwLCBzaXplX3QgbGVuKQorc3RhdGljIGlubGluZSB2b2lkIHhzX3RjcF9yZWFkX2ZyYWdoZHIoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBzdHJ1Y3QgeGRyX3NrYl9yZWFkZXIgKmRlc2MpCiB7Ci0JaWYgKGxlbiA+IGRlc2MtPmNvdW50KQotCQlsZW4gPSBkZXNjLT5jb3VudDsKLQlpZiAoc2tiX2NvcHlfYml0cyhkZXNjLT5za2IsIGRlc2MtPm9mZnNldCwgcCwgbGVuKSkgewotCQlkcHJpbnRrKCJSUEM6ICAgICAgZmFpbGVkIHRvIGNvcHkgJXp1IGJ5dGVzIGZyb20gc2tiLiAlenUgYnl0ZXMgcmVtYWluXG4iLAotCQkJCWxlbiwgZGVzYy0+Y291bnQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZGVzYy0+b2Zmc2V0ICs9IGxlbjsKLQlkZXNjLT5jb3VudCAtPSBsZW47Ci0JZHByaW50aygiUlBDOiAgICAgIGNvcGllZCAlenUgYnl0ZXMgZnJvbSBza2IuICV6dSBieXRlcyByZW1haW5cbiIsCi0JCQlsZW4sIGRlc2MtPmNvdW50KTsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgeHNfdGNwX3JlYWRfZnJhZ2hkcihzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHNrYl9yZWFkZXJfdCAqZGVzYykKLXsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CiAJc2l6ZV90IGxlbiwgdXNlZDsKIAljaGFyICpwOwogCi0JcCA9ICgoY2hhciAqKSAmeHBydC0+dGNwX3JlY20pICsgeHBydC0+dGNwX29mZnNldDsKLQlsZW4gPSBzaXplb2YoeHBydC0+dGNwX3JlY20pIC0geHBydC0+dGNwX29mZnNldDsKLQl1c2VkID0geHNfdGNwX2NvcHlfZGF0YShkZXNjLCBwLCBsZW4pOwotCXhwcnQtPnRjcF9vZmZzZXQgKz0gdXNlZDsKKwlwID0gKChjaGFyICopICZ0cmFuc3BvcnQtPnRjcF9mcmFnaGRyKSArIHRyYW5zcG9ydC0+dGNwX29mZnNldDsKKwlsZW4gPSBzaXplb2YodHJhbnNwb3J0LT50Y3BfZnJhZ2hkcikgLSB0cmFuc3BvcnQtPnRjcF9vZmZzZXQ7CisJdXNlZCA9IHhkcl9za2JfcmVhZF9iaXRzKGRlc2MsIHAsIGxlbik7CisJdHJhbnNwb3J0LT50Y3Bfb2Zmc2V0ICs9IHVzZWQ7CiAJaWYgKHVzZWQgIT0gbGVuKQogCQlyZXR1cm47CiAKLQl4cHJ0LT50Y3BfcmVjbGVuID0gbnRvaGwoeHBydC0+dGNwX3JlY20pOwotCWlmICh4cHJ0LT50Y3BfcmVjbGVuICYgUlBDX0xBU1RfU1RSRUFNX0ZSQUdNRU5UKQotCQl4cHJ0LT50Y3BfZmxhZ3MgfD0gWFBSVF9MQVNUX0ZSQUc7CisJdHJhbnNwb3J0LT50Y3BfcmVjbGVuID0gbnRvaGwodHJhbnNwb3J0LT50Y3BfZnJhZ2hkcik7CisJaWYgKHRyYW5zcG9ydC0+dGNwX3JlY2xlbiAmIFJQQ19MQVNUX1NUUkVBTV9GUkFHTUVOVCkKKwkJdHJhbnNwb3J0LT50Y3BfZmxhZ3MgfD0gVENQX1JDVl9MQVNUX0ZSQUc7CiAJZWxzZQotCQl4cHJ0LT50Y3BfZmxhZ3MgJj0gflhQUlRfTEFTVF9GUkFHOwotCXhwcnQtPnRjcF9yZWNsZW4gJj0gUlBDX0ZSQUdNRU5UX1NJWkVfTUFTSzsKKwkJdHJhbnNwb3J0LT50Y3BfZmxhZ3MgJj0gflRDUF9SQ1ZfTEFTVF9GUkFHOworCXRyYW5zcG9ydC0+dGNwX3JlY2xlbiAmPSBSUENfRlJBR01FTlRfU0laRV9NQVNLOwogCi0JeHBydC0+dGNwX2ZsYWdzICY9IH5YUFJUX0NPUFlfUkVDTTsKLQl4cHJ0LT50Y3Bfb2Zmc2V0ID0gMDsKKwl0cmFuc3BvcnQtPnRjcF9mbGFncyAmPSB+VENQX1JDVl9DT1BZX0ZSQUdIRFI7CisJdHJhbnNwb3J0LT50Y3Bfb2Zmc2V0ID0gMDsKIAogCS8qIFNhbml0eSBjaGVjayBvZiB0aGUgcmVjb3JkIGxlbmd0aCAqLwotCWlmICh1bmxpa2VseSh4cHJ0LT50Y3BfcmVjbGVuIDwgNCkpIHsKKwlpZiAodW5saWtlbHkodHJhbnNwb3J0LT50Y3BfcmVjbGVuIDwgNCkpIHsKIAkJZHByaW50aygiUlBDOiAgICAgIGludmFsaWQgVENQIHJlY29yZCBmcmFnbWVudCBsZW5ndGhcbiIpOwogCQl4cHJ0X2Rpc2Nvbm5lY3QoeHBydCk7CiAJCXJldHVybjsKIAl9CiAJZHByaW50aygiUlBDOiAgICAgIHJlYWRpbmcgVENQIHJlY29yZCBmcmFnbWVudCBvZiBsZW5ndGggJWRcbiIsCi0JCQl4cHJ0LT50Y3BfcmVjbGVuKTsKKwkJCXRyYW5zcG9ydC0+dGNwX3JlY2xlbik7CiB9CiAKLXN0YXRpYyB2b2lkIHhzX3RjcF9jaGVja19yZWNtKHN0cnVjdCBycGNfeHBydCAqeHBydCkKK3N0YXRpYyB2b2lkIHhzX3RjcF9jaGVja19mcmFnaGRyKHN0cnVjdCBzb2NrX3hwcnQgKnRyYW5zcG9ydCkKIHsKLQlkcHJpbnRrKCJSUEM6ICAgICAgeHBydCA9ICVwLCB0Y3BfY29waWVkID0gJWx1LCB0Y3Bfb2Zmc2V0ID0gJXUsIHRjcF9yZWNsZW4gPSAldSwgdGNwX2ZsYWdzID0gJWx4XG4iLAotCQkJeHBydCwgeHBydC0+dGNwX2NvcGllZCwgeHBydC0+dGNwX29mZnNldCwgeHBydC0+dGNwX3JlY2xlbiwgeHBydC0+dGNwX2ZsYWdzKTsKLQlpZiAoeHBydC0+dGNwX29mZnNldCA9PSB4cHJ0LT50Y3BfcmVjbGVuKSB7Ci0JCXhwcnQtPnRjcF9mbGFncyB8PSBYUFJUX0NPUFlfUkVDTTsKLQkJeHBydC0+dGNwX29mZnNldCA9IDA7Ci0JCWlmICh4cHJ0LT50Y3BfZmxhZ3MgJiBYUFJUX0xBU1RfRlJBRykgewotCQkJeHBydC0+dGNwX2ZsYWdzICY9IH5YUFJUX0NPUFlfREFUQTsKLQkJCXhwcnQtPnRjcF9mbGFncyB8PSBYUFJUX0NPUFlfWElEOwotCQkJeHBydC0+dGNwX2NvcGllZCA9IDA7CisJaWYgKHRyYW5zcG9ydC0+dGNwX29mZnNldCA9PSB0cmFuc3BvcnQtPnRjcF9yZWNsZW4pIHsKKwkJdHJhbnNwb3J0LT50Y3BfZmxhZ3MgfD0gVENQX1JDVl9DT1BZX0ZSQUdIRFI7CisJCXRyYW5zcG9ydC0+dGNwX29mZnNldCA9IDA7CisJCWlmICh0cmFuc3BvcnQtPnRjcF9mbGFncyAmIFRDUF9SQ1ZfTEFTVF9GUkFHKSB7CisJCQl0cmFuc3BvcnQtPnRjcF9mbGFncyAmPSB+VENQX1JDVl9DT1BZX0RBVEE7CisJCQl0cmFuc3BvcnQtPnRjcF9mbGFncyB8PSBUQ1BfUkNWX0NPUFlfWElEOworCQkJdHJhbnNwb3J0LT50Y3BfY29waWVkID0gMDsKIAkJfQogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHhzX3RjcF9yZWFkX3hpZChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHNrYl9yZWFkZXJfdCAqZGVzYykKK3N0YXRpYyBpbmxpbmUgdm9pZCB4c190Y3BfcmVhZF94aWQoc3RydWN0IHNvY2tfeHBydCAqdHJhbnNwb3J0LCBzdHJ1Y3QgeGRyX3NrYl9yZWFkZXIgKmRlc2MpCiB7CiAJc2l6ZV90IGxlbiwgdXNlZDsKIAljaGFyICpwOwogCi0JbGVuID0gc2l6ZW9mKHhwcnQtPnRjcF94aWQpIC0geHBydC0+dGNwX29mZnNldDsKKwlsZW4gPSBzaXplb2YodHJhbnNwb3J0LT50Y3BfeGlkKSAtIHRyYW5zcG9ydC0+dGNwX29mZnNldDsKIAlkcHJpbnRrKCJSUEM6ICAgICAgcmVhZGluZyBYSUQgKCVadSBieXRlcylcbiIsIGxlbik7Ci0JcCA9ICgoY2hhciAqKSAmeHBydC0+dGNwX3hpZCkgKyB4cHJ0LT50Y3Bfb2Zmc2V0OwotCXVzZWQgPSB4c190Y3BfY29weV9kYXRhKGRlc2MsIHAsIGxlbik7Ci0JeHBydC0+dGNwX29mZnNldCArPSB1c2VkOworCXAgPSAoKGNoYXIgKikgJnRyYW5zcG9ydC0+dGNwX3hpZCkgKyB0cmFuc3BvcnQtPnRjcF9vZmZzZXQ7CisJdXNlZCA9IHhkcl9za2JfcmVhZF9iaXRzKGRlc2MsIHAsIGxlbik7CisJdHJhbnNwb3J0LT50Y3Bfb2Zmc2V0ICs9IHVzZWQ7CiAJaWYgKHVzZWQgIT0gbGVuKQogCQlyZXR1cm47Ci0JeHBydC0+dGNwX2ZsYWdzICY9IH5YUFJUX0NPUFlfWElEOwotCXhwcnQtPnRjcF9mbGFncyB8PSBYUFJUX0NPUFlfREFUQTsKLQl4cHJ0LT50Y3BfY29waWVkID0gNDsKKwl0cmFuc3BvcnQtPnRjcF9mbGFncyAmPSB+VENQX1JDVl9DT1BZX1hJRDsKKwl0cmFuc3BvcnQtPnRjcF9mbGFncyB8PSBUQ1BfUkNWX0NPUFlfREFUQTsKKwl0cmFuc3BvcnQtPnRjcF9jb3BpZWQgPSA0OwogCWRwcmludGsoIlJQQzogICAgICByZWFkaW5nIHJlcGx5IGZvciBYSUQgJTA4eFxuIiwKLQkJCQkJCW50b2hsKHhwcnQtPnRjcF94aWQpKTsKLQl4c190Y3BfY2hlY2tfcmVjbSh4cHJ0KTsKKwkJCW50b2hsKHRyYW5zcG9ydC0+dGNwX3hpZCkpOworCXhzX3RjcF9jaGVja19mcmFnaGRyKHRyYW5zcG9ydCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB4c190Y3BfcmVhZF9yZXF1ZXN0KHN0cnVjdCBycGNfeHBydCAqeHBydCwgc2tiX3JlYWRlcl90ICpkZXNjKQorc3RhdGljIGlubGluZSB2b2lkIHhzX3RjcF9yZWFkX3JlcXVlc3Qoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBzdHJ1Y3QgeGRyX3NrYl9yZWFkZXIgKmRlc2MpCiB7CisJc3RydWN0IHNvY2tfeHBydCAqdHJhbnNwb3J0ID0gY29udGFpbmVyX29mKHhwcnQsIHN0cnVjdCBzb2NrX3hwcnQsIHhwcnQpOwogCXN0cnVjdCBycGNfcnFzdCAqcmVxOwogCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWY7CiAJc2l6ZV90IGxlbjsKQEAgLTY5NSwxMTYgKzgxMywxMTggQEAKIAogCS8qIEZpbmQgYW5kIGxvY2sgdGhlIHJlcXVlc3QgY29ycmVzcG9uZGluZyB0byB0aGlzIHhpZCAqLwogCXNwaW5fbG9jaygmeHBydC0+dHJhbnNwb3J0X2xvY2spOwotCXJlcSA9IHhwcnRfbG9va3VwX3Jxc3QoeHBydCwgeHBydC0+dGNwX3hpZCk7CisJcmVxID0geHBydF9sb29rdXBfcnFzdCh4cHJ0LCB0cmFuc3BvcnQtPnRjcF94aWQpOwogCWlmICghcmVxKSB7Ci0JCXhwcnQtPnRjcF9mbGFncyAmPSB+WFBSVF9DT1BZX0RBVEE7CisJCXRyYW5zcG9ydC0+dGNwX2ZsYWdzICY9IH5UQ1BfUkNWX0NPUFlfREFUQTsKIAkJZHByaW50aygiUlBDOiAgICAgIFhJRCAlMDh4IHJlcXVlc3Qgbm90IGZvdW5kIVxuIiwKLQkJCQludG9obCh4cHJ0LT50Y3BfeGlkKSk7CisJCQkJbnRvaGwodHJhbnNwb3J0LT50Y3BfeGlkKSk7CiAJCXNwaW5fdW5sb2NrKCZ4cHJ0LT50cmFuc3BvcnRfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAlyY3ZidWYgPSAmcmVxLT5ycV9wcml2YXRlX2J1ZjsKIAlsZW4gPSBkZXNjLT5jb3VudDsKLQlpZiAobGVuID4geHBydC0+dGNwX3JlY2xlbiAtIHhwcnQtPnRjcF9vZmZzZXQpIHsKLQkJc2tiX3JlYWRlcl90IG15X2Rlc2M7CisJaWYgKGxlbiA+IHRyYW5zcG9ydC0+dGNwX3JlY2xlbiAtIHRyYW5zcG9ydC0+dGNwX29mZnNldCkgeworCQlzdHJ1Y3QgeGRyX3NrYl9yZWFkZXIgbXlfZGVzYzsKIAotCQlsZW4gPSB4cHJ0LT50Y3BfcmVjbGVuIC0geHBydC0+dGNwX29mZnNldDsKKwkJbGVuID0gdHJhbnNwb3J0LT50Y3BfcmVjbGVuIC0gdHJhbnNwb3J0LT50Y3Bfb2Zmc2V0OwogCQltZW1jcHkoJm15X2Rlc2MsIGRlc2MsIHNpemVvZihteV9kZXNjKSk7CiAJCW15X2Rlc2MuY291bnQgPSBsZW47Ci0JCXIgPSB4ZHJfcGFydGlhbF9jb3B5X2Zyb21fc2tiKHJjdmJ1ZiwgeHBydC0+dGNwX2NvcGllZCwKLQkJCQkJICAmbXlfZGVzYywgeHNfdGNwX2NvcHlfZGF0YSk7CisJCXIgPSB4ZHJfcGFydGlhbF9jb3B5X2Zyb21fc2tiKHJjdmJ1ZiwgdHJhbnNwb3J0LT50Y3BfY29waWVkLAorCQkJCQkgICZteV9kZXNjLCB4ZHJfc2tiX3JlYWRfYml0cyk7CiAJCWRlc2MtPmNvdW50IC09IHI7CiAJCWRlc2MtPm9mZnNldCArPSByOwogCX0gZWxzZQotCQlyID0geGRyX3BhcnRpYWxfY29weV9mcm9tX3NrYihyY3ZidWYsIHhwcnQtPnRjcF9jb3BpZWQsCi0JCQkJCSAgZGVzYywgeHNfdGNwX2NvcHlfZGF0YSk7CisJCXIgPSB4ZHJfcGFydGlhbF9jb3B5X2Zyb21fc2tiKHJjdmJ1ZiwgdHJhbnNwb3J0LT50Y3BfY29waWVkLAorCQkJCQkgIGRlc2MsIHhkcl9za2JfcmVhZF9iaXRzKTsKIAogCWlmIChyID4gMCkgewotCQl4cHJ0LT50Y3BfY29waWVkICs9IHI7Ci0JCXhwcnQtPnRjcF9vZmZzZXQgKz0gcjsKKwkJdHJhbnNwb3J0LT50Y3BfY29waWVkICs9IHI7CisJCXRyYW5zcG9ydC0+dGNwX29mZnNldCArPSByOwogCX0KIAlpZiAociAhPSBsZW4pIHsKIAkJLyogRXJyb3Igd2hlbiBjb3B5aW5nIHRvIHRoZSByZWNlaXZlIGJ1ZmZlciwKIAkJICogdXN1YWxseSBiZWNhdXNlIHdlIHdlcmVuJ3QgYWJsZSB0byBhbGxvY2F0ZQogCQkgKiBhZGRpdGlvbmFsIGJ1ZmZlciBwYWdlcy4gQWxsIHdlIGNhbiBkbyBub3cKLQkJICogaXMgdHVybiBvZmYgWFBSVF9DT1BZX0RBVEEsIHNvIHRoZSByZXF1ZXN0CisJCSAqIGlzIHR1cm4gb2ZmIFRDUF9SQ1ZfQ09QWV9EQVRBLCBzbyB0aGUgcmVxdWVzdAogCQkgKiB3aWxsIG5vdCByZWNlaXZlIGFueSBhZGRpdGlvbmFsIHVwZGF0ZXMsCiAJCSAqIGFuZCB0aW1lIG91dC4KIAkJICogQW55IHJlbWFpbmluZyBkYXRhIGZyb20gdGhpcyByZWNvcmQgd2lsbAogCQkgKiBiZSBkaXNjYXJkZWQuCiAJCSAqLwotCQl4cHJ0LT50Y3BfZmxhZ3MgJj0gflhQUlRfQ09QWV9EQVRBOworCQl0cmFuc3BvcnQtPnRjcF9mbGFncyAmPSB+VENQX1JDVl9DT1BZX0RBVEE7CiAJCWRwcmludGsoIlJQQzogICAgICBYSUQgJTA4eCB0cnVuY2F0ZWQgcmVxdWVzdFxuIiwKLQkJCQludG9obCh4cHJ0LT50Y3BfeGlkKSk7CisJCQkJbnRvaGwodHJhbnNwb3J0LT50Y3BfeGlkKSk7CiAJCWRwcmludGsoIlJQQzogICAgICB4cHJ0ID0gJXAsIHRjcF9jb3BpZWQgPSAlbHUsIHRjcF9vZmZzZXQgPSAldSwgdGNwX3JlY2xlbiA9ICV1XG4iLAotCQkJCXhwcnQsIHhwcnQtPnRjcF9jb3BpZWQsIHhwcnQtPnRjcF9vZmZzZXQsIHhwcnQtPnRjcF9yZWNsZW4pOworCQkJCXhwcnQsIHRyYW5zcG9ydC0+dGNwX2NvcGllZCwgdHJhbnNwb3J0LT50Y3Bfb2Zmc2V0LAorCQkJCQl0cmFuc3BvcnQtPnRjcF9yZWNsZW4pOwogCQlnb3RvIG91dDsKIAl9CiAKIAlkcHJpbnRrKCJSUEM6ICAgICAgWElEICUwOHggcmVhZCAlWmQgYnl0ZXNcbiIsCi0JCQludG9obCh4cHJ0LT50Y3BfeGlkKSwgcik7CisJCQludG9obCh0cmFuc3BvcnQtPnRjcF94aWQpLCByKTsKIAlkcHJpbnRrKCJSUEM6ICAgICAgeHBydCA9ICVwLCB0Y3BfY29waWVkID0gJWx1LCB0Y3Bfb2Zmc2V0ID0gJXUsIHRjcF9yZWNsZW4gPSAldVxuIiwKLQkJCXhwcnQsIHhwcnQtPnRjcF9jb3BpZWQsIHhwcnQtPnRjcF9vZmZzZXQsIHhwcnQtPnRjcF9yZWNsZW4pOworCQkJeHBydCwgdHJhbnNwb3J0LT50Y3BfY29waWVkLCB0cmFuc3BvcnQtPnRjcF9vZmZzZXQsCisJCQkJdHJhbnNwb3J0LT50Y3BfcmVjbGVuKTsKIAotCWlmICh4cHJ0LT50Y3BfY29waWVkID09IHJlcS0+cnFfcHJpdmF0ZV9idWYuYnVmbGVuKQotCQl4cHJ0LT50Y3BfZmxhZ3MgJj0gflhQUlRfQ09QWV9EQVRBOwotCWVsc2UgaWYgKHhwcnQtPnRjcF9vZmZzZXQgPT0geHBydC0+dGNwX3JlY2xlbikgewotCQlpZiAoeHBydC0+dGNwX2ZsYWdzICYgWFBSVF9MQVNUX0ZSQUcpCi0JCQl4cHJ0LT50Y3BfZmxhZ3MgJj0gflhQUlRfQ09QWV9EQVRBOworCWlmICh0cmFuc3BvcnQtPnRjcF9jb3BpZWQgPT0gcmVxLT5ycV9wcml2YXRlX2J1Zi5idWZsZW4pCisJCXRyYW5zcG9ydC0+dGNwX2ZsYWdzICY9IH5UQ1BfUkNWX0NPUFlfREFUQTsKKwllbHNlIGlmICh0cmFuc3BvcnQtPnRjcF9vZmZzZXQgPT0gdHJhbnNwb3J0LT50Y3BfcmVjbGVuKSB7CisJCWlmICh0cmFuc3BvcnQtPnRjcF9mbGFncyAmIFRDUF9SQ1ZfTEFTVF9GUkFHKQorCQkJdHJhbnNwb3J0LT50Y3BfZmxhZ3MgJj0gflRDUF9SQ1ZfQ09QWV9EQVRBOwogCX0KIAogb3V0OgotCWlmICghKHhwcnQtPnRjcF9mbGFncyAmIFhQUlRfQ09QWV9EQVRBKSkKLQkJeHBydF9jb21wbGV0ZV9ycXN0KHJlcS0+cnFfdGFzaywgeHBydC0+dGNwX2NvcGllZCk7CisJaWYgKCEodHJhbnNwb3J0LT50Y3BfZmxhZ3MgJiBUQ1BfUkNWX0NPUFlfREFUQSkpCisJCXhwcnRfY29tcGxldGVfcnFzdChyZXEtPnJxX3Rhc2ssIHRyYW5zcG9ydC0+dGNwX2NvcGllZCk7CiAJc3Bpbl91bmxvY2soJnhwcnQtPnRyYW5zcG9ydF9sb2NrKTsKLQl4c190Y3BfY2hlY2tfcmVjbSh4cHJ0KTsKKwl4c190Y3BfY2hlY2tfZnJhZ2hkcih0cmFuc3BvcnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgeHNfdGNwX3JlYWRfZGlzY2FyZChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHNrYl9yZWFkZXJfdCAqZGVzYykKK3N0YXRpYyBpbmxpbmUgdm9pZCB4c190Y3BfcmVhZF9kaXNjYXJkKHN0cnVjdCBzb2NrX3hwcnQgKnRyYW5zcG9ydCwgc3RydWN0IHhkcl9za2JfcmVhZGVyICpkZXNjKQogewogCXNpemVfdCBsZW47CiAKLQlsZW4gPSB4cHJ0LT50Y3BfcmVjbGVuIC0geHBydC0+dGNwX29mZnNldDsKKwlsZW4gPSB0cmFuc3BvcnQtPnRjcF9yZWNsZW4gLSB0cmFuc3BvcnQtPnRjcF9vZmZzZXQ7CiAJaWYgKGxlbiA+IGRlc2MtPmNvdW50KQogCQlsZW4gPSBkZXNjLT5jb3VudDsKIAlkZXNjLT5jb3VudCAtPSBsZW47CiAJZGVzYy0+b2Zmc2V0ICs9IGxlbjsKLQl4cHJ0LT50Y3Bfb2Zmc2V0ICs9IGxlbjsKKwl0cmFuc3BvcnQtPnRjcF9vZmZzZXQgKz0gbGVuOwogCWRwcmludGsoIlJQQzogICAgICBkaXNjYXJkZWQgJVp1IGJ5dGVzXG4iLCBsZW4pOwotCXhzX3RjcF9jaGVja19yZWNtKHhwcnQpOworCXhzX3RjcF9jaGVja19mcmFnaGRyKHRyYW5zcG9ydCk7CiB9CiAKIHN0YXRpYyBpbnQgeHNfdGNwX2RhdGFfcmVjdihyZWFkX2Rlc2NyaXB0b3JfdCAqcmRfZGVzYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG9mZnNldCwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQgPSByZF9kZXNjLT5hcmcuZGF0YTsKLQlza2JfcmVhZGVyX3QgZGVzYyA9IHsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CisJc3RydWN0IHhkcl9za2JfcmVhZGVyIGRlc2MgPSB7CiAJCS5za2IJPSBza2IsCiAJCS5vZmZzZXQJPSBvZmZzZXQsCiAJCS5jb3VudAk9IGxlbiwKLQkJLmNzdW0JPSAwCiAJfTsKIAogCWRwcmludGsoIlJQQzogICAgICB4c190Y3BfZGF0YV9yZWN2IHN0YXJ0ZWRcbiIpOwogCWRvIHsKIAkJLyogUmVhZCBpbiBhIG5ldyBmcmFnbWVudCBtYXJrZXIgaWYgbmVjZXNzYXJ5ICovCiAJCS8qIENhbiB3ZSBldmVyIHJlYWxseSBleHBlY3QgdG8gZ2V0IGNvbXBsZXRlbHkgZW1wdHkgZnJhZ21lbnRzPyAqLwotCQlpZiAoeHBydC0+dGNwX2ZsYWdzICYgWFBSVF9DT1BZX1JFQ00pIHsKKwkJaWYgKHRyYW5zcG9ydC0+dGNwX2ZsYWdzICYgVENQX1JDVl9DT1BZX0ZSQUdIRFIpIHsKIAkJCXhzX3RjcF9yZWFkX2ZyYWdoZHIoeHBydCwgJmRlc2MpOwogCQkJY29udGludWU7CiAJCX0KIAkJLyogUmVhZCBpbiB0aGUgeGlkIGlmIG5lY2Vzc2FyeSAqLwotCQlpZiAoeHBydC0+dGNwX2ZsYWdzICYgWFBSVF9DT1BZX1hJRCkgewotCQkJeHNfdGNwX3JlYWRfeGlkKHhwcnQsICZkZXNjKTsKKwkJaWYgKHRyYW5zcG9ydC0+dGNwX2ZsYWdzICYgVENQX1JDVl9DT1BZX1hJRCkgeworCQkJeHNfdGNwX3JlYWRfeGlkKHRyYW5zcG9ydCwgJmRlc2MpOwogCQkJY29udGludWU7CiAJCX0KIAkJLyogUmVhZCBpbiB0aGUgcmVxdWVzdCBkYXRhICovCi0JCWlmICh4cHJ0LT50Y3BfZmxhZ3MgJiBYUFJUX0NPUFlfREFUQSkgeworCQlpZiAodHJhbnNwb3J0LT50Y3BfZmxhZ3MgJiBUQ1BfUkNWX0NPUFlfREFUQSkgewogCQkJeHNfdGNwX3JlYWRfcmVxdWVzdCh4cHJ0LCAmZGVzYyk7CiAJCQljb250aW51ZTsKIAkJfQogCQkvKiBTa2lwIG92ZXIgYW55IHRyYWlsaW5nIGJ5dGVzIG9uIHNob3J0IHJlYWRzICovCi0JCXhzX3RjcF9yZWFkX2Rpc2NhcmQoeHBydCwgJmRlc2MpOworCQl4c190Y3BfcmVhZF9kaXNjYXJkKHRyYW5zcG9ydCwgJmRlc2MpOwogCX0gd2hpbGUgKGRlc2MuY291bnQpOwogCWRwcmludGsoIlJQQzogICAgICB4c190Y3BfZGF0YV9yZWN2IGRvbmVcbiIpOwogCXJldHVybiBsZW4gLSBkZXNjLmNvdW50OwpAQCAtODU4LDExICs5NzgsMTYgQEAKIAljYXNlIFRDUF9FU1RBQkxJU0hFRDoKIAkJc3Bpbl9sb2NrX2JoKCZ4cHJ0LT50cmFuc3BvcnRfbG9jayk7CiAJCWlmICgheHBydF90ZXN0X2FuZF9zZXRfY29ubmVjdGVkKHhwcnQpKSB7CisJCQlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwKKwkJCQkJc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CisKIAkJCS8qIFJlc2V0IFRDUCByZWNvcmQgaW5mbyAqLwotCQkJeHBydC0+dGNwX29mZnNldCA9IDA7Ci0JCQl4cHJ0LT50Y3BfcmVjbGVuID0gMDsKLQkJCXhwcnQtPnRjcF9jb3BpZWQgPSAwOwotCQkJeHBydC0+dGNwX2ZsYWdzID0gWFBSVF9DT1BZX1JFQ00gfCBYUFJUX0NPUFlfWElEOworCQkJdHJhbnNwb3J0LT50Y3Bfb2Zmc2V0ID0gMDsKKwkJCXRyYW5zcG9ydC0+dGNwX3JlY2xlbiA9IDA7CisJCQl0cmFuc3BvcnQtPnRjcF9jb3BpZWQgPSAwOworCQkJdHJhbnNwb3J0LT50Y3BfZmxhZ3MgPQorCQkJCVRDUF9SQ1ZfQ09QWV9GUkFHSERSIHwgVENQX1JDVl9DT1BZX1hJRDsKKwogCQkJeHBydC0+cmVlc3RhYmxpc2hfdGltZW91dCA9IFhTX1RDUF9JTklUX1JFRVNUX1RPOwogCQkJeHBydF93YWtlX3BlbmRpbmdfdGFza3MoeHBydCwgMCk7CiAJCX0KQEAgLTk1MSwxNSArMTA3NiwxNiBAQAogCiBzdGF0aWMgdm9pZCB4c191ZHBfZG9fc2V0X2J1ZmZlcl9zaXplKHN0cnVjdCBycGNfeHBydCAqeHBydCkKIHsKLQlzdHJ1Y3Qgc29jayAqc2sgPSB4cHJ0LT5pbmV0OworCXN0cnVjdCBzb2NrX3hwcnQgKnRyYW5zcG9ydCA9IGNvbnRhaW5lcl9vZih4cHJ0LCBzdHJ1Y3Qgc29ja194cHJ0LCB4cHJ0KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSB0cmFuc3BvcnQtPmluZXQ7CiAKLQlpZiAoeHBydC0+cmN2c2l6ZSkgeworCWlmICh0cmFuc3BvcnQtPnJjdnNpemUpIHsKIAkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX1JDVkJVRl9MT0NLOwotCQlzay0+c2tfcmN2YnVmID0geHBydC0+cmN2c2l6ZSAqIHhwcnQtPm1heF9yZXFzICogIDI7CisJCXNrLT5za19yY3ZidWYgPSB0cmFuc3BvcnQtPnJjdnNpemUgKiB4cHJ0LT5tYXhfcmVxcyAqIDI7CiAJfQotCWlmICh4cHJ0LT5zbmRzaXplKSB7CisJaWYgKHRyYW5zcG9ydC0+c25kc2l6ZSkgewogCQlzay0+c2tfdXNlcmxvY2tzIHw9IFNPQ0tfU05EQlVGX0xPQ0s7Ci0JCXNrLT5za19zbmRidWYgPSB4cHJ0LT5zbmRzaXplICogeHBydC0+bWF4X3JlcXMgKiAyOworCQlzay0+c2tfc25kYnVmID0gdHJhbnNwb3J0LT5zbmRzaXplICogeHBydC0+bWF4X3JlcXMgKiAyOwogCQlzay0+c2tfd3JpdGVfc3BhY2Uoc2spOwogCX0KIH0KQEAgLTk3NCwxMiArMTEwMCwxNCBAQAogICovCiBzdGF0aWMgdm9pZCB4c191ZHBfc2V0X2J1ZmZlcl9zaXplKHN0cnVjdCBycGNfeHBydCAqeHBydCwgc2l6ZV90IHNuZHNpemUsIHNpemVfdCByY3ZzaXplKQogewotCXhwcnQtPnNuZHNpemUgPSAwOworCXN0cnVjdCBzb2NrX3hwcnQgKnRyYW5zcG9ydCA9IGNvbnRhaW5lcl9vZih4cHJ0LCBzdHJ1Y3Qgc29ja194cHJ0LCB4cHJ0KTsKKworCXRyYW5zcG9ydC0+c25kc2l6ZSA9IDA7CiAJaWYgKHNuZHNpemUpCi0JCXhwcnQtPnNuZHNpemUgPSBzbmRzaXplICsgMTAyNDsKLQl4cHJ0LT5yY3ZzaXplID0gMDsKKwkJdHJhbnNwb3J0LT5zbmRzaXplID0gc25kc2l6ZSArIDEwMjQ7CisJdHJhbnNwb3J0LT5yY3ZzaXplID0gMDsKIAlpZiAocmN2c2l6ZSkKLQkJeHBydC0+cmN2c2l6ZSA9IHJjdnNpemUgKyAxMDI0OworCQl0cmFuc3BvcnQtPnJjdnNpemUgPSByY3ZzaXplICsgMTAyNDsKIAogCXhzX3VkcF9kb19zZXRfYnVmZmVyX3NpemUoeHBydCk7CiB9CkBAIC0xMDAzLDE5ICsxMTMxLDYgQEAKIH0KIAogLyoqCi0gKiB4c19wcmludF9wZWVyX2FkZHJlc3MgLSBmb3JtYXQgYW4gSVB2NCBhZGRyZXNzIGZvciBwcmludGluZwotICogQHhwcnQ6IGdlbmVyaWMgdHJhbnNwb3J0Ci0gKiBAZm9ybWF0OiBmbGFncyBmaWVsZCBpbmRpY2F0aW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBhZGRyZXNzIHRvIHJlbmRlcgotICovCi1zdGF0aWMgY2hhciAqeHNfcHJpbnRfcGVlcl9hZGRyZXNzKHN0cnVjdCBycGNfeHBydCAqeHBydCwgZW51bSBycGNfZGlzcGxheV9mb3JtYXRfdCBmb3JtYXQpCi17Ci0JaWYgKHhwcnQtPmFkZHJlc3Nfc3RyaW5nc1tmb3JtYXRdICE9IE5VTEwpCi0JCXJldHVybiB4cHJ0LT5hZGRyZXNzX3N0cmluZ3NbZm9ybWF0XTsKLQllbHNlCi0JCXJldHVybiAidW5wcmludGFibGUiOwotfQotCi0vKioKICAqIHhzX3NldF9wb3J0IC0gcmVzZXQgdGhlIHBvcnQgbnVtYmVyIGluIHRoZSByZW1vdGUgZW5kcG9pbnQgYWRkcmVzcwogICogQHhwcnQ6IGdlbmVyaWMgdHJhbnNwb3J0CiAgKiBAcG9ydDogbmV3IHBvcnQgbnVtYmVyCkBAIC0xMDMwLDIwICsxMTQ1LDIwIEBACiAJc2FwLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwogfQogCi1zdGF0aWMgaW50IHhzX2JpbmRyZXN2cG9ydChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsIHN0cnVjdCBzb2NrZXQgKnNvY2spCitzdGF0aWMgaW50IHhzX2JpbmRyZXN2cG9ydChzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQsIHN0cnVjdCBzb2NrZXQgKnNvY2spCiB7CiAJc3RydWN0IHNvY2thZGRyX2luIG15YWRkciA9IHsKIAkJLnNpbl9mYW1pbHkgPSBBRl9JTkVULAogCX07CiAJaW50IGVycjsKLQl1bnNpZ25lZCBzaG9ydCBwb3J0ID0geHBydC0+cG9ydDsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0ID0gdHJhbnNwb3J0LT5wb3J0OwogCiAJZG8gewogCQlteWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKIAkJZXJyID0ga2VybmVsX2JpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbXlhZGRyLAogCQkJCQkJc2l6ZW9mKG15YWRkcikpOwogCQlpZiAoZXJyID09IDApIHsKLQkJCXhwcnQtPnBvcnQgPSBwb3J0OworCQkJdHJhbnNwb3J0LT5wb3J0ID0gcG9ydDsKIAkJCWRwcmludGsoIlJQQzogICAgICB4c19iaW5kcmVzdnBvcnQgYm91bmQgdG8gcG9ydCAldVxuIiwKIAkJCQkJcG9ydCk7CiAJCQlyZXR1cm4gMDsKQEAgLTEwNTIsMjIgKzExNjcsNTMgQEAKIAkJCXBvcnQgPSB4cHJ0X21heF9yZXN2cG9ydDsKIAkJZWxzZQogCQkJcG9ydC0tOwotCX0gd2hpbGUgKGVyciA9PSAtRUFERFJJTlVTRSAmJiBwb3J0ICE9IHhwcnQtPnBvcnQpOworCX0gd2hpbGUgKGVyciA9PSAtRUFERFJJTlVTRSAmJiBwb3J0ICE9IHRyYW5zcG9ydC0+cG9ydCk7CiAKIAlkcHJpbnRrKCJSUEM6ICAgICAgY2FuJ3QgYmluZCB0byByZXNlcnZlZCBwb3J0ICglZCkuXG4iLCAtZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCisjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgeHNfa2V5WzJdOworc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSB4c19zbG9ja19rZXlbMl07CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4c19yZWNsYXNzaWZ5X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCUJVR19PTihzay0+c2tfbG9jay5vd25lciAhPSBOVUxMKTsKKwlzd2l0Y2ggKHNrLT5za19mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXNvY2tfbG9ja19pbml0X2NsYXNzX2FuZF9uYW1lKHNrLCAic2xvY2stQUZfSU5FVC1ORlMiLAorCQkJJnhzX3Nsb2NrX2tleVswXSwgInNrX2xvY2stQUZfSU5FVC1ORlMiLCAmeHNfa2V5WzBdKTsKKwkJYnJlYWs7CisKKwljYXNlIEFGX0lORVQ2OgorCQlzb2NrX2xvY2tfaW5pdF9jbGFzc19hbmRfbmFtZShzaywgInNsb2NrLUFGX0lORVQ2LU5GUyIsCisJCQkmeHNfc2xvY2tfa2V5WzFdLCAic2tfbG9jay1BRl9JTkVUNi1ORlMiLCAmeHNfa2V5WzFdKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHhzX3JlY2xhc3NpZnlfc29ja2V0KHN0cnVjdCBzb2NrZXQgKnNvY2spCit7Cit9CisjZW5kaWYKKwogLyoqCiAgKiB4c191ZHBfY29ubmVjdF93b3JrZXIgLSBzZXQgdXAgYSBVRFAgc29ja2V0Ci0gKiBAYXJnczogUlBDIHRyYW5zcG9ydCB0byBjb25uZWN0CisgKiBAd29yazogUlBDIHRyYW5zcG9ydCB0byBjb25uZWN0CiAgKgogICogSW52b2tlZCBieSBhIHdvcmsgcXVldWUgdGFza2xldC4KICAqLwotc3RhdGljIHZvaWQgeHNfdWRwX2Nvbm5lY3Rfd29ya2VyKHZvaWQgKmFyZ3MpCitzdGF0aWMgdm9pZCB4c191ZHBfY29ubmVjdF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBycGNfeHBydCAqeHBydCA9IChzdHJ1Y3QgcnBjX3hwcnQgKikgYXJnczsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0geHBydC0+c29jazsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNvY2tfeHBydCwgY29ubmVjdF93b3JrZXIud29yayk7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gJnRyYW5zcG9ydC0+eHBydDsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gdHJhbnNwb3J0LT5zb2NrOwogCWludCBlcnIsIHN0YXR1cyA9IC1FSU87CiAKIAlpZiAoeHBydC0+c2h1dGRvd24gfHwgIXhwcnRfYm91bmQoeHBydCkpCkBAIC0xMDgwLDI0ICsxMjI2LDI1IEBACiAJCWRwcmludGsoIlJQQzogICAgICBjYW4ndCBjcmVhdGUgVURQIHRyYW5zcG9ydCBzb2NrZXQgKCVkKS5cbiIsIC1lcnIpOwogCQlnb3RvIG91dDsKIAl9CisJeHNfcmVjbGFzc2lmeV9zb2NrZXQoc29jayk7CiAKLQlpZiAoeHBydC0+cmVzdnBvcnQgJiYgeHNfYmluZHJlc3Zwb3J0KHhwcnQsIHNvY2spIDwgMCkgeworCWlmICh4cHJ0LT5yZXN2cG9ydCAmJiB4c19iaW5kcmVzdnBvcnQodHJhbnNwb3J0LCBzb2NrKSA8IDApIHsKIAkJc29ja19yZWxlYXNlKHNvY2spOwogCQlnb3RvIG91dDsKIAl9CiAKIAlkcHJpbnRrKCJSUEM6ICAgICAgd29ya2VyIGNvbm5lY3RpbmcgeHBydCAlcCB0byBhZGRyZXNzOiAlc1xuIiwKLQkJCXhwcnQsIHhzX3ByaW50X3BlZXJfYWRkcmVzcyh4cHJ0LCBSUENfRElTUExBWV9BTEwpKTsKKwkJCXhwcnQsIHhwcnQtPmFkZHJlc3Nfc3RyaW5nc1tSUENfRElTUExBWV9BTExdKTsKIAotCWlmICgheHBydC0+aW5ldCkgeworCWlmICghdHJhbnNwb3J0LT5pbmV0KSB7CiAJCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCiAJCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIAogCQlzay0+c2tfdXNlcl9kYXRhID0geHBydDsKLQkJeHBydC0+b2xkX2RhdGFfcmVhZHkgPSBzay0+c2tfZGF0YV9yZWFkeTsKLQkJeHBydC0+b2xkX3N0YXRlX2NoYW5nZSA9IHNrLT5za19zdGF0ZV9jaGFuZ2U7Ci0JCXhwcnQtPm9sZF93cml0ZV9zcGFjZSA9IHNrLT5za193cml0ZV9zcGFjZTsKKwkJdHJhbnNwb3J0LT5vbGRfZGF0YV9yZWFkeSA9IHNrLT5za19kYXRhX3JlYWR5OworCQl0cmFuc3BvcnQtPm9sZF9zdGF0ZV9jaGFuZ2UgPSBzay0+c2tfc3RhdGVfY2hhbmdlOworCQl0cmFuc3BvcnQtPm9sZF93cml0ZV9zcGFjZSA9IHNrLT5za193cml0ZV9zcGFjZTsKIAkJc2stPnNrX2RhdGFfcmVhZHkgPSB4c191ZHBfZGF0YV9yZWFkeTsKIAkJc2stPnNrX3dyaXRlX3NwYWNlID0geHNfdWRwX3dyaXRlX3NwYWNlOwogCQlzay0+c2tfbm9fY2hlY2sgPSBVRFBfQ1NVTV9OT1JDVjsKQEAgLTExMDYsOCArMTI1Myw4IEBACiAJCXhwcnRfc2V0X2Nvbm5lY3RlZCh4cHJ0KTsKIAogCQkvKiBSZXNldCB0byBuZXcgc29ja2V0ICovCi0JCXhwcnQtPnNvY2sgPSBzb2NrOwotCQl4cHJ0LT5pbmV0ID0gc2s7CisJCXRyYW5zcG9ydC0+c29jayA9IHNvY2s7CisJCXRyYW5zcG9ydC0+aW5ldCA9IHNrOwogCiAJCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwogCX0KQEAgLTExMjUsNyArMTI3Miw3IEBACiBzdGF0aWMgdm9pZCB4c190Y3BfcmV1c2VfY29ubmVjdGlvbihzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpCiB7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0geHBydC0+c29jazsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CiAJc3RydWN0IHNvY2thZGRyIGFueTsKIAogCWRwcmludGsoIlJQQzogICAgICBkaXNjb25uZWN0aW5nIHhwcnQgJXAgdG8gcmV1c2UgcG9ydFxuIiwgeHBydCk7CkBAIC0xMTM2LDcgKzEyODMsNyBAQAogCSAqLwogCW1lbXNldCgmYW55LCAwLCBzaXplb2YoYW55KSk7CiAJYW55LnNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKLQlyZXN1bHQgPSBrZXJuZWxfY29ubmVjdChzb2NrLCAmYW55LCBzaXplb2YoYW55KSwgMCk7CisJcmVzdWx0ID0ga2VybmVsX2Nvbm5lY3QodHJhbnNwb3J0LT5zb2NrLCAmYW55LCBzaXplb2YoYW55KSwgMCk7CiAJaWYgKHJlc3VsdCkKIAkJZHByaW50aygiUlBDOiAgICAgIEFGX1VOU1BFQyBjb25uZWN0IHJldHVybiBjb2RlICVkXG4iLAogCQkJCXJlc3VsdCk7CkBAIC0xMTQ0LDI3ICsxMjkxLDMwIEBACiAKIC8qKgogICogeHNfdGNwX2Nvbm5lY3Rfd29ya2VyIC0gY29ubmVjdCBhIFRDUCBzb2NrZXQgdG8gYSByZW1vdGUgZW5kcG9pbnQKLSAqIEBhcmdzOiBSUEMgdHJhbnNwb3J0IHRvIGNvbm5lY3QKKyAqIEB3b3JrOiBSUEMgdHJhbnNwb3J0IHRvIGNvbm5lY3QKICAqCiAgKiBJbnZva2VkIGJ5IGEgd29yayBxdWV1ZSB0YXNrbGV0LgogICovCi1zdGF0aWMgdm9pZCB4c190Y3BfY29ubmVjdF93b3JrZXIodm9pZCAqYXJncykKK3N0YXRpYyB2b2lkIHhzX3RjcF9jb25uZWN0X3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gKHN0cnVjdCBycGNfeHBydCAqKWFyZ3M7Ci0Jc3RydWN0IHNvY2tldCAqc29jayA9IHhwcnQtPnNvY2s7CisJc3RydWN0IHNvY2tfeHBydCAqdHJhbnNwb3J0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzb2NrX3hwcnQsIGNvbm5lY3Rfd29ya2VyLndvcmspOworCXN0cnVjdCBycGNfeHBydCAqeHBydCA9ICZ0cmFuc3BvcnQtPnhwcnQ7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHRyYW5zcG9ydC0+c29jazsKIAlpbnQgZXJyLCBzdGF0dXMgPSAtRUlPOwogCiAJaWYgKHhwcnQtPnNodXRkb3duIHx8ICF4cHJ0X2JvdW5kKHhwcnQpKQogCQlnb3RvIG91dDsKIAotCWlmICgheHBydC0+c29jaykgeworCWlmICghc29jaykgewogCQkvKiBzdGFydCBmcm9tIHNjcmF0Y2ggKi8KIAkJaWYgKChlcnIgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgJnNvY2spKSA8IDApIHsKIAkJCWRwcmludGsoIlJQQzogICAgICBjYW4ndCBjcmVhdGUgVENQIHRyYW5zcG9ydCBzb2NrZXQgKCVkKS5cbiIsIC1lcnIpOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJeHNfcmVjbGFzc2lmeV9zb2NrZXQoc29jayk7CiAKLQkJaWYgKHhwcnQtPnJlc3Zwb3J0ICYmIHhzX2JpbmRyZXN2cG9ydCh4cHJ0LCBzb2NrKSA8IDApIHsKKwkJaWYgKHhwcnQtPnJlc3Zwb3J0ICYmIHhzX2JpbmRyZXN2cG9ydCh0cmFuc3BvcnQsIHNvY2spIDwgMCkgewogCQkJc29ja19yZWxlYXNlKHNvY2spOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTExNzMsMTcgKzEzMjMsMTcgQEAKIAkJeHNfdGNwX3JldXNlX2Nvbm5lY3Rpb24oeHBydCk7CiAKIAlkcHJpbnRrKCJSUEM6ICAgICAgd29ya2VyIGNvbm5lY3RpbmcgeHBydCAlcCB0byBhZGRyZXNzOiAlc1xuIiwKLQkJCXhwcnQsIHhzX3ByaW50X3BlZXJfYWRkcmVzcyh4cHJ0LCBSUENfRElTUExBWV9BTEwpKTsKKwkJCXhwcnQsIHhwcnQtPmFkZHJlc3Nfc3RyaW5nc1tSUENfRElTUExBWV9BTExdKTsKIAotCWlmICgheHBydC0+aW5ldCkgeworCWlmICghdHJhbnNwb3J0LT5pbmV0KSB7CiAJCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCiAJCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIAogCQlzay0+c2tfdXNlcl9kYXRhID0geHBydDsKLQkJeHBydC0+b2xkX2RhdGFfcmVhZHkgPSBzay0+c2tfZGF0YV9yZWFkeTsKLQkJeHBydC0+b2xkX3N0YXRlX2NoYW5nZSA9IHNrLT5za19zdGF0ZV9jaGFuZ2U7Ci0JCXhwcnQtPm9sZF93cml0ZV9zcGFjZSA9IHNrLT5za193cml0ZV9zcGFjZTsKKwkJdHJhbnNwb3J0LT5vbGRfZGF0YV9yZWFkeSA9IHNrLT5za19kYXRhX3JlYWR5OworCQl0cmFuc3BvcnQtPm9sZF9zdGF0ZV9jaGFuZ2UgPSBzay0+c2tfc3RhdGVfY2hhbmdlOworCQl0cmFuc3BvcnQtPm9sZF93cml0ZV9zcGFjZSA9IHNrLT5za193cml0ZV9zcGFjZTsKIAkJc2stPnNrX2RhdGFfcmVhZHkgPSB4c190Y3BfZGF0YV9yZWFkeTsKIAkJc2stPnNrX3N0YXRlX2NoYW5nZSA9IHhzX3RjcF9zdGF0ZV9jaGFuZ2U7CiAJCXNrLT5za193cml0ZV9zcGFjZSA9IHhzX3RjcF93cml0ZV9zcGFjZTsKQEAgLTExOTgsOCArMTM0OCw4IEBACiAJCXhwcnRfY2xlYXJfY29ubmVjdGVkKHhwcnQpOwogCiAJCS8qIFJlc2V0IHRvIG5ldyBzb2NrZXQgKi8KLQkJeHBydC0+c29jayA9IHNvY2s7Ci0JCXhwcnQtPmluZXQgPSBzazsKKwkJdHJhbnNwb3J0LT5zb2NrID0gc29jazsKKwkJdHJhbnNwb3J0LT5pbmV0ID0gc2s7CiAKIAkJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAJfQpAQCAtMTI0OCwyMSArMTM5OCwyMiBAQAogc3RhdGljIHZvaWQgeHNfY29ubmVjdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCiB7CiAJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gdGFzay0+dGtfeHBydDsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CiAKIAlpZiAoeHBydF90ZXN0X2FuZF9zZXRfY29ubmVjdGluZyh4cHJ0KSkKIAkJcmV0dXJuOwogCi0JaWYgKHhwcnQtPnNvY2sgIT0gTlVMTCkgeworCWlmICh0cmFuc3BvcnQtPnNvY2sgIT0gTlVMTCkgewogCQlkcHJpbnRrKCJSUEM6ICAgICAgeHNfY29ubmVjdCBkZWxheWVkIHhwcnQgJXAgZm9yICVsdSBzZWNvbmRzXG4iLAogCQkJCXhwcnQsIHhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgLyBIWik7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmeHBydC0+Y29ubmVjdF93b3JrZXIsCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHJhbnNwb3J0LT5jb25uZWN0X3dvcmtlciwKIAkJCQkJeHBydC0+cmVlc3RhYmxpc2hfdGltZW91dCk7CiAJCXhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgPDw9IDE7CiAJCWlmICh4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0ID4gWFNfVENQX01BWF9SRUVTVF9UTykKIAkJCXhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgPSBYU19UQ1BfTUFYX1JFRVNUX1RPOwogCX0gZWxzZSB7CiAJCWRwcmludGsoIlJQQzogICAgICB4c19jb25uZWN0IHNjaGVkdWxlZCB4cHJ0ICVwXG4iLCB4cHJ0KTsKLQkJc2NoZWR1bGVfd29yaygmeHBydC0+Y29ubmVjdF93b3JrZXIpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRyYW5zcG9ydC0+Y29ubmVjdF93b3JrZXIsIDApOwogCiAJCS8qIGZsdXNoX3NjaGVkdWxlZF93b3JrIGNhbiBzbGVlcC4uLiAqLwogCQlpZiAoIVJQQ19JU19BU1lOQyh0YXNrKSkKQEAgLTEyNzgsOCArMTQyOSwxMCBAQAogICovCiBzdGF0aWMgdm9pZCB4c191ZHBfcHJpbnRfc3RhdHMoc3RydWN0IHJwY194cHJ0ICp4cHJ0LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKIHsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQgPSBjb250YWluZXJfb2YoeHBydCwgc3RydWN0IHNvY2tfeHBydCwgeHBydCk7CisKIAlzZXFfcHJpbnRmKHNlcSwgIlx0eHBydDpcdHVkcCAldSAlbHUgJWx1ICVsdSAlbHUgJUx1ICVMdVxuIiwKLQkJCXhwcnQtPnBvcnQsCisJCQl0cmFuc3BvcnQtPnBvcnQsCiAJCQl4cHJ0LT5zdGF0LmJpbmRfY291bnQsCiAJCQl4cHJ0LT5zdGF0LnNlbmRzLAogCQkJeHBydC0+c3RhdC5yZWN2cywKQEAgLTEyOTYsMTMgKzE0NDksMTQgQEAKICAqLwogc3RhdGljIHZvaWQgeHNfdGNwX3ByaW50X3N0YXRzKHN0cnVjdCBycGNfeHBydCAqeHBydCwgc3RydWN0IHNlcV9maWxlICpzZXEpCiB7CisJc3RydWN0IHNvY2tfeHBydCAqdHJhbnNwb3J0ID0gY29udGFpbmVyX29mKHhwcnQsIHN0cnVjdCBzb2NrX3hwcnQsIHhwcnQpOwogCWxvbmcgaWRsZV90aW1lID0gMDsKIAogCWlmICh4cHJ0X2Nvbm5lY3RlZCh4cHJ0KSkKIAkJaWRsZV90aW1lID0gKGxvbmcpKGppZmZpZXMgLSB4cHJ0LT5sYXN0X3VzZWQpIC8gSFo7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIlx0eHBydDpcdHRjcCAldSAlbHUgJWx1ICVsdSAlbGQgJWx1ICVsdSAlbHUgJUx1ICVMdVxuIiwKLQkJCXhwcnQtPnBvcnQsCisJCQl0cmFuc3BvcnQtPnBvcnQsCiAJCQl4cHJ0LT5zdGF0LmJpbmRfY291bnQsCiAJCQl4cHJ0LT5zdGF0LmNvbm5lY3RfY291bnQsCiAJCQl4cHJ0LT5zdGF0LmNvbm5lY3RfdGltZSwKQEAgLTEzMTYsNyArMTQ3MCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3hwcnRfb3BzIHhzX3VkcF9vcHMgPSB7CiAJLnNldF9idWZmZXJfc2l6ZQk9IHhzX3VkcF9zZXRfYnVmZmVyX3NpemUsCi0JLnByaW50X2FkZHIJCT0geHNfcHJpbnRfcGVlcl9hZGRyZXNzLAogCS5yZXNlcnZlX3hwcnQJCT0geHBydF9yZXNlcnZlX3hwcnRfY29uZywKIAkucmVsZWFzZV94cHJ0CQk9IHhwcnRfcmVsZWFzZV94cHJ0X2NvbmcsCiAJLnJwY2JpbmQJCT0gcnBjX2dldHBvcnQsCkBAIC0xMzM0LDcgKzE0ODcsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBycGNfeHBydF9vcHMgeHNfdGNwX29wcyA9IHsKLQkucHJpbnRfYWRkcgkJPSB4c19wcmludF9wZWVyX2FkZHJlc3MsCiAJLnJlc2VydmVfeHBydAkJPSB4cHJ0X3Jlc2VydmVfeHBydCwKIAkucmVsZWFzZV94cHJ0CQk9IHhzX3RjcF9yZWxlYXNlX3hwcnQsCiAJLnJwY2JpbmQJCT0gcnBjX2dldHBvcnQsCkBAIC0xMzQ5LDMzICsxNTAxLDY0IEBACiAJLnByaW50X3N0YXRzCQk9IHhzX3RjcF9wcmludF9zdGF0cywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcnBjX3hwcnQgKnhzX3NldHVwX3hwcnQoc3RydWN0IHNvY2thZGRyICphZGRyLCBzaXplX3QgYWRkcmxlbiwgdW5zaWduZWQgaW50IHNsb3RfdGFibGVfc2l6ZSkKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQ7CisJc3RydWN0IHNvY2tfeHBydCAqbmV3OworCisJaWYgKGFkZHJsZW4gPiBzaXplb2YoeHBydC0+YWRkcikpIHsKKwkJZHByaW50aygiUlBDOiAgICAgIHhzX3NldHVwX3hwcnQ6IGFkZHJlc3MgdG9vIGxhcmdlXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCQURGKTsKKwl9CisKKwluZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ldyA9PSBOVUxMKSB7CisJCWRwcmludGsoIlJQQzogICAgICB4c19zZXR1cF94cHJ0OiBjb3VsZG4ndCBhbGxvY2F0ZSBycGNfeHBydFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwl4cHJ0ID0gJm5ldy0+eHBydDsKKworCXhwcnQtPm1heF9yZXFzID0gc2xvdF90YWJsZV9zaXplOworCXhwcnQtPnNsb3QgPSBrY2FsbG9jKHhwcnQtPm1heF9yZXFzLCBzaXplb2Yoc3RydWN0IHJwY19ycXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHhwcnQtPnNsb3QgPT0gTlVMTCkgeworCQlrZnJlZSh4cHJ0KTsKKwkJZHByaW50aygiUlBDOiAgICAgIHhzX3NldHVwX3hwcnQ6IGNvdWxkbid0IGFsbG9jYXRlIHNsb3QgdGFibGVcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwltZW1jcHkoJnhwcnQtPmFkZHIsIGFkZHIsIGFkZHJsZW4pOworCXhwcnQtPmFkZHJsZW4gPSBhZGRybGVuOworCW5ldy0+cG9ydCA9IHhzX2dldF9yYW5kb21fcG9ydCgpOworCisJcmV0dXJuIHhwcnQ7Cit9CisKIC8qKgogICogeHNfc2V0dXBfdWRwIC0gU2V0IHVwIHRyYW5zcG9ydCB0byB1c2UgYSBVRFAgc29ja2V0Ci0gKiBAeHBydDogdHJhbnNwb3J0IHRvIHNldCB1cAorICogQGFkZHI6IGFkZHJlc3Mgb2YgcmVtb3RlIHNlcnZlcgorICogQGFkZHJsZW46IGxlbmd0aCBvZiBhZGRyZXNzIGluIGJ5dGVzCiAgKiBAdG86ICAgdGltZW91dCBwYXJhbWV0ZXJzCiAgKgogICovCi1pbnQgeHNfc2V0dXBfdWRwKHN0cnVjdCBycGNfeHBydCAqeHBydCwgc3RydWN0IHJwY190aW1lb3V0ICp0bykKK3N0cnVjdCBycGNfeHBydCAqeHNfc2V0dXBfdWRwKHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc2l6ZV90IGFkZHJsZW4sIHN0cnVjdCBycGNfdGltZW91dCAqdG8pCiB7Ci0Jc2l6ZV90IHNsb3RfdGFibGVfc2l6ZTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopICZ4cHJ0LT5hZGRyOworCXN0cnVjdCBycGNfeHBydCAqeHBydDsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQ7CiAKLQl4cHJ0LT5tYXhfcmVxcyA9IHhwcnRfdWRwX3Nsb3RfdGFibGVfZW50cmllczsKLQlzbG90X3RhYmxlX3NpemUgPSB4cHJ0LT5tYXhfcmVxcyAqIHNpemVvZih4cHJ0LT5zbG90WzBdKTsKLQl4cHJ0LT5zbG90ID0ga3phbGxvYyhzbG90X3RhYmxlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICh4cHJ0LT5zbG90ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCXhwcnQgPSB4c19zZXR1cF94cHJ0KGFkZHIsIGFkZHJsZW4sIHhwcnRfdWRwX3Nsb3RfdGFibGVfZW50cmllcyk7CisJaWYgKElTX0VSUih4cHJ0KSkKKwkJcmV0dXJuIHhwcnQ7CisJdHJhbnNwb3J0ID0gY29udGFpbmVyX29mKHhwcnQsIHN0cnVjdCBzb2NrX3hwcnQsIHhwcnQpOwogCi0JaWYgKG50b2hzKGFkZHItPnNpbl9wb3J0ICE9IDApKQorCWlmIChudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHIpLT5zaW5fcG9ydCkgIT0gMCkKIAkJeHBydF9zZXRfYm91bmQoeHBydCk7Ci0JeHBydC0+cG9ydCA9IHhzX2dldF9yYW5kb21fcG9ydCgpOwogCiAJeHBydC0+cHJvdCA9IElQUFJPVE9fVURQOwogCXhwcnQtPnRzaF9zaXplID0gMDsKIAkvKiBYWFg6IGhlYWRlciBzaXplIGNhbiB2YXJ5IGR1ZSB0byBhdXRoIHR5cGUsIElQdjYsIGV0Yy4gKi8KIAl4cHJ0LT5tYXhfcGF5bG9hZCA9ICgxVSA8PCAxNikgLSAoTUFYX0hFQURFUiA8PCAzKTsKIAotCUlOSVRfV09SSygmeHBydC0+Y29ubmVjdF93b3JrZXIsIHhzX3VkcF9jb25uZWN0X3dvcmtlciwgeHBydCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnRyYW5zcG9ydC0+Y29ubmVjdF93b3JrZXIsIHhzX3VkcF9jb25uZWN0X3dvcmtlcik7CiAJeHBydC0+YmluZF90aW1lb3V0ID0gWFNfQklORF9UTzsKIAl4cHJ0LT5jb25uZWN0X3RpbWVvdXQgPSBYU19VRFBfQ09OTl9UTzsKIAl4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0ID0gWFNfVURQX1JFRVNUX1RPOwpAQCAtMTM5MCwzNyArMTU3MywzNiBAQAogCiAJeHNfZm9ybWF0X3BlZXJfYWRkcmVzc2VzKHhwcnQpOwogCWRwcmludGsoIlJQQzogICAgICBzZXQgdXAgdHJhbnNwb3J0IHRvIGFkZHJlc3MgJXNcbiIsCi0JCQl4c19wcmludF9wZWVyX2FkZHJlc3MoeHBydCwgUlBDX0RJU1BMQVlfQUxMKSk7CisJCQl4cHJ0LT5hZGRyZXNzX3N0cmluZ3NbUlBDX0RJU1BMQVlfQUxMXSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4geHBydDsKIH0KIAogLyoqCiAgKiB4c19zZXR1cF90Y3AgLSBTZXQgdXAgdHJhbnNwb3J0IHRvIHVzZSBhIFRDUCBzb2NrZXQKLSAqIEB4cHJ0OiB0cmFuc3BvcnQgdG8gc2V0IHVwCisgKiBAYWRkcjogYWRkcmVzcyBvZiByZW1vdGUgc2VydmVyCisgKiBAYWRkcmxlbjogbGVuZ3RoIG9mIGFkZHJlc3MgaW4gYnl0ZXMKICAqIEB0bzogdGltZW91dCBwYXJhbWV0ZXJzCiAgKgogICovCi1pbnQgeHNfc2V0dXBfdGNwKHN0cnVjdCBycGNfeHBydCAqeHBydCwgc3RydWN0IHJwY190aW1lb3V0ICp0bykKK3N0cnVjdCBycGNfeHBydCAqeHNfc2V0dXBfdGNwKHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc2l6ZV90IGFkZHJsZW4sIHN0cnVjdCBycGNfdGltZW91dCAqdG8pCiB7Ci0Jc2l6ZV90IHNsb3RfdGFibGVfc2l6ZTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopICZ4cHJ0LT5hZGRyOworCXN0cnVjdCBycGNfeHBydCAqeHBydDsKKwlzdHJ1Y3Qgc29ja194cHJ0ICp0cmFuc3BvcnQ7CiAKLQl4cHJ0LT5tYXhfcmVxcyA9IHhwcnRfdGNwX3Nsb3RfdGFibGVfZW50cmllczsKLQlzbG90X3RhYmxlX3NpemUgPSB4cHJ0LT5tYXhfcmVxcyAqIHNpemVvZih4cHJ0LT5zbG90WzBdKTsKLQl4cHJ0LT5zbG90ID0ga3phbGxvYyhzbG90X3RhYmxlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICh4cHJ0LT5zbG90ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCXhwcnQgPSB4c19zZXR1cF94cHJ0KGFkZHIsIGFkZHJsZW4sIHhwcnRfdGNwX3Nsb3RfdGFibGVfZW50cmllcyk7CisJaWYgKElTX0VSUih4cHJ0KSkKKwkJcmV0dXJuIHhwcnQ7CisJdHJhbnNwb3J0ID0gY29udGFpbmVyX29mKHhwcnQsIHN0cnVjdCBzb2NrX3hwcnQsIHhwcnQpOwogCi0JaWYgKG50b2hzKGFkZHItPnNpbl9wb3J0KSAhPSAwKQorCWlmIChudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHIpLT5zaW5fcG9ydCkgIT0gMCkKIAkJeHBydF9zZXRfYm91bmQoeHBydCk7Ci0JeHBydC0+cG9ydCA9IHhzX2dldF9yYW5kb21fcG9ydCgpOwogCiAJeHBydC0+cHJvdCA9IElQUFJPVE9fVENQOwogCXhwcnQtPnRzaF9zaXplID0gc2l6ZW9mKHJwY19mcmFnaGRyKSAvIHNpemVvZih1MzIpOwogCXhwcnQtPm1heF9wYXlsb2FkID0gUlBDX01BWF9GUkFHTUVOVF9TSVpFOwogCi0JSU5JVF9XT1JLKCZ4cHJ0LT5jb25uZWN0X3dvcmtlciwgeHNfdGNwX2Nvbm5lY3Rfd29ya2VyLCB4cHJ0KTsKKwlJTklUX0RFTEFZRURfV09SSygmdHJhbnNwb3J0LT5jb25uZWN0X3dvcmtlciwgeHNfdGNwX2Nvbm5lY3Rfd29ya2VyKTsKIAl4cHJ0LT5iaW5kX3RpbWVvdXQgPSBYU19CSU5EX1RPOwogCXhwcnQtPmNvbm5lY3RfdGltZW91dCA9IFhTX1RDUF9DT05OX1RPOwogCXhwcnQtPnJlZXN0YWJsaXNoX3RpbWVvdXQgPSBYU19UQ1BfSU5JVF9SRUVTVF9UTzsKQEAgLTE0MzUsNyArMTYxNyw0MCBAQAogCiAJeHNfZm9ybWF0X3BlZXJfYWRkcmVzc2VzKHhwcnQpOwogCWRwcmludGsoIlJQQzogICAgICBzZXQgdXAgdHJhbnNwb3J0IHRvIGFkZHJlc3MgJXNcbiIsCi0JCQl4c19wcmludF9wZWVyX2FkZHJlc3MoeHBydCwgUlBDX0RJU1BMQVlfQUxMKSk7CisJCQl4cHJ0LT5hZGRyZXNzX3N0cmluZ3NbUlBDX0RJU1BMQVlfQUxMXSk7CisKKwlyZXR1cm4geHBydDsKK30KKworLyoqCisgKiBpbml0X3NvY2tldF94cHJ0IC0gc2V0IHVwIHhwcnRzb2NrJ3Mgc3lzY3RscworICoKKyAqLworaW50IGluaXRfc29ja2V0X3hwcnQodm9pZCkKK3sKKyNpZmRlZiBSUENfREVCVUcKKwlpZiAoIXN1bnJwY190YWJsZV9oZWFkZXIpIHsKKwkJc3VucnBjX3RhYmxlX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShzdW5ycGNfdGFibGUsIDEpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJCWlmIChzdW5ycGNfdGFibGVbMF0uZGUpCisJCQlzdW5ycGNfdGFibGVbMF0uZGUtPm93bmVyID0gVEhJU19NT0RVTEU7CisjZW5kaWYKKwl9CisjZW5kaWYKIAogCXJldHVybiAwOwogfQorCisvKioKKyAqIGNsZWFudXBfc29ja2V0X3hwcnQgLSByZW1vdmUgeHBydHNvY2sncyBzeXNjdGxzCisgKgorICovCit2b2lkIGNsZWFudXBfc29ja2V0X3hwcnQodm9pZCkKK3sKKyNpZmRlZiBSUENfREVCVUcKKwlpZiAoc3VucnBjX3RhYmxlX2hlYWRlcikgeworCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShzdW5ycGNfdGFibGVfaGVhZGVyKTsKKwkJc3VucnBjX3RhYmxlX2hlYWRlciA9IE5VTEw7CisJfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5jIGIvbmV0L3RpcGMvYmNhc3QuYwppbmRleCAxYmI3NTcwLi43MzBjNWM0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iY2FzdC5jCisrKyBiL25ldC90aXBjL2JjYXN0LmMKQEAgLTc3NCw4ICs3NzQsOCBAQAogCiBpbnQgdGlwY19iY2xpbmtfaW5pdCh2b2lkKQogewotCWJjYmVhcmVyID0ga21hbGxvYyhzaXplb2YoKmJjYmVhcmVyKSwgR0ZQX0FUT01JQyk7Ci0JYmNsaW5rID0ga21hbGxvYyhzaXplb2YoKmJjbGluayksIEdGUF9BVE9NSUMpOworCWJjYmVhcmVyID0ga3phbGxvYyhzaXplb2YoKmJjYmVhcmVyKSwgR0ZQX0FUT01JQyk7CisJYmNsaW5rID0ga3phbGxvYyhzaXplb2YoKmJjbGluayksIEdGUF9BVE9NSUMpOwogCWlmICghYmNiZWFyZXIgfHwgIWJjbGluaykgewogIG5vbWVtOgogCSAJd2FybigiTXVsdGljYXN0IGxpbmsgY3JlYXRpb24gZmFpbGVkLCBubyBtZW1vcnlcbiIpOwpAQCAtNzg2LDE0ICs3ODYsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KGJjYmVhcmVyLCAwLCBzaXplb2Yoc3RydWN0IGJjYmVhcmVyKSk7CiAJSU5JVF9MSVNUX0hFQUQoJmJjYmVhcmVyLT5iZWFyZXIuY29uZ19saW5rcyk7CiAJYmNiZWFyZXItPmJlYXJlci5tZWRpYSA9ICZiY2JlYXJlci0+bWVkaWE7CiAJYmNiZWFyZXItPm1lZGlhLnNlbmRfbXNnID0gdGlwY19iY2JlYXJlcl9zZW5kOwogCXNwcmludGYoYmNiZWFyZXItPm1lZGlhLm5hbWUsICJ0aXBjLW11bHRpY2FzdCIpOwogCiAJYmNsID0gJmJjbGluay0+bGluazsKLQltZW1zZXQoYmNsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGJjbGluaykpOwogCUlOSVRfTElTVF9IRUFEKCZiY2wtPndhaXRpbmdfcG9ydHMpOwogCWJjbC0+bmV4dF9vdXRfbm8gPSAxOwogCXNwaW5fbG9ja19pbml0KCZiY2xpbmstPm5vZGUubG9jayk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuYyBiL25ldC90aXBjL2JlYXJlci5jCmluZGV4IDc1YTU5NjguLjM5NzQ0YTMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5jCisrKyBiL25ldC90aXBjL2JlYXJlci5jCkBAIC0yLDcgKzIsNyBAQAogICogbmV0L3RpcGMvYmVhcmVyLmM6IFRJUEMgYmVhcmVyIGNvZGUKICAqIAogICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIEVyaWNzc29uIEFCCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiwgV2luZCBSaXZlciBTeXN0ZW1zCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTkxLDE0ICsxOTEsMTQgQEAKIAlpZiAoKGkgPCBtZWRpYV9jb3VudCkgJiYgKG1fcHRyLT5hZGRyMnN0ciAhPSBOVUxMKSkgewogCQljaGFyIGFkZHJfc3RyW01BWF9BRERSX1NUUl07CiAKLQkJdGlwY19wcmludGYocGIsICIlcyglcykgIiwgbV9wdHItPm5hbWUsIAorCQl0aXBjX3ByaW50ZihwYiwgIiVzKCVzKSIsIG1fcHRyLT5uYW1lLAogCQkJICAgIG1fcHRyLT5hZGRyMnN0cihhLCBhZGRyX3N0ciwgc2l6ZW9mKGFkZHJfc3RyKSkpOwogCX0gZWxzZSB7CiAJCXVuY2hhciAqYWRkciA9ICh1bmNoYXIgKikmYS0+ZGV2X2FkZHI7CiAKLQkJdGlwY19wcmludGYocGIsICJVTktOT1dOKCV1KToiLCBtZWRpYV90eXBlKTsKKwkJdGlwY19wcmludGYocGIsICJVTktOT1dOKCV1KSIsIG1lZGlhX3R5cGUpOwogCQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZigqYSkgLSBzaXplb2YoYS0+dHlwZSkpOyBpKyspIHsKLQkJCXRpcGNfcHJpbnRmKHBiLCAiJTAyeCAiLCBhZGRyW2ldKTsKKwkJCXRpcGNfcHJpbnRmKHBiLCAiLSUwMngiLCBhZGRyW2ldKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvbmZpZy5jIGIvbmV0L3RpcGMvY29uZmlnLmMKaW5kZXggMjg1ZTFiYy4uYmFmNTVjNCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvY29uZmlnLmMKKysrIGIvbmV0L3RpcGMvY29uZmlnLmMKQEAgLTIsNyArMiw3IEBACiAgKiBuZXQvdGlwYy9jb25maWcuYzogVElQQyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgY29kZQogICogCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiwgRXJpY3Nzb24gQUIKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMDcsNyArMTA3LDcgQEAKIHN0cnVjdCBza19idWZmICp0aXBjX2NmZ19yZXBseV91bnNpZ25lZF90eXBlKHUxNiB0bHZfdHlwZSwgdTMyIHZhbHVlKQogewogCXN0cnVjdCBza19idWZmICpidWY7Ci0JdTMyIHZhbHVlX25ldDsKKwlfX2JlMzIgdmFsdWVfbmV0OwogCiAJYnVmID0gdGlwY19jZmdfcmVwbHlfYWxsb2MoVExWX1NQQUNFKHNpemVvZih2YWx1ZSkpKTsKIAlpZiAoYnVmKSB7CkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCQkJaWYgKG1uZy5saW5rX3N1YnNjcmlwdGlvbnMgPiA2NCkKIAkJCQlicmVhazsKLQkJCXN1YiA9IChzdHJ1Y3Qgc3Vic2NyX2RhdGEgKilrbWFsbG9jKHNpemVvZigqc3ViKSwKKwkJCXN1YiA9IGttYWxsb2Moc2l6ZW9mKCpzdWIpLAogCQkJCQkJCSAgICBHRlBfQVRPTUlDKTsKIAkJCWlmIChzdWIgPT0gTlVMTCkgewogCQkJCXdhcm4oIk1lbW9yeSBzcXVlZXplOyBkcm9wcGVkIHJlbW90ZSBsaW5rIHN1YnNjcmlwdGlvblxuIik7CkBAIC0yODQsOCArMjg0LDcgQEAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX05FVF9BRERSKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCi0JYWRkciA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKLQlhZGRyID0gbnRvaGwoYWRkcik7CisJYWRkciA9IG50b2hsKCooX19iZTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSk7CiAJaWYgKGFkZHIgPT0gdGlwY19vd25fYWRkcikKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAlpZiAoIXRpcGNfYWRkcl9ub2RlX3ZhbGlkKGFkZHIpKQpAQCAtMzE5LDggKzMxOCw3IEBACiAJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKIAotCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOworCXZhbHVlID0gbnRvaGwoKihfX2JlMzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpKTsKIAl0aXBjX3JlbW90ZV9tYW5hZ2VtZW50ID0gKHZhbHVlICE9IDApOwogCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiB9CkBAIC0zMzIsOCArMzMwLDcgQEAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCi0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxLCA2NTUzNSkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQogCQkJCQkJICAgIiAobWF4IHB1YmxpY2F0aW9ucyBtdXN0IGJlIDEtNjU1MzUpIik7CkBAIC0zNDgsOCArMzQ1LDcgQEAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCi0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAxLCA2NTUzNSkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQogCQkJCQkJICAgIiAobWF4IHN1YnNjcmlwdGlvbnMgbXVzdCBiZSAxLTY1NTM1Iik7CkBAIC0zNjMsOCArMzU5LDcgQEAKIAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7Ci0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSA9PSB0aXBjX21heF9wb3J0cykKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMTI3LCA2NTUzNSkpCkBAIC0zODMsOCArMzc4LDcgQEAKIAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7Ci0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSA9PSB0aXBjX21heF96b25lcykKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgMjU1KSkKQEAgLTQwMyw4ICszOTcsNyBAQAogCiAJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9VTlNJR05FRCkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKLQl2YWx1ZSA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKLQl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwl2YWx1ZSA9IG50b2hsKCooX19iZTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSk7CiAJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDEsIDEpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUKIAkJCQkJCSAgICIgKG1heCBjbHVzdGVycyBmaXhlZCBhdCAxKSIpOwpAQCAtNDE3LDggKzQxMCw3IEBACiAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwotCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOworCXZhbHVlID0gbnRvaGwoKihfX2JlMzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpKTsKIAlpZiAodmFsdWUgPT0gdGlwY19tYXhfbm9kZXMpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9ub25lKCk7CiAJaWYgKHZhbHVlICE9IGRlbGltaXQodmFsdWUsIDgsIDIwNDcpKQpAQCAtNDM3LDggKzQyOSw3IEBACiAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwotCXZhbHVlID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwotCXZhbHVlID0gbnRvaGwodmFsdWUpOworCXZhbHVlID0gbnRvaGwoKihfX2JlMzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpKTsKIAlpZiAodmFsdWUgIT0gMCkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19OT1RfU1VQUE9SVEVECiAJCQkJCQkgICAiIChtYXggc2Vjb25kYXJ5IG5vZGVzIGZpeGVkIGF0IDApIik7CkBAIC00NTEsOCArNDQyLDcgQEAKIAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfVU5TSUdORUQpKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKFRJUENfQ0ZHX1RMVl9FUlJPUik7Ci0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSA9PSB0aXBjX25ldF9pZCkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAlpZiAodmFsdWUgIT0gZGVsaW1pdCh2YWx1ZSwgMSwgOTk5OSkpCkBAIC02MTMsNyArNjAzLDggQEAKIAkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV91bnNpZ25lZCh0aXBjX25ldF9pZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJlcF90bHZfYnVmID0gTlVMTDsKKwkJcmVwX3Rsdl9idWYgPSB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfTk9UX1NVUFBPUlRFRAorCQkJCQkJCSAgIiAodW5rbm93biBjb21tYW5kKSIpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvcmUuYyBiL25ldC90aXBjL2NvcmUuYwppbmRleCAwNTM5YTgzLi42ZjViN2VlIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9jb3JlLmMKKysrIGIvbmV0L3RpcGMvY29yZS5jCkBAIC01Nyw3ICs1Nyw3IEBACiBpbnQgIHRpcGNfbmV0bGlua19zdGFydCh2b2lkKTsKIHZvaWQgdGlwY19uZXRsaW5rX3N0b3Aodm9pZCk7CiAKLSNkZWZpbmUgVElQQ19NT0RfVkVSICIxLjYuMSIKKyNkZWZpbmUgVElQQ19NT0RfVkVSICIxLjYuMiIKIAogI2lmbmRlZiBDT05GSUdfVElQQ19aT05FUwogI2RlZmluZSBDT05GSUdfVElQQ19aT05FUyAzCkBAIC05MCw3ICs5MCw3IEBACiBhdG9taWNfdCB0aXBjX3VzZXJfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKIAogY29uc3QgY2hhciB0aXBjX2FscGhhYmV0W10gPSAKLQkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfIjsKKwkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfLiI7CiAKIC8qIGNvbmZpZ3VyYWJsZSBUSVBDIHBhcmFtZXRlcnMgKi8KIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvY29yZS5oIGIvbmV0L3RpcGMvY29yZS5oCmluZGV4IDc2MmFhYzIuLjQ2Mzg5NDdjIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9jb3JlLmgKKysrIGIvbmV0L3RpcGMvY29yZS5oCkBAIC02NSw3ICs2NSw3IEBACiAjZGVmaW5lIGFzc2VydChpKSAgQlVHX09OKCEoaSkpCiAKIHN0cnVjdCB0aXBjX21zZzsKLWV4dGVybiBzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX0NPTlMsICpUSVBDX0xPRzsKK2V4dGVybiBzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX05VTEwsICpUSVBDX0NPTlMsICpUSVBDX0xPRzsKIGV4dGVybiBzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX1RFRShzdHJ1Y3QgcHJpbnRfYnVmICosIHN0cnVjdCBwcmludF9idWYgKik7CiB2b2lkIHRpcGNfbXNnX3ByaW50KHN0cnVjdCBwcmludF9idWYqLHN0cnVjdCB0aXBjX21zZyAqLGNvbnN0IGNoYXIqKTsKIHZvaWQgdGlwY19wcmludGYoc3RydWN0IHByaW50X2J1ZiAqLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CkBAIC04Myw5ICs4Myw5IEBACiAjZGVmaW5lIHdhcm4oZm10LCBhcmcuLi4pIHRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCBLRVJOX1dBUk5JTkcgIlRJUEM6ICIgZm10LCAjIyBhcmcpCiAjZGVmaW5lIGluZm8oZm10LCBhcmcuLi4pIHRpcGNfcHJpbnRmKFRJUENfT1VUUFVULCBLRVJOX05PVElDRSAiVElQQzogIiBmbXQsICMjIGFyZykKIAotI2RlZmluZSBkYmcoZm10LCBhcmcuLi4pICBkbyB7aWYgKERCR19PVVRQVVQpIHRpcGNfcHJpbnRmKERCR19PVVRQVVQsIGZtdCwgIyMgYXJnKTt9IHdoaWxlKDApCi0jZGVmaW5lIG1zZ19kYmcobXNnLCB0eHQpIGRvIHtpZiAoREJHX09VVFBVVCkgdGlwY19tc2dfcHJpbnQoREJHX09VVFBVVCwgbXNnLCB0eHQpO30gd2hpbGUoMCkKLSNkZWZpbmUgZHVtcChmbXQsIGFyZy4uLikgZG8ge2lmIChEQkdfT1VUUFVUKSB0aXBjX2R1bXAoREJHX09VVFBVVCwgZm10LCAjI2FyZyk7fSB3aGlsZSgwKQorI2RlZmluZSBkYmcoZm10LCBhcmcuLi4pICBkbyB7aWYgKERCR19PVVRQVVQgIT0gVElQQ19OVUxMKSB0aXBjX3ByaW50ZihEQkdfT1VUUFVULCBmbXQsICMjIGFyZyk7fSB3aGlsZSgwKQorI2RlZmluZSBtc2dfZGJnKG1zZywgdHh0KSBkbyB7aWYgKERCR19PVVRQVVQgIT0gVElQQ19OVUxMKSB0aXBjX21zZ19wcmludChEQkdfT1VUUFVULCBtc2csIHR4dCk7fSB3aGlsZSgwKQorI2RlZmluZSBkdW1wKGZtdCwgYXJnLi4uKSBkbyB7aWYgKERCR19PVVRQVVQgIT0gVElQQ19OVUxMKSB0aXBjX2R1bXAoREJHX09VVFBVVCwgZm10LCAjI2FyZyk7fSB3aGlsZSgwKQogCiAKIC8qCQpAQCAtOTQsMTEgKzk0LDExIEBACiAgKiBoZXJlLCBvciBvbiBhIHBlciAuYyBmaWxlIGJhc2lzLCBieSByZWRlZmluaW5nIHRoZXNlIHN5bWJvbHMuICBUaGUgZm9sbG93aW5nCiAgKiBwcmludCBidWZmZXIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgogICoKLSAqIE5VTEwJCQkJOiBPdXRwdXQgdG8gbnVsbCBwcmludCBidWZmZXIgKGkuZS4gcHJpbnQgbm93aGVyZSkKLSAqIFRJUENfQ09OUwkJCTogT3V0cHV0IHRvIHN5c3RlbSBjb25zb2xlCi0gKiBUSVBDX0xPRwkJCTogT3V0cHV0IHRvIFRJUEMgbG9nIGJ1ZmZlciAKLSAqICZidWYJCQkJOiBPdXRwdXQgdG8gdXNlci1kZWZpbmVkIGJ1ZmZlciAoc3RydWN0IHByaW50X2J1ZiAqKQotICogVElQQ19URUUoJmJ1Zl9hLCZidWZfYikJOiBPdXRwdXQgdG8gdHdvIHByaW50IGJ1ZmZlcnMgKGVnLiBUSVBDX1RFRShUSVBDX0NPTlMsVElQQ19MT0cpICkKKyAqIFRJUENfTlVMTAkJICAgOiBudWxsIGJ1ZmZlciAoaS5lLiBwcmludCBub3doZXJlKQorICogVElQQ19DT05TCQkgICA6IHN5c3RlbSBjb25zb2xlCisgKiBUSVBDX0xPRwkJICAgOiBUSVBDIGxvZyBidWZmZXIKKyAqICZidWYJCQkgICA6IHVzZXItZGVmaW5lZCBidWZmZXIgKHN0cnVjdCBwcmludF9idWYgKikKKyAqIFRJUENfVEVFKCZidWZfYSwmYnVmX2IpIDogbGlzdCBvZiBidWZmZXJzIChlZy4gVElQQ19URUUoVElQQ19DT05TLFRJUENfTE9HKSkKICAqLwogCiAjaWZuZGVmIFRJUENfT1VUUFVUCkBAIC0xMDYsNyArMTA2LDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIERCR19PVVRQVVQKLSNkZWZpbmUgREJHX09VVFBVVCBOVUxMCisjZGVmaW5lIERCR19PVVRQVVQgVElQQ19OVUxMCiAjZW5kaWYKIAogI2Vsc2UKQEAgLTEzNiw3ICsxMzYsNyBAQAogI2RlZmluZSBUSVBDX09VVFBVVCBUSVBDX0NPTlMKIAogI3VuZGVmICBEQkdfT1VUUFVUCi0jZGVmaW5lIERCR19PVVRQVVQgTlVMTAorI2RlZmluZSBEQkdfT1VUUFVUIFRJUENfTlVMTAogCiAjZW5kaWYJCQkgIAogCkBAIC0yNzUsMTEgKzI3NSwxNSBAQAogLyoKICAqIFRJUEMgbWVzc2FnZSBidWZmZXIgY29kZQogICoKLSAqIFRJUEMgbWVzc2FnZSBidWZmZXIgaGVhZHJvb20gbGVhdmVzIHJvb20gZm9yIDE0IGJ5dGUgRXRoZXJuZXQgaGVhZGVyLCAKKyAqIFRJUEMgbWVzc2FnZSBidWZmZXIgaGVhZHJvb20gcmVzZXJ2ZXMgc3BhY2UgZm9yIGEgbGluay1sZXZlbCBoZWFkZXIKKyAqIChpbiBjYXNlIHRoZSBtZXNzYWdlIGlzIHNlbnQgb2ZmLW5vZGUpLAogICogd2hpbGUgZW5zdXJpbmcgVElQQyBoZWFkZXIgaXMgd29yZCBhbGlnbmVkIGZvciBxdWlja2VyIGFjY2VzcworICoKKyAqIFRoZSBsYXJnZXN0IGhlYWRlciBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIDE4IGJ5dGVzLCB3aGljaCBpcyB1c2VkIHdoZW4KKyAqIHRoZSBzdGFuZGFyZCAxNCBieXRlIEV0aGVybmV0IGhlYWRlciBoYXMgNCBhZGRlZCBieXRlcyBmb3IgVkxBTiBpbmZvCiAgKi8KIAotI2RlZmluZSBCVUZfSEVBRFJPT00gMTZ1IAorI2RlZmluZSBCVUZfSEVBRFJPT00gMjB1CiAKIHN0cnVjdCB0aXBjX3NrYl9jYiB7CiAJdm9pZCAqaGFuZGxlOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGJnLmMgYi9uZXQvdGlwYy9kYmcuYwppbmRleCA1NTEzMDY1Li42MjdmOTliNyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvZGJnLmMKKysrIGIvbmV0L3RpcGMvZGJnLmMKQEAgLTEsOCArMSw4IEBACiAvKgotICogbmV0L3RpcGMvZGJnLmM6IFRJUEMgcHJpbnQgYnVmZmVyIHJvdXRpbmVzIGZvciBkZWJ1Z2dpZ24KKyAqIG5ldC90aXBjL2RiZy5jOiBUSVBDIHByaW50IGJ1ZmZlciByb3V0aW5lcyBmb3IgZGVidWdnaW5nCiAgKiAKICAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDA2LCBFcmljc3NvbiBBQgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA2LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zOCwxMSArMzgsMTIgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJkYmcuaCIKIAotI2RlZmluZSBNQVhfU1RSSU5HIDUxMgotCi1zdGF0aWMgY2hhciBwcmludF9zdHJpbmdbTUFYX1NUUklOR107CitzdGF0aWMgY2hhciBwcmludF9zdHJpbmdbVElQQ19QQl9NQVhfU1RSXTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHJpbnRfbG9jayk7CiAKK3N0YXRpYyBzdHJ1Y3QgcHJpbnRfYnVmIG51bGxfYnVmID0geyBOVUxMLCAwLCBOVUxMLCBOVUxMIH07CitzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX05VTEwgPSAmbnVsbF9idWY7CisKIHN0YXRpYyBzdHJ1Y3QgcHJpbnRfYnVmIGNvbnNfYnVmID0geyBOVUxMLCAwLCBOVUxMLCBOVUxMIH07CiBzdHJ1Y3QgcHJpbnRfYnVmICpUSVBDX0NPTlMgPSAmY29uc19idWY7CiAKQEAgLTYyLDY4ICs2Myw4MyBAQAogLyoKICAqIExvY2tpbmcgcG9saWN5IHdoZW4gdXNpbmcgcHJpbnQgYnVmZmVycy4KICAqCi0gKiAxKSBSb3V0aW5lcyBvZiB0aGUgZm9ybSBwcmludGJ1Zl9YWFgoKSByZWx5IG9uIHRoZSBjYWxsZXIgdG8gcHJldmVudAotICogICAgc2ltdWx0YW5lb3VzIHVzZSBvZiB0aGUgcHJpbnQgYnVmZmVyKHMpIGJlaW5nIG1hbmlwdWxhdGVkLgotICogMikgdGlwY19wcmludGYoKSB1c2VzICdwcmludF9sb2NrJyB0byBwcmV2ZW50IHNpbXVsdGFuZW91cyB1c2Ugb2YKLSAqICAgICdwcmludF9zdHJpbmcnIGFuZCB0byBwcm90ZWN0IGl0cyBwcmludCBidWZmZXIocykuCi0gKiAzKSBUSVBDX1RFRSgpIHVzZXMgJ3ByaW50X2xvY2snIHRvIHByb3RlY3QgaXRzIHByaW50IGJ1ZmZlcihzKS4KLSAqIDQpIFJvdXRpbmVzIG9mIHRoZSBmb3JtIGxvZ19YWFgoKSB1c2VzICdwcmludF9sb2NrJyB0byBwcm90ZWN0IFRJUENfTE9HLgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyB1c2UgJ3ByaW50X2xvY2snIGZvciBwcm90ZWN0aW9uOgorICogMSkgdGlwY19wcmludGYoKSAgLSB0byBwcm90ZWN0IGl0cyBwcmludCBidWZmZXIocykgYW5kICdwcmludF9zdHJpbmcnCisgKiAyKSBUSVBDX1RFRSgpICAgICAtIHRvIHByb3RlY3QgaXRzIHByaW50IGJ1ZmZlcihzKQorICogMykgdGlwY19kdW1wKCkgICAgLSB0byBwcm90ZWN0IGl0cyBwcmludCBidWZmZXIocykgYW5kICdwcmludF9zdHJpbmcnCisgKiA0KSB0aXBjX2xvZ19YWFgoKSAtIHRvIHByb3RlY3QgVElQQ19MT0cKKyAqCisgKiBBbGwgcm91dGluZXMgb2YgdGhlIGZvcm0gdGlwY19wcmludGJ1Zl9YWFgoKSByZWx5IG9uIHRoZSBjYWxsZXIgdG8gcHJldmVudAorICogc2ltdWx0YW5lb3VzIHVzZSBvZiB0aGUgcHJpbnQgYnVmZmVyKHMpIGJlaW5nIG1hbmlwdWxhdGVkLgogICovCiAKIC8qKgogICogdGlwY19wcmludGJ1Zl9pbml0IC0gaW5pdGlhbGl6ZSBwcmludCBidWZmZXIgdG8gZW1wdHkKKyAqIEBwYjogcG9pbnRlciB0byBwcmludCBidWZmZXIgc3RydWN0dXJlCisgKiBAcmF3OiBwb2ludGVyIHRvIGNoYXJhY3RlciBhcnJheSB1c2VkIGJ5IHByaW50IGJ1ZmZlcgorICogQHNpemU6IHNpemUgb2YgY2hhcmFjdGVyIGFycmF5CisgKgorICogTWFrZXMgdGhlIHByaW50IGJ1ZmZlciBhIG51bGwgZGV2aWNlIHRoYXQgZGlzY2FyZHMgYW55dGhpbmcgd3JpdHRlbiB0byBpdAorICogaWYgdGhlIGNoYXJhY3RlciBhcnJheSBpcyB0b28gc21hbGwgKG9yIGFic2VudCkuCiAgKi8KIAotdm9pZCB0aXBjX3ByaW50YnVmX2luaXQoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNoYXIgKnJhdywgdTMyIHN6KQordm9pZCB0aXBjX3ByaW50YnVmX2luaXQoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNoYXIgKnJhdywgdTMyIHNpemUpCiB7Ci0JaWYgKCFwYiB8fCAhcmF3IHx8IChzeiA8IChNQVhfU1RSSU5HICsgMSkpKQotCQlyZXR1cm47Ci0KLQlwYi0+Y3JzID0gcGItPmJ1ZiA9IHJhdzsKLQlwYi0+c2l6ZSA9IHN6OworCXBiLT5idWYgPSByYXc7CisJcGItPmNycyA9IHJhdzsKKwlwYi0+c2l6ZSA9IHNpemU7CiAJcGItPm5leHQgPSBOVUxMOwotCXBiLT5idWZbMF0gPSAwOwotCXBiLT5idWZbc3otMV0gPSB+MDsKKworCWlmIChzaXplIDwgVElQQ19QQl9NSU5fU0laRSkgeworCQlwYi0+YnVmID0gTlVMTDsKKwl9IGVsc2UgaWYgKHJhdykgeworCQlwYi0+YnVmWzBdID0gMDsKKwkJcGItPmJ1ZltzaXplLTFdID0gfjA7CisJfQogfQogCiAvKioKICAqIHRpcGNfcHJpbnRidWZfcmVzZXQgLSByZWluaXRpYWxpemUgcHJpbnQgYnVmZmVyIHRvIGVtcHR5IHN0YXRlCisgKiBAcGI6IHBvaW50ZXIgdG8gcHJpbnQgYnVmZmVyIHN0cnVjdHVyZQogICovCiAKIHZvaWQgdGlwY19wcmludGJ1Zl9yZXNldChzdHJ1Y3QgcHJpbnRfYnVmICpwYikKIHsKLQlpZiAocGIgJiYgcGItPmJ1ZikKLQkJdGlwY19wcmludGJ1Zl9pbml0KHBiLCBwYi0+YnVmLCBwYi0+c2l6ZSk7CisJdGlwY19wcmludGJ1Zl9pbml0KHBiLCBwYi0+YnVmLCBwYi0+c2l6ZSk7CiB9CiAKIC8qKgogICogdGlwY19wcmludGJ1Zl9lbXB0eSAtIHRlc3QgaWYgcHJpbnQgYnVmZmVyIGlzIGluIGVtcHR5IHN0YXRlCisgKiBAcGI6IHBvaW50ZXIgdG8gcHJpbnQgYnVmZmVyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgbm9uLXplcm8gaWYgcHJpbnQgYnVmZmVyIGlzIGVtcHR5LgogICovCiAKIGludCB0aXBjX3ByaW50YnVmX2VtcHR5KHN0cnVjdCBwcmludF9idWYgKnBiKQogewotCXJldHVybiAoIXBiIHx8ICFwYi0+YnVmIHx8IChwYi0+Y3JzID09IHBiLT5idWYpKTsKKwlyZXR1cm4gKCFwYi0+YnVmIHx8IChwYi0+Y3JzID09IHBiLT5idWYpKTsKIH0KIAogLyoqCiAgKiB0aXBjX3ByaW50YnVmX3ZhbGlkYXRlIC0gY2hlY2sgZm9yIHByaW50IGJ1ZmZlciBvdmVyZmxvdworICogQHBiOiBwb2ludGVyIHRvIHByaW50IGJ1ZmZlciBzdHJ1Y3R1cmUKICAqIAogICogVmVyaWZpZXMgdGhhdCBhIHByaW50IGJ1ZmZlciBoYXMgY2FwdHVyZWQgYWxsIGRhdGEgd3JpdHRlbiB0byBpdC4gCiAgKiBJZiBkYXRhIGhhcyBiZWVuIGxvc3QsIGxpbmVhcml6ZSBidWZmZXIgYW5kIHByZXBlbmQgYW4gZXJyb3IgbWVzc2FnZQogICogCi0gKiBSZXR1cm5zIGxlbmd0aCBvZiBwcmludCBidWZmZXIgZGF0YSBzdHJpbmcgKGluY2x1ZGluZyB0cmFpbGluZyBOVUxMKQorICogUmV0dXJucyBsZW5ndGggb2YgcHJpbnQgYnVmZmVyIGRhdGEgc3RyaW5nIChpbmNsdWRpbmcgdHJhaWxpbmcgTlVMKQogICovCiAKIGludCB0aXBjX3ByaW50YnVmX3ZhbGlkYXRlKHN0cnVjdCBwcmludF9idWYgKnBiKQogewotICAgICAgICBjaGFyICplcnIgPSAiICAgICAgICAgICAgICoqKiBQUklOVCBCVUZGRVIgV1JBUFBFRCBBUk9VTkQgKioqXG4iOworICAgICAgICBjaGFyICplcnIgPSAiXG5cbioqKiBQUklOVCBCVUZGRVIgT1ZFUkZMT1cgKioqXG5cbiI7CiAgICAgICAgIGNoYXIgKmNwX2J1ZjsKICAgICAgICAgc3RydWN0IHByaW50X2J1ZiBjYjsKIAotCWlmICghcGIgfHwgIXBiLT5idWYpCisJaWYgKCFwYi0+YnVmKQogCQlyZXR1cm4gMDsKIAotCWlmIChwYi0+YnVmW3BiLT5zaXplIC0gMV0gPT0gJ1wwJykgeworCWlmIChwYi0+YnVmW3BiLT5zaXplIC0gMV0gPT0gMCkgewogICAgICAgICAgICAgICAgIGNwX2J1ZiA9IGttYWxsb2MocGItPnNpemUsIEdGUF9BVE9NSUMpOwogICAgICAgICAgICAgICAgIGlmIChjcF9idWYgIT0gTlVMTCl7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aXBjX3ByaW50YnVmX2luaXQoJmNiLCBjcF9idWYsIHBiLT5zaXplKTsKQEAgLTE0MSw2ICsxNTcsOCBAQAogCiAvKioKICAqIHRpcGNfcHJpbnRidWZfbW92ZSAtIG1vdmUgcHJpbnQgYnVmZmVyIGNvbnRlbnRzIHRvIGFub3RoZXIgcHJpbnQgYnVmZmVyCisgKiBAcGJfdG86IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcHJpbnQgYnVmZmVyIHN0cnVjdHVyZQorICogQHBiX2Zyb206IHBvaW50ZXIgdG8gc291cmNlIHByaW50IGJ1ZmZlciBzdHJ1Y3R1cmUKICAqIAogICogQ3VycmVudCBjb250ZW50cyBvZiBkZXN0aW5hdGlvbiBwcmludCBidWZmZXIgKGlmIGFueSkgYXJlIGRpc2NhcmRlZC4KICAqIFNvdXJjZSBwcmludCBidWZmZXIgYmVjb21lcyBlbXB0eSBpZiBhIHN1Y2Nlc3NmdWwgbW92ZSBvY2N1cnMuCkBAIC0xNTIsMjEgKzE3MCwyMiBAQAogCiAJLyogSGFuZGxlIHRoZSBjYXNlcyB3aGVyZSBjb250ZW50cyBjYW4ndCBiZSBtb3ZlZCAqLwogCi0JaWYgKCFwYl90byB8fCAhcGJfdG8tPmJ1ZikKKwlpZiAoIXBiX3RvLT5idWYpCiAJCXJldHVybjsKIAotCWlmICghcGJfZnJvbSB8fCAhcGJfZnJvbS0+YnVmKSB7CisJaWYgKCFwYl9mcm9tLT5idWYpIHsKIAkJdGlwY19wcmludGJ1Zl9yZXNldChwYl90byk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAocGJfdG8tPnNpemUgPCBwYl9mcm9tLT5zaXplKSB7CiAJCXRpcGNfcHJpbnRidWZfcmVzZXQocGJfdG8pOwotCQl0aXBjX3ByaW50ZihwYl90bywgIioqKiBQUklOVCBCVUZGRVIgT1ZFUkZMT1cgKioqIik7CisJCXRpcGNfcHJpbnRmKHBiX3RvLCAiKioqIFBSSU5UIEJVRkZFUiBNT1ZFIEVSUk9SICoqKiIpOwogCQlyZXR1cm47CiAJfQogCiAJLyogQ29weSBkYXRhIGZyb20gY2hhciBhZnRlciBjdXJzb3IgdG8gZW5kIChpZiB1c2VkKSAqLworCiAJbGVuID0gcGJfZnJvbS0+YnVmICsgcGJfZnJvbS0+c2l6ZSAtIHBiX2Zyb20tPmNycyAtIDI7CiAJaWYgKChwYl9mcm9tLT5idWZbcGJfZnJvbS0+c2l6ZS0xXSA9PSAwKSAmJiAobGVuID4gMCkpIHsKIAkJc3RyY3B5KHBiX3RvLT5idWYsIHBiX2Zyb20tPmNycyArIDEpOwpAQCAtMTc1LDYgKzE5NCw3IEBACiAJCXBiX3RvLT5jcnMgPSBwYl90by0+YnVmOwogCiAJLyogQ29weSBkYXRhIGZyb20gc3RhcnQgdG8gY3Vyc29yIChhbHdheXMpICovCisKIAlsZW4gPSBwYl9mcm9tLT5jcnMgLSBwYl9mcm9tLT5idWY7CiAJc3RyY3B5KHBiX3RvLT5jcnMsIHBiX2Zyb20tPmJ1Zik7CiAJcGJfdG8tPmNycyArPSBsZW47CkBAIC0xODQsNiArMjA0LDggQEAKIAogLyoqCiAgKiB0aXBjX3ByaW50ZiAtIGFwcGVuZCBmb3JtYXR0ZWQgb3V0cHV0IHRvIHByaW50IGJ1ZmZlciBjaGFpbgorICogQHBiOiBwb2ludGVyIHRvIGNoYWluIG9mIHByaW50IGJ1ZmZlcnMgKG1heSBiZSBOVUxMKQorICogQGZtdDogZm9ybWF0dGVkIGluZm8gdG8gYmUgcHJpbnRlZAogICovCiAKIHZvaWQgdGlwY19wcmludGYoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQpAQCAtMTk1LDggKzIxNyw4IEBACiAKIAlzcGluX2xvY2tfYmgoJnByaW50X2xvY2spOwogCUZPUk1BVChwcmludF9zdHJpbmcsIGNoYXJzX3RvX2FkZCwgZm10KTsKLQlpZiAoY2hhcnNfdG9fYWRkID49IE1BWF9TVFJJTkcpCi0JCXN0cmNweShwcmludF9zdHJpbmcsICIqKiogU1RSSU5HIFRPTyBMT05HICoqKiIpOworCWlmIChjaGFyc190b19hZGQgPj0gVElQQ19QQl9NQVhfU1RSKQorCQlzdHJjcHkocHJpbnRfc3RyaW5nLCAiKioqIFBSSU5UIEJVRkZFUiBTVFJJTkcgVE9PIExPTkcgKioqIik7CiAKIAl3aGlsZSAocGIpIHsKIAkJaWYgKHBiID09IFRJUENfQ09OUykKQEAgLTIwNiw2ICsyMjgsMTAgQEAKIAkJCWlmIChjaGFyc190b19hZGQgPD0gY2hhcnNfbGVmdCkgewogCQkJCXN0cmNweShwYi0+Y3JzLCBwcmludF9zdHJpbmcpOwogCQkJCXBiLT5jcnMgKz0gY2hhcnNfdG9fYWRkOworCQkJfSBlbHNlIGlmIChjaGFyc190b19hZGQgPj0gKHBiLT5zaXplIC0gMSkpIHsKKwkJCQlzdHJjcHkocGItPmJ1ZiwgcHJpbnRfc3RyaW5nICsgY2hhcnNfdG9fYWRkICsgMQorCQkJCSAgICAgICAtIHBiLT5zaXplKTsKKwkJCQlwYi0+Y3JzID0gcGItPmJ1ZiArIHBiLT5zaXplIC0gMTsKIAkJCX0gZWxzZSB7CiAJCQkJc3RyY3B5KHBiLT5idWYsIHByaW50X3N0cmluZyArIGNoYXJzX2xlZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX2NoYXIgPSBwcmludF9zdHJpbmdbY2hhcnNfbGVmdF07CkBAIC0yMjQsNiArMjUwLDEwIEBACiAKIC8qKgogICogVElQQ19URUUgLSBwZXJmb3JtIG5leHQgb3V0cHV0IG9wZXJhdGlvbiBvbiBib3RoIHByaW50IGJ1ZmZlcnMgIAorICogQGIwOiBwb2ludGVyIHRvIGNoYWluIG9mIHByaW50IGJ1ZmZlcnMgKG1heSBiZSBOVUxMKQorICogQGIxOiBwb2ludGVyIHRvIHByaW50IGJ1ZmZlciB0byBhZGQgdG8gY2hhaW4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gcHJpbnQgYnVmZmVyIGNoYWluLgogICovCiAKIHN0cnVjdCBwcmludF9idWYgKlRJUENfVEVFKHN0cnVjdCBwcmludF9idWYgKmIwLCBzdHJ1Y3QgcHJpbnRfYnVmICpiMSkKQEAgLTIzMiw4ICsyNjIsNiBAQAogCiAJaWYgKCFiMCB8fCAoYjAgPT0gYjEpKQogCQlyZXR1cm4gYjE7Ci0JaWYgKCFiMSkKLQkJcmV0dXJuIGIwOwogCiAJc3Bpbl9sb2NrX2JoKCZwcmludF9sb2NrKTsKIAl3aGlsZSAocGItPm5leHQpIHsKQEAgLTI1Niw3ICsyODQsNyBAQAogCWludCByZXN0ID0gbGVuOwogCiAJd2hpbGUgKHJlc3QgPiAwKSB7Ci0JCWludCBzeiA9IHJlc3QgPCBNQVhfU1RSSU5HID8gcmVzdCA6IE1BWF9TVFJJTkc7CisJCWludCBzeiA9IHJlc3QgPCBUSVBDX1BCX01BWF9TVFIgPyByZXN0IDogVElQQ19QQl9NQVhfU1RSOwogCQljaGFyIGMgPSBjcnNbc3pdOwogCiAJCWNyc1tzel0gPSAwOwpAQCAtMjc1LDM2ICszMDMsNDggQEAKIHsKIAlpbnQgbGVuOwogCisJaWYgKCFwYi0+YnVmKSB7CisJCXByaW50aygiKioqIFBSSU5UIEJVRkZFUiBOT1QgQUxMT0NBVEVEICoqKiIpOworCQlyZXR1cm47CisJfQorCiAJLyogRHVtcCBwcmludCBidWZmZXIgZnJvbSBjaGFyIGFmdGVyIGN1cnNvciB0byBlbmQgKGlmIHVzZWQpICovCisKIAlsZW4gPSBwYi0+YnVmICsgcGItPnNpemUgLSBwYi0+Y3JzIC0gMjsKIAlpZiAoKHBiLT5idWZbcGItPnNpemUgLSAxXSA9PSAwKSAmJiAobGVuID4gMCkpCiAJCXByaW50X3RvX2NvbnNvbGUocGItPmNycyArIDEsIGxlbik7CiAKIAkvKiBEdW1wIHByaW50IGJ1ZmZlciBmcm9tIHN0YXJ0IHRvIGN1cnNvciAoYWx3YXlzKSAqLworCiAJbGVuID0gcGItPmNycyAtIHBiLT5idWY7CiAJcHJpbnRfdG9fY29uc29sZShwYi0+YnVmLCBsZW4pOwogfQogCiAvKioKICAqIHRpcGNfZHVtcCAtIGR1bXAgbm9uLWNvbnNvbGUgcHJpbnQgYnVmZmVyKHMpIHRvIGNvbnNvbGUKKyAqIEBwYjogcG9pbnRlciB0byBjaGFpbiBvZiBwcmludCBidWZmZXJzCiAgKi8KIAogdm9pZCB0aXBjX2R1bXAoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogeworCXN0cnVjdCBwcmludF9idWYgKnBiX25leHQ7CiAJaW50IGxlbjsKIAogCXNwaW5fbG9ja19iaCgmcHJpbnRfbG9jayk7Ci0JRk9STUFUKFRJUENfQ09OUy0+YnVmLCBsZW4sIGZtdCk7Ci0JcHJpbnRrKFRJUENfQ09OUy0+YnVmKTsKKwlGT1JNQVQocHJpbnRfc3RyaW5nLCBsZW4sIGZtdCk7CisJcHJpbnRrKHByaW50X3N0cmluZyk7CiAKIAlmb3IgKDsgcGI7IHBiID0gcGItPm5leHQpIHsKLQkJaWYgKHBiID09IFRJUENfQ09OUykKLQkJCWNvbnRpbnVlOwotCQlwcmludGsoIlxuLS0tLSBTdGFydCBvZiBkdW1wLCVzIGxvZyAtLS0tXG5cbiIsIAotCQkgICAgICAgKHBiID09IFRJUENfTE9HKSA/ICJnbG9iYWwiIDogImxvY2FsIik7Ci0JCXByaW50YnVmX2R1bXAocGIpOwotCQl0aXBjX3ByaW50YnVmX3Jlc2V0KHBiKTsKLQkJcHJpbnRrKCJcbi0tLS0tLS0tIEVuZCBvZiBkdW1wIC0tLS0tLS0tXG4iKTsKKwkJaWYgKHBiICE9IFRJUENfQ09OUykgeworCQkJcHJpbnRrKCJcbi0tLS0gU3RhcnQgb2YgJXMgbG9nIGR1bXAgLS0tLVxuXG4iLAorCQkJICAgICAgIChwYiA9PSBUSVBDX0xPRykgPyAiZ2xvYmFsIiA6ICJsb2NhbCIpOworCQkJcHJpbnRidWZfZHVtcChwYik7CisJCQl0aXBjX3ByaW50YnVmX3Jlc2V0KHBiKTsKKwkJCXByaW50aygiXG4tLS0tIEVuZCBvZiBkdW1wIC0tLS1cbiIpOworCQl9CisJCXBiX25leHQgPSBwYi0+bmV4dDsKKwkJcGItPm5leHQgPSBOVUxMOworCQlwYiA9IHBiX25leHQ7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZwcmludF9sb2NrKTsKIH0KQEAgLTMyNCw3ICszNjQsOCBAQAogfQogCiAvKioKLSAqIHRpcGNfbG9nX3JlaW5pdCAtIHNldCBUSVBDIGxvZyBwcmludCBidWZmZXIgdG8gc3BlY2lmaWVkIHNpemUKKyAqIHRpcGNfbG9nX3JlaW5pdCAtIChyZSlpbml0aWFsaXplIFRJUEMgbG9nIHByaW50IGJ1ZmZlcgorICogQGxvZ19zaXplOiBwcmludCBidWZmZXIgc2l6ZSB0byB1c2UKICAqLwogCiB2b2lkIHRpcGNfbG9nX3JlaW5pdChpbnQgbG9nX3NpemUpCkBAIC0zMzIsMTAgKzM3MywxMSBAQAogCXRpcGNfbG9nX3N0b3AoKTsKIAogCWlmIChsb2dfc2l6ZSkgewotCQlpZiAobG9nX3NpemUgPD0gTUFYX1NUUklORykKLQkJCWxvZ19zaXplID0gTUFYX1NUUklORyArIDE7CisJCWlmIChsb2dfc2l6ZSA8IFRJUENfUEJfTUlOX1NJWkUpCisJCQlsb2dfc2l6ZSA9IFRJUENfUEJfTUlOX1NJWkU7CiAJCXNwaW5fbG9ja19iaCgmcHJpbnRfbG9jayk7Ci0JCXRpcGNfcHJpbnRidWZfaW5pdChUSVBDX0xPRywga21hbGxvYyhsb2dfc2l6ZSwgR0ZQX0FUT01JQyksIGxvZ19zaXplKTsKKwkJdGlwY19wcmludGJ1Zl9pbml0KFRJUENfTE9HLCBrbWFsbG9jKGxvZ19zaXplLCBHRlBfQVRPTUlDKSwKKwkJCQkgICBsb2dfc2l6ZSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZwcmludF9sb2NrKTsKIAl9CiB9CkBAIC0zNTEsOCArMzkzLDcgQEAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX1VOU0lHTkVEKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCi0JdmFsdWUgPSAqKHUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSkpOwogCWlmICh2YWx1ZSAhPSBkZWxpbWl0KHZhbHVlLCAwLCAzMjc2OCkpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQogCQkJCQkJICAgIiAobG9nIHNpemUgbXVzdCBiZSAwLTMyNzY4KSIpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGJnLmggYi9uZXQvdGlwYy9kYmcuaAppbmRleCAyMjdmMDUwLi40NjdjMGJjNyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvZGJnLmgKKysrIGIvbmV0L3RpcGMvZGJnLmgKQEAgLTIsNyArMiw3IEBACiAgKiBuZXQvdGlwYy9kYmcuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIHByaW50IGJ1ZmZlciByb3V0aW5lcwogICogCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNiwgRXJpY3Nzb24gQUIKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiwgV2luZCBSaXZlciBTeXN0ZW1zCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzcsNiArMzcsMTQgQEAKICNpZm5kZWYgX1RJUENfREJHX0gKICNkZWZpbmUgX1RJUENfREJHX0gKIAorLyoqCisgKiBzdHJ1Y3QgcHJpbnRfYnVmIC0gVElQQyBwcmludCBidWZmZXIgc3RydWN0dXJlCisgKiBAYnVmOiBwb2ludGVyIHRvIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHByaW50IGJ1ZmZlciBjb250ZW50cworICogQHNpemU6IHNpemUgb2YgY2hhcmFjdGVyIGFycmF5CisgKiBAY3JzOiBwb2ludGVyIHRvIGZpcnN0IHVudXNlZCBzcGFjZSBpbiBjaGFyYWN0ZXIgYXJyYXkgKGkuZS4gZmluYWwgTlVMKQorICogQG5leHQ6IHVzZWQgdG8gbGluayBwcmludCBidWZmZXJzIHdoZW4gcHJpbnRpbmcgdG8gbW9yZSB0aGFuIG9uZSBhdCBhIHRpbWUKKyAqLworCiBzdHJ1Y3QgcHJpbnRfYnVmIHsKIAljaGFyICpidWY7CiAJdTMyIHNpemU7CkBAIC00NCw3ICs1MiwxMCBAQAogCXN0cnVjdCBwcmludF9idWYgKm5leHQ7CiB9OwogCi12b2lkIHRpcGNfcHJpbnRidWZfaW5pdChzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgY2hhciAqYnVmLCB1MzIgc3opOworI2RlZmluZSBUSVBDX1BCX01JTl9TSVpFIDY0CS8qIG1pbmltdW0gc2l6ZSBmb3IgYSBwcmludCBidWZmZXIncyBhcnJheSAqLworI2RlZmluZSBUSVBDX1BCX01BWF9TVFIgNTEyCS8qIG1heCBwcmludGFibGUgc3RyaW5nICh3aXRoIHRyYWlsaW5nIE5VTCkgKi8KKwordm9pZCB0aXBjX3ByaW50YnVmX2luaXQoc3RydWN0IHByaW50X2J1ZiAqcGIsIGNoYXIgKmJ1ZiwgdTMyIHNpemUpOwogdm9pZCB0aXBjX3ByaW50YnVmX3Jlc2V0KHN0cnVjdCBwcmludF9idWYgKnBiKTsKIGludCAgdGlwY19wcmludGJ1Zl9lbXB0eShzdHJ1Y3QgcHJpbnRfYnVmICpwYik7CiBpbnQgIHRpcGNfcHJpbnRidWZfdmFsaWRhdGUoc3RydWN0IHByaW50X2J1ZiAqcGIpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZGlzY292ZXIuYyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKaW5kZXggZWU5NGRlOS4uM2IwY2QxMiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvZGlzY292ZXIuYworKysgYi9uZXQvdGlwYy9kaXNjb3Zlci5jCkBAIC0xMzIsNiArMTMyLDI4IEBACiB9CiAKIC8qKgorICogZGlzY19kdXBsX2FsZXJ0IC0gaXNzdWUgbm9kZSBhZGRyZXNzIGR1cGxpY2F0aW9uIGFsZXJ0CisgKiBAYl9wdHI6IHBvaW50ZXIgdG8gYmVhcmVyIGRldGVjdGluZyBkdXBsaWNhdGlvbgorICogQG5vZGVfYWRkcjogZHVwbGljYXRlZCBub2RlIGFkZHJlc3MKKyAqIEBtZWRpYV9hZGRyOiBtZWRpYSBhZGRyZXNzIGFkdmVydGlzZWQgYnkgZHVwbGljYXRlZCBub2RlCisgKi8KKworc3RhdGljIHZvaWQgZGlzY19kdXBsX2FsZXJ0KHN0cnVjdCBiZWFyZXIgKmJfcHRyLCB1MzIgbm9kZV9hZGRyLAorCQkJICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKm1lZGlhX2FkZHIpCit7CisJY2hhciBub2RlX2FkZHJfc3RyWzE2XTsKKwljaGFyIG1lZGlhX2FkZHJfc3RyWzY0XTsKKwlzdHJ1Y3QgcHJpbnRfYnVmIHBiOworCisJYWRkcl9zdHJpbmdfZmlsbChub2RlX2FkZHJfc3RyLCBub2RlX2FkZHIpOworCXRpcGNfcHJpbnRidWZfaW5pdCgmcGIsIG1lZGlhX2FkZHJfc3RyLCBzaXplb2YobWVkaWFfYWRkcl9zdHIpKTsKKwl0aXBjX21lZGlhX2FkZHJfcHJpbnRmKCZwYiwgbWVkaWFfYWRkcik7CisJdGlwY19wcmludGJ1Zl92YWxpZGF0ZSgmcGIpOworCXdhcm4oIkR1cGxpY2F0ZSAlcyB1c2luZyAlcyBzZWVuIG9uIDwlcz5cbiIsCisJICAgICBub2RlX2FkZHJfc3RyLCBtZWRpYV9hZGRyX3N0ciwgYl9wdHItPnB1YmwubmFtZSk7Cit9CisKKy8qKgogICogdGlwY19kaXNjX3JlY3ZfbXNnIC0gaGFuZGxlIGluY29taW5nIGxpbmsgc2V0dXAgbWVzc2FnZSAocmVxdWVzdCBvciByZXNwb25zZSkKICAqIEBidWY6IGJ1ZmZlciBjb250YWluaW5nIG1lc3NhZ2UKICAqLwpAQCAtMTU3LDggKzE3OSwxMSBAQAogCQlyZXR1cm47CiAJaWYgKCF0aXBjX2FkZHJfbm9kZV92YWxpZChvcmlnKSkKIAkJcmV0dXJuOwotCWlmIChvcmlnID09IHRpcGNfb3duX2FkZHIpCisJaWYgKG9yaWcgPT0gdGlwY19vd25fYWRkcikgeworCQlpZiAobWVtY21wKCZtZWRpYV9hZGRyLCAmYl9wdHItPnB1YmwuYWRkciwgc2l6ZW9mKG1lZGlhX2FkZHIpKSkKKwkJCWRpc2NfZHVwbF9hbGVydChiX3B0ciwgdGlwY19vd25fYWRkciwgJm1lZGlhX2FkZHIpOwogCQlyZXR1cm47CisJfQogCWlmICghaW5fc2NvcGUoZGVzdCwgdGlwY19vd25fYWRkcikpCiAJCXJldHVybjsKIAlpZiAoaXNfc2xhdmUodGlwY19vd25fYWRkcikgJiYgaXNfc2xhdmUob3JpZykpCkBAIC0xNzAsNyArMTk1LDggQEAKIAkJc3RydWN0IHNrX2J1ZmYgKnJidWY7CiAJCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHI7CiAJCXN0cnVjdCBub2RlICpuX3B0ciA9IHRpcGNfbm9kZV9maW5kKG9yaWcpOwotCQlpbnQgbGlua191cDsKKwkJaW50IGxpbmtfZnVsbHlfdXA7CisKIAkJZGJnKCIgaW4gb3duIGNsdXN0ZXJcbiIpOwogCQlpZiAobl9wdHIgPT0gTlVMTCkgewogCQkJbl9wdHIgPSB0aXBjX25vZGVfY3JlYXRlKG9yaWcpOwpAQCAtMTkwLDE0ICsyMTYsMTkgQEAKIAkJfQogCQlhZGRyID0gJmxpbmstPm1lZGlhX2FkZHI7CiAJCWlmIChtZW1jbXAoYWRkciwgJm1lZGlhX2FkZHIsIHNpemVvZigqYWRkcikpKSB7CisJCQlpZiAodGlwY19saW5rX2lzX3VwKGxpbmspIHx8ICghbGluay0+c3RhcnRlZCkpIHsKKwkJCQlkaXNjX2R1cGxfYWxlcnQoYl9wdHIsIG9yaWcsICZtZWRpYV9hZGRyKTsKKwkJCQlzcGluX3VubG9ja19iaCgmbl9wdHItPmxvY2spOworCQkJCXJldHVybjsKKwkJCX0KIAkJCXdhcm4oIlJlc2V0dGluZyBsaW5rIDwlcz4sIHBlZXIgaW50ZXJmYWNlIGFkZHJlc3MgY2hhbmdlZFxuIiwKIAkJCSAgICAgbGluay0+bmFtZSk7CiAJCQltZW1jcHkoYWRkciwgJm1lZGlhX2FkZHIsIHNpemVvZigqYWRkcikpOwogCQkJdGlwY19saW5rX3Jlc2V0KGxpbmspOyAgICAgCiAJCX0KLQkJbGlua191cCA9IHRpcGNfbGlua19pc191cChsaW5rKTsKKwkJbGlua19mdWxseV91cCA9IChsaW5rLT5zdGF0ZSA9PSBXT1JLSU5HX1dPUktJTkcpOwogCQlzcGluX3VubG9ja19iaCgmbl9wdHItPmxvY2spOyAgICAgICAgICAgICAgICAKLQkJaWYgKCh0eXBlID09IERTQ19SRVNQX01TRykgfHwgbGlua191cCkKKwkJaWYgKCh0eXBlID09IERTQ19SRVNQX01TRykgfHwgbGlua19mdWxseV91cCkKIAkJCXJldHVybjsKIAkJcmJ1ZiA9IHRpcGNfZGlzY19pbml0X21zZyhEU0NfUkVTUF9NU0csIDEsIG9yaWcsIGJfcHRyKTsKIAkJaWYgKHJidWYgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvaGFuZGxlci5jIGIvbmV0L3RpcGMvaGFuZGxlci5jCmluZGV4IGFlNmRkZjAuLmViODA3NzggMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2hhbmRsZXIuYworKysgYi9uZXQvdGlwYy9oYW5kbGVyLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGRhdGE7CiB9OwogCi1zdGF0aWMga21lbV9jYWNoZV90ICp0aXBjX3F1ZXVlX2l0ZW1fY2FjaGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnRpcGNfcXVldWVfaXRlbV9jYWNoZTsKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNpZ25hbF9xdWV1ZV9oZWFkOwogc3RhdGljIERFRklORV9TUElOTE9DSyhxaXRlbV9sb2NrKTsKIHN0YXRpYyBpbnQgaGFuZGxlcl9lbmFibGVkID0gMDsKZGlmZiAtLWdpdCBhL25ldC90aXBjL2xpbmsuYyBiL25ldC90aXBjL2xpbmsuYwppbmRleCA1M2JjOGNiLi4xYmI5ODNjIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9saW5rLmMKKysrIGIvbmV0L3RpcGMvbGluay5jCkBAIC0xMzIsNyArMTMyLDcgQEAKICAqIGFsbG93IHRoZSBvdXRwdXQgZnJvbSBtdWx0aXBsZSBsaW5rcyB0byBiZSBpbnRlcm1peGVkLiAgRm9yIHRoaXMgcmVhc29uCiAgKiByb3V0aW5lcyBvZiB0aGUgZm9ybSAiZGJnX2xpbmtfWFhYKCkiIGhhdmUgYmVlbiBjcmVhdGVkIHRoYXQgd2lsbCBjYXB0dXJlCiAgKiBkZWJ1ZyBpbmZvIGludG8gYSBsaW5rJ3MgcGVyc29uYWwgcHJpbnQgYnVmZmVyLCB3aGljaCBjYW4gdGhlbiBiZSBkdW1wZWQKLSAqIGludG8gdGhlIFRJUEMgc3lzdGVtIGxvZyAoTE9HKSB1cG9uIHJlcXVlc3QuCisgKiBpbnRvIHRoZSBUSVBDIHN5c3RlbSBsb2cgKFRJUENfTE9HKSB1cG9uIHJlcXVlc3QuCiAgKgogICogVG8gZW5hYmxlIHBlci1saW5rIGRlYnVnZ2luZywgdXNlIExJTktfTE9HX0JVRl9TSVpFIHRvIHNwZWNpZnkgdGhlIHNpemUKICAqIG9mIHRoZSBwcmludCBidWZmZXIgdXNlZCBieSBlYWNoIGxpbmsuICBJZiBMSU5LX0xPR19CVUZfU0laRSBpcyBzZXQgdG8gMCwKQEAgLTE0MSw3ICsxNDEsNyBAQAogICogd2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGxpbmsgaW4gdGhlIHN5c3RlbSBiZWluZyBkZWJ1Z2dlZC4KICAqCiAgKiBOb3RlczoKLSAqIC0gV2hlbiBlbmFibGVkLCBMSU5LX0xPR19CVUZfU0laRSBzaG91bGQgYmUgc2V0IHRvIGF0IGxlYXN0IDEwMDAgKGJ5dGVzKQorICogLSBXaGVuIGVuYWJsZWQsIExJTktfTE9HX0JVRl9TSVpFIHNob3VsZCBiZSBzZXQgdG8gYXQgbGVhc3QgVElQQ19QQl9NSU5fU0laRQogICogLSAibF9wdHIiIG11c3QgYmUgdmFsaWQgd2hlbiB1c2luZyBkYmdfbGlua19YWFgoKSBtYWNyb3MgIAogICovCiAKQEAgLTE1OSwxMyArMTU5LDEzIEBACiAKIHN0YXRpYyB2b2lkIGRiZ19wcmludF9saW5rKHN0cnVjdCBsaW5rICpsX3B0ciwgY29uc3QgY2hhciAqc3RyKQogewotCWlmIChEQkdfT1VUUFVUKQorCWlmIChEQkdfT1VUUFVUICE9IFRJUENfTlVMTCkKIAkJbGlua19wcmludChsX3B0ciwgREJHX09VVFBVVCwgc3RyKTsKIH0KIAogc3RhdGljIHZvaWQgZGJnX3ByaW50X2J1Zl9jaGFpbihzdHJ1Y3Qgc2tfYnVmZiAqcm9vdF9idWYpCiB7Ci0JaWYgKERCR19PVVRQVVQpIHsKKwlpZiAoREJHX09VVFBVVCAhPSBUSVBDX05VTEwpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IHJvb3RfYnVmOwogCiAJCXdoaWxlIChidWYpIHsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfZGlzdHIuYyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwppbmRleCBmMGIwNjNiLi43YmY4N2NiIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKKysrIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCkBAIC02NiwxMSArNjYsMTEgQEAKICAqLwogCiBzdHJ1Y3QgZGlzdHJfaXRlbSB7Ci0JdTMyIHR5cGU7Ci0JdTMyIGxvd2VyOwotCXUzMiB1cHBlcjsKLQl1MzIgcmVmOwotCXUzMiBrZXk7CisJX19iZTMyIHR5cGU7CisJX19iZTMyIGxvd2VyOworCV9fYmUzMiB1cHBlcjsKKwlfX2JlMzIgcmVmOworCV9fYmUzMiBrZXk7CiB9OwogCiAvKioKQEAgLTEyMiw3ICsxMjIsNyBAQAogCXN0cnVjdCBza19idWZmICpidWY7CiAJc3RydWN0IGRpc3RyX2l0ZW0gKml0ZW07CiAKLQlsaXN0X2FkZCgmcHVibC0+bG9jYWxfbGlzdCwgJnB1Ymxfcm9vdCk7CisJbGlzdF9hZGRfdGFpbCgmcHVibC0+bG9jYWxfbGlzdCwgJnB1Ymxfcm9vdCk7CiAJcHVibF9jbnQrKzsKIAogCWJ1ZiA9IG5hbWVkX3ByZXBhcmVfYnVmKFBVQkxJQ0FUSU9OLCBJVEVNX1NJWkUsIDApOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbm9kZS5jIGIvbmV0L3RpcGMvbm9kZS5jCmluZGV4IGZjNmQwOTYuLjQxMTFhMzEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25vZGUuYworKysgYi9uZXQvdGlwYy9ub2RlLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlzdHJ1Y3Qgbm9kZSAqbl9wdHI7CiAgICAgICAgIHN0cnVjdCBub2RlICoqY3Vycl9ub2RlOwogCi0Jbl9wdHIgPSBrbWFsbG9jKHNpemVvZigqbl9wdHIpLEdGUF9BVE9NSUMpOworCW5fcHRyID0ga3phbGxvYyhzaXplb2YoKm5fcHRyKSxHRlBfQVRPTUlDKTsKIAlpZiAoIW5fcHRyKSB7CiAJCXdhcm4oIk5vZGUgY3JlYXRpb24gZmFpbGVkLCBubyBtZW1vcnlcbiIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTc1LDcgKzc1LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCQkKLQltZW1zZXQobl9wdHIsIDAsIHNpemVvZigqbl9wdHIpKTsKIAluX3B0ci0+YWRkciA9IGFkZHI7CiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2luaXQoJm5fcHRyLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbl9wdHItPm5zdWIpOwpAQCAtNTk3LDggKzU5Niw3IEBACiAJaWYgKCFUTFZfQ0hFQ0socmVxX3Rsdl9hcmVhLCByZXFfdGx2X3NwYWNlLCBUSVBDX1RMVl9ORVRfQUREUikpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfVExWX0VSUk9SKTsKIAotCWRvbWFpbiA9ICoodTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKTsKLQlkb21haW4gPSBudG9obChkb21haW4pOworCWRvbWFpbiA9IG50b2hsKCooX19iZTMyICopVExWX0RBVEEocmVxX3Rsdl9hcmVhKSk7CiAJaWYgKCF0aXBjX2FkZHJfZG9tYWluX3ZhbGlkKGRvbWFpbikpCiAJCXJldHVybiB0aXBjX2NmZ19yZXBseV9lcnJvcl9zdHJpbmcoVElQQ19DRkdfSU5WQUxJRF9WQUxVRQogCQkJCQkJICAgIiAobmV0d29yayBhZGRyZXNzKSIpOwpAQCAtNjQyLDEzICs2NDAsMTIgQEAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX05FVF9BRERSKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19UTFZfRVJST1IpOwogCi0JZG9tYWluID0gKih1MzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpOwotCWRvbWFpbiA9IG50b2hsKGRvbWFpbik7CisJZG9tYWluID0gbnRvaGwoKihfX2JlMzIgKilUTFZfREFUQShyZXFfdGx2X2FyZWEpKTsKIAlpZiAoIXRpcGNfYWRkcl9kb21haW5fdmFsaWQoZG9tYWluKSkKIAkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZyhUSVBDX0NGR19JTlZBTElEX1ZBTFVFCiAJCQkJCQkgICAiIChuZXR3b3JrIGFkZHJlc3MpIik7CiAKLSAgICAgICAgaWYgKCF0aXBjX25vZGVzKQorICAgICAgICBpZiAodGlwY19tb2RlICE9IFRJUENfTkVUX01PREUpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X25vbmUoKTsKIAkKIAkvKiBHZXQgc3BhY2UgZm9yIGFsbCB1bmljYXN0IGxpbmtzICsgbXVsdGljYXN0IGxpbmsgKi8KQEAgLTY2NCw4ICs2NjEsNyBAQAogCiAJLyogQWRkIFRMViBmb3IgYnJvYWRjYXN0IGxpbmsgKi8KIAotICAgICAgICBsaW5rX2luZm8uZGVzdCA9IHRpcGNfb3duX2FkZHIgJiAweGZmZmZmMDA7Ci0JbGlua19pbmZvLmRlc3QgPSBodG9ubChsaW5rX2luZm8uZGVzdCk7CisgICAgICAgIGxpbmtfaW5mby5kZXN0ID0gaHRvbmwodGlwY19vd25fYWRkciAmIDB4ZmZmZmYwMCk7CiAgICAgICAgIGxpbmtfaW5mby51cCA9IGh0b25sKDEpOwogICAgICAgICBzcHJpbnRmKGxpbmtfaW5mby5zdHIsIHRpcGNfYmNsaW5rX25hbWUpOwogCXRpcGNfY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9MSU5LX0lORk8sICZsaW5rX2luZm8sIHNpemVvZihsaW5rX2luZm8pKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL3BvcnQuYyBiL25ldC90aXBjL3BvcnQuYwppbmRleCBiOWM4YzZiLi5iN2YzMTk5IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9wb3J0LmMKKysrIGIvbmV0L3RpcGMvcG9ydC5jCkBAIC01MDUsOSArNTA1LDE0IEBACiAJc3RydWN0IHBvcnQgKnBfcHRyID0gdGlwY19wb3J0X2xvY2socmVmKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gTlVMTDsKIAotCWlmICghcF9wdHIgfHwgIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKKwlpZiAoIXBfcHRyKQogCQlyZXR1cm47CiAKKwlpZiAoIXBfcHRyLT5wdWJsLmNvbm5lY3RlZCkgeworCQl0aXBjX3BvcnRfdW5sb2NrKHBfcHRyKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIExhc3QgcHJvYmUgYW5zd2VyZWQgPyAqLwogCWlmIChwX3B0ci0+cHJvYmluZ19zdGF0ZSA9PSBQUk9CSU5HKSB7CiAJCWJ1ZiA9IHBvcnRfYnVpbGRfc2VsZl9hYm9ydF9tc2cocF9wdHIsIFRJUENfRVJSX05PX1BPUlQpOwpAQCAtMTEzMSwxMSArMTEzNiwxMiBAQAogCWludCByZXMgPSAtRUlOVkFMOwogCiAJcF9wdHIgPSB0aXBjX3BvcnRfbG9jayhyZWYpOworCWlmICghcF9wdHIpCisJCXJldHVybiAtRUlOVkFMOworCiAJZGJnKCJ0aXBjX3B1YmwgJXUsIHBfcHRyID0gJXgsIGNvbm4gPSAleCwgc2NvcGUgPSAleCwgIgogCSAgICAibG93ZXIgPSAldSwgdXBwZXIgPSAldVxuIiwKIAkgICAgcmVmLCBwX3B0ciwgcF9wdHItPnB1YmwuY29ubmVjdGVkLCBzY29wZSwgc2VxLT5sb3dlciwgc2VxLT51cHBlcik7Ci0JaWYgKCFwX3B0cikKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHBfcHRyLT5wdWJsLmNvbm5lY3RlZCkKIAkJZ290byBleGl0OwogCWlmIChzZXEtPmxvd2VyID4gc2VxLT51cHBlcikKZGlmZiAtLWdpdCBhL25ldC90aXBjL3NvY2tldC5jIGIvbmV0L3RpcGMvc29ja2V0LmMKaW5kZXggYWNmYjg1Mi4uMmE2YTVhNiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc29ja2V0LmMKKysrIGIvbmV0L3RpcGMvc29ja2V0LmMKQEAgLTIsNyArMiw3IEBACiAgKiBuZXQvdGlwYy9zb2NrZXQuYzogVElQQyBzb2NrZXQgQVBJCiAgKiAKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBFcmljc3NvbiBBQgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIFdpbmQgUml2ZXIgU3lzdGVtcworICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYsIFdpbmQgUml2ZXIgU3lzdGVtcwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTYyOSw2ICs2MjksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9UQ09OTjsKICAgICAgICAgfQogCisJaWYgKHVubGlrZWx5KG0tPm1zZ19uYW1lKSkKKwkJcmV0dXJuIC1FSVNDT05OOworCiAJLyogCiAJICogU2VuZCBlYWNoIGlvdmVjIGVudHJ5IHVzaW5nIG9uZSBvciBtb3JlIG1lc3NhZ2VzCiAJICoKQEAgLTY0MSw2ICs2NDQsOCBAQAogCWN1cnJfaW92bGVuID0gbS0+bXNnX2lvdmxlbjsKIAlteV9tc2cubXNnX2lvdiA9ICZteV9pb3Y7CiAJbXlfbXNnLm1zZ19pb3ZsZW4gPSAxOworCW15X21zZy5tc2dfZmxhZ3MgPSBtLT5tc2dfZmxhZ3M7CisJbXlfbXNnLm1zZ19uYW1lID0gTlVMTDsKIAlieXRlc19zZW50ID0gMDsKIAogCXdoaWxlIChjdXJyX2lvdmxlbi0tKSB7CkBAIC0xMjAzLDcgKzEyMDgsOCBAQAogCWF0b21pY19pbmMoJnRpcGNfcXVldWVfc2l6ZSk7CiAJc2tiX3F1ZXVlX3RhaWwoJnNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLCBidWYpOwogCi0gICAgICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZShzb2NrLT5zay0+c2tfc2xlZXApOworCWlmICh3YWl0cXVldWVfYWN0aXZlKHNvY2stPnNrLT5za19zbGVlcCkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShzb2NrLT5zay0+c2tfc2xlZXApOwogCXJldHVybiBUSVBDX09LOwogfQogCkBAIC0xMjE4LDcgKzEyMjQsOCBAQAogewogCXN0cnVjdCB0aXBjX3NvY2sgKnRzb2NrID0gKHN0cnVjdCB0aXBjX3NvY2sgKil0cG9ydC0+dXNyX2hhbmRsZTsKIAotICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUodHNvY2stPnNrLnNrX3NsZWVwKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSh0c29jay0+c2suc2tfc2xlZXApKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUodHNvY2stPnNrLnNrX3NsZWVwKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zdWJzY3IuYyBiL25ldC90aXBjL3N1YnNjci5jCmluZGV4IGM1MTYwMGIuLmRkYWRlNzMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3N1YnNjci5jCisrKyBiL25ldC90aXBjL3N1YnNjci5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkgICAgc3ViLT5zZXEudXBwZXIsIGZvdW5kX2xvd2VyLCBmb3VuZF91cHBlcik7CiAJaWYgKCF0aXBjX3N1YnNjcl9vdmVybGFwKHN1YiwgZm91bmRfbG93ZXIsIGZvdW5kX3VwcGVyKSkKIAkJcmV0dXJuOwotCWlmICghbXVzdCAmJiAoc3ViLT5maWx0ZXIgIT0gVElQQ19TVUJfUE9SVFMpKQorCWlmICghbXVzdCAmJiAhKHN1Yi0+ZmlsdGVyICYgVElQQ19TVUJfUE9SVFMpKQogCQlyZXR1cm47CiAJc3Vic2NyX3NlbmRfZXZlbnQoc3ViLCBmb3VuZF9sb3dlciwgZm91bmRfdXBwZXIsIGV2ZW50LCBwb3J0X3JlZiwgbm9kZSk7CiB9CkBAIC0xNzYsNiArMTc2LDEzIEBACiAJaWYgKHN1YnNjcmliZXIgPT0gTlVMTCkKIAkJcmV0dXJuOwogCisJLyogVmFsaWRhdGUgdGltZW91dCAoaW4gY2FzZSBzdWJzY3JpcHRpb24gaXMgYmVpbmcgY2FuY2VsbGVkKSAqLworCisJaWYgKHN1Yi0+dGltZW91dCA9PSBUSVBDX1dBSVRfRk9SRVZFUikgeworCQl0aXBjX3JlZl91bmxvY2soc3Vic2NyaWJlcl9yZWYpOworCQlyZXR1cm47CisJfQorCiAJLyogVW5saW5rIHN1YnNjcmlwdGlvbiBmcm9tIG5hbWUgdGFibGUgKi8KIAogCXRpcGNfbmFtZXRibF91bnN1YnNjcmliZShzdWIpOwpAQCAtMTk5LDYgKzIwNiwyMCBAQAogfQogCiAvKioKKyAqIHN1YnNjcl9kZWwgLSBkZWxldGUgYSBzdWJzY3JpcHRpb24gd2l0aGluIGEgc3Vic2NyaXB0aW9uIGxpc3QKKyAqCisgKiBDYWxsZWQgd2l0aCBzdWJzY3JpYmVyIGxvY2tlZC4KKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3JfZGVsKHN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YikKK3sKKwl0aXBjX25hbWV0YmxfdW5zdWJzY3JpYmUoc3ViKTsKKwlsaXN0X2RlbCgmc3ViLT5zdWJzY3JpcHRpb25fbGlzdCk7CisJa2ZyZWUoc3ViKTsKKwlhdG9taWNfZGVjKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KTsKK30KKworLyoqCiAgKiBzdWJzY3JfdGVybWluYXRlIC0gdGVybWluYXRlIGNvbW11bmljYXRpb24gd2l0aCBhIHN1YnNjcmliZXIKICAqIAogICogQ2FsbGVkIHdpdGggc3Vic2NyaWJlciBsb2NrZWQuICBSb3V0aW5lIG11c3QgdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGlzIGxvY2sKQEAgLTIyNywxMiArMjQ4LDkgQEAKIAkJCWtfY2FuY2VsX3RpbWVyKCZzdWItPnRpbWVyKTsKIAkJCWtfdGVybV90aW1lcigmc3ViLT50aW1lcik7CiAJCX0KLQkJdGlwY19uYW1ldGJsX3Vuc3Vic2NyaWJlKHN1Yik7Ci0JCWxpc3RfZGVsKCZzdWItPnN1YnNjcmlwdGlvbl9saXN0KTsKLQkJZGJnKCJUZXJtOiBSZW1vdmVkIHN1YiAldSwldSwldSBmcm9tIHN1YnNjcmliZXIgJXggbGlzdFxuIiwKKwkJZGJnKCJUZXJtOiBSZW1vdmluZyBzdWIgJXUsJXUsJXUgZnJvbSBzdWJzY3JpYmVyICV4IGxpc3RcbiIsCiAJCSAgICBzdWItPnNlcS50eXBlLCBzdWItPnNlcS5sb3dlciwgc3ViLT5zZXEudXBwZXIsIHN1YnNjcmliZXIpOwotCQlrZnJlZShzdWIpOwotCQlhdG9taWNfZGVjKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KTsKKwkJc3Vic2NyX2RlbChzdWIpOwogCX0KIAogCS8qIFNldmVyIGNvbm5lY3Rpb24gdG8gc3Vic2NyaWJlciAqLwpAQCAtMjUzLDYgKzI3MSw0OSBAQAogfQogCiAvKioKKyAqIHN1YnNjcl9jYW5jZWwgLSBoYW5kbGUgc3Vic2NyaXB0aW9uIGNhbmNlbGxhdGlvbiByZXF1ZXN0CisgKgorICogQ2FsbGVkIHdpdGggc3Vic2NyaWJlciBsb2NrZWQuICBSb3V0aW5lIG11c3QgdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGlzIGxvY2sKKyAqIHRvIGVuYWJsZSB0aGUgc3Vic2NyaXB0aW9uIHRpbWVvdXQgcm91dGluZSB0byBmaW5pc2ggd2l0aG91dCBkZWFkbG9ja2luZzsKKyAqIHRoZSBsb2NrIGlzIHRoZW4gcmVjbGFpbWVkIHRvIGFsbG93IGNhbGxlciB0byByZWxlYXNlIGl0IHVwb24gcmV0dXJuLgorICoKKyAqIE5vdGUgdGhhdCBmaWVsZHMgb2YgJ3MnIHVzZSBzdWJzY3JpYmVyJ3MgZW5kaWFubmVzcyEKKyAqLworCitzdGF0aWMgdm9pZCBzdWJzY3JfY2FuY2VsKHN0cnVjdCB0aXBjX3N1YnNjciAqcywKKwkJCSAgc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViOworCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN1Yl90ZW1wOworCWludCBmb3VuZCA9IDA7CisKKwkvKiBGaW5kIGZpcnN0IG1hdGNoaW5nIHN1YnNjcmlwdGlvbiwgZXhpdCBpZiBub3QgZm91bmQgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdWIsIHN1Yl90ZW1wLCAmc3Vic2NyaWJlci0+c3Vic2NyaXB0aW9uX2xpc3QsCisJCQkJIHN1YnNjcmlwdGlvbl9saXN0KSB7CisJCWlmICghbWVtY21wKHMsICZzdWItPmV2dC5zLCBzaXplb2Yoc3RydWN0IHRpcGNfc3Vic2NyKSkpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpCisJCXJldHVybjsKKworCS8qIENhbmNlbCBzdWJzY3JpcHRpb24gdGltZXIgKGlmIHVzZWQpLCB0aGVuIGRlbGV0ZSBzdWJzY3JpcHRpb24gKi8KKworCWlmIChzdWItPnRpbWVvdXQgIT0gVElQQ19XQUlUX0ZPUkVWRVIpIHsKKwkJc3ViLT50aW1lb3V0ID0gVElQQ19XQUlUX0ZPUkVWRVI7CisJCXNwaW5fdW5sb2NrX2JoKHN1YnNjcmliZXItPmxvY2spOworCQlrX2NhbmNlbF90aW1lcigmc3ViLT50aW1lcik7CisJCWtfdGVybV90aW1lcigmc3ViLT50aW1lcik7CisJCXNwaW5fbG9ja19iaChzdWJzY3JpYmVyLT5sb2NrKTsKKwl9CisJZGJnKCJDYW5jZWw6IHJlbW92aW5nIHN1YiAldSwldSwldSBmcm9tIHN1YnNjcmliZXIgJXggbGlzdFxuIiwKKwkgICAgc3ViLT5zZXEudHlwZSwgc3ViLT5zZXEubG93ZXIsIHN1Yi0+c2VxLnVwcGVyLCBzdWJzY3JpYmVyKTsKKwlzdWJzY3JfZGVsKHN1Yik7Cit9CisKKy8qKgogICogc3Vic2NyX3N1YnNjcmliZSAtIGNyZWF0ZSBzdWJzY3JpcHRpb24gZm9yIHN1YnNjcmliZXIKICAqIAogICogQ2FsbGVkIHdpdGggc3Vic2NyaWJlciBsb2NrZWQKQEAgLTI2Myw2ICszMjQsMjEgQEAKIHsKIAlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWI7CiAKKwkvKiBEZXRlcm1pbmUvdXBkYXRlIHN1YnNjcmliZXIncyBlbmRpYW5uZXNzICovCisKKwlpZiAocy0+ZmlsdGVyICYgKFRJUENfU1VCX1BPUlRTIHwgVElQQ19TVUJfU0VSVklDRSkpCisJCXN1YnNjcmliZXItPnN3YXAgPSAwOworCWVsc2UKKwkJc3Vic2NyaWJlci0+c3dhcCA9IDE7CisKKwkvKiBEZXRlY3QgJiBwcm9jZXNzIGEgc3Vic2NyaXB0aW9uIGNhbmNlbGxhdGlvbiByZXF1ZXN0ICovCisKKwlpZiAocy0+ZmlsdGVyICYgaHRvaGwoVElQQ19TVUJfQ0FOQ0VMLCBzdWJzY3JpYmVyLT5zd2FwKSkgeworCQlzLT5maWx0ZXIgJj0gfmh0b2hsKFRJUENfU1VCX0NBTkNFTCwgc3Vic2NyaWJlci0+c3dhcCk7CisJCXN1YnNjcl9jYW5jZWwocywgc3Vic2NyaWJlcik7CisJCXJldHVybjsKKwl9CisKIAkvKiBSZWZ1c2Ugc3Vic2NyaXB0aW9uIGlmIGdsb2JhbCBsaW1pdCBleGNlZWRlZCAqLwogCiAJaWYgKGF0b21pY19yZWFkKCZ0b3BzcnYuc3Vic2NyaXB0aW9uX2NvdW50KSA+PSB0aXBjX21heF9zdWJzY3JpcHRpb25zKSB7CkBAIC0yNzQsMzAgKzM1MCwyMiBAQAogCiAJLyogQWxsb2NhdGUgc3Vic2NyaXB0aW9uIG9iamVjdCAqLwogCi0Jc3ViID0ga21hbGxvYyhzaXplb2YoKnN1YiksIEdGUF9BVE9NSUMpOworCXN1YiA9IGt6YWxsb2Moc2l6ZW9mKCpzdWIpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXN1YikgewogCQl3YXJuKCJTdWJzY3JpcHRpb24gcmVqZWN0ZWQsIG5vIG1lbW9yeVxuIik7CiAJCXN1YnNjcl90ZXJtaW5hdGUoc3Vic2NyaWJlcik7CiAJCXJldHVybjsKIAl9CiAKLQkvKiBEZXRlcm1pbmUvdXBkYXRlIHN1YnNjcmliZXIncyBlbmRpYW5uZXNzICovCi0KLQlpZiAoKHMtPmZpbHRlciA9PSBUSVBDX1NVQl9QT1JUUykgfHwgKHMtPmZpbHRlciA9PSBUSVBDX1NVQl9TRVJWSUNFKSkKLQkJc3Vic2NyaWJlci0+c3dhcCA9IDA7Ci0JZWxzZQotCQlzdWJzY3JpYmVyLT5zd2FwID0gMTsKLQogCS8qIEluaXRpYWxpemUgc3Vic2NyaXB0aW9uIG9iamVjdCAqLwogCi0JbWVtc2V0KHN1YiwgMCwgc2l6ZW9mKCpzdWIpKTsKIAlzdWItPnNlcS50eXBlID0gaHRvaGwocy0+c2VxLnR5cGUsIHN1YnNjcmliZXItPnN3YXApOwogCXN1Yi0+c2VxLmxvd2VyID0gaHRvaGwocy0+c2VxLmxvd2VyLCBzdWJzY3JpYmVyLT5zd2FwKTsKIAlzdWItPnNlcS51cHBlciA9IGh0b2hsKHMtPnNlcS51cHBlciwgc3Vic2NyaWJlci0+c3dhcCk7CiAJc3ViLT50aW1lb3V0ID0gaHRvaGwocy0+dGltZW91dCwgc3Vic2NyaWJlci0+c3dhcCk7CiAJc3ViLT5maWx0ZXIgPSBodG9obChzLT5maWx0ZXIsIHN1YnNjcmliZXItPnN3YXApOwotCWlmICgoKChzdWItPmZpbHRlciAhPSBUSVBDX1NVQl9QT1JUUykgCi0JICAgICAgJiYgKHN1Yi0+ZmlsdGVyICE9IFRJUENfU1VCX1NFUlZJQ0UpKSkKKwlpZiAoKCEoc3ViLT5maWx0ZXIgJiBUSVBDX1NVQl9QT1JUUykKKwkgICAgID09ICEoc3ViLT5maWx0ZXIgJiBUSVBDX1NVQl9TRVJWSUNFKSkKIAkgICAgfHwgKHN1Yi0+c2VxLmxvd2VyID4gc3ViLT5zZXEudXBwZXIpKSB7CiAJCXdhcm4oIlN1YnNjcmlwdGlvbiByZWplY3RlZCwgaWxsZWdhbCByZXF1ZXN0XG4iKTsKIAkJa2ZyZWUoc3ViKTsKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCBiNDNhMjc4Li4yZjIwOGM3IDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKKysrIGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC0xNTEsOCArMTUxLDkgQEAKICAqICAgIGVhY2ggc29ja2V0IHN0YXRlIGlzIHByb3RlY3RlZCBieSBzZXBhcmF0ZSByd2xvY2suCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCB1bml4X2hhc2hfZm9sZCh1bnNpZ25lZCBoYXNoKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCB1bml4X2hhc2hfZm9sZChfX3dzdW0gbikKIHsKKwl1bnNpZ25lZCBoYXNoID0gKF9fZm9yY2UgdW5zaWduZWQpbjsKIAloYXNoIF49IGhhc2g+PjE2OwogCWhhc2ggXj0gaGFzaD4+ODsKIAlyZXR1cm4gaGFzaCYoVU5JWF9IQVNIX1NJWkUtMSk7CmRpZmYgLS1naXQgYS9uZXQvdW5peC9nYXJiYWdlLmMgYi9uZXQvdW5peC9nYXJiYWdlLmMKaW5kZXggNzQ2YzJmNC4uZjE0YWQ2NiAxMDA2NDQKLS0tIGEvbmV0L3VuaXgvZ2FyYmFnZS5jCisrKyBiL25ldC91bml4L2dhcmJhZ2UuYwpAQCAtOTYsNyArOTYsNyBAQAogc3RhdGljIHN0cnVjdCBzb2NrICp1bml4X2dldF9zb2NrZXQoc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IHNvY2sgKnVfc29jayA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCiAJLyoKIAkgKglTb2NrZXQgPwpkaWZmIC0tZ2l0IGEvbmV0L3dhbnJvdXRlci9hZl93YW5waXBlLmMgYi9uZXQvd2Fucm91dGVyL2FmX3dhbnBpcGUuYwppbmRleCA2ZjM5ZmFhLi5jMjA1OTczIDEwMDY0NAotLS0gYS9uZXQvd2Fucm91dGVyL2FmX3dhbnBpcGUuYworKysgYi9uZXQvd2Fucm91dGVyL2FmX3dhbnBpcGUuYwpAQCAtMTMsNyArMTMsNyBAQAogKiBEdWUgQ3JlZGl0OgogKiAgICAgICAgICAgICAgIFdhbnBpcGUgc29ja2V0IGxheWVyIGlzIGJhc2VkIG9uIFBhY2tldCBhbmQgCiAqICAgICAgICAgICAgICAgdGhlIFgyNSBzb2NrZXQgbGF5ZXJzLiBUaGUgYWJvdmUgc29ja2V0cyB3ZXJlIAotKiAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSBzcGVjaWZpYyB1c2Ugb2YgU2FuZ29tYSBUZWNobm9sb2lnZXMgCisqICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIHNwZWNpZmljIHVzZSBvZiBTYW5nb21hIFRlY2hub2xvZ2llcyAKICogICAgICAgICAgICAgICBBUEkgcHJvZ3JhbXMuIAogKiAgICAgICAgICAgICAgIFBhY2tldCBzb2NrZXQgQXV0aG9yczogUm9zcyBCaXJvLCBGcmVkIE4uIHZhbiBLZW1wZW4gYW5kIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxhbiBDb3guCkBAIC0yMyw3ICsyMyw3IEBACiAqIEFwciAyNSwgMjAwMCAgTmVuYWQgQ29yYmljICAgICBvIEFkZGVkIHRoZSBhYmlsaXR5IHRvIHNlbmQgemVybyBsZW5ndGggcGFja2V0cy4KICogTWFyIDEzLCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gQWRkZWQgYSB0eCBidWZmZXIgY2hlY2sgdmlhIGlvY3RsIGNhbGwuCiAqIE1hciAwNiwgMjAwMCAgTmVuYWQgQ29yYmljICAgICBvIEZpeGVkIHRoZSBjb3JydXB0IHNvY2sgbGNuIHByb2JsZW0uCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlciBhbmQgY2xpZW50IGFwcGxpY2F0b24gY2FuIHJ1bgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXIgYW5kIGNsaWVudCBhcHBsaWNhdGlvbiBjYW4gcnVuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsdGFuZW91c2x5IHdpdGhvdXQgY29uZmxpY3RzLgogKiBGZWIgMjksIDIwMDAgIE5lbmFkIENvcmJpYyAgICAgbyBBZGRlZCBzdXBwb3J0IGZvciBQVkMgcHJvdG9jb2xzLCBzdWNoIGFzCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRExDLCBGcmFtZSBSZWxheSBhbmQgSERMQyBBUEkuCmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL3dhbm1haW4uYyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCmluZGV4IDk0Nzk2NTkuLjc2OWNkZDYgMTAwNjQ0Ci0tLSBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCisrKyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCkBAIC0zLDcgKzMsNyBAQAogKgogKgkJVGhpcyBtb2R1bGUgaXMgY29tcGxldGVseSBoYXJkd2FyZS1pbmRlcGVuZGVudCBhbmQgcHJvdmlkZXMKICoJCXRoZSBmb2xsb3dpbmcgY29tbW9uIHNlcnZpY2VzIGZvciB0aGUgV0FOIExpbmsgRHJpdmVyczoKLSoJCSBvIFdBTiBkZXZpY2UgbWFuYWdlbm1lbnQgKHJlZ2lzdGVyaW5nLCB1bnJlZ2lzdGVyaW5nKQorKgkJIG8gV0FOIGRldmljZSBtYW5hZ2VtZW50IChyZWdpc3RlcmluZywgdW5yZWdpc3RlcmluZykKICoJCSBvIE5ldHdvcmsgaW50ZXJmYWNlIG1hbmFnZW1lbnQKICoJCSBvIFBoeXNpY2FsIGNvbm5lY3Rpb24gbWFuYWdlbWVudCAoZGlhbC11cCwgaW5jb21pbmcgY2FsbHMpCiAqCQkgbyBMb2dpY2FsIGNvbm5lY3Rpb24gbWFuYWdlbWVudCAoc3dpdGNoZWQgdmlydHVhbCBjaXJjdWl0cykKQEAgLTYyLDYzICs2Miw2IEBACiAKICNkZWZpbmUgS01FTV9TQUZFVFlaT05FIDgKIAotLyoqKioqKioqKioqRk9SIERFQlVHR0lORyBQVVJQT1NFUyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotc3RhdGljIHZvaWQgKiBkYmdfa21hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IHByaW8sIGludCBsaW5lKSB7Ci0JaW50IGkgPSAwOwotCXZvaWQgKiB2ID0ga21hbGxvYyhzaXplK3NpemVvZih1bnNpZ25lZCBpbnQpKzIqS01FTV9TQUZFVFlaT05FKjgscHJpbyk7Ci0JY2hhciAqIGMxID0gdjsKLQljMSArPSBzaXplb2YodW5zaWduZWQgaW50KTsKLQkqKCh1bnNpZ25lZCBpbnQgKil2KSA9IHNpemU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKLQkJYzFbMF0gPSAnRCc7IGMxWzFdID0gJ0UnOyBjMVsyXSA9ICdBJzsgYzFbM10gPSAnRCc7Ci0JCWMxWzRdID0gJ0InOyBjMVs1XSA9ICdFJzsgYzFbNl0gPSAnRSc7IGMxWzddID0gJ0YnOwotCQljMSArPSA4OwotCX0KLQljMSArPSBzaXplOwotCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgewotCQljMVswXSA9ICdNJzsgYzFbMV0gPSAnVSc7IGMxWzJdID0gJ04nOyBjMVszXSA9ICdHJzsKLQkJYzFbNF0gPSAnVyc7IGMxWzVdID0gJ0EnOyBjMVs2XSA9ICdMJzsgYzFbN10gPSAnTCc7Ci0JCWMxICs9IDg7Ci0JfQotCXYgPSAoKGNoYXIgKil2KSArIHNpemVvZih1bnNpZ25lZCBpbnQpICsgS01FTV9TQUZFVFlaT05FKjg7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibGluZSAlZCAga21hbGxvYyglZCwlZCkgPSAlcFxuIixsaW5lLHNpemUscHJpbyx2KTsKLQlyZXR1cm4gdjsKLX0KLXN0YXRpYyB2b2lkIGRiZ19rZnJlZSh2b2lkICogdiwgaW50IGxpbmUpIHsKLQl1bnNpZ25lZCBpbnQgKiBzcCA9ICh1bnNpZ25lZCBpbnQgKikoKChjaGFyICopdikgLSAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqOCkpOwotCXVuc2lnbmVkIGludCBzaXplID0gKnNwOwotCWNoYXIgKiBjMSA9ICgoY2hhciAqKXYpIC0gS01FTV9TQUZFVFlaT05FKjg7Ci0JaW50IGkgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgewotCQlpZiAoICAgYzFbMF0gIT0gJ0QnIHx8IGMxWzFdICE9ICdFJyB8fCBjMVsyXSAhPSAnQScgfHwgYzFbM10gIT0gJ0QnCi0JCSAgICB8fCBjMVs0XSAhPSAnQicgfHwgYzFbNV0gIT0gJ0UnIHx8IGMxWzZdICE9ICdFJyB8fCBjMVs3XSAhPSAnRicpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImttYWxsb2NlZCBibG9jayBhdCAlcCBoYXMgYmVlbiBjb3JydXB0ZWQgKHVuZGVycnVuKSFcbiIsdik7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIgJTR4OiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLCBpKjgsCi0JCQkgICAgICAgICAgICAgICAgYzFbMF0sYzFbMV0sYzFbMl0sYzFbM10sYzFbNF0sYzFbNV0sYzFbNl0sYzFbN10gKTsKLQkJfQotCQljMSArPSA4OwotCX0KLQljMSArPSBzaXplOwotCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgewotCQlpZiAoICAgYzFbMF0gIT0gJ00nIHx8IGMxWzFdICE9ICdVJyB8fCBjMVsyXSAhPSAnTicgfHwgYzFbM10gIT0gJ0cnCi0JCSAgICB8fCBjMVs0XSAhPSAnVycgfHwgYzFbNV0gIT0gJ0EnIHx8IGMxWzZdICE9ICdMJyB8fCBjMVs3XSAhPSAnTCcKLQkJICAgKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJrbWFsbG9jZWQgYmxvY2sgYXQgJXAgaGFzIGJlZW4gY29ycnVwdGVkIChvdmVycnVuKTpcbiIsdik7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIgJTR4OiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLCBpKjgsCi0JCQkgICAgICAgICAgICAgICAgYzFbMF0sYzFbMV0sYzFbMl0sYzFbM10sYzFbNF0sYzFbNV0sYzFbNl0sYzFbN10gKTsKLQkJfQotCQljMSArPSA4OwotCX0KLQlwcmludGsoS0VSTl9JTkZPICJsaW5lICVkICBrZnJlZSglcClcbiIsbGluZSx2KTsKLQl2ID0gKChjaGFyICopdikgLSAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqOCk7Ci0Ja2ZyZWUodik7Ci19Ci0KLSNkZWZpbmUga21hbGxvYyh4LHkpIGRiZ19rbWFsbG9jKHgseSxfX0xJTkVfXykKLSNkZWZpbmUga2ZyZWUoeCkgZGJnX2tmcmVlKHgsX19MSU5FX18pCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogLyoKICAqIAlGdW5jdGlvbiBQcm90b3R5cGVzCiAgKi8KZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fYWxnby5jIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKaW5kZXggNWEwZGJlYi4uNmIzODFmYzAzIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX2FsZ28uYworKysgYi9uZXQveGZybS94ZnJtX2FsZ28uYwpAQCAtMTE5LDYgKzExOSwyMyBAQAogCQkuc2FkYl9hbGdfbWF4Yml0cyA9IDE2MAogCX0KIH0sCit7CisJLm5hbWUgPSAieGNiYyhhZXMpIiwKKworCS51aW5mbyA9IHsKKwkJLmF1dGggPSB7CisJCQkuaWN2X3RydW5jYml0cyA9IDk2LAorCQkJLmljdl9mdWxsYml0cyA9IDEyOCwKKwkJfQorCX0sCisKKwkuZGVzYyA9IHsKKwkJLnNhZGJfYWxnX2lkID0gU0FEQl9YX0FBTEdfQUVTX1hDQkNfTUFDLAorCQkuc2FkYl9hbGdfaXZsZW4gPSAwLAorCQkuc2FkYl9hbGdfbWluYml0cyA9IDEyOCwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSAxMjgKKwl9Cit9LAogfTsKIAogc3RhdGljIHN0cnVjdCB4ZnJtX2FsZ29fZGVzYyBlYWxnX2xpc3RbXSA9IHsKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1faW5wdXQuYyBiL25ldC94ZnJtL3hmcm1faW5wdXQuYwppbmRleCBlODE5OGEyLi40MTRmODkwIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX2lucHV0LmMKKysrIGIvbmV0L3hmcm0veGZybV9pbnB1dC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KIAotc3RhdGljIGttZW1fY2FjaGVfdCAqc2VjcGF0aF9jYWNoZXAgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc2VjcGF0aF9jYWNoZXAgX19yZWFkX21vc3RseTsKIAogdm9pZCBfX3NlY3BhdGhfZGVzdHJveShzdHJ1Y3Qgc2VjX3BhdGggKnNwKQogewpAQCAtMjcsNyArMjcsNyBAQAogewogCXN0cnVjdCBzZWNfcGF0aCAqc3A7CiAKLQlzcCA9IGttZW1fY2FjaGVfYWxsb2Moc2VjcGF0aF9jYWNoZXAsIFNMQUJfQVRPTUlDKTsKKwlzcCA9IGttZW1fY2FjaGVfYWxsb2Moc2VjcGF0aF9jYWNoZXAsIEdGUF9BVE9NSUMpOwogCWlmICghc3ApCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3BvbGljeS5jIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwppbmRleCA3NzM2YjIzLi5iZWJkNDBlIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3BvbGljeS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KIAogI2luY2x1ZGUgInhmcm1faGFzaC5oIgogCkBAIC0zOSw3ICs0MCw3IEBACiBzdGF0aWMgREVGSU5FX1JXTE9DSyh4ZnJtX3BvbGljeV9hZmluZm9fbG9jayk7CiBzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqeGZybV9wb2xpY3lfYWZpbmZvW05QUk9UT107CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnhmcm1fZHN0X2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnhmcm1fZHN0X2NhY2hlIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgeGZybV9wb2xpY3lfZ2Nfd29yazsKIHN0YXRpYyBITElTVF9IRUFEKHhmcm1fcG9saWN5X2djX2xpc3QpOwpAQCAtNTAsNiArNTEsNDAgQEAKIHN0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICp4ZnJtX3BvbGljeV9sb2NrX2FmaW5mbyh1bnNpZ25lZCBpbnQgZmFtaWx5KTsKIHN0YXRpYyB2b2lkIHhmcm1fcG9saWN5X3VubG9ja19hZmluZm8oc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqYWZpbmZvKTsKIAorc3RhdGljIGlubGluZSBpbnQKK19feGZybTRfc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCkKK3sKKwlyZXR1cm4gIGFkZHJfbWF0Y2goJmZsLT5mbDRfZHN0LCAmc2VsLT5kYWRkciwgc2VsLT5wcmVmaXhsZW5fZCkgJiYKKwkJYWRkcl9tYXRjaCgmZmwtPmZsNF9zcmMsICZzZWwtPnNhZGRyLCBzZWwtPnByZWZpeGxlbl9zKSAmJgorCQkhKCh4ZnJtX2Zsb3dpX2Rwb3J0KGZsKSBeIHNlbC0+ZHBvcnQpICYgc2VsLT5kcG9ydF9tYXNrKSAmJgorCQkhKCh4ZnJtX2Zsb3dpX3Nwb3J0KGZsKSBeIHNlbC0+c3BvcnQpICYgc2VsLT5zcG9ydF9tYXNrKSAmJgorCQkoZmwtPnByb3RvID09IHNlbC0+cHJvdG8gfHwgIXNlbC0+cHJvdG8pICYmCisJCShmbC0+b2lmID09IHNlbC0+aWZpbmRleCB8fCAhc2VsLT5pZmluZGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19feGZybTZfc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCkKK3sKKwlyZXR1cm4gIGFkZHJfbWF0Y2goJmZsLT5mbDZfZHN0LCAmc2VsLT5kYWRkciwgc2VsLT5wcmVmaXhsZW5fZCkgJiYKKwkJYWRkcl9tYXRjaCgmZmwtPmZsNl9zcmMsICZzZWwtPnNhZGRyLCBzZWwtPnByZWZpeGxlbl9zKSAmJgorCQkhKCh4ZnJtX2Zsb3dpX2Rwb3J0KGZsKSBeIHNlbC0+ZHBvcnQpICYgc2VsLT5kcG9ydF9tYXNrKSAmJgorCQkhKCh4ZnJtX2Zsb3dpX3Nwb3J0KGZsKSBeIHNlbC0+c3BvcnQpICYgc2VsLT5zcG9ydF9tYXNrKSAmJgorCQkoZmwtPnByb3RvID09IHNlbC0+cHJvdG8gfHwgIXNlbC0+cHJvdG8pICYmCisJCShmbC0+b2lmID09IHNlbC0+aWZpbmRleCB8fCAhc2VsLT5pZmluZGV4KTsKK30KKworaW50IHhmcm1fc2VsZWN0b3JfbWF0Y2goc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCwgc3RydWN0IGZsb3dpICpmbCwKKwkJICAgIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKK3sKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIF9feGZybTRfc2VsZWN0b3JfbWF0Y2goc2VsLCBmbCk7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIF9feGZybTZfc2VsZWN0b3JfbWF0Y2goc2VsLCBmbCk7CisJfQorCXJldHVybiAwOworfQorCiBpbnQgeGZybV9yZWdpc3Rlcl90eXBlKHN0cnVjdCB4ZnJtX3R5cGUgKnR5cGUsIHVuc2lnbmVkIHNob3J0IGZhbWlseSkKIHsKIAlzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICphZmluZm8gPSB4ZnJtX3BvbGljeV9sb2NrX2FmaW5mbyhmYW1pbHkpOwpAQCAtMzU4LDcgKzM5Myw3IEBACiAJeGZybV9wb2xfcHV0KHBvbGljeSk7CiB9CiAKLXN0YXRpYyB2b2lkIHhmcm1fcG9saWN5X2djX3Rhc2sodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHhmcm1fcG9saWN5X2djX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCB4ZnJtX3BvbGljeSAqcG9saWN5OwogCXN0cnVjdCBobGlzdF9ub2RlICplbnRyeSwgKnRtcDsKQEAgLTU0Niw3ICs1ODEsNyBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKGhhc2hfcmVzaXplX211dGV4KTsKIAotc3RhdGljIHZvaWQgeGZybV9oYXNoX3Jlc2l6ZSh2b2lkICpfX3VudXNlZCkKK3N0YXRpYyB2b2lkIHhmcm1faGFzaF9yZXNpemUoc3RydWN0IHdvcmtfc3RydWN0ICpfX3VudXNlZCkKIHsKIAlpbnQgZGlyLCB0b3RhbDsKIApAQCAtNTYzLDcgKzU5OCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZoYXNoX3Jlc2l6ZV9tdXRleCk7CiB9CiAKLXN0YXRpYyBERUNMQVJFX1dPUksoeGZybV9oYXNoX3dvcmssIHhmcm1faGFzaF9yZXNpemUsIE5VTEwpOworc3RhdGljIERFQ0xBUkVfV09SSyh4ZnJtX2hhc2hfd29yaywgeGZybV9oYXNoX3Jlc2l6ZSk7CiAKIC8qIEdlbmVyYXRlIG5ldyBpbmRleC4uLiBLQU1FIHNlZW1zIHRvIGdlbmVyYXRlIHRoZW0gb3JkZXJlZCBieSBjb3N0CiAgKiBvZiBhbiBhYnNvbHV0ZSBpbnByZWRpY3RhYmlsaXR5IG9mIG9yZGVyaW5nIG9mIHJ1bGVzLiBUaGlzIHdpbGwgbm90IHBhc3MuICovCkBAIC03NzAsNyArODA1LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woeGZybV9wb2xpY3lfYnlpZCk7CiAKLXZvaWQgeGZybV9wb2xpY3lfZmx1c2godTggdHlwZSkKK3ZvaWQgeGZybV9wb2xpY3lfZmx1c2godTggdHlwZSwgc3RydWN0IHhmcm1fYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJaW50IGRpcjsKIApAQCAtNzkwLDYgKzgyNSw5IEBACiAJCQlobGlzdF9kZWwoJnBvbC0+YnlpZHgpOwogCQkJd3JpdGVfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKIAorCQkJeGZybV9hdWRpdF9sb2coYXVkaXRfaW5mby0+bG9naW51aWQsIGF1ZGl0X2luZm8tPnNlY2lkLAorCQkJCSAgICAgICBBVURJVF9NQUNfSVBTRUNfREVMU1BELCAxLCBwb2wsIE5VTEwpOworCiAJCQl4ZnJtX3BvbGljeV9raWxsKHBvbCk7CiAJCQlraWxsZWQrKzsKIApAQCAtODA4LDYgKzg0NiwxMSBAQAogCQkJCWhsaXN0X2RlbCgmcG9sLT5ieWlkeCk7CiAJCQkJd3JpdGVfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKIAorCQkJCXhmcm1fYXVkaXRfbG9nKGF1ZGl0X2luZm8tPmxvZ2ludWlkLAorCQkJCQkgICAgICAgYXVkaXRfaW5mby0+c2VjaWQsCisJCQkJCSAgICAgICBBVURJVF9NQUNfSVBTRUNfREVMU1BELCAxLAorCQkJCQkgICAgICAgcG9sLCBOVUxMKTsKKwogCQkJCXhmcm1fcG9saWN5X2tpbGwocG9sKTsKIAkJCQlraWxsZWQrKzsKIApAQCAtODI2LDMzICs4NjksMTIgQEAKIGludCB4ZnJtX3BvbGljeV93YWxrKHU4IHR5cGUsIGludCAoKmZ1bmMpKHN0cnVjdCB4ZnJtX3BvbGljeSAqLCBpbnQsIGludCwgdm9pZCopLAogCQkgICAgIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHhmcm1fcG9saWN5ICpwb2w7CisJc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsICpsYXN0ID0gTlVMTDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqZW50cnk7Ci0JaW50IGRpciwgY291bnQsIGVycm9yOworCWludCBkaXIsIGxhc3RfZGlyID0gMCwgY291bnQsIGVycm9yOwogCiAJcmVhZF9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKIAljb3VudCA9IDA7Ci0JZm9yIChkaXIgPSAwOyBkaXIgPCAyKlhGUk1fUE9MSUNZX01BWDsgZGlyKyspIHsKLQkJc3RydWN0IGhsaXN0X2hlYWQgKnRhYmxlID0geGZybV9wb2xpY3lfYnlkc3RbZGlyXS50YWJsZTsKLQkJaW50IGk7Ci0KLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBlbnRyeSwKLQkJCQkgICAgICZ4ZnJtX3BvbGljeV9pbmV4YWN0W2Rpcl0sIGJ5ZHN0KSB7Ci0JCQlpZiAocG9sLT50eXBlID09IHR5cGUpCi0JCQkJY291bnQrKzsKLQkJfQotCQlmb3IgKGkgPSB4ZnJtX3BvbGljeV9ieWRzdFtkaXJdLmhtYXNrOyBpID49IDA7IGktLSkgewotCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBlbnRyeSwgdGFibGUgKyBpLCBieWRzdCkgewotCQkJCWlmIChwb2wtPnR5cGUgPT0gdHlwZSkKLQkJCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChjb3VudCA9PSAwKSB7Ci0JCWVycm9yID0gLUVOT0VOVDsKLQkJZ290byBvdXQ7Ci0JfQogCiAJZm9yIChkaXIgPSAwOyBkaXIgPCAyKlhGUk1fUE9MSUNZX01BWDsgZGlyKyspIHsKIAkJc3RydWN0IGhsaXN0X2hlYWQgKnRhYmxlID0geGZybV9wb2xpY3lfYnlkc3RbZGlyXS50YWJsZTsKQEAgLTg2MiwyMSArODg0LDM3IEBACiAJCQkJICAgICAmeGZybV9wb2xpY3lfaW5leGFjdFtkaXJdLCBieWRzdCkgewogCQkJaWYgKHBvbC0+dHlwZSAhPSB0eXBlKQogCQkJCWNvbnRpbnVlOwotCQkJZXJyb3IgPSBmdW5jKHBvbCwgZGlyICUgWEZSTV9QT0xJQ1lfTUFYLCAtLWNvdW50LCBkYXRhKTsKLQkJCWlmIChlcnJvcikKLQkJCQlnb3RvIG91dDsKKwkJCWlmIChsYXN0KSB7CisJCQkJZXJyb3IgPSBmdW5jKGxhc3QsIGxhc3RfZGlyICUgWEZSTV9QT0xJQ1lfTUFYLAorCQkJCQkgICAgIGNvdW50LCBkYXRhKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gb3V0OworCQkJfQorCQkJbGFzdCA9IHBvbDsKKwkJCWxhc3RfZGlyID0gZGlyOworCQkJY291bnQrKzsKIAkJfQogCQlmb3IgKGkgPSB4ZnJtX3BvbGljeV9ieWRzdFtkaXJdLmhtYXNrOyBpID49IDA7IGktLSkgewogCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBlbnRyeSwgdGFibGUgKyBpLCBieWRzdCkgewogCQkJCWlmIChwb2wtPnR5cGUgIT0gdHlwZSkKIAkJCQkJY29udGludWU7Ci0JCQkJZXJyb3IgPSBmdW5jKHBvbCwgZGlyICUgWEZSTV9QT0xJQ1lfTUFYLCAtLWNvdW50LCBkYXRhKTsKLQkJCQlpZiAoZXJyb3IpCi0JCQkJCWdvdG8gb3V0OworCQkJCWlmIChsYXN0KSB7CisJCQkJCWVycm9yID0gZnVuYyhsYXN0LCBsYXN0X2RpciAlIFhGUk1fUE9MSUNZX01BWCwKKwkJCQkJCSAgICAgY291bnQsIGRhdGEpOworCQkJCQlpZiAoZXJyb3IpCisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbGFzdCA9IHBvbDsKKwkJCQlsYXN0X2RpciA9IGRpcjsKKwkJCQljb3VudCsrOwogCQkJfQogCQl9CiAJfQotCWVycm9yID0gMDsKKwlpZiAoY291bnQgPT0gMCkgeworCQllcnJvciA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKwllcnJvciA9IGZ1bmMobGFzdCwgbGFzdF9kaXIgJSBYRlJNX1BPTElDWV9NQVgsIDAsIGRhdGEpOwogb3V0OgogCXJlYWRfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0xMTc3LDYgKzEyMTUsNyBAQAogCQlpZiAodG1wbC0+bW9kZSA9PSBYRlJNX01PREVfVFVOTkVMKSB7CiAJCQlyZW1vdGUgPSAmdG1wbC0+aWQuZGFkZHI7CiAJCQlsb2NhbCA9ICZ0bXBsLT5zYWRkcjsKKwkJCWZhbWlseSA9IHRtcGwtPmVuY2FwX2ZhbWlseTsKIAkJCWlmICh4ZnJtX2FkZHJfYW55KGxvY2FsLCBmYW1pbHkpKSB7CiAJCQkJZXJyb3IgPSB4ZnJtX2dldF9zYWRkcigmdG1wLCByZW1vdGUsIGZhbWlseSk7CiAJCQkJaWYgKGVycm9yKQpAQCAtMTg5NCw3ICsxOTMzLDggQEAKIAogCQlpZiAoZmwgJiYgIXhmcm1fc2VsZWN0b3JfbWF0Y2goJmRzdC0+eGZybS0+c2VsLCBmbCwgZmFtaWx5KSkKIAkJCXJldHVybiAwOwotCQlpZiAoZmwgJiYgIXNlY3VyaXR5X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChmbCwgZHN0LT54ZnJtLCBwb2wpKQorCQlpZiAoZmwgJiYgcG9sICYmCisJCSAgICAhc2VjdXJpdHlfeGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaChkc3QtPnhmcm0sIHBvbCwgZmwpKQogCQkJcmV0dXJuIDA7CiAJCWlmIChkc3QtPnhmcm0tPmttLnN0YXRlICE9IFhGUk1fU1RBVEVfVkFMSUQpCiAJCQlyZXR1cm4gMDsKQEAgLTE5NDYsNiArMTk4NiwxMTcgQEAKIAogRVhQT1JUX1NZTUJPTCh4ZnJtX2J1bmRsZV9vayk7CiAKKyNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCisvKiBBdWRpdCBhZGRpdGlvbiBhbmQgZGVsZXRpb24gb2YgU0FzIGFuZCBpcHNlYyBwb2xpY3kgKi8KKwordm9pZCB4ZnJtX2F1ZGl0X2xvZyh1aWRfdCBhdWlkLCB1MzIgc2lkLCBpbnQgdHlwZSwgaW50IHJlc3VsdCwKKwkJICAgIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCB4ZnJtX3N0YXRlICp4KQoreworCisJY2hhciAqc2VjY3R4OworCXUzMiBzZWNjdHhfbGVuOworCXN0cnVjdCB4ZnJtX3NlY19jdHggKnNjdHggPSBOVUxMOworCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKKwlpbnQgZmFtaWx5OworCWV4dGVybiBpbnQgYXVkaXRfZW5hYmxlZDsKKworCWlmIChhdWRpdF9lbmFibGVkID09IDApCisJCXJldHVybjsKKworCWF1ZGl0X2J1ZiA9IGF1ZGl0X2xvZ19zdGFydChjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfQVRPTUlDLCB0eXBlKTsKKwlpZiAoYXVkaXRfYnVmID09IE5VTEwpCisJcmV0dXJuOworCisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIEFVRElUX01BQ19JUFNFQ19BRERTQToKKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICJTQUQgYWRkOiBhdWlkPSV1IiwgYXVpZCk7CisJCWJyZWFrOworCWNhc2UgQVVESVRfTUFDX0lQU0VDX0RFTFNBOgorCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIlNBRCBkZWxldGU6IGF1aWQ9JXUiLCBhdWlkKTsKKwkJYnJlYWs7CisJY2FzZSBBVURJVF9NQUNfSVBTRUNfQUREU1BEOgorCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIlNQRCBhZGQ6IGF1aWQ9JXUiLCBhdWlkKTsKKwkJYnJlYWs7CisJY2FzZSBBVURJVF9NQUNfSVBTRUNfREVMU1BEOgorCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwgIlNQRCBkZWxldGU6IGF1aWQ9JXUiLCBhdWlkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWlmIChzaWQgIT0gMCAmJgorCQlzZWN1cml0eV9zZWNpZF90b19zZWNjdHgoc2lkLCAmc2VjY3R4LCAmc2VjY3R4X2xlbikgPT0gMCkKKwkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgc3Viaj0lcyIsIHNlY2N0eCk7CisJZWxzZQorCQlhdWRpdF9sb2dfdGFza19jb250ZXh0KGF1ZGl0X2J1Zik7CisKKwlpZiAoeHApIHsKKwkJZmFtaWx5ID0geHAtPnNlbGVjdG9yLmZhbWlseTsKKwkJaWYgKHhwLT5zZWN1cml0eSkKKwkJCXNjdHggPSB4cC0+c2VjdXJpdHk7CisJfSBlbHNlIHsKKwkJZmFtaWx5ID0geC0+cHJvcHMuZmFtaWx5OworCQlpZiAoeC0+c2VjdXJpdHkpCisJCQlzY3R4ID0geC0+c2VjdXJpdHk7CisJfQorCisJaWYgKHNjdHgpCisJCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLAorCQkJCSIgc2VjX2FsZz0ldSBzZWNfZG9pPSV1IHNlY19vYmo9JXMiLAorCQkJCXNjdHgtPmN0eF9hbGcsIHNjdHgtPmN0eF9kb2ksIHNjdHgtPmN0eF9zdHIpOworCisJc3dpdGNoKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJeworCQkJc3RydWN0IGluX2FkZHIgc2FkZHIsIGRhZGRyOworCQkJaWYgKHhwKSB7CisJCQkJc2FkZHIuc19hZGRyID0geHAtPnNlbGVjdG9yLnNhZGRyLmE0OworCQkJCWRhZGRyLnNfYWRkciA9IHhwLT5zZWxlY3Rvci5kYWRkci5hNDsKKwkJCX0gZWxzZSB7CisJCQkJc2FkZHIuc19hZGRyID0geC0+cHJvcHMuc2FkZHIuYTQ7CisJCQkJZGFkZHIuc19hZGRyID0geC0+aWQuZGFkZHIuYTQ7CisJCQl9CisJCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKKwkJCQkJICIgc3JjPSV1LiV1LiV1LiV1IGRzdD0ldS4ldS4ldS4ldSIsCisJCQkJCSBOSVBRVUFEKHNhZGRyKSwgTklQUVVBRChkYWRkcikpOworCQl9CisJCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQl7CisJCQlzdHJ1Y3QgaW42X2FkZHIgc2FkZHI2LCBkYWRkcjY7CisJCQlpZiAoeHApIHsKKwkJCQltZW1jcHkoJnNhZGRyNiwgeHAtPnNlbGVjdG9yLnNhZGRyLmE2LAorCQkJCQlzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCQkJbWVtY3B5KCZkYWRkcjYsIHhwLT5zZWxlY3Rvci5kYWRkci5hNiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoJnNhZGRyNiwgeC0+cHJvcHMuc2FkZHIuYTYsCisJCQkJCXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCQltZW1jcHkoJmRhZGRyNiwgeC0+aWQuZGFkZHIuYTYsCisJCQkJCXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCX0KKwkJCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLAorCQkJCQkgIiBzcmM9IiBOSVA2X0ZNVCAiZHN0PSIgTklQNl9GTVQsCisJCQkJCSBOSVA2KHNhZGRyNiksIE5JUDYoZGFkZHI2KSk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKHgpCisJCWF1ZGl0X2xvZ19mb3JtYXQoYXVkaXRfYnVmLCAiIHNwaT0lbHUoMHglbHgpIHByb3RvY29sPSVzIiwKKwkJCQkodW5zaWduZWQgbG9uZyludG9obCh4LT5pZC5zcGkpLAorCQkJCSh1bnNpZ25lZCBsb25nKW50b2hsKHgtPmlkLnNwaSksCisJCQkJeC0+aWQucHJvdG8gPT0gSVBQUk9UT19BSCA/ICJBSCIgOgorCQkJCSh4LT5pZC5wcm90byA9PSBJUFBST1RPX0VTUCA/CisJCQkJIkVTUCIgOiAiSVBDT01QIikpOworCisJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsICIgcmVzPSV1IiwgcmVzdWx0KTsKKwlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7Cit9CisKK0VYUE9SVF9TWU1CT0woeGZybV9hdWRpdF9sb2cpOworI2VuZGlmIC8qIENPTkZJR19BVURJVFNZU0NBTEwgKi8KKwogaW50IHhmcm1fcG9saWN5X3JlZ2lzdGVyX2FmaW5mbyhzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICphZmluZm8pCiB7CiAJaW50IGVyciA9IDA7CkBAIC0yMDgwLDcgKzIyMzEsNyBAQAogCQkJcGFuaWMoIlhGUk06IGZhaWxlZCB0byBhbGxvY2F0ZSBieWRzdCBoYXNoXG4iKTsKIAl9CiAKLQlJTklUX1dPUksoJnhmcm1fcG9saWN5X2djX3dvcmssIHhmcm1fcG9saWN5X2djX3Rhc2ssIE5VTEwpOworCUlOSVRfV09SSygmeGZybV9wb2xpY3lfZ2Nfd29yaywgeGZybV9wb2xpY3lfZ2NfdGFzayk7CiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZ4ZnJtX2Rldl9ub3RpZmllcik7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwppbmRleCAzOWI4YmYzLi5mZGIwOGQ5IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3N0YXRlLmMKKysrIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAKICNpbmNsdWRlICJ4ZnJtX2hhc2guaCIKIApAQCAtMTE1LDcgKzExNiw3IEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgoaGFzaF9yZXNpemVfbXV0ZXgpOwogCi1zdGF0aWMgdm9pZCB4ZnJtX2hhc2hfcmVzaXplKHZvaWQgKl9fdW51c2VkKQorc3RhdGljIHZvaWQgeGZybV9oYXNoX3Jlc2l6ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl9fdW51c2VkKQogewogCXN0cnVjdCBobGlzdF9oZWFkICpuZHN0LCAqbnNyYywgKm5zcGksICpvZHN0LCAqb3NyYywgKm9zcGk7CiAJdW5zaWduZWQgbG9uZyBuc2l6ZSwgb3NpemU7CkBAIC0xNjgsNyArMTY5LDcgQEAKIAltdXRleF91bmxvY2soJmhhc2hfcmVzaXplX211dGV4KTsKIH0KIAotc3RhdGljIERFQ0xBUkVfV09SSyh4ZnJtX2hhc2hfd29yaywgeGZybV9oYXNoX3Jlc2l6ZSwgTlVMTCk7CitzdGF0aWMgREVDTEFSRV9XT1JLKHhmcm1faGFzaF93b3JrLCB4ZnJtX2hhc2hfcmVzaXplKTsKIAogREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoa21fd2FpdHEpOwogRVhQT1JUX1NZTUJPTChrbV93YWl0cSk7CkBAIC0yMDcsNyArMjA4LDcgQEAKIAlrZnJlZSh4KTsKIH0KIAotc3RhdGljIHZvaWQgeGZybV9zdGF0ZV9nY190YXNrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX2djX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OwogCXN0cnVjdCBobGlzdF9ub2RlICplbnRyeSwgKnRtcDsKQEAgLTIzOCw2ICsyMzksNyBAQAogCXVuc2lnbmVkIGxvbmcgbm93ID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOwogCWxvbmcgbmV4dCA9IExPTkdfTUFYOwogCWludCB3YXJuID0gMDsKKwlpbnQgZXJyID0gMDsKIAogCXNwaW5fbG9jaygmeC0+bG9jayk7CiAJaWYgKHgtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfREVBRCkKQEAgLTI5NSw5ICsyOTcsMTQgQEAKIAkJbmV4dCA9IDI7CiAJCWdvdG8gcmVzY2hlZDsKIAl9Ci0JaWYgKCFfX3hmcm1fc3RhdGVfZGVsZXRlKHgpICYmIHgtPmlkLnNwaSkKKworCWVyciA9IF9feGZybV9zdGF0ZV9kZWxldGUoeCk7CisJaWYgKCFlcnIgJiYgeC0+aWQuc3BpKQogCQlrbV9zdGF0ZV9leHBpcmVkKHgsIDEsIDApOwogCisJeGZybV9hdWRpdF9sb2coYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpLCAwLAorCQkgICAgICAgQVVESVRfTUFDX0lQU0VDX0RFTFNBLCBlcnIgPyAwIDogMSwgTlVMTCwgeCk7CisKIG91dDoKIAlzcGluX3VubG9jaygmeC0+bG9jayk7CiB9CkBAIC0zODQsOSArMzkxLDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfZGVsZXRlKTsKIAotdm9pZCB4ZnJtX3N0YXRlX2ZsdXNoKHU4IHByb3RvKQordm9pZCB4ZnJtX3N0YXRlX2ZsdXNoKHU4IHByb3RvLCBzdHJ1Y3QgeGZybV9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgaTsKKwlpbnQgZXJyID0gMDsKIAogCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDw9IHhmcm1fc3RhdGVfaG1hc2s7IGkrKykgewpAQCAtMzk5LDcgKzQwNywxMSBAQAogCQkJCXhmcm1fc3RhdGVfaG9sZCh4KTsKIAkJCQlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKIAotCQkJCXhmcm1fc3RhdGVfZGVsZXRlKHgpOworCQkJCWVyciA9IHhmcm1fc3RhdGVfZGVsZXRlKHgpOworCQkJCXhmcm1fYXVkaXRfbG9nKGF1ZGl0X2luZm8tPmxvZ2ludWlkLAorCQkJCQkgICAgICAgYXVkaXRfaW5mby0+c2VjaWQsCisJCQkJCSAgICAgICBBVURJVF9NQUNfSVBTRUNfREVMU0EsCisJCQkJCSAgICAgICBlcnIgPyAwIDogMSwgTlVMTCwgeCk7CiAJCQkJeGZybV9zdGF0ZV9wdXQoeCk7CiAKIAkJCQlzcGluX2xvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7CkBAIC01MDUsNiArNTE3LDE0IEBACiAJCQkJCQkgIHgtPmlkLnByb3RvLCBmYW1pbHkpOwogfQogCitzdGF0aWMgdm9pZCB4ZnJtX2hhc2hfZ3Jvd19jaGVjayhpbnQgaGF2ZV9oYXNoX2NvbGxpc2lvbikKK3sKKwlpZiAoaGF2ZV9oYXNoX2NvbGxpc2lvbiAmJgorCSAgICAoeGZybV9zdGF0ZV9obWFzayArIDEpIDwgeGZybV9zdGF0ZV9oYXNobWF4ICYmCisJICAgIHhmcm1fc3RhdGVfbnVtID4geGZybV9zdGF0ZV9obWFzaykKKwkJc2NoZWR1bGVfd29yaygmeGZybV9oYXNoX3dvcmspOworfQorCiBzdHJ1Y3QgeGZybV9zdGF0ZSAqCiB4ZnJtX3N0YXRlX2ZpbmQoeGZybV9hZGRyZXNzX3QgKmRhZGRyLCB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIAogCQlzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV90bXBsICp0bXBsLApAQCAtNTk4LDYgKzYxOCw4IEBACiAJCQl4LT5sZnQuaGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzID0gWEZSTV9BQ1FfRVhQSVJFUzsKIAkJCXgtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgWEZSTV9BQ1FfRVhQSVJFUypIWjsKIAkJCWFkZF90aW1lcigmeC0+dGltZXIpOworCQkJeGZybV9zdGF0ZV9udW0rKzsKKwkJCXhmcm1faGFzaF9ncm93X2NoZWNrKHgtPmJ5ZHN0Lm5leHQgIT0gTlVMTCk7CiAJCX0gZWxzZSB7CiAJCQl4LT5rbS5zdGF0ZSA9IFhGUk1fU1RBVEVfREVBRDsKIAkJCXhmcm1fc3RhdGVfcHV0KHgpOwpAQCAtNjQyLDEwICs2NjQsNyBAQAogCiAJeGZybV9zdGF0ZV9udW0rKzsKIAotCWlmICh4LT5ieWRzdC5uZXh0ICE9IE5VTEwgJiYKLQkgICAgKHhmcm1fc3RhdGVfaG1hc2sgKyAxKSA8IHhmcm1fc3RhdGVfaGFzaG1heCAmJgotCSAgICB4ZnJtX3N0YXRlX251bSA+IHhmcm1fc3RhdGVfaG1hc2spCi0JCXNjaGVkdWxlX3dvcmsoJnhmcm1faGFzaF93b3JrKTsKKwl4ZnJtX2hhc2hfZ3Jvd19jaGVjayh4LT5ieWRzdC5uZXh0ICE9IE5VTEwpOwogfQogCiAvKiB4ZnJtX3N0YXRlX2xvY2sgaXMgaGVsZCAqLwpAQCAtNzUzLDYgKzc3MiwxMCBAQAogCQloID0geGZybV9zcmNfaGFzaChkYWRkciwgc2FkZHIsIGZhbWlseSk7CiAJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNyYywgeGZybV9zdGF0ZV9ieXNyYytoKTsKIAkJd2FrZV91cCgma21fd2FpdHEpOworCisJCXhmcm1fc3RhdGVfbnVtKys7CisKKwkJeGZybV9oYXNoX2dyb3dfY2hlY2soeC0+Ynlkc3QubmV4dCAhPSBOVUxMKTsKIAl9CiAKIAlyZXR1cm4geDsKQEAgLTEwODgsNyArMTExMSw3IEBACiAJCSAgICB2b2lkICpkYXRhKQogewogCWludCBpOwotCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCXN0cnVjdCB4ZnJtX3N0YXRlICp4LCAqbGFzdCA9IE5VTEw7CiAJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OwogCWludCBjb3VudCA9IDA7CiAJaW50IGVyciA9IDA7CkBAIC0xMDk2LDI0ICsxMTE5LDIyIEBACiAJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPD0geGZybV9zdGF0ZV9obWFzazsgaSsrKSB7CiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIGVudHJ5LCB4ZnJtX3N0YXRlX2J5ZHN0K2ksIGJ5ZHN0KSB7Ci0JCQlpZiAoeGZybV9pZF9wcm90b19tYXRjaCh4LT5pZC5wcm90bywgcHJvdG8pKQotCQkJCWNvdW50Kys7CisJCQlpZiAoIXhmcm1faWRfcHJvdG9fbWF0Y2goeC0+aWQucHJvdG8sIHByb3RvKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsYXN0KSB7CisJCQkJZXJyID0gZnVuYyhsYXN0LCBjb3VudCwgZGF0YSk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCQlsYXN0ID0geDsKKwkJCWNvdW50Kys7CiAJCX0KIAl9CiAJaWYgKGNvdW50ID09IDApIHsKIAkJZXJyID0gLUVOT0VOVDsKIAkJZ290byBvdXQ7CiAJfQotCi0JZm9yIChpID0gMDsgaSA8PSB4ZnJtX3N0YXRlX2htYXNrOyBpKyspIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoeCwgZW50cnksIHhmcm1fc3RhdGVfYnlkc3QraSwgYnlkc3QpIHsKLQkJCWlmICgheGZybV9pZF9wcm90b19tYXRjaCh4LT5pZC5wcm90bywgcHJvdG8pKQotCQkJCWNvbnRpbnVlOwotCQkJZXJyID0gZnVuYyh4LCAtLWNvdW50LCBkYXRhKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBvdXQ7Ci0JCX0KLQl9CisJZXJyID0gZnVuYyhsYXN0LCAwLCBkYXRhKTsKIG91dDoKIAlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTI5Myw3ICsxMzE0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21fcXVlcnkpOwogCi1pbnQga21fbmV3X21hcHBpbmcoc3RydWN0IHhmcm1fc3RhdGUgKngsIHhmcm1fYWRkcmVzc190ICppcGFkZHIsIHUxNiBzcG9ydCkKK2ludCBrbV9uZXdfbWFwcGluZyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgeGZybV9hZGRyZXNzX3QgKmlwYWRkciwgX19iZTE2IHNwb3J0KQogewogCWludCBlcnIgPSAtRUlOVkFMOwogCXN0cnVjdCB4ZnJtX21nciAqa207CkBAIC0xNTU3LDYgKzE1NzgsNiBAQAogCQlwYW5pYygiWEZSTTogQ2Fubm90IGFsbG9jYXRlIGJ5ZHN0L2J5c3JjL2J5c3BpIGhhc2hlcy4iKTsKIAl4ZnJtX3N0YXRlX2htYXNrID0gKChzeiAvIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkpIC0gMSk7CiAKLQlJTklUX1dPUksoJnhmcm1fc3RhdGVfZ2Nfd29yaywgeGZybV9zdGF0ZV9nY190YXNrLCBOVUxMKTsKKwlJTklUX1dPUksoJnhmcm1fc3RhdGVfZ2Nfd29yaywgeGZybV9zdGF0ZV9nY190YXNrKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV91c2VyLmMgYi9uZXQveGZybS94ZnJtX3VzZXIuYwppbmRleCAyYjJlNTlkLi5lNTM3MmIxIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3VzZXIuYworKysgYi9uZXQveGZybS94ZnJtX3VzZXIuYwpAQCAtMzEsNiArMzEsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2VuZGlmCisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KIAogc3RhdGljIGludCB2ZXJpZnlfb25lX2FsZyhzdHJ1Y3QgcnRhdHRyICoqeGZybWEsIGVudW0geGZybV9hdHRyX3R5cGVfdCB0eXBlKQogewpAQCAtMjQ0LDExICsyNDUsMTAgQEAKIAkqcHJvcHMgPSBhbGdvLT5kZXNjLnNhZGJfYWxnX2lkOwogCiAJbGVuID0gc2l6ZW9mKCp1YWxnKSArICh1YWxnLT5hbGdfa2V5X2xlbiArIDdVKSAvIDg7Ci0JcCA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlwID0ga21lbWR1cCh1YWxnLCBsZW4sIEdGUF9LRVJORUwpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1jcHkocCwgdWFsZywgbGVuKTsKIAlzdHJjcHkocC0+YWxnX25hbWUsIGFsZ28tPm5hbWUpOwogCSphbGdwcCA9IHA7CiAJcmV0dXJuIDA7CkBAIC0yNjMsMTEgKzI2MywxMCBAQAogCQlyZXR1cm4gMDsKIAogCXVlbmNhcCA9IFJUQV9EQVRBKHJ0YSk7Ci0JcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJcCA9IGttZW1kdXAodWVuY2FwLCBzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtY3B5KHAsIHVlbmNhcCwgc2l6ZW9mKCpwKSk7CiAJKmVuY2FwcCA9IHA7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMDUsMTEgKzMwNCwxMCBAQAogCQlyZXR1cm4gMDsKIAogCXVhZGRycCA9IFJUQV9EQVRBKHJ0YSk7Ci0JcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJcCA9IGttZW1kdXAodWFkZHJwLCBzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXApCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtY3B5KHAsIHVhZGRycCwgc2l6ZW9mKCpwKSk7CiAJKmFkZHJwcCA9IHA7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjMsNyArMzIxLDcgQEAKIAl4LT5wcm9wcy5yZXBsYXlfd2luZG93ID0gcC0+cmVwbGF5X3dpbmRvdzsKIAl4LT5wcm9wcy5yZXFpZCA9IHAtPnJlcWlkOwogCXgtPnByb3BzLmZhbWlseSA9IHAtPmZhbWlseTsKLQl4LT5wcm9wcy5zYWRkciA9IHAtPnNhZGRyOworCW1lbWNweSgmeC0+cHJvcHMuc2FkZHIsICZwLT5zYWRkciwgc2l6ZW9mKHgtPnByb3BzLnNhZGRyKSk7CiAJeC0+cHJvcHMuZmxhZ3MgPSBwLT5mbGFnczsKIH0KIApAQCAtNDU3LDYgKzQ1NSw5IEBACiAJZWxzZQogCQllcnIgPSB4ZnJtX3N0YXRlX3VwZGF0ZSh4KTsKIAorCXhmcm1fYXVkaXRfbG9nKE5FVExJTktfQ0Ioc2tiKS5sb2dpbnVpZCwgTkVUTElOS19DQihza2IpLnNpZCwKKwkJICAgICAgIEFVRElUX01BQ19JUFNFQ19BRERTQSwgZXJyID8gMCA6IDEsIE5VTEwsIHgpOworCiAJaWYgKGVyciA8IDApIHsKIAkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CiAJCV9feGZybV9zdGF0ZV9wdXQoeCk7CkBAIC00OTUsNiArNDk2LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKKwkJZXJyID0gLUVTUkNIOwogCQl4ID0geGZybV9zdGF0ZV9sb29rdXBfYnlhZGRyKCZwLT5kYWRkciwgc2FkZHIsIHAtPnByb3RvLAogCQkJCQkgICAgIHAtPmZhbWlseSk7CiAJfQpAQCAtNTI1LDYgKzUyNywxMCBAQAogCX0KIAogCWVyciA9IHhmcm1fc3RhdGVfZGVsZXRlKHgpOworCisJeGZybV9hdWRpdF9sb2coTkVUTElOS19DQihza2IpLmxvZ2ludWlkLCBORVRMSU5LX0NCKHNrYikuc2lkLAorCQkgICAgICAgQVVESVRfTUFDX0lQU0VDX0RFTFNBLCBlcnIgPyAwIDogMSwgTlVMTCwgeCk7CisKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTU0NSw3ICs1NTEsNyBAQAogCW1lbWNweSgmcC0+bGZ0LCAmeC0+bGZ0LCBzaXplb2YocC0+bGZ0KSk7CiAJbWVtY3B5KCZwLT5jdXJsZnQsICZ4LT5jdXJsZnQsIHNpemVvZihwLT5jdXJsZnQpKTsKIAltZW1jcHkoJnAtPnN0YXRzLCAmeC0+c3RhdHMsIHNpemVvZihwLT5zdGF0cykpOwotCXAtPnNhZGRyID0geC0+cHJvcHMuc2FkZHI7CisJbWVtY3B5KCZwLT5zYWRkciwgJngtPnByb3BzLnNhZGRyLCBzaXplb2YocC0+c2FkZHIpKTsKIAlwLT5tb2RlID0geC0+cHJvcHMubW9kZTsKIAlwLT5yZXBsYXlfd2luZG93ID0geC0+cHJvcHMucmVwbGF5X3dpbmRvdzsKIAlwLT5yZXFpZCA9IHgtPnByb3BzLnJlcWlkOwpAQCAtNjUyLDcgKzY1OCw2IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JTkVUTElOS19DQihza2IpLmRzdF9waWQgPSBORVRMSU5LX0NCKGluX3NrYikucGlkOwogCWluZm8uaW5fc2tiID0gaW5fc2tiOwogCWluZm8ub3V0X3NrYiA9IHNrYjsKIAlpbmZvLm5sbXNnX3NlcSA9IHNlcTsKQEAgLTc3Miw3ICs3NzcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgdmVyaWZ5X3BvbGljeV9kaXIoX191OCBkaXIpCitzdGF0aWMgaW50IHZlcmlmeV9wb2xpY3lfZGlyKHU4IGRpcikKIHsKIAlzd2l0Y2ggKGRpcikgewogCWNhc2UgWEZSTV9QT0xJQ1lfSU46CkBAIC03ODcsNyArNzkyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2ZXJpZnlfcG9saWN5X3R5cGUoX191OCB0eXBlKQorc3RhdGljIGludCB2ZXJpZnlfcG9saWN5X3R5cGUodTggdHlwZSkKIHsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFhGUk1fUE9MSUNZX1RZUEVfTUFJTjoKQEAgLTg3NCwyMiArODc5LDU3IEBACiAJCXQtPmFhbGdvcyA9IHV0LT5hYWxnb3M7CiAJCXQtPmVhbGdvcyA9IHV0LT5lYWxnb3M7CiAJCXQtPmNhbGdvcyA9IHV0LT5jYWxnb3M7CisJCXQtPmVuY2FwX2ZhbWlseSA9IHV0LT5mYW1pbHk7CiAJfQogfQogCitzdGF0aWMgaW50IHZhbGlkYXRlX3RtcGwoaW50IG5yLCBzdHJ1Y3QgeGZybV91c2VyX3RtcGwgKnV0LCB1MTYgZmFtaWx5KQoreworCWludCBpOworCisJaWYgKG5yID4gWEZSTV9NQVhfREVQVEgpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJLyogV2UgbmV2ZXIgdmFsaWRhdGVkIHRoZSB1dC0+ZmFtaWx5IHZhbHVlLCBzbyBtYW55CisJCSAqIGFwcGxpY2F0aW9ucyBzaW1wbHkgbGVhdmUgaXQgYXQgemVyby4gIFRoZSBjaGVjayB3YXMKKwkJICogbmV2ZXIgbWFkZSBhbmQgdXQtPmZhbWlseSB3YXMgaWdub3JlZCBiZWNhdXNlIGFsbAorCQkgKiB0ZW1wbGF0ZXMgY291bGQgYmUgYXNzdW1lZCB0byBoYXZlIHRoZSBzYW1lIGZhbWlseSBhcworCQkgKiB0aGUgcG9saWN5IGl0c2VsZi4gIE5vdyB0aGF0IHdlIHdpbGwgaGF2ZSBpcHY0LWluLWlwdjYKKwkJICogYW5kIGlwdjYtaW4taXB2NCB0dW5uZWxzLCB0aGlzIGlzIG5vIGxvbmdlciB0cnVlLgorCQkgKi8KKwkJaWYgKCF1dFtpXS5mYW1pbHkpCisJCQl1dFtpXS5mYW1pbHkgPSBmYW1pbHk7CisKKwkJc3dpdGNoICh1dFtpXS5mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJCWNhc2UgQUZfSU5FVDY6CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX07CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY29weV9mcm9tX3VzZXJfdG1wbChzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgc3RydWN0IHJ0YXR0ciAqKnhmcm1hKQogewogCXN0cnVjdCBydGF0dHIgKnJ0ID0geGZybWFbWEZSTUFfVE1QTC0xXTsKLQlzdHJ1Y3QgeGZybV91c2VyX3RtcGwgKnV0bXBsOwotCWludCBucjsKIAogCWlmICghcnQpIHsKIAkJcG9sLT54ZnJtX25yID0gMDsKIAl9IGVsc2UgewotCQluciA9IChydC0+cnRhX2xlbiAtIHNpemVvZigqcnQpKSAvIHNpemVvZigqdXRtcGwpOworCQlzdHJ1Y3QgeGZybV91c2VyX3RtcGwgKnV0bXBsID0gUlRBX0RBVEEocnQpOworCQlpbnQgbnIgPSAocnQtPnJ0YV9sZW4gLSBzaXplb2YoKnJ0KSkgLyBzaXplb2YoKnV0bXBsKTsKKwkJaW50IGVycjsKIAotCQlpZiAobnIgPiBYRlJNX01BWF9ERVBUSCkKLQkJCXJldHVybiAtRUlOVkFMOworCQllcnIgPSB2YWxpZGF0ZV90bXBsKG5yLCB1dG1wbCwgcG9sLT5mYW1pbHkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQljb3B5X3RlbXBsYXRlcyhwb2wsIFJUQV9EQVRBKHJ0KSwgbnIpOwogCX0KQEAgLTkwMCw3ICs5NDAsNyBAQAogewogCXN0cnVjdCBydGF0dHIgKnJ0ID0geGZybWFbWEZSTUFfUE9MSUNZX1RZUEUtMV07CiAJc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlICp1cHQ7Ci0JX191OCB0eXBlID0gWEZSTV9QT0xJQ1lfVFlQRV9NQUlOOworCXU4IHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CiAJaW50IGVycjsKIAogCWlmIChydCkgewpAQCAtOTk4LDYgKzEwMzgsOSBAQAogCSAqIGEgdHlwZSBYRlJNX01TR19VUERQT0xJQ1kgLSBKSFMgKi8KIAlleGNsID0gbmxoLT5ubG1zZ190eXBlID09IFhGUk1fTVNHX05FV1BPTElDWTsKIAllcnIgPSB4ZnJtX3BvbGljeV9pbnNlcnQocC0+ZGlyLCB4cCwgZXhjbCk7CisJeGZybV9hdWRpdF9sb2coTkVUTElOS19DQihza2IpLmxvZ2ludWlkLCBORVRMSU5LX0NCKHNrYikuc2lkLAorCQkgICAgICAgQVVESVRfTUFDX0lQU0VDX0RFTFNQRCwgZXJyID8gMCA6IDEsIHhwLCBOVUxMKTsKKwogCWlmIChlcnIpIHsKIAkJc2VjdXJpdHlfeGZybV9wb2xpY3lfZnJlZSh4cCk7CiAJCWtmcmVlKHhwKTsKQEAgLTEwMjcsNyArMTA3MCw3IEBACiAJCXN0cnVjdCB4ZnJtX3RtcGwgKmtwID0gJnhwLT54ZnJtX3ZlY1tpXTsKIAogCQltZW1jcHkoJnVwLT5pZCwgJmtwLT5pZCwgc2l6ZW9mKHVwLT5pZCkpOwotCQl1cC0+ZmFtaWx5ID0geHAtPmZhbWlseTsKKwkJdXAtPmZhbWlseSA9IGtwLT5lbmNhcF9mYW1pbHk7CiAJCW1lbWNweSgmdXAtPnNhZGRyLCAma3AtPnNhZGRyLCBzaXplb2YodXAtPnNhZGRyKSk7CiAJCXVwLT5yZXFpZCA9IGtwLT5yZXFpZDsKIAkJdXAtPm1vZGUgPSBrcC0+bW9kZTsKQEAgLTEwODIsMTIgKzExMjUsMTIgQEAKIH0KIAogI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKLXN0YXRpYyBpbnQgY29weV90b191c2VyX3BvbGljeV90eXBlKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh1OCB0eXBlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSB1cHQ7CiAKIAltZW1zZXQoJnVwdCwgMCwgc2l6ZW9mKHVwdCkpOwotCXVwdC50eXBlID0geHAtPnR5cGU7CisJdXB0LnR5cGUgPSB0eXBlOwogCiAJUlRBX1BVVChza2IsIFhGUk1BX1BPTElDWV9UWVBFLCBzaXplb2YodXB0KSwgJnVwdCk7CiAKQEAgLTEwOTgsNyArMTE0MSw3IEBACiB9CiAKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh1OCB0eXBlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiAwOwogfQpAQCAtMTEyNyw3ICsxMTcwLDcgQEAKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCWlmIChjb3B5X3RvX3VzZXJfc2VjX2N0eCh4cCwgc2tiKSkKIAkJZ290byBubG1zZ19mYWlsdXJlOwotCWlmIChjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUoeHAsIHNrYikgPCAwKQorCWlmIChjb3B5X3RvX3VzZXJfcG9saWN5X3R5cGUoeHAtPnR5cGUsIHNrYikgPCAwKQogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAKIAlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CkBAIC0xMTcwLDcgKzEyMTMsNiBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCU5FVExJTktfQ0Ioc2tiKS5kc3RfcGlkID0gTkVUTElOS19DQihpbl9za2IpLnBpZDsKIAlpbmZvLmluX3NrYiA9IGluX3NrYjsKIAlpbmZvLm91dF9za2IgPSBza2I7CiAJaW5mby5ubG1zZ19zZXEgPSBzZXE7CkBAIC0xMTg5LDcgKzEyMzEsNyBAQAogewogCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHA7CiAJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pZCAqcDsKLQlfX3U4IHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CisJdTggdHlwZSA9IFhGUk1fUE9MSUNZX1RZUEVfTUFJTjsKIAlpbnQgZXJyOwogCXN0cnVjdCBrbV9ldmVudCBjOwogCWludCBkZWxldGU7CkBAIC0xMjI2LDYgKzEyNjgsMTAgQEAKIAkJeHAgPSB4ZnJtX3BvbGljeV9ieXNlbF9jdHgodHlwZSwgcC0+ZGlyLCAmcC0+c2VsLCB0bXAuc2VjdXJpdHksIGRlbGV0ZSk7CiAJCXNlY3VyaXR5X3hmcm1fcG9saWN5X2ZyZWUoJnRtcCk7CiAJfQorCWlmIChkZWxldGUpCisJCXhmcm1fYXVkaXRfbG9nKE5FVExJTktfQ0Ioc2tiKS5sb2dpbnVpZCwgTkVUTElOS19DQihza2IpLnNpZCwKKwkJCSAgICAgICBBVURJVF9NQUNfSVBTRUNfREVMU1BELCAoeHApID8gMSA6IDAsIHhwLCBOVUxMKTsKKwogCWlmICh4cCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMTI2MCw4ICsxMzA2LDExIEBACiB7CiAJc3RydWN0IGttX2V2ZW50IGM7CiAJc3RydWN0IHhmcm1fdXNlcnNhX2ZsdXNoICpwID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCB4ZnJtX2F1ZGl0IGF1ZGl0X2luZm87CiAKLQl4ZnJtX3N0YXRlX2ZsdXNoKHAtPnByb3RvKTsKKwlhdWRpdF9pbmZvLmxvZ2ludWlkID0gTkVUTElOS19DQihza2IpLmxvZ2ludWlkOworCWF1ZGl0X2luZm8uc2VjaWQgPSBORVRMSU5LX0NCKHNrYikuc2lkOworCXhmcm1fc3RhdGVfZmx1c2gocC0+cHJvdG8sICZhdWRpdF9pbmZvKTsKIAljLmRhdGEucHJvdG8gPSBwLT5wcm90bzsKIAljLmV2ZW50ID0gbmxoLT5ubG1zZ190eXBlOwogCWMuc2VxID0gbmxoLT5ubG1zZ19zZXE7CkBAIC0xMjgzLDEwICsxMzMyLDEyIEBACiAJaWQgPSBOTE1TR19EQVRBKG5saCk7CiAJbmxoLT5ubG1zZ19mbGFncyA9IDA7CiAKLQlpZC0+c2FfaWQuZGFkZHIgPSB4LT5pZC5kYWRkcjsKKwltZW1jcHkoJmlkLT5zYV9pZC5kYWRkciwgJngtPmlkLmRhZGRyLHNpemVvZih4LT5pZC5kYWRkcikpOwogCWlkLT5zYV9pZC5zcGkgPSB4LT5pZC5zcGk7CiAJaWQtPnNhX2lkLmZhbWlseSA9IHgtPnByb3BzLmZhbWlseTsKIAlpZC0+c2FfaWQucHJvdG8gPSB4LT5pZC5wcm90bzsKKwltZW1jcHkoJmlkLT5zYWRkciwgJngtPnByb3BzLnNhZGRyLHNpemVvZih4LT5wcm9wcy5zYWRkcikpOworCWlkLT5yZXFpZCA9IHgtPnByb3BzLnJlcWlkOwogCWlkLT5mbGFncyA9IGMtPmRhdGEuYWV2ZW50OwogCiAJUlRBX1BVVChza2IsIFhGUk1BX1JFUExBWV9WQUwsIHNpemVvZih4LT5yZXBsYXkpLCAmeC0+cmVwbGF5KTsKQEAgLTE0MDcsMTQgKzE0NTgsMTcgQEAKIHN0YXRpYyBpbnQgeGZybV9mbHVzaF9wb2xpY3koc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKip4ZnJtYSkKIHsKIAlzdHJ1Y3Qga21fZXZlbnQgYzsKLQlfX3U4IHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CisJdTggdHlwZSA9IFhGUk1fUE9MSUNZX1RZUEVfTUFJTjsKIAlpbnQgZXJyOworCXN0cnVjdCB4ZnJtX2F1ZGl0IGF1ZGl0X2luZm87CiAKIAllcnIgPSBjb3B5X2Zyb21fdXNlcl9wb2xpY3lfdHlwZSgmdHlwZSwgKHN0cnVjdCBydGF0dHIgKiopeGZybWEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQl4ZnJtX3BvbGljeV9mbHVzaCh0eXBlKTsKKwlhdWRpdF9pbmZvLmxvZ2ludWlkID0gTkVUTElOS19DQihza2IpLmxvZ2ludWlkOworCWF1ZGl0X2luZm8uc2VjaWQgPSBORVRMSU5LX0NCKHNrYikuc2lkOworCXhmcm1fcG9saWN5X2ZsdXNoKHR5cGUsICZhdWRpdF9pbmZvKTsKIAljLmRhdGEudHlwZSA9IHR5cGU7CiAJYy5ldmVudCA9IG5saC0+bmxtc2dfdHlwZTsKIAljLnNlcSA9IG5saC0+bmxtc2dfc2VxOwpAQCAtMTQyOCw3ICsxNDgyLDcgQEAKIAlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwOwogCXN0cnVjdCB4ZnJtX3VzZXJfcG9sZXhwaXJlICp1cCA9IE5MTVNHX0RBVEEobmxoKTsKIAlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8gKnAgPSAmdXAtPnBvbDsKLQlfX3U4IHR5cGUgPSBYRlJNX1BPTElDWV9UWVBFX01BSU47CisJdTggdHlwZSA9IFhGUk1fUE9MSUNZX1RZUEVfTUFJTjsKIAlpbnQgZXJyID0gLUVOT0VOVDsKIAogCWVyciA9IGNvcHlfZnJvbV91c2VyX3BvbGljeV90eXBlKCZ0eXBlLCAoc3RydWN0IHJ0YXR0ciAqKil4ZnJtYSk7CkBAIC0xNDY5LDYgKzE1MjMsOSBAQAogCWVyciA9IDA7CiAJaWYgKHVwLT5oYXJkKSB7CiAJCXhmcm1fcG9saWN5X2RlbGV0ZSh4cCwgcC0+ZGlyKTsKKwkJeGZybV9hdWRpdF9sb2coTkVUTElOS19DQihza2IpLmxvZ2ludWlkLCBORVRMSU5LX0NCKHNrYikuc2lkLAorCQkJCUFVRElUX01BQ19JUFNFQ19ERUxTUEQsIDEsIHhwLCBOVUxMKTsKKwogCX0gZWxzZSB7CiAJCS8vIHJlc2V0IHRoZSB0aW1lcnMgaGVyZT8KIAkJcHJpbnRrKCJEb250IGtub3cgd2hhdCB0byBkbyB3aXRoIHNvZnQgcG9saWN5IGV4cGlyZVxuIik7CkBAIC0xNTAwLDggKzE1NTcsMTEgQEAKIAkJZ290byBvdXQ7CiAJa21fc3RhdGVfZXhwaXJlZCh4LCB1ZS0+aGFyZCwgY3VycmVudC0+cGlkKTsKIAotCWlmICh1ZS0+aGFyZCkKKwlpZiAodWUtPmhhcmQpIHsKIAkJX194ZnJtX3N0YXRlX2RlbGV0ZSh4KTsKKwkJeGZybV9hdWRpdF9sb2coTkVUTElOS19DQihza2IpLmxvZ2ludWlkLCBORVRMSU5LX0NCKHNrYikuc2lkLAorCQkJICAgICAgIEFVRElUX01BQ19JUFNFQ19ERUxTQSwgMSwgTlVMTCwgeCk7CisJfQogb3V0OgogCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKQEAgLTE1MzAsNyArMTU5MCw4IEBACiAJfQogCiAJLyogICBidWlsZCBhbiBYUCAqLwotCXhwID0geGZybV9wb2xpY3lfY29uc3RydWN0KCZ1YS0+cG9saWN5LCAoc3RydWN0IHJ0YXR0ciAqKikgeGZybWEsICZlcnIpOyAgICAgICAgaWYgKCF4cCkgeworCXhwID0geGZybV9wb2xpY3lfY29uc3RydWN0KCZ1YS0+cG9saWN5LCAoc3RydWN0IHJ0YXR0ciAqKikgeGZybWEsICZlcnIpOworCWlmICgheHApIHsKIAkJa2ZyZWUoeCk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMTkwNyw3ICsxOTY4LDcgQEAKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCWlmIChjb3B5X3RvX3VzZXJfc3RhdGVfc2VjX2N0eCh4LCBza2IpKQogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7Ci0JaWYgKGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh4cCwgc2tiKSA8IDApCisJaWYgKGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZSh4cC0+dHlwZSwgc2tiKSA8IDApCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAogCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKQEAgLTE5MjcsNiArMTk4OCw5IEBACiAJbGVuID0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX3RtcGwpICogeHAtPnhmcm1fbnIpOwogCWxlbiArPSBOTE1TR19TUEFDRShzaXplb2Yoc3RydWN0IHhmcm1fdXNlcl9hY3F1aXJlKSk7CiAJbGVuICs9IFJUQV9TUEFDRSh4ZnJtX3VzZXJfc2VjX2N0eF9zaXplKHhwKSk7CisjaWZkZWYgQ09ORklHX1hGUk1fU1VCX1BPTElDWQorCWxlbiArPSBSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSkpOworI2VuZGlmCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE5NzYsNyArMjA0MCw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJbnIgPSAoKGxlbiAtIHNpemVvZigqcCkpIC8gc2l6ZW9mKCp1dCkpOwotCWlmIChuciA+IFhGUk1fTUFYX0RFUFRIKQorCWlmICh2YWxpZGF0ZV90bXBsKG5yLCB1dCwgcC0+c2VsLmZhbWlseSkpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKHAtPmRpciA+IFhGUk1fUE9MSUNZX09VVCkKQEAgLTIwMTQsNyArMjA3OCw3IEBACiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAlpZiAoY29weV90b191c2VyX3NlY19jdHgoeHAsIHNrYikpCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKLQlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLCBza2IpIDwgMCkKKwlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLT50eXBlLCBza2IpIDwgMCkKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCXVwZS0+aGFyZCA9ICEhaGFyZDsKIApAQCAtMjAzNCw2ICsyMDk4LDkgQEAKIAlsZW4gPSBSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCkgKiB4cC0+eGZybV9ucik7CiAJbGVuICs9IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VyX3BvbGV4cGlyZSkpOwogCWxlbiArPSBSVEFfU1BBQ0UoeGZybV91c2VyX3NlY19jdHhfc2l6ZSh4cCkpOworI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKKyNlbmRpZgogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMDYwLDYgKzIxMjcsOSBAQAogCQlsZW4gKz0gUlRBX1NQQUNFKGhlYWRsZW4pOwogCQloZWFkbGVuID0gc2l6ZW9mKCppZCk7CiAJfQorI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKKyNlbmRpZgogCWxlbiArPSBOTE1TR19TUEFDRShoZWFkbGVuKTsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwpAQCAtMjA4Nyw3ICsyMTU3LDcgQEAKIAljb3B5X3RvX3VzZXJfcG9saWN5KHhwLCBwLCBkaXIpOwogCWlmIChjb3B5X3RvX3VzZXJfdG1wbCh4cCwgc2tiKSA8IDApCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKLQlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLCBza2IpIDwgMCkKKwlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLT50eXBlLCBza2IpIDwgMCkKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCiAJbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOwpAQCAtMjEwNiwxMCArMjE3NiwxMSBAQAogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgY2hhciAqYjsKKwlpbnQgbGVuID0gMDsKICNpZmRlZiBDT05GSUdfWEZSTV9TVUJfUE9MSUNZCi0Jc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlIHVwdDsKKwlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZihzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUpKTsKICNlbmRpZgotCWludCBsZW4gPSBOTE1TR19MRU5HVEgoMCk7CisJbGVuICs9IE5MTVNHX0xFTkdUSCgwKTsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKQEAgLTIxMTksMTIgKzIxOTAsOCBAQAogCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgYy0+cGlkLCBjLT5zZXEsIFhGUk1fTVNHX0ZMVVNIUE9MSUNZLCAwKTsKIAlubGgtPm5sbXNnX2ZsYWdzID0gMDsKLQotI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKLQltZW1zZXQoJnVwdCwgMCwgc2l6ZW9mKHVwdCkpOwotCXVwdC50eXBlID0gYy0+ZGF0YS50eXBlOwotCVJUQV9QVVQoc2tiLCBYRlJNQV9QT0xJQ1lfVFlQRSwgc2l6ZW9mKHVwdCksICZ1cHQpOwotI2VuZGlmCisJaWYgKGNvcHlfdG9fdXNlcl9wb2xpY3lfdHlwZShjLT5kYXRhLnR5cGUsIHNrYikgPCAwKQorCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAKIAlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CiAKQEAgLTIxMzIsOSArMjE5OSw2IEBACiAJcmV0dXJuIG5ldGxpbmtfYnJvYWRjYXN0KHhmcm1fbmwsIHNrYiwgMCwgWEZSTU5MR1JQX1BPTElDWSwgR0ZQX0FUT01JQyk7CiAKIG5sbXNnX2ZhaWx1cmU6Ci0jaWZkZWYgQ09ORklHX1hGUk1fU1VCX1BPTElDWQotcnRhdHRyX2ZhaWx1cmU6Ci0jZW5kaWYKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQppbmRleCA0ZjVmZjE5Li5mMDFmOGMwIDEwMDY0NAotLS0gYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCisrKyBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKQEAgLTU2LDYgKzU2LDkgQEAKICMgZ2NjIHN1cHBvcnQgZnVuY3Rpb25zCiAjIFNlZSBkb2N1bWVudGF0aW9uIGluIERvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKIAorIyBvdXRwdXQgZGlyZWN0b3J5IGZvciB0ZXN0cyBiZWxvdworVE1QT1VUIDo9ICQoaWYgJChLQlVJTERfRVhUTU9EKSwkKGZpcnN0d29yZCAkKEtCVUlMRF9FWFRNT0QpKS8pCisKICMgYXMtb3B0aW9uCiAjIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgYXMtb3B0aW9uLCAtV2EkKGNvbW1hKS1pc2E9Zm9vLCkKIApAQCAtNjYsOSArNjksMTEgQEAKICMgYXMtaW5zdHIKICMgVXNhZ2U6IGNmbGFncy15ICs9ICQoY2FsbCBhcy1pbnN0ciwgaW5zdHIsIG9wdGlvbjEsIG9wdGlvbjIpCiAKLWFzLWluc3RyID0gJChzaGVsbCBpZiBlY2hvIC1lICIkKDEpIiB8ICQoQVMpID4vZGV2L251bGwgMj4mMSAtVyAtWiAtbyBhc3Rlc3QkJCQkLm91dCA7IFwKLQkJICAgdGhlbiBlY2hvICIkKDIpIjsgZWxzZSBlY2hvICIkKDMpIjsgZmk7IFwKLQkgICAgICAgICAgIHJtIC1mIGFzdGVzdCQkJCQub3V0KQorYXMtaW5zdHIgPSAkKHNoZWxsIGlmIGVjaG8gLWUgIiQoMSkiIHwgXAorCQkgICAgICAkKENDKSAkKEFGTEFHUykgLWMgLXhhc3NlbWJsZXIgLSBcCisJCQkgICAgLW8gJChUTVBPVVQpYXN0ZXN0JCQkJC5vdXQgPiAvZGV2L251bGwgMj4mMTsgXAorCQkgICB0aGVuIHJtICQoVE1QT1VUKWFzdGVzdCQkJCQub3V0OyBlY2hvICIkKDIpIjsgXAorCQkgICBlbHNlIGVjaG8gIiQoMykiOyBmaSkKIAogIyBjYy1vcHRpb24KICMgVXNhZ2U6IGNmbGFncy15ICs9ICQoY2FsbCBjYy1vcHRpb24sIC1tYXJjaD13aW5jaGlwLWM2LCAtbWFyY2g9aTU4NikKQEAgLTk3LDEwICsxMDIsMTAgQEAKIAogIyBsZC1vcHRpb24KICMgVXNhZ2U6IGxkZmxhZ3MgKz0gJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9Ym90aCkKLWxkLW9wdGlvbiA9ICQoc2hlbGwgaWYgJChDQykgJCgxKSBcCi0JCQkgICAgIC1ub3N0ZGxpYiAtbyBsZHRlc3QkJCQkLm91dCAteGMgL2Rldi9udWxsIFwKLSAgICAgICAgICAgICA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBlbHNlIGVjaG8gIiQoMikiOyBmaTsgXAotCSAgICAgcm0gLWYgbGR0ZXN0JCQkJC5vdXQpCitsZC1vcHRpb24gPSAkKHNoZWxsIGlmICQoQ0MpICQoMSkgLW5vc3RkbGliIC14YyAvZGV2L251bGwgXAorCQkJICAgICAtbyAkKFRNUE9VVClsZHRlc3QkJCQkLm91dCA+IC9kZXYvbnVsbCAyPiYxOyBcCisgICAgICAgICAgICAgdGhlbiBybSAkKFRNUE9VVClsZHRlc3QkJCQkLm91dDsgZWNobyAiJCgxKSI7IFwKKyAgICAgICAgICAgICBlbHNlIGVjaG8gIiQoMikiOyBmaSkKIAogIyMjCiAjIFNob3J0aGFuZCBmb3IgJChRKSQoTUFLRSkgLWYgc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmo9CmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmhlYWRlcnNpbnN0IGIvc2NyaXB0cy9NYWtlZmlsZS5oZWFkZXJzaW5zdAppbmRleCA2YTAyNmY2Li40MjQxZTBkIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmhlYWRlcnNpbnN0CisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuaGVhZGVyc2luc3QKQEAgLTE2OCw3ICsxNjgsNyBAQAogCSQoY2FsbCBjbWQsZ2VuKQogCiBlbHNlCi0kKG9iamhkci15KSA6CQkkKElOU1RBTExfSERSX1BBVEgpLyQoX2RzdCkvJS5oOiAkKHNyY3RyZWUpLyQob2JqKS8lLmggJChLQlVJTERGSUxFUykKKyQob2JqaGRyLXkpIDoJCSQoSU5TVEFMTF9IRFJfUEFUSCkvJChfZHN0KS8lLmg6ICQob2JqdHJlZSkvJChvYmopLyUuaCAkKEtCVUlMREZJTEVTKQogCSQoY2FsbCBjbWQsb19oZHJfaW5zdGFsbCkKIAogJChoZWFkZXIteSkgOgkJJChJTlNUQUxMX0hEUl9QQVRIKS8kKF9kc3QpLyUuaDogJChzcmN0cmVlKS8kKG9iaikvJS5oICQoS0JVSUxERklMRVMpCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKaW5kZXggNmM1NDY5Yi4uNjVlMGE3OSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdApAQCAtNDQsNyArNDQsNyBAQAogaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmxpYgogCiBrZXJuZWxzeW1maWxlIDo9ICQob2JqdHJlZSkvTW9kdWxlLnN5bXZlcnMKLW1vZHVsZXN5bWZpbGUgOj0gJChLQlVJTERfRVhUTU9EKS9Nb2R1bGUuc3ltdmVycworbW9kdWxlc3ltZmlsZSA6PSAkKGZpcnN0d29yZCAkKEtCVUlMRF9FWFRNT0QpKS9Nb2R1bGUuc3ltdmVycwogCiAjIFN0ZXAgMSksIGZpbmQgYWxsIG1vZHVsZXMgbGlzdGVkIGluICQoTU9EVkVSRElSKS8KIF9fbW9kdWxlcyA6PSAkKHNvcnQgJChzaGVsbCBncmVwIC1oICdcLmtvJyAvZGV2L251bGwgJCh3aWxkY2FyZCAkKE1PRFZFUkRJUikvKi5tb2QpKSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKaW5kZXggNGFiNmNiZi4uZDYwNzFjYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKKysrIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogdm9pZCBleHRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgeyBkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIEZVTkNUSU9OKTsgICB9CiAKIC8qCi0gKiBEb2N1bWVudCBzcOVlY2lmaWMgZnVuY3Rpb24ocykgaW4gYSBmaWxlLgorICogRG9jdW1lbnQgc3BlY2lmaWMgZnVuY3Rpb24ocykgaW4gYSBmaWxlLgogICogQ2FsbCBrZXJuZWwtZG9jIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogICoga2VybmVsLWRvYyAtZG9jYm9vayAtZnVuY3Rpb24gZnVuY3Rpb24xIFstZnVuY3Rpb24gZnVuY3Rpb24yXQogICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaCBiL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCmluZGV4IDMzMWMwNzkuLjRjNzIzZmQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCisrKyBiL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCkBAIC0xNTgsNyArMTU4LDcgQEAKIH0KIAogbGlzdF9oZWFkZXIoKSB7Ci0JZWNobyAiZGVwc19pbml0cmFtZnMgOj0gXFwiCisJOgogfQogCiBoZWFkZXIoKSB7CkBAIC0yMjcsNiArMjI3LDcgQEAKIGNhc2UgIiRhcmciIGluCiAJIi1sIikJIyBmaWxlcyBpbmNsdWRlZCBpbiBpbml0cmFtZnMgLSB1c2VkIGJ5IGtidWlsZAogCQlkZXBfbGlzdD0ibGlzdF8iCisJCWVjaG8gImRlcHNfaW5pdHJhbWZzIDo9IFxcIgogCQlzaGlmdAogCQk7OwogCSItbyIpCSMgZ2VuZXJhdGUgZ3ppcHBlZCBjcGlvIGltYWdlIG5hbWVkICQxCmRpZmYgLS1naXQgYS9zY3JpcHRzL2thbGxzeW1zLmMgYi9zY3JpcHRzL2thbGxzeW1zLmMKaW5kZXggMjJkMjgxYy4uOGI4MDliMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rYWxsc3ltcy5jCisrKyBiL3NjcmlwdHMva2FsbHN5bXMuYwpAQCAtNDMsNyArNDMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHN5bV9lbnRyeSAqdGFibGU7CiBzdGF0aWMgdW5zaWduZWQgaW50IHRhYmxlX3NpemUsIHRhYmxlX2NudDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgX3N0ZXh0LCBfZXRleHQsIF9zaW5pdHRleHQsIF9laW5pdHRleHQsIF9zZXh0cmF0ZXh0LCBfZWV4dHJhdGV4dDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgX3RleHQsIF9zdGV4dCwgX2V0ZXh0LCBfc2luaXR0ZXh0LCBfZWluaXR0ZXh0LCBfc2V4dHJhdGV4dCwgX2VleHRyYXRleHQ7CiBzdGF0aWMgaW50IGFsbF9zeW1ib2xzID0gMDsKIHN0YXRpYyBjaGFyIHN5bWJvbF9wcmVmaXhfY2hhciA9ICdcMCc7CiAKQEAgLTkxLDcgKzkxLDkgQEAKIAkJc3ltKys7CiAKIAkvKiBJZ25vcmUgbW9zdCBhYnNvbHV0ZS91bmRlZmluZWQgKD8pIHN5bWJvbHMuICovCi0JaWYgKHN0cmNtcChzeW0sICJfc3RleHQiKSA9PSAwKQorCWlmIChzdHJjbXAoc3ltLCAiX3RleHQiKSA9PSAwKQorCQlfdGV4dCA9IHMtPmFkZHI7CisJZWxzZSBpZiAoc3RyY21wKHN5bSwgIl9zdGV4dCIpID09IDApCiAJCV9zdGV4dCA9IHMtPmFkZHI7CiAJZWxzZSBpZiAoc3RyY21wKHN5bSwgIl9ldGV4dCIpID09IDApCiAJCV9ldGV4dCA9IHMtPmFkZHI7CkBAIC0yNjMsMTEgKzI2NSwyNyBAQAogCXByaW50ZigiI2RlZmluZSBBTEdOIC5hbGlnbiA0XG4iKTsKIAlwcmludGYoIiNlbmRpZlxuIik7CiAKLQlwcmludGYoIi5kYXRhXG4iKTsKKwlwcmludGYoIlx0LnNlY3Rpb24gLnJvZGF0YSwgXCJhXCJcbiIpOwogCisJLyogUHJvdmlkZSBwcm9wZXIgc3ltYm9scyByZWxvY2F0YWJpbGl0eSBieSB0aGVpciAnX3RleHQnCisJICogcmVsYXRpdmVuZXNzLiAgVGhlIHN5bWJvbCBuYW1lcyBjYW5ub3QgYmUgdXNlZCB0byBjb25zdHJ1Y3QKKwkgKiBub3JtYWwgc3ltYm9sIHJlZmVyZW5jZXMgYXMgdGhlIGxpc3Qgb2Ygc3ltYm9scyBjb250YWlucworCSAqIHN5bWJvbHMgdGhhdCBhcmUgZGVjbGFyZWQgc3RhdGljIGFuZCBhcmUgcHJpdmF0ZSB0byB0aGVpcgorCSAqIC5vIGZpbGVzLiAgVGhpcyBwcmV2ZW50cyAudG1wX2thbGxzeW1zLm8gb3IgYW55IG90aGVyCisJICogb2JqZWN0IGZyb20gcmVmZXJlbmNpbmcgdGhlbS4KKwkgKi8KIAlvdXRwdXRfbGFiZWwoImthbGxzeW1zX2FkZHJlc3NlcyIpOwogCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9jbnQ7IGkrKykgewotCQlwcmludGYoIlx0UFRSXHQlI2xseFxuIiwgdGFibGVbaV0uYWRkcik7CisJCWlmICh0b3VwcGVyKHRhYmxlW2ldLnN5bVswXSkgIT0gJ0EnKSB7CisJCQlpZiAoX3RleHQgPD0gdGFibGVbaV0uYWRkcikKKwkJCQlwcmludGYoIlx0UFRSXHRfdGV4dCArICUjbGx4XG4iLAorCQkJCQl0YWJsZVtpXS5hZGRyIC0gX3RleHQpOworCQkJZWxzZQorCQkJCXByaW50ZigiXHRQVFJcdF90ZXh0IC0gJSNsbHhcbiIsCisJCQkJCV90ZXh0IC0gdGFibGVbaV0uYWRkcik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIlx0UFRSXHQlI2xseFxuIiwgdGFibGVbaV0uYWRkcik7CisJCX0KIAl9CiAJcHJpbnRmKCJcbiIpOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvLmdpdGlnbm9yZSBiL3NjcmlwdHMva2NvbmZpZy8uZ2l0aWdub3JlCmluZGV4IGU4YWQxZjYuLmI0OTU4NGMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy8uZ2l0aWdub3JlCisrKyBiL3NjcmlwdHMva2NvbmZpZy8uZ2l0aWdub3JlCkBAIC02LDYgKzYsOCBAQAogKi50YWIuYwogKi50YWIuaAogemNvbmYuaGFzaC5jCisqLm1vYworbGtjX2RlZnMuaAogCiAjCiAjIGNvbmZpZ3VyYXRpb24gcHJvZ3JhbXMKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCmluZGV4IDRkY2I4ODYuLjEyNGIzNDEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtNjAwLDcgKzYwMCw3IEBACiAJCQlpbnB1dF9tb2RlID0gYXNrX3NpbGVudDsKIAkJCXZhbGlkX3N0ZGluID0gMTsKIAkJfQotCX0gZWxzZSBpZiAoc3ltX2NoYW5nZV9jb3VudCkgeworCX0gZWxzZSBpZiAoY29uZl9nZXRfY2hhbmdlZCgpKSB7CiAJCW5hbWUgPSBnZXRlbnYoIktDT05GSUdfTk9TSUxFTlRVUERBVEUiKTsKIAkJaWYgKG5hbWUgJiYgKm5hbWUpIHsKIAkJCWZwcmludGYoc3RkZXJyLCBfKCJcbioqKiBLZXJuZWwgY29uZmlndXJhdGlvbiByZXF1aXJlcyBleHBsaWNpdCB1cGRhdGUuXG5cbiIpKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKaW5kZXggNjZiMTVlZi4uNjY0ZmUyOSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOwogCQlpZiAoaW4pCiAJCQlnb3RvIGxvYWQ7Ci0JCXN5bV9jaGFuZ2VfY291bnQrKzsKKwkJc3ltX2FkZF9jaGFuZ2VfY291bnQoMSk7CiAJCWlmICghc3ltX2RlZmNvbmZpZ19saXN0KQogCQkJcmV0dXJuIDE7CiAKQEAgLTMxMiw3ICszMTIsNyBAQAogCXN0cnVjdCBleHByICplOwogCWludCBpLCBmbGFnczsKIAotCXN5bV9jaGFuZ2VfY291bnQgPSAwOworCXN5bV9zZXRfY2hhbmdlX2NvdW50KDApOwogCiAJaWYgKGNvbmZfcmVhZF9zaW1wbGUobmFtZSwgU19ERUZfVVNFUikpCiAJCXJldHVybiAxOwpAQCAtMzY0LDcgKzM2NCw3IEBACiAJCXN5bS0+ZmxhZ3MgJj0gZmxhZ3MgfCB+U1lNQk9MX0RFRl9VU0VSOwogCX0KIAotCXN5bV9jaGFuZ2VfY291bnQgKz0gY29uZl93YXJuaW5ncyB8fCBjb25mX3Vuc2F2ZWQ7CisJc3ltX2FkZF9jaGFuZ2VfY291bnQoY29uZl93YXJuaW5ncyB8fCBjb25mX3Vuc2F2ZWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MzIsNyArNDMyLDcgQEAKIAkJICAgICB1c2VfdGltZXN0YW1wID8gIiMgIiA6ICIiLAogCQkgICAgIHVzZV90aW1lc3RhbXAgPyBjdGltZSgmbm93KSA6ICIiKTsKIAotCWlmICghc3ltX2NoYW5nZV9jb3VudCkKKwlpZiAoIWNvbmZfZ2V0X2NoYW5nZWQoKSkKIAkJc3ltX2NsZWFyX2FsbF92YWxpZCgpOwogCiAJbWVudSA9IHJvb3RtZW51Lmxpc3Q7CkBAIC01MjgsNyArNTI4LDcgQEAKIAkJICIjIGNvbmZpZ3VyYXRpb24gd3JpdHRlbiB0byAlc1xuIgogCQkgIiNcbiIpLCBuZXduYW1lKTsKIAotCXN5bV9jaGFuZ2VfY291bnQgPSAwOworCXN5bV9zZXRfY2hhbmdlX2NvdW50KDApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NjUsMyArNzY1LDMwIEBACiAKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGludCBzeW1fY2hhbmdlX2NvdW50Oworc3RhdGljIHZvaWQgKCpjb25mX2NoYW5nZWRfY2FsbGJhY2spKHZvaWQpOworCit2b2lkIHN5bV9zZXRfY2hhbmdlX2NvdW50KGludCBjb3VudCkKK3sKKwlpbnQgX3N5bV9jaGFuZ2VfY291bnQgPSBzeW1fY2hhbmdlX2NvdW50OworCXN5bV9jaGFuZ2VfY291bnQgPSBjb3VudDsKKwlpZiAoY29uZl9jaGFuZ2VkX2NhbGxiYWNrICYmCisJICAgIChib29sKV9zeW1fY2hhbmdlX2NvdW50ICE9IChib29sKWNvdW50KQorCQljb25mX2NoYW5nZWRfY2FsbGJhY2soKTsKK30KKwordm9pZCBzeW1fYWRkX2NoYW5nZV9jb3VudChpbnQgY291bnQpCit7CisJc3ltX3NldF9jaGFuZ2VfY291bnQoY291bnQgKyBzeW1fY2hhbmdlX2NvdW50KTsKK30KKworYm9vbCBjb25mX2dldF9jaGFuZ2VkKHZvaWQpCit7CisJcmV0dXJuIHN5bV9jaGFuZ2VfY291bnQ7Cit9CisKK3ZvaWQgY29uZl9zZXRfY2hhbmdlZF9jYWxsYmFjayh2b2lkICgqZm4pKHZvaWQpKQoreworCWNvbmZfY2hhbmdlZF9jYWxsYmFjayA9IGZuOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwppbmRleCA3YjBkM2E5Li42MWQ4MTY2IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwpAQCAtMzgsOCArMzgsNiBAQAogc3RhdGljIGdib29sZWFuIHNob3dfZGVidWcgPSBGQUxTRTsKIHN0YXRpYyBnYm9vbGVhbiByZXNpemVhYmxlID0gRkFMU0U7CiAKLXN0YXRpYyBnYm9vbGVhbiBjb25maWdfY2hhbmdlZCA9IEZBTFNFOwotCiBzdGF0aWMgY2hhciBub2hlbHBfdGV4dFtdID0KICAgICBOXygiU29ycnksIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbiB5ZXQuXG4iKTsKIApAQCAtNTAsNiArNDgsOCBAQAogR3RrV2lkZ2V0ICpocGFuZWQgPSBOVUxMOwogR3RrV2lkZ2V0ICp2cGFuZWQgPSBOVUxMOwogR3RrV2lkZ2V0ICpiYWNrX2J0biA9IE5VTEw7CitHdGtXaWRnZXQgKnNhdmVfYnRuID0gTlVMTDsKK0d0a1dpZGdldCAqc2F2ZV9tZW51X2l0ZW0gPSBOVUxMOwogCiBHdGtUZXh0VGFnICp0YWcxLCAqdGFnMjsKIEdka0NvbG9yIGNvbG9yOwpAQCAtNzUsNyArNzUsNyBAQAogc3RhdGljIHZvaWQgdXBkYXRlX3RyZWUoc3RydWN0IG1lbnUgKnNyYywgR3RrVHJlZUl0ZXIgKiBkc3QpOwogc3RhdGljIHZvaWQgc2V0X25vZGUoR3RrVHJlZUl0ZXIgKiBub2RlLCBzdHJ1Y3QgbWVudSAqbWVudSwgZ2NoYXIgKiogcm93KTsKIHN0YXRpYyBnY2hhciAqKmZpbGxfcm93KHN0cnVjdCBtZW51ICptZW51KTsKLQorc3RhdGljIHZvaWQgY29uZl9jaGFuZ2VkKHZvaWQpOwogCiAvKiBIZWxwaW5nL0RlYnVnZ2luZyBGdW5jdGlvbnMgKi8KIApAQCAtMjI0LDYgKzIyNCwxMCBAQAogCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCiAJCQkJICAgICAgIHNob3dfdmFsdWUpOwogCisJc2F2ZV9idG4gPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJidXR0b24zIik7CisJc2F2ZV9tZW51X2l0ZW0gPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJzYXZlMSIpOworCWNvbmZfc2V0X2NoYW5nZWRfY2FsbGJhY2soY29uZl9jaGFuZ2VkKTsKKwogCXN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUobWFpbl93bmQpOwogCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInRvb2xiYXIxIik7CiAKQEAgLTUxMiwxNCArNTE2LDE0IEBACiAKIC8qIE1haW4gV2luZG93cyBDYWxsYmFja3MgKi8KIAotdm9pZCBvbl9zYXZlMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpOwordm9pZCBvbl9zYXZlX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSk7CiBnYm9vbGVhbiBvbl93aW5kb3cxX2RlbGV0ZV9ldmVudChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50ICogZXZlbnQsCiAJCQkJIGdwb2ludGVyIHVzZXJfZGF0YSkKIHsKIAlHdGtXaWRnZXQgKmRpYWxvZywgKmxhYmVsOwogCWdpbnQgcmVzdWx0OwogCi0JaWYgKGNvbmZpZ19jaGFuZ2VkID09IEZBTFNFKQorCWlmICghY29uZl9nZXRfY2hhbmdlZCgpKQogCQlyZXR1cm4gRkFMU0U7CiAKIAlkaWFsb2cgPSBndGtfZGlhbG9nX25ld193aXRoX2J1dHRvbnMoXygiV2FybmluZyAhIiksCkBAIC01NDMsNyArNTQ3LDcgQEAKIAlyZXN1bHQgPSBndGtfZGlhbG9nX3J1bihHVEtfRElBTE9HKGRpYWxvZykpOwogCXN3aXRjaCAocmVzdWx0KSB7CiAJY2FzZSBHVEtfUkVTUE9OU0VfWUVTOgotCQlvbl9zYXZlMV9hY3RpdmF0ZShOVUxMLCBOVUxMKTsKKwkJb25fc2F2ZV9hY3RpdmF0ZShOVUxMLCBOVUxMKTsKIAkJcmV0dXJuIEZBTFNFOwogCWNhc2UgR1RLX1JFU1BPTlNFX05POgogCQlyZXR1cm4gRkFMU0U7CkBAIC02MjEsMTIgKzYyNSwxMCBAQAogfQogCiAKLXZvaWQgb25fc2F2ZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQordm9pZCBvbl9zYXZlX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKIHsKIAlpZiAoY29uZl93cml0ZShOVUxMKSkKIAkJdGV4dF9pbnNlcnRfbXNnKF8oIkVycm9yIiksIF8oIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24gISIpKTsKLQotCWNvbmZpZ19jaGFuZ2VkID0gRkFMU0U7CiB9CiAKIApAQCAtODE5LDEyICs4MjEsNiBAQAogfQogCiAKLXZvaWQgb25fc2F2ZV9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQotewotCW9uX3NhdmUxX2FjdGl2YXRlKE5VTEwsIHVzZXJfZGF0YSk7Ci19Ci0KLQogdm9pZCBvbl9zaW5nbGVfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKIHsKIAl2aWV3X21vZGUgPSBTSU5HTEVfVklFVzsKQEAgLTg5OSw3ICs4OTUsNiBAQAogCiAJc3ltX3NldF9zdHJpbmdfdmFsdWUoc3ltLCBuZXdfZGVmKTsKIAotCWNvbmZpZ19jaGFuZ2VkID0gVFJVRTsKIAl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOwogCiAJZ3RrX3RyZWVfcGF0aF9mcmVlKHBhdGgpOwpAQCAtOTMwLDcgKzkyNSw2IEBACiAJCWlmICghc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5ld3ZhbCkpCiAJCQluZXd2YWwgPSB5ZXM7CiAJCXN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBuZXd2YWwpOwotCQljb25maWdfY2hhbmdlZCA9IFRSVUU7CiAJCWlmICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKQogCQkJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKIAkJZWxzZSBpZiAodmlld19tb2RlID09IFNQTElUX1ZJRVcpIHsKQEAgLTE2MzMsMyArMTYyNywxMCBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyB2b2lkIGNvbmZfY2hhbmdlZCh2b2lkKQoreworCWJvb2wgY2hhbmdlZCA9IGNvbmZfZ2V0X2NoYW5nZWQoKTsKKwlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUoc2F2ZV9idG4sIGNoYW5nZWQpOworCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShzYXZlX21lbnVfaXRlbSwgY2hhbmdlZCk7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUKaW5kZXggZjg3NDRlZC4uODAzMjMzZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlCisrKyBiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5nbGFkZQpAQCAtNzAsNyArNzAsNyBAQAogCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNhdmUgdGhlIGNvbmZpZyBpbiAuY29uZmlnPC9wcm9wZXJ0eT4KIAkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X1NhdmU8L3Byb3BlcnR5PgogCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+Ci0JCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3NhdmUxX2FjdGl2YXRlIi8+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3NhdmVfYWN0aXZhdGUiLz4KIAkJICAgICAgPGFjY2VsZXJhdG9yIGtleT0iUyIgbW9kaWZpZXJzPSJHREtfQ09OVFJPTF9NQVNLIiBzaWduYWw9ImFjdGl2YXRlIi8+CiAKIAkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CkBAIC0zODAsNyArMzgwLDcgQEAKIAkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KIAkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CiAJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgotCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fc2F2ZV9jbGlja2VkIi8+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9zYXZlX2FjdGl2YXRlIi8+CiAJCTwvd2lkZ2V0PgogCQk8cGFja2luZz4KIAkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGtjLmggYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKaW5kZXggMjYyODAyMy4uOWIyNzA2YSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaApAQCAtNjUsNiArNjUsOCBAQAogCiAvKiBjb25mZGF0YS5jICovCiBjaGFyICpjb25mX2dldF9kZWZhdWx0X2NvbmZuYW1lKHZvaWQpOwordm9pZCBzeW1fc2V0X2NoYW5nZV9jb3VudChpbnQgY291bnQpOwordm9pZCBzeW1fYWRkX2NoYW5nZV9jb3VudChpbnQgY291bnQpOwogCiAvKiBrY29uZmlnX2xvYWQuYyAqLwogdm9pZCBrY29uZmlnX2xvYWQodm9pZCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmggYi9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKaW5kZXggYTI2Mzc0Ni4uMTUwMzA3NyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaApAQCAtNSw2ICs1LDggQEAKIFAoY29uZl9yZWFkX3NpbXBsZSxpbnQsKGNvbnN0IGNoYXIgKm5hbWUsIGludCkpOwogUChjb25mX3dyaXRlLGludCwoY29uc3QgY2hhciAqbmFtZSkpOwogUChjb25mX3dyaXRlX2F1dG9jb25mLGludCwodm9pZCkpOworUChjb25mX2dldF9jaGFuZ2VkLGJvb2wsKHZvaWQpKTsKK1AoY29uZl9zZXRfY2hhbmdlZF9jYWxsYmFjaywgdm9pZCwodm9pZCAoKmZuKSh2b2lkKSkpOwogCiAvKiBtZW51LmMgKi8KIFAocm9vdG1lbnUsc3RydWN0IG1lbnUsKTsKQEAgLTE2LDcgKzE4LDYgQEAKIAogLyogc3ltYm9sLmMgKi8KIFAoc3ltYm9sX2hhc2gsc3RydWN0IHN5bWJvbCAqLFtTWU1CT0xfSEFTSFNJWkVdKTsKLVAoc3ltX2NoYW5nZV9jb3VudCxpbnQsKTsKIAogUChzeW1fbG9va3VwLHN0cnVjdCBzeW1ib2wgKiwoY29uc3QgY2hhciAqbmFtZSwgaW50IGlzY29uc3QpKTsKIFAoc3ltX2ZpbmQsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lKSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdXRpbC5jIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3V0aWwuYwppbmRleCBlYmM3ODFiLi5kNTQ0NDBmIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdXRpbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy91dGlsLmMKQEAgLTIyMSwxNiArMjIxLDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNvbG9yX3NldHVwKGNvbnN0IGNoYXIgKnRoZW1lKQogewotCWlmIChzZXRfdGhlbWUodGhlbWUpKSB7Ci0JCWlmIChoYXNfY29sb3JzKCkpIHsJLyogVGVybWluYWwgc3VwcG9ydHMgY29sb3I/ICovCi0JCQlzdGFydF9jb2xvcigpOwotCQkJaW5pdF9kaWFsb2dfY29sb3JzKCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKKwlpbnQgdXNlX2NvbG9yOworCisJdXNlX2NvbG9yID0gc2V0X3RoZW1lKHRoZW1lKTsKKwlpZiAodXNlX2NvbG9yICYmIGhhc19jb2xvcnMoKSkgeworCQlzdGFydF9jb2xvcigpOworCQlpbml0X2RpYWxvZ19jb2xvcnMoKTsKKwl9IGVsc2UKIAkJc2V0X21vbm9fdGhlbWUoKTsKLQl9CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCmluZGV4IDA4YTRjN2EuLjNmOWExMzIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCkBAIC04OTAsMTQgKzg5MCwxOSBAQAogCWRvIHsKIAkJY29uZigmcm9vdG1lbnUpOwogCQlkaWFsb2dfY2xlYXIoKTsKLQkJcmVzID0gZGlhbG9nX3llc25vKE5VTEwsCi0JCQkJICAgXygiRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyICIKLQkJCQkgICAgICJuZXcga2VybmVsIGNvbmZpZ3VyYXRpb24/XG4iCi0JCQkJICAgICAiPEVTQz48RVNDPiB0byBjb250aW51ZS4iKSwKLQkJCQkgICA2LCA2MCk7CisJCWlmIChjb25mX2dldF9jaGFuZ2VkKCkpCisJCQlyZXMgPSBkaWFsb2dfeWVzbm8oTlVMTCwKKwkJCQkJICAgXygiRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyICIKKwkJCQkJICAgICAibmV3IGtlcm5lbCBjb25maWd1cmF0aW9uP1xuIgorCQkJCQkgICAgICI8RVNDPjxFU0M+IHRvIGNvbnRpbnVlLiIpLAorCQkJCQkgICA2LCA2MCk7CisJCWVsc2UKKwkJCXJlcyA9IC0xOwogCX0gd2hpbGUgKHJlcyA9PSBLRVlfRVNDKTsKIAllbmRfZGlhbG9nKCk7Ci0JaWYgKHJlcyA9PSAwKSB7CisKKwlzd2l0Y2ggKHJlcykgeworCWNhc2UgMDoKIAkJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKIAkJCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgogCQkJCSJFcnJvciBkdXJpbmcgd3JpdGluZyBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uXG4iCkBAIC05MDUsMTEgKzkxMCwxMyBAQAogCQkJCSJcblxuIikpOwogCQkJcmV0dXJuIDE7CiAJCX0KKwljYXNlIC0xOgogCQlwcmludGYoXygiXG5cbiIKIAkJCSIqKiogRW5kIG9mIExpbnV4IGtlcm5lbCBjb25maWd1cmF0aW9uLlxuIgogCQkJIioqKiBFeGVjdXRlICdtYWtlJyB0byBidWlsZCB0aGUga2VybmVsIG9yIHRyeSAnbWFrZSBoZWxwJy4iCiAJCQkiXG5cbiIpKTsKLQl9IGVsc2UgeworCQlicmVhazsKKwlkZWZhdWx0OgogCQlmcHJpbnRmKHN0ZGVyciwgXygiXG5cbiIKIAkJCSJZb3VyIGtlcm5lbCBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2VyZSBOT1Qgc2F2ZWQuIgogCQkJIlxuXG4iKSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKaW5kZXggMzkzZjM3NC4uMGIyZmNjNCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCisrKyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpAQCAtMzgsNiArMzgsOCBAQAogc3RhdGljIFFBcHBsaWNhdGlvbiAqY29uZmlnQXBwOwogc3RhdGljIENvbmZpZ1NldHRpbmdzICpjb25maWdTZXR0aW5nczsKIAorUUFjdGlvbiAqQ29uZmlnTWFpbldpbmRvdzo6c2F2ZUFjdGlvbjsKKwogc3RhdGljIGlubGluZSBRU3RyaW5nIHFnZXR0ZXh0KGNvbnN0IGNoYXIqIHN0cikKIHsKIAlyZXR1cm4gUVN0cmluZzo6ZnJvbUxvY2FsOEJpdChnZXR0ZXh0KHN0cikpOwpAQCAtNzk4LDcgKzgwMCw3IEBACiAJCQlRQWN0aW9uICphY3Rpb247CiAKIAkJCWhlYWRlclBvcHVwID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7Ci0JCQlhY3Rpb24gPSBuZXcgUUFjdGlvbigiU2hvdyBOYW1lIiwgMCwgdGhpcyk7CisJCQlhY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBOYW1lIiwgMCwgdGhpcyk7CiAJCQkgIGFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOwogCQkJICBjb25uZWN0KGFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLAogCQkJCSAgcGFyZW50KCksIFNMT1Qoc2V0U2hvd05hbWUoYm9vbCkpKTsKQEAgLTgwNiw3ICs4MDgsNyBAQAogCQkJCSAgYWN0aW9uLCBTTE9UKHNldE9uKGJvb2wpKSk7CiAJCQkgIGFjdGlvbi0+c2V0T24oc2hvd05hbWUpOwogCQkJICBhY3Rpb24tPmFkZFRvKGhlYWRlclBvcHVwKTsKLQkJCWFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaG93IFJhbmdlIiwgMCwgdGhpcyk7CisJCQlhY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBSYW5nZSIsIDAsIHRoaXMpOwogCQkJICBhY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKIAkJCSAgY29ubmVjdChhY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwKIAkJCQkgIHBhcmVudCgpLCBTTE9UKHNldFNob3dSYW5nZShib29sKSkpOwpAQCAtODE0LDcgKzgxNiw3IEBACiAJCQkJICBhY3Rpb24sIFNMT1Qoc2V0T24oYm9vbCkpKTsKIAkJCSAgYWN0aW9uLT5zZXRPbihzaG93UmFuZ2UpOwogCQkJICBhY3Rpb24tPmFkZFRvKGhlYWRlclBvcHVwKTsKLQkJCWFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaG93IERhdGEiLCAwLCB0aGlzKTsKKwkJCWFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IERhdGEiLCAwLCB0aGlzKTsKIAkJCSAgYWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CiAJCQkgIGNvbm5lY3QoYWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksCiAJCQkJICBwYXJlbnQoKSwgU0xPVChzZXRTaG93RGF0YShib29sKSkpOwpAQCAtMTE2MSw3ICsxMTYzLDcgQEAKIFFQb3B1cE1lbnUqIENvbmZpZ0luZm9WaWV3OjpjcmVhdGVQb3B1cE1lbnUoY29uc3QgUVBvaW50JiBwb3MpCiB7CiAJUVBvcHVwTWVudSogcG9wdXAgPSBQYXJlbnQ6OmNyZWF0ZVBvcHVwTWVudShwb3MpOwotCVFBY3Rpb24qIGFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaG93IERlYnVnIEluZm8iLCAwLCBwb3B1cCk7CisJUUFjdGlvbiogYWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwiU2hvdyBEZWJ1ZyBJbmZvIiwgMCwgcG9wdXApOwogCSAgYWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CiAJICBjb25uZWN0KGFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dEZWJ1Zyhib29sKSkpOwogCSAgY29ubmVjdCh0aGlzLCBTSUdOQUwoc2hvd0RlYnVnQ2hhbmdlZChib29sKSksIGFjdGlvbiwgU0xPVChzZXRPbihib29sKSkpOwpAQCAtMTI1OSw2ICsxMjYxLDcgQEAKICAqIENvbnN0cnVjdCB0aGUgY29tcGxldGUgY29uZmlnIHdpZGdldAogICovCiBDb25maWdNYWluV2luZG93OjpDb25maWdNYWluV2luZG93KHZvaWQpCisJOiBzZWFyY2hXaW5kb3coMCkKIHsKIAlRTWVudUJhciogbWVudTsKIAlib29sIG9rOwpAQCAtMTMwNSw4ICsxMzA4LDExIEBACiAJICBjb25uZWN0KHF1aXRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QoY2xvc2UoKSkpOwogCVFBY3Rpb24gKmxvYWRBY3Rpb24gPSBuZXcgUUFjdGlvbigiTG9hZCIsIFFQaXhtYXAoeHBtX2xvYWQpLCAiJkxvYWQiLCBDVFJMK0tleV9MLCB0aGlzKTsKIAkgIGNvbm5lY3QobG9hZEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChsb2FkQ29uZmlnKCkpKTsKLQlRQWN0aW9uICpzYXZlQWN0aW9uID0gbmV3IFFBY3Rpb24oIlNhdmUiLCBRUGl4bWFwKHhwbV9zYXZlKSwgIiZTYXZlIiwgQ1RSTCtLZXlfUywgdGhpcyk7CisJc2F2ZUFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTYXZlIiwgUVBpeG1hcCh4cG1fc2F2ZSksICImU2F2ZSIsIENUUkwrS2V5X1MsIHRoaXMpOwogCSAgY29ubmVjdChzYXZlQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNhdmVDb25maWcoKSkpOworCWNvbmZfc2V0X2NoYW5nZWRfY2FsbGJhY2soY29uZl9jaGFuZ2VkKTsKKwkvLyBTZXQgc2F2ZUFjdGlvbidzIGluaXRpYWwgc3RhdGUKKwljb25mX2NoYW5nZWQoKTsKIAlRQWN0aW9uICpzYXZlQXNBY3Rpb24gPSBuZXcgUUFjdGlvbigiU2F2ZSBBcy4uLiIsICJTYXZlICZBcy4uLiIsIDAsIHRoaXMpOwogCSAgY29ubmVjdChzYXZlQXNBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2F2ZUNvbmZpZ0FzKCkpKTsKIAlRQWN0aW9uICpzZWFyY2hBY3Rpb24gPSBuZXcgUUFjdGlvbigiU2VhcmNoIiwgIiZTZWFyY2giLCBDVFJMK0tleV9GLCB0aGlzKTsKQEAgLTE1ODQsNyArMTU5MCw3IEBACiAgKi8KIHZvaWQgQ29uZmlnTWFpbldpbmRvdzo6Y2xvc2VFdmVudChRQ2xvc2VFdmVudCogZSkKIHsKLQlpZiAoIXN5bV9jaGFuZ2VfY291bnQpIHsKKwlpZiAoIWNvbmZfZ2V0X2NoYW5nZWQoKSkgewogCQllLT5hY2NlcHQoKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2NTcsNiArMTY2MywxMiBAQAogCWNvbmZpZ1NldHRpbmdzLT53cml0ZVNpemVzKCIvc3BsaXQyIiwgc3BsaXQyLT5zaXplcygpKTsKIH0KIAordm9pZCBDb25maWdNYWluV2luZG93Ojpjb25mX2NoYW5nZWQodm9pZCkKK3sKKwlpZiAoc2F2ZUFjdGlvbikKKwkJc2F2ZUFjdGlvbi0+c2V0RW5hYmxlZChjb25mX2dldF9jaGFuZ2VkKCkpOworfQorCiB2b2lkIGZpeHVwX3Jvb3RtZW51KHN0cnVjdCBtZW51ICptZW51KQogewogCXN0cnVjdCBtZW51ICpjaGlsZDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKaW5kZXggNmE5ZTNiMS4uNmZjMWM1ZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKQEAgLTI5Nyw2ICsyOTcsOSBAQAogCiBjbGFzcyBDb25maWdNYWluV2luZG93IDogcHVibGljIFFNYWluV2luZG93IHsKIAlRX09CSkVDVAorCisJc3RhdGljIFFBY3Rpb24gKnNhdmVBY3Rpb247CisJc3RhdGljIHZvaWQgY29uZl9jaGFuZ2VkKHZvaWQpOwogcHVibGljOgogCUNvbmZpZ01haW5XaW5kb3codm9pZCk7CiBwdWJsaWMgc2xvdHM6CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKaW5kZXggZWUyMjVjZS4uOGYwNmM0NyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtMzAsNyArMzAsNiBAQAogCS5mbGFncyA9IFNZTUJPTF9WQUxJRCwKIH07CiAKLWludCBzeW1fY2hhbmdlX2NvdW50Owogc3RydWN0IHN5bWJvbCAqc3ltX2RlZmNvbmZpZ19saXN0Owogc3RydWN0IHN5bWJvbCAqbW9kdWxlc19zeW07CiB0cmlzdGF0ZSBtb2R1bGVzX3ZhbDsKQEAgLTM3OSw3ICszNzgsNyBAQAogCiAJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkKIAkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1ZBTElEOwotCXN5bV9jaGFuZ2VfY291bnQrKzsKKwlzeW1fYWRkX2NoYW5nZV9jb3VudCgxKTsKIAlpZiAobW9kdWxlc19zeW0pCiAJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKaW5kZXggMmZiMGE0Zi4uZDc3N2ZlOCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKQEAgLTIxMzUsNyArMjEzNSw3IEBACiAJCXN5bV9jaGVja19kZXBzKHN5bSk7CiAgICAgICAgIH0KIAotCXN5bV9jaGFuZ2VfY291bnQgPSAxOworCXN5bV9zZXRfY2hhbmdlX2NvdW50KDEpOwogfQogCiBjb25zdCBjaGFyICp6Y29uZl90b2tlbm5hbWUoaW50IHRva2VuKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQppbmRleCBhYjQ0ZmViLi4wNGE1ODY0IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYueQorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQpAQCAtNTA0LDcgKzUwNCw3IEBACiAJCXN5bV9jaGVja19kZXBzKHN5bSk7CiAgICAgICAgIH0KIAotCXN5bV9jaGFuZ2VfY291bnQgPSAxOworCXN5bV9zZXRfY2hhbmdlX2NvdW50KDEpOwogfQogCiBjb25zdCBjaGFyICp6Y29uZl90b2tlbm5hbWUoaW50IHRva2VuKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rZXJuZWwtZG9jIGIvc2NyaXB0cy9rZXJuZWwtZG9jCmluZGV4IDE4N2Y1ZGUuLmRmM2IyNzIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMva2VybmVsLWRvYworKysgYi9zY3JpcHRzL2tlcm5lbC1kb2MKQEAgLTE0MzAsNyArMTQzMCw3IEBACiAJICAgICMgY29ycmVzcG9uZGluZyBkYXRhIHN0cnVjdHVyZXMgImNvcnJlY3RseSIuIENhdGNoIGl0IGxhdGVyIGluCiAJICAgICMgb3V0cHV0Xyogc3Vicy4KIAkgICAgcHVzaF9wYXJhbWV0ZXIoJGFyZywgIiIsICRmaWxlKTsKLQl9IGVsc2lmICgkYXJnID1+IG0vXCgvKSB7CisJfSBlbHNpZiAoJGFyZyA9fiBtL1woLipcKi8pIHsKIAkgICAgIyBwb2ludGVyLXRvLWZ1bmN0aW9uCiAJICAgICRhcmcgPX4gdHIvIy8sLzsKIAkgICAgJGFyZyA9fiBtL1teXChdK1woXCooW15cKV0rKVwpLzsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCA0MTI3Nzk2Li4xNWFiNWQwIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC05MTEsNiArOTExLDcgQEAKIAkJIi50b2MxIiwgIC8qIHVzZWQgYnkgcHBjNjQgKi8KIAkJIi5zdGFiIiwKIAkJIi5yb2RhdGEiLAorCQkiLnBhcmFpbnN0cnVjdGlvbnMiLAogCQkiLnRleHQubG9jayIsCiAJCSJfX2J1Z190YWJsZSIsIC8qIHVzZWQgYnkgcG93ZXJwYyBmb3IgQlVHKCkgKi8KIAkJIi5wY2lfZml4dXBfaGVhZGVyIiwKQEAgLTkyMSw2ICs5MjIsOCBAQAogCQkiLmZpeHVwIiwKIAkJIi5zbXBfbG9ja3MiLAogCQkiLnBsdCIsICAvKiBzZWVuIG9uIEFSQ0g9dW0gYnVpbGQgb24geDg2XzY0LiBIYXJtbGVzcyAqLworCQkiX19mdHJfZml4dXAiLAkJLyogcG93ZXJwYyBjcHUgZmVhdHVyZSBmaXh1cCAqLworCQkiX19md19mdHJfZml4dXAiLAkvKiBwb3dlcnBjIGZpcm13YXJlIGZlYXR1cmUgZml4dXAgKi8KIAkJTlVMTAogCX07CiAJLyogU3RhcnQgb2Ygc2VjdGlvbiBuYW1lcyAqLwpAQCAtOTI5LDYgKzkzMiw3IEBACiAJCSIuYWx0aW5zdHJ1Y3Rpb25zIiwKIAkJIi5laF9mcmFtZSIsCiAJCSIuZGVidWciLAorCQkiLnBhcmFpbnN0cnVjdGlvbnMiLAogCQlOVUxMCiAJfTsKIAkvKiBwYXJ0IG9mIHNlY3Rpb24gbmFtZSAqLwpAQCAtOTkzLDYgKzk5Nyw3IEBACiAJCSJfX2J1Z190YWJsZSIsIC8qIHVzZWQgYnkgcG93ZXJwYyBmb3IgQlVHKCkgKi8KIAkJIi5leGl0Y2FsbC5leGl0IiwKIAkJIi5laF9mcmFtZSIsCisJCSIucGFyYWluc3RydWN0aW9ucyIsCiAJCSIuc3RhYiIsCiAJCSJfX2V4X3RhYmxlIiwKIAkJIi5maXh1cCIsCmRpZmYgLS1naXQgYS9zY3JpcHRzL3Zlcl9saW51eCBiL3NjcmlwdHMvdmVyX2xpbnV4CmluZGV4IDg0OTk5ZjYuLjcyODc2ZGYgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdmVyX2xpbnV4CisrKyBiL3NjcmlwdHMvdmVyX2xpbnV4CkBAIC00OCw2ICs0OCw4IEBACiB4ZnNfZGIgLVYgMj4mMSB8IGdyZXAgdmVyc2lvbiB8IGF3ayBcCiAnTlI9PTF7cHJpbnQgInhmc3Byb2dzICAgICAgICAgICAgICAiLCAkM30nCiAKK3BjY2FyZGN0bCAtViAyPiYxfCBncmVwIHBjbWNpYXV0aWxzIHwgYXdrICd7cHJpbnQgInBjbWNpYXV0aWxzICAgICAgICAgICAiLCAkMn0nCisKIGNhcmRtZ3IgLVYgMj4mMXwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKICdOUj09MXtwcmludCAicGNtY2lhLWNzICAgICAgICAgICAgICIsICQzfScKIApAQCAtODcsMTAgKzg5LDE2IEBACiBsb2Fka2V5cyAtViAyPiYxIHwgYXdrIFwKICcoTlI9PTEgJiYgKCQyIH4gL2NvbnNvbGUtdG9vbHMvKSkge3ByaW50ICJDb25zb2xlLXRvb2xzICAgICAgICAgIiwgJDN9JwogCitvcHJvZmlsZWQgLS12ZXJzaW9uIDI+JjEgfCBhd2sgXAorJyhOUj09MSAmJiAoJDIgPT0gIm9wcm9maWxlIikpIHtwcmludCAib3Byb2ZpbGUgICAgICAgICAgICAgICIsICQzfScKKwogZXhwciAtLXYgMj4mMSB8IGF3ayAnTlI9PTF7cHJpbnQgIlNoLXV0aWxzICAgICAgICAgICAgICAiLCAkTkZ9JwogCiB1ZGV2aW5mbyAtViAyPiYxIHwgZ3JlcCB2ZXJzaW9uIHwgYXdrICd7cHJpbnQgInVkZXYgICAgICAgICAgICAgICAgICAiLCAkM30nCiAKK2l3Y29uZmlnIC0tdmVyc2lvbiAyPiYxIHwgYXdrIFwKKycoTlI9PTEgJiYgKCQzID09ICJ2ZXJzaW9uIikpIHtwcmludCAid2lyZWxlc3MtdG9vbHMgICAgICAgICIsJDR9JworCiBpZiBbIC1lIC9wcm9jL21vZHVsZXMgXTsgdGhlbgogICAgIFg9YGNhdCAvcHJvYy9tb2R1bGVzIHwgc2VkIC1lICJzLyAuKiQvLyJgCiAgICAgZWNobyAiTW9kdWxlcyBMb2FkZWQgICAgICAgICAiJFgKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2R1bW15LmMgYi9zZWN1cml0eS9kdW1teS5jCmluZGV4IDQzODc0YzEuLjU1ODc5NWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2R1bW15LmMKKysrIGIvc2VjdXJpdHkvZHVtbXkuYwpAQCAtODI4LDYgKzgyOCwxMSBAQAogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfaW5ldF9jb25uX2VzdGFibGlzaGVkKHN0cnVjdCBzb2NrICpzaywKKwkJCXN0cnVjdCBza19idWZmICpza2IpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9yZXFfY2xhc3NpZnlfZmxvdyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCiAJCQlzdHJ1Y3QgZmxvd2kgKmZsKQogewpAQCAtODM2LDcgKzg0MSw3IEBACiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCiBzdGF0aWMgaW50IGR1bW15X3hmcm1fcG9saWN5X2FsbG9jX3NlY3VyaXR5KHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsCi0JCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgc3RydWN0IHNvY2sgKnNrKQorCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC04NTYsNyArODYxLDcgQEAKIH0KIAogc3RhdGljIGludCBkdW1teV94ZnJtX3N0YXRlX2FsbG9jX3NlY3VyaXR5KHN0cnVjdCB4ZnJtX3N0YXRlICp4LAotCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sLCB1MzIgc2VjaWQpCisJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICpzZWNfY3R4LCB1MzIgc2VjaWQpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC04ODEsMTIgKzg4Niw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgZHVtbXlfeGZybV9mbG93X3N0YXRlX21hdGNoKHN0cnVjdCBmbG93aSAqZmwsIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtLAotCQkJCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHApCi17Ci0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgZHVtbXlfeGZybV9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKmZsLCBpbnQgY2thbGwpCiB7CiAJcmV0dXJuIDA7CkBAIC0xMTA4LDYgKzExMDcsNyBAQAogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgc29ja19ncmFmdCk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbmV0X2Nvbm5fcmVxdWVzdCk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbmV0X2Nza19jbG9uZSk7CisJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCBpbmV0X2Nvbm5fZXN0YWJsaXNoZWQpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgcmVxX2NsYXNzaWZ5X2Zsb3cpOwogICNlbmRpZgkvKiBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyAqLwogI2lmZGVmICBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCkBAIC0xMTIwLDcgKzExMjAsNiBAQAogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgeGZybV9zdGF0ZV9kZWxldGVfc2VjdXJpdHkpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgeGZybV9wb2xpY3lfbG9va3VwKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHhmcm1fc3RhdGVfcG9sX2Zsb3dfbWF0Y2gpOwotCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgeGZybV9mbG93X3N0YXRlX21hdGNoKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHhmcm1fZGVjb2RlX3Nlc3Npb24pOwogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0gKi8KICNpZmRlZiBDT05GSUdfS0VZUwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXkuYyBiL3NlY3VyaXR5L2tleXMva2V5LmMKaW5kZXggODBkZThjMy4uYWM5MzI2YyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9rZXkuYworKysgYi9zZWN1cml0eS9rZXlzL2tleS5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotc3RhdGljIGttZW1fY2FjaGVfdAkqa2V5X2phcjsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZQkqa2V5X2phcjsKIHN0cnVjdCByYl9yb290CQlrZXlfc2VyaWFsX3RyZWU7IC8qIHRyZWUgb2Yga2V5cyBpbmRleGVkIGJ5IHNlcmlhbCAqLwogREVGSU5FX1NQSU5MT0NLKGtleV9zZXJpYWxfbG9jayk7CiAKQEAgLTMwLDggKzMwLDggQEAKIHN0YXRpYyBMSVNUX0hFQUQoa2V5X3R5cGVzX2xpc3QpOwogc3RhdGljIERFQ0xBUkVfUldTRU0oa2V5X3R5cGVzX3NlbSk7CiAKLXN0YXRpYyB2b2lkIGtleV9jbGVhbnVwKHZvaWQgKmRhdGEpOwotc3RhdGljIERFQ0xBUkVfV09SSyhrZXlfY2xlYW51cF90YXNrLCBrZXlfY2xlYW51cCwgTlVMTCk7CitzdGF0aWMgdm9pZCBrZXlfY2xlYW51cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIERFQ0xBUkVfV09SSyhrZXlfY2xlYW51cF90YXNrLCBrZXlfY2xlYW51cCk7CiAKIC8qIHdlIHNlcmlhbGlzZSBrZXkgaW5zdGFudGlhdGlvbiBhbmQgbGluayAqLwogREVDTEFSRV9SV1NFTShrZXlfY29uc3RydWN0aW9uX3NlbSk7CkBAIC0yODUsMTYgKzI4NSwxNCBAQAogCX0KIAogCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHRoZSBrZXkgYW5kIGl0cyBkZXNjcmlwdGlvbiAqLwotCWtleSA9IGttZW1fY2FjaGVfYWxsb2Moa2V5X2phciwgU0xBQl9LRVJORUwpOworCWtleSA9IGttZW1fY2FjaGVfYWxsb2Moa2V5X2phciwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFrZXkpCiAJCWdvdG8gbm9fbWVtb3J5XzI7CiAKIAlpZiAoZGVzYykgewotCQlrZXktPmRlc2NyaXB0aW9uID0ga21hbGxvYyhkZXNjbGVuLCBHRlBfS0VSTkVMKTsKKwkJa2V5LT5kZXNjcmlwdGlvbiA9IGttZW1kdXAoZGVzYywgZGVzY2xlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICgha2V5LT5kZXNjcmlwdGlvbikKIAkJCWdvdG8gbm9fbWVtb3J5XzM7Ci0KLQkJbWVtY3B5KGtleS0+ZGVzY3JpcHRpb24sIGRlc2MsIGRlc2NsZW4pOwogCX0KIAogCWF0b21pY19zZXQoJmtleS0+dXNhZ2UsIDEpOwpAQCAtNTUyLDcgKzU1MCw3IEBACiAgKiBkbyBjbGVhbmluZyB1cCBpbiBwcm9jZXNzIGNvbnRleHQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRpc2FibGUKICAqIGludGVycnVwdHMgYWxsIG92ZXIgdGhlIHBsYWNlCiAgKi8KLXN0YXRpYyB2b2lkIGtleV9jbGVhbnVwKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBrZXlfY2xlYW51cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHJiX25vZGUgKl9uOwogCXN0cnVjdCBrZXkgKmtleTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5cmluZy5jIGIvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKaW5kZXggZThkMDJhYy4uYWQ0NWNlNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKQEAgLTcwNiwxMiArNzA2LDEwIEBACiAJCQkJQlVHX09OKHNpemUgPiBQQUdFX1NJWkUpOwogCiAJCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlua2xpc3QgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQkJCW5rbGlzdCA9IGttZW1kdXAoa2xpc3QsIHNpemUsIEdGUF9LRVJORUwpOwogCQkJCWlmICghbmtsaXN0KQogCQkJCQlnb3RvIGVycm9yMjsKIAotCQkJCW1lbWNweShua2xpc3QsIGtsaXN0LCBzaXplKTsKLQogCQkJCS8qIHJlcGxhY2UgbWF0Y2hlZCBrZXkgKi8KIAkJCQlhdG9taWNfaW5jKCZrZXktPnVzYWdlKTsKIAkJCQlua2xpc3QtPmtleXNbbG9vcF0gPSBrZXk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jIGIvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYwppbmRleCAzMjE1MGNmLi5iNmY4NjgwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jCisrKyBiL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMKQEAgLTI3LDcgKzI3LDcgQEAKIHN0cnVjdCBrZXlfdXNlciByb290X2tleV91c2VyID0gewogCS51c2FnZQkJPSBBVE9NSUNfSU5JVCgzKSwKIAkuY29uc3EJCT0gTElTVF9IRUFEX0lOSVQocm9vdF9rZXlfdXNlci5jb25zcSksCi0JLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHJvb3Rfa2V5X3VzZXIubG9jayksCiAJLm5rZXlzCQk9IEFUT01JQ19JTklUKDIpLAogCS5uaWtleXMJCT0gQVRPTUlDX0lOSVQoMiksCiAJLnVpZAkJPSAwLApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggYTMwMDcwMi4uZTdjMGI1ZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC0zMiwxMiArMzIsNyBAQAogI2luY2x1ZGUgImF2Yy5oIgogI2luY2x1ZGUgImF2Y19zcy5oIgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF2X3Blcm1fdG9fc3RyaW5nCi17Ci0gIHUxNiB0Y2xhc3M7Ci0gIHUzMiB2YWx1ZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX0gYXZfcGVybV90b19zdHJpbmdbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXZfcGVybV90b19zdHJpbmcgYXZfcGVybV90b19zdHJpbmdbXSA9IHsKICNkZWZpbmUgU18oYywgdiwgcykgeyBjLCB2LCBzIH0sCiAjaW5jbHVkZSAiYXZfcGVybV90b19zdHJpbmcuaCIKICN1bmRlZiBTXwpAQCAtNTcsMTcgKzUyLDIxIEBACiAjdW5kZWYgVEVfCiAjdW5kZWYgU18KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdl9pbmhlcml0Ci17Ci0gICAgdTE2IHRjbGFzczsKLSAgICBjb25zdCBjaGFyICoqY29tbW9uX3B0czsKLSAgICB1MzIgY29tbW9uX2Jhc2U7Ci19IGF2X2luaGVyaXRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXZfaW5oZXJpdCBhdl9pbmhlcml0W10gPSB7CiAjZGVmaW5lIFNfKGMsIGksIGIpIHsgYywgY29tbW9uXyMjaSMjX3Blcm1fdG9fc3RyaW5nLCBiIH0sCiAjaW5jbHVkZSAiYXZfaW5oZXJpdC5oIgogI3VuZGVmIFNfCiB9OwogCitjb25zdCBzdHJ1Y3Qgc2VsaW51eF9jbGFzc19wZXJtIHNlbGludXhfY2xhc3NfcGVybSA9IHsKKwlhdl9wZXJtX3RvX3N0cmluZywKKwlBUlJBWV9TSVpFKGF2X3Blcm1fdG9fc3RyaW5nKSwKKwljbGFzc190b19zdHJpbmcsCisJQVJSQVlfU0laRShjbGFzc190b19zdHJpbmcpLAorCWF2X2luaGVyaXQsCisJQVJSQVlfU0laRShhdl9pbmhlcml0KQorfTsKKwogI2RlZmluZSBBVkNfQ0FDSEVfU0xPVFMJCQk1MTIKICNkZWZpbmUgQVZDX0RFRl9DQUNIRV9USFJFU0hPTEQJCTUxMgogI2RlZmluZSBBVkNfQ0FDSEVfUkVDTEFJTQkJMTYKQEAgLTEyNSw3ICsxMjQsNyBAQAogCiBzdGF0aWMgc3RydWN0IGF2Y19jYWNoZSBhdmNfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGF2Y19jYWxsYmFja19ub2RlICphdmNfY2FsbGJhY2tzOwotc3RhdGljIGttZW1fY2FjaGVfdCAqYXZjX25vZGVfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICphdmNfbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGF2Y19oYXNoKHUzMiBzc2lkLCB1MzIgdHNpZCwgdTE2IHRjbGFzcykKIHsKQEAgLTMzMyw3ICszMzIsNyBAQAogewogCXN0cnVjdCBhdmNfbm9kZSAqbm9kZTsKIAotCW5vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGF2Y19ub2RlX2NhY2hlcCwgU0xBQl9BVE9NSUMpOworCW5vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGF2Y19ub2RlX2NhY2hlcCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFub2RlKQogCQlnb3RvIG91dDsKIApAQCAtNDk3LDcgKzQ5Niw3IEBACiAJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9JWQiLCBuYW1lMiwgbnRvaHMocG9ydCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXZjX3ByaW50X2lwdjRfYWRkcihzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwgdTMyIGFkZHIsCitzdGF0aWMgaW5saW5lIHZvaWQgYXZjX3ByaW50X2lwdjRfYWRkcihzdHJ1Y3QgYXVkaXRfYnVmZmVyICphYiwgX19iZTMyIGFkZHIsCiAJCQkJICAgICAgIF9fYmUxNiBwb3J0LCBjaGFyICpuYW1lMSwgY2hhciAqbmFtZTIpCiB7CiAJaWYgKGFkZHIpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggZTk5NjlhMi4uNjVmYjVlOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2NwLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KICNpbmNsdWRlIDxsaW51eC91bi5oPgkJLyogZm9yIFVuaXggc29ja2V0IHR5cGVzICovCiAjaW5jbHVkZSA8bmV0L2FmX3VuaXguaD4JLyogZm9yIFVuaXggc29ja2V0IHR5cGVzICovCkBAIC0xMjMsNyArMTI0LDcgQEAKIHN0YXRpYyBMSVNUX0hFQUQoc3VwZXJibG9ja19zZWN1cml0eV9oZWFkKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2Jfc2VjdXJpdHlfbG9jayk7CiAKLXN0YXRpYyBrbWVtX2NhY2hlX3QgKnNlbF9pbm9kZV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc2VsX2lub2RlX2NhY2hlOwogCiAvKiBSZXR1cm4gc2VjdXJpdHkgY29udGV4dCBmb3IgYSBnaXZlbiBzaWQgb3IganVzdCB0aGUgY29udGV4dCAKICAgIGxlbmd0aCBpZiB0aGUgYnVmZmVyIGlzIG51bGwgb3IgbGVuZ3RoIGlzIDAgKi8KQEAgLTE4MCw3ICsxODEsNyBAQAogCXN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYyA9IGN1cnJlbnQtPnNlY3VyaXR5OwogCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmlzZWM7CiAKLQlpc2VjID0ga21lbV9jYWNoZV9hbGxvYyhzZWxfaW5vZGVfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwlpc2VjID0ga21lbV9jYWNoZV9hbGxvYyhzZWxfaW5vZGVfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghaXNlYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTc1MSw2ICs3NTIsOCBAQAogCQkJCXJldHVybiBTRUNDTEFTU19VRFBfU09DS0VUOwogCQkJZWxzZQogCQkJCXJldHVybiBTRUNDTEFTU19SQVdJUF9TT0NLRVQ7CisJCWNhc2UgU09DS19EQ0NQOgorCQkJcmV0dXJuIFNFQ0NMQVNTX0RDQ1BfU09DS0VUOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIFNFQ0NMQVNTX1JBV0lQX1NPQ0tFVDsKIAkJfQpAQCAtMTExNyw4ICsxMTIwLDggQEAKIHsKIAlzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSB0c2stPnNlY3VyaXR5OwogCXN0cnVjdCBmaWxlX3NlY3VyaXR5X3N0cnVjdCAqZnNlYyA9IGZpbGUtPmZfc2VjdXJpdHk7Ci0Jc3RydWN0IHZmc21vdW50ICptbnQgPSBmaWxlLT5mX3Zmc21udDsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGZpbGUtPmZfcGF0aC5tbnQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSBhZDsKIAlpbnQgcmM7CkBAIC0xNTc4LDcgKzE1ODEsNyBAQAogc3RhdGljIGludCBzZWxpbnV4X2Jwcm1fc2V0X3NlY3VyaXR5KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiB7CiAJc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBicHJtLT5maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gYnBybS0+ZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjOwogCXN0cnVjdCBicHJtX3NlY3VyaXR5X3N0cnVjdCAqYnNlYzsKIAl1MzIgbmV3c2lkOwpAQCAtMTYxOCwxMCArMTYyMSwxMCBAQAogCX0KIAogCUFWQ19BVURJVF9EQVRBX0lOSVQoJmFkLCBGUyk7Ci0JYWQudS5mcy5tbnQgPSBicHJtLT5maWxlLT5mX3Zmc21udDsKLQlhZC51LmZzLmRlbnRyeSA9IGJwcm0tPmZpbGUtPmZfZGVudHJ5OworCWFkLnUuZnMubW50ID0gYnBybS0+ZmlsZS0+Zl9wYXRoLm1udDsKKwlhZC51LmZzLmRlbnRyeSA9IGJwcm0tPmZpbGUtPmZfcGF0aC5kZW50cnk7CiAKLQlpZiAoYnBybS0+ZmlsZS0+Zl92ZnNtbnQtPm1udF9mbGFncyAmIE1OVF9OT1NVSUQpCisJaWYgKGJwcm0tPmZpbGUtPmZfcGF0aC5tbnQtPm1udF9mbGFncyAmIE1OVF9OT1NVSUQpCiAJCW5ld3NpZCA9IHRzZWMtPnNpZDsKIAogICAgICAgICBpZiAodHNlYy0+c2lkID09IG5ld3NpZCkgewpAQCAtMTY5Miw5ICsxNjk1LDEwIEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCWxvbmcgaiA9IC0xOworCWludCBkcm9wX3R0eSA9IDA7CiAKIAltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwotCXR0eSA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5OworCXR0eSA9IGdldF9jdXJyZW50X3R0eSgpOwogCWlmICh0dHkpIHsKIAkJZmlsZV9saXN0X2xvY2soKTsKIAkJZmlsZSA9IGxpc3RfZW50cnkodHR5LT50dHlfZmlsZXMubmV4dCwgdHlwZW9mKCpmaWxlKSwgZl91LmZ1X2xpc3QpOwpAQCAtMTcwNCwxNSArMTcwOCwxNyBAQAogCQkJICAgdGhhbiB1c2luZyBmaWxlX2hhc19wZXJtLCBhcyB0aGlzIHBhcnRpY3VsYXIgb3BlbgogCQkJICAgZmlsZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgcHJvY2VzcyBhbmQgd2UgYXJlIG9ubHkKIAkJCSAgIGludGVyZXN0ZWQgaW4gdGhlIGlub2RlLWJhc2VkIGNoZWNrIGhlcmUuICovCi0JCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAkJCWlmIChpbm9kZV9oYXNfcGVybShjdXJyZW50LCBpbm9kZSwKIAkJCQkJICAgRklMRV9fUkVBRCB8IEZJTEVfX1dSSVRFLCBOVUxMKSkgewotCQkJCS8qIFJlc2V0IGNvbnRyb2xsaW5nIHR0eS4gKi8KLQkJCQljdXJyZW50LT5zaWduYWwtPnR0eSA9IE5VTEw7Ci0JCQkJY3VycmVudC0+c2lnbmFsLT50dHlfb2xkX3BncnAgPSAwOworCQkJCWRyb3BfdHR5ID0gMTsKIAkJCX0KIAkJfQogCQlmaWxlX2xpc3RfdW5sb2NrKCk7CisKKwkJLyogUmVzZXQgY29udHJvbGxpbmcgdHR5LiAqLworCQlpZiAoZHJvcF90dHkpCisJCQlwcm9jX3NldF90dHkoY3VycmVudCwgTlVMTCk7CiAJfQogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKIApAQCAtMTcyOCw3ICsxNzM0LDcgQEAKIAkJaisrOwogCQlpID0gaiAqIF9fTkZEQklUUzsKIAkJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JCWlmIChpID49IGZkdC0+bWF4X2ZkcyB8fCBpID49IGZkdC0+bWF4X2Zkc2V0KQorCQlpZiAoaSA+PSBmZHQtPm1heF9mZHMpCiAJCQlicmVhazsKIAkJc2V0ID0gZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHNbal07CiAJCWlmICghc2V0KQpAQCAtMTc1NCw3ICsxNzYwLDggQEAKIAkJCQkJCWdldF9maWxlKGRldm51bGwpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJZGV2bnVsbCA9IGRlbnRyeV9vcGVuKGRnZXQoc2VsaW51eF9udWxsKSwgbW50Z2V0KHNlbGludXhmc19tb3VudCksIE9fUkRXUik7Ci0JCQkJCQlpZiAoIWRldm51bGwpIHsKKwkJCQkJCWlmIChJU19FUlIoZGV2bnVsbCkpIHsKKwkJCQkJCQlkZXZudWxsID0gTlVMTDsKIAkJCQkJCQlwdXRfdW51c2VkX2ZkKGZkKTsKIAkJCQkJCQlmcHV0KGZpbGUpOwogCQkJCQkJCWNvbnRpbnVlOwpAQCAtMjQxMyw3ICsyNDIwLDcgQEAKIHN0YXRpYyBpbnQgc2VsaW51eF9maWxlX3Blcm1pc3Npb24oc3RydWN0IGZpbGUgKmZpbGUsIGludCBtYXNrKQogewogCWludCByYzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAlpZiAoIW1hc2spIHsKIAkJLyogTm8gcGVybWlzc2lvbiB0byBjaGVjay4gIEV4aXN0ZW5jZSB0ZXN0LiAqLwpAQCAtMjU5MCw3ICsyNTk3LDcgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJICAgICAgICBjYXNlIEZfU0VURkw6Ci0JCQlpZiAoIWZpbGUtPmZfZGVudHJ5IHx8ICFmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgeworCQkJaWYgKCFmaWxlLT5mX3BhdGguZGVudHJ5IHx8ICFmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTI2MTYsNyArMjYyMyw3IEBACiAJCWNhc2UgRl9TRVRMSzY0OgogCSAgICAgICAgY2FzZSBGX1NFVExLVzY0OgogI2VuZGlmCi0JCQlpZiAoIWZpbGUtPmZfZGVudHJ5IHx8ICFmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgeworCQkJaWYgKCFmaWxlLT5mX3BhdGguZGVudHJ5IHx8ICFmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTI4ODgsNyArMjg5NSw4IEBACiB9CiAKIC8qIFJldHVybnMgZXJyb3Igb25seSBpZiB1bmFibGUgdG8gcGFyc2UgYWRkcmVzc2VzICovCi1zdGF0aWMgaW50IHNlbGludXhfcGFyc2Vfc2tiX2lwdjQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCkKK3N0YXRpYyBpbnQgc2VsaW51eF9wYXJzZV9za2JfaXB2NChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCwgdTggKnByb3RvKQogewogCWludCBvZmZzZXQsIGlobGVuLCByZXQgPSAtRUlOVkFMOwogCXN0cnVjdCBpcGhkciBfaXBoLCAqaWg7CkBAIC0yOTA2LDYgKzI5MTQsOSBAQAogCWFkLT51Lm5ldC52NGluZm8uZGFkZHIgPSBpaC0+ZGFkZHI7CiAJcmV0ID0gMDsKIAorCWlmIChwcm90bykKKwkJKnByb3RvID0gaWgtPnByb3RvY29sOworCiAJc3dpdGNoIChpaC0+cHJvdG9jb2wpIHsKICAgICAgICAgY2FzZSBJUFBST1RPX1RDUDogewogICAgICAgICAJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwpAQCAtMjkzOSw2ICsyOTUwLDIyIEBACiAgICAgICAgIAlicmVhazsKICAgICAgICAgfQogCisJY2FzZSBJUFBST1RPX0RDQ1A6IHsKKwkJc3RydWN0IGRjY3BfaGRyIF9kY2NwaCwgKmRoOworCisJCWlmIChudG9ocyhpaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUKQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ICs9IGlobGVuOworCQlkaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9kY2NwaCksICZfZGNjcGgpOworCQlpZiAoZGggPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWFkLT51Lm5ldC5zcG9ydCA9IGRoLT5kY2NwaF9zcG9ydDsKKwkJYWQtPnUubmV0LmRwb3J0ID0gZGgtPmRjY3BoX2Rwb3J0OworCQlicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIAlicmVhazsKICAgICAgICAgfQpAQCAtMjk0OSw3ICsyOTc2LDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKIAogLyogUmV0dXJucyBlcnJvciBvbmx5IGlmIHVuYWJsZSB0byBwYXJzZSBhZGRyZXNzZXMgKi8KLXN0YXRpYyBpbnQgc2VsaW51eF9wYXJzZV9za2JfaXB2NihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgKmFkKQorc3RhdGljIGludCBzZWxpbnV4X3BhcnNlX3NrYl9pcHY2KHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgKmFkLCB1OCAqcHJvdG8pCiB7CiAJdTggbmV4dGhkcjsKIAlpbnQgcmV0ID0gLUVJTlZBTCwgb2Zmc2V0OwpAQCAtMjk3MCw2ICsyOTk4LDkgQEAKIAlpZiAob2Zmc2V0IDwgMCkKIAkJZ290byBvdXQ7CiAKKwlpZiAocHJvdG8pCisJCSpwcm90byA9IG5leHRoZHI7CisKIAlzd2l0Y2ggKG5leHRoZHIpIHsKIAljYXNlIElQUFJPVE9fVENQOiB7CiAgICAgICAgIAlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CkBAIC0yOTk1LDYgKzMwMjYsMTggQEAKIAkJYnJlYWs7CiAJfQogCisJY2FzZSBJUFBST1RPX0RDQ1A6IHsKKwkJc3RydWN0IGRjY3BfaGRyIF9kY2NwaCwgKmRoOworCisJCWRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2RjY3BoKSwgJl9kY2NwaCk7CisJCWlmIChkaCA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJYWQtPnUubmV0LnNwb3J0ID0gZGgtPmRjY3BoX3Nwb3J0OworCQlhZC0+dS5uZXQuZHBvcnQgPSBkaC0+ZGNjcGhfZHBvcnQ7CisJCWJyZWFrOworICAgICAgICB9CisKIAkvKiBpbmNsdWRlcyBmcmFnbWVudHMgKi8KIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTMwMDYsMTMgKzMwNDksMTMgQEAKICNlbmRpZiAvKiBJUFY2ICovCiAKIHN0YXRpYyBpbnQgc2VsaW51eF9wYXJzZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCwKLQkJCSAgICAgY2hhciAqKmFkZHJwLCBpbnQgKmxlbiwgaW50IHNyYykKKwkJCSAgICAgY2hhciAqKmFkZHJwLCBpbnQgKmxlbiwgaW50IHNyYywgdTggKnByb3RvKQogewogCWludCByZXQgPSAwOwogCiAJc3dpdGNoIChhZC0+dS5uZXQuZmFtaWx5KSB7CiAJY2FzZSBQRl9JTkVUOgotCQlyZXQgPSBzZWxpbnV4X3BhcnNlX3NrYl9pcHY0KHNrYiwgYWQpOworCQlyZXQgPSBzZWxpbnV4X3BhcnNlX3NrYl9pcHY0KHNrYiwgYWQsIHByb3RvKTsKIAkJaWYgKHJldCB8fCAhYWRkcnApCiAJCQlicmVhazsKIAkJKmxlbiA9IDQ7CkBAIC0zMDIyLDcgKzMwNjUsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCiAJY2FzZSBQRl9JTkVUNjoKLQkJcmV0ID0gc2VsaW51eF9wYXJzZV9za2JfaXB2Nihza2IsIGFkKTsKKwkJcmV0ID0gc2VsaW51eF9wYXJzZV9za2JfaXB2Nihza2IsIGFkLCBwcm90byk7CiAJCWlmIChyZXQgfHwgIWFkZHJwKQogCQkJYnJlYWs7CiAJCSpsZW4gPSAxNjsKQEAgLTMxMDAsOSArMzE0Myw3IEBACiAJaWYgKHNvY2stPnNrKSB7CiAJCXNrc2VjID0gc29jay0+c2stPnNrX3NlY3VyaXR5OwogCQlza3NlYy0+c2lkID0gaXNlYy0+c2lkOwotCQllcnIgPSBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc29jaywKLQkJCQkJCQlmYW1pbHksCi0JCQkJCQkJaXNlYy0+c2lkKTsKKwkJZXJyID0gc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlKHNvY2spOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC0zMTc5LDcgKzMyMjAsMTEgQEAKIAkJY2FzZSBTRUNDTEFTU19VRFBfU09DS0VUOgogCQkJbm9kZV9wZXJtID0gVURQX1NPQ0tFVF9fTk9ERV9CSU5EOwogCQkJYnJlYWs7Ci0JCQkKKworCQljYXNlIFNFQ0NMQVNTX0RDQ1BfU09DS0VUOgorCQkJbm9kZV9wZXJtID0gRENDUF9TT0NLRVRfX05PREVfQklORDsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlub2RlX3Blcm0gPSBSQVdJUF9TT0NLRVRfX05PREVfQklORDsKIAkJCWJyZWFrOwpAQCAtMzIxNywxNiArMzI2MiwxNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJLyoKLQkgKiBJZiBhIFRDUCBzb2NrZXQsIGNoZWNrIG5hbWVfY29ubmVjdCBwZXJtaXNzaW9uIGZvciB0aGUgcG9ydC4KKwkgKiBJZiBhIFRDUCBvciBEQ0NQIHNvY2tldCwgY2hlY2sgbmFtZV9jb25uZWN0IHBlcm1pc3Npb24gZm9yIHRoZSBwb3J0LgogCSAqLwogCWlzZWMgPSBTT0NLX0lOT0RFKHNvY2spLT5pX3NlY3VyaXR5OwotCWlmIChpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVENQX1NPQ0tFVCkgeworCWlmIChpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVENQX1NPQ0tFVCB8fAorCSAgICBpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfRENDUF9TT0NLRVQpIHsKIAkJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSBhZDsKIAkJc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IE5VTEw7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gTlVMTDsKIAkJdW5zaWduZWQgc2hvcnQgc251bTsKLQkJdTMyIHNpZDsKKwkJdTMyIHNpZCwgcGVybTsKIAogCQlpZiAoc2stPnNrX2ZhbWlseSA9PSBQRl9JTkVUKSB7CiAJCQlhZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyZXNzOwpAQCAtMzI0NSwxMSArMzI5MSwxMyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKKwkJcGVybSA9IChpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVENQX1NPQ0tFVCkgPworCQkgICAgICAgVENQX1NPQ0tFVF9fTkFNRV9DT05ORUNUIDogRENDUF9TT0NLRVRfX05BTUVfQ09OTkVDVDsKKwogCQlBVkNfQVVESVRfREFUQV9JTklUKCZhZCxORVQpOwogCQlhZC51Lm5ldC5kcG9ydCA9IGh0b25zKHNudW0pOwogCQlhZC51Lm5ldC5mYW1pbHkgPSBzay0+c2tfZmFtaWx5OwotCQllcnIgPSBhdmNfaGFzX3Blcm0oaXNlYy0+c2lkLCBzaWQsIGlzZWMtPnNjbGFzcywKLQkJCQkgICBUQ1BfU09DS0VUX19OQU1FX0NPTk5FQ1QsICZhZCk7CisJCWVyciA9IGF2Y19oYXNfcGVybShpc2VjLT5zaWQsIHNpZCwgaXNlYy0+c2NsYXNzLCBwZXJtLCAmYWQpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMzMxMyw3ICszMzYxLDEzIEBACiAKIHN0YXRpYyBpbnQgc2VsaW51eF9zb2NrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLGludCBsZXZlbCxpbnQgb3B0bmFtZSkKIHsKLQlyZXR1cm4gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIFNPQ0tFVF9fU0VUT1BUKTsKKwlpbnQgZXJyOworCisJZXJyID0gc29ja2V0X2hhc19wZXJtKGN1cnJlbnQsIHNvY2ssIFNPQ0tFVF9fU0VUT1BUKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lKTsKIH0KIAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tldF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwKQEAgLTM0MzEsNyArMzQ4NSwxMyBAQAogCQlub2RlX3Blcm0gPSBOT0RFX19UQ1BfUkVDVjsKIAkJcmVjdl9wZXJtID0gVENQX1NPQ0tFVF9fUkVDVl9NU0c7CiAJCWJyZWFrOwotCQorCisJY2FzZSBTRUNDTEFTU19EQ0NQX1NPQ0tFVDoKKwkJbmV0aWZfcGVybSA9IE5FVElGX19EQ0NQX1JFQ1Y7CisJCW5vZGVfcGVybSA9IE5PREVfX0RDQ1BfUkVDVjsKKwkJcmVjdl9wZXJtID0gRENDUF9TT0NLRVRfX1JFQ1ZfTVNHOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCW5ldGlmX3Blcm0gPSBORVRJRl9fUkFXSVBfUkVDVjsKIAkJbm9kZV9wZXJtID0gTk9ERV9fUkFXSVBfUkVDVjsKQEAgLTM0ODAsMTQgKzM1NDAsMTQgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBIYW5kbGUgbWFwcGVkIElQdjQgcGFja2V0cyBhcnJpdmluZyB2aWEgSVB2NiBzb2NrZXRzICovCi0JaWYgKGZhbWlseSA9PSBQRl9JTkVUNiAmJiBza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX0lQKSkKKwlpZiAoZmFtaWx5ID09IFBGX0lORVQ2ICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQogCQlmYW1pbHkgPSBQRl9JTkVUOwogCiAJQVZDX0FVRElUX0RBVEFfSU5JVCgmYWQsIE5FVCk7CiAJYWQudS5uZXQubmV0aWYgPSBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIlt1bmtub3duXSI7CiAJYWQudS5uZXQuZmFtaWx5ID0gZmFtaWx5OwogCi0JZXJyID0gc2VsaW51eF9wYXJzZV9za2Ioc2tiLCAmYWQsICZhZGRycCwgJmxlbiwgMSk7CisJZXJyID0gc2VsaW51eF9wYXJzZV9za2Ioc2tiLCAmYWQsICZhZGRycCwgJmxlbiwgMSwgTlVMTCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTM1MTcsMjUgKzM1NzcsMTYgQEAKIAl1MzIgc2NvbnRleHRfbGVuOwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWM7CiAJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYzsKLQl1MzIgcGVlcl9zaWQgPSAwOworCXUzMiBwZWVyX3NpZCA9IFNFQ1NJRF9OVUxMOwogCiAJaXNlYyA9IFNPQ0tfSU5PREUoc29jayktPmlfc2VjdXJpdHk7CiAKLQkvKiBpZiBVTklYX1NUUkVBTSBjaGVjayBwZWVyX3NpZCwgaWYgVENQIGNoZWNrIGRzdCBmb3IgbGFiZWxsZWQgc2EgKi8KLQlpZiAoaXNlYy0+c2NsYXNzID09IFNFQ0NMQVNTX1VOSVhfU1RSRUFNX1NPQ0tFVCkgeworCWlmIChpc2VjLT5zY2xhc3MgPT0gU0VDQ0xBU1NfVU5JWF9TVFJFQU1fU09DS0VUIHx8CisJICAgIGlzZWMtPnNjbGFzcyA9PSBTRUNDTEFTU19UQ1BfU09DS0VUKSB7CiAJCXNzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CiAJCXBlZXJfc2lkID0gc3NlYy0+cGVlcl9zaWQ7CiAJfQotCWVsc2UgaWYgKGlzZWMtPnNjbGFzcyA9PSBTRUNDTEFTU19UQ1BfU09DS0VUKSB7Ci0JCXBlZXJfc2lkID0gc2VsaW51eF9uZXRsYmxfc29ja2V0X2dldHBlZXJzZWNfc3RyZWFtKHNvY2spOwotCQlpZiAocGVlcl9zaWQgPT0gU0VDU0lEX05VTEwpCi0JCQlwZWVyX3NpZCA9IHNlbGludXhfc29ja2V0X2dldHBlZXJfc3RyZWFtKHNvY2stPnNrKTsKLQkJaWYgKHBlZXJfc2lkID09IFNFQ1NJRF9OVUxMKSB7Ci0JCQllcnIgPSAtRU5PUFJPVE9PUFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQllbHNlIHsKKwlpZiAocGVlcl9zaWQgPT0gU0VDU0lEX05VTEwpIHsKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNTY3LDEzICszNjE4LDEyIEBACiAJdTMyIHBlZXJfc2VjaWQgPSBTRUNTSURfTlVMTDsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChzb2NrICYmIChzb2NrLT5zay0+c2tfZmFtaWx5ID09IFBGX1VOSVgpKQorCWlmIChzb2NrICYmIHNvY2stPnNrLT5za19mYW1pbHkgPT0gUEZfVU5JWCkKIAkJc2VsaW51eF9nZXRfaW5vZGVfc2lkKFNPQ0tfSU5PREUoc29jayksICZwZWVyX3NlY2lkKTsKLQllbHNlIGlmIChza2IpIHsKLQkJcGVlcl9zZWNpZCA9IHNlbGludXhfbmV0bGJsX3NvY2tldF9nZXRwZWVyc2VjX2RncmFtKHNrYik7Ci0JCWlmIChwZWVyX3NlY2lkID09IFNFQ1NJRF9OVUxMKQotCQkJcGVlcl9zZWNpZCA9IHNlbGludXhfc29ja2V0X2dldHBlZXJfZGdyYW0oc2tiKTsKLQl9CisJZWxzZSBpZiAoc2tiKQorCQlzZWN1cml0eV9za2JfZXh0bGJsX3NpZChza2IsCisJCQkJCVNFQ0lOSVRTSURfVU5MQUJFTEVELAorCQkJCQkmcGVlcl9zZWNpZCk7CiAKIAlpZiAocGVlcl9zZWNpZCA9PSBTRUNTSURfTlVMTCkKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTM2MDAsNyArMzY1MCw3IEBACiAJbmV3c3NlYy0+c2lkID0gc3NlYy0+c2lkOwogCW5ld3NzZWMtPnBlZXJfc2lkID0gc3NlYy0+cGVlcl9zaWQ7CiAKLQlzZWxpbnV4X25ldGxibF9za19jbG9uZV9zZWN1cml0eShzc2VjLCBuZXdzc2VjKTsKKwlzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZShzc2VjLCBuZXdzc2VjKTsKIH0KIAogc3RhdGljIHZvaWQgc2VsaW51eF9za19nZXRzZWNpZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiAqc2VjaWQpCkBAIC0zNjM0LDE3ICszNjg0LDEwIEBACiAJdTMyIG5ld3NpZDsKIAl1MzIgcGVlcnNpZDsKIAotCW5ld3NpZCA9IHNlbGludXhfbmV0bGJsX2luZXRfY29ubl9yZXF1ZXN0KHNrYiwgc2tzZWMtPnNpZCk7Ci0JaWYgKG5ld3NpZCAhPSBTRUNTSURfTlVMTCkgewotCQlyZXEtPnNlY2lkID0gbmV3c2lkOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQllcnIgPSBzZWxpbnV4X3hmcm1fZGVjb2RlX3Nlc3Npb24oc2tiLCAmcGVlcnNpZCwgMCk7Ci0JQlVHX09OKGVycik7Ci0KKwlzZWN1cml0eV9za2JfZXh0bGJsX3NpZChza2IsIFNFQ0lOSVRTSURfVU5MQUJFTEVELCAmcGVlcnNpZCk7CiAJaWYgKHBlZXJzaWQgPT0gU0VDU0lEX05VTEwpIHsKIAkJcmVxLT5zZWNpZCA9IHNrc2VjLT5zaWQ7CisJCXJlcS0+cGVlcl9zZWNpZCA9IFNFQ1NJRF9OVUxMOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM2NTMsNiArMzY5Niw3IEBACiAJCXJldHVybiBlcnI7CiAKIAlyZXEtPnNlY2lkID0gbmV3c2lkOworCXJlcS0+cGVlcl9zZWNpZCA9IHBlZXJzaWQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2NjIsMTIgKzM3MDYsMjMgQEAKIAlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpuZXdza3NlYyA9IG5ld3NrLT5za19zZWN1cml0eTsKIAogCW5ld3Nrc2VjLT5zaWQgPSByZXEtPnNlY2lkOworCW5ld3Nrc2VjLT5wZWVyX3NpZCA9IHJlcS0+cGVlcl9zZWNpZDsKIAkvKiBOT1RFOiBJZGVhbGx5LCB3ZSBzaG91bGQgYWxzbyBnZXQgdGhlIGlzZWMtPnNpZCBmb3IgdGhlCiAJICAgbmV3IHNvY2tldCBpbiBzeW5jLCBidXQgd2UgZG9uJ3QgaGF2ZSB0aGUgaXNlYyBhdmFpbGFibGUgeWV0LgogCSAgIFNvIHdlIHdpbGwgd2FpdCB1bnRpbCBzb2NrX2dyYWZ0IHRvIGRvIGl0LCBieSB3aGljaAogCSAgIHRpbWUgaXQgd2lsbCBoYXZlIGJlZW4gY3JlYXRlZCBhbmQgYXZhaWxhYmxlLiAqLwogCi0Jc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfaW5pdChuZXdza3NlYywgcmVxLT5yc2tfb3BzLT5mYW1pbHkpOworCS8qIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhbnkgc29ydCBvZiBsb2NrIGhlcmUgYXMgd2UgYXJlIHRoZSBvbmx5CisJICogdGhyZWFkIHdpdGggYWNjZXNzIHRvIG5ld3Nrc2VjICovCisJc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQobmV3c2tzZWMsIHJlcS0+cnNrX29wcy0+ZmFtaWx5KTsKK30KKworc3RhdGljIHZvaWQgc2VsaW51eF9pbmV0X2Nvbm5fZXN0YWJsaXNoZWQoc3RydWN0IHNvY2sgKnNrLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7CisKKwlzZWN1cml0eV9za2JfZXh0bGJsX3NpZChza2IsIFNFQ0lOSVRTSURfVU5MQUJFTEVELCAmc2tzZWMtPnBlZXJfc2lkKTsKIH0KIAogc3RhdGljIHZvaWQgc2VsaW51eF9yZXFfY2xhc3NpZnlfZmxvdyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCkBAIC0zNzUwLDcgKzM4MDUsMTMgQEAKIAkJbm9kZV9wZXJtID0gTk9ERV9fVENQX1NFTkQ7CiAJCXNlbmRfcGVybSA9IFRDUF9TT0NLRVRfX1NFTkRfTVNHOwogCQlicmVhazsKLQkKKworCWNhc2UgU0VDQ0xBU1NfRENDUF9TT0NLRVQ6CisJCW5ldGlmX3Blcm0gPSBORVRJRl9fRENDUF9TRU5EOworCQlub2RlX3Blcm0gPSBOT0RFX19EQ0NQX1NFTkQ7CisJCXNlbmRfcGVybSA9IERDQ1BfU09DS0VUX19TRU5EX01TRzsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQluZXRpZl9wZXJtID0gTkVUSUZfX1JBV0lQX1NFTkQ7CiAJCW5vZGVfcGVybSA9IE5PREVfX1JBV0lQX1NFTkQ7CkBAIC0zODAxLDYgKzM4NjIsNyBAQAogCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSBhZDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopb3V0OwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjOworCXU4IHByb3RvOwogCiAJc2sgPSBza2ItPnNrOwogCWlmICghc2spCkBAIC0zODEyLDcgKzM4NzQsNyBAQAogCWFkLnUubmV0Lm5ldGlmID0gZGV2LT5uYW1lOwogCWFkLnUubmV0LmZhbWlseSA9IGZhbWlseTsKIAotCWVyciA9IHNlbGludXhfcGFyc2Vfc2tiKHNrYiwgJmFkLCAmYWRkcnAsICZsZW4sIDApOworCWVyciA9IHNlbGludXhfcGFyc2Vfc2tiKHNrYiwgJmFkLCAmYWRkcnAsICZsZW4sIDAsICZwcm90byk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTM4MjYsNyArMzg4OCw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQllcnIgPSBzZWxpbnV4X3hmcm1fcG9zdHJvdXRlX2xhc3Qoc2tzZWMtPnNpZCwgc2tiLCAmYWQpOworCWVyciA9IHNlbGludXhfeGZybV9wb3N0cm91dGVfbGFzdChza3NlYy0+c2lkLCBza2IsICZhZCwgcHJvdG8pOwogb3V0OgogCXJldHVybiBlcnIgPyBORl9EUk9QIDogTkZfQUNDRVBUOwogfQpAQCAtNDczMiw2ICs0Nzk0LDcgQEAKIAkuc29ja19ncmFmdCA9CQkJc2VsaW51eF9zb2NrX2dyYWZ0LAogCS5pbmV0X2Nvbm5fcmVxdWVzdCA9CQlzZWxpbnV4X2luZXRfY29ubl9yZXF1ZXN0LAogCS5pbmV0X2Nza19jbG9uZSA9CQlzZWxpbnV4X2luZXRfY3NrX2Nsb25lLAorCS5pbmV0X2Nvbm5fZXN0YWJsaXNoZWQgPQlzZWxpbnV4X2luZXRfY29ubl9lc3RhYmxpc2hlZCwKIAkucmVxX2NsYXNzaWZ5X2Zsb3cgPQkJc2VsaW51eF9yZXFfY2xhc3NpZnlfZmxvdywKIAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0KQEAgLTQ3NDQsNyArNDgwNyw2IEBACiAJLnhmcm1fc3RhdGVfZGVsZXRlX3NlY3VyaXR5ID0Jc2VsaW51eF94ZnJtX3N0YXRlX2RlbGV0ZSwKIAkueGZybV9wb2xpY3lfbG9va3VwID0gCQlzZWxpbnV4X3hmcm1fcG9saWN5X2xvb2t1cCwKIAkueGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaCA9CXNlbGludXhfeGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaCwKLQkueGZybV9mbG93X3N0YXRlX21hdGNoID0Jc2VsaW51eF94ZnJtX2Zsb3dfc3RhdGVfbWF0Y2gsCiAJLnhmcm1fZGVjb2RlX3Nlc3Npb24gPQkJc2VsaW51eF94ZnJtX2RlY29kZV9zZXNzaW9uLAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9pbmhlcml0LmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfaW5oZXJpdC5oCmluZGV4IGE2OGZkZDUuLjgzNzdhNGIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9pbmhlcml0LmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X2luaGVyaXQuaApAQCAtMzAsMyArMzAsNCBAQAogICAgU18oU0VDQ0xBU1NfTkVUTElOS19ETlJUX1NPQ0tFVCwgc29ja2V0LCAweDAwNDAwMDAwVUwpCiAgICBTXyhTRUNDTEFTU19ORVRMSU5LX0tPQkpFQ1RfVUVWRU5UX1NPQ0tFVCwgc29ja2V0LCAweDAwNDAwMDAwVUwpCiAgICBTXyhTRUNDTEFTU19BUFBMRVRBTEtfU09DS0VULCBzb2NrZXQsIDB4MDA0MDAwMDBVTCkKKyAgIFNfKFNFQ0NMQVNTX0RDQ1BfU09DS0VULCBzb2NrZXQsIDB4MDA0MDAwMDBVTCkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtX3RvX3N0cmluZy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKaW5kZXggMDlmYzhhMi4uYWQ5ZmIyZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKQEAgLTM1LDEyICszNSwxNiBAQAogICAgU18oU0VDQ0xBU1NfTk9ERSwgTk9ERV9fUkFXSVBfUkVDViwgInJhd2lwX3JlY3YiKQogICAgU18oU0VDQ0xBU1NfTk9ERSwgTk9ERV9fUkFXSVBfU0VORCwgInJhd2lwX3NlbmQiKQogICAgU18oU0VDQ0xBU1NfTk9ERSwgTk9ERV9fRU5GT1JDRV9ERVNULCAiZW5mb3JjZV9kZXN0IikKKyAgIFNfKFNFQ0NMQVNTX05PREUsIE5PREVfX0RDQ1BfUkVDViwgImRjY3BfcmVjdiIpCisgICBTXyhTRUNDTEFTU19OT0RFLCBOT0RFX19EQ0NQX1NFTkQsICJkY2NwX3NlbmQiKQogICAgU18oU0VDQ0xBU1NfTkVUSUYsIE5FVElGX19UQ1BfUkVDViwgInRjcF9yZWN2IikKICAgIFNfKFNFQ0NMQVNTX05FVElGLCBORVRJRl9fVENQX1NFTkQsICJ0Y3Bfc2VuZCIpCiAgICBTXyhTRUNDTEFTU19ORVRJRiwgTkVUSUZfX1VEUF9SRUNWLCAidWRwX3JlY3YiKQogICAgU18oU0VDQ0xBU1NfTkVUSUYsIE5FVElGX19VRFBfU0VORCwgInVkcF9zZW5kIikKICAgIFNfKFNFQ0NMQVNTX05FVElGLCBORVRJRl9fUkFXSVBfUkVDViwgInJhd2lwX3JlY3YiKQogICAgU18oU0VDQ0xBU1NfTkVUSUYsIE5FVElGX19SQVdJUF9TRU5ELCAicmF3aXBfc2VuZCIpCisgICBTXyhTRUNDTEFTU19ORVRJRiwgTkVUSUZfX0RDQ1BfUkVDViwgImRjY3BfcmVjdiIpCisgICBTXyhTRUNDTEFTU19ORVRJRiwgTkVUSUZfX0RDQ1BfU0VORCwgImRjY3Bfc2VuZCIpCiAgICBTXyhTRUNDTEFTU19VTklYX1NUUkVBTV9TT0NLRVQsIFVOSVhfU1RSRUFNX1NPQ0tFVF9fQ09OTkVDVFRPLCAiY29ubmVjdHRvIikKICAgIFNfKFNFQ0NMQVNTX1VOSVhfU1RSRUFNX1NPQ0tFVCwgVU5JWF9TVFJFQU1fU09DS0VUX19ORVdDT05OLCAibmV3Y29ubiIpCiAgICBTXyhTRUNDTEFTU19VTklYX1NUUkVBTV9TT0NLRVQsIFVOSVhfU1RSRUFNX1NPQ0tFVF9fQUNDRVBURlJPTSwgImFjY2VwdGZyb20iKQpAQCAtMjUyLDMgKzI1Niw3IEBACiAgICBTXyhTRUNDTEFTU19LRVksIEtFWV9fTElOSywgImxpbmsiKQogICAgU18oU0VDQ0xBU1NfS0VZLCBLRVlfX1NFVEFUVFIsICJzZXRhdHRyIikKICAgIFNfKFNFQ0NMQVNTX0tFWSwgS0VZX19DUkVBVEUsICJjcmVhdGUiKQorICAgU18oU0VDQ0xBU1NfQ09OVEVYVCwgQ09OVEVYVF9fVFJBTlNMQVRFLCAidHJhbnNsYXRlIikKKyAgIFNfKFNFQ0NMQVNTX0NPTlRFWFQsIENPTlRFWFRfX0NPTlRBSU5TLCAiY29udGFpbnMiKQorICAgU18oU0VDQ0xBU1NfRENDUF9TT0NLRVQsIERDQ1BfU09DS0VUX19OT0RFX0JJTkQsICJub2RlX2JpbmQiKQorICAgU18oU0VDQ0xBU1NfRENDUF9TT0NLRVQsIERDQ1BfU09DS0VUX19OQU1FX0NPTk5FQ1QsICJuYW1lX2Nvbm5lY3QiKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaAppbmRleCA4MWY0ZjUyLi4yZGU0YjVmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaApAQCAtMzEyLDYgKzMxMiw4IEBACiAjZGVmaW5lIE5PREVfX1JBV0lQX1JFQ1YgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAogI2RlZmluZSBOT0RFX19SQVdJUF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKICNkZWZpbmUgTk9ERV9fRU5GT1JDRV9ERVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIE5PREVfX0RDQ1BfUkVDViAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAorI2RlZmluZSBOT0RFX19EQ0NQX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVUwKIAogI2RlZmluZSBORVRJRl9fVENQX1JFQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgTkVUSUZfX1RDUF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCkBAIC0zMTksNiArMzIxLDggQEAKICNkZWZpbmUgTkVUSUZfX1VEUF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCiAjZGVmaW5lIE5FVElGX19SQVdJUF9SRUNWICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAogI2RlZmluZSBORVRJRl9fUkFXSVBfU0VORCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgTkVUSUZfX0RDQ1BfUkVDViAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIE5FVElGX19EQ0NQX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAogCiAjZGVmaW5lIE5FVExJTktfU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBORVRMSU5LX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKQEAgLTk3MCwzICs5NzQsMzEgQEAKICNkZWZpbmUgS0VZX19MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFVMCiAjZGVmaW5lIEtFWV9fU0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBVTAogI2RlZmluZSBLRVlfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKKworI2RlZmluZSBDT05URVhUX19UUkFOU0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKKyNkZWZpbmUgQ09OVEVYVF9fQ09OVEFJTlMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCisKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19HRVRBVFRSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fU0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19SRUxBQkVMRlJPTSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fUkVMQUJFTFRPICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0FQUEVORCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19CSU5EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fQ09OTkVDVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX0xJU1RFTiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19BQ0NFUFQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fR0VUT1BUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX1NFVE9QVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19TSFVURE9XTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fUkVDVkZST00gICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX1NFTkRUTyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19SRUNWX01TRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwVUwKKyNkZWZpbmUgRENDUF9TT0NLRVRfX05BTUVfQklORCAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMFVMCisjZGVmaW5lIERDQ1BfU09DS0VUX19OT0RFX0JJTkQgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVTAorI2RlZmluZSBEQ0NQX1NPQ0tFVF9fTkFNRV9DT05ORUNUICAgICAgICAgICAgICAgICAweDAwODAwMDAwVUwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaAppbmRleCA5NjBlZjE4Li42ZWQxMGMzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Yy5oCkBAIC01NCwxMiArNTQsMTIgQEAKIAkJCWNoYXIgKm5ldGlmOwogCQkJc3RydWN0IHNvY2sgKnNrOwogCQkJdTE2IGZhbWlseTsKLQkJCXUxNiBkcG9ydDsKLQkJCXUxNiBzcG9ydDsKKwkJCV9fYmUxNiBkcG9ydDsKKwkJCV9fYmUxNiBzcG9ydDsKIAkJCXVuaW9uIHsKIAkJCQlzdHJ1Y3QgewotCQkJCQl1MzIgZGFkZHI7Ci0JCQkJCXUzMiBzYWRkcjsKKwkJCQkJX19iZTMyIGRhZGRyOworCQkJCQlfX2JlMzIgc2FkZHI7CiAJCQkJfSB2NDsKIAkJCQlzdHJ1Y3QgewogCQkJCQlzdHJ1Y3QgaW42X2FkZHIgZGFkZHI7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjX3NzLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjX3NzLmgKaW5kZXggNDUwYTI4My4uZmY4NjllOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Y19zcy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmNfc3MuaApAQCAtMTAsNSArMTAsMjkgQEAKIAogaW50IGF2Y19zc19yZXNldCh1MzIgc2Vxbm8pOwogCitzdHJ1Y3QgYXZfcGVybV90b19zdHJpbmcKK3sKKwl1MTYgdGNsYXNzOworCXUzMiB2YWx1ZTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RydWN0IGF2X2luaGVyaXQKK3sKKwl1MTYgdGNsYXNzOworCWNvbnN0IGNoYXIgKipjb21tb25fcHRzOworCXUzMiBjb21tb25fYmFzZTsKK307CisKK3N0cnVjdCBzZWxpbnV4X2NsYXNzX3Blcm0KK3sKKwljb25zdCBzdHJ1Y3QgYXZfcGVybV90b19zdHJpbmcgKmF2X3Blcm1fdG9fc3RyaW5nOworCXUzMiBhdl9wdHNfbGVuOworCWNvbnN0IGNoYXIgKipjbGFzc190b19zdHJpbmc7CisJdTMyIGN0c19sZW47CisJY29uc3Qgc3RydWN0IGF2X2luaGVyaXQgKmF2X2luaGVyaXQ7CisJdTMyIGF2X2luaGVyaXRfbGVuOworfTsKKwogI2VuZGlmIC8qIF9TRUxJTlVYX0FWQ19TU19IXyAqLwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NfdG9fc3RyaW5nLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NfdG9fc3RyaW5nLmgKaW5kZXggMjQzMDNiNi4uOWYzZWJiMSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzX3RvX3N0cmluZy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc190b19zdHJpbmcuaApAQCAtNjEsMyArNjEsNSBAQAogICAgIFNfKCJhcHBsZXRhbGtfc29ja2V0IikKICAgICBTXygicGFja2V0IikKICAgICBTXygia2V5IikKKyAgICBTXygiY29udGV4dCIpCisgICAgU18oImRjY3Bfc29ja2V0IikKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9mbGFzay5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKaW5kZXggOTU4ODdhZS4uNjdjZWYzNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKQEAgLTYzLDYgKzYzLDggQEAKICNkZWZpbmUgU0VDQ0xBU1NfQVBQTEVUQUxLX1NPQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgIDU2CiAjZGVmaW5lIFNFQ0NMQVNTX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NwogI2RlZmluZSBTRUNDTEFTU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgKKyNkZWZpbmUgU0VDQ0xBU1NfQ09OVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5CisjZGVmaW5lIFNFQ0NMQVNTX0RDQ1BfU09DS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MAogCiAvKgogICogU2VjdXJpdHkgaWRlbnRpZmllciBpbmRpY2VzIGZvciBpbml0aWFsIGVudGl0aWVzCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmgKaW5kZXggZWYyMjY3Zi4uOTFiODhmMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL29ianNlYy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9vYmpzZWMuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlICJmbGFzay5oIgogI2luY2x1ZGUgImF2Yy5oIgogCkBAIC0xMDgsNiArMTA5LDcgQEAKIAkJTkxCTF9SRVFVSVJFLAogCQlOTEJMX0xBQkVMRUQsCiAJfSBubGJsX3N0YXRlOworCXNwaW5sb2NrX3QgbmxibF9sb2NrOwkJLyogcHJvdGVjdHMgbmxibF9zdGF0ZSAqLwogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCmluZGV4IDFlZjc5MTcuLjIxMGVlYzcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCkBAIC0zNCw2ICszNCw4IEBACiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUFYCVBPTElDWURCX1ZFUlNJT05fUkFOR0VUUkFOUwogI2VuZGlmCiAKK3N0cnVjdCBza19idWZmOworCiBleHRlcm4gaW50IHNlbGludXhfZW5hYmxlZDsKIGV4dGVybiBpbnQgc2VsaW51eF9tbHNfZW5hYmxlZDsKIApAQCAtODAsNiArODIsOCBAQAogaW50IHNlY3VyaXR5X25vZGVfc2lkKHUxNiBkb21haW4sIHZvaWQgKmFkZHIsIHUzMiBhZGRybGVuLAogCXUzMiAqb3V0X3NpZCk7CiAKK3ZvaWQgc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGJhc2Vfc2lkLCB1MzIgKnNpZCk7CisKIGludCBzZWN1cml0eV92YWxpZGF0ZV90cmFuc2l0aW9uKHUzMiBvbGRzaWQsIHUzMiBuZXdzaWQsIHUzMiB0YXNrc2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHRjbGFzcyk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWxpbnV4X25ldGxhYmVsLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VsaW51eF9uZXRsYWJlbC5oCmluZGV4IGVjYWI0YmQuLjJhNzMyYzkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWxpbnV4X25ldGxhYmVsLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlbGludXhfbmV0bGFiZWwuaApAQCAtMzgsMzAgKzM4LDM3IEBACiAKICNpZmRlZiBDT05GSUdfTkVUTEFCRUwKIHZvaWQgc2VsaW51eF9uZXRsYmxfY2FjaGVfaW52YWxpZGF0ZSh2b2lkKTsKLWludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkgICAgICBpbnQgc29ja19mYW1pbHksCi0JCQkJICAgICAgdTMyIHNpZCk7CitpbnQgc2VsaW51eF9uZXRsYmxfc2tidWZmX2dldHNpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYmFzZV9zaWQsIHUzMiAqc2lkKTsKK2ludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jayk7CiB2b2lkIHNlbGludXhfbmV0bGJsX3NvY2tfZ3JhZnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKLXUzMiBzZWxpbnV4X25ldGxibF9pbmV0X2Nvbm5fcmVxdWVzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgc29ja19zaWQpOwogaW50IHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYihzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYywKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQpOwotdTMyIHNlbGludXhfbmV0bGJsX3NvY2tldF9nZXRwZWVyc2VjX3N0cmVhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKLXUzMiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKKwkJCQkgICAgICBpbnQgZmFtaWx5KTsKIHZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfaW5pdChzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAogCQkJCSAgICAgaW50IGZhbWlseSk7Ci12b2lkIHNlbGludXhfbmV0bGJsX3NrX2Nsb25lX3NlY3VyaXR5KHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCit2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2Nsb25lKHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCiAJCQkJICAgICAgc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqbmV3c3NlYyk7CiBpbnQgc2VsaW51eF9uZXRsYmxfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CitpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgICAgIGludCBsZXZlbCwKKwkJCQkgICAgIGludCBvcHRuYW1lKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VsaW51eF9uZXRsYmxfY2FjaGVfaW52YWxpZGF0ZSh2b2lkKQogewogCXJldHVybjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkJCQkgICAgaW50IHNvY2tfZmFtaWx5LAotCQkJCQkJICAgIHUzMiBzaWQpCitzdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgICB1MzIgYmFzZV9zaWQsCisJCQkJCSAgICAgICB1MzIgKnNpZCkKK3sKKwkqc2lkID0gU0VDU0lEX05VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9wb3N0X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewogCXJldHVybiAwOwogfQpAQCAtNzIsMTIgKzc5LDYgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIHNlbGludXhfbmV0bGJsX2luZXRfY29ubl9yZXF1ZXN0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkgICB1MzIgc29ja19zaWQpCi17Ci0JcmV0dXJuIFNFQ1NJRF9OVUxMOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X25ldGxibF9zb2NrX3Jjdl9za2Ioc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMsCiAJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgICAgIHN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQpCkBAIC04NSwxNCArODYsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgc2VsaW51eF9uZXRsYmxfc29ja2V0X2dldHBlZXJzZWNfc3RyZWFtKHN0cnVjdCBzb2NrZXQgKnNvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAorCQkJCQkgICAgICAgaW50IGZhbWlseSkKIHsKLQlyZXR1cm4gU0VDU0lEX05VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIHNlbGludXhfbmV0bGJsX3NvY2tldF9nZXRwZWVyc2VjX2RncmFtKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIFNFQ1NJRF9OVUxMOworCXJldHVybjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2luaXQoCkBAIC0xMDIsNyArMTAwLDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWxpbnV4X25ldGxibF9za19jbG9uZV9zZWN1cml0eSgKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZSgKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCiAJCQkJCSAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKm5ld3NzZWMpCiB7CkBAIC0xMTQsNiArMTEyLDEzIEBACiB7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJCQkgICBpbnQgbGV2ZWwsCisJCQkJCQkgICBpbnQgb3B0bmFtZSkKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZiAvKiBDT05GSUdfTkVUTEFCRUwgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUveGZybS5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3hmcm0uaAppbmRleCA1MjZiMjgwLi4xNjFlYjU3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUveGZybS5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS94ZnJtLmgKQEAgLTgsMjAgKzgsMTcgQEAKICNkZWZpbmUgX1NFTElOVVhfWEZSTV9IXwogCiBpbnQgc2VsaW51eF94ZnJtX3BvbGljeV9hbGxvYyhzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLAotCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnNlY19jdHgsIHN0cnVjdCBzb2NrICpzayk7CisJCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCk7CiBpbnQgc2VsaW51eF94ZnJtX3BvbGljeV9jbG9uZShzdHJ1Y3QgeGZybV9wb2xpY3kgKm9sZCwgc3RydWN0IHhmcm1fcG9saWN5ICpuZXcpOwogdm9pZCBzZWxpbnV4X3hmcm1fcG9saWN5X2ZyZWUoc3RydWN0IHhmcm1fcG9saWN5ICp4cCk7CiBpbnQgc2VsaW51eF94ZnJtX3BvbGljeV9kZWxldGUoc3RydWN0IHhmcm1fcG9saWN5ICp4cCk7CiBpbnQgc2VsaW51eF94ZnJtX3N0YXRlX2FsbG9jKHN0cnVjdCB4ZnJtX3N0YXRlICp4LAotCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sLCB1MzIgc2VjaWQpOworCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqc2VjX2N0eCwgdTMyIHNlY2lkKTsKIHZvaWQgc2VsaW51eF94ZnJtX3N0YXRlX2ZyZWUoc3RydWN0IHhmcm1fc3RhdGUgKngpOwogaW50IHNlbGludXhfeGZybV9zdGF0ZV9kZWxldGUoc3RydWN0IHhmcm1fc3RhdGUgKngpOwogaW50IHNlbGludXhfeGZybV9wb2xpY3lfbG9va3VwKHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHUzMiBmbF9zZWNpZCwgdTggZGlyKTsKIGludCBzZWxpbnV4X3hmcm1fc3RhdGVfcG9sX2Zsb3dfbWF0Y2goc3RydWN0IHhmcm1fc3RhdGUgKngsCiAJCQlzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBzdHJ1Y3QgZmxvd2kgKmZsKTsKLWludCBzZWxpbnV4X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSwKLQkJCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHApOwotCiAKIC8qCiAgKiBFeHRyYWN0IHRoZSBzZWN1cml0eSBibG9iIGZyb20gdGhlIHNvY2sgKGl0J3MgYWN0dWFsbHkgb24gdGhlIHNvY2tldCkKQEAgLTM4LDkgKzM1LDcgQEAKIGludCBzZWxpbnV4X3hmcm1fc29ja19yY3Zfc2tiKHUzMiBzaWQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgKmFkKTsKIGludCBzZWxpbnV4X3hmcm1fcG9zdHJvdXRlX2xhc3QodTMyIGlzZWNfc2lkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCk7Ci11MzIgc2VsaW51eF9zb2NrZXRfZ2V0cGVlcl9zdHJlYW0oc3RydWN0IHNvY2sgKnNrKTsKLXUzMiBzZWxpbnV4X3NvY2tldF9nZXRwZWVyX2RncmFtKHN0cnVjdCBza19idWZmICpza2IpOworCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCwgdTggcHJvdG8pOwogaW50IHNlbGludXhfeGZybV9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKnNpZCwgaW50IGNrYWxsKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X3hmcm1fc29ja19yY3Zfc2tiKHUzMiBpc2VjX3NpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTUwLDIwICs0NSwxMSBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X3hmcm1fcG9zdHJvdXRlX2xhc3QodTMyIGlzZWNfc2lkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCkKKwkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQsIHU4IHByb3RvKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X3NvY2tldF9nZXRwZWVyX3N0cmVhbShzdHJ1Y3Qgc29jayAqc2spCi17Ci0JcmV0dXJuIFNFQ1NJRF9OVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X3NvY2tldF9nZXRwZWVyX2RncmFtKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIFNFQ1NJRF9OVUxMOwotfQogc3RhdGljIGlubGluZSBpbnQgc2VsaW51eF94ZnJtX2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqc2lkLCBpbnQgY2thbGwpCiB7CiAJKnNpZCA9IFNFQ1NJRF9OVUxMOwpAQCAtNzEsNCArNTcsMTAgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHZvaWQgc2VsaW51eF9za2JfeGZybV9zaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyICpzaWQpCit7CisJaW50IGVyciA9IHNlbGludXhfeGZybV9kZWNvZGVfc2Vzc2lvbihza2IsIHNpZCwgMCk7CisJQlVHX09OKGVycik7Cit9CisKICNlbmRpZiAvKiBfU0VMSU5VWF9YRlJNX0hfICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMgYi9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKaW5kZXggYjhmNGQyNS4uY2NmZTg3NSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYwpAQCAtNjAsNyArNjAsNiBAQAogCXsgUlRNX0RFTEFDVElPTiwJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1dSSVRFIH0sCiAJeyBSVE1fR0VUQUNUSU9OLAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKIAl7IFJUTV9ORVdQUkVGSVgsCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19XUklURSB9LAotCXsgUlRNX0dFVFBSRUZJWCwJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1JFQUQgIH0sCiAJeyBSVE1fR0VUTVVMVElDQVNULAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKIAl7IFJUTV9HRVRBTllDQVNULAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKIAl7IFJUTV9HRVRORUlHSFRCTCwJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1JFQUQgIH0sCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwppbmRleCBjZDI0NDQxLi5jOGJmNmUxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKQEAgLTQ0OCw3ICs0NDgsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBzZWxpbnV4X3RyYW5zYWN0aW9uX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCiB7Ci0JaW5vX3QgaW5vID0gIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubzsKKwlpbm9fdCBpbm8gPSAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CiAJY2hhciAqZGF0YTsKIAlzc2l6ZV90IHJ2OwogCkBAIC04MDUsNyArODA1LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaW5vZGUgPSBmaWxlcC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBmaWxlcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAljdXJfZW5mb3JjaW5nID0gc2VjdXJpdHlfZ2V0X2Jvb2xfdmFsdWUoaW5vZGUtPmlfaW5vIC0gQk9PTF9JTk9fT0ZGU0VUKTsKIAlpZiAoY3VyX2VuZm9yY2luZyA8IDApIHsKIAkJcmV0ID0gY3VyX2VuZm9yY2luZzsKQEAgLTg2NCw3ICs4NjQsNyBAQAogCWlmIChuZXdfdmFsdWUpCiAJCW5ld192YWx1ZSA9IDE7CiAKLQlpbm9kZSA9IGZpbGVwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbGVwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWJvb2xfcGVuZGluZ192YWx1ZXNbaW5vZGUtPmlfaW5vIC0gQk9PTF9JTk9fT0ZGU0VUXSA9IG5ld192YWx1ZTsKIAlsZW5ndGggPSBjb3VudDsKIApAQCAtOTY1LDcgKzk2NSw3IEBACiAJZmlsZV9saXN0X2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoKHAsICZzYi0+c19maWxlcykgewogCQlzdHJ1Y3QgZmlsZSAqIGZpbHAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBmaWxlLCBmX3UuZnVfbGlzdCk7Ci0JCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwkJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbHAtPmZfcGF0aC5kZW50cnk7CiAKIAkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gZGUpIHsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5jCmluZGV4IGQwNDljN2EuLmViYjk5M2MgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmMKQEAgLTI4LDcgKzI4LDcgQEAKICAoa2V5cC0+c291cmNlX3R5cGUgPDwgOSkpICYgXAogIEFWVEFCX0hBU0hfTUFTSykKIAotc3RhdGljIGttZW1fY2FjaGVfdCAqYXZ0YWJfbm9kZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmF2dGFiX25vZGVfY2FjaGVwOwogCiBzdGF0aWMgc3RydWN0IGF2dGFiX25vZGUqCiBhdnRhYl9pbnNlcnRfbm9kZShzdHJ1Y3QgYXZ0YWIgKmgsIGludCBodmFsdWUsCkBAIC0zNiw3ICszNiw3IEBACiAJCSAgc3RydWN0IGF2dGFiX2tleSAqa2V5LCBzdHJ1Y3QgYXZ0YWJfZGF0dW0gKmRhdHVtKQogewogCXN0cnVjdCBhdnRhYl9ub2RlICogbmV3bm9kZTsKLQluZXdub2RlID0ga21lbV9jYWNoZV9hbGxvYyhhdnRhYl9ub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCW5ld25vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGF2dGFiX25vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAobmV3bm9kZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAltZW1zZXQobmV3bm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdnRhYl9ub2RlKSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCmluZGV4IGNmZWQxZDMuLmNlNDkyYTYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCkBAIC02LDcgKzYsNyBAQAogLyoKICAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bC5tb29yZUBocC5jb20+CiAgKgotICogICAgICBBZGRlZCBlYml0bWFwX2V4cG9ydCgpIGFuZCBlYml0bWFwX2ltcG9ydCgpCisgKiAgICAgIEFkZGVkIHN1cHBvcnQgdG8gaW1wb3J0L2V4cG9ydCB0aGUgTmV0TGFiZWwgY2F0ZWdvcnkgYml0bWFwCiAgKgogICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNgogICovCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CiAjaW5jbHVkZSAiZWJpdG1hcC5oIgogI2luY2x1ZGUgInBvbGljeWRiLmgiCiAKQEAgLTY3LDEzOCArNjgsMTIxIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUTEFCRUwKIC8qKgotICogZWJpdG1hcF9leHBvcnQgLSBFeHBvcnQgYW4gZWJpdG1hcCB0byBhIHVuc2lnbmVkIGNoYXIgYml0bWFwIHN0cmluZwotICogQHNyYzogdGhlIGViaXRtYXAgdG8gZXhwb3J0Ci0gKiBAZHN0OiB0aGUgcmVzdWx0aW5nIGJpdG1hcCBzdHJpbmcKLSAqIEBkc3RfbGVuOiBsZW5ndGggb2YgZHN0IGluIGJ5dGVzCisgKiBlYml0bWFwX25ldGxibF9leHBvcnQgLSBFeHBvcnQgYW4gZWJpdG1hcCBpbnRvIGEgTmV0TGFiZWwgY2F0ZWdvcnkgYml0bWFwCisgKiBAZWJtYXA6IHRoZSBlYml0bWFwIHRvIGV4cG9ydAorICogQGNhdG1hcDogdGhlIE5ldExhYmVsIGNhdGVnb3J5IGJpdG1hcAogICoKICAqIERlc2NyaXB0aW9uOgotICogQWxsb2NhdGUgYSBidWZmZXIgYXQgbGVhc3Qgc3JjLT5oaWdoYml0IGJpdHMgbG9uZyBhbmQgZXhwb3J0IHRoZSBleHRlbnNpYmxlCi0gKiBiaXRtYXAgaW50byB0aGUgYnVmZmVyLiAgVGhlIGJpdG1hcCBzdHJpbmcgd2lsbCBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCwKLSAqIGkuZS4gTFNCIGZpcnN0LiAgVGhlIHZhbHVlIHJldHVybmVkIGluIGRzdF9sZW4gbWF5IG5vdCB0aGUgdHJ1ZSBzaXplIG9mIHRoZQotICogYnVmZmVyIGFzIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpcyByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgTUFQVFlQRS4KLSAqIFRoZSBjYWxsZXIgbXVzdCBmcmVlIHRoZSBidWZmZXIgd2hlbiBmaW5pc2hlZC4gUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsCi0gKiBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIEV4cG9ydCBhIFNFTGludXggZXh0ZW5zaWJpbGUgYml0bWFwIGludG8gYSBOZXRMYWJlbCBjYXRlZ29yeSBiaXRtYXAuCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGVycm9yLgogICoKICAqLwotaW50IGViaXRtYXBfZXhwb3J0KGNvbnN0IHN0cnVjdCBlYml0bWFwICpzcmMsCi0JCSAgIHVuc2lnbmVkIGNoYXIgKipkc3QsCi0JCSAgIHNpemVfdCAqZHN0X2xlbikKK2ludCBlYml0bWFwX25ldGxibF9leHBvcnQoc3RydWN0IGViaXRtYXAgKmVibWFwLAorCQkJICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqKmNhdG1hcCkKIHsKLQlzaXplX3QgYml0bWFwX2xlbjsKLQl1bnNpZ25lZCBjaGFyICpiaXRtYXA7Ci0Jc3RydWN0IGViaXRtYXBfbm9kZSAqaXRlcl9ub2RlOwotCU1BUFRZUEUgbm9kZV92YWw7Ci0Jc2l6ZV90IGJpdG1hcF9ieXRlOwotCXVuc2lnbmVkIGNoYXIgYml0bWFzazsKKwlzdHJ1Y3QgZWJpdG1hcF9ub2RlICplX2l0ZXIgPSBlYm1hcC0+bm9kZTsKKwlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY19pdGVyOworCXUzMiBjbWFwX2lkeDsKIAotCWJpdG1hcF9sZW4gPSBzcmMtPmhpZ2hiaXQgLyA4OwotCWlmIChzcmMtPmhpZ2hiaXQgJSA3KQotCQliaXRtYXBfbGVuICs9IDE7Ci0JaWYgKGJpdG1hcF9sZW4gPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyogVGhpcyBmdW5jdGlvbiBpcyBhIG11Y2ggc2ltcGxlciBiZWNhdXNlIFNFTGludXgncyBNQVBUWVBFIGhhcHBlbnMKKwkgKiB0byBiZSB0aGUgc2FtZSBhcyBOZXRMYWJlbCdzIE5FVExCTF9DQVRNQVBfTUFQVFlQRSwgaWYgTUFQVFlQRSBpcworCSAqIGNoYW5nZWQgZnJvbSBhIHU2NCB0aGlzIGZ1bmN0aW9uIHdpbGwgbW9zdCBsaWtlbHkgbmVlZCB0byBiZSBjaGFuZ2VkCisJICogYXMgd2VsbC4gIEl0J3Mgbm90IGlkZWFsIGJ1dCBJIHRoaW5rIHRoZSB0cmFkZW9mZiBpbiB0ZXJtcyBvZgorCSAqIG5lYXRuZXNzIGFuZCBzcGVlZCBpcyB3b3J0aCBpdC4gKi8KIAotCWJpdG1hcCA9IGt6YWxsb2MoKGJpdG1hcF9sZW4gJiB+KHNpemVvZihNQVBUWVBFKSAtIDEpKSArCi0JCQkgc2l6ZW9mKE1BUFRZUEUpLAotCQkJIEdGUF9BVE9NSUMpOwotCWlmIChiaXRtYXAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpdGVyX25vZGUgPSBzcmMtPm5vZGU7Ci0JZG8gewotCQliaXRtYXBfYnl0ZSA9IGl0ZXJfbm9kZS0+c3RhcnRiaXQgLyA4OwotCQliaXRtYXNrID0gMHg4MDsKLQkJbm9kZV92YWwgPSBpdGVyX25vZGUtPm1hcDsKLQkJZG8gewotCQkJaWYgKGJpdG1hc2sgPT0gMCkgewotCQkJCWJpdG1hcF9ieXRlKys7Ci0JCQkJYml0bWFzayA9IDB4ODA7Ci0JCQl9Ci0JCQlpZiAobm9kZV92YWwgJiAoTUFQVFlQRSkweDAxKQotCQkJCWJpdG1hcFtiaXRtYXBfYnl0ZV0gfD0gYml0bWFzazsKLQkJCW5vZGVfdmFsID4+PSAxOwotCQkJYml0bWFzayA+Pj0gMTsKLQkJfSB3aGlsZSAobm9kZV92YWwgPiAwKTsKLQkJaXRlcl9ub2RlID0gaXRlcl9ub2RlLT5uZXh0OwotCX0gd2hpbGUgKGl0ZXJfbm9kZSk7Ci0KLQkqZHN0ID0gYml0bWFwOwotCSpkc3RfbGVuID0gYml0bWFwX2xlbjsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBlYml0bWFwX2ltcG9ydCAtIEltcG9ydCBhbiB1bnNpZ25lZCBjaGFyIGJpdG1hcCBzdHJpbmcgaW50byBhbiBlYml0bWFwCi0gKiBAc3JjOiB0aGUgYml0bWFwIHN0cmluZwotICogQHNyY19sZW46IHRoZSBiaXRtYXAgbGVuZ3RoIGluIGJ5dGVzCi0gKiBAZHN0OiB0aGUgZW1wdHkgZWJpdG1hcAotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpdHRsZSBlbmRpYW4gYml0bWFwIHN0cmluZyBpbiBzcmMgYW5kIGltcG9ydHMgaXQgaW50bwotICogdGhlIGViaXRtYXAgcG9pbnRlZCB0byBieSBkc3QuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uCi0gKiBmYWlsdXJlLgotICoKLSAqLwotaW50IGViaXRtYXBfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJICAgc2l6ZV90IHNyY19sZW4sCi0JCSAgIHN0cnVjdCBlYml0bWFwICpkc3QpCi17Ci0Jc2l6ZV90IHNyY19vZmYgPSAwOwotCXNpemVfdCBub2RlX2xpbWl0OwotCXN0cnVjdCBlYml0bWFwX25vZGUgKm5vZGVfbmV3OwotCXN0cnVjdCBlYml0bWFwX25vZGUgKm5vZGVfbGFzdCA9IE5VTEw7Ci0JdTMyIGlfYnl0ZTsKLQl1MzIgaV9iaXQ7Ci0JdW5zaWduZWQgY2hhciBzcmNfYnl0ZTsKLQotCXdoaWxlIChzcmNfb2ZmIDwgc3JjX2xlbikgewotCQlpZiAoc3JjX2xlbiAtIHNyY19vZmYgPj0gc2l6ZW9mKE1BUFRZUEUpKSB7Ci0JCQlpZiAoKihNQVBUWVBFICopJnNyY1tzcmNfb2ZmXSA9PSAwKSB7Ci0JCQkJc3JjX29mZiArPSBzaXplb2YoTUFQVFlQRSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlub2RlX2xpbWl0ID0gc2l6ZW9mKE1BUFRZUEUpOwotCQl9IGVsc2UgewotCQkJZm9yIChzcmNfYnl0ZSA9IDAsIGlfYnl0ZSA9IHNyY19vZmY7Ci0JCQkgICAgIGlfYnl0ZSA8IHNyY19sZW4gJiYgc3JjX2J5dGUgPT0gMDsKLQkJCSAgICAgaV9ieXRlKyspCi0JCQkJc3JjX2J5dGUgfD0gc3JjW2lfYnl0ZV07Ci0JCQlpZiAoc3JjX2J5dGUgPT0gMCkKLQkJCQlicmVhazsKLQkJCW5vZGVfbGltaXQgPSBzcmNfbGVuIC0gc3JjX29mZjsKLQkJfQotCi0JCW5vZGVfbmV3ID0ga3phbGxvYyhzaXplb2YoKm5vZGVfbmV3KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICh1bmxpa2VseShub2RlX25ldyA9PSBOVUxMKSkgewotCQkJZWJpdG1hcF9kZXN0cm95KGRzdCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlub2RlX25ldy0+c3RhcnRiaXQgPSBzcmNfb2ZmICogODsKLQkJZm9yIChpX2J5dGUgPSAwOyBpX2J5dGUgPCBub2RlX2xpbWl0OyBpX2J5dGUrKykgewotCQkJc3JjX2J5dGUgPSBzcmNbc3JjX29mZisrXTsKLQkJCWZvciAoaV9iaXQgPSBpX2J5dGUgKiA4OyBzcmNfYnl0ZSAhPSAwOyBpX2JpdCsrKSB7Ci0JCQkJaWYgKHNyY19ieXRlICYgMHg4MCkKLQkJCQkJbm9kZV9uZXctPm1hcCB8PSBNQVBCSVQgPDwgaV9iaXQ7Ci0JCQkJc3JjX2J5dGUgPDw9IDE7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZV9sYXN0ICE9IE5VTEwpCi0JCQlub2RlX2xhc3QtPm5leHQgPSBub2RlX25ldzsKLQkJZWxzZQotCQkJZHN0LT5ub2RlID0gbm9kZV9uZXc7Ci0JCW5vZGVfbGFzdCA9IG5vZGVfbmV3OworCWlmIChlX2l0ZXIgPT0gTlVMTCkgeworCQkqY2F0bWFwID0gTlVMTDsKKwkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGxpa2VseShub2RlX2xhc3QgIT0gTlVMTCkpCi0JCWRzdC0+aGlnaGJpdCA9IG5vZGVfbGFzdC0+c3RhcnRiaXQgKyBNQVBTSVpFOwotCWVsc2UKLQkJZWJpdG1hcF9pbml0KGRzdCk7CisJY19pdGVyID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2FsbG9jKEdGUF9BVE9NSUMpOworCWlmIChjX2l0ZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJKmNhdG1hcCA9IGNfaXRlcjsKKwljX2l0ZXItPnN0YXJ0Yml0ID0gZV9pdGVyLT5zdGFydGJpdCAmIH4oTkVUTEJMX0NBVE1BUF9TSVpFIC0gMSk7CisKKwl3aGlsZSAoZV9pdGVyICE9IE5VTEwpIHsKKwkJaWYgKGVfaXRlci0+c3RhcnRiaXQgPj0KKwkJICAgIChjX2l0ZXItPnN0YXJ0Yml0ICsgTkVUTEJMX0NBVE1BUF9TSVpFKSkgeworCQkJY19pdGVyLT5uZXh0ID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2FsbG9jKEdGUF9BVE9NSUMpOworCQkJaWYgKGNfaXRlci0+bmV4dCA9PSBOVUxMKQorCQkJCWdvdG8gbmV0bGJsX2V4cG9ydF9mYWlsdXJlOworCQkJY19pdGVyID0gY19pdGVyLT5uZXh0OworCQkJY19pdGVyLT5zdGFydGJpdCA9IGVfaXRlci0+c3RhcnRiaXQgJgorCQkJCSAgICAgICAgICAgfihORVRMQkxfQ0FUTUFQX1NJWkUgLSAxKTsKKwkJfQorCQljbWFwX2lkeCA9IChlX2l0ZXItPnN0YXJ0Yml0IC0gY19pdGVyLT5zdGFydGJpdCkgLworCQkJICAgTkVUTEJMX0NBVE1BUF9NQVBTSVpFOworCQljX2l0ZXItPmJpdG1hcFtjbWFwX2lkeF0gPSBlX2l0ZXItPm1hcDsKKwkJZV9pdGVyID0gZV9pdGVyLT5uZXh0OworCX0KIAogCXJldHVybiAwOworCituZXRsYmxfZXhwb3J0X2ZhaWx1cmU6CisJbmV0bGJsX3NlY2F0dHJfY2F0bWFwX2ZyZWUoKmNhdG1hcCk7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKKy8qKgorICogZWJpdG1hcF9uZXRsYmxfaW1wb3J0IC0gSW1wb3J0IGEgTmV0TGFiZWwgY2F0ZWdvcnkgYml0bWFwIGludG8gYW4gZWJpdG1hcAorICogQGVibWFwOiB0aGUgZWJpdG1hcCB0byBleHBvcnQKKyAqIEBjYXRtYXA6IHRoZSBOZXRMYWJlbCBjYXRlZ29yeSBiaXRtYXAKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEltcG9ydCBhIE5ldExhYmVsIGNhdGVnb3J5IGJpdG1hcCBpbnRvIGEgU0VMaW51eCBleHRlbnNpYmlsZSBiaXRtYXAuCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGVycm9yLgorICoKKyAqLworaW50IGViaXRtYXBfbmV0bGJsX2ltcG9ydChzdHJ1Y3QgZWJpdG1hcCAqZWJtYXAsCisJCQkgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjYXRtYXApCit7CisJc3RydWN0IGViaXRtYXBfbm9kZSAqZV9pdGVyID0gTlVMTDsKKwlzdHJ1Y3QgZWJpdG1hcF9ub2RlICplbWFwX3ByZXYgPSBOVUxMOworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICpjX2l0ZXIgPSBjYXRtYXA7CisJdTMyIGNfaWR4OworCisJLyogVGhpcyBmdW5jdGlvbiBpcyBhIG11Y2ggc2ltcGxlciBiZWNhdXNlIFNFTGludXgncyBNQVBUWVBFIGhhcHBlbnMKKwkgKiB0byBiZSB0aGUgc2FtZSBhcyBOZXRMYWJlbCdzIE5FVExCTF9DQVRNQVBfTUFQVFlQRSwgaWYgTUFQVFlQRSBpcworCSAqIGNoYW5nZWQgZnJvbSBhIHU2NCB0aGlzIGZ1bmN0aW9uIHdpbGwgbW9zdCBsaWtlbHkgbmVlZCB0byBiZSBjaGFuZ2VkCisJICogYXMgd2VsbC4gIEl0J3Mgbm90IGlkZWFsIGJ1dCBJIHRoaW5rIHRoZSB0cmFkZW9mZiBpbiB0ZXJtcyBvZgorCSAqIG5lYXRuZXNzIGFuZCBzcGVlZCBpcyB3b3J0aCBpdC4gKi8KKworCWRvIHsKKwkJZm9yIChjX2lkeCA9IDA7IGNfaWR4IDwgTkVUTEJMX0NBVE1BUF9NQVBDTlQ7IGNfaWR4KyspIHsKKwkJCWlmIChjX2l0ZXItPmJpdG1hcFtjX2lkeF0gPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJZV9pdGVyID0ga3phbGxvYyhzaXplb2YoKmVfaXRlciksIEdGUF9BVE9NSUMpOworCQkJaWYgKGVfaXRlciA9PSBOVUxMKQorCQkJCWdvdG8gbmV0bGJsX2ltcG9ydF9mYWlsdXJlOworCQkJaWYgKGVtYXBfcHJldiA9PSBOVUxMKQorCQkJCWVibWFwLT5ub2RlID0gZV9pdGVyOworCQkJZWxzZQorCQkJCWVtYXBfcHJldi0+bmV4dCA9IGVfaXRlcjsKKwkJCWVtYXBfcHJldiA9IGVfaXRlcjsKKworCQkJZV9pdGVyLT5zdGFydGJpdCA9IGNfaXRlci0+c3RhcnRiaXQgKworCQkJCSAgICAgICAgICAgTkVUTEJMX0NBVE1BUF9NQVBTSVpFICogY19pZHg7CisJCQllX2l0ZXItPm1hcCA9IGNfaXRlci0+Yml0bWFwW2NfaWR4XTsKKwkJfQorCQljX2l0ZXIgPSBjX2l0ZXItPm5leHQ7CisJfSB3aGlsZSAoY19pdGVyICE9IE5VTEwpOworCWlmIChlX2l0ZXIgIT0gTlVMTCkKKwkJZWJtYXAtPmhpZ2hiaXQgPSBlX2l0ZXItPnN0YXJ0Yml0ICsgTUFQU0laRTsKKwllbHNlCisJCWViaXRtYXBfZGVzdHJveShlYm1hcCk7CisKKwlyZXR1cm4gMDsKKworbmV0bGJsX2ltcG9ydF9mYWlsdXJlOgorCWViaXRtYXBfZGVzdHJveShlYm1hcCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisjZW5kaWYgLyogQ09ORklHX05FVExBQkVMICovCisKIGludCBlYml0bWFwX2NvbnRhaW5zKHN0cnVjdCBlYml0bWFwICplMSwgc3RydWN0IGViaXRtYXAgKmUyKQogewogCXN0cnVjdCBlYml0bWFwX25vZGUgKm4xLCAqbjI7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuaCBiL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5oCmluZGV4IGRhMmQ0NjUuLjEyNzBlMzQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5oCkBAIC0xNCw2ICsxNCw4IEBACiAjaWZuZGVmIF9TU19FQklUTUFQX0hfCiAjZGVmaW5lIF9TU19FQklUTUFQX0hfCiAKKyNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KKwogI2RlZmluZSBNQVBUWVBFIHU2NAkJCS8qIHBvcnRpb24gb2YgYml0bWFwIGluIGVhY2ggbm9kZSAqLwogI2RlZmluZSBNQVBTSVpFIChzaXplb2YoTUFQVFlQRSkgKiA4KQkvKiBudW1iZXIgb2YgYml0cyBpbiBub2RlIGJpdG1hcCAqLwogI2RlZmluZSBNQVBCSVQgIDFVTEwJCQkvKiBhIGJpdCBpbiB0aGUgbm9kZSBiaXRtYXAgKi8KQEAgLTY5LDE2ICs3MSwyOCBAQAogCiBpbnQgZWJpdG1hcF9jbXAoc3RydWN0IGViaXRtYXAgKmUxLCBzdHJ1Y3QgZWJpdG1hcCAqZTIpOwogaW50IGViaXRtYXBfY3B5KHN0cnVjdCBlYml0bWFwICpkc3QsIHN0cnVjdCBlYml0bWFwICpzcmMpOwotaW50IGViaXRtYXBfZXhwb3J0KGNvbnN0IHN0cnVjdCBlYml0bWFwICpzcmMsCi0JCSAgIHVuc2lnbmVkIGNoYXIgKipkc3QsCi0JCSAgIHNpemVfdCAqZHN0X2xlbik7Ci1pbnQgZWJpdG1hcF9pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotCQkgICBzaXplX3Qgc3JjX2xlbiwKLQkJICAgc3RydWN0IGViaXRtYXAgKmRzdCk7CiBpbnQgZWJpdG1hcF9jb250YWlucyhzdHJ1Y3QgZWJpdG1hcCAqZTEsIHN0cnVjdCBlYml0bWFwICplMik7CiBpbnQgZWJpdG1hcF9nZXRfYml0KHN0cnVjdCBlYml0bWFwICplLCB1bnNpZ25lZCBsb25nIGJpdCk7CiBpbnQgZWJpdG1hcF9zZXRfYml0KHN0cnVjdCBlYml0bWFwICplLCB1bnNpZ25lZCBsb25nIGJpdCwgaW50IHZhbHVlKTsKIHZvaWQgZWJpdG1hcF9kZXN0cm95KHN0cnVjdCBlYml0bWFwICplKTsKIGludCBlYml0bWFwX3JlYWQoc3RydWN0IGViaXRtYXAgKmUsIHZvaWQgKmZwKTsKIAorI2lmZGVmIENPTkZJR19ORVRMQUJFTAoraW50IGViaXRtYXBfbmV0bGJsX2V4cG9ydChzdHJ1Y3QgZWJpdG1hcCAqZWJtYXAsCisJCQkgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICoqY2F0bWFwKTsKK2ludCBlYml0bWFwX25ldGxibF9pbXBvcnQoc3RydWN0IGViaXRtYXAgKmVibWFwLAorCQkJICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBlYml0bWFwX25ldGxibF9leHBvcnQoc3RydWN0IGViaXRtYXAgKmVibWFwLAorCQkJCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHJfY2F0bWFwICoqY2F0bWFwKQoreworCXJldHVybiAtRU5PTUVNOworfQorc3RhdGljIGlubGluZSBpbnQgZWJpdG1hcF9uZXRsYmxfaW1wb3J0KHN0cnVjdCBlYml0bWFwICplYm1hcCwKKwkJCQlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyX2NhdG1hcCAqY2F0bWFwKQoreworCXJldHVybiAtRU5PTUVNOworfQorI2VuZGlmCisKICNlbmRpZgkvKiBfU1NfRUJJVE1BUF9IXyAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2hhc2h0YWIuYwppbmRleCAyNGU1ZWM5Li43N2I1MzBjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2hhc2h0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2hhc2h0YWIuYwpAQCAtOCw4ICs4LDggQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgImhhc2h0YWIuaCIKIAotc3RydWN0IGhhc2h0YWIgKmhhc2h0YWJfY3JlYXRlKHUzMiAoKmhhc2hfdmFsdWUpKHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICprZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmtleWNtcCkoc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmtleTEsIHZvaWQgKmtleTIpLAorc3RydWN0IGhhc2h0YWIgKmhhc2h0YWJfY3JlYXRlKHUzMiAoKmhhc2hfdmFsdWUpKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmtleWNtcCkoc3RydWN0IGhhc2h0YWIgKmgsIGNvbnN0IHZvaWQgKmtleTEsIGNvbnN0IHZvaWQgKmtleTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBzaXplKQogewogCXN0cnVjdCBoYXNodGFiICpwOwpAQCAtNzEsNyArNzEsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkICpoYXNodGFiX3NlYXJjaChzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5KQordm9pZCAqaGFzaHRhYl9zZWFyY2goc3RydWN0IGhhc2h0YWIgKmgsIGNvbnN0IHZvaWQgKmtleSkKIHsKIAl1MzIgaHZhbHVlOwogCXN0cnVjdCBoYXNodGFiX25vZGUgKmN1cjsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvaGFzaHRhYi5oIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmgKaW5kZXggNGNjODU4MS4uN2UyZmYzZSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9oYXNodGFiLmgKQEAgLTIyLDkgKzIyLDkgQEAKIAlzdHJ1Y3QgaGFzaHRhYl9ub2RlICoqaHRhYmxlOwkvKiBoYXNoIHRhYmxlICovCiAJdTMyIHNpemU7CQkJLyogbnVtYmVyIG9mIHNsb3RzIGluIGhhc2ggdGFibGUgKi8KIAl1MzIgbmVsOwkJCS8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovCi0JdTMyICgqaGFzaF92YWx1ZSkoc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmtleSk7CisJdTMyICgqaGFzaF92YWx1ZSkoc3RydWN0IGhhc2h0YWIgKmgsIGNvbnN0IHZvaWQgKmtleSk7CiAJCQkJCS8qIGhhc2ggZnVuY3Rpb24gKi8KLQlpbnQgKCprZXljbXApKHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICprZXkxLCB2b2lkICprZXkyKTsKKwlpbnQgKCprZXljbXApKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyKTsKIAkJCQkJLyoga2V5IGNvbXBhcmlzb24gZnVuY3Rpb24gKi8KIH07CiAKQEAgLTM5LDggKzM5LDggQEAKICAqIFJldHVybnMgTlVMTCBpZiBpbnN1ZmZpY2VudCBzcGFjZSBpcyBhdmFpbGFibGUgb3IKICAqIHRoZSBuZXcgaGFzaCB0YWJsZSBvdGhlcndpc2UuCiAgKi8KLXN0cnVjdCBoYXNodGFiICpoYXNodGFiX2NyZWF0ZSh1MzIgKCpoYXNoX3ZhbHVlKShzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCprZXljbXApKHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICprZXkxLCB2b2lkICprZXkyKSwKK3N0cnVjdCBoYXNodGFiICpoYXNodGFiX2NyZWF0ZSh1MzIgKCpoYXNoX3ZhbHVlKShzdHJ1Y3QgaGFzaHRhYiAqaCwgY29uc3Qgdm9pZCAqa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCprZXljbXApKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgc2l6ZSk7CiAKIC8qCkBAIC01OSw3ICs1OSw3IEBACiAgKiBSZXR1cm5zIE5VTEwgaWYgbm8gZW50cnkgaGFzIHRoZSBzcGVjaWZpZWQga2V5IG9yCiAgKiB0aGUgZGF0dW0gb2YgdGhlIGVudHJ5IG90aGVyd2lzZS4KICAqLwotdm9pZCAqaGFzaHRhYl9zZWFyY2goc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmspOwordm9pZCAqaGFzaHRhYl9zZWFyY2goc3RydWN0IGhhc2h0YWIgKmgsIGNvbnN0IHZvaWQgKmspOwogCiAvKgogICogRGVzdHJveXMgdGhlIHNwZWNpZmllZCBoYXNoIHRhYmxlLgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKaW5kZXggYzcxM2FmMi4uYjRmNjgyZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCkBAIC0xMyw3ICsxMyw3IEBACiAvKgogICogVXBkYXRlZDogSGV3bGV0dC1QYWNrYXJkIDxwYXVsLm1vb3JlQGhwLmNvbT4KICAqCi0gKiAgICAgIEFkZGVkIHN1cHBvcnQgdG8gaW1wb3J0L2V4cG9ydCB0aGUgTUxTIGxhYmVsCisgKiAgICAgIEFkZGVkIHN1cHBvcnQgdG8gaW1wb3J0L2V4cG9ydCB0aGUgTUxTIGxhYmVsIGZyb20gTmV0TGFiZWwKICAqCiAgKiAoYykgQ29weXJpZ2h0IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuLCAyMDA2CiAgKi8KQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KICNpbmNsdWRlICJzaWR0YWIuaCIKICNpbmNsdWRlICJtbHMuaCIKICNpbmNsdWRlICJwb2xpY3lkYi5oIgpAQCAtNTcxLDE1MiArNTcyLDEwOCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisjaWZkZWYgQ09ORklHX05FVExBQkVMCiAvKioKLSAqIG1sc19leHBvcnRfbHZsIC0gRXhwb3J0IHRoZSBNTFMgc2Vuc2l0aXZpdHkgbGV2ZWxzCisgKiBtbHNfZXhwb3J0X25ldGxibF9sdmwgLSBFeHBvcnQgdGhlIE1MUyBzZW5zaXRpdml0eSBsZXZlbHMgdG8gTmV0TGFiZWwKICAqIEBjb250ZXh0OiB0aGUgc2VjdXJpdHkgY29udGV4dAotICogQGxvdzogdGhlIGxvdyBzZW5zaXRpdml0eSBsZXZlbAotICogQGhpZ2g6IHRoZSBoaWdoIHNlbnNpdGl2aXR5IGxldmVsCisgKiBAc2VjYXR0cjogdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIEdpdmVuIHRoZSBzZWN1cml0eSBjb250ZXh0IGNvcHkgdGhlIGxvdyBNTFMgc2Vuc2l0aXZpdHkgbGV2ZWwgaW50byBsdmxfbG93Ci0gKiBhbmQgdGhlIGhpZ2ggc2Vuc2l0aXZpdHkgbGV2ZWwgaW4gbHZsX2hpZ2guICBUaGUgTUxTIGxldmVscyBhcmUgb25seQotICogZXhwb3J0ZWQgaWYgdGhlIHBvaW50ZXJzIGFyZSBub3QgTlVMTCwgaWYgdGhleSBhcmUgTlVMTCB0aGVuIHRoYXQgbGV2ZWwgaXMKLSAqIG5vdCBleHBvcnRlZC4KKyAqIEdpdmVuIHRoZSBzZWN1cml0eSBjb250ZXh0IGNvcHkgdGhlIGxvdyBNTFMgc2Vuc2l0aXZpdHkgbGV2ZWwgaW50byB0aGUKKyAqIE5ldExhYmVsIE1MUyBzZW5zaXRpdml0eSBsZXZlbCBmaWVsZC4KICAqCiAgKi8KLXZvaWQgbWxzX2V4cG9ydF9sdmwoY29uc3Qgc3RydWN0IGNvbnRleHQgKmNvbnRleHQsIHUzMiAqbG93LCB1MzIgKmhpZ2gpCit2b2lkIG1sc19leHBvcnRfbmV0bGJsX2x2bChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKKwkJCSAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7CiAJaWYgKCFzZWxpbnV4X21sc19lbmFibGVkKQogCQlyZXR1cm47CiAKLQlpZiAobG93ICE9IE5VTEwpCi0JCSpsb3cgPSBjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5zZW5zIC0gMTsKLQlpZiAoaGlnaCAhPSBOVUxMKQotCQkqaGlnaCA9IGNvbnRleHQtPnJhbmdlLmxldmVsWzFdLnNlbnMgLSAxOworCXNlY2F0dHItPm1sc19sdmwgPSBjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5zZW5zIC0gMTsKKwlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9NTFNfTFZMOwogfQogCiAvKioKLSAqIG1sc19pbXBvcnRfbHZsIC0gSW1wb3J0IHRoZSBNTFMgc2Vuc2l0aXZpdHkgbGV2ZWxzCisgKiBtbHNfaW1wb3J0X25ldGxibF9sdmwgLSBJbXBvcnQgdGhlIE5ldExhYmVsIE1MUyBzZW5zaXRpdml0eSBsZXZlbHMKICAqIEBjb250ZXh0OiB0aGUgc2VjdXJpdHkgY29udGV4dAotICogQGxvdzogdGhlIGxvdyBzZW5zaXRpdml0eSBsZXZlbAotICogQGhpZ2g6IHRoZSBoaWdoIHNlbnNpdGl2aXR5IGxldmVsCisgKiBAc2VjYXR0cjogdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIEdpdmVuIHRoZSBzZWN1cml0eSBjb250ZXh0IGFuZCB0aGUgdHdvIHNlbnNpdGl2dHkgbGV2ZWxzLCBzZXQgdGhlIE1MUyBsZXZlbHMKLSAqIGluIHRoZSBjb250ZXh0IGFjY29yZGluZyB0aGUgdHdvIGdpdmVuIGFzIHBhcmFtZXRlcnMuICBSZXR1cm5zIHplcm8gb24KLSAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICogR2l2ZW4gdGhlIHNlY3VyaXR5IGNvbnRleHQgYW5kIHRoZSBOZXRMYWJlbCBzZWN1cml0eSBhdHRyaWJ1dGVzLCBjb3B5IHRoZQorICogTmV0TGFiZWwgTUxTIHNlbnNpdGl2aXR5IGxldmVsIGludG8gdGhlIGNvbnRleHQuCiAgKgogICovCi12b2lkIG1sc19pbXBvcnRfbHZsKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LCB1MzIgbG93LCB1MzIgaGlnaCkKK3ZvaWQgbWxzX2ltcG9ydF9uZXRsYmxfbHZsKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKIHsKIAlpZiAoIXNlbGludXhfbWxzX2VuYWJsZWQpCiAJCXJldHVybjsKIAotCWNvbnRleHQtPnJhbmdlLmxldmVsWzBdLnNlbnMgPSBsb3cgKyAxOwotCWNvbnRleHQtPnJhbmdlLmxldmVsWzFdLnNlbnMgPSBoaWdoICsgMTsKKwljb250ZXh0LT5yYW5nZS5sZXZlbFswXS5zZW5zID0gc2VjYXR0ci0+bWxzX2x2bCArIDE7CisJY29udGV4dC0+cmFuZ2UubGV2ZWxbMV0uc2VucyA9IGNvbnRleHQtPnJhbmdlLmxldmVsWzBdLnNlbnM7CiB9CiAKIC8qKgotICogbWxzX2V4cG9ydF9jYXQgLSBFeHBvcnQgdGhlIE1MUyBjYXRlZ29yaWVzCisgKiBtbHNfZXhwb3J0X25ldGxibF9jYXQgLSBFeHBvcnQgdGhlIE1MUyBjYXRlZ29yaWVzIHRvIE5ldExhYmVsCiAgKiBAY29udGV4dDogdGhlIHNlY3VyaXR5IGNvbnRleHQKLSAqIEBsb3c6IHRoZSBsb3cgY2F0ZWdvcnkKLSAqIEBsb3dfbGVuOiBsZW5ndGggb2YgdGhlIGNhdF9sb3cgYml0bWFwIGluIGJ5dGVzCi0gKiBAaGlnaDogdGhlIGhpZ2ggY2F0ZWdvcnkKLSAqIEBoaWdoX2xlbjogbGVuZ3RoIG9mIHRoZSBjYXRfaGlnaCBiaXRtYXAgaW4gYnl0ZXMKKyAqIEBzZWNhdHRyOiB0aGUgTmV0TGFiZWwgc2VjdXJpdHkgYXR0cmlidXRlcwogICoKICAqIERlc2NyaXB0aW9uOgotICogR2l2ZW4gdGhlIHNlY3VyaXR5IGNvbnRleHQgZXhwb3J0IHRoZSBsb3cgTUxTIGNhdGVnb3J5IGJpdG1hcCBpbnRvIGNhdF9sb3cKLSAqIGFuZCB0aGUgaGlnaCBjYXRlZ29yeSBiaXRtYXAgaW50byBjYXRfaGlnaC4gIFRoZSBNTFMgY2F0ZWdvcmllcyBhcmUgb25seQotICogZXhwb3J0ZWQgaWYgdGhlIHBvaW50ZXJzIGFyZSBub3QgTlVMTCwgaWYgdGhleSBhcmUgTlVMTCB0aGVuIHRoYXQgbGV2ZWwgaXMKLSAqIG5vdCBleHBvcnRlZC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2liaWxlIGZvciBmcmVlaW5nIHRoZSBtZW1vcnkgd2hlbgotICogZmluaXNoZWQuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKiBHaXZlbiB0aGUgc2VjdXJpdHkgY29udGV4dCBjb3B5IHRoZSBsb3cgTUxTIGNhdGVnb3JpZXMgaW50byB0aGUgTmV0TGFiZWwKKyAqIE1MUyBjYXRlZ29yeSBmaWVsZC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBtbHNfZXhwb3J0X2NhdChjb25zdCBzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKLQkJICAgdW5zaWduZWQgY2hhciAqKmxvdywKLQkJICAgc2l6ZV90ICpsb3dfbGVuLAotCQkgICB1bnNpZ25lZCBjaGFyICoqaGlnaCwKLQkJICAgc2l6ZV90ICpoaWdoX2xlbikKK2ludCBtbHNfZXhwb3J0X25ldGxibF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JaW50IHJjID0gLUVQRVJNOworCWludCByYzsKIAogCWlmICghc2VsaW51eF9tbHNfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobG93ICE9IE5VTEwpIHsKLQkJcmMgPSBlYml0bWFwX2V4cG9ydCgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uY2F0LAotCQkJCSAgICBsb3csCi0JCQkJICAgIGxvd19sZW4pOwotCQlpZiAocmMgIT0gMCkKLQkJCWdvdG8gZXhwb3J0X2NhdF9mYWlsdXJlOwotCX0KLQlpZiAoaGlnaCAhPSBOVUxMKSB7Ci0JCXJjID0gZWJpdG1hcF9leHBvcnQoJmNvbnRleHQtPnJhbmdlLmxldmVsWzFdLmNhdCwKLQkJCQkgICAgaGlnaCwKLQkJCQkgICAgaGlnaF9sZW4pOwotCQlpZiAocmMgIT0gMCkKLQkJCWdvdG8gZXhwb3J0X2NhdF9mYWlsdXJlOwotCX0KKwlyYyA9IGViaXRtYXBfbmV0bGJsX2V4cG9ydCgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uY2F0LAorCQkJCSAgICZzZWNhdHRyLT5tbHNfY2F0KTsKKwlpZiAocmMgPT0gMCAmJiBzZWNhdHRyLT5tbHNfY2F0ICE9IE5VTEwpCisJCXNlY2F0dHItPmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX01MU19DQVQ7CiAKLQlyZXR1cm4gMDsKLQotZXhwb3J0X2NhdF9mYWlsdXJlOgotCWlmIChsb3cgIT0gTlVMTCkKLQkJa2ZyZWUoKmxvdyk7Ci0JaWYgKGhpZ2ggIT0gTlVMTCkKLQkJa2ZyZWUoKmhpZ2gpOwogCXJldHVybiByYzsKIH0KIAogLyoqCi0gKiBtbHNfaW1wb3J0X2NhdCAtIEltcG9ydCB0aGUgTUxTIGNhdGVnb3JpZXMKKyAqIG1sc19pbXBvcnRfbmV0bGJsX2NhdCAtIEltcG9ydCB0aGUgTUxTIGNhdGVnb3JpZXMgZnJvbSBOZXRMYWJlbAogICogQGNvbnRleHQ6IHRoZSBzZWN1cml0eSBjb250ZXh0Ci0gKiBAbG93OiB0aGUgbG93IGNhdGVnb3J5Ci0gKiBAbG93X2xlbjogbGVuZ3RoIG9mIHRoZSBjYXRfbG93IGJpdG1hcCBpbiBieXRlcwotICogQGhpZ2g6IHRoZSBoaWdoIGNhdGVnb3J5Ci0gKiBAaGlnaF9sZW46IGxlbmd0aCBvZiB0aGUgY2F0X2hpZ2ggYml0bWFwIGluIGJ5dGVzCisgKiBAc2VjYXR0cjogdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIEdpdmVuIHRoZSBzZWN1cml0eSBjb250ZXh0IGFuZCB0aGUgdHdvIGNhdGVnb3J5IGJpdG1hcCBzdHJpbmdzIGltcG9ydCB0aGUKLSAqIGNhdGVnb3JpZXMgaW50byB0aGUgc2VjdXJpdHkgY29udGV4dC4gIFRoZSBNTFMgY2F0ZWdvcmllcyBhcmUgb25seSBpbXBvcnRlZAotICogaWYgdGhlIHBvaW50ZXJzIGFyZSBub3QgTlVMTCwgaWYgdGhleSBhcmUgTlVMTCB0aGV5IGFyZSBza2lwcGVkLiAgUmV0dXJucwotICogemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIENvcHkgdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMgaW50byB0aGUgU0VMaW51eCBjb250ZXh0OyBzaW5jZSB0aGUKKyAqIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZSBvbmx5IGNvbnRhaW5zIGEgc2luZ2xlIE1MUyBjYXRlZ29yeSB1c2UgaXQgZm9yCisgKiBib3RoIHRoZSBsb3cgYW5kIGhpZ2ggY2F0ZWdvcmllcyBvZiB0aGUgY29udGV4dC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLAorICogbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1pbnQgbWxzX2ltcG9ydF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxvdywKLQkJICAgc2l6ZV90IGxvd19sZW4sCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhpZ2gsCi0JCSAgIHNpemVfdCBoaWdoX2xlbikKK2ludCBtbHNfaW1wb3J0X25ldGxibF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCiB7Ci0JaW50IHJjID0gLUVQRVJNOworCWludCByYzsKIAogCWlmICghc2VsaW51eF9tbHNfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobG93ICE9IE5VTEwpIHsKLQkJcmMgPSBlYml0bWFwX2ltcG9ydChsb3csCi0JCQkJICAgIGxvd19sZW4sCi0JCQkJICAgICZjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5jYXQpOwotCQlpZiAocmMgIT0gMCkKLQkJCWdvdG8gaW1wb3J0X2NhdF9mYWlsdXJlOwotCX0KLQlpZiAoaGlnaCAhPSBOVUxMKSB7Ci0JCWlmIChoaWdoID09IGxvdykKLQkJCXJjID0gZWJpdG1hcF9jcHkoJmNvbnRleHQtPnJhbmdlLmxldmVsWzFdLmNhdCwKLQkJCQkJICZjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5jYXQpOwotCQllbHNlCi0JCQlyYyA9IGViaXRtYXBfaW1wb3J0KGhpZ2gsCi0JCQkJCSAgICBoaWdoX2xlbiwKLQkJCQkJICAgICZjb250ZXh0LT5yYW5nZS5sZXZlbFsxXS5jYXQpOwotCQlpZiAocmMgIT0gMCkKLQkJCWdvdG8gaW1wb3J0X2NhdF9mYWlsdXJlOwotCX0KKwlyYyA9IGViaXRtYXBfbmV0bGJsX2ltcG9ydCgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uY2F0LAorCQkJCSAgIHNlY2F0dHItPm1sc19jYXQpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIGltcG9ydF9uZXRsYmxfY2F0X2ZhaWx1cmU7CisKKwlyYyA9IGViaXRtYXBfY3B5KCZjb250ZXh0LT5yYW5nZS5sZXZlbFsxXS5jYXQsCisJCQkgJmNvbnRleHQtPnJhbmdlLmxldmVsWzBdLmNhdCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gaW1wb3J0X25ldGxibF9jYXRfZmFpbHVyZTsKIAogCXJldHVybiAwOwogCi1pbXBvcnRfY2F0X2ZhaWx1cmU6CitpbXBvcnRfbmV0bGJsX2NhdF9mYWlsdXJlOgogCWViaXRtYXBfZGVzdHJveSgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uY2F0KTsKIAllYml0bWFwX2Rlc3Ryb3koJmNvbnRleHQtPnJhbmdlLmxldmVsWzFdLmNhdCk7CiAJcmV0dXJuIHJjOwogfQorI2VuZGlmIC8qIENPTkZJR19ORVRMQUJFTCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuaCBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmgKaW5kZXggZGY2MDMyYzYuLjY2MWQ2ZmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuaApAQCAtMTMsNyArMTMsNyBAQAogLyoKICAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bC5tb29yZUBocC5jb20+CiAgKgotICogICAgICBBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE1MUyBsYWJlbAorICogICAgICBBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE1MUyBsYWJlbCBmcm9tIE5ldExhYmVsCiAgKgogICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNgogICovCkBAIC02OSwxOSArNjksMzcgQEAKIGludCBtbHNfc2V0dXBfdXNlcl9yYW5nZShzdHJ1Y3QgY29udGV4dCAqZnJvbWNvbiwgc3RydWN0IHVzZXJfZGF0dW0gKnVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbnRleHQgKnVzZXJjb24pOwogCi12b2lkIG1sc19leHBvcnRfbHZsKGNvbnN0IHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LCB1MzIgKmxvdywgdTMyICpoaWdoKTsKLXZvaWQgbWxzX2ltcG9ydF9sdmwoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsIHUzMiBsb3csIHUzMiBoaWdoKTsKLQotaW50IG1sc19leHBvcnRfY2F0KGNvbnN0IHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAotCQkgICB1bnNpZ25lZCBjaGFyICoqbG93LAotCQkgICBzaXplX3QgKmxvd19sZW4sCi0JCSAgIHVuc2lnbmVkIGNoYXIgKipoaWdoLAotCQkgICBzaXplX3QgKmhpZ2hfbGVuKTsKLWludCBtbHNfaW1wb3J0X2NhdChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKLQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqbG93LAotCQkgICBzaXplX3QgbG93X2xlbiwKLQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGlnaCwKLQkJICAgc2l6ZV90IGhpZ2hfbGVuKTsKKyNpZmRlZiBDT05GSUdfTkVUTEFCRUwKK3ZvaWQgbWxzX2V4cG9ydF9uZXRsYmxfbHZsKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cik7Cit2b2lkIG1sc19pbXBvcnRfbmV0bGJsX2x2bChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKKwkJCSAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpOworaW50IG1sc19leHBvcnRfbmV0bGJsX2NhdChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKKwkJCSAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cik7CitpbnQgbWxzX2ltcG9ydF9uZXRsYmxfY2F0KHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJICBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbWxzX2V4cG9ydF9uZXRsYmxfbHZsKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJCQkgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbWxzX2ltcG9ydF9uZXRsYmxfbHZsKHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAorCQkJCQkgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIGludCBtbHNfZXhwb3J0X25ldGxibF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkJCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJcmV0dXJuIC1FTk9NRU07Cit9CitzdGF0aWMgaW5saW5lIGludCBtbHNfaW1wb3J0X25ldGxibF9jYXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCisJCQkJCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpCit7CisJcmV0dXJuIC1FTk9NRU07Cit9CisjZW5kaWYKIAogI2VuZGlmCS8qIF9TU19NTFNfSCAqLwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKaW5kZXggYmE0ODk2MS4uY2Q3OWM2MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwpAQCAtNDY4LDcgKzQ2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2xhc3NfZGVzdHJveSh2b2lkICprZXksIHZvaWQgKmRhdHVtLCB2b2lkICpwKQorc3RhdGljIGludCBjbHNfZGVzdHJveSh2b2lkICprZXksIHZvaWQgKmRhdHVtLCB2b2lkICpwKQogewogCXN0cnVjdCBjbGFzc19kYXR1bSAqY2xhZGF0dW07CiAJc3RydWN0IGNvbnN0cmFpbnRfbm9kZSAqY29uc3RyYWludCwgKmN0ZW1wOwpAQCAtNTY2LDcgKzU2Niw3IEBACiBzdGF0aWMgaW50ICgqZGVzdHJveV9mW1NZTV9OVU1dKSAodm9pZCAqa2V5LCB2b2lkICpkYXR1bSwgdm9pZCAqZGF0YXApID0KIHsKIAljb21tb25fZGVzdHJveSwKLQljbGFzc19kZXN0cm95LAorCWNsc19kZXN0cm95LAogCXJvbGVfZGVzdHJveSwKIAl0eXBlX2Rlc3Ryb3ksCiAJdXNlcl9kZXN0cm95LApAQCAtMTEyNCw3ICsxMTI0LDcgQEAKIG91dDoKIAlyZXR1cm4gcmM7CiBiYWQ6Ci0JY2xhc3NfZGVzdHJveShrZXksIGNsYWRhdHVtLCBOVUxMKTsKKwljbHNfZGVzdHJveShrZXksIGNsYWRhdHVtLCBOVUxMKTsKIAlnb3RvIG91dDsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCmluZGV4IDE4Mjc0YjAuLmJkYjcwNzAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKQEAgLTE3LDkgKzE3LDEzIEBACiAgKgogICogICAgICBBZGRlZCBzdXBwb3J0IGZvciBOZXRMYWJlbAogICoKKyAqIFVwZGF0ZWQ6IENoYWQgU2VsbGVycyA8Y3NlbGxlcnNAdHJlc3lzLmNvbT4KKyAqCisgKiAgQWRkZWQgdmFsaWRhdGlvbiBvZiBrZXJuZWwgY2xhc3NlcyBhbmQgcGVybWlzc2lvbnMKKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KICAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFRydXN0ZWQgQ29tcHV0ZXIgU29sdXRpb25zLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA0IFRyZXN5cyBUZWNobm9sb2d5LCBMTEMKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDQsIDIwMDYgVHJlc3lzIFRlY2hub2xvZ3ksIExMQwogICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4sIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI5LDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNDksMTAgKzU0LDE3IEBACiAjaW5jbHVkZSAibWxzLmgiCiAjaW5jbHVkZSAib2Jqc2VjLmgiCiAjaW5jbHVkZSAic2VsaW51eF9uZXRsYWJlbC5oIgorI2luY2x1ZGUgInhmcm0uaCIKKyNpbmNsdWRlICJlYml0bWFwLmgiCiAKIGV4dGVybiB2b2lkIHNlbG5sX25vdGlmeV9wb2xpY3lsb2FkKHUzMiBzZXFubyk7CiB1bnNpZ25lZCBpbnQgcG9saWN5ZGJfbG9hZGVkX3ZlcnNpb247CiAKKy8qCisgKiBUaGlzIGlzIGRlY2xhcmVkIGluIGF2Yy5jCisgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2VsaW51eF9jbGFzc19wZXJtIHNlbGludXhfY2xhc3NfcGVybTsKKwogc3RhdGljIERFRklORV9SV0xPQ0socG9saWN5X3J3bG9jayk7CiAjZGVmaW5lIFBPTElDWV9SRExPQ0sgcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKQogI2RlZmluZSBQT0xJQ1lfV1JMT0NLIHdyaXRlX2xvY2tfaXJxKCZwb2xpY3lfcndsb2NrKQpAQCAtMTAxOSw4NiArMTAzMSwxMTIgQEAKIH0KIAogLyoKLSAqIFZlcmlmeSB0aGF0IGVhY2ggcGVybWlzc2lvbiB0aGF0IGlzIGRlZmluZWQgdW5kZXIgdGhlCi0gKiBleGlzdGluZyBwb2xpY3kgaXMgc3RpbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHZhbHVlCi0gKiBpbiB0aGUgbmV3IHBvbGljeS4KKyAqIFZlcmlmeSB0aGF0IGVhY2gga2VybmVsIGNsYXNzIHRoYXQgaXMgZGVmaW5lZCBpbiB0aGUKKyAqIHBvbGljeSBpcyBjb3JyZWN0CiAgKi8KLXN0YXRpYyBpbnQgdmFsaWRhdGVfcGVybSh2b2lkICprZXksIHZvaWQgKmRhdHVtLCB2b2lkICpwKQorc3RhdGljIGludCB2YWxpZGF0ZV9jbGFzc2VzKHN0cnVjdCBwb2xpY3lkYiAqcCkKIHsKLQlzdHJ1Y3QgaGFzaHRhYiAqaDsKLQlzdHJ1Y3QgcGVybV9kYXR1bSAqcGVyZGF0dW0sICpwZXJkYXR1bTI7Ci0JaW50IHJjID0gMDsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgY2xhc3NfZGF0dW0gKmNsYWRhdHVtOworCXN0cnVjdCBwZXJtX2RhdHVtICpwZXJkYXR1bTsKKwl1MzIgbnByaW0sIHRtcCwgY29tbW9uX3B0c19sZW4sIHBlcm1fdmFsLCBwb2xfdmFsOworCXUxNiBjbGFzc192YWw7CisJY29uc3Qgc3RydWN0IHNlbGludXhfY2xhc3NfcGVybSAqa2RlZnMgPSAmc2VsaW51eF9jbGFzc19wZXJtOworCWNvbnN0IGNoYXIgKmRlZl9jbGFzcywgKmRlZl9wZXJtLCAqcG9sX2NsYXNzOworCXN0cnVjdCBzeW10YWIgKnBlcm1zOwogCi0KLQloID0gcDsKLQlwZXJkYXR1bSA9IGRhdHVtOwotCi0JcGVyZGF0dW0yID0gaGFzaHRhYl9zZWFyY2goaCwga2V5KTsKLQlpZiAoIXBlcmRhdHVtMikgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgcGVybWlzc2lvbiAlcyBkaXNhcHBlYXJlZCIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci0JCXJjID0gLUVOT0VOVDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChwZXJkYXR1bS0+dmFsdWUgIT0gcGVyZGF0dW0yLT52YWx1ZSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgdGhlIHZhbHVlIG9mIHBlcm1pc3Npb24gJXMgY2hhbmdlZCIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogVmVyaWZ5IHRoYXQgZWFjaCBjbGFzcyB0aGF0IGlzIGRlZmluZWQgdW5kZXIgdGhlCi0gKiBleGlzdGluZyBwb2xpY3kgaXMgc3RpbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lCi0gKiBhdHRyaWJ1dGVzIGluIHRoZSBuZXcgcG9saWN5LgotICovCi1zdGF0aWMgaW50IHZhbGlkYXRlX2NsYXNzKHZvaWQgKmtleSwgdm9pZCAqZGF0dW0sIHZvaWQgKnApCi17Ci0Jc3RydWN0IHBvbGljeWRiICpuZXdwOwotCXN0cnVjdCBjbGFzc19kYXR1bSAqY2xhZGF0dW0sICpjbGFkYXR1bTI7Ci0JaW50IHJjOwotCi0JbmV3cCA9IHA7Ci0JY2xhZGF0dW0gPSBkYXR1bTsKLQotCWNsYWRhdHVtMiA9IGhhc2h0YWJfc2VhcmNoKG5ld3AtPnBfY2xhc3Nlcy50YWJsZSwga2V5KTsKLQlpZiAoIWNsYWRhdHVtMikgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgY2xhc3MgJXMgZGlzYXBwZWFyZWRcbiIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci0JCXJjID0gLUVOT0VOVDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChjbGFkYXR1bS0+dmFsdWUgIT0gY2xhZGF0dW0yLT52YWx1ZSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgdGhlIHZhbHVlIG9mIGNsYXNzICVzIGNoYW5nZWRcbiIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICgoY2xhZGF0dW0tPmNvbWRhdHVtICYmICFjbGFkYXR1bTItPmNvbWRhdHVtKSB8fAotCSAgICAoIWNsYWRhdHVtLT5jb21kYXR1bSAmJiBjbGFkYXR1bTItPmNvbWRhdHVtKSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgdGhlIGluaGVyaXRzIGNsYXVzZSBmb3IgdGhlIGFjY2VzcyAiCi0JCSAgICAgICAidmVjdG9yIGRlZmluaXRpb24gZm9yIGNsYXNzICVzIGNoYW5nZWRcbiIsIChjaGFyICopa2V5KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGNsYWRhdHVtLT5jb21kYXR1bSkgewotCQlyYyA9IGhhc2h0YWJfbWFwKGNsYWRhdHVtLT5jb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIHZhbGlkYXRlX3Blcm0sCi0JCSAgICAgICAgICAgICAgICAgY2xhZGF0dW0yLT5jb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUpOwotCQlpZiAocmMpIHsKLQkJCXByaW50aygiIGluIHRoZSBhY2Nlc3MgdmVjdG9yIGRlZmluaXRpb24gZm9yIGNsYXNzICIKLQkJCSAgICAgICAiJXNcbiIsIChjaGFyICopa2V5KTsKLQkJCWdvdG8gb3V0OworCWZvciAoaSA9IDE7IGkgPCBrZGVmcy0+Y3RzX2xlbjsgaSsrKSB7CisJCWRlZl9jbGFzcyA9IGtkZWZzLT5jbGFzc190b19zdHJpbmdbaV07CisJCWlmIChpID4gcC0+cF9jbGFzc2VzLm5wcmltKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgInNlY3VyaXR5OiAgY2xhc3MgJXMgbm90IGRlZmluZWQgaW4gcG9saWN5XG4iLAorCQkJICAgICAgIGRlZl9jbGFzcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlwb2xfY2xhc3MgPSBwLT5wX2NsYXNzX3ZhbF90b19uYW1lW2ktMV07CisJCWlmIChzdHJjbXAocG9sX2NsYXNzLCBkZWZfY2xhc3MpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic2VjdXJpdHk6ICBjbGFzcyAlZCBpcyBpbmNvcnJlY3QsIGZvdW5kICVzIGJ1dCBzaG91bGQgYmUgJXNcbiIsCisJCQkgICAgICAgaSwgcG9sX2NsYXNzLCBkZWZfY2xhc3MpOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9Ci0JcmMgPSBoYXNodGFiX21hcChjbGFkYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIHZhbGlkYXRlX3Blcm0sCi0JICAgICAgICAgICAgICAgICBjbGFkYXR1bTItPnBlcm1pc3Npb25zLnRhYmxlKTsKLQlpZiAocmMpCi0JCXByaW50aygiIGluIGFjY2VzcyB2ZWN0b3IgZGVmaW5pdGlvbiBmb3IgY2xhc3MgJXNcbiIsCi0JCSAgICAgICAoY2hhciAqKWtleSk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCWZvciAoaSA9IDA7IGkgPCBrZGVmcy0+YXZfcHRzX2xlbjsgaSsrKSB7CisJCWNsYXNzX3ZhbCA9IGtkZWZzLT5hdl9wZXJtX3RvX3N0cmluZ1tpXS50Y2xhc3M7CisJCXBlcm1fdmFsID0ga2RlZnMtPmF2X3Blcm1fdG9fc3RyaW5nW2ldLnZhbHVlOworCQlkZWZfcGVybSA9IGtkZWZzLT5hdl9wZXJtX3RvX3N0cmluZ1tpXS5uYW1lOworCQlpZiAoY2xhc3NfdmFsID4gcC0+cF9jbGFzc2VzLm5wcmltKQorCQkJY29udGludWU7CisJCXBvbF9jbGFzcyA9IHAtPnBfY2xhc3NfdmFsX3RvX25hbWVbY2xhc3NfdmFsLTFdOworCQljbGFkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHAtPnBfY2xhc3Nlcy50YWJsZSwgcG9sX2NsYXNzKTsKKwkJQlVHX09OKCFjbGFkYXR1bSk7CisJCXBlcm1zID0gJmNsYWRhdHVtLT5wZXJtaXNzaW9uczsKKwkJbnByaW0gPSAxIDw8IChwZXJtcy0+bnByaW0gLSAxKTsKKwkJaWYgKHBlcm1fdmFsID4gbnByaW0pIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAic2VjdXJpdHk6ICBwZXJtaXNzaW9uICVzIGluIGNsYXNzICVzIG5vdCBkZWZpbmVkIGluIHBvbGljeVxuIiwKKwkJCSAgICAgICBkZWZfcGVybSwgcG9sX2NsYXNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBlcmRhdHVtID0gaGFzaHRhYl9zZWFyY2gocGVybXMtPnRhYmxlLCBkZWZfcGVybSk7CisJCWlmIChwZXJkYXR1bSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic2VjdXJpdHk6ICBwZXJtaXNzaW9uICVzIGluIGNsYXNzICVzIG5vdCBmb3VuZCBpbiBwb2xpY3lcbiIsCisJCQkgICAgICAgZGVmX3Blcm0sIHBvbF9jbGFzcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwb2xfdmFsID0gMSA8PCAocGVyZGF0dW0tPnZhbHVlIC0gMSk7CisJCWlmIChwb2xfdmFsICE9IHBlcm1fdmFsKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic2VjdXJpdHk6ICBwZXJtaXNzaW9uICVzIGluIGNsYXNzICVzIGhhcyBpbmNvcnJlY3QgdmFsdWVcbiIsCisJCQkgICAgICAgZGVmX3Blcm0sIHBvbF9jbGFzcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwga2RlZnMtPmF2X2luaGVyaXRfbGVuOyBpKyspIHsKKwkJY2xhc3NfdmFsID0ga2RlZnMtPmF2X2luaGVyaXRbaV0udGNsYXNzOworCQlpZiAoY2xhc3NfdmFsID4gcC0+cF9jbGFzc2VzLm5wcmltKQorCQkJY29udGludWU7CisJCXBvbF9jbGFzcyA9IHAtPnBfY2xhc3NfdmFsX3RvX25hbWVbY2xhc3NfdmFsLTFdOworCQljbGFkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHAtPnBfY2xhc3Nlcy50YWJsZSwgcG9sX2NsYXNzKTsKKwkJQlVHX09OKCFjbGFkYXR1bSk7CisJCWlmICghY2xhZGF0dW0tPmNvbWRhdHVtKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAic2VjdXJpdHk6ICBjbGFzcyAlcyBzaG91bGQgaGF2ZSBhbiBpbmhlcml0cyBjbGF1c2UgYnV0IGRvZXMgbm90XG4iLAorCQkJICAgICAgIHBvbF9jbGFzcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl0bXAgPSBrZGVmcy0+YXZfaW5oZXJpdFtpXS5jb21tb25fYmFzZTsKKwkJY29tbW9uX3B0c19sZW4gPSAwOworCQl3aGlsZSAoISh0bXAgJiAweDAxKSkgeworCQkJY29tbW9uX3B0c19sZW4rKzsKKwkJCXRtcCA+Pj0gMTsKKwkJfQorCQlwZXJtcyA9ICZjbGFkYXR1bS0+Y29tZGF0dW0tPnBlcm1pc3Npb25zOworCQlmb3IgKGogPSAwOyBqIDwgY29tbW9uX3B0c19sZW47IGorKykgeworCQkJZGVmX3Blcm0gPSBrZGVmcy0+YXZfaW5oZXJpdFtpXS5jb21tb25fcHRzW2pdOworCQkJaWYgKGogPj0gcGVybXMtPm5wcmltKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAic2VjdXJpdHk6ICBwZXJtaXNzaW9uICVzIGluIGNsYXNzICVzIG5vdCBkZWZpbmVkIGluIHBvbGljeVxuIiwKKwkJCQkgICAgICAgZGVmX3Blcm0sIHBvbF9jbGFzcyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwZXJkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHBlcm1zLT50YWJsZSwgZGVmX3Blcm0pOworCQkJaWYgKHBlcmRhdHVtID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInNlY3VyaXR5OiAgcGVybWlzc2lvbiAlcyBpbiBjbGFzcyAlcyBub3QgZm91bmQgaW4gcG9saWN5XG4iLAorCQkJCSAgICAgICBkZWZfcGVybSwgcG9sX2NsYXNzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChwZXJkYXR1bS0+dmFsdWUgIT0gaiArIDEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInNlY3VyaXR5OiAgcGVybWlzc2lvbiAlcyBpbiBjbGFzcyAlcyBoYXMgaW5jb3JyZWN0IHZhbHVlXG4iLAorCQkJCSAgICAgICBkZWZfcGVybSwgcG9sX2NsYXNzKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKIH0KIAogLyogQ2xvbmUgdGhlIFNJRCBpbnRvIHRoZSBuZXcgU0lEIHRhYmxlLiAqLwpAQCAtMTI0Myw2ICsxMjgxLDE2IEBACiAJCQlhdnRhYl9jYWNoZV9kZXN0cm95KCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQkvKiBWZXJpZnkgdGhhdCB0aGUga2VybmVsIGRlZmluZWQgY2xhc3NlcyBhcmUgY29ycmVjdC4gKi8KKwkJaWYgKHZhbGlkYXRlX2NsYXNzZXMoJnBvbGljeWRiKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInNlY3VyaXR5OiAgdGhlIGRlZmluaXRpb24gb2YgYSBjbGFzcyBpcyBpbmNvcnJlY3RcbiIpOworCQkJTE9BRF9VTkxPQ0s7CisJCQlzaWR0YWJfZGVzdHJveSgmc2lkdGFiKTsKKwkJCXBvbGljeWRiX2Rlc3Ryb3koJnBvbGljeWRiKTsKKwkJCWF2dGFiX2NhY2hlX2Rlc3Ryb3koKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCXBvbGljeWRiX2xvYWRlZF92ZXJzaW9uID0gcG9saWN5ZGIucG9saWN5dmVyczsKIAkJc3NfaW5pdGlhbGl6ZWQgPSAxOwogCQlzZXFubyA9ICsrbGF0ZXN0X2dyYW50aW5nOwpAQCAtMTI2NSwxMCArMTMxMywxMCBAQAogCiAJc2lkdGFiX2luaXQoJm5ld3NpZHRhYik7CiAKLQkvKiBWZXJpZnkgdGhhdCB0aGUgZXhpc3RpbmcgY2xhc3NlcyBkaWQgbm90IGNoYW5nZS4gKi8KLQlpZiAoaGFzaHRhYl9tYXAocG9saWN5ZGIucF9jbGFzc2VzLnRhYmxlLCB2YWxpZGF0ZV9jbGFzcywgJm5ld3BvbGljeWRiKSkgewotCQlwcmludGsoS0VSTl9FUlIgInNlY3VyaXR5OiAgdGhlIGRlZmluaXRpb24gb2YgYW4gZXhpc3RpbmcgIgotCQkgICAgICAgImNsYXNzIGNoYW5nZWRcbiIpOworCS8qIFZlcmlmeSB0aGF0IHRoZSBrZXJuZWwgZGVmaW5lZCBjbGFzc2VzIGFyZSBjb3JyZWN0LiAqLworCWlmICh2YWxpZGF0ZV9jbGFzc2VzKCZuZXdwb2xpY3lkYikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAic2VjdXJpdHk6ICB0aGUgZGVmaW5pdGlvbiBvZiBhIGNsYXNzIGlzIGluY29ycmVjdFxuIik7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CiAJfQpAQCAtMjE0NSw2ICsyMTkzLDMyIEBACiAJYXVydWxlX2NhbGxiYWNrID0gY2FsbGJhY2s7CiB9CiAKKy8qKgorICogc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQgLSBEZXRlcm1pbmUgdGhlIGV4dGVybmFsIGxhYmVsIG9mIGEgcGFja2V0CisgKiBAc2tiOiB0aGUgcGFja2V0CisgKiBAYmFzZV9zaWQ6IHRoZSBTRUxpbnV4IFNJRCB0byB1c2UgYXMgYSBjb250ZXh0IGZvciBNTFMgb25seSBleHRlcm5hbCBsYWJlbHMKKyAqIEBzaWQ6IHRoZSBwYWNrZXQncyBTSUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrIHRoZSB2YXJpb3VzIGRpZmZlcmVudCBmb3JtcyBvZiBleHRlcm5hbCBwYWNrZXQgbGFiZWxpbmcgYW5kIGRldGVybWluZQorICogdGhlIGV4dGVybmFsIFNJRCBmb3IgdGhlIHBhY2tldC4KKyAqCisgKi8KK3ZvaWQgc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGJhc2Vfc2lkLCB1MzIgKnNpZCkKK3sKKwl1MzIgeGZybV9zaWQ7CisJdTMyIG5sYmxfc2lkOworCisJc2VsaW51eF9za2JfeGZybV9zaWQoc2tiLCAmeGZybV9zaWQpOworCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHNrYiwKKwkJCQkJICh4ZnJtX3NpZCA9PSBTRUNTSURfTlVMTCA/CisJCQkJCSAgYmFzZV9zaWQgOiB4ZnJtX3NpZCksCisJCQkJCSAmbmxibF9zaWQpICE9IDApCisJCW5sYmxfc2lkID0gU0VDU0lEX05VTEw7CisKKwkqc2lkID0gKG5sYmxfc2lkID09IFNFQ1NJRF9OVUxMID8geGZybV9zaWQgOiBubGJsX3NpZCk7Cit9CisKICNpZmRlZiBDT05GSUdfTkVUTEFCRUwKIC8qCiAgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2Ugc3RvcmUgaW5zaWRlIHRoZSBOZXRMYWJlbCBjYWNoZSBibG9jay4KQEAgLTIyMDksOCArMjI4Myw2IEBACiAJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLAlHRlBfQVRPTUlDKTsKIAlpZiAoY2FjaGUgPT0gTlVMTCkKIAkJZ290byBuZXRsYmxfY2FjaGVfYWRkX3JldHVybjsKLQlzZWNhdHRyLmNhY2hlLT5mcmVlID0gc2VsaW51eF9uZXRsYmxfY2FjaGVfZnJlZTsKLQlzZWNhdHRyLmNhY2hlLT5kYXRhID0gKHZvaWQgKiljYWNoZTsKIAogCWNhY2hlLT50eXBlID0gTkVUTEJMX0NBQ0hFX1RfTUxTOwogCWlmIChlYml0bWFwX2NweSgmY2FjaGUtPmRhdGEubWxzX2xhYmVsLmxldmVsWzBdLmNhdCwKQEAgLTIyMjMsNiArMjI5NSwxMCBAQAogCWNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFswXS5zZW5zID0gY3R4LT5yYW5nZS5sZXZlbFswXS5zZW5zOwogCWNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFsxXS5zZW5zID0gY3R4LT5yYW5nZS5sZXZlbFswXS5zZW5zOwogCisJc2VjYXR0ci5jYWNoZS0+ZnJlZSA9IHNlbGludXhfbmV0bGJsX2NhY2hlX2ZyZWU7CisJc2VjYXR0ci5jYWNoZS0+ZGF0YSA9ICh2b2lkICopY2FjaGU7CisJc2VjYXR0ci5mbGFncyA9IE5FVExCTF9TRUNBVFRSX0NBQ0hFOworCiAJbmV0bGJsX2NhY2hlX2FkZChza2IsICZzZWNhdHRyKTsKIAogbmV0bGJsX2NhY2hlX2FkZF9yZXR1cm46CkBAIC0yMjY4LDcgKzIzNDQsNyBAQAogCiAJUE9MSUNZX1JETE9DSzsKIAotCWlmIChzZWNhdHRyLT5jYWNoZSkgeworCWlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX0NBQ0hFKSB7CiAJCWNhY2hlID0gTkVUTEJMX0NBQ0hFKHNlY2F0dHItPmNhY2hlLT5kYXRhKTsKIAkJc3dpdGNoIChjYWNoZS0+dHlwZSkgewogCQljYXNlIE5FVExCTF9DQUNIRV9UX1NJRDoKQEAgLTIzMDEsNyArMjM3Nyw3IEBACiAJCWRlZmF1bHQ6CiAJCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm47CiAJCX0KLQl9IGVsc2UgaWYgKHNlY2F0dHItPm1sc19sdmxfdmxkKSB7CisJfSBlbHNlIGlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpIHsKIAkJY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBiYXNlX3NpZCk7CiAJCWlmIChjdHggPT0gTlVMTCkKIAkJCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybjsKQEAgLTIzMDksMTMgKzIzODUsMTAgQEAKIAkJY3R4X25ldy51c2VyID0gY3R4LT51c2VyOwogCQljdHhfbmV3LnJvbGUgPSBjdHgtPnJvbGU7CiAJCWN0eF9uZXcudHlwZSA9IGN0eC0+dHlwZTsKLQkJbWxzX2ltcG9ydF9sdmwoJmN0eF9uZXcsIHNlY2F0dHItPm1sc19sdmwsIHNlY2F0dHItPm1sc19sdmwpOwotCQlpZiAoc2VjYXR0ci0+bWxzX2NhdCkgewotCQkJaWYgKG1sc19pbXBvcnRfY2F0KCZjdHhfbmV3LAotCQkJCQkgICBzZWNhdHRyLT5tbHNfY2F0LAotCQkJCQkgICBzZWNhdHRyLT5tbHNfY2F0X2xlbiwKLQkJCQkJICAgTlVMTCwKLQkJCQkJICAgMCkgIT0gMCkKKwkJbWxzX2ltcG9ydF9uZXRsYmxfbHZsKCZjdHhfbmV3LCBzZWNhdHRyKTsKKwkJaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgeworCQkJaWYgKGViaXRtYXBfbmV0bGJsX2ltcG9ydCgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQsCisJCQkJCQkgIHNlY2F0dHItPm1sc19jYXQpICE9IDApCiAJCQkJZ290byBuZXRsYmxfc2VjYXR0cl90b19zaWRfcmV0dXJuOwogCQkJY3R4X25ldy5yYW5nZS5sZXZlbFsxXS5jYXQuaGlnaGJpdCA9CiAJCQkJY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQuaGlnaGJpdDsKQEAgLTIzNjAsMjAgKzI0MzMsMjAgQEAKICAqIGFzc2lnbiB0byB0aGUgcGFja2V0LiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgogICoKICAqLwotc3RhdGljIGludCBzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCXUzMiBiYXNlX3NpZCwKLQkJCQkJdTMyICpzaWQpCitpbnQgc2VsaW51eF9uZXRsYmxfc2tidWZmX2dldHNpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYmFzZV9zaWQsIHUzMiAqc2lkKQogewogCWludCByYzsKIAlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyIHNlY2F0dHI7CiAKIAluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKIAlyYyA9IG5ldGxibF9za2J1ZmZfZ2V0YXR0cihza2IsICZzZWNhdHRyKTsKLQlpZiAocmMgPT0gMCkKKwlpZiAocmMgPT0gMCAmJiBzZWNhdHRyLmZsYWdzICE9IE5FVExCTF9TRUNBVFRSX05PTkUpCiAJCXJjID0gc2VsaW51eF9uZXRsYmxfc2VjYXR0cl90b19zaWQoc2tiLAogCQkJCQkJICAgJnNlY2F0dHIsCiAJCQkJCQkgICBiYXNlX3NpZCwKIAkJCQkJCSAgIHNpZCk7CisJZWxzZQorCQkqc2lkID0gU0VDU0lEX05VTEw7CiAJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CiAKIAlyZXR1cm4gcmM7CkBAIC0yMzg2LDcgKzI0NTksOSBAQAogICoKICAqIERlc2NyaXB0aW9uOgogICogQXR0ZW1wdCB0byBsYWJlbCBhIHNvY2tldCB1c2luZyB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHVzaW5nIHRoZSBnaXZlbgotICogU0lELiAgUmV0dXJucyB6ZXJvIHZhbHVlcyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIFNJRC4gIFJldHVybnMgemVybyB2YWx1ZXMgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuICBUaGUKKyAqIGNhbGxlciBpcyByZXNwb25zaWJpbGUgZm9yIGNhbGxpbmcgcmN1X3JlYWRfbG9jaygpIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqIHRoaXMgZnVuY3Rpb24gYW5kIHJjdV9yZWFkX3VubG9jaygpIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqCiAgKi8KIHN0YXRpYyBpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNpZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1MzIgc2lkKQpAQCAtMjM5OSwzNSArMjQ3NCw1NSBAQAogCWlmICghc3NfaW5pdGlhbGl6ZWQpCiAJCXJldHVybiAwOwogCisJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CisKIAlQT0xJQ1lfUkRMT0NLOwogCiAJY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBzaWQpOwogCWlmIChjdHggPT0gTlVMTCkKIAkJZ290byBuZXRsYmxfc29ja2V0X3NldHNpZF9yZXR1cm47CiAKLQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKIAlzZWNhdHRyLmRvbWFpbiA9IGtzdHJkdXAocG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2N0eC0+dHlwZSAtIDFdLAogCQkJCSBHRlBfQVRPTUlDKTsKLQltbHNfZXhwb3J0X2x2bChjdHgsICZzZWNhdHRyLm1sc19sdmwsIE5VTEwpOwotCXNlY2F0dHIubWxzX2x2bF92bGQgPSAxOwotCW1sc19leHBvcnRfY2F0KGN0eCwKLQkJICAgICAgICZzZWNhdHRyLm1sc19jYXQsCi0JCSAgICAgICAmc2VjYXR0ci5tbHNfY2F0X2xlbiwKLQkJICAgICAgIE5VTEwsCi0JCSAgICAgICBOVUxMKTsKKwlzZWNhdHRyLmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX0RPTUFJTjsKKwltbHNfZXhwb3J0X25ldGxibF9sdmwoY3R4LCAmc2VjYXR0cik7CisJcmMgPSBtbHNfZXhwb3J0X25ldGxibF9jYXQoY3R4LCAmc2VjYXR0cik7CisJaWYgKHJjICE9IDApCisJCWdvdG8gbmV0bGJsX3NvY2tldF9zZXRzaWRfcmV0dXJuOwogCiAJcmMgPSBuZXRsYmxfc29ja2V0X3NldGF0dHIoc29jaywgJnNlY2F0dHIpOwotCWlmIChyYyA9PSAwKQorCWlmIChyYyA9PSAwKSB7CisJCXNwaW5fbG9jaygmc2tzZWMtPm5sYmxfbG9jayk7CiAJCXNrc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9MQUJFTEVEOwotCi0JbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisJCXNwaW5fdW5sb2NrKCZza3NlYy0+bmxibF9sb2NrKTsKKwl9CiAKIG5ldGxibF9zb2NrZXRfc2V0c2lkX3JldHVybjoKIAlQT0xJQ1lfUkRVTkxPQ0s7CisJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CiAJcmV0dXJuIHJjOwogfQogCiAvKioKKyAqIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0IC0gUmVzZXQgdGhlIE5ldExhYmVsIGZpZWxkcworICogQHNzZWM6IHRoZSBza19zZWN1cml0eV9zdHJ1Y3QKKyAqIEBmYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5CisgKgorICogRGVzY3JpcHRpb246CisgKiBDYWxsZWQgd2hlbiB0aGUgTmV0TGFiZWwgc3RhdGUgb2YgYSBza19zZWN1cml0eV9zdHJ1Y3QgbmVlZHMgdG8gYmUgcmVzZXQuCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmlsZSBmb3IgYWxsIHRoZSBOZXRMYWJlbCBza19zZWN1cml0eV9zdHJ1Y3QgbG9ja2luZy4KKyAqCisgKi8KK3ZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKKwkJCQkgICAgICBpbnQgZmFtaWx5KQoreworICAgICAgICBpZiAoZmFtaWx5ID09IFBGX0lORVQpCisJCXNzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1JFUVVJUkU7CisJZWxzZQorCQlzc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9VTlNFVDsKK30KKworLyoqCiAgKiBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9pbml0IC0gU2V0dXAgdGhlIE5ldExhYmVsIGZpZWxkcwogICogQHNzZWM6IHRoZSBza19zZWN1cml0eV9zdHJ1Y3QKICAqIEBmYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5CkBAIC0yNDQwLDE0ICsyNTM1LDEzIEBACiB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2luaXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKIAkJCQkgICAgIGludCBmYW1pbHkpCiB7Ci0gICAgICAgIGlmIChmYW1pbHkgPT0gUEZfSU5FVCkKLQkJc3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfUkVRVUlSRTsKLQllbHNlCi0JCXNzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1VOU0VUOworCS8qIE5vIGxvY2tpbmcgbmVlZGVkLCB3ZSBhcmUgdGhlIG9ubHkgb25lIHdobyBoYXMgYWNjZXNzIHRvIHNzZWMgKi8KKwlzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9yZXNldChzc2VjLCBmYW1pbHkpOworCXNwaW5fbG9ja19pbml0KCZzc2VjLT5ubGJsX2xvY2spOwogfQogCiAvKioKLSAqIHNlbGludXhfbmV0bGJsX3NrX2Nsb25lX3NlY3VyaXR5IC0gQ29weSB0aGUgTmV0TGFiZWwgZmllbGRzCisgKiBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZSAtIENvcHkgdGhlIE5ldExhYmVsIGZpZWxkcwogICogQHNzZWM6IHRoZSBvcmlnaW5hbCBza19zZWN1cml0eV9zdHJ1Y3QKICAqIEBuZXdzc2VjOiB0aGUgY2xvbmVkIHNrX3NlY3VyaXR5X3N0cnVjdAogICoKQEAgLTI0NTYsNDEgKzI1NTAsNDEgQEAKICAqIEBuZXdzc2VjLgogICoKICAqLwotdm9pZCBzZWxpbnV4X25ldGxibF9za19jbG9uZV9zZWN1cml0eShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAordm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAogCQkJCSAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKm5ld3NzZWMpCiB7CisJLyogV2UgZG9uJ3QgbmVlZCB0byB0YWtlIG5ld3NzZWMtPm5sYmxfbG9jayBiZWNhdXNlIHdlIGFyZSB0aGUgb25seQorCSAqIHRocmVhZCB3aXRoIGFjY2VzcyB0byBuZXdzc2VjLCBidXQgd2UgZG8gbmVlZCB0byB0YWtlIHRoZSBSQ1UgcmVhZAorCSAqIGxvY2sgYXMgb3RoZXIgdGhyZWFkcyBjb3VsZCBoYXZlIGFjY2VzcyB0byBzc2VjICovCisJcmN1X3JlYWRfbG9jaygpOworCXNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0KG5ld3NzZWMsIHNzZWMtPnNrLT5za19mYW1pbHkpOwogCW5ld3NzZWMtPnNjbGFzcyA9IHNzZWMtPnNjbGFzczsKLQlpZiAoc3NlYy0+bmxibF9zdGF0ZSAhPSBOTEJMX1VOU0VUKQotCQluZXdzc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9SRVFVSVJFOwotCWVsc2UKLQkJbmV3c3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfVU5TRVQ7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIC8qKgogICogc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlIC0gTGFiZWwgYSBzb2NrZXQgdXNpbmcgTmV0TGFiZWwKICAqIEBzb2NrOiB0aGUgc29ja2V0IHRvIGxhYmVsCi0gKiBAc29ja19mYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5Ci0gKiBAc2lkOiB0aGUgU0lEIHRvIHVzZQogICoKICAqIERlc2NyaXB0aW9uOgogICogQXR0ZW1wdCB0byBsYWJlbCBhIHNvY2tldCB1c2luZyB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHVzaW5nIHRoZSBnaXZlbgogICogU0lELiAgUmV0dXJucyB6ZXJvIHZhbHVlcyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkgICAgICBpbnQgc29ja19mYW1pbHksCi0JCQkJICAgICAgdTMyIHNpZCkKK2ludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaykKIHsKKwlpbnQgcmMgPSAwOwogCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmlzZWMgPSBTT0NLX0lOT0RFKHNvY2spLT5pX3NlY3VyaXR5OwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc29jay0+c2stPnNrX3NlY3VyaXR5OwogCiAJc2tzZWMtPnNjbGFzcyA9IGlzZWMtPnNjbGFzczsKIAotCWlmIChzb2NrX2ZhbWlseSAhPSBQRl9JTkVUKQotCQlyZXR1cm4gMDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHNrc2VjLT5ubGJsX3N0YXRlID09IE5MQkxfUkVRVUlSRSkKKwkJcmMgPSBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c2lkKHNvY2ssIHNrc2VjLT5zaWQpOworCXJjdV9yZWFkX3VubG9jaygpOwogCi0Jc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1JFUVVJUkU7Ci0JcmV0dXJuIHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzaWQoc29jaywgc2lkKTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMjUxMiwxMSArMjYwNiwxNiBAQAogCiAJc2tzZWMtPnNjbGFzcyA9IGlzZWMtPnNjbGFzczsKIAotCWlmIChzay0+c2tfZmFtaWx5ICE9IFBGX0lORVQpCisJcmN1X3JlYWRfbG9jaygpOworCisJaWYgKHNrc2VjLT5ubGJsX3N0YXRlICE9IE5MQkxfUkVRVUlSRSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOworCX0KIAogCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOwogCWlmIChuZXRsYmxfc29ja19nZXRhdHRyKHNrLCAmc2VjYXR0cikgPT0gMCAmJgorCSAgICBzZWNhdHRyLmZsYWdzICE9IE5FVExCTF9TRUNBVFRSX05PTkUgJiYKIAkgICAgc2VsaW51eF9uZXRsYmxfc2VjYXR0cl90b19zaWQoTlVMTCwKIAkJCQkJICAmc2VjYXR0ciwKIAkJCQkJICBTRUNJTklUU0lEX1VOTEFCRUxFRCwKQEAgLTI1MjQsMzUgKzI2MjMsMTIgQEAKIAkJc2tzZWMtPnBlZXJfc2lkID0gbmxibF9wZWVyX3NpZDsKIAluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKIAotCXNrc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9SRVFVSVJFOwotCiAJLyogVHJ5IHRvIHNldCB0aGUgTmV0TGFiZWwgb24gdGhlIHNvY2tldCB0byBzYXZlIHRpbWUgbGF0ZXIsIGlmIHdlIGZhaWwKIAkgKiBoZXJlIHdlIHdpbGwgcGljayB1cCB0aGUgcGllY2VzIGluIGxhdGVyIGNhbGxzIHRvCiAJICogc2VsaW51eF9uZXRsYmxfaW5vZGVfcGVybWlzc2lvbigpLiAqLwogCXNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzaWQoc29jaywgc2tzZWMtPnNpZCk7Ci19CiAKLS8qKgotICogc2VsaW51eF9uZXRsYmxfaW5ldF9jb25uX3JlcXVlc3QgLSBIYW5kbGUgYSBuZXcgY29ubmVjdGlvbiByZXF1ZXN0Ci0gKiBAc2tiOiB0aGUgcGFja2V0Ci0gKiBAc29ja19zaWQ6IHRoZSBTSUQgb2YgdGhlIHBhcmVudCBzb2NrZXQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIElmIHByZXNlbnQsIHVzZSB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcyBvZiB0aGUgcGFja2V0IGluIEBza2IgYW5kIHRoZQotICogcGFyZW50IHNvY2sncyBTSUQgdG8gYXJyaXZlIGF0IGEgU0lEIGZvciB0aGUgbmV3IGNoaWxkIHNvY2suICBSZXR1cm5zIHRoZQotICogU0lEIG9mIHRoZSBjb25uZWN0aW9uIG9yIFNFQ1NJRF9OVUxMIG9uIGZhaWx1cmUuCi0gKgotICovCi11MzIgc2VsaW51eF9uZXRsYmxfaW5ldF9jb25uX3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNvY2tfc2lkKQotewotCWludCByYzsKLQl1MzIgcGVlcl9zaWQ7Ci0KLQlyYyA9IHNlbGludXhfbmV0bGJsX3NrYnVmZl9nZXRzaWQoc2tiLCBzb2NrX3NpZCwgJnBlZXJfc2lkKTsKLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIFNFQ1NJRF9OVUxMOwotCi0JcmV0dXJuIHBlZXJfc2lkOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiAvKioKQEAgLTI1NzAsMjUgKzI2NDYsMjQgQEAKIGludCBzZWxpbnV4X25ldGxibF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogewogCWludCByYzsKLQlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjOwogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjOwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAKLQlpZiAoIVNfSVNTT0NLKGlub2RlLT5pX21vZGUpKQorCWlmICghU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkgfHwKKwkgICAgKChtYXNrICYgKE1BWV9XUklURSB8IE1BWV9BUFBFTkQpKSA9PSAwKSkKIAkJcmV0dXJuIDA7Ci0KIAlzb2NrID0gU09DS0VUX0koaW5vZGUpOwotCWlzZWMgPSBpbm9kZS0+aV9zZWN1cml0eTsKIAlza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKLQltdXRleF9sb2NrKCZpc2VjLT5sb2NrKTsKLQlpZiAodW5saWtlbHkoc2tzZWMtPm5sYmxfc3RhdGUgPT0gTkxCTF9SRVFVSVJFICYmCi0JCSAgICAgKG1hc2sgJiAoTUFZX1dSSVRFIHwgTUFZX0FQUEVORCkpKSkgewotCQlsb2NrX3NvY2soc29jay0+c2spOwotCQlyYyA9IHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzaWQoc29jaywgc2tzZWMtPnNpZCk7Ci0JCXJlbGVhc2Vfc29jayhzb2NrLT5zayk7Ci0JfSBlbHNlCi0JCXJjID0gMDsKLQltdXRleF91bmxvY2soJmlzZWMtPmxvY2spOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChza3NlYy0+bmxibF9zdGF0ZSAhPSBOTEJMX1JFUVVJUkUpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAwOworCX0KKwlsb2NrX3NvY2soc29jay0+c2spOworCXJjID0gc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNpZChzb2NrLCBza3NlYy0+c2lkKTsKKwlyZWxlYXNlX3NvY2soc29jay0+c2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMjY0NiwzOCArMjcyMSwzNyBAQAogfQogCiAvKioKLSAqIHNlbGludXhfbmV0bGJsX3NvY2tldF9nZXRwZWVyc2VjX3N0cmVhbSAtIFJldHVybiB0aGUgY29ubmVjdGVkIHBlZXIncyBTSUQKKyAqIHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzb2Nrb3B0IC0gRG8gbm90IGFsbG93IHVzZXJzIHRvIHJlbW92ZSBhIE5ldExhYmVsCiAgKiBAc29jazogdGhlIHNvY2tldAorICogQGxldmVsOiB0aGUgc29ja2V0IGxldmVsIG9yIHByb3RvY29sCisgKiBAb3B0bmFtZTogdGhlIHNvY2tldCBvcHRpb24gbmFtZQogICoKICAqIERlc2NyaXB0aW9uOgotICogRXhhbWluZSBAc29jayB0byBmaW5kIHRoZSBjb25uZWN0ZWQgcGVlcidzIFNJRC4gIFJldHVybnMgdGhlIFNJRCBvbiBzdWNjZXNzCi0gKiBvciBTRUNTSURfTlVMTCBvbiBlcnJvci4KKyAqIENoZWNrIHRoZSBzZXRzb2Nrb3B0KCkgY2FsbCBhbmQgaWYgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHJlcGxhY2UgdGhlIElQCisgKiBvcHRpb25zIG9uIGEgc29ja2V0IGFuZCBhIE5ldExhYmVsIGlzIGluIHBsYWNlIGZvciB0aGUgc29ja2V0IGRlbnkgdGhlCisgKiBhY2Nlc3M7IG90aGVyd2lzZSBhbGxvdyB0aGUgYWNjZXNzLiAgUmV0dXJucyB6ZXJvIHdoZW4gdGhlIGFjY2VzcyBpcworICogYWxsb3dlZCwgLUVBQ0NFUyB3aGVuIGRlbmllZCwgYW5kIG90aGVyIG5lZ2F0aXZlIHZhbHVlcyBvbiBlcnJvci4KICAqCiAgKi8KLXUzMiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0oc3RydWN0IHNvY2tldCAqc29jaykKK2ludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSAgICAgaW50IGxldmVsLAorCQkJCSAgICAgaW50IG9wdG5hbWUpCiB7CisJaW50IHJjID0gMDsKIAlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKLQlyZXR1cm4gc2tzZWMtPnBlZXJfc2lkOwotfQorCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKIAotLyoqCi0gKiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbSAtIFJldHVybiB0aGUgU0lEIG9mIGEgTmV0TGFiZWwgcGFja2V0Ci0gKiBAc2tiOiB0aGUgcGFja2V0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBFeGFtaW5lIEBza2IgdG8gZmluZCB0aGUgU0lEIGFzc2lnbmVkIHRvIGl0IGJ5IE5ldExhYmVsLiAgUmV0dXJucyB0aGUgU0lEIG9uCi0gKiBzdWNjZXNzLCBTRUNTSURfTlVMTCBvbiBlcnJvci4KLSAqCi0gKi8KLXUzMiBzZWxpbnV4X25ldGxibF9zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWludCBwZWVyX3NpZDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxldmVsID09IElQUFJPVE9fSVAgJiYgb3B0bmFtZSA9PSBJUF9PUFRJT05TICYmCisJICAgIHNrc2VjLT5ubGJsX3N0YXRlID09IE5MQkxfTEFCRUxFRCkgeworCQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKKwkJcmMgPSBuZXRsYmxfc29ja2V0X2dldGF0dHIoc29jaywgJnNlY2F0dHIpOworCQlpZiAocmMgPT0gMCAmJiBzZWNhdHRyLmZsYWdzICE9IE5FVExCTF9TRUNBVFRSX05PTkUpCisJCQlyYyA9IC1FQUNDRVM7CisJCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHNrYiwKLQkJCQkJIFNFQ0lOSVRTSURfVU5MQUJFTEVELAotCQkJCQkgJnBlZXJfc2lkKSAhPSAwKQotCQlyZXR1cm4gU0VDU0lEX05VTEw7Ci0KLQlyZXR1cm4gcGVlcl9zaWQ7CisJcmV0dXJuIHJjOwogfQogI2VuZGlmIC8qIENPTkZJR19ORVRMQUJFTCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zeW10YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc3ltdGFiLmMKaW5kZXggMjRhMTBkMy4uODM3NjU4YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zeW10YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3N5bXRhYi5jCkBAIC05LDkgKzksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSAic3ltdGFiLmgiCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3ltaGFzaChzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5KQorc3RhdGljIHVuc2lnbmVkIGludCBzeW1oYXNoKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkpCiB7Ci0JY2hhciAqcCwgKmtleXA7CisJY29uc3QgY2hhciAqcCwgKmtleXA7CiAJdW5zaWduZWQgaW50IHNpemU7CiAJdW5zaWduZWQgaW50IHZhbDsKIApAQCAtMjMsOSArMjMsOSBAQAogCXJldHVybiB2YWwgJiAoaC0+c2l6ZSAtIDEpOwogfQogCi1zdGF0aWMgaW50IHN5bWNtcChzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqa2V5MSwgdm9pZCAqa2V5MikKK3N0YXRpYyBpbnQgc3ltY21wKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyKQogewotCWNoYXIgKmtleXAxLCAqa2V5cDI7CisJY29uc3QgY2hhciAqa2V5cDEsICprZXlwMjsKIAogCWtleXAxID0ga2V5MTsKIAlrZXlwMiA9IGtleTI7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3hmcm0uYyBiL3NlY3VyaXR5L3NlbGludXgveGZybS5jCmluZGV4IDY3NWI5OTUuLmJkOGQxZWYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgveGZybS5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgveGZybS5jCkBAIC0xMTUsNzYgKzExNSw0NiBAQAogCQkJc3RydWN0IGZsb3dpICpmbCkKIHsKIAl1MzIgc3RhdGVfc2lkOwotCXUzMiBwb2xfc2lkOwotCWludCBlcnI7CisJaW50IHJjOwogCi0JaWYgKHhwLT5zZWN1cml0eSkgewotCQlpZiAoIXgtPnNlY3VyaXR5KQotCQkJLyogdW5sYWJlbGVkIFNBIGFuZCBsYWJlbGVkIHBvbGljeSBjYW4ndCBtYXRjaCAqLwotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXN0YXRlX3NpZCA9IHgtPnNlY3VyaXR5LT5jdHhfc2lkOwotCQlwb2xfc2lkID0geHAtPnNlY3VyaXR5LT5jdHhfc2lkOwotCX0gZWxzZQorCWlmICgheHAtPnNlY3VyaXR5KQogCQlpZiAoeC0+c2VjdXJpdHkpCiAJCQkvKiB1bmxhYmVsZWQgcG9saWN5IGFuZCBsYWJlbGVkIFNBIGNhbid0IG1hdGNoICovCiAJCQlyZXR1cm4gMDsKIAkJZWxzZQogCQkJLyogdW5sYWJlbGVkIHBvbGljeSBhbmQgdW5sYWJlbGVkIFNBIG1hdGNoIGFsbCBmbG93cyAqLwogCQkJcmV0dXJuIDE7CisJZWxzZQorCQlpZiAoIXgtPnNlY3VyaXR5KQorCQkJLyogdW5sYWJlbGVkIFNBIGFuZCBsYWJlbGVkIHBvbGljeSBjYW4ndCBtYXRjaCAqLworCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCWlmICghc2VsaW51eF9hdXRob3JpemFibGVfeGZybSh4KSkKKwkJCQkvKiBOb3QgYSBTRUxpbnV4LWxhYmVsZWQgU0EgKi8KKwkJCQlyZXR1cm4gMDsKIAotCWVyciA9IGF2Y19oYXNfcGVybShzdGF0ZV9zaWQsIHBvbF9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAotCQkJICBBU1NPQ0lBVElPTl9fUE9MTUFUQ0gsCi0JCQkgIE5VTEwpOworCXN0YXRlX3NpZCA9IHgtPnNlY3VyaXR5LT5jdHhfc2lkOwogCi0JaWYgKGVycikKKwlpZiAoZmwtPnNlY2lkICE9IHN0YXRlX3NpZCkKIAkJcmV0dXJuIDA7CiAKLQllcnIgPSBhdmNfaGFzX3Blcm0oZmwtPnNlY2lkLCBzdGF0ZV9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAorCXJjID0gYXZjX2hhc19wZXJtKGZsLT5zZWNpZCwgc3RhdGVfc2lkLCBTRUNDTEFTU19BU1NPQ0lBVElPTiwKIAkJCSAgQVNTT0NJQVRJT05fX1NFTkRUTywKIAkJCSAgTlVMTCk/IDA6MTsKIAotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBMU00gaG9vayBpbXBsZW1lbnRhdGlvbiB0aGF0IGF1dGhvcml6ZXMgdGhhdCBhIHBhcnRpY3VsYXIgb3V0Z29pbmcgZmxvdwotICogY2FuIHVzZSBhIGdpdmVuIHNlY3VyaXR5IGFzc29jaWF0aW9uLgotICovCi0KLWludCBzZWxpbnV4X3hmcm1fZmxvd19zdGF0ZV9tYXRjaChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybSwKLQkJCQkgIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHApCi17Ci0JaW50IHJjID0gMDsKLQl1MzIgc2VsX3NpZCA9IFNFQ0lOSVRTSURfVU5MQUJFTEVEOwotCXN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eDsKLQotCWlmICgheHAtPnNlY3VyaXR5KQotCQlpZiAoIXhmcm0tPnNlY3VyaXR5KQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCWVsc2UKLQkJaWYgKCF4ZnJtLT5zZWN1cml0eSkKLQkJCXJldHVybiAwOwotCi0JLyogQ29udGV4dCBzaWQgaXMgZWl0aGVyIHNldCB0byBsYWJlbCBvciBBTllfQVNTT0MgKi8KLQlpZiAoKGN0eCA9IHhmcm0tPnNlY3VyaXR5KSkgewotCQlpZiAoIXNlbGludXhfYXV0aG9yaXphYmxlX2N0eChjdHgpKQotCQkJcmV0dXJuIDA7Ci0KLQkJc2VsX3NpZCA9IGN0eC0+Y3R4X3NpZDsKLQl9Ci0KLQlyYyA9IGF2Y19oYXNfcGVybShmbC0+c2VjaWQsIHNlbF9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAotCQkJICBBU1NPQ0lBVElPTl9fU0VORFRPLAotCQkJICBOVUxMKT8gMDoxOworCS8qCisJICogV2UgZG9uJ3QgbmVlZCBhIHNlcGFyYXRlIFNBIFZzLiBwb2xpY3kgcG9sbWF0Y2ggY2hlY2sKKwkgKiBzaW5jZSB0aGUgU0EgaXMgbm93IG9mIHRoZSBzYW1lIGxhYmVsIGFzIHRoZSBmbG93IGFuZAorCSAqIGEgZmxvdyBWcy4gcG9saWN5IHBvbG1hdGNoIGNoZWNrIGhhZCBhbHJlYWR5IGhhcHBlbmVkCisJICogaW4gc2VsaW51eF94ZnJtX3BvbGljeV9sb29rdXAoKSBhYm92ZS4KKwkgKi8KIAogCXJldHVybiByYzsKIH0KIAogLyoKLSAqIExTTSBob29rIGltcGxlbWVudGF0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2lkIGZvciB0aGUgc2Vzc2lvbi4KKyAqIExTTSBob29rIGltcGxlbWVudGF0aW9uIHRoYXQgY2hlY2tzIGFuZC9vciByZXR1cm5zIHRoZSB4ZnJtIHNpZCBmb3IgdGhlCisgKiBpbmNvbWluZyBwYWNrZXQuCiAgKi8KIAogaW50IHNlbGludXhfeGZybV9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgKnNpZCwgaW50IGNrYWxsKQpAQCAtMjI2LDE2ICsxOTYsMTUgQEAKICAqIENUWCBkb2VzIG5vdCBoYXZlIGEgbWVhbmluZ2Z1bCB2YWx1ZSBvbiBpbnB1dAogICovCiBzdGF0aWMgaW50IHNlbGludXhfeGZybV9zZWNfY3R4X2FsbG9jKHN0cnVjdCB4ZnJtX3NlY19jdHggKipjdHhwLAotCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCwgc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sLCB1MzIgc2lkKQorCXN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCwgdTMyIHNpZCkKIHsKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYyA9IGN1cnJlbnQtPnNlY3VyaXR5OwogCXN0cnVjdCB4ZnJtX3NlY19jdHggKmN0eCA9IE5VTEw7CiAJY2hhciAqY3R4X3N0ciA9IE5VTEw7CiAJdTMyIHN0cl9sZW47Ci0JdTMyIGN0eF9zaWQ7CiAKLQlCVUdfT04odWN0eCAmJiBwb2wpOworCUJVR19PTih1Y3R4ICYmIHNpZCk7CiAKIAlpZiAoIXVjdHgpCiAJCWdvdG8gbm90X2Zyb21fdXNlcjsKQEAgLTI3OSwxNSArMjQ4LDcgQEAKIAlyZXR1cm4gcmM7CiAKIG5vdF9mcm9tX3VzZXI6Ci0JaWYgKHBvbCkgewotCQlyYyA9IHNlY3VyaXR5X3NpZF9tbHNfY29weShwb2wtPmN0eF9zaWQsIHNpZCwgJmN0eF9zaWQpOwotCQlpZiAocmMpCi0JCQlnb3RvIG91dDsKLQl9Ci0JZWxzZQotCQljdHhfc2lkID0gc2lkOwotCi0JcmMgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dChjdHhfc2lkLCAmY3R4X3N0ciwgJnN0cl9sZW4pOworCXJjID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQoc2lkLCAmY3R4X3N0ciwgJnN0cl9sZW4pOwogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKQEAgLTMwMiw3ICsyNjMsNyBAQAogCiAJY3R4LT5jdHhfZG9pID0gWEZSTV9TQ19ET0lfTFNNOwogCWN0eC0+Y3R4X2FsZyA9IFhGUk1fU0NfQUxHX1NFTElOVVg7Ci0JY3R4LT5jdHhfc2lkID0gY3R4X3NpZDsKKwljdHgtPmN0eF9zaWQgPSBzaWQ7CiAJY3R4LT5jdHhfbGVuID0gc3RyX2xlbjsKIAltZW1jcHkoY3R4LT5jdHhfc3RyLAogCSAgICAgICBjdHhfc3RyLApAQCAtMzIzLDIyICsyODQsMTQgQEAKICAqIHhmcm1fcG9saWN5LgogICovCiBpbnQgc2VsaW51eF94ZnJtX3BvbGljeV9hbGxvYyhzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLAotCQlzdHJ1Y3QgeGZybV91c2VyX3NlY19jdHggKnVjdHgsIHN0cnVjdCBzb2NrICpzaykKKwkJc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4ICp1Y3R4KQogewogCWludCBlcnI7Ci0JdTMyIHNpZDsKIAogCUJVR19PTigheHApOwotCUJVR19PTih1Y3R4ICYmIHNrKTsKKwlCVUdfT04oIXVjdHgpOwogCi0JaWYgKHNrKSB7Ci0JCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMgPSBzay0+c2tfc2VjdXJpdHk7Ci0JCXNpZCA9IHNzZWMtPnNpZDsKLQl9Ci0JZWxzZQotCQlzaWQgPSBTRUNTSURfTlVMTDsKLQotCWVyciA9IHNlbGludXhfeGZybV9zZWNfY3R4X2FsbG9jKCZ4cC0+c2VjdXJpdHksIHVjdHgsIE5VTEwsIHNpZCk7CisJZXJyID0gc2VsaW51eF94ZnJtX3NlY19jdHhfYWxsb2MoJnhwLT5zZWN1cml0eSwgdWN0eCwgMCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzk5LDEzICszNTIsMTMgQEAKICAqIHhmcm1fc3RhdGUuCiAgKi8KIGludCBzZWxpbnV4X3hmcm1fc3RhdGVfYWxsb2Moc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCB4ZnJtX3VzZXJfc2VjX2N0eCAqdWN0eCwKLQkJc3RydWN0IHhmcm1fc2VjX2N0eCAqcG9sLCB1MzIgc2VjaWQpCisJCXUzMiBzZWNpZCkKIHsKIAlpbnQgZXJyOwogCiAJQlVHX09OKCF4KTsKIAotCWVyciA9IHNlbGludXhfeGZybV9zZWNfY3R4X2FsbG9jKCZ4LT5zZWN1cml0eSwgdWN0eCwgcG9sLCBzZWNpZCk7CisJZXJyID0gc2VsaW51eF94ZnJtX3NlY19jdHhfYWxsb2MoJngtPnNlY3VyaXR5LCB1Y3R4LCBzZWNpZCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNDE5LDc0ICszNzIsNiBAQAogCQlrZnJlZShjdHgpOwogfQogCi0vKgotICogU0VMaW51eCBpbnRlcm5hbCBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY29udGV4dCBvZiBhIGNvbm5lY3RlZAotICogKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIFRDUCBzb2NrZXQgYmFzZWQgb24gaXRzIHNlY3VyaXR5Ci0gKiBhc3NvY2lhdGlvbiB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBzb2NrZXQuCi0gKgotICogUmV0cmlldmUgdmlhIGdldHNvY2tvcHQgU09fUEVFUlNFQy4KLSAqLwotdTMyIHNlbGludXhfc29ja2V0X2dldHBlZXJfc3RyZWFtKHN0cnVjdCBzb2NrICpzaykKLXsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsICpkc3RfdGVzdDsKLQl1MzIgcGVlcl9zaWQgPSBTRUNTSURfTlVMTDsKLQotCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQotCQlnb3RvIG91dDsKLQotCWRzdCA9IHNrX2RzdF9nZXQoc2spOwotCWlmICghZHN0KQotCQlnb3RvIG91dDsKLQotIAlmb3IgKGRzdF90ZXN0ID0gZHN0OyBkc3RfdGVzdCAhPSAwOwotICAgICAgCSAgICAgZHN0X3Rlc3QgPSBkc3RfdGVzdC0+Y2hpbGQpIHsKLQkJc3RydWN0IHhmcm1fc3RhdGUgKnggPSBkc3RfdGVzdC0+eGZybTsKLQotIAkJaWYgKHggJiYgc2VsaW51eF9hdXRob3JpemFibGVfeGZybSh4KSkgewotCSAJIAlzdHJ1Y3QgeGZybV9zZWNfY3R4ICpjdHggPSB4LT5zZWN1cml0eTsKLQkJCXBlZXJfc2lkID0gY3R4LT5jdHhfc2lkOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZHN0X3JlbGVhc2UoZHN0KTsKLQotb3V0OgotCXJldHVybiBwZWVyX3NpZDsKLX0KLQotLyoKLSAqIFNFTGludXggaW50ZXJuYWwgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGNvbnRleHQgb2YgYSBVRFAgcGFja2V0Ci0gKiBiYXNlZCBvbiBpdHMgc2VjdXJpdHkgYXNzb2NpYXRpb24gdXNlZCB0byBjb25uZWN0IHRvIHRoZSByZW1vdGUgc29ja2V0LgotICoKLSAqIFJldHJpZXZlIHZpYSBzZXRzb2Nrb3B0IElQX1BBU1NTRUMgYW5kIHJlY3Ztc2cgd2l0aCBjb250cm9sIG1lc3NhZ2UKLSAqIHR5cGUgU0NNX1NFQ1VSSVRZLgotICovCi11MzIgc2VsaW51eF9zb2NrZXRfZ2V0cGVlcl9kZ3JhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBzZWNfcGF0aCAqc3A7Ci0KLQlpZiAoc2tiID09IE5VTEwpCi0JCXJldHVybiBTRUNTSURfTlVMTDsKLQotCWlmIChza2ItPnNrLT5za19wcm90b2NvbCAhPSBJUFBST1RPX1VEUCkKLQkJcmV0dXJuIFNFQ1NJRF9OVUxMOwotCi0Jc3AgPSBza2ItPnNwOwotCWlmIChzcCkgewotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSBzcC0+bGVuLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCA9IHNwLT54dmVjW2ldOwotCQkJaWYgKHNlbGludXhfYXV0aG9yaXphYmxlX3hmcm0oeCkpIHsKLQkJCQlzdHJ1Y3QgeGZybV9zZWNfY3R4ICpjdHggPSB4LT5zZWN1cml0eTsKLQkJCQlyZXR1cm4gY3R4LT5jdHhfc2lkOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIFNFQ1NJRF9OVUxMOwotfQotCiAgLyoKICAgKiBMU00gaG9vayBpbXBsZW1lbnRhdGlvbiB0aGF0IGF1dGhvcml6ZXMgZGVsZXRpb24gb2YgbGFiZWxlZCBTQXMuCiAgICovCkBAIC01MzIsNiArNDE3LDEzIEBACiAJCX0KIAl9CiAKKwkvKgorCSAqIFRoaXMgY2hlY2sgZXZlbiB3aGVuIHRoZXJlJ3Mgbm8gYXNzb2NpYXRpb24gaW52b2x2ZWQgaXMKKwkgKiBpbnRlbmRlZCwgYWNjb3JkaW5nIHRvIFRyZW50IEphZWdlciwgdG8gbWFrZSBzdXJlIGEKKwkgKiBwcm9jZXNzIGNhbid0IGVuZ2FnZSBpbiBub24taXBzZWMgY29tbXVuaWNhdGlvbiB1bmxlc3MKKwkgKiBleHBsaWNpdGx5IGFsbG93ZWQgYnkgcG9saWN5LgorCSAqLworCiAJcmMgPSBhdmNfaGFzX3Blcm0oaXNlY19zaWQsIHNlbF9zaWQsIFNFQ0NMQVNTX0FTU09DSUFUSU9OLAogCQkJICBBU1NPQ0lBVElPTl9fUkVDVkZST00sIGFkKTsKIApAQCAtNTQzLDEwICs0MzUsMTAgQEAKICAqIElmIHdlIGhhdmUgbm8gc2VjdXJpdHkgYXNzb2NpYXRpb24sIHRoZW4gd2UgbmVlZCB0byBkZXRlcm1pbmUKICAqIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBhbGxvd2VkIHRvIHNlbmQgdG8gYW4gdW5sYWJlbGxlZCBkZXN0aW5hdGlvbi4KICAqIElmIHdlIGRvIGhhdmUgYSBhdXRob3JpemFibGUgc2VjdXJpdHkgYXNzb2NpYXRpb24sIHRoZW4gaXQgaGFzIGFscmVhZHkgYmVlbgotICogY2hlY2tlZCBpbiB4ZnJtX3BvbGljeV9sb29rdXAgaG9vay4KKyAqIGNoZWNrZWQgaW4gdGhlIHNlbGludXhfeGZybV9zdGF0ZV9wb2xfZmxvd19tYXRjaCBob29rIGFib3ZlLgogICovCiBpbnQgc2VsaW51eF94ZnJtX3Bvc3Ryb3V0ZV9sYXN0KHUzMiBpc2VjX3NpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCkKKwkJCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCwgdTggcHJvdG8pCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCWludCByYyA9IDA7CkBAIC01NjUsNiArNDU3LDI3IEBACiAJCX0KIAl9CiAKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBJUFBST1RPX0FIOgorCWNhc2UgSVBQUk9UT19FU1A6CisJY2FzZSBJUFBST1RPX0NPTVA6CisJCS8qCisJCSAqIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIHBhY2tldCBvbmNlIGJlZm9yZQorCQkgKiBpdCB1bmRlcndlbnQgeGZybShzKS4gTm8gbmVlZCB0byBzdWJqZWN0IGl0IHRvIHRoZQorCQkgKiB1bmxhYmVsZWQgY2hlY2suCisJCSAqLworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFRoaXMgY2hlY2sgZXZlbiB3aGVuIHRoZXJlJ3Mgbm8gYXNzb2NpYXRpb24gaW52b2x2ZWQgaXMKKwkgKiBpbnRlbmRlZCwgYWNjb3JkaW5nIHRvIFRyZW50IEphZWdlciwgdG8gbWFrZSBzdXJlIGEKKwkgKiBwcm9jZXNzIGNhbid0IGVuZ2FnZSBpbiBub24taXBzZWMgY29tbXVuaWNhdGlvbiB1bmxlc3MKKwkgKiBleHBsaWNpdGx5IGFsbG93ZWQgYnkgcG9saWN5LgorCSAqLworCiAJcmMgPSBhdmNfaGFzX3Blcm0oaXNlY19zaWQsIFNFQ0lOSVRTSURfVU5MQUJFTEVELCBTRUNDTEFTU19BU1NPQ0lBVElPTiwKIAkJCSAgQVNTT0NJQVRJT05fX1NFTkRUTywgYWQpOwogb3V0OgpkaWZmIC0tZ2l0IGEvc291bmQvS2NvbmZpZyBiL3NvdW5kL0tjb25maWcKaW5kZXggZTBkNzkxYS4uOWQ3NzMwMCAxMDA2NDQKLS0tIGEvc291bmQvS2NvbmZpZworKysgYi9zb3VuZC9LY29uZmlnCkBAIC02NCwxMSArNjQsMTEgQEAKIAogc291cmNlICJzb3VuZC9taXBzL0tjb25maWciCiAKLSMgdGhlIGZvbGxvd2luZyB3aWxsIGRlcGVuZW5kIG9uIHRoZSBvcmRlciBvZiBjb25maWcuCisjIHRoZSBmb2xsb3dpbmcgd2lsbCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIGNvbmZpZy4KICMgaGVyZSBhc3N1bWluZyBVU0IgaXMgZGVmaW5lZCBiZWZvcmUgQUxTQQogc291cmNlICJzb3VuZC91c2IvS2NvbmZpZyIKIAotIyB0aGUgZm9sbG93aW5nIHdpbGwgZGVwZW5lbmQgb24gdGhlIG9yZGVyIG9mIGNvbmZpZy4KKyMgdGhlIGZvbGxvd2luZyB3aWxsIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgY29uZmlnLgogIyBoZXJlIGFzc3VtaW5nIFBDTUNJQSBpcyBkZWZpbmVkIGJlZm9yZSBBTFNBCiBzb3VyY2UgInNvdW5kL3BjbWNpYS9LY29uZmlnIgogCkBAIC05Myw0ICs5MywxMiBAQAogCiBlbmRpZgogCitjb25maWcgQUM5N19CVVMKKwl0cmlzdGF0ZQorCWhlbHAKKwkgIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBjb25maWcgYW5kIGxpbmsgaGFyZCBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUKKwkgIHNvdW5kIHN1YnN5c3RlbSBhbmQgb3RoZXIgZnVuY3Rpb24gZHJpdmVycyBjb21wbGV0ZWx5IHVucmVsYXRlZCB0bworCSAgc291bmQgYWx0aG91Z2ggdGhleSdyZSBzaGFyaW5nIHRoZSBBQzk3IGJ1cy4gQ29uY2VybmVkIGRyaXZlcnMKKwkgIHNob3VsZCAic2VsZWN0IiB0aGlzLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9zb3VuZC9NYWtlZmlsZSBiL3NvdW5kL01ha2VmaWxlCmluZGV4IDVmNmJlZjUuLjlhZWU1NGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL01ha2VmaWxlCisrKyBiL3NvdW5kL01ha2VmaWxlCkBAIC04LDYgKzgsOSBAQAogb2JqLSQoQ09ORklHX1NORCkgKz0gY29yZS8gaTJjLyBkcml2ZXJzLyBpc2EvIHBjaS8gcHBjLyBhcm0vIHN5bnRoLyB1c2IvIHNwYXJjLyBwYXJpc2MvIHBjbWNpYS8gbWlwcy8KIG9iai0kKENPTkZJR19TTkRfQU9BKSArPSBhb2EvCiAKKyMgVGhpcyBvbmUgbXVzdCBiZSBjb21waWxhYmxlIGV2ZW4gaWYgc291bmQgaXMgY29uZmlndXJlZCBvdXQKK29iai0kKENPTkZJR19BQzk3X0JVUykgKz0gYWM5N19idXMubworCiBpZmVxICgkKENPTkZJR19TTkQpLHkpCiAgIG9iai15ICs9IGxhc3QubwogZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfYnVzLmMgYi9zb3VuZC9hYzk3X2J1cy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzb3VuZC9wY2kvYWM5Ny9hYzk3X2J1cy5jCnJlbmFtZSB0byBzb3VuZC9hYzk3X2J1cy5jCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvYW9hLWdwaW8uaCBiL3NvdW5kL2FvYS9hb2EtZ3Bpby5oCmluZGV4IDNhNjFmMzEuLmVlNjRmNWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9hb2EtZ3Bpby5oCisrKyBiL3NvdW5kL2FvYS9hb2EtZ3Bpby5oCkBAIC01OSwxMCArNTksMTAgQEAKIH07CiAKIHN0cnVjdCBncGlvX25vdGlmaWNhdGlvbiB7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCW5vdGlmeV9mdW5jX3Qgbm90aWZ5OwogCXZvaWQgKmRhdGE7CiAJdm9pZCAqZ3Bpb19wcml2YXRlOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYwppbmRleCAyZWY1NWExLi45ZGU4NDg1YiAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLXRhcy5jCisrKyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYwpAQCAtNTE0LDkgKzUxNCwxNSBAQAogCW11dGV4X2xvY2soJnRhcy0+bXR4KTsKIAlvbGRhY3IgPSB0YXMtPmFjcjsKIAotCXRhcy0+YWNyICY9IH5UQVNfQUNSX0lOUFVUX0I7CisJLyoKKwkgKiBEZXNwaXRlIHdoYXQgdGhlIGRhdGEgc2hlZXQgc2F5cyBpbiBvbmUgcGxhY2UsIHRoZQorCSAqIFRBU19BQ1JfQl9NT05BVVJFQUwgYml0IGZvcmNlcyBtb25vIG91dHB1dCBldmVuIHdoZW4KKwkgKiBpbnB1dCBBIChsaW5lIGluKSBpcyBzZWxlY3RlZC4KKwkgKi8KKwl0YXMtPmFjciAmPSB+KFRBU19BQ1JfSU5QVVRfQiB8IFRBU19BQ1JfQl9NT05BVVJFQUwpOwogCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKQotCQl0YXMtPmFjciB8PSBUQVNfQUNSX0lOUFVUX0I7CisJCXRhcy0+YWNyIHw9IFRBU19BQ1JfSU5QVVRfQiB8IFRBU19BQ1JfQl9NT05BVVJFQUwgfAorCQkgICAgICBUQVNfQUNSX0JfTU9OX1NFTF9SSUdIVDsKIAlpZiAob2xkYWNyID09IHRhcy0+YWNyKSB7CiAJCW11dGV4X3VubG9jaygmdGFzLT5tdHgpOwogCQlyZXR1cm4gMDsKQEAgLTY4Niw4ICs2OTIsNyBAQAogCWlmICh0YXNfd3JpdGVfcmVnKHRhcywgVEFTX1JFR19NQ1MsIDEsICZ0bXApKQogCQlnb3RvIG91dGVycjsKIAotCXRhcy0+YWNyIHw9IFRBU19BQ1JfQU5BTE9HX1BET1dOIHwgVEFTX0FDUl9CX01PTkFVUkVBTCB8Ci0JCVRBU19BQ1JfQl9NT05fU0VMX1JJR0hUOworCXRhcy0+YWNyIHw9IFRBU19BQ1JfQU5BTE9HX1BET1dOOwogCWlmICh0YXNfd3JpdGVfcmVnKHRhcywgVEFTX1JFR19BQ1IsIDEsICZ0YXMtPmFjcikpCiAJCWdvdG8gb3V0ZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWdwaW8tZmVhdHVyZS5jIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1ncGlvLWZlYXR1cmUuYwppbmRleCA0MGViNDdlLi4yYjAzYmM3IDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWdwaW8tZmVhdHVyZS5jCisrKyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtZ3Bpby1mZWF0dXJlLmMKQEAgLTE5NSw5ICsxOTUsMTAgQEAKIAlmdHJfZ3Bpb19zZXRfbGluZW91dChydCwgKHM+PjIpJjEpOwogfQogCi1zdGF0aWMgdm9pZCBmdHJfaGFuZGxlX25vdGlmeSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZnRyX2hhbmRsZV9ub3RpZnkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBncGlvX25vdGlmaWNhdGlvbiAqbm90aWYgPSBkYXRhOworCXN0cnVjdCBncGlvX25vdGlmaWNhdGlvbiAqbm90aWYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uLCB3b3JrLndvcmspOwogCiAJbXV0ZXhfbG9jaygmbm90aWYtPm11dGV4KTsKIAlpZiAobm90aWYtPm5vdGlmeSkKQEAgLTI1MywxMiArMjU0LDkgQEAKIAogCWZ0cl9ncGlvX2FsbF9hbXBzX29mZihydCk7CiAJcnQtPmltcGxlbWVudGF0aW9uX3ByaXZhdGUgPSAwOwotCUlOSVRfV09SSygmcnQtPmhlYWRwaG9uZV9ub3RpZnkud29yaywgZnRyX2hhbmRsZV9ub3RpZnksCi0JCSAgJnJ0LT5oZWFkcGhvbmVfbm90aWZ5KTsKLQlJTklUX1dPUksoJnJ0LT5saW5lX2luX25vdGlmeS53b3JrLCBmdHJfaGFuZGxlX25vdGlmeSwKLQkJICAmcnQtPmxpbmVfaW5fbm90aWZ5KTsKLQlJTklUX1dPUksoJnJ0LT5saW5lX291dF9ub3RpZnkud29yaywgZnRyX2hhbmRsZV9ub3RpZnksCi0JCSAgJnJ0LT5saW5lX291dF9ub3RpZnkpOworCUlOSVRfREVMQVlFRF9XT1JLKCZydC0+aGVhZHBob25lX25vdGlmeS53b3JrLCBmdHJfaGFuZGxlX25vdGlmeSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJ0LT5saW5lX2luX25vdGlmeS53b3JrLCBmdHJfaGFuZGxlX25vdGlmeSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJ0LT5saW5lX291dF9ub3RpZnkud29yaywgZnRyX2hhbmRsZV9ub3RpZnkpOwogCW11dGV4X2luaXQoJnJ0LT5oZWFkcGhvbmVfbm90aWZ5Lm11dGV4KTsKIAltdXRleF9pbml0KCZydC0+bGluZV9pbl9ub3RpZnkubXV0ZXgpOwogCW11dGV4X2luaXQoJnJ0LT5saW5lX291dF9ub3RpZnkubXV0ZXgpOwpAQCAtMjg3LDcgKzI4NSw3IEBACiB7CiAJc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uICpub3RpZiA9IGRhdGE7CiAKLQlzY2hlZHVsZV93b3JrKCZub3RpZi0+d29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZub3RpZi0+d29yaywgMCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWdwaW8tcG1mLmMgYi9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWdwaW8tcG1mLmMKaW5kZXggMjgzNmMzMi4uNWNhMjIyMCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1ncGlvLXBtZi5jCisrKyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtZ3Bpby1wbWYuYwpAQCAtNjksOSArNjksMTAgQEAKIAlwbWZfZ3Bpb19zZXRfbGluZW91dChydCwgKHM+PjIpJjEpOwogfQogCi1zdGF0aWMgdm9pZCBwbWZfaGFuZGxlX25vdGlmeSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgcG1mX2hhbmRsZV9ub3RpZnkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBncGlvX25vdGlmaWNhdGlvbiAqbm90aWYgPSBkYXRhOworCXN0cnVjdCBncGlvX25vdGlmaWNhdGlvbiAqbm90aWYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uLCB3b3JrLndvcmspOwogCiAJbXV0ZXhfbG9jaygmbm90aWYtPm11dGV4KTsKIAlpZiAobm90aWYtPm5vdGlmeSkKQEAgLTgzLDEyICs4NCw5IEBACiB7CiAJcG1mX2dwaW9fYWxsX2FtcHNfb2ZmKHJ0KTsKIAlydC0+aW1wbGVtZW50YXRpb25fcHJpdmF0ZSA9IDA7Ci0JSU5JVF9XT1JLKCZydC0+aGVhZHBob25lX25vdGlmeS53b3JrLCBwbWZfaGFuZGxlX25vdGlmeSwKLQkJICAmcnQtPmhlYWRwaG9uZV9ub3RpZnkpOwotCUlOSVRfV09SSygmcnQtPmxpbmVfaW5fbm90aWZ5LndvcmssIHBtZl9oYW5kbGVfbm90aWZ5LAotCQkgICZydC0+bGluZV9pbl9ub3RpZnkpOwotCUlOSVRfV09SSygmcnQtPmxpbmVfb3V0X25vdGlmeS53b3JrLCBwbWZfaGFuZGxlX25vdGlmeSwKLQkJICAmcnQtPmxpbmVfb3V0X25vdGlmeSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJ0LT5oZWFkcGhvbmVfbm90aWZ5LndvcmssIHBtZl9oYW5kbGVfbm90aWZ5KTsKKwlJTklUX0RFTEFZRURfV09SSygmcnQtPmxpbmVfaW5fbm90aWZ5LndvcmssIHBtZl9oYW5kbGVfbm90aWZ5KTsKKwlJTklUX0RFTEFZRURfV09SSygmcnQtPmxpbmVfb3V0X25vdGlmeS53b3JrLCBwbWZfaGFuZGxlX25vdGlmeSk7CiAJbXV0ZXhfaW5pdCgmcnQtPmhlYWRwaG9uZV9ub3RpZnkubXV0ZXgpOwogCW11dGV4X2luaXQoJnJ0LT5saW5lX2luX25vdGlmeS5tdXRleCk7CiAJbXV0ZXhfaW5pdCgmcnQtPmxpbmVfb3V0X25vdGlmeS5tdXRleCk7CkBAIC0xMjksNyArMTI3LDcgQEAKIHsKIAlzdHJ1Y3QgZ3Bpb19ub3RpZmljYXRpb24gKm5vdGlmID0gZGF0YTsKIAotCXNjaGVkdWxlX3dvcmsoJm5vdGlmLT53b3JrKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5vdGlmLT53b3JrLCAwKTsKIH0KIAogc3RhdGljIGludCBwbWZfc2V0X25vdGlmeShzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCwKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9mYWJyaWNzL0tjb25maWcgYi9zb3VuZC9hb2EvZmFicmljcy9LY29uZmlnCmluZGV4IGMzYmM3NzAuLjUwZDcwMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9mYWJyaWNzL0tjb25maWcKKysrIGIvc291bmQvYW9hL2ZhYnJpY3MvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBTTkRfQU9BX0ZBQlJJQ19MQVlPVVQKIAl0cmlzdGF0ZSAibGF5b3V0LWlkIGZhYnJpYyIKLQlkZXBlbmRzIFNORF9BT0EKKwlkZXBlbmRzIG9uIFNORF9BT0EKIAlzZWxlY3QgU05EX0FPQV9TT1VOREJVUwogCXNlbGVjdCBTTkRfQU9BX1NPVU5EQlVTX0kyUwogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9zYTExeHgtdWRhMTM0MS5jIGIvc291bmQvYXJtL3NhMTF4eC11ZGExMzQxLmMKaW5kZXggYzc5YTlhZi4uYzdlMWIyNiAxMDA2NDQKLS0tIGEvc291bmQvYXJtL3NhMTF4eC11ZGExMzQxLmMKKysrIGIvc291bmQvYXJtL3NhMTF4eC11ZGExMzQxLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogI2Vsc2UKIAlkbWFfcmVnc190ICpkbWFfcmVnczsJLyogcG9pbnRzIHRvIG91ciBETUEgcmVnaXN0ZXJzICovCiAjZW5kaWYKLQlpbnQgYWN0aXZlOjE7CQkvKiB3ZSBhcmUgdXNpbmcgdGhpcyBzdHJlYW0gZm9yIHRyYW5zZmVyIG5vdyAqLworCXVuc2lnbmVkIGludCBhY3RpdmU6MTsJLyogd2UgYXJlIHVzaW5nIHRoaXMgc3RyZWFtIGZvciB0cmFuc2ZlciBub3cgKi8KIAlpbnQgcGVyaW9kOwkJLyogY3VycmVudCB0cmFuc2ZlciBwZXJpb2QgKi8KIAlpbnQgcGVyaW9kczsJCS8qIGN1cnJlbnQgY291bnQgb2YgcGVyaW9kcyByZWdpc3RlcmQgaW4gdGhlIERNQSBlbmdpbmUgKi8KIAlpbnQgdHhfc3BpbjsJCS8qIGFyZSB3ZSByZWNvZGluZyAtIGZsYWcgdXNlZCB0byBkbyBETUEgdHJhbnMuIGZvciBzeW5jICovCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2NvbnRyb2wuYyBiL3NvdW5kL2NvcmUvY29udHJvbC5jCmluZGV4IDY5NzNhOTYuLjQ4ZWYwYTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29udHJvbC5jCisrKyBiL3NvdW5kL2NvcmUvY29udHJvbC5jCkBAIC0xMDE4LDEwICsxMDE4LDYgQEAKIAl9CiAJc3dpdGNoIChpbmZvLT50eXBlKSB7CiAJY2FzZSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU46Ci0JCXByaXZhdGVfc2l6ZSA9IHNpemVvZihjaGFyKTsKLQkJaWYgKGluZm8tPmNvdW50ID4gMTI4KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwogCWNhc2UgU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOgogCQlwcml2YXRlX3NpemUgPSBzaXplb2YobG9uZyk7CiAJCWlmIChpbmZvLT5jb3VudCA+IDEyOCkKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5mby5jIGIvc291bmQvY29yZS9pbmZvLmMKaW5kZXggZTQzNjYyYi4uNTQ1OTFlMiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbmZvLmMKKysrIGIvc291bmQvY29yZS9pbmZvLmMKQEAgLTEyMCw3ICsxMjAsMTAgQEAKIAlsZW4gPSBidWZmZXItPmxlbiAtIGJ1ZmZlci0+c2l6ZTsKIAl2YV9zdGFydChhcmdzLCBmbXQpOwogCWZvciAoOzspIHsKLQkJcmVzID0gdnNucHJpbnRmKGJ1ZmZlci0+YnVmZmVyICsgYnVmZmVyLT5jdXJyLCBsZW4sIGZtdCwgYXJncyk7CisJCXZhX2xpc3QgYXA7CisJCXZhX2NvcHkoYXAsIGFyZ3MpOworCQlyZXMgPSB2c25wcmludGYoYnVmZmVyLT5idWZmZXIgKyBidWZmZXItPmN1cnIsIGxlbiwgZm10LCBhcCk7CisJCXZhX2VuZChhcCk7CiAJCWlmIChyZXMgPCBsZW4pCiAJCQlicmVhazsKIAkJZXJyID0gcmVzaXplX2luZm9fYnVmZmVyKGJ1ZmZlciwgYnVmZmVyLT5sZW4gKyBQQUdFX1NJWkUpOwpAQCAtNDg1LDcgKzQ4OCw3IEBACiAKIHN0YXRpYyBpbnQgc25kX2luZm9fZW50cnlfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBzbmRfaW5mb19wcml2YXRlX2RhdGEgKmRhdGE7CiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pbml0LmMgYi9zb3VuZC9jb3JlL2luaXQuYwppbmRleCAzMDU4ZDYyLi42MTUyYTc1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2luaXQuYworKysgYi9zb3VuZC9jb3JlL2luaXQuYwpAQCAtMzYxLDYgKzM2MSw4IEBACiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ1bmFibGUgdG8gZnJlZSBjYXJkIGluZm9cbiIpOwogCQkvKiBOb3QgZmF0YWwgZXJyb3IgKi8KIAl9CisJaWYgKGNhcmQtPmRldikKKwkJZGV2aWNlX3VucmVnaXN0ZXIoY2FyZC0+ZGV2KTsKIAlrZnJlZShjYXJkKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5NSw2ICs0OTcsMTIgQEAKIAlpbnQgZXJyOwogCiAJc25kX2Fzc2VydChjYXJkICE9IE5VTEwsIHJldHVybiAtRUlOVkFMKTsKKwlpZiAoIWNhcmQtPmRldikgeworCQljYXJkLT5kZXYgPSBkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBjYXJkLT5wYXJlbnQsIDAsCisJCQkJCSAgImNhcmQlaSIsIGNhcmQtPm51bWJlcik7CisJCWlmIChJU19FUlIoY2FyZC0+ZGV2KSkKKwkJCWNhcmQtPmRldiA9IE5VTEw7CisJfQogCWlmICgoZXJyID0gc25kX2RldmljZV9yZWdpc3Rlcl9hbGwoY2FyZCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAltdXRleF9sb2NrKCZzbmRfY2FyZF9tdXRleCk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYyBiL3NvdW5kL2NvcmUvb3NzL21peGVyX29zcy5jCmluZGV4IGY0YzY3MDQuLjMzOTFmMmE5IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwpAQCAtMTAyMyw3ICsxMDIzLDcgQEAKIAl9CiAJdXBfcmVhZCgmbWl4ZXItPmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKIAlpZiAoc2xvdC5wcmVzZW50ICE9IDApIHsKLQkJcHNsb3QgPSAoc3RydWN0IHNsb3QgKilrbWFsbG9jKHNpemVvZihzbG90KSwgR0ZQX0tFUk5FTCk7CisJCXBzbG90ID0ga21hbGxvYyhzaXplb2Yoc2xvdCksIEdGUF9LRVJORUwpOwogCQlpZiAoISBwc2xvdCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQkqcHNsb3QgPSBzbG90OwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jIGIvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCmluZGV4IDUwNWIyM2UuLmUwODIxZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKQEAgLTIzNTksNyArMjM1OSw4IEBACiAJCXN1YnN0cmVhbSA9IHBjbV9vc3NfZmlsZS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOwogCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwogCXBjbSA9IHN1YnN0cmVhbS0+cGNtOwotCXNuZF9wY21fb3NzX3N5bmMocGNtX29zc19maWxlKTsKKwlpZiAoIXBjbS0+Y2FyZC0+c2h1dGRvd24pCisJCXNuZF9wY21fb3NzX3N5bmMocGNtX29zc19maWxlKTsKIAltdXRleF9sb2NrKCZwY20tPm9wZW5fbXV0ZXgpOwogCXNuZF9wY21fb3NzX3JlbGVhc2VfZmlsZShwY21fb3NzX2ZpbGUpOwogCW11dGV4X3VubG9jaygmcGNtLT5vcGVuX211dGV4KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtLmMgYi9zb3VuZC9jb3JlL3BjbS5jCmluZGV4IGZiYmJjZDIuLjVhYzZlMTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtLmMKKysrIGIvc291bmQvY29yZS9wY20uYwpAQCAtOTEwLDcgKzkxMCw4IEBACiAJc3Vic3RyZWFtLT5wc3RyLT5zdWJzdHJlYW1fb3BlbmVkLS07CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfcGNtX2NsYXNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19wY21fY2xhc3Moc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWNvbnN0IGNoYXIgKnN0cjsKQEAgLTkyMSw3ICs5MjIsNyBAQAogCQlbU05EUlZfUENNX0NMQVNTX0RJR0lUSVpFUl0gPSAiZGlnaXRpemVyIiwKIAl9OwogCi0JaWYgKCEgKHBjbSA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSkpIHx8CisJaWYgKCEgKHBjbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpKSB8fAogCSAgICBwY20tPmRldl9jbGFzcyA+IFNORFJWX1BDTV9DTEFTU19MQVNUKQogCQlzdHIgPSAibm9uZSI7CiAJZWxzZQpAQCAtOTI5LDcgKzkzMCw3IEBACiAgICAgICAgIHJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBzdHIpOwogfQogCi1zdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgcGNtX2F0dHJzID0KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwY21fYXR0cnMgPQogCV9fQVRUUihwY21fY2xhc3MsIFNfSVJVR08sIHNob3dfcGNtX2NsYXNzLCBOVUxMKTsKIAogc3RhdGljIGludCBzbmRfcGNtX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCAzN2I0YjEwLi5iNTJlODkzIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtMTMxMCw3ICsxMzEwLDggQEAKIAkJCSAgICAgICBpbnQgZl9mbGFncykKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKQorCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOIHx8CisJICAgIHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX0RJU0NPTk5FQ1RFRCkKIAkJcmV0dXJuIC1FQkFERkQ7CiAJaWYgKHNuZF9wY21fcnVubmluZyhzdWJzdHJlYW0pKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTU2OCw3ICsxNTY5LDggQEAKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCWNhcmQgPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZDsKIAotCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKQorCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOIHx8CisJICAgIHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX0RJU0NPTk5FQ1RFRCkKIAkJcmV0dXJuIC1FQkFERkQ7CiAKIAlzbmRfcG93ZXJfbG9jayhjYXJkKTsKQEAgLTE2MDIsNyArMTYwNCw3IEBACiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmICghZmlsZSkKIAkJcmV0dXJuIE5VTEw7Ci0JaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKCFTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8CiAJICAgIGltYWpvcihpbm9kZSkgIT0gc25kX21ham9yKSB7CiAJCWZwdXQoZmlsZSk7CkBAIC0zMDI1LDcgKzMwMjcsNyBAQAogCXN0cnVjdCBwYWdlICogcGFnZTsKIAkKIAlpZiAoc3Vic3RyZWFtID09IE5VTEwpCi0JCXJldHVybiBOT1BBR0VfT09NOworCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocnVudGltZS0+c3RhdHVzKTsKIAlnZXRfcGFnZShwYWdlKTsKQEAgLTMwNjgsNyArMzA3MCw3IEBACiAJc3RydWN0IHBhZ2UgKiBwYWdlOwogCQogCWlmIChzdWJzdHJlYW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5PUEFHRV9PT007CisJCXJldHVybiBOT1BBR0VfU0lHQlVTOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJcGFnZSA9IHZpcnRfdG9fcGFnZShydW50aW1lLT5jb250cm9sKTsKIAlnZXRfcGFnZShwYWdlKTsKQEAgLTMxMjksMTggKzMxMzEsMTggQEAKIAlzaXplX3QgZG1hX2J5dGVzOwogCQogCWlmIChzdWJzdHJlYW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5PUEFHRV9PT007CisJCXJldHVybiBOT1BBR0VfU0lHQlVTOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJb2Zmc2V0ID0gYXJlYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKIAlvZmZzZXQgKz0gYWRkcmVzcyAtIGFyZWEtPnZtX3N0YXJ0OwotCXNuZF9hc3NlcnQoKG9mZnNldCAlIFBBR0VfU0laRSkgPT0gMCwgcmV0dXJuIE5PUEFHRV9PT00pOworCXNuZF9hc3NlcnQoKG9mZnNldCAlIFBBR0VfU0laRSkgPT0gMCwgcmV0dXJuIE5PUEFHRV9TSUdCVVMpOwogCWRtYV9ieXRlcyA9IFBBR0VfQUxJR04ocnVudGltZS0+ZG1hX2J5dGVzKTsKIAlpZiAob2Zmc2V0ID4gZG1hX2J5dGVzIC0gUEFHRV9TSVpFKQogCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsKIAlpZiAoc3Vic3RyZWFtLT5vcHMtPnBhZ2UpIHsKIAkJcGFnZSA9IHN1YnN0cmVhbS0+b3BzLT5wYWdlKHN1YnN0cmVhbSwgb2Zmc2V0KTsKIAkJaWYgKCEgcGFnZSkKLQkJCXJldHVybiBOT1BBR0VfT09NOworCQkJcmV0dXJuIE5PUEFHRV9PT007IC8qIFhYWDogaXMgdGhpcyByZWFsbHkgZHVlIHRvIE9PTT8gKi8KIAl9IGVsc2UgewogCQl2YWRkciA9IHJ1bnRpbWUtPmRtYV9hcmVhICsgb2Zmc2V0OwogCQlwYWdlID0gdmlydF90b19wYWdlKHZhZGRyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcnRjdGltZXIuYyBiL3NvdW5kL2NvcmUvcnRjdGltZXIuYwppbmRleCA0MTJkZDYyLi45ZjdiMzJlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9ydGN0aW1lci5jCkBAIC0yMiwxMyArMjIsMTAgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5mby5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfUlRDKSB8fCBkZWZpbmVkKENPTkZJR19SVENfTU9EVUxFKQogCkBAIC01MCw3ICs0Nyw5IEBACiAgKiBUaGUgaGFyZHdhcmUgZGVwZW5kZW50IGRlc2NyaXB0aW9uIGZvciB0aGlzIHRpbWVyLgogICovCiBzdGF0aWMgc3RydWN0IHNuZF90aW1lcl9oYXJkd2FyZSBydGNfaHcgPSB7Ci0JLmZsYWdzID0JU05EUlZfVElNRVJfSFdfRklSU1R8U05EUlZfVElNRVJfSFdfQVVUTywKKwkuZmxhZ3MgPQlTTkRSVl9USU1FUl9IV19BVVRPIHwKKwkJCVNORFJWX1RJTUVSX0hXX0ZJUlNUIHwKKwkJCVNORFJWX1RJTUVSX0hXX1RBU0tMRVQsCiAJLnRpY2tzID0JMTAwMDAwMDAwTCwJCS8qIEZJWE1FOiBYWFggKi8KIAkub3BlbiA9CQlydGN0aW1lcl9vcGVuLAogCS5jbG9zZSA9CXJ0Y3RpbWVyX2Nsb3NlLApAQCAtNjAsNiArNTksNyBAQAogCiBzdGF0aWMgaW50IHJ0Y3RpbWVyX2ZyZXEgPSBSVENfRlJFUTsJCS8qIGZyZXF1ZW5jeSAqLwogc3RhdGljIHN0cnVjdCBzbmRfdGltZXIgKnJ0Y3RpbWVyOworc3RhdGljIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBydGNfdGFza2xldDsKIHN0YXRpYyBydGNfdGFza190IHJ0Y190YXNrOwogCiAKQEAgLTgxLDYgKzgxLDcgQEAKIAlydGNfdGFza190ICpydGMgPSB0LT5wcml2YXRlX2RhdGE7CiAJaWYgKHJ0YykgewogCQlydGNfdW5yZWdpc3RlcihydGMpOworCQl0YXNrbGV0X2tpbGwoJnJ0Y190YXNrbGV0KTsKIAkJdC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xMDUsMTIgKzEwNiwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBydGN0aW1lcl90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzbmRfdGltZXJfaW50ZXJydXB0KChzdHJ1Y3Qgc25kX3RpbWVyICopZGF0YSwgMSk7Cit9CisKIC8qCiAgKiBpbnRlcnJ1cHQKICAqLwogc3RhdGljIHZvaWQgcnRjdGltZXJfaW50ZXJydXB0KHZvaWQgKnByaXZhdGVfZGF0YSkKIHsKLQlzbmRfdGltZXJfaW50ZXJydXB0KHByaXZhdGVfZGF0YSwgMSk7CisJdGFza2xldF9oaV9zY2hlZHVsZShwcml2YXRlX2RhdGEpOwogfQogCiAKQEAgLTEzOSw5ICsxNDUsMTEgQEAKIAl0aW1lci0+aHcgPSBydGNfaHc7CiAJdGltZXItPmh3LnJlc29sdXRpb24gPSBOQU5PX1NFQyAvIHJ0Y3RpbWVyX2ZyZXE7CiAKKwl0YXNrbGV0X2luaXQoJnJ0Y190YXNrbGV0LCBydGN0aW1lcl90YXNrbGV0LCAodW5zaWduZWQgbG9uZyl0aW1lcik7CisKIAkvKiBzZXQgdXAgUlRDIGNhbGxiYWNrICovCiAJcnRjX3Rhc2suZnVuYyA9IHJ0Y3RpbWVyX2ludGVycnVwdDsKLQlydGNfdGFzay5wcml2YXRlX2RhdGEgPSB0aW1lcjsKKwlydGNfdGFzay5wcml2YXRlX2RhdGEgPSAmcnRjX3Rhc2tsZXQ7CiAKIAllcnIgPSBzbmRfdGltZXJfZ2xvYmFsX3JlZ2lzdGVyKHRpbWVyKTsKIAlpZiAoZXJyIDwgMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZC5jIGIvc291bmQvY29yZS9zb3VuZC5jCmluZGV4IGVmYTQ3NmMuLjI4Mjc0MjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc291bmQuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kLmMKQEAgLTYxLDkgKzYxLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX21pbm9yICpzbmRfbWlub3JzW1NORFJWX09TX01JTk9SU107CiBzdGF0aWMgREVGSU5FX01VVEVYKHNvdW5kX211dGV4KTsKIAotZXh0ZXJuIHN0cnVjdCBjbGFzcyAqc291bmRfY2xhc3M7Ci0KLQogI2lmZGVmIENPTkZJR19LTU9ECiAKIC8qKgpAQCAtMjY4LDExICsyNjUsMTAgQEAKIAlzbmRfbWlub3JzW21pbm9yXSA9IHByZWc7CiAJaWYgKGNhcmQpCiAJCWRldmljZSA9IGNhcmQtPmRldjsKLQlwcmVnLT5jbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBOVUxMLAotCQkJCQkgICAgICBNS0RFVihtYWpvciwgbWlub3IpLAotCQkJCQkgICAgICBkZXZpY2UsICIlcyIsIG5hbWUpOwotCWlmIChwcmVnLT5jbGFzc19kZXYpCi0JCWNsYXNzX3NldF9kZXZkYXRhKHByZWctPmNsYXNzX2RldiwgcHJpdmF0ZV9kYXRhKTsKKwlwcmVnLT5kZXYgPSBkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBkZXZpY2UsIE1LREVWKG1ham9yLCBtaW5vciksCisJCQkJICAiJXMiLCBuYW1lKTsKKwlpZiAocHJlZy0+ZGV2KQorCQlkZXZfc2V0X2RydmRhdGEocHJlZy0+ZGV2LCBwcml2YXRlX2RhdGEpOwogCiAJbXV0ZXhfdW5sb2NrKCZzb3VuZF9tdXRleCk7CiAJcmV0dXJuIDA7CkBAIC0zMjAsNyArMzE2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3koc291bmRfY2xhc3MsIE1LREVWKG1ham9yLCBtaW5vcikpOworCWRldmljZV9kZXN0cm95KHNvdW5kX2NsYXNzLCBNS0RFVihtYWpvciwgbWlub3IpKTsKIAogCWtmcmVlKHNuZF9taW5vcnNbbWlub3JdKTsKIAlzbmRfbWlub3JzW21pbm9yXSA9IE5VTEw7CkBAIC0zMzEsMTUgKzMyNywxNSBAQAogRVhQT1JUX1NZTUJPTChzbmRfdW5yZWdpc3Rlcl9kZXZpY2UpOwogCiBpbnQgc25kX2FkZF9kZXZpY2Vfc3lzZnNfZmlsZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2LAotCQkJICAgICAgY29uc3Qgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cikKIHsKIAlpbnQgbWlub3IsIHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkOwogCiAJbXV0ZXhfbG9jaygmc291bmRfbXV0ZXgpOwogCW1pbm9yID0gZmluZF9zbmRfbWlub3IodHlwZSwgY2FyZCwgZGV2KTsKLQlpZiAobWlub3IgPj0gMCAmJiAoY2RldiA9IHNuZF9taW5vcnNbbWlub3JdLT5jbGFzc19kZXYpICE9IE5VTEwpCi0JCXJldCA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjZGV2LCBhdHRyKTsKKwlpZiAobWlub3IgPj0gMCAmJiAoZCA9IHNuZF9taW5vcnNbbWlub3JdLT5kZXYpICE9IE5VTEwpCisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkLCBhdHRyKTsKIAltdXRleF91bmxvY2soJnNvdW5kX211dGV4KTsKIAlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL0tjb25maWcgYi9zb3VuZC9kcml2ZXJzL0tjb25maWcKaW5kZXggNzk3MTI4NS4uNDBlYmQyZiAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9LY29uZmlnCisrKyBiL3NvdW5kL2RyaXZlcnMvS2NvbmZpZwpAQCAtMjYsMTEgKzI2LDcgQEAKIGNvbmZpZyBTTkRfQUM5N19DT0RFQwogCXRyaXN0YXRlCiAJc2VsZWN0IFNORF9QQ00KLQlzZWxlY3QgU05EX0FDOTdfQlVTCi0KLWNvbmZpZyBTTkRfQUM5N19CVVMKLQl0cmlzdGF0ZQotCisJc2VsZWN0IEFDOTdfQlVTCiAKIGNvbmZpZyBTTkRfRFVNTVkKIAl0cmlzdGF0ZSAiRHVtbXkgKC9kZXYvbnVsbCkgc291bmRjYXJkIgpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL2FrNDExNC5jIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCmluZGV4IDEyZmZmZmMuLmQyZjJjNTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYworKysgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogI2RlZmluZSBBSzQxMTRfQUREUgkJCTB4MDAgLyogZml4ZWQgYWRkcmVzcyAqLwogCi1zdGF0aWMgdm9pZCBhazQxMTRfc3RhdHModm9pZCAqKTsKK3N0YXRpYyB2b2lkIGFrNDExNF9zdGF0cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdGF0aWMgdm9pZCByZWdfd3JpdGUoc3RydWN0IGFrNDExNCAqYWs0MTE0LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWwpCiB7CkBAIC0xNTgsNyArMTU4LDcgQEAKIAlyZWdfd3JpdGUoY2hpcCwgQUs0MTE0X1JFR19QV1JETiwgb2xkIHwgQUs0MTE0X1JTVCB8IEFLNDExNF9QV04pOwogCS8qIGJyaW5nIHVwIHN0YXRpc3RpY3MgLyBldmVudCBxdWVpbmcgKi8KIAljaGlwLT5pbml0ID0gMDsKLQlJTklUX1dPUksoJmNoaXAtPndvcmssIGFrNDExNF9zdGF0cywgY2hpcCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmNoaXAtPndvcmssIGFrNDExNF9zdGF0cyk7CiAJcXVldWVfZGVsYXllZF93b3JrKGNoaXAtPndvcmtxdWV1ZSwgJmNoaXAtPndvcmssIEhaIC8gMTApOwogfQogCkBAIC01NjEsOSArNTYxLDkgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgdm9pZCBhazQxMTRfc3RhdHModm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGFrNDExNF9zdGF0cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGFrNDExNCAqY2hpcCA9IChzdHJ1Y3QgYWs0MTE0ICopZGF0YTsKKwlzdHJ1Y3QgYWs0MTE0ICpjaGlwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhazQxMTQsIHdvcmsud29yayk7CiAKIAlpZiAoY2hpcC0+aW5pdCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL0tjb25maWcgYi9zb3VuZC9pc2EvS2NvbmZpZwppbmRleCA1NTdjNGRlLi41NzM3MWYxIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvS2NvbmZpZworKysgYi9zb3VuZC9pc2EvS2NvbmZpZwpAQCAtMTMsNiArMTMsNyBAQAogCiBjb25maWcgU05EX0FETElCCiAJdHJpc3RhdGUgIkFkTGliIEZNIGNhcmQiCisJZGVwZW5kcyBvbiBTTkQKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEFkTGliIEZNIGNhcmRzLgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCmluZGV4IGIzM2E1ZmIuLjU5MDM0NTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYworKysgYi9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKQEAgLTEyMCw2ICsxMjAsOCBAQAogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKmNmZyA9IGttYWxsb2Moc2l6ZW9mKCpjZmcpLCBHRlBfS0VSTkVMKTsKIAlpbnQgZXJyOwogCisJaWYgKCFjZmcpCisJCXJldHVybiAtRU5PTUVNOwogCWFjYXJkLT5kZXYgPSBwbnBfcmVxdWVzdF9jYXJkX2RldmljZShjYXJkLCBpZC0+ZGV2c1swXS5pZCwgTlVMTCk7CiAJaWYgKGFjYXJkLT5kZXYgPT0gTlVMTCkgewogCQlrZnJlZShjZmcpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NtaTgzMzAuYyBiL3NvdW5kL2lzYS9jbWk4MzMwLmMKaW5kZXggM2MxZTlmZC4uZDFmNmRmYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NtaTgzMzAuYworKysgYi9zb3VuZC9pc2EvY21pODMzMC5jCkBAIC0yODksNiArMjg5LDggQEAKIAlzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogY2ZnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSksIEdGUF9LRVJORUwpOwogCWludCBlcnI7CiAKKwlpZiAoIWNmZykKKwkJcmV0dXJuIC1FTk9NRU07CiAJYWNhcmQtPmNhcCA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIGlkLT5kZXZzWzBdLmlkLCBOVUxMKTsKIAlpZiAoYWNhcmQtPmNhcCA9PSBOVUxMKSB7CiAJCWtmcmVlKGNmZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jIGIvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYwppbmRleCBmMTJjZDA5Li40ZWMyZDc5IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCisrKyBiL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKQEAgLTU2NCw2ICs1NjQsOCBAQAogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiBjZmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlKSwgR0ZQX0tFUk5FTCk7CiAJaW50IGVycjsKIAorCWlmICghY2ZnKQorCQlyZXR1cm4gLUVOT01FTTsKIAlpd2NhcmQtPmRldiA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIGlkLT5kZXZzWzBdLmlkLCBOVUxMKTsKIAlpZiAoaXdjYXJkLT5kZXYgPT0gTlVMTCkgewogCQlrZnJlZShjZmcpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYyBiL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKaW5kZXggYTFhZDM5YS4uZGYyMjczNyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCkBAIC0xNjgzLDYgKzE2ODMsOCBAQAogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKmNmZyA9IGttYWxsb2Moc2l6ZW9mKCpjZmcpLCBHRlBfS0VSTkVMKTsKIAlpbnQgZXJyOwogCisJaWYgKCFjZmcpCisJCXJldHVybiAtRU5PTUVNOwogCWNoaXAtPmRldiA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIHBpZC0+ZGV2c1swXS5pZCwgTlVMTCk7CiAJaWYgKGNoaXAtPmRldiA9PSBOVUxMKSB7CiAJCWtmcmVlKGNmZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvS2NvbmZpZyBiL3NvdW5kL29zcy9LY29uZmlnCmluZGV4IGNjMmI5YWIuLmEwNTg4YzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9LY29uZmlnCisrKyBiL3NvdW5kL29zcy9LY29uZmlnCkBAIC01LDIwICs1LDYgQEAKICMKICMgUHJvbXB0IHVzZXIgZm9yIHByaW1hcnkgZHJpdmVycy4KIAotY29uZmlnIE9TU19PQlNPTEVURV9EUklWRVIKLQlib29sICJPYnNvbGV0ZSBPU1MgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBvYnNvbGV0ZSBPU1MgZHJpdmVycyB0aGF0Ci0JICBhcmUgc2NoZWR1bGVkIGZvciByZW1vdmFsIGluIHRoZSBuZWFyIGZ1dHVyZSBzaW5jZSB0aGVyZQotCSAgYXJlIEFMU0EgZHJpdmVycyBmb3IgdGhlIHNhbWUgaGFyZHdhcmUuCi0KLQkgIFBsZWFzZSBjb250YWN0IEFkcmlhbiBCdW5rIDxidW5rQHN0dXN0YS5kZT4gaWYgeW91IGhhZCB0bwotCSAgc2F5IFkgaGVyZSBiZWNhdXNlIHlvdXIgc291bmRjYXJkIGlzIG5vdCBwcm9wZXJseSBzdXBwb3J0ZWQKLQkgIGJ5IEFMU0EuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBTT1VORF9CVDg3OAogCXRyaXN0YXRlICJCVDg3OCBhdWRpbyBkbWEiCiAJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBQQ0kKQEAgLTM1LDQwICsyMSw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBidGF1ZGlvLgogCi1jb25maWcgU09VTkRfRU1VMTBLMQotCXRyaXN0YXRlICJDcmVhdGl2ZSBTQkxpdmUhIChFTVUxMEsxKSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSSAmJiBPU1NfT0JTT0xFVEVfRFJJVkVSCi0JLS0taGVscC0tLQotCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhIFBDSSBzb3VuZCBjYXJkIHVzaW5nIHRoZSBFTVUxMEsxIGNoaXBzZXQsCi0JICBzdWNoIGFzIHRoZSBDcmVhdGl2ZSBTQkxpdmUhLCBTQiBQQ0k1MTIgb3IgRW11LUFQUy4KLQotCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIgYW5kIHRoZSBkZWdyZWUgb2Ygc3VwcG9ydCBmb3IKLQkgIHRoZSBkaWZmZXJlbnQgY2FyZCBtb2RlbHMgcGxlYXNlIGNoZWNrOgotCi0JCTxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2VtdTEwazEvPgotCi0JICBJdCBpcyBub3cgcG9zc2libGUgdG8gbG9hZCBkc3AgbWljcm9jb2RlIHBhdGNoZXMgaW50byB0aGUgRU1VMTBLMQotCSAgY2hpcC4gIFRoZXNlIHBhdGNoZXMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHJlYWwgdGltZSBzb3VuZAotCSAgcHJvY2Vzc2luZyBlZmZlY3RzIHdoaWNoIGluY2x1ZGUgZm9yIGV4YW1wbGU6IHNpZ25hbCByb3V0aW5nLAotCSAgYmFzcy90cmVibGUgY29udHJvbCwgQUMzIHBhc3N0aHJvdWdoLCAuLi4KLQkgIFVzZXJzcGFjZSB0b29scyB0byBjcmVhdGUgbmV3IHBhdGNoZXMgYW5kIGxvYWQvdW5sb2FkIHRoZW0gY2FuIGJlCi0JICBmb3VuZCBpbiB0aGUgZW11LXRvb2xzIHBhY2thZ2UgYXQgdGhlIGFib3ZlIFVSTC4KLQotY29uZmlnIE1JRElfRU1VMTBLMQotCWJvb2wgIkNyZWF0aXZlIFNCTGl2ZSEgTUlESSAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFNPVU5EX0VNVTEwSzEgJiYgRVhQRVJJTUVOVEFMICYmIElTQV9ETUFfQVBJCi0JaGVscAotCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgdGhlIE9TUyAvZGV2L3NlcXVlbmNlcgotCSAgaW50ZXJmYWNlLiAgVGhpcyBjb2RlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC4KLQotY29uZmlnIFNPVU5EX0ZVU0lPTgotCXRyaXN0YXRlICJDcnlzdGFsIFNvdW5kRnVzaW9uIChDUzQyODAvNDYxeCkiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBQQ0kgJiYgT1NTX09CU09MRVRFX0RSSVZFUgotCWhlbHAKLQkgIFRoaXMgbW9kdWxlIGRyaXZlcyB0aGUgQ3J5c3RhbCBTb3VuZEZ1c2lvbiBkZXZpY2VzIChDUzQyODAvNDZ4eAotCSAgc2VyaWVzKSB3aGVuIHdpcmVkIGFzIG5hdGl2ZSBzb3VuZCBkcml2ZXJzIHdpdGggQUM5NyBjb2RlY3MuICBJZgotCSAgdGhpcyBkcml2ZXIgZG9lcyBub3Qgd29yayB0cnkgdGhlIENTNDIzMiBkcml2ZXIuCi0KIGNvbmZpZyBTT1VORF9CQ01fQ1M0Mjk3QQogCXRyaXN0YXRlICJDcnlzdGFsIFNvdW5kIENTNDI5N2EgKGZvciBTd2FybSkiCiAJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTSUJZVEVfU1dBUk0KQEAgLTQ0OCw0NyArNDAwLDYgQEAKIAogCSAgU2F5IFkgdW5sZXNzIHlvdSBoYXZlIDE2TUIgb3IgbW9yZSBSQU0gb3IgYSBQQ0kgc291bmQgY2FyZC4KIAotY29uZmlnIFNPVU5EX0FEMTgxNgotCXRyaXN0YXRlICJBRDE4MTYoQSkgYmFzZWQgY2FyZHMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgU09VTkRfT1NTICYmIE9TU19PQlNPTEVURV9EUklWRVIKLQloZWxwCi0JICBTYXkgTSBoZXJlIGlmIHlvdSBoYXZlIGEgc291bmQgY2FyZCBiYXNlZCBvbiB0aGUgQW5hbG9nIERldmljZXMKLQkgIEFEMTgxNihBKSBjaGlwLgotCi0JICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCi0JICAiYWQxODE2PTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+IiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KLQotY29uZmlnIFNPVU5EX0FEMTg4OQotCXRyaXN0YXRlICJBRDE4ODkgYmFzZWQgY2FyZHMgKEFEMTgxOSBjb2RlYykgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgU09VTkRfT1NTICYmIFBDSSAmJiBPU1NfT0JTT0xFVEVfRFJJVkVSCi0JaGVscAotCSAgU2F5IE0gaGVyZSBpZiB5b3UgaGF2ZSBhIHNvdW5kIGNhcmQgYmFzZWQgb24gdGhlIEFuYWxvZyBEZXZpY2VzCi0JICBBRDE4ODkgY2hpcC4KLQotY29uZmlnIFNPVU5EX0FETElCCi0JdHJpc3RhdGUgIkFkbGliIENhcmRzIgotCWRlcGVuZHMgb24gU09VTkRfT1NTICYmIE9TU19PQlNPTEVURV9EUklWRVIKLQloZWxwCi0JICBJbmNsdWRlcyBBU0IgNjQgNEQuIEluZm9ybWF0aW9uIG9uIHByb2dyYW1taW5nIEFkTGliIGNhcmRzIGlzCi0JICBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cuaXRzbmV0LmNvbS9ob21lL2xkcmFnb24vU3BlY3MvYWRsaWIuaHRtbD4uCi0KLWNvbmZpZyBTT1VORF9BQ0lfTUlYRVIKLQl0cmlzdGF0ZSAiQUNJIG1peGVyIChtaXJvU09VTkQgUENNMS1wcm8vUENNMTIvUENNMjApIgotCWRlcGVuZHMgb24gU09VTkRfT1NTICYmIE9TU19PQlNPTEVURV9EUklWRVIKLQktLS1oZWxwLS0tCi0JICBBQ0kgKEF1ZGlvIENvbW1hbmQgSW50ZXJmYWNlKSBpcyBhIHByb3RvY29sIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aAotCSAgdGhlIG1pY3JvY29udHJvbGxlciBvbiBzb21lIHNvdW5kIGNhcmRzIHByb2R1Y2VkIGJ5IG1pcm8gYW5kCi0JICBDYXJkaW5hbCBUZWNobm9sb2dpZXMuICBUaGUgbWFpbiBmdW5jdGlvbiBvZiB0aGUgQUNJIGlzIHRvIGNvbnRyb2wKLQkgIHRoZSBtaXhlciBhbmQgdG8gZ2V0IGEgcHJvZHVjdCBpZGVudGlmaWNhdGlvbi4KLQotCSAgVGhpcyBWb3hXYXJlIEFDSSBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBBQ0kgZnVuY3Rpb25zIG9uIHRoZQotCSAgbWlyb1NPVU5EIFBDTTEtcHJvLCBQQ00xMiBhbmQgUENNMjAgcmFkaW8uIE9uIHRoZSBQQ00yMCByYWRpbywgQUNJCi0JICBhbHNvIGNvbnRyb2xzIHRoZSByYWRpbyB0dW5lci4gVGhpcyBpcyBzdXBwb3J0ZWQgaW4gdGhlIHZpZGVvNGxpbnV4Ci0JICBtaXJvcGNtMjAgZHJpdmVyIChzYXkgTSBvciBZIGhlcmUgYW5kIGdvIGJhY2sgdG8gIk11bHRpbWVkaWEKLQkgIGRldmljZXMiIC0+ICJSYWRpbyBBZGFwdGVycyIpLgotCi0JICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSBhbmQgd2lsbCBiZSBjYWxsZWQgYWNpLgotCiBjb25maWcgU09VTkRfQ1M0MjMyCiAJdHJpc3RhdGUgIkNyeXN0YWwgQ1M0MjMyIGJhc2VkIChQblApIGNhcmRzIgogCWRlcGVuZHMgb24gU09VTkRfT1NTCkBAIC01OTQsMTggKzUwNSw2IEBACiAJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCiAJICAibXB1NDAxPTxpbz4sPGlycT4iIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgogCi1jb25maWcgU09VTkRfTk0yNTYKLQl0cmlzdGF0ZSAiTk0yNTZBVi9OTTI1NlpYIGF1ZGlvIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT1VORF9PU1MgJiYgT1NTX09CU09MRVRFX0RSSVZFUgotCWhlbHAKLQkgIFNheSBNIGhlcmUgdG8gaW5jbHVkZSBhdWRpbyBzdXBwb3J0IGZvciB0aGUgTmVvTWFnaWMgMjU2QVYvMjU2WlgKLQkgIGNoaXBzZXRzLiBUaGVzZSBhcmUgdGhlIGF1ZGlvIGNoaXBzZXRzIGZvdW5kIGluIHRoZSBTb255Ci0JICBaNTA1Uy9TWC9EWCwgc29tZSBTb255IEYtc2VyaWVzLCBhbmQgdGhlIERlbGwgTGF0aXR1ZGUgQ1BpIGFuZCBDUHQKLQkgIGxhcHRvcHMuIEl0IGluY2x1ZGVzIHN1cHBvcnQgZm9yIGFuIEFDOTctY29tcGF0aWJsZSBtaXhlciBhbmQgYW4KLQkgIGFwcGFyZW50bHkgcHJvcHJpZXRhcnkgc291bmQgZW5naW5lLgotCi0JICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvTk0yNTY+IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotCiBjb25maWcgU09VTkRfUEFTCiAJdHJpc3RhdGUgIlByb0F1ZGlvU3BlY3RydW0gMTYgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNPVU5EX09TUwpAQCAtNzE0LDIwICs2MTMsNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCi1jb25maWcgU09VTkRfT1BMM1NBMgotCXRyaXN0YXRlICJZYW1haGEgT1BMMy1TQTIgYW5kIFNBMyBiYXNlZCBQblAgY2FyZHMiCi0JZGVwZW5kcyBvbiBTT1VORF9PU1MgJiYgT1NTX09CU09MRVRFX0RSSVZFUgotCWhlbHAKLQkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBjYXJkIGJhc2VkIG9uIG9uZSBvZiB0aGVzZSBZYW1haGEgc291bmQKLQkgIGNoaXBzZXRzIG9yIHRoZSAiU0F4Iiwgd2hpY2ggaXMgYWN0dWFsbHkgYSBTQTMuIFJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL09QTDMtU0EyPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgotCSAgY29uZmlndXJpbmcgdGhlc2UgY2FyZHMuCi0KLQkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsIGFuZCBkbyBub3QgYWxzbwotCSAgY29uZmlndXJlIGluIHRoZSBvcHRpb25hbCBJU0EgUG5QIHN1cHBvcnQsIHlvdSB3aWxsIGhhdmUgdG8gYWRkCi0JICAib3BsM3NhMj08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXNzaW8+LDxtcHVpbz4iIHRvIHRoZSBrZXJuZWwKLQkgIGNvbW1hbmQgbGluZS4KLQogY29uZmlnIFNPVU5EX1VBUlQ2ODUwCiAJdHJpc3RhdGUgIjY4NTAgVUFSVCBzdXBwb3J0IgogCWRlcGVuZHMgb24gU09VTkRfT1NTCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODQ4LmMgYi9zb3VuZC9vc3MvYWQxODQ4LmMKaW5kZXggMGZmYTk5Ny4uN2NmOTkxMyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2FkMTg0OC5jCisrKyBiL3NvdW5kL29zcy9hZDE4NDguYwpAQCAtMTk5Miw3ICsxOTkyLDcgQEAKIAkJCWRldmMtPmF1ZGlvX2ZsYWdzIHw9IERNQV9EVVBMRVg7CiAJfQogCi0JcG9ydGMgPSAoYWQxODQ4X3BvcnRfaW5mbyAqKSBrbWFsbG9jKHNpemVvZihhZDE4NDhfcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJcG9ydGMgPSBrbWFsbG9jKHNpemVvZihhZDE4NDhfcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYocG9ydGM9PU5VTEwpIHsKIAkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgNCk7CiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9idGF1ZGlvLmMgYi9zb3VuZC9vc3MvYnRhdWRpby5jCmluZGV4IDZhZDM4NDEuLmFkNzIxMGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9idGF1ZGlvLmMKKysrIGIvc291bmQvb3NzL2J0YXVkaW8uYwpAQCAtMTAyMCw2ICsxMDIwLDcgQEAKICBmYWlsMjoKICAgICAgICAgZnJlZV9pcnEoYnRhLT5pcnEsYnRhKTsJCiAgZmFpbDE6CisJaW91bm1hcChidGEtPm1taW8pOwogCWtmcmVlKGJ0YSk7CiAgZmFpbDA6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LDApLApAQCAtMTA1MSw2ICsxMDUyLDcgQEAKICAgICAgICAgZnJlZV9pcnEoYnRhLT5pcnEsYnRhKTsKIAlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCksCiAJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsMCkpOworCWlvdW5tYXAoYnRhLT5tbWlvKTsKIAogCS8qIHJlbW92ZSBmcm9tIGxpbmtlZCBsaXN0ICovCiAJaWYgKGJ0YSA9PSBidGF1ZGlvcykgewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDIzMi5jIGIvc291bmQvb3NzL2NzNDIzMi5jCmluZGV4IGI2OTI0YzcuLmRlNDBlMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9jczQyMzIuYworKysgYi9zb3VuZC9vc3MvY3M0MjMyLmMKQEAgLTQwOCw3ICs0MDgsNyBAQAogewogCXN0cnVjdCBhZGRyZXNzX2luZm8gKmlzYXBucGNmZzsKIAotCWlzYXBucGNmZz0oc3RydWN0IGFkZHJlc3NfaW5mbyopa21hbGxvYyhzaXplb2YoKmlzYXBucGNmZyksR0ZQX0tFUk5FTCk7CisJaXNhcG5wY2ZnID0ga21hbGxvYyhzaXplb2YoKmlzYXBucGNmZyksR0ZQX0tFUk5FTCk7CiAJaWYgKCFpc2FwbnBjZmcpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0Nnh4LmMgYi9zb3VuZC9vc3MvY3M0Nnh4LmMKaW5kZXggNmUzYzQxZi4uMTQ3YzhhOSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2NzNDZ4eC5jCisrKyBiL3NvdW5kL29zcy9jczQ2eHguYwpAQCAtOTEsNiArOTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgpAQCAtNzc5LDcgKzc4MCw3IEBACiAJCXJhdGUgPSA0ODAwMCAvIDk7CiAKIAkvKgotCSAqICBXZSBjYW4gbm90IGNhcHR1cmUgYXQgYXQgcmF0ZSBncmVhdGVyIHRoYW4gdGhlIElucHV0IFJhdGUgKDQ4MDAwKS4KKwkgKiAgV2UgY2Fubm90IGNhcHR1cmUgYXQgYXQgcmF0ZSBncmVhdGVyIHRoYW4gdGhlIElucHV0IFJhdGUgKDQ4MDAwKS4KIAkgKiAgUmV0dXJuIGFuIGVycm9yIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzdHJheSBvdXRzaWRlIHRoYXQgbGltaXQuCiAJICovCiAJaWYgKHJhdGUgPiA0ODAwMCkKQEAgLTQ3NTQsOCArNDc1NSw4IEBACiAJbWRlbGF5KDUgKiBjc19sYXB0b3Bfd2FpdCk7CQkvKiBTaG91bGRudCBiZSBuZWVkZWQgPz8gKi8KIAkKIC8qCi0qIElmIHdlIGFyZSByZXN1bWluZyB1bmRlciAyLjIueCB0aGVuIHdlIGNhbiBub3Qgc2NoZWR1bGUgYSB0aW1lb3V0LgotKiBzbywganVzdCBzcGluIHRoZSBDUFUuCisqIElmIHdlIGFyZSByZXN1bWluZyB1bmRlciAyLjIueCB0aGVuIHdlIGNhbm5vdCBzY2hlZHVsZSBhIHRpbWVvdXQsCisqIHNvIGp1c3Qgc3BpbiB0aGUgQ1BVLgogKi8KIAlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewogCS8qCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hYnVmLmMgYi9zb3VuZC9vc3MvZG1hYnVmLmMKaW5kZXggYjI1NmMwNC4uZWFmNjk5NyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2RtYWJ1Zi5jCisrKyBiL3NvdW5kL29zcy9kbWFidWYuYwpAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSBCRV9DT05TRVJWQVRJVkUKICNkZWZpbmUgU0FNUExFX1JPVU5EVVAgMAogCisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKIAogI2RlZmluZSBETUFQX0ZSRUVfT05fQ0xPU0UgICAgICAwCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfY29yZS5jIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2NvcmUuYwppbmRleCA4N2JkMzEwLi44MGI4MzZlIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfY29yZS5jCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9jb3JlLmMKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAKIAlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKIAkJaWYgKHdyaXRlX3NxLmJ1c3kpCi0JCQlyYyA9IHNxX2ZzeW5jKGZpbGUsIGZpbGUtPmZfZGVudHJ5KTsKKwkJCXJjID0gc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CiAKIAkJc3FfcmVzZXRfb3V0cHV0KCkgOyAvKiBtYWtlIHN1cmUgZG1hIGlzIHN0b3BwZWQgYW5kIGFsbCBpcyBxdWlldCAqLwogCQl3cml0ZV9zcV9yZWxlYXNlX2J1ZmZlcnMoKTsKQEAgLTEyMTcsNyArMTIxNyw3IEBACiAJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgZG1hc291bmQubWFjaC5yZWNvcmQpCiAJCQlzcV9yZXNldF9pbnB1dCgpIDsKIAkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQlyZXN1bHQgPSBzcV9mc3luYyhmaWxlLCBmaWxlLT5mX2RlbnRyeSk7CisJCQlyZXN1bHQgPSBzcV9mc3luYyhmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAkJCXNxX3Jlc2V0X291dHB1dCgpIDsKIAkJfQogCQkvKiBpZiB3ZSBhcmUgdGhlIHNoYXJlZCByZXNvdXJjZSBvd25lciB0aGVuIHJlbGVhc2UgdGhlbSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uYyBiL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMKaW5kZXggY2RlNGQ1OS4uZWZjZjU4OSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uYworKysgYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAKICNpbmNsdWRlICJod2FjY2Vzcy5oIgpAQCAtMTEwLDkgKzExMSwxNSBAQAogCiAJCWlmICgoYnl0ZXN0b2NvcHkgPj0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKIAkJICAgIHx8IChieXRlc3RvY29weSA+PSBjb3VudCkpIHsKKwkJCWludCByYzsKKwogCQkJYnl0ZXN0b2NvcHkgPSBtaW5fdCh1MzIsIGJ5dGVzdG9jb3B5LCBjb3VudCk7CiAKLQkJCWVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHdpaW5zdCwgKHU4IF9fdXNlciAqKWJ1ZmZlciwgJmJ5dGVzdG9jb3B5KTsKKwkJCXJjID0gZW11MTBrMV93YXZlaW5feGZlcmRhdGEod2lpbnN0LAorCQkJCQkJICAgICAodTggX191c2VyICopYnVmZmVyLAorCQkJCQkJICAgICAmYnl0ZXN0b2NvcHkpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiByYzsKIAogCQkJY291bnQgLT0gYnl0ZXN0b2NvcHk7CiAJCQlidWZmZXIgKz0gYnl0ZXN0b2NvcHk7CkBAIC0xMTMyLDcgKzExMzksNyBAQAogCiBtYXRjaDoKIAotCXdhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSksIEdGUF9LRVJORUwpOworCXdhdmVfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSksIEdGUF9LRVJORUwpOwogCiAJaWYgKHdhdmVfZGV2ID09IE5VTEwpIHsgCiAJCUVSUk9SKCk7CkBAIC0xMTQ4LDcgKzExNTUsNyBAQAogCQkvKiBSZWNvcmRpbmcgKi8KIAkJc3RydWN0IHdpaW5zdCAqd2lpbnN0OwogCi0JCWlmICgod2lpbnN0ID0gKHN0cnVjdCB3aWluc3QgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHdpaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCWlmICgod2lpbnN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdpaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CiAJCQlFUlJPUigpOwogCQkJa2ZyZWUod2F2ZV9kZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMjA0LDcgKzEyMTEsNyBAQAogCQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3Q7CiAJCWludCBpOwogCi0JCWlmICgod29pbnN0ID0gKHN0cnVjdCB3b2luc3QgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHdvaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCWlmICgod29pbnN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdvaW5zdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CiAJCQlFUlJPUigpOwogCQkJa2ZyZWUod2F2ZV9kZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCmluZGV4IDA1NDU4MTQuLjU3Njc0ZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAltaWRpaGRyLT5mbGFncyB8PSBNSURJQlVGX0lOUVVFVUU7CS8qIHNldCAqLwogCW1pZGloZHItPmZsYWdzICY9IH5NSURJQlVGX0RPTkU7CS8qIGNsZWFyICovCiAKLQlpZiAoKG1pZGlxID0gKHN0cnVjdCBtaWRpX3F1ZXVlICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX3F1ZXVlKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwlpZiAoKG1pZGlxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfcXVldWUpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewogCQkvKiBNZXNzYWdlIGxvc3QgKi8KIAkJcmV0dXJuIC0xOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmMKaW5kZXggNTkzOGQzMS4uYThjYzc1ZCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmMKKysrIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogCW1pZGloZHItPmZsYWdzIHw9IE1JRElCVUZfSU5RVUVVRTsKIAltaWRpaGRyLT5mbGFncyAmPSB+TUlESUJVRl9ET05FOwogCi0JaWYgKChtaWRpcSA9IChzdHJ1Y3QgbWlkaV9xdWV1ZSAqKSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9xdWV1ZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJaWYgKChtaWRpcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX3F1ZXVlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKIAkJLyogTWVzc2FnZSBsb3N0ICovCiAJCXJldHVybiAtMTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jCmluZGV4IDhiYmY0NGIuLjA2MGQxYmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jCkBAIC0zMDQsMTEgKzMwNCwxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgY29weV9ibG9jayh1OCBfX3VzZXIgKmRzdCwgdTggKiBzcmMsIHUzMiBzdHIsIHUzMiBsZW4sIHU4IGNvdikKK3N0YXRpYyBpbnQgY29weV9ibG9jayh1OCBfX3VzZXIgKmRzdCwgdTggKiBzcmMsIHUzMiBzdHIsIHUzMiBsZW4sIHU4IGNvdikKIHsKLQlpZiAoY292ID09IDEpCi0JCV9fY29weV90b191c2VyKGRzdCwgc3JjICsgc3RyLCBsZW4pOwotCWVsc2UgeworCWlmIChjb3YgPT0gMSkgeworCQlpZiAoX19jb3B5X3RvX3VzZXIoZHN0LCBzcmMgKyBzdHIsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UgewogCQl1OCBieXRlOwogCQl1MzIgaTsKIApAQCAtMzE2LDIyICszMTcsMjYgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKIAkJCWJ5dGUgPSBzcmNbMiAqIGldIF4gMHg4MDsKLQkJCV9fY29weV90b191c2VyKGRzdCArIGksICZieXRlLCAxKTsKKwkJCWlmIChfX2NvcHlfdG9fdXNlcihkc3QgKyBpLCAmYnl0ZSwgMSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAl9CisKKwlyZXR1cm4gMDsKIH0KIAotdm9pZCBlbXUxMGsxX3dhdmVpbl94ZmVyZGF0YShzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QsIHU4IF9fdXNlciAqZGF0YSwgdTMyICogc2l6ZSkKK2ludCBlbXUxMGsxX3dhdmVpbl94ZmVyZGF0YShzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QsIHU4IF9fdXNlciAqZGF0YSwgdTMyICogc2l6ZSkKIHsKIAlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOwogCXUzMiBzaXpldG9jb3B5LCBzaXpldG9jb3B5X25vdywgc3RhcnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OwogCiAJc2l6ZXRvY29weSA9IG1pbl90KHUzMiwgYnVmZmVyLT5zaXplLCAqc2l6ZSk7CiAJKnNpemUgPSBzaXpldG9jb3B5OwogCiAJaWYgKCFzaXpldG9jb3B5KQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwogCXN0YXJ0ID0gYnVmZmVyLT5wb3M7CkBAIC0zNDUsMTEgKzM1MCwxNyBAQAogCWlmIChzaXpldG9jb3B5ID4gc2l6ZXRvY29weV9ub3cpIHsKIAkJc2l6ZXRvY29weSAtPSBzaXpldG9jb3B5X25vdzsKIAotCQljb3B5X2Jsb2NrKGRhdGEsIGJ1ZmZlci0+YWRkciwgc3RhcnQsIHNpemV0b2NvcHlfbm93LCBidWZmZXItPmNvdik7Ci0JCWNvcHlfYmxvY2soZGF0YSArIHNpemV0b2NvcHlfbm93LCBidWZmZXItPmFkZHIsIDAsIHNpemV0b2NvcHksIGJ1ZmZlci0+Y292KTsKKwkJcmV0ID0gY29weV9ibG9jayhkYXRhLCBidWZmZXItPmFkZHIsIHN0YXJ0LCBzaXpldG9jb3B5X25vdywKKwkJCQkgYnVmZmVyLT5jb3YpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBjb3B5X2Jsb2NrKGRhdGEgKyBzaXpldG9jb3B5X25vdywgYnVmZmVyLT5hZGRyLCAwLAorCQkJCQkgc2l6ZXRvY29weSwgYnVmZmVyLT5jb3YpOwogCX0gZWxzZSB7Ci0JCWNvcHlfYmxvY2soZGF0YSwgYnVmZmVyLT5hZGRyLCBzdGFydCwgc2l6ZXRvY29weSwgYnVmZmVyLT5jb3YpOworCQlyZXQgPSBjb3B5X2Jsb2NrKGRhdGEsIGJ1ZmZlci0+YWRkciwgc3RhcnQsIHNpemV0b2NvcHksCisJCQkJIGJ1ZmZlci0+Y292KTsKIAl9CisKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGVtdTEwazFfd2F2ZWluX3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QpCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oCmluZGV4IDE1Y2ZiOWIuLmU4MjAyOWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5oCkBAIC04Myw3ICs4Myw3IEBACiB2b2lkIGVtdTEwazFfd2F2ZWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7CiB2b2lkIGVtdTEwazFfd2F2ZWluX3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKIHZvaWQgZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUoc3RydWN0IHdpaW5zdCAqLCB1MzIgKik7Ci12b2lkIGVtdTEwazFfd2F2ZWluX3hmZXJkYXRhKHN0cnVjdCB3aWluc3QgKiwgdTggX191c2VyICosIHUzMiAqKTsKK2ludCBlbXUxMGsxX3dhdmVpbl94ZmVyZGF0YShzdHJ1Y3Qgd2lpbnN0ICosIHU4IF9fdXNlciAqLCB1MzIgKik7CiBpbnQgZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKiwgc3RydWN0IHdhdmVfZm9ybWF0ICopOwogdm9pZCBlbXUxMGsxX3dhdmVpbl91cGRhdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2lpbnN0ICopOwogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMKaW5kZXggOGFjNzdkZi4uY2NhM2RhZCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYwpAQCAtNTgsNyArNTgsNyBAQAogewogCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKIAotCWlmICgobWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwlpZiAoKG1pZGloZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9oZHIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewogCQlFUlJPUigpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJbXV0ZXhfbG9jaygmY2FyZC0+b3Blbl9zZW0pOwogCX0KIAotCWlmICgobWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBrbWFsbG9jKHNpemVvZigqbWlkaV9kZXYpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlpZiAoKG1pZGlfZGV2ID0ga21hbGxvYyhzaXplb2YoKm1pZGlfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWlkaV9kZXYtPmNhcmQgPSBjYXJkOwpAQCAtMzI4LDcgKzMyOCw3IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmICgobWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJaWYgKChtaWRpaGRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWlkaWhkci0+YnVmZmVybGVuZ3RoID0gY291bnQ7CkBAIC00OTAsNyArNDkwLDcgQEAKIAkJCQogCURQRigyLCAiZW11MTBrMV9zZXFfbWlkaV9vcGVuKClcbiIpOwogCQotCWlmICgobWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBrbWFsbG9jKHNpemVvZigqbWlkaV9kZXYpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlpZiAoKG1pZGlfZGV2ID0ga21hbGxvYyhzaXplb2YoKm1pZGlfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWlkaV9kZXYtPmNhcmQgPSBjYXJkOwpAQCAtNTQwLDcgKzU0MCw3IEBACiAKIAljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7CiAKLQlpZiAoKG1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWlmICgobWlkaWhkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1pZGloZHItPmJ1ZmZlcmxlbmd0aCA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taXhlci5jIGIvc291bmQvb3NzL2VtdTEwazEvbWl4ZXIuYwppbmRleCBjYmNhYWEzLi42NDE5Nzk2IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9taXhlci5jCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL21peGVyLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogCiAJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMzoKIAotCQljdGwgPSAoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpLCBHRlBfS0VSTkVMKTsKKwkJY3RsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGN0bCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jCmluZGV4IDRlM2JhY2EuLjZkMjFkNDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMKKysrIGIvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guYwpAQCAtMTYyLDEyICsxNjIsMTUgQEAKIAogCQlEUEQoMywgInByZXBlbmQgc2l6ZSAlZCwgcHJlcGVuZGluZyAlZCBieXRlc1xuIiwgcHQtPnByZXBlbmRfc2l6ZSwgbmVlZGVkKTsKIAkJaWYgKGNvdW50IDwgbmVlZGVkKSB7Ci0JCQljb3B5X2Zyb21fdXNlcihwdC0+YnVmICsgcHQtPnByZXBlbmRfc2l6ZSwgYnVmZmVyLCBjb3VudCk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIocHQtPmJ1ZiArIHB0LT5wcmVwZW5kX3NpemUsCisJCQkJCSAgIGJ1ZmZlciwgY291bnQpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQkJcHQtPnByZXBlbmRfc2l6ZSArPSBjb3VudDsKIAkJCURQRCgzLCAicHJlcGVuZCBzaXplIG5vdyAlZFxuIiwgcHQtPnByZXBlbmRfc2l6ZSk7CiAJCQlyZXR1cm4gY291bnQ7CiAJCX0KLQkJY29weV9mcm9tX3VzZXIocHQtPmJ1ZiArIHB0LT5wcmVwZW5kX3NpemUsIGJ1ZmZlciwgbmVlZGVkKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHB0LT5idWYgKyBwdC0+cHJlcGVuZF9zaXplLCBidWZmZXIsIG5lZWRlZCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJciA9IHB0X3B1dGJsb2NrKHdhdmVfZGV2LCAodTE2ICopIHB0LT5idWYsIG5vbmJsb2NrKTsKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKQEAgLTE3OCw3ICsxODEsOCBAQAogCWJsb2Nrc19jb3BpZWQgPSAwOwogCXdoaWxlIChibG9ja3MgPiAwKSB7CiAJCXUxNiBfX3VzZXIgKmJ1ZnB0ciA9ICh1MTYgX191c2VyICopIGJ1ZmZlciArIChieXRlc19jb3BpZWQvMik7Ci0JCWNvcHlfZnJvbV91c2VyKHB0LT5idWYsIGJ1ZnB0ciwgUFRfQkxPQ0tTSVpFKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHB0LT5idWYsIGJ1ZnB0ciwgUFRfQkxPQ0tTSVpFKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQlyID0gcHRfcHV0YmxvY2sod2F2ZV9kZXYsICh1MTYgKilwdC0+YnVmLCBub25ibG9jayk7CiAJCWlmIChyKSB7CiAJCQlpZiAoYnl0ZXNfY29waWVkKQpAQCAtMTkzLDcgKzE5Nyw4IEBACiAJaSA9IGNvdW50IC0gYnl0ZXNfY29waWVkOwogCWlmIChpKSB7CiAJCXB0LT5wcmVwZW5kX3NpemUgPSBpOwotCQljb3B5X2Zyb21fdXNlcihwdC0+YnVmLCBidWZmZXIgKyBieXRlc19jb3BpZWQsIGkpOworCQlpZiAoY29weV9mcm9tX3VzZXIocHQtPmJ1ZiwgYnVmZmVyICsgYnl0ZXNfY29waWVkLCBpKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQlieXRlc19jb3BpZWQgKz0gaTsKIAkJRFBEKDMsICJmaWxsaW5nIHByZXBlbmQgYnVmZmVyIHdpdGggJWQgYnl0ZXMiLCBpKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZXMxMzcxLmMgYi9zb3VuZC9vc3MvZXMxMzcxLmMKaW5kZXggZGRmNmIwYS4uY2MyODJhMCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2VzMTM3MS5jCisrKyBiL3NvdW5kL29zcy9lczEzNzEuYwpAQCAtMTMwLDYgKzEzMCw3IEBACiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9oYWwyLmMgYi9zb3VuZC9vc3MvaGFsMi5jCmluZGV4IDc4NGJkZDcuLmQxODI4NmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9oYWwyLmMKKysrIGIvc291bmQvb3NzL2hhbDIuYwpAQCAtMTQzNSw3ICsxNDM1LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyOwogCi0JaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYWwyX2NhcmQpLCBHRlBfS0VSTkVMKTsKKwloYWwyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhhbDJfY2FyZCksIEdGUF9LRVJORUwpOwogCWlmICghaGFsMikKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGhhbDIsIDAsIHNpemVvZihzdHJ1Y3QgaGFsMl9jYXJkKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaTgxMF9hdWRpby5jIGIvc291bmQvb3NzL2k4MTBfYXVkaW8uYwppbmRleCAyNDBjYzc5Li5jM2M4YTcyIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvaTgxMF9hdWRpby5jCisrKyBiL3NvdW5kL29zcy9pODEwX2F1ZGlvLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXB1NDAxLmMgYi9zb3VuZC9vc3MvbXB1NDAxLmMKaW5kZXggZTk2MjIwNS4uMjc5NmMwZSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL21wdTQwMS5jCisrKyBiL3NvdW5kL29zcy9tcHU0MDEuYwpAQCAtMTAyMyw3ICsxMDIzLDcgQEAKIAkJCQlkZXZjLT5jYXBhYmlsaXRpZXMgfD0gTVBVX0NBUF9JTlRMRzsJLyogU3VwcG9ydHMgaW50ZWxsaWdlbnQgbW9kZSAqLwogCiAKLQltcHU0MDFfc3ludGhfb3BlcmF0aW9uc1ttXSA9IChzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CisJbXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOwogCiAJaWYgKG1wdTQwMV9zeW50aF9vcGVyYXRpb25zW21dID09IE5VTEwpCiAJewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21zbmRfcGlubmFjbGUuYyBiL3NvdW5kL29zcy9tc25kX3Bpbm5hY2xlLmMKaW5kZXggZDUxNDY3OS4uMjQxMTBkNiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL21zbmRfcGlubmFjbGUuYworKysgYi9zb3VuZC9vc3MvbXNuZF9waW5uYWNsZS5jCkBAIC0xMDA3LDcgKzEwMDcsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBkZXZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKIHsKLQlpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAobWlub3IgPT0gZGV2LmRzcF9taW5vcikKIAkJcmV0dXJuIGRzcF9yZWFkKGJ1ZiwgY291bnQpOwogCWVsc2UKQEAgLTEwMTYsNyArMTAxNiw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IGRldl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKIHsKLQlpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAobWlub3IgPT0gZGV2LmRzcF9taW5vcikKIAkJcmV0dXJuIGRzcF93cml0ZShidWYsIGNvdW50KTsKIAllbHNlCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3BsMy5jIGIvc291bmQvb3NzL29wbDMuYwppbmRleCA0Nzk5YmM3Li4yZThjZmE1IDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvb3BsMy5jCisrKyBiL3NvdW5kL29zcy9vcGwzLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkZXZjID0gKHN0cnVjdCBvcGxfZGV2aW5mbyAqKWttYWxsb2Moc2l6ZW9mKCpkZXZjKSwgR0ZQX0tFUk5FTCk7CisJZGV2YyA9IGttYWxsb2Moc2l6ZW9mKCpkZXZjKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoZGV2YyA9PSBOVUxMKQogCXsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9jb21tb24uYyBiL3NvdW5kL29zcy9zYl9jb21tb24uYwppbmRleCA0NDA1MzdjLi4wN2NiYWNmIDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvc2JfY29tbW9uLmMKKysrIGIvc291bmQvb3NzL3NiX2NvbW1vbi5jCkBAIC02MjUsNyArNjI1LDcgQEAKIAkgKi8KIAogCi0JZGV0ZWN0ZWRfZGV2YyA9IChzYl9kZXZjICopa21hbGxvYyhzaXplb2Yoc2JfZGV2YyksIEdGUF9LRVJORUwpOworCWRldGVjdGVkX2RldmMgPSBrbWFsbG9jKHNpemVvZihzYl9kZXZjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldGVjdGVkX2RldmMgPT0gTlVMTCkKIAl7CiAJCXByaW50ayhLRVJOX0VSUiAic2I6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlIGluZm9ybWF0aW9uXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9taWRpLmMgYi9zb3VuZC9vc3Mvc2JfbWlkaS5jCmluZGV4IDJlM2JjMDQuLjhiNzk2NzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zYl9taWRpLmMKKysrIGIvc291bmQvb3NzL3NiX21pZGkuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAJCXJldHVybjsKIAl9CiAJc3RkX21pZGlfc3ludGgubWlkaV9kZXYgPSBkZXZjLT5teV9taWRpZGV2ID0gZGV2OwotCW1pZGlfZGV2c1tkZXZdID0gKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CisJbWlkaV9kZXZzW2Rldl0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwpCiAJewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZCBCbGFzdGVyOiAgZmFpbGVkIHRvIGFsbG9jYXRlIE1JREkgbWVtb3J5LlxuIik7CkBAIC0xODksNyArMTg5LDcgQEAKIAltaWRpX2RldnNbZGV2XS0+ZGV2YyA9IGRldmM7CiAKIAotCW1pZGlfZGV2c1tkZXZdLT5jb252ZXJ0ZXIgPSAoc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOworCW1pZGlfZGV2c1tkZXZdLT5jb252ZXJ0ZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOwogCWlmIChtaWRpX2RldnNbZGV2XS0+Y29udmVydGVyID09IE5VTEwpCiAJewogCQkgIHByaW50ayhLRVJOX1dBUk5JTkcgIlNvdW5kIEJsYXN0ZXI6ICBmYWlsZWQgdG8gYWxsb2NhdGUgTUlESSBtZW1vcnkuXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9taXhlci5jIGIvc291bmQvb3NzL3NiX21peGVyLmMKaW5kZXggMjM4ZTJjZi4uZmFkMWE0ZiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NiX21peGVyLmMKKysrIGIvc291bmQvb3NzL3NiX21peGVyLmMKQEAgLTczNCw3ICs3MzQsNyBAQAogCWlmIChtID09IC0xKQogCQlyZXR1cm4gMDsKIAotCW1peGVyX2RldnNbbV0gPSAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOworCW1peGVyX2RldnNbbV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOwogCWlmIChtaXhlcl9kZXZzW21dID09IE5VTEwpCiAJewogCQlwcmludGsoS0VSTl9FUlIgInNiX21peGVyOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NoX2RhY19hdWRpby5jIGIvc291bmQvb3NzL3NoX2RhY19hdWRpby5jCmluZGV4IDNiM2I0ZGEuLjUxZjU1NDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zaF9kYWNfYXVkaW8uYworKysgYi9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1L2RhYy5oPgogI2luY2x1ZGUgPGFzbS9jcHUvdGltZXIuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9ocDZ4eC9ocDZ4eC5oPgorI2luY2x1ZGUgPGFzbS9ocDZ4eC5oPgogI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CiAKICNkZWZpbmUgTU9ETkFNRSAic2hfZGFjX2F1ZGlvIgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kY2FyZC5jIGIvc291bmQvb3NzL3NvdW5kY2FyZC5jCmluZGV4IDIzNDRkMDkuLmE4OTEwOGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zb3VuZGNhcmQuYworKysgYi9zb3VuZC9vc3Mvc291bmRjYXJkLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAvKgogICogVGhpcyBvdWdodCB0byBiZSBtb3ZlZCBpbnRvIGluY2x1ZGUvYXNtL2RtYS5oCkBAIC0xNDAsNyArMTQxLDcgQEAKIAogc3RhdGljIHNzaXplX3Qgc291bmRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IGRldiA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCS8qCkBAIC0xNzMsNyArMTc0LDcgQEAKIAogc3RhdGljIHNzaXplX3Qgc291bmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCWludCBkZXYgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBkZXYgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAJCiAJbG9ja19rZXJuZWwoKTsKQEAgLTM5Miw3ICszOTMsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHNvdW5kX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKTsKIAogCURFQihwcmludGsoInNvdW5kX3BvbGwoZGV2PSVkKVxuIiwgZGV2KSk7CkBAIC00MTcsNyArNDE4LDcgQEAKIAlpbnQgZGV2X2NsYXNzOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IE5VTEw7Ci0JaW50IGRldiA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAogCWRldl9jbGFzcyA9IGRldiAmIDB4MGY7CiAJZGV2ID4+PSA0OwpAQCAtNTU3LDE3ICs1NTgsMTcgQEAKIAlzb3VuZF9kbWFwX2ZsYWcgPSAoZG1hYnVmID4gMCA/IDEgOiAwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRldl9saXN0KSAvIHNpemVvZiAqZGV2X2xpc3Q7IGkrKykgewotCQljbGFzc19kZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBOVUxMLAotCQkJCSAgICBNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IpLAotCQkJCSAgICBOVUxMLCAiJXMiLCBkZXZfbGlzdFtpXS5uYW1lKTsKKwkJZGV2aWNlX2NyZWF0ZShzb3VuZF9jbGFzcywgTlVMTCwKKwkJCSAgICAgIE1LREVWKFNPVU5EX01BSk9SLCBkZXZfbGlzdFtpXS5taW5vciksCisJCQkgICAgICAiJXMiLCBkZXZfbGlzdFtpXS5uYW1lKTsKIAogCQlpZiAoIWRldl9saXN0W2ldLm51bSkKIAkJCWNvbnRpbnVlOwogCiAJCWZvciAoaiA9IDE7IGogPCAqZGV2X2xpc3RbaV0ubnVtOyBqKyspCi0JCQljbGFzc19kZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBOVUxMLAotCQkJCQkgICAgTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yICsgKGoqMHgxMCkpLAotCQkJCQkgICAgTlVMTCwgIiVzJWQiLCBkZXZfbGlzdFtpXS5uYW1lLCBqKTsKKwkJCWRldmljZV9jcmVhdGUoc291bmRfY2xhc3MsIE5VTEwsCisJCQkJICAgICAgTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yICsgKGoqMHgxMCkpLAorCQkJCSAgICAgICIlcyVkIiwgZGV2X2xpc3RbaV0ubmFtZSwgaik7CiAJfQogCiAJaWYgKHNvdW5kX25ibG9ja3MgPj0gMTAyNCkKQEAgLTU4MSwxMSArNTgyLDExIEBACiAJaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChkZXZfbGlzdCkgLyBzaXplb2YgKmRldl9saXN0OyBpKyspIHsKLQkJY2xhc3NfZGV2aWNlX2Rlc3Ryb3koc291bmRfY2xhc3MsIE1LREVWKFNPVU5EX01BSk9SLCBkZXZfbGlzdFtpXS5taW5vcikpOworCQlkZXZpY2VfZGVzdHJveShzb3VuZF9jbGFzcywgTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yKSk7CiAJCWlmICghZGV2X2xpc3RbaV0ubnVtKQogCQkJY29udGludWU7CiAJCWZvciAoaiA9IDE7IGogPCAqZGV2X2xpc3RbaV0ubnVtOyBqKyspCi0JCQljbGFzc19kZXZpY2VfZGVzdHJveShzb3VuZF9jbGFzcywgTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yICsgKGoqMHgxMCkpKTsKKwkJCWRldmljZV9kZXN0cm95KHNvdW5kX2NsYXNzLCBNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IgKyAoaioweDEwKSkpOwogCX0KIAkKIAl1bnJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwoMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc3NjYXBlLmMgYi9zb3VuZC9vc3Mvc3NjYXBlLmMKaW5kZXggNTFmMmZhNi4uMzBjMzZkMSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NzY2FwZS5jCisrKyBiL3NvdW5kL29zcy9zc2NhcGUuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2luY2x1ZGUgImNvcHJvYy5oIgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3RyaWRlbnQuYyBiL3NvdW5kL29zcy90cmlkZW50LmMKaW5kZXggN2EzNjNhMS4uNmIxZjhjOSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3RyaWRlbnQuYworKysgYi9zb3VuZC9vc3MvdHJpZGVudC5jCkBAIC0yMTYsNiArMjE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvdl9taWRpLmMgYi9zb3VuZC9vc3Mvdl9taWRpLmMKaW5kZXggZDk1MmIyMi4uMTAzOTQwZiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3ZfbWlkaS5jCisrKyBiL3NvdW5kL29zcy92X21pZGkuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJCXJldHVybjsKIAl9CiAJCi0JbT0oc3RydWN0IHZtaWRpX21lbW9yeSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWlkaV9tZW1vcnkpLCBHRlBfS0VSTkVMKTsKKwltID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtaWRpX21lbW9yeSksIEdGUF9LRVJORUwpOwogCWlmIChtID09IE5VTEwpCiAJewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJMb29wYmFjayBNSURJOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwppbmRleCAxNzgzN2Q0Li5jOTZjYzhjIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvdmlhODJjeHh4X2F1ZGlvLmMKKysrIGIvc291bmQvb3NzL3ZpYTgyY3h4eF9hdWRpby5jCkBAIC0yMTIwLDggKzIxMjAsOCBAQAogCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsgLyogRGlzYWxsb3cgbXJlbWFwICovCiAJfQogICAgICAgICBpZiAoIWNhcmQpIHsKLQkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyBOT1BBR0VfT09NXG4iKTsKLQkJcmV0dXJuIE5PUEFHRV9PT007CS8qIE5vdGhpbmcgYWxsb2NhdGVkICovCisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgTk9QQUdFX1NJR0JVU1xuIik7CisJCXJldHVybiBOT1BBR0VfU0lHQlVTOwkvKiBOb3RoaW5nIGFsbG9jYXRlZCAqLwogCX0KIAogCXBnb2ZmID0gdm1hLT52bV9wZ29mZiArICgoYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dhdmVhcnRpc3QuYyBiL3NvdW5kL29zcy93YXZlYXJ0aXN0LmMKaW5kZXggYzViZjM2My4uMjZhN2M2YSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3dhdmVhcnRpc3QuYworKysgYi9zb3VuZC9vc3Mvd2F2ZWFydGlzdC5jCkBAIC0xMjY3LDcgKzEyNjcsNyBAQAogCWNvbmZfcHJpbnRmMihkZXZfbmFtZSwgZGV2Yy0+aHcuaW9fYmFzZSwgZGV2Yy0+aHcuaXJxLAogCQkgICAgIGRldmMtPmh3LmRtYSwgZGV2Yy0+aHcuZG1hMik7CiAKLQlwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKilrbWFsbG9jKHNpemVvZih3YXZuY19wb3J0X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlwb3J0YyA9IGttYWxsb2Moc2l6ZW9mKHdhdm5jX3BvcnRfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmIChwb3J0YyA9PSBOVUxMKQogCQlnb3RvIG5vbWVtOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9NYWtlZmlsZSBiL3NvdW5kL3BjaS9hYzk3L01ha2VmaWxlCmluZGV4IDc3YjM0ODIuLjNjMzIyMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L01ha2VmaWxlCisrKyBiL3NvdW5kL3BjaS9hYzk3L01ha2VmaWxlCkBAIC0xMCwxMSArMTAsOSBAQAogZW5kaWYKIAogc25kLWFrNDUzMS1jb2RlYy1vYmpzIDo9IGFrNDUzMV9jb2RlYy5vCi1zbmQtYWM5Ny1idXMtb2JqcyA6PSBhYzk3X2J1cy5vCiAKICMgVG9wbGV2ZWwgTW9kdWxlIERlcGVuZGVuY3kKIG9iai0kKENPTkZJR19TTkRfQUM5N19DT0RFQykgKz0gc25kLWFjOTctY29kZWMubwogb2JqLSQoQ09ORklHX1NORF9FTlMxMzcwKSArPSBzbmQtYWs0NTMxLWNvZGVjLm8KLW9iai0kKENPTkZJR19TTkRfQUM5N19CVVMpICs9IHNuZC1hYzk3LWJ1cy5vCiAKIG9iai1tIDo9ICQoc29ydCAkKG9iai1tKSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwppbmRleCBhNzllOTE4Li43YWJjYjEwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCkBAIC01NzAsOCArNTcwLDcgQEAKIAkJCWFjOTctPnBvd2VyX3VwICY9IH4oMSA8PCAocmVnPj4xKSk7CiAJCWVsc2UKIAkJCWFjOTctPnBvd2VyX3VwIHw9IDEgPDwgKHJlZz4+MSk7Ci0JCWlmIChwb3dlcl9zYXZlKQotCQkJdXBkYXRlX3Bvd2VyX3JlZ3MoYWM5Nyk7CisJCXVwZGF0ZV9wb3dlcl9yZWdzKGFjOTcpOwogCX0KICNlbmRpZgogCXJldHVybiBlcnI7CkBAIC0xOTI4LDkgKzE5MjcsMTAgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2FjOTdfYnVpbGRfb3BzIG51bGxfYnVpbGRfb3BzOwogCiAjaWZkZWYgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUKLXN0YXRpYyB2b2lkIGRvX3VwZGF0ZV9wb3dlcih2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgZG9fdXBkYXRlX3Bvd2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQl1cGRhdGVfcG93ZXJfcmVncyhkYXRhKTsKKwl1cGRhdGVfcG93ZXJfcmVncygKKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfYWM5NywgcG93ZXJfd29yay53b3JrKSk7CiB9CiAjZW5kaWYKIApAQCAtMTk5MCw3ICsxOTkwLDcgQEAKIAltdXRleF9pbml0KCZhYzk3LT5wYWdlX211dGV4KTsKICNpZmRlZiBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRQogCWFjOTctPnBvd2VyX3dvcmtxID0gY3JlYXRlX3dvcmtxdWV1ZSgiYWM5NyIpOwotCUlOSVRfV09SSygmYWM5Ny0+cG93ZXJfd29yaywgZG9fdXBkYXRlX3Bvd2VyLCBhYzk3KTsKKwlJTklUX0RFTEFZRURfV09SSygmYWM5Ny0+cG93ZXJfd29yaywgZG9fdXBkYXRlX3Bvd2VyKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQpAQCAtMjMzNywxMCArMjMzNyw3IEBACiAJCX0KIAl9CiAKLQlpZiAoISBwb3dlcl9zYXZlKQotCQlyZXR1cm4gMDsKLQotCWlmICghIHBvd2VydXAgJiYgYWM5Ny0+cG93ZXJfd29ya3EpCisJaWYgKHBvd2VyX3NhdmUgJiYgIXBvd2VydXAgJiYgYWM5Ny0+cG93ZXJfd29ya3EpCiAJCS8qIGFkanVzdCBwb3dlci1kb3duIGJpdHMgYWZ0ZXIgdHdvIHNlY29uZHMgZGVsYXkKIAkJICogKGZvciBhdm9pZGluZyBsb3VkIGNsaWNrIG5vaXNlcyBmb3IgbWFueSAoT1NTKSBhcHBzCiAJCSAqICB0aGF0IG9wZW4vY2xvc2UgZnJlcXVlbnRseSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwppbmRleCAxM2E4Y2VmLi5hN2VkZDU2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKKysrIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCkBAIC0yMDMyLDggKzIwMzIsMTAgQEAKIAlvdXRsKDB4ZmZmZmZmZmYsIEFMSV9SRUcoY2hpcCwgQUxJX1NUT1ApKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOworCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwNDgsOCArMjA1MCwxNSBAQAogCWlmICghIGltKQogCQlyZXR1cm4gMDsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGk1NDUxOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiAJCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzMzAwLmMgYi9zb3VuZC9wY2kvYWxzMzAwLmMKaW5kZXggOWIxNmMyOS4uOTVmNzBmMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczMwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHMzMDAuYwpAQCAtNzY4LDkgKzc2OCw5IEBACiAJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY20pOwogCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5Nyk7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzc5LDkgKzc3OSwxNCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwogCXN0cnVjdCBzbmRfYWxzMzAwICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWxzMzAwOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzbmRfYWxzMzAwX2luaXQoY2hpcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwppbmRleCAxNWZjMzkyLi44ZmI1NWQzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzNDAwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKQEAgLTgwNCw5ICs4MDQsOSBAQAogCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtKTsKIAlzbmRfc2JtaXhlcl9zdXNwZW5kKGNoaXApOwogCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EM2hvdCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgxNiw5ICs4MTYsMTQgQEAKIAlzdHJ1Y3Qgc25kX2NhcmRfYWxzNDAwMCAqYWNhcmQgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zYiAqY2hpcCA9IGFjYXJkLT5jaGlwOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWxzNDAwMDogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJc25kX2FsczQwMDBfY29uZmlndXJlKGNoaXApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cC5jIGIvc291bmQvcGNpL2F0aWl4cC5jCmluZGV4IDNlOGZjNWEuLmUzZTk5ZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHAuYworKysgYi9zb3VuZC9wY2kvYXRpaXhwLmMKQEAgLTE0NDIsOSArMTQ0Miw5IEBACiAJc25kX2F0aWl4cF9hY2xpbmtfZG93bihjaGlwKTsKIAlzbmRfYXRpaXhwX2NoaXBfc3RvcChjaGlwKTsKIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDU0LDkgKzE0NTQsMTQgQEAKIAlzdHJ1Y3QgYXRpaXhwICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWludCBpOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRpaXhwOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzbmRfYXRpaXhwX2FjbGlua19yZXNldChjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwppbmRleCBjNWRkYTFiLi5kYzU0ZjJjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCkBAIC0xMTI4LDkgKzExMjgsOSBAQAogCXNuZF9hdGlpeHBfYWNsaW5rX2Rvd24oY2hpcCk7CiAJc25kX2F0aWl4cF9jaGlwX3N0b3AoY2hpcCk7CiAKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE0MCw5ICsxMTQwLDE0IEBACiAJc3RydWN0IGF0aWl4cF9tb2RlbSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImF0aWl4cC1tb2RlbTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJc25kX2F0aWl4cF9hY2xpbmtfcmVzZXQoY2hpcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXp0MzMyOC5jIGIvc291bmQvcGNpL2F6dDMzMjguYwppbmRleCA2OTJmMjAzLi4yNDE0ZWU2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXp0MzMyOC5jCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmMKQEAgLTE5MDMsOSArMTkwMyw5IEBACiAJZm9yIChyZWcgPSAwOyByZWcgPCBBWkZfSU9fU0laRV9TWU5USF9QTSAvIDI7IHJlZysrKQogCQljaGlwLT5zYXZlZF9yZWdzX3N5bnRoW3JlZ10gPSBpbncoY2hpcC0+c3ludGhfcG9ydCArIHJlZyAqIDIpOwogCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EM2hvdCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MTYsOSArMTkxNiwxNCBAQAogCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmVnOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXp0MzMyODogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJZm9yIChyZWcgPSAwOyByZWcgPCBBWkZfSU9fU0laRV9JTzJfUE0gLyAyOyByZWcrKykKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCAxZjdlNzEwLi4wMDkzY2QxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0zMTIyLDkgKzMxMjIsOSBAQAogCS8qIGRpc2FibGUgaW50cyAqLwogCXNuZF9jbWlwY2lfd3JpdGUoY20sIENNX1JFR19JTlRfSExEQ0xSLCAwKTsKIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTM0LDkgKzMxMzQsMTQgQEAKIAlzdHJ1Y3QgY21pcGNpICpjbSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNtaXBjaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJLyogcmVzZXQgLyBpbml0aWFsaXplIHRvIGEgc2FuZSBzdGF0ZSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDI4MS5jIGIvc291bmQvcGNpL2NzNDI4MS5jCmluZGV4IGQ1NDkyNGUuLjA5MDVmYTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQyODEuYworKysgYi9zb3VuZC9wY2kvY3M0MjgxLmMKQEAgLTIwNTAsNiArMjA1MCw3IEBACiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA2MCw4ICsyMDYxLDE0IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIHVsQ0xLOwogCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDI4MTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJdWxDTEsgPSBzbmRfY3M0MjgxX3BlZWtCQTAoY2hpcCwgQkEwX0NMS0NSMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCmluZGV4IDE2ZDRlYmYuLjI4MDdiOTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCkBAIC0zNjg3LDggKzM2ODcsMTAgQEAKIAkvKiBkaXNhYmxlIENMS1JVTiAqLwogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIC1jaGlwLT5hbXBsaWZpZXIpOwogCWNoaXAtPmFtcGxpZmllciA9IGFtcF9zYXZlZDsgLyogcmVzdG9yZSB0aGUgc3RhdHVzICovCisKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY5OCw5ICszNzAwLDE2IEBACiAJc3RydWN0IHNuZF9jczQ2eHggKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJaW50IGFtcF9zYXZlZDsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwogCWFtcF9zYXZlZCA9IGNoaXAtPmFtcGxpZmllcjsKIAljaGlwLT5hbXBsaWZpZXIgPSAwOwogCWNoaXAtPmFjdGl2ZV9jdHJsKGNoaXAsIDEpOyAvKiBmb3JjZSB0byBvbiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwppbmRleCBhYWQwZTY5Li4zZTRkMTk4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYworKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwpAQCAtNzMsOSArNzMsMTAgQEAKIAlzbmRfYWM5N19zdXNwZW5kKGNzNTUzNWF1LT5hYzk3KTsKIAkvKiBzYXZlIGltcG9ydGFudCByZWdzLCB0aGVuIGRpc2FibGUgYWNsaW5rIGluIGh3ICovCiAJc25kX2NzNTUzNWF1ZGlvX3N0b3BfaGFyZHdhcmUoY3M1NTM1YXUpOworCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKLQorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODcsOCArODgsMTQgQEAKIAlpbnQgdGltZW91dDsKIAlpbnQgaTsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczU1MzVhdWRpbzogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJLyogc2V0IExOS19XUk1fUlNUIHRvIHJlc2V0IEFDIGxpbmsgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYwppbmRleCA0OTNlYzA4Li41NWNhZjM0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCkBAIC0yMjYsOSArMjI2LDkgQEAKIAogCXNuZF9lbXUxMGsxX2RvbmUoZW11KTsKIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzcsMTEgKzIzNywxNiBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwogCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwotCQorCiAJc25kX2VtdTEwazFfcmVzdW1lX2luaXQoZW11KTsKIAlzbmRfZW11MTBrMV9lZnhfcmVzdW1lKGVtdSk7CiAJc25kX2FjOTdfcmVzdW1lKGVtdS0+YWM5Nyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCmluZGV4IDgwNTgwNTkuLjhiYzRmZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCkBAIC05NTYsNiArOTU2LDcgQEAKIAkgLmNhMDE1MV9jaGlwID0gMSwKIAkgLnNwazcxID0gMSwKIAkgLnNwZGlmX2J1ZyA9IDEsCisJIC5hZGNfMTM2MXQgPSAxLCAgLyogMjQgYml0IGNhcHR1cmUgaW5zdGVhZCBvZiAxNmJpdC4gRml4ZXMgQUxTQSBidWcjMzI0ICovCiAJIC5hYzk3X2NoaXAgPSAxfSAsCiAJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDQsIC5yZXZpc2lvbiA9IDB4MDQsCiAJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkF1ZGlneSAyIFtVbmtub3duXSIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW5zMTM3MC5jIGIvc291bmQvcGNpL2VuczEzNzAuYwppbmRleCA4Y2I0ZmIyLi5kMmE4MTFmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW5zMTM3MC5jCisrKyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKQEAgLTIwNzIsOSArMjA3MiwxMCBAQAogCXVkZWxheSgxMDApOwogCXNuZF9hazQ1MzFfc3VzcGVuZChlbnNvbmlxLT51LmVzMTM3MC5hazQ1MzEpOwogI2VuZGlmCQotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOworCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwODMsOSArMjA4NCwxNCBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwogCXN0cnVjdCBlbnNvbmlxICplbnNvbmlxID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzbmRfZW5zb25pcV9jaGlwX2luaXQoZW5zb25pcSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTM4LmMgYi9zb3VuZC9wY2kvZXMxOTM4LmMKaW5kZXggMmRhOTg4Zi4uMWE4ZDM2ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTkzOC5jCisrKyBiL3NvdW5kL3BjaS9lczE5MzguYwpAQCAtMTQ4MSwxMCArMTQ4MSwxNCBAQAogCQkqZCA9IHNuZF9lczE5MzhfcmVnX3JlYWQoY2hpcCwgKnMpOwogCiAJb3V0YigweDAwLCBTTElPX1JFRyhjaGlwLCBJUlFDT05UUk9MKSk7IC8qIGRpc2FibGUgaXJxcyAqLwotCWlmIChjaGlwLT5pcnEgPj0gMCkKKwlpZiAoY2hpcC0+aXJxID49IDApIHsKKwkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAJCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7CisJCWNoaXAtPmlycSA9IC0xOworCX0KIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ5NCwxMCArMTQ5OCwyMiBAQAogCXN0cnVjdCBlczE5MzggKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgY2hhciAqcywgKmQ7CiAKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7Ci0JcmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9lczE5MzhfaW50ZXJydXB0LAotCQkgICAgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgIkVTMTkzOCIsIGNoaXApOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImVzMTkzODogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2VzMTkzOF9pbnRlcnJ1cHQsCisJCQlJUlFGX0RJU0FCTEVEfElSUUZfU0hBUkVELCAiRVMxOTM4IiwgY2hpcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IHVuYWJsZSB0byBncmFiIElSUSAlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIsIHBjaS0+aXJxKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwogCXNuZF9lczE5MzhfY2hpcF9pbml0KGNoaXApOwogCkBAIC0xNTU2LDggKzE1NzIsMTAgQEAKIAogCXNuZF9lczE5MzhfZnJlZV9nYW1lcG9ydChjaGlwKTsKIAotCWlmIChjaGlwLT5pcnEgPj0gMCkKKwlpZiAoY2hpcC0+aXJxID49IDApIHsKKwkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAJCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7CisJfQogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UoY2hpcC0+cGNpKTsKIAlrZnJlZShjaGlwKTsKQEAgLTE2MDIsNiArMTYyMCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNoaXAtPm1peGVyX2xvY2spOwogCWNoaXAtPmNhcmQgPSBjYXJkOwogCWNoaXAtPnBjaSA9IHBjaTsKKwljaGlwLT5pcnEgPSAtMTsKIAlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpLCAiRVNTIFNvbG8tMSIpKSA8IDApIHsKIAkJa2ZyZWUoY2hpcCk7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTk2OC5jIGIvc291bmQvcGNpL2VzMTk2OC5jCmluZGV4IGI5ZDcyM2MuLjA5MmRhNTNlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTY4LmMKKysrIGIvc291bmQvcGNpL2VzMTk2OC5jCkBAIC00MzIsNDYgKzQzMiw2IEBACiAjZGVmaW5lIEVTTV9NT0RFX1BMQVkJCTAKICNkZWZpbmUgRVNNX01PREVfQ0FQVFVSRQkxCiAKLS8qIGFjcGkgc3RhdGVzICovCi1lbnVtIHsKLQlBQ1BJX0QwPTAsCi0JQUNQSV9EMSwKLQlBQ1BJX0QyLAotCUFDUElfRDMKLX07Ci0KLS8qIGJpdHMgaW4gdGhlIGFjcGkgbWFza3MgKi8KLSNkZWZpbmUgQUNQSV8xMk1IWgkoIDEgPDwgMTUpCi0jZGVmaW5lIEFDUElfMjRNSFoJKCAxIDw8IDE0KQotI2RlZmluZSBBQ1BJXzk3OAkoIDEgPDwgMTMpCi0jZGVmaW5lIEFDUElfU1BESUYJKCAxIDw8IDEyKQotI2RlZmluZSBBQ1BJX0dMVUUJKCAxIDw8IDExKQotI2RlZmluZSBBQ1BJX18xMAkoIDEgPDwgMTApIC8qIHJlc2VydmVkICovCi0jZGVmaW5lIEFDUElfUENJSU5UCSggMSA8PCA5KQotI2RlZmluZSBBQ1BJX0hWCQkoIDEgPDwgOCkgLyogaGFyZHdhcmUgdm9sdW1lICovCi0jZGVmaW5lIEFDUElfR1BJTwkoIDEgPDwgNykKLSNkZWZpbmUgQUNQSV9BU1NQCSggMSA8PCA2KQotI2RlZmluZSBBQ1BJX1NCCQkoIDEgPDwgNSkgLyogc2IgZW11bCAqLwotI2RlZmluZSBBQ1BJX0ZNCQkoIDEgPDwgNCkgLyogZm0gZW11bCAqLwotI2RlZmluZSBBQ1BJX1JCCQkoIDEgPDwgMykgLyogcmluZ2J1cyAvIGFjbGluayAqLwotI2RlZmluZSBBQ1BJX01JREkJKCAxIDw8IDIpIAotI2RlZmluZSBBQ1BJX0dQCQkoIDEgPDwgMSkgLyogZ2FtZSBwb3J0ICovCi0jZGVmaW5lIEFDUElfV1AJCSggMSA8PCAwKSAvKiB3YXZlIHByb2Nlc3NvciAqLwotCi0jZGVmaW5lIEFDUElfQUxMCSgweGZmZmYpCi0jZGVmaW5lIEFDUElfU0xFRVAJKH4oQUNQSV9TUERJRnxBQ1BJX0FTU1B8QUNQSV9TQnxBQ1BJX0ZNfCBcCi0JCQlBQ1BJX01JREl8QUNQSV9HUHxBQ1BJX1dQKSkKLSNkZWZpbmUgQUNQSV9OT05FCShBQ1BJX18xMCkKLQotLyogdGhlc2UgbWFza3MgaW5kaWNhdGUgd2hpY2ggdW5pdHMgd2UgY2FyZSBhYm91dCBhdAotCXdoaWNoIHN0YXRlcyAqLwotc3RhdGljIHUxNiBhY3BpX3N0YXRlX21hc2tbXSA9IHsKLQlbQUNQSV9EMF0gPSBBQ1BJX0FMTCwKLQlbQUNQSV9EMV0gPSBBQ1BJX1NMRUVQLAotCVtBQ1BJX0QyXSA9IEFDUElfU0xFRVAsCi0JW0FDUElfRDNdID0gQUNQSV9OT05FCi19OwotCiAKIC8qIEFQVSB1c2UgaW4gdGhlIGRyaXZlciAqLwogZW51bSBzbmRfZW51bV9hcHVfdHlwZSB7CkBAIC0yMTYwLDIxICsyMTIwLDYgQEAKIH0KIAogLyoKLSAqIHBvd2VyIG1hbmFnZW1lbnQKLSAqLwotc3RhdGljIHZvaWQgc25kX2VzMTk2OF9zZXRfYWNwaShzdHJ1Y3QgZXMxOTY4ICpjaGlwLCBpbnQgc3RhdGUpCi17Ci0JdTE2IGFjdGl2ZV9tYXNrID0gYWNwaV9zdGF0ZV9tYXNrW3N0YXRlXTsKLQotCXBjaV9zZXRfcG93ZXJfc3RhdGUoY2hpcC0+cGNpLCBzdGF0ZSk7Ci0JLyogbWFrZSBzdXJlIHRoZSB1bml0cyB3ZSBjYXJlIGFib3V0IGFyZSBvbiAKLQkJWFhYIHdlIG1pZ2h0IHdhbnQgdG8gZG8gdGhpcyBiZWZvcmUgc3RhdGUgZmxpcHBpbmc/ICovCi0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgMHg1NCwgfiBhY3RpdmVfbWFzayk7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNoaXAtPnBjaSwgMHg1NiwgfiBhY3RpdmVfbWFzayk7Ci19Ci0KLQotLyoKICAqIGluaXRpYWxpemUgbWFlc3RybyBjaGlwCiAgKi8KIHN0YXRpYyB2b2lkIHNuZF9lczE5NjhfY2hpcF9pbml0KHN0cnVjdCBlczE5NjggKmNoaXApCkBAIC0yMTk2LDkgKzIxNDEsNiBAQAogCSAqIElSUXMuCiAJICovCiAJCi0JLyogZG8gY29uZmlnIHdvcmsgYXQgZnVsbCBwb3dlciAqLwotCXNuZF9lczE5Njhfc2V0X2FjcGkoY2hpcCwgQUNQSV9EMCk7Ci0KIAkvKiBDb25maWcgUmVnIEEgKi8KIAlwY2lfcmVhZF9jb25maWdfd29yZChwY2ksIEVTTV9DT05GSUdfQSwgJncpOwogCkBAIC0yMzk3LDkgKzIzMzksMTAgQEAKIAlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKIAlzbmRfZXMxOTY4X2JvYl9zdG9wKGNoaXApOwotCXNuZF9lczE5Njhfc2V0X2FjcGkoY2hpcCwgQUNQSV9EMyk7CisKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQxMyw5ICsyMzU2LDE2IEBACiAJCXJldHVybiAwOwogCiAJLyogcmVzdG9yZSBhbGwgb3VyIGNvbmZpZyAqLworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczE5Njg6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwogCXNuZF9lczE5NjhfY2hpcF9pbml0KGNoaXApOwogCiAJLyogbmVlZCB0byByZXN0b3JlIHRoZSBiYXNlIHBvaW50ZXJzLi4gKi8gCkBAIC0yNTE0LDcgKzI0NjQsNiBAQAogCWlmIChjaGlwLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCAqKWNoaXApOwogCXNuZF9lczE5NjhfZnJlZV9nYW1lcG9ydChjaGlwKTsKLQlzbmRfZXMxOTY4X3NldF9hY3BpKGNoaXAsIEFDUElfRDMpOwogCWNoaXAtPm1hc3Rlcl9zd2l0Y2ggPSBOVUxMOwogCWNoaXAtPm1hc3Rlcl92b2x1bWUgPSBOVUxMOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY2hpcC0+cGNpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9mbTgwMS5jIGIvc291bmQvcGNpL2ZtODAxLmMKaW5kZXggM2VjN2Q3ZS4uNzdlM2Q1YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ZtODAxLmMKKysrIGIvc291bmQvcGNpL2ZtODAxLmMKQEAgLTE1MzEsOSArMTUzMSw5IEBACiAJCWNoaXAtPnNhdmVkX3JlZ3NbaV0gPSBpbncoY2hpcC0+cG9ydCArIHNhdmVkX3JlZ3NbaV0pOwogCS8qIEZJWE1FOiB0ZWE1NzV4IHN1c3BlbmQgKi8KIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xNTQzLDkgKzE1NDMsMTQgQEAKIAlzdHJ1Y3QgZm04MDEgKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJaW50IGk7CiAKLQlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmbTgwMTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCiAJc25kX2ZtODAxX2NoaXBfaW5pdChjaGlwLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IDljM2Q3YWMuLjcxNDgyYzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtMjcyLDEwICsyNzIsMTEgQEAKIC8qCiAgKiBwcm9jZXNzIHF1ZXVldWQgdW5zb2xpY2l0ZWQgZXZlbnRzCiAgKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3NfdW5zb2xfZXZlbnRzKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwcm9jZXNzX3Vuc29sX2V2ZW50cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGhkYV9idXMgKmJ1cyA9IGRhdGE7Ci0Jc3RydWN0IGhkYV9idXNfdW5zb2xpY2l0ZWQgKnVuc29sID0gYnVzLT51bnNvbDsKKwlzdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCAqdW5zb2wgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGhkYV9idXNfdW5zb2xpY2l0ZWQsIHdvcmspOworCXN0cnVjdCBoZGFfYnVzICpidXMgPSB1bnNvbC0+YnVzOwogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwogCXVuc2lnbmVkIGludCBycCwgY2FkZHIsIHJlczsKIApAQCAtMzE0LDcgKzMxNSw4IEBACiAJCWtmcmVlKHVuc29sKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCUlOSVRfV09SSygmdW5zb2wtPndvcmssIHByb2Nlc3NfdW5zb2xfZXZlbnRzLCBidXMpOworCUlOSVRfV09SSygmdW5zb2wtPndvcmssIHByb2Nlc3NfdW5zb2xfZXZlbnRzKTsKKwl1bnNvbC0+YnVzID0gYnVzOwogCWJ1cy0+dW5zb2wgPSB1bnNvbDsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IGZlZWVkMTIuLmUzNWNmZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtNTUsNyArNTUsNyBAQAogc3RhdGljIGludCBwb3NpdGlvbl9maXg7CiBzdGF0aWMgaW50IHByb2JlX21hc2sgPSAtMTsKIHN0YXRpYyBpbnQgc2luZ2xlX2NtZDsKLXN0YXRpYyBpbnQgZGlzYWJsZV9tc2k7CitzdGF0aWMgaW50IGVuYWJsZV9tc2k7CiAKIG1vZHVsZV9wYXJhbShpbmRleCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgSW50ZWwgSEQgYXVkaW8gaW50ZXJmYWNlLiIpOwpAQCAtNjksOCArNjksOCBAQAogTU9EVUxFX1BBUk1fREVTQyhwcm9iZV9tYXNrLCAiQml0bWFzayB0byBwcm9iZSBjb2RlY3MgKGRlZmF1bHQgPSAtMSkuIik7CiBtb2R1bGVfcGFyYW0oc2luZ2xlX2NtZCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNpbmdsZV9jbWQsICJVc2Ugc2luZ2xlIGNvbW1hbmQgdG8gY29tbXVuaWNhdGUgd2l0aCBjb2RlY3MgKGZvciBkZWJ1Z2dpbmcgb25seSkuIik7Ci1tb2R1bGVfcGFyYW0oZGlzYWJsZV9tc2ksIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfbXNpLCAiRGlzYWJsZSBNZXNzYWdlIFNpZ25hbGVkIEludGVycnVwdCAoTVNJKSIpOworbW9kdWxlX3BhcmFtKGVuYWJsZV9tc2ksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9tc2ksICJFbmFibGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHQgKE1TSSkiKTsKIAogCiAvKiBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCkBAIC04Niw2ICs4Niw3IEBACiAJCQkgIntBVEksIFNCNDUwfSwiCiAJCQkgIntBVEksIFNCNjAwfSwiCiAJCQkgIntBVEksIFJTNjAwfSwiCisJCQkgIntBVEksIFJTNjkwfSwiCiAJCQkgIntWSUEsIFZUODI1MX0sIgogCQkJICJ7VklBLCBWVDgyMzdBfSwiCiAJCQkgIntTaVMsIFNJUzk2Nn0sIgpAQCAtMzM2LDYgKzMzNyw3IEBACiAJdW5zaWduZWQgaW50IGluaXRpYWxpemVkIDoxOwogCXVuc2lnbmVkIGludCBzaW5nbGVfY21kIDoxOwogCXVuc2lnbmVkIGludCBwb2xsaW5nX21vZGUgOjE7CisJdW5zaWduZWQgaW50IG1zaSA6MTsKIH07CiAKIC8qIGRyaXZlciB0eXBlcyAqLwpAQCAtMzk2LDYgKzM5OCw3IEBACiAgKi8KICNkZWZpbmUgdXBwZXJfMzJiaXQoYWRkcikgKHNpemVvZihhZGRyKSA+IDQgPyAodTMyKSgoYWRkcikgPj4gMzIpIDogKHUzMikwKQogCitzdGF0aWMgaW50IGF6eF9hY3F1aXJlX2lycShzdHJ1Y3QgYXp4ICpjaGlwLCBpbnQgZG9fZGlzY29ubmVjdCk7CiAKIC8qCiAgKiBJbnRlcmZhY2UgZm9yIEhEIGNvZGVjCkBAIC01MzUsNiArNTM4LDE4IEBACiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKIAl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKHRpbWVvdXQsIGppZmZpZXMpKTsKIAorCWlmIChjaGlwLT5tc2kpIHsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9pbnRlbDogTm8gcmVzcG9uc2UgZnJvbSBjb2RlYywgIgorCQkJICAgImRpc2FibGluZyBNU0kuLi5cbiIpOworCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCQljaGlwLT5pcnEgPSAtMTsKKwkJcGNpX2Rpc2FibGVfbXNpKGNoaXAtPnBjaSk7CisJCWNoaXAtPm1zaSA9IDA7CisJCWlmIChhenhfYWNxdWlyZV9pcnEoY2hpcCwgMSkgPCAwKQorCQkJcmV0dXJuIC0xOworCQlnb3RvIGFnYWluOworCX0KKwogCWlmICghY2hpcC0+cG9sbGluZ19tb2RlKSB7CiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJoZGFfaW50ZWw6IGF6eF9nZXRfcmVzcG9uc2UgdGltZW91dCwgIgogCQkJICAgInN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGUuLi5cbiIpOwpAQCAtMTM2Myw2ICsxMzc4LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXp4X2FjcXVpcmVfaXJxKHN0cnVjdCBhenggKmNoaXAsIGludCBkb19kaXNjb25uZWN0KQoreworCWlmIChyZXF1ZXN0X2lycShjaGlwLT5wY2ktPmlycSwgYXp4X2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKKwkJCSJIREEgSW50ZWwiLCBjaGlwKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhkYS1pbnRlbDogdW5hYmxlIHRvIGdyYWIgSVJRICVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIiwgY2hpcC0+cGNpLT5pcnEpOworCQlpZiAoZG9fZGlzY29ubmVjdCkKKwkJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2hpcC0+Y2FyZCk7CisJCXJldHVybiAtMTsKKwl9CisJY2hpcC0+aXJxID0gY2hpcC0+cGNpLT5pcnE7CisJcmV0dXJuIDA7Cit9CisKIAogI2lmZGVmIENPTkZJR19QTQogLyoKQEAgLTEzNzksMTIgKzE0MDgsMTYgQEAKIAkJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21baV0pOwogCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMsIHN0YXRlKTsKIAlhenhfZnJlZV9jbWRfaW8oY2hpcCk7Ci0JaWYgKGNoaXAtPmlycSA+PSAwKQorCWlmIChjaGlwLT5pcnEgPj0gMCkgeworCQlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwKTsKLQlpZiAoIWRpc2FibGVfbXNpKQorCQljaGlwLT5pcnEgPSAtMTsKKwl9CisJaWYgKGNoaXAtPm1zaSkKIAkJcGNpX2Rpc2FibGVfbXNpKGNoaXAtPnBjaSk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOTMsMTUgKzE0MjYsMjAgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKIAlzdHJ1Y3QgYXp4ICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwotCWlmICghZGlzYWJsZV9tc2kpCi0JCXBjaV9lbmFibGVfbXNpKHBjaSk7Ci0JLyogRklYTUU6IG5lZWQgcHJvcGVyIGVycm9yIGhhbmRsaW5nICovCi0JcmVxdWVzdF9pcnEocGNpLT5pcnEsIGF6eF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUR8SVJRRl9TSEFSRUQsCi0JCSAgICAiSERBIEludGVsIiwgY2hpcCk7Ci0JY2hpcC0+aXJxID0gcGNpLT5pcnE7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGRhLWludGVsOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisJaWYgKGNoaXAtPm1zaSkKKwkJaWYgKHBjaV9lbmFibGVfbXNpKHBjaSkgPCAwKQorCQkJY2hpcC0+bXNpID0gMDsKKwlpZiAoYXp4X2FjcXVpcmVfaXJxKGNoaXAsIDEpIDwgMCkKKwkJcmV0dXJuIC1FSU87CiAJYXp4X2luaXRfY2hpcChjaGlwKTsKIAlzbmRfaGRhX3Jlc3VtZShjaGlwLT5idXMpOwogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKQEAgLTE0MzEsMTUgKzE0NjksMTQgQEAKIAkJLyogZGlzYWJsZSBwb3NpdGlvbiBidWZmZXIgKi8KIAkJYXp4X3dyaXRlbChjaGlwLCBEUExCQVNFLCAwKTsKIAkJYXp4X3dyaXRlbChjaGlwLCBEUFVCQVNFLCAwKTsKLQotCQlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAl9CiAKIAlpZiAoY2hpcC0+aXJxID49IDApIHsKKwkJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAJCWZyZWVfaXJxKGNoaXAtPmlycSwgKHZvaWQqKWNoaXApOwotCQlpZiAoIWRpc2FibGVfbXNpKQotCQkJcGNpX2Rpc2FibGVfbXNpKGNoaXAtPnBjaSk7CiAJfQorCWlmIChjaGlwLT5tc2kpCisJCXBjaV9kaXNhYmxlX21zaShjaGlwLT5wY2kpOwogCWlmIChjaGlwLT5yZW1hcF9hZGRyKQogCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOwogCkBAIC0xNDk0LDYgKzE1MzEsNyBAQAogCWNoaXAtPnBjaSA9IHBjaTsKIAljaGlwLT5pcnEgPSAtMTsKIAljaGlwLT5kcml2ZXJfdHlwZSA9IGRyaXZlcl90eXBlOworCWNoaXAtPm1zaSA9IGVuYWJsZV9tc2k7CiAKIAljaGlwLT5wb3NpdGlvbl9maXggPSBwb3NpdGlvbl9maXg7CiAJY2hpcC0+c2luZ2xlX2NtZCA9IHNpbmdsZV9jbWQ7CkBAIC0xNTIzLDE2ICsxNTYxLDE0IEBACiAJCWdvdG8gZXJyb3V0OwogCX0KIAotCWlmICghZGlzYWJsZV9tc2kpCi0JCXBjaV9lbmFibGVfbXNpKHBjaSk7CisJaWYgKGNoaXAtPm1zaSkKKwkJaWYgKHBjaV9lbmFibGVfbXNpKHBjaSkgPCAwKQorCQkJY2hpcC0+bXNpID0gMDsKIAotCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgYXp4X2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKLQkJCSJIREEgSW50ZWwiLCAodm9pZCopY2hpcCkpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBTRlggInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCWlmIChhenhfYWNxdWlyZV9pcnEoY2hpcCwgMCkgPCAwKSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBlcnJvdXQ7CiAJfQotCWNoaXAtPmlycSA9IHBjaS0+aXJxOwogCiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKQEAgLTE2NzcsNiArMTcxMyw3IEBACiAJeyAweDEwMDIsIDB4NDM3YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVEkgfSwgLyogQVRJIFNCNDUwICovCiAJeyAweDEwMDIsIDB4NDM4MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVEkgfSwgLyogQVRJIFNCNjAwICovCiAJeyAweDEwMDIsIDB4NzkzYiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVElIRE1JIH0sIC8qIEFUSSBSUzYwMCBIRE1JICovCisJeyAweDEwMDIsIDB4NzkxOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVElIRE1JIH0sIC8qIEFUSSBSUzY5MCBIRE1JICovCiAJeyAweDExMDYsIDB4MzI4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9WSUEgfSwgLyogVklBIFZUODI1MS9WVDgyMzdBICovCiAJeyAweDEwMzksIDB4NzUwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9TSVMgfSwgLyogU0lTOTY2ICovCiAJeyAweDEwYjksIDB4NTQ2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9VTEkgfSwgLyogVUxJIE01NDYxICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oIGIvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAppbmRleCBmOTQxNmMzLi45Y2ExYmFmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKQEAgLTIwNiw2ICsyMDYsNyBAQAogCS8qIHdvcmtxdWV1ZSAqLwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgaGRhX2J1cyAqYnVzOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCmluZGV4IDUxMWRmMDcuLmVkZDIyZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpAQCAtODE4LDYgKzgxOCw4IEBACiAJICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBBU1VTIEE2SiAqLwogCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNDMsIC5wY2lfc3ViZGV2aWNlID0gMHgxMWY3LAogCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBVNUEgKi8KKwl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4MTI2MywKKwkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIEFTVVMgVTVGICovCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0MywgLnBjaV9zdWJkZXZpY2UgPSAweDEyOTcsCiAJICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBBU1VTIFo2MkYgKi8KIAl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzBhZiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYXRpaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hdGloZG1pLmMKaW5kZXggYTI3NDQwZi4uNzMzM2YyNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hdGloZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hdGloZG1pLmMKQEAgLTE2MSw1ICsxNjEsNiBAQAogICovCiBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9hdGloZG1pW10gPSB7CiAJeyAuaWQgPSAweDEwMDI3OTNjLCAubmFtZSA9ICJBVEkgUlM2MDAgSERNSSIsIC5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKKwl7IC5pZCA9IDB4MTAwMjc5MWEsIC5uYW1lID0gIkFUSSBSUzY5MCBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfYXRpaGRtaSB9LAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCmluZGV4IDg0YTNlYjguLmZiOTYxNDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCkBAIC0xNzk5LDcgKzE3OTksNyBAQAogCS8qIFNQRElGIGZvciBzdHJlYW0gaW5kZXggIzEgKi8KIAlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgfHwgc3BlYy0+ZGlnX2luX25pZCkgewogCQljb2RlYy0+bnVtX3BjbXMgPSAyOwotCQlpbmZvKys7CisJCWluZm8gPSBzcGVjLT5wY21fcmVjICsgMTsKIAkJaW5mby0+bmFtZSA9IHNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWw7CiAJCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCAmJgogCQkgICAgc3BlYy0+c3RyZWFtX2RpZ2l0YWxfcGxheWJhY2spIHsKQEAgLTE4MjAsNyArMTgyMCw3IEBACiAJaWYgKHNwZWMtPm51bV9hZGNfbmlkcyA+IDEgJiYgc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlICYmCiAJICAgIHNwZWMtPmFkY19uaWRzKSB7CiAJCWNvZGVjLT5udW1fcGNtcyA9IDM7Ci0JCWluZm8rKzsKKwkJaW5mbyA9IHNwZWMtPnBjbV9yZWMgKyAyOwogCQlpbmZvLT5uYW1lID0gc3BlYy0+c3RyZWFtX25hbWVfYW5hbG9nOwogCQkvKiBObyBwbGF5YmFjayBzdHJlYW0gZm9yIHNlY29uZCBQQ00gKi8KIAkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gYWxjX3BjbV9udWxsX3BsYXliYWNrOwpAQCAtNTg3MCw3ICs1ODcwLDcgQEAKIAl7IC5wY2lfc3VidmVuZG9yID0gMHgxMGNmLCAucGNpX3N1YmRldmljZSA9IDB4MTM5NywKIAkgIC5jb25maWcgPSBBTEMyNjJfRlVKSVRTVSB9LAogCXsgLm1vZGVsbmFtZSA9ICJocC1icGMiLCAuY29uZmlnID0gQUxDMjYyX0hQX0JQQyB9LAotCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgyMDhjLAorCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgyODBjLAogCSAgLmNvbmZpZyA9IEFMQzI2Ml9IUF9CUEMgfSwgLyogeHc0NDAwICovCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTQsCiAJICAuY29uZmlnID0gQUxDMjYyX0hQX0JQQyB9LCAvKiB4dzY0MDAgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwppbmRleCA3MzFiN2I5Li5mZTUxZWYzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCkBAIC0zMzYsNiArMzM2LDEzIEBACiAJICAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCiAJICAucGNpX3N1YmRldmljZSA9IDB4MjY2OCwJLyogREZJIExhblBhcnR5ICovCiAJICAuY29uZmlnID0gU1RBQ19SRUYgfSwKKwkvKiBEZWxsIGxhcHRvcHMgaGF2ZSBCSU9TIHByb2JsZW0gKi8KKwl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9ERUxMLCAucGNpX3N1YmRldmljZSA9IDB4MDFiNSwKKwkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkvKiBEZWxsIEluc3Bpcm9uIDYzMG0gKi8KKwl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9ERUxMLCAucGNpX3N1YmRldmljZSA9IDB4MDFjMiwKKwkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkvKiBEZWxsIExhdGl0dWRlIEQ2MjAgKi8KKwl7IC5wY2lfc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9ERUxMLCAucGNpX3N1YmRldmljZSA9IDB4MDFjYiwKKwkgIC5jb25maWcgPSBTVEFDX1JFRiB9LAkvKiBEZWxsIExhdGl0dWRlIDEyMEwgKi8KIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCkBAIC01OTEsMTMgKzU5OCw2IEBACiAJICAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCiAJICAucGNpX3N1YmRldmljZSA9IDB4MjY2OCwJLyogREZJIExhblBhcnR5ICovCiAJICAuY29uZmlnID0gU1RBQ19SRUYgfSwJCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLwotCS8qIERlbGwgbGFwdG9wcyBoYXZlIEJJT1MgcHJvYmxlbSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0RFTEwsIC5wY2lfc3ViZGV2aWNlID0gMHgwMWI1LAotCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCS8qIERlbGwgSW5zcGlyb24gNjMwbSAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0RFTEwsIC5wY2lfc3ViZGV2aWNlID0gMHgwMWMyLAotCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCS8qIERlbGwgTGF0aXR1ZGUgRDYyMCAqLwotCXsgLnBjaV9zdWJ2ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0RFTEwsIC5wY2lfc3ViZGV2aWNlID0gMHgwMWNiLAotCSAgLmNvbmZpZyA9IFNUQUNfUkVGIH0sCS8qIERlbGwgTGF0aXR1ZGUgMTIwTCAqLwogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jIGIvc291bmQvcGNpL2ludGVsOHgwLmMKaW5kZXggZjQzMTliOC4uOWMxYmNlNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ludGVsOHgwLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwLmMKQEAgLTE5NjIsNiArMTk2MiwxMiBAQAogCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCiAJfSwKIAl7CisJCS5zdWJ2ZW5kb3IgPSAweDEwZjcsCisJCS5zdWJkZXZpY2UgPSAweDgzNGMsCisJCS5uYW1lID0gIlBhbmFzb25pYyBDRi1SNCIsCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFksCisJfSwKKwl7CiAJCS5zdWJ2ZW5kb3IgPSAweDExMGEsCiAJCS5zdWJkZXZpY2UgPSAweDAwNTYsCiAJCS5uYW1lID0gIkZ1aml0c3UtU2llbWVucyBTY2VuaWMiLAkvKiBBRDE5ODE/ICovCkBAIC0yNDc2LDEwICsyNDgyLDE0IEBACiAJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0KQogCQljaGlwLT5zZG1fc2F2ZWQgPSBpZ2V0Ynl0ZShjaGlwLCBJQ0hSRUcoU0RNKSk7CiAKLQlpZiAoY2hpcC0+aXJxID49IDApCisJaWYgKGNoaXAtPmlycSA+PSAwKSB7CisJCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOwogCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOworCQljaGlwLT5pcnEgPSAtMTsKKwl9CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgcGNpX2Nob29zZV9zdGF0ZShwY2ksIHN0YXRlKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0ODksMTEgKzI0OTksMjIgQEAKIAlzdHJ1Y3QgaW50ZWw4eDAgKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJaW50IGk7CiAKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaW50ZWw4eDA6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKLQlyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKLQkJICAgIGNhcmQtPnNob3J0bmFtZSwgY2hpcCk7CisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaW50ZWw4eDBfaW50ZXJydXB0LAorCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iLCBwY2ktPmlycSk7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKIAlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAlzbmRfaW50ZWw4eDBfY2hpcF9pbml0KGNoaXAsIDApOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ludGVsOHgwbS5jIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCmluZGV4IDY3MDNmNWMuLmJkNDY3YzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYworKysgYi9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKQEAgLTEwNDUsMTAgKzEwNDUsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+cGNtX2RldnM7IGkrKykKIAkJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY21baV0pOwogCXNuZF9hYzk3X3N1c3BlbmQoY2hpcC0+YWM5Nyk7Ci0JaWYgKGNoaXAtPmlycSA+PSAwKQorCWlmIChjaGlwLT5pcnEgPj0gMCkgeworCQlzeW5jaHJvbml6ZV9pcnEoY2hpcC0+aXJxKTsKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwKTsKKwkJY2hpcC0+aXJxID0gLTE7CisJfQogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDU3LDExICsxMDYxLDIyIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJc3RydWN0IGludGVsOHgwbSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpbnRlbDh4MG06IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKLQlyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwKLQkJICAgIGNhcmQtPnNob3J0bmFtZSwgY2hpcCk7CisJaWYgKHJlcXVlc3RfaXJxKHBjaS0+aXJxLCBzbmRfaW50ZWw4eDBfaW50ZXJydXB0LAorCQkJSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgeworCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwbTogdW5hYmxlIHRvIGdyYWIgSVJRICVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIiwgcGNpLT5pcnEpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJY2hpcC0+aXJxID0gcGNpLT5pcnE7CiAJc25kX2ludGVsOHgwX2NoaXBfaW5pdChjaGlwLCAwKTsKIAlzbmRfYWM5N19yZXN1bWUoY2hpcC0+YWM5Nyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWFlc3RybzMuYyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCmluZGV4IDA1NjA1ZjQuLjhjYWIzNDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jCisrKyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCkBAIC0yNTg5LDEyICsyNTg5LDkgQEAKIAkJY2hpcC0+c3VzcGVuZF9tZW1baW5kZXgrK10gPSAKIAkJCXNuZF9tM19hc3NwX3JlYWQoY2hpcCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLCBpKTsKIAotCS8qIHBvd2VyIGRvd24gYXBjaSByZWdpc3RlcnMgKi8KLQlzbmRfbTNfb3V0dyhjaGlwLCAweGZmZmYsIDB4NTQpOwotCXNuZF9tM19vdXR3KGNoaXAsIDB4ZmZmZiwgMHg1Nik7Ci0KIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjYwNyw4ICsyNjA0LDE0IEBACiAJaWYgKGNoaXAtPnN1c3BlbmRfbWVtID09IE5VTEwpCiAJCXJldHVybiAwOwogCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hZXN0b3IzOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAkvKiBmaXJzdCBsZXRzIGp1c3QgYnJpbmcgZXZlcnl0aGluZyBiYWNrLiAuKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKaW5kZXggYjFiYmRiOS4uOTQ1ZDIxYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMKKysrIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKQEAgLTEzOTAsNiArMTM5MCw3IEBACiAJY2hpcC0+Y29lZmZzX2N1cnJlbnQgPSAwOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDAxLDggKzE0MDIsMTcgQEAKIAogCS8qIFBlcmZvcm0gYSBmdWxsIHJlc2V0IG9uIHRoZSBoYXJkd2FyZSAqLwogCWNoaXAtPmluX3Jlc3VtZSA9IDE7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibm0yNTY6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGNpKTsKKwogCXNuZF9ubTI1Nl9pbml0X2NoaXAoY2hpcCk7CiAKIAkvKiByZXN0b3JlIGFjOTcgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwppbmRleCBlYzQ4OTkxLi41NmUwYzAxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKKysrIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCkBAIC0xMTc4LDkgKzExNzgsOSBAQAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKIAlzbmRfcGNtX3N1c3BlbmRfYWxsKGNoaXAtPnBjbSk7CiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE4OSw5ICsxMTg5LDE0IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJc3RydWN0IHNuZF9yaXB0aWRlICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmlwdGlkZTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCXNuZF9yaXB0aWRlX2luaXRpYWxpemUoY2hpcCk7CiAJc25kX2FjOTdfcmVzdW1lKGNoaXAtPmFjOTcpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwppbmRleCAwZDQ3ODg3Li4xZmJjNDMyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYworKysgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYwpAQCAtMzk2NiwxNSArMzk2Niw5IEBACiAJc25kX2FjOTdfc3VzcGVuZCh0cmlkZW50LT5hYzk3KTsKIAlzbmRfYWM5N19zdXNwZW5kKHRyaWRlbnQtPmFjOTdfc2VjKTsKIAotCXN3aXRjaCAodHJpZGVudC0+ZGV2aWNlKSB7Ci0JY2FzZSBUUklERU5UX0RFVklDRV9JRF9EWDoKLQljYXNlIFRSSURFTlRfREVWSUNFX0lEX05YOgotCQlicmVhazsJCQkvKiBUT0RPICovCi0JY2FzZSBUUklERU5UX0RFVklDRV9JRF9TSTcwMTg6Ci0JCWJyZWFrOwotCX0KIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk4Myw5ICszOTc3LDE1IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJc3RydWN0IHNuZF90cmlkZW50ICp0cmlkZW50ID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKLQlwY2lfZW5hYmxlX2RldmljZShwY2kpOwotCXBjaV9zZXRfbWFzdGVyKHBjaSk7IC8qIHRvIGJlIHN1cmUgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKKwkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKKwkJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKIAlzd2l0Y2ggKHRyaWRlbnQtPmRldmljZSkgewogCWNhc2UgVFJJREVOVF9ERVZJQ0VfSURfRFg6CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCBlNjk5MGUwLi45MmIwNzM2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTIxODUsOSArMjE4NSw5IEBACiAJCWNoaXAtPmNhcHR1cmVfc3JjX3NhdmVkWzFdID0gaW5iKGNoaXAtPnBvcnQgKyBWSUFfUkVHX0NBUFRVUkVfQ0hBTk5FTCArIDB4MTApOwogCX0KIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTk3LDkgKzIxOTcsMTUgQEAKIAlzdHJ1Y3QgdmlhODJ4eCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInZpYTgyeHg6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAogCXNuZF92aWE4Mnh4X2NoaXBfaW5pdChjaGlwKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKaW5kZXggNWFiMWNmMy4uZmViMjdjOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCkBAIC0xMDMyLDkgKzEwMzIsMTAgQEAKIAkJc25kX3ZpYTgyeHhfY2hhbm5lbF9yZXNldChjaGlwLCAmY2hpcC0+ZGV2c1tpXSk7CiAJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3KTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKKwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDQ0LDkgKzEwNDUsMTQgQEAKIAlzdHJ1Y3QgdmlhODJ4eF9tb2RlbSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInZpYTgyeHgtbW9kZW06IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAogCXNuZF92aWE4Mnh4X2NoaXBfaW5pdChjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92eDIyMi92eDIyMi5jIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKaW5kZXggZTdjZDhhYy4uYWY0OWU4YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKKysrIGIvc291bmQvcGNpL3Z4MjIyL3Z4MjIyLmMKQEAgLTI2Niw5ICsyNjYsOSBAQAogCWludCBlcnI7CiAKIAllcnIgPSBzbmRfdnhfc3VzcGVuZCgmdngtPmNvcmUsIHN0YXRlKTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBwY2lfY2hvb3NlX3N0YXRlKHBjaSwgc3RhdGUpKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzcsOSArMjc3LDE0IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJc3RydWN0IHNuZF92eDIyMiAqdnggPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKLQlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eDIyMjogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLCAiCisJCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7CisJCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KIAlwY2lfc2V0X21hc3RlcihwY2kpOwogCXJldHVybiBzbmRfdnhfcmVzdW1lKCZ2eC0+Y29yZSk7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggZWJjNmRhOC4uYTQwYzEwOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtMjIxOCw2ICsyMjE4LDcgQEAKIAlzbmRfeW1mcGNpX2Rpc2FibGVfZHNwKGNoaXApOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIHBjaV9jaG9vc2Vfc3RhdGUocGNpLCBzdGF0ZSkpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjI3LDggKzIyMjgsMTQgQEAKIAlzdHJ1Y3Qgc25kX3ltZnBjaSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7Ci0JcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCwgIgorCQkgICAgICAgImRpc2FibGluZyBkZXZpY2VcbiIpOworCQlzbmRfY2FyZF9kaXNjb25uZWN0KGNhcmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJcGNpX3NldF9tYXN0ZXIocGNpKTsKIAlzbmRfeW1mcGNpX2FjbGlua19yZXNldChwY2kpOwogCXNuZF95bWZwY2lfY29kZWNfcmVhZHkoY2hpcCwgMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jIGIvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYwppbmRleCBmZDM1OTBmLi4yZDQwY2M3IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCisrKyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKQEAgLTIxOSwzNSArMjE5LDE1IEBACiBzdGF0aWMgaW50IHBkYWNmX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKIHsKIAlzdHJ1Y3Qgc25kX3BkYWNmICpwZGFjZiA9IGxpbmstPnByaXY7Ci0JdHVwbGVfdCB0dXBsZTsKLQljaXNwYXJzZV90ICpwYXJzZSA9IE5VTEw7Ci0JdV9zaG9ydCBidWZbMzJdOwogCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKIAogCXNuZF9wcmludGRkKEtFUk5fREVCVUcgInBkYWNmX2NvbmZpZyBjYWxsZWRcbiIpOwotCXBhcnNlID0ga21hbGxvYyhzaXplb2YoKnBhcnNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEgcGFyc2UpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAicGRhY2ZfY29uZmlnOiBjYW5ub3QgYWxsb2NhdGVcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsIHBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwogCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDU7CiAKIAlDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykpOwogCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLCAmbGluay0+aXJxKSk7CiAJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluaywgJmxpbmstPmNvbmYpKTsKIAotCWtmcmVlKHBhcnNlKTsKLQogCWlmIChzbmRfcGRhY2ZfYXNzaWduX3Jlc291cmNlcyhwZGFjZiwgbGluay0+aW8uQmFzZVBvcnQxLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpIDwgMCkKIAkJZ290byBmYWlsZWQ7CiAKQEAgLTI1NSw3ICsyMzUsNiBAQAogCXJldHVybiAwOwogCiBjc19mYWlsZWQ6Ci0Ja2ZyZWUocGFyc2UpOwogCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKIGZhaWxlZDoKIAlwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CkBAIC0yOTksNyArMjc4LDggQEAKICAqIE1vZHVsZSBlbnRyeSBwb2ludHMKICAqLwogc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHNuZF9wZGFjZl9pZHNbXSA9IHsKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNWQsIDB4NGM0NSksCisJLyogdGhpcyBpcyB0b28gZ2VuZXJhbCBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNWQsIDB4NGM0NSksICovCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNvcmUgU291bmQiLCJQREF1ZGlvLUNGIiwweDM5NmQxOWQyLDB4NzE3MTdiNDkpLAogCVBDTUNJQV9ERVZJQ0VfTlVMTAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBzbmRfcGRhY2ZfaWRzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jIGIvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMKaW5kZXggMzA4OWZjYy4uZDdkZjU5ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMKKysrIGIvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMKQEAgLTIxNywzNCArMjE3LDEyIEBACiB7CiAJc3RydWN0IHZ4X2NvcmUgKmNoaXAgPSBsaW5rLT5wcml2OwogCXN0cnVjdCBzbmRfdnhwb2NrZXQgKnZ4cCA9IChzdHJ1Y3Qgc25kX3Z4cG9ja2V0ICopY2hpcDsKLQl0dXBsZV90IHR1cGxlOwotCWNpc3BhcnNlX3QgKnBhcnNlOwotCXVfc2hvcnQgYnVmWzMyXTsKIAlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CiAKIAlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJ2eHBvY2tldF9jb25maWcgY2FsbGVkXG4iKTsKLQlwYXJzZSA9IGttYWxsb2Moc2l6ZW9mKCpwYXJzZSksIEdGUF9LRVJORUwpOwotCWlmICghIHBhcnNlKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgInZ4OiBjYW5ub3QgYWxsb2NhdGVcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JdHVwbGUuQXR0cmlidXRlcyA9IDA7Ci0JdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSkpOwotCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsIHBhcnNlKSk7Ci0JbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07CiAKIAkvKiByZWRlZmluZSBoYXJkd2FyZSByZWNvcmQgYWNjb3JkaW5nIHRvIHRoZSBWRVJTSU9OMSBzdHJpbmcgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOwotCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgcGFyc2UpKTsKLQlpZiAoISBzdHJjbXAocGFyc2UtPnZlcnNpb25fMS5zdHIgKyBwYXJzZS0+dmVyc2lvbl8xLm9mc1sxXSwgIlZYLVBPQ0tFVCIpKSB7CisJaWYgKCFzdHJjbXAobGluay0+cHJvZF9pZFsxXSwgIlZYLVBPQ0tFVCIpKSB7CiAJCXNuZF9wcmludGRkKCJWWC1wb2NrZXQgaXMgZGV0ZWN0ZWRcbiIpOwogCX0gZWxzZSB7CiAJCXNuZF9wcmludGRkKCJWWC1wb2NrZXQgNDQwIGlzIGRldGVjdGVkXG4iKTsKQEAgLTI2NSwxNCArMjQzLDEyIEBACiAJCWdvdG8gZmFpbGVkOwogCiAJbGluay0+ZGV2X25vZGUgPSAmdnhwLT5ub2RlOwotCWtmcmVlKHBhcnNlKTsKIAlyZXR1cm4gMDsKIAogY3NfZmFpbGVkOgogCWNzX2Vycm9yKGxpbmssIGxhc3RfZm4sIGxhc3RfcmV0KTsKIGZhaWxlZDoKIAlwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7Ci0Ja2ZyZWUocGFyc2UpOwogCXJldHVybiAtRU5PREVWOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wcGMvdHVtYmxlci5jIGIvc291bmQvcHBjL3R1bWJsZXIuYwppbmRleCAyZmJlMWQxLi44ZjA3NGM3IDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvdHVtYmxlci5jCisrKyBiL3NvdW5kL3BwYy90dW1ibGVyLmMKQEAgLTk0MiwxMCArOTQyLDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGV2aWNlX2NoYW5nZTsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BtYWMgKmRldmljZV9jaGFuZ2VfY2hpcDsKIAotc3RhdGljIHZvaWQgZGV2aWNlX2NoYW5nZV9oYW5kbGVyKHZvaWQgKnNlbGYpCitzdGF0aWMgdm9pZCBkZXZpY2VfY2hhbmdlX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBzbmRfcG1hYyAqY2hpcCA9IHNlbGY7CisJc3RydWN0IHNuZF9wbWFjICpjaGlwID0gZGV2aWNlX2NoYW5nZV9jaGlwOwogCXN0cnVjdCBwbWFjX3R1bWJsZXIgKm1peDsKIAlpbnQgaGVhZHBob25lLCBsaW5lb3V0OwogCkBAIC0xNDE3LDcgKzE0MTgsOCBAQAogCWNoaXAtPnJlc3VtZSA9IHR1bWJsZXJfcmVzdW1lOwogI2VuZGlmCiAKLQlJTklUX1dPUksoJmRldmljZV9jaGFuZ2UsIGRldmljZV9jaGFuZ2VfaGFuZGxlciwgKHZvaWQgKiljaGlwKTsKKwlJTklUX1dPUksoJmRldmljZV9jaGFuZ2UsIGRldmljZV9jaGFuZ2VfaGFuZGxlcik7CisJZGV2aWNlX2NoYW5nZV9jaGlwID0gY2hpcDsKIAogI2lmZGVmIFBNQUNfU1VQUE9SVF9BVVRPTVVURQogCWlmICgobWl4LT5oZWFkcGhvbmVfaXJxID49MCB8fCBtaXgtPmxpbmVvdXRfaXJxID49IDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb3VuZF9jb3JlLmMgYi9zb3VuZC9zb3VuZF9jb3JlLmMKaW5kZXggNTMyMmM1MC4uOGYxY2VkNCAxMDA2NDQKLS0tIGEvc291bmQvc291bmRfY29yZS5jCisrKyBiL3NvdW5kL3NvdW5kX2NvcmUuYwpAQCAtMTcwLDggKzE3MCw4IEBACiAJZWxzZQogCQlzcHJpbnRmKHMtPm5hbWUsICJzb3VuZC8lcyVkIiwgbmFtZSwgciAvIFNPVU5EX1NURVApOwogCi0JY2xhc3NfZGV2aWNlX2NyZWF0ZShzb3VuZF9jbGFzcywgTlVMTCwgTUtERVYoU09VTkRfTUFKT1IsIHMtPnVuaXRfbWlub3IpLAotCQkJICAgIGRldiwgcy0+bmFtZSs2KTsKKwlkZXZpY2VfY3JlYXRlKHNvdW5kX2NsYXNzLCBkZXYsIE1LREVWKFNPVU5EX01BSk9SLCBzLT51bml0X21pbm9yKSwKKwkJICAgICAgcy0+bmFtZSs2KTsKIAlyZXR1cm4gcjsKIAogIGZhaWw6CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlwID0gX19zb3VuZF9yZW1vdmVfdW5pdChsaXN0LCB1bml0KTsKIAlzcGluX3VubG9jaygmc291bmRfbG9hZGVyX2xvY2spOwogCWlmIChwKSB7Ci0JCWNsYXNzX2RldmljZV9kZXN0cm95KHNvdW5kX2NsYXNzLCBNS0RFVihTT1VORF9NQUpPUiwgcC0+dW5pdF9taW5vcikpOworCQlkZXZpY2VfZGVzdHJveShzb3VuZF9jbGFzcywgTUtERVYoU09VTkRfTUFKT1IsIHAtPnVuaXRfbWlub3IpKTsKIAkJa2ZyZWUocCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc291bmQvc291bmRfZmlybXdhcmUuYyBiL3NvdW5kL3NvdW5kX2Zpcm13YXJlLmMKaW5kZXggM2ExODFkNC4uMzMwNDM0NCAxMDA2NDQKLS0tIGEvc291bmQvc291bmRfZmlybXdhcmUuYworKysgYi9zb3VuZC9zb3VuZF9maXJtd2FyZS5jCkBAIC0xOSw3ICsxOSw3IEBACiAJCXByaW50ayhLRVJOX0lORk8gIlVuYWJsZSB0byBsb2FkICclcycuXG4iLCBmbik7CiAJCXJldHVybiAwOwogCX0KLQlsID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZTsKKwlsID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplOwogCWlmIChsIDw9IDAgfHwgbCA+IDEzMTA3MikKIAl7CiAJCXByaW50ayhLRVJOX0lORk8gIkludmFsaWQgZmlybXdhcmUgJyVzJ1xuIiwgZm4pOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmMgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwppbmRleCBjODJiMDFjLi42NzIwMmI5IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uYworKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwpAQCAtMTQ2OSw3ICsxNDY5LDggQEAKIAlzdWJzLT5jdXJfYXVkaW9mbXQgPSBOVUxMOwogCXN1YnMtPmN1cl9yYXRlID0gMDsKIAlzdWJzLT5wZXJpb2RfYnl0ZXMgPSAwOwotCXJlbGVhc2Vfc3Vic3RyZWFtX3VyYnMoc3VicywgMCk7CisJaWYgKCFzdWJzLT5zdHJlYW0tPmNoaXAtPnNodXRkb3duKQorCQlyZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN1YnMsIDApOwogCXJldHVybiBzbmRfcGNtX2ZyZWVfdm1hbGxvY19idWZmZXIoc3Vic3RyZWFtKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYm1pZGkuYyBiL3NvdW5kL3VzYi91c2JtaWRpLmMKaW5kZXggYjdjNWU1OS4uMjRmNWEyNiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYm1pZGkuYworKysgYi9zb3VuZC91c2IvdXNibWlkaS5jCkBAIC05ODEsNyArOTgxLDcgQEAKIAkJCWlmICh1bWlkaS0+dXNiX3Byb3RvY29sX29wcy0+ZmluaXNoX291dF9lbmRwb2ludCkKIAkJCQl1bWlkaS0+dXNiX3Byb3RvY29sX29wcy0+ZmluaXNoX291dF9lbmRwb2ludChlcC0+b3V0KTsKIAkJfQotCQlpZiAoZXAtPmluICYmIGVwLT5pbi0+dXJiKQorCQlpZiAoZXAtPmluKQogCQkJdXNiX2tpbGxfdXJiKGVwLT5pbi0+dXJiKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNibWl4ZXIuYyBiL3NvdW5kL3VzYi91c2JtaXhlci5jCmluZGV4IDEwMjRjMTcuLmU3NGViMWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JtaXhlci5jCisrKyBiL3NvdW5kL3VzYi91c2JtaXhlci5jCkBAIC0xNjIwLDggKzE2MjAsNyBAQAogCQlrZnJlZShtaXhlci0+dXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCQl1c2JfZnJlZV91cmIobWl4ZXItPnVyYik7CiAJfQotCWlmIChtaXhlci0+cmNfdXJiKQotCQl1c2JfZnJlZV91cmIobWl4ZXItPnJjX3VyYik7CisJdXNiX2ZyZWVfdXJiKG1peGVyLT5yY191cmIpOwogCWtmcmVlKG1peGVyLT5yY19zZXR1cF9wYWNrZXQpOwogCWtmcmVlKG1peGVyKTsKIH0KQEAgLTIwNTYsOCArMjA1NSw2IEBACiAJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyOwogCQogCW1peGVyID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSwgbGlzdCk7Ci0JaWYgKG1peGVyLT51cmIpCi0JCXVzYl9raWxsX3VyYihtaXhlci0+dXJiKTsKLQlpZiAobWl4ZXItPnJjX3VyYikKLQkJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIpOworCXVzYl9raWxsX3VyYihtaXhlci0+dXJiKTsKKwl1c2Jfa2lsbF91cmIobWl4ZXItPnJjX3VyYik7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXN4MnkvdXNYMllod2RlcC5jIGIvc291bmQvdXNiL3VzeDJ5L3VzWDJZaHdkZXAuYwppbmRleCA0YjUyZDE4Li5iNzZiM2RkIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXNYMllod2RlcC5jCisrKyBiL3NvdW5kL3VzYi91c3gyeS91c1gyWWh3ZGVwLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkKIAlvZmZzZXQgPSBhcmVhLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwogCW9mZnNldCArPSBhZGRyZXNzIC0gYXJlYS0+dm1fc3RhcnQ7Ci0Jc25kX2Fzc2VydCgob2Zmc2V0ICUgUEFHRV9TSVpFKSA9PSAwLCByZXR1cm4gTk9QQUdFX09PTSk7CisJc25kX2Fzc2VydCgob2Zmc2V0ICUgUEFHRV9TSVpFKSA9PSAwLCByZXR1cm4gTk9QQUdFX1NJR0JVUyk7CiAJdmFkZHIgPSAoY2hhciopKChzdHJ1Y3QgdXNYMllkZXYgKilhcmVhLT52bV9wcml2YXRlX2RhdGEpLT51czQyOGN0bHNfc2hhcmVkbWVtICsgb2Zmc2V0OwogCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UodmFkZHIpOwogCWdldF9wYWdlKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvdXNyL01ha2VmaWxlIGIvdXNyL01ha2VmaWxlCmluZGV4IGUzMzhlN2IuLjM4MjcwMmEgMTAwNjQ0Ci0tLSBhL3Vzci9NYWtlZmlsZQorKysgYi91c3IvTWFrZWZpbGUKQEAgLTIwLDcgKzIwLDcgQEAKIGhvc3Rwcm9ncy15IDo9IGdlbl9pbml0X2NwaW8KIGluaXRyYW1mcyAgIDo9ICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCiByYW1mcy1pbnB1dCA6PSAkKGlmICQoZmlsdGVyLW91dCAiIiwkKENPTkZJR19JTklUUkFNRlNfU09VUkNFKSksIFwKLSAgICAgICAgICAgICAgICAgICAgJChDT05GSUdfSU5JVFJBTUZTX1NPVVJDRSksLWQpCisJCQkkKHNoZWxsIGVjaG8gJChDT05GSUdfSU5JVFJBTUZTX1NPVVJDRSkpLC1kKQogcmFtZnMtYXJncyAgOj0gXAogICAgICAgICAkKGlmICQoQ09ORklHX0lOSVRSQU1GU19ST09UX1VJRCksIC11ICQoQ09ORklHX0lOSVRSQU1GU19ST09UX1VJRCkpIFwKICAgICAgICAgJChpZiAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9HSUQpLCAtZyAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9HSUQpKQo=